ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTAxLmMgYi9kcml2ZXJzL25ldC8zYzUwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDUxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC8zYzUwMS5jCkBAIC0wLDAgKzEsOTQwIEBACisvKiAzYzUwMS5jOiBBIDNDb20gM2M1MDEgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4gKi8KKy8qCisgICAgV3JpdHRlbiAxOTkyLDE5OTMsMTk5NCAgRG9uYWxkIEJlY2tlcgorCisgICAgQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZAorICAgIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisgICAgVGhpcyBpcyBhIGRldmljZSBkcml2ZXIgZm9yIHRoZSAzQ29tIEV0aGVybGluayAzYzUwMS4KKyAgICBEbyBub3QgcHVyY2hhc2UgdGhpcyBjYXJkLCBldmVuIGFzIGEgam9rZS4gIEl0J3MgcGVyZm9ybWFuY2UgaXMgaG9ycmlibGUsCisgICAgYW5kIGl0IGJyZWFrcyBpbiBtYW55IHdheXMuCisKKyAgICBUaGUgb3JpZ2luYWwgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKyAgICBGaXhlZCAoYWdhaW4hKSB0aGUgbWlzc2luZyBpbnRlcnJ1cHQgbG9ja2luZyBvbiBUWC9SWCBzaGlmdGluZy4KKyAgICAJCUFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+CisKKyAgICBSZW1vdmVkIGNhbGxzIHRvIGluaXRfZXRoZXJkZXYgc2luY2UgdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZCwgYW5kCisgICAgY2xlYW5lZCB1cCBtb2R1bGFyaXphdGlvbiBqdXN0IGEgYml0LiBUaGUgZHJpdmVyIHN0aWxsIGFsbG93cyBvbmx5CisgICAgdGhlIGRlZmF1bHQgYWRkcmVzcyBmb3IgY2FyZHMgd2hlbiBsb2FkZWQgYXMgYSBtb2R1bGUsIGJ1dCB0aGF0J3MKKyAgICByZWFsbHkgbGVzcyBicmFpbmRlYWQgdGhhbiBhbnlvbmUgdXNpbmcgYSAzYzUwMSBib2FyZC4gOikKKwkJICAgIDE5OTUwMjA4IChpbnZpZEBtc2VuLmNvbSkKKworICAgIEFkZGVkIHRyYXBzIGZvciBpbnRlcnJ1cHRzIGhpdHRpbmcgdGhlIHdpbmRvdyBhcyB3ZSBjbGVhciBhbmQgVFggbG9hZAorICAgIHRoZSBib2FyZC4gTm93IGdldHRpbmcgMTUwSy9zZWNvbmQgRlRQIHdpdGggYSAzYzUwMSBjYXJkLiBTdGlsbCBwbGF5aW5nCisgICAgd2l0aCBhIFRYLVRYIG9wdGltaXNhdGlvbiB0byBzZWUgaWYgd2UgY2FuIHRvdWNoIDE4MC0yMDBLL3NlY29uZCBhcyBzZWVtcworICAgIHRoZW9yZXRpY2FsbHkgbWF4aW11bS4KKyAgICAJCTE5OTUwNDAyIEFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+CisgICAgCQkKKyAgICBDbGVhbmVkIHVwIGZvciAyLjMueCBiZWNhdXNlIHdlIGJyb2tlIFNNUCBub3cuIAorICAgIAkJMjAwMDAyMDggQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKworICAgIENoZWNrIHVwIHBhc3MgZm9yIDIuNS4gTm90aGluZyBzaWduaWZpY2FudCBjaGFuZ2VkCisgICAgCQkyMDAyMTAwOSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorCisgICAgRml4ZWQgemVybyBmaWxsIGNvcm5lciBjYXNlIAorICAgIAkJMjAwMzAxMDQgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAgICAJCQorICAgIAkJCisgICBGb3IgdGhlIGF2b2lkYW5jZSBvZiBkb3VidCB0aGUgInByZWZlcnJlZCBmb3JtIiBvZiB0aGlzIGNvZGUgaXMgb25lIHdoaWNoCisgICBpcyBpbiBhbiBvcGVuIG5vbiBwYXRlbnQgZW5jdW1iZXJlZCBmb3JtYXQuIFdoZXJlIGNyeXB0b2dyYXBoaWMga2V5IHNpZ25pbmcKKyAgIGZvcm1zIHBhcnQgb2YgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gZXhlY3V0YWJsZSB0aGUgaW5mb3JtYXRpb24KKyAgIGluY2x1ZGluZyBrZXlzIG5lZWRlZCB0byBnZW5lcmF0ZSBhbiBlcXVpdmFsZW50bHkgZnVuY3Rpb25hbCBleGVjdXRhYmxlCisgICBhcmUgZGVlbWVkIHRvIGJlIHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlLgorCisqLworCisKKy8qKgorICogRE9DOiAzYzUwMSBDYXJkIE5vdGVzCisgKgorICogIFNvbWUgbm90ZXMgb24gdGhpcyB0aGluZyBpZiB5b3UgaGF2ZSB0byBoYWNrIGl0LiAgW0FsYW5dCisgKgorICogIFNvbWUgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgZnJvbSAzQ29tLiBEdWUgdG8gdGhlIGJvYXJkcyBhZ2UKKyAqICBzdGFuZGFyZCByZXNwb25zZXMgd2hlbiB5b3UgYXNrIGZvciB0aGlzIHdpbGwgcmFuZ2UgZnJvbSAnYmUgc2VyaW91cycKKyAqICB0byAnZ2l2ZSBpdCB0byBhIG11c2V1bScuIFRoZSBkb2N1bWVudGF0aW9uIGlzIGluY29tcGxldGUgYW5kIG1vc3RseQorICogIG9mIGhpc3RvcmljYWwgaW50ZXJlc3QgYW55d2F5LiAKKyAqCisgKiAgVGhlIGJhc2ljIHN5c3RlbSBpcyBhIHNpbmdsZSBidWZmZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVjZWl2ZSBvcgorICogIHRyYW5zbWl0IGEgcGFja2V0LiBBIHRoaXJkIGNvbW1hbmQgbW9kZSBleGlzdHMgd2hlbiB5b3UgYXJlIHNldHRpbmcKKyAqICB0aGluZ3MgdXAuCisgKgorICogIElmIGl0J3MgdHJhbnNtaXR0aW5nIGl0J3Mgbm90IHJlY2VpdmluZyBhbmQgdmljZSB2ZXJzYS4gSW4gZmFjdCB0aGUKKyAqICB0aW1lIHRvIGdldCB0aGUgYm9hcmQgYmFjayBpbnRvIHVzZWZ1bCBzdGF0ZSBhZnRlciBhbiBvcGVyYXRpb24gaXMKKyAqICBxdWl0ZSBsYXJnZS4KKyAqCisgKiAgVGhlIGRyaXZlciB3b3JrcyBieSBrZWVwaW5nIHRoZSBib2FyZCBpbiByZWNlaXZlIG1vZGUgd2FpdGluZyBmb3IgYQorICogIHBhY2tldCB0byBhcnJpdmUuIFdoZW4gb25lIGFycml2ZXMgaXQgaXMgY29waWVkIG91dCBvZiB0aGUgYnVmZmVyCisgKiAgYW5kIGRlbGl2ZXJlZCB0byB0aGUga2VybmVsLiBUaGUgY2FyZCBpcyByZWxvYWRlZCBhbmQgb2ZmIHdlIGdvLgorICoKKyAqICBXaGVuIHRyYW5zbWl0dGluZyBscC0+dHhpbmcgaXMgc2V0IGFuZCB0aGUgY2FyZCBpcyByZXNldCAoZnJvbQorICogIHJlY2VpdmUgbW9kZSkgW3Bvc3NpYmx5IGxvc2luZyBhIHBhY2tldCBqdXN0IHJlY2VpdmVkXSB0byBjb21tYW5kCisgKiAgbW9kZS4gQSBwYWNrZXQgaXMgbG9hZGVkIGFuZCB0cmFuc21pdCBtb2RlIHRyaWdnZXJlZC4gVGhlIGludGVycnVwdAorICogIGhhbmRsZXIgcnVucyBkaWZmZXJlbnQgY29kZSBmb3IgdHJhbnNtaXQgaW50ZXJydXB0cyBhbmQgY2FuIGhhbmRsZQorICogIHJldHVybmluZyB0byByZWNlaXZlIG1vZGUgb3IgcmV0cmFuc21pc3Npb25zICh5ZXMgeW91IGhhdmUgdG8gaGVscAorICogIG91dCB3aXRoIHRob3NlIHRvbykuCisgKgorICogRE9DOiBQcm9ibGVtcworICogIAorICogIFRoZXJlIGFyZSBhIHdpZGUgdmFyaWV0eSBvZiB1bmRvY3VtZW50ZWQgZXJyb3IgcmV0dXJucyBmcm9tIHRoZSBjYXJkCisgKiAgYW5kIHlvdSBiYXNpY2FsbHkgaGF2ZSB0byBraWNrIHRoZSBib2FyZCBhbmQgcHJheSBpZiB0aGV5IHR1cm4gdXAuIE1vc3QKKyAqICBvbmx5IG9jY3VyIHVuZGVyIGV4dHJlbWUgbG9hZCBvciBpZiB5b3UgZG8gc29tZXRoaW5nIHRoZSBib2FyZCBkb2Vzbid0CisgKiAgbGlrZSAoZWcgdG91Y2hpbmcgYSByZWdpc3RlciBhdCB0aGUgd3JvbmcgdGltZSkuCisgKgorICogIFRoZSBkcml2ZXIgaXMgbGVzcyBlZmZpY2llbnQgdGhhbiBpdCBjb3VsZCBiZS4gSXQgc3dpdGNoZXMgdGhyb3VnaAorICogIHJlY2VpdmUgbW9kZSBldmVuIGlmIG1vcmUgdHJhbnNtaXRzIGFyZSBxdWV1ZWQuIElmIHRoaXMgd29ycmllcyB5b3UgYnV5CisgKiAgYSByZWFsIEV0aGVybmV0IGNhcmQuCisgKgorICogIFRoZSBjb21iaW5hdGlvbiBvZiBzbG93IHJlY2VpdmUgcmVzdGFydCBhbmQgbm8gcmVhbCBtdWx0aWNhc3QKKyAqICBmaWx0ZXIgbWFrZXMgdGhlIGJvYXJkIHVudXNhYmxlIHdpdGggYSBrZXJuZWwgY29tcGlsZWQgZm9yIElQCisgKiAgbXVsdGljYXN0aW5nIGluIGEgcmVhbCBtdWx0aWNhc3QgZW52aXJvbm1lbnQuIFRoYXQncyBkb3duIHRvIHRoZSBib2FyZCwKKyAqICBidXQgZXZlbiB3aXRoIG5vIG11bHRpY2FzdCBwcm9ncmFtcyBydW5uaW5nIGEgbXVsdGljYXN0IElQIGtlcm5lbCBpcworICogIGluIGdyb3VwIDIyNC4wLjAuMSBhbmQgeW91IHdpbGwgdGhlcmVmb3JlIGJlIGxpc3RlbmluZyB0byBhbGwgbXVsdGljYXN0cy4KKyAqICBPbmUgbnYgY29uZmVyZW5jZSBydW5uaW5nIG92ZXIgdGhhdCBFdGhlcm5ldCBhbmQgeW91IGNhbiBnaXZlIHVwLgorICoKKyAqLworCisjZGVmaW5lIERSVl9OQU1FCSIzYzUwMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjIwMDIvMTAvMDkiCisKKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKwlEUlZfTkFNRSAiLmM6ICIgRFJWX1ZFUlNJT04gIiBBbGFuIENveCAoYWxhbkByZWRoYXQuY29tKS5cbiI7CisKKy8qCisgKglCcmFpbmRhbWFnZSByZW1haW5pbmc6CisgKglUaGUgM2M1MDEgYm9hcmQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JLyogZm9yIENPTkZJR19JUF9NVUxUSUNBU1QgKi8KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSAiM2M1MDEuaCIKKworLyoKKyAqCVRoZSBib2lsZXJwbGF0ZSBwcm9iZSBjb2RlLgorICovCisKK3N0YXRpYyBpbnQgaW89MHgyODA7CitzdGF0aWMgaW50IGlycT01Oworc3RhdGljIGludCBtZW1fc3RhcnQ7CisKKy8qKgorICogZWwxX3Byb2JlOgkJLQlwcm9iZSBmb3IgYSAzYzUwMQorICogQGRldjogVGhlIGRldmljZSBzdHJ1Y3R1cmUgcGFzc2VkIGluIHRvIHByb2JlLiAKKyAqCisgKiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSB0d28gcGxhY2VzLiBUaGUgbmV0d29yayBsYXllciB3aWxsIHByb2JlIHVzaW5nCisgKiBhIGRldmljZSBzdHJ1Y3R1cmUgcGFzc2VkIGluIHdpdGggdGhlIHByb2JlIGluZm9ybWF0aW9uIGNvbXBsZXRlZC4gRm9yIGEKKyAqIG1vZHVsYXIgZHJpdmVyIHdlIHVzZSAjaW5pdF9tb2R1bGUgdG8gZmlsbCBpbiBvdXIgb3duIHN0cnVjdHVyZSBhbmQgcHJvYmUKKyAqIGZvciBpdC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gRU5YSU8gaWYgYXNrZWQgbm90IHRvIHByb2JlIGFuZCBFTk9ERVYgaWYgYXNrZWQgdG8KKyAqIHByb2JlIGFuZCBmYWlsaW5nIHRvIGZpbmQgYW55dGhpbmcuCisgKi8KKyAKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGVsMV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlzdGF0aWMgdW5zaWduZWQgcG9ydHNbXSA9IHsgMHgyODAsIDB4MzAwLCAwfTsKKwl1bnNpZ25lZCAqcG9ydDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQlpbyA9IGRldi0+YmFzZV9hZGRyOworCQlpcnEgPSBkZXYtPmlycTsKKwkJbWVtX3N0YXJ0ID0gZGV2LT5tZW1fc3RhcnQgJiA3OworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmIChpbyA+IDB4MWZmKSB7CS8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJZXJyID0gZWwxX3Byb2JlMShkZXYsIGlvKTsKKwl9IGVsc2UgaWYgKGlvICE9IDApIHsKKwkJZXJyID0gLUVOWElPOwkJLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCX0gZWxzZSB7CisJCWZvciAocG9ydCA9IHBvcnRzOyAqcG9ydCAmJiBlbDFfcHJvYmUxKGRldiwgKnBvcnQpOyBwb3J0KyspCisJCQk7CisJCWlmICghKnBvcnQpCisJCQllcnIgPSAtRU5PREVWOworCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVMMV9JT19FWFRFTlQpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoqCisgKgllbDFfcHJvYmUxOiAKKyAqCUBkZXY6IFRoZSBkZXZpY2Ugc3RydWN0dXJlIHRvIHVzZQorICoJQGlvYWRkcjogQW4gSS9PIGFkZHJlc3MgdG8gcHJvYmUgYXQuCisgKgorICoJVGhlIGFjdHVhbCBwcm9iZS4gVGhpcyBpcyBpdGVyYXRlZCBvdmVyIGJ5ICNlbDFfcHJvYmUgaW4gb3JkZXIgdG8KKyAqCWNoZWNrIGFsbCB0aGUgYXBwbGljYWJsZSBkZXZpY2UgbG9jYXRpb25zLgorICoKKyAqCVJldHVybnMgMCBmb3IgYSBzdWNjZXNzLCBpbiB3aGljaCBjYXNlIHRoZSBkZXZpY2UgaXMgYWN0aXZhdGVkLAorICoJRUFHQUlOIGlmIHRoZSBJUlEgaXMgaW4gdXNlIGJ5IGFub3RoZXIgZHJpdmVyLCBhbmQgRU5PREVWIGlmIHRoZQorICoJYm9hcmQgY2Fubm90IGJlIGZvdW5kLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGVsMV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKwljb25zdCBjaGFyICptbmFtZTsJCS8qIFZlbmRvciBuYW1lICovCisJdW5zaWduZWQgY2hhciBzdGF0aW9uX2FkZHJbNl07CisJaW50IGF1dG9pcnEgPSAwOworCWludCBpOworCisJLyoKKwkgKglSZXNlcnZlIEkvTyByZXNvdXJjZSBmb3IgZXhjbHVzaXZlIHVzZSBieSB0aGlzIGRyaXZlcgorCSAqLworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEVMMV9JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqCVJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBQUk9NIGRhdGEgZnJvbSB0aGUgc3BlY2lhbCBwb3J0LgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwl7CisJCW91dHcoaSwgaW9hZGRyICsgRUwxX0RBVEFQVFIpOworCQlzdGF0aW9uX2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgRUwxX1NBUFJPTSk7CisJfQorCS8qCisJICoJQ2hlY2sgdGhlIGZpcnN0IHRocmVlIG9jdGV0cyBvZiB0aGUgUy5BLiBmb3IgM0NvbSdzIHByZWZpeCwgb3IKKwkgKglmb3IgdGhlIFNhZ2VyIE5QOTQzIHByZWZpeC4KKwkgKi8KKworCWlmIChzdGF0aW9uX2FkZHJbMF0gPT0gMHgwMiAgJiYgIHN0YXRpb25fYWRkclsxXSA9PSAweDYwCisJCSYmIHN0YXRpb25fYWRkclsyXSA9PSAweDhjKQorCXsKKwkJbW5hbWUgPSAiM2M1MDEiOworCX0gZWxzZSBpZiAoc3RhdGlvbl9hZGRyWzBdID09IDB4MDAgICYmICBzdGF0aW9uX2FkZHJbMV0gPT0gMHg4MAorCSYmIHN0YXRpb25fYWRkclsyXSA9PSAweEM4KQorCXsKKwkJbW5hbWUgPSAiTlA5NDMiOworICAgIAl9CisgICAgCWVsc2UgeworCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEVMMV9JT19FWFRFTlQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKgorCSAqCVdlIGF1dG8tSVJRIGJ5IHNodXR0aW5nIG9mZiB0aGUgaW50ZXJydXB0IGxpbmUgYW5kIGxldHRpbmcgaXQgZmxvYXQKKwkgKgloaWdoLgorCSAqLworCisJZGV2LT5pcnEgPSBpcnE7CisKKwlpZiAoZGV2LT5pcnEgPCAyKQorCXsKKwkJdW5zaWduZWQgbG9uZyBpcnFfbWFzazsKKworCQlpcnFfbWFzayA9IHByb2JlX2lycV9vbigpOworCQlpbmIoUlhfU1RBVFVTKTsJCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKwkJaW5iKFRYX1NUQVRVUyk7CisJCW91dGIoQVhfTE9PUCArIDEsIEFYX0NNRCk7CisKKwkJb3V0YigweDAwLCBBWF9DTUQpOworCisJCW1kZWxheSgyMCk7CisJCWF1dG9pcnEgPSBwcm9iZV9pcnFfb2ZmKGlycV9tYXNrKTsKKworCQlpZiAoYXV0b2lycSA9PSAwKQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyBwcm9iZSBhdCAlI3ggZmFpbGVkIHRvIGRldGVjdCBJUlEgbGluZS5cbiIsCisJCQkJbW5hbWUsIGlvYWRkcik7CisJCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEVMMV9JT19FWFRFTlQpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisKKwlvdXRiKEFYX1JFU0VUK0FYX0xPT1AsIEFYX0NNRCk7CQkJLyogTG9vcGJhY2sgbW9kZS4gKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc3RhdGlvbl9hZGRyLCBFVEhfQUxFTik7CisKKwlpZiAobWVtX3N0YXJ0ICYgMHhmKQorCQllbF9kZWJ1ZyA9IG1lbV9zdGFydCAmIDB4NzsKKwlpZiAoYXV0b2lycSkKKwkJZGV2LT5pcnEgPSBhdXRvaXJxOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIEV0aGVyTGluayBhdCAlI2x4LCB1c2luZyAlc0lSUSAlZC5cbiIsIGRldi0+bmFtZSwgbW5hbWUsIGRldi0+YmFzZV9hZGRyLAorCQkJYXV0b2lycSA/ICJhdXRvIjoiYXNzaWduZWQgIiwgZGV2LT5pcnEpOworCisjaWZkZWYgQ09ORklHX0lQX01VTFRJQ0FTVAorCXByaW50ayhLRVJOX1dBUk5JTkcgIldBUk5JTkc6IFVzZSBvZiB0aGUgM2M1MDEgaW4gYSBtdWx0aWNhc3Qga2VybmVsIGlzIE5PVCByZWNvbW1lbmRlZC5cbiIpOworI2VuZGlmCisKKwlpZiAoZWxfZGVidWcpCisJCXByaW50ayhLRVJOX0RFQlVHICIlcyIsIHZlcnNpb24pOworCisJbWVtc2V0KGRldi0+cHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKwkKKwkvKgorCSAqCVRoZSBFTDEtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKwkgKi8KKworCWRldi0+b3BlbiA9ICZlbF9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmVsX3N0YXJ0X3htaXQ7CisJZGV2LT50eF90aW1lb3V0ID0gJmVsX3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IEhaOworCWRldi0+c3RvcCA9ICZlbDFfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmZWwxX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJZWwxX29wZW46CisgKglAZGV2OiBkZXZpY2UgdGhhdCBpcyBiZWluZyBvcGVuZWQKKyAqCisgKglXaGVuIGFuIGlmY29uZmlnIGlzIGlzc3VlZCB3aGljaCBjaGFuZ2VzIHRoZSBkZXZpY2UgZmxhZ3MgdG8gaW5jbHVkZQorICoJSUZGX1VQIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBJdCBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBjaGFuZ2UgCisgKglvY2N1cnMsIG5vdCB3aGVuIHRoZSBpbnRlcmZhY2UgcmVtYWlucyB1cC4gI2VsMV9jbG9zZSB3aWxsIGJlIGNhbGxlZAorICoJd2hlbiBpdCBnb2VzIGRvd24uCisgKgorICoJUmV0dXJucyAwIGZvciBhIHN1Y2Nlc3NmdWwgb3Blbiwgb3IgLUVBR0FJTiBpZiBzb21lb25lIGhhcyBydW4gb2ZmCisgKgl3aXRoIG91ciBpbnRlcnJ1cHQgbGluZS4KKyAqLworCitzdGF0aWMgaW50IGVsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0dmFsOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChlbF9kZWJ1ZyA+IDIpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRG9pbmcgZWxfb3BlbigpLi4uIiwgZGV2LT5uYW1lKTsKKworCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZlbF9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkpCisJCXJldHVybiByZXR2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwllbF9yZXNldChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlscC0+dHhpbmcgPSAwOwkJLyogQm9hcmQgaW4gUlggbW9kZSAqLworCW91dGIoQVhfUlgsIEFYX0NNRCk7CS8qIEF1eCBjb250cm9sLCBpcnEgYW5kIHJlY2VpdmUgZW5hYmxlZCAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZWxfdGltZW91dDoKKyAqIEBkZXY6IFRoZSAzYzUwMSBjYXJkIHRoYXQgaGFzIHRpbWVkIG91dAorICoKKyAqIEF0dGVtcHQgdG8gcmVzdGFydCB0aGUgYm9hcmQuIFRoaXMgaXMgYmFzaWNhbGx5IGEgbWl4dHVyZSBvZiBleHRyZW1lCisgKiB2aW9sZW5jZSBhbmQgcHJheWVyCisgKgorICovCisgCitzdGF0aWMgdm9pZCBlbF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAKKwlpZiAoZWxfZGVidWcpCisJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgdHhzciAlIzJ4IGF4c3I9JTAyeCByeHNyPSUwMnguXG4iLAorCQkJZGV2LT5uYW1lLCBpbmIoVFhfU1RBVFVTKSwgaW5iKEFYX1NUQVRVUyksIGluYihSWF9TVEFUVVMpKTsKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJb3V0YihUWF9OT1JNLCBUWF9DTUQpOworCW91dGIoUlhfTk9STSwgUlhfQ01EKTsKKwlvdXRiKEFYX09GRiwgQVhfQ01EKTsJLyogSnVzdCB0cmlnZ2VyIGEgZmFsc2UgaW50ZXJydXB0LiAqLworCW91dGIoQVhfUlgsIEFYX0NNRCk7CS8qIEF1eCBjb250cm9sLCBpcnEgYW5kIHJlY2VpdmUgZW5hYmxlZCAqLworCWxwLT50eGluZyA9IDA7CQkvKiBSaXBwZWQgYmFjayBpbiB0byBSWCAqLworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworIAorLyoqCisgKiBlbF9zdGFydF94bWl0OgorICogQHNrYjogVGhlIHBhY2tldCB0aGF0IGlzIHF1ZXVlZCB0byBiZSBzZW50CisgKiBAZGV2OiBUaGUgM2M1MDEgY2FyZCB3ZSB3YW50IHRvIHRocm93IGl0IGRvd24KKyAqCisgKiBBdHRlbXB0IHRvIHNlbmQgYSBwYWNrZXQgdG8gYSAzYzUwMSBjYXJkLiBUaGVyZSBhcmUgc29tZSBpbnRlcmVzdGluZworICogY2F0Y2hlcyBoZXJlIGJlY2F1c2UgdGhlIDNjNTAxIGlzIGFuIGV4dHJlbWVseSBvbGQgYW5kIHRoZXJlZm9yZQorICogc3R1cGlkIHBpZWNlIG9mIHRlY2hub2xvZ3kuCisgKgorICogSWYgd2UgYXJlIGhhbmRsaW5nIGFuIGludGVycnVwdCBvbiB0aGUgb3RoZXIgQ1BVIHdlIGNhbm5vdCBsb2FkIGEgcGFja2V0CisgKiBhcyB3ZSBtYXkgc3RpbGwgYmUgYXR0ZW1wdGluZyB0byByZXRyaWV2ZSB0aGUgbGFzdCBSWCBwYWNrZXQgYnVmZmVyLgorICoKKyAqIFdoZW4gYSB0cmFuc21pdCB0aW1lcyBvdXQgd2UgZHVtcCB0aGUgY2FyZCBpbnRvIGNvbnRyb2wgbW9kZSBhbmQganVzdAorICogc3RhcnQgYWdhaW4uIEl0IGhhcHBlbnMgZW5vdWdoIHRoYXQgaXQgaXNudCB3b3J0aCBsb2dnaW5nLgorICoKKyAqIFdlIGF2b2lkIGhvbGRpbmcgdGhlIHNwaW4gbG9ja3Mgd2hlbiBkb2luZyB0aGUgcGFja2V0IGxvYWQgdG8gdGhlIGJvYXJkLgorICogVGhlIGRldmljZSBpcyB2ZXJ5IHNsb3csIGFuZCBpdHMgRE1BIG1vZGUgaXMgZXZlbiBzbG93ZXIuIElmIHdlIGhlbGQgdGhlCisgKiBsb2NrIHdoaWxlIGxvYWRpbmcgMTUwMCBieXRlcyBvbnRvIHRoZSBjb250cm9sbGVyIHdlIHdvdWxkIGRyb3AgYSBsb3Qgb2YKKyAqIHNlcmlhbCBwb3J0IGNoYXJhY3RlcnMuIFRoaXMgcmVxdWlyZXMgd2UgZG8gZXh0cmEgbG9ja2luZywgYnV0IHdlIGhhdmUKKyAqIG5vIHJlYWwgY2hvaWNlLgorICovCisKK3N0YXRpYyBpbnQgZWxfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICoJQXZvaWQgaW5jb21pbmcgaW50ZXJydXB0cyBiZXR3ZWVuIHVzIGZsaXBwaW5nIHR4aW5nIGFuZCBmbGlwcGluZworCSAqCW1vZGUgYXMgdGhlIGRyaXZlciBhc3N1bWVzIHR4aW5nIGlzIGEgZmFpdGhmdWwgaW5kaWNhdG9yIG9mIGNhcmQKKwkgKglzdGF0ZQorCSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJCisJLyoKKwkgKglBdm9pZCB0aW1lci1iYXNlZCByZXRyYW5zbWlzc2lvbiBjb25mbGljdHMuCisJICovCisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlkbworCXsKKwkJaW50IGxlbiA9IHNrYi0+bGVuOworCQlpbnQgcGFkID0gMDsKKwkJaW50IGdwX3N0YXJ0OworCQl1bnNpZ25lZCBjaGFyICpidWYgPSBza2ItPmRhdGE7CisJCQorCQlpZiAobGVuIDwgRVRIX1pMRU4pCisJCQlwYWQgPSBFVEhfWkxFTiAtIGxlbjsKKwkJCQorCQlncF9zdGFydCA9IDB4ODAwIC0gKCBsZW4gKyBwYWQgKTsKKworCQlscC0+dHhfcGt0X3N0YXJ0ID0gZ3Bfc3RhcnQ7CisgICAgCQlscC0+Y29sbGlzaW9ucyA9IDA7CisKKyAgICAJCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCQkvKgorCQkgKglDb21tYW5kIG1vZGUgd2l0aCBzdGF0dXMgY2xlYXJlZCBzaG91bGQgW2luIHRoZW9yeV0KKwkJICoJbWVhbiBubyBtb3JlIGludGVycnVwdHMgY2FuIGJlIHBlbmRpbmcgb24gdGhlIGNhcmQuCisJCSAqLworCisJCW91dGJfcChBWF9TWVMsIEFYX0NNRCk7CisJCWluYl9wKFJYX1NUQVRVUyk7CisJCWluYl9wKFRYX1NUQVRVUyk7CisKKwkJbHAtPmxvYWRpbmcgPSAxOworCQlscC0+dHhpbmcgPSAxOworCisJCS8qCisJCSAqCVR1cm4gaW50ZXJydXB0cyBiYWNrIG9uIHdoaWxlIHdlIHNwZW5kIGEgcGxlYXNhbnQgYWZ0ZXJub29uCisJCSAqCWxvYWRpbmcgYnl0ZXMgaW50byB0aGUgYm9hcmQKKwkJICovCisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkJCisJCW91dHcoMHgwMCwgUlhfQlVGX0NMUik7CQkvKiBTZXQgcnggcGFja2V0IGFyZWEgdG8gMC4gKi8KKwkJb3V0dyhncF9zdGFydCwgR1BfTE9XKTsJCS8qIGFpbSAtIHBhY2tldCB3aWxsIGJlIGxvYWRlZCBpbnRvIGJ1ZmZlciBzdGFydCAqLworCQlvdXRzYihEQVRBUE9SVCxidWYsbGVuKTsJLyogbG9hZCBidWZmZXIgKHVzdWFsIHRoaW5nIGVhY2ggYnl0ZSBpbmNyZW1lbnRzIHRoZSBwb2ludGVyKSAqLworCQlpZiAocGFkKSB7CisJCQl3aGlsZShwYWQtLSkJCS8qIFplcm8gZmlsbCBidWZmZXIgdGFpbCAqLworCQkJCW91dGIoMCwgREFUQVBPUlQpOworCQl9CisJCW91dHcoZ3Bfc3RhcnQsIEdQX0xPVyk7CQkvKiB0aGUgYm9hcmQgcmV1c2VzIHRoZSBzYW1lIHJlZ2lzdGVyICovCisJCisJCWlmKGxwLT5sb2FkaW5nICE9IDIpCisJCXsKKwkJCW91dGIoQVhfWE1JVCwgQVhfQ01EKTsJCS8qIGZpcmUgLi4uIFRyaWdnZXIgeG1pdC4gICovCisJCQlscC0+bG9hZGluZz0wOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQlpZiAoZWxfZGVidWcgPiAyKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgcXVldWVkIHhtaXQuXG4iKTsKKwkJCWRldl9rZnJlZV9za2IgKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBBIHJlY2VpdmUgdXBzZXQgb3VyIGxvYWQsIGRlc3BpdGUgb3VyIGJlc3QgZWZmb3J0cyAqLworCQlpZihlbF9kZWJ1Zz4yKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidXJwZWQgZHVyaW5nIHR4IGxvYWQuXG4iLCBkZXYtPm5hbWUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwl9CisJd2hpbGUoMSk7CisKK30KKworLyoqCisgKiBlbF9pbnRlcnJ1cHQ6CisgKiBAaXJxOiBJbnRlcnJ1cHQgbnVtYmVyCisgKiBAZGV2X2lkOiBUaGUgM2M1MDEgdGhhdCBidXJwZWQKKyAqIEByZWdzOiBSZWdpc3RlciBkYXRhIChzdXJwbHVzIHRvIG91ciByZXF1aXJlbWVudHMpCisgKgorICogSGFuZGxlIHRoZSBldGhlciBpbnRlcmZhY2UgaW50ZXJydXB0cy4gVGhlIDNjNTAxIG5lZWRzIGEgbG90IG1vcmUgCisgKiBoYW5kIGhvbGRpbmcgdGhhbiBtb3N0IGNhcmRzLiBJbiBwYXJ0aWN1bGFyIHdlIGdldCBhIHRyYW5zbWl0IGludGVycnVwdAorICogd2l0aCBhIGNvbGxpc2lvbiBlcnJvciBiZWNhdXNlIHRoZSBib2FyZCBmaXJtd2FyZSBpc250IGNhcGFibGUgb2YgcmV3aW5kaW5nCisgKiBpdHMgb3duIHRyYW5zbWl0IGJ1ZmZlciBwb2ludGVycy4gSXQgY2FuIGhvd2V2ZXIgY291bnQgdG8gMTYgZm9yIHVzLgorICoKKyAqIE9uIHRoZSByZWNlaXZlIHNpZGUgdGhlIGNhcmQgaXMgYWxzbyB2ZXJ5IGR1bWIuIEl0IGhhcyBubyBidWZmZXJpbmcgdG8KKyAqIHNwZWFrIG9mLiBXZSBzaW1wbHkgcHVsbCB0aGUgcGFja2V0IG91dCBvZiBpdHMgUElPIGJ1ZmZlciAod2hpY2ggaXMgc2xvdykKKyAqIGFuZCBxdWV1ZSBpdCBmb3IgdGhlIGtlcm5lbC4gVGhlbiB3ZSByZXNldCB0aGUgY2FyZCBmb3IgdGhlIG5leHQgcGFja2V0LgorICoKKyAqIFdlIHNvbWV0aW1lcyBnZXQgc3VwcmlzZSBpbnRlcnJ1cHRzIGxhdGUgYm90aCBiZWNhdXNlIHRoZSBTTVAgSVJRIGRlbGl2ZXJ5CisgKiBpcyBtZXNzYWdlIHBhc3NpbmcgYW5kIGJlY2F1c2UgdGhlIGNhcmQgc29tZXRpbWVzIHNlZW1zIHRvIGRlbGl2ZXIgbGF0ZS4gSQorICogdGhpbmsgaWYgaXQgaXMgcGFydCB3YXkgdGhyb3VnaCBhIHJlY2VpdmUgYW5kIHRoZSBtb2RlIGlzIGNoYW5nZWQgaXQgY2FycmllcworICogb24gcmVjZWl2aW5nIGFuZCBzZW5kcyB1cyBhbiBpbnRlcnJ1cHQuIFdlIGhhdmUgdG8gYmFuZCBhaWQgYWxsIHRoZXNlIGNhc2VzCisgKiB0byBnZXQgYSBzZW5zaWJsZSAxNTBrYnl0ZXMvc2Vjb25kIHBlcmZvcm1hbmNlLiBFdmVuIHRoZW4geW91IHdhbnQgYSBzbWFsbAorICogVENQIHdpbmRvdy4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgZWxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKwlpbnQgaW9hZGRyOworCWludCBheHNyOwkJCS8qIEF1eC4gc3RhdHVzIHJlZy4gKi8KKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCQorCS8qCisJICoJV2hhdCBoYXBwZW5lZCA/CisJICovCisKKwlheHNyID0gaW5iKEFYX1NUQVRVUyk7CisKKwkvKgorCSAqCUxvZyBpdAorCSAqLworCisJaWYgKGVsX2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbF9pbnRlcnJ1cHQoKSBhdXg9JSMwMngiLCBkZXYtPm5hbWUsIGF4c3IpOworCisgICAgICAgIGlmKGxwLT5sb2FkaW5nPT0xICYmICFscC0+dHhpbmcpCisgICAgICAgIAlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW5jb25zaXN0ZW50IHN0YXRlIGxvYWRpbmcgd2hpbGUgbm90IGluIHR4XG4iLAorICAgICAgICAJCWRldi0+bmFtZSk7CisKKwlpZiAobHAtPnR4aW5nKQorCXsKKworICAgIAkJLyoKKyAgICAJCSAqCUJvYXJkIGluIHRyYW5zbWl0IG1vZGUuIE1heSBiZSBsb2FkaW5nLiBJZiB3ZSBhcmUKKyAgICAJCSAqCWxvYWRpbmcgd2Ugc2hvdWxkbid0IGhhdmUgZ290IHRoaXMuCisgICAgCQkgKi8KKworCQlpbnQgdHhzciA9IGluYihUWF9TVEFUVVMpOworCisJCWlmKGxwLT5sb2FkaW5nPT0xKQorCQl7CisJCQlpZihlbF9kZWJ1ZyA+IDIpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbnRlcnJ1cHQgd2hpbGUgbG9hZGluZyBbIiwgZGV2LT5uYW1lKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiIHR4c3I9JTAyeCBncD0lMDR4IHJwPSUwNHhdXG4iLCB0eHNyLCBpbncoR1BfTE9XKSxpbncoUlhfTE9XKSk7CisJCQl9CisJCQlscC0+bG9hZGluZz0yOwkJLyogRm9yY2UgYSByZWxvYWQgKi8KKwkJCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChlbF9kZWJ1ZyA+IDYpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiIHR4c3I9JTAyeCBncD0lMDR4IHJwPSUwNHgiLCB0eHNyLCBpbncoR1BfTE9XKSxpbncoUlhfTE9XKSk7CisKKwkJaWYgKChheHNyICYgMHg4MCkgJiYgKHR4c3IgJiBUWF9SRUFEWSkgPT0gMCkKKwkJeworCQkJLyoKKwkJCSAqCUZJWE1FOiBpcyB0aGVyZSBhIGxvZ2ljIHRvIHdoZXRoZXIgdG8ga2VlcCBvbiB0cnlpbmcgb3IKKwkJCSAqCXJlc2V0IGltbWVkaWF0ZWx5ID8KKwkJCSAqLworCQkJaWYoZWxfZGVidWc+MSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFVudXN1YWwgaW50ZXJydXB0IGR1cmluZyBUeCwgdHhzcj0lMDJ4IGF4c3I9JTAyeCIKKwkJCSAgCQkiIGdwPSUwM3ggcnA9JTAzeC5cbiIsIGRldi0+bmFtZSwgdHhzciwgYXhzciwKKwkJCWludyhpb2FkZHIgKyBFTDFfREFUQVBUUiksIGludyhpb2FkZHIgKyBFTDFfUlhQVFIpKTsKKwkJCWxwLT50eGluZyA9IDA7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKwkJZWxzZSBpZiAodHhzciAmIFRYXzE2Q09MTElTSU9OUykKKwkJeworCQkJLyoKKwkJCSAqCVRpbWVkIG91dAorCQkJICovCisJCQlpZiAoZWxfZGVidWcpCisJCQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogVHJhbnNtaXQgZmFpbGVkIDE2IHRpbWVzLCBFdGhlcm5ldCBqYW1tZWQ/XG4iLGRldi0+bmFtZSk7CisJCQlvdXRiKEFYX1NZUywgQVhfQ01EKTsKKwkJCWxwLT50eGluZyA9IDA7CisJCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCQllbHNlIGlmICh0eHNyICYgVFhfQ09MTElTSU9OKQorCQl7CisJCQkvKgorCQkJICoJUmV0cmlnZ2VyIHhtaXQuCisJCQkgKi8KKworCQkJaWYgKGVsX2RlYnVnID4gNikKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiIHJldHJhbnNtaXR0aW5nIGFmdGVyIGEgY29sbGlzaW9uLlxuIik7CisJCQkvKgorCQkJICoJUG9vciBsaXR0bGUgY2hpcCBjYW4ndCByZXNldCBpdHMgb3duIHN0YXJ0IHBvaW50ZXIKKwkJCSAqLworCisJCQlvdXRiKEFYX1NZUywgQVhfQ01EKTsKKwkJCW91dHcobHAtPnR4X3BrdF9zdGFydCwgR1BfTE9XKTsKKwkJCW91dGIoQVhfWE1JVCwgQVhfQ01EKTsKKwkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCQlzcGluX3VubG9jaygmbHAtPmxvY2spOworCQkJZ290byBvdXQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKgorCQkJICoJSXQgd29ya2VkLi4gd2Ugd2lsbCBub3cgZmFsbCB0aHJvdWdoIGFuZCByZWNlaXZlCisJCQkgKi8KKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlpZiAoZWxfZGVidWcgPiA2KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgVHggc3VjY2VlZGVkICVzXG4iLAorCQkgICAgICAgCQkJKHR4c3IgJiBUWF9SRFkpID8gIi4iIDogImJ1dCB0eCBpcyBidXN5ISIpOworCQkJLyoKKwkJCSAqCVRoaXMgaXMgc2FmZSB0aGUgaW50ZXJydXB0IGlzIGF0b21pYyBXUlQgaXRzZWxmLgorCQkJICovCisKKwkJCWxwLT50eGluZyA9IDA7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CS8qIEluIGNhc2UgbW9yZSB0byB0cmFuc21pdCAqLworCQl9CisJfQorCWVsc2UKKwl7CisgICAgCQkvKgorICAgIAkJICoJSW4gcmVjZWl2ZSBtb2RlLgorICAgIAkJICovCisKKwkJaW50IHJ4c3IgPSBpbmIoUlhfU1RBVFVTKTsKKwkJaWYgKGVsX2RlYnVnID4gNSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgcnhzcj0lMDJ4IHR4c3I9JTAyeCBycD0lMDR4IiwgcnhzciwgaW5iKFRYX1NUQVRVUyksaW53KFJYX0xPVykpOworCQkvKgorCQkgKglKdXN0IHJlYWRpbmcgcnhfc3RhdHVzIGZpeGVzIG1vc3QgZXJyb3JzLgorCQkgKi8KKwkJaWYgKHJ4c3IgJiBSWF9NSVNTRUQpCisJCQlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworCQllbHNlIGlmIChyeHNyICYgUlhfUlVOVCkKKwkJewkvKiBIYW5kbGVkIHRvIGF2b2lkIGJvYXJkIGxvY2stdXAuICovCisJCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKGVsX2RlYnVnID4gNSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiIHJ1bnQuXG4iKTsKKwkJfQorCQllbHNlIGlmIChyeHNyICYgUlhfR09PRCkKKwkJeworCQkJLyoKKwkJCSAqCVJlY2VpdmUgd29ya2VkLgorCQkJICovCisJCQllbF9yZWNlaXZlKGRldik7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKgorCQkJICoJTm90aGluZz8gIFNvbWV0aGluZyBpcyBicm9rZW4hCisJCQkgKi8KKwkJCWlmIChlbF9kZWJ1ZyA+IDIpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBObyBwYWNrZXQgc2Vlbiwgcnhzcj0lMDJ4ICoqcmVzZXR0aW5nIDNjNTAxKioqXG4iLAorCQkJCQlkZXYtPm5hbWUsIHJ4c3IpOworCQkJZWxfcmVzZXQoZGV2KTsKKwkJfQorCQlpZiAoZWxfZGVidWcgPiAzKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIi5cbiIpOworCX0KKworCS8qCisJICoJTW92ZSBpbnRvIHJlY2VpdmUgbW9kZQorCSAqLworCisJb3V0YihBWF9SWCwgQVhfQ01EKTsKKwlvdXR3KDB4MDAsIFJYX0JVRl9DTFIpOworCWluYihSWF9TVEFUVVMpOwkJLyogQmUgY2VydGFpbiB0aGF0IGludGVycnVwdHMgYXJlIGNsZWFyZWQuICovCisJaW5iKFRYX1NUQVRVUyk7CisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKK291dDoKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyoqCisgKiBlbF9yZWNlaXZlOgorICogQGRldjogRGV2aWNlIHRvIHB1bGwgdGhlIHBhY2tldHMgZnJvbQorICoKKyAqIFdlIGhhdmUgYSBnb29kIHBhY2tldC4gV2VsbCwgbm90IHJlYWxseSAiZ29vZCIsIGp1c3QgbW9zdGx5IG5vdCBicm9rZW4uCisgKiBXZSBtdXN0IGNoZWNrIGV2ZXJ5dGhpbmcgdG8gc2VlIGlmIGl0IGlzIGdvb2QuIEluIHBhcnRpY3VsYXIgd2Ugb2NjYXNpb25hbGx5CisgKiBnZXQgd2lsZCBwYWNrZXQgc2l6ZXMgZnJvbSB0aGUgY2FyZC4gSWYgdGhlIHBhY2tldCBzZWVtcyBzYW5lIHdlIFBJTyBpdAorICogb2ZmIHRoZSBjYXJkIGFuZCBxdWV1ZSBpdCBmb3IgdGhlIHByb3RvY29sIGxheWVycy4KKyAqLworCitzdGF0aWMgdm9pZCBlbF9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgcGt0X2xlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJcGt0X2xlbiA9IGludyhSWF9MT1cpOworCisJaWYgKGVsX2RlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBlbF9yZWNlaXZlICVkLlxuIiwgcGt0X2xlbik7CisKKwlpZiAoKHBrdF9sZW4gPCA2MCkgIHx8ICAocGt0X2xlbiA+IDE1MzYpKQorCXsKKwkJaWYgKGVsX2RlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBib2d1cyBwYWNrZXQsIGxlbmd0aD0lZFxuIiwgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKwkJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqCUNvbW1hbmQgbW9kZSBzbyB3ZSBjYW4gZW1wdHkgdGhlIGJ1ZmZlcgorCSAqLworCisJb3V0YihBWF9TWVMsIEFYX0NNRCk7CisJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzIpOworCisJLyoKKwkgKglTdGFydCBvZiBmcmFtZQorCSAqLworCisJb3V0dygweDAwLCBHUF9MT1cpOworCWlmIChza2IgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworICAgIAkJc2tiX3Jlc2VydmUoc2tiLDIpOwkvKiBGb3JjZSAxNiBieXRlIGFsaWdubWVudCAqLworCQlza2ItPmRldiA9IGRldjsKKwkJLyoKKwkJICoJVGhlIHJlYWQgaW5jcmVtZW50cyB0aHJvdWdoIHRoZSBieXRlcy4gVGhlIGludGVycnVwdAorCQkgKgloYW5kbGVyIHdpbGwgZml4IHRoZSBwb2ludGVyIHdoZW4gaXQgcmV0dXJucyB0bworCQkgKglyZWNlaXZlIG1vZGUuCisJCSAqLworCQlpbnNiKERBVEFQT1JULCBza2JfcHV0KHNrYixwa3RfbGVuKSwgcGt0X2xlbik7CisJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCW5ldGlmX3J4KHNrYik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWxwLT5zdGF0cy5yeF9ieXRlcys9cGt0X2xlbjsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqIGVsX3Jlc2V0OiBSZXNldCBhIDNjNTAxIGNhcmQKKyAqIEBkZXY6IFRoZSAzYzUwMSBjYXJkIGFib3V0IHRvIGdldCB6YXBwZWQKKyAqCisgKiBFdmVuIHJlc2V0dGluZyBhIDNjNTAxIGlzbnQgc2ltcGxlLiBXaGVuIHlvdSBhY3RpdmF0ZSByZXNldCBpdCBsb3NlcyBhbGwKKyAqIGl0cyBjb25maWd1cmF0aW9uLiBZb3UgbXVzdCBob2xkIHRoZSBsb2NrIHdoZW4gZG9pbmcgdGhpcy4gVGhlIGZ1bmN0aW9uCisgKiBjYW5ub3QgdGFrZSB0aGUgbG9jayBpdHNlbGYgYXMgaXQgaXMgY2FsbGFibGUgZnJvbSB0aGUgaXJxIGhhbmRsZXIuCisgKi8KKworc3RhdGljIHZvaWQgIGVsX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmIChlbF9kZWJ1Zz4gMikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiM2M1MDEgcmVzZXQuLi4iKTsKKwlvdXRiKEFYX1JFU0VULCBBWF9DTUQpOwkJLyogUmVzZXQgdGhlIGNoaXAgKi8KKwlvdXRiKEFYX0xPT1AsIEFYX0NNRCk7CQkvKiBBdXggY29udHJvbCwgaXJxIGFuZCBsb29wYmFjayBlbmFibGVkICovCisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykJLyogU2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MuICovCisJCQlvdXRiKGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIGkpOworCX0KKworCW91dHcoMCwgUlhfQlVGX0NMUik7CQkvKiBTZXQgcnggcGFja2V0IGFyZWEgdG8gMC4gKi8KKwlvdXRiKFRYX05PUk0sIFRYX0NNRCk7CQkvKiB0eCBpcnEgb24gZG9uZSwgY29sbGlzaW9uICovCisJb3V0YihSWF9OT1JNLCBSWF9DTUQpOwkJLyogU2V0IFJ4IGNvbW1hbmRzLiAqLworCWluYihSWF9TVEFUVVMpOwkJCS8qIENsZWFyIHN0YXR1cy4gKi8KKwlpbmIoVFhfU1RBVFVTKTsKKwlscC0+dHhpbmcgPSAwOworfQorCisvKioKKyAqIGVsMV9jbG9zZToKKyAqIEBkZXY6IDNjNTAxIGNhcmQgdG8gc2h1dCBkb3duCisgKgorICogQ2xvc2UgYSAzYzUwMSBjYXJkLiBUaGUgSUZGX1VQIGZsYWcgaGFzIGJlZW4gY2xlYXJlZCBieSB0aGUgdXNlciB2aWEKKyAqIHRoZSBTSU9DU0lGRkxBR1MgaW9jdGwuIFdlIHN0b3AgYW55IGZ1cnRoZXIgdHJhbnNtaXNzaW9ucyBiZWluZyBxdWV1ZWQsCisgKiBhbmQgdGhlbiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHRzLiBGaW5hbGx5IHdlIHJlc2V0IHRoZSBjaGlwLiBUaGUgZWZmZWN0cworICogb2YgdGhlIHJlc3Qgd2lsbCBiZSBjbGVhbmVkIHVwIGJ5ICNlbDFfb3Blbi4gQWx3YXlzIHJldHVybnMgMCBpbmRpY2F0aW5nCisgKiBhIHN1Y2Nlc3MuCisgKi8KKyAKK3N0YXRpYyBpbnQgZWwxX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKGVsX2RlYnVnID4gMikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNodXR0aW5nIGRvd24gRXRoZXJuZXQgY2FyZCBhdCAlI3guXG4iLCBkZXYtPm5hbWUsIGlvYWRkcik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyoKKwkgKglGcmVlIGFuZCBkaXNhYmxlIHRoZSBJUlEuCisJICovCisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlvdXRiKEFYX1JFU0VULCBBWF9DTUQpOwkJLyogUmVzZXQgdGhlIGNoaXAgKi8KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGVsMV9nZXRfc3RhdHM6CisgKiBAZGV2OiBUaGUgY2FyZCB0byBnZXQgdGhlIHN0YXRpc3RpY3MgZm9yCisgKgorICogSW4gc21hcnRlciBkZXZpY2VzIHRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkIHRvIHB1bGwgc3RhdGlzdGljcyBvZmYgdGhlCisgKiBib2FyZCBpdHNlbGYuIFRoZSAzYzUwMSBoYXMgbm8gaGFyZHdhcmUgc3RhdGlzdGljcy4gV2UgbWFpbnRhaW4gdGhlbSBhbGwKKyAqIHNvIHRoZXkgYXJlIGJ5IGRlZmluaXRpb24gYWx3YXlzIHVwIHRvIGRhdGUuCisgKgorICogUmV0dXJucyB0aGUgc3RhdGlzdGljcyBmb3IgdGhlIGNhcmQgZnJvbSB0aGUgY2FyZCBwcml2YXRlIGRhdGEKKyAqLworIAorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplbDFfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKioKKyAqIHNldF9tdWx0aWNhc3RfbGlzdDoKKyAqIEBkZXY6IFRoZSBkZXZpY2UgdG8gYWRqdXN0CisgKgorICogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IgdG8gdXNlIHRoZSBiZXN0LWVmZm9ydCAKKyAqIGZpbHRlcmluZyBzdXBwb3J0ZWQuIFRoZSAzYzUwMSBzdXBwb3J0cyBvbmx5IHRocmVlIG1vZGVzIG9mIGZpbHRlcmluZy4KKyAqIEl0IGFsd2F5cyByZWNlaXZlcyBicm9hZGNhc3RzIGFuZCBwYWNrZXRzIGZvciBpdHNlbGYuIFlvdSBjYW4gY2hvb3NlIHRvCisgKiBvcHRpb25hbGx5IHJlY2VpdmUgYWxsIHBhY2tldHMsIG9yIGFsbCBtdWx0aWNhc3QgcGFja2V0cyBvbiB0b3Agb2YgdGhpcy4KKyAqLworCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZihkZXYtPmZsYWdzJklGRl9QUk9NSVNDKQorCXsKKwkJb3V0YihSWF9QUk9NLCBSWF9DTUQpOworCQlpbmIoUlhfU1RBVFVTKTsKKwl9CisJZWxzZSBpZiAoZGV2LT5tY19saXN0IHx8IGRldi0+ZmxhZ3MmSUZGX0FMTE1VTFRJKQorCXsKKwkJb3V0YihSWF9NVUxULCBSWF9DTUQpOwkvKiBNdWx0aWNhc3Qgb3IgYWxsIG11bHRpY2FzdCBpcyB0aGUgc2FtZSAqLworCQlpbmIoUlhfU1RBVFVTKTsJCS8qIENsZWFyIHN0YXR1cy4gKi8KKwl9CisJZWxzZQorCXsKKwkJb3V0YihSWF9OT1JNLCBSWF9DTUQpOworCQlpbmIoUlhfU1RBVFVTKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiSVNBIDB4JWx4IiwgZGV2LT5iYXNlX2FkZHIpOworfQorCitzdGF0aWMgdTMyIG5ldGRldl9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGVidWc7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCWRlYnVnID0gbGV2ZWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisJLmdldF9tc2dsZXZlbAkJPSBuZXRkZXZfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X3NldF9tc2dsZXZlbCwKK307CisKKyNpZmRlZiBNT0RVTEUKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfM2M1MDE7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiRXRoZXJMaW5rIEkvTyBiYXNlIGFkZHJlc3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiRXRoZXJMaW5rIElSUSBudW1iZXIiKTsKKworLyoqCisgKiBpbml0X21vZHVsZToKKyAqCisgKiBXaGVuIHRoZSBkcml2ZXIgaXMgbG9hZGVkIGFzIGEgbW9kdWxlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBXZSBmYWtlIHVwCisgKiBhIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgYmFzZSBJL08gYW5kIGludGVycnVwdCBzZXQgYXMgaWYgaXQgd2VyZSBiZWluZworICogY2FsbGVkIGZyb20gU3BhY2UuYy4gVGhpcyBtaW5pbWlzZXMgdGhlIGV4dHJhIGNvZGUgdGhhdCB3b3VsZCBvdGhlcndpc2UKKyAqIGJlIHJlcXVpcmVkLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciAtRUlPIGlmIGEgY2FyZCBpcyBub3QgZm91bmQuIFJldHVybmluZyBhbiBlcnJvcgorICogaGVyZSBhbHNvIGNhdXNlcyB0aGUgbW9kdWxlIHRvIGJlIHVubG9hZGVkCisgKi8KKyAKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWRldl8zYzUwMSA9IGVsMV9wcm9iZSgtMSk7CisJaWYgKElTX0VSUihkZXZfM2M1MDEpKQorCQlyZXR1cm4gUFRSX0VSUihkZXZfM2M1MDEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGNsZWFudXBfbW9kdWxlOgorICogCisgKiBUaGUgbW9kdWxlIGlzIGJlaW5nIHVubG9hZGVkLiBXZSB1bmhvb2sgb3VyIG5ldHdvcmsgZGV2aWNlIGZyb20gdGhlIHN5c3RlbQorICogYW5kIHRoZW4gZnJlZSB1cCB0aGUgcmVzb3VyY2VzIHdlIHRvb2sgd2hlbiB0aGUgY2FyZCB3YXMgZm91bmQuCisgKi8KKyAKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2XzNjNTAxOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVMMV9JT19FWFRFTlQpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworTU9EVUxFX0FVVEhPUigiRG9uYWxkIEJlY2tlciwgQWxhbiBDb3giKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgdGhlIGFuY2llbnQgM0NvbSAzYzUwMSBldGhlcm5ldCBjYXJkIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTAxLmggYi9kcml2ZXJzL25ldC8zYzUwMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYjA1ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC8zYzUwMS5oCkBAIC0wLDAgKzEsOTMgQEAKKworLyoKKyAqCUluZGV4IHRvIGZ1bmN0aW9ucy4KKyAqLworCitzdGF0aWMgaW50ICBlbDFfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworc3RhdGljIGludCAgZWxfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVsX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBlbF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGVsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGVsX3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlbF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIGVsMV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWwxX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworCisjZGVmaW5lIEVMMV9JT19FWFRFTlQJMTYKKworI2lmbmRlZiBFTF9ERUJVRworI2RlZmluZSBFTF9ERUJVRyAgMAkvKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgZGV2ZWwuLCA+MiBmb3IgZGVidWcgKi8KKyNlbmRpZgkJCS8qIEFueXRoaW5nIGFib3ZlIDUgaXMgd29yZHkgZGVhdGghICovCisjZGVmaW5lIGRlYnVnIGVsX2RlYnVnCitzdGF0aWMgaW50IGVsX2RlYnVnID0gRUxfREVCVUc7CisKKy8qCisgKglCb2FyZC1zcGVjaWZpYyBpbmZvIGluIGRldi0+cHJpdi4KKyAqLworCitzdHJ1Y3QgbmV0X2xvY2FsCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJaW50CQl0eF9wa3Rfc3RhcnQ7CS8qIFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgVHggcGFja2V0LiAqLworCWludAkJY29sbGlzaW9uczsJLyogVHggY29sbGlzaW9ucyB0aGlzIHBhY2tldCAqLworCWludAkJbG9hZGluZzsJLyogU3BvdCBidWZmZXIgbG9hZCBjb2xsaXNpb25zICovCisJaW50CQl0eGluZzsJCS8qIFRydWUgaWYgY2FyZCBpcyBpbiBUWCBtb2RlICovCisJc3BpbmxvY2tfdAlsb2NrOwkJLyogU2VyaWFsaXppbmcgbG9jayAqLworfTsKKworDAorI2RlZmluZSBSWF9TVEFUVVMgKGlvYWRkciArIDB4MDYpCisjZGVmaW5lIFJYX0NNRAkgIFJYX1NUQVRVUworI2RlZmluZSBUWF9TVEFUVVMgKGlvYWRkciArIDB4MDcpCisjZGVmaW5lIFRYX0NNRAkgIFRYX1NUQVRVUworI2RlZmluZSBHUF9MT1cgCSAgKGlvYWRkciArIDB4MDgpCisjZGVmaW5lIEdQX0hJR0ggICAoaW9hZGRyICsgMHgwOSkKKyNkZWZpbmUgUlhfQlVGX0NMUiAoaW9hZGRyICsgMHgwQSkKKyNkZWZpbmUgUlhfTE9XCSAgKGlvYWRkciArIDB4MEEpCisjZGVmaW5lIFJYX0hJR0ggICAoaW9hZGRyICsgMHgwQikKKyNkZWZpbmUgU0FQUk9NCSAgKGlvYWRkciArIDB4MEMpCisjZGVmaW5lIEFYX1NUQVRVUyAoaW9hZGRyICsgMHgwRSkKKyNkZWZpbmUgQVhfQ01ECSAgQVhfU1RBVFVTCisjZGVmaW5lIERBVEFQT1JUICAoaW9hZGRyICsgMHgwRikKKyNkZWZpbmUgVFhfUkRZIDB4MDgJCS8qIEluIFRYX1NUQVRVUyAqLworCisjZGVmaW5lIEVMMV9EQVRBUFRSCTB4MDgKKyNkZWZpbmUgRUwxX1JYUFRSCTB4MEEKKyNkZWZpbmUgRUwxX1NBUFJPTQkweDBDCisjZGVmaW5lIEVMMV9EQVRBUE9SVCAJMHgwZgorCisvKgorICoJV3JpdGVzIHRvIHRoZSBheCBjb21tYW5kIHJlZ2lzdGVyLgorICovCisKKyNkZWZpbmUgQVhfT0ZGCTB4MDAJCQkvKiBJcnEgb2ZmLCBidWZmZXIgYWNjZXNzIG9uICovCisjZGVmaW5lIEFYX1NZUyAgMHg0MAkJCS8qIExvYWQgdGhlIGJ1ZmZlciAqLworI2RlZmluZSBBWF9YTUlUIDB4NDQJCQkvKiBUcmFuc21pdCBhIHBhY2tldCAqLworI2RlZmluZSBBWF9SWAkweDQ4CQkJLyogUmVjZWl2ZSBhIHBhY2tldCAqLworI2RlZmluZSBBWF9MT09QCTB4MEMJCQkvKiBMb29wYmFjayBtb2RlICovCisjZGVmaW5lIEFYX1JFU0VUIDB4ODAKKworLyoKKyAqCU5vcm1hbCByZWNlaXZlIG1vZGUgd3JpdHRlbiB0byBSWF9TVEFUVVMuICBXZSBtdXN0IGludHIgb24gc2hvcnQgcGFja2V0cworICoJdG8gYXZvaWQgYm9ndXMgcnggbG9ja3Vwcy4KKyAqLworCisjZGVmaW5lIFJYX05PUk0gMHhBOAkJLyogMHg2OCA9PSBhbGwgYWRkcnMsIDB4QTggb25seSB0byBtZS4gKi8KKyNkZWZpbmUgUlhfUFJPTSAweDY4CQkvKiBTZW5pb3IgUHJvbSwgdWhtbSBwcm9taXNjdW91cyBtb2RlLiAqLworI2RlZmluZSBSWF9NVUxUIDB4RTgJCS8qIEFjY2VwdCBtdWx0aWNhc3QgcGFja2V0cy4gKi8KKyNkZWZpbmUgVFhfTk9STSAweDBBCQkvKiBJbnRlcnJ1cHQgb24gZXZlcnl0aGluZyB0aGF0IG1pZ2h0IGhhbmcgdGhlIGNoaXAgKi8KKworLyoKKyAqCVRYX1NUQVRVUyByZWdpc3Rlci4KKyAqLworCisjZGVmaW5lIFRYX0NPTExJU0lPTiAweDAyCisjZGVmaW5lIFRYXzE2Q09MTElTSU9OUyAweDA0CisjZGVmaW5lIFRYX1JFQURZIDB4MDgKKworI2RlZmluZSBSWF9SVU5UIDB4MDgKKyNkZWZpbmUgUlhfTUlTU0VEIDB4MDEJCS8qIE1pc3NlZCBhIHBhY2tldCBkdWUgdG8gM2M1MDEgYnJhaW5kYW1hZ2UuICovCisjZGVmaW5lIFJYX0dPT0QJMHgzMAkJLyogR29vZCBwYWNrZXQgMHgyMCwgb3Igc2ltcGxlIG92ZXJmbG93IDB4MTAuICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTAzLmMgYi9kcml2ZXJzL25ldC8zYzUwMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZGZkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC8zYzUwMy5jCkBAIC0wLDAgKzEsNzQ3IEBACisvKiAzYzUwMy5jOiBBIHNoYXJlZC1tZW1vcnkgTlM4MzkwIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguICovCisvKgorICAgIFdyaXR0ZW4gMTk5Mi05NCBieSBEb25hbGQgQmVja2VyLgorCisgICAgQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZAorICAgIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisgICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisKKyAgICBUaGlzIGRyaXZlciBzaG91bGQgd29yayB3aXRoIHRoZSAzYzUwMyBhbmQgM2M1MDMvMTYuICBJdCBzaG91bGQgYmUgdXNlZAorICAgIGluIHNoYXJlZCBtZW1vcnkgbW9kZSBmb3IgYmVzdCBwZXJmb3JtYW5jZSwgYWx0aG91Z2ggaXQgbWF5IGFsc28gd29yaworICAgIGluIHByb2dyYW1tZWQtSS9PIG1vZGUuCisKKyAgICBTb3VyY2VzOgorICAgIEV0aGVyTGluayBJSSBUZWNobmljYWwgUmVmZXJlbmNlIE1hbnVhbCwKKyAgICBFdGhlckxpbmsgSUkvMTYgVGVjaG5pY2FsIFJlZmVyZW5jZSBNYW51YWwgU3VwcGxlbWVudCwKKyAgICAzQ29tIENvcnBvcmF0aW9uLCA1NDAwIEJheWZyb250IFBsYXphLCBTYW50YSBDbGFyYSBDQSA5NTA1Mi04MTQ1CisKKyAgICBUaGUgQ3J5bndyIDNjNTAzIHBhY2tldCBkcml2ZXIuCisKKyAgICBDaGFuZ2Vsb2c6CisKKyAgICBQYXVsIEdvcnRtYWtlcgk6IGFkZCBzdXBwb3J0IGZvciB0aGUgMm5kIDhrQiBvZiBSQU0gb24gMTYgYml0IGNhcmRzLgorICAgIFBhdWwgR29ydG1ha2VyCTogbXVsdGlwbGUgY2FyZCBzdXBwb3J0IGZvciBtb2R1bGUgdXNlcnMuCisgICAgcmpvaG5zb25AYW5hbG9naWMuY29tIDogRml4IHVwIFBJTyBpbnRlcmZhY2UgZm9yIGVmZmljaWVudCBvcGVyYXRpb24uCisgICAgSmVmZiBHYXJ6aWsJCTogZXRodG9vbCBzdXBwb3J0CisKKyovCisKKyNkZWZpbmUgRFJWX05BTUUJIjNjNTAzIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4xMGEiCisjZGVmaW5lIERSVl9SRUxEQVRFCSIxMS8xNy8yMDAxIgorCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisgICAgRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiICBEb25hbGQgQmVja2VyIChiZWNrZXJAc2N5bGQuY29tKVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisjaW5jbHVkZSAiM2M1MDMuaCIKKyNkZWZpbmUgV1JEX0NPVU5UIDQKKworc3RhdGljIGludCBlbDJfcGlvX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlbDJfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworCisvKiBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIEkvTyBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkIGluIFBJTyBtb2RlLiAqLworc3RhdGljIHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9CisJeyAweDMwMCwweDMxMCwweDMzMCwweDM1MCwweDI1MCwweDI4MCwweDJhMCwweDJlMCwwfTsKKworI2RlZmluZSBFTDJfSU9fRVhURU5UCTE2CisKK3N0YXRpYyBpbnQgZWwyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsMl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVsMl9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWwyX2luaXRfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVsMl9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIGVsMl9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgZWwyX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJIGludCByaW5nX3BhZ2UpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CisKKwwKKy8qIFRoaXMgcm91dGluZSBwcm9iZXMgZm9yIGEgbWVtb3J5LW1hcHBlZCAzYzUwMyBib2FyZCBieSBsb29raW5nIGZvcgorICAgdGhlICJsb2NhdGlvbiByZWdpc3RlciIgYXQgdGhlIGVuZCBvZiB0aGUganVtcGVyZWQgYm9vdCBQUk9NIHNwYWNlLgorICAgVGhpcyB3b3JrcyBldmVuIGlmIGEgUFJPTSBpc24ndCB0aGVyZS4KKworICAgSWYgdGhlIGV0aGVyY2FyZCBpc24ndCBmb3VuZCB0aGVyZSBpcyBhbiBvcHRpb25hbCBwcm9iZSBmb3IKKyAgIGV0aGVyY2FyZCBqdW1wZXJlZCB0byBwcm9ncmFtbWVkLUkvTyBtb2RlLgorICAgKi8KK3N0YXRpYyBpbnQgX19pbml0IGRvX2VsMl9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGludCAqYWRkciwgYWRkcnNbXSA9IHsgMHhkZGZmZSwgMHhkOWZmZSwgMHhjZGZmZSwgMHhjOWZmZSwgMH07CisgICAgaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpcnEgPSBkZXYtPmlycTsKKworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICAKKyAgICBpZiAoYmFzZV9hZGRyID4gMHgxZmYpCS8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwlyZXR1cm4gZWwyX3Byb2JlMShkZXYsIGJhc2VfYWRkcik7CisgICAgZWxzZSBpZiAoYmFzZV9hZGRyICE9IDApCQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJcmV0dXJuIC1FTlhJTzsKKworICAgIGZvciAoYWRkciA9IGFkZHJzOyAqYWRkcjsgYWRkcisrKSB7CisJdm9pZCBfX2lvbWVtICpwID0gaW9yZW1hcCgqYWRkciwgMSk7CisJdW5zaWduZWQgYmFzZV9iaXRzOworCWludCBpOworCisJaWYgKCFwKQorCQljb250aW51ZTsKKwliYXNlX2JpdHMgPSByZWFkYihwKTsKKwlpb3VubWFwKHApOworCWkgPSBmZnMoYmFzZV9iaXRzKSAtIDE7CisJaWYgKGkgPT0gLTEgfHwgYmFzZV9iaXRzICE9ICgxIDw8IGkpKQorCSAgICBjb250aW51ZTsKKwlpZiAoZWwyX3Byb2JlMShkZXYsIG5ldGNhcmRfcG9ydGxpc3RbaV0pID09IDApCisJICAgIHJldHVybiAwOworCWRldi0+aXJxID0gaXJxOworICAgIH0KKyNpZiAhIGRlZmluZWQobm9fcHJvYmVfbm9uc2hhcmVkX21lbW9yeSkKKyAgICByZXR1cm4gZWwyX3Bpb19wcm9iZShkZXYpOworI2Vsc2UKKyAgICByZXR1cm4gLUVOT0RFVjsKKyNlbmRpZgorfQorCisvKiAgVHJ5IGFsbCBvZiB0aGUgbG9jYXRpb25zIHRoYXQgYXJlbid0IG9idmlvdXNseSBlbXB0eS4gIFRoaXMgdG91Y2hlcworICAgIGEgbG90IG9mIGxvY2F0aW9ucywgYW5kIGlzIG11Y2ggcmlza2llciB0aGFuIHRoZSBjb2RlIGFib3ZlLiAqLworc3RhdGljIGludCBfX2luaXQgCitlbDJfcGlvX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaW50IGk7CisgICAgaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpcnEgPSBkZXYtPmlycTsKKworICAgIGlmIChiYXNlX2FkZHIgPiAweDFmZikJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCXJldHVybiBlbDJfcHJvYmUxKGRldiwgYmFzZV9hZGRyKTsKKyAgICBlbHNlIGlmIChiYXNlX2FkZHIgIT0gMCkJLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCXJldHVybiAtRU5YSU87CisKKyAgICBmb3IgKGkgPSAwOyBuZXRjYXJkX3BvcnRsaXN0W2ldOyBpKyspIHsKKwlpZiAoZWwyX3Byb2JlMShkZXYsIG5ldGNhcmRfcG9ydGxpc3RbaV0pID09IDApCisJICAgIHJldHVybiAwOworCWRldi0+aXJxID0gaXJxOworICAgIH0KKworICAgIHJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBOQjogZWwyX2Nsb3NlKCkgaGFuZGxlcyBmcmVlX2lycSAqLworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFTDJfSU9fRVhURU5UKTsKKwlpZiAoZWlfc3RhdHVzLm1lbSkKKwkJaW91bm1hcChlaV9zdGF0dXMubWVtKTsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGVsMl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gZG9fZWwyX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCisvKiBQcm9iZSBmb3IgdGhlIEV0aGVybGluayBJSSBjYXJkIGF0IEkvTyBwb3J0IGJhc2UgSU9BRERSLAorICAgcmV0dXJuaW5nIG5vbi16ZXJvIG9uIHN1Y2Nlc3MuICBJZiBmb3VuZCwgc2V0IHRoZSBzdGF0aW9uCisgICBhZGRyZXNzIGFuZCBtZW1vcnkgcGFyYW1ldGVycyBpbiBERVZJQ0UuICovCitzdGF0aWMgaW50IF9faW5pdCAKK2VsMl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKyAgICBpbnQgaSwgaW9iYXNlX3JlZywgbWVtYmFzZV9yZWcsIHNhdmVkXzQwNiwgd29yZGxlbmd0aCwgcmV0dmFsOworICAgIHN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisgICAgdW5zaWduZWQgbG9uZyB2ZW5kb3JfaWQ7CisKKyAgICBpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgRUwyX0lPX0VYVEVOVCwgRFJWX05BTUUpKQorCXJldHVybiAtRUJVU1k7CisKKyAgICBpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciArIDB4NDAwLCA4LCBEUlZfTkFNRSkpIHsKKwlyZXR2YWwgPSAtRUJVU1k7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgLyogUmVzZXQgYW5kL29yIGF2b2lkIGFueSBsdXJraW5nIE5FMjAwMCAqLworICAgIGlmIChpbmIoaW9hZGRyICsgMHg0MDgpID09IDB4ZmYpIHsKKyAgICAJbWRlbGF5KDEpOworCXJldHZhbCA9IC1FTk9ERVY7CisJZ290byBvdXQxOworICAgIH0KKworICAgIC8qIFdlIHZlcmlmeSB0aGF0IGl0J3MgYSAzQzUwMyBib2FyZCBieSBjaGVja2luZyB0aGUgZmlyc3QgdGhyZWUgb2N0ZXRzCisgICAgICAgb2YgaXRzIGV0aGVybmV0IGFkZHJlc3MuICovCisgICAgaW9iYXNlX3JlZyA9IGluYihpb2FkZHIrMHg0MDMpOworICAgIG1lbWJhc2VfcmVnID0gaW5iKGlvYWRkcisweDQwNCk7CisgICAgLyogQVNJQyBsb2NhdGlvbiByZWdpc3RlcnMgc2hvdWxkIGJlIDAgb3IgaGF2ZSBvbmx5IGEgc2luZ2xlIGJpdCBzZXQuICovCisgICAgaWYgKCAgIChpb2Jhc2VfcmVnICAmIChpb2Jhc2VfcmVnIC0gMSkpCisJfHwgKG1lbWJhc2VfcmVnICYgKG1lbWJhc2VfcmVnIC0gMSkpKSB7CisJcmV0dmFsID0gLUVOT0RFVjsKKwlnb3RvIG91dDE7CisgICAgfQorICAgIHNhdmVkXzQwNiA9IGluYl9wKGlvYWRkciArIDB4NDA2KTsKKyAgICBvdXRiX3AoRUNOVFJMX1JFU0VUfEVDTlRSTF9USElOLCBpb2FkZHIgKyAweDQwNik7IC8qIFJlc2V0IGl0Li4uICovCisgICAgb3V0Yl9wKEVDTlRSTF9USElOLCBpb2FkZHIgKyAweDQwNik7CisgICAgLyogTWFwIHRoZSBzdGF0aW9uIGFkZHIgUFJPTSBpbnRvIHRoZSBsb3dlciBJL08gcG9ydHMuIFdlIG5vdyBjaGVjaworICAgICAgIGZvciBib3RoIHRoZSBvbGQgYW5kIG5ldyAzQ29tIHByZWZpeCAqLworICAgIG91dGIoRUNOVFJMX1NBUFJPTXxFQ05UUkxfVEhJTiwgaW9hZGRyICsgMHg0MDYpOworICAgIHZlbmRvcl9pZCA9IGluYihpb2FkZHIpKjB4MTAwMDAgKyBpbmIoaW9hZGRyICsgMSkqMHgxMDAgKyBpbmIoaW9hZGRyICsgMik7CisgICAgaWYgKCh2ZW5kb3JfaWQgIT0gT0xEXzNDT01fSUQpICYmICh2ZW5kb3JfaWQgIT0gTkVXXzNDT01fSUQpKSB7CisJLyogUmVzdG9yZSB0aGUgcmVnaXN0ZXIgd2UgZnJvYmJlZC4gKi8KKwlvdXRiKHNhdmVkXzQwNiwgaW9hZGRyICsgMHg0MDYpOworCXJldHZhbCA9IC1FTk9ERVY7CisJZ290byBvdXQxOworICAgIH0KKworICAgIGlmIChlaV9kZWJ1ZyAgJiYgIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJcHJpbnRrKHZlcnNpb24pOworCisgICAgZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKyAgICBwcmludGsoIiVzOiAzYzUwMyBhdCBpL28gYmFzZSAlIzN4LCBub2RlICIsIGRldi0+bmFtZSwgaW9hZGRyKTsKKworICAgIC8qIFJldHJpZXZlIGFuZCBwcmludCB0aGUgZXRoZXJuZXQgYWRkcmVzcy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXByaW50aygiICUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSA9IGluYihpb2FkZHIgKyBpKSk7CisKKyAgICAvKiBNYXAgdGhlIDgzOTAgYmFjayBpbnRvIHRoZSB3aW5kb3cuICovCisgICAgb3V0YihFQ05UUkxfVEhJTiwgaW9hZGRyICsgMHg0MDYpOworCisgICAgLyogQ2hlY2sgZm9yIEVMMi8xNiBhcyBkZXNjcmliZWQgaW4gdGVjaC4gbWFuLiAqLworICAgIG91dGJfcChFODM5MF9QQUdFMCwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKyAgICBvdXRiX3AoMCwgaW9hZGRyICsgRU4wX0RDRkcpOworICAgIG91dGJfcChFODM5MF9QQUdFMiwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKyAgICB3b3JkbGVuZ3RoID0gaW5iX3AoaW9hZGRyICsgRU4wX0RDRkcpICYgRU5EQ0ZHX1dUUzsKKyAgICBvdXRiX3AoRTgzOTBfUEFHRTAsIGlvYWRkciArIEU4MzkwX0NNRCk7CisKKyAgICAvKiBQcm9iZSBmb3IsIHR1cm4gb24gYW5kIGNsZWFyIHRoZSBib2FyZCdzIHNoYXJlZCBtZW1vcnkuICovCisgICAgaWYgKGVpX2RlYnVnID4gMikgcHJpbnRrKCIgbWVtb3J5IGp1bXBlcnMgJTIuMnggIiwgbWVtYmFzZV9yZWcpOworICAgIG91dGIoRUdBQ0ZSX05PUk0sIGlvYWRkciArIDB4NDA1KTsJLyogRW5hYmxlIFJBTSAqLworCisgICAgLyogVGhpcyBzaG91bGQgYmUgcHJvYmVkIGZvciAob3Igc2V0IHZpYSBhbiBpb2N0bCgpKSBhdCBydW4tdGltZS4KKyAgICAgICBSaWdodCBub3cgd2UgdXNlIGEgc2xlYXp5IGhhY2sgdG8gcGFzcyBpbiB0aGUgaW50ZXJmYWNlIG51bWJlcgorICAgICAgIGF0IGJvb3QtdGltZSB2aWEgdGhlIGxvdyBiaXRzIG9mIHRoZSBtZW1fZW5kIGZpZWxkLiAgVGhhdCB2YWx1ZSBpcworICAgICAgIHVudXNlZCwgYW5kIHRoZSBsb3cgYml0cyB3b3VsZCBiZSBkaXNjYXJkZWQgZXZlbiBpZiBpdCB3YXMgdXNlZC4gKi8KKyNpZiBkZWZpbmVkKEVJODM5MF9USElDSykgfHwgZGVmaW5lZChFTDJfQVVJKQorICAgIGVpX3N0YXR1cy5pbnRlcmZhY2VfbnVtID0gMTsKKyNlbHNlCisgICAgZWlfc3RhdHVzLmludGVyZmFjZV9udW0gPSBkZXYtPm1lbV9lbmQgJiAweGY7CisjZW5kaWYKKyAgICBwcmludGsoIiwgdXNpbmcgJXN0ZXJuYWwgeGN2ci5cbiIsIGVpX3N0YXR1cy5pbnRlcmZhY2VfbnVtID09IDAgPyAiaW4iIDogImV4Iik7CisKKyAgICBpZiAoKG1lbWJhc2VfcmVnICYgMHhmMCkgPT0gMCkgeworCWRldi0+bWVtX3N0YXJ0ID0gMDsKKwllaV9zdGF0dXMubmFtZSA9ICIzYzUwMy1QSU8iOworCWVpX3N0YXR1cy5tZW0gPSBOVUxMOworICAgIH0gZWxzZSB7CisJZGV2LT5tZW1fc3RhcnQgPSAoKG1lbWJhc2VfcmVnICYgMHhjMCkgPyAweEQ4MDAwIDogMHhDODAwMCkgKworCSAgICAoKG1lbWJhc2VfcmVnICYgMHhBMCkgPyAweDQwMDAgOiAwKTsKKyNkZWZpbmUgRUwyX01FTVNJWkUgKEVMMl9NQjFfU1RPUF9QRyAtIEVMMl9NQjFfU1RBUlRfUEcpKjI1NgorCWVpX3N0YXR1cy5tZW0gPSBpb3JlbWFwKGRldi0+bWVtX3N0YXJ0LCBFTDJfTUVNU0laRSk7CisKKyNpZmRlZiBFTDJNRU1URVNUCisJLyogVGhpcyBoYXMgbmV2ZXIgZm91bmQgYW4gZXJyb3IsIGJ1dCBzb21lb25lIG1pZ2h0IGNhcmUuCisJICAgTm90ZSB0aGF0IGl0IG9ubHkgdGVzdHMgdGhlIDJuZCA4a0Igb24gMTZrQiAzYzUwMy8xNgorCSAgIGNhcmRzIGJldHdlZW4gY2FyZCBhZGRyLiAweDIwMDAgYW5kIDB4M2ZmZi4gKi8KKwl7CQkJLyogQ2hlY2sgdGhlIGNhcmQncyBtZW1vcnkuICovCisJICAgIHZvaWQgX19pb21lbSAqbWVtX2Jhc2UgPSBlaV9zdGF0dXMubWVtOworCSAgICB1bnNpZ25lZCBpbnQgdGVzdF92YWwgPSAweGJiYWRmMDBkOworCSAgICB3cml0ZWwoMHhiYTVlYmE1ZSwgbWVtX2Jhc2UpOworCSAgICBmb3IgKGkgPSBzaXplb2YodGVzdF92YWwpOyBpIDwgRUwyX01FTVNJWkU7IGkrPXNpemVvZih0ZXN0X3ZhbCkpIHsKKwkJd3JpdGVsKHRlc3RfdmFsLCBtZW1fYmFzZSArIGkpOworCQlpZiAocmVhZGwobWVtX2Jhc2UpICE9IDB4YmE1ZWJhNWUKKwkJICAgIHx8IHJlYWRsKG1lbV9iYXNlICsgaSkgIT0gdGVzdF92YWwpIHsKKwkJICAgIHByaW50aygiM2M1MDM6IG1lbW9yeSBmYWlsdXJlIG9yIG1lbW9yeSBhZGRyZXNzIGNvbmZsaWN0LlxuIik7CisJCSAgICBkZXYtPm1lbV9zdGFydCA9IDA7CisJCSAgICBlaV9zdGF0dXMubmFtZSA9ICIzYzUwMy1QSU8iOworCQkgICAgaW91bm1hcChtZW1fYmFzZSk7CisJCSAgICBlaV9zdGF0dXMubWVtID0gTlVMTDsKKwkJICAgIGJyZWFrOworCQl9CisJCXRlc3RfdmFsICs9IDB4NTU1NTU1NTU7CisJCXdyaXRlbCgwLCBtZW1fYmFzZSArIGkpOworCSAgICB9CisJfQorI2VuZGlmICAvKiBFTDJNRU1URVNUICovCisKKwlpZiAoZGV2LT5tZW1fc3RhcnQpCisJCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgRUwyX01FTVNJWkU7CisKKwlpZiAod29yZGxlbmd0aCkgewkvKiBObyBUeCBwYWdlcyB0byBza2lwIG92ZXIgdG8gZ2V0IHRvIFJ4ICovCisJCWVpX3N0YXR1cy5wcml2ID0gMDsKKwkJZWlfc3RhdHVzLm5hbWUgPSAiM2M1MDMvMTYiOworCX0gZWxzZSB7CisJCWVpX3N0YXR1cy5wcml2ID0gVFhfUEFHRVMgKiAyNTY7CisJCWVpX3N0YXR1cy5uYW1lID0gIjNjNTAzIjsKKwl9CisgICAgfQorCisgICAgLyoKKwlEaXZpZGUgdXAgdGhlIG1lbW9yeSBvbiB0aGUgY2FyZC4gVGhpcyBpcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mCisJd2hldGhlciBzaGFyZWQtbWVtIG9yIFBJTyBpcyB1c2VkLiBGb3IgMTYgYml0IGNhcmRzICgxNmtCIFJBTSksCisJd2UgdXNlIHRoZSBlbnRpcmUgOGsgb2YgYmFuazEgZm9yIGFuIFJ4IHJpbmcuIFdlIG9ubHkgdXNlIDNrCisJb2YgdGhlIGJhbmswIGZvciAyIGZ1bGwgc2l6ZSBUeCBwYWNrZXQgc2xvdHMuIEZvciA4IGJpdCBjYXJkcywKKwkoOGtCIFJBTSkgd2UgdXNlIDNrQiBvZiBiYW5rMSBmb3IgdHdvIFR4IHNsb3RzLCBhbmQgdGhlIHJlbWFpbmluZworCTVrQiBmb3IgYW4gUnggcmluZy4gICovCisKKyAgICBpZiAod29yZGxlbmd0aCkgeworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gRUwyX01CMF9TVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IEVMMl9NQjFfU1RBUlRfUEc7CisgICAgfSBlbHNlIHsKKwllaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA9IEVMMl9NQjFfU1RBUlRfUEc7CisJZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBFTDJfTUIxX1NUQVJUX1BHICsgVFhfUEFHRVM7CisgICAgfQorCisgICAgLyogRmluaXNoIHNldHRpbmcgdGhlIGJvYXJkJ3MgcGFyYW1ldGVycy4gKi8KKyAgICBlaV9zdGF0dXMuc3RvcF9wYWdlID0gRUwyX01CMV9TVE9QX1BHOworICAgIGVpX3N0YXR1cy53b3JkMTYgPSB3b3JkbGVuZ3RoOworICAgIGVpX3N0YXR1cy5yZXNldF84MzkwID0gJmVsMl9yZXNldF84MzkwOworICAgIGVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmZWwyX2dldF84MzkwX2hkcjsKKyAgICBlaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmZWwyX2Jsb2NrX2lucHV0OworICAgIGVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmZWwyX2Jsb2NrX291dHB1dDsKKworICAgIGlmIChkZXYtPmlycSA9PSAyKQorCWRldi0+aXJxID0gOTsKKyAgICBlbHNlIGlmIChkZXYtPmlycSA+IDUgJiYgZGV2LT5pcnEgIT0gOSkgeworCXByaW50aygiM2M1MDM6IGNvbmZpZ3VyZWQgaW50ZXJydXB0ICVkIGludmFsaWQsIHdpbGwgdXNlIGF1dG9JUlEuXG4iLAorCSAgICAgICBkZXYtPmlycSk7CisJZGV2LT5pcnEgPSAwOworICAgIH0KKworICAgIGVpX3N0YXR1cy5zYXZlZF9pcnEgPSBkZXYtPmlycTsKKworICAgIGRldi0+b3BlbiA9ICZlbDJfb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmZWwyX2Nsb3NlOworICAgIGRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisgICAgZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworI2VuZGlmCisKKyAgICBpZiAoZGV2LT5tZW1fc3RhcnQpCisJcHJpbnRrKCIlczogJXMgLSAlZGtCIFJBTSwgOGtCIHNoYXJlZCBtZW0gd2luZG93IGF0ICUjNmx4LSUjNmx4LlxuIiwKKwkJZGV2LT5uYW1lLCBlaV9zdGF0dXMubmFtZSwgKHdvcmRsZW5ndGgrMSk8PDMsCisJCWRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQtMSk7CisKKyAgICBlbHNlCisgICAgeworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gRUwyX01CMV9TVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IEVMMl9NQjFfU1RBUlRfUEcgKyBUWF9QQUdFUzsKKwlwcmludGsoIlxuJXM6ICVzLCAlZGtCIFJBTSwgdXNpbmcgcHJvZ3JhbW1lZCBJL08gKFJFSlVNUEVSIGZvciBTSEFSRUQgTUVNT1JZKS5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgZWlfc3RhdHVzLm5hbWUsICh3b3JkbGVuZ3RoKzEpPDwzKTsKKyAgICB9CisgICAgcmVsZWFzZV9yZWdpb24oaW9hZGRyICsgMHg0MDAsIDgpOworICAgIHJldHVybiAwOworb3V0MToKKyAgICByZWxlYXNlX3JlZ2lvbihpb2FkZHIgKyAweDQwMCwgOCk7CitvdXQ6CisgICAgcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBFTDJfSU9fRVhURU5UKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorDAorc3RhdGljIGludAorZWwyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpbnQgcmV0dmFsID0gLUVBR0FJTjsKKworICAgIGlmIChkZXYtPmlycSA8IDIpIHsKKwlpbnQgaXJxbGlzdFtdID0gezUsIDksIDMsIDQsIDB9OworCWludCAqaXJxcCA9IGlycWxpc3Q7CisKKwlvdXRiKEVHQUNGUl9OT1JNLCBFMzNHX0dBQ0ZSKTsJLyogRW5hYmxlIFJBTSBhbmQgaW50ZXJydXB0cy4gKi8KKwlkbyB7CisJICAgIGlmIChyZXF1ZXN0X2lycSAoKmlycXAsIE5VTEwsIDAsICJib2d1cyIsIGRldikgIT0gLUVCVVNZKSB7CisJCS8qIFR3aW5rbGUgdGhlIGludGVycnVwdCwgYW5kIGNoZWNrIGlmIGl0J3Mgc2Vlbi4gKi8KKwkJdW5zaWduZWQgbG9uZyBjb29raWUgPSBwcm9iZV9pcnFfb24oKTsKKwkJb3V0Yl9wKDB4MDQgPDwgKCgqaXJxcCA9PSA5KSA/IDIgOiAqaXJxcCksIEUzM0dfSURDRlIpOworCQlvdXRiX3AoMHgwMCwgRTMzR19JRENGUik7CisJCWlmICgqaXJxcCA9PSBwcm9iZV9pcnFfb2ZmKGNvb2tpZSkJLyogSXQncyBhIGdvb2QgSVJRIGxpbmUhICovCisJCSAgICAmJiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxID0gKmlycXAsIAorCQkgICAgZWlfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldikpID09IDApKQorCQkgICAgYnJlYWs7CisJICAgIH0KKwl9IHdoaWxlICgqKytpcnFwKTsKKwlpZiAoKmlycXAgPT0gMCkgeworCSAgICBvdXRiKEVHQUNGUl9JUlFPRkYsIEUzM0dfR0FDRlIpOwkvKiBkaXNhYmxlIGludGVycnVwdHMuICovCisJICAgIHJldHVybiByZXR2YWw7CisJfQorICAgIH0gZWxzZSB7CisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldikpKSB7CisJICAgIHJldHVybiByZXR2YWw7CisJfQorICAgIH0KKworICAgIGVsMl9pbml0X2NhcmQoZGV2KTsKKyAgICBlaV9vcGVuKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VsMl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworICAgIGRldi0+aXJxID0gZWlfc3RhdHVzLnNhdmVkX2lycTsKKyAgICBvdXRiKEVHQUNGUl9JUlFPRkYsIEUzM0dfR0FDRlIpOwkvKiBkaXNhYmxlIGludGVycnVwdHMuICovCisKKyAgICBlaV9jbG9zZShkZXYpOworICAgIHJldHVybiAwOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciB3ZSBoYXZlIGEgdW5yZWNvdmVyYWJsZSBmYWlsdXJlOgorICAgICAgIHRyYW5zbWl0IHRpbWVvdXQKKyAgICAgICBCYWQgcmluZyBidWZmZXIgcGFja2V0IGhlYWRlcgorICovCitzdGF0aWMgdm9pZAorZWwyX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpZiAoZWlfZGVidWcgPiAxKSB7CisJcHJpbnRrKCIlczogUmVzZXR0aW5nIHRoZSAzYzUwMyBib2FyZC4uLiIsIGRldi0+bmFtZSk7CisJcHJpbnRrKCIlI2x4PSUjMDJ4ICUjbHg9JSMwMnggJSNseD0lIzAyeC4uLiIsIEUzM0dfSURDRlIsIGluYihFMzNHX0lEQ0ZSKSwKKwkgICAgICAgRTMzR19DTlRSTCwgaW5iKEUzM0dfQ05UUkwpLCBFMzNHX0dBQ0ZSLCBpbmIoRTMzR19HQUNGUikpOworICAgIH0KKyAgICBvdXRiX3AoRUNOVFJMX1JFU0VUfEVDTlRSTF9USElOLCBFMzNHX0NOVFJMKTsKKyAgICBlaV9zdGF0dXMudHhpbmcgPSAwOworICAgIG91dGJfcChlaV9zdGF0dXMuaW50ZXJmYWNlX251bT09MCA/IEVDTlRSTF9USElOIDogRUNOVFJMX0FVSSwgRTMzR19DTlRSTCk7CisgICAgZWwyX2luaXRfY2FyZChkZXYpOworICAgIGlmIChlaV9kZWJ1ZyA+IDEpIHByaW50aygiZG9uZVxuIik7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIDNjNTAzIEdBIHJlZ2lzdGVycyBhZnRlciBhIHJlc2V0LiAqLworc3RhdGljIHZvaWQKK2VsMl9pbml0X2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAvKiBVbm1hcCB0aGUgc3RhdGlvbiBQUk9NIGFuZCBzZWxlY3QgdGhlIERJWCBvciBCTkMgY29ubmVjdG9yLiAqLworICAgIG91dGJfcChlaV9zdGF0dXMuaW50ZXJmYWNlX251bT09MCA/IEVDTlRSTF9USElOIDogRUNOVFJMX0FVSSwgRTMzR19DTlRSTCk7CisKKyAgICAvKiBTZXQgQVNJQyBjb3B5IG9mIHJ4J3MgZmlyc3QgYW5kIGxhc3QrMSBidWZmZXIgcGFnZXMgKi8KKyAgICAvKiBUaGVzZSBtdXN0IGJlIHRoZSBzYW1lIGFzIGluIHRoZSA4MzkwLiAqLworICAgIG91dGIoZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UsIEUzM0dfU1RBUlRQRyk7CisgICAgb3V0YihlaV9zdGF0dXMuc3RvcF9wYWdlLCAgRTMzR19TVE9QUEcpOworCisgICAgLyogUG9pbnQgdGhlIHZlY3RvciBwb2ludGVyIHJlZ2lzdGVycyBzb21ld2hlcmUgP2hhcm1sZXNzPy4gKi8KKyAgICBvdXRiKDB4ZmYsIEUzM0dfVlAyKTsJLyogUG9pbnQgYXQgdGhlIFJPTSByZXN0YXJ0IGxvY2F0aW9uIDB4ZmZmZjAgKi8KKyAgICBvdXRiKDB4ZmYsIEUzM0dfVlAxKTsKKyAgICBvdXRiKDB4MDAsIEUzM0dfVlAwKTsKKyAgICAvKiBUdXJuIG9mZiBhbGwgaW50ZXJydXB0cyB1bnRpbCB3ZSdyZSBvcGVuZWQuICovCisgICAgb3V0Yl9wKDB4MDAsICBkZXYtPmJhc2VfYWRkciArIEVOMF9JTVIpOworICAgIC8qIEVuYWJsZSBJUlFzIGlmZiBzdGFydGVkLiAqLworICAgIG91dGIoRUdBQ0ZSX05PUk0sIEUzM0dfR0FDRlIpOworCisgICAgLyogU2V0IHRoZSBpbnRlcnJ1cHQgbGluZS4gKi8KKyAgICBvdXRiX3AoKDB4MDQgPDwgKGRldi0+aXJxID09IDkgPyAyIDogZGV2LT5pcnEpKSwgRTMzR19JRENGUik7CisgICAgb3V0Yl9wKChXUkRfQ09VTlQgPDwgMSksIEUzM0dfRFJRQ05UKTsJLyogU2V0IGJ1cnN0IHNpemUgdG8gOCAqLworICAgIG91dGJfcCgweDIwLCBFMzNHX0RNQUFIKTsJLyogUHV0IGEgdmFsaWQgYWRkciBpbiB0aGUgR0EgRE1BICovCisgICAgb3V0Yl9wKDB4MDAsIEUzM0dfRE1BQUwpOworICAgIHJldHVybjsJCQkvKiBXZSBhbHdheXMgc3VjY2VlZCAqLworfQorCisvKgorICogRWl0aGVyIHVzZSB0aGUgc2hhcmVkIG1lbW9yeSAoaWYgZW5hYmxlZCBvbiB0aGUgYm9hcmQpIG9yIHB1dCB0aGUgcGFja2V0CisgKiBvdXQgdGhyb3VnaCB0aGUgQVNJQyBGSUZPLgorICovCitzdGF0aWMgdm9pZAorZWwyX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKQoreworICAgIHVuc2lnbmVkIHNob3J0IGludCAqd3JkOworICAgIGludCBib2d1c2NvdW50OwkJLyogdGltZW91dCBjb3VudGVyICovCisgICAgdW5zaWduZWQgc2hvcnQgd29yZDsJLyogdGVtcG9yYXJ5IGZvciBiZXR0ZXIgbWFjaGluZSBjb2RlICovCisgICAgdm9pZCBfX2lvbWVtICpiYXNlID0gZWlfc3RhdHVzLm1lbTsKKworICAgIGlmIChlaV9zdGF0dXMud29yZDE2KSAgICAgIC8qIFR4IHBhY2tldHMgZ28gaW50byBiYW5rIDAgb24gRUwyLzE2IGNhcmQgKi8KKwlvdXRiKEVHQUNGUl9SU0VMfEVHQUNGUl9UQ00sIEUzM0dfR0FDRlIpOworICAgIGVsc2UKKwlvdXRiKEVHQUNGUl9OT1JNLCBFMzNHX0dBQ0ZSKTsKKworICAgIGlmIChiYXNlKSB7CS8qIFNoYXJlZCBtZW1vcnkgdHJhbnNmZXIgKi8KKwltZW1jcHlfdG9pbyhiYXNlICsgKChzdGFydF9wYWdlIC0gZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UpIDw8IDgpLAorCQkJYnVmLCBjb3VudCk7CisJb3V0YihFR0FDRlJfTk9STSwgRTMzR19HQUNGUik7CS8qIEJhY2sgdG8gYmFuazEgaW4gY2FzZSBvbiBiYW5rMCAqLworCXJldHVybjsKKyAgICB9CisKKy8qCisgKiAgTm8gc2hhcmVkIG1lbW9yeSwgcHV0IHRoZSBwYWNrZXQgb3V0IHRoZSBvdGhlciB3YXkuCisgKiAgU2V0IHVwIHRoZW4gc3RhcnQgdGhlIGludGVybmFsIG1lbW9yeSB0cmFuc2ZlciB0byBUeCBTdGFydCBQYWdlCisgKi8KKworICAgIHdvcmQgPSAodW5zaWduZWQgc2hvcnQpc3RhcnRfcGFnZTsKKyAgICBvdXRiKHdvcmQmMHhGRiwgRTMzR19ETUFBSCk7CisgICAgb3V0Yih3b3JkPj44LCBFMzNHX0RNQUFMKTsKKworICAgIG91dGJfcCgoZWlfc3RhdHVzLmludGVyZmFjZV9udW0gPyBFQ05UUkxfQVVJIDogRUNOVFJMX1RISU4gKSB8IEVDTlRSTF9PVVRQVVQKKwkgICB8IEVDTlRSTF9TVEFSVCwgRTMzR19DTlRSTCk7CisKKy8qCisgKiAgSGVyZSBJIGFtIGdvaW5nIHRvIHdyaXRlIGRhdGEgdG8gdGhlIEZJRk8gYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4KKyAqICBOb3RlIHRoYXQgRTMzR19GSUZPSCBpcyBkZWZpbmVkIGluY29ycmVjdGx5LiBJdCBpcyByZWFsbHkKKyAqICBFMzNHX0ZJRk9MLCB0aGUgbG93ZXN0IHBvcnQgYWRkcmVzcyBmb3IgYm90aCB0aGUgYnl0ZSBhbmQKKyAqICB3b3JkIHdyaXRlLiBWYXJpYWJsZSAnY291bnQnIGlzIE5PVCBjaGVja2VkLiBDYWxsZXIgbXVzdCBzdXBwbHkgYQorICogIHZhbGlkIGNvdW50LiBOb3RlIHRoYXQgSSBtYXkgd3JpdGUgYSBoYXJtbGVzcyBleHRyYSBieXRlIHRvIHRoZQorICogIDgzOTAgaWYgdGhlIGJ5dGUtY291bnQgd2FzIG5vdCBldmVuLgorICovCisgICAgd3JkID0gKHVuc2lnbmVkIHNob3J0IGludCAqKSBidWY7CisgICAgY291bnQgID0gKGNvdW50ICsgMSkgPj4gMTsKKyAgICBmb3IoOzspCisgICAgeworICAgICAgICBib2d1c2NvdW50ID0gMHgxMDAwOworICAgICAgICB3aGlsZSAoKGluYihFMzNHX1NUQVRVUykgJiBFU1RBVF9EUFJEWSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIWJvZ3VzY291bnQtLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIiVzOiBGSUZPIGJsb2NrZWQgaW4gZWwyX2Jsb2NrX291dHB1dC5cbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgZWwyX3Jlc2V0XzgzOTAoZGV2KTsKKyAgICAgICAgICAgICAgICBnb3RvIGJsb2NrZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoY291bnQgPiBXUkRfQ09VTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHN3KEUzM0dfRklGT0gsIHdyZCwgV1JEX0NPVU5UKTsKKyAgICAgICAgICAgIHdyZCAgICs9IFdSRF9DT1VOVDsKKyAgICAgICAgICAgIGNvdW50IC09IFdSRF9DT1VOVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHN3KEUzM0dfRklGT0gsIHdyZCwgY291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgYmxvY2tlZDo7CisgICAgb3V0Yl9wKGVpX3N0YXR1cy5pbnRlcmZhY2VfbnVtPT0wID8gRUNOVFJMX1RISU4gOiBFQ05UUkxfQVVJLCBFMzNHX0NOVFJMKTsKKyAgICByZXR1cm47Cit9CisKKy8qIFJlYWQgdGhlIDQgYnl0ZSwgcGFnZSBhbGlnbmVkIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiAqLworc3RhdGljIHZvaWQKK2VsMl9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKyAgICBpbnQgYm9ndXNjb3VudDsKKyAgICB2b2lkIF9faW9tZW0gKmJhc2UgPSBlaV9zdGF0dXMubWVtOworICAgIHVuc2lnbmVkIHNob3J0IHdvcmQ7CisKKyAgICBpZiAoYmFzZSkgeyAgICAgICAvKiBVc2UgdGhlIHNoYXJlZCBtZW1vcnkuICovCisJdm9pZCBfX2lvbWVtICpoZHJfc3RhcnQgPSBiYXNlICsgKChyaW5nX3BhZ2UgLSBFTDJfTUIxX1NUQVJUX1BHKTw8OCk7CisJbWVtY3B5X2Zyb21pbyhoZHIsIGhkcl9zdGFydCwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSk7CisJaGRyLT5jb3VudCA9IGxlMTZfdG9fY3B1KGhkci0+Y291bnQpOworCXJldHVybjsKKyAgICB9CisKKy8qCisgKiAgTm8gc2hhcmVkIG1lbW9yeSwgdXNlIHByb2dyYW1tZWQgSS9PLgorICovCisKKyAgICB3b3JkID0gKHVuc2lnbmVkIHNob3J0KXJpbmdfcGFnZTsKKyAgICBvdXRiKHdvcmQmMHhGRiwgRTMzR19ETUFBSCk7CisgICAgb3V0Yih3b3JkPj44LCBFMzNHX0RNQUFMKTsKKworICAgIG91dGJfcCgoZWlfc3RhdHVzLmludGVyZmFjZV9udW0gPT0gMCA/IEVDTlRSTF9USElOIDogRUNOVFJMX0FVSSkgfCBFQ05UUkxfSU5QVVQKKwkgICB8IEVDTlRSTF9TVEFSVCwgRTMzR19DTlRSTCk7CisgICAgYm9ndXNjb3VudCA9IDB4MTAwMDsKKyAgICB3aGlsZSAoKGluYihFMzNHX1NUQVRVUykgJiBFU1RBVF9EUFJEWSkgPT0gMCkKKyAgICB7CisgICAgICAgIGlmKCFib2d1c2NvdW50LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiJXM6IEZJRk8gYmxvY2tlZCBpbiBlbDJfZ2V0XzgzOTBfaGRyLlxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgIG1lbXNldChoZHIsIDB4MDAsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworICAgICAgICAgICAgZWwyX3Jlc2V0XzgzOTAoZGV2KTsKKyAgICAgICAgICAgIGdvdG8gYmxvY2tlZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbnN3KEUzM0dfRklGT0gsIGhkciwgKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpPj4gMSk7CisgICAgYmxvY2tlZDo7CisgICAgb3V0Yl9wKGVpX3N0YXR1cy5pbnRlcmZhY2VfbnVtID09IDAgPyBFQ05UUkxfVEhJTiA6IEVDTlRSTF9BVUksIEUzM0dfQ05UUkwpOworfQorCisKK3N0YXRpYyB2b2lkCitlbDJfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisgICAgaW50IGJvZ3VzY291bnQgPSAwOworICAgIHZvaWQgX19pb21lbSAqYmFzZSA9IGVpX3N0YXR1cy5tZW07CisgICAgdW5zaWduZWQgc2hvcnQgaW50ICpidWY7CisgICAgdW5zaWduZWQgc2hvcnQgd29yZDsKKworICAgIC8qIE1heWJlIGVuYWJsZSBzaGFyZWQgbWVtb3J5IGp1c3QgYmUgdG8gYmUgc2FmZS4uLiBuYWhoLiovCisgICAgaWYgKGJhc2UpIHsJLyogVXNlIHRoZSBzaGFyZWQgbWVtb3J5LiAqLworCXJpbmdfb2Zmc2V0IC09IChFTDJfTUIxX1NUQVJUX1BHPDw4KTsKKwlpZiAocmluZ19vZmZzZXQgKyBjb3VudCA+IEVMMl9NRU1TSVpFKSB7CisJICAgIC8qIFdlIG11c3Qgd3JhcCB0aGUgaW5wdXQgbW92ZS4gKi8KKwkgICAgaW50IHNlbWlfY291bnQgPSBFTDJfTUVNU0laRSAtIHJpbmdfb2Zmc2V0OworCSAgICBtZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgYmFzZSArIHJpbmdfb2Zmc2V0LCBzZW1pX2NvdW50KTsKKwkgICAgY291bnQgLT0gc2VtaV9jb3VudDsKKwkgICAgbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEgKyBzZW1pX2NvdW50LCBiYXNlICsgZWlfc3RhdHVzLnByaXYsIGNvdW50KTsKKwl9IGVsc2UgeworCQkvKiBQYWNrZXQgaXMgaW4gb25lIGNodW5rIC0tIHdlIGNhbiBjb3B5ICsgY2tzdW0uICovCisJCWV0aF9pb19jb3B5X2FuZF9zdW0oc2tiLCBiYXNlICsgcmluZ19vZmZzZXQsIGNvdW50LCAwKTsKKwl9CisJcmV0dXJuOworICAgIH0KKworLyoKKyAqICBObyBzaGFyZWQgbWVtb3J5LCB1c2UgcHJvZ3JhbW1lZCBJL08uCisgKi8KKyAgICB3b3JkID0gKHVuc2lnbmVkIHNob3J0KSByaW5nX29mZnNldDsKKyAgICBvdXRiKHdvcmQ+PjgsIEUzM0dfRE1BQUgpOworICAgIG91dGIod29yZCYweEZGLCBFMzNHX0RNQUFMKTsKKworICAgIG91dGJfcCgoZWlfc3RhdHVzLmludGVyZmFjZV9udW0gPT0gMCA/IEVDTlRSTF9USElOIDogRUNOVFJMX0FVSSkgfCBFQ05UUkxfSU5QVVQKKwkgICB8IEVDTlRSTF9TVEFSVCwgRTMzR19DTlRSTCk7CisKKy8qCisgKiAgSGVyZSBJIGFsc28gdHJ5IHRvIGdldCBkYXRhIGFzIGZhc3QgYXMgcG9zc2libGUuIEkgYW0gYmV0dGluZyB0aGF0IEkKKyAqICBjYW4gcmVhZCBvbmUgZXh0cmEgYnl0ZSB3aXRob3V0IGNsb2JiZXJpbmcgYW55dGhpbmcgaW4gdGhlIGtlcm5lbCBiZWNhdXNlCisgKiAgdGhpcyB3b3VsZCBvbmx5IG9jY3VyIG9uIGFuIG9kZCBieXRlLWNvdW50IGFuZCBhbGxvY2F0aW9uIG9mIHNrYi0+ZGF0YQorICogIGlzIHdvcmQtYWxpZ25lZC4gVmFyaWFibGUgJ2NvdW50JyBpcyBOT1QgY2hlY2tlZC4gQ2FsbGVyIG11c3QgY2hlY2sKKyAqICBmb3IgYSB2YWxpZCBjb3VudC4KKyAqICBbVGhpcyBpcyBjdXJyZW50bHkgcXVpdGUgc2FmZS4uLi4gYnV0IGlmIG9uZSBkYXkgdGhlIDNjNTAzIGV4cGxvZGVzCisgKiAgIHlvdSBrbm93IHdoZXJlIHRvIGNvbWUgbG9va2luZyA7KV0KKyAqLworCisgICAgYnVmID0gICh1bnNpZ25lZCBzaG9ydCBpbnQgKikgc2tiLT5kYXRhOworICAgIGNvdW50ID0gIChjb3VudCArIDEpID4+IDE7CisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgYm9ndXNjb3VudCA9IDB4MTAwMDsKKyAgICAgICAgd2hpbGUgKChpbmIoRTMzR19TVEFUVVMpICYgRVNUQVRfRFBSRFkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCFib2d1c2NvdW50LS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCIlczogRklGTyBibG9ja2VkIGluIGVsMl9ibG9ja19pbnB1dC5cbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgZWwyX3Jlc2V0XzgzOTAoZGV2KTsKKyAgICAgICAgICAgICAgICBnb3RvIGJsb2NrZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoY291bnQgPiBXUkRfQ09VTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluc3coRTMzR19GSUZPSCwgYnVmLCBXUkRfQ09VTlQpOworICAgICAgICAgICAgYnVmICAgKz0gV1JEX0NPVU5UOworICAgICAgICAgICAgY291bnQgLT0gV1JEX0NPVU5UOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW5zdyhFMzNHX0ZJRk9ILCBidWYsIGNvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGJsb2NrZWQ6OworICAgIG91dGJfcChlaV9zdGF0dXMuaW50ZXJmYWNlX251bSA9PSAwID8gRUNOVFJMX1RISU4gOiBFQ05UUkxfQVVJLCBFMzNHX0NOVFJMKTsKKyAgICByZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiSVNBIDB4JWx4IiwgZGV2LT5iYXNlX2FkZHIpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorfTsKKworI2lmZGVmIE1PRFVMRQorI2RlZmluZSBNQVhfRUwyX0NBUkRTCTQJLyogTWF4IG51bWJlciBvZiBFTDIgY2FyZHMgcGVyIG1vZHVsZSAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9lbDJbTUFYX0VMMl9DQVJEU107CitzdGF0aWMgaW50IGlvW01BWF9FTDJfQ0FSRFNdOworc3RhdGljIGludCBpcnFbTUFYX0VMMl9DQVJEU107CitzdGF0aWMgaW50IHhjdnJbTUFYX0VMMl9DQVJEU107CS8qIGNob29zZSBpbnQuIG9yIGV4dC4geGN2ciAqLworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh4Y3ZyLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBudW1iZXIocykgKGFzc2lnbmVkKSIpOworTU9EVUxFX1BBUk1fREVTQyh4Y3ZyLCAidHJhbnNjZWl2ZXIocykgKDA9aW50ZXJuYWwsIDE9ZXh0ZXJuYWwpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjNDb20gSVNBIEV0aGVyTGluayBJSSwgSUkvMTYgKDNjNTAzLCAzYzUwMy8xNikgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFRoaXMgaXMgc2V0IHVwIHNvIHRoYXQgb25seSBhIHNpbmdsZSBhdXRvcHJvYmUgdGFrZXMgcGxhY2UgcGVyIGNhbGwuCitJU0EgZGV2aWNlIGF1dG9wcm9iZXMgb24gYSBydW5uaW5nIG1hY2hpbmUgYXJlIG5vdCByZWNvbW1lbmRlZC4gKi8KK2ludAoraW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0VMMl9DQVJEUzsgdGhpc19kZXYrKykgeworCQlpZiAoaW9bdGhpc19kZXZdID09IDApICB7CisJCQlpZiAodGhpc19kZXYgIT0gMCkgYnJlYWs7IC8qIG9ubHkgYXV0b3Byb2JlIDFzdCBvbmUgKi8KKwkJCXByaW50ayhLRVJOX05PVElDRSAiM2M1MDMuYzogUHJlc2VudGx5IGF1dG9wcm9iaW5nIChub3QgcmVjb21tZW5kZWQpIGZvciBhIHNpbmdsZSBjYXJkLlxuIik7CisJCX0KKwkJZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CisJCWRldi0+bWVtX2VuZCA9IHhjdnJbdGhpc19kZXZdOwkvKiBsb3cgNGJpdHMgPSB4Y3ZyIHNlbC4gKi8KKwkJaWYgKGRvX2VsMl9wcm9iZShkZXYpID09IDApIHsKKwkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7CisJCQkJZGV2X2VsMltmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjNjNTAzLmM6IE5vIDNjNTAzIGNhcmQgZm91bmQgKGkvbyA9IDB4JXgpLlxuIiwgaW9bdGhpc19kZXZdKTsKKwkJYnJlYWs7CisJfQorCWlmIChmb3VuZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FTlhJTzsKK30KKwordm9pZAorY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXY7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfRUwyX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZWwyW3RoaXNfZGV2XTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTAzLmggYi9kcml2ZXJzL25ldC8zYzUwMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjhhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC8zYzUwMy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qIERlZmluaXRpb25zIGZvciB0aGUgM0NvbSAzYzUwMyBFdGhlcmxpbmsgMi4gKi8KKy8qIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR1BMLgorICAgTWFueSBvZiB0aGVzZSBuYW1lcyBhbmQgY29tbWVudHMgYXJlIGRpcmVjdGx5IGZyb20gdGhlIENyeW53ciBwYWNrZXQKKyAgIGRyaXZlcnMsIHdoaWNoIGFyZSByZWxlYXNlZCB1bmRlciB0aGUgR1BMLiAqLworCisjZGVmaW5lIEVMMkggKGRldi0+YmFzZV9hZGRyICsgMHg0MDApCisjZGVmaW5lIEVMMkwgKGRldi0+YmFzZV9hZGRyKQorCisvKiBWZW5kb3IgdW5pcXVlIGhhcmR3YXJlIGFkZHIuIHByZWZpeC4gM0NvbSBoYXMgMiBiZWNhdXNlIHRoZXkgcmFuCisgICBvdXQgb2YgYXZhaWxhYmxlIGFkZHJlc3NlcyBvbiB0aGUgZmlyc3Qgb25lLi4uICovCisKKyNkZWZpbmUgT0xEXzNDT01fSUQJMHgwMjYwOGMKKyNkZWZpbmUgTkVXXzNDT01fSUQJMHgwMDIwYWYKKworLyogU2hhcmVkIG1lbW9yeSBtYW5hZ2VtZW50IHBhcmFtZXRlcnMuIE5COiBUaGUgOCBiaXQgY2FyZHMgaGF2ZSBvbmx5CisgICBvbmUgYmFuayAoTUIxKSB3aGljaCBzZXJ2ZXMgYm90aCBUeCBhbmQgUnggcGFja2V0IHNwYWNlLiBUaGUgMTZiaXQKKyAgIGNhcmRzIGhhdmUgMiBiYW5rcywgTUIwIGZvciBUeCBwYWNrZXRzLCBhbmQgTUIxIGZvciBSeCBwYWNrZXRzLiAKKyAgIFlvdSBjaG9vc2Ugd2hpY2ggYmFuayBhcHBlYXJzIGluIHRoZSBzaC4gbWVtIHdpbmRvdyB3aXRoIEVHQUNGUl9NQlNuICovCisKKyNkZWZpbmUgRUwyX01CMF9TVEFSVF9QRwkoMHgwMCkJLyogRUwyLzE2IFR4IHBhY2tldHMgZ28gaW4gYmFuayAwICovCisjZGVmaW5lIEVMMl9NQjFfU1RBUlRfUEcJKDB4MjApCS8qIEZpcnN0IHBhZ2Ugb2YgYmFuayAxICovCisjZGVmaW5lIEVMMl9NQjFfU1RPUF9QRwkJKDB4NDApCS8qIExhc3QgcGFnZSArMSBvZiBiYW5rIDEgKi8KKworLyogM0NvbSAzYzUwMyBBU0lDIHJlZ2lzdGVycyAqLworI2RlZmluZSBFMzNHX1NUQVJUUEcJKEVMMkgrMCkJLyogU3RhcnQgcGFnZSwgbWF0Y2hpbmcgRU4wX1NUQVJUUEcgKi8KKyNkZWZpbmUgRTMzR19TVE9QUEcJKEVMMkgrMSkJLyogU3RvcCBwYWdlLCBtdXN0IG1hdGNoIEVOMF9TVE9QUEcgKi8KKyNkZWZpbmUgRTMzR19EUlFDTlQJKEVMMkgrMikJLyogRE1BIGJ1cnN0IGNvdW50ICovCisjZGVmaW5lIEUzM0dfSU9CQVNFCShFTDJIKzMpCS8qIFJlYWQgb2YgSS9PIGJhc2UganVtcGVycy4gKi8KKwkvKiAobm9uLXVzZWZ1bCwgYnV0IGl0IGFsc28gYXBwZWFycyBhdCB0aGUgZW5kIG9mIEVQUk9NIHNwYWNlKSAqLworI2RlZmluZSBFMzNHX1JPTUJBU0UJKEVMMkgrNCkJLyogUmVhZCBvZiBtZW1vcnkgYmFzZSBqdW1wZXJzLiAqLworI2RlZmluZSBFMzNHX0dBQ0ZSCShFTDJIKzUpCS8qIENvbmZpZy9zZXR1cCBiaXRzIGZvciB0aGUgQVNJQyBHQSAqLworI2RlZmluZSBFMzNHX0NOVFJMCShFTDJIKzYpCS8qIEJvYXJkJ3MgbWFpbiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEUzM0dfU1RBVFVTCShFTDJIKzcpCS8qIFN0YXR1cyBvbiBjb21wbGV0aW9ucy4gKi8KKyNkZWZpbmUgRTMzR19JRENGUgkoRUwySCs4KQkvKiBJbnRlcnJ1cHQvRE1BIGNvbmZpZyByZWdpc3RlciAqLworCQkJCS8qIChXaGljaCBJUlEgdG8gYXNzZXJ0LCBETUEgY2hhbiB0byB1c2UpICovCisjZGVmaW5lIEUzM0dfRE1BQUgJKEVMMkgrOSkJLyogSGlnaCBieXRlIG9mIERNQSBhZGRyZXNzIHJlZyAqLworI2RlZmluZSBFMzNHX0RNQUFMCShFTDJIKzEwKQkvKiBMb3cgYnl0ZSBvZiBETUEgYWRkcmVzcyByZWcgKi8KKy8qICJWZWN0b3IgcG9pbnRlciIgLSBpZiB0aGlzIGFkZHJlc3MgbWF0Y2hlcyBhIHJlYWQsIHRoZSBFUFJPTSAocmF0aGVyIHRoYW4KKyAgIHNoYXJlZCBSQU0pIGlzIG1hcHBlZCBpbnRvIG1lbW9yeSBzcGFjZS4gKi8KKyNkZWZpbmUgRTMzR19WUDIJKEVMMkgrMTEpCisjZGVmaW5lIEUzM0dfVlAxCShFTDJIKzEyKQorI2RlZmluZSBFMzNHX1ZQMAkoRUwySCsxMykKKyNkZWZpbmUgRTMzR19GSUZPSAkoRUwySCsxNCkJLyogRklGTyBmb3IgcHJvZ3JhbW1lZCBJL08gbW92ZXMgKi8KKyNkZWZpbmUgRTMzR19GSUZPTAkoRUwySCsxNSkJLyogLi4uIGxvdyBieXRlIG9mIGFib3ZlLiAqLworCisvKiBCaXRzIGluIEUzM0dfQ05UUkwgcmVnaXN0ZXI6ICovCisKKyNkZWZpbmUgRUNOVFJMX1JFU0VUCSgweDAxKQkvKiBTb2Z0d2FyZSByZXNldCBvZiB0aGUgQVNJQyBhbmQgODM5MCAqLworI2RlZmluZSBFQ05UUkxfVEhJTgkoMHgwMikJLyogT25ib2FyZCB4Y3ZyIGVuYWJsZSwgQVVJIGRpc2FibGUgKi8KKyNkZWZpbmUgRUNOVFJMX0FVSQkoMHgwMCkJLyogT25ib2FyZCB4Y3ZyIGRpc2FibGUsIEFVSSBlbmFibGUgKi8KKyNkZWZpbmUgRUNOVFJMX1NBUFJPTQkoMHgwNCkJLyogTWFwIHRoZSBzdGF0aW9uIGFkZHJlc3MgcHJvbSAqLworI2RlZmluZSBFQ05UUkxfREJMQkZSCSgweDIwKQkvKiBGSUZPIGNvbmZpZ3VyYXRpb24gYml0ICovCisjZGVmaW5lIEVDTlRSTF9PVVRQVVQJKDB4NDApCS8qIFBDLXRvLTNDNTAzIGRpcmVjdGlvbiBpZiAxICovCisjZGVmaW5lIEVDTlRSTF9JTlBVVAkoMHgwMCkJLyogM0M1MDMtdG8tUEMgZGlyZWN0aW9uIGlmIDAgKi8KKyNkZWZpbmUgRUNOVFJMX1NUQVJUCSgweDgwKQkvKiBTdGFydCB0aGUgRE1BIGxvZ2ljICovCisKKy8qIEJpdHMgaW4gRTMzR19TVEFUVVMgcmVnaXN0ZXI6ICovCisKKyNkZWZpbmUgRVNUQVRfRFBSRFkJKDB4ODApCS8qIERhdGEgcG9ydCAob2YgRklGTykgcmVhZHkgKi8KKyNkZWZpbmUgRVNUQVRfVUZMVwkoMHg0MCkJLyogVHJpZWQgdG8gcmVhZCBGSUZPIHdoZW4gaXQgd2FzIGVtcHR5ICovCisjZGVmaW5lIEVTVEFUX09GTFcJKDB4MjApCS8qIFRyaWVkIHRvIHdyaXRlIEZJRk8gd2hlbiBpdCB3YXMgZnVsbCAqLworI2RlZmluZSBFU1RBVF9EVEMJKDB4MTApCS8qIFRlcm1pbmFsIENvdW50IGZyb20gUEMgYnVzIERNQSBsb2dpYyAqLworI2RlZmluZSBFU1RBVF9ESVAJKDB4MDgpCS8qIERNQSBJbiBQcm9ncmVzcyAqLworCisvKiBCaXRzIGluIEUzM0dfR0FDRlIgcmVnaXN0ZXI6ICovCisKKyNkZWZpbmUgRUdBQ0ZSX05JTQkoMHg4MCkJLyogTklDIGludGVycnVwdCBtYXNrICovCisjZGVmaW5lIEVHQUNGUl9UQ00JKDB4NDApCS8qIERNQSB0ZXJtLiBjb3VudCBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSBFR0FDRlJfUlNFTAkoMHgwOCkJLyogTWFwIGEgYmFuayBvZiBjYXJkIG1lbSBpbnRvIHN5c3RlbSBtZW0gKi8KKyNkZWZpbmUgRUdBQ0ZSX01CUzIJKDB4MDQpCS8qIE1lbW9yeSBiYW5rIHNlbGVjdCwgYml0IDIuICovCisjZGVmaW5lIEVHQUNGUl9NQlMxCSgweDAyKQkvKiBNZW1vcnkgYmFuayBzZWxlY3QsIGJpdCAxLiAqLworI2RlZmluZSBFR0FDRlJfTUJTMAkoMHgwMSkJLyogTWVtb3J5IGJhbmsgc2VsZWN0LCBiaXQgMC4gKi8KKworI2RlZmluZSBFR0FDRlJfTk9STQkoMHg0OSkJLyogVENNIHwgUlNFTCB8IE1CUzAgKi8KKyNkZWZpbmUgRUdBQ0ZSX0lSUU9GRgkoMHhjOSkJLyogVENNIHwgUlNFTCB8IE1CUzAgfCBOSU0gKi8KKworLyoKKwlNQlMyCU1CUzEJTUJTMAlTaC4gbWVtIHdpbmRvd3MgY2FyZCBtZW0gYXQ6CisJLS0tLQktLS0tCS0tLS0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkwCTAJMAkweDAwMDAgLS0gYmFuayAwCisJMAkwCTEJMHgyMDAwIC0tIGJhbmsgMSAob25seSBjaG9pY2UgZm9yIDhiaXQgY2FyZCkKKwkwCTEJMAkweDQwMDAgLS0gYmFuayAyLCBub3QgdXNlZAorCTAJMQkxCTB4NjAwMCAtLSBiYW5rIDMsIG5vdCB1c2VkCisKK1RoZXJlIHdhcyBnb2luZyB0byBiZSBhIDMyayBjYXJkIHRoYXQgdXNlZCBiYW5rIDIgYW5kIDMsIGJ1dCBpdCAKK25ldmVyIGdvdCBwcm9kdWNlZC4KKworKi8KKworCisvKiBFbmQgb2YgM0M1MDMgcGFyYW1ldGVyIGRlZmluaXRpb25zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwNS5jIGIvZHJpdmVycy9uZXQvM2M1MDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmZhOGNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvM2M1MDUuYwpAQCAtMCwwICsxLDE2OTAgQEAKKy8qCisgKiBMaW51eCBFdGhlcm5ldCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgM0NvbSBFdGhlcmxpbmsgUGx1cyAoM0M1MDUpCisgKiAgICAgIEJ5IENyYWlnIFNvdXRoZXJlbiwgSnVoYSBMYWlobyBhbmQgUGhpbGlwIEJsdW5kZWxsCisgKgorICogM2M1MDUuYyAgICAgIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgYW4gaW50ZXJmYWNlIHRvIHRoZSAzQ29tCisgKiAgICAgICAgICAgICAgRXRoZXJsaW5rIFBsdXMgKDNjNTA1KSBFdGhlcm5ldCBjYXJkLiBMaW51eCBkZXZpY2UKKyAqICAgICAgICAgICAgICBkcml2ZXIgaW50ZXJmYWNlIHJldmVyc2UgZW5naW5lZXJlZCBmcm9tIHRoZSBMaW51eCAzQzUwOQorICogICAgICAgICAgICAgIGRldmljZSBkcml2ZXJzLiBTb21lIDNDNTA1IGluZm9ybWF0aW9uIGdsZWFuZWQgZnJvbQorICogICAgICAgICAgICAgIHRoZSBDcnlud3IgcGFja2V0IGRyaXZlci4gU3RpbGwgdGhpcyBkcml2ZXIgd291bGQgbm90CisgKiAgICAgICAgICAgICAgYmUgaGVyZSB3aXRob3V0IDNDNTA1IHRlY2huaWNhbCByZWZlcmVuY2UgcHJvdmlkZWQgYnkKKyAqICAgICAgICAgICAgICAzQ29tLgorICoKKyAqICRJZDogM2M1MDUuYyx2IDEuMTAgMTk5Ni8wNC8xNiAxMzowNjoyNyBwaGlsIEV4cCAkCisgKgorICogQXV0aG9yczogICAgIExpbnV4IDNjNTA1IGRldmljZSBkcml2ZXIgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgIENyYWlnIFNvdXRoZXJlbiwgPGNyYWlnc0BpbmVsdWtpLmFwYW5hLm9yZy5hdT4KKyAqICAgICAgICAgICAgICBGaW5hbCBkZWJ1Z2dpbmcgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgIEFuZHJldyBUcmlkZ2VsbCwgPHRyaWRnZUBuaW1idXMuYW51LmVkdS5hdT4KKyAqICAgICAgICAgICAgICBBdXRvIGlycS9hZGRyZXNzLCB0dW5pbmcsIGNsZWFudXAgYW5kIHYxLjEuNCsga2VybmVsIG1vZHMgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgIEp1aGEgTGFpaG8sIDxqbGFpaG9AaWNoYW9zLm51bGxuZXQuZmk+CisgKiAgICAgICAgICAgICAgTGludXggM0M1MDkgZHJpdmVyIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICBEb25hbGQgQmVja2VyLCA8YmVja2VyQHN1cGVyLm9yZz4KKyAqCQkJKE5vdyBhdCA8YmVja2VyQHNjeWxkLmNvbT4pCisgKiAgICAgICAgICAgICAgQ3J5bndyIHBhY2tldCBkcml2ZXIgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgIEtyaXNobmFuIEdvcGFsYW4gYW5kIEdyZWdnIFN0ZWZhbmNpaywKKyAqICAgICAgICAgICAgICAgICAgICAgIENsZW1zb24gVW5pdmVyc2l0eSBFbmdpbmVlcmluZyBDb21wdXRlciBPcGVyYXRpb25zLgorICogICAgICAgICAgICAgICAgICAgICAgUG9ydGlvbnMgb2YgdGhlIGNvZGUgaGF2ZSBiZWVuIGFkYXB0ZWQgZnJvbSB0aGUgM2M1MDUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlciBmb3IgTkNTQSBUZWxuZXQgYnkgQnJ1Y2UgT3JjaGFyZCBhbmQgbGF0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIGJ5IFdhcnJlbiBWYW4gSG91dGVuIGFuZCBrcnVzQGRpa3UuZGsuCisgKiAgICAgICAgICAgICAgM0M1MDUgdGVjaG5pY2FsIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICBUZXJyeSBNdXJwaHksIG9mIDNDb20gTmV0d29yayBBZGFwdGVyIERpdmlzaW9uCisgKiAgICAgICAgICAgICAgTGludXggMS4zLjAgY2hhbmdlcyBieQorICogICAgICAgICAgICAgICAgICAgICAgQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KKyAqICAgICAgICAgICAgICBNb3JlIGRlYnVnZ2luZywgRE1BIHN1cHBvcnQsIGN1cnJlbnRseSBtYWludGFpbmVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CisgKiAgICAgICAgICAgICAgTXVsdGljYXJkL3NvZnQgY29uZmlndXJhYmxlIGRtYSBjaGFubmVsL3JldiAyIGhhcmR3YXJlIHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgIGJ5IENocmlzdG9waGVyIENvbGxpbnMgPGNjb2xsaW5zQHBjdWcub3JnLmF1PgorICoJCUV0aHRvb2wgc3VwcG9ydCAoamdhcnppayksIDExLzE3LzIwMDEKKyAqLworCisjZGVmaW5lIERSVl9OQU1FCSIzYzUwNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMTBhIgorCisKKy8qIFRoZW9yeSBvZiBvcGVyYXRpb246CisgKgorICogVGhlIDNjNTA1IGlzIHF1aXRlIGFuIGludGVsbGlnZW50IGJvYXJkLiAgQWxsIGNvbW11bmljYXRpb24gd2l0aCBpdCBpcyBkb25lCisgKiBieSBtZWFucyBvZiBQcmltYXJ5IENvbW1hbmQgQmxvY2tzIChQQ0JzKTsgdGhlc2UgYXJlIHRyYW5zZmVycmVkIHVzaW5nIFBJTworICogdGhyb3VnaCB0aGUgY29tbWFuZCByZWdpc3Rlci4gIFRoZSBjYXJkIGhhcyAyNTZrIG9mIG9uLWJvYXJkIFJBTSwgd2hpY2ggaXMKKyAqIHVzZWQgdG8gYnVmZmVyIHJlY2VpdmVkIHBhY2tldHMuICBJdCBtaWdodCBzZWVtIGF0IGZpcnN0IHRoYXQgbW9yZSBidWZmZXJzCisgKiBhcmUgYmV0dGVyLCBidXQgaW4gZmFjdCB0aGlzIGlzbid0IHRydWUuICBGcm9tIG15IHRlc3RzLCBpdCBzZWVtcyB0aGF0CisgKiBtb3JlIHRoYW4gYWJvdXQgMTAgYnVmZmVycyBhcmUgdW5uZWNlc3NhcnksIGFuZCB0aGVyZSBpcyBhIG5vdGljZWFibGUKKyAqIHBlcmZvcm1hbmNlIGhpdCBpbiBoYXZpbmcgbW9yZSBhY3RpdmUgb24gdGhlIGNhcmQuICBTbyB0aGUgbWFqb3JpdHkgb2YgdGhlCisgKiBjYXJkJ3MgbWVtb3J5IGlzbid0LCBpbiBmYWN0LCB1c2VkLiAgU2FkbHksIHRoZSBjYXJkIG9ubHkgaGFzIG9uZSB0cmFuc21pdAorICogYnVmZmVyIGFuZCwgc2hvcnQgb2YgbG9hZGluZyBvdXIgb3duIGZpcm13YXJlIGludG8gaXQgKHdoaWNoIGlzIHdoYXQgc29tZQorICogZHJpdmVycyByZXNvcnQgdG8pIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhpcy4KKyAqCisgKiBXZSBrZWVwIHVwIHRvIDQgInJlY2VpdmUgcGFja2V0IiBjb21tYW5kcyBhY3RpdmUgb24gdGhlIGJvYXJkIGF0IGEgdGltZS4KKyAqIFdoZW4gYSBwYWNrZXQgY29tZXMgaW4sIHNvIGxvbmcgYXMgdGhlcmUgaXMgYSByZWNlaXZlIGNvbW1hbmQgYWN0aXZlLCB0aGUKKyAqIGJvYXJkIHdpbGwgc2VuZCB1cyBhICJwYWNrZXQgcmVjZWl2ZWQiIFBDQiBhbmQgdGhlbiBhZGQgdGhlIGRhdGEgZm9yIHRoYXQKKyAqIHBhY2tldCB0byB0aGUgRE1BIHF1ZXVlLiAgSWYgYSBETUEgdHJhbnNmZXIgaXMgbm90IGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlCisgKiBzZXQgb25lIHVwIHRvIHN0YXJ0IHVwbG9hZGluZyB0aGUgZGF0YS4gIFdlIGhhdmUgdG8gbWFpbnRhaW4gYSBsaXN0IG9mCisgKiBiYWNrbG9nZ2VkIHJlY2VpdmUgcGFja2V0cywgYmVjYXVzZSB0aGUgY2FyZCBtYXkgZGVjaWRlIHRvIHRlbGwgdXMgYWJvdXQKKyAqIGEgbmV3bHktYXJyaXZlZCBwYWNrZXQgYXQgYW55IHRpbWUsIGFuZCB3ZSBtYXkgbm90IGJlIGFibGUgdG8gc3RhcnQgYSBETUEKKyAqIHRyYW5zZmVyIGltbWVkaWF0ZWx5IChpZSBvbmUgbWF5IGFscmVhZHkgYmUgZ29pbmcgb24pLiAgV2UgY2FuJ3QgTkFLIHRoZQorICogUENCLCBiZWNhdXNlIHRoZW4gaXQgd291bGQgdGhyb3cgdGhlIHBhY2tldCBhd2F5LgorICoKKyAqIFRyeWluZyB0byBzZW5kIGEgUENCIHRvIHRoZSBjYXJkIGF0IHRoZSB3cm9uZyBtb21lbnQgc2VlbXMgdG8gaGF2ZSBiYWQKKyAqIGVmZmVjdHMuICBJZiB3ZSBzZW5kIGl0IGEgdHJhbnNtaXQgUENCIHdoaWxlIGEgcmVjZWl2ZSBETUEgaXMgaGFwcGVuaW5nLAorICogaXQgd2lsbCBqdXN0IE5BSyB0aGUgUENCIGFuZCBzbyB3ZSB3aWxsIGhhdmUgd2FzdGVkIG91ciB0aW1lLiAgV29yc2UsIGl0CisgKiBzb21ldGltZXMgc2VlbXMgdG8gaW50ZXJydXB0IHRoZSB0cmFuc2Zlci4gIFRoZSBtYWpvcml0eSBvZiB0aGUgbG93LWxldmVsCisgKiBjb2RlIGlzIHByb3RlY3RlZCBieSBvbmUgaHVnZSBzZW1hcGhvcmUgLS0gImJ1c3kiIC0tIHdoaWNoIGlzIHNldCB3aGVuZXZlcgorICogaXQgcHJvYmFibHkgaXNuJ3Qgc2FmZSB0byBkbyBhbnl0aGluZyB0byB0aGUgY2FyZC4gIFRoZSByZWNlaXZlIHJvdXRpbmUKKyAqIG11c3QgZ2FpbiBhIGxvY2sgb24gImJ1c3kiIGJlZm9yZSBpdCBjYW4gc3RhcnQgYSBETUEgdHJhbnNmZXIsIGFuZCB0aGUKKyAqIHRyYW5zbWl0IHJvdXRpbmUgbXVzdCBnYWluIGEgbG9jayBiZWZvcmUgaXQgc2VuZHMgdGhlIGZpcnN0IFBDQiB0byB0aGUgY2FyZC4KKyAqIFRoZSBzZW5kX3BjYigpIHJvdXRpbmUgYWxzbyBoYXMgYW4gaW50ZXJuYWwgc2VtYXBob3JlIHRvIHByb3RlY3QgaXQgYWdhaW5zdAorICogYmVpbmcgcmUtZW50ZXJlZCAod2hpY2ggd291bGQgYmUgZGlzYXN0cm91cykgLS0gdGhpcyBpcyBuZWVkZWQgYmVjYXVzZQorICogc2V2ZXJhbCB0aGluZ3MgY2FuIGhhcHBlbiBhc3luY2hyb25vdXNseSAocmUtcHJpbWluZyB0aGUgcmVjZWl2ZXIgYW5kCisgKiBhc2tpbmcgdGhlIGNhcmQgZm9yIHN0YXRpc3RpY3MsIGZvciBleGFtcGxlKS4gIHNlbmRfcGNiKCkgd2lsbCBhbHNvIHJlZnVzZQorICogdG8gdGFsayB0byB0aGUgY2FyZCBhdCBhbGwgaWYgYSBETUEgdXBsb2FkIGlzIGhhcHBlbmluZy4gIFRoZSBoaWdoZXItbGV2ZWwKKyAqIG5ldHdvcmtpbmcgY29kZSB3aWxsIHJlc2NoZWR1bGUgYSBsYXRlciByZXRyeSBpZiBzb21lIHBhcnQgb2YgdGhlIGRyaXZlcgorICogaXMgYmxvY2tlZC4gIEluIHByYWN0aWNlLCB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBoYXBwZW4gdmVyeSBvZnRlbi4KKyAqLworCisvKiBUaGlzIGRyaXZlciBtYXkgbm93IHdvcmsgd2l0aCByZXZpc2lvbiAyLnggaGFyZHdhcmUsIHNpbmNlIGFsbCB0aGUgcmVhZAorICogb3BlcmF0aW9ucyBvbiB0aGUgSENSIGhhdmUgYmVlbiByZW1vdmVkICh3ZSBub3cga2VlcCBvdXIgb3duIHNvZnRjb3B5KS4KKyAqIEJ1dCBJIGRvbid0IGhhdmUgYW4gb2xkIGNhcmQgdG8gdGVzdCBpdCBvbi4KKyAqCisgKiBUaGlzIGhhcyBoYWQgdGhlIGJhZCBlZmZlY3QgdGhhdCB0aGUgYXV0b3Byb2JlIHJvdXRpbmUgaXMgbm93IGEgYml0CisgKiBsZXNzIGZyaWVuZGx5IHRvIG90aGVyIGRldmljZXMuICBIb3dldmVyLCBpdCB3YXMgbmV2ZXIgdmVyeSBnb29kLgorICogYmVmb3JlLCBzbyBJIGRvdWJ0IGl0IHdpbGwgaHVydCBhbnlib2R5LgorICovCisKKy8qIFRoZSBkcml2ZXIgaXMgYSBtZXNzLiAgSSB0b29rIENyYWlnJ3MgYW5kIEp1aGEncyBjb2RlLCBhbmQgaGFja2VkIGl0IGZpcnN0bHkKKyAqIHRvIG1ha2UgaXQgbW9yZSByZWxpYWJsZSwgYW5kIHNlY29uZGx5IHRvIGFkZCBETUEgbW9kZS4gIE1hbnkgdGhpbmdzIGNvdWxkCisgKiBwcm9iYWJseSBiZSBkb25lIGJldHRlcjsgdGhlIGNvbmN1cnJlbmN5IHByb3RlY3Rpb24gaXMgcGFydGljdWxhcmx5IGF3ZnVsLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSAiM2M1MDUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBkZWZpbmUgZGVidWcgbWVzc2FnZXMgaGVyZSBhcyBjb21tb24gc3RyaW5ncyB0byByZWR1Y2Ugc3BhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3QgY2hhciBmaWxlbmFtZVtdID0gX19GSUxFX187CisKK3N0YXRpYyBjb25zdCBjaGFyIHRpbWVvdXRfbXNnW10gPSAiKioqIHRpbWVvdXQgYXQgJXM6JXMgKGxpbmUgJWQpICoqKlxuIjsKKyNkZWZpbmUgVElNRU9VVF9NU0cobGluZW5vKSBcCisJcHJpbnRrKHRpbWVvdXRfbXNnLCBmaWxlbmFtZSxfX0ZVTkNUSU9OX18sKGxpbmVubykpCisKK3N0YXRpYyBjb25zdCBjaGFyIGludmFsaWRfcGNiX21zZ1tdID0KKyIqKiogaW52YWxpZCBwY2IgbGVuZ3RoICVkIGF0ICVzOiVzIChsaW5lICVkKSAqKipcbiI7CisjZGVmaW5lIElOVkFMSURfUENCX01TRyhsZW4pIFwKKwlwcmludGsoaW52YWxpZF9wY2JfbXNnLCAobGVuKSxmaWxlbmFtZSxfX0ZVTkNUSU9OX18sX19MSU5FX18pCisKK3N0YXRpYyBjaGFyIHNlYXJjaF9tc2dbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICIlczogTG9va2luZyBmb3IgM2M1MDUgYWRhcHRlciBhdCBhZGRyZXNzICUjeC4uLiI7CisKK3N0YXRpYyBjaGFyIHN0aWxsbG9va2luZ19tc2dbXSBfX2luaXRkYXRhID0gInN0aWxsIGxvb2tpbmcuLi4iOworCitzdGF0aWMgY2hhciBmb3VuZF9tc2dbXSBfX2luaXRkYXRhID0gImZvdW5kLlxuIjsKKworc3RhdGljIGNoYXIgbm90Zm91bmRfbXNnW10gX19pbml0ZGF0YSA9ICJub3QgZm91bmQgKHJlYXNvbiA9ICVkKVxuIjsKKworc3RhdGljIGNoYXIgY291bGRub3RfbXNnW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAiJXM6IDNjNTA1IG5vdCBmb3VuZFxuIjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICB2YXJpb3VzIG90aGVyIGRlYnVnIHN0dWZmCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIEVMUF9ERUJVRworc3RhdGljIGludCBlbHBfZGVidWcgPSBFTFBfREVCVUc7CisjZWxzZQorc3RhdGljIGludCBlbHBfZGVidWc7CisjZW5kaWYKKyNkZWZpbmUgZGVidWcgZWxwX2RlYnVnCisKKy8qCisgKiAgMCA9IG5vIG1lc3NhZ2VzICh3ZWxsLCBzb21lKQorICogIDEgPSBtZXNzYWdlcyB3aGVuIGhpZ2ggbGV2ZWwgY29tbWFuZHMgcGVyZm9ybWVkCisgKiAgMiA9IG1lc3NhZ2VzIHdoZW4gbG93IGxldmVsIGNvbW1hbmRzIHBlcmZvcm1lZAorICogIDMgPSBtZXNzYWdlcyB3aGVuIGludGVycnVwdHMgcmVjZWl2ZWQKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB1c2VmdWwgbWFjcm9zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCVRSVUUKKyNkZWZpbmUJVFJVRQkxCisjZW5kaWYKKworI2lmbmRlZglGQUxTRQorI2RlZmluZQlGQUxTRQkwCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBMaXN0IG9mIEkvTy1hZGRyZXNzZXMgd2UgdHJ5IHRvIGF1dG8tc2Vuc2UKKyAqIExhc3QgZWxlbWVudCBNVVNUIEJFIDAhCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgYWRkcl9saXN0W10gX19pbml0ZGF0YSA9IHsweDMwMCwgMHgyODAsIDB4MzEwLCAwfTsKKworLyogRG1hIE1lbW9yeSByZWxhdGVkIHN0dWZmICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRtYV9tZW1fYWxsb2MoaW50IHNpemUpCit7CisJaW50IG9yZGVyID0gZ2V0X29yZGVyKHNpemUpOworCXJldHVybiBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgb3JkZXIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZ1bmN0aW9ucyBmb3IgSS9PIChub3RlIHRoZSBpbmxpbmUgISkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBpbmJfc3RhdHVzKHVuc2lnbmVkIGludCBiYXNlX2FkZHIpCit7CisJcmV0dXJuIGluYihiYXNlX2FkZHIgKyBQT1JUX1NUQVRVUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGluYl9jb21tYW5kKHVuc2lnbmVkIGludCBiYXNlX2FkZHIpCit7CisJcmV0dXJuIGluYihiYXNlX2FkZHIgKyBQT1JUX0NPTU1BTkQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0Yl9jb250cm9sKHVuc2lnbmVkIGNoYXIgdmFsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW91dGIodmFsLCBkZXYtPmJhc2VfYWRkciArIFBPUlRfQ09OVFJPTCk7CisJKChlbHBfZGV2aWNlICopKGRldi0+cHJpdikpLT5oY3JfdmFsID0gdmFsOworfQorCisjZGVmaW5lIEhDUl9WQUwoeCkgICAoKChlbHBfZGV2aWNlICopKCh4KS0+cHJpdikpLT5oY3JfdmFsKQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0Yl9jb21tYW5kKHVuc2lnbmVkIGNoYXIgdmFsLCB1bnNpZ25lZCBpbnQgYmFzZV9hZGRyKQoreworCW91dGIodmFsLCBiYXNlX2FkZHIgKyBQT1JUX0NPTU1BTkQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiYWNrbG9nX25leHQodW5zaWduZWQgaW50IG4pCit7CisJcmV0dXJuIChuICsgMSkgJSBCQUNLTE9HX1NJWkU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICB1c2VmdWwgZnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgdGhlIGFkYXB0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiB1c2UgdGhpcyByb3V0aW5lIHdoZW4gYWNjZXNzaW5nIHRoZSBBU0YgYml0cyBhcyB0aGV5IGFyZQorICogY2hhbmdlZCBhc3luY2hyb25vdXNseSBieSB0aGUgYWRhcHRlcgorICovCisKKy8qIGdldCBhZGFwdGVyIFBDQiBzdGF0dXMgKi8KKyNkZWZpbmUJR0VUX0FTRihhZGRyKSBcCisJKGdldF9zdGF0dXMoYWRkcikmQVNGX1BDQl9NQVNLKQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfc3RhdHVzKHVuc2lnbmVkIGludCBiYXNlX2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIDEwKkhaLzEwMDsKKwlyZWdpc3RlciBpbnQgc3RhdDE7CisJZG8geworCQlzdGF0MSA9IGluYl9zdGF0dXMoYmFzZV9hZGRyKTsKKwl9IHdoaWxlIChzdGF0MSAhPSBpbmJfc3RhdHVzKGJhc2VfYWRkcikgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpOworCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKQorCQlUSU1FT1VUX01TRyhfX0xJTkVfXyk7CisJcmV0dXJuIHN0YXQxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2hzZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaHNmKQoreworCWVscF9kZXZpY2UgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJb3V0Yl9jb250cm9sKChIQ1JfVkFMKGRldikgJiB+SFNGX1BDQl9NQVNLKSB8IGhzZiwgZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnRfcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqLCBwY2Jfc3RydWN0ICopOworCitpbmxpbmUgc3RhdGljIHZvaWQgYWRhcHRlcl9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwllbHBfZGV2aWNlICphZGFwdGVyID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGNoYXIgb3JpZ19oY3IgPSBhZGFwdGVyLT5oY3JfdmFsOworCisJb3V0Yl9jb250cm9sKDAsIGRldik7CisKKwlpZiAoaW5iX3N0YXR1cyhkZXYtPmJhc2VfYWRkcikgJiBBQ1JGKSB7CisJCWRvIHsKKwkJCWluYl9jb21tYW5kKGRldi0+YmFzZV9hZGRyKTsKKwkJCXRpbWVvdXQgPSBqaWZmaWVzICsgMipIWi8xMDA7CisJCQl3aGlsZSAodGltZV9iZWZvcmVfZXEoamlmZmllcywgdGltZW91dCkgJiYgIShpbmJfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSAmIEFDUkYpKTsKKwkJfSB3aGlsZSAoaW5iX3N0YXR1cyhkZXYtPmJhc2VfYWRkcikgJiBBQ1JGKTsKKwkJc2V0X2hzZihkZXYsIEhTRl9QQ0JfTkFLKTsKKwl9CisJb3V0Yl9jb250cm9sKGFkYXB0ZXItPmhjcl92YWwgfCBBVFROIHwgRElSLCBkZXYpOworCW1kZWxheSgxMCk7CisJb3V0Yl9jb250cm9sKGFkYXB0ZXItPmhjcl92YWwgJiB+QVRUTiwgZGV2KTsKKwltZGVsYXkoMTApOworCW91dGJfY29udHJvbChhZGFwdGVyLT5oY3JfdmFsIHwgRkxTSCwgZGV2KTsKKwltZGVsYXkoMTApOworCW91dGJfY29udHJvbChhZGFwdGVyLT5oY3JfdmFsICYgfkZMU0gsIGRldik7CisJbWRlbGF5KDEwKTsKKworCW91dGJfY29udHJvbChvcmlnX2hjciwgZGV2KTsKKwlpZiAoIXN0YXJ0X3JlY2VpdmUoZGV2LCAmYWRhcHRlci0+dHhfcGNiKSkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogc3RhcnQgcmVjZWl2ZSBjb21tYW5kIGZhaWxlZCBcbiIsIGRldi0+bmFtZSk7Cit9CisKKy8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IGEgRE1BIHRyYW5zZmVyIGhhc24ndCB0aW1lZCBvdXQuICBUaGlzIHNob3VsZAorICogbmV2ZXIgaGFwcGVuIGluIHRoZW9yeSwgYnV0IHNlZW1zIHRvIG9jY3VyIG9jY2FzaW9uYWxseSBpZiB0aGUgY2FyZCBnZXRzCisgKiBwcm9kZGVkIGF0IHRoZSB3cm9uZyB0aW1lLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfM2M1MDVfZG1hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZWxwX2RldmljZSAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwlpZiAoYWRhcHRlci0+ZG1haW5nICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgYWRhcHRlci0+Y3VycmVudF9kbWEuc3RhcnRfdGltZSArIDEwKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBmOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBETUEgJXMgdGltZWQgb3V0LCAlZCBieXRlcyBsZWZ0XG4iLCBkZXYtPm5hbWUsIGFkYXB0ZXItPmN1cnJlbnRfZG1hLmRpcmVjdGlvbiA/ICJkb3dubG9hZCIgOiAidXBsb2FkIiwgZ2V0X2RtYV9yZXNpZHVlKGRldi0+ZG1hKSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJCWFkYXB0ZXItPmRtYWluZyA9IDA7CisJCWFkYXB0ZXItPmJ1c3kgPSAwOworCQkKKwkJZj1jbGFpbV9kbWFfbG9jaygpOworCQlkaXNhYmxlX2RtYShkZXYtPmRtYSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZik7CisJCQorCQlpZiAoYWRhcHRlci0+cnhfYWN0aXZlKQorCQkJYWRhcHRlci0+cnhfYWN0aXZlLS07CisJCW91dGJfY29udHJvbChhZGFwdGVyLT5oY3JfdmFsICYgfihETUFFIHwgVENFTiB8IERJUiksIGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKKy8qIFByaW1pdGl2ZSBmdW5jdGlvbnMgdXNlZCBieSBzZW5kX3BjYigpICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzZW5kX3BjYl9zbG93KHVuc2lnbmVkIGludCBiYXNlX2FkZHIsIHVuc2lnbmVkIGNoYXIgYnl0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJb3V0Yl9jb21tYW5kKGJ5dGUsIGJhc2VfYWRkcik7CisJZm9yICh0aW1lb3V0ID0gamlmZmllcyArIDUqSFovMTAwOyB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KTspIHsKKwkJaWYgKGluYl9zdGF0dXMoYmFzZV9hZGRyKSAmIEhDUkUpCisJCQlyZXR1cm4gRkFMU0U7CisJfQorCXByaW50ayhLRVJOX1dBUk5JTkcgIjNjNTA1OiBzZW5kX3BjYl9zbG93IHRpbWVkIG91dFxuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNlbmRfcGNiX2Zhc3QodW5zaWduZWQgaW50IGJhc2VfYWRkciwgdW5zaWduZWQgY2hhciBieXRlKQoreworCXVuc2lnbmVkIGludCB0aW1lb3V0OworCW91dGJfY29tbWFuZChieXRlLCBiYXNlX2FkZHIpOworCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCA0MDAwMDsgdGltZW91dCsrKSB7CisJCWlmIChpbmJfc3RhdHVzKGJhc2VfYWRkcikgJiBIQ1JFKQorCQkJcmV0dXJuIEZBTFNFOworCX0KKwlwcmludGsoS0VSTl9XQVJOSU5HICIzYzUwNTogc2VuZF9wY2JfZmFzdCB0aW1lZCBvdXRcbiIpOworCXJldHVybiBUUlVFOworfQorCisvKiBDaGVjayB0byBzZWUgaWYgdGhlIHJlY2VpdmVyIG5lZWRzIHJlc3RhcnRpbmcsIGFuZCBraWNrIGl0IGlmIHNvICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbWVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllbHBfZGV2aWNlICphZGFwdGVyID0gZGV2LT5wcml2OworCXdoaWxlIChhZGFwdGVyLT5yeF9hY3RpdmUgPCBFTFBfUlhfUENCUyAmJiBuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJaWYgKCFzdGFydF9yZWNlaXZlKGRldiwgJmFkYXB0ZXItPml0eF9wY2IpKQorCQkJYnJlYWs7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzZW5kX3BjYgorICogICBTZW5kIGEgUENCIHRvIHRoZSBhZGFwdGVyLgorICoKKyAqCW91dHB1dCBieXRlIHRvIGNvbW1hbmQgcmVnICAtLTwtLSsKKyAqCXdhaXQgdW50aWwgSENSRSBpcyBub24gemVybyAgICAgIHwKKyAqCWxvb3AgdW50aWwgYWxsIGJ5dGVzIHNlbnQgICAtLT4tLSsKKyAqCXNldCBIU0YxIGFuZCBIU0YyIHRvIDEKKyAqCW91dHB1dCBwY2IgbGVuZ3RoCisgKgl3YWl0IHVudGlsIEFTRiBnaXZlIEFDSyBvciBOQUsKKyAqCXNldCBIU0YxIGFuZCBIU0YyIHRvIDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgY2FuIGJlIHF1aXRlIHNsb3cgLS0gdGhlIGFkYXB0ZXIgaXMgYWxsb3dlZCB0byB0YWtlIHVwIHRvIDQwbXMKKyAqIHRvIHJlc3BvbmQgdG8gdGhlIGluaXRpYWwgaW50ZXJydXB0LgorICoKKyAqIFdlIHJ1biBpbml0aWFsbHkgd2l0aCBpbnRlcnJ1cHRzIHR1cm5lZCBvbiwgYnV0IHdpdGggYSBzZW1hcGhvcmUgc2V0CisgKiBzbyB0aGF0IG5vYm9keSB0cmllcyB0byByZS1lbnRlciB0aGlzIGNvZGUuICBPbmNlIHRoZSBmaXJzdCBieXRlIGhhcworICogZ29uZSB0aHJvdWdoLCB3ZSB0dXJuIGludGVycnVwdHMgb2ZmIGFuZCB0aGVuIHNlbmQgdGhlIG90aGVycyAodGhlCisgKiB0aW1lb3V0IGlzIHJlZHVjZWQgdG8gNTAwdXMpLgorICovCisKK3N0YXRpYyBpbnQgc2VuZF9wY2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgcGNiX3N0cnVjdCAqIHBjYikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJZWxwX2RldmljZSAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY2hlY2tfM2M1MDVfZG1hKGRldik7CisKKwlpZiAoYWRhcHRlci0+ZG1haW5nICYmIGFkYXB0ZXItPmN1cnJlbnRfZG1hLmRpcmVjdGlvbiA9PSAwKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvKiBBdm9pZCBjb250ZW50aW9uICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMSwgJmFkYXB0ZXItPnNlbmRfcGNiX3NlbWFwaG9yZSkpIHsKKwkJaWYgKGVscF9kZWJ1ZyA+PSAzKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNlbmRfcGNiIGVudGVyZWQgd2hpbGUgdGhyZWFkZWRcbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKgorCSAqIGxvYWQgZWFjaCBieXRlIGludG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgYW5kCisJICogd2FpdCBmb3IgdGhlIEhDUkUgYml0IHRvIGluZGljYXRlIHRoZSBhZGFwdGVyCisJICogaGFkIHJlYWQgdGhlIGJ5dGUKKwkgKi8KKwlzZXRfaHNmKGRldiwgMCk7CisKKwlpZiAoc2VuZF9wY2Jfc2xvdyhkZXYtPmJhc2VfYWRkciwgcGNiLT5jb21tYW5kKSkKKwkJZ290byBhYm9ydDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc2VuZF9wY2JfZmFzdChkZXYtPmJhc2VfYWRkciwgcGNiLT5sZW5ndGgpKQorCQlnb3RvIHN0aV9hYm9ydDsKKworCWZvciAoaSA9IDA7IGkgPCBwY2ItPmxlbmd0aDsgaSsrKSB7CisJCWlmIChzZW5kX3BjYl9mYXN0KGRldi0+YmFzZV9hZGRyLCBwY2ItPmRhdGEucmF3W2ldKSkKKwkJCWdvdG8gc3RpX2Fib3J0OworCX0KKworCW91dGJfY29udHJvbChhZGFwdGVyLT5oY3JfdmFsIHwgMywgZGV2KTsJLyogc2lnbmFsIGVuZCBvZiBQQ0IgKi8KKwlvdXRiX2NvbW1hbmQoMiArIHBjYi0+bGVuZ3RoLCBkZXYtPmJhc2VfYWRkcik7CisKKwkvKiBub3cgd2FpdCBmb3IgdGhlIGFja25vd2xlZGdlbWVudCAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKworCWZvciAodGltZW91dCA9IGppZmZpZXMgKyA1KkhaLzEwMDsgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCk7KSB7CisJCXN3aXRjaCAoR0VUX0FTRihkZXYtPmJhc2VfYWRkcikpIHsKKwkJY2FzZSBBU0ZfUENCX0FDSzoKKwkJCWFkYXB0ZXItPnNlbmRfcGNiX3NlbWFwaG9yZSA9IDA7CisJCQlyZXR1cm4gVFJVRTsKKworCQljYXNlIEFTRl9QQ0JfTkFLOgorI2lmZGVmIEVMUF9ERUJVRworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzZW5kX3BjYiBnb3QgTkFLXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCQlnb3RvIGFib3J0OworCQl9CisJfQorCisJaWYgKGVscF9kZWJ1ZyA+PSAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgUENCIGFja25vd2xlZGdlIChzdGF0dXMgJTAyeClcbiIsIGRldi0+bmFtZSwgaW5iX3N0YXR1cyhkZXYtPmJhc2VfYWRkcikpOworCWdvdG8gYWJvcnQ7CisKKyAgICAgIHN0aV9hYm9ydDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisgICAgICBhYm9ydDoKKwlhZGFwdGVyLT5zZW5kX3BjYl9zZW1hcGhvcmUgPSAwOworCXJldHVybiBGQUxTRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiByZWNlaXZlX3BjYgorICogICBSZWFkIGEgUENCIGZyb20gdGhlIGFkYXB0ZXIKKyAqCisgKgl3YWl0IGZvciBBQ1JGIHRvIGJlIG5vbi16ZXJvICAgICAgICAtLS08LS0tKworICoJaW5wdXQgYSBieXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqCWlmIEFTRjEgYW5kIEFTRjIgd2VyZSBub3QgYm90aCBvbmUgICAgICAgICB8CisgKgkJYmVmb3JlIGJ5dGUgd2FzIHJlYWQsIGxvb3AgICAgICAtLS0+LS0tKworICoJc2V0IEhTRjEgYW5kIEhTRjIgZm9yIGFjaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCByZWNlaXZlX3BjYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBwY2Jfc3RydWN0ICogcGNiKQoreworCWludCBpLCBqOworCWludCB0b3RhbF9sZW5ndGg7CisJaW50IHN0YXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwllbHBfZGV2aWNlICphZGFwdGVyID0gZGV2LT5wcml2OworCisJc2V0X2hzZihkZXYsIDApOworCisJLyogZ2V0IHRoZSBjb21tYW5kIGNvZGUgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIDIqSFovMTAwOworCXdoaWxlICgoKHN0YXQgPSBnZXRfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSkgJiBBQ1JGKSA9PSAwICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKKwlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlUSU1FT1VUX01TRyhfX0xJTkVfXyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcGNiLT5jb21tYW5kID0gaW5iX2NvbW1hbmQoZGV2LT5iYXNlX2FkZHIpOworCisJLyogcmVhZCB0aGUgZGF0YSBsZW5ndGggKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIDMqSFovMTAwOworCXdoaWxlICgoKHN0YXQgPSBnZXRfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSkgJiBBQ1JGKSA9PSAwICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKKwlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlUSU1FT1VUX01TRyhfX0xJTkVfXyk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzdGF0dXMgJTAyeFxuIiwgZGV2LT5uYW1lLCBzdGF0KTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlwY2ItPmxlbmd0aCA9IGluYl9jb21tYW5kKGRldi0+YmFzZV9hZGRyKTsKKworCWlmIChwY2ItPmxlbmd0aCA+IE1BWF9QQ0JfREFUQSkgeworCQlJTlZBTElEX1BDQl9NU0cocGNiLT5sZW5ndGgpOworCQlhZGFwdGVyX3Jlc2V0KGRldik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyogcmVhZCB0aGUgZGF0YSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJaSA9IDA7CisJZG8geworCQlqID0gMDsKKwkJd2hpbGUgKCgoc3RhdCA9IGdldF9zdGF0dXMoZGV2LT5iYXNlX2FkZHIpKSAmIEFDUkYpID09IDAgJiYgaisrIDwgMjAwMDApOworCQlwY2ItPmRhdGEucmF3W2krK10gPSBpbmJfY29tbWFuZChkZXYtPmJhc2VfYWRkcik7CisJCWlmIChpID4gTUFYX1BDQl9EQVRBKQorCQkJSU5WQUxJRF9QQ0JfTVNHKGkpOworCX0gd2hpbGUgKChzdGF0ICYgQVNGX1BDQl9NQVNLKSAhPSBBU0ZfUENCX0VORCAmJiBqIDwgMjAwMDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwlpZiAoaiA+PSAyMDAwMCkgeworCQlUSU1FT1VUX01TRyhfX0xJTkVfXyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyogd29vcHMsIHRoZSBsYXN0ICJkYXRhIiBieXRlIHdhcyByZWFsbHkgdGhlIGxlbmd0aCEgKi8KKwl0b3RhbF9sZW5ndGggPSBwY2ItPmRhdGEucmF3Wy0taV07CisKKwkvKiBzYWZldHkgY2hlY2sgdG90YWwgbGVuZ3RoIHZzIGRhdGEgbGVuZ3RoICovCisJaWYgKHRvdGFsX2xlbmd0aCAhPSAocGNiLT5sZW5ndGggKyAyKSkgeworCQlpZiAoZWxwX2RlYnVnID49IDIpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbWFuZ2xlZCBQQ0IgcmVjZWl2ZWRcbiIsIGRldi0+bmFtZSk7CisJCXNldF9oc2YoZGV2LCBIU0ZfUENCX05BSyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAocGNiLT5jb21tYW5kID09IENNRF9SRUNFSVZFX1BBQ0tFVF9DT01QTEVURSkgeworCQlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCAqKSAmYWRhcHRlci0+YnVzeSkpIHsKKwkJCWlmIChiYWNrbG9nX25leHQoYWRhcHRlci0+cnhfYmFja2xvZy5pbikgPT0gYWRhcHRlci0+cnhfYmFja2xvZy5vdXQpIHsKKwkJCQlzZXRfaHNmKGRldiwgSFNGX1BDQl9OQUspOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQQ0IgcmVqZWN0ZWQsIHRyYW5zZmVyIGluIHByb2dyZXNzIGFuZCBiYWNrbG9nIGZ1bGxcbiIsIGRldi0+bmFtZSk7CisJCQkJcGNiLT5jb21tYW5kID0gMDsKKwkJCQlyZXR1cm4gVFJVRTsKKwkJCX0gZWxzZSB7CisJCQkJcGNiLT5jb21tYW5kID0gMHhmZjsKKwkJCX0KKwkJfQorCX0KKwlzZXRfaHNmKGRldiwgSFNGX1BDQl9BQ0spOworCXJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIHF1ZXVlIGEgcmVjZWl2ZSBjb21tYW5kIG9uIHRoZSBhZGFwdGVyIHNvIHdlIHdpbGwgZ2V0IGFuCisgKiAgaW50ZXJydXB0IHdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzdGFydF9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHBjYl9zdHJ1Y3QgKiB0eF9wY2IpCit7CisJaW50IHN0YXR1czsKKwllbHBfZGV2aWNlICphZGFwdGVyID0gZGV2LT5wcml2OworCisJaWYgKGVscF9kZWJ1ZyA+PSAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlc3RhcnRpbmcgcmVjZWl2ZXJcbiIsIGRldi0+bmFtZSk7CisJdHhfcGNiLT5jb21tYW5kID0gQ01EX1JFQ0VJVkVfUEFDS0VUOworCXR4X3BjYi0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBSY3ZfcGt0KTsKKwl0eF9wY2ItPmRhdGEucmN2X3BrdC5idWZfc2VnCisJICAgID0gdHhfcGNiLT5kYXRhLnJjdl9wa3QuYnVmX29mcyA9IDA7CQkvKiBVbnVzZWQgKi8KKwl0eF9wY2ItPmRhdGEucmN2X3BrdC5idWZfbGVuID0gMTYwMDsKKwl0eF9wY2ItPmRhdGEucmN2X3BrdC50aW1lb3V0ID0gMDsJLyogc2V0IHRpbWVvdXQgdG8gemVybyAqLworCXN0YXR1cyA9IHNlbmRfcGNiKGRldiwgdHhfcGNiKTsKKwlpZiAoc3RhdHVzKQorCQlhZGFwdGVyLT5yeF9hY3RpdmUrKzsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZXh0cmFjdCBhIHBhY2tldCBmcm9tIHRoZSBhZGFwdGVyCisgKiB0aGlzIHJvdXRpbmUgaXMgb25seSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGludGVycnVwdAorICogc2VydmljZSByb3V0aW5lLCBzbyBubyBjbGkvc3RpIGNhbGxzIGFyZSBuZWVkZWQKKyAqIG5vdGUgdGhhdCB0aGUgbGVuZ3RoIGlzIGFsd2F5cyBhc3N1bWVkIHRvIGJlIGV2ZW4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCByZWNlaXZlX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbGVuKQoreworCWludCBybGVuOworCWVscF9kZXZpY2UgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJdm9pZCAqdGFyZ2V0OworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJsZW4gPSAobGVuICsgMSkgJiB+MTsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHJsZW4gKyAyKTsKKworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0XG4iLCBkZXYtPm5hbWUpOworCQl0YXJnZXQgPSBhZGFwdGVyLT5kbWFfYnVmZmVyOworCQlhZGFwdGVyLT5jdXJyZW50X2RtYS50YXJnZXQgPSBOVUxMOworCQkvKiBGSVhNRTogc3RhdHMgKi8KKwkJcmV0dXJuOworCX0KKworCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJdGFyZ2V0ID0gc2tiX3B1dChza2IsIHJsZW4pOworCWlmICgodW5zaWduZWQgbG9uZykodGFyZ2V0ICsgcmxlbikgPj0gTUFYX0RNQV9BRERSRVNTKSB7CisJCWFkYXB0ZXItPmN1cnJlbnRfZG1hLnRhcmdldCA9IHRhcmdldDsKKwkJdGFyZ2V0ID0gYWRhcHRlci0+ZG1hX2J1ZmZlcjsKKwl9IGVsc2UgeworCQlhZGFwdGVyLT5jdXJyZW50X2RtYS50YXJnZXQgPSBOVUxMOworCX0KKworCS8qIGlmIHRoaXMgaGFwcGVucywgd2UgZGllICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikgJmFkYXB0ZXItPmRtYWluZykpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJ4IGJsb2NrZWQsIERNQSBpbiBwcm9ncmVzcywgZGlyICVkXG4iLCBkZXYtPm5hbWUsIGFkYXB0ZXItPmN1cnJlbnRfZG1hLmRpcmVjdGlvbik7CisKKwlza2ItPmRldiA9IGRldjsKKwlhZGFwdGVyLT5jdXJyZW50X2RtYS5kaXJlY3Rpb24gPSAwOworCWFkYXB0ZXItPmN1cnJlbnRfZG1hLmxlbmd0aCA9IHJsZW47CisJYWRhcHRlci0+Y3VycmVudF9kbWEuc2tiID0gc2tiOworCWFkYXB0ZXItPmN1cnJlbnRfZG1hLnN0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJb3V0Yl9jb250cm9sKGFkYXB0ZXItPmhjcl92YWwgfCBESVIgfCBUQ0VOIHwgRE1BRSwgZGV2KTsKKworCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJZGlzYWJsZV9kbWEoZGV2LT5kbWEpOworCWNsZWFyX2RtYV9mZihkZXYtPmRtYSk7CisJc2V0X2RtYV9tb2RlKGRldi0+ZG1hLCAweDA0KTsJLyogZG1hIHJlYWQgKi8KKwlzZXRfZG1hX2FkZHIoZGV2LT5kbWEsIGlzYV92aXJ0X3RvX2J1cyh0YXJnZXQpKTsKKwlzZXRfZG1hX2NvdW50KGRldi0+ZG1hLCBybGVuKTsKKwllbmFibGVfZG1hKGRldi0+ZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKworCWlmIChlbHBfZGVidWcgPj0gMykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJ4IERNQSB0cmFuc2ZlciBzdGFydGVkXG4iLCBkZXYtPm5hbWUpOworCX0KKworCWlmIChhZGFwdGVyLT5yeF9hY3RpdmUpCisJCWFkYXB0ZXItPnJ4X2FjdGl2ZS0tOworCisJaWYgKCFhZGFwdGVyLT5idXN5KQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVjZWl2ZV9wYWNrZXQgY2FsbGVkLCBidXN5IG5vdCBzZXQuXG4iLCBkZXYtPm5hbWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogaW50ZXJydXB0IGhhbmRsZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgZWxwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdfcHRyKQoreworCWludCBsZW47CisJaW50IGRsZW47CisJaW50IGljb3VudCA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwllbHBfZGV2aWNlICphZGFwdGVyOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWRldiA9IGRldl9pZDsKKwlhZGFwdGVyID0gKGVscF9kZXZpY2UgKikgZGV2LT5wcml2OworCQorCXNwaW5fbG9jaygmYWRhcHRlci0+bG9jayk7CisKKwlkbyB7CisJCS8qCisJCSAqIGhhcyBhIERNQSB0cmFuc2ZlciBmaW5pc2hlZD8KKwkJICovCisJCWlmIChpbmJfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSAmIERPTkUpIHsKKwkJCWlmICghYWRhcHRlci0+ZG1haW5nKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHBoYW50b20gRE1BIGNvbXBsZXRlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCX0KKwkJCWlmIChlbHBfZGVidWcgPj0gMykgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgRE1BIGNvbXBsZXRlLCBzdGF0dXMgJTAyeFxuIiwgZGV2LT5uYW1lLCBhZGFwdGVyLT5jdXJyZW50X2RtYS5kaXJlY3Rpb24gPyAidHgiIDogInJ4IiwgaW5iX3N0YXR1cyhkZXYtPmJhc2VfYWRkcikpOworCQkJfQorCisJCQlvdXRiX2NvbnRyb2woYWRhcHRlci0+aGNyX3ZhbCAmIH4oRE1BRSB8IFRDRU4gfCBESVIpLCBkZXYpOworCQkJaWYgKGFkYXB0ZXItPmN1cnJlbnRfZG1hLmRpcmVjdGlvbikgeworCQkJCWRldl9rZnJlZV9za2JfaXJxKGFkYXB0ZXItPmN1cnJlbnRfZG1hLnNrYik7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCBza19idWZmICpza2IgPSBhZGFwdGVyLT5jdXJyZW50X2RtYS5za2I7CisJCQkJaWYgKHNrYikgeworCQkJCQlpZiAoYWRhcHRlci0+Y3VycmVudF9kbWEudGFyZ2V0KSB7CisJCQkJICAJLyogaGF2ZSBhbHJlYWR5IGRvbmUgdGhlIHNrYl9wdXQoKSAqLworCQkJCSAgCW1lbWNweShhZGFwdGVyLT5jdXJyZW50X2RtYS50YXJnZXQsIGFkYXB0ZXItPmRtYV9idWZmZXIsIGFkYXB0ZXItPmN1cnJlbnRfZG1hLmxlbmd0aCk7CisJCQkJCX0KKwkJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkJCQlhZGFwdGVyLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQl9CisJCQl9CisJCQlhZGFwdGVyLT5kbWFpbmcgPSAwOworCQkJaWYgKGFkYXB0ZXItPnJ4X2JhY2tsb2cuaW4gIT0gYWRhcHRlci0+cnhfYmFja2xvZy5vdXQpIHsKKwkJCQlpbnQgdCA9IGFkYXB0ZXItPnJ4X2JhY2tsb2cubGVuZ3RoW2FkYXB0ZXItPnJ4X2JhY2tsb2cub3V0XTsKKwkJCQlhZGFwdGVyLT5yeF9iYWNrbG9nLm91dCA9IGJhY2tsb2dfbmV4dChhZGFwdGVyLT5yeF9iYWNrbG9nLm91dCk7CisJCQkJaWYgKGVscF9kZWJ1ZyA+PSAyKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlY2VpdmluZyBiYWNrbG9nZ2VkIHBhY2tldCAoJWQpXG4iLCBkZXYtPm5hbWUsIHQpOworCQkJCXJlY2VpdmVfcGFja2V0KGRldiwgdCk7CisJCQl9IGVsc2UgeworCQkJCWFkYXB0ZXItPmJ1c3kgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogaGFzIG9uZSB0aW1lZCBvdXQ/ICovCisJCQljaGVja18zYzUwNV9kbWEoZGV2KTsKKwkJfQorCisJCS8qCisJCSAqIHJlY2VpdmUgYSBQQ0IgZnJvbSB0aGUgYWRhcHRlcgorCQkgKi8KKwkJdGltZW91dCA9IGppZmZpZXMgKyAzKkhaLzEwMDsKKwkJd2hpbGUgKChpbmJfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSAmIEFDUkYpICE9IDAgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJCWlmIChyZWNlaXZlX3BjYihkZXYsICZhZGFwdGVyLT5pcnhfcGNiKSkgeworCQkJCXN3aXRjaCAoYWRhcHRlci0+aXJ4X3BjYi5jb21tYW5kKSAKKwkJCQl7CisJCQkJY2FzZSAwOgorCQkJCQlicmVhazsKKwkJCQkJLyoKKwkJCQkJICogcmVjZWl2ZWQgYSBwYWNrZXQgLSB0aGlzIG11c3QgYmUgaGFuZGxlZCBmYXN0CisJCQkJCSAqLworCQkJCWNhc2UgMHhmZjoKKwkJCQljYXNlIENNRF9SRUNFSVZFX1BBQ0tFVF9DT01QTEVURToKKwkJCQkJLyogaWYgdGhlIGRldmljZSBpc24ndCBvcGVuLCBkb24ndCBwYXNzIHBhY2tldHMgdXAgdGhlIHN0YWNrICovCisJCQkJCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQkJCQkJYnJlYWs7CisJCQkJCWxlbiA9IGFkYXB0ZXItPmlyeF9wY2IuZGF0YS5yY3ZfcmVzcC5wa3RfbGVuOworCQkJCQlkbGVuID0gYWRhcHRlci0+aXJ4X3BjYi5kYXRhLnJjdl9yZXNwLmJ1Zl9sZW47CisJCQkJCWlmIChhZGFwdGVyLT5pcnhfcGNiLmRhdGEucmN2X3Jlc3AudGltZW91dCAhPSAwKSB7CisJCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnRlcnJ1cHQgLSBwYWNrZXQgbm90IHJlY2VpdmVkIGNvcnJlY3RseVxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChlbHBfZGVidWcgPj0gMykgeworCQkJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJydXB0IC0gcGFja2V0IHJlY2VpdmVkIG9mIGxlbmd0aCAlaSAoJWkpXG4iLCBkZXYtPm5hbWUsIGxlbiwgZGxlbik7CisJCQkJCQl9CisJCQkJCQlpZiAoYWRhcHRlci0+aXJ4X3BjYi5jb21tYW5kID09IDB4ZmYpIHsKKwkJCQkJCQlpZiAoZWxwX2RlYnVnID49IDIpCisJCQkJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYWRkaW5nIHBhY2tldCB0byBiYWNrbG9nIChsZW4gPSAlZClcbiIsIGRldi0+bmFtZSwgZGxlbik7CisJCQkJCQkJYWRhcHRlci0+cnhfYmFja2xvZy5sZW5ndGhbYWRhcHRlci0+cnhfYmFja2xvZy5pbl0gPSBkbGVuOworCQkJCQkJCWFkYXB0ZXItPnJ4X2JhY2tsb2cuaW4gPSBiYWNrbG9nX25leHQoYWRhcHRlci0+cnhfYmFja2xvZy5pbik7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXJlY2VpdmVfcGFja2V0KGRldiwgZGxlbik7CisJCQkJCQl9CisJCQkJCQlpZiAoZWxwX2RlYnVnID49IDMpCisJCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwYWNrZXQgcmVjZWl2ZWRcbiIsIGRldi0+bmFtZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQkJLyoKKwkJCQkJICogODI1ODYgY29uZmlndXJlZCBjb3JyZWN0bHkKKwkJCQkJICovCisJCQkJY2FzZSBDTURfQ09ORklHVVJFXzgyNTg2X1JFU1BPTlNFOgorCQkJCQlhZGFwdGVyLT5nb3RbQ01EX0NPTkZJR1VSRV84MjU4Nl0gPSAxOworCQkJCQlpZiAoZWxwX2RlYnVnID49IDMpCisJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludGVycnVwdCAtIGNvbmZpZ3VyZSByZXNwb25zZSByZWNlaXZlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJYnJlYWs7CisKKwkJCQkJLyoKKwkJCQkJICogQWRhcHRlciBtZW1vcnkgY29uZmlndXJhdGlvbgorCQkJCQkgKi8KKwkJCQljYXNlIENNRF9DT05GSUdVUkVfQURBUFRFUl9SRVNQT05TRToKKwkJCQkJYWRhcHRlci0+Z290W0NNRF9DT05GSUdVUkVfQURBUFRFUl9NRU1PUlldID0gMTsKKwkJCQkJaWYgKGVscF9kZWJ1ZyA+PSAzKQorCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBZGFwdGVyIG1lbW9yeSBjb25maWd1cmF0aW9uICVzLlxuIiwgZGV2LT5uYW1lLAorCQkJCQkJICAgICAgIGFkYXB0ZXItPmlyeF9wY2IuZGF0YS5mYWlsZWQgPyAiZmFpbGVkIiA6ICJzdWNjZWVkZWQiKTsKKwkJCQkJYnJlYWs7CisKKwkJCQkJLyoKKwkJCQkJICogTXVsdGljYXN0IGxpc3QgbG9hZGluZworCQkJCQkgKi8KKwkJCQljYXNlIENNRF9MT0FEX01VTFRJQ0FTVF9SRVNQT05TRToKKwkJCQkJYWRhcHRlci0+Z290W0NNRF9MT0FEX01VTFRJQ0FTVF9MSVNUXSA9IDE7CisJCQkJCWlmIChlbHBfZGVidWcgPj0gMykKKwkJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTXVsdGljYXN0IGFkZHJlc3MgbGlzdCBsb2FkaW5nICVzLlxuIiwgZGV2LT5uYW1lLAorCQkJCQkJICAgICAgIGFkYXB0ZXItPmlyeF9wY2IuZGF0YS5mYWlsZWQgPyAiZmFpbGVkIiA6ICJzdWNjZWVkZWQiKTsKKwkJCQkJYnJlYWs7CisKKwkJCQkJLyoKKwkJCQkJICogU3RhdGlvbiBhZGRyZXNzIHNldHRpbmcKKwkJCQkJICovCisJCQkJY2FzZSBDTURfU0VUX0FERFJFU1NfUkVTUE9OU0U6CisJCQkJCWFkYXB0ZXItPmdvdFtDTURfU0VUX1NUQVRJT05fQUREUkVTU10gPSAxOworCQkJCQlpZiAoZWxwX2RlYnVnID49IDMpCisJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEV0aGVybmV0IGFkZHJlc3Mgc2V0dGluZyAlcy5cbiIsIGRldi0+bmFtZSwKKwkJCQkJCSAgICAgICBhZGFwdGVyLT5pcnhfcGNiLmRhdGEuZmFpbGVkID8gImZhaWxlZCIgOiAic3VjY2VlZGVkIik7CisJCQkJCWJyZWFrOworCisKKwkJCQkJLyoKKwkJCQkJICogcmVjZWl2ZWQgYm9hcmQgc3RhdGlzdGljcworCQkJCQkgKi8KKwkJCQljYXNlIENNRF9ORVRXT1JLX1NUQVRJU1RJQ1NfUkVTUE9OU0U6CisJCQkJCWFkYXB0ZXItPnN0YXRzLnJ4X3BhY2tldHMgKz0gYWRhcHRlci0+aXJ4X3BjYi5kYXRhLm5ldHN0YXQudG90X3JlY3Y7CisJCQkJCWFkYXB0ZXItPnN0YXRzLnR4X3BhY2tldHMgKz0gYWRhcHRlci0+aXJ4X3BjYi5kYXRhLm5ldHN0YXQudG90X3htaXQ7CisJCQkJCWFkYXB0ZXItPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gYWRhcHRlci0+aXJ4X3BjYi5kYXRhLm5ldHN0YXQuZXJyX0NSQzsKKwkJCQkJYWRhcHRlci0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGFkYXB0ZXItPmlyeF9wY2IuZGF0YS5uZXRzdGF0LmVycl9hbGlnbjsKKwkJCQkJYWRhcHRlci0+c3RhdHMucnhfZmlmb19lcnJvcnMgKz0gYWRhcHRlci0+aXJ4X3BjYi5kYXRhLm5ldHN0YXQuZXJyX292cnJ1bjsKKwkJCQkJYWRhcHRlci0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgKz0gYWRhcHRlci0+aXJ4X3BjYi5kYXRhLm5ldHN0YXQuZXJyX3JlczsKKwkJCQkJYWRhcHRlci0+Z290W0NNRF9ORVRXT1JLX1NUQVRJU1RJQ1NdID0gMTsKKwkJCQkJaWYgKGVscF9kZWJ1ZyA+PSAzKQorCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQgLSBzdGF0aXN0aWNzIHJlc3BvbnNlIHJlY2VpdmVkXG4iLCBkZXYtPm5hbWUpOworCQkJCQlicmVhazsKKworCQkJCQkvKgorCQkJCQkgKiBzZW50IGEgcGFja2V0CisJCQkJCSAqLworCQkJCWNhc2UgQ01EX1RSQU5TTUlUX1BBQ0tFVF9DT01QTEVURToKKwkJCQkJaWYgKGVscF9kZWJ1ZyA+PSAzKQorCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQgLSBwYWNrZXQgc2VudFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCQkJCQlicmVhazsKKwkJCQkJc3dpdGNoIChhZGFwdGVyLT5pcnhfcGNiLmRhdGEueG1pdF9yZXNwLmNfc3RhdCkgeworCQkJCQljYXNlIDB4ZmZmZjoKKwkJCQkJCWFkYXB0ZXItPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBuZXR3b3JrIGNhYmxlIHByb2JsZW0/XG4iLCBkZXYtPm5hbWUpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMHhmZmZlOgorCQkJCQkJYWRhcHRlci0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIEZJRk8gdW5kZXJydW5cbiIsIGRldi0+bmFtZSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkJCWJyZWFrOworCisJCQkJCS8qCisJCQkJCSAqIHNvbWUgdW5rbm93biBQQ0IKKwkJCQkJICovCisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1bmtub3duIFBDQiByZWNlaXZlZCAtICUyLjJ4XG4iLCBkZXYtPm5hbWUsIGFkYXB0ZXItPmlyeF9wY2IuY29tbWFuZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCB0byByZWFkIFBDQiBvbiBpbnRlcnJ1cHRcbiIsIGRldi0+bmFtZSk7CisJCQkJYWRhcHRlcl9yZXNldChkZXYpOworCQkJfQorCQl9CisKKwl9IHdoaWxlIChpY291bnQrKyA8IDUgJiYgKGluYl9zdGF0dXMoZGV2LT5iYXNlX2FkZHIpICYgKEFDUkYgfCBET05FKSkpOworCisJcHJpbWVfcngoZGV2KTsKKworCS8qCisJICogaW5kaWNhdGUgbm8gbG9uZ2VyIGluIGludGVycnVwdCByb3V0aW5lCisJICovCisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogb3BlbiB0aGUgYm9hcmQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGVscF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZWxwX2RldmljZSAqYWRhcHRlcjsKKwlpbnQgcmV0dmFsOworCisJYWRhcHRlciA9IGRldi0+cHJpdjsKKworCWlmIChlbHBfZGVidWcgPj0gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZXF1ZXN0IHRvIG9wZW4gZGV2aWNlXG4iLCBkZXYtPm5hbWUpOworCisJLyoKKwkgKiBtYWtlIHN1cmUgd2UgYWN0dWFsbHkgZm91bmQgdGhlIGRldmljZQorCSAqLworCWlmIChhZGFwdGVyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogT3BlbmluZyBhIG5vbi1leGlzdGVudCBwaHlzaWNhbCBkZXZpY2VcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkvKgorCSAqIGRpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgYm9hcmQKKwkgKi8KKwlvdXRiX2NvbnRyb2woMCwgZGV2KTsKKworCS8qCisJICogY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cworCSAqLworCWluYl9jb21tYW5kKGRldi0+YmFzZV9hZGRyKTsKKwlhZGFwdGVyX3Jlc2V0KGRldik7CisKKwkvKgorCSAqIG5vIHJlY2VpdmUgUENCcyBhY3RpdmUKKwkgKi8KKwlhZGFwdGVyLT5yeF9hY3RpdmUgPSAwOworCisJYWRhcHRlci0+YnVzeSA9IDA7CisJYWRhcHRlci0+c2VuZF9wY2Jfc2VtYXBob3JlID0gMDsKKwlhZGFwdGVyLT5yeF9iYWNrbG9nLmluID0gMDsKKwlhZGFwdGVyLT5yeF9iYWNrbG9nLm91dCA9IDA7CisJCisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmxvY2spOworCisJLyoKKwkgKiBpbnN0YWxsIG91ciBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lCisJICovCisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJmVscF9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IGFsbG9jYXRlIElSUSVkXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2RtYShkZXYtPmRtYSwgZGV2LT5uYW1lKSkpIHsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBETUElZCBjaGFubmVsXG4iLCBkZXYtPm5hbWUsIGRldi0+ZG1hKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJYWRhcHRlci0+ZG1hX2J1ZmZlciA9ICh2b2lkICopIGRtYV9tZW1fYWxsb2MoRE1BX0JVRkZFUl9TSVpFKTsKKwlpZiAoIWFkYXB0ZXItPmRtYV9idWZmZXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IGFsbG9jYXRlIERNQSBidWZmZXJcbiIsIGRldi0+bmFtZSk7CisJCWZyZWVfZG1hKGRldi0+ZG1hKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlhZGFwdGVyLT5kbWFpbmcgPSAwOworCisJLyoKKwkgKiBlbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgYm9hcmQKKwkgKi8KKwlvdXRiX2NvbnRyb2woQ01ERSwgZGV2KTsKKworCS8qCisJICogY29uZmlndXJlIGFkYXB0ZXIgbWVtb3J5OiB3ZSBuZWVkIDEwIG11bHRpY2FzdCBhZGRyZXNzZXMsIGRlZmF1bHQ9PTAKKwkgKi8KKwlpZiAoZWxwX2RlYnVnID49IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2VuZGluZyAzYzUwNSBtZW1vcnkgY29uZmlndXJhdGlvbiBjb21tYW5kXG4iLCBkZXYtPm5hbWUpOworCWFkYXB0ZXItPnR4X3BjYi5jb21tYW5kID0gQ01EX0NPTkZJR1VSRV9BREFQVEVSX01FTU9SWTsKKwlhZGFwdGVyLT50eF9wY2IuZGF0YS5tZW1jb25mLmNtZF9xID0gMTA7CisJYWRhcHRlci0+dHhfcGNiLmRhdGEubWVtY29uZi5yY3ZfcSA9IDIwOworCWFkYXB0ZXItPnR4X3BjYi5kYXRhLm1lbWNvbmYubWNhc3QgPSAxMDsKKwlhZGFwdGVyLT50eF9wY2IuZGF0YS5tZW1jb25mLmZyYW1lID0gMjA7CisJYWRhcHRlci0+dHhfcGNiLmRhdGEubWVtY29uZi5yY3ZfYiA9IDIwOworCWFkYXB0ZXItPnR4X3BjYi5kYXRhLm1lbWNvbmYucHJvZ3MgPSAwOworCWFkYXB0ZXItPnR4X3BjYi5sZW5ndGggPSBzaXplb2Yoc3RydWN0IE1lbWNvbmYpOworCWFkYXB0ZXItPmdvdFtDTURfQ09ORklHVVJFX0FEQVBURVJfTUVNT1JZXSA9IDA7CisJaWYgKCFzZW5kX3BjYihkZXYsICZhZGFwdGVyLT50eF9wY2IpKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZG4ndCBzZW5kIG1lbW9yeSBjb25maWd1cmF0aW9uIGNvbW1hbmRcbiIsIGRldi0+bmFtZSk7CisJZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBUSU1FT1VUOworCQl3aGlsZSAoYWRhcHRlci0+Z290W0NNRF9DT05GSUdVUkVfQURBUFRFUl9NRU1PUlldID09IDAgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpOworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCVRJTUVPVVRfTVNHKF9fTElORV9fKTsKKwl9CisKKworCS8qCisJICogY29uZmlndXJlIGFkYXB0ZXIgdG8gcmVjZWl2ZSBicm9hZGNhc3QgbWVzc2FnZXMgYW5kIHdhaXQgZm9yIHJlc3BvbnNlCisJICovCisJaWYgKGVscF9kZWJ1ZyA+PSAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNlbmRpbmcgODI1ODYgY29uZmlndXJlIGNvbW1hbmRcbiIsIGRldi0+bmFtZSk7CisJYWRhcHRlci0+dHhfcGNiLmNvbW1hbmQgPSBDTURfQ09ORklHVVJFXzgyNTg2OworCWFkYXB0ZXItPnR4X3BjYi5kYXRhLmNvbmZpZ3VyZSA9IE5PX0xPT1BCQUNLIHwgUkVDVl9CUk9BRDsKKwlhZGFwdGVyLT50eF9wY2IubGVuZ3RoID0gMjsKKwlhZGFwdGVyLT5nb3RbQ01EX0NPTkZJR1VSRV84MjU4Nl0gPSAwOworCWlmICghc2VuZF9wY2IoZGV2LCAmYWRhcHRlci0+dHhfcGNiKSkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3Qgc2VuZCA4MjU4NiBjb25maWd1cmUgY29tbWFuZFxuIiwgZGV2LT5uYW1lKTsKKwllbHNlIHsKKwkJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIFRJTUVPVVQ7CisJCXdoaWxlIChhZGFwdGVyLT5nb3RbQ01EX0NPTkZJR1VSRV84MjU4Nl0gPT0gMCAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSk7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJVElNRU9VVF9NU0coX19MSU5FX18pOworCX0KKworCS8qIGVuYWJsZSBidXJzdC1tb2RlIERNQSAqLworCS8qIG91dGIoMHgxLCBkZXYtPmJhc2VfYWRkciArIFBPUlRfQVVYRE1BKTsgKi8KKworCS8qCisJICogcXVldWUgcmVjZWl2ZSBjb21tYW5kcyB0byBwcm92aWRlIGJ1ZmZlcmluZworCSAqLworCXByaW1lX3J4KGRldik7CisJaWYgKGVscF9kZWJ1ZyA+PSAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVkIHJlY2VpdmUgUENCcyBhY3RpdmVcbiIsIGRldi0+bmFtZSwgYWRhcHRlci0+cnhfYWN0aXZlKTsKKworCS8qCisJICogZGV2aWNlIGlzIG5vdyBvZmZpY2lhbGx5IG9wZW4hCisJICovCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzZW5kIGEgcGFja2V0IHRvIHRoZSBhZGFwdGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzZW5kX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWVscF9kZXZpY2UgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyB0YXJnZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogbWFrZSBzdXJlIHRoZSBsZW5ndGggaXMgZXZlbiBhbmQgbm8gc2hvcnRlciB0aGFuIDYwIGJ5dGVzCisJICovCisJdW5zaWduZWQgaW50IG5sZW4gPSAoKChza2ItPmxlbiA8IDYwKSA/IDYwIDogc2tiLT5sZW4pICsgMSkgJiAofjEpOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikgJmFkYXB0ZXItPmJ1c3kpKSB7CisJCWlmIChlbHBfZGVidWcgPj0gMikKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHJhbnNtaXQgYmxvY2tlZFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWFkYXB0ZXItPnN0YXRzLnR4X2J5dGVzICs9IG5sZW47CisJCisJLyoKKwkgKiBzZW5kIHRoZSBhZGFwdGVyIGEgdHJhbnNtaXQgcGFja2V0IGNvbW1hbmQuIElnbm9yZSBzZWdtZW50IGFuZCBvZmZzZXQKKwkgKiBhbmQgbWFrZSBzdXJlIHRoZSBsZW5ndGggaXMgZXZlbgorCSAqLworCWFkYXB0ZXItPnR4X3BjYi5jb21tYW5kID0gQ01EX1RSQU5TTUlUX1BBQ0tFVDsKKwlhZGFwdGVyLT50eF9wY2IubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBYbWl0X3BrdCk7CisJYWRhcHRlci0+dHhfcGNiLmRhdGEueG1pdF9wa3QuYnVmX29mcworCSAgICA9IGFkYXB0ZXItPnR4X3BjYi5kYXRhLnhtaXRfcGt0LmJ1Zl9zZWcgPSAwOwkvKiBVbnVzZWQgKi8KKwlhZGFwdGVyLT50eF9wY2IuZGF0YS54bWl0X3BrdC5wa3RfbGVuID0gbmxlbjsKKworCWlmICghc2VuZF9wY2IoZGV2LCAmYWRhcHRlci0+dHhfcGNiKSkgeworCQlhZGFwdGVyLT5idXN5ID0gMDsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiBpZiB0aGlzIGhhcHBlbnMsIHdlIGRpZSAqLworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkICopICZhZGFwdGVyLT5kbWFpbmcpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4OiBETUEgJWQgaW4gcHJvZ3Jlc3NcbiIsIGRldi0+bmFtZSwgYWRhcHRlci0+Y3VycmVudF9kbWEuZGlyZWN0aW9uKTsKKworCWFkYXB0ZXItPmN1cnJlbnRfZG1hLmRpcmVjdGlvbiA9IDE7CisJYWRhcHRlci0+Y3VycmVudF9kbWEuc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpKHNrYi0+ZGF0YSArIG5sZW4pID49IE1BWF9ETUFfQUREUkVTUyB8fCBubGVuICE9IHNrYi0+bGVuKSB7CisJCW1lbWNweShhZGFwdGVyLT5kbWFfYnVmZmVyLCBza2ItPmRhdGEsIG5sZW4pOworCQltZW1zZXQoYWRhcHRlci0+ZG1hX2J1ZmZlcitza2ItPmxlbiwgMCwgbmxlbi1za2ItPmxlbik7CisJCXRhcmdldCA9IGlzYV92aXJ0X3RvX2J1cyhhZGFwdGVyLT5kbWFfYnVmZmVyKTsKKwl9CisJZWxzZSB7CisJCXRhcmdldCA9IGlzYV92aXJ0X3RvX2J1cyhza2ItPmRhdGEpOworCX0KKwlhZGFwdGVyLT5jdXJyZW50X2RtYS5za2IgPSBza2I7CisKKwlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGRldi0+ZG1hKTsKKwljbGVhcl9kbWFfZmYoZGV2LT5kbWEpOworCXNldF9kbWFfbW9kZShkZXYtPmRtYSwgMHg0OCk7CS8qIGRtYSBtZW1vcnkgLT4gaW8gKi8KKwlzZXRfZG1hX2FkZHIoZGV2LT5kbWEsIHRhcmdldCk7CisJc2V0X2RtYV9jb3VudChkZXYtPmRtYSwgbmxlbik7CisJb3V0Yl9jb250cm9sKGFkYXB0ZXItPmhjcl92YWwgfCBETUFFIHwgVENFTiwgZGV2KTsKKwllbmFibGVfZG1hKGRldi0+ZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkKKwlpZiAoZWxwX2RlYnVnID49IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRE1BIHRyYW5zZmVyIHN0YXJ0ZWRcbiIsIGRldi0+bmFtZSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAqCVRoZSB1cHBlciBsYXllciB0aGlua3Mgd2UgdGltZWQgb3V0CisgKi8KKyAKK3N0YXRpYyB2b2lkIGVscF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZWxwX2RldmljZSAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwlpbnQgc3RhdDsKKworCXN0YXQgPSBpbmJfc3RhdHVzKGRldi0+YmFzZV9hZGRyKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBsb3N0ICVzP1xuIiwgZGV2LT5uYW1lLCAoc3RhdCAmIEFDUkYpID8gImludGVycnVwdCIgOiAiY29tbWFuZCIpOworCWlmIChlbHBfZGVidWcgPj0gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzdGF0dXMgJSMwMnhcbiIsIGRldi0+bmFtZSwgc3RhdCk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJYWRhcHRlci0+c3RhdHMudHhfZHJvcHBlZCsrOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHN0YXJ0IHRoZSB0cmFuc21pdHRlcgorICogICAgcmV0dXJuIDAgaWYgc2VudCBPSywgZWxzZSByZXR1cm4gMQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgZWxwX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWVscF9kZXZpY2UgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwljaGVja18zYzUwNV9kbWEoZGV2KTsKKworCWlmIChlbHBfZGVidWcgPj0gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZXF1ZXN0IHRvIHNlbmQgcGFja2V0IG9mIGxlbmd0aCAlZFxuIiwgZGV2LT5uYW1lLCAoaW50KSBza2ItPmxlbik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyoKKwkgKiBzZW5kIHRoZSBwYWNrZXQgYXQgc2tiLT5kYXRhIGZvciBza2ItPmxlbgorCSAqLworCWlmICghc2VuZF9wYWNrZXQoZGV2LCBza2IpKSB7CisJCWlmIChlbHBfZGVidWcgPj0gMikgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gdHJhbnNtaXQgcGFja2V0XG4iLCBkZXYtPm5hbWUpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChlbHBfZGVidWcgPj0gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwYWNrZXQgb2YgbGVuZ3RoICVkIHNlbnRcbiIsIGRldi0+bmFtZSwgKGludCkgc2tiLT5sZW4pOworCisJLyoKKwkgKiBzdGFydCB0aGUgdHJhbnNtaXQgdGltZW91dAorCSAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcHJpbWVfcngoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHJldHVybiBzdGF0aXN0aWNzIG9uIHRoZSBib2FyZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWxwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVscF9kZXZpY2UgKmFkYXB0ZXIgPSAoZWxwX2RldmljZSAqKSBkZXYtPnByaXY7CisKKwlpZiAoZWxwX2RlYnVnID49IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVxdWVzdCBmb3Igc3RhdHNcbiIsIGRldi0+bmFtZSk7CisKKwkvKiBJZiB0aGUgZGV2aWNlIGlzIGNsb3NlZCwganVzdCByZXR1cm4gdGhlIGxhdGVzdCBzdGF0cyB3ZSBoYXZlLAorCSAgIC0gd2UgY2Fubm90IGFzayBmcm9tIHRoZSBhZGFwdGVyIHdpdGhvdXQgaW50ZXJydXB0cyAqLworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gJmFkYXB0ZXItPnN0YXRzOworCisJLyogc2VuZCBhIGdldCBzdGF0aXN0aWNzIGNvbW1hbmQgdG8gdGhlIGJvYXJkICovCisJYWRhcHRlci0+dHhfcGNiLmNvbW1hbmQgPSBDTURfTkVUV09SS19TVEFUSVNUSUNTOworCWFkYXB0ZXItPnR4X3BjYi5sZW5ndGggPSAwOworCWFkYXB0ZXItPmdvdFtDTURfTkVUV09SS19TVEFUSVNUSUNTXSA9IDA7CisJaWYgKCFzZW5kX3BjYihkZXYsICZhZGFwdGVyLT50eF9wY2IpKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZG4ndCBzZW5kIGdldCBzdGF0aXN0aWNzIGNvbW1hbmRcbiIsIGRldi0+bmFtZSk7CisJZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBUSU1FT1VUOworCQl3aGlsZSAoYWRhcHRlci0+Z290W0NNRF9ORVRXT1JLX1NUQVRJU1RJQ1NdID09IDAgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpOworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJVElNRU9VVF9NU0coX19MSU5FX18pOworCQkJcmV0dXJuICZhZGFwdGVyLT5zdGF0czsKKwkJfQorCX0KKworCS8qIHN0YXRpc3RpY3MgYXJlIG5vdyB1cCB0byBkYXRlICovCisJcmV0dXJuICZhZGFwdGVyLT5zdGF0czsKK30KKworCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJJU0EgMHglbHgiLCBkZXYtPmJhc2VfYWRkcik7Cit9CisKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBkZWJ1ZzsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJZGVidWcgPSBsZXZlbDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKKwkuZ2V0X21zZ2xldmVsCQk9IG5ldGRldl9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBuZXRkZXZfc2V0X21zZ2xldmVsLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNsb3NlIHRoZSBib2FyZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgZWxwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZWxwX2RldmljZSAqYWRhcHRlcjsKKworCWFkYXB0ZXIgPSBkZXYtPnByaXY7CisKKwlpZiAoZWxwX2RlYnVnID49IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVxdWVzdCB0byBjbG9zZSBkZXZpY2VcbiIsIGRldi0+bmFtZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBTb21lb25lIG1heSByZXF1ZXN0IHRoZSBkZXZpY2Ugc3RhdGlzdGljIGluZm9ybWF0aW9uIGV2ZW4gd2hlbgorCSAqIHRoZSBpbnRlcmZhY2UgaXMgY2xvc2VkLiBUaGUgZm9sbG93aW5nIHdpbGwgdXBkYXRlIHRoZSBzdGF0aXN0aWNzCisJICogc3RydWN0dXJlIGluIHRoZSBkcml2ZXIsIHNvIHdlJ2xsIGJlIGFibGUgdG8gZ2l2ZSBjdXJyZW50IHN0YXRpc3RpY3MuCisJICovCisJKHZvaWQpIGVscF9nZXRfc3RhdHMoZGV2KTsKKworCS8qCisJICogZGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBib2FyZAorCSAqLworCW91dGJfY29udHJvbCgwLCBkZXYpOworCisJLyoKKwkgKiByZWxlYXNlIHRoZSBJUlEKKwkgKi8KKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCWZyZWVfZG1hKGRldi0+ZG1hKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBhZGFwdGVyLT5kbWFfYnVmZmVyLCBnZXRfb3JkZXIoRE1BX0JVRkZFUl9TSVpFKSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2V0IG11bHRpY2FzdCBsaXN0CisgKiBudW1fYWRkcnM9PTA6IGNsZWFyIG1jX2xpc3QKKyAqIG51bV9hZGRycz09LTE6IHNldCBwcm9taXNjdW91cyBtb2RlCisgKiBudW1fYWRkcnM+MDogc2V0IG1jX2xpc3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBlbHBfc2V0X21jX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllbHBfZGV2aWNlICphZGFwdGVyID0gKGVscF9kZXZpY2UgKikgZGV2LT5wcml2OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZWxwX2RlYnVnID49IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVxdWVzdCB0byBzZXQgbXVsdGljYXN0IGxpc3RcbiIsIGRldi0+bmFtZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCQorCWlmICghKGRldi0+ZmxhZ3MgJiAoSUZGX1BST01JU0MgfCBJRkZfQUxMTVVMVEkpKSkgeworCQkvKiBzZW5kIGEgImxvYWQgbXVsdGljYXN0IGxpc3QiIGNvbW1hbmQgdG8gdGhlIGJvYXJkLCBtYXggMTAgYWRkcnMvY21kICovCisJCS8qIGlmIG51bV9hZGRycz09MCB0aGUgbGlzdCB3aWxsIGJlIGNsZWFyZWQgKi8KKwkJYWRhcHRlci0+dHhfcGNiLmNvbW1hbmQgPSBDTURfTE9BRF9NVUxUSUNBU1RfTElTVDsKKwkJYWRhcHRlci0+dHhfcGNiLmxlbmd0aCA9IDYgKiBkZXYtPm1jX2NvdW50OworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrKSB7CisJCQltZW1jcHkoYWRhcHRlci0+dHhfcGNiLmRhdGEubXVsdGljYXN0W2ldLCBkbWktPmRtaV9hZGRyLCA2KTsKKwkJCWRtaSA9IGRtaS0+bmV4dDsKKwkJfQorCQlhZGFwdGVyLT5nb3RbQ01EX0xPQURfTVVMVElDQVNUX0xJU1RdID0gMDsKKwkJaWYgKCFzZW5kX3BjYihkZXYsICZhZGFwdGVyLT50eF9wY2IpKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3Qgc2VuZCBzZXRfbXVsdGljYXN0IGNvbW1hbmRcbiIsIGRldi0+bmFtZSk7CisJCWVsc2UgeworCQkJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIFRJTUVPVVQ7CisJCQl3aGlsZSAoYWRhcHRlci0+Z290W0NNRF9MT0FEX01VTFRJQ0FTVF9MSVNUXSA9PSAwICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKKwkJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQkJVElNRU9VVF9NU0coX19MSU5FX18pOworCQkJfQorCQl9CisJCWlmIChkZXYtPm1jX2NvdW50KQorCQkJYWRhcHRlci0+dHhfcGNiLmRhdGEuY29uZmlndXJlID0gTk9fTE9PUEJBQ0sgfCBSRUNWX0JST0FEIHwgUkVDVl9NVUxUSTsKKwkJZWxzZQkJLyogbnVtX2FkZHJzID09IDAgKi8KKwkJCWFkYXB0ZXItPnR4X3BjYi5kYXRhLmNvbmZpZ3VyZSA9IE5PX0xPT1BCQUNLIHwgUkVDVl9CUk9BRDsKKwl9IGVsc2UKKwkJYWRhcHRlci0+dHhfcGNiLmRhdGEuY29uZmlndXJlID0gTk9fTE9PUEJBQ0sgfCBSRUNWX1BST01JU0M7CisJLyoKKwkgKiBjb25maWd1cmUgYWRhcHRlciB0byByZWNlaXZlIG1lc3NhZ2VzIChhcyBzcGVjaWZpZWQgYWJvdmUpCisJICogYW5kIHdhaXQgZm9yIHJlc3BvbnNlCisJICovCisJaWYgKGVscF9kZWJ1ZyA+PSAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNlbmRpbmcgODI1ODYgY29uZmlndXJlIGNvbW1hbmRcbiIsIGRldi0+bmFtZSk7CisJYWRhcHRlci0+dHhfcGNiLmNvbW1hbmQgPSBDTURfQ09ORklHVVJFXzgyNTg2OworCWFkYXB0ZXItPnR4X3BjYi5sZW5ndGggPSAyOworCWFkYXB0ZXItPmdvdFtDTURfQ09ORklHVVJFXzgyNTg2XSA9IDA7CisJaWYgKCFzZW5kX3BjYihkZXYsICZhZGFwdGVyLT50eF9wY2IpKQorCXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZG4ndCBzZW5kIDgyNTg2IGNvbmZpZ3VyZSBjb21tYW5kXG4iLCBkZXYtPm5hbWUpOworCX0KKwllbHNlIHsKKwkJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIFRJTUVPVVQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwkJd2hpbGUgKGFkYXB0ZXItPmdvdFtDTURfQ09ORklHVVJFXzgyNTg2XSA9PSAwICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCkpCisJCQlUSU1FT1VUX01TRyhfX0xJTkVfXyk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQSBjb3VwbGUgb2YgdGVzdHMgdG8gc2VlIGlmIHRoZXJlJ3MgM0M1MDUgb3Igbm90CisgKiBDYWxsZWQgb25seSBieSBlbHBfYXV0b2RldGVjdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfX2luaXQgZWxwX3NlbnNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGFkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwljb25zdCBjaGFyICpuYW1lID0gZGV2LT5uYW1lOworCWJ5dGUgb3JpZ19IU1I7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHIsIEVMUF9JT19FWFRFTlQsICIzYzUwNSIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9yaWdfSFNSID0gaW5iX3N0YXR1cyhhZGRyKTsKKworCWlmIChlbHBfZGVidWcgPiAwKQorCQlwcmludGsoc2VhcmNoX21zZywgbmFtZSwgYWRkcik7CisKKwlpZiAob3JpZ19IU1IgPT0gMHhmZikgeworCQlpZiAoZWxwX2RlYnVnID4gMCkKKwkJCXByaW50ayhub3Rmb3VuZF9tc2csIDEpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBXYWl0IGZvciBhIHdoaWxlOyB0aGUgYWRhcHRlciBtYXkgc3RpbGwgYmUgYm9vdGluZyB1cCAqLworCWlmIChlbHBfZGVidWcgPiAwKQorCQlwcmludGsoc3RpbGxsb29raW5nX21zZyk7CisKKwlpZiAob3JpZ19IU1IgJiBESVIpIHsKKwkJLyogSWYgSENSLkRJUiBpcyB1cCwgd2UgcHVsbCBpdCBkb3duLiBIU1IuRElSIHNob3VsZCBmb2xsb3cuICovCisJCW91dGIoMCwgZGV2LT5iYXNlX2FkZHIgKyBQT1JUX0NPTlRST0wpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMzAqSFovMTAwKTsKKwkJaWYgKGluYl9zdGF0dXMoYWRkcikgJiBESVIpIHsKKwkJCWlmIChlbHBfZGVidWcgPiAwKQorCQkJCXByaW50ayhub3Rmb3VuZF9tc2csIDIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJZiBIQ1IuRElSIGlzIGRvd24sIHdlIHB1bGwgaXQgdXAuIEhTUi5ESVIgc2hvdWxkIGZvbGxvdy4gKi8KKwkJb3V0YihESVIsIGRldi0+YmFzZV9hZGRyICsgUE9SVF9DT05UUk9MKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDMwKkhaLzEwMCk7CisJCWlmICghKGluYl9zdGF0dXMoYWRkcikgJiBESVIpKSB7CisJCQlpZiAoZWxwX2RlYnVnID4gMCkKKwkJCQlwcmludGsobm90Zm91bmRfbXNnLCAzKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCS8qCisJICogSXQgY2VydGFpbmx5IGxvb2tzIGxpa2UgYSAzYzUwNS4KKwkgKi8KKwlpZiAoZWxwX2RlYnVnID4gMCkKKwkJcHJpbnRrKGZvdW5kX21zZyk7CisKKwlyZXR1cm4gMDsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihhZGRyLCBFTFBfSU9fRVhURU5UKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZWFyY2ggdGhyb3VnaCBhZGRyX2xpc3RbXSBhbmQgdHJ5IHRvIGZpbmQgYSAzQzUwNQorICogQ2FsbGVkIG9ubHkgYnkgZXBsdXNfcHJvYmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdCBlbHBfYXV0b2RldGVjdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpZHggPSAwOworCisJLyogaWYgYmFzZSBhZGRyZXNzIHNldCwgdGhlbiBvbmx5IGNoZWNrIHRoYXQgYWRkcmVzcworCSAgIG90aGVyd2lzZSwgcnVuIHRocm91Z2ggdGhlIHRhYmxlICovCisJaWYgKGRldi0+YmFzZV9hZGRyICE9IDApIHsJLyogZGV2LT5iYXNlX2FkZHIgPT0gMCA9PT4gcGxhaW4gYXV0b2RldGVjdCAqLworCQlpZiAoZWxwX3NlbnNlKGRldikgPT0gMCkKKwkJCXJldHVybiBkZXYtPmJhc2VfYWRkcjsKKwl9IGVsc2UKKwkJd2hpbGUgKChkZXYtPmJhc2VfYWRkciA9IGFkZHJfbGlzdFtpZHgrK10pKSB7CisJCQlpZiAoZWxwX3NlbnNlKGRldikgPT0gMCkKKwkJCQlyZXR1cm4gZGV2LT5iYXNlX2FkZHI7CisJCX0KKworCS8qIGNvdWxkIG5vdCBmaW5kIGFuIGFkYXB0ZXIgKi8KKwlpZiAoZWxwX2RlYnVnID4gMCkKKwkJcHJpbnRrKGNvdWxkbm90X21zZywgZGV2LT5uYW1lKTsKKworCXJldHVybiAwOwkJLyogQmVjYXVzZSBvZiB0aGlzLCB0aGUgbGF5ZXIgYWJvdmUgd2lsbCByZXR1cm4gLUVOT0RFViAqLworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwcm9iZSBmb3IgYW4gRXRoZXJsaW5rIFBsdXMgYm9hcmQgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlcmUgYXJlIHRocmVlIHNpdHVhdGlvbnMgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGRldGVjdCBoZXJlOgorCisgKiAgYSkgdGhlIGNhcmQgaXMgaWRsZQorICogIGIpIHRoZSBjYXJkIGlzIHN0aWxsIGJvb3RpbmcgdXAKKyAqICBjKSB0aGUgY2FyZCBpcyBzdHVjayBpbiBhIHN0cmFuZ2Ugc3RhdGUgKHNvbWUgRE9TIGRyaXZlcnMgZG8gdGhpcykKKyAqCisgKiBJbiBjYXNlIChhKSwgYWxsIGlzIHdlbGwuICBJbiBjYXNlIChiKSwgd2Ugd2FpdCAxMCBzZWNvbmRzIHRvIHNlZSBpZiB0aGUKKyAqIGNhcmQgZmluaXNoZXMgYm9vdGluZywgYW5kIGNhcnJ5IG9uIGlmIHNvLiAgSW4gY2FzZSAoYyksIHdlIGRvIGEgaGFyZCByZXNldCwKKyAqIGxvb3Agcm91bmQsIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KKyAqCisgKiBUaGlzIGlzIGFsbCB2ZXJ5IHVucGxlYXNhbnQsIGJ1dCBob3BlZnVsbHkgYXZvaWRzIHRoZSBwcm9ibGVtcyB3aXRoIHRoZSBvbGQKKyAqIHByb2JlIGNvZGUgKHdoaWNoIGhhZCBhIDE1LXNlY29uZCBkZWxheSBpZiB0aGUgY2FyZCB3YXMgaWRsZSwgYW5kIGRpZG4ndAorICogd29yayBhdCBhbGwgaWYgaXQgd2FzIGluIGEgd2VpcmQgc3RhdGUpLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGVscGx1c19zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVscF9kZXZpY2UgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJaW50IGksIHRyaWVzLCB0cmllczEsIG9rYXk7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgY29va2llID0gMDsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qCisJICogIHNldHVwIGFkYXB0ZXIgc3RydWN0dXJlCisJICovCisKKwlkZXYtPmJhc2VfYWRkciA9IGVscF9hdXRvZGV0ZWN0KGRldik7CisJaWYgKCFkZXYtPmJhc2VfYWRkcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlhZGFwdGVyLT5zZW5kX3BjYl9zZW1hcGhvcmUgPSAwOworCisJZm9yICh0cmllczEgPSAwOyB0cmllczEgPCAzOyB0cmllczErKykgeworCQlvdXRiX2NvbnRyb2woKGFkYXB0ZXItPmhjcl92YWwgfCBDTURFKSAmIH5ESVIsIGRldik7CisJCS8qIEZpcnN0IHRyeSB0byB3cml0ZSBqdXN0IG9uZSBieXRlLCB0byBzZWUgaWYgdGhlIGNhcmQgaXMKKwkJICogcmVzcG9uZGluZyBhdCBhbGwgbm9ybWFsbHkuCisJCSAqLworCQl0aW1lb3V0ID0gamlmZmllcyArIDUqSFovMTAwOworCQlva2F5ID0gMDsKKwkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICEoaW5iX3N0YXR1cyhkZXYtPmJhc2VfYWRkcikgJiBIQ1JFKSk7CisJCWlmICgoaW5iX3N0YXR1cyhkZXYtPmJhc2VfYWRkcikgJiBIQ1JFKSkgeworCQkJb3V0Yl9jb21tYW5kKDAsIGRldi0+YmFzZV9hZGRyKTsJLyogc2VuZCBhIHNwdXJpb3VzIGJ5dGUgKi8KKwkJCXRpbWVvdXQgPSBqaWZmaWVzICsgNSpIWi8xMDA7CisJCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkgJiYgIShpbmJfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSAmIEhDUkUpKTsKKwkJCWlmIChpbmJfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSAmIEhDUkUpCisJCQkJb2theSA9IDE7CisJCX0KKwkJaWYgKCFva2F5KSB7CisJCQkvKiBOb3BlLCBpdCdzIGlnbm9yaW5nIHRoZSBjb21tYW5kIHJlZ2lzdGVyLiAgVGhpcyBtZWFucyB0aGF0CisJCQkgKiBlaXRoZXIgaXQncyBzdGlsbCBib290aW5nIHVwLCBvciBpdCdzIGRpZWQuCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbW1hbmQgcmVnaXN0ZXIgd291bGRuJ3QgZHJhaW4sICIsIGRldi0+bmFtZSk7CisJCQlpZiAoKGluYl9zdGF0dXMoZGV2LT5iYXNlX2FkZHIpICYgNykgPT0gMykgeworCQkJCS8qIElmIHRoZSBhZGFwdGVyIHN0YXR1cyBpcyAzLCBpdCAqY291bGQqIHN0aWxsIGJlIGJvb3RpbmcuCisJCQkJICogR2l2ZSBpdCB0aGUgYmVuZWZpdCBvZiB0aGUgZG91YnQgZm9yIDEwIHNlY29uZHMuCisJCQkJICovCisJCQkJcHJpbnRrKCJhc3N1bWluZyAzYzUwNSBzdGlsbCBzdGFydGluZ1xuIik7CisJCQkJdGltZW91dCA9IGppZmZpZXMgKyAxMCpIWjsKKwkJCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkgJiYgKGluYl9zdGF0dXMoZGV2LT5iYXNlX2FkZHIpICYgNykpOworCQkJCWlmIChpbmJfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSAmIDcpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogM2M1MDUgZmFpbGVkIHRvIHN0YXJ0XG4iLCBkZXYtPm5hbWUpOworCQkJCX0gZWxzZSB7CisJCQkJCW9rYXkgPSAxOyAgLyogSXQgc3RhcnRlZCAqLworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogT3RoZXJ3aXNlLCBpdCBtdXN0IGp1c3QgYmUgaW4gYSBzdHJhbmdlCisJCQkJICogc3RhdGUuICBXZSBwcm9iYWJseSBuZWVkIHRvIGtpY2sgaXQuCisJCQkJICovCisJCQkJcHJpbnRrKCIzYzUwNSBpcyBzdWxraW5nXG4iKTsKKwkJCX0KKwkJfQorCQlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPCA1ICYmIG9rYXk7IHRyaWVzKyspIHsKKworCQkJLyoKKwkJCSAqIFRyeSB0byBzZXQgdGhlIEV0aGVybmV0IGFkZHJlc3MsIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBib2FyZAorCQkJICogaXMgd29ya2luZy4KKwkJCSAqLworCQkJYWRhcHRlci0+dHhfcGNiLmNvbW1hbmQgPSBDTURfU1RBVElPTl9BRERSRVNTOworCQkJYWRhcHRlci0+dHhfcGNiLmxlbmd0aCA9IDA7CisJCQljb29raWUgPSBwcm9iZV9pcnFfb24oKTsKKwkJCWlmICghc2VuZF9wY2IoZGV2LCAmYWRhcHRlci0+dHhfcGNiKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBzZW5kIGZpcnN0IFBDQlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlwcm9iZV9pcnFfb2ZmKGNvb2tpZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXJlY2VpdmVfcGNiKGRldiwgJmFkYXB0ZXItPnJ4X3BjYikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3QgcmVhZCBmaXJzdCBQQ0JcbiIsIGRldi0+bmFtZSk7CisJCQkJcHJvYmVfaXJxX29mZihjb29raWUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKChhZGFwdGVyLT5yeF9wY2IuY29tbWFuZCAhPSBDTURfQUREUkVTU19SRVNQT05TRSkgfHwKKwkJCSAgICAoYWRhcHRlci0+cnhfcGNiLmxlbmd0aCAhPSA2KSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZpcnN0IFBDQiB3cm9uZyAoJWQsICVkKVxuIiwgZGV2LT5uYW1lLCBhZGFwdGVyLT5yeF9wY2IuY29tbWFuZCwgYWRhcHRlci0+cnhfcGNiLmxlbmd0aCk7CisJCQkJcHJvYmVfaXJxX29mZihjb29raWUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZ290byBva2F5OworCQl9CisJCS8qIEl0J3MgYnJva2VuLiAgRG8gYSBoYXJkIHJlc2V0IHRvIHJlLWluaXRpYWxpc2UgdGhlIGJvYXJkLAorCQkgKiBhbmQgdHJ5IGFnYWluLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlc2V0dGluZyBhZGFwdGVyXG4iLCBkZXYtPm5hbWUpOworCQlvdXRiX2NvbnRyb2woYWRhcHRlci0+aGNyX3ZhbCB8IEZMU0ggfCBBVFROLCBkZXYpOworCQlvdXRiX2NvbnRyb2woYWRhcHRlci0+aGNyX3ZhbCAmIH4oRkxTSCB8IEFUVE4pLCBkZXYpOworCX0KKwlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gaW5pdGlhbGlzZSAzYzUwNVxuIiwgZGV2LT5uYW1lKTsKKwlnb3RvIG91dDsKKworICAgICAgb2theToKKwlpZiAoZGV2LT5pcnEpIHsJCS8qIElzIHRoZXJlIGEgcHJlc2V0IElSUT8gKi8KKwkJaW50IHJwdCA9IHByb2JlX2lycV9vZmYoY29va2llKTsKKwkJaWYgKGRldi0+aXJxICE9IHJwdCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHdhcm5pbmcsIGlycSAlZCBjb25maWd1cmVkIGJ1dCAlZCBkZXRlY3RlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSwgcnB0KTsKKwkJfQorCQkvKiBpZiBkZXYtPmlycSA9PSBwcm9iZV9pcnFfb2ZmKGNvb2tpZSksIGFsbCBpcyB3ZWxsICovCisJfSBlbHNlCQkgICAgICAgLyogTm8gcHJlc2V0IElSUTsganVzdCB1c2Ugd2hhdCB3ZSBjYW4gZGV0ZWN0ICovCisJCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZihjb29raWUpOworCXN3aXRjaCAoZGV2LT5pcnEpIHsgICAgLyogTGVnYWwsIHNhbmU/ICovCisJY2FzZSAwOgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJUlEgcHJvYmUgZmFpbGVkOiBjaGVjayAzYzUwNSBqdW1wZXJzLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCWNhc2UgMToKKwljYXNlIDY6CisJY2FzZSA4OgorCWNhc2UgMTM6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEltcG9zc2libGUgSVJRICVkIHJlcG9ydGVkIGJ5IHByb2JlX2lycV9vZmYoKS5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJICAgICAgIGdvdG8gb3V0OworCX0KKwkvKgorCSAqICBOb3cgd2UgaGF2ZSB0aGUgSVJRIG51bWJlciBzbyB3ZSBjYW4gZGlzYWJsZSB0aGUgaW50ZXJydXB0cyBmcm9tCisJICogIHRoZSBib2FyZCB1bnRpbCB0aGUgYm9hcmQgaXMgb3BlbmVkLgorCSAqLworCW91dGJfY29udHJvbChhZGFwdGVyLT5oY3JfdmFsICYgfkNNREUsIGRldik7CisKKwkvKgorCSAqIGNvcHkgRXRoZXJuZXQgYWRkcmVzcyBpbnRvIHN0cnVjdHVyZQorCSAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBhZGFwdGVyLT5yeF9wY2IuZGF0YS5ldGhfYWRkcltpXTsKKworCS8qIGZpbmQgYSBETUEgY2hhbm5lbCAqLworCWlmICghZGV2LT5kbWEpIHsKKwkJaWYgKGRldi0+bWVtX3N0YXJ0KSB7CisJCQlkZXYtPmRtYSA9IGRldi0+bWVtX3N0YXJ0ICYgNzsKKwkJfQorCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3YXJuaW5nLCBETUEgY2hhbm5lbCBub3Qgc3BlY2lmaWVkLCB1c2luZyBkZWZhdWx0XG4iLCBkZXYtPm5hbWUpOworCQkJZGV2LT5kbWEgPSBFTFBfRE1BOworCQl9CisJfQorCisJLyoKKwkgKiBwcmludCByZW1haW5kZXIgb2Ygc3RhcnR1cCBtZXNzYWdlCisJICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IDNjNTA1IGF0ICUjbHgsIGlycSAlZCwgZG1hICVkLCAiLAorCSAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwgZGV2LT5kbWEpOworCXByaW50aygiYWRkciAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCwgIiwKKwkgICAgICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkgICAgICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisKKwkvKgorCSAqIHJlYWQgbW9yZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhZGFwdGVyCisJICovCisKKwlhZGFwdGVyLT50eF9wY2IuY29tbWFuZCA9IENNRF9BREFQVEVSX0lORk87CisJYWRhcHRlci0+dHhfcGNiLmxlbmd0aCA9IDA7CisJaWYgKCFzZW5kX3BjYihkZXYsICZhZGFwdGVyLT50eF9wY2IpIHx8CisJICAgICFyZWNlaXZlX3BjYihkZXYsICZhZGFwdGVyLT5yeF9wY2IpIHx8CisJICAgIChhZGFwdGVyLT5yeF9wY2IuY29tbWFuZCAhPSBDTURfQURBUFRFUl9JTkZPX1JFU1BPTlNFKSB8fAorCSAgICAoYWRhcHRlci0+cnhfcGNiLmxlbmd0aCAhPSAxMCkpIHsKKwkJcHJpbnRrKCJub3QgcmVzcG9uZGluZyB0byBzZWNvbmQgUENCXG4iKTsKKwl9CisJcHJpbnRrKCJyZXYgJWQuJWQsICVka1xuIiwgYWRhcHRlci0+cnhfcGNiLmRhdGEuaW5mby5tYWpvcl92ZXJzLCBhZGFwdGVyLT5yeF9wY2IuZGF0YS5pbmZvLm1pbm9yX3ZlcnMsIGFkYXB0ZXItPnJ4X3BjYi5kYXRhLmluZm8uUkFNX3N6KTsKKworCS8qCisJICogcmVjb25maWd1cmUgdGhlIGFkYXB0ZXIgbWVtb3J5IHRvIGJldHRlciBzdWl0IG91ciBwdXJwb3NlcworCSAqLworCWFkYXB0ZXItPnR4X3BjYi5jb21tYW5kID0gQ01EX0NPTkZJR1VSRV9BREFQVEVSX01FTU9SWTsKKwlhZGFwdGVyLT50eF9wY2IubGVuZ3RoID0gMTI7CisJYWRhcHRlci0+dHhfcGNiLmRhdGEubWVtY29uZi5jbWRfcSA9IDg7CisJYWRhcHRlci0+dHhfcGNiLmRhdGEubWVtY29uZi5yY3ZfcSA9IDg7CisJYWRhcHRlci0+dHhfcGNiLmRhdGEubWVtY29uZi5tY2FzdCA9IDEwOworCWFkYXB0ZXItPnR4X3BjYi5kYXRhLm1lbWNvbmYuZnJhbWUgPSAxMDsKKwlhZGFwdGVyLT50eF9wY2IuZGF0YS5tZW1jb25mLnJjdl9iID0gMTA7CisJYWRhcHRlci0+dHhfcGNiLmRhdGEubWVtY29uZi5wcm9ncyA9IDA7CisJaWYgKCFzZW5kX3BjYihkZXYsICZhZGFwdGVyLT50eF9wY2IpIHx8CisJICAgICFyZWNlaXZlX3BjYihkZXYsICZhZGFwdGVyLT5yeF9wY2IpIHx8CisJICAgIChhZGFwdGVyLT5yeF9wY2IuY29tbWFuZCAhPSBDTURfQ09ORklHVVJFX0FEQVBURVJfUkVTUE9OU0UpIHx8CisJICAgIChhZGFwdGVyLT5yeF9wY2IubGVuZ3RoICE9IDIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBjb25maWd1cmUgYWRhcHRlciBtZW1vcnlcbiIsIGRldi0+bmFtZSk7CisJfQorCWlmIChhZGFwdGVyLT5yeF9wY2IuZGF0YS5jb25maWd1cmUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYWRhcHRlciBjb25maWd1cmF0aW9uIGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwl9CisKKwlkZXYtPm9wZW4gPSBlbHBfb3BlbjsJCQkJLyogbG9jYWwgKi8KKwlkZXYtPnN0b3AgPSBlbHBfY2xvc2U7CQkJCS8qIGxvY2FsICovCisJZGV2LT5nZXRfc3RhdHMgPSBlbHBfZ2V0X3N0YXRzOwkJCS8qIGxvY2FsICovCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBlbHBfc3RhcnRfeG1pdDsJCS8qIGxvY2FsICovCisJZGV2LT50eF90aW1lb3V0ID0gZWxwX3RpbWVvdXQ7CQkJLyogbG9jYWwgKi8KKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gMTAqSFo7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBlbHBfc2V0X21jX2xpc3Q7CS8qIGxvY2FsICovCisJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CQkvKiBsb2NhbCAqLworCisJbWVtc2V0KCYoYWRhcHRlci0+c3RhdHMpLCAwLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKwlkZXYtPm1lbV9zdGFydCA9IGRldi0+bWVtX2VuZCA9IDA7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXJldHVybiAwOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFTFBfSU9fRVhURU5UKTsKKwlyZXR1cm4gZXJyOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgZWxwbHVzX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoZWxwX2RldmljZSkpOworCWludCBlcnI7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwllcnIgPSBlbHBsdXNfc2V0dXAoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCXJldHVybiBkZXY7Cit9CisKKyNlbHNlCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl8zYzUwNVtFTFBfTUFYX0NBUkRTXTsKK3N0YXRpYyBpbnQgaW9bRUxQX01BWF9DQVJEU107CitzdGF0aWMgaW50IGlycVtFTFBfTUFYX0NBUkRTXTsKK3N0YXRpYyBpbnQgZG1hW0VMUF9NQVhfQ0FSRFNdOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShkbWEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiRXRoZXJMaW5rIFBsdXMgSS9PIGJhc2UgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiRXRoZXJMaW5rIFBsdXMgSVJRIG51bWJlcihzKSAoYXNzaWduZWQpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRtYSwgIkV0aGVyTGluayBQbHVzIERNQSBjaGFubmVsKHMpIik7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgRUxQX01BWF9DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKGVscF9kZXZpY2UpKTsKKwkJaWYgKCFkZXYpCisJCQlicmVhazsKKworCQlkZXYtPmlycSA9IGlycVt0aGlzX2Rldl07CisJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOworCQlpZiAoZG1hW3RoaXNfZGV2XSkgeworCQkJZGV2LT5kbWEgPSBkbWFbdGhpc19kZXZdOworCQl9IGVsc2UgeworCQkJZGV2LT5kbWEgPSBFTFBfRE1BOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM2M1MDUuYzogd2FybmluZywgdXNpbmcgZGVmYXVsdCBETUEgY2hhbm5lbCxcbiIpOworCQl9CisJCWlmIChpb1t0aGlzX2Rldl0gPT0gMCkgeworCQkJaWYgKHRoaXNfZGV2KSB7CisJCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXByaW50ayhLRVJOX05PVElDRSAiM2M1MDUuYzogbW9kdWxlIGF1dG9wcm9iZSBub3QgcmVjb21tZW5kZWQsIGdpdmUgaW89eHguXG4iKTsKKwkJfQorCQlpZiAoZWxwbHVzX3NldHVwKGRldikgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM2M1MDUuYzogRmFpbGVkIHRvIHJlZ2lzdGVyIGNhcmQgYXQgMHgleC5cbiIsIGlvW3RoaXNfZGV2XSk7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJYnJlYWs7CisJCX0KKwkJZGV2XzNjNTA1W3RoaXNfZGV2XSA9IGRldjsKKwkJZm91bmQrKzsKKwl9CisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXY7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBFTFBfTUFYX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfM2M1MDVbdGhpc19kZXZdOworCQlpZiAoZGV2KSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVMUF9JT19FWFRFTlQpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKworI2VuZGlmCQkJCS8qIE1PRFVMRSAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDUuaCBiL2RyaXZlcnMvbmV0LzNjNTA1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkZmVlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0LzNjNTA1LmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBkZWZpbmVzIGZvciAzQ29tIEV0aGVybGluayBQbHVzIGFkYXB0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRUxQX0RNQSAgICAgICA2CisjZGVmaW5lIEVMUF9SWF9QQ0JTICAgNAorI2RlZmluZSBFTFBfTUFYX0NBUkRTIDQKKworLyoKKyAqIEkvTyByZWdpc3RlciBvZmZzZXRzCisgKi8KKyNkZWZpbmUJUE9SVF9DT01NQU5ECTB4MDAJLyogcmVhZC93cml0ZSwgOC1iaXQgKi8KKyNkZWZpbmUJUE9SVF9TVEFUVVMJMHgwMgkvKiByZWFkIG9ubHksIDgtYml0ICovCisjZGVmaW5lCVBPUlRfQVVYRE1BCTB4MDIJLyogd3JpdGUgb25seSwgOC1iaXQgKi8KKyNkZWZpbmUJUE9SVF9EQVRBCTB4MDQJLyogcmVhZC93cml0ZSwgMTYtYml0ICovCisjZGVmaW5lCVBPUlRfQ09OVFJPTAkweDA2CS8qIHJlYWQvd3JpdGUsIDgtYml0ICovCisKKyNkZWZpbmUgRUxQX0lPX0VYVEVOVAkweDEwCS8qIHNpemUgb2YgdXNlZCBJTyByZWdpc3RlcnMgKi8KKworLyoKKyAqIGhvc3QgY29udHJvbCByZWdpc3RlcnMgYml0cworICovCisjZGVmaW5lCUFUVE4JMHg4MAkvKiBhdHRlbnRpb24gKi8KKyNkZWZpbmUJRkxTSAkweDQwCS8qIGZsdXNoIGRhdGEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BRQkweDIwCS8qIERNQSBlbmFibGUgKi8KKyNkZWZpbmUgRElSCTB4MTAJLyogZGlyZWN0aW9uICovCisjZGVmaW5lCVRDRU4JMHgwOAkvKiB0ZXJtaW5hbCBjb3VudCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lCUNNREUJMHgwNAkvKiBjb21tYW5kIHJlZ2lzdGVyIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUJSFNGMgkweDAyCS8qIGhvc3Qgc3RhdHVzIGZsYWcgMiAqLworI2RlZmluZQlIU0YxCTB4MDEJLyogaG9zdCBzdGF0dXMgZmxhZyAxICovCisKKy8qCisgKiBjb21iaW5hdGlvbnMgb2YgSFNGIGZsYWdzIHVzZWQgZm9yIFBDQiB0cmFuc21pc3Npb24KKyAqLworI2RlZmluZQlIU0ZfUENCX0FDSwlIU0YxCisjZGVmaW5lCUhTRl9QQ0JfTkFLCUhTRjIKKyNkZWZpbmUJSFNGX1BDQl9FTkQJKEhTRjJ8SFNGMSkKKyNkZWZpbmUJSFNGX1BDQl9NQVNLCShIU0YyfEhTRjEpCisKKy8qCisgKiBob3N0IHN0YXR1cyByZWdpc3RlciBiaXRzCisgKi8KKyNkZWZpbmUJSFJEWQkweDgwCS8qIGRhdGEgcmVnaXN0ZXIgcmVhZHkgKi8KKyNkZWZpbmUJSENSRQkweDQwCS8qIGNvbW1hbmQgcmVnaXN0ZXIgZW1wdHkgKi8KKyNkZWZpbmUJQUNSRgkweDIwCS8qIGFkYXB0ZXIgY29tbWFuZCByZWdpc3RlciBmdWxsICovCisvKiAjZGVmaW5lIERJUiAJMHgxMAlkaXJlY3Rpb24gLSBzYW1lIGFzIGluIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE9ORQkweDA4CS8qIERNQSBkb25lICovCisjZGVmaW5lCUFTRjMJMHgwNAkvKiBhZGFwdGVyIHN0YXR1cyBmbGFnIDMgKi8KKyNkZWZpbmUJQVNGMgkweDAyCS8qIGFkYXB0ZXIgc3RhdHVzIGZsYWcgMiAqLworI2RlZmluZQlBU0YxCTB4MDEJLyogYWRhcHRlciBzdGF0dXMgZmxhZyAxICovCisKKy8qCisgKiBjb21iaW5hdGlvbnMgb2YgQVNGIGZsYWdzIHVzZWQgZm9yIFBDQiByZWNlcHRpb24KKyAqLworI2RlZmluZQlBU0ZfUENCX0FDSwlBU0YxCisjZGVmaW5lCUFTRl9QQ0JfTkFLCUFTRjIKKyNkZWZpbmUJQVNGX1BDQl9FTkQJKEFTRjJ8QVNGMSkKKyNkZWZpbmUJQVNGX1BDQl9NQVNLCShBU0YyfEFTRjEpCisKKy8qCisgKiBob3N0IGF1eCBETUEgcmVnaXN0ZXIgYml0cworICovCisjZGVmaW5lCURNQV9CUlNUCTB4MDEJLyogRE1BIGJ1cnN0ICovCisKKy8qCisgKiBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIGFsbG93ZWQgaW4gYSBQQ0IKKyAqLworI2RlZmluZQlNQVhfUENCX0RBVEEJNjIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIHRpbWVvdXQgdmFsdWUKKyAqCXRoaXMgaXMgYSByb3VnaCB2YWx1ZSB1c2VkIGZvciBsb29wcyB0byBzdG9wIHRoZW0gZnJvbSAKKyAqCWxvY2tpbmcgdXAgdGhlIHdob2xlIG1hY2hpbmUgaW4gdGhlIGNhc2Ugb2YgZmFpbHVyZSBvcgorICoJZXJyb3IgY29uZGl0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZQlUSU1FT1VUCTMwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQQ0IgY29tbWFuZHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2VudW0geworICAvKgorICAgKiBob3N0IFBDQiBjb21tYW5kcworICAgKi8KKyAgQ01EX0NPTkZJR1VSRV9BREFQVEVSX01FTU9SWQk9IDB4MDEsCisgIENNRF9DT05GSUdVUkVfODI1ODYJCT0gMHgwMiwKKyAgQ01EX1NUQVRJT05fQUREUkVTUwkJPSAweDAzLAorICBDTURfRE1BX0RPV05MT0FECQk9IDB4MDQsCisgIENNRF9ETUFfVVBMT0FECQk9IDB4MDUsCisgIENNRF9QSU9fRE9XTkxPQUQJCT0gMHgwNiwKKyAgQ01EX1BJT19VUExPQUQJCT0gMHgwNywKKyAgQ01EX1JFQ0VJVkVfUEFDS0VUCQk9IDB4MDgsCisgIENNRF9UUkFOU01JVF9QQUNLRVQJCT0gMHgwOSwKKyAgQ01EX05FVFdPUktfU1RBVElTVElDUwk9IDB4MGEsCisgIENNRF9MT0FEX01VTFRJQ0FTVF9MSVNUCT0gMHgwYiwKKyAgQ01EX0NMRUFSX1BST0dSQU0JCT0gMHgwYywKKyAgQ01EX0RPV05MT0FEX1BST0dSQU0JCT0gMHgwZCwKKyAgQ01EX0VYRUNVVEVfUFJPR1JBTQkJPSAweDBlLAorICBDTURfU0VMRl9URVNUCQkJPSAweDBmLAorICBDTURfU0VUX1NUQVRJT05fQUREUkVTUwk9IDB4MTAsCisgIENNRF9BREFQVEVSX0lORk8JCT0gMHgxMSwKKyAgTlVNX1RSQU5TTUlUX0NNRFMsCisKKyAgLyoKKyAgICogYWRhcHRlciBQQ0IgY29tbWFuZHMKKyAgICovCisgIENNRF9DT05GSUdVUkVfQURBUFRFUl9SRVNQT05TRQk9IDB4MzEsCisgIENNRF9DT05GSUdVUkVfODI1ODZfUkVTUE9OU0UJCT0gMHgzMiwKKyAgQ01EX0FERFJFU1NfUkVTUE9OU0UJCQk9IDB4MzMsCisgIENNRF9ET1dOTE9BRF9EQVRBX1JFUVVFU1QJCT0gMHgzNCwKKyAgQ01EX1VQTE9BRF9EQVRBX1JFUVVFU1QJCT0gMHgzNSwKKyAgQ01EX1JFQ0VJVkVfUEFDS0VUX0NPTVBMRVRFCQk9IDB4MzgsCisgIENNRF9UUkFOU01JVF9QQUNLRVRfQ09NUExFVEUJCT0gMHgzOSwKKyAgQ01EX05FVFdPUktfU1RBVElTVElDU19SRVNQT05TRQk9IDB4M2EsCisgIENNRF9MT0FEX01VTFRJQ0FTVF9SRVNQT05TRQkJPSAweDNiLAorICBDTURfQ0xFQVJfUFJPR1JBTV9SRVNQT05TRQkJPSAweDNjLAorICBDTURfRE9XTkxPQURfUFJPR1JBTV9SRVNQT05TRQkJPSAweDNkLAorICBDTURfRVhFQ1VURV9SRVNQT05TRQkJCT0gMHgzZSwKKyAgQ01EX1NFTEZfVEVTVF9SRVNQT05TRQkJPSAweDNmLAorICBDTURfU0VUX0FERFJFU1NfUkVTUE9OU0UJCT0gMHg0MCwKKyAgQ01EX0FEQVBURVJfSU5GT19SRVNQT05TRQkJPSAweDQxCit9OworCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIFBDQiBkYXRhIHN0cnVjdHVyZSAqLworCisvKiBEYXRhIHVuaXRzICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICBieXRlOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgICAgd29yZDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgICAgIGR3b3JkOworCisvKiBEYXRhIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBNZW1jb25mIHsKKwl3b3JkCWNtZF9xLAorCQlyY3ZfcSwKKwkJbWNhc3QsCisJCWZyYW1lLAorCQlyY3ZfYiwKKwkJcHJvZ3M7Cit9OworCitzdHJ1Y3QgUmN2X3BrdCB7CisJd29yZAlidWZfb2ZzLAorCQlidWZfc2VnLAorCQlidWZfbGVuLAorCQl0aW1lb3V0OworfTsKKworc3RydWN0IFhtaXRfcGt0IHsKKwl3b3JkCWJ1Zl9vZnMsCisJCWJ1Zl9zZWcsCisJCXBrdF9sZW47Cit9OworCitzdHJ1Y3QgUmN2X3Jlc3AgeworCXdvcmQJYnVmX29mcywKKwkJYnVmX3NlZywKKwkJYnVmX2xlbiwKKwkJcGt0X2xlbiwKKwkJdGltZW91dCwKKwkJc3RhdHVzOworCWR3b3JkCXRpbWV0YWc7Cit9OworCitzdHJ1Y3QgWG1pdF9yZXNwIHsKKwl3b3JkCWJ1Zl9vZnMsCisJCWJ1Zl9zZWcsCisJCWNfc3RhdCwKKwkJc3RhdHVzOworfTsKKworCitzdHJ1Y3QgTmV0c3RhdCB7CisJZHdvcmQJdG90X3JlY3YsCisJCXRvdF94bWl0OworCXdvcmQJZXJyX0NSQywKKwkJZXJyX2FsaWduLAorCQllcnJfcmVzLAorCQllcnJfb3ZycnVuOworfTsKKworCitzdHJ1Y3QgU2VsZnRlc3QgeworCXdvcmQJZXJyb3I7CisJdW5pb24geworCQl3b3JkIFJPTV9ja3N1bTsKKwkJc3RydWN0IHsKKwkJCXdvcmQgb2ZzLCBzZWc7CisJCX0gUkFNOworCQl3b3JkIGk4MjU4NjsKKwl9IGZhaWx1cmU7Cit9OworCitzdHJ1Y3QgSW5mbyB7CisJYnl0ZQltaW5vcl92ZXJzLAorCQltYWpvcl92ZXJzOworCXdvcmQJUk9NX2Nrc3VtLAorCQlSQU1fc3osCisJCWZyZWVfb2ZzLAorCQlmcmVlX3NlZzsKK307CisKK3N0cnVjdCBNZW1kdW1wIHsKKyAgICAgICB3b3JkIHNpemUsCisgICAgICAgICAgICBvZmYsCisgICAgICAgICAgICBzZWc7Cit9OworCisvKgorUHJpbWFyeSBDb21tYW5kIEJsb2NrLiBUaGUgbW9zdCBpbXBvcnRhbnQgZGF0YSBzdHJ1Y3R1cmUuIEFsbCBjb21tdW5pY2F0aW9uCitiZXR3ZWVuIHRoZSBob3N0IGFuZCB0aGUgYWRhcHRlciBpcyBkb25lIHdpdGggdGhlc2UuIChFeGNlcHQgZm9yIHRoZSBhY3R1YWwKK0V0aGVybmV0IGRhdGEsIHdoaWNoIGhhcyBkaWZmZXJlbnQgcGFja2FnaW5nLikKKyovCit0eXBlZGVmIHN0cnVjdCB7CisJYnl0ZQljb21tYW5kOworCWJ5dGUJbGVuZ3RoOworCXVuaW9uCXsKKwkJc3RydWN0IE1lbWNvbmYJCW1lbWNvbmY7CisJCXdvcmQJCQljb25maWd1cmU7CisJCXN0cnVjdCBSY3ZfcGt0CQlyY3ZfcGt0OworCQlzdHJ1Y3QgWG1pdF9wa3QJCXhtaXRfcGt0OworCQlieXRlCQkJbXVsdGljYXN0WzEwXVs2XTsKKwkJYnl0ZQkJCWV0aF9hZGRyWzZdOworCQlieXRlCQkJZmFpbGVkOworCQlzdHJ1Y3QgUmN2X3Jlc3AJCXJjdl9yZXNwOworCQlzdHJ1Y3QgWG1pdF9yZXNwCXhtaXRfcmVzcDsKKwkJc3RydWN0IE5ldHN0YXQJCW5ldHN0YXQ7CisJCXN0cnVjdCBTZWxmdGVzdAkJc2VsZnRlc3Q7CisJCXN0cnVjdCBJbmZvCQlpbmZvOworCQlzdHJ1Y3QgTWVtZHVtcCAgICAJbWVtZHVtcDsKKwkJYnl0ZQkJCXJhd1s2Ml07CisJfSBkYXRhOworfSBwY2Jfc3RydWN0OworCisvKiBUaGVzZSBkZWZpbmVzIGZvciAnY29uZmlndXJlJyAqLworI2RlZmluZSBSRUNWX1NUQVRJT04JMHgwMAorI2RlZmluZSBSRUNWX0JST0FECTB4MDEKKyNkZWZpbmUgUkVDVl9NVUxUSQkweDAyCisjZGVmaW5lIFJFQ1ZfUFJPTUlTQwkweDA0CisjZGVmaW5lIE5PX0xPT1BCQUNLCTB4MDAKKyNkZWZpbmUgSU5UX0xPT1BCQUNLCTB4MDgKKyNkZWZpbmUgRVhUX0xPT1BCQUNLCTB4MTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIHN0cnVjdHVyZSB0byBob2xkIGNvbnRleHQgaW5mb3JtYXRpb24gZm9yIGFkYXB0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRE1BX0JVRkZFUl9TSVpFICAxNjAwCisjZGVmaW5lIEJBQ0tMT0dfU0laRSAgICAgIDQKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHNob3J0IGdvdFtOVU1fVFJBTlNNSVRfQ01EU107CS8qIGZsYWdzIGZvcgorCQkJCQkJICAgY29tbWFuZCBjb21wbGV0aW9uICovCisJcGNiX3N0cnVjdCB0eF9wY2I7CS8qIFBDQiBmb3IgZm9yZWdyb3VuZCBzZW5kaW5nICovCisJcGNiX3N0cnVjdCByeF9wY2I7CS8qIFBDQiBmb3IgZm9yZWdyb3VuZCByZWNlaXZpbmcgKi8KKwlwY2Jfc3RydWN0IGl0eF9wY2I7CS8qIFBDQiBmb3IgYmFja2dyb3VuZCBzZW5kaW5nICovCisJcGNiX3N0cnVjdCBpcnhfcGNiOwkvKiBQQ0IgZm9yIGJhY2tncm91bmQgcmVjZWl2aW5nICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKwl2b2lkICpkbWFfYnVmZmVyOworCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IGxlbmd0aFtCQUNLTE9HX1NJWkVdOworCQl1bnNpZ25lZCBpbnQgaW47CisJCXVuc2lnbmVkIGludCBvdXQ7CisJfSByeF9iYWNrbG9nOworCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IGRpcmVjdGlvbjsKKwkJdW5zaWduZWQgaW50IGxlbmd0aDsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkgICAgICAgIHZvaWQgKnRhcmdldDsKKwkJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOworCX0gY3VycmVudF9kbWE7CisKKwkvKiBmbGFncyAqLworCXVuc2lnbmVkIGxvbmcgc2VuZF9wY2Jfc2VtYXBob3JlOworCXVuc2lnbmVkIGxvbmcgZG1haW5nOworCXVuc2lnbmVkIGxvbmcgYnVzeTsKKworCXVuc2lnbmVkIGludCByeF9hY3RpdmU7ICAvKiBudW1iZXIgb2YgcmVjZWl2ZSBQQ0JzICovCisgICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgaGNyX3ZhbDsgIC8qIHdoYXQgd2UgdGhpbmsgdGhlIEhDUiBjb250YWlucyAqLworICAgICAgICBzcGlubG9ja190IGxvY2s7CS8qIEludGVycnVwdCB2IHR4IGxvY2sgKi8KK30gZWxwX2RldmljZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTA3LmMgYi9kcml2ZXJzL25ldC8zYzUwNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjgyODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC8zYzUwNy5jCkBAIC0wLDAgKzEsOTY1IEBACisvKiAzYzUwNy5jOiBBbiBFdGhlckxpbmsxNiBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTkzLDE5OTQgYnkgRG9uYWxkIEJlY2tlci4KKworCUNvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKwlEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKworCVRoYW5rcyBnbyB0byBqZW5uaW5nc0BNb250cm91Z2UuU01SLnNsYi5jb20gKCBQYXRyaWNrIEplbm5pbmdzKQorCWFuZCBqcnNAd29ybGQuc3RkLmNvbSAoUmljayBTbGFka2V5KSBmb3IgdGVzdGluZyBhbmQgYnVnZml4ZXMuCisJTWFyayBTYWxhemFyIDxsZXNsaWVAYWNjZXNzLmRpZ2V4Lm5ldD4gbWFkZSB0aGUgY2hhbmdlcyBmb3IgY2FyZHMgd2l0aAorCW9ubHkgMTZLIHBhY2tldCBidWZmZXJzLgorCisJVGhpbmdzIHJlbWFpbmluZyB0byBkbzoKKwlWZXJpZnkgdGhhdCB0aGUgdHggYW5kIHJ4IGJ1ZmZlcnMgZG9uJ3QgaGF2ZSBmZW5jZXBvc3QgZXJyb3JzLgorCU1vdmUgdGhlIHRoZW9yeSBvZiBvcGVyYXRpb24gYW5kIG1lbW9yeSBtYXAgZG9jdW1lbnRhdGlvbi4KKwlUaGUgc3RhdGlzdGljcyBuZWVkIHRvIGJlIHVwZGF0ZWQgY29ycmVjdGx5LgorKi8KKworI2RlZmluZSBEUlZfTkFNRQkJIjNjNTA3IgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuMTBhIgorI2RlZmluZSBEUlZfUkVMREFURQkJIjExLzE3LzIwMDEiCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisJRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiIERvbmFsZCBCZWNrZXIgKGJlY2tlckBzY3lsZC5jb20pXG4iOworCisvKgorICBTb3VyY2VzOgorCVRoaXMgZHJpdmVyIHdvdWxkbid0IGhhdmUgYmVlbiB3cml0dGVuIHdpdGggdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUKKwlDcnlud3IgZHJpdmVyIHNvdXJjZSBjb2RlLglJdCBwcm92aWRlZCBhIGtub3duLXdvcmtpbmcgaW1wbGVtZW50YXRpb24KKwl0aGF0IGZpbGxlZCBpbiB0aGUgZ2FwaW5nIGhvbGVzIG9mIHRoZSBJbnRlbCBkb2N1bWVudGF0aW9uLiAgVGhyZWUgY2hlZXJzCisJZm9yIFJ1c3MgTmVsc29uLgorCisJSW50ZWwgTWljcm9jb21tdW5pY2F0aW9ucyBEYXRhYm9vaywgVm9sLiAxLCAxOTkwLiAgSXQgcHJvdmlkZXMganVzdCBlbm91Z2gKKwlpbmZvIHRoYXQgdGhlIGNhc3VhbCByZWFkZXIgbWlnaHQgdGhpbmsgdGhhdCBpdCBkb2N1bWVudHMgdGhlIGk4MjU4NiA6LTwuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sIDIuLjcgZm9yIGRlYnVnICovCisjaWZuZGVmIE5FVF9ERUJVRworI2RlZmluZSBORVRfREVCVUcgMQorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldF9kZWJ1ZyA9IE5FVF9ERUJVRzsKKyNkZWZpbmUgZGVidWcgbmV0X2RlYnVnCisKKworLyoKKyAgCQkJRGV0YWlscyBvZiB0aGUgaTgyNTg2LgorCisgICBZb3UnbGwgcmVhbGx5IG5lZWQgdGhlIGRhdGFib29rIHRvIHVuZGVyc3RhbmQgdGhlIGRldGFpbHMgb2YgdGhpcyBwYXJ0LAorICAgYnV0IHRoZSBvdXRsaW5lIGlzIHRoYXQgdGhlIGk4MjU4NiBoYXMgdHdvIHNlcGFyYXRlIHByb2Nlc3NpbmcgdW5pdHMuCisgICBCb3RoIGFyZSBzdGFydGVkIGZyb20gYSBsaXN0IG9mIHRocmVlIGNvbmZpZ3VyYXRpb24gdGFibGVzLCBvZiB3aGljaCBvbmx5CisgICB0aGUgbGFzdCwgdGhlIFN5c3RlbSBDb250cm9sIEJsb2NrIChTQ0IpLCBpcyB1c2VkIGFmdGVyIHJlc2V0LXRpbWUuICBUaGUgU0NCCisgICBoYXMgdGhlIGZvbGxvd2luZyBmaWVsZHM6CisJCVN0YXR1cyB3b3JkCisJCUNvbW1hbmQgd29yZAorCQlUeC9Db21tYW5kIGJsb2NrIGFkZHIuCisJCVJ4IGJsb2NrIGFkZHIuCisgICBUaGUgY29tbWFuZCB3b3JkIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBjb250cm9scyBmb3IgdGhlIFR4IGFuZCBSeCB1bml0czoKKyAgKi8KKworI2RlZmluZQkgQ1VDX1NUQVJUCSAweDAxMDAKKyNkZWZpbmUJIENVQ19SRVNVTUUJIDB4MDIwMAorI2RlZmluZQkgQ1VDX1NVU1BFTkQgMHgwMzAwCisjZGVmaW5lCSBSWF9TVEFSVAkgMHgwMDEwCisjZGVmaW5lCSBSWF9SRVNVTUUJIDB4MDAyMAorI2RlZmluZQkgUlhfU1VTUEVORAkgMHgwMDMwCisKKy8qIFRoZSBSeCB1bml0IHVzZXMgYSBsaXN0IG9mIGZyYW1lIGRlc2NyaXB0b3JzIGFuZCBhIGxpc3Qgb2YgZGF0YSBidWZmZXIKKyAgIGRlc2NyaXB0b3JzLiAgV2UgdXNlIGZ1bGwtc2l6ZWQgKDE1MTggYnl0ZSkgZGF0YSBidWZmZXJzLCBzbyB0aGVyZSBpcworICAgYSBvbmUtdG8tb25lIHBhaXJpbmcgb2YgZnJhbWUgZGVzY3JpcHRvcnMgdG8gYnVmZmVyIGRlc2NyaXB0b3JzLgorCisgICBUaGUgVHggKCJjb21tYW5kIikgdW5pdCBleGVjdXRlcyBhIGxpc3Qgb2YgY29tbWFuZHMgdGhhdCBsb29rIGxpa2U6CisJCVN0YXR1cyB3b3JkCQlXcml0dGVuIGJ5IHRoZSA4MjU4NiB3aGVuIHRoZSBjb21tYW5kIGlzIGRvbmUuCisJCUNvbW1hbmQgd29yZAlDb21tYW5kIGluIGxvd2VyIDMgYml0cywgcG9zdC1jb21tYW5kIGFjdGlvbiBpbiB1cHBlciAzCisJCUxpbmsgd29yZAkJVGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgY29tbWFuZC4KKwkJUGFyYW1ldGVycwkJKGFzIG5lZWRlZCkuCisKKwlTb21lIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gdGhlIENvbW1hbmQgV29yZCBhcmU6CisgKi8KKyNkZWZpbmUgQ01EX0VPTAkJMHg4MDAwCQkJLyogVGhlIGxhc3QgY29tbWFuZCBvZiB0aGUgbGlzdCwgc3RvcC4gKi8KKyNkZWZpbmUgQ01EX1NVU1AJMHg0MDAwCQkJLyogU3VzcGVuZCBhZnRlciBkb2luZyBjbWQuICovCisjZGVmaW5lIENNRF9JTlRSCTB4MjAwMAkJCS8qIEludGVycnVwdCBhZnRlciBkb2luZyBjbWQuICovCisKK2VudW0gY29tbWFuZHMgeworCUNtZE5PcCA9IDAsIENtZFNBU2V0dXAgPSAxLCBDbWRDb25maWd1cmUgPSAyLCBDbWRNdWx0aWNhc3RMaXN0ID0gMywKKwlDbWRUeCA9IDQsIENtZFREUiA9IDUsIENtZER1bXAgPSA2LCBDbWREaWFnbm9zZSA9IDd9OworCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3N0cnVjdCBuZXRfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWludCBsYXN0X3Jlc3RhcnQ7CisJdXNob3J0IHJ4X2hlYWQ7CisJdXNob3J0IHJ4X3RhaWw7CisJdXNob3J0IHR4X2hlYWQ7CisJdXNob3J0IHR4X2NtZF9saW5rOworCXVzaG9ydCB0eF9yZWFwOworCXVzaG9ydCB0eF9wa3RzX2luX3Jpbmc7CisJc3BpbmxvY2tfdCBsb2NrOworCXZvaWQgX19pb21lbSAqYmFzZTsKK307CisKKy8qCisgIAkJRGV0YWlscyBvZiB0aGUgRXRoZXJMaW5rMTYgSW1wbGVtZW50YXRpb24KKyAgVGhlIDNjNTA3IGlzIGEgZ2VuZXJpYyBzaGFyZWQtbWVtb3J5IGk4MjU4NiBpbXBsZW1lbnRhdGlvbi4KKyAgVGhlIGhvc3QgY2FuIG1hcCAxNkssIDMySywgNDhLLCBvciA2NEsgb2YgdGhlIDY0SyBtZW1vcnkgaW50bworICAweDBbQ0RdWzA4XTAwMDAsIG9yIGFsbCA2NEsgaW50byAweEZbMDI0NjhdMDAwMC4KKyAgKi8KKworLyogT2Zmc2V0cyBmcm9tIHRoZSBiYXNlIEkvTyBhZGRyZXNzLiAqLworI2RlZmluZQlTQV9EQVRBCQkwCS8qIFN0YXRpb24gYWRkcmVzcyBkYXRhLCBvciAzQ29tIHNpZ25hdHVyZS4gKi8KKyNkZWZpbmUgTUlTQ19DVFJMCTYJLyogU3dpdGNoIHRoZSBTQV9EQVRBIGJhbmtzLCBhbmQgYnVzIGNvbmZpZyBiaXRzLiAqLworI2RlZmluZSBSRVNFVF9JUlEJMTAJLyogUmVzZXQgdGhlIGxhdGNoZWQgSVJRIGxpbmUuICovCisjZGVmaW5lIFNJR05BTF9DQQkxMQkvKiBGcm9iIHRoZSA4MjU4NiBDaGFubmVsIEF0dGVudGlvbiBsaW5lLiAqLworI2RlZmluZSBST01fQ09ORklHCTEzCisjZGVmaW5lIE1FTV9DT05GSUcJMTQKKyNkZWZpbmUgSVJRX0NPTkZJRwkxNQorI2RlZmluZSBFTDE2X0lPX0VYVEVOVCAxNgorCisvKiBUaGUgSUQgcG9ydCBpcyB1c2VkIGF0IGJvb3QtdGltZSB0byBsb2NhdGUgdGhlIGV0aGVyY2FyZC4gKi8KKyNkZWZpbmUgSURfUE9SVAkJMHgxMDAKKworLyogT2Zmc2V0cyB0byByZWdpc3RlcnMgaW4gdGhlIG1haWxib3ggKFNDQikuICovCisjZGVmaW5lIGlTQ0JfU1RBVFVTCTB4OAorI2RlZmluZSBpU0NCX0NNRAkJMHhBCisjZGVmaW5lIGlTQ0JfQ0JMCQkweEMJLyogQ29tbWFuZCBCTG9jayBvZmZzZXQuICovCisjZGVmaW5lIGlTQ0JfUkZBCQkweEUJLyogUnggRnJhbWUgQXJlYSBvZmZzZXQuICovCisKKy8qICBTaW5jZSB0aGUgM2M1MDcgbWFwcyB0aGUgc2hhcmVkIG1lbW9yeSB3aW5kb3cgc28gdGhhdCB0aGUgbGFzdCBieXRlIGlzCisJYXQgODI1ODYgYWRkcmVzcyBGRkZGLCB0aGUgZmlyc3QgYnl0ZSBpcyBhdCA4MjU4NiBhZGRyZXNzIDAsIDE2SywgMzJLLCBvcgorCTQ4SyBjb3JyZXNwb25kaW5nIHRvIHdpbmRvdyBzaXplcyBvZiA2NEssIDQ4SywgMzJLIGFuZCAxNksgcmVzcGVjdGl2ZWx5LgorCVdlIGNhbiBhY2NvdW50IGZvciB0aGlzIGJlIHNldHRpbmcgdGhlICdTQkMgQmFzZScgZW50cnkgaW4gdGhlIElTQ1AgdGFibGUKKwliZWxvdyBmb3IgYWxsIHRoZSAxNiBiaXQgb2Zmc2V0IGFkZHJlc3NlcywgYW5kIGFsc28gYWRkaW5nIHRoZSAnU0NCIEJhc2UnCisJdmFsdWUgdG8gYWxsIDI0IGJpdCBwaHlzaWNhbCBhZGRyZXNzZXMgKGluIHRoZSBTQ1AgdGFibGUgYW5kIHRoZSBUWCBhbmQgUlgKKwlCdWZmZXIgRGVzY3JpcHRvcnMpLgorCQkJCQktTWFyaworCSovCisjZGVmaW5lIFNDQl9CQVNFCQkoKHVuc2lnbmVkKTY0KjEwMjQgLSAoZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQpKQorCisvKgorICBXaGF0IGZvbGxvd3MgaW4gJ2luaXRfd29yZHNbXScgaXMgdGhlICJwcm9ncmFtIiB0aGF0IGlzIGRvd25sb2FkZWQgdG8gdGhlCisgIDgyNTg2IG1lbW9yeS4JIEl0J3MgbW9zdGx5IHRhYmxlcyBhbmQgY29tbWFuZCBibG9ja3MsIGFuZCBzdGFydHMgYXQgdGhlCisgIHJlc2V0IGFkZHJlc3MgMHhmZmZmZjYuICBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIHNpbWlsYXIgdG8gdGhlIEV0aGVyRXhwcmVzcywKKyAgdGh1cyB0aGUgdW51c3VhbCBsb2NhdGlvbiBvZiB0aGUgU0NCIGF0IDB4MDAwOC4KKworICBFdmVuIHdpdGggdGhlIGFkZGl0aW9uYWwgImRvbid0IGNhcmUiIHZhbHVlcywgZG9pbmcgaXQgdGhpcyB3YXkgdGFrZXMgbGVzcworICBwcm9ncmFtIHNwYWNlIHRoYW4gaW5pdGlhbGl6aW5nIHRoZSBpbmRpdmlkdWFsIHRhYmxlcywgYW5kIEkgZmVlbCBpdCdzIG11Y2gKKyAgY2xlYW5lci4KKworICBUaGUgZGF0YWJvb2sgaXMgcGFydGljdWxhcmx5IHVzZWxlc3MgZm9yIHRoZSBmaXJzdCB0d28gc3RydWN0dXJlcywgSSBoYWQKKyAgdG8gdXNlIHRoZSBDcnlud3IgZHJpdmVyIGFzIGFuIGV4YW1wbGUuCisKKyAgIFRoZSBtZW1vcnkgc2V0dXAgaXMgYXMgZm9sbG93czoKKyAgICovCisKKyNkZWZpbmUgQ09ORklHX0NNRAkweDAwMTgKKyNkZWZpbmUgU0VUX1NBX0NNRAkweDAwMjQKKyNkZWZpbmUgU0FfT0ZGU0VUCTB4MDAyQQorI2RlZmluZSBJRExFTE9PUAkweDMwCisjZGVmaW5lIFREUl9DTUQJCTB4MzgKKyNkZWZpbmUgVERSX1RJTUUJMHgzQworI2RlZmluZSBEVU1QX0NNRAkweDQwCisjZGVmaW5lIERJQUdfQ01ECTB4NDgKKyNkZWZpbmUgU0VUX01DX0NNRAkweDRFCisjZGVmaW5lIERVTVBfREFUQQkweDU2CS8qIEEgMTcwIGJ5dGUgYnVmZmVyIGZvciBkdW1wIGFuZCBTZXQtTUMgaW50by4gKi8KKworI2RlZmluZSBUWF9CVUZfU1RBUlQJMHgwMTAwCisjZGVmaW5lIE5VTV9UWF9CVUZTIAk1CisjZGVmaW5lIFRYX0JVRl9TSVpFIAkoMTUxOCsxNCsyMCsxNikgLyogcGFja2V0K2hlYWRlcitUQkQgKi8KKworI2RlZmluZSBSWF9CVUZfU1RBUlQJMHgyMDAwCisjZGVmaW5lIFJYX0JVRl9TSVpFIAkoMTUxOCsxNCsxOCkJLyogcGFja2V0K2hlYWRlcitSQkQgKi8KKyNkZWZpbmUgUlhfQlVGX0VORAkJKGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0KQorCisjZGVmaW5lIFRYX1RJTUVPVVQgNQorCisvKgorICBUaGF0J3MgaXQ6IG9ubHkgODYgYnl0ZXMgdG8gc2V0IHVwIHRoZSBiZWFzdCwgaW5jbHVkaW5nIGV2ZXJ5IGV4dHJhCisgIGNvbW1hbmQgYXZhaWxhYmxlLiAgVGhlIDE3MCBieXRlIGJ1ZmZlciBhdCBEVU1QX0RBVEEgaXMgc2hhcmVkIGJldHdlZW4gdGhlCisgIER1bXAgY29tbWFuZCAoY2FsbGVkIG9ubHkgYnkgdGhlIGRpYWdub3N0aWMgcHJvZ3JhbSkgYW5kIHRoZSBTZXRNdWx0aWNhc3RMaXN0CisgIGNvbW1hbmQuCisKKyAgVG8gY29tcGxldGUgdGhlIG1lbW9yeSBzZXR1cCB5b3Ugb25seSBoYXZlIHRvIHdyaXRlIHRoZSBzdGF0aW9uIGFkZHJlc3MgYXQKKyAgU0FfT0ZGU0VUIGFuZCBjcmVhdGUgdGhlIFR4ICYgUnggYnVmZmVyIGxpc3RzLgorCisgIFRoZSBUeCBjb21tYW5kIGNoYWluIGFuZCBidWZmZXIgbGlzdCBpcyBzZXR1cCBhcyBmb2xsb3dzOgorICBBIFR4IGNvbW1hbmQgdGFibGUsIHdpdGggdGhlIGRhdGEgYnVmZmVyIHBvaW50aW5nIHRvLi4uCisgIEEgVHggZGF0YSBidWZmZXIgZGVzY3JpcHRvci4gIFRoZSBwYWNrZXQgaXMgaW4gYSBzaW5nbGUgYnVmZmVyLCByYXRoZXIgdGhhbgorCWNoYWluaW5nIHRvZ2V0aGVyIHNldmVyYWwgc21hbGxlciBidWZmZXJzLgorICBBIE5vT3AgY29tbWFuZCwgd2hpY2ggaW5pdGlhbGx5IHBvaW50cyB0byBpdHNlbGYsCisgIEFuZCB0aGUgcGFja2V0IGRhdGEuCisKKyAgQSB0cmFuc21pdCBpcyBkb25lIGJ5IGZpbGxpbmcgaW4gdGhlIFR4IGNvbW1hbmQgdGFibGUgYW5kIGRhdGEgYnVmZmVyLAorICByZS13cml0aW5nIHRoZSBOb09wIGNvbW1hbmQsIGFuZCBmaW5hbGx5IGNoYW5naW5nIHRoZSBvZmZzZXQgb2YgdGhlIGxhc3QKKyAgY29tbWFuZCB0byBwb2ludCB0byB0aGUgY3VycmVudCBUeCBjb21tYW5kLiAgV2hlbiB0aGUgVHggY29tbWFuZCBpcyBmaW5pc2hlZCwKKyAgaXQganVtcHMgdG8gdGhlIE5vT3AsIHdoZW4gaXQgbG9vcHMgdW50aWwgdGhlIG5leHQgVHggY29tbWFuZCBjaGFuZ2VzIHRoZQorICAibGluayBvZmZzZXQiIGluIHRoZSBOb09wLiAgVGhpcyB3YXkgdGhlIDgyNTg2IG5ldmVyIGhhcyB0byBnbyB0aHJvdWdoIHRoZQorICBzbG93IHJlc3RhcnQgc2VxdWVuY2UuCisKKyAgVGhlIFJ4IGJ1ZmZlciBsaXN0IGlzIHNldCB1cCBpbiB0aGUgb2J2aW91cyByaW5nIHN0cnVjdHVyZS4gIFdlIGhhdmUgZW5vdWdoCisgIG1lbW9yeSAoYW5kIGxvdyBlbm91Z2ggaW50ZXJydXB0IGxhdGVuY3kpIHRoYXQgd2UgY2FuIGF2b2lkIHRoZSBjb21wbGljYXRlZAorICBSeCBidWZmZXIgbGlua2VkIGxpc3RzIGJ5IGFsd2F5IGFzc29jaWF0aW5nIGEgZnVsbC1zaXplIFJ4IGRhdGEgYnVmZmVyIHdpdGgKKyAgZWFjaCBSeCBkYXRhIGZyYW1lLgorCisgIEkgY3VycmVudCB1c2UgZm91ciB0cmFuc21pdCBidWZmZXJzIHN0YXJ0aW5nIGF0IFRYX0JVRl9TVEFSVCAoMHgwMTAwKSwgYW5kCisgIHVzZSB0aGUgcmVzdCBvZiBtZW1vcnksIGZyb20gUlhfQlVGX1NUQVJUIHRvIFJYX0JVRl9FTkQsIGZvciBSeCBidWZmZXJzLgorCisgICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbml0X3dvcmRzW10gPSB7CisJLyoJU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAoU0NQKS4gKi8KKwkweDAwMDAsCQkJCQkvKiBTZXQgYnVzIHNpemUgdG8gMTYgYml0cy4gKi8KKwkwLDAsCQkJCQkvKiBwYWQgd29yZHMuICovCisJMHgwMDAwLDB4MDAwMCwJCQkvKiBJU0NQIHBoeXMgYWRkciwgc2V0IGluIGluaXRfODI1ODZfbWVtKCkuICovCisKKwkvKglJbnRlcm1lZGlhdGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAoSVNDUCkuICovCisJMHgwMDAxLAkJCQkJLyogU3RhdHVzIHdvcmQgdGhhdCdzIGNsZWFyZWQgd2hlbiBpbml0IGlzIGRvbmUuICovCisJMHgwMDA4LDAsMCwJCQkJLyogU0NCIG9mZnNldCwgKHNraXAsIHNraXApICovCisKKwkvKiBTeXN0ZW0gQ29udHJvbCBCbG9jayAoU0NCKS4gKi8KKwkwLDB4ZjAwMHxSWF9TVEFSVHxDVUNfU1RBUlQsCS8qIFNDQiBzdGF0dXMgYW5kIGNtZC4gKi8KKwlDT05GSUdfQ01ELAkJCQkvKiBDb21tYW5kIGxpc3QgcG9pbnRlciwgcG9pbnRzIHRvIENvbmZpZ3VyZS4gKi8KKwlSWF9CVUZfU1RBUlQsCQkJCS8qIFJ4IGJsb2NrIGxpc3QuICovCisJMCwwLDAsMCwJCQkJLyogRXJyb3IgY291bnQ6IENSQywgYWxpZ24sIGJ1ZmZlciwgb3ZlcnJ1bi4gKi8KKworCS8qIDB4MDAxODogQ29uZmlndXJlIGNvbW1hbmQuICBDaGFuZ2UgdG8gcHV0IE1BQyBkYXRhIHdpdGggcGFja2V0LiAqLworCTAsIENtZENvbmZpZ3VyZSwJCS8qIFN0YXR1cywgY29tbWFuZC4JCSovCisJU0VUX1NBX0NNRCwJCQkJLyogTmV4dCBjb21tYW5kIGlzIFNldCBTdGF0aW9uIEFkZHIuICovCisJMHgwODA0LAkJCQkJLyogIjQiIGJ5dGVzIG9mIGNvbmZpZyBkYXRhLCA4IGJ5dGUgRklGTy4gKi8KKwkweDJlNDAsCQkJCQkvKiBNYWdpYyB2YWx1ZXMsIGluY2x1ZGluZyBNQUMgZGF0YSBsb2NhdGlvbi4gKi8KKwkwLAkJCQkJCS8qIFVudXNlZCBwYWQgd29yZC4gKi8KKworCS8qIDB4MDAyNDogU2V0dXAgc3RhdGlvbiBhZGRyZXNzIGNvbW1hbmQuICovCisJMCwgQ21kU0FTZXR1cCwKKwlTRVRfTUNfQ01ELAkJCQkvKiBOZXh0IGNvbW1hbmQuICovCisJMHhhYTAwLDB4YjAwMCwweDBiYWQsCS8qIFN0YXRpb24gYWRkcmVzcyAodG8gYmUgZmlsbGVkIGluKSAqLworCisJLyogMHgwMDMwOiBOT1AsIGxvb3BpbmcgYmFjayB0byBpdHNlbGYuCSBQb2ludCB0byBmaXJzdCBUeCBidWZmZXIgdG8gVHguICovCisJMCwgQ21kTk9wLCBJRExFTE9PUCwgMCAvKiBwYWQgKi8sCisKKwkvKiAweDAwMzg6IEEgdW51c2VkIFRpbWUtRG9tYWluIFJlZmxlY3RvbWV0ZXIgY29tbWFuZC4gKi8KKwkwLCBDbWRURFIsIElETEVMT09QLCAwLAorCisJLyogMHgwMDQwOiBBbiB1bnVzZWQgRHVtcCBTdGF0ZSBjb21tYW5kLiAqLworCTAsIENtZER1bXAsIElETEVMT09QLCBEVU1QX0RBVEEsCisKKwkvKiAweDAwNDg6IEFuIHVudXNlZCBEaWFnbm9zZSBjb21tYW5kLiAqLworCTAsIENtZERpYWdub3NlLCBJRExFTE9PUCwKKworCS8qIDB4MDA0RTogQW4gZW1wdHkgc2V0LW11bHRpY2FzdC1saXN0IGNvbW1hbmQuICovCisJMCwgQ21kTXVsdGljYXN0TGlzdCwgSURMRUxPT1AsIDAsCit9OworCisvKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisKK3N0YXRpYyBpbnQJZWwxNl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcik7CitzdGF0aWMgaW50CWVsMTZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJZWwxNl9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBlbDE2X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGVsMTZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CWVsMTZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVsMTZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWwxNl90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgaGFyZHdhcmVfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYnVmLCBzaG9ydCBsZW5ndGgsIHNob3J0IHBhZCk7CitzdGF0aWMgdm9pZCBpbml0XzgyNTg2X21lbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworc3RhdGljIHZvaWQgaW5pdF9yeF9idWZzKHN0cnVjdCBuZXRfZGV2aWNlICopOworCitzdGF0aWMgaW50IGlvID0gMHgzMDA7CitzdGF0aWMgaW50IGlycTsKK3N0YXRpYyBpbnQgbWVtX3N0YXJ0OworCisMCisvKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0b3Igb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZmYgb25lIGV4aXN0cy4KKwlJZiBkZXYtPmJhc2VfYWRkciA9PSAwLCBwcm9iZSBhbGwgbGlrZWx5IGxvY2F0aW9ucy4KKwlJZiBkZXYtPmJhc2VfYWRkciA9PSAxLCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCisJSWYgZGV2LT5iYXNlX2FkZHIgPT0gMiwgKGRldGFjaGFibGUgZGV2aWNlcyBvbmx5KSBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlCisJZGV2aWNlIGFuZCByZXR1cm4gc3VjY2Vzcy4KKwkqLworCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBlbDE2X3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCXN0YXRpYyB1bnNpZ25lZCBwb3J0c1tdID0geyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDI4MCwgMH07CisJdW5zaWduZWQgKnBvcnQ7CisJaW50IGVyciA9IC1FTk9ERVY7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwkJaW8gPSBkZXYtPmJhc2VfYWRkcjsKKwkJaXJxID0gZGV2LT5pcnE7CisJCW1lbV9zdGFydCA9IGRldi0+bWVtX3N0YXJ0ICYgMTU7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKGlvID4gMHgxZmYpIAkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCWVyciA9IGVsMTZfcHJvYmUxKGRldiwgaW8pOworCWVsc2UgaWYgKGlvICE9IDApCisJCWVyciA9IC1FTlhJTzsJCS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwllbHNlIHsKKwkJZm9yIChwb3J0ID0gcG9ydHM7ICpwb3J0OyBwb3J0KyspIHsKKwkJCWVyciA9IGVsMTZfcHJvYmUxKGRldiwgKnBvcnQpOworCQkJaWYgKCFlcnIpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJaW91bm1hcCgoKHN0cnVjdCBuZXRfbG9jYWwgKiluZXRkZXZfcHJpdihkZXYpKS0+YmFzZSk7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVMMTZfSU9fRVhURU5UKTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGVsMTZfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgaW5pdF9JRF9kb25lLCB2ZXJzaW9uX3ByaW50ZWQ7CisJaW50IGksIGlycSwgaXJxdmFsLCByZXR2YWw7CisJc3RydWN0IG5ldF9sb2NhbCAqbHA7CisKKwlpZiAoaW5pdF9JRF9kb25lID09IDApIHsKKwkJdXNob3J0IGxyc19zdGF0ZSA9IDB4ZmY7CisJCS8qIFNlbmQgdGhlIElEIHNlcXVlbmNlIHRvIHRoZSBJRF9QT1JUIHRvIGVuYWJsZSB0aGUgYm9hcmQocykuICovCisJCW91dGIoMHgwMCwgSURfUE9SVCk7CisJCWZvcihpID0gMDsgaSA8IDI1NTsgaSsrKSB7CisJCQlvdXRiKGxyc19zdGF0ZSwgSURfUE9SVCk7CisJCQlscnNfc3RhdGUgPDw9IDE7CisJCQlpZiAobHJzX3N0YXRlICYgMHgxMDApCisJCQkJbHJzX3N0YXRlIF49IDB4ZTc7CisJCX0KKwkJb3V0YigweDAwLCBJRF9QT1JUKTsKKwkJaW5pdF9JRF9kb25lID0gMTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgRUwxNl9JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKGluYihpb2FkZHIpICE9ICcqJykgfHwgKGluYihpb2FkZHIgKyAxKSAhPSAnMycpIHx8IAorCSAgICAoaW5iKGlvYWRkciArIDIpICE9ICdDJykgfHwgKGluYihpb2FkZHIgKyAzKSAhPSAnTycpKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChuZXRfZGVidWcgICYmICB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwlwcmludGsoIiVzOiAzYzUwNyBhdCAlI3gsIiwgZGV2LT5uYW1lLCBpb2FkZHIpOworCisJLyogV2Ugc2hvdWxkIG1ha2UgYSBmZXcgbW9yZSBjaGVja3MgaGVyZSwgbGlrZSB0aGUgZmlyc3QgdGhyZWUgb2N0ZXRzIG9mCisJICAgdGhlIFMuQS4gZm9yIHRoZSBtYW51ZmFjdHVyZXIncyBjb2RlLiAqLworCisJaXJxID0gaW5iKGlvYWRkciArIElSUV9DT05GSUcpICYgMHgwZjsKKworCWlycXZhbCA9IHJlcXVlc3RfaXJxKGlycSwgJmVsMTZfaW50ZXJydXB0LCAwLCBEUlZfTkFNRSwgZGV2KTsKKwlpZiAoaXJxdmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiM2M1MDc6IHVuYWJsZSB0byBnZXQgSVJRICVkIChpcnF2YWw9JWQpLlxuIiwgaXJxLCBpcnF2YWwpOworCQlyZXR2YWwgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBXZSd2ZSBjb21taXR0ZWQgdG8gdXNpbmcgdGhlIGJvYXJkLCBhbmQgY2FuIHN0YXJ0IGZpbGxpbmcgaW4gKmRldi4gKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworCW91dGIoMHgwMSwgaW9hZGRyICsgTUlTQ19DVFJMKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgaSk7CisJCXByaW50aygiICUwMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisKKwlpZiAobWVtX3N0YXJ0KQorCQluZXRfZGVidWcgPSBtZW1fc3RhcnQgJiA3OworCisjaWZkZWYgTUVNX0JBU0UKKwlkZXYtPm1lbV9zdGFydCA9IE1FTV9CQVNFOworCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgMHgxMDAwMDsKKyNlbHNlCisJeworCQlpbnQgYmFzZTsKKwkJaW50IHNpemU7CisJCWNoYXIgbWVtX2NvbmZpZyA9IGluYihpb2FkZHIgKyBNRU1fQ09ORklHKTsKKwkJaWYgKG1lbV9jb25maWcgJiAweDIwKSB7CisJCQlzaXplID0gNjQqMTAyNDsKKwkJCWJhc2UgPSAweGYwMDAwMCArIChtZW1fY29uZmlnICYgMHgwOCA/IDB4MDgwMDAwCisJCQkJCQkJICAgOiAoKG1lbV9jb25maWcgJiAzKSA8PCAxNykpOworCQl9IGVsc2UgeworCQkJc2l6ZSA9ICgobWVtX2NvbmZpZyAmIDMpICsgMSkgPDwgMTQ7CisJCQliYXNlID0gMHgwYzAwMDAgKyAoIChtZW1fY29uZmlnICYgMHgxOCkgPDwgMTIpOworCQl9CisJCWRldi0+bWVtX3N0YXJ0ID0gYmFzZTsKKwkJZGV2LT5tZW1fZW5kID0gYmFzZSArIHNpemU7CisJfQorI2VuZGlmCisKKwlkZXYtPmlmX3BvcnQgPSAoaW5iKGlvYWRkciArIFJPTV9DT05GSUcpICYgMHg4MCkgPyAxIDogMDsKKwlkZXYtPmlycSA9IGluYihpb2FkZHIgKyBJUlFfQ09ORklHKSAmIDB4MGY7CisKKwlwcmludGsoIiwgSVJRICVkLCAlc3Rlcm5hbCB4Y3ZyLCBtZW1vcnkgJSNseC0lI2x4LlxuIiwgZGV2LT5pcnEsCisJCSAgIGRldi0+aWZfcG9ydCA/ICJleCIgOiAiaW4iLCBkZXYtPm1lbV9zdGFydCwgZGV2LT5tZW1fZW5kLTEpOworCisJaWYgKG5ldF9kZWJ1ZykKKwkJcHJpbnRrKHZlcnNpb24pOworCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworIAltZW1zZXQobHAsIDAsIHNpemVvZigqbHApKTsKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCWxwLT5iYXNlID0gaW9yZW1hcChkZXYtPm1lbV9zdGFydCwgUlhfQlVGX0VORCk7CisJaWYgKCFscC0+YmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgIjNjNTA3OiB1bmFibGUgdG8gcmVtYXAgbWVtb3J5XG4iKTsKKwkJcmV0dmFsID0gLUVBR0FJTjsKKwkJZ290byBvdXQxOworCX0KKworIAlkZXYtPm9wZW4gPSBlbDE2X29wZW47CisgCWRldi0+c3RvcCA9IGVsMTZfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBlbDE2X3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzCT0gZWwxNl9nZXRfc3RhdHM7CisJZGV2LT50eF90aW1lb3V0ID0gZWwxNl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCWRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOworIAlkZXYtPmZsYWdzICY9IH5JRkZfTVVMVElDQVNUOwkvKiBNdWx0aWNhc3QgZG9lc24ndCB3b3JrICovCisJcmV0dXJuIDA7CitvdXQxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgRUwxNl9JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZWwxNl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogSW5pdGlhbGl6ZSB0aGUgODI1ODYgbWVtb3J5IGFuZCBzdGFydCBpdC4gKi8KKwlpbml0XzgyNTg2X21lbShkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBlbDE2X3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl2b2lkIF9faW9tZW0gKnNobWVtID0gbHAtPmJhc2U7CisKKwlpZiAobmV0X2RlYnVnID4gMSkKKwkJcHJpbnRrICgiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/ICAiLCBkZXYtPm5hbWUsCisJCQlyZWFkdyhzaG1lbSArIGlTQ0JfU1RBVFVTKSAmIDB4ODAwMCA/ICJJUlEgY29uZmxpY3QiIDoKKwkJCSJuZXR3b3JrIGNhYmxlIHByb2JsZW0iKTsKKwkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvci4gKi8KKwlpZiAobHAtPmxhc3RfcmVzdGFydCA9PSBscC0+c3RhdHMudHhfcGFja2V0cykgeworCQlpZiAobmV0X2RlYnVnID4gMSkKKwkJCXByaW50ayAoIlJlc2V0dGluZyBib2FyZC5cbiIpOworCQkvKiBDb21wbGV0ZWx5IHJlc2V0IHRoZSBhZGFwdG9yLiAqLworCQlpbml0XzgyNTg2X21lbSAoZGV2KTsKKwkJbHAtPnR4X3BrdHNfaW5fcmluZyA9IDA7CisJfSBlbHNlIHsKKwkJLyogSXNzdWUgdGhlIGNoYW5uZWwgYXR0ZW50aW9uIHNpZ25hbCBhbmQgaG9wZSBpdCAiZ2V0cyBiZXR0ZXIiLiAqLworCQlpZiAobmV0X2RlYnVnID4gMSkKKwkJCXByaW50ayAoIktpY2tpbmcgYm9hcmQuXG4iKTsKKwkJd3JpdGV3KDB4ZjAwMCB8IENVQ19TVEFSVCB8IFJYX1NUQVJULCBzaG1lbSArIGlTQ0JfQ01EKTsKKwkJb3V0YiAoMCwgaW9hZGRyICsgU0lHTkFMX0NBKTsJLyogSXNzdWUgY2hhbm5lbC1hdHRuLiAqLworCQlscC0+bGFzdF9yZXN0YXJ0ID0gbHAtPnN0YXRzLnR4X3BhY2tldHM7CisJfQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUgKGRldik7Cit9CisKKworc3RhdGljIGludCBlbDE2X3NlbmRfcGFja2V0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCBsZW5ndGggPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBza2ItPmRhdGE7CisKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZscC0+bG9jaywgZmxhZ3MpOworCisJbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxlbmd0aDsKKwkvKiBEaXNhYmxlIHRoZSA4MjU4NidzIGlucHV0IHRvIHRoZSBpbnRlcnJ1cHQgbGluZS4gKi8KKwlvdXRiICgweDgwLCBpb2FkZHIgKyBNSVNDX0NUUkwpOworCisJaGFyZHdhcmVfc2VuZF9wYWNrZXQgKGRldiwgYnVmLCBza2ItPmxlbiwgbGVuZ3RoIC0gc2tiLT5sZW4pOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJLyogRW5hYmxlIHRoZSA4MjU4NiBpbnRlcnJ1cHQgaW5wdXQuICovCisJb3V0YiAoMHg4NCwgaW9hZGRyICsgTUlTQ19DVFJMKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZscC0+bG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKworCS8qIFlvdSBtaWdodCBuZWVkIHRvIGNsZWFuIHVwIGFuZCByZWNvcmQgVHggc3RhdGlzdGljcyBoZXJlLiAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCVRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisJSGFuZGxlIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpbnRlcnJ1cHRzLiAqLworc3RhdGljIGlycXJldHVybl90IGVsMTZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKwlpbnQgaW9hZGRyLCBzdGF0dXMsIGJvZ3VzY291bnQgPSAwOworCXVzaG9ydCBhY2tfY21kID0gMDsKKwl2b2lkIF9faW9tZW0gKnNobWVtOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayAoIm5ldF9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJc2htZW0gPSBscC0+YmFzZTsKKworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCisJc3RhdHVzID0gcmVhZHcoc2htZW0raVNDQl9TVEFUVVMpOworCisJaWYgKG5ldF9kZWJ1ZyA+IDQpIHsKKwkJcHJpbnRrKCIlczogM2M1MDcgaW50ZXJydXB0LCBzdGF0dXMgJTQuNHguXG4iLCBkZXYtPm5hbWUsIHN0YXR1cyk7CisJfQorCisJLyogRGlzYWJsZSB0aGUgODI1ODYncyBpbnB1dCB0byB0aGUgaW50ZXJydXB0IGxpbmUuICovCisJb3V0YigweDgwLCBpb2FkZHIgKyBNSVNDX0NUUkwpOworCisJLyogUmVhcCB0aGUgVHggcGFja2V0IGJ1ZmZlcnMuICovCisJd2hpbGUgKGxwLT50eF9wa3RzX2luX3JpbmcpIHsKKwkgIHVuc2lnbmVkIHNob3J0IHR4X3N0YXR1cyA9IHJlYWR3KHNobWVtK2xwLT50eF9yZWFwKTsKKwkgIGlmICghKHR4X3N0YXR1cyAmIDB4ODAwMCkpIHsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDUpIAorCQkJcHJpbnRrKCJUeCBjb21tYW5kIGluY29tcGxldGUgKCUjeCkuXG4iLCBscC0+dHhfcmVhcCk7CisJCWJyZWFrOworCSAgfQorCSAgLyogVHggdW5zdWNjZXNzZnVsIG9yIHNvbWUgaW50ZXJlc3Rpbmcgc3RhdHVzIGJpdCBzZXQuICovCisJICBpZiAoISh0eF9zdGF0dXMgJiAweDIwMDApIHx8ICh0eF9zdGF0dXMgJiAweDBmM2YpKSB7CisJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJaWYgKHR4X3N0YXR1cyAmIDB4MDYwMCkgIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQlpZiAodHhfc3RhdHVzICYgMHgwMTAwKSAgbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCWlmICghKHR4X3N0YXR1cyAmIDB4MDA0MCkpICBscC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQlpZiAodHhfc3RhdHVzICYgMHgwMDIwKSAgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IHR4X3N0YXR1cyAmIDB4ZjsKKwkgIH0KKwkgIGxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJICBpZiAobmV0X2RlYnVnID4gNSkKKwkJICBwcmludGsoIlJlYXBlZCAleCwgVHggc3RhdHVzICUwNHguXG4iICwgbHAtPnR4X3JlYXAsIHR4X3N0YXR1cyk7CisJICBscC0+dHhfcmVhcCArPSBUWF9CVUZfU0laRTsKKwkgIGlmIChscC0+dHhfcmVhcCA+IFJYX0JVRl9TVEFSVCAtIFRYX0JVRl9TSVpFKQorCQlscC0+dHhfcmVhcCA9IFRYX0JVRl9TVEFSVDsKKworCSAgbHAtPnR4X3BrdHNfaW5fcmluZy0tOworCSAgLyogVGhlcmUgaXMgYWx3YXlzIG1vcmUgc3BhY2UgaW4gdGhlIFR4IHJpbmcgYnVmZmVyIG5vdy4gKi8KKwkgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCSAgaWYgKCsrYm9ndXNjb3VudCA+IDEwKQorCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdHVzICYgMHg0MDAwKSB7IC8qIFBhY2tldCByZWNlaXZlZC4gKi8KKwkJaWYgKG5ldF9kZWJ1ZyA+IDUpCisJCQlwcmludGsoIlJlY2VpdmVkIHBhY2tldCwgcnhfaGVhZCAlMDR4LlxuIiwgbHAtPnJ4X2hlYWQpOworCQllbDE2X3J4KGRldik7CisJfQorCisJLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCBzb3VyY2VzLiAqLworCWFja19jbWQgPSBzdGF0dXMgJiAweGYwMDA7CisKKwlpZiAoKHN0YXR1cyAmIDB4MDcwMCkgIT0gMHgwMjAwICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlpZiAobmV0X2RlYnVnKQorCQkJcHJpbnRrKCIlczogQ29tbWFuZCB1bml0IHN0b3BwZWQsIHN0YXR1cyAlMDR4LCByZXN0YXJ0aW5nLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCS8qIElmIHRoaXMgZXZlciBvY2N1cnMgd2Ugc2hvdWxkIHJlYWxseSByZS13cml0ZSB0aGUgaWRsZSBsb29wLCByZXNldAorCQkgICB0aGUgVHggbGlzdCwgYW5kIGRvIGEgY29tcGxldGUgcmVzdGFydCBvZiB0aGUgY29tbWFuZCB1bml0LgorCQkgICBGb3Igbm93IHdlIHJlbHkgb24gdGhlIFR4IHRpbWVvdXQgaWYgdGhlIHJlc3VtZSBkb2Vzbid0IHdvcmsuICovCisJCWFja19jbWQgfD0gQ1VDX1JFU1VNRTsKKwl9CisKKwlpZiAoKHN0YXR1cyAmIDB4MDA3MCkgIT0gMHgwMDQwICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkvKiBUaGUgUnggdW5pdCBpcyBub3QgcmVhZHksIGl0IG11c3QgYmUgaHVuZy4gIFJlc3RhcnQgdGhlIHJlY2VpdmVyIGJ5CisJCSAgIGluaXRpYWxpemluZyB0aGUgcnggYnVmZmVycywgYW5kIGlzc3VpbmcgYW4gUnggc3RhcnQgY29tbWFuZC4gKi8KKwkJaWYgKG5ldF9kZWJ1ZykKKwkJCXByaW50aygiJXM6IFJ4IHVuaXQgc3RvcHBlZCwgc3RhdHVzICUwNHgsIHJlc3RhcnRpbmcuXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJaW5pdF9yeF9idWZzKGRldik7CisJCXdyaXRldyhSWF9CVUZfU1RBUlQsc2htZW0raVNDQl9SRkEpOworCQlhY2tfY21kIHw9IFJYX1NUQVJUOworCX0KKworCXdyaXRldyhhY2tfY21kLHNobWVtK2lTQ0JfQ01EKTsKKwlvdXRiKDAsIGlvYWRkciArIFNJR05BTF9DQSk7CQkJLyogSXNzdWUgY2hhbm5lbC1hdHRuLiAqLworCisJLyogQ2xlYXIgdGhlIGxhdGNoZWQgaW50ZXJydXB0LiAqLworCW91dGIoMCwgaW9hZGRyICsgUkVTRVRfSVJRKTsKKworCS8qIEVuYWJsZSB0aGUgODI1ODYncyBpbnRlcnJ1cHQgaW5wdXQuICovCisJb3V0YigweDg0LCBpb2FkZHIgKyBNSVNDX0NUUkwpOworCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGVsMTZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXZvaWQgX19pb21lbSAqc2htZW0gPSBscC0+YmFzZTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIEZsdXNoIHRoZSBUeCBhbmQgZGlzYWJsZSBSeC4gKi8KKwl3cml0ZXcoUlhfU1VTUEVORCB8IENVQ19TVVNQRU5ELHNobWVtK2lTQ0JfQ01EKTsKKwlvdXRiKDAsIGlvYWRkciArIFNJR05BTF9DQSk7CisKKwkvKiBEaXNhYmxlIHRoZSA4MjU4NidzIGlucHV0IHRvIHRoZSBpbnRlcnJ1cHQgbGluZS4gKi8KKwlvdXRiKDB4ODAsIGlvYWRkciArIE1JU0NfQ1RSTCk7CisKKwkvKiBXZSBhbHdheXMgcGh5c2ljYWxseSB1c2UgdGhlIElSUSBsaW5lLCBzbyB3ZSBkb24ndCBkbyBmcmVlX2lycSgpLiAqLworCisJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGhlcmUuICovCisKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCVRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IKKyAgIGNsb3NlZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWwxNl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBUb0RvOiBkZWNpZGUgaWYgdGhlcmUgYXJlIGFueSB1c2VmdWwgc3RhdGlzdGljcyBmcm9tIHRoZSBTQ0IuICovCisKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgUngtYmxvY2sgbGlzdC4gKi8KK3N0YXRpYyB2b2lkIGluaXRfcnhfYnVmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKndyaXRlX3B0cjsKKwl1bnNpZ25lZCBzaG9ydCBTQ0JfYmFzZSA9IFNDQl9CQVNFOworCisJaW50IGN1cl9yeGJ1ZiA9IGxwLT5yeF9oZWFkID0gUlhfQlVGX1NUQVJUOworCisJLyogSW5pdGlhbGl6ZSBlYWNoIFJ4IGZyYW1lICsgZGF0YSBidWZmZXIuICovCisJZG8gewkvKiBXaGlsZSB0aGVyZSBpcyByb29tIGZvciBvbmUgbW9yZS4gKi8KKworCQl3cml0ZV9wdHIgPSBscC0+YmFzZSArIGN1cl9yeGJ1ZjsKKworCQl3cml0ZXcoMHgwMDAwLHdyaXRlX3B0cik7CQkJLyogU3RhdHVzICovCisJCXdyaXRldygweDAwMDAsd3JpdGVfcHRyKz0yKTsJCQkvKiBDb21tYW5kICovCisJCXdyaXRldyhjdXJfcnhidWYgKyBSWF9CVUZfU0laRSx3cml0ZV9wdHIrPTIpOwkvKiBMaW5rICovCisJCXdyaXRldyhjdXJfcnhidWYgKyAyMix3cml0ZV9wdHIrPTIpOwkJLyogQnVmZmVyIG9mZnNldCAqLworCQl3cml0ZXcoMHgwMDAwLHdyaXRlX3B0cis9Mik7CQkJLyogUGFkIGZvciBkZXN0IGFkZHIuICovCisJCXdyaXRldygweDAwMDAsd3JpdGVfcHRyKz0yKTsKKwkJd3JpdGV3KDB4MDAwMCx3cml0ZV9wdHIrPTIpOworCQl3cml0ZXcoMHgwMDAwLHdyaXRlX3B0cis9Mik7CQkJLyogUGFkIGZvciBzb3VyY2UgYWRkci4gKi8KKwkJd3JpdGV3KDB4MDAwMCx3cml0ZV9wdHIrPTIpOworCQl3cml0ZXcoMHgwMDAwLHdyaXRlX3B0cis9Mik7CisJCXdyaXRldygweDAwMDAsd3JpdGVfcHRyKz0yKTsJCQkvKiBQYWQgZm9yIHByb3RvY29sLiAqLworCisJCXdyaXRldygweDAwMDAsd3JpdGVfcHRyKz0yKTsJCQkvKiBCdWZmZXI6IEFjdHVhbCBjb3VudCAqLworCQl3cml0ZXcoLTEsd3JpdGVfcHRyKz0yKTsJCQkvKiBCdWZmZXI6IE5leHQgKG5vbmUpLiAqLworCQl3cml0ZXcoY3VyX3J4YnVmICsgMHgyMCArIFNDQl9iYXNlLHdyaXRlX3B0cis9Mik7LyogQnVmZmVyOiBBZGRyZXNzIGxvdyAqLworCQl3cml0ZXcoMHgwMDAwLHdyaXRlX3B0cis9Mik7CisJCS8qIEZpbmFsbHksIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlci4gKi8KKwkJd3JpdGV3KDB4ODAwMCArIFJYX0JVRl9TSVpFLTB4MjAsd3JpdGVfcHRyKz0yKTsKKworCQlscC0+cnhfdGFpbCA9IGN1cl9yeGJ1ZjsKKwkJY3VyX3J4YnVmICs9IFJYX0JVRl9TSVpFOworCX0gd2hpbGUgKGN1cl9yeGJ1ZiA8PSBSWF9CVUZfRU5EIC0gUlhfQlVGX1NJWkUpOworCisJLyogVGVybWluYXRlIHRoZSBsaXN0IGJ5IHNldHRpbmcgdGhlIEVPTCBiaXQsIGFuZCB3cmFwIHRoZSBwb2ludGVyIHRvIG1ha2UKKwkgICB0aGUgbGlzdCBhIHJpbmcuICovCisJd3JpdGVfcHRyID0gbHAtPmJhc2UgKyBscC0+cnhfdGFpbCArIDI7CisJd3JpdGV3KDB4QzAwMCx3cml0ZV9wdHIpOwkJCQkvKiBDb21tYW5kLCBtYXJrIGFzIGxhc3QuICovCisJd3JpdGV3KGxwLT5yeF9oZWFkLHdyaXRlX3B0cisyKTsJCQkvKiBMaW5rICovCit9CisKK3N0YXRpYyB2b2lkIGluaXRfODI1ODZfbWVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXZvaWQgX19pb21lbSAqc2htZW0gPSBscC0+YmFzZTsKKworCS8qIEVuYWJsZSBsb29wYmFjayB0byBwcm90ZWN0IHRoZSB3aXJlIHdoaWxlIHN0YXJ0aW5nIHVwLAorCSAgIGFuZCBob2xkIHRoZSA1ODYgaW4gcmVzZXQgZHVyaW5nIHRoZSBtZW1vcnkgaW5pdGlhbGl6YXRpb24uICovCisJb3V0YigweDIwLCBpb2FkZHIgKyBNSVNDX0NUUkwpOworCisJLyogRml4IHRoZSBJU0NQIGFkZHJlc3MgYW5kIGJhc2UuICovCisJaW5pdF93b3Jkc1szXSA9IFNDQl9CQVNFOworCWluaXRfd29yZHNbN10gPSBTQ0JfQkFTRTsKKworCS8qIFdyaXRlIHRoZSB3b3JkcyBhdCAweGZmZjYgKGFkZHJlc3MtYWxpYXNlZCB0byAweGZmZmZmNikuICovCisJbWVtY3B5X3RvaW8obHAtPmJhc2UgKyBSWF9CVUZfRU5EIC0gMTAsIGluaXRfd29yZHMsIDEwKTsKKworCS8qIFdyaXRlIHRoZSB3b3JkcyBhdCAweDAwMDAuICovCisJbWVtY3B5X3RvaW8obHAtPmJhc2UsIGluaXRfd29yZHMgKyA1LCBzaXplb2YoaW5pdF93b3JkcykgLSAxMCk7CisKKwkvKiBGaWxsIGluIHRoZSBzdGF0aW9uIGFkZHJlc3MuICovCisJbWVtY3B5X3RvaW8obHAtPmJhc2UrU0FfT0ZGU0VULCBkZXYtPmRldl9hZGRyLAorCQkgICBzaXplb2YoZGV2LT5kZXZfYWRkcikpOworCisJLyogVGhlIFR4LWJsb2NrIGxpc3QgaXMgd3JpdHRlbiBhcyBuZWVkZWQuICBXZSBqdXN0IHNldCB1cCB0aGUgdmFsdWVzLiAqLworCWxwLT50eF9jbWRfbGluayA9IElETEVMT09QICsgNDsKKwlscC0+dHhfaGVhZCA9IGxwLT50eF9yZWFwID0gVFhfQlVGX1NUQVJUOworCisJaW5pdF9yeF9idWZzKGRldik7CisKKwkvKiBTdGFydCB0aGUgNTg2IGJ5IHJlbGVhc2luZyB0aGUgcmVzZXQgbGluZSwgYnV0IGxlYXZlIGxvb3BiYWNrLiAqLworCW91dGIoMHhBMCwgaW9hZGRyICsgTUlTQ19DVFJMKTsKKworCS8qIFRoaXMgd2FzIHRpbWUgY29uc3VtaW5nIHRvIHRyYWNrIGRvd246IHlvdSBuZWVkIHRvIGdpdmUgdHdvIGNoYW5uZWwKKwkgICBhdHRlbnRpb24gc2lnbmFscyB0byByZWxpYWJseSBzdGFydCB1cCB0aGUgaTgyNTg2LiAqLworCW91dGIoMCwgaW9hZGRyICsgU0lHTkFMX0NBKTsKKworCXsKKwkJaW50IGJvZ3VzY250ID0gNTA7CisJCXdoaWxlIChyZWFkdyhzaG1lbStpU0NCX1NUQVRVUykgPT0gMCkKKwkJCWlmICgtLWJvZ3VzY250ID09IDApIHsKKwkJCQlwcmludGsoIiVzOiBpODI1ODYgaW5pdGlhbGl6YXRpb24gdGltZWQgb3V0IHdpdGggc3RhdHVzICUwNHgsIgorCQkJCQkgICAiY21kICUwNHguXG4iLCBkZXYtPm5hbWUsCisJCQkJCSAgIHJlYWR3KHNobWVtK2lTQ0JfU1RBVFVTKSwgcmVhZHcoc2htZW0raVNDQl9DTUQpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJLyogSXNzdWUgY2hhbm5lbC1hdHRuIC0tIHRoZSA4MjU4NiB3b24ndCBzdGFydC4gKi8KKwkJb3V0YigwLCBpb2FkZHIgKyBTSUdOQUxfQ0EpOworCX0KKworCS8qIERpc2FibGUgbG9vcGJhY2sgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLiAqLworCW91dGIoMHg4NCwgaW9hZGRyICsgTUlTQ19DVFJMKTsKKwlpZiAobmV0X2RlYnVnID4gNCkKKwkJcHJpbnRrKCIlczogSW5pdGlhbGl6ZWQgODI1ODYsIHN0YXR1cyAlMDR4LlxuIiwgZGV2LT5uYW1lLAorCQkJICAgcmVhZHcoc2htZW0raVNDQl9TVEFUVVMpKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGhhcmR3YXJlX3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmJ1Ziwgc2hvcnQgbGVuZ3RoLCBzaG9ydCBwYWQpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVzaG9ydCB0eF9ibG9jayA9IGxwLT50eF9oZWFkOworCXZvaWQgX19pb21lbSAqd3JpdGVfcHRyID0gbHAtPmJhc2UgKyB0eF9ibG9jazsKKwlzdGF0aWMgY2hhciBwYWRkaW5nW0VUSF9aTEVOXTsKKworCS8qIFNldCB0aGUgd3JpdGUgcG9pbnRlciB0byB0aGUgVHggYmxvY2ssIGFuZCBwdXQgb3V0IHRoZSBoZWFkZXIuICovCisJd3JpdGV3KDB4MDAwMCx3cml0ZV9wdHIpOwkJCS8qIFR4IHN0YXR1cyAqLworCXdyaXRldyhDTURfSU5UUnxDbWRUeCx3cml0ZV9wdHIrPTIpOwkJLyogVHggY29tbWFuZCAqLworCXdyaXRldyh0eF9ibG9jaysxNix3cml0ZV9wdHIrPTIpOwkJLyogTmV4dCBjb21tYW5kIGlzIGEgTm9PcC4gKi8KKwl3cml0ZXcodHhfYmxvY2srOCx3cml0ZV9wdHIrPTIpOwkJCS8qIERhdGEgQnVmZmVyIG9mZnNldC4gKi8KKworCS8qIE91dHB1dCB0aGUgZGF0YSBidWZmZXIgZGVzY3JpcHRvci4gKi8KKwl3cml0ZXcoKHBhZCArIGxlbmd0aCkgfCAweDgwMDAsd3JpdGVfcHRyKz0yKTsJCS8qIEJ5dGUgY291bnQgcGFyYW1ldGVyLiAqLworCXdyaXRldygtMSx3cml0ZV9wdHIrPTIpOwkJCS8qIE5vIG5leHQgZGF0YSBidWZmZXIuICovCisJd3JpdGV3KHR4X2Jsb2NrKzIyK1NDQl9CQVNFLHdyaXRlX3B0cis9Mik7CS8qIEJ1ZmZlciBmb2xsb3dzIHRoZSBOb09wIGNvbW1hbmQuICovCisJd3JpdGV3KDB4MDAwMCx3cml0ZV9wdHIrPTIpOwkJCS8qIEJ1ZmZlciBhZGRyZXNzIGhpZ2ggYml0cyAoYWx3YXlzIHplcm8pLiAqLworCisJLyogT3V0cHV0IHRoZSBMb29wLWJhY2sgTm9PcCBjb21tYW5kLiAqLworCXdyaXRldygweDAwMDAsd3JpdGVfcHRyKz0yKTsJCQkvKiBUeCBzdGF0dXMgKi8KKwl3cml0ZXcoQ21kTk9wLHdyaXRlX3B0cis9Mik7CQkJLyogVHggY29tbWFuZCAqLworCXdyaXRldyh0eF9ibG9jaysxNix3cml0ZV9wdHIrPTIpOwkJLyogTmV4dCBpcyBteXNlbGYuICovCisKKwkvKiBPdXRwdXQgdGhlIHBhY2tldCBhdCB0aGUgd3JpdGUgcG9pbnRlci4gKi8KKwltZW1jcHlfdG9pbyh3cml0ZV9wdHIrMiwgYnVmLCBsZW5ndGgpOworCWlmIChwYWQpCisJCW1lbWNweV90b2lvKHdyaXRlX3B0citsZW5ndGgrMiwgcGFkZGluZywgcGFkKTsKKworCS8qIFNldCB0aGUgb2xkIGNvbW1hbmQgbGluayBwb2ludGluZyB0byB0aGlzIHNlbmQgcGFja2V0LiAqLworCXdyaXRldyh0eF9ibG9jayxscC0+YmFzZSArIGxwLT50eF9jbWRfbGluayk7CisJbHAtPnR4X2NtZF9saW5rID0gdHhfYmxvY2sgKyAyMDsKKworCS8qIFNldCB0aGUgbmV4dCBmcmVlIHR4IHJlZ2lvbi4gKi8KKwlscC0+dHhfaGVhZCA9IHR4X2Jsb2NrICsgVFhfQlVGX1NJWkU7CisJaWYgKGxwLT50eF9oZWFkID4gUlhfQlVGX1NUQVJUIC0gVFhfQlVGX1NJWkUpCisJCWxwLT50eF9oZWFkID0gVFhfQlVGX1NUQVJUOworCisJaWYgKG5ldF9kZWJ1ZyA+IDQpIHsKKwkJcHJpbnRrKCIlczogM2M1MDcgQCV4IHNlbmQgbGVuZ3RoID0gJWQsIHR4X2Jsb2NrICUzeCwgbmV4dCAlM3guXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb2FkZHIsIGxlbmd0aCwgdHhfYmxvY2ssIGxwLT50eF9oZWFkKTsKKwl9CisKKwkvKiBHcmltbHkgYmxvY2sgZnVydGhlciBwYWNrZXRzIGlmIHRoZXJlIGhhcyBiZWVuIGluc3VmZmljaWVudCByZWFwaW5nLiAqLworCWlmICgrK2xwLT50eF9wa3RzX2luX3JpbmcgPCBOVU1fVFhfQlVGUykgCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgZWwxNl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKnNobWVtID0gbHAtPmJhc2U7CisJdXNob3J0IHJ4X2hlYWQgPSBscC0+cnhfaGVhZDsKKwl1c2hvcnQgcnhfdGFpbCA9IGxwLT5yeF90YWlsOworCXVzaG9ydCBib2d1c2NvdW50ID0gMTA7CisJc2hvcnQgZnJhbWVfc3RhdHVzOworCisJd2hpbGUgKChmcmFtZV9zdGF0dXMgPSByZWFkdyhzaG1lbStyeF9oZWFkKSkgPCAwKSB7ICAgLyogQ29tbWFuZCBjb21wbGV0ZSAqLworCQl2b2lkIF9faW9tZW0gKnJlYWRfZnJhbWUgPSBscC0+YmFzZSArIHJ4X2hlYWQ7CisJCXVzaG9ydCByZmRfY21kID0gcmVhZHcocmVhZF9mcmFtZSsyKTsKKwkJdXNob3J0IG5leHRfcnhfZnJhbWUgPSByZWFkdyhyZWFkX2ZyYW1lKzQpOworCQl1c2hvcnQgZGF0YV9idWZmZXJfYWRkciA9IHJlYWR3KHJlYWRfZnJhbWUrNik7CisJCXZvaWQgX19pb21lbSAqZGF0YV9mcmFtZSA9IGxwLT5iYXNlICsgZGF0YV9idWZmZXJfYWRkcjsKKwkJdXNob3J0IHBrdF9sZW4gPSByZWFkdyhkYXRhX2ZyYW1lKTsKKworCQlpZiAocmZkX2NtZCAhPSAwIHx8IGRhdGFfYnVmZmVyX2FkZHIgIT0gcnhfaGVhZCArIDIyCisJCQl8fCAocGt0X2xlbiAmIDB4QzAwMCkgIT0gMHhDMDAwKSB7CisJCQlwcmludGsoIiVzOiBSeCBmcmFtZSBhdCAlI3ggY29ycnVwdGVkLCBzdGF0dXMgJTA0eCBjbWQgJTA0eCIKKwkJCQkgICAibmV4dCAlMDR4IGRhdGEtYnVmIEAlMDR4ICUwNHguXG4iLCBkZXYtPm5hbWUsIHJ4X2hlYWQsCisJCQkJICAgZnJhbWVfc3RhdHVzLCByZmRfY21kLCBuZXh0X3J4X2ZyYW1lLCBkYXRhX2J1ZmZlcl9hZGRyLAorCQkJCSAgIHBrdF9sZW4pOworCQl9IGVsc2UgaWYgKChmcmFtZV9zdGF0dXMgJiAweDIwMDApID09IDApIHsKKwkJCS8qIEZyYW1lIFJ4ZWQsIGJ1dCB3aXRoIGVycm9yLiAqLworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDgwMCkgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiAweDA0MDApIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiAweDAyMDApIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDEwMCkgbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDgwKSBscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlwa3RfbGVuICY9IDB4M2ZmZjsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbisyKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXNrYl9yZXNlcnZlKHNrYiwyKTsKKwkJCXNrYi0+ZGV2ID0gZGV2OworCisJCQkvKiAnc2tiLT5kYXRhJyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHNrX2J1ZmYgZGF0YSBhcmVhLiAqLworCQkJbWVtY3B5X2Zyb21pbyhza2JfcHV0KHNrYixwa3RfbGVuKSwgZGF0YV9mcmFtZSArIDEwLCBwa3RfbGVuKTsKKworCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisKKwkJLyogQ2xlYXIgdGhlIHN0YXR1cyB3b3JkIGFuZCBzZXQgRW5kLW9mLUxpc3Qgb24gdGhlIHJ4IGZyYW1lLiAqLworCQl3cml0ZXcoMCxyZWFkX2ZyYW1lKTsKKwkJd3JpdGV3KDB4QzAwMCxyZWFkX2ZyYW1lKzIpOworCQkvKiBDbGVhciB0aGUgZW5kLW9mLWxpc3Qgb24gdGhlIHByZXYuIFJGRC4gKi8KKwkJd3JpdGV3KDB4MDAwMCxscC0+YmFzZSArIHJ4X3RhaWwgKyAyKTsKKworCQlyeF90YWlsID0gcnhfaGVhZDsKKwkJcnhfaGVhZCA9IG5leHRfcnhfZnJhbWU7CisJCWlmICgtLWJvZ3VzY291bnQgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWxwLT5yeF9oZWFkID0gcnhfaGVhZDsKKwlscC0+cnhfdGFpbCA9IHJ4X3RhaWw7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIklTQSAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKK30KKworc3RhdGljIHUzMiBuZXRkZXZfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRlYnVnOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwlkZWJ1ZyA9IGxldmVsOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorCS5nZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IG5ldGRldl9zZXRfbXNnbGV2ZWwsCit9OworCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl8zYzUwNzsKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiRXRoZXJMaW5rMTYgSS9PIGJhc2UgYWRkcmVzcyIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICIoaWdub3JlZCkiKTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaWYgKGlvID09IDApCisJCXByaW50aygiM2M1MDc6IFlvdSBzaG91bGQgbm90IHVzZSBhdXRvLXByb2Jpbmcgd2l0aCBpbnNtb2QhXG4iKTsKKwlkZXZfM2M1MDcgPSBlbDE2X3Byb2JlKC0xKTsKKwlyZXR1cm4gSVNfRVJSKGRldl8zYzUwNykgPyBQVFJfRVJSKGRldl8zYzUwNykgOiAwOworfQorCit2b2lkCitjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfM2M1MDc7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlpb3VubWFwKCgoc3RydWN0IG5ldF9sb2NhbCAqKW5ldGRldl9wcml2KGRldikpLT5iYXNlKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRUwxNl9JT19FWFRFTlQpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisjZW5kaWYgLyogTU9EVUxFICovCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSS91c3Ivc3JjL2xpbnV4L25ldC9pbmV0IC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLW00ODYgLWMgM2M1MDcuYyIKKyAqICB2ZXJzaW9uLWNvbnRyb2w6IHQKKyAqICBrZXB0LW5ldy12ZXJzaW9uczogNQorICogIHRhYi13aWR0aDogNAorICogIGMtaW5kZW50LWxldmVsOiA0CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTA5LmMgYi9kcml2ZXJzL25ldC8zYzUwOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NDMxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC8zYzUwOS5jCkBAIC0wLDAgKzEsMTYyMiBAQAorLyogM2M1MDkuYzogQSAzYzUwOSBFdGhlckxpbmszIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguICovCisvKgorCVdyaXR0ZW4gMTk5My0yMDAwIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlDb3B5cmlnaHQgMTk5NC0yMDAwIGJ5IERvbmFsZCBCZWNrZXIuCisJQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCSBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZAorCWRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorCWluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSAzQ29tIEV0aGVyTGlua0lJSSBzZXJpZXMuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlLbm93biBsaW1pdGF0aW9uczoKKwlCZWNhdXNlIG9mIHRoZSB3YXkgM2M1MDkgSVNBIGRldGVjdGlvbiB3b3JrcyBpdCdzIGRpZmZpY3VsdCB0byBwcmVkaWN0CisJYSBwcmlvcmkgd2hpY2ggb2Ygc2V2ZXJhbCBJU0EtbW9kZSBjYXJkcyB3aWxsIGJlIGRldGVjdGVkIGZpcnN0LgorCisJVGhpcyBkcml2ZXIgZG9lcyBub3QgdXNlIHByZWRpY3RpdmUgaW50ZXJydXB0IG1vZGUsIHJlc3VsdGluZyBpbiBoaWdoZXIKKwlwYWNrZXQgbGF0ZW5jeSBidXQgbG93ZXIgb3ZlcmhlYWQuICBJZiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBmb3IgYW4KKwl1bnVzdWFsbHkgbG9uZyB0aW1lIGl0IGNvdWxkIGFsc28gcmVzdWx0IGluIG1pc3NlZCBwYWNrZXRzLCBidXQgaW4KKwlwcmFjdGljZSB0aGlzIHJhcmVseSBoYXBwZW5zLgorCisKKwlGSVhFUzoKKwkJQWxhbiBDb3g6ICAgICAgIFJlbW92ZWQgdGhlICdVbmV4cGVjdGVkIGludGVycnVwdCcgYnVnLgorCQlNaWNoYWVsIE1lc2tlczoJVXBncmFkZWQgdG8gRG9uYWxkIEJlY2tlcidzIHZlcnNpb24gMS4wNy4KKwkJQWxhbiBDb3g6CUluY3JlYXNlZCB0aGUgZWVwcm9tIGRlbGF5LiBSZWdhcmRsZXNzIG9mIAorCQkJCXdoYXQgdGhlIGRvY3Mgc2F5IHNvbWUgcGVvcGxlIGRlZmluaXRlbHkKKwkJCQlnZXQgcHJvYmxlbXMgd2l0aCBsb3dlciAoYnV0IGluIGNhcmQgc3BlYykKKwkJCQlkZWxheXMKKwkJdjEuMTAgNC8yMS85NyBGaXhlZCBtb2R1bGUgY29kZSBzbyB0aGF0IG11bHRpcGxlIGNhcmRzIG1heSBiZSBkZXRlY3RlZCwKKwkJCQlvdGhlciBjbGVhbnVwcy4gIC1kamIKKwkJQW5kcmVhIEFyY2FuZ2VsaToJVXBncmFkZWQgdG8gRG9uYWxkIEJlY2tlcidzIHZlcnNpb24gMS4xMi4KKwkJUmljayBQYXluZToJRml4ZWQgU01QIHJhY2UgY29uZGl0aW9uCisJCXYxLjEzIDkvOC85NyBNYWRlICdtYXhfaW50ZXJydXB0X3dvcmsnIGFuIGluc21vZC1zZXR0YWJsZSB2YXJpYWJsZSAtZGpiCisJCXYxLjE0IDEwLzE1Lzk3IEF2b2lkZWQgd2FpdGluZy4uZGlzY2FyZCBtZXNzYWdlIGZvciBmYXN0IG1hY2hpbmVzIC1kamIKKwkJdjEuMTUgMS8zMS85OCBGYXN0ZXIgcmVjb3ZlcnkgZm9yIFR4IGVycm9ycy4gLWRqYgorCQl2MS4xNiAyLzMvOTggRGlmZmVyZW50IElEIHBvcnQgaGFuZGxpbmcgdG8gYXZvaWQgc291bmQgY2FyZHMuIC1kamIKKwkJdjEuMTggMTJNYXIyMDAxIEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT4KKwkJCS0gQXZvaWQgYm9ndXMgZGV0ZWN0IG9mIDNjNTkwJ3MgKEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3opCisJCQktIFJldmlld2VkIGFnYWluc3QgMS4xOCBmcm9tIHNjeWxkLmNvbQorCQl2MS4xOGEgMTdOb3YyMDAxIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKwkJCS0gZXRodG9vbCBzdXBwb3J0CisJCXYxLjE4YiAxTWFyMjAwMiBad2FuZSBNd2Fpa2FtYm8gPHp3YW5lQGNvbW1maXJlc2VydmljZXMuY29tPgorCQkJLSBQb3dlciBNYW5hZ2VtZW50IHN1cHBvcnQKKwkJdjEuMThjIDFNYXIyMDAyIERhdmlkIFJ1Z2dpZXJvIDxqZHJAZmFyZmFsbGUuY29tPgorCQkJLSBGdWxsIGR1cGxleCBzdXBwb3J0CisJCXYxLjE5ICAxNk9jdDIwMDIgWndhbmUgTXdhaWthbWJvIDx6d2FuZUBsaW51eHBvd2VyLmNhPgorCQkJLSBBZGRpdGlvbmFsIGV0aHRvb2wgZmVhdHVyZXMKKwkJdjEuMTlhIDI4T2N0MjAwMiBEYXZ1ZCBSdWdnaWVybyA8amRyQGZhcmZhbGxlLmNvbT4KKwkJCS0gSW5jcmVhc2UgKnJlYWRfZWVwcm9tIHVkZWxheSB0byB3b3JrYXJvdW5kIG9vcHMgd2l0aCAyIGNhcmRzLgorCQl2MS4xOWIgMDhOb3YyMDAyIE1hcmMgWnluZ2llciA8bWF6QHdpbGQtd2luZC5mci5ldS5vcmc+CisJCSAgICAtIEludHJvZHVjZSBkcml2ZXIgbW9kZWwgZm9yIEVJU0EgY2FyZHMuCisqLworCisjZGVmaW5lIERSVl9OQU1FCSIzYzUwOSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMTliIgorI2RlZmluZSBEUlZfUkVMREFURQkiMDhOb3YyMDAyIgorCisvKiBBIGZldyB2YWx1ZXMgdGhhdCBtYXkgYmUgdHdlYWtlZC4gKi8KKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoNDAwKkhaLzEwMDApCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0LiAqLworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAxMDsKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2lmZGVmIENPTkZJR19NQ0EKKyNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2lzYXBucC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiBmb3IgdWRlbGF5KCkgKi8KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9laXNhLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworc3RhdGljIGNoYXIgdmVyc2lvbkFbXSBfX2luaXRkYXRhID0gRFJWX05BTUUgIi5jOiIgRFJWX1ZFUlNJT04gIiAiIERSVl9SRUxEQVRFICIgYmVja2VyQHNjeWxkLmNvbVxuIjsKK3N0YXRpYyBjaGFyIHZlcnNpb25CW10gX19pbml0ZGF0YSA9ICJodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrLzNjNTA5Lmh0bWxcbiI7CisKKyNpZmRlZiBFTDNfREVCVUcKK3N0YXRpYyBpbnQgZWwzX2RlYnVnID0gRUwzX0RFQlVHOworI2Vsc2UKK3N0YXRpYyBpbnQgZWwzX2RlYnVnID0gMjsKKyNlbmRpZgorCisvKiBVc2VkIHRvIGRvIGEgZ2xvYmFsIGNvdW50IG9mIGFsbCB0aGUgY2FyZHMgaW4gdGhlIHN5c3RlbS4gIE11c3QgYmUKKyAqIGEgZ2xvYmFsIHZhcmlhYmxlIHNvIHRoYXQgdGhlIG1jYS9laXNhIHByb2JlIHJvdXRpbmVzIGNhbiBpbmNyZW1lbnQKKyAqIGl0ICovCitzdGF0aWMgaW50IGVsM19jYXJkcyA9IDA7CisKKy8qIFRvIG1pbmltaXplIHRoZSBzaXplIG9mIHRoZSBkcml2ZXIgc291cmNlIEkgb25seSBkZWZpbmUgb3BlcmF0aW5nCisgICBjb25zdGFudHMgaWYgdGhleSBhcmUgdXNlZCBzZXZlcmFsIHRpbWVzLiAgWW91J2xsIG5lZWQgdGhlIG1hbnVhbAorICAgYW55d2F5IGlmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgZHJpdmVyIGRldGFpbHMuICovCisvKiBPZmZzZXRzIGZyb20gYmFzZSBJL08gYWRkcmVzcy4gKi8KKyNkZWZpbmUgRUwzX0RBVEEgMHgwMAorI2RlZmluZSBFTDNfQ01EIDB4MGUKKyNkZWZpbmUgRUwzX1NUQVRVUyAweDBlCisjZGVmaW5lCSBFRVBST01fUkVBRCAweDgwCisKKyNkZWZpbmUgRUwzX0lPX0VYVEVOVAkxNgorCisjZGVmaW5lIEVMM1dJTkRPVyh3aW5fbnVtKSBvdXR3KFNlbGVjdFdpbmRvdyArICh3aW5fbnVtKSwgaW9hZGRyICsgRUwzX0NNRCkKKworCisvKiBUaGUgdG9wIGZpdmUgYml0cyB3cml0dGVuIHRvIEVMM19DTUQgYXJlIGEgY29tbWFuZCwgdGhlIGxvd2VyCisgICAxMSBiaXRzIGFyZSB0aGUgcGFyYW1ldGVyLCBpZiBhcHBsaWNhYmxlLiAqLworZW51bSBjNTA5Y21kIHsKKwlUb3RhbFJlc2V0ID0gMDw8MTEsIFNlbGVjdFdpbmRvdyA9IDE8PDExLCBTdGFydENvYXggPSAyPDwxMSwKKwlSeERpc2FibGUgPSAzPDwxMSwgUnhFbmFibGUgPSA0PDwxMSwgUnhSZXNldCA9IDU8PDExLCBSeERpc2NhcmQgPSA4PDwxMSwKKwlUeEVuYWJsZSA9IDk8PDExLCBUeERpc2FibGUgPSAxMDw8MTEsIFR4UmVzZXQgPSAxMTw8MTEsCisJRmFrZUludHIgPSAxMjw8MTEsIEFja0ludHIgPSAxMzw8MTEsIFNldEludHJFbmIgPSAxNDw8MTEsCisJU2V0U3RhdHVzRW5iID0gMTU8PDExLCBTZXRSeEZpbHRlciA9IDE2PDwxMSwgU2V0UnhUaHJlc2hvbGQgPSAxNzw8MTEsCisJU2V0VHhUaHJlc2hvbGQgPSAxODw8MTEsIFNldFR4U3RhcnQgPSAxOTw8MTEsIFN0YXRzRW5hYmxlID0gMjE8PDExLAorCVN0YXRzRGlzYWJsZSA9IDIyPDwxMSwgU3RvcENvYXggPSAyMzw8MTEsIFBvd2VyVXAgPSAyNzw8MTEsCisJUG93ZXJEb3duID0gMjg8PDExLCBQb3dlckF1dG8gPSAyOTw8MTF9OworCitlbnVtIGM1MDlzdGF0dXMgeworCUludExhdGNoID0gMHgwMDAxLCBBZGFwdGVyRmFpbHVyZSA9IDB4MDAwMiwgVHhDb21wbGV0ZSA9IDB4MDAwNCwKKwlUeEF2YWlsYWJsZSA9IDB4MDAwOCwgUnhDb21wbGV0ZSA9IDB4MDAxMCwgUnhFYXJseSA9IDB4MDAyMCwKKwlJbnRSZXEgPSAweDAwNDAsIFN0YXRzRnVsbCA9IDB4MDA4MCwgQ21kQnVzeSA9IDB4MTAwMCwgfTsKKworLyogVGhlIFNldFJ4RmlsdGVyIGNvbW1hbmQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGNsYXNzZXM6ICovCitlbnVtIFJ4RmlsdGVyIHsKKwlSeFN0YXRpb24gPSAxLCBSeE11bHRpY2FzdCA9IDIsIFJ4QnJvYWRjYXN0ID0gNCwgUnhQcm9tID0gOCB9OworCisvKiBSZWdpc3RlciB3aW5kb3cgMSBvZmZzZXRzLCB0aGUgd2luZG93IHVzZWQgaW4gbm9ybWFsIG9wZXJhdGlvbi4gKi8KKyNkZWZpbmUgVFhfRklGTwkJMHgwMAorI2RlZmluZSBSWF9GSUZPCQkweDAwCisjZGVmaW5lIFJYX1NUQVRVUyAJMHgwOAorI2RlZmluZSBUWF9TVEFUVVMgCTB4MEIKKyNkZWZpbmUgVFhfRlJFRQkJMHgwQwkJLyogUmVtYWluaW5nIGZyZWUgYnl0ZXMgaW4gVHggYnVmZmVyLiAqLworCisjZGVmaW5lIFdOMF9DT05GX0NUUkwJMHgwNAkJLyogV2luZG93IDA6IENvbmZpZ3VyYXRpb24gY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBXTjBfQUREUl9DT05GCTB4MDYJCS8qIFdpbmRvdyAwOiBBZGRyZXNzIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgV04wX0lSUQkJMHgwOAkJLyogV2luZG93IDA6IFNldCBJUlEgbGluZSBpbiBiaXRzIDEyLTE1LiAqLworI2RlZmluZSBXTjRfTUVESUEJMHgwQQkJLyogV2luZG93IDQ6IFZhcmlvdXMgdHJhbnNjdnIvbWVkaWEgYml0cy4gKi8KKyNkZWZpbmUJTUVESUFfVFAJMHgwMEMwCQkvKiBFbmFibGUgbGluayBiZWF0IGFuZCBqYWJiZXIgZm9yIDEwYmFzZVQuICovCisjZGVmaW5lIFdONF9ORVRESUFHCTB4MDYJCS8qIFdpbmRvdyA0OiBOZXQgZGlhZ25vc3RpYyAqLworI2RlZmluZSBGRF9FTkFCTEUJMHg4MDAwCQkvKiBFbmFibGUgZnVsbC1kdXBsZXggKCJleHRlcm5hbCBsb29wYmFjayIpICovICAKKworLyoKKyAqIE11c3QgYmUgYSBwb3dlciBvZiB0d28gKHdlIHVzZSBhIGJpbmFyeSBhbmQgaW4gdGhlCisgKiBjaXJjdWxhciBxdWV1ZSkKKyAqLworI2RlZmluZSBTS0JfUVVFVUVfU0laRQk2NAorCitzdHJ1Y3QgZWwzX3ByaXZhdGUgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X2RldjsKKwlzcGlubG9ja190IGxvY2s7CisJLyogc2tiIHNlbmQtcXVldWUgKi8KKwlpbnQgaGVhZCwgc2l6ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcXVldWVbU0tCX1FVRVVFX1NJWkVdOworI2lmZGVmIENPTkZJR19QTQorCXN0cnVjdCBwbV9kZXYgKnBtZGV2OworI2VuZGlmCisJZW51bSB7CisJCUVMM19NQ0EsCisJCUVMM19QTlAsCisJCUVMM19FSVNBLAorCX0gdHlwZTsJCQkJCQkvKiB0eXBlIG9mIGRldmljZSAqLworCXN0cnVjdCBkZXZpY2UgKmRldjsKK307CitzdGF0aWMgaW50IGlkX3BvcnQgX19pbml0ZGF0YSA9IDB4MTEwOwkvKiBTdGFydCB3aXRoIDB4MTEwIHRvIGF2b2lkIG5ldyBzb3VuZCBjYXJkcy4qLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICplbDNfcm9vdF9kZXY7CisKK3N0YXRpYyB1c2hvcnQgaWRfcmVhZF9lZXByb20oaW50IGluZGV4KTsKK3N0YXRpYyB1c2hvcnQgcmVhZF9lZXByb20oaW50IGlvYWRkciwgaW50IGluZGV4KTsKK3N0YXRpYyBpbnQgZWwzX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsM19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGVsM19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVsM19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsM19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZWwzX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWwzX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWwzX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlbDNfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzOworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBlbDNfc3VzcGVuZChzdHJ1Y3QgcG1fZGV2ICpwZGV2KTsKK3N0YXRpYyBpbnQgZWwzX3Jlc3VtZShzdHJ1Y3QgcG1fZGV2ICpwZGV2KTsKK3N0YXRpYyBpbnQgZWwzX3BtX2NhbGxiYWNrKHN0cnVjdCBwbV9kZXYgKnBkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKTsKKyNlbmRpZgorLyogZ2VuZXJpYyBkZXZpY2UgcmVtb3ZlIGZvciBhbGwgZGV2aWNlIHR5cGVzICovCisjaWYgZGVmaW5lZChDT05GSUdfRUlTQSkgfHwgZGVmaW5lZChDT05GSUdfTUNBKQorc3RhdGljIGludCBlbDNfZGV2aWNlX3JlbW92ZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBlbDNfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRUlTQQorc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCBlbDNfZWlzYV9pZHNbXSA9IHsKKwkJeyAiVENNNTA5MiIgfSwKKwkJeyAiVENNNTA5MyIgfSwKKwkJeyAiIiB9Cit9OworCitzdGF0aWMgaW50IGVsM19laXNhX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOworCitzdGF0aWMgc3RydWN0IGVpc2FfZHJpdmVyIGVsM19laXNhX2RyaXZlciA9IHsKKwkJLmlkX3RhYmxlID0gZWwzX2Vpc2FfaWRzLAorCQkuZHJpdmVyICAgPSB7CisJCQkJLm5hbWUgICAgPSAiM2M1MDkiLAorCQkJCS5wcm9iZSAgID0gZWwzX2Vpc2FfcHJvYmUsCisJCQkJLnJlbW92ZSAgPSBfX2RldmV4aXRfcCAoZWwzX2RldmljZV9yZW1vdmUpCisJCX0KK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQ0EKK3N0YXRpYyBpbnQgZWwzX21jYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCitzdGF0aWMgc2hvcnQgZWwzX21jYV9hZGFwdGVyX2lkc1tdIF9faW5pdGRhdGEgPSB7CisJCTB4NjI3YywKKwkJMHg2MjdkLAorCQkweDYyZGIsCisJCTB4NjJmNiwKKwkJMHg2MmY3LAorCQkweDAwMDAKK307CisKK3N0YXRpYyBjaGFyICplbDNfbWNhX2FkYXB0ZXJfbmFtZXNbXSBfX2luaXRkYXRhID0geworCQkiM0NvbSAzYzUyOSBFdGhlckxpbmsgSUlJICgxMGJhc2UyKSIsCisJCSIzQ29tIDNjNTI5IEV0aGVyTGluayBJSUkgKDEwYmFzZVQpIiwKKwkJIjNDb20gM2M1MjkgRXRoZXJMaW5rIElJSSAodGVzdCBtb2RlKSIsCisJCSIzQ29tIDNjNTI5IEV0aGVyTGluayBJSUkgKFRQIG9yIGNvYXgpIiwKKwkJIjNDb20gM2M1MjkgRXRoZXJMaW5rIElJSSAoVFApIiwKKwkJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBtY2FfZHJpdmVyIGVsM19tY2FfZHJpdmVyID0geworCQkuaWRfdGFibGUgPSBlbDNfbWNhX2FkYXB0ZXJfaWRzLAorCQkuZHJpdmVyID0geworCQkJCS5uYW1lID0gIjNjNTI5IiwKKwkJCQkuYnVzID0gJm1jYV9idXNfdHlwZSwKKwkJCQkucHJvYmUgPSBlbDNfbWNhX3Byb2JlLAorCQkJCS5yZW1vdmUgPSBfX2RldmV4aXRfcChlbDNfZGV2aWNlX3JlbW92ZSksCisJCX0sCit9OworI2VuZGlmIC8qIENPTkZJR19NQ0EgKi8KKworI2lmIGRlZmluZWQoX19JU0FQTlBfXykKK3N0YXRpYyBzdHJ1Y3QgaXNhcG5wX2RldmljZV9pZCBlbDNfaXNhcG5wX2FkYXB0ZXJzW10gX19pbml0ZGF0YSA9IHsKKwl7CUlTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ1QnLCAnQycsICdNJyksIElTQVBOUF9GVU5DVElPTigweDUwOTApLAorCQkobG9uZykgIjNDb20gRXRoZXJsaW5rIElJSSAoVFApIiB9LAorCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignVCcsICdDJywgJ00nKSwgSVNBUE5QX0ZVTkNUSU9OKDB4NTA5MSksCisJCShsb25nKSAiM0NvbSBFdGhlcmxpbmsgSUlJIiB9LAorCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignVCcsICdDJywgJ00nKSwgSVNBUE5QX0ZVTkNUSU9OKDB4NTA5NCksCisJCShsb25nKSAiM0NvbSBFdGhlcmxpbmsgSUlJIChjb21ibykiIH0sCisJewlJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAorCQlJU0FQTlBfVkVORE9SKCdUJywgJ0MnLCAnTScpLCBJU0FQTlBfRlVOQ1RJT04oMHg1MDk1KSwKKwkJKGxvbmcpICIzQ29tIEV0aGVybGluayBJSUkgKFRQTykiIH0sCisJewlJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAorCQlJU0FQTlBfVkVORE9SKCdUJywgJ0MnLCAnTScpLCBJU0FQTlBfRlVOQ1RJT04oMHg1MDk4KSwKKwkJKGxvbmcpICIzQ29tIEV0aGVybGluayBJSUkgKFRQQykiIH0sCisJewlJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAorCQlJU0FQTlBfVkVORE9SKCdQJywgJ04nLCAnUCcpLCBJU0FQTlBfRlVOQ1RJT04oMHg4MGY3KSwKKwkJKGxvbmcpICIzQ29tIEV0aGVybGluayBJSUkgY29tcGF0aWJsZSIgfSwKKwl7CUlTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ1AnLCAnTicsICdQJyksIElTQVBOUF9GVU5DVElPTigweDgwZjgpLAorCQkobG9uZykgIjNDb20gRXRoZXJsaW5rIElJSSBjb21wYXRpYmxlIiB9LAorCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKKworc3RhdGljIHUxNiBlbDNfaXNhcG5wX3BoeXNfYWRkcls4XVszXTsKK3N0YXRpYyBpbnQgbm9wbnA7CisjZW5kaWYgLyogX19JU0FQTlBfXyAqLworCisvKiBXaXRoIHRoZSBkcml2ZXIgbW9kZWwgaW50cm9kdWN0aW9uIGZvciBFSVNBIGRldmljZXMsIGJvdGggaW5pdAorICogYW5kIGNsZWFudXAgaGF2ZSBiZWVuIHNwbGl0IDoKKyAqIC0gRUlTQSBkZXZpY2VzIHByb2JlL3JlbW92ZSBzdGFydHMgaW4gZWwzX2Vpc2FfcHJvYmUvZWwzX2RldmljZV9yZW1vdmUKKyAqIC0gTUNBL0lTQSBzdGlsbCB1c2UgZWwzX3Byb2JlCisgKgorICogQm90aCBjYWxsIGVsM19jb21tb25faW5pdC9lbDNfY29tbW9uX3JlbW92ZS4gKi8KKworc3RhdGljIGludCBfX2luaXQgZWwzX2NvbW1vbl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc2hvcnQgaTsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworCWlmIChkZXYtPm1lbV9zdGFydCAmIDB4MDUpIHsgLyogeGN2ciBjb2RlcyAxLzMvNC8xMiAqLworCQlkZXYtPmlmX3BvcnQgPSAoZGV2LT5tZW1fc3RhcnQgJiAweDBmKTsKKwl9IGVsc2UgeyAvKiB4Y3ZyIGNvZGVzIDAvOCAqLworCQkvKiB1c2UgZWVwcm9tIHZhbHVlLCBidXQgc2F2ZSB1c2VyJ3MgZnVsbC1kdXBsZXggc2VsZWN0aW9uICovCisJCWRldi0+aWZfcG9ydCB8PSAoZGV2LT5tZW1fc3RhcnQgJiAweDA4KTsKKwl9CisKKwkvKiBUaGUgRUwzLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuID0gJmVsM19vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmVsM19zdGFydF94bWl0OworCWRldi0+c3RvcCA9ICZlbDNfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmZWwzX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT50eF90aW1lb3V0ID0gZWwzX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVsM19wb2xsX2NvbnRyb2xsZXI7CisjZW5kaWYKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciAzYzV4OSBhdCAlIzMuM2x4LCBJUlEgJWQuXG4iLAorCQkJZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVMM19JT19FWFRFTlQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXsKKwkJY29uc3QgY2hhciAqaWZfbmFtZXNbXSA9IHsiMTBiYXNlVCIsICJBVUkiLCAidW5kZWZpbmVkIiwgIkJOQyJ9OworCQlwcmludGsoIiVzOiAzYzV4OSBmb3VuZCBhdCAlIzMuM2x4LCAlcyBwb3J0LCBhZGRyZXNzICIsCisJCQlkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCAKKwkJCWlmX25hbWVzWyhkZXYtPmlmX3BvcnQgJiAweDAzKV0pOworCX0KKworCS8qIFJlYWQgaW4gdGhlIHN0YXRpb24gYWRkcmVzcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiAlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiLCBJUlEgJWQuXG4iLCBkZXYtPmlycSk7CisKKwlpZiAoZWwzX2RlYnVnID4gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiIEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uQSwgdmVyc2lvbkIpOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyB2b2lkIGVsM19jb21tb25fcmVtb3ZlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJKHZvaWQpIGxwOwkJCQkvKiBLZWVwIGdjYyBxdWlldC4uLiAqLworI2lmZGVmIENPTkZJR19QTQorCWlmIChscC0+cG1kZXYpCisJCXBtX3VucmVnaXN0ZXIobHAtPnBtZGV2KTsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19JU0FQTlBfXykKKwlpZiAobHAtPnR5cGUgPT0gRUwzX1BOUCkKKwkJcG5wX2RldmljZV9kZXRhY2godG9fcG5wX2RldihscC0+ZGV2KSk7CisjZW5kaWYKKworCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFTDNfSU9fRVhURU5UKTsKKwlmcmVlX25ldGRldiAoZGV2KTsKK30KKworc3RhdGljIGludCBfX2luaXQgZWwzX3Byb2JlKGludCBjYXJkX2lkeCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHA7CisJc2hvcnQgbHJzX3N0YXRlID0gMHhmZiwgaTsKKwlpbnQgaW9hZGRyLCBpcnEsIGlmX3BvcnQ7CisJdTE2IHBoeXNfYWRkclszXTsKKwlzdGF0aWMgaW50IGN1cnJlbnRfdGFnOworCWludCBlcnIgPSAtRU5PREVWOworI2lmIGRlZmluZWQoX19JU0FQTlBfXykKKwlzdGF0aWMgaW50IHBucF9jYXJkczsKKwlzdHJ1Y3QgcG5wX2RldiAqaWRldiA9IE5VTEw7CisKKwlpZiAobm9wbnAgPT0gMSkKKwkJZ290byBub19wbnA7CisKKwlmb3IgKGk9MDsgZWwzX2lzYXBucF9hZGFwdGVyc1tpXS52ZW5kb3IgIT0gMDsgaSsrKSB7CisJCWludCBqOworCQl3aGlsZSAoKGlkZXYgPSBwbnBfZmluZF9kZXYoTlVMTCwKKwkJCQkJICAgIGVsM19pc2FwbnBfYWRhcHRlcnNbaV0udmVuZG9yLAorCQkJCQkgICAgZWwzX2lzYXBucF9hZGFwdGVyc1tpXS5mdW5jdGlvbiwKKwkJCQkJICAgIGlkZXYpKSkgeworCQkJaWYgKHBucF9kZXZpY2VfYXR0YWNoKGlkZXYpIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwbnBfYWN0aXZhdGVfZGV2KGlkZXYpIDwgMCkgeworX19hZ2FpbjoKKwkJCQlwbnBfZGV2aWNlX2RldGFjaChpZGV2KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcG5wX3BvcnRfdmFsaWQoaWRldiwgMCkgfHwgIXBucF9pcnFfdmFsaWQoaWRldiwgMCkpCisJCQkJZ290byBfX2FnYWluOworCQkJaW9hZGRyID0gcG5wX3BvcnRfc3RhcnQoaWRldiwgMCk7CisJCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgRUwzX0lPX0VYVEVOVCwgIjNjNTA5IFBuUCIpKSB7CisJCQkJcG5wX2RldmljZV9kZXRhY2goaWRldik7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJCWlycSA9IHBucF9pcnEoaWRldiwgMCk7CisJCQlpZiAoZWwzX2RlYnVnID4gMykKKwkJCQlwcmludGsgKCJJU0FQblAgcmVwb3J0cyAlcyBhdCBpL28gMHgleCwgaXJxICVkXG4iLAorCQkJCQkoY2hhciopIGVsM19pc2FwbnBfYWRhcHRlcnNbaV0uZHJpdmVyX2RhdGEsIGlvYWRkciwgaXJxKTsKKwkJCUVMM1dJTkRPVygwKTsKKwkJCWZvciAoaiA9IDA7IGogPCAzOyBqKyspCisJCQkJZWwzX2lzYXBucF9waHlzX2FkZHJbcG5wX2NhcmRzXVtqXSA9CisJCQkJCXBoeXNfYWRkcltqXSA9CisJCQkJCQlodG9ucyhyZWFkX2VlcHJvbShpb2FkZHIsIGopKTsKKwkJCWlmX3BvcnQgPSByZWFkX2VlcHJvbShpb2FkZHIsIDgpID4+IDE0OworCQkJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mIChzdHJ1Y3QgZWwzX3ByaXZhdGUpKTsKKwkJCWlmICghZGV2KSB7CisJCQkJCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgRUwzX0lPX0VYVEVOVCk7CisJCQkJCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKworCQkJU0VUX01PRFVMRV9PV05FUihkZXYpOworCQkJU0VUX05FVERFVl9ERVYoZGV2LCAmaWRldi0+ZGV2KTsKKwkJCXBucF9jYXJkcysrOworCisJCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KK25vX3BucDoKKyNlbmRpZiAvKiBfX0lTQVBOUF9fICovCisKKwkvKiBTZWxlY3QgYW4gb3BlbiBJL08gbG9jYXRpb24gYXQgMHgxKjAgdG8gZG8gY29udGVudGlvbiBzZWxlY3QuICovCisJZm9yICggOyBpZF9wb3J0IDwgMHgyMDA7IGlkX3BvcnQgKz0gMHgxMCkgeworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlkX3BvcnQsIDEsICIzYzUwOSIpKQorCQkJY29udGludWU7CisJCW91dGIoMHgwMCwgaWRfcG9ydCk7CisJCW91dGIoMHhmZiwgaWRfcG9ydCk7CisJCWlmIChpbmIoaWRfcG9ydCkgJiAweDAxKXsKKwkJCXJlbGVhc2VfcmVnaW9uKGlkX3BvcnQsIDEpOworCQkJYnJlYWs7CisJCX0gZWxzZQorCQkJcmVsZWFzZV9yZWdpb24oaWRfcG9ydCwgMSk7CisJfQorCWlmIChpZF9wb3J0ID49IDB4MjAwKSB7CisJCS8qIFJhcmUgLS0gZG8gd2UgcmVhbGx5IG5lZWQgYSB3YXJuaW5nPyAqLworCQlwcmludGsoIiBXQVJOSU5HOiBObyBJL08gcG9ydCBhdmFpbGFibGUgZm9yIDNjNTA5IGFjdGl2YXRpb24uXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogTmV4dCBjaGVjayBmb3IgYWxsIElTQSBidXMgYm9hcmRzIGJ5IHNlbmRpbmcgdGhlIElEIHNlcXVlbmNlIHRvIHRoZQorCSAgIElEX1BPUlQuICBXZSBmaW5kIGNhcmRzIHBhc3QgdGhlIGZpcnN0IGJ5IHNldHRpbmcgdGhlICdjdXJyZW50X3RhZycKKwkgICBvbiBjYXJkcyBhcyB0aGV5IGFyZSBmb3VuZC4gIENhcmRzIHdpdGggdGhlaXIgdGFnIHNldCB3aWxsIG5vdAorCSAgIHJlc3BvbmQgdG8gc3Vic2VxdWVudCBJRCBzZXF1ZW5jZXMuICovCisKKwlvdXRiKDB4MDAsIGlkX3BvcnQpOworCW91dGIoMHgwMCwgaWRfcG9ydCk7CisJZm9yKGkgPSAwOyBpIDwgMjU1OyBpKyspIHsKKwkJb3V0YihscnNfc3RhdGUsIGlkX3BvcnQpOworCQlscnNfc3RhdGUgPDw9IDE7CisJCWxyc19zdGF0ZSA9IGxyc19zdGF0ZSAmIDB4MTAwID8gbHJzX3N0YXRlIF4gMHhjZiA6IGxyc19zdGF0ZTsKKwl9CisKKwkvKiBGb3IgdGhlIGZpcnN0IHByb2JlLCBjbGVhciBhbGwgYm9hcmQncyB0YWcgcmVnaXN0ZXJzLiAqLworCWlmIChjdXJyZW50X3RhZyA9PSAwKQorCQlvdXRiKDB4ZDAsIGlkX3BvcnQpOworCWVsc2UJCQkJLyogT3RoZXJ3aXNlIGtpbGwgb2ZmIGFscmVhZHktZm91bmQgYm9hcmRzLiAqLworCQlvdXRiKDB4ZDgsIGlkX3BvcnQpOworCisJaWYgKGlkX3JlYWRfZWVwcm9tKDcpICE9IDB4NmQ1MCkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBSZWFkIGluIEVFUFJPTSBkYXRhLCB3aGljaCBkb2VzIGNvbnRlbnRpb24tc2VsZWN0LgorCSAgIE9ubHkgdGhlIGxvd2VzdCBhZGRyZXNzIGJvYXJkIHdpbGwgc3RheSAib24tbGluZSIuCisJICAgM0NvbSBnb3QgdGhlIGJ5dGUgb3JkZXIgYmFja3dhcmRzLiAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJcGh5c19hZGRyW2ldID0gaHRvbnMoaWRfcmVhZF9lZXByb20oaSkpOworCX0KKworI2lmIGRlZmluZWQoX19JU0FQTlBfXykKKwlpZiAobm9wbnAgPT0gMCkgeworCQkvKiBUaGUgSVNBIFBuUCAzYzUwOSBjYXJkcyByZXNwb25kIHRvIHRoZSBJRCBzZXF1ZW5jZS4KKwkJICAgVGhpcyBjaGVjayBpcyBuZWVkZWQgaW4gb3JkZXIgbm90IHRvIHJlZ2lzdGVyIHRoZW0gdHdpY2UuICovCisJCWZvciAoaSA9IDA7IGkgPCBwbnBfY2FyZHM7IGkrKykgeworCQkJaWYgKHBoeXNfYWRkclswXSA9PSBlbDNfaXNhcG5wX3BoeXNfYWRkcltpXVswXSAmJgorCQkJICAgIHBoeXNfYWRkclsxXSA9PSBlbDNfaXNhcG5wX3BoeXNfYWRkcltpXVsxXSAmJgorCQkJICAgIHBoeXNfYWRkclsyXSA9PSBlbDNfaXNhcG5wX3BoeXNfYWRkcltpXVsyXSkKKwkJCXsKKwkJCQlpZiAoZWwzX2RlYnVnID4gMykKKwkJCQkJcHJpbnRrKCIzYzUwOSB3aXRoIGFkZHJlc3MgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggd2FzIGZvdW5kIGJ5IElTQVBuUFxuIiwKKwkJCQkJCXBoeXNfYWRkclswXSAmIDB4ZmYsIHBoeXNfYWRkclswXSA+PiA4LAorCQkJCQkJcGh5c19hZGRyWzFdICYgMHhmZiwgcGh5c19hZGRyWzFdID4+IDgsCisJCQkJCQlwaHlzX2FkZHJbMl0gJiAweGZmLCBwaHlzX2FkZHJbMl0gPj4gOCk7CisJCQkJLyogU2V0IHRoZSBhZGFwdG9yIHRhZyBzbyB0aGF0IHRoZSBuZXh0IGNhcmQgY2FuIGJlIGZvdW5kLiAqLworCQkJCW91dGIoMHhkMCArICsrY3VycmVudF90YWcsIGlkX3BvcnQpOworCQkJCWdvdG8gbm9fcG5wOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8qIF9fSVNBUE5QX18gKi8KKworCXsKKwkJdW5zaWduZWQgaW50IGlvYmFzZSA9IGlkX3JlYWRfZWVwcm9tKDgpOworCQlpZl9wb3J0ID0gaW9iYXNlID4+IDE0OworCQlpb2FkZHIgPSAweDIwMCArICgoaW9iYXNlICYgMHgxZikgPDwgNCk7CisJfQorCWlycSA9IGlkX3JlYWRfZWVwcm9tKDkpID4+IDEyOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mIChzdHJ1Y3QgZWwzX3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQorCS8qIFNldCBwYXNzZWQtaW4gSVJRIG9yIEkvTyBBZGRyLiAqLworCWlmIChkZXYtPmlycSA+IDEgICYmICBkZXYtPmlycSA8IDE2KQorCQkJaXJxID0gZGV2LT5pcnE7CisKKwlpZiAoZGV2LT5iYXNlX2FkZHIpIHsKKwkJaWYgKGRldi0+bWVtX2VuZCA9PSAweDNjNTA5IAkvKiBNYWdpYyBrZXkgKi8KKwkJICAgICYmIGRldi0+YmFzZV9hZGRyID49IDB4MjAwICAmJiAgZGV2LT5iYXNlX2FkZHIgPD0gMHgzZTApCisJCQlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAmIDB4M2YwOworCQllbHNlIGlmIChkZXYtPmJhc2VfYWRkciAhPSBpb2FkZHIpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgRUwzX0lPX0VYVEVOVCwgIjNjNTA5IikpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTZXQgdGhlIGFkYXB0b3IgdGFnIHNvIHRoYXQgdGhlIG5leHQgY2FyZCBjYW4gYmUgZm91bmQuICovCisJb3V0YigweGQwICsgKytjdXJyZW50X3RhZywgaWRfcG9ydCk7CisKKwkvKiBBY3RpdmF0ZSB0aGUgYWRhcHRvciBhdCB0aGUgRUVQUk9NIGxvY2F0aW9uLiAqLworCW91dGIoKGlvYWRkciA+PiA0KSB8IDB4ZTAsIGlkX3BvcnQpOworCisJRUwzV0lORE9XKDApOworCWlmIChpbncoaW9hZGRyKSAhPSAweDZkNTApCisJCWdvdG8gb3V0MTsKKworCS8qIEZyZWUgdGhlIGludGVycnVwdCBzbyB0aGF0IHNvbWUgb3RoZXIgY2FyZCBjYW4gdXNlIGl0LiAqLworCW91dHcoMHgwZjAwLCBpb2FkZHIgKyBXTjBfSVJRKTsKKworI2lmIGRlZmluZWQoX19JU0FQTlBfXykKKyBmb3VuZDoJCQkJCQkJLyogUE5QIGp1bXBzIGhlcmUuLi4gKi8KKyNlbmRpZiAvKiBfX0lTQVBOUF9fICovCisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgcGh5c19hZGRyLCBzaXplb2YocGh5c19hZGRyKSk7CisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5pZl9wb3J0ID0gaWZfcG9ydDsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisjaWYgZGVmaW5lZChfX0lTQVBOUF9fKQorCWxwLT5kZXYgPSAmaWRldi0+ZGV2OworI2VuZGlmCisJZXJyID0gZWwzX2NvbW1vbl9pbml0KGRldik7CisKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisKKyNpZmRlZiBDT05GSUdfUE0KKwkvKiByZWdpc3RlciBwb3dlciBtYW5hZ2VtZW50ICovCisJbHAtPnBtZGV2ID0gcG1fcmVnaXN0ZXIoUE1fSVNBX0RFViwgY2FyZF9pZHgsIGVsM19wbV9jYWxsYmFjayk7CisJaWYgKGxwLT5wbWRldikgeworCQlzdHJ1Y3QgcG1fZGV2ICpwOworCQlwID0gbHAtPnBtZGV2OworCQlwLT5kYXRhID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2OworCX0KKyNlbmRpZgorCisJZWwzX2NhcmRzKys7CisJbHAtPm5leHRfZGV2ID0gZWwzX3Jvb3RfZGV2OworCWVsM19yb290X2RldiA9IGRldjsKKwlyZXR1cm4gMDsKKworb3V0MToKKyNpZiBkZWZpbmVkKF9fSVNBUE5QX18pCisJaWYgKGlkZXYpCisJCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworI2VuZGlmCitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgQ09ORklHX01DQQorc3RhdGljIGludCBfX2luaXQgZWwzX21jYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJLyogQmFzZWQgb24gRXJpayBOeWdyZW4ncyAobnlncmVuQG1pdC5lZHUpIDNjNTI5IHBhdGNoLAorCSAqIGhlYXZpbHkgbW9kaWZpZWQgYnkgQ2hyaXMgQmVhdXJlZ2FyZAorCSAqIChjcGJlYXVyZUBjc2NsdWIudXdhdGVybG9vLmNhKSB0byBzdXBwb3J0IHN0YW5kYXJkIE1DQQorCSAqIHByb2JpbmcuCisJICoKKwkgKiByZWRvbmUgZm9yIG11bHRpLWNhcmQgZGV0ZWN0aW9uIGJ5IFpQIEd1ICh6cGdAY2FzdGxlLm5ldCkKKwkgKiBub3cgd29ya3MgYXMgYSBtb2R1bGUgKi8KKworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHA7CisJc2hvcnQgaTsKKwlpbnQgaW9hZGRyLCBpcnEsIGlmX3BvcnQ7CisJdTE2IHBoeXNfYWRkclszXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwl1X2NoYXIgcG9zNCwgcG9zNTsKKwlzdHJ1Y3QgbWNhX2RldmljZSAqbWRldiA9IHRvX21jYV9kZXZpY2UoZGV2aWNlKTsKKwlpbnQgc2xvdCA9IG1kZXYtPnNsb3Q7CisJaW50IGVycjsKKworCXBvczQgPSBtY2FfZGV2aWNlX3JlYWRfc3RvcmVkX3BvcyhtZGV2LCA0KTsKKwlwb3M1ID0gbWNhX2RldmljZV9yZWFkX3N0b3JlZF9wb3MobWRldiwgNSk7CisKKwlpb2FkZHIgPSAoKHNob3J0KSgocG9zNCYweGZjKXwweDAyKSkgPDwgODsKKwlpcnEgPSBwb3M1ICYgMHgwZjsKKworCisJcHJpbnRrKCIzYzUyOTogZm91bmQgJXMgYXQgc2xvdCAlZFxuIiwKKwkJICAgZWwzX21jYV9hZGFwdGVyX25hbWVzW21kZXYtPmluZGV4XSwgc2xvdCArIDEpOworCisJLyogY2xhaW0gdGhlIHNsb3QgKi8KKwlzdHJuY3B5KG1kZXYtPm5hbWUsIGVsM19tY2FfYWRhcHRlcl9uYW1lc1ttZGV2LT5pbmRleF0sCisJCQlzaXplb2YobWRldi0+bmFtZSkpOworCW1jYV9kZXZpY2Vfc2V0X2NsYWltKG1kZXYsIDEpOworCisJaWZfcG9ydCA9IHBvczQgJiAweDAzOworCisJaXJxID0gbWNhX2RldmljZV90cmFuc2Zvcm1faXJxKG1kZXYsIGlycSk7CisJaW9hZGRyID0gbWNhX2RldmljZV90cmFuc2Zvcm1faW9wb3J0KG1kZXYsIGlvYWRkcik7IAorCWlmIChlbDNfZGVidWcgPiAyKSB7CisJCQlwcmludGsoIjNjNTI5OiBpcnEgJWQgIGlvYWRkciAweCV4ICBpZnBvcnQgJWRcbiIsIGlycSwgaW9hZGRyLCBpZl9wb3J0KTsKKwl9CisJRUwzV0lORE9XKDApOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCXBoeXNfYWRkcltpXSA9IGh0b25zKHJlYWRfZWVwcm9tKGlvYWRkciwgaSkpOworCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZiAoc3RydWN0IGVsM19wcml2YXRlKSk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEVMM19JT19FWFRFTlQpOworCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgcGh5c19hZGRyLCBzaXplb2YocGh5c19hZGRyKSk7CisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5pZl9wb3J0ID0gaWZfcG9ydDsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJbHAtPmRldiA9IGRldmljZTsKKwlscC0+dHlwZSA9IEVMM19NQ0E7CisJZGV2aWNlLT5kcml2ZXJfZGF0YSA9IGRldjsKKwllcnIgPSBlbDNfY29tbW9uX2luaXQoZGV2KTsKKworCWlmIChlcnIpIHsKKwkJZGV2aWNlLT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVsM19jYXJkcysrOworCXJldHVybiAwOworfQorCQkKKyNlbmRpZiAvKiBDT05GSUdfTUNBICovCisKKyNpZmRlZiBDT05GSUdfRUlTQQorc3RhdGljIGludCBfX2luaXQgZWwzX2Vpc2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwOworCXNob3J0IGk7CisJaW50IGlvYWRkciwgaXJxLCBpZl9wb3J0OworCXUxNiBwaHlzX2FkZHJbM107CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGVpc2FfZGV2aWNlICplZGV2OworCWludCBlcnI7CisKKwkvKiBZZWVwZWUsIFRoZSBkcml2ZXIgZnJhbWV3b3JrIGlzIGNhbGxpbmcgdXMgISAqLworCWVkZXYgPSB0b19laXNhX2RldmljZSAoZGV2aWNlKTsKKwlpb2FkZHIgPSBlZGV2LT5iYXNlX2FkZHI7CisJCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEVMM19JT19FWFRFTlQsICIzYzUwOSIpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogQ2hhbmdlIHRoZSByZWdpc3RlciBzZXQgdG8gdGhlIGNvbmZpZ3VyYXRpb24gd2luZG93IDAuICovCisJb3V0dyhTZWxlY3RXaW5kb3cgfCAwLCBpb2FkZHIgKyAweEM4MCArIEVMM19DTUQpOworCisJaXJxID0gaW53KGlvYWRkciArIFdOMF9JUlEpID4+IDEyOworCWlmX3BvcnQgPSBpbncoaW9hZGRyICsgNik+PjE0OworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCXBoeXNfYWRkcltpXSA9IGh0b25zKHJlYWRfZWVwcm9tKGlvYWRkciwgaSkpOworCisJLyogUmVzdG9yZSB0aGUgIlByb2R1Y3QgSUQiIHRvIHRoZSBFRVBST00gcmVhZCByZWdpc3Rlci4gKi8KKwlyZWFkX2VlcHJvbShpb2FkZHIsIDMpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mIChzdHJ1Y3QgZWwzX3ByaXZhdGUpKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBFTDNfSU9fRVhURU5UKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBwaHlzX2FkZHIsIHNpemVvZihwaHlzX2FkZHIpKTsKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKwlkZXYtPmlmX3BvcnQgPSBpZl9wb3J0OworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlscC0+ZGV2ID0gZGV2aWNlOworCWxwLT50eXBlID0gRUwzX0VJU0E7CisJZWlzYV9zZXRfZHJ2ZGF0YSAoZWRldiwgZGV2KTsKKwllcnIgPSBlbDNfY29tbW9uX2luaXQoZGV2KTsKKworCWlmIChlcnIpIHsKKwkJZWlzYV9zZXRfZHJ2ZGF0YSAoZWRldiwgTlVMTCk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBlcnI7CisJfQorCisJZWwzX2NhcmRzKys7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0VJU0EpIHx8IGRlZmluZWQoQ09ORklHX01DQSkKKy8qIFRoaXMgcmVtb3ZlIHdvcmtzIGZvciBhbGwgZGV2aWNlIHR5cGVzLgorICoKKyAqIFRoZSBuZXQgZGV2IG11c3QgYmUgc3RvcmVkIGluIHRoZSBkcml2ZXJfZGF0YSBmaWVsZCAqLworc3RhdGljIGludCBfX2RldmV4aXQgZWwzX2RldmljZV9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJZGV2ICA9IGRldmljZS0+ZHJpdmVyX2RhdGE7CisKKwllbDNfY29tbW9uX3JlbW92ZSAoZGV2KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBSZWFkIGEgd29yZCBmcm9tIHRoZSBFRVBST00gdXNpbmcgdGhlIHJlZ3VsYXIgRUVQUk9NIGFjY2VzcyByZWdpc3Rlci4KKyAgIEFzc3VtZSB0aGF0IHdlIGFyZSBpbiByZWdpc3RlciB3aW5kb3cgemVyby4KKyAqLworc3RhdGljIHVzaG9ydCByZWFkX2VlcHJvbShpbnQgaW9hZGRyLCBpbnQgaW5kZXgpCit7CisJb3V0dyhFRVBST01fUkVBRCArIGluZGV4LCBpb2FkZHIgKyAxMCk7CisJLyogUGF1c2UgZm9yIGF0IGxlYXN0IDE2MiB1cy4gZm9yIHRoZSByZWFkIHRvIHRha2UgcGxhY2UuIAorCSAgIFNvbWUgY2hpcHMgc2VlbSB0byByZXF1aXJlIG11Y2ggbG9uZ2VyICovCisJbWRlbGF5KDIpOworCXJldHVybiBpbncoaW9hZGRyICsgMTIpOworfQorCisvKiBSZWFkIGEgd29yZCBmcm9tIHRoZSBFRVBST00gd2hlbiBpbiB0aGUgSVNBIElEIHByb2JlIHN0YXRlLiAqLworc3RhdGljIHVzaG9ydCBfX2luaXQgaWRfcmVhZF9lZXByb20oaW50IGluZGV4KQoreworCWludCBiaXQsIHdvcmQgPSAwOworCisJLyogSXNzdWUgcmVhZCBjb21tYW5kLCBhbmQgcGF1c2UgZm9yIGF0IGxlYXN0IDE2MiB1cy4gZm9yIGl0IHRvIGNvbXBsZXRlLgorCSAgIEFzc3VtZSBleHRyYS1mYXN0IDE2TWh6IGJ1cy4gKi8KKwlvdXRiKEVFUFJPTV9SRUFEICsgaW5kZXgsIGlkX3BvcnQpOworCisJLyogUGF1c2UgZm9yIGF0IGxlYXN0IDE2MiB1cy4gZm9yIHRoZSByZWFkIHRvIHRha2UgcGxhY2UuICovCisJLyogU29tZSBjaGlwcyBzZWVtIHRvIHJlcXVpcmUgbXVjaCBsb25nZXIgKi8KKwltZGVsYXkoNCk7CisJCisJZm9yIChiaXQgPSAxNTsgYml0ID49IDA7IGJpdC0tKQorCQl3b3JkID0gKHdvcmQgPDwgMSkgKyAoaW5iKGlkX3BvcnQpICYgMHgwMSk7CisKKwlpZiAoZWwzX2RlYnVnID4gMykKKwkJcHJpbnRrKCIgIDNjNTA5IEVFUFJPTSB3b3JkICVkICUjNC40eC5cbiIsIGluZGV4LCB3b3JkKTsKKworCXJldHVybiB3b3JkOworfQorCisKK3N0YXRpYyBpbnQKK2VsM19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCisJb3V0dyhUeFJlc2V0LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwlvdXR3KFJ4UmVzZXQsIGlvYWRkciArIEVMM19DTUQpOworCW91dHcoU2V0U3RhdHVzRW5iIHwgMHgwMCwgaW9hZGRyICsgRUwzX0NNRCk7CisKKwlpID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZlbDNfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCisJRUwzV0lORE9XKDApOworCWlmIChlbDNfZGVidWcgPiAzKQorCQlwcmludGsoIiVzOiBPcGVuaW5nLCBJUlEgJWQJIHN0YXR1c0AleCAlNC40eC5cbiIsIGRldi0+bmFtZSwKKwkJCSAgIGRldi0+aXJxLCBpb2FkZHIgKyBFTDNfU1RBVFVTLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOworCisJZWwzX3VwKGRldik7CisKKwlpZiAoZWwzX2RlYnVnID4gMykKKwkJcHJpbnRrKCIlczogT3BlbmVkIDNjNTA5ICBJUlEgJWQgIHN0YXR1cyAlNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGRldi0+aXJxLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitlbDNfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBUcmFuc21pdHRlciB0aW1lb3V0LCBzZXJpb3VzIHByb2JsZW1zLiAqLworCXByaW50aygiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgVHhfc3RhdHVzICUyLjJ4IHN0YXR1cyAlNC40eCAiCisJCSAgICJUeCBGSUZPIHJvb20gJWQuXG4iLAorCQkgICBkZXYtPm5hbWUsIGluYihpb2FkZHIgKyBUWF9TVEFUVVMpLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyksCisJCSAgIGludyhpb2FkZHIgKyBUWF9GUkVFKSk7CisJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCS8qIElzc3VlIFRYX1JFU0VUIGFuZCBUWF9TVEFSVCBjb21tYW5kcy4gKi8KKwlvdXR3KFR4UmVzZXQsIGlvYWRkciArIEVMM19DTUQpOworCW91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworCitzdGF0aWMgaW50CitlbDNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkKKwlpZiAoZWwzX2RlYnVnID4gNCkgeworCQlwcmludGsoIiVzOiBlbDNfc3RhcnRfeG1pdChsZW5ndGggPSAldSkgY2FsbGVkLCBzdGF0dXMgJTQuNHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBza2ItPmxlbiwgaW53KGlvYWRkciArIEVMM19TVEFUVVMpKTsKKwl9CisjaWYgMAorI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJewkvKiBFcnJvci1jaGVja2luZyBjb2RlLCBkZWxldGUgc29tZWRheS4gKi8KKwkJdXNob3J0IHN0YXR1cyA9IGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKTsKKwkJaWYgKHN0YXR1cyAmIDB4MDAwMSAJCS8qIElSUSBsaW5lIGFjdGl2ZSwgbWlzc2VkIG9uZS4gKi8KKwkJCSYmIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSAmIDEpIHsgCQkJLyogTWFrZSBzdXJlLiAqLworCQkJcHJpbnRrKCIlczogTWlzc2VkIGludGVycnVwdCwgc3RhdHVzIHRoZW4gJTA0eCBub3cgJTA0eCIKKwkJCQkgICAiICBUeCAlMi4yeCBSeCAlNC40eC5cbiIsIGRldi0+bmFtZSwgc3RhdHVzLAorCQkJCSAgIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSwgaW5iKGlvYWRkciArIFRYX1NUQVRVUyksCisJCQkJICAgaW53KGlvYWRkciArIFJYX1NUQVRVUykpOworCQkJLyogRmFrZSBpbnRlcnJ1cHQgdHJpZ2dlciBieSBtYXNraW5nLCBhY2tub3dsZWRnZSBpbnRlcnJ1cHRzLiAqLworCQkJb3V0dyhTZXRTdGF0dXNFbmIgfCAweDAwLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCW91dHcoQWNrSW50ciB8IEludExhdGNoIHwgVHhBdmFpbGFibGUgfCBSeEVhcmx5IHwgSW50UmVxLAorCQkJCSBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCW91dHcoU2V0U3RhdHVzRW5iIHwgMHhmZiwgaW9hZGRyICsgRUwzX0NNRCk7CisJCX0KKwl9CisjZW5kaWYKKyNlbmRpZgorCS8qCisJICoJV2UgbG9jayB0aGUgZHJpdmVyIGFnYWluc3Qgb3RoZXIgcHJvY2Vzc29ycy4gTm90ZQorCSAqCXdlIGRvbid0IG5lZWQgdG8gbG9jayB2ZXJzdXMgdGhlIElSUSBhcyB3ZSBzdXNwZW5kZWQKKwkgKgl0aGF0LiBUaGlzIG1lYW5zIHRoYXQgd2UgbG9zZSB0aGUgYWJpbGl0eSB0byB0YWtlCisJICoJYW4gUlggZHVyaW5nIGEgVFggdXBsb2FkLiBUaGF0IHN1Y2tzIGEgYml0IHdpdGggU01QCisJICoJb24gYW4gb3JpZ2luYWwgM2M1MDkgKDJLIGJ1ZmZlcikKKwkgKgorCSAqCVVzaW5nIGRpc2FibGVfaXJxIHN0b3BzIHVzIGNyYXBwaW5nIG9uIG90aGVyCisJICoJdGltZSBzZW5zaXRpdmUgZGV2aWNlcy4KKwkgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJLyogUHV0IG91dCB0aGUgZG91Ymxld29yZCBoZWFkZXIuLi4gKi8KKwlvdXR3KHNrYi0+bGVuLCBpb2FkZHIgKyBUWF9GSUZPKTsKKwlvdXR3KDB4MDAsIGlvYWRkciArIFRYX0ZJRk8pOworCS8qIC4uLiBhbmQgdGhlIHBhY2tldCByb3VuZGVkIHRvIGEgZG91Ymxld29yZC4gKi8KKyNpZmRlZiAgX19wb3dlcnBjX18KKwlvdXRzbF9ucyhpb2FkZHIgKyBUWF9GSUZPLCBza2ItPmRhdGEsIChza2ItPmxlbiArIDMpID4+IDIpOworI2Vsc2UKKwlvdXRzbChpb2FkZHIgKyBUWF9GSUZPLCBza2ItPmRhdGEsIChza2ItPmxlbiArIDMpID4+IDIpOworI2VuZGlmCisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlpZiAoaW53KGlvYWRkciArIFRYX0ZSRUUpID4gMTUzNikKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwllbHNlCisJCS8qIEludGVycnVwdCB1cyB3aGVuIHRoZSBGSUZPIGhhcyByb29tIGZvciBtYXgtc2l6ZWQgcGFja2V0LiAqLworCQlvdXR3KFNldFR4VGhyZXNob2xkICsgMTUzNiwgaW9hZGRyICsgRUwzX0NNRCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKworCS8qIENsZWFyIHRoZSBUeCBzdGF0dXMgc3RhY2suICovCisJeworCQlzaG9ydCB0eF9zdGF0dXM7CisJCWludCBpID0gNDsKKworCQl3aGlsZSAoLS1pID4gMAkmJgkodHhfc3RhdHVzID0gaW5iKGlvYWRkciArIFRYX1NUQVRVUykpID4gMCkgeworCQkJaWYgKHR4X3N0YXR1cyAmIDB4MzgpIGxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIDB4MzApIG91dHcoVHhSZXNldCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQlpZiAodHhfc3RhdHVzICYgMHgzQykgb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQlvdXRiKDB4MDAsIGlvYWRkciArIFRYX1NUQVRVUyk7IC8qIFBvcCB0aGUgc3RhdHVzIHN0YWNrLiAqLworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBUaGUgRUwzIGludGVycnVwdCBoYW5kbGVyLiAqLworc3RhdGljIGlycXJldHVybl90CitlbDNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwOworCWludCBpb2FkZHIsIHN0YXR1czsKKwlpbnQgaSA9IG1heF9pbnRlcnJ1cHRfd29yazsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsgKCJlbDNfaW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoZWwzX2RlYnVnID4gNCkgeworCQlzdGF0dXMgPSBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyk7CisJCXByaW50aygiJXM6IGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCX0KKworCXdoaWxlICgoc3RhdHVzID0gaW53KGlvYWRkciArIEVMM19TVEFUVVMpKSAmCisJCSAgIChJbnRMYXRjaCB8IFJ4Q29tcGxldGUgfCBTdGF0c0Z1bGwpKSB7CisKKwkJaWYgKHN0YXR1cyAmIFJ4Q29tcGxldGUpCisJCQllbDNfcngoZGV2KTsKKworCQlpZiAoc3RhdHVzICYgVHhBdmFpbGFibGUpIHsKKwkJCWlmIChlbDNfZGVidWcgPiA1KQorCQkJCXByaW50aygiCVRYIHJvb20gYml0IHdhcyBoYW5kbGVkLlxuIik7CisJCQkvKiBUaGVyZSdzIHJvb20gaW4gdGhlIEZJRk8gZm9yIGEgZnVsbC1zaXplZCBwYWNrZXQuICovCisJCQlvdXR3KEFja0ludHIgfCBUeEF2YWlsYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQl9CisJCWlmIChzdGF0dXMgJiAoQWRhcHRlckZhaWx1cmUgfCBSeEVhcmx5IHwgU3RhdHNGdWxsIHwgVHhDb21wbGV0ZSkpIHsKKwkJCS8qIEhhbmRsZSBhbGwgdW5jb21tb24gaW50ZXJydXB0cy4gKi8KKwkJCWlmIChzdGF0dXMgJiBTdGF0c0Z1bGwpCQkJCS8qIEVtcHR5IHN0YXRpc3RpY3MuICovCisJCQkJdXBkYXRlX3N0YXRzKGRldik7CisJCQlpZiAoc3RhdHVzICYgUnhFYXJseSkgewkJCQkvKiBSeCBlYXJseSBpcyB1bnVzZWQuICovCisJCQkJZWwzX3J4KGRldik7CisJCQkJb3V0dyhBY2tJbnRyIHwgUnhFYXJseSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQl9CisJCQlpZiAoc3RhdHVzICYgVHhDb21wbGV0ZSkgewkJCS8qIFJlYWxseSBUeCBlcnJvci4gKi8KKwkJCQlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJCQlzaG9ydCB0eF9zdGF0dXM7CisJCQkJaW50IGkgPSA0OworCisJCQkJd2hpbGUgKC0taT4wICYmICh0eF9zdGF0dXMgPSBpbmIoaW9hZGRyICsgVFhfU1RBVFVTKSkgPiAwKSB7CisJCQkJCWlmICh0eF9zdGF0dXMgJiAweDM4KSBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJaWYgKHR4X3N0YXR1cyAmIDB4MzApIG91dHcoVHhSZXNldCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQkJCWlmICh0eF9zdGF0dXMgJiAweDNDKSBvdXR3KFR4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCQkJb3V0YigweDAwLCBpb2FkZHIgKyBUWF9TVEFUVVMpOyAvKiBQb3AgdGhlIHN0YXR1cyBzdGFjay4gKi8KKwkJCQl9CisJCQl9CisJCQlpZiAoc3RhdHVzICYgQWRhcHRlckZhaWx1cmUpIHsKKwkJCQkvKiBBZGFwdGVyIGZhaWx1cmUgcmVxdWlyZXMgUnggcmVzZXQgYW5kIHJlaW5pdC4gKi8KKwkJCQlvdXR3KFJ4UmVzZXQsIGlvYWRkciArIEVMM19DTUQpOworCQkJCS8qIFNldCB0aGUgUnggZmlsdGVyIHRvIHRoZSBjdXJyZW50IHN0YXRlLiAqLworCQkJCW91dHcoU2V0UnhGaWx0ZXIgfCBSeFN0YXRpb24gfCBSeEJyb2FkY2FzdAorCQkJCQkgfCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSA/IFJ4TXVsdGljYXN0IDogMCkKKwkJCQkJIHwgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyA/IFJ4UHJvbSA6IDApLAorCQkJCQkgaW9hZGRyICsgRUwzX0NNRCk7CisJCQkJb3V0dyhSeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIFJlLWVuYWJsZSB0aGUgcmVjZWl2ZXIuICovCisJCQkJb3V0dyhBY2tJbnRyIHwgQWRhcHRlckZhaWx1cmUsIGlvYWRkciArIEVMM19DTUQpOworCQkJfQorCQl9CisKKwkJaWYgKC0taSA8IDApIHsKKwkJCXByaW50aygiJXM6IEluZmluaXRlIGxvb3AgaW4gaW50ZXJydXB0LCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHRzLiAqLworCQkJb3V0dyhBY2tJbnRyIHwgMHhGRiwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBBY2tub3dsZWRnZSB0aGUgSVJRLiAqLworCQlvdXR3KEFja0ludHIgfCBJbnRSZXEgfCBJbnRMYXRjaCwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIEFjayBJUlEgKi8KKwl9CisKKwlpZiAoZWwzX2RlYnVnID4gNCkgeworCQlwcmludGsoIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwgZGV2LT5uYW1lLAorCQkJICAgaW53KGlvYWRkciArIEVMM19TVEFUVVMpKTsKKwl9CisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisvKgorICogUG9sbGluZyByZWNlaXZlIC0gdXNlZCBieSBuZXRjb25zb2xlIGFuZCBvdGhlciBkaWFnbm9zdGljIHRvb2xzCisgKiB0byBhbGxvdyBuZXR3b3JrIGkvbyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIGVsM19wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJZWwzX2ludGVycnVwdChkZXYtPmlycSwgZGV2LCBOVUxMKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorZWwzX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqCVRoaXMgaXMgZmFzdCBlbm91Z2ggbm90IHRvIGJvdGhlciB3aXRoIGRpc2FibGUgSVJRCisJICoJc3R1ZmYuCisJICovCisJIAorCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCXVwZGF0ZV9zdGF0cyhkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qICBVcGRhdGUgc3RhdGlzdGljcy4gIFdlIGNoYW5nZSB0byByZWdpc3RlciB3aW5kb3cgNiwgc28gdGhpcyBzaG91bGQgYmUgcnVuCisJc2luZ2xlLXRocmVhZGVkIGlmIHRoZSBkZXZpY2UgaXMgYWN0aXZlLiBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlIGEgcmFyZQorCW9wZXJhdGlvbiwgYW5kIGl0J3Mgc2ltcGxlciBmb3IgdGhlIHJlc3Qgb2YgdGhlIGRyaXZlciB0byBhc3N1bWUgdGhhdAorCXdpbmRvdyAxIGlzIGFsd2F5cyB2YWxpZCByYXRoZXIgdGhhbiB1c2UgYSBzcGVjaWFsIHdpbmRvdy1zdGF0ZSB2YXJpYWJsZS4KKwkqLworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKGVsM19kZWJ1ZyA+IDUpCisJCXByaW50aygiICAgVXBkYXRpbmcgdGhlIHN0YXRpc3RpY3MuXG4iKTsKKwkvKiBUdXJuIG9mZiBzdGF0aXN0aWNzIHVwZGF0ZXMgd2hpbGUgcmVhZGluZy4gKi8KKwlvdXR3KFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCByZWFkIGV2ZXJ5dGhpbmcuICovCisJRUwzV0lORE9XKDYpOworCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyAJKz0gaW5iKGlvYWRkciArIDApOworCWxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzCSs9IGluYihpb2FkZHIgKyAxKTsKKwkvKiBNdWx0aXBsZSBjb2xsaXNpb25zLiAqLwkgICBpbmIoaW9hZGRyICsgMik7CisJbHAtPnN0YXRzLmNvbGxpc2lvbnMJCSs9IGluYihpb2FkZHIgKyAzKTsKKwlscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycwkrPSBpbmIoaW9hZGRyICsgNCk7CisJbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzCSs9IGluYihpb2FkZHIgKyA1KTsKKwlscC0+c3RhdHMudHhfcGFja2V0cwkJKz0gaW5iKGlvYWRkciArIDYpOworCS8qIFJ4IHBhY2tldHMJKi8JCSAgIGluYihpb2FkZHIgKyA3KTsKKwkvKiBUeCBkZWZlcnJhbHMgKi8JCSAgIGluYihpb2FkZHIgKyA4KTsKKwlpbncoaW9hZGRyICsgMTApOwkvKiBUb3RhbCBSeCBhbmQgVHggb2N0ZXRzLiAqLworCWludyhpb2FkZHIgKyAxMik7CisKKwkvKiBCYWNrIHRvIHdpbmRvdyAxLCBhbmQgdHVybiBzdGF0aXN0aWNzIGJhY2sgb24uICovCisJRUwzV0lORE9XKDEpOworCW91dHcoU3RhdHNFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCXJldHVybjsKK30KKworc3RhdGljIGludAorZWwzX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXNob3J0IHJ4X3N0YXR1czsKKworCWlmIChlbDNfZGVidWcgPiA1KQorCQlwcmludGsoIiAgIEluIHJ4X3BhY2tldCgpLCBzdGF0dXMgJTQuNHgsIHJ4X3N0YXR1cyAlNC40eC5cbiIsCisJCQkgICBpbncoaW9hZGRyK0VMM19TVEFUVVMpLCBpbncoaW9hZGRyK1JYX1NUQVRVUykpOworCXdoaWxlICgocnhfc3RhdHVzID0gaW53KGlvYWRkciArIFJYX1NUQVRVUykpID4gMCkgeworCQlpZiAocnhfc3RhdHVzICYgMHg0MDAwKSB7IC8qIEVycm9yLCB1cGRhdGUgc3RhdHMuICovCisJCQlzaG9ydCBlcnJvciA9IHJ4X3N0YXR1cyAmIDB4MzgwMDsKKworCQkJb3V0dyhSeERpc2NhcmQsIGlvYWRkciArIEVMM19DTUQpOworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJc3dpdGNoIChlcnJvcikgeworCQkJY2FzZSAweDAwMDA6CQlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsgYnJlYWs7CisJCQljYXNlIDB4MDgwMDoJCWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7IGJyZWFrOworCQkJY2FzZSAweDEwMDA6CQlscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7IGJyZWFrOworCQkJY2FzZSAweDE4MDA6CQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOyBicmVhazsKKwkJCWNhc2UgMHgyMDAwOgkJbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOyBicmVhazsKKwkJCWNhc2UgMHgyODAwOgkJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsgYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzaG9ydCBwa3RfbGVuID0gcnhfc3RhdHVzICYgMHg3ZmY7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rNSk7CisJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCWlmIChlbDNfZGVidWcgPiA0KQorCQkJCXByaW50aygiUmVjZWl2aW5nIHBhY2tldCBzaXplICVkIHN0YXR1cyAlNC40eC5cbiIsCisJCQkJCSAgIHBrdF9sZW4sIHJ4X3N0YXR1cyk7CisJCQlpZiAoc2tiICE9IE5VTEwpIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOyAgICAgLyogQWxpZ24gSVAgb24gMTYgYnl0ZSAqLworCisJCQkJLyogJ3NrYi0+ZGF0YScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KKyNpZmRlZiAgX19wb3dlcnBjX18KKwkJCQlpbnNsX25zKGlvYWRkcitSWF9GSUZPLCBza2JfcHV0KHNrYixwa3RfbGVuKSwKKwkJCQkJCQkgICAocGt0X2xlbiArIDMpID4+IDIpOworI2Vsc2UKKwkJCQlpbnNsKGlvYWRkciArIFJYX0ZJRk8sIHNrYl9wdXQoc2tiLHBrdF9sZW4pLAorCQkJCQkgKHBrdF9sZW4gKyAzKSA+PiAyKTsKKyNlbmRpZgorCisJCQkJb3V0dyhSeERpc2NhcmQsIGlvYWRkciArIEVMM19DTUQpOyAvKiBQb3AgdG9wIFJ4IHBhY2tldC4gKi8KKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlvdXR3KFJ4RGlzY2FyZCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJaWYgKGVsM19kZWJ1ZykKKwkJCQlwcmludGsoIiVzOiBDb3VsZG4ndCBhbGxvY2F0ZSBhIHNrX2J1ZmYgb2Ygc2l6ZSAlZC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCX0KKwkJaW53KGlvYWRkciArIEVMM19TVEFUVVMpOyAJCQkJLyogRGVsYXkuICovCisJCXdoaWxlIChpbncoaW9hZGRyICsgRUwzX1NUQVRVUykgJiAweDEwMDApCisJCQlwcmludGsoS0VSTl9ERUJVRyAiCVdhaXRpbmcgZm9yIDNjNTA5IHRvIGRpc2NhcmQgcGFja2V0LCBzdGF0dXMgJXguXG4iLAorCQkJCSAgIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSApOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogICAgIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICovCitzdGF0aWMgdm9pZAorc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoZWwzX2RlYnVnID4gMSkgeworCQlzdGF0aWMgaW50IG9sZDsKKwkJaWYgKG9sZCAhPSBkZXYtPm1jX2NvdW50KSB7CisJCQlvbGQgPSBkZXYtPm1jX2NvdW50OworCQkJcHJpbnRrKCIlczogU2V0dGluZyBSeCBtb2RlIHRvICVkIGFkZHJlc3Nlcy5cbiIsIGRldi0+bmFtZSwgZGV2LT5tY19jb3VudCk7CisJCX0KKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJaWYgKGRldi0+ZmxhZ3MmSUZGX1BST01JU0MpIHsKKwkJb3V0dyhTZXRSeEZpbHRlciB8IFJ4U3RhdGlvbiB8IFJ4TXVsdGljYXN0IHwgUnhCcm9hZGNhc3QgfCBSeFByb20sCisJCQkgaW9hZGRyICsgRUwzX0NNRCk7CisJfQorCWVsc2UgaWYgKGRldi0+bWNfY291bnQgfHwgKGRldi0+ZmxhZ3MmSUZGX0FMTE1VTFRJKSkgeworCQlvdXR3KFNldFJ4RmlsdGVyIHwgUnhTdGF0aW9uIHwgUnhNdWx0aWNhc3QgfCBSeEJyb2FkY2FzdCwgaW9hZGRyICsgRUwzX0NNRCk7CisJfQorCWVsc2UKKwkJb3V0dyhTZXRSeEZpbHRlciB8IFJ4U3RhdGlvbiB8IFJ4QnJvYWRjYXN0LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50CitlbDNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJCisJaWYgKGVsM19kZWJ1ZyA+IDIpCisJCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKworCWVsM19kb3duKGRldik7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkvKiBTd2l0Y2hpbmcgYmFjayB0byB3aW5kb3cgMCBkaXNhYmxlcyB0aGUgSVJRLiAqLworCUVMM1dJTkRPVygwKTsKKwlpZiAobHAtPnR5cGUgIT0gRUwzX0VJU0EpIHsKKwkJLyogQnV0IHdlIGV4cGxpY2l0bHkgemVybyB0aGUgSVJRIGxpbmUgc2VsZWN0IGFueXdheS4gRG9uJ3QgZG8KKwkJICogaXQgb24gRUlTQSBjYXJkcywgaXQgcHJldmVudHMgdGhlIG1vZHVsZSBmcm9tIGdldHRpbmcgYW4KKwkJICogSVJRIGFmdGVyIHVubG9hZCtyZWxvYWQuLi4gKi8KKwkJb3V0dygweDBmMDAsIGlvYWRkciArIFdOMF9JUlEpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IAorZWwzX2xpbmtfb2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTE2IHRtcDsKKworCUVMM1dJTkRPVyg0KTsKKwl0bXAgPSBpbncoaW9hZGRyICsgV040X01FRElBKTsKKwlFTDNXSU5ET1coMSk7CisJcmV0dXJuIHRtcCAmICgxPDwxMSk7Cit9CisKK3N0YXRpYyBpbnQKK2VsM19uZXRkZXZfZ2V0X2VjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXUxNiB0bXA7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCQorCUVMM1dJTkRPVygwKTsKKwkvKiBvYnRhaW4gY3VycmVudCB0cmFuc2NlaXZlciB2aWEgV040X01FRElBPyAqLwkKKwl0bXAgPSBpbncoaW9hZGRyICsgV04wX0FERFJfQ09ORik7CisJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCXN3aXRjaCAodG1wID4+IDE0KSB7CisJY2FzZSAwOgorCQllY21kLT5wb3J0ID0gUE9SVF9UUDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQllY21kLT5wb3J0ID0gUE9SVF9BVUk7CisJCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQllY21kLT5wb3J0ID0gUE9SVF9CTkM7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJZWNtZC0+c3VwcG9ydGVkID0gMDsKKwl0bXAgPSBpbncoaW9hZGRyICsgV04wX0NPTkZfQ1RSTCk7CisJaWYgKHRtcCAmICgxPDwxMykpCisJCWVjbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfQVVJOworCWlmICh0bXAgJiAoMTw8MTIpKQorCQllY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX0JOQzsKKwlpZiAodG1wICYgKDE8PDkpKSB7CisJCWVjbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfVFAgfCBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJCQlTVVBQT1JURURfMTBiYXNlVF9GdWxsOwkvKiBobW0uLi4gKi8KKwkJRUwzV0lORE9XKDQpOworCQl0bXAgPSBpbncoaW9hZGRyICsgV040X05FVERJQUcpOworCQlpZiAodG1wICYgRkRfRU5BQkxFKQorCQkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJfQorCisJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKKwlFTDNXSU5ET1coMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VsM19uZXRkZXZfc2V0X2VjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXUxNiB0bXA7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKGVjbWQtPnNwZWVkICE9IFNQRUVEXzEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRikgJiYgKGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgoZWNtZC0+dHJhbnNjZWl2ZXIgIT0gWENWUl9JTlRFUk5BTCkgJiYgKGVjbWQtPnRyYW5zY2VpdmVyICE9IFhDVlJfRVhURVJOQUwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGNoYW5nZSBYQ1ZSIHR5cGUgKi8KKwlFTDNXSU5ET1coMCk7CisJdG1wID0gaW53KGlvYWRkciArIFdOMF9BRERSX0NPTkYpOworCXN3aXRjaCAoZWNtZC0+cG9ydCkgeworCWNhc2UgUE9SVF9UUDoKKwkJdG1wICY9IH4oMzw8MTQpOworCQlkZXYtPmlmX3BvcnQgPSAwOworCQlicmVhazsKKwljYXNlIFBPUlRfQVVJOgorCQl0bXAgfD0gKDE8PDE0KTsKKwkJZGV2LT5pZl9wb3J0ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0JOQzoKKwkJdG1wIHw9ICgzPDwxNCk7CisJCWRldi0+aWZfcG9ydCA9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW91dHcodG1wLCBpb2FkZHIgKyBXTjBfQUREUl9DT05GKTsKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDMpIHsKKwkJLyogZmlyZSB1cCB0aGUgREMtREMgY29udmVydG9yIGlmIEJOQyBnZXRzIGVuYWJsZWQgKi8KKwkJdG1wID0gaW53KGlvYWRkciArIFdOMF9BRERSX0NPTkYpOworCQlpZiAodG1wICYgKDMgPDwgMTQpKSB7CisJCQlvdXR3KFN0YXJ0Q29heCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQl1ZGVsYXkoODAwKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlFTDNXSU5ET1coNCk7CisJdG1wID0gaW53KGlvYWRkciArIFdONF9ORVRESUFHKTsKKwlpZiAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQl0bXAgfD0gRkRfRU5BQkxFOworCWVsc2UKKwkJdG1wICY9IH5GRF9FTkFCTEU7CisJb3V0dyh0bXAsIGlvYWRkciArIFdONF9ORVRESUFHKTsKKwlFTDNXSU5ET1coMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZWwzX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBpbnQgZWwzX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwlyZXQgPSBlbDNfbmV0ZGV2X2dldF9lY21kKGRldiwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlbDNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCXJldCA9IGVsM19uZXRkZXZfc2V0X2VjbWQoZGV2LCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIGVsM19nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiByZXQ7CisKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJcmV0ID0gZWwzX2xpbmtfb2soZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIGVsM19nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZWwzX2RlYnVnOworfQorCitzdGF0aWMgdm9pZCBlbDNfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2KQoreworCWVsM19kZWJ1ZyA9IHY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvID0gZWwzX2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MgPSBlbDNfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBlbDNfc2V0X3NldHRpbmdzLAorCS5nZXRfbGluayA9IGVsM19nZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsID0gZWwzX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsID0gZWwzX3NldF9tc2dsZXZlbCwKK307CisKK3N0YXRpYyB2b2lkCitlbDNfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIFR1cm4gb2ZmIHN0YXRpc3RpY3MgQVNBUC4gIFdlIHVwZGF0ZSBscC0+c3RhdHMgYmVsb3cuICovCisJb3V0dyhTdGF0c0Rpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCisJLyogRGlzYWJsZSB0aGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyLiAqLworCW91dHcoUnhEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwlvdXR3KFR4RGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDMpCisJCS8qIFR1cm4gb2ZmIHRoaW5uZXQgcG93ZXIuICBHcmVlbiEgKi8KKwkJb3V0dyhTdG9wQ29heCwgaW9hZGRyICsgRUwzX0NNRCk7CisJZWxzZSBpZiAoZGV2LT5pZl9wb3J0ID09IDApIHsKKwkJLyogRGlzYWJsZSBsaW5rIGJlYXQgYW5kIGphYmJlciwgaWZfcG9ydCBtYXkgY2hhbmdlIGhlcmUgbmV4dCBvcGVuKCkuICovCisJCUVMM1dJTkRPVyg0KTsKKwkJb3V0dyhpbncoaW9hZGRyICsgV040X01FRElBKSAmIH5NRURJQV9UUCwgaW9hZGRyICsgV040X01FRElBKTsKKwl9CisKKwlvdXR3KFNldEludHJFbmIgfCAweDAwMDAsIGlvYWRkciArIEVMM19DTUQpOworCisJdXBkYXRlX3N0YXRzKGRldik7Cit9CisKK3N0YXRpYyB2b2lkCitlbDNfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaSwgc3dfaW5mbywgbmV0X2RpYWc7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCQorCS8qIEFjdGl2YXRpbmcgdGhlIGJvYXJkIHJlcXVpcmVkIGFuZCBkb2VzIG5vIGhhcm0gb3RoZXJ3aXNlICovCisJb3V0dygweDAwMDEsIGlvYWRkciArIDQpOworCisJLyogU2V0IHRoZSBJUlEgbGluZS4gKi8KKwlvdXR3KChkZXYtPmlycSA8PCAxMikgfCAweDBmMDAsIGlvYWRkciArIFdOMF9JUlEpOworCisJLyogU2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MgaW4gd2luZG93IDIgZWFjaCB0aW1lIG9wZW5lZC4gKi8KKwlFTDNXSU5ET1coMik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlvdXRiKGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIGkpOworCisJaWYgKChkZXYtPmlmX3BvcnQgJiAweDAzKSA9PSAzKSAvKiBCTkMgaW50ZXJmYWNlICovCisJCS8qIFN0YXJ0IHRoZSB0aGlubmV0IHRyYW5zY2VpdmVyLiBXZSBzaG91bGQgcmVhbGx5IHdhaXQgNTBtcy4uLiovCisJCW91dHcoU3RhcnRDb2F4LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwllbHNlIGlmICgoZGV2LT5pZl9wb3J0ICYgMHgwMykgPT0gMCkgeyAvKiAxMGJhc2VUIGludGVyZmFjZSAqLworCQkvKiBDb21iaW5lIHNlY29uZGFyeSBzd19pbmZvIHdvcmQgKHRoZSBhZGFwdGVyIGxldmVsKSBhbmQgcHJpbWFyeQorCQkJc3dfaW5mbyB3b3JkIChkdXBsZXggc2V0dGluZyBwbHVzIG90aGVyIHVzZWxlc3MgYml0cykgKi8KKwkJRUwzV0lORE9XKDApOworCQlzd19pbmZvID0gKHJlYWRfZWVwcm9tKGlvYWRkciwgMHgxNCkgJiAweDQwMGYpIHwgCisJCQkocmVhZF9lZXByb20oaW9hZGRyLCAweDBkKSAmIDB4QmZmMCk7CisKKwkJRUwzV0lORE9XKDQpOworCQluZXRfZGlhZyA9IGludyhpb2FkZHIgKyBXTjRfTkVURElBRyk7CisJCW5ldF9kaWFnID0gKG5ldF9kaWFnIHwgRkRfRU5BQkxFKTsgLyogdGVtcG9yYXJpbHkgYXNzdW1lIGZ1bGwtZHVwbGV4IHdpbGwgYmUgc2V0ICovCisJCXByaW50aygiJXM6ICIsIGRldi0+bmFtZSk7CisJCXN3aXRjaCAoZGV2LT5pZl9wb3J0ICYgMHgwYykgeworCQkJY2FzZSAxMjoKKwkJCQkvKiBmb3JjZSBmdWxsLWR1cGxleCBtb2RlIGlmIDNjNXg5YiAqLworCQkJCWlmIChzd19pbmZvICYgMHgwMDBmKSB7CisJCQkJCXByaW50aygiRm9yY2luZyAzYzV4OWIgZnVsbC1kdXBsZXggbW9kZSIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQljYXNlIDg6CisJCQkJLyogc2V0IGZ1bGwtZHVwbGV4IG1vZGUgYmFzZWQgb24gZWVwcm9tIGNvbmZpZyBzZXR0aW5nICovCisJCQkJaWYgKChzd19pbmZvICYgMHgwMDBmKSAmJiAoc3dfaW5mbyAmIDB4ODAwMCkpIHsKKwkJCQkJcHJpbnRrKCJTZXR0aW5nIDNjNXg5YiBmdWxsLWR1cGxleCBtb2RlIChmcm9tIEVFUFJPTSBjb25maWd1cmF0aW9uIGJpdCkiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJZGVmYXVsdDoKKwkJCQkvKiB4Y3ZyPSgwIHx8IDQpIE9SIHVzZXIgaGFzIGFuIG9sZCAzYzV4OSBub24gIkIiIG1vZGVsICovCisJCQkJcHJpbnRrKCJTZXR0aW5nIDNjNXg5LzNjNXg5QiBoYWxmLWR1cGxleCBtb2RlIik7CisJCQkJbmV0X2RpYWcgPSAobmV0X2RpYWcgJiB+RkRfRU5BQkxFKTsgLyogZGlzYWJsZSBmdWxsIGR1cGxleCAqLworCQl9CisKKwkJb3V0dyhuZXRfZGlhZywgaW9hZGRyICsgV040X05FVERJQUcpOworCQlwcmludGsoIiBpZl9wb3J0OiAlZCwgc3dfaW5mbzogJTQuNHhcbiIsIGRldi0+aWZfcG9ydCwgc3dfaW5mbyk7CisJCWlmIChlbDNfZGVidWcgPiAzKQorCQkJcHJpbnRrKCIlczogM2M1eDkgbmV0IGRpYWcgd29yZCBpcyBub3c6ICU0LjR4LlxuIiwgZGV2LT5uYW1lLCBuZXRfZGlhZyk7CisJCS8qIEVuYWJsZSBsaW5rIGJlYXQgYW5kIGphYmJlciBjaGVjay4gKi8KKwkJb3V0dyhpbncoaW9hZGRyICsgV040X01FRElBKSB8IE1FRElBX1RQLCBpb2FkZHIgKyBXTjRfTUVESUEpOworCX0KKworCS8qIFN3aXRjaCB0byB0aGUgc3RhdHMgd2luZG93LCBhbmQgY2xlYXIgYWxsIHN0YXRzIGJ5IHJlYWRpbmcuICovCisJb3V0dyhTdGF0c0Rpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCUVMM1dJTkRPVyg2KTsKKwlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCQlpbmIoaW9hZGRyICsgaSk7CisJaW53KGlvYWRkciArIDEwKTsKKwlpbncoaW9hZGRyICsgMTIpOworCisJLyogU3dpdGNoIHRvIHJlZ2lzdGVyIHNldCAxIGZvciBub3JtYWwgdXNlLiAqLworCUVMM1dJTkRPVygxKTsKKworCS8qIEFjY2VwdCBiLWNhc2UgYW5kIHBoeXMgYWRkciBvbmx5LiAqLworCW91dHcoU2V0UnhGaWx0ZXIgfCBSeFN0YXRpb24gfCBSeEJyb2FkY2FzdCwgaW9hZGRyICsgRUwzX0NNRCk7CisJb3V0dyhTdGF0c0VuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIFR1cm4gb24gc3RhdGlzdGljcy4gKi8KKworCW91dHcoUnhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBFbmFibGUgdGhlIHJlY2VpdmVyLiAqLworCW91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBFbmFibGUgdHJhbnNtaXR0ZXIuICovCisJLyogQWxsb3cgc3RhdHVzIGJpdHMgdG8gYmUgc2Vlbi4gKi8KKwlvdXR3KFNldFN0YXR1c0VuYiB8IDB4ZmYsIGlvYWRkciArIEVMM19DTUQpOworCS8qIEFjayBhbGwgcGVuZGluZyBldmVudHMsIGFuZCBzZXQgYWN0aXZlIGluZGljYXRvciBtYXNrLiAqLworCW91dHcoQWNrSW50ciB8IEludExhdGNoIHwgVHhBdmFpbGFibGUgfCBSeEVhcmx5IHwgSW50UmVxLAorCQkgaW9hZGRyICsgRUwzX0NNRCk7CisJb3V0dyhTZXRJbnRyRW5iIHwgSW50TGF0Y2h8VHhBdmFpbGFibGV8VHhDb21wbGV0ZXxSeENvbXBsZXRlfFN0YXRzRnVsbCwKKwkJIGlvYWRkciArIEVMM19DTUQpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKK30KKworLyogUG93ZXIgTWFuYWdlbWVudCBzdXBwb3J0IGZ1bmN0aW9ucyAqLworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50CitlbDNfc3VzcGVuZChzdHJ1Y3QgcG1fZGV2ICpwZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwOworCWludCBpb2FkZHI7CisJCisJaWYgKCFwZGV2ICYmICFwZGV2LT5kYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXBkZXYtPmRhdGE7CisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwllbDNfZG93bihkZXYpOworCW91dHcoUG93ZXJEb3duLCBpb2FkZHIgKyBFTDNfQ01EKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VsM19yZXN1bWUoc3RydWN0IHBtX2RldiAqcGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGVsM19wcml2YXRlICpscDsKKwlpbnQgaW9hZGRyOworCQorCWlmICghcGRldiAmJiAhcGRldi0+ZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilwZGV2LT5kYXRhOworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJb3V0dyhQb3dlclVwLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwllbDNfdXAoZGV2KTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZWwzX3BtX2NhbGxiYWNrKHN0cnVjdCBwbV9kZXYgKnBkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKQoreworCXN3aXRjaCAocnFzdCkgeworCQljYXNlIFBNX1NVU1BFTkQ6CisJCQlyZXR1cm4gZWwzX3N1c3BlbmQocGRldik7CisKKwkJY2FzZSBQTV9SRVNVTUU6CisJCQlyZXR1cm4gZWwzX3Jlc3VtZShwZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworLyogUGFyYW1ldGVycyB0aGF0IG1heSBiZSBwYXNzZWQgaW50byB0aGUgbW9kdWxlLiAqLworc3RhdGljIGludCBkZWJ1ZyA9IC0xOworc3RhdGljIGludCBpcnFbXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9Oworc3RhdGljIGludCB4Y3ZyW10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CisKK21vZHVsZV9wYXJhbShkZWJ1ZyxpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh4Y3ZyLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBsZXZlbCAoMC02KSIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgbnVtYmVyKHMpIChhc3NpZ25lZCkiKTsKK01PRFVMRV9QQVJNX0RFU0MoeGN2ciwidHJhbnNjZWl2ZXIocykgKDA9aW50ZXJuYWwsIDE9ZXh0ZXJuYWwpIik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pbnRlcnJ1cHRfd29yaywgIm1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworI2lmIGRlZmluZWQoX19JU0FQTlBfXykKK21vZHVsZV9wYXJhbShub3BucCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm9wbnAsICJkaXNhYmxlIElTQSBQblAgc3VwcG9ydCAoMC0xKSIpOworTU9EVUxFX0RFVklDRV9UQUJMRShpc2FwbnAsIGVsM19pc2FwbnBfYWRhcHRlcnMpOworI2VuZGlmCS8qIF9fSVNBUE5QX18gKi8KK01PRFVMRV9ERVNDUklQVElPTigiM0NvbSBFdGhlcmxpbmsgSUlJICgzYzUwOSwgM2M1MDlCKSBJU0EvUG5QIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9faW5pdCBlbDNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwllbDNfY2FyZHMgPSAwOworCisJaWYgKGRlYnVnID49IDApCisJCWVsM19kZWJ1ZyA9IGRlYnVnOworCisJZWwzX3Jvb3RfZGV2ID0gTlVMTDsKKwl3aGlsZSAoZWwzX3Byb2JlKGVsM19jYXJkcykgPT0gMCkgeworCQlpZiAoaXJxW2VsM19jYXJkc10gPiAxKQorCQkJZWwzX3Jvb3RfZGV2LT5pcnEgPSBpcnFbZWwzX2NhcmRzXTsKKwkJaWYgKHhjdnJbZWwzX2NhcmRzXSA+PSAwKQorCQkJZWwzX3Jvb3RfZGV2LT5pZl9wb3J0ID0geGN2cltlbDNfY2FyZHNdOworCQllbDNfY2FyZHMrKzsKKwl9CisKKyNpZmRlZiBDT05GSUdfRUlTQQorCWlmIChlaXNhX2RyaXZlcl9yZWdpc3RlciAoJmVsM19laXNhX2RyaXZlcikgPCAwKSB7CisJCWVpc2FfZHJpdmVyX3VucmVnaXN0ZXIgKCZlbDNfZWlzYV9kcml2ZXIpOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19NQ0EKKwltY2FfcmVnaXN0ZXJfZHJpdmVyKCZlbDNfbWNhX2RyaXZlcik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVsM19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X2RldjsKKworCXdoaWxlIChlbDNfcm9vdF9kZXYpIHsKKwkJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGVsM19yb290X2Rldik7CisKKwkJbmV4dF9kZXYgPSBscC0+bmV4dF9kZXY7CisJCWVsM19jb21tb25fcmVtb3ZlIChlbDNfcm9vdF9kZXYpOworCQllbDNfcm9vdF9kZXYgPSBuZXh0X2RldjsKKwl9CisKKyNpZmRlZiBDT05GSUdfRUlTQQorCWVpc2FfZHJpdmVyX3VucmVnaXN0ZXIgKCZlbDNfZWlzYV9kcml2ZXIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01DQQorCW1jYV91bnJlZ2lzdGVyX2RyaXZlcigmZWwzX21jYV9kcml2ZXIpOworI2VuZGlmCit9CisKK21vZHVsZV9pbml0IChlbDNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQgKGVsM19jbGVhbnVwX21vZHVsZSk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTE1LmMgYi9kcml2ZXJzL25ldC8zYzUxNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Y2Y0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC8zYzUxNS5jCkBAIC0wLDAgKzEsMTU5NCBAQAorLyoKKwlXcml0dGVuIDE5OTctMTk5OCBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGlzIGRyaXZlciBpcyBmb3IgdGhlIDNDb20gSVNBIEV0aGVyTGluayBYTCAiQ29ya3NjcmV3IiAzYzUxNSBldGhlcmNhcmQuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKworCTIwMDAvMi8yLSBBZGRlZCBzdXBwb3J0IGZvciBrZXJuZWwtbGV2ZWwgSVNBUG5QIAorCQlieSBTdGVwaGVuIEZyb3N0IDxzZnJvc3RAc25vd21hbi5uZXQ+IGFuZCBBbGVzc2FuZHJvIFp1bW1vCisJQ2xlYW5lZCB1cCBmb3IgMi4zLngvc29mdG5ldCBieSBKZWZmIEdhcnppayBhbmQgQWxhbiBDb3guCisJCisJMjAwMS8xMS8xNyAtIEFkZGVkIGV0aHRvb2wgc3VwcG9ydCAoamdhcnppaykKKwkKKwkyMDAyLzEwLzI4IC0gTG9ja2luZyB1cGRhdGVzIGZvciAyLjUgKGFsYW5AcmVkaGF0LmNvbSkKKworKi8KKworI2RlZmluZSBEUlZfTkFNRQkJIjNjNTE1IgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjAuOTl0LWFjIgorI2RlZmluZSBEUlZfUkVMREFURQkJIjI4LU9jdC0yMDAyIgorCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9CitEUlZfTkFNRSAiLmM6diIgRFJWX1ZFUlNJT04gIiAiIERSVl9SRUxEQVRFICIgYmVja2VyQHNjeWxkLmNvbSBhbmQgb3RoZXJzXG4iOworCisjZGVmaW5lIENPUktTQ1JFVyAxCisKKy8qICJLbm9icyIgdGhhdCBhZGp1c3QgZmVhdHVyZXMgYW5kIHBhcmFtZXRlcnMuICovCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWZyYW1lcyBzY2hlbWUuCisgICBTZXR0aW5nIHRvID4gMTUxMiBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuICovCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IDIwMDsKKworLyogQWxsb3cgc2V0dGluZyBNVFUgdG8gYSBsYXJnZXIgc2l6ZSwgYnlwYXNzaW5nIHRoZSBub3JtYWwgZXRoZXJuZXQgc2V0dXAuICovCitzdGF0aWMgY29uc3QgaW50IG10dSA9IDE1MDA7CisKKy8qIE1heGltdW0gZXZlbnRzIChSeCBwYWNrZXRzLCBldGMuKSB0byBoYW5kbGUgYXQgZWFjaCBpbnRlcnJ1cHQuICovCitzdGF0aWMgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDIwOworCisvKiBFbmFibGUgdGhlIGF1dG9tYXRpYyBtZWRpYSBzZWxlY3Rpb24gY29kZSAtLSB1c3VhbGx5IHNldC4gKi8KKyNkZWZpbmUgQVVUT01FRElBIDEKKworLyogQWxsb3cgdGhlIHVzZSBvZiBmcmFnbWVudCBidXMgbWFzdGVyIHRyYW5zZmVycyBpbnN0ZWFkIG9mIG9ubHkKKyAgIHByb2dyYW1tZWQtSS9PIGZvciBWb3J0ZXggY2FyZHMuICBGdWxsLWJ1cy1tYXN0ZXIgdHJhbnNmZXJzIGFyZSBhbHdheXMKKyAgIGVuYWJsZWQgYnkgZGVmYXVsdCBvbiBCb29tZXJhbmcgY2FyZHMuICBJZiBWT1JURVhfQlVTX01BU1RFUiBpcyBkZWZpbmVkLAorICAgdGhlIGZlYXR1cmUgbWF5IGJlIHR1cm5lZCBvbiB1c2luZyAnb3B0aW9ucycuICovCisjZGVmaW5lIFZPUlRFWF9CVVNfTUFTVEVSCisKKy8qIEEgZmV3IHZhbHVlcyB0aGF0IG1heSBiZSB0d2Vha2VkLiAqLworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgZWZmaWNpZW5jeS4gKi8KKyNkZWZpbmUgVFhfUklOR19TSVpFCTE2CisjZGVmaW5lIFJYX1JJTkdfU0laRQkxNgorI2RlZmluZSBQS1RfQlVGX1NaCQkxNTM2CS8qIFNpemUgb2YgZWFjaCB0ZW1wb3JhcnkgUnggYnVmZmVyLiAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaXNhcG5wLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNkZWZpbmUgTkVXX01VTFRJQ0FTVAorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNkZWZpbmUgTUFYX1VOSVRTIDgKKworTU9EVUxFX0FVVEhPUigiRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiM0NvbSAzYzUxNSBDb3Jrc2NyZXcgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKKy8qICJLbm9icyIgZm9yIGFkanVzdGluZyBpbnRlcm5hbCBwYXJhbWV0ZXJzLiAqLworLyogUHV0IG91dCBzb21ld2hhdCBtb3JlIGRlYnVnZ2luZyBtZXNzYWdlcy4gKDAgLSBubyBtc2csIDEgbWluaW1hbCBtc2dzKS4gKi8KKyNkZWZpbmUgRFJJVkVSX0RFQlVHIDEKKy8qIFNvbWUgdmFsdWVzIGhlcmUgb25seSBmb3IgcGVyZm9ybWFuY2UgZXZhbHVhdGlvbiBhbmQgcGF0aC1jb3ZlcmFnZQorICAgZGVidWdnaW5nLiAqLworc3RhdGljIGludCByeF9ub2NvcHksIHJ4X2NvcHksIHF1ZXVlZF9wYWNrZXQ7CisKKy8qIE51bWJlciBvZiB0aW1lcyB0byBjaGVjayB0byBzZWUgaWYgdGhlIFR4IEZJRk8gaGFzIHNwYWNlLCB1c2VkIGluIHNvbWUKKyAgIGxpbWl0ZWQgY2FzZXMuICovCisjZGVmaW5lIFdBSVRfVFhfQVZBSUwgMjAwCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlciB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworI2RlZmluZSBUWF9USU1FT1VUICA0MAkJLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIFR4IGh1bmcgKi8KKworLyogVGhlIHNpemUgaGVyZSBpcyBzb21ld2hhdCBtaXNsZWFkaW5nOiB0aGUgQ29ya3NjcmV3IGFsc28gdXNlcyB0aGUgSVNBCisgICBhbGlhc2VkIHJlZ2lzdGVycyBhdCA8YmFzZT4rMHg0MDAuCisgICAqLworI2RlZmluZSBDT1JLU0NSRVdfVE9UQUxfU0laRSAweDIwCisKKyNpZmRlZiBEUklWRVJfREVCVUcKK3N0YXRpYyBpbnQgY29ya3NjcmV3X2RlYnVnID0gRFJJVkVSX0RFQlVHOworI2Vsc2UKK3N0YXRpYyBpbnQgY29ya3NjcmV3X2RlYnVnID0gMTsKKyNlbmRpZgorCisjZGVmaW5lIENPUktTQ1JFV19JRCAxMAorCisvKgorCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworSS4gQm9hcmQgQ29tcGF0aWJpbGl0eQorCitUaGlzIGRldmljZSBkcml2ZXIgaXMgZGVzaWduZWQgZm9yIHRoZSAzQ29tIDNjNTE1IElTQSBGYXN0IEV0aGVyTGluayBYTCwKKzNDb20ncyBJU0EgYnVzIGFkYXB0ZXIgZm9yIEZhc3QgRXRoZXJuZXQuICBEdWUgdG8gdGhlIHVuaXF1ZSBJL08gcG9ydCBsYXlvdXQsCitpdCdzIG5vdCBwcmFjdGljYWwgdG8gaW50ZWdyYXRlIHRoaXMgZHJpdmVyIHdpdGggdGhlIG90aGVyIEV0aGVyTGluayBkcml2ZXJzLgorCitJSS4gQm9hcmQtc3BlY2lmaWMgc2V0dGluZ3MKKworVGhlIENvcmtzY3JldyBoYXMgYW4gRUVQUk9NIGZvciBjb25maWd1cmF0aW9uLCBidXQgbm8gc3BlY2lhbCBzZXR0aW5ncyBhcmUKK25lZWRlZCBmb3IgTGludXguCisKK0lJSS4gRHJpdmVyIG9wZXJhdGlvbgorCitUaGUgM2M1MTUgc2VyaWVzIHVzZSBhbiBpbnRlcmZhY2UgdGhhdCdzIHZlcnkgc2ltaWxhciB0byB0aGUgM2M5MDAgIkJvb21lcmFuZyIKK1BDSSBjYXJkcywgd2l0aCB0aGUgYnVzIG1hc3RlciBpbnRlcmZhY2UgZXh0ZW5zaXZlbHkgbW9kaWZpZWQgdG8gd29yayB3aXRoCit0aGUgSVNBIGJ1cy4KKworVGhlIGNhcmQgaXMgY2FwYWJsZSBvZiBmdWxsLWJ1cy1tYXN0ZXIgdHJhbnNmZXJzIHdpdGggc2VwYXJhdGUKK2xpc3RzIG9mIHRyYW5zbWl0IGFuZCByZWNlaXZlIGRlc2NyaXB0b3JzLCBzaW1pbGFyIHRvIHRoZSBBTUQgTEFOQ0UvUENuZXQsCitERUMgVHVsaXAgYW5kIEludGVsIFNwZWVkbzMuCisKK1RoaXMgZHJpdmVyIHVzZXMgYSAiUlhfQ09QWUJSRUFLIiBzY2hlbWUgcmF0aGVyIHRoYW4gYSBmaXhlZCBpbnRlcm1lZGlhdGUKK3JlY2VpdmUgYnVmZmVyLiAgVGhpcyBzY2hlbWUgYWxsb2NhdGVzIGZ1bGwtc2l6ZWQgc2tidWZmcyBhcyByZWNlaXZlCitidWZmZXJzLiAgVGhlIHZhbHVlIFJYX0NPUFlCUkVBSyBpcyB1c2VkIGFzIHRoZSBjb3B5aW5nIGJyZWFrcG9pbnQ6IGl0IGlzCitjaG9zZW4gdG8gdHJhZGUtb2ZmIHRoZSBtZW1vcnkgd2FzdGVkIGJ5IHBhc3NpbmcgdGhlIGZ1bGwtc2l6ZWQgc2tidWZmIHRvCit0aGUgcXVldWUgbGF5ZXIgZm9yIGFsbCBmcmFtZXMgdnMuIHRoZSBjb3B5aW5nIGNvc3Qgb2YgY29weWluZyBhIGZyYW1lIHRvIGEKK2NvcnJlY3RseS1zaXplZCBza2J1ZmYuCisKKworSUlJQy4gU3luY2hyb25pemF0aW9uCitUaGUgZHJpdmVyIHJ1bnMgYXMgdHdvIGluZGVwZW5kZW50LCBzaW5nbGUtdGhyZWFkZWQgZmxvd3Mgb2YgY29udHJvbC4gIE9uZQoraXMgdGhlIHNlbmQtcGFja2V0IHJvdXRpbmUsIHdoaWNoIGVuZm9yY2VzIHNpbmdsZS10aHJlYWRlZCB1c2UgYnkgdGhlIG5ldGlmCitsYXllci4gIFRoZSBvdGhlciB0aHJlYWQgaXMgdGhlIGludGVycnVwdCBoYW5kbGVyLCB3aGljaCBpcyBzaW5nbGUKK3RocmVhZGVkIGJ5IHRoZSBoYXJkd2FyZSBhbmQgb3RoZXIgc29mdHdhcmUuCisKK0lWLiBOb3RlcworCitUaGFua3MgdG8gVGVycnkgTXVycGh5IG9mIDNDb20gZm9yIHByb3ZpZGluZyBkb2N1bWVudGF0aW9uIGFuZCBhIGRldmVsb3BtZW50Citib2FyZC4KKworVGhlIG5hbWVzICJWb3J0ZXgiLCAiQm9vbWVyYW5nIiBhbmQgIkNvcmtzY3JldyIgYXJlIHRoZSBpbnRlcm5hbCAzQ29tCitwcm9qZWN0IG5hbWVzLiAgSSB1c2UgdGhlc2UgbmFtZXMgdG8gZWxpbWluYXRlIGNvbmZ1c2lvbiAtLSAzQ29tIHByb2R1Y3QKK251bWJlcnMgYW5kIG5hbWVzIGFyZSB2ZXJ5IHNpbWlsYXIgYW5kIG9mdGVuIGNvbmZ1c2VkLgorCitUaGUgbmV3IGNoaXBzIHN1cHBvcnQgYm90aCBldGhlcm5ldCAoMS41SykgYW5kIEZEREkgKDQuNUspIGZyYW1lIHNpemVzIQorVGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyBldGhlcm5ldCBmcmFtZXMgYmVjYXVzZSBvZiB0aGUgcmVjZW50IE1UVSBsaW1pdAorb2YgMS41SywgYnV0IHRoZSBjaGFuZ2VzIHRvIHN1cHBvcnQgNC41SyBhcmUgbWluaW1hbC4KKyovCisKKy8qIE9wZXJhdGlvbmFsIGRlZmluaXRpb25zLgorICAgVGhlc2UgYXJlIG5vdCB1c2VkIGJ5IG90aGVyIGNvbXBpbGF0aW9uIHVuaXRzIGFuZCB0aHVzIGFyZSBub3QKKyAgIGV4cG9ydGVkIGluIGEgIi5oIiBmaWxlLgorCisgICBGaXJzdCB0aGUgd2luZG93cy4gIFRoZXJlIGFyZSBlaWdodCByZWdpc3RlciB3aW5kb3dzLCB3aXRoIHRoZSBjb21tYW5kCisgICBhbmQgc3RhdHVzIHJlZ2lzdGVycyBhdmFpbGFibGUgaW4gZWFjaC4KKyAgICovCisjZGVmaW5lIEVMM1dJTkRPVyh3aW5fbnVtKSBvdXR3KFNlbGVjdFdpbmRvdyArICh3aW5fbnVtKSwgaW9hZGRyICsgRUwzX0NNRCkKKyNkZWZpbmUgRUwzX0NNRCAweDBlCisjZGVmaW5lIEVMM19TVEFUVVMgMHgwZQorCisvKiBUaGUgdG9wIGZpdmUgYml0cyB3cml0dGVuIHRvIEVMM19DTUQgYXJlIGEgY29tbWFuZCwgdGhlIGxvd2VyCisgICAxMSBiaXRzIGFyZSB0aGUgcGFyYW1ldGVyLCBpZiBhcHBsaWNhYmxlLgorICAgTm90ZSB0aGF0IDExIHBhcmFtZXRlcnMgYml0cyB3YXMgZmluZSBmb3IgZXRoZXJuZXQsIGJ1dCB0aGUgbmV3IGNoaXBzCisgICBjYW4gaGFuZGxlIEZEREkgbGVuZ3RoIGZyYW1lcyAofjQ1MDAgb2N0ZXRzKSBhbmQgbm93IHBhcmFtZXRlcnMgY291bnQKKyAgIDMyLWJpdCAnRHdvcmRzJyByYXRoZXIgdGhhbiBvY3RldHMuICovCisKK2VudW0gY29ya3NjcmV3X2NtZCB7CisJVG90YWxSZXNldCA9IDAgPDwgMTEsIFNlbGVjdFdpbmRvdyA9IDEgPDwgMTEsIFN0YXJ0Q29heCA9IDIgPDwgMTEsCisJUnhEaXNhYmxlID0gMyA8PCAxMSwgUnhFbmFibGUgPSA0IDw8IDExLCBSeFJlc2V0ID0gNSA8PCAxMSwKKwlVcFN0YWxsID0gNiA8PCAxMSwgVXBVbnN0YWxsID0gKDYgPDwgMTEpICsgMSwgRG93blN0YWxsID0gKDYgPDwgMTEpICsgMiwKKwlEb3duVW5zdGFsbCA9ICg2IDw8IDExKSArIDMsIFJ4RGlzY2FyZCA9IDggPDwgMTEsIFR4RW5hYmxlID0gOSA8PCAxMSwgCisJVHhEaXNhYmxlID0gMTAgPDwgMTEsIFR4UmVzZXQgPSAxMSA8PCAxMSwgRmFrZUludHIgPSAxMiA8PCAxMSwgCisJQWNrSW50ciA9IDEzIDw8IDExLCBTZXRJbnRyRW5iID0gMTQgPDwgMTEsIFNldFN0YXR1c0VuYiA9IDE1IDw8IDExLCAKKwlTZXRSeEZpbHRlciA9IDE2IDw8IDExLCBTZXRSeFRocmVzaG9sZCA9IDE3IDw8IDExLAorCVNldFR4VGhyZXNob2xkID0gMTggPDwgMTEsIFNldFR4U3RhcnQgPSAxOSA8PCAxMSwgU3RhcnRETUFVcCA9IDIwIDw8IDExLAorCVN0YXJ0RE1BRG93biA9ICgyMCA8PCAxMSkgKyAxLCBTdGF0c0VuYWJsZSA9IDIxIDw8IDExLAorCVN0YXRzRGlzYWJsZSA9IDIyIDw8IDExLCBTdG9wQ29heCA9IDIzIDw8IDExLAorfTsKKworLyogVGhlIFNldFJ4RmlsdGVyIGNvbW1hbmQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGNsYXNzZXM6ICovCitlbnVtIFJ4RmlsdGVyIHsKKwlSeFN0YXRpb24gPSAxLCBSeE11bHRpY2FzdCA9IDIsIFJ4QnJvYWRjYXN0ID0gNCwgUnhQcm9tID0gOAorfTsKKworLyogQml0cyBpbiB0aGUgZ2VuZXJhbCBzdGF0dXMgcmVnaXN0ZXIuICovCitlbnVtIGNvcmtzY3Jld19zdGF0dXMgeworCUludExhdGNoID0gMHgwMDAxLCBBZGFwdGVyRmFpbHVyZSA9IDB4MDAwMiwgVHhDb21wbGV0ZSA9IDB4MDAwNCwKKwlUeEF2YWlsYWJsZSA9IDB4MDAwOCwgUnhDb21wbGV0ZSA9IDB4MDAxMCwgUnhFYXJseSA9IDB4MDAyMCwKKwlJbnRSZXEgPSAweDAwNDAsIFN0YXRzRnVsbCA9IDB4MDA4MCwKKwlETUFEb25lID0gMSA8PCA4LCBEb3duQ29tcGxldGUgPSAxIDw8IDksIFVwQ29tcGxldGUgPSAxIDw8IDEwLAorCURNQUluUHJvZ3Jlc3MgPSAxIDw8IDExLAkvKiBETUEgY29udHJvbGxlciBpcyBzdGlsbCBidXN5LiAqLworCUNtZEluUHJvZ3Jlc3MgPSAxIDw8IDEyLAkvKiBFTDNfQ01EIGlzIHN0aWxsIGJ1c3kuICovCit9OworCisvKiBSZWdpc3RlciB3aW5kb3cgMSBvZmZzZXRzLCB0aGUgd2luZG93IHVzZWQgaW4gbm9ybWFsIG9wZXJhdGlvbi4KKyAgIE9uIHRoZSBDb3Jrc2NyZXcgdGhpcyB3aW5kb3cgaXMgYWx3YXlzIG1hcHBlZCBhdCBvZmZzZXRzIDB4MTAtMHgxZi4gKi8KK2VudW0gV2luZG93MSB7CisJVFhfRklGTyA9IDB4MTAsIFJYX0ZJRk8gPSAweDEwLCBSeEVycm9ycyA9IDB4MTQsCisJUnhTdGF0dXMgPSAweDE4LCBUaW1lciA9IDB4MUEsIFR4U3RhdHVzID0gMHgxQiwKKwlUeEZyZWUgPSAweDFDLAkJLyogUmVtYWluaW5nIGZyZWUgYnl0ZXMgaW4gVHggYnVmZmVyLiAqLworfTsKK2VudW0gV2luZG93MCB7CisJV24wSVJRID0gMHgwOCwKKyNpZiBkZWZpbmVkKENPUktTQ1JFVykKKwlXbjBFZXByb21DbWQgPSAweDIwMEEsCS8qIENvcmtzY3JldyBFRVBST00gY29tbWFuZCByZWdpc3Rlci4gKi8KKwlXbjBFZXByb21EYXRhID0gMHgyMDBDLAkvKiBDb3Jrc2NyZXcgRUVQUk9NIHJlc3VsdHMgcmVnaXN0ZXIuICovCisjZWxzZQorCVduMEVlcHJvbUNtZCA9IDEwLAkvKiBXaW5kb3cgMDogRUVQUk9NIGNvbW1hbmQgcmVnaXN0ZXIuICovCisJV24wRWVwcm9tRGF0YSA9IDEyLAkvKiBXaW5kb3cgMDogRUVQUk9NIHJlc3VsdHMgcmVnaXN0ZXIuICovCisjZW5kaWYKK307CitlbnVtIFdpbjBfRUVQUk9NX2JpdHMgeworCUVFUFJPTV9SZWFkID0gMHg4MCwgRUVQUk9NX1dSSVRFID0gMHg0MCwgRUVQUk9NX0VSQVNFID0gMHhDMCwKKwlFRVBST01fRVdFTkIgPSAweDMwLAkvKiBFbmFibGUgZXJhc2luZy93cml0aW5nIGZvciAxMCBtc2VjLiAqLworCUVFUFJPTV9FV0RJUyA9IDB4MDAsCS8qIERpc2FibGUgRVdFTkIgYmVmb3JlIDEwIG1zZWMgdGltZW91dC4gKi8KK307CisKKy8qIEVFUFJPTSBsb2NhdGlvbnMuICovCitlbnVtIGVlcHJvbV9vZmZzZXQgeworCVBoeXNBZGRyMDEgPSAwLCBQaHlzQWRkcjIzID0gMSwgUGh5c0FkZHI0NSA9IDIsIE1vZGVsSUQgPSAzLAorCUV0aGVyTGluazNJRCA9IDcsCit9OworCitlbnVtIFdpbmRvdzMgewkJCS8qIFdpbmRvdyAzOiBNQUMvY29uZmlnIGJpdHMuICovCisJV24zX0NvbmZpZyA9IDAsIFduM19NQUNfQ3RybCA9IDYsIFduM19PcHRpb25zID0gOCwKK307Cit1bmlvbiB3bjNfY29uZmlnIHsKKwlpbnQgaTsKKwlzdHJ1Y3QgdzNfY29uZmlnX2ZpZWxkcyB7CisJCXVuc2lnbmVkIGludCByYW1fc2l6ZTozLCByYW1fd2lkdGg6MSwgcmFtX3NwZWVkOjIsIHJvbV9zaXplOjI7CisJCWludCBwYWQ4Ojg7CisJCXVuc2lnbmVkIGludCByYW1fc3BsaXQ6MiwgcGFkMTg6MiwgeGN2cjozLCBwYWQyMToxLCBhdXRvc2VsZWN0OjE7CisJCWludCBwYWQyNDo3OworCX0gdTsKK307CisKK2VudW0gV2luZG93NCB7CisJV240X05ldERpYWcgPSA2LCBXbjRfTWVkaWEgPSAxMCwJLyogV2luZG93IDQ6IFhjdnIvbWVkaWEgYml0cy4gKi8KK307CitlbnVtIFdpbjRfTWVkaWFfYml0cyB7CisJTWVkaWFfU1FFID0gMHgwMDA4LAkvKiBFbmFibGUgU1FFIGVycm9yIGNvdW50aW5nIGZvciBBVUkuICovCisJTWVkaWFfMTBUUCA9IDB4MDBDMCwJLyogRW5hYmxlIGxpbmsgYmVhdCBhbmQgamFiYmVyIGZvciAxMGJhc2VULiAqLworCU1lZGlhX0xuayA9IDB4MDA4MCwJLyogRW5hYmxlIGp1c3QgbGluayBiZWF0IGZvciAxMDBUWC8xMDBGWC4gKi8KKwlNZWRpYV9MbmtCZWF0ID0gMHgwODAwLAorfTsKK2VudW0gV2luZG93NyB7CQkJLyogV2luZG93IDc6IEJ1cyBNYXN0ZXIgY29udHJvbC4gKi8KKwlXbjdfTWFzdGVyQWRkciA9IDAsIFduN19NYXN0ZXJMZW4gPSA2LCBXbjdfTWFzdGVyU3RhdHVzID0gMTIsCit9OworCisvKiBCb29tZXJhbmctc3R5bGUgYnVzIG1hc3RlciBjb250cm9sIHJlZ2lzdGVycy4gIE5vdGUgSVNBIGFsaWFzZXMhICovCitlbnVtIE1hc3RlckN0cmwgeworCVBrdFN0YXR1cyA9IDB4NDAwLCBEb3duTGlzdFB0ciA9IDB4NDA0LCBGcmFnQWRkciA9IDB4NDA4LCBGcmFnTGVuID0KKwkgICAgMHg0MGMsCisJVHhGcmVlVGhyZXNob2xkID0gMHg0MGYsIFVwUGt0U3RhdHVzID0gMHg0MTAsIFVwTGlzdFB0ciA9IDB4NDE4LAorfTsKKworLyogVGhlIFJ4IGFuZCBUeCBkZXNjcmlwdG9yIGxpc3RzLgorICAgQ2F1dGlvbiBBbHBoYSBoYWNrZXJzOiB0aGVzZSB0eXBlcyBhcmUgMzIgYml0cyEgIE5vdGUgYWxzbyB0aGUgOCBieXRlCisgICBhbGlnbm1lbnQgY29udHJhaW50IG9uIHR4X3JpbmdbXSBhbmQgcnhfcmluZ1tdLiAqLworc3RydWN0IGJvb21fcnhfZGVzYyB7CisJdTMyIG5leHQ7CisJczMyIHN0YXR1czsKKwl1MzIgYWRkcjsKKwlzMzIgbGVuZ3RoOworfTsKKworLyogVmFsdWVzIGZvciB0aGUgUnggc3RhdHVzIGVudHJ5LiAqLworZW51bSByeF9kZXNjX3N0YXR1cyB7CisJUnhEQ29tcGxldGUgPSAweDAwMDA4MDAwLCBSeERFcnJvciA9IDB4NDAwMCwKKwkvKiBTZWUgYm9vbWVyYW5nX3J4KCkgZm9yIGFjdHVhbCBlcnJvciBiaXRzICovCit9OworCitzdHJ1Y3QgYm9vbV90eF9kZXNjIHsKKwl1MzIgbmV4dDsKKwlzMzIgc3RhdHVzOworCXUzMiBhZGRyOworCXMzMiBsZW5ndGg7Cit9OworCitzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUgeworCWNvbnN0IGNoYXIgKnByb2R1Y3RfbmFtZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IG5ldF9kZXZpY2UgKm91cl9kZXY7CisJLyogVGhlIFJ4IGFuZCBUeCByaW5ncyBhcmUgaGVyZSB0byBrZWVwIHRoZW0gcXVhZC13b3JkLWFsaWduZWQuICovCisJc3RydWN0IGJvb21fcnhfZGVzYyByeF9yaW5nW1JYX1JJTkdfU0laRV07CisJc3RydWN0IGJvb21fdHhfZGVzYyB0eF9yaW5nW1RYX1JJTkdfU0laRV07CisJLyogVGhlIGFkZHJlc3NlcyBvZiB0cmFuc21pdC0gYW5kIHJlY2VpdmUtaW4tcGxhY2Ugc2tidWZmcy4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworCXVuc2lnbmVkIGludCBjdXJfcngsIGN1cl90eDsJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCisJdW5zaWduZWQgaW50IGRpcnR5X3J4LCBkaXJ0eV90eDsvKiBUaGUgcmluZyBlbnRyaWVzIHRvIGJlIGZyZWUoKWVkLiAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBza19idWZmICp0eF9za2I7CS8qIFBhY2tldCBiZWluZyBlYXRlbiBieSBidXMgbWFzdGVyIGN0cmwuICAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkvKiBNZWRpYSBzZWxlY3Rpb24gdGltZXIuICovCisJaW50IGNhcGFiaWxpdGllcwk7CS8qIEFkYXB0ZXIgY2FwYWJpbGl0aWVzIHdvcmQuICovCisJaW50IG9wdGlvbnM7CQkJLyogVXNlci1zZXR0YWJsZSBtaXNjLiBkcml2ZXIgb3B0aW9ucy4gKi8KKwlpbnQgbGFzdF9yeF9wYWNrZXRzOwkJLyogRm9yIG1lZGlhIGF1dG9zZWxlY3Rpb24uICovCisJdW5zaWduZWQgaW50IGF2YWlsYWJsZV9tZWRpYTo4LAkvKiBGcm9tIFduM19PcHRpb25zICovCisJCW1lZGlhX292ZXJyaWRlOjMsCS8qIFBhc3NlZC1pbiBtZWRpYSB0eXBlLiAqLworCQlkZWZhdWx0X21lZGlhOjMsCS8qIFJlYWQgZnJvbSB0aGUgRUVQUk9NLiAqLworCQlmdWxsX2R1cGxleDoxLCBhdXRvc2VsZWN0OjEsIGJ1c19tYXN0ZXI6MSwJLyogVm9ydGV4IGNhbiBvbmx5IGRvIGEgZnJhZ21lbnQgYnVzLW0uICovCisJCWZ1bGxfYnVzX21hc3Rlcl90eDoxLCBmdWxsX2J1c19tYXN0ZXJfcng6MSwJLyogQm9vbWVyYW5nICAqLworCQl0eF9mdWxsOjE7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBkZXZpY2UgKmRldjsKK307CisKKy8qIFRoZSBhY3Rpb24gdG8gdGFrZSB3aXRoIGEgbWVkaWEgc2VsZWN0aW9uIHRpbWVyIHRpY2suCisgICBOb3RlIHRoYXQgd2UgZGV2aWF0ZSBmcm9tIHRoZSAzQ29tIG9yZGVyIGJ5IGNoZWNraW5nIDEwYmFzZTIgYmVmb3JlIEFVSS4KKyAqLworZW51bSB4Y3ZyX3R5cGVzIHsKKwlYQ1ZSXzEwYmFzZVQgPSAwLCBYQ1ZSX0FVSSwgWENWUl8xMGJhc2VUT25seSwgWENWUl8xMGJhc2UyLCBYQ1ZSXzEwMGJhc2VUeCwKKwlYQ1ZSXzEwMGJhc2VGeCwgWENWUl9NSUkgPSA2LCBYQ1ZSX0RlZmF1bHQgPSA4LAorfTsKKworc3RhdGljIHN0cnVjdCBtZWRpYV90YWJsZSB7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgbWVkaWFfYml0czoxNiwJLyogQml0cyB0byBzZXQgaW4gV240X01lZGlhIHJlZ2lzdGVyLiAqLworCQltYXNrOjgsCQkJLyogVGhlIHRyYW5zY2VpdmVyLXByZXNlbnQgYml0IGluIFduM19Db25maWcuICovCisJCW5leHQ6ODsJCQkvKiBUaGUgbWVkaWEgdHlwZSB0byB0cnkgbmV4dC4gKi8KKwlzaG9ydCB3YWl0OwkJCS8qIFRpbWUgYmVmb3JlIHdlIGNoZWNrIG1lZGlhIHN0YXR1cy4gKi8KK30gbWVkaWFfdGJsW10gPSB7CQorCXsgIjEwYmFzZVQiLCBNZWRpYV8xMFRQLCAweDA4LCBYQ1ZSXzEwYmFzZTIsICgxNCAqIEhaKSAvIDEwIH0sIAorCXsgIjEwTWJzIEFVSSIsIE1lZGlhX1NRRSwgMHgyMCwgWENWUl9EZWZhdWx0LCAoMSAqIEhaKSAvIDEwfSwgCisJeyAidW5kZWZpbmVkIiwgMCwgMHg4MCwgWENWUl8xMGJhc2VULCAxMDAwMH0sIAorCXsgIjEwYmFzZTIiLCAwLCAweDEwLCBYQ1ZSX0FVSSwgKDEgKiBIWikgLyAxMH0sIAorCXsgIjEwMGJhc2VUWCIsIE1lZGlhX0xuaywgMHgwMiwgWENWUl8xMDBiYXNlRngsICgxNCAqIEhaKSAvIDEwfSwgCisJeyAiMTAwYmFzZUZYIiwgTWVkaWFfTG5rLCAweDA0LCBYQ1ZSX01JSSwgKDE0ICogSFopIC8gMTB9LCAKKwl7ICJNSUkiLCAwLCAweDQwLCBYQ1ZSXzEwYmFzZVQsIDMgKiBIWn0sIAorCXsgInVuZGVmaW5lZCIsIDAsIDB4MDEsIFhDVlJfMTBiYXNlVCwgMTAwMDB9LCAKKwl7ICJEZWZhdWx0IiwgMCwgMHhGRiwgWENWUl8xMGJhc2VULCAxMDAwMH0sCit9OworCisjaWZkZWYgX19JU0FQTlBfXworc3RhdGljIHN0cnVjdCBpc2FwbnBfZGV2aWNlX2lkIGNvcmtzY3Jld19pc2FwbnBfYWRhcHRlcnNbXSA9IHsKKwl7CUlTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ1QnLCAnQycsICdNJyksIElTQVBOUF9GVU5DVElPTigweDUwNTEpLAorCQkobG9uZykgIjNDb20gRmFzdCBFdGhlckxpbmsgSVNBIiB9LAorCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpc2FwbnAsIGNvcmtzY3Jld19pc2FwbnBfYWRhcHRlcnMpOworCitzdGF0aWMgaW50IG5vcG5wOworI2VuZGlmIC8qIF9fSVNBUE5QX18gKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpjb3Jrc2NyZXdfc2NhbihpbnQgdW5pdCk7CitzdGF0aWMgdm9pZCBjb3Jrc2NyZXdfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkciwKKwkJCSAgICBzdHJ1Y3QgcG5wX2RldiAqaWRldiwgaW50IGNhcmRfbnVtYmVyKTsKK3N0YXRpYyBpbnQgY29ya3NjcmV3X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBjb3Jrc2NyZXdfdGltZXIodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBjb3Jrc2NyZXdfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBjb3Jrc2NyZXdfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBjb3Jrc2NyZXdfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYm9vbWVyYW5nX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGNvcmtzY3Jld19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IGNvcmtzY3Jld19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhpbnQgYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmNvcmtzY3Jld19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworDAorCisvKiAKKyAgIFVuZm9ydHVuYXRlbHkgbWF4aW1pemluZyB0aGUgc2hhcmVkIGNvZGUgYmV0d2VlbiB0aGUgaW50ZWdyYXRlZCBhbmQKKyAgIG1vZHVsZSB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgcmVzdWx0cyBpbiBhIGNvbXBsaWNhdGVkIHNldCBvZiBpbml0aWFsaXphdGlvbgorICAgcHJvY2VkdXJlcy4KKyAgIGluaXRfbW9kdWxlKCkgLS0gbW9kdWxlcyAvICB0YzU5eF9pbml0KCkgIC0tIGJ1aWx0LWluCisJCVRoZSB3cmFwcGVycyBmb3IgY29ya3NjcmV3X3NjYW4oKQorICAgY29ya3NjcmV3X3NjYW4oKSAgCQkgVGhlIGNvbW1vbiByb3V0aW5lIHRoYXQgc2NhbnMgZm9yIFBDSSBhbmQgRUlTQSBjYXJkcworICAgY29ya3NjcmV3X2ZvdW5kX2RldmljZSgpIEFsbG9jYXRlIGEgZGV2aWNlIHN0cnVjdHVyZSB3aGVuIHdlIGZpbmQgYSBjYXJkLgorCQkJCQlEaWZmZXJlbnQgdmVyc2lvbnMgZXhpc3QgZm9yIG1vZHVsZXMgYW5kIGJ1aWx0LWluLgorICAgY29ya3NjcmV3X3Byb2JlMSgpCQlGaWxsIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlIC0tIHRoaXMgaXMgc2VwYXJhdGVkCisJCQkJCXNvIHRoYXQgdGhlIG1vZHVsZXMgY29kZSBjYW4gcHV0IGl0IGluIGRldi0+aW5pdC4KKyovCisvKiBUaGlzIGRyaXZlciB1c2VzICdvcHRpb25zJyB0byBwYXNzIHRoZSBtZWRpYSB0eXBlLCBmdWxsLWR1cGxleCBmbGFnLCBldGMuICovCisvKiBOb3RlOiB0aGlzIGlzIHRoZSBvbmx5IGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY2FyZHMgc3VwcG9ydGVkISEgKi8KK3N0YXRpYyBpbnQgb3B0aW9uc1tNQVhfVU5JVFNdID0geyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIH07CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICIzYzUxNSBkZWJ1ZyBsZXZlbCAoMC02KSIpOworTU9EVUxFX1BBUk1fREVTQyhvcHRpb25zLCAiM2M1MTU6IEJpdHMgMC0yOiBtZWRpYSB0eXBlLCBiaXQgMzogZnVsbCBkdXBsZXgsIGJpdCA0OiBidXMgbWFzdGVyaW5nIik7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X2NvcHlicmVhaywgIjNjNTE1IGNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pbnRlcnJ1cHRfd29yaywgIjNjNTE1IG1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworCisvKiBBIGxpc3Qgb2YgYWxsIGluc3RhbGxlZCBWb3J0ZXggZGV2aWNlcywgZm9yIHJlbW92aW5nIHRoZSBkcml2ZXIgbW9kdWxlLiAqLworLyogd2Ugd2lsbCBuZWVkIGxvY2tpbmcgKGFuZCByZWZjb3VudGluZykgaWYgd2UgZXZlciB1c2UgaXQgZm9yIG1vcmUgKi8KK3N0YXRpYyBMSVNUX0hFQUQocm9vdF9jb3Jrc2NyZXdfZGV2KTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGZvdW5kID0gMDsKKwlpZiAoZGVidWcgPj0gMCkKKwkJY29ya3NjcmV3X2RlYnVnID0gZGVidWc7CisJaWYgKGNvcmtzY3Jld19kZWJ1ZykKKwkJcHJpbnRrKHZlcnNpb24pOworCXdoaWxlIChjb3Jrc2NyZXdfc2NhbigtMSkpCisJCWZvdW5kKys7CisJcmV0dXJuIGZvdW5kID8gMCA6IC1FTk9ERVY7Cit9CisKKyNlbHNlCitzdHJ1Y3QgbmV0X2RldmljZSAqdGM1MTVfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNvcmtzY3Jld19zY2FuKHVuaXQpOworCXN0YXRpYyBpbnQgcHJpbnRlZDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCWlmIChjb3Jrc2NyZXdfZGVidWcgPiAwICYmICFwcmludGVkKSB7CisJCXByaW50ZWQgPSAxOworCQlwcmludGsodmVyc2lvbik7CisJfQorCisJcmV0dXJuIGRldjsKK30KKyNlbmRpZgkJCQkvKiBub3QgTU9EVUxFICovCisKK3N0YXRpYyBpbnQgY2hlY2tfZGV2aWNlKHVuc2lnbmVkIGlvYWRkcikKK3sKKwlpbnQgdGltZXI7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgQ09SS1NDUkVXX1RPVEFMX1NJWkUsICIzYzUxNSIpKQorCQlyZXR1cm4gMDsKKwkvKiBDaGVjayB0aGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgYSBtYXRjaGluZyBpb2FkZHIuICovCisJaWYgKChpbncoaW9hZGRyICsgMHgyMDAyKSAmIDB4MWYwKSAhPSAoaW9hZGRyICYgMHgxZjApKSB7CisJCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgQ09SS1NDUkVXX1RPVEFMX1NJWkUpOworCQlyZXR1cm4gMDsKKwl9CisJLyogVmVyaWZ5IGJ5IHJlYWRpbmcgdGhlIGRldmljZSBJRCBmcm9tIHRoZSBFRVBST00uICovCisJb3V0dyhFRVBST01fUmVhZCArIDcsIGlvYWRkciArIFduMEVlcHJvbUNtZCk7CisJLyogUGF1c2UgZm9yIGF0IGxlYXN0IDE2MiB1cy4gZm9yIHRoZSByZWFkIHRvIHRha2UgcGxhY2UuICovCisJZm9yICh0aW1lciA9IDQ7IHRpbWVyID49IDA7IHRpbWVyLS0pIHsKKwkJdWRlbGF5KDE2Mik7CisJCWlmICgoaW53KGlvYWRkciArIFduMEVlcHJvbUNtZCkgJiAweDAyMDApID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGludyhpb2FkZHIgKyBXbjBFZXByb21EYXRhKSAhPSAweDZkNTApIHsKKwkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBDT1JLU0NSRVdfVE9UQUxfU0laRSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNvcmtzY3Jld19wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJbGlzdF9kZWxfaW5pdCgmdnAtPmxpc3QpOworCWlmIChkZXYtPmRtYSkKKwkJZnJlZV9kbWEoZGV2LT5kbWEpOworCW91dHcoVG90YWxSZXNldCwgZGV2LT5iYXNlX2FkZHIgKyBFTDNfQ01EKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgQ09SS1NDUkVXX1RPVEFMX1NJWkUpOworCWlmICh2cC0+ZGV2KQorCQlwbnBfZGV2aWNlX2RldGFjaCh0b19wbnBfZGV2KHZwLT5kZXYpKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpjb3Jrc2NyZXdfc2NhbihpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0YXRpYyBpbnQgY2FyZHNfZm91bmQgPSAwOworCXN0YXRpYyBpbnQgaW9hZGRyOworCWludCBlcnI7CisjaWZkZWYgX19JU0FQTlBfXworCXNob3J0IGk7CisJc3RhdGljIGludCBwbnBfY2FyZHM7CisjZW5kaWYKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKyNpZmRlZiBfX0lTQVBOUF9fCisJaWYobm9wbnAgPT0gMSkKKwkJZ290byBub19wbnA7CisJZm9yKGk9MDsgY29ya3NjcmV3X2lzYXBucF9hZGFwdGVyc1tpXS52ZW5kb3IgIT0gMDsgaSsrKSB7CisJCXN0cnVjdCBwbnBfZGV2ICppZGV2ID0gTlVMTDsKKwkJaW50IGlycTsKKwkJd2hpbGUoKGlkZXYgPSBwbnBfZmluZF9kZXYoTlVMTCwKKwkJCQkJICAgY29ya3NjcmV3X2lzYXBucF9hZGFwdGVyc1tpXS52ZW5kb3IsCisJCQkJCSAgIGNvcmtzY3Jld19pc2FwbnBfYWRhcHRlcnNbaV0uZnVuY3Rpb24sCisJCQkJCSAgIGlkZXYpKSkgeworCisJCQlpZiAocG5wX2RldmljZV9hdHRhY2goaWRldikgPCAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHBucF9hY3RpdmF0ZV9kZXYoaWRldikgPCAwKSB7CisJCQkJcHJpbnRrKCJwbnAgYWN0aXZhdGUgZmFpbGVkIChvdXQgb2YgcmVzb3VyY2VzPylcbiIpOworCQkJCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwbnBfcG9ydF92YWxpZChpZGV2LCAwKSB8fCAhcG5wX2lycV92YWxpZChpZGV2LCAwKSkgeworCQkJCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaW9hZGRyID0gcG5wX3BvcnRfc3RhcnQoaWRldiwgMCk7CisJCQlpcnEgPSBwbnBfaXJxKGlkZXYsIDApOworCQkJaWYgKCFjaGVja19kZXZpY2UoaW9hZGRyKSkgeworCQkJCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYoY29ya3NjcmV3X2RlYnVnKQorCQkJCXByaW50ayAoIklTQVBOUCByZXBvcnRzICVzIGF0IGkvbyAweCV4LCBpcnEgJWRcbiIsCisJCQkJCShjaGFyKikgY29ya3NjcmV3X2lzYXBucF9hZGFwdGVyc1tpXS5kcml2ZXJfZGF0YSwgaW9hZGRyLCBpcnEpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiM2M1MTUgUmVzb3VyY2UgY29uZmlndXJhdGlvbiByZWdpc3RlciAlIzQuNHgsIERDUiAlNC40eC5cbiIsCisJCSAgICAgCQlpbmwoaW9hZGRyICsgMHgyMDAyKSwgaW53KGlvYWRkciArIDB4MjAwMCkpOworCQkJLyogaXJxID0gaW53KGlvYWRkciArIDB4MjAwMikgJiAxNTsgKi8gLyogVXNlIHRoZSBpcnEgZnJvbSBpc2FwbnAgKi8KKwkJCWNvcmtzY3Jld19zZXR1cChkZXYsIGlvYWRkciwgaWRldiwgY2FyZHNfZm91bmQrKyk7CisJCQlTRVRfTkVUREVWX0RFVihkZXYsICZpZGV2LT5kZXYpOworCQkJcG5wX2NhcmRzKys7CisJCQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWlmICghZXJyKQorCQkJCXJldHVybiBkZXY7CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJfQorCX0KK25vX3BucDoKKyNlbmRpZiAvKiBfX0lTQVBOUF9fICovCisKKwkvKiBDaGVjayBhbGwgbG9jYXRpb25zIG9uIHRoZSBJU0EgYnVzIC0tIGV2aWwhICovCisJZm9yIChpb2FkZHIgPSAweDEwMDsgaW9hZGRyIDwgMHg0MDA7IGlvYWRkciArPSAweDIwKSB7CisJCWlmICghY2hlY2tfZGV2aWNlKGlvYWRkcikpCisJCQljb250aW51ZTsKKworCQlwcmludGsoS0VSTl9JTkZPICIzYzUxNSBSZXNvdXJjZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICUjNC40eCwgRENSICU0LjR4LlxuIiwKKwkJICAgICBpbmwoaW9hZGRyICsgMHgyMDAyKSwgaW53KGlvYWRkciArIDB4MjAwMCkpOworCQljb3Jrc2NyZXdfc2V0dXAoZGV2LCBpb2FkZHIsIE5VTEwsIGNhcmRzX2ZvdW5kKyspOworCQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJaWYgKCFlcnIpCisJCQlyZXR1cm4gZGV2OworCQljbGVhbnVwX2NhcmQoZGV2KTsKKwl9CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgY29ya3NjcmV3X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIsCisJCQkgICAgc3RydWN0IHBucF9kZXYgKmlkZXYsIGludCBjYXJkX251bWJlcikKK3sKKwlzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgZWVwcm9tWzB4NDBdLCBjaGVja3N1bSA9IDA7CS8qIEVFUFJPTSBjb250ZW50cyAqLworCWludCBpOworCWludCBpcnE7CisKKwlpZiAoaWRldikgeworCQlpcnEgPSBwbnBfaXJxKGlkZXYsIDApOworCQl2cC0+ZGV2ID0gJmlkZXYtPmRldjsKKwl9IGVsc2UgeworCQlpcnEgPSBpbncoaW9hZGRyICsgMHgyMDAyKSAmIDE1OworCX0KKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCWRldi0+aXJxID0gaXJxOworCWRldi0+ZG1hID0gaW53KGlvYWRkciArIDB4MjAwMCkgJiA3OworCXZwLT5wcm9kdWN0X25hbWUgPSAiM2M1MTUiOworCXZwLT5vcHRpb25zID0gZGV2LT5tZW1fc3RhcnQ7CisJdnAtPm91cl9kZXYgPSBkZXY7CisKKwlpZiAoIXZwLT5vcHRpb25zKSB7CisJCSBpZiAoY2FyZF9udW1iZXIgPj0gTUFYX1VOSVRTKQorCQkJdnAtPm9wdGlvbnMgPSAtMTsKKwkJZWxzZQorCQkJdnAtPm9wdGlvbnMgPSBvcHRpb25zW2NhcmRfbnVtYmVyXTsKKwl9CisKKwlpZiAodnAtPm9wdGlvbnMgPj0gMCkgeworCQl2cC0+bWVkaWFfb3ZlcnJpZGUgPSB2cC0+b3B0aW9ucyAmIDc7CisJCWlmICh2cC0+bWVkaWFfb3ZlcnJpZGUgPT0gMikKKwkJCXZwLT5tZWRpYV9vdmVycmlkZSA9IDA7CisJCXZwLT5mdWxsX2R1cGxleCA9ICh2cC0+b3B0aW9ucyAmIDgpID8gMSA6IDA7CisJCXZwLT5idXNfbWFzdGVyID0gKHZwLT5vcHRpb25zICYgMTYpID8gMSA6IDA7CisJfSBlbHNlIHsKKwkJdnAtPm1lZGlhX292ZXJyaWRlID0gNzsKKwkJdnAtPmZ1bGxfZHVwbGV4ID0gMDsKKwkJdnAtPmJ1c19tYXN0ZXIgPSAwOworCX0KKyNpZmRlZiBNT0RVTEUKKwlsaXN0X2FkZCgmdnAtPmxpc3QsICZyb290X2NvcmtzY3Jld19kZXYpOworI2VuZGlmCisKKwlwcmludGsoS0VSTl9JTkZPICIlczogM0NvbSAlcyBhdCAlIzN4LCIsIGRldi0+bmFtZSwgdnAtPnByb2R1Y3RfbmFtZSwgaW9hZGRyKTsKKworCXNwaW5fbG9ja19pbml0KCZ2cC0+bG9jayk7CisJCisJLyogUmVhZCB0aGUgc3RhdGlvbiBhZGRyZXNzIGZyb20gdGhlIEVFUFJPTS4gKi8KKwlFTDNXSU5ET1coMCk7CisJZm9yIChpID0gMDsgaSA8IDB4MTg7IGkrKykgeworCQlzaG9ydCAqcGh5c19hZGRyID0gKHNob3J0ICopIGRldi0+ZGV2X2FkZHI7CisJCWludCB0aW1lcjsKKwkJb3V0dyhFRVBST01fUmVhZCArIGksIGlvYWRkciArIFduMEVlcHJvbUNtZCk7CisJCS8qIFBhdXNlIGZvciBhdCBsZWFzdCAxNjIgdXMuIGZvciB0aGUgcmVhZCB0byB0YWtlIHBsYWNlLiAqLworCQlmb3IgKHRpbWVyID0gNDsgdGltZXIgPj0gMDsgdGltZXItLSkgeworCQkJdWRlbGF5KDE2Mik7CisJCQlpZiAoKGludyhpb2FkZHIgKyBXbjBFZXByb21DbWQpICYgMHgwMjAwKSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCWVlcHJvbVtpXSA9IGludyhpb2FkZHIgKyBXbjBFZXByb21EYXRhKTsKKwkJY2hlY2tzdW0gXj0gZWVwcm9tW2ldOworCQlpZiAoaSA8IDMpCisJCQlwaHlzX2FkZHJbaV0gPSBodG9ucyhlZXByb21baV0pOworCX0KKwljaGVja3N1bSA9IChjaGVja3N1bSBeIChjaGVja3N1bSA+PiA4KSkgJiAweGZmOworCWlmIChjaGVja3N1bSAhPSAweDAwKQorCQlwcmludGsoIiAqKipJTlZBTElEIENIRUNLU1VNICU0LjR4KioqICIsIGNoZWNrc3VtKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiVjJTIuMngiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlpZiAoZWVwcm9tWzE2XSA9PSAweDExYzcpIHsJLyogQ29ya3NjcmV3ICovCisJCWlmIChyZXF1ZXN0X2RtYShkZXYtPmRtYSwgIjNjNTE1IikpIHsKKwkJCXByaW50aygiLCBETUEgJWQgYWxsb2NhdGlvbiBmYWlsZWQiLCBkZXYtPmRtYSk7CisJCQlkZXYtPmRtYSA9IDA7CisJCX0gZWxzZQorCQkJcHJpbnRrKCIsIERNQSAlZCIsIGRldi0+ZG1hKTsKKwl9CisJcHJpbnRrKCIsIElSUSAlZFxuIiwgZGV2LT5pcnEpOworCS8qIFRlbGwgdGhlbSBhYm91dCBhbiBpbnZhbGlkIElSUS4gKi8KKwlpZiAoY29ya3NjcmV3X2RlYnVnICYmIChkZXYtPmlycSA8PSAwIHx8IGRldi0+aXJxID4gMTUpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIgKioqIFdhcm5pbmc6IHRoaXMgSVJRIGlzIHVubGlrZWx5IHRvIHdvcmshICoqKlxuIik7CisKKwl7CisJCWNoYXIgKnJhbV9zcGxpdFtdID0geyAiNTozIiwgIjM6MSIsICIxOjEiLCAiMzo1IiB9OworCQl1bmlvbiB3bjNfY29uZmlnIGNvbmZpZzsKKwkJRUwzV0lORE9XKDMpOworCQl2cC0+YXZhaWxhYmxlX21lZGlhID0gaW53KGlvYWRkciArIFduM19PcHRpb25zKTsKKwkJY29uZmlnLmkgPSBpbmwoaW9hZGRyICsgV24zX0NvbmZpZyk7CisJCWlmIChjb3Jrc2NyZXdfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiICBJbnRlcm5hbCBjb25maWcgcmVnaXN0ZXIgaXMgJTQuNHgsIHRyYW5zY2VpdmVycyAlI3guXG4iLAorCQkJCWNvbmZpZy5pLCBpbncoaW9hZGRyICsgV24zX09wdGlvbnMpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAlZEsgJXMtd2lkZSBSQU0gJXMgUng6VHggc3BsaXQsICVzJXMgaW50ZXJmYWNlLlxuIiwKKwkJCTggPDwgY29uZmlnLnUucmFtX3NpemUsCisJCQljb25maWcudS5yYW1fd2lkdGggPyAid29yZCIgOiAiYnl0ZSIsCisJCQlyYW1fc3BsaXRbY29uZmlnLnUucmFtX3NwbGl0XSwKKwkJCWNvbmZpZy51LmF1dG9zZWxlY3QgPyAiYXV0b3NlbGVjdC8iIDogIiIsCisJCQltZWRpYV90YmxbY29uZmlnLnUueGN2cl0ubmFtZSk7CisJCWRldi0+aWZfcG9ydCA9IGNvbmZpZy51LnhjdnI7CisJCXZwLT5kZWZhdWx0X21lZGlhID0gY29uZmlnLnUueGN2cjsKKwkJdnAtPmF1dG9zZWxlY3QgPSBjb25maWcudS5hdXRvc2VsZWN0OworCX0KKwlpZiAodnAtPm1lZGlhX292ZXJyaWRlICE9IDcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICBNZWRpYSBvdmVycmlkZSB0byB0cmFuc2NlaXZlciB0eXBlICVkICglcykuXG4iLAorCQkgICAgICAgdnAtPm1lZGlhX292ZXJyaWRlLAorCQkgICAgICAgbWVkaWFfdGJsW3ZwLT5tZWRpYV9vdmVycmlkZV0ubmFtZSk7CisJCWRldi0+aWZfcG9ydCA9IHZwLT5tZWRpYV9vdmVycmlkZTsKKwl9CisKKwl2cC0+Y2FwYWJpbGl0aWVzID0gZWVwcm9tWzE2XTsKKwl2cC0+ZnVsbF9idXNfbWFzdGVyX3R4ID0gKHZwLT5jYXBhYmlsaXRpZXMgJiAweDIwKSA/IDEgOiAwOworCS8qIFJ4IGlzIGJyb2tlbiBhdCAxMG1icHMsIHNvIHdlIGFsd2F5cyBkaXNhYmxlIGl0LiAqLworCS8qIHZwLT5mdWxsX2J1c19tYXN0ZXJfcnggPSAwOyAqLworCXZwLT5mdWxsX2J1c19tYXN0ZXJfcnggPSAodnAtPmNhcGFiaWxpdGllcyAmIDB4MjApID8gMSA6IDA7CisKKwkvKiBUaGUgM2M1MXgtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSAmY29ya3NjcmV3X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmY29ya3NjcmV3X3N0YXJ0X3htaXQ7CisJZGV2LT50eF90aW1lb3V0ID0gJmNvcmtzY3Jld190aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAoNDAwICogSFopIC8gMTAwMDsKKwlkZXYtPnN0b3AgPSAmY29ya3NjcmV3X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJmNvcmtzY3Jld19nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7CisJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7Cit9CisMCisKK3N0YXRpYyBpbnQgY29ya3NjcmV3X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGNvcmtzY3Jld19wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5pb24gd24zX2NvbmZpZyBjb25maWc7CisJaW50IGk7CisKKwkvKiBCZWZvcmUgaW5pdGlhbGl6aW5nIHNlbGVjdCB0aGUgYWN0aXZlIG1lZGlhIHBvcnQuICovCisJRUwzV0lORE9XKDMpOworCWlmICh2cC0+ZnVsbF9kdXBsZXgpCisJCW91dGIoMHgyMCwgaW9hZGRyICsgV24zX01BQ19DdHJsKTsJLyogU2V0IHRoZSBmdWxsLWR1cGxleCBiaXQuICovCisJY29uZmlnLmkgPSBpbmwoaW9hZGRyICsgV24zX0NvbmZpZyk7CisKKwlpZiAodnAtPm1lZGlhX292ZXJyaWRlICE9IDcpIHsKKwkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVkaWEgb3ZlcnJpZGUgdG8gdHJhbnNjZWl2ZXIgJWQgKCVzKS5cbiIsCisJCQkJZGV2LT5uYW1lLCB2cC0+bWVkaWFfb3ZlcnJpZGUsCisJCQkJbWVkaWFfdGJsW3ZwLT5tZWRpYV9vdmVycmlkZV0ubmFtZSk7CisJCWRldi0+aWZfcG9ydCA9IHZwLT5tZWRpYV9vdmVycmlkZTsKKwl9IGVsc2UgaWYgKHZwLT5hdXRvc2VsZWN0KSB7CisJCS8qIEZpbmQgZmlyc3QgYXZhaWxhYmxlIG1lZGlhIHR5cGUsIHN0YXJ0aW5nIHdpdGggMTAwYmFzZVR4LiAqLworCQlkZXYtPmlmX3BvcnQgPSA0OworCQl3aGlsZSAoISh2cC0+YXZhaWxhYmxlX21lZGlhICYgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubWFzaykpIAorCQkJZGV2LT5pZl9wb3J0ID0gbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmV4dDsKKworCQlpZiAoY29ya3NjcmV3X2RlYnVnID4gMSkKKwkJCXByaW50aygiJXM6IEluaXRpYWwgbWVkaWEgdHlwZSAlcy5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS5uYW1lKTsKKworCQlpbml0X3RpbWVyKCZ2cC0+dGltZXIpOworCQl2cC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS53YWl0OworCQl2cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJCXZwLT50aW1lci5mdW5jdGlvbiA9ICZjb3Jrc2NyZXdfdGltZXI7CS8qIHRpbWVyIGhhbmRsZXIgKi8KKwkJYWRkX3RpbWVyKCZ2cC0+dGltZXIpOworCX0gZWxzZQorCQlkZXYtPmlmX3BvcnQgPSB2cC0+ZGVmYXVsdF9tZWRpYTsKKworCWNvbmZpZy51LnhjdnIgPSBkZXYtPmlmX3BvcnQ7CisJb3V0bChjb25maWcuaSwgaW9hZGRyICsgV24zX0NvbmZpZyk7CisKKwlpZiAoY29ya3NjcmV3X2RlYnVnID4gMSkgeworCQlwcmludGsoIiVzOiBjb3Jrc2NyZXdfb3BlbigpIEludGVybmFsQ29uZmlnICU4Ljh4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgY29uZmlnLmkpOworCX0KKworCW91dHcoVHhSZXNldCwgaW9hZGRyICsgRUwzX0NNRCk7CisJZm9yIChpID0gMjA7IGkgPj0gMDsgaS0tKQorCQlpZiAoIShpbncoaW9hZGRyICsgRUwzX1NUQVRVUykgJiBDbWRJblByb2dyZXNzKSkKKwkJCWJyZWFrOworCisJb3V0dyhSeFJlc2V0LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkvKiBXYWl0IGEgZmV3IHRpY2tzIGZvciB0aGUgUnhSZXNldCBjb21tYW5kIHRvIGNvbXBsZXRlLiAqLworCWZvciAoaSA9IDIwOyBpID49IDA7IGktLSkKKwkJaWYgKCEoaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgQ21kSW5Qcm9ncmVzcykpCisJCQlicmVhazsKKworCW91dHcoU2V0U3RhdHVzRW5iIHwgMHgwMCwgaW9hZGRyICsgRUwzX0NNRCk7CisKKwkvKiBVc2UgdGhlIG5vdy1zdGFuZGFyZCBzaGFyZWQgSVJRIGltcGxlbWVudGF0aW9uLiAqLworCWlmICh2cC0+Y2FwYWJpbGl0aWVzID09IDB4MTFjNykgeworCQkvKiBDb3Jrc2NyZXc6IENhbm5vdCBzaGFyZSBJU0EgcmVzb3VyY2VzLiAqLworCQlpZiAoZGV2LT5pcnEgPT0gMAorCQkgICAgfHwgZGV2LT5kbWEgPT0gMAorCQkgICAgfHwgcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZjb3Jrc2NyZXdfaW50ZXJydXB0LCAwLAorCQkJCSAgIHZwLT5wcm9kdWN0X25hbWUsIGRldikpIHJldHVybiAtRUFHQUlOOworCQllbmFibGVfZG1hKGRldi0+ZG1hKTsKKwkJc2V0X2RtYV9tb2RlKGRldi0+ZG1hLCBETUFfTU9ERV9DQVNDQURFKTsKKwl9IGVsc2UgaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmY29ya3NjcmV3X2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkgICAgICAgdnAtPnByb2R1Y3RfbmFtZSwgZGV2KSkgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZiAoY29ya3NjcmV3X2RlYnVnID4gMSkgeworCQlFTDNXSU5ET1coNCk7CisJCXByaW50aygiJXM6IGNvcmtzY3Jld19vcGVuKCkgaXJxICVkIG1lZGlhIHN0YXR1cyAlNC40eC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxLCBpbncoaW9hZGRyICsgV240X01lZGlhKSk7CisJfQorCisJLyogU2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MgYW5kIG1hc2sgaW4gd2luZG93IDIgZWFjaCB0aW1lIG9wZW5lZC4gKi8KKwlFTDNXSU5ET1coMik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJb3V0YihkZXYtPmRldl9hZGRyW2ldLCBpb2FkZHIgKyBpKTsKKwlmb3IgKDsgaSA8IDEyOyBpICs9IDIpCisJCW91dHcoMCwgaW9hZGRyICsgaSk7CisKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDMpCisJCS8qIFN0YXJ0IHRoZSB0aGlubmV0IHRyYW5zY2VpdmVyLiBXZSBzaG91bGQgcmVhbGx5IHdhaXQgNTBtcy4uLiAqLworCQlvdXR3KFN0YXJ0Q29heCwgaW9hZGRyICsgRUwzX0NNRCk7CisJRUwzV0lORE9XKDQpOworCW91dHcoKGludyhpb2FkZHIgKyBXbjRfTWVkaWEpICYgfihNZWRpYV8xMFRQIHwgTWVkaWFfU1FFKSkgfAorCSAgICAgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubWVkaWFfYml0cywgaW9hZGRyICsgV240X01lZGlhKTsKKworCS8qIFN3aXRjaCB0byB0aGUgc3RhdHMgd2luZG93LCBhbmQgY2xlYXIgYWxsIHN0YXRzIGJ5IHJlYWRpbmcuICovCisJb3V0dyhTdGF0c0Rpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCUVMM1dJTkRPVyg2KTsKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJaW5iKGlvYWRkciArIGkpOworCWludyhpb2FkZHIgKyAxMCk7CisJaW53KGlvYWRkciArIDEyKTsKKwkvKiBOZXc6IE9uIHRoZSBWb3J0ZXggd2UgbXVzdCBhbHNvIGNsZWFyIHRoZSBCYWRTU0QgY291bnRlci4gKi8KKwlFTDNXSU5ET1coNCk7CisJaW5iKGlvYWRkciArIDEyKTsKKwkvKiAuLmFuZCBvbiB0aGUgQm9vbWVyYW5nIHdlIGVuYWJsZSB0aGUgZXh0cmEgc3RhdGlzdGljcyBiaXRzLiAqLworCW91dHcoMHgwMDQwLCBpb2FkZHIgKyBXbjRfTmV0RGlhZyk7CisKKwkvKiBTd2l0Y2ggdG8gcmVnaXN0ZXIgc2V0IDcgZm9yIG5vcm1hbCB1c2UuICovCisJRUwzV0lORE9XKDcpOworCisJaWYgKHZwLT5mdWxsX2J1c19tYXN0ZXJfcngpIHsJLyogQm9vbWVyYW5nIGJ1cyBtYXN0ZXIuICovCisJCXZwLT5jdXJfcnggPSB2cC0+ZGlydHlfcnggPSAwOworCQlpZiAoY29ya3NjcmV3X2RlYnVnID4gMikKKwkJCXByaW50aygiJXM6ICBGaWxsaW5nIGluIHRoZSBSeCByaW5nLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQlpZiAoaSA8IChSWF9SSU5HX1NJWkUgLSAxKSkKKwkJCQl2cC0+cnhfcmluZ1tpXS5uZXh0ID0KKwkJCQkgICAgaXNhX3ZpcnRfdG9fYnVzKCZ2cC0+cnhfcmluZ1tpICsgMV0pOworCQkJZWxzZQorCQkJCXZwLT5yeF9yaW5nW2ldLm5leHQgPSAwOworCQkJdnAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gMDsJLyogQ2xlYXIgY29tcGxldGUgYml0LiAqLworCQkJdnAtPnJ4X3JpbmdbaV0ubGVuZ3RoID0gUEtUX0JVRl9TWiB8IDB4ODAwMDAwMDA7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOworCQkJdnAtPnJ4X3NrYnVmZltpXSA9IHNrYjsKKwkJCWlmIChza2IgPT0gTlVMTCkKKwkJCQlicmVhazsJLyogQmFkIG5ld3MhICAqLworCQkJc2tiLT5kZXYgPSBkZXY7CS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLworCQkJdnAtPnJ4X3JpbmdbaV0uYWRkciA9IGlzYV92aXJ0X3RvX2J1cyhza2ItPnRhaWwpOworCQl9CisJCXZwLT5yeF9yaW5nW2kgLSAxXS5uZXh0ID0gaXNhX3ZpcnRfdG9fYnVzKCZ2cC0+cnhfcmluZ1swXSk7CS8qIFdyYXAgdGhlIHJpbmcuICovCisJCW91dGwoaXNhX3ZpcnRfdG9fYnVzKCZ2cC0+cnhfcmluZ1swXSksIGlvYWRkciArIFVwTGlzdFB0cik7CisJfQorCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KSB7CS8qIEJvb21lcmFuZyBidXMgbWFzdGVyIFR4LiAqLworCQl2cC0+Y3VyX3R4ID0gdnAtPmRpcnR5X3R4ID0gMDsKKwkJb3V0YihQS1RfQlVGX1NaID4+IDgsIGlvYWRkciArIFR4RnJlZVRocmVzaG9sZCk7CS8qIFJvb20gZm9yIGEgcGFja2V0LiAqLworCQkvKiBDbGVhciB0aGUgVHggcmluZy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJdnAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCW91dGwoMCwgaW9hZGRyICsgRG93bkxpc3RQdHIpOworCX0KKwkvKiBTZXQgcmVjZWl2ZXIgbW9kZTogcHJlc3VtYWJseSBhY2NlcHQgYi1jYXNlIGFuZCBwaHlzIGFkZHIgb25seS4gKi8KKwlzZXRfcnhfbW9kZShkZXYpOworCW91dHcoU3RhdHNFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOwkvKiBUdXJuIG9uIHN0YXRpc3RpY3MuICovCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJb3V0dyhSeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CS8qIEVuYWJsZSB0aGUgcmVjZWl2ZXIuICovCisJb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CS8qIEVuYWJsZSB0cmFuc21pdHRlci4gKi8KKwkvKiBBbGxvdyBzdGF0dXMgYml0cyB0byBiZSBzZWVuLiAqLworCW91dHcoU2V0U3RhdHVzRW5iIHwgQWRhcHRlckZhaWx1cmUgfCBJbnRSZXEgfCBTdGF0c0Z1bGwgfAorCSAgICAgKHZwLT5mdWxsX2J1c19tYXN0ZXJfdHggPyBEb3duQ29tcGxldGUgOiBUeEF2YWlsYWJsZSkgfAorCSAgICAgKHZwLT5mdWxsX2J1c19tYXN0ZXJfcnggPyBVcENvbXBsZXRlIDogUnhDb21wbGV0ZSkgfAorCSAgICAgKHZwLT5idXNfbWFzdGVyID8gRE1BRG9uZSA6IDApLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkvKiBBY2sgYWxsIHBlbmRpbmcgZXZlbnRzLCBhbmQgc2V0IGFjdGl2ZSBpbmRpY2F0b3IgbWFzay4gKi8KKwlvdXR3KEFja0ludHIgfCBJbnRMYXRjaCB8IFR4QXZhaWxhYmxlIHwgUnhFYXJseSB8IEludFJlcSwKKwkgICAgIGlvYWRkciArIEVMM19DTUQpOworCW91dHcoU2V0SW50ckVuYiB8IEludExhdGNoIHwgVHhBdmFpbGFibGUgfCBSeENvbXBsZXRlIHwgU3RhdHNGdWxsCisJICAgICB8ICh2cC0+YnVzX21hc3RlciA/IERNQURvbmUgOiAwKSB8IFVwQ29tcGxldGUgfCBEb3duQ29tcGxldGUsCisJICAgICBpb2FkZHIgKyBFTDNfQ01EKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb3Jrc2NyZXdfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworI2lmZGVmIEFVVE9NRURJQQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgb2sgPSAwOworCisJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDEpCisJCXByaW50aygiJXM6IE1lZGlhIHNlbGVjdGlvbiB0aW1lciB0aWNrIGhhcHBlbmVkLCAlcy5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZwLT5sb2NrLCBmbGFncyk7CisJCisJeworCQlpbnQgb2xkX3dpbmRvdyA9IGludyhpb2FkZHIgKyBFTDNfQ01EKSA+PiAxMzsKKwkJaW50IG1lZGlhX3N0YXR1czsKKwkJRUwzV0lORE9XKDQpOworCQltZWRpYV9zdGF0dXMgPSBpbncoaW9hZGRyICsgV240X01lZGlhKTsKKwkJc3dpdGNoIChkZXYtPmlmX3BvcnQpIHsKKwkJY2FzZSAwOgorCQljYXNlIDQ6CisJCWNhc2UgNToJLyogMTBiYXNlVCwgMTAwYmFzZVRYLCAxMDBiYXNlRlggICovCisJCQlpZiAobWVkaWFfc3RhdHVzICYgTWVkaWFfTG5rQmVhdCkgeworCQkJCW9rID0gMTsKKwkJCQlpZiAoY29ya3NjcmV3X2RlYnVnID4gMSkKKwkJCQkJcHJpbnRrKCIlczogTWVkaWEgJXMgaGFzIGxpbmsgYmVhdCwgJXguXG4iLAorCQkJCQkJZGV2LT5uYW1lLAorCQkJCQkJbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSwKKwkJCQkJCW1lZGlhX3N0YXR1cyk7CisJCQl9IGVsc2UgaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKCIlczogTWVkaWEgJXMgaXMgaGFzIG5vIGxpbmsgYmVhdCwgJXguXG4iLAorCQkJCQlkZXYtPm5hbWUsCisJCQkJCW1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUsCisJCQkJCW1lZGlhX3N0YXR1cyk7CisKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkvKiBPdGhlciBtZWRpYSB0eXBlcyBoYW5kbGVkIGJ5IFR4IHRpbWVvdXRzLiAqLworCQkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKCIlczogTWVkaWEgJXMgaXMgaGFzIG5vIGluZGljYXRpb24sICV4LlxuIiwKKwkJCQkJZGV2LT5uYW1lLAorCQkJCQltZWRpYV90YmxbZGV2LT5pZl9wb3J0XS5uYW1lLAorCQkJCQltZWRpYV9zdGF0dXMpOworCQkJb2sgPSAxOworCQl9CisJCWlmICghb2spIHsKKwkJCXVuaW9uIHduM19jb25maWcgY29uZmlnOworCisJCQlkbyB7CisJCQkJZGV2LT5pZl9wb3J0ID0KKwkJCQkgICAgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmV4dDsKKwkJCX0KKwkJCXdoaWxlICghKHZwLT5hdmFpbGFibGVfbWVkaWEgJiBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS5tYXNrKSk7CisJCQkKKwkJCWlmIChkZXYtPmlmX3BvcnQgPT0gOCkgewkvKiBHbyBiYWNrIHRvIGRlZmF1bHQuICovCisJCQkJZGV2LT5pZl9wb3J0ID0gdnAtPmRlZmF1bHRfbWVkaWE7CisJCQkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDEpCisJCQkJCXByaW50aygiJXM6IE1lZGlhIHNlbGVjdGlvbiBmYWlsaW5nLCB1c2luZyBkZWZhdWx0ICVzIHBvcnQuXG4iLAorCQkJCQkJZGV2LT5uYW1lLAorCQkJCQkJbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChjb3Jrc2NyZXdfZGVidWcgPiAxKQorCQkJCQlwcmludGsoIiVzOiBNZWRpYSBzZWxlY3Rpb24gZmFpbGVkLCBub3cgdHJ5aW5nICVzIHBvcnQuXG4iLAorCQkJCQkJZGV2LT5uYW1lLAorCQkJCQkJbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSk7CisJCQkJdnAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ud2FpdDsKKwkJCQlhZGRfdGltZXIoJnZwLT50aW1lcik7CisJCQl9CisJCQlvdXR3KChtZWRpYV9zdGF0dXMgJiB+KE1lZGlhXzEwVFAgfCBNZWRpYV9TUUUpKSB8CisJCQkgICAgIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm1lZGlhX2JpdHMsCisJCQkgICAgIGlvYWRkciArIFduNF9NZWRpYSk7CisKKwkJCUVMM1dJTkRPVygzKTsKKwkJCWNvbmZpZy5pID0gaW5sKGlvYWRkciArIFduM19Db25maWcpOworCQkJY29uZmlnLnUueGN2ciA9IGRldi0+aWZfcG9ydDsKKwkJCW91dGwoY29uZmlnLmksIGlvYWRkciArIFduM19Db25maWcpOworCisJCQlvdXR3KGRldi0+aWZfcG9ydCA9PSAzID8gU3RhcnRDb2F4IDogU3RvcENvYXgsCisJCQkgICAgIGlvYWRkciArIEVMM19DTUQpOworCQl9CisJCUVMM1dJTkRPVyhvbGRfd2luZG93KTsKKwl9CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoY29ya3NjcmV3X2RlYnVnID4gMSkKKwkJcHJpbnRrKCIlczogTWVkaWEgc2VsZWN0aW9uIHRpbWVyIGZpbmlzaGVkLCAlcy5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUpOworCisjZW5kaWYJCQkJLyogQVVUT01FRElBICovCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjb3Jrc2NyZXdfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBjb3Jrc2NyZXdfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHR4X3N0YXR1cyAlMi4yeCBzdGF0dXMgJTQuNHguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGluYihpb2FkZHIgKyBUeFN0YXR1cyksCisJICAgICAgIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSk7CisJLyogU2xpZ2h0IGNvZGUgYmxvYXQgdG8gYmUgdXNlciBmcmllbmRseS4gKi8KKwlpZiAoKGluYihpb2FkZHIgKyBUeFN0YXR1cykgJiAweDg4KSA9PSAweDg4KQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IFRyYW5zbWl0dGVyIGVuY291bnRlcmVkIDE2IGNvbGxpc2lvbnMgLS0gbmV0d29yayIKKwkJICAgICAgICIgbmV0d29yayBjYWJsZSBwcm9ibGVtP1xuIiwgZGV2LT5uYW1lKTsKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCXByaW50aygiICBGbGFnczsgYnVzLW1hc3RlciAlZCwgZnVsbCAlZDsgZGlydHkgJWQgY3VycmVudCAlZC5cbiIsCisJICAgICAgIHZwLT5mdWxsX2J1c19tYXN0ZXJfdHgsIHZwLT50eF9mdWxsLCB2cC0+ZGlydHlfdHgsCisJICAgICAgIHZwLT5jdXJfdHgpOworCXByaW50aygiICBEb3duIGxpc3QgJTguOHggdnMuICVwLlxuIiwgaW5sKGlvYWRkciArIERvd25MaXN0UHRyKSwKKwkgICAgICAgJnZwLT50eF9yaW5nWzBdKTsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJcHJpbnRrKCIgICVkOiAlcCAgbGVuZ3RoICU4Ljh4IHN0YXR1cyAlOC44eFxuIiwgaSwKKwkJICAgICAgICZ2cC0+dHhfcmluZ1tpXSwKKwkJICAgICAgIHZwLT50eF9yaW5nW2ldLmxlbmd0aCwgdnAtPnR4X3JpbmdbaV0uc3RhdHVzKTsKKwl9CisjZW5kaWYKKwkvKiBJc3N1ZSBUWF9SRVNFVCBhbmQgVFhfU1RBUlQgY29tbWFuZHMuICovCisJb3V0dyhUeFJlc2V0LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwlmb3IgKGkgPSAyMDsgaSA+PSAwOyBpLS0pCisJCWlmICghKGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSAmIENtZEluUHJvZ3Jlc3MpKQorCQkJYnJlYWs7CisJb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJdnAtPnN0YXRzLnR4X2Vycm9ycysrOworCXZwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGNvcmtzY3Jld19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBCbG9jayBhIHRpbWVyLWJhc2VkIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuICovCisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl90eCkgewkvKiBCT09NRVJBTkcgYnVzLW1hc3RlciAqLworCQkvKiBDYWxjdWxhdGUgdGhlIG5leHQgVHggZGVzY3JpcHRvciBlbnRyeS4gKi8KKwkJaW50IGVudHJ5ID0gdnAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKwkJc3RydWN0IGJvb21fdHhfZGVzYyAqcHJldl9lbnRyeTsKKwkJdW5zaWduZWQgbG9uZyBmbGFncywgaTsKKworCQlpZiAodnAtPnR4X2Z1bGwpCS8qIE5vIHJvb20gdG8gdHJhbnNtaXQgd2l0aCAqLworCQkJcmV0dXJuIDE7CisJCWlmICh2cC0+Y3VyX3R4ICE9IDApCisJCQlwcmV2X2VudHJ5ID0gJnZwLT50eF9yaW5nWyh2cC0+Y3VyX3R4IC0gMSkgJSBUWF9SSU5HX1NJWkVdOworCQllbHNlCisJCQlwcmV2X2VudHJ5ID0gTlVMTDsKKwkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDMpCisJCQlwcmludGsoIiVzOiBUcnlpbmcgdG8gc2VuZCBhIHBhY2tldCwgVHggaW5kZXggJWQuXG4iLAorCQkJCWRldi0+bmFtZSwgdnAtPmN1cl90eCk7CisJCS8qIHZwLT50eF9mdWxsID0gMTsgKi8KKwkJdnAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJCXZwLT50eF9yaW5nW2VudHJ5XS5uZXh0ID0gMDsKKwkJdnAtPnR4X3JpbmdbZW50cnldLmFkZHIgPSBpc2FfdmlydF90b19idXMoc2tiLT5kYXRhKTsKKwkJdnAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCA9IHNrYi0+bGVuIHwgMHg4MDAwMDAwMDsKKwkJdnAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9IHNrYi0+bGVuIHwgMHg4MDAwMDAwMDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwkJb3V0dyhEb3duU3RhbGwsIGlvYWRkciArIEVMM19DTUQpOworCQkvKiBXYWl0IGZvciB0aGUgc3RhbGwgdG8gY29tcGxldGUuICovCisJCWZvciAoaSA9IDIwOyBpID49IDA7IGktLSkKKwkJCWlmICgoaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgQ21kSW5Qcm9ncmVzcykgPT0gMCkgCisJCQkJYnJlYWs7CisJCWlmIChwcmV2X2VudHJ5KQorCQkJcHJldl9lbnRyeS0+bmV4dCA9IGlzYV92aXJ0X3RvX2J1cygmdnAtPnR4X3JpbmdbZW50cnldKTsKKwkJaWYgKGlubChpb2FkZHIgKyBEb3duTGlzdFB0cikgPT0gMCkgeworCQkJb3V0bChpc2FfdmlydF90b19idXMoJnZwLT50eF9yaW5nW2VudHJ5XSksCisJCQkgICAgIGlvYWRkciArIERvd25MaXN0UHRyKTsKKwkJCXF1ZXVlZF9wYWNrZXQrKzsKKwkJfQorCQlvdXR3KERvd25VbnN0YWxsLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKworCQl2cC0+Y3VyX3R4Kys7CisJCWlmICh2cC0+Y3VyX3R4IC0gdnAtPmRpcnR5X3R4ID4gVFhfUklOR19TSVpFIC0gMSkKKwkJCXZwLT50eF9mdWxsID0gMTsKKwkJZWxzZSB7CQkvKiBDbGVhciBwcmV2aW91cyBpbnRlcnJ1cHQgZW5hYmxlLiAqLworCQkJaWYgKHByZXZfZW50cnkpCisJCQkJcHJldl9lbnRyeS0+c3RhdHVzICY9IH4weDgwMDAwMDAwOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQl9CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlyZXR1cm4gMDsKKwl9CisJLyogUHV0IG91dCB0aGUgZG91Ymxld29yZCBoZWFkZXIuLi4gKi8KKwlvdXRsKHNrYi0+bGVuLCBpb2FkZHIgKyBUWF9GSUZPKTsKKwl2cC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisjaWZkZWYgVk9SVEVYX0JVU19NQVNURVIKKwlpZiAodnAtPmJ1c19tYXN0ZXIpIHsKKwkJLyogU2V0IHRoZSBidXMtbWFzdGVyIGNvbnRyb2xsZXIgdG8gdHJhbnNmZXIgdGhlIHBhY2tldC4gKi8KKwkJb3V0bCgoaW50KSAoc2tiLT5kYXRhKSwgaW9hZGRyICsgV243X01hc3RlckFkZHIpOworCQlvdXR3KChza2ItPmxlbiArIDMpICYgfjMsIGlvYWRkciArIFduN19NYXN0ZXJMZW4pOworCQl2cC0+dHhfc2tiID0gc2tiOworCQlvdXR3KFN0YXJ0RE1BRG93biwgaW9hZGRyICsgRUwzX0NNRCk7CisJCS8qIHF1ZXVlIHdpbGwgYmUgd29rZW4gYXQgdGhlIERNQURvbmUgaW50ZXJydXB0LiAqLworCX0gZWxzZSB7CisJCS8qIC4uLiBhbmQgdGhlIHBhY2tldCByb3VuZGVkIHRvIGEgZG91Ymxld29yZC4gKi8KKwkJb3V0c2woaW9hZGRyICsgVFhfRklGTywgc2tiLT5kYXRhLCAoc2tiLT5sZW4gKyAzKSA+PiAyKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlpZiAoaW53KGlvYWRkciArIFR4RnJlZSkgPiAxNTM2KSB7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0gZWxzZQorCQkJLyogSW50ZXJydXB0IHVzIHdoZW4gdGhlIEZJRk8gaGFzIHJvb20gZm9yIG1heC1zaXplZCBwYWNrZXQuICovCisJCQlvdXR3KFNldFR4VGhyZXNob2xkICsgKDE1MzYgPj4gMiksCisJCQkgICAgIGlvYWRkciArIEVMM19DTUQpOworCX0KKyNlbHNlCisJLyogLi4uIGFuZCB0aGUgcGFja2V0IHJvdW5kZWQgdG8gYSBkb3VibGV3b3JkLiAqLworCW91dHNsKGlvYWRkciArIFRYX0ZJRk8sIHNrYi0+ZGF0YSwgKHNrYi0+bGVuICsgMykgPj4gMik7CisJZGV2X2tmcmVlX3NrYihza2IpOworCWlmIChpbncoaW9hZGRyICsgVHhGcmVlKSA+IDE1MzYpIHsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0gZWxzZQorCQkvKiBJbnRlcnJ1cHQgdXMgd2hlbiB0aGUgRklGTyBoYXMgcm9vbSBmb3IgbWF4LXNpemVkIHBhY2tldC4gKi8KKwkJb3V0dyhTZXRUeFRocmVzaG9sZCArICgxNTM2ID4+IDIpLCBpb2FkZHIgKyBFTDNfQ01EKTsKKyNlbmRpZgkJCQkvKiBidXMgbWFzdGVyICovCisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIENsZWFyIHRoZSBUeCBzdGF0dXMgc3RhY2suICovCisJeworCQlzaG9ydCB0eF9zdGF0dXM7CisJCWludCBpID0gNDsKKworCQl3aGlsZSAoLS1pID4gMCAmJiAodHhfc3RhdHVzID0gaW5iKGlvYWRkciArIFR4U3RhdHVzKSkgPiAwKSB7CisJCQlpZiAodHhfc3RhdHVzICYgMHgzQykgewkvKiBBIFR4LWRpc2FibGluZyBlcnJvciBvY2N1cnJlZC4gICovCisJCQkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDIpCisJCQkJCXByaW50aygiJXM6IFR4IGVycm9yLCBzdGF0dXMgJTIuMnguXG4iLAorCQkJCQkJZGV2LT5uYW1lLCB0eF9zdGF0dXMpOworCQkJCWlmICh0eF9zdGF0dXMgJiAweDA0KQorCQkJCQl2cC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQlpZiAodHhfc3RhdHVzICYgMHgzOCkKKwkJCQkJdnAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJaWYgKHR4X3N0YXR1cyAmIDB4MzApIHsKKwkJCQkJaW50IGo7CisJCQkJCW91dHcoVHhSZXNldCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQkJCWZvciAoaiA9IDIwOyBqID49IDA7IGotLSkKKwkJCQkJCWlmICghKGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSAmIENtZEluUHJvZ3Jlc3MpKSAKKwkJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQl9CisJCQlvdXRiKDB4MDAsIGlvYWRkciArIFR4U3RhdHVzKTsJLyogUG9wIHRoZSBzdGF0dXMgc3RhY2suICovCisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIGFsbCBvZiB0aGUgUnggdGhyZWFkIHdvcmsgYW5kIGNsZWFucyB1cAorICAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KKworc3RhdGljIGlycXJldHVybl90IGNvcmtzY3Jld19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKiBVc2UgdGhlIG5vdy1zdGFuZGFyZCBzaGFyZWQgSVJRIGltcGxlbWVudGF0aW9uLiAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGNvcmtzY3Jld19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciwgc3RhdHVzOworCWludCBsYXRlbmN5OworCWludCBpID0gbWF4X2ludGVycnVwdF93b3JrOworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbGF0ZW5jeSA9IGluYihpb2FkZHIgKyBUaW1lcik7CisKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKwkKKwlzdGF0dXMgPSBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyk7CisKKwlpZiAoY29ya3NjcmV3X2RlYnVnID4gNCkKKwkJcHJpbnRrKCIlczogaW50ZXJydXB0LCBzdGF0dXMgJTQuNHgsIHRpbWVyICVkLlxuIiwKKwkJCWRldi0+bmFtZSwgc3RhdHVzLCBsYXRlbmN5KTsKKwlpZiAoKHN0YXR1cyAmIDB4RTAwMCkgIT0gMHhFMDAwKSB7CisJCXN0YXRpYyBpbnQgZG9uZWRpZHRoaXM7CisJCS8qIFNvbWUgaW50ZXJydXB0IGNvbnRyb2xsZXJzIHN0b3JlIGEgYm9ndXMgaW50ZXJydXB0IGZyb20gYm9vdC10aW1lLgorCQkgICBJZ25vcmUgYSBzaW5nbGUgZWFybHkgaW50ZXJydXB0LCBidXQgZG9uJ3QgaGFuZyB0aGUgbWFjaGluZSBmb3IKKwkJICAgb3RoZXIgaW50ZXJydXB0IHByb2JsZW1zLiAqLworCQlpZiAoZG9uZWRpZHRoaXMrKyA+IDEwMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQm9ndXMgaW50ZXJydXB0LCBiYWlsaW5nLiBTdGF0dXMgJTQuNHgsIHN0YXJ0PSVkLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cywgbmV0aWZfcnVubmluZyhkZXYpKTsKKwkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQkJZGV2LT5pcnEgPSAtMTsKKwkJfQorCX0KKworCWRvIHsKKwkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDUpCisJCQlwcmludGsoIiVzOiBJbiBpbnRlcnJ1cHQgbG9vcCwgc3RhdHVzICU0LjR4LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCWlmIChzdGF0dXMgJiBSeENvbXBsZXRlKQorCQkJY29ya3NjcmV3X3J4KGRldik7CisKKwkJaWYgKHN0YXR1cyAmIFR4QXZhaWxhYmxlKSB7CisJCQlpZiAoY29ya3NjcmV3X2RlYnVnID4gNSkKKwkJCQlwcmludGsoIglUWCByb29tIGJpdCB3YXMgaGFuZGxlZC5cbiIpOworCQkJLyogVGhlcmUncyByb29tIGluIHRoZSBGSUZPIGZvciBhIGZ1bGwtc2l6ZWQgcGFja2V0LiAqLworCQkJb3V0dyhBY2tJbnRyIHwgVHhBdmFpbGFibGUsIGlvYWRkciArIEVMM19DTUQpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQl9CisJCWlmIChzdGF0dXMgJiBEb3duQ29tcGxldGUpIHsKKwkJCXVuc2lnbmVkIGludCBkaXJ0eV90eCA9IGxwLT5kaXJ0eV90eDsKKworCQkJd2hpbGUgKGxwLT5jdXJfdHggLSBkaXJ0eV90eCA+IDApIHsKKwkJCQlpbnQgZW50cnkgPSBkaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKKwkJCQlpZiAoaW5sKGlvYWRkciArIERvd25MaXN0UHRyKSA9PSBpc2FfdmlydF90b19idXMoJmxwLT50eF9yaW5nW2VudHJ5XSkpCisJCQkJCWJyZWFrOwkvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQuICovCisJCQkJaWYgKGxwLT50eF9za2J1ZmZbZW50cnldKSB7CisJCQkJCWRldl9rZnJlZV9za2JfaXJxKGxwLT50eF9za2J1ZmZbZW50cnldKTsKKwkJCQkJbHAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJCX0KKwkJCQlkaXJ0eV90eCsrOworCQkJfQorCQkJbHAtPmRpcnR5X3R4ID0gZGlydHlfdHg7CisJCQlvdXR3KEFja0ludHIgfCBEb3duQ29tcGxldGUsIGlvYWRkciArIEVMM19DTUQpOworCQkJaWYgKGxwLT50eF9mdWxsICYmIChscC0+Y3VyX3R4IC0gZGlydHlfdHggPD0gVFhfUklOR19TSVpFIC0gMSkpIHsKKwkJCQlscC0+dHhfZnVsbCA9IDA7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJfQorCQl9CisjaWZkZWYgVk9SVEVYX0JVU19NQVNURVIKKwkJaWYgKHN0YXR1cyAmIERNQURvbmUpIHsKKwkJCW91dHcoMHgxMDAwLCBpb2FkZHIgKyBXbjdfTWFzdGVyU3RhdHVzKTsJLyogQWNrIHRoZSBldmVudC4gKi8KKwkJCWRldl9rZnJlZV9za2JfaXJxKGxwLT50eF9za2IpOwkvKiBSZWxlYXNlIHRoZSB0cmFuc2ZlcnJlZCBidWZmZXIgKi8KKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorI2VuZGlmCisJCWlmIChzdGF0dXMgJiBVcENvbXBsZXRlKSB7CisJCQlib29tZXJhbmdfcngoZGV2KTsKKwkJCW91dHcoQWNrSW50ciB8IFVwQ29tcGxldGUsIGlvYWRkciArIEVMM19DTUQpOworCQl9CisJCWlmIChzdGF0dXMgJiAoQWRhcHRlckZhaWx1cmUgfCBSeEVhcmx5IHwgU3RhdHNGdWxsKSkgeworCQkJLyogSGFuZGxlIGFsbCB1bmNvbW1vbiBpbnRlcnJ1cHRzIGF0IG9uY2UuICovCisJCQlpZiAoc3RhdHVzICYgUnhFYXJseSkgewkvKiBSeCBlYXJseSBpcyB1bnVzZWQuICovCisJCQkJY29ya3NjcmV3X3J4KGRldik7CisJCQkJb3V0dyhBY2tJbnRyIHwgUnhFYXJseSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQl9CisJCQlpZiAoc3RhdHVzICYgU3RhdHNGdWxsKSB7CS8qIEVtcHR5IHN0YXRpc3RpY3MuICovCisJCQkJc3RhdGljIGludCBEb25lRGlkVGhhdDsKKwkJCQlpZiAoY29ya3NjcmV3X2RlYnVnID4gNCkKKwkJCQkJcHJpbnRrKCIlczogVXBkYXRpbmcgc3RhdHMuXG4iLCBkZXYtPm5hbWUpOworCQkJCXVwZGF0ZV9zdGF0cyhpb2FkZHIsIGRldik7CisJCQkJLyogREVCVUcgSEFDSzogRGlzYWJsZSBzdGF0aXN0aWNzIGFzIGFuIGludGVycnVwdCBzb3VyY2UuICovCisJCQkJLyogVGhpcyBvY2N1cnMgd2hlbiB3ZSBoYXZlIHRoZSB3cm9uZyBtZWRpYSB0eXBlISAqLworCQkJCWlmIChEb25lRGlkVGhhdCA9PSAwICYmIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSAmIFN0YXRzRnVsbCkgeworCQkJCQlpbnQgd2luLCByZWc7CisJCQkJCXByaW50aygiJXM6IFVwZGF0aW5nIHN0YXRzIGZhaWxlZCwgZGlzYWJsaW5nIHN0YXRzIGFzIGFuIgorCQkJCQkgICAgICIgaW50ZXJydXB0IHNvdXJjZS5cbiIsIGRldi0+bmFtZSk7CisJCQkJCWZvciAod2luID0gMDsgd2luIDwgODsgd2luKyspIHsKKwkJCQkJCUVMM1dJTkRPVyh3aW4pOworCQkJCQkJcHJpbnRrKCJcbiBWb3J0ZXggd2luZG93ICVkOiIsIHdpbik7CisJCQkJCQlmb3IgKHJlZyA9IDA7IHJlZyA8IDE2OyByZWcrKykKKwkJCQkJCQlwcmludGsoIiAlMi4yeCIsIGluYihpb2FkZHIgKyByZWcpKTsKKwkJCQkJfQorCQkJCQlFTDNXSU5ET1coNyk7CisJCQkJCW91dHcoU2V0SW50ckVuYiB8IFR4QXZhaWxhYmxlIHwKKwkJCQkJICAgICBSeENvbXBsZXRlIHwgQWRhcHRlckZhaWx1cmUgfAorCQkJCQkgICAgIFVwQ29tcGxldGUgfCBEb3duQ29tcGxldGUgfAorCQkJCQkgICAgIFR4Q29tcGxldGUsIGlvYWRkciArIEVMM19DTUQpOworCQkJCQlEb25lRGlkVGhhdCsrOworCQkJCX0KKwkJCX0KKwkJCWlmIChzdGF0dXMgJiBBZGFwdGVyRmFpbHVyZSkgeworCQkJCS8qIEFkYXB0ZXIgZmFpbHVyZSByZXF1aXJlcyBSeCByZXNldCBhbmQgcmVpbml0LiAqLworCQkJCW91dHcoUnhSZXNldCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQkJLyogU2V0IHRoZSBSeCBmaWx0ZXIgdG8gdGhlIGN1cnJlbnQgc3RhdGUuICovCisJCQkJc2V0X3J4X21vZGUoZGV2KTsKKwkJCQlvdXR3KFJ4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsJLyogUmUtZW5hYmxlIHRoZSByZWNlaXZlci4gKi8KKwkJCQlvdXR3KEFja0ludHIgfCBBZGFwdGVyRmFpbHVyZSwKKwkJCQkgICAgIGlvYWRkciArIEVMM19DTUQpOworCQkJfQorCQl9CisKKwkJaWYgKC0taSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRvbyBtdWNoIHdvcmsgaW4gaW50ZXJydXB0LCBzdGF0dXMgJTQuNHguICAiCisJCQkgICAgICJEaXNhYmxpbmcgZnVuY3Rpb25zICglNC40eCkuXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgIHN0YXR1cywgU2V0U3RhdHVzRW5iIHwgKCh+c3RhdHVzKSAmIDB4N0ZFKSk7CisJCQkvKiBEaXNhYmxlIGFsbCBwZW5kaW5nIGludGVycnVwdHMuICovCisJCQlvdXR3KFNldFN0YXR1c0VuYiB8ICgofnN0YXR1cykgJiAweDdGRSksIGlvYWRkciArIEVMM19DTUQpOworCQkJb3V0dyhBY2tJbnRyIHwgMHg3RkYsIGlvYWRkciArIEVMM19DTUQpOworCQkJYnJlYWs7CisJCX0KKwkJLyogQWNrbm93bGVkZ2UgdGhlIElSUS4gKi8KKwkJb3V0dyhBY2tJbnRyIHwgSW50UmVxIHwgSW50TGF0Y2gsIGlvYWRkciArIEVMM19DTUQpOworCisJfSB3aGlsZSAoKHN0YXR1cyA9IGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSkgJiAoSW50TGF0Y2ggfCBSeENvbXBsZXRlKSk7CisJCisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKworCWlmIChjb3Jrc2NyZXdfZGVidWcgPiA0KQorCQlwcmludGsoIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBjb3Jrc2NyZXdfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisJc2hvcnQgcnhfc3RhdHVzOworCisJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDUpCisJCXByaW50aygiICAgSW4gcnhfcGFja2V0KCksIHN0YXR1cyAlNC40eCwgcnhfc3RhdHVzICU0LjR4LlxuIiwKKwkJICAgICBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyksIGludyhpb2FkZHIgKyBSeFN0YXR1cykpOworCXdoaWxlICgocnhfc3RhdHVzID0gaW53KGlvYWRkciArIFJ4U3RhdHVzKSkgPiAwKSB7CisJCWlmIChyeF9zdGF0dXMgJiAweDQwMDApIHsJLyogRXJyb3IsIHVwZGF0ZSBzdGF0cy4gKi8KKwkJCXVuc2lnbmVkIGNoYXIgcnhfZXJyb3IgPSBpbmIoaW9hZGRyICsgUnhFcnJvcnMpOworCQkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDIpCisJCQkJcHJpbnRrKCIgUnggZXJyb3I6IHN0YXR1cyAlMi4yeC5cbiIsCisJCQkJICAgICAgIHJ4X2Vycm9yKTsKKwkJCXZwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MDEpCisJCQkJdnAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDAyKQorCQkJCXZwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDA0KQorCQkJCXZwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MDgpCisJCQkJdnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MTApCisJCQkJdnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIFRoZSBwYWNrZXQgbGVuZ3RoOiB1cCB0byA0LjVLIS4gKi8KKwkJCXNob3J0IHBrdF9sZW4gPSByeF9zdGF0dXMgJiAweDFmZmY7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyA1ICsgMik7CisJCQlpZiAoY29ya3NjcmV3X2RlYnVnID4gNCkKKwkJCQlwcmludGsoIlJlY2VpdmluZyBwYWNrZXQgc2l6ZSAlZCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCSAgICAgcGt0X2xlbiwgcnhfc3RhdHVzKTsKKwkJCWlmIChza2IgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLworCQkJCS8qICdza2JfcHV0KCknIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEuICovCisJCQkJaW5zbChpb2FkZHIgKyBSWF9GSUZPLAorCQkJCSAgICAgc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCSAgICAgKHBrdF9sZW4gKyAzKSA+PiAyKTsKKwkJCQlvdXR3KFJ4RGlzY2FyZCwgaW9hZGRyICsgRUwzX0NNRCk7CS8qIFBvcCB0b3AgUnggcGFja2V0LiAqLworCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCXZwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJdnAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQkJLyogV2FpdCBhIGxpbWl0ZWQgdGltZSB0byBnbyB0byBuZXh0IHBhY2tldC4gKi8KKwkJCQlmb3IgKGkgPSAyMDA7IGkgPj0gMDsgaS0tKQorCQkJCQlpZiAoISAoaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgQ21kSW5Qcm9ncmVzcykpIAorCQkJCQkJYnJlYWs7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKGNvcmtzY3Jld19kZWJ1ZykKKwkJCQlwcmludGsoIiVzOiBDb3VsZG4ndCBhbGxvY2F0ZSBhIHNrX2J1ZmYgb2Ygc2l6ZSAlZC5cbiIsIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCX0KKwkJb3V0dyhSeERpc2NhcmQsIGlvYWRkciArIEVMM19DTUQpOworCQl2cC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkvKiBXYWl0IGEgbGltaXRlZCB0aW1lIHRvIHNraXAgdGhpcyBwYWNrZXQuICovCisJCWZvciAoaSA9IDIwMDsgaSA+PSAwOyBpLS0pCisJCQlpZiAoIShpbncoaW9hZGRyICsgRUwzX1NUQVRVUykgJiBDbWRJblByb2dyZXNzKSkKKwkJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm9vbWVyYW5nX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNvcmtzY3Jld19wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5ID0gdnAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHJ4X3N0YXR1czsKKworCWlmIChjb3Jrc2NyZXdfZGVidWcgPiA1KQorCQlwcmludGsoIiAgIEluIGJvb21lcmFuZ19yeCgpLCBzdGF0dXMgJTQuNHgsIHJ4X3N0YXR1cyAlNC40eC5cbiIsCisJCQlpbncoaW9hZGRyICsgRUwzX1NUQVRVUyksIGludyhpb2FkZHIgKyBSeFN0YXR1cykpOworCXdoaWxlICgocnhfc3RhdHVzID0gdnAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cykgJiBSeERDb21wbGV0ZSkgeworCQlpZiAocnhfc3RhdHVzICYgUnhERXJyb3IpIHsJLyogRXJyb3IsIHVwZGF0ZSBzdGF0cy4gKi8KKwkJCXVuc2lnbmVkIGNoYXIgcnhfZXJyb3IgPSByeF9zdGF0dXMgPj4gMTY7CisJCQlpZiAoY29ya3NjcmV3X2RlYnVnID4gMikKKwkJCQlwcmludGsoIiBSeCBlcnJvcjogc3RhdHVzICUyLjJ4LlxuIiwKKwkJCQkgICAgICAgcnhfZXJyb3IpOworCQkJdnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHJ4X2Vycm9yICYgMHgwMSkKKwkJCQl2cC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MDIpCisJCQkJdnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MDQpCisJCQkJdnAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKHJ4X2Vycm9yICYgMHgwOCkKKwkJCQl2cC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKHJ4X2Vycm9yICYgMHgxMCkKKwkJCQl2cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogVGhlIHBhY2tldCBsZW5ndGg6IHVwIHRvIDQuNUshLiAqLworCQkJc2hvcnQgcGt0X2xlbiA9IHJ4X3N0YXR1cyAmIDB4MWZmZjsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCXZwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDQpCisJCQkJcHJpbnRrKCJSZWNlaXZpbmcgcGFja2V0IHNpemUgJWQgc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkgICAgIHBrdF9sZW4sIHJ4X3N0YXR1cyk7CisKKwkJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8ganVzdCBhY2NlcHQgd2l0aG91dAorCQkJICAgY29weWluZyB0byBhIHByb3Blcmx5IHNpemVkIHNrYnVmZi4gKi8KKwkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCisJCQkgICAgJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDQpKSAhPSAwKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisJCQkJLyogJ3NrYl9wdXQoKScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KKwkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCSAgICAgICBpc2FfYnVzX3RvX3ZpcnQodnAtPnJ4X3JpbmdbZW50cnldLgorCQkJCQkJICAgYWRkciksIHBrdF9sZW4pOworCQkJCXJ4X2NvcHkrKzsKKwkJCX0gZWxzZSB7CisJCQkJdm9pZCAqdGVtcDsKKwkJCQkvKiBQYXNzIHVwIHRoZSBza2J1ZmYgYWxyZWFkeSBvbiB0aGUgUnggcmluZy4gKi8KKwkJCQlza2IgPSB2cC0+cnhfc2tidWZmW2VudHJ5XTsKKwkJCQl2cC0+cnhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQkJdGVtcCA9IHNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJCQkvKiBSZW1vdmUgdGhpcyBjaGVja2luZyBjb2RlIGZvciBmaW5hbCByZWxlYXNlLiAqLworCQkJCWlmIChpc2FfYnVzX3RvX3ZpcnQodnAtPnJ4X3JpbmdbZW50cnldLmFkZHIpICE9IHRlbXApCisJCQkJCSAgICBwcmludGsoIiVzOiBXYXJuaW5nIC0tIHRoZSBza2J1ZmYgYWRkcmVzc2VzIGRvIG5vdCBtYXRjaCIKKwkJCQkJICAgICAiIGluIGJvb21lcmFuZ19yeDogJXAgdnMuICVwIC8gJXAuXG4iLAorCQkJCQkgICAgIGRldi0+bmFtZSwKKwkJCQkJICAgICBpc2FfYnVzX3RvX3ZpcnQodnAtPgorCQkJCQkJCSByeF9yaW5nW2VudHJ5XS4KKwkJCQkJCQkgYWRkciksIHNrYi0+aGVhZCwKKwkJCQkJICAgICB0ZW1wKTsKKwkJCQlyeF9ub2NvcHkrKzsKKwkJCX0KKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXZwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCX0KKwkJZW50cnkgPSAoKyt2cC0+Y3VyX3J4KSAlIFJYX1JJTkdfU0laRTsKKwl9CisJLyogUmVmaWxsIHRoZSBSeCByaW5nIGJ1ZmZlcnMuICovCisJZm9yICg7IHZwLT5jdXJfcnggLSB2cC0+ZGlydHlfcnggPiAwOyB2cC0+ZGlydHlfcngrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQllbnRyeSA9IHZwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwkJaWYgKHZwLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CS8qIEJhZCBuZXdzISAgKi8KKwkJCXNrYi0+ZGV2ID0gZGV2OwkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KKwkJCXZwLT5yeF9yaW5nW2VudHJ5XS5hZGRyID0gaXNhX3ZpcnRfdG9fYnVzKHNrYi0+dGFpbCk7CisJCQl2cC0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKwkJfQorCQl2cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gMDsJLyogQ2xlYXIgY29tcGxldGUgYml0LiAqLworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3Jrc2NyZXdfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoY29ya3NjcmV3X2RlYnVnID4gMSkgeworCQlwcmludGsoIiVzOiBjb3Jrc2NyZXdfY2xvc2UoKSBzdGF0dXMgJTQuNHgsIFR4IHN0YXR1cyAlMi4yeC5cbiIsCisJCSAgICAgZGV2LT5uYW1lLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyksCisJCSAgICAgaW5iKGlvYWRkciArIFR4U3RhdHVzKSk7CisJCXByaW50aygiJXM6IGNvcmtzY3JldyBjbG9zZSBzdGF0czogcnhfbm9jb3B5ICVkIHJ4X2NvcHkgJWQiCisJCSAgICAgICAiIHR4X3F1ZXVlZCAlZC5cbiIsIGRldi0+bmFtZSwgcnhfbm9jb3B5LCByeF9jb3B5LAorCQkgICAgICAgcXVldWVkX3BhY2tldCk7CisJfQorCisJZGVsX3RpbWVyKCZ2cC0+dGltZXIpOworCisJLyogVHVybiBvZmYgc3RhdGlzdGljcyBBU0FQLiAgV2UgdXBkYXRlIGxwLT5zdGF0cyBiZWxvdy4gKi8KKwlvdXR3KFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisKKwkvKiBEaXNhYmxlIHRoZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIuICovCisJb3V0dyhSeERpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCW91dHcoVHhEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKworCWlmIChkZXYtPmlmX3BvcnQgPT0gWENWUl8xMGJhc2UyKQorCQkvKiBUdXJuIG9mZiB0aGlubmV0IHBvd2VyLiAgR3JlZW4hICovCisJCW91dHcoU3RvcENvYXgsIGlvYWRkciArIEVMM19DTUQpOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlvdXR3KFNldEludHJFbmIgfCAweDAwMDAsIGlvYWRkciArIEVMM19DTUQpOworCisJdXBkYXRlX3N0YXRzKGlvYWRkciwgZGV2KTsKKwlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl9yeCkgewkvKiBGcmVlIEJvb21lcmFuZyBidXMgbWFzdGVyIFJ4IGJ1ZmZlcnMuICovCisJCW91dGwoMCwgaW9hZGRyICsgVXBMaXN0UHRyKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQkJaWYgKHZwLT5yeF9za2J1ZmZbaV0pIHsKKwkJCQlkZXZfa2ZyZWVfc2tiKHZwLT5yeF9za2J1ZmZbaV0pOworCQkJCXZwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQkJfQorCX0KKwlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl90eCkgewkvKiBGcmVlIEJvb21lcmFuZyBidXMgbWFzdGVyIFR4IGJ1ZmZlcnMuICovCisJCW91dGwoMCwgaW9hZGRyICsgRG93bkxpc3RQdHIpOworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCQlpZiAodnAtPnR4X3NrYnVmZltpXSkgeworCQkJCWRldl9rZnJlZV9za2IodnAtPnR4X3NrYnVmZltpXSk7CisJCQkJdnAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqY29ya3NjcmV3X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjb3Jrc2NyZXdfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCQl1cGRhdGVfc3RhdHMoZGV2LT5iYXNlX2FkZHIsIGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiAmdnAtPnN0YXRzOworfQorCisvKiAgVXBkYXRlIHN0YXRpc3RpY3MuCisJVW5saWtlIHdpdGggdGhlIEVMMyB3ZSBuZWVkIG5vdCB3b3JyeSBhYm91dCBpbnRlcnJ1cHRzIGNoYW5naW5nCisJdGhlIHdpbmRvdyBzZXR0aW5nIGZyb20gdW5kZXJuZWF0aCB1cywgYnV0IHdlIG11c3Qgc3RpbGwgZ3VhcmQKKwlhZ2FpbnN0IGEgcmFjZSBjb25kaXRpb24gd2l0aCBhIFN0YXRzVXBkYXRlIGludGVycnVwdCB1cGRhdGluZyB0aGUKKwl0YWJsZS4gIFRoaXMgaXMgZG9uZSBieSBjaGVja2luZyB0aGF0IHRoZSBBU00gKCEpIGNvZGUgZ2VuZXJhdGVkIHVzZXMKKwlhdG9taWMgdXBkYXRlcyB3aXRoICcrPScuCisJKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhpbnQgaW9hZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjb3Jrc2NyZXdfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogVW5saWtlIHRoZSAzYzV4OSB3ZSBuZWVkIG5vdCB0dXJuIG9mZiBzdGF0cyB1cGRhdGVzIHdoaWxlIHJlYWRpbmcuICovCisJLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCByZWFkIGV2ZXJ5dGhpbmcuICovCisJRUwzV0lORE9XKDYpOworCXZwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgMCk7CisJdnAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMgKz0gaW5iKGlvYWRkciArIDEpOworCS8qIE11bHRpcGxlIGNvbGxpc2lvbnMuICovIGluYihpb2FkZHIgKyAyKTsKKwl2cC0+c3RhdHMuY29sbGlzaW9ucyArPSBpbmIoaW9hZGRyICsgMyk7CisJdnAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMgKz0gaW5iKGlvYWRkciArIDQpOworCXZwLT5zdGF0cy5yeF9maWZvX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgNSk7CisJdnAtPnN0YXRzLnR4X3BhY2tldHMgKz0gaW5iKGlvYWRkciArIDYpOworCXZwLT5zdGF0cy50eF9wYWNrZXRzICs9IChpbmIoaW9hZGRyICsgOSkgJiAweDMwKSA8PCA0OworCQkJCQkJLyogUnggcGFja2V0cyAgICovIGluYihpb2FkZHIgKyA3KTsKKwkJCQkJCS8qIE11c3QgcmVhZCB0byBjbGVhciAqLworCS8qIFR4IGRlZmVycmFscyAqLyBpbmIoaW9hZGRyICsgOCk7CisJLyogRG9uJ3QgYm90aGVyIHdpdGggcmVnaXN0ZXIgOSwgYW4gZXh0ZW5zaW9uIG9mIHJlZ2lzdGVycyA2JjcuCisJICAgSWYgd2UgZG8gdXNlIHRoZSA2JjcgdmFsdWVzIHRoZSBhdG9taWMgdXBkYXRlIGFzc3VtcHRpb24gYWJvdmUKKwkgICBpcyBpbnZhbGlkLiAqLworCWludyhpb2FkZHIgKyAxMCk7CS8qIFRvdGFsIFJ4IGFuZCBUeCBvY3RldHMuICovCisJaW53KGlvYWRkciArIDEyKTsKKwkvKiBOZXc6IE9uIHRoZSBWb3J0ZXggd2UgbXVzdCBhbHNvIGNsZWFyIHRoZSBCYWRTU0QgY291bnRlci4gKi8KKwlFTDNXSU5ET1coNCk7CisJaW5iKGlvYWRkciArIDEyKTsKKworCS8qIFdlIGNoYW5nZSBiYWNrIHRvIHdpbmRvdyA3IChub3QgMSkgd2l0aCB0aGUgVm9ydGV4LiAqLworCUVMM1dJTkRPVyg3KTsKKwlyZXR1cm47Cit9CisKKy8qIFRoaXMgbmV3IHZlcnNpb24gb2Ygc2V0X3J4X21vZGUoKSBzdXBwb3J0cyB2MS40IGtlcm5lbHMuCisgICBUaGUgVm9ydGV4IGNoaXAgaGFzIG5vIGRvY3VtZW50ZWQgbXVsdGljYXN0IGZpbHRlciwgc28gdGhlIG9ubHkKKyAgIG11bHRpY2FzdCBzZXR0aW5nIGlzIHRvIHJlY2VpdmUgYWxsIG11bHRpY2FzdCBmcmFtZXMuICBBdCBsZWFzdAorICAgdGhlIGNoaXAgaGFzIGEgdmVyeSBjbGVhbiB3YXkgdG8gc2V0IHRoZSBtb2RlLCB1bmxpa2UgbWFueSBvdGhlcnMuICovCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzaG9ydCBuZXdfbW9kZTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDMpCisJCQlwcmludGsoIiVzOiBTZXR0aW5nIHByb21pc2N1b3VzIG1vZGUuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCW5ld19tb2RlID0gU2V0UnhGaWx0ZXIgfCBSeFN0YXRpb24gfCBSeE11bHRpY2FzdCB8IFJ4QnJvYWRjYXN0IHwgUnhQcm9tOworCX0gZWxzZSBpZiAoKGRldi0+bWNfbGlzdCkgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCW5ld19tb2RlID0gU2V0UnhGaWx0ZXIgfCBSeFN0YXRpb24gfCBSeE11bHRpY2FzdCB8IFJ4QnJvYWRjYXN0OworCX0gZWxzZQorCQluZXdfbW9kZSA9IFNldFJ4RmlsdGVyIHwgUnhTdGF0aW9uIHwgUnhCcm9hZGNhc3Q7CisKKwlvdXR3KG5ld19tb2RlLCBpb2FkZHIgKyBFTDNfQ01EKTsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiSVNBIDB4JWx4IiwgZGV2LT5iYXNlX2FkZHIpOworfQorCitzdGF0aWMgdTMyIG5ldGRldl9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gY29ya3NjcmV3X2RlYnVnOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwljb3Jrc2NyZXdfZGVidWcgPSBsZXZlbDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKKwkuZ2V0X21zZ2xldmVsCQk9IG5ldGRldl9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBuZXRkZXZfc2V0X21zZ2xldmVsLAorfTsKKworDAorI2lmZGVmIE1PRFVMRQordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXdoaWxlICghbGlzdF9lbXB0eSgmcm9vdF9jb3Jrc2NyZXdfZGV2KSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQlzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUgKnZwOworCisJCXZwID0gbGlzdF9lbnRyeShyb290X2NvcmtzY3Jld19kZXYubmV4dCwKKwkJCQlzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUsIGxpc3QpOworCQlkZXYgPSB2cC0+b3VyX2RldjsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJY2xlYW51cF9jYXJkKGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorfQorI2VuZGlmCQkJCS8qIE1PRFVMRSAqLworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1jIDNjNTE1LmMiCisgKiAgYy1pbmRlbnQtbGV2ZWw6IDQKKyAqICB0YWItd2lkdGg6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MjMuYyBiL2RyaXZlcnMvbmV0LzNjNTIzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2YjJmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0LzNjNTIzLmMKQEAgLTAsMCArMSwxMzIzIEBACisvKgorICAgbmV0LTMtZHJpdmVyIGZvciB0aGUgM2M1MjMgRXRoZXJsaW5rL01DIGNhcmQgKGk4MjU4NiBFdGhlcm5ldCBjaGlwKQorCisKKyAgIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgaXMgY292ZXJlZCBieSB0aGUKKyAgIHNhbWUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhhdCBjb3ZlcnMgdGhhdCB3b3JrLgorCisgICBDb3B5cmlnaHQgMTk5NSwgMTk5NiBieSBDaHJpcyBCZWF1cmVnYXJkIChjcGJlYXVyZUB1bmRlcmdyYWQubWF0aC51d2F0ZXJsb28uY2EpCisKKyAgIFRoaXMgaXMgYmFzaWNhbGx5IE1pY2hhZWwgSGlwcCdzIG5pNTIgZHJpdmVyLCB3aXRoIGEgbmV3IHByb2JpbmcKKyAgIGFsZ29yaXRobSBhbmQgc29tZSBtaW5vciBjaGFuZ2VzIHRvIHRoZSA4MjU4NiBDQSBhbmQgcmVzZXQgcm91dGluZXMuCisgICBUaGFua3MgYSBsb3QgTWljaGFlbCBmb3IgYSByZWFsbHkgY2xlYW4gaTgyNTg2IGltcGxlbWVudGF0aW9uISAgVW5sZXNzCisgICBvdGhlcndpc2UgZG9jdW1lbnRlZCBpbiBuaTUyLmMsIGFueSBidWdzIGFyZSBtaW5lLgorCisgICBDb250cmFyeSB0byB0aGUgRXRoZXJuZXQtSE9XVE8sIHRoaXMgaXNuJ3QgYmFzZWQgb24gdGhlIDNjNTA3IGRyaXZlciBpbgorICAgYW55IHdheS4gIFRoZSBuaTUyIGlzIGEgbG90IGVhc2llciB0byBtb2RpZnkuCisKKyAgIHNvdXJjZXM6CisgICBuaTUyLmMKKworICAgQ3J5bndyIHBhY2tldCBkcml2ZXIgY29sbGVjdGlvbiB3YXMgYSBncmVhdCByZWZlcmVuY2UgZm9yIG15IGZpcnN0CisgICBhdHRlbXB0IGF0IHRoaXMgc3Vja2VyLiAgVGhlIDNjNTA3IGRyaXZlciBhbHNvIGhlbHBlZCwgdW50aWwgSSBub3RpY2VkCisgICB0aGF0IG5pNTIuYyB3YXMgYSBsb3QgbmljZXIuCisKKyAgIEV0aGVyTGluay9NQzogTWljcm8gQ2hhbm5lbCBFdGhlcm5ldCBBZGFwdGVyIFRlY2huaWNhbCBSZWZlcmVuY2UKKyAgIE1hbnVhbCwgY291cnRlc3kgb2YgM0NvbSBDYXJkRmFjdHMsIGRvY3VtZW50cyB0aGUgM2M1MjMtc3BlY2lmaWMKKyAgIHN0dWZmLiAgSW5mb3JtYXRpb24gb24gQ2FyZEZhY3RzIGlzIGZvdW5kIGluIHRoZSBFdGhlcm5ldCBIT1dUTy4KKyAgIEFsc28gc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuM2NvbS5jb20vIj4KKworICAgTWljcm9wcm9jZXNzb3IgQ29tbXVuaWNhdGlvbnMgU3VwcG9ydCBDaGlwcywgVC5KLiBCeWVycywgSVNCTgorICAgMC00NDQtMDEyMjQtOSwgaGFzIGEgc2VjdGlvbiBvbiB0aGUgaTgyNTg2LiAgSXQgdGVsbHMgeW91IGp1c3QgZW5vdWdoCisgICB0byBrbm93IHRoYXQgeW91IHJlYWxseSBkb24ndCB3YW50IHRvIGxlYXJuIGhvdyB0byBwcm9ncmFtIHRoZSBjaGlwLgorCisgICBUaGUgb3JpZ2luYWwgZGV2aWNlIHByb2JlIGNvZGUgd2FzIHN0b2xlbiBmcm9tIHBzMmVzZGkuYworCisgICBLbm93biBQcm9ibGVtczoKKyAgIFNpbmNlIG1vc3Qgb2YgdGhlIGNvZGUgd2FzIHN0b2xlbiBmcm9tIG5pNTIuYywgeW91J2xsIHJ1biBhY3Jvc3MgdGhlCisgICBzYW1lIGJ1Z3MgaW4gdGhlIDAuNjIgdmVyc2lvbiBvZiBuaTUyLmMsIHBsdXMgbWF5YmUgYSBmZXcgYmVjYXVzZSBvZgorICAgdGhlIDNjNTIzIGlkaW9zeW5jaGFjaWVzLiAgVGhlIDNjNTIzIGhhcyAxNksgb2YgUkFNIHRob3VnaCwgc28gdGhlcmUKKyAgIHNob3VsZG4ndCBiZSB0aGUgb3ZlcnJ1biBwcm9ibGVtIHRoYXQgdGhlIDhLIG5pNTIgaGFzLgorCisgICBUaGlzIGRyaXZlciBpcyBmb3IgYSAxNksgYWRhcHRlci4gIEl0IHNob3VsZCB3b3JrIGZpbmUgb24gdGhlIDY0SworICAgYWRhcHRlcnMsIGJ1dCBpdCB3aWxsIG9ubHkgdXNlIG9uZSBvZiB0aGUgNCBiYW5rcyBvZiBSQU0uICBNb2RpZnlpbmcKKyAgIHRoaXMgZm9yIHRoZSA2NEsgdmVyc2lvbiB3b3VsZCByZXF1aXJlIGEgbG90IG9mIGhlaW5vdXMgYmFuaworICAgc3dpdGNoaW5nLCB3aGljaCBJJ20gc3VyZSBub3QgaW50ZXJlc3RlZCBpbiBkb2luZy4gIElmIHlvdSB0cnkgdG8KKyAgIGltcGxlbWVudCBhIGJhbmsgc3dpdGNoaW5nIHZlcnNpb24sIHlvdSdsbCBiYXNpY2FsbHkgaGF2ZSB0byByZW1lbWJlcgorICAgd2hhdCBiYW5rIGlzIGVuYWJsZWQgYW5kIGRvIGEgc3dpdGNoIGV2ZXJ5dGltZSB5b3UgYWNjZXNzIGEgbWVtb3J5CisgICBsb2NhdGlvbiB0aGF0J3Mgbm90IGN1cnJlbnQuICBZb3UnbGwgYWxzbyBoYXZlIHRvIHJlbWFwIHBvaW50ZXJzIG9uCisgICB0aGUgZHJpdmVyIHNpZGUsIGJlY2F1c2UgaXQgb25seSBrbm93cyBhYm91dCAxNksgb2YgdGhlIG1lbW9yeS4KKyAgIEFueW9uZSBkZXNwZXJhdGUgb3IgbWFzb2NoaXN0aWMgZW5vdWdoIHRvIHRyeT8KKworICAgSXQgc2VlbXMgdG8gYmUgc3RhYmxlIG5vdyB3aGVuIG11bHRpcGxlIHRyYW5zbWl0IGJ1ZmZlcnMgYXJlIHVzZWQuICBJCisgICBjYW4ndCBzZWUgYW55IHBlcmZvcm1hbmNlIGRpZmZlcmVuY2UsIGJ1dCB0aGVuIEknbSB3b3JraW5nIG9uIGEgMzg2U1guCisKKyAgIE11bHRpY2FzdCBkb2Vzbid0IHdvcmsuICBJdCBkb2Vzbid0IGV2ZW4gcHJldGVuZCB0byB3b3JrLiAgRG9uJ3QgdXNlCisgICBpdC4gIERvbid0IGNvbXBpbGUgeW91ciBrZXJuZWwgd2l0aCBtdWx0aWNhc3Qgc3VwcG9ydC4gIEkgZG9uJ3Qga25vdworICAgd2h5LgorCisgICBGZWF0dXJlczoKKyAgIFRoaXMgZHJpdmVyIGlzIHVzZWFibGUgYXMgYSBsb2FkYWJsZSBtb2R1bGUuICBJZiB5b3UgdHJ5IHRvIHNwZWNpZnkgYW4KKyAgIElSUSBvciBhIElPIGFkZHJlc3MgKHZpYSBpbnNtb2QgM2M1MjMubyBpcnE9eHggaW89MHh5eXkpLCBpdCB3aWxsCisgICBzZWFyY2ggdGhlIE1DQSBzbG90cyB1bnRpbCBpdCBmaW5kcyBhIDNjNTIzIHdpdGggdGhlIHNwZWNpZmllZAorICAgcGFyYW1ldGVycy4KKworICAgVGhpcyBkcml2ZXIgZG9lcyBzdXBwb3J0IG11bHRpcGxlIGV0aGVybmV0IGNhcmRzIHdoZW4gdXNlZCBhcyBhIG1vZHVsZQorICAgKHVwIHRvIE1BWF8zQzUyM19DQVJEUywgdGhlIGRlZmF1bHQgYmVpbmcgNCkKKworICAgVGhpcyBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBib3RoIEJOQyBhbmQgVFAgdmVyc2lvbnMsIGludGVybmFsIGFuZAorICAgZXh0ZXJuYWwgdHJhbnNjZWl2ZXJzLiAgSGF2ZW4ndCB0ZXN0ZWQgd2l0aCB0aGUgNjRLIHZlcnNpb24gKHRoYXQgSQorICAga25vdyBvZikuCisKKyAgIEhpc3Rvcnk6CisgICBKYW4gMXN0LCAxOTk2CisgICBmaXJzdCBwdWJsaWMgcmVsZWFzZQorICAgRmViIDR0aCwgMTk5NgorICAgdXBkYXRlIHRvIDEuMy41OSwgaW5jb3Jwb3JhdGVkIG11bHRpY2FzdCBkaWZmcyBmcm9tIG5pNTIuYworICAgRmViIDE1dGgsIDE5OTYKKyAgIGFkZGVkIHNoYXJlZCBpcnEgc3VwcG9ydAorICAgQXByIDE5OTkKKyAgIGFkZGVkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGNhcmRzIHdoZW4gdXNlZCBhcyBhIG1vZHVsZQorICAgYWRkZWQgb3B0aW9uIHRvIGRpc2FibGUgbXVsdGljYXN0IGFzIGlzIGNhdXNlcyBwcm9ibGVtcworICAgICAgIEdhbmVzaCBTaXR0YW1wYWxhbSA8Z2FuZXNoLnNpdHRhbXBhbGFtQG1hZ2RhbGVuLm94Zm9yZC5hYy51az4KKyAgICAgICBTdHVhcnQgQWRhbXNvbiA8c3R1YXJ0LmFkYW1zb25AY29tcHNvYy5uZXQ+CisgICBOb3YgMjAwMQorICAgYWRkZWQgc3VwcG9ydCBmb3IgZXRodG9vbCAoamdhcnppaykKKwkKKyAgICRIZWFkZXI6IC9mc3lzMi9ob21lL2NocmlzYi9saW51eC0xLjMuNTktTUNBL2RyaXZlcnMvbmV0L1JDUy8zYzUyMy5jLHYgMS4xIDE5OTYvMDIvMDUgMDE6NTM6NDYgY2hyaXNiIEV4cCBjaHJpc2IgJAorICovCisKKyNkZWZpbmUgRFJWX05BTUUJCSIzYzUyMyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxNy1Ob3YtMjAwMSIKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbWNhLWxlZ2FjeS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiM2M1MjMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERFQlVHCQkJLyogZGVidWcgb24gKi8KKyNkZWZpbmUgU1lTQlVTVkFMIDAJCS8qIDEgPSA4IEJpdCwgMCA9IDE2IGJpdCAtIDNjNTIzIG9ubHkgZG9lcyAxNiBiaXQgKi8KKyN1bmRlZiBFTE1DX01VTFRJQ0FTVAkJLyogRGlzYWJsZSBtdWx0aWNhc3Qgc3VwcG9ydCBhcyBpdCBpcyBzb21ld2hhdCBzZXJpb3VzbHkgYnJva2VuIGF0IHRoZSBtb21lbnQgKi8KKworI2RlZmluZSBtYWtlMzIocHRyMTYpIChwLT5tZW10b3AgKyAoc2hvcnQpIChwdHIxNikgKQorI2RlZmluZSBtYWtlMjQocHRyMzIpICgoY2hhciAqKSAocHRyMzIpIC0gcC0+YmFzZSkKKyNkZWZpbmUgbWFrZTE2KHB0cjMyKSAoKHVuc2lnbmVkIHNob3J0KSAoKHVuc2lnbmVkIGxvbmcpIChwdHIzMikgLSAodW5zaWduZWQgbG9uZykgcC0+bWVtdG9wICkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAgIFRhYmxlcyB0byB3aGljaCB3ZSBjYW4gbWFwIHZhbHVlcyBpbiB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyBpbnQgaXJxX3RhYmxlW10gX19pbml0ZGF0YSA9IHsKKwkxMiwgNywgMywgOQorfTsKKworc3RhdGljIGludCBjc3JfdGFibGVbXSBfX2luaXRkYXRhID0geworCTB4MzAwLCAweDEzMDAsIDB4MjMwMCwgMHgzMzAwCit9OworCitzdGF0aWMgaW50IHNobV90YWJsZVtdIF9faW5pdGRhdGEgPSB7CisJMHgwYzAwMDAsIDB4MGM4MDAwLCAweDBkMDAwMCwgMHgwZDgwMDAKK307CisKKy8qKioqKioqKioqKioqKioqKioqIGhvdyB0byBjYWxjdWxhdGUgdGhlIGJ1ZmZlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCisgICogSU1QT1JUQU5UIE5PVEU6IGlmIHlvdSBjb25maWd1cmUgb25seSBvbmUgTlVNX1hNSVRfQlVGRlMsIHRoZSBkcml2ZXIgd29ya3MKKyAgKiAtLS0tLS0tLS0tLS0tLS0gaW4gYSBkaWZmZXJlbnQgKG1vcmUgc3RhYmxlPykgbW9kZS4gT25seSBpbiB0aGlzIG1vZGUgaXQncworICAqICAgICAgICAgICAgICAgICBwb3NzaWJsZSB0byBjb25maWd1cmUgdGhlIGRyaXZlciB3aXRoICdOT19OT1BDT01NQU5EUycKKworc2l6ZW9mKHNjcCk9MTI7IHNpemVvZihzY2IpPTE2OyBzaXplb2YoaXNjcCk9ODsKK3NpemVvZihzY3ApK3NpemVvZihpc2NwKStzaXplb2Yoc2NiKSA9IDM2ID0gSU5JVAorc2l6ZW9mKHJmZCkgPSAyNDsgc2l6ZW9mKHJiZCkgPSAxMjsKK3NpemVvZih0YmQpID0gODsgc2l6ZW9mKHRyYW5zbWl0X2NtZCkgPSAxNjsKK3NpemVvZihub3BfY21kKSA9IDg7CisKKyAgKiBpZiB5b3UgZG9uJ3Qga25vdyB0aGUgZHJpdmVyLCBiZXR0ZXIgZG8gbm90IGNoYW5nZSB0aGlzIHZhbHVlczogKi8KKworI2RlZmluZSBSRUNWX0JVRkZfU0laRSAxNTI0CS8qIHNsaWdodGx5IG92ZXJzaXplZCAqLworI2RlZmluZSBYTUlUX0JVRkZfU0laRSAxNTI0CS8qIHNsaWdodGx5IG92ZXJzaXplZCAqLworI2RlZmluZSBOVU1fWE1JVF9CVUZGUyAxCS8qIGNvbmZpZyBmb3IgYm90aCwgOEsgYW5kIDE2SyBzaG1lbSAqLworI2RlZmluZSBOVU1fUkVDVl9CVUZGU184ICA0CS8qIGNvbmZpZyBmb3IgOEsgc2hhcmVkIG1lbSAqLworI2RlZmluZSBOVU1fUkVDVl9CVUZGU18xNiA5CS8qIGNvbmZpZyBmb3IgMTZLIHNoYXJlZCBtZW0gKi8KKworI2lmIChOVU1fWE1JVF9CVUZGUyA9PSAxKQorI2RlZmluZSBOT19OT1BDT01NQU5EUwkJLyogb25seSBwb3NzaWJsZSB3aXRoIE5VTV9YTUlUX0JVRkZTPTEgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgREVMQVkoeCkgeyBtZGVsYXkoMzIgKiB4KTsgfQorCisvKiBhIG11Y2ggc2hvcnRlciBkZWxheTogKi8KKyNkZWZpbmUgREVMQVlfMTYoKTsgeyB1ZGVsYXkoMTYpIDsgfQorCisvKiB3YWl0IGZvciBjb21tYW5kIHdpdGggdGltZW91dDogKi8KKyNkZWZpbmUgV0FJVF80X1NDQl9DTUQoKSB7IGludCBpOyBcCisgIGZvcihpPTA7aTwxMDI0O2krKykgeyBcCisgICAgaWYoIXAtPnNjYi0+Y21kKSBicmVhazsgXAorICAgIERFTEFZXzE2KCk7IFwKKyAgICBpZihpID09IDEwMjMpIHsgXAorICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQ6IHNjYl9jbWQgdGltZWQgb3V0IC4uIHJlc2V0dGluZyBpODI1ODZcbiIsXAorICAgICAgCWRldi0+bmFtZSxfX0xJTkVfXyk7IFwKKyAgICAgIGVsbWNfaWRfcmVzZXQ1ODYoKTsgfSB9IH0KKworc3RhdGljIGlycXJldHVybl90IGVsbWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ19wdHIpOworc3RhdGljIGludCBlbG1jX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsbWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsbWNfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVsbWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWxtY190aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2lmZGVmIEVMTUNfTVVMVElDQVNUCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworCisvKiBoZWxwZXItZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGluaXQ1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGNoZWNrNTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgd2hlcmUsIHVuc2lnbmVkIHNpemUpOworc3RhdGljIHZvaWQgYWxsb2M1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzdGFydHJlY3Y1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAqYWxsb2NfcmZhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnB0cik7CitzdGF0aWMgdm9pZCBlbG1jX3Jjdl9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlbG1jX3htdF9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlbG1jX3Jucl9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0cnVjdCBwcml2IHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJY2hhciAqbWVtdG9wOworCXVuc2lnbmVkIGxvbmcgbWFwcGVkX3N0YXJ0OwkJLyogU3RhcnQgb2YgaW9yZW1hcCAqLworCXZvbGF0aWxlIHN0cnVjdCByZmRfc3RydWN0ICpyZmRfbGFzdCwgKnJmZF90b3AsICpyZmRfZmlyc3Q7CisJdm9sYXRpbGUgc3RydWN0IHNjcF9zdHJ1Y3QgKnNjcDsJLyogdm9sYXRpbGUgaXMgaW1wb3J0YW50ICovCisJdm9sYXRpbGUgc3RydWN0IGlzY3Bfc3RydWN0ICppc2NwOwkvKiB2b2xhdGlsZSBpcyBpbXBvcnRhbnQgKi8KKwl2b2xhdGlsZSBzdHJ1Y3Qgc2NiX3N0cnVjdCAqc2NiOwkvKiB2b2xhdGlsZSBpcyBpbXBvcnRhbnQgKi8KKwl2b2xhdGlsZSBzdHJ1Y3QgdGJkX3N0cnVjdCAqeG1pdF9idWZmc1tOVU1fWE1JVF9CVUZGU107CisjaWYgKE5VTV9YTUlUX0JVRkZTID09IDEpCisJdm9sYXRpbGUgc3RydWN0IHRyYW5zbWl0X2NtZF9zdHJ1Y3QgKnhtaXRfY21kc1syXTsKKwl2b2xhdGlsZSBzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QgKm5vcF9jbWRzWzJdOworI2Vsc2UKKwl2b2xhdGlsZSBzdHJ1Y3QgdHJhbnNtaXRfY21kX3N0cnVjdCAqeG1pdF9jbWRzW05VTV9YTUlUX0JVRkZTXTsKKwl2b2xhdGlsZSBzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QgKm5vcF9jbWRzW05VTV9YTUlUX0JVRkZTXTsKKyNlbmRpZgorCXZvbGF0aWxlIGludCBub3BfcG9pbnQsIG51bV9yZWN2X2J1ZmZzOworCXZvbGF0aWxlIGNoYXIgKnhtaXRfY2J1ZmZzW05VTV9YTUlUX0JVRkZTXTsKKwl2b2xhdGlsZSBpbnQgeG1pdF9jb3VudCwgeG1pdF9sYXN0OworCXZvbGF0aWxlIGludCBzbG90OworfTsKKworI2RlZmluZSBlbG1jX2F0dG41ODYoKSAge2VsbWNfZG9fYXR0bjU4NihkZXYtPmJhc2VfYWRkcixFTE1DX0NUUkxfSU5URSk7fQorI2RlZmluZSBlbG1jX3Jlc2V0NTg2KCkge2VsbWNfZG9fcmVzZXQ1ODYoZGV2LT5iYXNlX2FkZHIsRUxNQ19DVFJMX0lOVEUpO30KKworLyogd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIC0gdGhpcyB3aWxsIGNsZWFyIHRoZSBpbnRlcnJ1cHQgYml0IGluIHRoZQorICAgM2M1MjMgY29udHJvbCByZWdpc3RlciwgYW5kIHdvbid0IHB1dCBpdCBiYWNrLiAgVGhpcyBlZmZlY3RpdmVseQorICAgZGlzYWJsZXMgaW50ZXJydXB0cyBvbiB0aGUgY2FyZC4gKi8KKyNkZWZpbmUgZWxtY19pZF9hdHRuNTg2KCkgIHtlbG1jX2RvX2F0dG41ODYoZGV2LT5iYXNlX2FkZHIsMCk7fQorI2RlZmluZSBlbG1jX2lkX3Jlc2V0NTg2KCkge2VsbWNfZG9fcmVzZXQ1ODYoZGV2LT5iYXNlX2FkZHIsMCk7fQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgICBEbyBhIENoYW5uZWwgQXR0ZW50aW9uIG9uIHRoZSAzYzUyMy4gIFRoaXMgaXMgZXh0cmVtZWx5IGJvYXJkIGRlcGVuZGVudC4KKyAqLworc3RhdGljIHZvaWQgZWxtY19kb19hdHRuNTg2KGludCBpb2FkZHIsIGludCBpbnRzKQoreworCS8qIHRoZSAzYzUyMyByZXF1aXJlcyBhIG1pbmltdW0gb2YgNTAwIG5zLiAgVGhlIGRlbGF5cyBoZXJlIG1pZ2h0IGJlCisJICAgYSBsaXR0bGUgdG9vIGxhcmdlLCBhbmQgaGVuY2UgdGhleSBtYXkgY3V0IHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUKKwkgICBjYXJkIHNsaWdodGx5LiAgSWYgc29tZW9uZSB3aG8ga25vd3MgYSBsaXR0bGUgbW9yZSBhYm91dCBMaW51eAorCSAgIHRpbWluZyB3b3VsZCBjYXJlIHRvIHBsYXkgd2l0aCB0aGVzZSwgSSdkIGFwcHJlY2lhdGUgaXQuICovCisKKwkvKiB0aGlzIGJpdCBtYXNraW5nIHN0dWZmIGlzIGNyYXAuICBJJ2QgcmF0aGVyIGhhdmUgc2VwYXJhdGUKKwkgICByZWdpc3RlcnMgd2l0aCBzdHJvYmUgdHJpZ2dlcnMgZm9yIGVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zLiAgPHNpZ2g+CisJICAgWWEgdGFrZSB3aGF0IHlhIGdvdC4gKi8KKworCW91dGIoRUxNQ19DVFJMX1JTVCB8IDB4MyB8IEVMTUNfQ1RSTF9DQSB8IGludHMsIGlvYWRkciArIEVMTUNfQ1RSTCk7CisJREVMQVlfMTYoKTsJCS8qID4gNTAwIG5zICovCisJb3V0YihFTE1DX0NUUkxfUlNUIHwgMHgzIHwgaW50cywgaW9hZGRyICsgRUxNQ19DVFJMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICAgUmVzZXQgdGhlIDgyNTg2IG9uIHRoZSAzYzUyMy4gIEFsc28gdmVyeSBib2FyZCBkZXBlbmRlbnQuCisgKi8KK3N0YXRpYyB2b2lkIGVsbWNfZG9fcmVzZXQ1ODYoaW50IGlvYWRkciwgaW50IGludHMpCit7CisJLyogdG9nZ2xlIHRoZSBSU1QgYml0IGxvdyB0aGVuIGhpZ2ggKi8KKwlvdXRiKDB4MyB8IEVMTUNfQ1RSTF9MQkssIGlvYWRkciArIEVMTUNfQ1RSTCk7CisJREVMQVlfMTYoKTsJCS8qID4gNTAwIG5zICovCisJb3V0YihFTE1DX0NUUkxfUlNUIHwgRUxNQ19DVFJMX0xCSyB8IDB4MywgaW9hZGRyICsgRUxNQ19DVFJMKTsKKworCWVsbWNfZG9fYXR0bjU4Nihpb2FkZHIsIGludHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2xvc2UgZGV2aWNlCisgKi8KKworc3RhdGljIGludCBlbG1jX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWVsbWNfaWRfcmVzZXQ1ODYoKTsJLyogdGhlIGhhcmQgd2F5IHRvIHN0b3AgdGhlIHJlY2VpdmVyICovCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBvcGVuIGRldmljZQorICovCisKK3N0YXRpYyBpbnQgZWxtY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCWVsbWNfaWRfYXR0bjU4NigpOwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmZWxtY19pbnRlcnJ1cHQsIFNBX1NISVJRIHwgU0FfU0FNUExFX1JBTkRPTSwKKwkJCSAgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3QgZ2V0IGlycSAlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCWVsbWNfaWRfcmVzZXQ1ODYoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJYWxsb2M1ODYoZGV2KTsKKwlpbml0NTg2KGRldik7CisJc3RhcnRyZWN2NTg2KGRldik7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsJCS8qIG1vc3QgZG9uZSBieSBpbml0ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbiA4MjU4NiBvdXQgdGhlcmUuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgY2hlY2s1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyB3aGVyZSwgdW5zaWduZWQgc2l6ZSkKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisJY2hhciAqaXNjcF9hZGRyc1syXTsKKwlpbnQgaSA9IDA7CisKKwlwLT5iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGlzYV9idXNfdG9fdmlydCgodW5zaWduZWQgbG9uZyl3aGVyZSkgKyBzaXplIC0gMHgwMTAwMDAwMDsKKwlwLT5tZW10b3AgPSBpc2FfYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpd2hlcmUpICsgc2l6ZTsKKwlwLT5zY3AgPSAoc3RydWN0IHNjcF9zdHJ1Y3QgKikocC0+YmFzZSArIFNDUF9ERUZBVUxUX0FERFJFU1MpOworCW1lbXNldCgoY2hhciAqKSBwLT5zY3AsIDAsIHNpemVvZihzdHJ1Y3Qgc2NwX3N0cnVjdCkpOworCXAtPnNjcC0+c3lzYnVzID0gU1lTQlVTVkFMOwkvKiAxID0gOEJpdC1CdXMsIDAgPSAxNiBCaXQgKi8KKworCWlzY3BfYWRkcnNbMF0gPSBpc2FfYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpd2hlcmUpOworCWlzY3BfYWRkcnNbMV0gPSAoY2hhciAqKSBwLT5zY3AgLSBzaXplb2Yoc3RydWN0IGlzY3Bfc3RydWN0KTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJcC0+aXNjcCA9IChzdHJ1Y3QgaXNjcF9zdHJ1Y3QgKikgaXNjcF9hZGRyc1tpXTsKKwkJbWVtc2V0KChjaGFyICopIHAtPmlzY3AsIDAsIHNpemVvZihzdHJ1Y3QgaXNjcF9zdHJ1Y3QpKTsKKworCQlwLT5zY3AtPmlzY3AgPSBtYWtlMjQocC0+aXNjcCk7CisJCXAtPmlzY3AtPmJ1c3kgPSAxOworCisJCWVsbWNfaWRfcmVzZXQ1ODYoKTsKKworCQkvKiByZXNldDU4NiBkb2VzIGFuIGltcGxpY2l0IENBICovCisKKwkJLyogYXBwYXJlbnRseSwgeW91IHNvbWV0aW1lcyBoYXZlIHRvIGtpY2sgdGhlIDgyNTg2IHR3aWNlLi4uICovCisJCWVsbWNfaWRfYXR0bjU4NigpOworCQlERUxBWSgxKTsKKworCQlpZiAocC0+aXNjcC0+YnVzeSkgewkvKiBpODI1ODYgY2xlYXJzICdidXN5JyBhZnRlciBzdWNjZXNzZnVsIGluaXQgKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzZXQgaXNjcCBhdCB0aGUgcmlnaHQgcGxhY2UsIGNhbGxlZCBieSBlbG1jX3Byb2JlIGFuZCBvcGVuNTg2LgorICovCisKK3ZvaWQgYWxsb2M1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwllbG1jX2lkX3Jlc2V0NTg2KCk7CisJREVMQVkoMik7CisKKwlwLT5zY3AgPSAoc3RydWN0IHNjcF9zdHJ1Y3QgKikgKHAtPmJhc2UgKyBTQ1BfREVGQVVMVF9BRERSRVNTKTsKKwlwLT5zY2IgPSAoc3RydWN0IHNjYl9zdHJ1Y3QgKikgaXNhX2J1c190b192aXJ0KGRldi0+bWVtX3N0YXJ0KTsKKwlwLT5pc2NwID0gKHN0cnVjdCBpc2NwX3N0cnVjdCAqKSAoKGNoYXIgKikgcC0+c2NwIC0gc2l6ZW9mKHN0cnVjdCBpc2NwX3N0cnVjdCkpOworCisJbWVtc2V0KChjaGFyICopIHAtPmlzY3AsIDAsIHNpemVvZihzdHJ1Y3QgaXNjcF9zdHJ1Y3QpKTsKKwltZW1zZXQoKGNoYXIgKikgcC0+c2NwLCAwLCBzaXplb2Yoc3RydWN0IHNjcF9zdHJ1Y3QpKTsKKworCXAtPnNjcC0+aXNjcCA9IG1ha2UyNChwLT5pc2NwKTsKKwlwLT5zY3AtPnN5c2J1cyA9IFNZU0JVU1ZBTDsKKwlwLT5pc2NwLT5zY2Jfb2Zmc2V0ID0gbWFrZTE2KHAtPnNjYik7CisKKwlwLT5pc2NwLT5idXN5ID0gMTsKKwllbG1jX2lkX3Jlc2V0NTg2KCk7CisJZWxtY19pZF9hdHRuNTg2KCk7CisKKwlERUxBWSgyKTsKKworCWlmIChwLT5pc2NwLT5idXN5KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEluaXQtUHJvYmxlbXMgKGFsbG9jKS5cbiIsIGRldi0+bmFtZSk7CisJfQorCW1lbXNldCgoY2hhciAqKSBwLT5zY2IsIDAsIHNpemVvZihzdHJ1Y3Qgc2NiX3N0cnVjdCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgZWxtY19nZXRpbmZvKGNoYXIgKmJ1ZiwgaW50IHNsb3QsIHZvaWQgKmQpCit7CisJaW50IGxlbiA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkOworCWludCBpOworCisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gbGVuOworCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiUmV2aXNpb246IDB4JXhcbiIsCisJCSAgICAgICBpbmIoZGV2LT5iYXNlX2FkZHIgKyBFTE1DX1JFVklTSU9OKSAmIDB4Zik7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSVJROiAlZFxuIiwgZGV2LT5pcnEpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIklPIEFkZHJlc3M6ICUjbHgtJSNseFxuIiwgZGV2LT5iYXNlX2FkZHIsCisJCSAgICAgICBkZXYtPmJhc2VfYWRkciArIEVMTUNfSU9fRVhURU5UKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJNZW1vcnk6ICUjbHgtJSNseFxuIiwgZGV2LT5tZW1fc3RhcnQsCisJCSAgICAgICBkZXYtPm1lbV9lbmQgLSAxKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJUcmFuc2NlaXZlcjogJXNcbiIsIGRldi0+aWZfcG9ydCA/CisJCSAgICAgICAiRXh0ZXJuYWwiIDogIkludGVybmFsIik7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiRGV2aWNlOiAlc1xuIiwgZGV2LT5uYW1lKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJIYXJkd2FyZSBBZGRyZXNzOiIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiICUwMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisJYnVmW2xlbisrXSA9ICdcbic7CisJYnVmW2xlbl0gPSAwOworCisJcmV0dXJuIGxlbjsKK30JCQkJLyogZWxtY19nZXRpbmZvKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdCBkb19lbG1jX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RhdGljIGludCBzbG90OworCWludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaXJxID0gZGV2LT5pcnE7CisJdV9jaGFyIHN0YXR1cyA9IDA7CisJdV9jaGFyIHJldmlzaW9uID0gMDsKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgaW50IHNpemUgPSAwOworCWludCByZXR2YWw7CisJc3RydWN0IHByaXYgKnByID0gZGV2LT5wcml2OworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWlmIChNQ0FfYnVzID09IDApIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIHNlYXJjaCB0aHJvdWdoIHRoZSBzbG90cyBmb3IgdGhlIDNjNTIzLiAqLworCXNsb3QgPSBtY2FfZmluZF9hZGFwdGVyKEVMTUNfTUNBX0lELCAwKTsKKwl3aGlsZSAoc2xvdCAhPSAtMSkgeworCQlzdGF0dXMgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDIpOworCisJCWRldi0+aXJxPWlycV90YWJsZVsoc3RhdHVzICYgRUxNQ19TVEFUVVNfSVJRX1NFTEVDVCkgPj4gNl07CisJCWRldi0+YmFzZV9hZGRyPWNzcl90YWJsZVsoc3RhdHVzICYgRUxNQ19TVEFUVVNfQ1NSX1NFTEVDVCkgPj4gMV07CisJCQorCQkvKgorCQkgICBJZiB3ZSdyZSB0cnlpbmcgdG8gbWF0Y2ggYSBzcGVjaWZpZWQgaXJxIG9yIElPIGFkZHJlc3MsCisJCSAgIHdlJ2xsIHJlamVjdCBhIG1hdGNoIHVubGVzcyBpdCdzIHdoYXQgd2UncmUgbG9va2luZyBmb3IuCisJCSAgIEFsc28gcmVqZWN0IGl0IGlmIHRoZSBjYXJkIGlzIGFscmVhZHkgaW4gdXNlLgorCQkgKi8KKworCQlpZiAoKGlycSAmJiBpcnEgIT0gZGV2LT5pcnEpIHx8IAorCQkgICAgKGJhc2VfYWRkciAmJiBiYXNlX2FkZHIgIT0gZGV2LT5iYXNlX2FkZHIpKSB7CisJCQlzbG90ID0gbWNhX2ZpbmRfYWRhcHRlcihFTE1DX01DQV9JRCwgc2xvdCArIDEpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRUxNQ19JT19FWFRFTlQsIERSVl9OQU1FKSkgeworCQkJc2xvdCA9IG1jYV9maW5kX2FkYXB0ZXIoRUxNQ19NQ0FfSUQsIHNsb3QgKyAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogZm91bmQgd2hhdCB3ZSdyZSBsb29raW5nIGZvci4uLiAqLworCQlicmVhazsKKwl9CisKKwkvKiB3ZSBkaWRuJ3QgZmluZCBhbnkgM2M1MjMgaW4gdGhlIHNsb3RzIHdlIGNoZWNrZWQgZm9yICovCisJaWYgKHNsb3QgPT0gTUNBX05PVEZPVU5EKQorCQlyZXR1cm4gKChiYXNlX2FkZHIgfHwgaXJxKSA/IC1FTlhJTyA6IC1FTk9ERVYpOworCisJbWNhX3NldF9hZGFwdGVyX25hbWUoc2xvdCwgIjNDb20gM2M1MjMgRXRoZXJsaW5rL01DIik7CisJbWNhX3NldF9hZGFwdGVyX3Byb2NmbihzbG90LCAoTUNBX1Byb2NGbikgZWxtY19nZXRpbmZvLCBkZXYpOworCisJLyogaWYgd2UgZ2V0IHRoaXMgZmFyLCBhZGFwdGVyIGhhcyBiZWVuIGZvdW5kIC0gY2Fycnkgb24gKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogM2M1MjMgYWRhcHRlciBmb3VuZCBpbiBzbG90ICVkXG4iLCBkZXYtPm5hbWUsIHNsb3QgKyAxKTsKKworCS8qIE5vdyB3ZSBleHRyYWN0IGNvbmZpZ3VyYXRpb24gaW5mbyBmcm9tIHRoZSBjYXJkLgorCSAgIFRoZSAzYzUyMyBwcm92aWRlcyBpbmZvcm1hdGlvbiBpbiB0d28gb2YgdGhlIFBPUyByZWdpc3RlcnMsIGJ1dAorCSAgIHRoZSBzZWNvbmQgb25lIGlzIG9ubHkgbmVlZGVkIGlmIHdlIHdhbnQgdG8gdGVsbCB0aGUgY2FyZCB3aGF0IElSUQorCSAgIHRvIHVzZS4gIEkgc3VzcGVjdCB0aGF0IHdob2V2ZXIgc2V0cyB0aGUgdGhpbmcgdXAgaW5pdGlhbGx5IHdvdWxkCisJICAgcHJlZmVyIHdlIGRvbid0IHNjcmV3IHdpdGggdGhvc2UgdGhpbmdzLgorCisJICAgTm90ZSB0aGF0IHdlIHJlYWQgdGhlIHN0YXR1cyBpbmZvIHdoZW4gd2UgZm91bmQgdGhlIGNhcmQuLi4KKworCSAgIFNlZSAzYzUyMy5oIGZvciBtb3JlIGRldGFpbHMuCisJICovCisKKwkvKiByZXZpc2lvbiBpcyBzdG9yZWQgaW4gdGhlIGZpcnN0IDQgYml0cyBvZiB0aGUgcmV2aXNpb24gcmVnaXN0ZXIgKi8KKwlyZXZpc2lvbiA9IGluYihkZXYtPmJhc2VfYWRkciArIEVMTUNfUkVWSVNJT04pICYgMHhmOworCisJLyogYWNjb3JkaW5nIHRvIGRvY3MsIHdlIHJlYWQgdGhlIGludGVycnVwdCBhbmQgd3JpdGUgaXQgYmFjayB0bworCSAgIHRoZSBJUlEgc2VsZWN0IHJlZ2lzdGVyLCBzaW5jZSB0aGUgUE9TVCBtaWdodCBub3QgY29uZmlndXJlIHRoZSBJUlEKKwkgICBwcm9wZXJseS4gKi8KKwlzd2l0Y2ggKGRldi0+aXJxKSB7CisJY2FzZSAzOgorCQltY2Ffd3JpdGVfcG9zKHNsb3QsIDMsIDB4MDQpOworCQlicmVhazsKKwljYXNlIDc6CisJCW1jYV93cml0ZV9wb3Moc2xvdCwgMywgMHgwMik7CisJCWJyZWFrOworCWNhc2UgOToKKwkJbWNhX3dyaXRlX3BvcyhzbG90LCAzLCAweDA4KTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJbWNhX3dyaXRlX3BvcyhzbG90LCAzLCAweDAxKTsKKwkJYnJlYWs7CisJfQorCisJbWVtc2V0KHByLCAwLCBzaXplb2Yoc3RydWN0IHByaXYpKTsKKwlwci0+c2xvdCA9IHNsb3Q7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogM0NvbSAzYzUyMyBSZXYgMHgleCBhdCAlI2x4XG4iLCBkZXYtPm5hbWUsIChpbnQpIHJldmlzaW9uLAorCSAgICAgICBkZXYtPmJhc2VfYWRkcik7CisKKwkvKiBEZXRlcm1pbmUgaWYgd2UncmUgdXNpbmcgdGhlIG9uLWJvYXJkIHRyYW5zY2VpdmVyIChpLmUuIGNvYXgpIG9yCisJICAgYW4gZXh0ZXJuYWwgb25lLiAgVGhlIGluZm9ybWF0aW9uIGlzIHByZXR0eSBtdWNoIHVzZWxlc3MsIGJ1dCBJCisJICAgZ3Vlc3MgaXQncyB3b3J0aCBicm93bmllIHBvaW50cy4gKi8KKwlkZXYtPmlmX3BvcnQgPSAoc3RhdHVzICYgRUxNQ19TVEFUVVNfRElTQUJMRV9USElOKTsKKworCS8qIFRoZSAzYzUyMyBoYXMgYSAyNEsgY2h1bmsgb2YgbWVtb3J5LiAgVGhlIGZpcnN0IDE2SyBpcyB0aGUKKwkgICBzaGFyZWQgbWVtb3J5LCB3aGlsZSB0aGUgbGFzdCA4SyBpcyBmb3IgdGhlIEV0aGVyU3RhcnQgQklPUyBST00uCisJICAgV2hpY2ggd2UgZG9uJ3QgY2FyZSBtdWNoIGFib3V0IGhlcmUuICBXZSdsbCBqdXN0IHRlbGwgTGludXggdGhhdAorCSAgIHdlJ3JlIHVzaW5nIDE2Sy4gIE1DQSB3b24ndCBwZXJtaXQgYWRkcmVzcyBzcGFjZSBjb25mbGljdHMgY2F1c2VkCisJICAgYnkgbm90IG1hcHBpbmcgdGhlIG90aGVyIDhLLiAqLworCWRldi0+bWVtX3N0YXJ0ID0gc2htX3RhYmxlWyhzdGF0dXMgJiBFTE1DX1NUQVRVU19NRU1PUllfU0VMRUNUKSA+PiAzXTsKKworCS8qIFdlJ3JlIHVzaW5nIE1DQSwgc28gaXQncyBhIGdpdmVuIHRoYXQgdGhlIGluZm9ybWF0aW9uIGFib3V0IG1lbW9yeQorCSAgIHNpemUgaXMgY29ycmVjdC4gIFRoZSBDcnlud3IgZHJpdmVycyBkbyBzb21ldGhpbmcgbGlrZSB0aGlzLiAqLworCisJZWxtY19pZF9yZXNldDU4NigpOwkvKiBzZWVtcyBsaWtlIGEgZ29vZCBpZGVhIGJlZm9yZSBjaGVja2luZyBpdC4uLiAqLworCisJc2l6ZSA9IDB4NDAwMDsJCS8qIGNoZWNrIGZvciAxNksgbWVtICovCisJaWYgKCFjaGVjazU4NihkZXYsIGRldi0+bWVtX3N0YXJ0LCBzaXplKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZW1wcm9iZSwgQ2FuJ3QgZmluZCBtZW1vcnkgYXQgMHglbHghXG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICBkZXYtPm1lbV9zdGFydCk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyBzaXplOwkvKiBzZXQgbWVtX2VuZCBzaG93ZWQgYnkgJ2lmY29uZmlnJyAqLworCisJcHItPm1lbXRvcCA9IGlzYV9idXNfdG9fdmlydChkZXYtPm1lbV9zdGFydCkgKyBzaXplOworCXByLT5iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGlzYV9idXNfdG9fdmlydChkZXYtPm1lbV9zdGFydCkgKyBzaXplIC0gMHgwMTAwMDAwMDsKKwlhbGxvYzU4NihkZXYpOworCisJZWxtY19pZF9yZXNldDU4NigpOwkvKiBtYWtlIHN1cmUgaXQgZG9lc24ndCBnZW5lcmF0ZSBzcHVyaW91cyBpbnRzICovCisKKwkvKiBzZXQgbnVtYmVyIG9mIHJlY2VpdmUtYnVmZnMgYWNjb3JkaW5nIHRvIG1lbXNpemUgKi8KKwlwci0+bnVtX3JlY3ZfYnVmZnMgPSBOVU1fUkVDVl9CVUZGU18xNjsKKworCS8qIGR1bXAgYWxsIHRoZSBhc3NvcnRlZCBpbmZvcm1hdGlvbiAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiBJUlEgJWQsICVzdGVybmFsIHhjdnIsIG1lbW9yeSAlI2x4LSUjbHguXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIGRldi0+aXJxLCBkZXYtPmlmX3BvcnQgPyAiZXgiIDogImluIiwgCisJICAgICAgIGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQgLSAxKTsKKworCS8qIFRoZSBoYXJkd2FyZSBhZGRyZXNzIGZvciB0aGUgM2M1MjMgaXMgc3RvcmVkIGluIHRoZSBmaXJzdCBzaXgKKwkgICBieXRlcyBvZiB0aGUgSU8gYWRkcmVzcy4gKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogaGFyZHdhcmUgYWRkcmVzcyAiLCBkZXYtPm5hbWUpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGluYihkZXYtPmJhc2VfYWRkciArIGkpOworCQlwcmludGsoIiAlMDJ4IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJfQorCXByaW50aygiXG4iKTsKKworCWRldi0+b3BlbiA9ICZlbG1jX29wZW47CisJZGV2LT5zdG9wID0gJmVsbWNfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmZWxtY19nZXRfc3RhdHM7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZWxtY19zZW5kX3BhY2tldDsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmZWxtY190aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBIWjsKKyNpZmRlZiBFTE1DX01VTFRJQ0FTVAorCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKyNlbHNlCisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBOVUxMOworI2VuZGlmCisJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CisJCisJLyogbm90ZSB0aGF0IHdlIGhhdmVuJ3QgYWN0dWFsbHkgcmVxdWVzdGVkIHRoZSBJUlEgZnJvbSB0aGUga2VybmVsLgorCSAgIFRoYXQgZ2V0cyBkb25lIGluIGVsbWNfb3BlbigpLiAgSSdtIG5vdCBzdXJlIHRoYXQncyBzdWNoIGEgZ29vZCBpZGVhLAorCSAgIGJ1dCBpdCB3b3Jrcywgc28gSSdsbCBnbyB3aXRoIGl0LiAqLworCisjaWZuZGVmIEVMTUNfTVVMVElDQVNUCisgICAgICAgIGRldi0+ZmxhZ3MmPX5JRkZfTVVMVElDQVNUOyAgICAgLyogTXVsdGljYXN0IGRvZXNuJ3Qgd29yayAqLworI2VuZGlmCisKKwlyZXR1cm4gMDsKK2Vycl9vdXQ6CisJbWNhX3NldF9hZGFwdGVyX3Byb2NmbihzbG90LCBOVUxMLCBOVUxMKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRUxNQ19JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisgCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwltY2Ffc2V0X2FkYXB0ZXJfcHJvY2ZuKCgoc3RydWN0IHByaXYgKikgKGRldi0+cHJpdikpLT5zbG90LCBOVUxMLCBOVUxMKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRUxNQ19JT19FWFRFTlQpOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgZWxtY19wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBwcml2KSk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gZG9fZWxtY19wcm9iZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwljbGVhbnVwX2NhcmQoZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluaXQgdGhlIGNoaXAgKGVsbWMtaW50ZXJydXB0IHNob3VsZCBiZSBkaXNhYmxlZD8hKQorICogbmVlZHMgYSBjb3JyZWN0ICdhbGxvY2F0ZWQnIG1lbW9yeQorICovCisKK3N0YXRpYyBpbnQgaW5pdDU4NihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvaWQgKnB0cjsKKwl1bnNpZ25lZCBsb25nIHM7CisJaW50IGksIHJlc3VsdCA9IDA7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCXZvbGF0aWxlIHN0cnVjdCBjb25maWd1cmVfY21kX3N0cnVjdCAqY2ZnX2NtZDsKKwl2b2xhdGlsZSBzdHJ1Y3QgaWFzZXR1cF9jbWRfc3RydWN0ICppYXNfY21kOworCXZvbGF0aWxlIHN0cnVjdCB0ZHJfY21kX3N0cnVjdCAqdGRyX2NtZDsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWNzZXR1cF9jbWRfc3RydWN0ICptY19jbWQ7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisJaW50IG51bV9hZGRycyA9IGRldi0+bWNfY291bnQ7CisKKwlwdHIgPSAodm9pZCAqKSAoKGNoYXIgKikgcC0+c2NiICsgc2l6ZW9mKHN0cnVjdCBzY2Jfc3RydWN0KSk7CisKKwljZmdfY21kID0gKHN0cnVjdCBjb25maWd1cmVfY21kX3N0cnVjdCAqKSBwdHI7CS8qIGNvbmZpZ3VyZS1jb21tYW5kICovCisJY2ZnX2NtZC0+Y21kX3N0YXR1cyA9IDA7CisJY2ZnX2NtZC0+Y21kX2NtZCA9IENNRF9DT05GSUdVUkUgfCBDTURfTEFTVDsKKwljZmdfY21kLT5jbWRfbGluayA9IDB4ZmZmZjsKKworCWNmZ19jbWQtPmJ5dGVfY250ID0gMHgwYTsJLyogbnVtYmVyIG9mIGNmZyBieXRlcyAqLworCWNmZ19jbWQtPmZpZm8gPSAweDA4OwkvKiBmaWZvLWxpbWl0ICg4PXR4OjMyL3J4OjY0KSAqLworCWNmZ19jbWQtPnNhdl9iZiA9IDB4NDA7CS8qIGhvbGQgb3IgZGlzY2FyZCBiYWQgcmVjdiBmcmFtZXMgKGJpdCA3KSAqLworCWNmZ19jbWQtPmFkcl9sZW4gPSAweDJlOwkvKiBhZGRyX2xlbiB8IXNyY19pbnNlcnQgfHByZS1sZW4gfGxvb3BiYWNrICovCisJY2ZnX2NtZC0+cHJpb3JpdHkgPSAweDAwOworCWNmZ19jbWQtPmlmcyA9IDB4NjA7CisJY2ZnX2NtZC0+dGltZV9sb3cgPSAweDAwOworCWNmZ19jbWQtPnRpbWVfaGlnaCA9IDB4ZjI7CisJY2ZnX2NtZC0+cHJvbWlzYyA9IDA7CisJaWYgKGRldi0+ZmxhZ3MgJiAoSUZGX0FMTE1VTFRJIHwgSUZGX1BST01JU0MpKSB7CisJCWNmZ19jbWQtPnByb21pc2MgPSAxOworCQlkZXYtPmZsYWdzIHw9IElGRl9QUk9NSVNDOworCX0KKwljZmdfY21kLT5jYXJyX2NvbGwgPSAweDAwOworCisJcC0+c2NiLT5jYmxfb2Zmc2V0ID0gbWFrZTE2KGNmZ19jbWQpOworCisJcC0+c2NiLT5jbWQgPSBDVUNfU1RBUlQ7CS8qIGNtZC4tdW5pdCBzdGFydCAqLworCWVsbWNfaWRfYXR0bjU4NigpOworCisJcyA9IGppZmZpZXM7CQkvKiB3YXJuaW5nOiBvbmx5IGFjdGl2ZSB3aXRoIGludGVycnVwdHMgb24gISEgKi8KKwl3aGlsZSAoIShjZmdfY21kLT5jbWRfc3RhdHVzICYgU1RBVF9DT01QTCkpIHsKKwkJaWYgKGppZmZpZXMgLSBzID4gMzAqSFovMTAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKChjZmdfY21kLT5jbWRfc3RhdHVzICYgKFNUQVRfT0sgfCBTVEFUX0NPTVBMKSkgIT0gKFNUQVRfQ09NUEwgfCBTVEFUX09LKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyAoZWxtYyk6IGNvbmZpZ3VyZSBjb21tYW5kIGZhaWxlZDogJXhcbiIsIGRldi0+bmFtZSwgY2ZnX2NtZC0+Y21kX3N0YXR1cyk7CisJCXJldHVybiAxOworCX0KKwkvKgorCSAqIGluZGl2aWR1YWwgYWRkcmVzcyBzZXR1cAorCSAqLworCWlhc19jbWQgPSAoc3RydWN0IGlhc2V0dXBfY21kX3N0cnVjdCAqKSBwdHI7CisKKwlpYXNfY21kLT5jbWRfc3RhdHVzID0gMDsKKwlpYXNfY21kLT5jbWRfY21kID0gQ01EX0lBU0VUVVAgfCBDTURfTEFTVDsKKwlpYXNfY21kLT5jbWRfbGluayA9IDB4ZmZmZjsKKworCW1lbWNweSgoY2hhciAqKSAmaWFzX2NtZC0+aWFkZHIsIChjaGFyICopIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworCXAtPnNjYi0+Y2JsX29mZnNldCA9IG1ha2UxNihpYXNfY21kKTsKKworCXAtPnNjYi0+Y21kID0gQ1VDX1NUQVJUOwkvKiBjbWQuLXVuaXQgc3RhcnQgKi8KKwllbG1jX2lkX2F0dG41ODYoKTsKKworCXMgPSBqaWZmaWVzOworCXdoaWxlICghKGlhc19jbWQtPmNtZF9zdGF0dXMgJiBTVEFUX0NPTVBMKSkgeworCQlpZiAoamlmZmllcyAtIHMgPiAzMCpIWi8xMDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoKGlhc19jbWQtPmNtZF9zdGF0dXMgJiAoU1RBVF9PSyB8IFNUQVRfQ09NUEwpKSAhPSAoU1RBVF9PSyB8IFNUQVRfQ09NUEwpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIChlbG1jKTogaW5kaXZpZHVhbCBhZGRyZXNzIHNldHVwIGNvbW1hbmQgZmFpbGVkOiAlMDR4XG4iLCBkZXYtPm5hbWUsIGlhc19jbWQtPmNtZF9zdGF0dXMpOworCQlyZXR1cm4gMTsKKwl9CisJLyoKKwkgKiBURFIsIHdpcmUgY2hlY2sgLi4gZS5nLiBubyByZXNpc3RvciBlLnQuYworCSAqLworCXRkcl9jbWQgPSAoc3RydWN0IHRkcl9jbWRfc3RydWN0ICopIHB0cjsKKworCXRkcl9jbWQtPmNtZF9zdGF0dXMgPSAwOworCXRkcl9jbWQtPmNtZF9jbWQgPSBDTURfVERSIHwgQ01EX0xBU1Q7CisJdGRyX2NtZC0+Y21kX2xpbmsgPSAweGZmZmY7CisJdGRyX2NtZC0+c3RhdHVzID0gMDsKKworCXAtPnNjYi0+Y2JsX29mZnNldCA9IG1ha2UxNih0ZHJfY21kKTsKKworCXAtPnNjYi0+Y21kID0gQ1VDX1NUQVJUOwkvKiBjbWQuLXVuaXQgc3RhcnQgKi8KKwllbG1jX2F0dG41ODYoKTsKKworCXMgPSBqaWZmaWVzOworCXdoaWxlICghKHRkcl9jbWQtPmNtZF9zdGF0dXMgJiBTVEFUX0NPTVBMKSkgeworCQlpZiAoamlmZmllcyAtIHMgPiAzMCpIWi8xMDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlZCBQcm9ibGVtcyB3aGlsZSBydW5uaW5nIHRoZSBURFIuXG4iLCBkZXYtPm5hbWUsIF9fTElORV9fKTsKKwkJCXJlc3VsdCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghcmVzdWx0KSB7CisJCURFTEFZKDIpOwkvKiB3YWl0IGZvciByZXN1bHQgKi8KKwkJcmVzdWx0ID0gdGRyX2NtZC0+c3RhdHVzOworCisJCXAtPnNjYi0+Y21kID0gcC0+c2NiLT5zdGF0dXMgJiBTVEFUX01BU0s7CisJCWVsbWNfaWRfYXR0bjU4NigpOwkvKiBhY2sgdGhlIGludGVycnVwdHMgKi8KKworCQlpZiAocmVzdWx0ICYgVERSX0xOS19PSykgeworCQkJLyogZW1wdHkgKi8KKwkJfSBlbHNlIGlmIChyZXN1bHQgJiBURFJfWENWUl9QUkIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBURFI6IFRyYW5zY2VpdmVyIHByb2JsZW0hXG4iLCBkZXYtPm5hbWUpOworCQl9IGVsc2UgaWYgKHJlc3VsdCAmIFREUl9FVF9PUE4pIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBURFI6IE5vIGNvcnJlY3QgdGVybWluYXRpb24gJWQgY2xvY2tzIGF3YXkuXG4iLCBkZXYtPm5hbWUsIHJlc3VsdCAmIFREUl9USU1FTUFTSyk7CisJCX0gZWxzZSBpZiAocmVzdWx0ICYgVERSX0VUX1NSVCkgeworCQkJaWYgKHJlc3VsdCAmIFREUl9USU1FTUFTSykJLyogdGltZSA9PSAwIC0+IHN0cmFuZ2UgOi0pICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFREUjogRGV0ZWN0ZWQgYSBzaG9ydCBjaXJjdWl0ICVkIGNsb2NrcyBhd2F5LlxuIiwgZGV2LT5uYW1lLCByZXN1bHQgJiBURFJfVElNRU1BU0spOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFREUjogVW5rbm93biBzdGF0dXMgJTA0eFxuIiwgZGV2LT5uYW1lLCByZXN1bHQpOworCQl9CisJfQorCS8qCisJICogYWNrIGludGVycnVwdHMKKwkgKi8KKwlwLT5zY2ItPmNtZCA9IHAtPnNjYi0+c3RhdHVzICYgU1RBVF9NQVNLOworCWVsbWNfaWRfYXR0bjU4NigpOworCisJLyoKKwkgKiBhbGxvYyBub3AveG1pdC1jbWRzCisJICovCisjaWYgKE5VTV9YTUlUX0JVRkZTID09IDEpCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlwLT5ub3BfY21kc1tpXSA9IChzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QgKikgcHRyOworCQlwLT5ub3BfY21kc1tpXS0+Y21kX2NtZCA9IENNRF9OT1A7CisJCXAtPm5vcF9jbWRzW2ldLT5jbWRfc3RhdHVzID0gMDsKKwkJcC0+bm9wX2NtZHNbaV0tPmNtZF9saW5rID0gbWFrZTE2KChwLT5ub3BfY21kc1tpXSkpOworCQlwdHIgPSAoY2hhciAqKSBwdHIgKyBzaXplb2Yoc3RydWN0IG5vcF9jbWRfc3RydWN0KTsKKwl9CisJcC0+eG1pdF9jbWRzWzBdID0gKHN0cnVjdCB0cmFuc21pdF9jbWRfc3RydWN0ICopIHB0cjsJLyogdHJhbnNtaXQgY21kL2J1ZmYgMCAqLworCXB0ciA9IChjaGFyICopIHB0ciArIHNpemVvZihzdHJ1Y3QgdHJhbnNtaXRfY21kX3N0cnVjdCk7CisjZWxzZQorCWZvciAoaSA9IDA7IGkgPCBOVU1fWE1JVF9CVUZGUzsgaSsrKSB7CisJCXAtPm5vcF9jbWRzW2ldID0gKHN0cnVjdCBub3BfY21kX3N0cnVjdCAqKSBwdHI7CisJCXAtPm5vcF9jbWRzW2ldLT5jbWRfY21kID0gQ01EX05PUDsKKwkJcC0+bm9wX2NtZHNbaV0tPmNtZF9zdGF0dXMgPSAwOworCQlwLT5ub3BfY21kc1tpXS0+Y21kX2xpbmsgPSBtYWtlMTYoKHAtPm5vcF9jbWRzW2ldKSk7CisJCXB0ciA9IChjaGFyICopIHB0ciArIHNpemVvZihzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QpOworCQlwLT54bWl0X2NtZHNbaV0gPSAoc3RydWN0IHRyYW5zbWl0X2NtZF9zdHJ1Y3QgKikgcHRyOwkvKnRyYW5zbWl0IGNtZC9idWZmIDAgKi8KKwkJcHRyID0gKGNoYXIgKikgcHRyICsgc2l6ZW9mKHN0cnVjdCB0cmFuc21pdF9jbWRfc3RydWN0KTsKKwl9CisjZW5kaWYKKworCXB0ciA9IGFsbG9jX3JmYShkZXYsICh2b2lkICopIHB0cik7CS8qIGluaXQgcmVjZWl2ZS1mcmFtZS1hcmVhICovCisKKwkvKgorCSAqIE11bHRpY2FzdCBzZXR1cAorCSAqLworCisJaWYgKGRldi0+bWNfY291bnQpIHsKKwkJLyogSSBkb24ndCB1bmRlcnN0YW5kIHRoaXM6IGRvIHdlIHJlYWxseSBuZWVkIG1lbW9yeSBhZnRlciB0aGUgaW5pdD8gKi8KKwkJaW50IGxlbiA9ICgoY2hhciAqKSBwLT5pc2NwIC0gKGNoYXIgKikgcHRyIC0gOCkgLyA2OworCQlpZiAobGVuIDw9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE9vb29vcHMsIG5vIG1lbW9yeSBmb3IgTUMtU2V0dXAhXG4iLCBkZXYtPm5hbWUpOworCQl9IGVsc2UgeworCQkJaWYgKGxlbiA8IG51bV9hZGRycykgeworCQkJCW51bV9hZGRycyA9IGxlbjsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU29ycnksIGNhbiBvbmx5IGFwcGx5ICVkIE1DLUFkZHJlc3MoZXMpLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBudW1fYWRkcnMpOworCQkJfQorCQkJbWNfY21kID0gKHN0cnVjdCBtY3NldHVwX2NtZF9zdHJ1Y3QgKikgcHRyOworCQkJbWNfY21kLT5jbWRfc3RhdHVzID0gMDsKKwkJCW1jX2NtZC0+Y21kX2NtZCA9IENNRF9NQ1NFVFVQIHwgQ01EX0xBU1Q7CisJCQltY19jbWQtPmNtZF9saW5rID0gMHhmZmZmOworCQkJbWNfY21kLT5tY19jbnQgPSBudW1fYWRkcnMgKiA2OworCQkJZm9yIChpID0gMDsgaSA8IG51bV9hZGRyczsgaSsrKSB7CisJCQkJbWVtY3B5KChjaGFyICopIG1jX2NtZC0+bWNfbGlzdFtpXSwgZG1pLT5kbWlfYWRkciwgNik7CisJCQkJZG1pID0gZG1pLT5uZXh0OworCQkJfQorCQkJcC0+c2NiLT5jYmxfb2Zmc2V0ID0gbWFrZTE2KG1jX2NtZCk7CisJCQlwLT5zY2ItPmNtZCA9IENVQ19TVEFSVDsKKwkJCWVsbWNfaWRfYXR0bjU4NigpOworCQkJcyA9IGppZmZpZXM7CisJCQl3aGlsZSAoIShtY19jbWQtPmNtZF9zdGF0dXMgJiBTVEFUX0NPTVBMKSkgeworCQkJCWlmIChqaWZmaWVzIC0gcyA+IDMwKkhaLzEwMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIShtY19jbWQtPmNtZF9zdGF0dXMgJiBTVEFUX0NPTVBMKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBhcHBseSBtdWx0aWNhc3QtYWRkcmVzcy1saXN0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIGFsbG9jIHhtaXQtYnVmZnMgLyBpbml0IHhtaXRfY21kcworCSAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fWE1JVF9CVUZGUzsgaSsrKSB7CisJCXAtPnhtaXRfY2J1ZmZzW2ldID0gKGNoYXIgKikgcHRyOwkvKiBjaGFyLWJ1ZmZzICovCisJCXB0ciA9IChjaGFyICopIHB0ciArIFhNSVRfQlVGRl9TSVpFOworCQlwLT54bWl0X2J1ZmZzW2ldID0gKHN0cnVjdCB0YmRfc3RydWN0ICopIHB0cjsJLyogVEJEICovCisJCXB0ciA9IChjaGFyICopIHB0ciArIHNpemVvZihzdHJ1Y3QgdGJkX3N0cnVjdCk7CisJCWlmICgodm9pZCAqKSBwdHIgPiAodm9pZCAqKSBwLT5pc2NwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBub3QgZW5vdWdoIHNoYXJlZC1tZW0gZm9yIHlvdXIgY29uZmlndXJhdGlvbiFcbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQltZW1zZXQoKGNoYXIgKikgKHAtPnhtaXRfY21kc1tpXSksIDAsIHNpemVvZihzdHJ1Y3QgdHJhbnNtaXRfY21kX3N0cnVjdCkpOworCQltZW1zZXQoKGNoYXIgKikgKHAtPnhtaXRfYnVmZnNbaV0pLCAwLCBzaXplb2Yoc3RydWN0IHRiZF9zdHJ1Y3QpKTsKKwkJcC0+eG1pdF9jbWRzW2ldLT5jbWRfc3RhdHVzID0gU1RBVF9DT01QTDsKKwkJcC0+eG1pdF9jbWRzW2ldLT5jbWRfY21kID0gQ01EX1hNSVQgfCBDTURfSU5UOworCQlwLT54bWl0X2NtZHNbaV0tPnRiZF9vZmZzZXQgPSBtYWtlMTYoKHAtPnhtaXRfYnVmZnNbaV0pKTsKKwkJcC0+eG1pdF9idWZmc1tpXS0+bmV4dCA9IDB4ZmZmZjsKKwkJcC0+eG1pdF9idWZmc1tpXS0+YnVmZmVyID0gbWFrZTI0KChwLT54bWl0X2NidWZmc1tpXSkpOworCX0KKworCXAtPnhtaXRfY291bnQgPSAwOworCXAtPnhtaXRfbGFzdCA9IDA7CisjaWZuZGVmIE5PX05PUENPTU1BTkRTCisJcC0+bm9wX3BvaW50ID0gMDsKKyNlbmRpZgorCisJLyoKKwkgKiAnc3RhcnQgdHJhbnNtaXR0ZXInIChub3AtbG9vcCkKKwkgKi8KKyNpZm5kZWYgTk9fTk9QQ09NTUFORFMKKwlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYocC0+bm9wX2NtZHNbMF0pOworCXAtPnNjYi0+Y21kID0gQ1VDX1NUQVJUOworCWVsbWNfaWRfYXR0bjU4NigpOworCVdBSVRfNF9TQ0JfQ01EKCk7CisjZWxzZQorCXAtPnhtaXRfY21kc1swXS0+Y21kX2xpbmsgPSAweGZmZmY7CisJcC0+eG1pdF9jbWRzWzBdLT5jbWRfY21kID0gQ01EX1hNSVQgfCBDTURfTEFTVCB8IENNRF9JTlQ7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGlzIGEgaGVscGVyIHJvdXRpbmUgZm9yIGVsbWNfcm5yX2ludCgpIGFuZCBpbml0NTg2KCkuCisgKiBJdCBzZXRzIHVwIHRoZSBSZWNlaXZlIEZyYW1lIEFyZWEgKFJGQSkuCisgKi8KKworc3RhdGljIHZvaWQgKmFsbG9jX3JmYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwdHIpCit7CisJdm9sYXRpbGUgc3RydWN0IHJmZF9zdHJ1Y3QgKnJmZCA9IChzdHJ1Y3QgcmZkX3N0cnVjdCAqKSBwdHI7CisJdm9sYXRpbGUgc3RydWN0IHJiZF9zdHJ1Y3QgKnJiZDsKKwlpbnQgaTsKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwltZW1zZXQoKGNoYXIgKikgcmZkLCAwLCBzaXplb2Yoc3RydWN0IHJmZF9zdHJ1Y3QpICogcC0+bnVtX3JlY3ZfYnVmZnMpOworCXAtPnJmZF9maXJzdCA9IHJmZDsKKworCWZvciAoaSA9IDA7IGkgPCBwLT5udW1fcmVjdl9idWZmczsgaSsrKSB7CisJCXJmZFtpXS5uZXh0ID0gbWFrZTE2KHJmZCArIChpICsgMSkgJSBwLT5udW1fcmVjdl9idWZmcyk7CisJfQorCXJmZFtwLT5udW1fcmVjdl9idWZmcyAtIDFdLmxhc3QgPSBSRkRfU1VTUDsJLyogUlUgc3VzcGVuZCAqLworCisJcHRyID0gKHZvaWQgKikgKHJmZCArIHAtPm51bV9yZWN2X2J1ZmZzKTsKKworCXJiZCA9IChzdHJ1Y3QgcmJkX3N0cnVjdCAqKSBwdHI7CisJcHRyID0gKHZvaWQgKikgKHJiZCArIHAtPm51bV9yZWN2X2J1ZmZzKTsKKworCS8qIGNsciBkZXNjcmlwdG9ycyAqLworCW1lbXNldCgoY2hhciAqKSByYmQsIDAsIHNpemVvZihzdHJ1Y3QgcmJkX3N0cnVjdCkgKiBwLT5udW1fcmVjdl9idWZmcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcC0+bnVtX3JlY3ZfYnVmZnM7IGkrKykgeworCQlyYmRbaV0ubmV4dCA9IG1ha2UxNigocmJkICsgKGkgKyAxKSAlIHAtPm51bV9yZWN2X2J1ZmZzKSk7CisJCXJiZFtpXS5zaXplID0gUkVDVl9CVUZGX1NJWkU7CisJCXJiZFtpXS5idWZmZXIgPSBtYWtlMjQocHRyKTsKKwkJcHRyID0gKGNoYXIgKikgcHRyICsgUkVDVl9CVUZGX1NJWkU7CisJfQorCisJcC0+cmZkX3RvcCA9IHAtPnJmZF9maXJzdDsKKwlwLT5yZmRfbGFzdCA9IHAtPnJmZF9maXJzdCArIHAtPm51bV9yZWN2X2J1ZmZzIC0gMTsKKworCXAtPnNjYi0+cmZhX29mZnNldCA9IG1ha2UxNihwLT5yZmRfZmlyc3QpOworCXAtPnJmZF9maXJzdC0+cmJkX29mZnNldCA9IG1ha2UxNihyYmQpOworCisJcmV0dXJuIHB0cjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEludGVycnVwdCBIYW5kbGVyIC4uLgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorZWxtY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVnX3B0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0OworCXN0cnVjdCBwcml2ICpwOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZWxtYy1pbnRlcnJ1cHQ6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCAoaW50KSAtKCgoc3RydWN0IHB0X3JlZ3MgKikgcmVnX3B0ciktPm9yaWdfZWF4ICsgMikpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfSBlbHNlIGlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCS8qIFRoZSAzYzUyMyBoYXMgdGhpcyBoYWJpdCBvZiBnZW5lcmF0aW5nIGludGVycnVwdHMgZHVyaW5nIHRoZQorCQkgICByZXNldC4gIEknbSBub3Qgc3VyZSBpZiB0aGUgbmk1MiBoYXMgdGhpcyBzYW1lIHByb2JsZW0sIGJ1dCBpdCdzCisJCSAgIHJlYWxseSBhbm5veWluZyBpZiB3ZSBoYXZlbid0IGZpbmlzaGVkIGluaXRpYWxpemluZyBpdC4gIEkgd2FzCisJCSAgIGhvcGluZyBhbGwgdGhlIGVsbWNfaWRfKiBjb21tYW5kcyB3b3VsZCBkaXNhYmxlIHRoaXMsIGJ1dCBJCisJCSAgIG1pZ2h0IGhhdmUgbWlzc2VkIGEgZmV3LiAqLworCisJCWVsbWNfaWRfYXR0bjU4NigpOwkvKiBhY2sgaW50ZXIuIGFuZCBkaXNhYmxlIGFueSBtb3JlICovCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UgaWYgKCEoRUxNQ19DVFJMX0lOVCAmIGluYihkZXYtPmJhc2VfYWRkciArIEVMTUNfQ1RSTCkpKSB7CisJCS8qIHdhc24ndCB0aGlzIGRldmljZSAqLworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCS8qIHJlYWRpbmcgRUxNQ19DVFJMIGFsc28gY2xlYXJzIHRoZSBJTlQgYml0LiAqLworCisJcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwl3aGlsZSAoKHN0YXQgPSBwLT5zY2ItPnN0YXR1cyAmIFNUQVRfTUFTSykpIAorCXsKKwkJcC0+c2NiLT5jbWQgPSBzdGF0OworCQllbG1jX2F0dG41ODYoKTsJLyogYWNrIGludGVyLiAqLworCisJCWlmIChzdGF0ICYgU1RBVF9DWCkgeworCQkJLyogY29tbWFuZCB3aXRoIEktYml0IHNldCBjb21wbGV0ZSAqLworCQkJZWxtY194bXRfaW50KGRldik7CisJCX0KKwkJaWYgKHN0YXQgJiBTVEFUX0ZSKSB7CisJCQkvKiByZWNlaXZlZCBhIGZyYW1lICovCisJCQllbG1jX3Jjdl9pbnQoZGV2KTsKKwkJfQorI2lmbmRlZiBOT19OT1BDT01NQU5EUworCQlpZiAoc3RhdCAmIFNUQVRfQ05BKSB7CisJCQkvKiBDVSB3ZW50ICdub3QgcmVhZHknICovCisJCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG9vcHMhIENVIGhhcyBsZWZ0IGFjdGl2ZSBzdGF0ZS4gc3RhdDogJTA0eC8lMDR4LlxuIiwgZGV2LT5uYW1lLCAoaW50KSBzdGF0LCAoaW50KSBwLT5zY2ItPnN0YXR1cyk7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCWlmIChzdGF0ICYgU1RBVF9STlIpIHsKKwkJCS8qIFJVIHdlbnQgJ25vdCByZWFkeScgKi8KKworCQkJaWYgKHAtPnNjYi0+c3RhdHVzICYgUlVfU1VTUEVORCkgeworCQkJCS8qIHNwZWNpYWwgY2FzZTogUlVfU1VTUEVORCAqLworCisJCQkJV0FJVF80X1NDQl9DTUQoKTsKKwkJCQlwLT5zY2ItPmNtZCA9IFJVQ19SRVNVTUU7CisJCQkJZWxtY19hdHRuNTg2KCk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlci1Vbml0IHdlbnQgJ05PVCBSRUFEWSc6ICUwNHgvJTA0eC5cbiIsIGRldi0+bmFtZSwgKGludCkgc3RhdCwgKGludCkgcC0+c2NiLT5zdGF0dXMpOworCQkJCWVsbWNfcm5yX2ludChkZXYpOworCQkJfQorCQl9CisJCVdBSVRfNF9TQ0JfQ01EKCk7CS8qIHdhaXQgZm9yIGFjay4gKGVsbWNfeG10X2ludCBjYW4gYmUgZmFzdGVyIHRoYW4gYWNrISEpICovCisJCWlmIChwLT5zY2ItPmNtZCkgewkvKiB0aW1lZCBvdXQ/ICovCisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZWNlaXZlLWludGVycnVwdAorICovCisKK3N0YXRpYyB2b2lkIGVsbWNfcmN2X2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgdG90bGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJiZF9zdHJ1Y3QgKnJiZDsKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwlmb3IgKDsgKHN0YXR1cyA9IHAtPnJmZF90b3AtPnN0YXR1cykgJiBTVEFUX0NPTVBMOykgeworCQlyYmQgPSAoc3RydWN0IHJiZF9zdHJ1Y3QgKikgbWFrZTMyKHAtPnJmZF90b3AtPnJiZF9vZmZzZXQpOworCisJCWlmIChzdGF0dXMgJiBTVEFUX09LKSB7CQkvKiBmcmFtZSByZWNlaXZlZCB3aXRob3V0IGVycm9yPyAqLworCQkJaWYgKCh0b3RsZW4gPSByYmQtPnN0YXR1cykgJiBSQkRfTEFTVCkgewkvKiB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGJ1ZmZlcj8gKi8KKwkJCQl0b3RsZW4gJj0gUkJEX01BU0s7CS8qIGxlbmd0aCBvZiB0aGlzIGZyYW1lICovCisJCQkJcmJkLT5zdGF0dXMgPSAwOworCQkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBkZXZfYWxsb2Nfc2tiKHRvdGxlbiArIDIpOworCQkJCWlmIChza2IgIT0gTlVMTCkgeworCQkJCQlza2ItPmRldiA9IGRldjsKKwkJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbm1lbnQgKi8KKwkJCQkJc2tiX3B1dChza2IsdG90bGVuKTsKKwkJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIChjaGFyICopIHAtPmJhc2UrKHVuc2lnbmVkIGxvbmcpIHJiZC0+YnVmZmVyLHRvdGxlbiwwKTsKKwkJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQkJcC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCQlwLT5zdGF0cy5yeF9ieXRlcyArPSB0b3RsZW47CisJCQkJfSBlbHNlIHsKKwkJCQkJcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlY2VpdmVkIG92ZXJzaXplZCBmcmFtZS5cbiIsIGRldi0+bmFtZSk7CisJCQkJcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJfQorCQl9IGVsc2UgewkvKiBmcmFtZSAhKG9rKSwgb25seSB3aXRoICdzYXZlLWJhZC1mcmFtZXMnICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogb29wcyEgcmZkLWVycm9yLXN0YXR1czogJTA0eFxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCX0KKwkJcC0+cmZkX3RvcC0+c3RhdHVzID0gMDsKKwkJcC0+cmZkX3RvcC0+bGFzdCA9IFJGRF9TVVNQOworCQlwLT5yZmRfbGFzdC0+bGFzdCA9IDA7CS8qIGRlbGV0ZSBSVV9TVVNQICAqLworCQlwLT5yZmRfbGFzdCA9IHAtPnJmZF90b3A7CisJCXAtPnJmZF90b3AgPSAoc3RydWN0IHJmZF9zdHJ1Y3QgKikgbWFrZTMyKHAtPnJmZF90b3AtPm5leHQpOwkvKiBzdGVwIHRvIG5leHQgUkZEICovCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaGFuZGxlICdSZWNlaXZlciB3ZW50IG5vdCByZWFkeScuCisgKi8KKworc3RhdGljIHZvaWQgZWxtY19ybnJfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJcC0+c3RhdHMucnhfZXJyb3JzKys7CisKKwlXQUlUXzRfU0NCX0NNRCgpOwkvKiB3YWl0IGZvciB0aGUgbGFzdCBjbWQgKi8KKwlwLT5zY2ItPmNtZCA9IFJVQ19BQk9SVDsJLyogdXN1YWxseSB0aGUgUlUgaXMgaW4gdGhlICdubyByZXNvdXJjZSctc3RhdGUgLi4gYWJvcnQgaXQgbm93LiAqLworCWVsbWNfYXR0bjU4NigpOworCVdBSVRfNF9TQ0JfQ01EKCk7CS8qIHdhaXQgZm9yIGFjY2VwdCBjbWQuICovCisKKwlhbGxvY19yZmEoZGV2LCAoY2hhciAqKSBwLT5yZmRfZmlyc3QpOworCXN0YXJ0cmVjdjU4NihkZXYpOwkvKiByZXN0YXJ0IFJVICovCisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZS1Vbml0IHJlc3RhcnRlZC4gU3RhdHVzOiAlMDR4XG4iLCBkZXYtPm5hbWUsIHAtPnNjYi0+c3RhdHVzKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaGFuZGxlIHhtaXQgLSBpbnRlcnJ1cHQKKyAqLworCitzdGF0aWMgdm9pZCBlbG1jX3htdF9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCXN0YXR1cyA9IHAtPnhtaXRfY21kc1twLT54bWl0X2xhc3RdLT5jbWRfc3RhdHVzOworCWlmICghKHN0YXR1cyAmIFNUQVRfQ09NUEwpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBzdHJhbmdlIC4uIHhtaXQtaW50IHdpdGhvdXQgYSAnQ09NUExFVEUnXG4iLCBkZXYtPm5hbWUpOworCX0KKwlpZiAoc3RhdHVzICYgU1RBVF9PSykgeworCQlwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHN0YXR1cyAmIFRDTURfTUFYQ09MTE1BU0spOworCX0gZWxzZSB7CisJCXAtPnN0YXRzLnR4X2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgVENNRF9MQVRFQ09MTCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGxhdGUgY29sbGlzaW9uIGRldGVjdGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJCXAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBUQ01EX05PQ0FSUklFUikgeworCQkJcC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBubyBjYXJyaWVyIGRldGVjdGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBUQ01EX0xPU1RDVFMpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBsb3NzIG9mIENUUyBkZXRlY3RlZC5cbiIsIGRldi0+bmFtZSk7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgVENNRF9VTkRFUlJVTikgeworCQkJcC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBETUEgdW5kZXJydW4gZGV0ZWN0ZWQuXG4iLCBkZXYtPm5hbWUpOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFRDTURfTUFYQ09MTCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1heC4gY29sbGlzaW9ucyBleGNlZWRlZC5cbiIsIGRldi0+bmFtZSk7CisJCQlwLT5zdGF0cy5jb2xsaXNpb25zICs9IDE2OworCQl9CisJfQorCisjaWYgKE5VTV9YTUlUX0JVRkZTICE9IDEpCisJaWYgKCgrK3AtPnhtaXRfbGFzdCkgPT0gTlVNX1hNSVRfQlVGRlMpIHsKKwkJcC0+eG1pdF9sYXN0ID0gMDsKKwl9CisjZW5kaWYKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAocmUpc3RhcnQgdGhlIHJlY2VpdmVyCisgKi8KKworc3RhdGljIHZvaWQgc3RhcnRyZWN2NTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJcC0+c2NiLT5yZmFfb2Zmc2V0ID0gbWFrZTE2KHAtPnJmZF9maXJzdCk7CisJcC0+c2NiLT5jbWQgPSBSVUNfU1RBUlQ7CisJZWxtY19hdHRuNTg2KCk7CQkvKiBzdGFydCBjbWQuICovCisJV0FJVF80X1NDQl9DTUQoKTsJLyogd2FpdCBmb3IgYWNjZXB0IGNtZC4gKG5vIHRpbWVvdXQhISkgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdGltZW91dAorICovCisgCitzdGF0aWMgdm9pZCBlbG1jX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisJLyogQ09NTUFORC1VTklUIGFjdGl2ZT8gKi8KKwlpZiAocC0+c2NiLT5zdGF0dXMgJiBDVV9BQ1RJVkUpIHsKKyNpZmRlZiBERUJVRworCQlwcmludGsoIiVzOiBzdHJhbmdlIC4uLiB0aW1lb3V0IHdpdGggQ1UgYWN0aXZlPyE/XG4iLCBkZXYtPm5hbWUpOworCQlwcmludGsoIiVzOiBYMDogJTA0eCBOMDogJTA0eCBOMTogJTA0eCAlZFxuIiwgZGV2LT5uYW1lLCAoaW50KSBwLT54bWl0X2NtZHNbMF0tPmNtZF9zdGF0dXMsIChpbnQpIHAtPm5vcF9jbWRzWzBdLT5jbWRfc3RhdHVzLCAoaW50KSBwLT5ub3BfY21kc1sxXS0+Y21kX3N0YXR1cywgKGludCkgcC0+bm9wX3BvaW50KTsKKyNlbmRpZgorCQlwLT5zY2ItPmNtZCA9IENVQ19BQk9SVDsKKwkJZWxtY19hdHRuNTg2KCk7CisJCVdBSVRfNF9TQ0JfQ01EKCk7CisJCXAtPnNjYi0+Y2JsX29mZnNldCA9IG1ha2UxNihwLT5ub3BfY21kc1twLT5ub3BfcG9pbnRdKTsKKwkJcC0+c2NiLT5jbWQgPSBDVUNfU1RBUlQ7CisJCWVsbWNfYXR0bjU4NigpOworCQlXQUlUXzRfU0NCX0NNRCgpOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfSBlbHNlIHsKKyNpZmRlZiBERUJVRworCQlwcmludGsoIiVzOiB4bWl0dGVyIHRpbWVkIG91dCwgdHJ5IHRvIHJlc3RhcnQhIHN0YXQ6ICUwNHhcbiIsIGRldi0+bmFtZSwgcC0+c2NiLT5zdGF0dXMpOworCQlwcmludGsoIiVzOiBjb21tYW5kLXN0YXRzOiAlMDR4ICUwNHhcbiIsIGRldi0+bmFtZSwgcC0+eG1pdF9jbWRzWzBdLT5jbWRfc3RhdHVzLCBwLT54bWl0X2NtZHNbMV0tPmNtZF9zdGF0dXMpOworI2VuZGlmCisJCWVsbWNfY2xvc2UoZGV2KTsKKwkJZWxtY19vcGVuKGRldik7CisJfQorfQorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc2VuZCBmcmFtZQorICovCisKK3N0YXRpYyBpbnQgZWxtY19zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBsZW47CisJaW50IGk7CisjaWZuZGVmIE5PX05PUENPTU1BTkRTCisJaW50IG5leHRfbm9wOworI2VuZGlmCisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJbGVuID0gKEVUSF9aTEVOIDwgc2tiLT5sZW4pID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKwkKKwlpZiAobGVuICE9IHNrYi0+bGVuKQorCQltZW1zZXQoKGNoYXIgKikgcC0+eG1pdF9jYnVmZnNbcC0+eG1pdF9jb3VudF0sIDAsIEVUSF9aTEVOKTsKKwltZW1jcHkoKGNoYXIgKikgcC0+eG1pdF9jYnVmZnNbcC0+eG1pdF9jb3VudF0sIChjaGFyICopIChza2ItPmRhdGEpLCBza2ItPmxlbik7CisKKyNpZiAoTlVNX1hNSVRfQlVGRlMgPT0gMSkKKyNpZmRlZiBOT19OT1BDT01NQU5EUworCXAtPnhtaXRfYnVmZnNbMF0tPnNpemUgPSBUQkRfTEFTVCB8IGxlbjsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYocC0+eG1pdF9jbWRzWzBdKTsKKwkJcC0+c2NiLT5jbWQgPSBDVUNfU1RBUlQ7CisJCXAtPnhtaXRfY21kc1swXS0+Y21kX3N0YXR1cyA9IDA7CisJCQllbG1jX2F0dG41ODYoKTsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWlmICghaSkgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQl9CisJCVdBSVRfNF9TQ0JfQ01EKCk7CisJCWlmICgocC0+c2NiLT5zdGF0dXMgJiBDVV9BQ1RJVkUpKSB7CS8qIHRlc3QgaXQsIGJlY2F1c2UgQ1Ugc29tZXRpbWVzIGRvZXNuJ3Qgc3RhcnQgaW1tZWRpYXRlbHkgKi8KKwkJCWJyZWFrOworCQl9CisJCWlmIChwLT54bWl0X2NtZHNbMF0tPmNtZF9zdGF0dXMpIHsKKwkJCWJyZWFrOworCQl9CisJCWlmIChpID09IDE1KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3Qgc3RhcnQgdHJhbnNtaXQtY29tbWFuZC5cbiIsIGRldi0+bmFtZSk7CisJCX0KKwl9CisjZWxzZQorCW5leHRfbm9wID0gKHAtPm5vcF9wb2ludCArIDEpICYgMHgxOworCXAtPnhtaXRfYnVmZnNbMF0tPnNpemUgPSBUQkRfTEFTVCB8IGxlbjsKKwkKKwlwLT54bWl0X2NtZHNbMF0tPmNtZF9saW5rID0gcC0+bm9wX2NtZHNbbmV4dF9ub3BdLT5jbWRfbGluaworCSAgICA9IG1ha2UxNigocC0+bm9wX2NtZHNbbmV4dF9ub3BdKSk7CisJcC0+eG1pdF9jbWRzWzBdLT5jbWRfc3RhdHVzID0gcC0+bm9wX2NtZHNbbmV4dF9ub3BdLT5jbWRfc3RhdHVzID0gMDsKKworCXAtPm5vcF9jbWRzW3AtPm5vcF9wb2ludF0tPmNtZF9saW5rID0gbWFrZTE2KChwLT54bWl0X2NtZHNbMF0pKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlwLT5ub3BfcG9pbnQgPSBuZXh0X25vcDsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisjZW5kaWYKKyNlbHNlCisJcC0+eG1pdF9idWZmc1twLT54bWl0X2NvdW50XS0+c2l6ZSA9IFRCRF9MQVNUIHwgbGVuOworCWlmICgobmV4dF9ub3AgPSBwLT54bWl0X2NvdW50ICsgMSkgPT0gTlVNX1hNSVRfQlVGRlMpIHsKKwkJbmV4dF9ub3AgPSAwOworCX0KKwlwLT54bWl0X2NtZHNbcC0+eG1pdF9jb3VudF0tPmNtZF9zdGF0dXMgPSAwOworCXAtPnhtaXRfY21kc1twLT54bWl0X2NvdW50XS0+Y21kX2xpbmsgPSBwLT5ub3BfY21kc1tuZXh0X25vcF0tPmNtZF9saW5rCisJICAgID0gbWFrZTE2KChwLT5ub3BfY21kc1tuZXh0X25vcF0pKTsKKwlwLT5ub3BfY21kc1tuZXh0X25vcF0tPmNtZF9zdGF0dXMgPSAwOworCQlwLT5ub3BfY21kc1twLT54bWl0X2NvdW50XS0+Y21kX2xpbmsgPSBtYWtlMTYoKHAtPnhtaXRfY21kc1twLT54bWl0X2NvdW50XSkpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXAtPnhtaXRfY291bnQgPSBuZXh0X25vcDsKKwlpZiAocC0+eG1pdF9jb3VudCAhPSBwLT54bWl0X2xhc3QpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvbWVvbmUgd2FubmEgaGF2ZSB0aGUgc3RhdGlzdGljcworICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWxtY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgc2hvcnQgY3JjLCBhbG4sIHJzYywgb3ZybjsKKworCWNyYyA9IHAtPnNjYi0+Y3JjX2VycnM7CS8qIGdldCBlcnJvci1zdGF0aXN0aWMgZnJvbSB0aGUgbmk4MjU4NiAqLworCXAtPnNjYi0+Y3JjX2VycnMgLT0gY3JjOworCWFsbiA9IHAtPnNjYi0+YWxuX2VycnM7CisJcC0+c2NiLT5hbG5fZXJycyAtPSBhbG47CisJcnNjID0gcC0+c2NiLT5yc2NfZXJyczsKKwlwLT5zY2ItPnJzY19lcnJzIC09IHJzYzsKKwlvdnJuID0gcC0+c2NiLT5vdnJuX2VycnM7CisJcC0+c2NiLT5vdnJuX2VycnMgLT0gb3ZybjsKKworCXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gY3JjOworCXAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzICs9IG92cm47CisJcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGFsbjsKKwlwLT5zdGF0cy5yeF9kcm9wcGVkICs9IHJzYzsKKworCXJldHVybiAmcC0+c3RhdHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0IE1DIGxpc3QgLi4KKyAqLworCisjaWZkZWYgRUxNQ19NVUxUSUNBU1QKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmICghZGV2LT5zdGFydCkgeworCQkvKiB3aXRob3V0IGEgcnVubmluZyBpbnRlcmZhY2UsIHByb21pc2N1b3VzIGRvZXNuJ3Qgd29yayAqLworCQlyZXR1cm47CisJfQorCWRldi0+c3RhcnQgPSAwOworCWFsbG9jNTg2KGRldik7CisJaW5pdDU4NihkZXYpOworCXN0YXJ0cmVjdjU4NihkZXYpOworCWRldi0+c3RhcnQgPSAxOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIk1DQSAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKK307CisKKyNpZmRlZiBNT0RVTEUKKworLyogSW5jcmVhc2UgaWYgbmVlZGVkIDspICovCisjZGVmaW5lIE1BWF8zQzUyM19DQVJEUyA0CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2VsbWNbTUFYXzNDNTIzX0NBUkRTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF8zQzUyM19DQVJEU107CitzdGF0aWMgaW50IGlvW01BWF8zQzUyM19DQVJEU107Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkV0aGVyTGluay9NQyBJL08gYmFzZSBhZGRyZXNzKGVzKSIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJFdGhlckxpbmsvTUMgSVJRIG51bWJlcihzKSIpOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXYsZm91bmQgPSAwOworCisJLyogTG9vcCB1bnRpbCB3ZSBlaXRoZXIgY2FuJ3QgZmluZCBhbnkgbW9yZSBjYXJkcywgb3Igd2UgaGF2ZSBNQVhfM0M1MjNfQ0FSRFMgKi8JCisJZm9yKHRoaXNfZGV2PTA7IHRoaXNfZGV2PE1BWF8zQzUyM19DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBwcml2KSk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxPWlycVt0aGlzX2Rldl07CisJCWRldi0+YmFzZV9hZGRyPWlvW3RoaXNfZGV2XTsKKwkJaWYgKGRvX2VsbWNfcHJvYmUoZGV2KSA9PSAwKSB7CisJCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgeworCQkJCWRldl9lbG1jW3RoaXNfZGV2XSA9IGRldjsKKwkJCQlmb3VuZCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY2xlYW51cF9jYXJkKGRldik7CisJCX0KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJaWYgKGlvW3RoaXNfZGV2XT09MCkKKwkJCWJyZWFrOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzYzUyMy5jOiBObyAzYzUyMyBjYXJkIGZvdW5kIGF0IGlvPSUjeFxuIixpb1t0aGlzX2Rldl0pOworCX0KKworCWlmKGZvdW5kPT0wKSB7CisJCWlmKGlvWzBdPT0wKSBwcmludGsoS0VSTl9OT1RJQ0UgIjNjNTIzLmM6IE5vIDNjNTIzIGNhcmRzIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9IGVsc2UgcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXY7CisJZm9yICh0aGlzX2Rldj0wOyB0aGlzX2RldjxNQVhfM0M1MjNfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9lbG1jW3RoaXNfZGV2XTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKworI2VuZGlmCQkJCS8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MjMuaCBiL2RyaXZlcnMvbmV0LzNjNTIzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5MmY4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0LzNjNTIzLmgKQEAgLTAsMCArMSwzNTUgQEAKKyNpZm5kZWYgXzNjNTIzX0lOQ0xVREVfCisjZGVmaW5lIF8zYzUyM19JTkNMVURFXworLyoKKwlUaGlzIGlzIGJhc2ljYWxseSBhIGhhY2tlZCB2ZXJzaW9uIG9mIG5pNTIuaCwgZm9yIHRoZSAzYzUyMworCUV0aGVybGluay9NQy4KKyovCisKKy8qCisgKiBJbnRlbCBpODI1ODYgRXRoZXJuZXQgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGlzIGNvdmVyZWQgYnkgdGhlCisgKiBzYW1lIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoYXQgY292ZXJzIHRoYXQgd29yay4KKyAqCisgKiBDb3B5cmlnaHQgMTk5NSBieSBDaHJpcyBCZWF1cmVnYXJkIChjcGJlYXVyZUB1bmRlcmdyYWQubWF0aC51d2F0ZXJsb28uY2EpCisgKgorICogU2VlIDNjNTIzLmMgZm9yIGRldGFpbHMuCisgKgorICogJEhlYWRlcjogL2hvbWUvY2hyaXNiL2xpbnV4LTEuMi4xMy0zYzUyMy9kcml2ZXJzL25ldC9SQ1MvM2M1MjMuaCx2IDEuNiAxOTk2LzAxLzIwIDA1OjA5OjAwIGNocmlzYiBFeHAgY2hyaXNiICQKKyAqLworCisvKgorICogd2hlcmUgdG8gZmluZCB0aGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAoU0NQKQorICovCisjZGVmaW5lIFNDUF9ERUZBVUxUX0FERFJFU1MgMHhmZmZmZjQKKworCisvKgorICogU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciBTdHJ1Y3QKKyAqLworCitzdHJ1Y3Qgc2NwX3N0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCB6ZXJvX2R1bTA7CS8qIGhhcyB0byBiZSB6ZXJvICovCisgIHVuc2lnbmVkIGNoYXIgIHN5c2J1czsJLyogMD0xNkJpdCwxPThCaXQgKi8KKyAgdW5zaWduZWQgY2hhciAgemVyb19kdW0xOwkvKiBoYXMgdG8gYmUgemVybyBmb3IgNTg2ICovCisgIHVuc2lnbmVkIHNob3J0IHplcm9fZHVtMjsKKyAgdW5zaWduZWQgc2hvcnQgemVyb19kdW0zOworICBjaGFyICAgICAgICAgICppc2NwOwkJLyogcG9pbnRlciB0byB0aGUgaXNjcC1ibG9jayAqLworfTsKKworCisvKgorICogSW50ZXJtZWRpYXRlIFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIgKElTQ1ApCisgKi8KK3N0cnVjdCBpc2NwX3N0cnVjdAoreworICB1bnNpZ25lZCBjaGFyICBidXN5OyAgICAgICAgICAvKiA1ODYgY2xlYXJzIGFmdGVyIHN1Y2Nlc3NmdWwgaW5pdCAqLworICB1bnNpZ25lZCBjaGFyICB6ZXJvX2R1bW15OyAgICAvKiBoYXN0IHRvIGJlIHplcm8gKi8KKyAgdW5zaWduZWQgc2hvcnQgc2NiX29mZnNldDsgICAgLyogcG9pbnRlcm9mZnNldCB0byB0aGUgc2NiX2Jhc2UgKi8KKyAgY2hhciAgICAgICAgICAqc2NiX2Jhc2U7ICAgICAgLyogYmFzZS1hZGRyZXNzIG9mIGFsbCAxNi1iaXQgb2Zmc2V0cyAqLworfTsKKworLyoKKyAqIFN5c3RlbSBDb250cm9sIEJsb2NrIChTQ0IpCisgKi8KK3N0cnVjdCBzY2Jfc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsgICAgICAgIC8qIHN0YXR1cyB3b3JkICovCisgIHVuc2lnbmVkIHNob3J0IGNtZDsgICAgICAgICAgIC8qIGNvbW1hbmQgd29yZCAqLworICB1bnNpZ25lZCBzaG9ydCBjYmxfb2Zmc2V0OyAgICAvKiBwb2ludGVyb2Zmc2V0LCBjb21tYW5kIGJsb2NrIGxpc3QgKi8KKyAgdW5zaWduZWQgc2hvcnQgcmZhX29mZnNldDsgICAgLyogcG9pbnRlcm9mZnNldCwgcmVjZWl2ZSBmcmFtZSBhcmVhICovCisgIHVuc2lnbmVkIHNob3J0IGNyY19lcnJzOyAgICAgIC8qIENSQy1FcnJvciBjb3VudGVyICovCisgIHVuc2lnbmVkIHNob3J0IGFsbl9lcnJzOyAgICAgIC8qIGFsaWdubWVudGVycm9yIGNvdW50ZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgcnNjX2VycnM7ICAgICAgLyogUmVzb3VyY2VlcnJvciBjb3VudGVyICovCisgIHVuc2lnbmVkIHNob3J0IG92cm5fZXJyczsgICAgIC8qIE9WZXJydW5lcnJvciBjb3VudGVyICovCit9OworCisvKgorICogcG9zc2libGUgY29tbWFuZCB2YWx1ZXMgZm9yIHRoZSBjb21tYW5kIHdvcmQKKyAqLworI2RlZmluZSBSVUNfTUFTSwkweDAwNzAJLyogbWFzayBmb3IgUlUgY29tbWFuZHMgKi8KKyNkZWZpbmUgUlVDX05PUAkJMHgwMDAwCS8qIE5PUC1jb21tYW5kICovCisjZGVmaW5lIFJVQ19TVEFSVAkweDAwMTAJLyogc3RhcnQgUlUgKi8KKyNkZWZpbmUgUlVDX1JFU1VNRQkweDAwMjAJLyogcmVzdW1lIFJVIGFmdGVyIHN1c3BlbmQgKi8KKyNkZWZpbmUgUlVDX1NVU1BFTkQJMHgwMDMwCS8qIHN1c3BlbmQgUlUgKi8KKyNkZWZpbmUgUlVDX0FCT1JUCTB4MDA0MAkvKiBhYm9ydCByZWNlaXZlciBvcGVyYXRpb24gaW1tZWRpYXRlbHkgKi8KKworI2RlZmluZSBDVUNfTUFTSwkweDA3MDAJLyogbWFzayBmb3IgQ1UgY29tbWFuZCAqLworI2RlZmluZSBDVUNfTk9QCQkweDAwMDAJLyogTk9QLWNvbW1hbmQgKi8KKyNkZWZpbmUgQ1VDX1NUQVJUCTB4MDEwMAkvKiBzdGFydCBleGVjdXRpb24gb2YgMS4gY21kIG9uIHRoZSBDQkwgKi8KKyNkZWZpbmUgQ1VDX1JFU1VNRQkweDAyMDAJLyogcmVzdW1lIGFmdGVyIHN1c3BlbmQgKi8KKyNkZWZpbmUgQ1VDX1NVU1BFTkQJMHgwMzAwCS8qIFN1c3BlbmQgQ1UgKi8KKyNkZWZpbmUgQ1VDX0FCT1JUCTB4MDQwMAkvKiBhYm9ydCBjb21tYW5kIG9wZXJhdGlvbiBpbW1lZGlhdGVseSAqLworCisjZGVmaW5lIEFDS19NQVNLCTB4ZjAwMAkvKiBtYXNrIGZvciBBQ0sgY29tbWFuZCAqLworI2RlZmluZSBBQ0tfQ1gJCTB4ODAwMAkvKiBhY2tub3dsZWRnZXMgU1RBVF9DWCAqLworI2RlZmluZSBBQ0tfRlIJCTB4NDAwMAkvKiBhY2suIFNUQVRfRlIgKi8KKyNkZWZpbmUgQUNLX0NOQQkJMHgyMDAwCS8qIGFjay4gU1RBVF9DTkEgKi8KKyNkZWZpbmUgQUNLX1JOUgkJMHgxMDAwCS8qIGFjay4gU1RBVF9STlIgKi8KKworLyoKKyAqIHBvc3NpYmxlIHN0YXR1cyB2YWx1ZXMgZm9yIHRoZSBzdGF0dXMgd29yZAorICovCisjZGVmaW5lIFNUQVRfTUFTSwkweGYwMDAJLyogbWFzayBmb3IgY2F1c2Ugb2YgaW50ZXJydXB0ICovCisjZGVmaW5lIFNUQVRfQ1gJCTB4ODAwMAkvKiBDVSBmaW5pc2hlZCBjbWQgd2l0aCBpdHMgSSBiaXQgc2V0ICovCisjZGVmaW5lIFNUQVRfRlIJCTB4NDAwMAkvKiBSVSBmaW5pc2hlZCByZWNlaXZpbmcgYSBmcmFtZSAqLworI2RlZmluZSBTVEFUX0NOQQkweDIwMDAJLyogQ1UgbGVmdCBhY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgU1RBVF9STlIJMHgxMDAwCS8qIFJVIGxlZnQgcmVhZHkgc3RhdGUgKi8KKworI2RlZmluZSBDVV9TVEFUVVMJMHg3MDAJLyogQ1Ugc3RhdHVzLCAwPWlkbGUgKi8KKyNkZWZpbmUgQ1VfU1VTUEVORAkweDEwMAkvKiBDVSBpcyBzdXNwZW5kZWQgKi8KKyNkZWZpbmUgQ1VfQUNUSVZFCTB4MjAwCS8qIENVIGlzIGFjdGl2ZSAqLworCisjZGVmaW5lIFJVX1NUQVRVUwkweDcwCS8qIFJVIHN0YXR1cywgMD1pZGxlICovCisjZGVmaW5lIFJVX1NVU1BFTkQJMHgxMAkvKiBSVSBzdXNwZW5kZWQgKi8KKyNkZWZpbmUgUlVfTk9TUEFDRQkweDIwCS8qIFJVIG5vIHJlc291cmNlcyAqLworI2RlZmluZSBSVV9SRUFEWQkweDQwCS8qIFJVIGlzIHJlYWR5ICovCisKKy8qCisgKiBSZWNlaXZlIEZyYW1lIERlc2NyaXB0b3IgKFJGRCkKKyAqLworc3RydWN0IHJmZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgc3RhdHVzOwkvKiBzdGF0dXMgd29yZCAqLworICB1bnNpZ25lZCBzaG9ydCBsYXN0OwkJLyogQml0MTUsTGFzdCBGcmFtZSBvbiBMaXN0IC8gQml0MTQsc3VzcGVuZCAqLworICB1bnNpZ25lZCBzaG9ydCBuZXh0OwkJLyogbGlua29mZnNldCB0byBuZXh0IFJGRCAqLworICB1bnNpZ25lZCBzaG9ydCByYmRfb2Zmc2V0OwkvKiBwb2ludGVyb2Zmc2V0IHRvIFJCRC1idWZmZXIgKi8KKyAgdW5zaWduZWQgY2hhciAgZGVzdFs2XTsJLyogZXRoZXJuZXQtYWRkcmVzcywgZGVzdGluYXRpb24gKi8KKyAgdW5zaWduZWQgY2hhciAgc291cmNlWzZdOwkvKiBldGhlcm5ldC1hZGRyZXNzLCBzb3VyY2UgKi8KKyAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwkvKiA4MDIuMyBmcmFtZS1sZW5ndGggKi8KKyAgdW5zaWduZWQgc2hvcnQgemVyb19kdW1teTsJLyogZHVtbXkgKi8KK307CisKKyNkZWZpbmUgUkZEX0xBU1QgICAgIDB4ODAwMAkvKiBsYXN0OiBsYXN0IHJmZCBpbiB0aGUgbGlzdCAqLworI2RlZmluZSBSRkRfU1VTUCAgICAgMHg0MDAwCS8qIGxhc3Q6IHN1c3BlbmQgUlUgYWZ0ZXIgICovCisjZGVmaW5lIFJGRF9FUlJNQVNLICAweDBmZTEgICAgIC8qIHN0YXR1czogZXJyb3JtYXNrICovCisjZGVmaW5lIFJGRF9NQVRDSEFERCAweDAwMDIgICAgIC8qIHN0YXR1czogRGVzdGluYXRpb25hZGRyZXNzICFtYXRjaGVzIElBICovCisjZGVmaW5lIFJGRF9STlIgICAgICAweDAyMDAJLyogc3RhdHVzOiByZWNlaXZlciBvdXQgb2YgcmVzb3VyY2VzICovCisKKy8qCisgKiBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIChSQkQpCisgKi8KK3N0cnVjdCByYmRfc3RydWN0IAoreworICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CS8qIHN0YXR1cyB3b3JkLG51bWJlciBvZiB1c2VkIGJ5dGVzIGluIGJ1ZmYgKi8KKyAgdW5zaWduZWQgc2hvcnQgbmV4dDsJCS8qIHBvaW50ZXJvZmZzZXQgdG8gbmV4dCBSQkQgKi8KKyAgY2hhciAgICAgICAgICAqYnVmZmVyOwkvKiByZWNlaXZlIGJ1ZmZlciBhZGRyZXNzIHBvaW50ZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgc2l6ZTsJCS8qIHNpemUgb2YgdGhpcyBidWZmZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgemVyb19kdW1teTsgICAgLyogZHVtbXkgKi8KK307CisKKyNkZWZpbmUgUkJEX0xBU1QJMHg4MDAwCS8qIGxhc3QgYnVmZmVyICovCisjZGVmaW5lIFJCRF9VU0VECTB4NDAwMAkvKiB0aGlzIGJ1ZmZlciBoYXMgZGF0YSAqLworI2RlZmluZSBSQkRfTUFTSwkweDNmZmYJLyogc2l6ZS1tYXNrIGZvciBsZW5ndGggKi8KKworLyoKKyAqIFN0YXR1c3ZhbHVlcyBmb3IgQ29tbWFuZHMvUkZECisgKi8KKyNkZWZpbmUgU1RBVF9DT01QTCAgIDB4ODAwMAkvKiBzdGF0dXM6IGZyYW1lL2NvbW1hbmQgaXMgY29tcGxldGUgKi8KKyNkZWZpbmUgU1RBVF9CVVNZICAgIDB4NDAwMAkvKiBzdGF0dXM6IGZyYW1lL2NvbW1hbmQgaXMgYnVzeSAqLworI2RlZmluZSBTVEFUX09LICAgICAgMHgyMDAwCS8qIHN0YXR1czogZnJhbWUvY29tbWFuZCBpcyBvayAqLworCisvKgorICogQWN0aW9uLUNvbW1hbmRzCisgKi8KKyNkZWZpbmUgQ01EX05PUAkJMHgwMDAwCS8qIE5PUCAqLworI2RlZmluZSBDTURfSUFTRVRVUAkweDAwMDEJLyogaW5pdGlhbCBhZGRyZXNzIHNldHVwIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX0NPTkZJR1VSRQkweDAwMDIJLyogY29uZmlndXJlIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX01DU0VUVVAJMHgwMDAzCS8qIE1DIHNldHVwIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX1hNSVQJMHgwMDA0CS8qIHRyYW5zbWl0IGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX1REUgkJMHgwMDA1CS8qIHRpbWUgZG9tYWluIHJlZmxlY3RvbWV0ZXIgKFREUikgY29tbWFuZCAqLworI2RlZmluZSBDTURfRFVNUAkweDAwMDYJLyogZHVtcCBjb21tYW5kICovCisjZGVmaW5lIENNRF9ESUFHTk9TRQkweDAwMDcJLyogZGlhZ25vc2UgY29tbWFuZCAqLworCisvKgorICogQWN0aW9uIGNvbW1hbmQgYml0cworICovCisjZGVmaW5lIENNRF9MQVNUCTB4ODAwMAkvKiBpbmRpY2F0ZXMgbGFzdCBjb21tYW5kIGluIHRoZSBDQkwgKi8KKyNkZWZpbmUgQ01EX1NVU1BFTkQJMHg0MDAwCS8qIHN1c3BlbmQgQ1UgYWZ0ZXIgdGhpcyBDQiAqLworI2RlZmluZSBDTURfSU5UCQkweDIwMDAJLyogZ2VuZXJhdGUgaW50ZXJydXB0IGFmdGVyIGV4ZWN1dGlvbiAqLworCisvKgorICogTk9QIC0gY29tbWFuZAorICovCitzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgY21kX3N0YXR1czsJLyogc3RhdHVzIG9mIHRoaXMgY29tbWFuZCAqLworICB1bnNpZ25lZCBzaG9ydCBjbWRfY21kOyAgICAgICAvKiB0aGUgY29tbWFuZCBpdHNlbGYgKCtiaXRzKSAqLworICB1bnNpZ25lZCBzaG9ydCBjbWRfbGluazsgICAgICAvKiBvZmZzZXRwb2ludGVyIHRvIG5leHQgY29tbWFuZCAqLworfTsKKworLyoKKyAqIElBIFNldHVwIGNvbW1hbmQKKyAqLworc3RydWN0IGlhc2V0dXBfY21kX3N0cnVjdCAKK3sKKyAgdW5zaWduZWQgc2hvcnQgY21kX3N0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2NtZDsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2xpbms7CisgIHVuc2lnbmVkIGNoYXIgIGlhZGRyWzZdOworfTsKKworLyoKKyAqIENvbmZpZ3VyZSBjb21tYW5kIAorICovCitzdHJ1Y3QgY29uZmlndXJlX2NtZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgY21kX3N0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2NtZDsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2xpbms7CisgIHVuc2lnbmVkIGNoYXIgIGJ5dGVfY250OyAgIC8qIHNpemUgb2YgdGhlIGNvbmZpZy1jbWQgKi8KKyAgdW5zaWduZWQgY2hhciAgZmlmbzsgICAgICAgLyogZmlmby9yZWN2IG1vbml0b3IgKi8KKyAgdW5zaWduZWQgY2hhciAgc2F2X2JmOyAgICAgLyogc2F2ZSBiYWQgZnJhbWVzIChiaXQ3PTEpKi8KKyAgdW5zaWduZWQgY2hhciAgYWRyX2xlbjsgICAgLyogYWRyX2xlbigwLTIpLGFsX2xvYygzKSxwcmVhbSg0LTUpLGxvb3BiYWsoNi03KSovCisgIHVuc2lnbmVkIGNoYXIgIHByaW9yaXR5OyAgIC8qIGxpbl9wcmlvKDAtMiksZXhwX3ByaW8oNC02KSxib2ZfbWV0ZCg3KSAqLworICB1bnNpZ25lZCBjaGFyICBpZnM7ICAgICAgICAvKiBpbnRlciBmcmFtZSBzcGFjaW5nICovCisgIHVuc2lnbmVkIGNoYXIgIHRpbWVfbG93OyAgIC8qIHNsb3QgdGltZSBsb3cgKi8KKyAgdW5zaWduZWQgY2hhciAgdGltZV9oaWdoOyAgLyogc2xvdCB0aW1lIGhpZ2goMC0yKSBhbmQgbWF4LiByZXRyaWVzKDQtNykgKi8KKyAgdW5zaWduZWQgY2hhciAgcHJvbWlzYzsgICAgLyogcHJvbWlzYy1tb2RlKDApICwgZXQgYWwgKDEtNykgKi8KKyAgdW5zaWduZWQgY2hhciAgY2Fycl9jb2xsOyAgLyogY2FycmllcigwLTMpL2NvbGxpc2lvbig0LTcpIHN0dWZmICovCisgIHVuc2lnbmVkIGNoYXIgIGZyYW1fbGVuOyAgIC8qIG1pbmltYWwgZnJhbWUgbGVuICovCisgIHVuc2lnbmVkIGNoYXIgIGR1bW15OwkgICAgIC8qIGR1bW15ICovCit9OworCisvKgorICogTXVsdGljYXN0IFNldHVwIGNvbW1hbmQgCisgKi8KK3N0cnVjdCBtY3NldHVwX2NtZF9zdHJ1Y3QgCit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9jbWQ7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9saW5rOworICB1bnNpZ25lZCBzaG9ydCBtY19jbnQ7CQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIE1DLUxpc3QgKi8KKyAgdW5zaWduZWQgY2hhciAgbWNfbGlzdFswXVs2XTsgIAkvKiBwb2ludGVyIHRvIDYgYnl0ZXMgZW50cmllcyAqLworfTsKKworLyoKKyAqIHRyYW5zbWl0IGNvbW1hbmQgCisgKi8KK3N0cnVjdCB0cmFuc21pdF9jbWRfc3RydWN0IAoreworICB1bnNpZ25lZCBzaG9ydCBjbWRfc3RhdHVzOworICB1bnNpZ25lZCBzaG9ydCBjbWRfY21kOworICB1bnNpZ25lZCBzaG9ydCBjbWRfbGluazsKKyAgdW5zaWduZWQgc2hvcnQgdGJkX29mZnNldDsJLyogcG9pbnRlcm9mZnNldCB0byBUQkQgKi8KKyAgdW5zaWduZWQgY2hhciAgZGVzdFs2XTsgICAgICAgLyogZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUgZnJhbWUgKi8KKyAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwkvKiB1c2VyIGRlZmluZWQ6IDgwMi4zIGxlbmd0aCAvIEV0aGVyIHR5cGUgKi8KK307CisKKyNkZWZpbmUgVENNRF9FUlJNQVNLICAgICAweDBmYTAKKyNkZWZpbmUgVENNRF9NQVhDT0xMTUFTSyAweDAwMGYKKyNkZWZpbmUgVENNRF9NQVhDT0xMICAgICAweDAwMjAKKyNkZWZpbmUgVENNRF9IRUFSVEJFQVQgICAweDAwNDAKKyNkZWZpbmUgVENNRF9ERUZFUlJFRCAgICAweDAwODAKKyNkZWZpbmUgVENNRF9VTkRFUlJVTiAgICAweDAxMDAKKyNkZWZpbmUgVENNRF9MT1NUQ1RTICAgICAweDAyMDAKKyNkZWZpbmUgVENNRF9OT0NBUlJJRVIgICAweDA0MDAKKyNkZWZpbmUgVENNRF9MQVRFQ09MTCAgICAweDA4MDAKKworc3RydWN0IHRkcl9jbWRfc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9jbWQ7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9saW5rOworICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7Cit9OworCisjZGVmaW5lIFREUl9MTktfT0sJMHg4MDAwCS8qIE5vIGxpbmsgcHJvYmxlbSBpZGVudGlmaWVkICovCisjZGVmaW5lIFREUl9YQ1ZSX1BSQgkweDQwMDAJLyogaW5kaWNhdGVzIGEgdHJhbnNjZWl2ZXIgcHJvYmxlbSAqLworI2RlZmluZSBURFJfRVRfT1BOCTB4MjAwMAkvKiBvcGVuLCBubyBjb3JyZWN0IHRlcm1pbmF0aW9uICovCisjZGVmaW5lIFREUl9FVF9TUlQJMHgxMDAwCS8qIFREUiBkZXRlY3RlZCBhIHNob3J0IGNpcmN1aXQgKi8KKyNkZWZpbmUgVERSX1RJTUVNQVNLCTB4MDdmZgkvKiBtYXNrIGZvciB0aGUgdGltZSBmaWVsZCAqLworCisvKgorICogVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgKFRCRCkKKyAqLworc3RydWN0IHRiZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgc2l6ZTsJCS8qIHNpemUgKyBFT0YtRmxhZygxNSkgKi8KKyAgdW5zaWduZWQgc2hvcnQgbmV4dDsgICAgICAgICAgLyogcG9pbnRlcm9mZnNldCB0byBuZXh0IFRCRCAqLworICBjaGFyICAgICAgICAgICpidWZmZXI7ICAgICAgICAvKiBwb2ludGVyIHRvIGJ1ZmZlciAqLworfTsKKworI2RlZmluZSBUQkRfTEFTVCAweDgwMDAgICAgICAgICAvKiBFT0YtRmxhZywgaW5kaWNhdGVzIGxhc3QgYnVmZmVyIGluIGxpc3QgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorVmVyYmF0aW0gZnJvbSB0aGUgQ3J5bnd5ciBzdHVmZjoKKworICAgIFRoZSAzYzUyMyByZXNwb25kcyB3aXRoIGFkYXB0ZXIgY29kZSAweDYwNDIgYXQgc2xvdAorcmVnaXN0ZXJzIHh4eDAgYW5kIHh4eDEuICBUaGUgc2V0dXAgcmVnaXN0ZXIgaXMgYXQgeHh4MiBhbmQKK2NvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYml0czoKKworMDogY2FyZCBlbmFibGUKKzIsMTogY3NyIGFkZHJlc3Mgc2VsZWN0CisgICAgMDAgPSAwMzAwCisgICAgMDEgPSAxMzAwCisgICAgMTAgPSAyMzAwCisgICAgMTEgPSAzMzAwCis0LDM6IHNoYXJlZCBtZW1vcnkgYWRkcmVzcyBzZWxlY3QKKyAgICAwMCA9IDBjMDAwMAorICAgIDAxID0gMGM4MDAwCisgICAgMTAgPSAwZDAwMDAKKyAgICAxMSA9IDBkODAwMAorNTogc2V0IHRvIGRpc2FibGUgb24tYm9hcmQgdGhpbm5ldAorNyw2OiAocmVhZC1vbmx5KSBzaG93cyBzZWxlY3RlZCBpcnEKKyAgICAwMCA9IDEyCisgICAgMDEgPSA3CisgICAgMTAgPSAzCisgICAgMTEgPSA5CisKK1RoZSBpbnRlcnJ1cHQtc2VsZWN0IHJlZ2lzdGVyIGlzIGF0IHh4eDMgYW5kIHVzZXMgb25lIGJpdCBwZXIgaXJxLgorCiswOiBpbnQgMTIKKzE6IGludCA3CisyOiBpbnQgMworMzogaW50IDkKKworICAgIEFnYWluLCB0aGUgZG9jdW1lbnRhdGlvbiBzdHJlc3NlcyB0aGF0IHRoZSBzZXR1cCByZWdpc3Rlcgorc2hvdWxkIG5ldmVyIGJlIHdyaXR0ZW4uICBUaGUgaW50ZXJydXB0LXNlbGVjdCByZWdpc3RlciBtYXkgYmUKK3dyaXR0ZW4gd2l0aCB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBiaXRzIDcuNiBpbgordGhlIHNldHVwIHJlZ2lzdGVyIHRvIGluc3VyZSBjb3JyZXQgc2V0dXAuCisqLworCisvKiBPZmZzZXRzIGZyb20gdGhlIGJhc2UgSS9PIGFkZHJlc3MuICovCisjZGVmaW5lCUVMTUNfU0EJCTAJLyogZmlyc3QgNiBieXRlcyBhcmUgSUVFRSBuZXR3b3JrIGFkZHJlc3MgKi8KKyNkZWZpbmUgRUxNQ19DVFJMCTYJLyogY29udHJvbCAmIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBFTE1DX1JFVklTSU9OCTcJLyogcmV2aXNpb24gcmVnaXN0ZXIsIGZpcnN0IDQgYml0cyBvbmx5ICovCisjZGVmaW5lIEVMTUNfSU9fRVhURU5UICA4CisKKy8qIHRoZXNlIGFyZSB0aGUgYml0IHNlbGVjdHMgZm9yIHRoZSBwb3J0IHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRUxNQ19TVEFUVVNfRU5BQkxFRAkweDAxCisjZGVmaW5lIEVMTUNfU1RBVFVTX0NTUl9TRUxFQ1QJMHgwNgorI2RlZmluZSBFTE1DX1NUQVRVU19NRU1PUllfU0VMRUNUCTB4MTgKKyNkZWZpbmUgRUxNQ19TVEFUVVNfRElTQUJMRV9USElOCTB4MjAKKyNkZWZpbmUgRUxNQ19TVEFUVVNfSVJRX1NFTEVDVAkweGMwCisKKy8qIHRoaXMgaXMgdGhlIGNhcmQgaWQgdXNlZCBpbiB0aGUgZGV0ZWN0aW9uIGNvZGUuICBZb3UgbWlnaHQgcmVjb2duaXplCitpdCBmcm9tIEA2MDQyLmFkZiAqLworI2RlZmluZSBFTE1DX01DQV9JRCAweDYwNDIKKworLyoKKyAgIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBiaXRzIGZvciB0aGUgY29udHJvbCAmIHN0YXR1cyByZWdpc3RlcgorCisgICBUaGUgYmFuayBzZWxlY3QgcmVnaXN0ZXJzIGNhbiBiZSB1c2VkIGlmIG1vcmUgdGhhbiAxNksgb2YgbWVtb3J5IGlzCisgICBvbiB0aGUgY2FyZC4gIEZvciBzb21lIHN0dXBpZCByZWFzb24sIGJhbmsgMyBpcyB0aGUgb25lIGZvciB0aGUKKyAgIGJvdHRvbSAxNkssIGFuZCB0aGUgY2FyZCBkZWZhdWx0cyB0byBiYW5rIDAuICBTbyB3ZSBoYXZlIHRvIHNldCB0aGUKKyAgIGJhbmsgdG8gMyBiZWZvcmUgdGhlIGNhcmQgd2lsbCBldmVuIHRoaW5rIG9mIG9wZXJhdGluZy4gIFRvIGdldCBiYW5rCisgICAzLCBzZXQgQlMwIGFuZCBCUzEgdG8gaGlnaCAob2YgY291cnNlLi4uKQorKi8KKyNkZWZpbmUgRUxNQ19DVFJMX0JTMAkweDAxCS8qIFJXIGJhbmsgc2VsZWN0ICovCisjZGVmaW5lIEVMTUNfQ1RSTF9CUzEJMHgwMgkvKiBSVyBiYW5rIHNlbGVjdCAqLworI2RlZmluZSBFTE1DX0NUUkxfSU5URQkweDA0CS8qIFJXIGludGVycnVwdCBlbmFibGUsIGFzc2VydCBoaWdoICovCisjZGVmaW5lIEVMTUNfQ1RSTF9JTlQJMHgwOAkvKiBSIGludGVycnVwdCBhY3RpdmUsIGFzc2VydCBoaWdoICovCisvKiNkZWZpbmUgRUxNQ19DVFJMXyoJMHgxMCovCS8qIHJlc2VydmVkICovCisjZGVmaW5lIEVMTUNfQ1RSTF9MQksJMHgyMAkvKiBSVyBsb29wYmFjayBlbmFibGUsIGFzc2VydCBoaWdoICovCisjZGVmaW5lIEVMTUNfQ1RSTF9DQQkweDQwCS8qIFJXIGNoYW5uZWwgYXR0ZW50aW9uLCBhc3NlcnQgaGlnaCAqLworI2RlZmluZSBFTE1DX0NUUkxfUlNUCTB4ODAJLyogUlcgODI1ODYgcmVzZXQsIGFzc2VydCBsb3cgKi8KKworLyogc29tZSBoYW5keSBjb21wb3VuZCBiaXRzICovCisKKy8qIG5vcm1hbCBvcGVyYXRpb24gc2hvdWxkIGhhdmUgYmFuayAzIGFuZCBSU1QgaGlnaCwgaW50cyBlbmFibGVkICovCisjZGVmaW5lIEVMTUNfTk9STUFMIChFTE1DX0NUUkxfSU5URXxFTE1DX0NUUkxfUlNUfDB4MykKKworI2VuZGlmIC8qIF8zYzUyM19JTkNMVURFXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MjcuYyBiL2RyaXZlcnMvbmV0LzNjNTI3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiMzMwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0LzNjNTI3LmMKQEAgLTAsMCArMSwxNjc1IEBACisvKiAzYzUyNy5jOiAzQ29tIEV0aGVybGluay9NQzMyIGRyaXZlciBmb3IgTGludXggMi40IGFuZCAyLjYuCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk4IFJlZCBIYXQgU29mdHdhcmUgSW5jCisgKglXcml0dGVuIGJ5IEFsYW4gQ294LiAKKyAqCUZ1cnRoZXIgZGVidWdnaW5nIGJ5IENhcmwgRHJvdWdnZS4KKyAqICAgICAgSW5pdGlhbCBTTVAgc3VwcG9ydCBieSBGZWxpcGUgVyBEYW1hc2lvIDxmZWxpcGV3ZEB0ZXJyYS5jb20uYnI+CisgKiAgICAgIEhlYXZpbHkgbW9kaWZpZWQgYnkgUmljaGFyZCBQcm9jdGVyIDxybnBAcGFyYWRpc2UubmV0Lm56PgorICoKKyAqCUJhc2VkIG9uIHNrZWxldG9uLmMgd3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIgYW5kIG5lMi5jCisgKgkoZm9yIHRoZSBNQ0Egc3R1ZmYpIHdyaXR0ZW4gYnkgV2ltIER1bW9uLgorICoKKyAqCVRoYW5rcyB0byAzQ29tIGZvciBtYWtpbmcgdGhpcyBwb3NzaWJsZSBieSBwcm92aWRpbmcgbWUgd2l0aCB0aGUKKyAqCWRvY3VtZW50YXRpb24uCisgKgorICoJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICoJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKi8KKworI2RlZmluZSBEUlZfTkFNRQkJIjNjNTI3IgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjAuNy1TTVAiCisjZGVmaW5lIERSVl9SRUxEQVRFCQkiMjAwMy8wOS8yMSIKKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQorRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiIFJpY2hhcmQgUHJvY3RlciA8cm5wQHBhcmFkaXNlLm5ldC5uej5cbiI7CisKKy8qKgorICogRE9DOiBUcmFwcyBmb3IgdGhlIHVud2FyeQorICoKKyAqCVRoZSBkaWFncmFtIChGaWd1cmUgMS0xKSBhbmQgdGhlIFBPUyBzdW1tYXJ5IGRpc2FncmVlIHdpdGggdGhlCisgKgkiSW50ZXJydXB0IExldmVsIiBzZWN0aW9uIGluIHRoZSBtYW51YWwuCisgKgorICoJVGhlIG1hbnVhbCBjb250cmFkaWN0cyBpdHNlbGYgd2hlbiBkZXNjcmliaW5nIHRoZSBtaW5pbXVtIG51bWJlciAKKyAqCWJ1ZmZlcnMgaW4gdGhlICdjb25maWd1cmUgbGlzdHMnIGNvbW1hbmQuIAorICoJTXkgY2FyZCBhY2NlcHRzIGEgYnVmZmVyIGNvbmZpZyBvZiA0LzQuIAorICoKKyAqCVNldHRpbmcgdGhlIFNBViBCUCBiaXQgZG9lcyBub3Qgc2F2ZSBiYWQgcGFja2V0cywgYnV0CisgKglvbmx5IGVuYWJsZXMgUlggb24tY2FyZCBzdGF0cyBjb2xsZWN0aW9uLiAKKyAqCisgKglUaGUgZG9jdW1lbnRhdGlvbiBpbiBwbGFjZXMgc2VlbXMgdG8gbWlzcyB0aGluZ3MuIEluIGFjdHVhbCBmYWN0CisgKglJJ3ZlIGFsd2F5cyBldmVudHVhbGx5IGZvdW5kIGV2ZXJ5dGhpbmcgaXMgZG9jdW1lbnRlZCwgaXQganVzdAorICoJcmVxdWlyZXMgY2FyZWZ1bCBzdHVkeS4KKyAqCisgKiBET0M6IFRoZW9yeSBPZiBPcGVyYXRpb24KKyAqCisgKglUaGUgM2NvbSAzYzUyNyBpcyBhIDMyYml0IE1DQSBidXMgbWFzdGVyaW5nIGFkYXB0ZXIgd2l0aCBhIGxhcmdlCisgKglhbW91bnQgb2Ygb24gYm9hcmQgaW50ZWxsaWdlbmNlIHRoYXQgaG91c2VrZWVwcyBhIHNvbWV3aGF0IGR1bWJlcgorICoJSW50ZWwgTklDLiBGb3IgcGVyZm9ybWFuY2Ugd2Ugd2FudCB0byBrZWVwIHRoZSB0cmFuc21pdCBxdWV1ZSBkZWVwCisgKglhcyB0aGUgY2FyZCBjYW4gdHJhbnNtaXQgcGFja2V0cyB3aGlsZSBmZXRjaGluZyBvdGhlcnMgZnJvbSBtYWluCisgKgltZW1vcnkgYnkgYnVzIG1hc3RlciBETUEuIFRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uIGFyZSBkcml2ZW4gYnkKKyAqCWNpcmN1bGFyIGJ1ZmZlciBxdWV1ZXMuCisgKgorICoJVGhlIG1haWxib3hlcyBjYW4gYmUgdXNlZCBmb3IgY29udHJvbGxpbmcgaG93IHRoZSBjYXJkIHRyYXZlcnNlcworICoJaXRzIGJ1ZmZlciByaW5ncywgYnV0IGFyZSB1c2VkIG9ubHkgZm9yIGluaXRhbCBzZXR1cCBpbiB0aGlzCisgKglpbXBsZW1lbnRhdGlvbi4gIFRoZSBleGVjIG1haWxib3ggYWxsb3dzIGEgdmFyaWV0eSBvZiBjb21tYW5kcyB0bworICoJYmUgZXhlY3V0ZWQuIEVhY2ggY29tbWFuZCBtdXN0IGNvbXBsZXRlIGJlZm9yZSB0aGUgbmV4dCBpcworICoJZXhlY3V0ZWQuIFByaW1hcmlseSB3ZSB1c2UgdGhlIGV4ZWMgbWFpbGJveCBmb3IgY29udHJvbGxpbmcgdGhlCisgKgltdWx0aWNhc3QgbGlzdHMuICBXZSBoYXZlIHRvIGRvIGEgY2VydGFpbiBhbW91bnQgb2YgaW50ZXJlc3RpbmcKKyAqCWhvb3AganVtcGluZyBhcyB0aGUgbXVsdGljYXN0IGxpc3QgY2hhbmdlcyBjYW4gb2NjdXIgaW4gaW50ZXJydXB0CisgKglzdGF0ZSB3aGVuIHRoZSBjYXJkIGhhcyBhbiBleGVjIGNvbW1hbmQgcGVuZGluZy4gV2UgZGVmZXIgc3VjaAorICoJZXZlbnRzIHVudGlsIHRoZSBjb21tYW5kIGNvbXBsZXRpb24gaW50ZXJydXB0LgorICoKKyAqCUEgY29weSBicmVhayBzY2hlbWUgKHRha2VuIGZyb20gM2M1OXguYykgaXMgZW1wbG95ZWQgd2hlcmVieQorICoJcmVjZWl2ZWQgZnJhbWVzIGV4Y2VlZGluZyBhIGNvbmZpZ3VyYWJsZSBsZW5ndGggYXJlIHBhc3NlZAorICoJZGlyZWN0bHkgdG8gdGhlIGhpZ2hlciBuZXR3b3JraW5nIGxheWVycyB3aXRob3V0IGluY3VyaW5nIGEgY29weSwKKyAqCWluIHdoYXQgYW1vdW50cyB0byBhIHRpbWUvc3BhY2UgdHJhZGUtb2ZmLgorICoJIAorICoJVGhlIGNhcmQgYWxzbyBrZWVwcyBhIGxhcmdlIGFtb3VudCBvZiBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbgorICoJb24tYm9hcmQuIEluIGEgcGVyZmVjdCB3b3JsZCwgdGhlc2UgY291bGQgYmUgdXNlZCBzYWZlbHkgYXQgbm8KKyAqCWNvc3QuIEhvd2V2ZXIsIGxhY2tpbmcgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnRyYXJ5LCBwcm9jZXNzaW5nCisgKgl0aGVtIHdpdGhvdXQgcmFjZXMgd291bGQgaW52b2x2ZSBzbyBtdWNoIGV4dHJhIGNvbXBsZXhpdHkgYXMgdG8KKyAqCW1ha2UgaXQgdW53b3J0aHdoaWxlIHRvIGRvIHNvLiBJbiB0aGUgZW5kLCBhIGh5YnJpZCBTVy9IVworICoJaW1wbGVtZW50YXRpb24gd2FzIG1hZGUgbmVjZXNzYXJ5IC0tLSBzZWUgbWMzMl91cGRhdGVfc3RhdHMoKS4gIAorICoKKyAqIERPQzogTm90ZXMKKyAqCQorICoJSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSB0d28gb3IgbW9yZSBjYXJkcywgYnV0IGF0IHRoaXMgc3RhZ2UKKyAqCW9ubHkgYnkgbG9hZGluZyB0d28gY29waWVzIG9mIHRoZSBzYW1lIG1vZHVsZS4KKyAqCisgKglUaGUgb24tYm9hcmQgODI1ODYgTklDIGhhcyB0cm91YmxlIHJlY2VpdmluZyBtdWx0aXBsZQorICoJYmFjay10by1iYWNrIGZyYW1lcyBhbmQgc28gaXMgbGlrZWx5IHRvIGRyb3AgcGFja2V0cyBmcm9tIGZhc3QKKyAqCXNlbmRlcnMuCisqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EtbGVnYWN5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaW5jbHVkZSAiM2M1MjcuaCIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogVGhlIG5hbWUgb2YgdGhlIGNhcmQuIElzIHVzZWQgZm9yIG1lc3NhZ2VzIGFuZCBpbiB0aGUgcmVxdWVzdHMgZm9yCisgKiBpbyByZWdpb25zLCBpcnFzIGFuZCBkbWEgY2hhbm5lbHMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIqIGNhcmRuYW1lID0gRFJWX05BTUU7CisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLworI2lmbmRlZiBORVRfREVCVUcKKyNkZWZpbmUgTkVUX0RFQlVHIDIKKyNlbmRpZgorCisjdW5kZWYgREVCVUdfSVJRCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWMzMl9kZWJ1ZyA9IE5FVF9ERUJVRzsKKworLyogVGhlIG51bWJlciBvZiBsb3cgSS9PIHBvcnRzIHVzZWQgYnkgdGhlIGV0aGVyY2FyZC4gKi8KKyNkZWZpbmUgTUMzMl9JT19FWFRFTlQJOAorCisvKiBBcyBpbXBsZW1lbnRlZCwgdmFsdWVzIG11c3QgYmUgYSBwb3dlci1vZi0yIC0tIDQvOC8xNi8zMiAqLyAKKyNkZWZpbmUgVFhfUklOR19MRU4gICAgIDMyICAgICAgIC8qIFR5cGljYWxseSB0aGUgY2FyZCBzdXBwb3J0cyAzNyAgKi8KKyNkZWZpbmUgUlhfUklOR19MRU4gICAgIDggICAgICAgIC8qICAgICAiICAgICAgICIgICAgICAgICIgICAgICAgICAgKi8KKworLyogQ29weSBicmVhayBwb2ludCwgc2VlIGFib3ZlIGZvciBkZXRhaWxzLiAKKyAqIFNldHRpbmcgdG8gPiAxNTEyIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoaXMgZmVhdHVyZS4JKi8JICAgIAorI2RlZmluZSBSWF9DT1BZQlJFQUsgICAgMjAwICAgICAgLyogVmFsdWUgZnJvbSAzYzU5eC5jICovCisKKy8qIElzc3VlIHRoZSA4MjU4NiB3b3JrYXJvdW5kIGNvbW1hbmQgLSB0aGlzIGlzIGZvciAiYnVzeSBsYW5zIiwgYnV0CisgKiBiYXNpY2FsbHkgbWVhbnMgZm9yIGFsbCBsYW5zIG5vdyBkYXlzIC0gaGFzIGEgcGVyZm9ybWFuY2UgKGxhdGVuY3kpIAorICogY29zdCwgYnV0IGJlc3Qgc2V0LiAqLyAKK3N0YXRpYyBjb25zdCBpbnQgV09SS0FST1VORF84MjU4Nj0xOworCisvKiBQb2ludGVycyB0byBidWZmZXJzIGFuZCB0aGVpciBvbi1jYXJkIHJlY29yZHMgKi8KK3N0cnVjdCBtYzMyX3JpbmdfZGVzYyAKK3sKKwl2b2xhdGlsZSBzdHJ1Y3Qgc2tiX2hlYWRlciAqcDsgICAgICAgICAgICAgICAgICAgIAorCXN0cnVjdCBza19idWZmICpza2I7ICAgICAgICAgIAorfTsKKworLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkcyB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLiAqLworc3RydWN0IG1jMzJfbG9jYWwgCit7CisJaW50IHNsb3Q7CisKKwl1MzIgYmFzZTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7CisJdm9sYXRpbGUgc3RydWN0IG1jMzJfbWFpbGJveCAqcnhfYm94OworCXZvbGF0aWxlIHN0cnVjdCBtYzMyX21haWxib3ggKnR4X2JveDsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWMzMl9tYWlsYm94ICpleGVjX2JveDsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IG1jMzJfc3RhdHMgKnN0YXRzOyAgICAvKiBTdGFydCBvZiBvbi1jYXJkIHN0YXRpc3RpY3MgKi8KKyAgICAgICAgdTE2IHR4X2NoYWluOyAgICAgICAgICAgLyogVHJhbnNtaXQgbGlzdCBzdGFydCBvZmZzZXQgKi8KKwl1MTYgcnhfY2hhaW47ICAgICAgICAgICAvKiBSZWNlaXZlIGxpc3Qgc3RhcnQgb2Zmc2V0ICovCisgICAgICAgIHUxNiB0eF9sZW47ICAgICAgICAgICAgIC8qIFRyYW5zbWl0IGxpc3QgY291bnQgKi8gCisgICAgICAgIHUxNiByeF9sZW47ICAgICAgICAgICAgIC8qIFJlY2VpdmUgbGlzdCBjb3VudCAqLworCisJdTE2IHhjZWl2ZXJfZGVzaXJlZF9zdGF0ZTsgLyogSEFMVEVEIG9yIFJVTk5JTkcgKi8KKwl1MTYgY21kX25vbmJsb2NraW5nOyAgICAvKiBUaHJlYWQgaXMgdW5pbnRlcmVzdGVkIGluIGNvbW1hbmQgcmVzdWx0ICovCisJdTE2IG1jX3JlbG9hZF93YWl0OwkvKiBBIG11bHRpY2FzdCBsb2FkIHJlcXVlc3QgaXMgcGVuZGluZyAqLworCXUzMiBtY19saXN0X3ZhbGlkOwkvKiBUcnVlIHdoZW4gdGhlIG1jbGlzdCBpcyBzZXQgKi8KKworCXN0cnVjdCBtYzMyX3JpbmdfZGVzYyB0eF9yaW5nW1RYX1JJTkdfTEVOXTsJLyogSG9zdCBUcmFuc21pdCByaW5nICovCisJc3RydWN0IG1jMzJfcmluZ19kZXNjIHJ4X3JpbmdbUlhfUklOR19MRU5dOwkvKiBIb3N0IFJlY2VpdmUgcmluZyAqLworCisJYXRvbWljX3QgdHhfY291bnQ7CS8qIGJ1ZmZlcnMgbGVmdCAqLworCWF0b21pY190IHR4X3JpbmdfaGVhZDsgIC8qIGluZGV4IHRvIHR4IGVuLXF1ZXVlIGVuZCAqLworCXUxNiB0eF9yaW5nX3RhaWw7ICAgICAgIC8qIGluZGV4IHRvIHR4IGRlLXF1ZXVlIGVuZCAqLworCisJdTE2IHJ4X3JpbmdfdGFpbDsgICAgICAgLyogaW5kZXggdG8gcnggZGUtcXVldWUgZW5kICovIAorCisJc3RydWN0IHNlbWFwaG9yZSBjbWRfbXV0ZXg7ICAgIC8qIFNlcmlhbGlzZXMgaXNzdWluZyBvZiBleGVjdXRlIGNvbW1hbmRzICovCisgICAgICAgIHN0cnVjdCBjb21wbGV0aW9uIGV4ZWN1dGlvbl9jbWQ7IC8qIENhcmQgaGFzIGNvbXBsZXRlZCBhbiBleGVjdXRlIGNvbW1hbmQgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiB4Y2VpdmVyX2NtZDsgICAvKiBDYXJkIGhhcyBjb21wbGV0ZWQgYSB0eCBvciByeCBjb21tYW5kICovCit9OworCisvKiBUaGUgc3RhdGlvbiAoZXRoZXJuZXQpIGFkZHJlc3MgcHJlZml4LCB1c2VkIGZvciBhIHNhbml0eSBjaGVjay4gKi8KKyNkZWZpbmUgU0FfQUREUjAgMHgwMgorI2RlZmluZSBTQV9BRERSMSAweDYwCisjZGVmaW5lIFNBX0FERFIyIDB4QUMKKworc3RydWN0IG1jYV9hZGFwdGVyc190IHsKKwl1bnNpZ25lZCBpbnQJaWQ7CisJY2hhcgkJKm5hbWU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1jYV9hZGFwdGVyc190IG1jMzJfYWRhcHRlcnNbXSA9IHsKKwl7IDB4MDA0MSwgIjNDT00gRXRoZXJMaW5rIE1DLzMyIiB9LAorCXsgMHg4RUY1LCAiSUJNIEhpZ2ggUGVyZm9ybWFuY2UgTGFuIEFkYXB0ZXIiIH0sCisJeyAweDAwMDAsIE5VTEwgfQorfTsKKworCisvKiBNYWNyb3MgZm9yIHJpbmcgaW5kZXggbWFuaXB1bGF0aW9ucyAqLyAKK3N0YXRpYyBpbmxpbmUgdTE2IG5leHRfcngodTE2IHJ4KSB7IHJldHVybiAocngrMSkmKFJYX1JJTkdfTEVOLTEpOyB9Oworc3RhdGljIGlubGluZSB1MTYgcHJldl9yeCh1MTYgcngpIHsgcmV0dXJuIChyeC0xKSYoUlhfUklOR19MRU4tMSk7IH07CisKK3N0YXRpYyBpbmxpbmUgdTE2IG5leHRfdHgodTE2IHR4KSB7IHJldHVybiAodHgrMSkmKFRYX1JJTkdfTEVOLTEpOyB9OworCisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KK3N0YXRpYyBpbnQJbWMzMl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcik7CitzdGF0aWMgaW50ICAgICAgbWMzMl9jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBjbWQsIHZvaWQgKmRhdGEsIGludCBsZW4pOworc3RhdGljIGludAltYzMyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAltYzMyX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CW1jMzJfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgbWMzMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50CW1jMzJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0CW5ldF9kZXZpY2Vfc3RhdHMgKm1jMzJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJbWMzMl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAltYzMyX3Jlc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYzMyX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2xvdCA9IGxwLT5zbG90OworCW1jYV9tYXJrX2FzX3VudXNlZChzbG90KTsKKwltY2Ffc2V0X2FkYXB0ZXJfbmFtZShzbG90LCBOVUxMKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTUMzMl9JT19FWFRFTlQpOworfQorCisvKioKKyAqIG1jMzJfcHJvYmUgCS0JU2VhcmNoIGZvciBzdXBwb3J0ZWQgYm9hcmRzCisgKiBAdW5pdDogaW50ZXJmYWNlIG51bWJlciB0byB1c2UKKyAqCisgKiBCZWNhdXNlIE1DQSBidXMgaXMgYSByZWFsIGJ1cyBhbmQgd2UgY2FuIHNjYW4gZm9yIGNhcmRzIHdlIGNvdWxkIGRvIGEKKyAqIHNpbmdsZSBzY2FuIGZvciBhbGwgYm9hcmRzIGhlcmUuIFJpZ2h0IG5vdyB3ZSB1c2UgdGhlIHBhc3NlZCBpbiBkZXZpY2UKKyAqIHN0cnVjdHVyZSBhbmQgc2NhbiBmb3Igb25seSBvbmUgYm9hcmQuIFRoaXMgbmVlZHMgZml4aW5nIGZvciBtb2R1bGVzCisgKiBpbiBwYXJ0aWN1bGFyLgorICovCisKK3N0cnVjdCBuZXRfZGV2aWNlICpfX2luaXQgbWMzMl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBtYzMyX2xvY2FsKSk7CisJc3RhdGljIGludCBjdXJyZW50X21jYV9zbG90ID0gLTE7CisJaW50IGk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApCisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIERvIG5vdCBjaGVjayBhbnkgc3VwcGxpZWQgaS9vIGxvY2F0aW9ucy4gCisJICAgUE9TIHJlZ2lzdGVycyB1c3VhbGx5IGRvbid0IGZhaWwgOikgKi8KKworCS8qIE1DQSBjYXJkcyBoYXZlIFBPUyByZWdpc3RlcnMuICAKKwkgICBBdXRvZGV0ZWN0aW5nIE1DQSBjYXJkcyBpcyBleHRyZW1lbHkgc2ltcGxlLiAKKwkgICBKdXN0IHNlYXJjaCBmb3IgdGhlIGNhcmQuICovCisKKwlmb3IoaSA9IDA7IChtYzMyX2FkYXB0ZXJzW2ldLm5hbWUgIT0gTlVMTCk7IGkrKykgeworCQljdXJyZW50X21jYV9zbG90ID0gCisJCQltY2FfZmluZF91bnVzZWRfYWRhcHRlcihtYzMyX2FkYXB0ZXJzW2ldLmlkLCAwKTsKKworCQlpZihjdXJyZW50X21jYV9zbG90ICE9IE1DQV9OT1RGT1VORCkgeworCQkJaWYoIW1jMzJfcHJvYmUxKGRldiwgY3VycmVudF9tY2Ffc2xvdCkpCisJCQl7CisJCQkJbWNhX3NldF9hZGFwdGVyX25hbWUoY3VycmVudF9tY2Ffc2xvdCwgCisJCQkJCQltYzMyX2FkYXB0ZXJzW2ldLm5hbWUpOworCQkJCW1jYV9tYXJrX2FzX3VzZWQoY3VycmVudF9tY2Ffc2xvdCk7CisJCQkJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQkJaWYgKGVycikgeworCQkJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCQkJZGV2ID0gRVJSX1BUUihlcnIpOworCQkJCX0KKwkJCQlyZXR1cm4gZGV2OworCQkJfQorCQkJCisJCX0KKwl9CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKK30KKworLyoqCisgKiBtYzMyX3Byb2JlMQktCUNoZWNrIGEgZ2l2ZW4gc2xvdCBmb3IgYSBib2FyZCBhbmQgdGVzdCB0aGUgY2FyZAorICogQGRldjogIERldmljZSBzdHJ1Y3R1cmUgdG8gZmlsbCBpbgorICogQHNsb3Q6IFRoZSBNQ0EgYnVzIHNsb3QgYmVpbmcgdXNlZCBieSB0aGlzIGNhcmQKKyAqCisgKiBEZWNvZGUgdGhlIHNsb3QgZGF0YSBhbmQgY29uZmlndXJlIHRoZSBjYXJkIHN0cnVjdHVyZXMuIEhhdmluZyBkb25lIHRoaXMgd2UKKyAqIGNhbiByZXNldCB0aGUgY2FyZCBhbmQgY29uZmlndXJlIGl0LiBUaGUgY2FyZCBkb2VzIGEgZnVsbCBzZWxmIHRlc3QgY3ljbGUKKyAqIGluIGZpcm13YXJlIHNvIHdlIGhhdmUgdG8gd2FpdCBmb3IgaXQgdG8gcmV0dXJuIGFuZCBwb3N0IHVzIGVpdGhlciBhIAorICogZmFpbHVyZSBjYXNlIG9yIHNvbWUgYWRkcmVzc2VzIHdlIHVzZSB0byBmaW5kIHRoZSBib2FyZCBpbnRlcm5hbHMuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgbWMzMl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNsb3QpCit7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKwlpbnQgaSwgZXJyOworCXU4IFBPUzsKKwl1MzIgYmFzZTsKKwlzdHJ1Y3QgbWMzMl9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0YXRpYyB1MTYgbWNhX2lvX2Jhc2VzW109eworCQkweDcyODAsMHg3MjkwLAorCQkweDc2ODAsMHg3NjkwLAorCQkweDdBODAsMHg3QTkwLAorCQkweDdFODAsMHg3RTkwCisJfTsKKwlzdGF0aWMgdTMyIG1jYV9tZW1fYmFzZXNbXT17CisJCTB4MDBDMDAwMCwKKwkJMHgwMEM0MDAwLAorCQkweDAwQzgwMDAsCisJCTB4MDBDQzAwMCwKKwkJMHgwMEQwMDAwLAorCQkweDAwRDQwMDAsCisJCTB4MDBEODAwMCwKKwkJMHgwMERDMDAwCisJfTsKKwlzdGF0aWMgY2hhciAqZmFpbHVyZXNbXT17CisJCSJQcm9jZXNzb3IgaW5zdHJ1Y3Rpb24iLAorCQkiUHJvY2Vzc29yIGRhdGEgYnVzIiwKKwkJIlByb2Nlc3NvciBkYXRhIGJ1cyIsCisJCSJQcm9jZXNzb3IgZGF0YSBidXMiLAorCQkiQWRhcHRlciBidXMiLAorCQkiUk9NIGNoZWNrc3VtIiwKKwkJIkJhc2UgUkFNIiwKKwkJIkV4dGVuZGVkIFJBTSIsCisJCSI4MjU4NiBpbnRlcm5hbCBsb29wYmFjayIsCisJCSI4MjU4NiBpbml0aWFsaXNhdGlvbiBmYWlsdXJlIiwKKwkJIkFkYXB0ZXIgbGlzdCBjb25maWd1cmF0aW9uIGVycm9yIgorCX07CisKKwkvKiBUaW1lIHRvIHBsYXkgTUNBIGdhbWVzICovCisKKwlpZiAobWMzMl9kZWJ1ZyAgJiYgIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0RFQlVHICIlcyIsIHZlcnNpb24pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGZvdW5kIGluIHNsb3QgJWQ6IiwgZGV2LT5uYW1lLCBjYXJkbmFtZSwgc2xvdCk7CisKKwlQT1MgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDIpOworCQorCWlmKCEoUE9TJjEpKQorCXsKKwkJcHJpbnRrKCIgZGlzYWJsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogRmlsbCBpbiB0aGUgJ2RldicgZmllbGRzLiAqLworCWRldi0+YmFzZV9hZGRyID0gbWNhX2lvX2Jhc2VzWyhQT1M+PjEpJjddOworCWRldi0+bWVtX3N0YXJ0ID0gbWNhX21lbV9iYXNlc1soUE9TPj40KSY3XTsKKwkKKwlQT1MgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDQpOworCWlmKCEoUE9TJjEpKQorCXsKKwkJcHJpbnRrKCJtZW1vcnkgd2luZG93IGRpc2FibGVkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCVBPUyA9IG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgNSk7CisJCisJaT0oUE9TPj40KSYzOworCWlmKGk9PTMpCisJeworCQlwcmludGsoImludmFsaWQgbWVtb3J5IHdpbmRvdy5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJaSo9MTYzODQ7CisJaSs9MTYzODQ7CisJCisJZGV2LT5tZW1fZW5kPWRldi0+bWVtX3N0YXJ0ICsgaTsKKwkKKwlkZXYtPmlycSA9ICgoUE9TPj4yKSYzKSs5OworCQorCWlmKCFyZXF1ZXN0X3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTUMzMl9JT19FWFRFTlQsIGNhcmRuYW1lKSkKKwl7CisJCXByaW50aygiaW8gMHglM2xYLCB3aGljaCBpcyBidXN5LlxuIiwgZGV2LT5iYXNlX2FkZHIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXByaW50aygiaW8gMHglM2xYIGlycSAlZCBtZW0gMHglbFggKCVkSylcbiIsCisJCWRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwgZGV2LT5tZW1fc3RhcnQsIGkvMTAyNCk7CisJCisJCisJLyogV2Ugb3VnaHQgdG8gc2V0IHRoZSBjYWNoZSBsaW5lIHNpemUgaGVyZS4uICovCisJCisJCisJLyoKKwkgKglHbyBQUk9NIGJyb3dzaW5nCisJICovCisJIAorCXByaW50aygiJXM6IEFkZHJlc3MgIiwgZGV2LT5uYW1lKTsKKwkgCisJLyogUmV0cmlldmUgYW5kIHByaW50IHRoZSBldGhlcm5ldCBhZGRyZXNzLiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJeworCQltY2Ffd3JpdGVfcG9zKHNsb3QsIDYsIGkrMTIpOworCQltY2Ffd3JpdGVfcG9zKHNsb3QsIDcsIDApOworCQorCQlwcmludGsoIiAlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0gPSBtY2FfcmVhZF9wb3Moc2xvdCwzKSk7CisJfQorCisJbWNhX3dyaXRlX3BvcyhzbG90LCA2LCAwKTsKKwltY2Ffd3JpdGVfcG9zKHNsb3QsIDcsIDApOworCisJUE9TID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCA0KTsKKwkKKwlpZihQT1MmMikKKwkJcHJpbnRrKCIgOiBCTkMgcG9ydCBzZWxlY3RlZC5cbiIpOworCWVsc2UgCisJCXByaW50aygiIDogQVVJIHBvcnQgc2VsZWN0ZWQuXG4iKTsKKwkJCisJUE9TPWluYihkZXYtPmJhc2VfYWRkcitIT1NUX0NUUkwpOworCVBPU3w9SE9TVF9DVFJMX0FUVE58SE9TVF9DVFJMX1JFU0VUOworCVBPUyY9fkhPU1RfQ1RSTF9JTlRFOworCW91dGIoUE9TLCBkZXYtPmJhc2VfYWRkcitIT1NUX0NUUkwpOworCS8qIFJlc2V0IGFkYXB0ZXIgKi8KKwl1ZGVsYXkoMTAwKTsKKwkvKiBSZXNldCBvZmYgKi8KKwlQT1MmPX4oSE9TVF9DVFJMX0FUVE58SE9TVF9DVFJMX1JFU0VUKTsKKwlvdXRiKFBPUywgZGV2LT5iYXNlX2FkZHIrSE9TVF9DVFJMKTsKKwkKKwl1ZGVsYXkoMzAwKTsKKwkKKwkvKgorCSAqCUdyYWIgdGhlIElSUQorCSAqLworCisJZXJyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZtYzMyX2ludGVycnVwdCwgU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NLCBEUlZfTkFNRSwgZGV2KTsKKwlpZiAoZXJyKSB7CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBNQzMyX0lPX0VYVEVOVCk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwgRFJWX05BTUUsIGRldi0+aXJxKTsKKwkJZ290byBlcnJfZXhpdF9wb3J0czsKKwl9CisKKwltZW1zZXQobHAsIDAsIHNpemVvZihzdHJ1Y3QgbWMzMl9sb2NhbCkpOworCWxwLT5zbG90ID0gc2xvdDsKKworCWk9MDsKKworCWJhc2UgPSBpbmIoZGV2LT5iYXNlX2FkZHIpOworCQorCXdoaWxlKGJhc2UgPT0gMHhGRikKKwl7CisJCWkrKzsKKwkJaWYoaSA9PSAxMDAwKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gYm9vdCBhZGFwdGVyLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWVyciA9IC1FTk9ERVY7IAorCQkJZ290byBlcnJfZXhpdF9pcnE7CisJCX0KKwkJdWRlbGF5KDEwMDApOworCQlpZihpbmIoZGV2LT5iYXNlX2FkZHIrMikmKDE8PDUpKQorCQkJYmFzZSA9IGluYihkZXYtPmJhc2VfYWRkcik7CisJfQorCisJaWYoYmFzZT4wKQorCXsKKwkJaWYoYmFzZSA8IDB4MEMpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyVzLlxuIiwgZGV2LT5uYW1lLCBmYWlsdXJlc1tiYXNlLTFdLAorCQkJCWJhc2U8MHgwQT8iIHRlc3QgZmFpbHVyZSI6IiIpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmtub3duIGZhaWx1cmUgJWQuXG4iLCBkZXYtPm5hbWUsIGJhc2UpOworCQllcnIgPSAtRU5PREVWOyAKKwkJZ290byBlcnJfZXhpdF9pcnE7CisJfQorCQorCWJhc2U9MDsKKwlmb3IoaT0wO2k8NDtpKyspCisJeworCQlpbnQgbj0wOworCQorCQl3aGlsZSghKGluYihkZXYtPmJhc2VfYWRkcisyKSYoMTw8NSkpKQorCQl7CisJCQluKys7CisJCQl1ZGVsYXkoNTApOworCQkJaWYobj4xMDApCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbWFpbGJveCByZWFkIGZhaWwgKCVkKS5cbiIsIGRldi0+bmFtZSwgaSk7CisJCQkJZXJyID0gLUVOT0RFVjsKKwkJCQlnb3RvIGVycl9leGl0X2lycTsKKwkJCX0KKwkJfQorCisJCWJhc2V8PShpbmIoZGV2LT5iYXNlX2FkZHIpPDwoOCppKSk7CisJfQorCQorCWxwLT5leGVjX2JveD1pc2FfYnVzX3RvX3ZpcnQoZGV2LT5tZW1fc3RhcnQrYmFzZSk7CisJCisJYmFzZT1scC0+ZXhlY19ib3gtPmRhdGFbMV08PDE2fGxwLT5leGVjX2JveC0+ZGF0YVswXTsgIAorCQorCWxwLT5iYXNlID0gZGV2LT5tZW1fc3RhcnQrYmFzZTsKKwkKKwlscC0+cnhfYm94PWlzYV9idXNfdG9fdmlydChscC0+YmFzZSArIGxwLT5leGVjX2JveC0+ZGF0YVsyXSk7IAorCWxwLT50eF9ib3g9aXNhX2J1c190b192aXJ0KGxwLT5iYXNlICsgbHAtPmV4ZWNfYm94LT5kYXRhWzNdKTsKKwkKKwlscC0+c3RhdHMgPSBpc2FfYnVzX3RvX3ZpcnQobHAtPmJhc2UgKyBscC0+ZXhlY19ib3gtPmRhdGFbNV0pOworCisJLyoKKwkgKglEZXNjcmlwdG9yIGNoYWlucyAoY2FyZCByZWxhdGl2ZSkKKwkgKi8KKwkgCisJbHAtPnR4X2NoYWluIAkJPSBscC0+ZXhlY19ib3gtPmRhdGFbOF07ICAgLyogVHJhbnNtaXQgbGlzdCBzdGFydCBvZmZzZXQgKi8KKwlscC0+cnhfY2hhaW4gCQk9IGxwLT5leGVjX2JveC0+ZGF0YVsxMF07ICAvKiBSZWNlaXZlIGxpc3Qgc3RhcnQgb2Zmc2V0ICovCisJbHAtPnR4X2xlbiAJCT0gbHAtPmV4ZWNfYm94LT5kYXRhWzldOyAgIC8qIFRyYW5zbWl0IGxpc3QgY291bnQgKi8gCisJbHAtPnJ4X2xlbiAJCT0gbHAtPmV4ZWNfYm94LT5kYXRhWzExXTsgIC8qIFJlY2VpdmUgbGlzdCBjb3VudCAqLworCisJaW5pdF9NVVRFWF9MT0NLRUQoJmxwLT5jbWRfbXV0ZXgpOworCWluaXRfY29tcGxldGlvbigmbHAtPmV4ZWN1dGlvbl9jbWQpOworCWluaXRfY29tcGxldGlvbigmbHAtPnhjZWl2ZXJfY21kKTsKKwkKKwlwcmludGsoIiVzOiBGaXJtd2FyZSBSZXYgJWQuICVkIFJYIGJ1ZmZlcnMsICVkIFRYIGJ1ZmZlcnMuIEJhc2Ugb2YgMHglMDhYLlxuIiwKKwkJZGV2LT5uYW1lLCBscC0+ZXhlY19ib3gtPmRhdGFbMTJdLCBscC0+cnhfbGVuLCBscC0+dHhfbGVuLCBscC0+YmFzZSk7CisKKwlkZXYtPm9wZW4JCT0gbWMzMl9vcGVuOworCWRldi0+c3RvcAkJPSBtYzMyX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gbWMzMl9zZW5kX3BhY2tldDsKKwlkZXYtPmdldF9zdGF0cwkJPSBtYzMyX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IG1jMzJfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+dHhfdGltZW91dAkJPSBtYzMyX3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IEhaKjU7CS8qIEJvYXJkIGRvZXMgYWxsIHRoZSB3b3JrICovCisJZGV2LT5ldGh0b29sX29wcwk9ICZuZXRkZXZfZXRodG9vbF9vcHM7CisKKwlyZXR1cm4gMDsKKworZXJyX2V4aXRfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworZXJyX2V4aXRfcG9ydHM6CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIE1DMzJfSU9fRVhURU5UKTsKKwlyZXR1cm4gZXJyOworfQorCisKKy8qKgorICoJbWMzMl9yZWFkeV9wb2xsCQktCXdhaXQgdW50aWwgd2UgY2FuIGZlZWQgaXQgYSBjb21tYW5kCisgKglAZGV2OglUaGUgZGV2aWNlIHRvIHdhaXQgZm9yCisgKgkKKyAqCVdhaXQgdW50aWwgdGhlIGNhcmQgYmVjb21lcyByZWFkeSB0byBhY2NlcHQgYSBjb21tYW5kIHZpYSB0aGUKKyAqCWNvbW1hbmQgcmVnaXN0ZXIuIFRoaXMgdGVsbHMgdXMgbm90aGluZyBhYm91dCB0aGUgY29tcGxldGlvbgorICoJc3RhdHVzIG9mIGFueSBwZW5kaW5nIGNvbW1hbmRzIGFuZCB0YWtlcyB2ZXJ5IGxpdHRsZSB0aW1lIGF0IGFsbC4KKyAqLworIAorc3RhdGljIGlubGluZSB2b2lkIG1jMzJfcmVhZHlfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl3aGlsZSghKGluYihpb2FkZHIrSE9TVF9TVEFUVVMpJkhPU1RfU1RBVFVTX0NSUikpOworfQorCisKKy8qKgorICoJbWMzMl9jb21tYW5kX25vd2FpdAktCXNlbmQgYSBjb21tYW5kIG5vbiBibG9ja2luZworICoJQGRldjogVGhlIDNjNTI3IHRvIGlzc3VlIHRoZSBjb21tYW5kIHRvCisgKglAY21kOiBUaGUgY29tbWFuZCB3b3JkIHRvIHdyaXRlIHRvIHRoZSBtYWlsYm94CisgKglAZGF0YTogQSBkYXRhIGJsb2NrIGlmIHRoZSBjb21tYW5kIGV4cGVjdHMgb25lCisgKglAbGVuOiBMZW5ndGggb2YgdGhlIGRhdGEgYmxvY2sKKyAqCisgKglTZW5kIGEgY29tbWFuZCBmcm9tIGludGVycnVwdCBzdGF0ZS4gSWYgdGhlcmUgaXMgYSBjb21tYW5kCisgKgljdXJyZW50bHkgYmVpbmcgZXhlY3V0ZWQgdGhlbiB3ZSByZXR1cm4gYW4gZXJyb3Igb2YgLTEuIEl0CisgKglzaW1wbHkgaXNuJ3QgdmlhYmxlIHRvIHdhaXQgYXJvdW5kIGFzIGNvbW1hbmRzIG1heSBiZQorICoJc2xvdy4gVGhpcyBjYW4gdGhlb3JldGljYWxseSBiZSBzdGFydmVkIG9uIFNNUCwgYnV0IGl0J3MgaGFyZAorICoJdG8gc2VlIGEgcmVhbGlzdGljIHNpdHVhdGlvbi4gIFdlIGRvIG5vdCB3YWl0IGZvciB0aGUgY29tbWFuZAorICoJdG8gY29tcGxldGUgLS0tIHdlIHJlbHkgb24gdGhlIGludGVycnVwdCBoYW5kbGVyIHRvIHRpZHkgdXAKKyAqCWFmdGVyIHVzLgorICovCisKK3N0YXRpYyBpbnQgbWMzMl9jb21tYW5kX25vd2FpdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgY21kLCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBtYzMyX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCByZXQgPSAtMTsKKworCWlmIChkb3duX3RyeWxvY2soJmxwLT5jbWRfbXV0ZXgpID09IDApCisJeworCQlscC0+Y21kX25vbmJsb2NraW5nPTE7CisJCWxwLT5leGVjX2JveC0+bWJveD0wOworCQlscC0+ZXhlY19ib3gtPm1ib3g9Y21kOworCQltZW1jcHkoKHZvaWQgKilscC0+ZXhlY19ib3gtPmRhdGEsIGRhdGEsIGxlbik7CisJCWJhcnJpZXIoKTsJLyogdGhlIG1lbWNweSBmb3Jnb3QgdGhlIHZvbGF0aWxlIHNvIGJlIHN1cmUgKi8KKworCQkvKiBTZW5kIHRoZSBjb21tYW5kICovCisJCW1jMzJfcmVhZHlfcG9sbChkZXYpOworCQlvdXRiKDE8PDYsIGlvYWRkcitIT1NUX0NNRCk7CisKKwkJcmV0ID0gMDsKKworCQkvKiBJbnRlcnJ1cHQgaGFuZGxlciB3aWxsIHNpZ25hbCBtdXRleCBvbiBjb21wbGV0aW9uICovCisJfQorCisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqCW1jMzJfY29tbWFuZAktCXNlbmQgYSBjb21tYW5kIGFuZCBzbGVlcCB1bnRpbCBjb21wbGV0aW9uCisgKglAZGV2OiBUaGUgM2M1MjcgY2FyZCB0byBpc3N1ZSB0aGUgY29tbWFuZCB0bworICoJQGNtZDogVGhlIGNvbW1hbmQgd29yZCB0byB3cml0ZSB0byB0aGUgbWFpbGJveAorICoJQGRhdGE6IEEgZGF0YSBibG9jayBpZiB0aGUgY29tbWFuZCBleHBlY3RzIG9uZQorICoJQGxlbjogTGVuZ3RoIG9mIHRoZSBkYXRhIGJsb2NrCisgKgorICoJU2VuZHMgZXhlYyBjb21tYW5kcyBpbiBhIHVzZXIgY29udGV4dC4gVGhpcyBwZXJtaXRzIHVzIHRvIHdhaXQgYXJvdW5kCisgKglmb3IgdGhlIHJlcGxpZXMgYW5kIGFsc28gdG8gd2FpdCBmb3IgdGhlIGNvbW1hbmQgYnVmZmVyIHRvIGNvbXBsZXRlCisgKglmcm9tIGEgcHJldmlvdXMgY29tbWFuZCBiZWZvcmUgd2UgZXhlY3V0ZSBvdXIgY29tbWFuZC4gQWZ0ZXIgb3VyIAorICoJY29tbWFuZCBjb21wbGV0ZXMgd2Ugd2lsbCBhdHRlbXB0IGFueSBwZW5kaW5nIG11bHRpY2FzdCByZWxvYWQKKyAqCXdlIGJsb2NrZWQgb2ZmIGJ5IGhvZ2dpbmcgdGhlIGV4ZWMgYnVmZmVyLgorICoKKyAqCVlvdSBmZWVkIHRoZSBjYXJkIGEgY29tbWFuZCwgeW91IHdhaXQsIGl0IGludGVycnVwdHMgeW91IGdldCBhIAorICoJcmVwbHkuIEFsbCB3ZWxsIGFuZCBnb29kLiBUaGUgY29tcGxpY2F0aW9uIGFyaXNlcyBiZWNhdXNlIHlvdSB1c2UKKyAqCWNvbW1hbmRzIGZvciBmaWx0ZXIgbGlzdCBjaGFuZ2VzIHdoaWNoIGNvbWUgaW4gYXQgYmggbGV2ZWwgZnJvbSB0aGluZ3MKKyAqCWxpa2UgSVBWNiBncm91cCBzdHVmZi4KKyAqLworICAKK3N0YXRpYyBpbnQgbWMzMl9jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBjbWQsIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IG1jMzJfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHJldCA9IDA7CisJCisJZG93bigmbHAtPmNtZF9tdXRleCk7CisKKwkvKgorCSAqICAgICBNeSBUdXJuCisJICovCisKKwlscC0+Y21kX25vbmJsb2NraW5nPTA7CisJbHAtPmV4ZWNfYm94LT5tYm94PTA7CisJbHAtPmV4ZWNfYm94LT5tYm94PWNtZDsKKwltZW1jcHkoKHZvaWQgKilscC0+ZXhlY19ib3gtPmRhdGEsIGRhdGEsIGxlbik7CisJYmFycmllcigpOwkvKiB0aGUgbWVtY3B5IGZvcmdvdCB0aGUgdm9sYXRpbGUgc28gYmUgc3VyZSAqLworCisJbWMzMl9yZWFkeV9wb2xsKGRldik7CisJb3V0YigxPDw2LCBpb2FkZHIrSE9TVF9DTUQpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmbHAtPmV4ZWN1dGlvbl9jbWQpOworCQorCWlmKGxwLT5leGVjX2JveC0+bWJveCYoMTw8MTMpKQorCQlyZXQgPSAtMTsKKworCXVwKCZscC0+Y21kX211dGV4KTsKKworCS8qCisJICoJQSBtdWx0aWNhc3Qgc2V0IGdvdCBibG9ja2VkIC0gdHJ5IGl0IG5vdworICAgICAgICAgKi8KKworCWlmKGxwLT5tY19yZWxvYWRfd2FpdCkKKwl7CisJCW1jMzJfcmVzZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICoJbWMzMl9zdGFydF90cmFuc2NlaXZlcgktCXRlbGwgYm9hcmQgdG8gcmVzdGFydCB0eC9yeAorICoJQGRldjogVGhlIDNjNTI3IGNhcmQgdG8gaXNzdWUgdGhlIGNvbW1hbmQgdG8KKyAqCisgKglUaGlzIG1heSBiZSBjYWxsZWQgZnJvbSB0aGUgaW50ZXJydXB0IHN0YXRlLCB3aGVyZSBpdCBpcyB1c2VkCisgKgl0byByZXN0YXJ0IHRoZSByeCByaW5nIGlmIHRoZSBjYXJkIHJ1bnMgb3V0IG9mIHJ4IGJ1ZmZlcnMuIAorICoJCisgKiAJV2UgbXVzdCBmaXJzdCBjaGVjayBpZiBpdCdzIG9rIHRvIChyZSlzdGFydCB0aGUgdHJhbnNjZWl2ZXIuIFNlZQorICogICAgICBtYzMyX2Nsb3NlIGZvciBkZXRhaWxzLgorICovCisKK3N0YXRpYyB2b2lkIG1jMzJfc3RhcnRfdHJhbnNjZWl2ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCisJc3RydWN0IG1jMzJfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBJZ25vcmUgUlggb3ZlcmZsb3cgb24gZGV2aWNlIGNsb3N1cmUgKi8gCisJaWYgKGxwLT54Y2VpdmVyX2Rlc2lyZWRfc3RhdGU9PUhBTFRFRCkKKwkJcmV0dXJuOyAKKworCS8qIEdpdmUgdGhlIGNhcmQgdGhlIG9mZnNldCB0byB0aGUgcG9zdC1FT0wtYml0IFJYIGRlc2NyaXB0b3IgKi8KKwltYzMyX3JlYWR5X3BvbGwoZGV2KTsgCisJbHAtPnJ4X2JveC0+bWJveD0wOworCWxwLT5yeF9ib3gtPmRhdGFbMF09bHAtPnJ4X3JpbmdbcHJldl9yeChscC0+cnhfcmluZ190YWlsKV0ucC0+bmV4dDsgCisJb3V0YihIT1NUX0NNRF9TVEFSVF9SWCwgaW9hZGRyK0hPU1RfQ01EKTsgICAgICAKKworCW1jMzJfcmVhZHlfcG9sbChkZXYpOyAKKwlscC0+dHhfYm94LT5tYm94PTA7CisJb3V0YihIT1NUX0NNRF9SRVNUUlRfVFgsIGlvYWRkcitIT1NUX0NNRCk7ICAgLyogY2FyZCBpZ25vcmVzIHRoaXMgb24gUlggcmVzdGFydCAqLyAKKwkKKwkvKiBXZSBhcmUgbm90IGludGVycnVwdGVkIG9uIHN0YXJ0IGNvbXBsZXRpb24gKi8gCit9CisKKworLyoqCisgKgltYzMyX2hhbHRfdHJhbnNjZWl2ZXIJLQl0ZWxsIGJvYXJkIHRvIHN0b3AgdHgvcngKKyAqCUBkZXY6IFRoZSAzYzUyNyBjYXJkIHRvIGlzc3VlIHRoZSBjb21tYW5kIHRvCisgKgorICoJV2UgaXNzdWUgdGhlIGNvbW1hbmRzIHRvIGhhbHQgdGhlIGNhcmQncyB0cmFuc2NlaXZlci4gSW4gZmFjdCwKKyAqCWFmdGVyIHNvbWUgZXhwZXJpbWVudGluZyB3ZSBub3cgc2ltcGx5IHRlbGwgdGhlIGNhcmQgdG8KKyAqCXN1c3BlbmQuIFdoZW4gaXNzdWluZyBhYm9ydHMgb2NjYXNpb25hbGx5IG9kZCB0aGluZ3MgaGFwcGVuZWQuCisgKgorICoJV2UgdGhlbiBzbGVlcCB1bnRpbCB0aGUgY2FyZCBoYXMgbm90aWZpZWQgdXMgdGhhdCBib3RoIHJ4IGFuZAorICoJdHggaGF2ZSBiZWVuIHN1c3BlbmRlZC4KKyAqLyAKKworc3RhdGljIHZvaWQgbWMzMl9oYWx0X3RyYW5zY2VpdmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCXN0cnVjdCBtYzMyX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJbWMzMl9yZWFkeV9wb2xsKGRldik7CQorCWxwLT5yeF9ib3gtPm1ib3g9MDsKKwlvdXRiKEhPU1RfQ01EX1NVU1BORF9SWCwgaW9hZGRyK0hPU1RfQ01EKTsJCQkKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZscC0+eGNlaXZlcl9jbWQpOworCisJbWMzMl9yZWFkeV9wb2xsKGRldik7IAorCWxwLT50eF9ib3gtPm1ib3g9MDsKKwlvdXRiKEhPU1RfQ01EX1NVU1BORF9UWCwgaW9hZGRyK0hPU1RfQ01EKTsJCisJd2FpdF9mb3JfY29tcGxldGlvbigmbHAtPnhjZWl2ZXJfY21kKTsKK30KKworCisvKioKKyAqCW1jMzJfbG9hZF9yeF9yaW5nCS0JbG9hZCB0aGUgcmluZyBvZiByZWNlaXZlIGJ1ZmZlcnMKKyAqCUBkZXY6IDNjNTI3IHRvIGJ1aWxkIHRoZSByaW5nIGZvcgorICoKKyAqCVRoaXMgaW5pdGFsaXNlcyB0aGUgb24tY2FyZCBhbmQgZHJpdmVyIGRhdGFzdHJ1Y3R1cmVzIHRvCisgKgl0aGUgcG9pbnQgd2hlcmUgbWMzMl9zdGFydF90cmFuc2NlaXZlcigpIGNhbiBiZSBjYWxsZWQuCisgKgorICoJVGhlIGNhcmQgc2V0cyB1cCB0aGUgcmVjZWl2ZSByaW5nIGZvciB1cy4gV2UgYXJlIHJlcXVpcmVkIHRvIHVzZSB0aGUKKyAqCXJpbmcgaXQgcHJvdmlkZXMsIGFsdGhvdWdoIHRoZSBzaXplIG9mIHRoZSByaW5nIGlzIGNvbmZpZ3VyYWJsZS4KKyAqCisgKiAJV2UgYWxsb2NhdGUgYW4gc2tfYnVmZiBmb3IgZWFjaCByaW5nIGVudHJ5IGluIHR1cm4gYW5kCisgKiAJaW5pdGFsaXNlIGl0cyBob3VzZS1rZWVwaW5nIGluZm8uIEF0IHRoZSBzYW1lIHRpbWUsIHdlIHJlYWQKKyAqIAllYWNoICduZXh0JyBwb2ludGVyIGluIG91ciByeF9yaW5nIGFycmF5LiBUaGlzIHJlZHVjZXMgc2xvdworICogCXNoYXJlZC1tZW1vcnkgcmVhZHMgYW5kIG1ha2VzIGl0IGVhc3kgdG8gYWNjZXNzIHByZWRlY2Vzc29yCisgKiAJZGVzY3JpcHRvcnMuCisgKgorICoJV2UgdGhlbiBzZXQgdGhlIGVuZC1vZi1saXN0IGJpdCBmb3IgdGhlIGxhc3QgZW50cnkgc28gdGhhdCB0aGUKKyAqIAljYXJkIHdpbGwga25vdyB3aGVuIGl0IGhhcyBydW4gb3V0IG9mIGJ1ZmZlcnMuCisgKi8KKwkgCitzdGF0aWMgaW50IG1jMzJfbG9hZF9yeF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jMzJfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwl1MTYgcnhfYmFzZTsKKwl2b2xhdGlsZSBzdHJ1Y3Qgc2tiX2hlYWRlciAqcDsKKwkKKwlyeF9iYXNlPWxwLT5yeF9jaGFpbjsKKworCWZvcihpPTA7IGk8UlhfUklOR19MRU47IGkrKykgeworCQlscC0+cnhfcmluZ1tpXS5za2I9YWxsb2Nfc2tiKDE1MzIsIEdGUF9LRVJORUwpOworCQlpZiAobHAtPnJ4X3JpbmdbaV0uc2tiPT1OVUxMKSB7CisJCQlmb3IgKDtpPj0wO2ktLSkKKwkJCQlrZnJlZV9za2IobHAtPnJ4X3JpbmdbaV0uc2tiKTsKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlza2JfcmVzZXJ2ZShscC0+cnhfcmluZ1tpXS5za2IsIDE4KTsKKworCQlwPWlzYV9idXNfdG9fdmlydChscC0+YmFzZStyeF9iYXNlKTsKKwkJCQkKKwkJcC0+Y29udHJvbD0wOworCQlwLT5kYXRhPWlzYV92aXJ0X3RvX2J1cyhscC0+cnhfcmluZ1tpXS5za2ItPmRhdGEpOworCQlwLT5zdGF0dXM9MDsKKwkJcC0+bGVuZ3RoPTE1MzI7CisJCisJCWxwLT5yeF9yaW5nW2ldLnA9cDsgCisJCXJ4X2Jhc2U9cC0+bmV4dDsgCisJfQorCisJbHAtPnJ4X3JpbmdbaS0xXS5wLT5jb250cm9sIHw9IENPTlRST0xfRU9MOworCisJbHAtPnJ4X3JpbmdfdGFpbD0wOworCisJcmV0dXJuIDA7Cit9CQorCisKKy8qKgorICoJbWMzMl9mbHVzaF9yeF9yaW5nCS0JZnJlZSB0aGUgcmluZyBvZiByZWNlaXZlIGJ1ZmZlcnMKKyAqCUBscDogTG9jYWwgZGF0YSBvZiAzYzUyNyB0byBmbHVzaCB0aGUgcnggcmluZyBvZgorICoKKyAqCUZyZWUgdGhlIGJ1ZmZlciBmb3IgZWFjaCByaW5nIHNsb3QuIFRoaXMgbWF5IGJlIGNhbGxlZCAKKyAqICAgICAgYmVmb3JlIG1jMzJfbG9hZF9yeF9yaW5nKCksIGVnLiBvbiBlcnJvciBpbiBtYzMyX29wZW4oKS4KKyAqICAgICAgUmVxdWlyZXMgcnggc2tiIHBvaW50ZXJzIHRvIHBvaW50IHRvIGEgdmFsaWQgc2tiLCBvciBOVUxMLgorICovCisKK3N0YXRpYyB2b2lkIG1jMzJfZmx1c2hfcnhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYzMyX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7IAorCisJZm9yKGk9MDsgaSA8IFJYX1JJTkdfTEVOOyBpKyspIAorCXsgCisJCWlmIChscC0+cnhfcmluZ1tpXS5za2IpIHsKKwkJCWRldl9rZnJlZV9za2IobHAtPnJ4X3JpbmdbaV0uc2tiKTsKKwkJCWxwLT5yeF9yaW5nW2ldLnNrYiA9IE5VTEw7CisJCX0KKwkJbHAtPnJ4X3JpbmdbaV0ucD1OVUxMOyAKKwl9IAorfQorCisKKy8qKgorICoJbWMzMl9sb2FkX3R4X3JpbmcJLQlsb2FkIHRyYW5zbWl0IHJpbmcKKyAqCUBkZXY6IFRoZSAzYzUyNyBjYXJkIHRvIGlzc3VlIHRoZSBjb21tYW5kIHRvCisgKgorICoJVGhpcyBzZXRzIHVwIHRoZSBob3N0IHRyYW5zbWl0IGRhdGEtc3RydWN0dXJlcy4gCisgKgorICoJRmlyc3QsIHdlIG9idGFpbiBmcm9tIHRoZSBjYXJkIGl0J3MgY3VycmVudCBwb3N0aW9uIGluIHRoZSB0eAorICoJcmluZywgc28gdGhhdCB3ZSB3aWxsIGtub3cgd2hlcmUgdG8gYmVnaW4gdHJhbnNtaXR0aW5nCisgKglwYWNrZXRzLgorICogCQorICogCVRoZW4sIHdlIHJlYWQgdGhlICduZXh0JyBwb2ludGVycyBmcm9tIHRoZSBvbi1jYXJkIHR4IHJpbmcgaW50bworICogIAlvdXIgdHhfcmluZyBhcnJheSB0byByZWR1Y2Ugc2xvdyBzaGFyZWQtbWVtIHJlYWRzLiBGaW5hbGx5LCB3ZQorICogCWludGl0YWxpc2UgdGhlIHR4IGhvdXNlIGtlZXBpbmcgdmFyaWFibGVzLgorICogCisgKi8gCisKK3N0YXRpYyB2b2lkIG1jMzJfbG9hZF90eF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7IAorCXN0cnVjdCBtYzMyX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IHNrYl9oZWFkZXIgKnA7CisJaW50IGk7IAorCXUxNiB0eF9iYXNlOworCisJdHhfYmFzZT1scC0+dHhfYm94LT5kYXRhWzBdOyAKKworCWZvcihpPTAgOyBpPFRYX1JJTkdfTEVOIDsgaSsrKQorCXsKKwkJcD1pc2FfYnVzX3RvX3ZpcnQobHAtPmJhc2UrdHhfYmFzZSk7CisJCWxwLT50eF9yaW5nW2ldLnA9cDsgCisJCWxwLT50eF9yaW5nW2ldLnNrYj1OVUxMOworCisJCXR4X2Jhc2U9cC0+bmV4dDsKKwl9CisKKwkvKiAtMSBzbyB0aGF0IHR4X3JpbmdfaGVhZCBjYW5ub3QgImxhcCIgdHhfcmluZ190YWlsICovCisJLyogc2VlIG1jMzJfdHhfcmluZyAqLworCisJYXRvbWljX3NldCgmbHAtPnR4X2NvdW50LCBUWF9SSU5HX0xFTi0xKTsgCisJYXRvbWljX3NldCgmbHAtPnR4X3JpbmdfaGVhZCwgMCk7IAorCWxwLT50eF9yaW5nX3RhaWw9MDsgCit9IAorCisKKy8qKgorICoJbWMzMl9mbHVzaF90eF9yaW5nIAktCWZyZWUgdHJhbnNtaXQgcmluZworICoJQGxwOiBMb2NhbCBkYXRhIG9mIDNjNTI3IHRvIGZsdXNoIHRoZSB0eCByaW5nIG9mCisgKgorICogICAgICBJZiB0aGUgcmluZyBpcyBub24tZW1wdHksIHppcCBvdmVyIHRoZSBpdCwgZnJlZWluZyBhbnkKKyAqICAgICAgYWxsb2NhdGVkIHNrYl9idWZmcy4gIFRoZSB0eCByaW5nIGhvdXNlLWtlZXBpbmcgdmFyaWFibGVzIGFyZQorICogICAgICB0aGVuIHJlc2V0LiBSZXF1aXJlcyByeCBza2IgcG9pbnRlcnMgdG8gcG9pbnQgdG8gYSB2YWxpZCBza2IsCisgKiAgICAgIG9yIE5VTEwuCisgKi8KKworc3RhdGljIHZvaWQgbWMzMl9mbHVzaF90eF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jMzJfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpIDwgVFhfUklOR19MRU47IGkrKykKKwl7CisJCWlmIChscC0+dHhfcmluZ1tpXS5za2IpCisJCXsKKwkJCWRldl9rZnJlZV9za2IobHAtPnR4X3JpbmdbaV0uc2tiKTsKKwkJCWxwLT50eF9yaW5nW2ldLnNrYiA9IE5VTEw7CisJCX0KKwl9CisKKwlhdG9taWNfc2V0KCZscC0+dHhfY291bnQsIDApOyAKKwlhdG9taWNfc2V0KCZscC0+dHhfcmluZ19oZWFkLCAwKTsgCisJbHAtPnR4X3JpbmdfdGFpbD0wOworfQorIAkKKworLyoqCisgKgltYzMyX29wZW4JLQloYW5kbGUgJ3VwJyBvZiBjYXJkCisgKglAZGV2OiBkZXZpY2UgdG8gb3BlbgorICoKKyAqCVRoZSB1c2VyIGlzIHRyeWluZyB0byBicmluZyB0aGUgY2FyZCBpbnRvIHJlYWR5IHN0YXRlLiBUaGlzIHJlcXVpcmVzCisgKglhIGJyaWVmIGRpYWxvZ3VlIHdpdGggdGhlIGNhcmQuIEZpcnN0bHkgd2UgZW5hYmxlIGludGVycnVwdHMgYW5kIHRoZW4KKyAqCSdpbmRpY2F0aW9ucycuIFdpdGhvdXQgdGhlc2UgZW5hYmxlZCB0aGUgY2FyZCBkb2Vzbid0IGJvdGhlciB0ZWxsaW5nCisgKgl1cyB3aGF0IGl0IGhhcyBkb25lLiBUaGlzIGhhZCBtZSBwdXp6bGVkIGZvciBhIHdlZWsuCisgKgorICoJV2UgY29uZmlndXJlIHRoZSBudW1iZXIgb2YgY2FyZCBkZXNjcmlwdG9ycywgdGhlbiBsb2FkIHRoZSBuZXR3b3JrCisgKglhZGRyZXNzIGFuZCBtdWx0aWNhc3QgZmlsdGVycy4gVHVybiBvbiB0aGUgd29ya2Fyb3VuZCBtb2RlLiBUaGlzCisgKgl3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIDgyNTg2IC0gaXQgYXNrcyB0aGUgZmlybXdhcmUgdG8gZG8KKyAqCXNvLiBJdCBoYXMgYSBwZXJmb3JtYW5jZSAobGF0ZW5jeSkgaGl0IGJ1dCBpcyBuZWVkZWQgb24gYnVzeQorICoJW3JlYWQgbW9zdF0gbGFucy4gV2UgbG9hZCB0aGUgcmluZyB3aXRoIGJ1ZmZlcnMgdGhlbiB3ZSBraWNrIGl0CisgKglhbGwgb2ZmLgorICovCisKK3N0YXRpYyBpbnQgbWMzMl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBtYzMyX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdTggb25lPTE7CisJdTggcmVnczsKKwl1MTYgZGVzY251bWJ1ZmZzWzJdID0ge1RYX1JJTkdfTEVOLCBSWF9SSU5HX0xFTn07CisKKwkvKgorCSAqCUludGVycnVwdHMgZW5hYmxlZAorCSAqLworCisJcmVncz1pbmIoaW9hZGRyK0hPU1RfQ1RSTCk7CisJcmVnc3w9SE9TVF9DVFJMX0lOVEU7CisJb3V0YihyZWdzLCBpb2FkZHIrSE9TVF9DVFJMKTsKKwkKKwkvKgorCSAqICAgICAgQWxsb3cgb3Vyc2VsdmVzIHRvIGlzc3VlIGNvbW1hbmRzCisJICovCisKKwl1cCgmbHAtPmNtZF9tdXRleCk7CisKKworCS8qCisJICoJU2VuZCB0aGUgaW5kaWNhdGlvbnMgb24gY29tbWFuZAorCSAqLworCisJbWMzMl9jb21tYW5kKGRldiwgNCwgJm9uZSwgMik7CisKKwkvKgorCSAqCVBva2UgaXQgdG8gbWFrZSBzdXJlIGl0J3MgcmVhbGx5IGRlYWQuIAorCSAqLworCisJbWMzMl9oYWx0X3RyYW5zY2VpdmVyKGRldik7IAorCW1jMzJfZmx1c2hfdHhfcmluZyhkZXYpOyAKKworCS8qIAorCSAqCUFzayBjYXJkIHRvIHNldCB1cCBvbi1jYXJkIGRlc2NyaXB0b3JzIHRvIG91ciBzcGVjIAorCSAqLyAKKworCWlmKG1jMzJfY29tbWFuZChkZXYsIDgsIGRlc2NudW1idWZmcywgNCkpIHsgCisJCXByaW50aygiJXM6ICVzIHJlamVjdGVkIG91ciBidWZmZXIgY29uZmlndXJhdGlvbiFcbiIsCisJIAkgICAgICAgZGV2LT5uYW1lLCBjYXJkbmFtZSk7CisJCW1jMzJfY2xvc2UoZGV2KTsgCisJCXJldHVybiAtRU5PQlVGUzsgCisJfQorCQorCS8qIFJlcG9ydCBuZXcgY29uZmlndXJhdGlvbiAqLyAKKwltYzMyX2NvbW1hbmQoZGV2LCA2LCBOVUxMLCAwKTsgCisKKwlscC0+dHhfY2hhaW4gCQk9IGxwLT5leGVjX2JveC0+ZGF0YVs4XTsgICAvKiBUcmFuc21pdCBsaXN0IHN0YXJ0IG9mZnNldCAqLworCWxwLT5yeF9jaGFpbiAJCT0gbHAtPmV4ZWNfYm94LT5kYXRhWzEwXTsgIC8qIFJlY2VpdmUgbGlzdCBzdGFydCBvZmZzZXQgKi8KKwlscC0+dHhfbGVuIAkJPSBscC0+ZXhlY19ib3gtPmRhdGFbOV07ICAgLyogVHJhbnNtaXQgbGlzdCBjb3VudCAqLyAKKwlscC0+cnhfbGVuIAkJPSBscC0+ZXhlY19ib3gtPmRhdGFbMTFdOyAgLyogUmVjZWl2ZSBsaXN0IGNvdW50ICovCisgCisJLyogU2V0IE5ldHdvcmsgQWRkcmVzcyAqLworCW1jMzJfY29tbWFuZChkZXYsIDEsIGRldi0+ZGV2X2FkZHIsIDYpOworCQorCS8qIFNldCB0aGUgZmlsdGVycyAqLworCW1jMzJfc2V0X211bHRpY2FzdF9saXN0KGRldik7CisJCSAgIAorCWlmIChXT1JLQVJPVU5EXzgyNTg2KSB7IAorCQl1MTYgemVyb193b3JkPTA7CisJCW1jMzJfY29tbWFuZChkZXYsIDB4MEQsICZ6ZXJvX3dvcmQsIDIpOyAgIC8qIDgyNTg2IGJ1ZyB3b3JrYXJvdW5kIG9uICAqLworCX0KKworCW1jMzJfbG9hZF90eF9yaW5nKGRldik7CisJCisJaWYobWMzMl9sb2FkX3J4X3JpbmcoZGV2KSkgCisJeworCQltYzMyX2Nsb3NlKGRldik7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwlscC0+eGNlaXZlcl9kZXNpcmVkX3N0YXRlID0gUlVOTklORzsKKwkKKwkvKiBBbmQgZmluYWxseSwgc2V0IHRoZSBiYWxsIHJvbGxpbmcuLi4gKi8KKwltYzMyX3N0YXJ0X3RyYW5zY2VpdmVyKGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKgltYzMyX3RpbWVvdXQJLQloYW5kbGUgYSB0aW1lb3V0IGZyb20gdGhlIG5ldHdvcmsgbGF5ZXIKKyAqCUBkZXY6IDNjNTI3IHRoYXQgdGltZWQgb3V0CisgKgorICoJSGFuZGxlIGEgdGltZW91dCBvbiB0cmFuc21pdCBmcm9tIHRoZSAzYzUyNy4gVGhpcyBub3JtYWxseSBtZWFucworICoJYmFkIHRoaW5ncyBhcyB0aGUgaGFyZHdhcmUgaGFuZGxlcyBjYWJsZSB0aW1lb3V0cyBhbmQgbWVzcyBmb3IKKyAqCXVzLgorICoKKyAqLworCitzdGF0aWMgdm9pZCBtYzMyX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0P1xuIiwgZGV2LT5uYW1lKTsKKwkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvci4gKi8KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKworLyoqCisgKgltYzMyX3NlbmRfcGFja2V0CS0JcXVldWUgYSBmcmFtZSBmb3IgdHJhbnNtaXQKKyAqCUBza2I6IGJ1ZmZlciB0byB0cmFuc21pdAorICoJQGRldjogM2M1MjcgdG8gc2VuZCBpdCBvdXQgb2YKKyAqCisgKglUcmFuc21pdCBhIGJ1ZmZlci4gVGhpcyBub3JtYWxseSBtZWFucyB0aHJvd2luZyB0aGUgYnVmZmVyIG9udG8KKyAqCXRoZSB0cmFuc21pdCBxdWV1ZSBhcyB0aGUgcXVldWUgaXMgcXVpdGUgbGFyZ2UuIElmIHRoZSBxdWV1ZSBpcworICoJZnVsbCB0aGVuIHdlIHNldCB0eF9idXN5IGFuZCByZXR1cm4uIE9uY2UgdGhlIGludGVycnVwdCBoYW5kbGVyCisgKglnZXRzIG1lc3NhZ2VzIHRlbGxpbmcgaXQgdG8gcmVjbGFpbSB0cmFuc21pdCBxdWV1ZSBlbnRyaWVzLCB3ZSB3aWxsCisgKgljbGVhciB0eF9idXN5IGFuZCB0aGUga2VybmVsIHdpbGwgc3RhcnQgY2FsbGluZyB0aGlzIGFnYWluLgorICoKKyAqICAgICAgV2UgZG8gbm90IGRpc2FibGUgaW50ZXJydXB0cyBvciBhY3F1aXJlIGFueSBsb2NrczsgdGhpcyBjYW4KKyAqICAgICAgcnVuIGNvbmN1cnJlbnRseSB3aXRoIG1jMzJfdHhfcmluZygpLCBhbmQgdGhlIGZ1bmN0aW9uIGl0c2VsZgorICogICAgICBpcyBzZXJpYWxpc2VkIGF0IGEgaGlnaGVyIGxheWVyLiBIb3dldmVyLCBzaW1pbGFybHkgZm9yIHRoZQorICogICAgICBjYXJkIGl0c2VsZiwgd2UgbXVzdCBlbnN1cmUgdGhhdCB3ZSB1cGRhdGUgdHhfcmluZ19oZWFkIG9ubHkKKyAqICAgICAgYWZ0ZXIgd2UndmUgZXN0YWJsaXNoZWQgYSB2YWxpZCBwYWNrZXQgb24gdGhlIHR4IHJpbmcgKGFuZAorICogICAgICBiZWZvcmUgd2UgbGV0IHRoZSBjYXJkICJzZWUiIGl0LCB0byBwcmV2ZW50IGl0IHJhY2luZyB3aXRoIHRoZQorICogICAgICBpcnEgaGFuZGxlcikuCisgKiAKKyAqLworCitzdGF0aWMgaW50IG1jMzJfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWMzMl9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBoZWFkID0gYXRvbWljX3JlYWQoJmxwLT50eF9yaW5nX2hlYWQpOworCQorCXZvbGF0aWxlIHN0cnVjdCBza2JfaGVhZGVyICpwLCAqbnA7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZihhdG9taWNfcmVhZCgmbHAtPnR4X2NvdW50KT09MCkgeworCQlyZXR1cm4gMTsKKwl9CisKKwlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJYXRvbWljX2RlYygmbHAtPnR4X2NvdW50KTsgCisKKwkvKiBQIGlzIHRoZSBsYXN0IHNlbmRpbmcvc2VudCBidWZmZXIgYXMgYSBwb2ludGVyICovCisJcD1scC0+dHhfcmluZ1toZWFkXS5wOworCQkKKwloZWFkID0gbmV4dF90eChoZWFkKTsKKworCS8qIE5QIGlzIHRoZSBidWZmZXIgd2Ugd2lsbCBiZSBsb2FkaW5nICovCisJbnA9bHAtPnR4X3JpbmdbaGVhZF0ucDsgCisJCisJLyogV2Ugd2lsbCBuZWVkIHRoaXMgdG8gZmx1c2ggdGhlIGJ1ZmZlciBvdXQgKi8KKwlscC0+dHhfcmluZ1toZWFkXS5za2I9c2tiOworCisJbnAtPmxlbmd0aCAgICAgID0gdW5saWtlbHkoc2tiLT5sZW4gPCBFVEhfWkxFTikgPyBFVEhfWkxFTiA6IHNrYi0+bGVuOwkJCQorCW5wLT5kYXRhCT0gaXNhX3ZpcnRfdG9fYnVzKHNrYi0+ZGF0YSk7CisJbnAtPnN0YXR1cwk9IDA7CisJbnAtPmNvbnRyb2wgICAgID0gQ09OVFJPTF9FT1AgfCBDT05UUk9MX0VPTDsgICAgIAorCXdtYigpOworCQkKKwkvKgorCSAqIFRoZSBuZXcgZnJhbWUgaGFzIGJlZW4gc2V0dXA7IHdlIGNhbiBub3cKKwkgKiBsZXQgdGhlIGludGVycnVwdCBoYW5kbGVyIGFuZCBjYXJkICJzZWUiIGl0CisJICovCisKKwlhdG9taWNfc2V0KCZscC0+dHhfcmluZ19oZWFkLCBoZWFkKTsgCisJcC0+Y29udHJvbCAgICAgJj0gfkNPTlRST0xfRU9MOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisKKy8qKgorICoJbWMzMl91cGRhdGVfc3RhdHMJLQlwdWxsIG9mZiB0aGUgb24gYm9hcmQgc3RhdGlzdGljcworICoJQGRldjogM2M1MjcgdG8gc2VydmljZQorICoKKyAqIAorICoJUXVlcnkgYW5kIHJlc2V0IHRoZSBvbi1jYXJkIHN0YXRzLiBUaGVyZSdzIHRoZSBzbWFsbCBwb3NzaWJpbGl0eQorICoJb2YgYSByYWNlIGhlcmUsIHdoaWNoIHdvdWxkIHJlc3VsdCBpbiBhbiB1bmRlcmVzdGltYXRpb24gb2YKKyAqCWFjdHVhbCBlcnJvcnMuIEFzIHN1Y2gsIHdlJ2QgcHJlZmVyIHRvIGtlZXAgYWxsIG91ciBzdGF0cworICoJY29sbGVjdGlvbiBpbiBzb2Z0d2FyZS4gQXMgYSBydWxlLCB3ZSBkby4gSG93ZXZlciBpdCBjYW4ndCBiZQorICoJdXNlZCBmb3IgcnggZXJyb3JzIGFuZCBjb2xsaXNpb25zIGFzLCBieSBkZWZhdWx0LCB0aGUgY2FyZCBkaXNjYXJkcworICoJYmFkIHJ4IHBhY2tldHMuIAorICoKKyAqCVNldHRpbmcgdGhlIFNBViBCUCBpbiB0aGUgcnggZmlsdGVyIGNvbW1hbmQgc3VwcG9zZWRseQorICoJc3RvcHMgdGhpcyBiZWhhdmlvdXIuIEhvd2V2ZXIsIHRlc3Rpbmcgc2hvd3MgdGhhdCBpdCBvbmx5IHNlZW1zIHRvCisgKgllbmFibGUgdGhlIGNvbGxhdGlvbiBvZiBvbi1jYXJkIHJ4IHN0YXRpc3RpY3MgLS0tIHRoZSBkcml2ZXIKKyAqCW5ldmVyIHNlZXMgYW4gUlggZGVzY3JpcHRvciB3aXRoIGFuIGVycm9yIHN0YXR1cyBzZXQuCisgKgorICovCisKK3N0YXRpYyB2b2lkIG1jMzJfdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jMzJfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWMzMl9zdGF0cyAqc3QgPSBscC0+c3RhdHM7IAorCisJdTMyIHJ4X2Vycm9ycz0wOyAKKyAgICAgIAorCXJ4X2Vycm9ycys9bHAtPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzICAgKz1zdC0+cnhfY3JjX2Vycm9yczsgICAgICAgICAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnJ4X2NyY19lcnJvcnM9MDsKKwlyeF9lcnJvcnMrPWxwLT5uZXRfc3RhdHMucnhfZmlmb19lcnJvcnMgICs9c3QtPnJ4X292ZXJydW5fZXJyb3JzOyAgIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+cnhfb3ZlcnJ1bl9lcnJvcnM9MDsgCisJcnhfZXJyb3JzKz1scC0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPXN0LT5yeF9hbGlnbm1lbnRfZXJyb3JzOyAKKyAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5yeF9hbGlnbm1lbnRfZXJyb3JzPTA7CisJcnhfZXJyb3JzKz1scC0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrPXN0LT5yeF90b29zaG9ydF9lcnJvcnM7IAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+cnhfdG9vc2hvcnRfZXJyb3JzPTA7CisJcnhfZXJyb3JzKz1scC0+bmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMrPXN0LT5yeF9vdXRvZnJlc291cmNlX2Vycm9yczsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnJ4X291dG9mcmVzb3VyY2VfZXJyb3JzPTA7IAorICAgICAgICBscC0+bmV0X3N0YXRzLnJ4X2Vycm9ycz1yeF9lcnJvcnM7IAorCQkJCQkJICAgCisJLyogTnVtYmVyIG9mIHBhY2tldHMgd2hpY2ggc2F3IG9uZSBjb2xsaXNpb24gKi8KKwlscC0+bmV0X3N0YXRzLmNvbGxpc2lvbnMrPXN0LT5kYXRhQ1sxMF07CisJc3QtPmRhdGFDWzEwXT0wOyAKKworCS8qIE51bWJlciBvZiBwYWNrZXRzIHdoaWNoIHNhdyAyLS0xNSBjb2xsaXNpb25zICovIAorCWxwLT5uZXRfc3RhdHMuY29sbGlzaW9ucys9c3QtPmRhdGFDWzExXTsgCisJc3QtPmRhdGFDWzExXT0wOyAKK30JCisKKworLyoqCisgKgltYzMyX3J4X3JpbmcJLQlwcm9jZXNzIHRoZSByZWNlaXZlIHJpbmcKKyAqCUBkZXY6IDNjNTI3IHRoYXQgbmVlZHMgaXRzIHJlY2VpdmUgcmluZyBwcm9jZXNzaW5nCisgKgorICoKKyAqCVdlIGhhdmUgcmVjZWl2ZWQgb25lIG9yIG1vcmUgaW5kaWNhdGlvbnMgZnJvbSB0aGUgY2FyZCB0aGF0IGEKKyAqCXJlY2VpdmUgaGFzIGNvbXBsZXRlZC4gVGhlIGJ1ZmZlciByaW5nIHRodXMgY29udGFpbnMgZGlydHkKKyAqCWVudHJpZXMuIFdlIHdhbGsgdGhlIHJpbmcgYnkgaXRlcmF0aW5nIG92ZXIgdGhlIGNpcmN1bGFyIHJ4X3JpbmcKKyAqCWFycmF5LCBzdGFydGluZyBhdCB0aGUgbmV4dCBkaXJ0eSBidWZmZXIgKHdoaWNoIGhhcHBlbnMgdG8gYmUgdGhlCisgKglvbmUgd2UgZmluaXNoZWQgdXAgYXQgbGFzdCB0aW1lIGFyb3VuZCkuCisgKgorICoJRm9yIGVhY2ggY29tcGxldGVkIHBhY2tldCwgd2Ugd2lsbCBlaXRoZXIgY29weSBpdCBhbmQgcGFzcyBpdCB1cAorICogCXRoZSBzdGFjayBvciwgaWYgdGhlIHBhY2tldCBpcyBuZWFyIE1UVSBzaXplZCwgd2UgYWxsb2NhdGUKKyAqCWFub3RoZXIgYnVmZmVyIGFuZCBmbGlwIHRoZSBvbGQgb25lIHVwIHRoZSBzdGFjay4KKyAqIAorICoJV2UgbXVzdCBzdWNjZWVkIGluIGtlZXBpbmcgYSBidWZmZXIgb24gdGhlIHJpbmcuIElmIG5lY2Vzc2FyeSB3ZQorICoJd2lsbCB0b3NzIGEgcmVjZWl2ZWQgcGFja2V0IHJhdGhlciB0aGFuIGxvc2UgYSByaW5nIGVudHJ5LiBPbmNlCisgKgl0aGUgZmlyc3QgdW5jb21wbGV0ZWQgZGVzY3JpcHRvciBpcyBmb3VuZCwgd2UgbW92ZSB0aGUKKyAqCUVuZC1PZi1MaXN0IGJpdCB0byBpbmNsdWRlIHRoZSBidWZmZXJzIGp1c3QgcHJvY2Vzc2VkLgorICoKKyAqLworCitzdGF0aWMgdm9pZCBtYzMyX3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWMzMl9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBza2JfaGVhZGVyICpwOworCXUxNiByeF9yaW5nX3RhaWw7CisJdTE2IHJ4X29sZF90YWlsOworCWludCB4PTA7CisKKwlyeF9vbGRfdGFpbCA9IHJ4X3JpbmdfdGFpbCA9IGxwLT5yeF9yaW5nX3RhaWw7CisJCisJZG8KKwl7IAorCQlwPWxwLT5yeF9yaW5nW3J4X3JpbmdfdGFpbF0ucDsgCisKKwkJaWYoIShwLT5zdGF0dXMgJiAoMTw8NykpKSB7IC8qIE5vdCBDT01QTEVURUQgKi8gCisJCQlicmVhazsKKwkJfSAKKwkJaWYocC0+c3RhdHVzICYgKDE8PDYpKSAvKiBDT01QTEVURURfT0sgKi8KKwkJewkJICAgICAgICAKKworCQkJdTE2IGxlbmd0aD1wLT5sZW5ndGg7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOyAKKwkJCXN0cnVjdCBza19idWZmICpuZXdza2I7IAorCisJCQkvKiBUcnkgdG8gc2F2ZSB0aW1lIGJ5IGF2b2lkaW5nIGEgY29weSBvbiBiaWcgZnJhbWVzICovCisKKwkJCWlmICgobGVuZ3RoID4gUlhfQ09QWUJSRUFLKSAKKwkJCSAgICAmJiAoKG5ld3NrYj1kZXZfYWxsb2Nfc2tiKDE1MzIpKSAhPSBOVUxMKSkgCisJCQl7IAorCQkJCXNrYj1scC0+cnhfcmluZ1tyeF9yaW5nX3RhaWxdLnNrYjsKKwkJCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKwkJCQkKKwkJCQlza2JfcmVzZXJ2ZShuZXdza2IsMTgpOyAKKwkJCQlscC0+cnhfcmluZ1tyeF9yaW5nX3RhaWxdLnNrYj1uZXdza2I7ICAKKwkJCQlwLT5kYXRhPWlzYV92aXJ0X3RvX2J1cyhuZXdza2ItPmRhdGEpOyAgCisJCQl9IAorCQkJZWxzZSAKKwkJCXsKKwkJCQlza2I9ZGV2X2FsbG9jX3NrYihsZW5ndGgrMik7ICAKKworCQkJCWlmKHNrYj09TlVMTCkgeworCQkJCQlscC0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsgCisJCQkJCWdvdG8gZHJvcHBlZDsgCisJCQkJfQorCisJCQkJc2tiX3Jlc2VydmUoc2tiLDIpOworCQkJCW1lbWNweShza2JfcHV0KHNrYiwgbGVuZ3RoKSwKKwkJCQkgICAgICAgbHAtPnJ4X3JpbmdbcnhfcmluZ190YWlsXS5za2ItPmRhdGEsIGxlbmd0aCk7CisJCQl9CisJCQkKKwkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7IAorCQkJc2tiLT5kZXY9ZGV2OyAKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisgCQkJbHAtPm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7IAorIAkJCWxwLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gbGVuZ3RoOyAKKwkJCW5ldGlmX3J4KHNrYik7CisJCX0KKworCWRyb3BwZWQ6CisJCXAtPmxlbmd0aCA9IDE1MzI7IAorCQlwLT5zdGF0dXMgPSAwOworCQkKKwkJcnhfcmluZ190YWlsPW5leHRfcngocnhfcmluZ190YWlsKTsgCisJfQorICAgICAgICB3aGlsZSh4Kys8NDgpOyAgCisKKwkvKiBJZiB0aGVyZSB3YXMgYWN0dWFsbHkgYSBmcmFtZSB0byBiZSBwcm9jZXNzZWQsIHBsYWNlIHRoZSBFT0wgYml0ICovIAorCS8qIGF0IHRoZSBkZXNjcmlwdG9yIHByaW9yIHRvIHRoZSBvbmUgdG8gYmUgZmlsbGVkIG5leHQgKi8gCisKKwlpZiAocnhfcmluZ190YWlsICE9IHJ4X29sZF90YWlsKSAKKwl7IAorCQlscC0+cnhfcmluZ1twcmV2X3J4KHJ4X3JpbmdfdGFpbCldLnAtPmNvbnRyb2wgfD0gIENPTlRST0xfRU9MOyAKKwkJbHAtPnJ4X3JpbmdbcHJldl9yeChyeF9vbGRfdGFpbCldLnAtPmNvbnRyb2wgICY9IH5DT05UUk9MX0VPTDsgCisKKwkJbHAtPnJ4X3JpbmdfdGFpbD1yeF9yaW5nX3RhaWw7IAorCX0KK30KKworCisvKioKKyAqCW1jMzJfdHhfcmluZwktCXByb2Nlc3MgY29tcGxldGVkIHRyYW5zbWl0cworICoJQGRldjogM2M1MjcgdGhhdCBuZWVkcyBpdHMgdHJhbnNtaXQgcmluZyBwcm9jZXNzaW5nCisgKgorICoKKyAqCVRoaXMgb3BlcmF0ZXMgaW4gYSBzaW1pbGFyIGZhc2hpb24gdG8gbWMzMl9yeF9yaW5nLiBXZSBpdGVyYXRlCisgKglvdmVyIHRoZSB0cmFuc21pdCByaW5nLiBGb3IgZWFjaCBkZXNjcmlwdG9yIHdoaWNoIGhhcyBiZWVuCisgKglwcm9jZXNzZWQgYnkgdGhlIGNhcmQsIHdlIGZyZWUgaXRzIGFzc29jaWF0ZWQgYnVmZmVyIGFuZCBub3RlCisgKglhbnkgZXJyb3JzLiBUaGlzIGNvbnRpbnVlcyB1bnRpbCB0aGUgdHJhbnNtaXQgcmluZyBpcyBlbXB0aWVkCisgKglvciB3ZSByZWFjaCBhIGRlc2NyaXB0b3IgdGhhdCBoYXNuJ3QgeWV0IGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZQorICoJY2FyZC4KKyAqIAorICovCisKK3N0YXRpYyB2b2lkIG1jMzJfdHhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgbWMzMl9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBza2JfaGVhZGVyICpucDsKKworCS8qCisJICogV2UgcmVseSBvbiBoZWFkPT10YWlsIHRvIG1lYW4gJ3F1ZXVlIGVtcHR5Jy4KKwkgKiBUaGlzIGlzIHdoeSBscC0+dHhfY291bnQ9VFhfUklOR19MRU4tMTogaW4gb3JkZXIgdG8gcHJldmVudAorCSAqIHR4X3JpbmdfaGVhZCB3cmFwcGluZyB0byB0YWlsIGFuZCBjb25mdXNpbmcgYSAncXVldWUgZW1wdHknCisJICogY29uZGl0aW9uIHdpdGggJ3F1ZXVlIGZ1bGwnCisJICovCisKKwl3aGlsZSAobHAtPnR4X3JpbmdfdGFpbCAhPSBhdG9taWNfcmVhZCgmbHAtPnR4X3JpbmdfaGVhZCkpICAKKwl7ICAgCisJCXUxNiB0OyAKKworCQl0PW5leHRfdHgobHAtPnR4X3JpbmdfdGFpbCk7IAorCQlucD1scC0+dHhfcmluZ1t0XS5wOyAKKworCQlpZighKG5wLT5zdGF0dXMgJiAoMTw8NykpKSAKKwkJeworCQkJLyogTm90IENPTVBMRVRFRCAqLyAKKwkJCWJyZWFrOyAKKwkJfSAKKwkJbHAtPm5ldF9zdGF0cy50eF9wYWNrZXRzKys7CisJCWlmKCEobnAtPnN0YXR1cyAmICgxPDw2KSkpIC8qIE5vdCBDT01QTEVURURfT0sgKi8KKwkJeworCQkJbHAtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsgICAKKworCQkJc3dpdGNoKG5wLT5zdGF0dXMmMHgwRikKKwkJCXsKKwkJCQljYXNlIDE6CisJCQkJCWxwLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJYnJlYWs7IC8qIE1heCBjb2xsaXNpb25zICovIAorCQkJCWNhc2UgMjoKKwkJCQkJbHAtPm5ldF9zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIDM6CisJCQkJCWxwLT5uZXRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0OgorCQkJCQlscC0+bmV0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCQkJYnJlYWs7ICAvKiBDVFMgTG9zdCAqLyAKKwkJCQljYXNlIDU6CisJCQkJCWxwLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJYnJlYWs7IC8qIFRyYW5zbWl0IHRpbWVvdXQgKi8gCisJCQl9CisJCX0KKwkJLyogUGFja2V0cyBhcmUgc2VudCBpbiBvcmRlciAtIHRoaXMgaXMKKwkJICAgIGJhc2ljYWxseSBhIEZJRk8gcXVldWUgb2YgYnVmZmVycyBtYXRjaGluZworCQkgICAgdGhlIGNhcmQgcmluZyAqLworCQlscC0+bmV0X3N0YXRzLnR4X2J5dGVzKz1scC0+dHhfcmluZ1t0XS5za2ItPmxlbjsKKwkJZGV2X2tmcmVlX3NrYl9pcnEobHAtPnR4X3JpbmdbdF0uc2tiKTsKKwkJbHAtPnR4X3JpbmdbdF0uc2tiPU5VTEw7CisJCWF0b21pY19pbmMoJmxwLT50eF9jb3VudCk7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCQlscC0+dHhfcmluZ190YWlsPXQ7IAorCX0KKworfSAKKworCisvKioKKyAqCW1jMzJfaW50ZXJydXB0CQktCWhhbmRsZSBhbiBpbnRlcnJ1cHQgZnJvbSBhIDNjNTI3CisgKglAaXJxOiBJbnRlcnJ1cHQgbnVtYmVyCisgKglAZGV2X2lkOiAzYzUyNyB0aGF0IHJlcXVpcmVzIHNlcnZpY2luZworICoJQHJlZ3M6IFJlZ2lzdGVycyAodW51c2VkKQorICoKKyAqCisgKglBbiBpbnRlcnJ1cHQgaXMgcmFpc2VkIHdoZW5ldmVyIHRoZSAzYzUyNyB3cml0ZXMgdG8gdGhlIGNvbW1hbmQKKyAqCXJlZ2lzdGVyLiBUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBtZXNzYWdlIGl0IHdpc2hlcyB0byBzZW5kIHVzCisgKglwYWNrZWQgaW50byBhIHNpbmdsZSBieXRlIGZpZWxkLiBXZSBrZWVwIHJlYWRpbmcgc3RhdHVzIGVudHJpZXMKKyAqCXVudGlsIHdlIGhhdmUgcHJvY2Vzc2VkIGFsbCB0aGUgY29udHJvbCBpdGVtcywgYnV0IHNpbXBseSBjb3VudAorICoJdHJhbnNtaXQgYW5kIHJlY2VpdmUgcmVwb3J0cy4gV2hlbiBhbGwgcmVwb3J0cyBhcmUgaW4gd2UgZW1wdHkgdGhlCisgKgl0cmFuc2NlaXZlciByaW5ncyBhcyBhcHByb3ByaWF0ZS4gVGhpcyBzYXZlcyB0aGUgb3ZlcmhlYWQgb2YKKyAqCW11bHRpcGxlIGNvbW1hbmQgcmVxdWVzdHMuCisgKgorICoJQmVjYXVzZSBNQ0EgaXMgbGV2ZWwtdHJpZ2dlcmVkLCB3ZSBzaG91bGRuJ3QgbWlzcyBpbmRpY2F0aW9ucy4KKyAqCVRoZXJlZm9yZSwgd2UgbmVlZG4ndCBhc2sgdGhlIGNhcmQgdG8gc3VzcGVuZCBpbnRlcnJ1cHRzIHdpdGhpbgorICoJdGhpcyBoYW5kbGVyLiBUaGUgY2FyZCByZWNlaXZlcyBhbiBpbXBsaWNpdCBhY2tub3dsZWRnbWVudCBvZiB0aGUKKyAqCWN1cnJlbnQgaW50ZXJydXB0IHdoZW4gd2UgcmVhZCB0aGUgY29tbWFuZCByZWdpc3Rlci4KKyAqCisgKi8KKworc3RhdGljIGlycXJldHVybl90IG1jMzJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IG1jMzJfbG9jYWwgKmxwOworCWludCBpb2FkZHIsIHN0YXR1cywgYm9ndXNjb3VudCA9IDA7CisJaW50IHJ4X2V2ZW50ID0gMDsKKwlpbnQgdHhfZXZlbnQgPSAwOyAKKwkKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBjYXJkbmFtZSwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKyAKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBTZWUgd2hhdHMgY29va2luZyAqLworCisJd2hpbGUoKGluYihpb2FkZHIrSE9TVF9TVEFUVVMpJkhPU1RfU1RBVFVTX0NXUikgJiYgYm9ndXNjb3VudCsrPDIwMDApCisJeworCQlzdGF0dXM9aW5iKGlvYWRkcitIT1NUX0NNRCk7CisKKyNpZmRlZiBERUJVR19JUlEJCQorCQlwcmludGsoIlN0YXR1cyBUWCVkIFJYJWQgRVglZCBPViVkIEJDJWRcbiIsCisJCQkoc3RhdHVzJjcpLCAoc3RhdHVzPj4zKSY3LCAoc3RhdHVzPj42KSYxLAorCQkJKHN0YXR1cz4+NykmMSwgYm9ndXNjb3VudCk7CisjZW5kaWYKKwkJCQorCQlzd2l0Y2goc3RhdHVzJjcpCisJCXsKKwkJCWNhc2UgMDoKKwkJCQlicmVhazsKKwkJCWNhc2UgNjogLyogVFggZmFpbCAqLworCQkJY2FzZSAyOgkvKiBUWCBvayAqLworCQkJCXR4X2V2ZW50ID0gMTsgCisJCQkJYnJlYWs7CisJCQljYXNlIDM6IC8qIEhhbHQgKi8KKwkJCWNhc2UgNDogLyogQWJvcnQgKi8KKwkJCQljb21wbGV0ZSgmbHAtPnhjZWl2ZXJfY21kKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKCIlczogc3RyYW5nZSB0eCBhY2sgJWRcbiIsIGRldi0+bmFtZSwgc3RhdHVzJjcpOworCQl9CisJCXN0YXR1cz4+PTM7CisJCXN3aXRjaChzdGF0dXMmNykKKwkJeworCQkJY2FzZSAwOgorCQkJCWJyZWFrOworCQkJY2FzZSAyOgkvKiBSWCAqLworCQkJCXJ4X2V2ZW50PTE7IAorCQkJCWJyZWFrOworCQkJY2FzZSAzOiAvKiBIYWx0ICovCisJCQljYXNlIDQ6IC8qIEFib3J0ICovCisJCQkJY29tcGxldGUoJmxwLT54Y2VpdmVyX2NtZCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CisJCQkJLyogT3V0IG9mIFJYIGJ1ZmZlcnMgc3RhdCAqLworCQkJCS8qIE11c3QgcmVzdGFydCByeCAqLworCQkJCWxwLT5uZXRfc3RhdHMucnhfZHJvcHBlZCsrOworCQkJCW1jMzJfcnhfcmluZyhkZXYpOyAKKwkJCQltYzMyX3N0YXJ0X3RyYW5zY2VpdmVyKGRldik7IAorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoIiVzOiBzdHJhbmdlIHJ4IGFjayAlZFxuIiwgCisJCQkJCWRldi0+bmFtZSwgc3RhdHVzJjcpOwkJCQorCQl9CisJCXN0YXR1cz4+PTM7CisJCWlmKHN0YXR1cyYxKQorCQl7CisJCQkvKgorCQkJICogTm8gdGhyZWFkIGlzIHdhaXRpbmc6IHdlIG5lZWQgdG8gdGlkeQorCQkJICogdXAgb3Vyc2VsZi4KKwkJCSAqLworCQkJCSAgIAorCQkJaWYgKGxwLT5jbWRfbm9uYmxvY2tpbmcpIHsKKwkJCQl1cCgmbHAtPmNtZF9tdXRleCk7CisJCQkJaWYgKGxwLT5tY19yZWxvYWRfd2FpdCkgCisJCQkJCW1jMzJfcmVzZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKwkJCX0KKwkJCWVsc2UgY29tcGxldGUoJmxwLT5leGVjdXRpb25fY21kKTsKKwkJfQorCQlpZihzdGF0dXMmMikKKwkJeworCQkJLyoKKwkJCSAqCVdlIGdldCBpbnRlcnJ1cHRlZCBvbmNlIHBlcgorCQkJICoJY291bnRlciB0aGF0IGlzIGFib3V0IHRvIG92ZXJmbG93LiAKKwkJCSAqLworCisJCQltYzMyX3VwZGF0ZV9zdGF0cyhkZXYpOwkJCQorCQl9CisJfQorCisKKwkvKgorCSAqCVByb2Nlc3MgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHJpbmdzIAorICAgICAgICAgKi8KKworCWlmKHR4X2V2ZW50KSAKKwkJbWMzMl90eF9yaW5nKGRldik7CisJIAorCWlmKHJ4X2V2ZW50KSAKKwkJbWMzMl9yeF9yaW5nKGRldik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyoqCisgKgltYzMyX2Nsb3NlCS0JdXNlciBjb25maWd1cmluZyB0aGUgM2M1MjcgZG93bgorICoJQGRldjogM2M1MjcgY2FyZCB0byBzaHV0IGRvd24KKyAqCisgKglUaGUgM2M1MjcgaXMgYSBidXMgbWFzdGVyaW5nIGRldmljZS4gV2UgbXVzdCBiZSBjYXJlZnVsIGhvdyB3ZQorICoJc2h1dCBpdCBkb3duLiBJdCBtYXkgYWxzbyBiZSBydW5uaW5nIHNoYXJlZCBpbnRlcnJ1cHQgc28gd2UgaGF2ZQorICoJdG8gYmUgc3VyZSB0byBzaWxlbmNlIGl0IHByb3Blcmx5CisgKgorICoJV2UgaW5kaWNhdGUgdGhhdCB0aGUgY2FyZCBpcyBjbG9zaW5nIHRvIHRoZSByZXN0IG9mIHRoZQorICoJZHJpdmVyLiAgT3RoZXJ3aXNlLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBjYXJkIG1heSBydW4gb3V0CisgKglvZiByZWNlaXZlIGJ1ZmZlcnMgYW5kIHJlc3RhcnQgdGhlIHRyYW5zY2VpdmVyIHdoaWxlIHdlJ3JlCisgKgl0cnlpbmcgdG8gY2xvc2UgaXQuCisgKiAKKyAqCVdlIGFib3J0IGFueSByZWNlaXZlIGFuZCB0cmFuc21pdHMgZ29pbmcgb24gYW5kIHRoZW4gd2FpdCB1bnRpbAorICoJYW55IHBlbmRpbmcgZXhlYyBjb21tYW5kcyBoYXZlIGNvbXBsZXRlZCBpbiBvdGhlciBjb2RlIHRocmVhZHMuCisgKglJbiB0aGVvcnkgd2UgY2FuJ3QgZ2V0IGhlcmUgd2hpbGUgdGhhdCBpcyB0cnVlLCBpbiBwcmFjdGljZSBJIGFtCisgKglwYXJhbm9pZAorICoKKyAqCVdlIHR1cm4gb2ZmIHRoZSBpbnRlcnJ1cHQgZW5hYmxlIGZvciB0aGUgYm9hcmQgdG8gYmUgc3VyZSBpdCBjYW4ndAorICoJaW50ZWZlcmUgd2l0aCBvdGhlciBkZXZpY2VzLgorICovCisKK3N0YXRpYyBpbnQgbWMzMl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYzMyX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJdTggcmVnczsKKwl1MTYgb25lPTE7CisJCisJbHAtPnhjZWl2ZXJfZGVzaXJlZF9zdGF0ZSA9IEhBTFRFRDsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKgorCSAqCVNlbmQgdGhlIGluZGljYXRpb25zIG9uIGNvbW1hbmQgKGhhbmR5IGRlYnVnIGNoZWNrKQorCSAqLworCisJbWMzMl9jb21tYW5kKGRldiwgNCwgJm9uZSwgMik7CisKKwkvKiBTaHV0IGRvd24gdGhlIHRyYW5zY2VpdmVyICovCisKKwltYzMyX2hhbHRfdHJhbnNjZWl2ZXIoZGV2KTsgCisJCisJLyogRW5zdXJlIHdlIGlzc3VlIG5vIG1vcmUgY29tbWFuZHMgYmV5b25kIHRoaXMgcG9pbnQgKi8KKworCWRvd24oJmxwLT5jbWRfbXV0ZXgpOworCQorCS8qIE9rIHRoZSBjYXJkIGlzIG5vdyBzdG9wcGluZyAqLwkKKwkKKwlyZWdzPWluYihpb2FkZHIrSE9TVF9DVFJMKTsKKwlyZWdzJj1+SE9TVF9DVFJMX0lOVEU7CisJb3V0YihyZWdzLCBpb2FkZHIrSE9TVF9DVFJMKTsKKworCW1jMzJfZmx1c2hfcnhfcmluZyhkZXYpOworCW1jMzJfZmx1c2hfdHhfcmluZyhkZXYpOworCQkKKwltYzMyX3VwZGF0ZV9zdGF0cyhkZXYpOyAKKworCXJldHVybiAwOworfQorCisKKy8qKgorICoJbWMzMl9nZXRfc3RhdHMJCS0JaGFuZCBiYWNrIHN0YXRzIHRvIG5ldHdvcmsgbGF5ZXIKKyAqCUBkZXY6IFRoZSAzYzUyNyBjYXJkIHRvIGhhbmRsZQorICoKKyAqCVdlJ3ZlIGNvbGxlY3RlZCBhbGwgdGhlIHN0YXRzIHdlIGNhbiBpbiBzb2Z0d2FyZSBhbHJlYWR5LiBOb3cKKyAqCWl0J3MgdGltZSB0byB1cGRhdGUgdGhvc2Uga2VwdCBvbi1jYXJkIGFuZCByZXR1cm4gdGhlIGxvdC4gCisgKiAKKyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm1jMzJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jMzJfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwltYzMyX3VwZGF0ZV9zdGF0cyhkZXYpOyAKKwlyZXR1cm4gJmxwLT5uZXRfc3RhdHM7Cit9CisKKworLyoqCisgKglkb19tYzMyX3NldF9tdWx0aWNhc3RfbGlzdAktCWF0dGVtcHQgdG8gdXBkYXRlIG11bHRpY2FzdHMKKyAqCUBkZXY6IDNjNTI3IGRldmljZSB0byBsb2FkIHRoZSBsaXN0IG9uCisgKglAcmV0cnk6IGluZGljYXRlcyB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgY2FsbC4gCisgKgorICoKKyAqIAlBY3R1YWxseSBzZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4gVGhlCisgKglsb2NraW5nIGlzc3VlcyBhcmUgaGFuZGxlZCBieSB0aGlzIHJvdXRpbmUuIFdlIGhhdmUgdG8gdHJhY2sKKyAqCXN0YXRlIGFzIGl0IG1heSB0YWtlIG11bHRpcGxlIGNhbGxzIHRvIGdldCB0aGUgY29tbWFuZCBzZXF1ZW5jZQorICoJY29tcGxldGVkLiBXZSBqdXN0IGtlZXAgdHJ5aW5nIHRvIHNjaGVkdWxlIHRoZSBsb2FkcyB1bnRpbCB3ZQorICoJbWFuYWdlIHRvIHByb2Nlc3MgdGhlbSBhbGwuCisgKiAKKyAqCW51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgKiAKKyAqCW51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICogCisgKgludW1fYWRkcnMgPiAwCU11bHRpY2FzdCBtb2RlLCByZWNlaXZlIG5vcm1hbCBhbmQgTUMgcGFja2V0cywgCisgKgkJCWFuZCBkbyBiZXN0LWVmZm9ydCBmaWx0ZXJpbmcuIAorICoKKyAqCVNlZSBtYzMyX3VwZGF0ZV9zdGF0cygpIHJlZ2FyZHMgc2V0dGluZyB0aGUgU0FWIEJQIGJpdC4gCisgKgorICovCisKK3N0YXRpYyB2b2lkIGRvX21jMzJfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZXRyeSkKK3sKKwlzdHJ1Y3QgbWMzMl9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiBmaWx0ID0gKDE8PDIpOyAvKiBTYXZlIEJhZCBQYWNrZXRzLCBmb3Igc3RhdHMgcHVycG9zZXMgKi8gCisKKwlpZiAoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykKKwkJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJZmlsdCB8PSAxOworCWVsc2UgaWYoKGRldi0+ZmxhZ3MmSUZGX0FMTE1VTFRJKSB8fCBkZXYtPm1jX2NvdW50ID4gMTApCisJeworCQlkZXYtPmZsYWdzfD1JRkZfUFJPTUlTQzsKKwkJZmlsdCB8PSAxOworCX0KKwllbHNlIGlmKGRldi0+bWNfY291bnQpCisJeworCQl1bnNpZ25lZCBjaGFyIGJsb2NrWzYyXTsKKwkJdW5zaWduZWQgY2hhciAqYnA7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1jPWRldi0+bWNfbGlzdDsKKwkJCisJCWludCBpOworCSAgICAgICAKKwkJaWYocmV0cnk9PTApCisJCQlscC0+bWNfbGlzdF92YWxpZCA9IDA7CisJCWlmKCFscC0+bWNfbGlzdF92YWxpZCkKKwkJeworCQkJYmxvY2tbMV09MDsKKwkJCWJsb2NrWzBdPWRldi0+bWNfY291bnQ7CisJCQlicD1ibG9jaysyOworCQkKKwkJCWZvcihpPTA7aTxkZXYtPm1jX2NvdW50O2krKykKKwkJCXsKKwkJCQltZW1jcHkoYnAsIGRtYy0+ZG1pX2FkZHIsIDYpOworCQkJCWJwKz02OworCQkJCWRtYz1kbWMtPm5leHQ7CisJCQl9CisJCQlpZihtYzMyX2NvbW1hbmRfbm93YWl0KGRldiwgMiwgYmxvY2ssIDIrNipkZXYtPm1jX2NvdW50KT09LTEpCisJCQl7CisJCQkJbHAtPm1jX3JlbG9hZF93YWl0ID0gMTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlscC0+bWNfbGlzdF92YWxpZD0xOworCQl9CisJfQorCQorCWlmKG1jMzJfY29tbWFuZF9ub3dhaXQoZGV2LCAwLCAmZmlsdCwgMik9PS0xKSAKKwl7CisJCWxwLT5tY19yZWxvYWRfd2FpdCA9IDE7CisJfSAKKwllbHNlIHsgCisJCWxwLT5tY19yZWxvYWRfd2FpdCA9IDA7CisJfQorfQorCisKKy8qKgorICoJbWMzMl9zZXRfbXVsdGljYXN0X2xpc3QJLQlxdWV1ZSBtdWx0aWNhc3QgbGlzdCB1cGRhdGUKKyAqCUBkZXY6IFRoZSAzYzUyNyB0byB1c2UKKyAqCisgKglDb21tZW5jZSBsb2FkaW5nIHRoZSBtdWx0aWNhc3QgbGlzdC4gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUga2VybmVsCisgKgljaGFuZ2VzIHRoZSBsaXN0cy4gSXQgd2lsbCBvdmVycmlkZSBhbnkgcGVuZGluZyBsaXN0IHdlIGFyZSB0cnlpbmcgdG8KKyAqCWxvYWQuCisgKi8KKworc3RhdGljIHZvaWQgbWMzMl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkb19tYzMyX3NldF9tdWx0aWNhc3RfbGlzdChkZXYsMCk7Cit9CisKKworLyoqCisgKgltYzMyX3Jlc2V0X211bHRpY2FzdF9saXN0CS0JcmVzZXQgbXVsdGljYXN0IGxpc3QKKyAqCUBkZXY6IFRoZSAzYzUyNyB0byB1c2UKKyAqCisgKglBdHRlbXB0IHRoZSBuZXh0IHN0ZXAgaW4gbG9hZGluZyB0aGUgbXVsdGljYXN0IGxpc3RzLiBJZiB0aGlzIGF0dGVtcHQKKyAqCWZhaWxzIHRvIGNvbXBsZXRlIHRoZW4gaXQgd2lsbCBiZSBzY2hlZHVsZWQgYW5kIHRoaXMgZnVuY3Rpb24gY2FsbGVkCisgKglhZ2FpbiBsYXRlciBmcm9tIGVsc2V3aGVyZS4KKyAqLworCitzdGF0aWMgdm9pZCBtYzMyX3Jlc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZG9fbWMzMl9zZXRfbXVsdGljYXN0X2xpc3QoZGV2LDEpOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJNQ0EgMHglbHgiLCBkZXYtPmJhc2VfYWRkcik7Cit9CisKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBtYzMyX2RlYnVnOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwltYzMyX2RlYnVnID0gbGV2ZWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisJLmdldF9tc2dsZXZlbAkJPSBuZXRkZXZfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X3NldF9tc2dsZXZlbCwKK307CisKKyNpZmRlZiBNT0RVTEUKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICp0aGlzX2RldmljZTsKKworLyoqCisgKglpbml0X21vZHVsZQkJLQllbnRyeSBwb2ludAorICoKKyAqCVByb2JlIGFuZCBsb2NhdGUgYSAzYzUyNyBjYXJkLiBUaGlzIHJlYWxseSBzaG91bGQgcHJvYmUgYW5kIGxvY2F0ZQorICoJYWxsIHRoZSAzYzUyNyBjYXJkcyBpbiB0aGUgbWFjaGluZSBub3QganVzdCBvbmUgb2YgdGhlbS4gWWVzIHlvdSBjYW4KKyAqCWluc21vZCBtdWx0aXBsZSBtb2R1bGVzIGZvciBub3cgYnV0IGl0J3MgYSBoYWNrLgorICovCisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCXRoaXNfZGV2aWNlID0gbWMzMl9wcm9iZSgtMSk7CisJaWYgKElTX0VSUih0aGlzX2RldmljZSkpCisJCXJldHVybiBQVFJfRVJSKHRoaXNfZGV2aWNlKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgljbGVhbnVwX21vZHVsZQktCWZyZWUgcmVzb3VyY2VzIGZvciBhbiB1bmxvYWQKKyAqCisgKglVbmxvYWRpbmcgdGltZS4gV2UgcmVsZWFzZSB0aGUgTUNBIGJ1cyByZXNvdXJjZXMgYW5kIHRoZSBpbnRlcnJ1cHQKKyAqCWF0IHdoaWNoIHBvaW50IGV2ZXJ5dGhpbmcgaXMgcmVhZHkgdG8gdW5sb2FkLiBUaGUgY2FyZCBtdXN0IGJlIHN0b3BwZWQKKyAqCWF0IHRoaXMgcG9pbnQgb3Igd2Ugd291bGQgbm90IGhhdmUgYmVlbiBjYWxsZWQuIFdoZW4gd2UgdW5sb2FkIHdlCisgKglsZWF2ZSB0aGUgY2FyZCBzdG9wcGVkIGJ1dCBub3QgdG90YWxseSBzaHV0IGRvd24uIFdoZW4gdGhlIGNhcmQgaXMKKyAqCWluaXRpYWxpemVkIGl0IG11c3QgYmUgcmVib290ZWQgb3IgdGhlIHJpbmdzIHJlbG9hZGVkIGJlZm9yZSBhbnkKKyAqCXRyYW5zbWl0IG9wZXJhdGlvbnMgYXJlIGFsbG93ZWQgdG8gc3RhcnQgc2NyaWJibGluZyBpbnRvIG1lbW9yeS4KKyAqLworCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYodGhpc19kZXZpY2UpOworCWNsZWFudXBfY2FyZCh0aGlzX2RldmljZSk7CisJZnJlZV9uZXRkZXYodGhpc19kZXZpY2UpOworfQorCisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUyNy5oIGIvZHJpdmVycy9uZXQvM2M1MjcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTBmMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvM2M1MjcuaApAQCAtMCwwICsxLDgxIEBACisvKgorICoJM0NPTSAiRXRoZXJMaW5rIE1DLzMyIiBEZXNjcmlwdGlvbnMKKyAqLworCisvKgorICoJUmVnaXN0ZXJzCisgKi8KKyAgCisjZGVmaW5lIEhPU1RfQ01ECQkwCisjZGVmaW5lICAgICAgICAgSE9TVF9DTURfU1RBUlRfUlggICAoMTw8MykKKyNkZWZpbmUgICAgICAgICBIT1NUX0NNRF9TVVNQTkRfUlggICgzPDwzKQorI2RlZmluZSAgICAgICAgIEhPU1RfQ01EX1JFU1RSVF9SWCAgKDU8PDMpCisKKyNkZWZpbmUgICAgICAgICBIT1NUX0NNRF9TVVNQTkRfVFggIDMKKyNkZWZpbmUgICAgICAgICBIT1NUX0NNRF9SRVNUUlRfVFggIDUKKworCisjZGVmaW5lIEhPU1RfU1RBVFVTCQkyCisjZGVmaW5lCQlIT1NUX1NUQVRVU19DUlIJKDE8PDYpCisjZGVmaW5lCQlIT1NUX1NUQVRVU19DV1IJKDE8PDUpCisKKworI2RlZmluZSBIT1NUX0NUUkwJCTYKKyNkZWZpbmUJCUhPU1RfQ1RSTF9BVFROCSgxPDw3KQorI2RlZmluZSAJSE9TVF9DVFJMX1JFU0VUCSgxPDw2KQorI2RlZmluZSAJSE9TVF9DVFJMX0lOVEUJKDE8PDIpCisKKyNkZWZpbmUgSE9TVF9SQU1QQUdFCQk4CisKKyNkZWZpbmUgSEFMVEVEIDAKKyNkZWZpbmUgUlVOTklORyAxCisKK3N0cnVjdCBtYzMyX21haWxib3gKK3sKKwl1MTYJbWJveCBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CisJdTE2CWRhdGFbMV0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworfTsKKworc3RydWN0IHNrYl9oZWFkZXIKK3sKKwl1OAlzdGF0dXMgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworCXU4CWNvbnRyb2wgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworCXUxNgluZXh0IF9fYXR0cmlidXRlKChwYWNrZWQpKTsJLyogRG8gbm90IGNoYW5nZSEgKi8KKwl1MTYJbGVuZ3RoIF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKwl1MzIJZGF0YSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7Cit9OworCitzdHJ1Y3QgbWMzMl9zdGF0cworeworCS8qIFJYIEVycm9ycyAqLworCXUzMiAgICAgcnhfY3JjX2Vycm9ycyAgICAgICBfX2F0dHJpYnV0ZSgocGFja2VkKSk7IAkKKwl1MzIgICAgIHJ4X2FsaWdubWVudF9lcnJvcnMgIF9fYXR0cmlidXRlKChwYWNrZWQpKTsgCQorCXUzMiAgICAgcnhfb3ZlcnJ1bl9lcnJvcnMgICAgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworCXUzMiAgICAgcnhfdG9vc2hvcnRfZXJyb3JzICBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CisJdTMyICAgICByeF90b29sb25nX2Vycm9ycyAgIF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKwl1MzIgICAgIHJ4X291dG9mcmVzb3VyY2VfZXJyb3JzICBfX2F0dHJpYnV0ZSgocGFja2VkKSk7IAorCisJdTMyICAgICByeF9kaXNjYXJkZWQgICBfX2F0dHJpYnV0ZSgocGFja2VkKSk7ICAvKiB2aWEgY2FyZCBwYXR0ZXJuIG1hdGNoIGZpbHRlciAqLyAKKworCS8qIFRYIEVycm9ycyAqLworCXUzMiAgICAgdHhfbWF4X2NvbGxpc2lvbnMgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOyAKKwl1MzIgICAgIHR4X2NhcnJpZXJfZXJyb3JzIF9fYXR0cmlidXRlKChwYWNrZWQpKTsgCisJdTMyICAgICB0eF91bmRlcnJ1bl9lcnJvcnMgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOyAKKwl1MzIgICAgIHR4X2N0c19lcnJvcnMgICAgIF9fYXR0cmlidXRlKChwYWNrZWQpKTsgCisJdTMyICAgICB0eF90aW1lb3V0X2Vycm9ycyBfX2F0dHJpYnV0ZSgocGFja2VkKSkgOworCQorCS8qIHZhcmlvdXMgY3J1ZnQgKi8KKwl1MzIgICAgIGRhdGFBWzZdIF9fYXR0cmlidXRlKChwYWNrZWQpKTsgICAKKyAgICAgICAgdTE2CWRhdGFCWzVdIF9fYXR0cmlidXRlKChwYWNrZWQpKTsgICAKKyAgCXUzMiAgICAgZGF0YUNbMTRdIF9fYXR0cmlidXRlKChwYWNrZWQpKTsgCQorfTsKKworI2RlZmluZSBTVEFUVVNfTUFTSwkweDBGCisjZGVmaW5lIENPTVBMRVRFRAkoMTw8NykKKyNkZWZpbmUgQ09NUExFVEVEX09LCSgxPDw2KQorI2RlZmluZSBCVUZGRVJfQlVTWQkoMTw8NSkKKworI2RlZmluZSBDT05UUk9MX0VPUAkoMTw8NykJLyogRW5kIE9mIFBhY2tldCAqLworI2RlZmluZSBDT05UUk9MX0VPTAkoMTw8NikJLyogRW5kIG9mIExpc3QgKi8KKworI2RlZmluZSBNQ0FfTUMzMl9JRAkweDAwNDEJLyogT3VyIE1DQSBpZGVudCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1OXguYyBiL2RyaXZlcnMvbmV0LzNjNTl4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlMmFjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0LzNjNTl4LmMKQEAgLTAsMCArMSwzMzY1IEBACisvKiBFdGhlckxpbmtYTC5jOiBBIDNDb20gRXRoZXJMaW5rIFBDSSBJSUkvWEwgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTk2LTE5OTkgYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSAzQ29tICJWb3J0ZXgiIGFuZCAiQm9vbWVyYW5nIiBzZXJpZXMgZXRoZXJjYXJkcy4KKwlNZW1iZXJzIG9mIHRoZSBzZXJpZXMgaW5jbHVkZSBGYXN0IEV0aGVyTGluayAzYzU5MC8zYzU5Mi8zYzU5NS8zYzU5NworCWFuZCB0aGUgRXRoZXJMaW5rIFhMIDNjOTAwIGFuZCAzYzkwNSBjYXJkcy4KKworCVByb2JsZW0gcmVwb3J0cyBhbmQgcXVlc3Rpb25zIHNob3VsZCBiZSBkaXJlY3RlZCB0bworCXZvcnRleEBzY3lsZC5jb20KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCUxpbnV4IEtlcm5lbCBBZGRpdGlvbnM6CisJCisgCTAuOTlIK2xrMC45IC0gRGF2aWQgUy4gTWlsbGVyIC0gc29mdG5ldCwgUENJIERNQSB1cGRhdGVzCisgCTAuOTlIK2xrMS4wIC0gSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCQlSZW1vdmUgY29tcGF0aWJpbGl0eSBkZWZpbmVzIGZvciBrZXJuZWwgdmVyc2lvbnMgPCAyLjIueC4KKwkJVXBkYXRlIGZvciBuZXcgMi4zLnggbW9kdWxlIGludGVyZmFjZQorCUxLMS4xLjIgKE1hcmNoIDE5LCAyMDAwKQorCSogTmV3IFBDSSBpbnRlcmZhY2UgKGpnYXJ6aWspCisKKyAgICBMSzEuMS4zIDI1IEFwcmlsIDIwMDAsIEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT4KKyAgICAtIE1lcmdlZCB3aXRoIDNjNTc1X2NiLmMKKyAgICAtIERvbid0IHNldCBSeENvbXBsZXRlIGluIGJvb21lcmFuZyBpbnRlcnJ1cHQgZW5hYmxlIHJlZworICAgIC0gc3BpbmxvY2sgaW4gdm9ydGV4X3RpbWVyIHRvIHByb3RlY3QgbWRpbyBmdW5jdGlvbnMKKyAgICAtIGRpc2FibGUgbG9jYWwgaW50ZXJydXB0cyBhcm91bmQgY2FsbCB0byB2b3J0ZXhfaW50ZXJydXB0IGluCisgICAgICB2b3J0ZXhfdHhfdGltZW91dCgpIChTbyB2b3J0ZXhfaW50ZXJydXB0IGNhbiB1c2Ugc3Bpbl9sb2NrKCkpCisgICAgLSBTZWxlY3Qgd2luZG93IDMgaW4gdm9ydGV4X3RpbWVyKCkncyB3cml0ZSB0byBXbjNfTUFDX0N0cmwKKyAgICAtIEluIHZvcnRleF9zdGFydF94bWl0KCksIG1vdmUgdGhlIGxvY2sgdG8gX2FmdGVyXyB3ZSd2ZSBhbHRlcmVkCisgICAgICB2cC0+Y3VyX3R4IGFuZCB2cC0+dHhfZnVsbC4gIFRoaXMgZGVmZWF0cyB0aGUgcmFjZSBiZXR3ZWVuCisgICAgICB2b3J0ZXhfc3RhcnRfeG1pdCgpIGFuZCB2b3J0ZXhfaW50ZXJydXB0IHdoaWNoIHdhcyBpZGVudGlmaWVkCisgICAgICBieSBCb2dkYW4gQ29zdGVzY3UuCisgICAgLSBNZXJnZWQgYmFjayBzdXBwb3J0IGZvciBzaXggbmV3IGNhcmRzIGZyb20gdmFyaW91cyBzb3VyY2VzCisgICAgLSBTZXQgdm9ydGV4X2hhdmVfcGNpIGlmIHBjaV9tb2R1bGVfaW5pdCByZXR1cm5zIHplcm8gKGZpeGVzIGNhcmRidXMKKyAgICAgIGluc2VydGlvbiBvb3BzKQorICAgIC0gVGVsbCBpdCB0aGF0IDNjOTA1QyBoYXMgTldBWSBmb3IgMTAwYlQgYXV0b25lZworICAgIC0gRml4IGhhbmRsaW5nIG9mIFNldFN0YXR1c0VuZCBpbiAnVG9vIG11Y2ggd29yay4uJyBjb2RlLCBhcworICAgICAgcGVyIDIuMy45OSdzIDNjNTc1X2NiIChEYXZlIEhpbmRzKS4KKyAgICAtIFNwbGl0IElTUiBpbnRvIHR3byBmb3Igdm9ydGV4ICYgYm9vbWVyYW5nCisgICAgLSBGaXggTU9EX0lOQy9ERUMgcmFjZXMKKyAgICAtIEhhbmRsZSByZXNvdXJjZSBhbGxvY2F0aW9uIGZhaWx1cmVzLgorICAgIC0gRml4IDNDQ0ZFNTc1Q1QgTEVEIHBvbGFyaXR5CisgICAgLSBNYWtlIHR4X2ludGVycnVwdF9taXRpZ2F0aW9uIHRoZSBkZWZhdWx0CisKKyAgICBMSzEuMS40IDI1IEFwcmlsIDIwMDAsIEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT4gICAgCisgICAgLSBBZGQgZXh0cmEgVHhSZXNldCB0byB2b3J0ZXhfdXAoKSB0byBmaXggNTc1X2NiIGhvdHBsdWcgaW5pdGlhbGlzYXRpb24gcHJvYnMuCisgICAgLSBQdXQgdm9ydGV4X2luZm9fdGJsIGludG8gX19kZXZpbml0ZGF0YQorICAgIC0gSW4gdGhlIHZvcnRleF9lcnJvciBTdGF0c0Z1bGwgSEFDSywgZGlzYWJsZSBzdGF0cyBpbiB2cC0+aW50cl9lbmFibGUgYXMgd2VsbAorICAgICAgYXMgaW4gdGhlIGhhcmR3YXJlLgorICAgIC0gSW5jcmVhc2VkIHRoZSBsb29wIGNvdW50ZXIgaW4gaXNzdWVfYW5kX3dhaXQgZnJvbSAyLDAwMCB0byA0LDAwMC4KKworICAgIExLMS4xLjUgMjggQXByaWwgMjAwMCwgYW5kcmV3bQorICAgIC0gQWRkZWQgcG93ZXJwYyBkZWZpbmVzIChKb2huIERhbmllbCA8amRhbmllbEBldHJlc29mdC5jb20+IHNhaWQgdGhlc2Ugd29yay4uLikKKyAgICAtIFNvbWUgZXh0cmEgZGlhZ25vc3RpY3MKKyAgICAtIEluIHZvcnRleF9lcnJvcigpLCByZXNldCB0aGUgVHggb24gbWF4Q29sbGlzaW9ucy4gIE90aGVyd2lzZSBtb3N0CisgICAgICBjaGlwcyB1c3VhbGx5IGdldCBhIFR4IHRpbWVvdXQuCisgICAgLSBBZGRlZCBleHRyYV9yZXNldCBtb2R1bGUgcGFybQorICAgIC0gUmVwbGFjZWQgc29tZSBpbmxpbmUgdGltZXIgbWFuaXAgd2l0aCBtb2RfdGltZXIKKyAgICAgIChGcmFub2lzIHJvbWlldSA8RnJhbmNvaXMuUm9taWV1QG5pYy5mcj4pCisgICAgLSBJbiB2b3J0ZXhfdXAoKSwgZG9uJ3QgbWFrZSBXbjNfY29uZmlnIGluaXRpYWxpc2F0aW9uIGRlcGVuZGVudCB1cG9uIGhhc19ud2F5CisgICAgICAodGhpcyBjYW1lIGFjcm9zcyBmcm9tIDNjNTc1X2NiKS4KKworICAgIExLMS4xLjYgMDYgSnVuIDIwMDAsIGFuZHJld20KKyAgICAtIEJhY2tlZCBvdXQgdGhlIFBQQyBkZWZpbmVzLgorICAgIC0gVXNlIGRlbF90aW1lcl9zeW5jKCksIG1vZF90aW1lcigpLgorICAgIC0gRml4IHdyYXBwZWQgdWxvbmcgY29tcGFyaXNvbiBpbiBib29tZXJhbmdfcngoKQorICAgIC0gQWRkIElTX1RPUk5BRE8sIHVzZSBpdCB0byBzdXBwcmVzcyAzYzkwNUMgY2hlY2tzdW0gZXJyb3IgbXNnCisgICAgICAoRG9uYWxkIEJlY2tlciwgSSBMZWUgSGV0aGVyaW5ndG9uIDxpbGhAc2xzLmxjcy5taXQuZWR1PikKKyAgICAtIFJlcGxhY2UgdW5pb24gd24zX2NvbmZpZyB3aXRoIEJGSU5TL0JGRVhUIG1hbmlwdWxhdGlvbiBmb3IKKyAgICAgIHNwYXJjNjQgKFBldGUgWmFpdGNldiwgUGV0ZXIgSm9uZXMpCisgICAgLSBJbiB2b3J0ZXhfZXJyb3IsIGRvX3R4X3Jlc2V0IGFuZCB2b3J0ZXhfdHhfdGltZW91dChWb3J0ZXgpOgorICAgICAgZG8gYSBuZXRpZl93YWtlX3F1ZXVlKCkgdG8gYmV0dGVyIHJlY292ZXIgZnJvbSBlcnJvcnMuIChBbmRlcnMgUGVkZXJzZW4sCisgICAgICBEb25hbGQgQmVja2VyKQorICAgIC0gUHJpbnQgYSB3YXJuaW5nIG9uIG91dC1vZi1tZW1vcnkgKHJhdGUgbGltaXRlZCB0byAxIHBlciAxMCBzZWNzKQorICAgIC0gQWRkZWQgdHdvIG1vcmUgQ2FyZGJ1cyA1NzUgTklDczogNWI1NyBhbmQgNjU2NCAoUGF1bCBXYWdsYW5kKQorCisgICAgTEsxLjEuNyAyIEp1bCAyMDAwIGFuZHJld20KKyAgICAtIEJldHRlciBoYW5kbGluZyBvZiBzaGFyZWQgSVJRcworICAgIC0gUmVzZXQgdGhlIHRyYW5zbWl0dGVyIG9uIGEgVHggcmVjbGFpbSBlcnJvcgorICAgIC0gRml4ZWQgY3Jhc2ggdW5kZXIgT09NIGR1cmluZyB2b3J0ZXhfb3BlbigpIChNYXJrIEhlbW1lbnQpCisgICAgLSBGaXggUnggY2Vzc2F0aW9uIHByb2JsZW0gZHVyaW5nIE9PTSAoaGVscCBmcm9tIE1hcmsgSGVtbWVudCkKKyAgICAtIFRoZSBzcGlubG9ja3MgYXJvdW5kIHRoZSBtZGlvIGFjY2VzcyB3ZXJlIGJsb2NraW5nIGludGVycnVwdHMgZm9yIDMwMHVTLgorICAgICAgRml4IGFsbCB0aGlzIHRvIHVzZSBzcGluX2xvY2tfYmgoKSB3aXRoaW4gbWRpb19yZWFkL3dyaXRlCisgICAgLSBPbmx5IHdyaXRlIHRvIFR4RnJlZVRocmVzaG9sZCBpZiBpdCdzIGEgYm9vbWVyYW5nIC0gb3RoZXIgTklDcyBkb24ndAorICAgICAgaGF2ZSBvbmUuCisgICAgLSBBZGRlZCA4MDIuM3ggTUFDLWxheWVyIGZsb3cgY29udHJvbCBzdXBwb3J0CisKKyAgIExLMS4xLjggMTMgQXVnIDIwMDAgYW5kcmV3bQorICAgIC0gSWdub3JlIHJlcXVlc3RfcmVnaW9uKCkgcmV0dXJuIHZhbHVlIC0gYWxyZWFkeSByZXNlcnZlZCBpZiBDYXJkYnVzLgorICAgIC0gTWVyZ2VkIHNvbWUgYWRkaXRpb25hbCBDYXJkYnVzIGZsYWdzIGZyb20gRG9uJ3MgMC45OVFrCisgICAgLSBTb21lIGZpeGVzIGZvciAzYzU1NiAoRnJlZCBNYWNpZWwpCisgICAgLSBGaXggZm9yIEVJU0EgaW5pdGlhbGlzYXRpb24gKEphbiBSZWtvcmFqc2tpKQorICAgIC0gUmVuYW1lZCBNSUlfWENWUl9QV1IgYW5kIEVFUFJPTV8yMzAgdG8gYWxpZ24gd2l0aCAzYzU3NV9jYiBhbmQgRC4gQmVja2VyJ3MgZHJpdmVycworICAgIC0gRml4ZWQgTUlJX1hDVlJfUFdSIGZvciAzQ0NGRTU3NUNUCisgICAgLSBBZGRlZCBJTlZFUlRfTEVEX1BXUiwgdXNlZCBpdC4KKyAgICAtIEJhY2tlZCBvdXQgdGhlIGV4dHJhX3Jlc2V0IHN0dWZmCisKKyAgIExLMS4xLjkgMTIgU2VwIDIwMDAgYW5kcmV3bQorICAgIC0gQmFja2VkIG91dCB0aGUgdHhfcmVzZXRfcmVzdW1lIGZsYWdzLiAgSXQgd2FzIGEgbm8tb3AuCisgICAgLSBJbiB2b3J0ZXhfZXJyb3IsIGRvbid0IHJlc2V0IHRoZSBUeCBvbiB0eFJlY2xhaW0gZXJyb3JzCisgICAgLSBJbiB2b3J0ZXhfZXJyb3IsIGRvbid0IHJlc2V0IHRoZSBUeCBvbiBtYXhDb2xsaXNpb25zIGVycm9ycy4KKyAgICAgIEhlbmNlIGJhY2tlZCBvdXQgYWxsIHRoZSBEb3duTGlzdFB0ciBsb2dpYyBoZXJlLgorICAgIC0gSW4gdm9ydGV4X2Vycm9yLCBnaXZlIFRvcm5hZG8gY2FyZHMgYSBwYXJ0aWFsIFR4UmVzZXQgb24KKyAgICAgIG1heENvbGxpc2lvbnMgKERhdmlkIEhpbmRzKS4gIERlZmluZWQgTUFYX0NPTExJU0lPTl9SRVNFVCBmb3IgdGhpcy4KKyAgICAtIFJlZGlkIHNvbWUgZHJpdmVyIGZsYWdzIGFuZCBkZXZpY2UgbmFtZXMgYmFzZWQgb24gcGNtY2lhX2NzLTMuMS4yMC4KKyAgICAtIEZpeGVkIGEgYnVnIHdoZXJlLCBpZiB2cC0+dHhfZnVsbCBpcyBzZXQgd2hlbiB0aGUgaW50ZXJmYWNlCisgICAgICBpcyBkb3duZWQsIGl0IHJlbWFpbnMgc2V0IHdoZW4gdGhlIGludGVyZmFjZSBpcyB1cHBlZC4gIEJhZAorICAgICAgdGhpbmdzIGhhcHBlbi4KKworICAgTEsxLjEuMTAgMTcgU2VwIDIwMDAgYW5kcmV3bQorICAgIC0gQWRkZWQgRUVQUk9NXzhCSVQgZm9yIDNjNTU1IChGcmVkIE1hY2llbCkKKyAgICAtIEFkZGVkIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB0aGUgM2M1NTZCIExhcHRvcCBIdXJyaWNhbmUgKExvdWlzIEdlcmJhcmcpCisgICAgLSBBZGQgSEFTX05XQVkgdG8gIjNjOTAwIEN5Y2xvbmUgMTBNYnBzIFRQTyIKKworICAgTEsxLjEuMTEgMTMgTm92IDIwMDAgYW5kcmV3bQorICAgIC0gRHVtcCBNT0RfSU5DL0RFQ19VU0VfQ09VTlQsIHVzZSBTRVRfTU9EVUxFX09XTkVSCisKKyAgIExLMS4xLjEyIDEgSmFuIDIwMDEgYW5kcmV3bSAoMi40LjAtcHJlMSkKKyAgICAtIENhbGwgcGNpX2VuYWJsZV9kZXZpY2UgYmVmb3JlIHdlIHJlcXVlc3Qgb3VyIElSUSAoVG9iaWFzIFJpbmdzdHJvbSkKKyAgICAtIEFkZCAzYzU5MCBQQ0kgbGF0ZW5jeSB0aW1lciBoYWNrIHRvIHZvcnRleF9wcm9iZTEgKGZyb20gMC45OVJhKQorICAgIC0gQWRkZWQgZXh0ZW5kZWQgaXNzdWVfYW5kX3dhaXQgZm9yIHRoZSAzYzkwNUNYLgorICAgIC0gTG9vayBmb3IgYW4gTUlJIG9uIFBIWSBpbmRleCAyNCBmaXJzdCAoM2M5MDVDWCBvZGRpdHkpLgorICAgIC0gQWRkIEhBU19OV0FZIHRvIDNjU09ITzEwMC1UWCAoQnJldHQgRnJhbmtlbmJlcmdlcikKKyAgICAtIERvbid0IGZyZWUgc2ticyB3ZSBkb24ndCBvd24gb24gb29tIHBhdGggaW4gdm9ydGV4X29wZW4oKS4KKworICAgTEsxLjEuMTMgMjcgSmFuIDIwMDEKKyAgICAtIEFkZGVkIGV4cGxpY2l0IGBtZWRpYWxvY2snIGZsYWcgc28gd2UgY2FuIHRydWx5CisgICAgICBsb2NrIHRoZSBtZWRpYSB0eXBlIGRvd24gd2l0aCBgb3B0aW9ucycuCisgICAgLSAiY2hlY2sgaW9yZW1hcCByZXR1cm4gYW5kIHNvbWUgdGlkYml0cyIgKEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPikKKyAgICAtIEFkZGVkIGFuZCB1c2VkIEVFUFJPTV9OT1JFU0VUIGZvciAzYzU1NkIgUE0gcmVzdW1lcy4KKyAgICAtIEZpeGVkIGxlYWthZ2Ugb2YgdnAtPnJ4X3JpbmcuCisgICAgLSBCcmVhayBvdXQgc2VwYXJhdGUgSEFTX0hXQ0tTTSBkZXZpY2UgY2FwYWJpbGl0eSBmbGFnLgorICAgIC0gS2lsbCB2cC0+dHhfZnVsbCAoQU5LKQorICAgIC0gTWVyZ2UgemVyb2NvcHkgZnJhZ21lbnQgaGFuZGxpbmcgKEFOSz8pCisKKyAgIExLMS4xLjE0IDE1IEZlYiAyMDAxCisgICAgLSBFbmFibGUgV09MLiAgQ2FuIGJlIHR1cm5lZCBvbiB3aXRoIGBlbmFibGVfd29sJyBtb2R1bGUgb3B0aW9uLgorICAgIC0gRUlTQSBhbmQgUENJIGluaXRpYWxpc2F0aW9uIGZpeGVzIChqZ2FyemlrLCBNYW5mcmVkIFNwcmF1bCkKKyAgICAtIElmIGEgZGV2aWNlJ3MgaW50ZXJuYWxjb25maWcgcmVnaXN0ZXIgcmVwb3J0cyBpdCBoYXMgTldBWSwKKyAgICAgIHVzZSBpdCwgZXZlbiBpZiBhdXRvc2VsZWN0IGlzIGVuYWJsZWQuCisKKyAgIExLMS4xLjE1IDYgSnVuZSAyMDAxIGFrcG0KKyAgICAtIFByZXZlbnQgZG91YmxlIGNvdW50aW5nIG9mIHJlY2VpdmVkIGJ5dGVzIChMYXJzIENocmlzdGVuc2VuKQorICAgIC0gQWRkIGV0aHRvb2wgc3VwcG9ydCAoamdhcnppaykKKyAgICAtIEFkZCBtb2R1bGUgcGFybSBkZXNjcmlwdGlvbnMgKEFuZHJ6ZWogTS4gS3J6eXN6dG9mb3dpY3opCisgICAgLSBJbXBsZW1lbnRlZCBhbGxvY19ldGhlcmRldigpIEFQSQorICAgIC0gU3BlY2lhbC1jYXNlIHRoZSAnVHggZXJyb3IgODInIG1lc3NhZ2UuCisKKyAgIExLMS4xLjE2IDE4IEp1bHkgMjAwMSBha3BtCisgICAgLSBNYWtlIE5FVElGX0ZfU0cgZGVwZW5kZW50IHVwb24gbnJfZnJlZV9oaWdocGFnZXMoKSwgbm90IG9uIENPTkZJR19ISUdITUVNCisgICAgLSBMZXNzZW4gdmVyYm9zaXR5IG9mIGJvb3R1cCBtZXNzYWdlcworICAgIC0gRml4IFdPTCAtIHVzZSBuZXcgUE0gQVBJIGZ1bmN0aW9ucy4KKyAgICAtIFVzZSBuZXRpZl9ydW5uaW5nKCkgaW5zdGVhZCBvZiB2cC0+b3BlbiBpbiBzdXNwZW5kL3Jlc3VtZS4KKyAgICAtIERvbid0IHJlc2V0IHRoZSBpbnRlcmZhY2UgbG9naWMgb24gb3Blbi9jbG9zZS9ybW1vZC4gIEl0IHVwc2V0cworICAgICAgYXV0b25lZ290aWF0aW9uLCBhbmQgaGVuY2UgREhDUCAoZnJvbSAwLjk5VCkuCisgICAgLSBCYWNrIG91dCBFRVBST01fTk9SRVNFVCBmbGFnIGJlY2F1c2Ugb2YgdGhlIGFib3ZlICh3ZSBkbyBpdCBmb3IgYWxsCisgICAgICBOSUNzKS4KKyAgICAtIENvcnJlY3QgM2M5ODIgaWRlbnRpZmljYXRpb24gc3RyaW5nCisgICAgLSBSZW5hbWUgd2FpdF9mb3JfY29tcGxldGlvbigpIHRvIGlzc3VlX2FuZF93YWl0KCkgdG8gYXZvaWQgY29tcGxldGlvbi5oCisgICAgICBjbGFzaC4KKworICAgTEsxLjEuMTcgMThEZWMwMSBha3BtCisgICAgLSBQQ0kgSUQgOTgwNSBpcyBhIFB5dGhvbi1ULCBub3QgYSBkdWFsLXBvcnQgQ3ljbG9uZS4gIEFwcGFyZW50bHkuCisgICAgICBBbmQgaXQgaGFzIE5XQVkuCisgICAgLSBNYXNrIG91ciBhZHZlcnRpc2VkIG1vZGVzICh2cC0+YWR2ZXJ0aXNpbmcpIHdpdGggb3VyIGNhcGFiaWxpdGllcworCSAgKE1JSSByZWc1KSB3aGVuIGRlY2lkaW5nIHdoaWNoIGR1cGxleCBtb2RlIHRvIHVzZS4KKyAgICAtIEFkZCBgZ2xvYmFsX29wdGlvbnMnIGFzIGRlZmF1bHQgZm9yIG9wdGlvbnNbXS4gIERpdHRvIGdsb2JhbF9lbmFibGVfd29sLAorICAgICAgZ2xvYmFsX2Z1bGxfZHVwbGV4LgorCisgICBMSzEuMS4xOCAwMUp1bDAyIGFrcG0KKyAgICAtIEZpeCBmb3IgdW5kb2N1bWVudGVkIHRyYW5zY2VpdmVyIHBvd2VyLXVwIGJpdCBvbiBzb21lIDNjNTY2QidzCisgICAgICAoRG9uYWxkIEJlY2tlciwgUmFodWwgS2FybmlrKQorCisgICAgLSBTZWUgaHR0cDovL3d3dy56aXAuY29tLmF1L35ha3BtL2xpbnV4LyMzYzU5eC0yLjMgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAtIEFsc28gc2VlIERvY3VtZW50YXRpb24vbmV0d29ya2luZy92b3J0ZXgudHh0CisKKyAgIExLMS4xLjE5IDEwTm92MDIgTWFyYyBaeW5naWVyIDxtYXpAd2lsZC13aW5kLmZyLmV1Lm9yZz4KKyAgICAtIEVJU0Egc3lzZnMgaW50ZWdyYXRpb24uCisqLworCisvKgorICogRklYTUU6IFRoaXMgZHJpdmVyIF9jb3VsZF8gc3VwcG9ydCBNVFUgY2hhbmdpbmcsIGJ1dCBkb2Vzbid0LiAgU2VlIERvbidzIGhhbWFjaGkuYyBpbXBsZW1lbnRhdGlvbgorICogYXMgd2VsbCBhcyBvdGhlciBkcml2ZXJzCisgKgorICogTk9URTogSWYgeW91IG1ha2UgJ3ZvcnRleF9kZWJ1ZycgYSBjb25zdGFudCAoI2RlZmluZSB2b3J0ZXhfZGVidWcgMCkgdGhlIGRyaXZlciBzaHJpbmtzIGJ5IDJrCisgKiBkdWUgdG8gZGVhZCBjb2RlIGVsaW1pbmF0aW9uLiAgVGhlcmUgd2lsbCBiZSBzb21lIHBlcmZvcm1hbmNlIGJlbmVmaXRzIGZyb20gdGhpcyBkdWUgdG8KKyAqIGVsaW1pbmF0aW9uIG9mIGFsbCB0aGUgdGVzdHMgYW5kIHJlZHVjZWQgY2FjaGUgZm9vdHByaW50LgorICovCisKKworI2RlZmluZSBEUlZfTkFNRQkiM2M1OXgiCisjZGVmaW5lIERSVl9WRVJTSU9OCSJMSzEuMS4xOSIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIjEwIE5vdiAyMDAyIgorCisKKworLyogQSBmZXcgdmFsdWVzIHRoYXQgbWF5IGJlIHR3ZWFrZWQuICovCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBlZmZpY2llbmN5LiAqLworI2RlZmluZSBUWF9SSU5HX1NJWkUJMTYKKyNkZWZpbmUgUlhfUklOR19TSVpFCTMyCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzYJCQkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4qLworCisvKiAiS25vYnMiIHRoYXQgYWRqdXN0IGZlYXR1cmVzIGFuZCBwYXJhbWV0ZXJzLiAqLworLyogU2V0IHRoZSBjb3B5IGJyZWFrcG9pbnQgZm9yIHRoZSBjb3B5LW9ubHktdGlueS1mcmFtZXMgc2NoZW1lLgorICAgU2V0dGluZyB0byA+IDE1MTIgZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhpcyBmZWF0dXJlLiAqLworI2lmbmRlZiBfX2FybV9fCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IDIwMDsKKyNlbHNlCisvKiBBUk0gc3lzdGVtcyBwZXJmb3JtIGJldHRlciBieSBkaXNyZWdhcmRpbmcgdGhlIGJ1cy1tYXN0ZXIKKyAgIHRyYW5zZmVyIGNhcGFiaWxpdHkgb2YgdGhlc2UgY2FyZHMuIC0tIHJtayAqLworc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAxNTEzOworI2VuZGlmCisvKiBBbGxvdyBzZXR0aW5nIE1UVSB0byBhIGxhcmdlciBzaXplLCBieXBhc3NpbmcgdGhlIG5vcm1hbCBldGhlcm5ldCBzZXR1cC4gKi8KK3N0YXRpYyBjb25zdCBpbnQgbXR1ID0gMTUwMDsKKy8qIE1heGltdW0gZXZlbnRzIChSeCBwYWNrZXRzLCBldGMuKSB0byBoYW5kbGUgYXQgZWFjaCBpbnRlcnJ1cHQuICovCitzdGF0aWMgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDMyOworLyogVHggdGltZW91dCBpbnRlcnZhbCAobWlsbGlzZWNzKSAqLworc3RhdGljIGludCB3YXRjaGRvZyA9IDUwMDA7CisKKy8qIEFsbG93IGFnZ3JlZ2F0aW9uIG9mIFR4IGludGVycnVwdHMuICBTYXZlcyBDUFUgbG9hZCBhdCB0aGUgY29zdAorICogb2YgcG9zc2libGUgVHggc3RhbGxzIGlmIHRoZSBzeXN0ZW0gaXMgYmxvY2tpbmcgaW50ZXJydXB0cworICogc29tZXdoZXJlIGVsc2UuICBVbmRlZmluZSB0aGlzIHRvIGRpc2FibGUuCisgKi8KKyNkZWZpbmUgdHhfaW50ZXJydXB0X21pdGlnYXRpb24gMQorCisvKiBQdXQgb3V0IHNvbWV3aGF0IG1vcmUgZGVidWdnaW5nIG1lc3NhZ2VzLiAoMDogbm8gbXNnLCAxIG1pbmltYWwgLi4gNikuICovCisjZGVmaW5lIHZvcnRleF9kZWJ1ZyBkZWJ1ZworI2lmZGVmIFZPUlRFWF9ERUJVRworc3RhdGljIGludCB2b3J0ZXhfZGVidWcgPSBWT1JURVhfREVCVUc7CisjZWxzZQorc3RhdGljIGludCB2b3J0ZXhfZGVidWcgPSAxOworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9laXNhLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgkJCS8qIEZvciBOUl9JUlFTIG9ubHkuICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogS2VybmVsIGNvbXBhdGliaWxpdHkgZGVmaW5lcywgc29tZSBjb21tb24gdG8gRGF2aWQgSGluZHMnIFBDTUNJQSBwYWNrYWdlLgorICAgVGhpcyBpcyBvbmx5IGluIHRoZSBzdXBwb3J0LWFsbC1rZXJuZWxzIHNvdXJjZSBjb2RlLiAqLworCisjZGVmaW5lIFJVTl9BVCh4KSAoamlmZmllcyArICh4KSkKKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorRFJWX05BTUUgIjogRG9uYWxkIEJlY2tlciBhbmQgb3RoZXJzLiB3d3cuc2N5bGQuY29tL25ldHdvcmsvdm9ydGV4Lmh0bWxcbiI7CisKK01PRFVMRV9BVVRIT1IoIkRvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjNDb20gM2M1OXgvM2M5eHggZXRoZXJuZXQgZHJpdmVyICIKKwkJCQkJRFJWX1ZFUlNJT04gIiAiIERSVl9SRUxEQVRFKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXIgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKworLyogVGhlIFZvcnRleCBzaXplIGlzIHR3aWNlIHRoYXQgb2YgdGhlIG9yaWdpbmFsIEV0aGVyTGlua0lJSSBzZXJpZXM6IHRoZQorICAgcnVudGltZSByZWdpc3RlciB3aW5kb3csIHdpbmRvdyAxLCBpcyBub3cgYWx3YXlzIG1hcHBlZCBpbi4KKyAgIFRoZSBCb29tZXJhbmcgc2l6ZSBpcyB0d2ljZSBhcyBsYXJnZSBhcyB0aGUgVm9ydGV4IC0tIGl0IGhhcyBhZGRpdGlvbmFsCisgICBidXMgbWFzdGVyIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBWT1JURVhfVE9UQUxfU0laRSAweDIwCisjZGVmaW5lIEJPT01FUkFOR19UT1RBTF9TSVpFIDB4NDAKKworLyogU2V0IGlmZiBhIE1JSSB0cmFuc2NlaXZlciBvbiBhbnkgaW50ZXJmYWNlIHJlcXVpcmVzIG1kaW8gcHJlYW1ibGUuCisgICBUaGlzIG9ubHkgc2V0IHdpdGggdGhlIG9yaWdpbmFsIERQODM4NDAgb24gb2xkZXIgM2M5MDUgYm9hcmRzLCBzbyB0aGUgZXh0cmEKKyAgIGNvZGUgc2l6ZSBvZiBhIHBlci1pbnRlcmZhY2UgZmxhZyBpcyBub3Qgd29ydGh3aGlsZS4gKi8KK3N0YXRpYyBjaGFyIG1paV9wcmVhbWJsZV9yZXF1aXJlZDsKKworI2RlZmluZSBQRlggRFJWX05BTUUgIjogIgorCisKKworLyoKKwkJCQlUaGVvcnkgb2YgT3BlcmF0aW9uCisKK0kuIEJvYXJkIENvbXBhdGliaWxpdHkKKworVGhpcyBkZXZpY2UgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgM0NvbSBGYXN0RXRoZXJMaW5rIGFuZCBGYXN0RXRoZXJMaW5rCitYTCwgM0NvbSdzIFBDSSB0byAxMC8xMDBiYXNlVCBhZGFwdGVycy4gIEl0IGFsc28gd29ya3Mgd2l0aCB0aGUgMTBNYnMKK3ZlcnNpb25zIG9mIHRoZSBGYXN0RXRoZXJMaW5rIGNhcmRzLiAgVGhlIHN1cHBvcnRlZCBwcm9kdWN0IElEcyBhcmUKKyAgM2M1OTAsIDNjNTkyLCAzYzU5NSwgM2M1OTcsIDNjOTAwLCAzYzkwNQorCitUaGUgcmVsYXRlZCBJU0EgM2M1MTUgaXMgc3VwcG9ydGVkIHdpdGggYSBzZXBhcmF0ZSBkcml2ZXIsIDNjNTE1LmMsIGluY2x1ZGVkCit3aXRoIHRoZSBrZXJuZWwgc291cmNlIG9yIGF2YWlsYWJsZSBmcm9tCisgICAgY2VzZGlzLmdzZmMubmFzYS5nb3Y6L3B1Yi9saW51eC9kcml2ZXJzLzNjNTE1Lmh0bWwKKworSUkuIEJvYXJkLXNwZWNpZmljIHNldHRpbmdzCisKK1BDSSBidXMgZGV2aWNlcyBhcmUgY29uZmlndXJlZCBieSB0aGUgc3lzdGVtIGF0IGJvb3QgdGltZSwgc28gbm8ganVtcGVycworbmVlZCB0byBiZSBzZXQgb24gdGhlIGJvYXJkLiAgVGhlIHN5c3RlbSBCSU9TIHNob3VsZCBiZSBzZXQgdG8gYXNzaWduIHRoZQorUENJIElOVEEgc2lnbmFsIHRvIGFuIG90aGVyd2lzZSB1bnVzZWQgc3lzdGVtIElSUSBsaW5lLgorCitUaGUgRUVQUk9NIHNldHRpbmdzIGZvciBtZWRpYSB0eXBlIGFuZCBmb3JjZWQtZnVsbC1kdXBsZXggYXJlIG9ic2VydmVkLgorVGhlIEVFUFJPTSBtZWRpYSB0eXBlIHNob3VsZCBiZSBsZWZ0IGF0IHRoZSBkZWZhdWx0ICJhdXRvc2VsZWN0IiB1bmxlc3MgdXNpbmcKKzEwYmFzZTIgb3IgQVVJIGNvbm5lY3Rpb25zIHdoaWNoIGNhbm5vdCBiZSByZWxpYWJseSBkZXRlY3RlZC4KKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK1RoZSAzYzU5eCBzZXJpZXMgdXNlIGFuIGludGVyZmFjZSB0aGF0J3MgdmVyeSBzaW1pbGFyIHRvIHRoZSBwcmV2aW91cyAzYzV4OQorc2VyaWVzLiAgVGhlIHByaW1hcnkgaW50ZXJmYWNlIGlzIHR3byBwcm9ncmFtbWVkLUkvTyBGSUZPcywgd2l0aCBhbgorYWx0ZXJuYXRlIHNpbmdsZS1jb250aWd1b3VzLXJlZ2lvbiBidXMtbWFzdGVyIHRyYW5zZmVyIChzZWUgbmV4dCkuCisKK1RoZSAzYzkwMCAiQm9vbWVyYW5nIiBzZXJpZXMgdXNlcyBhIGZ1bGwtYnVzLW1hc3RlciBpbnRlcmZhY2Ugd2l0aCBzZXBhcmF0ZQorbGlzdHMgb2YgdHJhbnNtaXQgYW5kIHJlY2VpdmUgZGVzY3JpcHRvcnMsIHNpbWlsYXIgdG8gdGhlIEFNRCBMQU5DRS9QQ25ldCwKK0RFQyBUdWxpcCBhbmQgSW50ZWwgU3BlZWRvMy4gIFRoZSBmaXJzdCBjaGlwIHZlcnNpb24gcmV0YWlucyBhIGNvbXBhdGlibGUKK3Byb2dyYW1tZWQtSS9PIGludGVyZmFjZSB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgaW4gJ0InIGFuZCBzdWJzZXF1ZW50IGJvYXJkCityZXZpc2lvbnMuCisKK09uZSBleHRlbnNpb24gdGhhdCBpcyBhZHZlcnRpc2VkIGluIGEgdmVyeSBsYXJnZSBmb250IGlzIHRoYXQgdGhlIGFkYXB0ZXJzCithcmUgY2FwYWJsZSBvZiBiZWluZyBidXMgbWFzdGVycy4gIE9uIHRoZSBWb3J0ZXggY2hpcCB0aGlzIGNhcGFiaWxpdHkgd2FzCitvbmx5IGZvciBhIHNpbmdsZSBjb250aWd1b3VzIHJlZ2lvbiBtYWtpbmcgaXQgZmFyIGxlc3MgdXNlZnVsIHRoYW4gdGhlIGZ1bGwKK2J1cyBtYXN0ZXIgY2FwYWJpbGl0eS4gIFRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wYWN0IG9mIHRha2luZworYW4gZXh0cmEgaW50ZXJydXB0IG9yIHBvbGxpbmcgZm9yIHRoZSBjb21wbGV0aW9uIG9mIGVhY2ggdHJhbnNmZXIsIGFzIHdlbGwKK2FzIGRpZmZpY3VsdHkgc2hhcmluZyB0aGUgc2luZ2xlIHRyYW5zZmVyIGVuZ2luZSBiZXR3ZWVuIHRoZSB0cmFuc21pdCBhbmQKK3JlY2VpdmUgdGhyZWFkcy4gIFVzaW5nIERNQSB0cmFuc2ZlcnMgaXMgYSB3aW4gb25seSB3aXRoIGxhcmdlIGJsb2NrcyBvcgord2l0aCB0aGUgZmxhd2VkIHZlcnNpb25zIG9mIHRoZSBJbnRlbCBPcmlvbiBtb3RoZXJib2FyZCBQQ0kgY29udHJvbGxlci4KKworVGhlIEJvb21lcmFuZyBjaGlwJ3MgZnVsbC1idXMtbWFzdGVyIGludGVyZmFjZSBpcyB1c2VmdWwsIGFuZCBoYXMgdGhlCitjdXJyZW50bHktdW51c2VkIGFkdmFudGFnZXMgb3ZlciBvdGhlciBzaW1pbGFyIGNoaXBzIHRoYXQgcXVldWVkIHRyYW5zbWl0CitwYWNrZXRzIG1heSBiZSByZW9yZGVyZWQgYW5kIHJlY2VpdmUgYnVmZmVyIGdyb3VwcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGEKK3NpbmdsZSBmcmFtZS4KKworV2l0aCBmdWxsLWJ1cy1tYXN0ZXIgc3VwcG9ydCwgdGhpcyBkcml2ZXIgdXNlcyBhICJSWF9DT1BZQlJFQUsiIHNjaGVtZS4KK1JhdGhlciB0aGFuIGEgZml4ZWQgaW50ZXJtZWRpYXRlIHJlY2VpdmUgYnVmZmVyLCB0aGlzIHNjaGVtZSBhbGxvY2F0ZXMKK2Z1bGwtc2l6ZWQgc2tidWZmcyBhcyByZWNlaXZlIGJ1ZmZlcnMuICBUaGUgdmFsdWUgUlhfQ09QWUJSRUFLIGlzIHVzZWQgYXMKK3RoZSBjb3B5aW5nIGJyZWFrcG9pbnQ6IGl0IGlzIGNob3NlbiB0byB0cmFkZS1vZmYgdGhlIG1lbW9yeSB3YXN0ZWQgYnkKK3Bhc3NpbmcgdGhlIGZ1bGwtc2l6ZWQgc2tidWZmIHRvIHRoZSBxdWV1ZSBsYXllciBmb3IgYWxsIGZyYW1lcyB2cy4gdGhlCitjb3B5aW5nIGNvc3Qgb2YgY29weWluZyBhIGZyYW1lIHRvIGEgY29ycmVjdGx5LXNpemVkIHNrYnVmZi4KKworSUlJQy4gU3luY2hyb25pemF0aW9uCitUaGUgZHJpdmVyIHJ1bnMgYXMgdHdvIGluZGVwZW5kZW50LCBzaW5nbGUtdGhyZWFkZWQgZmxvd3Mgb2YgY29udHJvbC4gIE9uZQoraXMgdGhlIHNlbmQtcGFja2V0IHJvdXRpbmUsIHdoaWNoIGVuZm9yY2VzIHNpbmdsZS10aHJlYWRlZCB1c2UgYnkgdGhlCitkZXYtPnRidXN5IGZsYWcuICBUaGUgb3RoZXIgdGhyZWFkIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgd2hpY2ggaXMgc2luZ2xlCit0aHJlYWRlZCBieSB0aGUgaGFyZHdhcmUgYW5kIG90aGVyIHNvZnR3YXJlLgorCitJVi4gTm90ZXMKKworVGhhbmtzIHRvIENhbWVyb24gU3BpdHplciBhbmQgVGVycnkgTXVycGh5IG9mIDNDb20gZm9yIHByb3ZpZGluZyBkZXZlbG9wbWVudAorM2M1OTAsIDNjNTk1LCBhbmQgM2M5MDAgYm9hcmRzLgorVGhlIG5hbWUgIlZvcnRleCIgaXMgdGhlIGludGVybmFsIDNDb20gcHJvamVjdCBuYW1lIGZvciB0aGUgUENJIEFTSUMsIGFuZAordGhlIEVJU0EgdmVyc2lvbiBpcyBjYWxsZWQgIkRlbW9uIi4gIEFjY29yZGluZyB0byBUZXJyeSB0aGVzZSBuYW1lcyBjb21lCitmcm9tIHJpZGVzIGF0IHRoZSBsb2NhbCBhbXVzZW1lbnQgcGFyay4KKworVGhlIG5ldyBjaGlwcyBzdXBwb3J0IGJvdGggZXRoZXJuZXQgKDEuNUspIGFuZCBGRERJICg0LjVLKSBwYWNrZXQgc2l6ZXMhCitUaGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIGV0aGVybmV0IHBhY2tldHMgYmVjYXVzZSBvZiB0aGUgc2tidWZmIGFsbG9jYXRpb24KK2xpbWl0IG9mIDRLLgorKi8KKworLyogVGhpcyB0YWJsZSBkcml2ZXMgdGhlIFBDSSBwcm9iZSByb3V0aW5lcy4gIEl0J3MgbW9zdGx5IGJvaWxlcnBsYXRlIGluIGFsbAorICAgb2YgdGhlIGRyaXZlcnMsIGFuZCB3aWxsIGxpa2VseSBiZSBwcm92aWRlZCBieSBzb21lIGZ1dHVyZSBrZXJuZWwuCisqLworZW51bSBwY2lfZmxhZ3NfYml0IHsKKwlQQ0lfVVNFU19JTz0xLCBQQ0lfVVNFU19NRU09MiwgUENJX1VTRVNfTUFTVEVSPTQsCisJUENJX0FERFIwPTB4MTA8PDAsIFBDSV9BRERSMT0weDEwPDwxLCBQQ0lfQUREUjI9MHgxMDw8MiwgUENJX0FERFIzPTB4MTA8PDMsCit9OworCitlbnVtIHsJSVNfVk9SVEVYPTEsIElTX0JPT01FUkFORz0yLCBJU19DWUNMT05FPTQsIElTX1RPUk5BRE89OCwKKwlFRVBST01fOEJJVD0weDEwLAkvKiBBS1BNOiBVc2VzIDB4MjMwIGFzIHRoZSBiYXNlIGJpdG1hcHMgZm9yIEVFUFJPTSByZWFkcyAqLworCUhBU19QV1JfQ1RSTD0weDIwLCBIQVNfTUlJPTB4NDAsIEhBU19OV0FZPTB4ODAsIEhBU19DQl9GTlM9MHgxMDAsCisJSU5WRVJUX01JSV9QV1I9MHgyMDAsIElOVkVSVF9MRURfUFdSPTB4NDAwLCBNQVhfQ09MTElTSU9OX1JFU0VUPTB4ODAwLAorCUVFUFJPTV9PRkZTRVQ9MHgxMDAwLCBIQVNfSFdDS1NNPTB4MjAwMCwgV05PX1hDVlJfUFdSPTB4NDAwMCwKKwlFWFRSQV9QUkVBTUJMRT0weDgwMDAsIEVFUFJPTV9SRVNFVD0weDEwMDAwLCB9OworCitlbnVtIHZvcnRleF9jaGlwcyB7CisJQ0hfM0M1OTAgPSAwLAorCUNIXzNDNTkyLAorCUNIXzNDNTk3LAorCUNIXzNDNTk1XzEsCisJQ0hfM0M1OTVfMiwKKworCUNIXzNDNTk1XzMsCisJQ0hfM0M5MDBfMSwKKwlDSF8zQzkwMF8yLAorCUNIXzNDOTAwXzMsCisJQ0hfM0M5MDBfNCwKKworCUNIXzNDOTAwXzUsCisJQ0hfM0M5MDBCX0ZMLAorCUNIXzNDOTA1XzEsCisJQ0hfM0M5MDVfMiwKKwlDSF8zQzkwNUJfMSwKKworCUNIXzNDOTA1Ql8yLAorCUNIXzNDOTA1Ql9GWCwKKwlDSF8zQzkwNUMsCisJQ0hfM0M5MjAyLAorCUNIXzNDOTgwLAorCUNIXzNDOTgwNSwKKworCUNIXzNDU09ITzEwMF9UWCwKKwlDSF8zQzU1NSwKKwlDSF8zQzU1NiwKKwlDSF8zQzU1NkIsCisJQ0hfM0M1NzUsCisKKwlDSF8zQzU3NV8xLAorCUNIXzNDQ0ZFNTc1LAorCUNIXzNDQ0ZFNTc1Q1QsCisJQ0hfM0NDRkU2NTYsCisJQ0hfM0NDRkVNNjU2LAorCisJQ0hfM0NDRkVNNjU2XzEsCisJQ0hfM0M0NTAsCisJQ0hfM0M5MjAsCisJQ0hfM0M5ODJBLAorCUNIXzNDOTgyQiwKKworCUNIXzkwNUJUNCwKKwlDSF85MjBCX0VNQl9XTk0sCit9OworCisKKy8qIG5vdGU6IHRoaXMgYXJyYXkgZGlyZWN0bHkgaW5kZXhlZCBieSBhYm92ZSBlbnVtcywgYW5kIE1VU1QKKyAqIGJlIGtlcHQgaW4gc3luYyB3aXRoIGJvdGggdGhlIGVudW1zIGFib3ZlLCBhbmQgdGhlIFBDSSBkZXZpY2UKKyAqIHRhYmxlIGJlbG93CisgKi8KK3N0YXRpYyBzdHJ1Y3Qgdm9ydGV4X2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgZmxhZ3M7CisJaW50IGRydl9mbGFnczsKKwlpbnQgaW9fc2l6ZTsKK30gdm9ydGV4X2luZm9fdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IjNjNTkwIFZvcnRleCAxME1icHMiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX1ZPUlRFWCwgMzIsIH0sCisJeyIzYzU5MiBFSVNBIDEwTWJwcyBEZW1vbi9Wb3J0ZXgiLAkJCQkJLyogQUtQTTogZnJvbSBEb24ncyAzYzU5eF9jYi5jIDAuNDlIICovCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfVk9SVEVYLCAzMiwgfSwKKwl7IjNjNTk3IEVJU0EgRmFzdCBEZW1vbi9Wb3J0ZXgiLAkJCQkJLyogQUtQTTogZnJvbSBEb24ncyAzYzU5eF9jYi5jIDAuNDlIICovCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfVk9SVEVYLCAzMiwgfSwKKwl7IjNjNTk1IFZvcnRleCAxMDBiYXNlVHgiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX1ZPUlRFWCwgMzIsIH0sCisJeyIzYzU5NSBWb3J0ZXggMTAwYmFzZVQ0IiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19WT1JURVgsIDMyLCB9LAorCisJeyIzYzU5NSBWb3J0ZXggMTAwYmFzZS1NSUkiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX1ZPUlRFWCwgMzIsIH0sCisJeyIzYzkwMCBCb29tZXJhbmcgMTBiYXNlVCIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQk9PTUVSQU5HfEVFUFJPTV9SRVNFVCwgNjQsIH0sCisJeyIzYzkwMCBCb29tZXJhbmcgMTBNYnBzIENvbWJvIiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19CT09NRVJBTkd8RUVQUk9NX1JFU0VULCA2NCwgfSwKKwl7IjNjOTAwIEN5Y2xvbmUgMTBNYnBzIFRQTyIsCQkJCQkJLyogQUtQTTogZnJvbSBEb24ncyAwLjk5TSAqLworCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX0NZQ0xPTkV8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCXsiM2M5MDAgQ3ljbG9uZSAxME1icHMgQ29tYm8iLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX0NZQ0xPTkV8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCisJeyIzYzkwMCBDeWNsb25lIDEwTWJwcyBUUEMiLAkJCQkJCS8qIEFLUE06IGZyb20gRG9uJ3MgMC45OU0gKi8KKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19DWUNMT05FfEhBU19IV0NLU00sIDEyOCwgfSwKKwl7IjNjOTAwQi1GTCBDeWNsb25lIDEwYmFzZS1GTCIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQ1lDTE9ORXxIQVNfSFdDS1NNLCAxMjgsIH0sCisJeyIzYzkwNSBCb29tZXJhbmcgMTAwYmFzZVR4IiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19CT09NRVJBTkd8SEFTX01JSXxFRVBST01fUkVTRVQsIDY0LCB9LAorCXsiM2M5MDUgQm9vbWVyYW5nIDEwMGJhc2VUNCIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQk9PTUVSQU5HfEhBU19NSUl8RUVQUk9NX1JFU0VULCA2NCwgfSwKKwl7IjNjOTA1QiBDeWNsb25lIDEwMGJhc2VUeCIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQ1lDTE9ORXxIQVNfTldBWXxIQVNfSFdDS1NNfEVYVFJBX1BSRUFNQkxFLCAxMjgsIH0sCisKKwl7IjNjOTA1QiBDeWNsb25lIDEwLzEwMC9CTkMiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX0NZQ0xPTkV8SEFTX05XQVl8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCXsiM2M5MDVCLUZYIEN5Y2xvbmUgMTAwYmFzZUZ4IiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19DWUNMT05FfEhBU19IV0NLU00sIDEyOCwgfSwKKwl7IjNjOTA1QyBUb3JuYWRvIiwKKwlQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX1RPUk5BRE98SEFTX05XQVl8SEFTX0hXQ0tTTXxFWFRSQV9QUkVBTUJMRSwgMTI4LCB9LAorCXsiM2M5MjBCLUVNQi1XTk0gKEFUSSBSYWRlb24gOTEwMCBJR1ApIiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19UT1JOQURPfEhBU19NSUl8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCXsiM2M5ODAgQ3ljbG9uZSIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQ1lDTE9ORXxIQVNfSFdDS1NNLCAxMjgsIH0sCisKKwl7IjNjOTgwQyBQeXRob24tVCIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQ1lDTE9ORXxIQVNfTldBWXxIQVNfSFdDS1NNLCAxMjgsIH0sCisJeyIzY1NPSE8xMDAtVFggSHVycmljYW5lIiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19DWUNMT05FfEhBU19OV0FZfEhBU19IV0NLU00sIDEyOCwgfSwKKwl7IjNjNTU1IExhcHRvcCBIdXJyaWNhbmUiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX0NZQ0xPTkV8RUVQUk9NXzhCSVR8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCXsiM2M1NTYgTGFwdG9wIFRvcm5hZG8iLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX1RPUk5BRE98SEFTX05XQVl8RUVQUk9NXzhCSVR8SEFTX0NCX0ZOU3xJTlZFUlRfTUlJX1BXUnwKKwkJCQkJCQkJCUhBU19IV0NLU00sIDEyOCwgfSwKKwl7IjNjNTU2QiBMYXB0b3AgSHVycmljYW5lIiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19UT1JOQURPfEhBU19OV0FZfEVFUFJPTV9PRkZTRVR8SEFTX0NCX0ZOU3xJTlZFUlRfTUlJX1BXUnwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOT19YQ1ZSX1BXUnxIQVNfSFdDS1NNLCAxMjgsIH0sCisKKwl7IjNjNTc1IFtNZWdhaGVydHpdIDEwLzEwMCBMQU4gCUNhcmRCdXMiLAorCVBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQk9PTUVSQU5HfEhBU19NSUl8RUVQUk9NXzhCSVQsIDEyOCwgfSwKKwl7IjNjNTc1IEJvb21lcmFuZyBDYXJkQnVzIiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19CT09NRVJBTkd8SEFTX01JSXxFRVBST01fOEJJVCwgMTI4LCB9LAorCXsiM0NDRkU1NzVCVCBDeWNsb25lIENhcmRCdXMiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX0NZQ0xPTkV8SEFTX05XQVl8SEFTX0NCX0ZOU3xFRVBST01fOEJJVHwKKwkJCQkJCQkJCUlOVkVSVF9MRURfUFdSfEhBU19IV0NLU00sIDEyOCwgfSwKKwl7IjNDQ0ZFNTc1Q1QgVG9ybmFkbyBDYXJkQnVzIiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19UT1JOQURPfEhBU19OV0FZfEhBU19DQl9GTlN8RUVQUk9NXzhCSVR8SU5WRVJUX01JSV9QV1J8CisJCQkJCQkJCQlNQVhfQ09MTElTSU9OX1JFU0VUfEhBU19IV0NLU00sIDEyOCwgfSwKKwl7IjNDQ0ZFNjU2IEN5Y2xvbmUgQ2FyZEJ1cyIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQ1lDTE9ORXxIQVNfTldBWXxIQVNfQ0JfRk5TfEVFUFJPTV84QklUfElOVkVSVF9NSUlfUFdSfAorCQkJCQkJCQkJSU5WRVJUX0xFRF9QV1J8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCisJeyIzQ0NGRU02NTZCIEN5Y2xvbmUrV2lubW9kZW0gQ2FyZEJ1cyIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQ1lDTE9ORXxIQVNfTldBWXxIQVNfQ0JfRk5TfEVFUFJPTV84QklUfElOVkVSVF9NSUlfUFdSfAorCQkJCQkJCQkJSU5WRVJUX0xFRF9QV1J8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCXsiM0NYRkVNNjU2QyBUb3JuYWRvK1dpbm1vZGVtIENhcmRCdXMiLAkJCS8qIEZyb20gcGNtY2lhLWNzLTMuMS41ICovCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfVE9STkFET3xIQVNfTldBWXxIQVNfQ0JfRk5TfEVFUFJPTV84QklUfElOVkVSVF9NSUlfUFdSfAorCQkJCQkJCQkJTUFYX0NPTExJU0lPTl9SRVNFVHxIQVNfSFdDS1NNLCAxMjgsIH0sCisJeyIzYzQ1MCBIb21lUE5BIFRvcm5hZG8iLAkJCQkJCS8qIEFLUE06IGZyb20gRG9uJ3MgMC45OVEgKi8KKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19UT1JOQURPfEhBU19OV0FZfEhBU19IV0NLU00sIDEyOCwgfSwKKwl7IjNjOTIwIFRvcm5hZG8iLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX1RPUk5BRE98SEFTX05XQVl8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCXsiM2M5ODIgSHlkcmEgRHVhbCBQb3J0IEEiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX1RPUk5BRE98SEFTX0hXQ0tTTXxIQVNfTldBWSwgMTI4LCB9LAorCisJeyIzYzk4MiBIeWRyYSBEdWFsIFBvcnQgQiIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfVE9STkFET3xIQVNfSFdDS1NNfEhBU19OV0FZLCAxMjgsIH0sCisJeyIzYzkwNUItVDQiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX0NZQ0xPTkV8SEFTX05XQVl8SEFTX0hXQ0tTTXxFWFRSQV9QUkVBTUJMRSwgMTI4LCB9LAorCXsiM2M5MjBCLUVNQi1XTk0gVG9ybmFkbyIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfVE9STkFET3xIQVNfTldBWXxIQVNfSFdDS1NNLCAxMjgsIH0sCisKKwl7TlVMTCx9LCAvKiBOVUxMIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZvcnRleF9wY2lfdGJsW10gPSB7CisJeyAweDEwQjcsIDB4NTkwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M1OTAgfSwKKwl7IDB4MTBCNywgMHg1OTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzU5MiB9LAorCXsgMHgxMEI3LCAweDU5NzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDNTk3IH0sCisJeyAweDEwQjcsIDB4NTk1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M1OTVfMSB9LAorCXsgMHgxMEI3LCAweDU5NTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDNTk1XzIgfSwKKworCXsgMHgxMEI3LCAweDU5NTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDNTk1XzMgfSwKKwl7IDB4MTBCNywgMHg5MDAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkwMF8xIH0sCisJeyAweDEwQjcsIDB4OTAwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M5MDBfMiB9LAorCXsgMHgxMEI3LCAweDkwMDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDOTAwXzMgfSwKKwl7IDB4MTBCNywgMHg5MDA1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkwMF80IH0sCisKKwl7IDB4MTBCNywgMHg5MDA2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkwMF81IH0sCisJeyAweDEwQjcsIDB4OTAwQSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M5MDBCX0ZMIH0sCisJeyAweDEwQjcsIDB4OTA1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M5MDVfMSB9LAorCXsgMHgxMEI3LCAweDkwNTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDOTA1XzIgfSwKKwl7IDB4MTBCNywgMHg5MDU1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkwNUJfMSB9LAorCisJeyAweDEwQjcsIDB4OTA1OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M5MDVCXzIgfSwKKwl7IDB4MTBCNywgMHg5MDVBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkwNUJfRlggfSwKKwl7IDB4MTBCNywgMHg5MjAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkwNUMgfSwKKwl7IDB4MTBCNywgMHg5MjAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkyMDIgfSwKKwl7IDB4MTBCNywgMHg5ODAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzk4MCB9LAorCXsgMHgxMEI3LCAweDk4MDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDOTgwNSB9LAorCisJeyAweDEwQjcsIDB4NzY0NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0NTT0hPMTAwX1RYIH0sCisJeyAweDEwQjcsIDB4NTA1NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M1NTUgfSwKKwl7IDB4MTBCNywgMHg2MDU1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzU1NiB9LAorCXsgMHgxMEI3LCAweDYwNTYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDNTU2QiB9LAorCXsgMHgxMEI3LCAweDViNTcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDNTc1IH0sCisKKwl7IDB4MTBCNywgMHg1MDU3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzU3NV8xIH0sCisJeyAweDEwQjcsIDB4NTE1NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0NDRkU1NzUgfSwKKwl7IDB4MTBCNywgMHg1MjU3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQ0NGRTU3NUNUIH0sCisJeyAweDEwQjcsIDB4NjU2MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0NDRkU2NTYgfSwKKwl7IDB4MTBCNywgMHg2NTYyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQ0NGRU02NTYgfSwKKworCXsgMHgxMEI3LCAweDY1NjQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDQ0ZFTTY1Nl8xIH0sCisJeyAweDEwQjcsIDB4NDUwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M0NTAgfSwKKwl7IDB4MTBCNywgMHg5MjAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkyMCB9LAorCXsgMHgxMEI3LCAweDEyMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDOTgyQSB9LAorCXsgMHgxMEI3LCAweDEyMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDOTgyQiB9LAorCisJeyAweDEwQjcsIDB4OTA1NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfOTA1QlQ0IH0sCisJeyAweDEwQjcsIDB4OTIxMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfOTIwQl9FTUJfV05NIH0sCisKKwl7MCx9CQkJCQkJLyogMCB0ZXJtaW5hdGVkIGxpc3QuICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHZvcnRleF9wY2lfdGJsKTsKKworCisvKiBPcGVyYXRpb25hbCBkZWZpbml0aW9ucy4KKyAgIFRoZXNlIGFyZSBub3QgdXNlZCBieSBvdGhlciBjb21waWxhdGlvbiB1bml0cyBhbmQgdGh1cyBhcmUgbm90CisgICBleHBvcnRlZCBpbiBhICIuaCIgZmlsZS4KKworICAgRmlyc3QgdGhlIHdpbmRvd3MuICBUaGVyZSBhcmUgZWlnaHQgcmVnaXN0ZXIgd2luZG93cywgd2l0aCB0aGUgY29tbWFuZAorICAgYW5kIHN0YXR1cyByZWdpc3RlcnMgYXZhaWxhYmxlIGluIGVhY2guCisgICAqLworI2RlZmluZSBFTDNXSU5ET1cod2luX251bSkgb3V0dyhTZWxlY3RXaW5kb3cgKyAod2luX251bSksIGlvYWRkciArIEVMM19DTUQpCisjZGVmaW5lIEVMM19DTUQgMHgwZQorI2RlZmluZSBFTDNfU1RBVFVTIDB4MGUKKworLyogVGhlIHRvcCBmaXZlIGJpdHMgd3JpdHRlbiB0byBFTDNfQ01EIGFyZSBhIGNvbW1hbmQsIHRoZSBsb3dlcgorICAgMTEgYml0cyBhcmUgdGhlIHBhcmFtZXRlciwgaWYgYXBwbGljYWJsZS4KKyAgIE5vdGUgdGhhdCAxMSBwYXJhbWV0ZXJzIGJpdHMgd2FzIGZpbmUgZm9yIGV0aGVybmV0LCBidXQgdGhlIG5ldyBjaGlwCisgICBjYW4gaGFuZGxlIEZEREkgbGVuZ3RoIGZyYW1lcyAofjQ1MDAgb2N0ZXRzKSBhbmQgbm93IHBhcmFtZXRlcnMgY291bnQKKyAgIDMyLWJpdCAnRHdvcmRzJyByYXRoZXIgdGhhbiBvY3RldHMuICovCisKK2VudW0gdm9ydGV4X2NtZCB7CisJVG90YWxSZXNldCA9IDA8PDExLCBTZWxlY3RXaW5kb3cgPSAxPDwxMSwgU3RhcnRDb2F4ID0gMjw8MTEsCisJUnhEaXNhYmxlID0gMzw8MTEsIFJ4RW5hYmxlID0gNDw8MTEsIFJ4UmVzZXQgPSA1PDwxMSwKKwlVcFN0YWxsID0gNjw8MTEsIFVwVW5zdGFsbCA9ICg2PDwxMSkrMSwKKwlEb3duU3RhbGwgPSAoNjw8MTEpKzIsIERvd25VbnN0YWxsID0gKDY8PDExKSszLAorCVJ4RGlzY2FyZCA9IDg8PDExLCBUeEVuYWJsZSA9IDk8PDExLCBUeERpc2FibGUgPSAxMDw8MTEsIFR4UmVzZXQgPSAxMTw8MTEsCisJRmFrZUludHIgPSAxMjw8MTEsIEFja0ludHIgPSAxMzw8MTEsIFNldEludHJFbmIgPSAxNDw8MTEsCisJU2V0U3RhdHVzRW5iID0gMTU8PDExLCBTZXRSeEZpbHRlciA9IDE2PDwxMSwgU2V0UnhUaHJlc2hvbGQgPSAxNzw8MTEsCisJU2V0VHhUaHJlc2hvbGQgPSAxODw8MTEsIFNldFR4U3RhcnQgPSAxOTw8MTEsCisJU3RhcnRETUFVcCA9IDIwPDwxMSwgU3RhcnRETUFEb3duID0gKDIwPDwxMSkrMSwgU3RhdHNFbmFibGUgPSAyMTw8MTEsCisJU3RhdHNEaXNhYmxlID0gMjI8PDExLCBTdG9wQ29heCA9IDIzPDwxMSwgU2V0RmlsdGVyQml0ID0gMjU8PDExLH07CisKKy8qIFRoZSBTZXRSeEZpbHRlciBjb21tYW5kIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzOiAqLworZW51bSBSeEZpbHRlciB7CisJUnhTdGF0aW9uID0gMSwgUnhNdWx0aWNhc3QgPSAyLCBSeEJyb2FkY2FzdCA9IDQsIFJ4UHJvbSA9IDggfTsKKworLyogQml0cyBpbiB0aGUgZ2VuZXJhbCBzdGF0dXMgcmVnaXN0ZXIuICovCitlbnVtIHZvcnRleF9zdGF0dXMgeworCUludExhdGNoID0gMHgwMDAxLCBIb3N0RXJyb3IgPSAweDAwMDIsIFR4Q29tcGxldGUgPSAweDAwMDQsCisJVHhBdmFpbGFibGUgPSAweDAwMDgsIFJ4Q29tcGxldGUgPSAweDAwMTAsIFJ4RWFybHkgPSAweDAwMjAsCisJSW50UmVxID0gMHgwMDQwLCBTdGF0c0Z1bGwgPSAweDAwODAsCisJRE1BRG9uZSA9IDE8PDgsIERvd25Db21wbGV0ZSA9IDE8PDksIFVwQ29tcGxldGUgPSAxPDwxMCwKKwlETUFJblByb2dyZXNzID0gMTw8MTEsCQkJLyogRE1BIGNvbnRyb2xsZXIgaXMgc3RpbGwgYnVzeS4qLworCUNtZEluUHJvZ3Jlc3MgPSAxPDwxMiwJCQkvKiBFTDNfQ01EIGlzIHN0aWxsIGJ1c3kuKi8KK307CisKKy8qIFJlZ2lzdGVyIHdpbmRvdyAxIG9mZnNldHMsIHRoZSB3aW5kb3cgdXNlZCBpbiBub3JtYWwgb3BlcmF0aW9uLgorICAgT24gdGhlIFZvcnRleCB0aGlzIHdpbmRvdyBpcyBhbHdheXMgbWFwcGVkIGF0IG9mZnNldHMgMHgxMC0weDFmLiAqLworZW51bSBXaW5kb3cxIHsKKwlUWF9GSUZPID0gMHgxMCwgIFJYX0ZJRk8gPSAweDEwLCAgUnhFcnJvcnMgPSAweDE0LAorCVJ4U3RhdHVzID0gMHgxOCwgIFRpbWVyPTB4MUEsIFR4U3RhdHVzID0gMHgxQiwKKwlUeEZyZWUgPSAweDFDLCAvKiBSZW1haW5pbmcgZnJlZSBieXRlcyBpbiBUeCBidWZmZXIuICovCit9OworZW51bSBXaW5kb3cwIHsKKwlXbjBFZXByb21DbWQgPSAxMCwJCS8qIFdpbmRvdyAwOiBFRVBST00gY29tbWFuZCByZWdpc3Rlci4gKi8KKwlXbjBFZXByb21EYXRhID0gMTIsCQkvKiBXaW5kb3cgMDogRUVQUk9NIHJlc3VsdHMgcmVnaXN0ZXIuICovCisJSW50clN0YXR1cz0weDBFLAkJLyogVmFsaWQgaW4gYWxsIHdpbmRvd3MuICovCit9OworZW51bSBXaW4wX0VFUFJPTV9iaXRzIHsKKwlFRVBST01fUmVhZCA9IDB4ODAsIEVFUFJPTV9XUklURSA9IDB4NDAsIEVFUFJPTV9FUkFTRSA9IDB4QzAsCisJRUVQUk9NX0VXRU5CID0gMHgzMCwJCS8qIEVuYWJsZSBlcmFzaW5nL3dyaXRpbmcgZm9yIDEwIG1zZWMuICovCisJRUVQUk9NX0VXRElTID0gMHgwMCwJCS8qIERpc2FibGUgRVdFTkIgYmVmb3JlIDEwIG1zZWMgdGltZW91dC4gKi8KK307CisvKiBFRVBST00gbG9jYXRpb25zLiAqLworZW51bSBlZXByb21fb2Zmc2V0IHsKKwlQaHlzQWRkcjAxPTAsIFBoeXNBZGRyMjM9MSwgUGh5c0FkZHI0NT0yLCBNb2RlbElEPTMsCisJRXRoZXJMaW5rM0lEPTcsIElGWGN2cklPPTgsIElSUUxpbmU9OSwKKwlOb2RlQWRkcjAxPTEwLCBOb2RlQWRkcjIzPTExLCBOb2RlQWRkcjQ1PTEyLAorCURyaXZlclR1bmU9MTMsIENoZWNrc3VtPTE1fTsKKworZW51bSBXaW5kb3cyIHsJCQkvKiBXaW5kb3cgMi4gKi8KKwlXbjJfUmVzZXRPcHRpb25zPTEyLAorfTsKK2VudW0gV2luZG93MyB7CQkJLyogV2luZG93IDM6IE1BQy9jb25maWcgYml0cy4gKi8KKwlXbjNfQ29uZmlnPTAsIFduM19NYXhQa3RTaXplPTQsIFduM19NQUNfQ3RybD02LCBXbjNfT3B0aW9ucz04LAorfTsKKworI2RlZmluZSBCRkVYVCh2YWx1ZSwgb2Zmc2V0LCBiaXRjb3VudCkgIFwKKyAgICAoKCgodW5zaWduZWQgbG9uZykodmFsdWUpKSA+PiAob2Zmc2V0KSkgJiAoKDEgPDwgKGJpdGNvdW50KSkgLSAxKSkKKworI2RlZmluZSBCRklOUyhsaHMsIHJocywgb2Zmc2V0LCBiaXRjb3VudCkJCQkJCVwKKwkoKChsaHMpICYgfigoKCgxIDw8IChiaXRjb3VudCkpIC0gMSkpIDw8IChvZmZzZXQpKSkgfAlcCisJKCgocmhzKSAmICgoMSA8PCAoYml0Y291bnQpKSAtIDEpKSA8PCAob2Zmc2V0KSkpCisKKyNkZWZpbmUgUkFNX1NJWkUodikJCUJGRVhUKHYsIDAsIDMpCisjZGVmaW5lIFJBTV9XSURUSCh2KQlCRkVYVCh2LCAzLCAxKQorI2RlZmluZSBSQU1fU1BFRUQodikJQkZFWFQodiwgNCwgMikKKyNkZWZpbmUgUk9NX1NJWkUodikJCUJGRVhUKHYsIDYsIDIpCisjZGVmaW5lIFJBTV9TUExJVCh2KQlCRkVYVCh2LCAxNiwgMikKKyNkZWZpbmUgWENWUih2KQkJCUJGRVhUKHYsIDIwLCA0KQorI2RlZmluZSBBVVRPU0VMRUNUKHYpCUJGRVhUKHYsIDI0LCAxKQorCitlbnVtIFdpbmRvdzQgewkJLyogV2luZG93IDQ6IFhjdnIvbWVkaWEgYml0cy4gKi8KKwlXbjRfRklGT0RpYWcgPSA0LCBXbjRfTmV0RGlhZyA9IDYsIFduNF9QaHlzaWNhbE1nbXQ9OCwgV240X01lZGlhID0gMTAsCit9OworZW51bSBXaW40X01lZGlhX2JpdHMgeworCU1lZGlhX1NRRSA9IDB4MDAwOCwJCS8qIEVuYWJsZSBTUUUgZXJyb3IgY291bnRpbmcgZm9yIEFVSS4gKi8KKwlNZWRpYV8xMFRQID0gMHgwMEMwLAkvKiBFbmFibGUgbGluayBiZWF0IGFuZCBqYWJiZXIgZm9yIDEwYmFzZVQuICovCisJTWVkaWFfTG5rID0gMHgwMDgwLAkJLyogRW5hYmxlIGp1c3QgbGluayBiZWF0IGZvciAxMDBUWC8xMDBGWC4gKi8KKwlNZWRpYV9MbmtCZWF0ID0gMHgwODAwLAorfTsKK2VudW0gV2luZG93NyB7CQkJCQkvKiBXaW5kb3cgNzogQnVzIE1hc3RlciBjb250cm9sLiAqLworCVduN19NYXN0ZXJBZGRyID0gMCwgV243X1ZsYW5FdGhlclR5cGU9NCwgV243X01hc3RlckxlbiA9IDYsCisJV243X01hc3RlclN0YXR1cyA9IDEyLAorfTsKKy8qIEJvb21lcmFuZyBidXMgbWFzdGVyIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworZW51bSBNYXN0ZXJDdHJsIHsKKwlQa3RTdGF0dXMgPSAweDIwLCBEb3duTGlzdFB0ciA9IDB4MjQsIEZyYWdBZGRyID0gMHgyOCwgRnJhZ0xlbiA9IDB4MmMsCisJVHhGcmVlVGhyZXNob2xkID0gMHgyZiwgVXBQa3RTdGF0dXMgPSAweDMwLCBVcExpc3RQdHIgPSAweDM4LAorfTsKKworLyogVGhlIFJ4IGFuZCBUeCBkZXNjcmlwdG9yIGxpc3RzLgorICAgQ2F1dGlvbiBBbHBoYSBoYWNrZXJzOiB0aGVzZSB0eXBlcyBhcmUgMzIgYml0cyEgIE5vdGUgYWxzbyB0aGUgOCBieXRlCisgICBhbGlnbm1lbnQgY29udHJhaW50IG9uIHR4X3JpbmdbXSBhbmQgcnhfcmluZ1tdLiAqLworI2RlZmluZSBMQVNUX0ZSQUcgCTB4ODAwMDAwMDAJCQkvKiBMYXN0IEFkZHIvTGVuIHBhaXIgaW4gZGVzY3JpcHRvci4gKi8KKyNkZWZpbmUgRE5fQ09NUExFVEUJMHgwMDAxMDAwMAkJCS8qIFRoaXMgcGFja2V0IGhhcyBiZWVuIGRvd25sb2FkZWQgKi8KK3N0cnVjdCBib29tX3J4X2Rlc2MgeworCXUzMiBuZXh0OwkJCQkJLyogTGFzdCBlbnRyeSBwb2ludHMgdG8gMC4gICAqLworCXMzMiBzdGF0dXM7CisJdTMyIGFkZHI7CQkJCQkvKiBVcCB0byA2MyBhZGRyL2xlbiBwYWlycyBwb3NzaWJsZS4gKi8KKwlzMzIgbGVuZ3RoOwkJCQkJLyogU2V0IExBU1RfRlJBRyB0byBpbmRpY2F0ZSBsYXN0IHBhaXIuICovCit9OworLyogVmFsdWVzIGZvciB0aGUgUnggc3RhdHVzIGVudHJ5LiAqLworZW51bSByeF9kZXNjX3N0YXR1cyB7CisJUnhEQ29tcGxldGU9MHgwMDAwODAwMCwgUnhERXJyb3I9MHg0MDAwLAorCS8qIFNlZSBib29tZXJhbmdfcngoKSBmb3IgYWN0dWFsIGVycm9yIGJpdHMgKi8KKwlJUENoa3N1bUVycj0xPDwyNSwgVENQQ2hrc3VtRXJyPTE8PDI2LCBVRFBDaGtzdW1FcnI9MTw8MjcsCisJSVBDaGtzdW1WYWxpZD0xPDwyOSwgVENQQ2hrc3VtVmFsaWQ9MTw8MzAsIFVEUENoa3N1bVZhbGlkPTE8PDMxLAorfTsKKworI2lmZGVmIE1BWF9TS0JfRlJBR1MKKyNkZWZpbmUgRE9fWkVST0NPUFkgMQorI2Vsc2UKKyNkZWZpbmUgRE9fWkVST0NPUFkgMAorI2VuZGlmCisKK3N0cnVjdCBib29tX3R4X2Rlc2MgeworCXUzMiBuZXh0OwkJCQkJLyogTGFzdCBlbnRyeSBwb2ludHMgdG8gMC4gICAqLworCXMzMiBzdGF0dXM7CQkJCQkvKiBiaXRzIDA6MTIgbGVuZ3RoLCBvdGhlcnMgc2VlIGJlbG93LiAgKi8KKyNpZiBET19aRVJPQ09QWQorCXN0cnVjdCB7CisJCXUzMiBhZGRyOworCQlzMzIgbGVuZ3RoOworCX0gZnJhZ1sxK01BWF9TS0JfRlJBR1NdOworI2Vsc2UKKwkJdTMyIGFkZHI7CisJCXMzMiBsZW5ndGg7CisjZW5kaWYKK307CisKKy8qIFZhbHVlcyBmb3IgdGhlIFR4IHN0YXR1cyBlbnRyeS4gKi8KK2VudW0gdHhfZGVzY19zdGF0dXMgeworCUNSQ0Rpc2FibGU9MHgyMDAwLCBUeERDb21wbGV0ZT0weDgwMDAsCisJQWRkSVBDaGtzdW09MHgwMjAwMDAwMCwgQWRkVENQQ2hrc3VtPTB4MDQwMDAwMDAsIEFkZFVEUENoa3N1bT0weDA4MDAwMDAwLAorCVR4SW50clVwbG9hZGVkPTB4ODAwMDAwMDAsCQkvKiBJUlEgd2hlbiBpbiBGSUZPLCBidXQgbWF5YmUgbm90IHNlbnQuICovCit9OworCisvKiBDaGlwIGZlYXR1cmVzIHdlIGNhcmUgYWJvdXQgaW4gdnAtPmNhcGFiaWxpdGllcywgcmVhZCBmcm9tIHRoZSBFRVBST00uICovCitlbnVtIENoaXBDYXBzIHsgQ2FwQnVzTWFzdGVyPTB4MjAsIENhcFB3ck1nbXQ9MHgyMDAwIH07CisKK3N0cnVjdCB2b3J0ZXhfZXh0cmFfc3RhdHMgeworICAgICAgICB1bnNpZ25lZCBsb25nIHR4X2RlZmVycmVkOworICAgICAgICB1bnNpZ25lZCBsb25nIHR4X211bHRpcGxlX2NvbGxpc2lvbnM7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgcnhfYmFkX3NzZDsKK307CisKK3N0cnVjdCB2b3J0ZXhfcHJpdmF0ZSB7CisJLyogVGhlIFJ4IGFuZCBUeCByaW5ncyBzaG91bGQgYmUgcXVhZC13b3JkLWFsaWduZWQuICovCisJc3RydWN0IGJvb21fcnhfZGVzYyogcnhfcmluZzsKKwlzdHJ1Y3QgYm9vbV90eF9kZXNjKiB0eF9yaW5nOworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKwkvKiBUaGUgYWRkcmVzc2VzIG9mIHRyYW5zbWl0LSBhbmQgcmVjZWl2ZS1pbi1wbGFjZSBza2J1ZmZzLiAqLworCXN0cnVjdCBza19idWZmKiByeF9za2J1ZmZbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZiogdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisJdW5zaWduZWQgaW50IGN1cl9yeCwgY3VyX3R4OwkJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCisJdW5zaWduZWQgaW50IGRpcnR5X3J4LCBkaXJ0eV90eDsJLyogVGhlIHJpbmcgZW50cmllcyB0byBiZSBmcmVlKCllZC4gKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJCS8qIEdlbmVyaWMgc3RhdHMgKi8KKwlzdHJ1Y3Qgdm9ydGV4X2V4dHJhX3N0YXRzIHhzdGF0czsJLyogTklDLXNwZWNpZmljIGV4dHJhIHN0YXRzICovCisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsJCQkJLyogUGFja2V0IGJlaW5nIGVhdGVuIGJ5IGJ1cyBtYXN0ZXIgY3RybC4gICovCisJZG1hX2FkZHJfdCB0eF9za2JfZG1hOwkJCQkvKiBBbGxvY2F0ZWQgRE1BIGFkZHJlc3MgZm9yIGJ1cyBtYXN0ZXIgY3RybCBETUEuICAgKi8KKworCS8qIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGluZm9ybWF0aW9uLiAqLworCXN0cnVjdCBkZXZpY2UgKmdlbmRldjsKKwljaGFyIF9faW9tZW0gKmNiX2ZuX2Jhc2U7CQkvKiBDYXJkQnVzIGZ1bmN0aW9uIHN0YXR1cyBhZGRyIHNwYWNlLiAqLworCisJLyogU29tZSB2YWx1ZXMgaGVyZSBvbmx5IGZvciBwZXJmb3JtYW5jZSBldmFsdWF0aW9uIGFuZCBwYXRoLWNvdmVyYWdlICovCisJaW50IHJ4X25vY29weSwgcnhfY29weSwgcXVldWVkX3BhY2tldCwgcnhfY3N1bWhpdHM7CisJaW50IGNhcmRfaWR4OworCisJLyogVGhlIHJlbWFpbmRlciBhcmUgcmVsYXRlZCB0byBjaGlwIHN0YXRlLCBtb3N0bHkgbWVkaWEgc2VsZWN0aW9uLiAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkJCS8qIE1lZGlhIHNlbGVjdGlvbiB0aW1lci4gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCByeF9vb21fdGltZXI7CQkvKiBSeCBza2IgYWxsb2NhdGlvbiByZXRyeSB0aW1lciAqLworCWludCBvcHRpb25zOwkJCQkJCS8qIFVzZXItc2V0dGFibGUgbWlzYy4gZHJpdmVyIG9wdGlvbnMuICovCisJdW5zaWduZWQgaW50IG1lZGlhX292ZXJyaWRlOjQsIAkJLyogUGFzc2VkLWluIG1lZGlhIHR5cGUuICovCisJCWRlZmF1bHRfbWVkaWE6NCwJCQkJLyogUmVhZCBmcm9tIHRoZSBFRVBST00vV24zX0NvbmZpZy4gKi8KKwkJZnVsbF9kdXBsZXg6MSwgZm9yY2VfZmQ6MSwgYXV0b3NlbGVjdDoxLAorCQlidXNfbWFzdGVyOjEsCQkJCQkvKiBWb3J0ZXggY2FuIG9ubHkgZG8gYSBmcmFnbWVudCBidXMtbS4gKi8KKwkJZnVsbF9idXNfbWFzdGVyX3R4OjEsIGZ1bGxfYnVzX21hc3Rlcl9yeDoyLCAvKiBCb29tZXJhbmcgICovCisJCWZsb3dfY3RybDoxLAkJCQkJLyogVXNlIDgwMi4zeCBmbG93IGNvbnRyb2wgKFBBVVNFIG9ubHkpICovCisJCXBhcnRuZXJfZmxvd19jdHJsOjEsCQkJLyogUGFydG5lciBzdXBwb3J0cyBmbG93IGNvbnRyb2wgKi8KKwkJaGFzX253YXk6MSwKKwkJZW5hYmxlX3dvbDoxLAkJCQkJLyogV2FrZS1vbi1MQU4gaXMgZW5hYmxlZCAqLworCQlwbV9zdGF0ZV92YWxpZDoxLAkJCQkvKiBwY2lfZGV2LT5zYXZlZF9jb25maWdfc3BhY2UgaGFzIHNhbmUgY29udGVudHMgKi8KKwkJb3BlbjoxLAorCQltZWRpYWxvY2s6MSwKKwkJbXVzdF9mcmVlX3JlZ2lvbjoxLAkJCQkvKiBGbGFnOiBpZiB6ZXJvLCBDYXJkYnVzIG93bnMgdGhlIEkvTyByZWdpb24gKi8KKwkJbGFyZ2VfZnJhbWVzOjE7CQkJLyogYWNjZXB0IGxhcmdlIGZyYW1lcyAqLworCWludCBkcnZfZmxhZ3M7CisJdTE2IHN0YXR1c19lbmFibGU7CisJdTE2IGludHJfZW5hYmxlOworCXUxNiBhdmFpbGFibGVfbWVkaWE7CQkJCS8qIEZyb20gV24zX09wdGlvbnMuICovCisJdTE2IGNhcGFiaWxpdGllcywgaW5mbzEsIGluZm8yOwkJLyogVmFyaW91cywgZnJvbSBFRVBST00uICovCisJdTE2IGFkdmVydGlzaW5nOwkJCQkJLyogTldheSBtZWRpYSBhZHZlcnRpc2VtZW50ICovCisJdW5zaWduZWQgY2hhciBwaHlzWzJdOwkJCQkvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcy4gKi8KKwl1MTYgZGVmZXJyZWQ7CQkJCQkJLyogUmVzZW5kIHRoZXNlIGludGVycnVwdHMgd2hlbiB3ZQorCQkJCQkJCQkJCSAqIGJhbGUgZnJvbSB0aGUgSVNSICovCisJdTE2IGlvX3NpemU7CQkJCQkJLyogU2l6ZSBvZiBQQ0kgcmVnaW9uIChmb3IgcmVsZWFzZV9yZWdpb24pICovCisJc3BpbmxvY2tfdCBsb2NrOwkJCQkJLyogU2VyaWFsaXNlIGFjY2VzcyB0byBkZXZpY2UgJiBpdHMgdm9ydGV4X3ByaXZhdGUgKi8KKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpOwkJCQkvKiBNSUkgbGliIGhvb2tzL2luZm8gKi8KK307CisKKyNpZmRlZiBDT05GSUdfUENJCisjZGVmaW5lIERFVklDRV9QQ0koZGV2KSAoKChkZXYpLT5idXMgPT0gJnBjaV9idXNfdHlwZSkgPyB0b19wY2lfZGV2KChkZXYpKSA6IE5VTEwpCisjZWxzZQorI2RlZmluZSBERVZJQ0VfUENJKGRldikgTlVMTAorI2VuZGlmCisKKyNkZWZpbmUgVk9SVEVYX1BDSSh2cCkgKCgodnApLT5nZW5kZXYpID8gREVWSUNFX1BDSSgodnApLT5nZW5kZXYpIDogTlVMTCkKKworI2lmZGVmIENPTkZJR19FSVNBCisjZGVmaW5lIERFVklDRV9FSVNBKGRldikgKCgoZGV2KS0+YnVzID09ICZlaXNhX2J1c190eXBlKSA/IHRvX2Vpc2FfZGV2aWNlKChkZXYpKSA6IE5VTEwpCisjZWxzZQorI2RlZmluZSBERVZJQ0VfRUlTQShkZXYpIE5VTEwKKyNlbmRpZgorCisjZGVmaW5lIFZPUlRFWF9FSVNBKHZwKSAoKCh2cCktPmdlbmRldikgPyBERVZJQ0VfRUlTQSgodnApLT5nZW5kZXYpIDogTlVMTCkKKworLyogVGhlIGFjdGlvbiB0byB0YWtlIHdpdGggYSBtZWRpYSBzZWxlY3Rpb24gdGltZXIgdGljay4KKyAgIE5vdGUgdGhhdCB3ZSBkZXZpYXRlIGZyb20gdGhlIDNDb20gb3JkZXIgYnkgY2hlY2tpbmcgMTBiYXNlMiBiZWZvcmUgQVVJLgorICovCitlbnVtIHhjdnJfdHlwZXMgeworCVhDVlJfMTBiYXNlVD0wLCBYQ1ZSX0FVSSwgWENWUl8xMGJhc2VUT25seSwgWENWUl8xMGJhc2UyLCBYQ1ZSXzEwMGJhc2VUeCwKKwlYQ1ZSXzEwMGJhc2VGeCwgWENWUl9NSUk9NiwgWENWUl9OV0FZPTgsIFhDVlJfRXh0TUlJPTksIFhDVlJfRGVmYXVsdD0xMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWVkaWFfdGFibGUgeworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgaW50IG1lZGlhX2JpdHM6MTYsCQkvKiBCaXRzIHRvIHNldCBpbiBXbjRfTWVkaWEgcmVnaXN0ZXIuICovCisJCW1hc2s6OCwJCQkJCQkvKiBUaGUgdHJhbnNjZWl2ZXItcHJlc2VudCBiaXQgaW4gV24zX0NvbmZpZy4qLworCQluZXh0Ojg7CQkJCQkJLyogVGhlIG1lZGlhIHR5cGUgdG8gdHJ5IG5leHQuICovCisJaW50IHdhaXQ7CQkJCQkJLyogVGltZSBiZWZvcmUgd2UgY2hlY2sgbWVkaWEgc3RhdHVzLiAqLworfSBtZWRpYV90YmxbXSA9IHsKKyAgewkiMTBiYXNlVCIsICAgTWVkaWFfMTBUUCwweDA4LCBYQ1ZSXzEwYmFzZTIsICgxNCpIWikvMTB9LAorICB7ICIxME1icyBBVUkiLCBNZWRpYV9TUUUsIDB4MjAsIFhDVlJfRGVmYXVsdCwgKDEqSFopLzEwfSwKKyAgeyAidW5kZWZpbmVkIiwgMCwJCQkweDgwLCBYQ1ZSXzEwYmFzZVQsIDEwMDAwfSwKKyAgeyAiMTBiYXNlMiIsICAgMCwJCQkweDEwLCBYQ1ZSX0FVSSwJCSgxKkhaKS8xMH0sCisgIHsgIjEwMGJhc2VUWCIsIE1lZGlhX0xuaywgMHgwMiwgWENWUl8xMDBiYXNlRngsICgxNCpIWikvMTB9LAorICB7ICIxMDBiYXNlRlgiLCBNZWRpYV9MbmssIDB4MDQsIFhDVlJfTUlJLAkJKDE0KkhaKS8xMH0sCisgIHsgIk1JSSIsCQkgMCwJCQkweDQxLCBYQ1ZSXzEwYmFzZVQsIDMqSFogfSwKKyAgeyAidW5kZWZpbmVkIiwgMCwJCQkweDAxLCBYQ1ZSXzEwYmFzZVQsIDEwMDAwfSwKKyAgeyAiQXV0b25lZ290aWF0ZSIsIDAsCQkweDQxLCBYQ1ZSXzEwYmFzZVQsIDMqSFp9LAorICB7ICJNSUktRXh0ZXJuYWwiLAkgMCwJCTB4NDEsIFhDVlJfMTBiYXNlVCwgMypIWiB9LAorICB7ICJEZWZhdWx0IiwJIDAsCQkJMHhGRiwgWENWUl8xMGJhc2VULCAxMDAwMH0sCit9OworCitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyIHN0cltFVEhfR1NUUklOR19MRU5dOworfSBldGh0b29sX3N0YXRzX2tleXNbXSA9IHsKKwl7ICJ0eF9kZWZlcnJlZCIgfSwKKwl7ICJ0eF9tdWx0aXBsZV9jb2xsaXNpb25zIiB9LAorCXsgInJ4X2JhZF9zc2QiIH0sCit9OworCisvKiBudW1iZXIgb2YgRVRIVE9PTF9HU1RBVFMgdTY0J3MgKi8KKyNkZWZpbmUgVk9SVEVYX05VTV9TVEFUUyAgICAgMworCitzdGF0aWMgaW50IHZvcnRleF9wcm9iZTEoc3RydWN0IGRldmljZSAqZ2VuZGV2LCBsb25nIGlvYWRkciwgaW50IGlycSwKKwkJCQkgICBpbnQgY2hpcF9pZHgsIGludCBjYXJkX2lkeCk7CitzdGF0aWMgdm9pZCB2b3J0ZXhfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB2b3J0ZXhfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZmluYWwpOworc3RhdGljIGludCB2b3J0ZXhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG1kaW9fc3luYyhsb25nIGlvYWRkciwgaW50IGJpdHMpOworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKnZwLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSk7CitzdGF0aWMgdm9pZCB2b3J0ZXhfdGltZXIodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgcnhfb29tX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgdm9ydGV4X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGJvb21lcmFuZ19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2b3J0ZXhfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGJvb21lcmFuZ19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCB2b3J0ZXhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGlycXJldHVybl90IGJvb21lcmFuZ19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IHZvcnRleF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGR1bXBfdHhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhsb25nIGlvYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnZvcnRleF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW50IHZvcnRleF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgdm9ydGV4X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhY3BpX3NldF9XT0woc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHZvcnRleF9ldGh0b29sX29wczsKK3N0YXRpYyB2b2lkIHNldF84MDIxcV9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBlbmFibGUpOworCisMCisvKiBUaGlzIGRyaXZlciB1c2VzICdvcHRpb25zJyB0byBwYXNzIHRoZSBtZWRpYSB0eXBlLCBmdWxsLWR1cGxleCBmbGFnLCBldGMuICovCisvKiBPcHRpb24gY291bnQgbGltaXQgb25seSAtLSB1bmxpbWl0ZWQgaW50ZXJmYWNlcyBhcmUgc3VwcG9ydGVkLiAqLworI2RlZmluZSBNQVhfVU5JVFMgOAorc3RhdGljIGludCBvcHRpb25zW01BWF9VTklUU10gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSx9Oworc3RhdGljIGludCBmdWxsX2R1cGxleFtNQVhfVU5JVFNdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CitzdGF0aWMgaW50IGh3X2NoZWNrc3Vtc1tNQVhfVU5JVFNdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CitzdGF0aWMgaW50IGZsb3dfY3RybFtNQVhfVU5JVFNdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CitzdGF0aWMgaW50IGVuYWJsZV93b2xbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9Oworc3RhdGljIGludCBnbG9iYWxfb3B0aW9ucyA9IC0xOworc3RhdGljIGludCBnbG9iYWxfZnVsbF9kdXBsZXggPSAtMTsKK3N0YXRpYyBpbnQgZ2xvYmFsX2VuYWJsZV93b2wgPSAtMTsKKworLyogI2RlZmluZSBkZXZfYWxsb2Nfc2tiIGRldl9hbGxvY19za2JfZGVidWcgKi8KKworLyogVmFyaWFibGVzIHRvIHdvcmstYXJvdW5kIHRoZSBDb21wYXEgUENJIEJJT1MzMiBwcm9ibGVtLiAqLworc3RhdGljIGludCBjb21wYXFfaW9hZGRyLCBjb21wYXFfaXJxLCBjb21wYXFfZGV2aWNlX2lkID0gMHg1OTAwOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpjb21wYXFfbmV0X2RldmljZTsKKworc3RhdGljIGludCB2b3J0ZXhfY2FyZHNfZm91bmQ7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShnbG9iYWxfb3B0aW9ucywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKGdsb2JhbF9mdWxsX2R1cGxleCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShmdWxsX2R1cGxleCwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShod19jaGVja3N1bXMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZmxvd19jdHJsLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKGdsb2JhbF9lbmFibGVfd29sLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGVuYWJsZV93b2wsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjb21wYXFfaW9hZGRyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNvbXBhcV9pcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY29tcGFxX2RldmljZV9pZCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh3YXRjaGRvZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICIzYzU5eCBkZWJ1ZyBsZXZlbCAoMC02KSIpOworTU9EVUxFX1BBUk1fREVTQyhvcHRpb25zLCAiM2M1OXg6IEJpdHMgMC0zOiBtZWRpYSB0eXBlLCBiaXQgNDogYnVzIG1hc3RlcmluZywgYml0IDk6IGZ1bGwgZHVwbGV4Iik7CitNT0RVTEVfUEFSTV9ERVNDKGdsb2JhbF9vcHRpb25zLCAiM2M1OXg6IHNhbWUgYXMgb3B0aW9ucywgYnV0IGFwcGxpZXMgdG8gYWxsIE5JQ3MgaWYgb3B0aW9ucyBpcyB1bnNldCIpOworTU9EVUxFX1BBUk1fREVTQyhmdWxsX2R1cGxleCwgIjNjNTl4IGZ1bGwgZHVwbGV4IHNldHRpbmcocykgKDEpIik7CitNT0RVTEVfUEFSTV9ERVNDKGdsb2JhbF9mdWxsX2R1cGxleCwgIjNjNTl4OiBzYW1lIGFzIGZ1bGxfZHVwbGV4LCBidXQgYXBwbGllcyB0byBhbGwgTklDcyBpZiBvcHRpb25zIGlzIHVuc2V0Iik7CitNT0RVTEVfUEFSTV9ERVNDKGh3X2NoZWNrc3VtcywgIjNjNTl4IEhhcmR3YXJlIGNoZWNrc3VtIGNoZWNraW5nIGJ5IGFkYXB0ZXIocykgKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZmxvd19jdHJsLCAiM2M1OXggODAyLjN4IGZsb3cgY29udHJvbCB1c2FnZSAoUEFVU0Ugb25seSkgKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX3dvbCwgIjNjNTl4OiBUdXJuIG9uIFdha2Utb24tTEFOIGZvciBhZGFwdGVyKHMpICgwLTEpIik7CitNT0RVTEVfUEFSTV9ERVNDKGdsb2JhbF9lbmFibGVfd29sLCAiM2M1OXg6IHNhbWUgYXMgZW5hYmxlX3dvbCwgYnV0IGFwcGxpZXMgdG8gYWxsIE5JQ3MgaWYgb3B0aW9ucyBpcyB1bnNldCIpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICIzYzU5eCBjb3B5IGJyZWFrcG9pbnQgZm9yIGNvcHktb25seS10aW55LWZyYW1lcyIpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfaW50ZXJydXB0X3dvcmssICIzYzU5eCBtYXhpbXVtIGV2ZW50cyBoYW5kbGVkIHBlciBpbnRlcnJ1cHQiKTsKK01PRFVMRV9QQVJNX0RFU0MoY29tcGFxX2lvYWRkciwgIjNjNTl4IFBDSSBJL08gYmFzZSBhZGRyZXNzIChDb21wYXEgQklPUyBwcm9ibGVtIHdvcmthcm91bmQpIik7CitNT0RVTEVfUEFSTV9ERVNDKGNvbXBhcV9pcnEsICIzYzU5eCBQQ0kgSVJRIG51bWJlciAoQ29tcGFxIEJJT1MgcHJvYmxlbSB3b3JrYXJvdW5kKSIpOworTU9EVUxFX1BBUk1fREVTQyhjb21wYXFfZGV2aWNlX2lkLCAiM2M1OXggUENJIGRldmljZSBJRCAoQ29tcGFxIEJJT1MgcHJvYmxlbSB3b3JrYXJvdW5kKSIpOworTU9EVUxFX1BBUk1fREVTQyh3YXRjaGRvZywgIjNjNTl4IHRyYW5zbWl0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIik7CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgcG9sbF92b3J0ZXgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJKHZwLT5mdWxsX2J1c19tYXN0ZXJfcnggPyBib29tZXJhbmdfaW50ZXJydXB0OnZvcnRleF9pbnRlcnJ1cHQpKGRldi0+aXJxLGRldixOVUxMKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9IAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCB2b3J0ZXhfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldiAmJiBkZXYtPnByaXYpIHsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJdm9ydGV4X2Rvd24oZGV2LCAxKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2b3J0ZXhfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldiAmJiBkZXYtPnByaXYpIHsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJdm9ydGV4X3VwKGRldik7CisJCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworI2lmZGVmIENPTkZJR19FSVNBCitzdGF0aWMgc3RydWN0IGVpc2FfZGV2aWNlX2lkIHZvcnRleF9laXNhX2lkc1tdID0geworCXsgIlRDTTU5MjAiLCBDSF8zQzU5MiB9LAorCXsgIlRDTTU5NzAiLCBDSF8zQzU5NyB9LAorCXsgIiIgfQorfTsKKworc3RhdGljIGludCB2b3J0ZXhfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgdm9ydGV4X2Vpc2FfcmVtb3ZlIChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOworCitzdGF0aWMgc3RydWN0IGVpc2FfZHJpdmVyIHZvcnRleF9laXNhX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSB2b3J0ZXhfZWlzYV9pZHMsCisJLmRyaXZlciAgID0geworCQkubmFtZSAgICA9ICIzYzU5eCIsCisJCS5wcm9iZSAgID0gdm9ydGV4X2Vpc2FfcHJvYmUsCisJCS5yZW1vdmUgID0gdm9ydGV4X2Vpc2FfcmVtb3ZlCisJfQorfTsKKworc3RhdGljIGludCB2b3J0ZXhfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCWxvbmcgaW9hZGRyOworCXN0cnVjdCBlaXNhX2RldmljZSAqZWRldjsKKworCWVkZXYgPSB0b19laXNhX2RldmljZSAoZGV2aWNlKTsKKwlpb2FkZHIgPSBlZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgVk9SVEVYX1RPVEFMX1NJWkUsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICh2b3J0ZXhfcHJvYmUxKGRldmljZSwgaW9hZGRyLCBpbncoaW9hZGRyICsgMHhDODgpID4+IDEyLAorCQkJCQkgIGVkZXYtPmlkLmRyaXZlcl9kYXRhLCB2b3J0ZXhfY2FyZHNfZm91bmQpKSB7CisJCXJlbGVhc2VfcmVnaW9uIChpb2FkZHIsIFZPUlRFWF9UT1RBTF9TSVpFKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdm9ydGV4X2NhcmRzX2ZvdW5kKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2b3J0ZXhfZWlzYV9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwOworCWxvbmcgaW9hZGRyOworCisJZWRldiA9IHRvX2Vpc2FfZGV2aWNlIChkZXZpY2UpOworCWRldiA9IGVpc2FfZ2V0X2RydmRhdGEgKGVkZXYpOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKCJ2b3J0ZXhfZWlzYV9yZW1vdmUgY2FsbGVkIGZvciBDb21wYXEgZGV2aWNlIVxuIik7CisJCUJVRygpOworCX0KKworCXZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkKKwl1bnJlZ2lzdGVyX25ldGRldiAoZGV2KTsKKwlvdXR3IChUb3RhbFJlc2V0fDB4MTQsIGlvYWRkciArIEVMM19DTUQpOworCXJlbGVhc2VfcmVnaW9uIChpb2FkZHIsIFZPUlRFWF9UT1RBTF9TSVpFKTsKKworCWZyZWVfbmV0ZGV2IChkZXYpOworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qIHJldHVybnMgY291bnQgZm91bmQgKD49IDApLCBvciBuZWdhdGl2ZSBvbiBlcnJvciAqLworc3RhdGljIGludCBfX2luaXQgdm9ydGV4X2Vpc2FfaW5pdCAodm9pZCkKK3sKKwlpbnQgZWlzYV9mb3VuZCA9IDA7CisJaW50IG9yaWdfY2FyZHNfZm91bmQgPSB2b3J0ZXhfY2FyZHNfZm91bmQ7CisKKyNpZmRlZiBDT05GSUdfRUlTQQorCWlmIChlaXNhX2RyaXZlcl9yZWdpc3RlciAoJnZvcnRleF9laXNhX2RyaXZlcikgPj0gMCkgeworCQkJLyogQmVjYXVzZSBvZiB0aGUgd2F5IEVJU0EgYnVzIGlzIHByb2JlZCwgd2UgY2Fubm90IGFzc3VtZQorCQkJICogYW55IGRldmljZSBoYXZlIGJlZW4gZm91bmQgd2hlbiB3ZSBleGl0IGZyb20KKwkJCSAqIGVpc2FfZHJpdmVyX3JlZ2lzdGVyICh0aGUgYnVzIHJvb3QgZHJpdmVyIG1heSBub3QgYmUKKwkJCSAqIGluaXRpYWxpemVkIHlldCkuIFNvIHdlIGJsaW5kbHkgYXNzdW1lIHNvbWV0aGluZyB3YXMKKwkJCSAqIGZvdW5kLCBhbmQgbGV0IHRoZSBzeXNmcyBtYWdpYyBoYXBwZW5kLi4uICovCisJCQkKKwkJCWVpc2FfZm91bmQgPSAxOworCX0KKyNlbmRpZgorCQorCS8qIFNwZWNpYWwgY29kZSB0byB3b3JrLWFyb3VuZCB0aGUgQ29tcGFxIFBDSSBCSU9TMzIgcHJvYmxlbS4gKi8KKwlpZiAoY29tcGFxX2lvYWRkcikgeworCQl2b3J0ZXhfcHJvYmUxKE5VTEwsIGNvbXBhcV9pb2FkZHIsIGNvbXBhcV9pcnEsCisJCQkJCSAgY29tcGFxX2RldmljZV9pZCwgdm9ydGV4X2NhcmRzX2ZvdW5kKyspOworCX0KKworCXJldHVybiB2b3J0ZXhfY2FyZHNfZm91bmQgLSBvcmlnX2NhcmRzX2ZvdW5kICsgZWlzYV9mb3VuZDsKK30KKworLyogcmV0dXJucyBjb3VudCAoPj0gMCksIG9yIG5lZ2F0aXZlIG9uIGVycm9yICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2b3J0ZXhfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IHJjOworCisJLyogd2FrZSB1cCBhbmQgZW5hYmxlIGRldmljZSAqLwkJCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZSAocGRldik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXQ7CisKKwlyYyA9IHZvcnRleF9wcm9iZTEgKCZwZGV2LT5kZXYsIHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCksCisJCQkJCQlwZGV2LT5pcnEsIGVudC0+ZHJpdmVyX2RhdGEsIHZvcnRleF9jYXJkc19mb3VuZCk7CisJaWYgKHJjIDwgMCkgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UgKHBkZXYpOworCQlnb3RvIG91dDsKKwl9CisKKwl2b3J0ZXhfY2FyZHNfZm91bmQrKzsKKworb3V0OgorCXJldHVybiByYzsKK30KKworLyoKKyAqIFN0YXJ0IHVwIHRoZSBQQ0kvRUlTQSBkZXZpY2Ugd2hpY2ggaXMgZGVzY3JpYmVkIGJ5ICpnZW5kZXYuCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLgorICoKKyAqIE5PVEU6IHBkZXYgY2FuIGJlIE5VTEwsIGZvciB0aGUgY2FzZSBvZiBhIENvbXBhcSBkZXZpY2UKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgdm9ydGV4X3Byb2JlMShzdHJ1Y3QgZGV2aWNlICpnZW5kZXYsCisJCQkJICAgbG9uZyBpb2FkZHIsIGludCBpcnEsCisJCQkJICAgaW50IGNoaXBfaWR4LCBpbnQgY2FyZF9pZHgpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cDsKKwlpbnQgb3B0aW9uOworCXVuc2lnbmVkIGludCBlZXByb21bMHg0MF0sIGNoZWNrc3VtID0gMDsJCS8qIEVFUFJPTSBjb250ZW50cyAqLworCWludCBpLCBzdGVwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJaW50IHJldHZhbCwgcHJpbnRfaW5mbzsKKwlzdHJ1Y3Qgdm9ydGV4X2NoaXBfaW5mbyAqIGNvbnN0IHZjaSA9ICZ2b3J0ZXhfaW5mb190YmxbY2hpcF9pZHhdOworCWNoYXIgKnByaW50X25hbWUgPSAiM2M1OXgiOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXYgPSBOVUxMOworCisJaWYgKCFwcmludGVkX3ZlcnNpb24pIHsKKwkJcHJpbnRrICh2ZXJzaW9uKTsKKwkJcHJpbnRlZF92ZXJzaW9uID0gMTsKKwl9CisKKwlpZiAoZ2VuZGV2KSB7CisJCWlmICgocGRldiA9IERFVklDRV9QQ0koZ2VuZGV2KSkpIHsKKwkJCXByaW50X25hbWUgPSBwY2lfbmFtZShwZGV2KTsKKwkJfQorCisJCWlmICgoZWRldiA9IERFVklDRV9FSVNBKGdlbmRldikpKSB7CisJCQlwcmludF9uYW1lID0gZWRldi0+ZGV2LmJ1c19pZDsKKwkJfQorCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqdnApKTsKKwlyZXR2YWwgPSAtRU5PTUVNOworCWlmICghZGV2KSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgZXRoZXJkZXYsIGFib3J0aW5nXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsIGdlbmRldik7CisJdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJb3B0aW9uID0gZ2xvYmFsX29wdGlvbnM7CisKKwkvKiBUaGUgbG93ZXIgZm91ciBiaXRzIGFyZSB0aGUgbWVkaWEgdHlwZS4gKi8KKwlpZiAoZGV2LT5tZW1fc3RhcnQpIHsKKwkJLyoKKwkJICogVGhlICdvcHRpb25zJyBwYXJhbSBpcyBwYXNzZWQgaW4gYXMgdGhlIHRoaXJkIGFyZyB0byB0aGUKKwkJICogTElMTyAnZXRoZXI9JyBhcmd1bWVudCBmb3Igbm9uLW1vZHVsYXIgdXNlCisJCSAqLworCQlvcHRpb24gPSBkZXYtPm1lbV9zdGFydDsKKwl9CisJZWxzZSBpZiAoY2FyZF9pZHggPCBNQVhfVU5JVFMpIHsKKwkJaWYgKG9wdGlvbnNbY2FyZF9pZHhdID49IDApCisJCQlvcHRpb24gPSBvcHRpb25zW2NhcmRfaWR4XTsKKwl9CisKKwlpZiAob3B0aW9uID4gMCkgeworCQlpZiAob3B0aW9uICYgMHg4MDAwKQorCQkJdm9ydGV4X2RlYnVnID0gNzsKKwkJaWYgKG9wdGlvbiAmIDB4NDAwMCkKKwkJCXZvcnRleF9kZWJ1ZyA9IDI7CisJCWlmIChvcHRpb24gJiAweDA0MDApCisJCQl2cC0+ZW5hYmxlX3dvbCA9IDE7CisJfQorCisJcHJpbnRfaW5mbyA9ICh2b3J0ZXhfZGVidWcgPiAxKTsKKwlpZiAocHJpbnRfaW5mbykKKwkJcHJpbnRrIChLRVJOX0lORk8gIlNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdm9ydGV4LnR4dFxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogM0NvbSAlcyAlcyBhdCAweCVseC4gVmVycyAiIERSVl9WRVJTSU9OICJcbiIsCisJICAgICAgIHByaW50X25hbWUsCisJICAgICAgIHBkZXYgPyAiUENJIiA6ICJFSVNBIiwKKwkgICAgICAgdmNpLT5uYW1lLAorCSAgICAgICBpb2FkZHIpOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5tdHUgPSBtdHU7CisJdnAtPmxhcmdlX2ZyYW1lcyA9IG10dSA+IDE1MDA7CisJdnAtPmRydl9mbGFncyA9IHZjaS0+ZHJ2X2ZsYWdzOworCXZwLT5oYXNfbndheSA9ICh2Y2ktPmRydl9mbGFncyAmIEhBU19OV0FZKSA/IDEgOiAwOworCXZwLT5pb19zaXplID0gdmNpLT5pb19zaXplOworCXZwLT5jYXJkX2lkeCA9IGNhcmRfaWR4OworCisJLyogbW9kdWxlIGxpc3Qgb25seSBmb3IgQ29tcGFxIGRldmljZSAqLworCWlmIChnZW5kZXYgPT0gTlVMTCkgeworCQljb21wYXFfbmV0X2RldmljZSA9IGRldjsKKwl9CisKKwkvKiBQQ0ktb25seSBzdGFydHVwIGxvZ2ljICovCisJaWYgKHBkZXYpIHsKKwkJLyogRUlTQSByZXNvdXJjZXMgYWxyZWFkeSBtYXJrZWQsIHNvIG9ubHkgUENJIG5lZWRzIHRvIGRvIHRoaXMgaGVyZSAqLworCQkvKiBJZ25vcmUgcmV0dXJuIHZhbHVlLCBiZWNhdXNlIENhcmRidXMgZHJpdmVycyBhbHJlYWR5IGFsbG9jYXRlIGZvciB1cyAqLworCQlpZiAocmVxdWVzdF9yZWdpb24oaW9hZGRyLCB2Y2ktPmlvX3NpemUsIHByaW50X25hbWUpICE9IE5VTEwpCisJCQl2cC0+bXVzdF9mcmVlX3JlZ2lvbiA9IDE7CisKKwkJLyogZW5hYmxlIGJ1cy1tYXN0ZXJpbmcgaWYgbmVjZXNzYXJ5ICovCQkKKwkJaWYgKHZjaS0+ZmxhZ3MgJiBQQ0lfVVNFU19NQVNURVIpCisJCQlwY2lfc2V0X21hc3RlciAocGRldik7CisKKwkJaWYgKHZjaS0+ZHJ2X2ZsYWdzICYgSVNfVk9SVEVYKSB7CisJCQl1OCBwY2lfbGF0ZW5jeTsKKwkJCXU4IG5ld19sYXRlbmN5ID0gMjQ4OworCisJCQkvKiBDaGVjayB0aGUgUENJIGxhdGVuY3kgdmFsdWUuICBPbiB0aGUgM2M1OTAgc2VyaWVzIHRoZSBsYXRlbmN5IHRpbWVyCisJCQkgICBtdXN0IGJlIHNldCB0byB0aGUgbWF4aW11bSB2YWx1ZSB0byBhdm9pZCBkYXRhIGNvcnJ1cHRpb24gdGhhdCBvY2N1cnMKKwkJCSAgIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMgZHVyaW5nIGEgdHJhbnNmZXIuICBUaGlzIGJ1ZyBleGlzdHMgdGhlIFZvcnRleAorCQkJICAgY2hpcCBvbmx5LiAqLworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsICZwY2lfbGF0ZW5jeSk7CisJCQlpZiAocGNpX2xhdGVuY3kgPCBuZXdfbGF0ZW5jeSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPdmVycmlkaW5nIFBDSSBsYXRlbmN5IgorCQkJCQkiIHRpbWVyIChDRkxUKSBzZXR0aW5nIG9mICVkLCBuZXcgdmFsdWUgaXMgJWQuXG4iLAorCQkJCQlwcmludF9uYW1lLCBwY2lfbGF0ZW5jeSwgbmV3X2xhdGVuY3kpOworCQkJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIG5ld19sYXRlbmN5KTsKKwkJCX0KKwkJfQorCX0KKworCXNwaW5fbG9ja19pbml0KCZ2cC0+bG9jayk7CisJdnAtPmdlbmRldiA9IGdlbmRldjsKKwl2cC0+bWlpLmRldiA9IGRldjsKKwl2cC0+bWlpLm1kaW9fcmVhZCA9IG1kaW9fcmVhZDsKKwl2cC0+bWlpLm1kaW9fd3JpdGUgPSBtZGlvX3dyaXRlOworCXZwLT5taWkucGh5X2lkX21hc2sgPSAweDFmOworCXZwLT5taWkucmVnX251bV9tYXNrID0gMHgxZjsKKworCS8qIE1ha2VzIHN1cmUgcmluZ3MgYXJlIGF0IGxlYXN0IDE2IGJ5dGUgYWxpZ25lZC4gKi8KKwl2cC0+cnhfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHNpemVvZihzdHJ1Y3QgYm9vbV9yeF9kZXNjKSAqIFJYX1JJTkdfU0laRQorCQkJCQkgICArIHNpemVvZihzdHJ1Y3QgYm9vbV90eF9kZXNjKSAqIFRYX1JJTkdfU0laRSwKKwkJCQkJICAgJnZwLT5yeF9yaW5nX2RtYSk7CisJcmV0dmFsID0gLUVOT01FTTsKKwlpZiAodnAtPnJ4X3JpbmcgPT0gMCkKKwkJZ290byBmcmVlX3JlZ2lvbjsKKworCXZwLT50eF9yaW5nID0gKHN0cnVjdCBib29tX3R4X2Rlc2MgKikodnAtPnJ4X3JpbmcgKyBSWF9SSU5HX1NJWkUpOworCXZwLT50eF9yaW5nX2RtYSA9IHZwLT5yeF9yaW5nX2RtYSArIHNpemVvZihzdHJ1Y3QgYm9vbV9yeF9kZXNjKSAqIFJYX1JJTkdfU0laRTsKKworCS8qIGlmIHdlIGFyZSBhIFBDSSBkcml2ZXIsIHdlIHN0b3JlIGluZm8gaW4gcGRldi0+ZHJpdmVyX2RhdGEKKwkgKiBpbnN0ZWFkIG9mIGEgbW9kdWxlIGxpc3QgKi8JCisJaWYgKHBkZXYpCisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCWlmIChlZGV2KQorCQllaXNhX3NldF9kcnZkYXRhIChlZGV2LCBkZXYpOworCisJdnAtPm1lZGlhX292ZXJyaWRlID0gNzsKKwlpZiAob3B0aW9uID49IDApIHsKKwkJdnAtPm1lZGlhX292ZXJyaWRlID0gKChvcHRpb24gJiA3KSA9PSAyKSAgPyAgMCAgOiAgb3B0aW9uICYgMTU7CisJCWlmICh2cC0+bWVkaWFfb3ZlcnJpZGUgIT0gNykKKwkJCXZwLT5tZWRpYWxvY2sgPSAxOworCQl2cC0+ZnVsbF9kdXBsZXggPSAob3B0aW9uICYgMHgyMDApID8gMSA6IDA7CisJCXZwLT5idXNfbWFzdGVyID0gKG9wdGlvbiAmIDE2KSA/IDEgOiAwOworCX0KKworCWlmIChnbG9iYWxfZnVsbF9kdXBsZXggPiAwKQorCQl2cC0+ZnVsbF9kdXBsZXggPSAxOworCWlmIChnbG9iYWxfZW5hYmxlX3dvbCA+IDApCisJCXZwLT5lbmFibGVfd29sID0gMTsKKworCWlmIChjYXJkX2lkeCA8IE1BWF9VTklUUykgeworCQlpZiAoZnVsbF9kdXBsZXhbY2FyZF9pZHhdID4gMCkKKwkJCXZwLT5mdWxsX2R1cGxleCA9IDE7CisJCWlmIChmbG93X2N0cmxbY2FyZF9pZHhdID4gMCkKKwkJCXZwLT5mbG93X2N0cmwgPSAxOworCQlpZiAoZW5hYmxlX3dvbFtjYXJkX2lkeF0gPiAwKQorCQkJdnAtPmVuYWJsZV93b2wgPSAxOworCX0KKworCXZwLT5mb3JjZV9mZCA9IHZwLT5mdWxsX2R1cGxleDsKKwl2cC0+b3B0aW9ucyA9IG9wdGlvbjsKKwkvKiBSZWFkIHRoZSBzdGF0aW9uIGFkZHJlc3MgZnJvbSB0aGUgRUVQUk9NLiAqLworCUVMM1dJTkRPVygwKTsKKwl7CisJCWludCBiYXNlOworCisJCWlmICh2Y2ktPmRydl9mbGFncyAmIEVFUFJPTV84QklUKQorCQkJYmFzZSA9IDB4MjMwOworCQllbHNlIGlmICh2Y2ktPmRydl9mbGFncyAmIEVFUFJPTV9PRkZTRVQpCisJCQliYXNlID0gRUVQUk9NX1JlYWQgKyAweDMwOworCQllbHNlCisJCQliYXNlID0gRUVQUk9NX1JlYWQ7CisKKwkJZm9yIChpID0gMDsgaSA8IDB4NDA7IGkrKykgeworCQkJaW50IHRpbWVyOworCQkJb3V0dyhiYXNlICsgaSwgaW9hZGRyICsgV24wRWVwcm9tQ21kKTsKKwkJCS8qIFBhdXNlIGZvciBhdCBsZWFzdCAxNjIgdXMuIGZvciB0aGUgcmVhZCB0byB0YWtlIHBsYWNlLiAqLworCQkJZm9yICh0aW1lciA9IDEwOyB0aW1lciA+PSAwOyB0aW1lci0tKSB7CisJCQkJdWRlbGF5KDE2Mik7CisJCQkJaWYgKChpbncoaW9hZGRyICsgV24wRWVwcm9tQ21kKSAmIDB4ODAwMCkgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQllZXByb21baV0gPSBpbncoaW9hZGRyICsgV24wRWVwcm9tRGF0YSk7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IDB4MTg7IGkrKykKKwkJY2hlY2tzdW0gXj0gZWVwcm9tW2ldOworCWNoZWNrc3VtID0gKGNoZWNrc3VtIF4gKGNoZWNrc3VtID4+IDgpKSAmIDB4ZmY7CisJaWYgKGNoZWNrc3VtICE9IDB4MDApIHsJCS8qIEdycnIsIG5lZWRsZXNzIGluY29tcGF0aWJsZSBjaGFuZ2UgM0NvbS4gKi8KKwkJd2hpbGUgKGkgPCAweDIxKQorCQkJY2hlY2tzdW0gXj0gZWVwcm9tW2krK107CisJCWNoZWNrc3VtID0gKGNoZWNrc3VtIF4gKGNoZWNrc3VtID4+IDgpKSAmIDB4ZmY7CisJfQorCWlmICgoY2hlY2tzdW0gIT0gMHgwMCkgJiYgISh2Y2ktPmRydl9mbGFncyAmIElTX1RPUk5BRE8pKQorCQlwcmludGsoIiAqKipJTlZBTElEIENIRUNLU1VNICU0LjR4KioqICIsIGNoZWNrc3VtKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkoKHUxNiAqKWRldi0+ZGV2X2FkZHIpW2ldID0gaHRvbnMoZWVwcm9tW2kgKyAxMF0pOworCWlmIChwcmludF9pbmZvKSB7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlwcmludGsoIiVjJTIuMngiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisJLyogVW5mb3J0dW5hdGVseSBhbiBhbGwgemVybyBlZXByb20gcGFzc2VzIHRoZSBjaGVja3N1bSBhbmQgdGhpcworCSAgIGdldHMgZm91bmQgaW4gdGhlIHdpbGQgaW4gZmFpbHVyZSBjYXNlcy4gQ3J5cHRvIGlzIGhhcmQgOCkgKi8KKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJcHJpbnRrKEtFUk5fRVJSICIqKiogRUVQUk9NIE1BQyBhZGRyZXNzIGlzIGludmFsaWQuXG4iKTsKKwkJZ290byBmcmVlX3Jpbmc7CS8qIFdpdGggZXZlcnkgcGFjayAqLworCX0KKwlFTDNXSU5ET1coMik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJb3V0YihkZXYtPmRldl9hZGRyW2ldLCBpb2FkZHIgKyBpKTsKKworI2lmZGVmIF9fc3BhcmNfXworCWlmIChwcmludF9pbmZvKQorCQlwcmludGsoIiwgSVJRICVzXG4iLCBfX2lycV9pdG9hKGRldi0+aXJxKSk7CisjZWxzZQorCWlmIChwcmludF9pbmZvKQorCQlwcmludGsoIiwgSVJRICVkXG4iLCBkZXYtPmlycSk7CisJLyogVGVsbCB0aGVtIGFib3V0IGFuIGludmFsaWQgSVJRLiAqLworCWlmIChkZXYtPmlycSA8PSAwIHx8IGRldi0+aXJxID49IE5SX0lSUVMpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAqKiogV2FybmluZzogSVJRICVkIGlzIHVubGlrZWx5IHRvIHdvcmshICoqKlxuIiwKKwkJCSAgIGRldi0+aXJxKTsKKyNlbmRpZgorCisJRUwzV0lORE9XKDQpOworCXN0ZXAgPSAoaW5iKGlvYWRkciArIFduNF9OZXREaWFnKSAmIDB4MWUpID4+IDE7CisJaWYgKHByaW50X2luZm8pIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICBwcm9kdWN0IGNvZGUgJTAyeCUwMnggcmV2ICUwMnguJWQgZGF0ZSAlMDJkLSIKKwkJCSIlMDJkLSUwMmRcbiIsIGVlcHJvbVs2XSYweGZmLCBlZXByb21bNl0+PjgsIGVlcHJvbVsweDE0XSwKKwkJCXN0ZXAsIChlZXByb21bNF0+PjUpICYgMTUsIGVlcHJvbVs0XSAmIDMxLCBlZXByb21bNF0+PjkpOworCX0KKworCisJaWYgKHBkZXYgJiYgdmNpLT5kcnZfZmxhZ3MgJiBIQVNfQ0JfRk5TKSB7CisJCXVuc2lnbmVkIGxvbmcgZm5fc3RfYWRkcjsJCQkvKiBDYXJkYnVzIGZ1bmN0aW9uIHN0YXR1cyBzcGFjZSAqLworCQl1bnNpZ25lZCBzaG9ydCBuOworCisJCWZuX3N0X2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDIpOworCQlpZiAoZm5fc3RfYWRkcikgeworCQkJdnAtPmNiX2ZuX2Jhc2UgPSBpb3JlbWFwKGZuX3N0X2FkZHIsIDEyOCk7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJaWYgKCF2cC0+Y2JfZm5fYmFzZSkKKwkJCQlnb3RvIGZyZWVfcmluZzsKKwkJfQorCQlpZiAocHJpbnRfaW5mbykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENhcmRCdXMgZnVuY3Rpb25zIG1hcHBlZCAlOC44bHgtPiVwXG4iLAorCQkJCXByaW50X25hbWUsIGZuX3N0X2FkZHIsIHZwLT5jYl9mbl9iYXNlKTsKKwkJfQorCQlFTDNXSU5ET1coMik7CisKKwkJbiA9IGludyhpb2FkZHIgKyBXbjJfUmVzZXRPcHRpb25zKSAmIH4weDQwMTA7CisJCWlmICh2cC0+ZHJ2X2ZsYWdzICYgSU5WRVJUX0xFRF9QV1IpCisJCQluIHw9IDB4MTA7CisJCWlmICh2cC0+ZHJ2X2ZsYWdzICYgSU5WRVJUX01JSV9QV1IpCisJCQluIHw9IDB4NDAwMDsKKwkJb3V0dyhuLCBpb2FkZHIgKyBXbjJfUmVzZXRPcHRpb25zKTsKKwkJaWYgKHZwLT5kcnZfZmxhZ3MgJiBXTk9fWENWUl9QV1IpIHsKKwkJCUVMM1dJTkRPVygwKTsKKwkJCW91dHcoMHgwODAwLCBpb2FkZHIpOworCQl9CisJfQorCisJLyogRXh0cmFjdCBvdXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgRUVQUk9NIGRhdGEuICovCisJdnAtPmluZm8xID0gZWVwcm9tWzEzXTsKKwl2cC0+aW5mbzIgPSBlZXByb21bMTVdOworCXZwLT5jYXBhYmlsaXRpZXMgPSBlZXByb21bMTZdOworCisJaWYgKHZwLT5pbmZvMSAmIDB4ODAwMCkgeworCQl2cC0+ZnVsbF9kdXBsZXggPSAxOworCQlpZiAocHJpbnRfaW5mbykKKwkJCXByaW50ayhLRVJOX0lORk8gIkZ1bGwgZHVwbGV4IGNhcGFibGVcbiIpOworCX0KKworCXsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKiByYW1fc3BsaXRbXSA9IHsiNTozIiwgIjM6MSIsICIxOjEiLCAiMzo1In07CisJCXVuc2lnbmVkIGludCBjb25maWc7CisJCUVMM1dJTkRPVygzKTsKKwkJdnAtPmF2YWlsYWJsZV9tZWRpYSA9IGludyhpb2FkZHIgKyBXbjNfT3B0aW9ucyk7CisJCWlmICgodnAtPmF2YWlsYWJsZV9tZWRpYSAmIDB4ZmYpID09IDApCQkvKiBCcm9rZW4gM2M5MTYgKi8KKwkJCXZwLT5hdmFpbGFibGVfbWVkaWEgPSAweDQwOworCQljb25maWcgPSBpbmwoaW9hZGRyICsgV24zX0NvbmZpZyk7CisJCWlmIChwcmludF9pbmZvKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiICBJbnRlcm5hbCBjb25maWcgcmVnaXN0ZXIgaXMgJTQuNHgsICIKKwkJCQkgICAidHJhbnNjZWl2ZXJzICUjeC5cbiIsIGNvbmZpZywgaW53KGlvYWRkciArIFduM19PcHRpb25zKSk7CisJCQlwcmludGsoS0VSTl9JTkZPICIgICVkSyAlcy13aWRlIFJBTSAlcyBSeDpUeCBzcGxpdCwgJXMlcyBpbnRlcmZhY2UuXG4iLAorCQkJCSAgIDggPDwgUkFNX1NJWkUoY29uZmlnKSwKKwkJCQkgICBSQU1fV0lEVEgoY29uZmlnKSA/ICJ3b3JkIiA6ICJieXRlIiwKKwkJCQkgICByYW1fc3BsaXRbUkFNX1NQTElUKGNvbmZpZyldLAorCQkJCSAgIEFVVE9TRUxFQ1QoY29uZmlnKSA/ICJhdXRvc2VsZWN0LyIgOiAiIiwKKwkJCQkgICBYQ1ZSKGNvbmZpZykgPiBYQ1ZSX0V4dE1JSSA/ICI8aW52YWxpZCB0cmFuc2NlaXZlcj4iIDoKKwkJCQkgICBtZWRpYV90YmxbWENWUihjb25maWcpXS5uYW1lKTsKKwkJfQorCQl2cC0+ZGVmYXVsdF9tZWRpYSA9IFhDVlIoY29uZmlnKTsKKwkJaWYgKHZwLT5kZWZhdWx0X21lZGlhID09IFhDVlJfTldBWSkKKwkJCXZwLT5oYXNfbndheSA9IDE7CisJCXZwLT5hdXRvc2VsZWN0ID0gQVVUT1NFTEVDVChjb25maWcpOworCX0KKworCWlmICh2cC0+bWVkaWFfb3ZlcnJpZGUgIT0gNykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogIE1lZGlhIG92ZXJyaWRlIHRvIHRyYW5zY2VpdmVyIHR5cGUgJWQgKCVzKS5cbiIsCisJCQkJcHJpbnRfbmFtZSwgdnAtPm1lZGlhX292ZXJyaWRlLAorCQkJCW1lZGlhX3RibFt2cC0+bWVkaWFfb3ZlcnJpZGVdLm5hbWUpOworCQlkZXYtPmlmX3BvcnQgPSB2cC0+bWVkaWFfb3ZlcnJpZGU7CisJfSBlbHNlCisJCWRldi0+aWZfcG9ydCA9IHZwLT5kZWZhdWx0X21lZGlhOworCisJaWYgKCh2cC0+YXZhaWxhYmxlX21lZGlhICYgMHg0MCkgfHwgKHZjaS0+ZHJ2X2ZsYWdzICYgSEFTX05XQVkpIHx8CisJCWRldi0+aWZfcG9ydCA9PSBYQ1ZSX01JSSB8fCBkZXYtPmlmX3BvcnQgPT0gWENWUl9OV0FZKSB7CisJCWludCBwaHksIHBoeV9pZHggPSAwOworCQlFTDNXSU5ET1coNCk7CisJCW1paV9wcmVhbWJsZV9yZXF1aXJlZCsrOworCQlpZiAodnAtPmRydl9mbGFncyAmIEVYVFJBX1BSRUFNQkxFKQorCQkJbWlpX3ByZWFtYmxlX3JlcXVpcmVkKys7CisJCW1kaW9fc3luYyhpb2FkZHIsIDMyKTsKKwkJbWRpb19yZWFkKGRldiwgMjQsIDEpOworCQlmb3IgKHBoeSA9IDA7IHBoeSA8IDMyICYmIHBoeV9pZHggPCAxOyBwaHkrKykgeworCQkJaW50IG1paV9zdGF0dXMsIHBoeXg7CisKKwkJCS8qCisJCQkgKiBGb3IgdGhlIDNjOTA1Q1ggd2UgbG9vayBhdCBpbmRleCAyNCBmaXJzdCwgYmVjYXVzZSBpdCBib2d1c2x5CisJCQkgKiByZXBvcnRzIGFuIGV4dGVybmFsIFBIWSBhdCBhbGwgaW5kaWNlcworCQkJICovCisJCQlpZiAocGh5ID09IDApCisJCQkJcGh5eCA9IDI0OworCQkJZWxzZSBpZiAocGh5IDw9IDI0KQorCQkJCXBoeXggPSBwaHkgLSAxOworCQkJZWxzZQorCQkJCXBoeXggPSBwaHk7CisJCQltaWlfc3RhdHVzID0gbWRpb19yZWFkKGRldiwgcGh5eCwgMSk7CisJCQlpZiAobWlpX3N0YXR1cyAgJiYgIG1paV9zdGF0dXMgIT0gMHhmZmZmKSB7CisJCQkJdnAtPnBoeXNbcGh5X2lkeCsrXSA9IHBoeXg7CisJCQkJaWYgKHByaW50X2luZm8pIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICBNSUkgdHJhbnNjZWl2ZXIgZm91bmQgYXQgYWRkcmVzcyAlZCwiCisJCQkJCQkiIHN0YXR1cyAlNHguXG4iLCBwaHl4LCBtaWlfc3RhdHVzKTsKKwkJCQl9CisJCQkJaWYgKChtaWlfc3RhdHVzICYgMHgwMDQwKSA9PSAwKQorCQkJCQltaWlfcHJlYW1ibGVfcmVxdWlyZWQrKzsKKwkJCX0KKwkJfQorCQltaWlfcHJlYW1ibGVfcmVxdWlyZWQtLTsKKwkJaWYgKHBoeV9pZHggPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyIgICoqKldBUk5JTkcqKiogTm8gTUlJIHRyYW5zY2VpdmVycyBmb3VuZCFcbiIpOworCQkJdnAtPnBoeXNbMF0gPSAyNDsKKwkJfSBlbHNlIHsKKwkJCXZwLT5hZHZlcnRpc2luZyA9IG1kaW9fcmVhZChkZXYsIHZwLT5waHlzWzBdLCA0KTsKKwkJCWlmICh2cC0+ZnVsbF9kdXBsZXgpIHsKKwkJCQkvKiBPbmx5IGFkdmVydGlzZSB0aGUgRkQgbWVkaWEgdHlwZXMuICovCisJCQkJdnAtPmFkdmVydGlzaW5nICY9IH4weDAyQTA7CisJCQkJbWRpb193cml0ZShkZXYsIHZwLT5waHlzWzBdLCA0LCB2cC0+YWR2ZXJ0aXNpbmcpOworCQkJfQorCQl9CisJCXZwLT5taWkucGh5X2lkID0gdnAtPnBoeXNbMF07CisJfQorCisJaWYgKHZwLT5jYXBhYmlsaXRpZXMgJiBDYXBCdXNNYXN0ZXIpIHsKKwkJdnAtPmZ1bGxfYnVzX21hc3Rlcl90eCA9IDE7CisJCWlmIChwcmludF9pbmZvKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIgIEVuYWJsaW5nIGJ1cy1tYXN0ZXIgdHJhbnNtaXRzIGFuZCAlcyByZWNlaXZlcy5cbiIsCisJCQkodnAtPmluZm8yICYgMSkgPyAiZWFybHkiIDogIndob2xlLWZyYW1lIiApOworCQl9CisJCXZwLT5mdWxsX2J1c19tYXN0ZXJfcnggPSAodnAtPmluZm8yICYgMSkgPyAxIDogMjsKKwkJdnAtPmJ1c19tYXN0ZXIgPSAwOwkJLyogQUtQTTogdm9ydGV4IG9ubHkgKi8KKwl9CisKKwkvKiBUaGUgM2M1OXgtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSB2b3J0ZXhfb3BlbjsKKwlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl90eCkgeworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGJvb21lcmFuZ19zdGFydF94bWl0OworCQkvKiBBY3R1YWxseSwgaXQgc3RpbGwgc2hvdWxkIHdvcmsgd2l0aCBpb21tdS4gKi8KKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHOworCQlpZiAoKChod19jaGVja3N1bXNbY2FyZF9pZHhdID09IC0xKSAmJiAodnAtPmRydl9mbGFncyAmIEhBU19IV0NLU00pKSB8fAorCQkJCQkoaHdfY2hlY2tzdW1zW2NhcmRfaWR4XSA9PSAxKSkgeworCQkJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNOworCQl9CisJfSBlbHNlIHsKKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB2b3J0ZXhfc3RhcnRfeG1pdDsKKwl9CisKKwlpZiAocHJpbnRfaW5mbykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogc2NhdHRlci9nYXRoZXIgJXNhYmxlZC4gaC93IGNoZWNrc3VtcyAlc2FibGVkXG4iLAorCQkJCXByaW50X25hbWUsCisJCQkJKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHKSA/ICJlbiI6ImRpcyIsCisJCQkJKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0lQX0NTVU0pID8gImVuIjoiZGlzIik7CisJfQorCisJZGV2LT5zdG9wID0gdm9ydGV4X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gdm9ydGV4X2dldF9zdGF0czsKKyNpZmRlZiBDT05GSUdfUENJCisJZGV2LT5kb19pb2N0bCA9IHZvcnRleF9pb2N0bDsKKyNlbmRpZgorCWRldi0+ZXRodG9vbF9vcHMgPSAmdm9ydGV4X2V0aHRvb2xfb3BzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2V0X3J4X21vZGU7CisJZGV2LT50eF90aW1lb3V0ID0gdm9ydGV4X3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9ICh3YXRjaGRvZyAqIEhaKSAvIDEwMDA7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IHBvbGxfdm9ydGV4OyAKKyNlbmRpZgorCWlmIChwZGV2KSB7CisJCXZwLT5wbV9zdGF0ZV92YWxpZCA9IDE7CisgCQlwY2lfc2F2ZV9zdGF0ZShWT1JURVhfUENJKHZwKSk7CisgCQlhY3BpX3NldF9XT0woZGV2KTsKKwl9CisJcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldHZhbCA9PSAwKQorCQlyZXR1cm4gMDsKKworZnJlZV9yaW5nOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgYm9vbV9yeF9kZXNjKSAqIFJYX1JJTkdfU0laRQorCQkJCQkJCSsgc2l6ZW9mKHN0cnVjdCBib29tX3R4X2Rlc2MpICogVFhfUklOR19TSVpFLAorCQkJCQkJdnAtPnJ4X3JpbmcsCisJCQkJCQl2cC0+cnhfcmluZ19kbWEpOworZnJlZV9yZWdpb246CisJaWYgKHZwLT5tdXN0X2ZyZWVfcmVnaW9uKQorCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIHZjaS0+aW9fc2l6ZSk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJ2b3J0ZXhfcHJvYmUxIGZhaWxzLiAgUmV0dXJucyAlZFxuIiwgcmV0dmFsKTsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAoraXNzdWVfYW5kX3dhaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNtZCkKK3sKKwlpbnQgaTsKKworCW91dHcoY21kLCBkZXYtPmJhc2VfYWRkciArIEVMM19DTUQpOworCWZvciAoaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKwkJaWYgKCEoaW53KGRldi0+YmFzZV9hZGRyICsgRUwzX1NUQVRVUykgJiBDbWRJblByb2dyZXNzKSkKKwkJCXJldHVybjsKKwl9CisKKwkvKiBPSywgdGhhdCBkaWRuJ3Qgd29yay4gIERvIGl0IHRoZSBzbG93IHdheS4gIE9uZSBzZWNvbmQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKKwkJaWYgKCEoaW53KGRldi0+YmFzZV9hZGRyICsgRUwzX1NUQVRVUykgJiBDbWRJblByb2dyZXNzKSkgeworCQkJaWYgKHZvcnRleF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbW1hbmQgMHglMDR4IHRvb2sgJWQgdXNlY3NcbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgY21kLCBpICogMTApOworCQkJcmV0dXJuOworCQl9CisJCXVkZWxheSgxMCk7CisJfQorCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbW1hbmQgMHglMDR4IGRpZCBub3QgY29tcGxldGUhIFN0YXR1cz0weCV4XG4iLAorCQkJICAgZGV2LT5uYW1lLCBjbWQsIGludyhkZXYtPmJhc2VfYWRkciArIEVMM19TVEFUVVMpKTsKK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IGNvbmZpZzsKKwlpbnQgaTsKKworCWlmIChWT1JURVhfUENJKHZwKSkgeworCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKFZPUlRFWF9QQ0kodnApLCBQQ0lfRDApOwkvKiBHbyBhY3RpdmUgKi8KKwkJcGNpX3Jlc3RvcmVfc3RhdGUoVk9SVEVYX1BDSSh2cCkpOworCQlwY2lfZW5hYmxlX2RldmljZShWT1JURVhfUENJKHZwKSk7CisJfQorCisJLyogQmVmb3JlIGluaXRpYWxpemluZyBzZWxlY3QgdGhlIGFjdGl2ZSBtZWRpYSBwb3J0LiAqLworCUVMM1dJTkRPVygzKTsKKwljb25maWcgPSBpbmwoaW9hZGRyICsgV24zX0NvbmZpZyk7CisKKwlpZiAodnAtPm1lZGlhX292ZXJyaWRlICE9IDcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lZGlhIG92ZXJyaWRlIHRvIHRyYW5zY2VpdmVyICVkICglcykuXG4iLAorCQkJICAgZGV2LT5uYW1lLCB2cC0+bWVkaWFfb3ZlcnJpZGUsCisJCQkgICBtZWRpYV90YmxbdnAtPm1lZGlhX292ZXJyaWRlXS5uYW1lKTsKKwkJZGV2LT5pZl9wb3J0ID0gdnAtPm1lZGlhX292ZXJyaWRlOworCX0gZWxzZSBpZiAodnAtPmF1dG9zZWxlY3QpIHsKKwkJaWYgKHZwLT5oYXNfbndheSkgeworCQkJaWYgKHZvcnRleF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVzaW5nIE5XQVkgZGV2aWNlIHRhYmxlLCBub3QgJWRcbiIsCisJCQkJCQkJCWRldi0+bmFtZSwgZGV2LT5pZl9wb3J0KTsKKwkJCWRldi0+aWZfcG9ydCA9IFhDVlJfTldBWTsKKwkJfSBlbHNlIHsKKwkJCS8qIEZpbmQgZmlyc3QgYXZhaWxhYmxlIG1lZGlhIHR5cGUsIHN0YXJ0aW5nIHdpdGggMTAwYmFzZVR4LiAqLworCQkJZGV2LT5pZl9wb3J0ID0gWENWUl8xMDBiYXNlVHg7CisJCQl3aGlsZSAoISAodnAtPmF2YWlsYWJsZV9tZWRpYSAmIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm1hc2spKQorCQkJCWRldi0+aWZfcG9ydCA9IG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5leHQ7CisJCQlpZiAodm9ydGV4X2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogZmlyc3QgYXZhaWxhYmxlIG1lZGlhIHR5cGU6ICVzXG4iLAorCQkJCQlkZXYtPm5hbWUsIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUpOworCQl9CisJfSBlbHNlIHsKKwkJZGV2LT5pZl9wb3J0ID0gdnAtPmRlZmF1bHRfbWVkaWE7CisJCWlmICh2b3J0ZXhfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVzaW5nIGRlZmF1bHQgbWVkaWEgJXNcbiIsCisJCQkJZGV2LT5uYW1lLCBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS5uYW1lKTsKKwl9CisKKwlpbml0X3RpbWVyKCZ2cC0+dGltZXIpOworCXZwLT50aW1lci5leHBpcmVzID0gUlVOX0FUKG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLndhaXQpOworCXZwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXZwLT50aW1lci5mdW5jdGlvbiA9IHZvcnRleF90aW1lcjsJCS8qIHRpbWVyIGhhbmRsZXIgKi8KKwlhZGRfdGltZXIoJnZwLT50aW1lcik7CisKKwlpbml0X3RpbWVyKCZ2cC0+cnhfb29tX3RpbWVyKTsKKwl2cC0+cnhfb29tX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJdnAtPnJ4X29vbV90aW1lci5mdW5jdGlvbiA9IHJ4X29vbV90aW1lcjsKKworCWlmICh2b3J0ZXhfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEluaXRpYWwgbWVkaWEgdHlwZSAlcy5cbiIsCisJCQkgICBkZXYtPm5hbWUsIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUpOworCisJdnAtPmZ1bGxfZHVwbGV4ID0gdnAtPmZvcmNlX2ZkOworCWNvbmZpZyA9IEJGSU5TKGNvbmZpZywgZGV2LT5pZl9wb3J0LCAyMCwgNCk7CisJaWYgKHZvcnRleF9kZWJ1ZyA+IDYpCisJCXByaW50ayhLRVJOX0RFQlVHICJ2b3J0ZXhfdXAoKTogd3JpdGluZyAweCV4IHRvIEludGVybmFsQ29uZmlnXG4iLCBjb25maWcpOworCW91dGwoY29uZmlnLCBpb2FkZHIgKyBXbjNfQ29uZmlnKTsKKworCWlmIChkZXYtPmlmX3BvcnQgPT0gWENWUl9NSUkgfHwgZGV2LT5pZl9wb3J0ID09IFhDVlJfTldBWSkgeworCQlpbnQgbWlpX3JlZzEsIG1paV9yZWc1OworCQlFTDNXSU5ET1coNCk7CisJCS8qIFJlYWQgQk1TUiAocmVnMSkgb25seSB0byBjbGVhciBvbGQgc3RhdHVzLiAqLworCQltaWlfcmVnMSA9IG1kaW9fcmVhZChkZXYsIHZwLT5waHlzWzBdLCAxKTsKKwkJbWlpX3JlZzUgPSBtZGlvX3JlYWQoZGV2LCB2cC0+cGh5c1swXSwgNSk7CisJCWlmIChtaWlfcmVnNSA9PSAweGZmZmYgIHx8ICBtaWlfcmVnNSA9PSAweDAwMDApIHsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7IC8qIE5vIE1JSSBkZXZpY2Ugb3Igbm8gbGluayBwYXJ0bmVyIHJlcG9ydCAqLworCQl9IGVsc2UgeworCQkJbWlpX3JlZzUgJj0gdnAtPmFkdmVydGlzaW5nOworCQkJaWYgKChtaWlfcmVnNSAmIDB4MDEwMCkgIT0gMAkvKiAxMDBiYXNlVHgtRkQgKi8KKwkJCQkgfHwgKG1paV9yZWc1ICYgMHgwMEMwKSA9PSAweDAwNDApIC8qIDEwVC1GRCwgYnV0IG5vdCAxMDAtSEQgKi8KKwkJCXZwLT5mdWxsX2R1cGxleCA9IDE7CisJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCX0KKwkJdnAtPnBhcnRuZXJfZmxvd19jdHJsID0gKChtaWlfcmVnNSAmIDB4MDQwMCkgIT0gMCk7CisJCWlmICh2b3J0ZXhfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSAjJWQgc3RhdHVzICU0LjR4LCBsaW5rIHBhcnRuZXIgY2FwYWJpbGl0eSAlNC40eCwiCisJCQkJICAgIiBpbmZvMSAlMDR4LCBzZXR0aW5nICVzLWR1cGxleC5cbiIsCisJCQkJCWRldi0+bmFtZSwgdnAtPnBoeXNbMF0sCisJCQkJCW1paV9yZWcxLCBtaWlfcmVnNSwKKwkJCQkJdnAtPmluZm8xLCAoKHZwLT5pbmZvMSAmIDB4ODAwMCkgfHwgdnAtPmZ1bGxfZHVwbGV4KSA/ICJmdWxsIiA6ICJoYWxmIik7CisJCUVMM1dJTkRPVygzKTsKKwl9CisKKwkvKiBTZXQgdGhlIGZ1bGwtZHVwbGV4IGJpdC4gKi8KKwlvdXR3KAkoKHZwLT5pbmZvMSAmIDB4ODAwMCkgfHwgdnAtPmZ1bGxfZHVwbGV4ID8gMHgyMCA6IDApIHwKKwkJIAkodnAtPmxhcmdlX2ZyYW1lcyA/IDB4NDAgOiAwKSB8CisJCQkoKHZwLT5mdWxsX2R1cGxleCAmJiB2cC0+Zmxvd19jdHJsICYmIHZwLT5wYXJ0bmVyX2Zsb3dfY3RybCkgPyAweDEwMCA6IDApLAorCQkJaW9hZGRyICsgV24zX01BQ19DdHJsKTsKKworCWlmICh2b3J0ZXhfZGVidWcgPiAxKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdm9ydGV4X3VwKCkgSW50ZXJuYWxDb25maWcgJTguOHguXG4iLAorCQkJZGV2LT5uYW1lLCBjb25maWcpOworCX0KKworCWlzc3VlX2FuZF93YWl0KGRldiwgVHhSZXNldCk7CisJLyoKKwkgKiBEb24ndCByZXNldCB0aGUgUEhZIC0gdGhhdCB1cHNldHMgYXV0b25lZ290aWF0aW9uIGR1cmluZyBESENQIG9wZXJhdGlvbnMuCisJICovCisJaXNzdWVfYW5kX3dhaXQoZGV2LCBSeFJlc2V0fDB4MDQpOworCisJb3V0dyhTZXRTdGF0dXNFbmIgfCAweDAwLCBpb2FkZHIgKyBFTDNfQ01EKTsKKworCWlmICh2b3J0ZXhfZGVidWcgPiAxKSB7CisJCUVMM1dJTkRPVyg0KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB2b3J0ZXhfdXAoKSBpcnEgJWQgbWVkaWEgc3RhdHVzICU0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgZGV2LT5pcnEsIGludyhpb2FkZHIgKyBXbjRfTWVkaWEpKTsKKwl9CisKKwkvKiBTZXQgdGhlIHN0YXRpb24gYWRkcmVzcyBhbmQgbWFzayBpbiB3aW5kb3cgMiBlYWNoIHRpbWUgb3BlbmVkLiAqLworCUVMM1dJTkRPVygyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlvdXRiKGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIGkpOworCWZvciAoOyBpIDwgMTI7IGkrPTIpCisJCW91dHcoMCwgaW9hZGRyICsgaSk7CisKKwlpZiAodnAtPmNiX2ZuX2Jhc2UpIHsKKwkJdW5zaWduZWQgc2hvcnQgbiA9IGludyhpb2FkZHIgKyBXbjJfUmVzZXRPcHRpb25zKSAmIH4weDQwMTA7CisJCWlmICh2cC0+ZHJ2X2ZsYWdzICYgSU5WRVJUX0xFRF9QV1IpCisJCQluIHw9IDB4MTA7CisJCWlmICh2cC0+ZHJ2X2ZsYWdzICYgSU5WRVJUX01JSV9QV1IpCisJCQluIHw9IDB4NDAwMDsKKwkJb3V0dyhuLCBpb2FkZHIgKyBXbjJfUmVzZXRPcHRpb25zKTsKKwl9CisKKwlpZiAoZGV2LT5pZl9wb3J0ID09IFhDVlJfMTBiYXNlMikKKwkJLyogU3RhcnQgdGhlIHRoaW5uZXQgdHJhbnNjZWl2ZXIuIFdlIHNob3VsZCByZWFsbHkgd2FpdCA1MG1zLi4uKi8KKwkJb3V0dyhTdGFydENvYXgsIGlvYWRkciArIEVMM19DTUQpOworCWlmIChkZXYtPmlmX3BvcnQgIT0gWENWUl9OV0FZKSB7CisJCUVMM1dJTkRPVyg0KTsKKwkJb3V0dygoaW53KGlvYWRkciArIFduNF9NZWRpYSkgJiB+KE1lZGlhXzEwVFB8TWVkaWFfU1FFKSkgfAorCQkJIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm1lZGlhX2JpdHMsIGlvYWRkciArIFduNF9NZWRpYSk7CisJfQorCisJLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCBjbGVhciBhbGwgc3RhdHMgYnkgcmVhZGluZy4gKi8KKwlvdXR3KFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJRUwzV0lORE9XKDYpOworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQlpbmIoaW9hZGRyICsgaSk7CisJaW53KGlvYWRkciArIDEwKTsKKwlpbncoaW9hZGRyICsgMTIpOworCS8qIE5ldzogT24gdGhlIFZvcnRleCB3ZSBtdXN0IGFsc28gY2xlYXIgdGhlIEJhZFNTRCBjb3VudGVyLiAqLworCUVMM1dJTkRPVyg0KTsKKwlpbmIoaW9hZGRyICsgMTIpOworCS8qIC4uYW5kIG9uIHRoZSBCb29tZXJhbmcgd2UgZW5hYmxlIHRoZSBleHRyYSBzdGF0aXN0aWNzIGJpdHMuICovCisJb3V0dygweDAwNDAsIGlvYWRkciArIFduNF9OZXREaWFnKTsKKworCS8qIFN3aXRjaCB0byByZWdpc3RlciBzZXQgNyBmb3Igbm9ybWFsIHVzZS4gKi8KKwlFTDNXSU5ET1coNyk7CisKKwlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl9yeCkgeyAvKiBCb29tZXJhbmcgYnVzIG1hc3Rlci4gKi8KKwkJdnAtPmN1cl9yeCA9IHZwLT5kaXJ0eV9yeCA9IDA7CisJCS8qIEluaXRpYWxpemUgdGhlIFJ4RWFybHkgcmVnaXN0ZXIgYXMgcmVjb21tZW5kZWQuICovCisJCW91dHcoU2V0UnhUaHJlc2hvbGQgKyAoMTUzNj4+MiksIGlvYWRkciArIEVMM19DTUQpOworCQlvdXRsKDB4MDAyMCwgaW9hZGRyICsgUGt0U3RhdHVzKTsKKwkJb3V0bCh2cC0+cnhfcmluZ19kbWEsIGlvYWRkciArIFVwTGlzdFB0cik7CisJfQorCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KSB7IAkJLyogQm9vbWVyYW5nIGJ1cyBtYXN0ZXIgVHguICovCisJCXZwLT5jdXJfdHggPSB2cC0+ZGlydHlfdHggPSAwOworCQlpZiAodnAtPmRydl9mbGFncyAmIElTX0JPT01FUkFORykKKwkJCW91dGIoUEtUX0JVRl9TWj4+OCwgaW9hZGRyICsgVHhGcmVlVGhyZXNob2xkKTsgLyogUm9vbSBmb3IgYSBwYWNrZXQuICovCisJCS8qIENsZWFyIHRoZSBSeCwgVHggcmluZ3MuICovCisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykJLyogQUtQTTogdGhpcyBpcyBkb25lIGluIHZvcnRleF9vcGVuLCB0b28gKi8KKwkJCXZwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKKwkJCXZwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQlvdXRsKDAsIGlvYWRkciArIERvd25MaXN0UHRyKTsKKwl9CisJLyogU2V0IHJlY2VpdmVyIG1vZGU6IHByZXN1bWFibHkgYWNjZXB0IGItY2FzZSBhbmQgcGh5cyBhZGRyIG9ubHkuICovCisJc2V0X3J4X21vZGUoZGV2KTsKKwkvKiBlbmFibGUgODAyLjFxIHRhZ2dlZCBmcmFtZXMgKi8KKwlzZXRfODAyMXFfbW9kZShkZXYsIDEpOworCW91dHcoU3RhdHNFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBUdXJuIG9uIHN0YXRpc3RpY3MuICovCisKKy8vCWlzc3VlX2FuZF93YWl0KGRldiwgU2V0VHhTdGFydHwweDA3ZmYpOworCW91dHcoUnhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBFbmFibGUgdGhlIHJlY2VpdmVyLiAqLworCW91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBFbmFibGUgdHJhbnNtaXR0ZXIuICovCisJLyogQWxsb3cgc3RhdHVzIGJpdHMgdG8gYmUgc2Vlbi4gKi8KKwl2cC0+c3RhdHVzX2VuYWJsZSA9IFNldFN0YXR1c0VuYiB8IEhvc3RFcnJvcnxJbnRSZXF8U3RhdHNGdWxsfFR4Q29tcGxldGV8CisJCSh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4ID8gRG93bkNvbXBsZXRlIDogVHhBdmFpbGFibGUpIHwKKwkJKHZwLT5mdWxsX2J1c19tYXN0ZXJfcnggPyBVcENvbXBsZXRlIDogUnhDb21wbGV0ZSkgfAorCQkodnAtPmJ1c19tYXN0ZXIgPyBETUFEb25lIDogMCk7CisJdnAtPmludHJfZW5hYmxlID0gU2V0SW50ckVuYiB8IEludExhdGNoIHwgVHhBdmFpbGFibGUgfAorCQkodnAtPmZ1bGxfYnVzX21hc3Rlcl9yeCA/IDAgOiBSeENvbXBsZXRlKSB8CisJCVN0YXRzRnVsbCB8IEhvc3RFcnJvciB8IFR4Q29tcGxldGUgfCBJbnRSZXEKKwkJfCAodnAtPmJ1c19tYXN0ZXIgPyBETUFEb25lIDogMCkgfCBVcENvbXBsZXRlIHwgRG93bkNvbXBsZXRlOworCW91dHcodnAtPnN0YXR1c19lbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCS8qIEFjayBhbGwgcGVuZGluZyBldmVudHMsIGFuZCBzZXQgYWN0aXZlIGluZGljYXRvciBtYXNrLiAqLworCW91dHcoQWNrSW50ciB8IEludExhdGNoIHwgVHhBdmFpbGFibGUgfCBSeEVhcmx5IHwgSW50UmVxLAorCQkgaW9hZGRyICsgRUwzX0NNRCk7CisJb3V0dyh2cC0+aW50cl9lbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCWlmICh2cC0+Y2JfZm5fYmFzZSkJCQkvKiBUaGUgUENNQ0lBIHBlb3BsZSBhcmUgaWRpb3RzLiAgKi8KKwkJd3JpdGVsKDB4ODAwMCwgdnAtPmNiX2ZuX2Jhc2UgKyA0KTsKKwluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKK30KKworc3RhdGljIGludAordm9ydGV4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlpbnQgcmV0dmFsOworCisJLyogVXNlIHRoZSBub3ctc3RhbmRhcmQgc2hhcmVkIElSUSBpbXBsZW1lbnRhdGlvbi4gKi8KKwlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCB2cC0+ZnVsbF9idXNfbWFzdGVyX3J4ID8KKwkJCQkmYm9vbWVyYW5nX2ludGVycnVwdCA6ICZ2b3J0ZXhfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgcmVzZXJ2ZSBJUlEgJWRcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl9yeCkgeyAvKiBCb29tZXJhbmcgYnVzIG1hc3Rlci4gKi8KKwkJaWYgKHZvcnRleF9kZWJ1ZyA+IDIpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICBGaWxsaW5nIGluIHRoZSBSeCByaW5nLlxuIiwgZGV2LT5uYW1lKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJdnAtPnJ4X3JpbmdbaV0ubmV4dCA9IGNwdV90b19sZTMyKHZwLT5yeF9yaW5nX2RtYSArIHNpemVvZihzdHJ1Y3QgYm9vbV9yeF9kZXNjKSAqIChpKzEpKTsKKwkJCXZwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CS8qIENsZWFyIGNvbXBsZXRlIGJpdC4gKi8KKwkJCXZwLT5yeF9yaW5nW2ldLmxlbmd0aCA9IGNwdV90b19sZTMyKFBLVF9CVUZfU1ogfCBMQVNUX0ZSQUcpOworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihQS1RfQlVGX1NaKTsKKwkJCXZwLT5yeF9za2J1ZmZbaV0gPSBza2I7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CQkJLyogQmFkIG5ld3MhICAqLworCQkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisJCQl2cC0+cnhfcmluZ1tpXS5hZGRyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoVk9SVEVYX1BDSSh2cCksIHNrYi0+dGFpbCwgUEtUX0JVRl9TWiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCX0KKwkJaWYgKGkgIT0gUlhfUklOR19TSVpFKSB7CisJCQlpbnQgajsKKwkJCXByaW50ayhLRVJOX0VNRVJHICIlczogbm8gbWVtb3J5IGZvciByeCByaW5nXG4iLCBkZXYtPm5hbWUpOworCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworCQkJCWlmICh2cC0+cnhfc2tidWZmW2pdKSB7CisJCQkJCWRldl9rZnJlZV9za2IodnAtPnJ4X3NrYnVmZltqXSk7CisJCQkJCXZwLT5yeF9za2J1ZmZbal0gPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9mcmVlX2lycTsKKwkJfQorCQkvKiBXcmFwIHRoZSByaW5nLiAqLworCQl2cC0+cnhfcmluZ1tpLTFdLm5leHQgPSBjcHVfdG9fbGUzMih2cC0+cnhfcmluZ19kbWEpOworCX0KKworCXZvcnRleF91cChkZXYpOworCXJldHVybiAwOworCitvdXRfZnJlZV9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitvdXQ6CisJaWYgKHZvcnRleF9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHZvcnRleF9vcGVuKCkgZmFpbHM6IHJldHVybmluZyAlZFxuIiwgZGV2LT5uYW1lLCByZXR2YWwpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IG5leHRfdGljayA9IDYwKkhaOworCWludCBvayA9IDA7CisJaW50IG1lZGlhX3N0YXR1cywgbWlpX3N0YXR1cywgb2xkX3dpbmRvdzsKKworCWlmICh2b3J0ZXhfZGVidWcgPiAyKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTWVkaWEgc2VsZWN0aW9uIHRpbWVyIHRpY2sgaGFwcGVuZWQsICVzLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJkZXYtPndhdGNoZG9nX3RpbWVvPSVkXG4iLCBkZXYtPndhdGNoZG9nX3RpbWVvKTsKKwl9CisKKwlpZiAodnAtPm1lZGlhbG9jaykKKwkJZ290byBsZWF2ZV9tZWRpYV9hbG9uZTsKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJb2xkX3dpbmRvdyA9IGludyhpb2FkZHIgKyBFTDNfQ01EKSA+PiAxMzsKKwlFTDNXSU5ET1coNCk7CisJbWVkaWFfc3RhdHVzID0gaW53KGlvYWRkciArIFduNF9NZWRpYSk7CisJc3dpdGNoIChkZXYtPmlmX3BvcnQpIHsKKwljYXNlIFhDVlJfMTBiYXNlVDogIGNhc2UgWENWUl8xMDBiYXNlVHg6ICBjYXNlIFhDVlJfMTAwYmFzZUZ4OgorCQlpZiAobWVkaWFfc3RhdHVzICYgTWVkaWFfTG5rQmVhdCkgeworCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJb2sgPSAxOworCQkJaWYgKHZvcnRleF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNZWRpYSAlcyBoYXMgbGluayBiZWF0LCAleC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSwgbWVkaWFfc3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQlpZiAodm9ydGV4X2RlYnVnID4gMSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTWVkaWEgJXMgaGFzIG5vIGxpbmsgYmVhdCwgJXguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUsIG1lZGlhX3N0YXR1cyk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBYQ1ZSX01JSTogY2FzZSBYQ1ZSX05XQVk6CisJCXsKKwkJCXNwaW5fbG9ja19iaCgmdnAtPmxvY2spOworCQkJbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChkZXYsIHZwLT5waHlzWzBdLCAxKTsKKwkJCW9rID0gMTsKKwkJCWlmICh2b3J0ZXhfZGVidWcgPiAyKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTUlJIHRyYW5zY2VpdmVyIGhhcyBzdGF0dXMgJTQuNHguXG4iLAorCQkJCQlkZXYtPm5hbWUsIG1paV9zdGF0dXMpOworCQkJaWYgKG1paV9zdGF0dXMgJiBCTVNSX0xTVEFUVVMpIHsKKwkJCQlpbnQgbWlpX3JlZzUgPSBtZGlvX3JlYWQoZGV2LCB2cC0+cGh5c1swXSwgNSk7CisJCQkJaWYgKCEgdnAtPmZvcmNlX2ZkICAmJiAgbWlpX3JlZzUgIT0gMHhmZmZmKSB7CisJCQkJCWludCBkdXBsZXg7CisKKwkJCQkJbWlpX3JlZzUgJj0gdnAtPmFkdmVydGlzaW5nOworCQkJCQlkdXBsZXggPSAobWlpX3JlZzUmMHgwMTAwKSB8fCAobWlpX3JlZzUgJiAweDAxQzApID09IDB4MDA0MDsKKwkJCQkJaWYgKHZwLT5mdWxsX2R1cGxleCAhPSBkdXBsZXgpIHsKKwkJCQkJCXZwLT5mdWxsX2R1cGxleCA9IGR1cGxleDsKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZXR0aW5nICVzLWR1cGxleCBiYXNlZCBvbiBNSUkgIgorCQkJCQkJCSIjJWQgbGluayBwYXJ0bmVyIGNhcGFiaWxpdHkgb2YgJTQuNHguXG4iLAorCQkJCQkJCWRldi0+bmFtZSwgdnAtPmZ1bGxfZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiLAorCQkJCQkJCXZwLT5waHlzWzBdLCBtaWlfcmVnNSk7CisJCQkJCQkvKiBTZXQgdGhlIGZ1bGwtZHVwbGV4IGJpdC4gKi8KKwkJCQkJCUVMM1dJTkRPVygzKTsKKwkJCQkJCW91dHcoCSh2cC0+ZnVsbF9kdXBsZXggPyAweDIwIDogMCkgfAorCQkJCQkJCQkodnAtPmxhcmdlX2ZyYW1lcyA/IDB4NDAgOiAwKSB8CisJCQkJCQkJCSgodnAtPmZ1bGxfZHVwbGV4ICYmIHZwLT5mbG93X2N0cmwgJiYgdnAtPnBhcnRuZXJfZmxvd19jdHJsKSA/IDB4MTAwIDogMCksCisJCQkJCQkJCWlvYWRkciArIFduM19NQUNfQ3RybCk7CisJCQkJCQlpZiAodm9ydGV4X2RlYnVnID4gMSkKKwkJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiU2V0dGluZyBkdXBsZXggaW4gV24zX01BQ19DdHJsXG4iKTsKKwkJCQkJCS8qIEFLUE06IGJ1Zzogc2hvdWxkIHJlc2V0IFR4IGFuZCBSeCBhZnRlciBzZXR0aW5nIER1cGxleC4gIFBhZ2UgMTgwICovCisJCQkJCX0KKwkJCQl9CisJCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJfSBlbHNlIHsKKwkJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJfQorCQkJc3Bpbl91bmxvY2tfYmgoJnZwLT5sb2NrKTsKKwkJfQorCQlicmVhazsKKwkgIGRlZmF1bHQ6CQkJCQkvKiBPdGhlciBtZWRpYSB0eXBlcyBoYW5kbGVkIGJ5IFR4IHRpbWVvdXRzLiAqLworCQlpZiAodm9ydGV4X2RlYnVnID4gMSkKKwkJICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1lZGlhICVzIGhhcyBubyBpbmRpY2F0aW9uLCAleC5cbiIsCisJCQkJIGRldi0+bmFtZSwgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSwgbWVkaWFfc3RhdHVzKTsKKwkJb2sgPSAxOworCX0KKwlpZiAoICEgb2spIHsKKwkJdW5zaWduZWQgaW50IGNvbmZpZzsKKworCQlkbyB7CisJCQlkZXYtPmlmX3BvcnQgPSBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS5uZXh0OworCQl9IHdoaWxlICggISAodnAtPmF2YWlsYWJsZV9tZWRpYSAmIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm1hc2spKTsKKwkJaWYgKGRldi0+aWZfcG9ydCA9PSBYQ1ZSX0RlZmF1bHQpIHsgLyogR28gYmFjayB0byBkZWZhdWx0LiAqLworCQkgIGRldi0+aWZfcG9ydCA9IHZwLT5kZWZhdWx0X21lZGlhOworCQkgIGlmICh2b3J0ZXhfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNZWRpYSBzZWxlY3Rpb24gZmFpbGluZywgdXNpbmcgZGVmYXVsdCAiCisJCQkJICAgIiVzIHBvcnQuXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSk7CisJCX0gZWxzZSB7CisJCQlpZiAodm9ydGV4X2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1lZGlhIHNlbGVjdGlvbiBmYWlsZWQsIG5vdyB0cnlpbmcgIgorCQkJCQkgICAiJXMgcG9ydC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSk7CisJCQluZXh0X3RpY2sgPSBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS53YWl0OworCQl9CisJCW91dHcoKG1lZGlhX3N0YXR1cyAmIH4oTWVkaWFfMTBUUHxNZWRpYV9TUUUpKSB8CisJCQkgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubWVkaWFfYml0cywgaW9hZGRyICsgV240X01lZGlhKTsKKworCQlFTDNXSU5ET1coMyk7CisJCWNvbmZpZyA9IGlubChpb2FkZHIgKyBXbjNfQ29uZmlnKTsKKwkJY29uZmlnID0gQkZJTlMoY29uZmlnLCBkZXYtPmlmX3BvcnQsIDIwLCA0KTsKKwkJb3V0bChjb25maWcsIGlvYWRkciArIFduM19Db25maWcpOworCisJCW91dHcoZGV2LT5pZl9wb3J0ID09IFhDVlJfMTBiYXNlMiA/IFN0YXJ0Q29heCA6IFN0b3BDb2F4LAorCQkJIGlvYWRkciArIEVMM19DTUQpOworCQlpZiAodm9ydGV4X2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICJ3cm90ZSAweCUwOHggdG8gV24zX0NvbmZpZ1xuIiwgY29uZmlnKTsKKwkJLyogQUtQTTogRklYTUU6IFNob3VsZCByZXNldCBSeCAmIFR4IGhlcmUuICBQNjAgb2YgM2M5MHhjLnBkZiAqLworCX0KKwlFTDNXSU5ET1cob2xkX3dpbmRvdyk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7CisKK2xlYXZlX21lZGlhX2Fsb25lOgorCWlmICh2b3J0ZXhfZGVidWcgPiAyKQorCSAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNZWRpYSBzZWxlY3Rpb24gdGltZXIgZmluaXNoZWQsICVzLlxuIiwKKwkJCSBkZXYtPm5hbWUsIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUpOworCisJbW9kX3RpbWVyKCZ2cC0+dGltZXIsIFJVTl9BVChuZXh0X3RpY2spKTsKKwlpZiAodnAtPmRlZmVycmVkKQorCQlvdXR3KEZha2VJbnRyLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgdHhfc3RhdHVzICUyLjJ4IHN0YXR1cyAlNC40eC5cbiIsCisJCSAgIGRldi0+bmFtZSwgaW5iKGlvYWRkciArIFR4U3RhdHVzKSwKKwkJICAgaW53KGlvYWRkciArIEVMM19TVEFUVVMpKTsKKwlFTDNXSU5ET1coNCk7CisJcHJpbnRrKEtFUk5fRVJSICIgIGRpYWdub3N0aWNzOiBuZXQgJTA0eCBtZWRpYSAlMDR4IGRtYSAlMDh4IGZpZm8gJTA0eFxuIiwKKwkJCWludyhpb2FkZHIgKyBXbjRfTmV0RGlhZyksCisJCQlpbncoaW9hZGRyICsgV240X01lZGlhKSwKKwkJCWlubChpb2FkZHIgKyBQa3RTdGF0dXMpLAorCQkJaW53KGlvYWRkciArIFduNF9GSUZPRGlhZykpOworCS8qIFNsaWdodCBjb2RlIGJsb2F0IHRvIGJlIHVzZXIgZnJpZW5kbHkuICovCisJaWYgKChpbmIoaW9hZGRyICsgVHhTdGF0dXMpICYgMHg4OCkgPT0gMHg4OCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVHJhbnNtaXR0ZXIgZW5jb3VudGVyZWQgMTYgY29sbGlzaW9ucyAtLSIKKwkJCSAgICIgbmV0d29yayBjYWJsZSBwcm9ibGVtP1xuIiwgZGV2LT5uYW1lKTsKKwlpZiAoaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgSW50TGF0Y2gpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW50ZXJydXB0IHBvc3RlZCBidXQgbm90IGRlbGl2ZXJlZCAtLSIKKwkJCSAgICIgSVJRIGJsb2NrZWQgYnkgYW5vdGhlciBkZXZpY2U/XG4iLCBkZXYtPm5hbWUpOworCQkvKiBCYWQgaWRlYSBoZXJlLi4gYnV0IHdlIG1pZ2h0IGFzIHdlbGwgaGFuZGxlIGEgZmV3IGV2ZW50cy4gKi8KKwkJeworCQkJLyoKKwkJCSAqIEJsb2NrIGludGVycnVwdHMgYmVjYXVzZSB2b3J0ZXhfaW50ZXJydXB0IGRvZXMgYSBiYXJlIHNwaW5fbG9jaygpCisJCQkgKi8KKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl90eCkKKwkJCQlib29tZXJhbmdfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworCQkJZWxzZQorCQkJCXZvcnRleF9pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCX0KKwl9CisKKwlpZiAodm9ydGV4X2RlYnVnID4gMCkKKwkJZHVtcF90eF9yaW5nKGRldik7CisKKwlpc3N1ZV9hbmRfd2FpdChkZXYsIFR4UmVzZXQpOworCisJdnAtPnN0YXRzLnR4X2Vycm9ycysrOworCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVzZXR0aW5nIHRoZSBUeCByaW5nIHBvaW50ZXIuXG4iLCBkZXYtPm5hbWUpOworCQlpZiAodnAtPmN1cl90eCAtIHZwLT5kaXJ0eV90eCA+IDAgICYmICBpbmwoaW9hZGRyICsgRG93bkxpc3RQdHIpID09IDApCisJCQlvdXRsKHZwLT50eF9yaW5nX2RtYSArICh2cC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkUpICogc2l6ZW9mKHN0cnVjdCBib29tX3R4X2Rlc2MpLAorCQkJCSBpb2FkZHIgKyBEb3duTGlzdFB0cik7CisJCWlmICh2cC0+Y3VyX3R4IC0gdnAtPmRpcnR5X3R4IDwgVFhfUklOR19TSVpFKQorCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJaWYgKHZwLT5kcnZfZmxhZ3MgJiBJU19CT09NRVJBTkcpCisJCQlvdXRiKFBLVF9CVUZfU1o+PjgsIGlvYWRkciArIFR4RnJlZVRocmVzaG9sZCk7CisJCW91dHcoRG93blVuc3RhbGwsIGlvYWRkciArIEVMM19DTUQpOworCX0gZWxzZSB7CisJCXZwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJCisJLyogSXNzdWUgVHggRW5hYmxlICovCisJb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCisJLyogU3dpdGNoIHRvIHJlZ2lzdGVyIHNldCA3IGZvciBub3JtYWwgdXNlLiAqLworCUVMM1dJTkRPVyg3KTsKK30KKworLyoKKyAqIEhhbmRsZSB1bmNvbW1vbiBpbnRlcnJ1cHQgc291cmNlcy4gIFRoaXMgaXMgYSBzZXBhcmF0ZSByb3V0aW5lIHRvIG1pbmltaXplCisgKiB0aGUgY2FjaGUgaW1wYWN0LgorICovCitzdGF0aWMgdm9pZAordm9ydGV4X2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGF0dXMpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgZG9fdHhfcmVzZXQgPSAwLCByZXNldF9tYXNrID0gMDsKKwl1bnNpZ25lZCBjaGFyIHR4X3N0YXR1cyA9IDA7CisKKwlpZiAodm9ydGV4X2RlYnVnID4gMikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB2b3J0ZXhfZXJyb3IoKSwgc3RhdHVzPTB4JXhcbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgVHhDb21wbGV0ZSkgewkJCS8qIFJlYWxseSAiVHhFcnJvciIgZm9yIHVzLiAqLworCQl0eF9zdGF0dXMgPSBpbmIoaW9hZGRyICsgVHhTdGF0dXMpOworCQkvKiBQcmVzdW1hYmx5IGEgdHgtdGltZW91dC4gV2UgbXVzdCBtZXJlbHkgcmUtZW5hYmxlLiAqLworCQlpZiAodm9ydGV4X2RlYnVnID4gMgorCQkJfHwgKHR4X3N0YXR1cyAhPSAweDg4ICYmIHZvcnRleF9kZWJ1ZyA+IDApKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUcmFuc21pdCBlcnJvciwgVHggc3RhdHVzIHJlZ2lzdGVyICUyLjJ4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHR4X3N0YXR1cyk7CisJCQlpZiAodHhfc3RhdHVzID09IDB4ODIpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlByb2JhYmx5IGEgZHVwbGV4IG1pc21hdGNoLiAgU2VlICIKKwkJCQkJCSJEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdm9ydGV4LnR4dFxuIik7CisJCQl9CisJCQlkdW1wX3R4X3JpbmcoZGV2KTsKKwkJfQorCQlpZiAodHhfc3RhdHVzICYgMHgxNCkgIHZwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQlpZiAodHhfc3RhdHVzICYgMHgzOCkgIHZwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQlvdXRiKDAsIGlvYWRkciArIFR4U3RhdHVzKTsKKwkJaWYgKHR4X3N0YXR1cyAmIDB4MzApIHsJCQkvKiB0eEphYmJlciBvciB0eFVuZGVycnVuICovCisJCQlkb190eF9yZXNldCA9IDE7CisJCX0gZWxzZSBpZiAoKHR4X3N0YXR1cyAmIDB4MDgpICYmICh2cC0+ZHJ2X2ZsYWdzICYgTUFYX0NPTExJU0lPTl9SRVNFVCkpIHsJLyogbWF4Q29sbGlzaW9ucyAqLworCQkJZG9fdHhfcmVzZXQgPSAxOworCQkJcmVzZXRfbWFzayA9IDB4MDEwODsJCS8qIFJlc2V0IGludGVyZmFjZSBsb2dpYywgYnV0IG5vdCBkb3dubG9hZCBsb2dpYyAqLworCQl9IGVsc2UgewkJCQkJCS8qIE1lcmVseSByZS1lbmFibGUgdGhlIHRyYW5zbWl0dGVyLiAqLworCQkJb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzICYgUnhFYXJseSkgewkJCQkvKiBSeCBlYXJseSBpcyB1bnVzZWQuICovCisJCXZvcnRleF9yeChkZXYpOworCQlvdXR3KEFja0ludHIgfCBSeEVhcmx5LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwl9CisJaWYgKHN0YXR1cyAmIFN0YXRzRnVsbCkgewkJCS8qIEVtcHR5IHN0YXRpc3RpY3MuICovCisJCXN0YXRpYyBpbnQgRG9uZURpZFRoYXQ7CisJCWlmICh2b3J0ZXhfZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBVcGRhdGluZyBzdGF0cy5cbiIsIGRldi0+bmFtZSk7CisJCXVwZGF0ZV9zdGF0cyhpb2FkZHIsIGRldik7CisJCS8qIEhBQ0s6IERpc2FibGUgc3RhdGlzdGljcyBhcyBhbiBpbnRlcnJ1cHQgc291cmNlLiAqLworCQkvKiBUaGlzIG9jY3VycyB3aGVuIHdlIGhhdmUgdGhlIHdyb25nIG1lZGlhIHR5cGUhICovCisJCWlmIChEb25lRGlkVGhhdCA9PSAwICAmJgorCQkJaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgU3RhdHNGdWxsKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVXBkYXRpbmcgc3RhdGlzdGljcyBmYWlsZWQsIGRpc2FibGluZyAiCisJCQkJICAgInN0YXRzIGFzIGFuIGludGVycnVwdCBzb3VyY2UuXG4iLCBkZXYtPm5hbWUpOworCQkJRUwzV0lORE9XKDUpOworCQkJb3V0dyhTZXRJbnRyRW5iIHwgKGludyhpb2FkZHIgKyAxMCkgJiB+U3RhdHNGdWxsKSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQl2cC0+aW50cl9lbmFibGUgJj0gflN0YXRzRnVsbDsKKwkJCUVMM1dJTkRPVyg3KTsKKwkJCURvbmVEaWRUaGF0Kys7CisJCX0KKwl9CisJaWYgKHN0YXR1cyAmIEludFJlcSkgewkJLyogUmVzdG9yZSBhbGwgaW50ZXJydXB0IHNvdXJjZXMuICAqLworCQlvdXR3KHZwLT5zdGF0dXNfZW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJb3V0dyh2cC0+aW50cl9lbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCX0KKwlpZiAoc3RhdHVzICYgSG9zdEVycm9yKSB7CisJCXUxNiBmaWZvX2RpYWc7CisJCUVMM1dJTkRPVyg0KTsKKwkJZmlmb19kaWFnID0gaW53KGlvYWRkciArIFduNF9GSUZPRGlhZyk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhvc3QgZXJyb3IsIEZJRk8gZGlhZ25vc3RpYyByZWdpc3RlciAlNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGZpZm9fZGlhZyk7CisJCS8qIEFkYXB0ZXIgZmFpbHVyZSByZXF1aXJlcyBUeC9SeCByZXNldCBhbmQgcmVpbml0LiAqLworCQlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl90eCkgeworCQkJaW50IGJ1c19zdGF0dXMgPSBpbmwoaW9hZGRyICsgUGt0U3RhdHVzKTsKKwkJCS8qIDB4ODAwMDAwMDAgUENJIG1hc3RlciBhYm9ydC4gKi8KKwkJCS8qIDB4NDAwMDAwMDAgUENJIHRhcmdldCBhYm9ydC4gKi8KKwkJCWlmICh2b3J0ZXhfZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIGJ1cyBlcnJvciwgYnVzIHN0YXR1cyAlOC44eFxuIiwgZGV2LT5uYW1lLCBidXNfc3RhdHVzKTsKKworCQkJLyogSW4gdGhpcyBjYXNlLCBibG93IHRoZSBjYXJkIGF3YXkgKi8KKwkJCS8qIE11c3Qgbm90IGVudGVyIEQzIG9yIHdlIGNhbid0IGxlZ2FsbHkgaXNzdWUgdGhlIHJlc2V0ISAqLworCQkJdm9ydGV4X2Rvd24oZGV2LCAwKTsKKwkJCWlzc3VlX2FuZF93YWl0KGRldiwgVG90YWxSZXNldCB8IDB4ZmYpOworCQkJdm9ydGV4X3VwKGRldik7CQkvKiBBS1BNOiBidWcuICB2b3J0ZXhfdXAoKSBhc3N1bWVzIHRoYXQgdGhlIHJ4IHJpbmcgaXMgZnVsbC4gSXQgbWF5IG5vdCBiZS4gKi8KKwkJfSBlbHNlIGlmIChmaWZvX2RpYWcgJiAweDA0MDApCisJCQlkb190eF9yZXNldCA9IDE7CisJCWlmIChmaWZvX2RpYWcgJiAweDMwMDApIHsKKwkJCS8qIFJlc2V0IFJ4IGZpZm8gYW5kIHVwbG9hZCBsb2dpYyAqLworCQkJaXNzdWVfYW5kX3dhaXQoZGV2LCBSeFJlc2V0fDB4MDcpOworCQkJLyogU2V0IHRoZSBSeCBmaWx0ZXIgdG8gdGhlIGN1cnJlbnQgc3RhdGUuICovCisJCQlzZXRfcnhfbW9kZShkZXYpOworCQkJLyogZW5hYmxlIDgwMi4xcSBWTEFOIHRhZ2dlZCBmcmFtZXMgKi8KKwkJCXNldF84MDIxcV9tb2RlKGRldiwgMSk7CisJCQlvdXR3KFJ4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsgLyogUmUtZW5hYmxlIHRoZSByZWNlaXZlci4gKi8KKwkJCW91dHcoQWNrSW50ciB8IEhvc3RFcnJvciwgaW9hZGRyICsgRUwzX0NNRCk7CisJCX0KKwl9CisKKwlpZiAoZG9fdHhfcmVzZXQpIHsKKwkJaXNzdWVfYW5kX3dhaXQoZGV2LCBUeFJlc2V0fHJlc2V0X21hc2spOworCQlvdXR3KFR4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJaWYgKCF2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KK30KKworc3RhdGljIGludAordm9ydGV4X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJLyogUHV0IG91dCB0aGUgZG91Ymxld29yZCBoZWFkZXIuLi4gKi8KKwlvdXRsKHNrYi0+bGVuLCBpb2FkZHIgKyBUWF9GSUZPKTsKKwlpZiAodnAtPmJ1c19tYXN0ZXIpIHsKKwkJLyogU2V0IHRoZSBidXMtbWFzdGVyIGNvbnRyb2xsZXIgdG8gdHJhbnNmZXIgdGhlIHBhY2tldC4gKi8KKwkJaW50IGxlbiA9IChza2ItPmxlbiArIDMpICYgfjM7CisJCW91dGwoCXZwLT50eF9za2JfZG1hID0gcGNpX21hcF9zaW5nbGUoVk9SVEVYX1BDSSh2cCksIHNrYi0+ZGF0YSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKSwKKwkJCQlpb2FkZHIgKyBXbjdfTWFzdGVyQWRkcik7CisJCW91dHcobGVuLCBpb2FkZHIgKyBXbjdfTWFzdGVyTGVuKTsKKwkJdnAtPnR4X3NrYiA9IHNrYjsKKwkJb3V0dyhTdGFydERNQURvd24sIGlvYWRkciArIEVMM19DTUQpOworCQkvKiBuZXRpZl93YWtlX3F1ZXVlKCkgd2lsbCBiZSBjYWxsZWQgYXQgdGhlIERNQURvbmUgaW50ZXJydXB0LiAqLworCX0gZWxzZSB7CisJCS8qIC4uLiBhbmQgdGhlIHBhY2tldCByb3VuZGVkIHRvIGEgZG91Ymxld29yZC4gKi8KKwkJb3V0c2woaW9hZGRyICsgVFhfRklGTywgc2tiLT5kYXRhLCAoc2tiLT5sZW4gKyAzKSA+PiAyKTsKKwkJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKwkJaWYgKGludyhpb2FkZHIgKyBUeEZyZWUpID4gMTUzNikgeworCQkJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CS8qIEFLUE06IHJlZHVuZGFudD8gKi8KKwkJfSBlbHNlIHsKKwkJCS8qIEludGVycnVwdCB1cyB3aGVuIHRoZSBGSUZPIGhhcyByb29tIGZvciBtYXgtc2l6ZWQgcGFja2V0LiAqLworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJb3V0dyhTZXRUeFRocmVzaG9sZCArICgxNTM2Pj4yKSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCX0KKwl9CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIENsZWFyIHRoZSBUeCBzdGF0dXMgc3RhY2suICovCisJeworCQlpbnQgdHhfc3RhdHVzOworCQlpbnQgaSA9IDMyOworCisJCXdoaWxlICgtLWkgPiAwCSYmCSh0eF9zdGF0dXMgPSBpbmIoaW9hZGRyICsgVHhTdGF0dXMpKSA+IDApIHsKKwkJCWlmICh0eF9zdGF0dXMgJiAweDNDKSB7CQkvKiBBIFR4LWRpc2FibGluZyBlcnJvciBvY2N1cnJlZC4gICovCisJCQkJaWYgKHZvcnRleF9kZWJ1ZyA+IDIpCisJCQkJICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IFR4IGVycm9yLCBzdGF0dXMgJTIuMnguXG4iLAorCQkJCQkJIGRldi0+bmFtZSwgdHhfc3RhdHVzKTsKKwkJCQlpZiAodHhfc3RhdHVzICYgMHgwNCkgdnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJaWYgKHR4X3N0YXR1cyAmIDB4MzgpIHZwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCWlmICh0eF9zdGF0dXMgJiAweDMwKSB7CisJCQkJCWlzc3VlX2FuZF93YWl0KGRldiwgVHhSZXNldCk7CisJCQkJfQorCQkJCW91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCQkJfQorCQkJb3V0YigweDAwLCBpb2FkZHIgKyBUeFN0YXR1cyk7IC8qIFBvcCB0aGUgc3RhdHVzIHN0YWNrLiAqLworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citib29tZXJhbmdfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJLyogQ2FsY3VsYXRlIHRoZSBuZXh0IFR4IGRlc2NyaXB0b3IgZW50cnkuICovCisJaW50IGVudHJ5ID0gdnAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKwlzdHJ1Y3QgYm9vbV90eF9kZXNjICpwcmV2X2VudHJ5ID0gJnZwLT50eF9yaW5nWyh2cC0+Y3VyX3R4LTEpICUgVFhfUklOR19TSVpFXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHZvcnRleF9kZWJ1ZyA+IDYpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImJvb21lcmFuZ19zdGFydF94bWl0KClcbiIpOworCQlpZiAodm9ydGV4X2RlYnVnID4gMykKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJ5aW5nIHRvIHNlbmQgYSBwYWNrZXQsIFR4IGluZGV4ICVkLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHZwLT5jdXJfdHgpOworCX0KKworCWlmICh2cC0+Y3VyX3R4IC0gdnAtPmRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSkgeworCQlpZiAodm9ydGV4X2RlYnVnID4gMCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCVUchIFR4IFJpbmcgZnVsbCwgcmVmdXNpbmcgdG8gc2VuZCBidWZmZXIuXG4iLAorCQkJCSAgIGRldi0+bmFtZSk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDE7CisJfQorCisJdnAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisKKwl2cC0+dHhfcmluZ1tlbnRyeV0ubmV4dCA9IDA7CisjaWYgRE9fWkVST0NPUFkKKwlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fSFcpCisJCQl2cC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoc2tiLT5sZW4gfCBUeEludHJVcGxvYWRlZCk7CisJZWxzZQorCQkJdnAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9IGNwdV90b19sZTMyKHNrYi0+bGVuIHwgVHhJbnRyVXBsb2FkZWQgfCBBZGRUQ1BDaGtzdW0gfCBBZGRVRFBDaGtzdW0pOworCisJaWYgKCFza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSB7CisJCXZwLT50eF9yaW5nW2VudHJ5XS5mcmFnWzBdLmFkZHIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwgc2tiLT5kYXRhLAorCQkJCQkJCQkJCXNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKSk7CisJCXZwLT50eF9yaW5nW2VudHJ5XS5mcmFnWzBdLmxlbmd0aCA9IGNwdV90b19sZTMyKHNrYi0+bGVuIHwgTEFTVF9GUkFHKTsKKwl9IGVsc2UgeworCQlpbnQgaTsKKworCQl2cC0+dHhfcmluZ1tlbnRyeV0uZnJhZ1swXS5hZGRyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoVk9SVEVYX1BDSSh2cCksIHNrYi0+ZGF0YSwKKwkJCQkJCQkJCQlza2ItPmxlbi1za2ItPmRhdGFfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKSk7CisJCXZwLT50eF9yaW5nW2VudHJ5XS5mcmFnWzBdLmxlbmd0aCA9IGNwdV90b19sZTMyKHNrYi0+bGVuLXNrYi0+ZGF0YV9sZW4pOworCisJCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKworCQkJdnAtPnR4X3JpbmdbZW50cnldLmZyYWdbaSsxXS5hZGRyID0KKwkJCQkJY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoVk9SVEVYX1BDSSh2cCksCisJCQkJCQkJCQkJCSAgICh2b2lkKilwYWdlX2FkZHJlc3MoZnJhZy0+cGFnZSkgKyBmcmFnLT5wYWdlX29mZnNldCwKKwkJCQkJCQkJCQkJICAgZnJhZy0+c2l6ZSwgUENJX0RNQV9UT0RFVklDRSkpOworCisJCQlpZiAoaSA9PSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzLTEpCisJCQkJCXZwLT50eF9yaW5nW2VudHJ5XS5mcmFnW2krMV0ubGVuZ3RoID0gY3B1X3RvX2xlMzIoZnJhZy0+c2l6ZXxMQVNUX0ZSQUcpOworCQkJZWxzZQorCQkJCQl2cC0+dHhfcmluZ1tlbnRyeV0uZnJhZ1tpKzFdLmxlbmd0aCA9IGNwdV90b19sZTMyKGZyYWctPnNpemUpOworCQl9CisJfQorI2Vsc2UKKwl2cC0+dHhfcmluZ1tlbnRyeV0uYWRkciA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKFZPUlRFWF9QQ0kodnApLCBza2ItPmRhdGEsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKSk7CisJdnAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCA9IGNwdV90b19sZTMyKHNrYi0+bGVuIHwgTEFTVF9GUkFHKTsKKwl2cC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoc2tiLT5sZW4gfCBUeEludHJVcGxvYWRlZCk7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCS8qIFdhaXQgZm9yIHRoZSBzdGFsbCB0byBjb21wbGV0ZS4gKi8KKwlpc3N1ZV9hbmRfd2FpdChkZXYsIERvd25TdGFsbCk7CisJcHJldl9lbnRyeS0+bmV4dCA9IGNwdV90b19sZTMyKHZwLT50eF9yaW5nX2RtYSArIGVudHJ5ICogc2l6ZW9mKHN0cnVjdCBib29tX3R4X2Rlc2MpKTsKKwlpZiAoaW5sKGlvYWRkciArIERvd25MaXN0UHRyKSA9PSAwKSB7CisJCW91dGwodnAtPnR4X3JpbmdfZG1hICsgZW50cnkgKiBzaXplb2Yoc3RydWN0IGJvb21fdHhfZGVzYyksIGlvYWRkciArIERvd25MaXN0UHRyKTsKKwkJdnAtPnF1ZXVlZF9wYWNrZXQrKzsKKwl9CisKKwl2cC0+Y3VyX3R4Kys7CisJaWYgKHZwLT5jdXJfdHggLSB2cC0+ZGlydHlfdHggPiBUWF9SSU5HX1NJWkUgLSAxKSB7CisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJfSBlbHNlIHsJCQkJCS8qIENsZWFyIHByZXZpb3VzIGludGVycnVwdCBlbmFibGUuICovCisjaWYgZGVmaW5lZCh0eF9pbnRlcnJ1cHRfbWl0aWdhdGlvbikKKwkJLyogRHViaW91cy4gSWYgaW4gYm9vbWVhbmdfaW50ZXJydXB0ICJmYXN0ZXIiIGN5Y2xvbmUgaWZkZWYKKwkJICogd2VyZSBzZWxlY3RlZCwgdGhpcyB3b3VsZCBjb3JydXB0IEROX0NPTVBMRVRFLiBObz8KKwkJICovCisJCXByZXZfZW50cnktPnN0YXR1cyAmPSBjcHVfdG9fbGUzMih+VHhJbnRyVXBsb2FkZWQpOworI2VuZGlmCisJfQorCW91dHcoRG93blVuc3RhbGwsIGlvYWRkciArIEVMM19DTUQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIGFsbCBvZiB0aGUgUnggdGhyZWFkIHdvcmsgYW5kIGNsZWFucyB1cAorICAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIElTUiBmb3IgdGhlIHZvcnRleCBzZXJpZXMgY2hpcHMuCisgKiBmdWxsX2J1c19tYXN0ZXJfdHggPT0gMCAmJiBmdWxsX2J1c19tYXN0ZXJfcnggPT0gMAorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdAordm9ydGV4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHI7CisJaW50IHN0YXR1czsKKwlpbnQgd29ya19kb25lID0gbWF4X2ludGVycnVwdF93b3JrOworCWludCBoYW5kbGVkID0gMDsKKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXNwaW5fbG9jaygmdnAtPmxvY2spOworCisJc3RhdHVzID0gaW53KGlvYWRkciArIEVMM19TVEFUVVMpOworCisJaWYgKHZvcnRleF9kZWJ1ZyA+IDYpCisJCXByaW50aygidm9ydGV4X2ludGVycnVwdCgpLiBzdGF0dXM9MHglNHhcbiIsIHN0YXR1cyk7CisKKwlpZiAoKHN0YXR1cyAmIEludExhdGNoKSA9PSAwKQorCQlnb3RvIGhhbmRsZXJfZXhpdDsJCS8qIE5vIGludGVycnVwdDogc2hhcmVkIElSUXMgY2F1c2UgdGhpcyAqLworCWhhbmRsZWQgPSAxOworCisJaWYgKHN0YXR1cyAmIEludFJlcSkgeworCQlzdGF0dXMgfD0gdnAtPmRlZmVycmVkOworCQl2cC0+ZGVmZXJyZWQgPSAwOworCX0KKworCWlmIChzdGF0dXMgPT0gMHhmZmZmKQkJLyogaC93IG5vIGxvbmdlciBwcmVzZW50IChob3RwbHVnKT8gKi8KKwkJZ290byBoYW5kbGVyX2V4aXQ7CisKKwlpZiAodm9ydGV4X2RlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQsIHN0YXR1cyAlNC40eCwgbGF0ZW5jeSAlZCB0aWNrcy5cbiIsCisJCQkgICBkZXYtPm5hbWUsIHN0YXR1cywgaW5iKGlvYWRkciArIFRpbWVyKSk7CisKKwlkbyB7CisJCWlmICh2b3J0ZXhfZGVidWcgPiA1KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogSW4gaW50ZXJydXB0IGxvb3AsIHN0YXR1cyAlNC40eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFJ4Q29tcGxldGUpCisJCQl2b3J0ZXhfcngoZGV2KTsKKworCQlpZiAoc3RhdHVzICYgVHhBdmFpbGFibGUpIHsKKwkJCWlmICh2b3J0ZXhfZGVidWcgPiA1KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIJVFggcm9vbSBiaXQgd2FzIGhhbmRsZWQuXG4iKTsKKwkJCS8qIFRoZXJlJ3Mgcm9vbSBpbiB0aGUgRklGTyBmb3IgYSBmdWxsLXNpemVkIHBhY2tldC4gKi8KKwkJCW91dHcoQWNrSW50ciB8IFR4QXZhaWxhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCX0KKworCQlpZiAoc3RhdHVzICYgRE1BRG9uZSkgeworCQkJaWYgKGludyhpb2FkZHIgKyBXbjdfTWFzdGVyU3RhdHVzKSAmIDB4MTAwMCkgeworCQkJCW91dHcoMHgxMDAwLCBpb2FkZHIgKyBXbjdfTWFzdGVyU3RhdHVzKTsgLyogQWNrIHRoZSBldmVudC4gKi8KKwkJCQlwY2lfdW5tYXBfc2luZ2xlKFZPUlRFWF9QQ0kodnApLCB2cC0+dHhfc2tiX2RtYSwgKHZwLT50eF9za2ItPmxlbiArIDMpICYgfjMsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2JfaXJxKHZwLT50eF9za2IpOyAvKiBSZWxlYXNlIHRoZSB0cmFuc2ZlcnJlZCBidWZmZXIgKi8KKwkJCQlpZiAoaW53KGlvYWRkciArIFR4RnJlZSkgPiAxNTM2KSB7CisJCQkJCS8qCisJCQkJCSAqIEFLUE06IEZJWE1FOiBJIGRvbid0IHRoaW5rIHdlIG5lZWQgdGhpcy4gIElmIHRoZSBxdWV1ZSB3YXMgc3RvcHBlZCBkdWUgdG8KKwkJCQkJICogaW5zdWZmaWNpZW50IEZJRk8gcm9vbSwgdGhlIFR4QXZhaWxhYmxlIHRlc3Qgd2lsbCBzdWNjZWVkIGFuZCBjYWxsCisJCQkJCSAqIG5ldGlmX3dha2VfcXVldWUoKQorCQkJCQkgKi8KKwkJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCX0gZWxzZSB7IC8qIEludGVycnVwdCB3aGVuIEZJRk8gaGFzIHJvb20gZm9yIG1heC1zaXplZCBwYWNrZXQuICovCisJCQkJCW91dHcoU2V0VHhUaHJlc2hvbGQgKyAoMTUzNj4+MiksIGlvYWRkciArIEVMM19DTUQpOworCQkJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIENoZWNrIGZvciBhbGwgdW5jb21tb24gaW50ZXJydXB0cyBhdCBvbmNlLiAqLworCQlpZiAoc3RhdHVzICYgKEhvc3RFcnJvciB8IFJ4RWFybHkgfCBTdGF0c0Z1bGwgfCBUeENvbXBsZXRlIHwgSW50UmVxKSkgeworCQkJaWYgKHN0YXR1cyA9PSAweGZmZmYpCisJCQkJYnJlYWs7CisJCQl2b3J0ZXhfZXJyb3IoZGV2LCBzdGF0dXMpOworCQl9CisKKwkJaWYgKC0td29ya19kb25lIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtdWNoIHdvcmsgaW4gaW50ZXJydXB0LCBzdGF0dXMgIgorCQkJCSAgICIlNC40eC5cbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCS8qIERpc2FibGUgYWxsIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKwkJCWRvIHsKKwkJCQl2cC0+ZGVmZXJyZWQgfD0gc3RhdHVzOworCQkJCW91dHcoU2V0U3RhdHVzRW5iIHwgKH52cC0+ZGVmZXJyZWQgJiB2cC0+c3RhdHVzX2VuYWJsZSksCisJCQkJCSBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCQlvdXR3KEFja0ludHIgfCAodnAtPmRlZmVycmVkICYgMHg3ZmYpLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCX0gd2hpbGUgKChzdGF0dXMgPSBpbncoaW9hZGRyICsgRUwzX0NNRCkpICYgSW50TGF0Y2gpOworCQkJLyogVGhlIHRpbWVyIHdpbGwgcmVlbmFibGUgaW50ZXJydXB0cy4gKi8KKwkJCW1vZF90aW1lcigmdnAtPnRpbWVyLCBqaWZmaWVzICsgMSpIWik7CisJCQlicmVhazsKKwkJfQorCQkvKiBBY2tub3dsZWRnZSB0aGUgSVJRLiAqLworCQlvdXR3KEFja0ludHIgfCBJbnRSZXEgfCBJbnRMYXRjaCwgaW9hZGRyICsgRUwzX0NNRCk7CisJfSB3aGlsZSAoKHN0YXR1cyA9IGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSkgJiAoSW50TGF0Y2ggfCBSeENvbXBsZXRlKSk7CisKKwlpZiAodm9ydGV4X2RlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKK2hhbmRsZXJfZXhpdDoKKwlzcGluX3VubG9jaygmdnAtPmxvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgSVNSIGZvciB0aGUgYm9vbWVyYW5nIHNlcmllcyBjaGlwcy4KKyAqIGZ1bGxfYnVzX21hc3Rlcl90eCA9PSAxICYmIGZ1bGxfYnVzX21hc3Rlcl9yeCA9PSAxCisgKi8KKworc3RhdGljIGlycXJldHVybl90Citib29tZXJhbmdfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkcjsKKwlpbnQgc3RhdHVzOworCWludCB3b3JrX2RvbmUgPSBtYXhfaW50ZXJydXB0X3dvcms7CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8qCisJICogSXQgc2VlbXMgZG9wZXkgdG8gcHV0IHRoZSBzcGlubG9jayB0aGlzIGVhcmx5LCBidXQgd2UgY291bGQgcmFjZSBhZ2FpbnN0IHZvcnRleF90eF90aW1lb3V0CisJICogYW5kIGJvb21lcmFuZ19zdGFydF94bWl0CisJICovCisJc3Bpbl9sb2NrKCZ2cC0+bG9jayk7CisKKwlzdGF0dXMgPSBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyk7CisKKwlpZiAodm9ydGV4X2RlYnVnID4gNikKKwkJcHJpbnRrKEtFUk5fREVCVUcgImJvb21lcmFuZ19pbnRlcnJ1cHQuIHN0YXR1cz0weCU0eFxuIiwgc3RhdHVzKTsKKworCWlmICgoc3RhdHVzICYgSW50TGF0Y2gpID09IDApCisJCWdvdG8gaGFuZGxlcl9leGl0OwkJLyogTm8gaW50ZXJydXB0OiBzaGFyZWQgSVJRcyBjYW4gY2F1c2UgdGhpcyAqLworCisJaWYgKHN0YXR1cyA9PSAweGZmZmYpIHsJCS8qIGgvdyBubyBsb25nZXIgcHJlc2VudCAoaG90cGx1Zyk/ICovCisJCWlmICh2b3J0ZXhfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImJvb21lcmFuZ19pbnRlcnJ1cHQoMSk6IHN0YXR1cyA9IDB4ZmZmZlxuIik7CisJCWdvdG8gaGFuZGxlcl9leGl0OworCX0KKworCWlmIChzdGF0dXMgJiBJbnRSZXEpIHsKKwkJc3RhdHVzIHw9IHZwLT5kZWZlcnJlZDsKKwkJdnAtPmRlZmVycmVkID0gMDsKKwl9CisKKwlpZiAodm9ydGV4X2RlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQsIHN0YXR1cyAlNC40eCwgbGF0ZW5jeSAlZCB0aWNrcy5cbiIsCisJCQkgICBkZXYtPm5hbWUsIHN0YXR1cywgaW5iKGlvYWRkciArIFRpbWVyKSk7CisJZG8geworCQlpZiAodm9ydGV4X2RlYnVnID4gNSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEluIGludGVycnVwdCBsb29wLCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCWlmIChzdGF0dXMgJiBVcENvbXBsZXRlKSB7CisJCQlvdXR3KEFja0ludHIgfCBVcENvbXBsZXRlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCWlmICh2b3J0ZXhfZGVidWcgPiA1KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJib29tZXJhbmdfaW50ZXJydXB0LT5ib29tZXJhbmdfcnhcbiIpOworCQkJYm9vbWVyYW5nX3J4KGRldik7CisJCX0KKworCQlpZiAoc3RhdHVzICYgRG93bkNvbXBsZXRlKSB7CisJCQl1bnNpZ25lZCBpbnQgZGlydHlfdHggPSB2cC0+ZGlydHlfdHg7CisKKwkJCW91dHcoQWNrSW50ciB8IERvd25Db21wbGV0ZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQl3aGlsZSAodnAtPmN1cl90eCAtIGRpcnR5X3R4ID4gMCkgeworCQkJCWludCBlbnRyeSA9IGRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworI2lmIDEJLyogQUtQTTogdGhlIGxhdHRlciBpcyBmYXN0ZXIsIGJ1dCBjeWNsb25lLW9ubHkgKi8KKwkJCQlpZiAoaW5sKGlvYWRkciArIERvd25MaXN0UHRyKSA9PQorCQkJCQl2cC0+dHhfcmluZ19kbWEgKyBlbnRyeSAqIHNpemVvZihzdHJ1Y3QgYm9vbV90eF9kZXNjKSkKKwkJCQkJYnJlYWs7CQkJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gcHJvY2Vzc2VkLiAqLworI2Vsc2UKKwkJCQlpZiAoKHZwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgJiBETl9DT01QTEVURSkgPT0gMCkKKwkJCQkJYnJlYWs7CQkJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gcHJvY2Vzc2VkLiAqLworI2VuZGlmCisJCQkJCQorCQkJCWlmICh2cC0+dHhfc2tidWZmW2VudHJ5XSkgeworCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdnAtPnR4X3NrYnVmZltlbnRyeV07CisjaWYgRE9fWkVST0NPUFkJCQkJCQorCQkJCQlpbnQgaTsKKwkJCQkJZm9yIChpPTA7IGk8PXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykKKwkJCQkJCQlwY2lfdW5tYXBfc2luZ2xlKFZPUlRFWF9QQ0kodnApLAorCQkJCQkJCQkJCQkgbGUzMl90b19jcHUodnAtPnR4X3JpbmdbZW50cnldLmZyYWdbaV0uYWRkciksCisJCQkJCQkJCQkJCSBsZTMyX3RvX2NwdSh2cC0+dHhfcmluZ1tlbnRyeV0uZnJhZ1tpXS5sZW5ndGgpJjB4RkZGLAorCQkJCQkJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisjZWxzZQorCQkJCQlwY2lfdW5tYXBfc2luZ2xlKFZPUlRFWF9QQ0kodnApLAorCQkJCQkJbGUzMl90b19jcHUodnAtPnR4X3JpbmdbZW50cnldLmFkZHIpLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisjZW5kaWYKKwkJCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCQkJdnAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ayhLRVJOX0RFQlVHICJib29tZXJhbmdfaW50ZXJydXB0OiBubyBza2IhXG4iKTsKKwkJCQl9CisJCQkJLyogdnAtPnN0YXRzLnR4X3BhY2tldHMrKzsgIENvdW50ZWQgYmVsb3cuICovCisJCQkJZGlydHlfdHgrKzsKKwkJCX0KKwkJCXZwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCQkJaWYgKHZwLT5jdXJfdHggLSBkaXJ0eV90eCA8PSBUWF9SSU5HX1NJWkUgLSAxKSB7CisJCQkJaWYgKHZvcnRleF9kZWJ1ZyA+IDYpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICJib29tZXJhbmdfaW50ZXJydXB0OiB3YWtlIHF1ZXVlXG4iKTsKKwkJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgZm9yIGFsbCB1bmNvbW1vbiBpbnRlcnJ1cHRzIGF0IG9uY2UuICovCisJCWlmIChzdGF0dXMgJiAoSG9zdEVycm9yIHwgUnhFYXJseSB8IFN0YXRzRnVsbCB8IFR4Q29tcGxldGUgfCBJbnRSZXEpKQorCQkJdm9ydGV4X2Vycm9yKGRldiwgc3RhdHVzKTsKKworCQlpZiAoLS13b3JrX2RvbmUgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIG11Y2ggd29yayBpbiBpbnRlcnJ1cHQsIHN0YXR1cyAiCisJCQkJICAgIiU0LjR4LlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJLyogRGlzYWJsZSBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLworCQkJZG8geworCQkJCXZwLT5kZWZlcnJlZCB8PSBzdGF0dXM7CisJCQkJb3V0dyhTZXRTdGF0dXNFbmIgfCAofnZwLT5kZWZlcnJlZCAmIHZwLT5zdGF0dXNfZW5hYmxlKSwKKwkJCQkJIGlvYWRkciArIEVMM19DTUQpOworCQkJCW91dHcoQWNrSW50ciB8ICh2cC0+ZGVmZXJyZWQgJiAweDdmZiksIGlvYWRkciArIEVMM19DTUQpOworCQkJfSB3aGlsZSAoKHN0YXR1cyA9IGludyhpb2FkZHIgKyBFTDNfQ01EKSkgJiBJbnRMYXRjaCk7CisJCQkvKiBUaGUgdGltZXIgd2lsbCByZWVuYWJsZSBpbnRlcnJ1cHRzLiAqLworCQkJbW9kX3RpbWVyKCZ2cC0+dGltZXIsIGppZmZpZXMgKyAxKkhaKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIEFja25vd2xlZGdlIHRoZSBJUlEuICovCisJCW91dHcoQWNrSW50ciB8IEludFJlcSB8IEludExhdGNoLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJaWYgKHZwLT5jYl9mbl9iYXNlKQkJCS8qIFRoZSBQQ01DSUEgcGVvcGxlIGFyZSBpZGlvdHMuICAqLworCQkJd3JpdGVsKDB4ODAwMCwgdnAtPmNiX2ZuX2Jhc2UgKyA0KTsKKworCX0gd2hpbGUgKChzdGF0dXMgPSBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpICYgSW50TGF0Y2gpOworCisJaWYgKHZvcnRleF9kZWJ1ZyA+IDQpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIHN0YXR1cyAlNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CitoYW5kbGVyX2V4aXQ6CisJc3Bpbl91bmxvY2soJnZwLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgdm9ydGV4X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaTsKKwlzaG9ydCByeF9zdGF0dXM7CisKKwlpZiAodm9ydGV4X2RlYnVnID4gNSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgInZvcnRleF9yeCgpOiBzdGF0dXMgJTQuNHgsIHJ4X3N0YXR1cyAlNC40eC5cbiIsCisJCQkgICBpbncoaW9hZGRyK0VMM19TVEFUVVMpLCBpbncoaW9hZGRyK1J4U3RhdHVzKSk7CisJd2hpbGUgKChyeF9zdGF0dXMgPSBpbncoaW9hZGRyICsgUnhTdGF0dXMpKSA+IDApIHsKKwkJaWYgKHJ4X3N0YXR1cyAmIDB4NDAwMCkgeyAvKiBFcnJvciwgdXBkYXRlIHN0YXRzLiAqLworCQkJdW5zaWduZWQgY2hhciByeF9lcnJvciA9IGluYihpb2FkZHIgKyBSeEVycm9ycyk7CisJCQlpZiAodm9ydGV4X2RlYnVnID4gMikKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiIFJ4IGVycm9yOiBzdGF0dXMgJTIuMnguXG4iLCByeF9lcnJvcik7CisJCQl2cC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDAxKSAgdnAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDAyKSAgdnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MDQpICB2cC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDA4KSAgdnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MTApICB2cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogVGhlIHBhY2tldCBsZW5ndGg6IHVwIHRvIDQuNUshLiAqLworCQkJaW50IHBrdF9sZW4gPSByeF9zdGF0dXMgJiAweDFmZmY7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyA1KTsKKwkJCWlmICh2b3J0ZXhfZGVidWcgPiA0KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJSZWNlaXZpbmcgcGFja2V0IHNpemUgJWQgc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkJICAgcGt0X2xlbiwgcnhfc3RhdHVzKTsKKwkJCWlmIChza2IgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLworCQkJCS8qICdza2JfcHV0KCknIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEuICovCisJCQkJaWYgKHZwLT5idXNfbWFzdGVyICYmCisJCQkJCSEgKGludyhpb2FkZHIgKyBXbjdfTWFzdGVyU3RhdHVzKSAmIDB4ODAwMCkpIHsKKwkJCQkJZG1hX2FkZHJfdCBkbWEgPSBwY2lfbWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwgc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCQkJCQkJICAgcGt0X2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQkJb3V0bChkbWEsIGlvYWRkciArIFduN19NYXN0ZXJBZGRyKTsKKwkJCQkJb3V0dygoc2tiLT5sZW4gKyAzKSAmIH4zLCBpb2FkZHIgKyBXbjdfTWFzdGVyTGVuKTsKKwkJCQkJb3V0dyhTdGFydERNQVVwLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCQkJd2hpbGUgKGludyhpb2FkZHIgKyBXbjdfTWFzdGVyU3RhdHVzKSAmIDB4ODAwMCkKKwkJCQkJCTsKKwkJCQkJcGNpX3VubWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwgZG1hLCBwa3RfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCX0gZWxzZSB7CisJCQkJCWluc2woaW9hZGRyICsgUlhfRklGTywgc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCQkJIChwa3RfbGVuICsgMykgPj4gMik7CisJCQkJfQorCQkJCW91dHcoUnhEaXNjYXJkLCBpb2FkZHIgKyBFTDNfQ01EKTsgLyogUG9wIHRvcCBSeCBwYWNrZXQuICovCisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJdnAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQkvKiBXYWl0IGEgbGltaXRlZCB0aW1lIHRvIGdvIHRvIG5leHQgcGFja2V0LiAqLworCQkJCWZvciAoaSA9IDIwMDsgaSA+PSAwOyBpLS0pCisJCQkJCWlmICggISAoaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgQ21kSW5Qcm9ncmVzcykpCisJCQkJCQlicmVhazsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAodm9ydGV4X2RlYnVnID4gMCkKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBObyBtZW1vcnkgdG8gYWxsb2NhdGUgYSBza19idWZmIG9mICIKKwkJCQkJICAgInNpemUgJWQuXG4iLCBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQl9CisJCXZwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWlzc3VlX2FuZF93YWl0KGRldiwgUnhEaXNjYXJkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYm9vbWVyYW5nX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5ID0gdnAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCByeF9zdGF0dXM7CisJaW50IHJ4X3dvcmtfbGltaXQgPSB2cC0+ZGlydHlfcnggKyBSWF9SSU5HX1NJWkUgLSB2cC0+Y3VyX3J4OworCisJaWYgKHZvcnRleF9kZWJ1ZyA+IDUpCisJCXByaW50ayhLRVJOX0RFQlVHICJib29tZXJhbmdfcngoKTogc3RhdHVzICU0LjR4XG4iLCBpbncoaW9hZGRyK0VMM19TVEFUVVMpKTsKKworCXdoaWxlICgocnhfc3RhdHVzID0gbGUzMl90b19jcHUodnAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cykpICYgUnhEQ29tcGxldGUpeworCQlpZiAoLS1yeF93b3JrX2xpbWl0IDwgMCkKKwkJCWJyZWFrOworCQlpZiAocnhfc3RhdHVzICYgUnhERXJyb3IpIHsgLyogRXJyb3IsIHVwZGF0ZSBzdGF0cy4gKi8KKwkJCXVuc2lnbmVkIGNoYXIgcnhfZXJyb3IgPSByeF9zdGF0dXMgPj4gMTY7CisJCQlpZiAodm9ydGV4X2RlYnVnID4gMikKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiIFJ4IGVycm9yOiBzdGF0dXMgJTIuMnguXG4iLCByeF9lcnJvcik7CisJCQl2cC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDAxKSAgdnAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDAyKSAgdnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MDQpICB2cC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDA4KSAgdnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MTApICB2cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogVGhlIHBhY2tldCBsZW5ndGg6IHVwIHRvIDQuNUshLiAqLworCQkJaW50IHBrdF9sZW4gPSByeF9zdGF0dXMgJiAweDFmZmY7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJZG1hX2FkZHJfdCBkbWEgPSBsZTMyX3RvX2NwdSh2cC0+cnhfcmluZ1tlbnRyeV0uYWRkcik7CisKKwkJCWlmICh2b3J0ZXhfZGVidWcgPiA0KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJSZWNlaXZpbmcgcGFja2V0IHNpemUgJWQgc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkJICAgcGt0X2xlbiwgcnhfc3RhdHVzKTsKKworCQkJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBqdXN0IGFjY2VwdCB3aXRob3V0CisJCQkgICBjb3B5aW5nIHRvIGEgcHJvcGVybHkgc2l6ZWQgc2tidWZmLiAqLworCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsgJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSAwKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KFZPUlRFWF9QQ0kodnApLCBkbWEsIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJLyogJ3NrYl9wdXQoKScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KKwkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCQkgICB2cC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwKKwkJCQkJICAgcGt0X2xlbik7CisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKFZPUlRFWF9QQ0kodnApLCBkbWEsIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJdnAtPnJ4X2NvcHkrKzsKKwkJCX0gZWxzZSB7CisJCQkJLyogUGFzcyB1cCB0aGUgc2tidWZmIGFscmVhZHkgb24gdGhlIFJ4IHJpbmcuICovCisJCQkJc2tiID0gdnAtPnJ4X3NrYnVmZltlbnRyeV07CisJCQkJdnAtPnJ4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKFZPUlRFWF9QQ0kodnApLCBkbWEsIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJdnAtPnJ4X25vY29weSsrOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCXsJCQkJCS8qIFVzZSBoYXJkd2FyZSBjaGVja3N1bSBpbmZvLiAqLworCQkJCWludCBjc3VtX2JpdHMgPSByeF9zdGF0dXMgJiAweGVlMDAwMDAwOworCQkJCWlmIChjc3VtX2JpdHMgJiYKKwkJCQkJKGNzdW1fYml0cyA9PSAoSVBDaGtzdW1WYWxpZCB8IFRDUENoa3N1bVZhbGlkKSB8fAorCQkJCQkgY3N1bV9iaXRzID09IChJUENoa3N1bVZhbGlkIHwgVURQQ2hrc3VtVmFsaWQpKSkgeworCQkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQkJCQl2cC0+cnhfY3N1bWhpdHMrKzsKKwkJCQl9CisJCQl9CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXZwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCX0KKwkJZW50cnkgPSAoKyt2cC0+Y3VyX3J4KSAlIFJYX1JJTkdfU0laRTsKKwl9CisJLyogUmVmaWxsIHRoZSBSeCByaW5nIGJ1ZmZlcnMuICovCisJZm9yICg7IHZwLT5jdXJfcnggLSB2cC0+ZGlydHlfcnggPiAwOyB2cC0+ZGlydHlfcngrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQllbnRyeSA9IHZwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwkJaWYgKHZwLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X2ppZjsKKwkJCQlpZiAoKGppZmZpZXMgLSBsYXN0X2ppZikgPiAxMCAqIEhaKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtZW1vcnkgc2hvcnRhZ2VcbiIsIGRldi0+bmFtZSk7CisJCQkJCWxhc3RfamlmID0gamlmZmllczsKKwkJCQl9CisJCQkJaWYgKCh2cC0+Y3VyX3J4IC0gdnAtPmRpcnR5X3J4KSA9PSBSWF9SSU5HX1NJWkUpCisJCQkJCW1vZF90aW1lcigmdnAtPnJ4X29vbV90aW1lciwgUlVOX0FUKEhaICogMSkpOworCQkJCWJyZWFrOwkJCS8qIEJhZCBuZXdzISAgKi8KKwkJCX0KKwkJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLworCQkJdnAtPnJ4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwgc2tiLT50YWlsLCBQS1RfQlVGX1NaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJCXZwLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQl9CisJCXZwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMgPSAwOwkvKiBDbGVhciBjb21wbGV0ZSBiaXQuICovCisJCW91dHcoVXBVbnN0YWxsLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJZiB3ZSd2ZSBoaXQgYSB0b3RhbCBPT00gcmVmaWxsaW5nIHRoZSBSeCByaW5nIHdlIHBvbGwgb25jZSBhIHNlY29uZAorICogZm9yIHNvbWUgbWVtb3J5LiAgT3RoZXJ3aXNlIHRoZXJlIGlzIG5vIHdheSB0byByZXN0YXJ0IHRoZSByeCBwcm9jZXNzLgorICovCitzdGF0aWMgdm9pZAorcnhfb29tX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilhcmc7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZ2cC0+bG9jayk7CisJaWYgKCh2cC0+Y3VyX3J4IC0gdnAtPmRpcnR5X3J4KSA9PSBSWF9SSU5HX1NJWkUpCS8qIFRoaXMgdGVzdCBpcyByZWR1bmRhbnQsIGJ1dCBtYWtlcyBtZSBmZWVsIGdvb2QgKi8KKwkJYm9vbWVyYW5nX3J4KGRldik7CisJaWYgKHZvcnRleF9kZWJ1ZyA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByeF9vb21fdGltZXIgJXNcbiIsIGRldi0+bmFtZSwKKwkJCSgodnAtPmN1cl9yeCAtIHZwLT5kaXJ0eV9yeCkgIT0gUlhfUklOR19TSVpFKSA/ICJzdWNjZWVkZWQiIDogInJldHJ5aW5nIik7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmdnAtPmxvY2spOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZpbmFsX2Rvd24pCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKwlkZWxfdGltZXJfc3luYygmdnAtPnJ4X29vbV90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnZwLT50aW1lcik7CisKKwkvKiBUdXJuIG9mZiBzdGF0aXN0aWNzIEFTQVAuICBXZSB1cGRhdGUgdnAtPnN0YXRzIGJlbG93LiAqLworCW91dHcoU3RhdHNEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKworCS8qIERpc2FibGUgdGhlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlci4gKi8KKwlvdXR3KFJ4RGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJb3V0dyhUeERpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCisJLyogRGlzYWJsZSByZWNlaXZpbmcgODAyLjFxIHRhZ2dlZCBmcmFtZXMgKi8KKwlzZXRfODAyMXFfbW9kZShkZXYsIDApOworCisJaWYgKGRldi0+aWZfcG9ydCA9PSBYQ1ZSXzEwYmFzZTIpCisJCS8qIFR1cm4gb2ZmIHRoaW5uZXQgcG93ZXIuICBHcmVlbiEgKi8KKwkJb3V0dyhTdG9wQ29heCwgaW9hZGRyICsgRUwzX0NNRCk7CisKKwlvdXR3KFNldEludHJFbmIgfCAweDAwMDAsIGlvYWRkciArIEVMM19DTUQpOworCisJdXBkYXRlX3N0YXRzKGlvYWRkciwgZGV2KTsKKwlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl9yeCkKKwkJb3V0bCgwLCBpb2FkZHIgKyBVcExpc3RQdHIpOworCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KQorCQlvdXRsKDAsIGlvYWRkciArIERvd25MaXN0UHRyKTsKKworCWlmIChmaW5hbF9kb3duICYmIFZPUlRFWF9QQ0kodnApKSB7CisJCXBjaV9zYXZlX3N0YXRlKFZPUlRFWF9QQ0kodnApKTsKKwkJYWNwaV9zZXRfV09MKGRldik7CisJfQorfQorCitzdGF0aWMgaW50Cit2b3J0ZXhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCXZvcnRleF9kb3duKGRldiwgMSk7CisKKwlpZiAodm9ydGV4X2RlYnVnID4gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyIlczogdm9ydGV4X2Nsb3NlKCkgc3RhdHVzICU0LjR4LCBUeCBzdGF0dXMgJTIuMnguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyksIGluYihpb2FkZHIgKyBUeFN0YXR1cykpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHZvcnRleCBjbG9zZSBzdGF0czogcnhfbm9jb3B5ICVkIHJ4X2NvcHkgJWQiCisJCQkgICAiIHR4X3F1ZXVlZCAlZCBSeCBwcmUtY2hlY2tzdW1tZWQgJWQuXG4iLAorCQkJICAgZGV2LT5uYW1lLCB2cC0+cnhfbm9jb3B5LCB2cC0+cnhfY29weSwgdnAtPnF1ZXVlZF9wYWNrZXQsIHZwLT5yeF9jc3VtaGl0cyk7CisJfQorCisjaWYgRE9fWkVST0NPUFkKKwlpZiAoCXZwLT5yeF9jc3VtaGl0cyAmJgorCQkJKCh2cC0+ZHJ2X2ZsYWdzICYgSEFTX0hXQ0tTTSkgPT0gMCkgJiYKKwkJCShod19jaGVja3N1bXNbdnAtPmNhcmRfaWR4XSA9PSAtMSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgc3VwcG9ydHMgaGFyZHdhcmUgY2hlY2tzdW1zLCBhbmQgd2UncmUgbm90IHVzaW5nIHRoZW0hXG4iLCBkZXYtPm5hbWUpOworCX0KKyNlbmRpZgorCQkKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3J4KSB7IC8qIEZyZWUgQm9vbWVyYW5nIGJ1cyBtYXN0ZXIgUnggYnVmZmVycy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQkJaWYgKHZwLT5yeF9za2J1ZmZbaV0pIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKAlWT1JURVhfUENJKHZwKSwgbGUzMl90b19jcHUodnAtPnJ4X3JpbmdbaV0uYWRkciksCisJCQkJCQkJCQlQS1RfQlVGX1NaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2IodnAtPnJ4X3NrYnVmZltpXSk7CisJCQkJdnAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJCQl9CisJfQorCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KSB7IC8qIEZyZWUgQm9vbWVyYW5nIGJ1cyBtYXN0ZXIgVHggYnVmZmVycy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlpZiAodnAtPnR4X3NrYnVmZltpXSkgeworCQkJCXN0cnVjdCBza19idWZmICpza2IgPSB2cC0+dHhfc2tidWZmW2ldOworI2lmIERPX1pFUk9DT1BZCisJCQkJaW50IGs7CisKKwkJCQlmb3IgKGs9MDsgazw9c2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaysrKQorCQkJCQkJcGNpX3VubWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwKKwkJCQkJCQkJCQkgbGUzMl90b19jcHUodnAtPnR4X3JpbmdbaV0uZnJhZ1trXS5hZGRyKSwKKwkJCQkJCQkJCQkgbGUzMl90b19jcHUodnAtPnR4X3JpbmdbaV0uZnJhZ1trXS5sZW5ndGgpJjB4RkZGLAorCQkJCQkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKyNlbHNlCisJCQkJcGNpX3VubWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwgbGUzMl90b19jcHUodnAtPnR4X3JpbmdbaV0uYWRkciksIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKyNlbmRpZgorCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCQl2cC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZHVtcF90eF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKHZvcnRleF9kZWJ1ZyA+IDApIHsKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkJCisJCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KSB7CisJCQlpbnQgaTsKKwkJCWludCBzdGFsbGVkID0gaW5sKGlvYWRkciArIFBrdFN0YXR1cykgJiAweDA0OwkvKiBQb3NzaWJsZSByYWN5LiBCdXQgaXQncyBvbmx5IGRlYnVnIHN0dWZmICovCisKKwkJCXByaW50ayhLRVJOX0VSUiAiICBGbGFnczsgYnVzLW1hc3RlciAlZCwgZGlydHkgJWQoJWQpIGN1cnJlbnQgJWQoJWQpXG4iLAorCQkJCQl2cC0+ZnVsbF9idXNfbWFzdGVyX3R4LAorCQkJCQl2cC0+ZGlydHlfdHgsIHZwLT5kaXJ0eV90eCAlIFRYX1JJTkdfU0laRSwKKwkJCQkJdnAtPmN1cl90eCwgdnAtPmN1cl90eCAlIFRYX1JJTkdfU0laRSk7CisJCQlwcmludGsoS0VSTl9FUlIgIiAgVHJhbnNtaXQgbGlzdCAlOC44eCB2cy4gJXAuXG4iLAorCQkJCSAgIGlubChpb2FkZHIgKyBEb3duTGlzdFB0ciksCisJCQkJICAgJnZwLT50eF9yaW5nW3ZwLT5kaXJ0eV90eCAlIFRYX1JJTkdfU0laRV0pOworCQkJaXNzdWVfYW5kX3dhaXQoZGV2LCBEb3duU3RhbGwpOworCQkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIgICVkOiBAJXAgIGxlbmd0aCAlOC44eCBzdGF0dXMgJTguOHhcbiIsIGksCisJCQkJCSAgICZ2cC0+dHhfcmluZ1tpXSwKKyNpZiBET19aRVJPQ09QWQorCQkJCQkgICBsZTMyX3RvX2NwdSh2cC0+dHhfcmluZ1tpXS5mcmFnWzBdLmxlbmd0aCksCisjZWxzZQorCQkJCQkgICBsZTMyX3RvX2NwdSh2cC0+dHhfcmluZ1tpXS5sZW5ndGgpLAorI2VuZGlmCisJCQkJCSAgIGxlMzJfdG9fY3B1KHZwLT50eF9yaW5nW2ldLnN0YXR1cykpOworCQkJfQorCQkJaWYgKCFzdGFsbGVkKQorCQkJCW91dHcoRG93blVuc3RhbGwsIGlvYWRkciArIEVMM19DTUQpOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnZvcnRleF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIHsJLyogQUtQTTogVXNlZCB0byBiZSBuZXRpZl9ydW5uaW5nICovCisJCXNwaW5fbG9ja19pcnFzYXZlICgmdnAtPmxvY2ssIGZsYWdzKTsKKwkJdXBkYXRlX3N0YXRzKGRldi0+YmFzZV9hZGRyLCBkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmdnAtPmxvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuICZ2cC0+c3RhdHM7Cit9CisKKy8qICBVcGRhdGUgc3RhdGlzdGljcy4KKwlVbmxpa2Ugd2l0aCB0aGUgRUwzIHdlIG5lZWQgbm90IHdvcnJ5IGFib3V0IGludGVycnVwdHMgY2hhbmdpbmcKKwl0aGUgd2luZG93IHNldHRpbmcgZnJvbSB1bmRlcm5lYXRoIHVzLCBidXQgd2UgbXVzdCBzdGlsbCBndWFyZAorCWFnYWluc3QgYSByYWNlIGNvbmRpdGlvbiB3aXRoIGEgU3RhdHNVcGRhdGUgaW50ZXJydXB0IHVwZGF0aW5nIHRoZQorCXRhYmxlLiAgVGhpcyBpcyBkb25lIGJ5IGNoZWNraW5nIHRoYXQgdGhlIEFTTSAoISkgY29kZSBnZW5lcmF0ZWQgdXNlcworCWF0b21pYyB1cGRhdGVzIHdpdGggJys9Jy4KKwkqLworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKGxvbmcgaW9hZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBvbGRfd2luZG93ID0gaW53KGlvYWRkciArIEVMM19DTUQpOworCisJaWYgKG9sZF93aW5kb3cgPT0gMHhmZmZmKQkvKiBDaGlwIHN1c3BlbmRlZCBvciBlamVjdGVkLiAqLworCQlyZXR1cm47CisJLyogVW5saWtlIHRoZSAzYzV4OSB3ZSBuZWVkIG5vdCB0dXJuIG9mZiBzdGF0cyB1cGRhdGVzIHdoaWxlIHJlYWRpbmcuICovCisJLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCByZWFkIGV2ZXJ5dGhpbmcuICovCisJRUwzV0lORE9XKDYpOworCXZwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycwkJKz0gaW5iKGlvYWRkciArIDApOworCXZwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzCQkrPSBpbmIoaW9hZGRyICsgMSk7CisJdnAtPnN0YXRzLmNvbGxpc2lvbnMJCQkrPSBpbmIoaW9hZGRyICsgMyk7CisJdnAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMJCSs9IGluYihpb2FkZHIgKyA0KTsKKwl2cC0+c3RhdHMucnhfZmlmb19lcnJvcnMJCSs9IGluYihpb2FkZHIgKyA1KTsKKwl2cC0+c3RhdHMudHhfcGFja2V0cwkJCSs9IGluYihpb2FkZHIgKyA2KTsKKwl2cC0+c3RhdHMudHhfcGFja2V0cwkJCSs9IChpbmIoaW9hZGRyICsgOSkmMHgzMCkgPDwgNDsKKwkvKiBSeCBwYWNrZXRzCSovCQkJaW5iKGlvYWRkciArIDcpOyAgIC8qIE11c3QgcmVhZCB0byBjbGVhciAqLworCS8qIERvbid0IGJvdGhlciB3aXRoIHJlZ2lzdGVyIDksIGFuIGV4dGVuc2lvbiBvZiByZWdpc3RlcnMgNiY3LgorCSAgIElmIHdlIGRvIHVzZSB0aGUgNiY3IHZhbHVlcyB0aGUgYXRvbWljIHVwZGF0ZSBhc3N1bXB0aW9uIGFib3ZlCisJICAgaXMgaW52YWxpZC4gKi8KKwl2cC0+c3RhdHMucnhfYnl0ZXMgCQkJKz0gaW53KGlvYWRkciArIDEwKTsKKwl2cC0+c3RhdHMudHhfYnl0ZXMgCQkJKz0gaW53KGlvYWRkciArIDEyKTsKKwkvKiBFeHRyYSBzdGF0cyBmb3IgZ2V0X2V0aHRvb2xfc3RhdHMoKSAqLworCXZwLT54c3RhdHMudHhfbXVsdGlwbGVfY29sbGlzaW9ucwkrPSBpbmIoaW9hZGRyICsgMik7CisJdnAtPnhzdGF0cy50eF9kZWZlcnJlZAkJCSs9IGluYihpb2FkZHIgKyA4KTsKKwlFTDNXSU5ET1coNCk7CisJdnAtPnhzdGF0cy5yeF9iYWRfc3NkCQkJKz0gaW5iKGlvYWRkciArIDEyKTsKKworCXsKKwkJdTggdXAgPSBpbmIoaW9hZGRyICsgMTMpOworCQl2cC0+c3RhdHMucnhfYnl0ZXMgKz0gKHVwICYgMHgwZikgPDwgMTY7CisJCXZwLT5zdGF0cy50eF9ieXRlcyArPSAodXAgJiAweGYwKSA8PCAxMjsKKwl9CisKKwlFTDNXSU5ET1cob2xkX3dpbmRvdyA+PiAxMyk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHZvcnRleF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCUVMM1dJTkRPVyg0KTsKKwlyYyA9IG1paV9ud2F5X3Jlc3RhcnQoJnZwLT5taWkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdTMyIHZvcnRleF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlFTDNXSU5ET1coNCk7CisJcmMgPSBtaWlfbGlua19vaygmdnAtPm1paSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdm9ydGV4X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZwLT5sb2NrLCBmbGFncyk7CisJRUwzV0lORE9XKDQpOworCXJjID0gbWlpX2V0aHRvb2xfZ3NldCgmdnAtPm1paSwgY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB2b3J0ZXhfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlFTDNXSU5ET1coNCk7CisJcmMgPSBtaWlfZXRodG9vbF9zc2V0KCZ2cC0+bWlpLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdTMyIHZvcnRleF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gdm9ydGV4X2RlYnVnOworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYmcpCit7CisJdm9ydGV4X2RlYnVnID0gZGJnOworfQorCitzdGF0aWMgaW50IHZvcnRleF9nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gVk9SVEVYX05VTV9TVEFUUzsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgKmRhdGEpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCXVwZGF0ZV9zdGF0cyhkZXYtPmJhc2VfYWRkciwgZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cC0+bG9jaywgZmxhZ3MpOworCisJZGF0YVswXSA9IHZwLT54c3RhdHMudHhfZGVmZXJyZWQ7CisJZGF0YVsxXSA9IHZwLT54c3RhdHMudHhfbXVsdGlwbGVfY29sbGlzaW9uczsKKwlkYXRhWzJdID0gdnAtPnhzdGF0cy5yeF9iYWRfc3NkOworfQorCisKK3N0YXRpYyB2b2lkIHZvcnRleF9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqZGF0YSkKK3sKKwlzd2l0Y2ggKHN0cmluZ3NldCkgeworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQltZW1jcHkoZGF0YSwgJmV0aHRvb2xfc3RhdHNfa2V5cywgc2l6ZW9mKGV0aHRvb2xfc3RhdHNfa2V5cykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJaWYgKFZPUlRFWF9QQ0kodnApKSB7CisJCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoVk9SVEVYX1BDSSh2cCkpKTsKKwl9IGVsc2UgeworCQlpZiAoVk9SVEVYX0VJU0EodnApKQorCQkJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgdnAtPmdlbmRldi0+YnVzX2lkKTsKKwkJZWxzZQorCQkJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIkVJU0EgMHglbHggJWQiLAorCQkJCQlkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB2b3J0ZXhfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IHZvcnRleF9nZXRfZHJ2aW5mbywKKwkuZ2V0X3N0cmluZ3MgICAgICAgICAgICA9IHZvcnRleF9nZXRfc3RyaW5ncywKKwkuZ2V0X21zZ2xldmVsICAgICAgICAgICA9IHZvcnRleF9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbCAgICAgICAgICAgPSB2b3J0ZXhfc2V0X21zZ2xldmVsLAorCS5nZXRfZXRodG9vbF9zdGF0cyAgICAgID0gdm9ydGV4X2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfc3RhdHNfY291bnQgICAgICAgID0gdm9ydGV4X2dldF9zdGF0c19jb3VudCwKKwkuZ2V0X3NldHRpbmdzICAgICAgICAgICA9IHZvcnRleF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyAgICAgICAgICAgPSB2b3J0ZXhfc2V0X3NldHRpbmdzLAorCS5nZXRfbGluayAgICAgICAgICAgICAgID0gdm9ydGV4X2dldF9saW5rLAorCS5ud2F5X3Jlc2V0ICAgICAgICAgICAgID0gdm9ydGV4X253YXlfcmVzZXQsCit9OworCisjaWZkZWYgQ09ORklHX1BDSQorLyoKKyAqCU11c3QgcG93ZXIgdGhlIGRldmljZSB1cCB0byBkbyBNRElPIG9wZXJhdGlvbnMKKyAqLworc3RhdGljIGludCB2b3J0ZXhfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhdGUgPSAwOworCisJaWYoVk9SVEVYX1BDSSh2cCkpCisJCXN0YXRlID0gVk9SVEVYX1BDSSh2cCktPmN1cnJlbnRfc3RhdGU7CisKKwkvKiBUaGUga2VybmVsIGNvcmUgcmVhbGx5IHNob3VsZCBoYXZlIHBjaV9nZXRfcG93ZXJfc3RhdGUoKSAqLworCisJaWYoc3RhdGUgIT0gMCkKKwkJcGNpX3NldF9wb3dlcl9zdGF0ZShWT1JURVhfUENJKHZwKSwgUENJX0QwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlFTDNXSU5ET1coNCk7CisJZXJyID0gZ2VuZXJpY19taWlfaW9jdGwoJnZwLT5taWksIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlpZihzdGF0ZSAhPSAwKQorCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKFZPUlRFWF9QQ0kodnApLCBzdGF0ZSk7CisKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKKworLyogUHJlLUN5Y2xvbmUgY2hpcHMgaGF2ZSBubyBkb2N1bWVudGVkIG11bHRpY2FzdCBmaWx0ZXIsIHNvIHRoZSBvbmx5CisgICBtdWx0aWNhc3Qgc2V0dGluZyBpcyB0byByZWNlaXZlIGFsbCBtdWx0aWNhc3QgZnJhbWVzLiAgQXQgbGVhc3QKKyAgIHRoZSBjaGlwIGhhcyBhIHZlcnkgY2xlYW4gd2F5IHRvIHNldCB0aGUgbW9kZSwgdW5saWtlIG1hbnkgb3RoZXJzLiAqLworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBuZXdfbW9kZTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJaWYgKHZvcnRleF9kZWJ1ZyA+IDApCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBTZXR0aW5nIHByb21pc2N1b3VzIG1vZGUuXG4iLCBkZXYtPm5hbWUpOworCQluZXdfbW9kZSA9IFNldFJ4RmlsdGVyfFJ4U3RhdGlvbnxSeE11bHRpY2FzdHxSeEJyb2FkY2FzdHxSeFByb207CisJfSBlbHNlCWlmICgoZGV2LT5tY19saXN0KSAgfHwgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQluZXdfbW9kZSA9IFNldFJ4RmlsdGVyfFJ4U3RhdGlvbnxSeE11bHRpY2FzdHxSeEJyb2FkY2FzdDsKKwl9IGVsc2UKKwkJbmV3X21vZGUgPSBTZXRSeEZpbHRlciB8IFJ4U3RhdGlvbiB8IFJ4QnJvYWRjYXN0OworCisJb3V0dyhuZXdfbW9kZSwgaW9hZGRyICsgRUwzX0NNRCk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKy8qIFNldHVwIHRoZSBjYXJkIHNvIHRoYXQgaXQgY2FuIHJlY2VpdmUgZnJhbWVzIHdpdGggYW4gODAyLjFxIFZMQU4gdGFnLgorICAgTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBkb25lIGFmdGVyIGVhY2ggUnhSZXNldCBkdWUgdG8gc29tZSBiYWNrd2FyZHMKKyAgIGNvbXBhdGliaWxpdHkgbG9naWMgaW4gdGhlIEN5Y2xvbmUgYW5kIFRvcm5hZG8gQVNJQ3MgKi8KKworLyogVGhlIEV0aGVybmV0IFR5cGUgdXNlZCBmb3IgODAyLjFxIHRhZ2dlZCBmcmFtZXMgKi8KKyNkZWZpbmUgVkxBTl9FVEhFUl9UWVBFIDB4ODEwMAorCitzdGF0aWMgdm9pZCBzZXRfODAyMXFfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IG9sZF93aW5kb3cgPSBpbncoaW9hZGRyICsgRUwzX0NNRCk7CisJaW50IG1hY19jdHJsOworCisJaWYgKCh2cC0+ZHJ2X2ZsYWdzJklTX0NZQ0xPTkUpIHx8ICh2cC0+ZHJ2X2ZsYWdzJklTX1RPUk5BRE8pKSB7CisJCS8qIGN5Y2xvbmUgYW5kIHRvcm5hZG8gY2hpcHNldHMgY2FuIHJlY29nbml6ZSA4MDIuMXEKKwkJICogdGFnZ2VkIGZyYW1lcyBhbmQgdHJlYXQgdGhlbSBjb3JyZWN0bHkgKi8KKworCQlpbnQgbWF4X3BrdF9zaXplID0gZGV2LT5tdHUrMTQ7CS8qIE1UVStFdGhlcm5ldCBoZWFkZXIgKi8KKwkJaWYgKGVuYWJsZSkKKwkJCW1heF9wa3Rfc2l6ZSArPSA0OwkvKiA4MDIuMVEgVkxBTiB0YWcgKi8KKworCQlFTDNXSU5ET1coMyk7CisJCW91dHcobWF4X3BrdF9zaXplLCBpb2FkZHIrV24zX01heFBrdFNpemUpOworCisJCS8qIHNldCBWbGFuRXRoZXJUeXBlIHRvIGxldCB0aGUgaGFyZHdhcmUgY2hlY2tzdW1taW5nCisJCSAgIHRyZWF0IHRhZ2dlZCBmcmFtZXMgY29ycmVjdGx5ICovCisJCUVMM1dJTkRPVyg3KTsKKwkJb3V0dyhWTEFOX0VUSEVSX1RZUEUsIGlvYWRkcitXbjdfVmxhbkV0aGVyVHlwZSk7CisJfSBlbHNlIHsKKwkJLyogb24gb2xkZXIgY2FyZHMgd2UgaGF2ZSB0byBlbmFibGUgbGFyZ2UgZnJhbWVzICovCisKKwkJdnAtPmxhcmdlX2ZyYW1lcyA9IGRldi0+bXR1ID4gMTUwMCB8fCBlbmFibGU7CisKKwkJRUwzV0lORE9XKDMpOworCQltYWNfY3RybCA9IGludyhpb2FkZHIrV24zX01BQ19DdHJsKTsKKwkJaWYgKHZwLT5sYXJnZV9mcmFtZXMpCisJCQltYWNfY3RybCB8PSAweDQwOworCQllbHNlCisJCQltYWNfY3RybCAmPSB+MHg0MDsKKwkJb3V0dyhtYWNfY3RybCwgaW9hZGRyK1duM19NQUNfQ3RybCk7CisJfQorCisJRUwzV0lORE9XKG9sZF93aW5kb3cpOworfQorI2Vsc2UKKworc3RhdGljIHZvaWQgc2V0XzgwMjFxX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGVuYWJsZSkKK3sKK30KKworCisjZW5kaWYKKworLyogTUlJIHRyYW5zY2VpdmVyIGNvbnRyb2wgc2VjdGlvbi4KKyAgIFJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKyAgIE1ESU8gcHJvdG9jb2wuICBTZWUgdGhlIE1JSSBzcGVjaWZpY2F0aW9ucyBvciBEUDgzODQwQSBkYXRhIHNoZWV0CisgICBmb3IgZGV0YWlscy4gKi8KKworLyogVGhlIG1heGltdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICBUaGUgbWluaW11bSB0aW1pbmcgaXMgdXN1YWxseQorICAgbWV0IGJ5IGJhY2stdG8tYmFjayBQQ0kgSS9PIGN5Y2xlcywgYnV0IHdlIGluc2VydCBhIGRlbGF5IHRvIGF2b2lkCisgICAib3ZlcmNsb2NraW5nIiBpc3N1ZXMuICovCisjZGVmaW5lIG1kaW9fZGVsYXkoKSBpbmwobWRpb19hZGRyKQorCisjZGVmaW5lIE1ESU9fU0hJRlRfQ0xLCTB4MDEKKyNkZWZpbmUgTURJT19ESVJfV1JJVEUJMHgwNAorI2RlZmluZSBNRElPX0RBVEFfV1JJVEUwICgweDAwIHwgTURJT19ESVJfV1JJVEUpCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTEgKDB4MDIgfCBNRElPX0RJUl9XUklURSkKKyNkZWZpbmUgTURJT19EQVRBX1JFQUQJMHgwMgorI2RlZmluZSBNRElPX0VOQl9JTgkJMHgwMAorCisvKiBHZW5lcmF0ZSB0aGUgcHJlYW1ibGUgcmVxdWlyZWQgZm9yIGluaXRpYWwgc3luY2hyb25pemF0aW9uIGFuZAorICAgYSBmZXcgb2xkZXIgdHJhbnNjZWl2ZXJzLiAqLworc3RhdGljIHZvaWQgbWRpb19zeW5jKGxvbmcgaW9hZGRyLCBpbnQgYml0cykKK3sKKwlsb25nIG1kaW9fYWRkciA9IGlvYWRkciArIFduNF9QaHlzaWNhbE1nbXQ7CisKKwkvKiBFc3RhYmxpc2ggc3luYyBieSBzZW5kaW5nIGF0IGxlYXN0IDMyIGxvZ2ljIG9uZXMuICovCisJd2hpbGUgKC0tIGJpdHMgPj0gMCkgeworCQlvdXR3KE1ESU9fREFUQV9XUklURTEsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJb3V0dyhNRElPX0RBVEFfV1JJVEUxIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwlpbnQgaTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCByZWFkX2NtZCA9ICgweGY2IDw8IDEwKSB8IChwaHlfaWQgPDwgNSkgfCBsb2NhdGlvbjsKKwl1bnNpZ25lZCBpbnQgcmV0dmFsID0gMDsKKwlsb25nIG1kaW9fYWRkciA9IGlvYWRkciArIFduNF9QaHlzaWNhbE1nbXQ7CisKKwlpZiAobWlpX3ByZWFtYmxlX3JlcXVpcmVkKQorCQltZGlvX3N5bmMoaW9hZGRyLCAzMik7CisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDE0OyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChyZWFkX2NtZCYoMTw8aSkpID8gTURJT19EQVRBX1dSSVRFMSA6IE1ESU9fREFUQV9XUklURTA7CisJCW91dHcoZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXR3KGRhdGF2YWwgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwkvKiBSZWFkIHRoZSB0d28gdHJhbnNpdGlvbiwgMTYgZGF0YSwgYW5kIHdpcmUtaWRsZSBiaXRzLiAqLworCWZvciAoaSA9IDE5OyBpID4gMDsgaS0tKSB7CisJCW91dHcoTURJT19FTkJfSU4sIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW53KG1kaW9fYWRkcikgJiBNRElPX0RBVEFfUkVBRCkgPyAxIDogMCk7CisJCW91dHcoTURJT19FTkJfSU4gfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwlyZXR1cm4gcmV0dmFsICYgMHgyMDAwMCA/IDB4ZmZmZiA6IHJldHZhbD4+MSAmIDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCB3cml0ZV9jbWQgPSAweDUwMDIwMDAwIHwgKHBoeV9pZCA8PCAyMykgfCAobG9jYXRpb24gPDwgMTgpIHwgdmFsdWU7CisJbG9uZyBtZGlvX2FkZHIgPSBpb2FkZHIgKyBXbjRfUGh5c2ljYWxNZ210OworCWludCBpOworCisJaWYgKG1paV9wcmVhbWJsZV9yZXF1aXJlZCkKKwkJbWRpb19zeW5jKGlvYWRkciwgMzIpOworCisJLyogU2hpZnQgdGhlIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKHdyaXRlX2NtZCYoMTw8aSkpID8gTURJT19EQVRBX1dSSVRFMSA6IE1ESU9fREFUQV9XUklURTA7CisJCW91dHcoZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXR3KGRhdGF2YWwgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwkvKiBMZWF2ZSB0aGUgaW50ZXJmYWNlIGlkbGUuICovCisJZm9yIChpID0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJb3V0dyhNRElPX0VOQl9JTiwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXR3KE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJcmV0dXJuOworfQorDAorLyogQUNQSTogQWR2YW5jZWQgQ29uZmlndXJhdGlvbiBhbmQgUG93ZXIgSW50ZXJmYWNlLiAqLworLyogU2V0IFdha2UtT24tTEFOIG1vZGUgYW5kIHB1dCB0aGUgYm9hcmQgaW50byBEMyAocG93ZXItZG93bikgc3RhdGUuICovCitzdGF0aWMgdm9pZCBhY3BpX3NldF9XT0woc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKHZwLT5lbmFibGVfd29sKSB7CisJCS8qIFBvd2VyIHVwIG9uOiAxPT1Eb3dubG9hZGVkIEZpbHRlciwgMj09TWFnaWMgUGFja2V0cywgND09TGluayBTdGF0dXMuICovCisJCUVMM1dJTkRPVyg3KTsKKwkJb3V0dygyLCBpb2FkZHIgKyAweDBjKTsKKwkJLyogVGhlIFJ4RmlsdGVyIG11c3QgYWNjZXB0IHRoZSBXT0wgZnJhbWVzLiAqLworCQlvdXR3KFNldFJ4RmlsdGVyfFJ4U3RhdGlvbnxSeE11bHRpY2FzdHxSeEJyb2FkY2FzdCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCW91dHcoUnhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCisJCXBjaV9lbmFibGVfd2FrZShWT1JURVhfUENJKHZwKSwgMCwgMSk7CisJfQorCS8qIENoYW5nZSB0aGUgcG93ZXIgc3RhdGUgdG8gRDM7IFJ4RW5hYmxlIGRvZXNuJ3QgdGFrZSBlZmZlY3QuICovCisJcGNpX3NldF9wb3dlcl9zdGF0ZShWT1JURVhfUENJKHZwKSwgUENJX0QzaG90KTsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdm9ydGV4X3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cDsKKworCWlmICghZGV2KSB7CisJCXByaW50aygidm9ydGV4X3JlbW92ZV9vbmUgY2FsbGVkIGZvciBDb21wYXEgZGV2aWNlIVxuIik7CisJCUJVRygpOworCX0KKworCXZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIEFLUE06IEZJWE1FOiB3ZSBzaG91bGQgaGF2ZQorCSAqCWlmICh2cC0+Y2JfZm5fYmFzZSkgaW91bm1hcCh2cC0+Y2JfZm5fYmFzZSk7CisJICogaGVyZQorCSAqLworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwlpZiAoVk9SVEVYX1BDSSh2cCkpIHsKKwkJcGNpX3NldF9wb3dlcl9zdGF0ZShWT1JURVhfUENJKHZwKSwgUENJX0QwKTsJLyogR28gYWN0aXZlICovCisJCWlmICh2cC0+cG1fc3RhdGVfdmFsaWQpCisJCQlwY2lfcmVzdG9yZV9zdGF0ZShWT1JURVhfUENJKHZwKSk7CisJCXBjaV9kaXNhYmxlX2RldmljZShWT1JURVhfUENJKHZwKSk7CisJfQorCS8qIFNob3VsZCByZWFsbHkgdXNlIGlzc3VlX2FuZF93YWl0KCkgaGVyZSAqLworCW91dHcoVG90YWxSZXNldCB8ICgodnAtPmRydl9mbGFncyAmIEVFUFJPTV9SRVNFVCkgPyAweDA0IDogMHgxNCksCisJICAgICBkZXYtPmJhc2VfYWRkciArIEVMM19DTUQpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBib29tX3J4X2Rlc2MpICogUlhfUklOR19TSVpFCisJCQkJCQkJKyBzaXplb2Yoc3RydWN0IGJvb21fdHhfZGVzYykgKiBUWF9SSU5HX1NJWkUsCisJCQkJCQl2cC0+cnhfcmluZywKKwkJCQkJCXZwLT5yeF9yaW5nX2RtYSk7CisJaWYgKHZwLT5tdXN0X2ZyZWVfcmVnaW9uKQorCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgdnAtPmlvX3NpemUpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZvcnRleF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIjNjNTl4IiwKKwkucHJvYmUJCT0gdm9ydGV4X2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aodm9ydGV4X3JlbW92ZV9vbmUpLAorCS5pZF90YWJsZQk9IHZvcnRleF9wY2lfdGJsLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gdm9ydGV4X3N1c3BlbmQsCisJLnJlc3VtZQkJPSB2b3J0ZXhfcmVzdW1lLAorI2VuZGlmCit9OworCisKK3N0YXRpYyBpbnQgdm9ydGV4X2hhdmVfcGNpOworc3RhdGljIGludCB2b3J0ZXhfaGF2ZV9laXNhOworCisKK3N0YXRpYyBpbnQgX19pbml0IHZvcnRleF9pbml0ICh2b2lkKQoreworCWludCBwY2lfcmMsIGVpc2FfcmM7CisKKwlwY2lfcmMgPSBwY2lfbW9kdWxlX2luaXQoJnZvcnRleF9kcml2ZXIpOworCWVpc2FfcmMgPSB2b3J0ZXhfZWlzYV9pbml0KCk7CisKKwlpZiAocGNpX3JjID09IDApCisJCXZvcnRleF9oYXZlX3BjaSA9IDE7CisJaWYgKGVpc2FfcmMgPiAwKQorCQl2b3J0ZXhfaGF2ZV9laXNhID0gMTsKKworCXJldHVybiAodm9ydGV4X2hhdmVfcGNpICsgdm9ydGV4X2hhdmVfZWlzYSkgPyAwIDogLUVOT0RFVjsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgdm9ydGV4X2Vpc2FfY2xlYW51cCAodm9pZCkKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwOworCWxvbmcgaW9hZGRyOworCisjaWZkZWYgQ09ORklHX0VJU0EKKwkvKiBUYWtlIGNhcmUgb2YgdGhlIEVJU0EgZGV2aWNlcyAqLworCWVpc2FfZHJpdmVyX3VucmVnaXN0ZXIgKCZ2b3J0ZXhfZWlzYV9kcml2ZXIpOworI2VuZGlmCisJCisJaWYgKGNvbXBhcV9uZXRfZGV2aWNlKSB7CisJCXZwID0gY29tcGFxX25ldF9kZXZpY2UtPnByaXY7CisJCWlvYWRkciA9IGNvbXBhcV9uZXRfZGV2aWNlLT5iYXNlX2FkZHI7CisKKwkJdW5yZWdpc3Rlcl9uZXRkZXYgKGNvbXBhcV9uZXRfZGV2aWNlKTsKKwkJb3V0dyAoVG90YWxSZXNldCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCXJlbGVhc2VfcmVnaW9uIChpb2FkZHIsIFZPUlRFWF9UT1RBTF9TSVpFKTsKKworCQlmcmVlX25ldGRldiAoY29tcGFxX25ldF9kZXZpY2UpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgdm9ydGV4X2NsZWFudXAgKHZvaWQpCit7CisJaWYgKHZvcnRleF9oYXZlX3BjaSkKKwkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmdm9ydGV4X2RyaXZlcik7CisJaWYgKHZvcnRleF9oYXZlX2Vpc2EpCisJCXZvcnRleF9laXNhX2NsZWFudXAgKCk7Cit9CisKKworbW9kdWxlX2luaXQodm9ydGV4X2luaXQpOworbW9kdWxlX2V4aXQodm9ydGV4X2NsZWFudXApOworCisMCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtaW5kZW50LWxldmVsOiA0CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDQKKyAqICB0YWItd2lkdGg6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvNzk5MC5jIGIvZHJpdmVycy9uZXQvNzk5MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YjAyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC83OTkwLmMKQEAgLTAsMCArMSw2ODEgQEAKKy8qIAorICogNzk5MC5jIC0tIExBTkNFIGV0aGVybmV0IElDIGdlbmVyaWMgcm91dGluZXMuIAorICogVGhpcyBpcyBhbiBhdHRlbXB0IHRvIHNlcGFyYXRlIG91dCB0aGUgYml0cyBvZiB2YXJpb3VzIGV0aGVybmV0CisgKiBkcml2ZXJzIHRoYXQgYXJlIGNvbW1vbiBiZWNhdXNlIHRoZXkgYWxsIHVzZSB0aGUgQU1EIDc5OTAgTEFOQ0UgCisgKiAoTG9jYWwgQXJlYSBOZXR3b3JrIENvbnRyb2xsZXIgZm9yIEV0aGVybmV0KSBjaGlwLgorICoKKyAqIENvcHlyaWdodCAoQykgMDUvMTk5OCBQZXRlciBNYXlkZWxsIDxwbWF5ZGVsbEBjaGlhcmsuZ3JlZW5lbmQub3JnLnVrPgorICoKKyAqIE1vc3Qgb2YgdGhpcyBzdHVmZiB3YXMgb2J0YWluZWQgYnkgbG9va2luZyBhdCBvdGhlciBMQU5DRSBkcml2ZXJzLAorICogaW4gcGFydGljdWxhciBhMjA2NS5bY2hdLiBUaGUgQU1EIEMtTEFOQ0UgZGF0YXNoZWV0IHdhcyBhbHNvIGhlbHBmdWwuCisgKiBOQjogdGhpcyB3YXMgbWFkZSBlYXN5IGJ5IHRoZSBmYWN0IHRoYXQgSmVzIFNvcmVuc2VuIGhhZCBjbGVhbmVkIHVwCisgKiBtb3N0IG9mIGEyMDI1IGFuZCBzdW5sYW5jZSB3aXRoIHRoZSBhaW0gb2YgbWVyZ2luZyB0aGVtLCBzbyB0aGUgCisgKiBjb21tb24gY29kZSB3YXMgcHJldHR5IG9idmlvdXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKy8qIFVzZWQgZm9yIHRoZSB0ZW1wb3JhbCBpbmV0IGVudHJpZXMgYW5kIHJvdXRpbmcgKi8KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpZmRlZiBDT05GSUdfSFAzMDAKKyNpbmNsdWRlIDxhc20vYmxpbmtlbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICI3OTkwLmgiCisKKyNkZWZpbmUgV1JJVEVSQVAobHAseCkgb3V0X2JlMTYobHAtPmJhc2UgKyBMQU5DRV9SQVAsICh4KSkKKyNkZWZpbmUgV1JJVEVSRFAobHAseCkgb3V0X2JlMTYobHAtPmJhc2UgKyBMQU5DRV9SRFAsICh4KSkKKyNkZWZpbmUgUkVBRFJEUChscCkgaW5fYmUxNihscC0+YmFzZSArIExBTkNFX1JEUCkKKworI2lmIGRlZmluZWQoQ09ORklHX0hQTEFOQ0UpIHx8IGRlZmluZWQoQ09ORklHX0hQTEFOQ0VfTU9EVUxFKQorI2luY2x1ZGUgImhwbGFuY2UuaCIKKworI3VuZGVmIFdSSVRFUkFQCisjdW5kZWYgV1JJVEVSRFAKKyN1bmRlZiBSRUFEUkRQCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVk1FMTQ3X05FVCkgfHwgZGVmaW5lZChDT05GSUdfTVZNRTE0N19ORVRfTU9EVUxFKQorCisvKiBMb3NzYWdlIEZhY3RvciBOaW5lLCBNciBTdWx1LiAqLworI2RlZmluZSBXUklURVJBUChscCx4KSAobHAtPndyaXRlcmFwKGxwLHgpKQorI2RlZmluZSBXUklURVJEUChscCx4KSAobHAtPndyaXRlcmRwKGxwLHgpKQorI2RlZmluZSBSRUFEUkRQKGxwKSAobHAtPnJlYWRyZHAobHApKQorCisjZWxzZQorCisvKiBUaGVzZSBpbmxpbmVzIGNhbiBiZSB1c2VkIGlmIG9ubHkgQ09ORklHX0hQTEFOQ0UgaXMgZGVmaW5lZCAqLworc3RhdGljIGlubGluZSB2b2lkIFdSSVRFUkFQKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCwgX191MTYgdmFsdWUpCit7CisJZG8geworCQlvdXRfYmUxNihscC0+YmFzZSArIEhQTEFOQ0VfUkVHT0ZGICsgTEFOQ0VfUkFQLCB2YWx1ZSk7CisJfSB3aGlsZSAoKGluXzgobHAtPmJhc2UgKyBIUExBTkNFX1NUQVRVUykgJiBMRV9BQ0spID09IDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgV1JJVEVSRFAoc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwLCBfX3UxNiB2YWx1ZSkKK3sKKwlkbyB7CisJCW91dF9iZTE2KGxwLT5iYXNlICsgSFBMQU5DRV9SRUdPRkYgKyBMQU5DRV9SRFAsIHZhbHVlKTsKKwl9IHdoaWxlICgoaW5fOChscC0+YmFzZSArIEhQTEFOQ0VfU1RBVFVTKSAmIExFX0FDSykgPT0gMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MTYgUkVBRFJEUChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApCit7CisJX191MTYgdmFsdWU7CisJZG8geworCQl2YWx1ZSA9IGluX2JlMTYobHAtPmJhc2UgKyBIUExBTkNFX1JFR09GRiArIExBTkNFX1JEUCk7CisJfSB3aGlsZSAoKGluXzgobHAtPmJhc2UgKyBIUExBTkNFX1NUQVRVUykgJiBMRV9BQ0spID09IDApOworCXJldHVybiB2YWx1ZTsKK30KKworI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0hQTEFOQ0UgfHwgQ09ORklHX0hQTEFOQ0VfTU9EVUxFICovCisKKy8qIGRlYnVnZ2luZyBvdXRwdXQgbWFjcm9zLCB2YXJpb3VzIGZsYXZvdXJzICovCisvKiAjZGVmaW5lIFRFU1RfSElUUyAqLworI2lmZGVmIFVOREVGCisjZGVmaW5lIFBSSU5UX1JJTkdTKCkgXAorZG8geyBcCisgICAgICAgIGludCB0OyBcCisgICAgICAgIGZvciAodD0wOyB0IDwgUlhfUklOR19TSVpFOyB0KyspIHsgXAorICAgICAgICAgICAgICAgIHByaW50aygiUiVkOiBAKCUwMlggJTA0WCkgbGVuICUwNFgsIG1ibGVuICUwNFgsIGJpdHMgJTAyWFxuIixcCisgICAgICAgICAgICAgICAgICAgICAgIHQsIGliLT5icnhfcmluZ1t0XS5ybWQxX2hhZHIsIGliLT5icnhfcmluZ1t0XS5ybWQwLFwKKyAgICAgICAgICAgICAgICAgICAgICAgaWItPmJyeF9yaW5nW3RdLmxlbmd0aCxcCisgICAgICAgICAgICAgICAgICAgICAgIGliLT5icnhfcmluZ1t0XS5tYmxlbmd0aCwgaWItPmJyeF9yaW5nW3RdLnJtZDFfYml0cyk7XAorICAgICAgICB9XAorICAgICAgICBmb3IgKHQ9MDsgdCA8IFRYX1JJTkdfU0laRTsgdCsrKSB7IFwKKyAgICAgICAgICAgICAgICBwcmludGsoIlQlZDogQCglMDJYICUwNFgpIGxlbiAlMDRYLCBtaXNjICUwNFgsIGJpdHMgJTAyWFxuIixcCisgICAgICAgICAgICAgICAgICAgICAgIHQsIGliLT5idHhfcmluZ1t0XS50bWQxX2hhZHIsIGliLT5idHhfcmluZ1t0XS50bWQwLFwKKyAgICAgICAgICAgICAgICAgICAgICAgaWItPmJ0eF9yaW5nW3RdLmxlbmd0aCxcCisgICAgICAgICAgICAgICAgICAgICAgIGliLT5idHhfcmluZ1t0XS5taXNjLCBpYi0+YnR4X3JpbmdbdF0udG1kMV9iaXRzKTtcCisgICAgICAgIH1cCit9IHdoaWxlICgwKSAKKyNlbHNlCisjZGVmaW5lIFBSSU5UX1JJTkdTKCkKKyNlbmRpZiAgICAgICAgCisKKy8qIExvYWQgdGhlIENTUiByZWdpc3RlcnMuIFRoZSBMQU5DRSBoYXMgdG8gYmUgU1RPUHBlZCB3aGVuIHdlIGRvIHRoaXMhICovCitzdGF0aWMgdm9pZCBsb2FkX2NzcnMgKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCkKK3sKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmFpYiA9IGxwLT5sYW5jZV9pbml0X2Jsb2NrOworICAgICAgICBpbnQgbGVwdHI7CisKKyAgICAgICAgbGVwdHIgPSBMQU5DRV9BRERSIChhaWIpOworCisgICAgICAgIFdSSVRFUkFQKGxwLCBMRV9DU1IxKTsgICAgICAgICAgICAgICAgICAgIC8qIGxvYWQgYWRkcmVzcyBvZiBpbml0IGJsb2NrICovCisgICAgICAgIFdSSVRFUkRQKGxwLCBsZXB0ciAmIDB4RkZGRik7CisgICAgICAgIFdSSVRFUkFQKGxwLCBMRV9DU1IyKTsKKyAgICAgICAgV1JJVEVSRFAobHAsIGxlcHRyID4+IDE2KTsKKyAgICAgICAgV1JJVEVSQVAobHAsIExFX0NTUjMpOworICAgICAgICBXUklURVJEUChscCwgbHAtPmJ1c21hc3Rlcl9yZWd2YWwpOyAgICAgICAvKiBzZXQgYnl0ZXN3YXAvQUxFY3RybC9ieXRlIGN0cmwgKi8KKworICAgICAgICAvKiBQb2ludCBiYWNrIHRvIGNzcjAgKi8KKyAgICAgICAgV1JJVEVSQVAobHAsIExFX0NTUjApOworfQorCisvKiAjZGVmaW5lIHRvIDAgb3IgMSBhcHByb3ByaWF0ZWx5ICovCisjZGVmaW5lIERFQlVHX0lSSU5HIDAKKy8qIFNldCB1cCB0aGUgTGFuY2UgUnggYW5kIFR4IHJpbmdzIGFuZCB0aGUgaW5pdCBibG9jayAqLworc3RhdGljIHZvaWQgbGFuY2VfaW5pdF9yaW5nIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9jazsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmFpYjsgLyogZm9yIExBTkNFX0FERFIgY29tcHV0YXRpb25zICovCisgICAgICAgIGludCBsZXB0cjsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgYWliID0gbHAtPmxhbmNlX2luaXRfYmxvY2s7CisKKyAgICAgICAgbHAtPnJ4X25ldyA9IGxwLT50eF9uZXcgPSAwOworICAgICAgICBscC0+cnhfb2xkID0gbHAtPnR4X29sZCA9IDA7CisKKyAgICAgICAgaWItPm1vZGUgPSBMRV9NT19QUk9NOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9ybWFsLCBlbmFibGUgVHggJiBSeCAqLworCisgICAgICAgIC8qIENvcHkgdGhlIGV0aGVybmV0IGFkZHJlc3MgdG8gdGhlIGxhbmNlIGluaXQgYmxvY2sKKyAgICAgICAgICogTm90aWNlIHRoYXQgd2UgZG8gYSBieXRlc3dhcCBpZiB3ZSdyZSBiaWcgZW5kaWFuLgorICAgICAgICAgKiBbSSB0aGluayB0aGlzIGlzIHRoZSByaWdodCBjcml0ZXJpb247IGF0IGxlYXN0LCBzdW5sYW5jZSwKKyAgICAgICAgICogYTIwNjUgYW5kIGF0YXJpbGFuY2UgZG8gdGhlIGJ5dGVzd2FwIGFuZCBsYW5jZS5jIChQQykgZG9lc24ndC4KKyAgICAgICAgICogSG93ZXZlciwgdGhlIGRhdGFzaGVldCBzYXlzIHRoYXQgdGhlIEJTV0FQIGJpdCBkb2Vzbid0IGFmZmVjdAorICAgICAgICAgKiB0aGUgaW5pdCBibG9jaywgc28gc3VyZWx5IGl0IHNob3VsZCBiZSBsb3cgYnl0ZSBmaXJzdCBmb3IKKyAgICAgICAgICogZXZlcnlib2R5PyBVbS5dIAorICAgICAgICAgKiBXZSBjb3VsZCBkZWZpbmUgdGhlIGliLT5waHlzYWRkciBhcyB0aHJlZSAxNmJpdCB2YWx1ZXMgYW5kCisgICAgICAgICAqIHVzZSAoYWRkclsxXSA8PCA4KSB8IGFkZHJbMF0gJiBjbywgYnV0IHRoaXMgaXMgbW9yZSBlZmZpY2llbnQuCisgICAgICAgICAqLworI2lmZGVmIF9fQklHX0VORElBTgorICAgICAgICBpYi0+cGh5c19hZGRyIFswXSA9IGRldi0+ZGV2X2FkZHIgWzFdOworICAgICAgICBpYi0+cGh5c19hZGRyIFsxXSA9IGRldi0+ZGV2X2FkZHIgWzBdOworICAgICAgICBpYi0+cGh5c19hZGRyIFsyXSA9IGRldi0+ZGV2X2FkZHIgWzNdOworICAgICAgICBpYi0+cGh5c19hZGRyIFszXSA9IGRldi0+ZGV2X2FkZHIgWzJdOworICAgICAgICBpYi0+cGh5c19hZGRyIFs0XSA9IGRldi0+ZGV2X2FkZHIgWzVdOworICAgICAgICBpYi0+cGh5c19hZGRyIFs1XSA9IGRldi0+ZGV2X2FkZHIgWzRdOworI2Vsc2UKKyAgICAgICAgZm9yIChpPTA7IGk8NjsgaSsrKQorICAgICAgICAgICBpYi0+cGh5c19hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKyNlbmRpZiAgICAgICAgCisKKyAgICAgICAgaWYgKERFQlVHX0lSSU5HKQorICAgICAgICAgICAgICAgIHByaW50ayAoIlRYIHJpbmdzOlxuIik7CisgICAgCisJbHAtPnR4X2Z1bGwgPSAwOworICAgICAgICAvKiBTZXR1cCB0aGUgVHggcmluZyBlbnRyaWVzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoMTw8bHAtPmxhbmNlX2xvZ190eF9idWZzKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbGVwdHIgPSBMQU5DRV9BRERSKCZhaWItPnR4X2J1ZltpXVswXSk7CisgICAgICAgICAgICAgICAgaWItPmJ0eF9yaW5nIFtpXS50bWQwICAgICAgPSBsZXB0cjsKKyAgICAgICAgICAgICAgICBpYi0+YnR4X3JpbmcgW2ldLnRtZDFfaGFkciA9IGxlcHRyID4+IDE2OworICAgICAgICAgICAgICAgIGliLT5idHhfcmluZyBbaV0udG1kMV9iaXRzID0gMDsKKyAgICAgICAgICAgICAgICBpYi0+YnR4X3JpbmcgW2ldLmxlbmd0aCAgICA9IDB4ZjAwMDsgLyogVGhlIG9uZXMgcmVxdWlyZWQgYnkgdG1kMiAqLworICAgICAgICAgICAgICAgIGliLT5idHhfcmluZyBbaV0ubWlzYyAgICAgID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUdfSVJJTkcpIAorICAgICAgICAgICAgICAgICAgIHByaW50ayAoIiVkOiAweCU4Ljh4XG4iLCBpLCBsZXB0cik7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXR1cCB0aGUgUnggcmluZyBlbnRyaWVzICovCisgICAgICAgIGlmIChERUJVR19JUklORykKKyAgICAgICAgICAgICAgICBwcmludGsgKCJSWCByaW5nczpcbiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKDE8PGxwLT5sYW5jZV9sb2dfcnhfYnVmcyk7IGkrKykgeworICAgICAgICAgICAgICAgIGxlcHRyID0gTEFOQ0VfQUREUigmYWliLT5yeF9idWZbaV1bMF0pOworCisgICAgICAgICAgICAgICAgaWItPmJyeF9yaW5nIFtpXS5ybWQwICAgICAgPSBsZXB0cjsKKyAgICAgICAgICAgICAgICBpYi0+YnJ4X3JpbmcgW2ldLnJtZDFfaGFkciA9IGxlcHRyID4+IDE2OworICAgICAgICAgICAgICAgIGliLT5icnhfcmluZyBbaV0ucm1kMV9iaXRzID0gTEVfUjFfT1dOOworICAgICAgICAgICAgICAgIC8qIDB4ZjAwMCA9PSBiaXRzIHRoYXQgbXVzdCBiZSBvbmUgKHJlc2VydmVkLCBwcmVzdW1hYmx5KSAqLworICAgICAgICAgICAgICAgIGliLT5icnhfcmluZyBbaV0ubGVuZ3RoICAgID0gLVJYX0JVRkZfU0laRSB8IDB4ZjAwMDsKKyAgICAgICAgICAgICAgICBpYi0+YnJ4X3JpbmcgW2ldLm1ibGVuZ3RoICA9IDA7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHX0lSSU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrICgiJWQ6IDB4JTguOHhcbiIsIGksIGxlcHRyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldHVwIHRoZSBpbml0aWFsaXphdGlvbiBibG9jayAqLworICAgIAorICAgICAgICAvKiBTZXR1cCByeCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKyAgICAgICAgbGVwdHIgPSBMQU5DRV9BRERSKCZhaWItPmJyeF9yaW5nKTsKKyAgICAgICAgaWItPnJ4X2xlbiA9IChscC0+bGFuY2VfbG9nX3J4X2J1ZnMgPDwgMTMpIHwgKGxlcHRyID4+IDE2KTsKKyAgICAgICAgaWItPnJ4X3B0ciA9IGxlcHRyOworICAgICAgICBpZiAoREVCVUdfSVJJTkcpCisgICAgICAgICAgICAgICAgcHJpbnRrICgiUlggcHRyOiAlOC44eFxuIiwgbGVwdHIpOworICAgIAorICAgICAgICAvKiBTZXR1cCB0eCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKyAgICAgICAgbGVwdHIgPSBMQU5DRV9BRERSKCZhaWItPmJ0eF9yaW5nKTsKKyAgICAgICAgaWItPnR4X2xlbiA9IChscC0+bGFuY2VfbG9nX3R4X2J1ZnMgPDwgMTMpIHwgKGxlcHRyID4+IDE2KTsKKyAgICAgICAgaWItPnR4X3B0ciA9IGxlcHRyOworICAgICAgICBpZiAoREVCVUdfSVJJTkcpCisgICAgICAgICAgICAgICAgcHJpbnRrICgiVFggcHRyOiAlOC44eFxuIiwgbGVwdHIpOworCisgICAgICAgIC8qIENsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyICovCisgICAgICAgIGliLT5maWx0ZXIgWzBdID0gMDsKKyAgICAgICAgaWItPmZpbHRlciBbMV0gPSAwOworICAgICAgICBQUklOVF9SSU5HUygpOworfQorCisvKiBMQU5DRSBtdXN0IGJlIFNUT1BwZWQgYmVmb3JlIHdlIGRvIHRoaXMsIHRvby4uLiAqLworc3RhdGljIGludCBpbml0X3Jlc3RhcnRfbGFuY2UgKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCkKK3sKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgV1JJVEVSQVAobHAsIExFX0NTUjApOworICAgICAgICBXUklURVJEUChscCwgTEVfQzBfSU5JVCk7CisKKyAgICAgICAgLyogTmVlZCBhIGhvb2sgaGVyZSBmb3Igc3VubGFuY2UgbGVkbWEgc3R1ZmYgKi8KKworICAgICAgICAvKiBXYWl0IGZvciB0aGUgbGFuY2UgdG8gY29tcGxldGUgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgICAgZm9yIChpID0gMDsgKGkgPCAxMDApICYmICEoUkVBRFJEUChscCkgJiAoTEVfQzBfRVJSIHwgTEVfQzBfSURPTikpOyBpKyspCisgICAgICAgICAgICAgICAgYmFycmllcigpOworICAgICAgICBpZiAoKGkgPT0gMTAwKSB8fCAoUkVBRFJEUChscCkgJiBMRV9DMF9FUlIpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrICgiTEFOQ0UgdW5vcGVuZWQgYWZ0ZXIgJWQgdGlja3MsIGNzcjA9JTQuNHguXG4iLCBpLCBSRUFEUkRQKGxwKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2xlYXIgSURPTiBieSB3cml0aW5nIGEgIjEiLCBlbmFibGUgaW50ZXJydXB0cyBhbmQgc3RhcnQgbGFuY2UgKi8KKyAgICAgICAgV1JJVEVSRFAobHAsIExFX0MwX0lET04pOworICAgICAgICBXUklURVJEUChscCwgTEVfQzBfSU5FQSB8IExFX0MwX1NUUlQpOworCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbmNlX3Jlc2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgc3RhdHVzOworICAgIAorICAgICAgICAvKiBTdG9wIHRoZSBsYW5jZSAqLworICAgICAgICBXUklURVJBUChscCwgTEVfQ1NSMCk7CisgICAgICAgIFdSSVRFUkRQKGxwLCBMRV9DMF9TVE9QKTsKKworICAgICAgICBsb2FkX2NzcnMgKGxwKTsKKyAgICAgICAgbGFuY2VfaW5pdF9yaW5nIChkZXYpOworICAgICAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICAgICAgc3RhdHVzID0gaW5pdF9yZXN0YXJ0X2xhbmNlIChscCk7CisjaWZkZWYgREVCVUdfRFJJVkVSCisgICAgICAgIHByaW50ayAoIkxhbmNlIHJlc3RhcnQ9JWRcbiIsIHN0YXR1cyk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBsYW5jZV9yeCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2s7CisgICAgICAgIHZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yeF9kZXNjICpyZDsKKyAgICAgICAgdW5zaWduZWQgY2hhciBiaXRzOworICAgICAgICBpbnQgbGVuID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIFhYWCBzaHV0IHVwIGdjYyB3YXJuaW5ncyAqLworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gMDsgICAgICAgIC8qIFhYWCBzaHV0IHVwIGdjYyB3YXJuaW5ncyAqLworI2lmZGVmIFRFU1RfSElUUworICAgICAgICBpbnQgaTsKKyNlbmRpZgorCisjaWZkZWYgVEVTVF9ISVRTCisgICAgICAgIHByaW50ayAoIlsiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gbHAtPnJ4X25ldykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoIiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWItPmJyeF9yaW5nIFtpXS5ybWQxX2JpdHMgJiBMRV9SMV9PV04gPyAiXyIgOiAiWCIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoIiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWItPmJyeF9yaW5nIFtpXS5ybWQxX2JpdHMgJiBMRV9SMV9PV04gPyAiLiIgOiAiMSIpOworICAgICAgICB9CisgICAgICAgIHByaW50ayAoIl0iKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19IUDMwMAorCWJsaW5rZW5fbGVkcygweDQwLCAwKTsKKyNlbmRpZiAgICAKKyAgICAgICAgV1JJVEVSRFAobHAsIExFX0MwX1JJTlQgfCBMRV9DMF9JTkVBKTsgICAgIC8qIGFjayBSeCBpbnQsIHJlZW5hYmxlIGludHMgKi8KKyAgICAgICAgZm9yIChyZCA9ICZpYi0+YnJ4X3JpbmcgW2xwLT5yeF9uZXddOyAgICAgLyogRm9yIGVhY2ggUnggcmluZyB3ZSBvd24uLi4gKi8KKyAgICAgICAgICAgICAhKChiaXRzID0gcmQtPnJtZDFfYml0cykgJiBMRV9SMV9PV04pOworICAgICAgICAgICAgIHJkID0gJmliLT5icnhfcmluZyBbbHAtPnJ4X25ld10pIHsKKworICAgICAgICAgICAgICAgIC8qIFdlIGdvdCBhbiBpbmNvbXBsZXRlIGZyYW1lPyAqLworICAgICAgICAgICAgICAgIGlmICgoYml0cyAmIExFX1IxX1BPSykgIT0gTEVfUjFfUE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0cyAmIExFX1IxX0VSUikgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQ291bnQgb25seSB0aGUgZW5kIGZyYW1lIGFzIGEgcnggZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBub3QgdGhlIGJlZ2lubmluZworICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyAmIExFX1IxX0JVRikgbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyAmIExFX1IxX0NSQykgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzICYgTEVfUjFfT0ZMKSBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzICYgTEVfUjFfRlJBKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyAmIExFX1IxX0VPUCkgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAocmQtPm1ibGVuZ3RoICYgMHhmZmYpIC0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrYiA9IGRldl9hbGxvY19za2IgKGxlbisyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNrYiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmQtPm1ibGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmQtPnJtZDFfYml0cyA9IExFX1IxX09XTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnJ4X25ldyA9IChscC0+cnhfbmV3ICsgMSkgJiBscC0+cnhfcmluZ19tb2RfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgICAgICAgICAgICAgc2tiX3Jlc2VydmUgKHNrYiwgMik7ICAgICAgICAgICAvKiAxNiBieXRlIGFsaWduICovCisgICAgICAgICAgICAgICAgICAgICAgICBza2JfcHV0IChza2IsIGxlbik7ICAgICAgICAgICAgIC8qIG1ha2Ugcm9vbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZXRoX2NvcHlfYW5kX3N1bShza2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopJihpYi0+cnhfYnVmIFtscC0+cnhfbmV3XVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMgKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4IChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFJldHVybiB0aGUgcGFja2V0IHRvIHRoZSBwb29sICovCisgICAgICAgICAgICAgICAgcmQtPm1ibGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICByZC0+cm1kMV9iaXRzID0gTEVfUjFfT1dOOworICAgICAgICAgICAgICAgIGxwLT5yeF9uZXcgPSAobHAtPnJ4X25ldyArIDEpICYgbHAtPnJ4X3JpbmdfbW9kX21hc2s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuY2VfdHggKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrOworICAgICAgICB2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfdHhfZGVzYyAqdGQ7CisgICAgICAgIGludCBpLCBqOworICAgICAgICBpbnQgc3RhdHVzOworCisjaWZkZWYgQ09ORklHX0hQMzAwCisJYmxpbmtlbl9sZWRzKDB4ODAsIDApOworI2VuZGlmCisgICAgICAgIC8qIGNzcjAgaXMgMmYzICovCisgICAgICAgIFdSSVRFUkRQKGxwLCBMRV9DMF9USU5UIHwgTEVfQzBfSU5FQSk7CisgICAgICAgIC8qIGNzcjAgaXMgNzMgKi8KKworICAgICAgICBqID0gbHAtPnR4X29sZDsKKyAgICAgICAgZm9yIChpID0gajsgaSAhPSBscC0+dHhfbmV3OyBpID0gaikgeworICAgICAgICAgICAgICAgIHRkID0gJmliLT5idHhfcmluZyBbaV07CisKKyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBoaXQgYSBwYWNrZXQgbm90IG93bmVkIGJ5IHVzLCBzdG9wICovCisgICAgICAgICAgICAgICAgaWYgKHRkLT50bWQxX2JpdHMgJiBMRV9UMV9PV04pCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAodGQtPnRtZDFfYml0cyAmIExFX1QxX0VSUikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGQtPm1pc2M7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiBMRV9UM19SVFkpICBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiBMRV9UM19MQ09MKSBscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgTEVfVDNfQ0xPUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxwLT5hdXRvX3NlbGVjdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT50cGUgPSAxIC0gbHAtPnRwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIiVzOiBDYXJyaWVyIExvc3QsIHRyeWluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBscC0+dHBlPyJUUEUiOiJBVUkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9wIHRoZSBsYW5jZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFUkFQKGxwLCBMRV9DU1IwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURVJEUChscCwgTEVfQzBfU1RPUCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuY2VfaW5pdF9yaW5nIChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfY3NycyAobHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVzdGFydF9sYW5jZSAobHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlciBlcnJvcnMgYW5kIHVuZGVyZmxvd3MgdHVybiBvZmYgdGhlIHRyYW5zbWl0dGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0YXJ0IHRoZSBhZGFwdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgKExFX1QzX0JVRnxMRV9UM19VRkwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoIiVzOiBUeDogRVJSX0JVRnxFUlJfVUZMLCByZXN0YXJ0aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3AgdGhlIGxhbmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFUkFQKGxwLCBMRV9DU1IwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEVSRFAobHAsIExFX0MwX1NUT1ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5jZV9pbml0X3JpbmcgKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfY3NycyAobHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3Jlc3RhcnRfbGFuY2UgKGxwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGQtPnRtZDFfYml0cyAmIExFX1QxX1BPSykgPT0gTEVfVDFfUE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogU28gd2UgZG9uJ3QgY291bnQgdGhlIHBhY2tldCBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGQtPnRtZDFfYml0cyAmPSB+KExFX1QxX1BPSyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9uZSBjb2xsaXNpb24gYmVmb3JlIHBhY2tldCB3YXMgc2VudC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZC0+dG1kMV9iaXRzICYgTEVfVDFfRU9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9yZSB0aGFuIG9uZSBjb2xsaXNpb24sIGJlIG9wdGltaXN0aWMuICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGQtPnRtZDFfYml0cyAmIExFX1QxX0VNT1JFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMuY29sbGlzaW9ucyArPSAyOworCisgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMudHhfcGFja2V0cysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAgICAgaiA9IChqICsgMSkgJiBscC0+dHhfcmluZ19tb2RfbWFzazsKKyAgICAgICAgfQorICAgICAgICBscC0+dHhfb2xkID0gajsKKyAgICAgICAgV1JJVEVSRFAobHAsIExFX0MwX1RJTlQgfCBMRV9DMF9JTkVBKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorbGFuY2VfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworICAgICAgICBzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgY3NyMDsKKworCXNwaW5fbG9jayAoJmxwLT5kZXZsb2NrKTsKKworICAgICAgICBXUklURVJBUChscCwgTEVfQ1NSMCk7ICAgICAgICAgICAgICAvKiBMQU5DRSBDb250cm9sbGVyIFN0YXR1cyAqLworICAgICAgICBjc3IwID0gUkVBRFJEUChscCk7CisKKyAgICAgICAgUFJJTlRfUklOR1MoKTsKKyAgICAgICAgCisgICAgICAgIGlmICghKGNzcjAgJiBMRV9DMF9JTlRSKSkgeyAgICAgLyogQ2hlY2sgaWYgYW55IGludGVycnVwdCBoYXMgKi8KKwkJc3Bpbl91bmxvY2sgKCZscC0+ZGV2bG9jayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElSUV9OT05FOyAgICAgICAgLyogYmVlbiBnZW5lcmF0ZWQgYnkgdGhlIExhbmNlLiAqLworCX0KKworICAgICAgICAvKiBBY2tub3dsZWRnZSBhbGwgdGhlIGludGVycnVwdCBzb3VyY2VzIEFTQVAgKi8KKyAgICAgICAgV1JJVEVSRFAobHAsIGNzcjAgJiB+KExFX0MwX0lORUF8TEVfQzBfVERNRHxMRV9DMF9TVE9QfExFX0MwX1NUUlR8TEVfQzBfSU5JVCkpOworCisgICAgICAgIGlmICgoY3NyMCAmIExFX0MwX0VSUikpIHsKKyAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgZXJyb3IgY29uZGl0aW9uICovCisgICAgICAgICAgICAgICAgV1JJVEVSRFAobHAsIExFX0MwX0JBQkx8TEVfQzBfRVJSfExFX0MwX01JU1N8TEVfQzBfSU5FQSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3NyMCAmIExFX0MwX1JJTlQpCisgICAgICAgICAgICAgICAgbGFuY2VfcnggKGRldik7CisKKyAgICAgICAgaWYgKGNzcjAgJiBMRV9DMF9USU5UKQorICAgICAgICAgICAgICAgIGxhbmNlX3R4IChkZXYpOworCisgICAgICAgIC8qIExvZyBtaXNjIGVycm9ycy4gKi8KKyAgICAgICAgaWYgKGNzcjAgJiBMRV9DMF9CQUJMKQorICAgICAgICAgICAgICAgIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsgICAgICAgLyogVHggYmFiYmxlLiAqLworICAgICAgICBpZiAoY3NyMCAmIExFX0MwX01JU1MpCisgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAgICAgICAvKiBNaXNzZWQgYSBSeCBmcmFtZS4gKi8KKyAgICAgICAgaWYgKGNzcjAgJiBMRV9DMF9NRVJSKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCIlczogQnVzIG1hc3RlciBhcmJpdHJhdGlvbiBmYWlsdXJlLCBzdGF0dXMgJTQuNHguXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBjc3IwKTsKKyAgICAgICAgICAgICAgICAvKiBSZXN0YXJ0IHRoZSBjaGlwLiAqLworICAgICAgICAgICAgICAgIFdSSVRFUkRQKGxwLCBMRV9DMF9TVFJUKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChscC0+dHhfZnVsbCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYgKFRYX0JVRkZTX0FWQUlMID49IDApKSB7CisJCWxwLT50eF9mdWxsID0gMDsKKwkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgV1JJVEVSQVAobHAsIExFX0NTUjApOworICAgICAgICBXUklURVJEUChscCwgTEVfQzBfQkFCTHxMRV9DMF9DRVJSfExFX0MwX01JU1N8TEVfQzBfTUVSUnxMRV9DMF9JRE9OfExFX0MwX0lORUEpOworCisJc3Bpbl91bmxvY2sgKCZscC0+ZGV2bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgbGFuY2Vfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmVzOworICAgICAgICAKKyAgICAgICAgLyogSW5zdGFsbCB0aGUgSW50ZXJydXB0IGhhbmRsZXIuIE9yIHdlIGNvdWxkIHNodW50IHRoaXMgb3V0IHRvIHNwZWNpZmljIGRyaXZlcnM/ICovCisgICAgICAgIGlmIChyZXF1ZXN0X2lycShscC0+aXJxLCBsYW5jZV9pbnRlcnJ1cHQsIDAsIGxwLT5uYW1lLCBkZXYpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworCisgICAgICAgIHJlcyA9IGxhbmNlX3Jlc2V0KGRldik7CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5kZXZsb2NrKTsKKwluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKworCXJldHVybiByZXM7Cit9CisKK2ludCBsYW5jZV9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworICAgICAgICAvKiBTdG9wIHRoZSBMQU5DRSAqLworICAgICAgICBXUklURVJBUChscCwgTEVfQ1NSMCk7CisgICAgICAgIFdSSVRFUkRQKGxwLCBMRV9DMF9TVE9QKTsKKworICAgICAgICBmcmVlX2lycShscC0+aXJxLCBkZXYpOworCisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIGxhbmNlX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcmludGsoImxhbmNlX3R4X3RpbWVvdXRcbiIpOworCWxhbmNlX3Jlc2V0KGRldik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworCitpbnQgbGFuY2Vfc3RhcnRfeG1pdCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2s7CisgICAgICAgIGludCBlbnRyeSwgc2tibGVuLCBsZW47CisgICAgICAgIHN0YXRpYyBpbnQgb3V0czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIGlmICghVFhfQlVGRlNfQVZBSUwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworICAgICAgICBza2JsZW4gPSBza2ItPmxlbjsKKworI2lmZGVmIERFQlVHX0RSSVZFUgorICAgICAgICAvKiBkdW1wIHRoZSBwYWNrZXQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpICUgMTYpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsgKCIlMi4yeCAiLCBza2ItPmRhdGEgW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBsZW4gPSAoc2tibGVuIDw9IEVUSF9aTEVOKSA/IEVUSF9aTEVOIDogc2tibGVuOworICAgICAgICBlbnRyeSA9IGxwLT50eF9uZXcgJiBscC0+dHhfcmluZ19tb2RfbWFzazsKKyAgICAgICAgaWItPmJ0eF9yaW5nIFtlbnRyeV0ubGVuZ3RoID0gKC1sZW4pIHwgMHhmMDAwOworICAgICAgICBpYi0+YnR4X3JpbmcgW2VudHJ5XS5taXNjID0gMDsKKyAgICAKKyAgICAJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pCisgICAgCQltZW1zZXQoKGNoYXIgKikmaWItPnR4X2J1ZltlbnRyeV1bMF0sIDAsIEVUSF9aTEVOKTsKKyAgICAgICAgbWVtY3B5ICgoY2hhciAqKSZpYi0+dHhfYnVmIFtlbnRyeV1bMF0sIHNrYi0+ZGF0YSwgc2tibGVuKTsKKyAgICAKKyAgICAgICAgLyogTm93LCBnaXZlIHRoZSBwYWNrZXQgdG8gdGhlIGxhbmNlICovCisgICAgICAgIGliLT5idHhfcmluZyBbZW50cnldLnRtZDFfYml0cyA9IChMRV9UMV9QT0t8TEVfVDFfT1dOKTsKKyAgICAgICAgbHAtPnR4X25ldyA9IChscC0+dHhfbmV3KzEpICYgbHAtPnR4X3JpbmdfbW9kX21hc2s7CisKKyAgICAgICAgb3V0cysrOworICAgICAgICAvKiBLaWNrIHRoZSBsYW5jZTogdHJhbnNtaXQgbm93ICovCisgICAgICAgIFdSSVRFUkRQKGxwLCBMRV9DMF9JTkVBIHwgTEVfQzBfVERNRCk7CisgICAgICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworICAgICAgICBkZXZfa2ZyZWVfc2tiIChza2IpOworICAgIAorCXNwaW5fbG9ja19pcnFzYXZlICgmbHAtPmRldmxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKFRYX0JVRkZTX0FWQUlMKQorCQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKwllbHNlCisJCWxwLT50eF9mdWxsID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmbHAtPmRldmxvY2ssIGZsYWdzKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmxhbmNlX2dldF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICByZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyogdGFrZW4gZnJvbSB0aGUgZGVwY2EgZHJpdmVyIHZpYSBhMjA2NS5jICovCitzdGF0aWMgdm9pZCBsYW5jZV9sb2FkX211bHRpY2FzdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2s7CisgICAgICAgIHZvbGF0aWxlIHUxNiAqbWNhc3RfdGFibGUgPSAodTE2ICopJmliLT5maWx0ZXI7CisgICAgICAgIHN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pPWRldi0+bWNfbGlzdDsKKyAgICAgICAgY2hhciAqYWRkcnM7CisgICAgICAgIGludCBpOworICAgICAgICB1MzIgY3JjOworICAgICAgICAKKyAgICAgICAgLyogc2V0IGFsbCBtdWx0aWNhc3QgYml0cyAqLworICAgICAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSl7IAorICAgICAgICAgICAgICAgIGliLT5maWx0ZXIgWzBdID0gMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICBpYi0+ZmlsdGVyIFsxXSA9IDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8qIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyICovCisgICAgICAgIGliLT5maWx0ZXIgWzBdID0gMDsKKyAgICAgICAgaWItPmZpbHRlciBbMV0gPSAwOworCisgICAgICAgIC8qIEFkZCBhZGRyZXNzZXMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKyl7CisgICAgICAgICAgICAgICAgYWRkcnMgPSBkbWktPmRtaV9hZGRyOworICAgICAgICAgICAgICAgIGRtaSAgID0gZG1pLT5uZXh0OworCisgICAgICAgICAgICAgICAgLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCisgICAgICAgICAgICAgICAgaWYgKCEoKmFkZHJzICYgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAKKwkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKyAgICAgICAgICAgICAgICBjcmMgPSBjcmMgPj4gMjY7CisgICAgICAgICAgICAgICAgbWNhc3RfdGFibGUgW2NyYyA+PiA0XSB8PSAxIDw8IChjcmMgJiAweGYpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKK30KKworCit2b2lkIGxhbmNlX3NldF9tdWx0aWNhc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrOworCWludCBzdG9wcGVkOworCisJc3RvcHBlZCA9IG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KTsKKwlpZiAoIXN0b3BwZWQpCisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKyAgICAgICAgd2hpbGUgKGxwLT50eF9vbGQgIT0gbHAtPnR4X25ldykKKyAgICAgICAgICAgICAgICBzY2hlZHVsZSgpOworCisgICAgICAgIFdSSVRFUkFQKGxwLCBMRV9DU1IwKTsKKyAgICAgICAgV1JJVEVSRFAobHAsIExFX0MwX1NUT1ApOworICAgICAgICBsYW5jZV9pbml0X3JpbmcgKGRldik7CisKKyAgICAgICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworICAgICAgICAgICAgICAgIGliLT5tb2RlIHw9IExFX01PX1BST007CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWItPm1vZGUgJj0gfkxFX01PX1BST007CisgICAgICAgICAgICAgICAgbGFuY2VfbG9hZF9tdWx0aWNhc3QgKGRldik7CisgICAgICAgIH0KKyAgICAgICAgbG9hZF9jc3JzIChscCk7CisgICAgICAgIGluaXRfcmVzdGFydF9sYW5jZSAobHApOworCisJaWYgKCFzdG9wcGVkKQorCQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCit2b2lkIGxhbmNlX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrICgmbHAtPmRldmxvY2spOworCVdSSVRFUkFQKGxwLCBMRV9DU1IwKTsKKwlXUklURVJEUChscCwgTEVfQzBfU1RSVCk7CisJc3Bpbl91bmxvY2sgKCZscC0+ZGV2bG9jayk7CisJbGFuY2VfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworfQorI2VuZGlmCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0Lzc5OTAuaCBiL2RyaXZlcnMvbmV0Lzc5OTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWFlNTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvNzk5MC5oCkBAIC0wLDAgKzEsMjU2IEBACisvKiAKKyAqIDc5OTAuaCAtLSBMQU5DRSBldGhlcm5ldCBJQyBnZW5lcmljIHJvdXRpbmVzLgorICogVGhpcyBpcyBhbiBhdHRlbXB0IHRvIHNlcGFyYXRlIG91dCB0aGUgYml0cyBvZiB2YXJpb3VzIGV0aGVybmV0CisgKiBkcml2ZXJzIHRoYXQgYXJlIGNvbW1vbiBiZWNhdXNlIHRoZXkgYWxsIHVzZSB0aGUgQU1EIDc5OTAgTEFOQ0UKKyAqIChMb2NhbCBBcmVhIE5ldHdvcmsgQ29udHJvbGxlciBmb3IgRXRoZXJuZXQpIGNoaXAuCisgKiAKKyAqIENvcHlyaWdodCAoQykgMDUvMTk5OCBQZXRlciBNYXlkZWxsIDxwbWF5ZGVsbEBjaGlhcmsuZ3JlZW5lbmQub3JnLnVrPgorICoKKyAqIE1vc3Qgb2YgdGhpcyBzdHVmZiB3YXMgb2J0YWluZWQgYnkgbG9va2luZyBhdCBvdGhlciBMQU5DRSBkcml2ZXJzLAorICogaW4gcGFydGljdWxhciBhMjA2NS5bY2hdLiBUaGUgQU1EIEMtTEFOQ0UgZGF0YXNoZWV0IHdhcyBhbHNvIGhlbHBmdWwuCisgKi8KKworI2lmbmRlZiBfNzk5MF9ICisjZGVmaW5lIF83OTkwX0gKKworLyogVGhlIGxhbmNlIG9ubHkgaGFzIHR3byByZWdpc3RlciBsb2NhdGlvbnMuIFdlIGNvbW11bmljYXRlIG1vc3RseSB2aWEgbWVtb3J5LiAqLworI2RlZmluZSBMQU5DRV9SRFAJMAkvKiBSZWdpc3RlciBEYXRhIFBvcnQgKi8KKyNkZWZpbmUgTEFOQ0VfUkFQCTIJLyogUmVnaXN0ZXIgQWRkcmVzcyBQb3J0ICovCisKKy8qIFRyYW5zbWl0L3JlY2VpdmUgcmluZyBkZWZpbml0aW9ucy4KKyAqIFdlIGFsbG93IHRoZSBzcGVjaWZpYyBkcml2ZXJzIHRvIG92ZXJyaWRlIHRoZXNlIGRlZmF1bHRzIGlmIHRoZXkgd2FudCB0by4KKyAqIE5COiBhY2NvcmRpbmcgdG8gbGFuY2UuYywgaW5jcmVhc2luZyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaXMgYSB3YXN0ZQorICogb2Ygc3BhY2UgYW5kIHJlZHVjZXMgdGhlIGNoYW5jZSB0aGF0IGFuIHVwcGVyIGxheWVyIHdpbGwgYmUgYWJsZSB0bworICogcmVvcmRlciBxdWV1ZWQgVHggcGFja2V0cyBiYXNlZCBvbiBwcmlvcml0eS4gW0NsZWFybHkgdGhlcmUgaXMgYSBtaW5pbXVtCisgKiBsaW1pdCB0b286IHRvbyBzbWFsbCBhbmQgd2UgZHJvcCByeCBwYWNrZXRzIGFuZCBjYW4ndCB0eCBhdCBmdWxsIHNwZWVkLl0KKyAqIDQrNCBzZWVtcyB0byBiZSB0aGUgdXN1YWwgc2V0dGluZzsgdGhlIGF0YXJpbGFuY2UgZHJpdmVyIHVzZXMgMyBhbmQgNS4KKyAqLworCisvKiBCbGFzdCEgVGhpcyB3b24ndCB3b3JrLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHdlIGNhbid0IHNwZWNpZnkgYSBkZWZhdWx0CisgKiBzZXR0aW5nIGJlY2F1c2UgdGhhdCB3b3VsZCBjYXVzZSB0aGUgbGFuY2VfaW5pdF9ibG9jayBzdHJ1Y3QgdG8gYmUKKyAqIHRvbyBsb25nIChhbmQgb3ZlcmZsb3cgdGhlIFJBTSBvbiBzaGFyZWQtbWVtb3J5IGNhcmRzIGxpa2UgdGhlIEhQIExBTkNFLgorICovCisjaWZuZGVmIExBTkNFX0xPR19UWF9CVUZGRVJTCisjZGVmaW5lIExBTkNFX0xPR19UWF9CVUZGRVJTIDEKKyNkZWZpbmUgTEFOQ0VfTE9HX1JYX0JVRkZFUlMgMworI2VuZGlmCisKKyNkZWZpbmUgVFhfUklOR19TSVpFICgxPDxMQU5DRV9MT0dfVFhfQlVGRkVSUykKKyNkZWZpbmUgUlhfUklOR19TSVpFICgxPDxMQU5DRV9MT0dfUlhfQlVGRkVSUykKKyNkZWZpbmUgVFhfUklOR19NT0RfTUFTSyAoVFhfUklOR19TSVpFIC0gMSkKKyNkZWZpbmUgUlhfUklOR19NT0RfTUFTSyAoUlhfUklOR19TSVpFIC0gMSkKKyNkZWZpbmUgVFhfUklOR19MRU5fQklUUyAoKExBTkNFX0xPR19UWF9CVUZGRVJTKSA8PCAyOSkKKyNkZWZpbmUgUlhfUklOR19MRU5fQklUUyAoKExBTkNFX0xPR19SWF9CVUZGRVJTKSA8PCAyOSkKKyNkZWZpbmUgUEtUX0JVRkZfU0laRSAoMTU0NCkKKyNkZWZpbmUgUlhfQlVGRl9TSVpFIFBLVF9CVUZGX1NJWkUKKyNkZWZpbmUgVFhfQlVGRl9TSVpFIFBLVF9CVUZGX1NJWkUKKworLyogRWFjaCByZWNlaXZlIGJ1ZmZlciBpcyBkZXNjcmliZWQgYnkgYSByZWNlaXZlIG1lc3NhZ2UgZGVzY3JpcHRvciAoUk1EKSAqLworc3RydWN0IGxhbmNlX3J4X2Rlc2MgeworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IHJtZDA7ICAgICAgICAvKiBsb3cgYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICBybWQxX2JpdHM7ICAgLyogZGVzY3JpcHRvciBiaXRzICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgcm1kMV9oYWRyOyAgIC8qIGhpZ2ggYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwl2b2xhdGlsZSBzaG9ydCAgICBsZW5ndGg7ICAgIAkgICAgLyogVGhpcyBsZW5ndGggaXMgMnMgY29tcGxlbWVudCAobmVnYXRpdmUpIQorCQkJCSAgICAgKiBCdWZmZXIgbGVuZ3RoCisJCQkJICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IG1ibGVuZ3RoOyAgICAvKiBBY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkICovCit9OworIAorLyogRGl0dG8gZm9yIFRNRDogKi8KK3N0cnVjdCBsYW5jZV90eF9kZXNjIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCB0bWQwOyAgICAgICAgLyogbG93IGFkZHJlc3Mgb2YgcGFja2V0ICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgdG1kMV9iaXRzOyAgIC8qIGRlc2NyaXB0b3IgYml0cyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgIHRtZDFfaGFkcjsgICAvKiBoaWdoIGFkZHJlc3Mgb2YgcGFja2V0ICovCisJdm9sYXRpbGUgc2hvcnQgICAgbGVuZ3RoOyAgICAgICAJICAgIC8qIExlbmd0aCBpcyAycyBjb21wbGVtZW50IChuZWdhdGl2ZSkhICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgbWlzYzsKK307CisKKy8qIFRoZXJlIGFyZSB0aHJlZSBtZW1vcnkgc3RydWN0dXJlcyBhY2Nlc3NlZCBieSB0aGUgTEFOQ0U6CisgKiB0aGUgaW5pdGlhbGl6YXRpb24gYmxvY2ssIHRoZSByZWNlaXZlIGFuZCB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmdzLAorICogYW5kIHRoZSBkYXRhIGJ1ZmZlcnMgdGhlbXNlbHZlcy4gSW4gZmFjdCB3ZSBtaWdodCBhcyB3ZWxsIHB1dCB0aGUKKyAqIGluaXQgYmxvY2ssdGhlIFR4IGFuZCBSeCByaW5ncyBhbmQgdGhlIGJ1ZmZlcnMgdG9nZXRoZXIgaW4gbWVtb3J5OgorICovCitzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayB7CisgICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IG1vZGU7ICAgICAgICAgICAgLyogUHJlLXNldCBtb2RlIChyZWcuIDE1KSAqLworICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHBoeXNfYWRkcls2XTsgICAgIC8qIFBoeXNpY2FsIGV0aGVybmV0IGFkZHJlc3MgKi8KKyAgICAgICAgdm9sYXRpbGUgdW5zaWduZWQgZmlsdGVyWzJdOyAgICAgICAgICAgICAvKiBNdWx0aWNhc3QgZmlsdGVyICg2NCBiaXRzKSAqLworCisgICAgICAgIC8qIFJlY2VpdmUgYW5kIHRyYW5zbWl0IHJpbmcgYmFzZSwgYWxvbmcgd2l0aCBleHRyYSBiaXRzLiAqLworICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCByeF9wdHI7ICAgICAgICAgIC8qIHJlY2VpdmUgZGVzY3JpcHRvciBhZGRyICovCisgICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IHJ4X2xlbjsgICAgICAgICAgLyogcmVjZWl2ZSBsZW4gYW5kIGhpZ2ggYWRkciAqLworICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCB0eF9wdHI7ICAgICAgICAgIC8qIHRyYW5zbWl0IGRlc2NyaXB0b3IgYWRkciAqLworICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCB0eF9sZW47ICAgICAgICAgIC8qIHRyYW5zbWl0IGxlbiBhbmQgaGlnaCBhZGRyICovCisgICAgCisgICAgICAgIC8qIFRoZSBUeCBhbmQgUnggcmluZyBlbnRyaWVzIG11c3QgYmUgYWxpZ25lZCBvbiA4LWJ5dGUgYm91bmRhcmllcy4gCisgICAgICAgICAqIFRoaXMgd2lsbCBiZSB0cnVlIGlmIHRoaXMgd2hvbGUgc3RydWN0IGlzIDgtYnl0ZSBhbGlnbmVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX3R4X2Rlc2MgYnR4X3JpbmdbVFhfUklOR19TSVpFXTsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX3J4X2Rlc2MgYnJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKworICAgICAgICB2b2xhdGlsZSBjaGFyICAgdHhfYnVmIFtUWF9SSU5HX1NJWkVdW1RYX0JVRkZfU0laRV07CisgICAgICAgIHZvbGF0aWxlIGNoYXIgICByeF9idWYgW1JYX1JJTkdfU0laRV1bUlhfQlVGRl9TSVpFXTsKKyAgICAgICAgLyogd2UgdXNlIHRoaXMganVzdCB0byBtYWtlIHRoZSBzdHJ1Y3QgYmlnIGVub3VnaCB0aGF0IHdlIGNhbiBtb3ZlIGl0cyBzdGFydGFkZHIKKyAgICAgICAgICogaW4gb3JkZXIgdG8gZm9yY2UgYWxpZ25tZW50IHRvIGFuIGVpZ2h0IGJ5dGUgYm91bmRhcnkuCisgICAgICAgICAqLworfTsKKworLyogVGhpcyBpcyB3aGVyZSB3ZSBrZWVwIGFsbCB0aGUgc3R1ZmYgdGhlIGRyaXZlciBuZWVkcyB0byBrbm93IGFib3V0LgorICogSSdtIGRlZmluaXRlbHkgdW5oYXBweSBhYm91dCB0aGUgbWVjaGFuaXNtIGZvciBhbGxvd2luZyBzcGVjaWZpYworICogZHJpdmVycyB0byBhZGQgdGhpbmdzLi4uCisgKi8KK3N0cnVjdCBsYW5jZV9wcml2YXRlCit7CisgICAgICAgIGNoYXIgKm5hbWU7CisJdW5zaWduZWQgbG9uZyBiYXNlOworICAgICAgICB2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaW5pdF9ibG9jazsgLyogQ1BVIGFkZHJlc3Mgb2YgUkFNICovCisgICAgICAgIHZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICpsYW5jZV9pbml0X2Jsb2NrOyAvKiBMQU5DRSBhZGRyZXNzIG9mIFJBTSAqLworICAgICAgICAKKyAgICAgICAgaW50IHJ4X25ldywgdHhfbmV3OworICAgICAgICBpbnQgcnhfb2xkLCB0eF9vbGQ7CisgICAgICAgIAorICAgICAgICBpbnQgbGFuY2VfbG9nX3J4X2J1ZnMsIGxhbmNlX2xvZ190eF9idWZzOworICAgICAgICBpbnQgcnhfcmluZ19tb2RfbWFzaywgdHhfcmluZ19tb2RfbWFzazsKKyAgICAgICAgCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworICAgICAgICBpbnQgdHBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUUEUgaXMgc2VsZWN0ZWQgKi8KKyAgICAgICAgaW50IGF1dG9fc2VsZWN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FibGUtc2VsZWN0aW9uIGlzIGJ5IGNhcnJpZXIgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgYnVzbWFzdGVyX3JlZ3ZhbDsKKworICAgICAgICB1bnNpZ25lZCBpbnQgaXJxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJUlEgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgCisgICAgICAgIC8qIFRoaXMgaXMgYmVjYXVzZSB0aGUgSFAgTEFOQ0UgaXMgZGlzZ3VzdGluZyBhbmQgeW91IGhhdmUgdG8gY2hlY2sgCisgICAgICAgICAqIGEgRElPLXNwZWNpZmljIHJlZ2lzdGVyIGV2ZXJ5IHRpbWUgeW91IHJlYWQvd3JpdGUgdGhlIExBTkNFIHJlZ3MgOi08CisgICAgICAgICAqIFtjb3VsZCB3ZSBnZXQgYXdheSB3aXRoIG1ha2luZyB0aGVzZSBzb21lIHNvcnQgb2YgbWFjcm8/XQorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCAoKndyaXRlcmFwKSh2b2lkICosIHVuc2lnbmVkIHNob3J0KTsKKyAgICAgICAgdm9pZCAoKndyaXRlcmRwKSh2b2lkICosIHVuc2lnbmVkIHNob3J0KTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgKCpyZWFkcmRwKSh2b2lkICopOworCXNwaW5sb2NrX3QgZGV2bG9jazsKKwljaGFyIHR4X2Z1bGw7Cit9OworCisvKgorICogICAgICAgICAgICAgIEFtNzk5MCBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgTEVfQ1NSMCAgICAgICAgIDB4MDAwMCAgICAgICAgICAvKiBMQU5DRSBDb250cm9sbGVyIFN0YXR1cyAqLworI2RlZmluZSBMRV9DU1IxICAgICAgICAgMHgwMDAxICAgICAgICAgIC8qIElBRFJbMTU6MF0gKGJpdDA9PTAgaWUgd29yZCBhbGlnbmVkKSAqLworI2RlZmluZSBMRV9DU1IyICAgICAgICAgMHgwMDAyICAgICAgICAgIC8qIElBRFJbMjM6MTZdIChoaWdoIGJpdHMgcmVzZXJ2ZWQpICovCisjZGVmaW5lIExFX0NTUjMgICAgICAgICAweDAwMDMgICAgICAgICAgLyogTWlzYyAqLworCisvKgorICoJCUJpdCBkZWZpbml0aW9ucyBmb3IgQ1NSMCAoTEFOQ0UgQ29udHJvbGxlciBTdGF0dXMpCisgKi8KKyNkZWZpbmUgTEVfQzBfRVJSCTB4ODAwMAkJLyogRXJyb3IgPSBCQUJMIHwgQ0VSUiB8IE1JU1MgfCBNRVJSICovCisjZGVmaW5lIExFX0MwX0JBQkwJMHg0MDAwCQkvKiBCYWJibGU6IFRyYW5zbWl0dGVkIHRvbyBtYW55IGJpdHMgKi8KKyNkZWZpbmUgTEVfQzBfQ0VSUgkweDIwMDAJCS8qIE5vIEhlYXJ0YmVhdCAoMTBCQVNFLVQpICovCisjZGVmaW5lIExFX0MwX01JU1MJMHgxMDAwCQkvKiBNaXNzZWQgRnJhbWUgKG5vIHJ4IGJ1ZmZlciB0byBwdXQgaXQgaW4pICovCisjZGVmaW5lIExFX0MwX01FUlIJMHgwODAwCQkvKiBNZW1vcnkgRXJyb3IgKi8KKyNkZWZpbmUgTEVfQzBfUklOVAkweDA0MDAJCS8qIFJlY2VpdmUgSW50ZXJydXB0ICovCisjZGVmaW5lIExFX0MwX1RJTlQJMHgwMjAwCQkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgTEVfQzBfSURPTgkweDAxMDAJCS8qIEluaXRpYWxpemF0aW9uIERvbmUgKi8KKyNkZWZpbmUgTEVfQzBfSU5UUgkweDAwODAJCS8qIEludGVycnVwdCBGbGFnIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEJBQkwgfCBNSVNTIHwgTUVSUiB8IFJJTlQgfCBUSU5UIHwgSURPTiAqLworI2RlZmluZSBMRV9DMF9JTkVBCTB4MDA0MAkJLyogSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMRV9DMF9SWE9OCTB4MDAyMAkJLyogUmVjZWl2ZSBPbiAqLworI2RlZmluZSBMRV9DMF9UWE9OCTB4MDAxMAkJLyogVHJhbnNtaXQgT24gKi8KKyNkZWZpbmUgTEVfQzBfVERNRAkweDAwMDgJCS8qIFRyYW5zbWl0IERlbWFuZCAqLworI2RlZmluZSBMRV9DMF9TVE9QCTB4MDAwNAkJLyogU3RvcCAqLworI2RlZmluZSBMRV9DMF9TVFJUCTB4MDAwMgkJLyogU3RhcnQgKi8KKyNkZWZpbmUgTEVfQzBfSU5JVAkweDAwMDEJCS8qIEluaXRpYWxpemUgKi8KKworCisvKgorICoJCUJpdCBkZWZpbml0aW9ucyBmb3IgQ1NSMworICovCisjZGVmaW5lIExFX0MzX0JTV1AJMHgwMDA0CQkvKiBCeXRlIFN3YXAKKwkJCQkJICAgKG9uIGZvciBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIpICovCisjZGVmaW5lIExFX0MzX0FDT04JMHgwMDAyCQkvKiBBTEUgQ29udHJvbAorCQkJCQkgICAob24gZm9yIGFjdGl2ZSBsb3cgQUxFKSAqLworI2RlZmluZSBMRV9DM19CQ09OCTB4MDAwMQkJLyogQnl0ZSBDb250cm9sICovCisKKworLyoKKyAqCQlNb2RlIEZsYWdzCisgKi8KKyNkZWZpbmUgTEVfTU9fUFJPTQkweDgwMDAJCS8qIFByb21pc2N1b3VzIE1vZGUgKi8KKy8qIHRoZXNlIG5leHQgb25lcyAweDQwMDAgLS0gMHgwMDgwIGFyZSBub3QgYXZhaWxhYmxlIG9uIHRoZSBMQU5DRSA3OTkwLAorICogYnV0IHRoZXkgYXJlIGluIE5ldEJTRCdzIGFtNzk5MC5oLCBwcmVzdW1hYmx5IGZvciBiYWNrd2FyZHMtY29tcGF0aWJsZSBjaGlwcworICovCisjZGVmaW5lIExFX01PX0RSQ1ZCQyAgMHg0MDAwICAgICAgICAgIC8qIGRpc2FibGUgcmVjZWl2ZSBicm9hZGNhc3QgKi8KKyNkZWZpbmUgTEVfTU9fRFJDVlBBICAweDIwMDAgICAgICAgICAgLyogZGlzYWJsZSBwaHlzaWNhbCBhZGRyZXNzIGRldGVjdGlvbiAqLworI2RlZmluZSBMRV9NT19ETE5LVFNUIDB4MTAwMCAgICAgICAgICAvKiBkaXNhYmxlIGxpbmsgc3RhdHVzICovCisjZGVmaW5lIExFX01PX0RBUEMgICAgMHgwODAwICAgICAgICAgIC8qIGRpc2FibGUgYXV0b21hdGljIHBvbGFyaXR5IGNvcnJlY3Rpb24gKi8KKyNkZWZpbmUgTEVfTU9fTUVOREVDTCAweDA0MDAgICAgICAgICAgLyogTUVOREVDIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgTEVfTU9fTFJUVFNFTCAweDAyMDAgICAgICAgICAgLyogbG93ZXIgUlggdGhyZXNob2xkIC8gVFggbW9kZSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTEVfTU9fUFNFTDEgICAweDAxMDAgICAgICAgICAgLyogcG9ydCBzZWxlY3Rpb24gYml0MSAqLworI2RlZmluZSBMRV9NT19QU0VMMCAgIDB4MDA4MCAgICAgICAgICAvKiBwb3J0IHNlbGVjdGlvbiBiaXQwICovCisvKiBhbmQgdGhpcyBvbmUgaXMgZnJvbSB0aGUgQy1MQU5DRSBkYXRhIHNoZWV0Li4uICovCisjZGVmaW5lIExFX01PX0VNQkEgICAgICAweDAwODAgICAgICAgICAgLyogRW5hYmxlIE1vZGlmaWVkIEJhY2tvZmYgQWxnb3JpdGhtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDLUxBTkNFLCBub3Qgb3JpZ2luYWwgTEFOQ0UpICovCisjZGVmaW5lIExFX01PX0lOVEwJMHgwMDQwCQkvKiBJbnRlcm5hbCBMb29wYmFjayAqLworI2RlZmluZSBMRV9NT19EUlRZCTB4MDAyMAkJLyogRGlzYWJsZSBSZXRyeSAqLworI2RlZmluZSBMRV9NT19GQ09MTAkweDAwMTAJCS8qIEZvcmNlIENvbGxpc2lvbiAqLworI2RlZmluZSBMRV9NT19EWE1URkNTCTB4MDAwOAkJLyogRGlzYWJsZSBUcmFuc21pdCBDUkMgKi8KKyNkZWZpbmUgTEVfTU9fTE9PUAkweDAwMDQJCS8qIExvb3BiYWNrIEVuYWJsZSAqLworI2RlZmluZSBMRV9NT19EVFgJMHgwMDAyCQkvKiBEaXNhYmxlIFRyYW5zbWl0dGVyICovCisjZGVmaW5lIExFX01PX0RSWAkweDAwMDEJCS8qIERpc2FibGUgUmVjZWl2ZXIgKi8KKworCisvKgorICoJCVJlY2VpdmUgRmxhZ3MKKyAqLworI2RlZmluZSBMRV9SMV9PV04JMHg4MAkJLyogTEFOQ0Ugb3ducyB0aGUgZGVzY3JpcHRvciAqLworI2RlZmluZSBMRV9SMV9FUlIJMHg0MAkJLyogRXJyb3IgKi8KKyNkZWZpbmUgTEVfUjFfRlJBCTB4MjAJCS8qIEZyYW1pbmcgRXJyb3IgKi8KKyNkZWZpbmUgTEVfUjFfT0ZMCTB4MTAJCS8qIE92ZXJmbG93IEVycm9yICovCisjZGVmaW5lIExFX1IxX0NSQwkweDA4CQkvKiBDUkMgRXJyb3IgKi8KKyNkZWZpbmUgTEVfUjFfQlVGCTB4MDQJCS8qIEJ1ZmZlciBFcnJvciAqLworI2RlZmluZSBMRV9SMV9TT1AJMHgwMgkJLyogU3RhcnQgb2YgUGFja2V0ICovCisjZGVmaW5lIExFX1IxX0VPUAkweDAxCQkvKiBFbmQgb2YgUGFja2V0ICovCisjZGVmaW5lIExFX1IxX1BPSyAgICAgICAweDAzCQkvKiBQYWNrZXQgaXMgY29tcGxldGU6IFNPUCArIEVPUCAqLworCisKKy8qCisgKgkJVHJhbnNtaXQgRmxhZ3MKKyAqLworI2RlZmluZSBMRV9UMV9PV04JMHg4MAkJLyogTEFOQ0Ugb3ducyB0aGUgZGVzY3JpcHRvciAqLworI2RlZmluZSBMRV9UMV9FUlIJMHg0MAkJLyogRXJyb3IgKi8KKyNkZWZpbmUgTEVfVDFfUkVTCTB4MjAJCS8qIFJlc2VydmVkLCBMQU5DRSB3cml0ZXMgdGhpcyB3aXRoIGEgemVybyAqLworI2RlZmluZSBMRV9UMV9FTU9SRQkweDEwCQkvKiBNb3JlIHRoYW4gb25lIHJldHJ5IG5lZWRlZCAqLworI2RlZmluZSBMRV9UMV9FT05FCTB4MDgJCS8qIE9uZSByZXRyeSBuZWVkZWQgKi8KKyNkZWZpbmUgTEVfVDFfRURFRgkweDA0CQkvKiBEZWZlcnJlZCAqLworI2RlZmluZSBMRV9UMV9TT1AJMHgwMgkJLyogU3RhcnQgb2YgUGFja2V0ICovCisjZGVmaW5lIExFX1QxX0VPUAkweDAxCQkvKiBFbmQgb2YgUGFja2V0ICovCisjZGVmaW5lIExFX1QxX1BPSwkweDAzCQkvKiBQYWNrZXQgaXMgY29tcGxldGU6IFNPUCArIEVPUCAqLworCisvKgorICoJCUVycm9yIEZsYWdzCisgKi8KKyNkZWZpbmUgTEVfVDNfQlVGIAkweDgwMDAJCS8qIEJ1ZmZlciBFcnJvciAqLworI2RlZmluZSBMRV9UM19VRkwgCTB4NDAwMAkJLyogVW5kZXJmbG93IEVycm9yICovCisjZGVmaW5lIExFX1QzX0xDT0wgCTB4MTAwMAkJLyogTGF0ZSBDb2xsaXNpb24gKi8KKyNkZWZpbmUgTEVfVDNfQ0xPUyAJMHgwODAwCQkvKiBMb3NzIG9mIENhcnJpZXIgKi8KKyNkZWZpbmUgTEVfVDNfUlRZIAkweDA0MDAJCS8qIFJldHJ5IEVycm9yICovCisjZGVmaW5lIExFX1QzX1REUgkweDAzZmYJCS8qIFRpbWUgRG9tYWluIFJlZmxlY3RvbWV0cnkgKi8KKworLyogTWlzY2VsbGFuZW91cyB1c2VmdWwgbWFjcm9zICovCisKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwgKChscC0+dHhfb2xkPD1scC0+dHhfbmV3KT9cCisgICAgICAgICAgICAgICAgICAgICAgICBscC0+dHhfb2xkK2xwLT50eF9yaW5nX21vZF9tYXNrLWxwLT50eF9uZXc6XAorICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnR4X29sZCAtIGxwLT50eF9uZXctMSkKKworLyogVGhlIExBTkNFIG9ubHkgdXNlcyAyNCBiaXQgYWRkcmVzc2VzLiBUaGlzIGRvZXMgdGhlIG9idmlvdXMgdGhpbmcuICovCisjZGVmaW5lIExBTkNFX0FERFIoeCkgKChpbnQpKHgpICYgfjB4ZmYwMDAwMDApCisKKy8qIE5vdyB0aGUgcHJvdG90eXBlcyB3ZSBleHBvcnQgKi8KK2V4dGVybiBpbnQgbGFuY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgbGFuY2VfY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBsYW5jZV9zdGFydF94bWl0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbGFuY2VfZ2V0X3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGxhbmNlX3NldF9tdWx0aWNhc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgbGFuY2VfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorZXh0ZXJuIHZvaWQgbGFuY2VfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCisjZW5kaWYgLyogbmRlZiBfNzk5MF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MTM5Y3AuYyBiL2RyaXZlcnMvbmV0LzgxMzljcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YzZhODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC84MTM5Y3AuYwpAQCAtMCwwICsxLDE5MDQgQEAKKy8qIDgxMzljcC5jOiBBIExpbnV4IFBDSSBFdGhlcm5ldCBkcml2ZXIgZm9yIHRoZSBSZWFsVGVrIDgxMzlDKyBjaGlwcy4gKi8KKy8qCisJQ29weXJpZ2h0IDIwMDEtMjAwNCBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisKKwlDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKSBbdGczLmNdCisJQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkgW3N1bmdlbS5jXQorCUNvcHlyaWdodCAyMDAxIE1hbmZyZWQgU3ByYXVsCQkJCSAgICBbbmF0c2VtaS5jXQorCUNvcHlyaWdodCAxOTk5LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4JCQkgICAgW25hdHNlbWkuY10KKyAgICAgICAJV3JpdHRlbiAxOTk3LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4JCQkgICAgWzgxMzl0b28uY10KKwlDb3B5cmlnaHQgMTk5OC0yMDAxIGJ5IEplcyBTb3JlbnNlbiwgPGplc0B0cmFpbmVkLW1vbmtleS5vcmc+LiBbYWNlbmljLmNdCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisJdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKwlEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisJcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorCWEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisKKwlTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCUNvbnRyaWJ1dG9yczoKKwkKKwkJV2FrZS1vbi1MQU4gc3VwcG9ydCAtIEZlbGlwZSBEYW1hc2lvIDxmZWxpcGV3ZEB0ZXJyYS5jb20uYnI+CisJCVBDSSBzdXNwZW5kL3Jlc3VtZSAgLSBGZWxpcGUgRGFtYXNpbyA8ZmVsaXBld2RAdGVycmEuY29tLmJyPgorCQlMaW5rQ2hnIGludGVycnVwdCAgIC0gRmVsaXBlIERhbWFzaW8gPGZlbGlwZXdkQHRlcnJhLmNvbS5icj4KKwkJCQorCVRPRE86CisJKiBUZXN0IFR4IGNoZWNrc3VtbWluZyB0aG9yb3VnaGx5CisJKiBJbXBsZW1lbnQgZGV2LT50eF90aW1lb3V0CisKKwlMb3cgcHJpb3JpdHkgVE9ETzoKKwkqIENvbXBsZXRlIHJlc2V0IG9uIFBjaUVycgorCSogQ29uc2lkZXIgUnggaW50ZXJydXB0IG1pdGlnYXRpb24gdXNpbmcgVGltZXJJbnRyCisJKiBJbnZlc3RpZ2F0ZSB1c2luZyBza2ItPnByaW9yaXR5IHdpdGggaC93IFZMQU4gcHJpb3JpdHkKKwkqIEludmVzdGlnYXRlIHVzaW5nIEhpZ2ggUHJpb3JpdHkgVHggUXVldWUgd2l0aCBza2ItPnByaW9yaXR5CisJKiBBZGp1c3QgUnggRklGTyB0aHJlc2hvbGQgYW5kIE1heCBSeCBETUEgYnVyc3Qgb24gUnggRklGTyBlcnJvcgorCSogQWRqdXN0IFR4IEZJRk8gdGhyZXNob2xkIGFuZCBNYXggVHggRE1BIGJ1cnN0IG9uIFR4IEZJRk8gZXJyb3IKKwkqIEltcGxlbWVudCBUeCBzb2Z0d2FyZSBpbnRlcnJ1cHQgbWl0aWdhdGlvbiB2aWEKKwkgIFR4IGRlc2NyaXB0b3IgYml0CisJKiBUaGUgcmVhbCBtaW5pbXVtIG9mIENQX01JTl9NVFUgaXMgNCBieXRlcy4gIEhvd2V2ZXIsCisJICBmb3IgdGhpcyB0byBiZSBzdXBwb3J0ZWQsIG9uZSBtdXN0KD8pIHR1cm4gb24gcGFja2V0IHBhZGRpbmcuCisJKiBTdXBwb3J0IGV4dGVybmFsIE1JSSB0cmFuc2NlaXZlcnMgKHBhdGNoIGF2YWlsYWJsZSkKKworCU5PVEVTOgorCSogVFggY2hlY2tzdW1taW5nIGlzIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiAgSXQgaXMgb2ZmIGJ5CisJICBkZWZhdWx0LCB1c2UgZXRodG9vbCB0byB0dXJuIGl0IG9uLgorCisgKi8KKworI2RlZmluZSBEUlZfTkFNRQkJIjgxMzljcCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxLjIiCisjZGVmaW5lIERSVl9SRUxEQVRFCQkiTWFyIDIyLCAyMDA0IgorCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiBWTEFOIHRhZ2dpbmcgZmVhdHVyZSBlbmFibGUvZGlzYWJsZSAqLworI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2RlZmluZSBDUF9WTEFOX1RBR19VU0VEIDEKKyNkZWZpbmUgQ1BfVkxBTl9UWF9UQUcodHhfZGVzYyx2bGFuX3RhZ192YWx1ZSkgXAorCWRvIHsgKHR4X2Rlc2MpLT5vcHRzMiA9ICh2bGFuX3RhZ192YWx1ZSk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBDUF9WTEFOX1RBR19VU0VEIDAKKyNkZWZpbmUgQ1BfVkxBTl9UWF9UQUcodHhfZGVzYyx2bGFuX3RhZ192YWx1ZSkgXAorCWRvIHsgKHR4X2Rlc2MpLT5vcHRzMiA9IDA7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSA9CitLRVJOX0lORk8gRFJWX05BTUUgIjogMTAvMTAwIFBDSSBFdGhlcm5ldCBkcml2ZXIgdiIgRFJWX1ZFUlNJT04gIiAoIiBEUlZfUkVMREFURSAiKVxuIjsKKworTU9EVUxFX0FVVEhPUigiSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWFsVGVrIFJUTC04MTM5Qysgc2VyaWVzIDEwLzEwMCBQQ0kgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsKK01PRFVMRV9QQVJNIChkZWJ1ZywgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MgKGRlYnVnLCAiODEzOWNwOiBiaXRtYXBwZWQgbWVzc2FnZSBlbmFibGUgbnVtYmVyIik7CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gZmlsdGVyICh2cy4gUngtYWxsLW11bHRpY2FzdCkuCisgICBUaGUgUlRMIGNoaXBzIHVzZSBhIDY0IGVsZW1lbnQgaGFzaCB0YWJsZSBiYXNlZCBvbiB0aGUgRXRoZXJuZXQgQ1JDLiAgKi8KK3N0YXRpYyBpbnQgbXVsdGljYXN0X2ZpbHRlcl9saW1pdCA9IDMyOworTU9EVUxFX1BBUk0gKG11bHRpY2FzdF9maWx0ZXJfbGltaXQsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDIChtdWx0aWNhc3RfZmlsdGVyX2xpbWl0LCAiODEzOWNwOiBtYXhpbXVtIG51bWJlciBvZiBmaWx0ZXJlZCBtdWx0aWNhc3QgYWRkcmVzc2VzIik7CisKKyNkZWZpbmUgUEZYCQkJRFJWX05BTUUgIjogIgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBUUlVFICghRkFMU0UpCisjZW5kaWYKKworI2RlZmluZSBDUF9ERUZfTVNHX0VOQUJMRQkoTkVUSUZfTVNHX0RSVgkJfCBcCisJCQkJIE5FVElGX01TR19QUk9CRSAJfCBcCisJCQkJIE5FVElGX01TR19MSU5LKQorI2RlZmluZSBDUF9OVU1fU1RBVFMJCTE0CS8qIHN0cnVjdCBjcF9kbWFfc3RhdHMsIHBsdXMgb25lICovCisjZGVmaW5lIENQX1NUQVRTX1NJWkUJCTY0CS8qIHNpemUgaW4gYnl0ZXMgb2YgRE1BIHN0YXRzIGJsb2NrICovCisjZGVmaW5lIENQX1JFR1NfU0laRQkJKDB4ZmYgKyAxKQorI2RlZmluZSBDUF9SRUdTX1ZFUgkJMQkJLyogdmVyc2lvbiAxICovCisjZGVmaW5lIENQX1JYX1JJTkdfU0laRQkJNjQKKyNkZWZpbmUgQ1BfVFhfUklOR19TSVpFCQk2NAorI2RlZmluZSBDUF9SSU5HX0JZVEVTCQlcCisJCSgoc2l6ZW9mKHN0cnVjdCBjcF9kZXNjKSAqIENQX1JYX1JJTkdfU0laRSkgKwlcCisJCSAoc2l6ZW9mKHN0cnVjdCBjcF9kZXNjKSAqIENQX1RYX1JJTkdfU0laRSkgKwlcCisJCSBDUF9TVEFUU19TSVpFKQorI2RlZmluZSBORVhUX1RYKE4pCQkoKChOKSArIDEpICYgKENQX1RYX1JJTkdfU0laRSAtIDEpKQorI2RlZmluZSBORVhUX1JYKE4pCQkoKChOKSArIDEpICYgKENQX1JYX1JJTkdfU0laRSAtIDEpKQorI2RlZmluZSBUWF9CVUZGU19BVkFJTChDUCkJCQkJCVwKKwkoKChDUCktPnR4X3RhaWwgPD0gKENQKS0+dHhfaGVhZCkgPwkJCVwKKwkgIChDUCktPnR4X3RhaWwgKyAoQ1BfVFhfUklOR19TSVpFIC0gMSkgLSAoQ1ApLT50eF9oZWFkIDoJXAorCSAgKENQKS0+dHhfdGFpbCAtIChDUCktPnR4X2hlYWQgLSAxKQorCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzYJLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIuKi8KKyNkZWZpbmUgUlhfT0ZGU0VUCQkyCisjZGVmaW5lIENQX0lOVEVSTkFMX1BIWQkJMzIKKworLyogVGhlIGZvbGxvd2luZyBzZXR0aW5ncyBhcmUgbG9nXzIoYnl0ZXMpLTQ6ICAwID09IDE2IGJ5dGVzIC4uIDY9PTEwMjQsIDc9PWVuZCBvZiBwYWNrZXQuICovCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNICQk1CS8qIFJ4IGJ1ZmZlciBsZXZlbCBiZWZvcmUgZmlyc3QgUENJIHhmZXIuICAqLworI2RlZmluZSBSWF9ETUFfQlVSU1QJCTQJLyogTWF4aW11bSBQQ0kgYnVyc3QsICc0JyBpcyAyNTYgKi8KKyNkZWZpbmUgVFhfRE1BX0JVUlNUCQk2CS8qIE1heGltdW0gUENJIGJ1cnN0LCAnNicgaXMgMTAyNCAqLworI2RlZmluZSBUWF9FQVJMWV9USFJFU0gJCTI1NgkvKiBFYXJseSBUeCB0aHJlc2hvbGQsIGluIGJ5dGVzICovCisKKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVAkJKDYqSFopCisKKy8qIGhhcmR3YXJlIG1pbmltdW0gYW5kIG1heGltdW0gZm9yIGEgc2luZ2xlIGZyYW1lJ3MgZGF0YSBwYXlsb2FkICovCisjZGVmaW5lIENQX01JTl9NVFUJCTYwCS8qIFRPRE86IGFsbG93IGxvd2VyLCBidXQgcGFkICovCisjZGVmaW5lIENQX01BWF9NVFUJCTQwOTYKKworZW51bSB7CisJLyogTklDIHJlZ2lzdGVyIG9mZnNldHMgKi8KKwlNQUMwCQk9IDB4MDAsCS8qIEV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MuICovCisJTUFSMAkJPSAweDA4LAkvKiBNdWx0aWNhc3QgZmlsdGVyLiAqLworCVN0YXRzQWRkcgk9IDB4MTAsCS8qIDY0LWJpdCBzdGFydCBhZGRyIG9mIDY0LWJ5dGUgRE1BIHN0YXRzIGJsayAqLworCVR4UmluZ0FkZHIJPSAweDIwLCAvKiA2NC1iaXQgc3RhcnQgYWRkciBvZiBUeCByaW5nICovCisJSGlUeFJpbmdBZGRyCT0gMHgyOCwgLyogNjQtYml0IHN0YXJ0IGFkZHIgb2YgaGlnaCBwcmlvcml0eSBUeCByaW5nICovCisJQ21kCQk9IDB4MzcsIC8qIENvbW1hbmQgcmVnaXN0ZXIgKi8KKwlJbnRyTWFzawk9IDB4M0MsIC8qIEludGVycnVwdCBtYXNrICovCisJSW50clN0YXR1cwk9IDB4M0UsIC8qIEludGVycnVwdCBzdGF0dXMgKi8KKwlUeENvbmZpZwk9IDB4NDAsIC8qIFR4IGNvbmZpZ3VyYXRpb24gKi8KKwlDaGlwVmVyc2lvbgk9IDB4NDMsIC8qIDgtYml0IGNoaXAgdmVyc2lvbiwgaW5zaWRlIFR4Q29uZmlnICovCisJUnhDb25maWcJPSAweDQ0LCAvKiBSeCBjb25maWd1cmF0aW9uICovCisJUnhNaXNzZWQJPSAweDRDLAkvKiAyNCBiaXRzIHZhbGlkLCB3cml0ZSBjbGVhcnMgKi8KKwlDZmc5MzQ2CQk9IDB4NTAsIC8qIEVFUFJPTSBzZWxlY3QvY29udHJvbDsgQ2ZnIHJlZyBbdW5dbG9jayAqLworCUNvbmZpZzEJCT0gMHg1MiwgLyogQ29uZmlnMSAqLworCUNvbmZpZzMJCT0gMHg1OSwgLyogQ29uZmlnMyAqLworCUNvbmZpZzQJCT0gMHg1QSwgLyogQ29uZmlnNCAqLworCU11bHRpSW50cgk9IDB4NUMsIC8qIE11bHRpcGxlIGludGVycnVwdCBzZWxlY3QgKi8KKwlCYXNpY01vZGVDdHJsCT0gMHg2MiwJLyogTUlJIEJNQ1IgKi8KKwlCYXNpY01vZGVTdGF0dXMJPSAweDY0LCAvKiBNSUkgQk1TUiAqLworCU5XYXlBZHZlcnQJPSAweDY2LCAvKiBNSUkgQURWRVJUSVNFICovCisJTldheUxQQVIJPSAweDY4LCAvKiBNSUkgTFBBICovCisJTldheUV4cGFuc2lvbgk9IDB4NkEsIC8qIE1JSSBFeHBhbnNpb24gKi8KKwlDb25maWc1CQk9IDB4RDgsCS8qIENvbmZpZzUgKi8KKwlUeFBvbGwJCT0gMHhEOSwJLyogVGVsbCBjaGlwIHRvIGNoZWNrIFR4IGRlc2NyaXB0b3JzIGZvciB3b3JrICovCisJUnhNYXhTaXplCT0gMHhEQSwgLyogTWF4IHNpemUgb2YgYW4gUnggcGFja2V0ICg4MTY5IG9ubHkpICovCisJQ3BDbWQJCT0gMHhFMCwgLyogQysgQ29tbWFuZCByZWdpc3RlciAoQysgbW9kZSBvbmx5KSAqLworCUludHJNaXRpZ2F0ZQk9IDB4RTIsCS8qIHJ4L3R4IGludGVycnVwdCBtaXRpZ2F0aW9uIGNvbnRyb2wgKi8KKwlSeFJpbmdBZGRyCT0gMHhFNCwgLyogNjQtYml0IHN0YXJ0IGFkZHIgb2YgUnggcmluZyAqLworCVR4VGhyZXNoCT0gMHhFQywgLyogRWFybHkgVHggdGhyZXNob2xkICovCisJT2xkUnhCdWZBZGRyCT0gMHgzMCwgLyogRE1BIGFkZHJlc3Mgb2YgUnggcmluZyBidWZmZXIgKEMgbW9kZSkgKi8KKwlPbGRUU0QwCQk9IDB4MTAsIC8qIERNQSBhZGRyZXNzIG9mIGZpcnN0IFR4IGRlc2MgKEMgbW9kZSkgKi8KKworCS8qIFR4IGFuZCBSeCBzdGF0dXMgZGVzY3JpcHRvcnMgKi8KKwlEZXNjT3duCQk9ICgxIDw8IDMxKSwgLyogRGVzY3JpcHRvciBpcyBvd25lZCBieSBOSUMgKi8KKwlSaW5nRW5kCQk9ICgxIDw8IDMwKSwgLyogRW5kIG9mIGRlc2NyaXB0b3IgcmluZyAqLworCUZpcnN0RnJhZwk9ICgxIDw8IDI5KSwgLyogRmlyc3Qgc2VnbWVudCBvZiBhIHBhY2tldCAqLworCUxhc3RGcmFnCT0gKDEgPDwgMjgpLCAvKiBGaW5hbCBzZWdtZW50IG9mIGEgcGFja2V0ICovCisJVHhFcnJvcgkJPSAoMSA8PCAyMyksIC8qIFR4IGVycm9yIHN1bW1hcnkgKi8KKwlSeEVycm9yCQk9ICgxIDw8IDIwKSwgLyogUnggZXJyb3Igc3VtbWFyeSAqLworCUlQQ1MJCT0gKDEgPDwgMTgpLCAvKiBDYWxjdWxhdGUgSVAgY2hlY2tzdW0gKi8KKwlVRFBDUwkJPSAoMSA8PCAxNyksIC8qIENhbGN1bGF0ZSBVRFAvSVAgY2hlY2tzdW0gKi8KKwlUQ1BDUwkJPSAoMSA8PCAxNiksIC8qIENhbGN1bGF0ZSBUQ1AvSVAgY2hlY2tzdW0gKi8KKwlUeFZsYW5UYWcJPSAoMSA8PCAxNyksIC8qIEFkZCBWTEFOIHRhZyAqLworCVJ4VmxhblRhZ2dlZAk9ICgxIDw8IDE2KSwgLyogUnggVkxBTiB0YWcgYXZhaWxhYmxlICovCisJSVBGYWlsCQk9ICgxIDw8IDE1KSwgLyogSVAgY2hlY2tzdW0gZmFpbGVkICovCisJVURQRmFpbAkJPSAoMSA8PCAxNCksIC8qIFVEUC9JUCBjaGVja3N1bSBmYWlsZWQgKi8KKwlUQ1BGYWlsCQk9ICgxIDw8IDEzKSwgLyogVENQL0lQIGNoZWNrc3VtIGZhaWxlZCAqLworCU5vcm1hbFR4UG9sbAk9ICgxIDw8IDYpLCAgLyogT25lIG9yIG1vcmUgbm9ybWFsIFR4IHBhY2tldHMgdG8gc2VuZCAqLworCVBJRDEJCT0gKDEgPDwgMTcpLCAvKiAyIHByb3RvY29sIGlkIGJpdHM6ICAwPT1ub24tSVAsICovCisJUElEMAkJPSAoMSA8PCAxNiksIC8qIDE9PVVEUC9JUCwgMj09VENQL0lQLCAzPT1JUCAqLworCVJ4UHJvdG9UQ1AJPSAxLAorCVJ4UHJvdG9VRFAJPSAyLAorCVJ4UHJvdG9JUAk9IDMsCisJVHhGSUZPVW5kZXIJPSAoMSA8PCAyNSksIC8qIFR4IEZJRk8gdW5kZXJydW4gKi8KKwlUeE9XQwkJPSAoMSA8PCAyMiksIC8qIFR4IE91dC1vZi13aW5kb3cgY29sbGlzaW9uICovCisJVHhMaW5rRmFpbAk9ICgxIDw8IDIxKSwgLyogTGluayBmYWlsZWQgZHVyaW5nIFR4IG9mIHBhY2tldCAqLworCVR4TWF4Q29sCT0gKDEgPDwgMjApLCAvKiBUeCBhYm9ydGVkIGR1ZSB0byBleGNlc3NpdmUgY29sbGlzaW9ucyAqLworCVR4Q29sQ250U2hpZnQJPSAxNiwJICAgICAvKiBTaGlmdCwgdG8gZ2V0IDQtYml0IFR4IGNvbGxpc2lvbiBjbnQgKi8KKwlUeENvbENudE1hc2sJPSAweDAxIHwgMHgwMiB8IDB4MDQgfCAweDA4LCAvKiA0LWJpdCBjb2xsaXNpb24gY291bnQgKi8KKwlSeEVyckZyYW1lCT0gKDEgPDwgMjcpLCAvKiBSeCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IgKi8KKwlSeE1jYXN0CQk9ICgxIDw8IDI2KSwgLyogUnggbXVsdGljYXN0IHBhY2tldCByY3YnZCAqLworCVJ4RXJyQ1JDCT0gKDEgPDwgMTgpLCAvKiBSeCBDUkMgZXJyb3IgKi8KKwlSeEVyclJ1bnQJPSAoMSA8PCAxOSksIC8qIFJ4IGVycm9yLCBwYWNrZXQgPCA2NCBieXRlcyAqLworCVJ4RXJyTG9uZwk9ICgxIDw8IDIxKSwgLyogUnggZXJyb3IsIHBhY2tldCA+IDQwOTYgYnl0ZXMgKi8KKwlSeEVyckZJRk8JPSAoMSA8PCAyMiksIC8qIFJ4IGVycm9yLCBGSUZPIG92ZXJmbG93ZWQsIHBrdCBiYWQgKi8KKworCS8qIFN0YXRzQWRkciByZWdpc3RlciAqLworCUR1bXBTdGF0cwk9ICgxIDw8IDMpLCAgLyogQmVnaW4gc3RhdHMgZHVtcCAqLworCisJLyogUnhDb25maWcgcmVnaXN0ZXIgKi8KKwlSeENmZ0ZJRk9TaGlmdAk9IDEzLAkgICAgIC8qIFNoaWZ0LCB0byBnZXQgUnggRklGTyB0aHJlc2ggdmFsdWUgKi8KKwlSeENmZ0RNQVNoaWZ0CT0gOCwJICAgICAvKiBTaGlmdCwgdG8gZ2V0IFJ4IE1heCBETUEgdmFsdWUgKi8KKwlBY2NlcHRFcnIJPSAweDIwLAkgICAgIC8qIEFjY2VwdCBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycyAqLworCUFjY2VwdFJ1bnQJPSAweDEwLAkgICAgIC8qIEFjY2VwdCBydW50ICg8NjQgYnl0ZXMpIHBhY2tldHMgKi8KKwlBY2NlcHRCcm9hZGNhc3QJPSAweDA4LAkgICAgIC8qIEFjY2VwdCBicm9hZGNhc3QgcGFja2V0cyAqLworCUFjY2VwdE11bHRpY2FzdAk9IDB4MDQsCSAgICAgLyogQWNjZXB0IG11bHRpY2FzdCBwYWNrZXRzICovCisJQWNjZXB0TXlQaHlzCT0gMHgwMiwJICAgICAvKiBBY2NlcHQgcGt0cyB3aXRoIG91ciBNQUMgYXMgZGVzdCAqLworCUFjY2VwdEFsbFBoeXMJPSAweDAxLAkgICAgIC8qIEFjY2VwdCBhbGwgcGt0cyB3LyBwaHlzaWNhbCBkZXN0ICovCisKKwkvKiBJbnRyTWFzayAvIEludHJTdGF0dXMgcmVnaXN0ZXJzICovCisJUGNpRXJyCQk9ICgxIDw8IDE1KSwgLyogU3lzdGVtIGVycm9yIG9uIHRoZSBQQ0kgYnVzICovCisJVGltZXJJbnRyCT0gKDEgPDwgMTQpLCAvKiBBc3NlcnRlZCB3aGVuIFRDVFIgcmVhY2hlcyBUaW1lckludCB2YWx1ZSAqLworCUxlbkNoZwkJPSAoMSA8PCAxMyksIC8qIENhYmxlIGxlbmd0aCBjaGFuZ2UgKi8KKwlTV0ludAkJPSAoMSA8PCA4KSwgIC8qIFNvZnR3YXJlLXJlcXVlc3RlZCBpbnRlcnJ1cHQgKi8KKwlUeEVtcHR5CQk9ICgxIDw8IDcpLCAgLyogTm8gVHggZGVzY3JpcHRvcnMgYXZhaWxhYmxlICovCisJUnhGSUZPT3ZyCT0gKDEgPDwgNiksICAvKiBSeCBGSUZPIE92ZXJmbG93ICovCisJTGlua0NoZwkJPSAoMSA8PCA1KSwgIC8qIFBhY2tldCB1bmRlcnJ1biwgb3IgbGluayBjaGFuZ2UgKi8KKwlSeEVtcHR5CQk9ICgxIDw8IDQpLCAgLyogTm8gUnggZGVzY3JpcHRvcnMgYXZhaWxhYmxlICovCisJVHhFcnIJCT0gKDEgPDwgMyksICAvKiBUeCBlcnJvciAqLworCVR4T0sJCT0gKDEgPDwgMiksICAvKiBUeCBwYWNrZXQgc2VudCAqLworCVJ4RXJyCQk9ICgxIDw8IDEpLCAgLyogUnggZXJyb3IgKi8KKwlSeE9LCQk9ICgxIDw8IDApLCAgLyogUnggcGFja2V0IHJlY2VpdmVkICovCisJSW50clJlc3ZkCT0gKDEgPDwgMTApLCAvKiByZXNlcnZlZCwgYWNjb3JkaW5nIHRvIFJlYWxUZWsgZW5naW5lZXJzLAorCQkJCQlidXQgaGFyZHdhcmUgbGlrZXMgdG8gcmFpc2UgaXQgKi8KKworCUludHJBbGwJCT0gUGNpRXJyIHwgVGltZXJJbnRyIHwgTGVuQ2hnIHwgU1dJbnQgfCBUeEVtcHR5IHwKKwkJCSAgUnhGSUZPT3ZyIHwgTGlua0NoZyB8IFJ4RW1wdHkgfCBUeEVyciB8IFR4T0sgfAorCQkJICBSeEVyciB8IFJ4T0sgfCBJbnRyUmVzdmQsCisKKwkvKiBDIG1vZGUgY29tbWFuZCByZWdpc3RlciAqLworCUNtZFJlc2V0CT0gKDEgPDwgNCksICAvKiBFbmFibGUgdG8gcmVzZXQ7IHNlbGYtY2xlYXJpbmcgKi8KKwlSeE9uCQk9ICgxIDw8IDMpLCAgLyogUnggbW9kZSBlbmFibGUgKi8KKwlUeE9uCQk9ICgxIDw8IDIpLCAgLyogVHggbW9kZSBlbmFibGUgKi8KKworCS8qIEMrIG1vZGUgY29tbWFuZCByZWdpc3RlciAqLworCVJ4Vmxhbk9uCT0gKDEgPDwgNiksICAvKiBSeCBWTEFOIGRlLXRhZ2dpbmcgZW5hYmxlICovCisJUnhDaGtTdW0JPSAoMSA8PCA1KSwgIC8qIFJ4IGNoZWNrc3VtIG9mZmxvYWQgZW5hYmxlICovCisJUENJREFDCQk9ICgxIDw8IDQpLCAgLyogUENJIER1YWwgQWRkcmVzcyBDeWNsZSAoNjQtYml0IFBDSSkgKi8KKwlQQ0lNdWxSVwk9ICgxIDw8IDMpLCAgLyogRW5hYmxlIFBDSSByZWFkL3dyaXRlIG11bHRpcGxlICovCisJQ3BSeE9uCQk9ICgxIDw8IDEpLCAgLyogUnggbW9kZSBlbmFibGUgKi8KKwlDcFR4T24JCT0gKDEgPDwgMCksICAvKiBUeCBtb2RlIGVuYWJsZSAqLworCisJLyogQ2ZnOTQzNiBFRVBST00gY29udHJvbCByZWdpc3RlciAqLworCUNmZzkzNDZfTG9jawk9IDB4MDAsCSAgICAgLyogTG9jayBDb25maWdYL01JSSByZWdpc3RlciBhY2Nlc3MgKi8KKwlDZmc5MzQ2X1VubG9jawk9IDB4QzAsCSAgICAgLyogVW5sb2NrIENvbmZpZ1gvTUlJIHJlZ2lzdGVyIGFjY2VzcyAqLworCisJLyogVHhDb25maWcgcmVnaXN0ZXIgKi8KKwlJRkcJCT0gKDEgPDwgMjUpIHwgKDEgPDwgMjQpLCAvKiBzdGFuZGFyZCBJRUVFIGludGVyZnJhbWUgZ2FwICovCisJVHhETUFTaGlmdAk9IDgsCSAgICAgLyogRE1BIGJ1cnN0IHZhbHVlICgwLTcpIGlzIHNoaWZ0IHRoaXMgbWFueSBiaXRzICovCisKKwkvKiBFYXJseSBUeCBUaHJlc2hvbGQgcmVnaXN0ZXIgKi8KKwlUeFRocmVzaE1hc2sJPSAweDNmLAkgICAgIC8qIE1hc2sgYml0cyA1LTAgKi8KKwlUeFRocmVzaE1heAk9IDIwNDgsCSAgICAgLyogTWF4IGVhcmx5IFR4IHRocmVzaG9sZCAqLworCisJLyogQ29uZmlnMSByZWdpc3RlciAqLworCURyaXZlckxvYWRlZAk9ICgxIDw8IDUpLCAgLyogU29mdHdhcmUgbWFya2VyLCBkcml2ZXIgaXMgbG9hZGVkICovCisJTFdBQ1QgICAgICAgICAgID0gKDEgPDwgNCksICAvKiBMV0FLRSBhY3RpdmUgbW9kZSAqLworCVBNRW5hYmxlCT0gKDEgPDwgMCksICAvKiBFbmFibGUgdmFyaW91cyBQTSBmZWF0dXJlcyBvZiBjaGlwICovCisKKwkvKiBDb25maWczIHJlZ2lzdGVyICovCisJUEFSTUVuYWJsZQk9ICgxIDw8IDYpLCAgLyogRW5hYmxlIGF1dG8tbG9hZGluZyBvZiBQSFkgcGFybXMgKi8KKwlNYWdpY1BhY2tldCAgICAgPSAoMSA8PCA1KSwgIC8qIFdha2UgdXAgd2hlbiByZWNlaXZlcyBhIE1hZ2ljIFBhY2tldCAqLworCUxpbmtVcCAgICAgICAgICA9ICgxIDw8IDQpLCAgLyogV2FrZSB1cCB3aGVuIHRoZSBjYWJsZSBjb25uZWN0aW9uIGlzIHJlLWVzdGFibGlzaGVkICovCisKKwkvKiBDb25maWc0IHJlZ2lzdGVyICovCisJTFdQVE4gICAgICAgICAgID0gKDEgPDwgMSksICAvKiBMV0FLRSBQYXR0ZXJuICovCisJTFdQTUUgICAgICAgICAgID0gKDEgPDwgNCksICAvKiBMQU5XQUtFIHZzIFBNRUIgKi8KKworCS8qIENvbmZpZzUgcmVnaXN0ZXIgKi8KKwlCV0YgICAgICAgICAgICAgPSAoMSA8PCA2KSwgIC8qIEFjY2VwdCBCcm9hZGNhc3Qgd2FrZXVwIGZyYW1lICovCisJTVdGICAgICAgICAgICAgID0gKDEgPDwgNSksICAvKiBBY2NlcHQgTXVsdGljYXN0IHdha2V1cCBmcmFtZSAqLworCVVXRiAgICAgICAgICAgICA9ICgxIDw8IDQpLCAgLyogQWNjZXB0IFVuaWNhc3Qgd2FrZXVwIGZyYW1lICovCisJTEFOV2FrZSAgICAgICAgID0gKDEgPDwgMSksICAvKiBFbmFibGUgTEFOV2FrZSBzaWduYWwgKi8KKwlQTUVTdGF0dXMJPSAoMSA8PCAwKSwgIC8qIFBNRSBzdGF0dXMgY2FuIGJlIHJlc2V0IGJ5IFBDSSBSU1QjICovCisKKwljcF9ub3J4X2ludHJfbWFzayA9IFBjaUVyciB8IExpbmtDaGcgfCBUeE9LIHwgVHhFcnIgfCBUeEVtcHR5LAorCWNwX3J4X2ludHJfbWFzayA9IFJ4T0sgfCBSeEVyciB8IFJ4RW1wdHkgfCBSeEZJRk9PdnIsCisJY3BfaW50cl9tYXNrID0gY3BfcnhfaW50cl9tYXNrIHwgY3Bfbm9yeF9pbnRyX21hc2ssCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNwX3J4X2NvbmZpZyA9CisJICAoUlhfRklGT19USFJFU0ggPDwgUnhDZmdGSUZPU2hpZnQpIHwKKwkgIChSWF9ETUFfQlVSU1QgPDwgUnhDZmdETUFTaGlmdCk7CisKK3N0cnVjdCBjcF9kZXNjIHsKKwl1MzIJCW9wdHMxOworCXUzMgkJb3B0czI7CisJdTY0CQlhZGRyOworfTsKKworc3RydWN0IHJpbmdfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYJCSpza2I7CisJZG1hX2FkZHJfdAkJbWFwcGluZzsKKwl1bnNpZ25lZAkJZnJhZzsKK307CisKK3N0cnVjdCBjcF9kbWFfc3RhdHMgeworCXU2NAkJCXR4X29rOworCXU2NAkJCXJ4X29rOworCXU2NAkJCXR4X2VycjsKKwl1MzIJCQlyeF9lcnI7CisJdTE2CQkJcnhfZmlmbzsKKwl1MTYJCQlmcmFtZV9hbGlnbjsKKwl1MzIJCQl0eF9va18xY29sOworCXUzMgkJCXR4X29rX21jb2w7CisJdTY0CQkJcnhfb2tfcGh5czsKKwl1NjQJCQlyeF9va19iY2FzdDsKKwl1MzIJCQlyeF9va19tY2FzdDsKKwl1MTYJCQl0eF9hYm9ydDsKKwl1MTYJCQl0eF91bmRlcnJ1bjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBjcF9leHRyYV9zdGF0cyB7CisJdW5zaWduZWQgbG9uZwkJcnhfZnJhZ3M7Cit9OworCitzdHJ1Y3QgY3BfcHJpdmF0ZSB7CisJdm9pZAkJCV9faW9tZW0gKnJlZ3M7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKwlzcGlubG9ja190CQlsb2NrOworCXUzMgkJCW1zZ19lbmFibGU7CisKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisJdTMyCQkJcnhfY29uZmlnOworCXUxNgkJCWNwY21kOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbmV0X3N0YXRzOworCXN0cnVjdCBjcF9leHRyYV9zdGF0cwljcF9zdGF0czsKKwlzdHJ1Y3QgY3BfZG1hX3N0YXRzCSpuaWNfc3RhdHM7CisJZG1hX2FkZHJfdAkJbmljX3N0YXRzX2RtYTsKKworCXVuc2lnbmVkCQlyeF90YWlsCQlfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJc3RydWN0IGNwX2Rlc2MJCSpyeF9yaW5nOworCXN0cnVjdCByaW5nX2luZm8Jcnhfc2tiW0NQX1JYX1JJTkdfU0laRV07CisJdW5zaWduZWQJCXJ4X2J1Zl9zejsKKworCXVuc2lnbmVkCQl0eF9oZWFkCQlfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJdW5zaWduZWQJCXR4X3RhaWw7CisKKwlzdHJ1Y3QgY3BfZGVzYwkJKnR4X3Jpbmc7CisJc3RydWN0IHJpbmdfaW5mbwl0eF9za2JbQ1BfVFhfUklOR19TSVpFXTsKKwlkbWFfYWRkcl90CQlyaW5nX2RtYTsKKworI2lmIENQX1ZMQU5fVEFHX1VTRUQKKwlzdHJ1Y3Qgdmxhbl9ncm91cAkqdmxncnA7CisjZW5kaWYKKworCXVuc2lnbmVkIGludAkJd29sX2VuYWJsZWQgOiAxOyAvKiBJcyBXYWtlLW9uLUxBTiBlbmFibGVkPyAqLworCisJc3RydWN0IG1paV9pZl9pbmZvCW1paV9pZjsKK307CisKKyNkZWZpbmUgY3ByOChyZWcpCXJlYWRiKGNwLT5yZWdzICsgKHJlZykpCisjZGVmaW5lIGNwcjE2KHJlZykJcmVhZHcoY3AtPnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgY3ByMzIocmVnKQlyZWFkbChjcC0+cmVncyArIChyZWcpKQorI2RlZmluZSBjcHc4KHJlZyx2YWwpCXdyaXRlYigodmFsKSwgY3AtPnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgY3B3MTYocmVnLHZhbCkJd3JpdGV3KCh2YWwpLCBjcC0+cmVncyArIChyZWcpKQorI2RlZmluZSBjcHczMihyZWcsdmFsKQl3cml0ZWwoKHZhbCksIGNwLT5yZWdzICsgKHJlZykpCisjZGVmaW5lIGNwdzhfZihyZWcsdmFsKSBkbyB7CQkJXAorCXdyaXRlYigodmFsKSwgY3AtPnJlZ3MgKyAocmVnKSk7CVwKKwlyZWFkYihjcC0+cmVncyArIChyZWcpKTsJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBjcHcxNl9mKHJlZyx2YWwpIGRvIHsJCQlcCisJd3JpdGV3KCh2YWwpLCBjcC0+cmVncyArIChyZWcpKTsJXAorCXJlYWR3KGNwLT5yZWdzICsgKHJlZykpOwkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIGNwdzMyX2YocmVnLHZhbCkgZG8gewkJCVwKKwl3cml0ZWwoKHZhbCksIGNwLT5yZWdzICsgKHJlZykpOwlcCisJcmVhZGwoY3AtPnJlZ3MgKyAocmVnKSk7CQlcCisJfSB3aGlsZSAoMCkKKworCitzdGF0aWMgdm9pZCBfX2NwX3NldF9yeF9tb2RlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNwX3R4IChzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3ApOworc3RhdGljIHZvaWQgY3BfY2xlYW5fcmluZ3MgKHN0cnVjdCBjcF9wcml2YXRlICpjcCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjcF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1JFQUxURUssIFBDSV9ERVZJQ0VfSURfUkVBTFRFS184MTM5LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfVFRURUNILCBQQ0lfREVWSUNFX0lEX1RUVEVDSF9NQzMyMiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjcF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciBzdHJbRVRIX0dTVFJJTkdfTEVOXTsKK30gZXRodG9vbF9zdGF0c19rZXlzW10gPSB7CisJeyAidHhfb2siIH0sCisJeyAicnhfb2siIH0sCisJeyAidHhfZXJyIiB9LAorCXsgInJ4X2VyciIgfSwKKwl7ICJyeF9maWZvIiB9LAorCXsgImZyYW1lX2FsaWduIiB9LAorCXsgInR4X29rXzFjb2wiIH0sCisJeyAidHhfb2tfbWNvbCIgfSwKKwl7ICJyeF9va19waHlzIiB9LAorCXsgInJ4X29rX2JjYXN0IiB9LAorCXsgInJ4X29rX21jYXN0IiB9LAorCXsgInR4X2Fib3J0IiB9LAorCXsgInR4X3VuZGVycnVuIiB9LAorCXsgInJ4X2ZyYWdzIiB9LAorfTsKKworCisjaWYgQ1BfVkxBTl9UQUdfVVNFRAorc3RhdGljIHZvaWQgY3Bfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjcC0+bG9jaywgZmxhZ3MpOworCWNwLT52bGdycCA9IGdycDsKKwljcC0+Y3BjbWQgfD0gUnhWbGFuT247CisJY3B3MTYoQ3BDbWQsIGNwLT5jcGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY3Bfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNwLT5sb2NrLCBmbGFncyk7CisJY3AtPmNwY21kICY9IH5SeFZsYW5PbjsKKwljcHcxNihDcENtZCwgY3AtPmNwY21kKTsKKwlpZiAoY3AtPnZsZ3JwKQorCQljcC0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcC0+bG9jaywgZmxhZ3MpOworfQorI2VuZGlmIC8qIENQX1ZMQU5fVEFHX1VTRUQgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGNwX3NldF9yeGJ1ZnNpemUgKHN0cnVjdCBjcF9wcml2YXRlICpjcCkKK3sKKwl1bnNpZ25lZCBpbnQgbXR1ID0gY3AtPmRldi0+bXR1OworCQorCWlmIChtdHUgPiBFVEhfREFUQV9MRU4pCisJCS8qIE1UVSArIGV0aGVybmV0IGhlYWRlciArIEZDUyArIG9wdGlvbmFsIFZMQU4gdGFnICovCisJCWNwLT5yeF9idWZfc3ogPSBtdHUgKyBFVEhfSExFTiArIDg7CisJZWxzZQorCQljcC0+cnhfYnVmX3N6ID0gUEtUX0JVRl9TWjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNwX3J4X3NrYiAoc3RydWN0IGNwX3ByaXZhdGUgKmNwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgc3RydWN0IGNwX2Rlc2MgKmRlc2MpCit7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zIChza2IsIGNwLT5kZXYpOworCisJY3AtPm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7CisJY3AtPm5ldF9zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwljcC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworI2lmIENQX1ZMQU5fVEFHX1VTRUQKKwlpZiAoY3AtPnZsZ3JwICYmIChkZXNjLT5vcHRzMiAmIFJ4VmxhblRhZ2dlZCkpIHsKKwkJdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKHNrYiwgY3AtPnZsZ3JwLAorCQkJCQkgYmUxNl90b19jcHUoZGVzYy0+b3B0czIgJiAweGZmZmYpKTsKKwl9IGVsc2UKKyNlbmRpZgorCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworfQorCitzdGF0aWMgdm9pZCBjcF9yeF9lcnJfYWNjdCAoc3RydWN0IGNwX3ByaXZhdGUgKmNwLCB1bnNpZ25lZCByeF90YWlsLAorCQkJICAgIHUzMiBzdGF0dXMsIHUzMiBsZW4pCit7CisJaWYgKG5ldGlmX21zZ19yeF9lcnIgKGNwKSkKKwkJcHJpbnRrIChLRVJOX0RFQlVHCisJCQkiJXM6IHJ4IGVyciwgc2xvdCAlZCBzdGF0dXMgMHgleCBsZW4gJWRcbiIsCisJCQljcC0+ZGV2LT5uYW1lLCByeF90YWlsLCBzdGF0dXMsIGxlbik7CisJY3AtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgUnhFcnJGcmFtZSkKKwkJY3AtPm5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgUnhFcnJDUkMpCisJCWNwLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycysrOworCWlmICgoc3RhdHVzICYgUnhFcnJSdW50KSB8fCAoc3RhdHVzICYgUnhFcnJMb25nKSkKKwkJY3AtPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJaWYgKChzdGF0dXMgJiAoRmlyc3RGcmFnIHwgTGFzdEZyYWcpKSAhPSAoRmlyc3RGcmFnIHwgTGFzdEZyYWcpKQorCQljcC0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgUnhFcnJGSUZPKQorCQljcC0+bmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwX3J4X2NzdW1fb2sgKHUzMiBzdGF0dXMpCit7CisJdW5zaWduZWQgaW50IHByb3RvY29sID0gKHN0YXR1cyA+PiAxNikgJiAweDM7CisJCisJaWYgKGxpa2VseSgocHJvdG9jb2wgPT0gUnhQcm90b1RDUCkgJiYgKCEoc3RhdHVzICYgVENQRmFpbCkpKSkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoKHByb3RvY29sID09IFJ4UHJvdG9VRFApICYmICghKHN0YXR1cyAmIFVEUEZhaWwpKSkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoKHByb3RvY29sID09IFJ4UHJvdG9JUCkgJiYgKCEoc3RhdHVzICYgSVBGYWlsKSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwX3J4X3BvbGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgcnhfdGFpbCA9IGNwLT5yeF90YWlsOworCXVuc2lnbmVkIHJ4X3dvcmsgPSBkZXYtPnF1b3RhOworCXVuc2lnbmVkIHJ4OworCityeF9zdGF0dXNfbG9vcDoKKwlyeCA9IDA7CisJY3B3MTYoSW50clN0YXR1cywgY3BfcnhfaW50cl9tYXNrKTsKKworCXdoaWxlICgxKSB7CisJCXUzMiBzdGF0dXMsIGxlbjsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbmV3X3NrYjsKKwkJc3RydWN0IGNwX2Rlc2MgKmRlc2M7CisJCXVuc2lnbmVkIGJ1ZmxlbjsKKworCQlza2IgPSBjcC0+cnhfc2tiW3J4X3RhaWxdLnNrYjsKKwkJaWYgKCFza2IpCisJCQlCVUcoKTsKKworCQlkZXNjID0gJmNwLT5yeF9yaW5nW3J4X3RhaWxdOworCQlzdGF0dXMgPSBsZTMyX3RvX2NwdShkZXNjLT5vcHRzMSk7CisJCWlmIChzdGF0dXMgJiBEZXNjT3duKQorCQkJYnJlYWs7CisKKwkJbGVuID0gKHN0YXR1cyAmIDB4MWZmZikgLSA0OworCQltYXBwaW5nID0gY3AtPnJ4X3NrYltyeF90YWlsXS5tYXBwaW5nOworCisJCWlmICgoc3RhdHVzICYgKEZpcnN0RnJhZyB8IExhc3RGcmFnKSkgIT0gKEZpcnN0RnJhZyB8IExhc3RGcmFnKSkgeworCQkJLyogd2UgZG9uJ3Qgc3VwcG9ydCBpbmNvbWluZyBmcmFnbWVudGVkIGZyYW1lcy4KKwkJCSAqIGluc3RlYWQsIHdlIGF0dGVtcHQgdG8gZW5zdXJlIHRoYXQgdGhlCisJCQkgKiBwcmUtYWxsb2NhdGVkIFJYIHNrYnMgYXJlIHByb3Blcmx5IHNpemVkIHN1Y2gKKwkJCSAqIHRoYXQgUlggZnJhZ21lbnRzIGFyZSBuZXZlciBlbmNvdW50ZXJlZAorCQkJICovCisJCQljcF9yeF9lcnJfYWNjdChjcCwgcnhfdGFpbCwgc3RhdHVzLCBsZW4pOworCQkJY3AtPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCQljcC0+Y3Bfc3RhdHMucnhfZnJhZ3MrKzsKKwkJCWdvdG8gcnhfbmV4dDsKKwkJfQorCisJCWlmIChzdGF0dXMgJiAoUnhFcnJvciB8IFJ4RXJyRklGTykpIHsKKwkJCWNwX3J4X2Vycl9hY2N0KGNwLCByeF90YWlsLCBzdGF0dXMsIGxlbik7CisJCQlnb3RvIHJ4X25leHQ7CisJCX0KKworCQlpZiAobmV0aWZfbXNnX3J4X3N0YXR1cyhjcCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJ4IHNsb3QgJWQgc3RhdHVzIDB4JXggbGVuICVkXG4iLAorCQkJICAgICAgIGNwLT5kZXYtPm5hbWUsIHJ4X3RhaWwsIHN0YXR1cywgbGVuKTsKKworCQlidWZsZW4gPSBjcC0+cnhfYnVmX3N6ICsgUlhfT0ZGU0VUOworCQluZXdfc2tiID0gZGV2X2FsbG9jX3NrYiAoYnVmbGVuKTsKKwkJaWYgKCFuZXdfc2tiKSB7CisJCQljcC0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gcnhfbmV4dDsKKwkJfQorCisJCXNrYl9yZXNlcnZlKG5ld19za2IsIFJYX09GRlNFVCk7CisJCW5ld19za2ItPmRldiA9IGNwLT5kZXY7CisKKwkJcGNpX3VubWFwX3NpbmdsZShjcC0+cGRldiwgbWFwcGluZywKKwkJCQkgYnVmbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCS8qIEhhbmRsZSBjaGVja3N1bSBvZmZsb2FkaW5nIGZvciBpbmNvbWluZyBwYWNrZXRzLiAqLworCQlpZiAoY3BfcnhfY3N1bV9vayhzdGF0dXMpKQorCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJZWxzZQorCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJCXNrYl9wdXQoc2tiLCBsZW4pOworCisJCW1hcHBpbmcgPQorCQljcC0+cnhfc2tiW3J4X3RhaWxdLm1hcHBpbmcgPQorCQkJcGNpX21hcF9zaW5nbGUoY3AtPnBkZXYsIG5ld19za2ItPnRhaWwsCisJCQkJICAgICAgIGJ1ZmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJY3AtPnJ4X3NrYltyeF90YWlsXS5za2IgPSBuZXdfc2tiOworCisJCWNwX3J4X3NrYihjcCwgc2tiLCBkZXNjKTsKKwkJcngrKzsKKworcnhfbmV4dDoKKwkJY3AtPnJ4X3JpbmdbcnhfdGFpbF0ub3B0czIgPSAwOworCQljcC0+cnhfcmluZ1tyeF90YWlsXS5hZGRyID0gY3B1X3RvX2xlNjQobWFwcGluZyk7CisJCWlmIChyeF90YWlsID09IChDUF9SWF9SSU5HX1NJWkUgLSAxKSkKKwkJCWRlc2MtPm9wdHMxID0gY3B1X3RvX2xlMzIoRGVzY093biB8IFJpbmdFbmQgfAorCQkJCQkJICBjcC0+cnhfYnVmX3N6KTsKKwkJZWxzZQorCQkJZGVzYy0+b3B0czEgPSBjcHVfdG9fbGUzMihEZXNjT3duIHwgY3AtPnJ4X2J1Zl9zeik7CisJCXJ4X3RhaWwgPSBORVhUX1JYKHJ4X3RhaWwpOworCisJCWlmICghcnhfd29yay0tKQorCQkJYnJlYWs7CisJfQorCisJY3AtPnJ4X3RhaWwgPSByeF90YWlsOworCisJZGV2LT5xdW90YSAtPSByeDsKKwkqYnVkZ2V0IC09IHJ4OworCisJLyogaWYgd2UgZGlkIG5vdCByZWFjaCB3b3JrIGxpbWl0LCB0aGVuIHdlJ3JlIGRvbmUgd2l0aAorCSAqIHRoaXMgcm91bmQgb2YgcG9sbGluZworCSAqLworCWlmIChyeF93b3JrKSB7CisJCWlmIChjcHIxNihJbnRyU3RhdHVzKSAmIGNwX3J4X2ludHJfbWFzaykKKwkJCWdvdG8gcnhfc3RhdHVzX2xvb3A7CisKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJY3B3MTZfZihJbnRyTWFzaywgY3BfaW50cl9tYXNrKTsKKwkJX19uZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkJcmV0dXJuIDA7CS8qIGRvbmUgKi8KKwl9CisKKwlyZXR1cm4gMTsJCS8qIG5vdCBkb25lICovCit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorY3BfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwOworCXUxNiBzdGF0dXM7CisKKwlpZiAodW5saWtlbHkoZGV2ID09IE5VTEwpKQorCQlyZXR1cm4gSVJRX05PTkU7CisJY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RhdHVzID0gY3ByMTYoSW50clN0YXR1cyk7CisJaWYgKCFzdGF0dXMgfHwgKHN0YXR1cyA9PSAweEZGRkYpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlpZiAobmV0aWZfbXNnX2ludHIoY3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludHIsIHN0YXR1cyAlMDR4IGNtZCAlMDJ4IGNwY21kICUwNHhcbiIsCisJCSAgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMsIGNwcjgoQ21kKSwgY3ByMTYoQ3BDbWQpKTsKKworCWNwdzE2KEludHJTdGF0dXMsIHN0YXR1cyAmIH5jcF9yeF9pbnRyX21hc2spOworCisJc3Bpbl9sb2NrKCZjcC0+bG9jayk7CisKKwkvKiBjbG9zZSBwb3NzaWJsZSByYWNlJ3Mgd2l0aCBkZXZfY2xvc2UgKi8KKwlpZiAodW5saWtlbHkoIW5ldGlmX3J1bm5pbmcoZGV2KSkpIHsKKwkJY3B3MTYoSW50ck1hc2ssIDApOworCQlzcGluX3VubG9jaygmY3AtPmxvY2spOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKHN0YXR1cyAmIChSeE9LIHwgUnhFcnIgfCBSeEVtcHR5IHwgUnhGSUZPT3ZyKSkKKwkJaWYgKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgeworCQkJY3B3MTZfZihJbnRyTWFzaywgY3Bfbm9yeF9pbnRyX21hc2spOworCQkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOworCQl9CisKKwlpZiAoc3RhdHVzICYgKFR4T0sgfCBUeEVyciB8IFR4RW1wdHkgfCBTV0ludCkpCisJCWNwX3R4KGNwKTsKKwlpZiAoc3RhdHVzICYgTGlua0NoZykKKwkJbWlpX2NoZWNrX21lZGlhKCZjcC0+bWlpX2lmLCBuZXRpZl9tc2dfbGluayhjcCksIEZBTFNFKTsKKworCXNwaW5fdW5sb2NrKCZjcC0+bG9jayk7CisKKwlpZiAoc3RhdHVzICYgUGNpRXJyKSB7CisJCXUxNiBwY2lfc3RhdHVzOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNwLT5wZGV2LCBQQ0lfU1RBVFVTLCAmcGNpX3N0YXR1cyk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChjcC0+cGRldiwgUENJX1NUQVRVUywgcGNpX3N0YXR1cyk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBidXMgZXJyb3IsIHN0YXR1cz0lMDR4LCBQQ0kgc3RhdHVzPSUwNHhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cywgcGNpX3N0YXR1cyk7CisKKwkJLyogVE9ETzogcmVzZXQgaGFyZHdhcmUgKi8KKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGNwX3R4IChzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3ApCit7CisJdW5zaWduZWQgdHhfaGVhZCA9IGNwLT50eF9oZWFkOworCXVuc2lnbmVkIHR4X3RhaWwgPSBjcC0+dHhfdGFpbDsKKworCXdoaWxlICh0eF90YWlsICE9IHR4X2hlYWQpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdTMyIHN0YXR1czsKKworCQlybWIoKTsKKwkJc3RhdHVzID0gbGUzMl90b19jcHUoY3AtPnR4X3JpbmdbdHhfdGFpbF0ub3B0czEpOworCQlpZiAoc3RhdHVzICYgRGVzY093bikKKwkJCWJyZWFrOworCisJCXNrYiA9IGNwLT50eF9za2JbdHhfdGFpbF0uc2tiOworCQlpZiAoIXNrYikKKwkJCUJVRygpOworCisJCXBjaV91bm1hcF9zaW5nbGUoY3AtPnBkZXYsIGNwLT50eF9za2JbdHhfdGFpbF0ubWFwcGluZywKKwkJCQkJc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCWlmIChzdGF0dXMgJiBMYXN0RnJhZykgeworCQkJaWYgKHN0YXR1cyAmIChUeEVycm9yIHwgVHhGSUZPVW5kZXIpKSB7CisJCQkJaWYgKG5ldGlmX21zZ190eF9lcnIoY3ApKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4IGVyciwgc3RhdHVzIDB4JXhcbiIsCisJCQkJCSAgICAgICBjcC0+ZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJCWNwLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFR4T1dDKQorCQkJCQljcC0+bmV0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgVHhNYXhDb2wpCisJCQkJCWNwLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgVHhMaW5rRmFpbCkKKwkJCQkJY3AtPm5ldF9zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBUeEZJRk9VbmRlcikKKwkJCQkJY3AtPm5ldF9zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJfSBlbHNlIHsKKwkJCQljcC0+bmV0X3N0YXRzLmNvbGxpc2lvbnMgKz0KKwkJCQkJKChzdGF0dXMgPj4gVHhDb2xDbnRTaGlmdCkgJiBUeENvbENudE1hc2spOworCQkJCWNwLT5uZXRfc3RhdHMudHhfcGFja2V0cysrOworCQkJCWNwLT5uZXRfc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJaWYgKG5ldGlmX21zZ190eF9kb25lKGNwKSkKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eCBkb25lLCBzbG90ICVkXG4iLCBjcC0+ZGV2LT5uYW1lLCB0eF90YWlsKTsKKwkJCX0KKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCX0KKworCQljcC0+dHhfc2tiW3R4X3RhaWxdLnNrYiA9IE5VTEw7CisKKwkJdHhfdGFpbCA9IE5FWFRfVFgodHhfdGFpbCk7CisJfQorCisJY3AtPnR4X3RhaWwgPSB0eF90YWlsOworCisJaWYgKFRYX0JVRkZTX0FWQUlMKGNwKSA+IChNQVhfU0tCX0ZSQUdTICsgMSkpCisJCW5ldGlmX3dha2VfcXVldWUoY3AtPmRldik7Cit9CisKK3N0YXRpYyBpbnQgY3Bfc3RhcnRfeG1pdCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGVudHJ5OworCXUzMiBlb3I7CisjaWYgQ1BfVkxBTl9UQUdfVVNFRAorCXUzMiB2bGFuX3RhZyA9IDA7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnEoJmNwLT5sb2NrKTsKKworCS8qIFRoaXMgaXMgYSBoYXJkIGVycm9yLCBsb2cgaXQuICovCisJaWYgKFRYX0JVRkZTX0FWQUlMKGNwKSA8PSAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDEpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjcC0+bG9jayk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBCVUchIFR4IFJpbmcgZnVsbCB3aGVuIHF1ZXVlIGF3YWtlIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworI2lmIENQX1ZMQU5fVEFHX1VTRUQKKwlpZiAoY3AtPnZsZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkKKwkJdmxhbl90YWcgPSBUeFZsYW5UYWcgfCBjcHVfdG9fYmUxNih2bGFuX3R4X3RhZ19nZXQoc2tiKSk7CisjZW5kaWYKKworCWVudHJ5ID0gY3AtPnR4X2hlYWQ7CisJZW9yID0gKGVudHJ5ID09IChDUF9UWF9SSU5HX1NJWkUgLSAxKSkgPyBSaW5nRW5kIDogMDsKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9PSAwKSB7CisJCXN0cnVjdCBjcF9kZXNjICp0eGQgPSAmY3AtPnR4X3JpbmdbZW50cnldOworCQl1MzIgbGVuOworCQlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwkJbGVuID0gc2tiLT5sZW47CisJCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShjcC0+cGRldiwgc2tiLT5kYXRhLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlDUF9WTEFOX1RYX1RBRyh0eGQsIHZsYW5fdGFnKTsKKwkJdHhkLT5hZGRyID0gY3B1X3RvX2xlNjQobWFwcGluZyk7CisJCXdtYigpOworCisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQkJY29uc3Qgc3RydWN0IGlwaGRyICppcCA9IHNrYi0+bmguaXBoOworCQkJaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKwkJCQl0eGQtPm9wdHMxID0gY3B1X3RvX2xlMzIoZW9yIHwgbGVuIHwgRGVzY093biB8CisJCQkJCQkJIEZpcnN0RnJhZyB8IExhc3RGcmFnIHwKKwkJCQkJCQkgSVBDUyB8IFRDUENTKTsKKwkJCWVsc2UgaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKKwkJCQl0eGQtPm9wdHMxID0gY3B1X3RvX2xlMzIoZW9yIHwgbGVuIHwgRGVzY093biB8CisJCQkJCQkJIEZpcnN0RnJhZyB8IExhc3RGcmFnIHwKKwkJCQkJCQkgSVBDUyB8IFVEUENTKTsKKwkJCWVsc2UKKwkJCQlCVUcoKTsKKwkJfSBlbHNlCisJCQl0eGQtPm9wdHMxID0gY3B1X3RvX2xlMzIoZW9yIHwgbGVuIHwgRGVzY093biB8CisJCQkJCQkgRmlyc3RGcmFnIHwgTGFzdEZyYWcpOworCQl3bWIoKTsKKworCQljcC0+dHhfc2tiW2VudHJ5XS5za2IgPSBza2I7CisJCWNwLT50eF9za2JbZW50cnldLm1hcHBpbmcgPSBtYXBwaW5nOworCQljcC0+dHhfc2tiW2VudHJ5XS5mcmFnID0gMDsKKwkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgY3BfZGVzYyAqdHhkOworCQl1MzIgZmlyc3RfbGVuLCBmaXJzdF9lb3I7CisJCWRtYV9hZGRyX3QgZmlyc3RfbWFwcGluZzsKKwkJaW50IGZyYWcsIGZpcnN0X2VudHJ5ID0gZW50cnk7CisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXAgPSBza2ItPm5oLmlwaDsKKworCQkvKiBXZSBtdXN0IGdpdmUgdGhpcyBpbml0aWFsIGNodW5rIHRvIHRoZSBkZXZpY2UgbGFzdC4KKwkJICogT3RoZXJ3aXNlIHdlIGNvdWxkIHJhY2Ugd2l0aCB0aGUgZGV2aWNlLgorCQkgKi8KKwkJZmlyc3RfZW9yID0gZW9yOworCQlmaXJzdF9sZW4gPSBza2JfaGVhZGxlbihza2IpOworCQlmaXJzdF9tYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoY3AtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJICAgICAgIGZpcnN0X2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCWNwLT50eF9za2JbZW50cnldLnNrYiA9IHNrYjsKKwkJY3AtPnR4X3NrYltlbnRyeV0ubWFwcGluZyA9IGZpcnN0X21hcHBpbmc7CisJCWNwLT50eF9za2JbZW50cnldLmZyYWcgPSAxOworCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCisJCWZvciAoZnJhZyA9IDA7IGZyYWcgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmcmFnKyspIHsKKwkJCXNrYl9mcmFnX3QgKnRoaXNfZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZyYWddOworCQkJdTMyIGxlbjsKKwkJCXUzMiBjdHJsOworCQkJZG1hX2FkZHJfdCBtYXBwaW5nOworCisJCQlsZW4gPSB0aGlzX2ZyYWctPnNpemU7CisJCQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoY3AtPnBkZXYsCisJCQkJCQkgKCh2b2lkICopIHBhZ2VfYWRkcmVzcyh0aGlzX2ZyYWctPnBhZ2UpICsKKwkJCQkJCSAgdGhpc19mcmFnLT5wYWdlX29mZnNldCksCisJCQkJCQkgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWVvciA9IChlbnRyeSA9PSAoQ1BfVFhfUklOR19TSVpFIC0gMSkpID8gUmluZ0VuZCA6IDA7CisKKwkJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQkJCWN0cmwgPSBlb3IgfCBsZW4gfCBEZXNjT3duIHwgSVBDUzsKKwkJCQlpZiAoaXAtPnByb3RvY29sID09IElQUFJPVE9fVENQKQorCQkJCQljdHJsIHw9IFRDUENTOworCQkJCWVsc2UgaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKKwkJCQkJY3RybCB8PSBVRFBDUzsKKwkJCQllbHNlCisJCQkJCUJVRygpOworCQkJfSBlbHNlCisJCQkJY3RybCA9IGVvciB8IGxlbiB8IERlc2NPd247CisKKwkJCWlmIChmcmFnID09IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgLSAxKQorCQkJCWN0cmwgfD0gTGFzdEZyYWc7CisKKwkJCXR4ZCA9ICZjcC0+dHhfcmluZ1tlbnRyeV07CisJCQlDUF9WTEFOX1RYX1RBRyh0eGQsIHZsYW5fdGFnKTsKKwkJCXR4ZC0+YWRkciA9IGNwdV90b19sZTY0KG1hcHBpbmcpOworCQkJd21iKCk7CisKKwkJCXR4ZC0+b3B0czEgPSBjcHVfdG9fbGUzMihjdHJsKTsKKwkJCXdtYigpOworCisJCQljcC0+dHhfc2tiW2VudHJ5XS5za2IgPSBza2I7CisJCQljcC0+dHhfc2tiW2VudHJ5XS5tYXBwaW5nID0gbWFwcGluZzsKKwkJCWNwLT50eF9za2JbZW50cnldLmZyYWcgPSBmcmFnICsgMjsKKwkJCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CisJCX0KKworCQl0eGQgPSAmY3AtPnR4X3JpbmdbZmlyc3RfZW50cnldOworCQlDUF9WTEFOX1RYX1RBRyh0eGQsIHZsYW5fdGFnKTsKKwkJdHhkLT5hZGRyID0gY3B1X3RvX2xlNjQoZmlyc3RfbWFwcGluZyk7CisJCXdtYigpOworCisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQkJaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKwkJCQl0eGQtPm9wdHMxID0gY3B1X3RvX2xlMzIoZmlyc3RfZW9yIHwgZmlyc3RfbGVuIHwKKwkJCQkJCQkgRmlyc3RGcmFnIHwgRGVzY093biB8CisJCQkJCQkJIElQQ1MgfCBUQ1BDUyk7CisJCQllbHNlIGlmIChpcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCisJCQkJdHhkLT5vcHRzMSA9IGNwdV90b19sZTMyKGZpcnN0X2VvciB8IGZpcnN0X2xlbiB8CisJCQkJCQkJIEZpcnN0RnJhZyB8IERlc2NPd24gfAorCQkJCQkJCSBJUENTIHwgVURQQ1MpOworCQkJZWxzZQorCQkJCUJVRygpOworCQl9IGVsc2UKKwkJCXR4ZC0+b3B0czEgPSBjcHVfdG9fbGUzMihmaXJzdF9lb3IgfCBmaXJzdF9sZW4gfAorCQkJCQkJIEZpcnN0RnJhZyB8IERlc2NPd24pOworCQl3bWIoKTsKKwl9CisJY3AtPnR4X2hlYWQgPSBlbnRyeTsKKwlpZiAobmV0aWZfbXNnX3R4X3F1ZXVlZChjcCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHggcXVldWVkLCBzbG90ICVkLCBza2JsZW4gJWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVudHJ5LCBza2ItPmxlbik7CisJaWYgKFRYX0JVRkZTX0FWQUlMKGNwKSA8PSAoTUFYX1NLQl9GUkFHUyArIDEpKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnEoJmNwLT5sb2NrKTsKKworCWNwdzgoVHhQb2xsLCBOb3JtYWxUeFBvbGwpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICAgVGhpcyByb3V0aW5lIGlzIG5vdCBzdGF0ZSBzZW5zaXRpdmUgYW5kIG5lZWQgbm90IGJlIFNNUCBsb2NrZWQuICovCisKK3N0YXRpYyB2b2lkIF9fY3Bfc2V0X3J4X21vZGUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgbWNfZmlsdGVyWzJdOwkvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKwlpbnQgaSwgcnhfbW9kZTsKKwl1MzIgdG1wOworCisJLyogTm90ZTogZG8gbm90IHJlb3JkZXIsIEdDQyBpcyBjbGV2ZXIgYWJvdXQgY29tbW9uIHN0YXRlbWVudHMuICovCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkvKiBVbmNvbmRpdGlvbmFsbHkgbG9nIG5ldCB0YXBzLiAqLworCQlwcmludGsgKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwKKwkJCWRldi0+bmFtZSk7CisJCXJ4X21vZGUgPQorCQkgICAgQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzIHwKKwkJICAgIEFjY2VwdEFsbFBoeXM7CisJCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IDB4ZmZmZmZmZmY7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpCisJCSAgIHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBmaWx0ZXIgcGVyZmVjdGx5IC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMHhmZmZmZmZmZjsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMDsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWludCBiaXRfbnIgPSBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDI2OworCisJCQltY19maWx0ZXJbYml0X25yID4+IDVdIHw9IDEgPDwgKGJpdF9uciAmIDMxKTsKKwkJCXJ4X21vZGUgfD0gQWNjZXB0TXVsdGljYXN0OworCQl9CisJfQorCisJLyogV2UgY2FuIHNhZmVseSB1cGRhdGUgd2l0aG91dCBzdG9wcGluZyB0aGUgY2hpcC4gKi8KKwl0bXAgPSBjcF9yeF9jb25maWcgfCByeF9tb2RlOworCWlmIChjcC0+cnhfY29uZmlnICE9IHRtcCkgeworCQljcHczMl9mIChSeENvbmZpZywgdG1wKTsKKwkJY3AtPnJ4X2NvbmZpZyA9IHRtcDsKKwl9CisJY3B3MzJfZiAoTUFSMCArIDAsIG1jX2ZpbHRlclswXSk7CisJY3B3MzJfZiAoTUFSMCArIDQsIG1jX2ZpbHRlclsxXSk7Cit9CisKK3N0YXRpYyB2b2lkIGNwX3NldF9yeF9tb2RlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmY3AtPmxvY2ssIGZsYWdzKTsKKwlfX2NwX3NldF9yeF9tb2RlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fY3BfZ2V0X3N0YXRzKHN0cnVjdCBjcF9wcml2YXRlICpjcCkKK3sKKwkvKiBvbmx5IGxvd2VyIDI0IGJpdHMgdmFsaWQ7IHdyaXRlIGFueSB2YWx1ZSB0byBjbGVhciAqLworCWNwLT5uZXRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSAoY3ByMzIgKFJ4TWlzc2VkKSAmIDB4ZmZmZmZmKTsKKwljcHczMiAoUnhNaXNzZWQsIDApOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmNwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFRoZSBjaGlwIG9ubHkgbmVlZCByZXBvcnQgZnJhbWUgc2lsZW50bHkgZHJvcHBlZC4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3AtPmxvY2ssIGZsYWdzKTsKKyAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiBuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorIAkJX19jcF9nZXRfc3RhdHMoY3ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gJmNwLT5uZXRfc3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIGNwX3N0b3BfaHcgKHN0cnVjdCBjcF9wcml2YXRlICpjcCkKK3sKKwljcHcxNihJbnRyU3RhdHVzLCB+KGNwcjE2KEludHJTdGF0dXMpKSk7CisJY3B3MTZfZihJbnRyTWFzaywgMCk7CisJY3B3OChDbWQsIDApOworCWNwdzE2X2YoQ3BDbWQsIDApOworCWNwdzE2X2YoSW50clN0YXR1cywgfihjcHIxNihJbnRyU3RhdHVzKSkpOworCisJY3AtPnJ4X3RhaWwgPSAwOworCWNwLT50eF9oZWFkID0gY3AtPnR4X3RhaWwgPSAwOworfQorCitzdGF0aWMgdm9pZCBjcF9yZXNldF9odyAoc3RydWN0IGNwX3ByaXZhdGUgKmNwKQoreworCXVuc2lnbmVkIHdvcmsgPSAxMDAwOworCisJY3B3OChDbWQsIENtZFJlc2V0KTsKKworCXdoaWxlICh3b3JrLS0pIHsKKwkJaWYgKCEoY3ByOChDbWQpICYgQ21kUmVzZXQpKQorCQkJcmV0dXJuOworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxMCk7CisJfQorCisJcHJpbnRrKEtFUk5fRVJSICIlczogaGFyZHdhcmUgcmVzZXQgdGltZW91dFxuIiwgY3AtPmRldi0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcF9zdGFydF9odyAoc3RydWN0IGNwX3ByaXZhdGUgKmNwKQoreworCWNwdzE2KENwQ21kLCBjcC0+Y3BjbWQpOworCWNwdzgoQ21kLCBSeE9uIHwgVHhPbik7Cit9CisKK3N0YXRpYyB2b2lkIGNwX2luaXRfaHcgKHN0cnVjdCBjcF9wcml2YXRlICpjcCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY3AtPmRldjsKKwlkbWFfYWRkcl90IHJpbmdfZG1hOworCisJY3BfcmVzZXRfaHcoY3ApOworCisJY3B3OF9mIChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisKKwkvKiBSZXN0b3JlIG91ciBpZGVhIG9mIHRoZSBNQUMgYWRkcmVzcy4gKi8KKwljcHczMl9mIChNQUMwICsgMCwgY3B1X3RvX2xlMzIgKCoodTMyICopIChkZXYtPmRldl9hZGRyICsgMCkpKTsKKwljcHczMl9mIChNQUMwICsgNCwgY3B1X3RvX2xlMzIgKCoodTMyICopIChkZXYtPmRldl9hZGRyICsgNCkpKTsKKworCWNwX3N0YXJ0X2h3KGNwKTsKKwljcHc4KFR4VGhyZXNoLCAweDA2KTsgLyogWFhYIGNvbnZlcnQgbWFnaWMgbnVtIHRvIGEgY29uc3RhbnQgKi8KKworCV9fY3Bfc2V0X3J4X21vZGUoZGV2KTsKKwljcHczMl9mIChUeENvbmZpZywgSUZHIHwgKFRYX0RNQV9CVVJTVCA8PCBUeERNQVNoaWZ0KSk7CisKKwljcHc4KENvbmZpZzEsIGNwcjgoQ29uZmlnMSkgfCBEcml2ZXJMb2FkZWQgfCBQTUVuYWJsZSk7CisJLyogRGlzYWJsZSBXYWtlLW9uLUxBTi4gQ2FuIGJlIHR1cm5lZCBvbiB3aXRoIEVUSFRPT0xfU1dPTCAqLworCWNwdzgoQ29uZmlnMywgUEFSTUVuYWJsZSk7CisJY3AtPndvbF9lbmFibGVkID0gMDsKKworCWNwdzgoQ29uZmlnNSwgY3ByOChDb25maWc1KSAmIFBNRVN0YXR1cyk7IAorCisJY3B3MzJfZihIaVR4UmluZ0FkZHIsIDApOworCWNwdzMyX2YoSGlUeFJpbmdBZGRyICsgNCwgMCk7CisKKwlyaW5nX2RtYSA9IGNwLT5yaW5nX2RtYTsKKwljcHczMl9mKFJ4UmluZ0FkZHIsIHJpbmdfZG1hICYgMHhmZmZmZmZmZik7CisJY3B3MzJfZihSeFJpbmdBZGRyICsgNCwgKHJpbmdfZG1hID4+IDE2KSA+PiAxNik7CisKKwlyaW5nX2RtYSArPSBzaXplb2Yoc3RydWN0IGNwX2Rlc2MpICogQ1BfUlhfUklOR19TSVpFOworCWNwdzMyX2YoVHhSaW5nQWRkciwgcmluZ19kbWEgJiAweGZmZmZmZmZmKTsKKwljcHczMl9mKFR4UmluZ0FkZHIgKyA0LCAocmluZ19kbWEgPj4gMTYpID4+IDE2KTsKKworCWNwdzE2KE11bHRpSW50ciwgMCk7CisKKwljcHcxNl9mKEludHJNYXNrLCBjcF9pbnRyX21hc2spOworCisJY3B3OF9mKENmZzkzNDYsIENmZzkzNDZfTG9jayk7Cit9CisKK3N0YXRpYyBpbnQgY3BfcmVmaWxsX3J4IChzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3ApCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDUF9SWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXNrYiA9IGRldl9hbGxvY19za2IoY3AtPnJ4X2J1Zl9zeiArIFJYX09GRlNFVCk7CisJCWlmICghc2tiKQorCQkJZ290byBlcnJfb3V0OworCisJCXNrYi0+ZGV2ID0gY3AtPmRldjsKKwkJc2tiX3Jlc2VydmUoc2tiLCBSWF9PRkZTRVQpOworCisJCWNwLT5yeF9za2JbaV0ubWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKGNwLT5wZGV2LAorCQkJc2tiLT50YWlsLCBjcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQljcC0+cnhfc2tiW2ldLnNrYiA9IHNrYjsKKwkJY3AtPnJ4X3NrYltpXS5mcmFnID0gMDsKKworCQljcC0+cnhfcmluZ1tpXS5vcHRzMiA9IDA7CisJCWNwLT5yeF9yaW5nW2ldLmFkZHIgPSBjcHVfdG9fbGU2NChjcC0+cnhfc2tiW2ldLm1hcHBpbmcpOworCQlpZiAoaSA9PSAoQ1BfUlhfUklOR19TSVpFIC0gMSkpCisJCQljcC0+cnhfcmluZ1tpXS5vcHRzMSA9CisJCQkJY3B1X3RvX2xlMzIoRGVzY093biB8IFJpbmdFbmQgfCBjcC0+cnhfYnVmX3N6KTsKKwkJZWxzZQorCQkJY3AtPnJ4X3JpbmdbaV0ub3B0czEgPQorCQkJCWNwdV90b19sZTMyKERlc2NPd24gfCBjcC0+cnhfYnVmX3N6KTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwljcF9jbGVhbl9yaW5ncyhjcCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgY3BfaW5pdF9yaW5ncyAoc3RydWN0IGNwX3ByaXZhdGUgKmNwKQoreworCW1lbXNldChjcC0+dHhfcmluZywgMCwgc2l6ZW9mKHN0cnVjdCBjcF9kZXNjKSAqIENQX1RYX1JJTkdfU0laRSk7CisJY3AtPnR4X3JpbmdbQ1BfVFhfUklOR19TSVpFIC0gMV0ub3B0czEgPSBjcHVfdG9fbGUzMihSaW5nRW5kKTsKKworCWNwLT5yeF90YWlsID0gMDsKKwljcC0+dHhfaGVhZCA9IGNwLT50eF90YWlsID0gMDsKKworCXJldHVybiBjcF9yZWZpbGxfcnggKGNwKTsKK30KKworc3RhdGljIGludCBjcF9hbGxvY19yaW5ncyAoc3RydWN0IGNwX3ByaXZhdGUgKmNwKQoreworCXZvaWQgKm1lbTsKKworCW1lbSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGNwLT5wZGV2LCBDUF9SSU5HX0JZVEVTLCAmY3AtPnJpbmdfZG1hKTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljcC0+cnhfcmluZyA9IG1lbTsKKwljcC0+dHhfcmluZyA9ICZjcC0+cnhfcmluZ1tDUF9SWF9SSU5HX1NJWkVdOworCisJbWVtICs9IChDUF9SSU5HX0JZVEVTIC0gQ1BfU1RBVFNfU0laRSk7CisJY3AtPm5pY19zdGF0cyA9IG1lbTsKKwljcC0+bmljX3N0YXRzX2RtYSA9IGNwLT5yaW5nX2RtYSArIChDUF9SSU5HX0JZVEVTIC0gQ1BfU1RBVFNfU0laRSk7CisKKwlyZXR1cm4gY3BfaW5pdF9yaW5ncyhjcCk7Cit9CisKK3N0YXRpYyB2b2lkIGNwX2NsZWFuX3JpbmdzIChzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3ApCit7CisJdW5zaWduZWQgaTsKKworCW1lbXNldChjcC0+cnhfcmluZywgMCwgc2l6ZW9mKHN0cnVjdCBjcF9kZXNjKSAqIENQX1JYX1JJTkdfU0laRSk7CisJbWVtc2V0KGNwLT50eF9yaW5nLCAwLCBzaXplb2Yoc3RydWN0IGNwX2Rlc2MpICogQ1BfVFhfUklOR19TSVpFKTsKKworCWZvciAoaSA9IDA7IGkgPCBDUF9SWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoY3AtPnJ4X3NrYltpXS5za2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoY3AtPnBkZXYsIGNwLT5yeF9za2JbaV0ubWFwcGluZywKKwkJCQkJIGNwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKGNwLT5yeF9za2JbaV0uc2tiKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBDUF9UWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoY3AtPnR4X3NrYltpXS5za2IpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBjcC0+dHhfc2tiW2ldLnNrYjsKKwkJCXBjaV91bm1hcF9zaW5nbGUoY3AtPnBkZXYsIGNwLT50eF9za2JbaV0ubWFwcGluZywKKwkJCQkJIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWNwLT5uZXRfc3RhdHMudHhfZHJvcHBlZCsrOworCQl9CisJfQorCisJbWVtc2V0KCZjcC0+cnhfc2tiLCAwLCBzaXplb2Yoc3RydWN0IHJpbmdfaW5mbykgKiBDUF9SWF9SSU5HX1NJWkUpOworCW1lbXNldCgmY3AtPnR4X3NrYiwgMCwgc2l6ZW9mKHN0cnVjdCByaW5nX2luZm8pICogQ1BfVFhfUklOR19TSVpFKTsKK30KKworc3RhdGljIHZvaWQgY3BfZnJlZV9yaW5ncyAoc3RydWN0IGNwX3ByaXZhdGUgKmNwKQoreworCWNwX2NsZWFuX3JpbmdzKGNwKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGNwLT5wZGV2LCBDUF9SSU5HX0JZVEVTLCBjcC0+cnhfcmluZywgY3AtPnJpbmdfZG1hKTsKKwljcC0+cnhfcmluZyA9IE5VTEw7CisJY3AtPnR4X3JpbmcgPSBOVUxMOworCWNwLT5uaWNfc3RhdHMgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGNwX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmM7CisKKwlpZiAobmV0aWZfbXNnX2lmdXAoY3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVuYWJsaW5nIGludGVyZmFjZVxuIiwgZGV2LT5uYW1lKTsKKworCXJjID0gY3BfYWxsb2NfcmluZ3MoY3ApOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJY3BfaW5pdF9odyhjcCk7CisKKwlyYyA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBjcF9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfaHc7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCW1paV9jaGVja19tZWRpYSgmY3AtPm1paV9pZiwgbmV0aWZfbXNnX2xpbmsoY3ApLCBUUlVFKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaHc6CisJY3Bfc3RvcF9odyhjcCk7CisJY3BfZnJlZV9yaW5ncyhjcCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNwX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChuZXRpZl9tc2dfaWZkb3duKGNwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkaXNhYmxpbmcgaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNwLT5sb2NrLCBmbGFncyk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCWNwX3N0b3BfaHcoY3ApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKKworCXN5bmNocm9uaXplX2lycShkZXYtPmlycSk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwljcF9mcmVlX3JpbmdzKGNwKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEJST0tFTgorc3RhdGljIGludCBjcF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBjaGVjayBmb3IgaW52YWxpZCBNVFUsIGFjY29yZGluZyB0byBoYXJkd2FyZSBsaW1pdHMgKi8KKwlpZiAobmV3X210dSA8IENQX01JTl9NVFUgfHwgbmV3X210dSA+IENQX01BWF9NVFUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogaWYgbmV0d29yayBpbnRlcmZhY2Ugbm90IHVwLCBubyBuZWVkIGZvciBjb21wbGV4aXR5ICovCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJZGV2LT5tdHUgPSBuZXdfbXR1OworCQljcF9zZXRfcnhidWZzaXplKGNwKTsJLyogc2V0IG5ldyByeCBidWYgc2l6ZSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3AtPmxvY2ssIGZsYWdzKTsKKworCWNwX3N0b3BfaHcoY3ApOwkJCS8qIHN0b3AgaC93IGFuZCBmcmVlIHJpbmdzICovCisJY3BfY2xlYW5fcmluZ3MoY3ApOworCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCWNwX3NldF9yeGJ1ZnNpemUoY3ApOwkJLyogc2V0IG5ldyByeCBidWYgc2l6ZSAqLworCisJcmMgPSBjcF9pbml0X3JpbmdzKGNwKTsJCS8qIHJlYWxsb2MgYW5kIHJlc3RhcnQgaC93ICovCisJY3Bfc3RhcnRfaHcoY3ApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKyNlbmRpZiAvKiBCUk9LRU4gKi8KKworc3RhdGljIGNoYXIgbWlpXzJfODEzOV9tYXBbOF0gPSB7CisJQmFzaWNNb2RlQ3RybCwKKwlCYXNpY01vZGVTdGF0dXMsCisJMCwKKwkwLAorCU5XYXlBZHZlcnQsCisJTldheUxQQVIsCisJTldheUV4cGFuc2lvbiwKKwkwCit9OworCitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiBsb2NhdGlvbiA8IDggJiYgbWlpXzJfODEzOV9tYXBbbG9jYXRpb25dID8KKwkgICAgICAgcmVhZHcoY3AtPnJlZ3MgKyBtaWlfMl84MTM5X21hcFtsb2NhdGlvbl0pIDogMDsKK30KKworCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwKKwkJICAgICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGxvY2F0aW9uID09IDApIHsKKwkJY3B3OChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJCWNwdzE2KEJhc2ljTW9kZUN0cmwsIHZhbHVlKTsKKwkJY3B3OChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCX0gZWxzZSBpZiAobG9jYXRpb24gPCA4ICYmIG1paV8yXzgxMzlfbWFwW2xvY2F0aW9uXSkKKwkJY3B3MTYobWlpXzJfODEzOV9tYXBbbG9jYXRpb25dLCB2YWx1ZSk7Cit9CisKKy8qIFNldCB0aGUgZXRodG9vbCBXYWtlLW9uLUxBTiBzZXR0aW5ncyAqLworc3RhdGljIGludCBuZXRkZXZfc2V0X3dvbCAoc3RydWN0IGNwX3ByaXZhdGUgKmNwLAorCQkJICAgY29uc3Qgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXU4IG9wdGlvbnM7CisKKwlvcHRpb25zID0gY3ByOCAoQ29uZmlnMykgJiB+KExpbmtVcCB8IE1hZ2ljUGFja2V0KTsKKwkvKiBJZiBXT0wgaXMgYmVpbmcgZGlzYWJsZWQsIG5vIG5lZWQgZm9yIGNvbXBsZXhpdHkgKi8KKwlpZiAod29sLT53b2xvcHRzKSB7CisJCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX1BIWSkJb3B0aW9ucyB8PSBMaW5rVXA7CisJCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01BR0lDKQlvcHRpb25zIHw9IE1hZ2ljUGFja2V0OworCX0KKworCWNwdzggKENmZzkzNDYsIENmZzkzNDZfVW5sb2NrKTsKKwljcHc4IChDb25maWczLCBvcHRpb25zKTsKKwljcHc4IChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCisJb3B0aW9ucyA9IDA7IC8qIFBhcmFub2lhIHNldHRpbmcgKi8KKwlvcHRpb25zID0gY3ByOCAoQ29uZmlnNSkgJiB+KFVXRiB8IE1XRiB8IEJXRik7CisJLyogSWYgV09MIGlzIGJlaW5nIGRpc2FibGVkLCBubyBuZWVkIGZvciBjb21wbGV4aXR5ICovCisJaWYgKHdvbC0+d29sb3B0cykgeworCQlpZiAod29sLT53b2xvcHRzICYgV0FLRV9VQ0FTVCkgIG9wdGlvbnMgfD0gVVdGOworCQlpZiAod29sLT53b2xvcHRzICYgV0FLRV9CQ0FTVCkJb3B0aW9ucyB8PSBCV0Y7CisJCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01DQVNUKQlvcHRpb25zIHw9IE1XRjsKKwl9CisKKwljcHc4IChDb25maWc1LCBvcHRpb25zKTsKKworCWNwLT53b2xfZW5hYmxlZCA9ICh3b2wtPndvbG9wdHMpID8gMSA6IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBldGh0b29sIFdha2Utb24tTEFOIHNldHRpbmdzICovCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X3dvbCAoc3RydWN0IGNwX3ByaXZhdGUgKmNwLAorCSAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJdTggb3B0aW9uczsKKworCXdvbC0+d29sb3B0cyAgID0gMDsgLyogU3RhcnQgZnJvbSBzY3JhdGNoICovCisJd29sLT5zdXBwb3J0ZWQgPSBXQUtFX1BIWSAgIHwgV0FLRV9CQ0FTVCB8IFdBS0VfTUFHSUMgfAorCQkgICAgICAgICBXQUtFX01DQVNUIHwgV0FLRV9VQ0FTVDsKKwkvKiBXZSBkb24ndCBuZWVkIHRvIGdvIG9uIGlmIFdPTCBpcyBkaXNhYmxlZCAqLworCWlmICghY3AtPndvbF9lbmFibGVkKSByZXR1cm47CisJCisJb3B0aW9ucyAgICAgICAgPSBjcHI4IChDb25maWczKTsKKwlpZiAob3B0aW9ucyAmIExpbmtVcCkgICAgICAgIHdvbC0+d29sb3B0cyB8PSBXQUtFX1BIWTsKKwlpZiAob3B0aW9ucyAmIE1hZ2ljUGFja2V0KSAgIHdvbC0+d29sb3B0cyB8PSBXQUtFX01BR0lDOworCisJb3B0aW9ucyAgICAgICAgPSAwOyAvKiBQYXJhbm9pYSBzZXR0aW5nICovCisJb3B0aW9ucyAgICAgICAgPSBjcHI4IChDb25maWc1KTsKKwlpZiAob3B0aW9ucyAmIFVXRikgICAgICAgICAgIHdvbC0+d29sb3B0cyB8PSBXQUtFX1VDQVNUOworCWlmIChvcHRpb25zICYgQldGKSAgICAgICAgICAgd29sLT53b2xvcHRzIHw9IFdBS0VfQkNBU1Q7CisJaWYgKG9wdGlvbnMgJiBNV0YpICAgICAgICAgICB3b2wtPndvbG9wdHMgfD0gV0FLRV9NQ0FTVDsKK30KKworc3RhdGljIHZvaWQgY3BfZ2V0X2RydmluZm8gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN0cmNweSAoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5IChpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5IChpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoY3AtPnBkZXYpKTsKK30KKworc3RhdGljIGludCBjcF9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gQ1BfUkVHU19TSVpFOworfQorCitzdGF0aWMgaW50IGNwX2dldF9zdGF0c19jb3VudCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gQ1BfTlVNX1NUQVRTOworfQorCitzdGF0aWMgaW50IGNwX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNwLT5sb2NrLCBmbGFncyk7CisJcmMgPSBtaWlfZXRodG9vbF9nc2V0KCZjcC0+bWlpX2lmLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY3Bfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3AtPmxvY2ssIGZsYWdzKTsKKwlyYyA9IG1paV9ldGh0b29sX3NzZXQoJmNwLT5taWlfaWYsIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjcF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmY3AtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgY3BfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gY3AtPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIGNwX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljcC0+bXNnX2VuYWJsZSA9IHZhbHVlOworfQorCitzdGF0aWMgdTMyIGNwX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gKGNwcjE2KENwQ21kKSAmIFJ4Q2hrU3VtKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IGNwX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdTE2IGNtZCA9IGNwLT5jcGNtZCwgbmV3Y21kOworCisJbmV3Y21kID0gY21kOworCisJaWYgKGRhdGEpCisJCW5ld2NtZCB8PSBSeENoa1N1bTsKKwllbHNlCisJCW5ld2NtZCAmPSB+UnhDaGtTdW07CisKKwlpZiAobmV3Y21kICE9IGNtZCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjcC0+bG9jaywgZmxhZ3MpOworCQljcC0+Y3BjbWQgPSBuZXdjbWQ7CisJCWNwdzE2X2YoQ3BDbWQsIG5ld2NtZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNwX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsCisJCSAgICAgICAgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocmVncy0+bGVuIDwgQ1BfUkVHU19TSVpFKQorCQlyZXR1cm4gLyogLUVJTlZBTCAqLzsKKworCXJlZ3MtPnZlcnNpb24gPSBDUF9SRUdTX1ZFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjcC0+bG9jaywgZmxhZ3MpOworCW1lbWNweV9mcm9taW8ocCwgY3AtPnJlZ3MsIENQX1JFR1NfU0laRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY3BfZ2V0X3dvbCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmY3AtPmxvY2ssIGZsYWdzKTsKKwluZXRkZXZfZ2V0X3dvbCAoY3AsIHdvbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgY3Bfc2V0X3dvbCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJmNwLT5sb2NrLCBmbGFncyk7CisJcmMgPSBuZXRkZXZfc2V0X3dvbCAoY3AsIHdvbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGNwX2dldF9zdHJpbmdzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqYnVmKQoreworCXN3aXRjaCAoc3RyaW5nc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCW1lbWNweShidWYsICZldGh0b29sX3N0YXRzX2tleXMsIHNpemVvZihldGh0b29sX3N0YXRzX2tleXMpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgY3BfZ2V0X2V0aHRvb2xfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqZXN0YXRzLCB1NjQgKnRtcF9zdGF0cykKK3sKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCB3b3JrID0gMTAwOworCWludCBpOworCisJLyogYmVnaW4gTklDIHN0YXRpc3RpY3MgZHVtcCAqLworCWNwdzMyKFN0YXRzQWRkciArIDQsIChjcC0+bmljX3N0YXRzX2RtYSA+PiAxNikgPj4gMTYpOworCWNwdzMyKFN0YXRzQWRkciwgKGNwLT5uaWNfc3RhdHNfZG1hICYgMHhmZmZmZmZmZikgfCBEdW1wU3RhdHMpOworCWNwcjMyKFN0YXRzQWRkcik7CisKKwl3aGlsZSAod29yay0tID4gMCkgeworCQlpZiAoKGNwcjMyKFN0YXRzQWRkcikgJiBEdW1wU3RhdHMpID09IDApCisJCQlicmVhazsKKwkJY3B1X3JlbGF4KCk7CisJfQorCisJaWYgKGNwcjMyKFN0YXRzQWRkcikgJiBEdW1wU3RhdHMpCisJCXJldHVybiAvKiAtRUlPICovOworCisJaSA9IDA7CisJdG1wX3N0YXRzW2krK10gPSBsZTY0X3RvX2NwdShjcC0+bmljX3N0YXRzLT50eF9vayk7CisJdG1wX3N0YXRzW2krK10gPSBsZTY0X3RvX2NwdShjcC0+bmljX3N0YXRzLT5yeF9vayk7CisJdG1wX3N0YXRzW2krK10gPSBsZTY0X3RvX2NwdShjcC0+bmljX3N0YXRzLT50eF9lcnIpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoY3AtPm5pY19zdGF0cy0+cnhfZXJyKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMTZfdG9fY3B1KGNwLT5uaWNfc3RhdHMtPnJ4X2ZpZm8pOworCXRtcF9zdGF0c1tpKytdID0gbGUxNl90b19jcHUoY3AtPm5pY19zdGF0cy0+ZnJhbWVfYWxpZ24pOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoY3AtPm5pY19zdGF0cy0+dHhfb2tfMWNvbCk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShjcC0+bmljX3N0YXRzLT50eF9va19tY29sKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlNjRfdG9fY3B1KGNwLT5uaWNfc3RhdHMtPnJ4X29rX3BoeXMpOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoY3AtPm5pY19zdGF0cy0+cnhfb2tfYmNhc3QpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoY3AtPm5pY19zdGF0cy0+cnhfb2tfbWNhc3QpOworCXRtcF9zdGF0c1tpKytdID0gbGUxNl90b19jcHUoY3AtPm5pY19zdGF0cy0+dHhfYWJvcnQpOworCXRtcF9zdGF0c1tpKytdID0gbGUxNl90b19jcHUoY3AtPm5pY19zdGF0cy0+dHhfdW5kZXJydW4pOworCXRtcF9zdGF0c1tpKytdID0gY3AtPmNwX3N0YXRzLnJ4X2ZyYWdzOworCWlmIChpICE9IENQX05VTV9TVEFUUykKKwkJQlVHKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgY3BfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IGNwX2dldF9kcnZpbmZvLAorCS5nZXRfcmVnc19sZW4JCT0gY3BfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfc3RhdHNfY291bnQJPSBjcF9nZXRfc3RhdHNfY291bnQsCisJLmdldF9zZXR0aW5ncwkJPSBjcF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBjcF9zZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQJCT0gY3BfbndheV9yZXNldCwKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsCQk9IGNwX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IGNwX3NldF9tc2dsZXZlbCwKKwkuZ2V0X3J4X2NzdW0JCT0gY3BfZ2V0X3J4X2NzdW0sCisJLnNldF9yeF9jc3VtCQk9IGNwX3NldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorCS5zZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX3NldF90eF9jc3VtLCAvKiBsb2NhbCEgKi8KKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3JlZ3MJCT0gY3BfZ2V0X3JlZ3MsCisJLmdldF93b2wJCT0gY3BfZ2V0X3dvbCwKKwkuc2V0X3dvbAkJPSBjcF9zZXRfd29sLAorCS5nZXRfc3RyaW5ncwkJPSBjcF9nZXRfc3RyaW5ncywKKwkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBjcF9nZXRfZXRodG9vbF9zdGF0cywKK307CisKK3N0YXRpYyBpbnQgY3BfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjcC0+bG9jaywgZmxhZ3MpOworCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJmNwLT5taWlfaWYsIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFNlcmlhbCBFRVBST00gc2VjdGlvbi4gKi8KKworLyogIEVFUFJPTV9DdHJsIGJpdHMuICovCisjZGVmaW5lIEVFX1NISUZUX0NMSwkweDA0CS8qIEVFUFJPTSBzaGlmdCBjbG9jay4gKi8KKyNkZWZpbmUgRUVfQ1MJCQkweDA4CS8qIEVFUFJPTSBjaGlwIHNlbGVjdC4gKi8KKyNkZWZpbmUgRUVfREFUQV9XUklURQkweDAyCS8qIEVFUFJPTSBjaGlwIGRhdGEgaW4uICovCisjZGVmaW5lIEVFX1dSSVRFXzAJCTB4MDAKKyNkZWZpbmUgRUVfV1JJVEVfMQkJMHgwMgorI2RlZmluZSBFRV9EQVRBX1JFQUQJMHgwMQkvKiBFRVBST00gY2hpcCBkYXRhIG91dC4gKi8KKyNkZWZpbmUgRUVfRU5CCQkJKDB4ODAgfCBFRV9DUykKKworLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuCisgICBObyBleHRyYSBkZWxheSBpcyBuZWVkZWQgd2l0aCAzM01oeiBQQ0ksIGJ1dCA2Nk1oeiBtYXkgY2hhbmdlIHRoaXMuCisgKi8KKworI2RlZmluZSBlZXByb21fZGVsYXkoKQlyZWFkbChlZV9hZGRyKQorCisvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfQ01ECSg1KQorI2RlZmluZSBFRV9SRUFEX0NNRAkJKDYpCisjZGVmaW5lIEVFX0VSQVNFX0NNRAkoNykKKworc3RhdGljIGludCByZWFkX2VlcHJvbSAodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBsb2NhdGlvbiwgaW50IGFkZHJfbGVuKQoreworCWludCBpOworCXVuc2lnbmVkIHJldHZhbCA9IDA7CisJdm9pZCBfX2lvbWVtICplZV9hZGRyID0gaW9hZGRyICsgQ2ZnOTM0NjsKKwlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IChFRV9SRUFEX0NNRCA8PCBhZGRyX2xlbik7CisKKwl3cml0ZWIgKEVFX0VOQiAmIH5FRV9DUywgZWVfYWRkcik7CisJd3JpdGViIChFRV9FTkIsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSAoKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gNCArIGFkZHJfbGVuOyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFX0RBVEFfV1JJVEUgOiAwOworCQl3cml0ZWIgKEVFX0VOQiB8IGRhdGF2YWwsIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkgKCk7CisJCXdyaXRlYiAoRUVfRU5CIHwgZGF0YXZhbCB8IEVFX1NISUZUX0NMSywgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSAoKTsKKwl9CisJd3JpdGViIChFRV9FTkIsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSAoKTsKKworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCXdyaXRlYiAoRUVfRU5CIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5ICgpOworCQlyZXR2YWwgPQorCQkgICAgKHJldHZhbCA8PCAxKSB8ICgocmVhZGIgKGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOgorCQkJCSAgICAgMCk7CisJCXdyaXRlYiAoRUVfRU5CLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5ICgpOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKwl3cml0ZWIgKH5FRV9DUywgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5ICgpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogUHV0IHRoZSBib2FyZCBpbnRvIEQzY29sZCBzdGF0ZSBhbmQgd2FpdCBmb3IgV2FrZVVwIHNpZ25hbCAqLworc3RhdGljIHZvaWQgY3Bfc2V0X2QzX3N0YXRlIChzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3ApCit7CisJcGNpX2VuYWJsZV93YWtlIChjcC0+cGRldiwgMCwgMSk7IC8qIEVuYWJsZSBQTUUjIGdlbmVyYXRpb24gKi8KKwlwY2lfc2V0X3Bvd2VyX3N0YXRlIChjcC0+cGRldiwgUENJX0QzaG90KTsKK30KKworc3RhdGljIGludCBjcF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3A7CisJaW50IHJjOworCXZvaWQgX19pb21lbSAqcmVnczsKKwlsb25nIHBjaWFkZHI7CisJdW5zaWduZWQgaW50IGFkZHJfbGVuLCBpLCBwY2lfdXNpbmdfZGFjOworCXU4IHBjaV9yZXY7CisKKyNpZm5kZWYgTU9EVUxFCisJc3RhdGljIGludCB2ZXJzaW9uX3ByaW50ZWQ7CisJaWYgKHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50aygiJXMiLCB2ZXJzaW9uKTsKKyNlbmRpZgorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmcGNpX3Jldik7CisKKwlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfUkVBTFRFSyAmJgorCSAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9SRUFMVEVLXzgxMzkgJiYgcGNpX3JldiA8IDB4MjApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicGNpIGRldiAlcyAoaWQgJTA0eDolMDR4IHJldiAlMDJ4KSBpcyBub3QgYW4gODEzOUMrIGNvbXBhdGlibGUgY2hpcFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwgcGNpX3Jldik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlRyeSB0aGUgXCI4MTM5dG9vXCIgZHJpdmVyIGluc3RlYWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBjcF9wcml2YXRlKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCWNwLT5wZGV2ID0gcGRldjsKKwljcC0+ZGV2ID0gZGV2OworCWNwLT5tc2dfZW5hYmxlID0gKGRlYnVnIDwgMCA/IENQX0RFRl9NU0dfRU5BQkxFIDogZGVidWcpOworCXNwaW5fbG9ja19pbml0ICgmY3AtPmxvY2spOworCWNwLT5taWlfaWYuZGV2ID0gZGV2OworCWNwLT5taWlfaWYubWRpb19yZWFkID0gbWRpb19yZWFkOworCWNwLT5taWlfaWYubWRpb193cml0ZSA9IG1kaW9fd3JpdGU7CisJY3AtPm1paV9pZi5waHlfaWQgPSBDUF9JTlRFUk5BTF9QSFk7CisJY3AtPm1paV9pZi5waHlfaWRfbWFzayA9IDB4MWY7CisJY3AtPm1paV9pZi5yZWdfbnVtX21hc2sgPSAweDFmOworCWNwX3NldF9yeGJ1ZnNpemUoY3ApOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9mcmVlOworCisJcmMgPSBwY2lfc2V0X213aShwZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9td2k7CisKKwlwY2lhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworCWlmICghcGNpYWRkcikgeworCQlyYyA9IC1FSU87CisJCXByaW50ayhLRVJOX0VSUiBQRlggIm5vIE1NSU8gcmVzb3VyY2UgZm9yIHBjaSBkZXYgJXNcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyX291dF9yZXM7CisJfQorCWlmIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpIDwgQ1BfUkVHU19TSVpFKSB7CisJCXJjID0gLUVJTzsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTU1JTyByZXNvdXJjZSAoJWx4KSB0b28gc21hbGwgb24gcGNpIGRldiAlc1xuIiwKKwkJICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSksIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJfb3V0X3JlczsKKwl9CisKKwkvKiBDb25maWd1cmUgRE1BIGF0dHJpYnV0ZXMuICovCisJaWYgKChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSAmJgorCSAgICAhcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkgJiYKKwkgICAgIXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworCQlwY2lfdXNpbmdfZGFjID0gMTsKKwl9IGVsc2UgeworCQlwY2lfdXNpbmdfZGFjID0gMDsKKworCQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCAiCisJCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCQlnb3RvIGVycl9vdXRfcmVzOworCQl9CisJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZVTEwpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIk5vIHVzYWJsZSBjb25zaXN0ZW50IERNQSBjb25maWd1cmF0aW9uLCAiCisJCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCQlnb3RvIGVycl9vdXRfcmVzOworCQl9CisJfQorCisJY3AtPmNwY21kID0gKHBjaV91c2luZ19kYWMgPyBQQ0lEQUMgOiAwKSB8CisJCSAgICBQQ0lNdWxSVyB8IFJ4Q2hrU3VtIHwgQ3BSeE9uIHwgQ3BUeE9uOworCisJcmVncyA9IGlvcmVtYXAocGNpYWRkciwgQ1BfUkVHU19TSVpFKTsKKwlpZiAoIXJlZ3MpIHsKKwkJcmMgPSAtRUlPOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgbWFwIFBDSSBNTUlPICglbHhAJWx4KSBvbiBwY2kgZGV2ICVzXG4iLAorCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSwgcGNpYWRkciwgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9vdXRfcmVzOworCX0KKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKSByZWdzOworCWNwLT5yZWdzID0gcmVnczsKKworCWNwX3N0b3BfaHcoY3ApOworCisJLyogcmVhZCBNQUMgYWRkcmVzcyBmcm9tIEVFUFJPTSAqLworCWFkZHJfbGVuID0gcmVhZF9lZXByb20gKHJlZ3MsIDAsIDgpID09IDB4ODEyOSA/IDggOiA2OworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCSgodTE2ICopIChkZXYtPmRldl9hZGRyKSlbaV0gPQorCQkgICAgbGUxNl90b19jcHUgKHJlYWRfZWVwcm9tIChyZWdzLCBpICsgNywgYWRkcl9sZW4pKTsKKworCWRldi0+b3BlbiA9IGNwX29wZW47CisJZGV2LT5zdG9wID0gY3BfY2xvc2U7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBjcF9zZXRfcnhfbW9kZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGNwX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBjcF9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9IGNwX2lvY3RsOworCWRldi0+cG9sbCA9IGNwX3J4X3BvbGw7CisJZGV2LT53ZWlnaHQgPSAxNjsJLyogYXJiaXRyYXJ5PyBmcm9tIE5BUElfSE9XVE8udHh0LiAqLworI2lmZGVmIEJST0tFTgorCWRldi0+Y2hhbmdlX210dSA9IGNwX2NoYW5nZV9tdHU7CisjZW5kaWYKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmNwX2V0aHRvb2xfb3BzOworI2lmIDAKKwlkZXYtPnR4X3RpbWVvdXQgPSBjcF90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2VuZGlmCisKKyNpZiBDUF9WTEFOX1RBR19VU0VECisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlg7CisJZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gY3Bfdmxhbl9yeF9yZWdpc3RlcjsKKwlkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSBjcF92bGFuX3J4X2tpbGxfdmlkOworI2VuZGlmCisKKwlpZiAocGNpX3VzaW5nX2RhYykKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfaW9tYXA7CisKKwlwcmludGsgKEtFUk5fSU5GTyAiJXM6IFJUTC04MTM5QysgYXQgMHglbHgsICIKKwkJIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LCAiCisJCSJJUlEgJWRcbiIsCisJCWRldi0+bmFtZSwKKwkJZGV2LT5iYXNlX2FkZHIsCisJCWRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sCisJCWRldi0+ZGV2X2FkZHJbMl0sIGRldi0+ZGV2X2FkZHJbM10sCisJCWRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0sCisJCWRldi0+aXJxKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJLyogZW5hYmxlIGJ1c21hc3RlcmluZyBhbmQgbWVtb3J5LXdyaXRlLWludmFsaWRhdGUgKi8KKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmIChjcC0+d29sX2VuYWJsZWQpIGNwX3NldF9kM19zdGF0ZSAoY3ApOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaW9tYXA6CisJaW91bm1hcChyZWdzKTsKK2Vycl9vdXRfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0X213aToKKwlwY2lfY2xlYXJfbXdpKHBkZXYpOworZXJyX291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9vdXRfZnJlZToKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgY3BfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCFkZXYpCisJCUJVRygpOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaW91bm1hcChjcC0+cmVncyk7CisJaWYgKGNwLT53b2xfZW5hYmxlZCkgcGNpX3NldF9wb3dlcl9zdGF0ZSAocGRldiwgUENJX0QwKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9jbGVhcl9td2kocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGNwX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisJY3AgID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghZGV2IHx8ICFuZXRpZl9ydW5uaW5nIChkZXYpKSByZXR1cm4gMDsKKworCW5ldGlmX2RldmljZV9kZXRhY2ggKGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmY3AtPmxvY2ssIGZsYWdzKTsKKworCS8qIERpc2FibGUgUnggYW5kIFR4ICovCisJY3B3MTYgKEludHJNYXNrLCAwKTsKKwljcHc4ICAoQ21kLCBjcHI4IChDbWQpICYgKH5SeE9uIHwgflR4T24pKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZjcC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGNwLT5wZGV2ICYmIGNwLT53b2xfZW5hYmxlZCkgeworCQlwY2lfc2F2ZV9zdGF0ZSAoY3AtPnBkZXYpOworCQljcF9zZXRfZDNfc3RhdGUgKGNwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcF9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwOworCisJZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwljcCAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaCAoZGV2KTsKKwkKKwlpZiAoY3AtPnBkZXYgJiYgY3AtPndvbF9lbmFibGVkKSB7CisJCXBjaV9zZXRfcG93ZXJfc3RhdGUgKGNwLT5wZGV2LCBQQ0lfRDApOworCQlwY2lfcmVzdG9yZV9zdGF0ZSAoY3AtPnBkZXYpOworCX0KKwkKKwljcF9pbml0X2h3IChjcCk7CisJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisJCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjcF9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICA9IERSVl9OQU1FLAorCS5pZF90YWJsZSAgICAgPSBjcF9wY2lfdGJsLAorCS5wcm9iZSAgICAgICAgPQljcF9pbml0X29uZSwKKwkucmVtb3ZlICAgICAgID0gY3BfcmVtb3ZlX29uZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkucmVzdW1lICAgICAgID0gY3BfcmVzdW1lLAorCS5zdXNwZW5kICAgICAgPSBjcF9zdXNwZW5kLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjcF9pbml0ICh2b2lkKQoreworI2lmZGVmIE1PRFVMRQorCXByaW50aygiJXMiLCB2ZXJzaW9uKTsKKyNlbmRpZgorCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZjcF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY3BfZXhpdCAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZjcF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjcF9pbml0KTsKK21vZHVsZV9leGl0KGNwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODEzOXRvby5jIGIvZHJpdmVycy9uZXQvODEzOXRvby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YmQyMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC84MTM5dG9vLmMKQEAgLTAsMCArMSwyNjY2IEBACisvKgorCisJODEzOXRvby5jOiBBIFJlYWxUZWsgUlRMLTgxMzkgRmFzdCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgorCisJTWFpbnRhaW5lZCBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJQ29weXJpZ2h0IDIwMDAtMjAwMiBKZWZmIEdhcnppaworCisJTXVjaCBjb2RlIGNvbWVzIGZyb20gRG9uYWxkIEJlY2tlcidzIHJ0bDgxMzkuYyBkcml2ZXIsCisJdmVyc2lvbnMgMS4xMyBhbmQgb2xkZXIuICBUaGlzIGRyaXZlciB3YXMgb3JpZ2luYWxseSBiYXNlZAorCW9uIHJ0bDgxMzkuYyB2ZXJzaW9uIDEuMDcuICBIZWFkZXIgb2YgcnRsODEzOS5jIHZlcnNpb24gMS4xMzoKKworCS0tLS0tPHNuaXA+LS0tLS0KKworICAgICAgICAJV3JpdHRlbiAxOTk3LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KKwkJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZQorCQl0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZAorCQloZXJlaW4gYnkgcmVmZXJlbmNlLiAgRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcworCQljb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdCByZXRhaW4gdGhlIGF1dGhvcnNoaXAsCisJCWNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90IGEgY29tcGxldGUKKwkJcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJCVRoaXMgZHJpdmVyIGlzIGZvciBib2FyZHMgYmFzZWQgb24gdGhlIFJUTDgxMjkgYW5kIFJUTDgxMzkKKwkJUENJIGV0aGVybmV0IGNoaXBzLgorCisJCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PIFNjeWxkCisJCUNvbXB1dGluZyBDb3Jwb3JhdGlvbiA0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMCBBbm5hcG9saXMKKwkJTUQgMjE0MDMKKworCQlTdXBwb3J0IGFuZCB1cGRhdGVzIGF2YWlsYWJsZSBhdAorCQlodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL3J0bDgxMzkuaHRtbAorCisJCVR3aXN0ZXItdHVuaW5nIHRhYmxlIHByb3ZpZGVkIGJ5IEtpbnN0b24KKwkJPHNoYW5naEByZWFsdGVrLmNvbS50dz4uCisKKwktLS0tLTxzbmlwPi0tLS0tCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCUNvbnRyaWJ1dG9yczoKKworCQlEb25hbGQgQmVja2VyIC0gaGUgd3JvdGUgdGhlIG9yaWdpbmFsIGRyaXZlciwga3Vkb3MgdG8gaGltIQorCQkoYnV0IHBsZWFzZSBkb24ndCBlLW1haWwgaGltIGZvciBzdXBwb3J0LCB0aGlzIGlzbid0IGhpcyBkcml2ZXIpCisKKwkJVGlncmFuIEFpdmF6aWFuIC0gYnVnIGZpeGVzLCBza2J1ZmYgZnJlZSBjbGVhbnVwCisKKwkJTWFydGluIE1hcmVzIC0gc3VnZ2VzdGlvbnMgZm9yIFBDSSBjbGVhbnVwCisKKwkJRGF2aWQgUy4gTWlsbGVyIC0gUENJIERNQSBhbmQgc29mdG5ldCB1cGRhdGVzCisKKwkJRXJuc3QgR2lsbCAtIGZpeGVzIHBvcnRlZCBmcm9tIEJTRCBkcml2ZXIKKworCQlEYW5pZWwgS29icmFzIC0gaWRlbnRpZmllZCBzcGVjaWZpYyBsb2NhdGlvbnMgb2YKKwkJCXBvc3RlZCBNTUlPIHdyaXRlIGJ1Z2dpbmVzcworCisJCUdlcmFyZCBTaGFycCAtIGJ1ZyBmaXgsIHRlc3RpbmcgYW5kIGZlZWRiYWNrCisKKwkJRGF2aWQgRm9yZCAtIFJ4IHJpbmcgd3JhcCBmaXgKKworCQlEYW4gRGVNYWdnaW8gLSBzd2FwcGVkIFJUTDgxMzkgY2FyZHMgd2l0aCBtZSwgYW5kIGFsbG93ZWQgbWUKKwkJdG8gZmluZCBhbmQgZml4IGEgY3J1Y2lhbCBidWcgb24gb2xkZXIgY2hpcHNldHMuCisKKwkJRG9uYWxkIEJlY2tlci9DaHJpcyBCdXR0ZXJ3b3J0aC9NYXJjdXMgV2VzdGVyZ3JlbiAtCisJCU5vdGljZWQgdmFyaW91cyBSeCBwYWNrZXQgc2l6ZS1yZWxhdGVkIGJ1Z2xldHMuCisKKwkJU2FudGlhZ28gR2FyY2lhIE1hbnRpbmFuIC0gdGVzdGluZyBhbmQgZmVlZGJhY2sKKworCQlKZW5zIERhdmlkIC0gMi4yLngga2VybmVsIGJhY2twb3J0cworCisJCU1hcnRpbiBEZW5uZXR0IC0gaW5jcmVkaWJseSBoZWxwZnVsIGluc2lnaHQgb24gdW5kb2N1bWVudGVkCisJCWZlYXR1cmVzIG9mIHRoZSA4MTM5IGNoaXBzCisKKwkJSmVhbi1KYWNxdWVzIE1pY2hlbCAtIGJ1ZyBmaXgKKworCQlUb2JpYXMgUmluZ3N0cvZtIC0gUnggaW50ZXJydXB0IHN0YXR1cyBjaGVja2luZyBzdWdnZXN0aW9uCisKKwkJQW5kcmV3IE1vcnRvbiAtIENsZWFyIGJsb2NrZWQgc2lnbmFscywgYXZvaWQKKwkJYnVmZmVyIG92ZXJydW4gc2V0dGluZyBjdXJyZW50LT5jb21tLgorCisJCUthbGxlIE9sYXZpIE5pZW1pdGFsbyAtIFdha2Utb24tTEFOIGlvY3RscworCisJCVJvYmVydCBLdWViZWwgLSBTYXZlIGtlcm5lbCB0aHJlYWQgZnJvbSBkeWluZyBvbiBhbnkgc2lnbmFsLgorCisJU3VibWl0dGluZyBidWcgcmVwb3J0czoKKworCQkicnRsODEzOS1kaWFnIC1tbW1hYWF2dnZlZWZOIiBvdXRwdXQKKwkJZW5hYmxlIFJUTDgxMzlfREVCVUcgYmVsb3csIGFuZCBsb29rIGF0ICdkbWVzZycgb3Iga2VybmVsIGxvZworCisqLworCisjZGVmaW5lIERSVl9OQU1FCSI4MTM5dG9vIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC45LjI3IgorCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjZGVmaW5lIFJUTDgxMzlfRFJJVkVSX05BTUUgICBEUlZfTkFNRSAiIEZhc3QgRXRoZXJuZXQgZHJpdmVyICIgRFJWX1ZFUlNJT04KKyNkZWZpbmUgUEZYIERSVl9OQU1FICI6ICIKKworLyogRGVmYXVsdCBNZXNzYWdlIGxldmVsICovCisjZGVmaW5lIFJUTDgxMzlfREVGX01TR19FTkFCTEUgICAoTkVUSUZfTVNHX0RSViAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUSUZfTVNHX1BST0JFICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVElGX01TR19MSU5LKQorCisKKy8qIGVuYWJsZSBQSU8gaW5zdGVhZCBvZiBNTUlPLCBpZiBDT05GSUdfODEzOVRPT19QSU8gaXMgc2VsZWN0ZWQgKi8KKyNpZmRlZiBDT05GSUdfODEzOVRPT19QSU8KKyNkZWZpbmUgVVNFX0lPX09QUyAxCisjZW5kaWYKKworLyogZGVmaW5lIHRvIDEgdG8gZW5hYmxlIGNvcGlvdXMgZGVidWdnaW5nIGluZm8gKi8KKyN1bmRlZiBSVEw4MTM5X0RFQlVHCisKKy8qIGRlZmluZSB0byAxIHRvIGRpc2FibGUgbGlnaHR3ZWlnaHQgcnVudGltZSBkZWJ1Z2dpbmcgY2hlY2tzICovCisjdW5kZWYgUlRMODEzOV9OREVCVUcKKworCisjaWZkZWYgUlRMODEzOV9ERUJVRworLyogbm90ZTogcHJpbnRzIGZ1bmN0aW9uIG5hbWUgZm9yIHlvdSAqLworIyAgZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQorI2Vsc2UKKyMgIGRlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjaWZkZWYgUlRMODEzOV9OREVCVUcKKyMgIGRlZmluZSBhc3NlcnQoZXhwcikgZG8ge30gd2hpbGUgKDApCisjZWxzZQorIyAgZGVmaW5lIGFzc2VydChleHByKSBcCisgICAgICAgIGlmKHVubGlrZWx5KCEoZXhwcikpKSB7CQkJCSAgICAgICAgXAorICAgICAgICBwcmludGsoS0VSTl9FUlIgIkFzc2VydGlvbiBmYWlsZWQhICVzLCVzLCVzLGxpbmU9JWRcbiIsCVwKKyAgICAgICAgI2V4cHIsX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fKTsJCSAgICAgICAgXAorICAgICAgICB9CisjZW5kaWYKKworCisvKiBBIGZldyB1c2VyLWNvbmZpZ3VyYWJsZSB2YWx1ZXMuICovCisvKiBtZWRpYSBvcHRpb25zICovCisjZGVmaW5lIE1BWF9VTklUUyA4CitzdGF0aWMgaW50IG1lZGlhW01BWF9VTklUU10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OworCisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIFJ4LWFsbC1tdWx0aWNhc3QpLgorICAgVGhlIFJUTCBjaGlwcyB1c2UgYSA2NCBlbGVtZW50IGhhc2ggdGFibGUgYmFzZWQgb24gdGhlIEV0aGVybmV0IENSQy4gICovCitzdGF0aWMgaW50IG11bHRpY2FzdF9maWx0ZXJfbGltaXQgPSAzMjsKKworLyogYml0bWFwcGVkIG1lc3NhZ2UgZW5hYmxlIG51bWJlciAqLworc3RhdGljIGludCBkZWJ1ZyA9IC0xOworCisvKgorICogUmVjZWl2ZSByaW5nIHNpemUgCisgKiBXYXJuaW5nOiA2NEsgcmluZyBoYXMgaGFyZHdhcmUgaXNzdWVzIGFuZCBtYXkgbG9jayB1cC4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NIX0RSRUFNQ0FTVCkKKyNkZWZpbmUgUlhfQlVGX0lEWAkxCS8qIDE2SyByaW5nICovCisjZWxzZQorI2RlZmluZSBSWF9CVUZfSURYCTIJLyogMzJLIHJpbmcgKi8KKyNlbmRpZgorI2RlZmluZSBSWF9CVUZfTEVOCSg4MTkyIDw8IFJYX0JVRl9JRFgpCisjZGVmaW5lIFJYX0JVRl9QQUQJMTYKKyNkZWZpbmUgUlhfQlVGX1dSQVBfUEFEIDIwNDggLyogc3BhcmUgcGFkZGluZyB0byBoYW5kbGUgbGFjayBvZiBwYWNrZXQgd3JhcCAqLworCisjaWYgUlhfQlVGX0xFTiA9PSA2NTUzNgorI2RlZmluZSBSWF9CVUZfVE9UX0xFTglSWF9CVUZfTEVOCisjZWxzZQorI2RlZmluZSBSWF9CVUZfVE9UX0xFTgkoUlhfQlVGX0xFTiArIFJYX0JVRl9QQUQgKyBSWF9CVUZfV1JBUF9QQUQpCisjZW5kaWYKKworLyogTnVtYmVyIG9mIFR4IGRlc2NyaXB0b3IgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBOVU1fVFhfREVTQwk0CisKKy8qIG1heCBzdXBwb3J0ZWQgZXRoZXJuZXQgZnJhbWUgc2l6ZSAtLSBtdXN0IGJlIGF0IGxlYXN0IChkZXYtPm10dSsxNCs0KS4qLworI2RlZmluZSBNQVhfRVRIX0ZSQU1FX1NJWkUJMTUzNgorCisvKiBTaXplIG9mIHRoZSBUeCBib3VuY2UgYnVmZmVycyAtLSBtdXN0IGJlIGF0IGxlYXN0IChkZXYtPm10dSsxNCs0KS4gKi8KKyNkZWZpbmUgVFhfQlVGX1NJWkUJTUFYX0VUSF9GUkFNRV9TSVpFCisjZGVmaW5lIFRYX0JVRl9UT1RfTEVOCShUWF9CVUZfU0laRSAqIE5VTV9UWF9ERVNDKQorCisvKiBQQ0kgVHVuaW5nIFBhcmFtZXRlcnMKKyAgIFRocmVzaG9sZCBpcyBieXRlcyB0cmFuc2ZlcnJlZCB0byBjaGlwIGJlZm9yZSB0cmFuc21pc3Npb24gc3RhcnRzLiAqLworI2RlZmluZSBUWF9GSUZPX1RIUkVTSCAyNTYJLyogSW4gYnl0ZXMsIHJvdW5kZWQgZG93biB0byAzMiBieXRlIHVuaXRzLiAqLworCisvKiBUaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSBsb2dfMihieXRlcyktNDogIDAgPT0gMTYgYnl0ZXMgLi4gNj09MTAyNCwgNz09ZW5kIG9mIHBhY2tldC4gKi8KKyNkZWZpbmUgUlhfRklGT19USFJFU0gJNwkvKiBSeCBidWZmZXIgbGV2ZWwgYmVmb3JlIGZpcnN0IFBDSSB4ZmVyLiAgKi8KKyNkZWZpbmUgUlhfRE1BX0JVUlNUCTcJLyogTWF4aW11bSBQQ0kgYnVyc3QsICc2JyBpcyAxMDI0ICovCisjZGVmaW5lIFRYX0RNQV9CVVJTVAk2CS8qIE1heGltdW0gUENJIGJ1cnN0LCAnNicgaXMgMTAyNCAqLworI2RlZmluZSBUWF9SRVRSWQk4CS8qIDAtMTUuICByZXRyaWVzID0gMTYgKyAoVFhfUkVUUlkgKiAxNikgKi8KKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoNipIWikKKworCitlbnVtIHsKKwlIQVNfTUlJX1hDVlIgPSAweDAxMDAwMCwKKwlIQVNfQ0hJUF9YQ1ZSID0gMHgwMjAwMDAsCisJSEFTX0xOS19DSE5HID0gMHgwNDAwMDAsCit9OworCisjZGVmaW5lIFJUTF9OVU1fU1RBVFMgNAkJLyogbnVtYmVyIG9mIEVUSFRPT0xfR1NUQVRTIHU2NCdzICovCisjZGVmaW5lIFJUTF9SRUdTX1ZFUiAxCQkvKiB2ZXJzaW9uIG9mIHJlZy4gZGF0YSBpbiBFVEhUT09MX0dSRUdTICovCisjZGVmaW5lIFJUTF9NSU5fSU9fU0laRSAweDgwCisjZGVmaW5lIFJUTDgxMzlCX0lPX1NJWkUgMjU2CisKKyNkZWZpbmUgUlRMODEyOV9DQVBTCUhBU19NSUlfWENWUgorI2RlZmluZSBSVEw4MTM5X0NBUFMJSEFTX0NISVBfWENWUnxIQVNfTE5LX0NITkcKKwordHlwZWRlZiBlbnVtIHsKKwlSVEw4MTM5ID0gMCwKKwlSVEw4MTI5LAorfSBib2FyZF90OworCisKKy8qIGluZGV4ZWQgYnkgYm9hcmRfdCwgYWJvdmUgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTMyIGh3X2ZsYWdzOworfSBib2FyZF9pbmZvW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7ICJSZWFsVGVrIFJUTDgxMzkiLCBSVEw4MTM5X0NBUFMgfSwKKwl7ICJSZWFsVGVrIFJUTDgxMjkiLCBSVEw4MTI5X0NBUFMgfSwKK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0bDgxMzlfcGNpX3RibFtdID0geworCXsweDEwZWMsIDB4ODEzOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDEwZWMsIDB4ODEzOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDExMTMsIDB4MTIxMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDE1MDAsIDB4MTM2MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDQwMzMsIDB4MTM2MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDExODYsIDB4MTMwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDExODYsIDB4MTM0MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDEzZDEsIDB4YWIwNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDEyNTksIDB4YTExNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDEyNTksIDB4YTExZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDE0ZWEsIDB4YWIwNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDE0ZWEsIDB4YWIwNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDExZGIsIDB4MTIzNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDE0MzIsIDB4OTEzMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDAyYWMsIDB4MTAxMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDAxOGEsIDB4MDEwNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDEyNmMsIDB4MTIxMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDE3NDMsIDB4ODEzOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDAyMWIsIDB4ODEzOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LCAKKworI2lmZGVmIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMAorCS8qIEJvZ3VzIDgxMzkgc2lsaWNvbiByZXBvcnRzIDgxMjkgd2l0aG91dCBleHRlcm5hbCBQUk9NIDotKCAqLworCXsweDEwZWMsIDB4ODEyOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHXzgxMzlUT09fODEyOQorCXsweDEwZWMsIDB4ODEyOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEyOSB9LAorI2VuZGlmCisKKwkvKiBzb21lIGNyYXp5IGNhcmRzIHJlcG9ydCBpbnZhbGlkIHZlbmRvciBpZHMgbGlrZQorCSAqIDB4MDAwMSBoZXJlLiAgVGhlIG90aGVyIGlkcyBhcmUgdmFsaWQgYW5kIGNvbnN0YW50LAorCSAqIHNvIHdlIHNpbXBseSBkb24ndCBtYXRjaCBvbiB0aGUgbWFpbiB2ZW5kb3IgaWQuCisJICovCisJe1BDSV9BTllfSUQsIDB4ODEzOSwgMHgxMGVjLCAweDgxMzksIDAsIDAsIFJUTDgxMzkgfSwKKwl7UENJX0FOWV9JRCwgMHg4MTM5LCAweDExODYsIDB4MTMwMCwgMCwgMCwgUlRMODEzOSB9LAorCXtQQ0lfQU5ZX0lELCAweDgxMzksIDB4MTNkMSwgMHhhYjA2LCAwLCAwLCBSVEw4MTM5IH0sCisKKwl7MCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBydGw4MTM5X3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyIHN0cltFVEhfR1NUUklOR19MRU5dOworfSBldGh0b29sX3N0YXRzX2tleXNbXSA9IHsKKwl7ICJlYXJseV9yeCIgfSwKKwl7ICJ0eF9idWZfbWFwcGVkIiB9LAorCXsgInR4X3RpbWVvdXRzIiB9LAorCXsgInJ4X2xvc3RfaW5fcmluZyIgfSwKK307CisKKy8qIFRoZSByZXN0IG9mIHRoZXNlIHZhbHVlcyBzaG91bGQgbmV2ZXIgY2hhbmdlLiAqLworCisvKiBTeW1ib2xpYyBvZmZzZXRzIHRvIHJlZ2lzdGVycy4gKi8KK2VudW0gUlRMODEzOV9yZWdpc3RlcnMgeworCU1BQzAgPSAwLAkJLyogRXRoZXJuZXQgaGFyZHdhcmUgYWRkcmVzcy4gKi8KKwlNQVIwID0gOCwJCS8qIE11bHRpY2FzdCBmaWx0ZXIuICovCisJVHhTdGF0dXMwID0gMHgxMCwJLyogVHJhbnNtaXQgc3RhdHVzIChGb3VyIDMyYml0IHJlZ2lzdGVycykuICovCisJVHhBZGRyMCA9IDB4MjAsCQkvKiBUeCBkZXNjcmlwdG9ycyAoYWxzbyBmb3VyIDMyYml0KS4gKi8KKwlSeEJ1ZiA9IDB4MzAsCisJQ2hpcENtZCA9IDB4MzcsCisJUnhCdWZQdHIgPSAweDM4LAorCVJ4QnVmQWRkciA9IDB4M0EsCisJSW50ck1hc2sgPSAweDNDLAorCUludHJTdGF0dXMgPSAweDNFLAorCVR4Q29uZmlnID0gMHg0MCwKKwlSeENvbmZpZyA9IDB4NDQsCisJVGltZXIgPSAweDQ4LAkJLyogQSBnZW5lcmFsLXB1cnBvc2UgY291bnRlci4gKi8KKwlSeE1pc3NlZCA9IDB4NEMsCS8qIDI0IGJpdHMgdmFsaWQsIHdyaXRlIGNsZWFycy4gKi8KKwlDZmc5MzQ2ID0gMHg1MCwKKwlDb25maWcwID0gMHg1MSwKKwlDb25maWcxID0gMHg1MiwKKwlGbGFzaFJlZyA9IDB4NTQsCisJTWVkaWFTdGF0dXMgPSAweDU4LAorCUNvbmZpZzMgPSAweDU5LAorCUNvbmZpZzQgPSAweDVBLAkJLyogYWJzZW50IG9uIFJUTC04MTM5QSAqLworCUhsdENsayA9IDB4NUIsCisJTXVsdGlJbnRyID0gMHg1QywKKwlUeFN1bW1hcnkgPSAweDYwLAorCUJhc2ljTW9kZUN0cmwgPSAweDYyLAorCUJhc2ljTW9kZVN0YXR1cyA9IDB4NjQsCisJTldheUFkdmVydCA9IDB4NjYsCisJTldheUxQQVIgPSAweDY4LAorCU5XYXlFeHBhbnNpb24gPSAweDZBLAorCS8qIFVuZG9jdW1lbnRlZCByZWdpc3RlcnMsIGJ1dCByZXF1aXJlZCBmb3IgcHJvcGVyIG9wZXJhdGlvbi4gKi8KKwlGSUZPVE1TID0gMHg3MCwJCS8qIEZJRk8gQ29udHJvbCBhbmQgdGVzdC4gKi8KKwlDU0NSID0gMHg3NCwJCS8qIENoaXAgU3RhdHVzIGFuZCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLiAqLworCVBBUkE3OCA9IDB4NzgsCisJUEFSQTdjID0gMHg3YywJCS8qIE1hZ2ljIHRyYW5zY2VpdmVyIHBhcmFtZXRlciByZWdpc3Rlci4gKi8KKwlDb25maWc1ID0gMHhEOCwJCS8qIGFic2VudCBvbiBSVEwtODEzOUEgKi8KK307CisKK2VudW0gQ2xlYXJCaXRNYXNrcyB7CisJTXVsdGlJbnRyQ2xlYXIgPSAweEYwMDAsCisJQ2hpcENtZENsZWFyID0gMHhFMiwKKwlDb25maWcxQ2xlYXIgPSAoMTw8Nyl8KDE8PDYpfCgxPDwzKXwoMTw8Mil8KDE8PDEpLAorfTsKKworZW51bSBDaGlwQ21kQml0cyB7CisJQ21kUmVzZXQgPSAweDEwLAorCUNtZFJ4RW5iID0gMHgwOCwKKwlDbWRUeEVuYiA9IDB4MDQsCisJUnhCdWZFbXB0eSA9IDB4MDEsCit9OworCisvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgYml0cywgdXNpbmcgbXkgb3duIG1lYW5pbmdmdWwgbmFtZXMuICovCitlbnVtIEludHJTdGF0dXNCaXRzIHsKKwlQQ0lFcnIgPSAweDgwMDAsCisJUENTVGltZW91dCA9IDB4NDAwMCwKKwlSeEZJRk9PdmVyID0gMHg0MCwKKwlSeFVuZGVycnVuID0gMHgyMCwKKwlSeE92ZXJmbG93ID0gMHgxMCwKKwlUeEVyciA9IDB4MDgsCisJVHhPSyA9IDB4MDQsCisJUnhFcnIgPSAweDAyLAorCVJ4T0sgPSAweDAxLAorCisJUnhBY2tCaXRzID0gUnhGSUZPT3ZlciB8IFJ4T3ZlcmZsb3cgfCBSeE9LLAorfTsKKworZW51bSBUeFN0YXR1c0JpdHMgeworCVR4SG9zdE93bnMgPSAweDIwMDAsCisJVHhVbmRlcnJ1biA9IDB4NDAwMCwKKwlUeFN0YXRPSyA9IDB4ODAwMCwKKwlUeE91dE9mV2luZG93ID0gMHgyMDAwMDAwMCwKKwlUeEFib3J0ZWQgPSAweDQwMDAwMDAwLAorCVR4Q2Fycmllckxvc3QgPSAweDgwMDAwMDAwLAorfTsKK2VudW0gUnhTdGF0dXNCaXRzIHsKKwlSeE11bHRpY2FzdCA9IDB4ODAwMCwKKwlSeFBoeXNpY2FsID0gMHg0MDAwLAorCVJ4QnJvYWRjYXN0ID0gMHgyMDAwLAorCVJ4QmFkU3ltYm9sID0gMHgwMDIwLAorCVJ4UnVudCA9IDB4MDAxMCwKKwlSeFRvb0xvbmcgPSAweDAwMDgsCisJUnhDUkNFcnIgPSAweDAwMDQsCisJUnhCYWRBbGlnbiA9IDB4MDAwMiwKKwlSeFN0YXR1c09LID0gMHgwMDAxLAorfTsKKworLyogQml0cyBpbiBSeENvbmZpZy4gKi8KK2VudW0gcnhfbW9kZV9iaXRzIHsKKwlBY2NlcHRFcnIgPSAweDIwLAorCUFjY2VwdFJ1bnQgPSAweDEwLAorCUFjY2VwdEJyb2FkY2FzdCA9IDB4MDgsCisJQWNjZXB0TXVsdGljYXN0ID0gMHgwNCwKKwlBY2NlcHRNeVBoeXMgPSAweDAyLAorCUFjY2VwdEFsbFBoeXMgPSAweDAxLAorfTsKKworLyogQml0cyBpbiBUeENvbmZpZy4gKi8KK2VudW0gdHhfY29uZmlnX2JpdHMgeworCisgICAgICAgIC8qIEludGVyZnJhbWUgR2FwIFRpbWUuIE9ubHkgVHhJRkc5NiBkb2Vzbid0IHZpb2xhdGUgSUVFRSA4MDIuMyAqLworICAgICAgICBUeElGR1NoaWZ0ID0gMjQsCisgICAgICAgIFR4SUZHODQgPSAoMCA8PCBUeElGR1NoaWZ0KSwgICAgLyogOC40dXMgLyA4NDBucyAoMTAgLyAxMDBNYnBzKSAqLworICAgICAgICBUeElGRzg4ID0gKDEgPDwgVHhJRkdTaGlmdCksICAgIC8qIDguOHVzIC8gODgwbnMgKDEwIC8gMTAwTWJwcykgKi8KKyAgICAgICAgVHhJRkc5MiA9ICgyIDw8IFR4SUZHU2hpZnQpLCAgICAvKiA5LjJ1cyAvIDkyMG5zICgxMCAvIDEwME1icHMpICovCisgICAgICAgIFR4SUZHOTYgPSAoMyA8PCBUeElGR1NoaWZ0KSwgICAgLyogOS42dXMgLyA5NjBucyAoMTAgLyAxMDBNYnBzKSAqLworCisJVHhMb29wQmFjayA9ICgxIDw8IDE4KSB8ICgxIDw8IDE3KSwgLyogZW5hYmxlIGxvb3BiYWNrIHRlc3QgbW9kZSAqLworCVR4Q1JDID0gKDEgPDwgMTYpLAkvKiBESVNBQkxFIGFwcGVuZGluZyBDUkMgdG8gZW5kIG9mIFR4IHBhY2tldHMgKi8KKwlUeENsZWFyQWJ0ID0gKDEgPDwgMCksCS8qIENsZWFyIGFib3J0IChXTykgKi8KKwlUeERNQVNoaWZ0ID0gOCwJCS8qIERNQSBidXJzdCB2YWx1ZSAoMC03KSBpcyBzaGlmdGVkIHRoaXMgbWFueSBiaXRzICovCisJVHhSZXRyeVNoaWZ0ID0gNCwJLyogVFhSUiB2YWx1ZSAoMC0xNSkgaXMgc2hpZnRlZCB0aGlzIG1hbnkgYml0cyAqLworCisJVHhWZXJzaW9uTWFzayA9IDB4N0M4MDAwMDAsIC8qIG1hc2sgb3V0IHZlcnNpb24gYml0cyAzMC0yNiwgMjMgKi8KK307CisKKy8qIEJpdHMgaW4gQ29uZmlnMSAqLworZW51bSBDb25maWcxQml0cyB7CisJQ2ZnMV9QTV9FbmFibGUgPSAweDAxLAorCUNmZzFfVlBEX0VuYWJsZSA9IDB4MDIsCisJQ2ZnMV9QSU8gPSAweDA0LAorCUNmZzFfTU1JTyA9IDB4MDgsCisJTFdBS0UgPSAweDEwLAkJLyogbm90IG9uIDgxMzksIDgxMzlBICovCisJQ2ZnMV9Ecml2ZXJfTG9hZCA9IDB4MjAsCisJQ2ZnMV9MRUQwID0gMHg0MCwKKwlDZmcxX0xFRDEgPSAweDgwLAorCVNMRUVQID0gKDEgPDwgMSksCS8qIG9ubHkgb24gODEzOSwgODEzOUEgKi8KKwlQV1JETiA9ICgxIDw8IDApLAkvKiBvbmx5IG9uIDgxMzksIDgxMzlBICovCit9OworCisvKiBCaXRzIGluIENvbmZpZzMgKi8KK2VudW0gQ29uZmlnM0JpdHMgeworCUNmZzNfRkJ0QkVuICAgID0gKDEgPDwgMCksIC8qIDEgPSBGYXN0IEJhY2sgdG8gQmFjayAqLworCUNmZzNfRnVuY1JlZ0VuID0gKDEgPDwgMSksIC8qIDEgPSBlbmFibGUgQ2FyZEJ1cyBGdW5jdGlvbiByZWdpc3RlcnMgKi8KKwlDZmczX0NMS1JVTl9FbiA9ICgxIDw8IDIpLCAvKiAxID0gZW5hYmxlIENMS1JVTiAqLworCUNmZzNfQ2FyZEJfRW4gID0gKDEgPDwgMyksIC8qIDEgPSBlbmFibGUgQ2FyZEJ1cyByZWdpc3RlcnMgKi8KKwlDZmczX0xpbmtVcCAgICA9ICgxIDw8IDQpLCAvKiAxID0gd2FrZSB1cCBvbiBsaW5rIHVwICovCisJQ2ZnM19NYWdpYyAgICAgPSAoMSA8PCA1KSwgLyogMSA9IHdha2UgdXAgb24gTWFnaWMgUGFja2V0ICh0bSkgKi8KKwlDZmczX1BBUk1fRW4gICA9ICgxIDw8IDYpLCAvKiAwID0gc29mdHdhcmUgY2FuIHNldCB0d2lzdGVyIHBhcmFtZXRlcnMgKi8KKwlDZmczX0dOVFNlbCAgICA9ICgxIDw8IDcpLCAvKiAxID0gZGVsYXkgMSBjbG9jayBmcm9tIFBDSSBHTlQgc2lnbmFsICovCit9OworCisvKiBCaXRzIGluIENvbmZpZzQgKi8KK2VudW0gQ29uZmlnNEJpdHMgeworCUxXUFROID0gKDEgPDwgMiksCS8qIG5vdCBvbiA4MTM5LCA4MTM5QSAqLworfTsKKworLyogQml0cyBpbiBDb25maWc1ICovCitlbnVtIENvbmZpZzVCaXRzIHsKKwlDZmc1X1BNRV9TVFMgICAgID0gKDEgPDwgMCksIC8qIDEgPSBQQ0kgcmVzZXQgcmVzZXRzIFBNRV9TdGF0dXMgKi8KKwlDZmc1X0xBTldha2UgICAgID0gKDEgPDwgMSksIC8qIDEgPSBlbmFibGUgTEFOV2FrZSBzaWduYWwgKi8KKwlDZmc1X0xEUFMgICAgICAgID0gKDEgPDwgMiksIC8qIDAgPSBzYXZlIHBvd2VyIHdoZW4gbGluayBpcyBkb3duICovCisJQ2ZnNV9GSUZPQWRkclB0ciA9ICgxIDw8IDMpLCAvKiBSZWFsdGVrIGludGVybmFsIFNSQU0gdGVzdGluZyAqLworCUNmZzVfVVdGICAgICAgICAgPSAoMSA8PCA0KSwgLyogMSA9IGFjY2VwdCB1bmljYXN0IHdha2V1cCBmcmFtZSAqLworCUNmZzVfTVdGICAgICAgICAgPSAoMSA8PCA1KSwgLyogMSA9IGFjY2VwdCBtdWx0aWNhc3Qgd2FrZXVwIGZyYW1lICovCisJQ2ZnNV9CV0YgICAgICAgICA9ICgxIDw8IDYpLCAvKiAxID0gYWNjZXB0IGJyb2FkY2FzdCB3YWtldXAgZnJhbWUgKi8KK307CisKK2VudW0gUnhDb25maWdCaXRzIHsKKwkvKiByeCBmaWZvIHRocmVzaG9sZCAqLworCVJ4Q2ZnRklGT1NoaWZ0ID0gMTMsCisJUnhDZmdGSUZPTm9uZSA9ICg3IDw8IFJ4Q2ZnRklGT1NoaWZ0KSwKKworCS8qIE1heCBETUEgYnVyc3QgKi8KKwlSeENmZ0RNQVNoaWZ0ID0gOCwKKwlSeENmZ0RNQVVubGltaXRlZCA9ICg3IDw8IFJ4Q2ZnRE1BU2hpZnQpLAorCisJLyogcnggcmluZyBidWZmZXIgbGVuZ3RoICovCisJUnhDZmdSY3Y4SyA9IDAsCisJUnhDZmdSY3YxNksgPSAoMSA8PCAxMSksCisJUnhDZmdSY3YzMksgPSAoMSA8PCAxMiksCisJUnhDZmdSY3Y2NEsgPSAoMSA8PCAxMSkgfCAoMSA8PCAxMiksCisKKwkvKiBEaXNhYmxlIHBhY2tldCB3cmFwIGF0IGVuZCBvZiBSeCBidWZmZXIuIChub3QgcG9zc2libGUgd2l0aCA2NGspICovCisJUnhOb1dyYXAgPSAoMSA8PCA3KSwKK307CisKKy8qIFR3aXN0ZXIgdHVuaW5nIHBhcmFtZXRlcnMgZnJvbSBSZWFsVGVrLgorICAgQ29tcGxldGVseSB1bmRvY3VtZW50ZWQsIGJ1dCByZXF1aXJlZCB0byB0dW5lIGJhZCBsaW5rcyBvbiBzb21lIGJvYXJkcy4gKi8KK2VudW0gQ1NDUkJpdHMgeworCUNTQ1JfTGlua09LQml0ID0gMHgwNDAwLAorCUNTQ1JfTGlua0NoYW5nZUJpdCA9IDB4MDgwMCwKKwlDU0NSX0xpbmtTdGF0dXNCaXRzID0gMHgwZjAwMCwKKwlDU0NSX0xpbmtEb3duT2ZmQ21kID0gMHgwMDNjMCwKKwlDU0NSX0xpbmtEb3duQ21kID0gMHgwZjNjMCwKK307CisKK2VudW0gQ2ZnOTM0NkJpdHMgeworCUNmZzkzNDZfTG9jayA9IDB4MDAsCisJQ2ZnOTM0Nl9VbmxvY2sgPSAweEMwLAorfTsKKwordHlwZWRlZiBlbnVtIHsKKwlDSF84MTM5ID0gMCwKKwlDSF84MTM5X0ssCisJQ0hfODEzOUEsCisJQ0hfODEzOUFfRywKKwlDSF84MTM5QiwKKwlDSF84MTMwLAorCUNIXzgxMzlDLAorCUNIXzgxMDAsCisJQ0hfODEwMEJfODEzOUQsCisJQ0hfODEwMSwKK30gY2hpcF90OworCitlbnVtIGNoaXBfZmxhZ3MgeworCUhhc0hsdENsayA9ICgxIDw8IDApLAorCUhhc0xXYWtlID0gKDEgPDwgMSksCit9OworCisjZGVmaW5lIEhXX1JFVklEKGIzMCwgYjI5LCBiMjgsIGIyNywgYjI2LCBiMjMsIGIyMikgXAorCShiMzA8PDMwIHwgYjI5PDwyOSB8IGIyODw8MjggfCBiMjc8PDI3IHwgYjI2PDwyNiB8IGIyMzw8MjMgfCBiMjI8PDIyKQorI2RlZmluZSBIV19SRVZJRF9NQVNLCUhXX1JFVklEKDEsIDEsIDEsIDEsIDEsIDEsIDEpCisKKy8qIGRpcmVjdGx5IGluZGV4ZWQgYnkgY2hpcF90LCBhYm92ZSAqLworY29uc3Qgc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1MzIgdmVyc2lvbjsgLyogZnJvbSBSVEw4MTM5Qy9SVEw4MTM5RCBkb2NzICovCisJdTMyIGZsYWdzOworfSBydGxfY2hpcF9pbmZvW10gPSB7CisJeyAiUlRMLTgxMzkiLAorCSAgSFdfUkVWSUQoMSwgMCwgMCwgMCwgMCwgMCwgMCksCisJICBIYXNIbHRDbGssCisJfSwKKworCXsgIlJUTC04MTM5IHJldiBLIiwKKwkgIEhXX1JFVklEKDEsIDEsIDAsIDAsIDAsIDAsIDApLAorCSAgSGFzSGx0Q2xrLAorCX0sCisKKwl7ICJSVEwtODEzOUEiLAorCSAgSFdfUkVWSUQoMSwgMSwgMSwgMCwgMCwgMCwgMCksCisJICBIYXNIbHRDbGssIC8qIFhYWCB1bmRvY3VtZW50ZWQ/ICovCisJfSwKKworCXsgIlJUTC04MTM5QSByZXYgRyIsCisJICBIV19SRVZJRCgxLCAxLCAxLCAwLCAwLCAxLCAwKSwKKwkgIEhhc0hsdENsaywgLyogWFhYIHVuZG9jdW1lbnRlZD8gKi8KKwl9LAorCisJeyAiUlRMLTgxMzlCIiwKKwkgIEhXX1JFVklEKDEsIDEsIDEsIDEsIDAsIDAsIDApLAorCSAgSGFzTFdha2UsCisJfSwKKworCXsgIlJUTC04MTMwIiwKKwkgIEhXX1JFVklEKDEsIDEsIDEsIDEsIDEsIDAsIDApLAorCSAgSGFzTFdha2UsCisJfSwKKworCXsgIlJUTC04MTM5QyIsCisJICBIV19SRVZJRCgxLCAxLCAxLCAwLCAxLCAwLCAwKSwKKwkgIEhhc0xXYWtlLAorCX0sCisKKwl7ICJSVEwtODEwMCIsCisJICBIV19SRVZJRCgxLCAxLCAxLCAxLCAwLCAxLCAwKSwKKyAJICBIYXNMV2FrZSwKKyAJfSwKKworCXsgIlJUTC04MTAwQi84MTM5RCIsCisJICBIV19SRVZJRCgxLCAxLCAxLCAwLCAxLCAwLCAxKSwKKwkgIEhhc0xXYWtlLAorCX0sCisKKwl7ICJSVEwtODEwMSIsCisJICBIV19SRVZJRCgxLCAxLCAxLCAwLCAxLCAxLCAxKSwKKwkgIEhhc0xXYWtlLAorCX0sCit9OworCitzdHJ1Y3QgcnRsX2V4dHJhX3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIGVhcmx5X3J4OworCXVuc2lnbmVkIGxvbmcgdHhfYnVmX21hcHBlZDsKKwl1bnNpZ25lZCBsb25nIHR4X3RpbWVvdXRzOworCXVuc2lnbmVkIGxvbmcgcnhfbG9zdF9pbl9yaW5nOworfTsKKworc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSB7CisJdm9pZCAqbW1pb19hZGRyOworCWludCBkcnZfZmxhZ3M7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJdTMyIG1zZ19lbmFibGU7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdW5zaWduZWQgY2hhciAqcnhfcmluZzsKKwl1bnNpZ25lZCBpbnQgY3VyX3J4OwkvKiBJbmRleCBpbnRvIHRoZSBSeCBidWZmZXIgb2YgbmV4dCBSeCBwa3QuICovCisJdW5zaWduZWQgaW50IHR4X2ZsYWc7CisJdW5zaWduZWQgbG9uZyBjdXJfdHg7CisJdW5zaWduZWQgbG9uZyBkaXJ0eV90eDsKKwl1bnNpZ25lZCBjaGFyICp0eF9idWZbTlVNX1RYX0RFU0NdOwkvKiBUeCBib3VuY2UgYnVmZmVycyAqLworCXVuc2lnbmVkIGNoYXIgKnR4X2J1ZnM7CS8qIFR4IGJvdW5jZSBidWZmZXIgcmVnaW9uLiAqLworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCB0eF9idWZzX2RtYTsKKwlzaWduZWQgY2hhciBwaHlzWzRdOwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisJY2hhciB0d2lzdGllLCB0d2lzdF9yb3csIHR3aXN0X2NvbDsJLyogVHdpc3RlciB0dW5lIHN0YXRlLiAqLworCXVuc2lnbmVkIGludCBkZWZhdWx0X3BvcnQ6NDsJLyogTGFzdCBkZXYtPmlmX3BvcnQgdmFsdWUuICovCisJc3BpbmxvY2tfdCBsb2NrOworCXNwaW5sb2NrX3QgcnhfbG9jazsKKwljaGlwX3QgY2hpcHNldDsKKwlwaWRfdCB0aHJfcGlkOworCXdhaXRfcXVldWVfaGVhZF90IHRocl93YWl0OworCXN0cnVjdCBjb21wbGV0aW9uIHRocl9leGl0ZWQ7CisJdTMyIHJ4X2NvbmZpZzsKKwlzdHJ1Y3QgcnRsX2V4dHJhX3N0YXRzIHhzdGF0czsKKwlpbnQgdGltZV90b19kaWU7CisJc3RydWN0IG1paV9pZl9pbmZvIG1paTsKKwl1bnNpZ25lZCBpbnQgcmVnc19sZW47CisJdW5zaWduZWQgbG9uZyBmaWZvX2NvcHlfdGltZW91dDsKK307CisKK01PRFVMRV9BVVRIT1IgKCJKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJSZWFsVGVrIFJUTC04MTM5IEZhc3QgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9wYXJhbShtdWx0aWNhc3RfZmlsdGVyX2xpbWl0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG1lZGlhLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyAoZGVidWcsICI4MTM5dG9vIGJpdG1hcHBlZCBtZXNzYWdlIGVuYWJsZSBudW1iZXIiKTsKK01PRFVMRV9QQVJNX0RFU0MgKG11bHRpY2FzdF9maWx0ZXJfbGltaXQsICI4MTM5dG9vIG1heGltdW0gbnVtYmVyIG9mIGZpbHRlcmVkIG11bHRpY2FzdCBhZGRyZXNzZXMiKTsKK01PRFVMRV9QQVJNX0RFU0MgKG1lZGlhLCAiODEzOXRvbzogQml0cyA0Kzk6IGZvcmNlIGZ1bGwgZHVwbGV4LCBiaXQgNTogMTAwTWJwcyIpOworTU9EVUxFX1BBUk1fREVTQyAoZnVsbF9kdXBsZXgsICI4MTM5dG9vOiBGb3JjZSBmdWxsIGR1cGxleCBmb3IgYm9hcmQocykgKDEpIik7CisKK3N0YXRpYyBpbnQgcmVhZF9lZXByb20gKHZvaWQgKmlvYWRkciwgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pOworc3RhdGljIGludCBydGw4MTM5X29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtZGlvX3JlYWQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sCisJCQlpbnQgdmFsKTsKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfc3RhcnRfdGhyZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcnRsODEzOV90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfaW5pdF9yaW5nIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcnRsODEzOV9zdGFydF94bWl0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBydGw4MTM5X3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBydGw4MTM5X3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorc3RhdGljIGlycXJldHVybl90IHJ0bDgxMzlfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBydGw4MTM5X2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0ZGV2X2lvY3RsIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnRsODEzOV9nZXRfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcnRsODEzOV9zZXRfcnhfbW9kZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBfX3NldF9yeF9tb2RlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfaHdfc3RhcnQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBydGw4MTM5X2V0aHRvb2xfb3BzOworCisjaWZkZWYgVVNFX0lPX09QUworCisjZGVmaW5lIFJUTF9SOChyZWcpCQlpbmIgKCgodW5zaWduZWQgbG9uZylpb2FkZHIpICsgKHJlZykpCisjZGVmaW5lIFJUTF9SMTYocmVnKQkJaW53ICgoKHVuc2lnbmVkIGxvbmcpaW9hZGRyKSArIChyZWcpKQorI2RlZmluZSBSVExfUjMyKHJlZykJCSgodW5zaWduZWQgbG9uZykgaW5sICgoKHVuc2lnbmVkIGxvbmcpaW9hZGRyKSArIChyZWcpKSkKKyNkZWZpbmUgUlRMX1c4KHJlZywgdmFsOCkJb3V0YiAoKHZhbDgpLCAoKHVuc2lnbmVkIGxvbmcpaW9hZGRyKSArIChyZWcpKQorI2RlZmluZSBSVExfVzE2KHJlZywgdmFsMTYpCW91dHcgKCh2YWwxNiksICgodW5zaWduZWQgbG9uZylpb2FkZHIpICsgKHJlZykpCisjZGVmaW5lIFJUTF9XMzIocmVnLCB2YWwzMikJb3V0bCAoKHZhbDMyKSwgKCh1bnNpZ25lZCBsb25nKWlvYWRkcikgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1c4X0YJCVJUTF9XOAorI2RlZmluZSBSVExfVzE2X0YJCVJUTF9XMTYKKyNkZWZpbmUgUlRMX1czMl9GCQlSVExfVzMyCisjdW5kZWYgcmVhZGIKKyN1bmRlZiByZWFkdworI3VuZGVmIHJlYWRsCisjdW5kZWYgd3JpdGViCisjdW5kZWYgd3JpdGV3CisjdW5kZWYgd3JpdGVsCisjZGVmaW5lIHJlYWRiKGFkZHIpIGluYigodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHJlYWR3KGFkZHIpIGludygodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHJlYWRsKGFkZHIpIGlubCgodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHdyaXRlYih2YWwsYWRkcikgb3V0YigodmFsKSwodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHdyaXRldyh2YWwsYWRkcikgb3V0dygodmFsKSwodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHdyaXRlbCh2YWwsYWRkcikgb3V0bCgodmFsKSwodW5zaWduZWQgbG9uZykoYWRkcikpCisKKyNlbHNlCisKKy8qIHdyaXRlIE1NSU8gcmVnaXN0ZXIsIHdpdGggZmx1c2ggKi8KKy8qIEZsdXNoIGF2b2lkcyBydGw4MTM5IGJ1ZyB3LyBwb3N0ZWQgTU1JTyB3cml0ZXMgKi8KKyNkZWZpbmUgUlRMX1c4X0YocmVnLCB2YWw4KQlkbyB7IHdyaXRlYiAoKHZhbDgpLCBpb2FkZHIgKyAocmVnKSk7IHJlYWRiIChpb2FkZHIgKyAocmVnKSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIFJUTF9XMTZfRihyZWcsIHZhbDE2KQlkbyB7IHdyaXRldyAoKHZhbDE2KSwgaW9hZGRyICsgKHJlZykpOyByZWFkdyAoaW9hZGRyICsgKHJlZykpOyB9IHdoaWxlICgwKQorI2RlZmluZSBSVExfVzMyX0YocmVnLCB2YWwzMikJZG8geyB3cml0ZWwgKCh2YWwzMiksIGlvYWRkciArIChyZWcpKTsgcmVhZGwgKGlvYWRkciArIChyZWcpKTsgfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIE1NSU9fRkxVU0hfQVVESVRfQ09NUExFVEUgMQorI2lmIE1NSU9fRkxVU0hfQVVESVRfQ09NUExFVEUKKworLyogd3JpdGUgTU1JTyByZWdpc3RlciAqLworI2RlZmluZSBSVExfVzgocmVnLCB2YWw4KQl3cml0ZWIgKCh2YWw4KSwgaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9XMTYocmVnLCB2YWwxNikJd3JpdGV3ICgodmFsMTYpLCBpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1czMihyZWcsIHZhbDMyKQl3cml0ZWwgKCh2YWwzMiksIGlvYWRkciArIChyZWcpKQorCisjZWxzZQorCisvKiB3cml0ZSBNTUlPIHJlZ2lzdGVyLCB0aGVuIGZsdXNoICovCisjZGVmaW5lIFJUTF9XOAkJUlRMX1c4X0YKKyNkZWZpbmUgUlRMX1cxNgkJUlRMX1cxNl9GCisjZGVmaW5lIFJUTF9XMzIJCVJUTF9XMzJfRgorCisjZW5kaWYgLyogTU1JT19GTFVTSF9BVURJVF9DT01QTEVURSAqLworCisvKiByZWFkIE1NSU8gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRMX1I4KHJlZykJCXJlYWRiIChpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1IxNihyZWcpCQlyZWFkdyAoaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9SMzIocmVnKQkJKCh1bnNpZ25lZCBsb25nKSByZWFkbCAoaW9hZGRyICsgKHJlZykpKQorCisjZW5kaWYgLyogVVNFX0lPX09QUyAqLworCisKK3N0YXRpYyBjb25zdCB1MTYgcnRsODEzOV9pbnRyX21hc2sgPQorCVBDSUVyciB8IFBDU1RpbWVvdXQgfCBSeFVuZGVycnVuIHwgUnhPdmVyZmxvdyB8IFJ4RklGT092ZXIgfAorCVR4RXJyIHwgVHhPSyB8IFJ4RXJyIHwgUnhPSzsKKworc3RhdGljIGNvbnN0IHUxNiBydGw4MTM5X25vcnhfaW50cl9tYXNrID0KKwlQQ0lFcnIgfCBQQ1NUaW1lb3V0IHwgUnhVbmRlcnJ1biB8CisJVHhFcnIgfCBUeE9LIHwgUnhFcnIgOworCisjaWYgUlhfQlVGX0lEWCA9PSAwCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ0bDgxMzlfcnhfY29uZmlnID0KKwlSeENmZ1JjdjhLIHwgUnhOb1dyYXAgfAorCShSWF9GSUZPX1RIUkVTSCA8PCBSeENmZ0ZJRk9TaGlmdCkgfAorCShSWF9ETUFfQlVSU1QgPDwgUnhDZmdETUFTaGlmdCk7CisjZWxpZiBSWF9CVUZfSURYID09IDEKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnRsODEzOV9yeF9jb25maWcgPQorCVJ4Q2ZnUmN2MTZLIHwgUnhOb1dyYXAgfAorCShSWF9GSUZPX1RIUkVTSCA8PCBSeENmZ0ZJRk9TaGlmdCkgfAorCShSWF9ETUFfQlVSU1QgPDwgUnhDZmdETUFTaGlmdCk7CisjZWxpZiBSWF9CVUZfSURYID09IDIKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnRsODEzOV9yeF9jb25maWcgPQorCVJ4Q2ZnUmN2MzJLIHwgUnhOb1dyYXAgfAorCShSWF9GSUZPX1RIUkVTSCA8PCBSeENmZ0ZJRk9TaGlmdCkgfAorCShSWF9ETUFfQlVSU1QgPDwgUnhDZmdETUFTaGlmdCk7CisjZWxpZiBSWF9CVUZfSURYID09IDMKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnRsODEzOV9yeF9jb25maWcgPQorCVJ4Q2ZnUmN2NjRLIHwKKwkoUlhfRklGT19USFJFU0ggPDwgUnhDZmdGSUZPU2hpZnQpIHwKKwkoUlhfRE1BX0JVUlNUIDw8IFJ4Q2ZnRE1BU2hpZnQpOworI2Vsc2UKKyNlcnJvciAiSW52YWxpZCBjb25maWd1cmF0aW9uIGZvciA4MTM5X1JYQlVGX0lEWCIKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ0bDgxMzlfdHhfY29uZmlnID0KKwlUeElGRzk2IHwgKFRYX0RNQV9CVVJTVCA8PCBUeERNQVNoaWZ0KSB8IChUWF9SRVRSWSA8PCBUeFJldHJ5U2hpZnQpOworCitzdGF0aWMgdm9pZCBfX3J0bDgxMzlfY2xlYW51cF9kZXYgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJYXNzZXJ0IChkZXYgIT0gTlVMTCk7CisJYXNzZXJ0ICh0cC0+cGNpX2RldiAhPSBOVUxMKTsKKwlwZGV2ID0gdHAtPnBjaV9kZXY7CisKKyNpZm5kZWYgVVNFX0lPX09QUworCWlmICh0cC0+bW1pb19hZGRyKQorCQlpb3VubWFwICh0cC0+bW1pb19hZGRyKTsKKyNlbmRpZiAvKiAhVVNFX0lPX09QUyAqLworCisJLyogaXQncyBvayB0byBjYWxsIHRoaXMgZXZlbiBpZiB3ZSBoYXZlIG5vIHJlZ2lvbnMgdG8gZnJlZSAqLworCXBjaV9yZWxlYXNlX3JlZ2lvbnMgKHBkZXYpOworCisJZnJlZV9uZXRkZXYoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEgKHBkZXYsIE5VTEwpOworfQorCisKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfY2hpcF9yZXNldCAodm9pZCAqaW9hZGRyKQoreworCWludCBpOworCisJLyogU29mdCByZXNldCB0aGUgY2hpcC4gKi8KKwlSVExfVzggKENoaXBDbWQsIENtZFJlc2V0KTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGNoaXAgaGFzIGZpbmlzaGVkIHRoZSByZXNldC4gKi8KKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKSB7CisJCWJhcnJpZXIoKTsKKwkJaWYgKChSVExfUjggKENoaXBDbWQpICYgQ21kUmVzZXQpID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5ICgxMCk7CisJfQorfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxMzlfaW5pdF9ib2FyZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqKmRldl9vdXQpCit7CisJdm9pZCAqaW9hZGRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHA7CisJdTggdG1wODsKKwlpbnQgcmMsIGRpc2FibGVfZGV2X29uX2VyciA9IDA7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgbG9uZyBwaW9fc3RhcnQsIHBpb19lbmQsIHBpb19mbGFncywgcGlvX2xlbjsKKwl1bnNpZ25lZCBsb25nIG1taW9fc3RhcnQsIG1taW9fZW5kLCBtbWlvX2ZsYWdzLCBtbWlvX2xlbjsKKwl1MzIgdmVyc2lvbjsKKworCWFzc2VydCAocGRldiAhPSBOVUxMKTsKKworCSpkZXZfb3V0ID0gTlVMTDsKKworCS8qIGRldiBhbmQgcHJpdiB6ZXJvZWQgaW4gYWxsb2NfZXRoZXJkZXYgKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldiAoc2l6ZW9mICgqdHApKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIiVzOiBVbmFibGUgdG8gYWxsb2MgbmV3IG5ldCBkZXZpY2VcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXRwLT5wY2lfZGV2ID0gcGRldjsKKworCS8qIGVuYWJsZSBkZXZpY2UgKGluY2wuIFBDSSBQTSB3YWtldXAgYW5kIGhvdHBsdWcgc2V0dXApICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZSAocGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXQ7CisKKwlwaW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDApOworCXBpb19lbmQgPSBwY2lfcmVzb3VyY2VfZW5kIChwZGV2LCAwKTsKKwlwaW9fZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MgKHBkZXYsIDApOworCXBpb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuIChwZGV2LCAwKTsKKworCW1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDEpOworCW1taW9fZW5kID0gcGNpX3Jlc291cmNlX2VuZCAocGRldiwgMSk7CisJbW1pb19mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyAocGRldiwgMSk7CisJbW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuIChwZGV2LCAxKTsKKworCS8qIHNldCB0aGlzIGltbWVkaWF0ZWx5LCB3ZSBuZWVkIHRvIGtub3cgYmVmb3JlCisJICogd2UgdGFsayB0byB0aGUgY2hpcCBkaXJlY3RseSAqLworCURQUklOVEsoIlBJTyByZWdpb24gc2l6ZSA9PSAweCUwMlhcbiIsIHBpb19sZW4pOworCURQUklOVEsoIk1NSU8gcmVnaW9uIHNpemUgPT0gMHglMDJsWFxuIiwgbW1pb19sZW4pOworCisjaWZkZWYgVVNFX0lPX09QUworCS8qIG1ha2Ugc3VyZSBQQ0kgYmFzZSBhZGRyIDAgaXMgUElPICovCisJaWYgKCEocGlvX2ZsYWdzICYgSU9SRVNPVVJDRV9JTykpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIiVzOiByZWdpb24gIzAgbm90IGEgUElPIHJlc291cmNlLCBhYm9ydGluZ1xuIiwgcGNpX25hbWUocGRldikpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogY2hlY2sgZm9yIHdlaXJkL2Jyb2tlbiBQQ0kgcmVnaW9uIHJlcG9ydGluZyAqLworCWlmIChwaW9fbGVuIDwgUlRMX01JTl9JT19TSVpFKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICIlczogSW52YWxpZCBQQ0kgSS9PIHJlZ2lvbiBzaXplKHMpLCBhYm9ydGluZ1xuIiwgcGNpX25hbWUocGRldikpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisjZWxzZQorCS8qIG1ha2Ugc3VyZSBQQ0kgYmFzZSBhZGRyIDEgaXMgTU1JTyAqLworCWlmICghKG1taW9fZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIiVzOiByZWdpb24gIzEgbm90IGFuIE1NSU8gcmVzb3VyY2UsIGFib3J0aW5nXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAobW1pb19sZW4gPCBSVExfTUlOX0lPX1NJWkUpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIiVzOiBJbnZhbGlkIFBDSSBtZW0gcmVnaW9uIHNpemUocyksIGFib3J0aW5nXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKyNlbmRpZgorCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zIChwZGV2LCAiODEzOXRvbyIpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCWRpc2FibGVfZGV2X29uX2VyciA9IDE7CisKKwkvKiBlbmFibGUgUENJIGJ1cy1tYXN0ZXJpbmcgKi8KKwlwY2lfc2V0X21hc3RlciAocGRldik7CisKKyNpZmRlZiBVU0VfSU9fT1BTCisJaW9hZGRyID0gKHZvaWQgKikgcGlvX3N0YXJ0OworCWRldi0+YmFzZV9hZGRyID0gcGlvX3N0YXJ0OworCXRwLT5tbWlvX2FkZHIgPSBpb2FkZHI7CisJdHAtPnJlZ3NfbGVuID0gcGlvX2xlbjsKKyNlbHNlCisJLyogaW9yZW1hcCBNTUlPIHJlZ2lvbiAqLworCWlvYWRkciA9IGlvcmVtYXAgKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKKwlpZiAoaW9hZGRyID09IE5VTEwpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIiVzOiBjYW5ub3QgcmVtYXAgTU1JTywgYWJvcnRpbmdcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWRldi0+YmFzZV9hZGRyID0gKGxvbmcpIGlvYWRkcjsKKwl0cC0+bW1pb19hZGRyID0gaW9hZGRyOworCXRwLT5yZWdzX2xlbiA9IG1taW9fbGVuOworI2VuZGlmIC8qIFVTRV9JT19PUFMgKi8KKworCS8qIEJyaW5nIG9sZCBjaGlwcyBvdXQgb2YgbG93LXBvd2VyIG1vZGUuICovCisJUlRMX1c4IChIbHRDbGssICdSJyk7CisKKwkvKiBjaGVjayBmb3IgbWlzc2luZy9icm9rZW4gaGFyZHdhcmUgKi8KKwlpZiAoUlRMX1IzMiAoVHhDb25maWcpID09IDB4RkZGRkZGRkYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIiVzOiBDaGlwIG5vdCByZXNwb25kaW5nLCBpZ25vcmluZyBib2FyZFxuIiwKKwkJCXBjaV9uYW1lKHBkZXYpKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogaWRlbnRpZnkgY2hpcCBhdHRhY2hlZCB0byBib2FyZCAqLworCXZlcnNpb24gPSBSVExfUjMyIChUeENvbmZpZykgJiBIV19SRVZJRF9NQVNLOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFIChydGxfY2hpcF9pbmZvKTsgaSsrKQorCQlpZiAodmVyc2lvbiA9PSBydGxfY2hpcF9pbmZvW2ldLnZlcnNpb24pIHsKKwkJCXRwLT5jaGlwc2V0ID0gaTsKKwkJCWdvdG8gbWF0Y2g7CisJCX0KKworCS8qIGlmIHVua25vd24gY2hpcCwgYXNzdW1lIGFycmF5IGVsZW1lbnQgIzAsIG9yaWdpbmFsIFJUTC04MTM5IGluIHRoaXMgY2FzZSAqLworCXByaW50ayAoS0VSTl9ERUJVRyBQRlggIiVzOiB1bmtub3duIGNoaXAgdmVyc2lvbiwgYXNzdW1pbmcgUlRMLTgxMzlcbiIsCisJCXBjaV9uYW1lKHBkZXYpKTsKKwlwcmludGsgKEtFUk5fREVCVUcgUEZYICIlczogVHhDb25maWcgPSAweCVseFxuIiwgcGNpX25hbWUocGRldiksIFJUTF9SMzIgKFR4Q29uZmlnKSk7CisJdHAtPmNoaXBzZXQgPSAwOworCittYXRjaDoKKwlEUFJJTlRLICgiY2hpcHNldCBpZCAoJWQpID09IGluZGV4ICVkLCAnJXMnXG4iLAorCQkgdmVyc2lvbiwgaSwgcnRsX2NoaXBfaW5mb1tpXS5uYW1lKTsKKworCWlmICh0cC0+Y2hpcHNldCA+PSBDSF84MTM5QikgeworCQl1OCBuZXdfdG1wOCA9IHRtcDggPSBSVExfUjggKENvbmZpZzEpOworCQlEUFJJTlRLKCJQQ0kgUE0gd2FrZXVwXG4iKTsKKwkJaWYgKChydGxfY2hpcF9pbmZvW3RwLT5jaGlwc2V0XS5mbGFncyAmIEhhc0xXYWtlKSAmJgorCQkgICAgKHRtcDggJiBMV0FLRSkpCisJCQluZXdfdG1wOCAmPSB+TFdBS0U7CisJCW5ld190bXA4IHw9IENmZzFfUE1fRW5hYmxlOworCQlpZiAobmV3X3RtcDggIT0gdG1wOCkgeworCQkJUlRMX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJCQlSVExfVzggKENvbmZpZzEsIHRtcDgpOworCQkJUlRMX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCQl9CisJCWlmIChydGxfY2hpcF9pbmZvW3RwLT5jaGlwc2V0XS5mbGFncyAmIEhhc0xXYWtlKSB7CisJCQl0bXA4ID0gUlRMX1I4IChDb25maWc0KTsKKwkJCWlmICh0bXA4ICYgTFdQVE4pIHsKKwkJCQlSVExfVzggKENmZzkzNDYsIENmZzkzNDZfVW5sb2NrKTsKKwkJCQlSVExfVzggKENvbmZpZzQsIHRtcDggJiB+TFdQVE4pOworCQkJCVJUTF9XOCAoQ2ZnOTM0NiwgQ2ZnOTM0Nl9Mb2NrKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCURQUklOVEsoIk9sZCBjaGlwIHdha2V1cFxuIik7CisJCXRtcDggPSBSVExfUjggKENvbmZpZzEpOworCQl0bXA4ICY9IH4oU0xFRVAgfCBQV1JETik7CisJCVJUTF9XOCAoQ29uZmlnMSwgdG1wOCk7CisJfQorCisJcnRsODEzOV9jaGlwX3Jlc2V0IChpb2FkZHIpOworCisJKmRldl9vdXQgPSBkZXY7CisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJX19ydGw4MTM5X2NsZWFudXBfZGV2IChkZXYpOworCWlmIChkaXNhYmxlX2Rldl9vbl9lcnIpCisJCXBjaV9kaXNhYmxlX2RldmljZSAocGRldik7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxMzlfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwOworCWludCBpLCBhZGRyX2xlbiwgb3B0aW9uOworCXZvaWQgKmlvYWRkcjsKKwlzdGF0aWMgaW50IGJvYXJkX2lkeCA9IC0xOworCXU4IHBjaV9yZXY7CisKKwlhc3NlcnQgKHBkZXYgIT0gTlVMTCk7CisJYXNzZXJ0IChlbnQgIT0gTlVMTCk7CisKKwlib2FyZF9pZHgrKzsKKworCS8qIHdoZW4gd2UncmUgYnVpbHQgaW50byB0aGUga2VybmVsLCB0aGUgZHJpdmVyIHZlcnNpb24gbWVzc2FnZQorCSAqIGlzIG9ubHkgcHJpbnRlZCBpZiBhdCBsZWFzdCBvbmUgODEzOSBib2FyZCBoYXMgYmVlbiBmb3VuZAorCSAqLworI2lmbmRlZiBNT0RVTEUKKwl7CisJCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQkJcHJpbnRrIChLRVJOX0lORk8gUlRMODEzOV9EUklWRVJfTkFNRSAiXG4iKTsKKwl9CisjZW5kaWYKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnBjaV9yZXYpOworCisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1JFQUxURUsgJiYKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUkVBTFRFS184MTM5ICYmIHBjaV9yZXYgPj0gMHgyMCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAicGNpIGRldiAlcyAoaWQgJTA0eDolMDR4IHJldiAlMDJ4KSBpcyBhbiBlbmhhbmNlZCA4MTM5QysgY2hpcFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwgcGNpX3Jldik7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJVc2UgdGhlIFwiODEzOWNwXCIgZHJpdmVyIGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhbmQgc3RhYmlsaXR5LlxuIik7CisJfQorCisJaSA9IHJ0bDgxMzlfaW5pdF9ib2FyZCAocGRldiwgJmRldik7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gaTsKKworCWFzc2VydCAoZGV2ICE9IE5VTEwpOworCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJYXNzZXJ0IChpb2FkZHIgIT0gTlVMTCk7CisKKwlhZGRyX2xlbiA9IHJlYWRfZWVwcm9tIChpb2FkZHIsIDAsIDgpID09IDB4ODEyOSA/IDggOiA2OworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCSgodTE2ICopIChkZXYtPmRldl9hZGRyKSlbaV0gPQorCQkgICAgbGUxNl90b19jcHUgKHJlYWRfZWVwcm9tIChpb2FkZHIsIGkgKyA3LCBhZGRyX2xlbikpOworCisJLyogVGhlIFJ0bDgxMzktc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSBydGw4MTM5X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBydGw4MTM5X3N0YXJ0X3htaXQ7CisJZGV2LT5wb2xsID0gcnRsODEzOV9wb2xsOworCWRldi0+d2VpZ2h0ID0gNjQ7CisJZGV2LT5zdG9wID0gcnRsODEzOV9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9IHJ0bDgxMzlfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gcnRsODEzOV9zZXRfcnhfbW9kZTsKKwlkZXYtPmRvX2lvY3RsID0gbmV0ZGV2X2lvY3RsOworCWRldi0+ZXRodG9vbF9vcHMgPSAmcnRsODEzOV9ldGh0b29sX29wczsKKwlkZXYtPnR4X3RpbWVvdXQgPSBydGw4MTM5X3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IHJ0bDgxMzlfcG9sbF9jb250cm9sbGVyOworI2VuZGlmCisKKwkvKiBub3RlOiB0aGUgaGFyZHdhcmUgaXMgbm90IGNhcGFibGUgb2Ygc2cvY3N1bS9oaWdoZG1hLCBob3dldmVyCisJICogdGhyb3VnaCB0aGUgdXNlIG9mIHNrYl9jb3B5X2FuZF9jc3VtX2RldiB3ZSBlbmFibGUgdGhlc2UKKwkgKiBmZWF0dXJlcworCSAqLworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSFdfQ1NVTSB8IE5FVElGX0ZfSElHSERNQTsKKworCWRldi0+aXJxID0gcGRldi0+aXJxOworCisJLyogdHAgemVyb2VkIGFuZCBhbGlnbmVkIGluIGFsbG9jX2V0aGVyZGV2ICovCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogbm90ZTogdHAtPmNoaXBzZXQgc2V0IGluIHJ0bDgxMzlfaW5pdF9ib2FyZCAqLworCXRwLT5kcnZfZmxhZ3MgPSBib2FyZF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLmh3X2ZsYWdzOworCXRwLT5tbWlvX2FkZHIgPSBpb2FkZHI7CisJdHAtPm1zZ19lbmFibGUgPQorCQkoZGVidWcgPCAwID8gUlRMODEzOV9ERUZfTVNHX0VOQUJMRSA6ICgoMSA8PCBkZWJ1ZykgLSAxKSk7CisJc3Bpbl9sb2NrX2luaXQgKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQgKCZ0cC0+cnhfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCAoJnRwLT50aHJfd2FpdCk7CisJaW5pdF9jb21wbGV0aW9uICgmdHAtPnRocl9leGl0ZWQpOworCXRwLT5taWkuZGV2ID0gZGV2OworCXRwLT5taWkubWRpb19yZWFkID0gbWRpb19yZWFkOworCXRwLT5taWkubWRpb193cml0ZSA9IG1kaW9fd3JpdGU7CisJdHAtPm1paS5waHlfaWRfbWFzayA9IDB4M2Y7CisJdHAtPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOworCisJLyogZGV2IGlzIGZ1bGx5IHNldCB1cCBhbmQgcmVhZHkgdG8gdXNlIG5vdyAqLworCURQUklOVEsoImFib3V0IHRvIHJlZ2lzdGVyIGRldmljZSBuYW1lZCAlcyAoJXApLi4uXG4iLCBkZXYtPm5hbWUsIGRldik7CisJaSA9IHJlZ2lzdGVyX25ldGRldiAoZGV2KTsKKwlpZiAoaSkgZ290byBlcnJfb3V0OworCisJcGNpX3NldF9kcnZkYXRhIChwZGV2LCBkZXYpOworCisJcHJpbnRrIChLRVJOX0lORk8gIiVzOiAlcyBhdCAweCVseCwgIgorCQkiJTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMngsICIKKwkJIklSUSAlZFxuIiwKKwkJZGV2LT5uYW1lLAorCQlib2FyZF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLm5hbWUsCisJCWRldi0+YmFzZV9hZGRyLAorCQlkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLAorCQlkZXYtPmRldl9hZGRyWzJdLCBkZXYtPmRldl9hZGRyWzNdLAorCQlkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdLAorCQlkZXYtPmlycSk7CisKKwlwcmludGsgKEtFUk5fREVCVUcgIiVzOiAgSWRlbnRpZmllZCA4MTM5IGNoaXAgdHlwZSAnJXMnXG4iLAorCQlkZXYtPm5hbWUsIHJ0bF9jaGlwX2luZm9bdHAtPmNoaXBzZXRdLm5hbWUpOworCisJLyogRmluZCB0aGUgY29ubmVjdGVkIE1JSSB4Y3Zycy4KKwkgICBEb2luZyB0aGlzIGluIG9wZW4oKSB3b3VsZCBhbGxvdyBkZXRlY3RpbmcgZXh0ZXJuYWwgeGN2cnMgbGF0ZXIsIGJ1dAorCSAgIHRha2VzIHRvbyBtdWNoIHRpbWUuICovCisjaWZkZWYgQ09ORklHXzgxMzlUT09fODEyOQorCWlmICh0cC0+ZHJ2X2ZsYWdzICYgSEFTX01JSV9YQ1ZSKSB7CisJCWludCBwaHksIHBoeV9pZHggPSAwOworCQlmb3IgKHBoeSA9IDA7IHBoeSA8IDMyICYmIHBoeV9pZHggPCBzaXplb2YodHAtPnBoeXMpOyBwaHkrKykgeworCQkJaW50IG1paV9zdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBwaHksIDEpOworCQkJaWYgKG1paV9zdGF0dXMgIT0gMHhmZmZmICAmJiAgbWlpX3N0YXR1cyAhPSAweDAwMDApIHsKKwkJCQl1MTYgYWR2ZXJ0aXNpbmcgPSBtZGlvX3JlYWQoZGV2LCBwaHksIDQpOworCQkJCXRwLT5waHlzW3BoeV9pZHgrK10gPSBwaHk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSB0cmFuc2NlaXZlciAlZCBzdGF0dXMgMHglNC40eCAiCisJCQkJCSAgICJhZHZlcnRpc2luZyAlNC40eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcGh5LCBtaWlfc3RhdHVzLCBhZHZlcnRpc2luZyk7CisJCQl9CisJCX0KKwkJaWYgKHBoeV9pZHggPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIE1JSSB0cmFuc2NlaXZlcnMgZm91bmQhICBBc3N1bWluZyBTWU0gIgorCQkJCSAgICJ0cmFuc2NlaXZlci5cbiIsCisJCQkJICAgZGV2LT5uYW1lKTsKKwkJCXRwLT5waHlzWzBdID0gMzI7CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCQl0cC0+cGh5c1swXSA9IDMyOworCXRwLT5taWkucGh5X2lkID0gdHAtPnBoeXNbMF07CisKKwkvKiBUaGUgbG93ZXIgZm91ciBiaXRzIGFyZSB0aGUgbWVkaWEgdHlwZS4gKi8KKwlvcHRpb24gPSAoYm9hcmRfaWR4ID49IE1BWF9VTklUUykgPyAwIDogbWVkaWFbYm9hcmRfaWR4XTsKKwlpZiAob3B0aW9uID4gMCkgeworCQl0cC0+bWlpLmZ1bGxfZHVwbGV4ID0gKG9wdGlvbiAmIDB4MjEwKSA/IDEgOiAwOworCQl0cC0+ZGVmYXVsdF9wb3J0ID0gb3B0aW9uICYgMHhGRjsKKwkJaWYgKHRwLT5kZWZhdWx0X3BvcnQpCisJCQl0cC0+bWlpLmZvcmNlX21lZGlhID0gMTsKKwl9CisJaWYgKGJvYXJkX2lkeCA8IE1BWF9VTklUUyAgJiYgIGZ1bGxfZHVwbGV4W2JvYXJkX2lkeF0gPiAwKQorCQl0cC0+bWlpLmZ1bGxfZHVwbGV4ID0gZnVsbF9kdXBsZXhbYm9hcmRfaWR4XTsKKwlpZiAodHAtPm1paS5mdWxsX2R1cGxleCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVkaWEgdHlwZSBmb3JjZWQgdG8gRnVsbCBEdXBsZXguXG4iLCBkZXYtPm5hbWUpOworCQkvKiBDaGFuZ2luZyB0aGUgTUlJLWFkdmVydGlzZWQgbWVkaWEgYmVjYXVzZSBtaWdodCBwcmV2ZW50CisJCSAgIHJlLWNvbm5lY3Rpb24uICovCisJCXRwLT5taWkuZm9yY2VfbWVkaWEgPSAxOworCX0KKwlpZiAodHAtPmRlZmF1bHRfcG9ydCkgeworCQlwcmludGsoS0VSTl9JTkZPICIgIEZvcmNpbmcgJWRNYnBzICVzLWR1cGxleCBvcGVyYXRpb24uXG4iLAorCQkJICAgKG9wdGlvbiAmIDB4MjAgPyAxMDAgOiAxMCksCisJCQkgICAob3B0aW9uICYgMHgxMCA/ICJmdWxsIiA6ICJoYWxmIikpOworCQltZGlvX3dyaXRlKGRldiwgdHAtPnBoeXNbMF0sIDAsCisJCQkJICAgKChvcHRpb24gJiAweDIwKSA/IDB4MjAwMCA6IDApIHwgCS8qIDEwME1icHM/ICovCisJCQkJICAgKChvcHRpb24gJiAweDEwKSA/IDB4MDEwMCA6IDApKTsgLyogRnVsbCBkdXBsZXg/ICovCisJfQorCisJLyogUHV0IHRoZSBjaGlwIGludG8gbG93LXBvd2VyIG1vZGUuICovCisJaWYgKHJ0bF9jaGlwX2luZm9bdHAtPmNoaXBzZXRdLmZsYWdzICYgSGFzSGx0Q2xrKQorCQlSVExfVzggKEhsdENsaywgJ0gnKTsJLyogJ1InIHdvdWxkIGxlYXZlIHRoZSBjbG9jayBydW5uaW5nLiAqLworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJX19ydGw4MTM5X2NsZWFudXBfZGV2IChkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZSAocGRldik7CisJcmV0dXJuIGk7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0bDgxMzlfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisKKwlhc3NlcnQgKGRldiAhPSBOVUxMKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCisJX19ydGw4MTM5X2NsZWFudXBfZGV2IChkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZSAocGRldik7Cit9CisKKworLyogU2VyaWFsIEVFUFJPTSBzZWN0aW9uLiAqLworCisvKiAgRUVQUk9NX0N0cmwgYml0cy4gKi8KKyNkZWZpbmUgRUVfU0hJRlRfQ0xLCTB4MDQJLyogRUVQUk9NIHNoaWZ0IGNsb2NrLiAqLworI2RlZmluZSBFRV9DUwkJCTB4MDgJLyogRUVQUk9NIGNoaXAgc2VsZWN0LiAqLworI2RlZmluZSBFRV9EQVRBX1dSSVRFCTB4MDIJLyogRUVQUk9NIGNoaXAgZGF0YSBpbi4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfMAkJMHgwMAorI2RlZmluZSBFRV9XUklURV8xCQkweDAyCisjZGVmaW5lIEVFX0RBVEFfUkVBRAkweDAxCS8qIEVFUFJPTSBjaGlwIGRhdGEgb3V0LiAqLworI2RlZmluZSBFRV9FTkIJCQkoMHg4MCB8IEVFX0NTKQorCisvKiBEZWxheSBiZXR3ZWVuIEVFUFJPTSBjbG9jayB0cmFuc2l0aW9ucy4KKyAgIE5vIGV4dHJhIGRlbGF5IGlzIG5lZWRlZCB3aXRoIDMzTWh6IFBDSSwgYnV0IDY2TWh6IG1heSBjaGFuZ2UgdGhpcy4KKyAqLworCisjZGVmaW5lIGVlcHJvbV9kZWxheSgpCXJlYWRsKGVlX2FkZHIpCisKKy8qIFRoZSBFRVBST00gY29tbWFuZHMgaW5jbHVkZSB0aGUgYWx3YXktc2V0IGxlYWRpbmcgYml0LiAqLworI2RlZmluZSBFRV9XUklURV9DTUQJKDUpCisjZGVmaW5lIEVFX1JFQURfQ01ECQkoNikKKyNkZWZpbmUgRUVfRVJBU0VfQ01ECSg3KQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCByZWFkX2VlcHJvbSAodm9pZCAqaW9hZGRyLCBpbnQgbG9jYXRpb24sIGludCBhZGRyX2xlbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCByZXR2YWwgPSAwOworCXZvaWQgKmVlX2FkZHIgPSBpb2FkZHIgKyBDZmc5MzQ2OworCWludCByZWFkX2NtZCA9IGxvY2F0aW9uIHwgKEVFX1JFQURfQ01EIDw8IGFkZHJfbGVuKTsKKworCXdyaXRlYiAoRUVfRU5CICYgfkVFX0NTLCBlZV9hZGRyKTsKKwl3cml0ZWIgKEVFX0VOQiwgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5ICgpOworCisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSA0ICsgYWRkcl9sZW47IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfREFUQV9XUklURSA6IDA7CisJCXdyaXRlYiAoRUVfRU5CIHwgZGF0YXZhbCwgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSAoKTsKKwkJd3JpdGViIChFRV9FTkIgfCBkYXRhdmFsIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5ICgpOworCX0KKwl3cml0ZWIgKEVFX0VOQiwgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5ICgpOworCisJZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwkJd3JpdGViIChFRV9FTkIgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkgKCk7CisJCXJldHZhbCA9CisJCSAgICAocmV0dmFsIDw8IDEpIHwgKChyZWFkYiAoZWVfYWRkcikgJiBFRV9EQVRBX1JFQUQpID8gMSA6CisJCQkJICAgICAwKTsKKwkJd3JpdGViIChFRV9FTkIsIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkgKCk7CisJfQorCisJLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworCXdyaXRlYiAofkVFX0NTLCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkgKCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBNSUkgc2VyaWFsIG1hbmFnZW1lbnQ6IG1vc3RseSBib2d1cyBmb3Igbm93LiAqLworLyogUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSBtYW5hZ2VtZW50IHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQKKyAgIHNlcmlhbCBNRElPIHByb3RvY29sLgorICAgVGhlIG1heGltdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICBUaGUgbWluaW11bSB0aW1pbmcgaXMgdXN1YWxseQorICAgbWV0IGJ5IGJhY2stdG8tYmFjayBQQ0kgSS9PIGN5Y2xlcywgYnV0IHdlIGluc2VydCBhIGRlbGF5IHRvIGF2b2lkCisgICAib3ZlcmNsb2NraW5nIiBpc3N1ZXMuICovCisjZGVmaW5lIE1ESU9fRElSCQkweDgwCisjZGVmaW5lIE1ESU9fREFUQV9PVVQJMHgwNAorI2RlZmluZSBNRElPX0RBVEFfSU4JMHgwMgorI2RlZmluZSBNRElPX0NMSwkJMHgwMQorI2RlZmluZSBNRElPX1dSSVRFMCAoTURJT19ESVIpCisjZGVmaW5lIE1ESU9fV1JJVEUxIChNRElPX0RJUiB8IE1ESU9fREFUQV9PVVQpCisKKyNkZWZpbmUgbWRpb19kZWxheShtZGlvX2FkZHIpCXJlYWRiKG1kaW9fYWRkcikKKworCitzdGF0aWMgY2hhciBtaWlfMl84MTM5X21hcFs4XSA9IHsKKwlCYXNpY01vZGVDdHJsLAorCUJhc2ljTW9kZVN0YXR1cywKKwkwLAorCTAsCisJTldheUFkdmVydCwKKwlOV2F5TFBBUiwKKwlOV2F5RXhwYW5zaW9uLAorCTAKK307CisKKworI2lmZGVmIENPTkZJR184MTM5VE9PXzgxMjkKKy8qIFN5bmNyb25pemUgdGhlIE1JSSBtYW5hZ2VtZW50IGludGVyZmFjZSBieSBzaGlmdGluZyAzMiBvbmUgYml0cyBvdXQuICovCitzdGF0aWMgdm9pZCBtZGlvX3N5bmMgKHZvaWQgKm1kaW9fYWRkcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDMyOyBpID49IDA7IGktLSkgeworCQl3cml0ZWIgKE1ESU9fV1JJVEUxLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5IChtZGlvX2FkZHIpOworCQl3cml0ZWIgKE1ESU9fV1JJVEUxIHwgTURJT19DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkgKG1kaW9fYWRkcik7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbWRpb19yZWFkIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXR2YWwgPSAwOworI2lmZGVmIENPTkZJR184MTM5VE9PXzgxMjkKKwl2b2lkICptZGlvX2FkZHIgPSB0cC0+bW1pb19hZGRyICsgQ29uZmlnNDsKKwlpbnQgbWlpX2NtZCA9ICgweGY2IDw8IDEwKSB8IChwaHlfaWQgPDwgNSkgfCBsb2NhdGlvbjsKKwlpbnQgaTsKKyNlbmRpZgorCisJaWYgKHBoeV9pZCA+IDMxKSB7CS8qIFJlYWxseSBhIDgxMzkuICBVc2UgaW50ZXJuYWwgcmVnaXN0ZXJzLiAqLworCQlyZXR1cm4gbG9jYXRpb24gPCA4ICYmIG1paV8yXzgxMzlfbWFwW2xvY2F0aW9uXSA/CisJCSAgICByZWFkdyAodHAtPm1taW9fYWRkciArIG1paV8yXzgxMzlfbWFwW2xvY2F0aW9uXSkgOiAwOworCX0KKworI2lmZGVmIENPTkZJR184MTM5VE9PXzgxMjkKKwltZGlvX3N5bmMgKG1kaW9fYWRkcik7CisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAobWlpX2NtZCAmICgxIDw8IGkpKSA/IE1ESU9fREFUQV9PVVQgOiAwOworCisJCXdyaXRlYiAoTURJT19ESVIgfCBkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5IChtZGlvX2FkZHIpOworCQl3cml0ZWIgKE1ESU9fRElSIHwgZGF0YXZhbCB8IE1ESU9fQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5IChtZGlvX2FkZHIpOworCX0KKworCS8qIFJlYWQgdGhlIHR3byB0cmFuc2l0aW9uLCAxNiBkYXRhLCBhbmQgd2lyZS1pZGxlIGJpdHMuICovCisJZm9yIChpID0gMTk7IGkgPiAwOyBpLS0pIHsKKwkJd3JpdGViICgwLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5IChtZGlvX2FkZHIpOworCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChyZWFkYiAobWRpb19hZGRyKSAmIE1ESU9fREFUQV9JTikgPyAxIDogMCk7CisJCXdyaXRlYiAoTURJT19DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkgKG1kaW9fYWRkcik7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gKHJldHZhbCA+PiAxKSAmIDB4ZmZmZjsKK30KKworCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sCisJCQlpbnQgdmFsdWUpCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworI2lmZGVmIENPTkZJR184MTM5VE9PXzgxMjkKKwl2b2lkICptZGlvX2FkZHIgPSB0cC0+bW1pb19hZGRyICsgQ29uZmlnNDsKKwlpbnQgbWlpX2NtZCA9ICgweDUwMDIgPDwgMTYpIHwgKHBoeV9pZCA8PCAyMykgfCAobG9jYXRpb24gPDwgMTgpIHwgdmFsdWU7CisJaW50IGk7CisjZW5kaWYKKworCWlmIChwaHlfaWQgPiAzMSkgewkvKiBSZWFsbHkgYSA4MTM5LiAgVXNlIGludGVybmFsIHJlZ2lzdGVycy4gKi8KKwkJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwkJaWYgKGxvY2F0aW9uID09IDApIHsKKwkJCVJUTF9XOCAoQ2ZnOTM0NiwgQ2ZnOTM0Nl9VbmxvY2spOworCQkJUlRMX1cxNiAoQmFzaWNNb2RlQ3RybCwgdmFsdWUpOworCQkJUlRMX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCQl9IGVsc2UgaWYgKGxvY2F0aW9uIDwgOCAmJiBtaWlfMl84MTM5X21hcFtsb2NhdGlvbl0pCisJCQlSVExfVzE2IChtaWlfMl84MTM5X21hcFtsb2NhdGlvbl0sIHZhbHVlKTsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIENPTkZJR184MTM5VE9PXzgxMjkKKwltZGlvX3N5bmMgKG1kaW9fYWRkcik7CisKKwkvKiBTaGlmdCB0aGUgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPQorCQkgICAgKG1paV9jbWQgJiAoMSA8PCBpKSkgPyBNRElPX1dSSVRFMSA6IE1ESU9fV1JJVEUwOworCQl3cml0ZWIgKGRhdGF2YWwsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkgKG1kaW9fYWRkcik7CisJCXdyaXRlYiAoZGF0YXZhbCB8IE1ESU9fQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5IChtZGlvX2FkZHIpOworCX0KKwkvKiBDbGVhciBvdXQgZXh0cmEgYml0cy4gKi8KKwlmb3IgKGkgPSAyOyBpID4gMDsgaS0tKSB7CisJCXdyaXRlYiAoMCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSAobWRpb19hZGRyKTsKKwkJd3JpdGViIChNRElPX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSAobWRpb19hZGRyKTsKKwl9CisjZW5kaWYKK30KKworCitzdGF0aWMgaW50IHJ0bDgxMzlfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldHZhbDsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCisJcmV0dmFsID0gcmVxdWVzdF9pcnEgKGRldi0+aXJxLCBydGw4MTM5X2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJdHAtPnR4X2J1ZnMgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh0cC0+cGNpX2RldiwgVFhfQlVGX1RPVF9MRU4sCisJCQkJCSAgICZ0cC0+dHhfYnVmc19kbWEpOworCXRwLT5yeF9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodHAtPnBjaV9kZXYsIFJYX0JVRl9UT1RfTEVOLAorCQkJCQkgICAmdHAtPnJ4X3JpbmdfZG1hKTsKKwlpZiAodHAtPnR4X2J1ZnMgPT0gTlVMTCB8fCB0cC0+cnhfcmluZyA9PSBOVUxMKSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJCWlmICh0cC0+dHhfYnVmcykKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQodHAtPnBjaV9kZXYsIFRYX0JVRl9UT1RfTEVOLAorCQkJCQkgICAgdHAtPnR4X2J1ZnMsIHRwLT50eF9idWZzX2RtYSk7CisJCWlmICh0cC0+cnhfcmluZykKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQodHAtPnBjaV9kZXYsIFJYX0JVRl9UT1RfTEVOLAorCQkJCQkgICAgdHAtPnJ4X3JpbmcsIHRwLT5yeF9yaW5nX2RtYSk7CisKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl9CisKKwl0cC0+bWlpLmZ1bGxfZHVwbGV4ID0gdHAtPm1paS5mb3JjZV9tZWRpYTsKKwl0cC0+dHhfZmxhZyA9IChUWF9GSUZPX1RIUkVTSCA8PCAxMSkgJiAweDAwM2YwMDAwOworCisJcnRsODEzOV9pbml0X3JpbmcgKGRldik7CisJcnRsODEzOV9od19zdGFydCAoZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKworCWlmIChuZXRpZl9tc2dfaWZ1cCh0cCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcnRsODEzOV9vcGVuKCkgaW9hZGRyICUjbHggSVJRICVkIgorCQkJIiBHUCBQaW5zICUyLjJ4ICVzLWR1cGxleC5cbiIsCisJCQlkZXYtPm5hbWUsIHBjaV9yZXNvdXJjZV9zdGFydCAodHAtPnBjaV9kZXYsIDEpLAorCQkJZGV2LT5pcnEsIFJUTF9SOCAoTWVkaWFTdGF0dXMpLAorCQkJdHAtPm1paS5mdWxsX2R1cGxleCA/ICJmdWxsIiA6ICJoYWxmIik7CisKKwlydGw4MTM5X3N0YXJ0X3RocmVhZChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgcnRsX2NoZWNrX21lZGlhIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaW5pdF9tZWRpYSkKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAodHAtPnBoeXNbMF0gPj0gMCkgeworCQltaWlfY2hlY2tfbWVkaWEoJnRwLT5taWksIG5ldGlmX21zZ19saW5rKHRwKSwgaW5pdF9tZWRpYSk7CisJfQorfQorCisvKiBTdGFydCB0aGUgaGFyZHdhcmUgYXQgb3BlbiBvciByZXN1bWUuICovCitzdGF0aWMgdm9pZCBydGw4MTM5X2h3X3N0YXJ0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXUzMiBpOworCXU4IHRtcDsKKworCS8qIEJyaW5nIG9sZCBjaGlwcyBvdXQgb2YgbG93LXBvd2VyIG1vZGUuICovCisJaWYgKHJ0bF9jaGlwX2luZm9bdHAtPmNoaXBzZXRdLmZsYWdzICYgSGFzSGx0Q2xrKQorCQlSVExfVzggKEhsdENsaywgJ1InKTsKKworCXJ0bDgxMzlfY2hpcF9yZXNldCAoaW9hZGRyKTsKKworCS8qIHVubG9jayBDb25maWdbMDEyMzRdIGFuZCBCTUNSIHJlZ2lzdGVyIHdyaXRlcyAqLworCVJUTF9XOF9GIChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJLyogUmVzdG9yZSBvdXIgaWRlYSBvZiB0aGUgTUFDIGFkZHJlc3MuICovCisJUlRMX1czMl9GIChNQUMwICsgMCwgY3B1X3RvX2xlMzIgKCoodTMyICopIChkZXYtPmRldl9hZGRyICsgMCkpKTsKKwlSVExfVzMyX0YgKE1BQzAgKyA0LCBjcHVfdG9fbGUzMiAoKih1MzIgKikgKGRldi0+ZGV2X2FkZHIgKyA0KSkpOworCisJLyogTXVzdCBlbmFibGUgVHgvUnggYmVmb3JlIHNldHRpbmcgdHJhbnNmZXIgdGhyZXNob2xkcyEgKi8KKwlSVExfVzggKENoaXBDbWQsIENtZFJ4RW5iIHwgQ21kVHhFbmIpOworCisJdHAtPnJ4X2NvbmZpZyA9IHJ0bDgxMzlfcnhfY29uZmlnIHwgQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXlQaHlzOworCVJUTF9XMzIgKFJ4Q29uZmlnLCB0cC0+cnhfY29uZmlnKTsKKwlSVExfVzMyIChUeENvbmZpZywgcnRsODEzOV90eF9jb25maWcpOworCisJdHAtPmN1cl9yeCA9IDA7CisKKwlydGxfY2hlY2tfbWVkaWEgKGRldiwgMSk7CisKKwlpZiAodHAtPmNoaXBzZXQgPj0gQ0hfODEzOUIpIHsKKwkJLyogRGlzYWJsZSBtYWdpYyBwYWNrZXQgc2Nhbm5pbmcsIHdoaWNoIGlzIGVuYWJsZWQKKwkJICogd2hlbiBQTSBpcyBlbmFibGVkIGluIENvbmZpZzEuICBJdCBjYW4gYmUgcmVlbmFibGVkCisJCSAqIHZpYSBFVEhUT09MX1NXT0wgaWYgZGVzaXJlZC4gICovCisJCVJUTF9XOCAoQ29uZmlnMywgUlRMX1I4IChDb25maWczKSAmIH5DZmczX01hZ2ljKTsKKwl9CisKKwlEUFJJTlRLKCJpbml0IGJ1ZmZlciBhZGRyZXNzZXNcbiIpOworCisJLyogTG9jayBDb25maWdbMDEyMzRdIGFuZCBCTUNSIHJlZ2lzdGVyIHdyaXRlcyAqLworCVJUTF9XOCAoQ2ZnOTM0NiwgQ2ZnOTM0Nl9Mb2NrKTsKKworCS8qIGluaXQgUnggcmluZyBidWZmZXIgRE1BIGFkZHJlc3MgKi8KKwlSVExfVzMyX0YgKFJ4QnVmLCB0cC0+cnhfcmluZ19kbWEpOworCisJLyogaW5pdCBUeCBidWZmZXIgRE1BIGFkZHJlc3NlcyAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrKQorCQlSVExfVzMyX0YgKFR4QWRkcjAgKyAoaSAqIDQpLCB0cC0+dHhfYnVmc19kbWEgKyAodHAtPnR4X2J1ZltpXSAtIHRwLT50eF9idWZzKSk7CisKKwlSVExfVzMyIChSeE1pc3NlZCwgMCk7CisKKwlydGw4MTM5X3NldF9yeF9tb2RlIChkZXYpOworCisJLyogbm8gZWFybHktcnggaW50ZXJydXB0cyAqLworCVJUTF9XMTYgKE11bHRpSW50ciwgUlRMX1IxNiAoTXVsdGlJbnRyKSAmIE11bHRpSW50ckNsZWFyKTsKKworCS8qIG1ha2Ugc3VyZSBSeFR4IGhhcyBzdGFydGVkICovCisJdG1wID0gUlRMX1I4IChDaGlwQ21kKTsKKwlpZiAoKCEodG1wICYgQ21kUnhFbmIpKSB8fCAoISh0bXAgJiBDbWRUeEVuYikpKQorCQlSVExfVzggKENoaXBDbWQsIENtZFJ4RW5iIHwgQ21kVHhFbmIpOworCisJLyogRW5hYmxlIGFsbCBrbm93biBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCVJUTF9XMTYgKEludHJNYXNrLCBydGw4MTM5X2ludHJfbWFzayk7Cit9CisKKworLyogSW5pdGlhbGl6ZSB0aGUgUnggYW5kIFR4IHJpbmdzLCBhbG9uZyB3aXRoIHZhcmlvdXMgJ2RldicgYml0cy4gKi8KK3N0YXRpYyB2b2lkIHJ0bDgxMzlfaW5pdF9yaW5nIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCXRwLT5jdXJfcnggPSAwOworCXRwLT5jdXJfdHggPSAwOworCXRwLT5kaXJ0eV90eCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKykKKwkJdHAtPnR4X2J1ZltpXSA9ICZ0cC0+dHhfYnVmc1tpICogVFhfQlVGX1NJWkVdOworfQorCisKKy8qIFRoaXMgbXVzdCBiZSBnbG9iYWwgZm9yIENPTkZJR184MTM5VE9PX1RVTkVfVFdJU1RFUiBjYXNlICovCitzdGF0aWMgaW50IG5leHRfdGljayA9IDMgKiBIWjsKKworI2lmbmRlZiBDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVIKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGw4MTM5X3R1bmVfdHdpc3RlciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwKSB7fQorI2Vsc2UKK2VudW0gVHdpc3RlclBhcmFtVmFscyB7CisJUEFSQTc4X2RlZmF1bHQJPSAweDc4ZmE4Mzg4LAorCVBBUkE3Y19kZWZhdWx0CT0gMHhjYjM4ZGU0MywJLyogcGFyYW1bMF1bM10gKi8KKwlQQVJBN2NfeHh4CT0gMHhjYjM4ZGU0MywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHBhcmFtWzRdWzRdID0geworCXsweGNiMzlkZTQzLCAweGNiMzljZTQzLCAweGZiMzhkZTAzLCAweGNiMzhkZTQzfSwKKwl7MHhjYjM5ZGU0MywgMHhjYjM5Y2U0MywgMHhjYjM5Y2U4MywgMHhjYjM5Y2U4M30sCisJezB4Y2IzOWRlNDMsIDB4Y2IzOWNlNDMsIDB4Y2IzOWNlODMsIDB4Y2IzOWNlODN9LAorCXsweGJiMzlkZTQzLCAweGJiMzljZTQzLCAweGJiMzljZTgzLCAweGJiMzljZTgzfQorfTsKKworc3RhdGljIHZvaWQgcnRsODEzOV90dW5lX3R3aXN0ZXIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCkKK3sKKwlpbnQgbGlua2Nhc2U7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKworCS8qIFRoaXMgaXMgYSBjb21wbGljYXRlZCBzdGF0ZSBtYWNoaW5lIHRvIGNvbmZpZ3VyZSB0aGUgInR3aXN0ZXIiIGZvcgorCSAgIGltcGVkYW5jZS9lY2hvcyBiYXNlZCBvbiB0aGUgY2FibGUgbGVuZ3RoLgorCSAgIEFsbCBvZiB0aGlzIGlzIG1hZ2ljIGFuZCB1bmRvY3VtZW50ZWQuCisJICovCisJc3dpdGNoICh0cC0+dHdpc3RpZSkgeworCWNhc2UgMToKKwkJaWYgKFJUTF9SMTYgKENTQ1IpICYgQ1NDUl9MaW5rT0tCaXQpIHsKKwkJCS8qIFdlIGhhdmUgbGluayBiZWF0LCBsZXQgdXMgdHVuZSB0aGUgdHdpc3Rlci4gKi8KKwkJCVJUTF9XMTYgKENTQ1IsIENTQ1JfTGlua0Rvd25PZmZDbWQpOworCQkJdHAtPnR3aXN0aWUgPSAyOwkvKiBDaGFuZ2UgdG8gc3RhdGUgMi4gKi8KKwkJCW5leHRfdGljayA9IEhaIC8gMTA7CisJCX0gZWxzZSB7CisJCQkvKiBKdXN0IHB1dCBpbiBzb21lIHJlYXNvbmFibGUgZGVmYXVsdHMgZm9yIHdoZW4gYmVhdCByZXR1cm5zLiAqLworCQkJUlRMX1cxNiAoQ1NDUiwgQ1NDUl9MaW5rRG93bkNtZCk7CisJCQlSVExfVzMyIChGSUZPVE1TLCAweDIwKTsJLyogVHVybiBvbiBjYWJsZSB0ZXN0IG1vZGUuICovCisJCQlSVExfVzMyIChQQVJBNzgsIFBBUkE3OF9kZWZhdWx0KTsKKwkJCVJUTF9XMzIgKFBBUkE3YywgUEFSQTdjX2RlZmF1bHQpOworCQkJdHAtPnR3aXN0aWUgPSAwOwkvKiBCYWlsIGZyb20gZnV0dXJlIGFjdGlvbnMuICovCisJCX0KKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiBSZWFkIGhvdyBsb25nIGl0IHRvb2sgdG8gaGVhciB0aGUgZWNoby4gKi8KKwkJbGlua2Nhc2UgPSBSVExfUjE2IChDU0NSKSAmIENTQ1JfTGlua1N0YXR1c0JpdHM7CisJCWlmIChsaW5rY2FzZSA9PSAweDcwMDApCisJCQl0cC0+dHdpc3Rfcm93ID0gMzsKKwkJZWxzZSBpZiAobGlua2Nhc2UgPT0gMHgzMDAwKQorCQkJdHAtPnR3aXN0X3JvdyA9IDI7CisJCWVsc2UgaWYgKGxpbmtjYXNlID09IDB4MTAwMCkKKwkJCXRwLT50d2lzdF9yb3cgPSAxOworCQllbHNlCisJCQl0cC0+dHdpc3Rfcm93ID0gMDsKKwkJdHAtPnR3aXN0X2NvbCA9IDA7CisJCXRwLT50d2lzdGllID0gMzsJLyogQ2hhbmdlIHRvIHN0YXRlIDIuICovCisJCW5leHRfdGljayA9IEhaIC8gMTA7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJLyogUHV0IG91dCBmb3VyIHR1bmluZyBwYXJhbWV0ZXJzLCBvbmUgcGVyIDEwMG1zZWMuICovCisJCWlmICh0cC0+dHdpc3RfY29sID09IDApCisJCQlSVExfVzE2IChGSUZPVE1TLCAwKTsKKwkJUlRMX1czMiAoUEFSQTdjLCBwYXJhbVsoaW50KSB0cC0+dHdpc3Rfcm93XQorCQkJIFsoaW50KSB0cC0+dHdpc3RfY29sXSk7CisJCW5leHRfdGljayA9IEhaIC8gMTA7CisJCWlmICgrK3RwLT50d2lzdF9jb2wgPj0gNCkgeworCQkJLyogRm9yIHNob3J0IGNhYmxlcyB3ZSBhcmUgZG9uZS4KKwkJCSAgIEZvciBsb25nIGNhYmxlcyAocm93ID09IDMpIGNoZWNrIGZvciBtaXN0dW5lLiAqLworCQkJdHAtPnR3aXN0aWUgPQorCQkJICAgICh0cC0+dHdpc3Rfcm93ID09IDMpID8gNCA6IDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSA0OgorCQkvKiBTcGVjaWFsIGNhc2UgZm9yIGxvbmcgY2FibGVzOiBjaGVjayBmb3IgbWlzdHVuZS4gKi8KKwkJaWYgKChSVExfUjE2IChDU0NSKSAmCisJCSAgICAgQ1NDUl9MaW5rU3RhdHVzQml0cykgPT0gMHg3MDAwKSB7CisJCQl0cC0+dHdpc3RpZSA9IDA7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCVJUTF9XMzIgKFBBUkE3YywgMHhmYjM4ZGUwMyk7CisJCQl0cC0+dHdpc3RpZSA9IDU7CisJCQluZXh0X3RpY2sgPSBIWiAvIDEwOworCQl9CisJCWJyZWFrOworCWNhc2UgNToKKwkJLyogUmV0dW5lIGZvciBzaG9ydGVyIGNhYmxlIChjb2x1bW4gMikuICovCisJCVJUTF9XMzIgKEZJRk9UTVMsIDB4MjApOworCQlSVExfVzMyIChQQVJBNzgsIFBBUkE3OF9kZWZhdWx0KTsKKwkJUlRMX1czMiAoUEFSQTdjLCBQQVJBN2NfZGVmYXVsdCk7CisJCVJUTF9XMzIgKEZJRk9UTVMsIDB4MDApOworCQl0cC0+dHdpc3Rfcm93ID0gMjsKKwkJdHAtPnR3aXN0X2NvbCA9IDA7CisJCXRwLT50d2lzdGllID0gMzsKKwkJbmV4dF90aWNrID0gSFogLyAxMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBkbyBub3RoaW5nICovCisJCWJyZWFrOworCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVIgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bDgxMzlfdGhyZWFkX2l0ZXIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwLAorCQkJCSB2b2lkICppb2FkZHIpCit7CisJaW50IG1paV9scGE7CisKKwltaWlfbHBhID0gbWRpb19yZWFkIChkZXYsIHRwLT5waHlzWzBdLCBNSUlfTFBBKTsKKworCWlmICghdHAtPm1paS5mb3JjZV9tZWRpYSAmJiBtaWlfbHBhICE9IDB4ZmZmZikgeworCQlpbnQgZHVwbGV4ID0gKG1paV9scGEgJiBMUEFfMTAwRlVMTCkKKwkJICAgIHx8IChtaWlfbHBhICYgMHgwMUMwKSA9PSAweDAwNDA7CisJCWlmICh0cC0+bWlpLmZ1bGxfZHVwbGV4ICE9IGR1cGxleCkgeworCQkJdHAtPm1paS5mdWxsX2R1cGxleCA9IGR1cGxleDsKKworCQkJaWYgKG1paV9scGEpIHsKKwkJCQlwcmludGsgKEtFUk5fSU5GTworCQkJCQkiJXM6IFNldHRpbmcgJXMtZHVwbGV4IGJhc2VkIG9uIE1JSSAjJWQgbGluayIKKwkJCQkJIiBwYXJ0bmVyIGFiaWxpdHkgb2YgJTQuNHguXG4iLAorCQkJCQlkZXYtPm5hbWUsCisJCQkJCXRwLT5taWkuZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIsCisJCQkJCXRwLT5waHlzWzBdLCBtaWlfbHBhKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogbWVkaWEgaXMgdW5jb25uZWN0ZWQsIGxpbmsgZG93biwgb3IgaW5jb21wYXRpYmxlIGNvbm5lY3Rpb25cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQl9CisjaWYgMAorCQkJUlRMX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJCQlSVExfVzggKENvbmZpZzEsIHRwLT5taWkuZnVsbF9kdXBsZXggPyAweDYwIDogMHgyMCk7CisJCQlSVExfVzggKENmZzkzNDYsIENmZzkzNDZfTG9jayk7CisjZW5kaWYKKwkJfQorCX0KKworCW5leHRfdGljayA9IEhaICogNjA7CisKKwlydGw4MTM5X3R1bmVfdHdpc3RlciAoZGV2LCB0cCk7CisKKwlEUFJJTlRLICgiJXM6IE1lZGlhIHNlbGVjdGlvbiB0aWNrLCBMaW5rIHBhcnRuZXIgJTQuNHguXG4iLAorCQkgZGV2LT5uYW1lLCBSVExfUjE2IChOV2F5TFBBUikpOworCURQUklOVEsgKCIlczogIE90aGVyIHJlZ2lzdGVycyBhcmUgSW50TWFzayAlNC40eCBJbnRTdGF0dXMgJTQuNHhcbiIsCisJCSBkZXYtPm5hbWUsIFJUTF9SMTYgKEludHJNYXNrKSwgUlRMX1IxNiAoSW50clN0YXR1cykpOworCURQUklOVEsgKCIlczogIENoaXAgY29uZmlnICUyLjJ4ICUyLjJ4LlxuIiwKKwkJIGRldi0+bmFtZSwgUlRMX1I4IChDb25maWcwKSwKKwkJIFJUTF9SOCAoQ29uZmlnMSkpOworfQorCitzdGF0aWMgaW50IHJ0bDgxMzlfdGhyZWFkICh2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlkYWVtb25pemUoIiVzIiwgZGV2LT5uYW1lKTsKKwlhbGxvd19zaWduYWwoU0lHVEVSTSk7CisKKwl3aGlsZSAoMSkgeworCQl0aW1lb3V0ID0gbmV4dF90aWNrOworCQlkbyB7CisJCQl0aW1lb3V0ID0gaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0ICgmdHAtPnRocl93YWl0LCB0aW1lb3V0KTsKKwkJCS8qIG1ha2Ugc3dzdXNwIGhhcHB5IHdpdGggb3VyIHRocmVhZCAqLworCQkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCQl9IHdoaWxlICghc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpICYmICh0aW1lb3V0ID4gMCkpOworCisJCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpIHsKKwkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisJCX0KKworCQlpZiAodHAtPnRpbWVfdG9fZGllKQorCQkJYnJlYWs7CisKKwkJaWYgKHJ0bmxfbG9ja19pbnRlcnJ1cHRpYmxlICgpKQorCQkJYnJlYWs7CisJCXJ0bDgxMzlfdGhyZWFkX2l0ZXIgKGRldiwgdHAsIHRwLT5tbWlvX2FkZHIpOworCQlydG5sX3VubG9jayAoKTsKKwl9CisKKwljb21wbGV0ZV9hbmRfZXhpdCAoJnRwLT50aHJfZXhpdGVkLCAwKTsKK30KKworc3RhdGljIHZvaWQgcnRsODEzOV9zdGFydF90aHJlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl0cC0+dGhyX3BpZCA9IC0xOworCXRwLT50d2lzdGllID0gMDsKKwl0cC0+dGltZV90b19kaWUgPSAwOworCWlmICh0cC0+Y2hpcHNldCA9PSBDSF84MTM5X0spCisJCXRwLT50d2lzdGllID0gMTsKKwllbHNlIGlmICh0cC0+ZHJ2X2ZsYWdzICYgSEFTX0xOS19DSE5HKQorCQlyZXR1cm47CisKKwl0cC0+dGhyX3BpZCA9IGtlcm5lbF90aHJlYWQocnRsODEzOV90aHJlYWQsIGRldiwgQ0xPTkVfRlN8Q0xPTkVfRklMRVMpOworCWlmICh0cC0+dGhyX3BpZCA8IDApIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gc3RhcnQga2VybmVsIHRocmVhZFxuIiwKKwkJCWRldi0+bmFtZSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsODEzOV90eF9jbGVhciAoc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHApCit7CisJdHAtPmN1cl90eCA9IDA7CisJdHAtPmRpcnR5X3R4ID0gMDsKKworCS8qIFhYWCBhY2NvdW50IGZvciB1bnNlbnQgVHggcGFja2V0cyBpbiB0cC0+c3RhdHMudHhfZHJvcHBlZCAqLworfQorCisKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgaTsKKwl1OCB0bXA4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcmludGsgKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCB0aW1lb3V0LCBzdGF0dXMgJTIuMnggJTQuNHggJTQuNHggIgorCQkibWVkaWEgJTIuMnguXG4iLCBkZXYtPm5hbWUsIFJUTF9SOCAoQ2hpcENtZCksCisJCVJUTF9SMTYoSW50clN0YXR1cyksIFJUTF9SMTYoSW50ck1hc2spLCBSVExfUjgoTWVkaWFTdGF0dXMpKTsKKwkvKiBFbWl0IGluZm8gdG8gZmlndXJlIG91dCB3aGF0IHdlbnQgd3JvbmcuICovCisJcHJpbnRrIChLRVJOX0RFQlVHICIlczogVHggcXVldWUgc3RhcnQgZW50cnkgJWxkICBkaXJ0eSBlbnRyeSAlbGQuXG4iLAorCQlkZXYtPm5hbWUsIHRwLT5jdXJfdHgsIHRwLT5kaXJ0eV90eCk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKyspCisJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6ICBUeCBkZXNjcmlwdG9yICVkIGlzICU4LjhseC4lc1xuIiwKKwkJCWRldi0+bmFtZSwgaSwgUlRMX1IzMiAoVHhTdGF0dXMwICsgKGkgKiA0KSksCisJCQlpID09IHRwLT5kaXJ0eV90eCAlIE5VTV9UWF9ERVNDID8KKwkJCQkiIChxdWV1ZSBoZWFkKSIgOiAiIik7CisKKwl0cC0+eHN0YXRzLnR4X3RpbWVvdXRzKys7CisKKwkvKiBkaXNhYmxlIFR4IEFTQVAsIGlmIG5vdCBhbHJlYWR5ICovCisJdG1wOCA9IFJUTF9SOCAoQ2hpcENtZCk7CisJaWYgKHRtcDggJiBDbWRUeEVuYikKKwkJUlRMX1c4IChDaGlwQ21kLCBDbWRSeEVuYik7CisKKwlzcGluX2xvY2soJnRwLT5yeF9sb2NrKTsKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCVJUTF9XMTYgKEludHJNYXNrLCAweDAwMDApOworCisJLyogU3RvcCBhIHNoYXJlZCBpbnRlcnJ1cHQgZnJvbSBzY2F2ZW5naW5nIHdoaWxlIHdlIGFyZS4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSAoJnRwLT5sb2NrLCBmbGFncyk7CisJcnRsODEzOV90eF9jbGVhciAodHApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJLyogLi4uYW5kIGZpbmFsbHksIHJlc2V0IGV2ZXJ5dGhpbmcgKi8KKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXJ0bDgxMzlfaHdfc3RhcnQgKGRldik7CisJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJfQorCXNwaW5fdW5sb2NrKCZ0cC0+cnhfbG9jayk7Cit9CisKKworc3RhdGljIGludCBydGw4MTM5X3N0YXJ0X3htaXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdW5zaWduZWQgaW50IGVudHJ5OworCXVuc2lnbmVkIGludCBsZW4gPSBza2ItPmxlbjsKKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0gdHAtPmN1cl90eCAlIE5VTV9UWF9ERVNDOworCisJLyogTm90ZTogdGhlIGNoaXAgZG9lc24ndCBoYXZlIGF1dG8tcGFkISAqLworCWlmIChsaWtlbHkobGVuIDwgVFhfQlVGX1NJWkUpKSB7CisJCWlmIChsZW4gPCBFVEhfWkxFTikKKwkJCW1lbXNldCh0cC0+dHhfYnVmW2VudHJ5XSwgMCwgRVRIX1pMRU4pOworCQlza2JfY29weV9hbmRfY3N1bV9kZXYoc2tiLCB0cC0+dHhfYnVmW2VudHJ5XSk7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9IGVsc2UgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXRwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlSVExfVzMyX0YgKFR4U3RhdHVzMCArIChlbnRyeSAqIHNpemVvZiAodTMyKSksCisJCSAgIHRwLT50eF9mbGFnIHwgbWF4KGxlbiwgKHVuc2lnbmVkIGludClFVEhfWkxFTikpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwl0cC0+Y3VyX3R4Kys7CisJd21iKCk7CisKKwlpZiAoKHRwLT5jdXJfdHggLSBOVU1fVFhfREVTQykgPT0gdHAtPmRpcnR5X3R4KQorCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJaWYgKG5ldGlmX21zZ190eF9xdWV1ZWQodHApKQorCQlwcmludGsgKEtFUk5fREVCVUcgIiVzOiBRdWV1ZWQgVHggcGFja2V0IHNpemUgJXUgdG8gc2xvdCAlZC5cbiIsCisJCQlkZXYtPm5hbWUsIGxlbiwgZW50cnkpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgcnRsODEzOV90eF9pbnRlcnJ1cHQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCwKKwkJCQkgIHZvaWQgKmlvYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGRpcnR5X3R4LCB0eF9sZWZ0OworCisJYXNzZXJ0IChkZXYgIT0gTlVMTCk7CisJYXNzZXJ0IChpb2FkZHIgIT0gTlVMTCk7CisKKwlkaXJ0eV90eCA9IHRwLT5kaXJ0eV90eDsKKwl0eF9sZWZ0ID0gdHAtPmN1cl90eCAtIGRpcnR5X3R4OworCXdoaWxlICh0eF9sZWZ0ID4gMCkgeworCQlpbnQgZW50cnkgPSBkaXJ0eV90eCAlIE5VTV9UWF9ERVNDOworCQlpbnQgdHhzdGF0dXM7CisKKwkJdHhzdGF0dXMgPSBSVExfUjMyIChUeFN0YXR1czAgKyAoZW50cnkgKiBzaXplb2YgKHUzMikpKTsKKworCQlpZiAoISh0eHN0YXR1cyAmIChUeFN0YXRPSyB8IFR4VW5kZXJydW4gfCBUeEFib3J0ZWQpKSkKKwkJCWJyZWFrOwkvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBUeGVkICovCisKKwkJLyogTm90ZTogVHhDYXJyaWVyTG9zdCBpcyBhbHdheXMgYXNzZXJ0ZWQgYXQgMTAwbWJwcy4gKi8KKwkJaWYgKHR4c3RhdHVzICYgKFR4T3V0T2ZXaW5kb3cgfCBUeEFib3J0ZWQpKSB7CisJCQkvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KKwkJCWlmIChuZXRpZl9tc2dfdHhfZXJyKHRwKSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRyYW5zbWl0IGVycm9yLCBUeCBzdGF0dXMgJTguOHguXG4iLAorCQkJCQlkZXYtPm5hbWUsIHR4c3RhdHVzKTsKKwkJCXRwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmICh0eHN0YXR1cyAmIFR4QWJvcnRlZCkgeworCQkJCXRwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCVJUTF9XMzIgKFR4Q29uZmlnLCBUeENsZWFyQWJ0KTsKKwkJCQlSVExfVzE2IChJbnRyU3RhdHVzLCBUeEVycik7CisJCQkJd21iKCk7CisJCQl9CisJCQlpZiAodHhzdGF0dXMgJiBUeENhcnJpZXJMb3N0KQorCQkJCXRwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJaWYgKHR4c3RhdHVzICYgVHhPdXRPZldpbmRvdykKKwkJCQl0cC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJaWYgKHR4c3RhdHVzICYgVHhVbmRlcnJ1bikgeworCQkJCS8qIEFkZCA2NCB0byB0aGUgVHggRklGTyB0aHJlc2hvbGQuICovCisJCQkJaWYgKHRwLT50eF9mbGFnIDwgMHgwMDMwMDAwMCkKKwkJCQkJdHAtPnR4X2ZsYWcgKz0gMHgwMDAyMDAwMDsKKwkJCQl0cC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCX0KKwkJCXRwLT5zdGF0cy5jb2xsaXNpb25zICs9ICh0eHN0YXR1cyA+PiAyNCkgJiAxNTsKKwkJCXRwLT5zdGF0cy50eF9ieXRlcyArPSB0eHN0YXR1cyAmIDB4N2ZmOworCQkJdHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCisJCWRpcnR5X3R4Kys7CisJCXR4X2xlZnQtLTsKKwl9CisKKyNpZm5kZWYgUlRMODEzOV9OREVCVUcKKwlpZiAodHAtPmN1cl90eCAtIGRpcnR5X3R4ID4gTlVNX1RYX0RFU0MpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IE91dC1vZi1zeW5jIGRpcnR5IHBvaW50ZXIsICVsZCB2cy4gJWxkLlxuIiwKKwkJICAgICAgICBkZXYtPm5hbWUsIGRpcnR5X3R4LCB0cC0+Y3VyX3R4KTsKKwkJZGlydHlfdHggKz0gTlVNX1RYX0RFU0M7CisJfQorI2VuZGlmIC8qIFJUTDgxMzlfTkRFQlVHICovCisKKwkvKiBvbmx5IHdha2UgdGhlIHF1ZXVlIGlmIHdlIGRpZCB3b3JrLCBhbmQgdGhlIHF1ZXVlIGlzIHN0b3BwZWQgKi8KKwlpZiAodHAtPmRpcnR5X3R4ICE9IGRpcnR5X3R4KSB7CisJCXRwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCQltYigpOworCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCX0KK30KKworCisvKiBUT0RPOiBjbGVhbiB0aGlzIHVwISAgUnggcmVzZXQgbmVlZCBub3QgYmUgdGhpcyBpbnRlbnNpdmUgKi8KK3N0YXRpYyB2b2lkIHJ0bDgxMzlfcnhfZXJyICh1MzIgcnhfc3RhdHVzLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwLCB2b2lkICppb2FkZHIpCit7CisJdTggdG1wODsKKyNpZmRlZiBDT05GSUdfODEzOV9PTERfUlhfUkVTRVQKKwlpbnQgdG1wX3dvcms7CisjZW5kaWYKKworCWlmIChuZXRpZl9tc2dfcnhfZXJyICh0cCkpIAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEV0aGVybmV0IGZyYW1lIGhhZCBlcnJvcnMsIHN0YXR1cyAlOC44eC5cbiIsCisJCQlkZXYtPm5hbWUsIHJ4X3N0YXR1cyk7CisJdHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCWlmICghKHJ4X3N0YXR1cyAmIFJ4U3RhdHVzT0spKSB7CisJCWlmIChyeF9zdGF0dXMgJiBSeFRvb0xvbmcpIHsKKwkJCURQUklOVEsgKCIlczogT3ZlcnNpemVkIEV0aGVybmV0IGZyYW1lLCBzdGF0dXMgJTQuNHghXG4iLAorCQkJIAlkZXYtPm5hbWUsIHJ4X3N0YXR1cyk7CisJCQkvKiBBLkMuOiBUaGUgY2hpcCBoYW5ncyBoZXJlLiAqLworCQl9CisJCWlmIChyeF9zdGF0dXMgJiAoUnhCYWRTeW1ib2wgfCBSeEJhZEFsaWduKSkKKwkJCXRwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJaWYgKHJ4X3N0YXR1cyAmIChSeFJ1bnQgfCBSeFRvb0xvbmcpKQorCQkJdHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJaWYgKHJ4X3N0YXR1cyAmIFJ4Q1JDRXJyKQorCQkJdHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwl9IGVsc2UgeworCQl0cC0+eHN0YXRzLnJ4X2xvc3RfaW5fcmluZysrOworCX0KKworI2lmbmRlZiBDT05GSUdfODEzOV9PTERfUlhfUkVTRVQKKwl0bXA4ID0gUlRMX1I4IChDaGlwQ21kKTsKKwlSVExfVzggKENoaXBDbWQsIHRtcDggJiB+Q21kUnhFbmIpOworCVJUTF9XOCAoQ2hpcENtZCwgdG1wOCk7CisJUlRMX1czMiAoUnhDb25maWcsIHRwLT5yeF9jb25maWcpOworCXRwLT5jdXJfcnggPSAwOworI2Vsc2UKKwkvKiBSZXNldCB0aGUgcmVjZWl2ZXIsIGJhc2VkIG9uIFJlYWxUZWsgcmVjb21tZW5kYXRpb24uIChCdWc/KSAqLworCisJLyogZGlzYWJsZSByZWNlaXZlICovCisJUlRMX1c4X0YgKENoaXBDbWQsIENtZFR4RW5iKTsKKwl0bXBfd29yayA9IDIwMDsKKwl3aGlsZSAoLS10bXBfd29yayA+IDApIHsKKwkJdWRlbGF5KDEpOworCQl0bXA4ID0gUlRMX1I4IChDaGlwQ21kKTsKKwkJaWYgKCEodG1wOCAmIENtZFJ4RW5iKSkKKwkJCWJyZWFrOworCX0KKwlpZiAodG1wX3dvcmsgPD0gMCkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgUEZYICJyeCBzdG9wIHdhaXQgdG9vIGxvbmdcbiIpOworCS8qIHJlc3RhcnQgcmVjZWl2ZSAqLworCXRtcF93b3JrID0gMjAwOworCXdoaWxlICgtLXRtcF93b3JrID4gMCkgeworCQlSVExfVzhfRiAoQ2hpcENtZCwgQ21kUnhFbmIgfCBDbWRUeEVuYik7CisJCXVkZWxheSgxKTsKKwkJdG1wOCA9IFJUTF9SOCAoQ2hpcENtZCk7CisJCWlmICgodG1wOCAmIENtZFJ4RW5iKSAmJiAodG1wOCAmIENtZFR4RW5iKSkKKwkJCWJyZWFrOworCX0KKwlpZiAodG1wX3dvcmsgPD0gMCkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgUEZYICJ0eC9yeCBlbmFibGUgd2FpdCB0b28gbG9uZ1xuIik7CisKKwkvKiBhbmQgcmVpbml0aWFsaXplIGFsbCByeCByZWxhdGVkIHJlZ2lzdGVycyAqLworCVJUTF9XOF9GIChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJLyogTXVzdCBlbmFibGUgVHgvUnggYmVmb3JlIHNldHRpbmcgdHJhbnNmZXIgdGhyZXNob2xkcyEgKi8KKwlSVExfVzggKENoaXBDbWQsIENtZFJ4RW5iIHwgQ21kVHhFbmIpOworCisJdHAtPnJ4X2NvbmZpZyA9IHJ0bDgxMzlfcnhfY29uZmlnIHwgQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXlQaHlzOworCVJUTF9XMzIgKFJ4Q29uZmlnLCB0cC0+cnhfY29uZmlnKTsKKwl0cC0+Y3VyX3J4ID0gMDsKKworCURQUklOVEsoImluaXQgYnVmZmVyIGFkZHJlc3Nlc1xuIik7CisKKwkvKiBMb2NrIENvbmZpZ1swMTIzNF0gYW5kIEJNQ1IgcmVnaXN0ZXIgd3JpdGVzICovCisJUlRMX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCisJLyogaW5pdCBSeCByaW5nIGJ1ZmZlciBETUEgYWRkcmVzcyAqLworCVJUTF9XMzJfRiAoUnhCdWYsIHRwLT5yeF9yaW5nX2RtYSk7CisKKwkvKiBBLkMuOiBSZXNldCB0aGUgbXVsdGljYXN0IGxpc3QuICovCisJX19zZXRfcnhfbW9kZSAoZGV2KTsKKyNlbmRpZgorfQorCisjaWYgUlhfQlVGX0lEWCA9PSAzCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHdyYXBfY29weShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyaW5nLAorCQkJCSB1MzIgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1MzIgbGVmdCA9IFJYX0JVRl9MRU4gLSBvZmZzZXQ7CisKKwlpZiAoc2l6ZSA+IGxlZnQpIHsKKwkJbWVtY3B5KHNrYi0+ZGF0YSwgcmluZyArIG9mZnNldCwgbGVmdCk7CisJCW1lbWNweShza2ItPmRhdGErbGVmdCwgcmluZywgc2l6ZSAtIGxlZnQpOworCX0gZWxzZQorCQltZW1jcHkoc2tiLT5kYXRhLCByaW5nICsgb2Zmc2V0LCBzaXplKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBydGw4MTM5X2lzcl9hY2soc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHApCit7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1MTYgc3RhdHVzOworCisJc3RhdHVzID0gUlRMX1IxNiAoSW50clN0YXR1cykgJiBSeEFja0JpdHM7CisKKwkvKiBDbGVhciBvdXQgZXJyb3JzIGFuZCByZWNlaXZlIGludGVycnVwdHMgKi8KKwlpZiAobGlrZWx5KHN0YXR1cyAhPSAwKSkgeworCQlpZiAodW5saWtlbHkoc3RhdHVzICYgKFJ4RklGT092ZXIgfCBSeE92ZXJmbG93KSkpIHsKKwkJCXRwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBSeEZJRk9PdmVyKQorCQkJCXRwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQl9CisJCVJUTF9XMTZfRiAoSW50clN0YXR1cywgUnhBY2tCaXRzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcnRsODEzOV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCwKKwkJICAgICAgaW50IGJ1ZGdldCkKK3sKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCWludCByZWNlaXZlZCA9IDA7CisJdW5zaWduZWQgY2hhciAqcnhfcmluZyA9IHRwLT5yeF9yaW5nOworCXVuc2lnbmVkIGludCBjdXJfcnggPSB0cC0+Y3VyX3J4OworCXVuc2lnbmVkIGludCByeF9zaXplID0gMDsKKworCURQUklOVEsgKCIlczogSW4gcnRsODEzOV9yeCgpLCBjdXJyZW50ICU0LjR4IEJ1ZkFkZHIgJTQuNHgsIgorCQkgIiBmcmVlIHRvICU0LjR4LCBDbWQgJTIuMnguXG4iLCBkZXYtPm5hbWUsICh1MTYpY3VyX3J4LAorCQkgUlRMX1IxNiAoUnhCdWZBZGRyKSwKKwkJIFJUTF9SMTYgKFJ4QnVmUHRyKSwgUlRMX1I4IChDaGlwQ21kKSk7CisKKwl3aGlsZSAobmV0aWZfcnVubmluZyhkZXYpICYmIHJlY2VpdmVkIDwgYnVkZ2V0IAorCSAgICAgICAmJiAoUlRMX1I4IChDaGlwQ21kKSAmIFJ4QnVmRW1wdHkpID09IDApIHsKKwkJdTMyIHJpbmdfb2Zmc2V0ID0gY3VyX3J4ICUgUlhfQlVGX0xFTjsKKwkJdTMyIHJ4X3N0YXR1czsKKwkJdW5zaWduZWQgaW50IHBrdF9zaXplOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXJtYigpOworCisJCS8qIHJlYWQgc2l6ZStzdGF0dXMgb2YgbmV4dCBmcmFtZSBmcm9tIERNQSByaW5nIGJ1ZmZlciAqLworCQlyeF9zdGF0dXMgPSBsZTMyX3RvX2NwdSAoKih1MzIgKikgKHJ4X3JpbmcgKyByaW5nX29mZnNldCkpOworCQlyeF9zaXplID0gcnhfc3RhdHVzID4+IDE2OworCQlwa3Rfc2l6ZSA9IHJ4X3NpemUgLSA0OworCisJCWlmIChuZXRpZl9tc2dfcnhfc3RhdHVzKHRwKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIHJ0bDgxMzlfcngoKSBzdGF0dXMgJTQuNHgsIHNpemUgJTQuNHgsIgorCQkJCSIgY3VyICU0LjR4LlxuIiwgZGV2LT5uYW1lLCByeF9zdGF0dXMsCisJCQkgcnhfc2l6ZSwgY3VyX3J4KTsKKyNpZiBSVEw4MTM5X0RFQlVHID4gMgorCQl7CisJCQlpbnQgaTsKKwkJCURQUklOVEsgKCIlczogRnJhbWUgY29udGVudHMgIiwgZGV2LT5uYW1lKTsKKwkJCWZvciAoaSA9IDA7IGkgPCA3MDsgaSsrKQorCQkJCXByaW50ayAoIiAlMi4yeCIsCisJCQkJCXJ4X3JpbmdbcmluZ19vZmZzZXQgKyBpXSk7CisJCQlwcmludGsgKCIuXG4iKTsKKwkJfQorI2VuZGlmCisKKwkJLyogUGFja2V0IGNvcHkgZnJvbSBGSUZPIHN0aWxsIGluIHByb2dyZXNzLgorCQkgKiBUaGVvcmV0aWNhbGx5LCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJICogc2luY2UgRWFybHlSeCBpcyBkaXNhYmxlZC4KKwkJICovCisJCWlmICh1bmxpa2VseShyeF9zaXplID09IDB4ZmZmMCkpIHsKKwkJCWlmICghdHAtPmZpZm9fY29weV90aW1lb3V0KQorCQkJCXRwLT5maWZvX2NvcHlfdGltZW91dCA9IGppZmZpZXMgKyAyOworCQkJZWxzZSBpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0cC0+Zmlmb19jb3B5X3RpbWVvdXQpKSB7CisJCQkJRFBSSU5USyAoIiVzOiBodW5nIEZJRk8uIFJlc2V0LiIsIGRldi0+bmFtZSk7CisJCQkJcnhfc2l6ZSA9IDA7CisJCQkJZ290byBub19lYXJseV9yeDsKKwkJCX0KKwkJCWlmIChuZXRpZl9tc2dfaW50cih0cCkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZpZm8gY29weSBpbiBwcm9ncmVzcy4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJfQorCQkJdHAtPnhzdGF0cy5lYXJseV9yeCsrOworCQkJYnJlYWs7CisJCX0KKworbm9fZWFybHlfcng6CisJCXRwLT5maWZvX2NvcHlfdGltZW91dCA9IDA7CisKKwkJLyogSWYgUnggZXJyIG9yIGludmFsaWQgcnhfc2l6ZS9yeF9zdGF0dXMgcmVjZWl2ZWQKKwkJICogKHdoaWNoIGhhcHBlbnMgaWYgd2UgZ2V0IGxvc3QgaW4gdGhlIHJpbmcpLAorCQkgKiBSeCBwcm9jZXNzIGdldHMgcmVzZXQsIHNvIHdlIGFib3J0IGFueSBmdXJ0aGVyCisJCSAqIFJ4IHByb2Nlc3NpbmcuCisJCSAqLworCQlpZiAodW5saWtlbHkoKHJ4X3NpemUgPiAoTUFYX0VUSF9GUkFNRV9TSVpFKzQpKSB8fAorCQkJICAgICAocnhfc2l6ZSA8IDgpIHx8CisJCQkgICAgICghKHJ4X3N0YXR1cyAmIFJ4U3RhdHVzT0spKSkpIHsKKwkJCXJ0bDgxMzlfcnhfZXJyIChyeF9zdGF0dXMsIGRldiwgdHAsIGlvYWRkcik7CisJCQlyZWNlaXZlZCA9IC0xOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlciwgY29tcGF0aWJsZSB3aXRoIG5ldC0yZS4gKi8KKwkJLyogT21pdCB0aGUgZm91ciBvY3RldCBDUkMgZnJvbSB0aGUgbGVuZ3RoLiAqLworCisJCXNrYiA9IGRldl9hbGxvY19za2IgKHBrdF9zaXplICsgMik7CisJCWlmIChsaWtlbHkoc2tiKSkgeworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgZmllbGRzLiAqLworI2lmIFJYX0JVRl9JRFggPT0gMworCQkJd3JhcF9jb3B5KHNrYiwgcnhfcmluZywgcmluZ19vZmZzZXQrNCwgcGt0X3NpemUpOworI2Vsc2UKKwkJCWV0aF9jb3B5X2FuZF9zdW0gKHNrYiwgJnJ4X3JpbmdbcmluZ19vZmZzZXQgKyA0XSwgcGt0X3NpemUsIDApOworI2VuZGlmCisJCQlza2JfcHV0IChza2IsIHBrdF9zaXplKTsKKworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zIChza2IsIGRldik7CisKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQl0cC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X3NpemU7CisJCQl0cC0+c3RhdHMucnhfcGFja2V0cysrOworCisJCQluZXRpZl9yZWNlaXZlX3NrYiAoc2tiKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIAorCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HCisJCQkJCSIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQl0cC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQl9CisJCXJlY2VpdmVkKys7CisKKwkJY3VyX3J4ID0gKGN1cl9yeCArIHJ4X3NpemUgKyA0ICsgMykgJiB+MzsKKwkJUlRMX1cxNiAoUnhCdWZQdHIsICh1MTYpIChjdXJfcnggLSAxNikpOworCisJCXJ0bDgxMzlfaXNyX2Fjayh0cCk7CisJfQorCisJaWYgKHVubGlrZWx5KCFyZWNlaXZlZCB8fCByeF9zaXplID09IDB4ZmZmMCkpCisJCXJ0bDgxMzlfaXNyX2Fjayh0cCk7CisKKyNpZiBSVEw4MTM5X0RFQlVHID4gMQorCURQUklOVEsgKCIlczogRG9uZSBydGw4MTM5X3J4KCksIGN1cnJlbnQgJTQuNHggQnVmQWRkciAlNC40eCwiCisJCSAiIGZyZWUgdG8gJTQuNHgsIENtZCAlMi4yeC5cbiIsIGRldi0+bmFtZSwgY3VyX3J4LAorCQkgUlRMX1IxNiAoUnhCdWZBZGRyKSwKKwkJIFJUTF9SMTYgKFJ4QnVmUHRyKSwgUlRMX1I4IChDaGlwQ21kKSk7CisjZW5kaWYKKworCXRwLT5jdXJfcnggPSBjdXJfcng7CisKKwkvKgorCSAqIFRoZSByZWNlaXZlIGJ1ZmZlciBzaG91bGQgYmUgbW9zdGx5IGVtcHR5LgorCSAqIFRlbGwgTkFQSSB0byByZWVuYWJsZSB0aGUgUnggaXJxLgorCSAqLworCWlmICh0cC0+Zmlmb19jb3B5X3RpbWVvdXQpCisJCXJlY2VpdmVkID0gYnVkZ2V0OworCitvdXQ6CisJcmV0dXJuIHJlY2VpdmVkOworfQorCisKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfd2VpcmRfaW50ZXJydXB0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAsCisJCQkJICAgICB2b2lkICppb2FkZHIsCisJCQkJICAgICBpbnQgc3RhdHVzLCBpbnQgbGlua19jaGFuZ2VkKQoreworCURQUklOVEsgKCIlczogQWJub3JtYWwgaW50ZXJydXB0LCBzdGF0dXMgJTguOHguXG4iLAorCQkgZGV2LT5uYW1lLCBzdGF0dXMpOworCisJYXNzZXJ0IChkZXYgIT0gTlVMTCk7CisJYXNzZXJ0ICh0cCAhPSBOVUxMKTsKKwlhc3NlcnQgKGlvYWRkciAhPSBOVUxMKTsKKworCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnQuICovCisJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gUlRMX1IzMiAoUnhNaXNzZWQpOworCVJUTF9XMzIgKFJ4TWlzc2VkLCAwKTsKKworCWlmICgoc3RhdHVzICYgUnhVbmRlcnJ1bikgJiYgbGlua19jaGFuZ2VkICYmCisJICAgICh0cC0+ZHJ2X2ZsYWdzICYgSEFTX0xOS19DSE5HKSkgeworCQlydGxfY2hlY2tfbWVkaWEoZGV2LCAwKTsKKwkJc3RhdHVzICY9IH5SeFVuZGVycnVuOworCX0KKworCWlmIChzdGF0dXMgJiAoUnhVbmRlcnJ1biB8IFJ4RXJyKSkKKwkJdHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCisJaWYgKHN0YXR1cyAmIFBDU1RpbWVvdXQpCisJCXRwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFJ4VW5kZXJydW4pCisJCXRwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBQQ0lFcnIpIHsKKwkJdTE2IHBjaV9jbWRfc3RhdHVzOworCQlwY2lfcmVhZF9jb25maWdfd29yZCAodHAtPnBjaV9kZXYsIFBDSV9TVEFUVVMsICZwY2lfY21kX3N0YXR1cyk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZCAodHAtPnBjaV9kZXYsIFBDSV9TVEFUVVMsIHBjaV9jbWRfc3RhdHVzKTsKKworCQlwcmludGsgKEtFUk5fRVJSICIlczogUENJIEJ1cyBlcnJvciAlNC40eC5cbiIsCisJCQlkZXYtPm5hbWUsIHBjaV9jbWRfc3RhdHVzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcnRsODEzOV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCWludCBvcmlnX2J1ZGdldCA9IG1pbigqYnVkZ2V0LCBkZXYtPnF1b3RhKTsKKwlpbnQgZG9uZSA9IDE7CisKKwlzcGluX2xvY2soJnRwLT5yeF9sb2NrKTsKKwlpZiAobGlrZWx5KFJUTF9SMTYoSW50clN0YXR1cykgJiBSeEFja0JpdHMpKSB7CisJCWludCB3b3JrX2RvbmU7CisKKwkJd29ya19kb25lID0gcnRsODEzOV9yeChkZXYsIHRwLCBvcmlnX2J1ZGdldCk7CisJCWlmIChsaWtlbHkod29ya19kb25lID4gMCkpIHsKKwkJCSpidWRnZXQgLT0gd29ya19kb25lOworCQkJZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisJCQlkb25lID0gKHdvcmtfZG9uZSA8IG9yaWdfYnVkZ2V0KTsKKwkJfQorCX0KKworCWlmIChkb25lKSB7CisJCS8qCisJCSAqIE9yZGVyIGlzIGltcG9ydGFudCBzaW5jZSBkYXRhIGNhbiBnZXQgaW50ZXJydXB0ZWQKKwkJICogYWdhaW4gd2hlbiB3ZSB0aGluayB3ZSBhcmUgZG9uZS4KKwkJICovCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCVJUTF9XMTZfRihJbnRyTWFzaywgcnRsODEzOV9pbnRyX21hc2spOworCQlfX25ldGlmX3J4X2NvbXBsZXRlKGRldik7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9CisJc3Bpbl91bmxvY2soJnRwLT5yeF9sb2NrKTsKKworCXJldHVybiAhZG9uZTsKK30KKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworc3RhdGljIGlycXJldHVybl90IHJ0bDgxMzlfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdTE2IHN0YXR1cywgYWNrc3RhdDsKKwlpbnQgbGlua19jaGFuZ2VkID0gMDsgLyogYXZvaWQgYm9ndXMgInVuaW5pdCIgd2FybmluZyAqLworCWludCBoYW5kbGVkID0gMDsKKworCXNwaW5fbG9jayAoJnRwLT5sb2NrKTsKKwlzdGF0dXMgPSBSVExfUjE2IChJbnRyU3RhdHVzKTsKKworCS8qIHNoYXJlZCBpcnE/ICovCisJaWYgKHVubGlrZWx5KChzdGF0dXMgJiBydGw4MTM5X2ludHJfbWFzaykgPT0gMCkpIAorCQlnb3RvIG91dDsKKworCWhhbmRsZWQgPSAxOworCisJLyogaC93IG5vIGxvbmdlciBwcmVzZW50IChob3RwbHVnPykgb3IgbWFqb3IgZXJyb3IsIGJhaWwgKi8KKwlpZiAodW5saWtlbHkoc3RhdHVzID09IDB4RkZGRikpIAorCQlnb3RvIG91dDsKKworCS8qIGNsb3NlIHBvc3NpYmxlIHJhY2UncyB3aXRoIGRldl9jbG9zZSAqLworCWlmICh1bmxpa2VseSghbmV0aWZfcnVubmluZyhkZXYpKSkgeworCQlSVExfVzE2IChJbnRyTWFzaywgMCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLCBidXQKKwkgICBhbiBmaXJzdCBnZXQgYW4gYWRkaXRpb25hbCBzdGF0dXMgYml0IGZyb20gQ1NDUi4gKi8KKwlpZiAodW5saWtlbHkoc3RhdHVzICYgUnhVbmRlcnJ1bikpCisJCWxpbmtfY2hhbmdlZCA9IFJUTF9SMTYgKENTQ1IpICYgQ1NDUl9MaW5rQ2hhbmdlQml0OworCisJYWNrc3RhdCA9IHN0YXR1cyAmIH4oUnhBY2tCaXRzIHwgVHhFcnIpOworCWlmIChhY2tzdGF0KQorCQlSVExfVzE2IChJbnRyU3RhdHVzLCBhY2tzdGF0KTsKKworCS8qIFJlY2VpdmUgcGFja2V0cyBhcmUgcHJvY2Vzc2VkIGJ5IHBvbGwgcm91dGluZS4KKwkgICBJZiBub3QgcnVubmluZyBzdGFydCBpdCBub3cuICovCisJaWYgKHN0YXR1cyAmIFJ4QWNrQml0cyl7CisJCWlmIChuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpIHsKKwkJCVJUTF9XMTZfRiAoSW50ck1hc2ssIHJ0bDgxMzlfbm9yeF9pbnRyX21hc2spOworCQkJX19uZXRpZl9yeF9zY2hlZHVsZSAoZGV2KTsKKwkJfQorCX0KKworCS8qIENoZWNrIHVuY29tbW9uIGV2ZW50cyB3aXRoIG9uZSB0ZXN0LiAqLworCWlmICh1bmxpa2VseShzdGF0dXMgJiAoUENJRXJyIHwgUENTVGltZW91dCB8IFJ4VW5kZXJydW4gfCBSeEVycikpKQorCQlydGw4MTM5X3dlaXJkX2ludGVycnVwdCAoZGV2LCB0cCwgaW9hZGRyLAorCQkJCQkgc3RhdHVzLCBsaW5rX2NoYW5nZWQpOworCisJaWYgKHN0YXR1cyAmIChUeE9LIHwgVHhFcnIpKSB7CisJCXJ0bDgxMzlfdHhfaW50ZXJydXB0IChkZXYsIHRwLCBpb2FkZHIpOworCQlpZiAoc3RhdHVzICYgVHhFcnIpCisJCQlSVExfVzE2IChJbnRyU3RhdHVzLCBUeEVycik7CisJfQorIG91dDoKKwlzcGluX3VubG9jayAoJnRwLT5sb2NrKTsKKworCURQUklOVEsgKCIlczogZXhpdGluZyBpbnRlcnJ1cHQsIGludHJfc3RhdHVzPSUjNC40eC5cbiIsCisJCSBkZXYtPm5hbWUsIFJUTF9SMTYgKEludHJTdGF0dXMpKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisvKgorICogUG9sbGluZyByZWNlaXZlIC0gdXNlZCBieSBuZXRjb25zb2xlIGFuZCBvdGhlciBkaWFnbm9zdGljIHRvb2xzCisgKiB0byBhbGxvdyBuZXR3b3JrIGkvbyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIHJ0bDgxMzlfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXJ0bDgxMzlfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcnRsODEzOV9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCWlmICh0cC0+dGhyX3BpZCA+PSAwKSB7CisJCXRwLT50aW1lX3RvX2RpZSA9IDE7CisJCXdtYigpOworCQlyZXQgPSBraWxsX3Byb2MgKHRwLT50aHJfcGlkLCBTSUdURVJNLCAxKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBzaWduYWwgdGhyZWFkXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uICgmdHAtPnRocl9leGl0ZWQpOworCX0KKwkKKwlpZiAobmV0aWZfbXNnX2lmZG93bih0cCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgMHglNC40eC5cbiIsCisJCQlkZXYtPm5hbWUsIFJUTF9SMTYgKEludHJTdGF0dXMpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmdHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggRE1BIHByb2Nlc3Nlcy4gKi8KKwlSVExfVzggKENoaXBDbWQsIDApOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlSVExfVzE2IChJbnRyTWFzaywgMCk7CisKKwkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50cy4gKi8KKwl0cC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBSVExfUjMyIChSeE1pc3NlZCk7CisJUlRMX1czMiAoUnhNaXNzZWQsIDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlzeW5jaHJvbml6ZV9pcnEgKGRldi0+aXJxKTsJLyogcmFjeSwgYnV0IHRoYXQncyBvayBoZXJlICovCisJZnJlZV9pcnEgKGRldi0+aXJxLCBkZXYpOworCisJcnRsODEzOV90eF9jbGVhciAodHApOworCisJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGNpX2RldiwgUlhfQlVGX1RPVF9MRU4sCisJCQkgICAgdHAtPnJ4X3JpbmcsIHRwLT5yeF9yaW5nX2RtYSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGNpX2RldiwgVFhfQlVGX1RPVF9MRU4sCisJCQkgICAgdHAtPnR4X2J1ZnMsIHRwLT50eF9idWZzX2RtYSk7CisJdHAtPnJ4X3JpbmcgPSBOVUxMOworCXRwLT50eF9idWZzID0gTlVMTDsKKworCS8qIEdyZWVuISBQdXQgdGhlIGNoaXAgaW4gbG93LXBvd2VyIG1vZGUuICovCisJUlRMX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisKKwlpZiAocnRsX2NoaXBfaW5mb1t0cC0+Y2hpcHNldF0uZmxhZ3MgJiBIYXNIbHRDbGspCisJCVJUTF9XOCAoSGx0Q2xrLCAnSCcpOwkvKiAnUicgd291bGQgbGVhdmUgdGhlIGNsb2NrIHJ1bm5pbmcuICovCisKKwlyZXR1cm4gMDsKK30KKworCisvKiBHZXQgdGhlIGV0aHRvb2wgV2FrZS1vbi1MQU4gc2V0dGluZ3MuICBBc3N1bWVzIHRoYXQgd29sIHBvaW50cyB0bworICAga2VybmVsIG1lbW9yeSwgKndvbCBoYXMgYmVlbiBpbml0aWFsaXplZCBhcyB7RVRIVE9PTF9HV09MfSwgYW5kCisgICBvdGhlciB0aHJlYWRzIG9yIGludGVycnVwdHMgYXJlbid0IG1lc3Npbmcgd2l0aCB0aGUgODEzOS4gICovCitzdGF0aWMgdm9pZCBydGw4MTM5X2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICppb2FkZHIgPSBucC0+bW1pb19hZGRyOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCWlmIChydGxfY2hpcF9pbmZvW25wLT5jaGlwc2V0XS5mbGFncyAmIEhhc0xXYWtlKSB7CisJCXU4IGNmZzMgPSBSVExfUjggKENvbmZpZzMpOworCQl1OCBjZmc1ID0gUlRMX1I4IChDb25maWc1KTsKKworCQl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfUEhZIHwgV0FLRV9NQUdJQworCQkJfCBXQUtFX1VDQVNUIHwgV0FLRV9NQ0FTVCB8IFdBS0VfQkNBU1Q7CisKKwkJd29sLT53b2xvcHRzID0gMDsKKwkJaWYgKGNmZzMgJiBDZmczX0xpbmtVcCkKKwkJCXdvbC0+d29sb3B0cyB8PSBXQUtFX1BIWTsKKwkJaWYgKGNmZzMgJiBDZmczX01hZ2ljKQorCQkJd29sLT53b2xvcHRzIHw9IFdBS0VfTUFHSUM7CisJCS8qIChLT04pRklYTUU6IFNlZSBob3cgbmV0ZGV2X3NldF93b2woKSBoYW5kbGVzIHRoZQorCQkgICBmb2xsb3dpbmcgY29uc3RhbnRzLiAgKi8KKwkJaWYgKGNmZzUgJiBDZmc1X1VXRikKKwkJCXdvbC0+d29sb3B0cyB8PSBXQUtFX1VDQVNUOworCQlpZiAoY2ZnNSAmIENmZzVfTVdGKQorCQkJd29sLT53b2xvcHRzIHw9IFdBS0VfTUNBU1Q7CisJCWlmIChjZmc1ICYgQ2ZnNV9CV0YpCisJCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9CQ0FTVDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7Cit9CisKKworLyogU2V0IHRoZSBldGh0b29sIFdha2Utb24tTEFOIHNldHRpbmdzLiAgUmV0dXJuIDAgb3IgLWVycm5vLiAgQXNzdW1lcworICAgdGhhdCB3b2wgcG9pbnRzIHRvIGtlcm5lbCBtZW1vcnkgYW5kIG90aGVyIHRocmVhZHMgb3IgaW50ZXJydXB0cworICAgYXJlbid0IG1lc3Npbmcgd2l0aCB0aGUgODEzOS4gICovCitzdGF0aWMgaW50IHJ0bDgxMzlfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgKmlvYWRkciA9IG5wLT5tbWlvX2FkZHI7CisJdTMyIHN1cHBvcnQ7CisJdTggY2ZnMywgY2ZnNTsKKworCXN1cHBvcnQgPSAoKHJ0bF9jaGlwX2luZm9bbnAtPmNoaXBzZXRdLmZsYWdzICYgSGFzTFdha2UpCisJCSAgID8gKFdBS0VfUEhZIHwgV0FLRV9NQUdJQworCQkgICAgICB8IFdBS0VfVUNBU1QgfCBXQUtFX01DQVNUIHwgV0FLRV9CQ0FTVCkKKwkJICAgOiAwKTsKKwlpZiAod29sLT53b2xvcHRzICYgfnN1cHBvcnQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCWNmZzMgPSBSVExfUjggKENvbmZpZzMpICYgfihDZmczX0xpbmtVcCB8IENmZzNfTWFnaWMpOworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX1BIWSkKKwkJY2ZnMyB8PSBDZmczX0xpbmtVcDsKKwlpZiAod29sLT53b2xvcHRzICYgV0FLRV9NQUdJQykKKwkJY2ZnMyB8PSBDZmczX01hZ2ljOworCVJUTF9XOCAoQ2ZnOTM0NiwgQ2ZnOTM0Nl9VbmxvY2spOworCVJUTF9XOCAoQ29uZmlnMywgY2ZnMyk7CisJUlRMX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCisJY2ZnNSA9IFJUTF9SOCAoQ29uZmlnNSkgJiB+KENmZzVfVVdGIHwgQ2ZnNV9NV0YgfCBDZmc1X0JXRik7CisJLyogKEtPTilGSVhNRTogVGhlc2UgYXJlIHVudGVzdGVkLiAgV2UgbWF5IGhhdmUgdG8gc2V0IHRoZQorCSAgIENSQzAsIFdha2V1cDAgYW5kIExTQkNSQzAgcmVnaXN0ZXJzIHRvbywgYnV0IEkgaGF2ZSBubworCSAgIGRvY3VtZW50YXRpb24uICAqLworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX1VDQVNUKQorCQljZmc1IHw9IENmZzVfVVdGOworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01DQVNUKQorCQljZmc1IHw9IENmZzVfTVdGOworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX0JDQVNUKQorCQljZmc1IHw9IENmZzVfQldGOworCVJUTF9XOCAoQ29uZmlnNSwgY2ZnNSk7CS8qIG5lZWQgbm90IHVubG9jayB2aWEgQ2ZnOTM0NiAqLworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCWluZm8tPnJlZ2R1bXBfbGVuID0gbnAtPnJlZ3NfbGVuOworfQorCitzdGF0aWMgaW50IHJ0bDgxMzlfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbWlpX2V0aHRvb2xfZ3NldCgmbnAtPm1paSwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGw4MTM5X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyYyA9IG1paV9ldGh0b29sX3NzZXQoJm5wLT5taWksIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJ0bDgxMzlfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmbnAtPm1paSk7Cit9CisKK3N0YXRpYyB1MzIgcnRsODEzOV9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX2xpbmtfb2soJm5wLT5taWkpOworfQorCitzdGF0aWMgdTMyIHJ0bDgxMzlfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBucC0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgcnRsODEzOV9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdHVtKQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlucC0+bXNnX2VuYWJsZSA9IGRhdHVtOworfQorCisvKiBUT0RPOiB3ZSBhcmUgdG9vIHNsYWNrIHRvIGRvIHJlZyBkdW1waW5nIGZvciBwaW8sIGZvciBub3cgKi8KKyNpZmRlZiBDT05GSUdfODEzOVRPT19QSU8KKyNkZWZpbmUgcnRsODEzOV9nZXRfcmVnc19sZW4JTlVMTAorI2RlZmluZSBydGw4MTM5X2dldF9yZWdzCU5VTEwKKyNlbHNlCitzdGF0aWMgaW50IHJ0bDgxMzlfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBucC0+cmVnc19sZW47Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcmVnYnVmKQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJlZ3MtPnZlcnNpb24gPSBSVExfUkVHU19WRVI7CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbWVtY3B5X2Zyb21pbyhyZWdidWYsIG5wLT5tbWlvX2FkZHIsIHJlZ3MtPmxlbik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7Cit9CisjZW5kaWYgLyogQ09ORklHXzgxMzlUT09fTU1JTyAqLworCitzdGF0aWMgaW50IHJ0bDgxMzlfZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIFJUTF9OVU1fU1RBVFM7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgKmRhdGEpCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZGF0YVswXSA9IG5wLT54c3RhdHMuZWFybHlfcng7CisJZGF0YVsxXSA9IG5wLT54c3RhdHMudHhfYnVmX21hcHBlZDsKKwlkYXRhWzJdID0gbnAtPnhzdGF0cy50eF90aW1lb3V0czsKKwlkYXRhWzNdID0gbnAtPnhzdGF0cy5yeF9sb3N0X2luX3Jpbmc7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKmRhdGEpCit7CisJbWVtY3B5KGRhdGEsIGV0aHRvb2xfc3RhdHNfa2V5cywgc2l6ZW9mKGV0aHRvb2xfc3RhdHNfa2V5cykpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHJ0bDgxMzlfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IHJ0bDgxMzlfZ2V0X2RydmluZm8sCisJLmdldF9zZXR0aW5ncwkJPSBydGw4MTM5X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IHJ0bDgxMzlfc2V0X3NldHRpbmdzLAorCS5nZXRfcmVnc19sZW4JCT0gcnRsODEzOV9nZXRfcmVnc19sZW4sCisJLmdldF9yZWdzCQk9IHJ0bDgxMzlfZ2V0X3JlZ3MsCisJLm53YXlfcmVzZXQJCT0gcnRsODEzOV9ud2F5X3Jlc2V0LAorCS5nZXRfbGluawkJPSBydGw4MTM5X2dldF9saW5rLAorCS5nZXRfbXNnbGV2ZWwJCT0gcnRsODEzOV9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBydGw4MTM5X3NldF9tc2dsZXZlbCwKKwkuZ2V0X3dvbAkJPSBydGw4MTM5X2dldF93b2wsCisJLnNldF93b2wJCT0gcnRsODEzOV9zZXRfd29sLAorCS5nZXRfc3RyaW5ncwkJPSBydGw4MTM5X2dldF9zdHJpbmdzLAorCS5nZXRfc3RhdHNfY291bnQJPSBydGw4MTM5X2dldF9zdGF0c19jb3VudCwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBydGw4MTM5X2dldF9ldGh0b29sX3N0YXRzLAorfTsKKworc3RhdGljIGludCBuZXRkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJm5wLT5taWksIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpydGw4MTM5X2dldF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSAoJnRwLT5sb2NrLCBmbGFncyk7CisJCXRwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IFJUTF9SMzIgKFJ4TWlzc2VkKTsKKwkJUlRMX1czMiAoUnhNaXNzZWQsIDApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmdHAtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gJnRwLT5zdGF0czsKK30KKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgICBUaGlzIHJvdXRpbmUgaXMgbm90IHN0YXRlIHNlbnNpdGl2ZSBhbmQgbmVlZCBub3QgYmUgU01QIGxvY2tlZC4gKi8KKworc3RhdGljIHZvaWQgX19zZXRfcnhfbW9kZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1MzIgbWNfZmlsdGVyWzJdOwkvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKwlpbnQgaSwgcnhfbW9kZTsKKwl1MzIgdG1wOworCisJRFBSSU5USyAoIiVzOiAgIHJ0bDgxMzlfc2V0X3J4X21vZGUoJTQuNHgpIGRvbmUgLS0gUnggY29uZmlnICU4LjhseC5cbiIsCisJCQlkZXYtPm5hbWUsIGRldi0+ZmxhZ3MsIFJUTF9SMzIgKFJ4Q29uZmlnKSk7CisKKwkvKiBOb3RlOiBkbyBub3QgcmVvcmRlciwgR0NDIGlzIGNsZXZlciBhYm91dCBjb21tb24gc3RhdGVtZW50cy4gKi8KKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayAoS0VSTl9OT1RJQ0UgIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJcnhfbW9kZSA9CisJCSAgICBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXMgfAorCQkgICAgQWNjZXB0QWxsUGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMHhmZmZmZmZmZjsKKwl9IGVsc2UgaWYgKChkZXYtPm1jX2NvdW50ID4gbXVsdGljYXN0X2ZpbHRlcl9saW1pdCkKKwkJICAgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIGZpbHRlciBwZXJmZWN0bHkgLS0gYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQlyeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzOworCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAweGZmZmZmZmZmOworCX0gZWxzZSB7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQlyeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXlQaHlzOworCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAwOworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsKKwkJICAgICBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJaW50IGJpdF9uciA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcikgPj4gMjY7CisKKwkJCW1jX2ZpbHRlcltiaXRfbnIgPj4gNV0gfD0gMSA8PCAoYml0X25yICYgMzEpOworCQkJcnhfbW9kZSB8PSBBY2NlcHRNdWx0aWNhc3Q7CisJCX0KKwl9CisKKwkvKiBXZSBjYW4gc2FmZWx5IHVwZGF0ZSB3aXRob3V0IHN0b3BwaW5nIHRoZSBjaGlwLiAqLworCXRtcCA9IHJ0bDgxMzlfcnhfY29uZmlnIHwgcnhfbW9kZTsKKwlpZiAodHAtPnJ4X2NvbmZpZyAhPSB0bXApIHsKKwkJUlRMX1czMl9GIChSeENvbmZpZywgdG1wKTsKKwkJdHAtPnJ4X2NvbmZpZyA9IHRtcDsKKwl9CisJUlRMX1czMl9GIChNQVIwICsgMCwgbWNfZmlsdGVyWzBdKTsKKwlSVExfVzMyX0YgKE1BUjAgKyA0LCBtY19maWx0ZXJbMV0pOworfQorCitzdGF0aWMgdm9pZCBydGw4MTM5X3NldF9yeF9tb2RlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCV9fc2V0X3J4X21vZGUoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmdHAtPmxvY2ssIGZsYWdzKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IHJ0bDgxMzlfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcGNpX3NhdmVfc3RhdGUgKHBkZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nIChkZXYpKQorCQlyZXR1cm4gMDsKKworCW5ldGlmX2RldmljZV9kZXRhY2ggKGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJnRwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMsIHN0b3AgVHggYW5kIFJ4LiAqLworCVJUTF9XMTYgKEludHJNYXNrLCAwKTsKKwlSVExfVzggKENoaXBDbWQsIDApOworCisJLyogVXBkYXRlIHRoZSBlcnJvciBjb3VudHMuICovCisJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gUlRMX1IzMiAoUnhNaXNzZWQpOworCVJUTF9XMzIgKFJ4TWlzc2VkLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZSAocGRldiwgUENJX0QzaG90KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcnRsODEzOV9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCisJcGNpX3Jlc3RvcmVfc3RhdGUgKHBkZXYpOworCWlmICghbmV0aWZfcnVubmluZyAoZGV2KSkKKwkJcmV0dXJuIDA7CisJcGNpX3NldF9wb3dlcl9zdGF0ZSAocGRldiwgUENJX0QwKTsKKwlydGw4MTM5X2luaXRfcmluZyAoZGV2KTsKKwlydGw4MTM5X2h3X3N0YXJ0IChkZXYpOworCW5ldGlmX2RldmljZV9hdHRhY2ggKGRldik7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcnRsODEzOV9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IHJ0bDgxMzlfcGNpX3RibCwKKwkucHJvYmUJCT0gcnRsODEzOV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHJ0bDgxMzlfcmVtb3ZlX29uZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBydGw4MTM5X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBydGw4MTM5X3Jlc3VtZSwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KK307CisKKworc3RhdGljIGludCBfX2luaXQgcnRsODEzOV9pbml0X21vZHVsZSAodm9pZCkKK3sKKwkvKiB3aGVuIHdlJ3JlIGEgbW9kdWxlLCB3ZSBhbHdheXMgcHJpbnQgYSB2ZXJzaW9uIG1lc3NhZ2UsCisJICogZXZlbiBpZiBubyA4MTM5IGJvYXJkIGlzIGZvdW5kLgorCSAqLworI2lmZGVmIE1PRFVMRQorCXByaW50ayAoS0VSTl9JTkZPIFJUTDgxMzlfRFJJVkVSX05BTUUgIlxuIik7CisjZW5kaWYKKworCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZydGw4MTM5X3BjaV9kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBydGw4MTM5X2NsZWFudXBfbW9kdWxlICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJnJ0bDgxMzlfcGNpX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQocnRsODEzOV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChydGw4MTM5X2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgyNTk2LmMgYi9kcml2ZXJzL25ldC84MjU5Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Zjk3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC84MjU5Ni5jCkBAIC0wLDAgKzEsMTYxOCBAQAorLyogODI1OTYuYzogQSBnZW5lcmljIDgyNTk2IGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguICovCisvKgorICAgQmFzZWQgb24gQXByaWNvdC5jCisgICBXcml0dGVuIDE5OTQgYnkgTWFyayBFdmFucy4KKyAgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgQXByaWNvdCA4MjU5NiBidXMtbWFzdGVyIGludGVyZmFjZQorCisgICBNb2R1bGFyaXNlZCAxMi85NCBNYXJrIEV2YW5zCisKKworICAgTW9kaWZpZWQgdG8gc3VwcG9ydCB0aGUgODI1OTYgZXRoZXJuZXQgY2hpcHMgb24gNjgweDAgVk1FIGJvYXJkcy4KKyAgIGJ5IFJpY2hhcmQgSGlyc3QgPHJpY2hhcmRAc2xlZXBpZS5kZW1vbi5jby51az4KKyAgIFJlbmFtZWQgdG8gYmUgODI1OTYuYworCisgICA5ODA4MjU6ICBDaGFuZ2VkIHRvIHJlY2VpdmUgZGlyZWN0bHkgaW4gdG8gc2tfYnVmZnMgd2hpY2ggYXJlCisgICBhbGxvY2F0ZWQgYXQgb3BlbigpIHRpbWUuICBFbGltaW5hdGVzIGNvcHkgb24gaW5jb21pbmcgZnJhbWVzCisgICAoc21hbGwgb25lcyBhcmUgc3RpbGwgY29waWVkKS4gIFNoYXJlZCBkYXRhIG5vdyBoZWxkIGluIGEKKyAgIG5vbi1jYWNoZWQgcGFnZSwgc28gd2UgY2FuIHJ1biBvbiA2ODA2MCBpbiBjb3B5YmFjayBtb2RlLgorCisgICBUQkQ6CisgICAqIGxvb2sgYXQgZGVmZXJyaW5nIHJ4IGZyYW1lcyByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIChhcyBwZXIgdHVsaXApCisgICAqIGhhbmRsZSB0eCByaW5nIGZ1bGwgYXMgcGVyIHR1bGlwCisgICAqIHBlcmZvcm1hY2UgdGVzdCB0byB0dW5lIHJ4X2NvcHlicmVhaworCisgICBNb3N0IG9mIG15IG1vZGlmaWNhdGlvbnMgcmVsYXRlIHRvIHRoZSBicmFpbmRlYWQgYmlnLWVuZGlhbgorICAgaW1wbGVtZW50YXRpb24gYnkgSW50ZWwuICBXaGVuIHRoZSBpNTk2IGlzIG9wZXJhdGluZyBpbgorICAgJ2JpZy1lbmRpYW4nIG1vZGUsIGl0IHRoaW5rcyBhIDMyIGJpdCB2YWx1ZSBvZiAweDEyMzQ1Njc4CisgICBzaG91bGQgYmUgc3RvcmVkIGFzIDB4NTY3ODEyMzQuICBUaGlzIGlzIGEgcmVhbCBwYWluLCB3aGVuCisgICB5b3UgaGF2ZSBsaW5rZWQgbGlzdHMgd2hpY2ggYXJlIHNoYXJlZCBieSB0aGUgNjgweDAgYW5kIHRoZQorICAgaTU5Ni4KKworICAgRHJpdmVyIHNrZWxldG9uCisgICBXcml0dGVuIDE5OTMgYnkgRG9uYWxkIEJlY2tlci4KKyAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUgRGlyZWN0b3IsCisgICBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQKKyAgIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIG1vZGlmaWVkIGJ5IFNSQywKKyAgIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisgICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworICAgU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uLCA0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMCwgQW5uYXBvbGlzIE1EIDIxNDAzCisKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9CisJIjgyNTk2LmMgJFJldmlzaW9uOiAxLjUgJFxuIjsKKworI2RlZmluZSBEUlZfTkFNRQkiODI1OTYiCisKKy8qIERFQlVHIGZsYWdzCisgKi8KKworI2RlZmluZSBERUJfSU5JVAkweDAwMDEKKyNkZWZpbmUgREVCX1BST0JFCTB4MDAwMgorI2RlZmluZSBERUJfU0VSSU9VUwkweDAwMDQKKyNkZWZpbmUgREVCX0VSUk9SUwkweDAwMDgKKyNkZWZpbmUgREVCX01VTFRJCTB4MDAxMAorI2RlZmluZSBERUJfVERSCQkweDAwMjAKKyNkZWZpbmUgREVCX09QRU4JMHgwMDQwCisjZGVmaW5lIERFQl9SRVNFVAkweDAwODAKKyNkZWZpbmUgREVCX0FERENNRAkweDAxMDAKKyNkZWZpbmUgREVCX1NUQVRVUwkweDAyMDAKKyNkZWZpbmUgREVCX1NUQVJUVFgJMHgwNDAwCisjZGVmaW5lIERFQl9SWEFERFIJMHgwODAwCisjZGVmaW5lIERFQl9UWEFERFIJMHgxMDAwCisjZGVmaW5lIERFQl9SWEZSQU1FCTB4MjAwMAorI2RlZmluZSBERUJfSU5UUwkweDQwMDAKKyNkZWZpbmUgREVCX1NUUlVDVAkweDgwMDAKKyNkZWZpbmUgREVCX0FOWQkJMHhmZmZmCisKKworI2RlZmluZSBERUIoeCx5KQlpZiAoaTU5Nl9kZWJ1ZyAmICh4KSkgeQorCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVk1FMTZ4X05FVCkgfHwgZGVmaW5lZChDT05GSUdfTVZNRTE2eF9ORVRfTU9EVUxFKQorI2RlZmluZSBFTkFCTEVfTVZNRTE2eF9ORVQKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0JWTUU2MDAwX05FVCkgfHwgZGVmaW5lZChDT05GSUdfQlZNRTYwMDBfTkVUX01PRFVMRSkKKyNkZWZpbmUgRU5BQkxFX0JWTUU2MDAwX05FVAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQVBSSUNPVCkgfHwgZGVmaW5lZChDT05GSUdfQVBSSUNPVF9NT0RVTEUpCisjZGVmaW5lIEVOQUJMRV9BUFJJQ09UCisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9NVk1FMTZ4X05FVAorI2luY2x1ZGUgPGFzbS9tdm1lMTZ4aHcuaD4KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9CVk1FNjAwMF9ORVQKKyNpbmNsdWRlIDxhc20vYnZtZTYwMDBody5oPgorI2VuZGlmCisKKy8qCisgKiBEZWZpbmUgdmFyaW91cyBtYWNyb3MgZm9yIENoYW5uZWwgQXR0ZW50aW9uLCB3b3JkIHN3YXBwaW5nIGV0Yy4sIGRlcGVuZGVudAorICogb24gYXJjaGl0ZWN0dXJlLiAgTVZNRSBhbmQgQlZNRSBhcmUgNjgweDAgYmFzZWQsIG90aGVyd2lzZSBpdCBpcyBJbnRlbC4KKyAqLworCisjaWZkZWYgX19tYzY4MDAwX18KKyNkZWZpbmUgV1NXQVByZmQoeCkgICgoc3RydWN0IGk1OTZfcmZkICopICgoKHUzMikoeCk8PDE2KSB8ICgoKCh1MzIpKHgpKSk+PjE2KSkpCisjZGVmaW5lIFdTV0FQcmJkKHgpICAoKHN0cnVjdCBpNTk2X3JiZCAqKSAoKCh1MzIpKHgpPDwxNikgfCAoKCgodTMyKSh4KSkpPj4xNikpKQorI2RlZmluZSBXU1dBUGlzY3AoeCkgKChzdHJ1Y3QgaTU5Nl9pc2NwICopKCgodTMyKSh4KTw8MTYpIHwgKCgoKHUzMikoeCkpKT4+MTYpKSkKKyNkZWZpbmUgV1NXQVBzY2IoeCkgICgoc3RydWN0IGk1OTZfc2NiICopICgoKHUzMikoeCk8PDE2KSB8ICgoKCh1MzIpKHgpKSk+PjE2KSkpCisjZGVmaW5lIFdTV0FQY21kKHgpICAoKHN0cnVjdCBpNTk2X2NtZCAqKSAoKCh1MzIpKHgpPDwxNikgfCAoKCgodTMyKSh4KSkpPj4xNikpKQorI2RlZmluZSBXU1dBUHRiZCh4KSAgKChzdHJ1Y3QgaTU5Nl90YmQgKikgKCgodTMyKSh4KTw8MTYpIHwgKCgoKHUzMikoeCkpKT4+MTYpKSkKKyNkZWZpbmUgV1NXQVBjaGFyKHgpICgoY2hhciAqKSAgICAgICAgICAgICgoKHUzMikoeCk8PDE2KSB8ICgoKCh1MzIpKHgpKSk+PjE2KSkpCisjZGVmaW5lIElTQ1BfQlVTWQkweDAwMDEwMDAwCisjZGVmaW5lIE1BQ0hfSVNfQVBSSUNPVAkwCisjZWxzZQorI2RlZmluZSBXU1dBUHJmZCh4KSAgICAgKChzdHJ1Y3QgaTU5Nl9yZmQgKikoeCkpCisjZGVmaW5lIFdTV0FQcmJkKHgpICAgICAoKHN0cnVjdCBpNTk2X3JiZCAqKSh4KSkKKyNkZWZpbmUgV1NXQVBpc2NwKHgpICAgICgoc3RydWN0IGk1OTZfaXNjcCAqKSh4KSkKKyNkZWZpbmUgV1NXQVBzY2IoeCkgICAgICgoc3RydWN0IGk1OTZfc2NiICopKHgpKQorI2RlZmluZSBXU1dBUGNtZCh4KSAgICAgKChzdHJ1Y3QgaTU5Nl9jbWQgKikoeCkpCisjZGVmaW5lIFdTV0FQdGJkKHgpICAgICAoKHN0cnVjdCBpNTk2X3RiZCAqKSh4KSkKKyNkZWZpbmUgV1NXQVBjaGFyKHgpICAgICgoY2hhciAqKSh4KSkKKyNkZWZpbmUgSVNDUF9CVVNZCTB4MDAwMQorI2RlZmluZSBNQUNIX0lTX0FQUklDT1QJMQorI2VuZGlmCisKKy8qCisgKiBUaGUgTVBVX1BPUlQgY29tbWFuZCBhbGxvd3MgZGlyZWN0IGFjY2VzcyB0byB0aGUgODI1OTYuIFdpdGggUE9SVCBhY2Nlc3MKKyAqIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSAocDUtMTgpLiBUaGUgMzItYml0IHBvcnQgY29tbWFuZAorICogbXVzdCBiZSB3b3JkLXN3YXBwZWQgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCB3b3JkIHdyaXR0ZW4gZmlyc3QuCisgKiBUaGlzIG9ubHkgYXBwbGllcyB0byBWTUUgYm9hcmRzLgorICovCisjZGVmaW5lIFBPUlRfUkVTRVQJCTB4MDAJLyogcmVzZXQgODI1OTYgKi8KKyNkZWZpbmUgUE9SVF9TRUxGVEVTVAkJMHgwMQkvKiBzZWxmdGVzdCAqLworI2RlZmluZSBQT1JUX0FMVFNDUAkJMHgwMgkvKiBhbHRlcm5hdGUgU0NCIGFkZHJlc3MgKi8KKyNkZWZpbmUgUE9SVF9BTFREVU1QCQkweDAzCS8qIEFsdGVybmF0ZSBEVU1QIGFkZHJlc3MgKi8KKworc3RhdGljIGludCBpNTk2X2RlYnVnID0gKERFQl9TRVJJT1VTfERFQl9QUk9CRSk7CisKK01PRFVMRV9BVVRIT1IoIlJpY2hhcmQgSGlyc3QiKTsKK01PRFVMRV9ERVNDUklQVElPTigiaTgyNTk2IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oaTU5Nl9kZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaTU5Nl9kZWJ1ZywgImk4MjU5NiBkZWJ1ZyBtYXNrIik7CisKKworLyogQ29weSBmcmFtZXMgc2hvcnRlciB0aGFuIHJ4X2NvcHlicmVhaywgb3RoZXJ3aXNlIHBhc3Mgb24gdXAgaW4KKyAqIGEgZnVsbCBzaXplZCBza19idWZmLiAgVmFsdWUgb2YgMTAwIHN0b2xlbiBmcm9tIHR1bGlwLmMgKCFhbHBoYSkuCisgKi8KK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMTAwOworCisjZGVmaW5lIFBLVF9CVUZfU1oJMTUzNgorI2RlZmluZSBNQVhfTUNfQ05UCTY0CisKKyNkZWZpbmUgSTU5Nl9UT1RBTF9TSVpFIDE3CisKKyNkZWZpbmUgSTU5Nl9OVUxMICgodm9pZCAqKTB4ZmZmZmZmZmYpCisKKyNkZWZpbmUgQ01EX0VPTAkJMHg4MDAwCS8qIFRoZSBsYXN0IGNvbW1hbmQgb2YgdGhlIGxpc3QsIHN0b3AuICovCisjZGVmaW5lIENNRF9TVVNQCTB4NDAwMAkvKiBTdXNwZW5kIGFmdGVyIGRvaW5nIGNtZC4gKi8KKyNkZWZpbmUgQ01EX0lOVFIJMHgyMDAwCS8qIEludGVycnVwdCBhZnRlciBkb2luZyBjbWQuICovCisKKyNkZWZpbmUgQ01EX0ZMRVgJMHgwMDA4CS8qIEVuYWJsZSBmbGV4aWJsZSBtZW1vcnkgbW9kZWwgKi8KKworZW51bSBjb21tYW5kcyB7CisJQ21kTk9wID0gMCwgQ21kU0FTZXR1cCA9IDEsIENtZENvbmZpZ3VyZSA9IDIsIENtZE11bHRpY2FzdExpc3QgPSAzLAorCUNtZFR4ID0gNCwgQ21kVERSID0gNSwgQ21kRHVtcCA9IDYsIENtZERpYWdub3NlID0gNworfTsKKworI2RlZmluZSBTVEFUX0MJCTB4ODAwMAkvKiBTZXQgdG8gMCBhZnRlciBleGVjdXRpb24gKi8KKyNkZWZpbmUgU1RBVF9CCQkweDQwMDAJLyogQ29tbWFuZCBiZWluZyBleGVjdXRlZCAqLworI2RlZmluZSBTVEFUX09LCQkweDIwMDAJLyogQ29tbWFuZCBleGVjdXRlZCBvayAqLworI2RlZmluZSBTVEFUX0EJCTB4MTAwMAkvKiBDb21tYW5kIGFib3J0ZWQgKi8KKworI2RlZmluZQkgQ1VDX1NUQVJUCTB4MDEwMAorI2RlZmluZQkgQ1VDX1JFU1VNRQkweDAyMDAKKyNkZWZpbmUJIENVQ19TVVNQRU5EICAgIDB4MDMwMAorI2RlZmluZQkgQ1VDX0FCT1JUCTB4MDQwMAorI2RlZmluZQkgUlhfU1RBUlQJMHgwMDEwCisjZGVmaW5lCSBSWF9SRVNVTUUJMHgwMDIwCisjZGVmaW5lCSBSWF9TVVNQRU5ECTB4MDAzMAorI2RlZmluZQkgUlhfQUJPUlQJMHgwMDQwCisKKyNkZWZpbmUgVFhfVElNRU9VVAk1CisKKworc3RydWN0IGk1OTZfcmVnIHsKKwl1bnNpZ25lZCBzaG9ydCBwb3J0aGk7CisJdW5zaWduZWQgc2hvcnQgcG9ydGxvOworCXVuc2lnbmVkIGxvbmcgY2E7Cit9OworCisjZGVmaW5lIEVPRgkJMHg4MDAwCisjZGVmaW5lIFNJWkVfTUFTSwkweDNmZmYKKworc3RydWN0IGk1OTZfdGJkIHsKKwl1bnNpZ25lZCBzaG9ydCBzaXplOworCXVuc2lnbmVkIHNob3J0IHBhZDsKKwlzdHJ1Y3QgaTU5Nl90YmQgKm5leHQ7CisJY2hhciAqZGF0YTsKK307CisKKy8qIFRoZSBjb21tYW5kIHN0cnVjdHVyZSBoYXMgdHdvICduZXh0JyBwb2ludGVyczsgdl9uZXh0IGlzIHRoZSBhZGRyZXNzIG9mCisgKiB0aGUgbmV4dCBjb21tYW5kIGFzIHNlZW4gYnkgdGhlIENQVSwgYl9uZXh0IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0CisgKiBjb21tYW5kIGFzIHNlZW4gYnkgdGhlIDgyNTk2LiAgVGhlIGJfbmV4dCBwb2ludGVyLCBhcyB1c2VkIGJ5IHRoZSA4MjU5NgorICogYWx3YXlzIHJlZmVyZW5jZXMgdGhlIHN0YXR1cyBmaWVsZCBvZiB0aGUgbmV4dCBjb21tYW5kLCByYXRoZXIgdGhhbiB0aGUKKyAqIHZfbmV4dCBmaWVsZCwgYmVjYXVzZSB0aGUgODI1OTYgaXMgdW5hd2FyZSBvZiB2X25leHQuICBJdCBtYXkgc2VlbSBtb3JlCisgKiBsb2dpY2FsIHRvIHB1dCB2X25leHQgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlLCBidXQgd2UgY2Fubm90IGRvIHRoYXQKKyAqIGJlY2F1c2UgdGhlIDgyNTk2IGV4cGVjdHMgb3RoZXIgZmllbGRzIHRvIGJlIHRoZXJlLCBkZXBlbmRpbmcgb24gY29tbWFuZAorICogdHlwZS4KKyAqLworCitzdHJ1Y3QgaTU5Nl9jbWQgeworCXN0cnVjdCBpNTk2X2NtZCAqdl9uZXh0OwkvKiBBZGRyZXNzIGZyb20gQ1BVcyB2aWV3cG9pbnQgKi8KKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgY29tbWFuZDsKKwlzdHJ1Y3QgaTU5Nl9jbWQgKmJfbmV4dDsJLyogQWRkcmVzcyBmcm9tIGk1OTYgdmlld3BvaW50ICovCit9OworCitzdHJ1Y3QgdHhfY21kIHsKKwlzdHJ1Y3QgaTU5Nl9jbWQgY21kOworCXN0cnVjdCBpNTk2X3RiZCAqdGJkOworCXVuc2lnbmVkIHNob3J0IHNpemU7CisJdW5zaWduZWQgc2hvcnQgcGFkOworCXN0cnVjdCBza19idWZmICpza2I7CS8qIFNvIHdlIGNhbiBmcmVlIGl0IGFmdGVyIHR4ICovCit9OworCitzdHJ1Y3QgdGRyX2NtZCB7CisJc3RydWN0IGk1OTZfY21kIGNtZDsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgcGFkOworfTsKKworc3RydWN0IG1jX2NtZCB7CisJc3RydWN0IGk1OTZfY21kIGNtZDsKKwlzaG9ydCBtY19jbnQ7CisJY2hhciBtY19hZGRyc1tNQVhfTUNfQ05UKjZdOworfTsKKworc3RydWN0IHNhX2NtZCB7CisJc3RydWN0IGk1OTZfY21kIGNtZDsKKwljaGFyIGV0aF9hZGRyWzhdOworfTsKKworc3RydWN0IGNmX2NtZCB7CisJc3RydWN0IGk1OTZfY21kIGNtZDsKKwljaGFyIGk1OTZfY29uZmlnWzE2XTsKK307CisKK3N0cnVjdCBpNTk2X3JmZCB7CisJdW5zaWduZWQgc2hvcnQgc3RhdDsKKwl1bnNpZ25lZCBzaG9ydCBjbWQ7CisJc3RydWN0IGk1OTZfcmZkICpiX25leHQ7CS8qIEFkZHJlc3MgZnJvbSBpNTk2IHZpZXdwb2ludCAqLworCXN0cnVjdCBpNTk2X3JiZCAqcmJkOworCXVuc2lnbmVkIHNob3J0IGNvdW50OworCXVuc2lnbmVkIHNob3J0IHNpemU7CisJc3RydWN0IGk1OTZfcmZkICp2X25leHQ7CS8qIEFkZHJlc3MgZnJvbSBDUFVzIHZpZXdwb2ludCAqLworCXN0cnVjdCBpNTk2X3JmZCAqdl9wcmV2OworfTsKKworc3RydWN0IGk1OTZfcmJkIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBjb3VudDsKKyAgICB1bnNpZ25lZCBzaG9ydCB6ZXJvMTsKKyAgICBzdHJ1Y3QgaTU5Nl9yYmQgKmJfbmV4dDsKKyAgICB1bnNpZ25lZCBjaGFyICpiX2RhdGE7CQkvKiBBZGRyZXNzIGZyb20gaTU5NiB2aWV3cG9pbnQgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBzaXplOworICAgIHVuc2lnbmVkIHNob3J0IHplcm8yOworICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgc3RydWN0IGk1OTZfcmJkICp2X25leHQ7CisgICAgc3RydWN0IGk1OTZfcmJkICpiX2FkZHI7CQkvKiBUaGlzIHJiZCBhZGRyIGZyb20gaTU5NiB2aWV3ICovCisgICAgdW5zaWduZWQgY2hhciAqdl9kYXRhOwkJLyogQWRkcmVzcyBmcm9tIENQVXMgdmlld3BvaW50ICovCit9OworCisjZGVmaW5lIFRYX1JJTkdfU0laRSA2NAorI2RlZmluZSBSWF9SSU5HX1NJWkUgMTYKKworc3RydWN0IGk1OTZfc2NiIHsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgY29tbWFuZDsKKwlzdHJ1Y3QgaTU5Nl9jbWQgKmNtZDsKKwlzdHJ1Y3QgaTU5Nl9yZmQgKnJmZDsKKwl1bnNpZ25lZCBsb25nIGNyY19lcnI7CisJdW5zaWduZWQgbG9uZyBhbGlnbl9lcnI7CisJdW5zaWduZWQgbG9uZyByZXNvdXJjZV9lcnI7CisJdW5zaWduZWQgbG9uZyBvdmVyX2VycjsKKwl1bnNpZ25lZCBsb25nIHJjdmR0X2VycjsKKwl1bnNpZ25lZCBsb25nIHNob3J0X2VycjsKKwl1bnNpZ25lZCBzaG9ydCB0X29uOworCXVuc2lnbmVkIHNob3J0IHRfb2ZmOworfTsKKworc3RydWN0IGk1OTZfaXNjcCB7CisJdW5zaWduZWQgbG9uZyBzdGF0OworCXN0cnVjdCBpNTk2X3NjYiAqc2NiOworfTsKKworc3RydWN0IGk1OTZfc2NwIHsKKwl1bnNpZ25lZCBsb25nIHN5c2J1czsKKwl1bnNpZ25lZCBsb25nIHBhZDsKKwlzdHJ1Y3QgaTU5Nl9pc2NwICppc2NwOworfTsKKworc3RydWN0IGk1OTZfcHJpdmF0ZSB7CisJdm9sYXRpbGUgc3RydWN0IGk1OTZfc2NwIHNjcDsKKwl2b2xhdGlsZSBzdHJ1Y3QgaTU5Nl9pc2NwIGlzY3A7CisJdm9sYXRpbGUgc3RydWN0IGk1OTZfc2NiIHNjYjsKKwlzdHJ1Y3Qgc2FfY21kIHNhX2NtZDsKKwlzdHJ1Y3QgY2ZfY21kIGNmX2NtZDsKKwlzdHJ1Y3QgdGRyX2NtZCB0ZHJfY21kOworCXN0cnVjdCBtY19jbWQgbWNfY21kOworCXVuc2lnbmVkIGxvbmcgc3RhdDsKKwlpbnQgbGFzdF9yZXN0YXJ0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTsKKwlzdHJ1Y3QgaTU5Nl9yZmQgKnJmZF9oZWFkOworCXN0cnVjdCBpNTk2X3JiZCAqcmJkX2hlYWQ7CisJc3RydWN0IGk1OTZfY21kICpjbWRfdGFpbDsKKwlzdHJ1Y3QgaTU5Nl9jbWQgKmNtZF9oZWFkOworCWludCBjbWRfYmFja2xvZzsKKwl1bnNpZ25lZCBsb25nIGxhc3RfY21kOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBpNTk2X3JmZCByZmRzW1JYX1JJTkdfU0laRV07CisJc3RydWN0IGk1OTZfcmJkIHJiZHNbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgdHhfY21kIHR4X2NtZHNbVFhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgaTU5Nl90YmQgdGJkc1tUWF9SSU5HX1NJWkVdOworCWludCBuZXh0X3R4X2NtZDsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgY2hhciBpbml0X3NldHVwW10gPQoreworCTB4OEUsCQkJLyogbGVuZ3RoLCBwcmVmZXRjaCBvbiAqLworCTB4QzgsCQkJLyogZmlmbyB0byA4LCBtb25pdG9yIG9mZiAqLworI2lmZGVmIENPTkZJR19WTUUKKwkweGMwLAkJCS8qIGRvbid0IHNhdmUgYmFkIGZyYW1lcyAqLworI2Vsc2UKKwkweDgwLAkJCS8qIGRvbid0IHNhdmUgYmFkIGZyYW1lcyAqLworI2VuZGlmCisJMHgyRSwJCQkvKiBObyBzb3VyY2UgYWRkcmVzcyBpbnNlcnRpb24sIDggYnl0ZSBwcmVhbWJsZSAqLworCTB4MDAsCQkJLyogcHJpb3JpdHkgYW5kIGJhY2tvZmYgZGVmYXVsdHMgKi8KKwkweDYwLAkJCS8qIGludGVyZnJhbWUgc3BhY2luZyAqLworCTB4MDAsCQkJLyogc2xvdCB0aW1lIExTQiAqLworCTB4ZjIsCQkJLyogc2xvdCB0aW1lIGFuZCByZXRyaWVzICovCisJMHgwMCwJCQkvKiBwcm9taXNjdW91cyBtb2RlICovCisJMHgwMCwJCQkvKiBjb2xsaXNpb24gZGV0ZWN0ICovCisJMHg0MCwJCQkvKiBtaW5pbXVtIGZyYW1lIGxlbmd0aCAqLworCTB4ZmYsCisJMHgwMCwKKwkweDdmIC8qICAqbXVsdGkgSUEgKi8gfTsKKworc3RhdGljIGludCBpNTk2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGk1OTZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBpNTk2X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgaTU5Nl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaTU5Nl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpNTk2X2FkZF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfY21kICpjbWQpOworc3RhdGljIHZvaWQgaTU5Nl90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHByaW50X2V0aCh1bnNpZ25lZCBjaGFyICpidWYsIGNoYXIgKnN0cik7CitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgcnhfcmluZ19zaXplID0gUlhfUklOR19TSVpFOworc3RhdGljIGludCB0aWNrc19saW1pdCA9IDI1Oworc3RhdGljIGludCBtYXhfY21kX2JhY2tsb2cgPSBUWF9SSU5HX1NJWkUtMTsKKworCitzdGF0aWMgaW5saW5lIHZvaWQgQ0Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBFTkFCTEVfTVZNRTE2eF9ORVQKKwlpZiAoTUFDSF9JU19NVk1FMTZ4KSB7CisJCSgoc3RydWN0IGk1OTZfcmVnICopIGRldi0+YmFzZV9hZGRyKS0+Y2EgPSAxOworCX0KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9CVk1FNjAwMF9ORVQKKwlpZiAoTUFDSF9JU19CVk1FNjAwMCkgeworCQl2b2xhdGlsZSB1MzIgaTsKKworCQlpID0gKih2b2xhdGlsZSB1MzIgKikgKGRldi0+YmFzZV9hZGRyKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfQVBSSUNPVAorCWlmIChNQUNIX0lTX0FQUklDT1QpIHsKKwkJb3V0dygwLCAoc2hvcnQpIChkZXYtPmJhc2VfYWRkcikgKyA0KTsKKwl9CisjZW5kaWYKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgTVBVX1BPUlQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGMsIHZvbGF0aWxlIHZvaWQgKngpCit7CisjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgeworCQlzdHJ1Y3QgaTU5Nl9yZWcgKnAgPSAoc3RydWN0IGk1OTZfcmVnICopIChkZXYtPmJhc2VfYWRkcik7CisJCXAtPnBvcnRoaSA9ICgoYykgfCAodTMyKSAoeCkpICYgMHhmZmZmOworCQlwLT5wb3J0bG8gPSAoKGMpIHwgKHUzMikgKHgpKSA+PiAxNjsKKwl9CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfQlZNRTYwMDBfTkVUCisJaWYgKE1BQ0hfSVNfQlZNRTYwMDApIHsKKwkJdTMyIHYgPSAodTMyKSAoYykgfCAodTMyKSAoeCk7CisJCXYgPSAoKHUzMikgKHYpIDw8IDE2KSB8ICgodTMyKSAodikgPj4gMTYpOworCQkqKHZvbGF0aWxlIHUzMiAqKSBkZXYtPmJhc2VfYWRkciA9IHY7CisJCXVkZWxheSgxKTsKKwkJKih2b2xhdGlsZSB1MzIgKikgZGV2LT5iYXNlX2FkZHIgPSB2OworCX0KKyNlbmRpZgorfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHdhaXRfaXN0YXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAsIGludCBkZWxjbnQsIGNoYXIgKnN0cikKK3sKKwl3aGlsZSAoLS1kZWxjbnQgJiYgbHAtPmlzY3Auc3RhdCkKKwkJdWRlbGF5KDEwKTsKKwlpZiAoIWRlbGNudCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcywgc3RhdHVzICU0LjR4LCBjbWQgJTQuNHguXG4iLAorCQkgICAgIGRldi0+bmFtZSwgc3RyLCBscC0+c2NiLnN0YXR1cywgbHAtPnNjYi5jb21tYW5kKTsKKwkJcmV0dXJuIC0xOworCX0KKwllbHNlCisJCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHdhaXRfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwLCBpbnQgZGVsY250LCBjaGFyICpzdHIpCit7CisJd2hpbGUgKC0tZGVsY250ICYmIGxwLT5zY2IuY29tbWFuZCkKKwkJdWRlbGF5KDEwKTsKKwlpZiAoIWRlbGNudCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcywgc3RhdHVzICU0LjR4LCBjbWQgJTQuNHguXG4iLAorCQkgICAgIGRldi0+bmFtZSwgc3RyLCBscC0+c2NiLnN0YXR1cywgbHAtPnNjYi5jb21tYW5kKTsKKwkJcmV0dXJuIC0xOworCX0KKwllbHNlCisJCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHdhaXRfY2ZnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpNTk2X2NtZCAqY21kLCBpbnQgZGVsY250LCBjaGFyICpzdHIpCit7CisJdm9sYXRpbGUgc3RydWN0IGk1OTZfY21kICpjID0gY21kOworCQorCXdoaWxlICgtLWRlbGNudCAmJiBjLT5jb21tYW5kKQorCQl1ZGVsYXkoMTApOworCWlmICghZGVsY250KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzLlxuIiwgZGV2LT5uYW1lLCBzdHIpOworCQlyZXR1cm4gLTE7CisJfQorCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKyAKK3N0YXRpYyB2b2lkIGk1OTZfZGlzcGxheV9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IGk1OTZfY21kICpjbWQ7CisJc3RydWN0IGk1OTZfcmZkICpyZmQ7CisJc3RydWN0IGk1OTZfcmJkICpyYmQ7CisKKwlwcmludGsoS0VSTl9FUlIgImxwIGFuZCBzY3AgYXQgJXAsIC5zeXNidXMgPSAlMDhseCwgLmlzY3AgPSAlcFxuIiwKKwkgICAgICAgJmxwLT5zY3AsIGxwLT5zY3Auc3lzYnVzLCBscC0+c2NwLmlzY3ApOworCXByaW50ayhLRVJOX0VSUiAiaXNjcCBhdCAlcCwgaXNjcC5zdGF0ID0gJTA4bHgsIC5zY2IgPSAlcFxuIiwKKwkgICAgICAgJmxwLT5pc2NwLCBscC0+aXNjcC5zdGF0LCBscC0+aXNjcC5zY2IpOworCXByaW50ayhLRVJOX0VSUiAic2NiIGF0ICVwLCBzY2Iuc3RhdHVzID0gJTA0eCwgLmNvbW1hbmQgPSAlMDR4LCIKKwkJIiAuY21kID0gJXAsIC5yZmQgPSAlcFxuIiwKKwkgICAgICAgJmxwLT5zY2IsIGxwLT5zY2Iuc3RhdHVzLCBscC0+c2NiLmNvbW1hbmQsCisJCWxwLT5zY2IuY21kLCBscC0+c2NiLnJmZCk7CisJcHJpbnRrKEtFUk5fRVJSICIgICBlcnJvcnM6IGNyYyAlbHgsIGFsaWduICVseCwgcmVzb3VyY2UgJWx4LCIKKyAgICAgICAgICAgICAgICIgb3ZlciAlbHgsIHJjdmR0ICVseCwgc2hvcnQgJWx4XG4iLAorCQlscC0+c2NiLmNyY19lcnIsIGxwLT5zY2IuYWxpZ25fZXJyLCBscC0+c2NiLnJlc291cmNlX2VyciwKKwkJbHAtPnNjYi5vdmVyX2VyciwgbHAtPnNjYi5yY3ZkdF9lcnIsIGxwLT5zY2Iuc2hvcnRfZXJyKTsKKwljbWQgPSBscC0+Y21kX2hlYWQ7CisJd2hpbGUgKGNtZCAhPSBJNTk2X05VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjbWQgYXQgJXAsIC5zdGF0dXMgPSAlMDR4LCAuY29tbWFuZCA9ICUwNHgsIC5iX25leHQgPSAlcFxuIiwKKwkJICBjbWQsIGNtZC0+c3RhdHVzLCBjbWQtPmNvbW1hbmQsIGNtZC0+Yl9uZXh0KTsKKwkJY21kID0gY21kLT52X25leHQ7CisJfQorCXJmZCA9IGxwLT5yZmRfaGVhZDsKKwlwcmludGsoS0VSTl9FUlIgInJmZF9oZWFkID0gJXBcbiIsIHJmZCk7CisJZG8geworCQlwcmludGsoS0VSTl9FUlIgIiAgICVwIC5zdGF0ICUwNHgsIC5jbWQgJTA0eCwgYl9uZXh0ICVwLCByYmQgJXAsIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBjb3VudCAlMDR4XG4iLAorCQkJcmZkLCByZmQtPnN0YXQsIHJmZC0+Y21kLCByZmQtPmJfbmV4dCwgcmZkLT5yYmQsCisJCQlyZmQtPmNvdW50KTsKKwkJcmZkID0gcmZkLT52X25leHQ7CisJfSB3aGlsZSAocmZkICE9IGxwLT5yZmRfaGVhZCk7CisJcmJkID0gbHAtPnJiZF9oZWFkOworCXByaW50ayhLRVJOX0VSUiAicmJkX2hlYWQgPSAlcFxuIiwgcmJkKTsKKwlkbyB7CisJCXByaW50ayhLRVJOX0VSUiAiICAgJXAgLmNvdW50ICUwNHgsIGJfbmV4dCAlcCwgYl9kYXRhICVwLCBzaXplICUwNHhcbiIsCisJCQlyYmQsIHJiZC0+Y291bnQsIHJiZC0+Yl9uZXh0LCByYmQtPmJfZGF0YSwgcmJkLT5zaXplKTsKKwkJcmJkID0gcmJkLT52X25leHQ7CisJfSB3aGlsZSAocmJkICE9IGxwLT5yYmRfaGVhZCk7Cit9CisKKworI2lmIGRlZmluZWQoRU5BQkxFX01WTUUxNnhfTkVUKSB8fCBkZWZpbmVkKEVOQUJMRV9CVk1FNjAwMF9ORVQpCitzdGF0aWMgaXJxcmV0dXJuX3QgaTU5Nl9lcnJvcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwY2MyID0gKHVuc2lnbmVkIGNoYXIgKikgMHhmZmY0MjAwMDsKKworCQlwY2MyWzB4MjhdID0gMTsKKwkJcGNjMlsweDJiXSA9IDB4MWQ7CisJfQorI2VuZGlmCisjaWZkZWYgRU5BQkxFX0JWTUU2MDAwX05FVAorCWlmIChNQUNIX0lTX0JWTUU2MDAwKSB7CisJCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmV0aGlycSA9ICh1bnNpZ25lZCBjaGFyICopIEJWTUVfRVRISVJRX1JFRzsKKworCQkqZXRoaXJxID0gMTsKKwkJKmV0aGlycSA9IDM7CisJfQorI2VuZGlmCisJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgaW50ZXJydXB0XG4iLCBkZXYtPm5hbWUpOworCWk1OTZfZGlzcGxheV9kYXRhKGRldik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3J4X2J1ZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKwlzdHJ1Y3QgaTU5Nl9yZmQgKnJmZDsKKwlzdHJ1Y3QgaTU5Nl9yYmQgKnJiZDsKKworCS8qIEZpcnN0IGJ1aWxkIHRoZSBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIExpc3QgKi8KKworCWZvciAoaSA9IDAsIHJiZCA9IGxwLT5yYmRzOyBpIDwgcnhfcmluZ19zaXplOyBpKyssIHJiZCsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOworCisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXBhbmljKCI4MjU5NjogYWxsb2Nfc2tiKCkgZmFpbGVkIik7CisJCXNrYi0+ZGV2ID0gZGV2OworCQlyYmQtPnZfbmV4dCA9IHJiZCsxOworCQlyYmQtPmJfbmV4dCA9IFdTV0FQcmJkKHZpcnRfdG9fYnVzKHJiZCsxKSk7CisJCXJiZC0+Yl9hZGRyID0gV1NXQVByYmQodmlydF90b19idXMocmJkKSk7CisJCXJiZC0+c2tiID0gc2tiOworCQlyYmQtPnZfZGF0YSA9IHNrYi0+dGFpbDsKKwkJcmJkLT5iX2RhdGEgPSBXU1dBUGNoYXIodmlydF90b19idXMoc2tiLT50YWlsKSk7CisJCXJiZC0+c2l6ZSA9IFBLVF9CVUZfU1o7CisjaWZkZWYgX19tYzY4MDAwX18KKwkJY2FjaGVfY2xlYXIodmlydF90b19waHlzKHNrYi0+dGFpbCksIFBLVF9CVUZfU1opOworI2VuZGlmCisJfQorCWxwLT5yYmRfaGVhZCA9IGxwLT5yYmRzOworCXJiZCA9IGxwLT5yYmRzICsgcnhfcmluZ19zaXplIC0gMTsKKwlyYmQtPnZfbmV4dCA9IGxwLT5yYmRzOworCXJiZC0+Yl9uZXh0ID0gV1NXQVByYmQodmlydF90b19idXMobHAtPnJiZHMpKTsKKworCS8qIE5vdyBidWlsZCB0aGUgUmVjZWl2ZSBGcmFtZSBEZXNjcmlwdG9yIExpc3QgKi8KKworCWZvciAoaSA9IDAsIHJmZCA9IGxwLT5yZmRzOyBpIDwgcnhfcmluZ19zaXplOyBpKyssIHJmZCsrKSB7CisJCXJmZC0+cmJkID0gSTU5Nl9OVUxMOworCQlyZmQtPnZfbmV4dCA9IHJmZCsxOworCQlyZmQtPnZfcHJldiA9IHJmZC0xOworCQlyZmQtPmJfbmV4dCA9IFdTV0FQcmZkKHZpcnRfdG9fYnVzKHJmZCsxKSk7CisJCXJmZC0+Y21kID0gQ01EX0ZMRVg7CisJfQorCWxwLT5yZmRfaGVhZCA9IGxwLT5yZmRzOworCWxwLT5zY2IucmZkID0gV1NXQVByZmQodmlydF90b19idXMobHAtPnJmZHMpKTsKKwlyZmQgPSBscC0+cmZkczsKKwlyZmQtPnJiZCA9IGxwLT5yYmRfaGVhZDsKKwlyZmQtPnZfcHJldiA9IGxwLT5yZmRzICsgcnhfcmluZ19zaXplIC0gMTsKKwlyZmQgPSBscC0+cmZkcyArIHJ4X3Jpbmdfc2l6ZSAtIDE7CisJcmZkLT52X25leHQgPSBscC0+cmZkczsKKwlyZmQtPmJfbmV4dCA9IFdTV0FQcmZkKHZpcnRfdG9fYnVzKGxwLT5yZmRzKSk7CisJcmZkLT5jbWQgPSBDTURfRU9MfENNRF9GTEVYOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVtb3ZlX3J4X2J1ZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgaTU5Nl9yYmQgKnJiZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDAsIHJiZCA9IGxwLT5yYmRzOyBpIDwgcnhfcmluZ19zaXplOyBpKyssIHJiZCsrKSB7CisJCWlmIChyYmQtPnNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWRldl9rZnJlZV9za2IocmJkLT5za2IpOworCX0KK30KKworCitzdGF0aWMgdm9pZCByZWJ1aWxkX3J4X2J1ZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCS8qIEVuc3VyZSByeCBmcmFtZS9idWZmZXIgZGVzY3JpcHRvcnMgYXJlIHRpZHkgKi8KKworCWZvciAoaSA9IDA7IGkgPCByeF9yaW5nX3NpemU7IGkrKykgeworCQlscC0+cmZkc1tpXS5yYmQgPSBJNTk2X05VTEw7CisJCWxwLT5yZmRzW2ldLmNtZCA9IENNRF9GTEVYOworCX0KKwlscC0+cmZkc1tyeF9yaW5nX3NpemUtMV0uY21kID0gQ01EX0VPTHxDTURfRkxFWDsKKwlscC0+cmZkX2hlYWQgPSBscC0+cmZkczsKKwlscC0+c2NiLnJmZCA9IFdTV0FQcmZkKHZpcnRfdG9fYnVzKGxwLT5yZmRzKSk7CisJbHAtPnJiZF9oZWFkID0gbHAtPnJiZHM7CisJbHAtPnJmZHNbMF0ucmJkID0gV1NXQVByYmQodmlydF90b19idXMobHAtPnJiZHMpKTsKK30KKworCitzdGF0aWMgaW50IGluaXRfaTU5Nl9tZW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyNpZiAhZGVmaW5lZChFTkFCTEVfTVZNRTE2eF9ORVQpICYmICFkZWZpbmVkKEVOQUJMRV9CVk1FNjAwMF9ORVQpCisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJTVBVX1BPUlQoZGV2LCBQT1JUX1JFU0VULCBOVUxMKTsKKworCXVkZWxheSgxMDApOwkJLyogV2FpdCAxMDB1cyAtIHNlZW1zIHRvIGhlbHAgKi8KKworI2lmIGRlZmluZWQoRU5BQkxFX01WTUUxNnhfTkVUKSB8fCBkZWZpbmVkKEVOQUJMRV9CVk1FNjAwMF9ORVQpCisjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwY2MyID0gKHVuc2lnbmVkIGNoYXIgKikgMHhmZmY0MjAwMDsKKworCQkvKiBEaXNhYmxlIGFsbCBpbnRzIGZvciBub3cgKi8KKwkJcGNjMlsweDI4XSA9IDE7CisJCXBjYzJbMHgyYV0gPSAweDQ4OworCQkvKiBGb2xsb3dpbmcgZGlzYWJsZXMgc25vb3BpbmcuICBTbm9vcGluZyBpcyBub3QgcmVxdWlyZWQKKwkJICogYXMgd2UgbWFrZSBhcHByb3ByaWF0ZSB1c2Ugb2Ygbm9uLWNhY2hlZCBwYWdlcyBmb3IKKwkJICogc2hhcmVkIGRhdGEsIGFuZCBjYWNoZV9wdXNoL2NhY2hlX2NsZWFyLgorCQkgKi8KKwkJcGNjMlsweDJiXSA9IDB4MDg7CisJfQorI2VuZGlmCisjaWZkZWYgRU5BQkxFX0JWTUU2MDAwX05FVAorCWlmIChNQUNIX0lTX0JWTUU2MDAwKSB7CisJCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmV0aGlycSA9ICh1bnNpZ25lZCBjaGFyICopIEJWTUVfRVRISVJRX1JFRzsKKworCQkqZXRoaXJxID0gMTsKKwl9CisjZW5kaWYKKworCS8qIGNoYW5nZSB0aGUgc2NwIGFkZHJlc3MgKi8KKworCU1QVV9QT1JUKGRldiwgUE9SVF9BTFRTQ1AsICh2b2lkICopdmlydF90b19idXMoKHZvaWQgKikmbHAtPnNjcCkpOworCisjZWxpZiBkZWZpbmVkKEVOQUJMRV9BUFJJQ09UKQorCisJeworCQl1MzIgc2NwID0gdmlydF90b19idXMoJmxwLT5zY3ApOworCisJCS8qIGNoYW5nZSB0aGUgc2NwIGFkZHJlc3MgKi8KKwkJb3V0dygwLCBpb2FkZHIpOworCQlvdXR3KDAsIGlvYWRkcik7CisJCW91dGIoNCwgaW9hZGRyICsgMHhmKTsKKwkJb3V0dyhzY3AgfCAyLCBpb2FkZHIpOworCQlvdXR3KHNjcCA+PiAxNiwgaW9hZGRyKTsKKwl9CisjZW5kaWYKKworCWxwLT5sYXN0X2NtZCA9IGppZmZpZXM7CisKKyNpZmRlZiBFTkFCTEVfTVZNRTE2eF9ORVQKKwlpZiAoTUFDSF9JU19NVk1FMTZ4KQorCQlscC0+c2NwLnN5c2J1cyA9IDB4MDAwMDAwNTQ7CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfQlZNRTYwMDBfTkVUCisJaWYgKE1BQ0hfSVNfQlZNRTYwMDApCisJCWxwLT5zY3Auc3lzYnVzID0gMHgwMDAwMDA0YzsKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9BUFJJQ09UCisJaWYgKE1BQ0hfSVNfQVBSSUNPVCkKKwkJbHAtPnNjcC5zeXNidXMgPSAweDAwNDQwMDAwOworI2VuZGlmCisKKwlscC0+c2NwLmlzY3AgPSBXU1dBUGlzY3AodmlydF90b19idXMoKHZvaWQgKikmbHAtPmlzY3ApKTsKKwlscC0+aXNjcC5zY2IgPSBXU1dBUHNjYih2aXJ0X3RvX2J1cygodm9pZCAqKSZscC0+c2NiKSk7CisJbHAtPmlzY3Auc3RhdCA9IElTQ1BfQlVTWTsKKwlscC0+Y21kX2JhY2tsb2cgPSAwOworCisJbHAtPmNtZF9oZWFkID0gbHAtPnNjYi5jbWQgPSBJNTk2X05VTEw7CisKKyNpZmRlZiBFTkFCTEVfQlZNRTYwMDBfTkVUCisJaWYgKE1BQ0hfSVNfQlZNRTYwMDApIHsKKwkJbHAtPnNjYi50X29uICA9IDcgKiAyNTsKKwkJbHAtPnNjYi50X29mZiA9IDEgKiAyNTsKKwl9CisjZW5kaWYKKworCURFQihERUJfSU5JVCxwcmludGsoS0VSTl9ERUJVRyAiJXM6IHN0YXJ0aW5nIGk4MjU5Ni5cbiIsIGRldi0+bmFtZSkpOworCisjaWYgZGVmaW5lZChFTkFCTEVfQVBSSUNPVCkKKwkodm9pZCkgaW5iKGlvYWRkciArIDB4MTApOworCW91dGIoNCwgaW9hZGRyICsgMHhmKTsKKyNlbmRpZgorCUNBKGRldik7CisKKwlpZiAod2FpdF9pc3RhdChkZXYsbHAsMTAwMCwiaW5pdGlhbGl6YXRpb24gdGltZWQgb3V0IikpCisJCWdvdG8gZmFpbGVkOworCURFQihERUJfSU5JVCxwcmludGsoS0VSTl9ERUJVRyAiJXM6IGk4MjU5NiBpbml0aWFsaXphdGlvbiBzdWNjZXNzZnVsXG4iLCBkZXYtPm5hbWUpKTsKKworCS8qIEVuc3VyZSByeCBmcmFtZS9idWZmZXIgZGVzY3JpcHRvcnMgYXJlIHRpZHkgKi8KKwlyZWJ1aWxkX3J4X2J1ZnMoZGV2KTsKKwlscC0+c2NiLmNvbW1hbmQgPSAwOworCisjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwY2MyID0gKHVuc2lnbmVkIGNoYXIgKikgMHhmZmY0MjAwMDsKKworCQkvKiBFbmFibGUgaW50cywgZXRjLiBub3cgKi8KKwkJcGNjMlsweDJhXSA9IDB4NTU7CS8qIEVkZ2Ugc2Vuc2l0aXZlICovCisJCXBjYzJbMHgyYl0gPSAweDE1OworCX0KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9CVk1FNjAwMF9ORVQKKwlpZiAoTUFDSF9JU19CVk1FNjAwMCkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpldGhpcnEgPSAodW5zaWduZWQgY2hhciAqKSBCVk1FX0VUSElSUV9SRUc7CisKKwkJKmV0aGlycSA9IDM7CisJfQorI2VuZGlmCisKKworCURFQihERUJfSU5JVCxwcmludGsoS0VSTl9ERUJVRyAiJXM6IHF1ZXVpbmcgQ21kQ29uZmlndXJlXG4iLCBkZXYtPm5hbWUpKTsKKwltZW1jcHkobHAtPmNmX2NtZC5pNTk2X2NvbmZpZywgaW5pdF9zZXR1cCwgMTQpOworCWxwLT5jZl9jbWQuY21kLmNvbW1hbmQgPSBDbWRDb25maWd1cmU7CisJaTU5Nl9hZGRfY21kKGRldiwgJmxwLT5jZl9jbWQuY21kKTsKKworCURFQihERUJfSU5JVCxwcmludGsoS0VSTl9ERUJVRyAiJXM6IHF1ZXVpbmcgQ21kU0FTZXR1cFxuIiwgZGV2LT5uYW1lKSk7CisJbWVtY3B5KGxwLT5zYV9jbWQuZXRoX2FkZHIsIGRldi0+ZGV2X2FkZHIsIDYpOworCWxwLT5zYV9jbWQuY21kLmNvbW1hbmQgPSBDbWRTQVNldHVwOworCWk1OTZfYWRkX2NtZChkZXYsICZscC0+c2FfY21kLmNtZCk7CisKKwlERUIoREVCX0lOSVQscHJpbnRrKEtFUk5fREVCVUcgIiVzOiBxdWV1aW5nIENtZFREUlxuIiwgZGV2LT5uYW1lKSk7CisJbHAtPnRkcl9jbWQuY21kLmNvbW1hbmQgPSBDbWRURFI7CisJaTU5Nl9hZGRfY21kKGRldiwgJmxwLT50ZHJfY21kLmNtZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAod2FpdF9jbWQoZGV2LGxwLDEwMDAsInRpbWVkIG91dCB3YWl0aW5nIHRvIGlzc3VlIFJYX1NUQVJUIikpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmxwLT5sb2NrLCBmbGFncyk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlERUIoREVCX0lOSVQscHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJc3N1aW5nIFJYX1NUQVJUXG4iLCBkZXYtPm5hbWUpKTsKKwlscC0+c2NiLmNvbW1hbmQgPSBSWF9TVEFSVDsKKwlDQShkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAod2FpdF9jbWQoZGV2LGxwLDEwMDAsIlJYX1NUQVJUIG5vdCBwcm9jZXNzZWQiKSkKKwkJZ290byBmYWlsZWQ7CisJREVCKERFQl9JTklULHByaW50ayhLRVJOX0RFQlVHICIlczogUmVjZWl2ZSB1bml0IHN0YXJ0ZWQgT0tcbiIsIGRldi0+bmFtZSkpOworCXJldHVybiAwOworCitmYWlsZWQ6CisJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IEZhaWxlZCB0byBpbml0aWFsaXNlIDgyNTk2XG4iLCBkZXYtPm5hbWUpOworCU1QVV9QT1JUKGRldiwgUE9SVF9SRVNFVCwgTlVMTCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludCBpNTk2X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IGk1OTZfcmZkICpyZmQ7CisJc3RydWN0IGk1OTZfcmJkICpyYmQ7CisJaW50IGZyYW1lcyA9IDA7CisKKwlERUIoREVCX1JYRlJBTUUscHJpbnRrKEtFUk5fREVCVUcgImk1OTZfcngoKSwgcmZkX2hlYWQgJXAsIHJiZF9oZWFkICVwXG4iLAorCQkJbHAtPnJmZF9oZWFkLCBscC0+cmJkX2hlYWQpKTsKKworCXJmZCA9IGxwLT5yZmRfaGVhZDsJCS8qIFJlZiBuZXh0IGZyYW1lIHRvIGNoZWNrICovCisKKwl3aGlsZSAoKHJmZC0+c3RhdCkgJiBTVEFUX0MpIHsJLyogTG9vcCB3aGlsZSBjb21wbGV0ZSBmcmFtZXMgKi8KKwkJaWYgKHJmZC0+cmJkID09IEk1OTZfTlVMTCkKKwkJCXJiZCA9IEk1OTZfTlVMTDsKKwkJZWxzZSBpZiAocmZkLT5yYmQgPT0gbHAtPnJiZF9oZWFkLT5iX2FkZHIpCisJCQlyYmQgPSBscC0+cmJkX2hlYWQ7CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IHJiZCBjaGFpbiBicm9rZW4hXG4iLCBkZXYtPm5hbWUpOworCQkJLyogWFhYIE5vdyB3aGF0PyAqLworCQkJcmJkID0gSTU5Nl9OVUxMOworCQl9CisJCURFQihERUJfUlhGUkFNRSwgcHJpbnRrKEtFUk5fREVCVUcgIiAgcmZkICVwLCByZmQucmJkICVwLCByZmQuc3RhdCAlMDR4XG4iLAorCQkJcmZkLCByZmQtPnJiZCwgcmZkLT5zdGF0KSk7CisJCQorCQlpZiAocmJkICE9IEk1OTZfTlVMTCAmJiAoKHJmZC0+c3RhdCkgJiBTVEFUX09LKSkgeworCQkJLyogYSBnb29kIGZyYW1lICovCisJCQlpbnQgcGt0X2xlbiA9IHJiZC0+Y291bnQgJiAweDNmZmY7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcmJkLT5za2I7CisJCQlpbnQgcnhfaW5fcGxhY2UgPSAwOworCisJCQlERUIoREVCX1JYQUREUixwcmludF9ldGgocmJkLT52X2RhdGEsICJyZWNlaXZlZCIpKTsKKwkJCWZyYW1lcysrOworCisJCQkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGxvbmcgZW5vdWdoIHRvIGp1c3QgYWNjZXB0CisJCQkgKiB3aXRob3V0IGNvcHlpbmcgdG8gYSBwcm9wZXJseSBzaXplZCBza2J1ZmYuCisJCQkgKi8KKworCQkJaWYgKHBrdF9sZW4gPiByeF9jb3B5YnJlYWspIHsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOworCisJCQkJLyogR2V0IGZyZXNoIHNrYnVmZiB0byByZXBsYWNlIGZpbGxlZCBvbmUuICovCisJCQkJbmV3c2tiID0gZGV2X2FsbG9jX3NrYihQS1RfQlVGX1NaKTsKKwkJCQlpZiAobmV3c2tiID09IE5VTEwpIHsKKwkJCQkJc2tiID0gTlVMTDsJLyogZHJvcCBwa3QgKi8KKwkJCQkJZ290byBtZW1vcnlfc3F1ZWV6ZTsKKwkJCQl9CisJCQkJLyogUGFzcyB1cCB0aGUgc2tiIGFscmVhZHkgb24gdGhlIFJ4IHJpbmcuICovCisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCXJ4X2luX3BsYWNlID0gMTsKKwkJCQlyYmQtPnNrYiA9IG5ld3NrYjsKKwkJCQluZXdza2ItPmRldiA9IGRldjsKKwkJCQlyYmQtPnZfZGF0YSA9IG5ld3NrYi0+dGFpbDsKKwkJCQlyYmQtPmJfZGF0YSA9IFdTV0FQY2hhcih2aXJ0X3RvX2J1cyhuZXdza2ItPnRhaWwpKTsKKyNpZmRlZiBfX21jNjgwMDBfXworCQkJCWNhY2hlX2NsZWFyKHZpcnRfdG9fcGh5cyhuZXdza2ItPnRhaWwpLCBQS1RfQlVGX1NaKTsKKyNlbmRpZgorCQkJfQorCQkJZWxzZQorCQkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpOworbWVtb3J5X3NxdWVlemU6CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQkvKiBYWFggdHVsaXAuYyBjYW4gZGVmZXIgcGFja2V0cyBoZXJlISEgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaTU5Nl9yeCBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJfQorCQkJZWxzZSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJaWYgKCFyeF9pbl9wbGFjZSkgeworCQkJCQkvKiAxNiBieXRlIGFsaWduIHRoZSBkYXRhIGZpZWxkcyAqLworCQkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQkJCQltZW1jcHkoc2tiX3B1dChza2IscGt0X2xlbiksIHJiZC0+dl9kYXRhLCBwa3RfbGVuKTsKKwkJCQl9CisJCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCQlza2ItPmxlbiA9IHBrdF9sZW47CisjaWZkZWYgX19tYzY4MDAwX18KKwkJCQljYWNoZV9jbGVhcih2aXJ0X3RvX3BoeXMocmJkLT5za2ItPnRhaWwpLAorCQkJCQkJcGt0X2xlbik7CisjZW5kaWYKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlscC0+c3RhdHMucnhfYnl0ZXMrPXBrdF9sZW47CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlERUIoREVCX0VSUk9SUywgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBFcnJvciwgcmZkLnN0YXQgPSAweCUwNHhcbiIsCisJCQkJCWRldi0+bmFtZSwgcmZkLT5zdGF0KSk7CisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAoKHJmZC0+c3RhdCkgJiAweDAwMDEpCisJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCWlmICgocmZkLT5zdGF0KSAmIDB4MDA4MCkKKwkJCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKChyZmQtPnN0YXQpICYgMHgwMTAwKQorCQkJCWxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJaWYgKChyZmQtPnN0YXQpICYgMHgwMjAwKQorCQkJCWxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJaWYgKChyZmQtPnN0YXQpICYgMHgwNDAwKQorCQkJCWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmICgocmZkLT5zdGF0KSAmIDB4MDgwMCkKKwkJCQlscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKChyZmQtPnN0YXQpICYgMHgxMDAwKQorCQkJCWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCX0KKworCQkvKiBDbGVhciB0aGUgYnVmZmVyIGRlc2NyaXB0b3IgY291bnQgYW5kIEVPRiArIEYgZmxhZ3MgKi8KKworCQlpZiAocmJkICE9IEk1OTZfTlVMTCAmJiAocmJkLT5jb3VudCAmIDB4NDAwMCkpIHsKKwkJCXJiZC0+Y291bnQgPSAwOworCQkJbHAtPnJiZF9oZWFkID0gcmJkLT52X25leHQ7CisJCX0KKworCQkvKiBUaWR5IHRoZSBmcmFtZSBkZXNjcmlwdG9yLCBtYXJraW5nIGl0IGFzIGVuZCBvZiBsaXN0ICovCisKKwkJcmZkLT5yYmQgPSBJNTk2X05VTEw7CisJCXJmZC0+c3RhdCA9IDA7CisJCXJmZC0+Y21kID0gQ01EX0VPTHxDTURfRkxFWDsKKwkJcmZkLT5jb3VudCA9IDA7CisKKwkJLyogUmVtb3ZlIGVuZC1vZi1saXN0IGZyb20gb2xkIGVuZCBkZXNjcmlwdG9yICovCisKKwkJcmZkLT52X3ByZXYtPmNtZCA9IENNRF9GTEVYOworCisJCS8qIFVwZGF0ZSByZWNvcmQgb2YgbmV4dCBmcmFtZSBkZXNjcmlwdG9yIHRvIHByb2Nlc3MgKi8KKworCQlscC0+c2NiLnJmZCA9IHJmZC0+Yl9uZXh0OworCQlscC0+cmZkX2hlYWQgPSByZmQtPnZfbmV4dDsKKwkJcmZkID0gbHAtPnJmZF9oZWFkOworCX0KKworCURFQihERUJfUlhGUkFNRSxwcmludGsoS0VSTl9ERUJVRyAiZnJhbWVzICVkXG4iLCBmcmFtZXMpKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpNTk2X2NsZWFudXBfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwKQoreworCXN0cnVjdCBpNTk2X2NtZCAqcHRyOworCisJd2hpbGUgKGxwLT5jbWRfaGVhZCAhPSBJNTk2X05VTEwpIHsKKwkJcHRyID0gbHAtPmNtZF9oZWFkOworCQlscC0+Y21kX2hlYWQgPSBwdHItPnZfbmV4dDsKKwkJbHAtPmNtZF9iYWNrbG9nLS07CisKKwkJc3dpdGNoICgocHRyLT5jb21tYW5kKSAmIDB4NykgeworCQljYXNlIENtZFR4OgorCQkJeworCQkJCXN0cnVjdCB0eF9jbWQgKnR4X2NtZCA9IChzdHJ1Y3QgdHhfY21kICopIHB0cjsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhfY21kLT5za2I7CisKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwkJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisKKwkJCQlwdHItPnZfbmV4dCA9IHB0ci0+Yl9uZXh0ID0gSTU5Nl9OVUxMOworCQkJCXR4X2NtZC0+Y21kLmNvbW1hbmQgPSAwOyAgLyogTWFyayBhcyBmcmVlICovCisJCQkJYnJlYWs7CisJCQl9CisJCWRlZmF1bHQ6CisJCQlwdHItPnZfbmV4dCA9IHB0ci0+Yl9uZXh0ID0gSTU5Nl9OVUxMOworCQl9CisJfQorCisJd2FpdF9jbWQoZGV2LGxwLDEwMCwiaTU5Nl9jbGVhbnVwX2NtZCB0aW1lZCBvdXQiKTsKKwlscC0+c2NiLmNtZCA9IEk1OTZfTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGk1OTZfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAsIGludCBpb2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURFQihERUJfUkVTRVQscHJpbnRrKEtFUk5fREVCVUcgImk1OTZfcmVzZXRcbiIpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXdhaXRfY21kKGRldixscCwxMDAsImk1OTZfcmVzZXQgdGltZWQgb3V0Iik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlscC0+c2NiLmNvbW1hbmQgPSBDVUNfQUJPUlQgfCBSWF9BQk9SVDsKKwlDQShkZXYpOworCisJLyogd2FpdCBmb3Igc2h1dGRvd24gKi8KKwl3YWl0X2NtZChkZXYsbHAsMTAwMCwiaTU5Nl9yZXNldCAyIHRpbWVkIG91dCIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZscC0+bG9jaywgZmxhZ3MpOworCisJaTU5Nl9jbGVhbnVwX2NtZChkZXYsbHApOworCWk1OTZfcngoZGV2KTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJaW5pdF9pNTk2X21lbShkZXYpOworfQorCitzdGF0aWMgdm9pZCBpNTk2X2FkZF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfY21kICpjbWQpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlERUIoREVCX0FERENNRCxwcmludGsoS0VSTl9ERUJVRyAiaTU5Nl9hZGRfY21kXG4iKSk7CisKKwljbWQtPnN0YXR1cyA9IDA7CisJY21kLT5jb21tYW5kIHw9IChDTURfRU9MIHwgQ01EX0lOVFIpOworCWNtZC0+dl9uZXh0ID0gY21kLT5iX25leHQgPSBJNTk2X05VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAobHAtPmNtZF9oZWFkICE9IEk1OTZfTlVMTCkgeworCQlscC0+Y21kX3RhaWwtPnZfbmV4dCA9IGNtZDsKKwkJbHAtPmNtZF90YWlsLT5iX25leHQgPSBXU1dBUGNtZCh2aXJ0X3RvX2J1cygmY21kLT5zdGF0dXMpKTsKKwl9IGVsc2UgeworCQlscC0+Y21kX2hlYWQgPSBjbWQ7CisJCXdhaXRfY21kKGRldixscCwxMDAsImk1OTZfYWRkX2NtZCB0aW1lZCBvdXQiKTsKKwkJbHAtPnNjYi5jbWQgPSBXU1dBUGNtZCh2aXJ0X3RvX2J1cygmY21kLT5zdGF0dXMpKTsKKwkJbHAtPnNjYi5jb21tYW5kID0gQ1VDX1NUQVJUOworCQlDQShkZXYpOworCX0KKwlscC0+Y21kX3RhaWwgPSBjbWQ7CisJbHAtPmNtZF9iYWNrbG9nKys7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChscC0+Y21kX2JhY2tsb2cgPiBtYXhfY21kX2JhY2tsb2cpIHsKKwkJdW5zaWduZWQgbG9uZyB0aWNrc3NvZmFyID0gamlmZmllcyAtIGxwLT5sYXN0X2NtZDsKKworCQlpZiAodGlja3Nzb2ZhciA8IHRpY2tzX2xpbWl0KQorCQkJcmV0dXJuOworCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGNvbW1hbmQgdW5pdCB0aW1lZCBvdXQsIHN0YXR1cyByZXNldHRpbmcuXG4iLCBkZXYtPm5hbWUpOworCisJCWk1OTZfcmVzZXQoZGV2LCBscCwgaW9hZGRyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaTU5Nl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJlcyA9IDA7CisKKwlERUIoREVCX09QRU4scHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpNTk2X29wZW4oKSBpcnEgJWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKSk7CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGk1OTZfaW50ZXJydXB0LCAwLCAiaTgyNTk2IiwgZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJUlEgJWQgbm90IGZyZWVcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgeworCQlpZiAocmVxdWVzdF9pcnEoMHg1NiwgaTU5Nl9lcnJvciwgMCwgImk4MjU5Nl9lcnJvciIsIGRldikpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisjZW5kaWYKKwlpbml0X3J4X2J1ZnMoZGV2KTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkvKiBJbml0aWFsaXplIHRoZSA4MjU5NiBtZW1vcnkgKi8KKwlpZiAoaW5pdF9pNTk2X21lbShkZXYpKSB7CisJCXJlcyA9IC1FQUdBSU47CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCX0KKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIGk1OTZfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBUcmFuc21pdHRlciB0aW1lb3V0LCBzZXJpb3VzIHByb2JsZW1zLiAqLworCURFQihERUJfRVJST1JTLHByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzIHJlc2V0dGluZy5cbiIsCisJCQlkZXYtPm5hbWUpKTsKKworCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKworCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yICovCisJaWYgKGxwLT5sYXN0X3Jlc3RhcnQgPT0gbHAtPnN0YXRzLnR4X3BhY2tldHMpIHsKKwkJREVCKERFQl9FUlJPUlMscHJpbnRrKEtFUk5fRVJSICJSZXNldHRpbmcgYm9hcmQuXG4iKSk7CisJCS8qIFNodXRkb3duIGFuZCByZXN0YXJ0ICovCisJCWk1OTZfcmVzZXQgKGRldiwgbHAsIGlvYWRkcik7CisJfSBlbHNlIHsKKwkJLyogSXNzdWUgYSBjaGFubmVsIGF0dGVudGlvbiBzaWduYWwgKi8KKwkJREVCKERFQl9FUlJPUlMscHJpbnRrKEtFUk5fRVJSICJLaWNraW5nIGJvYXJkLlxuIikpOworCQlscC0+c2NiLmNvbW1hbmQgPSBDVUNfU1RBUlQgfCBSWF9TVEFSVDsKKwkJQ0EgKGRldik7CisJCWxwLT5sYXN0X3Jlc3RhcnQgPSBscC0+c3RhdHMudHhfcGFja2V0czsKKwl9CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworfQorCisKK3N0YXRpYyBpbnQgaTU5Nl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHR4X2NtZCAqdHhfY21kOworCXN0cnVjdCBpNTk2X3RiZCAqdGJkOworCXNob3J0IGxlbmd0aCA9IHNrYi0+bGVuOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJREVCKERFQl9TVEFSVFRYLHByaW50ayhLRVJOX0RFQlVHICIlczogaTU5Nl9zdGFydF94bWl0KCV4LCV4KSBjYWxsZWRcbiIsIGRldi0+bmFtZSwKKwkJCQlza2ItPmxlbiwgKHVuc2lnbmVkIGludClza2ItPmRhdGEpKTsKKworCWlmIChza2ItPmxlbiA8IEVUSF9aTEVOKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWxlbmd0aCA9IEVUSF9aTEVOOworCX0KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwl0eF9jbWQgPSBscC0+dHhfY21kcyArIGxwLT5uZXh0X3R4X2NtZDsKKwl0YmQgPSBscC0+dGJkcyArIGxwLT5uZXh0X3R4X2NtZDsKKworCWlmICh0eF9jbWQtPmNtZC5jb21tYW5kKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHhtaXQgcmluZyBmdWxsLCBkcm9wcGluZyBwYWNrZXQuXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCWxwLT5zdGF0cy50eF9kcm9wcGVkKys7CisKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0gZWxzZSB7CisJCWlmICgrK2xwLT5uZXh0X3R4X2NtZCA9PSBUWF9SSU5HX1NJWkUpCisJCQlscC0+bmV4dF90eF9jbWQgPSAwOworCQl0eF9jbWQtPnRiZCA9IFdTV0FQdGJkKHZpcnRfdG9fYnVzKHRiZCkpOworCQl0YmQtPm5leHQgPSBJNTk2X05VTEw7CisKKwkJdHhfY21kLT5jbWQuY29tbWFuZCA9IENNRF9GTEVYIHwgQ21kVHg7CisJCXR4X2NtZC0+c2tiID0gc2tiOworCisJCXR4X2NtZC0+cGFkID0gMDsKKwkJdHhfY21kLT5zaXplID0gMDsKKwkJdGJkLT5wYWQgPSAwOworCQl0YmQtPnNpemUgPSBFT0YgfCBsZW5ndGg7CisKKwkJdGJkLT5kYXRhID0gV1NXQVBjaGFyKHZpcnRfdG9fYnVzKHNrYi0+ZGF0YSkpOworCisjaWZkZWYgX19tYzY4MDAwX18KKwkJY2FjaGVfcHVzaCh2aXJ0X3RvX3BoeXMoc2tiLT5kYXRhKSwgbGVuZ3RoKTsKKyNlbmRpZgorCQlERUIoREVCX1RYQUREUixwcmludF9ldGgoc2tiLT5kYXRhLCAidHgtcXVldWVkIikpOworCQlpNTk2X2FkZF9jbWQoZGV2LCAmdHhfY21kLT5jbWQpOworCisJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWxwLT5zdGF0cy50eF9ieXRlcyArPSBsZW5ndGg7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9ldGgodW5zaWduZWQgY2hhciAqYWRkLCBjaGFyICpzdHIpCit7CisJaW50IGk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiaTU5NiAweCVwLCAiLCBhZGQpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUwMlgiLCBhZGRbaSArIDZdKTsKKwlwcmludGsoIiAtLT4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiAlMDJYIiwgYWRkW2ldKTsKKwlwcmludGsoIiAlMDJYJTAyWCwgJXNcbiIsIGFkZFsxMl0sIGFkZFsxM10sIHN0cik7Cit9CisKK3N0YXRpYyBpbnQgaW8gPSAweDMwMDsKK3N0YXRpYyBpbnQgaXJxID0gMTA7CisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGk4MjU5Nl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpOworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwOworCWNoYXIgZXRoX2FkZHJbOF07CisJc3RhdGljIGludCBwcm9iZWQ7CisJaW50IGVycjsKKworCWlmIChwcm9iZWQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCXByb2JlZCsrOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoMCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfSBlbHNlIHsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpbzsKKwkJZGV2LT5pcnEgPSBpcnE7CisJfQorCisjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgeworCQlpZiAobXZtZTE2eF9jb25maWcgJiBNVk1FMTZ4X0NPTkZJR19OT19FVEhFUk5FVCkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJFdGhlcm5ldCBwcm9iZSBkaXNhYmxlZCAtIGNoaXAgbm90IHByZXNlbnRcbiIpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0OworCQl9CisJCW1lbWNweShldGhfYWRkciwgKHZvaWQgKikgMHhmZmZjMWYyYywgNik7CS8qIFlVQ0shIEdldCBhZGRyIGZyb20gTk9WUkFNICovCisJCWRldi0+YmFzZV9hZGRyID0gTVZNRV9JNTk2X0JBU0U7CisJCWRldi0+aXJxID0gKHVuc2lnbmVkKSBNVk1FMTZ4X0lSUV9JNTk2OworCX0KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9CVk1FNjAwMF9ORVQKKwlpZiAoTUFDSF9JU19CVk1FNjAwMCkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpydGMgPSAodW5zaWduZWQgY2hhciAqKSBCVk1FX1JUQ19CQVNFOworCQl1bnNpZ25lZCBjaGFyIG1zciA9IHJ0Y1szXTsKKwkJaW50IGk7CisKKwkJcnRjWzNdIHw9IDB4ODA7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlldGhfYWRkcltpXSA9IHJ0Y1tpICogNCArIDddOwkvKiBTdG9yZWQgaW4gUlRDIFJBTSBhdCBvZmZzZXQgMSAqLworCQlydGNbM10gPSBtc3I7CisJCWRldi0+YmFzZV9hZGRyID0gQlZNRV9JNTk2X0JBU0U7CisJCWRldi0+aXJxID0gKHVuc2lnbmVkKSBCVk1FX0lSUV9JNTk2OworCX0KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9BUFJJQ09UCisJeworCQlpbnQgY2hlY2tzdW0gPSAwOworCQlpbnQgaW9hZGRyID0gMHgzMDA7CisKKwkJLyogdGhpcyBpcyBlYXN5IHRoZSBldGhlcm5ldCBpbnRlcmZhY2UgY2FuIG9ubHkgYmUgYXQgMHgzMDAgKi8KKwkJLyogZmlyc3QgY2hlY2sgbm90aGluZyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgaGVyZSAqLworCisJCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBJNTk2X1RPVEFMX1NJWkUsIERSVl9OQU1FKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICI4MjU5NjogSU8gYWRkcmVzcyAweCUwNHggaW4gdXNlXG4iLCBpb2FkZHIpOworCQkJZXJyID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlldGhfYWRkcltpXSA9IGluYihpb2FkZHIgKyA4ICsgaSk7CisJCQljaGVja3N1bSArPSBldGhfYWRkcltpXTsKKwkJfQorCisJCS8qIGNoZWNrc3VtIGlzIGEgbXVsdGlwbGUgb2YgMHgxMDAsIGdvdCB0aGlzIHdyb25nIGZpcnN0IHRpbWUKKwkJICAgc29tZSBtYWNoaW5lcyBoYXZlIDB4MTAwLCBzb21lIDB4MjAwLiBUaGUgRE9TIGRyaXZlciBkb2Vzbid0CisJCSAgIGV2ZW4gYm90aGVyIHdpdGggdGhlIGNoZWNrc3VtLgorCQkgICBTb21lIG90aGVyIGJvYXJkcyB0cmlwIHRoZSBjaGVja3N1bS4uIGJ1dCB0aGVuIGFwcGVhciBhcworCQkgICBldGhlciBhZGRyZXNzIDAuIFRyYXAgdGhlc2UgLSBBQyAqLworCisJCWlmICgoY2hlY2tzdW0gJSAweDEwMCkgfHwgCisJCSAgICAobWVtY21wKGV0aF9hZGRyLCAiXHgwMFx4MDBceDQ5IiwgMykgIT0gMCkpIHsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIG91dDE7CisJCX0KKworCQlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwkJZGV2LT5pcnEgPSAxMDsKKwl9CisjZW5kaWYKKwlkZXYtPm1lbV9zdGFydCA9IChpbnQpX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCAwKTsKKwlpZiAoIWRldi0+bWVtX3N0YXJ0KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0MTsKKwl9CisKKwlERUIoREVCX1BST0JFLHByaW50ayhLRVJOX0lORk8gIiVzOiA4MjU5NiBhdCAlIzNseCwiLCBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlERUIoREVCX1BST0JFLHByaW50aygiICUyLjJYIiwgZGV2LT5kZXZfYWRkcltpXSA9IGV0aF9hZGRyW2ldKSk7CisKKwlERUIoREVCX1BST0JFLHByaW50aygiIElSUSAlZC5cbiIsIGRldi0+aXJxKSk7CisKKwlERUIoREVCX1BST0JFLHByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbikpOworCisJLyogVGhlIDgyNTk2LXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+b3BlbiA9IGk1OTZfb3BlbjsKKwlkZXYtPnN0b3AgPSBpNTk2X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaTU5Nl9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gaTU5Nl9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT50eF90aW1lb3V0ID0gaTU5Nl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCisJZGV2LT5wcml2ID0gKHZvaWQgKikoZGV2LT5tZW1fc3RhcnQpOworCisJbHAgPSBkZXYtPnByaXY7CisJREVCKERFQl9JTklULHByaW50ayhLRVJOX0RFQlVHICIlczogbHAgYXQgMHglMDhseCAoJWQgYnl0ZXMpLCBscC0+c2NiIGF0IDB4JTA4bHhcbiIsCisJCQlkZXYtPm5hbWUsICh1bnNpZ25lZCBsb25nKWxwLAorCQkJc2l6ZW9mKHN0cnVjdCBpNTk2X3ByaXZhdGUpLCAodW5zaWduZWQgbG9uZykmbHAtPnNjYikpOworCW1lbXNldCgodm9pZCAqKSBscCwgMCwgc2l6ZW9mKHN0cnVjdCBpNTk2X3ByaXZhdGUpKTsKKworI2lmZGVmIF9fbWM2ODAwMF9fCisJY2FjaGVfcHVzaCh2aXJ0X3RvX3BoeXMoKHZvaWQgKikoZGV2LT5tZW1fc3RhcnQpKSwgNDA5Nik7CisJY2FjaGVfY2xlYXIodmlydF90b19waHlzKCh2b2lkICopKGRldi0+bWVtX3N0YXJ0KSksIDQwOTYpOworCWtlcm5lbF9zZXRfY2FjaGVtb2RlKCh2b2lkICopKGRldi0+bWVtX3N0YXJ0KSwgNDA5NiwgSU9NQVBfTk9DQUNIRV9TRVIpOworI2VuZGlmCisJbHAtPnNjYi5jb21tYW5kID0gMDsKKwlscC0+c2NiLmNtZCA9IEk1OTZfTlVMTDsKKwlscC0+c2NiLnJmZCA9IEk1OTZfTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQyOworCXJldHVybiBkZXY7CitvdXQyOgorI2lmZGVmIF9fbWM2ODAwMF9fCisJLyogWFhYIFRoaXMgYXNzdW1lcyBkZWZhdWx0IGNhY2hlIG1vZGUgdG8gYmUgSU9NQVBfRlVMTF9DQUNISU5HLAorCSAqIFhYWCB3aGljaCBtYXkgYmUgaW52YWxpZCAoQ09ORklHXzA2MF9XUklURVRIUk9VR0gpCisJICovCisJa2VybmVsX3NldF9jYWNoZW1vZGUoKHZvaWQgKikoZGV2LT5tZW1fc3RhcnQpLCA0MDk2LAorCQkJSU9NQVBfRlVMTF9DQUNISU5HKTsKKyNlbmRpZgorCWZyZWVfcGFnZSAoKHUzMikoZGV2LT5tZW1fc3RhcnQpKTsKK291dDE6CisjaWZkZWYgRU5BQkxFX0FQUklDT1QKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgSTU5Nl9UT1RBTF9TSVpFKTsKKyNlbmRpZgorb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGk1OTZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscDsKKwlzaG9ydCBpb2FkZHI7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzLCBhY2tfY21kID0gMDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKyNpZmRlZiBFTkFCTEVfQlZNRTYwMDBfTkVUCisJaWYgKE1BQ0hfSVNfQlZNRTYwMDApIHsKKwkJaWYgKCooY2hhciAqKSBCVk1FX0xPQ0FMX0lSUV9TVEFUICYgQlZNRV9FVEhFUlIpIHsKKwkJCWk1OTZfZXJyb3IoaXJxLCBkZXZfaWQsIHJlZ3MpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJfQorI2VuZGlmCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTU5Nl9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlscCA9IGRldi0+cHJpdjsKKworCXNwaW5fbG9jayAoJmxwLT5sb2NrKTsKKworCXdhaXRfY21kKGRldixscCwxMDAsImk1OTYgaW50ZXJydXB0LCB0aW1lb3V0Iik7CisJc3RhdHVzID0gbHAtPnNjYi5zdGF0dXM7CisKKwlERUIoREVCX0lOVFMscHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpNTk2IGludGVycnVwdCwgSVJRICVkLCBzdGF0dXMgJTQuNHguXG4iLAorCQkJZGV2LT5uYW1lLCBpcnEsIHN0YXR1cykpOworCisJYWNrX2NtZCA9IHN0YXR1cyAmIDB4ZjAwMDsKKworCWlmICgoc3RhdHVzICYgMHg4MDAwKSB8fCAoc3RhdHVzICYgMHgyMDAwKSkgeworCQlzdHJ1Y3QgaTU5Nl9jbWQgKnB0cjsKKworCQloYW5kbGVkID0gMTsKKwkJaWYgKChzdGF0dXMgJiAweDgwMDApKQorCQkJREVCKERFQl9JTlRTLHByaW50ayhLRVJOX0RFQlVHICIlczogaTU5NiBpbnRlcnJ1cHQgY29tcGxldGVkIGNvbW1hbmQuXG4iLCBkZXYtPm5hbWUpKTsKKwkJaWYgKChzdGF0dXMgJiAweDIwMDApKQorCQkJREVCKERFQl9JTlRTLHByaW50ayhLRVJOX0RFQlVHICIlczogaTU5NiBpbnRlcnJ1cHQgY29tbWFuZCB1bml0IGluYWN0aXZlICV4LlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMgJiAweDA3MDApKTsKKworCQl3aGlsZSAoKGxwLT5jbWRfaGVhZCAhPSBJNTk2X05VTEwpICYmIChscC0+Y21kX2hlYWQtPnN0YXR1cyAmIFNUQVRfQykpIHsKKwkJCXB0ciA9IGxwLT5jbWRfaGVhZDsKKworCQkJREVCKERFQl9TVEFUVVMscHJpbnRrKEtFUk5fREVCVUcgImNtZF9oZWFkLT5zdGF0dXMgPSAlMDR4LCAtPmNvbW1hbmQgPSAlMDR4XG4iLAorCQkJCSAgICAgICBscC0+Y21kX2hlYWQtPnN0YXR1cywgbHAtPmNtZF9oZWFkLT5jb21tYW5kKSk7CisJCQlscC0+Y21kX2hlYWQgPSBwdHItPnZfbmV4dDsKKwkJCWxwLT5jbWRfYmFja2xvZy0tOworCisJCQlzd2l0Y2ggKChwdHItPmNvbW1hbmQpICYgMHg3KSB7CisJCQljYXNlIENtZFR4OgorCQkJICAgIHsKKwkJCQlzdHJ1Y3QgdHhfY21kICp0eF9jbWQgPSAoc3RydWN0IHR4X2NtZCAqKSBwdHI7CisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4X2NtZC0+c2tiOworCisJCQkJaWYgKChwdHItPnN0YXR1cykgJiBTVEFUX09LKSB7CisJCQkJCURFQihERUJfVFhBRERSLHByaW50X2V0aChza2ItPmRhdGEsICJ0eC1kb25lIikpOworCQkJCX0gZWxzZSB7CisJCQkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQkJaWYgKChwdHItPnN0YXR1cykgJiAweDAwMjApCisJCQkJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJCQlpZiAoISgocHRyLT5zdGF0dXMpICYgMHgwMDQwKSkKKwkJCQkJCWxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCQkJCWlmICgocHRyLT5zdGF0dXMpICYgMHgwNDAwKQorCQkJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJCWlmICgocHRyLT5zdGF0dXMpICYgMHgwODAwKQorCQkJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCQkJaWYgKChwdHItPnN0YXR1cykgJiAweDEwMDApCisJCQkJCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQl9CisKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCisJCQkJdHhfY21kLT5jbWQuY29tbWFuZCA9IDA7IC8qIE1hcmsgZnJlZSAqLworCQkJCWJyZWFrOworCQkJICAgIH0KKwkJCWNhc2UgQ21kVERSOgorCQkJICAgIHsKKwkJCQl1bnNpZ25lZCBzaG9ydCBzdGF0dXMgPSAoKHN0cnVjdCB0ZHJfY21kICopcHRyKS0+c3RhdHVzOworCisJCQkJaWYgKHN0YXR1cyAmIDB4ODAwMCkgeworCQkJCQlERUIoREVCX1REUixwcmludGsoS0VSTl9JTkZPICIlczogbGluayBvay5cbiIsIGRldi0+bmFtZSkpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChzdGF0dXMgJiAweDQwMDApCisJCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUcmFuc2NlaXZlciBwcm9ibGVtLlxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJaWYgKHN0YXR1cyAmIDB4MjAwMCkKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRlcm1pbmF0aW9uIHByb2JsZW0uXG4iLCBkZXYtPm5hbWUpOworCQkJCQlpZiAoc3RhdHVzICYgMHgxMDAwKQorCQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogU2hvcnQgY2lyY3VpdC5cbiIsIGRldi0+bmFtZSk7CisKKwkJCQkJREVCKERFQl9URFIscHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRpbWUgJWQuXG4iLCBkZXYtPm5hbWUsIHN0YXR1cyAmIDB4MDdmZikpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCSAgICB9CisJCQljYXNlIENtZENvbmZpZ3VyZToKKwkJCWNhc2UgQ21kTXVsdGljYXN0TGlzdDoKKwkJCQkvKiBaYXAgY29tbWFuZCBzbyBzZXRfbXVsdGljYXN0X2xpc3QoKSBrbm93cyBpdCBpcyBmcmVlICovCisJCQkJcHRyLT5jb21tYW5kID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXB0ci0+dl9uZXh0ID0gcHRyLT5iX25leHQgPSBJNTk2X05VTEw7CisJCQlscC0+bGFzdF9jbWQgPSBqaWZmaWVzOworCQl9CisKKwkJcHRyID0gbHAtPmNtZF9oZWFkOworCQl3aGlsZSAoKHB0ciAhPSBJNTk2X05VTEwpICYmIChwdHIgIT0gbHAtPmNtZF90YWlsKSkgeworCQkJcHRyLT5jb21tYW5kICY9IDB4MWZmZjsKKwkJCXB0ciA9IHB0ci0+dl9uZXh0OworCQl9CisKKwkJaWYgKChscC0+Y21kX2hlYWQgIT0gSTU5Nl9OVUxMKSkKKwkJCWFja19jbWQgfD0gQ1VDX1NUQVJUOworCQlscC0+c2NiLmNtZCA9IFdTV0FQY21kKHZpcnRfdG9fYnVzKCZscC0+Y21kX2hlYWQtPnN0YXR1cykpOworCX0KKwlpZiAoKHN0YXR1cyAmIDB4MTAwMCkgfHwgKHN0YXR1cyAmIDB4NDAwMCkpIHsKKwkJaWYgKChzdGF0dXMgJiAweDQwMDApKQorCQkJREVCKERFQl9JTlRTLHByaW50ayhLRVJOX0RFQlVHICIlczogaTU5NiBpbnRlcnJ1cHQgcmVjZWl2ZWQgYSBmcmFtZS5cbiIsIGRldi0+bmFtZSkpOworCQlpNTk2X3J4KGRldik7CisJCS8qIE9ubHkgUlhfU1RBUlQgaWYgc3RvcHBlZCAtIFJHSCAwNy0wNy05NiAqLworCQlpZiAoc3RhdHVzICYgMHgxMDAwKSB7CisJCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCQkJREVCKERFQl9FUlJPUlMscHJpbnRrKEtFUk5fRVJSICIlczogaTU5NiBpbnRlcnJ1cHQgcmVjZWl2ZSB1bml0IGluYWN0aXZlLCBzdGF0dXMgMHgleFxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpKTsKKwkJCQlhY2tfY21kIHw9IFJYX1NUQVJUOworCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQlyZWJ1aWxkX3J4X2J1ZnMoZGV2KTsKKwkJCX0KKwkJfQorCX0KKwl3YWl0X2NtZChkZXYsbHAsMTAwLCJpNTk2IGludGVycnVwdCwgdGltZW91dCIpOworCWxwLT5zY2IuY29tbWFuZCA9IGFja19jbWQ7CisKKyNpZmRlZiBFTkFCTEVfTVZNRTE2eF9ORVQKKwlpZiAoTUFDSF9JU19NVk1FMTZ4KSB7CisJCS8qIEFjayB0aGUgaW50ZXJydXB0ICovCisKKwkJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqcGNjMiA9ICh1bnNpZ25lZCBjaGFyICopIDB4ZmZmNDIwMDA7CisKKwkJcGNjMlsweDJhXSB8PSAweDA4OworCX0KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9CVk1FNjAwMF9ORVQKKwlpZiAoTUFDSF9JU19CVk1FNjAwMCkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpldGhpcnEgPSAodW5zaWduZWQgY2hhciAqKSBCVk1FX0VUSElSUV9SRUc7CisKKwkJKmV0aGlycSA9IDE7CisJCSpldGhpcnEgPSAzOworCX0KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9BUFJJQ09UCisJKHZvaWQpIGluYihpb2FkZHIgKyAweDEwKTsKKwlvdXRiKDQsIGlvYWRkciArIDB4Zik7CisjZW5kaWYKKwlDQShkZXYpOworCisJREVCKERFQl9JTlRTLHByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQuXG4iLCBkZXYtPm5hbWUpKTsKKworCXNwaW5fdW5sb2NrICgmbHAtPmxvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgaW50IGk1OTZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJREVCKERFQl9JTklULHByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgJTQuNHguXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBscC0+c2NiLnN0YXR1cykpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwl3YWl0X2NtZChkZXYsbHAsMTAwLCJjbG9zZTEgdGltZWQgb3V0Iik7CisJbHAtPnNjYi5jb21tYW5kID0gQ1VDX0FCT1JUIHwgUlhfQUJPUlQ7CisJQ0EoZGV2KTsKKworCXdhaXRfY21kKGRldixscCwxMDAsImNsb3NlMiB0aW1lZCBvdXQiKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJREVCKERFQl9TVFJVQ1QsaTU5Nl9kaXNwbGF5X2RhdGEoZGV2KSk7CisJaTU5Nl9jbGVhbnVwX2NtZChkZXYsbHApOworCisjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwY2MyID0gKHVuc2lnbmVkIGNoYXIgKikgMHhmZmY0MjAwMDsKKworCQkvKiBEaXNhYmxlIGFsbCBpbnRzICovCisJCXBjYzJbMHgyOF0gPSAxOworCQlwY2MyWzB4MmFdID0gMHg0MDsKKwkJcGNjMlsweDJiXSA9IDB4NDA7CS8qIFNldCBzbm9vcGluZyBiaXRzIG5vdyEgKi8KKwl9CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfQlZNRTYwMDBfTkVUCisJaWYgKE1BQ0hfSVNfQlZNRTYwMDApIHsKKwkJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqZXRoaXJxID0gKHVuc2lnbmVkIGNoYXIgKikgQlZNRV9FVEhJUlFfUkVHOworCisJCSpldGhpcnEgPSAxOworCX0KKyNlbmRpZgorCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVtb3ZlX3J4X2J1ZnMoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorIGk1OTZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyoKKyAqICAgIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICovCisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCWludCBjb25maWcgPSAwLCBjbnQ7CisKKwlERUIoREVCX01VTFRJLHByaW50ayhLRVJOX0RFQlVHICIlczogc2V0IG11bHRpY2FzdCBsaXN0LCAlZCBlbnRyaWVzLCBwcm9taXNjICVzLCBhbGxtdWx0aSAlc1xuIiwKKwkJZGV2LT5uYW1lLCBkZXYtPm1jX2NvdW50LAorCQlkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgID8gIk9OIiA6ICJPRkYiLAorCQlkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJID8gIk9OIiA6ICJPRkYiKSk7CisKKwlpZiAod2FpdF9jZmcoZGV2LCAmbHAtPmNmX2NtZC5jbWQsIDEwMDAsICJjb25maWcgY2hhbmdlIHJlcXVlc3QgdGltZWQgb3V0IikpCisJCXJldHVybjsKKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSAmJiAhKGxwLT5jZl9jbWQuaTU5Nl9jb25maWdbOF0gJiAweDAxKSkgeworCQlscC0+Y2ZfY21kLmk1OTZfY29uZmlnWzhdIHw9IDB4MDE7CisJCWNvbmZpZyA9IDE7CisJfQorCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgJiYgKGxwLT5jZl9jbWQuaTU5Nl9jb25maWdbOF0gJiAweDAxKSkgeworCQlscC0+Y2ZfY21kLmk1OTZfY29uZmlnWzhdICY9IH4weDAxOworCQljb25maWcgPSAxOworCX0KKwlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpICYmIChscC0+Y2ZfY21kLmk1OTZfY29uZmlnWzExXSAmIDB4MjApKSB7CisJCWxwLT5jZl9jbWQuaTU5Nl9jb25maWdbMTFdICY9IH4weDIwOworCQljb25maWcgPSAxOworCX0KKwlpZiAoIShkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSAmJiAhKGxwLT5jZl9jbWQuaTU5Nl9jb25maWdbMTFdICYgMHgyMCkpIHsKKwkJbHAtPmNmX2NtZC5pNTk2X2NvbmZpZ1sxMV0gfD0gMHgyMDsKKwkJY29uZmlnID0gMTsKKwl9CisJaWYgKGNvbmZpZykgeworCQlscC0+Y2ZfY21kLmNtZC5jb21tYW5kID0gQ21kQ29uZmlndXJlOworCQlpNTk2X2FkZF9jbWQoZGV2LCAmbHAtPmNmX2NtZC5jbWQpOworCX0KKworCWNudCA9IGRldi0+bWNfY291bnQ7CisJaWYgKGNudCA+IE1BWF9NQ19DTlQpCisJeworCQljbnQgPSBNQVhfTUNfQ05UOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPbmx5ICVkIG11bHRpY2FzdCBhZGRyZXNzZXMgc3VwcG9ydGVkIiwKKwkJCWRldi0+bmFtZSwgY250KTsKKwl9CisJCisJaWYgKGRldi0+bWNfY291bnQgPiAwKSB7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCQl1bnNpZ25lZCBjaGFyICpjcDsKKwkJc3RydWN0IG1jX2NtZCAqY21kOworCisJCWlmICh3YWl0X2NmZyhkZXYsICZscC0+bWNfY21kLmNtZCwgMTAwMCwgIm11bHRpY2FzdCBsaXN0IGNoYW5nZSByZXF1ZXN0IHRpbWVkIG91dCIpKQorCQkJcmV0dXJuOworCQljbWQgPSAmbHAtPm1jX2NtZDsKKwkJY21kLT5jbWQuY29tbWFuZCA9IENtZE11bHRpY2FzdExpc3Q7CisJCWNtZC0+bWNfY250ID0gZGV2LT5tY19jb3VudCAqIDY7CisJCWNwID0gY21kLT5tY19hZGRyczsKKwkJZm9yIChkbWkgPSBkZXYtPm1jX2xpc3Q7IGNudCAmJiBkbWkgIT0gTlVMTDsgZG1pID0gZG1pLT5uZXh0LCBjbnQtLSwgY3AgKz0gNikgeworCQkJbWVtY3B5KGNwLCBkbWktPmRtaV9hZGRyLCA2KTsKKwkJCWlmIChpNTk2X2RlYnVnID4gMSkKKwkJCQlERUIoREVCX01VTFRJLHByaW50ayhLRVJOX0lORk8gIiVzOiBBZGRpbmcgYWRkcmVzcyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCWRldi0+bmFtZSwgY3BbMF0sY3BbMV0sY3BbMl0sY3BbM10sY3BbNF0sY3BbNV0pKTsKKwkJfQorCQlpNTk2X2FkZF9jbWQoZGV2LCAmY21kLT5jbWQpOworCX0KK30KKworI2lmZGVmIE1PRFVMRQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfODI1OTY7CisKKyNpZmRlZiBFTkFCTEVfQVBSSUNPVAorbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiQXByaWNvdCBJUlEgbnVtYmVyIik7CisjZW5kaWYKKworc3RhdGljIGludCBkZWJ1ZyA9IC0xOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImk4MjU5NiBkZWJ1ZyBtYXNrIik7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWlmIChkZWJ1ZyA+PSAwKQorCQlpNTk2X2RlYnVnID0gZGVidWc7CisJZGV2XzgyNTk2ID0gaTgyNTk2X3Byb2JlKC0xKTsKKwlpZiAoSVNfRVJSKGRldl84MjU5NikpCisJCXJldHVybiBQVFJfRVJSKGRldl84MjU5Nik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfODI1OTYpOworI2lmZGVmIF9fbWM2ODAwMF9fCisJLyogWFhYIFRoaXMgYXNzdW1lcyBkZWZhdWx0IGNhY2hlIG1vZGUgdG8gYmUgSU9NQVBfRlVMTF9DQUNISU5HLAorCSAqIFhYWCB3aGljaCBtYXkgYmUgaW52YWxpZCAoQ09ORklHXzA2MF9XUklURVRIUk9VR0gpCisJICovCisKKwlrZXJuZWxfc2V0X2NhY2hlbW9kZSgodm9pZCAqKShkZXZfODI1OTYtPm1lbV9zdGFydCksIDQwOTYsCisJCQlJT01BUF9GVUxMX0NBQ0hJTkcpOworI2VuZGlmCisJZnJlZV9wYWdlICgodTMyKShkZXZfODI1OTYtPm1lbV9zdGFydCkpOworI2lmZGVmIEVOQUJMRV9BUFJJQ09UCisJLyogSWYgd2UgZG9uJ3QgZG8gdGhpcywgd2UgY2FuJ3QgcmUtaW5zbW9kIGl0IGxhdGVyLiAqLworCXJlbGVhc2VfcmVnaW9uKGRldl84MjU5Ni0+YmFzZV9hZGRyLCBJNTk2X1RPVEFMX1NJWkUpOworI2VuZGlmCisJZnJlZV9uZXRkZXYoZGV2XzgyNTk2KTsKK30KKworI2VuZGlmCQkJCS8qIE1PRFVMRSAqLworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX0tFUk5FTF9fIC1JL3Vzci9zcmMvbGludXgvbmV0L2luZXQgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLW00ODYgLWMgODI1OTYuYyIKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODM5MC5jIGIvZHJpdmVycy9uZXQvODM5MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYjE2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC84MzkwLmMKQEAgLTAsMCArMSwxMTMwIEBACisvKiA4MzkwLmM6IEEgZ2VuZXJhbCBOUzgzOTAgZXRoZXJuZXQgZHJpdmVyIGNvcmUgZm9yIGxpbnV4LiAqLworLyoKKwlXcml0dGVuIDE5OTItOTQgYnkgRG9uYWxkIEJlY2tlci4KKyAgCisJQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworICAKKyAgVGhpcyBpcyB0aGUgY2hpcC1zcGVjaWZpYyBjb2RlIGZvciBtYW55IDgzOTAtYmFzZWQgZXRoZXJuZXQgYWRhcHRvcnMuCisgIFRoaXMgaXMgbm90IGEgY29tcGxldGUgZHJpdmVyLCBpdCBtdXN0IGJlIGNvbWJpbmVkIHdpdGggYm9hcmQtc3BlY2lmaWMKKyAgY29kZSBzdWNoIGFzIG5lLmMsIHdkLmMsIDNjNTAzLmMsIGV0Yy4KKworICBTZWVpbmcgaG93IGF0IGxlYXN0IGVpZ2h0IGRyaXZlcnMgdXNlIHRoaXMgY29kZSwgKG5vdCBjb3VudGluZyB0aGUKKyAgUENNQ0lBIG9uZXMgZWl0aGVyKSBpdCBpcyBlYXN5IHRvIGJyZWFrIHNvbWUgY2FyZCBieSB3aGF0IHNlZW1zIGxpa2UKKyAgYSBzaW1wbGUgaW5ub2NlbnQgY2hhbmdlLiBQbGVhc2UgY29udGFjdCBtZSBvciBEb25hbGQgaWYgeW91IHRoaW5rCisgIHlvdSBoYXZlIGZvdW5kIHNvbWV0aGluZyB0aGF0IG5lZWRzIGNoYW5naW5nLiAtLSBQRworCisKKyAgQ2hhbmdlbG9nOgorCisgIFBhdWwgR29ydG1ha2VyCTogcmVtb3ZlIHNldF9iaXQgbG9jaywgb3RoZXIgY2xlYW51cHMuCisgIFBhdWwgR29ydG1ha2VyCTogYWRkIGVpX2dldF84MzkwX2hkcigpIHNvIHdlIGNhbiBwYXNzIHNrYidzIHRvIAorCQkJICBlaV9ibG9ja19pbnB1dCgpIGZvciBldGhfaW9fY29weV9hbmRfc3VtKCkuCisgIFBhdWwgR29ydG1ha2VyCTogZXhjaGFuZ2Ugc3RhdGljIGludCBlaV9waW5ncG9uZyBmb3IgYSAjZGVmaW5lLAorCQkJICBhbHNvIGFkZCBiZXR0ZXIgVHggZXJyb3IgaGFuZGxpbmcuCisgIFBhdWwgR29ydG1ha2VyCTogcmV3cml0ZSBSeCBvdmVycnVuIGhhbmRsaW5nIGFzIHBlciBOUyBzcGVjcy4KKyAgQWxleGV5IEt1em5ldHNvdgk6IHVzZSB0aGUgODM5MCdzIHNpeCBiaXQgaGFzaCBtdWx0aWNhc3QgZmlsdGVyLgorICBQYXVsIEdvcnRtYWtlcgk6IHR3ZWFrIEFOSydzIGFib3ZlIG11bHRpY2FzdCBjaGFuZ2VzIGEgYml0LgorICBQYXVsIEdvcnRtYWtlcgk6IHVwZGF0ZSBwYWNrZXQgc3RhdGlzdGljcyBmb3IgdjIuMS54CisgIEFsYW4gQ294CQk6IHN1cHBvcnQgYXJiaXRhcnkgc3R1cGlkIHBvcnQgbWFwcGluZ3Mgb24gdGhlCisgIAkJCSAgNjhLIE1hY2ludG9zaC4gU3VwcG9ydCA+MTZiaXQgSS9PIHNwYWNlcworICBQYXVsIEdvcnRtYWtlcgk6IGFkZCBrbW9kIHN1cHBvcnQgZm9yIGF1dG8tbG9hZGluZyBvZiB0aGUgODM5MAorCQkJICBtb2R1bGUgYnkgYWxsIGRyaXZlcnMgdGhhdCByZXF1aXJlIGl0LgorICBBbGFuIENveAkJOiBTcGlubG9ja2luZyB3b3JrLCBhZGRlZCAnQlVHXzgzQzY5MCcKKyAgUGF1bCBHb3J0bWFrZXIJOiBTZXBhcmF0ZSBvdXQgVHggdGltZW91dCBjb2RlIGZyb20gVHggcGF0aC4KKyAgUGF1bCBHb3J0bWFrZXIJOiBSZW1vdmUgb2xkIHVudXNlZCBzaW5nbGUgVHggYnVmZmVyIGNvZGUuCisgIEhheWF0byBGdWppd2FyYQk6IEFkZCBtMzJyIHN1cHBvcnQuCisgIFBhdWwgR29ydG1ha2VyCTogdXNlIHNrYl9wYWR0bygpIGluc3RlYWQgb2Ygc3RhY2sgc2NyYXRjaCBhcmVhCisKKyAgU291cmNlczoKKyAgVGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTEFOIERhdGFib29rLCBhbmQgdGhlIDNDb20gM2M1MDMgZGF0YWJvb2suCisKKyAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKyAgICAiODM5MC5jOnYxLjEwY3ZzIDkvMjMvOTQgRG9uYWxkIEJlY2tlciAoYmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292KVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisjZGVmaW5lIE5TODM5MF9DT1JFCisjaW5jbHVkZSAiODM5MC5oIgorCisjZGVmaW5lIEJVR184M0M2OTAKKworLyogVGhlc2UgYXJlIHRoZSBvcGVyYXRpb25hbCBmdW5jdGlvbiBpbnRlcmZhY2VzIHRvIGJvYXJkLXNwZWNpZmljCisgICByb3V0aW5lcy4KKwl2b2lkIHJlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKwkJUmVzZXRzIHRoZSBib2FyZCBhc3NvY2lhdGVkIHdpdGggREVWLCBpbmNsdWRpbmcgYSBoYXJkd2FyZSByZXNldCBvZgorCQl0aGUgODM5MC4gIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHRyYW5zbWl0IHRpbWVvdXQsIGFuZAorCQlpdCBpcyBhbHdheXMgZm9sbG93ZWQgYnkgODM5MF9pbml0KCkuCisJdm9pZCBibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJCSAgaW50IHN0YXJ0X3BhZ2UpCisJCVdyaXRlIHRoZSBDT1VOVCBieXRlcyBvZiBCVUYgdG8gdGhlIHBhY2tldCBidWZmZXIgYXQgU1RBUlRfUEFHRS4gIFRoZQorCQkicGFnZSIgdmFsdWUgdXNlcyB0aGUgODM5MCdzIDI1Ni1ieXRlIHBhZ2VzLgorCXZvaWQgZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKKwkJUmVhZCB0aGUgNCBieXRlLCBwYWdlIGFsaWduZWQgODM5MCBoZWFkZXIuICpJZiogdGhlcmUgaXMgYQorCQlzdWJzZXF1ZW50IHJlYWQsIGl0IHdpbGwgYmUgb2YgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldC4KKwl2b2lkIGJsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQorCQlSZWFkIENPVU5UIGJ5dGVzIGZyb20gdGhlIHBhY2tldCBidWZmZXIgaW50byB0aGUgc2tiIGRhdGEgYXJlYS4gU3RhcnQgCisJCXJlYWRpbmcgZnJvbSBSSU5HX09GRlNFVCwgdGhlIGFkZHJlc3MgYXMgdGhlIDgzOTAgc2VlcyBpdC4gIFRoaXMgd2lsbCBhbHdheXMKKwkJZm9sbG93IHRoZSByZWFkIG9mIHRoZSA4MzkwIGhlYWRlci4gCisqLworI2RlZmluZSBlaV9yZXNldF84MzkwIChlaV9sb2NhbC0+cmVzZXRfODM5MCkKKyNkZWZpbmUgZWlfYmxvY2tfb3V0cHV0IChlaV9sb2NhbC0+YmxvY2tfb3V0cHV0KQorI2RlZmluZSBlaV9ibG9ja19pbnB1dCAoZWlfbG9jYWwtPmJsb2NrX2lucHV0KQorI2RlZmluZSBlaV9nZXRfODM5MF9oZHIgKGVpX2xvY2FsLT5nZXRfODM5MF9oZHIpCisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLworI2lmbmRlZiBlaV9kZWJ1ZworaW50IGVpX2RlYnVnID0gMTsKKyNlbmRpZgorCisvKiBJbmRleCB0byBmdW5jdGlvbnMuICovCitzdGF0aWMgdm9pZCBlaV90eF9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWlfdHhfZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWlfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVpX3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlaV9yeF9vdmVycnVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBSb3V0aW5lcyBnZW5lcmljIHRvIE5TODM5MC1iYXNlZCBib2FyZHMuICovCitzdGF0aWMgdm9pZCBOUzgzOTBfdHJpZ2dlcl9zZW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBsZW5ndGgsCisJCQkJCQkJCWludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRvX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoKKyAqCVNNUCBhbmQgdGhlIDgzOTAgc2V0dXAuCisgKgorICoJVGhlIDgzOTAgaXNudCBleGFjdGx5IGRlc2lnbmVkIHRvIGJlIG11bHRpdGhyZWFkZWQgb24gUlgvVFguIFRoZXJlIGlzCisgKglhIHBhZ2UgcmVnaXN0ZXIgdGhhdCBjb250cm9scyBiYW5rIGFuZCBwYWNrZXQgYnVmZmVyIGFjY2Vzcy4gV2UgZ3VhcmQKKyAqCXRoaXMgd2l0aCBlaV9sb2NhbC0+cGFnZV9sb2NrLiBOb2JvZHkgc2hvdWxkIGFzc3VtZSBvciBzZXQgdGhlIHBhZ2Ugb3RoZXIKKyAqCXRoYW4gemVybyB3aGVuIHRoZSBsb2NrIGlzIG5vdCBoZWxkLiBMb2NrIGhvbGRlcnMgbXVzdCByZXN0b3JlIHBhZ2UgMAorICoJYmVmb3JlIHVubG9ja2luZy4gRXZlbiBwdXJlIHJlYWRlcnMgbXVzdCB0YWtlIHRoZSBsb2NrIHRvIHByb3RlY3QgaW4gCisgKglwYWdlIDAuCisgKgorICoJVG8gbWFrZSBsaWZlIGRpZmZpY3VsdCB0aGUgY2hpcCBjYW4gYWxzbyBiZSB2ZXJ5IHNsb3cuIFdlIHRoZXJlZm9yZSBjYW4ndAorICoJanVzdCB1c2Ugc3BpbmxvY2tzLiBGb3IgdGhlIGxvbmdlciBsb2NrdXBzIHdlIGRpc2FibGUgdGhlIGlycSB0aGUgZGV2aWNlCisgKglzaXRzIG9uIGFuZCBob2xkIHRoZSBsb2NrLiBXZSBtdXN0IGhvbGQgdGhlIGxvY2sgYmVjYXVzZSB0aGVyZSBpcyBhIGR1YWwKKyAqCXByb2Nlc3NvciBjYXNlIG90aGVyIHRoYW4gaW50ZXJydXB0cyAoZ2V0IHN0YXRzL3NldCBtdWx0aWNhc3QgbGlzdCBpbgorICoJcGFyYWxsZWwgd2l0aCBlYWNoIG90aGVyIGFuZCB0cmFuc21pdCkuCisgKgorICoJTm90ZTogaW4gdGhlb3J5IHdlIGNhbiBqdXN0IGRpc2FibGUgdGhlIGlycSBvbiB0aGUgY2FyZCBfYnV0XyB0aGVyZSBpcworICoJYSBsYXRlbmN5IG9uIFNNUCBpcnEgZGVsaXZlcnkuIFNvIHdlIGNhbiBlYXNpbHkgZ28gImRpc2FibGUgaXJxIiAic3luYyBpcnFzIgorICoJZW50ZXIgbG9jaywgdGFrZSB0aGUgcXVldWVkIGlycS4gU28gd2Ugd2FkZGxlIGluc3RlYWQgb2YgZmx5aW5nLgorICoKKyAqCUZpbmFsbHkgYnkgc3BlY2lhbCBhcnJhbmdlbWVudCBmb3IgdGhlIHB1cnBvc2Ugb2YgYmVpbmcgZ2VuZXJhbGx5IAorICoJYW5ub3lpbmcgdGhlIHRyYW5zbWl0IGZ1bmN0aW9uIGlzIGNhbGxlZCBiaCBhdG9taWMuIFRoYXQgcGxhY2VzCisgKglyZXN0cmljdGlvbnMgb24gdGhlIHVzZXIgY29udGV4dCBjYWxsZXJzIGFzIGRpc2FibGVfaXJxIHdvbid0IHNhdmUKKyAqCXRoZW0uCisgKi8KKyAKKworDAorLyoqCisgKiBlaV9vcGVuIC0gT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4KKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHRvIGluaXRpYWxpemUKKyAqCisgKiBUaGlzIHJvdXRpbmUgZ29lcyBhbGwtb3V0LCBzZXR0aW5nIGV2ZXJ5dGhpbmcKKyAqIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuIHRob3VnaCBtYW55IG9mIHRoZXNlIHJlZ2lzdGVycyBzaG91bGQgb25seQorICogbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LgorICovCitpbnQgZWlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogVGhlIGNhcmQgSS9PIHBhcnQgb2YgdGhlIGRyaXZlciAoZS5nLiAzYzUwMykgY2FuIGhvb2sgYSBUeCB0aW1lb3V0CisJICAgIHdyYXBwZXIgdGhhdCBkb2VzIGUuZy4gbWVkaWEgY2hlY2sgJiB0aGVuIGNhbGxzIGVpX3R4X3RpbWVvdXQuICovCisJaWYgKGRldi0+dHhfdGltZW91dCA9PSBOVUxMKQorCQkgZGV2LT50eF90aW1lb3V0ID0gZWlfdHhfdGltZW91dDsKKwlpZiAoZGV2LT53YXRjaGRvZ190aW1lbyA8PSAwKQorCQkgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisgICAgCisJLyoKKwkgKglHcmFiIHRoZSBwYWdlIGxvY2sgc28gd2Ugb3duIHRoZSByZWdpc3RlciBzZXQsIHRoZW4gY2FsbAorCSAqCXRoZSBpbml0IGZ1bmN0aW9uLgorCSAqLworICAgICAgCisgICAgICAJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlOUzgzOTBfaW5pdChkZXYsIDEpOworCS8qIFNldCB0aGUgZmxhZyBiZWZvcmUgd2UgZHJvcCB0aGUgbG9jaywgVGhhdCB3YXkgdGhlIElSUSBhcnJpdmVzCisJICAgYWZ0ZXIgaXRzIHNldCBhbmQgd2UgZ2V0IG5vIHNpbGx5IHdhcm5pbmdzICovCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICAgIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CisJZWlfbG9jYWwtPmlycWxvY2sgPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqIGVpX2Nsb3NlIC0gc2h1dCBkb3duIG5ldHdvcmsgZGV2aWNlCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byBjbG9zZQorICoKKyAqIE9wcG9zaXRlIG9mIGVpX29wZW4oKS4gT25seSB1c2VkIHdoZW4gImlmY29uZmlnIDxkZXZuYW1lPiBkb3duIiBpcyBkb25lLgorICovCitpbnQgZWlfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICoJSG9sZCB0aGUgcGFnZSBsb2NrIGR1cmluZyBjbG9zZQorCSAqLworCSAJCisgICAgICAJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlOUzgzOTBfaW5pdChkZXYsIDApOworICAgICAgCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZWlfdHhfdGltZW91dCAtIGhhbmRsZSB0cmFuc21pdCB0aW1lIG91dCBjb25kaXRpb24KKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdoaWNoIGhhcyBhcHBhcmVudGx5IGZhbGxlbiBhc2xlZXAKKyAqCisgKiBDYWxsZWQgYnkga2VybmVsIHdoZW4gZGV2aWNlIG5ldmVyIGFja25vd2xlZGdlcyBhIHRyYW5zbWl0IGhhcworICogY29tcGxldGVkIChvciBmYWlsZWQpIC0gaS5lLiBuZXZlciBwb3N0ZWQgYSBUeCByZWxhdGVkIGludGVycnVwdC4KKyAqLworCit2b2lkIGVpX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJaW50IHR4c3IsIGlzciwgdGlja3Nzb2ZhciA9IGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZiBkZWZpbmVkKENPTkZJR19NMzJSKSAmJiBkZWZpbmVkKENPTkZJR19TTVApCisJdW5zaWduZWQgbG9uZyBpY3VjcjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpY3VjciA9IGlubChJQ1VDUjEpOworCWljdWNyIHw9IE0zMlJfSUNVQ1JfSVNNT0QxMTsKKwlvdXRsKGljdWNyLCBJQ1VDUjEpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyNlbmRpZgorCWVpX2xvY2FsLT5zdGF0LnR4X2Vycm9ycysrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwl0eHNyID0gaW5iKGU4MzkwX2Jhc2UrRU4wX1RTUik7CisJaXNyID0gaW5iKGU4MzkwX2Jhc2UrRU4wX0lTUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeCB0aW1lZCBvdXQsICVzIFRTUj0lIzJ4LCBJU1I9JSMyeCwgdD0lZC5cbiIsCisJCWRldi0+bmFtZSwgKHR4c3IgJiBFTlRTUl9BQlQpID8gImV4Y2VzcyBjb2xsaXNpb25zLiIgOgorCQkoaXNyKSA/ICJsb3N0IGludGVycnVwdD8iIDogImNhYmxlIHByb2JsZW0/IiwgdHhzciwgaXNyLCB0aWNrc3NvZmFyKTsKKworCWlmICghaXNyICYmICFlaV9sb2NhbC0+c3RhdC50eF9wYWNrZXRzKSAKKwl7CisJCS8qIFRoZSA4MzkwIHByb2JhYmx5IGhhc24ndCBnb3R0ZW4gb24gdGhlIGNhYmxlIHlldC4gKi8KKwkJZWlfbG9jYWwtPmludGVyZmFjZV9udW0gXj0gMTsgICAvKiBUcnkgYSBkaWZmZXJlbnQgeGN2ci4gICovCisJfQorCisJLyogVWdseSBidXQgYSByZXNldCBjYW4gYmUgc2xvdywgeWV0IG11c3QgYmUgcHJvdGVjdGVkICovCisJCQorCWRpc2FibGVfaXJxX25vc3luYyhkZXYtPmlycSk7CisJc3Bpbl9sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwkJCisJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGNhcmQuICBQZXJoYXBzIHRoZSB1c2VyIGhhcyBmaXhlZCBzb21ldGhpbmcuICovCisJZWlfcmVzZXRfODM5MChkZXYpOworCU5TODM5MF9pbml0KGRldiwgMSk7CisJCQorCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisgICAgCisvKioKKyAqIGVpX3N0YXJ0X3htaXQgLSBiZWdpbiBwYWNrZXQgdHJhbnNtaXNzaW9uCisgKiBAc2tiOiBwYWNrZXQgdG8gYmUgc2VudAorICogQGRldjogbmV0d29yayBkZXZpY2UgdG8gd2hpY2ggcGFja2V0IGlzIHNlbnQKKyAqCisgKiBTZW5kcyBhIHBhY2tldCB0byBhbiA4MzkwIG5ldHdvcmsgZGV2aWNlLgorICovCisgCitzdGF0aWMgaW50IGVpX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJaW50IHNlbmRfbGVuZ3RoID0gc2tiLT5sZW4sIG91dHB1dF9wYWdlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQlzZW5kX2xlbmd0aCA9IEVUSF9aTEVOOworCX0KKworCS8qIE1hc2sgaW50ZXJydXB0cyBmcm9tIHRoZSBldGhlcmNhcmQuIAorCSAgIFNNUDogV2UgaGF2ZSB0byBncmFiIHRoZSBsb2NrIGhlcmUgb3RoZXJ3aXNlIHRoZSBJUlEgaGFuZGxlcgorCSAgIG9uIGFub3RoZXIgQ1BVIGNhbiBmbGlwIHdpbmRvdyBhbmQgcmFjZSB0aGUgSVJRIG1hc2sgc2V0LiBXZSBlbmQKKwkgICB1cCB0cmFzaGluZyB0aGUgbWNhc3QgZmlsdGVyIG5vdCBkaXNhYmxpbmcgaXJxcyBpZiB3ZSBkb24ndCBsb2NrICovCisJICAgCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlvdXRiX3AoMHgwMCwgZTgzOTBfYmFzZSArIEVOMF9JTVIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwkKKwkKKwkvKgorCSAqCVNsb3cgcGhhc2Ugd2l0aCBsb2NrIGhlbGQuCisJICovCisJIAorCWRpc2FibGVfaXJxX25vc3luYyhkZXYtPmlycSk7CisJCisJc3Bpbl9sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwkKKwllaV9sb2NhbC0+aXJxbG9jayA9IDE7CisKKwkvKgorCSAqIFdlIGhhdmUgdHdvIFR4IHNsb3RzIGF2YWlsYWJsZSBmb3IgdXNlLiBGaW5kIHRoZSBmaXJzdCBmcmVlCisJICogc2xvdCwgYW5kIHRoZW4gcGVyZm9ybSBzb21lIHNhbml0eSBjaGVja3MuIFdpdGggdHdvIFR4IGJ1ZnMsCisJICogeW91IGdldCB2ZXJ5IGNsb3NlIHRvIHRyYW5zbWl0dGluZyBiYWNrLXRvLWJhY2sgcGFja2V0cy4gV2l0aAorCSAqIG9ubHkgb25lIFR4IGJ1ZiwgdGhlIHRyYW5zbWl0dGVyIHNpdHMgaWRsZSB3aGlsZSB5b3UgcmVsb2FkIHRoZQorCSAqIGNhcmQsIGxlYXZpbmcgYSBzdWJzdGFudGlhbCBnYXAgYmV0d2VlbiBlYWNoIHRyYW5zbWl0dGVkIHBhY2tldC4KKwkgKi8KKworCWlmIChlaV9sb2NhbC0+dHgxID09IDApIAorCXsKKwkJb3V0cHV0X3BhZ2UgPSBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZTsKKwkJZWlfbG9jYWwtPnR4MSA9IHNlbmRfbGVuZ3RoOworCQlpZiAoZWlfZGVidWcgICYmICBlaV9sb2NhbC0+dHgyID4gMCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogaWRsZSB0cmFuc21pdHRlciB0eDI9JWQsIGxhc3R0eD0lZCwgdHhpbmc9JWQuXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MiwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4aW5nKTsKKwl9CisJZWxzZSBpZiAoZWlfbG9jYWwtPnR4MiA9PSAwKSAKKwl7CisJCW91dHB1dF9wYWdlID0gZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UgKyBUWF9QQUdFUy8yOworCQllaV9sb2NhbC0+dHgyID0gc2VuZF9sZW5ndGg7CisJCWlmIChlaV9kZWJ1ZyAgJiYgIGVpX2xvY2FsLT50eDEgPiAwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpZGxlIHRyYW5zbWl0dGVyLCB0eDE9JWQsIGxhc3R0eD0lZCwgdHhpbmc9JWQuXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MSwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4aW5nKTsKKwl9CisJZWxzZQorCXsJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLiAqLworCQlpZiAoZWlfZGVidWcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5vIFR4IGJ1ZmZlcnMgZnJlZSEgdHgxPSVkIHR4Mj0lZCBsYXN0PSVkXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MSwgZWlfbG9jYWwtPnR4MiwgZWlfbG9jYWwtPmxhc3R0eCk7CisJCWVpX2xvY2FsLT5pcnFsb2NrID0gMDsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlvdXRiX3AoRU5JU1JfQUxMLCBlODM5MF9iYXNlICsgRU4wX0lNUik7CisJCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwkJZW5hYmxlX2lycShkZXYtPmlycSk7CisJCWVpX2xvY2FsLT5zdGF0LnR4X2Vycm9ycysrOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIE9rYXksIG5vdyB1cGxvYWQgdGhlIHBhY2tldCBhbmQgdHJpZ2dlciBhIHNlbmQgaWYgdGhlIHRyYW5zbWl0dGVyCisJICogaXNuJ3QgYWxyZWFkeSBzZW5kaW5nLiBJZiBpdCBpcyBidXN5LCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbAorCSAqIHRyaWdnZXIgdGhlIHNlbmQgbGF0ZXIsIHVwb24gcmVjZWl2aW5nIGEgVHggZG9uZSBpbnRlcnJ1cHQuCisJICovCisJIAorCWVpX2Jsb2NrX291dHB1dChkZXYsIHNlbmRfbGVuZ3RoLCBza2ItPmRhdGEsIG91dHB1dF9wYWdlKTsKKwkJCisJaWYgKCEgZWlfbG9jYWwtPnR4aW5nKSAKKwl7CisJCWVpX2xvY2FsLT50eGluZyA9IDE7CisJCU5TODM5MF90cmlnZ2VyX3NlbmQoZGV2LCBzZW5kX2xlbmd0aCwgb3V0cHV0X3BhZ2UpOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJaWYgKG91dHB1dF9wYWdlID09IGVpX2xvY2FsLT50eF9zdGFydF9wYWdlKSAKKwkJeworCQkJZWlfbG9jYWwtPnR4MSA9IC0xOworCQkJZWlfbG9jYWwtPmxhc3R0eCA9IC0xOworCQl9CisJCWVsc2UgCisJCXsKKwkJCWVpX2xvY2FsLT50eDIgPSAtMTsKKwkJCWVpX2xvY2FsLT5sYXN0dHggPSAtMjsKKwkJfQorCX0KKwllbHNlIGVpX2xvY2FsLT50eHF1ZXVlKys7CisKKwlpZiAoZWlfbG9jYWwtPnR4MSAgJiYgIGVpX2xvY2FsLT50eDIpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwllbHNlCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkvKiBUdXJuIDgzOTAgaW50ZXJydXB0cyBiYWNrIG9uLiAqLworCWVpX2xvY2FsLT5pcnFsb2NrID0gMDsKKwlvdXRiX3AoRU5JU1JfQUxMLCBlODM5MF9iYXNlICsgRU4wX0lNUik7CisJCisJc3Bpbl91bmxvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKwllaV9sb2NhbC0+c3RhdC50eF9ieXRlcyArPSBzZW5kX2xlbmd0aDsKKyAgICAKKwlyZXR1cm4gMDsKK30KKwwKKy8qKgorICogZWlfaW50ZXJydXB0IC0gaGFuZGxlIHRoZSBpbnRlcnJ1cHRzIGZyb20gYW4gODM5MAorICogQGlycTogaW50ZXJydXB0IG51bWJlcgorICogQGRldl9pZDogYSBwb2ludGVyIHRvIHRoZSBuZXRfZGV2aWNlCisgKiBAcmVnczogdW51c2VkCisgKgorICogSGFuZGxlIHRoZSBldGhlciBpbnRlcmZhY2UgaW50ZXJydXB0cy4gV2UgcHVsbCBwYWNrZXRzIGZyb20KKyAqIHRoZSA4MzkwIHZpYSB0aGUgY2FyZCBzcGVjaWZpYyBmdW5jdGlvbnMgYW5kIGZpcmUgdGhlbSBhdCB0aGUgbmV0d29ya2luZworICogc3RhY2suIFdlIGFsc28gaGFuZGxlIHRyYW5zbWl0IGNvbXBsZXRpb25zIGFuZCB3YWtlIHRoZSB0cmFuc21pdCBwYXRoIGlmCisgKiBuZWNlc3NhcnkuIFdlIGFsc28gdXBkYXRlIHRoZSBjb3VudGVycyBhbmQgZG8gb3RoZXIgaG91c2VrZWVwaW5nIGFzCisgKiBuZWVkZWQuCisgKi8KKworaXJxcmV0dXJuX3QgZWlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJbG9uZyBlODM5MF9iYXNlOworCWludCBpbnRlcnJ1cHRzLCBucl9zZXJ2aWNlZCA9IDA7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWw7CisgICAgCisJaWYgKGRldiA9PSBOVUxMKSAKKwl7CisJCXByaW50ayAoIm5ldF9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisgICAgCisJZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCWVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qCisJICoJUHJvdGVjdCB0aGUgaXJxIHRlc3QgdG9vLgorCSAqLworCSAKKwlzcGluX2xvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCisJaWYgKGVpX2xvY2FsLT5pcnFsb2NrKSAKKwl7CisjaWYgMSAvKiBUaGlzIG1pZ2h0IGp1c3QgYmUgYW4gaW50ZXJydXB0IGZvciBhIFBDSSBkZXZpY2Ugc2hhcmluZyB0aGlzIGxpbmUgKi8KKwkJLyogVGhlICJpcnFsb2NrIiBjaGVjayBpcyBvbmx5IGZvciB0ZXN0aW5nLiAqLworCQlwcmludGsoZWlfbG9jYWwtPmlycWxvY2sKKwkJCSAgID8gIiVzOiBJbnRlcnJ1cHRlZCB3aGlsZSBpbnRlcnJ1cHRzIGFyZSBtYXNrZWQhIGlzcj0lIzJ4IGltcj0lIzJ4LlxuIgorCQkJICAgOiAiJXM6IFJlZW50ZXJpbmcgdGhlIGludGVycnVwdCBoYW5kbGVyISBpc3I9JSMyeCBpbXI9JSMyeC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSVNSKSwKKwkJCSAgIGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSU1SKSk7CisjZW5kaWYKKwkJc3Bpbl91bmxvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorICAgIAorCS8qIENoYW5nZSB0byBwYWdlIDAgYW5kIHJlYWQgdGhlIGludHIgc3RhdHVzIHJlZy4gKi8KKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTAsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworCWlmIChlaV9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJydXB0KGlzcj0lIzIuMngpLlxuIiwgZGV2LT5uYW1lLAorCQkJICAgaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JU1IpKTsKKyAgICAKKwkvKiAhIUFzc3VtcHRpb24hISAtLSB3ZSBzdGF5IGluIHBhZ2UgMC4JIERvbid0IGJyZWFrIHRoaXMuICovCisJd2hpbGUgKChpbnRlcnJ1cHRzID0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JU1IpKSAhPSAwCisJCSAgICYmICsrbnJfc2VydmljZWQgPCBNQVhfU0VSVklDRSkgCisJeworCQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludGVycnVwdCBmcm9tIHN0b3BwZWQgY2FyZFxuIiwgZGV2LT5uYW1lKTsKKwkJCS8qIHJtayAtIGFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHRzICovCisJCQlvdXRiX3AoaW50ZXJydXB0cywgZTgzOTBfYmFzZSArIEVOMF9JU1IpOworCQkJaW50ZXJydXB0cyA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoaW50ZXJydXB0cyAmIEVOSVNSX09WRVIpIAorCQkJZWlfcnhfb3ZlcnJ1bihkZXYpOworCQllbHNlIGlmIChpbnRlcnJ1cHRzICYgKEVOSVNSX1JYK0VOSVNSX1JYX0VSUikpIAorCQl7CisJCQkvKiBHb3QgYSBnb29kICg/KSBwYWNrZXQuICovCisJCQllaV9yZWNlaXZlKGRldik7CisJCX0KKwkJLyogUHVzaCB0aGUgbmV4dCB0by10cmFuc21pdCBwYWNrZXQgdGhyb3VnaC4gKi8KKwkJaWYgKGludGVycnVwdHMgJiBFTklTUl9UWCkKKwkJCWVpX3R4X2ludHIoZGV2KTsKKwkJZWxzZSBpZiAoaW50ZXJydXB0cyAmIEVOSVNSX1RYX0VSUikKKwkJCWVpX3R4X2VycihkZXYpOworCisJCWlmIChpbnRlcnJ1cHRzICYgRU5JU1JfQ09VTlRFUlMpIAorCQl7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9mcmFtZV9lcnJvcnMgKz0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9DT1VOVEVSMCk7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9jcmNfZXJyb3JzICAgKz0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9DT1VOVEVSMSk7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9taXNzZWRfZXJyb3JzKz0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9DT1VOVEVSMik7CisJCQlvdXRiX3AoRU5JU1JfQ09VTlRFUlMsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrIGludHIuICovCisJCX0KKwkJCisJCS8qIElnbm9yZSBhbnkgUkRDIGludGVycnVwdHMgdGhhdCBtYWtlIGl0IGJhY2sgdG8gaGVyZS4gKi8KKwkJaWYgKGludGVycnVwdHMgJiBFTklTUl9SREMpIAorCQl7CisJCQlvdXRiX3AoRU5JU1JfUkRDLCBlODM5MF9iYXNlICsgRU4wX0lTUik7CisJCX0KKworCQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworCX0KKyAgICAKKwlpZiAoaW50ZXJydXB0cyAmJiBlaV9kZWJ1ZykgCisJeworCQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworCQlpZiAobnJfc2VydmljZWQgPj0gTUFYX1NFUlZJQ0UpIAorCQl7CisJCQkvKiAweEZGIGlzIHZhbGlkIGZvciBhIGNhcmQgcmVtb3ZhbCAqLworCQkJaWYoaW50ZXJydXB0cyE9MHhGRikKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIG11Y2ggd29yayBhdCBpbnRlcnJ1cHQsIHN0YXR1cyAlIzIuMnhcbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbnRlcnJ1cHRzKTsKKwkJCW91dGJfcChFTklTUl9BTEwsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrLiBtb3N0IGludHJzLiAqLworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVua25vd24gaW50ZXJydXB0ICUjMnhcbiIsIGRldi0+bmFtZSwgaW50ZXJydXB0cyk7CisJCQlvdXRiX3AoMHhmZiwgZTgzOTBfYmFzZSArIEVOMF9JU1IpOyAvKiBBY2suIGFsbCBpbnRycy4gKi8KKwkJfQorCX0KKwlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisJcmV0dXJuIElSUV9SRVRWQUwobnJfc2VydmljZWQgPiAwKTsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCit2b2lkIGVpX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJZWlfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKKy8qKgorICogZWlfdHhfZXJyIC0gaGFuZGxlIHRyYW5zbWl0dGVyIGVycm9yCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB3aGljaCB0aHJldyB0aGUgZXhjZXB0aW9uCisgKgorICogQSB0cmFuc21pdHRlciBlcnJvciBoYXMgaGFwcGVuZWQuIE1vc3QgbGlrZWx5IGV4Y2VzcyBjb2xsaXNpb25zICh3aGljaAorICogaXMgYSBmYWlybHkgbm9ybWFsIGNvbmRpdGlvbikuIElmIHRoZSBlcnJvciBpcyBvbmUgd2hlcmUgdGhlIFR4IHdpbGwKKyAqIGhhdmUgYmVlbiBhYm9ydGVkLCB3ZSB0cnkgYW5kIHNlbmQgYW5vdGhlciBvbmUgcmlnaHQgYXdheSwgaW5zdGVhZCBvZgorICogbGV0dGluZyB0aGUgZmFpbGVkIHBhY2tldCBzaXQgYW5kIGNvbGxlY3QgZHVzdCBpbiB0aGUgVHggYnVmZmVyLiBUaGlzCisgKiBpcyBhIG11Y2ggYmV0dGVyIHNvbHV0aW9uIGFzIGl0IGF2b2lkcyBrZXJuZWwgYmFzZWQgVHggdGltZW91dHMsIGFuZAorICogYW4gdW5uZWNlc3NhcnkgY2FyZCByZXNldC4KKyAqCisgKiBDYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKworc3RhdGljIHZvaWQgZWlfdHhfZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgdHhzciA9IGluYl9wKGU4MzkwX2Jhc2UrRU4wX1RTUik7CisJdW5zaWduZWQgY2hhciB0eF93YXNfYWJvcnRlZCA9IHR4c3IgJiAoRU5UU1JfQUJUK0VOVFNSX0ZVKTsKKworI2lmZGVmIFZFUkJPU0VfRVJST1JfRFVNUAorCXByaW50ayhLRVJOX0RFQlVHICIlczogdHJhbnNtaXR0ZXIgZXJyb3IgKCUjMngpOiAiLCBkZXYtPm5hbWUsIHR4c3IpOworCWlmICh0eHNyICYgRU5UU1JfQUJUKQorCQlwcmludGsoImV4Y2Vzcy1jb2xsaXNpb25zICIpOworCWlmICh0eHNyICYgRU5UU1JfTkQpCisJCXByaW50aygibm9uLWRlZmVycmFsICIpOworCWlmICh0eHNyICYgRU5UU1JfQ1JTKQorCQlwcmludGsoImxvc3QtY2FycmllciAiKTsKKwlpZiAodHhzciAmIEVOVFNSX0ZVKQorCQlwcmludGsoIkZJRk8tdW5kZXJydW4gIik7CisJaWYgKHR4c3IgJiBFTlRTUl9DREgpCisJCXByaW50aygibG9zdC1oZWFydGJlYXQgIik7CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKwlvdXRiX3AoRU5JU1JfVFhfRVJSLCBlODM5MF9iYXNlICsgRU4wX0lTUik7IC8qIEFjayBpbnRyLiAqLworCisJaWYgKHR4X3dhc19hYm9ydGVkKQorCQllaV90eF9pbnRyKGRldik7CisJZWxzZSAKKwl7CisJCWVpX2xvY2FsLT5zdGF0LnR4X2Vycm9ycysrOworCQlpZiAodHhzciAmIEVOVFNSX0NSUykgZWlfbG9jYWwtPnN0YXQudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJaWYgKHR4c3IgJiBFTlRTUl9DREgpIGVpX2xvY2FsLT5zdGF0LnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKwkJaWYgKHR4c3IgJiBFTlRTUl9PV0MpIGVpX2xvY2FsLT5zdGF0LnR4X3dpbmRvd19lcnJvcnMrKzsKKwl9Cit9CisKKy8qKgorICogZWlfdHhfaW50ciAtIHRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSBmb3Igd2hpY2ggdHggaW50ciBpcyBoYW5kbGVkCisgKgorICogV2UgaGF2ZSBmaW5pc2hlZCBhIHRyYW5zbWl0OiBjaGVjayBmb3IgZXJyb3JzIGFuZCB0aGVuIHRyaWdnZXIgdGhlIG5leHQKKyAqIHBhY2tldCB0byBiZSBzZW50LiBDYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKworc3RhdGljIHZvaWQgZWlfdHhfaW50cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgc3RhdHVzID0gaW5iKGU4MzkwX2Jhc2UgKyBFTjBfVFNSKTsKKyAgICAKKwlvdXRiX3AoRU5JU1JfVFgsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrIGludHIuICovCisKKwkvKgorCSAqIFRoZXJlIGFyZSB0d28gVHggYnVmZmVycywgc2VlIHdoaWNoIG9uZSBmaW5pc2hlZCwgYW5kIHRyaWdnZXIKKwkgKiB0aGUgc2VuZCBvZiBhbm90aGVyIG9uZSBpZiBpdCBleGlzdHMuCisJICovCisJZWlfbG9jYWwtPnR4cXVldWUtLTsKKworCWlmIChlaV9sb2NhbC0+dHgxIDwgMCkgCisJeworCQlpZiAoZWlfbG9jYWwtPmxhc3R0eCAhPSAxICYmIGVpX2xvY2FsLT5sYXN0dHggIT0gLTEpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBib2d1cyBsYXN0X3R4X2J1ZmZlciAlZCwgdHgxPSVkLlxuIiwKKwkJCQllaV9sb2NhbC0+bmFtZSwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4MSk7CisJCWVpX2xvY2FsLT50eDEgPSAwOworCQlpZiAoZWlfbG9jYWwtPnR4MiA+IDApIAorCQl7CisJCQllaV9sb2NhbC0+dHhpbmcgPSAxOworCQkJTlM4MzkwX3RyaWdnZXJfc2VuZChkZXYsIGVpX2xvY2FsLT50eDIsIGVpX2xvY2FsLT50eF9zdGFydF9wYWdlICsgNik7CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWVpX2xvY2FsLT50eDIgPSAtMSwKKwkJCWVpX2xvY2FsLT5sYXN0dHggPSAyOworCQl9CisJCWVsc2UgZWlfbG9jYWwtPmxhc3R0eCA9IDIwLCBlaV9sb2NhbC0+dHhpbmcgPSAwOwkKKwl9CisJZWxzZSBpZiAoZWlfbG9jYWwtPnR4MiA8IDApIAorCXsKKwkJaWYgKGVpX2xvY2FsLT5sYXN0dHggIT0gMiAgJiYgIGVpX2xvY2FsLT5sYXN0dHggIT0gLTIpCisJCQlwcmludGsoIiVzOiBib2d1cyBsYXN0X3R4X2J1ZmZlciAlZCwgdHgyPSVkLlxuIiwKKwkJCQllaV9sb2NhbC0+bmFtZSwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4Mik7CisJCWVpX2xvY2FsLT50eDIgPSAwOworCQlpZiAoZWlfbG9jYWwtPnR4MSA+IDApIAorCQl7CisJCQllaV9sb2NhbC0+dHhpbmcgPSAxOworCQkJTlM4MzkwX3RyaWdnZXJfc2VuZChkZXYsIGVpX2xvY2FsLT50eDEsIGVpX2xvY2FsLT50eF9zdGFydF9wYWdlKTsKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJZWlfbG9jYWwtPnR4MSA9IC0xOworCQkJZWlfbG9jYWwtPmxhc3R0eCA9IDE7CisJCX0KKwkJZWxzZQorCQkJZWlfbG9jYWwtPmxhc3R0eCA9IDEwLCBlaV9sb2NhbC0+dHhpbmcgPSAwOworCX0KKy8vCWVsc2UgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuZXhwZWN0ZWQgVFgtZG9uZSBpbnRlcnJ1cHQsIGxhc3R0eD0lZC5cbiIsCisvLwkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPmxhc3R0eCk7CisKKwkvKiBNaW5pbWl6ZSBUeCBsYXRlbmN5OiB1cGRhdGUgdGhlIHN0YXRpc3RpY3MgYWZ0ZXIgd2UgcmVzdGFydCBUWGluZy4gKi8KKwlpZiAoc3RhdHVzICYgRU5UU1JfQ09MKQorCQllaV9sb2NhbC0+c3RhdC5jb2xsaXNpb25zKys7CisJaWYgKHN0YXR1cyAmIEVOVFNSX1BUWCkKKwkJZWlfbG9jYWwtPnN0YXQudHhfcGFja2V0cysrOworCWVsc2UgCisJeworCQllaV9sb2NhbC0+c3RhdC50eF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIEVOVFNSX0FCVCkgCisJCXsKKwkJCWVpX2xvY2FsLT5zdGF0LnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQllaV9sb2NhbC0+c3RhdC5jb2xsaXNpb25zICs9IDE2OworCQl9CisJCWlmIChzdGF0dXMgJiBFTlRTUl9DUlMpIAorCQkJZWlfbG9jYWwtPnN0YXQudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIEVOVFNSX0ZVKSAKKwkJCWVpX2xvY2FsLT5zdGF0LnR4X2ZpZm9fZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBFTlRTUl9DREgpCisJCQllaV9sb2NhbC0+c3RhdC50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBFTlRTUl9PV0MpCisJCQllaV9sb2NhbC0+c3RhdC50eF93aW5kb3dfZXJyb3JzKys7CisJfQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoqCisgKiBlaV9yZWNlaXZlIC0gcmVjZWl2ZSBzb21lIHBhY2tldHMKKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdpdGggd2hpY2ggcmVjZWl2ZSB3aWxsIGJlIHJ1bgorICoKKyAqIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLiAKKyAqIENhbGxlZCB3aXRoIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgdm9pZCBlaV9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgcnhpbmdfcGFnZSwgdGhpc19mcmFtZSwgbmV4dF9mcmFtZTsKKwl1bnNpZ25lZCBzaG9ydCBjdXJyZW50X29mZnNldDsKKwlpbnQgcnhfcGt0X2NvdW50ID0gMDsKKwlzdHJ1Y3QgZTgzOTBfcGt0X2hkciByeF9mcmFtZTsKKwlpbnQgbnVtX3J4X3BhZ2VzID0gZWlfbG9jYWwtPnN0b3BfcGFnZS1laV9sb2NhbC0+cnhfc3RhcnRfcGFnZTsKKyAgICAKKwl3aGlsZSAoKytyeF9wa3RfY291bnQgPCAxMCkgCisJeworCQlpbnQgcGt0X2xlbiwgcGt0X3N0YXQ7CisJCQorCQkvKiBHZXQgdGhlIHJ4IHBhZ2UgKGluY29taW5nIHBhY2tldCBwb2ludGVyKS4gKi8KKwkJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UxLCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKKwkJcnhpbmdfcGFnZSA9IGluYl9wKGU4MzkwX2Jhc2UgKyBFTjFfQ1VSUEFHKTsKKwkJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwLCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKKwkJCisJCS8qIFJlbW92ZSBvbmUgZnJhbWUgZnJvbSB0aGUgcmluZy4gIEJvdW5kYXJ5IGlzIGFsd2F5cyBhIHBhZ2UgYmVoaW5kLiAqLworCQl0aGlzX2ZyYW1lID0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9CT1VOREFSWSkgKyAxOworCQlpZiAodGhpc19mcmFtZSA+PSBlaV9sb2NhbC0+c3RvcF9wYWdlKQorCQkJdGhpc19mcmFtZSA9IGVpX2xvY2FsLT5yeF9zdGFydF9wYWdlOworCQkKKwkJLyogU29tZWRheSB3ZSdsbCBvbWl0IHRoZSBwcmV2aW91cywgaWZmIHdlIG5ldmVyIGdldCB0aGlzIG1lc3NhZ2UuCisJCSAgIChUaGVyZSBpcyBhdCBsZWFzdCBvbmUgY2xvbmUgY2xhaW1lZCB0byBoYXZlIGEgcHJvYmxlbS4pICAKKwkJICAgCisJCSAgIEtlZXAgcXVpZXQgaWYgaXQgbG9va3MgbGlrZSBhIGNhcmQgcmVtb3ZhbC4gT25lIHByb2JsZW0gaGVyZQorCQkgICBpcyB0aGF0IHNvbWUgY2xvbmVzIGNyYXNoIGluIHJvdWdobHkgdGhlIHNhbWUgd2F5LgorCQkgKi8KKwkJaWYgKGVpX2RlYnVnID4gMCAgJiYgIHRoaXNfZnJhbWUgIT0gZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSAmJiAodGhpc19mcmFtZSE9MHgwIHx8IHJ4aW5nX3BhZ2UhPTB4RkYpKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbWlzbWF0Y2hlZCByZWFkIHBhZ2UgcG9pbnRlcnMgJTJ4IHZzICUyeC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCB0aGlzX2ZyYW1lLCBlaV9sb2NhbC0+Y3VycmVudF9wYWdlKTsKKwkJCisJCWlmICh0aGlzX2ZyYW1lID09IHJ4aW5nX3BhZ2UpCS8qIFJlYWQgYWxsIHRoZSBmcmFtZXM/ICovCisJCQlicmVhazsJCQkJLyogRG9uZSBmb3Igbm93ICovCisJCQorCQljdXJyZW50X29mZnNldCA9IHRoaXNfZnJhbWUgPDwgODsKKwkJZWlfZ2V0XzgzOTBfaGRyKGRldiwgJnJ4X2ZyYW1lLCB0aGlzX2ZyYW1lKTsKKwkJCisJCXBrdF9sZW4gPSByeF9mcmFtZS5jb3VudCAtIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik7CisJCXBrdF9zdGF0ID0gcnhfZnJhbWUuc3RhdHVzOworCQkKKwkJbmV4dF9mcmFtZSA9IHRoaXNfZnJhbWUgKyAxICsgKChwa3RfbGVuKzQpPj44KTsKKwkJCisJCS8qIENoZWNrIGZvciBib2dvc2l0eSB3YXJuZWQgYnkgM2M1MDMgYm9vazogdGhlIHN0YXR1cyBieXRlIGlzIG5ldmVyCisJCSAgIHdyaXR0ZW4uICBUaGlzIGhhcHBlbmVkIGEgbG90IGR1cmluZyB0ZXN0aW5nISBUaGlzIGNvZGUgc2hvdWxkIGJlCisJCSAgIGNsZWFuZWQgdXAgc29tZWRheS4gKi8KKwkJaWYgKHJ4X2ZyYW1lLm5leHQgIT0gbmV4dF9mcmFtZQorCQkJJiYgcnhfZnJhbWUubmV4dCAhPSBuZXh0X2ZyYW1lICsgMQorCQkJJiYgcnhfZnJhbWUubmV4dCAhPSBuZXh0X2ZyYW1lIC0gbnVtX3J4X3BhZ2VzCisJCQkmJiByeF9mcmFtZS5uZXh0ICE9IG5leHRfZnJhbWUgKyAxIC0gbnVtX3J4X3BhZ2VzKSB7CisJCQllaV9sb2NhbC0+Y3VycmVudF9wYWdlID0gcnhpbmdfcGFnZTsKKwkJCW91dGIoZWlfbG9jYWwtPmN1cnJlbnRfcGFnZS0xLCBlODM5MF9iYXNlK0VOMF9CT1VOREFSWSk7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9lcnJvcnMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHBrdF9sZW4gPCA2MCAgfHwgIHBrdF9sZW4gPiAxNTE4KSAKKwkJeworCQkJaWYgKGVpX2RlYnVnKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYm9ndXMgcGFja2V0IHNpemU6ICVkLCBzdGF0dXM9JSMyeCBueHBnPSUjMnguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHJ4X2ZyYW1lLmNvdW50LCByeF9mcmFtZS5zdGF0dXMsCisJCQkJCSAgIHJ4X2ZyYW1lLm5leHQpOworCQkJZWlfbG9jYWwtPnN0YXQucnhfZXJyb3JzKys7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9sZW5ndGhfZXJyb3JzKys7CisJCX0KKwkJIGVsc2UgaWYgKChwa3Rfc3RhdCAmIDB4MEYpID09IEVOUlNSX1JYT0spIAorCQl7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMik7CisJCQlpZiAoc2tiID09IE5VTEwpIAorCQkJeworCQkJCWlmIChlaV9kZWJ1ZyA+IDEpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ291bGRuJ3QgYWxsb2NhdGUgYSBza19idWZmIG9mIHNpemUgJWQuXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKwkJCQllaV9sb2NhbC0+c3RhdC5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc2tiX3Jlc2VydmUoc2tiLDIpOwkvKiBJUCBoZWFkZXJzIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsJLyogTWFrZSByb29tICovCisJCQkJZWlfYmxvY2tfaW5wdXQoZGV2LCBwa3RfbGVuLCBza2IsIGN1cnJlbnRfb2Zmc2V0ICsgc2l6ZW9mKHJ4X2ZyYW1lKSk7CisJCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJZWlfbG9jYWwtPnN0YXQucnhfcGFja2V0cysrOworCQkJCWVpX2xvY2FsLT5zdGF0LnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQkJaWYgKHBrdF9zdGF0ICYgRU5SU1JfUEhZKQorCQkJCQllaV9sb2NhbC0+c3RhdC5tdWx0aWNhc3QrKzsKKwkJCX0KKwkJfSAKKwkJZWxzZSAKKwkJeworCQkJaWYgKGVpX2RlYnVnKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYm9ndXMgcGFja2V0OiBzdGF0dXM9JSMyeCBueHBnPSUjMnggc2l6ZT0lZFxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCByeF9mcmFtZS5zdGF0dXMsIHJ4X2ZyYW1lLm5leHQsCisJCQkJCSAgIHJ4X2ZyYW1lLmNvdW50KTsKKwkJCWVpX2xvY2FsLT5zdGF0LnJ4X2Vycm9ycysrOworCQkJLyogTkI6IFRoZSBOSUMgY291bnRzIENSQywgZnJhbWUgYW5kIG1pc3NlZCBlcnJvcnMuICovCisJCQlpZiAocGt0X3N0YXQgJiBFTlJTUl9GTykKKwkJCQllaV9sb2NhbC0+c3RhdC5yeF9maWZvX2Vycm9ycysrOworCQl9CisJCW5leHRfZnJhbWUgPSByeF9mcmFtZS5uZXh0OworCQkKKwkJLyogVGhpcyBfc2hvdWxkXyBuZXZlciBoYXBwZW46IGl0J3MgaGVyZSBmb3IgYXZvaWRpbmcgYmFkIGNsb25lcy4gKi8KKwkJaWYgKG5leHRfZnJhbWUgPj0gZWlfbG9jYWwtPnN0b3BfcGFnZSkgeworCQkJcHJpbnRrKCIlczogbmV4dCBmcmFtZSBpbmNvbnNpc3RlbmN5LCAlIzJ4XG4iLCBkZXYtPm5hbWUsCisJCQkJICAgbmV4dF9mcmFtZSk7CisJCQluZXh0X2ZyYW1lID0gZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2U7CisJCX0KKwkJZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSA9IG5leHRfZnJhbWU7CisJCW91dGJfcChuZXh0X2ZyYW1lLTEsIGU4MzkwX2Jhc2UrRU4wX0JPVU5EQVJZKTsKKwl9CisKKwkvKiBXZSB1c2VkIHRvIGFsc28gYWNrIEVOSVNSX09WRVIgaGVyZSwgYnV0IHRoYXQgd291bGQgc29tZXRpbWVzIG1hc2sKKwkgICBhIHJlYWwgb3ZlcnJ1biwgbGVhdmluZyB0aGUgODM5MCBpbiBhIHN0b3BwZWQgc3RhdGUgd2l0aCByZWMndnIgb2ZmLiAqLworCW91dGJfcChFTklTUl9SWCtFTklTUl9SWF9FUlIsIGU4MzkwX2Jhc2UrRU4wX0lTUik7CisJcmV0dXJuOworfQorCisvKioKKyAqIGVpX3J4X292ZXJydW4gLSBoYW5kbGUgcmVjZWl2ZXIgb3ZlcnJ1bgorICogQGRldjogbmV0d29yayBkZXZpY2Ugd2hpY2ggdGhyZXcgZXhjZXB0aW9uCisgKgorICogV2UgaGF2ZSBhIHJlY2VpdmVyIG92ZXJydW46IHdlIGhhdmUgdG8ga2ljayB0aGUgODM5MCB0byBnZXQgaXQgc3RhcnRlZAorICogYWdhaW4uIFByb2JsZW0gaXMgdGhhdCB5b3UgaGF2ZSB0byBraWNrIGl0IGV4YWN0bHkgYXMgTlMgcHJlc2NyaWJlcyBpbgorICogdGhlIHVwZGF0ZWQgZGF0YXNoZWV0cywgb3IgInRoZSBOSUMgbWF5IGFjdCBpbiBhbiB1bnByZWRpY3RhYmxlIG1hbm5lci4iCisgKiBUaGlzIGluY2x1ZGVzIGNhdXNpbmcgInRoZSBOSUMgdG8gZGVmZXIgaW5kZWZpbml0ZWx5IHdoZW4gaXQgaXMgc3RvcHBlZAorICogb24gYSBidXN5IG5ldHdvcmsuIiAgVWdoLgorICogQ2FsbGVkIHdpdGggbG9jayBoZWxkLiBEb24ndCBjYWxsIHRoaXMgd2l0aCB0aGUgaW50ZXJydXB0cyBvZmYgb3IgeW91cgorICogY29tcHV0ZXIgd2lsbCBoYXRlIHlvdSAtIGl0IHRha2VzIDEwbXMgb3Igc28uIAorICovCisKK3N0YXRpYyB2b2lkIGVpX3J4X292ZXJydW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHdhc190eGluZywgbXVzdF9yZXNlbmQgPSAwOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAKKwkvKgorCSAqIFJlY29yZCB3aGV0aGVyIGEgVHggd2FzIGluIHByb2dyZXNzIGFuZCB0aGVuIGlzc3VlIHRoZQorCSAqIHN0b3AgY29tbWFuZC4KKwkgKi8KKwl3YXNfdHhpbmcgPSBpbmJfcChlODM5MF9iYXNlK0U4MzkwX0NNRCkgJiBFODM5MF9UUkFOUzsKKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOworICAgIAorCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVjZWl2ZXIgb3ZlcnJ1bi5cbiIsIGRldi0+bmFtZSk7CisJZWlfbG9jYWwtPnN0YXQucnhfb3Zlcl9lcnJvcnMrKzsKKyAgICAKKwkvKiAKKwkgKiBXYWl0IGEgZnVsbCBUeCB0aW1lICgxLjJtcykgKyBzb21lIGd1YXJkIHRpbWUsIE5TIHNheXMgMS42bXMgdG90YWwuCisJICogRWFybHkgZGF0YXNoZWV0cyBzYWlkIHRvIHBvbGwgdGhlIHJlc2V0IGJpdCwgYnV0IG5vdyB0aGV5IHNheSB0aGF0CisJICogaXQgImlzIG5vdCBhIHJlbGlhYmxlIGluZGljYXRvciBhbmQgc3Vic2VxdWVudGx5IHNob3VsZCBiZSBpZ25vcmVkLiIKKwkgKiBXZSB3YWl0IGF0IGxlYXN0IDEwbXMuCisJICovCisKKwltZGVsYXkoMTApOworCisJLyoKKwkgKiBSZXNldCBSQkNSWzAxXSBiYWNrIHRvIHplcm8gYXMgcGVyIG1hZ2ljIGluY2FudGF0aW9uLgorCSAqLworCW91dGJfcCgweDAwLCBlODM5MF9iYXNlK0VOMF9SQ05UTE8pOworCW91dGJfcCgweDAwLCBlODM5MF9iYXNlK0VOMF9SQ05USEkpOworCisJLyoKKwkgKiBTZWUgaWYgYW55IFR4IHdhcyBpbnRlcnJ1cHRlZCBvciBub3QuIEFjY29yZGluZyB0byBOUywgdGhpcworCSAqIHN0ZXAgaXMgdml0YWwsIGFuZCBza2lwcGluZyBpdCB3aWxsIGNhdXNlIG5vIGVuZCBvZiBoYXZvYy4KKwkgKi8KKworCWlmICh3YXNfdHhpbmcpCisJeyAKKwkJdW5zaWduZWQgY2hhciB0eF9jb21wbGV0ZWQgPSBpbmJfcChlODM5MF9iYXNlK0VOMF9JU1IpICYgKEVOSVNSX1RYK0VOSVNSX1RYX0VSUik7CisJCWlmICghdHhfY29tcGxldGVkKQorCQkJbXVzdF9yZXNlbmQgPSAxOworCX0KKworCS8qCisJICogSGF2ZSB0byBlbnRlciBsb29wYmFjayBtb2RlIGFuZCB0aGVuIHJlc3RhcnQgdGhlIE5JQyBiZWZvcmUKKwkgKiB5b3UgYXJlIGFsbG93ZWQgdG8gc2x1cnAgcGFja2V0cyB1cCBvZmYgdGhlIHJpbmcuCisJICovCisJb3V0Yl9wKEU4MzkwX1RYT0ZGLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOworCW91dGJfcChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwICsgRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworCisJLyoKKwkgKiBDbGVhciB0aGUgUnggcmluZyBvZiBhbGwgdGhlIGRlYnJpcywgYW5kIGFjayB0aGUgaW50ZXJydXB0LgorCSAqLworCWVpX3JlY2VpdmUoZGV2KTsKKwlvdXRiX3AoRU5JU1JfT1ZFUiwgZTgzOTBfYmFzZStFTjBfSVNSKTsKKworCS8qCisJICogTGVhdmUgbG9vcGJhY2sgbW9kZSwgYW5kIHJlc2VuZCBhbnkgcGFja2V0IHRoYXQgZ290IHN0b3BwZWQuCisJICovCisJb3V0Yl9wKEU4MzkwX1RYQ09ORklHLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOyAKKwlpZiAobXVzdF9yZXNlbmQpCisgICAgCQlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMCArIEU4MzkwX1NUQVJUICsgRTgzOTBfVFJBTlMsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworfQorCisvKgorICoJQ29sbGVjdCB0aGUgc3RhdHMuIFRoaXMgaXMgY2FsbGVkIHVubG9ja2VkIGFuZCBmcm9tIHNldmVyYWwgY29udGV4dHMuCisgKi8KKyAKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAKKwkvKiBJZiB0aGUgY2FyZCBpcyBzdG9wcGVkLCBqdXN0IHJldHVybiB0aGUgcHJlc2VudCBzdGF0cy4gKi8KKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuICZlaV9sb2NhbC0+c3RhdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLGZsYWdzKTsKKwkvKiBSZWFkIHRoZSBjb3VudGVyIHJlZ2lzdGVycywgYXNzdW1pbmcgd2UgYXJlIGluIHBhZ2UgMC4gKi8KKwllaV9sb2NhbC0+c3RhdC5yeF9mcmFtZV9lcnJvcnMgKz0gaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIwKTsKKwllaV9sb2NhbC0+c3RhdC5yeF9jcmNfZXJyb3JzICAgKz0gaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIxKTsKKwllaV9sb2NhbC0+c3RhdC5yeF9taXNzZWRfZXJyb3JzKz0gaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CisgICAgCisJcmV0dXJuICZlaV9sb2NhbC0+c3RhdDsKK30KKworLyoKKyAqIEZvcm0gdGhlIDY0IGJpdCA4MzkwIG11bHRpY2FzdCB0YWJsZSBmcm9tIHRoZSBsaW5rZWQgbGlzdCBvZiBhZGRyZXNzZXMKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldiBzdHJ1Y3R1cmUuCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWtlX21jX2JpdHModTggKmJpdHMsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWk7CisKKwlmb3IgKGRtaT1kZXYtPm1jX2xpc3Q7IGRtaTsgZG1pPWRtaS0+bmV4dCkgCisJeworCQl1MzIgY3JjOworCQlpZiAoZG1pLT5kbWlfYWRkcmxlbiAhPSBFVEhfQUxFTikgCisJCXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIG11bHRpY2FzdCBhZGRyZXNzIGxlbmd0aCBnaXZlbi5cbiIsIGRldi0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQljcmMgPSBldGhlcl9jcmMoRVRIX0FMRU4sIGRtaS0+ZG1pX2FkZHIpOworCQkvKiAKKwkJICogVGhlIDgzOTAgdXNlcyB0aGUgNiBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlCisJCSAqIENSQyB0byBpbmRleCB0aGUgbXVsdGljYXN0IHRhYmxlLgorCQkgKi8KKwkJYml0c1tjcmM+PjI5XSB8PSAoMTw8KChjcmM+PjI2KSY3KSk7CisJfQorfQorCisvKioKKyAqIGRvX3NldF9tdWx0aWNhc3RfbGlzdCAtIHNldC9jbGVhciBtdWx0aWNhc3QgZmlsdGVyCisgKiBAZGV2OiBuZXQgZGV2aWNlIGZvciB3aGljaCBtdWx0aWNhc3QgZmlsdGVyIGlzIGFkanVzdGVkCisgKgorICoJU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuIE1heSBiZSBjYWxsZWQKKyAqCWZyb20gYSBCSCBpbiAyLjEueC4gTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuIAorICovCisgCitzdGF0aWMgdm9pZCBkb19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaTsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlKiluZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCEoZGV2LT5mbGFncyYoSUZGX1BST01JU0N8SUZGX0FMTE1VTFRJKSkpIAorCXsKKwkJbWVtc2V0KGVpX2xvY2FsLT5tY2ZpbHRlciwgMCwgOCk7CisJCWlmIChkZXYtPm1jX2xpc3QpCisJCQltYWtlX21jX2JpdHMoZWlfbG9jYWwtPm1jZmlsdGVyLCBkZXYpOworCX0KKwllbHNlCisJCW1lbXNldChlaV9sb2NhbC0+bWNmaWx0ZXIsIDB4RkYsIDgpOwkvKiBtY2FzdCBzZXQgdG8gYWNjZXB0LWFsbCAqLworCisJLyogCisJICogRFA4MzkwIG1hbnVhbHMgZG9uJ3Qgc3BlY2lmeSBhbnkgbWFnaWMgc2VxdWVuY2UgZm9yIGFsdGVyaW5nCisJICogdGhlIG11bHRpY2FzdCByZWdzIG9uIGFuIGFscmVhZHkgcnVubmluZyBjYXJkLiBUbyBiZSBzYWZlLCB3ZQorCSAqIGVuc3VyZSBtdWx0aWNhc3QgbW9kZSBpcyBvZmYgcHJpb3IgdG8gbG9hZGluZyB1cCB0aGUgbmV3IGhhc2gKKwkgKiB0YWJsZS4gSWYgdGhpcyBwcm92ZXMgdG8gYmUgbm90IGVub3VnaCwgd2UgY2FuIGFsd2F5cyByZXNvcnQKKwkgKiB0byBzdG9wcGluZyB0aGUgTklDLCBsb2FkaW5nIHRoZSB0YWJsZSBhbmQgdGhlbiByZXN0YXJ0aW5nLgorCSAqCisJICogQnVnIEFsZXJ0ISAgVGhlIE1DIHJlZ3Mgb24gdGhlIFNNQyA4M0M2OTAgKFNNQyBFbGl0ZSBhbmQgU01DIAorCSAqIEVsaXRlMTYpIGFwcGVhciB0byBiZSB3cml0ZS1vbmx5LiBUaGUgTlMgODM5MCBkYXRhIHNoZWV0IGxpc3RzCisJICogdGhlbSBhcyByL3cgc28gdGhpcyBpcyBhIGJ1Zy4gIFRoZSBTTUMgODNDNzkwIChTTUMgVWx0cmEgYW5kCisJICogVWx0cmEzMiBFSVNBKSBhcHBlYXJzIHRvIGhhdmUgdGhpcyBidWcgZml4ZWQuCisJICovCisJIAorCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCW91dGJfcChFODM5MF9SWENPTkZJRywgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsKKwlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMSwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7CisJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSAKKwl7CisJCW91dGJfcChlaV9sb2NhbC0+bWNmaWx0ZXJbaV0sIGU4MzkwX2Jhc2UgKyBFTjFfTVVMVF9TSElGVChpKSk7CisjaWZuZGVmIEJVR184M0M2OTAKKwkJaWYoaW5iX3AoZTgzOTBfYmFzZSArIEVOMV9NVUxUX1NISUZUKGkpKSE9ZWlfbG9jYWwtPm1jZmlsdGVyW2ldKQorCQkJcHJpbnRrKEtFUk5fRVJSICJNdWx0aWNhc3QgZmlsdGVyIHJlYWQvd3JpdGUgbWlzbWFwICVkXG4iLGkpOworI2VuZGlmCisJfQorCW91dGJfcChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwLCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKKworICAJaWYoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykKKyAgCQlvdXRiX3AoRTgzOTBfUlhDT05GSUcgfCAweDE4LCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOworCWVsc2UgaWYoZGV2LT5mbGFncyZJRkZfQUxMTVVMVEkgfHwgZGV2LT5tY19saXN0KQorICAJCW91dGJfcChFODM5MF9SWENPTkZJRyB8IDB4MDgsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7CisgIAllbHNlCisgIAkJb3V0Yl9wKEU4MzkwX1JYQ09ORklHLCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOworIH0KKworLyoKKyAqCUNhbGxlZCB3aXRob3V0IGxvY2sgaGVsZC4gVGhpcyBpcyBpbnZva2VkIGZyb20gdXNlciBjb250ZXh0IGFuZCBtYXkKKyAqCWJlIHBhcmFsbGVsIHRvIGp1c3QgYWJvdXQgZXZlcnl0aGluZyBlbHNlLiBJdHMgYWxzbyBmYWlybHkgcXVpY2sgYW5kCisgKglub3QgY2FsbGVkIHRvbyBvZnRlbi4gTXVzdCBwcm90ZWN0IGFnYWluc3QgYm90aCBiaCBhbmQgaXJxIHVzZXJzCisgKi8KKyAKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSopbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCWRvX3NldF9tdWx0aWNhc3RfbGlzdChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKK30JCisKKy8qKgorICogZXRoZGV2X3NldHVwIC0gaW5pdCByZXN0IG9mIDgzOTAgZGV2aWNlIHN0cnVjdAorICogQGRldjogbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlIHRvIGluaXQKKyAqCisgKiBJbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSA4MzkwIGRldmljZSBzdHJ1Y3R1cmUuICBEbyBOT1QgX19pbml0CisgKiB0aGlzLCBhcyBpdCBpcyB1c2VkIGJ5IDgzOTAgYmFzZWQgbW9kdWxhciBkcml2ZXJzIHRvby4KKyAqLworCitzdGF0aWMgdm9pZCBldGhkZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKHZlcnNpb24pOworICAgIAorCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmVpX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMJPSBnZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworCisJZXRoZXJfc2V0dXAoZGV2KTsKKworCXNwaW5fbG9ja19pbml0KCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKK30KKworLyoqCisgKiBhbGxvY19laV9uZXRkZXYgLSBhbGxvY19ldGhlcmRldiBjb3VudGVycGFydCBmb3IgODM5MAorICogQHNpemU6IGV4dHJhIGJ5dGVzIHRvIGFsbG9jYXRlCisgKgorICogQWxsb2NhdGUgODM5MC1zcGVjaWZpYyBuZXRfZGV2aWNlLgorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqX19hbGxvY19laV9uZXRkZXYoaW50IHNpemUpCit7CisJcmV0dXJuIGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGVpX2RldmljZSkgKyBzaXplLCAiZXRoJWQiLAorCQkJCWV0aGRldl9zZXR1cCk7Cit9CisKKwwKKworCisvKiBUaGlzIHBhZ2Ugb2YgZnVuY3Rpb25zIHNob3VsZCBiZSA4MzkwIGdlbmVyaWMgKi8KKy8qIEZvbGxvdyBOYXRpb25hbCBTZW1pJ3MgcmVjb21tZW5kYXRpb25zIGZvciBpbml0aWFsaXppbmcgdGhlICJOSUMiLiAqLworCisvKioKKyAqIE5TODM5MF9pbml0IC0gaW5pdGlhbGl6ZSA4MzkwIGhhcmR3YXJlCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byBpbml0aWFsaXplCisgKiBAc3RhcnRwOiBib29sZWFuLiAgbm9uLXplcm8gdmFsdWUgdG8gaW5pdGlhdGUgY2hpcCBwcm9jZXNzaW5nCisgKgorICoJTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKwordm9pZCBOUzgzOTBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhcnRwKQoreworCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlpbnQgZW5kY2ZnID0gZWlfbG9jYWwtPndvcmQxNgorCSAgICA/ICgweDQ4IHwgRU5EQ0ZHX1dUUyB8IChlaV9sb2NhbC0+YmlnZW5kaWFuID8gRU5EQ0ZHX0JPUyA6IDApKQorCSAgICA6IDB4NDg7CisgICAgCisJaWYoc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSE9NCkKKyAgICAJCXBhbmljKCI4MzkwLmM6IGhlYWRlciBzdHJ1Y3QgbWlzcGFja2VkXG4iKTsgICAgCisJLyogRm9sbG93IE5hdGlvbmFsIFNlbWkncyByZWNvbW1lbmRhdGlvbnMgZm9yIGluaXRpbmcgdGhlIERQODM5MDIuICovCisJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsgLyogMHgyMSAqLworCW91dGJfcChlbmRjZmcsIGU4MzkwX2Jhc2UgKyBFTjBfRENGRyk7CS8qIDB4NDggb3IgMHg0OSAqLworCS8qIENsZWFyIHRoZSByZW1vdGUgYnl0ZSBjb3VudCByZWdpc3RlcnMuICovCisJb3V0Yl9wKDB4MDAsICBlODM5MF9iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDB4MDAsICBlODM5MF9iYXNlICsgRU4wX1JDTlRISSk7CisJLyogU2V0IHRvIG1vbml0b3IgYW5kIGxvb3BiYWNrIG1vZGUgLS0gdGhpcyBpcyB2aXRhbCEuICovCisJb3V0Yl9wKEU4MzkwX1JYT0ZGLCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOyAvKiAweDIwICovCisJb3V0Yl9wKEU4MzkwX1RYT0ZGLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOyAvKiAweDAyICovCisJLyogU2V0IHRoZSB0cmFuc21pdCBwYWdlIGFuZCByZWNlaXZlIHJpbmcuICovCisJb3V0Yl9wKGVpX2xvY2FsLT50eF9zdGFydF9wYWdlLCBlODM5MF9iYXNlICsgRU4wX1RQU1IpOworCWVpX2xvY2FsLT50eDEgPSBlaV9sb2NhbC0+dHgyID0gMDsKKwlvdXRiX3AoZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2UsIGU4MzkwX2Jhc2UgKyBFTjBfU1RBUlRQRyk7CisJb3V0Yl9wKGVpX2xvY2FsLT5zdG9wX3BhZ2UtMSwgZTgzOTBfYmFzZSArIEVOMF9CT1VOREFSWSk7CS8qIDNjNTAzIHNheXMgMHgzZixOUzB4MjYqLworCWVpX2xvY2FsLT5jdXJyZW50X3BhZ2UgPSBlaV9sb2NhbC0+cnhfc3RhcnRfcGFnZTsJCS8qIGFzc2VydCBib3VuZGFyeSsxICovCisJb3V0Yl9wKGVpX2xvY2FsLT5zdG9wX3BhZ2UsIGU4MzkwX2Jhc2UgKyBFTjBfU1RPUFBHKTsKKwkvKiBDbGVhciB0aGUgcGVuZGluZyBpbnRlcnJ1cHRzIGFuZCBtYXNrLiAqLworCW91dGJfcCgweEZGLCBlODM5MF9iYXNlICsgRU4wX0lTUik7CisJb3V0Yl9wKDB4MDAsICBlODM5MF9iYXNlICsgRU4wX0lNUik7CisgICAgCisJLyogQ29weSB0aGUgc3RhdGlvbiBhZGRyZXNzIGludG8gdGhlIERTODM5MCByZWdpc3RlcnMuICovCisKKwlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMSArIEU4MzkwX1NUT1AsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsgLyogMHg2MSAqLworCWZvcihpID0gMDsgaSA8IDY7IGkrKykgCisJeworCQlvdXRiX3AoZGV2LT5kZXZfYWRkcltpXSwgZTgzOTBfYmFzZSArIEVOMV9QSFlTX1NISUZUKGkpKTsKKwkJaWYgKGVpX2RlYnVnID4gMSAmJiBpbmJfcChlODM5MF9iYXNlICsgRU4xX1BIWVNfU0hJRlQoaSkpIT1kZXYtPmRldl9hZGRyW2ldKQorCQkJcHJpbnRrKEtFUk5fRVJSICJIdy4gYWRkcmVzcyByZWFkL3dyaXRlIG1pc21hcCAlZFxuIixpKTsKKwl9CisKKwlvdXRiX3AoZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2UsIGU4MzkwX2Jhc2UgKyBFTjFfQ1VSUEFHKTsKKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwllaV9sb2NhbC0+dHgxID0gZWlfbG9jYWwtPnR4MiA9IDA7CisJZWlfbG9jYWwtPnR4aW5nID0gMDsKKworCWlmIChzdGFydHApIAorCXsKKwkJb3V0Yl9wKDB4ZmYsICBlODM5MF9iYXNlICsgRU4wX0lTUik7CisJCW91dGJfcChFTklTUl9BTEwsICBlODM5MF9iYXNlICsgRU4wX0lNUik7CisJCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOworCQlvdXRiX3AoRTgzOTBfVFhDT05GSUcsIGU4MzkwX2Jhc2UgKyBFTjBfVFhDUik7IC8qIHhtaXQgb24uICovCisJCS8qIDNjNTAzIFRlY2hNYW4gc2F5cyByeGNvbmZpZyBvbmx5IGFmdGVyIHRoZSBOSUMgaXMgc3RhcnRlZC4gKi8KKwkJb3V0Yl9wKEU4MzkwX1JYQ09ORklHLCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOyAvKiByeCBvbiwgICovCisJCWRvX3NldF9tdWx0aWNhc3RfbGlzdChkZXYpOwkvKiAocmUpbG9hZCB0aGUgbWNhc3QgdGFibGUgKi8KKwl9Cit9CisKKy8qIFRyaWdnZXIgYSB0cmFuc21pdCBzdGFydCwgYXNzdW1pbmcgdGhlIGxlbmd0aCBpcyB2YWxpZC4gCisgICBBbHdheXMgY2FsbGVkIHdpdGggdGhlIHBhZ2UgbG9jayBoZWxkICovCisgICAKK3N0YXRpYyB2b2lkIE5TODM5MF90cmlnZ2VyX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGxlbmd0aCwKKwkJCQkJCQkJaW50IHN0YXJ0X3BhZ2UpCit7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisgICAKKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTAsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKKyAgICAKKwlpZiAoaW5iX3AoZTgzOTBfYmFzZSkgJiBFODM5MF9UUkFOUykgCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJpZ2dlcl9zZW5kKCkgY2FsbGVkIHdpdGggdGhlIHRyYW5zbWl0dGVyIGJ1c3kuXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlvdXRiX3AobGVuZ3RoICYgMHhmZiwgZTgzOTBfYmFzZSArIEVOMF9UQ05UTE8pOworCW91dGJfcChsZW5ndGggPj4gOCwgZTgzOTBfYmFzZSArIEVOMF9UQ05USEkpOworCW91dGJfcChzdGFydF9wYWdlLCBlODM5MF9iYXNlICsgRU4wX1RQU1IpOworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9UUkFOUytFODM5MF9TVEFSVCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOworfQorCitFWFBPUlRfU1lNQk9MKGVpX29wZW4pOworRVhQT1JUX1NZTUJPTChlaV9jbG9zZSk7CitFWFBPUlRfU1lNQk9MKGVpX2ludGVycnVwdCk7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK0VYUE9SVF9TWU1CT0woZWlfcG9sbCk7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0woTlM4MzkwX2luaXQpOworRVhQT1JUX1NZTUJPTChfX2FsbG9jX2VpX25ldGRldik7CisKKyNpZiBkZWZpbmVkKE1PRFVMRSkKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKK30KKworI2VuZGlmIC8qIE1PRFVMRSAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODM5MC5oIGIvZHJpdmVycy9uZXQvODM5MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OWI2OGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC84MzkwLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qIEdlbmVyaWMgTlM4MzkwIHJlZ2lzdGVyIGRlZmluaXRpb25zLiAqLworLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRG9uYWxkIEJlY2tlcidzIDgzOTAgZHJpdmVycywgYW5kIGlzIGRpc3RyaWJ1dGVkCisgICB1bmRlciB0aGUgc2FtZSBsaWNlbnNlLiBBdXRvLWxvYWRpbmcgb2YgODM5MC5vIG9ubHkgaW4gdjIuMiAtIFBhdWwgRy4KKyAgIFNvbWUgb2YgdGhlc2UgbmFtZXMgYW5kIGNvbW1lbnRzIG9yaWdpbmF0ZWQgZnJvbSB0aGUgQ3J5bndyCisgICBwYWNrZXQgZHJpdmVycywgd2hpY2ggYXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHUEwuICovCisKKyNpZm5kZWYgXzgzOTBfaAorI2RlZmluZSBfODM5MF9oCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjZGVmaW5lIFRYX1BBR0VTIDEyCS8qIFR3byBUeCBzbG90cyAqLworCisjZGVmaW5lIEVUSEVSX0FERFJfTEVOIDYKKworLyogVGhlIDgzOTAgc3BlY2lmaWMgcGVyLXBhY2tldC1oZWFkZXIgZm9ybWF0LiAqLworc3RydWN0IGU4MzkwX3BrdF9oZHIgeworICB1bnNpZ25lZCBjaGFyIHN0YXR1czsgLyogc3RhdHVzICovCisgIHVuc2lnbmVkIGNoYXIgbmV4dDsgICAvKiBwb2ludGVyIHRvIG5leHQgcGFja2V0LiAqLworICB1bnNpZ25lZCBzaG9ydCBjb3VudDsgLyogaGVhZGVyICsgcGFja2V0IGxlbmd0aCBpbiBieXRlcyAqLworfTsKKworI2lmZGVmIG5vdGRlZgorZXh0ZXJuIGludCBlaV9kZWJ1ZzsKKyNlbHNlCisjZGVmaW5lIGVpX2RlYnVnIDEKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK2V4dGVybiB2b2lkIGVpX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgTlM4MzkwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXJ0cCk7CitleHRlcm4gaW50IGVpX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IGVpX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGlycXJldHVybl90IGVpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqX19hbGxvY19laV9uZXRkZXYoaW50IHNpemUpOworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfZWlfbmV0ZGV2KHZvaWQpCit7CisJcmV0dXJuIF9fYWxsb2NfZWlfbmV0ZGV2KDApOworfQorCisvKiBZb3UgaGF2ZSBvbmUgb2YgdGhlc2UgcGVyLWJvYXJkICovCitzdHJ1Y3QgZWlfZGV2aWNlIHsKKwljb25zdCBjaGFyICpuYW1lOworCXZvaWQgKCpyZXNldF84MzkwKShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKwl2b2lkICgqZ2V0XzgzOTBfaGRyKShzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqLCBpbnQpOworCXZvaWQgKCpibG9ja19vdXRwdXQpKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQpOworCXZvaWQgKCpibG9ja19pbnB1dCkoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCBzdHJ1Y3Qgc2tfYnVmZiAqLCBpbnQpOworCXVuc2lnbmVkIGxvbmcgcm1lbV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHJtZW1fZW5kOworCXZvaWQgX19pb21lbSAqbWVtOworCXVuc2lnbmVkIGNoYXIgbWNmaWx0ZXJbOF07CisJdW5zaWduZWQgb3BlbjoxOworCXVuc2lnbmVkIHdvcmQxNjoxOyAgCQkvKiBXZSBoYXZlIHRoZSAxNi1iaXQgKHZzIDgtYml0KSB2ZXJzaW9uIG9mIHRoZSBjYXJkLiAqLworCXVuc2lnbmVkIGJpZ2VuZGlhbjoxOwkJLyogMTYtYml0IGJpZyBlbmRpYW4gbW9kZS4gRG8gTk9UICovCisJCQkJCS8qIHNldCB0aGlzIG9uIHJhbmRvbSA4MzkwIGNsb25lcyEgKi8KKwl1bnNpZ25lZCB0eGluZzoxOwkJLyogVHJhbnNtaXQgQWN0aXZlICovCisJdW5zaWduZWQgaXJxbG9jazoxOwkJLyogODM5MCdzIGludHJzIGRpc2FibGVkIHdoZW4gJzEnLiAqLworCXVuc2lnbmVkIGRtYWluZzoxOwkJLyogUmVtb3RlIERNQSBBY3RpdmUgKi8KKwl1bnNpZ25lZCBjaGFyIHR4X3N0YXJ0X3BhZ2UsIHJ4X3N0YXJ0X3BhZ2UsIHN0b3BfcGFnZTsKKwl1bnNpZ25lZCBjaGFyIGN1cnJlbnRfcGFnZTsJLyogUmVhZCBwb2ludGVyIGluIGJ1ZmZlciAgKi8KKwl1bnNpZ25lZCBjaGFyIGludGVyZmFjZV9udW07CS8qIE5ldCBwb3J0IChBVUksIDEwYlQuKSB0byB1c2UuICovCisJdW5zaWduZWQgY2hhciB0eHF1ZXVlOwkJLyogVHggUGFja2V0IGJ1ZmZlciBxdWV1ZSBsZW5ndGguICovCisJc2hvcnQgdHgxLCB0eDI7CQkJLyogUGFja2V0IGxlbmd0aHMgZm9yIHBpbmctcG9uZyB0eC4gKi8KKwlzaG9ydCBsYXN0dHg7CQkJLyogQWxwaGEgdmVyc2lvbiBjb25zaXN0ZW5jeSBjaGVjay4gKi8KKwl1bnNpZ25lZCBjaGFyIHJlZzA7CQkvKiBSZWdpc3RlciAnMCcgaW4gYSBXRDgwMTMgKi8KKwl1bnNpZ25lZCBjaGFyIHJlZzU7CQkvKiBSZWdpc3RlciAnNScgaW4gYSBXRDgwMTMgKi8KKwl1bnNpZ25lZCBjaGFyIHNhdmVkX2lycTsJLyogT3JpZ2luYWwgZGV2LT5pcnEgdmFsdWUuICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdDsJLyogVGhlIG5ldyBzdGF0aXN0aWNzIHRhYmxlLiAqLworCXUzMiAqcmVnX29mZnNldDsJCS8qIFJlZ2lzdGVyIG1hcHBpbmcgdGFibGUgKi8KKwlzcGlubG9ja190IHBhZ2VfbG9jazsJCS8qIFBhZ2UgcmVnaXN0ZXIgbG9ja3MgKi8KKwl1bnNpZ25lZCBsb25nIHByaXY7CQkvKiBQcml2YXRlIGZpZWxkIHRvIHN0b3JlIGJ1cyBJRHMgZXRjLiAqLworfTsKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIDgzOTAgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZXMgY2FsbGVkIHBlciBJUlEuICovCisjZGVmaW5lIE1BWF9TRVJWSUNFIDEyCisKKy8qIFRoZSBtYXhpbXVtIHRpbWUgd2FpdGVkIChpbiBqaWZmaWVzKSBiZWZvcmUgYXNzdW1pbmcgYSBUeCBmYWlsZWQuICgyMG1zKSAqLworI2RlZmluZSBUWF9USU1FT1VUICgyMCpIWi8xMDApCisKKyNkZWZpbmUgZWlfc3RhdHVzICgqKHN0cnVjdCBlaV9kZXZpY2UgKiluZXRkZXZfcHJpdihkZXYpKQorCisvKiBTb21lIGdlbmVyaWMgZXRoZXJuZXQgcmVnaXN0ZXIgY29uZmlndXJhdGlvbnMuICovCisjZGVmaW5lIEU4MzkwX1RYX0lSUV9NQVNLCTB4YQkvKiBGb3IgcmVnaXN0ZXIgRU4wX0lTUiAqLworI2RlZmluZSBFODM5MF9SWF9JUlFfTUFTSwkweDUKKyNkZWZpbmUgRTgzOTBfUlhDT05GSUcJCTB4NAkvKiBFTjBfUlhDUjogYnJvYWRjYXN0cywgbm8gbXVsdGljYXN0LGVycm9ycyAqLworI2RlZmluZSBFODM5MF9SWE9GRgkJMHgyMAkvKiBFTjBfUlhDUjogQWNjZXB0IG5vIHBhY2tldHMgKi8KKyNkZWZpbmUgRTgzOTBfVFhDT05GSUcJCTB4MDAJLyogRU4wX1RYQ1I6IE5vcm1hbCB0cmFuc21pdCBtb2RlICovCisjZGVmaW5lIEU4MzkwX1RYT0ZGCQkweDAyCS8qIEVOMF9UWENSOiBUcmFuc21pdHRlciBvZmYgKi8KKworLyogIFJlZ2lzdGVyIGFjY2Vzc2VkIGF0IEVOX0NNRCwgdGhlIDgzOTAgYmFzZSBhZGRyLiAgKi8KKyNkZWZpbmUgRTgzOTBfU1RPUAkweDAxCS8qIFN0b3AgYW5kIHJlc2V0IHRoZSBjaGlwICovCisjZGVmaW5lIEU4MzkwX1NUQVJUCTB4MDIJLyogU3RhcnQgdGhlIGNoaXAsIGNsZWFyIHJlc2V0ICovCisjZGVmaW5lIEU4MzkwX1RSQU5TCTB4MDQJLyogVHJhbnNtaXQgYSBmcmFtZSAqLworI2RlZmluZSBFODM5MF9SUkVBRAkweDA4CS8qIFJlbW90ZSByZWFkICovCisjZGVmaW5lIEU4MzkwX1JXUklURQkweDEwCS8qIFJlbW90ZSB3cml0ZSAgKi8KKyNkZWZpbmUgRTgzOTBfTk9ETUEJMHgyMAkvKiBSZW1vdGUgRE1BICovCisjZGVmaW5lIEU4MzkwX1BBR0UwCTB4MDAJLyogU2VsZWN0IHBhZ2UgY2hpcCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRTgzOTBfUEFHRTEJMHg0MAkvKiB1c2luZyB0aGUgdHdvIGhpZ2gtb3JkZXIgYml0cyAqLworI2RlZmluZSBFODM5MF9QQUdFMgkweDgwCS8qIFBhZ2UgMyBpcyBpbnZhbGlkLiAqLworCisvKgorICoJT25seSBnZW5lcmF0ZSBpbmRpcmVjdCBsb2FkcyBnaXZlbiBhIG1hY2hpbmUgdGhhdCBuZWVkcyB0aGVtLgorICogICAgICAtIHJlbW92ZWQgQU1JR0FfUENNQ0lBIGZyb20gdGhpcyBsaXN0LCBoYW5kbGVkIGFzIElTQSBpbyBub3cKKyAqLworIAorI2lmIGRlZmluZWQoQ09ORklHX01BQykgfHwgIFwKKyAgICBkZWZpbmVkKENPTkZJR19aT1JSTzgzOTApIHx8IGRlZmluZWQoQ09ORklHX1pPUlJPODM5MF9NT0RVTEUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19IWURSQSkgfHwgZGVmaW5lZChDT05GSUdfSFlEUkFfTU9EVUxFKQorI2RlZmluZSBFSV9TSElGVCh4KQkoZWlfbG9jYWwtPnJlZ19vZmZzZXRbeF0pCisjdW5kZWYgaW5iCisjdW5kZWYgaW5iX3AKKyN1bmRlZiBvdXRiCisjdW5kZWYgb3V0Yl9wCisKKyNkZWZpbmUgaW5iKHBvcnQpICAgaW5fOChwb3J0KQorI2RlZmluZSBvdXRiKHZhbCxwb3J0KSAgb3V0XzgocG9ydCx2YWwpCisjZGVmaW5lIGluYl9wKHBvcnQpICAgaW5fOChwb3J0KQorI2RlZmluZSBvdXRiX3AodmFsLHBvcnQpICBvdXRfOChwb3J0LHZhbCkKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQVJNX0VUSEVSSCkgfHwgZGVmaW5lZChDT05GSUdfQVJNX0VUSEVSSF9NT0RVTEUpCisjZGVmaW5lIEVJX1NISUZUKHgpCShlaV9sb2NhbC0+cmVnX29mZnNldFt4XSkKKyN1bmRlZiBpbmIKKyN1bmRlZiBpbmJfcAorI3VuZGVmIG91dGIKKyN1bmRlZiBvdXRiX3AKKworI2RlZmluZSBpbmIoX3ApCQlyZWFkYihfcCkKKyNkZWZpbmUgb3V0YihfdixfcCkJd3JpdGViKF92LF9wKQorI2RlZmluZSBpbmJfcChfcCkJaW5iKF9wKQorI2RlZmluZSBvdXRiX3AoX3YsX3ApCW91dGIoX3YsX3ApCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX05FVF9DQlVTKSB8fCBkZWZpbmVkKENPTkZJR19ORV9IODMwMCkgfHwgZGVmaW5lZChDT05GSUdfTkVfSDgzMDBfTU9EVUxFKQorI2RlZmluZSBFSV9TSElGVCh4KQkoZWlfbG9jYWwtPnJlZ19vZmZzZXRbeF0pCisjZWxzZQorI2RlZmluZSBFSV9TSElGVCh4KQkoeCkKKyNlbmRpZgorCisjZGVmaW5lIEU4MzkwX0NNRAlFSV9TSElGVCgweDAwKSAgLyogVGhlIGNvbW1hbmQgcmVnaXN0ZXIgKGZvciBhbGwgcGFnZXMpICovCisvKiBQYWdlIDAgcmVnaXN0ZXIgb2Zmc2V0cy4gKi8KKyNkZWZpbmUgRU4wX0NMREFMTwlFSV9TSElGVCgweDAxKQkvKiBMb3cgYnl0ZSBvZiBjdXJyZW50IGxvY2FsIGRtYSBhZGRyICBSRCAqLworI2RlZmluZSBFTjBfU1RBUlRQRwlFSV9TSElGVCgweDAxKQkvKiBTdGFydGluZyBwYWdlIG9mIHJpbmcgYmZyIFdSICovCisjZGVmaW5lIEVOMF9DTERBSEkJRUlfU0hJRlQoMHgwMikJLyogSGlnaCBieXRlIG9mIGN1cnJlbnQgbG9jYWwgZG1hIGFkZHIgIFJEICovCisjZGVmaW5lIEVOMF9TVE9QUEcJRUlfU0hJRlQoMHgwMikJLyogRW5kaW5nIHBhZ2UgKzEgb2YgcmluZyBiZnIgV1IgKi8KKyNkZWZpbmUgRU4wX0JPVU5EQVJZCUVJX1NISUZUKDB4MDMpCS8qIEJvdW5kYXJ5IHBhZ2Ugb2YgcmluZyBiZnIgUkQgV1IgKi8KKyNkZWZpbmUgRU4wX1RTUgkJRUlfU0hJRlQoMHgwNCkJLyogVHJhbnNtaXQgc3RhdHVzIHJlZyBSRCAqLworI2RlZmluZSBFTjBfVFBTUglFSV9TSElGVCgweDA0KQkvKiBUcmFuc21pdCBzdGFydGluZyBwYWdlIFdSICovCisjZGVmaW5lIEVOMF9OQ1IJCUVJX1NISUZUKDB4MDUpCS8qIE51bWJlciBvZiBjb2xsaXNpb24gcmVnIFJEICovCisjZGVmaW5lIEVOMF9UQ05UTE8JRUlfU0hJRlQoMHgwNSkJLyogTG93ICBieXRlIG9mIHR4IGJ5dGUgY291bnQgV1IgKi8KKyNkZWZpbmUgRU4wX0ZJRk8JRUlfU0hJRlQoMHgwNikJLyogRklGTyBSRCAqLworI2RlZmluZSBFTjBfVENOVEhJCUVJX1NISUZUKDB4MDYpCS8qIEhpZ2ggYnl0ZSBvZiB0eCBieXRlIGNvdW50IFdSICovCisjZGVmaW5lIEVOMF9JU1IJCUVJX1NISUZUKDB4MDcpCS8qIEludGVycnVwdCBzdGF0dXMgcmVnIFJEIFdSICovCisjZGVmaW5lIEVOMF9DUkRBTE8JRUlfU0hJRlQoMHgwOCkJLyogbG93IGJ5dGUgb2YgY3VycmVudCByZW1vdGUgZG1hIGFkZHJlc3MgUkQgKi8KKyNkZWZpbmUgRU4wX1JTQVJMTwlFSV9TSElGVCgweDA4KQkvKiBSZW1vdGUgc3RhcnQgYWRkcmVzcyByZWcgMCAqLworI2RlZmluZSBFTjBfQ1JEQUhJCUVJX1NISUZUKDB4MDkpCS8qIGhpZ2ggYnl0ZSwgY3VycmVudCByZW1vdGUgZG1hIGFkZHJlc3MgUkQgKi8KKyNkZWZpbmUgRU4wX1JTQVJISQlFSV9TSElGVCgweDA5KQkvKiBSZW1vdGUgc3RhcnQgYWRkcmVzcyByZWcgMSAqLworI2RlZmluZSBFTjBfUkNOVExPCUVJX1NISUZUKDB4MGEpCS8qIFJlbW90ZSBieXRlIGNvdW50IHJlZyBXUiAqLworI2RlZmluZSBFTjBfUkNOVEhJCUVJX1NISUZUKDB4MGIpCS8qIFJlbW90ZSBieXRlIGNvdW50IHJlZyBXUiAqLworI2RlZmluZSBFTjBfUlNSCQlFSV9TSElGVCgweDBjKQkvKiByeCBzdGF0dXMgcmVnIFJEICovCisjZGVmaW5lIEVOMF9SWENSCUVJX1NISUZUKDB4MGMpCS8qIFJYIGNvbmZpZ3VyYXRpb24gcmVnIFdSICovCisjZGVmaW5lIEVOMF9UWENSCUVJX1NISUZUKDB4MGQpCS8qIFRYIGNvbmZpZ3VyYXRpb24gcmVnIFdSICovCisjZGVmaW5lIEVOMF9DT1VOVEVSMAlFSV9TSElGVCgweDBkKQkvKiBSY3YgYWxpZ25tZW50IGVycm9yIGNvdW50ZXIgUkQgKi8KKyNkZWZpbmUgRU4wX0RDRkcJRUlfU0hJRlQoMHgwZSkJLyogRGF0YSBjb25maWd1cmF0aW9uIHJlZyBXUiAqLworI2RlZmluZSBFTjBfQ09VTlRFUjEJRUlfU0hJRlQoMHgwZSkJLyogUmN2IENSQyBlcnJvciBjb3VudGVyIFJEICovCisjZGVmaW5lIEVOMF9JTVIJCUVJX1NISUZUKDB4MGYpCS8qIEludGVycnVwdCBtYXNrIHJlZyBXUiAqLworI2RlZmluZSBFTjBfQ09VTlRFUjIJRUlfU0hJRlQoMHgwZikJLyogUmN2IG1pc3NlZCBmcmFtZSBlcnJvciBjb3VudGVyIFJEICovCisKKy8qIEJpdHMgaW4gRU4wX0lTUiAtIEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU5JU1JfUlgJMHgwMQkvKiBSZWNlaXZlciwgbm8gZXJyb3IgKi8KKyNkZWZpbmUgRU5JU1JfVFgJMHgwMgkvKiBUcmFuc21pdHRlciwgbm8gZXJyb3IgKi8KKyNkZWZpbmUgRU5JU1JfUlhfRVJSCTB4MDQJLyogUmVjZWl2ZXIsIHdpdGggZXJyb3IgKi8KKyNkZWZpbmUgRU5JU1JfVFhfRVJSCTB4MDgJLyogVHJhbnNtaXR0ZXIsIHdpdGggZXJyb3IgKi8KKyNkZWZpbmUgRU5JU1JfT1ZFUgkweDEwCS8qIFJlY2VpdmVyIG92ZXJ3cm90ZSB0aGUgcmluZyAqLworI2RlZmluZSBFTklTUl9DT1VOVEVSUwkweDIwCS8qIENvdW50ZXJzIG5lZWQgZW1wdHlpbmcgKi8KKyNkZWZpbmUgRU5JU1JfUkRDCTB4NDAJLyogcmVtb3RlIGRtYSBjb21wbGV0ZSAqLworI2RlZmluZSBFTklTUl9SRVNFVAkweDgwCS8qIFJlc2V0IGNvbXBsZXRlZCAqLworI2RlZmluZSBFTklTUl9BTEwJMHgzZgkvKiBJbnRlcnJ1cHRzIHdlIHdpbGwgZW5hYmxlICovCisKKy8qIEJpdHMgaW4gRU4wX0RDRkcgLSBEYXRhIGNvbmZpZyByZWdpc3RlciAqLworI2RlZmluZSBFTkRDRkdfV1RTCTB4MDEJLyogd29yZCB0cmFuc2ZlciBtb2RlIHNlbGVjdGlvbiAqLworI2RlZmluZSBFTkRDRkdfQk9TCTB4MDIJLyogYnl0ZSBvcmRlciBzZWxlY3Rpb24gKi8KKworLyogUGFnZSAxIHJlZ2lzdGVyIG9mZnNldHMuICovCisjZGVmaW5lIEVOMV9QSFlTICAgRUlfU0hJRlQoMHgwMSkJLyogVGhpcyBib2FyZCdzIHBoeXNpY2FsIGVuZXQgYWRkciBSRCBXUiAqLworI2RlZmluZSBFTjFfUEhZU19TSElGVChpKSAgRUlfU0hJRlQoaSsxKSAvKiBHZXQgYW5kIHNldCBtYWMgYWRkcmVzcyAqLworI2RlZmluZSBFTjFfQ1VSUEFHIEVJX1NISUZUKDB4MDcpCS8qIEN1cnJlbnQgbWVtb3J5IHBhZ2UgUkQgV1IgKi8KKyNkZWZpbmUgRU4xX01VTFQgICBFSV9TSElGVCgweDA4KQkvKiBNdWx0aWNhc3QgZmlsdGVyIG1hc2sgYXJyYXkgKDggYnl0ZXMpIFJEIFdSICovCisjZGVmaW5lIEVOMV9NVUxUX1NISUZUKGkpICBFSV9TSElGVCg4K2kpIC8qIEdldCBhbmQgc2V0IG11bHRpY2FzdCBmaWx0ZXIgKi8KKworLyogQml0cyBpbiByZWNlaXZlZCBwYWNrZXQgc3RhdHVzIGJ5dGUgYW5kIEVOMF9SU1IqLworI2RlZmluZSBFTlJTUl9SWE9LCTB4MDEJLyogUmVjZWl2ZWQgYSBnb29kIHBhY2tldCAqLworI2RlZmluZSBFTlJTUl9DUkMJMHgwMgkvKiBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgRU5SU1JfRkFFCTB4MDQJLyogZnJhbWUgYWxpZ25tZW50IGVycm9yICovCisjZGVmaW5lIEVOUlNSX0ZPCTB4MDgJLyogRklGTyBvdmVycnVuICovCisjZGVmaW5lIEVOUlNSX01QQQkweDEwCS8qIG1pc3NlZCBwa3QgKi8KKyNkZWZpbmUgRU5SU1JfUEhZCTB4MjAJLyogcGh5c2ljYWwvbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgRU5SU1JfRElTCTB4NDAJLyogcmVjZWl2ZXIgZGlzYWJsZS4gc2V0IGluIG1vbml0b3IgbW9kZSAqLworI2RlZmluZSBFTlJTUl9ERUYJMHg4MAkvKiBkZWZlcnJpbmcgKi8KKworLyogVHJhbnNtaXR0ZWQgcGFja2V0IHN0YXR1cywgRU4wX1RTUi4gKi8KKyNkZWZpbmUgRU5UU1JfUFRYIDB4MDEJLyogUGFja2V0IHRyYW5zbWl0dGVkIHdpdGhvdXQgZXJyb3IgKi8KKyNkZWZpbmUgRU5UU1JfTkQgIDB4MDIJLyogVGhlIHRyYW5zbWl0IHdhc24ndCBkZWZlcnJlZC4gKi8KKyNkZWZpbmUgRU5UU1JfQ09MIDB4MDQJLyogVGhlIHRyYW5zbWl0IGNvbGxpZGVkIGF0IGxlYXN0IG9uY2UuICovCisjZGVmaW5lIEVOVFNSX0FCVCAweDA4ICAvKiBUaGUgdHJhbnNtaXQgY29sbGlkZWQgMTYgdGltZXMsIGFuZCB3YXMgZGVmZXJyZWQuICovCisjZGVmaW5lIEVOVFNSX0NSUyAweDEwCS8qIFRoZSBjYXJyaWVyIHNlbnNlIHdhcyBsb3N0LiAqLworI2RlZmluZSBFTlRTUl9GVSAgMHgyMCAgLyogQSAiRklGTyB1bmRlcnJ1biIgb2NjdXJyZWQgZHVyaW5nIHRyYW5zbWl0LiAqLworI2RlZmluZSBFTlRTUl9DREggMHg0MAkvKiBUaGUgY29sbGlzaW9uIGRldGVjdCAiaGVhcnRiZWF0IiBzaWduYWwgd2FzIGxvc3QuICovCisjZGVmaW5lIEVOVFNSX09XQyAweDgwICAvKiBUaGVyZSB3YXMgYW4gb3V0LW9mLXdpbmRvdyBjb2xsaXNpb24uICovCisKKyNlbmRpZiAvKiBfODM5MF9oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGQ1Nzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvS2NvbmZpZwpAQCAtMCwwICsxLDI1MzggQEAKKworIworIyBOZXR3b3JrIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBORVRERVZJQ0VTCisJZGVwZW5kcyBvbiBORVQKKwlib29sICJOZXR3b3JrIGRldmljZSBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFlvdSBjYW4gc2F5IE4gaGVyZSBpZiB5b3UgZG9uJ3QgaW50ZW5kIHRvIGNvbm5lY3QgeW91ciBMaW51eCBib3ggdG8KKwkgIGFueSBvdGhlciBjb21wdXRlciBhdCBhbGwuCisKKwkgIFlvdSdsbCBoYXZlIHRvIHNheSBZIGlmIHlvdXIgY29tcHV0ZXIgY29udGFpbnMgYSBuZXR3b3JrIGNhcmQgdGhhdAorCSAgeW91IHdhbnQgdG8gdXNlIHVuZGVyIExpbnV4LiBJZiB5b3UgYXJlIGdvaW5nIHRvIHJ1biBTTElQIG9yIFBQUCBvdmVyCisJICB0ZWxlcGhvbmUgbGluZSBvciBudWxsIG1vZGVtIGNhYmxlIHlvdSBuZWVkIHNheSBZIGhlcmUuIENvbm5lY3RpbmcKKwkgIHR3byBtYWNoaW5lcyB3aXRoIHBhcmFsbGVsIHBvcnRzIHVzaW5nIFBMSVAgbmVlZHMgdGhpcywgYXMgd2VsbCBhcworCSAgQVguMjUvS0lTUyBmb3Igc2VuZGluZyBJbnRlcm5ldCB0cmFmZmljIG92ZXIgYW1hdGV1ciByYWRpbyBsaW5rcy4KKworCSAgU2VlIGFsc28gIlRoZSBMaW51eCBOZXR3b3JrIEFkbWluaXN0cmF0b3IncyBHdWlkZSIgYnkgT2xhZiBLaXJjaCBhbmQKKwkgIFRlcnJ5IERhd3Nvbi4gQXZhaWxhYmxlIGF0IDxodHRwOi8vd3d3LnRsZHAub3JnL2d1aWRlcy5odG1sPi4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIERVTU1ZCisJdHJpc3RhdGUgIkR1bW15IG5ldCBkcml2ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGVzc2VudGlhbGx5IGEgYml0LWJ1Y2tldCBkZXZpY2UgKGkuZS4gdHJhZmZpYyB5b3Ugc2VuZCB0bworCSAgdGhpcyBkZXZpY2UgaXMgY29uc2lnbmVkIGludG8gb2JsaXZpb24pIHdpdGggYSBjb25maWd1cmFibGUgSVAKKwkgIGFkZHJlc3MuIEl0IGlzIG1vc3QgY29tbW9ubHkgdXNlZCBpbiBvcmRlciB0byBtYWtlIHlvdXIgY3VycmVudGx5CisJICBpbmFjdGl2ZSBTTElQIGFkZHJlc3Mgc2VlbSBsaWtlIGEgcmVhbCBhZGRyZXNzIGZvciBsb2NhbCBwcm9ncmFtcy4KKwkgIElmIHlvdSB1c2UgU0xJUCBvciBQUFAsIHlvdSBtaWdodCB3YW50IHRvIHNheSBZIGhlcmUuIFNpbmNlIHRoaXMKKwkgIHRoaW5nIG9mdGVuIGNvbWVzIGluIGhhbmR5LCB0aGUgZGVmYXVsdCBpcyBZLiBJdCB3b24ndCBlbmxhcmdlIHlvdXIKKwkgIGtlcm5lbCBlaXRoZXIuIFdoYXQgYSBkZWFsLiBSZWFkIGFib3V0IGl0IGluIHRoZSBOZXR3b3JrCisJICBBZG1pbmlzdHJhdG9yJ3MgR3VpZGUsIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjZ3VpZGU+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBkdW1teS4gIElmIHlvdSB3YW50IHRvIHVzZSBtb3JlIHRoYW4gb25lIGR1bW15CisJICBkZXZpY2UgYXQgYSB0aW1lLCB5b3UgbmVlZCB0byBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLgorCSAgSW5zdGVhZCBvZiAnZHVtbXknLCB0aGUgZGV2aWNlcyB3aWxsIHRoZW4gYmUgY2FsbGVkICdkdW1teTAnLAorCSAgJ2R1bW15MScgZXRjLgorCitjb25maWcgQk9ORElORworCXRyaXN0YXRlICJCb25kaW5nIGRyaXZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUREVWSUNFUworCWRlcGVuZHMgb24gSU5FVAorCS0tLWhlbHAtLS0KKwkgIFNheSAnWScgb3IgJ00nIGlmIHlvdSB3aXNoIHRvIGJlIGFibGUgdG8gJ2JvbmQnIG11bHRpcGxlIEV0aGVybmV0CisJICBDaGFubmVscyB0b2dldGhlci4gVGhpcyBpcyBjYWxsZWQgJ0V0aGVyY2hhbm5lbCcgYnkgQ2lzY28sCisJICAnVHJ1bmtpbmcnIGJ5IFN1biwgODAyLjNhZCBieSB0aGUgSUVFRSwgYW5kICdCb25kaW5nJyBpbiBMaW51eC4KKworCSAgVGhlIGRyaXZlciBzdXBwb3J0cyBtdWx0aXBsZSBib25kaW5nIG1vZGVzIHRvIGFsbG93IGZvciBib3RoIGhpZ2gKKwkgIHBlcmZvbWFuY2UgYW5kIGhpZ2ggYXZhaWxhYmlsaXR5IG9wZXJhdGlvbi4KKworCSAgUmVmZXIgdG8gPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JvbmRpbmcudHh0PiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGJvbmRpbmcuCisKK2NvbmZpZyBFUVVBTElaRVIKKwl0cmlzdGF0ZSAiRVFMIChzZXJpYWwgbGluZSBsb2FkIGJhbGFuY2luZykgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSB0d28gc2VyaWFsIGNvbm5lY3Rpb25zIHRvIHNvbWUgb3RoZXIgY29tcHV0ZXIgKHRoaXMKKwkgIHVzdWFsbHkgcmVxdWlyZXMgdHdvIG1vZGVtcyBhbmQgdHdvIHRlbGVwaG9uZSBsaW5lcykgYW5kIHlvdSB1c2UKKwkgIFNMSVAgKHRoZSBwcm90b2NvbCBmb3Igc2VuZGluZyBJbnRlcm5ldCB0cmFmZmljIG92ZXIgdGVsZXBob25lCisJICBsaW5lcykgb3IgUFBQIChhIGJldHRlciBTTElQKSBvbiB0aGVtLCB5b3UgY2FuIG1ha2UgdGhlbSBiZWhhdmUgbGlrZQorCSAgb25lIGRvdWJsZSBzcGVlZCBjb25uZWN0aW9uIHVzaW5nIHRoaXMgZHJpdmVyLiAgTmF0dXJhbGx5LCB0aGlzIGhhcworCSAgdG8gYmUgc3VwcG9ydGVkIGF0IHRoZSBvdGhlciBlbmQgYXMgd2VsbCwgZWl0aGVyIHdpdGggYSBzaW1pbGFyIEVRTAorCSAgTGludXggZHJpdmVyIG9yIHdpdGggYSBMaXZpbmdzdG9uIFBvcnRtYXN0ZXIgMmUuCisKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRoaXMgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9lcWwudHh0Pi4gIFlvdSBtYXkgYWxzbyB3YW50IHRvIHJlYWQKKwkgIHNlY3Rpb24gNi4yIG9mIHRoZSBORVQtMy1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGVxbC4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBUVU4KKwl0cmlzdGF0ZSAiVW5pdmVyc2FsIFRVTi9UQVAgZGV2aWNlIGRyaXZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUREVWSUNFUworCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRVTi9UQVAgcHJvdmlkZXMgcGFja2V0IHJlY2VwdGlvbiBhbmQgdHJhbnNtaXNzaW9uIGZvciB1c2VyIHNwYWNlCisJICBwcm9ncmFtcy4gIEl0IGNhbiBiZSB2aWV3ZWQgYXMgYSBzaW1wbGUgUG9pbnQtdG8tUG9pbnQgb3IgRXRoZXJuZXQKKwkgIGRldmljZSwgd2hpY2ggaW5zdGVhZCBvZiByZWNlaXZpbmcgcGFja2V0cyBmcm9tIGEgcGh5c2ljYWwgbWVkaWEsCisJICByZWNlaXZlcyB0aGVtIGZyb20gdXNlciBzcGFjZSBwcm9ncmFtIGFuZCBpbnN0ZWFkIG9mIHNlbmRpbmcgcGFja2V0cworCSAgdmlhIHBoeXNpY2FsIG1lZGlhIHdyaXRlcyB0aGVtIHRvIHRoZSB1c2VyIHNwYWNlIHByb2dyYW0uCisKKwkgIFdoZW4gYSBwcm9ncmFtIG9wZW5zIC9kZXYvbmV0L3R1biwgZHJpdmVyIGNyZWF0ZXMgYW5kIHJlZ2lzdGVycworCSAgY29ycmVzcG9uZGluZyBuZXQgZGV2aWNlIHR1blggb3IgdGFwWC4gIEFmdGVyIGEgcHJvZ3JhbSBjbG9zZWQgYWJvdmUKKwkgIGRldmljZXMsIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGVsZXRlIHR1blhYIG9yIHRhcFhYIGRldmljZSBhbmQKKwkgIGFsbCByb3V0ZXMgY29ycmVzcG9uZGluZyB0byBpdC4KKworCSAgUGxlYXNlIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3R1bnRhcC50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdHVuLgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIHVzZSB0aGlzIGZvciwgeW91IGRvbid0IG5lZWQgaXQuCisKK2NvbmZpZyBORVRfU0IxMDAwCisJdHJpc3RhdGUgIkdlbmVyYWwgSW5zdHJ1bWVudHMgU3VyZmJvYXJkIDEwMDAiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIFBOUAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBHZW5lcmFsIEluc3RydW1lbnQgKGFsc28ga25vd24gYXMKKwkgIE5leHRMZXZlbCkgU1VSRmJvYXJkIDEwMDAgaW50ZXJuYWwKKwkgIGNhYmxlIG1vZGVtLiBUaGlzIGlzIGFuIElTQSBjYXJkIHdoaWNoIGlzIHVzZWQgYnkgYSBudW1iZXIgb2YgY2FibGUKKwkgIFRWIGNvbXBhbmllcyB0byBwcm92aWRlIGNhYmxlIG1vZGVtIGFjY2Vzcy4gSXQncyBhIG9uZS13YXkKKwkgIGRvd25zdHJlYW0tb25seSBjYWJsZSBtb2RlbSwgbWVhbmluZyB0aGF0IHlvdXIgdXBzdHJlYW0gbmV0IGxpbmsgaXMKKwkgIHByb3ZpZGVkIGJ5IHlvdXIgcmVndWxhciBwaG9uZSBtb2RlbS4KKworCSAgQXQgcHJlc2VudCB0aGlzIGRyaXZlciBvbmx5IGNvbXBpbGVzIGFzIGEgbW9kdWxlLCBzbyBzYXkgTSBoZXJlIGlmCisJICB5b3UgaGF2ZSB0aGlzIGNhcmQuIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2IxMDAwLiBUaGVuIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9SRUFETUUuc2IxMDAwPiBmb3IgaW5mb3JtYXRpb24gb24gaG93CisJICB0byB1c2UgdGhpcyBtb2R1bGUsIGFzIGl0IG5lZWRzIHNwZWNpYWwgcHBwIHNjcmlwdHMgZm9yIGVzdGFibGlzaGluZworCSAgYSBjb25uZWN0aW9uLiBGdXJ0aGVyIGRvY3VtZW50YXRpb24gYW5kIHRoZSBuZWNlc3Nhcnkgc2NyaXB0cyBjYW4gYmUKKwkgIGZvdW5kIGF0OgorCisJICA8aHR0cDovL3d3dy5qYWNrc29udmlsbGUubmV0L35mdmVudHVyaS8+CisJICA8aHR0cDovL2hvbWUuYWRlbHBoaWEubmV0L35zaWdsZXJjbS9zYjEwMDAuaHRtbD4KKwkgIDxodHRwOi8vbGludXhwb3dlci5jeC9+Y2FibGUvPgorCisJICBJZiB5b3UgZG9uJ3QgaGF2ZSB0aGlzIGNhcmQsIG9mIGNvdXJzZSBzYXkgTi4KKworaWYgTkVUREVWSUNFUworCXNvdXJjZSAiZHJpdmVycy9uZXQvYXJjbmV0L0tjb25maWciCitlbmRpZgorCisjCisjCUV0aGVybmV0CisjCisKK21lbnUgIkV0aGVybmV0ICgxMCBvciAxMDBNYml0KSIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMgJiYgIVVNTAorCitjb25maWcgTkVUX0VUSEVSTkVUCisJYm9vbCAiRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpIgorCS0tLWhlbHAtLS0KKwkgIEV0aGVybmV0IChhbHNvIGNhbGxlZCBJRUVFIDgwMi4zIG9yIElTTyA4ODAyLTIpIGlzIHRoZSBtb3N0IGNvbW1vbgorCSAgdHlwZSBvZiBMb2NhbCBBcmVhIE5ldHdvcmsgKExBTikgaW4gdW5pdmVyc2l0aWVzIGFuZCBjb21wYW5pZXMuCisKKwkgIENvbW1vbiB2YXJpZXRpZXMgb2YgRXRoZXJuZXQgYXJlOiAxMEJBU0UtMiBvciBUaGlubmV0ICgxMCBNYnBzIG92ZXIKKwkgIGNvYXhpYWwgY2FibGUsIGxpbmtpbmcgY29tcHV0ZXJzIGluIGEgY2hhaW4pLCAxMEJBU0UtVCBvciB0d2lzdGVkCisJICBwYWlyICgxMCBNYnBzIG92ZXIgdHdpc3RlZCBwYWlyIGNhYmxlLCBsaW5raW5nIGNvbXB1dGVycyB0byBjZW50cmFsCisJICBodWJzKSwgMTBCQVNFLUYgKDEwIE1icHMgb3ZlciBvcHRpY2FsIGZpYmVyIGxpbmtzLCB1c2luZyBodWJzKSwKKwkgIDEwMEJBU0UtVFggKDEwMCBNYnBzIG92ZXIgdHdvIHR3aXN0ZWQgcGFpciBjYWJsZXMsIHVzaW5nIGh1YnMpLAorCSAgMTAwQkFTRS1UNCAoMTAwIE1icHMgb3ZlciA0IHN0YW5kYXJkIHZvaWNlLWdyYWRlIHR3aXN0ZWQgcGFpcgorCSAgY2FibGVzLCB1c2luZyBodWJzKSwgMTAwQkFTRS1GWCAoMTAwIE1icHMgb3ZlciBvcHRpY2FsIGZpYmVyIGxpbmtzKQorCSAgW3RoZSAxMDBCQVNFIHZhcmlldGllcyBhcmUgYWxzbyBrbm93biBhcyBGYXN0IEV0aGVybmV0XSwgYW5kIEdpZ2FiaXQKKwkgIEV0aGVybmV0ICgxIEdicHMgb3ZlciBvcHRpY2FsIGZpYmVyIG9yIHNob3J0IGNvcHBlciBsaW5rcykuCisKKwkgIElmIHlvdXIgTGludXggbWFjaGluZSB3aWxsIGJlIGNvbm5lY3RlZCB0byBhbiBFdGhlcm5ldCBhbmQgeW91IGhhdmUKKwkgIGFuIEV0aGVybmV0IG5ldHdvcmsgaW50ZXJmYWNlIGNhcmQgKE5JQykgaW5zdGFsbGVkIGluIHlvdXIgY29tcHV0ZXIsCisJICBzYXkgWSBoZXJlIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uIFlvdSB3aWxsIHRoZW4gYWxzbyBoYXZlCisJICB0byBzYXkgWSB0byB0aGUgZHJpdmVyIGZvciB5b3VyIHBhcnRpY3VsYXIgTklDLgorCisJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIHdvbid0IGRpcmVjdGx5IGFmZmVjdCB0aGUKKwkgIGtlcm5lbDogc2F5aW5nIE4gd2lsbCBqdXN0IGNhdXNlIHRoZSBjb25maWd1cmF0b3IgdG8gc2tpcCBhbGwKKwkgIHRoZSBxdWVzdGlvbnMgYWJvdXQgRXRoZXJuZXQgbmV0d29yayBjYXJkcy4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE1JSQorCXRyaXN0YXRlICJHZW5lcmljIE1lZGlhIEluZGVwZW5kZW50IEludGVyZmFjZSBkZXZpY2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVAorCWhlbHAKKwkgIE1vc3QgZXRoZXJuZXQgY29udHJvbGxlcnMgaGF2ZSBNSUkgdHJhbnNjZWl2ZXIgZWl0aGVyIGFzIGFuIGV4dGVybmFsCisJICBvciBpbnRlcm5hbCBkZXZpY2UuICBJdCBpcyBzYWZlIHRvIHNheSBZIG9yIE0gaGVyZSBldmVuIGlmIHlvdXIKKwkgIGV0aGVybmV0IGNhcmQgbGFjayBNSUkuCisKK3NvdXJjZSAiZHJpdmVycy9uZXQvYXJtL0tjb25maWciCisKK2NvbmZpZyBNQUNFCisJdHJpc3RhdGUgIk1BQ0UgKFBvd2VyIE1hYyBldGhlcm5ldCkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBQUENfUE1BQyAmJiBQUEMzMgorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIFBvd2VyIE1hY2ludG9zaGVzIGFuZCBjbG9uZXMgd2l0aCBFdGhlcm5ldCBidWlsdC1pbiBvbiB0aGUKKwkgIG1vdGhlcmJvYXJkIHdpbGwgdXN1YWxseSB1c2UgYSBNQUNFIChNZWRpdW0gQWNjZXNzIENvbnRyb2wgZm9yCisJICBFdGhlcm5ldCkgaW50ZXJmYWNlLiBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBNQUNFIGNoaXAuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1hY2UuCisKK2NvbmZpZyBNQUNFX0FBVUlfUE9SVAorCWJvb2wgIlVzZSBBQVVJIHBvcnQgaW5zdGVhZCBvZiBUUCBieSBkZWZhdWx0IgorCWRlcGVuZHMgb24gTUFDRQorCWhlbHAKKwkgIFNvbWUgQXBwbGUgbWFjaGluZXMgKG5vdGFibHkgdGhlIEFwcGxlIE5ldHdvcmsgU2VydmVyKSB3aGljaCB1c2UgdGhlCisJICBNQUNFIGV0aGVybmV0IGNoaXAgaGF2ZSBhbiBBcHBsZSBBVUkgcG9ydCAoc21hbGwgMTUtcGluIGNvbm5lY3RvciksCisJICBpbnN0ZWFkIG9mIGFuIDgtcGluIFJKNDUgY29ubmVjdG9yIGZvciB0d2lzdGVkLXBhaXIgZXRoZXJuZXQuICBTYXkKKwkgIFkgaGVyZSBpZiB5b3UgaGF2ZSBzdWNoIGEgbWFjaGluZS4gIElmIHVuc3VyZSwgc2F5IE4uCisJICBUaGUgZHJpdmVyIHdpbGwgZGVmYXVsdCB0byBBQVVJIG9uIEFOUyBhbnl3YXksIGFuZCBpZiB5b3UgdXNlIGl0IGFzCisJICBhIG1vZHVsZSwgeW91IGNhbiBwcm92aWRlIHRoZSBwb3J0X2FhdWk9MHwxIHRvIGZvcmNlIHRoZSBkcml2ZXIuCisKK2NvbmZpZyBCTUFDCisJdHJpc3RhdGUgIkJNQUMgKEczIGV0aGVybmV0KSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFBQQ19QTUFDICYmIFBQQzMyCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgU2F5IFkgZm9yIHN1cHBvcnQgb2YgQk1BQyBFdGhlcm5ldCBpbnRlcmZhY2VzLiBUaGVzZSBhcmUgdXNlZCBvbiBHMworCSAgY29tcHV0ZXJzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBibWFjLgorCitjb25maWcgT0FLTkVUCisJdHJpc3RhdGUgIk5hdGlvbmFsIERQODM5MDJBViAoT2FrIGV0aGVybmV0KSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFBQQyAmJiBCUk9LRU4KKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBTYXkgWSBpZiB5b3VyIG1hY2hpbmUgaGFzIHRoaXMgdHlwZSBvZiBFdGhlcm5ldCBuZXR3b3JrIGNhcmQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG9ha25ldC4KKworY29uZmlnIEFSSUFETkUKKwl0cmlzdGF0ZSAiQXJpYWRuZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFpPUlJPCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBWaWxsYWdlIFRyb25pYyBBcmlhZG5lIEV0aGVybmV0IGFkYXB0ZXIsIHNheSBZLgorCSAgT3RoZXJ3aXNlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYXJpYWRuZS4KKworY29uZmlnIEEyMDY1CisJdHJpc3RhdGUgIkEyMDY1IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgWk9SUk8KKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIENvbW1vZG9yZSBBMjA2NSBFdGhlcm5ldCBhZGFwdGVyLCBzYXkgWS4gT3RoZXJ3aXNlLAorCSAgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGEyMDY1LgorCitjb25maWcgSFlEUkEKKwl0cmlzdGF0ZSAiSHlkcmEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBaT1JSTworCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgSHlkcmEgRXRoZXJuZXQgYWRhcHRlciwgc2F5IFkuIE90aGVyd2lzZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGh5ZHJhLgorCitjb25maWcgWk9SUk84MzkwCisJdHJpc3RhdGUgIlpvcnJvIE5TODM5MC1iYXNlZCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFpPUlJPCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgVGhpcyBkcml2ZXIgaXMgZm9yIFpvcnJvIEV0aGVybmV0IGNhcmRzIHVzaW5nIGFuIE5TODM5MC1jb21wYXRpYmxlCisJICBjaGlwc2V0LCBsaWtlIHRoZSBWaWxsYWdlIFRyb25pYyBBcmlhZG5lIElJIGFuZCB0aGUgSW5kaXZpZHVhbAorCSAgQ29tcHV0ZXJzIFgtU3VyZiBFdGhlcm5ldCBjYXJkcy4gSWYgeW91IGhhdmUgc3VjaCBhIGNhcmQsIHNheSBZLgorCSAgT3RoZXJ3aXNlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgem9ycm84MzkwLgorCitjb25maWcgQVBORQorCXRyaXN0YXRlICJQQ01DSUEgTkUyMDAwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgQU1JR0FfUENNQ0lBCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBQQ01DSUEgTkUyMDAwIGNvbXBhdGlibGUgYWRhcHRlciwgc2F5IFkuICBPdGhlcndpc2UsCisJICBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYXBuZS4KKworY29uZmlnIEFQT0xMT19FTFBMVVMKKwl0cmlzdGF0ZSAiQXBvbGxvIDNjNTA1IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgQVBPTExPCisJaGVscAorCSAgU2F5IFkgb3IgTSBoZXJlIGlmIHlvdXIgQXBvbGxvIGhhcyBhIDNDb20gM2M1MDUgSVNBIEV0aGVybmV0IGNhcmQuCisJICBJZiB5b3UgZG9uJ3QgaGF2ZSBvbmUgbWFkZSBmb3IgQXBvbGxvcywgeW91IGNhbiB1c2Ugb25lIGZyb20gYSBQQywKKwkgIGV4Y2VwdCB0aGF0IHlvdXIgQXBvbGxvIHdvbid0IGJlIGFibGUgdG8gYm9vdCBmcm9tIGl0IChiZWNhdXNlIHRoZQorCSAgY29kZSBpbiB0aGUgUk9NIHdpbGwgYmUgZm9yIGEgUEMpLgorCitjb25maWcgTUFDODM5MAorCWJvb2wgIk1hY2ludG9zaCBOUyA4MzkwIGJhc2VkIGV0aGVybmV0IGNhcmRzIgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIE1BQworCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGluY2x1ZGUgYSBkcml2ZXIgdG8gc3VwcG9ydCBOdWJ1cyBvciBMQy1QRFMKKwkgIEV0aGVybmV0IGNhcmRzIHVzaW5nIGFuIE5TODM5MCBjaGlwc2V0IG9yIGl0cyBlcXVpdmFsZW50LCBzYXkgWQorCSAgYW5kIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworY29uZmlnIE1BQzg5eDAKKwl0cmlzdGF0ZSAiTWFjaW50b3NoIENTODl4MCBiYXNlZCBldGhlcm5ldCBjYXJkcyIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBNQUMgJiYgQlJPS0VOCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgQ1M4OXgwIGNoaXBzZXQgYmFzZWQgRXRoZXJuZXQgY2FyZHMuICBJZiB5b3UgaGF2ZSBhCisJICBOdWJ1cyBvciBMQy1QRFMgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQKKwkgIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGlzIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbWFjODl4MC4KKworY29uZmlnIE1BQ1NPTklDCisJdHJpc3RhdGUgIk1hY2ludG9zaCBTT05JQyBiYXNlZCBldGhlcm5ldCAob25ib2FyZCwgTnVCdXMsIExDLCBDUykiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgTUFDCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgTmF0U2VtaSBTT05JQyBiYXNlZCBFdGhlcm5ldCBkZXZpY2VzLiAgVGhpcyBpbmNsdWRlcworCSAgdGhlIG9uYm9hcmQgRXRoZXJuZXQgaW4gbWFueSBRdWFkcmFzIGFzIHdlbGwgYXMgc29tZSBMQy1QRFMsCisJICBhIGZldyBOdWJ1cyBhbmQgYWxsIGtub3duIENvbW0gU2xvdCBFdGhlcm5ldCBjYXJkcy4gIElmIHlvdSBoYXZlCisJICBvbmUgb2YgdGhlc2Ugc2F5IFkgYW5kIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGlzIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbWFjc29uaWMuCisKK2NvbmZpZyBNQUNNQUNFCisJYm9vbCAiTWFjaW50b3NoIChBVikgb25ib2FyZCBNQUNFIGV0aGVybmV0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIE1BQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgb25ib2FyZCBBTUQgNzlDOTQwIE1BQ0UgRXRoZXJuZXQgY29udHJvbGxlciB1c2VkIGluCisJICB0aGUgNjYwQVYgYW5kIDg0MEFWIE1hY2ludG9zaC4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBNYWNpbnRvc2hlcworCSAgc2F5IFkgYW5kIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworY29uZmlnIE1WTUUxNDdfTkVUCisJdHJpc3RhdGUgIk1WTUUxNDcgKExhbmNlKSBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIE1WTUUxNDcKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgb24tYm9hcmQgRXRoZXJuZXQgaW50ZXJmYWNlIG9uIHRoZSBNb3Rvcm9sYSBNVk1FMTQ3CisJICBzaW5nbGUtYm9hcmQgY29tcHV0ZXIuICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgdGhlCisJICBkcml2ZXIgZm9yIHRoaXMgY2hpcCBpbiB5b3VyIGtlcm5lbC4KKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCisKK2NvbmZpZyBNVk1FMTZ4X05FVAorCXRyaXN0YXRlICJNVk1FMTZ4IEV0aGVybmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgTVZNRTE2eAorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIEV0aGVybmV0IGludGVyZmFjZSBvbiB0aGUgTW90b3JvbGEKKwkgIE1WTUUxNjIsIDE2NiwgMTY3LCAxNzIgYW5kIDE3NyBib2FyZHMuICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgdGhlCisJICBkcml2ZXIgZm9yIHRoaXMgY2hpcCBpbiB5b3VyIGtlcm5lbC4KKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCisKK2NvbmZpZyBCVk1FNjAwMF9ORVQKKwl0cmlzdGF0ZSAiQlZNRTYwMDAgRXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBCVk1FNjAwMAorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIEV0aGVybmV0IGludGVyZmFjZSBvbiBCVk1FNDAwMCBhbmQKKwkgIEJWTUU2MDAwIFZNRSBib2FyZHMuICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgdGhlIGRyaXZlciBmb3IgdGhpcyBjaGlwCisJICBpbiB5b3VyIGtlcm5lbC4KKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCisKK2NvbmZpZyBBVEFSSUxBTkNFCisJdHJpc3RhdGUgIkF0YXJpIExhbmNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgQVRBUkkKKwloZWxwCisJICBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHNldmVyYWwgQXRhcmkgRXRoZXJuZXQgYWRhcHRlcnMgYmFzZWQKKwkgIG9uIHRoZSBBTUQgTGFuY2UgY2hpcHNldDogUmllYmxDYXJkICh3aXRoIG9yIHdpdGhvdXQgYmF0dGVyeSksIG9yCisJICBQQU1DYXJkIFZNRSAoYWxzbyB0aGUgdmVyc2lvbiBieSBSaG90cm9uLCB3aXRoIGRpZmZlcmVudCBhZGRyZXNzZXMpLgorCitjb25maWcgQVRBUklfQklPTkVUCisJdHJpc3RhdGUgIkJpb05ldC0xMDAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBBVEFSSSAmJiBBVEFSSV9BQ1NJICYmIEJST0tFTgorCWhlbHAKKwkgIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgQmlvRGF0YSdzIEJpb05ldC0xMDAgRXRoZXJuZXQgYWRhcHRlcgorCSAgZm9yIHRoZSBBQ1NJIHBvcnQuIFRoZSBkcml2ZXIgd29ya3MgKGhhcyB0byB3b3JrLi4uKSB3aXRoIGEgcG9sbGVkCisJICBJL08gc2NoZW1lLCBzbyBpdCdzIHJhdGhlciBzbG93IDotKAorCitjb25maWcgQVRBUklfUEFNU05FVAorCXRyaXN0YXRlICJQQU1zTmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgQVRBUkkgJiYgQVRBUklfQUNTSSAmJiBCUk9LRU4KKwloZWxwCisJICBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBQQU1zTmV0IEV0aGVybmV0IGFkYXB0ZXIgZm9yIHRoZQorCSAgQUNTSSBwb3J0ICgiQUNTSSBub2RlIikuIFRoZSBkcml2ZXIgd29ya3MgKGhhcyB0byB3b3JrLi4uKSB3aXRoIGEKKwkgIHBvbGxlZCBJL08gc2NoZW1lLCBzbyBpdCdzIHJhdGhlciBzbG93IDotKAorCitjb25maWcgU1VOM0xBTkNFCisJdHJpc3RhdGUgIlN1bjMvU3VuM3ggb24tYm9hcmQgTEFOQ0Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoU1VOMyB8fCBTVU4zWCkKKwloZWxwCisJICBNb3N0IFN1bjMgYW5kIFN1bjN4IG1vdGhlcmJvYXJkcyAoaW5jbHVkaW5nIHRoZSAzLzUwLCAzLzYwIGFuZCAzLzgwKQorCSAgZmVhdHVyZWQgYW4gQU1EIExhbmNlIDEwTWJpdCBFdGhlcm5ldCBjb250cm9sbGVyIG9uIGJvYXJkOyBzYXkgWQorCSAgaGVyZSB0byBjb21waWxlIGluIHRoZSBMaW51eCBkcml2ZXIgZm9yIHRoaXMgYW5kIGVuYWJsZSBFdGhlcm5ldC4KKwkgIEdlbmVyYWwgTGludXggaW5mb3JtYXRpb24gb24gdGhlIFN1biAzIGFuZCAzeCBzZXJpZXMgKG5vdworCSAgZGlzY29udGludWVkKSBpcyBhdAorCSAgPGh0dHA6Ly93d3cuYW5nZWxmaXJlLmNvbS9jYTIvdGVjaDY4ay9zdW4zLmh0bWw+LgorCisJICBJZiB5b3UncmUgbm90IGJ1aWxkaW5nIGEga2VybmVsIGZvciBhIFN1biAzLCBzYXkgTi4KKworY29uZmlnIFNVTjNfODI1ODYKKwl0cmlzdGF0ZSAiU3VuMyBvbi1ib2FyZCBJbnRlbCA4MjU4NiBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFNVTjMKKwloZWxwCisJICBUaGlzIGRyaXZlciBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBvbi1ib2FyZCBJbnRlbCA4MjU4NiBiYXNlZAorCSAgRXRoZXJuZXQgYWRhcHRlciBmb3VuZCBvbiBTdW4gMy8xeHggYW5kIDMvMnh4IG1vdGhlcmJvYXJkcy4gIE5vdGUKKwkgIHRoYXQgdGhpcyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCA4MjU4Ni1iYXNlZCBhZGFwdGVycyBvbiBhZGRpdGlvbmFsCisJICBWTUUgYm9hcmRzLgorCitjb25maWcgSFBMQU5DRQorCWJvb2wgIkhQIG9uLWJvYXJkIExBTkNFIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgRElPCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBidWlsdGluICJMQU5DRSIgRXRoZXJuZXQgY29udHJvbGxlciBvbiBhbgorCSAgSFAzMDAgbWFjaGluZSwgc2F5IFkgaGVyZS4KKworY29uZmlnIExBU0lfODI1OTYKKwl0cmlzdGF0ZSAiTGFzaSBldGhlcm5ldCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBQQVJJU0MgJiYgR1NDX0xBU0kKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIG9uLWJvYXJkIEludGVsIDgyNTk2IGV0aGVybmV0IGNvbnRyb2xsZXIKKwkgIGJ1aWx0IGludG8gSGV3bGV0dC1QYWNrYXJkIFBBLVJJU0MgbWFjaGluZXMuCisKK2NvbmZpZyBNSVBTX0pBWlpfU09OSUMKKwl0cmlzdGF0ZSAiTUlQUyBKQVpaIG9uYm9hcmQgU09OSUMgRXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBNQUNIX0pBWloKKwloZWxwCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBvbmJvYXJkIGNhcmQgb2YgTUlQUyBNYWdudW0gNDAwMCwKKwkgIEFjZXIgUElDQSwgT2xpdmV0dGkgTTcwMC0xMCBhbmQgYSBmZXcgb3RoZXIgaWRlbnRpY2FsIE9FTSBzeXN0ZW1zLgorCitjb25maWcgTUlQU19HVDk2MTAwRVRICisJYm9vbCAiTUlQUyBHVDk2MTAwIEV0aGVybmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgTUlQU19HVDk2MTAwCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBFdGhlcm5ldCBzdWJzeXN0ZW0gb24geW91ciBHVDk2MTAwIGNhcmQuCisKK2NvbmZpZyBNSVBTX0FVMVgwMF9FTkVUCisJYm9vbCAiTUlQUyBBVTEwMDAgRXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBTT0NfQVUxWDAwCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgSWYgeW91IGhhdmUgYW4gQWxjaGVteSBTZW1pIEFVMVgwMCBiYXNlZCBzeXN0ZW0KKwkgIHNheSBZLiAgT3RoZXJ3aXNlLCBzYXkgTi4KKworY29uZmlnIE5FVF9TQjEyNTBfTUFDCisJdHJpc3RhdGUgIlNCMTI1MCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFNJQllURV9TQjF4eHhfU09DCisKK2NvbmZpZyBTR0lfSU9DM19FVEgKKwlib29sICJTR0kgSU9DMyBFdGhlcm5ldCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBQQ0kgJiYgU0dJX0lQMjcKKwlzZWxlY3QgQ1JDMzIKKwlzZWxlY3QgTUlJCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCitjb25maWcgU0dJX0lPQzNfRVRIX0hXX1JYX0NTVU0KKwlib29sICJSZWNlaXZlIGhhcmR3YXJlIGNoZWNrc3VtcyIKKwlkZXBlbmRzIG9uIFNHSV9JT0MzX0VUSCAmJiBJTkVUCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIFNHSSBJT0MzIG5ldHdvcmsgYWRhcHRlciBzdXBwb3J0cyBUQ1AgYW5kIFVEUCBjaGVja3N1bXMgaW4KKwkgIGhhcmR3YXJlIHRvIG9mZmxvYWQgcHJvY2Vzc2luZyBvZiB0aGVzZSBjaGVja3N1bXMgZnJvbSB0aGUgQ1BVLiAgQXQKKwkgIHRoZSBtb21lbnQgb25seSBhY2NlbGVyYXRpb24gb2YgSVB2NCBpcyBzdXBwb3J0ZWQuICBUaGlzIG9wdGlvbgorCSAgZW5hYmxlcyBvZmZsb2FkaW5nIGZvciBjaGVja3N1bXMgb24gcmVjZWl2ZS4gIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBTR0lfSU9DM19FVEhfSFdfVFhfQ1NVTQorCWJvb2wgIlRyYW5zbWl0IGhhcmR3YXJlIGNoZWNrc3VtcyIKKwlkZXBlbmRzIG9uIFNHSV9JT0MzX0VUSCAmJiBJTkVUCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIFNHSSBJT0MzIG5ldHdvcmsgYWRhcHRlciBzdXBwb3J0cyBUQ1AgYW5kIFVEUCBjaGVja3N1bXMgaW4KKwkgIGhhcmR3YXJlIHRvIG9mZmxvYWQgcHJvY2Vzc2luZyBvZiB0aGVzZSBjaGVja3N1bXMgZnJvbSB0aGUgQ1BVLiAgQXQKKwkgIHRoZSBtb21lbnQgb25seSBhY2NlbGVyYXRpb24gb2YgSVB2NCBpcyBzdXBwb3J0ZWQuICBUaGlzIG9wdGlvbgorCSAgZW5hYmxlcyBvZmZsb2FkaW5nIGZvciBjaGVja3N1bXMgb24gdHJhbnNtaXQuICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgU0dJX08yTUFDRV9FVEgKKwl0cmlzdGF0ZSAiU0dJIE8yIE1BQ0UgRmFzdCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFNHSV9JUDMyPXkKKworY29uZmlnIFNUTklDCisJdHJpc3RhdGUgIk5hdGlvbmFsIERQODM5MDJBViAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBTVVBFUkgKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBTdXBwb3J0IGZvciBjYXJkcyBiYXNlZCBvbiB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBEUDgzOTAyQVYKKwkgIFNULU5JQyBTZXJpYWwgTmV0d29yayBJbnRlcmZhY2UgQ29udHJvbGxlciBmb3IgVHdpc3RlZCBQYWlyLiAgVGhpcworCSAgaXMgYSAxME1iaXQvc2VjIEV0aGVybmV0IGNvbnRyb2xsZXIuICBQcm9kdWN0IG92ZXJ2aWV3IGFuZCBzcGVjcyBhdAorCSAgPGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0RQL0RQODM5MDJBLmh0bWw+LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU1VOTEFOQ0UKKwl0cmlzdGF0ZSAiU3VuIExBTkNFIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgU0JVUworCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSAibGUiIGludGVyZmFjZSBwcmVzZW50IG9uIGFsbCAzMi1iaXQgU3BhcmMKKwkgIHN5c3RlbXMsIG9uIHNvbWUgb2xkZXIgVWx0cmEgc3lzdGVtcyBhbmQgYXMgYW4gU2J1cyBvcHRpb24uICBUaGVzZQorCSAgY2FyZHMgYXJlIGJhc2VkIG9uIHRoZSBBTUQgTGFuY2UgY2hpcHNldCwgd2hpY2ggaXMgYmV0dGVyIGtub3duCisJICB2aWEgdGhlIE5FMjEwMCBjYXJkcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc3VubGFuY2UuCisKK2NvbmZpZyBIQVBQWU1FQUwKKwl0cmlzdGF0ZSAiU3VuIEhhcHB5IE1lYWwgMTAvMTAwYmFzZVQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoU0JVUyB8fCBQQ0kpCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlICJobWUiIGludGVyZmFjZSBwcmVzZW50IG9uIG1vc3QgVWx0cmEKKwkgIHN5c3RlbXMgYW5kIGFzIGFuIG9wdGlvbiBvbiBvbGRlciBTYnVzIHN5c3RlbXMuIFRoaXMgZHJpdmVyIHN1cHBvcnRzCisJICBib3RoIFBDSSBhbmQgU2J1cyBkZXZpY2VzLiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIHRoZSAicWZlIiBxdWFkCisJICAxMDBiYXNlVCBkZXZpY2UgYXZhaWxhYmxlIGluIGJvdGggUENJIGFuZCBTYnVzIGNvbmZpZ3VyYXRpb25zLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzdW5obWUuCisKK2NvbmZpZyBTVU5CTUFDCisJdHJpc3RhdGUgIlN1biBCaWdNQUMgMTAvMTAwYmFzZVQgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBTQlVTICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSAiYmUiIGludGVyZmFjZSBhdmFpbGFibGUgYXMgYW4gU2J1cyBvcHRpb24uCisJICBUaGlzIGlzIFN1bidzIG9sZGVyIDEwMGJhc2VUIEV0aGVybmV0IGRldmljZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc3VuYm1hYy4KKworY29uZmlnIFNVTlFFCisJdHJpc3RhdGUgIlN1biBRdWFkRXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBTQlVTCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlICJxZSIgMTBiYXNlVCBFdGhlcm5ldCBkZXZpY2UsIGF2YWlsYWJsZSBhcworCSAgYW4gU2J1cyBvcHRpb24uIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBRdWFkIEZhc3RFdGhlcm5ldAorCSAgInFmZSIgd2hpY2ggaXMgc3VwcG9ydGVkIGJ5IHRoZSBIYXBweSBNZWFsIGRyaXZlciBpbnN0ZWFkLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzdW5xZS4KKworY29uZmlnIFNVTkdFTQorCXRyaXN0YXRlICJTdW4gR0VNIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgUENJCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIFN1biBHRU0gY2hpcCwgYWthIFN1biBHaWdhYml0RXRoZXJuZXQvUCAyLjAuICBTZWUgYWxzbworCSAgPGh0dHA6Ly93d3cuc3VuLmNvbS9wcm9kdWN0cy1uLXNvbHV0aW9ucy9oYXJkd2FyZS9kb2NzL3BkZi84MDYtMzk4NS0xMC5wZGY+LgorCitjb25maWcgTkVUX1ZFTkRPUl8zQ09NCisJYm9vbCAiM0NPTSBjYXJkcyIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoSVNBIHx8IEVJU0EgfHwgTUNBIHx8IFBDSSkKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIGJlbG9uZ2luZyB0byB0aGlzIGNsYXNzLCBzYXkgWQorCSAgYW5kIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgTm90ZSB0aGF0IHRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiBkb2Vzbid0IGRpcmVjdGx5IGFmZmVjdCB0aGUKKwkgIGtlcm5lbDogc2F5aW5nIE4gd2lsbCBqdXN0IGNhdXNlIHRoZSBjb25maWd1cmF0b3IgdG8gc2tpcCBhbGwKKwkgIHRoZSBxdWVzdGlvbnMgYWJvdXQgM0NPTSBjYXJkcy4gSWYgeW91IHNheSBZLCB5b3Ugd2lsbCBiZSBhc2tlZCBmb3IKKwkgIHlvdXIgc3BlY2lmaWMgY2FyZCBpbiB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KKworY29uZmlnIEVMMQorCXRyaXN0YXRlICIzYzUwMSBcIkV0aGVyTGlua1wiIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfVkVORE9SXzNDT00gJiYgSVNBCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiAgQWxzbywgY29uc2lkZXIgYnV5aW5nIGEKKwkgIG5ldyBjYXJkLCBzaW5jZSB0aGUgM2M1MDEgaXMgc2xvdywgYnJva2VuLCBhbmQgb2Jzb2xldGU6IHlvdSB3aWxsCisJICBoYXZlIHByb2JsZW1zLiAgU29tZSBwZW9wbGUgc3VnZ2VzdCB0byBwaW5nICgibWFuIHBpbmciKSBhIG5lYXJieQorCSAgbWFjaGluZSBldmVyeSBtaW51dGUgKCJtYW4gY3JvbiIpIHdoZW4gdXNpbmcgdGhpcyBjYXJkLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgM2M1MDEuCisKK2NvbmZpZyBFTDIKKwl0cmlzdGF0ZSAiM2M1MDMgXCJFdGhlckxpbmsgSUlcIiBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1ZFTkRPUl8zQ09NICYmIElTQQorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDNjNTAzLgorCitjb25maWcgRUxQTFVTCisJdHJpc3RhdGUgIjNjNTA1IFwiRXRoZXJMaW5rIFBsdXNcIiBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1ZFTkRPUl8zQ09NICYmIElTQQorCS0tLWhlbHAtLS0KKwkgIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgY2FuIGJlIGZvdW5kIGluCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvM2M1MDUudHh0Pi4gIElmIHlvdSBoYXZlIGEgY2FyZCBvZgorCSAgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgM2M1MDUuCisKK2NvbmZpZyBFTDE2CisJdHJpc3RhdGUgIjNjNTA3IFwiRXRoZXJMaW5rIDE2XCIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfM0NPTSAmJiBJU0EgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgM2M1MDcuCisKK2NvbmZpZyBFTDMKKwl0cmlzdGF0ZSAiM2M1MDkvM2M1MjkgKE1DQSkvM2M1NzkgXCJFdGhlckxpbmsgSUlJXCIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfM0NPTSAmJiAoSVNBIHx8IEVJU0EgfHwgTUNBKQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgYmVsb25naW5nIHRvIHRoZSAzQ29tCisJICBFdGhlckxpbmtJSUkgc2VyaWVzLCBzYXkgWSBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZQorCSAgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBJZiB5b3VyIGNhcmQgaXMgbm90IHdvcmtpbmcgeW91IG1heSBuZWVkIHRvIHVzZSB0aGUgRE9TCisJICBzZXR1cCBkaXNrIHRvIGRpc2FibGUgUGx1ZyAmIFBsYXkgbW9kZSwgYW5kIHRvIHNlbGVjdCB0aGUgZGVmYXVsdAorCSAgbWVkaWEgdHlwZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDNjNTA5LgorCitjb25maWcgM0M1MTUKKwl0cmlzdGF0ZSAiM2M1MTUgSVNBIFwiRmFzdCBFdGhlckxpbmtcIiIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfM0NPTSAmJiAoSVNBIHx8IEVJU0EpCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSAzQ29tIElTQSBFdGhlckxpbmsgWEwgIkNvcmtzY3JldyIgM2M1MTUgRmFzdCBFdGhlcm5ldAorCSAgbmV0d29yayBjYXJkLCBzYXkgWSBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgM2M1MTUuCisKK2NvbmZpZyBFTE1DCisJdHJpc3RhdGUgIjNjNTIzIFwiRXRoZXJMaW5rL01DXCIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfM0NPTSAmJiBNQ0FfTEVHQUNZCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgM2M1MjMuCisKK2NvbmZpZyBFTE1DX0lJCisJdHJpc3RhdGUgIjNjNTI3IFwiRXRoZXJMaW5rL01DIDMyXCIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfM0NPTSAmJiBNQ0EgJiYgTUNBX0xFR0FDWQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDNjNTI3LgorCitjb25maWcgVk9SVEVYCisJdHJpc3RhdGUgIjNjNTkwLzNjOTAwIHNlcmllcyAoNTkyLzU5NS81OTcpIFwiVm9ydGV4L0Jvb21lcmFuZ1wiIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfVkVORE9SXzNDT00gJiYgKFBDSSB8fCBFSVNBKQorCXNlbGVjdCBNSUkKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGRyaXZlciBzdXBwb3J0IGZvciBhIGxhcmdlIG51bWJlciBvZiAxMG1icHMgYW5kCisJICAxMC8xMDBtYnBzIEVJU0EsIFBDSSBhbmQgUENNQ0lBIDNDb20gbmV0d29yayBjYXJkczoKKworCSAgIlZvcnRleCIgICAgKEZhc3QgRXRoZXJMaW5rIDNjNTkwLzNjNTkyLzNjNTk1LzNjNTk3KSBFSVNBIGFuZCBQQ0kKKwkgICJCb29tZXJhbmciIChFdGhlckxpbmsgWEwgM2M5MDAgb3IgM2M5MDUpICAgICAgICAgICAgUENJCisJICAiQ3ljbG9uZSIgICAoM2M1NDAvM2M5MDAvM2M5MDUvM2M5ODAvM2M1NzUvM2M2NTYpICAgIFBDSSBhbmQgQ2FyZGJ1cworCSAgIlRvcm5hZG8iICAgKDNjOTA1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0kKKwkgICJIdXJyaWNhbmUiICgzYzU1NS8zY1NPSE8pICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJCisKKwkgIElmIHlvdSBoYXZlIHN1Y2ggYSBjYXJkLCBzYXkgWSBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiBNb3JlCisJICBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBpbgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3ZvcnRleC50eHQ+IGFuZCBpbiB0aGUgY29tbWVudHMgYXQKKwkgIHRoZSBiZWdpbm5pbmcgb2YgPGZpbGU6ZHJpdmVycy9uZXQvM2M1OXguYz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4KKworY29uZmlnIFRZUEhPT04KKwl0cmlzdGF0ZSAiM2NyOTkwIHNlcmllcyBcIlR5cGhvb25cIiBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1ZFTkRPUl8zQ09NICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZHJpdmVyIHN1cHBvcnQgZm9yIHRoZSAzY3I5OTAgc2VyaWVzIG9mIGNhcmRzOgorCisJICAzQzk5MC1UWCwgM0NSOTkwLVRYLTk1LCAzQ1I5OTAtVFgtOTcsIDNDUjk5MC1GWC05NSwgM0NSOTkwLUZYLTk3LAorCSAgM0NSOTkwU1ZSLCAzQ1I5OTBTVlI5NSwgM0NSOTkwU1ZSOTcsIDNDUjk5MC1GWC05NSBTZXJ2ZXIsCisJICAzQ1I5OTAtRlgtOTcgU2VydmVyLCAzQzk5MEItVFgtTSwgM0M5OTBCU1ZSCisKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHR5cGhvb24uCisKK2NvbmZpZyBMQU5DRQorCXRyaXN0YXRlICJBTUQgTEFOQ0UgYW5kIFBDbmV0IChBVDE1MDAgYW5kIE5FMjEwMCkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBJU0EKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uIFNvbWUgTGlua1N5cyBjYXJkcyBhcmUKKwkgIG9mIHRoaXMgdHlwZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbGFuY2UuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgTkVUX1ZFTkRPUl9TTUMKKwlib29sICJXZXN0ZXJuIERpZ2l0YWwvU01DIGNhcmRzIgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIChJU0EgfHwgTUNBIHx8IEVJU0EgfHwgTUFDKQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgYmVsb25naW5nIHRvIHRoaXMgY2xhc3MsIHNheSBZCisJICBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIGRvZXNuJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBXZXN0ZXJuIERpZ2l0YWwgY2FyZHMuIElmIHlvdSBzYXkgWSwgeW91IHdpbGwgYmUKKwkgIGFza2VkIGZvciB5b3VyIHNwZWNpZmljIGNhcmQgaW4gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuCisKK2NvbmZpZyBXRDgweDMKKwl0cmlzdGF0ZSAiV0Q4MCozIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfVkVORE9SX1NNQyAmJiBJU0EKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB3ZC4KKworY29uZmlnIFVMVFJBTUNBCisJdHJpc3RhdGUgIlNNQyBVbHRyYSBNQ0Egc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfU01DICYmIE1DQQorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlIGFuZCBhcmUgcnVubmluZworCSAgYW4gTUNBIGJhc2VkIHN5c3RlbSAoUFMvMiksIHNheSBZIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbWMtbWNhLgorCitjb25maWcgVUxUUkEKKwl0cmlzdGF0ZSAiU01DIFVsdHJhIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfVkVORE9SX1NNQyAmJiBJU0EKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIEltcG9ydGFudDogVGhlcmUgaGF2ZSBiZWVuIG1hbnkgcmVwb3J0cyB0aGF0LCB3aXRoIHNvbWUgbW90aGVyYm9hcmRzCisJICBtaXhpbmcgYW4gU01DIFVsdHJhIGFuZCBhbiBBZGFwdGVjIEFIQTE1NHggU0NTSSBjYXJkIChvciBjb21wYXRpYmxlLAorCSAgc3VjaCBhcyBzb21lIEJ1c0xvZ2ljIG1vZGVscykgY2F1c2VzIGNvcnJ1cHRpb24gcHJvYmxlbXMgd2l0aCBtYW55CisJICBvcGVyYXRpbmcgc3lzdGVtcy4gVGhlIExpbnV4IHNtYy11bHRyYSBkcml2ZXIgaGFzIGEgd29yay1hcm91bmQgZm9yCisJICB0aGlzIGJ1dCBrZWVwIGl0IGluIG1pbmQgaWYgeW91IGhhdmUgc3VjaCBhIFNDU0kgY2FyZCBhbmQgaGF2ZQorCSAgcHJvYmxlbXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbWMtdWx0cmEuCisKK2NvbmZpZyBVTFRSQTMyCisJdHJpc3RhdGUgIlNNQyBVbHRyYTMyIEVJU0Egc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfU01DICYmIEVJU0EKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbWMtdWx0cmEzMi4KKworY29uZmlnIFNNQzkxWAorCXRyaXN0YXRlICJTTUMgOTFDOXgvOTFDMXh4eCBzdXBwb3J0IgorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBNSUkKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoQVJNIHx8IFJFRFdPT0RfNSB8fCBSRURXT09EXzYgfHwgTTMyUiB8fCBTVVBFUkgpCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgU01DJ3MgOTF4IHNlcmllcyBvZiBFdGhlcm5ldCBjaGlwc2V0cywKKwkgIGluY2x1ZGluZyB0aGUgU01DOTFDOTQgYW5kIHRoZSBTTUM5MUMxMTEuIFNheSBZIGlmIHlvdSB3YW50IGl0CisJICBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwsIGFuZCByZWFkIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc21jOS50eHQ+ICBhbmQgdGhlIEV0aGVybmV0LUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gIDxodHRwOi8vd3d3LmxpbnV4ZG9jLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKKwkgIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KS4KKwkgIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc21jOTF4LiAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhCisJICBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4gYXMgd2VsbAorCSAgYXMgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uCisKK2NvbmZpZyBTTUM5MTk0CisJdHJpc3RhdGUgIlNNQyA5MTk0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfVkVORE9SX1NNQyAmJiAoSVNBIHx8IE1BQyAmJiBCUk9LRU4pCisJc2VsZWN0IENSQzMyCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgU01DOXh4eCBiYXNlZCBFdGhlcm5ldCBjYXJkcy4gQ2hvb3NlIHRoaXMKKwkgIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIERFTEwgbGFwdG9wIHdpdGggdGhlIGRvY2tpbmcgc3RhdGlvbiwgb3IKKwkgIGFub3RoZXIgU01DOTE5Mi85MTk0IGJhc2VkIGNoaXBzZXQuICBTYXkgWSBpZiB5b3Ugd2FudCBpdCBjb21waWxlZAorCSAgaW50byB0aGUga2VybmVsLCBhbmQgcmVhZCB0aGUgZmlsZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NtYzkudHh0PiBhbmQgdGhlIEV0aGVybmV0LUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNtYzkxOTQuCisKK2NvbmZpZyBORVRfVkVORE9SX1JBQ0FMCisJYm9vbCAiUmFjYWwtSW50ZXJsYW4gKE1pY29tKSBOSSBjYXJkcyIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBJU0EKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIGJlbG9uZ2luZyB0byB0aGlzIGNsYXNzLCBzdWNoCisJICBhcyB0aGUgTkk1MDEwLCBOSTUyMTAgb3IgTkk2MjEwLCBzYXkgWSBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIGRvZXNuJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBOSSBjYXJkcy4gSWYgeW91IHNheSBZLCB5b3Ugd2lsbCBiZSBhc2tlZCBmb3IKKwkgIHlvdXIgc3BlY2lmaWMgY2FyZCBpbiB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KKworY29uZmlnIE5JNTAxMAorCXRyaXN0YXRlICJOSTUwMTAgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfUkFDQUwgJiYgSVNBICYmIEVYUEVSSU1FTlRBTCAmJiBCUk9LRU5fT05fU01QCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiBOb3RlIHRoYXQgdGhpcyBpcyBzdGlsbAorCSAgZXhwZXJpbWVudGFsIGNvZGUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBuaTUwMTAuCisKK2NvbmZpZyBOSTUyCisJdHJpc3RhdGUgIk5JNTIxMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1ZFTkRPUl9SQUNBTCAmJiBJU0EKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBuaTUyLgorCitjb25maWcgTkk2NQorCXRyaXN0YXRlICJOSTY1MTAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfUkFDQUwgJiYgSVNBCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbmk2NS4KKworc291cmNlICJkcml2ZXJzL25ldC90dWxpcC9LY29uZmlnIgorCitjb25maWcgQVQxNzAwCisJdHJpc3RhdGUgIkFUMTcwMC8xNzIwIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgKElTQSB8fCBNQ0FfTEVHQUNZKSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhdDE3MDAuCisKK2NvbmZpZyBERVBDQQorCXRyaXN0YXRlICJERVBDQSwgREUxMHgsIERFMjAwLCBERTIwMSwgREUyMDIsIERFNDIyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgKElTQSB8fCBFSVNBIHx8IE1DQSkKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4gYXMgd2VsbCBhcworCSAgPGZpbGU6ZHJpdmVycy9uZXQvZGVwY2EuYz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBkZXBjYS4KKworY29uZmlnIEhQMTAwCisJdHJpc3RhdGUgIkhQIDEwLzEwMFZHIFBDTEFOIChJU0EsIEVJU0EsIFBDSSkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoSVNBIHx8IEVJU0EgfHwgUENJKQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGhwMTAwLgorCitjb25maWcgTkVUX0lTQQorCWJvb2wgIk90aGVyIElTQSBjYXJkcyIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBJU0EKKwktLS1oZWxwLS0tCisJICBJZiB5b3VyIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIGhhc24ndCBiZWVuIG1lbnRpb25lZCB5ZXQgYW5kIGl0cworCSAgYnVzIHN5c3RlbSAodGhhdCdzIHRoZSB3YXkgdGhlIGNhcmRzIHRhbGtzIHRvIHRoZSBvdGhlciBjb21wb25lbnRzCisJICBvZiB5b3VyIGNvbXB1dGVyKSBpcyBJU0EgKGFzIG9wcG9zZWQgdG8gRUlTQSwgVkxCIG9yIFBDSSksIHNheSBZLgorCSAgTWFrZSBzdXJlIHlvdSBrbm93IHRoZSBuYW1lIG9mIHlvdXIgY2FyZC4gUmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCisJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIGRvZXNuJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHJlbWFpbmluZyBJU0EgbmV0d29yayBjYXJkIHF1ZXN0aW9ucy4gSWYgeW91IHNheSBZLCB5b3Ugd2lsbCBiZQorCSAgYXNrZWQgZm9yIHlvdXIgc3BlY2lmaWMgY2FyZCBpbiB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KKworY29uZmlnIEUyMTAwCisJdHJpc3RhdGUgIkNhYmxldHJvbiBFMjF4eCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0lTQQorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGUyMTAwLgorCitjb25maWcgRVdSSzMKKwl0cmlzdGF0ZSAiRXRoZXJXT1JLUyAzIChERTIwMywgREUyMDQsIERFMjA1KSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0lTQQorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBERTIwMywgREUyMDQgYW5kIERFMjA1IG5ldHdvcmsgKEV0aGVybmV0KQorCSAgY2FyZHMuIElmIHRoaXMgaXMgZm9yIHlvdSwgc2F5IFkgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9ld3JrMy50eHQ+IGluIHRoZSBrZXJuZWwgc291cmNlIGFzCisJICB3ZWxsIGFzIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBld3JrMy4KKworY29uZmlnIEVFWFBSRVNTCisJdHJpc3RhdGUgIkV0aGVyRXhwcmVzcyAxNiBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0lTQQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGFuIEV0aGVyRXhwcmVzczE2IG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkLCBzYXkgWSBhbmQKKwkgIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIE5vdGUgdGhhdCB0aGUgSW50ZWwKKwkgIEV0aGVyRXhwcmVzczE2IGNhcmQgdXNlZCB0byBiZSByZWdhcmRlZCBhcyBhIHZlcnkgcG9vciBjaG9pY2UKKwkgIGJlY2F1c2UgdGhlIGRyaXZlciB3YXMgdmVyeSB1bnJlbGlhYmxlLiBXZSBub3cgaGF2ZSBhIG5ldyBkcml2ZXIKKwkgIHRoYXQgc2hvdWxkIGRvIGJldHRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGVleHByZXNzLgorCitjb25maWcgRUVYUFJFU1NfUFJPCisJdHJpc3RhdGUgIkV0aGVyRXhwcmVzc1BybyBzdXBwb3J0L0V0aGVyRXhwcmVzcyAxMCAoaTgyNTk1KSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0lTQQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWS4gVGhpcworCSAgZHJpdmVyIHN1cHBvcnRzIGludGVsIGk4MjU5NXtGWCxUWH0gYmFzZWQgYm9hcmRzLiBOb3RlIGhvd2V2ZXIKKwkgIHRoYXQgdGhlIEV0aGVyRXhwcmVzcyBQUk8vMTAwIEV0aGVybmV0IGNhcmQgaGFzIGl0cyBvd24gc2VwYXJhdGUKKwkgIGRyaXZlci4gIFBsZWFzZSByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBlZXByby4KKworY29uZmlnIEZNVjE4WAorCXRyaXN0YXRlICJGTVYtMTgxLzE4Mi8xODMvMTg0IHN1cHBvcnQgKE9CU09MRVRFKSIKKwlkZXBlbmRzIG9uIE5FVF9JU0EgJiYgT0JTT0xFVEUKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIEZ1aml0c3UgRk1WLTE4MS8xODIvMTgzLzE4NCBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCwKKwkgIHNheSBZIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIElmIHlvdSB1c2UgYW4gRk1WLTE4MyBvciBGTVYtMTg0IGFuZCBpdCBpcyBub3Qgd29ya2luZywgeW91IG1heSBuZWVkCisJICB0byBkaXNhYmxlIFBsdWcgJiBQbGF5IG1vZGUgb2YgdGhlIGNhcmQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBmbXYxOHguCisKK2NvbmZpZyBIUExBTl9QTFVTCisJdHJpc3RhdGUgIkhQIFBDTEFOKyAoMjcyNDdCIGFuZCAyNzI1MkEpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfSVNBCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaHAtcGx1cy4KKworY29uZmlnIEhQTEFOCisJdHJpc3RhdGUgIkhQIFBDTEFOICgyNzI0NSBhbmQgb3RoZXIgMjd4eHggc2VyaWVzKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0lTQQorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGhwLgorCitjb25maWcgTFA0ODZFCisJdHJpc3RhdGUgIkxQNDg2RSBvbiBib2FyZCBFdGhlcm5ldCIKKwlkZXBlbmRzIG9uIE5FVF9JU0EKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIDgyNTk2LWJhc2VkIG9uLWJvYXJkIEV0aGVybmV0IGNvbnRyb2xsZXIKKwkgIGZvciB0aGUgUGFudGhlciBtb3RoZXJib2FyZCwgd2hpY2ggaXMgb25lIG9mIHRoZSB0d28gc2hpcHBlZCBpbiB0aGUKKwkgIEludGVsIFByb2Zlc3Npb25hbCBXb3Jrc3RhdGlvbi4KKworY29uZmlnIEVUSDE2SQorCXRyaXN0YXRlICJJQ0wgRXRoZXJUZWFtIDE2aS8zMiBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0lTQQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGV0aDE2aS4KKworY29uZmlnIE5FMjAwMAorCXRyaXN0YXRlICJORTIwMDAvTkUxMDAwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfSVNBIHx8IChRNDAgJiYgbSkgfHwgTTMyUgorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIE1hbnkgRXRoZXJuZXQgY2FyZHMKKwkgIHdpdGhvdXQgYSBzcGVjaWZpYyBkcml2ZXIgYXJlIGNvbXBhdGlibGUgd2l0aCBORTIwMDAuCisKKwkgIElmIHlvdSBoYXZlIGEgUENJIE5FMjAwMCBjYXJkIGhvd2V2ZXIsIHNheSBOIGhlcmUgYW5kIFkgdG8gIlBDSQorCSAgTkUyMDAwIHN1cHBvcnQiLCBhYm92ZS4gSWYgeW91IGhhdmUgYSBORTIwMDAgY2FyZCBhbmQgYXJlIHJ1bm5pbmcgb24KKwkgIGFuIE1DQSBzeXN0ZW0gKGEgYnVzIHN5c3RlbSB1c2VkIG9uIHNvbWUgSUJNIFBTLzIgY29tcHV0ZXJzIGFuZAorCSAgbGFwdG9wcyksIHNheSBOIGhlcmUgYW5kIFkgdG8gIk5FLzIgKG5lMjAwMCBNQ0EgdmVyc2lvbikgc3VwcG9ydCIsCisJICBiZWxvdy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG5lLgorCitjb25maWcgWk5FVAorCXRyaXN0YXRlICJaZW5pdGggWi1Ob3RlIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfSVNBICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoZSBaZW5pdGggWi1Ob3RlIG5vdGVib29rIGNvbXB1dGVyIGhhcyBhIGJ1aWx0LWluIG5ldHdvcmsKKwkgIChFdGhlcm5ldCkgY2FyZCwgYW5kIHRoaXMgaXMgdGhlIExpbnV4IGRyaXZlciBmb3IgaXQuIE5vdGUgdGhhdCB0aGUKKwkgIElCTSBUaGlua3BhZCAzMDAgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBaLU5vdGUgYW5kIGlzIGFsc28gc3VwcG9ydGVkCisJICBieSB0aGlzIGRyaXZlci4gUmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCitjb25maWcgU0VFUTgwMDUKKwl0cmlzdGF0ZSAiU0VFUTgwMDUgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9JU0EgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNFRVEgODAwNSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZC4gIElmIHRoaXMKKwkgIGlzIGZvciB5b3UsIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNlZXE4MDA1LgorCitjb25maWcgU0tfRzE2CisJdHJpc3RhdGUgIlNLX0cxNiBzdXBwb3J0IChPQlNPTEVURSkiCisJZGVwZW5kcyBvbiBORVRfSVNBICYmIE9CU09MRVRFCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCitjb25maWcgU0tNQworCXRyaXN0YXRlICJTS25ldCBNQ0Egc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBNQ0EgJiYgQlJPS0VOCisJLS0taGVscC0tLQorCSAgVGhlc2UgYXJlIE1pY3JvIENoYW5uZWwgRXRoZXJuZXQgYWRhcHRlcnMuIFlvdSBuZWVkIHRvIHNheSBZIHRvICJNQ0EKKwkgIHN1cHBvcnQiIGluIG9yZGVyIHRvIHVzZSB0aGlzIGRyaXZlci4gIFN1cHBvcnRlZCBjYXJkcyBhcmUgdGhlIFNLbmV0CisJICBKdW5pb3IgTUMyIGFuZCB0aGUgU0tuZXQgTUMyKCspLiAgVGhlIGRyaXZlciBhdXRvbWF0aWNhbGx5CisJICBkaXN0aW5ndWlzaGVzIGJldHdlZW4gdGhlIHR3byBjYXJkcy4gTm90ZSB0aGF0IHVzaW5nIG11bHRpcGxlIGJvYXJkcworCSAgb2YgZGlmZmVyZW50IHR5cGUgaGFzbid0IGJlZW4gdGVzdGVkIHdpdGggdGhpcyBkcml2ZXIuICBTYXkgWSBpZiB5b3UKKwkgIGhhdmUgb25lIG9mIHRoZXNlIEV0aGVybmV0IGFkYXB0ZXJzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc2tfbWNhLgorCitjb25maWcgTkUyX01DQQorCXRyaXN0YXRlICJORS8yIChuZTIwMDAgTUNBIHZlcnNpb24pIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgTUNBX0xFR0FDWQorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG5lMi4KKworY29uZmlnIElCTUxBTkEKKwl0cmlzdGF0ZSAiSUJNIExBTiBBZGFwdGVyL0Egc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBNQ0EgJiYgTUNBX0xFR0FDWQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBNaWNybyBDaGFubmVsIEV0aGVybmV0IGFkYXB0ZXIuICBZb3UgbmVlZCB0byBzZXQKKwkgIENPTkZJR19NQ0EgdG8gdXNlIHRoaXMgZHJpdmVyLiAgSXQgaXMgYm90aCBhdmFpbGFibGUgYXMgYW4gaW4ta2VybmVsCisJICBkcml2ZXIgYW5kIGFzIGEgbW9kdWxlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG9ubHkKKwkgIGN1cnJlbnRseSBzdXBwb3J0ZWQgY2FyZCBpcyB0aGUgSUJNIExBTiBBZGFwdGVyL0EgZm9yIEV0aGVybmV0LiAgSXQKKwkgIHdpbGwgYm90aCBzdXBwb3J0IDE2SyBhbmQgMzJLIG1lbW9yeSB3aW5kb3dzLCBob3dldmVyIGEgMzJLIHdpbmRvdworCSAgZ2l2ZXMgYSBiZXR0ZXIgc2VjdXJpdHkgYWdhaW5zdCBwYWNrZXQgbG9zc2VzLiAgVXNhZ2Ugb2YgbXVsdGlwbGUKKwkgIGJvYXJkcyB3aXRoIHRoaXMgZHJpdmVyIHNob3VsZCBiZSBwb3NzaWJsZSwgYnV0IGhhcyBub3QgYmVlbiB0ZXN0ZWQKKwkgIHVwIHRvIG5vdyBkdWUgdG8gbGFjayBvZiBoYXJkd2FyZS4KKworY29uZmlnIElCTVZFVEgKKwl0cmlzdGF0ZSAiSUJNIExBTiBWaXJ0dWFsIEV0aGVybmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIE5FVF9FVEhFUk5FVCAmJiBQUENfUFNFUklFUworCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHZpcnR1YWwgZXRoZXJuZXQgYWRhcHRlcnMgb24gbmV3ZXIgSUJNIGlTZXJpZXMKKwkgIGFuZCBwU2VyaWVzIHN5c3RlbXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBpYm12ZXRoLgorCitjb25maWcgSUJNX0VNQUMKKwl0cmlzdGF0ZSAiSUJNIFBQQzR4eCBFTUFDIGRyaXZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gNHh4CisJc2VsZWN0IENSQzMyCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIElCTSBQUEM0eHggRU1BQyBmYW1pbHkgb2Ygb24tY2hpcAorCSAgRXRoZXJuZXQgY29udHJvbGxlcnMuCisKK2NvbmZpZyBJQk1fRU1BQ19FUlJNU0cKKwlib29sICJWZXJib3NlIGVycm9yIG1lc3NhZ2VzIgorCWRlcGVuZHMgb24gSUJNX0VNQUMKKworY29uZmlnIElCTV9FTUFDX1JYQgorCWludCAiTnVtYmVyIG9mIHJlY2VpdmUgYnVmZmVycyIKKwlkZXBlbmRzIG9uIElCTV9FTUFDCisJZGVmYXVsdCAiMTI4IiBpZiBJQk1fRU1BQzQKKwlkZWZhdWx0ICI2NCIKKworY29uZmlnIElCTV9FTUFDX1RYQgorCWludCAiTnVtYmVyIG9mIHRyYW5zbWl0IGJ1ZmZlcnMiCisJZGVwZW5kcyBvbiBJQk1fRU1BQworCWRlZmF1bHQgIjEyOCIgaWYgSUJNX0VNQUM0CisJZGVmYXVsdCAiOCIKKworY29uZmlnIElCTV9FTUFDX0ZHQVAKKwlpbnQgIkZyYW1lIGdhcCIKKwlkZXBlbmRzIG9uIElCTV9FTUFDCisJZGVmYXVsdCAiOCIKKworY29uZmlnIElCTV9FTUFDX1NLQlJFUworCWludCAiU2tiIHJlc2VydmUgYW1vdW50IgorCWRlcGVuZHMgb24gSUJNX0VNQUMKKwlkZWZhdWx0ICIwIgorCitjb25maWcgTkVUX1BDSQorCWJvb2wgIkVJU0EsIFZMQiwgUENJIGFuZCBvbiBib2FyZCBjb250cm9sbGVycyIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoSVNBIHx8IEVJU0EgfHwgUENJKQorCWhlbHAKKwkgIFRoaXMgaXMgYW5vdGhlciBjbGFzcyBvZiBuZXR3b3JrIGNhcmRzIHdoaWNoIGF0dGFjaCBkaXJlY3RseSB0byB0aGUKKwkgIGJ1cy4gSWYgeW91IGhhdmUgb25lIG9mIHRob3NlLCBzYXkgWSBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIGRvZXNuJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCB0aGlzIGNsYXNzIG9mIG5ldHdvcmsgY2FyZHMuIElmIHlvdSBzYXkgWSwgeW91CisJICB3aWxsIGJlIGFza2VkIGZvciB5b3VyIHNwZWNpZmljIGNhcmQgaW4gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuIElmCisJICB5b3UgYXJlIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBQQ05FVDMyCisJdHJpc3RhdGUgIkFNRCBQQ25ldDMyIFBDSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kKKwlzZWxlY3QgQ1JDMzIKKwlzZWxlY3QgTUlJCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBQQ25ldDMyIG9yIFBDbmV0UENJIGJhc2VkIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkLAorCSAgYW5zd2VyIFkgaGVyZSBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcGNuZXQzMi4KKworY29uZmlnIEFNRDgxMTFfRVRICisJdHJpc3RhdGUgIkFNRCA4MTExIChuZXcgUENJIGxhbmNlKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kKKwlzZWxlY3QgQ1JDMzIKKwlzZWxlY3QgTUlJCisJaGVscAorCSAgSWYgeW91IGhhdmUgYW4gQU1EIDgxMTEtYmFzZWQgUENJIGxhbmNlIGV0aGVybmV0IGNhcmQsCisJICBhbnN3ZXIgWSBoZXJlIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhbWQ4MTExZS4KK2NvbmZpZyBBTUQ4MTExRV9OQVBJCisJYm9vbCAiRW5hYmxlIE5BUEkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFNRDgxMTFfRVRICisJaGVscAorCSAgTkFQSSBpcyBhIG5ldyBkcml2ZXIgQVBJIGRlc2lnbmVkIHRvIHJlZHVjZSBDUFUgYW5kIGludGVycnVwdCBsb2FkCisJICB3aGVuIHRoZSBkcml2ZXIgaXMgcmVjZWl2aW5nIGxvdHMgb2YgcGFja2V0cyBmcm9tIHRoZSBjYXJkLiBJdCBpcworCSAgc3RpbGwgc29tZXdoYXQgZXhwZXJpbWVudGFsIGFuZCB0aHVzIG5vdCB5ZXQgZW5hYmxlZCBieSBkZWZhdWx0LgorCisJICBJZiB5b3VyIGVzdGltYXRlZCBSeCBsb2FkIGlzIDEwa3BwcyBvciBtb3JlLCBvciBpZiB0aGUgY2FyZCB3aWxsIGJlCisJICBkZXBsb3llZCBvbiBwb3RlbnRpYWxseSB1bmZyaWVuZGx5IG5ldHdvcmtzIChlLmcuIGluIGEgZmlyZXdhbGwpLAorCSAgdGhlbiBzYXkgWSBoZXJlLgorCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL05BUElfSE9XVE8udHh0PiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIEFEQVBURUNfU1RBUkZJUkUKKwl0cmlzdGF0ZSAiQWRhcHRlYyBTdGFyZmlyZS9EdXJhTEFOIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBNSUkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIEFkYXB0ZWMgU3RhcmZpcmUgKG9yIER1cmFMQU4pIFBDSSBuZXR3b3JrCisJICBhZGFwdGVyLiBUaGUgRHVyYUxBTiBjaGlwIGlzIHVzZWQgb24gdGhlIDY0IGJpdCBQQ0kgYm9hcmRzIGZyb20KKwkgIEFkYXB0ZWMgZS5nLiB0aGUgQU5BLTY5MjJBLiBUaGUgb2xkZXIgMzIgYml0IGJvYXJkcyB1c2UgdGhlIHR1bGlwCisJICBkcml2ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHN0YXJmaXJlLiAgVGhpcyBpcyByZWNvbW1lbmRlZC4KKworY29uZmlnIEFEQVBURUNfU1RBUkZJUkVfTkFQSQorCWJvb2wgIlVzZSBSeCBQb2xsaW5nIChOQVBJKSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEFEQVBURUNfU1RBUkZJUkUgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgTkFQSSBpcyBhIG5ldyBkcml2ZXIgQVBJIGRlc2lnbmVkIHRvIHJlZHVjZSBDUFUgYW5kIGludGVycnVwdCBsb2FkCisJICB3aGVuIHRoZSBkcml2ZXIgaXMgcmVjZWl2aW5nIGxvdHMgb2YgcGFja2V0cyBmcm9tIHRoZSBjYXJkLiBJdCBpcworCSAgc3RpbGwgc29tZXdoYXQgZXhwZXJpbWVudGFsIGFuZCB0aHVzIG5vdCB5ZXQgZW5hYmxlZCBieSBkZWZhdWx0LgorCisJICBJZiB5b3VyIGVzdGltYXRlZCBSeCBsb2FkIGlzIDEwa3BwcyBvciBtb3JlLCBvciBpZiB0aGUgY2FyZCB3aWxsIGJlCisJICBkZXBsb3llZCBvbiBwb3RlbnRpYWxseSB1bmZyaWVuZGx5IG5ldHdvcmtzIChlLmcuIGluIGEgZmlyZXdhbGwpLAorCSAgdGhlbiBzYXkgWSBoZXJlLgorCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL05BUElfSE9XVE8udHh0PiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIEFDMzIwMAorCXRyaXN0YXRlICJBbnNlbCBDb21tdW5pY2F0aW9ucyBFSVNBIDMyMDAgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgKElTQSB8fCBFSVNBKSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhYzMyMDAuCisKK2NvbmZpZyBBUFJJQ09UCisJdHJpc3RhdGUgIkFwcmljb3QgWGVuLUlJIG9uIGJvYXJkIEV0aGVybmV0IgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBJU0EKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjb250cm9sbGVyIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kCisJICByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgYXByaWNvdC4KKworY29uZmlnIEI0NAorCXRyaXN0YXRlICJCcm9hZGNvbSA0NDAwIGV0aGVybmV0IHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgTUlJCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY29udHJvbGxlciBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZAorCSAgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGI0NC4KKworY29uZmlnIEZPUkNFREVUSAorCXRyaXN0YXRlICJSZXZlcnNlIEVuZ2luZWVyZWQgbkZvcmNlIEV0aGVybmV0IHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjb250cm9sbGVyIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kCisJICByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgZm9yY2VkZXRoLgorCisKK2NvbmZpZyBDUzg5eDAKKwl0cmlzdGF0ZSAiQ1M4OXgwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIChJU0EgfHwgQVJDSF9JWERQMlgwMSkKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciBDUzg5eDAgY2hpcHNldCBiYXNlZCBFdGhlcm5ldCBjYXJkcy4gSWYgeW91IGhhdmUgYQorCSAgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZCB0aGUKKwkgIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiBhcyB3ZWxsIGFzCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3M4OXgwLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgY3M4OXguCisKK2NvbmZpZyBUQzM1ODE1CisJdHJpc3RhdGUgIlRPU0hJQkEgVEMzNTgxNSBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kgJiYgVE9TSElCQV9KTVIzOTI3CisKK2NvbmZpZyBER1JTCisJdHJpc3RhdGUgIkRpZ2kgSW50bC4gUmlnaHRTd2l0Y2ggU0UtWCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiAoUENJIHx8IEVJU0EpCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgRGlnaSBJbnRlcm5hdGlvbmFsIFJpZ2h0U3dpdGNoIHNlcmllcyBvZgorCSAgUENJL0VJU0EgRXRoZXJuZXQgc3dpdGNoIGNhcmRzLiBUaGVzZSBpbmNsdWRlIHRoZSBTRS00IGFuZCB0aGUgU0UtNgorCSAgbW9kZWxzLiAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZCB0aGUKKwkgIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIE1vcmUgc3BlY2lmaWMKKwkgIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGdycy50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGRncnMuCisKK2NvbmZpZyBFRVBSTzEwMAorCXRyaXN0YXRlICJFdGhlckV4cHJlc3NQcm8vMTAwIHN1cHBvcnQgKGVlcHJvMTAwLCBvcmlnaW5hbCBCZWNrZXIgZHJpdmVyKSIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJCisJc2VsZWN0IE1JSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEludGVsIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFBDSSBuZXR3b3JrIChFdGhlcm5ldCkKKwkgIGNhcmQsIHNheSBZIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZWVwcm8xMDAuCisKKworY29uZmlnIEUxMDAKKwl0cmlzdGF0ZSAiSW50ZWwoUikgUFJPLzEwMCsgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJCisJc2VsZWN0IE1JSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIEludGVsKFIpIFBSTy8xMDAgZmFtaWx5IG9mIGFkYXB0ZXJzLgorCSAgVG8gdmVyaWZ5IHRoYXQgeW91ciBhZGFwdGVyIGlzIHN1cHBvcnRlZCwgZmluZCB0aGUgYm9hcmQgSUQgbnVtYmVyIAorCSAgb24gdGhlIGFkYXB0ZXIuIExvb2sgZm9yIGEgbGFiZWwgdGhhdCBoYXMgYSBiYXJjb2RlIGFuZCBhIG51bWJlciAKKwkgIGluIHRoZSBmb3JtYXQgMTIzNDU2LTAwMSAoc2l4IGRpZ2l0cyBoeXBoZW4gdGhyZWUgZGlnaXRzKS4gCisKKwkgIFVzZSB0aGUgYWJvdmUgaW5mb3JtYXRpb24gYW5kIHRoZSBBZGFwdGVyICYgRHJpdmVyIElEIEd1aWRlIGF0OgorCisJICA8aHR0cDovL3N1cHBvcnQuaW50ZWwuY29tL3N1cHBvcnQvbmV0d29yay9hZGFwdGVyL3BybzEwMC8yMTM5Ny5odG0+CisKKyAgICAgICAgICB0byBpZGVudGlmeSB0aGUgYWRhcHRlci4KKworCSAgRm9yIHRoZSBsYXRlc3QgSW50ZWwgUFJPLzEwMCBuZXR3b3JrIGRyaXZlciBmb3IgTGludXgsIHNlZToKKworCSAgPGh0dHA6Ly9hcHBzci5pbnRlbC5jb20vc2NyaXB0cy1kZi9zdXBwb3J0X2ludGVsLmFzcD4KKworCSAgTW9yZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBvbiBjb25maWd1cmluZyB0aGUgZHJpdmVyIGlzIGluIAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2UxMDAudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBlMTAwLgorCitjb25maWcgTE5FMzkwCisJdHJpc3RhdGUgIk15bGV4IEVJU0EgTE5FMzkwQS9CIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIEVJU0EgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxuZTM5MC4KKworY29uZmlnIEZFQUxOWAorCXRyaXN0YXRlICJNeXNvbiBNVEQtOHh4IFBDSSBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kKKwlzZWxlY3QgQ1JDMzIKKwlzZWxlY3QgTUlJCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBNeXNvbSBNVEQtODAwIGZhbWlseSBvZiBQQ0ktYmFzZWQgRXRoZXJuZXQKKwkgIGNhcmRzLiBTcGVjaWZpY2F0aW9ucyBhbmQgZGF0YSBhdAorCSAgPGh0dHA6Ly93d3cubXlzb24uY29tLmhrL210ZC9kYXRhc2hlZXQvPi4KKworY29uZmlnIE5BVFNFTUkKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBEUDgzODF4IHNlcmllcyBQQ0kgRXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIERQODM4MTAgc2VyaWVzLAorCSAgd2hpY2ggaXMgdXNlZCBpbiBjYXJkcyBmcm9tIFB1cmVEYXRhLCBOZXRHZWFyLCBMaW5rc3lzCisJICBhbmQgb3RoZXJzLCBpbmNsdWRpbmcgdGhlIDgzODE1IGNoaXAuCisJICBNb3JlIHNwZWNpZmljIGluZm9ybWF0aW9uIGFuZCB1cGRhdGVzIGFyZSBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvbmF0c2VtaS5odG1sPi4KKworY29uZmlnIE5FMktfUENJCisJdHJpc3RhdGUgIlBDSSBORTIwMDAgYW5kIGNsb25lcyBzdXBwb3J0IChzZWUgaGVscCkiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGlzIGZvciBORTIwMDAgY29tcGF0aWJsZSBQQ0kgY2FyZHMuIEl0IHdpbGwgbm90IHdvcmsKKwkgIHdpdGggSVNBIE5FMjAwMCBjYXJkcyAodGhleSBoYXZlIHRoZWlyIG93biBkcml2ZXIsICJORTIwMDAvTkUxMDAwCisJICBzdXBwb3J0IiBiZWxvdykuIElmIHlvdSBoYXZlIGEgUENJIE5FMjAwMCBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCwKKwkgIHNheSBZIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRoaXMgZHJpdmVyIGFsc28gd29ya3MgZm9yIHRoZSBmb2xsb3dpbmcgTkUyMDAwIGNsb25lIGNhcmRzOgorCSAgUmVhbFRlayBSVEwtODAyOSAgV2luYm9uZCA4OUM5NDAgIENvbXBleCBSTDIwMDAgIEtUSSBFVDMyUDIKKwkgIE5ldFZpbiBOVjUwMDBTQyAgIFZpYSA4NkM5MjYgICAgICBTdXJlQ29tIE5FMzQgICBXaW5ib25kCisJICBIb2x0ZWsgSFQ4MDIzMiAgICBIb2x0ZWsgSFQ4MDIyOQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG5lMmstcGNpLgorCitjb25maWcgTkUzMjEwCisJdHJpc3RhdGUgIk5vdmVsbC9FYWdsZS9NaWNyb2R5bmUgTkUzMjEwIEVJU0Egc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgRUlTQSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uICBOb3RlIHRoYXQgdGhpcyBkcml2ZXIKKwkgIHdpbGwgTk9UIFdPUksgZm9yIE5FMzIwMCBjYXJkcyBhcyB0aGV5IGFyZSBjb21wbGV0ZWx5IGRpZmZlcmVudC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBuZTMyMTAuCisKK2NvbmZpZyBFUzMyMTAKKwl0cmlzdGF0ZSAiUmFjYWwtSW50ZXJsYW4gRUlTQSBFUzMyMTAgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgRUlTQSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZXMzMjEwLgorCitjb25maWcgODEzOUNQCisJdHJpc3RhdGUgIlJlYWxUZWsgUlRMLTgxMzkgQysgUENJIEZhc3QgRXRoZXJuZXQgQWRhcHRlciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IENSQzMyCisJc2VsZWN0IE1JSQorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBGYXN0IEV0aGVybmV0IFBDSSBuZXR3b3JrIGNhcmRzIGJhc2VkIG9uCisJICB0aGUgUlRMODEzOUMrIGNoaXBzLiBJZiB5b3UgaGF2ZSBvbmUgb2YgdGhvc2UsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCA4MTM5Y3AuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgODEzOVRPTworCXRyaXN0YXRlICJSZWFsVGVrIFJUTC04MTM5IFBDSSBGYXN0IEV0aGVybmV0IEFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJCisJc2VsZWN0IENSQzMyCisJc2VsZWN0IE1JSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBGYXN0IEV0aGVybmV0IFBDSSBuZXR3b3JrIGNhcmRzIGJhc2VkIG9uCisJICB0aGUgUlRMODEzOSBjaGlwcy4gSWYgeW91IGhhdmUgb25lIG9mIHRob3NlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDgxMzl0b28uICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgODEzOVRPT19QSU8KKwlib29sICJVc2UgUElPIGluc3RlYWQgb2YgTU1JTyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIDgxMzlUT08KKwloZWxwCisJICBUaGlzIGluc3RydWN0cyB0aGUgZHJpdmVyIHRvIHVzZSBwcm9ncmFtbWVkIEkvTyBwb3J0cyAoUElPKSBpbnN0ZWFkCisJICBvZiBQQ0kgc2hhcmVkIG1lbW9yeSAoTU1JTykuICBUaGlzIGNhbiBwb3NzaWJseSBzb2x2ZSBzb21lIHByb2JsZW1zCisJICBpbiBjYXNlIHlvdXIgbWFpbmJvYXJkIGhhcyBtZW1vcnkgY29uc2lzdGVuY3kgaXNzdWVzLiAgSWYgdW5zdXJlLAorCSAgc2F5IE4uCisKK2NvbmZpZyA4MTM5VE9PX1RVTkVfVFdJU1RFUgorCWJvb2wgIlN1cHBvcnQgZm9yIHVuY29tbW9uIFJUTC04MTM5IHJldi4gSyAoYXV0b21hdGljIGNoYW5uZWwgZXF1YWxpemF0aW9uKSIKKwlkZXBlbmRzIG9uIDgxMzlUT08KKwloZWxwCisJICBUaGlzIGltcGxlbWVudHMgYSBmdW5jdGlvbiB3aGljaCBtaWdodCBjb21lIGluIGhhbmR5IGluIGNhc2UgeW91CisJICBhcmUgdXNpbmcgbG93IHF1YWxpdHkgb24gbG9uZyBjYWJsaW5nLiBJdCBpcyByZXF1aXJlZCBmb3IgUmVhbFRlaworCSAgUlRMLTgxMzkgcmV2aXNpb24gSyBib2FyZHMsIGFuZCB0b3RhbGx5IHVudXNlZCBvdGhlcndpc2UuICBJdCB0cmllcworCSAgdG8gbWF0Y2ggdGhlIHRyYW5zY2VpdmVyIHRvIHRoZSBjYWJsZSBjaGFyYWN0ZXJpc3RpY3MuIFRoaXMgaXMKKwkgIGV4cGVyaW1lbnRhbCBzaW5jZSBoYXJkbHkgZG9jdW1lbnRlZCBieSB0aGUgbWFudWZhY3R1cmVyLgorCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIDgxMzlUT09fODEyOQorCWJvb2wgIlN1cHBvcnQgZm9yIG9sZGVyIFJUTC04MTI5LzgxMzAgYm9hcmRzIgorCWRlcGVuZHMgb24gODEzOVRPTworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgb2xkZXIgYW5kIHVuY29tbW9uIFJUTC04MTI5IGFuZAorCSAgUlRMLTgxMzAgY2hpcHMsIHdoaWNoIHN1cHBvcnQgTUlJIHZpYSBhbiBleHRlcm5hbCB0cmFuc2NlaXZlciwKKwkgIGluc3RlYWQgb2YgYW4gaW50ZXJuYWwgb25lLiAgRGlzYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2F2ZSBzb21lCisJICBtZW1vcnkgYnkgbWFraW5nIHRoZSBjb2RlIHNpemUgc21hbGxlci4gIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyA4MTM5X09MRF9SWF9SRVNFVAorCWJvb2wgIlVzZSBvbGRlciBSWC1yZXNldCBtZXRob2QiCisJZGVwZW5kcyBvbiA4MTM5VE9PCisJaGVscAorCSAgVGhlIDgxMzl0b28gZHJpdmVyIHdhcyByZWNlbnRseSB1cGRhdGVkIHRvIGNvbnRhaW4gYSBtb3JlIHJhcGlkCisJICByZXNldCBzZXF1ZW5jZSwgaW4gdGhlIGZhY2Ugb2Ygc2V2ZXJlIHJlY2VpdmUgZXJyb3JzLiAgVGhpcyAibmV3IgorCSAgUlgtcmVzZXQgbWV0aG9kIHNob3VsZCBiZSBhZGVxdWF0ZSBmb3IgYWxsIGJvYXJkcy4gIEJ1dCBpZiB5b3UKKwkgIGV4cGVyaWVuY2UgcHJvYmxlbXMsIHlvdSBjYW4gZW5hYmxlIHRoaXMgb3B0aW9uIHRvIHJlc3RvcmUgdGhlCisJICBvbGQgUlgtcmVzZXQgYmVoYXZpb3IuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0lTOTAwCisJdHJpc3RhdGUgIlNpUyA5MDAvNzAxNiBQQ0kgRmFzdCBFdGhlcm5ldCBBZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBGYXN0IEV0aGVybmV0IFBDSSBuZXR3b3JrIGNhcmRzIGJhc2VkIG9uCisJICB0aGUgU2lTIDkwMCBhbmQgU2lTIDcwMTYgY2hpcHMuIFRoZSBTaVMgOTAwIGNvcmUgaXMgYWxzbyBlbWJlZGRlZCBpbgorCSAgU2lTIDYzMCBhbmQgU2lTIDU0MCBjaGlwc2V0cy4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aG9zZSwgc2F5IFkgYW5kCisJICByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGF0CisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiAgUGxlYXNlIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9zaXM5MDAudHh0PiBhbmQgY29tbWVudHMgYXQgdGhlCisJICBiZWdpbm5pbmcgb2YgPGZpbGU6ZHJpdmVycy9uZXQvc2lzOTAwLmM+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisJICBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIEFNRCA3OUM5MDEgSG9tZVBOQSBzbyB0aGF0IHlvdSBjYW4gdXNlCisJICB5b3VyIHBob25lIGxpbmUgYXMgYSBuZXR3b3JrIGNhYmxlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzaXM5MDAuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgRVBJQzEwMAorCXRyaXN0YXRlICJTTUMgRXRoZXJQb3dlciBJSSIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJCisJc2VsZWN0IENSQzMyCisJc2VsZWN0IE1JSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgU01DIEV0aGVyUG93ZXIgSUkgOTQzMiBQQ0kgRXRoZXJuZXQgTklDLAorCSAgd2hpY2ggaXMgYmFzZWQgb24gdGhlIFNNQzgzYzE3eCAoRVBJQy8xMDApLgorCSAgTW9yZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhbmQgdXBkYXRlcyBhcmUgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL2VwaWMxMDAuaHRtbD4uCisKK2NvbmZpZyBTVU5EQU5DRQorCXRyaXN0YXRlICJTdW5kYW5jZSBBbHRhIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBNSUkKKwloZWxwCisJICBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIFN1bmRhbmNlICJBbHRhIiBjaGlwLgorCSAgTW9yZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhbmQgdXBkYXRlcyBhcmUgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL3N1bmRhbmNlLmh0bWw+LgorCitjb25maWcgU1VOREFOQ0VfTU1JTworCWJvb2wgIlVzZSBNTUlPIGluc3RlYWQgb2YgUElPIgorCWRlcGVuZHMgb24gU1VOREFOQ0UKKwloZWxwCisJICBFbmFibGUgbWVtb3J5LW1hcHBlZCBJL08gZm9yIGludGVyYWN0aW9uIHdpdGggU3VuZGFuY2UgTklDIHJlZ2lzdGVycy4KKwkgIERvIE5PVCBlbmFibGUgdGhpcyBieSBkZWZhdWx0LCBQSU8gKGVuYWJsZWQgd2hlbiBNTUlPIGlzIGRpc2FibGVkKQorCSAgaXMga25vd24gdG8gc29sdmUgYnVncyBvbiBjZXJ0YWluIGNoaXBzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVExBTgorCXRyaXN0YXRlICJUSSBUaHVuZGVyTEFOIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIChQQ0kgfHwgRUlTQSkgJiYgITY0QklUCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBQQ0kgRXRoZXJuZXQgbmV0d29yayBjYXJkIGJhc2VkIG9uIHRoZSBUaHVuZGVyTEFOIGNoaXAKKwkgIHdoaWNoIGlzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciwgc2F5IFkgYW5kIHJlYWQgdGhlCisJICBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIERldmljZXMgY3VycmVudGx5IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciBhcmUgQ29tcGFxIE5ldGVsbGlnZW50LAorCSAgQ29tcGFxIE5ldEZsZXggYW5kIE9saWNvbSBjYXJkcy4gIFBsZWFzZSByZWFkIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdGxhbi50eHQ+IGZvciBtb3JlIGRldGFpbHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB0bGFuLgorCisJICBQbGVhc2UgZW1haWwgZmVlZGJhY2sgdG8gPHRvcmJlbi5tYXRoaWFzZW5AY29tcGFxLmNvbT4uCisKK2NvbmZpZyBWSUFfUkhJTkUKKwl0cmlzdGF0ZSAiVklBIFJoaW5lIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBNSUkKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIFZJQSAiUmhpbmUiIGJhc2VkIG5ldHdvcmsgY2FyZCAoUmhpbmUtSSAoVlQ4NkMxMDBBKSwKKwkgIFJoaW5lLUlJIChWVDYxMDIpLCBvciBSaGluZS1JSUkgKFZUNjEwNSkpLCBzYXkgWSBoZXJlLiBSaGluZS10eXBlCisJICBFdGhlcm5ldCBmdW5jdGlvbnMgY2FuIGFsc28gYmUgZm91bmQgaW50ZWdyYXRlZCBvbiBTb3V0aCBCcmlkZ2VzCisJICAoZS5nLiBWVDgyMzUpLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB2aWEtcmhpbmUuCisKK2NvbmZpZyBWSUFfUkhJTkVfTU1JTworCWJvb2wgIlVzZSBNTUlPIGluc3RlYWQgb2YgUElPIgorCWRlcGVuZHMgb24gVklBX1JISU5FCisJaGVscAorCSAgVGhpcyBpbnN0cnVjdHMgdGhlIGRyaXZlciB0byB1c2UgUENJIHNoYXJlZCBtZW1vcnkgKE1NSU8pIGluc3RlYWQgb2YKKwkgIHByb2dyYW1tZWQgSS9PIHBvcnRzIChQSU8pLiBFbmFibGluZyB0aGlzIGdpdmVzIGFuIGltcHJvdmVtZW50IGluCisJICBwcm9jZXNzaW5nIHRpbWUgaW4gcGFydHMgb2YgdGhlIGRyaXZlci4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIExBTl9TQUE5NzMwCisJYm9vbCAiUGhpbGlwcyBTQUE5NzMwIEV0aGVybmV0IHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIEVYUEVSSU1FTlRBTCAmJiBNSVBTCisJaGVscAorCSAgVGhlIFNBQTk3MzAgaXMgYSBjb21iaW5lZCBtdWx0aW1lZGlhIGFuZCBwZXJpcGhlcmFsIGNvbnRyb2xsZXIgdXNlZAorCSAgaW4gdGhpbiBjbGllbnRzLCBJbnRlcm5ldCBhY2Nlc3MgdGVybWluYWxzLCBhbmQgZGlza2xlc3MKKwkgIHdvcmtzdGF0aW9ucy4KKwkgIFNlZSA8aHR0cDovL3d3dy5zZW1pY29uZHVjdG9ycy5waGlsaXBzLmNvbS9waXAvU0FBOTczMF9mbHllcl8xPi4KKworY29uZmlnIE5FVF9QT0NLRVQKKwlib29sICJQb2NrZXQgYW5kIHBvcnRhYmxlIGFkYXB0ZXJzIgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIElTQQorCS0tLWhlbHAtLS0KKwkgIEN1dGUgbGl0dGxlIG5ldHdvcmsgKEV0aGVybmV0KSBkZXZpY2VzIHdoaWNoIGF0dGFjaCB0byB0aGUgcGFyYWxsZWwKKwkgIHBvcnQgKCJwb2NrZXQgYWRhcHRlcnMiKSwgY29tbW9ubHkgdXNlZCB3aXRoIGxhcHRvcHMuIElmIHlvdSBoYXZlCisJICBvbmUgb2YgdGhvc2UsIHNheSBZIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIElmIHlvdSB3YW50IHRvIHBsdWcgYSBuZXR3b3JrIChvciBzb21lIG90aGVyKSBjYXJkIGludG8gdGhlIFBDTUNJQQorCSAgKG9yIFBDLWNhcmQpIHNsb3Qgb2YgeW91ciBsYXB0b3AgaW5zdGVhZCAoUENNQ0lBIGlzIHRoZSBzdGFuZGFyZCBmb3IKKwkgIGNyZWRpdCBjYXJkIHNpemUgZXh0ZW5zaW9uIGNhcmRzIHVzZWQgYnkgYWxsIG1vZGVybiBsYXB0b3BzKSwgeW91CisJICBuZWVkIHRoZSBwY21jaWEtY3MgcGFja2FnZSAobG9jYXRpb24gY29udGFpbmVkIGluIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL0NoYW5nZXM+KSBhbmQgeW91IGNhbiBzYXkgTiBoZXJlLgorCisJICBMYXB0b3AgdXNlcnMgc2hvdWxkIHJlYWQgdGhlIExpbnV4IExhcHRvcCBob21lIHBhZ2UgYXQKKwkgIDxodHRwOi8vd3d3LmxpbnV4LW9uLWxhcHRvcHMuY29tLz4gb3IKKwkgIFR1eG1vYmlsIC0gTGludXggb24gTW9iaWxlIENvbXB1dGVycyBhdCA8aHR0cDovL3d3dy50dXhtb2JpbC5vcmcvPi4KKworCSAgTm90ZSB0aGF0IHRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiBkb2Vzbid0IGRpcmVjdGx5IGFmZmVjdCB0aGUKKwkgIGtlcm5lbDogc2F5aW5nIE4gd2lsbCBqdXN0IGNhdXNlIHRoZSBjb25maWd1cmF0b3IgdG8gc2tpcCBhbGwKKwkgIHRoZSBxdWVzdGlvbnMgYWJvdXQgdGhpcyBjbGFzcyBvZiBuZXR3b3JrIGRldmljZXMuIElmIHlvdSBzYXkgWSwgeW91CisJICB3aWxsIGJlIGFza2VkIGZvciB5b3VyIHNwZWNpZmljIGRldmljZSBpbiB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KKworY29uZmlnIEFUUAorCXRyaXN0YXRlICJBVC1MQU4tVEVDL1JlYWxUZWsgcG9ja2V0IGFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QT0NLRVQgJiYgSVNBICYmIFg4NgorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBuZXR3b3JrIChFdGhlcm5ldCkgZGV2aWNlIHdoaWNoIGF0dGFjaGVzIHRvIHlvdXIgcGFyYWxsZWwKKwkgIHBvcnQuIFJlYWQgPGZpbGU6ZHJpdmVycy9uZXQvYXRwLmM+IGFzIHdlbGwgYXMgdGhlIEV0aGVybmV0LUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiwgaWYgeW91CisJICB3YW50IHRvIHVzZSB0aGlzLiAgSWYgeW91IGludGVuZCB0byB1c2UgdGhpcyBkcml2ZXIsIHlvdSBzaG91bGQgaGF2ZQorCSAgc2FpZCBOIHRvIHRoZSAiUGFyYWxsZWwgcHJpbnRlciBzdXBwb3J0IiwgYmVjYXVzZSB0aGUgdHdvIGRyaXZlcnMKKwkgIGRvbid0IGxpa2UgZWFjaCBvdGhlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYXRwLgorCitjb25maWcgREU2MDAKKwl0cmlzdGF0ZSAiRC1MaW5rIERFNjAwIHBvY2tldCBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUE9DS0VUICYmIElTQQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBuZXR3b3JrIChFdGhlcm5ldCkgZGV2aWNlIHdoaWNoIGF0dGFjaGVzIHRvIHlvdXIgcGFyYWxsZWwKKwkgIHBvcnQuIFJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL0RMSU5LLnR4dD4gYXMgd2VsbCBhcyB0aGUKKwkgIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiwgaWYgeW91IHdhbnQgdG8gdXNlCisJICB0aGlzLiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIHNldmVyYWwgZGV2aWNlcyBzaGFyZSBhIHNpbmdsZSBwYXJhbGxlbAorCSAgcG9ydCBhbmQgaXQgaXMgc2FmZSB0byBjb21waWxlIHRoZSBjb3JyZXNwb25kaW5nIGRyaXZlcnMgaW50byB0aGUKKwkgIGtlcm5lbC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZGU2MDAuCisKK2NvbmZpZyBERTYyMAorCXRyaXN0YXRlICJELUxpbmsgREU2MjAgcG9ja2V0IGFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QT0NLRVQgJiYgSVNBCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIG5ldHdvcmsgKEV0aGVybmV0KSBkZXZpY2Ugd2hpY2ggYXR0YWNoZXMgdG8geW91ciBwYXJhbGxlbAorCSAgcG9ydC4gUmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvRExJTksudHh0PiBhcyB3ZWxsIGFzIHRoZQorCSAgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBpZiB5b3Ugd2FudCB0byB1c2UKKwkgIHRoaXMuIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgc2V2ZXJhbCBkZXZpY2VzIHNoYXJlIGEgc2luZ2xlIHBhcmFsbGVsCisJICBwb3J0IGFuZCBpdCBpcyBzYWZlIHRvIGNvbXBpbGUgdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVycyBpbnRvIHRoZQorCSAga2VybmVsLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBkZTYyMC4KKworY29uZmlnIFNHSVNFRVEKKwl0cmlzdGF0ZSAiU0dJIFNlZXEgZXRoZXJuZXQgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFNHSV9JUDIyCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBTZWVxIGJhc2VkIEV0aGVybmV0IG5ldHdvcmsgY2FyZC4gVGhpcyBpcworCSAgdXNlZCBpbiBtYW55IFNpbGljb24gR3JhcGhpY3MgbWFjaGluZXMuCisKK2NvbmZpZyBERUNMQU5DRQorCXRyaXN0YXRlICJERUMgTEFOQ0UgZXRoZXJuZXQgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIE1BQ0hfREVDU1RBVElPTgorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgc2VyaWVzIG9mIEV0aGVybmV0IGNvbnRyb2xsZXJzIHByb2R1Y2VkIGJ5CisJICBERUMgKG5vdyBDb21wYXEpIGJhc2VkIG9uIHRoZSBBTUQgTGFuY2UgY2hpcHNldCwgaW5jbHVkaW5nIHRoZQorCSAgREVQQ0Egc2VyaWVzLiAgKFRoaXMgY2hpcHNldCBpcyBiZXR0ZXIga25vd24gdmlhIHRoZSBORTIxMDAgY2FyZHMuKQorCitjb25maWcgNjgzNjBfRU5FVAorCWJvb2wgIk1vdG9yb2xhIDY4MzYwIGV0aGVybmV0IGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBNNjgzNjAKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgYnVpbHQtaW4gZXRoZXJuZXQgY29udHJvbGxlciBvZgorCSAgdGhlIE1vdG9yb2xhIDY4MzYwIHByb2Nlc3Nvci4KKworY29uZmlnIEZFQworCWJvb2wgIkZFQyBldGhlcm5ldCBjb250cm9sbGVyIChvZiBDb2xkRmlyZSA1MjcyKSIKKwlkZXBlbmRzIG9uIE01MjcyIHx8IE01MjgyCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGJ1aWx0LWluIDEwLzEwMCBGYXN0IGV0aGVybmV0CisJICBjb250cm9sbGVyIG9uIHRoZSBNb3Rvcm9sYSBDb2xkRmlyZSA1MjcyIHByb2Nlc3Nvci4KKworY29uZmlnIE5FX0g4MzAwCisJdHJpc3RhdGUgIk5FMjAwMCBjb21wYXRpYmxlIHN1cHBvcnQgZm9yIEg4LzMwMCIKKwlkZXBlbmRzIG9uIEg4MzAwICYmIE5FVF9FVEhFUk5FVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBORTIwMDAgY29tcGF0aWJsZQorCSAgY29udHJvbGxlciBvbiB0aGUgUmVuZXNhcyBIOC8zMDAgcHJvY2Vzc29yLgorCitzb3VyY2UgImRyaXZlcnMvbmV0L2ZlY184eHgvS2NvbmZpZyIKKworZW5kbWVudQorCisjCisjCUdpZ2FiaXQgRXRoZXJuZXQKKyMKKworbWVudSAiRXRoZXJuZXQgKDEwMDAgTWJpdCkiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmICFVTUwKKworY29uZmlnIEFDRU5JQworCXRyaXN0YXRlICJBbHRlb24gQWNlTklDLzNDb20gM0M5ODUvTmV0R2VhciBHQTYyMCBHaWdhYml0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIEFsdGVvbiBBY2VOSUMsIDNDb20gM0M5ODUoQiksIE5ldEdlYXIKKwkgIEdBNjIwLCBTR0kgR2lnYWJpdCBvciBGYXJhbGxvbiBQTjkwMDAtU1ggUENJIEdpZ2FiaXQgRXRoZXJuZXQKKwkgIGFkYXB0ZXIuIFRoZSBkcml2ZXIgYWxsb3dzIGZvciB1c2luZyB0aGUgSnVtYm8gRnJhbWUgb3B0aW9uICg5MDAwCisJICBieXRlcy9mcmFtZSkgaG93ZXZlciBpdCByZXF1aXJlcyB0aGF0IHlvdXIgc3dpdGNoZXMgY2FuIGhhbmRsZSB0aGlzCisJICBhcyB3ZWxsLiBUbyBlbmFibGUgSnVtYm8gRnJhbWVzLCBhZGQgYG10dSA5MDAwJyB0byB5b3VyIGlmY29uZmlnCisJICBsaW5lLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhY2VuaWMuCisKK2NvbmZpZyBBQ0VOSUNfT01JVF9USUdPTl9JCisJYm9vbCAiT21pdCBzdXBwb3J0IGZvciBvbGQgVGlnb24gSSBiYXNlZCBBY2VOSUNzIgorCWRlcGVuZHMgb24gQUNFTklDCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugb25seSBoYXZlIFRpZ29uIElJIGJhc2VkIEFjZU5JQ3MgYW5kIHdhbnQgdG8gbGVhdmUKKwkgIG91dCBzdXBwb3J0IGZvciB0aGUgb2xkZXIgVGlnb24gSSBiYXNlZCBjYXJkcyB3aGljaCBhcmUgbm8gbG9uZ2VyCisJICBiZWluZyBzb2xkIChpZS4gdGhlIG9yaWdpbmFsIEFsdGVvbiBBY2VOSUMgYW5kIDNDb20gM0M5ODUgKG5vbiBCCisJICB2ZXJzaW9uKSkuICBUaGlzIHdpbGwgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBkcml2ZXIgb2JqZWN0IGJ5CisJICBhcHAuIDEwMEtCLiAgSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHlvdXIgY2FyZCBpcyBhIFRpZ29uIEkgb3IgYQorCSAgVGlnb24gSUksIHNheSBOIGhlcmUuCisKKwkgIFRoZSBzYWZlIGFuZCBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGlzIE4uCisKK2NvbmZpZyBETDJLCisJdHJpc3RhdGUgIkQtTGluayBETDIwMDAtYmFzZWQgR2lnYWJpdCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgRC1MaW5rIDIwMDAtYmFzZWQgZ2lnYWJpdCBldGhlcm5ldCBjYXJkcywgd2hpY2gKKwkgIGluY2x1ZGVzCisJICBELUxpbmsgREdFLTU1MFQgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyLgorCSAgRC1MaW5rIERMMjAwMC1iYXNlZCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGRsMmsuCisKK2NvbmZpZyBFMTAwMAorCXRyaXN0YXRlICJJbnRlbChSKSBQUk8vMTAwMCBHaWdhYml0IEV0aGVybmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBJbnRlbChSKSBQUk8vMTAwMCBnaWdhYml0IGV0aGVybmV0IGZhbWlseSBvZgorCSAgYWRhcHRlcnMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gaWRlbnRpZnkgeW91ciBhZGFwdGVyLCBnbyAKKwkgIHRvIHRoZSBBZGFwdGVyICYgRHJpdmVyIElEIEd1aWRlIGF0OgorCisJICA8aHR0cDovL3N1cHBvcnQuaW50ZWwuY29tL3N1cHBvcnQvbmV0d29yay9hZGFwdGVyL3BybzEwMC8yMTM5Ny5odG0+CisKKwkgIEZvciBnZW5lcmFsIGluZm9ybWF0aW9uIGFuZCBzdXBwb3J0LCBnbyB0byB0aGUgSW50ZWwgc3VwcG9ydAorCSAgd2Vic2l0ZSBhdDoKKworCSAgPGh0dHA6Ly9zdXBwb3J0LmludGVsLmNvbT4KKworCSAgTW9yZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBvbiBjb25maWd1cmluZyB0aGUgZHJpdmVyIGlzIGluIAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2UxMDAwLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZTEwMDAuCisKK2NvbmZpZyBFMTAwMF9OQVBJCisJYm9vbCAiVXNlIFJ4IFBvbGxpbmcgKE5BUEkpIgorCWRlcGVuZHMgb24gRTEwMDAKKwloZWxwCisJICBOQVBJIGlzIGEgbmV3IGRyaXZlciBBUEkgZGVzaWduZWQgdG8gcmVkdWNlIENQVSBhbmQgaW50ZXJydXB0IGxvYWQKKwkgIHdoZW4gdGhlIGRyaXZlciBpcyByZWNlaXZpbmcgbG90cyBvZiBwYWNrZXRzIGZyb20gdGhlIGNhcmQuIEl0IGlzCisJICBzdGlsbCBzb21ld2hhdCBleHBlcmltZW50YWwgYW5kIHRodXMgbm90IHlldCBlbmFibGVkIGJ5IGRlZmF1bHQuCisKKwkgIElmIHlvdXIgZXN0aW1hdGVkIFJ4IGxvYWQgaXMgMTBrcHBzIG9yIG1vcmUsIG9yIGlmIHRoZSBjYXJkIHdpbGwgYmUKKwkgIGRlcGxveWVkIG9uIHBvdGVudGlhbGx5IHVuZnJpZW5kbHkgbmV0d29ya3MgKGUuZy4gaW4gYSBmaXJld2FsbCksCisJICB0aGVuIHNheSBZIGhlcmUuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvTkFQSV9IT1dUTy50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgTVlSSV9TQlVTCisJdHJpc3RhdGUgIk15cmlDT00gR2lnYWJpdCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0JVUworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE15cmlDT00gU2J1cyBnaWdhYml0IEV0aGVybmV0IGNhcmRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBteXJpX3NidXMuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgTlM4MzgyMAorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdCBEUDgzODIwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBEUDgzODIwIHNlcmllcworCSAgb2YgZ2lnYWJpdCBldGhlcm5ldCBNQUNzLiAgQ2FyZHMgdXNpbmcgdGhpcyBjaGlwc2V0IGluY2x1ZGUKKwkgIHRoZSBELUxpbmsgREdFLTUwMFQsIFB1cmVEYXRhJ3MgUERQODAyM1otVEcsIFNNQydzIFNNQzk0NjJUWCwKKwkgIFNPSE8tR0EyMDAwVCwgU09ITy1HQTI1MDBULiAgVGhlIGRyaXZlciBzdXBwb3J0cyB0aGUgdXNlIG9mCisJICB6ZXJvIGNvcHkuCisKK2NvbmZpZyBIQU1BQ0hJCisJdHJpc3RhdGUgIlBhY2tldCBFbmdpbmVzIEhhbWFjaGkgR05JQy1JSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJCisJc2VsZWN0IE1JSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgR2lnYWJpdCBFdGhlcm5ldCBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgaGFtYWNoaS4KKworY29uZmlnIFlFTExPV0ZJTgorCXRyaXN0YXRlICJQYWNrZXQgRW5naW5lcyBZZWxsb3dmaW4gR2lnYWJpdC1OSUMgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFBDSSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgUGFja2V0IEVuZ2luZXMgRy1OSUMgUENJIEdpZ2FiaXQgRXRoZXJuZXQKKwkgIGFkYXB0ZXIgb3IgdGhlIFNZTTUzQzg4NSBFdGhlcm5ldCBjb250cm9sbGVyLiBUaGUgR2lnYWJpdCBhZGFwdGVyIGlzCisJICB1c2VkIGJ5IHRoZSBCZW93dWxmIExpbnV4IGNsdXN0ZXIgcHJvamVjdC4gIFNlZQorCSAgPGh0dHA6Ly9jZXNkaXMuZ3NmYy5uYXNhLmdvdi9saW51eC9kcml2ZXJzL3llbGxvd2Zpbi5odG1sPiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkcml2ZXIgaW4gcGFydGljdWxhciBhbmQgQmVvd3VsZiBpbiBnZW5lcmFsLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB5ZWxsb3dmaW4uICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgUjgxNjkKKwl0cmlzdGF0ZSAiUmVhbHRlayA4MTY5IGdpZ2FiaXQgZXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSQorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBSZWFsdGVrIDgxNjkgUENJIEdpZ2FiaXQgRXRoZXJuZXQgYWRhcHRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcjgxNjkuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgUjgxNjlfTkFQSQorCWJvb2wgIlVzZSBSeCBhbmQgVHggUG9sbGluZyAoTkFQSSkgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBSODE2OSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBOQVBJIGlzIGEgbmV3IGRyaXZlciBBUEkgZGVzaWduZWQgdG8gcmVkdWNlIENQVSBhbmQgaW50ZXJydXB0IGxvYWQKKwkgIHdoZW4gdGhlIGRyaXZlciBpcyByZWNlaXZpbmcgbG90cyBvZiBwYWNrZXRzIGZyb20gdGhlIGNhcmQuIEl0IGlzCisJICBzdGlsbCBzb21ld2hhdCBleHBlcmltZW50YWwgYW5kIHRodXMgbm90IHlldCBlbmFibGVkIGJ5IGRlZmF1bHQuCisKKwkgIElmIHlvdXIgZXN0aW1hdGVkIFJ4IGxvYWQgaXMgMTBrcHBzIG9yIG1vcmUsIG9yIGlmIHRoZSBjYXJkIHdpbGwgYmUKKwkgIGRlcGxveWVkIG9uIHBvdGVudGlhbGx5IHVuZnJpZW5kbHkgbmV0d29ya3MgKGUuZy4gaW4gYSBmaXJld2FsbCksCisJICB0aGVuIHNheSBZIGhlcmUuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvTkFQSV9IT1dUTy50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgUjgxNjlfVkxBTgorCWJvb2wgIlZMQU4gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFI4MTY5ICYmIFZMQU5fODAyMVEKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGZvciB0aGUgcjgxNjkgZHJpdmVyIHRvIHN1cHBvcnQgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZAorCSAgYnkgdGhlIGtlcm5lbCA4MDIuMVEgY29kZS4KKwkgIAorCSAgSWYgaW4gZG91YnQsIHNheSBZLgorCitjb25maWcgU0s5OExJTgorCXRyaXN0YXRlICJNYXJ2ZWxsIFl1a29uIENoaXBzZXQgLyBTeXNLb25uZWN0IFNLLTk4eHggU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSQorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBNYXJ2ZWxsIFl1a29uIG9yIFN5c0tvbm5lY3QgU0stOTh4eC9TSy05NXh4CisJICBjb21wbGlhbnQgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyLiBUaGUgZm9sbG93aW5nIGFkYXB0ZXJzIGFyZSBzdXBwb3J0ZWQKKwkgIGJ5IHRoaXMgZHJpdmVyOgorCSAgICAtIDNDb20gM0M5NDAgR2lnYWJpdCBMT00gRXRoZXJuZXQgQWRhcHRlcgorCSAgICAtIDNDb20gM0M5NDEgR2lnYWJpdCBMT00gRXRoZXJuZXQgQWRhcHRlcgorCSAgICAtIEFsbGllZCBUZWxlc3luIEFULTI5NzBMWCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKwkgICAgLSBBbGxpZWQgVGVsZXN5biBBVC0yOTcwTFgvMlNDIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorCSAgICAtIEFsbGllZCBUZWxlc3luIEFULTI5NzBTWCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKwkgICAgLSBBbGxpZWQgVGVsZXN5biBBVC0yOTcwU1gvMlNDIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorCSAgICAtIEFsbGllZCBUZWxlc3luIEFULTI5NzBUWCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKwkgICAgLSBBbGxpZWQgVGVsZXN5biBBVC0yOTcwVFgvMlRYIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorCSAgICAtIEFsbGllZCBUZWxlc3luIEFULTI5NzFTWCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKwkgICAgLSBBbGxpZWQgVGVsZXN5biBBVC0yOTcxVCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKwkgICAgLSBCZWxraW4gR2lnYWJpdCBEZXNrdG9wIENhcmQgMTAvMTAwLzEwMDBCYXNlLVQgQWRhcHRlciwgQ29wcGVyIFJKLTQ1CisJICAgIC0gREdFLTUzMFQgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisJICAgIC0gRUcxMDMyIHYyIEluc3RhbnQgR2lnYWJpdCBOZXR3b3JrIEFkYXB0ZXIKKwkgICAgLSBFRzEwNjQgdjIgSW5zdGFudCBHaWdhYml0IE5ldHdvcmsgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IExPTSBFdGhlcm5ldCBBZGFwdGVyIChBYml0KQorCSAgICAtIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IExPTSBFdGhlcm5ldCBBZGFwdGVyIChBbGJhdHJvbikKKwkgICAgLSBNYXJ2ZWxsIDg4RTgwMDEgR2lnYWJpdCBMT00gRXRoZXJuZXQgQWRhcHRlciAoQXN1cykKKwkgICAgLSBNYXJ2ZWxsIDg4RTgwMDEgR2lnYWJpdCBMT00gRXRoZXJuZXQgQWRhcHRlciAoRUNTKQorCSAgICAtIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IExPTSBFdGhlcm5ldCBBZGFwdGVyIChFcG94KQorCSAgICAtIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IExPTSBFdGhlcm5ldCBBZGFwdGVyIChGb3hjb25uKQorCSAgICAtIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IExPTSBFdGhlcm5ldCBBZGFwdGVyIChHaWdhYnl0ZSkKKwkgICAgLSBNYXJ2ZWxsIDg4RTgwMDEgR2lnYWJpdCBMT00gRXRoZXJuZXQgQWRhcHRlciAoSXdpbGwpCisJICAgIC0gTWFydmVsbCA4OEU4MDUwIEdpZ2FiaXQgTE9NIEV0aGVybmV0IEFkYXB0ZXIgKEludGVsKQorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDEgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDIgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDMgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDQgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDYgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDcgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDggQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDkgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMTAgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMTEgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMTIgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwNTIgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgWXVrb24gR2lnYWJpdCBFdGhlcm5ldCAxMC8xMDAvMTAwMEJhc2UtVCBBZGFwdGVyICgzMiBiaXQpCisJICAgIC0gTWFydmVsbCBZdWtvbiBHaWdhYml0IEV0aGVybmV0IDEwLzEwMC8xMDAwQmFzZS1UIEFkYXB0ZXIgKDY0IGJpdCkKKwkgICAgLSBOLVdheSBQQ0ktQnVzIEdpZ2EtQ2FyZCAxMDAwLzEwMC8xME1icHMoTCkKKwkgICAgLSBTSy05NTIxIDEwLzEwMC8xMDAwQmFzZS1UIEFkYXB0ZXIKKwkgICAgLSBTSy05NTIxIFYyLjAgMTAvMTAwLzEwMDBCYXNlLVQgQWRhcHRlcgorCSAgICAtIFNLLTk4MjEgR2lnYWJpdCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlciAoU0stTkVUIEdFLVQpCisJICAgIC0gU0stOTgyMSBWMi4wIEdpZ2FiaXQgRXRoZXJuZXQgMTAvMTAwLzEwMDBCYXNlLVQgQWRhcHRlcgorCSAgICAtIFNLLTk4MjIgR2lnYWJpdCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlciAoU0stTkVUIEdFLVQgZHVhbCBsaW5rKQorCSAgICAtIFNLLTk4NDEgR2lnYWJpdCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlciAoU0stTkVUIEdFLUxYKQorCSAgICAtIFNLLTk4NDEgVjIuMCBHaWdhYml0IEV0aGVybmV0IDEwMDBCYXNlLUxYIEFkYXB0ZXIKKwkgICAgLSBTSy05ODQyIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgKFNLLU5FVCBHRS1MWCBkdWFsIGxpbmspCisJICAgIC0gU0stOTg0MyBHaWdhYml0IEV0aGVybmV0IFNlcnZlciBBZGFwdGVyIChTSy1ORVQgR0UtU1gpCisJICAgIC0gU0stOTg0MyBWMi4wIEdpZ2FiaXQgRXRoZXJuZXQgMTAwMEJhc2UtU1ggQWRhcHRlcgorCSAgICAtIFNLLTk4NDQgR2lnYWJpdCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlciAoU0stTkVUIEdFLVNYIGR1YWwgbGluaykKKwkgICAgLSBTSy05ODUxIFYyLjAgR2lnYWJpdCBFdGhlcm5ldCAxMDAwQmFzZS1TWCBBZGFwdGVyCisJICAgIC0gU0stOTg2MSBHaWdhYml0IEV0aGVybmV0IFNlcnZlciBBZGFwdGVyIChTSy1ORVQgR0UtU1ggVm9saXRpb24pCisJICAgIC0gU0stOTg2MSBWMi4wIEdpZ2FiaXQgRXRoZXJuZXQgMTAwMEJhc2UtU1ggQWRhcHRlcgorCSAgICAtIFNLLTk4NjIgR2lnYWJpdCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlciAoU0stTkVUIEdFLVNYIFZvbGl0aW9uIGR1YWwgbGluaykKKwkgICAgLSBTSy05ODcxIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgKFNLLU5FVCBHRS1aWCkKKwkgICAgLSBTSy05ODcxIFYyLjAgR2lnYWJpdCBFdGhlcm5ldCAxMDAwQmFzZS1aWCBBZGFwdGVyCisJICAgIC0gU0stOTg3MiBHaWdhYml0IEV0aGVybmV0IFNlcnZlciBBZGFwdGVyIChTSy1ORVQgR0UtWlggZHVhbCBsaW5rKQorCSAgICAtIFNNQyBFWiBDYXJkIDEwMDAgKFNNQzk0NTJUWFYuMikKKwkgIAorCSAgVGhlIGFkYXB0ZXJzIHN1cHBvcnQgSnVtYm8gRnJhbWVzLgorCSAgVGhlIGR1YWwgbGluayBhZGFwdGVycyBzdXBwb3J0IGxpbmstZmFpbG92ZXIgYW5kIGR1YWwgcG9ydCBmZWF0dXJlcy4KKwkgIEJvdGggTWFydmVsbCBZdWtvbiBhbmQgU3lzS29ubmVjdCBTSy05OHh4L1NLLTk1eHggYWRhcHRlcnMgc3VwcG9ydCAKKwkgIHRoZSBzY2F0dGVyLWdhdGhlciBmdW5jdGlvbmFsaXR5IHdpdGggc2VuZGZpbGUoKS4gUGxlYXNlIHJlZmVyIHRvIAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NrOThsaW4udHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAorCSAgb3B0aW9uYWwgZHJpdmVyIHBhcmFtZXRlcnMuCisJICBRdWVzdGlvbnMgY29uY2VybmluZyB0aGlzIGRyaXZlciBtYXkgYmUgYWRkcmVzc2VkIHRvOgorCSAgICAgIDxsaW51eEBzeXNrb25uZWN0LmRlPgorCSAgCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLAorCSAgc2F5IE0gaGVyZSBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2tidWlsZC9tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIHNrOThsaW4uIFRoaXMgaXMgcmVjb21tZW5kZWQuCisKK2NvbmZpZyBWSUFfVkVMT0NJVFkKKwl0cmlzdGF0ZSAiVklBIFZlbG9jaXR5IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBDUkNfQ0NJVFQKKwlzZWxlY3QgTUlJCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBWSUEgIlZlbG9jaXR5IiBiYXNlZCBuZXR3b3JrIGNhcmQgc2F5IFkgaGVyZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdmlhLXZlbG9jaXR5LgorCitjb25maWcgVElHT04zCisJdHJpc3RhdGUgIkJyb2FkY29tIFRpZ29uMyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgQnJvYWRjb20gVGlnb24zIGJhc2VkIGdpZ2FiaXQgRXRoZXJuZXQgY2FyZHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHRnMy4gIFRoaXMgaXMgcmVjb21tZW5kZWQuCisKK2NvbmZpZyBHSUFORkFSCisJdHJpc3RhdGUgIkdpYW5mYXIgRXRoZXJuZXQiCisJZGVwZW5kcyBvbiA4NXh4IHx8IDgzeHgKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgR2lnYWJpdCBUU0VDIG9uIHRoZSBNUEM4NXh4IAorCSAgZmFtaWx5IG9mIGNoaXBzLCBhbmQgdGhlIEZFQyBvbiB0aGUgODU0MAorCitjb25maWcgR0ZBUl9OQVBJCisJYm9vbCAiTkFQSSBTdXBwb3J0IgorCWRlcGVuZHMgb24gR0lBTkZBUgorCitjb25maWcgTVY2NDNYWF9FVEgKKwl0cmlzdGF0ZSAiTVYtNjQzWFggRXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1PTUVOQ09fT0NFTE9UX0MgfHwgTU9NRU5DT19KQUdVQVJfQVRYIHx8IE1WNjQzNjAgfHwgTU9NRU5DT19PQ0VMT1RfMworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBnaWdhYml0IEV0aGVybmV0IG9uIHRoZSBNYXJ2ZWxsIE1WNjQzWFgKKwkgIGNoaXBzZXQgd2hpY2ggaXMgdXNlZCBpbiB0aGUgTW9tZW5jbyBPY2Vsb3QgQyBhbmQgSmFndWFyIEFUWCBhbmQKKwkgIFBlZ2Fzb3MgSUksIGFtb25nc3Qgb3RoZXIgUFBDIGFuZCBNSVBTIGJvYXJkcy4KKworY29uZmlnIE1WNjQzWFhfRVRIXzAKKwlib29sICJNVi02NDNYWCBQb3J0IDAiCisJZGVwZW5kcyBvbiBNVjY0M1hYX0VUSAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBQb3J0IDAgb2YgdGhlIE1hcnZlbGwgTVY2NDNYWCBHaWdhYml0CisJICBFdGhlcm5ldC4KKworY29uZmlnIE1WNjQzWFhfRVRIXzEKKwlib29sICJNVi02NDNYWCBQb3J0IDEiCisJZGVwZW5kcyBvbiBNVjY0M1hYX0VUSAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBQb3J0IDEgb2YgdGhlIE1hcnZlbGwgTVY2NDNYWCBHaWdhYml0CisJICBFdGhlcm5ldC4KKworY29uZmlnIE1WNjQzWFhfRVRIXzIKKwlib29sICJNVi02NDNYWCBQb3J0IDIiCisJZGVwZW5kcyBvbiBNVjY0M1hYX0VUSAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBQb3J0IDIgb2YgdGhlIE1hcnZlbGwgTVY2NDNYWCBHaWdhYml0CisJICBFdGhlcm5ldC4KKworZW5kbWVudQorCisjCisjCTEwIEdpZ2FiaXQgRXRoZXJuZXQKKyMKKworbWVudSAiRXRoZXJuZXQgKDEwMDAwIE1iaXQpIgorCWRlcGVuZHMgb24gTkVUREVWSUNFUyAmJiAhVU1MCisKK2NvbmZpZyBJWEdCCisJdHJpc3RhdGUgIkludGVsKFIpIFBSTy8xMEdiRSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgSW50ZWwoUikgUFJPLzEwR2JFIGZhbWlseSBvZgorCSAgYWRhcHRlcnMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gaWRlbnRpZnkgeW91ciBhZGFwdGVyLCBnbworCSAgdG8gdGhlIEFkYXB0ZXIgJiBEcml2ZXIgSUQgR3VpZGUgYXQ6CisKKwkgIDxodHRwOi8vc3VwcG9ydC5pbnRlbC5jb20vc3VwcG9ydC9uZXR3b3JrL2FkYXB0ZXIvcHJvMTAwLzIxMzk3Lmh0bT4KKworCSAgRm9yIGdlbmVyYWwgaW5mb3JtYXRpb24gYW5kIHN1cHBvcnQsIGdvIHRvIHRoZSBJbnRlbCBzdXBwb3J0CisJICB3ZWJzaXRlIGF0OgorCisJICA8aHR0cDovL3N1cHBvcnQuaW50ZWwuY29tPgorCisJICBNb3JlIHNwZWNpZmljIGluZm9ybWF0aW9uIG9uIGNvbmZpZ3VyaW5nIHRoZSBkcml2ZXIgaXMgaW4gCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXhnYi50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGl4Z2IuCisKK2NvbmZpZyBJWEdCX05BUEkKKwlib29sICJVc2UgUnggUG9sbGluZyAoTkFQSSkgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBJWEdCICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIE5BUEkgaXMgYSBuZXcgZHJpdmVyIEFQSSBkZXNpZ25lZCB0byByZWR1Y2UgQ1BVIGFuZCBpbnRlcnJ1cHQgbG9hZAorCSAgd2hlbiB0aGUgZHJpdmVyIGlzIHJlY2VpdmluZyBsb3RzIG9mIHBhY2tldHMgZnJvbSB0aGUgY2FyZC4gSXQgaXMKKwkgIHN0aWxsIHNvbWV3aGF0IGV4cGVyaW1lbnRhbCBhbmQgdGh1cyBub3QgeWV0IGVuYWJsZWQgYnkgZGVmYXVsdC4KKworCSAgSWYgeW91ciBlc3RpbWF0ZWQgUnggbG9hZCBpcyAxMGtwcHMgb3IgbW9yZSwgb3IgaWYgdGhlIGNhcmQgd2lsbCBiZQorCSAgZGVwbG95ZWQgb24gcG90ZW50aWFsbHkgdW5mcmllbmRseSBuZXR3b3JrcyAoZS5nLiBpbiBhIGZpcmV3YWxsKSwKKwkgIHRoZW4gc2F5IFkgaGVyZS4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9OQVBJX0hPV1RPLnR4dD4gZm9yIG1vcmUKKwkgIGluZm9ybWF0aW9uLgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBTMklPCisJdHJpc3RhdGUgIlMySU8gMTBHYmUgWEZyYW1lIE5JQyIKKwlkZXBlbmRzIG9uIFBDSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSAxMEdiZSBYRnJhbWUgTklDIG9mIFMySU8uIAorCSAgRm9yIGhlbHAgcmVnYXJkaW5nIGRyaXZlciBjb21waWxhdGlvbiwgaW5zdGFsbGF0aW9uIGFuZCAKKwkgIHR1bmluZyBwbGVhc2UgbG9vayBpbnRvIH4vZHJpdmVycy9uZXQvczJpby9SRUFETUUudHh0LgorCitjb25maWcgUzJJT19OQVBJCisJYm9vbCAiVXNlIFJ4IFBvbGxpbmcgKE5BUEkpIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gUzJJTyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBOQVBJIGlzIGEgbmV3IGRyaXZlciBBUEkgZGVzaWduZWQgdG8gcmVkdWNlIENQVSBhbmQgaW50ZXJydXB0IGxvYWQKKwkgIHdoZW4gdGhlIGRyaXZlciBpcyByZWNlaXZpbmcgbG90cyBvZiBwYWNrZXRzIGZyb20gdGhlIGNhcmQuIEl0IGlzCisJICBzdGlsbCBzb21ld2hhdCBleHBlcmltZW50YWwgYW5kIHRodXMgbm90IHlldCBlbmFibGVkIGJ5IGRlZmF1bHQuCisKKwkgIElmIHlvdXIgZXN0aW1hdGVkIFJ4IGxvYWQgaXMgMTBrcHBzIG9yIG1vcmUsIG9yIGlmIHRoZSBjYXJkIHdpbGwgYmUKKwkgIGRlcGxveWVkIG9uIHBvdGVudGlhbGx5IHVuZnJpZW5kbHkgbmV0d29ya3MgKGUuZy4gaW4gYSBmaXJld2FsbCksCisJICB0aGVuIHNheSBZIGhlcmUuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvTkFQSV9IT1dUTy50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgMkJVRkZfTU9ERQorCWJvb2wgIlVzZSAyIEJ1ZmZlciBNb2RlIG9uIFJ4IHNpZGUuIgorCWRlcGVuZHMgb24gUzJJTworCS0tLWhlbHAtLS0KKwlPbiBlbmFibGluZyB0aGUgMiBidWZmZXIgbW9kZSwgdGhlIHJlY2VpdmVkIGZyYW1lIHdpbGwgYmUKKwlzcGxpdCBpbnRvIDIgcGFydHMgYmVmb3JlIGJlaW5nIERNQSdlZCB0byB0aGUgaG9zdHMgbWVtb3J5LgorCVRoZSBwYXJ0cyBhcmUgdGhlIGV0aGVybmV0IGhlYWRlciBhbmQgZXRoZXJuZXQgcGF5bG9hZC4gCisJVGhpcyBpcyB1c2VmdWwgb24gc3lzdGVtcyB3aGVyZSBETUEnaW5nIHRvIHRvIHVuYWxpZ25lZCAKKwlwaHlzaWNhbCBtZW1vcnkgbG9hY3Rpb25zIGNvbWVzIHdpdGggYSBoZWF2eSBwcmljZS4KKwlJZiBub3Qgc3VyZSBwbGVhc2Ugc2F5IE4uCisKK2VuZG1lbnUKKworaWYgIVVNTAorc291cmNlICJkcml2ZXJzL25ldC90b2tlbnJpbmcvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvbmV0L3BjbWNpYS9LY29uZmlnIgorZW5kaWYKKworc291cmNlICJkcml2ZXJzL25ldC93YW4vS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL2F0bS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvczM5MC9uZXQvS2NvbmZpZyIKKworY29uZmlnIElTRVJJRVNfVkVUSAorCXRyaXN0YXRlICJpU2VyaWVzIFZpcnR1YWwgRXRoZXJuZXQgZHJpdmVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIFBQQ19JU0VSSUVTCisKK2NvbmZpZyBGRERJCisJYm9vbCAiRkRESSBkcml2ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMgJiYgKFBDSSB8fCBFSVNBKQorCWhlbHAKKwkgIEZpYmVyIERpc3RyaWJ1dGVkIERhdGEgSW50ZXJmYWNlIGlzIGEgaGlnaCBzcGVlZCBsb2NhbCBhcmVhIG5ldHdvcmsKKwkgIGRlc2lnbjsgZXNzZW50aWFsbHkgYSByZXBsYWNlbWVudCBmb3IgaGlnaCBzcGVlZCBFdGhlcm5ldC4gRkRESSBjYW4KKwkgIHJ1biBvdmVyIGNvcHBlciBvciBmaWJlci4gSWYgeW91IGFyZSBjb25uZWN0ZWQgdG8gc3VjaCBhIG5ldHdvcmsgYW5kCisJICB3YW50IGEgZHJpdmVyIGZvciB0aGUgRkRESSBjYXJkIGluIHlvdXIgY29tcHV0ZXIsIHNheSBZIGhlcmUgKGFuZAorCSAgdGhlbiBhbHNvIFkgdG8gdGhlIGRyaXZlciBmb3IgeW91ciBGRERJIGNhcmQsIGJlbG93KS4gTW9zdCBwZW9wbGUKKwkgIHdpbGwgc2F5IE4uCisKK2NvbmZpZyBERUZYWAorCXRyaXN0YXRlICJEaWdpdGFsIERFRkVBIGFuZCBERUZQQSBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBGRERJICYmIChQQ0kgfHwgRUlTQSkKKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBESUdJVEFMIHNlcmllcyBvZiBFSVNBIChERUZFQSkgYW5kIFBDSQorCSAgKERFRlBBKSBjb250cm9sbGVycyB3aGljaCBjYW4gY29ubmVjdCB5b3UgdG8gYSBsb2NhbCBGRERJIG5ldHdvcmsuCisKK2NvbmZpZyBTS0ZQCisJdHJpc3RhdGUgIlN5c0tvbm5lY3QgRkRESSBQQ0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZEREkgJiYgUENJCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFN5c0tvbm5lY3QgRkRESSBQQ0kgYWRhcHRlci4KKwkgIFRoZSBmb2xsb3dpbmcgYWRhcHRlcnMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcjoKKwkgIC0gU0stNTUyMSAoU0stTkVUIEZEREktVVApCisJICAtIFNLLTU1MjIgKFNLLU5FVCBGRERJLVVQIERBUykKKwkgIC0gU0stNTU0MSAoU0stTkVUIEZEREktRlApCisJICAtIFNLLTU1NDMgKFNLLU5FVCBGRERJLUxQKQorCSAgLSBTSy01NTQ0IChTSy1ORVQgRkRESS1MUCBEQVMpCisJICAtIFNLLTU4MjEgKFNLLU5FVCBGRERJLVVQNjQpCisJICAtIFNLLTU4MjIgKFNLLU5FVCBGRERJLVVQNjQgREFTKQorCSAgLSBTSy01ODQxIChTSy1ORVQgRkRESS1GUDY0KQorCSAgLSBTSy01ODQzIChTSy1ORVQgRkRESS1MUDY0KQorCSAgLSBTSy01ODQ0IChTSy1ORVQgRkRESS1MUDY0IERBUykKKwkgIC0gTmV0ZWxsaWdlbnQgMTAwIEZEREkgREFTIEZpYnJlIFNDCisJICAtIE5ldGVsbGlnZW50IDEwMCBGRERJIFNBUyBGaWJyZSBTQworCSAgLSBOZXRlbGxpZ2VudCAxMDAgRkRESSBEQVMgVVRQCisJICAtIE5ldGVsbGlnZW50IDEwMCBGRERJIFNBUyBVVFAKKwkgIC0gTmV0ZWxsaWdlbnQgMTAwIEZEREkgU0FTIEZpYnJlIE1JQworCisJICBSZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9za2ZwLnR4dD4gZm9yIGluZm9ybWF0aW9uIGFib3V0CisJICB0aGUgZHJpdmVyLgorCisJICBRdWVzdGlvbnMgY29uY2VybmluZyB0aGlzIGRyaXZlciBjYW4gYmUgYWRkcmVzc2VkIHRvOgorCSAgPGxpbnV4QHN5c2tvbm5lY3QuZGU+CisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNrZnAuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgSElQUEkKKwlib29sICJISVBQSSBkcml2ZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMgJiYgRVhQRVJJTUVOVEFMICYmIElORVQgJiYgUENJCisJaGVscAorCSAgSElnaCBQZXJmb3JtYW5jZSBQYXJhbGxlbCBJbnRlcmZhY2UgKEhJUFBJKSBpcyBhIDgwME1iaXQvc2VjIGFuZAorCSAgMTYwME1iaXQvc2VjIGR1YWwtc2ltcGxleCBzd2l0Y2hlZCBvciBwb2ludC10by1wb2ludCBuZXR3b3JrLiBISVBQSQorCSAgY2FuIHJ1biBvdmVyIGNvcHBlciAoMjVtKSBvciBmaWJlciAoMzAwbSBvbiBtdWx0aS1tb2RlIG9yIDEwa20gb24KKwkgIHNpbmdsZS1tb2RlKS4gSElQUEkgbmV0d29ya3MgYXJlIGNvbW1vbmx5IHVzZWQgZm9yIGNsdXN0ZXJzIGFuZCB0bworCSAgY29ubmVjdCB0byBzdXBlciBjb21wdXRlcnMuIElmIHlvdSBhcmUgY29ubmVjdGVkIHRvIGEgSElQUEkgbmV0d29yaworCSAgYW5kIGhhdmUgYSBISVBQSSBuZXR3b3JrIGNhcmQgaW4geW91ciBjb21wdXRlciB0aGF0IHlvdSB3YW50IHRvIHVzZQorCSAgdW5kZXIgTGludXgsIHNheSBZIGhlcmUgKHlvdSBtdXN0IGFsc28gcmVtZW1iZXIgdG8gZW5hYmxlIHRoZSBkcml2ZXIKKwkgIGZvciB5b3VyIEhJUFBJIGNhcmQgYmVsb3cpLiBNb3N0IHBlb3BsZSB3aWxsIHNheSBOIGhlcmUuCisKK2NvbmZpZyBST0FEUlVOTkVSCisJdHJpc3RhdGUgIkVzc2VudGlhbCBSb2FkUnVubmVyIEhJUFBJIFBDSSBhZGFwdGVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBISVBQSSAmJiBQQ0kKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHRoaXMgaXMgeW91ciBQQ0kgSElQUEkgbmV0d29yayBjYXJkLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBycnVubmVyLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFJPQURSVU5ORVJfTEFSR0VfUklOR1MKKwlib29sICJVc2UgbGFyZ2UgVFgvUlggcmluZ3MgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBST0FEUlVOTkVSCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBSb2FkUnVubmVyIGRyaXZlciB3aWxsIHByZWFsbG9jYXRlIHVwIHRvIDIgTUIKKwkgIG9mIGFkZGl0aW9uYWwgbWVtb3J5IHRvIGFsbG93IGZvciBmYXN0ZXN0IG9wZXJhdGlvbiwgYm90aCBmb3IKKwkgIHRyYW5zbWl0dGluZyBhbmQgcmVjZWl2aW5nLiBUaGlzIG1lbW9yeSBjYW5ub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIKKwkgIGtlcm5lbCBjb2RlIG9yIGJ5IHVzZXIgc3BhY2UgcHJvZ3JhbXMuIFNheSBZIGhlcmUgb25seSBpZiB5b3UgaGF2ZQorCSAgdGhlIG1lbW9yeS4KKworY29uZmlnIFBMSVAKKwl0cmlzdGF0ZSAiUExJUCAocGFyYWxsZWwgcG9ydCkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMgJiYgUEFSUE9SVAorCS0tLWhlbHAtLS0KKwkgIFBMSVAgKFBhcmFsbGVsIExpbmUgSW50ZXJuZXQgUHJvdG9jb2wpIGlzIHVzZWQgdG8gY3JlYXRlIGEKKwkgIHJlYXNvbmFibHkgZmFzdCBtaW5pIG5ldHdvcmsgY29uc2lzdGluZyBvZiB0d28gKG9yLCByYXJlbHksIG1vcmUpCisJICBsb2NhbCBtYWNoaW5lcy4gIEEgUExJUCBsaW5rIGZyb20gYSBMaW51eCBib3ggaXMgYSBwb3B1bGFyIG1lYW5zIHRvCisJICBpbnN0YWxsIGEgTGludXggZGlzdHJpYnV0aW9uIG9uIGEgbWFjaGluZSB3aGljaCBkb2Vzbid0IGhhdmUgYQorCSAgQ0QtUk9NIGRyaXZlIChhIG1pbmltYWwgc3lzdGVtIGhhcyB0byBiZSB0cmFuc2ZlcnJlZCB3aXRoIGZsb3BwaWVzCisJICBmaXJzdCkuIFRoZSBrZXJuZWxzIG9uIGJvdGggbWFjaGluZXMgbmVlZCB0byBoYXZlIHRoaXMgUExJUCBvcHRpb24KKwkgIGVuYWJsZWQgZm9yIHRoaXMgdG8gd29yay4KKworCSAgVGhlIFBMSVAgZHJpdmVyIGhhcyB0d28gbW9kZXMsIG1vZGUgMCBhbmQgbW9kZSAxLiAgVGhlIHBhcmFsbGVsCisJICBwb3J0cyAodGhlIGNvbm5lY3RvcnMgYXQgdGhlIGNvbXB1dGVycyB3aXRoIDI1IGhvbGVzKSBhcmUgY29ubmVjdGVkCisJICB3aXRoICJudWxsIHByaW50ZXIiIG9yICJUdXJibyBMYXBsaW5rIiBjYWJsZXMgd2hpY2ggY2FuIHRyYW5zbWl0IDQKKwkgIGJpdHMgYXQgYSB0aW1lIChtb2RlIDApIG9yIHdpdGggc3BlY2lhbCBQTElQIGNhYmxlcywgdG8gYmUgdXNlZCBvbgorCSAgYmlkaXJlY3Rpb25hbCBwYXJhbGxlbCBwb3J0cyBvbmx5LCB3aGljaCBjYW4gdHJhbnNtaXQgOCBiaXRzIGF0IGEKKwkgIHRpbWUgKG1vZGUgMSk7IHlvdSBjYW4gZmluZCB0aGUgd2lyaW5nIG9mIHRoZXNlIGNhYmxlcyBpbgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL1BMSVAudHh0Pi4gIFRoZSBjYWJsZXMgY2FuIGJlIHVwIHRvCisJICAxNW0gbG9uZy4gIE1vZGUgMCB3b3JrcyBhbHNvIGlmIG9uZSBvZiB0aGUgbWFjaGluZXMgcnVucyBET1MvV2luZG93cworCSAgYW5kIGhhcyBzb21lIFBMSVAgc29mdHdhcmUgaW5zdGFsbGVkLCBlLmcuIHRoZSBDcnlud3IgUExJUCBwYWNrZXQKKwkgIGRyaXZlciAoPGh0dHA6Ly9vYWsub2FrbGFuZC5lZHUvc2ltdGVsLm5ldC9tc2Rvcy9wa3RkcnZyLXByZS5odG1sPikKKwkgIGFuZCB3aW5zb2NrIG9yIE5DU0EncyB0ZWxuZXQuCisKKwkgIElmIHlvdSB3YW50IHRvIHVzZSBQTElQLCBzYXkgWSBhbmQgcmVhZCB0aGUgUExJUCBtaW5pLUhPV1RPIGFzIHdlbGwKKwkgIGFzIHRoZSBORVQtMy1IT1dUTywgYm90aCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIE5vdGUgdGhhdCB0aGUgUExJUAorCSAgcHJvdG9jb2wgaGFzIGJlZW4gY2hhbmdlZCBhbmQgdGhpcyBQTElQIGRyaXZlciB3b24ndCB3b3JrIHRvZ2V0aGVyCisJICB3aXRoIHRoZSBQTElQIHN1cHBvcnQgaW4gTGludXggdmVyc2lvbnMgMS4wLnguICBUaGlzIG9wdGlvbiBlbmxhcmdlcworCSAgeW91ciBrZXJuZWwgYnkgYWJvdXQgOCBLQi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBwbGlwLiAgSWYgdW5zdXJlLCBzYXkgWSBvciBNLCBpbiBjYXNlIHlvdSBidXkgYSBsYXB0b3AKKwkgIGxhdGVyLgorCitjb25maWcgUFBQCisJdHJpc3RhdGUgIlBQUCAocG9pbnQtdG8tcG9pbnQgcHJvdG9jb2wpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTCisJLS0taGVscC0tLQorCSAgUFBQIChQb2ludCB0byBQb2ludCBQcm90b2NvbCkgaXMgYSBuZXdlciBhbmQgYmV0dGVyIFNMSVAuICBJdCBzZXJ2ZXMKKwkgIHRoZSBzYW1lIHB1cnBvc2U6IHNlbmRpbmcgSW50ZXJuZXQgdHJhZmZpYyBvdmVyIHRlbGVwaG9uZSAoYW5kIG90aGVyCisJICBzZXJpYWwpIGxpbmVzLiAgQXNrIHlvdXIgYWNjZXNzIHByb3ZpZGVyIGlmIHRoZXkgc3VwcG9ydCBpdCwgYmVjYXVzZQorCSAgb3RoZXJ3aXNlIHlvdSBjYW4ndCB1c2UgaXQ7IG1vc3QgSW50ZXJuZXQgYWNjZXNzIHByb3ZpZGVycyB0aGVzZQorCSAgZGF5cyBzdXBwb3J0IFBQUCByYXRoZXIgdGhhbiBTTElQLgorCisJICBUbyB1c2UgUFBQLCB5b3UgbmVlZCBhbiBhZGRpdGlvbmFsIHByb2dyYW0gY2FsbGVkIHBwcGQgYXMgZGVzY3JpYmVkCisJICBpbiB0aGUgUFBQLUhPV1RPLCBhdmFpbGFibGUgYXQKKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uICBNYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZQorCSAgdGhlIHZlcnNpb24gb2YgcHBwZCByZWNvbW1lbmRlZCBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL0NoYW5nZXM+LgorCSAgVGhlIFBQUCBvcHRpb24gZW5sYXJnZXMgeW91ciBrZXJuZWwgYnkgYWJvdXQgMTYgS0IuCisKKwkgIFRoZXJlIGFyZSBhY3R1YWxseSB0d28gdmVyc2lvbnMgb2YgUFBQOiB0aGUgdHJhZGl0aW9uYWwgUFBQIGZvcgorCSAgYXN5bmNocm9ub3VzIGxpbmVzLCBzdWNoIGFzIHJlZ3VsYXIgYW5hbG9nIHBob25lIGxpbmVzLCBhbmQKKwkgIHN5bmNocm9ub3VzIFBQUCB3aGljaCBjYW4gYmUgdXNlZCBvdmVyIGRpZ2l0YWwgSVNETiBsaW5lcyBmb3IKKwkgIGV4YW1wbGUuICBJZiB5b3Ugd2FudCB0byB1c2UgUFBQIG92ZXIgcGhvbmUgbGluZXMgb3Igb3RoZXIKKwkgIGFzeW5jaHJvbm91cyBzZXJpYWwgbGluZXMsIHlvdSBuZWVkIHRvIHNheSBZIChvciBNKSBoZXJlIGFuZCBhbHNvIHRvCisJICB0aGUgbmV4dCBvcHRpb24sICJQUFAgc3VwcG9ydCBmb3IgYXN5bmMgc2VyaWFsIHBvcnRzIi4gIEZvciBQUFAgb3ZlcgorCSAgc3luY2hyb25vdXMgbGluZXMsIHlvdSBzaG91bGQgc2F5IFkgKG9yIE0pIGhlcmUgYW5kIHRvICJTdXBwb3J0CisJICBzeW5jaHJvbm91cyBQUFAiLCBiZWxvdy4KKworCSAgSWYgeW91IHNhaWQgWSB0byAiVmVyc2lvbiBpbmZvcm1hdGlvbiBvbiBhbGwgc3ltYm9scyIgYWJvdmUsIHRoZW4KKwkgIHlvdSBjYW5ub3QgY29tcGlsZSB0aGUgUFBQIGRyaXZlciBpbnRvIHRoZSBrZXJuZWw7IHlvdSBjYW4gdGhlbiBvbmx5CisJICBjb21waWxlIGl0IGFzIGEgbW9kdWxlLiBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTQorCSAgaGVyZSBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4KKwkgIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcHBwX2dlbmVyaWMuCisKK2NvbmZpZyBQUFBfTVVMVElMSU5LCisJYm9vbCAiUFBQIG11bHRpbGluayBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gUFBQICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFBQUCBtdWx0aWxpbmsgaXMgYSBwcm90b2NvbCAoZGVmaW5lZCBpbiBSRkMgMTk5MCkgd2hpY2ggYWxsb3dzIHlvdQorCSAgdG8gY29tYmluZSBzZXZlcmFsIChsb2dpY2FsIG9yIHBoeXNpY2FsKSBsaW5lcyBpbnRvIG9uZSBsb2dpY2FsIFBQUAorCSAgY29ubmVjdGlvbiwgc28gdGhhdCB5b3UgY2FuIHV0aWxpemUgeW91ciBmdWxsIGJhbmR3aWR0aC4KKworCSAgVGhpcyBoYXMgdG8gYmUgc3VwcG9ydGVkIGF0IHRoZSBvdGhlciBlbmQgYXMgd2VsbCBhbmQgeW91IG5lZWQgYQorCSAgdmVyc2lvbiBvZiB0aGUgcHBwZCBkYWVtb24gd2hpY2ggdW5kZXJzdGFuZHMgdGhlIG11bHRpbGluayBwcm90b2NvbC4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBQUF9GSUxURVIKKwlib29sICJQUFAgZmlsdGVyaW5nIgorCWRlcGVuZHMgb24gUFBQCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGZpbHRlciB0aGUgcGFja2V0cyBwYXNzaW5nIG92ZXIKKwkgIFBQUCBpbnRlcmZhY2VzLiAgVGhpcyBhbGxvd3MgeW91IHRvIGNvbnRyb2wgd2hpY2ggcGFja2V0cyBjb3VudCBhcworCSAgYWN0aXZpdHkgKGkuZS4gd2hpY2ggcGFja2V0cyB3aWxsIHJlc2V0IHRoZSBpZGxlIHRpbWVyIG9yIGJyaW5nIHVwCisJICBhIGRlbWFuZC1kaWFsbGVkIGxpbmspIGFuZCB3aGljaCBwYWNrZXRzIGFyZSB0byBiZSBkcm9wcGVkIGVudGlyZWx5LgorCSAgWW91IG5lZWQgdG8gc2F5IFkgaGVyZSBpZiB5b3Ugd2lzaCB0byB1c2UgdGhlIHBhc3MtZmlsdGVyIGFuZAorCSAgYWN0aXZlLWZpbHRlciBvcHRpb25zIHRvIHBwcGQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQUFBfQVNZTkMKKwl0cmlzdGF0ZSAiUFBQIHN1cHBvcnQgZm9yIGFzeW5jIHNlcmlhbCBwb3J0cyIKKwlkZXBlbmRzIG9uIFBQUAorCXNlbGVjdCBDUkNfQ0NJVFQKKwktLS1oZWxwLS0tCisJICBTYXkgWSAob3IgTSkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSBQUFAgb3ZlciBzdGFuZGFyZAorCSAgYXN5bmNocm9ub3VzIHNlcmlhbCBwb3J0cywgc3VjaCBhcyBDT00xIG9yIENPTTIgb24gYSBQQy4gIElmIHlvdSB1c2UKKwkgIGEgbW9kZW0gKG5vdCBhIHN5bmNocm9ub3VzIG9yIElTRE4gbW9kZW0pIHRvIGNvbnRhY3QgeW91ciBJU1AsIHlvdQorCSAgbmVlZCB0aGlzIG9wdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIFBQUF9TWU5DX1RUWQorCXRyaXN0YXRlICJQUFAgc3VwcG9ydCBmb3Igc3luYyB0dHkgcG9ydHMiCisJZGVwZW5kcyBvbiBQUFAKKwloZWxwCisJICBTYXkgWSAob3IgTSkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSBQUFAgb3ZlciBzeW5jaHJvbm91cworCSAgKEhETEMpIHR0eSBkZXZpY2VzLCBzdWNoIGFzIHRoZSBTeW5jTGluayBhZGFwdGVyLiBUaGVzZSBkZXZpY2VzCisJICBhcmUgb2Z0ZW4gdXNlZCBmb3IgaGlnaC1zcGVlZCBsZWFzZWQgbGluZXMgbGlrZSBUMS9FMS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4KKworY29uZmlnIFBQUF9ERUZMQVRFCisJdHJpc3RhdGUgIlBQUCBEZWZsYXRlIGNvbXByZXNzaW9uIgorCWRlcGVuZHMgb24gUFBQCisJc2VsZWN0IFpMSUJfSU5GTEFURQorCXNlbGVjdCBaTElCX0RFRkxBVEUKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB0aGUgRGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgZm9yIFBQUCwgd2hpY2ggdXNlcyB0aGUKKwkgIERlZmxhdGUgYWxnb3JpdGhtICh0aGUgc2FtZSBhbGdvcml0aG0gdGhhdCBnemlwIHVzZXMpIHRvIGNvbXByZXNzCisJICBlYWNoIFBQUCBwYWNrZXQgYmVmb3JlIGl0IGlzIHNlbnQgb3ZlciB0aGUgd2lyZS4gIFRoZSBtYWNoaW5lIGF0IHRoZQorCSAgb3RoZXIgZW5kIG9mIHRoZSBQUFAgbGluayAodXN1YWxseSB5b3VyIElTUCkgaGFzIHRvIHN1cHBvcnQgdGhlCisJICBEZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCBhcyB3ZWxsIGZvciB0aGlzIHRvIGJlIHVzZWZ1bC4gIEV2ZW4gaWYKKwkgIHRoZXkgZG9uJ3Qgc3VwcG9ydCBpdCwgaXQgaXMgc2FmZSB0byBzYXkgWSBoZXJlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLgorCitjb25maWcgUFBQX0JTRENPTVAKKwl0cmlzdGF0ZSAiUFBQIEJTRC1Db21wcmVzcyBjb21wcmVzc2lvbiIKKwlkZXBlbmRzIG9uIFBQUAorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIHRoZSBCU0QtQ29tcHJlc3MgY29tcHJlc3Npb24gbWV0aG9kIGZvciBQUFAsIHdoaWNoIHVzZXMKKwkgIHRoZSBMWlcgY29tcHJlc3Npb24gbWV0aG9kIHRvIGNvbXByZXNzIGVhY2ggUFBQIHBhY2tldCBiZWZvcmUgaXQgaXMKKwkgIHNlbnQgb3ZlciB0aGUgd2lyZS4gVGhlIG1hY2hpbmUgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgUFBQIGxpbmsKKwkgICh1c3VhbGx5IHlvdXIgSVNQKSBoYXMgdG8gc3VwcG9ydCB0aGUgQlNELUNvbXByZXNzIGNvbXByZXNzaW9uCisJICBtZXRob2QgYXMgd2VsbCBmb3IgdGhpcyB0byBiZSB1c2VmdWwuIEV2ZW4gaWYgdGhleSBkb24ndCBzdXBwb3J0IGl0LAorCSAgaXQgaXMgc2FmZSB0byBzYXkgWSBoZXJlLgorCisJICBUaGUgUFBQIERlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICgiUFBQIERlZmxhdGUgY29tcHJlc3Npb24iLAorCSAgYWJvdmUpIGlzIHByZWZlcmFibGUgdG8gQlNELUNvbXByZXNzLCBiZWNhdXNlIGl0IGNvbXByZXNzZXMgYmV0dGVyCisJICBhbmQgaXMgcGF0ZW50LWZyZWUuCisKKwkgIE5vdGUgdGhhdCB0aGUgQlNEIGNvbXByZXNzaW9uIGNvZGUgd2lsbCBhbHdheXMgYmUgY29tcGlsZWQgYXMgYQorCSAgbW9kdWxlOyBpdCBpcyBjYWxsZWQgYnNkX2NvbXAgYW5kIHdpbGwgc2hvdyB1cCBpbiB0aGUgZGlyZWN0b3J5CisJICBtb2R1bGVzIG9uY2UgeW91IGhhdmUgc2FpZCAibWFrZSBtb2R1bGVzIi4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBQUE9FCisJdHJpc3RhdGUgIlBQUCBvdmVyIEV0aGVybmV0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFBQUAorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIFBQUCBvdmVyIEV0aGVybmV0LgorCisJICBUaGlzIGRyaXZlciByZXF1aXJlcyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgcHBwZCBmcm9tIHRoZSBDVlMKKwkgIHJlcG9zaXRvcnkgYXQgY3ZzLnNhbWJhLm9yZy4gIEFsdGVybmF0aXZlbHksIHNlZSB0aGUgCisJICBSb2FyaW5nUGVuZ3VpbiBwYWNrYWdlICg8aHR0cDovL3d3dy5yb2FyaW5ncGVuZ3Vpbi5jb20vcHBwb2U+KQorCSAgd2hpY2ggY29udGFpbnMgaW5zdHJ1Y3Rpb24gb24gaG93IHRvIHVzZSB0aGlzIGRyaXZlciAodW5kZXIgCisJICB0aGUgaGVhZGluZyAiS2VybmVsIG1vZGUgUFBQb0UiKS4KKworY29uZmlnIFBQUE9BVE0KKwl0cmlzdGF0ZSAiUFBQIG92ZXIgQVRNIgorCWRlcGVuZHMgb24gQVRNICYmIFBQUAorCWhlbHAKKwkgIFN1cHBvcnQgUFBQIChQb2ludCB0byBQb2ludCBQcm90b2NvbCkgZW5jYXBzdWxhdGVkIGluIEFUTSBmcmFtZXMuCisJICBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHlldCBjb21wbHkgd2l0aCBzZWN0aW9uIDggb2YgUkZDMjM2NCwKKwkgIHdoaWNoIGNhbiBsZWFkIHRvIGJhZCByZXN1bHRzIGlmIHRoZSBBVE0gcGVlciBsb3NlcyBzdGF0ZSBhbmQKKwkgIGNoYW5nZXMgaXRzIGVuY2Fwc3VsYXRpb24gdW5pbGF0ZXJhbGx5LgorCitjb25maWcgU0xJUAorCXRyaXN0YXRlICJTTElQIChzZXJpYWwgbGluZSkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMKKwktLS1oZWxwLS0tCisJICBTYXkgWSBpZiB5b3UgaW50ZW5kIHRvIHVzZSBTTElQIG9yIENTTElQIChjb21wcmVzc2VkIFNMSVApIHRvCisJICBjb25uZWN0IHRvIHlvdXIgSW50ZXJuZXQgc2VydmljZSBwcm92aWRlciBvciB0byBjb25uZWN0IHRvIHNvbWUKKwkgIG90aGVyIGxvY2FsIFVuaXggYm94IG9yIGlmIHlvdSB3YW50IHRvIGNvbmZpZ3VyZSB5b3VyIExpbnV4IGJveCBhcyBhCisJICBTbGlwL0NTbGlwIHNlcnZlciBmb3Igb3RoZXIgcGVvcGxlIHRvIGRpYWwgaW4uIFNMSVAgKFNlcmlhbCBMaW5lCisJICBJbnRlcm5ldCBQcm90b2NvbCkgaXMgYSBwcm90b2NvbCB1c2VkIHRvIHNlbmQgSW50ZXJuZXQgdHJhZmZpYyBvdmVyCisJICBzZXJpYWwgY29ubmVjdGlvbnMgc3VjaCBhcyB0ZWxlcGhvbmUgbGluZXMgb3IgbnVsbCBtb2RlbSBjYWJsZXM7CisJICBub3dhZGF5cywgdGhlIHByb3RvY29sIFBQUCBpcyBtb3JlIGNvbW1vbmx5IHVzZWQgZm9yIHRoaXMgc2FtZQorCSAgcHVycG9zZS4KKworCSAgTm9ybWFsbHksIHlvdXIgYWNjZXNzIHByb3ZpZGVyIGhhcyB0byBzdXBwb3J0IFNMSVAgaW4gb3JkZXIgZm9yIHlvdQorCSAgdG8gYmUgYWJsZSB0byB1c2UgaXQsIGJ1dCB0aGVyZSBpcyBub3cgYSBTTElQIGVtdWxhdG9yIGNhbGxlZCBTTGlSUAorCSAgYXJvdW5kIChhdmFpbGFibGUgZnJvbQorCSAgPGZ0cDovL2liaWJsaW8ub3JnL3B1Yi9MaW51eC9zeXN0ZW0vbmV0d29yay9zZXJpYWwvPikgd2hpY2gKKwkgIGFsbG93cyB5b3UgdG8gdXNlIFNMSVAgb3ZlciBhIHJlZ3VsYXIgZGlhbCB1cCBzaGVsbCBjb25uZWN0aW9uLiBJZgorCSAgeW91IHBsYW4gdG8gdXNlIFNMaVJQLCBtYWtlIHN1cmUgdG8gc2F5IFkgdG8gQ1NMSVAsIGJlbG93LiBUaGUKKwkgIE5FVC0zLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiwgZXhwbGFpbnMgaG93IHRvCisJICBjb25maWd1cmUgU0xJUC4gTm90ZSB0aGF0IHlvdSBkb24ndCBuZWVkIHRoaXMgb3B0aW9uIGlmIHlvdSBqdXN0CisJICB3YW50IHRvIHJ1biB0ZXJtICh0ZXJtIGlzIGEgcHJvZ3JhbSB3aGljaCBnaXZlcyB5b3UgYWxtb3N0IGZ1bGwKKwkgIEludGVybmV0IGNvbm5lY3Rpdml0eSBpZiB5b3UgaGF2ZSBhIHJlZ3VsYXIgZGlhbCB1cCBzaGVsbCBhY2NvdW50IG9uCisJICBzb21lIEludGVybmV0IGNvbm5lY3RlZCBVbml4IGNvbXB1dGVyLiBSZWFkCisJICA8aHR0cDovL3d3dy5iYXJ0Lm5sL35wYXRyaWNrci90ZXJtLWhvd3RvL1Rlcm0tSE9XVE8uaHRtbD4pLiBTTElQCisJICBzdXBwb3J0IHdpbGwgZW5sYXJnZSB5b3VyIGtlcm5lbCBieSBhYm91dCA0IEtCLiBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgc2xpcC4KKworY29uZmlnIFNMSVBfQ09NUFJFU1NFRAorCWJvb2wgIkNTTElQIGNvbXByZXNzZWQgaGVhZGVycyIKKwlkZXBlbmRzIG9uIFNMSVAKKwktLS1oZWxwLS0tCisJICBUaGlzIHByb3RvY29sIGlzIGZhc3RlciB0aGFuIFNMSVAgYmVjYXVzZSBpdCB1c2VzIGNvbXByZXNzaW9uIG9uIHRoZQorCSAgVENQL0lQIGhlYWRlcnMgKG5vdCBvbiB0aGUgZGF0YSBpdHNlbGYpLCBidXQgaXQgaGFzIHRvIGJlIHN1cHBvcnRlZAorCSAgb24gYm90aCBlbmRzLiBBc2sgeW91ciBhY2Nlc3MgcHJvdmlkZXIgaWYgeW91IGFyZSBub3Qgc3VyZSBhbmQKKwkgIGFuc3dlciBZLCBqdXN0IGluIGNhc2UuIFlvdSB3aWxsIHN0aWxsIGJlIGFibGUgdG8gdXNlIHBsYWluIFNMSVAuIElmCisJICB5b3UgcGxhbiB0byB1c2UgU0xpUlAsIHRoZSBTTElQIGVtdWxhdG9yIChhdmFpbGFibGUgZnJvbQorCSAgPGZ0cDovL2liaWJsaW8ub3JnL3B1Yi9MaW51eC9zeXN0ZW0vbmV0d29yay9zZXJpYWwvPikgd2hpY2gKKwkgIGFsbG93cyB5b3UgdG8gdXNlIFNMSVAgb3ZlciBhIHJlZ3VsYXIgZGlhbCB1cCBzaGVsbCBjb25uZWN0aW9uLCB5b3UKKwkgIGRlZmluaXRlbHkgd2FudCB0byBzYXkgWSBoZXJlLiBUaGUgTkVULTMtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBleHBsYWlucyBob3cgdG8gY29uZmlndXJlCisJICBDU0xJUC4gVGhpcyB3b24ndCBlbmxhcmdlIHlvdXIga2VybmVsLgorCitjb25maWcgU0xJUF9TTUFSVAorCWJvb2wgIktlZXBhbGl2ZSBhbmQgbGluZWZpbGwiCisJZGVwZW5kcyBvbiBTTElQCisJaGVscAorCSAgQWRkcyBhZGRpdGlvbmFsIGNhcGFiaWxpdGllcyB0byB0aGUgU0xJUCBkcml2ZXIgdG8gc3VwcG9ydCB0aGUKKwkgIFJFTENPTSBsaW5lIGZpbGwgYW5kIGtlZXBhbGl2ZSBtb25pdG9yaW5nLiBJZGVhbCBvbiBwb29yIHF1YWxpdHkKKwkgIGFuYWxvZ3VlIGxpbmVzLgorCitjb25maWcgU0xJUF9NT0RFX1NMSVA2CisJYm9vbCAiU2l4IGJpdCBTTElQIGVuY2Fwc3VsYXRpb24iCisJZGVwZW5kcyBvbiBTTElQCisJaGVscAorCSAgSnVzdCBvY2Nhc2lvbmFsbHkgeW91IG1heSBuZWVkIHRvIHJ1biBJUCBvdmVyIGhvc3RpbGUgc2VyaWFsCisJICBuZXR3b3JrcyB0aGF0IGRvbid0IHBhc3MgYWxsIGNvbnRyb2wgY2hhcmFjdGVycyBvciBhcmUgb25seSBzZXZlbgorCSAgYml0LiBTYXlpbmcgWSBoZXJlIGFkZHMgYW4gZXh0cmEgbW9kZSB5b3UgY2FuIHVzZSB3aXRoIFNMSVA6CisJICAic2xpcDYiLiBJbiB0aGlzIG1vZGUsIFNMSVAgd2lsbCBvbmx5IHNlbmQgbm9ybWFsIEFTQ0lJIHN5bWJvbHMgb3ZlcgorCSAgdGhlIHNlcmlhbCBkZXZpY2UuIE5hdHVyYWxseSwgdGhpcyBoYXMgdG8gYmUgc3VwcG9ydGVkIGF0IHRoZSBvdGhlcgorCSAgZW5kIG9mIHRoZSBsaW5rIGFzIHdlbGwuIEl0J3MgZ29vZCBlbm91Z2gsIGZvciBleGFtcGxlLCB0byBydW4gSVAKKwkgIG92ZXIgdGhlIGFzeW5jIHBvcnRzIG9mIGEgQ2FtdGVjIEpOVCBQYWQuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORVRfRkMKKwlib29sICJGaWJyZSBDaGFubmVsIGRyaXZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUREVWSUNFUyAmJiBTQ1NJICYmIFBDSQorCWhlbHAKKwkgIEZpYnJlIENoYW5uZWwgaXMgYSBoaWdoIHNwZWVkIHNlcmlhbCBwcm90b2NvbCBtYWlubHkgdXNlZCB0byBjb25uZWN0CisJICBsYXJnZSBzdG9yYWdlIGRldmljZXMgdG8gdGhlIGNvbXB1dGVyOyBpdCBpcyBjb21wYXRpYmxlIHdpdGggYW5kCisJICBpbnRlbmRlZCB0byByZXBsYWNlIFNDU0kuCisKKwkgIElmIHlvdSBpbnRlbmQgdG8gdXNlIEZpYnJlIENoYW5uZWwsIHlvdSBuZWVkIHRvIGhhdmUgYSBGaWJyZSBjaGFubmVsCisJICBhZGFwdG9yIGNhcmQgaW4geW91ciBjb21wdXRlcjsgc2F5IFkgaGVyZSBhbmQgdG8gdGhlIGRyaXZlciBmb3IgeW91cgorCSAgYWRhcHRvciBiZWxvdy4gWW91IGFsc28gc2hvdWxkIGhhdmUgc2FpZCBZIHRvICJTQ1NJIHN1cHBvcnQiIGFuZAorCSAgIlNDU0kgZ2VuZXJpYyBzdXBwb3J0Ii4KKworY29uZmlnIFNIQVBFUgorCXRyaXN0YXRlICJUcmFmZmljIFNoYXBlciAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMgJiYgRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgVGhlIHRyYWZmaWMgc2hhcGVyIGlzIGEgdmlydHVhbCBuZXR3b3JrIGRldmljZSB0aGF0IGFsbG93cyB5b3UgdG8KKwkgIGxpbWl0IHRoZSByYXRlIG9mIG91dGdvaW5nIGRhdGEgZmxvdyBvdmVyIHNvbWUgb3RoZXIgbmV0d29yayBkZXZpY2UuCisJICBUaGUgdHJhZmZpYyB0aGF0IHlvdSB3YW50IHRvIHNsb3cgZG93biBjYW4gdGhlbiBiZSByb3V0ZWQgdGhyb3VnaAorCSAgdGhlc2UgdmlydHVhbCBkZXZpY2VzLiBTZWUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9zaGFwZXIudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCSAgQW4gYWx0ZXJuYXRpdmUgdG8gdGhpcyB0cmFmZmljIHNoYXBlciBpcyB0aGUgZXhwZXJpbWVudGFsCisJICBDbGFzcy1CYXNlZCBRdWV1ZWluZyAoQ0JRKSBzY2hlZHVsaW5nIHN1cHBvcnQgd2hpY2ggeW91IGdldCBpZiB5b3UKKwkgIHNheSBZIHRvICJRb1MgYW5kL29yIGZhaXIgcXVldWVpbmciIGFib3ZlLgorCisJICBUbyBzZXQgdXAgYW5kIGNvbmZpZ3VyZSBzaGFwZXIgZGV2aWNlcywgeW91IG5lZWQgdGhlIHNoYXBlY2ZnCisJICBwcm9ncmFtLCBhdmFpbGFibGUgZnJvbSA8ZnRwOi8vc2hhZG93LmNhYmkubmV0L3B1Yi9MaW51eC8+IGluIHRoZQorCSAgc2hhcGVyIHBhY2thZ2UuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNoYXBlci4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORVRDT05TT0xFCisJdHJpc3RhdGUgIk5ldHdvcmsgY29uc29sZSBsb2dnaW5nIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwlJZiB5b3Ugd2FudCB0byBsb2cga2VybmVsIG1lc3NhZ2VzIG92ZXIgdGhlIG5ldHdvcmssIGVuYWJsZSB0aGlzLgorCVNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0Y29uc29sZS50eHQ+IGZvciBkZXRhaWxzLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9MSUNFTlNFLlNSQyBiL2RyaXZlcnMvbmV0L0xJQ0VOU0UuU1JDCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzQ0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9MSUNFTlNFLlNSQwpAQCAtMCwwICsxLDE1IEBACitDb2RlIGluIHRoaXMgZGlyZWN0b3J5IHdyaXR0ZW4gYXQgdGhlIElEQSBTdXBlcmNvbXB1dGluZyBSZXNlYXJjaCBDZW50ZXIKK2NhcnJpZXMgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuCisKKyAgICBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQKKyAgICBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyAgICBJbiBhZGRpdGlvbiB0byB0aGUgZGlzY2xhaW1lcnMgaW4gdGhlIEdQTCwgU1JDIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55CisgICAgYW5kIGFsbCB3YXJyYW50aWVzLCBleHByZXNzZWQgb3IgaW1wbGllZCwgY29uY2VybmluZyB0aGUgZW5jbG9zZWQgc29mdHdhcmUuCisgICAgVGhpcyBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkIGF0IFNSQyBmb3IgdXNlIGluIGludGVybmFsIHJlc2VhcmNoLCBhbmQgdGhlCisgICAgaW50ZW50IGluIHNoYXJpbmcgdGhpcyBzb2Z0d2FyZSBpcyB0byBwcm9tb3RlIHRoZSBwcm9kdWN0aXZlIGludGVyY2hhbmdlCisgICAgb2YgaWRlYXMgdGhyb3VnaG91dCB0aGUgcmVzZWFyY2ggY29tbXVuaXR5LiAgIEFsbCBzb2Z0d2FyZSBpcyBmdXJuaXNoZWQKKyAgICBvbiBhbiAiYXMtaXMiIGJhc2lzLiAgTm8gZnVydGhlciB1cGRhdGVzIHRvIHRoaXMgc29mdHdhcmUgc2hvdWxkIGJlCisgICAgZXhwZWN0ZWQuICBBbHRob3VnaCB1cGRhdGVzIG1heSBvY2N1ciwgbm8gY29tbWl0bWVudCBleGlzdHMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDJiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQpAQCAtMCwwICsxLDE5NiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IG5ldHdvcmsgKGV0aGVyY2FyZCkgZGV2aWNlIGRyaXZlcnMuCisjCisKK2lmZXEgKCQoQ09ORklHX0lTRE5fUFBQKSx5KQorICBvYmotJChDT05GSUdfSVNETikgKz0gc2xoYy5vCitlbmRpZgorCitvYmotJChDT05GSUdfRTEwMDApICs9IGUxMDAwLworb2JqLSQoQ09ORklHX0lCTV9FTUFDKSArPSBpYm1fZW1hYy8KK29iai0kKENPTkZJR19JWEdCKSArPSBpeGdiLworb2JqLSQoQ09ORklHX0JPTkRJTkcpICs9IGJvbmRpbmcvCitvYmotJChDT05GSUdfR0lBTkZBUikgKz0gZ2lhbmZhcl9kcml2ZXIubworCitnaWFuZmFyX2RyaXZlci1vYmpzIDo9IGdpYW5mYXIubyBnaWFuZmFyX2V0aHRvb2wubyBnaWFuZmFyX3BoeS5vCisKKyMKKyMgbGluayBvcmRlciBpbXBvcnRhbnQgaGVyZQorIworb2JqLSQoQ09ORklHX1BMSVApICs9IHBsaXAubworCitvYmotJChDT05GSUdfUk9BRFJVTk5FUikgKz0gcnJ1bm5lci5vCisKK29iai0kKENPTkZJR19IQVBQWU1FQUwpICs9IHN1bmhtZS5vCitvYmotJChDT05GSUdfU1VOTEFOQ0UpICs9IHN1bmxhbmNlLm8KK29iai0kKENPTkZJR19TVU5RRSkgKz0gc3VucWUubworb2JqLSQoQ09ORklHX1NVTkJNQUMpICs9IHN1bmJtYWMubworb2JqLSQoQ09ORklHX01ZUklfU0JVUykgKz0gbXlyaV9zYnVzLm8KK29iai0kKENPTkZJR19TVU5HRU0pICs9IHN1bmdlbS5vIHN1bmdlbV9waHkubworCitvYmotJChDT05GSUdfTUFDRSkgKz0gbWFjZS5vCitvYmotJChDT05GSUdfQk1BQykgKz0gYm1hYy5vCisKK29iai0kKENPTkZJR19PQUtORVQpICs9IG9ha25ldC5vIDgzOTAubworCitvYmotJChDT05GSUdfREdSUykgKz0gZGdycy5vCitvYmotJChDT05GSUdfVk9SVEVYKSArPSAzYzU5eC5vCitvYmotJChDT05GSUdfVFlQSE9PTikgKz0gdHlwaG9vbi5vCitvYmotJChDT05GSUdfTkUyS19QQ0kpICs9IG5lMmstcGNpLm8gODM5MC5vCitvYmotJChDT05GSUdfUENORVQzMikgKz0gcGNuZXQzMi5vCitvYmotJChDT05GSUdfRUVQUk8xMDApICs9IGVlcHJvMTAwLm8KK29iai0kKENPTkZJR19FMTAwKSArPSBlMTAwLm8KK29iai0kKENPTkZJR19UTEFOKSArPSB0bGFuLm8KK29iai0kKENPTkZJR19FUElDMTAwKSArPSBlcGljMTAwLm8KK29iai0kKENPTkZJR19TSVM5MDApICs9IHNpczkwMC5vCitvYmotJChDT05GSUdfWUVMTE9XRklOKSArPSB5ZWxsb3dmaW4ubworb2JqLSQoQ09ORklHX0FDRU5JQykgKz0gYWNlbmljLm8KK29iai0kKENPTkZJR19JU0VSSUVTX1ZFVEgpICs9IGlzZXJpZXNfdmV0aC5vCitvYmotJChDT05GSUdfTkFUU0VNSSkgKz0gbmF0c2VtaS5vCitvYmotJChDT05GSUdfTlM4MzgyMCkgKz0gbnM4MzgyMC5vCitvYmotJChDT05GSUdfU1ROSUMpICs9IHN0bmljLm8gODM5MC5vCitvYmotJChDT05GSUdfRkVBTE5YKSArPSBmZWFsbngubworb2JqLSQoQ09ORklHX1RJR09OMykgKz0gdGczLm8KK29iai0kKENPTkZJR19UQzM1ODE1KSArPSB0YzM1ODE1Lm8KK29iai0kKENPTkZJR19TSzk4TElOKSArPSBzazk4bGluLworb2JqLSQoQ09ORklHX1NLRlApICs9IHNrZnAvCitvYmotJChDT05GSUdfVklBX1JISU5FKSArPSB2aWEtcmhpbmUubworb2JqLSQoQ09ORklHX1ZJQV9WRUxPQ0lUWSkgKz0gdmlhLXZlbG9jaXR5Lm8KK29iai0kKENPTkZJR19BREFQVEVDX1NUQVJGSVJFKSArPSBzdGFyZmlyZS5vCisKKyMKKyMgZW5kIGxpbmsgb3JkZXIgc2VjdGlvbgorIworCitvYmotJChDT05GSUdfTUlJKSArPSBtaWkubworCitvYmotJChDT05GSUdfU1VOREFOQ0UpICs9IHN1bmRhbmNlLm8KK29iai0kKENPTkZJR19IQU1BQ0hJKSArPSBoYW1hY2hpLm8KK29iai0kKENPTkZJR19ORVQpICs9IFNwYWNlLm8gbG9vcGJhY2subworb2JqLSQoQ09ORklHX1NFRVE4MDA1KSArPSBzZWVxODAwNS5vCitvYmotJChDT05GSUdfTkVUX1NCMTAwMCkgKz0gc2IxMDAwLm8KK29iai0kKENPTkZJR19NQUM4MzkwKSArPSBtYWM4MzkwLm8gODM5MC5vCitvYmotJChDT05GSUdfQVBORSkgKz0gYXBuZS5vIDgzOTAubworb2JqLSQoQ09ORklHX1BDTUNJQV9QQ05FVCkgKz0gODM5MC5vCitvYmotJChDT05GSUdfU0hBUEVSKSArPSBzaGFwZXIubworb2JqLSQoQ09ORklHX1NLX0cxNikgKz0gc2tfZzE2Lm8KK29iai0kKENPTkZJR19IUDEwMCkgKz0gaHAxMDAubworb2JqLSQoQ09ORklHX1NNQzkxOTQpICs9IHNtYzkxOTQubworb2JqLSQoQ09ORklHX0ZFQykgKz0gZmVjLm8KK29iai0kKENPTkZJR182ODM2MF9FTkVUKSArPSA2ODM2MGVuZXQubworb2JqLSQoQ09ORklHX0FSTV9FVEhFUkgpICs9IDgzOTAubworb2JqLSQoQ09ORklHX1dEODB4MykgKz0gd2QubyA4MzkwLm8KK29iai0kKENPTkZJR19FTDIpICs9IDNjNTAzLm8gODM5MC5vCitvYmotJChDT05GSUdfTkUyMDAwKSArPSBuZS5vIDgzOTAubworb2JqLSQoQ09ORklHX05FMl9NQ0EpICs9IG5lMi5vIDgzOTAubworb2JqLSQoQ09ORklHX0hQTEFOKSArPSBocC5vIDgzOTAubworb2JqLSQoQ09ORklHX0hQTEFOX1BMVVMpICs9IGhwLXBsdXMubyA4MzkwLm8KK29iai0kKENPTkZJR19VTFRSQSkgKz0gc21jLXVsdHJhLm8gODM5MC5vCitvYmotJChDT05GSUdfVUxUUkFNQ0EpICs9IHNtYy1tY2EubyA4MzkwLm8KK29iai0kKENPTkZJR19VTFRSQTMyKSArPSBzbWMtdWx0cmEzMi5vIDgzOTAubworb2JqLSQoQ09ORklHX0UyMTAwKSArPSBlMjEwMC5vIDgzOTAubworb2JqLSQoQ09ORklHX0VTMzIxMCkgKz0gZXMzMjEwLm8gODM5MC5vCitvYmotJChDT05GSUdfTE5FMzkwKSArPSBsbmUzOTAubyA4MzkwLm8KK29iai0kKENPTkZJR19ORTMyMTApICs9IG5lMzIxMC5vIDgzOTAubworb2JqLSQoQ09ORklHX05FVF9TQjEyNTBfTUFDKSArPSBzYjEyNTAtbWFjLm8KK29iai0kKENPTkZJR19CNDQpICs9IGI0NC5vCitvYmotJChDT05GSUdfRk9SQ0VERVRIKSArPSBmb3JjZWRldGgubworb2JqLSQoQ09ORklHX05FX0g4MzAwKSArPSBuZS1oODMwMC5vIDgzOTAubworCitvYmotJChDT05GSUdfTVY2NDNYWF9FVEgpICs9IG12NjQzeHhfZXRoLm8KKworb2JqLSQoQ09ORklHX1BQUCkgKz0gcHBwX2dlbmVyaWMubyBzbGhjLm8KK29iai0kKENPTkZJR19QUFBfQVNZTkMpICs9IHBwcF9hc3luYy5vCitvYmotJChDT05GSUdfUFBQX1NZTkNfVFRZKSArPSBwcHBfc3luY3R0eS5vCitvYmotJChDT05GSUdfUFBQX0RFRkxBVEUpICs9IHBwcF9kZWZsYXRlLm8KK29iai0kKENPTkZJR19QUFBfQlNEQ09NUCkgKz0gYnNkX2NvbXAubworb2JqLSQoQ09ORklHX1BQUE9FKSArPSBwcHBveC5vIHBwcG9lLm8KKworb2JqLSQoQ09ORklHX1NMSVApICs9IHNsaXAubworaWZlcSAoJChDT05GSUdfU0xJUF9DT01QUkVTU0VEKSx5KQorICBvYmotJChDT05GSUdfU0xJUCkgKz0gc2xoYy5vCitlbmRpZgorCitvYmotJChDT05GSUdfRFVNTVkpICs9IGR1bW15Lm8KK29iai0kKENPTkZJR19ERTYwMCkgKz0gZGU2MDAubworb2JqLSQoQ09ORklHX0RFNjIwKSArPSBkZTYyMC5vCitvYmotJChDT05GSUdfTEFOQ0UpICs9IGxhbmNlLm8KK29iai0kKENPTkZJR19TVU4zXzgyNTg2KSArPSBzdW4zXzgyNTg2Lm8KK29iai0kKENPTkZJR19TVU4zTEFOQ0UpICs9IHN1bjNsYW5jZS5vCitvYmotJChDT05GSUdfREVGWFgpICs9IGRlZnh4Lm8KK29iai0kKENPTkZJR19TR0lTRUVRKSArPSBzZ2lzZWVxLm8KK29iai0kKENPTkZJR19TR0lfTzJNQUNFX0VUSCkgKz0gbWV0aC5vCitvYmotJChDT05GSUdfQVQxNzAwKSArPSBhdDE3MDAubworb2JqLSQoQ09ORklHX0ZNVjE4WCkgKz0gZm12MTh4Lm8KK29iai0kKENPTkZJR19FTDEpICs9IDNjNTAxLm8KK29iai0kKENPTkZJR19FTDE2KSArPSAzYzUwNy5vCitvYmotJChDT05GSUdfRUxNQykgKz0gM2M1MjMubworb2JqLSQoQ09ORklHX1NLTUMpICs9IHNrX21jYS5vCitvYmotJChDT05GSUdfSUJNTEFOQSkgKz0gaWJtbGFuYS5vCitvYmotJChDT05GSUdfRUxNQ19JSSkgKz0gM2M1Mjcubworb2JqLSQoQ09ORklHX0VMMykgKz0gM2M1MDkubworb2JqLSQoQ09ORklHXzNDNTE1KSArPSAzYzUxNS5vCitvYmotJChDT05GSUdfRUVYUFJFU1MpICs9IGVleHByZXNzLm8KK29iai0kKENPTkZJR19FRVhQUkVTU19QUk8pICs9IGVlcHJvLm8KK29iai0kKENPTkZJR184MTM5Q1ApICs9IDgxMzljcC5vCitvYmotJChDT05GSUdfODEzOVRPTykgKz0gODEzOXRvby5vCitvYmotJChDT05GSUdfWk5FVCkgKz0gem5ldC5vCitvYmotJChDT05GSUdfTEFOX1NBQTk3MzApICs9IHNhYTk3MzAubworb2JqLSQoQ09ORklHX0RFUENBKSArPSBkZXBjYS5vCitvYmotJChDT05GSUdfRVdSSzMpICs9IGV3cmszLm8KK29iai0kKENPTkZJR19BVFApICs9IGF0cC5vCitvYmotJChDT05GSUdfTkk1MDEwKSArPSBuaTUwMTAubworb2JqLSQoQ09ORklHX05JNTIpICs9IG5pNTIubworb2JqLSQoQ09ORklHX05JNjUpICs9IG5pNjUubworb2JqLSQoQ09ORklHX0VMUExVUykgKz0gM2M1MDUubworb2JqLSQoQ09ORklHX0FDMzIwMCkgKz0gYWMzMjAwLm8gODM5MC5vCitvYmotJChDT05GSUdfQVBSSUNPVCkgKz0gODI1OTYubworb2JqLSQoQ09ORklHX0xBU0lfODI1OTYpICs9IGxhc2lfODI1OTYubworb2JqLSQoQ09ORklHX01WTUUxNnhfTkVUKSArPSA4MjU5Ni5vCitvYmotJChDT05GSUdfQlZNRTYwMDBfTkVUKSArPSA4MjU5Ni5vCisKKyMgVGhpcyBpcyBhbHNvIGEgODI1OTYgYW5kIHNob3VsZCBwcm9iYWJseSBiZSBtZXJnZWQKK29iai0kKENPTkZJR19MUDQ4NkUpICs9IGxwNDg2ZS5vCisKK29iai0kKENPTkZJR19FVEgxNkkpICs9IGV0aDE2aS5vCitvYmotJChDT05GSUdfWk9SUk84MzkwKSArPSB6b3JybzgzOTAubyA4MzkwLm8KK29iai0kKENPTkZJR19IUExBTkNFKSArPSBocGxhbmNlLm8gNzk5MC5vCitvYmotJChDT05GSUdfTVZNRTE0N19ORVQpICs9IG12bWUxNDcubyA3OTkwLm8KK29iai0kKENPTkZJR19FUVVBTElaRVIpICs9IGVxbC5vCitvYmotJChDT05GSUdfTUlQU19KQVpaX1NPTklDKSArPSBqYXp6c29uaWMubworb2JqLSQoQ09ORklHX01JUFNfR1Q5NjEwMEVUSCkgKz0gZ3Q5NjEwMGV0aC5vCitvYmotJChDT05GSUdfTUlQU19BVTFYMDBfRU5FVCkgKz0gYXUxMDAwX2V0aC5vCitvYmotJChDT05GSUdfU0dJX0lPQzNfRVRIKSArPSBpb2MzLWV0aC5vCitvYmotJChDT05GSUdfREVDTEFOQ0UpICs9IGRlY2xhbmNlLm8KK29iai0kKENPTkZJR19BVEFSSUxBTkNFKSArPSBhdGFyaWxhbmNlLm8KK29iai0kKENPTkZJR19BVEFSSV9CSU9ORVQpICs9IGF0YXJpX2Jpb25ldC5vCitvYmotJChDT05GSUdfQVRBUklfUEFNU05FVCkgKz0gYXRhcmlfcGFtc25ldC5vCitvYmotJChDT05GSUdfQTIwNjUpICs9IGEyMDY1Lm8KK29iai0kKENPTkZJR19IWURSQSkgKz0gaHlkcmEubyA4MzkwLm8KK29iai0kKENPTkZJR19BUklBRE5FKSArPSBhcmlhZG5lLm8KK29iai0kKENPTkZJR19DUzg5eDApICs9IGNzODl4MC5vCitvYmotJChDT05GSUdfTUFDU09OSUMpICs9IG1hY3NvbmljLm8KK29iai0kKENPTkZJR19NQUNNQUNFKSArPSBtYWNtYWNlLm8KK29iai0kKENPTkZJR19NQUM4OXgwKSArPSBtYWM4OXgwLm8KK29iai0kKENPTkZJR19UVU4pICs9IHR1bi5vCitvYmotJChDT05GSUdfREwySykgKz0gZGwyay5vCitvYmotJChDT05GSUdfUjgxNjkpICs9IHI4MTY5Lm8KK29iai0kKENPTkZJR19BTUQ4MTExX0VUSCkgKz0gYW1kODExMWUubworb2JqLSQoQ09ORklHX0lCTVZFVEgpICs9IGlibXZldGgubworb2JqLSQoQ09ORklHX1MySU8pICs9IHMyaW8ubworb2JqLSQoQ09ORklHX1NNQzkxWCkgKz0gc21jOTF4Lm8KK29iai0kKENPTkZJR19GRUNfOFhYKSArPSBmZWNfOHh4LworCitvYmotJChDT05GSUdfQVJNKSArPSBhcm0vCitvYmotJChDT05GSUdfREVWX0FQUExFVEFMSykgKz0gYXBwbGV0YWxrLworb2JqLSQoQ09ORklHX1RSKSArPSB0b2tlbnJpbmcvCitvYmotJChDT05GSUdfV0FOKSArPSB3YW4vCitvYmotJChDT05GSUdfQVJDTkVUKSArPSBhcmNuZXQvCitvYmotJChDT05GSUdfTkVUX1BDTUNJQSkgKz0gcGNtY2lhLworb2JqLSQoQ09ORklHX05FVF9XSVJFTEVTUykgKz0gd2lyZWxlc3MvCitvYmotJChDT05GSUdfTkVUX1RVTElQKSArPSB0dWxpcC8KK29iai0kKENPTkZJR19IQU1SQURJTykgKz0gaGFtcmFkaW8vCitvYmotJChDT05GSUdfSVJEQSkgKz0gaXJkYS8KK29iai0kKENPTkZJR19FVFJBWF9FVEhFUk5FVCkgKz0gY3Jpcy8KKworb2JqLSQoQ09ORklHX05FVENPTlNPTEUpICs9IG5ldGNvbnNvbGUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvU3BhY2UuYyBiL2RyaXZlcnMvbmV0L1NwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1MTkzNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L1NwYWNlLmMKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJSG9sZHMgaW5pdGlhbCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBkZXZpY2VzLgorICoKKyAqIFZlcnNpb246CUAoIylTcGFjZS5jCTEuMC43CTA4LzEyLzkzCisgKgorICogQXV0aG9yczoJUm9zcyBCaXJvLCA8YmlyN0BsZWxhbmQuU3RhbmZvcmQuRWR1PgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCURvbmFsZCBKLiBCZWNrZXIsIDxiZWNrZXJAc2N5bGQuY29tPgorICoKKyAqIENoYW5nZWxvZzoKKyAqCQlTdGVwaGVuIEhlbW1pbmdlciAoMDkvMjAwMykKKyAqCQktIGdldCByaWQgb2YgcHJlLWxpbmtlZCBkZXYgbGlzdCwgZHluYW1pYyBkZXZpY2UgYWxsb2NhdGlvbgorICoJCVBhdWwgR29ydG1ha2VyICgwMy8yMDAyKQorICoJCS0gc3RydWN0IGluaXQgY2xlYW51cCwgZW5hYmxlIG11bHRpcGxlIElTQSBhdXRvcHJvYmVzLgorICoJCUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiAtIDA5LzE5OTkKKyAqCQktIGZpeCBzYm5pOiBzL2RldmljZS9uZXRfZGV2aWNlLworICoJCVBhdWwgR29ydG1ha2VyICgwNi85OCk6IAorICoJCSAtIHNvcnQgcHJvYmVzIGluIGEgc2FuZSB3YXksIG1ha2Ugc3VyZSBhbGwgKHNhZmUpIHByb2JlcworICoJCSAgIGdldCBydW4gb25jZSAmIGZhaWxlZCBhdXRvcHJvYmVzIGRvbid0IGF1dG9wcm9iZSBhZ2Fpbi4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvZGl2ZXJ0Lmg+CisKKy8qIEEgdW5pZmllZCBldGhlcm5ldCBkZXZpY2UgcHJvYmUuICBUaGlzIGlzIHRoZSBlYXNpZXN0IHdheSB0byBoYXZlIGV2ZXJ5CisgICBldGhlcm5ldCBhZGFwdG9yIGhhdmUgdGhlIG5hbWUgImV0aFswMTIzLi4uXSIuCisgICAqLworCitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKm5lMl9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmhwMTAwX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqdWx0cmFfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICp1bHRyYTMyX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqd2RfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICplbDJfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpuZV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmhwX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqaHBfcGx1c19wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmV4cHJlc3NfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICplZXByb19wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmF0MTcwMF9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmZtdjE4eF9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmV0aDE2aV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmk4MjU5Nl9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmV3cmszX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqZWwxX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqd2F2ZWxhbl9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFybGFuX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqZWwxNl9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmVsbWNfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpza21jYV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmVscGx1c19wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFjMzIwMF9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmVzX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqbG5lMzkwX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqZTIxMDBfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpuaTUwMTBfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpuaTUyX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqbmk2NV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKnNvbmljX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqU0tfaW5pdChpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKnNlZXE4MDA1X3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqc21jX2luaXQoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphdGFyaWxhbmNlX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqc3VuM2xhbmNlX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqc3VuM184MjU4Nl9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFwbmVfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpiaW9uZXRfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpwYW1zbmV0X3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqY3M4OXgwX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqaHBsYW5jZV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmJhZ2V0bGFuY2VfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICptdm1lMTQ3bGFuY2VfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICp0YzUxNV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmxhbmNlX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqbWFjZV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKm1hY3NvbmljX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqbWFjODM5MF9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKm1hYzg5eDBfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICptYzMyX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqY29wc19wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmx0cGNfcHJvYmUodm9pZCk7CisgIAorLyogRGV0YWNoYWJsZSBkZXZpY2VzICgicG9ja2V0IGFkYXB0b3JzIikgKi8KK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqZGU2MjBfcHJvYmUoaW50IHVuaXQpOworCisvKiBGaWJyZSBDaGFubmVsIGFkYXB0ZXJzICovCitleHRlcm4gaW50IGlwaDU1MjZfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIFNCTkkgYWRhcHRlcnMgKi8KK2V4dGVybiBpbnQgc2JuaV9wcm9iZShpbnQgdW5pdCk7CisKK3N0cnVjdCBkZXZwcm9iZTIgeworCXN0cnVjdCBuZXRfZGV2aWNlICooKnByb2JlKShpbnQgdW5pdCk7CisJaW50IHN0YXR1czsJLyogbm9uLXplcm8gaWYgYXV0b3Byb2JlIGhhcyBmYWlsZWQgKi8KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX2xpc3QyKGludCB1bml0LCBzdHJ1Y3QgZGV2cHJvYmUyICpwLCBpbnQgYXV0b3Byb2JlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJZm9yICg7IHAtPnByb2JlOyBwKyspIHsKKwkJaWYgKGF1dG9wcm9iZSAmJiBwLT5zdGF0dXMpCisJCQljb250aW51ZTsKKwkJZGV2ID0gcC0+cHJvYmUodW5pdCk7CisJCWlmICghSVNfRVJSKGRldikpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGF1dG9wcm9iZSkKKwkJCXAtPnN0YXR1cyA9IFBUUl9FUlIoZGV2KTsKKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgYml0IG9mIGFuIGFydGlmaWNpYWwgc2VwYXJhdGlvbiBhcyB0aGVyZSBhcmUgUENJIGRyaXZlcnMKKyAqIHRoYXQgYWxzbyBwcm9iZSBmb3IgRUlTQSBjYXJkcyAoaW4gdGhlIFBDSSBncm91cCkgYW5kIHRoZXJlIGFyZSBJU0EKKyAqIGRyaXZlcnMgdGhhdCBwcm9iZSBmb3IgRUlTQSBjYXJkcyAoaW4gdGhlIElTQSBncm91cCkuICBUaGVzZSBhcmUgdGhlCisgKiBsZWdhY3kgRUlTQSBvbmx5IGRyaXZlciBwcm9iZXMsIGFuZCBhbHNvIHRoZSBsZWdhY3kgUENJIHByb2JlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgZGV2cHJvYmUyIGVpc2FfcHJvYmVzW10gX19pbml0ZGF0YSA9IHsKKyNpZmRlZiBDT05GSUdfVUxUUkEzMiAKKwl7dWx0cmEzMl9wcm9iZSwgMH0sCQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FDMzIwMAkKKwl7YWMzMjAwX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FUzMyMTAKKwl7ZXNfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0xORTM5MAorCXtsbmUzOTBfcHJvYmUsIDB9LAorI2VuZGlmCisJe05VTEwsIDB9LAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZwcm9iZTIgbWNhX3Byb2Jlc1tdIF9faW5pdGRhdGEgPSB7CisjaWZkZWYgQ09ORklHX05FMl9NQ0EKKwl7bmUyX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FTE1DCQkvKiAzYzUyMyAqLworCXtlbG1jX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FTE1DX0lJCQkvKiAzYzUyNyAqLworCXttYzMyX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TS01DICAgICAgICAgICAgICAvKiBTS25ldCBNaWNyb2NoYW5uZWwgKi8KKyAgICAgICAge3NrbWNhX3Byb2JlLCAwfSwKKyNlbmRpZgorCXtOVUxMLCAwfSwKK307CisKKy8qCisgKiBJU0EgcHJvYmVzIHRoYXQgdG91Y2ggYWRkcmVzc2VzIDwgMHg0MDAgKGluY2x1ZGluZyB0aG9zZSB0aGF0IGFsc28KKyAqIGxvb2sgZm9yIEVJU0EvUENJL01DQSBjYXJkcyBpbiBhZGRpdGlvbiB0byBJU0EgY2FyZHMpLgorICovCitzdGF0aWMgc3RydWN0IGRldnByb2JlMiBpc2FfcHJvYmVzW10gX19pbml0ZGF0YSA9IHsKKyNpZmRlZiBDT05GSUdfSFAxMDAgCQkvKiBJU0EsIEVJU0EgJiBQQ0kgKi8KKwl7aHAxMDBfcHJvYmUsIDB9LAorI2VuZGlmCQorI2lmZGVmIENPTkZJR18zQzUxNQorCXt0YzUxNV9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVUxUUkEgCisJe3VsdHJhX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19XRDgweDMgCisJe3dkX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FTDIgCQkvKiAzYzUwMyAqLworCXtlbDJfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0hQTEFOCisJe2hwX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19IUExBTl9QTFVTCisJe2hwX3BsdXNfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0UyMTAwCQkvKiBDYWJsZXRyb24gRTIxeHggc2VyaWVzLiAqLworCXtlMjEwMF9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19ORTIwMDApIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19ORV9IODMwMCkgIC8qIElTQSAodXNlIG5lMmstcGNpIGZvciBQQ0kgY2FyZHMpICovCisJe25lX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19MQU5DRQkJLyogSVNBL1ZMQiAodXNlIHBjbmV0MzIgZm9yIFBDSSBjYXJkcykgKi8KKwl7bGFuY2VfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NNQzkxOTQKKwl7c21jX2luaXQsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFRVE4MDA1IAorCXtzZWVxODAwNV9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ1M4OXgwCisgCXtjczg5eDBfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FUMTcwMAorCXthdDE3MDBfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZNVjE4WAkJLyogRnVqaXRzdSBGTVYtMTgxLzE4MiAqLworCXtmbXYxOHhfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0VUSDE2SQorCXtldGgxNmlfcHJvYmUsIDB9LAkvKiBJQ0wgRXRoZXJUZWFtIDE2aS8zMiAqLworI2VuZGlmCisjaWZkZWYgQ09ORklHX0VFWFBSRVNTCQkvKiBJbnRlbCBFdGhlckV4cHJlc3MgKi8KKwl7ZXhwcmVzc19wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRUVYUFJFU1NfUFJPCS8qIEludGVsIEV0aGVyRXhwcmVzcyBQcm8vMTAgKi8KKwl7ZWVwcm9fcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0VXUkszICAgICAgICAgICAgIC8qIERFQyBFdGhlcldPUktTIDMgKi8KKyAgICAJe2V3cmszX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FQUklDT1QpIHx8IGRlZmluZWQoQ09ORklHX01WTUUxNnhfTkVUKSB8fCBkZWZpbmVkKENPTkZJR19CVk1FNjAwMF9ORVQpCS8qIEludGVsIEk4MjU5NiAqLworCXtpODI1OTZfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0VMMQkJLyogM2M1MDEgKi8KKwl7ZWwxX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19XQVZFTEFOCQkvKiBXYXZlTEFOICovCisJe3dhdmVsYW5fcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSTEFOCQkvKiBBaXJvbmV0ICovCisJe2FybGFuX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FTDE2CQkvKiAzYzUwNyAqLworCXtlbDE2X3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FTFBMVVMJCS8qIDNjNTA1ICovCisJe2VscGx1c19wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0tfRzE2CisJe1NLX2luaXQsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX05JNTAxMAorCXtuaTUwMTBfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX05JNTIKKwl7bmk1Ml9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkk2NQorCXtuaTY1X3Byb2JlLCAwfSwKKyNlbmRpZgorCXtOVUxMLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2cHJvYmUyIHBhcnBvcnRfcHJvYmVzW10gX19pbml0ZGF0YSA9IHsKKyNpZmRlZiBDT05GSUdfREU2MjAJCS8qIEQtTGluayBERS02MjAgYWRhcHRlciAqLworCXtkZTYyMF9wcm9iZSwgMH0sCisjZW5kaWYKKwl7TlVMTCwgMH0sCit9OworCitzdGF0aWMgc3RydWN0IGRldnByb2JlMiBtNjhrX3Byb2Jlc1tdIF9faW5pdGRhdGEgPSB7CisjaWZkZWYgQ09ORklHX0FUQVJJTEFOQ0UJLyogTGFuY2UtYmFzZWQgQXRhcmkgZXRoZXJuZXQgYm9hcmRzICovCisJe2F0YXJpbGFuY2VfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NVTjNMQU5DRSAgICAgICAgIC8qIHN1bjMgb25ib2FyZCBMYW5jZSBjaGlwICovCisJe3N1bjNsYW5jZV9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1VOM184MjU4NiAgICAgICAgLyogc3VuMyBvbmJvYXJkIEludGVsIDgyNTg2IGNoaXAgKi8KKwl7c3VuM184MjU4Nl9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVBORQkJLyogQTEyMDAgUENNQ0lBIE5FMjAwMCAqLworCXthcG5lX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BVEFSSV9CSU9ORVQJLyogQXRhcmkgQmlvbmV0IEV0aGVybmV0IGJvYXJkICovCisJe2Jpb25ldF9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVRBUklfUEFNU05FVAkvKiBBdGFyaSBQQU1zTmV0IEV0aGVybmV0IGJvYXJkICovCisJe3BhbXNuZXRfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX01WTUUxNDdfTkVUCS8qIE1WTUUxNDcgaW50ZXJuYWwgRXRoZXJuZXQgKi8KKwl7bXZtZTE0N2xhbmNlX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NQUNNQUNFCQkvKiBNYWMgNjhrIFF1YWRyYSBBViBidWlsdGluIEV0aGVybmV0ICovCisJe21hY2VfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX01BQ1NPTklDCQkvKiBNYWMgU09OSUMtYmFzZWQgRXRoZXJuZXQgb2YgYWxsIHNvcnRzICovIAorCXttYWNzb25pY19wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUFDODM5MCAgICAgICAgICAgLyogTnVCdXMgTlM4MzkwLWJhc2VkIGNhcmRzICovCisJe21hYzgzOTBfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX01BQzg5eDAKKyAJe21hYzg5eDBfcHJvYmUsIDB9LAorI2VuZGlmCisJe05VTEwsIDB9LAorfTsKKworLyoKKyAqIFVuaWZpZWQgZXRoZXJuZXQgZGV2aWNlIHByb2JlLCBzZWdtZW50ZWQgcGVyIGFyY2hpdGVjdHVyZSBhbmQKKyAqIHBlciBidXMgaW50ZXJmYWNlLiBUaGlzIGRyaXZlcyB0aGUgbGVnYWN5IGRldmljZXMgb25seSBmb3Igbm93LgorICovCisgCitzdGF0aWMgdm9pZCBfX2luaXQgZXRoaWZfcHJvYmUyKGludCB1bml0KQoreworCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyID0gbmV0ZGV2X2Jvb3RfYmFzZSgiZXRoIiwgdW5pdCk7CisKKwlpZiAoYmFzZV9hZGRyID09IDEpCisJCXJldHVybjsKKworCSh2b2lkKSgJcHJvYmVfbGlzdDIodW5pdCwgbTY4a19wcm9iZXMsIGJhc2VfYWRkciA9PSAwKSAmJgorCQlwcm9iZV9saXN0Mih1bml0LCBlaXNhX3Byb2JlcywgYmFzZV9hZGRyID09IDApICYmCisJCXByb2JlX2xpc3QyKHVuaXQsIG1jYV9wcm9iZXMsIGJhc2VfYWRkciA9PSAwKSAmJgorCQlwcm9iZV9saXN0Mih1bml0LCBpc2FfcHJvYmVzLCBiYXNlX2FkZHIgPT0gMCkgJiYKKwkJcHJvYmVfbGlzdDIodW5pdCwgcGFycG9ydF9wcm9iZXMsIGJhc2VfYWRkciA9PSAwKSk7Cit9CisKKyNpZmRlZiBDT05GSUdfVFIKKy8qIFRva2VuLXJpbmcgZGV2aWNlIHByb2JlICovCitleHRlcm4gaW50IGlibXRyX3Byb2JlX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKnNrX2lzYV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKnByb3Rlb25fcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpzbWN0cl9wcm9iZShpbnQgdW5pdCk7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2cHJvYmUyIHRyX3Byb2JlczJbXSBfX2luaXRkYXRhID0geworI2lmZGVmIENPTkZJR19TS0lTQQorCXtza19pc2FfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BST1RFT04KKwl7cHJvdGVvbl9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU01DVFIKKwl7c21jdHJfcHJvYmUsIDB9LAorI2VuZGlmCisJe05VTEwsIDB9LAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgdHJpZl9wcm9iZShpbnQgdW5pdCkKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKyNpZmRlZiBDT05GSUdfSUJNVFIKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfdHJkZXYoMCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJ0ciVkIiwgdW5pdCk7CisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwllcnIgPSBpYm10cl9wcm9iZV9jYXJkKGRldik7CisJaWYgKGVycikKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKyNlbmRpZgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0cmlmX3Byb2JlMihpbnQgdW5pdCkKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2VfYWRkciA9IG5ldGRldl9ib290X2Jhc2UoInRyIiwgdW5pdCk7CisKKwlpZiAoYmFzZV9hZGRyID09IDEpCisJCXJldHVybjsKKwlwcm9iZV9saXN0Mih1bml0LCB0cl9wcm9iZXMyLCBiYXNlX2FkZHIgPT0gMCk7Cit9CisjZW5kaWYKKworCQorLyoKKyAqCVRoZSBsb29wYmFjayBkZXZpY2UgaXMgZ2xvYmFsIHNvIGl0IGNhbiBiZSBkaXJlY3RseSByZWZlcmVuY2VkCisgKglieSB0aGUgbmV0d29yayBjb2RlLiBBbHNvLCBpdCBtdXN0IGJlIGZpcnN0IG9uIGRldmljZSBsaXN0LgorICovCitleHRlcm4gaW50IGxvb3BiYWNrX2luaXQodm9pZCk7CisKKy8qICBTdGF0aWNhbGx5IGNvbmZpZ3VyZWQgZHJpdmVycyAtLSBvcmRlciBtYXR0ZXJzIGhlcmUuICovCitzdGF0aWMgaW50IF9faW5pdCBuZXRfb2xkZGV2c19pbml0KHZvaWQpCit7CisJaW50IG51bTsKKworCWlmIChsb29wYmFja19pbml0KCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJOZXR3b3JrIGxvb3BiYWNrIGRldmljZSBzZXR1cCBmYWlsZWRcbiIpOworCX0KKworCQorI2lmZGVmIENPTkZJR19TQk5JCisJZm9yIChudW0gPSAwOyBudW0gPCA4OyArK251bSkKKwkJc2JuaV9wcm9iZShudW0pOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1RSCisJZm9yIChudW0gPSAwOyBudW0gPCA4OyArK251bSkKKwkJaWYgKCF0cmlmX3Byb2JlKG51bSkpCisJCQl0cmlmX3Byb2JlMihudW0pOworI2VuZGlmCisJZm9yIChudW0gPSAwOyBudW0gPCA4OyArK251bSkKKwkJZXRoaWZfcHJvYmUyKG51bSk7CisKKyNpZmRlZiBDT05GSUdfQ09QUworCWNvcHNfcHJvYmUoMCk7CisJY29wc19wcm9iZSgxKTsKKwljb3BzX3Byb2JlKDIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0xUUEMKKwlsdHBjX3Byb2JlKCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwobmV0X29sZGRldnNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hMjA2NS5jIGIvZHJpdmVycy9uZXQvYTIwNjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTUzOGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYTIwNjUuYwpAQCAtMCwwICsxLDg0MyBAQAorLyoKKyAqIEFtaWdhIExpbnV4LzY4ayBBMjA2NSBFdGhlcm5ldCBEcml2ZXIKKyAqCisgKiAoQykgQ29weXJpZ2h0IDE5OTUtMjAwMyBieSBHZWVydCBVeXR0ZXJob2V2ZW4gPGdlZXJ0QGxpbnV4LW02OGsub3JnPgorICoKKyAqIEZpeGVzIGFuZCB0aXBzIGJ5OgorICoJLSBKYW5vcyBGYXJrYXMgKENIRVhVTUBzcGFydGEuYmFua2kuaHUpCisgKgktIEplcyBEZWduIFNvZXJlbnNlbiAoamRzQGtvbS5hdWMuZGspCisgKgktIE1hdHQgRG9tc2NoIChNYXR0X0RvbXNjaEBkZWxsLmNvbSkKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uCisgKgorICoJYXJpYWRuZS4/OglBbWlnYSBMaW51eC82OGsgQXJpYWRuZSBFdGhlcm5ldCBEcml2ZXIKKyAqCQkJKEMpIENvcHlyaWdodCAxOTk1IGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXRlciBEZSBTY2hyaWp2ZXIKKyAqCisgKglsYW5jZS5jOglBbiBBTUQgTEFOQ0UgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4KKyAqCQkJV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICoJQW03OUM5NjA6CVBDbmV0KHRtKS1JU0EgU2luZ2xlLUNoaXAgRXRoZXJuZXQgQ29udHJvbGxlcgorICoJCQlBZHZhbmNlZCBNaWNybyBEZXZpY2VzCisgKgkJCVB1YmxpY2F0aW9uICMxNjkwNywgUmV2LiBCLCBBbWVuZG1lbnQvMCwgTWF5IDE5OTQKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4CisgKiBkaXN0cmlidXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhlIEEyMDY1IGlzIGEgWm9ycm8tSUkgYm9hcmQgbWFkZSBieSBDb21tb2RvcmUvQW1lcmlzdGFyLiBJdCBjb250YWluczoKKyAqCisgKgktIGFuIEFtNzk5MCBMb2NhbCBBcmVhIE5ldHdvcmsgQ29udHJvbGxlciBmb3IgRXRoZXJuZXQgKExBTkNFKSB3aXRoCisgKgkgIGJvdGggMTBCQVNFLTIgKHRoaW4gY29heCkgYW5kIEFVSSAoREItMTUpIGNvbm5lY3RvcnMKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorCisjaW5jbHVkZSAiYTIwNjUuaCIKKworCisJLyoKKwkgKgkJVHJhbnNtaXQvUmVjZWl2ZSBSaW5nIERlZmluaXRpb25zCisJICovCisKKyNkZWZpbmUgTEFOQ0VfTE9HX1RYX0JVRkZFUlMJKDIpCisjZGVmaW5lIExBTkNFX0xPR19SWF9CVUZGRVJTCSg0KQorCisjZGVmaW5lIFRYX1JJTkdfU0laRQkJKDE8PExBTkNFX0xPR19UWF9CVUZGRVJTKQorI2RlZmluZSBSWF9SSU5HX1NJWkUJCSgxPDxMQU5DRV9MT0dfUlhfQlVGRkVSUykKKworI2RlZmluZSBUWF9SSU5HX01PRF9NQVNLCShUWF9SSU5HX1NJWkUtMSkKKyNkZWZpbmUgUlhfUklOR19NT0RfTUFTSwkoUlhfUklOR19TSVpFLTEpCisKKyNkZWZpbmUgUEtUX0JVRl9TSVpFCQkoMTU0NCkKKyNkZWZpbmUgUlhfQlVGRl9TSVpFICAgICAgICAgICAgUEtUX0JVRl9TSVpFCisjZGVmaW5lIFRYX0JVRkZfU0laRSAgICAgICAgICAgIFBLVF9CVUZfU0laRQorCisKKwkvKgorCSAqCQlMYXlvdXQgb2YgdGhlIExhbmNlJ3MgUkFNIEJ1ZmZlcgorCSAqLworCisKK3N0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIHsKKwl1bnNpZ25lZCBzaG9ydCBtb2RlOwkJLyogUHJlLXNldCBtb2RlIChyZWcuIDE1KSAqLworCXVuc2lnbmVkIGNoYXIgcGh5c19hZGRyWzZdOyAgICAgLyogUGh5c2ljYWwgZXRoZXJuZXQgYWRkcmVzcyAqLworCXVuc2lnbmVkIGZpbHRlclsyXTsJCS8qIE11bHRpY2FzdCBmaWx0ZXIuICovCisKKwkvKiBSZWNlaXZlIGFuZCB0cmFuc21pdCByaW5nIGJhc2UsIGFsb25nIHdpdGggZXh0cmEgYml0cy4gKi8KKwl1bnNpZ25lZCBzaG9ydCByeF9wdHI7CQkvKiByZWNlaXZlIGRlc2NyaXB0b3IgYWRkciAqLworCXVuc2lnbmVkIHNob3J0IHJ4X2xlbjsJCS8qIHJlY2VpdmUgbGVuIGFuZCBoaWdoIGFkZHIgKi8KKwl1bnNpZ25lZCBzaG9ydCB0eF9wdHI7CQkvKiB0cmFuc21pdCBkZXNjcmlwdG9yIGFkZHIgKi8KKwl1bnNpZ25lZCBzaG9ydCB0eF9sZW47CQkvKiB0cmFuc21pdCBsZW4gYW5kIGhpZ2ggYWRkciAqLworICAgIAorCS8qIFRoZSBUeCBhbmQgUnggcmluZyBlbnRyaWVzIG11c3QgYWxpZ25lZCBvbiA4LWJ5dGUgYm91bmRhcmllcy4gKi8KKwlzdHJ1Y3QgbGFuY2VfcnhfZGVzYyBicnhfcmluZ1tSWF9SSU5HX1NJWkVdOworCXN0cnVjdCBsYW5jZV90eF9kZXNjIGJ0eF9yaW5nW1RYX1JJTkdfU0laRV07CisKKwljaGFyICAgcnhfYnVmIFtSWF9SSU5HX1NJWkVdW1JYX0JVRkZfU0laRV07CisJY2hhciAgIHR4X2J1ZiBbVFhfUklOR19TSVpFXVtUWF9CVUZGX1NJWkVdOworfTsKKworCisJLyoKKwkgKgkJUHJpdmF0ZSBEZXZpY2UgRGF0YQorCSAqLworCitzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSB7CisJY2hhciAqbmFtZTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGw7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmluaXRfYmxvY2s7CSAgICAvKiBIb3N0cyB2aWV3ICovCisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmxhbmNlX2luaXRfYmxvY2s7IC8qIExhbmNlIHZpZXcgKi8KKworCWludCByeF9uZXcsIHR4X25ldzsKKwlpbnQgcnhfb2xkLCB0eF9vbGQ7CisgICAgCisJaW50IGxhbmNlX2xvZ19yeF9idWZzLCBsYW5jZV9sb2dfdHhfYnVmczsKKwlpbnQgcnhfcmluZ19tb2RfbWFzaywgdHhfcmluZ19tb2RfbWFzazsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWludCB0cGU7CQkgICAgICAvKiBjYWJsZS1zZWxlY3Rpb24gaXMgVFBFICovCisJaW50IGF1dG9fc2VsZWN0OwkgICAgICAvKiBjYWJsZS1zZWxlY3Rpb24gYnkgY2FycmllciAqLworCXVuc2lnbmVkIHNob3J0IGJ1c21hc3Rlcl9yZWd2YWw7CisKKyNpZmRlZiBDT05GSUdfU1VOTEFOQ0UKKwlzdHJ1Y3QgTGludXhfU0J1c19ETUEgKmxlZG1hOyAvKiBpZiBzZXQgdGhpcyBwb2ludHMgdG8gbGVkbWEgYW5kIGFyY2g9NG0gKi8KKwlpbnQgYnVyc3Rfc2l6ZXM7CSAgICAgIC8qIGxlZG1hIFNCdXMgYnVyc3Qgc2l6ZXMgKi8KKyNlbmRpZgorCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgICAgbXVsdGljYXN0X3RpbWVyOworfTsKKworI2RlZmluZSBUWF9CVUZGU19BVkFJTCAoKGxwLT50eF9vbGQ8PWxwLT50eF9uZXcpP1wKKwkJCWxwLT50eF9vbGQrbHAtPnR4X3JpbmdfbW9kX21hc2stbHAtPnR4X25ldzpcCisJCQlscC0+dHhfb2xkIC0gbHAtPnR4X25ldy0xKQorCisKKyNkZWZpbmUgTEFOQ0VfQUREUih4KSAoKGludCkoeCkgJiB+MHhmZjAwMDAwMCkKKworLyogTG9hZCB0aGUgQ1NSIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQgbG9hZF9jc3JzIChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApCit7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICphaWIgPSBscC0+bGFuY2VfaW5pdF9ibG9jazsKKwlpbnQgbGVwdHI7CisKKwlsZXB0ciA9IExBTkNFX0FERFIgKGFpYik7CisKKwlsbC0+cmFwID0gTEVfQ1NSMTsKKwlsbC0+cmRwID0gKGxlcHRyICYgMHhGRkZGKTsKKwlsbC0+cmFwID0gTEVfQ1NSMjsKKwlsbC0+cmRwID0gbGVwdHIgPj4gMTY7CisJbGwtPnJhcCA9IExFX0NTUjM7CisJbGwtPnJkcCA9IGxwLT5idXNtYXN0ZXJfcmVndmFsOworCisJLyogUG9pbnQgYmFjayB0byBjc3IwICovCisJbGwtPnJhcCA9IExFX0NTUjA7Cit9CisKKyNkZWZpbmUgWkVSTyAwCisKKy8qIFNldHVwIHRoZSBMYW5jZSBSeCBhbmQgVHggcmluZ3MgKi8KK3N0YXRpYyB2b2lkIGxhbmNlX2luaXRfcmluZyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICphaWI7IC8qIGZvciBMQU5DRV9BRERSIGNvbXB1dGF0aW9ucyAqLworCWludCBsZXB0cjsKKwlpbnQgaTsKKworCWFpYiA9IGxwLT5sYW5jZV9pbml0X2Jsb2NrOworCisJLyogTG9jayBvdXQgb3RoZXIgcHJvY2Vzc2VzIHdoaWxlIHNldHRpbmcgdXAgaGFyZHdhcmUgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbHAtPnJ4X25ldyA9IGxwLT50eF9uZXcgPSAwOworCWxwLT5yeF9vbGQgPSBscC0+dHhfb2xkID0gMDsKKworCWliLT5tb2RlID0gMDsKKworCS8qIENvcHkgdGhlIGV0aGVybmV0IGFkZHJlc3MgdG8gdGhlIGxhbmNlIGluaXQgYmxvY2sKKwkgKiBOb3RlIHRoYXQgb24gdGhlIHNwYXJjIHlvdSBuZWVkIHRvIHN3YXAgdGhlIGV0aGVybmV0IGFkZHJlc3MuCisJICovCisJaWItPnBoeXNfYWRkciBbMF0gPSBkZXYtPmRldl9hZGRyIFsxXTsKKwlpYi0+cGh5c19hZGRyIFsxXSA9IGRldi0+ZGV2X2FkZHIgWzBdOworCWliLT5waHlzX2FkZHIgWzJdID0gZGV2LT5kZXZfYWRkciBbM107CisJaWItPnBoeXNfYWRkciBbM10gPSBkZXYtPmRldl9hZGRyIFsyXTsKKwlpYi0+cGh5c19hZGRyIFs0XSA9IGRldi0+ZGV2X2FkZHIgWzVdOworCWliLT5waHlzX2FkZHIgWzVdID0gZGV2LT5kZXZfYWRkciBbNF07CisKKwlpZiAoWkVSTykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlRYIHJpbmdzOlxuIik7CisgICAgCisJLyogU2V0dXAgdGhlIFR4IHJpbmcgZW50cmllcyAqLworCWZvciAoaSA9IDA7IGkgPD0gKDE8PGxwLT5sYW5jZV9sb2dfdHhfYnVmcyk7IGkrKykgeworCQlsZXB0ciA9IExBTkNFX0FERFIoJmFpYi0+dHhfYnVmW2ldWzBdKTsKKwkJaWItPmJ0eF9yaW5nIFtpXS50bWQwICAgICAgPSBsZXB0cjsKKwkJaWItPmJ0eF9yaW5nIFtpXS50bWQxX2hhZHIgPSBsZXB0ciA+PiAxNjsKKwkJaWItPmJ0eF9yaW5nIFtpXS50bWQxX2JpdHMgPSAwOworCQlpYi0+YnR4X3JpbmcgW2ldLmxlbmd0aCAgICA9IDB4ZjAwMDsgLyogVGhlIG9uZXMgcmVxdWlyZWQgYnkgdG1kMiAqLworCQlpYi0+YnR4X3JpbmcgW2ldLm1pc2MgICAgICA9IDA7CisJCWlmIChpIDwgMyAmJiBaRVJPKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVkOiAweCU4Ljh4XG4iLCBpLCBsZXB0cik7CisJfQorCisJLyogU2V0dXAgdGhlIFJ4IHJpbmcgZW50cmllcyAqLworCWlmIChaRVJPKQorCQlwcmludGsoS0VSTl9ERUJVRyAiUlggcmluZ3M6XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgKDE8PGxwLT5sYW5jZV9sb2dfcnhfYnVmcyk7IGkrKykgeworCQlsZXB0ciA9IExBTkNFX0FERFIoJmFpYi0+cnhfYnVmW2ldWzBdKTsKKworCQlpYi0+YnJ4X3JpbmcgW2ldLnJtZDAgICAgICA9IGxlcHRyOworCQlpYi0+YnJ4X3JpbmcgW2ldLnJtZDFfaGFkciA9IGxlcHRyID4+IDE2OworCQlpYi0+YnJ4X3JpbmcgW2ldLnJtZDFfYml0cyA9IExFX1IxX09XTjsKKwkJaWItPmJyeF9yaW5nIFtpXS5sZW5ndGggICAgPSAtUlhfQlVGRl9TSVpFIHwgMHhmMDAwOworCQlpYi0+YnJ4X3JpbmcgW2ldLm1ibGVuZ3RoICA9IDA7CisJCWlmIChpIDwgMyAmJiBaRVJPKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVkOiAweCU4Ljh4XG4iLCBpLCBsZXB0cik7CisJfQorCisJLyogU2V0dXAgdGhlIGluaXRpYWxpemF0aW9uIGJsb2NrICovCisgICAgCisJLyogU2V0dXAgcnggZGVzY3JpcHRvciBwb2ludGVyICovCisJbGVwdHIgPSBMQU5DRV9BRERSKCZhaWItPmJyeF9yaW5nKTsKKwlpYi0+cnhfbGVuID0gKGxwLT5sYW5jZV9sb2dfcnhfYnVmcyA8PCAxMykgfCAobGVwdHIgPj4gMTYpOworCWliLT5yeF9wdHIgPSBsZXB0cjsKKwlpZiAoWkVSTykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlJYIHB0cjogJTguOHhcbiIsIGxlcHRyKTsKKyAgICAKKwkvKiBTZXR1cCB0eCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKwlsZXB0ciA9IExBTkNFX0FERFIoJmFpYi0+YnR4X3JpbmcpOworCWliLT50eF9sZW4gPSAobHAtPmxhbmNlX2xvZ190eF9idWZzIDw8IDEzKSB8IChsZXB0ciA+PiAxNik7CisJaWItPnR4X3B0ciA9IGxlcHRyOworCWlmIChaRVJPKQorCQlwcmludGsoS0VSTl9ERUJVRyAiVFggcHRyOiAlOC44eFxuIiwgbGVwdHIpOworCisJLyogQ2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgKi8KKwlpYi0+ZmlsdGVyIFswXSA9IDA7CisJaWItPmZpbHRlciBbMV0gPSAwOworfQorCitzdGF0aWMgaW50IGluaXRfcmVzdGFydF9sYW5jZSAoc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwKQoreworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKwlpbnQgaTsKKworCWxsLT5yYXAgPSBMRV9DU1IwOworCWxsLT5yZHAgPSBMRV9DMF9JTklUOworCisJLyogV2FpdCBmb3IgdGhlIGxhbmNlIHRvIGNvbXBsZXRlIGluaXRpYWxpemF0aW9uICovCisJZm9yIChpID0gMDsgKGkgPCAxMDApICYmICEobGwtPnJkcCAmIChMRV9DMF9FUlIgfCBMRV9DMF9JRE9OKSk7IGkrKykKKwkJYmFycmllcigpOworCWlmICgoaSA9PSAxMDApIHx8IChsbC0+cmRwICYgTEVfQzBfRVJSKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkxBTkNFIHVub3BlbmVkIGFmdGVyICVkIHRpY2tzLCBjc3IwPSU0LjR4LlxuIiwKKwkJICAgICAgIGksIGxsLT5yZHApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBDbGVhciBJRE9OIGJ5IHdyaXRpbmcgYSAiMSIsIGVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBzdGFydCBsYW5jZSAqLworCWxsLT5yZHAgPSBMRV9DMF9JRE9OOworCWxsLT5yZHAgPSBMRV9DMF9JTkVBIHwgTEVfQzBfU1RSVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbmNlX3J4IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2s7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yeF9kZXNjICpyZDsKKwl1bnNpZ25lZCBjaGFyIGJpdHM7CisJaW50IGxlbiA9IDA7CQkJLyogWFhYIHNodXQgdXAgZ2NjIHdhcm5pbmdzICovCisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IDA7CS8qIFhYWCBzaHV0IHVwIGdjYyB3YXJuaW5ncyAqLworCisjaWZkZWYgVEVTVF9ISVRTCisJaW50IGk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlsiKTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKGkgPT0gbHAtPnJ4X25ldykKKwkJCXByaW50ayAoIiVzIiwKKwkJCQlpYi0+YnJ4X3JpbmcgW2ldLnJtZDFfYml0cyAmIExFX1IxX09XTiA/ICJfIiA6ICJYIik7CisJCWVsc2UKKwkJCXByaW50ayAoIiVzIiwKKwkJCQlpYi0+YnJ4X3JpbmcgW2ldLnJtZDFfYml0cyAmIExFX1IxX09XTiA/ICIuIiA6ICIxIik7CisJfQorCXByaW50ayAoIl1cbiIpOworI2VuZGlmCisgICAgCisJbGwtPnJkcCA9IExFX0MwX1JJTlR8TEVfQzBfSU5FQTsKKwlmb3IgKHJkID0gJmliLT5icnhfcmluZyBbbHAtPnJ4X25ld107CisJICAgICAhKChiaXRzID0gcmQtPnJtZDFfYml0cykgJiBMRV9SMV9PV04pOworCSAgICAgcmQgPSAmaWItPmJyeF9yaW5nIFtscC0+cnhfbmV3XSkgeworCisJCS8qIFdlIGdvdCBhbiBpbmNvbXBsZXRlIGZyYW1lPyAqLworCQlpZiAoKGJpdHMgJiBMRV9SMV9QT0spICE9IExFX1IxX1BPSykgeworCQkJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChiaXRzICYgTEVfUjFfRVJSKSB7CisJCQkvKiBDb3VudCBvbmx5IHRoZSBlbmQgZnJhbWUgYXMgYSByeCBlcnJvciwKKwkJCSAqIG5vdCB0aGUgYmVnaW5uaW5nCisJCQkgKi8KKwkJCWlmIChiaXRzICYgTEVfUjFfQlVGKSBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfQ1JDKSBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9PRkwpIGxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9GUkEpIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfRU9QKSBscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCX0gZWxzZSB7CisJCQlsZW4gPSAocmQtPm1ibGVuZ3RoICYgMHhmZmYpIC0gNDsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IgKGxlbisyKTsKKworCQkJaWYgKHNrYiA9PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplLCAiCisJCQkJICAgICAgICJkZWZlcnJpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCXJkLT5tYmxlbmd0aCA9IDA7CisJCQkJcmQtPnJtZDFfYml0cyA9IExFX1IxX09XTjsKKwkJCQlscC0+cnhfbmV3ID0gKGxwLT5yeF9uZXcgKyAxKSAmIGxwLT5yeF9yaW5nX21vZF9tYXNrOworCQkJCXJldHVybiAwOworCQkJfQorCSAgICAKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CQkvKiAxNiBieXRlIGFsaWduICovCisJCQlza2JfcHV0IChza2IsIGxlbik7CQkvKiBtYWtlIHJvb20gKi8KKwkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLAorCQkJCQkgKHVuc2lnbmVkIGNoYXIgKikmKGliLT5yeF9idWYgW2xwLT5yeF9uZXddWzBdKSwKKwkJCQkJIGxlbiwgMCk7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMgKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4IChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQl9CisKKwkJLyogUmV0dXJuIHRoZSBwYWNrZXQgdG8gdGhlIHBvb2wgKi8KKwkJcmQtPm1ibGVuZ3RoID0gMDsKKwkJcmQtPnJtZDFfYml0cyA9IExFX1IxX09XTjsKKwkJbHAtPnJ4X25ldyA9IChscC0+cnhfbmV3ICsgMSkgJiBscC0+cnhfcmluZ19tb2RfbWFzazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuY2VfdHggKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9jazsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGwgPSBscC0+bGw7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3R4X2Rlc2MgKnRkOworCWludCBpLCBqOworCWludCBzdGF0dXM7CisKKwkvKiBjc3IwIGlzIDJmMyAqLworCWxsLT5yZHAgPSBMRV9DMF9USU5UIHwgTEVfQzBfSU5FQTsKKwkvKiBjc3IwIGlzIDczICovCisKKwlqID0gbHAtPnR4X29sZDsKKwlmb3IgKGkgPSBqOyBpICE9IGxwLT50eF9uZXc7IGkgPSBqKSB7CisJCXRkID0gJmliLT5idHhfcmluZyBbaV07CisKKwkJLyogSWYgd2UgaGl0IGEgcGFja2V0IG5vdCBvd25lZCBieSB1cywgc3RvcCAqLworCQlpZiAodGQtPnRtZDFfYml0cyAmIExFX1QxX09XTikKKwkJCWJyZWFrOworCQkKKwkJaWYgKHRkLT50bWQxX2JpdHMgJiBMRV9UMV9FUlIpIHsKKwkJCXN0YXR1cyA9IHRkLT5taXNjOworCSAgICAKKwkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBMRV9UM19SVFkpICBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBMRV9UM19MQ09MKSBscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCisJCQlpZiAoc3RhdHVzICYgTEVfVDNfQ0xPUykgeworCQkJCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCWlmIChscC0+YXV0b19zZWxlY3QpIHsKKwkJCQkJbHAtPnRwZSA9IDEgLSBscC0+dHBlOworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYXJyaWVyIExvc3QsICIKKwkJCQkJICAgICAgICJ0cnlpbmcgJXNcbiIsIGRldi0+bmFtZSwKKwkJCQkJICAgICAgIGxwLT50cGU/IlRQRSI6IkFVSSIpOworCQkJCQkvKiBTdG9wIHRoZSBsYW5jZSAqLworCQkJCQlsbC0+cmFwID0gTEVfQ1NSMDsKKwkJCQkJbGwtPnJkcCA9IExFX0MwX1NUT1A7CisJCQkJCWxhbmNlX2luaXRfcmluZyAoZGV2KTsKKwkJCQkJbG9hZF9jc3JzIChscCk7CisJCQkJCWluaXRfcmVzdGFydF9sYW5jZSAobHApOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisKKwkJCS8qIGJ1ZmZlciBlcnJvcnMgYW5kIHVuZGVyZmxvd3MgdHVybiBvZmYgdGhlIHRyYW5zbWl0dGVyICovCisJCQkvKiBSZXN0YXJ0IHRoZSBhZGFwdGVyICovCisJCQlpZiAoc3RhdHVzICYgKExFX1QzX0JVRnxMRV9UM19VRkwpKSB7CisJCQkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUeDogRVJSX0JVRnxFUlJfVUZMLCAiCisJCQkJICAgICAgICJyZXN0YXJ0aW5nXG4iLCBkZXYtPm5hbWUpOworCQkJCS8qIFN0b3AgdGhlIGxhbmNlICovCisJCQkJbGwtPnJhcCA9IExFX0NTUjA7CisJCQkJbGwtPnJkcCA9IExFX0MwX1NUT1A7CisJCQkJbGFuY2VfaW5pdF9yaW5nIChkZXYpOworCQkJCWxvYWRfY3NycyAobHApOworCQkJCWluaXRfcmVzdGFydF9sYW5jZSAobHApOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgaWYgKCh0ZC0+dG1kMV9iaXRzICYgTEVfVDFfUE9LKSA9PSBMRV9UMV9QT0spIHsKKwkJCS8qCisJCQkgKiBTbyB3ZSBkb24ndCBjb3VudCB0aGUgcGFja2V0IG1vcmUgdGhhbiBvbmNlLgorCQkJICovCisJCQl0ZC0+dG1kMV9iaXRzICY9IH4oTEVfVDFfUE9LKTsKKworCQkJLyogT25lIGNvbGxpc2lvbiBiZWZvcmUgcGFja2V0IHdhcyBzZW50LiAqLworCQkJaWYgKHRkLT50bWQxX2JpdHMgJiBMRV9UMV9FT05FKQorCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisKKwkJCS8qIE1vcmUgdGhhbiBvbmUgY29sbGlzaW9uLCBiZSBvcHRpbWlzdGljLiAqLworCQkJaWYgKHRkLT50bWQxX2JpdHMgJiBMRV9UMV9FTU9SRSkKKwkJCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSAyOworCisJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQl9CisJCisJCWogPSAoaiArIDEpICYgbHAtPnR4X3JpbmdfbW9kX21hc2s7CisJfQorCWxwLT50eF9vbGQgPSBqOworCWxsLT5yZHAgPSBMRV9DMF9USU5UIHwgTEVfQzBfSU5FQTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90CitsYW5jZV9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHA7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsOworCWludCBjc3IwOworCisJZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsbCA9IGxwLT5sbDsKKworCWxsLT5yYXAgPSBMRV9DU1IwOwkJLyogTEFOQ0UgQ29udHJvbGxlciBTdGF0dXMgKi8KKwljc3IwID0gbGwtPnJkcDsKKworCWlmICghKGNzcjAgJiBMRV9DMF9JTlRSKSkJLyogQ2hlY2sgaWYgYW55IGludGVycnVwdCBoYXMgKi8KKwkJcmV0dXJuIElSUV9OT05FOwkvKiBiZWVuIGdlbmVyYXRlZCBieSB0aGUgTGFuY2UuICovCisKKwkvKiBBY2tub3dsZWRnZSBhbGwgdGhlIGludGVycnVwdCBzb3VyY2VzIEFTQVAgKi8KKwlsbC0+cmRwID0gY3NyMCAmIH4oTEVfQzBfSU5FQXxMRV9DMF9URE1EfExFX0MwX1NUT1B8TEVfQzBfU1RSVHwKKwkJCSAgIExFX0MwX0lOSVQpOworCisJaWYgKChjc3IwICYgTEVfQzBfRVJSKSkgeworCQkvKiBDbGVhciB0aGUgZXJyb3IgY29uZGl0aW9uICovCisJCWxsLT5yZHAgPSBMRV9DMF9CQUJMfExFX0MwX0VSUnxMRV9DMF9NSVNTfExFX0MwX0lORUE7CisJfQorICAgIAorCWlmIChjc3IwICYgTEVfQzBfUklOVCkKKwkJbGFuY2VfcnggKGRldik7CisKKwlpZiAoY3NyMCAmIExFX0MwX1RJTlQpCisJCWxhbmNlX3R4IChkZXYpOworCisJLyogTG9nIG1pc2MgZXJyb3JzLiAqLworCWlmIChjc3IwICYgTEVfQzBfQkFCTCkKKwkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOyAgICAgICAvKiBUeCBiYWJibGUuICovCisJaWYgKGNzcjAgJiBMRV9DMF9NSVNTKQorCQlscC0+c3RhdHMucnhfZXJyb3JzKys7ICAgICAgIC8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLworCWlmIChjc3IwICYgTEVfQzBfTUVSUikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBCdXMgbWFzdGVyIGFyYml0cmF0aW9uIGZhaWx1cmUsIHN0YXR1cyAiCisJCSAgICAgICAiJTQuNHguXG4iLCBkZXYtPm5hbWUsIGNzcjApOworCQkvKiBSZXN0YXJ0IHRoZSBjaGlwLiAqLworCQlsbC0+cmRwID0gTEVfQzBfU1RSVDsKKwl9CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmIFRYX0JVRkZTX0FWQUlMID4gMCkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJbGwtPnJhcCA9IExFX0NTUjA7CisJbGwtPnJkcCA9IExFX0MwX0JBQkx8TEVfQzBfQ0VSUnxMRV9DMF9NSVNTfExFX0MwX01FUlJ8CisJCQkJCUxFX0MwX0lET058TEVfQzBfSU5FQTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICpsYXN0X2RldiA9IDA7CisKK3N0YXRpYyBpbnQgbGFuY2Vfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKwlpbnQgcmV0OworCisJbGFzdF9kZXYgPSBkZXY7CisKKwkvKiBTdG9wIHRoZSBMYW5jZSAqLworCWxsLT5yYXAgPSBMRV9DU1IwOworCWxsLT5yZHAgPSBMRV9DMF9TVE9QOworCisJLyogSW5zdGFsbCB0aGUgSW50ZXJydXB0IGhhbmRsZXIgKi8KKwlyZXQgPSByZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGxhbmNlX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkgIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0KSByZXR1cm4gcmV0OworCisJbG9hZF9jc3JzIChscCk7CisJbGFuY2VfaW5pdF9yaW5nIChkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiBpbml0X3Jlc3RhcnRfbGFuY2UgKGxwKTsKK30KKworc3RhdGljIGludCBsYW5jZV9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlkZWxfdGltZXJfc3luYygmbHAtPm11bHRpY2FzdF90aW1lcik7CisKKwkvKiBTdG9wIHRoZSBjYXJkICovCisJbGwtPnJhcCA9IExFX0NTUjA7CisJbGwtPnJkcCA9IExFX0MwX1NUT1A7CisKKwlmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxhbmNlX3Jlc2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOworCWludCBzdGF0dXM7CisgICAgCisJLyogU3RvcCB0aGUgbGFuY2UgKi8KKwlsbC0+cmFwID0gTEVfQ1NSMDsKKwlsbC0+cmRwID0gTEVfQzBfU1RPUDsKKworCWxvYWRfY3NycyAobHApOworCisJbGFuY2VfaW5pdF9yaW5nIChkZXYpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlzdGF0dXMgPSBpbml0X3Jlc3RhcnRfbGFuY2UgKGxwKTsKKyNpZmRlZiBERUJVR19EUklWRVIKKwlwcmludGsoS0VSTl9ERUJVRyAiTGFuY2UgcmVzdGFydD0lZFxuIiwgc3RhdHVzKTsKKyNlbmRpZgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUwNHgsIHJlc2V0XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGxsLT5yZHApOworCWxhbmNlX3Jlc2V0KGRldik7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGxhbmNlX3N0YXJ0X3htaXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGwgPSBscC0+bGw7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2s7CisJaW50IGVudHJ5LCBza2JsZW4sIGxlbjsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdGF0aWMgaW50IG91dHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNrYmxlbiA9IHNrYi0+bGVuOworCWxlbiA9IHNrYmxlbjsKKwkKKwlpZiAobGVuIDwgRVRIX1pMRU4pIHsKKwkJbGVuID0gRVRIX1pMRU47CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaWYgKCFUWF9CVUZGU19BVkFJTCl7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmIERFQlVHX0RSSVZFUgorCS8qIGR1bXAgdGhlIHBhY2tldCAqLworCXsKKwkJaW50IGk7CisJCisJCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCQlpZiAoKGkgJSAxNikgPT0gMCkKKwkJCQlwcmludGsoIlxuIiBLRVJOX0RFQlVHKTsKKwkJCXByaW50ayAoIiUyLjJ4ICIsIHNrYi0+ZGF0YSBbaV0pOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9CisjZW5kaWYKKwllbnRyeSA9IGxwLT50eF9uZXcgJiBscC0+dHhfcmluZ19tb2RfbWFzazsKKwlpYi0+YnR4X3JpbmcgW2VudHJ5XS5sZW5ndGggPSAoLWxlbikgfCAweGYwMDA7CisJaWItPmJ0eF9yaW5nIFtlbnRyeV0ubWlzYyA9IDA7CisgICAgCisJbWVtY3B5ICgoY2hhciAqKSZpYi0+dHhfYnVmIFtlbnRyeV1bMF0sIHNrYi0+ZGF0YSwgc2tibGVuKTsKKworCS8qIENsZWFyIHRoZSBzbGFjayBvZiB0aGUgcGFja2V0LCBkbyBJIG5lZWQgdGhpcz8gKi8KKwlpZiAobGVuICE9IHNrYmxlbikKKwkJbWVtc2V0ICgoY2hhciAqKSAmaWItPnR4X2J1ZiBbZW50cnldW3NrYmxlbl0sIDAsIGxlbiAtIHNrYmxlbik7CisgICAgCisJLyogTm93LCBnaXZlIHRoZSBwYWNrZXQgdG8gdGhlIGxhbmNlICovCisJaWItPmJ0eF9yaW5nIFtlbnRyeV0udG1kMV9iaXRzID0gKExFX1QxX1BPS3xMRV9UMV9PV04pOworCWxwLT50eF9uZXcgPSAobHAtPnR4X25ldysxKSAmIGxwLT50eF9yaW5nX21vZF9tYXNrOworCisJb3V0cysrOworCisJaWYgKFRYX0JVRkZTX0FWQUlMIDw9IDApCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIEtpY2sgdGhlIGxhbmNlOiB0cmFuc21pdCBub3cgKi8KKwlsbC0+cmRwID0gTEVfQzBfSU5FQSB8IExFX0MwX1RETUQ7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKyAgICAKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmxhbmNlX2dldF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qIHRha2VuIGZyb20gdGhlIGRlcGNhIGRyaXZlciAqLworc3RhdGljIHZvaWQgbGFuY2VfbG9hZF9tdWx0aWNhc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9jazsKKwl2b2xhdGlsZSB1MTYgKm1jYXN0X3RhYmxlID0gKHUxNiAqKSZpYi0+ZmlsdGVyOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pPWRldi0+bWNfbGlzdDsKKwljaGFyICphZGRyczsKKwlpbnQgaTsKKwl1MzIgY3JjOworCQorCS8qIHNldCBhbGwgbXVsdGljYXN0IGJpdHMgKi8KKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSl7IAorCQlpYi0+ZmlsdGVyIFswXSA9IDB4ZmZmZmZmZmY7CisJCWliLT5maWx0ZXIgWzFdID0gMHhmZmZmZmZmZjsKKwkJcmV0dXJuOworCX0KKwkvKiBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciAqLworCWliLT5maWx0ZXIgWzBdID0gMDsKKwlpYi0+ZmlsdGVyIFsxXSA9IDA7CisKKwkvKiBBZGQgYWRkcmVzc2VzICovCisJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKyl7CisJCWFkZHJzID0gZG1pLT5kbWlfYWRkcjsKKwkJZG1pICAgPSBkbWktPm5leHQ7CisKKwkJLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCisJCWlmICghKCphZGRycyAmIDEpKQorCQkJY29udGludWU7CisJCQorCQljcmMgPSBldGhlcl9jcmNfbGUoNiwgYWRkcnMpOworCQljcmMgPSBjcmMgPj4gMjY7CisJCW1jYXN0X3RhYmxlIFtjcmMgPj4gNF0gfD0gMSA8PCAoY3JjICYgMHhmKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBsYW5jZV9zZXRfbXVsdGljYXN0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2s7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybjsKKworCWlmIChscC0+dHhfb2xkICE9IGxwLT50eF9uZXcpIHsKKwkJbW9kX3RpbWVyKCZscC0+bXVsdGljYXN0X3RpbWVyLCBqaWZmaWVzICsgNCk7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJcmV0dXJuOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWxsLT5yYXAgPSBMRV9DU1IwOworCWxsLT5yZHAgPSBMRV9DMF9TVE9QOworCWxhbmNlX2luaXRfcmluZyAoZGV2KTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJaWItPm1vZGUgfD0gTEVfTU9fUFJPTTsKKwl9IGVsc2UgeworCQlpYi0+bW9kZSAmPSB+TEVfTU9fUFJPTTsKKwkJbGFuY2VfbG9hZF9tdWx0aWNhc3QgKGRldik7CisJfQorCWxvYWRfY3NycyAobHApOworCWluaXRfcmVzdGFydF9sYW5jZSAobHApOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYTIwNjVfaW5pdF9vbmUoc3RydWN0IHpvcnJvX2RldiAqeiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHpvcnJvX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhMjA2NV9yZW1vdmVfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnopOworCisKK3N0YXRpYyBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkIGEyMDY1X3pvcnJvX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBaT1JST19QUk9EX0NCTV9BMjA2NV8xIH0sCisJeyBaT1JST19QUk9EX0NCTV9BMjA2NV8yIH0sCisJeyBaT1JST19QUk9EX0FNRVJJU1RBUl9BMjA2NSB9LAorCXsgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHpvcnJvX2RyaXZlciBhMjA2NV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImEyMDY1IiwKKwkuaWRfdGFibGUJPSBhMjA2NV96b3Jyb190YmwsCisJLnByb2JlCQk9IGEyMDY1X2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYTIwNjVfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhMjA2NV9pbml0X29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6LAorCQkJCSAgICBjb25zdCBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqcHJpdjsKKwl1bnNpZ25lZCBsb25nIGJvYXJkLCBiYXNlX2FkZHIsIG1lbV9zdGFydDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIxLCAqcjI7CisJaW50IGVycjsKKworCWJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7CisJYmFzZV9hZGRyID0gYm9hcmQrQTIwNjVfTEFOQ0U7CisJbWVtX3N0YXJ0ID0gYm9hcmQrQTIwNjVfUkFNOworCisJcjEgPSByZXF1ZXN0X21lbV9yZWdpb24oYmFzZV9hZGRyLCBzaXplb2Yoc3RydWN0IGxhbmNlX3JlZ3MpLAorCQkJCSJBbTc5OTAiKTsKKwlpZiAoIXIxKQorCQlyZXR1cm4gLUVCVVNZOworCXIyID0gcmVxdWVzdF9tZW1fcmVnaW9uKG1lbV9zdGFydCwgQTIwNjVfUkFNX1NJWkUsICJSQU0iKTsKKwlpZiAoIXIyKSB7CisJCXJlbGVhc2VfcmVzb3VyY2UocjEpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSkpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlyZWxlYXNlX3Jlc291cmNlKHIxKTsKKwkJcmVsZWFzZV9yZXNvdXJjZShyMik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXIxLT5uYW1lID0gZGV2LT5uYW1lOworCXIyLT5uYW1lID0gZGV2LT5uYW1lOworCisJZGV2LT5kZXZfYWRkclswXSA9IDB4MDA7CisJaWYgKHotPmlkICE9IFpPUlJPX1BST0RfQU1FUklTVEFSX0EyMDY1KSB7CS8qIENvbW1vZG9yZSAqLworCQlkZXYtPmRldl9hZGRyWzFdID0gMHg4MDsKKwkJZGV2LT5kZXZfYWRkclsyXSA9IDB4MTA7CisJfSBlbHNlIHsJCQkJCS8qIEFtZXJpc3RhciAqLworCQlkZXYtPmRldl9hZGRyWzFdID0gMHgwMDsKKwkJZGV2LT5kZXZfYWRkclsyXSA9IDB4OWY7CisJfQorCWRldi0+ZGV2X2FkZHJbM10gPSAoei0+cm9tLmVyX1NlcmlhbE51bWJlcj4+MTYpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzRdID0gKHotPnJvbS5lcl9TZXJpYWxOdW1iZXI+PjgpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzVdID0gei0+cm9tLmVyX1NlcmlhbE51bWJlciAmIDB4ZmY7CisJZGV2LT5iYXNlX2FkZHIgPSBaVFdPX1ZBRERSKGJhc2VfYWRkcik7CisJZGV2LT5tZW1fc3RhcnQgPSBaVFdPX1ZBRERSKG1lbV9zdGFydCk7CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQrQTIwNjVfUkFNX1NJWkU7CisKKwlwcml2LT5sbCA9ICh2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqKWRldi0+YmFzZV9hZGRyOworCXByaXYtPmluaXRfYmxvY2sgPSAoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKilkZXYtPm1lbV9zdGFydDsKKwlwcml2LT5sYW5jZV9pbml0X2Jsb2NrID0gKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopQTIwNjVfUkFNOworCXByaXYtPmF1dG9fc2VsZWN0ID0gMDsKKwlwcml2LT5idXNtYXN0ZXJfcmVndmFsID0gTEVfQzNfQlNXUDsKKworCXByaXYtPmxhbmNlX2xvZ19yeF9idWZzID0gTEFOQ0VfTE9HX1JYX0JVRkZFUlM7CisJcHJpdi0+bGFuY2VfbG9nX3R4X2J1ZnMgPSBMQU5DRV9MT0dfVFhfQlVGRkVSUzsKKwlwcml2LT5yeF9yaW5nX21vZF9tYXNrID0gUlhfUklOR19NT0RfTUFTSzsKKwlwcml2LT50eF9yaW5nX21vZF9tYXNrID0gVFhfUklOR19NT0RfTUFTSzsKKworCWRldi0+b3BlbiA9ICZsYW5jZV9vcGVuOworCWRldi0+c3RvcCA9ICZsYW5jZV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZsYW5jZV9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dCA9ICZsYW5jZV90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOworCWRldi0+Z2V0X3N0YXRzID0gJmxhbmNlX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZsYW5jZV9zZXRfbXVsdGljYXN0OworCWRldi0+ZG1hID0gMDsKKworCWluaXRfdGltZXIoJnByaXYtPm11bHRpY2FzdF90aW1lcik7CisJcHJpdi0+bXVsdGljYXN0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCXByaXYtPm11bHRpY2FzdF90aW1lci5mdW5jdGlvbiA9CisJCSh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSkgJmxhbmNlX3NldF9tdWx0aWNhc3Q7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXJlbGVhc2VfcmVzb3VyY2UocjEpOworCQlyZWxlYXNlX3Jlc291cmNlKHIyKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisJem9ycm9fc2V0X2RydmRhdGEoeiwgZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBBMjA2NSBhdCAweCUwOGx4LCBFdGhlcm5ldCBBZGRyZXNzICIKKwkgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBkZXYtPm5hbWUsIGJvYXJkLAorCSAgICAgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCSAgICAgICBkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhMjA2NV9yZW1vdmVfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnopCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHpvcnJvX2dldF9kcnZkYXRhKHopOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZWxlYXNlX21lbV9yZWdpb24oWlRXT19QQUREUihkZXYtPmJhc2VfYWRkciksCisJCQkgICBzaXplb2Yoc3RydWN0IGxhbmNlX3JlZ3MpKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oWlRXT19QQUREUihkZXYtPm1lbV9zdGFydCksIEEyMDY1X1JBTV9TSVpFKTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhMjA2NV9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiB6b3Jyb19tb2R1bGVfaW5pdCgmYTIwNjVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGEyMDY1X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJem9ycm9fdW5yZWdpc3Rlcl9kcml2ZXIoJmEyMDY1X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGEyMDY1X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGEyMDY1X2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYTIwNjUuaCBiL2RyaXZlcnMvbmV0L2EyMDY1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0YWQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2EyMDY1LmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBBbWlnYSBMaW51eC82OGsgQTIwNjUgRXRoZXJuZXQgRHJpdmVyCisgKgorICogKEMpIENvcHlyaWdodCAxOTk1IGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbiA8Z2VlcnRAbGludXgtbTY4ay5vcmc+CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uCisgKgorICoJYXJpYWRuZS4/OglBbWlnYSBMaW51eC82OGsgQXJpYWRuZSBFdGhlcm5ldCBEcml2ZXIKKyAqCQkJKEMpIENvcHlyaWdodCAxOTk1IGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbiwKKyAqCQkJUGV0ZXIgRGUgU2NocmlqdmVyCisgKgorICoJbGFuY2UuYzoJQW4gQU1EIExBTkNFIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguCisgKgkJCVdyaXR0ZW4gMTk5My05NCBieSBEb25hbGQgQmVja2VyLgorICoKKyAqCUFtNzlDOTYwOglQQ25ldCh0bSktSVNBIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIKKyAqCQkJQWR2YW5jZWQgTWljcm8gRGV2aWNlcworICoJCQlQdWJsaWNhdGlvbiAjMTY5MDcsIFJldi4gQiwgQW1lbmRtZW50LzAsIE1heSAxOTk0CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4CisgKiBkaXN0cmlidXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGUgQTIwNjUgaXMgYSBab3Jyby1JSSBib2FyZCBtYWRlIGJ5IENvbW1vZG9yZS9BbWVyaXN0YXIuIEl0IGNvbnRhaW5zOgorICoKKyAqCS0gYW4gQW03OTkwIExvY2FsIEFyZWEgTmV0d29yayBDb250cm9sbGVyIGZvciBFdGhlcm5ldCAoTEFOQ0UpIHdpdGgKKyAqCSAgYm90aCAxMEJBU0UtMiAodGhpbiBjb2F4KSBhbmQgQVVJIChEQi0xNSkgY29ubmVjdG9ycworICovCisKKworLyoKKyAqCQlBbTc5OTAgTG9jYWwgQXJlYSBOZXR3b3JrIENvbnRyb2xsZXIgZm9yIEV0aGVybmV0IChMQU5DRSkKKyAqLworCitzdHJ1Y3QgbGFuY2VfcmVncyB7CisJdW5zaWduZWQgc2hvcnQgcmRwOwkJLyogUmVnaXN0ZXIgRGF0YSBQb3J0ICovCisJdW5zaWduZWQgc2hvcnQgcmFwOwkJLyogUmVnaXN0ZXIgQWRkcmVzcyBQb3J0ICovCit9OworCisKKy8qCisgKgkJQW03OTkwIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIExFX0NTUjAJCTB4MDAwMAkJLyogTEFOQ0UgQ29udHJvbGxlciBTdGF0dXMgKi8KKyNkZWZpbmUgTEVfQ1NSMQkJMHgwMDAxCQkvKiBJQURSWzE1OjBdICovCisjZGVmaW5lIExFX0NTUjIJCTB4MDAwMgkJLyogSUFEUlsyMzoxNl0gKi8KKyNkZWZpbmUgTEVfQ1NSMwkJMHgwMDAzCQkvKiBNaXNjICovCisKKworLyoKKyAqCQlCaXQgZGVmaW5pdGlvbnMgZm9yIENTUjAgKExBTkNFIENvbnRyb2xsZXIgU3RhdHVzKQorICovCisKKyNkZWZpbmUgTEVfQzBfRVJSCTB4ODAwMAkJLyogRXJyb3IgKi8KKyNkZWZpbmUgTEVfQzBfQkFCTAkweDQwMDAJCS8qIEJhYmJsZTogVHJhbnNtaXR0ZWQgdG9vIG1hbnkgYml0cyAqLworI2RlZmluZSBMRV9DMF9DRVJSCTB4MjAwMAkJLyogTm8gSGVhcnRiZWF0ICgxMEJBU0UtVCkgKi8KKyNkZWZpbmUgTEVfQzBfTUlTUwkweDEwMDAJCS8qIE1pc3NlZCBGcmFtZSAqLworI2RlZmluZSBMRV9DMF9NRVJSCTB4MDgwMAkJLyogTWVtb3J5IEVycm9yICovCisjZGVmaW5lIExFX0MwX1JJTlQJMHgwNDAwCQkvKiBSZWNlaXZlIEludGVycnVwdCAqLworI2RlZmluZSBMRV9DMF9USU5UCTB4MDIwMAkJLyogVHJhbnNtaXQgSW50ZXJydXB0ICovCisjZGVmaW5lIExFX0MwX0lET04JMHgwMTAwCQkvKiBJbml0aWFsaXphdGlvbiBEb25lICovCisjZGVmaW5lIExFX0MwX0lOVFIJMHgwMDgwCQkvKiBJbnRlcnJ1cHQgRmxhZyAqLworI2RlZmluZSBMRV9DMF9JTkVBCTB4MDA0MAkJLyogSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMRV9DMF9SWE9OCTB4MDAyMAkJLyogUmVjZWl2ZSBPbiAqLworI2RlZmluZSBMRV9DMF9UWE9OCTB4MDAxMAkJLyogVHJhbnNtaXQgT24gKi8KKyNkZWZpbmUgTEVfQzBfVERNRAkweDAwMDgJCS8qIFRyYW5zbWl0IERlbWFuZCAqLworI2RlZmluZSBMRV9DMF9TVE9QCTB4MDAwNAkJLyogU3RvcCAqLworI2RlZmluZSBMRV9DMF9TVFJUCTB4MDAwMgkJLyogU3RhcnQgKi8KKyNkZWZpbmUgTEVfQzBfSU5JVAkweDAwMDEJCS8qIEluaXRpYWxpemUgKi8KKworCisvKgorICoJCUJpdCBkZWZpbml0aW9ucyBmb3IgQ1NSMworICovCisKKyNkZWZpbmUgTEVfQzNfQlNXUAkweDAwMDQJCS8qIEJ5dGUgU3dhcAorCQkJCQkgICAob24gZm9yIGJpZyBlbmRpYW4gYnl0ZSBvcmRlcikgKi8KKyNkZWZpbmUgTEVfQzNfQUNPTgkweDAwMDIJCS8qIEFMRSBDb250cm9sCisJCQkJCSAgIChvbiBmb3IgYWN0aXZlIGxvdyBBTEUpICovCisjZGVmaW5lIExFX0MzX0JDT04JMHgwMDAxCQkvKiBCeXRlIENvbnRyb2wgKi8KKworCisvKgorICoJCU1vZGUgRmxhZ3MKKyAqLworCisjZGVmaW5lIExFX01PX1BST00JMHg4MDAwCQkvKiBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIExFX01PX0lOVEwJMHgwMDQwCQkvKiBJbnRlcm5hbCBMb29wYmFjayAqLworI2RlZmluZSBMRV9NT19EUlRZCTB4MDAyMAkJLyogRGlzYWJsZSBSZXRyeSAqLworI2RlZmluZSBMRV9NT19GQ09MTAkweDAwMTAJCS8qIEZvcmNlIENvbGxpc2lvbiAqLworI2RlZmluZSBMRV9NT19EWE1URkNTCTB4MDAwOAkJLyogRGlzYWJsZSBUcmFuc21pdCBDUkMgKi8KKyNkZWZpbmUgTEVfTU9fTE9PUAkweDAwMDQJCS8qIExvb3BiYWNrIEVuYWJsZSAqLworI2RlZmluZSBMRV9NT19EVFgJMHgwMDAyCQkvKiBEaXNhYmxlIFRyYW5zbWl0dGVyICovCisjZGVmaW5lIExFX01PX0RSWAkweDAwMDEJCS8qIERpc2FibGUgUmVjZWl2ZXIgKi8KKworCitzdHJ1Y3QgbGFuY2VfcnhfZGVzYyB7CisJdW5zaWduZWQgc2hvcnQgcm1kMDsgICAgICAgIC8qIGxvdyBhZGRyZXNzIG9mIHBhY2tldCAqLworCXVuc2lnbmVkIGNoYXIgIHJtZDFfYml0czsgICAvKiBkZXNjcmlwdG9yIGJpdHMgKi8KKwl1bnNpZ25lZCBjaGFyICBybWQxX2hhZHI7ICAgLyogaGlnaCBhZGRyZXNzIG9mIHBhY2tldCAqLworCXNob3J0ICAgIGxlbmd0aDsgICAgCSAgICAvKiBUaGlzIGxlbmd0aCBpcyAycyBjb21wbGVtZW50IChuZWdhdGl2ZSkhCisJCQkJICAgICAqIEJ1ZmZlciBsZW5ndGgKKwkJCQkgICAgICovCisJdW5zaWduZWQgc2hvcnQgbWJsZW5ndGg7ICAgIC8qIEFhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkICovCit9OworIAorc3RydWN0IGxhbmNlX3R4X2Rlc2MgeworCXVuc2lnbmVkIHNob3J0IHRtZDA7ICAgICAgICAvKiBsb3cgYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwl1bnNpZ25lZCBjaGFyICB0bWQxX2JpdHM7ICAgLyogZGVzY3JpcHRvciBiaXRzICovCisJdW5zaWduZWQgY2hhciAgdG1kMV9oYWRyOyAgIC8qIGhpZ2ggYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwlzaG9ydCAgICBsZW5ndGg7ICAgICAgIAkgICAgLyogTGVuZ3RoIGlzIDJzIGNvbXBsZW1lbnQgKG5lZ2F0aXZlKSEgKi8KKwl1bnNpZ25lZCBzaG9ydCBtaXNjOworfTsKKwkJCisKKy8qCisgKgkJUmVjZWl2ZSBGbGFncworICovCisKKyNkZWZpbmUgTEVfUjFfT1dOCTB4ODAJCS8qIExBTkNFIG93bnMgdGhlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgTEVfUjFfRVJSCTB4NDAJCS8qIEVycm9yICovCisjZGVmaW5lIExFX1IxX0ZSQQkweDIwCQkvKiBGcmFtaW5nIEVycm9yICovCisjZGVmaW5lIExFX1IxX09GTAkweDEwCQkvKiBPdmVyZmxvdyBFcnJvciAqLworI2RlZmluZSBMRV9SMV9DUkMJMHgwOAkJLyogQ1JDIEVycm9yICovCisjZGVmaW5lIExFX1IxX0JVRgkweDA0CQkvKiBCdWZmZXIgRXJyb3IgKi8KKyNkZWZpbmUgTEVfUjFfU09QCTB4MDIJCS8qIFN0YXJ0IG9mIFBhY2tldCAqLworI2RlZmluZSBMRV9SMV9FT1AJMHgwMQkJLyogRW5kIG9mIFBhY2tldCAqLworI2RlZmluZSBMRV9SMV9QT0sgICAgICAgMHgwMwkJLyogUGFja2V0IGlzIGNvbXBsZXRlOiBTT1AgKyBFT1AgKi8KKworCisvKgorICoJCVRyYW5zbWl0IEZsYWdzCisgKi8KKworI2RlZmluZSBMRV9UMV9PV04JMHg4MAkJLyogTEFOQ0Ugb3ducyB0aGUgZGVzY3JpcHRvciAqLworI2RlZmluZSBMRV9UMV9FUlIJMHg0MAkJLyogRXJyb3IgKi8KKyNkZWZpbmUgTEVfVDFfUkVTCTB4MjAJCS8qIFJlc2VydmVkLAorCQkJCQkgICBMQU5DRSB3cml0ZXMgdGhpcyB3aXRoIGEgemVybyAqLworI2RlZmluZSBMRV9UMV9FTU9SRQkweDEwCQkvKiBNb3JlIHRoYW4gb25lIHJldHJ5IG5lZWRlZCAqLworI2RlZmluZSBMRV9UMV9FT05FCTB4MDgJCS8qIE9uZSByZXRyeSBuZWVkZWQgKi8KKyNkZWZpbmUgTEVfVDFfRURFRgkweDA0CQkvKiBEZWZlcnJlZCAqLworI2RlZmluZSBMRV9UMV9TT1AJMHgwMgkJLyogU3RhcnQgb2YgUGFja2V0ICovCisjZGVmaW5lIExFX1QxX0VPUAkweDAxCQkvKiBFbmQgb2YgUGFja2V0ICovCisjZGVmaW5lIExFX1QxX1BPSwkweDAzCQkvKiBQYWNrZXQgaXMgY29tcGxldGU6IFNPUCArIEVPUCAqLworCisKKy8qCisgKgkJRXJyb3IgRmxhZ3MKKyAqLworCisjZGVmaW5lIExFX1QzX0JVRiAJMHg4MDAwCQkvKiBCdWZmZXIgRXJyb3IgKi8KKyNkZWZpbmUgTEVfVDNfVUZMIAkweDQwMDAJCS8qIFVuZGVyZmxvdyBFcnJvciAqLworI2RlZmluZSBMRV9UM19MQ09MIAkweDEwMDAJCS8qIExhdGUgQ29sbGlzaW9uICovCisjZGVmaW5lIExFX1QzX0NMT1MgCTB4MDgwMAkJLyogTG9zcyBvZiBDYXJyaWVyICovCisjZGVmaW5lIExFX1QzX1JUWSAJMHgwNDAwCQkvKiBSZXRyeSBFcnJvciAqLworI2RlZmluZSBMRV9UM19URFIJMHgwM2ZmCQkvKiBUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5ICovCisKKworLyoKKyAqCQlBMjA2NSBFeHBhbnNpb24gQm9hcmQgU3RydWN0dXJlCisgKi8KKworI2RlZmluZSBBMjA2NV9MQU5DRQkJMHg0MDAwCisKKyNkZWZpbmUgQTIwNjVfUkFNCQkweDgwMDAKKyNkZWZpbmUgQTIwNjVfUkFNX1NJWkUJCTB4ODAwMAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hYzMyMDAuYyBiL2RyaXZlcnMvbmV0L2FjMzIwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZmJhMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hYzMyMDAuYwpAQCAtMCwwICsxLDQyNCBAQAorLyogYWMzMjAwLmM6IEEgZHJpdmVyIGZvciB0aGUgQW5zZWwgQ29tbXVuaWNhdGlvbnMgRUlTQSBldGhlcm5ldCBhZGFwdG9yLiAqLworLyoKKwlXcml0dGVuIDE5OTMsIDE5OTQgYnkgRG9uYWxkIEJlY2tlci4KKwlDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlIERpcmVjdG9yLAorCU5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQKKwlhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBtb2RpZmllZCBieSBTUkMsCisJaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlUaGlzIGlzIGRyaXZlciBmb3IgdGhlIEFuc2VsIENvbW11bmljYXRpb25zIE1vZGVsIDMyMDAgRUlTQSBFdGhlcm5ldCBMQU4KKwlBZGFwdGVyLiAgVGhlIHByb2dyYW1taW5nIGluZm9ybWF0aW9uIGlzIGZyb20gdGhlIHVzZXJzIG1hbnVhbCwgYXMgcmVsYXRlZAorCWJ5IGdsZWVAYXJkbmFzc2FrLm1hdGguY2xlbXNvbi5lZHUuCisKKwlDaGFuZ2Vsb2c6CisKKwlQYXVsIEdvcnRtYWtlciAwNS85OAk6IGFkZCBzdXBwb3J0IGZvciBzaGFyZWQgbWVtIGFib3ZlIDFNQi4KKworICAqLworCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQorCSJhYzMyMDAuYzp2MS4wMSA3LzEvOTQgRG9uYWxkIEJlY2tlciAoYmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292KVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworI2RlZmluZSBEUlZfTkFNRQkiYWMzMjAwIgorCisvKiBPZmZzZXRzIGZyb20gdGhlIGJhc2UgYWRkcmVzcy4gKi8KKyNkZWZpbmUgQUNfTklDX0JBU0UJMHgwMAorI2RlZmluZSBBQ19TQV9QUk9NCTB4MTYJCQkvKiBUaGUgc3RhdGlvbiBhZGRyZXNzIFBST00uICovCisjZGVmaW5lIEFDX0FERFIwCTB4MDAJCQkvKiBQcmVmaXggc3RhdGlvbiBhZGRyZXNzIHZhbHVlcy4gKi8KKyNkZWZpbmUgQUNfQUREUjEJMHg0MAkJCQorI2RlZmluZSBBQ19BRERSMgkweDkwCisjZGVmaW5lIEFDX0lEX1BPUlQJMHhDODAKKyNkZWZpbmUgQUNfRUlTQV9JRAkweDAxMTBkMzA1CisjZGVmaW5lIEFDX1JFU0VUX1BPUlQJMHhDODQKKyNkZWZpbmUgQUNfUkVTRVQJMHgwMAorI2RlZmluZSBBQ19FTkFCTEUJMHgwMQorI2RlZmluZSBBQ19DT05GSUcJMHhDOTAJLyogVGhlIGNvbmZpZ3VyYXRpb24gcG9ydC4gKi8KKworI2RlZmluZSBBQ19JT19FWFRFTlQgMHgyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY3R1YWxseSBhY2Nlc3NlZCBpczoKKwkJCQkJCQkJICogQUNfTklDX0JBU0UgKDAtMTUpCisJCQkJCQkJCSAqIEFDX1NBX1BST00gKDAtNSkKKwkJCQkJCQkJICogQUNfSURfUE9SVCAoMC0zKQorCQkJCQkJCQkgKiBBQ19SRVNFVF9QT1JUCisJCQkJCQkJCSAqIEFDX0NPTkZJRworCQkJCQkJCQkgKi8KKworLyogRGVjb2Rpbmcgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBjb25maWcyaXJxbWFwWzhdIF9faW5pdGRhdGEgPSB7MTUsIDEyLCAxMSwgMTAsIDksIDcsIDUsIDN9Oworc3RhdGljIGludCBhZGRybWFwWzhdID0KK3sweEZGMDAwMCwgMHhGRTAwMDAsIDB4RkQwMDAwLCAweEZGRjAwMDAsIDB4RkZFMDAwMCwgMHhGRkMwMDAwLCAgMHhEMDAwMCwgMCB9Oworc3RhdGljIGNvbnN0IGNoYXIgKnBvcnRfbmFtZVs0XSA9IHsgIjEwYmFzZVQiLCAiaW52YWxpZCIsICJBVUkiLCAiMTBiYXNlMiJ9OworCisjZGVmaW5lIGNvbmZpZzJpcnEoY29uZmlndmFsKQljb25maWcyaXJxbWFwWygoY29uZmlndmFsKSA+PiAzKSAmIDddCisjZGVmaW5lIGNvbmZpZzJtZW0oY29uZmlndmFsKQlhZGRybWFwWyhjb25maWd2YWwpICYgN10KKyNkZWZpbmUgY29uZmlnMm5hbWUoY29uZmlndmFsKQlwb3J0X25hbWVbKChjb25maWd2YWwpID4+IDYpICYgM10KKworLyogRmlyc3QgYW5kIGxhc3QgODM5MCBwYWdlcy4gKi8KKyNkZWZpbmUgQUNfU1RBUlRfUEcJCTB4MDAJLyogRmlyc3QgcGFnZSBvZiA4MzkwIFRYIGJ1ZmZlciAqLworI2RlZmluZSBBQ19TVE9QX1BHCQkweDgwCS8qIExhc3QgcGFnZSArMSBvZiB0aGUgODM5MCBSWCByaW5nICovCisKK3N0YXRpYyBpbnQgYWNfcHJvYmUxKGludCBpb2FkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IGFjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhY19yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYWNfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgYWNfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGludCBjb3VudCwKKwkJCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIGFjX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJCQlpbnQgcmluZ19wYWdlKTsKKworc3RhdGljIGludCBhY19jbG9zZV9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworDAorCisvKglQcm9iZSBmb3IgdGhlIEFDMzIwMC4KKworCVRoZSBBQzMyMDAgY2FuIGJlIGlkZW50aWZpZWQgYnkgZWl0aGVyIHRoZSBFSVNBIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLAorCW9yIHRoZSB1bmlxdWUgdmFsdWUgaW4gdGhlIHN0YXRpb24gYWRkcmVzcyBQUk9NLgorCSovCisKK3N0YXRpYyBpbnQgX19pbml0IGRvX2FjMzIwMF9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpcnEgPSBkZXYtPmlycTsKKwlpbnQgbWVtX3N0YXJ0ID0gZGV2LT5tZW1fc3RhcnQ7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoaW9hZGRyID4gMHgxZmYpCQkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCXJldHVybiBhY19wcm9iZTEoaW9hZGRyLCBkZXYpOworCWVsc2UgaWYgKGlvYWRkciA+IDApCQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAoICEgRUlTQV9idXMpCisJCXJldHVybiAtRU5YSU87CisKKwlmb3IgKGlvYWRkciA9IDB4MTAwMDsgaW9hZGRyIDwgMHg5MDAwOyBpb2FkZHIgKz0gMHgxMDAwKSB7CisJCWlmIChhY19wcm9iZTEoaW9hZGRyLCBkZXYpID09IDApCisJCQlyZXR1cm4gMDsKKwkJZGV2LT5pcnEgPSBpcnE7CisJCWRldi0+bWVtX3N0YXJ0ID0gbWVtX3N0YXJ0OworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBTb21lZGF5IGZyZWVfaXJxIG1heSBiZSBpbiBhY19jbG9zZV9jYXJkKCkgKi8KKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgQUNfSU9fRVhURU5UKTsKKwlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgYWMzMjAwX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwlpbnQgZXJyOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwllcnIgPSBkb19hYzMyMDBfcHJvYmUoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJY2xlYW51cF9jYXJkKGRldik7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGFjX3Byb2JlMShpbnQgaW9hZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpLCByZXR2YWw7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgQUNfSU9fRVhURU5ULCBEUlZfTkFNRSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoaW5iX3AoaW9hZGRyICsgQUNfSURfUE9SVCkgPT0gMHhmZikgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaW5sKGlvYWRkciArIEFDX0lEX1BPUlQpICE9IEFDX0VJU0FfSUQpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwlwcmludGsoS0VSTl9ERUJVRyAiQUMzMjAwIGV0aGVyY2FyZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGlzICUjMDJ4LCIKKwkJICAgIiBFSVNBIElEICUwMnggJTAyeCAlMDJ4ICUwMnguXG4iLCBpbmIoaW9hZGRyICsgQUNfQ09ORklHKSwKKwkJICAgaW5iKGlvYWRkciArIEFDX0lEX1BPUlQgKyAwKSwgaW5iKGlvYWRkciArIEFDX0lEX1BPUlQgKyAxKSwKKwkJICAgaW5iKGlvYWRkciArIEFDX0lEX1BPUlQgKyAyKSwgaW5iKGlvYWRkciArIEFDX0lEX1BPUlQgKyAzKSk7CisjZW5kaWYKKworCXByaW50aygiQUMzMjAwIGluIEVJU0Egc2xvdCAlZCwgbm9kZSIsIGlvYWRkci8weDEwMDApOworCWZvcihpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTAyeCIsIGRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgQUNfU0FfUFJPTSArIGkpKTsKKworI2lmIDAKKwkvKiBDaGVjayB0aGUgdmVuZG9yIElEL3ByZWZpeC4gUmVkdW5kYW50IGFmdGVyIGNoZWNraW5nIHRoZSBFSVNBIElEICovCisJaWYgKGluYihpb2FkZHIgKyBBQ19TQV9QUk9NICsgMCkgIT0gQUNfQUREUjAKKwkJfHwgaW5iKGlvYWRkciArIEFDX1NBX1BST00gKyAxKSAhPSBBQ19BRERSMQorCQl8fCBpbmIoaW9hZGRyICsgQUNfU0FfUFJPTSArIDIpICE9IEFDX0FERFIyICkgeworCQlwcmludGsoIiwgbm90IGZvdW5kIChpbnZhbGlkIHByZWZpeCkuXG4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorI2VuZGlmCisKKwkvKiBBc3NpZ24gYW5kIGFsbG9jYXRlIHRoZSBpbnRlcnJ1cHQgbm93LiAqLworCWlmIChkZXYtPmlycSA9PSAwKSB7CisJCWRldi0+aXJxID0gY29uZmlnMmlycShpbmIoaW9hZGRyICsgQUNfQ09ORklHKSk7CisJCXByaW50aygiLCB1c2luZyIpOworCX0gZWxzZSB7CisJCWRldi0+aXJxID0gaXJxX2Nhbm9uaWNhbGl6ZShkZXYtPmlycSk7CisJCXByaW50aygiLCBhc3NpZ25pbmciKTsKKwl9CisKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCAwLCBEUlZfTkFNRSwgZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayAoIiBub3RoaW5nISBVbmFibGUgdG8gZ2V0IElSUSAlZC5cbiIsIGRldi0+aXJxKTsKKwkJZ290byBvdXQxOworCX0KKworCXByaW50aygiIElSUSAlZCwgJXMgcG9ydFxuIiwgZGV2LT5pcnEsIHBvcnRfbmFtZVtkZXYtPmlmX3BvcnRdKTsKKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisjaWZkZWYgbm90eWV0CisJaWYgKGRldi0+bWVtX3N0YXJ0KQl7CQkvKiBPdmVycmlkZSB0aGUgdmFsdWUgZnJvbSB0aGUgYm9hcmQuICovCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisJCQlpZiAoYWRkcm1hcFtpXSA9PSBkZXYtPm1lbV9zdGFydCkKKwkJCQlicmVhazsKKwkJaWYgKGkgPj0gNykKKwkJCWkgPSAwOworCQlvdXRiKChpbmIoaW9hZGRyICsgQUNfQ09ORklHKSAmIH43KSB8IGksIGlvYWRkciArIEFDX0NPTkZJRyk7CisJfQorI2VuZGlmCisKKwlkZXYtPmlmX3BvcnQgPSBpbmIoaW9hZGRyICsgQUNfQ09ORklHKSA+PiA2OworCWRldi0+bWVtX3N0YXJ0ID0gY29uZmlnMm1lbShpbmIoaW9hZGRyICsgQUNfQ09ORklHKSk7CisKKwlwcmludGsoIiVzOiBBQzMyMDAgYXQgJSMzeCB3aXRoICVka0IgbWVtb3J5IGF0IHBoeXNpY2FsIGFkZHJlc3MgJSNseC5cbiIsIAorCQkJZGV2LT5uYW1lLCBpb2FkZHIsIEFDX1NUT1BfUEcvNCwgZGV2LT5tZW1fc3RhcnQpOworCisJLyoKKwkgKiAgQkVXQVJFISEgU29tZSBkYWluLWJyYW1hZ2VkIEVJU0EgU0NVcyB3aWxsIGFsbG93IHlvdSB0byBwdXQKKwkgKiAgdGhlIGNhcmQgbWVtIHdpdGhpbiB0aGUgcmVnaW9uIGNvdmVyZWQgYnkgYG5vcm1hbCcgUkFNICAhISEKKwkgKgorCSAqICBpb3JlbWFwKCkgd2lsbCBmYWlsIGluIHRoYXQgY2FzZS4KKwkgKi8KKwllaV9zdGF0dXMubWVtID0gaW9yZW1hcChkZXYtPm1lbV9zdGFydCwgQUNfU1RPUF9QRyoweDEwMCk7CisJaWYgKCFlaV9zdGF0dXMubWVtKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWMzMjAwLmM6IFVuYWJsZSB0byByZW1hcCBjYXJkIG1lbW9yeSBhYm92ZSAxTUIgISFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImFjMzIwMC5jOiBUcnkgdXNpbmcgRUlTQSBTQ1UgdG8gc2V0IG1lbW9yeSBiZWxvdyAxTUIuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJhYzMyMDAuYzogRHJpdmVyIE5PVCBpbnN0YWxsZWQuXG4iKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBvdXQxOworCX0KKwlwcmludGsoImFjMzIwMC5jOiByZW1hcHBlZCAlZGtCIGNhcmQgbWVtb3J5IHRvIHZpcnR1YWwgYWRkcmVzcyAlcFxuIiwKKwkJCUFDX1NUT1BfUEcvNCwgZWlfc3RhdHVzLm1lbSk7CisKKwlkZXYtPm1lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWVpX3N0YXR1cy5tZW07CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAoQUNfU1RPUF9QRyAtIEFDX1NUQVJUX1BHKSoyNTY7CisKKwllaV9zdGF0dXMubmFtZSA9ICJBQzMyMDAiOworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gQUNfU1RBUlRfUEc7CisJZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBBQ19TVEFSVF9QRyArIFRYX1BBR0VTOworCWVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBBQ19TVE9QX1BHOworCWVpX3N0YXR1cy53b3JkMTYgPSAxOworCisJaWYgKGVpX2RlYnVnID4gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmYWNfcmVzZXRfODM5MDsKKwllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmYWNfYmxvY2tfaW5wdXQ7CisJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZhY19ibG9ja19vdXRwdXQ7CisJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZhY19nZXRfODM5MF9oZHI7CisKKwlkZXYtPm9wZW4gPSAmYWNfb3BlbjsKKwlkZXYtPnN0b3AgPSAmYWNfY2xvc2VfY2FyZDsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCU5TODM5MF9pbml0KGRldiwgMCk7CisJcmV0dXJuIDA7CitvdXQxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgQUNfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGFjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBub3R5ZXQKKwkvKiBTb21lZGF5IHdlIG1heSBlbmFibGUgdGhlIElSUSBhbmQgc2hhcmVkIG1lbW9yeSBoZXJlLiAqLworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyNlbmRpZgorCisJZWlfb3BlbihkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhY19yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJb3V0YihBQ19SRVNFVCwgaW9hZGRyICsgQUNfUkVTRVRfUE9SVCk7CisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldHRpbmcgQUMzMjAwLCB0PSVsZC4uLiIsIGppZmZpZXMpOworCisJZWlfc3RhdHVzLnR4aW5nID0gMDsKKwlvdXRiKEFDX0VOQUJMRSwgaW9hZGRyICsgQUNfUkVTRVRfUE9SVCk7CisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldCBkb25lXG4iKTsKKworCXJldHVybjsKK30KKworLyogR3JhYiB0aGUgODM5MCBzcGVjaWZpYyBoZWFkZXIuIFNpbWlsYXIgdG8gdGhlIGJsb2NrX2lucHV0IHJvdXRpbmUsIGJ1dAorICAgd2UgZG9uJ3QgbmVlZCB0byBiZSBjb25jZXJuZWQgd2l0aCByaW5nIHdyYXAgYXMgdGhlIGhlYWRlciB3aWxsIGJlIGF0CisgICB0aGUgc3RhcnQgb2YgYSBwYWdlLCBzbyB3ZSBvcHRpbWl6ZSBhY2NvcmRpbmdseS4gKi8KKworc3RhdGljIHZvaWQKK2FjX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCXZvaWQgX19pb21lbSAqaGRyX3N0YXJ0ID0gZWlfc3RhdHVzLm1lbSArICgocmluZ19wYWdlIC0gQUNfU1RBUlRfUEcpPDw4KTsKKwltZW1jcHlfZnJvbWlvKGhkciwgaGRyX3N0YXJ0LCBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpKTsKK30KKworLyogIEJsb2NrIGlucHV0IGFuZCBvdXRwdXQgYXJlIGVhc3kgb24gc2hhcmVkIG1lbW9yeSBldGhlcmNhcmRzLCB0aGUgb25seQorCWNvbXBsaWNhdGlvbiBpcyB3aGVuIHRoZSByaW5nIGJ1ZmZlciB3cmFwcy4gKi8KKworc3RhdGljIHZvaWQgYWNfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkJICBpbnQgcmluZ19vZmZzZXQpCit7CisJdm9pZCBfX2lvbWVtICpzdGFydCA9IGVpX3N0YXR1cy5tZW0gKyByaW5nX29mZnNldCAtIEFDX1NUQVJUX1BHKjI1NjsKKworCWlmIChyaW5nX29mZnNldCArIGNvdW50ID4gQUNfU1RPUF9QRyoyNTYpIHsKKwkJLyogV2UgbXVzdCB3cmFwIHRoZSBpbnB1dCBtb3ZlLiAqLworCQlpbnQgc2VtaV9jb3VudCA9IEFDX1NUT1BfUEcqMjU2IC0gcmluZ19vZmZzZXQ7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCBzdGFydCwgc2VtaV9jb3VudCk7CisJCWNvdW50IC09IHNlbWlfY291bnQ7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgc2VtaV9jb3VudCwKKwkJCQllaV9zdGF0dXMubWVtICsgVFhfUEFHRVMqMjU2LCBjb3VudCk7CisJfSBlbHNlIHsKKwkJLyogUGFja2V0IGlzIGluIG9uZSBjaHVuayAtLSB3ZSBjYW4gY29weSArIGNrc3VtLiAqLworCQlldGhfaW9fY29weV9hbmRfc3VtKHNrYiwgc3RhcnQsIGNvdW50LCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFjX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSkKK3sKKwl2b2lkIF9faW9tZW0gKnNobWVtID0gZWlfc3RhdHVzLm1lbSArICgoc3RhcnRfcGFnZSAtIEFDX1NUQVJUX1BHKTw8OCk7CisKKwltZW1jcHlfdG9pbyhzaG1lbSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgYWNfY2xvc2VfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKworI2lmZGVmIG5vdHlldAorCS8qIFdlIHNob3VsZCBzb21lZGF5IGRpc2FibGUgc2hhcmVkIG1lbW9yeSBhbmQgaW50ZXJydXB0cy4gKi8KKwlvdXRiKDB4MDAsIGlvYWRkciArIDYpOwkvKiBEaXNhYmxlIGludGVycnVwdHMuICovCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisjZW5kaWYKKworCWVpX2Nsb3NlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUgTUFYX0FDMzJfQ0FSRFMJNAkvKiBNYXggbnVtYmVyIG9mIEFDMzIgY2FyZHMgcGVyIG1vZHVsZSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfYWMzMltNQVhfQUMzMl9DQVJEU107CitzdGF0aWMgaW50IGlvW01BWF9BQzMyX0NBUkRTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF9BQzMyX0NBUkRTXTsKK3N0YXRpYyBpbnQgbWVtW01BWF9BQzMyX0NBUkRTXTsKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWVtLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBudW1iZXIocykiKTsKK01PRFVMRV9QQVJNX0RFU0MobWVtLCAiTWVtb3J5IGJhc2UgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5zZWwgQUMzMjAwIEVJU0EgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK2ludAoraW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0FDMzJfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJaWYgKGlvW3RoaXNfZGV2XSA9PSAwICYmIHRoaXNfZGV2ICE9IDApCisJCQlicmVhazsKKwkJZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CisJCWRldi0+bWVtX3N0YXJ0ID0gbWVtW3RoaXNfZGV2XTsJCS8qIEN1cnJlbnRseSBpZ25vcmVkIGJ5IGRyaXZlciAqLworCQlpZiAoZG9fYWMzMjAwX3Byb2JlKGRldikgPT0gMCkgeworCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCQlkZXZfYWMzMltmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFjMzIwMC5jOiBObyBhYzMyMDAgY2FyZCBmb3VuZCAoaS9vID0gMHgleCkuXG4iLCBpb1t0aGlzX2Rldl0pOworCQlicmVhazsKKwl9CisJaWYgKGZvdW5kKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOWElPOworfQorCit2b2lkCitjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldjsKKworCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IE1BWF9BQzMyX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfYWMzMlt0aGlzX2Rldl07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hY2VuaWMuYyBiL2RyaXZlcnMvbmV0L2FjZW5pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWEzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hY2VuaWMuYwpAQCAtMCwwICsxLDMyNzEgQEAKKy8qCisgKiBhY2VuaWMuYzogTGludXggZHJpdmVyIGZvciB0aGUgQWx0ZW9uIEFjZU5JQyBHaWdhYml0IEV0aGVybmV0IGNhcmQKKyAqICAgICAgICAgICBhbmQgb3RoZXIgVGlnb24gYmFzZWQgY2FyZHMuCisgKgorICogQ29weXJpZ2h0IDE5OTgtMjAwMiBieSBKZXMgU29yZW5zZW4sIDxqZXNAdHJhaW5lZC1tb25rZXkub3JnPi4KKyAqCisgKiBUaGFua3MgdG8gQWx0ZW9uIGFuZCAzQ29tIGZvciBwcm92aWRpbmcgaGFyZHdhcmUgYW5kIGRvY3VtZW50YXRpb24KKyAqIGVuYWJsaW5nIG1lIHRvIHdyaXRlIHRoaXMgZHJpdmVyLgorICoKKyAqIEEgbWFpbGluZyBsaXN0IGZvciBkaXNjdXNzaW5nIHRoZSB1c2Ugb2YgdGhpcyBkcml2ZXIgaGFzIGJlZW4KKyAqIHNldHVwLCBwbGVhc2Ugc3Vic2NyaWJlIHRvIHRoZSBsaXN0cyBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zCisgKiBhYm91dCB0aGUgZHJpdmVyLiBTZW5kIG1haWwgdG8gbGludXgtYWNlbmljLWhlbHBAc3Vuc2l0ZS5hdWMuZGsgdG8KKyAqIHNlZSBob3cgdG8gc3Vic2NyaWJlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQWRkaXRpb25hbCBjcmVkaXRzOgorICogICBQZXRlIFd5Y2tvZmYgPHd5Y2tvZmZAY2Euc2FuZGlhLmdvdj46IEluaXRpYWwgTGludXgvQWxwaGEgYW5kIHRyYWNlCisgKiAgICAgICBkdW1wIHN1cHBvcnQuIFRoZSB0cmFjZSBkdW1wIHN1cHBvcnQgaGFzIG5vdCBiZWVuCisgKiAgICAgICBpbnRlZ3JhdGVkIHlldCBob3dldmVyLgorICogICBUcm95IEJlbmplZ2VyZGVzOiBCaWcgRW5kaWFuIChQUEMpIHBhdGNoZXMuCisgKiAgIE5hdGUgU3RhaGw6IEJldHRlciBvdXQgb2YgbWVtb3J5IGhhbmRsaW5nIGFuZCBzdGF0cyBzdXBwb3J0LgorICogICBBbWFuIFNpbmdsYTogTmFzdHkgcmFjZSBiZXR3ZWVuIGludGVycnVwdCBoYW5kbGVyIGFuZCB0eCBjb2RlIGRlYWxpbmcKKyAqICAgICAgICAgICAgICAgIHdpdGggJ3Rlc3RpbmcgdGhlIHR4X3JldF9jc20gYW5kIHNldHRpbmcgdHhfZnVsbCcKKyAqICAgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUByZWRoYXQuY29tPjogY29udmVyc2lvbiB0byBuZXcgUENJIGRtYSBtYXBwaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZnJhc3RydWN0dXJlIGFuZCBTcGFyYyBzdXBwb3J0CisgKiAgIFBpZXJyaWNrIFBpbmFzc2VhdSAoQ0VSTik6IEZvciBsZW5kaW5nIG1lIGFuIFVsdHJhIDUgdG8gdGVzdCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyIHVuZGVyIExpbnV4L1NwYXJjNjQKKyAqICAgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPjogRGV0ZWN0IEFsdGVvbiAxMDAwYmFzZVQgY2FyZHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVRIVE9PTF9HRFJWSU5GTyBzdXBwb3J0CisgKiAgIENoaXAgU2FsemVuYmVyZyA8Y2hpcEB2YWxpbnV4LmNvbT46IEZpeCByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHR4CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgYW5kIGNsb3NlKCkgY2xlYW51cC4KKyAqICAgS2VuIEFha2VyIDxrZGFha2VyQHJjaGxhbmQudm5ldC5pYm0uY29tPjogQ29ycmVjdCBjaGVjayBmb3Igd2hldGhlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgbWFwcGVkIElPIGlzIGVuYWJsZWQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZSB0aGUgZHJpdmVyIHdvcmsgb24gUlMvNjAwMC4KKyAqICAgVGFrYXlvc2hpIEtvdWNoaSA8a291Y2hpQGhwYy5iczEuZmMubmVjLmNvLmpwPjogSWRlbnRpZnlpbmcgcHJvYmxlbQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0aGUgZHJpdmVyIHdvdWxkIGRpc2FibGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzIG1hc3RlciBtb2RlIGlmIGl0IGhhZCB0byBkaXNhYmxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIGFuZCBpbnZhbGlkYXRlLgorICogICBTdGVwaGVuIEhhY2sgPHN0ZXBoZW5faGFja0BocC5jb20+OiBGaXhlZCBhY2Vfc2V0X21hY19hZGRyIGZvciBsaXR0bGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kaWFuIHN5c3RlbXMuCisgKiAgIFZhbCBIZW5zb24gPHZoZW5zb25AZXNzY29tLmNvbT46ICAgIFJlc2V0IEp1bWJvIHNrYiBwcm9kdWNlciBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnggcHJvZHVjZXIgaW5kZXggd2hlbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaGluZyB0aGUgSnVtYm8gcmluZy4KKyAqICAgSGFucyBHcm9ibGVyIDxncm9iaEBzdW4uYWMuemE+OiAgICAgTWVtb3J5IGxlYWsgZml4ZXMgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlciBpbml0IHBhdGguCisgKiAgIEdyYW50IEdydW5kbGVyIDxncnVuZGxlckBjdXAuaHAuY29tPjogUENJIHdyaXRlIHBvc3RpbmcgZml4ZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNlbmRpZgorCisjaWZkZWYgU0lPQ0VUSFRPT0wKKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKyNkZWZpbmUgRFJWX05BTUUgImFjZW5pYyIKKworI3VuZGVmIElOREVYX0RFQlVHCisKKyNpZmRlZiBDT05GSUdfQUNFTklDX09NSVRfVElHT05fSQorI2RlZmluZSBBQ0VfSVNfVElHT05fSShhcCkJMAorI2RlZmluZSBBQ0VfVFhfUklOR19FTlRSSUVTKGFwKQlNQVhfVFhfUklOR19FTlRSSUVTCisjZWxzZQorI2RlZmluZSBBQ0VfSVNfVElHT05fSShhcCkJKGFwLT52ZXJzaW9uID09IDEpCisjZGVmaW5lIEFDRV9UWF9SSU5HX0VOVFJJRVMoYXApCWFwLT50eF9yaW5nX2VudHJpZXMKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQUxURU9OCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUxURU9OCQkweDEyYWUJCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9BTFRFT05fQUNFTklDX0ZJQlJFCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxURU9OX0FDRU5JQ19GSUJSRSAgMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxURU9OX0FDRU5JQ19DT1BQRVIgMHgwMDAyCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF8zQ09NXzNDOTg1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzk4NQkweDAwMDEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfVkVORE9SX0lEX05FVEdFQVIKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ORVRHRUFSCQkweDEzODUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRHRUFSX0dBNjIwCTB4NjIwYQorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfTkVUR0VBUl9HQTYyMFQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRHRUFSX0dBNjIwVAkweDYzMGEKKyNlbmRpZgorCisKKy8qCisgKiBGYXJhbGxvbiB1c2VkIHRoZSBERUMgdmVuZG9yIElEIGJ5IG1pc3Rha2UgYW5kIHRoZXkgc2VlbSBub3QKKyAqIHRvIGNhcmUgLSBzdGlua3khCisgKi8KKyNpZm5kZWYgUENJX0RFVklDRV9JRF9GQVJBTExPTl9QTjkwMDBTWAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZBUkFMTE9OX1BOOTAwMFNYCTB4MWEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0ZBUkFMTE9OX1BOOTEwMFQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9GQVJBTExPTl9QTjkxMDBUICAweGZhCisjZW5kaWYKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9TR0kKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TR0kJCTB4MTBhOQorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfU0dJX0FDRU5JQworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NHSV9BQ0VOSUMJMHgwMDA5CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFjZW5pY19wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0FMVEVPTiwgUENJX0RFVklDRV9JRF9BTFRFT05fQUNFTklDX0ZJQlJFLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQgPDwgOCwgMHhmZmZmMDAsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMVEVPTiwgUENJX0RFVklDRV9JRF9BTFRFT05fQUNFTklDX0NPUFBFUiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19ORVRXT1JLX0VUSEVSTkVUIDw8IDgsIDB4ZmZmZjAwLCB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0M5ODUsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfTkVUV09SS19FVEhFUk5FVCA8PCA4LCAweGZmZmYwMCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfTkVUR0VBUiwgUENJX0RFVklDRV9JRF9ORVRHRUFSX0dBNjIwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQgPDwgOCwgMHhmZmZmMDAsIH0sCisJeyBQQ0lfVkVORE9SX0lEX05FVEdFQVIsIFBDSV9ERVZJQ0VfSURfTkVUR0VBUl9HQTYyMFQsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfTkVUV09SS19FVEhFUk5FVCA8PCA4LCAweGZmZmYwMCwgfSwKKwkvKgorCSAqIEZhcmFsbG9uIHVzZWQgdGhlIERFQyB2ZW5kb3IgSUQgb24gdGhlaXIgY2FyZHMgaW5jb3JyZWN0bHksCisJICogdGhlbiBsYXRlciBBbHRlb24ncyBJRC4KKwkgKi8KKwl7IFBDSV9WRU5ET1JfSURfREVDLCBQQ0lfREVWSUNFX0lEX0ZBUkFMTE9OX1BOOTAwMFNYLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQgPDwgOCwgMHhmZmZmMDAsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMVEVPTiwgUENJX0RFVklDRV9JRF9GQVJBTExPTl9QTjkxMDBULAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQgPDwgOCwgMHhmZmZmMDAsIH0sCisJeyBQQ0lfVkVORE9SX0lEX1NHSSwgUENJX0RFVklDRV9JRF9TR0lfQUNFTklDLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQgPDwgOCwgMHhmZmZmMDAsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFjZW5pY19wY2lfdGJsKTsKKworI2lmbmRlZiBTRVRfTkVUREVWX0RFVgorI2RlZmluZSBTRVRfTkVUREVWX0RFVihuZXQsIHBkZXYpCWRve30gd2hpbGUoMCkKKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MjA1MWMKKyNkZWZpbmUgYWNlX3N5bmNfaXJxKGlycSkJc3luY2hyb25pemVfaXJxKGlycSkKKyNlbHNlCisjZGVmaW5lIGFjZV9zeW5jX2lycShpcnEpCXN5bmNocm9uaXplX2lycSgpCisjZW5kaWYKKworI2lmbmRlZiBvZmZzZXRfaW5fcGFnZQorI2RlZmluZSBvZmZzZXRfaW5fcGFnZShwdHIpCSgodW5zaWduZWQgbG9uZykocHRyKSAmIH5QQUdFX01BU0spCisjZW5kaWYKKworI2RlZmluZSBBQ0VfTUFYX01PRF9QQVJNUwk4CisjZGVmaW5lIEJPQVJEX0lEWF9TVEFUSUMJMAorI2RlZmluZSBCT0FSRF9JRFhfT1ZFUkZMT1cJLTEKKworI2lmIChkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkpICYmIFwKKwlkZWZpbmVkKE5FVElGX0ZfSFdfVkxBTl9SWCkKKyNkZWZpbmUgQUNFTklDX0RPX1ZMQU4JCTEKKyNkZWZpbmUgQUNFX1JDQl9WTEFOX0ZMQUcJUkNCX0ZMR19WTEFOX0FTU0lTVAorI2Vsc2UKKyNkZWZpbmUgQUNFTklDX0RPX1ZMQU4JCTAKKyNkZWZpbmUgQUNFX1JDQl9WTEFOX0ZMQUcJMAorI2VuZGlmCisKKyNpbmNsdWRlICJhY2VuaWMuaCIKKworLyoKKyAqIFRoZXNlIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgdGhlIGZpcm13YXJlIGlzIGluY2x1ZGVkLgorICovCisjZGVmaW5lIE1BWF9URVhUX0xFTgk5NioxMDI0CisjZGVmaW5lIE1BWF9ST0RBVEFfTEVOCTgqMTAyNAorI2RlZmluZSBNQVhfREFUQV9MRU4JMioxMDI0CisKKyNpbmNsdWRlICJhY2VuaWNfZmlybXdhcmUuaCIKKworI2lmbmRlZiB0aWdvbjJGd1JlbGVhc2VMb2NhbAorI2RlZmluZSB0aWdvbjJGd1JlbGVhc2VMb2NhbCAwCisjZW5kaWYKKworLyoKKyAqIFRoaXMgZHJpdmVyIGN1cnJlbnRseSBzdXBwb3J0cyBUaWdvbiBJIGFuZCBUaWdvbiBJSSBiYXNlZCBjYXJkcworICogaW5jbHVkaW5nIHRoZSBBbHRlb24gQWNlTklDLCB0aGUgM0NvbSAzQzk4NVtCXSBhbmQgTmV0R2VhcgorICogR0E2MjAuIFRoZSBkcml2ZXIgc2hvdWxkIGFsc28gd29yayBvbiB0aGUgU0dJLCBERUMgYW5kIEZhcmFsbG9uCisgKiB2ZXJzaW9ucyBvZiB0aGUgY2FyZCwgaG93ZXZlciBJIGhhdmUgbm90IGJlZW4gYWJsZSB0byB0ZXN0IHRoYXQKKyAqIG15c2VsZi4KKyAqCisgKiBUaGlzIGNhcmQgaXMgcmVhbGx5IG5lYXQsIGl0IHN1cHBvcnRzIHJlY2VpdmUgaGFyZHdhcmUgY2hlY2tzdW1taW5nCisgKiBhbmQganVtYm8gZnJhbWVzICh1cCB0byA5MDAwIGJ5dGVzKSBhbmQgZG9lcyBhIGxvdCBvZiB3b3JrIGluIHRoZQorICogZmlybXdhcmUuIEFsc28gdGhlIHByb2dyYW1taW5nIGludGVyZmFjZSBpcyBxdWl0ZSBuZWF0LCBleGNlcHQgZm9yCisgKiB0aGUgcGFydHMgZGVhbGluZyB3aXRoIHRoZSBpMmMgZWVwcm9tIG9uIHRoZSBjYXJkIDstKQorICoKKyAqIFVzaW5nIGp1bWJvIGZyYW1lczoKKyAqCisgKiBUbyBlbmFibGUganVtYm8gZnJhbWVzLCBzaW1wbHkgc3BlY2lmeSBhbiBtdHUgYmV0d2VlbiAxNTAwIGFuZCA5MDAwCisgKiBieXRlcyB0byBpZmNvbmZpZy4gSnVtYm8gZnJhbWVzIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkIGF0IGFueSB0aW1lCisgKiBieSBydW5uaW5nIGBpZmNvbmZpZyBldGg8WD4gbXR1IDxNVFU+JyB3aXRoIDxYPiBiZWluZyB0aGUgRXRoZXJuZXQKKyAqIGludGVyZmFjZSBudW1iZXIgYW5kIDxNVFU+IGJlaW5nIHRoZSBNVFUgdmFsdWUuCisgKgorICogTW9kdWxlIHBhcmFtZXRlcnM6CisgKgorICogV2hlbiBjb21waWxlZCBhcyBhIGxvYWRhYmxlIG1vZHVsZSwgdGhlIGRyaXZlciBhbGxvd3MgZm9yIGEgbnVtYmVyCisgKiBvZiBtb2R1bGUgcGFyYW1ldGVycyB0byBiZSBzcGVjaWZpZWQuIFRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlCisgKiBmb2xsb3dpbmcgbW9kdWxlIHBhcmFtZXRlcnM6CisgKgorICogIHRyYWNlPTx2YWw+IC0gRmlybXdhcmUgdHJhY2UgbGV2ZWwuIFRoaXMgcmVxdWlyZXMgc3BlY2lhbCB0cmFjZWQKKyAqICAgICAgICAgICAgICAgIGZpcm13YXJlIHRvIHJlcGxhY2UgdGhlIGZpcm13YXJlIHN1cHBsaWVkIHdpdGgKKyAqICAgICAgICAgICAgICAgIHRoZSBkcml2ZXIgLSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCisgKgorICogIGxpbms9PHZhbD4gIC0gTGluayBzdGF0ZS4gTm9ybWFsbHkgeW91IHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IGxpbmsKKyAqICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgc2V0IGJ5IHRoZSBkcml2ZXIuIFRoaXMgY2FuIGJlIHVzZWQgdG8KKyAqICAgICAgICAgICAgICAgIG92ZXJyaWRlIHRoZXNlIGluIGNhc2UgeW91ciBzd2l0Y2ggZG9lc24ndCBuZWdvdGlhdGUKKyAqICAgICAgICAgICAgICAgIHRoZSBsaW5rIHByb3Blcmx5LiBWYWxpZCB2YWx1ZXMgYXJlOgorICogICAgICAgICAweDAwMDEgLSBGb3JjZSBoYWxmIGR1cGxleCBsaW5rLgorICogICAgICAgICAweDAwMDIgLSBEbyBub3QgbmVnb3RpYXRlIGxpbmUgc3BlZWQgd2l0aCB0aGUgb3RoZXIgZW5kLgorICogICAgICAgICAweDAwMTAgLSAxME1iaXQvc2VjIGxpbmsuCisgKiAgICAgICAgIDB4MDAyMCAtIDEwME1iaXQvc2VjIGxpbmsuCisgKiAgICAgICAgIDB4MDA0MCAtIDEwMDBNYml0L3NlYyBsaW5rLgorICogICAgICAgICAweDAxMDAgLSBEbyBub3QgbmVnb3RpYXRlIGZsb3cgY29udHJvbC4KKyAqICAgICAgICAgMHgwMjAwIC0gRW5hYmxlIFJYIGZsb3cgY29udHJvbCBZCisgKiAgICAgICAgIDB4MDQwMCAtIEVuYWJsZSBUWCBmbG93IGNvbnRyb2wgWSAoVGlnb24gSUkgTklDcyBvbmx5KS4KKyAqICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXMgMHgwMjcwLCBpZS4gZW5hYmxlIGxpbmsrZmxvdworICogICAgICAgICAgICAgICAgY29udHJvbCBuZWdvdGlhdGlvbi4gTmVnb3RpYXRpbmcgdGhlIGhpZ2hlc3QKKyAqICAgICAgICAgICAgICAgIHBvc3NpYmxlIGxpbmsgc3BlZWQgd2l0aCBSWCBmbG93IGNvbnRyb2wgZW5hYmxlZC4KKyAqCisgKiAgICAgICAgICAgICAgICBXaGVuIGRpc2FibGluZyBsaW5rIHNwZWVkIG5lZ290aWF0aW9uLCBvbmx5IG9uZSBsaW5rCisgKiAgICAgICAgICAgICAgICBzcGVlZCBpcyBhbGxvd2VkIHRvIGJlIHNwZWNpZmllZCEKKyAqCisgKiAgdHhfY29hbF90aWNrPTx2YWw+IC0gbnVtYmVyIG9mIGNvYWxlc2NpbmcgY2xvY2sgdGlja3MgKHVzKSBhbGxvd2VkCisgKiAgICAgICAgICAgICAgICB0byB3YWl0IGZvciBtb3JlIHBhY2tldHMgdG8gYXJpdmUgYmVmb3JlCisgKiAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpbmcgdGhlIGhvc3QsIGZyb20gdGhlIHRpbWUgdGhlIGZpcnN0CisgKiAgICAgICAgICAgICAgICBwYWNrZXQgYXJyaXZlcy4KKyAqCisgKiAgcnhfY29hbF90aWNrPTx2YWw+IC0gbnVtYmVyIG9mIGNvYWxlc2NpbmcgY2xvY2sgdGlja3MgKHVzKSBhbGxvd2VkCisgKiAgICAgICAgICAgICAgICB0byB3YWl0IGZvciBtb3JlIHBhY2tldHMgdG8gYXJpdmUgaW4gdGhlIHRyYW5zbWl0IHJpbmcsCisgKiAgICAgICAgICAgICAgICBiZWZvcmUgaW50ZXJydXB0aW5nIHRoZSBob3N0LCBhZnRlciB0cmFuc21pdHRpbmcgdGhlCisgKiAgICAgICAgICAgICAgICBmaXJzdCBwYWNrZXQgaW4gdGhlIHJpbmcuCisgKgorICogIG1heF90eF9kZXNjPTx2YWw+IC0gbWF4aW11bSBudW1iZXIgb2YgdHJhbnNtaXQgZGVzY3JpcHRvcnMKKyAqICAgICAgICAgICAgICAgIChwYWNrZXRzKSB0cmFuc21pdHRlZCBiZWZvcmUgaW50ZXJydXB0aW5nIHRoZSBob3N0LgorICoKKyAqICBtYXhfcnhfZGVzYz08dmFsPiAtIG1heGltdW0gbnVtYmVyIG9mIHJlY2VpdmUgZGVzY3JpcHRvcnMKKyAqICAgICAgICAgICAgICAgIChwYWNrZXRzKSByZWNlaXZlZCBiZWZvcmUgaW50ZXJydXB0aW5nIHRoZSBob3N0LgorICoKKyAqICB0eF9yYXRpbz08dmFsPiAtIDcgYml0IHZhbHVlICgwIC0gNjMpIHNwZWNpZnlpbmcgdGhlIHNwbGl0IGluIDY0dGgKKyAqICAgICAgICAgICAgICAgIGluY3JlbWVudHMgb2YgdGhlIE5JQydzIG9uIGJvYXJkIG1lbW9yeSB0byBiZSB1c2VkIGZvcgorICogICAgICAgICAgICAgICAgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycy4gRm9yIHRoZSAxTUIgTklDIGFwcC4gODAwS0IKKyAqICAgICAgICAgICAgICAgIGlzIGF2YWlsYWJsZSwgb24gdGhlIDEvMk1CIE5JQyBhcHAuIDMwMEtCIGlzIGF2YWlsYWJsZS4KKyAqICAgICAgICAgICAgICAgIDY4S0Igd2lsbCBhbHdheXMgYmUgYXZhaWxhYmxlIGFzIGEgbWluaW11bSBmb3IgYm90aAorICogICAgICAgICAgICAgICAgZGlyZWN0aW9ucy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYSA1MC81MCBzcGxpdC4KKyAqICBkaXNfcGNpX21lbV9pbnZhbD08dmFsPiAtIGRpc2FibGUgUENJIG1lbW9yeSB3cml0ZSBhbmQgaW52YWxpZGF0ZQorICogICAgICAgICAgICAgICAgb3BlcmF0aW9ucywgZGVmYXVsdCAoMSkgaXMgdG8gYWx3YXlzIGRpc2FibGUgdGhpcyBhcworICogICAgICAgICAgICAgICAgdGhhdCBpcyB3aGF0IEFsdGVvbiBkb2VzIG9uIE5ULiBJIGhhdmUgbm90IGJlZW4gYWJsZQorICogICAgICAgICAgICAgICAgdG8gbWVhc3VyZSBhbnkgcmVhbCBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlcyB3aXRoCisgKiAgICAgICAgICAgICAgICB0aGlzIG9uIG15IHN5c3RlbXMuIFNldCA8dmFsPj0wIGlmIHlvdSB3YW50IHRvCisgKiAgICAgICAgICAgICAgICBlbmFibGUgdGhlc2Ugb3BlcmF0aW9ucy4KKyAqCisgKiBJZiB5b3UgdXNlIG1vcmUgdGhhbiBvbmUgTklDLCBzcGVjaWZ5IHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUKKyAqIGluZGl2aWR1YWwgTklDcyB3aXRoIGEgY29tbWEsIGllLiB0cmFjZT0wLDB4MDAwMDFmZmYsMCB5b3Ugd2FudCB0bworICogcnVuIHRyYWNpbmcgb24gTklDICMyIGJ1dCBub3Qgb24gTklDICMxIGFuZCAjMy4KKyAqCisgKiBUT0RPOgorICoKKyAqIC0gUHJvcGVyIG11bHRpY2FzdCBzdXBwb3J0LgorICogLSBOSUMgZHVtcCBzdXBwb3J0LgorICogLSBNb3JlIHR1bmluZyBwYXJhbWV0ZXJzLgorICoKKyAqIFRoZSBtaW5pIHJpbmcgaXMgbm90IHVzZWQgdW5kZXIgTGludXggYW5kIEkgYW0gbm90IHN1cmUgaXQgbWFrZXMgc2Vuc2UKKyAqIHRvIGFjdHVhbGx5IHVzZSBpdC4KKyAqCisgKiBOZXcgaW50ZXJydXB0IGhhbmRsZXIgc3RyYXRlZ3k6CisgKgorICogVGhlIG9sZCBpbnRlcnJ1cHQgaGFuZGxlciB3b3JrZWQgdXNpbmcgdGhlIHRyYWRpdGlvbmFsIG1ldGhvZCBvZgorICogcmVwbGFjaW5nIGFuIHNrYnVmZiB3aXRoIGEgbmV3IG9uZSB3aGVuIGEgcGFja2V0IGFycml2ZXMuIEhvd2V2ZXIKKyAqIHRoZSByeCByaW5ncyBkbyBub3QgbmVlZCB0byBjb250YWluIGEgc3RhdGljIG51bWJlciBvZiBidWZmZXIKKyAqIGRlc2NyaXB0b3JzLCB0aHVzIGl0IG1ha2VzIHNlbnNlIHRvIG1vdmUgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG91dAorICogb2YgdGhlIG1haW4gaW50ZXJydXB0IGhhbmRsZXIgYW5kIGRvIGl0IGluIGEgYm90dG9tIGhhbGYgaGFuZGxlcgorICogYW5kIG9ubHkgYWxsb2NhdGUgbmV3IGJ1ZmZlcnMgd2hlbiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhlCisgKiByaW5nIGlzIGJlbG93IGEgY2VydGFpbiB0aHJlc2hvbGQuIEluIG9yZGVyIHRvIGF2b2lkIHN0YXJ2aW5nIHRoZQorICogTklDIHVuZGVyIGhlYXZ5IGxvYWQgaXQgaXMgaG93ZXZlciBuZWNlc3NhcnkgdG8gZm9yY2UgYWxsb2NhdGlvbgorICogd2hlbiBoaXR0aW5nIGEgbWluaW11bSB0aHJlc2hvbGQuIFRoZSBzdHJhdGVneSBmb3IgYWxsb2N0aW9uIGlzIGFzCisgKiBmb2xsb3dzOgorICoKKyAqICAgICBSWF9MT1dfQlVGX1RIUkVTICAgIC0gYWxsb2NhdGUgYnVmZmVycyBpbiB0aGUgYm90dG9tIGhhbGYKKyAqICAgICBSWF9QQU5JQ19MT1dfVEhSRVMgIC0gd2UgYXJlIHZlcnkgbG93IG9uIGJ1ZmZlcnMsIGFsbG9jYXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBidWZmZXJzIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorICogICAgIFJYX1JJTkdfVEhSRVMgICAgICAgLSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSByeCByaW5nCisgKiAgICAgUlhfTUlOSV9USFJFUyAgICAgICAtIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhlIG1pbmkgcmluZworICogICAgIFJYX0pVTUJPX1RIUkVTICAgICAgLSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBqdW1ibyByaW5nCisgKgorICogT25lIGFkdmFudGFnb3VzIHNpZGUgZWZmZWN0IG9mIHRoaXMgYWxsb2NhdGlvbiBhcHByb2FjaCBpcyB0aGF0IHRoZQorICogZW50aXJlIHJ4IHByb2Nlc3NpbmcgY2FuIGJlIGRvbmUgd2l0aG91dCBob2xkaW5nIGFueSBzcGluIGxvY2sKKyAqIHNpbmNlIHRoZSByeCByaW5ncyBhbmQgcmVnaXN0ZXJzIGFyZSB0b3RhbGx5IGluZGVwZW5kZW50IG9mIHRoZSB0eAorICogcmluZyBhbmQgaXRzIHJlZ2lzdGVycy4gIFRoaXMgb2YgY291cnNlIGluY2x1ZGVzIHRoZSBrbWFsbG9jJ3Mgb2YKKyAqIG5ldyBza2Incy4gVGh1cyBzdGFydF94bWl0IGNhbiBydW4gaW4gcGFyYWxsZWwgd2l0aCByeCBwcm9jZXNzaW5nCisgKiBhbmQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG9uIFNNUCBzeXN0ZW1zLgorICoKKyAqIE5vdGUgdGhhdCBydW5uaW5nIHRoZSBza2IgcmVhbGxvY2F0aW9uIGluIGEgYm90dG9tIGhhbGYgb3BlbnMgdXAKKyAqIGFub3RoZXIgY2FuIG9mIHJhY2VzIHdoaWNoIG5lZWRzIHRvIGJlIGhhbmRsZWQgcHJvcGVybHkuIEluCisgKiBwYXJ0aWN1bGFyIGl0IGNhbiBoYXBwZW4gdGhhdCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdHJpZXMgdG8gcnVuCisgKiB0aGUgcmVhbGxvY2F0aW9uIHdoaWxlIHRoZSBib3R0b20gaGFsZiBpcyBlaXRoZXIgcnVubmluZyBvbiBhbm90aGVyCisgKiBDUFUgb3Igd2FzIGludGVycnVwdGVkIG9uIHRoZSBzYW1lIENQVS4gVG8gZ2V0IGFyb3VuZCB0aGlzIHRoZQorICogZHJpdmVyIHVzZXMgYml0b3BzIHRvIHByZXZlbnQgdGhlIHJlYWxsb2NhdGlvbiByb3V0aW5lcyBmcm9tIGJlaW5nCisgKiByZWVudGVyZWQuCisgKgorICogVFggaGFuZGxpbmcgY2FuIGFsc28gYmUgZG9uZSB3aXRob3V0IGhvbGRpbmcgYW55IHNwaW4gbG9jaywgd2hlZWUKKyAqIHRoaXMgaXMgZnVuISBzaW5jZSB0eF9yZXRfY3NtIGlzIG9ubHkgd3JpdHRlbiB0byBieSB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyLiBUaGUgY2FzZSB0byBiZSBhd2FyZSBvZiBpcyB3aGVuIHNodXR0aW5nIGRvd24gdGhlIGRldmljZQorICogYW5kIGNsZWFuaW5nIHVwIHdoZXJlIGl0IGlzIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgdGhhdAorICogc3RhcnRfeG1pdCgpIGlzIG5vdCBydW5uaW5nIHdoaWxlIHRoaXMgaXMgaGFwcGVuaW5nLiBXZWxsIERhdmVNCisgKiBpbmZvcm1zIG1lIHRoYXQgdGhpcyBjYXNlIGlzIGFscmVhZHkgcHJvdGVjdGVkIGFnYWluc3QgLi4uIGJ5ZSBieWUKKyAqIE1yLiBTcGluIExvY2ssIGl0IHdhcyBuaWNlIHRvIGtub3cgeW91LgorICoKKyAqIFRYIGludGVycnVwdHMgYXJlIG5vdyBwYXJ0bHkgZGlzYWJsZWQgc28gdGhlIE5JQyB3aWxsIG9ubHkgZ2VuZXJhdGUKKyAqIFRYIGludGVycnVwdHMgZm9yIHRoZSBudW1iZXIgb2YgY29hbCB0aWNrcywgbm90IGZvciB0aGUgbnVtYmVyIG9mCisgKiBUWCBwYWNrZXRzIGluIHRoZSBxdWV1ZS4gVGhpcyBzaG91bGQgcmVkdWNlIHRoZSBudW1iZXIgb2YgVFggb25seSwKKyAqIGllLiB3aGVuIG5vIFJYIHByb2Nlc3NpbmcgaXMgZG9uZSwgaW50ZXJydXB0cyBzZWVuLgorICovCisKKy8qCisgKiBUaHJlc2hvbGQgdmFsdWVzIGZvciBSWCBidWZmZXIgYWxsb2NhdGlvbiAtIHRoZSBsb3cgd2F0ZXIgbWFya3MgZm9yCisgKiB3aGVuIHRvIHN0YXJ0IHJlZmlsbGluZyB0aGUgcmluZ3MgYXJlIHNldCB0byA3NSUgb2YgdGhlIHJpbmcKKyAqIHNpemVzLiBJdCBzZWVtcyB0byBtYWtlIHNlbnNlIHRvIHJlZmlsbCB0aGUgcmluZ3MgZW50aXJlbHkgZnJvbSB0aGUKKyAqIGludHJydXB0IGhhbmRsZXIgb25jZSBpdCBnZXRzIGJlbG93IHRoZSBwYW5pYyB0aHJlc2hvbGQsIHRoYXQgd2F5CisgKiB3ZSBkb24ndCByaXNrIHRoYXQgdGhlIHJlZmlsbGluZyBpcyBtb3ZlZCB0byBhbm90aGVyIENQVSB3aGVuIHRoZQorICogb25lIHJ1bm5pbmcgdGhlIGludGVycnVwdCBoYW5kbGVyIGp1c3QgZ290IHRoZSBzbGFiIGNvZGUgaG90IGluIGl0cworICogY2FjaGUuCisgKi8KKyNkZWZpbmUgUlhfUklOR19TSVpFCQk3MgorI2RlZmluZSBSWF9NSU5JX1NJWkUJCTY0CisjZGVmaW5lIFJYX0pVTUJPX1NJWkUJCTQ4CisKKyNkZWZpbmUgUlhfUEFOSUNfU1REX1RIUkVTCTE2CisjZGVmaW5lIFJYX1BBTklDX1NURF9SRUZJTEwJKDMqUlhfUEFOSUNfU1REX1RIUkVTKS8yCisjZGVmaW5lIFJYX0xPV19TVERfVEhSRVMJKDMqUlhfUklOR19TSVpFKS80CisjZGVmaW5lIFJYX1BBTklDX01JTklfVEhSRVMJMTIKKyNkZWZpbmUgUlhfUEFOSUNfTUlOSV9SRUZJTEwJKDMqUlhfUEFOSUNfTUlOSV9USFJFUykvMgorI2RlZmluZSBSWF9MT1dfTUlOSV9USFJFUwkoMypSWF9NSU5JX1NJWkUpLzQKKyNkZWZpbmUgUlhfUEFOSUNfSlVNQk9fVEhSRVMJNgorI2RlZmluZSBSWF9QQU5JQ19KVU1CT19SRUZJTEwJKDMqUlhfUEFOSUNfSlVNQk9fVEhSRVMpLzIKKyNkZWZpbmUgUlhfTE9XX0pVTUJPX1RIUkVTCSgzKlJYX0pVTUJPX1NJWkUpLzQKKworCisvKgorICogU2l6ZSBvZiB0aGUgbWluaSByaW5nIGVudHJpZXMsIGJhc2ljYWxseSB0aGVzZSBqdXN0IHNob3VsZCBiZSBiaWcKKyAqIGVub3VnaCB0byB0YWtlIFRDUCBBQ0tzCisgKi8KKyNkZWZpbmUgQUNFX01JTklfU0laRQkJMTAwCisKKyNkZWZpbmUgQUNFX01JTklfQlVGU0laRQlBQ0VfTUlOSV9TSVpFCisjZGVmaW5lIEFDRV9TVERfQlVGU0laRQkJKEFDRV9TVERfTVRVICsgRVRIX0hMRU4gKyA0KQorI2RlZmluZSBBQ0VfSlVNQk9fQlVGU0laRQkoQUNFX0pVTUJPX01UVSArIEVUSF9ITEVOICsgNCkKKworLyoKKyAqIFRoZXJlIHNlZW1zIHRvIGJlIGEgbWFnaWMgZGlmZmVyZW5jZSBpbiB0aGUgZWZmZWN0IGJldHdlZW4gOTk1IGFuZCA5OTYKKyAqIGJ1dCBsaXR0bGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDkwMCBhbmQgOTk1IC4uLiBubyBpZGVhIHdoeS4KKyAqCisgKiBUaGVyZSBpcyBub3cgYSBkZWZhdWx0IHNldCBvZiB0dW5pbmcgcGFyYW1ldGVycyB3aGljaCBpcyBzZXQsIGRlcGVuZGluZworICogb24gd2hldGhlciBvciBub3QgdGhlIHVzZXIgZW5hYmxlcyBKdW1ibyBmcmFtZXMuIEl0J3MgYXNzdW1lZCB0aGF0IGlmCisgKiBKdW1ibyBmcmFtZXMgYXJlIGVuYWJsZWQsIHRoZSB1c2VyIHdhbnRzIG9wdGltYWwgdHVuaW5nIGZvciB0aGF0IGNhc2UuCisgKi8KKyNkZWZpbmUgREVGX1RYX0NPQUwJCTQwMCAvKiA5OTYgKi8KKyNkZWZpbmUgREVGX1RYX01BWF9ERVNDCQk2MCAgLyogd2FzIDQwICovCisjZGVmaW5lIERFRl9SWF9DT0FMCQkxMjAgLyogMTAwMCAqLworI2RlZmluZSBERUZfUlhfTUFYX0RFU0MJCTI1CisjZGVmaW5lIERFRl9UWF9SQVRJTwkJMjEgLyogMjQgKi8KKworI2RlZmluZSBERUZfSlVNQk9fVFhfQ09BTAkyMAorI2RlZmluZSBERUZfSlVNQk9fVFhfTUFYX0RFU0MJNjAKKyNkZWZpbmUgREVGX0pVTUJPX1JYX0NPQUwJMzAKKyNkZWZpbmUgREVGX0pVTUJPX1JYX01BWF9ERVNDCTYKKyNkZWZpbmUgREVGX0pVTUJPX1RYX1JBVElPCTIxCisKKyNpZiB0aWdvbjJGd1JlbGVhc2VMb2NhbCA8IDIwMDAxMTE4CisvKgorICogU3RhbmRhcmQgZmlybXdhcmUgYW5kIGVhcmx5IG1vZGlmaWNhdGlvbnMgZHVwbGljYXRlCisgKiBJUlEgbG9hZCB3aXRob3V0IHRoaXMgZmxhZyAoY29hbCB0aW1lciBpcyBuZXZlciByZXNldCkuCisgKiBOb3RlIHRoYXQgd2l0aCB0aGlzIGZsYWcgdHhfY29hbCBzaG91bGQgYmUgbGVzcyB0aGFuCisgKiB0aW1lIHRvIHhtaXQgZnVsbCB0eCByaW5nLgorICogNDAwdXNlYyBpcyBub3Qgc28gYmFkIGZvciB0eCByaW5nIHNpemUgb2YgMTI4LgorICovCisjZGVmaW5lIFRYX0NPQUxfSU5UU19PTkxZCTEJLyogd29ydGggaXQgKi8KKyNlbHNlCisvKgorICogV2l0aCBtb2RpZmllZCBmaXJtd2FyZSwgdGhpcyBpcyBub3QgbmVjZXNzYXJ5LCBidXQgc3RpbGwgdXNlZnVsLgorICovCisjZGVmaW5lIFRYX0NPQUxfSU5UU19PTkxZCTEKKyNlbmRpZgorCisjZGVmaW5lIERFRl9UUkFDRQkJMAorI2RlZmluZSBERUZfU1RBVAkJKDIgKiBUSUNLU19QRVJfU0VDKQorCisKK3N0YXRpYyBpbnQgbGlua1tBQ0VfTUFYX01PRF9QQVJNU107CitzdGF0aWMgaW50IHRyYWNlW0FDRV9NQVhfTU9EX1BBUk1TXTsKK3N0YXRpYyBpbnQgdHhfY29hbF90aWNrW0FDRV9NQVhfTU9EX1BBUk1TXTsKK3N0YXRpYyBpbnQgcnhfY29hbF90aWNrW0FDRV9NQVhfTU9EX1BBUk1TXTsKK3N0YXRpYyBpbnQgbWF4X3R4X2Rlc2NbQUNFX01BWF9NT0RfUEFSTVNdOworc3RhdGljIGludCBtYXhfcnhfZGVzY1tBQ0VfTUFYX01PRF9QQVJNU107CitzdGF0aWMgaW50IHR4X3JhdGlvW0FDRV9NQVhfTU9EX1BBUk1TXTsKK3N0YXRpYyBpbnQgZGlzX3BjaV9tZW1faW52YWxbQUNFX01BWF9NT0RfUEFSTVNdID0gezEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OworCitNT0RVTEVfQVVUSE9SKCJKZXMgU29yZW5zZW4gPGplc0B0cmFpbmVkLW1vbmtleS5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFjZU5JQy8zQzk4NS9HQTYyMCBHaWdhYml0IEV0aGVybmV0IGRyaXZlciIpOworCittb2R1bGVfcGFyYW1fYXJyYXkobGluaywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh0cmFjZSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh0eF9jb2FsX3RpY2ssIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWF4X3R4X2Rlc2MsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkocnhfY29hbF90aWNrLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG1heF9yeF9kZXNjLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHR4X3JhdGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhsaW5rLCAiQWNlTklDLzNDOTg1L05ldEdlYXIgbGluayBzdGF0ZSIpOworTU9EVUxFX1BBUk1fREVTQyh0cmFjZSwgIkFjZU5JQy8zQzk4NS9OZXRHZWFyIGZpcm13YXJlIHRyYWNlIGxldmVsIik7CitNT0RVTEVfUEFSTV9ERVNDKHR4X2NvYWxfdGljaywgIkFjZU5JQy8zQzk4NS9HQTYyMCBtYXggY2xvY2sgdGlja3MgdG8gd2FpdCBmcm9tIGZpcnN0IHR4IGRlc2NyaXB0b3IgYXJyaXZlcyIpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfdHhfZGVzYywgIkFjZU5JQy8zQzk4NS9HQTYyMCBtYXggbnVtYmVyIG9mIHRyYW5zbWl0IGRlc2NyaXB0b3JzIHRvIHdhaXQiKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfY29hbF90aWNrLCAiQWNlTklDLzNDOTg1L0dBNjIwIG1heCBjbG9jayB0aWNrcyB0byB3YWl0IGZyb20gZmlyc3QgcnggZGVzY3JpcHRvciBhcnJpdmVzIik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9yeF9kZXNjLCAiQWNlTklDLzNDOTg1L0dBNjIwIG1heCBudW1iZXIgb2YgcmVjZWl2ZSBkZXNjcmlwdG9ycyB0byB3YWl0Iik7CitNT0RVTEVfUEFSTV9ERVNDKHR4X3JhdGlvLCAiQWNlTklDLzNDOTg1L0dBNjIwIHJhdGlvIG9mIE5JQyBtZW1vcnkgdXNlZCBmb3IgVFgvUlggZGVzY3JpcHRvcnMgKHJhbmdlIDAtNjMpIik7CisKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPSAKKyAgImFjZW5pYy5jOiB2MC45MiAwOC8wNS8yMDAyICBKZXMgU29yZW5zZW4sIGxpbnV4LWFjZW5pY0BTdW5TSVRFLmRrXG4iCisgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL2hvbWUuY2Vybi5jaC9+amVzL2dpZ2UvYWNlbmljLmh0bWxcbiI7CisKK3N0YXRpYyBpbnQgYWNlX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgZXRodG9vbF9jbWQgKik7CitzdGF0aWMgaW50IGFjZV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGV0aHRvb2xfY21kICopOworc3RhdGljIHZvaWQgYWNlX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBldGh0b29sX2RydmluZm8gKik7CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgYWNlX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MgPSBhY2VfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBhY2Vfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IGFjZV9nZXRfZHJ2aW5mbywKK307CisKK3N0YXRpYyB2b2lkIGFjZV93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWNlbmljX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGFjZV9wcml2YXRlICphcDsKKwlzdGF0aWMgaW50IGJvYXJkc19mb3VuZDsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgYWNlX3ByaXZhdGUpKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhY2VuaWM6IFVuYWJsZSB0byBhbGxvY2F0ZSAiCisJCSAgICAgICAibmV0X2RldmljZSBzdHJ1Y3R1cmUhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlhcCA9IGRldi0+cHJpdjsKKwlhcC0+cGRldiA9IHBkZXY7CisJYXAtPm5hbWUgPSBwY2lfbmFtZShwZGV2KTsKKworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTTsKKyNpZiBBQ0VOSUNfRE9fVkxBTgorCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOworCWRldi0+dmxhbl9yeF9yZWdpc3RlciA9IGFjZV92bGFuX3J4X3JlZ2lzdGVyOworCWRldi0+dmxhbl9yeF9raWxsX3ZpZCA9IGFjZV92bGFuX3J4X2tpbGxfdmlkOworI2VuZGlmCisJaWYgKDEpIHsKKwkJZGV2LT50eF90aW1lb3V0ID0gJmFjZV93YXRjaGRvZzsKKwkJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CisJfQorCisJZGV2LT5vcGVuID0gJmFjZV9vcGVuOworCWRldi0+c3RvcCA9ICZhY2VfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmYWNlX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSAmYWNlX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZhY2Vfc2V0X211bHRpY2FzdF9saXN0OworCVNFVF9FVEhUT09MX09QUyhkZXYsICZhY2VfZXRodG9vbF9vcHMpOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gJmFjZV9zZXRfbWFjX2FkZHI7CisJZGV2LT5jaGFuZ2VfbXR1ID0gJmFjZV9jaGFuZ2VfbXR1OworCisJLyogd2Ugb25seSBkaXNwbGF5IHRoaXMgc3RyaW5nIE9OQ0UgKi8KKwlpZiAoIWJvYXJkc19mb3VuZCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlnb3RvIGZhaWxfZnJlZV9uZXRkZXY7CisKKwkvKgorCSAqIEVuYWJsZSBtYXN0ZXIgbW9kZSBiZWZvcmUgd2Ugc3RhcnQgcGxheWluZyB3aXRoIHRoZQorCSAqIHBjaV9jb21tYW5kIHdvcmQgc2luY2UgcGNpX3NldF9tYXN0ZXIoKSB3aWxsIG1vZGlmeQorCSAqIGl0LgorCSAqLworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZhcC0+cGNpX2NvbW1hbmQpOworCisJLyogT3BlbkZpcm13YXJlIG9uIE1hYydzIGRvZXMgbm90IHNldCB0aGlzIC0gRE9ILi4gKi8gCisJaWYgKCEoYXAtPnBjaV9jb21tYW5kICYgUENJX0NPTU1BTkRfTUVNT1JZKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRW5hYmxpbmcgUENJIE1lbW9yeSBNYXBwZWQgIgorCQkgICAgICAgImFjY2VzcyAtIHdhcyBub3QgZW5hYmxlZCBieSBCSU9TL0Zpcm13YXJlXG4iLAorCQkgICAgICAgYXAtPm5hbWUpOworCQlhcC0+cGNpX2NvbW1hbmQgPSBhcC0+cGNpX2NvbW1hbmQgfCBQQ0lfQ09NTUFORF9NRU1PUlk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChhcC0+cGRldiwgUENJX0NPTU1BTkQsCisJCQkJICAgICAgYXAtPnBjaV9jb21tYW5kKTsKKwkJd21iKCk7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsICZhcC0+cGNpX2xhdGVuY3kpOworCWlmIChhcC0+cGNpX2xhdGVuY3kgPD0gMHg0MCkgeworCQlhcC0+cGNpX2xhdGVuY3kgPSAweDQwOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIGFwLT5wY2lfbGF0ZW5jeSk7CisJfQorCisJLyoKKwkgKiBSZW1hcCB0aGUgcmVncyBpbnRvIGtlcm5lbCBzcGFjZSAtIHRoaXMgaXMgYWJ1c2Ugb2YKKwkgKiBkZXYtPmJhc2VfYWRkciBzaW5jZSBpdCB3YXMgbWVhbnMgZm9yIEkvTyBwb3J0CisJICogYWRkcmVzc2VzIGJ1dCB3aG8gZ2l2ZXMgYSBkYW1uLgorCSAqLworCWRldi0+YmFzZV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWFwLT5yZWdzID0gaW9yZW1hcChkZXYtPmJhc2VfYWRkciwgMHg0MDAwKTsKKwlpZiAoIWFwLT5yZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICBVbmFibGUgdG8gbWFwIEkvTyByZWdpc3RlciwgIgorCQkgICAgICAgIkFjZU5JQyAlaSB3aWxsIGJlIGRpc2FibGVkLlxuIiwKKwkJICAgICAgIGFwLT5uYW1lLCBib2FyZHNfZm91bmQpOworCQlnb3RvIGZhaWxfZnJlZV9uZXRkZXY7CisJfQorCisJc3dpdGNoKHBkZXYtPnZlbmRvcikgeworCWNhc2UgUENJX1ZFTkRPUl9JRF9BTFRFT046CisJCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9GQVJBTExPTl9QTjkxMDBUKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRmFyYWxsb24gUE45MTAwLVQgIiwKKwkJCSAgICAgICBhcC0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQWx0ZW9uIEFjZU5JQyAiLAorCQkJICAgICAgIGFwLT5uYW1lKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBDSV9WRU5ET1JfSURfM0NPTToKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IDNDb20gM0M5ODUgIiwgYXAtPm5hbWUpOworCQlicmVhazsKKwljYXNlIFBDSV9WRU5ET1JfSURfTkVUR0VBUjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5ldEdlYXIgR0E2MjAgIiwgYXAtPm5hbWUpOworCQlicmVhazsKKwljYXNlIFBDSV9WRU5ET1JfSURfREVDOgorCQlpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfRkFSQUxMT05fUE45MDAwU1gpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGYXJhbGxvbiBQTjkwMDAtU1ggIiwKKwkJCSAgICAgICBhcC0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgUENJX1ZFTkRPUl9JRF9TR0k6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTR0kgQWNlTklDICIsIGFwLT5uYW1lKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVua25vd24gQWNlTklDICIsIGFwLT5uYW1lKTsKKwkJYnJlYWs7CisJfQorCisJcHJpbnRrKCJHaWdhYml0IEV0aGVybmV0IGF0IDB4JTA4bHgsICIsIGRldi0+YmFzZV9hZGRyKTsKKyNpZmRlZiBfX3NwYXJjX18KKwlwcmludGsoImlycSAlc1xuIiwgX19pcnFfaXRvYShwZGV2LT5pcnEpKTsKKyNlbHNlCisJcHJpbnRrKCJpcnEgJWlcbiIsIHBkZXYtPmlycSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BQ0VOSUNfT01JVF9USUdPTl9JCisJaWYgKChyZWFkbCgmYXAtPnJlZ3MtPkhvc3RDdHJsKSA+PiAyOCkgPT0gNCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBEcml2ZXIgY29tcGlsZWQgd2l0aG91dCBUaWdvbiBJIgorCQkgICAgICAgIiBzdXBwb3J0IC0gTklDIGRpc2FibGVkXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIGZhaWxfdW5pbml0OworCX0KKyNlbmRpZgorCisJaWYgKGFjZV9hbGxvY2F0ZV9kZXNjcmlwdG9ycyhkZXYpKQorCQlnb3RvIGZhaWxfZnJlZV9uZXRkZXY7CisKKyNpZmRlZiBNT0RVTEUKKwlpZiAoYm9hcmRzX2ZvdW5kID49IEFDRV9NQVhfTU9EX1BBUk1TKQorCQlhcC0+Ym9hcmRfaWR4ID0gQk9BUkRfSURYX09WRVJGTE9XOworCWVsc2UKKwkJYXAtPmJvYXJkX2lkeCA9IGJvYXJkc19mb3VuZDsKKyNlbHNlCisJYXAtPmJvYXJkX2lkeCA9IEJPQVJEX0lEWF9TVEFUSUM7CisjZW5kaWYKKworCWlmIChhY2VfaW5pdChkZXYpKQorCQlnb3RvIGZhaWxfZnJlZV9uZXRkZXY7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhY2VuaWM6IGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsX3VuaW5pdDsKKwl9CisJYXAtPm5hbWUgPSBkZXYtPm5hbWU7CisKKwlpZiAoYXAtPnBjaV91c2luZ19kYWMpCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlib2FyZHNfZm91bmQrKzsKKwlyZXR1cm4gMDsKKworIGZhaWxfdW5pbml0OgorCWFjZV9pbml0X2NsZWFudXAoZGV2KTsKKyBmYWlsX2ZyZWVfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhY2VuaWNfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisJc2hvcnQgaTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwl3cml0ZWwocmVhZGwoJnJlZ3MtPkNwdUN0cmwpIHwgQ1BVX0hBTFQsICZyZWdzLT5DcHVDdHJsKTsKKwlpZiAoYXAtPnZlcnNpb24gPj0gMikKKwkJd3JpdGVsKHJlYWRsKCZyZWdzLT5DcHVCQ3RybCkgfCBDUFVfSEFMVCwgJnJlZ3MtPkNwdUJDdHJsKTsKKwkKKwkvKgorCSAqIFRoaXMgY2xlYXJzIGFueSBwZW5kaW5nIGludGVycnVwdHMKKwkgKi8KKwl3cml0ZWwoMSwgJnJlZ3MtPk1iMExvKTsKKwlyZWFkbCgmcmVncy0+Q3B1Q3RybCk7CS8qIGZsdXNoICovCisKKwkvKgorCSAqIE1ha2Ugc3VyZSBubyBvdGhlciBDUFVzIGFyZSBwcm9jZXNzaW5nIGludGVycnVwdHMKKwkgKiBvbiB0aGUgY2FyZCBiZWZvcmUgdGhlIGJ1ZmZlcnMgYXJlIGJlaW5nIHJlbGVhc2VkLgorCSAqIE90aGVyd2lzZSBvbmUgbWlnaHQgZXhwZXJpZW5jZSBzb21lIGBpbnRlcmVzdGluZycKKwkgKiBlZmZlY3RzLgorCSAqCisJICogVGhlbiByZWxlYXNlIHRoZSBSWCBidWZmZXJzIC0ganVtYm8gYnVmZmVycyB3ZXJlCisJICogYWxyZWFkeSByZWxlYXNlZCBpbiBhY2VfY2xvc2UoKS4KKwkgKi8KKwlhY2Vfc3luY19pcnEoZGV2LT5pcnEpOworCisJZm9yIChpID0gMDsgaSA8IFJYX1NURF9SSU5HX0VOVFJJRVM7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYXAtPnNrYi0+cnhfc3RkX3NrYnVmZltpXS5za2I7CisKKwkJaWYgKHNrYikgeworCQkJc3RydWN0IHJpbmdfaW5mbyAqcmluZ3A7CisJCQlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwkJCXJpbmdwID0gJmFwLT5za2ItPnJ4X3N0ZF9za2J1ZmZbaV07CisJCQltYXBwaW5nID0gcGNpX3VubWFwX2FkZHIocmluZ3AsIG1hcHBpbmcpOworCQkJcGNpX3VubWFwX3BhZ2UoYXAtPnBkZXYsIG1hcHBpbmcsCisJCQkJICAgICAgIEFDRV9TVERfQlVGU0laRSwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJYXAtPnJ4X3N0ZF9yaW5nW2ldLnNpemUgPSAwOworCQkJYXAtPnNrYi0+cnhfc3RkX3NrYnVmZltpXS5za2IgPSBOVUxMOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQl9CisJfQorCisJaWYgKGFwLT52ZXJzaW9uID49IDIpIHsKKwkJZm9yIChpID0gMDsgaSA8IFJYX01JTklfUklOR19FTlRSSUVTOyBpKyspIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBhcC0+c2tiLT5yeF9taW5pX3NrYnVmZltpXS5za2I7CisKKwkJCWlmIChza2IpIHsKKwkJCQlzdHJ1Y3QgcmluZ19pbmZvICpyaW5ncDsKKwkJCQlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwkJCQlyaW5ncCA9ICZhcC0+c2tiLT5yeF9taW5pX3NrYnVmZltpXTsKKwkJCQltYXBwaW5nID0gcGNpX3VubWFwX2FkZHIocmluZ3AsbWFwcGluZyk7CisJCQkJcGNpX3VubWFwX3BhZ2UoYXAtPnBkZXYsIG1hcHBpbmcsCisJCQkJCSAgICAgICBBQ0VfTUlOSV9CVUZTSVpFLAorCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJCWFwLT5yeF9taW5pX3JpbmdbaV0uc2l6ZSA9IDA7CisJCQkJYXAtPnNrYi0+cnhfbWluaV9za2J1ZmZbaV0uc2tiID0gTlVMTDsKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQl9CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfSlVNQk9fUklOR19FTlRSSUVTOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFwLT5za2ItPnJ4X2p1bWJvX3NrYnVmZltpXS5za2I7CisJCWlmIChza2IpIHsKKwkJCXN0cnVjdCByaW5nX2luZm8gKnJpbmdwOworCQkJZG1hX2FkZHJfdCBtYXBwaW5nOworCisJCQlyaW5ncCA9ICZhcC0+c2tiLT5yeF9qdW1ib19za2J1ZmZbaV07CisJCQltYXBwaW5nID0gcGNpX3VubWFwX2FkZHIocmluZ3AsIG1hcHBpbmcpOworCQkJcGNpX3VubWFwX3BhZ2UoYXAtPnBkZXYsIG1hcHBpbmcsCisJCQkJICAgICAgIEFDRV9KVU1CT19CVUZTSVpFLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQlhcC0+cnhfanVtYm9fcmluZ1tpXS5zaXplID0gMDsKKwkJCWFwLT5za2ItPnJ4X2p1bWJvX3NrYnVmZltpXS5za2IgPSBOVUxMOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQl9CisJfQorCisJYWNlX2luaXRfY2xlYW51cChkZXYpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhY2VuaWNfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYWNlbmljIiwKKwkuaWRfdGFibGUJPSBhY2VuaWNfcGNpX3RibCwKKwkucHJvYmUJCT0gYWNlbmljX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFjZW5pY19yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFjZW5pY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmYWNlbmljX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNlbmljX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjZW5pY19wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWNlbmljX2luaXQpOworbW9kdWxlX2V4aXQoYWNlbmljX2V4aXQpOworCitzdGF0aWMgdm9pZCBhY2VfZnJlZV9kZXNjcmlwdG9ycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBzaXplOworCisJaWYgKGFwLT5yeF9zdGRfcmluZyAhPSBOVUxMKSB7CisJCXNpemUgPSAoc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSAqCisJCQkoUlhfU1REX1JJTkdfRU5UUklFUyArCisJCQkgUlhfSlVNQk9fUklOR19FTlRSSUVTICsKKwkJCSBSWF9NSU5JX1JJTkdfRU5UUklFUyArCisJCQkgUlhfUkVUVVJOX1JJTkdfRU5UUklFUykpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFwLT5wZGV2LCBzaXplLCBhcC0+cnhfc3RkX3JpbmcsCisJCQkJICAgIGFwLT5yeF9yaW5nX2Jhc2VfZG1hKTsKKwkJYXAtPnJ4X3N0ZF9yaW5nID0gTlVMTDsKKwkJYXAtPnJ4X2p1bWJvX3JpbmcgPSBOVUxMOworCQlhcC0+cnhfbWluaV9yaW5nID0gTlVMTDsKKwkJYXAtPnJ4X3JldHVybl9yaW5nID0gTlVMTDsKKwl9CisJaWYgKGFwLT5ldnRfcmluZyAhPSBOVUxMKSB7CisJCXNpemUgPSAoc2l6ZW9mKHN0cnVjdCBldmVudCkgKiBFVlRfUklOR19FTlRSSUVTKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhcC0+cGRldiwgc2l6ZSwgYXAtPmV2dF9yaW5nLAorCQkJCSAgICBhcC0+ZXZ0X3JpbmdfZG1hKTsKKwkJYXAtPmV2dF9yaW5nID0gTlVMTDsKKwl9CisJaWYgKGFwLT50eF9yaW5nICE9IE5VTEwgJiYgIUFDRV9JU19USUdPTl9JKGFwKSkgeworCQlzaXplID0gKHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiBNQVhfVFhfUklOR19FTlRSSUVTKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhcC0+cGRldiwgc2l6ZSwgYXAtPnR4X3JpbmcsCisJCQkJICAgIGFwLT50eF9yaW5nX2RtYSk7CisJfQorCWFwLT50eF9yaW5nID0gTlVMTDsKKworCWlmIChhcC0+ZXZ0X3ByZCAhPSBOVUxMKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYXAtPnBkZXYsIHNpemVvZih1MzIpLAorCQkJCSAgICAodm9pZCAqKWFwLT5ldnRfcHJkLCBhcC0+ZXZ0X3ByZF9kbWEpOworCQlhcC0+ZXZ0X3ByZCA9IE5VTEw7CisJfQorCWlmIChhcC0+cnhfcmV0X3ByZCAhPSBOVUxMKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYXAtPnBkZXYsIHNpemVvZih1MzIpLAorCQkJCSAgICAodm9pZCAqKWFwLT5yeF9yZXRfcHJkLAorCQkJCSAgICBhcC0+cnhfcmV0X3ByZF9kbWEpOworCQlhcC0+cnhfcmV0X3ByZCA9IE5VTEw7CisJfQorCWlmIChhcC0+dHhfY3NtICE9IE5VTEwpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhcC0+cGRldiwgc2l6ZW9mKHUzMiksCisJCQkJICAgICh2b2lkICopYXAtPnR4X2NzbSwgYXAtPnR4X2NzbV9kbWEpOworCQlhcC0+dHhfY3NtID0gTlVMTDsKKwl9Cit9CisKKworc3RhdGljIGludCBhY2VfYWxsb2NhdGVfZGVzY3JpcHRvcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSAoc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSAqCisJCShSWF9TVERfUklOR19FTlRSSUVTICsKKwkJIFJYX0pVTUJPX1JJTkdfRU5UUklFUyArCisJCSBSWF9NSU5JX1JJTkdfRU5UUklFUyArCisJCSBSWF9SRVRVUk5fUklOR19FTlRSSUVTKSk7CisKKwlhcC0+cnhfc3RkX3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhcC0+cGRldiwgc2l6ZSwKKwkJCQkJICAgICAgICZhcC0+cnhfcmluZ19iYXNlX2RtYSk7CisJaWYgKGFwLT5yeF9zdGRfcmluZyA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwlhcC0+cnhfanVtYm9fcmluZyA9IGFwLT5yeF9zdGRfcmluZyArIFJYX1NURF9SSU5HX0VOVFJJRVM7CisJYXAtPnJ4X21pbmlfcmluZyA9IGFwLT5yeF9qdW1ib19yaW5nICsgUlhfSlVNQk9fUklOR19FTlRSSUVTOworCWFwLT5yeF9yZXR1cm5fcmluZyA9IGFwLT5yeF9taW5pX3JpbmcgKyBSWF9NSU5JX1JJTkdfRU5UUklFUzsKKworCXNpemUgPSAoc2l6ZW9mKHN0cnVjdCBldmVudCkgKiBFVlRfUklOR19FTlRSSUVTKTsKKworCWFwLT5ldnRfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFwLT5wZGV2LCBzaXplLCAmYXAtPmV2dF9yaW5nX2RtYSk7CisKKwlpZiAoYXAtPmV2dF9yaW5nID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKworCS8qCisJICogT25seSBhbGxvY2F0ZSBhIGhvc3QgVFggcmluZyBmb3IgdGhlIFRpZ29uIElJLCB0aGUgVGlnb24gSQorCSAqIGhhcyB0byB1c2UgUENJIHJlZ2lzdGVycyBmb3IgdGhpcyA7LSgKKwkgKi8KKwlpZiAoIUFDRV9JU19USUdPTl9JKGFwKSkgeworCQlzaXplID0gKHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiBNQVhfVFhfUklOR19FTlRSSUVTKTsKKworCQlhcC0+dHhfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFwLT5wZGV2LCBzaXplLAorCQkJCQkJICAgJmFwLT50eF9yaW5nX2RtYSk7CisKKwkJaWYgKGFwLT50eF9yaW5nID09IE5VTEwpCisJCQlnb3RvIGZhaWw7CisJfQorCisJYXAtPmV2dF9wcmQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhcC0+cGRldiwgc2l6ZW9mKHUzMiksCisJCQkJCSAgICZhcC0+ZXZ0X3ByZF9kbWEpOworCWlmIChhcC0+ZXZ0X3ByZCA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwlhcC0+cnhfcmV0X3ByZCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFwLT5wZGV2LCBzaXplb2YodTMyKSwKKwkJCQkJICAgICAgJmFwLT5yeF9yZXRfcHJkX2RtYSk7CisJaWYgKGFwLT5yeF9yZXRfcHJkID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKworCWFwLT50eF9jc20gPSBwY2lfYWxsb2NfY29uc2lzdGVudChhcC0+cGRldiwgc2l6ZW9mKHUzMiksCisJCQkJCSAgJmFwLT50eF9jc21fZG1hKTsKKwlpZiAoYXAtPnR4X2NzbSA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwkvKiBDbGVhbiB1cC4gKi8KKwlhY2VfaW5pdF9jbGVhbnVwKGRldik7CisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIEdlbmVyaWMgY2xlYW51cCBoYW5kbGluZyBkYXRhIGFsbG9jYXRlZCBkdXJpbmcgaW5pdC4gVXNlZCB3aGVuIHRoZQorICogbW9kdWxlIGlzIHVubG9hZGVkIG9yIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgaW5pdGlhbGl6YXRpb24KKyAqLworc3RhdGljIHZvaWQgYWNlX2luaXRfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXA7CisKKwlhcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlhY2VfZnJlZV9kZXNjcmlwdG9ycyhkZXYpOworCisJaWYgKGFwLT5pbmZvKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFwLT5wZGV2LCBzaXplb2Yoc3RydWN0IGFjZV9pbmZvKSwKKwkJCQkgICAgYXAtPmluZm8sIGFwLT5pbmZvX2RtYSk7CisJaWYgKGFwLT5za2IpCisJCWtmcmVlKGFwLT5za2IpOworCWlmIChhcC0+dHJhY2VfYnVmKQorCQlrZnJlZShhcC0+dHJhY2VfYnVmKTsKKworCWlmIChkZXYtPmlycSkKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlpb3VubWFwKGFwLT5yZWdzKTsKK30KKworCisvKgorICogQ29tbWFuZHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc2xvdy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGFjZV9pc3N1ZV9jbWQoc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MsIHN0cnVjdCBjbWQgKmNtZCkKK3sKKwl1MzIgaWR4OworCisJaWR4ID0gcmVhZGwoJnJlZ3MtPkNtZFByZCk7CisKKwl3cml0ZWwoKih1MzIgKikoY21kKSwgJnJlZ3MtPkNtZFJuZ1tpZHhdKTsKKwlpZHggPSAoaWR4ICsgMSkgJSBDTURfUklOR19FTlRSSUVTOworCisJd3JpdGVsKGlkeCwgJnJlZ3MtPkNtZFByZCk7Cit9CisKKworc3RhdGljIGludCBfX2RldmluaXQgYWNlX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwOworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBhY2VfaW5mbyAqaW5mbyA9IE5VTEw7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJdW5zaWduZWQgbG9uZyBteWppZjsKKwl1NjQgdG1wX3B0cjsKKwl1MzIgdGlnX3ZlciwgbWFjMSwgbWFjMiwgdG1wLCBwY2lfc3RhdGU7CisJaW50IGJvYXJkX2lkeCwgZWNvZGUgPSAwOworCXNob3J0IGk7CisJdW5zaWduZWQgY2hhciBjYWNoZV9zaXplOworCisJYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJlZ3MgPSBhcC0+cmVnczsKKworCWJvYXJkX2lkeCA9IGFwLT5ib2FyZF9pZHg7CisKKwkvKgorCSAqIGFtYW5Ac2dpLmNvbSAtIGl0cyB1c2VmdWwgdG8gZG8gYSBOSUMgcmVzZXQgaGVyZSB0bworCSAqIGFkZHJlc3MgdGhlIGBGaXJtd2FyZSBub3QgcnVubmluZycgcHJvYmxlbSBzdWJzZXF1ZW50CisJICogdG8gYW55IGNyYXNoZXMgaW52b2x2aW5nIHRoZSBOSUMKKwkgKi8KKwl3cml0ZWwoSFdfUkVTRVQgfCAoSFdfUkVTRVQgPDwgMjQpLCAmcmVncy0+SG9zdEN0cmwpOworCXJlYWRsKCZyZWdzLT5Ib3N0Q3RybCk7CQkvKiBQQ0kgd3JpdGUgcG9zdGluZyAqLworCXVkZWxheSg1KTsKKworCS8qCisJICogRG9uJ3QgYWNjZXNzIGFueSBvdGhlciByZWdpc3RlcnMgYmVmb3JlIHRoaXMgcG9pbnQhCisJICovCisjaWZkZWYgX19CSUdfRU5ESUFOCisJLyoKKwkgKiBUaGlzIHdpbGwgbW9zdCBsaWtlbHkgbmVlZCBCWVRFX1NXQVAgb25jZSB3ZSBzd2l0Y2gKKwkgKiB0byB1c2luZyBfX3Jhd193cml0ZWwoKQorCSAqLworCXdyaXRlbCgoV09SRF9TV0FQIHwgQ0xSX0lOVCB8ICgoV09SRF9TV0FQIHwgQ0xSX0lOVCkgPDwgMjQpKSwKKwkgICAgICAgJnJlZ3MtPkhvc3RDdHJsKTsKKyNlbHNlCisJd3JpdGVsKChDTFJfSU5UIHwgV09SRF9TV0FQIHwgKChDTFJfSU5UIHwgV09SRF9TV0FQKSA8PCAyNCkpLAorCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworI2VuZGlmCisJcmVhZGwoJnJlZ3MtPkhvc3RDdHJsKTsJCS8qIFBDSSB3cml0ZSBwb3N0aW5nICovCisKKwkvKgorCSAqIFN0b3AgdGhlIE5JQyBDUFUgYW5kIGNsZWFyIHBlbmRpbmcgaW50ZXJydXB0cworCSAqLworCXdyaXRlbChyZWFkbCgmcmVncy0+Q3B1Q3RybCkgfCBDUFVfSEFMVCwgJnJlZ3MtPkNwdUN0cmwpOworCXJlYWRsKCZyZWdzLT5DcHVDdHJsKTsJCS8qIFBDSSB3cml0ZSBwb3N0aW5nICovCisJd3JpdGVsKDAsICZyZWdzLT5NYjBMbyk7CisKKwl0aWdfdmVyID0gcmVhZGwoJnJlZ3MtPkhvc3RDdHJsKSA+PiAyODsKKworCXN3aXRjaCh0aWdfdmVyKXsKKyNpZm5kZWYgQ09ORklHX0FDRU5JQ19PTUlUX1RJR09OX0kKKwljYXNlIDQ6CisJY2FzZSA1OgorCQlwcmludGsoS0VSTl9JTkZPICIgIFRpZ29uIEkgIChSZXYuICVpKSwgRmlybXdhcmU6ICVpLiVpLiVpLCAiLAorCQkgICAgICAgdGlnX3ZlciwgdGlnb25Gd1JlbGVhc2VNYWpvciwgdGlnb25Gd1JlbGVhc2VNaW5vciwKKwkJICAgICAgIHRpZ29uRndSZWxlYXNlRml4KTsKKwkJd3JpdGVsKDAsICZyZWdzLT5Mb2NhbEN0cmwpOworCQlhcC0+dmVyc2lvbiA9IDE7CisJCWFwLT50eF9yaW5nX2VudHJpZXMgPSBUSUdPTl9JX1RYX1JJTkdfRU5UUklFUzsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIDY6CisJCXByaW50ayhLRVJOX0lORk8gIiAgVGlnb24gSUkgKFJldi4gJWkpLCBGaXJtd2FyZTogJWkuJWkuJWksICIsCisJCSAgICAgICB0aWdfdmVyLCB0aWdvbjJGd1JlbGVhc2VNYWpvciwgdGlnb24yRndSZWxlYXNlTWlub3IsCisJCSAgICAgICB0aWdvbjJGd1JlbGVhc2VGaXgpOworCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkNwdUJDdHJsKSB8IENQVV9IQUxULCAmcmVncy0+Q3B1QkN0cmwpOworCQlyZWFkbCgmcmVncy0+Q3B1QkN0cmwpOwkJLyogUENJIHdyaXRlIHBvc3RpbmcgKi8KKwkJLyoKKwkJICogVGhlIFNSQU0gYmFuayBzaXplIGRvZXMgX25vdF8gaW5kaWNhdGUgdGhlIGFtb3VudAorCQkgKiBvZiBtZW1vcnkgb24gdGhlIGNhcmQsIGl0IGNvbnRyb2xzIHRoZSBfYmFua18gc2l6ZSEKKwkJICogSWUuIGEgMU1CIEFjZU5JQyB3aWxsIGhhdmUgdHdvIGJhbmtzIG9mIDUxMktCLgorCQkgKi8KKwkJd3JpdGVsKFNSQU1fQkFOS181MTJLLCAmcmVncy0+TG9jYWxDdHJsKTsKKwkJd3JpdGVsKFNZTkNfU1JBTV9USU1JTkcsICZyZWdzLT5NaXNjQ2ZnKTsKKwkJYXAtPnZlcnNpb24gPSAyOworCQlhcC0+dHhfcmluZ19lbnRyaWVzID0gTUFYX1RYX1JJTkdfRU5UUklFUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBVbnN1cHBvcnRlZCBUaWdvbiB2ZXJzaW9uIGRldGVjdGVkICIKKwkJICAgICAgICIoJWkpXG4iLCB0aWdfdmVyKTsKKwkJZWNvZGUgPSAtRU5PREVWOworCQlnb3RvIGluaXRfZXJyb3I7CisJfQorCisJLyoKKwkgKiBNb2RlU3RhdCBfbXVzdF8gYmUgc2V0IGFmdGVyIHRoZSBTUkFNIHNldHRpbmdzIGFzIHRoaXMgY2hhbmdlCisJICogc2VlbXMgdG8gY29ycnVwdCB0aGUgTW9kZVN0YXQgYW5kIHBvc3NpYmxlIG90aGVyIHJlZ2lzdGVycy4KKwkgKiBUaGUgU1JBTSBzZXR0aW5ncyBzdXJ2aXZlIHJlc2V0cyBhbmQgc2V0dGluZyBpdCB0byB0aGUgc2FtZQorCSAqIHZhbHVlIGEgc2Vjb25kIHRpbWUgd29ya3MgYXMgd2VsbC4gVGhpcyBpcyB3aGF0IGNhdXNlZCB0aGUKKwkgKiBgRmlybXdhcmUgbm90IHJ1bm5pbmcnIHByb2JsZW0gb24gdGhlIFRpZ29uIElJLgorCSAqLworI2lmZGVmIF9fQklHX0VORElBTgorCXdyaXRlbChBQ0VfQllURV9TV0FQX0RNQSB8IEFDRV9XQVJOIHwgQUNFX0ZBVEFMIHwgQUNFX0JZVEVfU1dBUF9CRCB8CisJICAgICAgIEFDRV9XT1JEX1NXQVBfQkQgfCBBQ0VfTk9fSlVNQk9fRlJBRywgJnJlZ3MtPk1vZGVTdGF0KTsKKyNlbHNlCisJd3JpdGVsKEFDRV9CWVRFX1NXQVBfRE1BIHwgQUNFX1dBUk4gfCBBQ0VfRkFUQUwgfAorCSAgICAgICBBQ0VfV09SRF9TV0FQX0JEIHwgQUNFX05PX0pVTUJPX0ZSQUcsICZyZWdzLT5Nb2RlU3RhdCk7CisjZW5kaWYKKwlyZWFkbCgmcmVncy0+TW9kZVN0YXQpOwkJLyogUENJIHdyaXRlIHBvc3RpbmcgKi8KKworCW1hYzEgPSAwOworCWZvcihpID0gMDsgaSA8IDQ7IGkrKykgeworCQltYWMxID0gbWFjMSA8PCA4OworCQl0bXAgPSByZWFkX2VlcHJvbV9ieXRlKGRldiwgMHg4YytpKTsKKwkJaWYgKHRtcCA8IDApIHsKKwkJCWVjb2RlID0gLUVJTzsKKwkJCWdvdG8gaW5pdF9lcnJvcjsKKwkJfSBlbHNlCisJCQltYWMxIHw9ICh0bXAgJiAweGZmKTsKKwl9CisJbWFjMiA9IDA7CisJZm9yKGkgPSA0OyBpIDwgODsgaSsrKSB7CisJCW1hYzIgPSBtYWMyIDw8IDg7CisJCXRtcCA9IHJlYWRfZWVwcm9tX2J5dGUoZGV2LCAweDhjK2kpOworCQlpZiAodG1wIDwgMCkgeworCQkJZWNvZGUgPSAtRUlPOworCQkJZ290byBpbml0X2Vycm9yOworCQl9IGVsc2UKKwkJCW1hYzIgfD0gKHRtcCAmIDB4ZmYpOworCX0KKworCXdyaXRlbChtYWMxLCAmcmVncy0+TWFjQWRkckhpKTsKKwl3cml0ZWwobWFjMiwgJnJlZ3MtPk1hY0FkZHJMbyk7CisKKwlwcmludGsoIk1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIChtYWMxID4+IDgpICYgMHhmZiwgbWFjMSAmIDB4ZmYsIChtYWMyID4+IDI0KSAmMHhmZiwKKwkgICAgICAgKG1hYzIgPj4gMTYpICYgMHhmZiwgKG1hYzIgPj4gOCkgJiAweGZmLCBtYWMyICYgMHhmZik7CisKKwlkZXYtPmRldl9hZGRyWzBdID0gKG1hYzEgPj4gOCkgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbMV0gPSBtYWMxICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzJdID0gKG1hYzIgPj4gMjQpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzNdID0gKG1hYzIgPj4gMTYpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzRdID0gKG1hYzIgPj4gOCkgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbNV0gPSBtYWMyICYgMHhmZjsKKworCS8qCisJICogTG9va3MgbGlrZSB0aGlzIGlzIG5lY2Vzc2FyeSB0byBkZWFsIHdpdGggb24gYWxsIGFyY2hpdGVjdHVyZXMsCisJICogZXZlbiB0aGlzICUkIyUkIyBONDQwQlggSW50ZWwgYmFzZWQgdGhpbmcgZG9lc24ndCBnZXQgaXQgcmlnaHQuCisJICogSWUuIGhhdmluZyB0d28gTklDcyBpbiB0aGUgbWFjaGluZSwgb25lIHdpbGwgaGF2ZSB0aGUgY2FjaGUKKwkgKiBsaW5lIHNldCBhdCBib290IHRpbWUsIHRoZSBvdGhlciB3aWxsIG5vdC4KKwkgKi8KKwlwZGV2ID0gYXAtPnBkZXY7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJmNhY2hlX3NpemUpOworCWNhY2hlX3NpemUgPDw9IDI7CisJaWYgKGNhY2hlX3NpemUgIT0gU01QX0NBQ0hFX0JZVEVTKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiAgUENJIGNhY2hlIGxpbmUgc2l6ZSBzZXQgaW5jb3JyZWN0bHkgIgorCQkgICAgICAgIiglaSBieXRlcykgYnkgQklPUy9GVywgIiwgY2FjaGVfc2l6ZSk7CisJCWlmIChjYWNoZV9zaXplID4gU01QX0NBQ0hFX0JZVEVTKQorCQkJcHJpbnRrKCJleHBlY3RpbmcgJWlcbiIsIFNNUF9DQUNIRV9CWVRFUyk7CisJCWVsc2UgeworCQkJcHJpbnRrKCJjb3JyZWN0aW5nIHRvICVpXG4iLCBTTVBfQ0FDSEVfQllURVMpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsCisJCQkJCSAgICAgIFNNUF9DQUNIRV9CWVRFUyA+PiAyKTsKKwkJfQorCX0KKworCXBjaV9zdGF0ZSA9IHJlYWRsKCZyZWdzLT5QY2lTdGF0ZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiICBQQ0kgYnVzIHdpZHRoOiAlaSBiaXRzLCBzcGVlZDogJWlNSHosICIKKwkgICAgICAgImxhdGVuY3k6ICVpIGNsa3NcbiIsCisJICAgICAgIAkocGNpX3N0YXRlICYgUENJXzMyQklUKSA/IDMyIDogNjQsCisJCShwY2lfc3RhdGUgJiBQQ0lfNjZNSFopID8gNjYgOiAzMywgCisJCWFwLT5wY2lfbGF0ZW5jeSk7CisKKwkvKgorCSAqIFNldCB0aGUgbWF4IERNQSB0cmFuc2ZlciBzaXplLiBTZWVtcyB0aGF0IGZvciBtb3N0IHN5c3RlbXMKKwkgKiB0aGUgcGVyZm9ybWFuY2UgaXMgYmV0dGVyIHdoZW4gbm8gTUFYIHBhcmFtZXRlciBpcworCSAqIHNldC4gSG93ZXZlciBmb3Igc3lzdGVtcyBlbmFibGluZyBQQ0kgd3JpdGUgYW5kIGludmFsaWRhdGUsCisJICogRE1BIHdyaXRlcyBtdXN0IGJlIHNldCB0byB0aGUgTDEgY2FjaGUgbGluZSBzaXplIHRvIGdldAorCSAqIG9wdGltYWwgcGVyZm9ybWFuY2UuCisJICoKKwkgKiBUaGUgZGVmYXVsdCBpcyBub3cgdG8gdHVybiB0aGUgUENJIHdyaXRlIGFuZCBpbnZhbGlkYXRlIG9mZgorCSAqIC0gdGhhdCBpcyB3aGF0IEFsdGVvbiBkb2VzIGZvciBOVC4KKwkgKi8KKwl0bXAgPSBSRUFEX0NNRF9NRU0gfCBXUklURV9DTURfTUVNOworCWlmIChhcC0+dmVyc2lvbiA+PSAyKSB7CisJCXRtcCB8PSAoTUVNX1JFQURfTVVMVElQTEUgfCAocGNpX3N0YXRlICYgUENJXzY2TUhaKSk7CisJCS8qCisJCSAqIFR1bmluZyBwYXJhbWV0ZXJzIG9ubHkgc3VwcG9ydGVkIGZvciA4IGNhcmRzCisJCSAqLworCQlpZiAoYm9hcmRfaWR4ID09IEJPQVJEX0lEWF9PVkVSRkxPVyB8fAorCQkgICAgZGlzX3BjaV9tZW1faW52YWxbYm9hcmRfaWR4XSkgeworCQkJaWYgKGFwLT5wY2lfY29tbWFuZCAmIFBDSV9DT01NQU5EX0lOVkFMSURBVEUpIHsKKwkJCQlhcC0+cGNpX2NvbW1hbmQgJj0gflBDSV9DT01NQU5EX0lOVkFMSURBVEU7CisJCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELAorCQkJCQkJICAgICAgYXAtPnBjaV9jb21tYW5kKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgIERpc2FibGluZyBQQ0kgbWVtb3J5ICIKKwkJCQkgICAgICAgIndyaXRlIGFuZCBpbnZhbGlkYXRlXG4iKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChhcC0+cGNpX2NvbW1hbmQgJiBQQ0lfQ09NTUFORF9JTlZBTElEQVRFKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIgIFBDSSBtZW1vcnkgd3JpdGUgJiBpbnZhbGlkYXRlICIKKwkJCSAgICAgICAiZW5hYmxlZCBieSBCSU9TLCBlbmFibGluZyBjb3VudGVyIG1lYXN1cmVzXG4iKTsKKworCQkJc3dpdGNoKFNNUF9DQUNIRV9CWVRFUykgeworCQkJY2FzZSAxNjoKKwkJCQl0bXAgfD0gRE1BX1dSSVRFX01BWF8xNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzI6CisJCQkJdG1wIHw9IERNQV9XUklURV9NQVhfMzI7CisJCQkJYnJlYWs7CisJCQljYXNlIDY0OgorCQkJCXRtcCB8PSBETUFfV1JJVEVfTUFYXzY0OworCQkJCWJyZWFrOworCQkJY2FzZSAxMjg6CisJCQkJdG1wIHw9IERNQV9XUklURV9NQVhfMTI4OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgIENhY2hlIGxpbmUgc2l6ZSAlaSBub3QgIgorCQkJCSAgICAgICAic3VwcG9ydGVkLCBQQ0kgd3JpdGUgYW5kIGludmFsaWRhdGUgIgorCQkJCSAgICAgICAiZGlzYWJsZWRcbiIsIFNNUF9DQUNIRV9CWVRFUyk7CisJCQkJYXAtPnBjaV9jb21tYW5kICY9IH5QQ0lfQ09NTUFORF9JTlZBTElEQVRFOworCQkJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwKKwkJCQkJCSAgICAgIGFwLT5wY2lfY29tbWFuZCk7CisJCQl9CisJCX0KKwl9CisKKyNpZmRlZiBfX3NwYXJjX18KKwkvKgorCSAqIE9uIHRoaXMgcGxhdGZvcm0sIHdlIGtub3cgd2hhdCB0aGUgYmVzdCBkbWEgc2V0dGluZ3MKKwkgKiBhcmUuICBXZSB1c2UgNjQtYnl0ZSBtYXhpbXVtIGJ1cnN0cywgYmVjYXVzZSBpZiB3ZQorCSAqIGJ1cnN0IGxhcmdlciB0aGFuIHRoZSBjYWNoZSBsaW5lIHNpemUgKG9yIGV2ZW4gY3Jvc3MKKwkgKiBhIDY0Ynl0ZSBib3VuZGFyeSBpbiBhIHNpbmdsZSBidXJzdCkgdGhlIFVsdHJhU3BhcmMKKwkgKiBQQ0kgY29udHJvbGxlciB3aWxsIGRpc2Nvbm5lY3QgYXQgNjQtYnl0ZSBtdWx0aXBsZXMuCisJICoKKwkgKiBSZWFkLW11bHRpcGxlIHdpbGwgYmUgcHJvcGVybHkgZW5hYmxlZCBhYm92ZSwgYW5kIHdoZW4KKwkgKiBzZXQgd2lsbCBnaXZlIHRoZSBQQ0kgY29udHJvbGxlciBwcm9wZXIgaGludHMgYWJvdXQKKwkgKiBwcmVmZXRjaGluZy4KKwkgKi8KKwl0bXAgJj0gfkRNQV9SRUFEX1dSSVRFX01BU0s7CisJdG1wIHw9IERNQV9SRUFEX01BWF82NDsKKwl0bXAgfD0gRE1BX1dSSVRFX01BWF82NDsKKyNlbmRpZgorI2lmZGVmIF9fYWxwaGFfXworCXRtcCAmPSB+RE1BX1JFQURfV1JJVEVfTUFTSzsKKwl0bXAgfD0gRE1BX1JFQURfTUFYXzEyODsKKwkvKgorCSAqIEFsbCB0aGUgZG9jcyBzYXkgTVVTVCBOT1QuIFdlbGwsIEkgZGlkLgorCSAqIE5vdGhpbmcgdGVycmlibGUgaGFwcGVucywgaWYgd2UgbG9hZCB3cm9uZyBzaXplLgorCSAqIEJpdCB3Jmkgc3RpbGwgd29ya3MgYmV0dGVyIQorCSAqLworCXRtcCB8PSBETUFfV1JJVEVfTUFYXzEyODsKKyNlbmRpZgorCXdyaXRlbCh0bXAsICZyZWdzLT5QY2lTdGF0ZSk7CisKKyNpZiAwCisJLyoKKwkgKiBUaGUgSG9zdCBQQ0kgYnVzIGNvbnRyb2xsZXIgZHJpdmVyIGhhcyB0byBzZXQgRkJCLgorCSAqIElmIGFsbCBkZXZpY2VzIG9uIHRoYXQgUENJIGJ1cyBzdXBwb3J0IEZCQiwgdGhlbiB0aGUgY29udHJvbGxlcgorCSAqIGNhbiBlbmFibGUgRkJCIHN1cHBvcnQgaW4gdGhlIEhvc3QgUENJIEJ1cyBjb250cm9sbGVyIChvciBvbgorCSAqIHRoZSBQQ0ktUENJIGJyaWRnZSBpZiB0aGF0IGFwcGxpZXMpLgorCSAqIC1nZ2cKKwkgKi8KKwkvKgorCSAqIEkgaGF2ZSByZWNlaXZlZCByZXBvcnRzIGZyb20gcGVvcGxlIGhhdmluZyBwcm9ibGVtcyB3aGVuIHRoaXMKKwkgKiBiaXQgaXMgZW5hYmxlZC4KKwkgKi8KKwlpZiAoIShhcC0+cGNpX2NvbW1hbmQgJiBQQ0lfQ09NTUFORF9GQVNUX0JBQ0spKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiAgRW5hYmxpbmcgUENJIEZhc3QgQmFjayB0byBCYWNrXG4iKTsKKwkJYXAtPnBjaV9jb21tYW5kIHw9IFBDSV9DT01NQU5EX0ZBU1RfQkFDSzsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBhcC0+cGNpX2NvbW1hbmQpOworCX0KKyNlbmRpZgorCQkKKwkvKgorCSAqIENvbmZpZ3VyZSBETUEgYXR0cmlidXRlcy4KKwkgKi8KKwlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworCQlhcC0+cGNpX3VzaW5nX2RhYyA9IDE7CisJfSBlbHNlIGlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmVUxMKSkgeworCQlhcC0+cGNpX3VzaW5nX2RhYyA9IDA7CisJfSBlbHNlIHsKKwkJZWNvZGUgPSAtRU5PREVWOworCQlnb3RvIGluaXRfZXJyb3I7CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBnZW5lcmljIGluZm8gYmxvY2sgYW5kIHRoZSBjb21tYW5kK2V2ZW50IHJpbmdzCisJICogYW5kIHRoZSBjb250cm9sIGJsb2NrcyBmb3IgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHJpbmdzCisJICogYXMgdGhleSBuZWVkIHRvIGJlIHNldHVwIG9uY2UgYW5kIGZvciBhbGwuCisJICovCisJaWYgKCEoaW5mbyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFwLT5wZGV2LCBzaXplb2Yoc3RydWN0IGFjZV9pbmZvKSwKKwkJCQkJICAmYXAtPmluZm9fZG1hKSkpIHsKKwkJZWNvZGUgPSAtRUFHQUlOOworCQlnb3RvIGluaXRfZXJyb3I7CisJfQorCWFwLT5pbmZvID0gaW5mbzsKKworCS8qCisJICogR2V0IHRoZSBtZW1vcnkgZm9yIHRoZSBza2IgcmluZ3MuCisJICovCisJaWYgKCEoYXAtPnNrYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY2Vfc2tiKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVjb2RlID0gLUVBR0FJTjsKKwkJZ290byBpbml0X2Vycm9yOworCX0KKworCWVjb2RlID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBhY2VfaW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCSAgICBEUlZfTkFNRSwgZGV2KTsKKwlpZiAoZWNvZGUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlcXVlc3RlZCBJUlEgJWQgaXMgYnVzeVxuIiwKKwkJICAgICAgIERSVl9OQU1FLCBwZGV2LT5pcnEpOworCQlnb3RvIGluaXRfZXJyb3I7CisJfSBlbHNlCisJCWRldi0+aXJxID0gcGRldi0+aXJxOworCisjaWZkZWYgSU5ERVhfREVCVUcKKwlzcGluX2xvY2tfaW5pdCgmYXAtPmRlYnVnX2xvY2spOworCWFwLT5sYXN0X3R4ID0gQUNFX1RYX1JJTkdfRU5UUklFUyhhcCkgLSAxOworCWFwLT5sYXN0X3N0ZF9yeCA9IDA7CisJYXAtPmxhc3RfbWluaV9yeCA9IDA7CisjZW5kaWYKKworCW1lbXNldChhcC0+aW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhY2VfaW5mbykpOworCW1lbXNldChhcC0+c2tiLCAwLCBzaXplb2Yoc3RydWN0IGFjZV9za2IpKTsKKworCWFjZV9sb2FkX2Zpcm13YXJlKGRldik7CisJYXAtPmZ3X3J1bm5pbmcgPSAwOworCisJdG1wX3B0ciA9IGFwLT5pbmZvX2RtYTsKKwl3cml0ZWwodG1wX3B0ciA+PiAzMiwgJnJlZ3MtPkluZm9QdHJIaSk7CisJd3JpdGVsKHRtcF9wdHIgJiAweGZmZmZmZmZmLCAmcmVncy0+SW5mb1B0ckxvKTsKKworCW1lbXNldChhcC0+ZXZ0X3JpbmcsIDAsIEVWVF9SSU5HX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IGV2ZW50KSk7CisKKwlzZXRfYWNlYWRkcigmaW5mby0+ZXZ0X2N0cmwucm5ncHRyLCBhcC0+ZXZ0X3JpbmdfZG1hKTsKKwlpbmZvLT5ldnRfY3RybC5mbGFncyA9IDA7CisKKwkqKGFwLT5ldnRfcHJkKSA9IDA7CisJd21iKCk7CisJc2V0X2FjZWFkZHIoJmluZm8tPmV2dF9wcmRfcHRyLCBhcC0+ZXZ0X3ByZF9kbWEpOworCXdyaXRlbCgwLCAmcmVncy0+RXZ0Q3NtKTsKKworCXNldF9hY2VhZGRyKCZpbmZvLT5jbWRfY3RybC5ybmdwdHIsIDB4MTAwKTsKKwlpbmZvLT5jbWRfY3RybC5mbGFncyA9IDA7CisJaW5mby0+Y21kX2N0cmwubWF4X2xlbiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ01EX1JJTkdfRU5UUklFUzsgaSsrKQorCQl3cml0ZWwoMCwgJnJlZ3MtPkNtZFJuZ1tpXSk7CisKKwl3cml0ZWwoMCwgJnJlZ3MtPkNtZFByZCk7CisJd3JpdGVsKDAsICZyZWdzLT5DbWRDc20pOworCisJdG1wX3B0ciA9IGFwLT5pbmZvX2RtYTsKKwl0bXBfcHRyICs9ICh1bnNpZ25lZCBsb25nKSAmKCgoc3RydWN0IGFjZV9pbmZvICopMCktPnMuc3RhdHMpOworCXNldF9hY2VhZGRyKCZpbmZvLT5zdGF0czJfcHRyLCAoZG1hX2FkZHJfdCkgdG1wX3B0cik7CisKKwlzZXRfYWNlYWRkcigmaW5mby0+cnhfc3RkX2N0cmwucm5ncHRyLCBhcC0+cnhfcmluZ19iYXNlX2RtYSk7CisJaW5mby0+cnhfc3RkX2N0cmwubWF4X2xlbiA9IEFDRV9TVERfQlVGU0laRTsKKwlpbmZvLT5yeF9zdGRfY3RybC5mbGFncyA9CisJICBSQ0JfRkxHX1RDUF9VRFBfU1VNIHwgUkNCX0ZMR19OT19QU0VVRE9fSERSIHwgQUNFX1JDQl9WTEFOX0ZMQUc7CisKKwltZW1zZXQoYXAtPnJ4X3N0ZF9yaW5nLCAwLAorCSAgICAgICBSWF9TVERfUklOR19FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfU1REX1JJTkdfRU5UUklFUzsgaSsrKQorCQlhcC0+cnhfc3RkX3JpbmdbaV0uZmxhZ3MgPSBCRF9GTEdfVENQX1VEUF9TVU07CisKKwlhcC0+cnhfc3RkX3NrYnByZCA9IDA7CisJYXRvbWljX3NldCgmYXAtPmN1cl9yeF9idWZzLCAwKTsKKworCXNldF9hY2VhZGRyKCZpbmZvLT5yeF9qdW1ib19jdHJsLnJuZ3B0ciwKKwkJICAgIChhcC0+cnhfcmluZ19iYXNlX2RtYSArCisJCSAgICAgKHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKiBSWF9TVERfUklOR19FTlRSSUVTKSkpOworCWluZm8tPnJ4X2p1bWJvX2N0cmwubWF4X2xlbiA9IDA7CisJaW5mby0+cnhfanVtYm9fY3RybC5mbGFncyA9CisJICBSQ0JfRkxHX1RDUF9VRFBfU1VNIHwgUkNCX0ZMR19OT19QU0VVRE9fSERSIHwgQUNFX1JDQl9WTEFOX0ZMQUc7CisKKwltZW1zZXQoYXAtPnJ4X2p1bWJvX3JpbmcsIDAsCisJICAgICAgIFJYX0pVTUJPX1JJTkdfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykpOworCisJZm9yIChpID0gMDsgaSA8IFJYX0pVTUJPX1JJTkdfRU5UUklFUzsgaSsrKQorCQlhcC0+cnhfanVtYm9fcmluZ1tpXS5mbGFncyA9IEJEX0ZMR19UQ1BfVURQX1NVTSB8IEJEX0ZMR19KVU1CTzsKKworCWFwLT5yeF9qdW1ib19za2JwcmQgPSAwOworCWF0b21pY19zZXQoJmFwLT5jdXJfanVtYm9fYnVmcywgMCk7CisKKwltZW1zZXQoYXAtPnJ4X21pbmlfcmluZywgMCwKKwkgICAgICAgUlhfTUlOSV9SSU5HX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpKTsKKworCWlmIChhcC0+dmVyc2lvbiA+PSAyKSB7CisJCXNldF9hY2VhZGRyKCZpbmZvLT5yeF9taW5pX2N0cmwucm5ncHRyLAorCQkJICAgIChhcC0+cnhfcmluZ19iYXNlX2RtYSArCisJCQkgICAgIChzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpICoKKwkJCSAgICAgIChSWF9TVERfUklOR19FTlRSSUVTICsKKwkJCSAgICAgICBSWF9KVU1CT19SSU5HX0VOVFJJRVMpKSkpOworCQlpbmZvLT5yeF9taW5pX2N0cmwubWF4X2xlbiA9IEFDRV9NSU5JX1NJWkU7CisJCWluZm8tPnJ4X21pbmlfY3RybC5mbGFncyA9IAorCQkgIFJDQl9GTEdfVENQX1VEUF9TVU18UkNCX0ZMR19OT19QU0VVRE9fSERSfEFDRV9SQ0JfVkxBTl9GTEFHOworCisJCWZvciAoaSA9IDA7IGkgPCBSWF9NSU5JX1JJTkdfRU5UUklFUzsgaSsrKQorCQkJYXAtPnJ4X21pbmlfcmluZ1tpXS5mbGFncyA9CisJCQkJQkRfRkxHX1RDUF9VRFBfU1VNIHwgQkRfRkxHX01JTkk7CisJfSBlbHNlIHsKKwkJc2V0X2FjZWFkZHIoJmluZm8tPnJ4X21pbmlfY3RybC5ybmdwdHIsIDApOworCQlpbmZvLT5yeF9taW5pX2N0cmwuZmxhZ3MgPSBSQ0JfRkxHX1JOR19ESVNBQkxFOworCQlpbmZvLT5yeF9taW5pX2N0cmwubWF4X2xlbiA9IDA7CisJfQorCisJYXAtPnJ4X21pbmlfc2ticHJkID0gMDsKKwlhdG9taWNfc2V0KCZhcC0+Y3VyX21pbmlfYnVmcywgMCk7CisKKwlzZXRfYWNlYWRkcigmaW5mby0+cnhfcmV0dXJuX2N0cmwucm5ncHRyLAorCQkgICAgKGFwLT5yeF9yaW5nX2Jhc2VfZG1hICsKKwkJICAgICAoc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSAqCisJCSAgICAgIChSWF9TVERfUklOR19FTlRSSUVTICsKKwkJICAgICAgIFJYX0pVTUJPX1JJTkdfRU5UUklFUyArCisJCSAgICAgICBSWF9NSU5JX1JJTkdfRU5UUklFUykpKSk7CisJaW5mby0+cnhfcmV0dXJuX2N0cmwuZmxhZ3MgPSAwOworCWluZm8tPnJ4X3JldHVybl9jdHJsLm1heF9sZW4gPSBSWF9SRVRVUk5fUklOR19FTlRSSUVTOworCisJbWVtc2V0KGFwLT5yeF9yZXR1cm5fcmluZywgMCwKKwkgICAgICAgUlhfUkVUVVJOX1JJTkdfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykpOworCisJc2V0X2FjZWFkZHIoJmluZm8tPnJ4X3JldF9wcmRfcHRyLCBhcC0+cnhfcmV0X3ByZF9kbWEpOworCSooYXAtPnJ4X3JldF9wcmQpID0gMDsKKworCXdyaXRlbChUWF9SSU5HX0JBU0UsICZyZWdzLT5XaW5CYXNlKTsKKworCWlmIChBQ0VfSVNfVElHT05fSShhcCkpIHsKKwkJYXAtPnR4X3JpbmcgPSAoc3RydWN0IHR4X2Rlc2MgKikgcmVncy0+V2luZG93OworCQlmb3IgKGkgPSAwOyBpIDwgKFRJR09OX0lfVFhfUklOR19FTlRSSUVTIAorCQkJCSAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykpIC8gc2l6ZW9mKHUzMik7IGkrKykKKwkJCXdyaXRlbCgwLCAodm9pZCBfX2lvbWVtICopYXAtPnR4X3JpbmcgICsgaSAqIDQpOworCisJCXNldF9hY2VhZGRyKCZpbmZvLT50eF9jdHJsLnJuZ3B0ciwgVFhfUklOR19CQVNFKTsKKwl9IGVsc2UgeworCQltZW1zZXQoYXAtPnR4X3JpbmcsIDAsCisJCSAgICAgICBNQVhfVFhfUklOR19FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSk7CisKKwkJc2V0X2FjZWFkZHIoJmluZm8tPnR4X2N0cmwucm5ncHRyLCBhcC0+dHhfcmluZ19kbWEpOworCX0KKworCWluZm8tPnR4X2N0cmwubWF4X2xlbiA9IEFDRV9UWF9SSU5HX0VOVFJJRVMoYXApOworCXRtcCA9IFJDQl9GTEdfVENQX1VEUF9TVU0gfCBSQ0JfRkxHX05PX1BTRVVET19IRFIgfCBBQ0VfUkNCX1ZMQU5fRkxBRzsKKworCS8qCisJICogVGhlIFRpZ29uIEkgZG9lcyBub3QgbGlrZSBoYXZpbmcgdGhlIFRYIHJpbmcgaW4gaG9zdCBtZW1vcnkgOy0oCisJICovCisJaWYgKCFBQ0VfSVNfVElHT05fSShhcCkpCisJCXRtcCB8PSBSQ0JfRkxHX1RYX0hPU1RfUklORzsKKyNpZiBUWF9DT0FMX0lOVFNfT05MWQorCXRtcCB8PSBSQ0JfRkxHX0NPQUxfSU5UX09OTFk7CisjZW5kaWYKKwlpbmZvLT50eF9jdHJsLmZsYWdzID0gdG1wOworCisJc2V0X2FjZWFkZHIoJmluZm8tPnR4X2NzbV9wdHIsIGFwLT50eF9jc21fZG1hKTsKKworCS8qCisJICogUG90ZW50aWFsIGl0ZW0gZm9yIHR1bmluZyBwYXJhbWV0ZXIKKwkgKi8KKyNpZiAwIC8qIE5PICovCisJd3JpdGVsKERNQV9USFJFU0hfMTZXLCAmcmVncy0+RG1hUmVhZENmZyk7CisJd3JpdGVsKERNQV9USFJFU0hfMTZXLCAmcmVncy0+RG1hV3JpdGVDZmcpOworI2Vsc2UKKwl3cml0ZWwoRE1BX1RIUkVTSF84VywgJnJlZ3MtPkRtYVJlYWRDZmcpOworCXdyaXRlbChETUFfVEhSRVNIXzhXLCAmcmVncy0+RG1hV3JpdGVDZmcpOworI2VuZGlmCisKKwl3cml0ZWwoMCwgJnJlZ3MtPk1hc2tJbnQpOworCXdyaXRlbCgxLCAmcmVncy0+SWZJZHgpOworI2lmIDAKKwkvKgorCSAqIE1jS2lubGV5IGJveGVzIGRvIG5vdCBsaWtlIHVzIGZpZGRsaW5nIHdpdGggQXNzaXN0U3RhdGUKKwkgKiB0aGlzIGVhcmx5CisJICovCisJd3JpdGVsKDEsICZyZWdzLT5Bc3Npc3RTdGF0ZSk7CisjZW5kaWYKKworCXdyaXRlbChERUZfU1RBVCwgJnJlZ3MtPlR1bmVTdGF0VGlja3MpOworCXdyaXRlbChERUZfVFJBQ0UsICZyZWdzLT5UdW5lVHJhY2UpOworCisJYWNlX3NldF9yeHR4X3Bhcm1zKGRldiwgMCk7CisKKwlpZiAoYm9hcmRfaWR4ID09IEJPQVJEX0lEWF9PVkVSRkxPVykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbW9yZSB0aGFuICVpIE5JQ3MgZGV0ZWN0ZWQsICIKKwkJICAgICAgICJpZ25vcmluZyBtb2R1bGUgcGFyYW1ldGVycyFcbiIsCisJCSAgICAgICBhcC0+bmFtZSwgQUNFX01BWF9NT0RfUEFSTVMpOworCX0gZWxzZSBpZiAoYm9hcmRfaWR4ID49IDApIHsKKwkJaWYgKHR4X2NvYWxfdGlja1tib2FyZF9pZHhdKQorCQkJd3JpdGVsKHR4X2NvYWxfdGlja1tib2FyZF9pZHhdLAorCQkJICAgICAgICZyZWdzLT5UdW5lVHhDb2FsVGlja3MpOworCQlpZiAobWF4X3R4X2Rlc2NbYm9hcmRfaWR4XSkKKwkJCXdyaXRlbChtYXhfdHhfZGVzY1tib2FyZF9pZHhdLCAmcmVncy0+VHVuZU1heFR4RGVzYyk7CisKKwkJaWYgKHJ4X2NvYWxfdGlja1tib2FyZF9pZHhdKQorCQkJd3JpdGVsKHJ4X2NvYWxfdGlja1tib2FyZF9pZHhdLAorCQkJICAgICAgICZyZWdzLT5UdW5lUnhDb2FsVGlja3MpOworCQlpZiAobWF4X3J4X2Rlc2NbYm9hcmRfaWR4XSkKKwkJCXdyaXRlbChtYXhfcnhfZGVzY1tib2FyZF9pZHhdLCAmcmVncy0+VHVuZU1heFJ4RGVzYyk7CisKKwkJaWYgKHRyYWNlW2JvYXJkX2lkeF0pCisJCQl3cml0ZWwodHJhY2VbYm9hcmRfaWR4XSwgJnJlZ3MtPlR1bmVUcmFjZSk7CisKKwkJaWYgKCh0eF9yYXRpb1tib2FyZF9pZHhdID4gMCkgJiYgKHR4X3JhdGlvW2JvYXJkX2lkeF0gPCA2NCkpCisJCQl3cml0ZWwodHhfcmF0aW9bYm9hcmRfaWR4XSwgJnJlZ3MtPlR4QnVmUmF0KTsKKwl9CisKKwkvKgorCSAqIERlZmF1bHQgbGluayBwYXJhbWV0ZXJzCisJICovCisJdG1wID0gTE5LX0VOQUJMRSB8IExOS19GVUxMX0RVUExFWCB8IExOS18xMDAwTUIgfCBMTktfMTAwTUIgfAorCQlMTktfMTBNQiB8IExOS19SWF9GTE9XX0NUTF9ZIHwgTE5LX05FR19GQ1RMIHwgTE5LX05FR09USUFURTsKKwlpZihhcC0+dmVyc2lvbiA+PSAyKQorCQl0bXAgfD0gTE5LX1RYX0ZMT1dfQ1RMX1k7CisKKwkvKgorCSAqIE92ZXJyaWRlIGxpbmsgZGVmYXVsdCBwYXJhbWV0ZXJzCisJICovCisJaWYgKChib2FyZF9pZHggPj0gMCkgJiYgbGlua1tib2FyZF9pZHhdKSB7CisJCWludCBvcHRpb24gPSBsaW5rW2JvYXJkX2lkeF07CisKKwkJdG1wID0gTE5LX0VOQUJMRTsKKworCQlpZiAob3B0aW9uICYgMHgwMSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNldHRpbmcgaGFsZiBkdXBsZXggbGlua1xuIiwKKwkJCSAgICAgICBhcC0+bmFtZSk7CisJCQl0bXAgJj0gfkxOS19GVUxMX0RVUExFWDsKKwkJfQorCQlpZiAob3B0aW9uICYgMHgwMikKKwkJCXRtcCAmPSB+TE5LX05FR09USUFURTsKKwkJaWYgKG9wdGlvbiAmIDB4MTApCisJCQl0bXAgfD0gTE5LXzEwTUI7CisJCWlmIChvcHRpb24gJiAweDIwKQorCQkJdG1wIHw9IExOS18xMDBNQjsKKwkJaWYgKG9wdGlvbiAmIDB4NDApCisJCQl0bXAgfD0gTE5LXzEwMDBNQjsKKwkJaWYgKChvcHRpb24gJiAweDcwKSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gbWVkaWEgc3BlZWQgc3BlY2lmaWVkLCAiCisJCQkgICAgICAgImZvcmNpbmcgYXV0byBuZWdvdGlhdGlvblxuIiwgYXAtPm5hbWUpOworCQkJdG1wIHw9IExOS19ORUdPVElBVEUgfCBMTktfMTAwME1CIHwKKwkJCQlMTktfMTAwTUIgfCBMTktfMTBNQjsKKwkJfQorCQlpZiAoKG9wdGlvbiAmIDB4MTAwKSA9PSAwKQorCQkJdG1wIHw9IExOS19ORUdfRkNUTDsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERpc2FibGluZyBmbG93IGNvbnRyb2wgIgorCQkJICAgICAgICJuZWdvdGlhdGlvblxuIiwgYXAtPm5hbWUpOworCQlpZiAob3B0aW9uICYgMHgyMDApCisJCQl0bXAgfD0gTE5LX1JYX0ZMT1dfQ1RMX1k7CisJCWlmICgob3B0aW9uICYgMHg0MDApICYmIChhcC0+dmVyc2lvbiA+PSAyKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVuYWJsaW5nIFRYIGZsb3cgY29udHJvbFxuIiwKKwkJCSAgICAgICBhcC0+bmFtZSk7CisJCQl0bXAgfD0gTE5LX1RYX0ZMT1dfQ1RMX1k7CisJCX0KKwl9CisKKwlhcC0+bGluayA9IHRtcDsKKwl3cml0ZWwodG1wLCAmcmVncy0+VHVuZUxpbmspOworCWlmIChhcC0+dmVyc2lvbiA+PSAyKQorCQl3cml0ZWwodG1wLCAmcmVncy0+VHVuZUZhc3RMaW5rKTsKKworCWlmIChBQ0VfSVNfVElHT05fSShhcCkpCisJCXdyaXRlbCh0aWdvbkZ3U3RhcnRBZGRyLCAmcmVncy0+UGMpOworCWlmIChhcC0+dmVyc2lvbiA9PSAyKQorCQl3cml0ZWwodGlnb24yRndTdGFydEFkZHIsICZyZWdzLT5QYyk7CisKKwl3cml0ZWwoMCwgJnJlZ3MtPk1iMExvKTsKKworCS8qCisJICogU2V0IHR4X2NzbSBiZWZvcmUgd2Ugc3RhcnQgcmVjZWl2aW5nIGludGVycnVwdHMsIG90aGVyd2lzZQorCSAqIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBtaWdodCB0aGluayBpdCBpcyBzdXBwb3NlZCB0byBwcm9jZXNzCisJICogdHggaW50cyBiZWZvcmUgd2UgYXJlIHVwIGFuZCBydW5uaW5nLCB3aGljaCBtYXkgY2F1c2UgYSBudWxsCisJICogcG9pbnRlciBhY2Nlc3MgaW4gdGhlIGludCBoYW5kbGVyLgorCSAqLworCWFwLT5jdXJfcnggPSAwOworCWFwLT50eF9wcmQgPSAqKGFwLT50eF9jc20pID0gYXAtPnR4X3JldF9jc20gPSAwOworCisJd21iKCk7CisJYWNlX3NldF90eHByZChyZWdzLCBhcCwgMCk7CisJd3JpdGVsKDAsICZyZWdzLT5SeFJldENzbSk7CisKKwkvKgorCSAqIFplcm8gdGhlIHN0YXRzIGJlZm9yZSBzdGFydGluZyB0aGUgaW50ZXJmYWNlCisJICovCisJbWVtc2V0KCZhcC0+c3RhdHMsIDAsIHNpemVvZihhcC0+c3RhdHMpKTsKKworICAgICAgIC8qCisJKiBFbmFibGUgRE1BIGVuZ2luZSBub3cuCisJKiBJZiB3ZSBkbyB0aGlzIHNvb25lciwgTWNraW5sZXkgYm94IHB1a2VzLgorCSogSSBhc3N1bWUgaXQncyBiZWNhdXNlIFRpZ29uIElJIERNQSBlbmdpbmUgd2FudHMgdG8gY2hlY2sKKwkqICpzb21ldGhpbmcqIGV2ZW4gYmVmb3JlIHRoZSBDUFUgaXMgc3RhcnRlZC4KKwkqLworICAgICAgIHdyaXRlbCgxLCAmcmVncy0+QXNzaXN0U3RhdGUpOyAgLyogZW5hYmxlIERNQSAqLworCisJLyoKKwkgKiBTdGFydCB0aGUgTklDIENQVQorCSAqLworCXdyaXRlbChyZWFkbCgmcmVncy0+Q3B1Q3RybCkgJiB+KENQVV9IQUxUfENQVV9UUkFDRSksICZyZWdzLT5DcHVDdHJsKTsKKwlyZWFkbCgmcmVncy0+Q3B1Q3RybCk7CisKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBmaXJtd2FyZSB0byBzcGluIHVwIC0gbWF4IDMgc2Vjb25kcy4KKwkgKi8KKwlteWppZiA9IGppZmZpZXMgKyAzICogSFo7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIG15amlmKSAmJiAhYXAtPmZ3X3J1bm5pbmcpCisJCWNwdV9yZWxheCgpOworCisJaWYgKCFhcC0+ZndfcnVubmluZykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGaXJtd2FyZSBOT1QgcnVubmluZyFcbiIsIGFwLT5uYW1lKTsKKworCQlhY2VfZHVtcF90cmFjZShhcCk7CisJCXdyaXRlbChyZWFkbCgmcmVncy0+Q3B1Q3RybCkgfCBDUFVfSEFMVCwgJnJlZ3MtPkNwdUN0cmwpOworCQlyZWFkbCgmcmVncy0+Q3B1Q3RybCk7CisKKwkJLyogYW1hbkBzZ2kuY29tIC0gYWNjb3VudCBmb3IgYmFkbHkgYmVoYXZpbmcgZmlybXdhcmUvTklDOgorCQkgKiAtIGhhdmUgb2JzZXJ2ZWQgdGhhdCB0aGUgTklDIG1heSBjb250aW51ZSB0byBnZW5lcmF0ZQorCQkgKiAgIGludGVycnVwdHMgZm9yIHNvbWUgcmVhc29uOyBhdHRlbXB0IHRvIHN0b3AgaXQgLSBoYWx0CisJCSAqICAgc2Vjb25kIENQVSBmb3IgVGlnb24gSUkgY2FyZHMsIGFuZCBhbHNvIGNsZWFyIE1iMAorCQkgKiAtIGlmIHdlJ3JlIGEgbW9kdWxlLCB3ZSdsbCBmYWlsIHRvIGxvYWQgaWYgdGhpcyB3YXMKKwkJICogICB0aGUgb25seSBHYkUgY2FyZCBpbiB0aGUgc3lzdGVtID0+IGlmIHRoZSBrZXJuZWwgZG9lcworCQkgKiAgIHNlZSBhbiBpbnRlcnJ1cHQgZnJvbSB0aGUgTklDLCBjb2RlIHRvIGhhbmRsZSBpdCBpcworCQkgKiAgIGdvbmUgYW5kIE9PcHMhIC0gc28gZnJlZV9pcnEgYWxzbworCQkgKi8KKwkJaWYgKGFwLT52ZXJzaW9uID49IDIpCisJCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkNwdUJDdHJsKSB8IENQVV9IQUxULAorCQkJICAgICAgICZyZWdzLT5DcHVCQ3RybCk7CisJCXdyaXRlbCgwLCAmcmVncy0+TWIwTG8pOworCQlyZWFkbCgmcmVncy0+TWIwTG8pOworCisJCWVjb2RlID0gLUVCVVNZOworCQlnb3RvIGluaXRfZXJyb3I7CisJfQorCisJLyoKKwkgKiBXZSBsb2FkIHRoZSByaW5nIGhlcmUgYXMgdGhlcmUgc2VlbSB0byBiZSBubyB3YXkgdG8gdGVsbCB0aGUKKwkgKiBmaXJtd2FyZSB0byB3aXBlIHRoZSByaW5nIHdpdGhvdXQgcmUtaW5pdGlhbGl6aW5nIGl0LgorCSAqLworCWlmICghdGVzdF9hbmRfc2V0X2JpdCgwLCAmYXAtPnN0ZF9yZWZpbGxfYnVzeSkpCisJCWFjZV9sb2FkX3N0ZF9yeF9yaW5nKGFwLCBSWF9SSU5HX1NJWkUpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogU29tZW9uZSBpcyBidXN5IHJlZmlsbGluZyB0aGUgUlggcmluZ1xuIiwKKwkJICAgICAgIGFwLT5uYW1lKTsKKwlpZiAoYXAtPnZlcnNpb24gPj0gMikgeworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJmFwLT5taW5pX3JlZmlsbF9idXN5KSkKKwkJCWFjZV9sb2FkX21pbmlfcnhfcmluZyhhcCwgUlhfTUlOSV9TSVpFKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogU29tZW9uZSBpcyBidXN5IHJlZmlsbGluZyAiCisJCQkgICAgICAgInRoZSBSWCBtaW5pIHJpbmdcbiIsIGFwLT5uYW1lKTsKKwl9CisJcmV0dXJuIDA7CisKKyBpbml0X2Vycm9yOgorCWFjZV9pbml0X2NsZWFudXAoZGV2KTsKKwlyZXR1cm4gZWNvZGU7Cit9CisKKworc3RhdGljIHZvaWQgYWNlX3NldF9yeHR4X3Bhcm1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBqdW1ibykKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCWludCBib2FyZF9pZHggPSBhcC0+Ym9hcmRfaWR4OworCisJaWYgKGJvYXJkX2lkeCA+PSAwKSB7CisJCWlmICghanVtYm8pIHsKKwkJCWlmICghdHhfY29hbF90aWNrW2JvYXJkX2lkeF0pCisJCQkJd3JpdGVsKERFRl9UWF9DT0FMLCAmcmVncy0+VHVuZVR4Q29hbFRpY2tzKTsKKwkJCWlmICghbWF4X3R4X2Rlc2NbYm9hcmRfaWR4XSkKKwkJCQl3cml0ZWwoREVGX1RYX01BWF9ERVNDLCAmcmVncy0+VHVuZU1heFR4RGVzYyk7CisJCQlpZiAoIXJ4X2NvYWxfdGlja1tib2FyZF9pZHhdKQorCQkJCXdyaXRlbChERUZfUlhfQ09BTCwgJnJlZ3MtPlR1bmVSeENvYWxUaWNrcyk7CisJCQlpZiAoIW1heF9yeF9kZXNjW2JvYXJkX2lkeF0pCisJCQkJd3JpdGVsKERFRl9SWF9NQVhfREVTQywgJnJlZ3MtPlR1bmVNYXhSeERlc2MpOworCQkJaWYgKCF0eF9yYXRpb1tib2FyZF9pZHhdKQorCQkJCXdyaXRlbChERUZfVFhfUkFUSU8sICZyZWdzLT5UeEJ1ZlJhdCk7CisJCX0gZWxzZSB7CisJCQlpZiAoIXR4X2NvYWxfdGlja1tib2FyZF9pZHhdKQorCQkJCXdyaXRlbChERUZfSlVNQk9fVFhfQ09BTCwKKwkJCQkgICAgICAgJnJlZ3MtPlR1bmVUeENvYWxUaWNrcyk7CisJCQlpZiAoIW1heF90eF9kZXNjW2JvYXJkX2lkeF0pCisJCQkJd3JpdGVsKERFRl9KVU1CT19UWF9NQVhfREVTQywKKwkJCQkgICAgICAgJnJlZ3MtPlR1bmVNYXhUeERlc2MpOworCQkJaWYgKCFyeF9jb2FsX3RpY2tbYm9hcmRfaWR4XSkKKwkJCQl3cml0ZWwoREVGX0pVTUJPX1JYX0NPQUwsCisJCQkJICAgICAgICZyZWdzLT5UdW5lUnhDb2FsVGlja3MpOworCQkJaWYgKCFtYXhfcnhfZGVzY1tib2FyZF9pZHhdKQorCQkJCXdyaXRlbChERUZfSlVNQk9fUlhfTUFYX0RFU0MsCisJCQkJICAgICAgICZyZWdzLT5UdW5lTWF4UnhEZXNjKTsKKwkJCWlmICghdHhfcmF0aW9bYm9hcmRfaWR4XSkKKwkJCQl3cml0ZWwoREVGX0pVTUJPX1RYX1JBVElPLCAmcmVncy0+VHhCdWZSYXQpOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGFjZV93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCisJLyoKKwkgKiBXZSBoYXZlbid0IHJlY2VpdmVkIGEgc3RhdHMgdXBkYXRlIGV2ZW50IGZvciBtb3JlIHRoYW4gMi41CisJICogc2Vjb25kcyBhbmQgdGhlcmUgaXMgZGF0YSBpbiB0aGUgdHJhbnNtaXQgcXVldWUsIHRodXMgd2UKKwkgKiBhc3VtZSB0aGUgY2FyZCBpcyBzdHVjay4KKwkgKi8KKwlpZiAoKmFwLT50eF9jc20gIT0gYXAtPnR4X3JldF9jc20pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0dGVyIGlzIHN0dWNrLCAlMDh4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCAodW5zaWduZWQgaW50KXJlYWRsKCZyZWdzLT5Ib3N0Q3RybCkpOworCQkvKiBUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIGllZWUgZmxvdyBjb250cm9sLiAqLworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogQlVHLi4uIHRyYW5zbWl0dGVyIGRpZWQuIEtpY2tpbmcgaXQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNpZiAwCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyNlbmRpZgorCX0KK30KKworCitzdGF0aWMgdm9pZCBhY2VfdGFza2xldCh1bnNpZ25lZCBsb25nIGRldikKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2KTsKKwlpbnQgY3VyX3NpemU7CisKKwljdXJfc2l6ZSA9IGF0b21pY19yZWFkKCZhcC0+Y3VyX3J4X2J1ZnMpOworCWlmICgoY3VyX3NpemUgPCBSWF9MT1dfU1REX1RIUkVTKSAmJgorCSAgICAhdGVzdF9hbmRfc2V0X2JpdCgwLCAmYXAtPnN0ZF9yZWZpbGxfYnVzeSkpIHsKKyNpZmRlZiBERUJVRworCQlwcmludGsoInJlZmlsbGluZyBidWZmZXJzIChjdXJyZW50ICVpKVxuIiwgY3VyX3NpemUpOworI2VuZGlmCisJCWFjZV9sb2FkX3N0ZF9yeF9yaW5nKGFwLCBSWF9SSU5HX1NJWkUgLSBjdXJfc2l6ZSk7CisJfQorCisJaWYgKGFwLT52ZXJzaW9uID49IDIpIHsKKwkJY3VyX3NpemUgPSBhdG9taWNfcmVhZCgmYXAtPmN1cl9taW5pX2J1ZnMpOworCQlpZiAoKGN1cl9zaXplIDwgUlhfTE9XX01JTklfVEhSRVMpICYmCisJCSAgICAhdGVzdF9hbmRfc2V0X2JpdCgwLCAmYXAtPm1pbmlfcmVmaWxsX2J1c3kpKSB7CisjaWZkZWYgREVCVUcKKwkJCXByaW50aygicmVmaWxsaW5nIG1pbmkgYnVmZmVycyAoY3VycmVudCAlaSlcbiIsCisJCQkgICAgICAgY3VyX3NpemUpOworI2VuZGlmCisJCQlhY2VfbG9hZF9taW5pX3J4X3JpbmcoYXAsIFJYX01JTklfU0laRSAtIGN1cl9zaXplKTsKKwkJfQorCX0KKworCWN1cl9zaXplID0gYXRvbWljX3JlYWQoJmFwLT5jdXJfanVtYm9fYnVmcyk7CisJaWYgKGFwLT5qdW1ibyAmJiAoY3VyX3NpemUgPCBSWF9MT1dfSlVNQk9fVEhSRVMpICYmCisJICAgICF0ZXN0X2FuZF9zZXRfYml0KDAsICZhcC0+anVtYm9fcmVmaWxsX2J1c3kpKSB7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJyZWZpbGxpbmcganVtYm8gYnVmZmVycyAoY3VycmVudCAlaSlcbiIsIGN1cl9zaXplKTsKKyNlbmRpZgorCQlhY2VfbG9hZF9qdW1ib19yeF9yaW5nKGFwLCBSWF9KVU1CT19TSVpFIC0gY3VyX3NpemUpOworCX0KKwlhcC0+dGFza2xldF9wZW5kaW5nID0gMDsKK30KKworCisvKgorICogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIE5JQydzIHRyYWNlIGJ1ZmZlciB0byBrZXJuZWwgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCBhY2VfZHVtcF90cmFjZShzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwKQoreworI2lmIDAKKwlpZiAoIWFwLT50cmFjZV9idWYpCisJCWlmICghKGFwLT50cmFjZV9idWYgPSBrbWFsbG9jKEFDRV9UUkFDRV9TSVpFLCBHRlBfS0VSTkVMKSkpCisJCSAgICByZXR1cm47CisjZW5kaWYKK30KKworCisvKgorICogTG9hZCB0aGUgc3RhbmRhcmQgcnggcmluZy4KKyAqCisgKiBMb2FkaW5nIHJpbmdzIGlzIHNhZmUgd2l0aG91dCBob2xkaW5nIHRoZSBzcGluIGxvY2sgc2luY2UgdGhpcyBpcworICogZG9uZSBvbmx5IGJlZm9yZSB0aGUgZGV2aWNlIGlzIGVuYWJsZWQsIHRodXMgbm8gaW50ZXJydXB0cyBhcmUKKyAqIGdlbmVyYXRlZCBhbmQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyL3Rhc2tsZXQgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgYWNlX2xvYWRfc3RkX3J4X3Jpbmcoc3RydWN0IGFjZV9wcml2YXRlICphcCwgaW50IG5yX2J1ZnMpCit7CisJc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MgPSBhcC0+cmVnczsKKwlzaG9ydCBpLCBpZHg7CisJCisKKwlwcmVmZXRjaHcoJmFwLT5jdXJfcnhfYnVmcyk7CisKKwlpZHggPSBhcC0+cnhfc3RkX3NrYnByZDsKKworCWZvciAoaSA9IDA7IGkgPCBucl9idWZzOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJc3RydWN0IHJ4X2Rlc2MgKnJkOworCQlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwkJc2tiID0gYWxsb2Nfc2tiKEFDRV9TVERfQlVGU0laRSArIE5FVF9JUF9BTElHTiwgR0ZQX0FUT01JQyk7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisKKwkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCQltYXBwaW5nID0gcGNpX21hcF9wYWdlKGFwLT5wZGV2LCB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkgICAgICAgb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkgICAgICAgQUNFX1NURF9CVUZTSVpFLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlhcC0+c2tiLT5yeF9zdGRfc2tidWZmW2lkeF0uc2tiID0gc2tiOworCQlwY2lfdW5tYXBfYWRkcl9zZXQoJmFwLT5za2ItPnJ4X3N0ZF9za2J1ZmZbaWR4XSwKKwkJCQkgICBtYXBwaW5nLCBtYXBwaW5nKTsKKworCQlyZCA9ICZhcC0+cnhfc3RkX3JpbmdbaWR4XTsKKwkJc2V0X2FjZWFkZHIoJnJkLT5hZGRyLCBtYXBwaW5nKTsKKwkJcmQtPnNpemUgPSBBQ0VfU1REX0JVRlNJWkU7CisJCXJkLT5pZHggPSBpZHg7CisJCWlkeCA9IChpZHggKyAxKSAlIFJYX1NURF9SSU5HX0VOVFJJRVM7CisJfQorCisJaWYgKCFpKQorCQlnb3RvIGVycm9yX291dDsKKworCWF0b21pY19hZGQoaSwgJmFwLT5jdXJfcnhfYnVmcyk7CisJYXAtPnJ4X3N0ZF9za2JwcmQgPSBpZHg7CisKKwlpZiAoQUNFX0lTX1RJR09OX0koYXApKSB7CisJCXN0cnVjdCBjbWQgY21kOworCQljbWQuZXZ0ID0gQ19TRVRfUlhfUFJEX0lEWDsKKwkJY21kLmNvZGUgPSAwOworCQljbWQuaWR4ID0gYXAtPnJ4X3N0ZF9za2JwcmQ7CisJCWFjZV9pc3N1ZV9jbWQocmVncywgJmNtZCk7CisJfSBlbHNlIHsKKwkJd3JpdGVsKGlkeCwgJnJlZ3MtPlJ4U3RkUHJkKTsKKwkJd21iKCk7CisJfQorCisgb3V0OgorCWNsZWFyX2JpdCgwLCAmYXAtPnN0ZF9yZWZpbGxfYnVzeSk7CisJcmV0dXJuOworCisgZXJyb3Jfb3V0OgorCXByaW50ayhLRVJOX0lORk8gIk91dCBvZiBtZW1vcnkgd2hlbiBhbGxvY2F0aW5nICIKKwkgICAgICAgInN0YW5kYXJkIHJlY2VpdmUgYnVmZmVyc1xuIik7CisJZ290byBvdXQ7Cit9CisKKworc3RhdGljIHZvaWQgYWNlX2xvYWRfbWluaV9yeF9yaW5nKHN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAsIGludCBucl9idWZzKQoreworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisJc2hvcnQgaSwgaWR4OworCisJcHJlZmV0Y2h3KCZhcC0+Y3VyX21pbmlfYnVmcyk7CisKKwlpZHggPSBhcC0+cnhfbWluaV9za2JwcmQ7CisJZm9yIChpID0gMDsgaSA8IG5yX2J1ZnM7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlzdHJ1Y3QgcnhfZGVzYyAqcmQ7CisJCWRtYV9hZGRyX3QgbWFwcGluZzsKKworCQlza2IgPSBhbGxvY19za2IoQUNFX01JTklfQlVGU0laRSArIE5FVF9JUF9BTElHTiwgR0ZQX0FUT01JQyk7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisKKwkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCQltYXBwaW5nID0gcGNpX21hcF9wYWdlKGFwLT5wZGV2LCB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkgICAgICAgb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkgICAgICAgQUNFX01JTklfQlVGU0laRSwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJYXAtPnNrYi0+cnhfbWluaV9za2J1ZmZbaWR4XS5za2IgPSBza2I7CisJCXBjaV91bm1hcF9hZGRyX3NldCgmYXAtPnNrYi0+cnhfbWluaV9za2J1ZmZbaWR4XSwKKwkJCQkgICBtYXBwaW5nLCBtYXBwaW5nKTsKKworCQlyZCA9ICZhcC0+cnhfbWluaV9yaW5nW2lkeF07CisJCXNldF9hY2VhZGRyKCZyZC0+YWRkciwgbWFwcGluZyk7CisJCXJkLT5zaXplID0gQUNFX01JTklfQlVGU0laRTsKKwkJcmQtPmlkeCA9IGlkeDsKKwkJaWR4ID0gKGlkeCArIDEpICUgUlhfTUlOSV9SSU5HX0VOVFJJRVM7CisJfQorCisJaWYgKCFpKQorCQlnb3RvIGVycm9yX291dDsKKworCWF0b21pY19hZGQoaSwgJmFwLT5jdXJfbWluaV9idWZzKTsKKworCWFwLT5yeF9taW5pX3NrYnByZCA9IGlkeDsKKworCXdyaXRlbChpZHgsICZyZWdzLT5SeE1pbmlQcmQpOworCXdtYigpOworCisgb3V0OgorCWNsZWFyX2JpdCgwLCAmYXAtPm1pbmlfcmVmaWxsX2J1c3kpOworCXJldHVybjsKKyBlcnJvcl9vdXQ6CisJcHJpbnRrKEtFUk5fSU5GTyAiT3V0IG9mIG1lbW9yeSB3aGVuIGFsbG9jYXRpbmcgIgorCSAgICAgICAibWluaSByZWNlaXZlIGJ1ZmZlcnNcbiIpOworCWdvdG8gb3V0OworfQorCisKKy8qCisgKiBMb2FkIHRoZSBqdW1ibyByeCByaW5nLCB0aGlzIG1heSBoYXBwZW4gYXQgYW55IHRpbWUgaWYgdGhlIE1UVQorICogaXMgY2hhbmdlZCB0byBhIHZhbHVlID4gMTUwMC4KKyAqLworc3RhdGljIHZvaWQgYWNlX2xvYWRfanVtYm9fcnhfcmluZyhzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwLCBpbnQgbnJfYnVmcykKK3sKKwlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCXNob3J0IGksIGlkeDsKKworCWlkeCA9IGFwLT5yeF9qdW1ib19za2JwcmQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfYnVmczsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXN0cnVjdCByeF9kZXNjICpyZDsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nOworCisJCXNrYiA9IGFsbG9jX3NrYihBQ0VfSlVNQk9fQlVGU0laRSArIE5FVF9JUF9BTElHTiwgR0ZQX0FUT01JQyk7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisKKwkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCQltYXBwaW5nID0gcGNpX21hcF9wYWdlKGFwLT5wZGV2LCB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkgICAgICAgb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkgICAgICAgQUNFX0pVTUJPX0JVRlNJWkUsCisJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWFwLT5za2ItPnJ4X2p1bWJvX3NrYnVmZltpZHhdLnNrYiA9IHNrYjsKKwkJcGNpX3VubWFwX2FkZHJfc2V0KCZhcC0+c2tiLT5yeF9qdW1ib19za2J1ZmZbaWR4XSwKKwkJCQkgICBtYXBwaW5nLCBtYXBwaW5nKTsKKworCQlyZCA9ICZhcC0+cnhfanVtYm9fcmluZ1tpZHhdOworCQlzZXRfYWNlYWRkcigmcmQtPmFkZHIsIG1hcHBpbmcpOworCQlyZC0+c2l6ZSA9IEFDRV9KVU1CT19CVUZTSVpFOworCQlyZC0+aWR4ID0gaWR4OworCQlpZHggPSAoaWR4ICsgMSkgJSBSWF9KVU1CT19SSU5HX0VOVFJJRVM7CisJfQorCisJaWYgKCFpKQorCQlnb3RvIGVycm9yX291dDsKKworCWF0b21pY19hZGQoaSwgJmFwLT5jdXJfanVtYm9fYnVmcyk7CisJYXAtPnJ4X2p1bWJvX3NrYnByZCA9IGlkeDsKKworCWlmIChBQ0VfSVNfVElHT05fSShhcCkpIHsKKwkJc3RydWN0IGNtZCBjbWQ7CisJCWNtZC5ldnQgPSBDX1NFVF9SWF9KVU1CT19QUkRfSURYOworCQljbWQuY29kZSA9IDA7CisJCWNtZC5pZHggPSBhcC0+cnhfanVtYm9fc2ticHJkOworCQlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworCX0gZWxzZSB7CisJCXdyaXRlbChpZHgsICZyZWdzLT5SeEp1bWJvUHJkKTsKKwkJd21iKCk7CisJfQorCisgb3V0OgorCWNsZWFyX2JpdCgwLCAmYXAtPmp1bWJvX3JlZmlsbF9idXN5KTsKKwlyZXR1cm47CisgZXJyb3Jfb3V0OgorCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCXByaW50ayhLRVJOX0lORk8gIk91dCBvZiBtZW1vcnkgd2hlbiBhbGxvY2F0aW5nICIKKwkJICAgICAgICJqdW1ibyByZWNlaXZlIGJ1ZmZlcnNcbiIpOworCWdvdG8gb3V0OworfQorCisKKy8qCisgKiBBbGwgZXZlbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNsb3cgKFJYL1RYIGludHMgZG8gbm90IGdlbmVyYXRlCisgKiBldmVudHMpIGFuZCBhcmUgaGFuZGxlZCBoZXJlLCBvdXRzaWRlIHRoZSBtYWluIGludGVycnVwdCBoYW5kbGVyLAorICogdG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBoYW5kbGVyLgorICovCitzdGF0aWMgdTMyIGFjZV9oYW5kbGVfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGV2dGNzbSwgdTMyIGV2dHByZCkKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwOworCisJYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJd2hpbGUgKGV2dGNzbSAhPSBldnRwcmQpIHsKKwkJc3dpdGNoIChhcC0+ZXZ0X3JpbmdbZXZ0Y3NtXS5ldnQpIHsKKwkJY2FzZSBFX0ZXX1JVTk5JTkc6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRmlybXdhcmUgdXAgYW5kIHJ1bm5pbmdcbiIsCisJCQkgICAgICAgYXAtPm5hbWUpOworCQkJYXAtPmZ3X3J1bm5pbmcgPSAxOworCQkJd21iKCk7CisJCQlicmVhazsKKwkJY2FzZSBFX1NUQVRTX1VQREFURUQ6CisJCQlicmVhazsKKwkJY2FzZSBFX0xOS19TVEFURToKKwkJeworCQkJdTE2IGNvZGUgPSBhcC0+ZXZ0X3JpbmdbZXZ0Y3NtXS5jb2RlOworCQkJc3dpdGNoIChjb2RlKSB7CisJCQljYXNlIEVfQ19MSU5LX1VQOgorCQkJeworCQkJCXUzMiBzdGF0ZSA9IHJlYWRsKCZhcC0+cmVncy0+R2lnTG5rU3RhdGUpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPcHRpY2FsIGxpbmsgVVAgIgorCQkJCSAgICAgICAiKCVzIER1cGxleCwgRmxvdyBDb250cm9sOiAlcyVzKVxuIiwKKwkJCQkgICAgICAgYXAtPm5hbWUsCisJCQkJICAgICAgIHN0YXRlICYgTE5LX0ZVTExfRFVQTEVYID8gIkZ1bGwiOiJIYWxmIiwKKwkJCQkgICAgICAgc3RhdGUgJiBMTktfVFhfRkxPV19DVExfWSA/ICJUWCAiIDogIiIsCisJCQkJICAgICAgIHN0YXRlICYgTE5LX1JYX0ZMT1dfQ1RMX1kgPyAiUlgiIDogIiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBFX0NfTElOS19ET1dOOgorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPcHRpY2FsIGxpbmsgRE9XTlxuIiwKKwkJCQkgICAgICAgYXAtPm5hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBFX0NfTElOS18xMF8xMDA6CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IDEwLzEwMEJhc2VUIGxpbmsgIgorCQkJCSAgICAgICAiVVBcbiIsIGFwLT5uYW1lKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5rbm93biBvcHRpY2FsIGxpbmsgIgorCQkJCSAgICAgICAic3RhdGUgJTAyeFxuIiwgYXAtPm5hbWUsIGNvZGUpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBFX0VSUk9SOgorCQkJc3dpdGNoKGFwLT5ldnRfcmluZ1tldnRjc21dLmNvZGUpIHsKKwkJCWNhc2UgRV9DX0VSUl9JTlZBTF9DTUQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBjb21tYW5kIGVycm9yXG4iLAorCQkJCSAgICAgICBhcC0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEVfQ19FUlJfVU5JTVBfQ01EOgorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuaW1wbGVtZW50ZWQgY29tbWFuZCAiCisJCQkJICAgICAgICJlcnJvclxuIiwgYXAtPm5hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBFX0NfRVJSX0JBRF9DRkc6CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogYmFkIGNvbmZpZyBlcnJvclxuIiwKKwkJCQkgICAgICAgYXAtPm5hbWUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmtub3duIGVycm9yICUwMnhcbiIsCisJCQkJICAgICAgIGFwLT5uYW1lLCBhcC0+ZXZ0X3JpbmdbZXZ0Y3NtXS5jb2RlKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEVfUkVTRVRfSlVNQk9fUk5HOgorCQl7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBSWF9KVU1CT19SSU5HX0VOVFJJRVM7IGkrKykgeworCQkJCWlmIChhcC0+c2tiLT5yeF9qdW1ib19za2J1ZmZbaV0uc2tiKSB7CisJCQkJCWFwLT5yeF9qdW1ib19yaW5nW2ldLnNpemUgPSAwOworCQkJCQlzZXRfYWNlYWRkcigmYXAtPnJ4X2p1bWJvX3JpbmdbaV0uYWRkciwgMCk7CisJCQkJCWRldl9rZnJlZV9za2IoYXAtPnNrYi0+cnhfanVtYm9fc2tidWZmW2ldLnNrYik7CisJCQkJCWFwLT5za2ItPnJ4X2p1bWJvX3NrYnVmZltpXS5za2IgPSBOVUxMOworCQkJCX0KKwkJCX0KKworIAkJCWlmIChBQ0VfSVNfVElHT05fSShhcCkpIHsKKyAJCQkJc3RydWN0IGNtZCBjbWQ7CisgCQkJCWNtZC5ldnQgPSBDX1NFVF9SWF9KVU1CT19QUkRfSURYOworIAkJCQljbWQuY29kZSA9IDA7CisgCQkJCWNtZC5pZHggPSAwOworIAkJCQlhY2VfaXNzdWVfY21kKGFwLT5yZWdzLCAmY21kKTsKKyAJCQl9IGVsc2UgeworIAkJCQl3cml0ZWwoMCwgJigoYXAtPnJlZ3MpLT5SeEp1bWJvUHJkKSk7CisgCQkJCXdtYigpOworIAkJCX0KKworCQkJYXAtPmp1bWJvID0gMDsKKwkJCWFwLT5yeF9qdW1ib19za2JwcmQgPSAwOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEp1bWJvIHJpbmcgZmx1c2hlZFxuIiwKKwkJCSAgICAgICBhcC0+bmFtZSk7CisJCQljbGVhcl9iaXQoMCwgJmFwLT5qdW1ib19yZWZpbGxfYnVzeSk7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5oYW5kbGVkIGV2ZW50IDB4JTAyeFxuIiwKKwkJCSAgICAgICBhcC0+bmFtZSwgYXAtPmV2dF9yaW5nW2V2dGNzbV0uZXZ0KTsKKwkJfQorCQlldnRjc20gPSAoZXZ0Y3NtICsgMSkgJSBFVlRfUklOR19FTlRSSUVTOworCX0KKworCXJldHVybiBldnRjc207Cit9CisKKworc3RhdGljIHZvaWQgYWNlX3J4X2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgcnhyZXRwcmQsIHUzMiByeHJldGNzbSkKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgaWR4OworCWludCBtaW5pX2NvdW50ID0gMCwgc3RkX2NvdW50ID0gMDsKKworCWlkeCA9IHJ4cmV0Y3NtOworCisJcHJlZmV0Y2h3KCZhcC0+Y3VyX3J4X2J1ZnMpOworCXByZWZldGNodygmYXAtPmN1cl9taW5pX2J1ZnMpOworCQorCXdoaWxlIChpZHggIT0gcnhyZXRwcmQpIHsKKwkJc3RydWN0IHJpbmdfaW5mbyAqcmlwOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlzdHJ1Y3QgcnhfZGVzYyAqcnhkZXNjLCAqcmV0ZGVzYzsKKwkJdTMyIHNrYmlkeDsKKwkJaW50IGJkX2ZsYWdzLCBkZXNjX3R5cGUsIG1hcHNpemU7CisJCXUxNiBjc3VtOworCisKKwkJLyogbWFrZSBzdXJlIHRoZSByeCBkZXNjcmlwdG9yIGlzbid0IHJlYWQgYmVmb3JlIHJ4cmV0cHJkICovCisJCWlmIChpZHggPT0gcnhyZXRjc20pIAorCQkJcm1iKCk7CisKKwkJcmV0ZGVzYyA9ICZhcC0+cnhfcmV0dXJuX3JpbmdbaWR4XTsKKwkJc2tiaWR4ID0gcmV0ZGVzYy0+aWR4OworCQliZF9mbGFncyA9IHJldGRlc2MtPmZsYWdzOworCQlkZXNjX3R5cGUgPSBiZF9mbGFncyAmIChCRF9GTEdfSlVNQk8gfCBCRF9GTEdfTUlOSSk7CisKKwkJc3dpdGNoKGRlc2NfdHlwZSkgeworCQkJLyoKKwkJCSAqIE5vcm1hbCBmcmFtZXMgZG8gbm90IGhhdmUgYW55IGZsYWdzIHNldAorCQkJICoKKwkJCSAqIE1pbmkgYW5kIG5vcm1hbCBmcmFtZXMgYXJyaXZlIGZyZXF1ZW50bHksCisJCQkgKiBzbyB1c2UgYSBsb2NhbCBjb3VudGVyIHRvIGF2b2lkIGRvaW5nCisJCQkgKiBhdG9taWMgb3BlcmF0aW9ucyBmb3IgZWFjaCBwYWNrZXQgYXJyaXZpbmcuCisJCQkgKi8KKwkJY2FzZSAwOgorCQkJcmlwID0gJmFwLT5za2ItPnJ4X3N0ZF9za2J1ZmZbc2tiaWR4XTsKKwkJCW1hcHNpemUgPSBBQ0VfU1REX0JVRlNJWkU7CisJCQlyeGRlc2MgPSAmYXAtPnJ4X3N0ZF9yaW5nW3NrYmlkeF07CisJCQlzdGRfY291bnQrKzsKKwkJCWJyZWFrOworCQljYXNlIEJEX0ZMR19KVU1CTzoKKwkJCXJpcCA9ICZhcC0+c2tiLT5yeF9qdW1ib19za2J1ZmZbc2tiaWR4XTsKKwkJCW1hcHNpemUgPSBBQ0VfSlVNQk9fQlVGU0laRTsKKwkJCXJ4ZGVzYyA9ICZhcC0+cnhfanVtYm9fcmluZ1tza2JpZHhdOworCQkJYXRvbWljX2RlYygmYXAtPmN1cl9qdW1ib19idWZzKTsKKwkJCWJyZWFrOworCQljYXNlIEJEX0ZMR19NSU5JOgorCQkJcmlwID0gJmFwLT5za2ItPnJ4X21pbmlfc2tidWZmW3NrYmlkeF07CisJCQltYXBzaXplID0gQUNFX01JTklfQlVGU0laRTsKKwkJCXJ4ZGVzYyA9ICZhcC0+cnhfbWluaV9yaW5nW3NrYmlkeF07CisJCQltaW5pX2NvdW50Kys7IAorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogdW5rbm93biBmcmFtZSB0eXBlICgweCUwMngpICIKKwkJCSAgICAgICAicmV0dXJuZWQgYnkgTklDXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgcmV0ZGVzYy0+ZmxhZ3MpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXNrYiA9IHJpcC0+c2tiOworCQlyaXAtPnNrYiA9IE5VTEw7CisJCXBjaV91bm1hcF9wYWdlKGFwLT5wZGV2LAorCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKHJpcCwgbWFwcGluZyksCisJCQkgICAgICAgbWFwc2l6ZSwKKwkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlza2JfcHV0KHNrYiwgcmV0ZGVzYy0+c2l6ZSk7CisKKwkJLyoKKwkJICogRmx5IGJhYnksIGZseSEKKwkJICovCisJCWNzdW0gPSByZXRkZXNjLT50Y3BfdWRwX2NzdW07CisKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKwkJLyoKKwkJICogSW5zdGVhZCBvZiBmb3JjaW5nIHRoZSBwb29yIHRpZ29uIG1pcHMgY3B1IHRvIGNhbGN1bGF0ZQorCQkgKiBwc2V1ZG8gaGRyIGNoZWNrc3VtLCB3ZSBkbyB0aGlzIG91cnNlbHZlcy4KKwkJICovCisJCWlmIChiZF9mbGFncyAmIEJEX0ZMR19UQ1BfVURQX1NVTSkgeworCQkJc2tiLT5jc3VtID0gaHRvbnMoY3N1bSk7CisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0hXOworCQl9IGVsc2UgeworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQl9CisKKwkJLyogc2VuZCBpdCB1cCAqLworI2lmIEFDRU5JQ19ET19WTEFOCisJCWlmIChhcC0+dmxncnAgJiYgKGJkX2ZsYWdzICYgQkRfRkxHX1ZMQU5fVEFHKSkgeworCQkJdmxhbl9od2FjY2VsX3J4KHNrYiwgYXAtPnZsZ3JwLCByZXRkZXNjLT52bGFuKTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJCW5ldGlmX3J4KHNrYik7CisKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJYXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJYXAtPnN0YXRzLnJ4X2J5dGVzICs9IHJldGRlc2MtPnNpemU7CisKKwkJaWR4ID0gKGlkeCArIDEpICUgUlhfUkVUVVJOX1JJTkdfRU5UUklFUzsKKwl9CisKKwlhdG9taWNfc3ViKHN0ZF9jb3VudCwgJmFwLT5jdXJfcnhfYnVmcyk7CisJaWYgKCFBQ0VfSVNfVElHT05fSShhcCkpCisJCWF0b21pY19zdWIobWluaV9jb3VudCwgJmFwLT5jdXJfbWluaV9idWZzKTsKKworIG91dDoKKwkvKgorCSAqIEFjY29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbiBSeFJldENzbSBpcyBvYnNvbGV0ZSB3aXRoCisJICogdGhlIDEyLjMueCBGaXJtd2FyZSAtIG15IFRpZ29uIEkgTklDcyBzZWVtIHRvIGRpc2FncmVlIQorCSAqLworCWlmIChBQ0VfSVNfVElHT05fSShhcCkpIHsKKwkJd3JpdGVsKGlkeCwgJmFwLT5yZWdzLT5SeFJldENzbSk7CisJfQorCWFwLT5jdXJfcnggPSBpZHg7CisKKwlyZXR1cm47CisgZXJyb3I6CisJaWR4ID0gcnhyZXRwcmQ7CisJZ290byBvdXQ7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGFjZV90eF9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHUzMiB0eGNzbSwgdTMyIGlkeCkKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWRvIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nOworCQlzdHJ1Y3QgdHhfcmluZ19pbmZvICppbmZvOworCisJCWluZm8gPSBhcC0+c2tiLT50eF9za2J1ZmYgKyBpZHg7CisJCXNrYiA9IGluZm8tPnNrYjsKKwkJbWFwcGluZyA9IHBjaV91bm1hcF9hZGRyKGluZm8sIG1hcHBpbmcpOworCisJCWlmIChtYXBwaW5nKSB7CisJCQlwY2lfdW5tYXBfcGFnZShhcC0+cGRldiwgbWFwcGluZywKKwkJCQkgICAgICAgcGNpX3VubWFwX2xlbihpbmZvLCBtYXBsZW4pLAorCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCXBjaV91bm1hcF9hZGRyX3NldChpbmZvLCBtYXBwaW5nLCAwKTsKKwkJfQorCisJCWlmIChza2IpIHsKKwkJCWFwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlhcC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJaW5mby0+c2tiID0gTlVMTDsKKwkJfQorCisJCWlkeCA9IChpZHggKyAxKSAlIEFDRV9UWF9SSU5HX0VOVFJJRVMoYXApOworCX0gd2hpbGUgKGlkeCAhPSB0eGNzbSk7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwl3bWIoKTsKKwlhcC0+dHhfcmV0X2NzbSA9IHR4Y3NtOworCisJLyogU28uLi4gdHhfcmV0X2NzbSBpcyBhZHZhbmNlZCBfYWZ0ZXJfIGNoZWNrIGZvciBkZXZpY2Ugd2FrZXVwLgorCSAqCisJICogV2UgY291bGQgdHJ5IHRvIG1ha2UgaXQgYmVmb3JlLiBJbiB0aGlzIGNhc2Ugd2Ugd291bGQgZ2V0CisJICogdGhlIGZvbGxvd2luZyByYWNlIGNvbmRpdGlvbjogaGFyZF9zdGFydF94bWl0IG9uIG90aGVyIGNwdQorCSAqIGVudGVycyBhZnRlciB3ZSBhZHZhbmNlZCB0eF9yZXRfY3NtIGFuZCBmaWxscyBzcGFjZSwKKwkgKiB3aGljaCB3ZSBoYXZlIGp1c3QgZnJlZWQsIHNvIHRoYXQgd2UgbWFrZSBpbGxlZ2FsIGRldmljZSB3YWtldXAuCisJICogVGhlcmUgaXMgbm8gZ29vZCB3YXkgdG8gd29ya2Fyb3VuZCB0aGlzIChhdCBlbnRyeQorCSAqIHRvIGFjZV9zdGFydF94bWl0IGRldGVjdHMgdGhpcyBjb25kaXRpb24gYW5kIHByZXZlbnRzCisJICogcmluZyBjb3JydXB0aW9uLCBidXQgaXQgaXMgbm90IGEgZ29vZCB3b3JrYXJvdW5kLikKKwkgKgorCSAqIFdoZW4gdHhfcmV0X2NzbSBpcyBhZHZhbmNlZCBhZnRlciwgd2Ugd2FrZSB1cCBkZXZpY2UgX29ubHlfCisJICogaWYgd2UgcmVhbGx5IGhhdmUgc29tZSBzcGFjZSBpbiByaW5nICh0aG91Z2ggdGhlIGNvcmUgZG9pbmcKKwkgKiBoYXJkX3N0YXJ0X3htaXQgY2FuIHNlZSBmdWxsIHJpbmcgZm9yIHNvbWUgcGVyaW9kIGFuZCBoYXMgdG8KKwkgKiBzeW5jaHJvbml6ZS4pIFN1cGVyYi4KKwkgKiBCVVQhIFdlIGdldCBhbm90aGVyIHN1YnRsZSByYWNlIGNvbmRpdGlvbi4gaGFyZF9zdGFydF94bWl0CisJICogbWF5IHRoaW5rIHRoYXQgcmluZyBpcyBmdWxsIGJldHdlZW4gd2FrZXVwIGFuZCBhZHZhbmNpbmcKKwkgKiB0eF9yZXRfY3NtIGFuZCB3aWxsIHN0b3AgZGV2aWNlIGluc3RhbnRseSEgSXQgaXMgbm90IHNvIGJhZC4KKwkgKiBXZSBhcmUgZ3VhcmFudGVlZCB0aGF0IHRoZXJlIGlzIHNvbWV0aGluZyBpbiByaW5nLCBzbyB0aGF0CisJICogdGhlIG5leHQgaXJxIHdpbGwgcmVzdW1lIHRyYW5zbWlzc2lvbi4gVG8gc3BlZWR1cCB0aGlzIHdlIGNvdWxkCisJICogbWFyayBkZXNjcmlwdG9yLCB3aGljaCBjbG9zZXMgcmluZyB3aXRoIEJEX0ZMR19DT0FMX05PVworCSAqIChzZWUgYWNlX3N0YXJ0X3htaXQpLgorCSAqCisJICogV2VsbCwgdGhpcyBkaWxlbW1hIGV4aXN0cyBpbiBhbGwgbG9jay1mcmVlIGRldmljZXMuCisJICogV2UsIGZvbGxvd2luZyBzY2hlbWUgdXNlZCBpbiBkcml2ZXJzIGJ5IERvbmFsZCBCZWNrZXIsCisJICogc2VsZWN0IHRoZSBsZWFzdCBkYW5nZXJvdXMuCisJICoJCQkJCQkJLS1BTksKKwkgKi8KK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgYWNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCXUzMiBpZHg7CisJdTMyIHR4Y3NtLCByeHJldGNzbSwgcnhyZXRwcmQ7CisJdTMyIGV2dGNzbSwgZXZ0cHJkOworCisJLyoKKwkgKiBJbiBjYXNlIG9mIFBDSSBzaGFyZWQgaW50ZXJydXB0cyBvciBzcHVyaW91cyBpbnRlcnJ1cHRzLAorCSAqIHdlIHdhbnQgdG8gbWFrZSBzdXJlIGl0IGlzIGFjdHVhbGx5IG91ciBpbnRlcnJ1cHQgYmVmb3JlCisJICogc3BlbmRpbmcgYW55IHRpbWUgaW4gaGVyZS4KKwkgKi8KKwlpZiAoIShyZWFkbCgmcmVncy0+SG9zdEN0cmwpICYgSU5fSU5UKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyoKKwkgKiBBQ0sgaW50ciBub3cuIE90aGVyd2lzZSB3ZSB3aWxsIGxvc2UgdXBkYXRlcyB0byByeF9yZXRfcHJkLAorCSAqIHdoaWNoIGhhcHBlbmVkIF9hZnRlcl8gcnhyZXRwcmQgPSAqYXAtPnJ4X3JldF9wcmQ7IGJ1dCBiZWZvcmUKKwkgKiB3cml0ZWwoMCwgJnJlZ3MtPk1iMExvKS4KKwkgKgorCSAqICJJUlEgYXZvaWRhbmNlIiByZWNvbW1lbmRlZCBpbiBkb2NzIGFwcGxpZXMgdG8gSVJRcyBzZXJ2ZWQKKwkgKiB0aHJlYWRzIGFuZCBpdCBpcyB3cm9uZyBldmVuIGZvciB0aGF0IGNhc2UuCisJICovCisJd3JpdGVsKDAsICZyZWdzLT5NYjBMbyk7CisJcmVhZGwoJnJlZ3MtPk1iMExvKTsKKworCS8qCisJICogVGhlcmUgaXMgbm8gY29uZmxpY3QgYmV0d2VlbiB0cmFuc21pdCBoYW5kbGluZyBpbgorCSAqIHN0YXJ0X3htaXQgYW5kIHJlY2VpdmUgcHJvY2Vzc2luZywgdGh1cyB0aGVyZSBpcyBubyByZWFzb24KKwkgKiB0byB0YWtlIGEgc3BpbiBsb2NrIGZvciBSWCBoYW5kbGluZy4gV2FpdCB1bnRpbCB3ZSBzdGFydAorCSAqIHdvcmtpbmcgb24gdGhlIG90aGVyIHN0dWZmIC0gaGV5IHdlIGRvbid0IG5lZWQgYSBzcGluIGxvY2sKKwkgKiBhbnltb3JlLgorCSAqLworCXJ4cmV0cHJkID0gKmFwLT5yeF9yZXRfcHJkOworCXJ4cmV0Y3NtID0gYXAtPmN1cl9yeDsKKworCWlmIChyeHJldHByZCAhPSByeHJldGNzbSkKKwkJYWNlX3J4X2ludChkZXYsIHJ4cmV0cHJkLCByeHJldGNzbSk7CisKKwl0eGNzbSA9ICphcC0+dHhfY3NtOworCWlkeCA9IGFwLT50eF9yZXRfY3NtOworCisJaWYgKHR4Y3NtICE9IGlkeCkgeworCQkvKgorCQkgKiBJZiBlYWNoIHNrYiB0YWtlcyBvbmx5IG9uZSBkZXNjcmlwdG9yIHRoaXMgY2hlY2sgZGVnZW5lcmF0ZXMKKwkJICogdG8gaWRlbnRpdHksIGJlY2F1c2UgbmV3IHNwYWNlIGhhcyBqdXN0IGJlZW4gb3BlbmVkLgorCQkgKiBCdXQgaWYgc2ticyBhcmUgZnJhZ21lbnRlZCB3ZSBtdXN0IGNoZWNrIHRoYXQgdGhpcyBpbmRleAorCQkgKiB1cGRhdGUgcmVsZWFzZXMgZW5vdWdoIG9mIHNwYWNlLCBvdGhlcndpc2Ugd2UganVzdAorCQkgKiB3YWl0IGZvciBkZXZpY2UgdG8gbWFrZSBtb3JlIHdvcmsuCisJCSAqLworCQlpZiAoIXR4X3JpbmdfZnVsbChhcCwgdHhjc20sIGFwLT50eF9wcmQpKQorCQkJYWNlX3R4X2ludChkZXYsIHR4Y3NtLCBpZHgpOworCX0KKworCWV2dGNzbSA9IHJlYWRsKCZyZWdzLT5FdnRDc20pOworCWV2dHByZCA9ICphcC0+ZXZ0X3ByZDsKKworCWlmIChldnRjc20gIT0gZXZ0cHJkKSB7CisJCWV2dGNzbSA9IGFjZV9oYW5kbGVfZXZlbnQoZGV2LCBldnRjc20sIGV2dHByZCk7CisJCXdyaXRlbChldnRjc20sICZyZWdzLT5FdnRDc20pOworCX0KKworCS8qCisJICogVGhpcyBoYXMgdG8gZ28gbGFzdCBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgYW5kIHJ1biB3aXRoCisJICogdGhlIHNwaW4gbG9jayByZWxlYXNlZCAuLi4gd2hhdCBsb2NrPworCSAqLworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJaW50IGN1cl9zaXplOworCQlpbnQgcnVuX3Rhc2tsZXQgPSAwOworCisJCWN1cl9zaXplID0gYXRvbWljX3JlYWQoJmFwLT5jdXJfcnhfYnVmcyk7CisJCWlmIChjdXJfc2l6ZSA8IFJYX0xPV19TVERfVEhSRVMpIHsKKwkJCWlmICgoY3VyX3NpemUgPCBSWF9QQU5JQ19TVERfVEhSRVMpICYmCisJCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoMCwgJmFwLT5zdGRfcmVmaWxsX2J1c3kpKSB7CisjaWZkZWYgREVCVUcKKwkJCQlwcmludGsoImxvdyBvbiBzdGQgYnVmZmVycyAlaVxuIiwgY3VyX3NpemUpOworI2VuZGlmCisJCQkJYWNlX2xvYWRfc3RkX3J4X3JpbmcoYXAsCisJCQkJCQkgICAgIFJYX1JJTkdfU0laRSAtIGN1cl9zaXplKTsKKwkJCX0gZWxzZQorCQkJCXJ1bl90YXNrbGV0ID0gMTsKKwkJfQorCisJCWlmICghQUNFX0lTX1RJR09OX0koYXApKSB7CisJCQljdXJfc2l6ZSA9IGF0b21pY19yZWFkKCZhcC0+Y3VyX21pbmlfYnVmcyk7CisJCQlpZiAoY3VyX3NpemUgPCBSWF9MT1dfTUlOSV9USFJFUykgeworCQkJCWlmICgoY3VyX3NpemUgPCBSWF9QQU5JQ19NSU5JX1RIUkVTKSAmJgorCQkJCSAgICAhdGVzdF9hbmRfc2V0X2JpdCgwLAorCQkJCQkJICAgICAgJmFwLT5taW5pX3JlZmlsbF9idXN5KSkgeworI2lmZGVmIERFQlVHCisJCQkJCXByaW50aygibG93IG9uIG1pbmkgYnVmZmVycyAlaVxuIiwKKwkJCQkJICAgICAgIGN1cl9zaXplKTsKKyNlbmRpZgorCQkJCQlhY2VfbG9hZF9taW5pX3J4X3JpbmcoYXAsIFJYX01JTklfU0laRSAtIGN1cl9zaXplKTsKKwkJCQl9IGVsc2UKKwkJCQkJcnVuX3Rhc2tsZXQgPSAxOworCQkJfQorCQl9CisKKwkJaWYgKGFwLT5qdW1ibykgeworCQkJY3VyX3NpemUgPSBhdG9taWNfcmVhZCgmYXAtPmN1cl9qdW1ib19idWZzKTsKKwkJCWlmIChjdXJfc2l6ZSA8IFJYX0xPV19KVU1CT19USFJFUykgeworCQkJCWlmICgoY3VyX3NpemUgPCBSWF9QQU5JQ19KVU1CT19USFJFUykgJiYKKwkJCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoMCwKKwkJCQkJCSAgICAgICZhcC0+anVtYm9fcmVmaWxsX2J1c3kpKXsKKyNpZmRlZiBERUJVRworCQkJCQlwcmludGsoImxvdyBvbiBqdW1ibyBidWZmZXJzICVpXG4iLAorCQkJCQkgICAgICAgY3VyX3NpemUpOworI2VuZGlmCisJCQkJCWFjZV9sb2FkX2p1bWJvX3J4X3JpbmcoYXAsIFJYX0pVTUJPX1NJWkUgLSBjdXJfc2l6ZSk7CisJCQkJfSBlbHNlCisJCQkJCXJ1bl90YXNrbGV0ID0gMTsKKwkJCX0KKwkJfQorCQlpZiAocnVuX3Rhc2tsZXQgJiYgIWFwLT50YXNrbGV0X3BlbmRpbmcpIHsKKwkJCWFwLT50YXNrbGV0X3BlbmRpbmcgPSAxOworCQkJdGFza2xldF9zY2hlZHVsZSgmYXAtPmFjZV90YXNrbGV0KTsKKwkJfQorCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisjaWYgQUNFTklDX0RPX1ZMQU4KK3N0YXRpYyB2b2lkIGFjZV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJc3RydWN0IGFjZV9wcml2YXRlICphcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlhY2VfbWFza19pcnEoZGV2KTsKKworCWFwLT52bGdycCA9IGdycDsKKworCWFjZV91bm1hc2tfaXJxKGRldik7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIGFjZV92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWFjZV9tYXNrX2lycShkZXYpOworCisJaWYgKGFwLT52bGdycCkKKwkJYXAtPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSA9IE5VTEw7CisKKwlhY2VfdW5tYXNrX2lycShkZXYpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKyNlbmRpZiAvKiBBQ0VOSUNfRE9fVkxBTiAqLworCisKK3N0YXRpYyBpbnQgYWNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCXN0cnVjdCBjbWQgY21kOworCisJaWYgKCEoYXAtPmZ3X3J1bm5pbmcpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGaXJtd2FyZSBub3QgcnVubmluZyFcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJd3JpdGVsKGRldi0+bXR1ICsgRVRIX0hMRU4gKyA0LCAmcmVncy0+SWZNdHUpOworCisJY21kLmV2dCA9IENfQ0xFQVJfU1RBVFM7CisJY21kLmNvZGUgPSAwOworCWNtZC5pZHggPSAwOworCWFjZV9pc3N1ZV9jbWQocmVncywgJmNtZCk7CisKKwljbWQuZXZ0ID0gQ19IT1NUX1NUQVRFOworCWNtZC5jb2RlID0gQ19DX1NUQUNLX1VQOworCWNtZC5pZHggPSAwOworCWFjZV9pc3N1ZV9jbWQocmVncywgJmNtZCk7CisKKwlpZiAoYXAtPmp1bWJvICYmCisJICAgICF0ZXN0X2FuZF9zZXRfYml0KDAsICZhcC0+anVtYm9fcmVmaWxsX2J1c3kpKQorCQlhY2VfbG9hZF9qdW1ib19yeF9yaW5nKGFwLCBSWF9KVU1CT19TSVpFKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJY21kLmV2dCA9IENfU0VUX1BST01JU0NfTU9ERTsKKwkJY21kLmNvZGUgPSBDX0NfUFJPTUlTQ19FTkFCTEU7CisJCWNtZC5pZHggPSAwOworCQlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworCisJCWFwLT5wcm9taXNjID0gMTsKKwl9ZWxzZQorCQlhcC0+cHJvbWlzYyA9IDA7CisJYXAtPm1jYXN0X2FsbCA9IDA7CisKKyNpZiAwCisJY21kLmV2dCA9IENfTE5LX05FR09USUFUSU9OOworCWNtZC5jb2RlID0gMDsKKwljbWQuaWR4ID0gMDsKKwlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworI2VuZGlmCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJLyoKKwkgKiBTZXR1cCB0aGUgYm90dG9tIGhhbGYgcnggcmluZyByZWZpbGwgaGFuZGxlcgorCSAqLworCXRhc2tsZXRfaW5pdCgmYXAtPmFjZV90YXNrbGV0LCBhY2VfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpZGV2KTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFjZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisJc3RydWN0IGNtZCBjbWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCBpOworCisJLyoKKwkgKiBXaXRob3V0IChvciBiZWZvcmUpIHJlbGVhc2luZyBpcnEgYW5kIHN0b3BwaW5nIGhhcmR3YXJlLCB0aGlzCisJICogaXMgYW4gYWJzb2x1dGUgbm9uLXNlbnNlLCBieSB0aGUgd2F5LiBJdCB3aWxsIGJlIHJlc2V0IGluc3RhbnRseQorCSAqIGJ5IHRoZSBmaXJzdCBpcnEuCisJICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCisJaWYgKGFwLT5wcm9taXNjKSB7CisJCWNtZC5ldnQgPSBDX1NFVF9QUk9NSVNDX01PREU7CisJCWNtZC5jb2RlID0gQ19DX1BST01JU0NfRElTQUJMRTsKKwkJY21kLmlkeCA9IDA7CisJCWFjZV9pc3N1ZV9jbWQocmVncywgJmNtZCk7CisJCWFwLT5wcm9taXNjID0gMDsKKwl9CisKKwljbWQuZXZ0ID0gQ19IT1NUX1NUQVRFOworCWNtZC5jb2RlID0gQ19DX1NUQUNLX0RPV047CisJY21kLmlkeCA9IDA7CisJYWNlX2lzc3VlX2NtZChyZWdzLCAmY21kKTsKKworCXRhc2tsZXRfa2lsbCgmYXAtPmFjZV90YXNrbGV0KTsKKworCS8qCisJICogTWFrZSBzdXJlIG9uZSBDUFUgaXMgbm90IHByb2Nlc3NpbmcgcGFja2V0cyB3aGlsZQorCSAqIGJ1ZmZlcnMgYXJlIGJlaW5nIHJlbGVhc2VkIGJ5IGFub3RoZXIuCisJICovCisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYWNlX21hc2tfaXJxKGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUNFX1RYX1JJTkdfRU5UUklFUyhhcCk7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlkbWFfYWRkcl90IG1hcHBpbmc7CisJCXN0cnVjdCB0eF9yaW5nX2luZm8gKmluZm87CisKKwkJaW5mbyA9IGFwLT5za2ItPnR4X3NrYnVmZiArIGk7CisJCXNrYiA9IGluZm8tPnNrYjsKKwkJbWFwcGluZyA9IHBjaV91bm1hcF9hZGRyKGluZm8sIG1hcHBpbmcpOworCisJCWlmIChtYXBwaW5nKSB7CisJCQlpZiAoQUNFX0lTX1RJR09OX0koYXApKSB7CisJCQkJc3RydWN0IHR4X2Rlc2MgX19pb21lbSAqdHggCisJCQkJCT0gKHN0cnVjdCB0eF9kZXNjIF9faW9tZW0gKikgJmFwLT50eF9yaW5nW2ldOworCQkJCXdyaXRlbCgwLCAmdHgtPmFkZHIuYWRkcmhpKTsKKwkJCQl3cml0ZWwoMCwgJnR4LT5hZGRyLmFkZHJsbyk7CisJCQkJd3JpdGVsKDAsICZ0eC0+ZmxhZ3NpemUpOworCQkJfSBlbHNlCisJCQkJbWVtc2V0KGFwLT50eF9yaW5nICsgaSwgMCwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSk7CisJCQlwY2lfdW5tYXBfcGFnZShhcC0+cGRldiwgbWFwcGluZywKKwkJCQkgICAgICAgcGNpX3VubWFwX2xlbihpbmZvLCBtYXBsZW4pLAorCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCXBjaV91bm1hcF9hZGRyX3NldChpbmZvLCBtYXBwaW5nLCAwKTsKKwkJfQorCQlpZiAoc2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlpbmZvLT5za2IgPSBOVUxMOworCQl9CisJfQorCisJaWYgKGFwLT5qdW1ibykgeworCQljbWQuZXZ0ID0gQ19SRVNFVF9KVU1CT19STkc7CisJCWNtZC5jb2RlID0gMDsKKwkJY21kLmlkeCA9IDA7CisJCWFjZV9pc3N1ZV9jbWQocmVncywgJmNtZCk7CisJfQorCisJYWNlX3VubWFza19pcnEoZGV2KTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QKK2FjZV9tYXBfdHhfc2tiKHN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAsIHN0cnVjdCBza19idWZmICpza2IsCisJICAgICAgIHN0cnVjdCBza19idWZmICp0YWlsLCB1MzIgaWR4KQoreworCWRtYV9hZGRyX3QgbWFwcGluZzsKKwlzdHJ1Y3QgdHhfcmluZ19pbmZvICppbmZvOworCisJbWFwcGluZyA9IHBjaV9tYXBfcGFnZShhcC0+cGRldiwgdmlydF90b19wYWdlKHNrYi0+ZGF0YSksCisJCQkgICAgICAgb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCSAgICAgICBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwlpbmZvID0gYXAtPnNrYi0+dHhfc2tidWZmICsgaWR4OworCWluZm8tPnNrYiA9IHRhaWw7CisJcGNpX3VubWFwX2FkZHJfc2V0KGluZm8sIG1hcHBpbmcsIG1hcHBpbmcpOworCXBjaV91bm1hcF9sZW5fc2V0KGluZm8sIG1hcGxlbiwgc2tiLT5sZW4pOworCXJldHVybiBtYXBwaW5nOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYWNlX2xvYWRfdHhfYmQoc3RydWN0IGFjZV9wcml2YXRlICphcCwgc3RydWN0IHR4X2Rlc2MgKmRlc2MsIHU2NCBhZGRyLAorCSAgICAgICB1MzIgZmxhZ3NpemUsIHUzMiB2bGFuX3RhZykKK3sKKyNpZiAhVVNFX1RYX0NPQUxfTk9XCisJZmxhZ3NpemUgJj0gfkJEX0ZMR19DT0FMX05PVzsKKyNlbmRpZgorCisJaWYgKEFDRV9JU19USUdPTl9JKGFwKSkgeworCQlzdHJ1Y3QgdHhfZGVzYyBfX2lvbWVtICppbyA9IChzdHJ1Y3QgdHhfZGVzYyBfX2lvbWVtICopIGRlc2M7CisJCXdyaXRlbChhZGRyID4+IDMyLCAmaW8tPmFkZHIuYWRkcmhpKTsKKwkJd3JpdGVsKGFkZHIgJiAweGZmZmZmZmZmLCAmaW8tPmFkZHIuYWRkcmxvKTsKKwkJd3JpdGVsKGZsYWdzaXplLCAmaW8tPmZsYWdzaXplKTsKKyNpZiBBQ0VOSUNfRE9fVkxBTgorCQl3cml0ZWwodmxhbl90YWcsICZpby0+dmxhbnJlcyk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlkZXNjLT5hZGRyLmFkZHJoaSA9IGFkZHIgPj4gMzI7CisJCWRlc2MtPmFkZHIuYWRkcmxvID0gYWRkcjsKKwkJZGVzYy0+ZmxhZ3NpemUgPSBmbGFnc2l6ZTsKKyNpZiBBQ0VOSUNfRE9fVkxBTgorCQlkZXNjLT52bGFucmVzID0gdmxhbl90YWc7CisjZW5kaWYKKwl9Cit9CisKKworc3RhdGljIGludCBhY2Vfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisJc3RydWN0IHR4X2Rlc2MgKmRlc2M7CisJdTMyIGlkeCwgZmxhZ3NpemU7CisJdW5zaWduZWQgbG9uZyBtYXhqaWZmID0gamlmZmllcyArIDMqSFo7CisKK3Jlc3RhcnQ6CisJaWR4ID0gYXAtPnR4X3ByZDsKKworCWlmICh0eF9yaW5nX2Z1bGwoYXAsIGFwLT50eF9yZXRfY3NtLCBpZHgpKQorCQlnb3RvIG92ZXJmbG93OworCisJaWYgKCFza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKQl7CisJCWRtYV9hZGRyX3QgbWFwcGluZzsKKwkJdTMyIHZsYW5fdGFnID0gMDsKKworCQltYXBwaW5nID0gYWNlX21hcF90eF9za2IoYXAsIHNrYiwgc2tiLCBpZHgpOworCQlmbGFnc2l6ZSA9IChza2ItPmxlbiA8PCAxNikgfCAoQkRfRkxHX0VORCk7CisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKKwkJCWZsYWdzaXplIHw9IEJEX0ZMR19UQ1BfVURQX1NVTTsKKyNpZiBBQ0VOSUNfRE9fVkxBTgorCQlpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisJCQlmbGFnc2l6ZSB8PSBCRF9GTEdfVkxBTl9UQUc7CisJCQl2bGFuX3RhZyA9IHZsYW5fdHhfdGFnX2dldChza2IpOworCQl9CisjZW5kaWYKKwkJZGVzYyA9IGFwLT50eF9yaW5nICsgaWR4OworCQlpZHggPSAoaWR4ICsgMSkgJSBBQ0VfVFhfUklOR19FTlRSSUVTKGFwKTsKKworCQkvKiBMb29rIGF0IGFjZV90eF9pbnQgZm9yIGV4cGxhbmF0aW9ucy4gKi8KKwkJaWYgKHR4X3JpbmdfZnVsbChhcCwgYXAtPnR4X3JldF9jc20sIGlkeCkpCisJCQlmbGFnc2l6ZSB8PSBCRF9GTEdfQ09BTF9OT1c7CisKKwkJYWNlX2xvYWRfdHhfYmQoYXAsIGRlc2MsIG1hcHBpbmcsIGZsYWdzaXplLCB2bGFuX3RhZyk7CisJfSBlbHNlIHsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nOworCQl1MzIgdmxhbl90YWcgPSAwOworCQlpbnQgaSwgbGVuID0gMDsKKworCQltYXBwaW5nID0gYWNlX21hcF90eF9za2IoYXAsIHNrYiwgTlVMTCwgaWR4KTsKKwkJZmxhZ3NpemUgPSAoc2tiX2hlYWRsZW4oc2tiKSA8PCAxNik7CisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKKwkJCWZsYWdzaXplIHw9IEJEX0ZMR19UQ1BfVURQX1NVTTsKKyNpZiBBQ0VOSUNfRE9fVkxBTgorCQlpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisJCQlmbGFnc2l6ZSB8PSBCRF9GTEdfVkxBTl9UQUc7CisJCQl2bGFuX3RhZyA9IHZsYW5fdHhfdGFnX2dldChza2IpOworCQl9CisjZW5kaWYKKworCQlhY2VfbG9hZF90eF9iZChhcCwgYXAtPnR4X3JpbmcgKyBpZHgsIG1hcHBpbmcsIGZsYWdzaXplLCB2bGFuX3RhZyk7CisKKwkJaWR4ID0gKGlkeCArIDEpICUgQUNFX1RYX1JJTkdfRU5UUklFUyhhcCk7CisKKwkJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQkJc3RydWN0IHR4X3JpbmdfaW5mbyAqaW5mbzsKKworCQkJbGVuICs9IGZyYWctPnNpemU7CisJCQlpbmZvID0gYXAtPnNrYi0+dHhfc2tidWZmICsgaWR4OworCQkJZGVzYyA9IGFwLT50eF9yaW5nICsgaWR4OworCisJCQltYXBwaW5nID0gcGNpX21hcF9wYWdlKGFwLT5wZGV2LCBmcmFnLT5wYWdlLAorCQkJCQkgICAgICAgZnJhZy0+cGFnZV9vZmZzZXQsIGZyYWctPnNpemUsCisJCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQkJZmxhZ3NpemUgPSAoZnJhZy0+c2l6ZSA8PCAxNik7CisJCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCisJCQkJZmxhZ3NpemUgfD0gQkRfRkxHX1RDUF9VRFBfU1VNOworCQkJaWR4ID0gKGlkeCArIDEpICUgQUNFX1RYX1JJTkdfRU5UUklFUyhhcCk7CisKKwkJCWlmIChpID09IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgLSAxKSB7CisJCQkJZmxhZ3NpemUgfD0gQkRfRkxHX0VORDsKKwkJCQlpZiAodHhfcmluZ19mdWxsKGFwLCBhcC0+dHhfcmV0X2NzbSwgaWR4KSkKKwkJCQkJZmxhZ3NpemUgfD0gQkRfRkxHX0NPQUxfTk9XOworCisJCQkJLyoKKwkJCQkgKiBPbmx5IHRoZSBsYXN0IGZyYWdtZW50IGZyZWVzCisJCQkJICogdGhlIHNrYiEKKwkJCQkgKi8KKwkJCQlpbmZvLT5za2IgPSBza2I7CisJCQl9IGVsc2UgeworCQkJCWluZm8tPnNrYiA9IE5VTEw7CisJCQl9CisJCQlwY2lfdW5tYXBfYWRkcl9zZXQoaW5mbywgbWFwcGluZywgbWFwcGluZyk7CisJCQlwY2lfdW5tYXBfbGVuX3NldChpbmZvLCBtYXBsZW4sIGZyYWctPnNpemUpOworCQkJYWNlX2xvYWRfdHhfYmQoYXAsIGRlc2MsIG1hcHBpbmcsIGZsYWdzaXplLCB2bGFuX3RhZyk7CisJCX0KKwl9CisKKyAJd21iKCk7CisgCWFwLT50eF9wcmQgPSBpZHg7CisgCWFjZV9zZXRfdHhwcmQocmVncywgYXAsIGlkeCk7CisKKwlpZiAoZmxhZ3NpemUgJiBCRF9GTEdfQ09BTF9OT1cpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCS8qCisJCSAqIEEgVFgtZGVzY3JpcHRvciBwcm9kdWNlciAoYW4gSVJRKSBtaWdodCBoYXZlIGdvdHRlbgorCQkgKiBpbmJldHdlZW4sIG1ha2luZyB0aGUgcmluZyBmcmVlIGFnYWluLiBTaW5jZSB4bWl0IGlzCisJCSAqIHNlcmlhbGl6ZWQsIHRoaXMgaXMgdGhlIG9ubHkgc2l0dWF0aW9uIHdlIGhhdmUgdG8KKwkJICogcmUtdGVzdC4KKwkJICovCisJCWlmICghdHhfcmluZ19mdWxsKGFwLCBhcC0+dHhfcmV0X2NzbSwgaWR4KSkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyZXR1cm4gTkVUREVWX1RYX09LOworCitvdmVyZmxvdzoKKwkvKgorCSAqIFRoaXMgcmFjZSBjb25kaXRpb24gaXMgdW5hdm9pZGFibGUgd2l0aCBsb2NrLWZyZWUgZHJpdmVycy4KKwkgKiBXZSB3YWtlIHVwIHRoZSBxdWV1ZSBfYmVmb3JlXyB0eF9wcmQgaXMgYWR2YW5jZWQsIHNvIHRoYXQgd2UgY2FuCisJICogZW50ZXIgaGFyZF9zdGFydF94bWl0IHRvbyBlYXJseSwgd2hpbGUgdHggcmluZyBzdGlsbCBsb29rcyBjbG9zZWQuCisJICogVGhpcyBoYXBwZW5zIH4xLTQgdGltZXMgcGVyIDEwMDAwMCBwYWNrZXRzLCBzbyB0aGF0IHdlIGNhbiBhbGxvdworCSAqIHRvIGxvb3Agc3luY2luZyB0byBvdGhlciBDUFUuIFByb2JhYmx5LCB3ZSBuZWVkIGFuIGFkZGl0aW9uYWwKKwkgKiB3bWIoKSBpbiBhY2VfdHhfaW50ciBhcyB3ZWxsLgorCSAqCisJICogTm90ZSB0aGF0IHRoaXMgcmFjZSBpcyByZWxpZXZlZCBieSByZXNlcnZpbmcgb25lIG1vcmUgZW50cnkKKwkgKiBpbiB0eCByaW5nIHRoYW4gaXQgaXMgbmVjZXNzYXJ5IChzZWUgb3JpZ2luYWwgbm9uLVNHIGRyaXZlcikuCisJICogSG93ZXZlciwgd2l0aCBTRyB3ZSBuZWVkIHRvIHJlc2VydmUgMipNQVhfU0tCX0ZSQUdTKzEsIHdoaWNoCisJICogaXMgYWxyZWFkeSBvdmVya2lsbC4KKwkgKgorCSAqIEFsdGVybmF0aXZlIGlzIHRvIHJldHVybiB3aXRoIDEgbm90IHRocm90dGxpbmcgcXVldWUuIEluIHRoaXMKKwkgKiBjYXNlIGxvb3AgYmVjb21lcyBsb25nZXIsIG5vIG1vcmUgdXNlZnVsIGVmZmVjdHMuCisJICovCisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIG1heGppZmYpKSB7CisJCWJhcnJpZXIoKTsKKwkJY3B1X3JlbGF4KCk7CisJCWdvdG8gcmVzdGFydDsKKwl9CisJCisJLyogVGhlIHJpbmcgaXMgc3R1Y2sgZnVsbC4gKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJhbnNtaXQgcmluZyBzdHVjayBmdWxsXG4iLCBkZXYtPm5hbWUpOworCXJldHVybiBORVRERVZfVFhfQlVTWTsKK30KKworCitzdGF0aWMgaW50IGFjZV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisKKwlpZiAobmV3X210dSA+IEFDRV9KVU1CT19NVFUpCisJCXJldHVybiAtRUlOVkFMOworCisJd3JpdGVsKG5ld19tdHUgKyBFVEhfSExFTiArIDQsICZyZWdzLT5JZk10dSk7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCisJaWYgKG5ld19tdHUgPiBBQ0VfU1REX01UVSkgeworCQlpZiAoIShhcC0+anVtYm8pKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRW5hYmxpbmcgSnVtYm8gZnJhbWUgIgorCQkJICAgICAgICJzdXBwb3J0XG4iLCBkZXYtPm5hbWUpOworCQkJYXAtPmp1bWJvID0gMTsKKwkJCWlmICghdGVzdF9hbmRfc2V0X2JpdCgwLCAmYXAtPmp1bWJvX3JlZmlsbF9idXN5KSkKKwkJCQlhY2VfbG9hZF9qdW1ib19yeF9yaW5nKGFwLCBSWF9KVU1CT19TSVpFKTsKKwkJCWFjZV9zZXRfcnh0eF9wYXJtcyhkZXYsIDEpOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmFwLT5qdW1ib19yZWZpbGxfYnVzeSkpOworCQlhY2Vfc3luY19pcnEoZGV2LT5pcnEpOworCQlhY2Vfc2V0X3J4dHhfcGFybXMoZGV2LCAwKTsKKwkJaWYgKGFwLT5qdW1ibykgeworCQkJc3RydWN0IGNtZCBjbWQ7CisKKwkJCWNtZC5ldnQgPSBDX1JFU0VUX0pVTUJPX1JORzsKKwkJCWNtZC5jb2RlID0gMDsKKwkJCWNtZC5pZHggPSAwOworCQkJYWNlX2lzc3VlX2NtZChyZWdzLCAmY21kKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjZV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisJdTMyIGxpbms7CisKKwltZW1zZXQoZWNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBldGh0b29sX2NtZCkpOworCWVjbWQtPnN1cHBvcnRlZCA9CisJCShTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJIFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCSBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9GSUJSRSk7CisKKwllY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisKKwlsaW5rID0gcmVhZGwoJnJlZ3MtPkdpZ0xua1N0YXRlKTsKKwlpZiAobGluayAmIExOS18xMDAwTUIpCisJCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwMDsKKwllbHNlIHsKKwkJbGluayA9IHJlYWRsKCZyZWdzLT5GYXN0TG5rU3RhdGUpOworCQlpZiAobGluayAmIExOS18xMDBNQikKKwkJCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwOworCQllbHNlIGlmIChsaW5rICYgTE5LXzEwTUIpCisJCQllY21kLT5zcGVlZCA9IFNQRUVEXzEwOworCQllbHNlCisJCQllY21kLT5zcGVlZCA9IDA7CisJfQorCWlmIChsaW5rICYgTE5LX0ZVTExfRFVQTEVYKQorCQllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwllbHNlCisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9IQUxGOworCisJaWYgKGxpbmsgJiBMTktfTkVHT1RJQVRFKQorCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJZWxzZQorCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCisjaWYgMAorCS8qCisJICogQ3VycmVudCBzdHJ1Y3QgZXRodG9vbF9jbWQgaXMgaW5zdWZmaWNpZW50CisJICovCisJZWNtZC0+dHJhY2UgPSByZWFkbCgmcmVncy0+VHVuZVRyYWNlKTsKKworCWVjbWQtPnR4Y29hbCA9IHJlYWRsKCZyZWdzLT5UdW5lVHhDb2FsVGlja3MpOworCWVjbWQtPnJ4Y29hbCA9IHJlYWRsKCZyZWdzLT5UdW5lUnhDb2FsVGlja3MpOworI2VuZGlmCisJZWNtZC0+bWF4dHhwa3QgPSByZWFkbCgmcmVncy0+VHVuZU1heFR4RGVzYyk7CisJZWNtZC0+bWF4cnhwa3QgPSByZWFkbCgmcmVncy0+VHVuZU1heFJ4RGVzYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY2Vfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCXUzMiBsaW5rLCBzcGVlZDsKKworCWxpbmsgPSByZWFkbCgmcmVncy0+R2lnTG5rU3RhdGUpOworCWlmIChsaW5rICYgTE5LXzEwMDBNQikKKwkJc3BlZWQgPSBTUEVFRF8xMDAwOworCWVsc2UgeworCQlsaW5rID0gcmVhZGwoJnJlZ3MtPkZhc3RMbmtTdGF0ZSk7CisJCWlmIChsaW5rICYgTE5LXzEwME1CKQorCQkJc3BlZWQgPSBTUEVFRF8xMDA7CisJCWVsc2UgaWYgKGxpbmsgJiBMTktfMTBNQikKKwkJCXNwZWVkID0gU1BFRURfMTA7CisJCWVsc2UKKwkJCXNwZWVkID0gU1BFRURfMTAwOworCX0KKworCWxpbmsgPSBMTktfRU5BQkxFIHwgTE5LXzEwMDBNQiB8IExOS18xMDBNQiB8IExOS18xME1CIHwKKwkJTE5LX1JYX0ZMT1dfQ1RMX1kgfCBMTktfTkVHX0ZDVEw7CisJaWYgKCFBQ0VfSVNfVElHT05fSShhcCkpCisJCWxpbmsgfD0gTE5LX1RYX0ZMT1dfQ1RMX1k7CisJaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCisJCWxpbmsgfD0gTE5LX05FR09USUFURTsKKwlpZiAoZWNtZC0+c3BlZWQgIT0gc3BlZWQpIHsKKwkJbGluayAmPSB+KExOS18xMDAwTUIgfCBMTktfMTAwTUIgfCBMTktfMTBNQik7CisJCXN3aXRjaCAoc3BlZWQpIHsKKwkJY2FzZSBTUEVFRF8xMDAwOgorCQkJbGluayB8PSBMTktfMTAwME1COworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMTAwOgorCQkJbGluayB8PSBMTktfMTAwTUI7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDoKKwkJCWxpbmsgfD0gTE5LXzEwTUI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCWxpbmsgfD0gTE5LX0ZVTExfRFVQTEVYOworCisJaWYgKGxpbmsgIT0gYXAtPmxpbmspIHsKKwkJc3RydWN0IGNtZCBjbWQ7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZW5lZ290aWF0aW5nIGxpbmsgc3RhdGVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCisJCWFwLT5saW5rID0gbGluazsKKwkJd3JpdGVsKGxpbmssICZyZWdzLT5UdW5lTGluayk7CisJCWlmICghQUNFX0lTX1RJR09OX0koYXApKQorCQkJd3JpdGVsKGxpbmssICZyZWdzLT5UdW5lRmFzdExpbmspOworCQl3bWIoKTsKKworCQljbWQuZXZ0ID0gQ19MTktfTkVHT1RJQVRJT047CisJCWNtZC5jb2RlID0gMDsKKwkJY21kLmlkeCA9IDA7CisJCWFjZV9pc3N1ZV9jbWQocmVncywgJmNtZCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhY2VfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisJCQkgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCAiYWNlbmljIiwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXNucHJpbnRmKGluZm8tPnZlcnNpb24sIHNpemVvZihpbmZvLT52ZXJzaW9uKSwgIiVpLiVpLiVpIiwgCisJCXRpZ29uRndSZWxlYXNlTWFqb3IsIHRpZ29uRndSZWxlYXNlTWlub3IsCisJCXRpZ29uRndSZWxlYXNlRml4KTsKKworCWlmIChhcC0+cGRldikKKwkJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYXAtPnBkZXYpLCAKKwkJCXNpemVvZihpbmZvLT5idXNfaW5mbykpOworCit9CisKKy8qCisgKiBTZXQgdGhlIGhhcmR3YXJlIE1BQyBhZGRyZXNzLgorICovCitzdGF0aWMgaW50IGFjZV9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCXN0cnVjdCBzb2NrYWRkciAqYWRkcj1wOworCXU4ICpkYTsKKwlzdHJ1Y3QgY21kIGNtZDsKKworCWlmKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLGRldi0+YWRkcl9sZW4pOworCisJZGEgPSAodTggKilkZXYtPmRldl9hZGRyOworCisJd3JpdGVsKGRhWzBdIDw8IDggfCBkYVsxXSwgJnJlZ3MtPk1hY0FkZHJIaSk7CisJd3JpdGVsKChkYVsyXSA8PCAyNCkgfCAoZGFbM10gPDwgMTYpIHwgKGRhWzRdIDw8IDgpIHwgZGFbNV0sCisJICAgICAgICZyZWdzLT5NYWNBZGRyTG8pOworCisJY21kLmV2dCA9IENfU0VUX01BQ19BRERSOworCWNtZC5jb2RlID0gMDsKKwljbWQuaWR4ID0gMDsKKwlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgYWNlX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisJc3RydWN0IGNtZCBjbWQ7CisKKwlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpICYmICEoYXAtPm1jYXN0X2FsbCkpIHsKKwkJY21kLmV2dCA9IENfU0VUX01VTFRJQ0FTVF9NT0RFOworCQljbWQuY29kZSA9IENfQ19NQ0FTVF9FTkFCTEU7CisJCWNtZC5pZHggPSAwOworCQlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworCQlhcC0+bWNhc3RfYWxsID0gMTsKKwl9IGVsc2UgaWYgKGFwLT5tY2FzdF9hbGwpIHsKKwkJY21kLmV2dCA9IENfU0VUX01VTFRJQ0FTVF9NT0RFOworCQljbWQuY29kZSA9IENfQ19NQ0FTVF9ESVNBQkxFOworCQljbWQuaWR4ID0gMDsKKwkJYWNlX2lzc3VlX2NtZChyZWdzLCAmY21kKTsKKwkJYXAtPm1jYXN0X2FsbCA9IDA7CisJfQorCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICYmICEoYXAtPnByb21pc2MpKSB7CisJCWNtZC5ldnQgPSBDX1NFVF9QUk9NSVNDX01PREU7CisJCWNtZC5jb2RlID0gQ19DX1BST01JU0NfRU5BQkxFOworCQljbWQuaWR4ID0gMDsKKwkJYWNlX2lzc3VlX2NtZChyZWdzLCAmY21kKTsKKwkJYXAtPnByb21pc2MgPSAxOworCX1lbHNlIGlmICghKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgJiYgKGFwLT5wcm9taXNjKSkgeworCQljbWQuZXZ0ID0gQ19TRVRfUFJPTUlTQ19NT0RFOworCQljbWQuY29kZSA9IENfQ19QUk9NSVNDX0RJU0FCTEU7CisJCWNtZC5pZHggPSAwOworCQlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworCQlhcC0+cHJvbWlzYyA9IDA7CisJfQorCisJLyoKKwkgKiBGb3IgdGhlIHRpbWUgYmVpbmcgbXVsdGljYXN0IHJlbGllcyBvbiB0aGUgdXBwZXIgbGF5ZXJzCisJICogZmlsdGVyaW5nIGl0IHByb3Blcmx5LiBUaGUgRmlybXdhcmUgZG9lcyBub3QgYWxsb3cgb25lIHRvCisJICogc2V0IHRoZSBlbnRpcmUgbXVsdGljYXN0IGxpc3QgYXQgYSB0aW1lIGFuZCBrZWVwaW5nIHRyYWNrIG9mCisJICogaXQgaGVyZSBpcyBnb2luZyB0byBiZSBtZXNzeS4KKwkgKi8KKwlpZiAoKGRldi0+bWNfY291bnQpICYmICEoYXAtPm1jYXN0X2FsbCkpIHsKKwkJY21kLmV2dCA9IENfU0VUX01VTFRJQ0FTVF9NT0RFOworCQljbWQuY29kZSA9IENfQ19NQ0FTVF9FTkFCTEU7CisJCWNtZC5pZHggPSAwOworCQlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworCX1lbHNlIGlmICghYXAtPm1jYXN0X2FsbCkgeworCQljbWQuZXZ0ID0gQ19TRVRfTVVMVElDQVNUX01PREU7CisJCWNtZC5jb2RlID0gQ19DX01DQVNUX0RJU0FCTEU7CisJCWNtZC5pZHggPSAwOworCQlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworCX0KK30KKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFjZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWNlX21hY19zdGF0cyBfX2lvbWVtICptYWNfc3RhdHMgPQorCQkoc3RydWN0IGFjZV9tYWNfc3RhdHMgX19pb21lbSAqKWFwLT5yZWdzLT5TdGF0czsKKworCWFwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gcmVhZGwoJm1hY19zdGF0cy0+ZHJvcF9zcGFjZSk7CisJYXAtPnN0YXRzLm11bHRpY2FzdCA9IHJlYWRsKCZtYWNfc3RhdHMtPmtlcHRfbWMpOworCWFwLT5zdGF0cy5jb2xsaXNpb25zID0gcmVhZGwoJm1hY19zdGF0cy0+Y29sbCk7CisKKwlyZXR1cm4gJmFwLT5zdGF0czsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYWNlX2NvcHkoc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MsIHZvaWQgKnNyYywKKwkJCSAgICB1MzIgZGVzdCwgaW50IHNpemUpCit7CisJdm9pZCBfX2lvbWVtICp0ZGVzdDsKKwl1MzIgKndzcmM7CisJc2hvcnQgdHNpemUsIGk7CisKKwlpZiAoc2l6ZSA8PSAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJdHNpemUgPSBtaW5fdCh1MzIsICgofmRlc3QgJiAoQUNFX1dJTkRPV19TSVpFIC0gMSkpICsgMSksCisJCQkgICAgbWluX3QodTMyLCBzaXplLCBBQ0VfV0lORE9XX1NJWkUpKTsKKwkJdGRlc3QgPSAodm9pZCBfX2lvbWVtICopICZyZWdzLT5XaW5kb3cgKyAKKwkJCShkZXN0ICYgKEFDRV9XSU5ET1dfU0laRSAtIDEpKTsKKwkJd3JpdGVsKGRlc3QgJiB+KEFDRV9XSU5ET1dfU0laRSAtIDEpLCAmcmVncy0+V2luQmFzZSk7CisJCS8qCisJCSAqIFRoaXMgcmVxdWlyZXMgYnl0ZSBzd2FwcGluZyBvbiBiaWcgZW5kaWFuLCBob3dldmVyCisJCSAqIHdyaXRlbCBkb2VzIHRoYXQgZm9yIHVzCisJCSAqLworCQl3c3JjID0gc3JjOworCQlmb3IgKGkgPSAwOyBpIDwgKHRzaXplIC8gNCk7IGkrKykgeworCQkJd3JpdGVsKHdzcmNbaV0sIHRkZXN0ICsgaSo0KTsKKwkJfQorCQlkZXN0ICs9IHRzaXplOworCQlzcmMgKz0gdHNpemU7CisJCXNpemUgLT0gdHNpemU7CisJfQorCisJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhY2VfY2xlYXIoc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MsIHUzMiBkZXN0LCBpbnQgc2l6ZSkKK3sKKwl2b2lkIF9faW9tZW0gKnRkZXN0OworCXNob3J0IHRzaXplID0gMCwgaTsKKworCWlmIChzaXplIDw9IDApCisJCXJldHVybjsKKworCXdoaWxlIChzaXplID4gMCkgeworCQl0c2l6ZSA9IG1pbl90KHUzMiwgKCh+ZGVzdCAmIChBQ0VfV0lORE9XX1NJWkUgLSAxKSkgKyAxKSwKKwkJCQltaW5fdCh1MzIsIHNpemUsIEFDRV9XSU5ET1dfU0laRSkpOworCQl0ZGVzdCA9ICh2b2lkIF9faW9tZW0gKikgJnJlZ3MtPldpbmRvdyArIAorCQkJKGRlc3QgJiAoQUNFX1dJTkRPV19TSVpFIC0gMSkpOworCQl3cml0ZWwoZGVzdCAmIH4oQUNFX1dJTkRPV19TSVpFIC0gMSksICZyZWdzLT5XaW5CYXNlKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgKHRzaXplIC8gNCk7IGkrKykgeworCQkJd3JpdGVsKDAsIHRkZXN0ICsgaSo0KTsKKwkJfQorCisJCWRlc3QgKz0gdHNpemU7CisJCXNpemUgLT0gdHNpemU7CisJfQorCisJcmV0dXJuOworfQorCisKKy8qCisgKiBEb3dubG9hZCB0aGUgZmlybXdhcmUgaW50byB0aGUgU1JBTSBvbiB0aGUgTklDCisgKgorICogVGhpcyBvcGVyYXRpb24gcmVxdWlyZXMgdGhlIE5JQyB0byBiZSBoYWx0ZWQgYW5kIGlzIHBlcmZvcm1lZCB3aXRoCisgKiBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCB3aXRoIHRoZSBzcGlubG9jayBob2xkLgorICovCitpbnQgX19kZXZpbml0IGFjZV9sb2FkX2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFjZV9wcml2YXRlICphcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MgPSBhcC0+cmVnczsKKworCWlmICghKHJlYWRsKCZyZWdzLT5DcHVDdHJsKSAmIENQVV9IQUxURUQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyeWluZyB0byBkb3dubG9hZCBmaXJtd2FyZSB3aGlsZSB0aGUgIgorCQkgICAgICAgIkNQVSBpcyBydW5uaW5nIVxuIiwgYXAtPm5hbWUpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKgorCSAqIERvIG5vdCB0cnkgdG8gY2xlYXIgbW9yZSB0aGFuIDUxMktCIG9yIHdlIGVuZCB1cCBzZWVpbmcKKwkgKiBmdW5ueSB0aGluZ3Mgb24gTklDcyB3aXRoIG9ubHkgNTEyS0IgU1JBTQorCSAqLworCWFjZV9jbGVhcihyZWdzLCAweDIwMDAsIDB4ODAwMDAtMHgyMDAwKTsKKwlpZiAoQUNFX0lTX1RJR09OX0koYXApKSB7CisJCWFjZV9jb3B5KHJlZ3MsIHRpZ29uRndUZXh0LCB0aWdvbkZ3VGV4dEFkZHIsIHRpZ29uRndUZXh0TGVuKTsKKwkJYWNlX2NvcHkocmVncywgdGlnb25Gd0RhdGEsIHRpZ29uRndEYXRhQWRkciwgdGlnb25Gd0RhdGFMZW4pOworCQlhY2VfY29weShyZWdzLCB0aWdvbkZ3Um9kYXRhLCB0aWdvbkZ3Um9kYXRhQWRkciwKKwkJCSB0aWdvbkZ3Um9kYXRhTGVuKTsKKwkJYWNlX2NsZWFyKHJlZ3MsIHRpZ29uRndCc3NBZGRyLCB0aWdvbkZ3QnNzTGVuKTsKKwkJYWNlX2NsZWFyKHJlZ3MsIHRpZ29uRndTYnNzQWRkciwgdGlnb25Gd1Nic3NMZW4pOworCX1lbHNlIGlmIChhcC0+dmVyc2lvbiA9PSAyKSB7CisJCWFjZV9jbGVhcihyZWdzLCB0aWdvbjJGd0Jzc0FkZHIsIHRpZ29uMkZ3QnNzTGVuKTsKKwkJYWNlX2NsZWFyKHJlZ3MsIHRpZ29uMkZ3U2Jzc0FkZHIsIHRpZ29uMkZ3U2Jzc0xlbik7CisJCWFjZV9jb3B5KHJlZ3MsIHRpZ29uMkZ3VGV4dCwgdGlnb24yRndUZXh0QWRkcix0aWdvbjJGd1RleHRMZW4pOworCQlhY2VfY29weShyZWdzLCB0aWdvbjJGd1JvZGF0YSwgdGlnb24yRndSb2RhdGFBZGRyLAorCQkJIHRpZ29uMkZ3Um9kYXRhTGVuKTsKKwkJYWNlX2NvcHkocmVncywgdGlnb24yRndEYXRhLCB0aWdvbjJGd0RhdGFBZGRyLHRpZ29uMkZ3RGF0YUxlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFRoZSBlZXByb20gb24gdGhlIEFjZU5JQyBpcyBhbiBBdG1lbCBpMmMgRUVQUk9NLgorICoKKyAqIEFjY2Vzc2luZyB0aGUgRUVQUk9NIGlzIGBpbnRlcmVzdGluZycgdG8gc2F5IHRoZSBsZWFzdCAtIGRvbid0IHJlYWQKKyAqIHRoaXMgY29kZSByaWdodCBhZnRlciBkaW5uZXIuCisgKgorICogVGhpcyBpcyBhbGwgYWJvdXQgYmxhY2sgbWFnaWMgYW5kIGJpdC1iYW5naW5nIHRoZSBkZXZpY2UgLi4uLiBJCisgKiB3b25kZXIgaW4gd2hhdCBob3NwaXRhbCB0aGV5IGhhdmUgcHV0IHRoZSBndXkgd2hvIGRlc2lnbmVkIHRoZSBpMmMKKyAqIHNwZWNzLgorICoKKyAqIE9oIHllcywgdGhpcyBpcyBvbmx5IHRoZSBiZWdpbm5pbmchCisgKgorICogVGhhbmtzIHRvIFN0ZXZhcmlubyBXZWJpbnNraSBmb3IgaGVscGluZyB0cmFja2luZyBkb3duIHRoZSBidWdzIGluIHRoZQorICogY29kZSBpMmMgcmVhZG91dCBjb2RlIGJ5IGJldGEgdGVzdGluZyBhbGwgbXkgaGFja3MuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBlZXByb21fc3RhcnQoc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MpCit7CisJdTMyIGxvY2FsOworCisJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJdWRlbGF5KEFDRV9TSE9SVF9ERUxBWSk7CisJbG9jYWwgPSByZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwlsb2NhbCB8PSBFRVBST01fREFUQV9PVVQgfCBFRVBST01fV1JJVEVfRU5BQkxFOworCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJbWIoKTsKKwl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwlsb2NhbCB8PSBFRVBST01fQ0xLX09VVDsKKwl3cml0ZWwobG9jYWwsICZyZWdzLT5Mb2NhbEN0cmwpOworCXJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCW1iKCk7CisJdWRlbGF5KEFDRV9TSE9SVF9ERUxBWSk7CisJbG9jYWwgJj0gfkVFUFJPTV9EQVRBX09VVDsKKwl3cml0ZWwobG9jYWwsICZyZWdzLT5Mb2NhbEN0cmwpOworCXJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCW1iKCk7CisJdWRlbGF5KEFDRV9TSE9SVF9ERUxBWSk7CisJbG9jYWwgJj0gfkVFUFJPTV9DTEtfT1VUOworCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJbWIoKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZWVwcm9tX3ByZXAoc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MsIHU4IG1hZ2ljKQoreworCXNob3J0IGk7CisJdTMyIGxvY2FsOworCisJdWRlbGF5KEFDRV9TSE9SVF9ERUxBWSk7CisJbG9jYWwgPSByZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwlsb2NhbCAmPSB+RUVQUk9NX0RBVEFfT1VUOworCWxvY2FsIHw9IEVFUFJPTV9XUklURV9FTkFCTEU7CisJd3JpdGVsKGxvY2FsLCAmcmVncy0+TG9jYWxDdHJsKTsKKwlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwltYigpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgbWFnaWMgPDw9IDEpIHsKKwkJdWRlbGF5KEFDRV9TSE9SVF9ERUxBWSk7CisJCWlmIChtYWdpYyAmIDB4ODApIAorCQkJbG9jYWwgfD0gRUVQUk9NX0RBVEFfT1VUOworCQllbHNlCisJCQlsb2NhbCAmPSB+RUVQUk9NX0RBVEFfT1VUOworCQl3cml0ZWwobG9jYWwsICZyZWdzLT5Mb2NhbEN0cmwpOworCQlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwkJbWIoKTsKKworCQl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwkJbG9jYWwgfD0gRUVQUk9NX0NMS19PVVQ7CisJCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJCXJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCQltYigpOworCQl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwkJbG9jYWwgJj0gfihFRVBST01fQ0xLX09VVCB8IEVFUFJPTV9EQVRBX09VVCk7CisJCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJCXJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCQltYigpOworCX0KK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlZXByb21fY2hlY2tfYWNrKHN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzKQoreworCWludCBzdGF0ZTsKKwl1MzIgbG9jYWw7CisKKwlsb2NhbCA9IHJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCWxvY2FsICY9IH5FRVBST01fV1JJVEVfRU5BQkxFOworCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJbWIoKTsKKwl1ZGVsYXkoQUNFX0xPTkdfREVMQVkpOworCWxvY2FsIHw9IEVFUFJPTV9DTEtfT1VUOworCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJbWIoKTsKKwl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwkvKiBzYW1wbGUgZGF0YSBpbiBtaWRkbGUgb2YgaGlnaCBjbGsgKi8KKwlzdGF0ZSA9IChyZWFkbCgmcmVncy0+TG9jYWxDdHJsKSAmIEVFUFJPTV9EQVRBX0lOKSAhPSAwOworCXVkZWxheShBQ0VfU0hPUlRfREVMQVkpOworCW1iKCk7CisJd3JpdGVsKHJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpICYgfkVFUFJPTV9DTEtfT1VULCAmcmVncy0+TG9jYWxDdHJsKTsKKwlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwltYigpOworCisJcmV0dXJuIHN0YXRlOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBlZXByb21fc3RvcChzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncykKK3sKKwl1MzIgbG9jYWw7CisKKwl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwlsb2NhbCA9IHJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCWxvY2FsIHw9IEVFUFJPTV9XUklURV9FTkFCTEU7CisJd3JpdGVsKGxvY2FsLCAmcmVncy0+TG9jYWxDdHJsKTsKKwlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwltYigpOworCXVkZWxheShBQ0VfU0hPUlRfREVMQVkpOworCWxvY2FsICY9IH5FRVBST01fREFUQV9PVVQ7CisJd3JpdGVsKGxvY2FsLCAmcmVncy0+TG9jYWxDdHJsKTsKKwlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwltYigpOworCXVkZWxheShBQ0VfU0hPUlRfREVMQVkpOworCWxvY2FsIHw9IEVFUFJPTV9DTEtfT1VUOworCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJbWIoKTsKKwl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwlsb2NhbCB8PSBFRVBST01fREFUQV9PVVQ7CisJd3JpdGVsKGxvY2FsLCAmcmVncy0+TG9jYWxDdHJsKTsKKwlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwltYigpOworCXVkZWxheShBQ0VfTE9OR19ERUxBWSk7CisJbG9jYWwgJj0gfkVFUFJPTV9DTEtfT1VUOworCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJbWIoKTsKK30KKworCisvKgorICogUmVhZCBhIHdob2xlIGJ5dGUgZnJvbSB0aGUgRUVQUk9NLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCByZWFkX2VlcHJvbV9ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJc3RydWN0IGFjZV9wcml2YXRlICphcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MgPSBhcC0+cmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBsb2NhbDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzaG9ydCBpOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyBkZXZpY2UhXG4iKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBEb24ndCB0YWtlIGludGVycnVwdHMgb24gdGhpcyBDUFUgd2lsbCBiaXQgYmFuZ2luZworCSAqIHRoZSAlIyUjQCQgSTJDIGRldmljZQorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWVlcHJvbV9zdGFydChyZWdzKTsKKworCWVlcHJvbV9wcmVwKHJlZ3MsIEVFUFJPTV9XUklURV9TRUxFQ1QpOworCWlmIChlZXByb21fY2hlY2tfYWNrKHJlZ3MpKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHN5bmMgZWVwcm9tXG4iLCBhcC0+bmFtZSk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZWVwcm9tX3JlYWRfZXJyb3I7CisJfQorCisJZWVwcm9tX3ByZXAocmVncywgKG9mZnNldCA+PiA4KSAmIDB4ZmYpOworCWlmIChlZXByb21fY2hlY2tfYWNrKHJlZ3MpKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHNldCBhZGRyZXNzIGJ5dGUgMFxuIiwKKwkJICAgICAgIGFwLT5uYW1lKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBlZXByb21fcmVhZF9lcnJvcjsKKwl9CisKKwllZXByb21fcHJlcChyZWdzLCBvZmZzZXQgJiAweGZmKTsKKwlpZiAoZWVwcm9tX2NoZWNrX2FjayhyZWdzKSkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBzZXQgYWRkcmVzcyBieXRlIDFcbiIsCisJCSAgICAgICBhcC0+bmFtZSk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZWVwcm9tX3JlYWRfZXJyb3I7CisJfQorCisJZWVwcm9tX3N0YXJ0KHJlZ3MpOworCWVlcHJvbV9wcmVwKHJlZ3MsIEVFUFJPTV9SRUFEX1NFTEVDVCk7CisJaWYgKGVlcHJvbV9jaGVja19hY2socmVncykpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gc2V0IFJFQURfU0VMRUNUXG4iLAorCQkgICAgICAgYXAtPm5hbWUpOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGVlcHJvbV9yZWFkX2Vycm9yOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJbG9jYWwgPSByZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwkJbG9jYWwgJj0gfkVFUFJPTV9XUklURV9FTkFCTEU7CisJCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJCXJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCQl1ZGVsYXkoQUNFX0xPTkdfREVMQVkpOworCQltYigpOworCQlsb2NhbCB8PSBFRVBST01fQ0xLX09VVDsKKwkJd3JpdGVsKGxvY2FsLCAmcmVncy0+TG9jYWxDdHJsKTsKKwkJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJCW1iKCk7CisJCXVkZWxheShBQ0VfU0hPUlRfREVMQVkpOworCQkvKiBzYW1wbGUgZGF0YSBtaWQgaGlnaCBjbGsgKi8KKwkJcmVzdWx0ID0gKHJlc3VsdCA8PCAxKSB8CisJCQkoKHJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpICYgRUVQUk9NX0RBVEFfSU4pICE9IDApOworCQl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwkJbWIoKTsKKwkJbG9jYWwgPSByZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwkJbG9jYWwgJj0gfkVFUFJPTV9DTEtfT1VUOworCQl3cml0ZWwobG9jYWwsICZyZWdzLT5Mb2NhbEN0cmwpOworCQlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwkJdWRlbGF5KEFDRV9TSE9SVF9ERUxBWSk7CisJCW1iKCk7CisJCWlmIChpID09IDcpIHsKKwkJCWxvY2FsIHw9IEVFUFJPTV9XUklURV9FTkFCTEU7CisJCQl3cml0ZWwobG9jYWwsICZyZWdzLT5Mb2NhbEN0cmwpOworCQkJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJCQltYigpOworCQkJdWRlbGF5KEFDRV9TSE9SVF9ERUxBWSk7CisJCX0KKwl9CisKKwlsb2NhbCB8PSBFRVBST01fREFUQV9PVVQ7CisJd3JpdGVsKGxvY2FsLCAmcmVncy0+TG9jYWxDdHJsKTsKKwlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwltYigpOworCXVkZWxheShBQ0VfU0hPUlRfREVMQVkpOworCXdyaXRlbChyZWFkbCgmcmVncy0+TG9jYWxDdHJsKSB8IEVFUFJPTV9DTEtfT1VULCAmcmVncy0+TG9jYWxDdHJsKTsKKwlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwl1ZGVsYXkoQUNFX0xPTkdfREVMQVkpOworCXdyaXRlbChyZWFkbCgmcmVncy0+TG9jYWxDdHJsKSAmIH5FRVBST01fQ0xLX09VVCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJbWIoKTsKKwl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwllZXByb21fc3RvcChyZWdzKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyBvdXQ6CisJcmV0dXJuIHJlc3VsdDsKKworIGVlcHJvbV9yZWFkX2Vycm9yOgorCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byByZWFkIGVlcHJvbSBieXRlIDB4JTAybHhcbiIsCisJICAgICAgIGFwLT5uYW1lLCBvZmZzZXQpOworCWdvdG8gb3V0OworfQorCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX1NNUF9fIC1EX19LRVJORUxfXyAtRE1PRFVMRSAtSS4uLy4uL2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLXBpcGUgLWZuby1zdHJlbmd0aC1yZWR1Y2UgLURNT0RWRVJTSU9OUyAtaW5jbHVkZSAuLi8uLi9pbmNsdWRlL2xpbnV4L21vZHZlcnNpb25zLmggICAtYyAtbyBhY2VuaWMubyBhY2VuaWMuYyIKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYWNlbmljLmggYi9kcml2ZXJzL25ldC9hY2VuaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTcxMDcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYWNlbmljLmgKQEAgLTAsMCArMSw3OTQgQEAKKyNpZm5kZWYgX0FDRU5JQ19IXworI2RlZmluZSBfQUNFTklDX0hfCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworLyoKKyAqIEdlbmVyYXRlIFRYIGluZGV4IHVwZGF0ZSBlYWNoIHRpbWUsIHdoZW4gVFggcmluZyBpcyBjbG9zZWQuCisgKiBOb3JtYWxseSwgdGhpcyBpcyBub3QgdXNlZnVsLCBiZWNhdXNlIHJlc3VsdHMgaW4gbW9yZSBkbWEgKGFuZCBpcnFzCisgKiB3aXRob3V0IFRYX0NPQUxfSU5UU19PTkxZKS4KKyAqLworI2RlZmluZSBVU0VfVFhfQ09BTF9OT1cJIDAKKworLyoKKyAqIEFkZHJlc3Npbmc6CisgKgorICogVGhlIFRpZ29uIHVzZXMgNjQtYml0IGhvc3QgYWRkcmVzc2VzLCByZWdhcmRsZXNzIG9mIHRoZWlyIGFjdHVhbAorICogbGVuZ3RoLCBhbmQgaXQgZXhwZWN0cyBhIGJpZy1lbmRpYW4gZm9ybWF0LiBGb3IgMzIgYml0IHN5c3RlbXMgdGhlCisgKiB1cHBlciAzMiBiaXRzIG9mIHRoZSBhZGRyZXNzIGFyZSBzaW1wbHkgaWdub3JlZCAoemVybyksIGhvd2V2ZXIgZm9yCisgKiBsaXR0bGUgZW5kaWFuIDY0IGJpdCBzeXN0ZW1zIChBbHBoYSkgdGhpcyBsb29rcyBzdHJhbmdlIHdpdGggdGhlCisgKiB0d28gcGFydHMgb2YgdGhlIGFkZHJlc3Mgd29yZCBiZWluZyBzd2FwcGVkLgorICoKKyAqIFRoZSBhZGRyZXNzZXMgYXJlIHNwbGl0IGluIHR3byAzMiBiaXQgd29yZHMgZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisgKiBhcyBzb21lIG9mIHRoZW0gYXJlIGluIFBDSSBzaGFyZWQgbWVtb3J5IGFuZCBpdCBpcyBuZWNlc3NhcnkgdG8gdXNlCisgKiByZWFkbC93cml0ZWwgdG8gYWNjZXNzIHRoZW0uCisgKgorICogVGhlIGFkZHJlc3NpbmcgY29kZSBpcyBkZXJpdmVkIGZyb20gUGV0ZSBXeWNrb2ZmJ3Mgd29yaywgYnV0CisgKiBtb2RpZmllZCB0byBkZWFsIHByb3Blcmx5IHdpdGggcmVhZGwvd3JpdGVsIHVzYWdlLgorICovCisKK3N0cnVjdCBhY2VfcmVncyB7CisJdTMyCXBhZDBbMTZdOwkvKiBQQ0kgY29udHJvbCByZWdpc3RlcnMgKi8KKworCXUzMglIb3N0Q3RybDsJLyogMHg0MCAqLworCXUzMglMb2NhbEN0cmw7CisKKwl1MzIJcGFkMVsyXTsKKworCXUzMglNaXNjQ2ZnOwkvKiAweDUwICovCisKKwl1MzIJcGFkMlsyXTsKKworCXUzMglQY2lTdGF0ZTsKKworCXUzMglwYWQzWzJdOwkvKiAweDYwICovCisKKwl1MzIJV2luQmFzZTsKKwl1MzIJV2luRGF0YTsKKworCXUzMglwYWQ0WzEyXTsJLyogMHg3MCAqLworCisJdTMyCURtYVdyaXRlU3RhdGU7CS8qIDB4YTAgKi8KKwl1MzIJcGFkNVszXTsKKwl1MzIJRG1hUmVhZFN0YXRlOwkvKiAweGIwICovCisKKwl1MzIJcGFkNlsyNl07CisKKwl1MzIJQXNzaXN0U3RhdGU7CisKKwl1MzIJcGFkN1s4XTsJLyogMHgxMjAgKi8KKworCXUzMglDcHVDdHJsOwkvKiAweDE0MCAqLworCXUzMglQYzsKKworCXUzMglwYWQ4WzNdOworCisJdTMyCVNyYW1BZGRyOwkvKiAweDE1NCAqLworCXUzMglTcmFtRGF0YTsKKworCXUzMglwYWQ5WzQ5XTsKKworCXUzMglNYWNSeFN0YXRlOwkvKiAweDIyMCAqLworCisJdTMyCXBhZDEwWzddOworCisJdTMyCUNwdUJDdHJsOwkvKiAweDI0MCAqLworCXUzMglQY0I7CisKKwl1MzIJcGFkMTFbM107CisKKwl1MzIJU3JhbUJBZGRyOwkvKiAweDI1NCAqLworCXUzMglTcmFtQkRhdGE7CisKKwl1MzIJcGFkMTJbMTA1XTsKKworCXUzMglwYWQxM1szMl07CS8qIDB4NDAwICovCisJdTMyCVN0YXRzWzMyXTsKKworCXUzMglNYjBIaTsJCS8qIDB4NTAwICovCisJdTMyCU1iMExvOworCXUzMglNYjFIaTsKKwl1MzIJQ21kUHJkOworCXUzMglNYjJIaTsKKwl1MzIJVHhQcmQ7CisJdTMyCU1iM0hpOworCXUzMglSeFN0ZFByZDsKKwl1MzIJTWI0SGk7CisJdTMyCVJ4SnVtYm9QcmQ7CisJdTMyCU1iNUhpOworCXUzMglSeE1pbmlQcmQ7CisJdTMyCU1iNkhpOworCXUzMglNYjZMbzsKKwl1MzIJTWI3SGk7CisJdTMyCU1iN0xvOworCXUzMglNYjhIaTsKKwl1MzIJTWI4TG87CisJdTMyCU1iOUhpOworCXUzMglNYjlMbzsKKwl1MzIJTWJBSGk7CisJdTMyCU1iQUxvOworCXUzMglNYkJIaTsKKwl1MzIJTWJCTG87CisJdTMyCU1iQ0hpOworCXUzMglNYkNMbzsKKwl1MzIJTWJESGk7CisJdTMyCU1iRExvOworCXUzMglNYkVIaTsKKwl1MzIJTWJFTG87CisJdTMyCU1iRkhpOworCXUzMglNYkZMbzsKKworCXUzMglwYWQxNFszMl07CisKKwl1MzIJTWFjQWRkckhpOwkvKiAweDYwMCAqLworCXUzMglNYWNBZGRyTG87CisJdTMyCUluZm9QdHJIaTsKKwl1MzIJSW5mb1B0ckxvOworCXUzMglNdWx0aUNhc3RIaTsJLyogMHg2MTAgKi8KKwl1MzIJTXVsdGlDYXN0TG87CisJdTMyCU1vZGVTdGF0OworCXUzMglEbWFSZWFkQ2ZnOworCXUzMglEbWFXcml0ZUNmZzsJLyogMHg2MjAgKi8KKwl1MzIJVHhCdWZSYXQ7CisJdTMyCUV2dENzbTsKKwl1MzIJQ21kQ3NtOworCXUzMglUdW5lUnhDb2FsVGlja3M7LyogMHg2MzAgKi8KKwl1MzIJVHVuZVR4Q29hbFRpY2tzOworCXUzMglUdW5lU3RhdFRpY2tzOworCXUzMglUdW5lTWF4VHhEZXNjOworCXUzMglUdW5lTWF4UnhEZXNjOwkvKiAweDY0MCAqLworCXUzMglUdW5lVHJhY2U7CisJdTMyCVR1bmVMaW5rOworCXUzMglUdW5lRmFzdExpbms7CisJdTMyCVRyYWNlUHRyOwkvKiAweDY1MCAqLworCXUzMglUcmFjZVN0cnQ7CisJdTMyCVRyYWNlTGVuOworCXUzMglJZklkeDsKKwl1MzIJSWZNdHU7CQkvKiAweDY2MCAqLworCXUzMglNYXNrSW50OworCXUzMglHaWdMbmtTdGF0ZTsKKwl1MzIJRmFzdExua1N0YXRlOworCXUzMglwYWQxNls0XTsJLyogMHg2NzAgKi8KKwl1MzIJUnhSZXRDc207CS8qIDB4NjgwICovCisKKwl1MzIJcGFkMTdbMzFdOworCisJdTMyCUNtZFJuZ1s2NF07CS8qIDB4NzAwICovCisJdTMyCVdpbmRvd1sweDIwMF07Cit9OworCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgYWRkcmhpOworCXUzMiBhZGRybG87Cit9IGFjZWFkZHI7CisKKworI2RlZmluZSBBQ0VfV0lORE9XX1NJWkUJMHg4MDAKKworI2RlZmluZSBBQ0VfSlVNQk9fTVRVIDkwMDAKKyNkZWZpbmUgQUNFX1NURF9NVFUgMTUwMAorCisjZGVmaW5lIEFDRV9UUkFDRV9TSVpFIDB4ODAwMAorCisvKgorICogSG9zdCBjb250cm9sIHJlZ2lzdGVyIGJpdHMuCisgKi8KKwkKKyNkZWZpbmUgSU5fSU5UCQkweDAxCisjZGVmaW5lIENMUl9JTlQJCTB4MDIKKyNkZWZpbmUgSFdfUkVTRVQJMHgwOAorI2RlZmluZSBCWVRFX1NXQVAJMHgxMAorI2RlZmluZSBXT1JEX1NXQVAJMHgyMAorI2RlZmluZSBNQVNLX0lOVFMJMHg0MAorCisvKgorICogTG9jYWwgY29udHJvbCByZWdpc3RlciBiaXRzLgorICovCisKKyNkZWZpbmUgRUVQUk9NX0RBVEFfSU4JCTB4ODAwMDAwCisjZGVmaW5lIEVFUFJPTV9EQVRBX09VVAkJMHg0MDAwMDAKKyNkZWZpbmUgRUVQUk9NX1dSSVRFX0VOQUJMRQkweDIwMDAwMAorI2RlZmluZSBFRVBST01fQ0xLX09VVAkJMHgxMDAwMDAKKworI2RlZmluZSBFRVBST01fQkFTRQkJMHhhMDAwMDAwMAorCisjZGVmaW5lIEVFUFJPTV9XUklURV9TRUxFQ1QJMHhhMAorI2RlZmluZSBFRVBST01fUkVBRF9TRUxFQ1QJMHhhMQorCisjZGVmaW5lIFNSQU1fQkFOS181MTJLCQkweDIwMAorCisKKy8qCisgKiB1ZGVsYXkoKSB2YWx1ZXMgZm9yIHdoZW4gY2xvY2tpbmcgdGhlIGVlcHJvbQorICovCisjZGVmaW5lIEFDRV9TSE9SVF9ERUxBWQkJMgorI2RlZmluZSBBQ0VfTE9OR19ERUxBWQkJNAorCisKKy8qCisgKiBNaXNjIENvbmZpZyBiaXRzCisgKi8KKworI2RlZmluZSBTWU5DX1NSQU1fVElNSU5HCTB4MTAwMDAwCisKKworLyoKKyAqIENQVSBzdGF0ZSBiaXRzLgorICovCisKKyNkZWZpbmUgQ1BVX1JFU0VUCQkweDAxCisjZGVmaW5lIENQVV9UUkFDRQkJMHgwMgorI2RlZmluZSBDUFVfUFJPTV9GQUlMRUQJCTB4MTAKKyNkZWZpbmUgQ1BVX0hBTFQJCTB4MDAwMTAwMDAKKyNkZWZpbmUgQ1BVX0hBTFRFRAkJMHhmZmZmMDAwMAorCisKKy8qCisgKiBQQ0kgU3RhdGUgYml0cy4KKyAqLworCisjZGVmaW5lIERNQV9SRUFEX01BWF80CQkweDA0CisjZGVmaW5lIERNQV9SRUFEX01BWF8xNgkJMHgwOAorI2RlZmluZSBETUFfUkVBRF9NQVhfMzIJCTB4MGMKKyNkZWZpbmUgRE1BX1JFQURfTUFYXzY0CQkweDEwCisjZGVmaW5lIERNQV9SRUFEX01BWF8xMjgJMHgxNAorI2RlZmluZSBETUFfUkVBRF9NQVhfMjU2CTB4MTgKKyNkZWZpbmUgRE1BX1JFQURfTUFYXzFLCQkweDFjCisjZGVmaW5lIERNQV9XUklURV9NQVhfNAkJMHgyMAorI2RlZmluZSBETUFfV1JJVEVfTUFYXzE2CTB4NDAKKyNkZWZpbmUgRE1BX1dSSVRFX01BWF8zMgkweDYwCisjZGVmaW5lIERNQV9XUklURV9NQVhfNjQJMHg4MAorI2RlZmluZSBETUFfV1JJVEVfTUFYXzEyOAkweGEwCisjZGVmaW5lIERNQV9XUklURV9NQVhfMjU2CTB4YzAKKyNkZWZpbmUgRE1BX1dSSVRFX01BWF8xSwkweGUwCisjZGVmaW5lIERNQV9SRUFEX1dSSVRFX01BU0sJMHhmYworI2RlZmluZSBNRU1fUkVBRF9NVUxUSVBMRQkweDAwMDIwMDAwCisjZGVmaW5lIFBDSV82Nk1IWgkJMHgwMDA4MDAwMAorI2RlZmluZSBQQ0lfMzJCSVQJCTB4MDAxMDAwMDAKKyNkZWZpbmUgRE1BX1dSSVRFX0FMTF9BTElHTgkweDAwODAwMDAwCisjZGVmaW5lIFJFQURfQ01EX01FTQkJMHgwNjAwMDAwMAorI2RlZmluZSBXUklURV9DTURfTUVNCQkweDcwMDAwMDAwCisKKworLyoKKyAqIE1vZGUgc3RhdHVzCisgKi8KKworI2RlZmluZSBBQ0VfQllURV9TV0FQX0JECTB4MDIKKyNkZWZpbmUgQUNFX1dPUkRfU1dBUF9CRAkweDA0CQkvKiBub3QgYWN0dWFsbHkgdXNlZCAqLworI2RlZmluZSBBQ0VfV0FSTgkJMHgwOAorI2RlZmluZSBBQ0VfQllURV9TV0FQX0RNQQkweDEwCisjZGVmaW5lIEFDRV9OT19KVU1CT19GUkFHCTB4MjAwCisjZGVmaW5lIEFDRV9GQVRBTAkJMHg0MDAwMDAwMAorCisKKy8qCisgKiBETUEgY29uZmlnCisgKi8KKworI2RlZmluZSBETUFfVEhSRVNIXzFXCQkweDEwCisjZGVmaW5lIERNQV9USFJFU0hfMlcJCTB4MjAKKyNkZWZpbmUgRE1BX1RIUkVTSF80VwkJMHg0MAorI2RlZmluZSBETUFfVEhSRVNIXzhXCQkweDgwCisjZGVmaW5lIERNQV9USFJFU0hfMTZXCQkweDEwMAorI2RlZmluZSBETUFfVEhSRVNIXzMyVwkJMHgwCS8qIG5vdCBkZXNjcmliZWQgaW4gZG9jLCBidXQgZXhpc3RzLiAqLworCisKKy8qCisgKiBUdW5pbmcgcGFyYW1ldGVycworICovCisKKyNkZWZpbmUgVElDS1NfUEVSX1NFQwkJMTAwMDAwMAorCisKKy8qCisgKiBMaW5rIGJpdHMKKyAqLworCisjZGVmaW5lIExOS19QUkVGCQkweDAwMDA4MDAwCisjZGVmaW5lIExOS18xME1CCQkweDAwMDEwMDAwCisjZGVmaW5lIExOS18xMDBNQgkJMHgwMDAyMDAwMAorI2RlZmluZSBMTktfMTAwME1CCQkweDAwMDQwMDAwCisjZGVmaW5lIExOS19GVUxMX0RVUExFWAkJMHgwMDA4MDAwMAorI2RlZmluZSBMTktfSEFMRl9EVVBMRVgJCTB4MDAxMDAwMDAKKyNkZWZpbmUgTE5LX1RYX0ZMT1dfQ1RMX1kJMHgwMDIwMDAwMAorI2RlZmluZSBMTktfTkVHX0FEVkFOQ0VECTB4MDA0MDAwMDAKKyNkZWZpbmUgTE5LX1JYX0ZMT1dfQ1RMX1kJMHgwMDgwMDAwMAorI2RlZmluZSBMTktfTklDCQkJMHgwMTAwMDAwMAorI2RlZmluZSBMTktfSkFNCQkJMHgwMjAwMDAwMAorI2RlZmluZSBMTktfSlVNQk8JCTB4MDQwMDAwMDAKKyNkZWZpbmUgTE5LX0FMVEVPTgkJMHgwODAwMDAwMAorI2RlZmluZSBMTktfTkVHX0ZDVEwJCTB4MTAwMDAwMDAKKyNkZWZpbmUgTE5LX05FR09USUFURQkJMHgyMDAwMDAwMAorI2RlZmluZSBMTktfRU5BQkxFCQkweDQwMDAwMDAwCisjZGVmaW5lIExOS19VUAkJCTB4ODAwMDAwMDAKKworCisvKgorICogRXZlbnQgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIEVWVF9SSU5HX0VOVFJJRVMJMjU2CisjZGVmaW5lIEVWVF9SSU5HX1NJWkUJKEVWVF9SSU5HX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IGV2ZW50KSkKKworc3RydWN0IGV2ZW50IHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKwl1MzIJaWR4OjEyOworCXUzMgljb2RlOjEyOworCXUzMglldnQ6ODsKKyNlbHNlCisJdTMyCWV2dDo4OworCXUzMgljb2RlOjEyOworCXUzMglpZHg6MTI7CisjZW5kaWYKKwl1MzIgICAgIHBhZDsKK307CisKKworLyoKKyAqIEV2ZW50cworICovCisKKyNkZWZpbmUgRV9GV19SVU5OSU5HCQkweDAxCisjZGVmaW5lIEVfU1RBVFNfVVBEQVRFRAkJMHgwNAorCisjZGVmaW5lIEVfU1RBVFNfVVBEQVRFCQkweDA0CisKKyNkZWZpbmUgRV9MTktfU1RBVEUJCTB4MDYKKyNkZWZpbmUgRV9DX0xJTktfVVAJCTB4MDEKKyNkZWZpbmUgRV9DX0xJTktfRE9XTgkJMHgwMgorI2RlZmluZSBFX0NfTElOS18xMF8xMDAJCTB4MDMKKworI2RlZmluZSBFX0VSUk9SCQkJMHgwNworI2RlZmluZSBFX0NfRVJSX0lOVkFMX0NNRAkweDAxCisjZGVmaW5lIEVfQ19FUlJfVU5JTVBfQ01ECTB4MDIKKyNkZWZpbmUgRV9DX0VSUl9CQURfQ0ZHCQkweDAzCisKKyNkZWZpbmUgRV9NQ0FTVF9MSVNUCQkweDA4CisjZGVmaW5lIEVfQ19NQ0FTVF9BRERSX0FERAkweDAxCisjZGVmaW5lIEVfQ19NQ0FTVF9BRERSX0RFTAkweDAyCisKKyNkZWZpbmUgRV9SRVNFVF9KVU1CT19STkcJMHgwOQorCisKKy8qCisgKiBDb21tYW5kcworICovCisKKyNkZWZpbmUgQ01EX1JJTkdfRU5UUklFUwk2NAorCitzdHJ1Y3QgY21kIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKwl1MzIJaWR4OjEyOworCXUzMgljb2RlOjEyOworCXUzMglldnQ6ODsKKyNlbHNlCisJdTMyCWV2dDo4OworCXUzMgljb2RlOjEyOworCXUzMglpZHg6MTI7CisjZW5kaWYKK307CisKKworI2RlZmluZSBDX0hPU1RfU1RBVEUJCTB4MDEKKyNkZWZpbmUgQ19DX1NUQUNLX1VQCQkweDAxCisjZGVmaW5lIENfQ19TVEFDS19ET1dOCQkweDAyCisKKyNkZWZpbmUgQ19GRFJfRklMVEVSSU5HCQkweDAyCisjZGVmaW5lIENfQ19GRFJfRklMVF9FTkFCTEUJMHgwMQorI2RlZmluZSBDX0NfRkRSX0ZJTFRfRElTQUJMRQkweDAyCisKKyNkZWZpbmUgQ19TRVRfUlhfUFJEX0lEWAkweDAzCisjZGVmaW5lIENfVVBEQVRFX1NUQVRTCQkweDA0CisjZGVmaW5lIENfUkVTRVRfSlVNQk9fUk5HCTB4MDUKKyNkZWZpbmUgQ19BRERfTVVMVElDQVNUX0FERFIJMHgwOAorI2RlZmluZSBDX0RFTF9NVUxUSUNBU1RfQUREUgkweDA5CisKKyNkZWZpbmUgQ19TRVRfUFJPTUlTQ19NT0RFCTB4MGEKKyNkZWZpbmUgQ19DX1BST01JU0NfRU5BQkxFCTB4MDEKKyNkZWZpbmUgQ19DX1BST01JU0NfRElTQUJMRQkweDAyCisKKyNkZWZpbmUgQ19MTktfTkVHT1RJQVRJT04JMHgwYgorI2RlZmluZSBDX0NfTkVHT1RJQVRFX0JPVEgJMHgwMAorI2RlZmluZSBDX0NfTkVHT1RJQVRFX0dJRwkweDAxCisjZGVmaW5lIENfQ19ORUdPVElBVEVfMTBfMTAwCTB4MDIKKworI2RlZmluZSBDX1NFVF9NQUNfQUREUgkJMHgwYworI2RlZmluZSBDX0NMRUFSX1BST0ZJTEUJCTB4MGQKKworI2RlZmluZSBDX1NFVF9NVUxUSUNBU1RfTU9ERQkweDBlCisjZGVmaW5lIENfQ19NQ0FTVF9FTkFCTEUJMHgwMQorI2RlZmluZSBDX0NfTUNBU1RfRElTQUJMRQkweDAyCisKKyNkZWZpbmUgQ19DTEVBUl9TVEFUUwkJMHgwZgorI2RlZmluZSBDX1NFVF9SWF9KVU1CT19QUkRfSURYCTB4MTAKKyNkZWZpbmUgQ19SRUZSRVNIX1NUQVRTCQkweDExCisKKworLyoKKyAqIERlc2NyaXB0b3IgZmxhZ3MKKyAqLworI2RlZmluZSBCRF9GTEdfVENQX1VEUF9TVU0JMHgwMQorI2RlZmluZSBCRF9GTEdfSVBfU1VNCQkweDAyCisjZGVmaW5lIEJEX0ZMR19FTkQJCTB4MDQKKyNkZWZpbmUgQkRfRkxHX01PUkUJCTB4MDgKKyNkZWZpbmUgQkRfRkxHX0pVTUJPCQkweDEwCisjZGVmaW5lIEJEX0ZMR19VQ0FTVAkJMHgyMAorI2RlZmluZSBCRF9GTEdfTUNBU1QJCTB4NDAKKyNkZWZpbmUgQkRfRkxHX0JDQVNUCQkweDYwCisjZGVmaW5lIEJEX0ZMR19UWVBfTUFTSwkJMHg2MAorI2RlZmluZSBCRF9GTEdfSVBfRlJBRwkJMHg4MAorI2RlZmluZSBCRF9GTEdfSVBfRlJBR19FTkQJMHgxMDAKKyNkZWZpbmUgQkRfRkxHX1ZMQU5fVEFHCQkweDIwMAorI2RlZmluZSBCRF9GTEdfRlJBTUVfRVJST1IJMHg0MDAKKyNkZWZpbmUgQkRfRkxHX0NPQUxfTk9XCQkweDgwMAorI2RlZmluZSBCRF9GTEdfTUlOSQkJMHgxMDAwCisKKworLyoKKyAqIFJpbmcgQ29udHJvbCBibG9jayBmbGFncworICovCisjZGVmaW5lIFJDQl9GTEdfVENQX1VEUF9TVU0JMHgwMQorI2RlZmluZSBSQ0JfRkxHX0lQX1NVTQkJMHgwMgorI2RlZmluZSBSQ0JfRkxHX05PX1BTRVVET19IRFIJMHgwOAorI2RlZmluZSBSQ0JfRkxHX1ZMQU5fQVNTSVNUCTB4MTAKKyNkZWZpbmUgUkNCX0ZMR19DT0FMX0lOVF9PTkxZCTB4MjAKKyNkZWZpbmUgUkNCX0ZMR19UWF9IT1NUX1JJTkcJMHg0MAorI2RlZmluZSBSQ0JfRkxHX0lFRUVfU05BUF9TVU0JMHg4MAorI2RlZmluZSBSQ0JfRkxHX0VYVF9SWF9CRAkweDEwMAorI2RlZmluZSBSQ0JfRkxHX1JOR19ESVNBQkxFCTB4MjAwCisKKworLyoKKyAqIFRYIHJpbmcgLSBtYXhpbXVtIFRYIHJpbmcgZW50cmllcyBmb3IgVGlnb24gSSdzIGlzIDEyOAorICovCisjZGVmaW5lIE1BWF9UWF9SSU5HX0VOVFJJRVMJMjU2CisjZGVmaW5lIFRJR09OX0lfVFhfUklOR19FTlRSSUVTCTEyOAorI2RlZmluZSBUWF9SSU5HX1NJWkUJCShNQVhfVFhfUklOR19FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSkKKyNkZWZpbmUgVFhfUklOR19CQVNFCQkweDM4MDAKKworc3RydWN0IHR4X2Rlc2N7CisgICAgICAgIGFjZWFkZHIJYWRkcjsKKwl1MzIJZmxhZ3NpemU7IAorI2lmIDAKKy8qCisgKiBUaGlzIGlzIGluIFBDSSBzaGFyZWQgbWVtIGFuZCBtdXN0IGJlIGFjY2Vzc2VkIHdpdGggcmVhZGwvd3JpdGVsCisgKiByZWFsIGxheW91dCBpczoKKyAqLworI2lmIF9fTElUVExFX0VORElBTgorCXUxNglmbGFnczsKKwl1MTYJc2l6ZTsKKwl1MTYJdmxhbjsKKwl1MTYJcmVzZXJ2ZWQ7CisjZWxzZQorCXUxNglzaXplOworCXUxNglmbGFnczsKKwl1MTYJcmVzZXJ2ZWQ7CisJdTE2CXZsYW47CisjZW5kaWYKKyNlbmRpZgorCXUzMgl2bGFucmVzOworfTsKKworCisjZGVmaW5lIFJYX1NURF9SSU5HX0VOVFJJRVMJNTEyCisjZGVmaW5lIFJYX1NURF9SSU5HX1NJWkUJKFJYX1NURF9SSU5HX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpKQorCisjZGVmaW5lIFJYX0pVTUJPX1JJTkdfRU5UUklFUwkyNTYKKyNkZWZpbmUgUlhfSlVNQk9fUklOR19TSVpFCShSWF9KVU1CT19SSU5HX0VOVFJJRVMgKnNpemVvZihzdHJ1Y3QgcnhfZGVzYykpCisKKyNkZWZpbmUgUlhfTUlOSV9SSU5HX0VOVFJJRVMJMTAyNAorI2RlZmluZSBSWF9NSU5JX1JJTkdfU0laRQkoUlhfTUlOSV9SSU5HX0VOVFJJRVMgKnNpemVvZihzdHJ1Y3QgcnhfZGVzYykpCisKKyNkZWZpbmUgUlhfUkVUVVJOX1JJTkdfRU5UUklFUwkyMDQ4CisjZGVmaW5lIFJYX1JFVFVSTl9SSU5HX1NJWkUJKFJYX01BWF9SRVRVUk5fUklOR19FTlRSSUVTICogXAorCQkJCSBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpKQorCitzdHJ1Y3QgcnhfZGVzY3sKKwlhY2VhZGRyCWFkZHI7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJdTE2CXNpemU7CisJdTE2CWlkeDsKKyNlbHNlCisJdTE2CWlkeDsKKwl1MTYJc2l6ZTsKKyNlbmRpZgorI2lmZGVmIF9fTElUVExFX0VORElBTgorCXUxNglmbGFnczsKKwl1MTYJdHlwZTsKKyNlbHNlCisJdTE2CXR5cGU7CisJdTE2CWZsYWdzOworI2VuZGlmCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJdTE2CXRjcF91ZHBfY3N1bTsKKwl1MTYJaXBfY3N1bTsKKyNlbHNlCisJdTE2CWlwX2NzdW07CisJdTE2CXRjcF91ZHBfY3N1bTsKKyNlbmRpZgorI2lmZGVmIF9fTElUVExFX0VORElBTgorCXUxNgl2bGFuOworCXUxNgllcnJfZmxhZ3M7CisjZWxzZQorCXUxNgllcnJfZmxhZ3M7CisJdTE2CXZsYW47CisjZW5kaWYKKwl1MzIJcmVzZXJ2ZWQ7CisJdTMyCW9wYWd1ZTsKK307CisKKworLyoKKyAqIFRoaXMgc3RydWN0IGlzIHNoYXJlZCB3aXRoIHRoZSBOSUMgZmlybXdhcmUuCisgKi8KK3N0cnVjdCByaW5nX2N0cmwgeworCWFjZWFkZHIJcm5ncHRyOworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXUxNglmbGFnczsKKwl1MTYJbWF4X2xlbjsKKyNlbHNlCisJdTE2CW1heF9sZW47CisJdTE2CWZsYWdzOworI2VuZGlmCisJdTMyCXBhZDsKK307CisKKworc3RydWN0IGFjZV9tYWNfc3RhdHMgeworCXUzMiBleGNlc3NfY29sbHM7CisJdTMyIGNvbGxfMTsKKwl1MzIgY29sbF8yOworCXUzMiBjb2xsXzM7CisJdTMyIGNvbGxfNDsKKwl1MzIgY29sbF81OworCXUzMiBjb2xsXzY7CisJdTMyIGNvbGxfNzsKKwl1MzIgY29sbF84OworCXUzMiBjb2xsXzk7CisJdTMyIGNvbGxfMTA7CisJdTMyIGNvbGxfMTE7CisJdTMyIGNvbGxfMTI7CisJdTMyIGNvbGxfMTM7CisJdTMyIGNvbGxfMTQ7CisJdTMyIGNvbGxfMTU7CisJdTMyIGxhdGVfY29sbDsKKwl1MzIgZGVmZXJzOworCXUzMiBjcmNfZXJyOworCXUzMiB1bmRlcnJ1bjsKKwl1MzIgY3JzX2VycjsKKwl1MzIgcGFkWzNdOworCXUzMiBkcm9wX3VsYTsKKwl1MzIgZHJvcF9tYzsKKwl1MzIgZHJvcF9mYzsKKwl1MzIgZHJvcF9zcGFjZTsKKwl1MzIgY29sbDsKKwl1MzIga2VwdF9iYzsKKwl1MzIga2VwdF9tYzsKKwl1MzIga2VwdF91YzsKK307CisKKworc3RydWN0IGFjZV9pbmZvIHsKKwl1bmlvbiB7CisJCXUzMiBzdGF0c1syNTZdOworCX0gczsKKwlzdHJ1Y3QgcmluZ19jdHJsCWV2dF9jdHJsOworCXN0cnVjdCByaW5nX2N0cmwJY21kX2N0cmw7CisJc3RydWN0IHJpbmdfY3RybAl0eF9jdHJsOworCXN0cnVjdCByaW5nX2N0cmwJcnhfc3RkX2N0cmw7CisJc3RydWN0IHJpbmdfY3RybAlyeF9qdW1ib19jdHJsOworCXN0cnVjdCByaW5nX2N0cmwJcnhfbWluaV9jdHJsOworCXN0cnVjdCByaW5nX2N0cmwJcnhfcmV0dXJuX2N0cmw7CisJYWNlYWRkcglldnRfcHJkX3B0cjsKKwlhY2VhZGRyCXJ4X3JldF9wcmRfcHRyOworCWFjZWFkZHIJdHhfY3NtX3B0cjsKKwlhY2VhZGRyCXN0YXRzMl9wdHI7Cit9OworCisKK3N0cnVjdCByaW5nX2luZm8geworCXN0cnVjdCBza19idWZmCQkqc2tiOworCURFQ0xBUkVfUENJX1VOTUFQX0FERFIobWFwcGluZykKK307CisKKworLyoKKyAqIEZ1bm55Li4uIEFzIHNvb24gYXMgd2UgYWRkIG1hcGxlbiBvbiBhbHBoYSwgaXQgc3RhcnRzIHRvIHdvcmsKKyAqIG11Y2ggc2xvd2VyLiBIbW0uLi4gaXMgaXQgYmVjYXVzZSBzdHJ1Y3QgZG9lcyBub3QgZml0IHRvIG9uZSBjYWNoZWxpbmU/CisgKiBTbywgc3BsaXQgdHhfcmluZ19pbmZvLgorICovCitzdHJ1Y3QgdHhfcmluZ19pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsKKwlERUNMQVJFX1BDSV9VTk1BUF9BRERSKG1hcHBpbmcpCisJREVDTEFSRV9QQ0lfVU5NQVBfTEVOKG1hcGxlbikKK307CisKKworLyoKKyAqIHN0cnVjdCBhY2Vfc2tiIGhvbGRpbmcgdGhlIHJpbmdzIG9mIHNrYidzLiBUaGlzIGlzIGFuIGF3ZnVsIGxvdCBvZgorICogcG9pbnRlcnMsIGJ1dCBJIGRvbid0IHNlZSBhbnkgb3RoZXIgc21hcnQgbW9kZSB0byBkbyB0aGlzIGluIGFuCisgKiBlZmZpY2llbnQgbWFubmVyIDstKAorICovCitzdHJ1Y3QgYWNlX3NrYgoreworCXN0cnVjdCB0eF9yaW5nX2luZm8JdHhfc2tidWZmW01BWF9UWF9SSU5HX0VOVFJJRVNdOworCXN0cnVjdCByaW5nX2luZm8Jcnhfc3RkX3NrYnVmZltSWF9TVERfUklOR19FTlRSSUVTXTsKKwlzdHJ1Y3QgcmluZ19pbmZvCXJ4X21pbmlfc2tidWZmW1JYX01JTklfUklOR19FTlRSSUVTXTsKKwlzdHJ1Y3QgcmluZ19pbmZvCXJ4X2p1bWJvX3NrYnVmZltSWF9KVU1CT19SSU5HX0VOVFJJRVNdOworfTsKKworCisvKgorICogU3RydWN0IHByaXZhdGUgZm9yIHRoZSBBY2VOSUMuCisgKgorICogRWxlbWVudHMgYXJlIGdyb3VwZWQgc28gdmFyaWFibGVzIHVzZWQgYnkgdGhlIHR4IGhhbmRsaW5nIGdvZXMKKyAqIHRvZ2V0aGVyLCBhbmQgd2lsbCBnbyBpbnRvIHRoZSBzYW1lIGNhY2hlIGxpbmVzIGV0Yy4gaW4gb3JkZXIgdG8KKyAqIGF2b2lkIGNhY2hlIGxpbmUgY29udGVudGlvbiBiZXR3ZWVuIHRoZSByeCBhbmQgdHggaGFuZGxpbmcgb24gU01QLgorICoKKyAqIEZyZXF1ZW50bHkgYWNjZXNzZWQgdmFyaWFibGVzIGFyZSBwdXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAqIHN0cnVjdCB0byBoZWxwIHRoZSBjb21waWxlciBnZW5lcmF0ZSBiZXR0ZXIvc2hvcnRlciBjb2RlLgorICovCitzdHJ1Y3QgYWNlX3ByaXZhdGUKK3sKKwlzdHJ1Y3QgYWNlX2luZm8JCSppbmZvOworCXN0cnVjdCBhY2VfcmVncwlfX2lvbWVtCSpyZWdzOwkJLyogcmVnaXN0ZXIgYmFzZSAqLworCXN0cnVjdCBhY2Vfc2tiCQkqc2tiOworCWRtYV9hZGRyX3QJCWluZm9fZG1hOwkvKiAzMi82NCBiaXQgKi8KKworCWludAkJCXZlcnNpb24sIGxpbms7CisJaW50CQkJcHJvbWlzYywgbWNhc3RfYWxsOworCisJLyoKKwkgKiBUWCBlbGVtZW50cworCSAqLworCXN0cnVjdCB0eF9kZXNjCQkqdHhfcmluZzsKKwl1MzIJCQl0eF9wcmQ7CisJdm9sYXRpbGUgdTMyCQl0eF9yZXRfY3NtOworCWludAkJCXR4X3JpbmdfZW50cmllczsKKworCS8qCisJICogUlggZWxlbWVudHMKKwkgKi8KKwl1bnNpZ25lZCBsb25nCQlzdGRfcmVmaWxsX2J1c3kKKwkJCQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoU01QX0NBQ0hFX0JZVEVTKSkpOworCXVuc2lnbmVkIGxvbmcJCW1pbmlfcmVmaWxsX2J1c3ksIGp1bWJvX3JlZmlsbF9idXN5OworCWF0b21pY190CQljdXJfcnhfYnVmczsKKwlhdG9taWNfdAkJY3VyX21pbmlfYnVmczsKKwlhdG9taWNfdAkJY3VyX2p1bWJvX2J1ZnM7CisJdTMyCQkJcnhfc3RkX3NrYnByZCwgcnhfbWluaV9za2JwcmQsIHJ4X2p1bWJvX3NrYnByZDsKKwl1MzIJCQljdXJfcng7CisKKwlzdHJ1Y3QgcnhfZGVzYwkJKnJ4X3N0ZF9yaW5nOworCXN0cnVjdCByeF9kZXNjCQkqcnhfanVtYm9fcmluZzsKKwlzdHJ1Y3QgcnhfZGVzYwkJKnJ4X21pbmlfcmluZzsKKwlzdHJ1Y3QgcnhfZGVzYwkJKnJ4X3JldHVybl9yaW5nOworCisjaWYgQUNFTklDX0RPX1ZMQU4KKwlzdHJ1Y3Qgdmxhbl9ncm91cAkqdmxncnA7CisjZW5kaWYKKworCWludAkJCXRhc2tsZXRfcGVuZGluZywganVtYm87CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CWFjZV90YXNrbGV0OworCisJc3RydWN0IGV2ZW50CQkqZXZ0X3Jpbmc7CisKKwl2b2xhdGlsZSB1MzIJCSpldnRfcHJkLCAqcnhfcmV0X3ByZCwgKnR4X2NzbTsKKworCWRtYV9hZGRyX3QJCXR4X3JpbmdfZG1hOwkvKiAzMi82NCBiaXQgKi8KKwlkbWFfYWRkcl90CQlyeF9yaW5nX2Jhc2VfZG1hOworCWRtYV9hZGRyX3QJCWV2dF9yaW5nX2RtYTsKKwlkbWFfYWRkcl90CQlldnRfcHJkX2RtYSwgcnhfcmV0X3ByZF9kbWEsIHR4X2NzbV9kbWE7CisKKwl1bnNpZ25lZCBjaGFyCQkqdHJhY2VfYnVmOworCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqbmV4dDsKKwl2b2xhdGlsZSBpbnQJCWZ3X3J1bm5pbmc7CisJaW50CQkJYm9hcmRfaWR4OworCXUxNgkJCXBjaV9jb21tYW5kOworCXU4CQkJcGNpX2xhdGVuY3k7CisJY29uc3QgY2hhcgkJKm5hbWU7CisjaWZkZWYgSU5ERVhfREVCVUcKKwlzcGlubG9ja190CQlkZWJ1Z19sb2NrCisJCQkJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFNNUF9DQUNIRV9CWVRFUykpKTsKKwl1MzIJCQlsYXN0X3R4LCBsYXN0X3N0ZF9yeCwgbGFzdF9taW5pX3J4OworI2VuZGlmCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJaW50CQkJcGNpX3VzaW5nX2RhYzsKK307CisKKworI2RlZmluZSBUWF9SRVNFUlZFRAlNQVhfU0tCX0ZSQUdTCisKK3N0YXRpYyBpbmxpbmUgaW50IHR4X3NwYWNlIChzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwLCB1MzIgY3NtLCB1MzIgcHJkKQoreworCXJldHVybiAoY3NtIC0gcHJkIC0gMSkgJiAoQUNFX1RYX1JJTkdfRU5UUklFUyhhcCkgLSAxKTsKK30KKworI2RlZmluZSB0eF9mcmVlKGFwKSAJCXR4X3NwYWNlKChhcCktPnR4X3JldF9jc20sIChhcCktPnR4X3ByZCwgYXApCisjZGVmaW5lIHR4X3JpbmdfZnVsbChhcCwgY3NtLCBwcmQpCSh0eF9zcGFjZShhcCwgY3NtLCBwcmQpIDw9IFRYX1JFU0VSVkVEKQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2FjZWFkZHIoYWNlYWRkciAqYWEsIGRtYV9hZGRyX3QgYWRkcikKK3sKKwl1NjQgYmFkZHIgPSAodTY0KSBhZGRyOworCWFhLT5hZGRybG8gPSBiYWRkciAmIDB4ZmZmZmZmZmY7CisJYWEtPmFkZHJoaSA9IGJhZGRyID4+IDMyOworCXdtYigpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY2Vfc2V0X3R4cHJkKHN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzLAorCQkJCSBzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwLCB1MzIgdmFsdWUpCit7CisjaWZkZWYgSU5ERVhfREVCVUcKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZhcC0+ZGVidWdfbG9jaywgZmxhZ3MpOworCXdyaXRlbCh2YWx1ZSwgJnJlZ3MtPlR4UHJkKTsKKwlpZiAodmFsdWUgPT0gYXAtPmxhc3RfdHgpCisJCXByaW50ayhLRVJOX0VSUiAiQWNlTklDIFJBQ0UgQUxFUlQhIHdyaXRpbmcgaWRlbnRpY2FsIHZhbHVlICIKKwkJICAgICAgICJ0byB0eCBwcm9kdWNlciAoJWkpXG4iLCB2YWx1ZSk7CisJYXAtPmxhc3RfdHggPSB2YWx1ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcC0+ZGVidWdfbG9jaywgZmxhZ3MpOworI2Vsc2UKKwl3cml0ZWwodmFsdWUsICZyZWdzLT5UeFByZCk7CisjZW5kaWYKKwl3bWIoKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgYWNlX21hc2tfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFjZV9wcml2YXRlICphcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MgPSBhcC0+cmVnczsKKworCWlmIChBQ0VfSVNfVElHT05fSShhcCkpCisJCXdyaXRlbCgxLCAmcmVncy0+TWFza0ludCk7CisJZWxzZQorCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKSB8IE1BU0tfSU5UUywgJnJlZ3MtPkhvc3RDdHJsKTsKKworCWFjZV9zeW5jX2lycShkZXYtPmlycSk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGFjZV91bm1hc2tfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFjZV9wcml2YXRlICphcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MgPSBhcC0+cmVnczsKKyAKKwlpZiAoQUNFX0lTX1RJR09OX0koYXApKQorCQl3cml0ZWwoMCwgJnJlZ3MtPk1hc2tJbnQpOworCWVsc2UKKwkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCkgJiB+TUFTS19JTlRTLCAmcmVncy0+SG9zdEN0cmwpOworfQorCisKKy8qCisgKiBQcm90b3R5cGVzCisgKi8KK3N0YXRpYyBpbnQgYWNlX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhY2VfbG9hZF9zdGRfcnhfcmluZyhzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwLCBpbnQgbnJfYnVmcyk7CitzdGF0aWMgdm9pZCBhY2VfbG9hZF9taW5pX3J4X3Jpbmcoc3RydWN0IGFjZV9wcml2YXRlICphcCwgaW50IG5yX2J1ZnMpOworc3RhdGljIHZvaWQgYWNlX2xvYWRfanVtYm9fcnhfcmluZyhzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwLCBpbnQgbnJfYnVmcyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgYWNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgYWNlX2xvYWRfZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGFjZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhY2Vfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYWNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYWNlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkZXYpOworc3RhdGljIHZvaWQgYWNlX2R1bXBfdHJhY2Uoc3RydWN0IGFjZV9wcml2YXRlICphcCk7CitzdGF0aWMgdm9pZCBhY2Vfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhY2VfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSk7CitzdGF0aWMgaW50IGFjZV9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCk7CitzdGF0aWMgdm9pZCBhY2Vfc2V0X3J4dHhfcGFybXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGp1bWJvKTsKK3N0YXRpYyBpbnQgYWNlX2FsbG9jYXRlX2Rlc2NyaXB0b3JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYWNlX2ZyZWVfZGVzY3JpcHRvcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhY2VfaW5pdF9jbGVhbnVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphY2VfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCByZWFkX2VlcHJvbV9ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKKyNpZiBBQ0VOSUNfRE9fVkxBTgorc3RhdGljIHZvaWQgYWNlX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCk7CitzdGF0aWMgdm9pZCBhY2Vfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpOworI2VuZGlmCisKKyNlbmRpZiAvKiBfQUNFTklDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hY2VuaWNfZmlybXdhcmUuaCBiL2RyaXZlcnMvbmV0L2FjZW5pY19maXJtd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNjI1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hY2VuaWNfZmlybXdhcmUuaApAQCAtMCwwICsxLDk0NTcgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKy8qCisgKiBEZWNsYXJlIHRoZXNlIGhlcmUgZXZlbiBpZiBUaWdvbiBJIHN1cHBvcnQgaXMgZGlzYWJsZWQgdG8gYXZvaWQKKyAqIHRoZSBjb21waWxlciBjb21wbGFpbmluZyBhYm91dCB1bmRlZmluZWQgc3ltYm9scy4KKyAqLworI2RlZmluZSB0aWdvbkZ3UmVsZWFzZU1ham9yIDB4YworI2RlZmluZSB0aWdvbkZ3UmVsZWFzZU1pbm9yIDB4NAorI2RlZmluZSB0aWdvbkZ3UmVsZWFzZUZpeCAweGIKKyNkZWZpbmUgdGlnb25Gd1N0YXJ0QWRkciAweDAwMDA0MDAwCisjZGVmaW5lIHRpZ29uRndUZXh0QWRkciAweDAwMDA0MDAwCisjZGVmaW5lIHRpZ29uRndUZXh0TGVuIDB4MTExNDAKKyNkZWZpbmUgdGlnb25Gd1JvZGF0YUFkZHIgMHgwMDAxNTE0MAorI2RlZmluZSB0aWdvbkZ3Um9kYXRhTGVuIDB4YWMwCisjZGVmaW5lIHRpZ29uRndEYXRhQWRkciAweDAwMDE1YzIwCisjZGVmaW5lIHRpZ29uRndEYXRhTGVuIDB4MTcwCisjZGVmaW5lIHRpZ29uRndTYnNzQWRkciAweDAwMDE1ZDkwCisjZGVmaW5lIHRpZ29uRndTYnNzTGVuIDB4MzgKKyNkZWZpbmUgdGlnb25Gd0Jzc0FkZHIgMHgwMDAxNWRkMAorI2RlZmluZSB0aWdvbkZ3QnNzTGVuIDB4MjA4MAorI2lmZGVmIENPTkZJR19BQ0VOSUNfT01JVF9USUdPTl9JCisjZGVmaW5lIHRpZ29uRndUZXh0IE5VTEwKKyNkZWZpbmUgdGlnb25Gd0RhdGEgTlVMTAorI2RlZmluZSB0aWdvbkZ3Um9kYXRhIE5VTEwKKyNlbHNlCisvKiBHZW5lcmF0ZWQgYnkgZ2VuZncuYyAqLworc3RhdGljIHUzMiB0aWdvbkZ3VGV4dFsoTUFYX1RFWFRfTEVOLzQpICsgMV0gX19kZXZpbml0ZGF0YSA9IHsKKzB4MTAwMDAwMDMsIAorMHgwLCAweGQsIDB4ZCwgMHgzYzFkMDAwMSwgCisweDhmYmQ1YzU0LCAweDNhMGYwMjEsIDB4M2MxMDAwMDAsIDB4MjYxMDQwMDAsIAorMHhjMDAxMDBjLCAweDAsIDB4ZCwgMHgyN2JkZmZkOCwgCisweDNjMWNjMDAwLCAweDNjMWIwMDEzLCAweDM3N2JkODAwLCAweGQwMjEsIAorMHgzYzE3MDAxMywgMHgzNmY3NTQxOCwgMHgyZTAyMDIxLCAweDM0MDU4M2U4LCAKKzB4YWZiZjAwMjQsIDB4YzAwMjQ4OCwgMHhhZmIwMDAyMCwgMHhjMDAyM2U4LCAKKzB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTFhNCwgMHgyNDA1MDAwMSwgCisweDJlMDMwMjEsIDB4MzgyMSwgMHgzYzEwMDAwMSwgMHgyNjEwN2U1MCwgCisweGFmYjAwMDEwLCAweGMwMDI0MDMsIDB4YWZiYjAwMTQsIDB4M2MwMjAwMGYsIAorMHgzNDQyZmZmZiwgMHgyMDIxMDI0LCAweDM2MjEwMmIsIDB4MTA0MDAwMDksIAorMHgyNDA1MDAwMywgMHgzYzA0MDAwMSwgMHgyNDg0NTFiMCwgMHgyMDAzMDIxLCAKKzB4MzYwMzgyMSwgMHgzYzAyMDAxMCwgMHhhZmEyMDAxMCwgMHhjMDAyNDAzLCAKKzB4YWZhMDAwMTQsIDB4MjAyMSwgMHgzNDA1YzAwMCwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhMDIwODNiMCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhMDIwODNiMiwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzYjMsIAorMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMDgzYjQsIDB4YTJlMDA0ZDgsIAorMHg0MThjMCwgMHgyNDg0MDAwMSwgMHg3NzEwMjEsIDB4YWM0MDcyN2MsIAorMHg3NzEwMjEsIDB4YWM0MDcyODAsIDB4MmUzMTAyMSwgMHhhNDQ1NzI3YywgCisweDJjODIwMDIwLCAweDE0NDBmZmY3LCAweDQxOGMwLCAweDIwMjEsIAorMHgzNDA1YzAwMCwgMHg0MThjMCwgMHgyNDg0MDAwMSwgMHg3NzEwMjEsIAorMHhhYzQwNzM3YywgMHg3NzEwMjEsIDB4YWM0MDczODAsIDB4MmUzMTAyMSwgCisweGE0NDU3MzdjLCAweDJjODIwMDgwLCAweDU0NDBmZmY3LCAweDQxOGMwLCAKKzB4YWY4MDAwNTQsIDB4YWY4MDAxMWMsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwNDAsIAorMHhhZjgyMDA0NCwgMHg4ZjgyMDA0NCwgMHgzNDQyMDAyMCwgMHhhZjgyMDA0NCwgCisweDhmNDIwMjE4LCAweDMwNDIwMDAyLCAweDEwNDAwMDA5LCAweDAsIAorMHg4ZjQyMDIyMCwgMHgzYzAzMDAwMiwgMHgzNDYzMDAwNCwgMHg0MzEwMjUsIAorMHhhZWUyMDRjNCwgMHg4ZjQyMDIxYywgMHg4MDAxMDc0LCAweDM0NDIwMDA0LCAKKzB4OGY0MjAyMjAsIDB4M2MwMzAwMDIsIDB4MzQ2MzAwMDYsIDB4NDMxMDI1LCAKKzB4YWVlMjA0YzQsIDB4OGY0MjAyMWMsIDB4MzQ0MjAwMDYsIDB4YWVlMjA0Y2MsIAorMHg4ZjQyMDIxOCwgMHgzMDQyMDAxMCwgMHgxMDQwMDAwYSwgMHgwLCAKKzB4OGY0MjAyMWMsIDB4MzQ0MjAwMDQsIDB4YWVlMjA0YzgsIDB4OGY0MjAyMjAsIAorMHgzYzAzMDAwYSwgMHgzNDYzMDAwNCwgMHg0MzEwMjUsIDB4ODAwMTA4YSwgCisweGFlZTIwNGMwLCAweDhmNDIwMjIwLCAweDNjMDMwMDBhLCAweDM0NjMwMDA2LCAKKzB4NDMxMDI1LCAweGFlZTIwNGMwLCAweDhmNDIwMjFjLCAweDM0NDIwMDA2LCAKKzB4YWVlMjA0YzgsIDB4OGY0MjAyMTgsIDB4MzA0MjAyMDAsIDB4MTA0MDAwMDMsIAorMHgyNDAyMDAwMSwgMHg4MDAxMDkxLCAweGEyZTI3MjQ4LCAweGEyZTA3MjQ4LCAKKzB4MjQwMjAwMDEsIDB4YWY4MjAwYTAsIDB4YWY4MjAwYjAsIDB4OGY4MzAwNTQsIAorMHg4ZjgyMDA1NCwgMHg4MDAxMDk5LCAweDI0NjMwMDY0LCAweDhmODIwMDU0LCAKKzB4NjIxMDIzLCAweDJjNDIwMDY1LCAweDE0NDBmZmZjLCAweDAsIAorMHhhZjgwMDA0NCwgMHg4ZjQyMDIwOCwgMHg4ZjQzMDIwYywgMHhhZWUyMDAxMCwgCisweGFlZTMwMDE0LCAweDhlZTQwMDEwLCAweDhlZTUwMDE0LCAweDI2ZTIwMDMwLCAKKzB4YWVlMjAwMjgsIDB4MjQwMjA0OTAsIDB4YWVlMjAwMTgsIDB4YWY4NDAwOTAsIAorMHhhZjg1MDA5NCwgMHg4ZWUyMDAyOCwgMHhhZjgyMDBiNCwgMHg5NmUyMDAxYSwgCisweGFmODIwMDljLCAweDhmODIwMGIwLCAweDhlZTMwNGNjLCAweDQzMTAyNSwgCisweGFmODIwMGIwLCAweDhmODIwMGIwLCAweDMwNDIwMDA0LCAweDE0NDBmZmZkLCAKKzB4MCwgMHg4ZWUyMDQ1MCwgMHg4ZWUzMDQ1NCwgMHhhZWUzMDRmYywgCisweDhlZTIwNGZjLCAweDI0NDJlMDAwLCAweDJjNDIyMDAxLCAweDE0NDAwMDBkLCAKKzB4MjZlNDAwMzAsIDB4OGVlMjA0NTAsIDB4OGVlMzA0NTQsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTFiYywgMHgzYzA1MDAwMSwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgCisweDhlZTcwNGZjLCAweDM0YTVmMDAwLCAweGMwMDI0MDMsIDB4NjAzMDIxLCAKKzB4MjZlNDAwMzAsIDB4YzAwMjQ4OCwgMHgyNDA1MDQwMCwgMHgyNzQ0MDA4MCwgCisweGMwMDI0ODgsIDB4MjQwNTAwODAsIDB4MjZlNDc3N2MsIDB4YzAwMjQ4OCwgCisweDI0MDUwNDAwLCAweDhmNDIwMjVjLCAweDI2ZTQwMDk0LCAweGFlZTIwMDYwLCAKKzB4OGY0MjAyNjAsIDB4Mjc0NTAyMDAsIDB4MjQwNjAwMDgsIDB4YWVlMjAwNjgsIAorMHgyNDAyMDAwNiwgMHhjMDAyNDlhLCAweGFlZTIwMDY0LCAweDNjMDIzYjlhLCAKKzB4MzQ0MmNhMDAsIDB4MjAyMSwgMHgyNDAzMDAwMiwgMHhhZWUzMDA3NCwgCisweGFlZTMwMDcwLCAweGFlZTIwMDZjLCAweDI0MDIwM2U4LCAweGFlZTIwMTA0LCAKKzB4MjQwMjAwMDEsIDB4YWVlMzAxMDAsIDB4YWVlMjAxMGMsIDB4M2MwMzAwMDEsIAorMHg2NDE4MjEsIDB4OTA2MzVjMjAsIDB4MmU0MTAyMSwgMHgyNDg0MDAwMSwgCisweGEwNDMwMDljLCAweDJjODIwMDBmLCAweDE0NDBmZmY4LCAweDAsIAorMHg4ZjgyMDA0MCwgMHgyZTQxODIxLCAweDI0ODQwMDAxLCAweDIxNzAyLCAKKzB4MjQ0MjAwMzAsIDB4YTA2MjAwOWMsIDB4MmU0MTAyMSwgMHhhMDQwMDA5YywgCisweDk2ZTIwNDZhLCAweDMwNDIwMDAzLCAweDE0NDAwMDA5LCAweDAsIAorMHg5NmUyMDQ3YSwgMHgzMDQyMDAwMywgMHg1MDQwMDEzMSwgMHgzYzAzMDgwMCwgCisweDk2ZTIwNDZhLCAweDMwNDIwMDAzLCAweDEwNDAwMDJhLCAweDNjMDIwNzAwLCAKKzB4OTZlMjA0N2EsIDB4MzA0MjAwMDMsIDB4MTA0MDAwMjYsIDB4M2MwMjA3MDAsIAorMHg5NmUzMDQ3YSwgMHg5NmUyMDQ2YSwgMHgxNDYyMDAyMiwgMHgzYzAyMDcwMCwgCisweDhlZTIwNGMwLCAweDI0MDMwMDAxLCAweGEyZTM0ZTIwLCAweDM0NDIwZTAwLCAKKzB4YWVlMjA0YzAsIDB4OGY0MjAyMTgsIDB4MzA0MjAxMDAsIDB4MTA0MDAwMDUsIAorMHgwLCAweDNjMDIwMDAxLCAweDI0NDJlMTY4LCAweDgwMDExMWQsIAorMHgyMTEwMCwgMHgzYzAyMDAwMSwgMHgyNDQyZDM1YywgMHgyMTEwMCwgCisweDIxMTgyLCAweDNjMDMwODAwLCAweDQzMTAyNSwgMHgzYzAxMDAwMSwgCisweGFjMjIxMjM4LCAweDNjMDIwMDAxLCAweDI0NDJmNjgwLCAweDIxMTAwLCAKKzB4MjExODIsIDB4M2MwMzA4MDAsIDB4NDMxMDI1LCAweDNjMDEwMDAxLCAKKzB4YWMyMjEyNzgsIDB4OGVlMjAwMDAsIDB4MzQ0MjQwMDAsIDB4ODAwMTIzOCwgCisweGFlZTIwMDAwLCAweDM0NDIzMDAwLCAweGFmYTIwMDE4LCAweDhlZTIwNjA4LCAKKzB4OGY0MzAyMjgsIDB4MjQ0MjAwMDEsIDB4MzA0OTAwZmYsIDB4NTEyMzAwZTIsIAorMHhhZmEwMDAxMCwgMHg4ZWUyMDYwOCwgMHgyMTBjMCwgMHg1NzEwMjEsIAorMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgCisweDhmODcwMTIwLCAweDI3NjIzODAwLCAweDI0ZTgwMDIwLCAweDEwMjEwMmIsIAorMHg1MDQwMDAwMSwgMHgyNzY4MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMTAyMDAwNCwgCisweDAsIDB4OGY4MjAxMjQsIDB4MTUwMjAwMDcsIDB4MTAyMSwgCisweDhlZTIwMWE0LCAweDMwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIAorMHg4MDAxMWEwLCAweDhlZTIwMWE0LCAweDhlZTQwNjA4LCAweDQyMGMwLCAKKzB4ODAxODIxLCAweDhlZTQwNDMwLCAweDhlZTUwNDM0LCAweGEzMjgyMSwgCisweGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFjZTQwMDAwLCAKKzB4YWNlNTAwMDQsIDB4OGVlMzA2MDgsIDB4MjQwMjAwMDgsIDB4YTRlMjAwMGUsIAorMHgyNDAyMDAwZCwgMHhhY2UyMDAxOCwgMHhhY2U5MDAxYywgMHgzMThjMCwgCisweDI0NjMwNjBjLCAweDJlMzEwMjEsIDB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsIAorMHhhY2UyMDAxMCwgMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgCisweDI0MDYwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAwNywgMHgxNDYyMDAxZiwgCisweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIAorMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgCisweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAKKzB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgCisweDAsIDB4ODAwMTE4YSwgMHgwLCAweDE0YTAwMDA1LCAKKzB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgCisweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAKKzB4YWM4MDAwMDAsIDB4ODAwMTFhMCwgMHgwLCAweDhlZTI0ZTMwLCAKKzB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgCisweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAKKzB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNywgCisweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDU0YzAwMDBjLCAKKzB4YWVlOTA2MDgsIDB4M2MwNDAwMDEsIDB4MjQ4NDUxYzgsIDB4YWZhMDAwMTAsIAorMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgCisweGMwMDI0MDMsIDB4MzRhNWYwMDAsIDB4ODAwMTIyMywgMHgwLCAKKzB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAKKzB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIAorMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsIAorMHg4ZWUyMDFhNCwgMHgzMDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAKKzB4ODAwMTIwNywgMHg4ZWUyMDFhNCwgMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywgCisweDhlZTQwNGEwLCAweDhlZTUwNGE0LCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAKKzB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIAorMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgCisweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDM3LCAweDI0MDYwMDAxLCAKKzB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgCisweDhjODMwMDAwLCAweDI0MDIwMDEyLCAweDE0NjIwMDFmLCAweDAsIAorMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgCisweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAKKzB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwgCisweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIAorMHg4MDAxMWYxLCAweDAsIDB4MTRhMDAwMDUsIDB4MCwgCisweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAKKzB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIAorMHg4MDAxMjA3LCAweDAsIDB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIAorMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIAorMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDEyLCAweGFjODIwMDAwLCAKKzB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTRjMDAwMWIsIDB4MCwgCisweDNjMDQwMDAxLCAweDI0ODQ1MWQwLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAKKzB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgCisweDM0YTVmMDAxLCAweDhlZTIwMWIwLCAweDI0NDIwMDAxLCAweGFlZTIwMWIwLCAKKzB4ODAwMTIyMywgMHg4ZWUyMDFiMCwgMHgzYzA0MDAwMSwgMHgyNDg0NTFkYywgCisweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAKKzB4YzAwMjQwMywgMHgzNGE1ZjAwNSwgMHg4ZWUyMDFhYywgMHgyNDQyMDAwMSwgCisweGFlZTIwMWFjLCAweDhlZTIwMWFjLCAweDhlZTIwMTYwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDUxZTgsIDB4MzQwNWYwMDEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNjAsIAorMHg4ZWUyMDE2MCwgMHgzMDIxLCAweDM4MjEsIDB4YWZhMDAwMTAsIAorMHhjMDAyNDAzLCAweGFmYTAwMDE0LCAweDgwMDEyMzgsIDB4MCwgCisweDNjMDIwMDAxLCAweDI0NDJmNWE4LCAweDIxMTAwLCAweDIxMTgyLCAKKzB4NDMxMDI1LCAweDNjMDEwMDAxLCAweGFjMjIxMjc4LCAweDk2ZTIwNDVhLCAKKzB4MzA0MjAwMDMsIDB4MTA0MDAwMjUsIDB4M2MwNTBmZmYsIDB4OGVlMjA0YzgsIAorMHgzNGE1ZmZmZiwgMHgzNDQyMGEwMCwgMHhhZWUyMDRjOCwgMHg4ZWUzMDRjOCwgCisweDNjMDQwMDAxLCAweDI0ODQ1MWY0LCAweDI0MDIwMDAxLCAweGEyZTIwNGVjLCAKKzB4YTJlMjA0ZWQsIDB4M2MwMjAwMDIsIDB4NjIxODI1LCAweDNjMDIwMDAxLCAKKzB4MjQ0MmEzOTAsIDB4NDUxMDI0LCAweDIxMDgyLCAweGFlZTMwNGM4LCAKKzB4M2MwMzA4MDAsIDB4NDMxMDI1LCAweDNjMDEwMDAxLCAweGFjMjIxMjIwLCAKKzB4M2MwMjAwMDEsIDB4MjQ0MmFkZDQsIDB4NDUxMDI0LCAweDIxMDgyLCAKKzB4NDMxMDI1LCAweDNjMDEwMDAxLCAweGFjMjIxMjgwLCAweDk2ZTYwNDVhLCAKKzB4MzgyMSwgMHgyNDA1MDAxMSwgMHhhZmEwMDAxMCwgMHhjMDAyNDAzLCAKKzB4YWZhMDAwMTQsIDB4ODAwMTI2OCwgMHgwLCAweDNjMDIwMDAxLCAKKzB4MjQ0MmE5ZDQsIDB4MjExMDAsIDB4MjExODIsIDB4M2MwMzA4MDAsIAorMHg0MzEwMjUsIDB4M2MwMTAwMDEsIDB4YWMyMjEyODAsIDB4OTZlMjA0NmEsIAorMHgzMDQyMDAxMCwgMHgxNDQwMDAwOSwgMHgwLCAweDk2ZTIwNDdhLCAKKzB4MzA0MjAwMTAsIDB4MTA0MDAxMTIsIDB4MCwgMHg5NmUyMDQ2YSwgCisweDMwNDIwMDEwLCAweDEwNDAwMDA1LCAweDNjMDIwNzAwLCAweDk2ZTIwNDdhLCAKKzB4MzA0MjAwMTAsIDB4MTQ0MDAxMDIsIDB4M2MwMjA3MDAsIDB4MzQ0MjMwMDAsIAorMHhhZmEyMDAxOCwgMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgMHgyNDQyMDAwMSwgCisweDMwNDkwMGZmLCAweDUxMjMwMGUyLCAweGFmYTAwMDEwLCAweDhlZTIwNjA4LCAKKzB4MjEwYzAsIDB4NTcxMDIxLCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLCAKKzB4YWM0MzA2MGMsIDB4YWM0NDA2MTAsIDB4OGY4NzAxMjAsIDB4Mjc2MjM4MDAsIAorMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjgzMDAwLCAKKzB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgCisweDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsIDB4MzAyMSwgCisweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDEyZWEsIDB4OGVlMjAxYTQsIAorMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsIDB4OGVlNDA0MzAsIAorMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwgCisweDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgMHg4ZWUzMDYwOCwgCisweDI0MDIwMDA4LCAweGE0ZTIwMDBlLCAweDI0MDIwMDBkLCAweGFjZTIwMDE4LCAKKzB4YWNlOTAwMWMsIDB4MzE4YzAsIDB4MjQ2MzA2MGMsIDB4MmUzMTAyMSwgCisweGFjZTIwMDA4LCAweDhlZTIwNGM0LCAweGFjZTIwMDEwLCAweGFmODgwMTIwLCAKKzB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQwNjAwMDEsIDB4OGVlMjRlMzAsIAorMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLCAKKzB4MjQwMjAwMDcsIDB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgCisweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAKKzB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIAorMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LCAKKzB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAxMmQ0LCAKKzB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAKKzB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIAorMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAxMmVhLCAKKzB4MCwgMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgCisweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgCisweDJlMjIwMjEsIDB4MjQwMjAwMDcsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIAorMHhhYzgyMDAwNCwgMHg1NGMwMDAwYywgMHhhZWU5MDYwOCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1MWM4LCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAKKzB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwMCwgCisweDgwMDEzNmQsIDB4MCwgMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgCisweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgCisweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIAorMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAweDMwMjEsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxMzUxLCAweDhlZTIwMWE0LCAKKzB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTAsIDB4OGVlNTA0YTQsIAorMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwgCisweDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAKKzB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIAorMHgxNDQwMDAzNywgMHgyNDA2MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMTIsIAorMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAKKzB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIAorMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwgCisweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIAorMHgxMGEyMDAwNSwgMHgwLCAweDgwMDEzM2IsIDB4MCwgCisweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIAorMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgCisweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDEzNTEsIDB4MCwgCisweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHgyNDAyMDAxMiwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgCisweDE0YzAwMDFiLCAweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUxZDAsIAorMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgCisweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDEsIDB4OGVlMjAxYjAsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFiMCwgMHg4MDAxMzZkLCAweDhlZTIwMWIwLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDUxZGMsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIAorMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDA1LCAKKzB4OGVlMjAxYWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYWMsIDB4OGVlMjAxYWMsIAorMHg4ZWUyMDE2MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTFlOCwgMHgzNDA1ZjAwMiwgCisweDI0NDIwMDAxLCAweGFlZTIwMTYwLCAweDhlZTIwMTYwLCAweDMwMjEsIAorMHgzODIxLCAweGFmYTAwMDEwLCAweGMwMDI0MDMsIDB4YWZhMDAwMTQsIAorMHg5NmU2MDQ3YSwgMHg5NmU3MDQ2YSwgMHgzYzA0MDAwMSwgMHgyNDg0NTIwMCwgCisweDI0MDUwMDEyLCAweGFmYTAwMDEwLCAweGMwMDI0MDMsIDB4YWZhMDAwMTQsIAorMHhjMDA0NTAwLCAweDAsIDB4YzAwMjMxOCwgMHgwLCAKKzB4M2MwNjAwMDEsIDB4MzRjNjM4MDAsIDB4YWVlMDA2MDgsIDB4YWY0MDAyMjgsIAorMHhhZjQwMDIyYywgMHg5NmUzMDQ1OCwgMHg4ZWU0MDAwMCwgMHgzYzA1MTJkOCwgCisweDM0YTVjMzU4LCAweDI3NjIzODAwLCAweGFlZTI3MjU4LCAweDI3NjIzODAwLCAKKzB4YWVlMjcyNjAsIDB4Mjc2MjM4MDAsIDB4YWVlMjcyNjQsIDB4MzY2MTAyMSwgCisweGFlZTI3MjcwLCAweDI0MDJmZmZmLCAweGFlZTAwNGQ0LCAweGFlZTAwNGUwLCAKKzB4YWVlMDA0ZTQsIDB4YWVlMDA0ZjAsIDB4YTJlMDA0ZjQsIDB4YWVlMDBlMGMsIAorMHhhZWUwMGUxOCwgMHhhZWUwMGUxMCwgMHhhZWUwMGUxNCwgMHhhZWUwMGUxYywgCisweGFlZTA3MjRjLCAweGFlZTA1MjQ0LCAweGFlZTA1MjQwLCAweGFlZTA1MjNjLCAKKzB4YWVlMDcyNTAsIDB4YWVlMDcyNTQsIDB4YWVlMDcyNWMsIDB4YWVlMDcyNjgsIAorMHhhZWUwMDRkMCwgMHgyNDYzZmZmZiwgMHg4NTIwMjUsIDB4YWVlMzA0ZjgsIAorMHhhZWU0MDAwMCwgMHhhZjgwMDA2MCwgMHhhZjgyMDA2NCwgMHgzYzAyMDEwMCwgCisweGFmYTIwMDE4LCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LCAweDI0NDIwMDAxLCAKKzB4MzA0OTAwZmYsIDB4NTEyMzAwZTIsIDB4YWZhMDAwMTAsIDB4OGVlMjA2MDgsIAorMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsIAorMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4Zjg3MDEyMCwgMHgyNzYyMzgwMCwgCisweDI0ZTgwMDIwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODMwMDAsIAorMHg4ZjgyMDEyOCwgMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAKKzB4MTUwMjAwMDcsIDB4MTAyMSwgMHg4ZWUyMDFhNCwgMHgzMDIxLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTQyMiwgMHg4ZWUyMDFhNCwgCisweDhlZTQwNjA4LCAweDQyMGMwLCAweDgwMTgyMSwgMHg4ZWU0MDQzMCwgCisweDhlZTUwNDM0LCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAKKzB4ODYyMDIxLCAweGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTMwNjA4LCAKKzB4MjQwMjAwMDgsIDB4YTRlMjAwMGUsIDB4MjQwMjAwMGQsIDB4YWNlMjAwMTgsIAorMHhhY2U5MDAxYywgMHgzMThjMCwgMHgyNDYzMDYwYywgMHgyZTMxMDIxLCAKKzB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsIDB4YWNlMjAwMTAsIDB4YWY4ODAxMjAsIAorMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDA2MDAwMSwgMHg4ZWUyNGUzMCwgCisweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIAorMHgyNDAyMDAwNywgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAKKzB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIAorMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgCisweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIAorMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAweDgwMDE0MGMsIAorMHgwLCAweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgCisweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDE0MjIsIAorMHgwLCAweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAKKzB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgCisweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgCisweGFjODIwMDA0LCAweDU0YzAwMDBjLCAweGFlZTkwNjA4LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDUxYzgsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIAorMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDAwLCAKKzB4ODAwMTRhNSwgMHgwLCAweDhmODMwMTIwLCAweDI3NjIzODAwLCAKKzB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYzMDAwLCAKKzB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgCisweDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsIDB4MzAyMSwgCisweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDE0ODksIDB4OGVlMjAxYTQsIAorMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywgMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwgCisweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweDI0MDIwMDA4LCAweGE0NjIwMDBlLCAKKzB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIAorMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgCisweDE0NDAwMDM3LCAweDI0MDYwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAKKzB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAxMiwgCisweDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIAorMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgCisweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLCAweDI0NDIwMDAxLCAKKzB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgCisweDEwYTIwMDA1LCAweDAsIDB4ODAwMTQ3MywgMHgwLCAKKzB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgCisweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAKKzB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMTQ4OSwgMHgwLCAKKzB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIAorMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAKKzB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgCisweDI0MDIwMDEyLCAweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LCAKKzB4MTRjMDAwMWIsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTFkMCwgCisweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAKKzB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwMSwgMHg4ZWUyMDFiMCwgCisweDI0NDIwMDAxLCAweGFlZTIwMWIwLCAweDgwMDE0YTUsIDB4OGVlMjAxYjAsIAorMHgzYzA0MDAwMSwgMHgyNDg0NTFkYywgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgCisweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDUsIAorMHg4ZWUyMDFhYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywgCisweDhlZTIwMTU0LCAweDI0NDIwMDAxLCAweGFlZTIwMTU0LCAweGMwMDE0ZGMsIAorMHg4ZWUyMDE1NCwgMHg4ZjgyMDBhMCwgMHgzMDQyMDAwNCwgMHgxNDQwZmZmZCwgCisweDAsIDB4OGY4MjAwNDAsIDB4MzA0MjAwMDEsIDB4MTQ0MDAwMDgsIAorMHgwLCAweDhmNDMwMTA0LCAweDI0MDIwMDAxLCAweDEwNjIwMDA0LCAKKzB4MCwgMHg4ZjQyMDI2NCwgMHgxMDQwMDAwNiwgMHgwLCAKKzB4OGVlMjAxN2MsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxN2MsIDB4ODAwMTRjNSwgCisweDhlZTIwMTdjLCAweDhmODIwMDQ0LCAweDM0NDIwMDA0LCAweGFmODIwMDQ0LCAKKzB4OGVlMjAxNzgsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNzgsIDB4OGVlMjAxNzgsIAorMHg4ZjgyMDBkOCwgMHg4ZjgzMDBkNCwgMHg0MzEwMjMsIDB4YWVlMjcyNmMsIAorMHg4ZWUyNzI2YywgMHgxYzQwMDAwMywgMHgzYzAzMDAwMSwgMHg0MzEwMjEsIAorMHhhZWUyNzI2YywgMHhjMDA0MDY0LCAweDAsIDB4YzAwNDQ0MCwgCisweGFmODAwMjI4LCAweDhmYmYwMDI0LCAweDhmYjAwMDIwLCAweDNlMDAwMDgsIAorMHgyN2JkMDAyOCwgMHgzZTAwMDA4LCAweDAsIDB4M2UwMDAwOCwgCisweDAsIDB4MCwgMHgwLCAweDI0MDIwMDJjLCAKKzB4YWY4MjAwNTAsIDB4YWVlMDcyNzQsIDB4OGY0MjAyMzgsIDB4YWVlMjcyNzgsIAorMHg4ZjgyMDA1NCwgMHgyNDQyMDA2NywgMHhhZjgyMDA1OCwgMHhhZWUwN2I4OCwgCisweGFlZTA3YjhjLCAweGFlZTA3Yjg0LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgCisweGFjMjA4M2JjLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHgzZTAwMDA4LCAKKzB4YTAyMDgzYjksIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjQsIDB4YWZiMDAwMjAsIAorMHg4ZjgyMDA1NCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNkOCwgMHgyNDQyMDA2NywgCisweDEwNjAwMDBkLCAweGFmODIwMDU4LCAweDNjMDIwMDAxLCAweDU3MTAyMSwgCisweDkwNDI4M2I4LCAweDEwNDAwMDA1LCAweDNjMDMwMjAwLCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweDgwMDE1MDMsIDB4YTAyMDgzYjgsIDB4OGVlMjAwMDAsIAorMHg0MzEwMjUsIDB4YWVlMjAwMDAsIDB4OGY0MjAyMTgsIDB4MzA0MjAxMDAsIAorMHgxMDQwMDBjNiwgMHgwLCAweDhmODIwMGIwLCAweDMwNDIwMDA0LCAKKzB4MTA0MDAwYzIsIDB4MCwgMHgzYzAzMDAwMSwgMHg3NzE4MjEsIAorMHg4YzYzODNkMCwgMHg4ZjgyMDEwNCwgMHgxNDYyMDBiNCwgMHgwLCAKKzB4M2MwMzAwMDEsIDB4NzcxODIxLCAweDhjNjM4M2Q0LCAweDhmODIwMGI0LCAKKzB4MTQ2MjAwYWUsIDB4MCwgMHg4ZjgyMDBiMCwgMHgzYzAzMDA4MCwgCisweDQzMTAyNCwgMHgxMDQwMDAwZCwgMHgwLCAweDhmODIwMTFjLCAKKzB4MzQ0MjAwMDIsIDB4YWY4MjAxMWMsIDB4OGY4MjAwYjAsIDB4MjQwM2ZmZmIsIAorMHg0MzEwMjQsIDB4YWY4MjAwYjAsIDB4OGY4MjAxMWMsIDB4MjQwM2ZmZmQsIAorMHg0MzEwMjQsIDB4ODAwMTVjYywgMHhhZjgyMDExYywgMHgzYzAzMDAwMSwgCisweDc3MTgyMSwgMHg4YzYzODNkMCwgMHg4ZjgyMDEwNCwgMHgxNDYyMDA4MiwgCisweDAsIDB4M2MwMzAwMDEsIDB4NzcxODIxLCAweDhjNjM4M2Q0LCAKKzB4OGY4MjAwYjQsIDB4MTQ2MjAwN2MsIDB4MCwgMHgzYzA3MDAwMSwgCisweGY3MzgyMSwgMHg4Y2U3ODNkMCwgMHg4ZjgyMDBiMCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1MjcwLCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmODYwMGIwLCAKKzB4M2MwNTAwMDUsIDB4YzAwMjQwMywgMHgzNGE1MDkwMCwgMHg4ZjgyMDExYywgCisweDM0NDIwMDAyLCAweGFmODIwMTFjLCAweDhmODMwMTA0LCAweDhmODIwMGIwLCAKKzB4MzQ0MjAwMDEsIDB4YWY4MjAwYjAsIDB4YWY4MzAxMDQsIDB4OGY4MzAxMjAsIAorMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIAorMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAKKzB4OGY4MjAxMjQsIDB4MTRjMjAwMDYsIDB4MCwgMHg4ZWUyMDFhNCwgCisweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDE1YTAsIDB4OGVlMjAxYTQsIAorMHg4ZjQ0MDIwOCwgMHg4ZjQ1MDIwYywgMHgyNmUyMDAzMCwgMHhhYzYyMDAwOCwgCisweDI0MDIwNDAwLCAweGE0NjIwMDBlLCAweDI0MDIwMDBmLCAweGFjNjIwMDE4LCAKKzB4YWM2MDAwMWMsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIAorMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgCisweDAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIAorMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDA3LCAweDE0NjIwMDFmLCAKKzB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgCisweDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAKKzB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIAorMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAKKzB4MCwgMHg4MDAxNThhLCAweDAsIDB4MTRhMDAwMDUsIAorMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAKKzB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIAorMHhhYzgwMDAwMCwgMHg4MDAxNWEwLCAweDAsIDB4OGVlMjRlMzAsIAorMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAKKzB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIAorMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA3LCAKKzB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4OGY4MjAxMWMsIAorMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAxMWMsIDB4OGVlMjAxZTQsIAorMHgzYzA3MDAwMSwgMHhmNzM4MjEsIDB4OGNlNzgzZDAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFlNCwgMHg4ZWUyMDFlNCwgMHgzYzA0MDAwMSwgMHgyNDg0NTI3YywgCisweDgwMDE1YmQsIDB4YWZhMDAwMTAsIDB4OGY4MjAxMDQsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4YWMyMjgzZDAsIDB4OGY4MjAwYjQsIDB4M2MwNzAwMDEsIAorMHhmNzM4MjEsIDB4OGNlNzgzZDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUyODQsIAorMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzZDQsIDB4YWZhMDAwMTAsIAorMHhhZmEwMDAxNCwgMHg4Zjg2MDBiMCwgMHgzYzA1MDAwNSwgMHhjMDAyNDAzLCAKKzB4MzRhNTA5MDAsIDB4ODAwMTVjYywgMHgwLCAweDhmODIwMTA0LCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2QwLCAweDhmODIwMGI0LCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2Q0LCAweDhlZTI3Mjc0LCAKKzB4OTJlMzA0ZjQsIDB4MjQ0MjAwNjcsIDB4MTQ2MDAwMDYsIDB4YWVlMjcyNzQsIAorMHg4ZWUyNzI3NCwgMHg4ZjQzMDIzNCwgMHg0MzEwMmIsIDB4MTQ0MDAwN2IsIAorMHgwLCAweDhlZTMwNGU0LCAweDhlZTIwNGY4LCAweDE0NjIwMDA0LCAKKzB4MCwgMHg5MmUyMDRmNCwgMHg1MDQwMDA3NCwgMHhhMmUwMDRmNCwgCisweDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgCisweDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAKKzB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAKKzB4OGVlMjAxYTQsIDB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgCisweDgwMDE2MzcsIDB4OGVlMjAxYTQsIDB4OGVlMjA0ZTQsIDB4YWM2MjAwMWMsIAorMHg4ZWU0MDRiMCwgMHg4ZWU1MDRiNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgCisweDI0MDIwMDA4LCAweGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LCAKKzB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIAorMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHg4YzgzMDAwMCwgMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwgMHgwLCAKKzB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIAorMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgCisweDhlZTU0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIAorMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAKKzB4ODAwMTYyMSwgMHgwLCAweDE0YTAwMDA1LCAweDAsIAorMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgCisweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAKKzB4ODAwMTYzNywgMHgwLCAweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAKKzB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgCisweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAKKzB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAxMiwgMHhhYzgyMDAwMCwgCisweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDU2MDAwMDBiLCAweDI0MTAwMDAxLCAKKzB4OGVlMjA0ZTQsIDB4M2MwNDAwMDEsIDB4MjQ4NDUyOGMsIDB4YWZhMDAwMTQsIAorMHhhZmEyMDAxMCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgCisweGMwMDI0MDMsIDB4MzRhNWYwMDYsIDB4MTYwMDAwMDMsIDB4MjQwMjAwMDEsIAorMHg4MDAxNjUwLCAweGEyZTIwNGY0LCAweDhlZTIwMTcwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxNzAsIDB4OGVlMjAxNzAsIDB4OGVlMjA0ZTQsIDB4YTJlMDA0ZjQsIAorMHhhZWUwMDRmMCwgMHhhZWUwNzI3NCwgMHhhZWUyMDRmOCwgMHg4ZWUyMGUxYywgCisweDEwNDAwMDZkLCAweDAsIDB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIAorMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIAorMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAKKzB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwgMHg4MDIxLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTZhZCwgMHg4ZWUyMDFhNCwgCisweDhlZTI3MjRjLCAweGFjNjIwMDFjLCAweDhlZTQwNGE4LCAweDhlZTUwNGFjLCAKKzB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsIAorMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgCisweDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAKKzB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIAorMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDEyLCAKKzB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgCisweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAKKzB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsIAorMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAKKzB4MTBhMjAwMDUsIDB4MCwgMHg4MDAxNjk3LCAweDAsIAorMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAKKzB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIAorMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAxNmFkLCAweDAsIAorMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgCisweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4MjQwMjAwMTIsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIAorMHg1NjAwMDAwYiwgMHgyNDEwMDAwMSwgMHg4ZWUyNzI0YywgMHgzYzA0MDAwMSwgCisweDI0ODQ1Mjk4LCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhlZTY3MjRjLCAKKzB4OGY0NzAyODAsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwOCwgCisweDU2MDAwMDAxLCAweGFlZTAwZTFjLCAweDhlZTIwMTc0LCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxNzQsIDB4OGVlMjAxNzQsIDB4OGVlMjRlMjQsIDB4MTA0MDAwMTksIAorMHgwLCAweGFlZTA0ZTI0LCAweDhmODIwMDQwLCAweDMwNDIwMDAxLCAKKzB4MTQ0MDAwMDgsIDB4MCwgMHg4ZjQzMDEwNCwgMHgyNDAyMDAwMSwgCisweDEwNjIwMDA0LCAweDAsIDB4OGY0MjAyNjQsIDB4MTA0MDAwMDYsIAorMHgwLCAweDhlZTIwMTdjLCAweDI0NDIwMDAxLCAweGFlZTIwMTdjLCAKKzB4ODAwMTZkYSwgMHg4ZWUyMDE3YywgMHg4ZjgyMDA0NCwgMHgzNDQyMDAwNCwgCisweGFmODIwMDQ0LCAweDhlZTIwMTc4LCAweDI0NDIwMDAxLCAweGFlZTIwMTc4LCAKKzB4OGVlMjAxNzgsIDB4OGVlMjcyNzgsIDB4MjQ0MmZmOTksIDB4YWVlMjcyNzgsIAorMHg4ZWUyNzI3OCwgMHgxYzQwMDJhZCwgMHgwLCAweDhmNDIwMjM4LCAKKzB4MTA0MDAyYWEsIDB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg5MDQyODNlMCwgMHgxNDQwMDJhNSwgMHgwLCAweDhmNDIwMDgwLCAKKzB4YWVlMjAwNGMsIDB4OGY0MjAwYzAsIDB4YWVlMjAwNDgsIDB4OGY0MjAwODQsIAorMHhhZWUyMDAzOCwgMHg4ZjQyMDA4NCwgMHhhZWUyMDI0NCwgMHg4ZjQyMDA4OCwgCisweGFlZTIwMjQ4LCAweDhmNDIwMDhjLCAweGFlZTIwMjRjLCAweDhmNDIwMDkwLCAKKzB4YWVlMjAyNTAsIDB4OGY0MjAwOTQsIDB4YWVlMjAyNTQsIDB4OGY0MjAwOTgsIAorMHhhZWUyMDI1OCwgMHg4ZjQyMDA5YywgMHhhZWUyMDI1YywgMHg4ZjQyMDBhMCwgCisweGFlZTIwMjYwLCAweDhmNDIwMGE0LCAweGFlZTIwMjY0LCAweDhmNDIwMGE4LCAKKzB4YWVlMjAyNjgsIDB4OGY0MjAwYWMsIDB4YWVlMjAyNmMsIDB4OGY0MjAwYjAsIAorMHhhZWUyMDI3MCwgMHg4ZjQyMDBiNCwgMHhhZWUyMDI3NCwgMHg4ZjQyMDBiOCwgCisweGFlZTIwMjc4LCAweDhmNDIwMGJjLCAweDI0MDQwMDAxLCAweGFlZTIwMjdjLCAKKzB4YWVlMDAwM2MsIDB4NDEwODAsIDB4NTcxMDIxLCAweDhlZTMwMDNjLCAKKzB4OGM0MjAyNDQsIDB4MjQ4NDAwMDEsIDB4NjIxODIxLCAweDJjODIwMDBmLCAKKzB4YWVlMzAwM2MsIDB4MTQ0MGZmZjgsIDB4NDEwODAsIDB4OGY0MjAwY2MsIAorMHhhZWUyMDA1MCwgMHg4ZjQyMDBkMCwgMHhhZWUyMDA1NCwgMHg4ZjgzMDEyMCwgCisweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgCisweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIAorMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAKKzB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxNzc1LCAKKzB4OGVlMjAxYTQsIDB4OGY0NDAyMDgsIDB4OGY0NTAyMGMsIDB4MjZlMjAwMzAsIAorMHhhYzYyMDAwOCwgMHgyNDAyMDQwMCwgMHhhNDYyMDAwZSwgMHgyNDAyMDAwZiwgCisweGFjNjIwMDE4LCAweGFjNjAwMDFjLCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAKKzB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIAorMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDcsIAorMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAKKzB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIAorMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwgCisweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIAorMHgxMGEyMDAwNSwgMHgwLCAweDgwMDE3NWYsIDB4MCwgCisweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIAorMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgCisweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDE3NzUsIDB4MCwgCisweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgCisweDEyMDAwMjEyLCAweDNjMDIwNDAwLCAweGFmYTIwMDE4LCAweDNjMDIwMDAxLCAKKzB4NTcxMDIxLCAweDkwNDI4M2IwLCAweDEwNDAwMTBiLCAweDAsIAorMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgMHgyNDQyMDAwMSwgMHgzMDRhMDBmZiwgCisweDUxNDMwMGZkLCAweGFmYTAwMDEwLCAweDhlZTIwNjA4LCAweDIxMGMwLCAKKzB4NTcxMDIxLCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLCAweGFjNDMwNjBjLCAKKzB4YWM0NDA2MTAsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsIAorMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDEwNDAwMDZhLCAweDU4MjEsIAorMHgyNDE4MDAwOCwgMHgyNDBmMDAwZCwgMHgyNDBkMDAwNywgMHgyNDBjMDA0MCwgCisweDI0MGUwMDAxLCAweDhmODcwMTIwLCAweDI3NjIzODAwLCAweDI0ZTgwMDIwLCAKKzB4MTAyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY4MzAwMCwgMHg4ZjgyMDEyOCwgCisweDExMDIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIDB4MTUwMjAwMDcsIAorMHgxMDIxLCAweDhlZTIwMWE0LCAweDgwMjEsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFhNCwgMHg4MDAxN2YzLCAweDhlZTIwMWE0LCAweDhlZTQwNjA4LCAKKzB4NDIwYzAsIDB4ODAxODIxLCAweDhlZTQwNDMwLCAweDhlZTUwNDM0LCAKKzB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLCAKKzB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsIDB4OGVlMjA2MDgsIDB4YTRmODAwMGUsIAorMHhhY2VmMDAxOCwgMHhhY2VhMDAxYywgMHgyMTBjMCwgMHgyNDQyMDYwYywgCisweDJlMjEwMjEsIDB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsIDB4YWNlMjAwMTAsIAorMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgMHgyNDEwMDAwMSwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHg4YzgyMDAwMCwgMHgxNDRkMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAKKzB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwgCisweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4MTA0YzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgCisweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIDB4ODAwMTdlMCwgCisweDAsIDB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgCisweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAKKzB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIDB4ODAwMTdmMywgCisweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA0YzAwMDMsIAorMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAKKzB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgCisweGFjOGQwMDAwLCAweGFjOGUwMDA0LCAweDU2MDAwMDA2LCAweDI0MGIwMDAxLCAKKzB4OGY4MjAwNTQsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxNDQwZmY5ZCwgCisweDAsIDB4MzE2MzAwZmYsIDB4MjQwMjAwMDEsIDB4MTQ2MjAwNzcsIAorMHgzYzA1MDAwOSwgMHhhZWVhMDYwOCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgCisweDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTA0MDAwNjEsIAorMHg1ODIxLCAweDI0MGQwMDA4LCAweDI0MGMwMDExLCAweDI0MDgwMDEyLCAKKzB4MjQwNzAwNDAsIDB4MjQwYTAwMDEsIDB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIAorMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIAorMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAKKzB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwgMHg4MDIxLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTg1ZiwgMHg4ZWUyMDFhNCwgCisweDhlZTIwNjA4LCAweGFjNjIwMDFjLCAweDhlZTQwNGEwLCAweDhlZTUwNGE0LCAKKzB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4YTQ2ZDAwMGUsIDB4YWM2YzAwMTgsIAorMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgCisweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAweDI0MTAwMDAxLCAKKzB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgCisweDhjODIwMDAwLCAweDE0NDgwMDFmLCAweDAsIDB4OGVlMzRlMzAsIAorMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LCAKKzB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIAorMHgyNDQyMDAwMSwgMHgxMDQ3MDAwNywgMHgwLCAweDhlZTI0ZTM0LCAKKzB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDAxODRjLCAKKzB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAKKzB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIAorMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgMHg4MDAxODVmLCAKKzB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDQ3MDAwMywgCisweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4YWM4ODAwMDAsIDB4YWM4YTAwMDQsIDB4NTYwMDAwMDYsIDB4MjQwYjAwMDEsIAorMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDE0NDBmZmE2LCAKKzB4MCwgMHgzMTYzMDBmZiwgMHgyNDAyMDAwMSwgMHgxNDYyMDAwMywgCisweDNjMDUwMDA5LCAweDgwMDE5N2MsIDB4MjQxMDAwMDEsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTJhNCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwgCisweDhmODcwMTI0LCAweDgwMDE4N2IsIDB4MzRhNWYwMTEsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTJiMCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwgCisweDhmODcwMTI0LCAweDM0YTVmMDEwLCAweGMwMDI0MDMsIDB4ODAyMSwgCisweDgwMDE5N2MsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTJiYywgCisweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAKKzB4ODAwMTk3NSwgMHgzNGE1ZjAwZiwgMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgCisweDI0NDIwMDAxLCAweDMwNDkwMGZmLCAweDUxMjMwMGUyLCAweGFmYTAwMDEwLCAKKzB4OGVlMjA2MDgsIDB4MjEwYzAsIDB4NTcxMDIxLCAweDhmYTMwMDE4LCAKKzB4OGZhNDAwMWMsIDB4YWM0MzA2MGMsIDB4YWM0NDA2MTAsIDB4OGY4NzAxMjAsIAorMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAKKzB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwgCisweDhmODIwMTI0LCAweDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsIAorMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDE4ZjcsIAorMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsIAorMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAKKzB4ODIyMDIxLCAweDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgCisweDhlZTMwNjA4LCAweDI0MDIwMDA4LCAweGE0ZTIwMDBlLCAweDI0MDIwMDBkLCAKKzB4YWNlMjAwMTgsIDB4YWNlOTAwMWMsIDB4MzE4YzAsIDB4MjQ2MzA2MGMsIAorMHgyZTMxMDIxLCAweGFjZTIwMDA4LCAweDhlZTIwNGM0LCAweGFjZTIwMDEwLCAKKzB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MzAwMDAsIDB4MjQwMjAwMDcsIDB4MTQ2MjAwMWYsIDB4MCwgCisweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAKKzB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIAorMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAKKzB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgCisweDgwMDE4ZTEsIDB4MCwgMHgxNGEwMDAwNSwgMHgwLCAKKzB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIAorMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgCisweDgwMDE4ZjcsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgCisweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIAorMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDcsIDB4YWM4MjAwMDAsIAorMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHg1NjAwMDAwYywgMHhhZWU5MDYwOCwgCisweDNjMDQwMDAxLCAweDI0ODQ1MmM4LCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAKKzB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgCisweDM0YTVmMDAwLCAweDgwMDE5N2MsIDB4MCwgMHg4ZjgzMDEyMCwgCisweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgCisweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIAorMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAKKzB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxOTVlLCAKKzB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTAsIAorMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgCisweGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLCAKKzB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIAorMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgCisweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIAorMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAKKzB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIAorMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgCisweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIAorMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAweDgwMDE5NDgsIAorMHgwLCAweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgCisweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDE5NWUsIAorMHgwLCAweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAKKzB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgCisweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHgyNDAyMDAxMiwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgCisweGFjODIwMDA0LCAweDU2MDAwMDFkLCAweDI0MTAwMDAxLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDUyZDAsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIAorMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDAxLCAKKzB4OGVlMjAxYjAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYjAsIDB4ODAwMTk3YywgCisweDhlZTIwMWIwLCAweDNjMDQwMDAxLCAweDI0ODQ1MmRjLCAweGFmYTAwMDE0LCAKKzB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4MzRhNWYwMDUsIAorMHhjMDAyNDAzLCAweDAsIDB4OGVlMjAxYWMsIDB4ODAyMSwgCisweDI0NDIwMDAxLCAweGFlZTIwMWFjLCAweDhlZTIwMWFjLCAweDEyMDAwMDBjLCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA4M2IwLCAKKzB4OGY0MjAyMzgsIDB4OGVlMzAxNTgsIDB4MjQ2MzAwMDEsIDB4YWVlMzAxNTgsIAorMHg4ZWUzMDE1OCwgMHg4MDAxOThjLCAweGFlZTI3Mjc4LCAweDI0MDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjI4M2IwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjVjZDgsIDB4MTA0MDAxODcsIDB4MCwgMHg4ZWUyN2I4NCwgCisweDI0NDMwMDAxLCAweDI4NDIwMGM5LCAweDE0NDAwMWE0LCAweGFlZTM3Yjg0LCAKKzB4OGVlMjA0ZDQsIDB4MzA0MjAwMDIsIDB4MTQ0MDAxMTksIDB4YWVlMDdiODQsIAorMHg4ZWUyMDRkNCwgMHgzYzAzMDYwMCwgMHgzNDYzMTAwMCwgMHgzNDQyMDAwMiwgCisweGFlZTIwNGQ0LCAweGFmYTMwMDE4LCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LCAKKzB4MjQ0MjAwMDEsIDB4MzA0YTAwZmYsIDB4NTE0MzAwZmQsIDB4YWZhMDAwMTAsIAorMHg4ZWUyMDYwOCwgMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsIAorMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIAorMHgxMDQwMDA2YSwgMHg1ODIxLCAweDI0MTgwMDA4LCAweDI0MGYwMDBkLCAKKzB4MjQwZDAwMDcsIDB4MjQwYzAwNDAsIDB4MjQwZTAwMDEsIDB4OGY4NzAxMjAsIAorMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAKKzB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwgCisweDhmODIwMTI0LCAweDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsIAorMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDFhMTUsIAorMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsIAorMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAKKzB4ODIyMDIxLCAweDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgCisweDhlZTIwNjA4LCAweGE0ZjgwMDBlLCAweGFjZWYwMDE4LCAweGFjZWEwMDFjLCAKKzB4MjEwYzAsIDB4MjQ0MjA2MGMsIDB4MmUyMTAyMSwgMHhhY2UyMDAwOCwgCisweDhlZTIwNGM0LCAweGFjZTIwMDEwLCAweGFmODgwMTIwLCAweDkyZTI0ZTIwLCAKKzB4MTQ0MDAwMzMsIDB4MjQxMDAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIAorMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NGQwMDFmLCAKKzB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgCisweDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIAorMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywgCisweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIAorMHgwLCAweDgwMDFhMDIsIDB4MCwgMHgxNDYwMDAwNSwgCisweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIAorMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgCisweGFjODAwMDAwLCAweDgwMDFhMTUsIDB4MCwgMHg4ZWUyNGUzMCwgCisweDI0NDIwMDAxLCAweDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIAorMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4YWM4ZDAwMDAsIDB4YWM4ZTAwMDQsIAorMHg1NjAwMDAwNiwgMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAKKzB4MmM0MjAwMzMsIDB4MTQ0MGZmOWQsIDB4MCwgMHgzMTYzMDBmZiwgCisweDI0MDIwMDAxLCAweDU0NjIwMDc4LCAweGFmYTAwMDEwLCAweGFlZWEwNjA4LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsIDB4MTIyMTAyMywgCisweDJjNDIwMDMzLCAweDEwNDAwMDYxLCAweDU4MjEsIDB4MjQwZDAwMDgsIAorMHgyNDBjMDAxMSwgMHgyNDA4MDAxMiwgMHgyNDA3MDA0MCwgMHgyNDBhMDAwMSwgCisweDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgCisweDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAKKzB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAKKzB4OGVlMjAxYTQsIDB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgCisweDgwMDFhODEsIDB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIAorMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgCisweGE0NmQwMDBlLCAweGFjNmMwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAKKzB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIAorMHgxNDQwMDAzMywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0ODAwMWYsIAorMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAKKzB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgCisweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDcwMDA3LCAKKzB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgCisweDAsIDB4ODAwMWE2ZSwgMHgwLCAweDE0NjAwMDA1LCAKKzB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgCisweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLCAKKzB4YWM4MDAwMDAsIDB4ODAwMWE4MSwgMHgwLCAweDhlZTI0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4NTA0NzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgCisweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAKKzB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHhhYzg4MDAwMCwgMHhhYzhhMDAwNCwgCisweDU2MDAwMDA2LCAweDI0MGIwMDAxLCAweDhmODIwMDU0LCAweDEyMjEwMjMsIAorMHgyYzQyMDAzMywgMHgxNDQwZmZhNiwgMHgwLCAweDMxNjMwMGZmLCAKKzB4MjQwMjAwMDEsIDB4MTA2MjAwMjIsIDB4MCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1MmE0LCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTIwLCAKKzB4OGY4NzAxMjQsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAxMSwgCisweDgwMDFhYWQsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTJiMCwgCisweGFmYTAwMDE0LCAweDhmODYwMTIwLCAweDhmODcwMTI0LCAweDNjMDUwMDA5LCAKKzB4YzAwMjQwMywgMHgzNGE1ZjAxMCwgMHg4MDAxYWFkLCAweDAsIAorMHgzYzA0MDAwMSwgMHgyNDg0NTJiYywgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgCisweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMGYsIAorMHg4ZWUyMDFhYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywgCisweDhlZTIwMTVjLCAweDI0NDIwMDAxLCAweGFlZTIwMTVjLCAweDhlZTIwMTVjLCAKKzB4OGVlMjA0ZDQsIDB4MzA0MjAwMDEsIDB4MTA0MDAwNTUsIDB4MCwgCisweDhmNDIwMjE4LCAweDMwNDIwMDgwLCAweDEwNDAwMDI5LCAweDAsIAorMHg4ZjgyMDA0NCwgMHgzNDQyMDA0MCwgMHhhZjgyMDA0NCwgMHg4ZWUyN2I3YywgCisweDQwMjgyMSwgMHg4ZWUyMDBjMCwgMHg4ZWUzMDBjNCwgMHgyNDA2MDAwMCwgCisweDI0MDdmZmZmLCAweDIwMjEsIDB4NDYxMDI0LCAweDE0NDQwMDBkLCAKKzB4NjcxODI0LCAweDE0NjUwMDBiLCAweDAsIDB4OGVlMjdiODAsIAorMHg0MDI4MjEsIDB4OGVlMjAwZTAsIDB4OGVlMzAwZTQsIDB4MjAyMSwgCisweDQ2MTAyNCwgMHgxNDQ0MDAwMywgMHg2NzE4MjQsIDB4MTA2NTAwMGIsIAorMHgwLCAweDhlZTIwMGMwLCAweDhlZTMwMGM0LCAweDhlZTQwMGUwLCAKKzB4OGVlNTAwZTQsIDB4YWVlMzdiN2MsIDB4YWVlNTdiODAsIDB4OGY4MjAwNDQsIAorMHgzODQyMDAyMCwgMHg4MDAxYjM4LCAweGFmODIwMDQ0LCAweDhmODIwMDQ0LCAKKzB4MjQwM2ZmZGYsIDB4NDMxMDI0LCAweDgwMDFiMzgsIDB4YWY4MjAwNDQsIAorMHg4ZjgyMDA0NCwgMHgyNDAzZmZkZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsIAorMHg4ZWUyN2I3YywgMHg0MDI4MjEsIDB4OGVlMjAwYzAsIDB4OGVlMzAwYzQsIAorMHgyNDA2MDAwMCwgMHgyNDA3ZmZmZiwgMHgyMDIxLCAweDQ2MTAyNCwgCisweDE0NDQwMDBkLCAweDY3MTgyNCwgMHgxNDY1MDAwYiwgMHgwLCAKKzB4OGVlMjdiODAsIDB4NDAyODIxLCAweDhlZTIwMGUwLCAweDhlZTMwMGU0LCAKKzB4MjAyMSwgMHg0NjEwMjQsIDB4MTQ0NDAwMDMsIDB4NjcxODI0LCAKKzB4MTA2NTAwMGIsIDB4MCwgMHg4ZWUyMDBjMCwgMHg4ZWUzMDBjNCwgCisweDhlZTQwMGUwLCAweDhlZTUwMGU0LCAweGFlZTM3YjdjLCAweGFlZTU3YjgwLCAKKzB4OGY4MjAwNDQsIDB4Mzg0MjAwNDAsIDB4ODAwMWIzOCwgMHhhZjgyMDA0NCwgCisweDhmODIwMDQ0LCAweDM0NDIwMDQwLCAweDgwMDFiMzgsIDB4YWY4MjAwNDQsIAorMHg4ZjgyMDA0NCwgMHgzNDQyMDA0MCwgMHhhZjgyMDA0NCwgMHg4ZWUyN2I4YywgCisweDI0NDMwMDAxLCAweDI4NDIwMDE1LCAweDE0NDAwMDI4LCAweGFlZTM3YjhjLCAKKzB4OGY4MjAwNDQsIDB4Mzg0MjAwMjAsIDB4YWY4MjAwNDQsIDB4ODAwMWIzOCwgCisweGFlZTA3YjhjLCAweDhlZTIwNGQ0LCAweDMwNDIwMDAxLCAweDEwNDAwMDExLCAKKzB4MCwgMHg4ZjQyMDIxOCwgMHgzMDQyMDA4MCwgMHgxMDQwMDAwOSwgCisweDAsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwMjAsIDB4YWY4MjAwNDQsIAorMHg4ZjgyMDA0NCwgMHgyNDAzZmZiZiwgMHg0MzEwMjQsIDB4ODAwMWIzNiwgCisweGFmODIwMDQ0LCAweDhmODIwMDQ0LCAweDM0NDIwMDYwLCAweDgwMDFiMzYsIAorMHhhZjgyMDA0NCwgMHg4ZjgyMDA0NCwgMHgzNDQyMDA0MCwgMHhhZjgyMDA0NCwgCisweDhlZTI3Yjg4LCAweDI0NDMwMDAxLCAweDI4NDIxMzg5LCAweDE0NDAwMDA1LCAKKzB4YWVlMzdiODgsIDB4OGY4MjAwNDQsIDB4Mzg0MjAwMjAsIDB4YWY4MjAwNDQsIAorMHhhZWUwN2I4OCwgMHhjMDA0NjAzLCAweDAsIDB4OGZiZjAwMjQsIAorMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDI3YmRmZmI4LCAKKzB4YWZiZjAwNDQsIDB4YWZiNjAwNDAsIDB4YWZiNTAwM2MsIDB4YWZiNDAwMzgsIAorMHhhZmIzMDAzNCwgMHhhZmIyMDAzMCwgMHhhZmIxMDAyYywgMHhhZmIwMDAyOCwgCisweDhmOTYwMDY0LCAweDMyYzIwMDA0LCAweDEwNDAwMDBjLCAweDI0MDIwMDA0LCAKKzB4YWY4MjAwNjQsIDB4OGY0MjAxMTQsIDB4YWVlMjA0ZTAsIDB4OGY4MjAwNjAsIAorMHgzNDQyMDAwOCwgMHhhZjgyMDA2MCwgMHg4ZWUyMDE2YywgMHgyNDQyMDAwMSwgCisweGFlZTIwMTZjLCAweDgwMDIyZjQsIDB4OGVlMjAxNmMsIDB4MzJjMjAwMDEsIAorMHgxMDQwMDAwNCwgMHgyNDAyMDAwMSwgMHhhZjgyMDA2NCwgMHg4MDAyMmY0LCAKKzB4MCwgMHgzMmMyMDAwMiwgMHgxNDQwMDAwYywgMHgzYzA1MDAwMywgCisweDNjMDQwMDAxLCAweDI0ODQ1MzU0LCAweDM0YTUwMDAxLCAweDJjMDMwMjEsIAorMHgzODIxLCAweGFmYTAwMDEwLCAweGMwMDI0MDMsIDB4YWZhMDAwMTQsIAorMHgyNDAyZmZmOCwgMHg4MDAyMmY0LCAweGFmODIwMDY0LCAweDhmNDMwMjJjLCAKKzB4OGY0MjAxMGMsIDB4NTA2MjAwMGMsIDB4YWZhMDAwMTAsIDB4OGY0MjAyMmMsIAorMHgyMTA4MCwgMHg1YTEwMjEsIDB4OGM0MjAzMDAsIDB4YWZhMjAwMjAsIAorMHg4ZjQyMDIyYywgMHgyNDA3MDAwMSwgMHgyNDQyMDAwMSwgMHgzMDQyMDAzZiwgCisweDgwMDFiODAsIDB4YWY0MjAyMmMsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzNjAsIAorMHhhZmEwMDAxNCwgMHg4ZjQ2MDIyYywgMHg4ZjQ3MDEwYywgMHgzYzA1MDAwMywgCisweGMwMDI0MDMsIDB4MzRhNWYwMWYsIDB4MzgyMSwgMHgxNGUwMDAwMywgCisweDAsIDB4ODAwMjJlZCwgMHhhZjk2MDA2NCwgMHg5M2EyMDAyMCwgCisweDI0NDNmZmZmLCAweDJjNjIwMDExLCAweDEwNDAwNjU4LCAweDMxMDgwLCAKKzB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI1NDE4LCAweDQwMDAwOCwgCisweDAsIDB4OGZhMjAwMjAsIDB4MzA0MjBmZmYsIDB4YWVlMjBlMGMsIAorMHg4ZjgyMDA2MCwgMHgzNDQyMDIwMCwgMHhhZjgyMDA2MCwgMHg4ZWUyMDExOCwgCisweDI0NDIwMDAxLCAweGFlZTIwMTE4LCAweDgwMDIyZTgsIDB4OGVlMjAxMTgsIAorMHg4ZmEyMDAyMCwgMHgyNDAzMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhMDIzODNiMSwgMHgzMDQyMGZmZiwgMHhhZWUyNTIzOCwgMHg4ZjgyMDA2MCwgCisweDM0NDIwMTAwLCAweGFmODIwMDYwLCAweDhlZTIwMTQ0LCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxNDQsIDB4ODAwMjJlOCwgMHg4ZWUyMDE0NCwgMHg4ZmEyMDAyMCwgCisweDIxMjAwLCAweDIyNTAyLCAweDI0MDIwMDAxLCAweDEwODIwMDA1LCAKKzB4MjQwMjAwMDIsIDB4MTA4MjAwMDksIDB4MjQwMmZmZmUsIDB4ODAwMWJjOSwgCisweGFmYTAwMDEwLCAweDhlZTIwNGQ0LCAweGFlZTQwMDcwLCAweGFlZTQwMDc0LCAKKzB4MzQ0MjAwMDEsIDB4ODAwMWJiZCwgMHhhZWUyMDRkNCwgMHg4ZWUzMDRkNCwgCisweGFlZTQwMDcwLCAweGFlZTQwMDc0LCAweDYyMTgyNCwgMHhhZWUzMDRkNCwgCisweDhmODQwMDU0LCAweDQxNDQyLCAweDQxYzgyLCAweDQzMTAyMSwgCisweDQxY2MyLCAweDQzMTAyMywgMHg0MWQwMiwgMHg0MzEwMjEsIAorMHg0MWQ0MiwgMHg0MzEwMjMsIDB4ODAwMWJkMCwgMHhhZWUyMDA3OCwgCisweDNjMDQwMDAxLCAweDI0ODQ1MzZjLCAweGFmYTAwMDE0LCAweDhmYTYwMDIwLCAKKzB4M2MwNTAwMDMsIDB4YzAwMjQwMywgMHgzNGE1MDAwNCwgMHg4ZWUyMDExMCwgCisweDI0NDIwMDAxLCAweGFlZTIwMTEwLCAweDgwMDIyZTgsIDB4OGVlMjAxMTAsIAorMHgyNzQ0MDIxMiwgMHhjMDAyMmZlLCAweDI0MDUwMDA2LCAweDMwNDkwMDFmLCAKKzB4OTIwYzAsIDB4MmU0MTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyNDAwMCwgCisweDEwNDAwMDBhLCAweDk3MTAyMSwgMHg5NzQzMDIxMiwgMHhhNDQzNzI3ZSwgCisweDhmNDMwMjE0LCAweDk3MTAyMSwgMHhhYzQzNzI4MCwgMHgyZTQxODIxLCAKKzB4MzQwMjgwMDAsIDB4ODAwMWM3OSwgMHhhNDYyNzI3YywgMHg5NDQzNzI3ZSwgCisweDk3NDIwMjEyLCAweDE0NjIwMDA2LCAweDJlNDEwMjEsIDB4OTcxMDIxLCAKKzB4OGM0MzcyODAsIDB4OGY0MjAyMTQsIDB4MTA2MjAwOWYsIDB4MmU0MTAyMSwgCisweDk0NDI3MjdjLCAweDMwNDI4MDAwLCAweDEwNDAwMDJhLCAweDI0MDZmZmZmLCAKKzB4MjAyMSwgMHg0MTBjMCwgMHgyZTIxMDIxLCAweDk0NDI3MzdjLCAKKzB4MzA0MjQwMDAsIDB4NTQ0MDAwMDUsIDB4ODAzMDIxLCAweDI0ODQwMDAxLCAKKzB4MmM4MjAwODAsIDB4MTQ0MGZmZjgsIDB4NDEwYzAsIDB4NGMxMDAxMCwgCisweDYxOGMwLCAweDYxMGMwLCAweDU3MTgyMSwgMHg4YzYzNzM3YywgCisweDU3MTAyMSwgMHhhZmEzMDAxMCwgMHg4YzQyNzM4MCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1Mzc4LCAweGFmYTIwMDE0LCAweDhmNDcwMjE0LCAweDNjMDUwMDAzLCAKKzB4YzAwMjQwMywgMHgzNGE1MDAxMywgMHg4MDAxYzkwLCAweDNjMDIwODAwLCAKKzB4OTc0NDAyMTIsIDB4NzcxMDIxLCAweGE0NDQ3MzdlLCAweDhmNDQwMjE0LCAKKzB4NzcxMDIxLCAweDJlMzE4MjEsIDB4YWM0NDczODAsIDB4MzQwMjgwMDAsIAorMHhhNDYyNzM3YywgMHg5MTBjMCwgMHgyZTIxMDIxLCAweDgwMDFjNzksIAorMHhhNDQ2NzI3YywgMHgyZTQxMDIxLCAweDk0NDU3MjdjLCAweDgwMDFjMmUsIAorMHg1MTBjMCwgMHg5NDQzNzM3ZSwgMHg5NzQyMDIxMiwgMHgxNDYyMDAwNiwgCisweDUxMGMwLCAweDk3MTAyMSwgMHg4YzQzNzM4MCwgMHg4ZjQyMDIxNCwgCisweDEwNjIwMDY1LCAweDUxMGMwLCAweDJlMjEwMjEsIDB4OTQ0NTczN2MsIAorMHg1MTBjMCwgMHgyZTIxMDIxLCAweDk0NDI3MzdjLCAweDMwNDI4MDAwLCAKKzB4MTA0MGZmZjAsIDB4OTcxMDIxLCAweDUyMGMwLCAweDk3MTAyMSwgCisweDk0NDM3MzdlLCAweDk3NDIwMjEyLCAweDE0NjIwMDA2LCAweDI0MDZmZmZmLCAKKzB4OTcxMDIxLCAweDhjNDM3MzgwLCAweDhmNDIwMjE0LCAweDEwNjIwMDUzLCAKKzB4M2MwMjA4MDAsIDB4MjAyMSwgMHg0MTBjMCwgMHgyZTIxMDIxLCAKKzB4OTQ0MjczN2MsIDB4MzA0MjQwMDAsIDB4NTQ0MDAwMDUsIDB4ODAzMDIxLCAKKzB4MjQ4NDAwMDEsIDB4MmM4MjAwODAsIDB4MTQ0MGZmZjgsIDB4NDEwYzAsIAorMHg0YzEwMDIzLCAweDYxOGMwLCAweDkxMGMwLCAweDU3MTgyMSwgCisweDhjNjM3MjdjLCAweDU3MTAyMSwgMHhhZmEzMDAxMCwgMHg4YzQyNzI4MCwgCisweDNjMDQwMDAxLCAweDI0ODQ1Mzg0LCAweGFmYTIwMDE0LCAweDhmNDcwMjE0LCAKKzB4M2MwNTAwMDMsIDB4YzAwMjQwMywgMHgzNGE1ZjAxNywgMHg4MDAxYzkwLCAKKzB4M2MwMjA4MDAsIDB4OGY0MzAyMTAsIDB4YjcxMDIxLCAweGFjNDM3NzdjLCAKKzB4OGY0MzAyMTQsIDB4YjcxMDIxLCAweGFjNDM3NzgwLCAweDNjMDIwMDAxLCAKKzB4NTcxMDIxLCAweDhjNDI4M2I0LCAweDI0NDIwMDAxLCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweGFjMjI4M2I0LCAweDNjMDMwMDAxLCAweDc3MTgyMSwgCisweDhjNjM4M2I0LCAweDJlNTEwMjEsIDB4ODAwMWM4MiwgMHhhNDQzNzc3YywgCisweDk3NDQwMjEyLCAweDc3MTAyMSwgMHhhNDQ0NzM3ZSwgMHg4ZjQ0MDIxNCwgCisweDc3MTAyMSwgMHgyZTMxODIxLCAweGFjNDQ3MzgwLCAweDM0MDI4MDAwLCAKKzB4YTQ2MjczN2MsIDB4NTEwYzAsIDB4MmUyMTAyMSwgMHhhNDQ2NzM3YywgCisweDIwMjEsIDB4NDI4YzAsIDB4MmU1MTAyMSwgMHg5NDQyNzc3YywgCisweDEwNDBmZmRjLCAweDI0ODQwMDAxLCAweDJjODIwMDgwLCAweDU0NDBmZmZhLCAKKzB4NDI4YzAsIDB4OTJlMjA0ZDgsIDB4MTA0MDAwMDYsIDB4MjQwMjAwMDEsIAorMHg4ZWUzMDRkYywgMHgxMjIxMDA0LCAweDYyMTgyNSwgMHg4MDAxYzhmLCAKKzB4YWVlMzA0ZGMsIDB4OGY4MzAyMjgsIDB4MjQwMjAwMDEsIDB4MTIyMTAwNCwgCisweDYyMTgyNSwgMHhhZjgzMDIyOCwgMHgzYzAyMDgwMCwgMHgzNDQyMTAwMCwgCisweGFmYTIwMDE4LCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LCAweDI0NDIwMDAxLCAKKzB4MzA0YTAwZmYsIDB4NTE0MzAwZmQsIDB4YWZhMDAwMTAsIDB4OGVlMjA2MDgsIAorMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsIAorMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgCisweDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTA0MDAwNmEsIAorMHg1ODIxLCAweDI0MTAwMDA4LCAweDI0MGYwMDBkLCAweDI0MGQwMDA3LCAKKzB4MjQwYzAwNDAsIDB4MjQwZTAwMDEsIDB4OGY4NzAxMjAsIDB4Mjc2MjM4MDAsIAorMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjgzMDAwLCAKKzB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgCisweDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsIDB4MzgyMSwgCisweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDFkMDgsIDB4OGVlMjAxYTQsIAorMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsIDB4OGVlNDA0MzAsIAorMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwgCisweDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgMHg4ZWUyMDYwOCwgCisweGE0ZjAwMDBlLCAweGFjZWYwMDE4LCAweGFjZWEwMDFjLCAweDIxMGMwLCAKKzB4MjQ0MjA2MGMsIDB4MmUyMTAyMSwgMHhhY2UyMDAwOCwgMHg4ZWUyMDRjNCwgCisweGFjZTIwMDEwLCAweGFmODgwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAKKzB4MjQwNzAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIAorMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NGQwMDFmLCAweDAsIAorMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAKKzB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIAorMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywgMHgwLCAKKzB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgCisweDgwMDFjZjUsIDB4MCwgMHgxNDYwMDAwNSwgMHgwLCAKKzB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIAorMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgCisweDgwMDFkMDgsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgCisweDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgCisweDJlMjIwMjEsIDB4YWM4ZDAwMDAsIDB4YWM4ZTAwMDQsIDB4NTRlMDAwMDYsIAorMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAKKzB4MTQ0MGZmOWQsIDB4MCwgMHgzMTYzMDBmZiwgMHgyNDAyMDAwMSwgCisweDU0NjIwMDc4LCAweGFmYTAwMDEwLCAweGFlZWEwNjA4LCAweDhmODMwMDU0LCAKKzB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgCisweDEwNDAwMDYxLCAweDU4MjEsIDB4MjQwZTAwMDgsIDB4MjQwZDAwMTEsIAorMHgyNDBhMDAxMiwgMHgyNDA4MDA0MCwgMHgyNDBjMDAwMSwgMHg4ZjgzMDEyMCwgCisweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgCisweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIAorMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAKKzB4MzgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxZDc0LCAKKzB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTAsIAorMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHhhNDZlMDAwZSwgCisweGFjNmQwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LCAKKzB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsIAorMHgyNDA3MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgCisweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0YTAwMWYsIDB4MCwgCisweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIAorMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgCisweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDgwMDA3LCAweDAsIAorMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAKKzB4ODAwMWQ2MSwgMHgwLCAweDE0NjAwMDA1LCAweDAsIAorMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgCisweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLCAKKzB4ODAwMWQ3NCwgMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAKKzB4NTA0ODAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgCisweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHhhYzhhMDAwMCwgMHhhYzhjMDAwNCwgMHg1NGUwMDAwNiwgCisweDI0MGIwMDAxLCAweDhmODIwMDU0LCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIAorMHgxNDQwZmZhNiwgMHgwLCAweDMxNjMwMGZmLCAweDI0MDIwMDAxLCAKKzB4MTA2MjAwMjIsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTM5MCwgCisweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTIwLCAweDhmODcwMTI0LCAKKzB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAxMSwgMHg4MDAxZGEwLCAKKzB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTM5YywgMHhhZmEwMDAxNCwgCisweDhmODYwMTIwLCAweDhmODcwMTI0LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIAorMHgzNGE1ZjAxMCwgMHg4MDAxZGEwLCAweDAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTNhOCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgCisweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMGYsIDB4OGVlMjAxYWMsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywgMHg4ZWUyMDEyNCwgCisweDI0NDIwMDAxLCAweGFlZTIwMTI0LCAweDgwMDFmOTcsIDB4OGVlMjAxMjQsIAorMHgyNzQ0MDIxMiwgMHhjMDAyMmZlLCAweDI0MDUwMDA2LCAweDMwNDkwMDFmLCAKKzB4OTI4YzAsIDB4MmU1MTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyODAwMCwgCisweDEwNDAwMDJmLCAweDJlNTEwMjEsIDB4OTQ0MjcyN2MsIDB4MzA0MjQwMDAsIAorMHgxNDQwMDAxYywgMHhiNzEwMjEsIDB4OTQ0MzcyN2UsIDB4OTc0MjAyMTIsIAorMHgxNDYyMDAxOCwgMHhiNzEwMjEsIDB4OGM0MzcyODAsIDB4OGY0MjAyMTQsIAorMHg1NDYyMDAxNiwgMHhhZmEyMDAxMCwgMHg5MmUyMDRkOCwgMHgxMDQwMDAwNywgCisweDI0MDIwMDAxLCAweDhlZTMwNGRjLCAweDEyMjEwMDQsIDB4MjEwMjcsIAorMHg2MjE4MjQsIDB4ODAwMWRjOSwgMHhhZWUzMDRkYywgMHg4ZjgzMDIyOCwgCisweDEyMjEwMDQsIDB4MjEwMjcsIDB4NjIxODI0LCAweGFmODMwMjI4LCAKKzB4OTEwYzAsIDB4MmUyMTgyMSwgMHgzNDAyYzAwMCwgMHg4MDAxZTRlLCAKKzB4YTQ2MjcyN2MsIDB4OGY0MjAyMTQsIDB4YWZhMjAwMTAsIDB4OTEwYzAsIAorMHg1NzEwMjEsIDB4OGM0MjcyN2MsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzYjQsIAorMHgzYzA1MDAwMywgMHhhZmEyMDAxNCwgMHg4ZjQ3MDIxMCwgMHgzNGE1ZjAxYywgCisweGMwMDI0MDMsIDB4MTIwMzAyMSwgMHg4MDAxZTgzLCAweDNjMDIwODAwLCAKKzB4YjcxMDIxLCAweDk0NDM3MjdlLCAweDk3NDIwMjEyLCAweDE0NjIwMDE5LCAKKzB4OTE4YzAsIDB4YjcxMDIxLCAweDhjNDM3MjgwLCAweDhmNDIwMjE0LCAKKzB4MTQ2MjAwMTQsIDB4OTE4YzAsIDB4MmU1MTAyMSwgMHg5NDQ3NzI3YywgCisweDcyMGMwLCAweDk3MTAyMSwgMHg5NDQzNzM3ZSwgMHhiNzEwMjEsIAorMHhhNDQzNzI3ZSwgMHg5NzEwMjEsIDB4OGM0MzczODAsIDB4YjcxMDIxLCAKKzB4YWM0MzcyODAsIDB4MmU0MTAyMSwgMHg5NDQzNzM3YywgMHgyZTUxMDIxLCAKKzB4YTQ0MzcyN2MsIDB4MmU0MTgyMSwgMHgzNDAyYzAwMCwgMHg4MDAxZTRlLCAKKzB4YTQ2MjczN2MsIDB4MmUzMTAyMSwgMHg5NDQ3NzI3YywgMHgzMDIxLCAKKzB4NzIwYzAsIDB4MmU0MTAyMSwgMHg5NDQyNzM3YywgMHg0MDIxLCAKKzB4MzA0MjgwMDAsIDB4MTQ0MDAwMjUsIDB4ZTAyODIxLCAweDYwNTAyMSwgCisweDM0MGJjMDAwLCAweDk3MTAyMSwgMHg5NDQzNzM3ZSwgMHg5NzQyMDIxMiwgCisweDU0NjIwMDE1LCAweGUwMjgyMSwgMHg5NzEwMjEsIDB4OGM0MzczODAsIAorMHg4ZjQyMDIxNCwgMHg1NDYyMDAxMCwgMHhlMDI4MjEsIDB4MTEwMDAwMDYsIAorMHgyZTQxMDIxLCAweDk0NDM3MzdjLCAweDUxMGMwLCAweDJlMjEwMjEsIAorMHg4MDAxZTFhLCAweGE0NDM3MzdjLCAweDk0NDM3MzdjLCAweDJlYTEwMjEsIAorMHhhNDQzNzI3YywgMHg3MTBjMCwgMHgyZTIxMDIxLCAweGE0NGI3MzdjLCAKKzB4ODAwMWUyOCwgMHgyNDA2MDAwMSwgMHg1MTBjMCwgMHgyZTIxMDIxLCAKKzB4OTQ0NzczN2MsIDB4NzIwYzAsIDB4MmU0MTAyMSwgMHg5NDQyNzM3YywgCisweDMwNDI4MDAwLCAweDEwNDBmZmRmLCAweDI1MDgwMDAxLCAweDMwYzIwMGZmLCAKKzB4MTQ0MDAwMjUsIDB4MjAyMSwgMHg3MjBjMCwgMHg5NzEwMjEsIAorMHg5NDQzNzM3ZSwgMHg5NzQyMDIxMiwgMHgxNDYyMDAwZiwgMHg5MTBjMCwgCisweDk3MTAyMSwgMHg4YzQzNzM4MCwgMHg4ZjQyMDIxNCwgMHgxNDYyMDAwYSwgCisweDkxMGMwLCAweDJlNDE4MjEsIDB4MzQwMmMwMDAsIDB4MTUwMDAwMTUsIAorMHhhNDYyNzM3YywgMHg5MTBjMCwgMHgyZTIxODIxLCAweDM0MDI4MDAwLCAKKzB4ODAwMWU0ZSwgMHhhNDYyNzI3YywgMHg1NzEwMjEsIDB4OGM0MjcyN2MsIAorMHgzYzA0MDAwMSwgMHgyNDg0NTNjMCwgMHgzYzA1MDAwMywgMHhhZmEyMDAxMCwgCisweDcxMGMwLCAweDU3MTAyMSwgMHg4YzQyNzM3YywgMHgzNGE1MDAxZSwgCisweDEyMDMwMjEsIDB4YzAwMjQwMywgMHhhZmEyMDAxNCwgMHg4MDAxZTgzLCAKKzB4M2MwMjA4MDAsIDB4MjAyMSwgMHg0MjhjMCwgMHhiNzEwMjEsIAorMHg5NDQzNzc3ZSwgMHg5NzQyMDIxMiwgMHg1NDYyMDAyYiwgMHgyNDg0MDAwMSwgCisweGI3MTAyMSwgMHg4YzQzNzc4MCwgMHg4ZjQyMDIxNCwgMHg1NDYyMDAyNiwgCisweDI0ODQwMDAxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgCisweDI0NDJmZmZmLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyODNiNCwgCisweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgMHg4MDkwMjEsIAorMHgyNDIxMDJiLCAweDEwNDAwMDBlLCAweDI0YjE3NzdjLCAweDI0YjA3Nzg0LCAKKzB4MmYwMjAyMSwgMHgyZjEyODIxLCAweGMwMDI0OTAsIDB4MjQwNjAwMDgsIAorMHgyNjMxMDAwOCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsIAorMHgyNjUyMDAwMSwgMHgyNDIxMDJiLCAweDE0NDBmZmY1LCAweDI2MTAwMDA4LCAKKzB4M2MwNDAwMDEsIDB4OTcyMDIxLCAweDhjODQ4M2I0LCAweDI0MDUwMDA4LCAKKzB4NDIwYzAsIDB4MjQ4NDc3N2MsIDB4YzAwMjQ4OCwgMHgyZTQyMDIxLCAKKzB4ODAwMWU4MywgMHgzYzAyMDgwMCwgMHgyYzgyMDA4MCwgMHgxNDQwZmZjZiwgCisweDQyOGMwLCAweDNjMDIwODAwLCAweDM0NDIyMDAwLCAweGFmYTIwMDE4LCAKKzB4OGVlMjA2MDgsIDB4OGY0MzAyMjgsIDB4MjQ0MjAwMDEsIDB4MzA0YTAwZmYsIAorMHg1MTQzMDBmZCwgMHhhZmEwMDAxMCwgMHg4ZWUyMDYwOCwgMHgyMTBjMCwgCisweDU3MTAyMSwgMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywgCisweGFjNDQwNjEwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NjkwMDMyLCAKKzB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxMDQwMDA2YSwgMHg1ODIxLCAKKzB4MjQxMDAwMDgsIDB4MjQwZjAwMGQsIDB4MjQwZDAwMDcsIDB4MjQwYzAwNDAsIAorMHgyNDBlMDAwMSwgMHg4Zjg3MDEyMCwgMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwgCisweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsIAorMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE1MDIwMDA3LCAKKzB4MTAyMSwgMHg4ZWUyMDFhNCwgMHgzODIxLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxYTQsIDB4ODAwMWVmYiwgMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwgCisweDQyMGMwLCAweDgwMTgyMSwgMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwgCisweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwgCisweGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTIwNjA4LCAweGE0ZjAwMDBlLCAKKzB4YWNlZjAwMTgsIDB4YWNlYTAwMWMsIDB4MjEwYzAsIDB4MjQ0MjA2MGMsIAorMHgyZTIxMDIxLCAweGFjZTIwMDA4LCAweDhlZTIwNGM0LCAweGFjZTIwMDEwLCAKKzB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsIDB4MjQwNzAwMDEsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MjAwMDAsIDB4MTQ0ZDAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgCisweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsIAorMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgCisweDI0NDIwMDAxLCAweDEwNGMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIAorMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDFlZTgsIAorMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgCisweDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLCAweDgwMDFlZmIsIAorMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNGMwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHhhYzhkMDAwMCwgMHhhYzhlMDAwNCwgMHg1NGUwMDAwNiwgMHgyNDBiMDAwMSwgCisweDhmODIwMDU0LCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTQ0MGZmOWQsIAorMHgwLCAweDMxNjMwMGZmLCAweDI0MDIwMDAxLCAweDU0NjIwMDc4LCAKKzB4YWZhMDAwMTAsIDB4YWVlYTA2MDgsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIAorMHgyNDY5MDAzMiwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDEwNDAwMDYxLCAKKzB4NTgyMSwgMHgyNDBlMDAwOCwgMHgyNDBkMDAxMSwgMHgyNDBhMDAxMiwgCisweDI0MDgwMDQwLCAweDI0MGMwMDAxLCAweDhmODMwMTIwLCAweDI3NjIzODAwLCAKKzB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYzMDAwLCAKKzB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgCisweDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsIDB4MzgyMSwgCisweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDFmNjcsIDB4OGVlMjAxYTQsIAorMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywgMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwgCisweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweGE0NmUwMDBlLCAweGFjNmQwMDE4LCAKKzB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIAorMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgMHgyNDA3MDAwMSwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHg4YzgyMDAwMCwgMHgxNDRhMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAKKzB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwgCisweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4MTA0ODAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgCisweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIDB4ODAwMWY1NCwgCisweDAsIDB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgCisweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAKKzB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIDB4ODAwMWY2NywgCisweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA0ODAwMDMsIAorMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAKKzB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgCisweGFjOGEwMDAwLCAweGFjOGMwMDA0LCAweDU0ZTAwMDA2LCAweDI0MGIwMDAxLCAKKzB4OGY4MjAwNTQsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxNDQwZmZhNiwgCisweDAsIDB4MzE2MzAwZmYsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMjIsIAorMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1MzkwLCAweGFmYTAwMDEwLCAKKzB4YWZhMDAwMTQsIDB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDksIAorMHhjMDAyNDAzLCAweDM0YTVmMDExLCAweDgwMDFmOTMsIDB4MCwgCisweDNjMDQwMDAxLCAweDI0ODQ1MzljLCAweGFmYTAwMDE0LCAweDhmODYwMTIwLCAKKzB4OGY4NzAxMjQsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAxMCwgCisweDgwMDFmOTMsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTNhOCwgCisweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAKKzB4YzAwMjQwMywgMHgzNGE1ZjAwZiwgMHg4ZWUyMDFhYywgMHgyNDQyMDAwMSwgCisweGFlZTIwMWFjLCAweDhlZTIwMWFjLCAweDhlZTIwMTI4LCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxMjgsIDB4OGVlMjAxMjgsIDB4OGVlMjAxNjQsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDE2NCwgMHg4MDAyMmU4LCAweDhlZTIwMTY0LCAweDhmYTIwMDIwLCAKKzB4MjEyMDAsIDB4MjFkMDIsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMDUsIAorMHgyNDAyMDAwMiwgMHgxMDYyMDAwZCwgMHgwLCAweDgwMDFmYjcsIAorMHhhZmEwMDAxMCwgMHg5MmUyMDRkOCwgMHgxNDQwMDAwNiwgMHgyNDAyMDAwMSwgCisweDhmODIwMjI4LCAweGFlZTIwNGRjLCAweDI0MDJmZmZmLCAweGFmODIwMjI4LCAKKzB4MjQwMjAwMDEsIDB4ODAwMWZiZSwgMHhhMmUyMDRkOCwgMHg5MmUyMDRkOCwgCisweDUwNDAwMDBjLCAweGEyZTAwNGQ4LCAweDhlZTIwNGRjLCAweGFmODIwMjI4LCAKKzB4ODAwMWZiZSwgMHhhMmUwMDRkOCwgMHgzYzA0MDAwMSwgMHgyNDg0NTNjOCwgCisweGFmYTAwMDE0LCAweDhmYTYwMDIwLCAweDNjMDUwMDAzLCAweGMwMDI0MDMsIAorMHgzNGE1ZjAwOSwgMHg4ZWUyMDEzYywgMHgyNDQyMDAwMSwgMHhhZWUyMDEzYywgCisweDgwMDIyZTgsIDB4OGVlMjAxM2MsIDB4OGZhMjAwMjAsIDB4MjEyMDAsIAorMHgyMjUwMiwgMHgyNDAyMDAwMSwgMHgxMDgyMDAwNSwgMHgyNDAyMDAwMiwgCisweDEwODIwMDBmLCAweDAsIDB4ODAwMWZlMywgMHhhZmEwMDAxMCwgCisweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgCisweDM0NDIwMDA4LCAweGFmODIwMjIwLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweGEwMjI4M2IyLCAweDgwMDFmZWEsIDB4YWVlNDAxMDgsIAorMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmNywgMHg0MzEwMjQsIAorMHhhZjgyMDIyMCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzYjIsIAorMHg4MDAxZmVhLCAweGFlZTQwMTA4LCAweDNjMDQwMDAxLCAweDI0ODQ1M2Q0LCAKKzB4YWZhMDAwMTQsIDB4OGZhNjAwMjAsIDB4M2MwNTAwMDMsIDB4YzAwMjQwMywgCisweDM0YTVmMDBhLCAweDhlZTIwMTJjLCAweDI0NDIwMDAxLCAweGFlZTIwMTJjLCAKKzB4ODAwMjJlOCwgMHg4ZWUyMDEyYywgMHg4ZmEyMDAyMCwgMHgyMTIwMCwgCisweDIxZDAyLCAweDI0MDIwMDAxLCAweDEwNjIwMDA1LCAweDI0MDIwMDAyLCAKKzB4MTA2MjAwMGUsIDB4MCwgMHg4MDAyMDExLCAweGFmYTAwMDEwLCAKKzB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4MzQ0MjAwMDgsIDB4YWY4MjAyMjAsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4ODAwMjAxOCwgMHhhMDIyODNiMywgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg5MDQyODNiMiwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHgxNDQwMDAwZSwgMHhhMDIwODNiMywgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgCisweDM0NjNmZmY3LCAweDQzMTAyNCwgMHg4MDAyMDE4LCAweGFmODIwMjIwLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDUzZTAsIDB4YWZhMDAwMTQsIDB4OGZhNjAwMjAsIAorMHgzYzA1MDAwMywgMHhjMDAyNDAzLCAweDM0YTVmMDBiLCAweDhlZTIwMTE0LCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxMTQsIDB4ODAwMjJlOCwgMHg4ZWUyMDExNCwgCisweDI3ODQwMjA4LCAweDI3NDUwMjAwLCAweGMwMDI0OWEsIDB4MjQwNjAwMDgsIAorMHgyNmU0MDA5NCwgMHgyNzQ1MDIwMCwgMHhjMDAyNDlhLCAweDI0MDYwMDA4LCAKKzB4OGVlMjAxMzQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxMzQsIDB4ODAwMjJlOCwgCisweDhlZTIwMTM0LCAweDhmNDYwMjQ4LCAweDIwMjEsIDB4YzAwNTEwOCwgCisweDI0MDUwMDA0LCAweDhlZTIwMTMwLCAweDI0NDIwMDAxLCAweGFlZTIwMTMwLCAKKzB4ODAwMjJlOCwgMHg4ZWUyMDEzMCwgMHg4ZWYzMDFjYywgMHg4ZWY0MDFkMCwgCisweDhlZjUwMWQ4LCAweDhlZTIwMTQwLCAweDI2ZTQwMDMwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxNDAsIDB4OGVmMDAxNDAsIDB4OGVmMTAwNzQsIDB4OGVmMjAwNzAsIAorMHhjMDAyNDg4LCAweDI0MDUwNDAwLCAweGFlZjMwMWNjLCAweGFlZjQwMWQwLCAKKzB4YWVmNTAxZDgsIDB4YWVmMDAxNDAsIDB4YWVmMTAwNzQsIDB4YWVmMjAwNzAsIAorMHg4ZjQyMDI1YywgMHgyNmU0MDA5NCwgMHhhZWUyMDA2MCwgMHg4ZjQyMDI2MCwgCisweDI3NDUwMjAwLCAweDI0MDYwMDA4LCAweGFlZTIwMDY4LCAweDI0MDIwMDA2LCAKKzB4YzAwMjQ5YSwgMHhhZWUyMDA2NCwgMHgzYzAyM2I5YSwgMHgzNDQyY2EwMCwgCisweGFlZTIwMDZjLCAweDI0MDIwM2U4LCAweDI0MDQwMDAyLCAweDI0MDMwMDAxLCAKKzB4YWVlMjAxMDQsIDB4YWVlNDAxMDAsIDB4YWVlMzAxMGMsIDB4OGY4MjAyMjAsIAorMHgzMDQyMDAwOCwgMHgxMDQwMDAwNCwgMHgwLCAweGFlZTMwMTA4LCAKKzB4ODAwMjA2MSwgMHgyMDIxLCAweGFlZTQwMTA4LCAweDIwMjEsIAorMHgzYzAzMDAwMSwgMHg2NDE4MjEsIDB4OTA2MzVjMzAsIDB4MmU0MTAyMSwgCisweDI0ODQwMDAxLCAweGEwNDMwMDljLCAweDJjODIwMDBmLCAweDE0NDBmZmY4LCAKKzB4MCwgMHg4ZjgyMDA0MCwgMHgyZTQxODIxLCAweDI0ODQwMDAxLCAKKzB4MjE3MDIsIDB4MjQ0MjAwMzAsIDB4YTA2MjAwOWMsIDB4MmU0MTAyMSwgCisweDgwMDIyZTgsIDB4YTA0MDAwOWMsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4YTAyMjgzZTAsIDB4MjQwYjA0MDAsIDB4MjQwODAwMTQsIAorMHgyNDBhMDA0MCwgMHgyNDA5MDAwMSwgMHg4ZjgzMDEwMCwgMHgyNzYyMzAwMCwgCisweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MjgwMCwgCisweDhmODIwMTA4LCAweDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMDQsIAorMHgxNGMyMDAwNywgMHgyNmUyMDAzMCwgMHg4ZWUyMDFhOCwgMHgzODIxLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIDB4ODAwMjBhOCwgMHg4ZWUyMDFhOCwgCisweDhlZTQwNGI4LCAweDhlZTUwNGJjLCAweGFjNjIwMDA4LCAweGE0NmIwMDBlLCAKKzB4YWM2ODAwMTgsIDB4YWM2MDAwMWMsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIAorMHg4ZWUyMDRjYywgMHhhYzYyMDAxMCwgMHhhZjg2MDEwMCwgMHg5MmUyMDRlYywgCisweDE0NDAwMDBlLCAweDI0MDcwMDAxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLCAKKzB4NTA0YTAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwgCisweGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAKKzB4MmUyMTAyMSwgMHhhYzQ4MDAwMCwgMHhhYzQ5MDAwNCwgMHgxMGUwZmZkMiwgCisweDAsIDB4ODAwMjJlOCwgMHgwLCAweDNjMDIwOTAwLCAKKzB4YWVlMDUyMzgsIDB4YWVlMDUyM2MsIDB4YWVlMDUyNDAsIDB4YWVlMDUyNDQsIAorMHhhZWUwMDFkMCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzYjEsIAorMHhhZmEyMDAxOCwgMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgMHgyNDQyMDAwMSwgCisweDMwNGEwMGZmLCAweDUxNDMwMGZkLCAweGFmYTAwMDEwLCAweDhlZTIwNjA4LCAKKzB4MjEwYzAsIDB4NTcxMDIxLCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLCAKKzB4YWM0MzA2MGMsIDB4YWM0NDA2MTAsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIAorMHgyNDY5MDAzMiwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDEwNDAwMDZhLCAKKzB4NTgyMSwgMHgyNDEwMDAwOCwgMHgyNDBmMDAwZCwgMHgyNDBkMDAwNywgCisweDI0MGMwMDQwLCAweDI0MGUwMDAxLCAweDhmODcwMTIwLCAweDI3NjIzODAwLCAKKzB4MjRlODAwMjAsIDB4MTAyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY4MzAwMCwgCisweDhmODIwMTI4LCAweDExMDIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIAorMHgxNTAyMDAwNywgMHgxMDIxLCAweDhlZTIwMWE0LCAweDM4MjEsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAyMTJjLCAweDhlZTIwMWE0LCAKKzB4OGVlNDA2MDgsIDB4NDIwYzAsIDB4ODAxODIxLCAweDhlZTQwNDMwLCAKKzB4OGVlNTA0MzQsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIAorMHg4NjIwMjEsIDB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsIDB4OGVlMjA2MDgsIAorMHhhNGYwMDAwZSwgMHhhY2VmMDAxOCwgMHhhY2VhMDAxYywgMHgyMTBjMCwgCisweDI0NDIwNjBjLCAweDJlMjEwMjEsIDB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsIAorMHhhY2UyMDAxMCwgMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgCisweDI0MDcwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDRkMDAxZiwgMHgwLCAKKzB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgCisweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAKKzB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0YzAwMDcsIDB4MCwgCisweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIAorMHg4MDAyMTE5LCAweDAsIDB4MTQ2MDAwMDUsIDB4MCwgCisweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAKKzB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIAorMHg4MDAyMTJjLCAweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIAorMHg1MDRjMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIAorMHgyZTIyMDIxLCAweGFjOGQwMDAwLCAweGFjOGUwMDA0LCAweDU0ZTAwMDA2LCAKKzB4MjQwYjAwMDEsIDB4OGY4MjAwNTQsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgCisweDE0NDBmZjlkLCAweDAsIDB4MzE2MzAwZmYsIDB4MjQwMjAwMDEsIAorMHg1NDYyMDA3OCwgMHhhZmEwMDAxMCwgMHhhZWVhMDYwOCwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIAorMHgxMDQwMDA2MSwgMHg1ODIxLCAweDI0MGUwMDA4LCAweDI0MGQwMDExLCAKKzB4MjQwYTAwMTIsIDB4MjQwODAwNDAsIDB4MjQwYzAwMDEsIDB4OGY4MzAxMjAsIAorMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIAorMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAKKzB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwgCisweDM4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMjE5OCwgCisweDhlZTIwMWE0LCAweDhlZTIwNjA4LCAweGFjNjIwMDFjLCAweDhlZTQwNGEwLCAKKzB4OGVlNTA0YTQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4YTQ2ZTAwMGUsIAorMHhhYzZkMDAxOCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgCisweGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAKKzB4MjQwNzAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIAorMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NGEwMDFmLCAweDAsIAorMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAKKzB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIAorMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDQ4MDAwNywgMHgwLCAKKzB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgCisweDgwMDIxODUsIDB4MCwgMHgxNDYwMDAwNSwgMHgwLCAKKzB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIAorMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgCisweDgwMDIxOTgsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgCisweDUwNDgwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgCisweDJlMjIwMjEsIDB4YWM4YTAwMDAsIDB4YWM4YzAwMDQsIDB4NTRlMDAwMDYsIAorMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAKKzB4MTQ0MGZmYTYsIDB4MCwgMHgzMTYzMDBmZiwgMHgyNDAyMDAwMSwgCisweDEwNjIwMDIyLCAweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzOTAsIAorMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgCisweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMTEsIDB4ODAwMjFjNCwgCisweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzOWMsIDB4YWZhMDAwMTQsIAorMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAKKzB4MzRhNWYwMTAsIDB4ODAwMjFjNCwgMHgwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDUzYTgsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIAorMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDBmLCAweDhlZTIwMWFjLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYWMsIDB4OGVlMjAxYWMsIDB4OGVlMjAxMjAsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDEyMCwgMHg4ZWUyMDEyMCwgMHg4ZWUyMDE2OCwgCisweDI0NDIwMDAxLCAweGFlZTIwMTY4LCAweDgwMDIyZTgsIDB4OGVlMjAxNjgsIAorMHg4ZjQyMDI1YywgMHgyNmU0MDA5NCwgMHhhZWUyMDA2MCwgMHg4ZjQyMDI2MCwgCisweDI3NDUwMjAwLCAweDI0MDYwMDA4LCAweGMwMDI0OWEsIDB4YWVlMjAwNjgsIAorMHg4ZjgyMDIyMCwgMHgzMDQyMDAwOCwgMHgxNDQwMDAwMiwgMHgyNDAyMDAwMSwgCisweDI0MDIwMDAyLCAweGFlZTIwMTA4LCAweDhlZTIwMTFjLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxMWMsIDB4ODAwMjJlOCwgMHg4ZWUyMDExYywgMHgzYzA0MDAwMSwgCisweDI0ODQ1M2VjLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmYTYwMDIwLCAKKzB4M2MwNTAwMDMsIDB4YzAwMjQwMywgMHgzNGE1ZjAwZiwgMHg5M2EyMDAyMCwgCisweDNjMDMwNzAwLCAweDM0NjMxMDAwLCAweDQzMTAyNSwgMHhhZmEyMDAxOCwgCisweDhlZTIwNjA4LCAweDhmNDMwMjI4LCAweDI0NDIwMDAxLCAweDMwNDkwMGZmLCAKKzB4NTEyMzAwZTIsIDB4YWZhMDAwMTAsIDB4OGVlMjA2MDgsIDB4MjEwYzAsIAorMHg1NzEwMjEsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsIDB4YWM0MzA2MGMsIAorMHhhYzQ0MDYxMCwgMHg4Zjg3MDEyMCwgMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwgCisweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsIAorMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE1MDIwMDA3LCAKKzB4MTAyMSwgMHg4ZWUyMDFhNCwgMHgzODIxLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxYTQsIDB4ODAwMjI1ZCwgMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwgCisweDQyMGMwLCAweDgwMTgyMSwgMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwgCisweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwgCisweGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTMwNjA4LCAweDI0MDIwMDA4LCAKKzB4YTRlMjAwMGUsIDB4MjQwMjAwMGQsIDB4YWNlMjAwMTgsIDB4YWNlOTAwMWMsIAorMHgzMThjMCwgMHgyNDYzMDYwYywgMHgyZTMxMDIxLCAweGFjZTIwMDA4LCAKKzB4OGVlMjA0YzQsIDB4YWNlMjAwMTAsIDB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsIAorMHgxNDQwMDAzNywgMHgyNDA3MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDcsIAorMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAKKzB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIAorMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwgCisweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIAorMHgxMGEyMDAwNSwgMHgwLCAweDgwMDIyNDcsIDB4MCwgCisweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIAorMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgCisweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDIyNWQsIDB4MCwgCisweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgCisweDU0ZTAwMDBjLCAweGFlZTkwNjA4LCAweDNjMDQwMDAxLCAweDI0ODQ1M2Y0LCAKKzB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIAorMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDAwLCAweDgwMDIyZTAsIAorMHgwLCAweDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAKKzB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAKKzB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgCisweDAsIDB4OGVlMjAxYTQsIDB4MzgyMSwgMHgyNDQyMDAwMSwgCisweGFlZTIwMWE0LCAweDgwMDIyYzQsIDB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIAorMHhhYzYyMDAxYywgMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgCisweGFjNjIwMDA4LCAweDI0MDIwMDA4LCAweGE0NjIwMDBlLCAweDI0MDIwMDExLCAKKzB4YWM2MjAwMTgsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIAorMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgCisweDI0MDcwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwgCisweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIAorMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgCisweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAKKzB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgCisweDAsIDB4ODAwMjJhZSwgMHgwLCAweDE0YTAwMDA1LCAKKzB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgCisweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAKKzB4YWM4MDAwMDAsIDB4ODAwMjJjNCwgMHgwLCAweDhlZTI0ZTMwLCAKKzB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgCisweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAKKzB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAxMiwgCisweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE0ZTAwMDFiLCAKKzB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTNmYywgMHhhZmEwMDAxMCwgCisweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAKKzB4YzAwMjQwMywgMHgzNGE1ZjAwMSwgMHg4ZWUyMDFiMCwgMHgyNDQyMDAwMSwgCisweGFlZTIwMWIwLCAweDgwMDIyZTAsIDB4OGVlMjAxYjAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTQwOCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgCisweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDUsIDB4OGVlMjAxYWMsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywgMHg4ZWUyMDE1MCwgCisweDI0NDIwMDAxLCAweGFlZTIwMTUwLCAweDhlZTIwMTUwLCAweDhlZTIwMTYwLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxNjAsIDB4OGVlMjAxNjAsIDB4OGY0MzAyMmMsIAorMHg4ZjQyMDEwYywgMHgxNDYyMDAwOSwgMHgyNDAyMDAwMiwgMHhhZjgyMDA2NCwgCisweDhmODIwMDY0LCAweDE0NDAwMDA1LCAweDAsIDB4OGY0MzAyMmMsIAorMHg4ZjQyMDEwYywgMHgxNDYyZjg3NSwgMHgwLCAweDhmYmYwMDQ0LCAKKzB4OGZiNjAwNDAsIDB4OGZiNTAwM2MsIDB4OGZiNDAwMzgsIDB4OGZiMzAwMzQsIAorMHg4ZmIyMDAzMCwgMHg4ZmIxMDAyYywgMHg4ZmIwMDAyOCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwNDgsIDB4MjdiZGZmZjgsIDB4MjQwOGZmZmYsIDB4MTBhMDAwMTQsIAorMHg0ODIxLCAweDNjMGFlZGI4LCAweDM1NGE4MzIwLCAweDkwODcwMDAwLCAKKzB4MjQ4NDAwMDEsIDB4MzAyMSwgMHgxMDcxMDI2LCAweDMwNDIwMDAxLCAKKzB4MTA0MDAwMDIsIDB4ODE4NDIsIDB4NmExODI2LCAweDYwNDAyMSwgCisweDI0YzYwMDAxLCAweDJjYzIwMDA4LCAweDE0NDBmZmY3LCAweDczODQyLCAKKzB4MjUyOTAwMDEsIDB4MTI1MTAyYiwgMHgxNDQwZmZmMCwgMHgwLCAKKzB4MTAwMTAyMSwgMHgzZTAwMDA4LCAweDI3YmQwMDA4LCAweDI3YmRmZmU4LCAKKzB4Mjc2NDI4MDAsIDB4YWZiZjAwMTAsIDB4YzAwMjQ4OCwgMHgyNDA1MTAwMCwgCisweDI0MDIwMDIxLCAweGFmODAwMTAwLCAweGFmODAwMTA0LCAweGFmODAwMTA4LCAKKzB4YWY4MDAxMTAsIDB4YWY4MDAxMTQsIDB4YWY4MDAxMTgsIDB4YWY4MDAxMjAsIAorMHhhZjgwMDEyNCwgMHhhZjgwMDEyOCwgMHhhZjgwMDEzMCwgMHhhZjgwMDEzNCwgCisweGFmODAwMTM4LCAweGFlZTA0ZTI4LCAweGFlZTA0ZTJjLCAweGFlZTA0ZTMwLCAKKzB4YWVlMDRlMzQsIDB4YWY4MjAxMWMsIDB4OGY0MjAyMTgsIDB4MzA0MjAwNDAsIAorMHgxMDQwMDAwNCwgMHgwLCAweDhmODIwMTFjLCAweDM0NDIwMDA0LCAKKzB4YWY4MjAxMWMsIDB4OGZiZjAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAxOCwgCisweDI3YmRmZmUwLCAweGFmYmYwMDE4LCAweDhmODIwMTA0LCAweGFmYTIwMDEwLCAKKzB4OGY4MjAxMDAsIDB4M2MwNTAwMDIsIDB4YWZhMjAwMTQsIDB4OGY4NjAwYjAsIAorMHg4Zjg3MDExYywgMHgzYzA0MDAwMSwgMHgyNDg0NTRjMCwgMHhjMDAyNDAzLCAKKzB4MzRhNWYwMDAsIDB4OGY4MzAwYjAsIDB4M2MwMjdmMDAsIDB4NjIxODI0LCAKKzB4M2MwMjA0MDAsIDB4MTA2MjAwMjksIDB4NDMxMDJiLCAweDE0NDAwMDA4LCAKKzB4M2MwMjIwMDAsIDB4M2MwMjAxMDAsIDB4MTA2MjAwMjQsIDB4M2MwMjAyMDAsIAorMHgxMDYyMDAxMSwgMHgwLCAweDgwMDIzNzQsIDB4MCwgCisweDEwNjIwMDA4LCAweDNjMDI0MDAwLCAweDE0NjIwMDFjLCAweDAsIAorMHg4ZWUyMDE5MCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE5MCwgMHg4MDAyMzc0LCAKKzB4OGVlMjAxOTAsIDB4OGVlMjAxOGMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxOGMsIAorMHg4MDAyMzc0LCAweDhlZTIwMThjLCAweDhmODIwMTFjLCAweDM0NDIwMDAyLCAKKzB4YWY4MjAxMWMsIDB4OGY4MzAxMDQsIDB4OGY4MjAwYjAsIDB4MzQ0MjAwMDEsIAorMHhhZjgyMDBiMCwgMHhhZjgzMDEwNCwgMHg4ZjgyMDExYywgMHgyNDAzZmZmZCwgCisweDQzMTAyNCwgMHhhZjgyMDExYywgMHg4ZWUyMDFhMCwgMHgyNDQyMDAwMSwgCisweGFlZTIwMWEwLCAweDgwMDIzNzcsIDB4OGVlMjAxYTAsIDB4OGY4MjAwYjAsIAorMHgzNDQyMDAwMSwgMHhhZjgyMDBiMCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwMjAsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMWMsIDB4YWZiMDAwMTgsIAorMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA1MDAwMSwgCisweGFmYTIwMDE0LCAweDhmODYwMGEwLCAweDhmODcwMTFjLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDU0Y2MsIDB4YzAwMjQwMywgMHgzNGE1ZjAwMCwgMHg4ZjgzMDBhMCwgCisweDNjMDI3ZjAwLCAweDYyMTgyNCwgMHgzYzAyMDQwMCwgMHgxMDYyMDA1MywgCisweDgwMjEsIDB4NDMxMDJiLCAweDE0NDAwMDA4LCAweDNjMDQyMDAwLCAKKzB4M2MwMjAxMDAsIDB4MTA2MjAwNGQsIDB4M2MwMjAyMDAsIDB4MTA2MjAwM2EsIAorMHgwLCAweDgwMDIzZTAsIDB4MCwgMHgxMDY0MDAwMywgCisweDNjMDI0MDAwLCAweDE0NjIwMDQ1LCAweDAsIDB4OGY4MjAwYTAsIAorMHg0NDEwMjQsIDB4MTA0MDAwMDYsIDB4MCwgMHg4ZWUyMDE5NCwgCisweDI0NDIwMDAxLCAweGFlZTIwMTk0LCAweDgwMDIzYTksIDB4OGVlMjAxOTQsIAorMHg4ZWUyMDE5OCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE5OCwgMHg4ZWUyMDE5OCwgCisweDhmODIwMTFjLCAweDM0NDIwMDAyLCAweGFmODIwMTFjLCAweDhmODIwMTFjLCAKKzB4MzA0MjAyMDAsIDB4MTA0MDAwMWIsIDB4MCwgMHg4ZjgzMDBhMCwgCisweDhmODQwMTI0LCAweDhmODIwMGFjLCAweDE0NDAwMDA3LCAweDI0MDIwMDAxLCAKKzB4M2MwMjAwMDEsIDB4MzQ0MmYwMDAsIDB4NjIxMDI0LCAweDUwNDAwMDAxLCAKKzB4MjQxMDAwMDEsIDB4MjQwMjAwMDEsIDB4MTIwMDAwMGQsIDB4YWY4MjAwYTAsIAorMHg4ZjgyMDEyNCwgMHgyNDQyZmZlMCwgMHhhZjgyMDEyNCwgMHg4ZjgyMDEyNCwgCisweDhmODIwMTI0LCAweDI3NjMzMDAwLCAweDQzMTAyYiwgMHgxMDQwMDAwNSwgCisweDI3NjIzN2UwLCAweGFmODIwMTI0LCAweDgwMDIzY2EsIDB4MCwgCisweGFmODQwMTI0LCAweDhmODIwMTFjLCAweDI0MDNmZmZkLCAweDQzMTAyNCwgCisweDgwMDIzZTMsIDB4YWY4MjAxMWMsIDB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsIAorMHhhZjgyMDExYywgMHg4ZjgzMDEyNCwgMHg4ZjgyMDBhMCwgMHgzNDQyMDAwMSwgCisweGFmODIwMGEwLCAweGFmODMwMTI0LCAweDhmODIwMTFjLCAweDI0MDNmZmZkLCAKKzB4NDMxMDI0LCAweGFmODIwMTFjLCAweDhlZTIwMTljLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxOWMsIDB4ODAwMjNlMywgMHg4ZWUyMDE5YywgMHg4ZjgyMDBhMCwgCisweDM0NDIwMDAxLCAweGFmODIwMGEwLCAweDhmYmYwMDFjLCAweDhmYjAwMDE4LCAKKzB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjVjNTgsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTQsIDB4MTQ0MDAwMTIsIAorMHhhZmIwMDAxMCwgMHgzYzEwMDAwMSwgMHgyNjEwNWRkMCwgMHgyMDAyMDIxLCAKKzB4YzAwMjQ4OCwgMHgyNDA1MjAwMCwgMHgyNjAyMWZlMCwgMHgzYzAxMDAwMSwgCisweGFjMjI1ZDk0LCAweDNjMDEwMDAxLCAweGFjMjI1ZDkwLCAweGFmNDIwMjUwLCAKKzB4MjQwMjIwMDAsIDB4YWY1MDAyNTQsIDB4YWY0MjAyNTgsIDB4MjQwMjAwMDEsIAorMHgzYzAxMDAwMSwgMHhhYzIyNWM1OCwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgCisweDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4M2MwMzAwMDEsIDB4OGM2MzVkOTQsIAorMHg4YzgyMDAwMCwgMHg4ZmE4MDAxMCwgMHg4ZmE5MDAxNCwgMHhhYzYyMDAwMCwgCisweDNjMDIwMDAxLCAweDhjNDI1ZDk0LCAweDhjODMwMDA0LCAweGFjNDMwMDA0LCAKKzB4YWM0NTAwMDgsIDB4OGY4NDAwNTQsIDB4MjQ0M2ZmZTAsIDB4YWM0NjAwMTAsIAorMHhhYzQ3MDAxNCwgMHhhYzQ4MDAxOCwgMHhhYzQ5MDAxYywgMHgzYzAxMDAwMSwgCisweGFjMjM1ZDk0LCAweGFjNDQwMDBjLCAweDNjMDIwMDAxLCAweDI0NDI1ZGQwLCAKKzB4NjIxODJiLCAweDEwNjAwMDA1LCAweDAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWQ5MCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ5NCwgMHgzYzAzMDAwMSwgCisweDhjNjM1ZDk0LCAweDNjMDIwMDAxLCAweDhjNDI1YzQwLCAweGFjNjIwMDAwLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzVkOTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVjNDAsIAorMHhhYzYyMDAwNCwgMHgzZTAwMDA4LCAweGFmNDMwMjUwLCAweDNjMDMwMDAxLCAKKzB4OGM2MzVkOTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVjNDAsIDB4MjdiZGZmZDAsIAorMHhhZmI0MDAyMCwgMHg4ZmI0MDA0MCwgMHhhZmIwMDAxMCwgMHg4MDgwMjEsIAorMHhhZmI1MDAyNCwgMHg4ZmI1MDA0NCwgMHg4ZmE0MDA0OCwgMHhhZmIxMDAxNCwgCisweGEwODgyMSwgMHhhZmJmMDAyOCwgMHhhZmIzMDAxYywgMHhhZmIyMDAxOCwgCisweGFjNjIwMDAwLCAweDNjMDUwMDAxLCAweDhjYTU1ZDk0LCAweDNjMDIwMDAxLCAKKzB4OGM0MjVjNDAsIDB4YzA5MDIxLCAweGUwOTgyMSwgMHgxMDgwMDAwNiwgCisweGFjYTIwMDA0LCAweDI0YTUwMDA4LCAweGMwMDI0OTAsIDB4MjQwNjAwMTgsIAorMHg4MDAyNDRlLCAweDAsIDB4MjRhNDAwMDgsIDB4YzAwMjQ4OCwgCisweDI0MDUwMDE4LCAweDNjMDIwMDAxLCAweDhjNDI1ZDk0LCAweDNjMDUwMDAxLCAKKzB4MjRhNTVkZDAsIDB4MjQ0MmZmZTAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOTQsIAorMHg0NTEwMmIsIDB4MTA0MDAwMDUsIDB4MCwgMHgzYzAyMDAwMSwgCisweDhjNDI1ZDkwLCAweDNjMDEwMDAxLCAweGFjMjI1ZDk0LCAweDNjMDMwMDAxLCAKKzB4OGM2MzVkOTQsIDB4OGUwMjAwMDAsIDB4YWM2MjAwMDAsIDB4M2MwMzAwMDEsIAorMHg4YzYzNWQ5NCwgMHg4ZTAyMDAwNCwgMHhhYzYyMDAwNCwgMHhhYzcxMDAwOCwgCisweDhmODQwMDU0LCAweDI0NjJmZmUwLCAweDNjMDEwMDAxLCAweGFjMjI1ZDk0LCAKKzB4NDUxMDJiLCAweGFjNzIwMDEwLCAweGFjNzMwMDE0LCAweGFjNzQwMDE4LCAKKzB4YWM3NTAwMWMsIDB4MTA0MDAwMDUsIDB4YWM2NDAwMGMsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWQ5MCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ5NCwgMHgzYzAzMDAwMSwgCisweDhjNjM1ZDk0LCAweDNjMDIwMDAxLCAweDhjNDI1YzQwLCAweGFjNjIwMDAwLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzVkOTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVjNDAsIAorMHhhYzYyMDAwNCwgMHhhZjQzMDI1MCwgMHg4ZmJmMDAyOCwgMHg4ZmI1MDAyNCwgCisweDhmYjQwMDIwLCAweDhmYjMwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAKKzB4OGZiMDAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAzMCwgMHgxMGEwMDAwNSwgCisweDAsIDB4YWM4MDAwMDAsIDB4MjRhNWZmZmMsIDB4MTRhMGZmZmQsIAorMHgyNDg0MDAwNCwgMHgzZTAwMDA4LCAweDAsIDB4MTBjMDAwMDcsIAorMHgwLCAweDhjODIwMDAwLCAweDI0ODQwMDA0LCAweDI0YzZmZmZjLCAKKzB4YWNhMjAwMDAsIDB4MTRjMGZmZmIsIDB4MjRhNTAwMDQsIDB4M2UwMDAwOCwgCisweDAsIDB4MTBjMDAwMDcsIDB4MCwgMHg4Y2EyMDAwMCwgCisweDI0YTUwMDA0LCAweDI0YzZmZmZjLCAweGFjODIwMDAwLCAweDE0YzBmZmZiLCAKKzB4MjQ4NDAwMDQsIDB4M2UwMDAwOCwgMHgwLCAweDNlMDAwMDgsIAorMHgwLCAweDI3YmRmZmQ4LCAweGFmYmYwMDIwLCAweDhlZTMwNGU0LCAKKzB4OGVlMjA0ZTAsIDB4MTA2MjA0MzYsIDB4MCwgMHg4ZWUyMDRlNCwgCisweDhlZTMwNGZjLCAweDIxMTAwLCAweDYyNjAyMSwgMHg5NTg3MDAwOCwgCisweDhkOGEwMDAwLCAweDhkOGIwMDA0LCAweDk1OGQwMDBhLCAweDhlZTI3MjVjLCAKKzB4OGVlMzcyNmMsIDB4MzBlNGZmZmYsIDB4NDQxMDIxLCAweDYyMTgyYiwgCisweDEwNjAwMDE1LCAweDMxYTIwMDA0LCAweDhmODIwMGQ4LCAweDhlZTM3MjU4LCAKKzB4NDMxMDIzLCAweGFlZTI3MjZjLCAweDhlZTI3MjZjLCAweDFjNDAwMDAzLCAKKzB4M2MwMzAwMDEsIDB4NDMxMDIxLCAweGFlZTI3MjZjLCAweDhlZTI3MjVjLCAKKzB4OGVlMzcyNmMsIDB4NDQxMDIxLCAweDYyMTgyYiwgMHgxMDYwMDAwNiwgCisweDMxYTIwMDA0LCAweDhlZTIwMWI4LCAweDI0NDIwMDAxLCAweGFlZTIwMWI4LCAKKzB4ODAwMjhlMSwgMHg4ZWUyMDFiOCwgMHgxMDQwMDI0MCwgMHgzMWEyMDIwMCwgCisweDEwNDAwMTRkLCAweDQ4MjEsIDB4OTZlMjA0NWEsIDB4MzA0MjAwMTAsIAorMHgxMDQwMDE0OSwgMHgwLCAweDhmODQwMTAwLCAweDI3NjIzMDAwLCAKKzB4MjQ4NTAwMjAsIDB4YTIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjUyODAwLCAKKzB4OGY4MjAxMDgsIDB4MTBhMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwgCisweDE0YTIwMDA2LCAweDI0MDIwMDBjLCAweDhlZTIwMWE4LCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxYTgsIDB4ODAwMjUyYywgMHg4ZWUyMDFhOCwgMHhhYzhhMDAwMCwgCisweGFjOGIwMDA0LCAweDhlZTM3MjY0LCAweDI0MDYwMDA1LCAweGE0ODIwMDBlLCAKKzB4YWM4NjAwMTgsIDB4YWM4MzAwMDgsIDB4OGVlMjA0ZTQsIDB4YWM4MjAwMWMsIAorMHg4ZWUyMDRjOCwgMHhhYzgyMDAxMCwgMHhhZjg1MDEwMCwgMHg5MmUyMDRlYywgCisweDE0NDAwMDM2LCAweDI0MDkwMDAxLCAweDhlZTI0ZTI4LCAweDIxMGMwLCAKKzB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDQ2MDAxZiwgCisweDAsIDB4OGVlMzRlMjgsIDB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsIAorMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgCisweDhlZTI0ZTJjLCAweDhlZTU0ZTI4LCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAKKzB4MCwgMHg4ZWUyNGUyYywgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgCisweDAsIDB4ODAwMjUxNiwgMHgwLCAweDE0YTAwMDA1LCAKKzB4MCwgMHg4ZjgyMDEwOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgCisweDhmODIwMTA4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAKKzB4YWM4MDAwMDAsIDB4ODAwMjUyYywgMHgwLCAweDhlZTI0ZTI4LCAKKzB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgCisweDhlZTI0ZTI4LCAweDI0NDIwMDAxLCAweGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAKKzB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNSwgCisweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE1MjAwMDBhLCAKKzB4M2MwNDAwMDEsIDB4YWZhYjAwMTAsIDB4OGVlMjcyNjQsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTczMCwgMHgzYzA1MDAwNCwgMHhhZmEyMDAxNCwgMHg4ZWU2MDRlNCwgCisweDgwMDI4YmUsIDB4MzRhNWYxMTQsIDB4OGVlMjcyNjQsIDB4MzQ4NDM4MDAsIAorMHgzNjQxODIxLCAweDI0NDIwMDEwLCAweDQzMTAyYiwgMHgxNDQwMDA3MywgCisweDAsIDB4OGVlMjcyNjQsIDB4MjQ0ODAwMTAsIDB4MzY0MTAyMSwgCisweDEwMjEwMmIsIDB4MTQ0MDAwMDIsIDB4M2MwMmZmZmYsIDB4MTAyNDAyMSwgCisweDhmODUwMTAwLCAweDI3NjIzMDAwLCAweDI0YTYwMDIwLCAweGMyMTAyYiwgCisweDUwNDAwMDAxLCAweDI3NjYyODAwLCAweDhmODIwMTA4LCAweDEwYzIwMDA0LCAKKzB4MCwgMHg4ZjgyMDEwNCwgMHgxNGMyMDAwNywgMHgyNTYzMDAwYywgCisweDhlZTIwMWE4LCAweDQ4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIAorMHg4MDAyNWEwLCAweDhlZTIwMWE4LCAweDJjNjQwMDBjLCAweDE0NDEwMjEsIAorMHhhY2EyMDAwMCwgMHhhY2EzMDAwNCwgMHgyNGUyZmZmNCwgMHhhNGEyMDAwZSwgCisweDI0MDIwMDA2LCAweGFjYTgwMDA4LCAweGFjYTIwMDE4LCAweDhlZTIwNGU0LCAKKzB4YWNhMjAwMWMsIDB4OGVlMjA0YzgsIDB4M2MwMzAwMDIsIDB4NDMxMDI1LCAKKzB4YWNhMjAwMTAsIDB4YWY4NjAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzcsIAorMHgyNDA5MDAwMSwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgCisweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMWYsIAorMHgwLCAweDhlZTM0ZTI4LCAweDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAKKzB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIAorMHg4ZWUyNGUyYywgMHg4ZWU1NGUyOCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgCisweDAsIDB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIAorMHgwLCAweDgwMDI1OGEsIDB4MCwgMHgxNGEwMDAwNSwgCisweDAsIDB4OGY4MjAxMDgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIAorMHg4ZjgyMDEwOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgCisweGFjODAwMDAwLCAweDgwMDI1YTAsIDB4MCwgMHg4ZWUyNGUyOCwgCisweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIAorMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgCisweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDUsIAorMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHgxNTIwMDAwYSwgCisweDI1MDhmZmZjLCAweGFmYWIwMDEwLCAweDhlZTI3MjY0LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDU3MzAsIDB4M2MwNTAwMDQsIDB4YWZhMjAwMTQsIDB4OGVlNjA0ZTQsIAorMHg4MDAyOGJlLCAweDM0YTVmMTI1LCAweDM0MDI4MTAwLCAweGE1MDIwMDAwLCAKKzB4OTU4MjAwMGUsIDB4ODAwMjYxZCwgMHhhNTAyMDAwMiwgMHg4Zjg1MDEwMCwgCisweDI3NjIzMDAwLCAweDI0YTYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgCisweDI3NjYyODAwLCAweDhmODIwMTA4LCAweDEwYzIwMDA0LCAweDAsIAorMHg4ZjgyMDEwNCwgMHgxNGMyMDAwNywgMHgyNTYzMDAwYywgMHg4ZWUyMDFhOCwgCisweDQ4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIDB4ODAwMjYwZCwgCisweDhlZTIwMWE4LCAweDJjNjQwMDBjLCAweDE0NDEwMjEsIDB4YWNhMjAwMDAsIAorMHhhY2EzMDAwNCwgMHg4ZWUzNzI2NCwgMHgyNGUyZmZmNCwgMHhhNGEyMDAwZSwgCisweDI0MDIwMDA2LCAweGFjYTIwMDE4LCAweDI0NjMwMDEwLCAweGFjYTMwMDA4LCAKKzB4OGVlMjA0ZTQsIDB4YWNhMjAwMWMsIDB4OGVlMjA0YzgsIDB4M2MwMzAwMDIsIAorMHg0MzEwMjUsIDB4YWNhMjAwMTAsIDB4YWY4NjAxMDAsIDB4OTJlMjA0ZWMsIAorMHgxNDQwMDAzNywgMHgyNDA5MDAwMSwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgCisweDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDUsIAorMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTI4LCAweDhlZTI0ZTJjLCAKKzB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIAorMHhhYzgyMDAwNCwgMHg4ZWUyNGUyYywgMHg4ZWU1NGUyOCwgMHgyNDQyMDAwMSwgCisweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsIAorMHgxMGEyMDAwNSwgMHgwLCAweDgwMDI1ZjcsIDB4MCwgCisweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMDgsIDB4MjQ0MjAwMjAsIAorMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgCisweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDI2MGQsIDB4MCwgCisweDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwgCisweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsIAorMHgyNDAyMDAwNSwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgCisweDE1MjAwMDBhLCAweDM0MDI4MTAwLCAweGFmYWIwMDEwLCAweDhlZTI3MjY0LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDU3MzAsIDB4M2MwNTAwMDQsIDB4YWZhMjAwMTQsIAorMHg4ZWU2MDRlNCwgMHg4MDAyOGJlLCAweDM0YTVmMDE1LCAweDhlZTM3MjY0LCAKKzB4YTQ2MjAwMGMsIDB4OGVlMzcyNjQsIDB4OTU4MjAwMGUsIDB4YTQ2MjAwMGUsIAorMHg4MDAyNjgxLCAweDI0ZTcwMDA0LCAweDhmODQwMTAwLCAweDI3NjIzMDAwLCAKKzB4MjQ4NTAwMjAsIDB4YTIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjUyODAwLCAKKzB4OGY4MjAxMDgsIDB4MTBhMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwgCisweDE0YTIwMDA3LCAweDI0MDIwMDA2LCAweDhlZTIwMWE4LCAweDQ4MjEsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwgMHg4MDAyNjc3LCAweDhlZTIwMWE4LCAKKzB4YWM4YTAwMDAsIDB4YWM4YjAwMDQsIDB4OGVlMzcyNjQsIDB4YTQ4NzAwMGUsIAorMHhhYzgyMDAxOCwgMHhhYzgzMDAwOCwgMHg4ZWUyMDRlNCwgMHhhYzgyMDAxYywgCisweDhlZTIwNGM4LCAweDNjMDMwMDAyLCAweDQzMTAyNSwgMHhhYzgyMDAxMCwgCisweGFmODUwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDM3LCAweDI0MDkwMDAxLCAKKzB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgCisweDhjODMwMDAwLCAweDI0MDIwMDA1LCAweDE0NjIwMDFmLCAweDAsIAorMHg4ZWUzNGUyOCwgMHg4ZWUyNGUyYywgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgCisweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTJjLCAKKzB4OGVlNTRlMjgsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwgCisweDhlZTI0ZTJjLCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIAorMHg4MDAyNjYxLCAweDAsIDB4MTRhMDAwMDUsIDB4MCwgCisweDhmODIwMTA4LCAweDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAKKzB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIAorMHg4MDAyNjc3LCAweDAsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIAorMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIAorMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA1LCAweGFjODIwMDAwLCAKKzB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTUyMDAwMDksIDB4M2MwNTAwMDQsIAorMHhhZmFiMDAxMCwgMHg4ZWUyNzI2NCwgMHgzYzA0MDAwMSwgMHgyNDg0NTczMCwgCisweGFmYTIwMDE0LCAweDhlZTYwNGU0LCAweDgwMDI4YmUsIDB4MzRhNWYwMDQsIAorMHg4ZWUyNzI1YywgMHgzMGU3ZmZmZiwgMHg0NzEwMjEsIDB4YWVlMjcyNWMsIAorMHg4ZWUyMDRlNCwgMHg4ZWUzMDRmYywgMHg4ZWU0NzI1OCwgMHgyMTEwMCwgCisweDQzMTAyMSwgMHhhYzQ0MDAwYywgMHg4ZWUyNzI1OCwgMHhhZmEyMDAxOCwgCisweDhlZTM3MjVjLCAweGFmYTMwMDFjLCAweDhlZTI3MjVjLCAweDJjNDIwMDNjLCAKKzB4MTA0MDAwMDQsIDB4MjQ2MjAwMDEsIDB4MjQwM2ZmZmUsIDB4NDMxMDI0LCAKKzB4YWZhMjAwMWMsIDB4OGVlMjcyNjQsIDB4M2MwNjAwMDEsIDB4MzRjNjM4MDAsIAorMHg4ZWUzNzI1YywgMHgyNDA1ZmZmOCwgMHg0NzEwMjEsIDB4MjQ0MjAwMDcsIAorMHg0NTEwMjQsIDB4MjQ2MzAwMDcsIDB4YWVlMjcyNTgsIDB4OGVlMjcyNmMsIAorMHg4ZWU0NzI1OCwgMHg2NTE4MjQsIDB4NDMxMDIzLCAweGFlZTI3MjZjLCAKKzB4MzY2MTAyMSwgMHg4MjIwMmIsIDB4MTQ4MDAwMDQsIDB4M2MwM2ZmZmYsIAorMHg4ZWUyNzI1OCwgMHg0MzEwMjEsIDB4YWVlMjcyNTgsIDB4OGVlMjcyNTgsIAorMHhhZWUyNzI2NCwgMHg4ZjgyMDBmMCwgMHgyNDQ3MDAwOCwgMHgyNzYyMTgwMCwgCisweGUyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY3MTAwMCwgMHg4ZjgyMDBmNCwgCisweDE0ZTIwMDA3LCAweDAsIDB4OGVlMjAxYjQsIDB4NDgyMSwgCisweDI0NDIwMDAxLCAweGFlZTIwMWI0LCAweDgwMDI2YzQsIDB4OGVlMjAxYjQsIAorMHg4ZjgyMDBmMCwgMHgyNDA5MDAwMSwgMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywgCisweGFjNDMwMDAwLCAweGFjNDQwMDA0LCAweGFmODcwMGYwLCAweDE1MjAwMDEyLCAKKzB4ZDExNDIsIDB4OGY4MjAwZjAsIDB4YWZhMjAwMTAsIDB4OGY4MjAwZjQsIAorMHgzYzA0MDAwMSwgMHgyNDg0NTczYywgMHhhZmEyMDAxNCwgMHg4ZmE2MDAxOCwgCisweDhmYTcwMDFjLCAweDNjMDUwMDA0LCAweGMwMDI0MDMsIDB4MzRhNWYwMDUsIAorMHg4ZWUyMDA4OCwgMHgyNDQyMDAwMSwgMHhhZWUyMDA4OCwgMHg4ZWUyMDA4OCwgCisweDgwMDI4ZDMsIDB4YWVlMDcyNWMsIDB4MzA0MzAwMDMsIDB4MjQwMjAwMDIsIAorMHgxMDYyMDAxNiwgMHgyODYyMDAwMywgMHgxMDQwMDAwNSwgMHgyNDAyMDAwMSwgCisweDEwNjIwMDA4LCAweDAsIDB4ODAwMjcwMywgMHgwLCAKKzB4MjQwMjAwMDMsIDB4MTA2MjAwMTcsIDB4MCwgMHg4MDAyNzAzLCAKKzB4MCwgMHg4ZWUyMDBlOCwgMHg4ZWUzMDBlYywgMHgyNDYzMDAwMSwgCisweDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZWUyMDBlOCwgMHhhZWUzMDBlYywgCisweDhlZTIwMGU4LCAweDgwMDI3MDMsIDB4OGVlMzAwZWMsIDB4OGVlMjAwZjAsIAorMHg4ZWUzMDBmNCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIAorMHhhZWUyMDBmMCwgMHhhZWUzMDBmNCwgMHg4ZWUyMDBmMCwgMHg4MDAyNzAzLCAKKzB4OGVlMzAwZjQsIDB4OGVlMjAwZjgsIDB4OGVlMzAwZmMsIDB4MjQ2MzAwMDEsIAorMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZjgsIDB4YWVlMzAwZmMsIAorMHg4ZWUyMDBmOCwgMHg4ZWUzMDBmYywgMHg4ZWUyNzI1YywgMHg4ZWU0MDBlMCwgCisweDhlZTUwMGU0LCAweDQwMTgyMSwgMHgxMDIxLCAweGEzMjgyMSwgCisweGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFlZTQwMGUwLCAKKzB4YWVlNTAwZTQsIDB4ODAwMjhkMywgMHhhZWUwNzI1YywgMHgzMGUyZmZmZiwgCisweDEwNDAwMWMxLCAweDMxYTIwMjAwLCAweDEwNDAwMTRkLCAweDQ4MjEsIAorMHg5NmUyMDQ1YSwgMHgzMDQyMDAxMCwgMHgxMDQwMDE0OSwgMHgwLCAKKzB4OGY4NDAxMDAsIDB4Mjc2MjMwMDAsIDB4MjQ4NTAwMjAsIDB4YTIxMDJiLCAKKzB4NTA0MDAwMDEsIDB4Mjc2NTI4MDAsIDB4OGY4MjAxMDgsIDB4MTBhMjAwMDQsIAorMHgwLCAweDhmODIwMTA0LCAweDE0YTIwMDA2LCAweDI0MDIwMDBjLCAKKzB4OGVlMjAxYTgsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIDB4ODAwMjc2ZSwgCisweDhlZTIwMWE4LCAweGFjOGEwMDAwLCAweGFjOGIwMDA0LCAweDhlZTM3MjY0LCAKKzB4MjQwNjAwMDUsIDB4YTQ4MjAwMGUsIDB4YWM4NjAwMTgsIDB4YWM4MzAwMDgsIAorMHg4ZWUyMDRlNCwgMHhhYzgyMDAxYywgMHg4ZWUyMDRjOCwgMHhhYzgyMDAxMCwgCisweGFmODUwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDM2LCAweDI0MDkwMDAxLCAKKzB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgCisweDhjODIwMDAwLCAweDE0NDYwMDFmLCAweDAsIDB4OGVlMzRlMjgsIAorMHg4ZWUyNGUyYywgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgCisweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTJjLCAweDhlZTU0ZTI4LCAKKzB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUyYywgCisweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIDB4ODAwMjc1OCwgCisweDAsIDB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEwOCwgCisweDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDhjODIwMDA0LCAKKzB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMjc2ZSwgCisweDAsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIAorMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLCAKKzB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIAorMHgyZTIyMDIxLCAweDI0MDIwMDA1LCAweGFjODIwMDAwLCAweDI0MDIwMDAxLCAKKzB4YWM4MjAwMDQsIDB4MTUyMDAwMGEsIDB4M2MwNDAwMDEsIDB4YWZhYjAwMTAsIAorMHg4ZWUyNzI2NCwgMHgzYzA0MDAwMSwgMHgyNDg0NTczMCwgMHgzYzA1MDAwNCwgCisweGFmYTIwMDE0LCAweDhlZTYwNGU0LCAweDgwMDI4YmUsIDB4MzRhNWYwMTQsIAorMHg4ZWUyNzI2NCwgMHgzNDg0MzgwMCwgMHgzNjQxODIxLCAweDI0NDIwMDEwLCAKKzB4NDMxMDJiLCAweDE0NDAwMDczLCAweDAsIDB4OGVlMjcyNjQsIAorMHgyNDQ4MDAxMCwgMHgzNjQxMDIxLCAweDEwMjEwMmIsIDB4MTQ0MDAwMDIsIAorMHgzYzAyZmZmZiwgMHgxMDI0MDIxLCAweDhmODUwMTAwLCAweDI3NjIzMDAwLCAKKzB4MjRhNjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYyODAwLCAKKzB4OGY4MjAxMDgsIDB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwgCisweDE0YzIwMDA3LCAweDI1NjMwMDBjLCAweDhlZTIwMWE4LCAweDQ4MjEsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwgMHg4MDAyN2UyLCAweDhlZTIwMWE4LCAKKzB4MmM2NDAwMGMsIDB4MTQ0MTAyMSwgMHhhY2EyMDAwMCwgMHhhY2EzMDAwNCwgCisweDI0ZTJmZmY0LCAweGE0YTIwMDBlLCAweDI0MDIwMDA2LCAweGFjYTgwMDA4LCAKKzB4YWNhMjAwMTgsIDB4OGVlMjA0ZTQsIDB4YWNhMjAwMWMsIDB4OGVlMjA0YzgsIAorMHgzYzAzMDAwMiwgMHg0MzEwMjUsIDB4YWNhMjAwMTAsIDB4YWY4NjAxMDAsIAorMHg5MmUyMDRlYywgMHgxNDQwMDAzNywgMHgyNDA5MDAwMSwgMHg4ZWUyNGUyOCwgCisweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIAorMHgyNDAyMDAwNSwgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTI4LCAKKzB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIAorMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUyYywgMHg4ZWU1NGUyOCwgCisweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMmMsIAorMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAweDgwMDI3Y2MsIAorMHgwLCAweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMDgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwgMHg4YzgyMDAwNCwgCisweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDI3ZTIsIAorMHgwLCAweDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAKKzB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwgCisweGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAKKzB4MmUyMjAyMSwgMHgyNDAyMDAwNSwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgCisweGFjODIwMDA0LCAweDE1MjAwMDBhLCAweDI1MDhmZmZjLCAweGFmYWIwMDEwLCAKKzB4OGVlMjcyNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU3MzAsIDB4M2MwNTAwMDQsIAorMHhhZmEyMDAxNCwgMHg4ZWU2MDRlNCwgMHg4MDAyOGJlLCAweDM0YTVmMDE1LCAKKzB4MzQwMjgxMDAsIDB4YTUwMjAwMDAsIDB4OTU4MjAwMGUsIDB4ODAwMjg1ZiwgCisweGE1MDIwMDAyLCAweDhmODUwMTAwLCAweDI3NjIzMDAwLCAweDI0YTYwMDIwLCAKKzB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYyODAwLCAweDhmODIwMTA4LCAKKzB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwgMHgxNGMyMDAwNywgCisweDI1NjMwMDBjLCAweDhlZTIwMWE4LCAweDQ4MjEsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFhOCwgMHg4MDAyODRmLCAweDhlZTIwMWE4LCAweDJjNjQwMDBjLCAKKzB4MTQ0MTAyMSwgMHhhY2EyMDAwMCwgMHhhY2EzMDAwNCwgMHg4ZWUzNzI2NCwgCisweDI0ZTJmZmY0LCAweGE0YTIwMDBlLCAweDI0MDIwMDA2LCAweGFjYTIwMDE4LCAKKzB4MjQ2MzAwMTAsIDB4YWNhMzAwMDgsIDB4OGVlMjA0ZTQsIDB4YWNhMjAwMWMsIAorMHg4ZWUyMDRjOCwgMHgzYzAzMDAwMiwgMHg0MzEwMjUsIDB4YWNhMjAwMTAsIAorMHhhZjg2MDEwMCwgMHg5MmUyMDRlYywgMHgxNDQwMDAzNywgMHgyNDA5MDAwMSwgCisweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsIAorMHg4YzgzMDAwMCwgMHgyNDAyMDAwNSwgMHgxNDYyMDAxZiwgMHgwLCAKKzB4OGVlMzRlMjgsIDB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIAorMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUyYywgCisweDhlZTU0ZTI4LCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIAorMHg4ZWUyNGUyYywgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAKKzB4ODAwMjgzOSwgMHgwLCAweDE0YTAwMDA1LCAweDAsIAorMHg4ZjgyMDEwOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwgCisweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAKKzB4ODAwMjg0ZiwgMHgwLCAweDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAKKzB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwgCisweDI0NDIwMDAxLCAweGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLCAKKzB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNSwgMHhhYzgyMDAwMCwgCisweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE1MjAwMDBhLCAweDM0MDI4MTAwLCAKKzB4YWZhYjAwMTAsIDB4OGVlMjcyNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU3MzAsIAorMHgzYzA1MDAwNCwgMHhhZmEyMDAxNCwgMHg4ZWU2MDRlNCwgMHg4MDAyOGJlLCAKKzB4MzRhNWYwMTYsIDB4OGVlMzcyNjQsIDB4YTQ2MjAwMGMsIDB4OGVlMzcyNjQsIAorMHg5NTgyMDAwZSwgMHhhNDYyMDAwZSwgMHg4MDAyOGMyLCAweDI0ZTcwMDA0LCAKKzB4OGY4MzAxMDAsIDB4Mjc2MjMwMDAsIDB4MjQ2NDAwMjAsIDB4ODIxMDJiLCAKKzB4NTA0MDAwMDEsIDB4Mjc2NDI4MDAsIDB4OGY4MjAxMDgsIDB4MTA4MjAwMDQsIAorMHgwLCAweDhmODIwMTA0LCAweDE0ODIwMDA3LCAweDI0MDUwMDA1LCAKKzB4OGVlMjAxYTgsIDB4NDgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwgCisweDgwMDI4YjYsIDB4OGVlMjAxYTgsIDB4YWM2YTAwMDAsIDB4YWM2YjAwMDQsIAorMHg4ZWUyNzI2NCwgMHhhNDY3MDAwZSwgMHhhYzY1MDAxOCwgMHhhYzYyMDAwOCwgCisweDhlZTIwNGU0LCAweGFjNjIwMDFjLCAweDhlZTIwNGM4LCAweGFjNjIwMDEwLCAKKzB4YWY4NDAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzYsIDB4MjQwOTAwMDEsIAorMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MjAwMDAsIDB4MTQ0NTAwMWYsIDB4MCwgMHg4ZWUzNGUyOCwgCisweDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAKKzB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMmMsIDB4OGVlNTRlMjgsIAorMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTJjLCAKKzB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAyOGEwLCAKKzB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTA4LCAKKzB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsIDB4OGM4MjAwMDQsIAorMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAyOGI2LCAKKzB4MCwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgCisweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsIAorMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgCisweDJlMjIwMjEsIDB4MjQwMjAwMDUsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIAorMHhhYzgyMDAwNCwgMHgxNTIwMDAwYiwgMHgzYzA1MDAwNCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1NzQ4LCAweGFmYWIwMDEwLCAweGFmYTAwMDE0LCAweDhlZTYwNGU0LCAKKzB4MzRhNWYwMTcsIDB4YzAwMjQwMywgMHgzMGU3ZmZmZiwgMHg4MDAyOGUxLCAKKzB4MCwgMHg4ZWUyNzI2NCwgMHgzYzA1MDAwMSwgMHgzMGU0ZmZmZiwgCisweDQ0MTAyMSwgMHhhZWUyNzI2NCwgMHg4ZWUyNzI1YywgMHg4ZWUzNzI2NCwgCisweDM0YTUzODAwLCAweDQ0MTAyMSwgMHhhZWUyNzI1YywgMHgzNjUxMDIxLCAKKzB4NjIxODJiLCAweDE0NjAwMDA0LCAweDNjMDNmZmZmLCAweDhlZTI3MjY0LCAKKzB4NDMxMDIxLCAweGFlZTI3MjY0LCAweDhlZTMwNGU0LCAweDk2ZTIwNDU4LCAKKzB4MjQ2MzAwMDEsIDB4MjQ0MmZmZmYsIDB4NjIxODI0LCAweGFlZTMwNGU0LCAKKzB4OGVlMzA0ZTQsIDB4OGVlMjA0ZTAsIDB4MTQ2MjAwMDUsIDB4MCwgCisweDhmODIwMDYwLCAweDI0MDNmZmY3LCAweDQzMTAyNCwgMHhhZjgyMDA2MCwgCisweDhmYmYwMDIwLCAweDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4MjdiZGZmZTAsIAorMHhhZmJmMDAxOCwgMHg4ZWUzMDRlOCwgMHg4ZWUyMDRlMCwgMHgxMDYyMDE4OSwgCisweDAsIDB4OGVlMjA0ZTgsIDB4OGVlMzA0ZmMsIDB4MjExMDAsIAorMHg2MjE4MjEsIDB4OTQ2NzAwMDgsIDB4OTJlMjA0ZWQsIDB4OGM2ODAwMDAsIAorMHg4YzY5MDAwNCwgMHgxMDQwMDAyMywgMHg5NDZhMDAwYSwgMHg4ZWUyMDRjOCwgCisweDM0NDYwNDAwLCAweDMxNDIwMjAwLCAweDEwNDAwMDFmLCAweDAsIAorMHg5NmUyMDQ1YSwgMHgzMDQyMDAxMCwgMHgxMDQwMDAxYiwgMHgzYzAyODAwMCwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyODNkOCwgMHg4ZWUyNzI2NCwgCisweDk0NjQwMDBlLCAweDNjMDUwMDAxLCAweDM0YTUzODAwLCAweDI0NDIwMDA0LCAKKzB4YWVlMjcyNjQsIDB4OGVlMzcyNjQsIDB4NDI0MDAsIDB4MzY1MTAyMSwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzI0ODNkYywgMHg2MjE4MmIsIAorMHgxNDYwMDAwNSwgMHgyNGU3MDAwNCwgMHg4ZWUyNzI2NCwgMHgzYzAzZmZmZiwgCisweDQzMTAyMSwgMHhhZWUyNzI2NCwgMHg4ZWUyNzI2NCwgMHg4MDAyOTE3LCAKKzB4YWVlMjcyNTgsIDB4OGVlNjA0YzgsIDB4OGVlMjcyNmMsIDB4MzBlNGZmZmYsIAorMHg0NDEwMmEsIDB4MTA0MDAwMTUsIDB4MCwgMHg4ZjgyMDBkOCwgCisweDhlZTM3MjU4LCAweDQzMTAyMywgMHhhZWUyNzI2YywgMHg4ZWUyNzI2YywgCisweDFjNDAwMDA3LCAweDQ0MTAyYSwgMHg4ZWUyNzI2YywgMHgzYzAzMDAwMSwgCisweDQzMTAyMSwgMHhhZWUyNzI2YywgMHg4ZWUyNzI2YywgMHg0NDEwMmEsIAorMHgxMDQwMDAwNiwgMHgwLCAweDhlZTIwMWI4LCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxYjgsIDB4ODAwMmE3MiwgMHg4ZWUyMDFiOCwgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg4YzQyODNkOCwgMHg1NDQwMDAwMSwgMHgyNGU3ZmZmYywgCisweDMxNDIwMDA0LCAweDEwNDAwMGI5LCAweDMwZTJmZmZmLCAweDNjMDIwMDAxLCAKKzB4NTcxMDIxLCAweDhjNDI4M2Q4LCAweDEwNDAwMDJmLCAweDUwMjEsIAorMHg4Zjg0MDEwMCwgMHgyNzYyMzAwMCwgMHgyNDg1MDAyMCwgMHhhMjEwMmIsIAorMHg1MDQwMDAwMSwgMHgyNzY1MjgwMCwgMHg4ZjgyMDEwOCwgMHgxMGEyMDAzMiwgCisweDAsIDB4OGY4MjAxMDQsIDB4MTBhMjAwMmYsIDB4MjQwMjAwMTUsIAorMHhhYzg4MDAwMCwgMHhhYzg5MDAwNCwgMHg4ZWUzNzI2NCwgMHhhNDg3MDAwZSwgCisweGFjODIwMDE4LCAweGFjODMwMDA4LCAweDhlZTIwNGU4LCAweDNjMDMwMDAxLCAKKzB4NzcxODIxLCAweDhjNjM4M2RjLCAweGFjODYwMDEwLCAweDQzMTAyNSwgCisweGFjODIwMDFjLCAweGFmODUwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDY2LCAKKzB4MjQwYTAwMDEsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIAorMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLCAKKzB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIAorMHgyZTIxODIxLCAweDI0MDIwMDE1LCAweGFjNjIwMDAwLCAweDI0MDIwMDAxLCAKKzB4ODAwMjliZiwgMHhhYzYyMDAwNCwgMHg4Zjg0MDEwMCwgMHgyNzYyMzAwMCwgCisweDI0ODUwMDIwLCAweGEyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY1MjgwMCwgCisweDhmODIwMTA4LCAweDEwYTIwMDA0LCAweDAsIDB4OGY4MjAxMDQsIAorMHgxNGEyMDAwNiwgMHgyNDAyMDAwNiwgMHg4ZWUyMDFhOCwgMHgyNDQyMDAwMSwgCisweGFlZTIwMWE4LCAweDgwMDI5YmYsIDB4OGVlMjAxYTgsIDB4YWM4ODAwMDAsIAorMHhhYzg5MDAwNCwgMHg4ZWUzNzI2NCwgMHhhNDg3MDAwZSwgMHhhYzgyMDAxOCwgCisweGFjODMwMDA4LCAweDhlZTIwNGU4LCAweGFjODYwMDEwLCAweGFjODIwMDFjLCAKKzB4YWY4NTAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzcsIDB4MjQwYTAwMDEsIAorMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MzAwMDAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMWYsIDB4MCwgCisweDhlZTM0ZTI4LCAweDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAKKzB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMmMsIAorMHg4ZWU1NGUyOCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAKKzB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgCisweDgwMDI5YTksIDB4MCwgMHgxNGEwMDAwNSwgMHgwLCAKKzB4OGY4MjAxMDgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsIAorMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgCisweDgwMDI5YmYsIDB4MCwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwgCisweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsIAorMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgCisweDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDUsIDB4YWM4MjAwMDAsIAorMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHgxNTQwMDAwYSwgMHgyNDAyMDAwMSwgCisweGFmYTkwMDEwLCAweDhlZTI3MjY0LCAweDNjMDQwMDAxLCAweDI0ODQ1NzMwLCAKKzB4M2MwNTAwMDQsIDB4YWZhMjAwMTQsIDB4OGVlNjA0ZTQsIDB4ODAwMmE0ZiwgCisweDM0YTVmMjA0LCAweGEyZTIwNGVkLCAweDhlZTIwNGU4LCAweDhlZTMwNGZjLCAKKzB4OGVlNDcyNTgsIDB4M2MwNjAwMDEsIDB4MzRjNjM4MDAsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4YWMyMDgzZDgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAKKzB4YWMyMDgzZGMsIDB4MjExMDAsIDB4NDMxMDIxLCAweGFjNDQwMDBjLCAKKzB4OGVlMjcyNjQsIDB4MjQwNWZmZjgsIDB4MzBlM2ZmZmYsIDB4NDMxMDIxLCAKKzB4MjQ0MjAwMDcsIDB4NDUxMDI0LCAweDI0NjMwMDA3LCAweGFlZTI3MjU4LCAKKzB4OGVlMjcyNmMsIDB4OGVlNDcyNTgsIDB4NjUxODI0LCAweDQzMTAyMywgCisweGFlZTI3MjZjLCAweDM2NjEwMjEsIDB4ODIyMDJiLCAweDE0ODAwMDA0LCAKKzB4M2MwM2ZmZmYsIDB4OGVlMjcyNTgsIDB4NDMxMDIxLCAweGFlZTI3MjU4LCAKKzB4OGVlMjcyNTgsIDB4ODAwMmE2NCwgMHhhZWUyNzI2NCwgMHgxMDQwMDA3MywgCisweDAsIDB4OGY4MzAxMDAsIDB4Mjc2MjMwMDAsIDB4MjQ2NDAwMjAsIAorMHg4MjEwMmIsIDB4MTQ0MDAwMDIsIDB4NTAyMSwgMHgyNzY0MjgwMCwgCisweDhmODIwMTA4LCAweDEwODIwMDA0LCAweDAsIDB4OGY4MjAxMDQsIAorMHgxNDgyMDAwNiwgMHgyNDA1MDAwNSwgMHg4ZWUyMDFhOCwgMHgyNDQyMDAwMSwgCisweGFlZTIwMWE4LCAweDgwMDJhNDYsIDB4OGVlMjAxYTgsIDB4YWM2ODAwMDAsIAorMHhhYzY5MDAwNCwgMHg4ZWUyNzI2NCwgMHhhNDY3MDAwZSwgMHhhYzY1MDAxOCwgCisweGFjNjIwMDA4LCAweDhlZTIwNGU4LCAweGFjNjYwMDEwLCAweGFjNjIwMDFjLCAKKzB4YWY4NDAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzYsIDB4MjQwYTAwMDEsIAorMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MjAwMDAsIDB4MTQ0NTAwMWYsIDB4MCwgMHg4ZWUzNGUyOCwgCisweDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAKKzB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMmMsIDB4OGVlNTRlMjgsIAorMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTJjLCAKKzB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAyYTMwLCAKKzB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTA4LCAKKzB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsIDB4OGM4MjAwMDQsIAorMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAyYTQ2LCAKKzB4MCwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgCisweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsIAorMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgCisweDJlMjIwMjEsIDB4MjQwMjAwMDUsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIAorMHhhYzgyMDAwNCwgMHgxNTQwMDAwYywgMHgzMGU1ZmZmZiwgMHgzYzA0MDAwMSwgCisweDI0ODQ1NzQ4LCAweDNjMDUwMDA0LCAweGFmYTkwMDEwLCAweGFmYTAwMDE0LCAKKzB4OGVlNjA0ZTQsIDB4MzRhNWYyMzcsIDB4YzAwMjQwMywgMHgzMGU3ZmZmZiwgCisweDgwMDJhNzIsIDB4MCwgMHg4ZWUyNzI2NCwgMHg0NTEwMjEsIAorMHhhZWUyNzI2NCwgMHg4ZWUyNzI2YywgMHg4ZWUzNzI2NCwgMHgzYzA0MDAwMSwgCisweDM0ODQzODAwLCAweGEyZTAwNGVkLCAweDQ1MTAyMywgMHhhZWUyNzI2YywgCisweDM2NDEwMjEsIDB4NjIxODJiLCAweDE0NjAwMDA0LCAweDNjMDNmZmZmLCAKKzB4OGVlMjcyNjQsIDB4NDMxMDIxLCAweGFlZTI3MjY0LCAweDhlZTMwNGU4LCAKKzB4OTZlMjA0NTgsIDB4MjQ2MzAwMDEsIDB4MjQ0MmZmZmYsIDB4NjIxODI0LCAKKzB4YWVlMzA0ZTgsIDB4OGVlMzA0ZTgsIDB4OGVlMjA0ZTAsIDB4MTQ2MjAwMDUsIAorMHgwLCAweDhmODIwMDYwLCAweDI0MDNmZmY3LCAweDQzMTAyNCwgCisweGFmODIwMDYwLCAweDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIAorMHgyN2JkZmZlMCwgMHhhZmJmMDAxYywgMHhhZmIwMDAxOCwgMHg4ZjgyMDEwMCwgCisweDhlZTM0ZTJjLCAweDhmODIwMTA0LCAweDhmODUwMTA4LCAweDI0MDIwMDQwLCAKKzB4MjQ2MzAwMDEsIDB4NTA2MjAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyYywgCisweDI0NDIwMDAxLCAweGFlZTI0ZTJjLCAweDhlZTI0ZTJjLCAweDhlZTM0ZTJjLCAKKzB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHg4ZWUyNGUyOCwgCisweDhjODcwMDA0LCAweDE0NjIwMDA3LCAweGEwMzAyMSwgMHg4ZjgyMDEwOCwgCisweDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDgwMDJhYTIsIAorMHhhYzgwMDAwMCwgMHg4ZWUyNGUyYywgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgCisweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsIAorMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAweDhjODIwMDA0LCAKKzB4OGY4MzAxMDgsIDB4MjExNDAsIDB4NjIxODIxLCAweGFmODMwMTA4LCAKKzB4YWM4MDAwMDAsIDB4OGNjMjAwMTgsIDB4MjQ0M2ZmZmUsIDB4MmM2MjAwMTMsIAorMHgxMDQwMDBjMSwgMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIAorMHg4YzIyNTc3MCwgMHg0MDAwMDgsIDB4MCwgMHg4ZWUyMDRmMCwgCisweDQ3MTAyMSwgMHhhZWUyMDRmMCwgMHg4ZWUyMDRmMCwgMHg4ZjQzMDIzYywgCisweDQzMTAyYiwgMHgxNDQwMDBiZSwgMHgwLCAweDhlZTMwNGU0LCAKKzB4OGVlMjA0ZjgsIDB4NTA2MjAwYmEsIDB4YTJlMDA0ZjQsIDB4OGY4MzAxMjAsIAorMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIAorMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAKKzB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwgCisweDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMmIxMiwgCisweDhlZTIwMWE0LCAweDhlZTIwNGU0LCAweGFjNjIwMDFjLCAweDhlZTQwNGIwLCAKKzB4OGVlNTA0YjQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4MjQwMjAwMDgsIAorMHhhNDYyMDAwZSwgMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwgMHhhYzY0MDAwMCwgCisweGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLCAKKzB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsIDB4OGVlMjRlMzAsIAorMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLCAKKzB4MjQwMjAwMTIsIDB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgCisweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAKKzB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIAorMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LCAKKzB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAyYWZjLCAKKzB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAKKzB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIAorMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAyYjEyLCAKKzB4MCwgMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgCisweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgCisweDJlMjIwMjEsIDB4MjQwMjAwMTIsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIAorMHhhYzgyMDAwNCwgMHg1NjAwMDAwYiwgMHgyNDEwMDAwMSwgMHg4ZWUyMDRlNCwgCisweDNjMDQwMDAxLCAweDI0ODQ1NzU0LCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAKKzB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgCisweDM0YTVmMDA2LCAweDE2MDAwMDAzLCAweDI0MDIwMDAxLCAweDgwMDJiNzEsIAorMHhhMmUyMDRmNCwgMHg4ZWUyMDE3MCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE3MCwgCisweDhlZTIwMTcwLCAweDhlZTIwNGU0LCAweGEyZTAwNGY0LCAweGFlZTAwNGYwLCAKKzB4YWVlMjA0ZjgsIDB4OGY0MjAyM2MsIDB4NTA0MDAwNDUsIDB4YWVlMDcyNzQsIAorMHg4ZWUyMDE4NCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE4NCwgMHg4ZWUyMDE4NCwgCisweDgwMDJiNzEsIDB4YWVlMDcyNzQsIDB4OGVlMjA1MDQsIDB4MjQwMzAwNDAsIAorMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTIwNTA0LCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjA1MDQsIDB4OGVlMjA1MDQsIDB4OGNjMzAwMTgsIAorMHgyMTA4MCwgMHg1NzEwMjEsIDB4OGM0NDA1MDgsIDB4MjQwMjAwMDMsIAorMHgxNDYyMDAwZiwgMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgCisweDkwNDI4M2IxLCAweDEwNDAwMDE0LCAweDAsIDB4OGVlMjAxZDAsIAorMHg4ZWUzNTI0MCwgMHg0NDEwMjEsIDB4YWVlMjAxZDAsIDB4OGVlMjAxZDgsIAorMHg2NDE4MjEsIDB4MzA2MzAwZmYsIDB4ODAwMmI1OSwgMHhhZWUzNTI0MCwgCisweDhlZTIwMWNjLCAweDhlZTMwZTEwLCAweDQ0MTAyMSwgMHhhZWUyMDFjYywgCisweDhlZTIwMWQ4LCAweDY0MTgyMSwgMHgzMDYzMDFmZiwgMHhhZWUzMGUxMCwgCisweDQ0MTAyMSwgMHhhZWUyMDFkOCwgMHg4ZWUyMDAwMCwgMHgzNDQyMDA0MCwgCisweDgwMDJiNzEsIDB4YWVlMjAwMDAsIDB4OGVlMjAxNGMsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4YTAyMDgzZTAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNGMsIAorMHg4MDAyYjcxLCAweDhlZTIwMTRjLCAweDk0YzcwMDBlLCAweDhjYzIwMDFjLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDU3NjAsIDB4YWZhNjAwMTQsIDB4YWZhMjAwMTAsIAorMHg4Y2M2MDAxOCwgMHgzYzA1MDAwOCwgMHhjMDAyNDAzLCAweDM0YTUwOTEwLCAKKzB4OGZiZjAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgCisweDI3YmRmZjk4LCAweGFmYmYwMDYwLCAweGFmYmUwMDVjLCAweGFmYjYwMDU4LCAKKzB4YWZiNTAwNTQsIDB4YWZiNDAwNTAsIDB4YWZiMzAwNGMsIDB4YWZiMjAwNDgsIAorMHhhZmIxMDA0NCwgMHhhZmIwMDA0MCwgMHg4ZjgzMDEwOCwgMHg4ZjgyMDEwNCwgCisweGFmYTAwMDI0LCAweDEwNjIwM2U3LCAweGFmYTAwMDJjLCAweDNjMWUwMDAxLCAKKzB4MzdkZTM4MDAsIDB4M2MwYmZmZmYsIDB4OGY5MzAxMDgsIDB4OGU2MjAwMTgsIAorMHg4ZjgzMDEwNCwgMHgyNDQzZmZmZSwgMHgyYzYyMDAxNCwgMHgxMDQwMDNjZiwgCisweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNTdjMCwgCisweDQwMDAwOCwgMHgwLCAweDk2NjMwMDBlLCAweDhlZTI3MjVjLCAKKzB4OGVlNDA0ZjAsIDB4NDMxMDIxLCAweGFlZTI3MjVjLCAweDhlNjMwMDFjLCAKKzB4OTZlMjA0NTgsIDB4MjQ4NDAwMDEsIDB4YWVlNDA0ZjAsIDB4MjQ2MzAwMDEsIAorMHgyNDQyZmZmZiwgMHg2MjE4MjQsIDB4YWVlMzA0ZTQsIDB4OGY0MjAyM2MsIAorMHg4MjIwMmIsIDB4MTQ4MDAzYjksIDB4MCwgMHg4ZjgzMDEyMCwgCisweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgCisweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIAorMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAKKzB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAyYmZlLCAKKzB4OGVlMjAxYTQsIDB4OGVlMjA0ZTQsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YjAsIAorMHg4ZWU1MDRiNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgCisweGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLCAKKzB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIAorMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgCisweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIAorMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAKKzB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwYzAwNDAsIDB4OGM4MjAwMDQsIAorMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgCisweDI0NDIwMDAxLCAweDEwNGMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIAorMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDJiZTgsIAorMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgCisweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDJiZmUsIAorMHgwLCAweDhlZTI0ZTMwLCAweDI0MGMwMDQwLCAweDI0NDIwMDAxLCAKKzB4NTA0YzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgCisweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHgyNDAyMDAxMiwgMHgyNDBjMDAwMSwgMHhhYzgyMDAwMCwgCisweGFjOGMwMDA0LCAweDU2MDAwMDBkLCAweDI0MTAwMDAxLCAweDhlZTIwNGU0LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDU3NTQsIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIAorMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHgzNGE1ZjAwNiwgCisweGMwMDI0MDMsIDB4YWZhYjAwMzgsIDB4OGZhYjAwMzgsIDB4MTIwMDAzMGEsIAorMHgyNDBjMDAwMSwgMHg4MDAyZjE5LCAweDAsIDB4OTY2YzAwMWMsIAorMHhhZmFjMDAyYywgMHg5NjYyMDAxZSwgMHgzYzBjODAwMCwgMHhhZmFjMDAyNCwgCisweGFlNjIwMDFjLCAweDhlNzUwMDFjLCAweDhlZTIwNGZjLCAweDhlZTQwNGZjLCAKKzB4MTUxOTAwLCAweDYyMTAyMSwgMHg4YzUyMDAwYywgMHg5MmUyN2I5OCwgCisweDY0MTgyMSwgMHg5NDc2MDAwYSwgMHgxNDQwMDAwMywgMHgzMmMyMDAwMiwgCisweGFlZjI3YmE0LCAweGFlZjU3YjljLCAweDEwNDAwMDRiLCAweDgwMjEsIAorMHg5NmUyMDQ1YSwgMHgzMDQyMDAwMiwgMHgxMDQwMDA0NywgMHgwLCAKKzB4OGU2MzAwMWMsIDB4OGVlMjA0ZmMsIDB4MzIxMDAsIDB4ODIxMDIxLCAKKzB4OGM0MjAwMGMsIDB4MzdlMTgyMSwgMHgyNDQyMDAyMiwgMHg0MzEwMmIsIAorMHgxNDQwMDAwYSwgMHgyNDA1MDAxNCwgMHg4ZWUyMDRmYywgMHg4MjEwMjEsIAorMHg4YzQ0MDAwYywgMHhhZmFiMDAzOCwgMHhjMDAyZjc1LCAweDI0ODQwMDBlLCAKKzB4OGZhYjAwMzgsIDB4ODAwMmM1MiwgMHgzMDUwZmZmZiwgMHg4ZWUyMDRmYywgCisweDgyMTAyMSwgMHg4YzQyMDAwYywgMHg5NDUwMDAwZSwgMHg5NDQzMDAxMCwgCisweDk0NDQwMDEyLCAweDk0NDUwMDE0LCAweDIwMzgwMjEsIDB4MjA0ODAyMSwgCisweDIwNTgwMjEsIDB4OTQ0MzAwMTYsIDB4OTQ0NDAwMTgsIDB4OTQ0NTAwMWEsIAorMHgyMDM4MDIxLCAweDIwNDgwMjEsIDB4MjA1ODAyMSwgMHg5NDQzMDAxYywgCisweDk0NDQwMDFlLCAweDk0NDIwMDIwLCAweDIwMzgwMjEsIDB4MjA0ODAyMSwgCisweDIwMjgwMjEsIDB4MTAxYzAyLCAweDMyMDJmZmZmLCAweDYyODAyMSwgCisweDhlNjMwMDFjLCAweDhlZTIwNGZjLCAweDEwMjQwMiwgMHgzMjkwMCwgCisweGEyMTAyMSwgMHg4YzQzMDAwYywgMHgzMjAyZmZmZiwgMHg4MjgwMjEsIAorMHgzN2UxMDIxLCAweDI0NjMwMDE4LCAweDYyMTgyYiwgMHgxNDYwMDAwOSwgCisweDAsIDB4OGVlMjA0ZmMsIDB4YTIxMDIxLCAweDhjNDMwMDBjLCAKKzB4MTAxMDI3LCAweDNjMDFmZmZmLCAweDIzMDgyMSwgMHg4MDAyYzZmLCAKKzB4YTQyMjAwMTgsIDB4OGVlMjA0ZmMsIDB4YTIxMDIxLCAweDhjNDMwMDBjLCAKKzB4MTAxMDI3LCAweGE0NjIwMDE4LCAweDk2ZTIwNDVhLCAweDg4MjEsIAorMHgzMDQyMDAwOCwgMHgxNDQwMDA2MywgMHhhMDIxLCAweDhlNjMwMDFjLCAKKzB4OGVlMjA0ZmMsIDB4MzMxMDAsIDB4YzIxMDIxLCAweDhjNDIwMDBjLCAKKzB4MzdlMTgyMSwgMHgyNDQyMDAyMiwgMHg0MzEwMmIsIDB4MTQ0MDAwMzUsIAorMHgwLCAweDhlZTIwNGZjLCAweGMyMTAyMSwgMHg4YzQyMDAwYywgCisweDI0NDcwMDEwLCAweDM3ZTEwMjEsIDB4ZTIxMDJiLCAweDUwNDAwMDAxLCAKKzB4ZWIzODIxLCAweDhlZTIwNGZjLCAweDk0ZjEwMDAwLCAweGMyMTAyMSwgCisweDhjNDIwMDBjLCAweDI0NDcwMDE2LCAweDM3ZTEwMjEsIDB4ZTIxMDJiLCAKKzB4MTQ0MDAwMDIsIDB4MjYzNGZmZWMsIDB4ZWIzODIxLCAweDhlZTIwNGZjLCAKKzB4OTBlMzAwMDEsIDB4YzIxMDIxLCAweDhjNDIwMDBjLCAweDI0NDcwMDFhLCAKKzB4MzdlMTAyMSwgMHhlMjEwMmIsIDB4MTQ0MDAwMDIsIDB4MjgzODgyMSwgCisweGViMzgyMSwgMHg5NGUyMDAwMCwgMHgyNGU3MDAwMiwgMHgyMjI4ODIxLCAKKzB4MzdlMTAyMSwgMHhlMjEwMmIsIDB4NTA0MDAwMDEsIDB4ZWIzODIxLCAKKzB4OTRlMjAwMDAsIDB4MjRlNzAwMDIsIDB4MjIyODgyMSwgMHgzN2UxMDIxLCAKKzB4ZTIxMDJiLCAweDUwNDAwMDAxLCAweGViMzgyMSwgMHg5NGUyMDAwMCwgCisweDI0ZTcwMDAyLCAweDIyMjg4MjEsIDB4MzdlMTAyMSwgMHhlMjEwMmIsIAorMHg1MDQwMDAwMSwgMHhlYjM4MjEsIDB4OTRlMjAwMDAsIDB4ODAwMmNkMCwgCisweDIyMjg4MjEsIDB4OGVlMjA0ZmMsIDB4YzIxMDIxLCAweDhjNDMwMDBjLCAKKzB4OGVlMjA0ZmMsIDB4OTQ3MTAwMTAsIDB4OGVlMzA0ZmMsIDB4YzIxMDIxLCAKKzB4OGM0NDAwMGMsIDB4YzMxODIxLCAweDhjNjIwMDBjLCAweDI2MzRmZmVjLCAKKzB4OTA4NDAwMTcsIDB4OGVlMzA0ZmMsIDB4OTQ0MjAwMWEsIDB4Mjg0ODgyMSwgCisweGMzMTgyMSwgMHg4YzY1MDAwYywgMHg4ZWUzMDRmYywgMHgyMjI4ODIxLCAKKzB4OGVlMjA0ZmMsIDB4YzMxODIxLCAweGMyMTAyMSwgMHg4YzQ0MDAwYywgCisweDhjNjIwMDBjLCAweDk0YTMwMDFjLCAweDk0ODQwMDFlLCAweDk0NDIwMDIwLCAKKzB4MjIzODgyMSwgMHgyMjQ4ODIxLCAweDIyMjg4MjEsIDB4MTExYzAyLCAKKzB4MzIyMmZmZmYsIDB4NjI4ODIxLCAweDExMWMwMiwgMHgzMjIyZmZmZiwgCisweDYyODgyMSwgMHgzMmMyMDAwMSwgMHgxMDQwMDBiMiwgMHgwLCAKKzB4OTZlMjA0NWEsIDB4MzA0MjAwMDEsIDB4MTA0MDAwYWUsIDB4MzJjMjAwODAsIAorMHgxMDQwMDAwOCwgMHgwLCAweDkyZTI3Yjk4LCAweDE0NDAwMDA1LCAKKzB4MCwgMHgyNDBjMDAwMSwgMHhhMmVjN2I5OCwgMHhhZWY1N2I5YywgCisweGFlZjI3YmE0LCAweDhlZTMwNGZjLCAweDE1MTEwMCwgMHg0MzEwMjEsIAorMHg4YzQ3MDAwYywgMHgzN2UxODIxLCAweDI0ZTIwMDBlLCAweDQzMTAyYiwgCisweDE0NDAwMDA4LCAweGUwMjAyMSwgMHgyNDA1MDAwZSwgMHhjMDAyZjc1LCAKKzB4YWZhYjAwMzgsIDB4MzA0MmZmZmYsIDB4OGZhYjAwMzgsIDB4ODAwMmQwOSwgCisweDIwMjgwMjEsIDB4OTRlNjAwMDAsIDB4MjRlNzAwMDIsIDB4OTRlNTAwMDAsIAorMHgyNGU3MDAwMiwgMHg5NGUzMDAwMCwgMHgyNGU3MDAwMiwgMHg5NGUyMDAwMCwgCisweDI0ZTcwMDAyLCAweDk0ZTQwMDAwLCAweDI0ZTcwMDAyLCAweDIwNjgwMjEsIAorMHgyMDU4MDIxLCAweDIwMzgwMjEsIDB4MjAyODAyMSwgMHg5NGUyMDAwMCwgCisweDk0ZTMwMDAyLCAweDIwNDgwMjEsIDB4MjAyODAyMSwgMHgyMDM4MDIxLCAKKzB4MTAxYzAyLCAweDMyMDJmZmZmLCAweDYyODAyMSwgMHgxMDFjMDIsIAorMHgzMjAyZmZmZiwgMHg4ZWU0N2I5YywgMHg2MjgwMjEsIDB4MTQ5NTAwMDQsIAorMHgzMjA1ZmZmZiwgMHg5NjYyMDAxNiwgMHg4MDAyZDE3LCAweDUxMjAyMSwgCisweDk2NjIwMDE2LCAweDU0MjAyMSwgMHg0MTQwMiwgMHgzMDgzZmZmZiwgCisweDQzMjAyMSwgMHg4NTIwMjMsIDB4NDE0MDIsIDB4ODIyMDIxLCAKKzB4MzA4NGZmZmYsIDB4NTA4MDAwMDEsIDB4MzQwNGZmZmYsIDB4OGVlMjdiYTQsIAorMHgyNDQzMDAxNywgMHgzN2UxMDIxLCAweDYyMTAyYiwgMHg1MDQwMDAwMSwgCisweDZiMTgyMSwgMHg5MDYzMDAwMCwgMHgyNDAyMDAxMSwgMHgxNDYyMDAzMSwgCisweDI0MDIwMDA2LCAweDhlZTI3YmE0LCAweDM3ZTE4MjEsIDB4MjQ0MjAwMjgsIAorMHg0MzEwMmIsIDB4MTQ0MDAwMTgsIDB4MCwgMHg4ZWUyN2I5YywgCisweDEyYTIwMDBhLCAweDMyYzIwMTAwLCAweDhlZTI3YmE0LCAweDNjMDFmZmZmLCAKKzB4MjIwODIxLCAweDk0MjIwMDI4LCAweDgyMjAyMSwgMHg0MWMwMiwgCisweDMwODJmZmZmLCAweDYyMjAyMSwgMHgzMmMyMDEwMCwgMHgxNDQwMDAwNCwgCisweDQxMDI3LCAweDkyZTI3Yjk4LCAweDE0NDAwMDAyLCAweDQxMDI3LCAKKzB4MzA0NGZmZmYsIDB4OGVlMjdiYTQsIDB4M2MwMWZmZmYsIDB4MjIwODIxLCAKKzB4ODAwMmQ4YSwgMHhhNDI0MDAyOCwgMHg4ZWUyN2I5YywgMHgxMmEyMDAwOCwgCisweDMyYzIwMTAwLCAweDhlZTI3YmE0LCAweDk0NDIwMDI4LCAweDgyMjAyMSwgCisweDQxYzAyLCAweDMwODJmZmZmLCAweDYyMjAyMSwgMHgzMmMyMDEwMCwgCisweDE0NDAwMDA0LCAweDQxMDI3LCAweDkyZTI3Yjk4LCAweDE0NDAwMDAyLCAKKzB4NDEwMjcsIDB4MzA0NGZmZmYsIDB4OGVlMjdiYTQsIDB4ODAwMmQ4YSwgCisweGE0NDQwMDI4LCAweDE0NjIwMDJmLCAweDM3ZTE4MjEsIDB4OGVlMjdiYTQsIAorMHgyNDQyMDAzMiwgMHg0MzEwMmIsIDB4MTQ0MDAwMTgsIDB4MCwgCisweDhlZTI3YjljLCAweDEyYTIwMDBhLCAweDMyYzIwMTAwLCAweDhlZTI3YmE0LCAKKzB4M2MwMWZmZmYsIDB4MjIwODIxLCAweDk0MjIwMDMyLCAweDgyMjAyMSwgCisweDQxYzAyLCAweDMwODJmZmZmLCAweDYyMjAyMSwgMHgzMmMyMDEwMCwgCisweDE0NDAwMDA0LCAweDQxMDI3LCAweDkyZTI3Yjk4LCAweDE0NDAwMDAyLCAKKzB4NDEwMjcsIDB4MzA0NGZmZmYsIDB4OGVlMjdiYTQsIDB4M2MwMWZmZmYsIAorMHgyMjA4MjEsIDB4ODAwMmQ4YSwgMHhhNDI0MDAzMiwgMHg4ZWUyN2I5YywgCisweDEyYTIwMDA4LCAweDMyYzIwMTAwLCAweDhlZTI3YmE0LCAweDk0NDIwMDMyLCAKKzB4ODIyMDIxLCAweDQxYzAyLCAweDMwODJmZmZmLCAweDYyMjAyMSwgCisweDMyYzIwMTAwLCAweDE0NDAwMDA0LCAweDQxMDI3LCAweDkyZTI3Yjk4LCAKKzB4MTQ0MDAwMDIsIDB4NDEwMjcsIDB4MzA0NGZmZmYsIDB4OGVlMjdiYTQsIAorMHhhNDQ0MDAzMiwgMHg4ZmFjMDAyNCwgMHgxMTgwMDAyYywgMHgzN2UxODIxLCAKKzB4OGU0MjAwMDAsIDB4YWU0MmZmZmMsIDB4MjY0MjAwMGEsIDB4NDMxMDJiLCAKKzB4MTQ0MDAwMWIsIDB4MzQwMzgxMDAsIDB4MjY0MzAwMDQsIDB4MzdlMTAyMSwgCisweDYyMTAyYiwgMHgxNDQwMDAwMywgMHg2MDIwMjEsIDB4NmIxODIxLCAKKzB4NjAyMDIxLCAweDhjNjIwMDAwLCAweDI0NjMwMDA0LCAweGFlNDIwMDAwLCAKKzB4MzdlMTAyMSwgMHg2MjEwMmIsIDB4NTA0MDAwMDEsIDB4NmIxODIxLCAKKzB4OGM2MjAwMDAsIDB4YWM4MjAwMDAsIDB4MzQwMjgxMDAsIDB4YTQ2MjAwMDAsIAorMHgyNDYzMDAwMiwgMHgzN2UxMDIxLCAweDYyMTAyYiwgMHg1MDQwMDAwMSwgCisweDZiMTgyMSwgMHg5N2FjMDAyZSwgMHg4MDAyZGI0LCAweGE0NmMwMDAwLCAKKzB4OGU0MjAwMDQsIDB4OGU0NDAwMDgsIDB4YTY0MzAwMDgsIDB4OTdhYzAwMmUsIAorMHhhNjRjMDAwYSwgMHhhZTQyMDAwMCwgMHhhZTQ0MDAwNCwgMHg5NjYyMDAwZSwgCisweDI2NTJmZmZjLCAweDI0NDIwMDA0LCAweGE2NjIwMDBlLCAweDk2NjIwMDBlLCAKKzB4OGVlMzcyNWMsIDB4NjIxODIxLCAweGFlZTM3MjVjLCAweGFmYjIwMDE4LCAKKzB4OGVlMzcyNWMsIDB4YWZhMzAwMWMsIDB4OGVlMjcyNWMsIDB4MmM0MjAwM2MsIAorMHgxMDQwMDAwNCwgMHgyNDYyMDAwMSwgMHgyNDAzZmZmZSwgMHg0MzEwMjQsIAorMHhhZmEyMDAxYywgMHgzMmMyMDA4MCwgMHgxMDQwMDAwYywgMHgzMmMyMDEwMCwgCisweDhlZTI3YmE4LCAweDI0NDMwMDAxLCAweDIxMGMwLCAweDU3MTAyMSwgCisweGFlZTM3YmE4LCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLCAweGFjNDM3YmFjLCAKKzB4YWM0NDdiYjAsIDB4ODAwMmVhMCwgMHhhZWUwNzI1YywgMHgxMDQwMDA3MiwgCisweDAsIDB4OGVlMjdiYTgsIDB4MjQ0MzAwMDEsIDB4MjEwYzAsIAorMHg1NzEwMjEsIDB4YWVlMzdiYTgsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsIAorMHhhYzQzN2JhYywgMHhhYzQ0N2JiMCwgMHg4ZWUyN2JhOCwgMHgxMDQwMDA2MywgCisweDQ4MjEsIDB4NTAyMSwgMHg4ZjgyMDBmMCwgMHgyNDQ4MDAwOCwgCisweDI3NjIxODAwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODEwMDAsIAorMHg4ZjgyMDBmNCwgMHgxNTAyMDAwNywgMHgwLCAweDhlZTIwMWI0LCAKKzB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFiNCwgMHg4MDAyZGZhLCAKKzB4OGVlMjAxYjQsIDB4OGY4MzAwZjAsIDB4MjQxMDAwMDEsIDB4MTU3MTAyMSwgCisweDhjNDQ3YmFjLCAweDhjNDU3YmIwLCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAKKzB4YWY4ODAwZjAsIDB4MTYwMDAwMDYsIDB4MmVhMTAyMSwgMHg4ZWUyMDA4OCwgCisweDI0NDIwMDAxLCAweGFlZTIwMDg4LCAweDgwMDJlM2YsIDB4OGVlMjAwODgsIAorMHg4YzQyN2JiMCwgMHg4ZWU0MDBlMCwgMHg4ZWU1MDBlNCwgMHg4ZWU2N2I5YywgCisweDQwMTgyMSwgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzM4MmIsIAorMHg4MjIwMjEsIDB4ODcyMDIxLCAweDhlZTIwNGZjLCAweGM5MzAyMSwgCisweDYzMTAwLCAweGFlZTQwMGUwLCAweGFlZTUwMGU0LCAweGMyMzAyMSwgCisweDk0YzIwMDBhLCAweDI0MGMwMDAyLCAweDIxMTQyLCAweDMwNDMwMDAzLCAKKzB4MTA2YzAwMTYsIDB4Mjg2MjAwMDMsIDB4MTA0MDAwMDUsIDB4MjQwYzAwMDEsIAorMHgxMDZjMDAwOCwgMHgwLCAweDgwMDJlM2YsIDB4MCwgCisweDI0MGMwMDAzLCAweDEwNmMwMDE3LCAweDAsIDB4ODAwMmUzZiwgCisweDAsIDB4OGVlMjAwZTgsIDB4OGVlMzAwZWMsIDB4MjQ2MzAwMDEsIAorMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZTgsIDB4YWVlMzAwZWMsIAorMHg4ZWUyMDBlOCwgMHg4MDAyZTNmLCAweDhlZTMwMGVjLCAweDhlZTIwMGYwLCAKKzB4OGVlMzAwZjQsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLCAKKzB4YWVlMjAwZjAsIDB4YWVlMzAwZjQsIDB4OGVlMjAwZjAsIDB4ODAwMmUzZiwgCisweDhlZTMwMGY0LCAweDhlZTIwMGY4LCAweDhlZTMwMGZjLCAweDI0NjMwMDAxLCAKKzB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFlZTIwMGY4LCAweGFlZTMwMGZjLCAKKzB4OGVlMjAwZjgsIDB4OGVlMzAwZmMsIDB4OGVlMjdiYTgsIDB4MjUyOTAwMDEsIAorMHgxMjIxMDJiLCAweDE0NDBmZmEwLCAweDI1NGEwMDA4LCAweGEyZTA3Yjk4LCAKKzB4ODAwMmU5ZiwgMHhhZWUwN2JhOCwgMHg4ZjgyMDBmMCwgMHgyNDQ3MDAwOCwgCisweDI3NjIxODAwLCAweGUyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY3MTAwMCwgCisweDhmODIwMGY0LCAweDE0ZTIwMDA3LCAweDAsIDB4OGVlMjAxYjQsIAorMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWI0LCAweDgwMDJlNWQsIAorMHg4ZWUyMDFiNCwgMHg4ZjgyMDBmMCwgMHgyNDEwMDAwMSwgMHg4ZmEzMDAxOCwgCisweDhmYTQwMDFjLCAweGFjNDMwMDAwLCAweGFjNDQwMDA0LCAweGFmODcwMGYwLCAKKzB4MTYwMDAwMDcsIDB4MCwgMHg4ZWUyMDA4OCwgMHgyNDQyMDAwMSwgCisweGFlZTIwMDg4LCAweDhlZTIwMDg4LCAweDgwMDJlYTAsIDB4YWVlMDcyNWMsIAorMHg4ZWUyNzI1YywgMHg4ZWU0MDBlMCwgMHg4ZWU1MDBlNCwgMHgyNDBjMDAwMiwgCisweDQwMTgyMSwgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIAorMHg4MjIwMjEsIDB4ODYyMDIxLCAweDE2MTE0MiwgMHgzMDQzMDAwMywgCisweGFlZTQwMGUwLCAweGFlZTUwMGU0LCAweDEwNmMwMDE3LCAweDJjNjIwMDAzLCAKKzB4MTA0MDAwMDUsIDB4MjQwYzAwMDEsIDB4MTA2YzAwMDgsIDB4MCwgCisweDgwMDJlYTAsIDB4YWVlMDcyNWMsIDB4MjQwYzAwMDMsIDB4MTA2YzAwMTksIAorMHgwLCAweDgwMDJlYTAsIDB4YWVlMDcyNWMsIDB4OGVlMjAwZTgsIAorMHg4ZWUzMDBlYywgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIAorMHhhZWUyMDBlOCwgMHhhZWUzMDBlYywgMHg4ZWUyMDBlOCwgMHg4ZWUzMDBlYywgCisweDgwMDJlYTAsIDB4YWVlMDcyNWMsIDB4OGVlMjAwZjAsIDB4OGVlMzAwZjQsIAorMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZjAsIAorMHhhZWUzMDBmNCwgMHg4ZWUyMDBmMCwgMHg4ZWUzMDBmNCwgMHg4MDAyZWEwLCAKKzB4YWVlMDcyNWMsIDB4OGVlMjAwZjgsIDB4OGVlMzAwZmMsIDB4MjQ2MzAwMDEsIAorMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZjgsIDB4YWVlMzAwZmMsIAorMHg4ZWUyMDBmOCwgMHg4ZWUzMDBmYywgMHhhZWUwNzI1YywgMHg4ZTYyMDAxYywgCisweDk2ZTMwNDU4LCAweDhlZTQwNGYwLCAweDI0NDIwMDAxLCAweDI0NjNmZmZmLCAKKzB4NDMxMDI0LCAweDI0ODQwMDAxLCAweGFlZTIwNGU0LCAweGFlZTQwNGYwLCAKKzB4OGY0MjAyM2MsIDB4ODIyMDJiLCAweDE0ODAwMGIwLCAweDAsIAorMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIAorMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgCisweDAsIDB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwgCisweDhlZTIwMWE0LCAweDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIAorMHg4MDAyZjA3LCAweDhlZTIwMWE0LCAweDhlZTIwNGU0LCAweGFjNjIwMDFjLCAKKzB4OGVlNDA0YjAsIDB4OGVlNTA0YjQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIAorMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwgMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwgCisweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLCAKKzB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MzAwMDAsIDB4MjQwMjAwMTIsIDB4MTQ2MjAwMWYsIDB4MCwgCisweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MGMwMDQwLCAKKzB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIAorMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywgMHgwLCAKKzB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgCisweDgwMDJlZjEsIDB4MCwgMHgxNDYwMDAwNSwgMHgwLCAKKzB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIAorMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgCisweDgwMDJmMDcsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDBjMDA0MCwgCisweDI0NDIwMDAxLCAweDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIAorMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMTIsIDB4MjQwYzAwMDEsIAorMHhhYzgyMDAwMCwgMHhhYzhjMDAwNCwgMHg1NjAwMDAwZCwgMHgyNDEwMDAwMSwgCisweDhlZTIwNGU0LCAweDNjMDQwMDAxLCAweDI0ODQ1NzU0LCAweGFmYTAwMDE0LCAKKzB4YWZhMjAwMTAsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIAorMHgzNGE1ZjAwNiwgMHhjMDAyNDAzLCAweGFmYWIwMDM4LCAweDhmYWIwMDM4LCAKKzB4MTYwMDAwMDMsIDB4MjQwYzAwMDEsIDB4ODAwMmY1YywgMHhhMmVjMDRmNCwgCisweDhlZTIwMTcwLCAweDI0NDIwMDAxLCAweGFlZTIwMTcwLCAweDhlZTIwMTcwLCAKKzB4OGVlMjA0ZTQsIDB4YTJlMDA0ZjQsIDB4YWVlMDA0ZjAsIDB4YWVlMDcyNzQsIAorMHhhZWUyMDRmOCwgMHg4ZjQyMDIzYywgMHgxMDQwMDAzOCwgMHgwLCAKKzB4OGVlMjAxODQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxODQsIDB4ODAwMmY1YywgCisweDhlZTIwMTg0LCAweDhlZTIwNTA0LCAweDI0MGMwMDQwLCAweDI0NDIwMDAxLCAKKzB4NTA0YzAwMDMsIDB4MTAyMSwgMHg4ZWUyMDUwNCwgMHgyNDQyMDAwMSwgCisweGFlZTIwNTA0LCAweDhlZTIwNTA0LCAweDhlNjMwMDE4LCAweDI0MGMwMDAzLCAKKzB4MjEwODAsIDB4NTcxMDIxLCAweDE0NmMwMDBmLCAweDhjNDQwNTA4LCAKKzB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IxLCAweDEwNDAwMDE0LCAKKzB4MCwgMHg4ZWUyMDFkMCwgMHg4ZWUzNTI0MCwgMHg0NDEwMjEsIAorMHhhZWUyMDFkMCwgMHg4ZWUyMDFkOCwgMHg2NDE4MjEsIDB4MzA2MzAwZmYsIAorMHg4MDAyZjRmLCAweGFlZTM1MjQwLCAweDhlZTIwMWNjLCAweDhlZTMwZTEwLCAKKzB4NDQxMDIxLCAweGFlZTIwMWNjLCAweDhlZTIwMWQ4LCAweDY0MTgyMSwgCisweDMwNjMwMWZmLCAweGFlZTMwZTEwLCAweDQ0MTAyMSwgMHhhZWUyMDFkOCwgCisweDhlZTIwMDAwLCAweDM0NDIwMDQwLCAweDgwMDJmNWMsIDB4YWVlMjAwMDAsIAorMHg4ZWUyMDE0YywgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzZTAsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDE0YywgMHg4ZWUyMDE0YywgMHg4ZjgyMDEwOCwgCisweDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDhmODIwMTA4LCAKKzB4Mjc2MzMwMDAsIDB4NDMxMDJiLCAweDE0NDAwMDAyLCAweDI3NjIyODAwLCAKKzB4YWY4MjAxMDgsIDB4OGY4MzAxMDgsIDB4OGY4MjAxMDQsIDB4MTQ2MmZjMWUsIAorMHgwLCAweDhmYmYwMDYwLCAweDhmYmUwMDVjLCAweDhmYjYwMDU4LCAKKzB4OGZiNTAwNTQsIDB4OGZiNDAwNTAsIDB4OGZiMzAwNGMsIDB4OGZiMjAwNDgsIAorMHg4ZmIxMDA0NCwgMHg4ZmIwMDA0MCwgMHgzZTAwMDA4LCAweDI3YmQwMDY4LCAKKzB4NTI4NDMsIDB4MTBhMDAwMGQsIDB4MzAyMSwgMHgzYzAzMDAwMSwgCisweDM0NjMzODAwLCAweDNjMDdmZmZmLCAweDM2MzEwMjEsIDB4ODIxMDJiLCAKKzB4NTA0MDAwMDEsIDB4ODcyMDIxLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLCAKKzB4MjRhNWZmZmYsIDB4MTRhMGZmZjgsIDB4YzIzMDIxLCAweDYxYzAyLCAKKzB4MzBjMmZmZmYsIDB4NjIzMDIxLCAweDYxYzAyLCAweDMwYzJmZmZmLCAKKzB4NjIzMDIxLCAweDNlMDAwMDgsIDB4MzBjMmZmZmYsIDB4MjdiZGZmODgsIAorMHgyNDBmMDAwMSwgMHhhZmJmMDA3MCwgMHhhZmJlMDA2YywgMHhhZmI2MDA2OCwgCisweGFmYjUwMDY0LCAweGFmYjQwMDYwLCAweGFmYjMwMDVjLCAweGFmYjIwMDU4LCAKKzB4YWZiMTAwNTQsIDB4YWZiMDAwNTAsIDB4YTNhMDAwMjcsIDB4YWZhZjAwMmMsIAorMHg4ZWUyMDRkNCwgMHg4MDIxLCAweDMwNDIwMDAxLCAweDE0NDAwMDJhLCAKKzB4YTNhMDAwMzcsIDB4OGY4NzAwZTAsIDB4OGY4ODAwYzQsIDB4OGY4MjAwZTgsIAorMHhlMjIwMjMsIDB4MmM4MjEwMDAsIDB4NTA0MDAwMDEsIDB4MjQ4NDEwMDAsIAorMHg0MjBjMiwgMHg4MDE4MjEsIDB4OGVlNDAwYzgsIDB4OGVlNTAwY2MsIAorMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAKKzB4ODYyMDIxLCAweGFlZTQwMGM4LCAweGFlZTUwMGNjLCAweDhmODMwMGM4LCAKKzB4M2MwMjAwMGEsIDB4MzQ0MmVmZmYsIDB4MTAzMjAyMywgMHg0NDEwMmIsIAorMHgxMDQwMDAwMywgMHgzYzAyMDAwYSwgMHgzNDQyZjAwMCwgMHg4MjIwMjEsIAorMHg4MDE4MjEsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4MTAyMSwgCisweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwgCisweGFlZTQwMGMwLCAweGFlZTUwMGM0LCAweGFmODgwMGM4LCAweGFmODcwMGU0LCAKKzB4ODAwMzRjYywgMHhhZjg3MDBlOCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg5MDQyODNjMCwgMHgxMDQwMDAwYiwgMHgwLCAweDNjMTQwMDAxLCAKKzB4Mjk3YTAyMSwgMHg4ZTk0ODNjNCwgMHgzYzEzMDAwMSwgMHgyNzc5ODIxLCAKKzB4OGU3MzgzYzgsIDB4M2MxMjAwMDEsIDB4MjU3OTAyMSwgMHg4MDAzMTkzLCAKKzB4OGU1MjgzY2MsIDB4OGY4MzAwZTAsIDB4OGY4MjAwZTQsIDB4MTA0MzAwMDcsIAorMHg4ODIxLCAweDhmODIwMGU0LCAweDI0MTEwMDAxLCAweDhjNDMwMDAwLCAKKzB4OGM0NDAwMDQsIDB4YWZhMzAwMTgsIDB4YWZhNDAwMWMsIDB4MTYyMDAwMGUsIAorMHgzYzAyZmZmZiwgMHg4ZjgyMDBjNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDBjOCwgCisweDNjMDQwMDAxLCAweDI0ODQ1ODcwLCAweGFmYTIwMDE0LCAweDhmODYwMGUwLCAKKzB4OGY4NzAwZTQsIDB4M2MwNTAwMDYsIDB4YzAwMjQwMywgMHgzNGE1ZjAwMCwgCisweDgwMDM0Y2MsIDB4MCwgMHg4ZmEzMDAxYywgMHg4ZmIyMDAxOCwgCisweDMwNzRmZmZmLCAweDI2OTRmZmZjLCAweDYyMTAyNCwgMHgxMDQwMDA1OCwgCisweDI0MDk4MjEsIDB4M2MwMjAwODAsIDB4NjIxMDI0LCAweDEwNDAwMDBhLCAKKzB4M2MwNDAwNDAsIDB4OGVlMjAwN2MsIDB4MjQ0MjAwMDEsIDB4YWVlMjAwN2MsIAorMHg4ZWUyMDA3YywgMHg4ZWUyMDFmYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFmYywgCisweDgwMDM0YzYsIDB4OGVlMjAxZmMsIDB4M2MwNjAwMDQsIDB4M2MwYjAwMDEsIAorMHgzYzBhMDAwMiwgMHgzYzA1MDAxMCwgMHgzYzA5MDAwOCwgMHg4ZWUyMDA4MCwgCisweDNjMDgwMDIwLCAweDM0MDc4MDAwLCAweDI0NDIwMDAxLCAweGFlZTIwMDgwLCAKKzB4OGVlMjAwODAsIDB4OGZhMjAwMWMsIDB4NDQxODI0LCAweDEwNjYwMDIxLCAKKzB4YzMxMDJiLCAweDE0NDAwMDA3LCAweDAsIDB4MTA2YjAwMTEsIAorMHgwLCAweDEwNmEwMDE1LCAweDAsIDB4ODAwMzA0OSwgCisweDQyMDQyLCAweDEwNjUwMDIzLCAweGEzMTAyYiwgMHgxNDQwMDAwNSwgCisweDAsIDB4MTA2OTAwMTksIDB4MCwgMHg4MDAzMDQ5LCAKKzB4NDIwNDIsIDB4MTA2ODAwMjEsIDB4MCwgMHg4MDAzMDQ5LCAKKzB4NDIwNDIsIDB4OGVlMjAwMzQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAwMzQsIAorMHg4ZWUyMDAzNCwgMHg4MDAzMDQ5LCAweDQyMDQyLCAweDhlZTIwMWVjLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxZWMsIDB4OGVlMjAxZWMsIDB4ODAwMzA0OSwgCisweDQyMDQyLCAweDhlZTIwMWYwLCAweDI0NDIwMDAxLCAweGFlZTIwMWYwLCAKKzB4OGVlMjAxZjAsIDB4ODAwMzA0OSwgMHg0MjA0MiwgMHg4ZWUyMDFmNCwgCisweDI0NDIwMDAxLCAweGFlZTIwMWY0LCAweDhlZTIwMWY0LCAweDgwMDMwNDksIAorMHg0MjA0MiwgMHg4ZWUyMDAzMCwgMHgyNDQyMDAwMSwgMHhhZWUyMDAzMCwgCisweDhlZTIwMDMwLCAweDgwMDMwNDksIDB4NDIwNDIsIDB4OGVlMjAxZjgsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFmOCwgMHg4ZWUyMDFmOCwgMHg0MjA0MiwgCisweDEwODcwNDdjLCAweDAsIDB4ODAwMzAwZSwgMHgwLCAKKzB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IyLCAweDE0NDAwMDg0LCAKKzB4MjQwMjAwMDEsIDB4M2MwMzAwMDEsIDB4NzcxODIxLCAweDkwNjM4M2IzLCAKKzB4MTQ2MjAwN2YsIDB4M2MwMjAxMDAsIDB4OGU0MzAwMDAsIDB4NjIxMDI0LCAKKzB4MTA0MDAwNmYsIDB4MjQwMmZmZmYsIDB4MTQ2MjAwMDUsIDB4MjQxMDAwMDEsIAorMHg5NjQzMDAwNCwgMHgzNDAyZmZmZiwgMHgxMDYyMDA3NSwgMHgwLCAKKzB4OTJlMjA0ZDgsIDB4MTQ0MDAwNzIsIDB4MCwgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg4YzQyODNiNCwgMHgyODQyMDAwNSwgMHgxMDQwMDAyMCwgCisweDM4MjEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LCAKKzB4MTg0MDAwMTYsIDB4MjgyMSwgMHg5NjY2MDAwMCwgMHg1MjBjMCwgCisweDk3MTAyMSwgMHg5NDQyNzc3ZSwgMHgxNDQ2MDAwOSwgMHg5NzEwMjEsIAorMHg5NDQzNzc4MCwgMHg5NjYyMDAwMiwgMHgxNDYyMDAwNSwgMHg5NzEwMjEsIAorMHg5NDQzNzc4MiwgMHg5NjYyMDAwNCwgMHg1MDYyMDAwOCwgMHgyNDA3MDAwMSwgCisweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgMHgyNGE1MDAwMSwgCisweGEyMTAyYSwgMHg1NDQwZmZlZSwgMHg1MjBjMCwgMHgzMGUyMDBmZiwgCisweDEwNDAwNDQwLCAweDAsIDB4ODAwMzBkNSwgMHgwLCAKKzB4MjQwMjAyMSwgMHhjMDAyMmZlLCAweDI0MDUwMDA2LCAweDMwNDQwMDFmLCAKKzB4NDI4YzAsIDB4MmU1MTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyNDAwMCwgCisweDE0NDAwNDM0LCAweGI3MTAyMSwgMHg5NDQzNzI3ZSwgMHg5NjYyMDAwMCwgCisweDE0NjIwMDBiLCAweDQxOGMwLCAweGI3MTAyMSwgMHg5NDQzNzI4MCwgCisweDk2NjIwMDAyLCAweDE0NjIwMDA2LCAweDQxOGMwLCAweGI3MTAyMSwgCisweDk0NDM3MjgyLCAweDk2NjIwMDA0LCAweDEwNjIwMDM1LCAweDQxOGMwLCAKKzB4MmUzMTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyODAwMCwgMHgxNDQwMDQyMSwgCisweDJlMzEwMjEsIDB4OTQ0YjcyN2MsIDB4OTY2NzAwMDAsIDB4YjI4YzAsIAorMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4ODAwMzBiNywgMHgzMDIxLCAKKzB4NDIwYzAsIDB4MmU0MTAyMSwgMHg5NDQzNzM3YywgMHgyZTQxMDIxLCAKKzB4OTQ0YjczN2MsIDB4MzA2MzgwMDAsIDB4MTQ2MDAwMTAsIDB4YjI4YzAsIAorMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4MTQ0N2ZmZjUsIDB4MTYwMjAyMSwgCisweGI3MTAyMSwgMHg5NDQzNzM4MCwgMHg5NjYyMDAwMiwgMHg1NDYyZmZmMSwgCisweDQyMGMwLCAweGI3MTAyMSwgMHg5NDQzNzM4MiwgMHg5NjYyMDAwNCwgCisweDU0NjJmZmVjLCAweDQyMGMwLCAweDI0MDYwMDAxLCAweDMwYzIwMGZmLCAKKzB4MTA0MDA0MDAsIDB4MCwgMHg4MDAzMGQ1LCAweDAsIAorMHg5NzQzMDIwMiwgMHg5NjQyMDAwMCwgMHgxNDYyMDNmYSwgMHgwLCAKKzB4OTc0MzAyMDQsIDB4OTY0MjAwMDIsIDB4MTQ2MjAzZjYsIDB4MCwgCisweDk3NDMwMjA2LCAweDk2NDIwMDA0LCAweDE0NjIwM2YyLCAweDAsIAorMHg5MjQyMDAwMCwgMHgzYTAzMDAwMSwgMHgzMDQyMDAwMSwgMHg0MzEwMjQsIAorMHgxMDQwMDA3NCwgMHgyNDAyZmZmZiwgMHg4ZTYzMDAwMCwgMHgxNDYyMDAwNCwgCisweDM0MDJmZmZmLCAweDk2NjMwMDA0LCAweDEwNjIwMDZmLCAweDI0MGYwMDAyLCAKKzB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IyLCAweDE0NDAwMDZhLCAKKzB4MjQwZjAwMDMsIDB4OTJlMjA0ZDgsIDB4NTQ0MDAwNjgsIDB4YWZhZjAwMmMsIAorMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsIDB4Mjg0MjAwMDUsIAorMHgxMDQwMDAyMCwgMHgzODIxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgCisweDhjNDI4M2I0LCAweDE4NDAwMDE2LCAweDI4MjEsIDB4OTY2NjAwMDAsIAorMHg1MjBjMCwgMHg5NzEwMjEsIDB4OTQ0Mjc3N2UsIDB4MTQ0NjAwMDksIAorMHg5NzEwMjEsIDB4OTQ0Mzc3ODAsIDB4OTY2MjAwMDIsIDB4MTQ2MjAwMDUsIAorMHg5NzEwMjEsIDB4OTQ0Mzc3ODIsIDB4OTY2MjAwMDQsIDB4NTA2MjAwMDgsIAorMHgyNDA3MDAwMSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsIAorMHgyNGE1MDAwMSwgMHhhMjEwMmEsIDB4NTQ0MGZmZWUsIDB4NTIwYzAsIAorMHgzMGUyMDBmZiwgMHgxNDQwMDA0NCwgMHgyNDBmMDAwMywgMHg4MDAzNGM2LCAKKzB4MCwgMHgyNDAyMDIxLCAweGMwMDIyZmUsIDB4MjQwNTAwMDYsIAorMHgzMDQ0MDAxZiwgMHg0MjhjMCwgMHgyZTUxMDIxLCAweDk0NDI3MjdjLCAKKzB4MzA0MjQwMDAsIDB4MTQ0MDAzYWYsIDB4YjcxMDIxLCAweDk0NDM3MjdlLCAKKzB4OTY2MjAwMDAsIDB4MTQ2MjAwMGIsIDB4NDE4YzAsIDB4YjcxMDIxLCAKKzB4OTQ0MzcyODAsIDB4OTY2MjAwMDIsIDB4MTQ2MjAwMDYsIDB4NDE4YzAsIAorMHhiNzEwMjEsIDB4OTQ0MzcyODIsIDB4OTY2MjAwMDQsIDB4MTA2MjAwMjcsIAorMHg0MThjMCwgMHgyZTMxMDIxLCAweDk0NDI3MjdjLCAweDMwNDI4MDAwLCAKKzB4MTQ0MDAzOWMsIDB4MmUzMTAyMSwgMHg5NDRiNzI3YywgMHg5NjY3MDAwMCwgCisweGIyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHg4MDAzMTNjLCAKKzB4MzAyMSwgMHg0MjBjMCwgMHgyZTQxMDIxLCAweDk0NDM3MzdjLCAKKzB4MmU0MTAyMSwgMHg5NDRiNzM3YywgMHgzMDYzODAwMCwgMHgxNDYwMDAxMCwgCisweGIyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHgxNDQ3ZmZmNSwgCisweDE2MDIwMjEsIDB4YjcxMDIxLCAweDk0NDM3MzgwLCAweDk2NjIwMDAyLCAKKzB4NTQ2MmZmZjEsIDB4NDIwYzAsIDB4YjcxMDIxLCAweDk0NDM3MzgyLCAKKzB4OTY2MjAwMDQsIDB4NTQ2MmZmZWMsIDB4NDIwYzAsIDB4MjQwNjAwMDEsIAorMHgzMGMyMDBmZiwgMHgxMDQwMDM3YiwgMHgwLCAweDgwMDMxNGYsIAorMHgyNDBmMDAwMywgMHgyNDBmMDAwMSwgMHhhZmFmMDAyYywgMHg4ZjQyMDI2MCwgCisweDU0MTAyYiwgMHgxMDQwMDAzYSwgMHgwLCAweDhmODMwMGU0LCAKKzB4OGY4MjAwZTAsIDB4MTA2MjAwMDMsIDB4MjQ2MzAwMDgsIDB4YWY4MzAwZTQsIAorMHhhZjgzMDBlOCwgMHg4ZWU0MDBjMCwgMHg4ZWU1MDBjNCwgMHgyODAxODIxLCAKKzB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwgCisweDg2MjAyMSwgMHhhZWU0MDBjMCwgMHhhZWU1MDBjNCwgMHg4ZWUyMDA1OCwgCisweDI0NDIwMDAxLCAweGFlZTIwMDU4LCAweDhlZTIwMDU4LCAweDhlZTIwMDdjLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAwN2MsIDB4OGVlMjAwN2MsIDB4OGY4MjAwZTAsIAorMHhhZmEyMDAxMCwgMHg4ZjgyMDBlNCwgMHgzYzA0MDAwMSwgMHgyNDg0NTg3OCwgCisweGFmYTIwMDE0LCAweDhmYTYwMDE4LCAweDhmYTcwMDFjLCAweDNjMDUwMDA2LCAKKzB4YzAwMjQwMywgMHgzNGE1ZjAwMywgMHg4MDAzNGNjLCAweDAsIAorMHg4ZWUyNTI0MCwgMHhhZmEyMDAxMCwgMHg4ZWUyNTI0NCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1ODg0LCAweGFmYTIwMDE0LCAweDhlZTYwZTEwLCAweDhlZTcwZTE4LCAKKzB4M2MwNTAwMDYsIDB4YzAwMjQwMywgMHgzNGE1ZjAwMiwgMHg4ZWUyMDFjMCwgCisweDI0NDIwMDAxLCAweGFlZTIwMWMwLCAweDhlZTIwMDAwLCAweDhlZTMwMWMwLCAKKzB4MjQwM2ZmYmYsIDB4NDMxMDI0LCAweDgwMDM0NzAsIDB4YWVlMjAwMDAsIAorMHg5NmUyMDQ2OCwgMHg1NDEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgCisweDI0MGYwMDAxLCAweGEzYWYwMDI3LCAweDEyODAwMzAxLCAweDI0MTYwMDA3LCAKKzB4MjQxNTAwNDAsIDB4MjQxZTAwMDEsIDB4MjQwZTAwMTIsIDB4OGVlMjcyNGMsIAorMHg4ZjQzMDI4MCwgMHgyNDQyMDAwMSwgMHgzMDQyMDdmZiwgMHgxMDYyMDJkMywgCisweDAsIDB4OTNhMjAwMjcsIDB4MTA0MDAwMTQsIDB4MCwgCisweDhlZTM1MjQwLCAweDhlZTI1MjQ0LCAweDEwNjIwMDA5LCAweDI2ZWQ1MjQ0LCAKKzB4OGVlNjUyNDQsIDB4OGVlMzUyNDQsIDB4MjExNDAsIDB4MjQ0MjUyNDgsIAorMHgyZTI4MDIxLCAweDI0NjMwMDAxLCAweDgwMDMxYmYsIDB4MzA2YjAwZmYsIAorMHg5MmUyNzI0OCwgMHgxNDQwZmZjYSwgMHgwLCAweDhlZTIwMWUwLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxZTAsIDB4OGVlMjAxZTAsIDB4OGVlMzBlMTAsIAorMHg4ZWUyMGUxOCwgMHgxMDYyZmZjMiwgMHgyNmVkMGUxOCwgMHg4ZWU2MGUxOCwgCisweDhlZTMwZTE4LCAweDIxMTQwLCAweDI0NDIwZTIwLCAweDJlMjgwMjEsIAorMHgyNDYzMDAwMSwgMHgzMDZiMDFmZiwgMHg5NmUyMDQ2YSwgMHgzMDQyMDAxMCwgCisweDEwNDAwMDE5LCAweDAsIDB4OTY0MjAwMGMsIDB4MzQwZjgxMDAsIAorMHgxNDRmMDAxNSwgMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgCisweDkwNDI4M2MwLCAweDE0NDAwMDEwLCAweDAsIDB4OTY0MjAwMGUsIAorMHhhNjAyMDAxNiwgMHg4ZTQyMDAwOCwgMHg4ZTQzMDAwNCwgMHg4ZTQ0MDAwMCwgCisweDI2OTRmZmZjLCAweGFlNDIwMDBjLCAweGFlNDMwMDA4LCAweGFlNDQwMDA0LCAKKzB4OTYwMjAwMGUsIDB4MjY3MzAwMDQsIDB4MjQwZjAwMDEsIDB4YTNhZjAwMzcsIAorMHgzNDQyMDIwMCwgMHhhNjAyMDAwZSwgMHg4ZTAyMDAwMCwgMHg4ZTAzMDAwNCwgCisweDNjMDQwMDAxLCAweDM0ODQzODAwLCAweDMwNmEwMDA3LCAweDI2YTk4MjMsIAorMHgzNjQxMDIxLCAweDI2MjEwMmIsIDB4MTA0MDAwMDUsIDB4MjhhYTAyMSwgCisweDI2NDEwMjMsIDB4MzYyMTgyMywgMHgzYzAyMDAyMCwgMHg0Mzk4MjMsIAorMHgyNjgyMDAwNywgMHgyNDA0ZmZmOCwgMHg5NjAzMDAwYSwgMHg0NDYwMjQsIAorMHg2YTE4MjEsIDB4NmMxMDJiLCAweDEwNDAwMDAyLCAweDE4MDM4MjEsIAorMHg2MDM4MjEsIDB4YWUxMzAwMTgsIDB4OGY4ODAxMjAsIDB4MjRlMjAwMDcsIAorMHg0NDM4MjQsIDB4Mjc2MjM4MDAsIDB4MjUwOTAwMjAsIDB4MTIyMTAyYiwgCisweDUwNDAwMDAxLCAweDI3NjkzMDAwLCAweDhmODIwMTI4LCAweDExMjIwMDA0LCAKKzB4MCwgMHg4ZjgyMDEyNCwgMHgxNTIyMDAwNywgMHgxNDAxODIxLCAKKzB4OGVlMjAxYTQsIDB4ODgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgCisweDgwMDMyNGMsIDB4OGVlMjAxYTQsIDB4OGUwNDAwMDAsIDB4OGUwNTAwMDQsIAorMHgxMDIxLCAweGFkMTMwMDA4LCAweGE1MDcwMDBlLCAweGFkMTYwMDE4LCAKKzB4YWQwNjAwMWMsIDB4YTMzMDJiLCAweGEzMjgyMywgMHg4MjIwMjMsIAorMHg4NjIwMjMsIDB4YWQwNDAwMDAsIDB4YWQwNTAwMDQsIDB4OGVlMjA0YzAsIAorMHhhZDAyMDAxMCwgMHhhZjg5MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgCisweDI0MTEwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDU2MDAxZiwgMHgwLCAKKzB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgCisweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAKKzB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA1NTAwMDcsIDB4MCwgCisweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIAorMHg4MDAzMjM5LCAweDAsIDB4MTQ2MDAwMDUsIDB4MCwgCisweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAKKzB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIAorMHg4MDAzMjRjLCAweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIAorMHg1MDU1MDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIAorMHgyZTIyMDIxLCAweGFjOTYwMDAwLCAweGFjOWUwMDA0LCAweDE2MjAwMDE4LCAKKzB4M2MwNTAwMDYsIDB4OGUwMjAwMTgsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4OTAsIAorMHhhZmEyMDAxMCwgMHg4ZTAyMDAwMCwgMHg4ZTAzMDAwNCwgMHgzNGE1ZjAwOSwgCisweDIwMDMwMjEsIDB4YzAwMjQwMywgMHhhZmEzMDAxNCwgMHg5M2EyMDAzNywgCisweDEwNDAwMjE2LCAweDM0MGY4MTAwLCAweDhlNDIwMDA0LCAweDhlNDMwMDA4LCAKKzB4OGU0NDAwMGMsIDB4YTY0ZjAwMGMsIDB4YWU0MjAwMDAsIDB4YWU0MzAwMDQsIAorMHhhZTQ0MDAwOCwgMHg5NjAyMDAxNiwgMHg4MDAzNDcwLCAweGE2NDIwMDBlLCAKKzB4MTRlYzAxNjgsIDB4MjhhMTgyMywgMHg5NjBjMDAwYSwgMHg5NjAzMDAwZSwgCisweDI4YTEwMjMsIDB4YTYwMjAwMGEsIDB4MzQ2MjAwMDQsIDB4YTYwMjAwMGUsIAorMHg4Zjg4MDEyMCwgMHgyNzYyMzgwMCwgMHgyNTA5MDAyMCwgMHgxMjIxMDJiLCAKKzB4MTQ0MDAwMDIsIDB4MzA2YWZmZmYsIDB4Mjc2OTMwMDAsIDB4OGY4MjAxMjgsIAorMHgxMTIyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE1MjIwMDA3LCAKKzB4MjQwNDAwMjAsIDB4OGVlMjAxYTQsIDB4ODgyMSwgMHgyNDQyMDAwMSwgCisweGFlZTIwMWE0LCAweDgwMDMyY2EsIDB4OGVlMjAxYTQsIDB4OGVlNTcyNGMsIAorMHg4ZWU2MDQ5MCwgMHg4ZWU3MDQ5NCwgMHhhNTA0MDAwZSwgMHgyNDA0MDAwNCwgCisweGFkMTAwMDA4LCAweGFkMDQwMDE4LCAweDUyOTQwLCAweGEwMTgyMSwgCisweDEwMjEsIDB4ZTMzODIxLCAweGUzMjAyYiwgMHhjMjMwMjEsIAorMHhjNDMwMjEsIDB4YWQwNjAwMDAsIDB4YWQwNzAwMDQsIDB4OGVlMjcyNGMsIAorMHhhZDAyMDAxYywgMHg4ZWUyMDRjNCwgMHhhZDAyMDAxMCwgMHhhZjg5MDEyMCwgCisweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAweDI0MTEwMDAxLCAweDhlZTI0ZTMwLCAKKzB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgCisweDE0NTYwMDFmLCAweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIAorMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAKKzB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIAorMHgxMDU1MDAwNywgMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAKKzB4MTA2MjAwMDUsIDB4MCwgMHg4MDAzMmI3LCAweDAsIAorMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAKKzB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIAorMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgMHg4MDAzMmNhLCAweDAsIAorMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDU1MDAwMywgMHgxMDIxLCAKKzB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIAorMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweGFjOTYwMDAwLCAKKzB4YWM5ZTAwMDQsIDB4MTYyMDAwMGQsIDB4MCwgMHhhNjBjMDAwYSwgCisweGE2MGEwMDBlLCAweDhmODIwMTAwLCAweGFmYTIwMDEwLCAweDhmODIwMTA0LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDU4OWMsIDB4M2MwNTAwMDYsIDB4YWZhMjAwMTQsIAorMHg4ZWU2NzI0YywgMHg4MDAzNDNiLCAweDM0YTVmMDBiLCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweGEwMjA4M2MwLCAweGFkYWIwMDAwLCAweDhlZTIwMWQ4LCAKKzB4OGVlMzcyNGMsIDB4MjQ0MmZmZmYsIDB4YWVlMjAxZDgsIDB4OGVlMjAxZDgsIAorMHgyNDYzMDAwMSwgMHgzMDYzMDdmZiwgMHgyNmUyNTI0NCwgMHgxNWEyMDAwNiwgCisweGFlZTM3MjRjLCAweDhlZTIwMWQwLCAweDI0NDJmZmZmLCAweGFlZTIwMWQwLCAKKzB4ODAwMzJlZiwgMHg4ZWUyMDFkMCwgMHg4ZWUyMDFjYywgMHgyNDQyZmZmZiwgCisweGFlZTIwMWNjLCAweDhlZTIwMWNjLCAweDhmNDIwMjQwLCAweDEwNDAwMDczLCAKKzB4MCwgMHg4ZWUyMGUxYywgMHgyNDQyMDAwMSwgMHhhZWUyMGUxYywgCisweDhmNDMwMjQwLCAweDQzMTAyYiwgMHgxNDQwMDE3NiwgMHhhMDIxLCAKKzB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAKKzB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIAorMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsIAorMHg4ZWUyMDFhNCwgMHg4ODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAKKzB4ODAwMzM0ZiwgMHg4ZWUyMDFhNCwgMHg4ZWUyNzI0YywgMHhhYzYyMDAxYywgCisweDhlZTQwNGE4LCAweDhlZTUwNGFjLCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAKKzB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIAorMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgCisweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAweDI0MTEwMDAxLCAKKzB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgCisweDhjODIwMDAwLCAweDE0NGUwMDFmLCAweDAsIDB4OGVlMzRlMzAsIAorMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LCAKKzB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIAorMHgyNDQyMDAwMSwgMHgxMDU1MDAwNywgMHgwLCAweDhlZTI0ZTM0LCAKKzB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDAzMzNjLCAKKzB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAKKzB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIAorMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgMHg4MDAzMzRmLCAKKzB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDU1MDAwMywgCisweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4YWM4ZTAwMDAsIDB4YWM5ZTAwMDQsIDB4NTYyMDAwMGQsIDB4MjQxMTAwMDEsIAorMHg4ZWUyNzI0YywgMHgzYzA0MDAwMSwgMHgyNDg0NThhOCwgMHhhZmEwMDAxNCwgCisweGFmYTIwMDEwLCAweDhlZTY3MjRjLCAweDhmNDcwMjgwLCAweDNjMDUwMDA5LCAKKzB4MzRhNWYwMDgsIDB4YzAwMjQwMywgMHhhZmFlMDA0OCwgMHg4ZmFlMDA0OCwgCisweDU2MjAwMDAxLCAweGFlZTAwZTFjLCAweDhlZTIwMTg4LCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxODgsIDB4ODAwMzNjOCwgMHg4ZWUyMDE4OCwgMHg4ZjgzMDEyMCwgCisweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgCisweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIAorMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAKKzB4ODgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAzM2JhLCAKKzB4OGVlMjAxYTQsIDB4OGVlMjcyNGMsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTgsIAorMHg4ZWU1MDRhYywgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgCisweGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLCAKKzB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIAorMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgMHgyNDExMDAwMSwgMHg4ZWUyNGUzMCwgCisweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIAorMHgxNDRlMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAKKzB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgCisweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAKKzB4MTA1NTAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgCisweDEwNjIwMDA1LCAweDAsIDB4ODAwMzNhNywgMHgwLCAKKzB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgCisweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAKKzB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIDB4ODAwMzNiYSwgMHgwLCAKKzB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA1NTAwMDMsIDB4MTAyMSwgCisweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAKKzB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHhhYzhlMDAwMCwgCisweGFjOWUwMDA0LCAweDE2MjAwMDBkLCAweDAsIDB4OGVlMjcyNGMsIAorMHgzYzA0MDAwMSwgMHgyNDg0NThhOCwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgCisweDhlZTY3MjRjLCAweDhmNDcwMjgwLCAweDNjMDUwMDA5LCAweDM0YTVmMDA4LCAKKzB4YzAwMjQwMywgMHhhZmFlMDA0OCwgMHg4ZmFlMDA0OCwgMHg4ZWUyMDE3NCwgCisweDI0NDIwMDAxLCAweGFlZTIwMTc0LCAweDhlZTIwMTc0LCAweDgwMDM0NmUsIAorMHhhMDIxLCAweDk2MGMwMDBhLCAweDE4MzEwMmIsIDB4NTQ0MDAwMDEsIAorMHgxODAxODIxLCAweGE2MDMwMDBhLCAweDhmODgwMTIwLCAweDI3NjIzODAwLCAKKzB4MjUwOTAwMjAsIDB4MTIyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY5MzAwMCwgCisweDhmODIwMTI4LCAweDExMjIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIAorMHgxNTIyMDAwNywgMHgyNDA0MDAyMCwgMHg4ZWUyMDFhNCwgMHg4ODIxLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMzQyZiwgMHg4ZWUyMDFhNCwgCisweDhlZTU3MjRjLCAweDhlZTYwNDkwLCAweDhlZTcwNDk0LCAweGE1MDQwMDBlLCAKKzB4MjQwNDAwMDQsIDB4YWQxMDAwMDgsIDB4YWQwNDAwMTgsIDB4NTI5NDAsIAorMHhhMDE4MjEsIDB4MTAyMSwgMHhlMzM4MjEsIDB4ZTMyMDJiLCAKKzB4YzIzMDIxLCAweGM0MzAyMSwgMHhhZDA2MDAwMCwgMHhhZDA3MDAwNCwgCisweDhlZTI3MjRjLCAweGFkMDIwMDFjLCAweDhlZTIwNGM0LCAweGFkMDIwMDEwLCAKKzB4YWY4OTAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsIDB4MjQxMTAwMDEsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MjAwMDAsIDB4MTQ1NjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgCisweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsIAorMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgCisweDI0NDIwMDAxLCAweDEwNTUwMDA3LCAweDAsIDB4OGVlMjRlMzQsIAorMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDM0MWMsIAorMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgCisweDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLCAweDgwMDM0MmYsIAorMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNTUwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHhhYzk2MDAwMCwgMHhhYzllMDAwNCwgMHgxNjIwMDAxZCwgMHgwLCAKKzB4YTYwYzAwMGEsIDB4OGY4MjAxMDAsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMDQsIAorMHgzYzA0MDAwMSwgMHgyNDg0NTg5YywgMHgzYzA1MDAwNiwgMHhhZmEyMDAxNCwgCisweDhlZTY3MjRjLCAweDM0YTVmMDBkLCAweGMwMDI0MDMsIDB4MjAwMzgyMSwgCisweDkzYTIwMDM3LCAweDEwNDAwMDMxLCAweDM0MGY4MTAwLCAweDhlNDIwMDA0LCAKKzB4OGU0MzAwMDgsIDB4OGU0NDAwMGMsIDB4YTY0ZjAwMGMsIDB4YWU0MjAwMDAsIAorMHhhZTQzMDAwNCwgMHhhZTQ0MDAwOCwgMHg5NjAyMDAxNiwgMHhhNjQyMDAwZSwgCisweDk2MDIwMDBlLCAweDMwNDJmZGZmLCAweDgwMDM0NzAsIDB4YTYwMjAwMGUsIAorMHg4ZWUyMDFkOCwgMHgyNDQyZmZmZiwgMHhhZWUyMDFkOCwgMHg4ZWUyMDFkOCwgCisweDhlZTIwMWNjLCAweDNjMDQwMDFmLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgCisweGEwM2U4M2MwLCAweDI0NDJmZmZmLCAweGFlZTIwMWNjLCAweDk2MDMwMDBhLCAKKzB4MzQ4NGZmZmYsIDB4OGVlMjAxY2MsIDB4NmExODIxLCAweDI2Mzk4MjEsIAorMHg5MzIwMmIsIDB4MTA4MDAwMDMsIDB4M2MwMmZmZjUsIDB4MzQ0MjEwMDAsIAorMHgyNjI5ODIxLCAweGFkYWIwMDAwLCAweDhlZTI3MjRjLCAweDI0NDIwMDAxLCAKKzB4MzA0MjA3ZmYsIDB4YWVlMjcyNGMsIDB4OGY0MjAyNDAsIDB4MTA0MDAwMDQsIAorMHgyODNhMDIzLCAweDhlZTIwZTFjLCAweDI0NDIwMDAxLCAweGFlZTIwZTFjLCAKKzB4YTNhMDAwMjcsIDB4MTY4MGZkMjksIDB4MCwgMHgxMjgwMDAyNCwgCisweDAsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMzQ4M2M0LCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMzM4M2M4LCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweGFjMzI4M2NjLCAweDkzYTIwMDM3LCAweDEwNDAwMDA4LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzY2MsIAorMHgyNDQyMDAwNCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzY2MsIAorMHg4ZWUyNzI0YywgMHg4ZjQzMDI4MCwgMHgyNDQyMDAwMSwgMHgzMDQyMDdmZiwgCisweDE0NjIwMDA2LCAweDAsIDB4OGVlMjAxYzQsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFjNCwgMHg4MDAzNGNjLCAweDhlZTIwMWM0LCAweDhlZTIwMWJjLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYmMsIDB4ODAwMzRjYywgMHg4ZWUyMDFiYywgCisweDk3YTQwMDFlLCAweDI0ODRmZmZjLCAweDgwMTgyMSwgMHg4ZWU0MDBjMCwgCisweDhlZTUwMGM0LCAweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgCisweDgyMjAyMSwgMHg4NjIwMjEsIDB4YWVlNDAwYzAsIDB4YWVlNTAwYzQsIAorMHg4ZmFmMDAyYywgMHgyNDAyMDAwMiwgMHgxMWUyMDAwZiwgMHgyOWUyMDAwMywgCisweDE0NDAwMDE3LCAweDI0MDIwMDAzLCAweDE1ZTIwMDE1LCAweDAsIAorMHg4ZWUyMDBkMCwgMHg4ZWUzMDBkNCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgCisweDQ0MTAyMSwgMHhhZWUyMDBkMCwgMHhhZWUzMDBkNCwgMHg4ZWUyMDBkMCwgCisweDgwMDM0YzYsIDB4OGVlMzAwZDQsIDB4OGVlMjAwZDgsIDB4OGVlMzAwZGMsIAorMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZDgsIAorMHhhZWUzMDBkYywgMHg4ZWUyMDBkOCwgMHg4MDAzNGM2LCAweDhlZTMwMGRjLCAKKzB4OGVlMjAwYzgsIDB4OGVlMzAwY2MsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIAorMHg0NDEwMjEsIDB4YWVlMjAwYzgsIDB4YWVlMzAwY2MsIDB4OGVlMjAwYzgsIAorMHg4ZWUzMDBjYywgMHg4ZjgzMDBlNCwgMHg4ZjgyMDBlMCwgMHgxMDYyMDAwMywgCisweDI0NjMwMDA4LCAweGFmODMwMGU0LCAweGFmODMwMGU4LCAweDhmYmYwMDcwLCAKKzB4OGZiZTAwNmMsIDB4OGZiNjAwNjgsIDB4OGZiNTAwNjQsIDB4OGZiNDAwNjAsIAorMHg4ZmIzMDA1YywgMHg4ZmIyMDA1OCwgMHg4ZmIxMDA1NCwgMHg4ZmIwMDA1MCwgCisweDNlMDAwMDgsIDB4MjdiZDAwNzgsIDB4MjdiZGZmYjAsIDB4YWZiNTAwNDQsIAorMHhhODIxLCAweGFmYjAwMDMwLCAweDgwMjEsIDB4YWZiZjAwNGMsIAorMHhhZmI2MDA0OCwgMHhhZmI0MDA0MCwgMHhhZmIzMDAzYywgMHhhZmIyMDAzOCwgCisweGFmYjEwMDM0LCAweDhlZTIwNGQ0LCAweDI0MTQwMDAxLCAweDMwNDIwMDAxLCAKKzB4MTQ0MDAwMmEsIDB4YjAyMSwgMHg4Zjg3MDBlMCwgMHg4Zjg4MDBjNCwgCisweDhmODIwMGU4LCAweGUyMjAyMywgMHgyYzgyMTAwMCwgMHg1MDQwMDAwMSwgCisweDI0ODQxMDAwLCAweDQyMGMyLCAweDgwMTgyMSwgMHg4ZWU0MDBjOCwgCisweDhlZTUwMGNjLCAweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgCisweDgyMjAyMSwgMHg4NjIwMjEsIDB4YWVlNDAwYzgsIDB4YWVlNTAwY2MsIAorMHg4ZjgzMDBjOCwgMHgzYzAyMDAwYSwgMHgzNDQyZWZmZiwgMHgxMDMyMDIzLCAKKzB4NDQxMDJiLCAweDEwNDAwMDAzLCAweDNjMDIwMDBhLCAweDM0NDJmMDAwLCAKKzB4ODIyMDIxLCAweDgwMTgyMSwgMHg4ZWU0MDBjMCwgMHg4ZWU1MDBjNCwgCisweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIAorMHg4NjIwMjEsIDB4YWVlNDAwYzAsIDB4YWVlNTAwYzQsIDB4YWY4ODAwYzgsIAorMHhhZjg3MDBlNCwgMHg4MDAzODUwLCAweGFmODcwMGU4LCAweDNjMDIwMDAxLCAKKzB4NTcxMDIxLCAweDkwNDI4M2MwLCAweDEwNDAwMDBiLCAweDAsIAorMHgzYzEzMDAwMSwgMHgyNzc5ODIxLCAweDhlNzM4M2M0LCAweDNjMTEwMDAxLCAKKzB4MjM3ODgyMSwgMHg4ZTMxODNjOCwgMHgzYzEyMDAwMSwgMHgyNTc5MDIxLCAKKzB4ODAwMzZlOCwgMHg4ZTUyODNjYywgMHg4ZjgzMDBlMCwgMHg4ZjgyMDBlNCwgCisweDEwNDMwMDA3LCAweDQ4MjEsIDB4OGY4MjAwZTQsIDB4MjQwOTAwMDEsIAorMHg4YzQzMDAwMCwgMHg4YzQ0MDAwNCwgMHhhZmEzMDAxOCwgMHhhZmE0MDAxYywgCisweDE1MjAwMDBlLCAweDNjMDJmZmZmLCAweDhmODIwMGM0LCAweGFmYTIwMDEwLCAKKzB4OGY4MjAwYzgsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4NzAsIDB4YWZhMjAwMTQsIAorMHg4Zjg2MDBlMCwgMHg4Zjg3MDBlNCwgMHgzYzA1MDAwNiwgMHhjMDAyNDAzLCAKKzB4MzRhNWYwMDAsIDB4ODAwMzg1MCwgMHgwLCAweDhmYTMwMDFjLCAKKzB4OGZiMjAwMTgsIDB4MzA3M2ZmZmYsIDB4MjY3M2ZmZmMsIDB4NjIxMDI0LCAKKzB4MTA0MDAwNTgsIDB4MjQwODgyMSwgMHgzYzAyMDA4MCwgMHg2MjEwMjQsIAorMHgxMDQwMDAwYSwgMHgzYzA0MDA0MCwgMHg4ZWUyMDA3YywgMHgyNDQyMDAwMSwgCisweGFlZTIwMDdjLCAweDhlZTIwMDdjLCAweDhlZTIwMWZjLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxZmMsIDB4ODAwMzg0YSwgMHg4ZWUyMDFmYywgMHgzYzA2MDAwNCwgCisweDNjMGIwMDAxLCAweDNjMGEwMDAyLCAweDNjMDUwMDEwLCAweDNjMDkwMDA4LCAKKzB4OGVlMjAwODAsIDB4M2MwODAwMjAsIDB4MzQwNzgwMDAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDA4MCwgMHg4ZWUyMDA4MCwgMHg4ZmEyMDAxYywgMHg0NDE4MjQsIAorMHgxMDY2MDAyMSwgMHhjMzEwMmIsIDB4MTQ0MDAwMDcsIDB4MCwgCisweDEwNmIwMDExLCAweDAsIDB4MTA2YTAwMTUsIDB4MCwgCisweDgwMDM1OTIsIDB4NDIwNDIsIDB4MTA2NTAwMjMsIDB4YTMxMDJiLCAKKzB4MTQ0MDAwMDUsIDB4MCwgMHgxMDY5MDAxOSwgMHgwLCAKKzB4ODAwMzU5MiwgMHg0MjA0MiwgMHgxMDY4MDAyMSwgMHgwLCAKKzB4ODAwMzU5MiwgMHg0MjA0MiwgMHg4ZWUyMDAzNCwgMHgyNDQyMDAwMSwgCisweGFlZTIwMDM0LCAweDhlZTIwMDM0LCAweDgwMDM1OTIsIDB4NDIwNDIsIAorMHg4ZWUyMDFlYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFlYywgMHg4ZWUyMDFlYywgCisweDgwMDM1OTIsIDB4NDIwNDIsIDB4OGVlMjAxZjAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFmMCwgMHg4ZWUyMDFmMCwgMHg4MDAzNTkyLCAweDQyMDQyLCAKKzB4OGVlMjAxZjQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxZjQsIDB4OGVlMjAxZjQsIAorMHg4MDAzNTkyLCAweDQyMDQyLCAweDhlZTIwMDMwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAwMzAsIDB4OGVlMjAwMzAsIDB4ODAwMzU5MiwgMHg0MjA0MiwgCisweDhlZTIwMWY4LCAweDI0NDIwMDAxLCAweGFlZTIwMWY4LCAweDhlZTIwMWY4LCAKKzB4NDIwNDIsIDB4MTA4NzAyYjcsIDB4MCwgMHg4MDAzNTU3LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYjIsIAorMHgxNDQwMDA4NCwgMHgyNDAyMDAwMSwgMHgzYzAzMDAwMSwgMHg3NzE4MjEsIAorMHg5MDYzODNiMywgMHgxNDYyMDA3ZiwgMHgzYzAyMDEwMCwgMHg4ZTQzMDAwMCwgCisweDYyMTAyNCwgMHgxMDQwMDA2ZiwgMHgyNDAyZmZmZiwgMHgxNDYyMDAwNSwgCisweDI0MTAwMDAxLCAweDk2NDMwMDA0LCAweDM0MDJmZmZmLCAweDEwNjIwMDc1LCAKKzB4MCwgMHg5MmUyMDRkOCwgMHgxNDQwMDA3MiwgMHgwLCAKKzB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LCAweDI4NDIwMDA1LCAKKzB4MTA0MDAwMjAsIDB4MzgyMSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg4YzQyODNiNCwgMHgxODQwMDAxNiwgMHgyODIxLCAweDk2MjYwMDAwLCAKKzB4NTIwYzAsIDB4OTcxMDIxLCAweDk0NDI3NzdlLCAweDE0NDYwMDA5LCAKKzB4OTcxMDIxLCAweDk0NDM3NzgwLCAweDk2MjIwMDAyLCAweDE0NjIwMDA1LCAKKzB4OTcxMDIxLCAweDk0NDM3NzgyLCAweDk2MjIwMDA0LCAweDUwNjIwMDA4LCAKKzB4MjQwNzAwMDEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LCAKKzB4MjRhNTAwMDEsIDB4YTIxMDJhLCAweDU0NDBmZmVlLCAweDUyMGMwLCAKKzB4MzBlMjAwZmYsIDB4MTA0MDAyN2IsIDB4MCwgMHg4MDAzNjFlLCAKKzB4MCwgMHgyNDAyMDIxLCAweGMwMDIyZmUsIDB4MjQwNTAwMDYsIAorMHgzMDQ0MDAxZiwgMHg0MjhjMCwgMHgyZTUxMDIxLCAweDk0NDI3MjdjLCAKKzB4MzA0MjQwMDAsIDB4MTQ0MDAyNmYsIDB4YjcxMDIxLCAweDk0NDM3MjdlLCAKKzB4OTYyMjAwMDAsIDB4MTQ2MjAwMGIsIDB4NDE4YzAsIDB4YjcxMDIxLCAKKzB4OTQ0MzcyODAsIDB4OTYyMjAwMDIsIDB4MTQ2MjAwMDYsIDB4NDE4YzAsIAorMHhiNzEwMjEsIDB4OTQ0MzcyODIsIDB4OTYyMjAwMDQsIDB4MTA2MjAwMzUsIAorMHg0MThjMCwgMHgyZTMxMDIxLCAweDk0NDI3MjdjLCAweDMwNDI4MDAwLCAKKzB4MTQ0MDAyNWMsIDB4MmUzMTAyMSwgMHg5NDQ4NzI3YywgMHg5NjI3MDAwMCwgCisweDgyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHg4MDAzNjAwLCAKKzB4MzAyMSwgMHg0MjBjMCwgMHgyZTQxMDIxLCAweDk0NDM3MzdjLCAKKzB4MmU0MTAyMSwgMHg5NDQ4NzM3YywgMHgzMDYzODAwMCwgMHgxNDYwMDAxMCwgCisweDgyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHgxNDQ3ZmZmNSwgCisweDEwMDIwMjEsIDB4YjcxMDIxLCAweDk0NDM3MzgwLCAweDk2MjIwMDAyLCAKKzB4NTQ2MmZmZjEsIDB4NDIwYzAsIDB4YjcxMDIxLCAweDk0NDM3MzgyLCAKKzB4OTYyMjAwMDQsIDB4NTQ2MmZmZWMsIDB4NDIwYzAsIDB4MjQwNjAwMDEsIAorMHgzMGMyMDBmZiwgMHgxMDQwMDIzYiwgMHgwLCAweDgwMDM2MWUsIAorMHgwLCAweDk3NDMwMjAyLCAweDk2NDIwMDAwLCAweDE0NjIwMjM1LCAKKzB4MCwgMHg5NzQzMDIwNCwgMHg5NjQyMDAwMiwgMHgxNDYyMDIzMSwgCisweDAsIDB4OTc0MzAyMDYsIDB4OTY0MjAwMDQsIDB4MTQ2MjAyMmQsIAorMHgwLCAweDkyNDIwMDAwLCAweDNhMDMwMDAxLCAweDMwNDIwMDAxLCAKKzB4NDMxMDI0LCAweDEwNDAwMDc0LCAweDI0MDJmZmZmLCAweDhlMjMwMDAwLCAKKzB4MTQ2MjAwMDQsIDB4MzQwMmZmZmYsIDB4OTYyMzAwMDQsIDB4MTA2MjAwNmYsIAorMHgyNDE0MDAwMiwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYjIsIAorMHgxNDQwMDA2YSwgMHgyNDE0MDAwMywgMHg5MmUyMDRkOCwgMHgxNDQwMDA2NywgCisweDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LCAKKzB4Mjg0MjAwMDUsIDB4MTA0MDAwMjAsIDB4MzgyMSwgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg4YzQyODNiNCwgMHgxODQwMDAxNiwgMHgyODIxLCAKKzB4OTYyNjAwMDAsIDB4NTIwYzAsIDB4OTcxMDIxLCAweDk0NDI3NzdlLCAKKzB4MTQ0NjAwMDksIDB4OTcxMDIxLCAweDk0NDM3NzgwLCAweDk2MjIwMDAyLCAKKzB4MTQ2MjAwMDUsIDB4OTcxMDIxLCAweDk0NDM3NzgyLCAweDk2MjIwMDA0LCAKKzB4NTA2MjAwMDgsIDB4MjQwNzAwMDEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAKKzB4OGM0MjgzYjQsIDB4MjRhNTAwMDEsIDB4YTIxMDJhLCAweDU0NDBmZmVlLCAKKzB4NTIwYzAsIDB4MzBlMjAwZmYsIDB4MTQ0MDAwNDQsIDB4MjQxNDAwMDMsIAorMHg4MDAzODRhLCAweDAsIDB4MjQwMjAyMSwgMHhjMDAyMmZlLCAKKzB4MjQwNTAwMDYsIDB4MzA0NDAwMWYsIDB4NDI4YzAsIDB4MmU1MTAyMSwgCisweDk0NDI3MjdjLCAweDMwNDI0MDAwLCAweDE0NDAwMWVhLCAweGI3MTAyMSwgCisweDk0NDM3MjdlLCAweDk2MjIwMDAwLCAweDE0NjIwMDBiLCAweDQxOGMwLCAKKzB4YjcxMDIxLCAweDk0NDM3MjgwLCAweDk2MjIwMDAyLCAweDE0NjIwMDA2LCAKKzB4NDE4YzAsIDB4YjcxMDIxLCAweDk0NDM3MjgyLCAweDk2MjIwMDA0LCAKKzB4MTA2MjAwMjcsIDB4NDE4YzAsIDB4MmUzMTAyMSwgMHg5NDQyNzI3YywgCisweDMwNDI4MDAwLCAweDE0NDAwMWQ3LCAweDJlMzEwMjEsIDB4OTQ0ODcyN2MsIAorMHg5NjI3MDAwMCwgMHg4MjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsIAorMHg4MDAzNjg1LCAweDMwMjEsIDB4NDIwYzAsIDB4MmU0MTAyMSwgCisweDk0NDM3MzdjLCAweDJlNDEwMjEsIDB4OTQ0ODczN2MsIDB4MzA2MzgwMDAsIAorMHgxNDYwMDAxMCwgMHg4MjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsIAorMHgxNDQ3ZmZmNSwgMHgxMDAyMDIxLCAweGI3MTAyMSwgMHg5NDQzNzM4MCwgCisweDk2MjIwMDAyLCAweDU0NjJmZmYxLCAweDQyMGMwLCAweGI3MTAyMSwgCisweDk0NDM3MzgyLCAweDk2MjIwMDA0LCAweDU0NjJmZmVjLCAweDQyMGMwLCAKKzB4MjQwNjAwMDEsIDB4MzBjMjAwZmYsIDB4MTA0MDAxYjYsIDB4MCwgCisweDgwMDM2OTgsIDB4MjQxNDAwMDMsIDB4MjQxNDAwMDEsIDB4OGY0MjAyNjAsIAorMHg1MzEwMmIsIDB4MTA0MDAwNDksIDB4MCwgMHg4ZjgzMDBlNCwgCisweDhmODIwMGUwLCAweDEwNjIwMDAzLCAweDI0NjMwMDA4LCAweGFmODMwMGU0LCAKKzB4YWY4MzAwZTgsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4MjYwMTgyMSwgCisweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIAorMHg4NjIwMjEsIDB4YWVlNDAwYzAsIDB4YWVlNTAwYzQsIDB4OGVlMjAwNTgsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDA1OCwgMHg4ZWUyMDA1OCwgMHg4ZWUyMDA3YywgCisweDI0NDIwMDAxLCAweGFlZTIwMDdjLCAweDhlZTIwMDdjLCAweDhmODIwMGUwLCAKKzB4YWZhMjAwMTAsIDB4OGY4MjAwZTQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4NzgsIAorMHhhZmEyMDAxNCwgMHg4ZmE2MDAxOCwgMHg4ZmE3MDAxYywgMHgzYzA1MDAwNiwgCisweGMwMDI0MDMsIDB4MzRhNWYwMDMsIDB4ODAwMzg1MCwgMHgwLCAKKzB4OGVlMjUyNDAsIDB4YWZhMjAwMTAsIDB4OGVlMjUyNDQsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTg4NCwgMHhhZmEyMDAxNCwgMHg4ZWU2MGUxMCwgMHg4ZWU3MGUxOCwgCisweGMwMDI0MDMsIDB4MzRhNWYwMDIsIDB4OGVlMjAxYzAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFjMCwgMHg4ZWUyMDAwMCwgMHg4ZWUzMDFjMCwgMHgyNDAzZmZiZiwgCisweDQzMTAyNCwgMHg4MDAzN2Y4LCAweGFlZTIwMDAwLCAweDhlZTI1MjQwLCAKKzB4YWZhMjAwMTAsIDB4OGVlMjUyNDQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4ODQsIAorMHhhZmEyMDAxNCwgMHg4ZWU2MGUxMCwgMHg4ZWU3MGUxOCwgMHgzYzA1MDAwNiwgCisweGMwMDI0MDMsIDB4MzRhNWYwMDIsIDB4OGVlMjAxYzAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFjMCwgMHg4MDAzN2Y4LCAweDhlZTIwMWMwLCAweDk2ZTIwNDY4LCAKKzB4NTMxMDJiLCAweDU0NDAwMDAxLCAweDNjMTU4MDAwLCAweDEyNjAwMTMxLCAKKzB4M2MwYzAwMWYsIDB4MzU4Y2ZmZmYsIDB4OGVlMjcyNGMsIDB4OGY0MzAyODAsIAorMHgyNDQyMDAwMSwgMHgzMDQyMDdmZiwgMHgxMDYyMDEwOCwgMHgwLCAKKzB4MTJhMDAwMTQsIDB4MCwgMHg4ZWUzNTI0MCwgMHg4ZWUyNTI0NCwgCisweDEwNjIwMDA5LCAweDI2ZWU1MjQ0LCAweDhlZWI1MjQ0LCAweDhlZTM1MjQ0LCAKKzB4MjExNDAsIDB4MjQ0MjUyNDgsIDB4MmUyODAyMSwgMHgyNDYzMDAwMSwgCisweDgwMDM3MTIsIDB4MzA2ODAwZmYsIDB4OTJlMjcyNDgsIDB4MTQ0MGZmYzAsIAorMHgzYzA1MDAwNiwgMHg4ZWUyMDFlMCwgMHgyNDQyMDAwMSwgMHhhZWUyMDFlMCwgCisweDhlZTIwMWUwLCAweDhlZTMwZTEwLCAweDhlZTIwZTE4LCAweDEwNjJmZmNiLCAKKzB4MjZlZTBlMTgsIDB4OGVlYjBlMTgsIDB4YTgyMSwgMHg4ZWUzMGUxOCwgCisweDIxMTQwLCAweDI0NDIwZTIwLCAweDJlMjgwMjEsIDB4MjQ2MzAwMDEsIAorMHgzMDY4MDFmZiwgMHg5NmUyMDQ2YSwgMHgzMDQyMDAxMCwgMHgxMDQwMDAxNywgCisweDM0MDI4MTAwLCAweDk2NDMwMDBjLCAweDE0NjIwMDE0LCAweDAsIAorMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYzAsIDB4MTQ0MDAwMGYsIAorMHgwLCAweDk2NDIwMDBlLCAweGE2MDIwMDE2LCAweDhlNDIwMDA4LCAKKzB4OGU0MzAwMDQsIDB4OGU0NDAwMDAsIDB4MjY3M2ZmZmMsIDB4YWU0MjAwMGMsIAorMHhhZTQzMDAwOCwgMHhhZTQ0MDAwNCwgMHg5NjAyMDAwZSwgMHgyNjMxMDAwNCwgCisweDI0MTYwMDAxLCAweDM0NDIwMjAwLCAweGE2MDIwMDBlLCAweDk2MDMwMDBhLCAKKzB4MjYwNTAyMSwgMHg3MzEwMmIsIDB4MTA0MDAwMDIsIDB4MjYwNjgyMSwgCisweDYwNTAyMSwgMHgyZDQyMDAzZCwgMHgxMDQwMDAyYSwgMHgzODIxLCAKKzB4OTYyMzAwMGMsIDB4MjQwMjA4MDAsIDB4NTQ2MjAwMjcsIDB4YWUxMTAwMTgsIAorMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYzAsIDB4NTQ0MDAwMjIsIAorMHhhZTExMDAxOCwgMHgyNjIyMDAxNywgMHgxODIxMDJiLCAweDEwNDAwMDEzLCAKKzB4MCwgMHgzYzAyZmZmNSwgMHg1MTEwMjEsIDB4OTA0MjEwMTcsIAorMHgzODQzMDAwNiwgMHgyYzYzMDAwMSwgMHgzODQyMDAxMSwgMHgyYzQyMDAwMSwgCisweDYyMTgyNSwgMHgxMDYwMDAxMywgMHgyNjIyMDAxMCwgMHgxODIxMDJiLCAKKzB4MTA0MDAwMGUsIDB4MCwgMHgzYzA3ZmZmNSwgMHhmMTM4MjEsIAorMHg5NGU3MTAxMCwgMHg4MDAzNzVlLCAweDI0ZTcwMDBlLCAweDkyMjIwMDE3LCAKKzB4Mzg0MzAwMDYsIDB4MmM2MzAwMDEsIDB4Mzg0MjAwMTEsIDB4MmM0MjAwMDEsIAorMHg2MjE4MjUsIDB4NTA2MDAwMDQsIDB4YWUxMTAwMTgsIDB4OTYyNzAwMTAsIAorMHgyNGU3MDAwZSwgMHhhZTExMDAxOCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg5MDQyODNjMCwgMHgyMTAyYiwgMHgxNGUwMDAwMiwgMHgyNGVjMCwgCisweDE0MDM4MjEsIDB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIAorMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIAorMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAKKzB4MjQwMjAwMGIsIDB4OGVlMjAxYTQsIDB4NDgyMSwgMHgyNDQyMDAwMSwgCisweGFlZTIwMWE0LCAweDgwMDM3YmYsIDB4OGVlMjAxYTQsIDB4OGUwNDAwMDAsIAorMHg4ZTA1MDAwNCwgMHhhYzYyMDAxOCwgMHgxNzUxMDI1LCAweDQ5MTAyNSwgCisweGFjNzEwMDA4LCAweGE0NjcwMDBlLCAweGFjNjIwMDFjLCAweGFjNjQwMDAwLCAKKzB4YWM2NTAwMDQsIDB4OGVlMjA0YzAsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIAorMHg5MmUyNGUyMCwgMHgxNDQwMDAzOCwgMHgyNDA5MDAwMSwgMHg4ZWUyNGUzMCwgCisweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIAorMHgyNDAyMDAwNywgMHgxNDYyMDAyMCwgMHgwLCAweDhlZTM0ZTMwLCAKKzB4OGVlMjRlMzQsIDB4MTA2MjAwMWMsIDB4MCwgMHg4YzgyMDAwNCwgCisweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTM0ZTM0LCAweDhlZTU0ZTMwLCAKKzB4MjQwMjAwNDAsIDB4MjQ2MzAwMDEsIDB4MTA2MjAwMDcsIDB4MCwgCisweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIAorMHg4MDAzN2E5LCAweDAsIDB4MTRhMDAwMDUsIDB4MCwgCisweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAKKzB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIAorMHg4MDAzN2JmLCAweDAsIDB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIAorMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIAorMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA3LCAweGFjODIwMDAwLCAKKzB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTUyMDAwMTgsIDB4M2MwNTAwMDYsIAorMHg4ZTAyMDAxOCwgMHgzYzA0MDAwMSwgMHgyNDg0NTg5MCwgMHhhZmEyMDAxMCwgCisweDhlMDIwMDAwLCAweDhlMDMwMDA0LCAweDM0YTVmMDA5LCAweDIwMDMwMjEsIAorMHhjMDAyNDAzLCAweGFmYTMwMDE0LCAweDMyYzIwMGZmLCAweDEwNDAwMDJiLCAKKzB4MzQwMjgxMDAsIDB4OGU0MzAwMDQsIDB4OGU0NDAwMDgsIDB4OGU0NTAwMGMsIAorMHhhNjQyMDAwYywgMHhhZTQzMDAwMCwgMHhhZTQ0MDAwNCwgMHhhZTQ1MDAwOCwgCisweDk2MDIwMDE2LCAweDgwMDM3ZjgsIDB4YTY0MjAwMGUsIDB4MTU0ZDAwMGEsIAorMHgwLCAweDk2MDIwMDBlLCAweGE2MTMwMDBhLCAweDM0NDIwMDA0LCAKKzB4YTYwMjAwMGUsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA4M2MwLCAKKzB4ODAwMzdmNiwgMHg5ODIxLCAweDk2MDQwMDBhLCAweDkzMTAyYiwgCisweDEwNDAwMDAyLCAweDI2MDE4MjEsIDB4ODAxODIxLCAweDI0MDIwMDAxLCAKKzB4YTYwMzAwMGEsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjI4M2MwLCAKKzB4OTYwNDAwMGEsIDB4MjI0ODgyMSwgMHgxOTExMDJiLCAweDEwNDAwMDAzLCAKKzB4M2MwMmZmZjUsIDB4MzQ0MjEwMDAsIDB4MjIyODgyMSwgMHgyNjQ5ODIzLCAKKzB4YTgyMSwgMHgxNjYwZmVmNCwgMHhhZGM4MDAwMCwgMHgxMjYwMDAyMSwgCisweDMyYzIwMGZmLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzMzODNjNCwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzMxODNjOCwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHgxMDQwMDAwOCwgMHhhYzMyODNjYywgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg4YzQyODNjYywgMHgyNDQyMDAwNCwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhYzIyODNjYywgMHg4ZWUyNzI0YywgMHg4ZjQzMDI4MCwgCisweDI0NDIwMDAxLCAweDE0NjIwMDA2LCAweDAsIDB4OGVlMjAxYzQsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFjNCwgMHg4MDAzODUwLCAweDhlZTIwMWM0LCAKKzB4OGVlMjAxYmMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYmMsIDB4ODAwMzg1MCwgCisweDhlZTIwMWJjLCAweDk3YTQwMDFlLCAweDI0ODRmZmZjLCAweDgwMTgyMSwgCisweDhlZTQwMGMwLCAweDhlZTUwMGM0LCAweDEwMjEsIDB4YTMyODIxLCAKKzB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsIDB4MjQwMjAwMDIsIAorMHhhZWU0MDBjMCwgMHhhZWU1MDBjNCwgMHgxMjgyMDAwZiwgMHgyYTgyMDAwMywgCisweDE0NDAwMDE3LCAweDI0MDIwMDAzLCAweDE2ODIwMDE1LCAweDAsIAorMHg4ZWUyMDBkMCwgMHg4ZWUzMDBkNCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgCisweDQ0MTAyMSwgMHhhZWUyMDBkMCwgMHhhZWUzMDBkNCwgMHg4ZWUyMDBkMCwgCisweDgwMDM4NGEsIDB4OGVlMzAwZDQsIDB4OGVlMjAwZDgsIDB4OGVlMzAwZGMsIAorMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZDgsIAorMHhhZWUzMDBkYywgMHg4ZWUyMDBkOCwgMHg4MDAzODRhLCAweDhlZTMwMGRjLCAKKzB4OGVlMjAwYzgsIDB4OGVlMzAwY2MsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIAorMHg0NDEwMjEsIDB4YWVlMjAwYzgsIDB4YWVlMzAwY2MsIDB4OGVlMjAwYzgsIAorMHg4ZWUzMDBjYywgMHg4ZjgzMDBlNCwgMHg4ZjgyMDBlMCwgMHgxMDYyMDAwMywgCisweDI0NjMwMDA4LCAweGFmODMwMGU0LCAweGFmODMwMGU4LCAweDhmYmYwMDRjLCAKKzB4OGZiNjAwNDgsIDB4OGZiNTAwNDQsIDB4OGZiNDAwNDAsIDB4OGZiMzAwM2MsIAorMHg4ZmIyMDAzOCwgMHg4ZmIxMDAzNCwgMHg4ZmIwMDAzMCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwNTAsIDB4MjdiZGZmOTAsIDB4YWZiNjAwNjAsIDB4YjAyMSwgCisweGFmYmYwMDY4LCAweGFmYmUwMDY0LCAweGFmYjUwMDVjLCAweGFmYjQwMDU4LCAKKzB4YWZiMzAwNTQsIDB4YWZiMjAwNTAsIDB4YWZiMTAwNGMsIDB4YWZiMDAwNDgsIAorMHg4ZWUyMDRkNCwgMHg4ODIxLCAweDI0MTUwMDAxLCAweDMwNDIwMDAxLCAKKzB4MTQ0MDAwMmEsIDB4YTNhMDAwMmYsIDB4OGY4NzAwZTAsIDB4OGY4ODAwYzQsIAorMHg4ZjgyMDBlOCwgMHhlMjIwMjMsIDB4MmM4MjEwMDAsIDB4NTA0MDAwMDEsIAorMHgyNDg0MTAwMCwgMHg0MjBjMiwgMHg4MDE4MjEsIDB4OGVlNDAwYzgsIAorMHg4ZWU1MDBjYywgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIAorMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFlZTQwMGM4LCAweGFlZTUwMGNjLCAKKzB4OGY4MzAwYzgsIDB4M2MwMjAwMGEsIDB4MzQ0MmVmZmYsIDB4MTAzMjAyMywgCisweDQ0MTAyYiwgMHgxMDQwMDAwMywgMHgzYzAyMDAwYSwgMHgzNDQyZjAwMCwgCisweDgyMjAyMSwgMHg4MDE4MjEsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIAorMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAKKzB4ODYyMDIxLCAweGFlZTQwMGMwLCAweGFlZTUwMGM0LCAweGFmODgwMGM4LCAKKzB4YWY4NzAwZTQsIDB4ODAwM2M1YiwgMHhhZjg3MDBlOCwgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg5MDQyODNjMCwgMHgxMDQwMDAwYiwgMHgwLCAKKzB4M2MxMzAwMDEsIDB4Mjc3OTgyMSwgMHg4ZTczODNjNCwgMHgzYzEwMDAwMSwgCisweDIxNzgwMjEsIDB4OGUxMDgzYzgsIDB4M2MxMjAwMDEsIDB4MjU3OTAyMSwgCisweDgwMDNhNTksIDB4OGU1MjgzY2MsIDB4OGY4MzAwZTAsIDB4OGY4MjAwZTQsIAorMHgxMDQzMDAwNywgMHgzODIxLCAweDhmODIwMGU0LCAweDI0MDcwMDAxLCAKKzB4OGM0MzAwMDAsIDB4OGM0NDAwMDQsIDB4YWZhMzAwMTgsIDB4YWZhNDAwMWMsIAorMHgxNGUwMDAwZSwgMHgzYzAyZmZmZiwgMHg4ZjgyMDBjNCwgMHhhZmEyMDAxMCwgCisweDhmODIwMGM4LCAweDNjMDQwMDAxLCAweDI0ODQ1OGI0LCAweGFmYTIwMDE0LCAKKzB4OGY4NjAwZTAsIDB4OGY4NzAwZTQsIDB4M2MwNTAwMDYsIDB4YzAwMjQwMywgCisweDM0YTVmMjAwLCAweDgwMDNjNWIsIDB4MCwgMHg4ZmEzMDAxYywgCisweDhmYjIwMDE4LCAweDMwNzNmZmZmLCAweDI2NzNmZmZjLCAweDYyMTAyNCwgCisweDEwNDAwMDU4LCAweDI0MDgwMjEsIDB4M2MwMjAwODAsIDB4NjIxMDI0LCAKKzB4MTA0MDAwMGEsIDB4M2MwNDAwNDAsIDB4OGVlMjAwN2MsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDA3YywgMHg4ZWUyMDA3YywgMHg4ZWUyMDFmYywgMHgyNDQyMDAwMSwgCisweGFlZTIwMWZjLCAweDgwMDNjNTUsIDB4OGVlMjAxZmMsIDB4M2MwNjAwMDQsIAorMHgzYzBiMDAwMSwgMHgzYzBhMDAwMiwgMHgzYzA1MDAxMCwgMHgzYzA5MDAwOCwgCisweDhlZTIwMDgwLCAweDNjMDgwMDIwLCAweDM0MDc4MDAwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAwODAsIDB4OGVlMjAwODAsIDB4OGZhMjAwMWMsIDB4NDQxODI0LCAKKzB4MTA2NjAwMjEsIDB4YzMxMDJiLCAweDE0NDAwMDA3LCAweDAsIAorMHgxMDZiMDAxMSwgMHgwLCAweDEwNmEwMDE1LCAweDAsIAorMHg4MDAzOTE2LCAweDQyMDQyLCAweDEwNjUwMDIzLCAweGEzMTAyYiwgCisweDE0NDAwMDA1LCAweDAsIDB4MTA2OTAwMTksIDB4MCwgCisweDgwMDM5MTYsIDB4NDIwNDIsIDB4MTA2ODAwMjEsIDB4MCwgCisweDgwMDM5MTYsIDB4NDIwNDIsIDB4OGVlMjAwMzQsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDAzNCwgMHg4ZWUyMDAzNCwgMHg4MDAzOTE2LCAweDQyMDQyLCAKKzB4OGVlMjAxZWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxZWMsIDB4OGVlMjAxZWMsIAorMHg4MDAzOTE2LCAweDQyMDQyLCAweDhlZTIwMWYwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxZjAsIDB4OGVlMjAxZjAsIDB4ODAwMzkxNiwgMHg0MjA0MiwgCisweDhlZTIwMWY0LCAweDI0NDIwMDAxLCAweGFlZTIwMWY0LCAweDhlZTIwMWY0LCAKKzB4ODAwMzkxNiwgMHg0MjA0MiwgMHg4ZWUyMDAzMCwgMHgyNDQyMDAwMSwgCisweGFlZTIwMDMwLCAweDhlZTIwMDMwLCAweDgwMDM5MTYsIDB4NDIwNDIsIAorMHg4ZWUyMDFmOCwgMHgyNDQyMDAwMSwgMHhhZWUyMDFmOCwgMHg4ZWUyMDFmOCwgCisweDQyMDQyLCAweDEwODcwMzNlLCAweDAsIDB4ODAwMzhkYiwgCisweDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IyLCAKKzB4MTQ0MDAwODQsIDB4MjQwMjAwMDEsIDB4M2MwMzAwMDEsIDB4NzcxODIxLCAKKzB4OTA2MzgzYjMsIDB4MTQ2MjAwN2YsIDB4M2MwMjAxMDAsIDB4OGU0MzAwMDAsIAorMHg2MjEwMjQsIDB4MTA0MDAwNmYsIDB4MjQwMmZmZmYsIDB4MTQ2MjAwMDUsIAorMHgyNDExMDAwMSwgMHg5NjQzMDAwNCwgMHgzNDAyZmZmZiwgMHgxMDYyMDA3NSwgCisweDAsIDB4OTJlMjA0ZDgsIDB4MTQ0MDAwNzIsIDB4MCwgCisweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgMHgyODQyMDAwNSwgCisweDEwNDAwMDIwLCAweDM4MjEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAKKzB4OGM0MjgzYjQsIDB4MTg0MDAwMTYsIDB4MjgyMSwgMHg5NjA2MDAwMCwgCisweDUyMGMwLCAweDk3MTAyMSwgMHg5NDQyNzc3ZSwgMHgxNDQ2MDAwOSwgCisweDk3MTAyMSwgMHg5NDQzNzc4MCwgMHg5NjAyMDAwMiwgMHgxNDYyMDAwNSwgCisweDk3MTAyMSwgMHg5NDQzNzc4MiwgMHg5NjAyMDAwNCwgMHg1MDYyMDAwOCwgCisweDI0MDcwMDAxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgCisweDI0YTUwMDAxLCAweGEyMTAyYSwgMHg1NDQwZmZlZSwgMHg1MjBjMCwgCisweDMwZTIwMGZmLCAweDEwNDAwMzAyLCAweDAsIDB4ODAwMzlhMiwgCisweDAsIDB4MjQwMjAyMSwgMHhjMDAyMmZlLCAweDI0MDUwMDA2LCAKKzB4MzA0NDAwMWYsIDB4NDI4YzAsIDB4MmU1MTAyMSwgMHg5NDQyNzI3YywgCisweDMwNDI0MDAwLCAweDE0NDAwMmY2LCAweGI3MTAyMSwgMHg5NDQzNzI3ZSwgCisweDk2MDIwMDAwLCAweDE0NjIwMDBiLCAweDQxOGMwLCAweGI3MTAyMSwgCisweDk0NDM3MjgwLCAweDk2MDIwMDAyLCAweDE0NjIwMDA2LCAweDQxOGMwLCAKKzB4YjcxMDIxLCAweDk0NDM3MjgyLCAweDk2MDIwMDA0LCAweDEwNjIwMDM1LCAKKzB4NDE4YzAsIDB4MmUzMTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyODAwMCwgCisweDE0NDAwMmUzLCAweDJlMzEwMjEsIDB4OTQ0ZDcyN2MsIDB4OTYwNzAwMDAsIAorMHhkMjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4ODAwMzk4NCwgCisweDMwMjEsIDB4NDIwYzAsIDB4MmU0MTAyMSwgMHg5NDQzNzM3YywgCisweDJlNDEwMjEsIDB4OTQ0ZDczN2MsIDB4MzA2MzgwMDAsIDB4MTQ2MDAwMTAsIAorMHhkMjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4MTQ0N2ZmZjUsIAorMHgxYTAyMDIxLCAweGI3MTAyMSwgMHg5NDQzNzM4MCwgMHg5NjAyMDAwMiwgCisweDU0NjJmZmYxLCAweDQyMGMwLCAweGI3MTAyMSwgMHg5NDQzNzM4MiwgCisweDk2MDIwMDA0LCAweDU0NjJmZmVjLCAweDQyMGMwLCAweDI0MDYwMDAxLCAKKzB4MzBjMjAwZmYsIDB4MTA0MDAyYzIsIDB4MCwgMHg4MDAzOWEyLCAKKzB4MCwgMHg5NzQzMDIwMiwgMHg5NjQyMDAwMCwgMHgxNDYyMDJiYywgCisweDAsIDB4OTc0MzAyMDQsIDB4OTY0MjAwMDIsIDB4MTQ2MjAyYjgsIAorMHgwLCAweDk3NDMwMjA2LCAweDk2NDIwMDA0LCAweDE0NjIwMmI0LCAKKzB4MCwgMHg5MjQyMDAwMCwgMHgzYTIzMDAwMSwgMHgzMDQyMDAwMSwgCisweDQzMTAyNCwgMHgxMDQwMDA3NCwgMHgyNDAyZmZmZiwgMHg4ZTAzMDAwMCwgCisweDE0NjIwMDA0LCAweDM0MDJmZmZmLCAweDk2MDMwMDA0LCAweDEwNjIwMDZmLCAKKzB4MjQxNTAwMDIsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IyLCAKKzB4MTQ0MDAwNmEsIDB4MjQxNTAwMDMsIDB4OTJlMjA0ZDgsIDB4MTQ0MDAwNjcsIAorMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgCisweDI4NDIwMDA1LCAweDEwNDAwMDIwLCAweDM4MjEsIDB4M2MwMjAwMDEsIAorMHg1NzEwMjEsIDB4OGM0MjgzYjQsIDB4MTg0MDAwMTYsIDB4MjgyMSwgCisweDk2MDYwMDAwLCAweDUyMGMwLCAweDk3MTAyMSwgMHg5NDQyNzc3ZSwgCisweDE0NDYwMDA5LCAweDk3MTAyMSwgMHg5NDQzNzc4MCwgMHg5NjAyMDAwMiwgCisweDE0NjIwMDA1LCAweDk3MTAyMSwgMHg5NDQzNzc4MiwgMHg5NjAyMDAwNCwgCisweDUwNjIwMDA4LCAweDI0MDcwMDAxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgCisweDhjNDI4M2I0LCAweDI0YTUwMDAxLCAweGEyMTAyYSwgMHg1NDQwZmZlZSwgCisweDUyMGMwLCAweDMwZTIwMGZmLCAweDE0NDAwMDQ0LCAweDI0MTUwMDAzLCAKKzB4ODAwM2M1NSwgMHgwLCAweDI0MDIwMjEsIDB4YzAwMjJmZSwgCisweDI0MDUwMDA2LCAweDMwNDQwMDFmLCAweDQyOGMwLCAweDJlNTEwMjEsIAorMHg5NDQyNzI3YywgMHgzMDQyNDAwMCwgMHgxNDQwMDI3MSwgMHhiNzEwMjEsIAorMHg5NDQzNzI3ZSwgMHg5NjAyMDAwMCwgMHgxNDYyMDAwYiwgMHg0MThjMCwgCisweGI3MTAyMSwgMHg5NDQzNzI4MCwgMHg5NjAyMDAwMiwgMHgxNDYyMDAwNiwgCisweDQxOGMwLCAweGI3MTAyMSwgMHg5NDQzNzI4MiwgMHg5NjAyMDAwNCwgCisweDEwNjIwMDI3LCAweDQxOGMwLCAweDJlMzEwMjEsIDB4OTQ0MjcyN2MsIAorMHgzMDQyODAwMCwgMHgxNDQwMDI1ZSwgMHgyZTMxMDIxLCAweDk0NGQ3MjdjLCAKKzB4OTYwNzAwMDAsIDB4ZDI4YzAsIDB4YjcxMDIxLCAweDk0NDI3MzdlLCAKKzB4ODAwM2EwOSwgMHgzMDIxLCAweDQyMGMwLCAweDJlNDEwMjEsIAorMHg5NDQzNzM3YywgMHgyZTQxMDIxLCAweDk0NGQ3MzdjLCAweDMwNjM4MDAwLCAKKzB4MTQ2MDAwMTAsIDB4ZDI4YzAsIDB4YjcxMDIxLCAweDk0NDI3MzdlLCAKKzB4MTQ0N2ZmZjUsIDB4MWEwMjAyMSwgMHhiNzEwMjEsIDB4OTQ0MzczODAsIAorMHg5NjAyMDAwMiwgMHg1NDYyZmZmMSwgMHg0MjBjMCwgMHhiNzEwMjEsIAorMHg5NDQzNzM4MiwgMHg5NjAyMDAwNCwgMHg1NDYyZmZlYywgMHg0MjBjMCwgCisweDI0MDYwMDAxLCAweDMwYzIwMGZmLCAweDEwNDAwMjNkLCAweDAsIAorMHg4MDAzYTFjLCAweDI0MTUwMDAzLCAweDI0MTUwMDAxLCAweDhmNDIwMjYwLCAKKzB4NTMxMDJiLCAweDEwNDAwMDM2LCAweDAsIDB4OGY4MzAwZTQsIAorMHg4ZjgyMDBlMCwgMHgxMDYyMDAwMywgMHgyNDYzMDAwOCwgMHhhZjgzMDBlNCwgCisweGFmODMwMGU4LCAweDhlZTQwMGMwLCAweDhlZTUwMGM0LCAweDI2MDE4MjEsIAorMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAKKzB4ODYyMDIxLCAweGFlZTQwMGMwLCAweGFlZTUwMGM0LCAweDhlZTIwMDU4LCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAwNTgsIDB4OGVlMjAwNTgsIDB4OGVlMjAwN2MsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDA3YywgMHg4ZWUyMDA3YywgMHg4ZjgyMDBlMCwgCisweGFmYTIwMDEwLCAweDhmODIwMGU0LCAweDNjMDQwMDAxLCAweDI0ODQ1OGMwLCAKKzB4YWZhMjAwMTQsIDB4OGZhNjAwMTgsIDB4OGZhNzAwMWMsIDB4M2MwNTAwMDYsIAorMHhjMDAyNDAzLCAweDM0YTVmMjAzLCAweDgwMDNjNWIsIDB4MCwgCisweDhlZTI1MjQwLCAweGFmYTIwMDEwLCAweDhlZTI1MjQ0LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDU4Y2MsIDB4YWZhMjAwMTQsIDB4OGVlNjBlMTAsIDB4OGVlNzBlMTgsIAorMHgzYzA1MDAwNiwgMHhjMDAyNDAzLCAweDM0YTVmMjAyLCAweDhlZTIwMWMwLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYzAsIDB4ODAwM2MwMiwgMHg4ZWUyMDFjMCwgCisweDk2ZTIwNDY4LCAweDUzMTAyYiwgMHg1NDQwMDAwMSwgMHgzYzE2ODAwMCwgCisweDEyNjAwMWNiLCAweDNjMGUwMDFmLCAweDM1Y2VmZmZmLCAweDNjMGZmZmY1LCAKKzB4MzVlZjEwMDAsIDB4MjQxZTAwNDAsIDB4OGVlMjcyNGMsIDB4OGY0MzAyODAsIAorMHgyNDQyMDAwMSwgMHgzMDQyMDdmZiwgMHgxMDYyMDE5ZSwgMHgwLCAKKzB4MTJjMDAwMTIsIDB4MCwgMHg4ZWUzNTI0MCwgMHg4ZWUyNTI0NCwgCisweDEwNjIwMDBhLCAweDI2Zjg1MjQ0LCAweDhlZjQ1MjQ0LCAweGFmYjgwMDI0LCAKKzB4OGVlMzUyNDQsIDB4MjExNDAsIDB4MjQ0MjUyNDgsIDB4MmUyODgyMSwgCisweDI0NjMwMDAxLCAweDgwMDNhODUsIDB4MzA2ZDAwZmYsIDB4OGVlMjAxZTAsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFlMCwgMHg4ZWUyMDFlMCwgMHg4ZWUzMGUxMCwgCisweDhlZTIwZTE4LCAweDEwNjJmZmNhLCAweDI2ZjgwZTE4LCAweDhlZjQwZTE4LCAKKzB4YjAyMSwgMHhhZmI4MDAyNCwgMHg4ZWUzMGUxOCwgMHgyMTE0MCwgCisweDI0NDIwZTIwLCAweDJlMjg4MjEsIDB4MjQ2MzAwMDEsIDB4MzA2ZDAxZmYsIAorMHg5NmUyMDQ2YSwgMHgzMDQyMDAxMCwgMHgxMDQwMDAxOCwgMHgzNDAyODEwMCwgCisweDk2NDMwMDBjLCAweDE0NjIwMDE1LCAweDAsIDB4M2MwMjAwMDEsIAorMHg1NzEwMjEsIDB4OTA0MjgzYzAsIDB4MTQ0MDAwMTAsIDB4MCwgCisweDk2NDIwMDBlLCAweGE2MjIwMDE2LCAweDhlNDIwMDA4LCAweDhlNDMwMDA0LCAKKzB4OGU0NDAwMDAsIDB4MjY3M2ZmZmMsIDB4YWU0MjAwMGMsIDB4YWU0MzAwMDgsIAorMHhhZTQ0MDAwNCwgMHg5NjIyMDAwZSwgMHgyNjEwMDAwNCwgMHgyNDE4MDAwMSwgCisweGEzYjgwMDJmLCAweDM0NDIwMjAwLCAweGE2MjIwMDBlLCAweDhlMjIwMDAwLCAKKzB4OGUyMzAwMDQsIDB4M2MwNDAwMDEsIDB4MzQ4NDM4MDAsIDB4MjAwMzAyMSwgCisweDMwNmEwMDA3LCAweDIwYTgwMjMsIDB4MzY0MTAyMSwgMHgyMDIxMDJiLCAKKzB4MTA0MDAwMDUsIDB4MjZhOTgyMSwgMHgyMDQxMDIzLCAweDM2MjE4MjMsIAorMHgzYzAyMDAyMCwgMHg0MzgwMjMsIDB4MjY2MjAwMDcsIDB4OTYyMzAwMGEsIAorMHgyNDE4ZmZmOCwgMHg1OGM4MjQsIDB4NmExODIxLCAweDc5MTAyYiwgCisweDEwNDAwMDAyLCAweDMyMDYwMjEsIDB4NjA2MDIxLCAweDE4MDE4MjEsIAorMHgyNDYyMDAwNywgMHgyNDE4ZmZmOCwgMHg1ODYwMjQsIDB4MjZjMTAyYiwgCisweDE0NDAwMDA0LCAweDE5MzI4MjMsIDB4MTgzMjgyMywgMHg4MDAzYWMzLCAKKzB4YzMxMDIxLCAweGQzMTAyMSwgMHg0YTIwMjMsIDB4MWM0MTAyYiwgCisweDU0NDAwMDAxLCAweDhmMjAyMSwgMHgyNTQyMDA0MCwgMHg0YzEwMmIsIAorMHgxNDQwMDAzNSwgMHg1ODIxLCAweDk0YzMwMDBjLCAweDI0MDIwODAwLCAKKzB4NTQ2MjAwMzIsIDB4YWUyNjAwMTgsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAKKzB4OTA0MjgzYzAsIDB4NTQ0MDAwMmQsIDB4YWUyNjAwMTgsIDB4MjRjMjAwMTcsIAorMHgxYzIxMDJiLCAweDEwNDAwMDEzLCAweDAsIDB4M2MwMmZmZjUsIAorMHg0NjEwMjEsIDB4OTA0MjEwMTcsIDB4Mzg0MzAwMDYsIDB4MmM2MzAwMDEsIAorMHgzODQyMDAxMSwgMHgyYzQyMDAwMSwgMHg2MjE4MjUsIDB4MTA2MDAwMTQsIAorMHgyNGMyMDAxMCwgMHgxYzIxMDJiLCAweDEwNDAwMDBlLCAweDAsIAorMHgzYzBiZmZmNSwgMHgxNjY1ODIxLCAweDk1NmIxMDEwLCAweDgwMDNhZjQsIAorMHgyNTYyMDAwZSwgMHg5MGMyMDAxNywgMHgzODQzMDAwNiwgMHgyYzYzMDAwMSwgCisweDM4NDIwMDExLCAweDJjNDIwMDAxLCAweDYyMTgyNSwgMHgxMDYwMDAwNSwgCisweDE2MDE4MjEsIDB4OTRjYjAwMTAsIDB4MjU2MjAwMGUsIDB4NGE1ODIxLCAKKzB4MTYwMTgyMSwgMHgyNDYyMDAwNywgMHgyNDE4ZmZmOCwgMHg1ODU4MjQsIAorMHhjMzEwMjEsIDB4NGEyMDIzLCAweDFjNDEwMmIsIDB4MTA0MDAwMDIsIAorMHgxNjMyODIzLCAweDhmMjAyMSwgMHhhZTI2MDAxOCwgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg5MDQyODNjMCwgMHgyMTAyYiwgMHgyMTZjMCwgCisweDE1NjAwMDAyLCAweGFmYTIwMDQ0LCAweDE4MDU4MjEsIDB4MzA4MjAwMDEsIAorMHgxMDQwMDAwNywgMHg0MDIxLCAweDkwODgwMDAwLCAweDI0ODQwMDAxLCAKKzB4MWM0MTAyYiwgMHgxMDQwMDAwMiwgMHgyNGE1ZmZmZiwgMHg4ZjIwMjEsIAorMHg1MGEwMDAxMiwgMHg4MWMwMiwgMHgyY2EyMDAwMiwgMHg1NDQwMDAwOSwgCisweDI0YTVmZmZmLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLCAweDEwMjQwMjEsIAorMHgxYzQxMDJiLCAweDEwNDAwMDA2LCAweDI0YTVmZmZlLCAweDgwMDNiMjEsIAorMHg4ZjIwMjEsIDB4OTA4MjAwMDAsIDB4MjEyMDAsIDB4MTAyNDAyMSwgCisweDE0YTBmZmYyLCAweDJjYTIwMDAyLCAweDgxYzAyLCAweDMxMDJmZmZmLCAKKzB4NjI0MDIxLCAweDMxMDhmZmZmLCAweDE0MDI4MjEsIDB4MTE0MDAwMTEsIAorMHgyMDAyMDIxLCAweDJjYTIwMDAyLCAweDU0NDAwMDA5LCAweDI0YTVmZmZmLCAKKzB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIDB4MTAyNDAyMSwgMHgxYzQxMDJiLCAKKzB4MTA0MDAwMDYsIDB4MjRhNWZmZmUsIDB4ODAwM2IzOCwgMHg4ZjIwMjEsIAorMHg5MDgyMDAwMCwgMHgyMTIwMCwgMHgxMDI0MDIxLCAweDE0YTBmZmYyLCAKKzB4MmNhMjAwMDIsIDB4ODFjMDIsIDB4MzEwMmZmZmYsIDB4NjI0MDIxLCAKKzB4ODFjMDIsIDB4MzEwMmZmZmYsIDB4OGY4OTAxMjAsIDB4NjI0MDIxLCAKKzB4Mjc2MjM4MDAsIDB4MjUyMzAwMjAsIDB4NjIxMDJiLCAweDE0NDAwMDAyLCAKKzB4MzEwOGZmZmYsIDB4Mjc2MzMwMDAsIDB4OGY4MjAxMjgsIDB4MTA2MjAwMDQsIAorMHgwLCAweDhmODIwMTI0LCAweDE0NjIwMDA3LCAweDE0MDI4MjEsIAorMHg4ZWUyMDFhNCwgMHgzODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAKKzB4ODAwM2JjOSwgMHg4ZWUyMDFhNCwgMHg4ZTI2MDAwMCwgMHg4ZTI3MDAwNCwgCisweDgxNDAwLCAweDM0NDgwMDBiLCAweGFkMzAwMDA4LCAweGE1MmIwMDBlLCAKKzB4YWQyODAwMTgsIDB4OGZiODAwNDQsIDB4MjAyMSwgMHgyOTYxMDI1LCAKKzB4NTgxMDI1LCAweGFkMjIwMDFjLCAweGU1MTAyYiwgMHhlNTM4MjMsIAorMHhjNDMwMjMsIDB4YzIzMDIzLCAweGFkMjYwMDAwLCAweGFkMjcwMDA0LCAKKzB4OGVlMjA0YzAsIDB4YWQyMjAwMTAsIDB4YWY4MzAxMjAsIDB4OTJlMjRlMjAsIAorMHgxNDQwMDA1ZiwgMHgyNDA3MDAwMSwgMHgyNTAyZmZlZSwgMHgyYzQyMDAwMiwgCisweDE0NDAwMDAzLCAweDI0MDIwMDExLCAweDE1MDIwMDI0LCAweDAsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MzAwMDAsIDB4MjQwMjAwMTIsIDB4MTQ2MjAwMGYsIDB4MCwgCisweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDBiLCAweDAsIAorMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgCisweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNWUwMDJhLCAweDAsIAorMHg4MDAzYmE4LCAweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIAorMHg1MDVlMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIAorMHgyZTIyMDIxLCAweDgwMDNiYzYsIDB4MjQwMjAwMTIsIDB4OGVlMjRlMzAsIAorMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLCAKKzB4MjQwMjAwMDcsIDB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgCisweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsIAorMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgCisweDI0NDIwMDAxLCAweDEwNWUwMDA3LCAweDAsIDB4OGVlMjRlMzQsIAorMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDNiYjQsIAorMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgCisweDJjNDIwMDExLCAweDUwNDAwMDEyLCAweGFjODAwMDAwLCAweDgwMDNiYzksIAorMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNWUwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgCisweDE0ZTAwMDE5LCAweDNjMDUwMDA2LCAweDNjMDQwMDAxLCAweDI0ODQ1ODkwLCAKKzB4OGUyMjAwMTgsIDB4MzRhNWYyMDksIDB4YWZhMjAwMTAsIDB4OGUyMjAwMDAsIAorMHg4ZTIzMDAwNCwgMHgyMjAzMDIxLCAweDE2MDM4MjEsIDB4YzAwMjQwMywgCisweGFmYTMwMDE0LCAweDkzYTIwMDJmLCAweDEwNDAwMDJhLCAweDM0MDI4MTAwLCAKKzB4OGU0MzAwMDQsIDB4OGU0NDAwMDgsIDB4OGU0NTAwMGMsIDB4YTY0MjAwMGMsIAorMHhhZTQzMDAwMCwgMHhhZTQ0MDAwNCwgMHhhZTQ1MDAwOCwgMHg5NjIyMDAxNiwgCisweDgwMDNjMDIsIDB4YTY0MjAwMGUsIDB4MTU5OTAwMGEsIDB4MjZhMTgyMywgCisweDk2MjIwMDBlLCAweGE2MjMwMDBhLCAweDM0NDIwMDA0LCAweGE2MjIwMDBlLCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA4M2MwLCAweDgwMDNiZmYsIAorMHg5ODIxLCAweDk2MjQwMDBhLCAweDgzMTAyYiwgMHg1NDQwMDAwMSwgCisweDgwMTgyMSwgMHgyNDAyMDAwMSwgMHhhNjIzMDAwYSwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhMDIyODNjMCwgMHg5NjIyMDAwYSwgMHg0YTE4MjEsIAorMHgyMDM4MDIxLCAweDFkMDEwMmIsIDB4NTQ0MDAwMDEsIDB4MjBmODAyMSwgCisweDI2Mzk4MjMsIDB4YjAyMSwgMHg4ZmI4MDAyNCwgMHgxNjYwZmU1ZSwgCisweGFmMGQwMDAwLCAweDEyNjAwMDIyLCAweDAsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4YWMzMzgzYzQsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAKKzB4YWMzMDgzYzgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMzI4M2NjLCAKKzB4OTNhMjAwMmYsIDB4MTA0MDAwMDgsIDB4MCwgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg4YzQyODNjYywgMHgyNDQyMDAwNCwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhYzIyODNjYywgMHg4ZjQzMDI4MCwgMHg4ZWUyNzI0YywgCisweDE0NjIwMDA2LCAweDAsIDB4OGVlMjAxYzQsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFjNCwgMHg4MDAzYzViLCAweDhlZTIwMWM0LCAweDhlZTIwMWJjLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYmMsIDB4ODAwM2M1YiwgMHg4ZWUyMDFiYywgCisweDk3YTQwMDFlLCAweDI0ODRmZmZjLCAweDgwMTgyMSwgMHg4ZWU0MDBjMCwgCisweDhlZTUwMGM0LCAweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgCisweDgyMjAyMSwgMHg4NjIwMjEsIDB4MjQwMjAwMDIsIDB4YWVlNDAwYzAsIAorMHhhZWU1MDBjNCwgMHgxMmEyMDAwZiwgMHgyYWEyMDAwMywgMHgxNDQwMDAxNywgCisweDI0MDIwMDAzLCAweDE2YTIwMDE1LCAweDAsIDB4OGVlMjAwZDAsIAorMHg4ZWUzMDBkNCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIAorMHhhZWUyMDBkMCwgMHhhZWUzMDBkNCwgMHg4ZWUyMDBkMCwgMHg4MDAzYzU1LCAKKzB4OGVlMzAwZDQsIDB4OGVlMjAwZDgsIDB4OGVlMzAwZGMsIDB4MjQ2MzAwMDEsIAorMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZDgsIDB4YWVlMzAwZGMsIAorMHg4ZWUyMDBkOCwgMHg4MDAzYzU1LCAweDhlZTMwMGRjLCAweDhlZTIwMGM4LCAKKzB4OGVlMzAwY2MsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLCAKKzB4YWVlMjAwYzgsIDB4YWVlMzAwY2MsIDB4OGVlMjAwYzgsIDB4OGVlMzAwY2MsIAorMHg4ZjgzMDBlNCwgMHg4ZjgyMDBlMCwgMHgxMDYyMDAwMywgMHgyNDYzMDAwOCwgCisweGFmODMwMGU0LCAweGFmODMwMGU4LCAweDhmYmYwMDY4LCAweDhmYmUwMDY0LCAKKzB4OGZiNjAwNjAsIDB4OGZiNTAwNWMsIDB4OGZiNDAwNTgsIDB4OGZiMzAwNTQsIAorMHg4ZmIyMDA1MCwgMHg4ZmIxMDA0YywgMHg4ZmIwMDA0OCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwNzAsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMTgsIDB4OGVlMzBlMTQsIAorMHg4ZWUyMGUwYywgMHgxMDYyMDA3NCwgMHgwLCAweDhlZTMwZTBjLCAKKzB4OGVlMjBlMTQsIDB4NjIyMDIzLCAweDQ4MjAwMDEsIDB4MjQ4NDAyMDAsIAorMHg4ZWUzMGUxOCwgMHg4ZWUyMGUxNCwgMHg0MzEwMmIsIDB4MTQ0MDAwMDQsIAorMHgyNDAyMDIwMCwgMHg4ZWUzMGUxNCwgMHg4MDAzYzdkLCAweDQzMTgyMywgCisweDhlZTIwZTE4LCAweDhlZTMwZTE0LCAweDQzMTAyMywgMHgyNDQzZmZmZiwgCisweDgwNDgyMSwgMHg2OTEwMmEsIDB4NTQ0MDAwMDEsIDB4NjA0ODIxLCAKKzB4OGY4NzAxMDAsIDB4Mjc2MjMwMDAsIDB4MjRlODAwMjAsIDB4MTAyMTAyYiwgCisweDUwNDAwMDAxLCAweDI3NjgyODAwLCAweDhmODIwMTA4LCAweDExMDIwMDA0LCAKKzB4MCwgMHg4ZjgyMDEwNCwgMHgxNTAyMDAwNywgMHgxMDIxLCAKKzB4OGVlMjAxYTgsIDB4MjAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwgCisweDgwMDNjYmYsIDB4OGVlMjAxYTgsIDB4OGVlNDBlMTQsIDB4NDIxNDAsIAorMHg4MDE4MjEsIDB4OGVlNDA0NjAsIDB4OGVlNTA0NjQsIDB4YTMyODIxLCAKKzB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsIDB4YWNlNDAwMDAsIAorMHhhY2U1MDAwNCwgMHg4ZWUzMGUxNCwgMHg5MTE0MCwgMHhhNGUyMDAwZSwgCisweDI0MDIwMDAyLCAweGFjZTIwMDE4LCAweDMxOTQwLCAweDI0NjMwZTIwLCAKKzB4MmUzMTAyMSwgMHhhY2UyMDAwOCwgMHg4ZWUyMGUxNCwgMHhhY2UyMDAxYywgCisweDhlZTIwNGNjLCAweGFjZTIwMDEwLCAweGFmODgwMTAwLCAweDkyZTIwNGVjLCAKKzB4MTQ0MDAwMTEsIDB4MjQwNDAwMDEsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIAorMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIAorMHgyNDQyNGUzOCwgMHgyZTIxODIxLCAweDI0MDIwMDAyLCAweGFjNjIwMDAwLCAKKzB4MjQwMjAwMDEsIDB4YWM2MjAwMDQsIDB4MTQ4MDAwMGUsIDB4MjQwMzAwNDAsIAorMHg4ZWUyMGUxNCwgMHhhZmEyMDAxMCwgMHg4ZWUyMGUxOCwgMHgzYzA1MDAwNywgCisweGFmYTIwMDE0LCAweDhlZTYwZTBjLCAweDhlZTcwZTEwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDU4ZDQsIDB4YzAwMjQwMywgMHgzNGE1ZjAwMSwgMHg4MDAzY2RkLCAKKzB4MCwgMHg4ZWUyMDUwMCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgCisweDEwMjEsIDB4OGVlMjA1MDAsIDB4MjQ0MjAwMDEsIDB4YWVlMjA1MDAsIAorMHg4ZWUyMDUwMCwgMHgyMTA4MCwgMHg1NzEwMjEsIDB4YWM0OTA1MDgsIAorMHg4ZWUyMGUxNCwgMHg0OTEwMjEsIDB4MzA0MjAxZmYsIDB4YWVlMjBlMTQsIAorMHg4ZWUzMGUxNCwgMHg4ZWUyMGUwYywgMHgxNDYyMDAwNSwgMHgwLCAKKzB4OGY4MjAwNjAsIDB4MjQwM2ZkZmYsIDB4NDMxMDI0LCAweGFmODIwMDYwLCAKKzB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyN2JkZmZlMCwgCisweGFmYmYwMDE4LCAweDhlZTM1MjNjLCAweDhlZTI1MjM4LCAweDEwNjIwMDc0LCAKKzB4MCwgMHg4ZWUzNTIzOCwgMHg4ZWUyNTIzYywgMHg2MjIwMjMsIAorMHg0ODIwMDAxLCAweDI0ODQwMTAwLCAweDhlZTM1MjQ0LCAweDhlZTI1MjNjLCAKKzB4NDMxMDJiLCAweDE0NDAwMDA0LCAweDI0MDIwMTAwLCAweDhlZTM1MjNjLCAKKzB4ODAwM2NmZiwgMHg0MzE4MjMsIDB4OGVlMjUyNDQsIDB4OGVlMzUyM2MsIAorMHg0MzEwMjMsIDB4MjQ0M2ZmZmYsIDB4ODA0ODIxLCAweDY5MTAyYSwgCisweDU0NDAwMDAxLCAweDYwNDgyMSwgMHg4Zjg3MDEwMCwgMHgyNzYyMzAwMCwgCisweDI0ZTgwMDIwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODI4MDAsIAorMHg4ZjgyMDEwOCwgMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTA0LCAKKzB4MTUwMjAwMDcsIDB4MTAyMSwgMHg4ZWUyMDFhOCwgMHgyMDIxLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIDB4ODAwM2Q0MSwgMHg4ZWUyMDFhOCwgCisweDhlZTQ1MjNjLCAweDQyMTQwLCAweDgwMTgyMSwgMHg4ZWU0MDQ3MCwgCisweDhlZTUwNDc0LCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAKKzB4ODYyMDIxLCAweGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTM1MjNjLCAKKzB4OTExNDAsIDB4YTRlMjAwMGUsIDB4MjQwMjAwMDMsIDB4YWNlMjAwMTgsIAorMHgzMTk0MCwgMHgyNDYzNTI0OCwgMHgyZTMxMDIxLCAweGFjZTIwMDA4LCAKKzB4OGVlMjUyM2MsIDB4YWNlMjAwMWMsIDB4OGVlMjA0Y2MsIDB4YWNlMjAwMTAsIAorMHhhZjg4MDEwMCwgMHg5MmUyMDRlYywgMHgxNDQwMDAxMSwgMHgyNDA0MDAwMSwgCisweDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwgCisweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjE4MjEsIAorMHgyNDAyMDAwMywgMHhhYzYyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzYyMDAwNCwgCisweDE0ODAwMDBlLCAweDI0MDMwMDQwLCAweDhlZTI1MjNjLCAweGFmYTIwMDEwLCAKKzB4OGVlMjUyNDQsIDB4M2MwNTAwMDcsIDB4YWZhMjAwMTQsIDB4OGVlNjUyMzgsIAorMHg4ZWU3NTI0MCwgMHgzYzA0MDAwMSwgMHgyNDg0NThlMCwgMHhjMDAyNDAzLCAKKzB4MzRhNWYwMTAsIDB4ODAwM2Q1ZiwgMHgwLCAweDhlZTIwNTAwLCAKKzB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyMDUwMCwgCisweDI0NDIwMDAxLCAweGFlZTIwNTAwLCAweDhlZTIwNTAwLCAweDIxMDgwLCAKKzB4NTcxMDIxLCAweGFjNDkwNTA4LCAweDhlZTI1MjNjLCAweDQ5MTAyMSwgCisweDMwNDIwMGZmLCAweGFlZTI1MjNjLCAweDhlZTM1MjNjLCAweDhlZTI1MjM4LCAKKzB4MTQ2MjAwMDUsIDB4MCwgMHg4ZjgyMDA2MCwgMHgyNDAzZmVmZiwgCisweDQzMTAyNCwgMHhhZjgyMDA2MCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwMjAsIDB4OGY4MjAxMjAsIDB4OGVlMzRlMzQsIDB4OGY4MjAxMjQsIAorMHg4Zjg2MDEyOCwgMHgyNDAyMDA0MCwgMHgyNDYzMDAwMSwgMHg1MDYyMDAwMywgCisweDEwMjEsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzQsIAorMHg4ZWUyNGUzNCwgMHg4ZWU0NGUzNCwgMHg4ZWUzNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDE0ODMwMDA3LCAweDJlMjI4MjEsIDB4OGY4MjAxMjgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4MDAzZDkyLCAKKzB4YWNhMDAwMDAsIDB4OGVlMjRlMzQsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIAorMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAKKzB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjgyMSwgMHg4Y2EyMDAwNCwgCisweDhmODMwMTI4LCAweDIxMTQwLCAweDYyMTgyMSwgMHhhZjgzMDEyOCwgCisweGFjYTAwMDAwLCAweDhjYzIwMDE4LCAweDI0NDNmZmZlLCAweDJjNjIwMDEyLCAKKzB4MTA0MDAwMDgsIDB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAKKzB4OGMyMjU4ZjAsIDB4NDAwMDA4LCAweDAsIDB4MjQwMjAwMDEsIAorMHhhZWUyNGUyNCwgMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmYzgsIAorMHhhZmJmMDAzMCwgMHhhZmI1MDAyYywgMHhhZmI0MDAyOCwgMHhhZmIzMDAyNCwgCisweGFmYjIwMDIwLCAweGFmYjEwMDFjLCAweGFmYjAwMDE4LCAweDhmODMwMTI4LCAKKzB4OGY4MjAxMjQsIDB4MTA2MjAyYjAsIDB4OTgyMSwgMHgzYzExMDAxZiwgCisweDM2MzFmZmZmLCAweDNjMTJmZmY1LCAweDM2NTIxMDAwLCAweDI0MTUwMDEyLCAKKzB4MjQxNDAwNDAsIDB4OGY4YzAxMjgsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIAorMHhhZjgyMDEyOCwgMHg5MTgyMDAxYiwgMHg4ZjgzMDEyOCwgMHgyNDQzZmZmZSwgCisweDJjNjIwMDEyLCAweDEwNDAwMjljLCAweDMxMDgwLCAweDNjMDEwMDAxLCAKKzB4MjIwODIxLCAweDhjMjI1OTQ4LCAweDQwMDAwOCwgMHgwLCAKKzB4OGY0MjAyMTgsIDB4MzA0MjAxMDAsIDB4MTA0MDAwMDcsIDB4MCwgCisweDk1ODMwMDE2LCAweDk1ODIwMDE4LCAweDYyMTgyMywgMHgzMTQwMiwgCisweDQzMTAyMSwgMHhhNTgyMDAxNiwgMHg4ZDgyMDAxYywgMHgzYzAzODAwMCwgCisweDMwNDRmZmZmLCAweDQzNjgyNCwgMHgzYzAzMDgwMCwgMHg0MzE4MjQsIAorMHgxMWEwMDAwNCwgMHhhZDg0MDAxYywgMHg0MTE0MCwgMHg4MDAzZGQ4LCAKKzB4MjQ0MjUyNDgsIDB4NDExNDAsIDB4MjQ0MjBlMjAsIDB4MmUyNTgyMSwgCisweDk1NjIwMDBlLCAweDMwNDJmZmZjLCAweDEwNjAwMDA0LCAweGE1NjIwMDBlLCAKKzB4OTU4NDAwMTYsIDB4ODAwM2VjMCwgMHgwLCAweDhkNjkwMDE4LCAKKzB4NDAyMSwgMHg5NTJhMDAwMCwgMHgyNTI5MDAwMiwgMHg5NTI3MDAwMCwgCisweDI1MjkwMDAyLCAweDk1MjYwMDAwLCAweDI1MjkwMDAyLCAweDk1MjUwMDAwLCAKKzB4MjUyOTAwMDIsIDB4OTUyNDAwMDAsIDB4MjUyOTAwMDIsIDB4OTUyMzAwMDAsIAorMHgyNTI5MDAwMiwgMHg5NTIyMDAwMCwgMHgyNTI5MDAwMiwgMHgxNDc1MDIxLCAKKzB4MTQ2NTAyMSwgMHgxNDU1MDIxLCAweDE0NDUwMjEsIDB4MTQzNTAyMSwgCisweDE0MjUwMjEsIDB4YTFjMDIsIDB4MzE0MmZmZmYsIDB4NjI1MDIxLCAKKzB4YTFjMDIsIDB4MzE0MmZmZmYsIDB4NjI1MDIxLCAweDk2ZTIwNDZhLCAKKzB4MzE0ZWZmZmYsIDB4MzA0MjAwMDIsIDB4MTA0MDAwNDQsIDB4NTAyMSwgCisweDI1MjIwMDE0LCAweDIyMjEwMmIsIDB4MTA0MDAwMTQsIDB4MTIwMTgyMSwgCisweDI0MDUwMDBhLCAweDIwMjEsIDB4MjIzMTAyYiwgMHg1NDQwMDAwMSwgCisweDcyMTgyMSwgMHg5NDYyMDAwMCwgMHgyNDYzMDAwMiwgMHgyNGE1ZmZmZiwgCisweDE0YTBmZmY5LCAweDgyMjAyMSwgMHg0MWMwMiwgMHgzMDgyZmZmZiwgCisweDYyMjAyMSwgMHg0MTQwMiwgMHgzMDgzZmZmZiwgMHg0MzEwMjEsIAorMHgzMDQyZmZmZiwgMHg4MDAzZTMzLCAweDE0MjUwMjEsIDB4OTUyYTAwMDAsIAorMHgyNTI5MDAwMiwgMHg5NTI4MDAwMCwgMHgyNTI5MDAwMiwgMHg5NTI3MDAwMCwgCisweDI1MjkwMDAyLCAweDk1MjYwMDAwLCAweDI1MjkwMDAyLCAweDk1MjUwMDAwLCAKKzB4MjUyOTAwMDIsIDB4OTUyMzAwMDAsIDB4MjUyOTAwMDIsIDB4OTUyMjAwMDAsIAorMHgyNTI5MDAwMiwgMHg5NTI0MDAwMCwgMHgyNTI5MDAwMiwgMHgxNDg1MDIxLCAKKzB4MTQ3NTAyMSwgMHgxNDY1MDIxLCAweDE0NTUwMjEsIDB4MTQzNTAyMSwgCisweDE0MjUwMjEsIDB4OTUyMjAwMDAsIDB4OTUyMzAwMDIsIDB4MTQ0NTAyMSwgCisweDE0MjUwMjEsIDB4MTQzNTAyMSwgMHhhMWMwMiwgMHgzMTQyZmZmZiwgCisweDYyNTAyMSwgMHhhMWMwMiwgMHgzMTQyZmZmZiwgMHg2MjUwMjEsIAorMHgzMTQ4ZmZmZiwgMHg1MTAwMDAwMSwgMHgzNDA4ZmZmZiwgMHg4ZDYyMDAxOCwgCisweDk0NDMwMDBjLCAweDI0MDIwODAwLCAweDU0NjIwMDA1LCAweGE1NjgwMDEwLCAKKzB4OTU2MjAwMGUsIDB4MzQ0MjAwMDIsIDB4YTU2MjAwMGUsIDB4YTU2ODAwMTAsIAorMHg5NmUyMDQ2YSwgMHgyODIxLCAweDMwNDIwMDA4LCAweDE0NDAwMDU2LCAKKzB4MzAyMSwgMHg4ZDYzMDAxOCwgMHgyNDYyMDAyNCwgMHgyMjIxMDJiLCAKKzB4MTA0MDAwMzQsIDB4MjQ2OTAwMTAsIDB4MjI5MTAyYiwgMHg1NDQwMDAwMSwgCisweDEzMjQ4MjEsIDB4OTUyNTAwMDAsIDB4MjQ2OTAwMTQsIDB4MjI5MTAyYiwgCisweDEwNDAwMDAyLCAweDI0YTVmZmVjLCAweDEzMjQ4MjEsIDB4OTUyMjAwMDAsIAorMHgzMDQyMGZmZiwgMHgxNDQwMDAwMywgMHgyNTI5MDAwMiwgMHg4MDAzZTYwLCAKKzB4MjQxMzAwMDEsIDB4OTgyMSwgMHhhMDMwMjEsIDB4MjI5MTAyYiwgCisweDU0NDAwMDAxLCAweDEzMjQ4MjEsIDB4OTEyMjAwMDEsIDB4MjUyOTAwMDIsIAorMHhhMjI4MjEsIDB4MjI5MTAyYiwgMHg1NDQwMDAwMSwgMHgxMzI0ODIxLCAKKzB4MjUyOTAwMDIsIDB4MjI5MTAyYiwgMHg1NDQwMDAwMSwgMHgxMzI0ODIxLCAKKzB4OTUyMjAwMDAsIDB4MjUyOTAwMDIsIDB4YTIyODIxLCAweDIyOTEwMmIsIAorMHg1NDQwMDAwMSwgMHgxMzI0ODIxLCAweDk1MjIwMDAwLCAweDI1MjkwMDAyLCAKKzB4YTIyODIxLCAweDIyOTEwMmIsIDB4NTQ0MDAwMDEsIDB4MTMyNDgyMSwgCisweDk1MjIwMDAwLCAweDI1MjkwMDAyLCAweGEyMjgyMSwgMHgyMjkxMDJiLCAKKzB4NTQ0MDAwMDEsIDB4MTMyNDgyMSwgMHg5NTIyMDAwMCwgMHg4MDAzZTk5LCAKKzB4YTIyODIxLCAweDk0NjUwMDEwLCAweDk0NjIwMDE0LCAweDI0NjkwMDE2LCAKKzB4MzA0MjBmZmYsIDB4MTQ0MDAwMDMsIDB4MjRhNWZmZWMsIDB4ODAwM2U4YywgCisweDI0MTMwMDAxLCAweDk4MjEsIDB4YTAzMDIxLCAweDkxMjMwMDAxLCAKKzB4MjUyOTAwMDQsIDB4OTUyMjAwMDAsIDB4MjUyOTAwMDIsIDB4OTUyNDAwMDAsIAorMHgyNTI5MDAwMiwgMHhhMzI4MjEsIDB4YTIyODIxLCAweDk1MjIwMDAwLCAKKzB4OTUyMzAwMDIsIDB4YTQyODIxLCAweGEyMjgyMSwgMHhhMzI4MjEsIAorMHg1MWMwMiwgMHgzMGEyZmZmZiwgMHg2MjI4MjEsIDB4NTFjMDIsIAorMHgzMGEyZmZmZiwgMHg2MjI4MjEsIDB4OTZlMjA0NmEsIDB4MzA0MjAwMDEsIAorMHgxMDQwMDAxZSwgMHgyMDIxLCAweDk1ODIwMDE2LCAweDRlMjAyMywgCisweDQxNDAyLCAweDgyMjAyMSwgMHgzMjYyMDBmZiwgMHg1MDQwMDAwMiwgCisweDg2MjAyMSwgMHg4NTIwMjEsIDB4NDE0MDIsIDB4ODIyMDIxLCAKKzB4MzA4NGZmZmYsIDB4NTA4MDAwMDEsIDB4MzQwNGZmZmYsIDB4OGQ2MjAwMTgsIAorMHgyNDQzMDAxNywgMHgyMjMxMDJiLCAweDU0NDAwMDAxLCAweDcyMTgyMSwgCisweDkwNjIwMDAwLCAweDM4NDMwMDExLCAweDJjNjMwMDAxLCAweDM4NDIwMDA2LCAKKzB4MmM0MjAwMDEsIDB4NjIxODI1LCAweDEwNjAwMDA0LCAweDAsIAorMHg5NTYyMDAwZSwgMHgzNDQyMDAwMSwgMHhhNTYyMDAwZSwgMHg5NTYyMDAwZSwgCisweDI0MGEwMDAyLCAweDMwNDIwMDA0LCAweDEwNDAwMDAyLCAweGE1NjQwMDEyLCAKKzB4MjQwYTAwMDQsIDB4OGY4ODAxMjAsIDB4Mjc2MjM4MDAsIDB4MjUwOTAwMjAsIAorMHgxMjIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjkzMDAwLCAweDhmODIwMTI4LCAKKzB4MTEyMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgMHgxNTIyMDAwNywgCisweDI0MDQwMDIwLCAweDhlZTIwMWE0LCAweDgwMjEsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFhNCwgMHg4MDAzZjRmLCAweDhlZTIwMWE0LCAweDhlZTU3MjRjLCAKKzB4OGVlNjA0OTAsIDB4OGVlNzA0OTQsIDB4YWQwYjAwMDgsIDB4YTUwNDAwMGUsIAorMHhhZDBhMDAxOCwgMHg1Mjk0MCwgMHhhMDE4MjEsIDB4MTAyMSwgCisweGUzMzgyMSwgMHhlMzIwMmIsIDB4YzIzMDIxLCAweGM0MzAyMSwgCisweGFkMDYwMDAwLCAweGFkMDcwMDA0LCAweDhlZTI3MjRjLCAweDRkMTAyNSwgCisweGFkMDIwMDFjLCAweDhlZTIwNGM0LCAweGFkMDIwMDEwLCAweGFmODkwMTIwLCAKKzB4OTJlMjRlMjAsIDB4MTQ0MDAwNjAsIDB4MjQxMDAwMDEsIDB4MjU0M2ZmZWUsIAorMHgyYzYzMDAwMiwgMHgzOTQyMDAxMSwgMHgyYzQyMDAwMSwgMHg2MjE4MjUsIAorMHgxMDYwMDAyNCwgMHgwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAKKzB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDU1MDAwZiwgCisweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMGIsIAorMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAKKzB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA1NDAwMmIsIAorMHgwLCAweDgwMDNmMmUsIDB4MCwgMHg4ZWUyNGUzMCwgCisweDI0NDIwMDAxLCAweDUwNTQwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIAorMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDEsIDB4ODAwM2Y0ZSwgCisweGFjOTUwMDAwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAwNywgMHgxNDYyMDAxZiwgCisweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIAorMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAKKzB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA1NDAwMDcsIAorMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAKKzB4MCwgMHg4MDAzZjNhLCAweDAsIDB4MTQ2MDAwMDUsIAorMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAKKzB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTIsIAorMHhhYzgwMDAwMCwgMHg4MDAzZjRmLCAweDAsIDB4OGVlMjRlMzAsIAorMHgyNDQyMDAwMSwgMHg1MDU0MDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIAorMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA3LCAweGFjODIwMDAwLCAKKzB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTYwMDAwMGQsIDB4MCwgCisweDhmODIwMTIwLCAweDNjMDQwMDAxLCAweDI0ODQ1OTM4LCAweGFmYTAwMDE0LCAKKzB4YWZhMjAwMTAsIDB4OGQ4NjAwMWMsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDgsIAorMHhjMDAyNDAzLCAweDM0YTUwMDAxLCAweDgwMDQwNTcsIDB4MCwgCisweDhlZTI3MjRjLCAweDI0NDIwMDAxLCAweDMwNDIwN2ZmLCAweDExYTAwMDA2LCAKKzB4YWVlMjcyNGMsIDB4OGVlMjAxZDAsIDB4MjQ0MmZmZmYsIDB4YWVlMjAxZDAsIAorMHg4MDAzZjZiLCAweDhlZTIwMWQwLCAweDhlZTIwMWNjLCAweDI0NDJmZmZmLCAKKzB4YWVlMjAxY2MsIDB4OGVlMjAxY2MsIDB4OGVlMjAxZDgsIDB4MjQ0MmZmZmYsIAorMHhhZWUyMDFkOCwgMHg4MDA0MDU3LCAweDhlZTIwMWQ4LCAweDhmNDIwMjQwLCAKKzB4MTA0MDAwZTUsIDB4MCwgMHg4ZWUyMGUxYywgMHgyNDQyMDAwMSwgCisweDgwMDQwNTcsIDB4YWVlMjBlMWMsIDB4OTU4MjAwMWUsIDB4YWQ4MjAwMWMsIAorMHg4ZjQyMDI0MCwgMHgxMDQwMDA3MiwgMHgwLCAweDhlZTIwZTFjLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjBlMWMsIDB4OGY0MzAyNDAsIDB4NDMxMDJiLCAKKzB4MTQ0MDAwZDUsIDB4MCwgMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgCisweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgCisweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIAorMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAweDgwMjEsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAzZmRhLCAweDhlZTIwMWE0LCAKKzB4OGVlMjcyNGMsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTgsIDB4OGVlNTA0YWMsIAorMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwgCisweDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAKKzB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIAorMHgxNDQwMDAzNCwgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ1NTAwMWYsIAorMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAKKzB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgCisweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNTQwMDA3LCAKKzB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgCisweDAsIDB4ODAwM2ZjNiwgMHgwLCAweDE0NjAwMDA1LCAKKzB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgCisweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDExLCAKKzB4YWM4MDAwMDAsIDB4ODAwM2ZkYSwgMHgwLCAweDhlZTI0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4NTA1NDAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgCisweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAKKzB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwMSwgMHhhYzk1MDAwMCwgCisweGFjODIwMDA0LCAweDU2MDAwMDBiLCAweDI0MTAwMDAxLCAweDhlZTI3MjRjLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDU4YTgsIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIAorMHg4ZWU2NzI0YywgMHg4ZjQ3MDI4MCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAKKzB4MzRhNWYwMDgsIDB4NTYwMDAwMDEsIDB4YWVlMDBlMWMsIDB4OGVlMjAxODgsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDE4OCwgMHg4MDA0MDUwLCAweDhlZTIwMTg4LCAKKzB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAKKzB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIAorMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsIAorMHg4ZWUyMDFhNCwgMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAKKzB4ODAwNDA0NCwgMHg4ZWUyMDFhNCwgMHg4ZWUyNzI0YywgMHhhYzYyMDAxYywgCisweDhlZTQwNGE4LCAweDhlZTUwNGFjLCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAKKzB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIAorMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgCisweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDM0LCAweDI0MTAwMDAxLCAKKzB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgCisweDhjODIwMDAwLCAweDE0NTUwMDFmLCAweDAsIDB4OGVlMzRlMzAsIAorMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LCAKKzB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIAorMHgyNDQyMDAwMSwgMHgxMDU0MDAwNywgMHgwLCAweDhlZTI0ZTM0LCAKKzB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDA0MDMwLCAKKzB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAKKzB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIAorMHgyYzQyMDAxMSwgMHg1MDQwMDAxMSwgMHhhYzgwMDAwMCwgMHg4MDA0MDQ0LCAKKzB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDU0MDAwMywgCisweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4MjQwMjAwMDEsIDB4YWM5NTAwMDAsIDB4YWM4MjAwMDQsIDB4MTYwMDAwMGIsIAorMHgwLCAweDhlZTI3MjRjLCAweDNjMDQwMDAxLCAweDI0ODQ1OGE4LCAKKzB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIDB4OGVlNjcyNGMsIDB4OGY0NzAyODAsIAorMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDA4LCAweDhlZTIwMTc0LCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxNzQsIDB4ODAwNDA1NywgMHg4ZWUyMDE3NCwgCisweDI0MDIwMDAxLCAweGFlZTI0ZTI0LCAweDhmODMwMTI4LCAweDhmODIwMTI0LCAKKzB4MTQ2MmZkNTgsIDB4MCwgMHg4ZmJmMDAzMCwgMHg4ZmI1MDAyYywgCisweDhmYjQwMDI4LCAweDhmYjMwMDI0LCAweDhmYjIwMDIwLCAweDhmYjEwMDFjLCAKKzB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAzOCwgMHgyN2JkZmZlOCwgCisweDI3ODQwMjA4LCAweDI3NDUwMjAwLCAweDI0MDYwMDA4LCAweGFmYmYwMDE0LCAKKzB4YzAwMjQ5YSwgMHhhZmIwMDAxMCwgMHgyMDIxLCAweDI0MTAwMDAxLCAKKzB4MjQwMjI0MWYsIDB4YWY5MDAyMTAsIDB4YWY5MDAyMDAsIDB4YWY4MDAyMDQsIAorMHhhZjgyMDIxNCwgMHg4ZjQ2MDI0OCwgMHgyNDAzMDAwNCwgMHgzYzAyMDA0MCwgCisweDNjMDEwMDAxLCAweGFjMjM1Y2M0LCAweDNjMDEwMDAxLCAweGFjMjM1Y2M4LCAKKzB4M2MwMTAwMDEsIDB4YWMyMDVkOWMsIDB4M2MwMTAwMDEsIDB4YWMyMjVjYzAsIAorMHgzYzAxMDAwMSwgMHhhYzIzNWNjOCwgMHhjMDA1MTA4LCAweDI0MDUwMDA0LCAKKzB4YzAwNDgyMiwgMHgwLCAweDhlZTIwMDAwLCAweDNjMDNmZWZmLCAKKzB4MzQ2M2ZmZmQsIDB4NDMxMDI0LCAweGFlZTIwMDAwLCAweDNjMDIzYzAwLCAKKzB4YWY4MjAyMWMsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMzA4M2FjLCAKKzB4OGZiZjAwMTQsIDB4OGZiMDAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAxOCwgCisweDI3YmRmZmUwLCAweDNjMDUwMDA4LCAweDM0YTUwNDAwLCAweGFmYmYwMDE4LCAKKzB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAyMDAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTlmMCwgMHhjMDAyNDAzLCAweDM4MjEsIDB4OGVlMjAyODAsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDI4MCwgMHg4ZWUyMDI4MCwgMHg4ZjgzMDIwMCwgCisweDNjMDIzZjAwLCAweDYyMTgyNCwgMHg4ZmJmMDAxOCwgMHgzYzAyMDQwMCwgCisweDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjAsIAorMHhhZmIxMDAxYywgMHhhZmIwMDAxOCwgMHg4ZjkwMDIyMCwgMHg4ZWUyMDIxNCwgCisweDM4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAyMTQsIDB4OGVlMjAyMTQsIAorMHgzYzAyMDMwMCwgMHgyMDIxMDI0LCAweDEwNDAwMDI3LCAweDNjMTEwNDAwLCAKKzB4YzAwNDI5YiwgMHgwLCAweDNjMDIwMTAwLCAweDIwMjEwMjQsIAorMHgxMDQwMDAwNywgMHgwLCAweDhlZTIwMjE4LCAweDI0NDIwMDAxLCAKKzB4YWVlMjAyMTgsIDB4OGVlMjAyMTgsIDB4ODAwNDBjNiwgMHgzYzAzZmRmZiwgCisweDhlZTIwMjFjLCAweDI0NDIwMDAxLCAweGFlZTIwMjFjLCAweDhlZTIwMjFjLCAKKzB4M2MwM2ZkZmYsIDB4MzQ2M2ZmZmYsIDB4M2MwODA4ZmYsIDB4MzUwOGZmZmYsIAorMHg4ZWUyMDAwMCwgMHgzYzA0MDAwMSwgMHgyNDg0NTlmYywgMHgzYzA1MDAwOCwgCisweDIwMDMwMjEsIDB4NDMxMDI0LCAweGFlZTIwMDAwLCAweDhmODIwMjIwLCAKKzB4MzgyMSwgMHgzYzAzMDMwMCwgMHg0ODEwMjQsIDB4NDMxMDI1LCAKKzB4YWY4MjAyMjAsIDB4YWZhMDAwMTAsIDB4YzAwMjQwMywgMHhhZmEwMDAxNCwgCisweDgwMDQyOTYsIDB4MCwgMHgyMTExMDI0LCAweDEwNDAwMDFmLCAKKzB4M2MwMjQwMDAsIDB4OGY4MzAyMjQsIDB4MjQwMjE0MDIsIDB4MTQ2MjAwMGIsIAorMHgzYzAzZmRmZiwgMHgzYzA0MDAwMSwgMHgyNDg0NWEwOCwgMHgzYzA1MDAwOCwgCisweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMjI0LCAweDM0YTVmZmZmLCAKKzB4YzAwMjQwMywgMHgzODIxLCAweDNjMDNmZGZmLCAweDhlZTIwMDAwLCAKKzB4MzQ2M2ZmZmYsIDB4MjAwMjAyMSwgMHg0MzEwMjQsIDB4YzAwNGU1NCwgCisweGFlZTIwMDAwLCAweDhlZTIwMjIwLCAweDI0NDIwMDAxLCAweGFlZTIwMjIwLCAKKzB4OGVlMjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsIAorMHg0MzEwMjQsIDB4ODAwNDI5NSwgMHg1MTEwMjUsIDB4MjAyMTAyNCwgCisweDEwNDAwMTQyLCAweDAsIDB4OGVlMjAyMmMsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDIyYywgMHg4ZWUyMDIyYywgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgCisweDM0NjNmZmZmLCAweDQzMTAyNCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgCisweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDQxMGUsIDB4MjQ2MzAwMDIsIAorMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDMsIDB4MTQ0MGZmZmMsIAorMHgwLCAweDhmODYwMGUwLCAweDhmODQwMGU0LCAweDMwYzIwMDA3LCAKKzB4MTA0MDAwMTIsIDB4MCwgMHg4ZjgzMDBlNCwgMHgyNDAyZmZmOCwgCisweGMyMTAyNCwgMHgxMDQzMDAwZCwgMHgwLCAweDhmODIwMDU0LCAKKzB4OGY4MzAwZTAsIDB4MTRjMzAwMDksIDB4MjQ0NDAwNTAsIDB4OGY4MjAwNTQsIAorMHg4MjEwMjMsIDB4MmM0MjAwNTEsIDB4MTA0MDAwMDQsIDB4MCwgCisweDhmODIwMGUwLCAweDEwYzJmZmY5LCAweDAsIDB4OGY4MjAyMjAsIAorMHgzYzAzMDhmZiwgMHgzNDYzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsIAorMHg4Zjg2MDBlMCwgMHgzMGMyMDAwNywgMHgxMDQwMDAwMywgMHgyNDAyZmZmOCwgCisweGMyMzAyNCwgMHhhZjg2MDBlMCwgMHg4ZjgzMDBjNCwgMHgzYzAyMDAxZiwgCisweDM0NDJmZmZmLCAweDI0NjgwMDA4LCAweDQ4MTAyYiwgMHgxMDQwMDAwMywgCisweDNjMDJmZmY1LCAweDM0NDIxMDAwLCAweDEwMjQwMjEsIDB4OGY4YjAwYzgsIAorMHg4Zjg1MDEyMCwgMHg4Zjg0MDEyNCwgMHg4MDA0MTQ1LCAweDYwMjEsIAorMHgyNzYyMzgwMCwgMHg4MjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NDMwMDAsIAorMHgxMGE0MDAxMCwgMHgzMTgyMDBmZiwgMHg4YzgyMDAxOCwgMHgzODQzMDAwNywgCisweDJjNjMwMDAxLCAweDM4NDIwMDBiLCAweDJjNDIwMDAxLCAweDYyMTgyNSwgCisweDUwNjBmZmYzLCAweDI0ODQwMDIwLCAweDhlZTIwMjQwLCAweDI0MGMwMDAxLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAyNDAsIDB4OGVlMjAyNDAsIDB4OGM4YjAwMDgsIAorMHgzMTgyMDBmZiwgMHgxNDQwMDA2NSwgMHgwLCAweDNjMDIwMDAxLCAKKzB4NTcxMDIxLCAweDkwNDI4M2MwLCAweDE0NDAwMDYwLCAweDAsIAorMHg4Zjg0MDBlNCwgMHhjNDEwMjMsIDB4MjE4YzMsIDB4NDYyMDAwMSwgCisweDI0NjMwMjAwLCAweDhmODkwMGM0LCAweDEwNjAwMDA1LCAweDI0MDIwMDAxLCAKKzB4MTA2MjAwMDksIDB4MCwgMHg4MDA0MTg3LCAweDAsIAorMHg4ZWUyMDIzMCwgMHgxMjA1ODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMjMwLCAKKzB4ODAwNDFiYywgMHg4ZWUyMDIzMCwgMHg4ZWUyMDIzNCwgMHgzYzA1MDAwYSwgCisweDI0NDIwMDAxLCAweGFlZTIwMjM0LCAweDhjOGIwMDAwLCAweDM0YTVmMDAwLCAKKzB4OGVlMjAyMzQsIDB4MTJiMTgyMywgMHhhMzEwMmIsIDB4NTQ0MDAwMDEsIAorMHg2NTE4MjEsIDB4MmM2MjIzM2YsIDB4MTQ0MDAwNDAsIDB4MCwgCisweDhmODIwMGU4LCAweDI0NDIwMDA4LCAweGFmODIwMGU4LCAweDhmODIwMGU4LCAKKzB4OGY4MjAwZTQsIDB4MTIwNTgyMSwgMHgyNDQyMDAwOCwgMHhhZjgyMDBlNCwgCisweDgwMDQxYmMsIDB4OGY4MjAwZTQsIDB4OGVlMjAyMzgsIDB4M2MwMzAwMGEsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDIzOCwgMHg4Yzg0MDAwMCwgMHgzNDYzZjAwMCwgCisweDhlZTIwMjM4LCAweDg4MzgyMywgMHg2NzEwMmIsIDB4NTQ0MDAwMDEsIAorMHhlMzM4MjEsIDB4M2MwMjAwMDMsIDB4MzQ0MjBkNDAsIDB4NDcxMDJiLCAKKzB4MTA0MDAwMDMsIDB4MCwgMHg4MDA0MWJjLCAweDgwNTgyMSwgCisweDhmODIwMGU0LCAweDI0NDQwMDA4LCAweGFmODQwMGU0LCAweDhmODQwMGU0LCAKKzB4MTA4NjAwMTgsIDB4M2MwNTAwMGEsIDB4MzRhNWYwMDAsIDB4M2MwYTAwMDMsIAorMHgzNTRhMGQ0MCwgMHg4ZWUyMDA3YywgMHgyNDQyMDAwMSwgMHhhZWUyMDA3YywgCisweDhjODMwMDAwLCAweDhlZTIwMDdjLCAweDY4MzgyMywgMHhhNzEwMmIsIAorMHg1NDQwMDAwMSwgMHhlNTM4MjEsIDB4MTQ3MTAyYiwgMHg1NDQwMDAwNywgCisweDYwNTgyMSwgMHg4ZjgyMDBlNCwgMHgyNDQ0MDAwOCwgMHhhZjg0MDBlNCwgCisweDhmODQwMGU0LCAweDE0ODZmZmVmLCAweDAsIDB4MTQ4NjAwMDUsIAorMHgwLCAweDEyMDU4MjEsIDB4YWY4NjAwZTQsIDB4ODAwNDFiYywgCisweGFmODYwMGU4LCAweGFmODQwMGU0LCAweGFmODQwMGU4LCAweDhmODIwMGM4LCAKKzB4M2MwMzAwMGEsIDB4MzQ2M2YwMDAsIDB4NDgzODIzLCAweDY3MTAyYiwgCisweDU0NDAwMDAxLCAweGUzMzgyMSwgMHgzYzAyMDAwMywgMHgzNDQyMGQzZiwgCisweDQ3MTAyYiwgMHg1NDQwMDAwNywgMHg2MDIxLCAweDE2ODM4MjMsIAorMHg2NzEwMmIsIDB4NTQ0MDAwMDMsIDB4ZTMzODIxLCAweDgwMDQxY2YsIAorMHgzYzAyMDAwMywgMHgzYzAyMDAwMywgMHgzNDQyMGQzZiwgMHg0NzEwMmIsIAorMHgxNDQwMDAxNiwgMHgzMTgyMDBmZiwgMHgxNDQwMDAwNiwgMHgwLCAKKzB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2MwLCAweDEwNDAwMDBmLCAKKzB4MCwgMHg4ZWUyMDIzYywgMHgzYzA0ZmRmZiwgMHg4ZWUzMDAwMCwgCisweDM0ODRmZmZmLCAweDI0NDIwMDAxLCAweGFlZTIwMjNjLCAweDhlZTIwMjNjLCAKKzB4MjQwMjAwMDEsIDB4NjQxODI0LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgCisweGEwMjI4M2I4LCAweDgwMDQyMmMsIDB4YWVlMzAwMDAsIDB4YWY4YjAwYzgsIAorMHg4ZjgzMDBjOCwgMHg4ZjgyMDBjNCwgMHgzYzA0MDAwYSwgMHgzNDg0ZjAwMCwgCisweDYyMzgyMywgMHg4NzEwMmIsIDB4NTQ0MDAwMDEsIDB4ZTQzODIxLCAKKzB4M2MwMjAwMDMsIDB4MzQ0MjBkNDAsIDB4NDcxMDJiLCAweDJjZTMwMDAxLCAKKzB4NDMxMDI1LCAweDEwNDAwMDA4LCAweDAsIDB4OGY4MjAyMjAsIAorMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4M2MwMzQwMDAsIAorMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4OGY4NjAwZTAsIDB4OGY4NDAwZTQsIAorMHgxMGM0MDAyYSwgMHgwLCAweDhlZTIwMDdjLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAwN2MsIDB4OGVlMjAwN2MsIDB4MjRjMmZmZjgsIDB4YWY4MjAwZTAsIAorMHgzYzAyMDAwMSwgMHg4YzQyN2UzMCwgMHgzYzAzMDAwOCwgMHg4Zjg2MDBlMCwgCisweDQzMTAyNCwgMHgxMDQwMDAxZCwgMHgwLCAweDEwYzQwMDFiLCAKKzB4MjQwZGZmZjgsIDB4M2MwYTAwMGEsIDB4MzU0YWYwMDAsIDB4M2MwYzAwODAsIAorMHgyNDg1MDAwOCwgMHgyNzYyMjgwMCwgMHg1MGEyMDAwMSwgMHgyNzY1MTgwMCwgCisweDhjODgwMDA0LCAweDhjODIwMDAwLCAweDhjYTkwMDAwLCAweDMxMDNmZmZmLCAKKzB4NDMxMDIxLCAweDRkMTAyNCwgMHgyNDQzMDAxMCwgMHg2YjEwMmIsIAorMHg1NDQwMDAwMSwgMHg2YTE4MjEsIDB4MTJiMTAyYiwgMHg1NDQwMDAwMSwgCisweDEyYTQ4MjEsIDB4MTA2OTAwMDIsIDB4MTBjMTAyNSwgMHhhYzgyMDAwNCwgCisweGEwMjAyMSwgMHgxNGM0ZmZlYiwgMHgyNDg1MDAwOCwgMHg4ZjgyMDIyMCwgCisweDNjMDMwOGZmLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgMHgzNDQyMDAwMiwgCisweGFmODIwMjIwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDQyMzcsIAorMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsIAorMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAKKzB4MzQ2M2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAweDYwMTAwNTUsIAorMHgwLCAweDhlZTIwMjI4LCAweDI0NDIwMDAxLCAweGFlZTIwMjI4LCAKKzB4OGVlMjAyMjgsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsIAorMHg0MzEwMjQsIDB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4OGY4MzAwNTQsIAorMHg4ZjgyMDA1NCwgMHg4MDA0MjUxLCAweDI0NjMwMDAyLCAweDhmODIwMDU0LCAKKzB4NjIxMDIzLCAweDJjNDIwMDAzLCAweDE0NDBmZmZjLCAweDAsIAorMHg4Zjg2MDBlMCwgMHgzMGMyMDAwNywgMHgxMDQwMDAxMiwgMHgwLCAKKzB4OGY4MzAwZTQsIDB4MjQwMmZmZjgsIDB4YzIxMDI0LCAweDEwNDMwMDBkLCAKKzB4MCwgMHg4ZjgyMDA1NCwgMHg4ZjgzMDBlMCwgMHgxNGMzMDAwOSwgCisweDI0NDQwMDMyLCAweDhmODIwMDU0LCAweDgyMTAyMywgMHgyYzQyMDAzMywgCisweDEwNDAwMDA0LCAweDAsIDB4OGY4MjAwZTAsIDB4MTBjMmZmZjksIAorMHgwLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZkLCAKKzB4NDMxMDI0LCAweGFmODIwMjIwLCAweDhmODYwMGUwLCAweDMwYzIwMDA3LCAKKzB4MTA0MDAwMDMsIDB4MjQwMmZmZjgsIDB4YzIzMDI0LCAweGFmODYwMGUwLCAKKzB4MjQwMzAxZjUsIDB4OGY4MjAwZTgsIDB4NjczODIzLCAweDcxOGMwLCAKKzB4NDMxMDIxLCAweGFmODIwMGU4LCAweDhmODIwMGU4LCAweGFmODIwMGU0LCAKKzB4OGVlMjAwN2MsIDB4M2MwNDA4ZmYsIDB4MzQ4NGZmZmYsIDB4NDcxMDIxLCAKKzB4YWVlMjAwN2MsIDB4OGY4MjAyMjAsIDB4M2MwMzgwMDAsIDB4MzQ2MzAwMDIsIAorMHg0NDEwMjQsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAweDhmODMwMDU0LCAKKzB4OGY4MjAwNTQsIDB4ODAwNDI4ZCwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgCisweDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLCAKKzB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmIsIDB4NDMxMDI0LCAKKzB4YWY4MjAyMjAsIDB4OGZiZjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIAorMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDNjMDIwMDAxLCAweDhjNDI1Y2Q4LCAKKzB4MjdiZGZmZDgsIDB4MTA0MDAwMTIsIDB4YWZiZjAwMjAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWExNCwgMHgzYzA1MDAwOCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhYzIyODNhYywgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgCisweDhmODYwMjIwLCAweDM0YTUwNDk4LCAweDNjMDEwMDAxLCAweGFjMjA1Y2Q4LCAKKzB4M2MwMTAwMDEsIDB4YWMyMjVjY2MsIDB4YzAwMjQwMywgMHgzODIxLCAKKzB4OGY0MjAyNjgsIDB4M2MwMzdmZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4YWY0MjAyNjgsIDB4OGVlMjA0ZDAsIDB4OGVlNDA0ZDQsIDB4MjQwM2ZmZmUsIAorMHg0MzEwMjQsIDB4MzA4NDAwMDIsIDB4MTA4MDAxMWUsIDB4YWVlMjA0ZDAsIAorMHg4ZWUyMDRkNCwgMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWVlMjA0ZDQsIAorMHg4ZjgyMDA0NCwgMHgzYzAzMDYwMCwgMHgzNDYzMjAwMCwgMHgzNDQyMDAyMCwgCisweGFmODIwMDQ0LCAweGFmYTMwMDE4LCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LCAKKzB4MjQ0MjAwMDEsIDB4MzA0YTAwZmYsIDB4NTE0MzAwZmUsIDB4YWZhMDAwMTAsIAorMHg4ZWUyMDYwOCwgMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsIAorMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIAorMHgxMDQwMDA2YSwgMHg1ODIxLCAweDI0MTgwMDA4LCAweDI0MGYwMDBkLCAKKzB4MjQwZDAwMDcsIDB4MjQwYzAwNDAsIDB4MjQwZTAwMDEsIDB4OGY4NzAxMjAsIAorMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAKKzB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwgCisweDhmODIwMTI0LCAweDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsIAorMHgyODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDQzM2QsIAorMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsIAorMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAKKzB4ODIyMDIxLCAweDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgCisweDhlZTIwNjA4LCAweGE0ZjgwMDBlLCAweGFjZWYwMDE4LCAweGFjZWEwMDFjLCAKKzB4MjEwYzAsIDB4MjQ0MjA2MGMsIDB4MmUyMTAyMSwgMHhhY2UyMDAwOCwgCisweDhlZTIwNGM0LCAweGFjZTIwMDEwLCAweGFmODgwMTIwLCAweDkyZTI0ZTIwLCAKKzB4MTQ0MDAwMzMsIDB4MjQwNTAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIAorMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NGQwMDFmLCAKKzB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgCisweDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIAorMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywgCisweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIAorMHgwLCAweDgwMDQzMmEsIDB4MCwgMHgxNDYwMDAwNSwgCisweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIAorMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgCisweGFjODAwMDAwLCAweDgwMDQzM2QsIDB4MCwgMHg4ZWUyNGUzMCwgCisweDI0NDIwMDAxLCAweDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIAorMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4YWM4ZDAwMDAsIDB4YWM4ZTAwMDQsIAorMHg1NGEwMDAwNiwgMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAKKzB4MmM0MjAwMzMsIDB4MTQ0MGZmOWQsIDB4MCwgMHgzMTYzMDBmZiwgCisweDI0MDIwMDAxLCAweDU0NjIwMDc5LCAweGFmYTAwMDEwLCAweGFlZWEwNjA4LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsIDB4MTIyMTAyMywgCisweDJjNDIwMDMzLCAweDEwNDAwMDYxLCAweDU4MjEsIDB4MjQwZDAwMDgsIAorMHgyNDBjMDAxMSwgMHgyNDA4MDAxMiwgMHgyNDA3MDA0MCwgMHgyNDBhMDAwMSwgCisweDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgCisweDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAKKzB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAKKzB4OGVlMjAxYTQsIDB4MjgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgCisweDgwMDQzYTksIDB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIAorMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgCisweGE0NmQwMDBlLCAweGFjNmMwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAKKzB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIAorMHgxNDQwMDAzMywgMHgyNDA1MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0ODAwMWYsIAorMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAKKzB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgCisweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDcwMDA3LCAKKzB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgCisweDAsIDB4ODAwNDM5NiwgMHgwLCAweDE0NjAwMDA1LCAKKzB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgCisweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLCAKKzB4YWM4MDAwMDAsIDB4ODAwNDNhOSwgMHgwLCAweDhlZTI0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4NTA0NzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgCisweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAKKzB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHhhYzg4MDAwMCwgMHhhYzhhMDAwNCwgCisweDU0YTAwMDA2LCAweDI0MGIwMDAxLCAweDhmODIwMDU0LCAweDEyMjEwMjMsIAorMHgyYzQyMDAzMywgMHgxNDQwZmZhNiwgMHgwLCAweDMxNjMwMGZmLCAKKzB4MjQwMjAwMDEsIDB4NTQ2MjAwMDMsIDB4YWZhMDAwMTAsIDB4ODAwNDNkNiwgCisweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVhMjAsIDB4YWZhMDAwMTQsIAorMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAKKzB4MzRhNWYwMTEsIDB4ODAwNDNkNiwgMHgwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDVhMmMsIDB4YWZhMDAwMTQsIDB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsIAorMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDEwLCAweDgwMDQzZDYsIAorMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1YTM4LCAweGFmYTAwMDE0LCAKKzB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgCisweDM0YTVmMDBmLCAweDhlZTIwMWFjLCAweDI0NDIwMDAxLCAweGFlZTIwMWFjLCAKKzB4OGVlMjAxYWMsIDB4OGVlMjAxNWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNWMsIAorMHg4ZWUyMDE1YywgMHg4ZmJmMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjVjZDgsIDB4MjdiZGZmZTAsIDB4MTQ0MDAwMGQsIAorMHhhZmJmMDAxOCwgMHgzYzA0MDAwMSwgMHgyNDg0NWE0NCwgMHgzYzA1MDAwOCwgCisweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMjIwLCAweDM0YTUwNDk5LCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVjZDgsIDB4YzAwMjQwMywgCisweDM4MjEsIDB4OGVlMjA0ZDAsIDB4M2MwMzAwMDEsIDB4NzcxODIxLCAKKzB4OTQ2MzgzYjIsIDB4MzQ0MjAwMDEsIDB4MTA2MDAwMDcsIDB4YWVlMjA0ZDAsIAorMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIAorMHgzNDQyMDAwOCwgMHhhZjgyMDIyMCwgMHgyMDIxLCAweGMwMDUyYTIsIAorMHgyNDA1MDAwNCwgMHhhZjQyMDI2OCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwMjAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDNjMTIwMDAxLCAKKzB4MjY1MjEyMDAsIDB4M2MxNDAwMDEsIDB4OGU5NDVjNTAsIDB4M2MxMDAwMDEsIAorMHgyNjEwMTEyMCwgMHgzYzE1YzAwMCwgMHgzNmI1MDA2MCwgMHg4ZThhMDAwMCwgCisweDhlYjMwMDAwLCAweDI2YTQwMGIsIDB4MjQ4MDAwYSwgMHgyMDBmODIxLCAKKzB4MCwgMHhkLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4ODAwMTRkNiwgCisweDAsIDB4ODAwMTRkOCwgMHgzYzBhMDAwMSwgMHg4MDAxNGQ4LCAKKzB4M2MwYTAwMDIsIDB4ODAwMTRkOCwgMHgwLCAweDgwMDI0YTYsIAorMHgwLCAweDgwMDE0ZDgsIDB4M2MwYTAwMDMsIDB4ODAwMTRkOCwgCisweDNjMGEwMDA0LCAweDgwMDJmOGMsIDB4MCwgMHg4MDAxNGQ4LCAKKzB4M2MwYTAwMDUsIDB4ODAwM2NlOCwgMHgwLCAweDgwMDNjNjYsIAorMHgwLCAweDgwMDE0ZDgsIDB4M2MwYTAwMDYsIDB4ODAwMTRkOCwgCisweDNjMGEwMDA3LCAweDgwMDE0ZDgsIDB4MCwgMHg4MDAxNGQ4LCAKKzB4MCwgMHg4MDAxNGQ4LCAweDAsIDB4ODAwMmE3NSwgCisweDAsIDB4ODAwMTRkOCwgMHgzYzBhMDAwYiwgMHg4MDAxNGQ4LCAKKzB4M2MwYTAwMGMsIDB4ODAwMTRkOCwgMHgzYzBhMDAwZCwgMHg4MDAyMzdhLCAKKzB4MCwgMHg4MDAyMzM5LCAweDAsIDB4ODAwMTRkOCwgCisweDNjMGEwMDBlLCAweDgwMDFiM2MsIDB4MCwgMHg4MDAyNGE0LCAKKzB4MCwgMHg4MDAxNGQ4LCAweDNjMGEwMDBmLCAweDgwMDQwYTcsIAorMHgwLCAweDgwMDQwOTEsIDB4MCwgMHg4MDAxNGQ4LCAKKzB4M2MwYTAwMTAsIDB4ODAwMTRlZSwgMHgwLCAweDgwMDE0ZDgsIAorMHgzYzBhMDAxMSwgMHg4MDAxNGQ4LCAweDNjMGEwMDEyLCAweDgwMDE0ZDgsIAorMHgzYzBhMDAxMywgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4M2MwMzAwMDEsIAorMHgzNDYzMzgwMCwgMHgyNDA1MDA4MCwgMHgyNDA0MDAxZiwgMHgyNDA2ZmZmZiwgCisweDI0MDIwMDAxLCAweGFmODAwMjFjLCAweGFmODIwMjAwLCAweGFmODIwMjIwLCAKKzB4MzYzMTAyMSwgMHhhZjgyMDBjMCwgMHgzNjMxMDIxLCAweGFmODIwMGM0LCAKKzB4MzYzMTAyMSwgMHhhZjgyMDBjOCwgMHgyNzYyMzgwMCwgMHhhZjgyMDBkMCwgCisweDI3NjIzODAwLCAweGFmODIwMGQ0LCAweDI3NjIzODAwLCAweGFmODIwMGQ4LCAKKzB4Mjc2MjE4MDAsIDB4YWY4MjAwZTAsIDB4Mjc2MjE4MDAsIDB4YWY4MjAwZTQsIAorMHgyNzYyMTgwMCwgMHhhZjgyMDBlOCwgMHgyNzYyMTAwMCwgMHhhZjgyMDBmMCwgCisweDI3NjIxMDAwLCAweGFmODIwMGY0LCAweDI3NjIxMDAwLCAweGFmODIwMGY4LCAKKzB4YWNhMDAwMDAsIDB4MjQ4NGZmZmYsIDB4MTQ4NmZmZmQsIDB4MjRhNTAwMDQsIAorMHg4ZjgzMDA0MCwgMHgzYzAyZjAwMCwgMHg2MjE4MjQsIDB4M2MwMjUwMDAsIAorMHgxMDYyMDAwYywgMHg0MzEwMmIsIDB4MTQ0MDAwMDYsIDB4M2MwMjYwMDAsIAorMHgzYzAyNDAwMCwgMHgxMDYyMDAwOCwgMHgyNDAyMDgwMCwgMHg4MDA0NTM5LCAKKzB4MCwgMHgxMDYyMDAwNCwgMHgyNDAyMDgwMCwgMHg4MDA0NTM5LCAKKzB4MCwgMHgyNDAyMDcwMCwgMHgzYzAxMDAwMSwgMHhhYzIyNWNkYywgCisweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyNCwgCisweGFmYjAwMDIwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDNjMDEwMDAxLCAKKzB4YWMyMDVjYzQsIDB4ODAwNDU0NSwgMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwgCisweDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywgMHgwLCAKKzB4YzAwNGQ3MSwgMHgwLCAweDI0MDQwMDAxLCAweDI4MjEsIAorMHgyN2E2MDAxOCwgMHgzNDAyODAwMCwgMHhjMDA0OThlLCAweGE3YTIwMDE4LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNDU1NiwgMHgyNDYzMDA2NCwgCisweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywgCisweDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweGMwMDQ5NGMsIDB4MjdhNjAwMTgsIAorMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHg4MDA0NTYyLCAweDI0NjMwMDY0LCAKKzB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDY1LCAweDE0NDBmZmZjLCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsIDB4YzAwNDk0YywgMHgyN2E2MDAxOCwgCisweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDQ1NmUsIDB4MjQ2MzAwNjQsIAorMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIAorMHgyNDA0MDAwMSwgMHgzYzA2MDAwMSwgMHgyNGM2NWRhMCwgMHhjMDA0OTRjLCAKKzB4MjQwNTAwMDIsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNDU3YiwgCisweDI0NjMwMDY0LCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDA2NSwgCisweDE0NDBmZmZjLCAweDI0MDQwMDAxLCAweDI0MDUwMDAzLCAweDNjMTAwMDAxLCAKKzB4MjYxMDVkYTIsIDB4YzAwNDk0YywgMHgyMDAzMDIxLCAweDk3YTYwMDE4LCAKKzB4M2MwNzAwMDEsIDB4OTRlNzVkYTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVhYjAsIAorMHhhZmEwMDAxNCwgMHg5NjAyMDAwMCwgMHgzYzA1MDAwZCwgMHgzNGE1MDEwMCwgCisweGMwMDI0MDMsIDB4YWZhMjAwMTAsIDB4OTdhMjAwMTgsIDB4MTA0MDAwNGMsIAorMHgyNDAzNjA0MCwgMHg5NjAyMDAwMCwgMHgzMDQyZmZmMCwgMHgxNDQzMDAwYSwgCisweDI0MDIwMDIwLCAweDNjMDMwMDAxLCAweDk0NjM1ZGEwLCAweDU0NjIwMDA5LCAKKzB4MjQwMjc4MzAsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsIDB4YWMyMjVjYzQsIAorMHg4MDA0NWFjLCAweDI0MDIwMDA1LCAweDNjMDMwMDAxLCAweDk0NjM1ZGEwLCAKKzB4MjQwMjc4MzAsIDB4MTQ2MjAwMGYsIDB4MjQwMzAwMTAsIDB4M2MwMjAwMDEsIAorMHg5NDQyNWRhMiwgMHgzMDQyZmZmMCwgMHgxNDQzMDAwYSwgMHgyNDAyMDAwMywgCisweDNjMDEwMDAxLCAweGFjMjI1Y2M0LCAweDI0MDIwMDA2LCAweDNjMDEwMDAxLCAKKzB4YWMyMjVkYjAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkYmMsIDB4ODAwNDVlNiwgCisweDNjMDlmZmYwLCAweDNjMDIwMDAxLCAweDhjNDI1Y2M0LCAweDNjMDMwMDAxLCAKKzB4OTQ2MzVkYTAsIDB4MzQ0MjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVjYzQsIAorMHgyNDAyMDAxNSwgMHgxNDYyMDAwZiwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OTQ0MjVkYTIsIDB4MzA0MmZmZjAsIDB4Mzg0M2Y0MjAsIDB4MmM2MzAwMDEsIAorMHgzODQyZjQzMCwgMHgyYzQyMDAwMSwgMHg2MjE4MjUsIDB4MTA2MDAwMDUsIAorMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwgMHhhYzIyNWRiYywgMHg4MDA0NWU2LCAKKzB4M2MwOWZmZjAsIDB4M2MwMzAwMDEsIDB4OTQ2MzVkYTAsIDB4MjQwMjc4MTAsIAorMHgxNDYyMDAwYiwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMSwgMHg5NDQyNWRhMiwgCisweDMwNDJmZmYwLCAweDE0NDAwMDA2LCAweDI0MDIwMDAyLCAweDI0MDIwMDA0LCAKKzB4M2MwMTAwMDEsIDB4YWMyMjVkYmMsIDB4ODAwNDVlNiwgMHgzYzA5ZmZmMCwgCisweDNjMDEwMDAxLCAweGFjMjI1ZGJjLCAweDgwMDQ1ZTYsIDB4M2MwOWZmZjAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWNjNCwgMHgyNDAzMDAwMSwgMHgzYzAxMDAwMSwgCisweGFjMjM1ZGJjLCAweDM0NDIwMDA0LCAweDNjMDEwMDAxLCAweGFjMjI1Y2M0LCAKKzB4M2MwOWZmZjAsIDB4MzUyOWJkYzAsIDB4M2MwNjAwMDEsIDB4OGNjNjVjYzQsIAorMHgzYzA0MDAwMSwgMHgyNDg0NWFiMCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgCisweGFjMjI1Y2NjLCAweDhmODIwMDU0LCAweDNjMDcwMDAxLCAweDhjZTc1ZGJjLCAKKzB4M2MwMzAwMDEsIDB4OTQ2MzVkYTAsIDB4M2MwODAwMDEsIDB4OTUwODVkYTIsIAorMHgzYzA1MDAwZCwgMHgzNGE1MDEwMCwgMHgzYzAxMDAwMSwgMHhhYzIwNWNjOCwgCisweDQ5MTAyMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWRhYywgMHhhZmEzMDAxMCwgCisweGMwMDI0MDMsIDB4YWZhODAwMTQsIDB4OGZiZjAwMjQsIDB4OGZiMDAwMjAsIAorMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDI3YmRmZmU4LCAweDNjMDUwMDAxLCAKKzB4OGNhNTVjYzgsIDB4MjQwNjAwMDQsIDB4MjQwMjAwMDEsIDB4MTRhMjAwMTQsIAorMHhhZmJmMDAxMCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UzYywgMHgzMDQyODAwMCwgCisweDEwNDAwMDA1LCAweDNjMDQwMDBmLCAweDNjMDMwMDAxLCAweDhjNjM1ZGJjLCAKKzB4ODAwNDYxNywgMHgzNDg0NDI0MCwgMHgzYzA0MDAwNCwgMHgzYzAzMDAwMSwgCisweDhjNjM1ZGJjLCAweDM0ODQ5M2UwLCAweDI0MDIwMDA1LCAweDE0NjIwMDE2LCAKKzB4MCwgMHgzYzA0MDAzZCwgMHg4MDA0NjJmLCAweDM0ODQwOTAwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjdlMzgsIDB4MzA0MjgwMDAsIDB4MTA0MDAwMDUsIAorMHgzYzA0MDAxZSwgMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgMHg4MDA0NjJhLCAKKzB4MzQ4NDg0ODAsIDB4M2MwNDAwMGYsIDB4M2MwMzAwMDEsIDB4OGM2MzVkYmMsIAorMHgzNDg0NDI0MCwgMHgyNDAyMDAwNSwgMHgxNDYyMDAwMywgMHgwLCAKKzB4M2MwNDAwN2EsIDB4MzQ4NDEyMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjVkYWMsIAorMHg4ZjgzMDA1NCwgMHg0NDEwMjEsIDB4NDMxMDIzLCAweDQ0MTAyYiwgCisweDE0NDAwMDM3LCAweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjVjZDAsIAorMHgxNDQwMDAzMywgMHgwLCAweDNjMDEwMDAxLCAweDEwYzAwMDI1LCAKKzB4YWMyMDVjZTAsIDB4M2MwOTAwMDEsIDB4OGQyOTVjYzQsIDB4MjQwNzAwMDEsIAorMHgzYzA0NDAwMCwgMHgzYzA4MDAwMSwgMHgyNTA4N2UzYywgMHgyNTBhZmZmYywgCisweDUyODQyLCAweDE0YTAwMDAyLCAweDI0YzZmZmZmLCAweDI0MDUwMDA4LCAKKzB4YTkxMDI0LCAweDEwNDAwMDEwLCAweDAsIDB4MTRhNzAwMDgsIAorMHgwLCAweDhkMDIwMDAwLCAweDQ0MTAyNCwgMHgxMDQwMDAwYSwgCisweDAsIDB4M2MwMTAwMDEsIDB4ODAwNDY1YiwgMHhhYzI1NWNlMCwgCisweDhkNDIwMDAwLCAweDQ0MTAyNCwgMHgxMDQwMDAwMywgMHgwLCAKKzB4M2MwMTAwMDEsIDB4YWMyNzVjZTAsIDB4M2MwMjAwMDEsIDB4OGM0MjVjZTAsIAorMHg2MTgyYiwgMHgyYzQyMDAwMSwgMHg0MzEwMjQsIDB4NTQ0MGZmZTUsIAorMHg1Mjg0MiwgMHg4ZjgyMDA1NCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNlMCwgCisweDNjMDEwMDAxLCAweGFjMjI1ZGFjLCAweDEwNjAwMDJhLCAweDI0MDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4YWMyNTVjYzgsIDB4M2MwMTAwMDEsIDB4YWMyMjVjY2MsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWNlMCwgMHgxMDQwMDAyMiwgMHgwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjVjY2MsIDB4MTA0MDAwMGEsIDB4MjQwMjAwMDEsIAorMHgzYzAxMDAwMSwgMHhhYzIwNWNjYywgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhYzIyODNhYywgMHgzYzAxMDAwMSwgMHhhYzIwNWQ0YywgMHgzYzAxMDAwMSwgCisweGFjMjI1ZDA0LCAweDNjMDMwMDAxLCAweDc3MTgyMSwgMHg4YzYzODNhYywgCisweDI0MDIwMDA4LCAweDEwNjIwMDA1LCAweDI0MDIwMDAxLCAweGMwMDQ2OTUsIAorMHgwLCAweDgwMDQ2OTIsIDB4MCwgMHgzYzAzMDAwMSwgCisweDhjNjM1Y2M4LCAweDEwNjIwMDA3LCAweDI0MDIwMDBlLCAweDNjMDMwMDAxLCAKKzB4OGM2MzdkZDAsIDB4MTA2MjAwMDMsIDB4MCwgMHhjMDA0ZTU0LCAKKzB4OGY4NDAyMjAsIDB4OGZiZjAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAxOCwgCisweDI3YmRmZmUwLCAweDNjMDJmZGZmLCAweGFmYmYwMDE4LCAweDhlZTMwMDAwLCAKKzB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsIDB4M2MwNDAwMDEsIDB4OGM4NDVjZjAsIAorMHgzNDQyZmZmZiwgMHg2MjE4MjQsIDB4MTRhNDAwMDgsIDB4YWVlMzAwMDAsIAorMHgzYzAzMDAwMSwgMHg3NzE4MjEsIDB4OGM2MzgzYWMsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWNmNCwgMHgxMDYyMDAwOCwgMHgwLCAweDNjMDIwMDAxLCAKKzB4NTcxMDIxLCAweDhjNDI4M2FjLCAweDNjMDEwMDAxLCAweGFjMjU1Y2YwLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjVjZjQsIDB4M2MwMzAwMDEsIDB4OGM2MzVjYzgsIAorMHgyNDAyMDAwMiwgMHgxMDYyMDE2OSwgMHgyYzYyMDAwMywgMHgxMDQwMDAwNSwgCisweDI0MDIwMDAxLCAweDEwNjIwMDA4LCAweDAsIDB4ODAwNDgxYywgCisweDAsIDB4MjQwMjAwMDQsIDB4MTA2MjAwYjEsIDB4MjQwMjAwMDEsIAorMHg4MDA0ODFkLCAweDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAKKzB4OGM0MjgzYWMsIDB4MjQ0M2ZmZmYsIDB4MmM2MjAwMDgsIDB4MTA0MDAxNWEsIAorMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjVhYzgsIAorMHg0MDAwMDgsIDB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgCisweDI0MDIwMDA1LCAweDE0NjIwMDE0LCAweDAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWNkNCwgMHgxMDQwMDAwYSwgMHgyNDAyMDAwMywgMHhjMDA0ODIyLCAKKzB4MCwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhYzIyODNhYywgMHgzYzAxMDAwMSwgMHg4MDA0NmUwLCAweGFjMjA1Y2Q0LCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2FjLCAweDNjMDEwMDAxLCAKKzB4ODAwNDgxZiwgMHhhYzIwNWM2MCwgMHhjMDA0ODIyLCAweDAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWNkNCwgMHgzYzAxMDAwMSwgMHhhYzIwNWM2MCwgCisweDEwNDAwMGRkLCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgCisweGFjMjI4M2FjLCAweDNjMDEwMDAxLCAweDgwMDQ4MWYsIDB4YWMyMDVjZDQsIAorMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgMHgyNDAyMDAwNSwgMHgxNDYyMDAwMywgCisweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1ZDAwLCAweGMwMDQ5Y2YsIAorMHgwLCAweDNjMDMwMDAxLCAweDhjNjM1ZDAwLCAweDgwMDQ3OGUsIAorMHgyNDAyMDAxMSwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNjOCwgMHgzYzA2MDAwMSwgCisweDhjYzY3ZTNjLCAweGMwMDUxMDgsIDB4MjAyMSwgMHgyNDAyMDAwNSwgCisweDNjMDEwMDAxLCAweGFjMjA1Y2Q0LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgCisweDgwMDQ4MWYsIDB4YWMyMjgzYWMsIDB4M2MwNDAwMDEsIDB4MjQ4NDVhYmMsIAorMHgzYzA1MDAwZiwgMHgzNGE1MDEwMCwgMHgzMDIxLCAweDM4MjEsIAorMHhhZmEwMDAxMCwgMHhjMDAyNDAzLCAweGFmYTAwMDE0LCAweDgwMDQ4MWYsIAorMHgwLCAweDhmODIwMjIwLCAweDNjMDNmNzAwLCAweDQzMTAyNSwgCisweDgwMDQ3YjcsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDQsIAorMHg0MzEwMjQsIDB4MTQ0MDAwYTksIDB4MjQwMjAwMDcsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWRhNCwgMHgyNDYzZDhmMCwgMHg0MzEwMjMsIAorMHgyYzQyMjcxMCwgMHgxNDQwMDBmOCwgMHgyNDAyMDAwMSwgMHg4MDA0ODFkLCAKKzB4MCwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNjOCwgMHhjMDA1MmEyLCAKKzB4MjAyMSwgMHhjMDA1Mzg2LCAweDIwMjEsIDB4M2MwMzAwMDEsIAorMHg4YzYzN2UzNCwgMHg0NjEwMGVhLCAweDI0MDIwMDAxLCAweDNjMDIwMDA4LCAKKzB4NjIxMDI0LCAweDEwNDAwMDA2LCAweDAsIDB4OGY4MjAyMTQsIAorMHgzYzAzZmZmZiwgMHg0MzEwMjQsIDB4ODAwNDc0MSwgMHgzNDQyMjUxZiwgCisweDhmODIwMjE0LCAweDNjMDNmZmZmLCAweDQzMTAyNCwgMHgzNDQyMjQxZiwgCisweGFmODIwMjE0LCAweDhlZTIwMDAwLCAweDNjMDMwMjAwLCAweDQzMTAyNSwgCisweGFlZTIwMDAwLCAweDhmODIwMjIwLCAweDI0MDNmZmZiLCAweDQzMTAyNCwgCisweGFmODIwMjIwLCAweDhmODIwMjIwLCAweDM0NDIwMDAyLCAweGFmODIwMjIwLCAKKzB4MjQwMjAwMDgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2FjLCAKKzB4OGY4MjAyMjAsIDB4M2MwMzAwMDQsIDB4NDMxMDI0LCAweDE0NDAwMDA1LCAKKzB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzZjcwMCwgMHg0MzEwMjUsIAorMHhhZjgyMDIyMCwgMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgMHgyNDAyMDAwNSwgCisweDE0NjIwMDBhLCAweDAsIDB4M2MwMjAwMDEsIDB4OTQ0MjVkYTIsIAorMHgyNDQyOWZiYywgMHgyYzQyMDAwNCwgMHgxMDQwMDAwNCwgMHgyNDA0MDAxOCwgCisweDI0MDUwMDAyLCAweGMwMDRkOTMsIDB4MjQwNjAwMjAsIDB4YzAwNDNkZCwgCisweDAsIDB4M2MwMTAwMDEsIDB4ODAwNDgxZiwgMHhhYzIwNWQ1MCwgCisweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNhYywgMHgyNDQzZmZmZiwgCisweDJjNjIwMDA4LCAweDEwNDAwMGFjLCAweDMxMDgwLCAweDNjMDEwMDAxLCAKKzB4MjIwODIxLCAweDhjMjI1YWU4LCAweDQwMDAwOCwgMHgwLCAKKzB4YzAwNDI5YiwgMHgwLCAweDNjMDEwMDAxLCAweGFjMjA1Y2NjLCAKKzB4YWY4MDAyMDQsIDB4M2MwMTAwMDEsIDB4YzAwNDgyMiwgMHhhYzIwN2UyMCwgCisweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1Y2U0LCAweDI0MDIwMDAyLCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweDgwMDQ4MWYsIDB4YWMyMjgzYWMsIAorMHhjMDA0ODlmLCAweDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVjZTQsIAorMHgyNDAyMDAwOSwgMHgxNDYyMDA5MCwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHg4MDA0ODFmLCAweGFjMjI4M2FjLCAweDNjMDIwMDAxLCAKKzB4OGM0MjdlMzgsIDB4MzA0MjQwMDAsIDB4MTA0MDAwMDUsIDB4MCwgCisweDhmODIwMDQ0LCAweDNjMDNmZmZmLCAweDgwMDQ3OWYsIDB4MzQ2MzdmZmYsIAorMHg4ZjgyMDA0NCwgMHgyNDAzZmY3ZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsIAorMHg4ZjgzMDA1NCwgMHg4MDA0N2I5LCAweDI0MDIwMDA0LCAweDhmODMwMDU0LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjVkYTQsIDB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLCAKKzB4MmM0MjI3MTAsIDB4MTQ0MDAwNzQsIDB4MjQwMjAwMDUsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4ODAwNDgxZiwgMHhhYzIyODNhYywgMHg4ZjgyMDIyMCwgCisweDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgMHhhZjgwMDIwNCwgCisweDNjMDEwMDAxLCAweGFjMjA3ZTIwLCAweDhmODMwMDU0LCAweDI0MDIwMDA2LCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2FjLCAweDNjMDEwMDAxLCAKKzB4ODAwNDgxZiwgMHhhYzIzNWRhNCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgCisweDhjNDI1ZGE0LCAweDI0NjNmZmY2LCAweDQzMTAyMywgMHgyYzQyMDAwYSwgCisweDE0NDAwMDU5LCAweDAsIDB4MjQwMjAwMDcsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4ODAwNDgxZiwgMHhhYzIyODNhYywgMHg4ZjgyMDIyMCwgCisweDNjMDRmNzAwLCAweDQ0MTAyNSwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgCisweDNjMDMwMzAwLCAweDQzMTAyNCwgMHgxNDQwMDAwNSwgMHgxODIxLCAKKzB4OGY4MjAyMjAsIDB4MjQwMzAwMDEsIDB4NDQxMDI1LCAweGFmODIwMjIwLCAKKzB4MTA2MDAwNDMsIDB4MjQwMjAwMDEsIDB4OGY4MjAyMTQsIDB4M2MwM2ZmZmYsIAorMHgzYzA0MDAwMSwgMHg4Yzg0NWQ5OCwgMHg0MzEwMjQsIDB4MzQ0MjI1MWYsIAorMHhhZjgyMDIxNCwgMHgyNDAyMDAwOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHgxMDgwMDAwYiwgMHhhYzIyODNhYywgMHgzYzAyMDAwMSwgMHg4YzQyNWQ3NCwgCisweDE0NDAwMDA3LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI3ZGQwLCAKKzB4YzAwNGU1NCwgMHg4Zjg0MDIyMCwgMHg4MDA0ODBjLCAweDAsIAorMHg4ZjgyMDIyMCwgMHgzYzAzMDAwOCwgMHg0MzEwMjQsIDB4MTQ0MDAwMTcsIAorMHgyNDAyMDAwZSwgMHgzYzAxMDAwMSwgMHhhYzIyN2RkMCwgMHg4ZWUyMDAwMCwgCisweDIwMjEsIDB4M2MwMzAyMDAsIDB4NDMxMDI1LCAweGMwMDUzODYsIAorMHhhZWUyMDAwMCwgMHg4ZjgyMDIyMCwgMHgyNDAzZmZmYiwgMHg0MzEwMjQsIAorMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhjMDA0M2RkLCAKKzB4YWY4MjAyMjAsIDB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsIDB4YzAwNTJhMiwgCisweDIwMjEsIDB4ODAwNDgxZiwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjVkNzQsIDB4MTA0MDAwMTAsIDB4MCwgMHgzYzAyMDAwMSwgCisweDhjNDI1ZDcwLCAweDI0NDJmZmZmLCAweDNjMDEwMDAxLCAweGFjMjI1ZDcwLCAKKzB4MTQ0MDAwMDksIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsIDB4YWMyMDVkNzQsIAorMHgzYzAxMDAwMSwgMHg4MDA0ODFmLCAweGFjMjI1ZDcwLCAweDI0MDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjVjY2MsIDB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgCisweDI3YmQwMDIwLCAweDhmODIwMjAwLCAweDhmODIwMjIwLCAweDhmODIwMjIwLCAKKzB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMDAsIDB4M2MwNjAwMDEsIAorMHg4Y2M2NWNjOCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIwMCwgMHgyNDAyMDAwMiwgCisweDEwYzIwMDNhLCAweDJjYzIwMDAzLCAweDEwNDAwMDA1LCAweDI0MDIwMDAxLCAKKzB4MTBjMjAwMDgsIDB4MCwgMHg4MDA0ODY4LCAweDAsIAorMHgyNDAyMDAwNCwgMHgxMGMyMDAxMywgMHgyNDAyMDAwMSwgMHg4MDA0ODY4LCAKKzB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNiOCwgMHgzYzAyMDAwMSwgCisweDhjNDI1Y2MwLCAweDNjMDQwMDAxLCAweDhjODQ1Y2RjLCAweDNjMDUwMDAxLCAKKzB4OGNhNTVjYmMsIDB4YWY4NjAyMDAsIDB4YWY4NjAyMjAsIDB4MzQ2MzAwMjIsIAorMHg0NDEwMjUsIDB4NDUxMDI1LCAweDM0NDIwMDAyLCAweDgwMDQ4NjcsIAorMHhhZjgzMDIwMCwgMHgzYzAzMDAwMSwgMHg4YzYzNWQ5OCwgMHhhZjgyMDIwMCwgCisweDEwNjAwMDA5LCAweGFmODIwMjIwLCAweDNjMDIwMDAxLCAweDhjNDI1ZDc0LCAKKzB4MTQ0MDAwMDUsIDB4M2MwMzNmMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjVjYjAsIAorMHg4MDA0ODViLCAweDM0NjMwMGUwLCAweDNjMDIwMDAxLCAweDhjNDI1Y2IwLCAKKzB4M2MwMzNmMDAsIDB4MzQ2MzAwZTIsIDB4NDMxMDI1LCAweGFmODIwMjAwLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzVjYjQsIDB4M2MwNGY3MDAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWNjMCwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNkYywgMHg2NDE4MjUsIAorMHg0MzEwMjUsIDB4NDUxMDI1LCAweGFmODIwMjIwLCAweDNlMDAwMDgsIAorMHgwLCAweDhmODIwMjIwLCAweDNjMDMwMDAxLCAweDhjNjM1Y2M4LCAKKzB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMGYsIAorMHgwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NjMwMDAyLCAKKzB4NjIxMDIzLCAweDJjNDIwMDAzLCAweDEwNDAwMDExLCAweDAsIAorMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDMsIDB4MTA0MDAwMGMsIAorMHgwLCAweDgwMDQ4NzksIDB4MCwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDgwMDQ4ODUsIDB4MjQ2MzAwMDcsIDB4OGY4MjAwNTQsIAorMHg2MjEwMjMsIDB4MmM0MjAwMDgsIDB4MTQ0MGZmZmMsIDB4MCwgCisweDhmODQwMGUwLCAweDMwODIwMDA3LCAweDEwNDAwMDBkLCAweDAsIAorMHg4ZjgyMDA1NCwgMHg4ZjgzMDBlMCwgMHgxNDgzMDAwOSwgMHgyNDQ1MDAzMiwgCisweDhmODIwMDU0LCAweGEyMTAyMywgMHgyYzQyMDAzMywgMHgxMDQwMDAwNCwgCisweDAsIDB4OGY4MjAwZTAsIDB4MTA4MmZmZjksIDB4MCwgCisweDhmODIwMjIwLCAweDI0MDNmZmZkLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgCisweDNlMDAwMDgsIDB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNlNCwgCisweDNjMDIwMDAxLCAweDhjNDI1Y2U4LCAweDUwNjIwMDA0LCAweDI0NjNmZmZmLCAKKzB4M2MwMTAwMDEsIDB4YWMyMzVjZTgsIDB4MjQ2M2ZmZmYsIDB4MmM2MjAwMDksIAorMHgxMDQwMDA5ZCwgMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIAorMHg4YzIyNWIwOCwgMHg0MDAwMDgsIDB4MCwgMHg4ZjgyMDA0NCwgCisweDM0NDI4MDgwLCAweGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDgwMDQ5MzgsIAorMHgyNDAyMDAwMiwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyNWRhOCwgCisweDI0NjNkOGYwLCAweDQzMTAyMywgMHgyYzQyMjcxMCwgMHgxNDQwMDA4YSwgCisweDI0MDIwMDAzLCAweDgwMDQ5NDUsIDB4MCwgMHg4ZjgyMDA0NCwgCisweDNjMDNmZmZmLCAweDM0NjM3ZmZmLCAweDQzMTAyNCwgMHhhZjgyMDA0NCwgCisweDhmODMwMDU0LCAweDgwMDQ5MzgsIDB4MjQwMjAwMDQsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWRhOCwgMHgyNDYzZmZmNiwgMHg0MzEwMjMsIAorMHgyYzQyMDAwYSwgMHgxNDQwMDA3OCwgMHgyNDAyMDAwNSwgMHg4MDA0OTQ1LCAKKzB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzZjcwMCwgMHg0MzEwMjUsIAorMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgyNDAzZmZmYiwgMHg0MzEwMjQsIAorMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgCisweDNjMDIzZjAwLCAweDM0NDIwMGUwLCAweGFmODIwMjAwLCAweDhmODIwMjAwLCAKKzB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweGFmODIwMjAwLCAweDI0MDQwMDAxLCAKKzB4MzQwNWZmZmYsIDB4YWY4NDAyMDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIAorMHg4MDA0OGVjLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgCisweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsIDB4OGY4MjAyMjQsIAorMHg0MjA0MCwgMHhhNDEwMmIsIDB4MTA0MGZmZjIsIDB4MCwgCisweDhmODIwMjIwLCAweDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgCisweDhmODIwMjE0LCAweDNjMDNmZmZmLCAweDQzMTAyNCwgMHgzNDQyMjUxZiwgCisweGFmODIwMjE0LCAweDhmODIwMjIwLCAweDI0MDNmZmZiLCAweDQzMTAyNCwgCisweGFmODIwMjIwLCAweDhmODIwMjIwLCAweDNjMDRmNzAwLCAweDM0ODQwMDA4LCAKKzB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwMzNmMDAsIAorMHgzNDYzMDBlMiwgMHg0NDEwMjUsIDB4YWY4MjAyMjAsIDB4YWY4MzAyMDAsIAorMHg4Zjg0MDBmMCwgMHgyNzYyMTdmOCwgMHgxNDgyMDAwMiwgMHgyNDg1MDAwOCwgCisweDI3NjUxMDAwLCAweDhmODIwMGY0LCAweDEwYTIwMDA3LCAweDNjMDM4MDAwLCAKKzB4MzQ2MzAwNDAsIDB4M2MwMjAwMDEsIDB4MjQ0MjVjNzAsIDB4YWM4MjAwMDAsIAorMHhhYzgzMDAwNCwgMHhhZjg1MDBmMCwgMHg4ZjgzMDA1NCwgMHg4MDA0OTM4LCAKKzB4MjQwMjAwMDYsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVkYTgsIAorMHgyNDYzZmZmNiwgMHg0MzEwMjMsIDB4MmM0MjAwMGEsIDB4MTQ0MDAwMjIsIAorMHgyNDAyMDAwNywgMHg4MDA0OTQ1LCAweDAsIDB4OGY4MjAwZTAsIAorMHhhZjgyMDBlNCwgMHg4ZjgyMDBlMCwgMHhhZjgyMDBlOCwgMHg4ZjgyMDIyMCwgCisweDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDhmODIwMjIwLCAweDI0MDNmZmY3LCAKKzB4NDMxMDI0LCAweGFmODIwMjIwLCAweDhmODIwMDQ0LCAweDM0NDI4MDgwLCAKKzB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMDgsIDB4M2MwMTAwMDEsIAorMHhhYzIyNWNlNCwgMHgzYzAxMDAwMSwgMHg4MDA0OTQ3LCAweGFjMjM1ZGE4LCAKKzB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVkYTgsIDB4MjQ2M2Q4ZjAsIAorMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAwMDMsIDB4MjQwMjAwMDksIAorMHgzYzAxMDAwMSwgMHhhYzIyNWNlNCwgMHgzZTAwMDA4LCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZkOCwgCisweGFmYjIwMDE4LCAweDgwOTAyMSwgMHhhZmIzMDAxYywgMHhhMDk4MjEsIAorMHhhZmIxMDAxNCwgMHhjMDg4MjEsIDB4YWZiMDAwMTAsIDB4ODAyMSwgCisweGFmYmYwMDIwLCAweGE2MjAwMDAwLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsIAorMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAKKzB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweDI0MTAwMDEwLCAweDI1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgCisweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAKKzB4MjUwMTAyNCwgMHgyNDEwMDAxMCwgMHgyNzAxMDI0LCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgCisweDE2MDBmZmZhLCAweDI3MDEwMjQsIDB4YzAwNGQ3MSwgMHgzNDEwODAwMCwgCisweGMwMDRkNzEsIDB4MCwgMHhjMDA0ZDJiLCAweDAsIAorMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTYyMjAwMDAsIDB4NTAxMDI1LCAKKzB4YTYyMjAwMDAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsIAorMHhjMDA0ZDcxLCAweDAsIDB4OGZiZjAwMjAsIDB4OGZiMzAwMWMsIAorMHg4ZmIyMDAxOCwgMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwMjgsIDB4MjdiZGZmZDgsIDB4YWZiMTAwMTQsIDB4ODA4ODIxLCAKKzB4YWZiMjAwMTgsIDB4YTA5MDIxLCAweGFmYjMwMDFjLCAweGMwOTgyMSwgCisweGFmYjAwMDEwLCAweDgwMjEsIDB4YWZiZjAwMjAsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAKKzB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MjMwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgyMzAxMDI0LCAweDI0MTAwMDEwLCAweDI1MDEwMjQsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MjUwMTAyNCwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweDM0MTA4MDAwLCAKKzB4OTY2MjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmOCwgCisweDAsIDB4YzAwNGQ3MSwgMHgwLCAweDhmYmYwMDIwLCAKKzB4OGZiMzAwMWMsIDB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIAorMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDNjMDMwMDAxLCAweDhjNjM1ZDAwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjVkNDgsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjAsIAorMHhhZmIxMDAxYywgMHgxMDYyMDAwMywgMHhhZmIwMDAxOCwgMHgzYzAxMDAwMSwgCisweGFjMjM1ZDQ4LCAweDI0NjNmZmZmLCAweDJjNjIwMDEzLCAweDEwNDAwMzQ5LCAKKzB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI1YjMwLCAKKzB4NDAwMDA4LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLCAKKzB4MzQwMjgwMDAsIDB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAKKzB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIAorMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4YzAwNGQ0YiwgCisweDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLCAweDAsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwgCisweDgwMDRkMjQsIDB4MjQwMjAwMDIsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIAorMHg4MDIxLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIAorMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsIAorMHgyMDIxLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHgyNDEwMDAxMCwgCisweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgCisweDI0MTAwMDEwLCAweGMwMDRkNGIsIDB4MjAyMSwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYywgMHgwLCAweGMwMDRkNzEsIDB4MzQxMDgwMDAsIAorMHhjMDA0ZDcxLCAweDAsIDB4YzAwNGQyYiwgMHgwLCAKKzB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLCAweDUwMTAyNSwgCisweGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLCAKKzB4YzAwNGQ3MSwgMHgwLCAweDk3YTIwMDEwLCAweDMwNDI4MDAwLCAKKzB4MTQ0MDAyZGMsIDB4MjQwMjAwMDMsIDB4ODAwNGQyNCwgMHgwLCAKKzB4MjQwMjEyMDAsIDB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4ODAyMSwgCisweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIAorMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgCisweGMwMDRkNGIsIDB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsIAorMHgwLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgCisweDIwMjEsIDB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MTA4MDQyLCAweDE2MDBmZmY4LCAweDAsIDB4YzAwNGQ3MSwgCisweDAsIDB4OGY4MzAwNTQsIDB4ODAwNGQxNiwgMHgyNDAyMDAwNCwgCisweDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI1ZGI4LCAweDI0NjNmZjljLCAKKzB4NDMxMDIzLCAweDJjNDIwMDY0LCAweDE0NDAwMjllLCAweDI0MDIwMDAyLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzVkYmMsIDB4MTA2MjAyOTcsIDB4MmM2MjAwMDMsIAorMHgxNDQwMDI5NiwgMHgyNDAyMDAxMSwgMHgyNDAyMDAwMywgMHgxMDYyMDAwNSwgCisweDI0MDIwMDA0LCAweDEwNjIwMjkxLCAweDI0MDIwMDBmLCAweDgwMDRkMjQsIAorMHgyNDAyMDAxMSwgMHg4MDA0ZDI0LCAweDI0MDIwMDA1LCAweDI0MDIwMDE0LCAKKzB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4ODAyMSwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIAorMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsIAorMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAxMiwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxMiwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweDM0MTA4MDAwLCAKKzB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmOCwgCisweDAsIDB4YzAwNGQ3MSwgMHgwLCAweDhmODMwMDU0LCAKKzB4ODAwNGQxNiwgMHgyNDAyMDAwNiwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgCisweDhjNDI1ZGI4LCAweDI0NjNmZjljLCAweDQzMTAyMywgMHgyYzQyMDA2NCwgCisweDE0NDAwMjUwLCAweDI0MDIwMDA3LCAweDgwMDRkMjQsIDB4MCwgCisweDI0MDIwMDA2LCAweGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxMywgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTMsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwgCisweDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMDgsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsIAorMHgyYzQyMDA2NCwgMHgxNDQwMDIwZiwgMHgyNDAyMDAwOSwgMHg4MDA0ZDI0LCAKKzB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgCisweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAKKzB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgCisweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE4LCAKKzB4YzAwNGQ3MSwgMHgzNDEwODAwMCwgMHhjMDA0ZDcxLCAweDAsIAorMHhjMDA0ZDJiLCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAKKzB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgCisweDE2MDBmZmY3LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLCAKKzB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzQ0MjAwMDEsIDB4YTdhMjAwMTAsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwgCisweDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMGEsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsIAorMHgyYzQyMDA2NCwgMHgxNDQwMDE5YiwgMHgyNDAyMDAwYiwgMHg4MDA0ZDI0LCAKKzB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgCisweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAKKzB4MzIwMjAwMTcsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgCisweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE3LCAKKzB4YzAwNGQ3MSwgMHgzNDEwODAwMCwgMHhjMDA0ZDcxLCAweDAsIAorMHhjMDA0ZDJiLCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAKKzB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgCisweDE2MDBmZmY3LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLCAKKzB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzQ0MjA3MDAsIDB4YTdhMjAwMTAsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxNywgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTcsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwgCisweDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMGMsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsIAorMHgyYzQyMDA2NCwgMHgxNDQwMDEyNywgMHgyNDAyMDAxMiwgMHg4MDA0ZDI0LCAKKzB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgCisweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAKKzB4MzIwMjAwMTQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgCisweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE0LCAKKzB4YzAwNGQ3MSwgMHgzNDEwODAwMCwgMHhjMDA0ZDcxLCAweDAsIAorMHhjMDA0ZDJiLCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAKKzB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgCisweDE2MDBmZmY3LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLCAKKzB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzQ0MjAwMTAsIDB4YTdhMjAwMTAsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxNCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTQsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwgCisweDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMTMsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsIAorMHgyYzQyMDA2NCwgMHgxNDQwMDBiMywgMHgyNDAyMDAwZCwgMHg4MDA0ZDI0LCAKKzB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgCisweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAKKzB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgCisweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE4LCAKKzB4YzAwNGQ3MSwgMHgzNDEwODAwMCwgMHhjMDA0ZDcxLCAweDAsIAorMHhjMDA0ZDJiLCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAKKzB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgCisweDE2MDBmZmY3LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLCAKKzB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzA0MmZmZmUsIDB4YTdhMjAwMTAsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwgCisweDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMGUsIDB4MjQwMjA4NDAsIAorMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHg4MDIxLCAweGMwMDRkNGIsIAorMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgCisweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgCisweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDEzLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDEzLCAweGMwMDRkNGIsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4MzQxMDgwMDAsIAorMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgCisweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmY4LCAKKzB4MCwgMHhjMDA0ZDcxLCAweDAsIDB4OGY4MzAwNTQsIAorMHgyNDAyMDAxMCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQwMCwgMHgzYzAxMDAwMSwgCisweDgwMDRkMjYsIDB4YWMyMzVkYjgsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsIDB4MmM0MjAwNjQsIAorMHgxNDQwMDAwNCwgMHgwLCAweDI0MDIwMDExLCAweDNjMDEwMDAxLCAKKzB4YWMyMjVkMDAsIDB4OGZiZjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIAorMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDhmODUwMDQ0LCAweDhmODIwMDQ0LCAKKzB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweDNjMDMwMDA4LCAweGFmODIwMDQ0LCAKKzB4OGY4NDAwNTQsIDB4OGY4MjAwNTQsIDB4YTMyODI0LCAweDgwMDRkMzcsIAorMHgyNDg0MDAwMSwgMHg4ZjgyMDA1NCwgMHg4MjEwMjMsIDB4MmM0MjAwMDIsIAorMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMDQ0LCAweDNjMDNmZmZlLCAKKzB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMDQ0LCAweDhmODMwMDU0LCAKKzB4OGY4MjAwNTQsIDB4ODAwNGQ0NSwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgCisweDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLCAKKzB4M2UwMDAwOCwgMHhhMDEwMjEsIDB4OGY4MzAwNDQsIDB4M2MwMmZmZjAsIAorMHgzNDQyZmZmZiwgMHg0MjQ4MCwgMHg2MjE4MjQsIDB4M2MwMjAwMDIsIAorMHg4MjIwMjUsIDB4NjQxODI1LCAweGFmODMwMDQ0LCAweDhmODIwMDQ0LCAKKzB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMDQ0LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNGQ1ZSwgMHgyNDYzMDAwMSwgCisweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgCisweDAsIDB4OGY4MjAwNDQsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LCAKKzB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNGQ2YiwgCisweDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgCisweDE0NDBmZmZjLCAweDAsIDB4M2UwMDAwOCwgMHgwLCAKKzB4OGY4MjAwNDQsIDB4M2MwM2ZmZjAsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4YWY4MjAwNDQsIDB4OGY4MjAwNDQsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LCAKKzB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNGQ3ZiwgCisweDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgCisweDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsIDB4M2MwM2ZmZmUsIAorMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIAorMHg4ZjgyMDA1NCwgMHg4MDA0ZDhkLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LCAKKzB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsIAorMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmYzgsIDB4YWZiMzAwMjQsIAorMHg4MDk4MjEsIDB4YWZiNTAwMmMsIDB4YTBhODIxLCAweGFmYjIwMDIwLCAKKzB4YzA5MDIxLCAweDMyYTJmZmZmLCAweGFmYmYwMDMwLCAweGFmYjQwMDI4LCAKKzB4YWZiMTAwMWMsIDB4YWZiMDAwMTgsIDB4MTQ0MDAwMzQsIDB4YTdiMjAwMTAsIAorMHgzMjcxZmZmZiwgMHgyN2IyMDAxMCwgMHg4MDIxLCAweGMwMDRkNGIsIAorMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgCisweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgCisweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDIzMDEwMjQsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MjMwMTAyNCwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweDM0MTA4MDAwLCAKKzB4OTY0MjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxMjAwMDA3NSwgCisweDAsIDB4ODAwNGRjOSwgMHgwLCAweDMyNzRmZmZmLCAKKzB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIAorMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgyOTAxMDI0LCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDI5MDEwMjQsIDB4YzAwNGQ3MSwgCisweDM0MTA4MDAwLCAweGMwMDRkNzEsIDB4MCwgMHhjMDA0ZDJiLCAKKzB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTYyMjAwMDAsIAorMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAKKzB4MCwgMHhjMDA0ZDcxLCAweDAsIDB4MzJhNWZmZmYsIAorMHgyNDAyMDAwMSwgMHg1NGEyMDAwNCwgMHgyNDAyMDAwMiwgMHg5N2EyMDAxMCwgCisweDgwMDRlMTQsIDB4NTIxMDI1LCAweDE0YTIwMDA2LCAweDMyNzFmZmZmLCAKKzB4OTdhMjAwMTAsIDB4MTIxODI3LCAweDQzMTAyNCwgMHhhN2EyMDAxMCwgCisweDMyNzFmZmZmLCAweDI3YjIwMDEwLCAweDgwMjEsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAKKzB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIAorMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MjMwMTAyNCwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgyMzAxMDI0LCAweGMwMDRkNGIsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4MzQxMDgwMDAsIAorMHg5NjQyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgCisweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmY4LCAKKzB4MCwgMHhjMDA0ZDcxLCAweDAsIDB4OGZiZjAwMzAsIAorMHg4ZmI1MDAyYywgMHg4ZmI0MDAyOCwgMHg4ZmIzMDAyNCwgMHg4ZmIyMDAyMCwgCisweDhmYjEwMDFjLCAweDhmYjAwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMzgsIAorMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZlOCwgCisweGFmYmYwMDEwLCAweDNjMDMwMDAxLCAweDc3MTgyMSwgMHg4YzYzODNhYywgCisweDI0MDIwMDA4LCAweDE0NjIwMjJjLCAweDgwMzAyMSwgMHgzYzAyMDAwMSwgCisweDhjNDI1ZDk4LCAweDE0NDAwMDMzLCAweDAsIDB4OGY4NTAyMjQsIAorMHgzOGEzMDAyMCwgMHgyYzYzMDAwMSwgMHgzOGEyMDAxMCwgMHgyYzQyMDAwMSwgCisweDYyMTgyNSwgMHgxNDYwMDAwZCwgMHgzOGEzMDAzMCwgMHgyYzYzMDAwMSwgCisweDM4YTIwNDAwLCAweDJjNDIwMDAxLCAweDYyMTgyNSwgMHgxNDYwMDAwNywgCisweDM4YTMwNDAyLCAweDJjNjMwMDAxLCAweDM4YTIwNDA0LCAweDJjNDIwMDAxLCAKKzB4NjIxODI1LCAweDEwNjAwMDA1LCAweDAsIDB4YzAwNDI5YiwgCisweDAsIDB4ODAwNGU4ZCwgMHgyNDAyMDAwZSwgMHhjMDA0M2RkLCAKKzB4MCwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNjOCwgMHhjMDA1MmEyLCAKKzB4MjAyMSwgMHgzYzAzMDAwMSwgMHg4YzYzNWNjOCwgMHgyNDAyMDAwNCwgCisweDE0NjIwMDA1LCAweDI0MDNmZmZiLCAweDNjMDIwMDAxLCAweDhjNDI1Y2M0LCAKKzB4ODAwNGU4OSwgMHgyNDAzZmZmNywgMHgzYzAyMDAwMSwgMHg4YzQyNWNjNCwgCisweDQzMTAyNCwgMHgzYzAxMDAwMSwgMHhhYzIyNWNjNCwgMHgyNDAyMDAwZSwgCisweDNjMDEwMDAxLCAweGMwMDQyOWIsIDB4YWMyMjdkZDAsIDB4ODAwNTA4NywgCisweDAsIDB4OGY4MjAyMjAsIDB4M2MwMzA0MDAsIDB4NDMxMDI0LCAKKzB4MTA0MDAwMjcsIDB4MjQwM2ZmYmYsIDB4OGY4NTAyMjQsIDB4M2MwMjAwMDEsIAorMHg4YzQyN2RkYywgMHhhMzIwMjQsIDB4NDMxMDI0LCAweDE0ODIwMDBjLCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RlMCwgMHgyNDQyMDAwMSwgCisweDNjMDEwMDAxLCAweGFjMjI3ZGUwLCAweDJjNDIwMDAyLCAweDE0NDAwMDA4LCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4ODAwNGVhZCwgMHhhYzIyN2UwMCwgCisweDNjMDEwMDAxLCAweGFjMjA3ZGUwLCAweDNjMDEwMDAxLCAweGFjMjA3ZTAwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjdlMDAsIDB4MTA0MDAwMDYsIDB4MzBhMjAwNDAsIAorMHgxMDQwMDAwNCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHg4MDA0ZWI4LCAKKzB4YWMyMjdlMDQsIDB4M2MwMTAwMDEsIDB4YWMyMDdlMDQsIDB4M2MwMTAwMDEsIAorMHhhYzI1N2RkYywgMHgzYzAxMDAwMSwgMHg4MDA0ZWM4LCAweGFjMjA3ZTEwLCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjdlMTAsIDB4M2MwMTAwMDEsIAorMHhhYzIwN2UwMCwgMHgzYzAxMDAwMSwgMHhhYzIwN2RlMCwgMHgzYzAxMDAwMSwgCisweGFjMjA3ZTA0LCAweDNjMDEwMDAxLCAweGFjMjA3ZGRjLCAweDNjMDMwMDAxLCAKKzB4OGM2MzdkZDAsIDB4M2MwMjAwMDEsIDB4OGM0MjdkZDQsIDB4MTA2MjAwMDMsIAorMHgzYzAyMDIwMCwgMHgzYzAxMDAwMSwgMHhhYzIzN2RkNCwgMHhjMjEwMjQsIAorMHgxMDQwMDAwNywgMHgyNDYzZmZmZiwgMHg4ZjgyMDIyMCwgMHgyNDAzMDAwMSwgCisweDNjMDEwMDAxLCAweGFjMjM1Y2NjLCAweDgwMDUwODUsIDB4M2MwM2Y3MDAsIAorMHgyYzYyMDAwZSwgMHgxMDQwMDFhOCwgMHgzMTA4MCwgMHgzYzAxMDAwMSwgCisweDIyMDgyMSwgMHg4YzIyNWI4MCwgMHg0MDAwMDgsIDB4MCwgCisweDNjMDEwMDAxLCAweGFjMjA3ZTAwLCAweDNjMDEwMDAxLCAweGFjMjA3ZGUwLCAKKzB4M2MwMTAwMDEsIDB4YWMyMDdkZGMsIDB4M2MwMTAwMDEsIDB4YWMyMDdlMDQsIAorMHgzYzAxMDAwMSwgMHhhYzIwN2RmOCwgMHgzYzAxMDAwMSwgMHhhYzIwN2RmMCwgCisweGMwMDQ4NmEsIDB4YWY4MDAyMjQsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsIAorMHhhYzIyN2RkMCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UxMCwgMHgxNDQwMDA1NiwgCisweDNjMDNmZGZmLCAweDhlZTIwMDAwLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgCisweGMwMDQyOWIsIDB4YWVlMjAwMDAsIDB4YWY4MDAyMDQsIDB4OGY4MjAyMDAsIAorMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsIDB4M2MwMTAwMDEsIAorMHhhYzIwN2UyMCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RmOCwgCisweDI0MDQwMDAxLCAweDNjMDEwMDAxLCAweGFjMjQ3ZTBjLCAweDI0NDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjdkZjgsIDB4MmM0MjAwMDQsIDB4M2MwMTAwMDEsIAorMHhhYzIzN2RmNCwgMHgxNDQwMDAwNiwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwgCisweGFjMjQ1Y2NjLCAweDNjMDEwMDAxLCAweDgwMDUwODMsIDB4YWMyMDdkZjgsIAorMHgzYzAxMDAwMSwgMHg4MDA1MDgzLCAweGFjMjI3ZGQwLCAweDhmODMwMDU0LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjdkZjQsIDB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLCAKKzB4MmM0MjI3MTAsIDB4MTQ0MDAwMDMsIDB4MjQwMjAwMDQsIDB4M2MwMTAwMDEsIAorMHhhYzIyN2RkMCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UxMCwgMHgxNDQwMDAyNiwgCisweDNjMDNmZGZmLCAweDhlZTIwMDAwLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgCisweDgwMDUwODMsIDB4YWVlMjAwMDAsIDB4M2MwNDAwMDEsIDB4OGM4NDVkOWMsIAorMHgzYzAxMDAwMSwgMHhjMDA1MDhhLCAweGFjMjA3ZGU4LCAweDNjMDIwMDAxLCAKKzB4OGM0MjdlMWMsIDB4YWY4MjAyMDQsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMTAsIAorMHgxNDQwMDAxNSwgMHgzYzAzZmRmZiwgMHg4ZWUyMDAwMCwgMHgzNDYzZmZmZiwgCisweDQzMTAyNCwgMHhhZWUyMDAwMCwgMHg4ZjgyMDIwNCwgMHgzMDQyMDAzMCwgCisweDE0NDAwMTNjLCAweDI0MDIwMDAyLCAweDNjMDMwMDAxLCAweDhjNjM3ZTFjLCAKKzB4MjQwMjAwMDUsIDB4M2MwMTAwMDEsIDB4YWMyMjdkZDAsIDB4M2MwMTAwMDEsIAorMHg4MDA1MDgzLCAweGFjMjM3ZTIwLCAweDNjMDIwMDAxLCAweDhjNDI3ZTEwLCAKKzB4MTA0MDAwMTAsIDB4M2MwM2ZkZmYsIDB4M2MwMjAwMDEsIDB4OGM0MjVkNmMsIAorMHgyNDQyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ2YywgMHgyYzQyMDAwMiwgCisweDE0NDAwMTMxLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1ZDc0LCAKKzB4M2MwMTAwMDEsIDB4YWMyMDVkNmMsIDB4M2MwMTAwMDEsIDB4ODAwNTA4MywgCisweGFjMjI1Y2NjLCAweDhlZTIwMDAwLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgCisweGFlZTIwMDAwLCAweDNjMDIwMDAxLCAweDhjNDI3ZTAwLCAweDEwNDAwMTIyLCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RkYywgMHgxMDQwMDExZSwgCisweDAsIDB4M2MwMTAwMDEsIDB4YWMyMjdlMDgsIDB4MjQwMjAwMDMsIAorMHgzYzAxMDAwMSwgMHhhYzIyN2RlMCwgMHg4MDA1MDI0LCAweDI0MDIwMDA2LCAKKzB4M2MwMTAwMDEsIDB4YWMyMDdkZTgsIDB4OGY4MjAyMDQsIDB4MzQ0MjAwNDAsIAorMHhhZjgyMDIwNCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UyMCwgMHgyNDAzMDAwNywgCisweDNjMDEwMDAxLCAweGFjMjM3ZGQwLCAweDM0NDIwMDQwLCAweDNjMDEwMDAxLCAKKzB4YWMyMjdlMjAsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMDAsIDB4MTA0MDAwMDUsIAorMHgwLCAweDNjMDIwMDAxLCAweDhjNDI3ZGRjLCAweDEwNDAwMGY5LCAKKzB4MjQwMjAwMDIsIDB4M2MwNTAwMDEsIDB4MjRhNTdkZTAsIDB4OGNhMjAwMDAsIAorMHgyYzQyNGUyMSwgMHgxMDQwMDBmMywgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMSwgCisweDhjNDI3ZTA0LCAweDEwNDAwMGY4LCAweDI0MDRmZmJmLCAweDNjMDIwMDAxLCAKKzB4OGM0MjdkZGMsIDB4M2MwMzAwMDEsIDB4OGM2MzdlMDgsIDB4NDQxMDI0LCAKKzB4NjQxODI0LCAweDEwNDMwMDA0LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAKKzB4ODAwNTA4MywgMHhhYzIyN2RkMCwgMHgyNDAyMDAwMywgMHhhY2EyMDAwMCwgCisweDI0MDIwMDA4LCAweDNjMDEwMDAxLCAweGFjMjI3ZGQwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjdlMGMsIDB4MTA0MDAwMGMsIDB4MjQwMjAwMDEsIDB4M2MwNDAwMDEsIAorMHhjMDA1MDk3LCAweDhjODQ3ZGRjLCAweDNjMDIwMDAxLCAweDhjNDI3ZTI4LCAKKzB4MTQ0MDAwMDUsIDB4MjQwMjAwMDEsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMjQsIAorMHgxMDQwMDAwNiwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWNjYywgCisweDNjMDEwMDAxLCAweDgwMDUwODMsIDB4YWMyMDdkZjgsIDB4M2MwMjAwMDEsIAorMHg4YzQyN2RmMCwgMHgzYzAzMDAwMSwgMHg4YzYzN2RkYywgMHgyYzQyMDAwMSwgCisweDIxMGMwLCAweDMwNjMwMDA4LCAweDNjMDEwMDAxLCAweGFjMjI3ZGYwLCAKKzB4M2MwMTAwMDEsIDB4YWMyMzdkZWMsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMDksIAorMHgzYzAxMDAwMSwgMHhhYzIyN2RkMCwgMHgzYzAxMDAwMSwgMHg4MDA1MDgzLCAKKzB4YWMyMzdkZjQsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjdkZjQsIAorMHgyNDYzZDhmMCwgMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAwYTgsIAorMHgwLCAweDNjMDIwMDAxLCAweDhjNDI3ZTAwLCAweDEwNDAwMDA1LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RkYywgMHgxMDQwMDBhOSwgCisweDI0MDIwMDAyLCAweDNjMDMwMDAxLCAweDI0NjM3ZGUwLCAweDhjNjIwMDAwLCAKKzB4MmM0MjRlMjEsIDB4MTA0MDAwYTMsIDB4MjQwMjAwMDIsIDB4M2MwMjAwMDEsIAorMHg4YzQyN2UwYywgMHgxMDQwMDAwZSwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjdkZGMsIDB4M2MwMTAwMDEsIDB4YWMyMDdlMGMsIDB4MzA0MjAwODAsIAorMHgxMDQwMDAyZiwgMHgyNDAyMDAwYywgMHg4ZjgyMDIwNCwgMHgzMDQyMDA4MCwgCisweDE0NDAwMDBjLCAweDI0MDIwMDAzLCAweDgwMDUwMTEsIDB4MjQwMjAwMGMsIAorMHgzYzAyMDAwMSwgMHg4YzQyN2RkYywgMHgzMDQyMDA4MCwgMHgxNDQwMDAwNSwgCisweDI0MDIwMDAzLCAweDhmODIwMjA0LCAweDMwNDIwMDgwLCAweDEwNDAwMDFmLCAKKzB4MjQwMjAwMDMsIDB4YWM2MjAwMDAsIDB4MjQwMjAwMGEsIDB4M2MwMTAwMDEsIAorMHhhYzIyN2RkMCwgMHgzYzA0MDAwMSwgMHgyNDg0N2UxOCwgMHg4YzgyMDAwMCwgCisweDNjMDMwMDAxLCAweDhjNjM3ZGYwLCAweDQzMTAyNSwgMHhhZjgyMDIwNCwgCisweDhjODMwMDAwLCAweDNjMDQwMDAxLCAweDhjODQ3ZGYwLCAweDI0MDIwMDBiLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjdkZDAsIDB4NjQxODI1LCAweDNjMDEwMDAxLCAKKzB4YWMyMzdlMjAsIDB4M2MwNTAwMDEsIDB4MjRhNTdkZTAsIDB4OGNhMjAwMDAsIAorMHgyYzQyNGUyMSwgMHgxMDQwMDA2ZiwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMSwgCisweDhjNDI3ZTEwLCAweDEwNDAwMDA1LCAweDAsIDB4MjQwMjAwMGMsIAorMHgzYzAxMDAwMSwgMHg4MDA1MDgzLCAweGFjMjI3ZGQwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjdlMDAsIDB4MTA0MDAwNmMsIDB4MCwgMHgzYzA0MDAwMSwgCisweDhjODQ3ZGRjLCAweDEwODAwMDVlLCAweDMwODIwMDA4LCAweDNjMDMwMDAxLCAKKzB4OGM2MzdkZWMsIDB4MTA2MjAwNjQsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsIAorMHhhYzI0N2UwOCwgMHhhY2EyMDAwMCwgMHgyNDAyMDAwNiwgMHgzYzAxMDAwMSwgCisweDgwMDUwODMsIDB4YWMyMjdkZDAsIDB4OGY4MjAyMDAsIDB4MzQ0MjAwMDIsIAorMHhhZjgyMDIwMCwgMHg4ZjgzMDA1NCwgMHgyNDAyMDAwZCwgMHgzYzAxMDAwMSwgCisweGFjMjI3ZGQwLCAweDNjMDEwMDAxLCAweGFjMjM3ZGY0LCAweDhmODMwMDU0LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjdkZjQsIDB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLCAKKzB4MmM0MjI3MTAsIDB4MTQ0MDAwM2EsIDB4MCwgMHgzYzAyMDAwMSwgCisweDhjNDI3ZTEwLCAweDEwNDAwMDI5LCAweDI0MDIwMDBlLCAweDNjMDMwMDAxLCAKKzB4OGM2MzdlMjQsIDB4M2MwMTAwMDEsIDB4MTQ2MDAwMTUsIDB4YWMyMjdkZDAsIAorMHhjMDA0M2RkLCAweDAsIDB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsIAorMHhjMDA1MmEyLCAweDIwMjEsIDB4M2MwMzAwMDEsIDB4OGM2MzVjYzgsIAorMHgyNDAyMDAwNCwgMHgxNDYyMDAwNSwgMHgyNDAzZmZmYiwgMHgzYzAyMDAwMSwgCisweDhjNDI1Y2M0LCAweDgwMDUwNTIsIDB4MjQwM2ZmZjcsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWNjNCwgMHg0MzEwMjQsIDB4M2MwMTAwMDEsIDB4YWMyMjVjYzQsIAorMHg4ZWUyMDAwMCwgMHgzYzAzMDIwMCwgMHg0MzEwMjUsIDB4YWVlMjAwMDAsIAorMHg4ZjgyMDIyNCwgMHgzYzAxMDAwMSwgMHhhYzIyN2UyYywgMHg4ZjgyMDIyMCwgCisweDI0MDNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgCisweDM0NDIwMDAyLCAweDgwMDUwODMsIDB4YWY4MjAyMjAsIDB4M2MwMjAwMDEsIAorMHg4YzQyN2UwMCwgMHgxMDQwMDAwNSwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjdkZGMsIDB4MTA0MDAwMGYsIDB4MjQwMjAwMDIsIDB4M2MwMjAwMDEsIAorMHg4YzQyN2RlMCwgMHgyYzQyNGUyMSwgMHgxMDQwMDAwYSwgMHgyNDAyMDAwMiwgCisweDNjMDIwMDAxLCAweDhjNDI3ZTAwLCAweDEwNDAwMDBmLCAweDAsIAorMHgzYzAyMDAwMSwgMHg4YzQyN2RkYywgMHgxNDQwMDAwYiwgMHgwLCAKKzB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsIDB4ODAwNTA4MywgMHhhYzIyN2RkMCwgCisweDNjMDIwMDAxLCAweDhjNDI3ZTAwLCAweDEwNDAwMDAzLCAweDAsIAorMHhjMDA0MjliLCAweDAsIDB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsIAorMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4OGZiZjAwMTAsIDB4M2UwMDAwOCwgCisweDI3YmQwMDE4LCAweDNjMDMwMDAxLCAweDI0NjM3ZTI4LCAweDhjNjIwMDAwLCAKKzB4MTA0MDAwMDUsIDB4MzQ0MjIwMDAsIDB4M2MwMTAwMDEsIDB4YWMyMjdlMWMsIAorMHg4MDA1MDk1LCAweGFjNjAwMDAwLCAweDNjMDEwMDAxLCAweGFjMjQ3ZTFjLCAKKzB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmUwLCAweDMwODIwMDMwLCAKKzB4YWZiZjAwMTgsIDB4M2MwMTAwMDEsIDB4YWMyMjdlMjQsIDB4MTQ0MDAwNjcsIAorMHgzYzAyZmZmZiwgMHgzNDQyMWYwZSwgMHg4MjEwMjQsIDB4MTQ0MDAwNjEsIAorMHgyNDAyMDAzMCwgMHgzMDgyMjAwMCwgMHgxMDQwMDA1ZCwgMHgzMDgzODAwMCwgCisweDMxYTAyLCAweDMwODIwMDAxLCAweDIxMjAwLCAweDNjMDQwMDAxLCAKKzB4OGM4NDVkOWMsIDB4NjIxODI1LCAweDMzMWMyLCAweDNjMDMwMDAxLCAKKzB4MjQ2MzVkNzgsIDB4MzA4MjgwMDAsIDB4MjEyMDIsIDB4MzA4NDAwMDEsIAorMHg0MjIwMCwgMHg0NDEwMjUsIDB4MjM5YzIsIDB4NjEwODAsIAorMHg0MzEwMjEsIDB4NDcxMDIxLCAweDkwNDMwMDAwLCAweDI0MDIwMDAxLCAKKzB4MTA2MjAwMjUsIDB4MCwgMHgxMDYwMDAwNywgMHgyNDAyMDAwMiwgCisweDEwNjIwMDEzLCAweDI0MDIwMDAzLCAweDEwNjIwMDJjLCAweDNjMDUwMDBmLCAKKzB4ODAwNTBmOSwgMHgwLCAweDhmODIwMjAwLCAweDI0MDNmZWZmLCAKKzB4NDMxMDI0LCAweGFmODIwMjAwLCAweDhmODIwMjIwLCAweDNjMDNmZmZlLCAKKzB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAweDNjMDEwMDAxLCAKKzB4YWMyMDdlNDQsIDB4M2MwMTAwMDEsIDB4ODAwNTEwNCwgMHhhYzIwN2U0YywgCisweDhmODIwMjAwLCAweDM0NDIwMTAwLCAweGFmODIwMjAwLCAweDhmODIwMjIwLCAKKzB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAKKzB4MjQwMjAxMDAsIDB4M2MwMTAwMDEsIDB4YWMyMjdlNDQsIDB4M2MwMTAwMDEsIAorMHg4MDA1MTA0LCAweGFjMjA3ZTRjLCAweDhmODIwMjAwLCAweDI0MDNmZWZmLCAKKzB4NDMxMDI0LCAweGFmODIwMjAwLCAweDhmODIwMjIwLCAweDNjMDMwMDAxLCAKKzB4NDMxMDI1LCAweGFmODIwMjIwLCAweDNjMDEwMDAxLCAweGFjMjA3ZTQ0LCAKKzB4M2MwMTAwMDEsIDB4ODAwNTEwNCwgMHhhYzIzN2U0YywgMHg4ZjgyMDIwMCwgCisweDM0NDIwMTAwLCAweGFmODIwMjAwLCAweDhmODIwMjIwLCAweDNjMDMwMDAxLCAKKzB4NDMxMDI1LCAweGFmODIwMjIwLCAweDI0MDIwMTAwLCAweDNjMDEwMDAxLCAKKzB4YWMyMjdlNDQsIDB4M2MwMTAwMDEsIDB4ODAwNTEwNCwgMHhhYzIzN2U0YywgCisweDM0YTVmZmZmLCAweDNjMDQwMDAxLCAweDI0ODQ1YmI4LCAweGFmYTMwMDEwLCAKKzB4YzAwMjQwMywgMHhhZmEwMDAxNCwgMHg4MDA1MTA0LCAweDAsIAorMHgyNDAyMDAzMCwgMHgzYzAxMDAwMSwgMHhhYzIyN2UyOCwgMHg4ZmJmMDAxOCwgCisweDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MCwgMHgyN2JkZmZjOCwgCisweGFmYjIwMDI4LCAweDgwOTAyMSwgMHhhZmIzMDAyYywgMHhhMDk4MjEsIAorMHhhZmIwMDAyMCwgMHhjMDgwMjEsIDB4M2MwNDAwMDEsIDB4MjQ4NDViZDAsIAorMHgzYzA1MDAwOSwgMHgzYzAyMDAwMSwgMHg4YzQyNWNjOCwgMHgzNGE1OTAwMSwgCisweDI0MDMwMjEsIDB4MjYwMzgyMSwgMHhhZmJmMDAzMCwgMHhhZmIxMDAyNCwgCisweGE3YTAwMDFhLCAweGFmYjAwMDE0LCAweGMwMDI0MDMsIDB4YWZhMjAwMTAsIAorMHgyNDAyMDAwMiwgMHgxMjYyMDA4MywgMHgyZTYyMDAwMywgMHgxMDQwMDAwNSwgCisweDI0MDIwMDAxLCAweDEyNjIwMDBhLCAweDAsIDB4ODAwNTI5YiwgCisweDAsIDB4MjQwMjAwMDQsIDB4MTI2MjAwZmEsIDB4MjQwMjAwMDgsIAorMHgxMjYyMDBmOSwgMHgzYzAyZmZlYywgMHg4MDA1MjliLCAweDAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWNjNCwgMHgzMDQyMDAwMiwgMHgxNDQwMDAwNCwgCisweDEyODk0MCwgMHgzYzAyZmZmYiwgMHgzNDQyZmZmZiwgMHgyMDI4MDI0LCAKKzB4M2MwMTAwMDEsIDB4MzEwODIxLCAweGFjMzA3ZTNjLCAweDNjMDI0MDAwLCAKKzB4MjAyMTAyNCwgMHgxMDQwMDA0ZSwgMHgxMDIzYzIsIDB4MzA4NDAwMzAsIAorMHgxMDEzODIsIDB4MzA0MjAwMWMsIDB4M2MwMzAwMDEsIDB4MjQ2MzVkMDgsIAorMHg0MzEwMjEsIDB4ODIzODIxLCAweDNjMDIwMDIwLCAweDIwMjEwMjQsIAorMHgxMDQwMDAwNiwgMHgyNDAyMDEwMCwgMHgzYzAxMDAwMSwgMHgzMTA4MjEsIAorMHhhYzIyN2U0MCwgMHg4MDA1MTUwLCAweDNjMDIwMDgwLCAweDNjMDEwMDAxLCAKKzB4MzEwODIxLCAweGFjMjA3ZTQwLCAweDNjMDIwMDgwLCAweDIwMjEwMjQsIAorMHgxMDQwMDAwNiwgMHgxMjE5NDAsIDB4M2MwMjAwMDEsIDB4M2MwMTAwMDEsIAorMHgyMzA4MjEsIDB4ODAwNTE1YywgMHhhYzIyN2U0OCwgMHgxMjExNDAsIAorMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4YWMyMDdlNDgsIDB4OTRlNDAwMDAsIAorMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgMHgyNDAyMDAwNSwgMHgxMDYyMDAxMCwgCisweGE3YTQwMDE4LCAweDMyMDI0MDAwLCAweDEwNDAwMDAyLCAweDM0ODI0MDAwLCAKKzB4YTdhMjAwMTgsIDB4MjQwNDAwMDEsIDB4OTRlMjAwMDIsIDB4MjQwNTAwMDQsIAorMHgyNGU2MDAwMiwgMHgzNDQyMDAwMSwgMHhjMDA0OThlLCAweGE0ZTIwMDAyLCAKKzB4MjQwNDAwMDEsIDB4MjgyMSwgMHhjMDA0OThlLCAweDI3YTYwMDE4LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjVjYzgsIDB4MjQxMTAwMDEsIDB4M2MwMTAwMDEsIAorMHhhYzMxNWNkNCwgMHgxNDUzMDAwNCwgMHgzMjAyODAwMCwgMHhjMDA0MjliLCAKKzB4MCwgMHgzMjAyODAwMCwgMHgxMDQwMDExZiwgMHgwLCAKKzB4YzAwNDI5YiwgMHgwLCAweDNjMDMwMDAxLCAweDhjNjM1ZGJjLCAKKzB4MjQwMjAwMDUsIDB4MTA2MjAxMTgsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsIAorMHhhYzMxNWNjYywgMHgzYzAxMDAwMSwgMHg4MDA1MjliLCAweGFjMjI1Y2M4LCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMDQsIDB4MjdiMDAwMWEsIDB4YzAwNDk4ZSwgCisweDIwMDMwMjEsIDB4MjQwNDAwMDEsIDB4MjgyMSwgMHhjMDA0OThlLCAKKzB4MjAwMzAyMSwgMHgzYzAyMDAwMSwgMHg1MTEwMjEsIDB4OGM0MjdlMzQsIAorMHgzYzA0MDAwMSwgMHg4Yzg0NWNjOCwgMHgzYzAzYmZmZiwgMHgzNDYzZmZmZiwgCisweDNjMDEwMDAxLCAweGFjMzM1Y2Q0LCAweDQzMTAyNCwgMHgzYzAxMDAwMSwgCisweDMxMDgyMSwgMHgxMDkzMDBmYSwgMHhhYzIyN2UzNCwgMHg4MDA1MjliLCAKKzB4MCwgMHgzYzAyMjAwMCwgMHgyMDIxMDI0LCAweDEwNDAwMDA1LCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOTgsIDB4ODAwNTFhZCwgCisweDEyODk0MCwgMHgzYzAxMDAwMSwgMHhhYzIwNWQ5OCwgMHgxMjg5NDAsIAorMHgzYzAxMDAwMSwgMHgzMTA4MjEsIDB4YWMzMDdlMzgsIDB4M2MwMjQwMDAsIAorMHgyMDIxMDI0LCAweDE0NDAwMDE2LCAweDAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWQ5OCwgMHgxMDQwMDAwOCwgMHgyNDA0MDAwNCwgMHgyNDA1MDAwMSwgCisweGMwMDRkOTMsIDB4MjQwNjIwMDAsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4YWMyMjgzYWMsIDB4M2MwMjAwMDEsIDB4NTExMDIxLCAKKzB4OGM0MjdlMzAsIDB4M2MwM2JmZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4M2MwMTAwMDEsIDB4MzEwODIxLCAweDgwMDUyOTksIDB4YWMyMjdlMzAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWQ5OCwgMHgxMDQwMDAyOCwgMHgzYzAzMDBhMCwgCisweDIwMzEwMjQsIDB4NTQ0MzAwMGQsIDB4M2MwMjAwMjAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWQ5YywgMHgyNDAzMDEwMCwgMHgzYzAxMDAwMSwgMHgzMTA4MjEsIAorMHhhYzIzN2U0NCwgMHgzYzAzMDAwMSwgMHgzYzAxMDAwMSwgMHgzMTA4MjEsIAorMHhhYzIzN2U0YywgMHg4MDA1MWYwLCAweDM0NDIwNDAwLCAweDIwMjEwMjQsIAorMHgxMDQwMDAwOCwgMHgyNDAzMDEwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5YywgCisweDNjMDEwMDAxLCAweDMxMDgyMSwgMHhhYzIzN2U0NCwgMHg4MDA1MWYwLCAKKzB4MzQ0MjA4MDAsIDB4M2MwMjAwODAsIDB4MjAyMTAyNCwgMHgxMDQwMDAyZSwgCisweDNjMDMwMDAxLCAweDNjMDIwMDAxLCAweDhjNDI1ZDljLCAweDNjMDEwMDAxLCAKKzB4MzEwODIxLCAweGFjMjM3ZTRjLCAweDM0NDIwYzAwLCAweDNjMDEwMDAxLCAKKzB4YWMyMjVkOWMsIDB4ODAwNTIxOCwgMHgyNDA0MDAwMSwgMHgzYzAyMDAyMCwgCisweDIwMjEwMjQsIDB4MTA0MDAwMDYsIDB4MjQwMjAxMDAsIDB4M2MwMTAwMDEsIAorMHgzMTA4MjEsIDB4YWMyMjdlNDQsIDB4ODAwNTIwMSwgMHgzYzAyMDA4MCwgCisweDNjMDEwMDAxLCAweDMxMDgyMSwgMHhhYzIwN2U0NCwgMHgzYzAyMDA4MCwgCisweDIwMjEwMjQsIDB4MTA0MDAwMDcsIDB4MTIxOTQwLCAweDNjMDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjI3ZTRjLCAweDgwMDUyMGYsIAorMHgyNDA0MDAwMSwgMHgxMjExNDAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAKKzB4YWMyMDdlNGMsIDB4MjQwNDAwMDEsIDB4MjgyMSwgMHgyN2IwMDAxZSwgCisweGMwMDQ5NGMsIDB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyODIxLCAKKzB4YzAwNDk0YywgMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDAxLCAKKzB4MjdiMDAwMWMsIDB4YzAwNDk0YywgMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAKKzB4MjQwNTAwMDEsIDB4YzAwNDk0YywgMHgyMDAzMDIxLCAweDgwMDUyOTksIAorMHgwLCAweDNjMDJmZmVjLCAweDM0NDJmZmZmLCAweDIwMjgwMjQsIAorMHgzYzAyMDAwOCwgMHgyMDI4MDI1LCAweDEyMTE0MCwgMHgzYzAxMDAwMSwgCisweDIyMDgyMSwgMHhhYzMwN2UzOCwgMHgzYzAyMjAwMCwgMHgyMDIxMDI0LCAKKzB4MTA0MDAwMDksIDB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ3NCwgCisweDE0NDAwMDA1LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1ZDk4LCAKKzB4ODAwNTIzYSwgMHgzYzAyNDAwMCwgMHgzYzAxMDAwMSwgMHhhYzIwNWQ5OCwgCisweDNjMDI0MDAwLCAweDIwMjEwMjQsIDB4MTQ0MDAwMWUsIDB4MCwgCisweDNjMDIwMDAxLCAweDhjNDI1ZDk4LCAweDNjMDEwMDAxLCAweGFjMjA1Y2UwLCAKKzB4MTA0MDAwMDcsIDB4MjQwMjIwMjAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOWMsIAorMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzYWMsIAorMHgzYzA0YmZmZiwgMHgxMjE5NDAsIDB4M2MwMjAwMDEsIDB4NDMxMDIxLCAKKzB4OGM0MjdlMzAsIDB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsIDB4MzQ4NGZmZmYsIAorMHg0NDEwMjQsIDB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjI3ZTMwLCAKKzB4MjQwMjAwMDEsIDB4MTBhMjAwNDQsIDB4MCwgMHg4MDA1Mjk5LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5OCwgMHgxMDQwMDAxYywgCisweDI0MDIyMDAwLCAweDNjMDEwMDAxLCAweGFjMjI1ZDljLCAweDNjMDMwMGEwLCAKKzB4MjAzMTAyNCwgMHgxNDQzMDAwNSwgMHgxMjExNDAsIDB4MzQwMmEwMDAsIAorMHgzYzAxMDAwMSwgMHg4MDA1Mjk0LCAweGFjMjI1ZDljLCAweDNjMDMwMDAxLCAKKzB4NjIxODIxLCAweDhjNjM3ZTM4LCAweDNjMDIwMDIwLCAweDYyMTAyNCwgCisweDEwNDAwMDA0LCAweDI0MDIyMDAxLCAweDNjMDEwMDAxLCAweDgwMDUyOTQsIAorMHhhYzIyNWQ5YywgMHgzYzAyMDA4MCwgMHg2MjEwMjQsIDB4MTA0MDAwMWYsIAorMHgzNDAyYTAwMSwgMHgzYzAxMDAwMSwgMHg4MDA1Mjk0LCAweGFjMjI1ZDljLCAKKzB4M2MwMjAwMjAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwNywgMHgxMjE5NDAsIAorMHgyNDAyMDEwMCwgMHgzYzAxMDAwMSwgMHgyMzA4MjEsIDB4YWMyMjdlNDQsIAorMHg4MDA1Mjg4LCAweDNjMDIwMDgwLCAweDEyMTE0MCwgMHgzYzAxMDAwMSwgCisweDIyMDgyMSwgMHhhYzIwN2U0NCwgMHgzYzAyMDA4MCwgMHgyMDIxMDI0LCAKKzB4MTA0MDAwMDYsIDB4MTIxOTQwLCAweDNjMDIwMDAxLCAweDNjMDEwMDAxLCAKKzB4MjMwODIxLCAweDgwMDUyOTQsIDB4YWMyMjdlNGMsIDB4MTIxMTQwLCAKKzB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGFjMjA3ZTRjLCAweDNjMDMwMDAxLCAKKzB4OGM2MzVjYzgsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMDMsIDB4MCwgCisweGMwMDQyOWIsIDB4MCwgMHg4ZmJmMDAzMCwgMHg4ZmIzMDAyYywgCisweDhmYjIwMDI4LCAweDhmYjEwMDI0LCAweDhmYjAwMDIwLCAweDNlMDAwMDgsIAorMHgyN2JkMDAzOCwgMHgyN2JkZmZkOCwgMHhhZmIyMDAyMCwgMHg4MDkwMjEsIAorMHhhZmIxMDAxYywgMHg4ODIxLCAweDI0MDIwMDAyLCAweGFmYmYwMDI0LCAKKzB4YWZiMDAwMTgsIDB4YTdhMDAwMTIsIDB4MTBhMjAwZDMsIDB4YTdhMDAwMTAsIAorMHgyY2EyMDAwMywgMHgxMDQwMDAwNSwgMHgyNDAyMDAwMSwgMHgxMGEyMDAwYSwgCisweDEyODE0MCwgMHg4MDA1MzgwLCAweDIyMDEwMjEsIDB4MjQwMjAwMDQsIAorMHgxMGEyMDA3ZCwgMHgyNDAyMDAwOCwgMHgxMGEyMDA3YywgMHgxMjI5NDAsIAorMHg4MDA1MzgwLCAweDIyMDEwMjEsIDB4M2MwMzAwMDEsIDB4NzAxODIxLCAKKzB4OGM2MzdlM2MsIDB4M2MwMjQwMDAsIDB4NjIxMDI0LCAweDE0NDAwMDA5LCAKKzB4MjQwNDAwMDEsIDB4M2MwMjdmZmYsIDB4MzQ0MmZmZmYsIDB4NjI4ODI0LCAKKzB4M2MwMTAwMDEsIDB4MzAwODIxLCAweGFjMzE3ZTM0LCAweDgwMDUzODAsIAorMHgyMjAxMDIxLCAweDI0MDUwMDAxLCAweGMwMDQ5NGMsIDB4MjdhNjAwMTAsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0OTRjLCAweDI3YTYwMDEwLCAKKzB4OTdhMjAwMTAsIDB4MzA0MjAwMDQsIDB4MTA0MDAwMzQsIDB4M2MxMTQwMDAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWRiYywgMHgyNDQzZmZmZiwgMHgyYzYyMDAwNiwgCisweDEwNDAwMDM0LCAweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgCisweDhjMjI1YmUwLCAweDQwMDAwOCwgMHgwLCAweDI0MDQwMDAxLCAKKzB4MjQwNTAwMTEsIDB4MjdiMDAwMTIsIDB4YzAwNDk0YywgMHgyMDAzMDIxLCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMTEsIDB4YzAwNDk0YywgMHgyMDAzMDIxLCAKKzB4OTdhNTAwMTIsIDB4MzBhMjQwMDAsIDB4MTA0MDAwMDIsIDB4M2MwNDAwMTAsIAorMHgzYzA0MDAwOCwgMHgzYzAzMDAwMSwgMHg4MDA1MzAxLCAweDMwYTI4MDAwLCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMTQsIDB4MjdiMDAwMTIsIDB4YzAwNDk0YywgCisweDIwMDMwMjEsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMTQsIDB4YzAwNDk0YywgCisweDIwMDMwMjEsIDB4OTdhNTAwMTIsIDB4MzBhMjEwMDAsIDB4MTA0MDAwMDIsIAorMHgzYzA0MDAxMCwgMHgzYzA0MDAwOCwgMHgzYzAzMDAwMSwgMHgzMGEyMDgwMCwgCisweDU0NDAwMDAxLCAweDNjMDMwMDAyLCAweDNjMDI4MDAwLCAweDIyMjEwMjUsIAorMHg2NDE4MjUsIDB4ODAwNTMwZSwgMHg0Mzg4MjUsIDB4M2MxMTAwMDEsIAorMHgyMzA4ODIxLCAweDhlMzE3ZTNjLCAweDNjMDI3ZmZmLCAweDM0NDJmZmZmLCAKKzB4MjIyODgyNCwgMHgzYzAyMDAwMSwgMHg4YzQyNWNkOCwgMHgxMDQwMDAxZCwgCisweDEyMTE0MCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5OCwgMHgxMDQwMDAwMiwgCisweDNjMDIyMDAwLCAweDIyMjg4MjUsIDB4MTIxMTQwLCAweDNjMDEwMDAxLCAKKzB4MjIwODIxLCAweDhjMjI3ZTQwLCAweDEwNDAwMDAzLCAweDNjMDIwMDIwLCAKKzB4ODAwNTMyMiwgMHgyMjI4ODI1LCAweDNjMDJmZmRmLCAweDM0NDJmZmZmLCAKKzB4MjIyODgyNCwgMHgxMjExNDAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAKKzB4OGMyMjdlNDgsIDB4MTA0MDAwMDMsIDB4M2MwMjAwODAsIDB4ODAwNTMyZCwgCisweDIyMjg4MjUsIDB4M2MwMmZmN2YsIDB4MzQ0MmZmZmYsIDB4MjIyODgyNCwgCisweDEyMTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4YWMzMTdlMzQsIAorMHg4MDA1MzgwLCAweDIyMDEwMjEsIDB4MTIyOTQwLCAweDNjMDMwMDAxLCAKKzB4NjUxODIxLCAweDhjNjM3ZTM4LCAweDNjMDI0MDAwLCAweDYyMTAyNCwgCisweDE0NDAwMDA4LCAweDNjMDI3ZmZmLCAweDM0NDJmZmZmLCAweDYyODgyNCwgCisweDNjMDEwMDAxLCAweDI1MDgyMSwgMHhhYzMxN2UzMCwgMHg4MDA1MzgwLCAKKzB4MjIwMTAyMSwgMHgzYzAyMDAwMSwgMHg4YzQyNWNkOCwgMHgxMDQwMDAzMywgCisweDNjMTFjMDBjLCAweDNjMDIwMDAxLCAweDhjNDI1ZDc0LCAweDNjMDRjMDBjLCAKKzB4MzQ4NDIwMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVkOTgsIDB4MjEwMmIsIAorMHgyMTAyMywgMHg0NDEwMjQsIDB4MTA2MDAwMDMsIDB4NTE4ODI1LCAKKzB4M2MwMjIwMDAsIDB4MjIyODgyNSwgMHgzYzAyMDAwMSwgMHg0NTEwMjEsIAorMHg4YzQyN2U0NCwgMHgxMDQwMDAwMywgMHgzYzAyMDAyMCwgMHg4MDA1MzVkLCAKKzB4MjIyODgyNSwgMHgzYzAyZmZkZiwgMHgzNDQyZmZmZiwgMHgyMjI4ODI0LCAKKzB4MTIxMTQwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyN2U0YywgCisweDEwNDAwMDAzLCAweDNjMDIwMDgwLCAweDgwMDUzNjgsIDB4MjIyODgyNSwgCisweDNjMDJmZjdmLCAweDM0NDJmZmZmLCAweDIyMjg4MjQsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWQ2MCwgMHgxMDQwMDAwMiwgMHgzYzAyMDgwMCwgMHgyMjI4ODI1LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjVkNjQsIDB4MTA0MDAwMDIsIDB4M2MwMjA0MDAsIAorMHgyMjI4ODI1LCAweDNjMDIwMDAxLCAweDhjNDI1ZDY4LCAweDEwNDAwMDA2LCAKKzB4M2MwMjAxMDAsIDB4ODAwNTM3YiwgMHgyMjI4ODI1LCAweDNjMDI3ZmZmLCAKKzB4MzQ0MmZmZmYsIDB4NjI4ODI0LCAweDEyMTE0MCwgMHgzYzAxMDAwMSwgCisweDIyMDgyMSwgMHhhYzMxN2UzMCwgMHgyMjAxMDIxLCAweDhmYmYwMDI0LCAKKzB4OGZiMjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgCisweDI3YmQwMDI4LCAweDI3YmRmZmQ4LCAweGFmYjQwMDIwLCAweDgwYTAyMSwgCisweGFmYmYwMDI0LCAweGFmYjMwMDFjLCAweGFmYjIwMDE4LCAweGFmYjEwMDE0LCAKKzB4YWZiMDAwMTAsIDB4OGY5MDAyMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVjYzgsIAorMHg4ZjkzMDIyMCwgMHgyNDAyMDAwMiwgMHgxMDYyMDA2MywgMHgyYzYyMDAwMywgCisweDEwNDAwMDA1LCAweDI0MDIwMDAxLCAweDEwNjIwMDBhLCAweDE0MTk0MCwgCisweDgwMDU0NDgsIDB4MCwgMHgyNDAyMDAwNCwgMHgxMDYyMDA1YSwgCisweDI0MDIwMDA4LCAweDEwNjIwMDU5LCAweDE0OTE0MCwgMHg4MDA1NDQ4LCAKKzB4MCwgMHgzYzA0MDAwMSwgMHg4MzIwMjEsIDB4OGM4NDdlM2MsIAorMHgzYzExMDAwMSwgMHgyMjM4ODIxLCAweDhlMzE3ZTM0LCAweDNjMDI0MDAwLCAKKzB4ODIxMDI0LCAweDEwNDAwMDNlLCAweDNjMDIwMDA4LCAweDIyMjEwMjQsIAorMHgxMDQwMDAyMCwgMHgzNjEwMDAwMiwgMHgzYzAyMDAwMSwgMHg0MzEwMjEsIAorMHg4YzQyN2U0MCwgMHgxMDQwMDAwNSwgMHgzNjEwMDAyMCwgMHgzNjEwMDEwMCwgCisweDNjMDIwMDIwLCAweDgwMDUzYmQsIDB4MjIyODgyNSwgMHgyNDAyZmVmZiwgCisweDIwMjgwMjQsIDB4M2MwMmZmZGYsIDB4MzQ0MmZmZmYsIDB4MjIyODgyNCwgCisweDE0MTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjdlNDgsIAorMHgxMDQwMDAwNSwgMHgzYzAyMDAwMSwgMHgyNjI5ODI1LCAweDNjMDIwMDgwLCAKKzB4ODAwNTNkYywgMHgyMjI4ODI1LCAweDNjMDJmZmZlLCAweDM0NDJmZmZmLCAKKzB4MjYyOTgyNCwgMHgzYzAyZmY3ZiwgMHgzNDQyZmZmZiwgMHg4MDA1M2RjLCAKKzB4MjIyODgyNCwgMHgyNDAyZmVkZiwgMHgyMDI4MDI0LCAweDNjMDJmZmZlLCAKKzB4MzQ0MmZmZmYsIDB4MjYyOTgyNCwgMHgzYzAyZmY1ZiwgMHgzNDQyZmZmZiwgCisweDIyMjg4MjQsIDB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjA3ZTQwLCAKKzB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjA3ZTQ4LCAweGMwMDQ4NmEsIAorMHgwLCAweGFmOTAwMjAwLCAweGFmOTMwMjIwLCAweDhmODIwMjIwLCAKKzB4MjQwM2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAweDhmODIwMjIwLCAKKzB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4ODAwNTNmMywgMHgxNDExNDAsIAorMHg4ZjgyMDIwMCwgMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YzAwNDg2YSwgCisweGFmODIwMjAwLCAweDNjMDJiZmZmLCAweDM0NDJmZmZmLCAweGMwMDQyOWIsIAorMHgyMjI4ODI0LCAweDE0MTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIAorMHg4MDA1NDQ4LCAweGFjMzE3ZTM0LCAweDE0OTE0MCwgMHgzYzA0MDAwMSwgCisweDkyMjAyMSwgMHg4Yzg0N2UzOCwgMHgzYzExMDAwMSwgMHgyMzI4ODIxLCAKKzB4OGUzMTdlMzAsIDB4M2MwMjQwMDAsIDB4ODIxMDI0LCAweDE0NDAwMDExLCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5OCwgMHgxNDQwMDAwNiwgCisweDNjMDJiZmZmLCAweDhmODIwMjAwLCAweDM0NDIwMDAyLCAweGMwMDQ4NmEsIAorMHhhZjgyMDIwMCwgMHgzYzAyYmZmZiwgMHgzNDQyZmZmZiwgMHhjMDA0MjliLCAKKzB4MjIyODgyNCwgMHgzYzAxMDAwMSwgMHgzMjA4MjEsIDB4ODAwNTQ0OCwgCisweGFjMzE3ZTMwLCAweDNjMDIwMDAxLCAweDhjNDI1ZDk4LCAweDEwNDAwMDA1LCAKKzB4M2MwMjAwMjAsIDB4M2MwMjAwMDEsIDB4OGM0MjVkNzQsIDB4MTA0MDAwMmIsIAorMHgzYzAyMDAyMCwgMHg4MjEwMjQsIDB4MTA0MDAwMDcsIDB4MzYxMDAwMjAsIAorMHgyNDAyMDEwMCwgMHgzYzAxMDAwMSwgMHgzMjA4MjEsIDB4YWMyMjdlNDQsIAorMHg4MDA1NDI4LCAweDM2MTAwMTAwLCAweDNjMDEwMDAxLCAweDMyMDgyMSwgCisweGFjMjA3ZTQ0LCAweDI0MDJmZWZmLCAweDIwMjgwMjQsIDB4M2MwMjAwODAsIAorMHg4MjEwMjQsIDB4MTA0MDAwMDcsIDB4MTQxOTQwLCAweDNjMDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjI3ZTRjLCAweDgwMDU0MzksIAorMHgyNjI5ODI1LCAweDE0MTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIAorMHhhYzIwN2U0YywgMHgzYzAyZmZmZSwgMHgzNDQyZmZmZiwgMHgyNjI5ODI0LCAKKzB4YzAwNDg2YSwgMHgwLCAweGFmOTAwMjAwLCAweGFmOTMwMjIwLCAKKzB4OGY4MjAyMjAsIDB4MjQwM2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAKKzB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4MTQxMTQwLCAKKzB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGFjMzE3ZTMwLCAweDhmYmYwMDI0LCAKKzB4OGZiNDAwMjAsIDB4OGZiMzAwMWMsIDB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsIAorMHg4ZmIwMDAxMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDAgfTsKK3N0YXRpYyB1MzIgdGlnb25Gd1JvZGF0YVsoTUFYX1JPREFUQV9MRU4vNCkgKyAxXSBfX2luaXRkYXRhID0geworMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjY2Nzc2ZCwgMHg2MTY5NmUyZSwgMHg2MzJjNzYyMCwgMHgzMTJlMzEyZSwgCisweDMyMmUzMTMxLCAweDIwMzEzOTM5LCAweDM4MmYzMDM0LCAweDJmMzIzNzIwLCAKKzB4MzIzMjNhMzEsIDB4MzMzYTM0MzIsIDB4MjA3MzY4NzUsIDB4NjE2ZTY3MjAsIAorMHg0NTc4NzAyMCwgMHgyNDAwMDAwMCwgMHg3NDY4NjU1ZiwgMHg0NDQxNTc0ZSwgCisweDAsIDB4NTM1NDQxNDMsIDB4NGI1ZjMxMjAsIDB4MCwgCisweDQyNjE2NDUzLCAweDZlNjQ1MjZlLCAweDY3MDAwMDAwLCAweDNmNDU2ZTcxLCAKKzB4NDU3Njc0MDAsIDB4M2Y2ZTZmNTEsIDB4NjQ0NTc2NTAsIDB4MCwgCisweDY1NzY1MjZlLCAweDY3NDY3NTZjLCAweDZjMDAwMDAwLCAweDQ5NmM2YzQzLCAKKzB4NmY2ZTY2NTIsIDB4NzgwMDAwMDAsIDB4NTM2NTZlNjQsIDB4NDM2YjUzNzUsIAorMHg2ZDAwMDAwMCwgMHg1MjY1NjM3NiwgMHg1NjZjNjE2ZSwgMHgwLCAKKzB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjc0Njk2ZCwgMHg2NTcyMmU2MywgMHgyYzc2MjAzMSwgMHgyZTMxMmUzMiwgCisweDJlMzgyMDMxLCAweDM5MzkzODJmLCAweDMwMzcyZjMzLCAweDMxMjAzMTM3LCAKKzB4M2EzNTM4M2EsIDB4MzQzNTIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsIAorMHg3MDIwMjQwMCwgMHg1NDJkNDQ2ZCwgMHg2MTUyNjQzMSwgMHgwLCAKKzB4NTQyZDQ0NmQsIDB4NjE0MjQyMDAsIDB4NTQyZDQ0NmQsIDB4NjEzMjAwMDAsIAorMHgzZjZlNmY1MSwgMHg2NDU0Nzg0NSwgMHgwLCAweDNmNmU2ZjUxLCAKKzB4NjQ1Mjc4NDUsIDB4MCwgMHg2NTZlNzE0ZCwgMHg0NTc2NTA0NiwgCisweDYxNjk2YzAwLCAweDY1NmU3MTRkLCAweDQ1NzY0NjYxLCAweDY5NmMwMDAwLCAKKzB4NjY2MTY5NmMsIDB4NDU2ZTQ1NGQsIDB4MCwgMHgzZjQ1NmU3MSwgCisweDQ1NzY3NDAwLCAweDNmNmU2ZjUxLCAweDY0NDU3NjUwLCAweDAsIAorMHg2NTc2NTI2ZSwgMHg2NzQ2NzU2YywgMHg2YzAwMDAwMCwgMHgwLCAKKzB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjYzNmY2ZCwgMHg2ZDYxNmU2NCwgMHgyZTYzMmM3NiwgMHgyMDMxMmUzMSwgCisweDJlMzIyZTMxLCAweDMwMjAzMTM5LCAweDM5MzgyZjMxLCAweDMxMmYzMTM4LCAKKzB4MjAzMTM3M2EsIDB4MzEzMTNhMzEsIDB4MzgyMDczNjgsIDB4NzU2MTZlNjcsIAorMHgyMDQ1Nzg3MCwgMHgyMDI0MDAwMCwgMHgzZjRkNjI2ZiwgMHg3ODQ1NzY3NCwgCisweDAsIDB4NGU0ZjYzNmYsIDB4NmQ2MTZlNjQsIDB4MCwgCisweDY4NzM3NDY1LCAweDVmNDU1MjUyLCAweDAsIDB4NDEyZDQ1NzIsIAorMHg3MjQyNzU2MywgMHgwLCAweDQ1NTI1MjRmLCAweDUyMmQ0MTY0LCAKKzB4NjQwMDAwMDAsIDB4NjU2ZTcxNGQsIDB4NDU3NjUwNDYsIDB4NjE2OTZjMDAsIAorMHg2NTZlNzE0ZCwgMHg0NTc2NDY2MSwgMHg2OTZjMDAwMCwgMHg2NjYxNjk2YywgCisweDQ1NmU0NTRkLCAweDAsIDB4NDQyZDQ1NzIsIDB4NzI0YzYxNzMsIAorMHg3NDAwMDAwMCwgMHg0NDJkNDU3MiwgMHg3MjMyMDAwMCwgMHg2ZDQzNzM3NCwgCisweDRkNjQ0NTUyLCAweDUyMDAwMDAwLCAweDcwNzI2ZjZkLCAweDRkNjQ0NTUyLCAKKzB4NTIwMDAwMDAsIDB4NDY2OTZjNzQsIDB4NGQ2NDQ1NTIsIDB4NTIwMDAwMDAsIAorMHg2MzZkNjQ1ZiwgMHg0NTUyNTIwMCwgMHgzZjQ1NmU3MSwgMHg0NTc2NzQwMCwgCisweDNmNmU2ZjUxLCAweDY0NDU3NjUwLCAweDAsIDB4NjU3NjUyNmUsIAorMHg2NzQ2NzU2YywgMHg2YzAwMDAwMCwgMHgwLCAweDZlYTAsIAorMHg3ZmJjLCAweDZlMzgsIDB4ODczNCwgMHg4MmIwLCAKKzB4ODc4MCwgMHg4NzgwLCAweDZmNTQsIDB4NzY5NCwgCisweDdmMGMsIDB4ODBhOCwgMHg4MDc0LCAweDg3ODAsIAorMHg3ZTcwLCAweDgwY2MsIDB4NmU2NCwgMHg4MWNjLCAKKzB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjY0NmQ2MSwgMHgyZTYzMmM3NiwgMHgyMDMxMmUzMSwgMHgyZTMyMmUzMywgCisweDIwMzEzOTM5LCAweDM4MmYzMDM0LCAweDJmMzIzNzIwLCAweDMyMzIzYTMxLCAKKzB4MzMzYTM0MzEsIDB4MjA3MzY4NzUsIDB4NjE2ZTY3MjAsIDB4NDU3ODcwMjAsIAorMHgyNDAwMDAwMCwgMHg2NDZkNjE3MiwgMHg2NDQxNTQ0ZSwgMHgwLCAKKzB4NjQ2ZDYxNzcsIDB4NzI0MTU0NGUsIDB4MCwgMHgwLCAKKzB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjc0NzI2MSwgMHg2MzY1MmU2MywgMHgyYzc2MjAzMSwgMHgyZTMxMmUzMiwgCisweDJlMzIyMDMxLCAweDM5MzkzODJmLCAweDMwMzQyZjMyLCAweDM3MjAzMjMyLCAKKzB4M2EzMTMzM2EsIDB4MzUzMDIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsIAorMHg3MDIwMjQwMCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjY0NjE3NCwgMHg2MTJlNjMyYywgMHg3NjIwMzEyZSwgMHgzMTJlMzIyZSwgCisweDMyMjAzMTM5LCAweDM5MzgyZjMwLCAweDM0MmYzMjM3LCAweDIwMzIzMjNhLCAKKzB4MzEzMzNhMzQsIDB4MzAyMDczNjgsIDB4NzU2MTZlNjcsIDB4MjA0NTc4NzAsIAorMHgyMDI0MDAwMCwgMHg0NjU3NWY1NiwgMHg0NTUyNTM0OSwgMHg0ZjRlM2EyMCwgCisweDIzMzEyMDQ2LCAweDcyNjkyMDQxLCAweDcwNzIyMDM3LCAweDIwMzEzNzNhLCAKKzB4MzUzNTNhMzQsIDB4MzgyMDUwNDQsIDB4NTQyMDMyMzAsIDB4MzAzMDAwMDAsIAorMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY1NCwgMHg0OTRkNDUzYSwgCisweDIwMzEzNzNhLCAweDM1MzUzYTM0LCAweDM4MDAwMDAwLCAweDQ2NTc1ZjQzLCAKKzB4NGY0ZDUwNDksIDB4NGM0NTVmNDIsIDB4NTkzYTIwNjQsIDB4NjU3NjcyNjMsIAorMHg3MzAwMDAwMCwgMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY0OCwgCisweDRmNTM1NDNhLCAweDIwNjM2ZjZkLCAweDcwNzU3NDY1LCAweDAsIAorMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY0NCwgMHg0ZjRkNDE0OSwgCisweDRlM2EyMDY1LCAweDZlNjcyZTYxLCAweDYzNzQ2NTZmLCAweDZlMmU2MzZmLCAKKzB4NmQwMDAwMDAsIDB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksIDB4NGM0NTUyM2EsIAorMHgyMDY3NjM2MywgMHgyMDc2NjU3MiwgMHg3MzY5NmY2ZSwgMHgyMDMyMmUzNywgCisweDJlMzIwMDAwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjZkNjU2ZCwgMHgyZTYzMmM3NiwgMHgyMDMxMmUzMSwgMHgyZTMyMmUzMiwgCisweDIwMzEzOTM5LCAweDM4MmYzMDM0LCAweDJmMzIzNzIwLCAweDMyMzIzYTMxLCAKKzB4MzMzYTM0MzQsIDB4MjA3MzY4NzUsIDB4NjE2ZTY3MjAsIDB4NDU3ODcwMjAsIAorMHgyNDAwMDAwMCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjczNjU2ZSwgMHg2NDJlNjMyYywgMHg3NjIwMzEyZSwgMHgzMTJlMzIyZSwgCisweDMxMzEyMDMxLCAweDM5MzkzODJmLCAweDMxMzIyZjMyLCAweDMyMjAzMTM3LCAKKzB4M2EzMTM3M2EsIDB4MzUzNTIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsIAorMHg3MDIwMjQwMCwgMHg3MzZlNjQ2NCwgMHg2NTRlNmY1MSwgMHgyMDAwMDAwMCwgCisweDZlNmY0NTRlLCAweDUxNWY1NDU4LCAweDAsIDB4NzM2ZTY0NjQsIAorMHg3NDRlNmY1MSwgMHgyMDAwMDAwMCwgMHgzZjZlNmY1MSwgMHg2NDU0Nzg0NSwgCisweDAsIDB4NzU2ZTZiNzIsIDB4NjQ3NDc5NzAsIDB4NjUwMDAwMDAsIAorMHgwLCAweGFjY2MsIDB4YWNjYywgMHhhZDljLCAKKzB4YWFiMCwgMHhhYWIwLCAweGFkOWMsIDB4YWQ5YywgCisweGFkOWMsIDB4YWQ5YywgMHhhZDljLCAweGFkOWMsIAorMHhhZDljLCAweGFkOWMsIDB4YWQ5YywgMHhhZDljLCAKKzB4YWQ5YywgMHhhZDljLCAweGFkOWMsIDB4YWQ3YywgCisweDAsIDB4YmNhOCwgMHhiY2E4LCAweGJkNzAsIAorMHhhZTRjLCAweGIwNTgsIDB4YmQ3MCwgMHhiZDcwLCAKKzB4YmQ3MCwgMHhiZDcwLCAweGJkNzAsIDB4YmQ3MCwgCisweGJkNzAsIDB4YmQ3MCwgMHhiZDcwLCAweGJkNzAsIAorMHhiZDcwLCAweGJkNzAsIDB4YmQ3MCwgMHhiZDU0LCAKKzB4YjA0MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjcyNjU2MywgMHg3NjJlNjMyYywgMHg3NjIwMzEyZSwgMHgzMTJlMzIyZSwgCisweDMxMzkyMDMxLCAweDM5MzkzODJmLCAweDMwMzcyZjMyLCAweDM0MjAzMjMxLCAKKzB4M2EzMzMwM2EsIDB4MzAzNTIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsIAorMHg3MDIwMjQwMCwgMHg3MDZiNTI3OCwgMHg0NTUyNTIwMCwgMHg2NjcyNmQzMiwgCisweDRjNjE3MjY3LCAweDY1MDAwMDAwLCAweDcyNzg0ZTZmLCAweDUyNzg0MjY0LCAKKzB4MCwgMHg3Mjc4NTE0NCwgMHg2ZDYxNDQ0NiwgMHgwLCAKKzB4NzI3ODUxNDQsIDB4NmQ2MTQyNDYsIDB4MCwgMHgzZjZlNmY1MSwgCisweDY0NTI3ODQ1LCAweDAsIDB4NzA2YjUyNzgsIDB4NDU1MjUyNzMsIAorMHgwLCAweDY2NzI2ZDMyLCAweDRjNzI2NzUzLCAweDAsIAorMHg3Mjc4NGU2ZiwgMHg0MjY0NTMwMCwgMHgzZjcyNDI2NCwgMHg0NDZkNjE0NiwgCisweDAsIDB4M2Y3MjRhNDIsIDB4NjQ0NDZkNDYsIDB4MCwgCisweDAsIDB4ZjY3OCwgMHhmNjc4LCAweGY2NzgsIAorMHhmNjc4LCAweGY2NzgsIDB4ZjY3OCwgMHhmNjc4LCAKKzB4ZjY3OCwgMHhmNjc4LCAweGY2NzgsIDB4ZjY3OCwgCisweGY2NzgsIDB4ZjY3OCwgMHhmNjc4LCAweGY2NzgsIAorMHhmNjcwLCAweGY2NzAsIDB4ZjY3MCwgMHg1NzJkNDQ0ZCwgCisweDQxNDU2ZTQ2LCAweDAsIDB4MCwgMHhmZGMwLCAKKzB4MTAxNWMsIDB4ZmRkYywgMHgxMDE1YywgMHgxMDE1YywgCisweDEwMTVjLCAweDEwMTVjLCAweDEwMTVjLCAweDEwMTVjLCAKKzB4ZjcwNCwgMHgxMDE1YywgMHgxMDE1YywgMHgxMDE1YywgCisweDEwMTVjLCAweDEwMTVjLCAweDEwMTU0LCAweDEwMTU0LCAKKzB4MTAxNTQsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsIAorMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwgCisweDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLCAKKzB4MmY2ZDYxNjMsIDB4MmU2MzJjNzYsIDB4MjAzMTJlMzEsIDB4MmUzMjJlMzEsIAorMHgzMjIwMzEzOSwgMHgzOTM4MmYzMCwgMHgzNDJmMzIzNywgMHgyMDMyMzIzYSwgCisweDMxMzMzYTM0LCAweDMyMjA3MzY4LCAweDc1NjE2ZTY3LCAweDIwNDU3ODcwLCAKKzB4MjAyNDAwMDAsIDB4NmQ2MTYzNzQsIDB4Nzg0MTU0NGUsIDB4MCwgCisweDRlNzQ1Mzc5LCAweDZlMjY0YzZiLCAweDAsIDB4NzI2NTZkNjEsIAorMHg3MzczNzI3NCwgMHgwLCAweDZjNjk2ZTZiLCAweDQ0NGY1NzRlLCAKKzB4MCwgMHg2NTZlNzE0ZCwgMHg0NTc2NTA0NiwgMHg2MTY5NmMwMCwgCisweDY1NmU3MTRkLCAweDQ1NzY0NjYxLCAweDY5NmMwMDAwLCAweDY2NjE2OTZjLCAKKzB4NDU2ZTQ1NGQsIDB4MCwgMHg2YzY5NmU2YiwgMHg1NTUwMDAwMCwgCisweDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsIAorMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwgCisweDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLCAKKzB4MmY2MzZiNzMsIDB4NzU2ZDJlNjMsIDB4MmM3NjIwMzEsIDB4MmUzMTJlMzIsIAorMHgyZTMyMjAzMSwgMHgzOTM5MzgyZiwgMHgzMDM0MmYzMiwgMHgzNzIwMzIzMiwgCisweDNhMzEzMzNhLCAweDMzMzkyMDczLCAweDY4NzU2MTZlLCAweDY3MjA0NTc4LCAKKzB4NzAyMDI0MDAsIDB4NTA3MjZmNjIsIDB4NjU1MDY4NzksIDB4MCwgCisweDZjNmU2YjQxLCAweDUzNTM1MjU0LCAweDAsIDB4MTFiMmMsIAorMHgxMWJjNCwgMHgxMWJmOCwgMHgxMWMyYywgMHgxMWM1OCwgCisweDExYzZjLCAweDExY2E4LCAweDEyMDdjLCAweDExZGU0LCAKKzB4MTFlMjQsIDB4MTFlNTAsIDB4MTFlOTAsIDB4MTFlYzAsIAorMHgxMWVmYywgMHgxMWYzMCwgMHgxMjA3YywgMHgxMjJjMCwgCisweDEyMmQ4LCAweDEyMzAwLCAweDEyMzIwLCAweDEyMzQ4LCAKKzB4MTI0NzgsIDB4MTI0YTAsIDB4MTI0ZjQsIDB4MTI1MWMsIAorMHgwLCAweDEyNzhjLCAweDEyODVjLCAweDEyOTM0LCAKKzB4MTJhMDQsIDB4MTJhNjAsIDB4MTJiM2MsIDB4MTJiNjQsIAorMHgxMmM0MCwgMHgxMmM2OCwgMHgxMmUxMCwgMHgxMmUzOCwgCisweDEyZmUwLCAweDEzMWQ4LCAweDEzNDZjLCAweDEzMzgwLCAKKzB4MTM0NmMsIDB4MTM0OTgsIDB4MTMwMDgsIDB4MTMxYjAsIAorMHgwLCAweDEzYjg0LCAweDEzYmM4LCAweDEzYzYwLCAKKzB4MTNjYWMsIDB4MTNkMWMsIDB4MTNkYjQsIDB4MTNkZTgsIAorMHgxM2U3MCwgMHgxM2YwOCwgMHgxM2ZkOCwgMHgxNDAxOCwgCisweDE0MDljLCAweDE0MGMwLCAweDE0MWY0LCAweDY0NmY0MjYxLCAKKzB4NzM2NTUwNjcsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDczNzQ2ZDYxLCAweDYzNGM0ZTRiLCAweDAsIAorMHgwLCAweDE0YzM4LCAweDE0YzM4LCAweDE0YjgwLCAKKzB4MTRiYzQsIDB4MTRjMzgsIDB4MTRjMzgsIDB4MCwgCisweDAsIDB4MCB9Oworc3RhdGljIHUzMiB0aWdvbkZ3RGF0YVsoTUFYX0RBVEFfTEVOLzQpICsgMV0gX19pbml0ZGF0YSA9IHsKKzB4NDE2Yzc0NjUsIAorMHg2ZjZlMjA0MSwgMHg2MzY1NGU0OSwgMHg0MzIwNTYwMCwgMHg0MTZjNzQ2NSwgCisweDZmNmUyMDQxLCAweDYzNjU0ZTQ5LCAweDQzMjA1NjAwLCAweDQyNDI0MjQyLCAKKzB4MCwgMHgwLCAweDAsIDB4MTM1NDE4LCAKKzB4MTNlN2ZjLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4NjBjZjAwLCAKKzB4NjAsIDB4Y2YwMDAwMDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgzLCAweDAsIAorMHgxLCAweDAsIDB4MCwgMHgwLCAKKzB4MSwgMHgwLCAweDEsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDEsIAorMHgxLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDEwMDAwMDAsIDB4MjEwMDAwMDAsIAorMHgxMjAwMDE0MCwgMHgwLCAweDAsIDB4MjAwMDAwMDAsIAorMHgxMjAwMDBhMCwgMHgwLCAweDEyMDAwMDYwLCAweDEyMDAwMTgwLCAKKzB4MTIwMDAxZTAsIDB4MCwgMHgwLCAweDAsIAorMHgxLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MiwgCisweDAsIDB4MCwgMHgzMDAwMSwgMHgxLCAKKzB4MzAyMDEsIDB4MCwgMHgwLCAweDAgfTsKKyNlbmRpZgorLyogR2VuZXJhdGVkIGJ5IGdlbmZ3LmMgKi8KKyNkZWZpbmUgdGlnb24yRndSZWxlYXNlTWFqb3IgMHhjCisjZGVmaW5lIHRpZ29uMkZ3UmVsZWFzZU1pbm9yIDB4NAorI2RlZmluZSB0aWdvbjJGd1JlbGVhc2VGaXggMHhiCisjZGVmaW5lIHRpZ29uMkZ3U3RhcnRBZGRyIDB4MDAwMDQwMDAKKyNkZWZpbmUgdGlnb24yRndUZXh0QWRkciAweDAwMDA0MDAwCisjZGVmaW5lIHRpZ29uMkZ3VGV4dExlbiAweDExYmMwCisjZGVmaW5lIHRpZ29uMkZ3Um9kYXRhQWRkciAweDAwMDE1YmMwCisjZGVmaW5lIHRpZ29uMkZ3Um9kYXRhTGVuIDB4MTBkMAorI2RlZmluZSB0aWdvbjJGd0RhdGFBZGRyIDB4MDAwMTZjYzAKKyNkZWZpbmUgdGlnb24yRndEYXRhTGVuIDB4MWMwCisjZGVmaW5lIHRpZ29uMkZ3U2Jzc0FkZHIgMHgwMDAxNmU4MAorI2RlZmluZSB0aWdvbjJGd1Nic3NMZW4gMHhjYworI2RlZmluZSB0aWdvbjJGd0Jzc0FkZHIgMHgwMDAxNmY1MAorI2RlZmluZSB0aWdvbjJGd0Jzc0xlbiAweDIwYzAKK3N0YXRpYyB1MzIgdGlnb24yRndUZXh0WyhNQVhfVEVYVF9MRU4vNCkgKyAxXSBfX2luaXRkYXRhID0geworMHgwLCAKKzB4MTAwMDAwMDMsIDB4MCwgMHhkLCAweGQsIAorMHgzYzFkMDAwMSwgMHg4ZmJkNmQyMCwgMHgzYTBmMDIxLCAweDNjMTAwMDAwLCAKKzB4MjYxMDQwMDAsIDB4YzAwMTBjMCwgMHgwLCAweGQsIAorMHgzYzFkMDAwMSwgMHg4ZmJkNmQyNCwgMHgzYTBmMDIxLCAweDNjMTAwMDAwLCAKKzB4MjYxMDQwMDAsIDB4YzAwMTdlMCwgMHgwLCAweGQsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MjAwMDAwOCwgCisweDAsIDB4ODAwMTcyZiwgMHgzYzBhMDAwMSwgMHg4MDAxNzJmLCAKKzB4M2MwYTAwMDIsIDB4ODAwMTcyZiwgMHgwLCAweDgwMDJjYWMsIAorMHgwLCAweDgwMDJjNGYsIDB4MCwgMHg4MDAxNzJmLCAKKzB4M2MwYTAwMDQsIDB4ODAwMzI4YSwgMHgwLCAweDgwMDFhNTIsIAorMHgwLCAweDgwMDM5NGQsIDB4MCwgMHg4MDAzOGY0LCAKKzB4MCwgMHg4MDAxNzJmLCAweDNjMGEwMDA2LCAweDgwMDM5YmIsIAorMHgzYzBhMDAwNywgMHg4MDAxNzJmLCAweDNjMGEwMDA4LCAweDgwMDE3MmYsIAorMHgzYzBhMDAwOSwgMHg4MDAzYTEzLCAweDAsIDB4ODAwMmVhNiwgCisweDAsIDB4ODAwMTcyZiwgMHgzYzBhMDAwYiwgMHg4MDAxNzJmLCAKKzB4M2MwYTAwMGMsIDB4ODAwMTcyZiwgMHgzYzBhMDAwZCwgMHg4MDAyOGZiLCAKKzB4MCwgMHg4MDAyODkwLCAweDAsIDB4ODAwMTcyZiwgCisweDNjMGEwMDBlLCAweDgwMDIwOGMsIDB4MCwgMHg4MDAxOTY0LCAKKzB4MCwgMHg4MDAxYTA0LCAweDAsIDB4ODAwM2NhNiwgCisweDAsIDB4ODAwM2M5NCwgMHgwLCAweDgwMDE3MmYsIAorMHgwLCAweDgwMDE5MWEsIDB4MCwgMHg4MDAxNzJmLCAKKzB4MCwgMHg4MDAxNzJmLCAweDNjMGEwMDEzLCAweDgwMDE3MmYsIAorMHgzYzBhMDAxNCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MjdiZGZmZTAsIAorMHgzYzFjYzAwMCwgMHhhZmJmMDAxYywgMHhhZmIwMDAxOCwgMHg4ZjgyMDE0MCwgCisweDI0MDMwMDAzLCAweGFmODMwMGVjLCAweDM0NDIwMDA0LCAweGMwMDJiMjAsIAorMHhhZjgyMDE0MCwgMHgzYzAxMDBjMCwgMHhjMDAxNzYzLCAweGFjMjAzZmZjLCAKKzB4NDAxODIxLCAweDNjMDIwMDEwLCAweDNjMDEwMDAxLCAweGFjMjM2ZTljLCAKKzB4MTA2MjAwMTEsIDB4NDMxMDJiLCAweDE0NDAwMDAyLCAweDNjMDIwMDIwLCAKKzB4M2MwMjAwMDgsIDB4MTA2MjAwMGMsIDB4MjQwNTAxMDAsIDB4M2MwNjAwMDEsIAorMHg4Y2M2NmU5YywgMHgzYzA0MDAwMSwgMHgyNDg0NWM3NCwgMHgzODIxLCAKKzB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgzYzAyMDAyMCwgCisweDNjMDEwMDAxLCAweGFjMjI2ZTljLCAweDI0MDIwMDA4LCAweDNjMDEwMDAxLCAKKzB4YWMyMjZlYjQsIDB4MjQwMjAwMWYsIDB4M2MwMTAwMDEsIDB4YWMyMjZlYzQsIAorMHgyNDAyMDAxNiwgMHgzYzAxMDAwMSwgMHhhYzIyNmU5OCwgMHgzYzA1ZmZmZSwgCisweDM0YTU2ZjA4LCAweDNjMDIwMDAxLCAweDhjNDI2ZTljLCAweDNjMDMwMDAyLCAKKzB4MjQ2MzkwMTAsIDB4M2MwNDAwMDEsIDB4OGM4NDZjYzQsIDB4NDMxMDIzLCAKKzB4MTQ4MDAwMDIsIDB4NDU4MDIxLCAweDI2MTBmYTM4LCAweDI0MDJmMDAwLCAKKzB4MjAyODAyNCwgMHhjMDAxNzg1LCAweDIwMDIwMjEsIDB4MjAyMjgyMywgCisweDNjMDQwMDIwLCAweDgyMTgyMywgMHg2NTE4MjMsIDB4MjQ3YmIwMDAsIAorMHgzYzAzZmZmZSwgMHgzNDYzYmYwOCwgMHgzNjNiODIxLCAweDNjMDYwMGJmLCAKKzB4MzRjNmYwMDAsIDB4M2MwNzAwMDEsIDB4OGNlNzZjYzAsIDB4M2MwMzAwYmYsIAorMHgzNDYzZTAwMCwgMHg4NTIwMjMsIDB4M2MwMTAwMDEsIDB4YWMyNDZlYTgsIAorMHg4MjIwMjMsIDB4M2MwMTAwMDEsIDB4YWMyNTZlOTAsIDB4NTI4NDIsIAorMHgzYzAxMDAwMSwgMHhhYzIyNmU4NCwgMHgyNzYyMGZmYywgMHgzYzAxMDAwMSwgCisweGFjMjI2ZDIwLCAweDI3NjIxZmZjLCAweGRiMzAyMywgMHg3YjE4MjMsIAorMHgzYzAxMDAwMSwgMHhhYzI0NmU4OCwgMHgzYzAxMDAwMSwgMHhhYzI1NmVhYywgCisweDNjMDEwMDAxLCAweGFjMjI2ZDI0LCAweGFmODYwMTUwLCAweDEwZTAwMDExLCAKKzB4YWY4MzAyNTAsIDB4M2MxZDAwMDEsIDB4OGZiZDZjY2MsIDB4M2EwZjAyMSwgCisweGMwMDE3NDksIDB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmNkMCwgCisweDNjMDMwMDAxLCAweDhjNjM2Y2Q0LCAweDI0NDJmZTAwLCAweDI0NjMwMjAwLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZjZDAsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMDQsIAorMHhhYzIzNmNkNCwgMHgzYzFkMDAwMSwgMHg4ZmJkNmQyMCwgMHgzYTBmMDIxLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZjYzQsIDB4MTA0MDAwMGQsIDB4MjZmYWZhMzgsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmNkMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmNkNCwgCisweDNjMWEwMDAxLCAweDhmNWE2Y2Q0LCAweDI0NDJmYTM4LCAweDI0NjMwNWM4LCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZjZDAsIDB4M2MwMTAwMDEsIDB4YWMyMzZjZDQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmNjOCwgMHgxNDQwMDAwMywgMHgwLCAKKzB4M2MwMTAwMDEsIDB4YWMyMDZjZDAsIDB4YzAwMTE1MSwgMHgwLCAKKzB4OGZiZjAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgCisweDNjMDIwMDAxLCAweDhjNDI2Y2QwLCAweDNjMDMwMDAxLCAweDhjNjM2Y2Q0LCAKKzB4MjdiZGZmOTgsIDB4YWZiMDAwNDgsIDB4M2MxMDAwMDEsIDB4OGUxMDY2YjgsIAorMHhhZmIyMDA1MCwgMHgzYzEyMDAwMCwgMHgyNjUyNDEwMCwgMHhhZmJmMDA2MCwgCisweGFmYmUwMDVjLCAweGFmYjUwMDU4LCAweGFmYjMwMDU0LCAweGFmYjEwMDRjLCAKKzB4YWZhMjAwMzQsIDB4YWZhMzAwMzAsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIAorMHg4Zjg2MDA0MCwgMHgzYzA0MDAwMSwgMHgyNDg0NWM4MCwgMHgyNDA1MDIwMCwgCisweDNjMDEwMDAxLCAweGFjMzI2ZTgwLCAweGMwMDJiM2IsIDB4MjAwMzgyMSwgCisweDhmODMwMDQwLCAweDNjMDJmMDAwLCAweDYyMTgyNCwgMHgzYzAyNjAwMCwgCisweDEwNjIwMDBiLCAweGEzYTAwMDNmLCAweDI0MGUwMDAxLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDVjODgsIDB4YTNhZTAwM2YsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIAorMHg4Zjg2MDA0MCwgMHgyNDA1MDMwMCwgMHhjMDAyYjNiLCAweDIwMDM4MjEsIAorMHg4ZjgyMDI0MCwgMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4YWY4MjAyNDAsIAorMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxNDQwMDAwNSwgMHgwLCAKKzB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MDAwMDQsIDB4MCwgCisweGFmODAwMDQ4LCAweDEwMDAwMDAzLCAweDJlMDIwMjEsIDB4YWY4MDAwNGMsIAorMHgyZTAyMDIxLCAweDNjMDUwMDAxLCAweGMwMDJiYTgsIDB4MzRhNTQwZjgsIAorMHgzNDAyMDIxLCAweGMwMDJiYTgsIDB4MjQwNTA1YzgsIDB4M2MwMjAwMDEsIAorMHg4YzQyNmVhOCwgMHgzYzBkMDAwMSwgMHg4ZGFkNmU4OCwgMHgzYzAzMDAwMSwgCisweDhjNjM2ZTg0LCAweDNjMDgwMDAxLCAweDhkMDg2ZTkwLCAweDNjMDkwMDAxLCAKKzB4OGQyOTZlYWMsIDB4M2MwYTAwMDEsIDB4OGQ0YTZlYjQsIDB4M2MwYjAwMDEsIAorMHg4ZDZiNmVjNCwgMHgzYzBjMDAwMSwgMHg4ZDhjNmU5OCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1Yzk0LCAweDI0MDUwNDAwLCAweGFmNDIwMTNjLCAweDhmNDIwMTNjLCAKKzB4MjQwNjAwMDEsIDB4MjQwNzAwMDEsIDB4YWY0MDAwMDAsIDB4YWY0ZDAxMzgsIAorMHhhZjQzMDE0NCwgMHhhZjQ4MDE0OCwgMHhhZjQ5MDE0YywgMHhhZjRhMDE1MCwgCisweGFmNGIwMTU0LCAweGFmNGMwMTU4LCAweDI0NDJmZjgwLCAweGFmNDIwMTQwLCAKKzB4MjQwMjAwMDEsIDB4YWZhMjAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgCisweDhmNDIwMTM4LCAweGFmYTIwMDEwLCAweDhmNDIwMTNjLCAweGFmYTIwMDE0LCAKKzB4OGY0NjAxNDQsIDB4OGY0NzAxNDgsIDB4M2MwNDAwMDEsIDB4MjQ4NDVjYTAsIAorMHhjMDAyYjNiLCAweDI0MDUwNTAwLCAweGFmYjcwMDEwLCAweGFmYmEwMDE0LCAKKzB4OGY0NjAxNGMsIDB4OGY0NzAxNTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVjYWMsIAorMHhjMDAyYjNiLCAweDI0MDUwNjAwLCAweDNjMDIwMDAxLCAweDhjNDI2ZTljLCAKKzB4MzYwMzgyMSwgMHgzYzA2MDAwMiwgMHgyNGM2OTAxMCwgMHgyNDQ4ZmZmZiwgCisweDEwNjE4MjQsIDB4ZTgxMDI0LCAweDQzMTAyYiwgMHgxMDQwMDAwNiwgCisweDI0MDUwOTAwLCAweDNjMDQwMDAxLCAweDI0ODQ1Y2I4LCAweGFmYTgwMDEwLCAKKzB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHg4ZjgyMDAwYywgMHhhZmEyMDAxMCwgCisweDhmODIwMDNjLCAweGFmYTIwMDE0LCAweDhmODYwMDAwLCAweDhmODcwMDA0LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDVjYzQsIDB4YzAwMmIzYiwgMHgyNDA1MTAwMCwgCisweDhjMDIwMjIwLCAweDhjMDMwMjI0LCAweDhjMDYwMjE4LCAweDhjMDcwMjFjLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDVjY2MsIDB4MjQwNTExMDAsIDB4YWZhMjAwMTAsIAorMHhjMDAyYjNiLCAweGFmYTMwMDE0LCAweGFmODAwMDU0LCAweGFmODAwMTFjLCAKKzB4OGMwMjAyMTgsIDB4MzA0MjAwMDIsIDB4MTA0MDAwMDksIDB4MCwgCisweDhjMDIwMjIwLCAweDNjMDMwMDAyLCAweDM0NjMwMDA0LCAweDQzMTAyNSwgCisweGFmNDIwMDBjLCAweDhjMDIwMjFjLCAweDEwMDAwMDA4LCAweDM0NDIwMDA0LCAKKzB4OGMwMjAyMjAsIDB4M2MwMzAwMDIsIDB4MzQ2MzAwMDYsIDB4NDMxMDI1LCAKKzB4YWY0MjAwMGMsIDB4OGMwMjAyMWMsIDB4MzQ0MjAwMDYsIDB4YWY0MjAwMTQsIAorMHg4YzAyMDIxOCwgMHgzMDQyMDAxMCwgMHgxMDQwMDAwYSwgMHgwLCAKKzB4OGMwMjAyMWMsIDB4MzQ0MjAwMDQsIDB4YWY0MjAwMTAsIDB4OGMwMjAyMjAsIAorMHgzYzAzMDAwYSwgMHgzNDYzMDAwNCwgMHg0MzEwMjUsIDB4MTAwMDAwMDksIAorMHhhZjQyMDAwOCwgMHg4YzAyMDIyMCwgMHgzYzAzMDAwYSwgMHgzNDYzMDAwNiwgCisweDQzMTAyNSwgMHhhZjQyMDAwOCwgMHg4YzAyMDIxYywgMHgzNDQyMDAwNiwgCisweGFmNDIwMDEwLCAweDI0MDIwMDAxLCAweGFmODIwMGEwLCAweGFmODIwMGIwLCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4YWY4MDAwZDAsIDB4YWY4MDAwYzAsIAorMHgxMDAwMDAwMiwgMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIAorMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywgMHgwLCAweDhjMDQwMjA4LCAKKzB4OGMwNTAyMGMsIDB4MjZlMjAwMjgsIDB4YWVlMjAwMjAsIDB4MjQwMjA0OTAsIAorMHhhZWUyMDAxMCwgMHhhZWU0MDAwOCwgMHhhZWU1MDAwYywgMHgyNmU0MDAwOCwgCisweDhjODIwMDAwLCAweDhjODMwMDA0LCAweGFmODIwMDkwLCAweGFmODMwMDk0LCAKKzB4OGM4MjAwMTgsIDB4YWY4MjAwYjQsIDB4OTQ4MjAwMGEsIDB4YWY4MjAwOWMsIAorMHg4ZjQyMDAxNCwgMHhhZjgyMDBiMCwgMHg4ZjgyMDBiMCwgMHgzMDQyMDAwNCwgCisweDE0NDBmZmZkLCAweDAsIDB4OGY4MjAwYjAsIDB4M2MwM2VmMDAsIAorMHg0MzEwMjQsIDB4MTA0MDAwMjEsIDB4MCwgMHg4ZjgyMDBiNCwgCisweGFmYTIwMDEwLCAweDhmODIwMDkwLCAweDhmODMwMDk0LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDVjZDQsIDB4YWZhMzAwMTQsIDB4OGY4NjAwYjAsIDB4OGY4NzAwOWMsIAorMHgzYzA1MDAwMSwgMHhjMDAyYjNiLCAweDM0YTUyMDBkLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDVjZTAsIDB4MjQwMjAzYzAsIDB4YWZhMjAwMTAsIDB4YWZhMDAwMTQsIAorMHg4Zjg2MDE0NCwgMHgzYzA3MDAwMSwgMHgyNGU3NWNlOCwgMHhjMDAyYjNiLCAKKzB4MzQwNWRlYWQsIDB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsIDB4YWY4MjAxMWMsIAorMHg4ZjgyMDIyMCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDE0MCwgCisweDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDE0MCwgMHg5NmUyMDQ3MiwgCisweDk2ZTYwNDUyLCAweDk2ZTcwNDYyLCAweGFmYTIwMDEwLCAweDk2ZTIwNDgyLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDVkMTQsIDB4MjQwNTEyMDAsIDB4YzAwMmIzYiwgCisweGFmYTIwMDE0LCAweDk2ZjAwNDUyLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAKKzB4YjAyMSwgMHgyNDE2MDAwMSwgMHgzMjAyMDAwMiwgMHg1NDQwMDAwMSwgCisweDM2ZDYwMDAyLCAweDMyMDIwMDA4LCAweDU0NDAwMDAxLCAweDM2ZDYwMDA0LCAKKzB4MzIwMjAwMTAsIDB4NTQ0MDAwMDEsIDB4MzZkNjAwMDgsIDB4MzIwMjAwMjAsIAorMHg1NDQwMDAwMSwgMHgzNmQ2MDAxMCwgMHgzMjAyMDA0MCwgMHg1NDQwMDAwMSwgCisweDM2ZDYwMDIwLCAweDMyMDIwMDgwLCAweDU0NDAwMDAxLCAweDM2ZDYwMDQwLCAKKzB4OTZlNjA0ODIsIDB4MzBjMjAyMDAsIDB4NTQ0MDAwMDEsIDB4MzZkNjQwMDAsIAorMHg5NmUzMDQ3MiwgMHgzMDYyMDIwMCwgMHgxMDQwMDAwMywgMHgzMDYyMDEwMCwgCisweDEwMDAwMDAzLCAweDM2ZDYyMDAwLCAweDU0NDAwMDAxLCAweDM2ZDYxMDAwLCAKKzB4OTZmMDA0NjIsIDB4MzJjMjQwMDAsIDB4MTQ0MDAwMDQsIDB4MzIwNzAwOWIsIAorMHgzMGMyMDA5YiwgMHgxNGUyMDAwNywgMHgyNDBlMDAwMSwgMHgzMmMyMjAwMCwgCisweDE0NDAwMDBkLCAweDMyMDIwMDAxLCAweDMwNjIwMDliLCAweDEwZTIwMDA5LCAKKzB4MjQwZTAwMDEsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkMjAsIDB4MjQwNTEzMDAsIAorMHgyMDAzODIxLCAweGEzYWUwMDNmLCAweGFmYTMwMDEwLCAweGMwMDJiM2IsIAorMHhhZmEwMDAxNCwgMHgzMjAyMDAwMSwgMHg1NDQwMDAwMSwgMHgzNmQ2MDA4MCwgCisweDMyMDIwMDAyLCAweDU0NDAwMDAxLCAweDM2ZDYwMTAwLCAweDMyMDIwMDA4LCAKKzB4NTQ0MDAwMDEsIDB4MzZkNjAyMDAsIDB4MzIwMjAwMTAsIDB4NTQ0MDAwMDEsIAorMHgzNmQ2MDQwMCwgMHgzMjAyMDA4MCwgMHg1NDQwMDAwMSwgMHgzNmQ2MDgwMCwgCisweDhjMDIwMjE4LCAweDMwNDIwMjAwLCAweDEwNDAwMDAyLCAweDNjMDIwMDA4LCAKKzB4MmMyYjAyNSwgMHg4YzAyMDIxOCwgMHgzMDQyMDgwMCwgMHgxMDQwMDAwMiwgCisweDNjMDIwMDgwLCAweDJjMmIwMjUsIDB4OGMwMjAyMTgsIDB4MzA0MjA0MDAsIAorMHgxMDQwMDAwMiwgMHgzYzAyMDEwMCwgMHgyYzJiMDI1LCAweDhjMDIwMjE4LCAKKzB4MzA0MjAxMDAsIDB4MTA0MDAwMDIsIDB4M2MwMjAyMDAsIDB4MmMyYjAyNSwgCisweDhjMDIwMjE4LCAweDMwNDIwMDgwLCAweDEwNDAwMDAyLCAweDNjMDIwNDAwLCAKKzB4MmMyYjAyNSwgMHg4YzAyMDIxOCwgMHgzMDQyMjAwMCwgMHgxMDQwMDAwMiwgCisweDNjMDIwMDEwLCAweDJjMmIwMjUsIDB4OGMwMjAyMTgsIDB4MzA0MjQwMDAsIAorMHgxMDQwMDAwMiwgMHgzYzAyMDAyMCwgMHgyYzJiMDI1LCAweDhjMDIwMjE4LCAKKzB4MzA0MjEwMDAsIDB4MTA0MDAwMDIsIDB4M2MwMjAwNDAsIDB4MmMyYjAyNSwgCisweDhlZTIwNDk4LCAweDhlZTMwNDljLCAweGFmNDIwMTYwLCAweGFmNDMwMTY0LCAKKzB4OGVlMjA0YTAsIDB4OGVlMzA0YTQsIDB4YWY0MjAxNjgsIDB4YWY0MzAxNmMsIAorMHg4ZWUyMDRhOCwgMHg4ZWUzMDRhYywgMHhhZjQyMDE3MCwgMHhhZjQzMDE3NCwgCisweDhlZTIwNDI4LCAweDhlZTMwNDJjLCAweGFmNDIwMTc4LCAweGFmNDMwMTdjLCAKKzB4OGVlMjA0NDgsIDB4OGVlMzA0NGMsIDB4YWY0MjAxODAsIDB4YWY0MzAxODQsIAorMHg4ZWUyMDQ1OCwgMHg4ZWUzMDQ1YywgMHhhZjQyMDE4OCwgMHhhZjQzMDE4YywgCisweDhlZTIwNDY4LCAweDhlZTMwNDZjLCAweGFmNDIwMTkwLCAweGFmNDMwMTk0LCAKKzB4OGVlMjA0NzgsIDB4OGVlMzA0N2MsIDB4YWY0MjAxOTgsIDB4YWY0MzAxOWMsIAorMHg4ZWUyMDQ4OCwgMHg4ZWUzMDQ4YywgMHhhZjQyMDFhMCwgMHhhZjQzMDFhNCwgCisweDhlZTIwNGIwLCAweDhlZTMwNGI0LCAweDI0MDQwMDgwLCAweGFmNDIwMWE4LCAKKzB4YWY0MzAxYWMsIDB4YzAwMmJhOCwgMHgyNDA1MDA4MCwgMHg4YzAyMDI1YywgCisweDI3NDQwMjI0LCAweGFmNDIwMWYwLCAweDhjMDIwMjYwLCAweDI0MDUwMjAwLCAKKzB4MjQwNjAwMDgsIDB4YzAwMmJiZiwgMHhhZjQyMDFmOCwgMHgzYzA0M2I5YSwgCisweDM0ODRjYTAwLCAweDM4MjEsIDB4MjQwMjAwMDYsIDB4MjQwMzAwMDIsIAorMHhhZjQyMDFmNCwgMHgyNDAyMDNlOCwgMHhhZjQzMDIwNCwgMHhhZjQzMDIwMCwgCisweGFmNDQwMWZjLCAweGFmNDIwMjk0LCAweDI0MDIwMDAxLCAweGFmNDMwMjkwLCAKKzB4YWY0MjAyOWMsIDB4M2MwMzAwMDEsIDB4NjcxODIxLCAweDkwNjM2Y2Q4LCAKKzB4MzQ3MTAyMSwgMHgyNGU3MDAwMSwgMHhhMDQzMDIyYywgMHgyY2UyMDAwZiwgCisweDE0NDBmZmY4LCAweDM0NzE4MjEsIDB4MjRlNzAwMDEsIDB4M2MwODAwMDEsIAorMHgzNTA4NDBmOCwgMHg4ZjgyMDA0MCwgMHgzYzA0MDAwMSwgMHgyNDg0NWQyYywgCisweDI0MDUxNDAwLCAweDIxNzAyLCAweDI0NDIwMDMwLCAweGEwNjIwMjJjLCAKKzB4MzQ3MTAyMSwgMHhhMDQwMDIyYywgMHg4YzA3MDIxOCwgMHgyYzAzMDIxLCAKKzB4MjQwMjA1YzgsIDB4YWZhMjAwMTAsIDB4YzAwMmIzYiwgMHhhZmE4MDAxNCwgCisweDNjMDQwMDAxLCAweDI0ODQ1ZDM4LCAweDNjMDUwMDAwLCAweDI0YTU1YzgwLCAKKzB4MjQwNjAwMTAsIDB4MjdiMTAwMzAsIDB4MjIwMzgyMSwgMHgyN2IzMDAzNCwgCisweGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4M2MwMzAwMDEsIDB4OGM2MzZjYzgsIAorMHgxMDYwMDAwYSwgMHg0MDgwMjEsIDB4OGZhMzAwMzAsIDB4MjQwNWZmMDAsIAorMHg4ZmEyMDAzNCwgMHgyNDY0MDBmZiwgMHg4NTIwMjQsIDB4ODMxODIzLCAKKzB4NDMxMDIzLCAweGFmYTIwMDM0LCAweGFmYTQwMDMwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDVkNDQsIDB4M2MwNTAwMDAsIDB4MjRhNTQxMDAsIDB4MjQwNjAxMDgsIAorMHgyMjAzODIxLCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4NDA5MDIxLCAKKzB4MzJjMjAwMDMsIDB4M2MwMTAwMDEsIDB4YWMzMjZlODAsIDB4MTA0MDAwNDUsIAorMHgyMjAzODIxLCAweDhmODIwMDUwLCAweDNjMDMwMDEwLCAweDQzMTAyNCwgCisweDEwNDAwMDE2LCAweDAsIDB4OGMwMjAyMTgsIDB4MzA0MjAwNDAsIAorMHgxMDQwMDAwZiwgMHgyNDAyMDAwMSwgMHg4ZjgyMDA1MCwgMHg4YzAzMDIxOCwgCisweDI0MGUwMDAxLCAweDNjMDQwMDAxLCAweDI0ODQ1ZDUwLCAweGEzYWUwMDNmLCAKKzB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIDB4OGY4NzAwNDAsIDB4MjQwNTE1MDAsIAorMHhjMDAyYjNiLCAweDJjMDMwMjEsIDB4MTAwMDAwMDQsIDB4MCwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIyNDBmNCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1ZDVjLCAweDNjMDUwMDAxLCAweDI0YTU1YjQwLCAweDNjMDYwMDAxLCAKKzB4MjRjNjViYWMsIDB4YzUzMDIzLCAweDhmNDIwMDEwLCAweDI3YjMwMDMwLCAKKzB4MjYwMzgyMSwgMHgyN2IxMDAzNCwgMHgzNDQyMGEwMCwgMHhhZjQyMDAxMCwgCisweGMwMDE3YTMsIDB4YWZiMTAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkNzAsIAorMHgzYzA1MDAwMSwgMHgyNGE1YjcxNCwgMHgzYzA2MDAwMSwgMHgyNGM2YmE5MCwgCisweGM1MzAyMywgMHgyNjAzODIxLCAweGFmNDIwMTA4LCAweGMwMDE3YTMsIAorMHhhZmIxMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWQ4YywgMHgzYzA1MDAwMSwgCisweDI0YTViZTU4LCAweDNjMDYwMDAxLCAweDI0YzZjOTAwLCAweGM1MzAyMywgCisweDI2MDM4MjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlZjQsIDB4YzAwMTdhMywgCisweGFmYjEwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZGE0LCAweDEwMDAwMDI0LCAKKzB4MjQwNTE2MDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkYWMsIDB4M2MwNTAwMDEsIAorMHgyNGE1YTEwYywgMHgzYzA2MDAwMSwgMHgyNGM2YTIzOCwgMHhjNTMwMjMsIAorMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZGJjLCAKKzB4M2MwNTAwMDEsIDB4MjRhNWIyYjAsIDB4M2MwNjAwMDEsIDB4MjRjNmI3MGMsIAorMHhjNTMwMjMsIDB4MjIwMzgyMSwgMHhhZjQyMDEwOCwgMHhjMDAxN2EzLCAKKzB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkZDAsIDB4M2MwNTAwMDEsIAorMHgyNGE1YmE5OCwgMHgzYzA2MDAwMSwgMHgyNGM2YmU1MCwgMHhjNTMwMjMsIAorMHgyMjAzODIxLCAweDNjMDEwMDAxLCAweGFjMjI2ZWY0LCAweGMwMDE3YTMsIAorMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWRlNCwgMHgyNDA1MTY1MCwgCisweDJjMDMwMjEsIDB4MzgyMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmVmOCwgCisweGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4MzJjMjAwMjAsIAorMHgxMDQwMDAyMSwgMHgyN2E3MDAzMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWRmMCwgCisweDNjMDUwMDAxLCAweDI0YTViMTNjLCAweDNjMDYwMDAxLCAweDI0YzZiMmE4LCAKKzB4YzUzMDIzLCAweDI0MDIyMDAwLCAweGFmNDIwMDFjLCAweDI3YTIwMDM0LCAKKzB4YzAwMTdhMywgMHhhZmEyMDAxMCwgMHgyMTkwMCwgMHgzMTk4MiwgCisweDNjMDQwODAwLCAweDY0MTgyNSwgMHhhZTQzMDAyOCwgMHgyNDAzMDAxMCwgCisweGFmNDMwMDNjLCAweDk2ZTMwNDUwLCAweGFmNDMwMDQwLCAweDhmNDMwMDQwLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDVlMDQsIDB4YWZhMDAwMTQsIDB4YWZhMzAwMTAsIAorMHg4ZjQ3MDAxYywgMHgyNDA1MTY2MCwgMHgzYzAxMDAwMSwgMHhhYzIyNmVmMCwgCisweDEwMDAwMDI1LCAweDMyYzYwMDIwLCAweDhlZTIwNDQ4LCAweDhlZTMwNDRjLCAKKzB4YWY0MzAwMWMsIDB4OGY0MjAwMWMsIDB4MjQ0MmUwMDAsIDB4MmM0MjIwMDEsIAorMHgxNDQwMDAwYSwgMHgyNDBlMDAwMSwgMHgzYzA0MDAwMSwgMHgyNDg0NWUxMCwgCisweGEzYWUwMDNmLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmNDYwMDFjLCAKKzB4MjQwNTE3MDAsIDB4YzAwMmIzYiwgMHgzODIxLCAweDNjMDIwMDAwLCAKKzB4MjQ0MjVjYmMsIDB4MjExMDAsIDB4MjExODIsIDB4M2MwMzA4MDAsIAorMHg0MzEwMjUsIDB4YWU0MjAwMjgsIDB4MjQwMjAwMDgsIDB4YWY0MjAwM2MsIAorMHg5NmUyMDQ1MCwgMHhhZjQyMDA0MCwgMHg4ZjQyMDA0MCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1ZTFjLCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmNDcwMDFjLCAKKzB4MjQwNTE4MDAsIDB4MzJjNjAwMjAsIDB4YzAwMmIzYiwgMHgwLCAKKzB4M2MwNTBmZmYsIDB4M2MwMzAwMDEsIDB4OGM2MzZlZjQsIDB4MzRhNWZmZmYsIAorMHgyNDAzMDIxLCAweDNjMDIwMDAxLCAweDhjNDI2ZWY4LCAweDNjMDQwODAwLCAKKzB4NjUxODI0LCAweDMxODgyLCAweDY0MTgyNSwgMHg0NTEwMjQsIAorMHgyMTA4MiwgMHg0NDEwMjUsIDB4YWNjMjAwODAsIDB4MzJjMjAxODAsIAorMHgxMDQwMDA1NiwgMHhhY2MzMDAyMCwgMHg4ZjgyMDA1YywgMHgzYzAzMDA4MCwgCisweDQzMTAyNCwgMHgxMDQwMDAwZCwgMHgwLCAweDhmODIwMDUwLCAKKzB4YWZhMjAwMTAsIDB4OGY4MjAwNWMsIDB4MjQwZTAwMDEsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWUyOCwgMHhhM2FlMDAzZiwgMHhhZmEyMDAxNCwgMHg4Zjg3MDA0MCwgCisweDI0MDUxOTAwLCAweGMwMDJiM2IsIDB4MmMwMzAyMSwgMHg4ZjgyMDA1MCwgCisweDNjMDMwMDEwLCAweDQzMTAyNCwgMHgxMDQwMDAxNiwgMHgwLCAKKzB4OGMwMjAyMTgsIDB4MzA0MjAwNDAsIDB4MTA0MDAwMGYsIDB4MjQwMjAwMDEsIAorMHg4ZjgyMDA1MCwgMHg4YzAzMDIxOCwgMHgyNDBlMDAwMSwgMHgzYzA0MDAwMSwgCisweDI0ODQ1ZDUwLCAweGEzYWUwMDNmLCAweGFmYTIwMDEwLCAweGFmYTMwMDE0LCAKKzB4OGY4NzAwNDAsIDB4MjQwNTIwMDAsIDB4YzAwMmIzYiwgMHgyYzAzMDIxLCAKKzB4MTAwMDAwMDQsIDB4MCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhMDIyNDBmNCwgMHgzYzA0MDAwMSwgMHgyNDg0NWUzNCwgMHgzYzA1MDAwMSwgCisweDI0YTU1YWMwLCAweDNjMDYwMDAxLCAweDI0YzY1YjM4LCAweGM1MzAyMywgCisweDhmNDIwMDA4LCAweDI3YjMwMDMwLCAweDI2MDM4MjEsIDB4MjdiMTAwMzQsIAorMHgzNDQyMGUwMCwgMHhhZjQyMDAwOCwgMHhjMDAxN2EzLCAweGFmYjEwMDEwLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDVlNGMsIDB4M2MwNTAwMDEsIDB4MjRhNWQ4YjQsIAorMHgzYzA2MDAwMSwgMHgyNGM2ZTNjOCwgMHhjNTMwMjMsIDB4MjYwMzgyMSwgCisweGFmNDIwMTBjLCAweGMwMDE3YTMsIDB4YWZiMTAwMTAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWU2NCwgMHgzYzA1MDAwMSwgMHgyNGE1ZTlhYywgMHgzYzA2MDAwMSwgCisweDI0YzZmMGYwLCAweGM1MzAyMywgMHgyNjAzODIxLCAweDNjMDEwMDAxLCAKKzB4YWMyMjZmMDQsIDB4YzAwMTdhMywgMHhhZmIxMDAxMCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1ZTdjLCAweDEwMDAwMDI3LCAweDI0MDUyMTAwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDVlODQsIDB4M2MwNTAwMDEsIDB4MjRhNTlmYzgsIDB4M2MwNjAwMDEsIAorMHgyNGM2YTEwNCwgMHhjNTMwMjMsIDB4MjdiMTAwMzAsIDB4MjIwMzgyMSwgCisweDI3YjMwMDM0LCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWU5NCwgMHgzYzA1MDAwMSwgMHgyNGE1Y2FkNCwgMHgzYzA2MDAwMSwgCisweDI0YzZkOGFjLCAweGM1MzAyMywgMHgyMjAzODIxLCAweGFmNDIwMTBjLCAKKzB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWVhNCwgCisweDNjMDUwMDAxLCAweDI0YTVlODRjLCAweDNjMDYwMDAxLCAweDI0YzZlOWE0LCAKKzB4YzUzMDIzLCAweDIyMDM4MjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMDQsIAorMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZWI4LCAKKzB4MjQwNTIxNTAsIDB4MmMwMzAyMSwgMHgzODIxLCAweDNjMDEwMDAxLCAKKzB4YWMyMjZmMTAsIDB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgCisweDNjMTEwZmZmLCAweDNjMDMwMDAxLCAweDhjNjM2ZjA0LCAweDM2MzFmZmZmLCAKKzB4MjQwOTgyMSwgMHgzYzAyMDAwMSwgMHg4YzQyNmYxMCwgMHgzYzBlMDgwMCwgCisweDcxMTgyNCwgMHgzMTg4MiwgMHg2ZTE4MjUsIDB4NTExMDI0LCAKKzB4MjEwODIsIDB4NGUxMDI1LCAweGFlNjMwMDM4LCAweGFlNjIwMDc4LCAKKzB4OGMwMjAyMTgsIDB4MzA0MjAwNDAsIDB4MTQ0MDAwMDQsIDB4MjQwMjAwMDEsIAorMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMjQwZjQsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWVjNCwgMHgzYzA1MDAwMSwgMHgyNGE1ZTNkMCwgMHgzYzA2MDAwMSwgCisweDI0YzZlNTJjLCAweGM1MzAyMywgMHgyN2JlMDAzMCwgMHgzYzAzODIxLCAKKzB4MjdiNTAwMzQsIDB4YzAwMTdhMywgMHhhZmI1MDAxMCwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZWZjLCAweDUxMTAyNCwgMHgyMTA4MiwgMHgzYzBlMDgwMCwgCisweDRlMTAyNSwgMHhhZTYyMDA1MCwgMHgzMmMyMjAwMCwgMHgxMDQwMDAwNiwgCisweDNjMDM4MjEsIDB4M2MwMjAwMDAsIDB4MjQ0MjVjYmMsIDB4MjIyMTAyNCwgCisweDEwMDAwMDBmLCAweDIxMDgyLCAweDNjMDQwMDAxLCAweDI0ODQ1ZWQ4LCAKKzB4M2MwNTAwMDEsIDB4MjRhNWU1MzQsIDB4M2MwNjAwMDEsIDB4MjRjNmU2ZTQsIAorMHhjNTMwMjMsIDB4YzAwMTdhMywgMHhhZmI1MDAxMCwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZjE0LCAweDUxMTAyNCwgMHgyMTA4MiwgMHgzYzBlMDgwMCwgCisweDRlMTAyNSwgMHhhZTYyMDA0OCwgMHgzMmMyNDAwMCwgMHgxMDQwMDAwNSwgCisweDI3YTcwMDMwLCAweDNjMDIwMDAwLCAweDI0NDI1Y2JjLCAweDEwMDAwMDBlLCAKKzB4MjExMDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVlZjAsIDB4M2MwNTAwMDEsIAorMHgyNGE1ZTZlYywgMHgzYzA2MDAwMSwgMHgyNGM2ZTg0NCwgMHhjNTMwMjMsIAorMHgyN2EyMDAzNCwgMHhjMDAxN2EzLCAweGFmYTIwMDEwLCAweDNjMDEwMDAxLCAKKzB4YWMyMjZmMDgsIDB4MjExMDAsIDB4MjExODIsIDB4M2MwMzA4MDAsIAorMHg0MzEwMjUsIDB4YWU0MjAwNjAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmMDgsIAorMHgzYzA1MDAwMSwgMHgyNGE1ODIzMCwgMHgzYzA2MDAwMSwgMHgyNGM2ODY1MCwgCisweGM1MzAyMywgMHgyN2IxMDAzMCwgMHgyMjAzODIxLCAweDI3YjMwMDM0LCAKKzB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHgzYzBlMGZmZiwgMHgzNWNlZmZmZiwgCisweDNjMDQwMDAxLCAweDI0ODQ1ZjE0LCAweDNjMDUwMDAwLCAweDI0YTU2NDY4LCAKKzB4M2MwNjAwMDAsIDB4MjRjNjY1ODgsIDB4YzUzMDIzLCAweDIyMDM4MjEsIAorMHgyNDBmMDIxLCAweDNjMDEwMDAxLCAweGFjMjI2ZWRjLCAweDRlMTAyNCwgCisweDIxMDgyLCAweDNjMTUwODAwLCAweDU1MTAyNSwgMHhhZmFlMDA0NCwgCisweGFmYzIwMGI4LCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWYyMCwgMHgzYzA1MDAwMCwgMHgyNGE1NjU5MCwgMHgzYzA2MDAwMCwgCisweDI0YzY2ODA4LCAweDhmYWUwMDQ0LCAweGM1MzAyMywgMHgyMjAzODIxLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZlZDAsIDB4NGUxMDI0LCAweDIxMDgyLCAKKzB4NTUxMDI1LCAweGFmYzIwMGU4LCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsIAorMHgzYzA0MDAwMSwgMHgyNDg0NWYzOCwgMHgzYzA1MDAwMCwgMHgyNGE1NjgxMCwgCisweDNjMDYwMDAwLCAweDI0YzY2OTQwLCAweDhmYWUwMDQ0LCAweGM1MzAyMywgCisweDIyMDM4MjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlYzgsIDB4NGUxMDI0LCAKKzB4MjEwODIsIDB4NTUxMDI1LCAweGFmYzIwMGMwLCAweGMwMDE3YTMsIAorMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWY1MCwgMHgzYzA1MDAwMSwgCisweDI0YTVmYWQwLCAweDNjMDYwMDAxLCAweDI0YzZmYmE4LCAweDhmYWUwMDQ0LCAKKzB4YzUzMDIzLCAweDIyMDM4MjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlZDQsIAorMHg0ZTEwMjQsIDB4MjEwODIsIDB4NTUxMDI1LCAweGFmYzIwMGM4LCAKKzB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWY1YywgCisweDNjMDUwMDAxLCAweDI0YTVjOTNjLCAweDNjMDYwMDAxLCAweDI0YzZjYTIwLCAKKzB4YzUzMDIzLCAweDIyMDM4MjEsIDB4YWY0MjAxMTAsIDB4YzAwMTdhMywgCisweGFmYjMwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZjZjLCAweDNjMDUwMDAxLCAKKzB4MjRhNWM5MTAsIDB4M2MwNjAwMDEsIDB4MjRjNmM5MzQsIDB4YzUzMDIzLCAKKzB4MjIwMzgyMSwgMHhhZjQyMDEyNCwgMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDVmN2MsIDB4M2MwNTAwMDEsIDB4MjRhNTVhODAsIAorMHgzYzA2MDAwMSwgMHgyNGM2NWFhYywgMHhjNTMwMjMsIDB4MjIwMzgyMSwgCisweGFmNDIwMTIwLCAweGFmNDIwMTE0LCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsIAorMHgzYzA0MDAwMSwgMHgyNDg0NWY4OCwgMHgzYzA1MDAwMSwgMHgyNGE1ZjI5OCwgCisweDNjMDYwMDAxLCAweDI0YzZmNmI0LCAweGM1MzAyMywgMHgyMjAzODIxLCAKKzB4YWY0MjAxMTgsIDB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHg4ZmFlMDA0NCwgCisweDNjMDEwMDAxLCAweGFjMjI2ZjE4LCAweDRlMTAyNCwgMHgyMTA4MiwgCisweDU1MTAyNSwgMHhjMDAzZmMzLCAweGFmYzIwMGQwLCAweGMwMDNjNDAsIAorMHgwLCAweGMwMDI3YTgsIDB4MCwgMHhhYzAwMDIyOCwgCisweGFjMDAwMjJjLCAweDk2ZTIwNDUwLCAweDI0NDJmZmZmLCAweGFmNDIwMDM4LCAKKzB4OTZlMjA0NjAsIDB4YWY0MjAwODAsIDB4MzJjMjQwMDAsIDB4MTQ0MDAwMDMsIAorMHgwLCAweDk2ZTIwNDgwLCAweGFmNDIwMDg0LCAweDk2ZTcwNDkwLCAKKzB4NTBlMDAwMDEsIDB4MjQwNzA4MDAsIDB4MjRlMmZmZmYsIDB4YWY0MjAwODgsIAorMHhhZjQyMDA3YywgMHgyNDAyMDgwMCwgMHgxMGUyMDAwZiwgMHgzMmMyNDAwMCwgCisweDEwNDAwMDAzLCAweDI0MDIwNDAwLCAweDEwZTIwMDBiLCAweDAsIAorMHgyNDBlMDAwMSwgMHgzYzA0MDAwMSwgMHgyNDg0NWY5OCwgMHhhM2FlMDAzZiwgCisweDk2ZTYwNDkwLCAweDI0MDUyMTcwLCAweDJjMDM4MjEsIDB4YWZhMDAwMTAsIAorMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmNDMwMTM4LCAweDhmNDQwMTM4LCAKKzB4MjQwMjAwMDEsIDB4YTM0MjA1YzIsIDB4YWY0MzAwOTQsIDB4YWY0NDAwOTgsIAorMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZjQ2MDA4MCwgMHg4ZjQ3MDA4NCwgCisweDNjMDQwMDAxLCAweDI0ODQ1ZmE0LCAweGMwMDJiM2IsIDB4MjQwNTIyMDAsIAorMHhjMDAyNGE0LCAweDNjMTEwODAwLCAweDNjMTQzM2Q4LCAweDM2OTRjYjU4LCAKKzB4M2MwMjA4MDAsIDB4MzQ0MjAwODAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmYjAsIAorMHgzYzA1MDAwMCwgMHgyNGE1NWQwMCwgMHgzYzA2MDAwMCwgMHgyNGM2NWQxYywgCisweGM1MzAyMywgMHgyN2E3MDAzMCwgMHhhZjgyMDA2MCwgMHgyNDAyZmZmZiwgCisweGFmODIwMDY0LCAweDI3YTIwMDM0LCAweGMwMDE3YTMsIDB4YWZhMjAwMTAsIAorMHgzYzAxMDAwMSwgMHhhYzIyNmViOCwgMHgyMTEwMCwgMHgyMTE4MiwgCisweDUxMTAyNSwgMHhjMDAxOGZjLCAweGFlNDIwMDAwLCAweDhmODIwMjQwLCAKKzB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMjQwLCAweDNjMDIwMDAwLCAKKzB4MjQ0MjQwMzQsIDB4YWY4MjAyNDQsIDB4YWY4MDAyNDAsIDB4OGY4MjAwNjAsIAorMHg1MTEwMjQsIDB4MTQ0MDAwMDUsIDB4M2MwMzA4MDAsIDB4OGY4MjAwNjAsIAorMHg0MzEwMjQsIDB4MTA0MGZmZmQsIDB4MCwgMHhjMDAzYzRkLCAKKzB4ODgyMSwgMHgzYzAyMDEwMCwgMHhhZmEyMDAyMCwgMHg4ZjUzMDAxOCwgCisweDI0MDIwMGZmLCAweDU2NjIwMDAxLCAweDI2NzEwMDAxLCAweDhjMDIwMjI4LCAKKzB4MTYyMjAwMGUsIDB4MTMzMGMwLCAweDhmNDIwMzNjLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIDB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWMyNCwgMHgzYzA1MDAwOSwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgCisweDhmYTYwMDIwLCAweDEwMDAwMDNmLCAweDM0YTUwMTAwLCAweGQ3MTAyMSwgCisweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwNGMwLCAweGFjNDQwNGM0LCAKKzB4YzAxODIxLCAweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAweDEwMjEsIAorMHgyNDA3MDAwNCwgMHhhZmE3MDAxMCwgMHhhZmIxMDAxNCwgMHg4ZjQ4MDAwYywgCisweDI0YzYwNGMwLCAweDJlNjMwMjEsIDB4YWZhODAwMTgsIDB4OGY0ODAxMGMsIAorMHgyNDA3MDAwOCwgMHhhMzI4MjEsIDB4YTM0ODJiLCAweDgyMjAyMSwgCisweDEwMGY4MDksIDB4ODkyMDIxLCAweDE0NDAwMDBiLCAweDI0MDcwMDA4LCAKKzB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWMyYywgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgMHg4ZmE2MDAyMCwgCisweDEwMDAwMDFjLCAweDM0YTUwMjAwLCAweDhmNDQwMTYwLCAweDhmNDUwMTY0LCAKKzB4OGY0MzAwMGMsIDB4YWY1MTAwMTgsIDB4OGY4NjAxMjAsIDB4MjQwMjAwMTAsIAorMHhhZmEyMDAxMCwgMHhhZmIxMDAxNCwgMHhhZmEzMDAxOCwgMHg4ZjQyMDEwYywgCisweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwMDAxMCwgMHgwLCAKKzB4OGY0MjAzNDAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNDAsIDB4OGY0MjAzNDAsIAorMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1YzM0LCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhmYTYwMDIwLCAKKzB4MzRhNTAzMDAsIDB4YzAwMmIzYiwgMHgyNjAzODIxLCAweDhmNDIwMmU0LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAyZTQsIDB4OGY0MjAyZTQsIDB4OTNhMjAwM2YsIAorMHgxMDQwMDA2OSwgMHgzYzAyMDcwMCwgMHgzNDQyMzAwMCwgMHhhZmEyMDAyOCwgCisweDhmNTMwMDE4LCAweDI0MDIwMGZmLCAweDEyNjIwMDAyLCAweDg4MjEsIAorMHgyNjcxMDAwMSwgMHg4YzAyMDIyOCwgMHgxNjIyMDAwZSwgMHgxMzMwYzAsIAorMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwgMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywgCisweDhjMDIwMjI4LCAweDNjMDQwMDAxLCAweDI0ODQ1YzI0LCAweDNjMDUwMDA5LCAKKzB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIDB4OGZhNjAwMjgsIDB4MTAwMDAwM2YsIAorMHgzNGE1MDEwMCwgMHhkNzEwMjEsIDB4OGZhMzAwMjgsIDB4OGZhNDAwMmMsIAorMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwgMHhjMDE4MjEsIDB4OGY0NDAxNzgsIAorMHg4ZjQ1MDE3YywgMHgxMDIxLCAweDI0MDcwMDA0LCAweGFmYTcwMDEwLCAKKzB4YWZiMTAwMTQsIDB4OGY0ODAwMGMsIDB4MjRjNjA0YzAsIDB4MmU2MzAyMSwgCisweGFmYTgwMDE4LCAweDhmNDgwMTBjLCAweDI0MDcwMDA4LCAweGEzMjgyMSwgCisweGEzNDgyYiwgMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsIAorMHgxNDQwMDAwYiwgMHgyNDA3MDAwOCwgMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwgCisweDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ1YzJjLCAweDNjMDUwMDA5LCAKKzB4YWZhMjAwMTQsIDB4OGZhNjAwMjgsIDB4MTAwMDAwMWMsIDB4MzRhNTAyMDAsIAorMHg4ZjQ0MDE2MCwgMHg4ZjQ1MDE2NCwgMHg4ZjQzMDAwYywgMHhhZjUxMDAxOCwgCisweDhmODYwMTIwLCAweDI0MDIwMDEwLCAweGFmYTIwMDEwLCAweGFmYjEwMDE0LCAKKzB4YWZhMzAwMTgsIDB4OGY0MjAxMGMsIDB4NDBmODA5LCAweDI0YzYwMDFjLCAKKzB4MTQ0MDAwMTAsIDB4MCwgMHg4ZjQyMDM0MCwgMHgyNDQyMDAwMSwgCisweGFmNDIwMzQwLCAweDhmNDIwMzQwLCAweDhmODIwMTIwLCAweGFmYTIwMDEwLCAKKzB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDVjMzQsIDB4M2MwNTAwMDksIAorMHhhZmEyMDAxNCwgMHg4ZmE2MDAyOCwgMHgzNGE1MDMwMCwgMHhjMDAyYjNiLCAKKzB4MjYwMzgyMSwgMHg4ZjQyMDJmMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDJmMCwgCisweDhmNDIwMmYwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZmMwLCAweGFmYTAwMDEwLCAKKzB4YWZhMDAwMTQsIDB4OGZhNjAwMjgsIDB4MjQwNTIzMDAsIDB4YzAwMmIzYiwgCisweDM4MjEsIDB4MTAwMDAwMDQsIDB4MCwgMHg4YzAyMDI2NCwgCisweDEwNDAwMDA1LCAweDAsIDB4OGY4MjAwYTAsIDB4MzA0MjAwMDQsIAorMHgxNDQwZmZmYSwgMHgwLCAweDhmODIwMDQ0LCAweDM0NDIwMDA0LCAKKzB4YWY4MjAwNDQsIDB4OGY0MjAzMDgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIAorMHg4ZjQyMDMwOCwgMHg4ZjgyMDBkOCwgMHg4ZjgzMDBkNCwgMHg0MzEwMjMsIAorMHgyNDQyZmY4MCwgMHhhZjQyMDA5MCwgMHg4ZjQyMDA5MCwgMHgyODQyZmY4MSwgCisweDEwNDAwMDA2LCAweDI0MDIwMDAxLCAweDhmNDIwMDkwLCAweDhmNDMwMTQ0LCAKKzB4NDMxMDIxLCAweGFmNDIwMDkwLCAweDI0MDIwMDAxLCAweGFmNDIwMDhjLCAKKzB4MzJjMjAwMDgsIDB4MTA0MDAwMDYsIDB4MCwgMHg4ZjgyMDIxNCwgCisweDNjMDM4MTAwLCAweDMwNDJmZmZmLCAweDQzMTAyNSwgMHhhZjgyMDIxNCwgCisweDNjMDMwMDAxLCAweDhjNjM2ZDk0LCAweDMwNjIwMDAyLCAweDEwNDAwMDA5LCAKKzB4MzA2MjAwMDEsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmY2MsIDB4M2MwNTAwMDAsIAorMHgyNGE1NmQ1MCwgMHgzYzA2MDAwMCwgMHgyNGM2NzFjOCwgMHgxMDAwMDAxMiwgCisweGM1MzAyMywgMHgxMDQwMDAwOSwgMHgwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDVmZGMsIDB4M2MwNTAwMDAsIDB4MjRhNTcxZDAsIDB4M2MwNjAwMDAsIAorMHgyNGM2NzY3OCwgMHgxMDAwMDAwOCwgMHhjNTMwMjMsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWZlYywgMHgzYzA1MDAwMCwgMHgyNGE1Njk0OCwgMHgzYzA2MDAwMCwgCisweDI0YzY2ZDQ4LCAweGM1MzAyMywgMHgyN2E3MDAzMCwgMHgyN2EyMDAzNCwgCisweGMwMDE3YTMsIDB4YWZhMjAwMTAsIDB4M2MwMTAwMDEsIDB4YWMyMjZlY2MsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmVjYywgMHgzYzAzMDgwMCwgMHgyMTEwMCwgCisweDIxMTgyLCAweDQzMTAyNSwgMHhhZTQyMDA0MCwgMHg4ZjgyMDBhMCwgCisweGFmYTIwMDEwLCAweDhmODIwMGIwLCAweGFmYTIwMDE0LCAweDhmODYwMDVjLCAKKzB4OGY4NzAxMWMsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmZmMsIDB4M2MwMTAwMDEsIAorMHhhYzM2NmVhNCwgMHgzYzAxMDAwMSwgMHhhYzIwNmU5NCwgMHgzYzAxMDAwMSwgCisweGFjM2M2ZThjLCAweDNjMDEwMDAxLCAweGFjM2I2ZWJjLCAweDNjMDEwMDAxLCAKKzB4YWMzNzZlYzAsIDB4M2MwMTAwMDEsIDB4YWMzYTZlYTAsIDB4YzAwMmIzYiwgCisweDI0MDUyNDAwLCAweDhmODIwMjAwLCAweGFmYTIwMDEwLCAweDhmODIwMjIwLCAKKzB4YWZhMjAwMTQsIDB4OGY4NjAwNDQsIDB4OGY4NzAwNTAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjAwOCwgMHhjMDAyYjNiLCAweDI0MDUyNTAwLCAweDhmODMwMDYwLCAKKzB4NzQxMDBiLCAweDI0MjAwMGEsIDB4MjAwZjgyMSwgMHgwLCAKKzB4ZCwgMHg4ZmJmMDA2MCwgMHg4ZmJlMDA1YywgMHg4ZmI1MDA1OCwgCisweDhmYjMwMDU0LCAweDhmYjIwMDUwLCAweDhmYjEwMDRjLCAweDhmYjAwMDQ4LCAKKzB4M2UwMDAwOCwgMHgyN2JkMDA2OCwgMHgyN2JkZmZlMCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2MDE0LCAweDI0MDUyNjAwLCAweDMwMjEsIDB4MzgyMSwgCisweGFmYmYwMDE4LCAweGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsIAorMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLCAweDNlMDAwMDgsIAorMHgwLCAweDNlMDAwMDgsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDNlMDAwMDgsIDB4MCwgMHgzZTAwMDA4LCAweDAsIAorMHgyN2JkZmRlMCwgMHgyN2E1MDAxOCwgMHgzYzA0ZGVhZCwgMHgzNDg0YmVlZiwgCisweGFmYmYwMjE4LCAweDhmODIwMTUwLCAweDNjMDMwMDFmLCAweDM0NjNmZmZmLCAKKzB4YWZhNDAwMTgsIDB4YTIyODIzLCAweGEzMjgyNCwgMHg4Y2EyMDAwMCwgCisweDEwNDQwMDBhLCAweDAsIDB4YWZhNTAwMTAsIDB4OGNhMjAwMDAsIAorMHhhZmEyMDAxNCwgMHg4Zjg2MDE1MCwgMHg4Zjg3MDI1MCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2MDFjLCAweGMwMDJiM2IsIDB4MjQwNTI3MDAsIDB4OGZiZjAyMTgsIAorMHgzZTAwMDA4LCAweDI3YmQwMjIwLCAweDI3YmRmZmUwLCAweDNjMDZhYmJhLCAKKzB4MzRjNmJhYmUsIDB4YWZiMDAwMTgsIDB4M2MxMDAwMDQsIDB4M2MwNzAwN2YsIAorMHgzNGU3ZmZmZiwgMHhhZmJmMDAxYywgMHgxMDI4NDAsIDB4OGUwNDAwMDAsIAorMHg4Y2EzMDAwMCwgMHhhY2EwMDAwMCwgMHhhZTA2MDAwMCwgMHg4Y2EyMDAwMCwgCisweGFjYTMwMDAwLCAweDEwNDYwMDA1LCAweGFlMDQwMDAwLCAweGEwODAyMSwgCisweGYwMTAyYiwgMHgxMDQwZmZmNSwgMHgxMDI4NDAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjAyOCwgMHgyNDA1MjgwMCwgMHgyMDAzMDIxLCAweDM4MjEsIAorMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDIwMDEwMjEsIAorMHg4ZmJmMDAxYywgMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLCAKKzB4OGMwMjAyMjQsIDB4MzA0NzAwM2YsIDB4MTBlMDAwMTAsIDB4ODAzMDIxLCAKKzB4MjgyMSwgMHgyNDAzMDAyMCwgMHhlMzEwMjQsIDB4MTA0MDAwMDIsIAorMHg2MzA0MiwgMHhhNjI4MjEsIDB4MzE4NDIsIDB4MTQ2MGZmZmIsIAorMHhlMzEwMjQsIDB4MjQwMmYwMDAsIDB4YTIyODI0LCAweDM0MDJmZmZmLCAKKzB4NDUxMDJiLCAweDE0NDAwMDAzLCAweDNjMDIwMDAxLCAweDEwMDAwMDA4LCAKKzB4M2MwMjAwMDEsIDB4MzQ0MmZmZmYsIDB4ODUxODIzLCAweDQzMTAyYiwgCisweDE0NDAwMDAzLCAweGEwMTAyMSwgMHgzYzAyZmZmZSwgMHg4MjEwMjEsIAorMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZDAsIDB4YWZiNTAwMjgsIAorMHg4ZmI1MDA0MCwgMHhhZmIyMDAyMCwgMHhhMDkwMjEsIDB4YWZiMTAwMWMsIAorMHgyNGM2MDAwMywgMHhhZmJmMDAyYywgMHhhZmIzMDAyNCwgMHhhZmIwMDAxOCwgCisweDhlYTIwMDAwLCAweDI0MDNmZmZjLCAweGMzODAyNCwgMHg1MDEwMmIsIAorMHgxNDQwMDAxYiwgMHhlMDg4MjEsIDB4OGUzMzAwMDAsIDB4YWZiMDAwMTAsIAorMHg4ZWEyMDAwMCwgMHhhZmEyMDAxNCwgMHg4ZTI3MDAwMCwgMHgyNDA1MzAwMCwgCisweGMwMDJiM2IsIDB4MjQwMzAyMSwgMHg4ZTIzMDAwMCwgMHg3MDIwMjEsIAorMHg2NDEwMmIsIDB4MTA0MDAwMDcsIDB4MjQwMjgyMSwgMHg4Y2EyMDAwMCwgCisweGFjNjIwMDAwLCAweDI0NjMwMDA0LCAweDY0MTAyYiwgMHgxNDQwZmZmYiwgCisweDI0YTUwMDA0LCAweDhlYTIwMDAwLCAweDUwMTAyMywgMHhhZWEyMDAwMCwgCisweDhlMjIwMDAwLCAweDUwMTAyMSwgMHgxMDAwMDAwYiwgMHhhZTIyMDAwMCwgCisweDI0MDIwMDJkLCAweGEwODIwMDAwLCAweGFmYjAwMDEwLCAweDhlYTIwMDAwLCAKKzB4MjQwOTgyMSwgMHhhZmEyMDAxNCwgMHg4ZTI3MDAwMCwgMHgyNDA1MzEwMCwgCisweGMwMDJiM2IsIDB4MjYwMzAyMSwgMHgyNjAxMDIxLCAweDhmYmYwMDJjLCAKKzB4OGZiNTAwMjgsIDB4OGZiMzAwMjQsIDB4OGZiMjAwMjAsIDB4OGZiMTAwMWMsIAorMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDMwLCAweDI3YmRmZmU4LCAKKzB4M2MxY2MwMDAsIDB4M2MwNWZmZmUsIDB4M2MwMzAwMDEsIDB4OGM2MzZlODQsIAorMHgzYzA0MDAwMSwgMHg4Yzg0NmU5MCwgMHgzNGE1YmYwOCwgMHgyNDAyMWZmYywgCisweDNjMDEwMDAxLCAweGFjMjI2Y2QwLCAweDNjMDIwMGMwLCAweDNjMDEwMDAxLCAKKzB4YWMyMjZjZDQsIDB4M2MwMjAwMjAsIDB4YWZiZjAwMTAsIDB4M2MwMTAwYzAsIAorMHhhYzIwMWZmYywgMHg0MzEwMjMsIDB4NDQxMDIzLCAweDI0NWJiMDAwLCAKKzB4MzY1YjgyMSwgMHgzYzFkMDAwMSwgMHg4ZmJkNmNjYywgMHgzYTBmMDIxLCAKKzB4M2MwNDAwYzAsIDB4MzQ4NDAyMDAsIDB4M2MxYTAwYzAsIDB4M2MwMzAwYzAsIAorMHgzNDYzMDdjOCwgMHgyNDAyMWRmYywgMHgzYzAxMDAwMSwgMHhhYzIyNmNkMCwgCisweDI0MDIxODM0LCAweDNjMDEwMDAxLCAweGFjMjQ2Y2Q0LCAweDNjMDEwMDAxLCAKKzB4YWMyMjZjZDAsIDB4M2MwMTAwMDEsIDB4YWMyMzZjZDQsIDB4YzAwMTgwZCwgCisweDM3NWEwMjAwLCAweDhmYmYwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMTgsIAorMHgyN2JkZmZjOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjAzNCwgMHgyNDA1MzIwMCwgCisweDNjMDIwMDAxLCAweDhjNDI2Y2QwLCAweDNjMDMwMDAxLCAweDhjNjM2Y2Q0LCAKKzB4MzAyMSwgMHgzNjAzODIxLCAweGFmYmYwMDMwLCAweGFmYjMwMDJjLCAKKzB4YWZiMjAwMjgsIDB4YWZiMTAwMjQsIDB4YWZiMDAwMjAsIDB4YWZhMjAwMWMsIAorMHhhZmEzMDAxOCwgMHhhZmI3MDAxMCwgMHhjMDAyYjNiLCAweGFmYmEwMDE0LCAKKzB4YzAwMTkxNiwgMHgwLCAweDhmODIwMjQwLCAweDM0NDIwMDA0LCAKKzB4YWY4MjAyNDAsIDB4MjQwMjAwMDEsIDB4YWY0MjAwMDAsIDB4M2MwMjAwMDEsIAorMHg1NzEwMjEsIDB4OTA0MjQwZjQsIDB4MTA0MDAwOTIsIDB4MjQwM2ZmZmMsIAorMHgzYzEwMDAwMSwgMHgyNjEwYWM3MywgMHgzYzEyMDAwMSwgMHgyNjUyYTg0YywgCisweDIxMjEwMjMsIDB4NDM4MDI0LCAweDhmYTMwMDFjLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDYwNDAsIDB4NzAxMDJiLCAweDE0NDAwMDFhLCAweDI3YjMwMDE4LCAKKzB4OGZiMTAwMTgsIDB4MjQwNTMwMDAsIDB4MjQwMzAyMSwgMHhhZmIwMDAxMCwgCisweGFmYTMwMDE0LCAweGMwMDJiM2IsIDB4MjIwMzgyMSwgMHg4ZmEzMDAxOCwgCisweDcwMjAyMSwgMHg2NDEwMmIsIDB4MTA0MDAwMDcsIDB4MjQwMzAyMSwgCisweDhjYzIwMDAwLCAweGFjNjIwMDAwLCAweDI0NjMwMDA0LCAweDY0MTAyYiwgCisweDE0NDBmZmZiLCAweDI0YzYwMDA0LCAweDhmYTIwMDFjLCAweDUwMTAyMywgCisweGFmYTIwMDFjLCAweDhlNjIwMDAwLCAweDUwMTAyMSwgMHgxMDAwMDAwYSwgCisweGFlNjIwMDAwLCAweDI0MDg4MjEsIDB4MjQwNTMxMDAsIDB4YWZiMDAwMTAsIAorMHhhZmEzMDAxNCwgMHg4ZmE3MDAxOCwgMHgyMjAzMDIxLCAweDI0MDIwMDJkLCAKKzB4YzAwMmIzYiwgMHhhMDgyMDAwMCwgMHgyNDA3MDAyMCwgMHg4ZmEzMDAxYywgCisweDNjMDQwMDAxLCAweDI0ODQ2MDVjLCAweDI0MTIwMDIwLCAweDNjMDEwMDAxLCAKKzB4YWMzMTZlYjAsIDB4MmM2MjAwMjAsIDB4MTQ0MDAwMWQsIDB4MjdiMTAwMTgsIAorMHg4ZmIwMDAxOCwgMHgyNDA1MzAwMCwgMHgzYzA2MDAwMSwgMHgyNGM2NmY1MCwgCisweGFmYTcwMDEwLCAweGFmYTMwMDE0LCAweGMwMDJiM2IsIDB4MjAwMzgyMSwgCisweDhmYTMwMDE4LCAweDNjMDQwMDAxLCAweDI0ODQ2ZjUwLCAweDI0NjUwMDIwLCAKKzB4NjUxMDJiLCAweDEwNDAwMDA3LCAweDAsIDB4OGM4MjAwMDAsIAorMHhhYzYyMDAwMCwgMHgyNDYzMDAwNCwgMHg2NTEwMmIsIDB4MTQ0MGZmZmIsIAorMHgyNDg0MDAwNCwgMHg4ZmEyMDAxYywgMHg1MjEwMjMsIDB4YWZhMjAwMWMsIAorMHg4ZTIyMDAwMCwgMHg1MjEwMjEsIDB4MTAwMDAwMGIsIDB4YWUyMjAwMDAsIAorMHgzYzEwMDAwMSwgMHgyNjEwNmY1MCwgMHgyNDA1MzEwMCwgMHhhZmE3MDAxMCwgCisweGFmYTMwMDE0LCAweDhmYTcwMDE4LCAweDIwMDMwMjEsIDB4MjQwMjAwMmQsIAorMHhjMDAyYjNiLCAweGEwODIwMDAwLCAweDI0MDcwMDIwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDYwNzAsIDB4OGZhMzAwMWMsIDB4MjQxMjAwMjAsIDB4M2MwMTAwMDEsIAorMHhhYzMwNmVlNCwgMHgyYzYyMDAyMCwgMHgxNDQwMDAxZCwgMHgyN2IxMDAxOCwgCisweDhmYjAwMDE4LCAweDI0MDUzMDAwLCAweDNjMDYwMDAxLCAweDI0YzY2ZjcwLCAKKzB4YWZhNzAwMTAsIDB4YWZhMzAwMTQsIDB4YzAwMmIzYiwgMHgyMDAzODIxLCAKKzB4OGZhMzAwMTgsIDB4M2MwNDAwMDEsIDB4MjQ4NDZmNzAsIDB4MjQ2NTAwMjAsIAorMHg2NTEwMmIsIDB4MTA0MDAwMDcsIDB4MCwgMHg4YzgyMDAwMCwgCisweGFjNjIwMDAwLCAweDI0NjMwMDA0LCAweDY1MTAyYiwgMHgxNDQwZmZmYiwgCisweDI0ODQwMDA0LCAweDhmYTIwMDFjLCAweDUyMTAyMywgMHhhZmEyMDAxYywgCisweDhlMjIwMDAwLCAweDUyMTAyMSwgMHgxMDAwMDAwYiwgMHhhZTIyMDAwMCwgCisweDNjMTAwMDAxLCAweDI2MTA2ZjcwLCAweDI0MDUzMTAwLCAweGFmYTcwMDEwLCAKKzB4YWZhMzAwMTQsIDB4OGZhNzAwMTgsIDB4MjAwMzAyMSwgMHgyNDAyMDAyZCwgCisweGMwMDJiM2IsIDB4YTA4MjAwMDAsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMzEsIAorMHhhYzMwNmVlMCwgMHgzYzEwMDAwMSwgMHgyNjEwODIxZiwgMHgzYzEyMDAwMSwgCisweDI2NTI4MDljLCAweDIxMjEwMjMsIDB4NDM4MDI0LCAweDhmYTMwMDFjLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDYwODQsIDB4NzAxMDJiLCAweDE0NDAwMDFhLCAKKzB4MjdiMzAwMTgsIDB4OGZiMTAwMTgsIDB4MjQwNTMwMDAsIDB4MjQwMzAyMSwgCisweGFmYjAwMDEwLCAweGFmYTMwMDE0LCAweGMwMDJiM2IsIDB4MjIwMzgyMSwgCisweDhmYTMwMDE4LCAweDcwMjAyMSwgMHg2NDEwMmIsIDB4MTA0MDAwMDcsIAorMHgyNDAzMDIxLCAweDhjYzIwMDAwLCAweGFjNjIwMDAwLCAweDI0NjMwMDA0LCAKKzB4NjQxMDJiLCAweDE0NDBmZmZiLCAweDI0YzYwMDA0LCAweDhmYTIwMDFjLCAKKzB4NTAxMDIzLCAweGFmYTIwMDFjLCAweDhlNjIwMDAwLCAweDUwMTAyMSwgCisweDEwMDAwMDBhLCAweGFlNjIwMDAwLCAweDI0MDg4MjEsIDB4MjQwNTMxMDAsIAorMHhhZmIwMDAxMCwgMHhhZmEzMDAxNCwgMHg4ZmE3MDAxOCwgMHgyMjAzMDIxLCAKKzB4MjQwMjAwMmQsIDB4YzAwMmIzYiwgMHhhMDgyMDAwMCwgMHgzYzAxMDAwMSwgCisweGFjMzE2ZWIwLCAweDNjMDMwMDAxLCAweDhjNjM2ZWIwLCAweDI0MDIwNDAwLCAKKzB4NjBmODA5LCAweGFmODIwMDcwLCAweDhmYmYwMDMwLCAweDhmYjMwMDJjLCAKKzB4OGZiMjAwMjgsIDB4OGZiMTAwMjQsIDB4OGZiMDAwMjAsIDB4M2UwMDAwOCwgCisweDI3YmQwMDM4LCAweDAsIDB4MCwgMHg4ZjgyMDA0MCwgCisweDNjMDNmMDAwLCAweDQzMTAyNCwgMHgzYzAzNjAwMCwgMHgxNDQzMDAwNiwgCisweDAsIDB4OGY4MjAwNTAsIDB4MjQwM2ZmODAsIDB4NDMxMDI0LCAKKzB4MzQ0MjAwNTUsIDB4YWY4MjAwNTAsIDB4OGY4MjAwNTQsIDB4MjQ0MjAzZTgsIAorMHhhZjgyMDA1OCwgMHgyNDAyMDFmNCwgMHhhZjQyMDBlMCwgMHgyNDAyMDAwNCwgCisweGFmNDIwMGU4LCAweDI0MDIwMDAyLCAweGFmNDAwMWIwLCAweGFmNDAwMGU0LCAKKzB4YWY0MjAwZGMsIDB4YWY0MDAwZDgsIDB4YWY0MDAwZDQsIDB4M2UwMDAwOCwgCisweGFmNDAwMGQwLCAweDhmODIwMDU0LCAweDI0NDIwMDA1LCAweDNlMDAwMDgsIAorMHhhZjgyMDA3OCwgMHgyN2JkZmZlOCwgMHhhZmJmMDAxMCwgMHg4ZjgyMDA1NCwgCisweDI0NDIwM2U4LCAweGFmODIwMDU4LCAweDNjMDIwODAwLCAweDJjMjEwMjQsIAorMHgxMDQwMDAwNCwgMHgzYzAyZjdmZiwgMHgzNDQyZmZmZiwgMHgyYzJiMDI0LCAKKzB4MzY5NDAwNDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYTgsIDB4MTA0MDAwMTcsIAorMHgzYzAyMDIwMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmYxYywgMHgxMDYwMDAxNiwgCisweDI4MmEwMjUsIDB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTQ0MDAwMTIsIAorMHgzYzAyMDIwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmQ5NCwgMHgzMDQyMDAwMywgCisweDE0NDAwMDBkLCAweDNjMDIwMjAwLCAweDhmODMwMjI0LCAweDNjMDIwMDAyLCAKKzB4OGM0MjhmZWMsIDB4MTA2MjAwMDgsIDB4M2MwMjAyMDAsIDB4YzAwM2RhZiwgCisweDAsIDB4MTAwMDAwMDQsIDB4M2MwMjAyMDAsIDB4YzAwNDE5NiwgCisweDAsIDB4M2MwMjAyMDAsIDB4MmMyMTAyNCwgMHgxMDQwMDAwMywgCisweDAsIDB4YzAwMWY0YiwgMHgwLCAweDhmNDIwMGQ4LCAKKzB4OGY0MzAwZGMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAwZDgsIDB4NDMxMDJiLCAKKzB4MTQ0MDAwMDMsIDB4MCwgMHhhZjQwMDBkOCwgMHgzNjk0MDA4MCwgCisweDhjMDMwMjM4LCAweDEwNjAwMDBjLCAweDAsIDB4OGY0MjAxYjAsIAorMHgyNDQyMDNlOCwgMHhhZjQyMDFiMCwgMHg0MzEwMmIsIDB4MTQ0MDAwMDYsIAorMHgwLCAweDkzNDIwNWM1LCAweDE0NDAwMDAzLCAweDAsIAorMHhjMDAxZGEwLCAweDAsIDB4OGZiZjAwMTAsIDB4M2UwMDAwOCwgCisweDI3YmQwMDE4LCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwgCisweGFmYmYwMDIwLCAweDhmNDMwMDJjLCAweDhmNDIwMDM4LCAweDEwNjIwMDU5LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjQwZjAsIAorMHgxMDQwMDAyNiwgMHgyNDA3MDAwOCwgMHg4ZjQ0MDE3MCwgMHg4ZjQ1MDE3NCwgCisweDhmNDgwMDBjLCAweDhmODYwMTIwLCAweDI0MDIwMDIwLCAweGFmYTIwMDEwLCAKKzB4YWZhMzAwMTQsIDB4YWZhODAwMTgsIDB4OGY0MjAxMGMsIDB4NDBmODA5LCAKKzB4MjRjNjAwMWMsIDB4MTQ0MDAwMTEsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4YTAyMjQwZjAsIDB4OGY4MjAxMjQsIDB4YWZhMjAwMTAsIAorMHg4ZjgyMDEyOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjEyOCwgMHhhZmEyMDAxNCwgCisweDhmNDYwMDJjLCAweDhmODcwMTIwLCAweDNjMDUwMDA5LCAweGMwMDJiM2IsIAorMHgzNGE1MDkwMCwgMHgxMDAwMDA1YywgMHgwLCAweDhmNDIwMzAwLCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzMDAsIDB4OGY0MjAzMDAsIDB4OGY0MjAwMmMsIAorMHhhMzQwMDVjMSwgMHgxMDAwMDAyNywgMHhhZjQyMDAzOCwgMHg4ZjQ0MDE3MCwgCisweDhmNDUwMTc0LCAweDhmNDMwMDJjLCAweDhmNDgwMDBjLCAweDhmODYwMTIwLCAKKzB4MjQwMjAwODAsIDB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIDB4YWZhODAwMTgsIAorMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTQ0MDAwMTEsIAorMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMjQwZjEsIAorMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyOCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2MTM0LCAweGFmYTIwMDE0LCAweDhmNDYwMDJjLCAweDhmODcwMTIwLCAKKzB4M2MwNTAwMDksIDB4YzAwMmIzYiwgMHgzNGE1MTEwMCwgMHgxMDAwMDAzNiwgCisweDAsIDB4OGY0MjAzMDAsIDB4OGY0MzAwMmMsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDMwMCwgMHg4ZjQyMDMwMCwgMHgyNDAyMDAwMSwgMHhhMzQyMDVjMSwgCisweGFmNDMwMDM4LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMSwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMCwgMHgxMDAwMDAyNiwgCisweGFmNDAwMDM0LCAweDkzNDIwNWMxLCAweDEwNDAwMDFkLCAweDAsIAorMHhhMzQwMDVjMSwgMHg4ZjgyMDA0MCwgMHgzMDQyMDAwMSwgMHgxNDQwMDAwOCwgCisweDIwMjEsIDB4OGMwMzAxMDQsIDB4MjQwMjAwMDEsIDB4NTA2MjAwMDUsIAorMHgyNDA0MDAwMSwgMHg4YzAyMDI2NCwgMHgxMDQwMDAwMywgMHg4MDEwMjEsIAorMHgyNDA0MDAwMSwgMHg4MDEwMjEsIDB4MTA0MDAwMDYsIDB4MCwgCisweDhmNDIwMzBjLCAweDI0NDIwMDAxLCAweGFmNDIwMzBjLCAweDEwMDAwMDA4LCAKKzB4OGY0MjAzMGMsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwMDQsIDB4YWY4MjAwNDQsIAorMHg4ZjQyMDMwOCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMCwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhMDIwNDBmMSwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywgCisweDAsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsIAorMHgwLCAweDEwMDAwMDA1LCAweDAsIDB4YWY4MDAwNDgsIAorMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAweDhmODIwMDYwLCAKKzB4M2MwM2ZmN2YsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMDYwLCAKKzB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwMDAwMiwgCisweGFmODAwMDRjLCAweGFmODAwMDQ4LCAweDhmYmYwMDIwLCAweDNlMDAwMDgsIAorMHgyN2JkMDAyOCwgMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZDgsIAorMHhhZmJmMDAyMCwgMHg4ZjQzMDA0NCwgMHg4ZjQyMDA3YywgMHgxMDYyMDAyOSwgCisweDI0MDcwMDA4LCAweDhmNDQwMTY4LCAweDhmNDUwMTZjLCAweDhmNDgwMDBjLCAKKzB4OGY4NjAxMjAsIDB4MjQwMjAwNDAsIDB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIAorMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsIAorMHgxNDQwMDAxMSwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhMDIyNDBmMiwgMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyOCwgCisweDNjMDQwMDAxLCAweDI0ODQ2MTNjLCAweGFmYTIwMDE0LCAweDhmNDYwMDQ0LCAKKzB4OGY4NzAxMjAsIDB4M2MwNTAwMDksIDB4YzAwMmIzYiwgMHgzNGE1MTMwMCwgCisweDEwMDAwMDBmLCAweDAsIDB4OGY0MjAzMDQsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDMwNCwgMHg4ZjQyMDMwNCwgMHg4ZjQyMDA0NCwgMHhhZjQyMDA3YywgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMiwgMHgxMDAwMDAwNCwgCisweGFmNDAwMDc4LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMiwgCisweDhmNDIwMDAwLCAweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsIAorMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAKKzB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgCisweDAsIDB4OGY4MjAwNjAsIDB4M2MwM2ZlZmYsIDB4MzQ2M2ZmZmYsIAorMHg0MzEwMjQsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsIAorMHgwLCAweDEwMDAwMDAyLCAweGFmODAwMDRjLCAweGFmODAwMDQ4LCAKKzB4OGZiZjAwMjAsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzZTAwMDA4LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhOCwgMHgyN2JkZmZhOCwgCisweGFmYmYwMDUwLCAweGFmYmUwMDRjLCAweGFmYjUwMDQ4LCAweGFmYjMwMDQ0LCAKKzB4YWZiMjAwNDAsIDB4YWZiMTAwM2MsIDB4YWZiMDAwMzgsIDB4MTA0MDAwZDUsIAorMHg4ZjkwMDA0NCwgMHg4ZjQyMDBkMCwgMHgyNDQzMDAwMSwgMHgyODQyMDAwYiwgCisweDE0NDAwMGU0LCAweGFmNDMwMGQwLCAweDhmNDIwMDA0LCAweDMwNDIwMDAyLCAKKzB4MTQ0MDAwOWMsIDB4YWY0MDAwZDAsIDB4OGY0MjAwMDQsIDB4M2MwMzAwMDEsIAorMHg4YzYzNmQ5OCwgMHgzNDQyMDAwMiwgMHhhZjQyMDAwNCwgMHgyNDAyMDAwMSwgCisweDE0NjIwMDAzLCAweDNjMDIwNjAwLCAweDEwMDAwMDAyLCAweDM0NDIzMDAwLCAKKzB4MzQ0MjEwMDAsIDB4YWZhMjAwMjAsIDB4OGY0YTAwMTgsIDB4YWZhYTAwMzQsIAorMHgyN2FhMDAyMCwgMHhhZmFhMDAyYywgMHg4ZmFhMDAzNCwgMHgyNDAyMDBmZiwgCisweDExNDIwMDAyLCAweDE4MjEsIDB4MjU0MzAwMDEsIDB4OGMwMjAyMjgsIAorMHg2MDk4MjEsIDB4MTY2MjAwMGUsIDB4M2MwNTAwMDksIDB4OGY0MjAzM2MsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywgMHg4YzAyMDIyOCwgCisweDhmYTcwMDM0LCAweDNjMDQwMDAxLCAweDI0ODQ2MTBjLCAweGFmYTAwMDE0LCAKKzB4YWZhMjAwMTAsIDB4OGZhNjAwMjAsIDB4MTAwMDAwNzAsIDB4MzRhNTA1MDAsIAorMHg4ZmFhMDAzNCwgMHhhMzhjMCwgMHhmNzEwMjEsIDB4OGZhMzAwMjAsIAorMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDI0NzEwM2U4LCAweDIyMjEwMjMsIDB4MmM0MjAzZTksIAorMHgxMDQwMDAxYiwgMHhhODIxLCAweGUwOTAyMSwgMHgyNjVlMDRjMCwgCisweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAweDI0MDE4MjEsIDB4MjQwYTAwMDQsIAorMHhhZmFhMDAxMCwgMHhhZmIzMDAxNCwgMHg4ZjQ4MDAwYywgMHgxMDIxLCAKKzB4MmZlMzAyMSwgMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgyNDA3MDAwOCwgCisweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLCAweDEwMGY4MDksIAorMHg4OTIwMjEsIDB4NTQ0MDAwMDYsIDB4MjQxNTAwMDEsIDB4OGY4MjAwNTQsIAorMHgyMjIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmU5LCAweDAsIAorMHgzMmEyMDBmZiwgMHg1NDQwMDAxOCwgMHhhZjUzMDAxOCwgMHg4ZjQyMDM3OCwgCisweDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LCAweDhmODIwMTIwLCAKKzB4OGZhYTAwMmMsIDB4OGZhNzAwMzQsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjExOCwgMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwgCisweDNjMDUwMDA5LCAweDEwMDAwMDM1LCAweDM0YTUwNjAwLCAweDhmNDIwMzA4LCAKKzB4MjQxNTAwMDEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsIAorMHgxMDAwMDAxZSwgMHgzMmEyMDBmZiwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgCisweDI0NzEwM2U4LCAweDIyMjEwMjMsIDB4MmM0MjAzZTksIDB4MTA0MDAwMTYsIAorMHhhODIxLCAweDNjMWUwMDIwLCAweDI0MTIwMDEwLCAweDhmNDIwMDBjLCAKKzB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIDB4YWZiMjAwMTAsIAorMHhhZmIzMDAxNCwgMHg1ZTEwMjUsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIAorMHgyNDA3MDAwOCwgMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTQ0MGZmZTMsIAorMHgwLCAweDhmODIwMDU0LCAweDIyMjEwMjMsIDB4MmM0MjAzZTksIAorMHgxNDQwZmZlZSwgMHgwLCAweDMyYTIwMGZmLCAweDE0NDAwMDExLCAKKzB4M2MwNTAwMDksIDB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIAorMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwgMHg4ZmFhMDAyYywgMHg4ZmE3MDAzNCwgCisweGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MTIwLCAKKzB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsIDB4MzRhNTA3MDAsIDB4YzAwMmIzYiwgCisweDAsIDB4OGY0MjAyZWMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZWMsIAorMHg4ZjQyMDJlYywgMHg4ZjQyMDAwNCwgMHgzMDQyMDAwMSwgMHg1MDQwMDAyOSwgCisweDM2MTAwMDQwLCAweDNjMDIwNDAwLCAweDJjMjEwMjQsIDB4MTA0MDAwMTMsIAorMHgyNDA0ZmZkZiwgMHg4ZjQyMDI1MCwgMHg4ZjQzMDI1NCwgMHg4ZjQ0MDFiNCwgCisweDE0NjQwMDA2LCAweDM2MTAwMDQwLCAweDhmNDIwMjcwLCAweDhmNDMwMjc0LCAKKzB4OGY0NDAxYjgsIDB4MTA2NDAwMDcsIDB4MjQwMmZmZGYsIDB4OGY0MjAyNTAsIAorMHg4ZjQzMDI1NCwgMHg4ZjQ0MDI3MCwgMHg4ZjQ1MDI3NCwgMHgxMDAwMDAxMiwgCisweDNhMTAwMDIwLCAweDEwMDAwMDJiLCAweDIwMjgwMjQsIDB4OGY0MjAyNTAsIAorMHg4ZjQzMDI1NCwgMHg4ZjQ1MDFiNCwgMHgxNDY1MDAwNiwgMHgyMDQ4MDI0LCAKKzB4OGY0MjAyNzAsIDB4OGY0MzAyNzQsIDB4OGY0NDAxYjgsIDB4NTA2NDAwMjEsIAorMHgzNjEwMDA0MCwgMHg4ZjQyMDI1MCwgMHg4ZjQzMDI1NCwgMHg4ZjQ0MDI3MCwgCisweDhmNDUwMjc0LCAweDNhMTAwMDQwLCAweGFmNDMwMWI0LCAweDEwMDAwMDE5LCAKKzB4YWY0NTAxYjgsIDB4OGY0MjAwZDQsIDB4MjQ0MzAwMDEsIDB4MTAwMDAwMTEsIAorMHgyODQyMDAzMywgMHg4ZjQyMDAwNCwgMHgzMDQyMDAwMSwgMHgxMDQwMDAwOSwgCisweDNjMDIwNDAwLCAweDJjMjEwMjQsIDB4MTA0MDAwMDQsIDB4MjQwMmZmZGYsIAorMHgyMDI4MDI0LCAweDEwMDAwMDBiLCAweDM2MTAwMDQwLCAweDEwMDAwMDA5LCAKKzB4MzYxMDAwNjAsIDB4OGY0MjAwZDQsIDB4MzYxMDAwNDAsIDB4MjQ0MzAwMDEsIAorMHgyODQyMDFmNSwgMHgxNDQwMDAwMywgMHhhZjQzMDBkNCwgMHhhZjQwMDBkNCwgCisweDNhMTAwMDIwLCAweGFmOTAwMDQ0LCAweDI0MDJmZjdmLCAweDI4MmEwMjQsIAorMHg4ZmJmMDA1MCwgMHg4ZmJlMDA0YywgMHg4ZmI1MDA0OCwgMHg4ZmIzMDA0NCwgCisweDhmYjIwMDQwLCAweDhmYjEwMDNjLCAweDhmYjAwMDM4LCAweDNlMDAwMDgsIAorMHgyN2JkMDA1OCwgMHgzZTAwMDA4LCAweDAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNmRhOCwgMHgyN2JkZmZiMCwgMHhhZmJmMDA0OCwgMHhhZmJlMDA0NCwgCisweGFmYjUwMDQwLCAweGFmYjMwMDNjLCAweGFmYjIwMDM4LCAweGFmYjEwMDM0LCAKKzB4MTA0MDAwYzcsIDB4YWZiMDAwMzAsIDB4OGY0MjAwZDAsIDB4MjQ0MzAwMDEsIAorMHgyODQyMDAwYiwgMHgxNDQwMDBkYSwgMHhhZjQzMDBkMCwgMHg4ZjQyMDAwNCwgCisweDMwNDIwMDAyLCAweDE0NDAwMDk3LCAweGFmNDAwMGQwLCAweDhmNDIwMDA0LCAKKzB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsIDB4MzQ0MjAwMDIsIDB4YWY0MjAwMDQsIAorMHgyNDAyMDAwMSwgMHgxNDYyMDAwMywgMHgzYzAyMDYwMCwgMHgxMDAwMDAwMiwgCisweDM0NDIzMDAwLCAweDM0NDIxMDAwLCAweGFmYTIwMDIwLCAweDE4MjEsIAorMHg4ZjVlMDAxOCwgMHgyN2FhMDAyMCwgMHgyNDAyMDBmZiwgMHgxM2MyMDAwMiwgCisweGFmYWEwMDJjLCAweDI3YzMwMDAxLCAweDhjMDIwMjI4LCAweDYwOTAyMSwgCisweDE2NDIwMDBlLCAweDFlMzhjMCwgMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwgCisweGFmNDIwMzNjLCAweDhmNDIwMzNjLCAweDhjMDIwMjI4LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDYxMGMsIDB4M2MwNTAwMDksIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIAorMHg4ZmE2MDAyMCwgMHgxMDAwMDA2ZCwgMHgzNGE1MDUwMCwgMHhmNzEwMjEsIAorMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwgCisweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsIAorMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwgMHg5ODIxLCAweGUwODgyMSwgCisweDI2MzUwNGMwLCAweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAweDIyMDE4MjEsIAorMHgyNDBhMDAwNCwgMHhhZmFhMDAxMCwgMHhhZmIyMDAxNCwgMHg4ZjQ4MDAwYywgCisweDEwMjEsIDB4MmY1MzAyMSwgMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgCisweDI0MDcwMDA4LCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLCAKKzB4MTAwZjgwOSwgMHg4OTIwMjEsIDB4NTQ0MDAwMDYsIDB4MjQxMzAwMDEsIAorMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmU5LCAKKzB4MCwgMHgzMjYyMDBmZiwgMHg1NDQwMDAxNywgMHhhZjUyMDAxOCwgCisweDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LCAKKzB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjExOCwgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgCisweDhkNDYwMDAwLCAweDEwMDAwMDM1LCAweDM0YTUwNjAwLCAweDhmNDIwMzA4LCAKKzB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsIAorMHgxMDAwMDAxZSwgMHgzMjYyMDBmZiwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgCisweDI0NzAwM2U4LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTA0MDAwMTYsIAorMHg5ODIxLCAweDNjMTUwMDIwLCAweDI0MTEwMDEwLCAweDhmNDIwMDBjLCAKKzB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIDB4YWZiMTAwMTAsIAorMHhhZmIyMDAxNCwgMHg1NTEwMjUsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIAorMHgyNDA3MDAwOCwgMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTQ0MGZmZTMsIAorMHgwLCAweDhmODIwMDU0LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIAorMHgxNDQwZmZlZSwgMHgwLCAweDMyNjIwMGZmLCAweDE0NDAwMDExLCAKKzB4MCwgMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwgCisweDhmNDIwMzc4LCAweDhmODIwMTIwLCAweDhmYWEwMDJjLCAweGFmYTIwMDEwLCAKKzB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxMjAsIDB4M2MwNTAwMDksIAorMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwgMHgzNGE1MDcwMCwgMHhjMDAyYjNiLCAKKzB4M2MwMzgyMSwgMHg4ZjQyMDJlYywgMHgyNDQyMDAwMSwgMHhhZjQyMDJlYywgCisweDhmNDIwMmVjLCAweDhmNDIwMDA0LCAweDMwNDIwMDAxLCAweDEwNDAwMDE4LCAKKzB4MjQwNDAwMDEsIDB4OGY0MjAyNTAsIDB4OGY0MzAyNTQsIDB4OGY0NTAxYjQsIAorMHgzYzAxMDAwMSwgMHgxNDY1MDAwNiwgMHhhMDI0NmNmMSwgMHg4ZjQyMDI3MCwgCisweDhmNDMwMjc0LCAweDhmNDQwMWI4LCAweDEwNjQwMDIxLCAweDAsIAorMHg4ZjQyMDI1MCwgMHg4ZjQzMDI1NCwgMHgzYzA0MDAwMSwgMHg5MDg0NmNmMCwgCisweDhmNDYwMjcwLCAweDhmNDcwMjc0LCAweDM4ODQwMDAxLCAweGFmNDMwMWI0LCAKKzB4YWY0NzAxYjgsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMjUsIDB4YTAyNDZjZjAsIAorMHg4ZjQyMDBkNCwgMHgzYzAxMDAwMSwgMHhhMDIwNmNmMCwgMHgyNDQzMDAwMSwgCisweDI4NDIwMDMzLCAweDE0NDAwMDFlLCAweGFmNDMwMGQ0LCAweDNjMDIwMDAxLCAKKzB4OTA0MjZjZjEsIDB4YWY0MDAwZDQsIDB4MTAwMDAwMTcsIDB4Mzg0MjAwMDEsIAorMHg4ZjQyMDAwNCwgMHgzMDQyMDAwMSwgMHgxMDQwMDAwOCwgMHgwLCAKKzB4YzAwNTY1YSwgMHgyMDIxLCAweDNjMDEwMDAxLCAweGEwMjA2Y2YxLCAKKzB4M2MwMTAwMDEsIDB4MTAwMDAwMGUsIDB4YTAyMDZjZjAsIDB4OGY0MjAwZDQsIAorMHgzYzAxMDAwMSwgMHhhMDIwNmNmMCwgMHgyNDQzMDAwMSwgMHgyODQyMDFmNSwgCisweDE0NDAwMDA3LCAweGFmNDMwMGQ0LCAweDNjMDIwMDAxLCAweDkwNDI2Y2YxLCAKKzB4YWY0MDAwZDQsIDB4NDIxMDI2LCAweDNjMDEwMDAxLCAweGEwMjI2Y2YxLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsIDB4MjQwMjAwMDIsIDB4MTQ2MjAwMGMsIAorMHgzYzAzMDAwMiwgMHgzYzAzMDAwMSwgMHg5MDYzNmNmMSwgMHgyNDAyMDAwMSwgCisweDU0NjIwMDFmLCAweDIwMjEsIDB4M2MwMjAwMDEsIDB4OTA0MjZjZjAsIAorMHgxNDQzMDAxYiwgMHgyNDA0MDAwNSwgMHgxMDAwMDAxOSwgMHgyNDA0MDAwNiwgCisweDNjMDIwMDAyLCAweDhjNDI4ZmY0LCAweDQzMTAyNCwgMHgxMDQwMDAwYiwgCisweDI0MDIwMDAxLCAweDNjMDMwMDAxLCAweDkwNjM2Y2YxLCAweDU0NjIwMDEwLCAKKzB4MjAyMSwgMHgzYzAyMDAwMSwgMHg5MDQyNmNmMCwgMHgxNDQzMDAwYywgCisweDI0MDQwMDAzLCAweDEwMDAwMDBhLCAweDI0MDQwMDA0LCAweDNjMDMwMDAxLCAKKzB4OTA2MzZjZjEsIDB4MTQ2MjAwMDYsIDB4MjAyMSwgMHgzYzAyMDAwMSwgCisweDkwNDI2Y2YwLCAweDI0MDQwMDAxLCAweDUwNDQwMDAxLCAweDI0MDQwMDAyLCAKKzB4YzAwNTY1YSwgMHgwLCAweDI0MDJmZjdmLCAweDI4MmEwMjQsIAorMHg4ZmJmMDA0OCwgMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwgMHg4ZmIzMDAzYywgCisweDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLCAweDNlMDAwMDgsIAorMHgyN2JkMDA1MCwgMHgzZTAwMDA4LCAweDAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNmRhOCwgMHgyN2JkZmZiMCwgMHhhZmJmMDA0OCwgMHhhZmJlMDA0NCwgCisweGFmYjUwMDQwLCAweGFmYjMwMDNjLCAweGFmYjIwMDM4LCAweGFmYjEwMDM0LCAKKzB4MTA0MDAwZGUsIDB4YWZiMDAwMzAsIDB4OGY0MjAwZDAsIDB4M2MwNDAwMDEsIAorMHg4Yzg0NmQ5OCwgMHgyNDQzMDAwMSwgMHgyODQyMDAwYiwgMHhhZjQ0MDBlOCwgCisweDE0NDAwMGZlLCAweGFmNDMwMGQwLCAweDhmNDIwMDA0LCAweDMwNDIwMDAyLCAKKzB4MTQ0MDAwOTUsIDB4YWY0MDAwZDAsIDB4OGY0MjAwMDQsIDB4MzQ0MjAwMDIsIAorMHhhZjQyMDAwNCwgMHgyNDAyMDAwMSwgMHgxNDgyMDAwMywgMHgzYzAyMDYwMCwgCisweDEwMDAwMDAyLCAweDM0NDIzMDAwLCAweDM0NDIxMDAwLCAweGFmYTIwMDIwLCAKKzB4MTgyMSwgMHg4ZjVlMDAxOCwgMHgyN2FhMDAyMCwgMHgyNDAyMDBmZiwgCisweDEzYzIwMDAyLCAweGFmYWEwMDJjLCAweDI3YzMwMDAxLCAweDhjMDIwMjI4LCAKKzB4NjA5MDIxLCAweDE2NDIwMDBlLCAweDFlMzhjMCwgMHg4ZjQyMDMzYywgCisweDI0NDIwMDAxLCAweGFmNDIwMzNjLCAweDhmNDIwMzNjLCAweDhjMDIwMjI4LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDYxMGMsIDB4M2MwNTAwMDksIDB4YWZhMDAwMTQsIAorMHhhZmEyMDAxMCwgMHg4ZmE2MDAyMCwgMHgxMDAwMDA2ZCwgMHgzNGE1MDUwMCwgCisweGY3MTAyMSwgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwgCisweGFjNDQwNGM0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LCAKKzB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwgMHg5ODIxLCAKKzB4ZTA4ODIxLCAweDI2MzUwNGMwLCAweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAKKzB4MjIwMTgyMSwgMHgyNDBhMDAwNCwgMHhhZmFhMDAxMCwgMHhhZmIyMDAxNCwgCisweDhmNDgwMDBjLCAweDEwMjEsIDB4MmY1MzAyMSwgMHhhZmE4MDAxOCwgCisweDhmNDgwMTBjLCAweDI0MDcwMDA4LCAweGEzMjgyMSwgMHhhMzQ4MmIsIAorMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsIDB4NTQ0MDAwMDYsIAorMHgyNDEzMDAwMSwgMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAKKzB4MTQ0MGZmZTksIDB4MCwgMHgzMjYyMDBmZiwgMHg1NDQwMDAxNywgCisweGFmNTIwMDE4LCAweDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LCAKKzB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsIAorMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjExOCwgMHgzYzA1MDAwOSwgCisweGFmYTIwMDE0LCAweDhkNDYwMDAwLCAweDEwMDAwMDM1LCAweDM0YTUwNjAwLCAKKzB4OGY0MjAzMDgsIDB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIAorMHg4ZjQyMDMwOCwgMHgxMDAwMDAxZSwgMHgzMjYyMDBmZiwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIAorMHgxMDQwMDAxNiwgMHg5ODIxLCAweDNjMTUwMDIwLCAweDI0MTEwMDEwLCAKKzB4OGY0MjAwMGMsIDB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIAorMHhhZmIxMDAxMCwgMHhhZmIyMDAxNCwgMHg1NTEwMjUsIDB4YWZhMjAwMTgsIAorMHg4ZjQyMDEwYywgMHgyNDA3MDAwOCwgMHg0MGY4MDksIDB4MjRjNjAwMWMsIAorMHgxNDQwZmZlMywgMHgwLCAweDhmODIwMDU0LCAweDIwMjEwMjMsIAorMHgyYzQyMDNlOSwgMHgxNDQwZmZlZSwgMHgwLCAweDMyNjIwMGZmLCAKKzB4MTQ0MDAwMTEsIDB4MCwgMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwgCisweGFmNDIwMzc4LCAweDhmNDIwMzc4LCAweDhmODIwMTIwLCAweDhmYWEwMDJjLCAKKzB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxMjAsIAorMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwgMHgzNGE1MDcwMCwgCisweGMwMDJiM2IsIDB4M2MwMzgyMSwgMHg4ZjQyMDJlYywgMHgyNDQyMDAwMSwgCisweGFmNDIwMmVjLCAweDhmNDIwMmVjLCAweDhmNDIwMDA0LCAweDMwNDIwMDAxLCAKKzB4MTA0MDAwMzMsIDB4M2MwMjA0MDAsIDB4MmMyMTAyNCwgMHgxMDQwMDAxNywgCisweDAsIDB4OTM0MjA1YzAsIDB4OGY0NDAyNTAsIDB4OGY0NTAyNTQsIAorMHg4ZjQzMDFiNCwgMHgzNDQyMDAyMCwgMHgxNGEzMDAwNiwgMHhhMzQyMDVjMCwgCisweDhmNDIwMjcwLCAweDhmNDMwMjc0LCAweDhmNDQwMWI4LCAweDEwNjQwMDA4LCAKKzB4MCwgMHg4ZjQyMDI1MCwgMHg4ZjQzMDI1NCwgMHg5MzQ0MDVjMCwgCisweDhmNDYwMjcwLCAweDhmNDcwMjc0LCAweDEwMDAwMDE2LCAweDM4ODQwMDQwLCAKKzB4OTM0MjA1YzAsIDB4MTAwMDAwNDgsIDB4MzA0MjAwYmYsIDB4OTM0MjA1YzAsIAorMHg4ZjQ0MDI1MCwgMHg4ZjQ1MDI1NCwgMHg4ZjQzMDFiNCwgMHgzMDQyMDBiZiwgCisweDE0YTMwMDA2LCAweGEzNDIwNWMwLCAweDhmNDIwMjcwLCAweDhmNDMwMjc0LCAKKzB4OGY0NDAxYjgsIDB4MTA2NDAwMGIsIDB4MCwgMHg4ZjQyMDI1MCwgCisweDhmNDMwMjU0LCAweDkzNDQwNWMwLCAweDhmNDYwMjcwLCAweDhmNDcwMjc0LCAKKzB4Mzg4NDAwMjAsIDB4YWY0MzAxYjQsIDB4YWY0NzAxYjgsIDB4MTAwMDAwMzMsIAorMHhhMzQ0MDVjMCwgMHg5MzQyMDVjMCwgMHgxMDAwMDAyZiwgMHgzNDQyMDAyMCwgCisweDkzNDIwNWMwLCAweDhmNDMwMGQ0LCAweDM0NDIwMDIwLCAweGEzNDIwNWMwLCAKKzB4MjQ2MjAwMDEsIDB4MTAwMDAwMjMsIDB4Mjg2MzAwMzMsIDB4OGY0MjAwZTQsIAorMHg4ZjQzMDBlMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDBlNCwgMHg0MzEwMmEsIAorMHgxNDQwMDAwNiwgMHgyNDAzMDAwMSwgMHg4ZjQyMDBlOCwgMHgxNDQzMDAwMiwgCisweGFmNDAwMGU0LCAweDI0MDMwMDA0LCAweGFmNDMwMGU4LCAweDhmNDIwMDA0LCAKKzB4MzA0MjAwMDEsIDB4MTA0MDAwMGQsIDB4M2MwMjA0MDAsIDB4MmMyMTAyNCwgCisweDEwNDAwMDA3LCAweDAsIDB4OTM0MjA1YzAsIDB4MzQ0MjAwNDAsIAorMHhhMzQyMDVjMCwgMHg5MzQyMDVjMCwgMHgxMDAwMDAwZiwgMHgzMDQyMDBkZiwgCisweDkzNDIwNWMwLCAweDEwMDAwMDBjLCAweDM0NDIwMDYwLCAweDkzNDIwNWMwLCAKKzB4OGY0MzAwZDQsIDB4MzQ0MjAwMjAsIDB4YTM0MjA1YzAsIDB4MjQ2MjAwMDEsIAorMHgyODYzMDBmYiwgMHgxNDYwMDAwNSwgMHhhZjQyMDBkNCwgMHg5MzQyMDVjMCwgCisweGFmNDAwMGQ0LCAweDM4NDIwMDQwLCAweGEzNDIwNWMwLCAweDkzNDIwNWMwLCAKKzB4OGY0MzAwZTgsIDB4MzA0MjAwN2YsIDB4YTM0MjA1YzAsIDB4MjQwMjAwMDEsIAorMHgxNDYyMDAwNSwgMHgwLCAweDkzNDQwNWMwLCAweDQyMTAyLCAKKzB4MTAwMDAwMDMsIDB4MzQ4NDAwZjAsIDB4OTM0NDA1YzAsIDB4MzQ4NDAwMGYsIAorMHhjMDA1NjQwLCAweDAsIDB4MjQwMmZmN2YsIDB4MjgyYTAyNCwgCisweDhmYmYwMDQ4LCAweDhmYmUwMDQ0LCAweDhmYjUwMDQwLCAweDhmYjMwMDNjLCAKKzB4OGZiMjAwMzgsIDB4OGZiMTAwMzQsIDB4OGZiMDAwMzAsIDB4M2UwMDAwOCwgCisweDI3YmQwMDUwLCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZiMCwgCisweDI3NDQwMWMwLCAweDI2ZTMwMDI4LCAweDI0NjUwNDAwLCAweDY1MTAyYiwgCisweGFmYmYwMDQ4LCAweGFmYmUwMDQ0LCAweGFmYjUwMDQwLCAweGFmYjMwMDNjLCAKKzB4YWZiMjAwMzgsIDB4YWZiMTAwMzQsIDB4MTA0MDAwMDcsIDB4YWZiMDAwMzAsIAorMHg4YzgyMDAwMCwgMHhhYzYyMDAwMCwgMHgyNDYzMDAwNCwgMHg2NTEwMmIsIAorMHgxNDQwZmZmYiwgMHgyNDg0MDAwNCwgMHg4YzAyMDA4MCwgMHhhZWUyMDA0NCwgCisweDhjMDIwMGMwLCAweGFlZTIwMDQwLCAweDhjMDIwMDg0LCAweGFlZTIwMDMwLCAKKzB4OGMwMjAwODQsIDB4YWVlMjAyM2MsIDB4OGMwMjAwODgsIDB4YWVlMjAyNDAsIAorMHg4YzAyMDA4YywgMHhhZWUyMDI0NCwgMHg4YzAyMDA5MCwgMHhhZWUyMDI0OCwgCisweDhjMDIwMDk0LCAweGFlZTIwMjRjLCAweDhjMDIwMDk4LCAweGFlZTIwMjUwLCAKKzB4OGMwMjAwOWMsIDB4YWVlMjAyNTQsIDB4OGMwMjAwYTAsIDB4YWVlMjAyNTgsIAorMHg4YzAyMDBhNCwgMHhhZWUyMDI1YywgMHg4YzAyMDBhOCwgMHhhZWUyMDI2MCwgCisweDhjMDIwMGFjLCAweGFlZTIwMjY0LCAweDhjMDIwMGIwLCAweGFlZTIwMjY4LCAKKzB4OGMwMjAwYjQsIDB4YWVlMjAyNmMsIDB4OGMwMjAwYjgsIDB4YWVlMjAyNzAsIAorMHg4YzAyMDBiYywgMHgyNDA0MDAwMSwgMHhhZWUyMDI3NCwgMHhhZWUwMDAzNCwgCisweDQxMDgwLCAweDU3MTAyMSwgMHg4ZWUzMDAzNCwgMHg4YzQyMDIzYywgCisweDI0ODQwMDAxLCAweDYyMTgyMSwgMHgyYzgyMDAwZiwgMHhhZWUzMDAzNCwgCisweDE0NDBmZmY4LCAweDQxMDgwLCAweDhjMDIwMGNjLCAweGFlZTIwMDQ4LCAKKzB4OGMwMjAwZDAsIDB4YWVlMjAwNGMsIDB4OGMwMjAwZTAsIDB4YWVlMjAxZjgsIAorMHg4YzAyMDBlNCwgMHhhZWUyMDFmYywgMHg4YzAyMDBlOCwgMHhhZWUyMDIwMCwgCisweDhjMDIwMGVjLCAweGFlZTIwMjA0LCAweDhjMDIwMGYwLCAweGFlZTIwMjA4LCAKKzB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4OGMwMjAwZmMsIDB4NDUxMDJiLCAKKzB4MTA0MDAwMGIsIDB4MCwgMHg4ZWUyMDBjMCwgMHg4ZWUzMDBjNCwgCisweDI0MDQwMDAxLCAweDI0MDUwMDAwLCAweDY1MTgyMSwgMHg2NTMwMmIsIAorMHg0NDEwMjEsIDB4NDYxMDIxLCAweGFlZTIwMGMwLCAweGFlZTMwMGM0LCAKKzB4OGMwMjAwZmMsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4MjQwOGZmZmYsIAorMHgyNDA5MDAwMCwgMHg0MDE4MjEsIDB4MTAyMSwgMHg4ODIwMjQsIAorMHhhOTI4MjQsIDB4ODIyMDI1LCAweGEzMjgyNSwgMHhhZWU0MDBjMCwgCisweGFlZTUwMGM0LCAweDhlZTQwMGQwLCAweDhlZTUwMGQ0LCAweDhjMDIwMGY0LCAKKzB4NDUxMDJiLCAweDEwNDAwMDBiLCAweDAsIDB4OGVlMjAwZDAsIAorMHg4ZWUzMDBkNCwgMHgyNDA0MDAwMSwgMHgyNDA1MDAwMCwgMHg2NTE4MjEsIAorMHg2NTMwMmIsIDB4NDQxMDIxLCAweDQ2MTAyMSwgMHhhZWUyMDBkMCwgCisweGFlZTMwMGQ0LCAweDhjMDIwMGY0LCAweDhlZTQwMGQwLCAweDhlZTUwMGQ0LCAKKzB4NDAxODIxLCAweDEwMjEsIDB4ODgyMDI0LCAweGE5MjgyNCwgCisweDgyMjAyNSwgMHhhMzI4MjUsIDB4YWVlNDAwZDAsIDB4YWVlNTAwZDQsIAorMHg4ZWU0MDBjOCwgMHg4ZWU1MDBjYywgMHg4YzAyMDBmOCwgMHg0NTEwMmIsIAorMHgxMDQwMDAwYiwgMHgwLCAweDhlZTIwMGM4LCAweDhlZTMwMGNjLCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMDAsIDB4NjUxODIxLCAweDY1MzAyYiwgCisweDQ0MTAyMSwgMHg0NjEwMjEsIDB4YWVlMjAwYzgsIDB4YWVlMzAwY2MsIAorMHg4YzAyMDBmOCwgMHg4ZWU0MDBjOCwgMHg4ZWU1MDBjYywgMHg0MDE4MjEsIAorMHgxMDIxLCAweDg4MjAyNCwgMHhhOTI4MjQsIDB4ODIyMDI1LCAKKzB4YTMyODI1LCAweDI0MDIwMDA4LCAweGFlZTQwMGM4LCAweGFlZTUwMGNjLCAKKzB4YWZhMjAwMTAsIDB4YWZhMDAwMTQsIDB4OGY0MjAwMGMsIDB4OGMwNDAyMDgsIAorMHg4YzA1MDIwYywgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHgyNmU2MDAyOCwgCisweDQwZjgwOSwgMHgyNDA3MDQwMCwgMHgxMDQwMDBmMCwgMHgzYzAyMDQwMCwgCisweGFmYTIwMDIwLCAweDkzNDIwNWM2LCAweDEwNDAwMDg5LCAweDE4MjEsIAorMHg4ZjVlMDAxOCwgMHgyN2FhMDAyMCwgMHgyNDAyMDBmZiwgMHgxM2MyMDAwMiwgCisweGFmYWEwMDJjLCAweDI3YzMwMDAxLCAweDhjMDIwMjI4LCAweDYwOTAyMSwgCisweDE2NDIwMDBlLCAweDFlMzhjMCwgMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwgCisweGFmNDIwMzNjLCAweDhmNDIwMzNjLCAweDhjMDIwMjI4LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDYxMGMsIDB4M2MwNTAwMDksIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIAorMHg4ZmE2MDAyMCwgMHgxMDAwMDA2YiwgMHgzNGE1MDUwMCwgMHhmNzEwMjEsIAorMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwgCisweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsIAorMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwgMHg5ODIxLCAweGUwODgyMSwgCisweDI2MzUwNGMwLCAweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAweDIyMDE4MjEsIAorMHgyNDBhMDAwNCwgMHhhZmFhMDAxMCwgMHhhZmIyMDAxNCwgMHg4ZjQ4MDAwYywgCisweDEwMjEsIDB4MmY1MzAyMSwgMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgCisweDI0MDcwMDA4LCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLCAKKzB4MTAwZjgwOSwgMHg4OTIwMjEsIDB4NTQ0MDAwMDYsIDB4MjQxMzAwMDEsIAorMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmU5LCAKKzB4MCwgMHgzMjYyMDBmZiwgMHg1NDQwMDAxNywgMHhhZjUyMDAxOCwgCisweDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LCAKKzB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjExOCwgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgCisweDhkNDYwMDAwLCAweDEwMDAwMDMzLCAweDM0YTUwNjAwLCAweDhmNDIwMzA4LCAKKzB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsIAorMHgxMDAwMDAxYywgMHgzMjYyMDBmZiwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgCisweDI0NzAwM2U4LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTA0MDAwMTQsIAorMHg5ODIxLCAweDI0MTEwMDEwLCAweDhmNDIwMDBjLCAweDhmNDQwMTYwLCAKKzB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIDB4YWZiMTAwMTAsIDB4YWZiMjAwMTQsIAorMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHgyNDA3MDAwOCwgMHg0MGY4MDksIAorMHgyNGM2MDAxYywgMHgxNDQwZmZlNSwgMHgwLCAweDhmODIwMDU0LCAKKzB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxNDQwZmZlZiwgMHgwLCAKKzB4MzI2MjAwZmYsIDB4NTQ0MDAwMTIsIDB4MjQwMjAwMDEsIDB4OGY0MjAzNzgsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwgCisweDhmYWEwMDJjLCAweGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDYxMjAsIDB4M2MwNTAwMDksIDB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsIAorMHgzNGE1MDcwMCwgMHhjMDAyYjNiLCAweDNjMDM4MjEsIDB4MTAyMSwgCisweDE0NDAwMDViLCAweDI0MDIwMDAxLCAweDEwMDAwMDY1LCAweDAsIAorMHg4ZjUxMDAxOCwgMHgyNDAyMDBmZiwgMHgxMjIyMDAwMiwgMHg4MDIxLCAKKzB4MjYzMDAwMDEsIDB4OGMwMjAyMjgsIDB4MTYwMjAwMGUsIDB4MTEzMGMwLCAKKzB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIAorMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjBmNCwgMHgzYzA1MDAwOSwgCisweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmYTYwMDIwLCAweDEwMDAwMDNmLCAKKzB4MzRhNTAxMDAsIDB4ZDcxMDIxLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAKKzB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsIDB4YzAxODIxLCAweDhmNDQwMTc4LCAKKzB4OGY0NTAxN2MsIDB4MTAyMSwgMHgyNDA3MDAwNCwgMHhhZmE3MDAxMCwgCisweGFmYjAwMDE0LCAweDhmNDgwMDBjLCAweDI0YzYwNGMwLCAweDJlNjMwMjEsIAorMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgyNDA3MDAwOCwgMHhhMzI4MjEsIAorMHhhMzQ4MmIsIDB4ODIyMDIxLCAweDEwMGY4MDksIDB4ODkyMDIxLCAKKzB4MTQ0MDAwMGIsIDB4MjQwNzAwMDgsIDB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsIAorMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjBmYywgMHgzYzA1MDAwOSwgCisweGFmYTIwMDE0LCAweDhmYTYwMDIwLCAweDEwMDAwMDFjLCAweDM0YTUwMjAwLCAKKzB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY0MzAwMGMsIDB4YWY1MDAwMTgsIAorMHg4Zjg2MDEyMCwgMHgyNDAyMDAxMCwgMHhhZmEyMDAxMCwgMHhhZmIwMDAxNCwgCisweGFmYTMwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywgCisweDU0NDAwMDExLCAweDI0MDIwMDAxLCAweDhmNDIwMzQwLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzNDAsIDB4OGY0MjAzNDAsIDB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsIAorMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjEwNCwgMHgzYzA1MDAwOSwgCisweGFmYTIwMDE0LCAweDhmYTYwMDIwLCAweDM0YTUwMzAwLCAweGMwMDJiM2IsIAorMHgyMjAzODIxLCAweDEwMjEsIDB4MTA0MDAwMGQsIDB4MjQwMjAwMDEsIAorMHg4ZjQyMDJlOCwgMHhhMzQwMDVjNiwgMHhhZjQwMDFiMCwgMHgyNDQyMDAwMSwgCisweGFmNDIwMmU4LCAweDhmNDIwMmU4LCAweDhlZTIwMTUwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxNTAsIDB4MTAwMDAwMDMsIDB4OGVlMjAxNTAsIDB4MjQwMjAwMDEsIAorMHhhMzQyMDVjNiwgMHg4ZmJmMDA0OCwgMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwgCisweDhmYjMwMDNjLCAweDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLCAKKzB4M2UwMDAwOCwgMHgyN2JkMDA1MCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyMCwgCisweDhmODIwMGIwLCAweDMwNDIwMDA0LCAweDEwNDAwMDY4LCAweDAsIAorMHg4ZjQzMDEyOCwgMHg4ZjgyMDEwNCwgMHgxNDYyMDAwNSwgMHgwLCAKKzB4OGY0MzAxMzAsIDB4OGY4MjAwYjQsIDB4MTA2MjAwMDYsIDB4MCwgCisweDhmODIwMTA0LCAweGFmNDIwMTI4LCAweDhmODIwMGI0LCAweDEwMDAwMDViLCAKKzB4YWY0MjAxMzAsIDB4OGY4MjAwYjAsIDB4M2MwMzAwODAsIDB4NDMxMDI0LCAKKzB4MTA0MDAwMGQsIDB4MCwgMHg4ZjgyMDExYywgMHgzNDQyMDAwMiwgCisweGFmODIwMTFjLCAweDhmODIwMGIwLCAweDI0MDNmZmZiLCAweDQzMTAyNCwgCisweGFmODIwMGIwLCAweDhmODIwMTFjLCAweDI0MDNmZmZkLCAweDQzMTAyNCwgCisweDEwMDAwMDRhLCAweGFmODIwMTFjLCAweDhmNDMwMTI4LCAweDhmODIwMTA0LCAKKzB4MTQ2MjAwMDUsIDB4MCwgMHg4ZjQzMDEzMCwgMHg4ZjgyMDBiNCwgCisweDEwNjIwMDEwLCAweDAsIDB4OGY4MjAxMDQsIDB4YWY0MjAxMjgsIAorMHg4ZjgyMDBiNCwgMHg4ZjQzMDEyOCwgMHhhZjQyMDEzMCwgMHhhZmEzMDAxMCwgCisweDhmNDIwMTMwLCAweDNjMDQwMDAxLCAweDI0ODQ2MTQ0LCAweGFmYTIwMDE0LCAKKzB4OGY4NjAxMWMsIDB4OGY4NzAwYjAsIDB4M2MwNTAwMDUsIDB4MTAwMDAwMzEsIAorMHgzNGE1MDkwMCwgMHg4ZjQyMDEyOCwgMHhhZmEyMDAxMCwgMHg4ZjQyMDEzMCwgCisweDNjMDQwMDAxLCAweDI0ODQ2MTUwLCAweGFmYTIwMDE0LCAweDhmODYwMTFjLCAKKzB4OGY4NzAwYjAsIDB4M2MwNTAwMDUsIDB4YzAwMmIzYiwgMHgzNGE1MTAwMCwgCisweDhmODIwMTFjLCAweDM0NDIwMDAyLCAweGFmODIwMTFjLCAweDhmODMwMTA0LCAKKzB4OGY4MjAwYjAsIDB4MzQ0MjAwMDEsIDB4YWY4MjAwYjAsIDB4MjQwMjAwMDgsIAorMHhhZjgzMDEwNCwgMHhhZmEyMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZjQyMDAwYywgCisweDhjMDQwMjA4LCAweDhjMDUwMjBjLCAweGFmYTIwMDE4LCAweDhmNDIwMTBjLCAKKzB4MjZlNjAwMjgsIDB4NDBmODA5LCAweDI0MDcwNDAwLCAweDhmODIwMTFjLCAKKzB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweGFmODIwMTFjLCAweDhlZTIwMWRjLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxZGMsIDB4OGVlMjAxZGMsIDB4OGY0MjAxMjgsIAorMHhhZmEyMDAxMCwgMHg4ZjQyMDEzMCwgMHgzYzA0MDAwMSwgMHgyNDg0NjE1YywgCisweGFmYTIwMDE0LCAweDhmODYwMTFjLCAweDhmODcwMGIwLCAweDNjMDUwMDA1LCAKKzB4MzRhNTExMDAsIDB4YzAwMmIzYiwgMHgwLCAweDhmODIwMGEwLCAKKzB4MzA0MjAwMDQsIDB4MTA0MDAwNjksIDB4MCwgMHg4ZjQzMDEyYywgCisweDhmODIwMTI0LCAweDE0NjIwMDA1LCAweDAsIDB4OGY0MzAxMzQsIAorMHg4ZjgyMDBhNCwgMHgxMDYyMDAwNiwgMHgwLCAweDhmODIwMTI0LCAKKzB4YWY0MjAxMmMsIDB4OGY4MjAwYTQsIDB4MTAwMDAwNWMsIDB4YWY0MjAxMzQsIAorMHg4ZjgyMDBhMCwgMHgzYzAzMDA4MCwgMHg0MzEwMjQsIDB4MTA0MDAwMGQsIAorMHgwLCAweDhmODIwMTFjLCAweDM0NDIwMDAyLCAweGFmODIwMTFjLCAKKzB4OGY4MjAwYTAsIDB4MjQwM2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMGEwLCAKKzB4OGY4MjAxMWMsIDB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweDEwMDAwMDRiLCAKKzB4YWY4MjAxMWMsIDB4OGY0MzAxMmMsIDB4OGY4MjAxMjQsIDB4MTQ2MjAwMDUsIAorMHgwLCAweDhmNDMwMTM0LCAweDhmODIwMGE0LCAweDEwNjIwMDEwLCAKKzB4MCwgMHg4ZjgyMDEyNCwgMHhhZjQyMDEyYywgMHg4ZjgyMDBhNCwgCisweDhmNDMwMTJjLCAweGFmNDIwMTM0LCAweGFmYTMwMDEwLCAweDhmNDIwMTM0LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDYxNjgsIDB4YWZhMjAwMTQsIDB4OGY4NjAxMWMsIAorMHg4Zjg3MDBhMCwgMHgzYzA1MDAwNSwgMHgxMDAwMDAzMiwgMHgzNGE1MTIwMCwgCisweDhmNDIwMTJjLCAweGFmYTIwMDEwLCAweDhmNDIwMTM0LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDYxNzQsIDB4YWZhMjAwMTQsIDB4OGY4NjAxMWMsIDB4OGY4NzAwYTAsIAorMHgzYzA1MDAwNSwgMHhjMDAyYjNiLCAweDM0YTUxMzAwLCAweDhmODIwMTFjLCAKKzB4MzQ0MjAwMDIsIDB4YWY4MjAxMWMsIDB4OGY4MzAxMjQsIDB4OGY4MjAwYTAsIAorMHgzNDQyMDAwMSwgMHhhZjgyMDBhMCwgMHgyNDAyMDA4MCwgMHhhZjgzMDEyNCwgCisweGFmYTIwMDEwLCAweGFmYTAwMDE0LCAweDhmNDIwMDE0LCAweDhjMDQwMjA4LCAKKzB4OGMwNTAyMGMsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMDgsIDB4M2MwNjAwMDEsIAorMHgyNGM2NmVkOCwgMHg0MGY4MDksIDB4MjQwNzAwMDQsIDB4OGY4MjAxMWMsIAorMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAxMWMsIDB4OGVlMjAxZGMsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFkYywgMHg4ZWUyMDFkYywgMHg4ZjQyMDEyYywgCisweGFmYTIwMDEwLCAweDhmNDIwMTM0LCAweDNjMDQwMDAxLCAweDI0ODQ2MTgwLCAKKzB4YWZhMjAwMTQsIDB4OGY4NjAxMWMsIDB4OGY4NzAwYTAsIDB4M2MwNTAwMDUsIAorMHgzNGE1MTQwMCwgMHhjMDAyYjNiLCAweDAsIDB4OGZiZjAwMjAsIAorMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDNjMDgxMDAwLCAweDI0MDcwMDAxLCAKKzB4M2MwNjAwODAsIDB4M2MwNTAxMDAsIDB4OGY4MjAwNzAsIDB4NDgxMDI0LCAKKzB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA1NCwgMHgyNDQyMDAwNSwgCisweGFmODIwMDc4LCAweDhjMDQwMjM0LCAweDEwODAwMDE2LCAweDE4MjEsIAorMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjQwZTgsIDB4MjQ0MjAwMDUsIAorMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjQwZTgsIDB4M2MwMjAwMDEsIAorMHg1NzEwMjEsIDB4OGM0MjQwZTgsIDB4NDQxMDJiLCAweDE0NDAwMDA5LCAKKzB4MCwgMHgzYzAzMDA4MCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhYzIwNDBlOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4MTAwMDAwMGIsIAorMHhhMDI3NDBmMCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjQwZjAsIAorMHg1NDQwMDAwNiwgMHg2NjE4MjUsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAKKzB4OTA0MjQwZjEsIDB4NTQ0MDAwMDEsIDB4NjYxODI1LCAweDhjMDQwMjMwLCAKKzB4MTA4MDAwMTMsIDB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg4YzQyNDBlYywgMHgyNDQyMDAwNSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhYzIyNDBlYywgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjQwZWMsIAorMHg0NDEwMmIsIDB4MTQ0MDAwMDYsIDB4MCwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhYzIwNDBlYywgMHgxMDAwMDAwNiwgMHg2NTE4MjUsIAorMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjQwZjIsIDB4NTQ0MDAwMDEsIAorMHg2NTE4MjUsIDB4MTA2MGZmYmMsIDB4MCwgMHg4ZjQyMDAwMCwgCisweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIAorMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsIAorMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAKKzB4OGY4MjAwNjAsIDB4NDMxMDI1LCAweGFmODIwMDYwLCAweDhmNDIwMDAwLCAKKzB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwZmZhNywgMHhhZjgwMDA0YywgCisweDEwMDBmZmE1LCAweGFmODAwMDQ4LCAweDNlMDAwMDgsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDI3YmRmZmUwLCAKKzB4YWZiZjAwMTgsIDB4OGY4NjAwNjQsIDB4MzBjMjAwMDQsIDB4MTA0MDAwMjUsIAorMHgyNDA0MDAwNCwgMHg4YzAyMDExNCwgMHhhZjQyMDAyMCwgMHhhZjg0MDA2NCwgCisweDhmNDIwMmZjLCAweDI0NDIwMDAxLCAweGFmNDIwMmZjLCAweDhmNDIwMmZjLCAKKzB4OGY4MjAwNjQsIDB4MzA0MjAwMDQsIDB4MTQ0MDAwMDUsIDB4MCwgCisweDhjMDMwMTE0LCAweDhmNDIwMDIwLCAweDE0NjJmZmYyLCAweDAsIAorMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywgMHg4ZjQzMDAzYywgMHhhZjgwMDA0YywgCisweDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsIAorMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLCAKKzB4MCwgMHg4ZjgyMDA2MCwgMHg0MzEwMjUsIDB4YWY4MjAwNjAsIAorMHg4ZjQyMDAwMCwgMHgxMDQwMDA3MywgMHgwLCAweDEwMDAwMDZmLCAKKzB4MCwgMHgzMGMyMDAwOCwgMHgxMDQwMDAyMCwgMHgyNDA0MDAwOCwgCisweDhjMDIwMTFjLCAweGFmNDIwMDQ4LCAweGFmODQwMDY0LCAweDhmNDIwMmE4LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAyYTgsIDB4OGY0MjAyYTgsIDB4OGY4MjAwNjQsIAorMHgzMDQyMDAwOCwgMHgxNDQwMDAwNSwgMHgwLCAweDhjMDMwMTFjLCAKKzB4OGY0MjAwNDgsIDB4MTQ2MmZmZjIsIDB4MCwgMHg4ZjQyMDAwMCwgCisweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIAorMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsIAorMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAKKzB4OGY4MjAwNjAsIDB4MTAwMGZmZDksIDB4MzQ0MjAyMDAsIDB4MzBjMjAwMjAsIAorMHgxMDQwMDAyMywgMHgyNDA0MDAyMCwgMHg4YzAyMDEyYywgMHhhZjQyMDA2OCwgCisweGFmODQwMDY0LCAweDhmNDIwMmQ4LCAweDI0NDIwMDAxLCAweGFmNDIwMmQ4LCAKKzB4OGY0MjAyZDgsIDB4OGY4MjAwNjQsIDB4MzA0MjAwMjAsIDB4MTQ0MDAwMDUsIAorMHgzMmMyNDAwMCwgMHg4YzAzMDEyYywgMHg4ZjQyMDA2OCwgMHgxNDYyZmZmMiwgCisweDMyYzI0MDAwLCAweDE0NDAwMDAyLCAweDNjMDIwMDAxLCAweDJjMmIwMjUsIAorMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywgMHgwLCAweGFmODAwMDRjLCAKKzB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsIDB4MCwgMHgxMDAwMDAwNSwgCisweDAsIDB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsIAorMHgwLCAweDhmODIwMDYwLCAweDEwMDBmZmI0LCAweDM0NDIwODAwLCAKKzB4MzBjMjAwMTAsIDB4MTA0MDAwMjksIDB4MjQwNDAwMTAsIDB4OGMwMjAxMjQsIAorMHhhZjQyMDA1OCwgMHhhZjg0MDA2NCwgMHg4ZjQyMDJkNCwgMHgyNDQyMDAwMSwgCisweGFmNDIwMmQ0LCAweDhmNDIwMmQ0LCAweDhmODIwMDY0LCAweDMwNDIwMDEwLCAKKzB4MTQ0MDAwMDUsIDB4MzJjMjIwMDAsIDB4OGMwMzAxMjQsIDB4OGY0MjAwNTgsIAorMHgxNDYyZmZmMiwgMHgzMmMyMjAwMCwgMHg1MDQwMDAwMSwgMHgzNmQ2ODAwMCwgCisweDhmNDIwMDAwLCAweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsIAorMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAKKzB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgCisweDAsIDB4OGY4MjAwNjAsIDB4MzQ0MjAxMDAsIDB4YWY4MjAwNjAsIAorMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDZjLCAKKzB4YWY4MDAwNGMsIDB4MTAwMDAwNmEsIDB4YWY4MDAwNDgsIDB4MzBjMjAwMDEsIAorMHgxMDQwMDAwNCwgMHgyNDAyMDAwMSwgMHhhZjgyMDA2NCwgMHgxMDAwMDA2NCwgCisweDAsIDB4MzBjMjAwMDIsIDB4MTQ0MDAwMGIsIDB4M2MwNTAwMDMsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjI0NCwgMHgzNGE1MDUwMCwgMHgzODIxLCAKKzB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgyNDAyZmZjMCwgCisweDEwMDAwMDU3LCAweGFmODIwMDY0LCAweDhjMDUwMjJjLCAweDhjMDIwMTBjLCAKKzB4MTBhMjAwNDgsIDB4NTEwODAsIDB4OGM0NjAzMDAsIDB4MjRhMjAwMDEsIAorMHgzMDQ1MDAzZiwgMHgyNDAyMDAwMywgMHhhYzA1MDIyYywgMHg2MWUwMiwgCisweDEwNjIwMDA1LCAweDI0MDIwMDEwLCAweDEwNjIwMDFkLCAweDMwYzIwZmZmLCAKKzB4MTAwMDAwMzksIDB4MCwgMHg4ZjQzMDJhOCwgMHg4ZjQ0MDAwMCwgCisweDMwYzIwZmZmLCAweGFmNDIwMDQ4LCAweDI0NjMwMDAxLCAweGFmNDMwMmE4LCAKKzB4MTA4MDAwMDcsIDB4OGY0MjAyYTgsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIAorMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsIAorMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAKKzB4OGY4MjAwNjAsIDB4MzQ0MjAyMDAsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsIAorMHgxMDQwMDAxZiwgMHgwLCAweDEwMDAwMDFiLCAweDAsIAorMHhhZjQyMDA1OCwgMHgzMmMyMjAwMCwgMHg1MDQwMDAwMSwgMHgzNmQ2ODAwMCwgCisweDhmNDIwMmQ0LCAweDhmNDMwMDAwLCAweDI0NDIwMDAxLCAweGFmNDIwMmQ0LCAKKzB4MTA2MDAwMDcsIDB4OGY0MjAyZDQsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIAorMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsIAorMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAKKzB4OGY4MjAwNjAsIDB4MzQ0MjAxMDAsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsIAorMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDA2LCAweGFmODAwMDRjLCAKKzB4MTAwMDAwMDQsIDB4YWY4MDAwNDgsIDB4YzAwMjE5NiwgMHhjMDIwMjEsIAorMHg0MDI4MjEsIDB4OGMwMjAxMGMsIDB4MTRhMjAwMDIsIDB4MjQwMjAwMDIsIAorMHhhZjgyMDA2NCwgMHg4ZjgyMDA2NCwgMHgzMDQyMDAwMiwgMHgxNDQwMDAwNCwgCisweDAsIDB4OGMwMjAxMGMsIDB4MTRhMmZmYWMsIDB4MCwgCisweDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4M2UwMDAwOCwgCisweDAsIDB4MjdiZGZmYTAsIDB4YWZiMDAwNDAsIDB4ODA4MDIxLCAKKzB4MTAxNjAyLCAweDI0NDJmZmZmLCAweDMwNDMwMGZmLCAweDJjNjIwMDEzLCAKKzB4YWZiZjAwNTgsIDB4YWZiZTAwNTQsIDB4YWZiNTAwNTAsIDB4YWZiMzAwNGMsIAorMHhhZmIyMDA0OCwgMHhhZmIxMDA0NCwgMHgxMDQwMDFmMywgMHhhZmE1MDAzNCwgCisweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNjI4OCwgCisweDQwMDAwOCwgMHgwLCAweDEwMTMwMiwgMHgzMDQ0MGZmZiwgCisweDI0MDIwMDAxLCAweDEwODIwMDA1LCAweDI0MDIwMDAyLCAweDEwODIwMDBjLCAKKzB4MjQwMmZmZmUsIDB4MTAwMDAwMjQsIDB4M2MwNTAwMDMsIDB4OGY0MzAwMDQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmYwNCwgMHhhZjQ0MDIwMCwgMHhhZjQ0MDIwNCwgCisweDNjMDQwMDAxLCAweDhjODQ2ZTgwLCAweDEwMDAwMDA5LCAweDM0NjMwMDAxLCAKKzB4OGY0MzAwMDQsIDB4YWY0NDAyMDAsIDB4YWY0NDAyMDQsIDB4M2MwNDAwMDEsIAorMHg4Yzg0NmU4MCwgMHg2MjE4MjQsIDB4M2MwMjAwMDEsIDB4MjQ0MmNhMjgsIAorMHgyMTEwMCwgMHgyMTE4MiwgMHhhZjQzMDAwNCwgMHgzYzAzMDgwMCwgCisweDQzMTAyNSwgMHhhYzgyMDAzOCwgMHg4Zjg0MDA1NCwgMHg0MTQ0MiwgCisweDQxYzgyLCAweDQzMTAyMSwgMHg0MWNjMiwgMHg0MzEwMjMsIAorMHg0MWQwMiwgMHg0MzEwMjEsIDB4NDFkNDIsIDB4NDMxMDIzLCAKKzB4MTAwMDAwMDksIDB4YWY0MjAyMDgsIDB4M2MwNDAwMDEsIDB4MjQ4NDYyNTAsIAorMHgzNGE1MTAwMCwgMHgyMDAzMDIxLCAweDM4MjEsIDB4YWZhMDAwMTAsIAorMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmNDIwMmEwLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAyYTAsIDB4MTAwMDAyMWYsIDB4OGY0MjAyYTAsIDB4MjdiMDAwMjgsIAorMHgyMDAyMDIxLCAweDI0MDUwMjEwLCAweGMwMDJiYmYsIDB4MjQwNjAwMDgsIAorMHhjMDAyNTE4LCAweDIwMDIwMjEsIDB4MTAwMDAyMTYsIDB4MCwgCisweDhmYWEwMDM0LCAweDI3YTQwMDI4LCAweGExODgwLCAweDI1NDIwMDAxLCAKKzB4MzA0MjAwM2YsIDB4YWZhMjAwMzQsIDB4OGM2NTAzMDAsIDB4OGZhYTAwMzQsIAorMHgyMTA4MCwgMHg4YzQzMDMwMCwgMHgyNTQyMDAwMSwgMHgzMDQyMDAzZiwgCisweGFmYTIwMDM0LCAweGFjMDIwMjJjLCAweGFmYTUwMDI4LCAweGMwMDI1MTgsIAorMHhhZmEzMDAyYywgMHgxMDAwMDIwMywgMHgwLCAweDI3YjAwMDI4LCAKKzB4MjAwMjAyMSwgMHgyNDA1MDIxMCwgMHhjMDAyYmJmLCAweDI0MDYwMDA4LCAKKzB4YzAwMjY1NywgMHgyMDAyMDIxLCAweDEwMDAwMWZhLCAweDAsIAorMHg4ZmFhMDAzNCwgMHgyN2E0MDAyOCwgMHhhMTg4MCwgMHgyNTQyMDAwMSwgCisweDMwNDIwMDNmLCAweGFmYTIwMDM0LCAweDhjNjUwMzAwLCAweDhmYWEwMDM0LCAKKzB4MjEwODAsIDB4OGM0MzAzMDAsIDB4MjU0MjAwMDEsIDB4MzA0MjAwM2YsIAorMHhhZmEyMDAzNCwgMHhhYzAyMDIyYywgMHhhZmE1MDAyOCwgMHhjMDAyNjU3LCAKKzB4YWZhMzAwMmMsIDB4MTAwMDAxZTcsIDB4MCwgMHgxMDEzMDIsIAorMHgzMDQzMGZmZiwgMHgyNDAyMDAwMSwgMHgxMDYyMDAwNSwgMHgyNDAyMDAwMiwgCisweDEwNjIwMDFlLCAweDNjMDIwMDAyLCAweDEwMDAwMDMzLCAweDNjMDUwMDAzLCAKKzB4M2MwMzAwMDIsIDB4MmMzMTAyNCwgMHg1NDQwMDAzNywgMHgyYzNiMDI1LCAKKzB4OGY4MjAyMjgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjIzOGQ4LCAKKzB4OGY4MjAyMmMsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjIzOGRjLCAKKzB4OGY4MjAyMzAsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjIzOGUwLCAKKzB4OGY4MjAyMzQsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjIzOGU0LCAKKzB4MjQwMmZmZmYsIDB4YWY4MjAyMjgsIDB4YWY4MjAyMmMsIDB4YWY4MjAyMzAsIAorMHhhZjgyMDIzNCwgMHgxMDAwMDAyMCwgMHgyYzNiMDI1LCAweDJjMjEwMjQsIAorMHgxMDQwMDAxMiwgMHgzYzAyZmZmZCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg4YzQyMzhkOCwgMHhhZjgyMDIyOCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg4YzQyMzhkYywgMHhhZjgyMDIyYywgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg4YzQyMzhlMCwgMHhhZjgyMDIzMCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg4YzQyMzhlNCwgMHhhZjgyMDIzNCwgMHgzYzAyZmZmZCwgMHgzNDQyZmZmZiwgCisweDEwMDAwMDA5LCAweDJjMmIwMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYyNWMsIAorMHgzNGE1MTEwMCwgMHgyMDAzMDIxLCAweDM4MjEsIDB4YWZhMDAwMTAsIAorMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmNDIwMmNjLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAyY2MsIDB4MTAwMDAxOWYsIDB4OGY0MjAyY2MsIDB4MTAxMzAyLCAKKzB4MzA0NTBmZmYsIDB4MjQwMjAwMDEsIDB4MTBhMjAwMDUsIDB4MjQwMjAwMDIsIAorMHgxMGEyMDAwZCwgMHgzYzA0MDhmZiwgMHgxMDAwMDAxNCwgMHgzYzA1MDAwMywgCisweDNjMDIwOGZmLCAweDM0NDJmZmZmLCAweDhmODMwMjIwLCAweDNjMDQwMDA0LCAKKzB4MmM0YjAyNSwgMHg2MjE4MjQsIDB4MzQ2MzAwMDgsIDB4YWY4MzAyMjAsIAorMHgxMDAwMDAxMiwgMHhhZjQ1MDI5OCwgMHgzNDg0ZmZmNywgMHgzYzAzZmZmYiwgCisweDhmODIwMjIwLCAweDM0NjNmZmZmLCAweDJjM2IwMjQsIDB4NDQxMDI0LCAKKzB4YWY4MjAyMjAsIDB4MTAwMDAwMDksIDB4YWY0NTAyOTgsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjI2OCwgMHgzNGE1MTIwMCwgMHgyMDAzMDIxLCAweDM4MjEsIAorMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmNDIwMmJjLCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAyYmMsIDB4MTAwMDAxNzYsIDB4OGY0MjAyYmMsIAorMHgyNzg0MDIwOCwgMHgyNDA1MDIwMCwgMHhjMDAyYmJmLCAweDI0MDYwMDA4LCAKKzB4Mjc0NDAyMjQsIDB4MjQwNTAyMDAsIDB4YzAwMmJiZiwgMHgyNDA2MDAwOCwgCisweDhmNDIwMmM0LCAweDI0NDIwMDAxLCAweGFmNDIwMmM0LCAweDEwMDAwMTY5LCAKKzB4OGY0MjAyYzQsIDB4MTAxMzAyLCAweDMwNDMwZmZmLCAweDI0MDIwMDAxLCAKKzB4MTA2MjAwMTEsIDB4Mjg2MjAwMDIsIDB4NTA0MDAwMDUsIDB4MjQwMjAwMDIsIAorMHgxMDYwMDAwNywgMHgwLCAweDEwMDAwMDE3LCAweDAsIAorMHgxMDYyMDAwZiwgMHgwLCAweDEwMDAwMDEzLCAweDAsIAorMHg4YzA2MDI0OCwgMHgyMDIxLCAweGMwMDUxMDQsIDB4MjQwNTAwMDQsIAorMHgxMDAwMDAwNywgMHgwLCAweDhjMDYwMjQ4LCAweDIwMjEsIAorMHhjMDA1MTA0LCAweDI0MDUwMDA0LCAweDEwMDAwMDEwLCAweDAsIAorMHg4YzA2MDI0YywgMHgyMDIxLCAweGMwMDUxMDQsIDB4MjQwNTAwMDEsIAorMHgxMDAwMDAwYSwgMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ2Mjc0LCAKKzB4M2MwNTAwMDMsIDB4MzRhNTEzMDAsIDB4MjAwMzAyMSwgMHgzODIxLCAKKzB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHg4ZjQyMDJjMCwgCisweDI0NDIwMDAxLCAweGFmNDIwMmMwLCAweDEwMDAwMTNhLCAweDhmNDIwMmMwLCAKKzB4YzAwMjQyNiwgMHgwLCAweDEwMDAwMTM2LCAweDAsIAorMHgyNDAyMDAwMSwgMHhhMzQyMDVjNSwgMHgyNDEwMDEwMCwgMHg4ZjQ0MDFhOCwgCisweDhmNDUwMWFjLCAweGFmYjAwMDEwLCAweGFmYTAwMDE0LCAweDhmNDIwMDE0LCAKKzB4YWZhMjAwMTgsIDB4OGY0MjAxMDgsIDB4MjZlNjAwMjgsIDB4NDBmODA5LCAKKzB4MjQwNzA0MDAsIDB4MTA0MGZmZjUsIDB4MCwgMHgxMDAwMDEyNSwgCisweDAsIDB4M2MwM2ZmZmYsIDB4MzQ2MzdmZmYsIDB4OGY0MjAzNjgsIAorMHg4ZjQ0MDM2MCwgMHgyYzNiMDI0LCAweDE4MjEsIDB4YWY0MDAwNTgsIAorMHhhZjQwMDA1YywgMHhhZjQwMDA2MCwgMHhhZjQwMDA2NCwgMHg0NDEwMjMsIAorMHhhZjQyMDM2OCwgMHgzYzAyMDkwMCwgMHhhZjQwMDM2MCwgMHhhZmEyMDAyMCwgCisweDhmNWUwMDE4LCAweDI3YWEwMDIwLCAweDI0MDIwMGZmLCAweDEzYzIwMDAyLCAKKzB4YWZhYTAwM2MsIDB4MjdjMzAwMDEsIDB4OGMwMjAyMjgsIDB4NjA5MDIxLCAKKzB4MTY0MjAwMGUsIDB4MWUzOGMwLCAweDhmNDIwMzNjLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIDB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjIwYywgMHgzYzA1MDAwOSwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgCisweDhmYTYwMDIwLCAweDEwMDAwMDZiLCAweDM0YTUwNTAwLCAweGY3MTAyMSwgCisweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwNGMwLCAweGFjNDQwNGM0LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgCisweDJjNDIwM2U5LCAweDEwNDAwMDFiLCAweDk4MjEsIDB4ZTA4ODIxLCAKKzB4MjYzNTA0YzAsIDB4OGY0NDAxNzgsIDB4OGY0NTAxN2MsIDB4MjIwMTgyMSwgCisweDI0MGEwMDA0LCAweGFmYWEwMDEwLCAweGFmYjIwMDE0LCAweDhmNDgwMDBjLCAKKzB4MTAyMSwgMHgyZjUzMDIxLCAweGFmYTgwMDE4LCAweDhmNDgwMTBjLCAKKzB4MjQwNzAwMDgsIDB4YTMyODIxLCAweGEzNDgyYiwgMHg4MjIwMjEsIAorMHgxMDBmODA5LCAweDg5MjAyMSwgMHg1NDQwMDAwNiwgMHgyNDEzMDAwMSwgCisweDhmODIwMDU0LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTQ0MGZmZTksIAorMHgwLCAweDMyNjIwMGZmLCAweDU0NDAwMDE3LCAweGFmNTIwMDE4LCAKKzB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIAorMHg4ZjgyMDEyMCwgMHg4ZmFhMDAzYywgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgCisweDNjMDQwMDAxLCAweDI0ODQ2MjE4LCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAKKzB4OGQ0NjAwMDAsIDB4MTAwMDAwMzMsIDB4MzRhNTA2MDAsIDB4OGY0MjAzMDgsIAorMHgyNDEzMDAwMSwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwgCisweDEwMDAwMDFjLCAweDMyNjIwMGZmLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAKKzB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxNCwgCisweDk4MjEsIDB4MjQxMTAwMTAsIDB4OGY0MjAwMGMsIDB4OGY0NDAxNjAsIAorMHg4ZjQ1MDE2NCwgMHg4Zjg2MDEyMCwgMHhhZmIxMDAxMCwgMHhhZmIyMDAxNCwgCisweGFmYTIwMDE4LCAweDhmNDIwMTBjLCAweDI0MDcwMDA4LCAweDQwZjgwOSwgCisweDI0YzYwMDFjLCAweDE0NDBmZmU1LCAweDAsIDB4OGY4MjAwNTQsIAorMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmVmLCAweDAsIAorMHgzMjYyMDBmZiwgMHgxNDQwMDAxMSwgMHgwLCAweDhmNDIwMzc4LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIAorMHg4ZmFhMDAzYywgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2MjIwLCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNDYwMDAwLCAKKzB4MzRhNTA3MDAsIDB4YzAwMmIzYiwgMHgzYzAzODIxLCAweDhmNDIwMmIwLCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAyYjAsIDB4OGY0MjAyYjAsIDB4OGY0MjAyZjgsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDJmOCwgMHgxMDAwMDA4YSwgMHg4ZjQyMDJmOCwgCisweDhjMDIwMjVjLCAweDI3NDQwMjI0LCAweGFmNDIwMWYwLCAweDhjMDIwMjYwLCAKKzB4MjQwNTAyMDAsIDB4MjQwNjAwMDgsIDB4YzAwMmJiZiwgMHhhZjQyMDFmOCwgCisweDhmODIwMjIwLCAweDMwNDIwMDA4LCAweDE0NDAwMDAyLCAweDI0MDIwMDAxLCAKKzB4MjQwMjAwMDIsIDB4YWY0MjAyOTgsIDB4OGY0MjAyYWMsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDJhYywgMHgxMDAwMDA3NywgMHg4ZjQyMDJhYywgMHgzYzAyMDBmZiwgCisweDM0NDJmZmZmLCAweDIwMjE4MjQsIDB4MzJjMjAxODAsIDB4MTQ0MDAwMDYsIAorMHgzNDAyZmZmYiwgMHg0MzEwMmIsIDB4MTQ0MDAwMDMsIDB4MCwgCisweDEwMDAwMDZjLCAweGFmNDMwMGJjLCAweDNjMDQwMDAxLCAweDI0ODQ2MjgwLCAKKzB4M2MwNTAwMDMsIDB4MzRhNTE1MDAsIDB4MjAwMzAyMSwgMHgzODIxLCAKKzB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgzYzAyMDcwMCwgCisweDM0NDIxMDAwLCAweDEwMWUwMiwgMHg2MjE4MjUsIDB4YWZhMzAwMjAsIAorMHg4ZjUxMDAxOCwgMHgyNDAyMDBmZiwgMHgxMjIyMDAwMiwgMHg4MDIxLCAKKzB4MjYzMDAwMDEsIDB4OGMwMjAyMjgsIDB4MTYwMjAwMGUsIDB4MTEzMGMwLCAKKzB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIAorMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjFmNCwgMHgzYzA1MDAwOSwgCisweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmYTYwMDIwLCAweDEwMDAwMDNmLCAKKzB4MzRhNTAxMDAsIDB4ZDcxMDIxLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAKKzB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsIDB4YzAxODIxLCAweDhmNDQwMTc4LCAKKzB4OGY0NTAxN2MsIDB4MTAyMSwgMHgyNDA3MDAwNCwgMHhhZmE3MDAxMCwgCisweGFmYjAwMDE0LCAweDhmNDgwMDBjLCAweDI0YzYwNGMwLCAweDJlNjMwMjEsIAorMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgyNDA3MDAwOCwgMHhhMzI4MjEsIAorMHhhMzQ4MmIsIDB4ODIyMDIxLCAweDEwMGY4MDksIDB4ODkyMDIxLCAKKzB4MTQ0MDAwMGIsIDB4MjQwNzAwMDgsIDB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsIAorMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjFmYywgMHgzYzA1MDAwOSwgCisweGFmYTIwMDE0LCAweDhmYTYwMDIwLCAweDEwMDAwMDFjLCAweDM0YTUwMjAwLCAKKzB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY0MzAwMGMsIDB4YWY1MDAwMTgsIAorMHg4Zjg2MDEyMCwgMHgyNDAyMDAxMCwgMHhhZmEyMDAxMCwgMHhhZmIwMDAxNCwgCisweGFmYTMwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywgCisweDE0NDAwMDEwLCAweDAsIDB4OGY0MjAzNDAsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDM0MCwgMHg4ZjQyMDM0MCwgMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwgCisweDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MjA0LCAweDNjMDUwMDA5LCAKKzB4YWZhMjAwMTQsIDB4OGZhNjAwMjAsIDB4MzRhNTAzMDAsIDB4YzAwMmIzYiwgCisweDIyMDM4MjEsIDB4OGY0MjAyZTAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZTAsIAorMHg4ZjQyMDJlMCwgMHg4ZjQyMDJmMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDJmMCwgCisweDhmNDIwMmYwLCAweDhmYTIwMDM0LCAweDhmYmYwMDU4LCAweDhmYmUwMDU0LCAKKzB4OGZiNTAwNTAsIDB4OGZiMzAwNGMsIDB4OGZiMjAwNDgsIDB4OGZiMTAwNDQsIAorMHg4ZmIwMDA0MCwgMHgzZTAwMDA4LCAweDI3YmQwMDYwLCAweDI3YmRmZmY4LCAKKzB4MjQwOGZmZmYsIDB4MTBhMDAwMTQsIDB4NDgyMSwgMHgzYzBhZWRiOCwgCisweDM1NGE4MzIwLCAweDkwODcwMDAwLCAweDI0ODQwMDAxLCAweDMwMjEsIAorMHgxMDcxMDI2LCAweDMwNDIwMDAxLCAweDEwNDAwMDAyLCAweDgxODQyLCAKKzB4NmExODI2LCAweDYwNDAyMSwgMHgyNGM2MDAwMSwgMHgyY2MyMDAwOCwgCisweDE0NDBmZmY3LCAweDczODQyLCAweDI1MjkwMDAxLCAweDEyNTEwMmIsIAorMHgxNDQwZmZmMCwgMHgwLCAweDEwMDEwMjEsIDB4M2UwMDAwOCwgCisweDI3YmQwMDA4LCAweDI3YmRmZmIwLCAweGFmYmYwMDQ4LCAweGFmYmUwMDQ0LCAKKzB4YWZiNTAwNDAsIDB4YWZiMzAwM2MsIDB4YWZiMjAwMzgsIDB4YWZiMTAwMzQsIAorMHhhZmIwMDAzMCwgMHg4Zjg3MDIyMCwgMHhhZmE3MDAyNCwgMHg4Zjg3MDIwMCwgCisweGFmYTcwMDJjLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZmLCAKKzB4NDMxMDI0LCAweDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDhmODIwMjAwLCAKKzB4M2MwM2MwZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweDM0NDIwMDA0LCAKKzB4YWY4MjAyMDAsIDB4OGY1MzAzNTgsIDB4OGY1NTAzNWMsIDB4OGY1ZTAzNjAsIAorMHg4ZjQ3MDM2NCwgMHhhZmE3MDAxNCwgMHg4ZjQ3MDM2OCwgMHhhZmE3MDAxYywgCisweDhmNDIwMmQwLCAweDI3NDQwMWMwLCAweDI0NDIwMDAxLCAweGFmNDIwMmQwLCAKKzB4OGY1MDAyZDAsIDB4OGY1MTAyMDQsIDB4OGY1MjAyMDAsIDB4YzAwMmJhOCwgCisweDI0MDUwNDAwLCAweGFmNTMwMzU4LCAweGFmNTUwMzVjLCAweGFmNWUwMzYwLCAKKzB4OGZhNzAwMTQsIDB4YWY0NzAzNjQsIDB4OGZhNzAwMWMsIDB4YWY0NzAzNjgsIAorMHhhZjUwMDJkMCwgMHhhZjUxMDIwNCwgMHhhZjUyMDIwMCwgMHg4YzAyMDI1YywgCisweDI3NDQwMjI0LCAweGFmNDIwMWYwLCAweDhjMDIwMjYwLCAweDI0MDUwMjAwLCAKKzB4MjQwNjAwMDgsIDB4YWY0MjAxZjgsIDB4MjQwMjAwMDYsIDB4YzAwMmJiZiwgCisweGFmNDIwMWY0LCAweDNjMDIzYjlhLCAweDM0NDJjYTAwLCAweGFmNDIwMWZjLCAKKzB4MjQwMjAzZTgsIDB4MjQwNDAwMDIsIDB4MjQwMzAwMDEsIDB4YWY0MjAyOTQsIAorMHhhZjQ0MDI5MCwgMHhhZjQzMDI5YywgMHg4ZjgyMDIyMCwgMHgzMDQyMDAwOCwgCisweDEwNDAwMDA0LCAweDAsIDB4YWY0MzAyOTgsIDB4MTAwMDAwMDMsIAorMHgzMDIxLCAweGFmNDQwMjk4LCAweDMwMjEsIDB4M2MwMzAwMDEsIAorMHg2NjE4MjEsIDB4OTA2MzZkMDAsIDB4MzQ2MTAyMSwgMHgyNGM2MDAwMSwgCisweGEwNDMwMjJjLCAweDJjYzIwMDBmLCAweDE0NDBmZmY4LCAweDM0NjE4MjEsIAorMHgyNGM2MDAwMSwgMHg4ZjgyMDA0MCwgMHgyNDA0MDA4MCwgMHgyNDA1MDA4MCwgCisweDIxNzAyLCAweDI0NDIwMDMwLCAweGEwNjIwMjJjLCAweDM0NjEwMjEsIAorMHhjMDAyYmE4LCAweGEwNDAwMjJjLCAweDhmYTcwMDI0LCAweDMwZTIwMDA0LCAKKzB4MTQ0MDAwMDYsIDB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgCisweDM0NjNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4ZmE3MDAyYywgCisweDMwZTIwMDA0LCAweDE0NDAwMDA2LCAweDAsIDB4OGY4MjAyMDAsIAorMHgzYzAzYzBmZiwgMHgzNDYzZmZmYiwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsIAorMHg4ZmJmMDA0OCwgMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwgMHg4ZmIzMDAzYywgCisweDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLCAweDNlMDAwMDgsIAorMHgyN2JkMDA1MCwgMHgwLCAweDAsIDB4YWY0MDAxMDQsIAorMHgyNDA0MDAwMSwgMHg0MTBjMCwgMHgyZTIxODIxLCAweDI0ODIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGE0MjIzNGQwLCAweDQwMjAyMSwgCisweDJjODIwMDgwLCAweDE0NDBmZmY4LCAweDQxMGMwLCAweDI0MDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGE0MjAzOGQwLCAweGFmNDIwMTAwLCAKKzB4YWY4MDAyMjgsIDB4YWY4MDAyMmMsIDB4YWY4MDAyMzAsIDB4YWY4MDAyMzQsIAorMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTQsIAorMHhhZmIwMDAxMCwgMHg4ZjQyMDEwNCwgMHgyODQyMDAwNSwgMHgxMDQwMDAyNiwgCisweDgwODAyMSwgMHgzYzAyMDAwMSwgMHg4ZjQzMDEwNCwgMHgzNDQyMzBkMCwgCisweDJlMjIwMjEsIDB4MzE4YzAsIDB4NjIxODIxLCAweDJlMzE4MjEsIAorMHg4MzEwMmIsIDB4MTA0MDAwMTUsIDB4MTAyMSwgMHg5NjA3MDAwMCwgCisweDI0ODQwMDA2LCAweDI0NjYwMDA2LCAweDk0ODJmZmZjLCAweDE0NDcwMDA5LCAKKzB4MjgyMSwgMHg5NDgzZmZmZSwgMHg5NjAyMDAwMiwgMHgxNDYyMDAwNiwgCisweGEwMTAyMSwgMHg5NDgyMDAwMCwgMHg5NjAzMDAwNCwgMHg0MzEwMjYsIAorMHgyYzQ1MDAwMSwgMHhhMDEwMjEsIDB4MTQ0MDAwMDksIDB4MjQ4NDAwMDgsIAorMHg4NjEwMmIsIDB4MTQ0MGZmZjAsIDB4MTAyMSwgMHgzMDQyMDBmZiwgCisweDE0NDAwMDMwLCAweDI0MDIwMDAxLCAweDEwMDAwMDJlLCAweDEwMjEsIAorMHgxMDAwZmZmYSwgMHgyNDAyMDAwMSwgMHgyMDAyMDIxLCAweGMwMDI0MGMsIAorMHgyNDA1MDAwNiwgMHgzMDQyMDA3ZiwgMHgyMThjMCwgMHgyZTMxMDIxLCAKKzB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDk0MjIzMGQwLCAweDEwNDBmZmYyLCAKKzB4MmUzMTAyMSwgMHgzYzA2MDAwMSwgMHhjMjMwMjEsIDB4OTRjNjMwZDAsIAorMHgxMGMwZmZlZCwgMHgzYzA4MDAwMSwgMHgzNTA4MzRkMiwgMHg5NjA3MDAwMCwgCisweDYxMGMwLCAweDU3MjAyMSwgMHg4ODIwMjEsIDB4OTQ4MjAwMDAsIAorMHgxNDQ3MDAwOSwgMHgyODIxLCAweDk0ODMwMDAyLCAweDk2MDIwMDAyLCAKKzB4MTQ2MjAwMDYsIDB4YTAxMDIxLCAweDk0ODIwMDA0LCAweDk2MDMwMDA0LCAKKzB4NDMxMDI2LCAweDJjNDUwMDAxLCAweGEwMTAyMSwgMHgxNDQwMDAwNywgCisweDYxMGMwLCAweDJlMjEwMjEsIDB4M2MwNjAwMDEsIDB4YzIzMDIxLCAKKzB4OTRjNjM0ZDAsIDB4MTRjMGZmZWIsIDB4NjEwYzAsIDB4MTBjMGZmZDIsIAorMHgyNDAyMDAwMSwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwMTgsIDB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmIwLCAKKzB4ODAxMDIxLCAweGFmYjAwMDMwLCAweDI0NTAwMDAyLCAweDIwMDIwMjEsIAorMHgyNDA1MDAwNiwgMHhhZmIxMDAzNCwgMHg0MDg4MjEsIDB4YWZiZjAwNDgsIAorMHhhZmJlMDA0NCwgMHhhZmI1MDA0MCwgMHhhZmIzMDAzYywgMHhjMDAyNDBjLCAKKzB4YWZiMjAwMzgsIDB4MzA0NzAwN2YsIDB4NzEwYzAsIDB4MmUyMTAyMSwgCisweDNjMDUwMDAxLCAweGEyMjgyMSwgMHg5NGE1MzBkMCwgMHg1MGEwMDAxYywgCisweGEwMzAyMSwgMHgzYzA5MDAwMSwgMHgzNTI5MzRkMiwgMHg5NjI4MDAwMiwgCisweDUxMGMwLCAweDU3MjAyMSwgMHg4OTIwMjEsIDB4OTQ4MjAwMDAsIAorMHgxNDQ4MDAwOSwgMHgzMDIxLCAweDk0ODMwMDAyLCAweDk2MDIwMDAyLCAKKzB4MTQ2MjAwMDYsIDB4YzAxMDIxLCAweDk0ODIwMDA0LCAweDk2MDMwMDA0LCAKKzB4NDMxMDI2LCAweDJjNDYwMDAxLCAweGMwMTAyMSwgMHgxNDQwMDAwNywgCisweDUxMGMwLCAweDJlMjEwMjEsIDB4M2MwNTAwMDEsIDB4YTIyODIxLCAKKzB4OTRhNTM0ZDAsIDB4MTRhMGZmZWIsIDB4NTEwYzAsIDB4YTAzMDIxLCAKKzB4MTBjMDAwMTQsIDB4NjEwYzAsIDB4NTcxODIxLCAweDNjMDEwMDAxLCAKKzB4MjMwODIxLCAweDhjMjMzNGQwLCAweDU3MTAyMSwgMHhhZmEzMDAxMCwgCisweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyMzRkNCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2Mzk0LCAweGFmYTIwMDE0LCAweDhlMjYwMDAwLCAweDhlMjcwMDA0LCAKKzB4M2MwNTAwMDQsIDB4YzAwMmIzYiwgMHgzNGE1MDQwMCwgMHgxMDAwMDA2MywgCisweDNjMDIwODAwLCAweDhmNDUwMTAwLCAweDEwYTAwMDA2LCAweDUxMGMwLCAKKzB4MmUyMTAyMSwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OTQyMjM0ZDAsIAorMHhhZjQyMDEwMCwgMHhhMDMwMjEsIDB4MTRjMDAwMTEsIDB4NjI4YzAsIAorMHg3MTBjMCwgMHgyZTIxMDIxLCAweGFmYTcwMDEwLCAweDNjMDEwMDAxLCAKKzB4MjIwODIxLCAweDk0MjIzMGQwLCAweDNjMDQwMDAxLCAweDI0ODQ2M2EwLCAKKzB4YWZhMjAwMTQsIDB4OGUyNjAwMDAsIDB4OGUyNzAwMDQsIDB4M2MwNTAwMDQsIAorMHhjMDAyYjNiLCAweDM0YTUwNTAwLCAweDEwMDAwMDQ4LCAweDNjMDIwODAwLCAKKzB4YjcxODIxLCAweDNjMDIwMDAxLCAweDk2MDQwMDAwLCAweDM0NDIzNGQyLCAKKzB4NjIxODIxLCAweGE0NjQwMDAwLCAweDhlMDIwMDAyLCAweDcyMGMwLCAKKzB4YWM2MjAwMDIsIDB4MmU0MTAyMSwgMHgzYzAzMDAwMSwgMHg2MjE4MjEsIAorMHg5NDYzMzBkMCwgMHgyZTUxMDIxLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgCisweGE0MjMzNGQwLCAweDJlNDEwMjEsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAKKzB4YTQyNjMwZDAsIDB4OGY0MjAxMDQsIDB4MjQ0MjAwMDEsIDB4Mjg0MjAwODAsIAorMHgxMDQwMDAwZiwgMHgzYzAyMDAwMiwgMHg4ZjQyMDEwNCwgMHgzYzA0MDAwMSwgCisweDM0ODQzMGQyLCAweDk2MDMwMDAwLCAweDIxMGMwLCAweDU3MTAyMSwgCisweDQ0MTAyMSwgMHhhNDQzMDAwMCwgMHg4ZTAzMDAwMiwgMHhhYzQzMDAwMiwgCisweDhmNDIwMTA0LCAweDI0NDIwMDAxLCAweGFmNDIwMTA0LCAweDNjMDIwMDAyLCAKKzB4MmMyMTAyNCwgMHgxMDQwMDAxMSwgMHg3MjE0MiwgMHgzYzAzMDAwMSwgCisweDM0NjMzOGQ4LCAweDI0MDIwMDAzLCAweDQ0MTAyMywgMHgyMTA4MCwgCisweDU3MjAyMSwgMHg4MzIwMjEsIDB4NTcxMDIxLCAweDQzMTAyMSwgCisweDMwZTUwMDFmLCAweDhjNDMwMDAwLCAweDI0MDIwMDAxLCAweGEyMTAwNCwgCisweDYyMTgyNSwgMHgxMDAwMDAwYywgMHhhYzgzMDAwMCwgMHgyNDAyMDAwMywgCisweDQ0MTAyMywgMHgyMTA4MCwgMHg1YzI4MjEsIDB4NWMxMDIxLCAKKzB4MzBlNDAwMWYsIDB4OGM0MzAyMjgsIDB4MjQwMjAwMDEsIDB4ODIxMDA0LCAKKzB4NjIxODI1LCAweGFjYTMwMjI4LCAweDNjMDIwODAwLCAweDM0NDIxMDAwLCAKKzB4MTgyMSwgMHhhZmEyMDAyMCwgMHg4ZjVlMDAxOCwgMHgyN2FhMDAyMCwgCisweDI0MDIwMGZmLCAweDEzYzIwMDAyLCAweGFmYWEwMDJjLCAweDI3YzMwMDAxLCAKKzB4OGMwMjAyMjgsIDB4NjA5MDIxLCAweDE2NDIwMDBlLCAweDFlMzhjMCwgCisweDhmNDIwMzNjLCAweDI0NDIwMDAxLCAweGFmNDIwMzNjLCAweDhmNDIwMzNjLCAKKzB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsIDB4MjQ4NDYzNWMsIDB4M2MwNTAwMDksIAorMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZmE2MDAyMCwgMHgxMDAwMDA2YiwgCisweDM0YTUwNTAwLCAweGY3MTAyMSwgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgCisweGFjNDMwNGMwLCAweGFjNDQwNGM0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAKKzB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwgCisweDk4MjEsIDB4ZTA4ODIxLCAweDI2MzUwNGMwLCAweDhmNDQwMTc4LCAKKzB4OGY0NTAxN2MsIDB4MjIwMTgyMSwgMHgyNDBhMDAwNCwgMHhhZmFhMDAxMCwgCisweGFmYjIwMDE0LCAweDhmNDgwMDBjLCAweDEwMjEsIDB4MmY1MzAyMSwgCisweGFmYTgwMDE4LCAweDhmNDgwMTBjLCAweDI0MDcwMDA4LCAweGEzMjgyMSwgCisweGEzNDgyYiwgMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsIAorMHg1NDQwMDAwNiwgMHgyNDEzMDAwMSwgMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAKKzB4MmM0MjAzZTksIDB4MTQ0MGZmZTksIDB4MCwgMHgzMjYyMDBmZiwgCisweDU0NDAwMDE3LCAweGFmNTIwMDE4LCAweDhmNDIwMzc4LCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIAorMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjM2OCwgCisweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNDYwMDAwLCAweDEwMDAwMDMzLCAKKzB4MzRhNTA2MDAsIDB4OGY0MjAzMDgsIDB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwgMHgxMDAwMDAxYywgMHgzMjYyMDBmZiwgCisweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsIAorMHgyYzQyMDNlOSwgMHgxMDQwMDAxNCwgMHg5ODIxLCAweDI0MTEwMDEwLCAKKzB4OGY0MjAwMGMsIDB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIAorMHhhZmIxMDAxMCwgMHhhZmIyMDAxNCwgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgCisweDI0MDcwMDA4LCAweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwZmZlNSwgCisweDAsIDB4OGY4MjAwNTQsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgCisweDE0NDBmZmVmLCAweDAsIDB4MzI2MjAwZmYsIDB4MTQ0MDAwMTEsIAorMHgwLCAweDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LCAKKzB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsIAorMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjM3MCwgMHgzYzA1MDAwOSwgCisweGFmYTIwMDE0LCAweDhkNDYwMDAwLCAweDM0YTUwNzAwLCAweGMwMDJiM2IsIAorMHgzYzAzODIxLCAweDhmNDIwMmI0LCAweDI0NDIwMDAxLCAweGFmNDIwMmI0LCAKKzB4OGY0MjAyYjQsIDB4OGY0MjAyZjQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZjQsIAorMHg4ZjQyMDJmNCwgMHg4ZmJmMDA0OCwgMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwgCisweDhmYjMwMDNjLCAweDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLCAKKzB4M2UwMDAwOCwgMHgyN2JkMDA1MCwgMHgyN2JkZmZhMCwgMHg4MDEwMjEsIAorMHhhZmIwMDA0MCwgMHgyNDUwMDAwMiwgMHgyMDAyMDIxLCAweDI0MDUwMDA2LCAKKzB4YWZiMTAwNDQsIDB4NDA4ODIxLCAweGFmYmYwMDU4LCAweGFmYmUwMDU0LCAKKzB4YWZiNTAwNTAsIDB4YWZiMzAwNGMsIDB4YzAwMjQwYywgMHhhZmIyMDA0OCwgCisweDMwNDgwMDdmLCAweDgxMGMwLCAweDJlMjEwMjEsIDB4M2MwNjAwMDEsIAorMHhjMjMwMjEsIDB4OTRjNjMwZDAsIDB4MTBjMDAwMWMsIDB4MzgyMSwgCisweDNjMGEwMDAxLCAweDM1NGEzNGQyLCAweDk2MjkwMDAyLCAweDYxMGMwLCAKKzB4NTcyMDIxLCAweDhhMjAyMSwgMHg5NDgyMDAwMCwgMHgxNDQ5MDAwOSwgCisweDI4MjEsIDB4OTQ4MzAwMDIsIDB4OTYwMjAwMDIsIDB4MTQ2MjAwMDYsIAorMHhhMDEwMjEsIDB4OTQ4MjAwMDQsIDB4OTYwMzAwMDQsIDB4NDMxMDI2LCAKKzB4MmM0NTAwMDEsIDB4YTAxMDIxLCAweDE0NDAwMDA4LCAweDYxMGMwLCAKKzB4YzAzODIxLCAweDJlMjEwMjEsIDB4M2MwNjAwMDEsIDB4YzIzMDIxLCAKKzB4OTRjNjM0ZDAsIDB4MTRjMGZmZWEsIDB4NjEwYzAsIDB4MTRjMDAwMTEsIAorMHhhZmE3MDAyOCwgMHg4MTBjMCwgMHgyZTIxMDIxLCAweGFmYTgwMDEwLCAKKzB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDk0MjIzMGQwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDYzYWMsIDB4YWZhMjAwMTQsIDB4OGUyNjAwMDAsIDB4OGUyNzAwMDQsIAorMHgzYzA1MDAwNCwgMHhjMDAyYjNiLCAweDM0YTUwOTAwLCAweDEwMDAwMDc1LCAKKzB4M2MwMjA4MDAsIDB4MTBlMDAwMGMsIDB4NjEwYzAsIDB4MmUyMTAyMSwgCisweDNjMDMwMDAxLCAweDYyMTgyMSwgMHg5NDYzMzRkMCwgMHg3MTBjMCwgCisweDJlMjEwMjEsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGE0MjMzNGQwLCAKKzB4MTAwMDAwMGIsIDB4M2MwNDAwMDEsIDB4MmUyMTAyMSwgMHgzYzAzMDAwMSwgCisweDYyMTgyMSwgMHg5NDYzMzRkMCwgMHg4MTBjMCwgMHgyZTIxMDIxLCAKKzB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGE0MjMzMGQwLCAweDNjMDQwMDAxLCAKKzB4MzQ4NDMwZDAsIDB4OGY0MzAxMDAsIDB4NjEwYzAsIDB4MmUyMTAyMSwgCisweDNjMDEwMDAxLCAweDIyMDgyMSwgMHhhNDIzMzRkMCwgMHg4ZjQyMDEwNCwgCisweDJlNDM4MjEsIDB4MjgyMSwgMHgxODQwMDAyOSwgMHhhZjQ2MDEwMCwgCisweDI0ZTYwMDA2LCAweDk0YzNmZmZjLCAweDk2MDIwMDAwLCAweDE0NjIwMDA5LCAKKzB4MjAyMSwgMHg5NGMzZmZmZSwgMHg5NjAyMDAwMiwgMHgxNDYyMDAwNiwgCisweDgwMTAyMSwgMHg5NGMyMDAwMCwgMHg5NjAzMDAwNCwgMHg0MzEwMjYsIAorMHgyYzQ0MDAwMSwgMHg4MDEwMjEsIDB4NTA0MDAwMTQsIDB4MjRhNTAwMDEsIAorMHg4ZjQyMDEwNCwgMHgyNDQyZmZmZiwgMHhhMjEwMmEsIDB4MTA0MDAwMGIsIAorMHgyNGU0MDAwNCwgMHg5NDgyMDAwNiwgMHg4YzgzMDAwOCwgMHhhNDgyZmZmZSwgCisweGFjODMwMDAwLCAweDhmNDIwMTA0LCAweDI0YTUwMDAxLCAweDI0NDJmZmZmLCAKKzB4YTIxMDJhLCAweDE0NDBmZmY3LCAweDI0ODQwMDA4LCAweDhmNDIwMTA0LCAKKzB4MjQ0MmZmZmYsIDB4MTAwMDAwMDYsIDB4YWY0MjAxMDQsIDB4OGY0MjAxMDQsIAorMHgyNGM2MDAwOCwgMHhhMjEwMmEsIDB4MTQ0MGZmZGEsIDB4MjRlNzAwMDgsIAorMHg4MTBjMCwgMHgyZTIxMDIxLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgCisweDk0MjIzMGQwLCAweDE0NDAwMDIzLCAweDNjMDIwODAwLCAweDNjMDIwMDAyLCAKKzB4MmMyMTAyNCwgMHgxMDQwMDAxMiwgMHg4MjE0MiwgMHgzYzAzMDAwMSwgCisweDM0NjMzOGQ4LCAweDI0MDIwMDAzLCAweDQ0MTAyMywgMHgyMTA4MCwgCisweDU3MjAyMSwgMHg4MzIwMjEsIDB4NTcxMDIxLCAweDQzMTAyMSwgCisweDMxMDUwMDFmLCAweDI0MDMwMDAxLCAweDhjNDIwMDAwLCAweGEzMTgwNCwgCisweDMxODI3LCAweDQzMTAyNCwgMHgxMDAwMDAwZCwgMHhhYzgyMDAwMCwgCisweDI0MDIwMDAzLCAweDQ0MTAyMywgMHgyMTA4MCwgMHg1YzI4MjEsIAorMHg1YzEwMjEsIDB4MzEwNDAwMWYsIDB4MjQwMzAwMDEsIDB4OGM0MjAyMjgsIAorMHg4MzE4MDQsIDB4MzE4MjcsIDB4NDMxMDI0LCAweGFjYTIwMjI4LCAKKzB4M2MwMjA4MDAsIDB4MzQ0MjIwMDAsIDB4MTgyMSwgMHhhZmEyMDAyMCwgCisweDhmNWUwMDE4LCAweDI3YWIwMDIwLCAweDI0MDIwMGZmLCAweDEzYzIwMDAyLCAKKzB4YWZhYjAwMzQsIDB4MjdjMzAwMDEsIDB4OGMwMjAyMjgsIDB4NjA5MDIxLCAKKzB4MTY0MjAwMGUsIDB4MWUzOGMwLCAweDhmNDIwMzNjLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIDB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjM1YywgMHgzYzA1MDAwOSwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgCisweDhmYTYwMDIwLCAweDEwMDAwMDZiLCAweDM0YTUwNTAwLCAweGY3MTAyMSwgCisweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwNGMwLCAweGFjNDQwNGM0LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgCisweDJjNDIwM2U5LCAweDEwNDAwMDFiLCAweDk4MjEsIDB4ZTA4ODIxLCAKKzB4MjYzNTA0YzAsIDB4OGY0NDAxNzgsIDB4OGY0NTAxN2MsIDB4MjIwMTgyMSwgCisweDI0MGIwMDA0LCAweGFmYWIwMDEwLCAweGFmYjIwMDE0LCAweDhmNDgwMDBjLCAKKzB4MTAyMSwgMHgyZjUzMDIxLCAweGFmYTgwMDE4LCAweDhmNDgwMTBjLCAKKzB4MjQwNzAwMDgsIDB4YTMyODIxLCAweGEzNDgyYiwgMHg4MjIwMjEsIAorMHgxMDBmODA5LCAweDg5MjAyMSwgMHg1NDQwMDAwNiwgMHgyNDEzMDAwMSwgCisweDhmODIwMDU0LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTQ0MGZmZTksIAorMHgwLCAweDMyNjIwMGZmLCAweDU0NDAwMDE3LCAweGFmNTIwMDE4LCAKKzB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIAorMHg4ZjgyMDEyMCwgMHg4ZmFiMDAzNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgCisweDNjMDQwMDAxLCAweDI0ODQ2MzY4LCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAKKzB4OGQ2NjAwMDAsIDB4MTAwMDAwMzMsIDB4MzRhNTA2MDAsIDB4OGY0MjAzMDgsIAorMHgyNDEzMDAwMSwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwgCisweDEwMDAwMDFjLCAweDMyNjIwMGZmLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAKKzB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxNCwgCisweDk4MjEsIDB4MjQxMTAwMTAsIDB4OGY0MjAwMGMsIDB4OGY0NDAxNjAsIAorMHg4ZjQ1MDE2NCwgMHg4Zjg2MDEyMCwgMHhhZmIxMDAxMCwgMHhhZmIyMDAxNCwgCisweGFmYTIwMDE4LCAweDhmNDIwMTBjLCAweDI0MDcwMDA4LCAweDQwZjgwOSwgCisweDI0YzYwMDFjLCAweDE0NDBmZmU1LCAweDAsIDB4OGY4MjAwNTQsIAorMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmVmLCAweDAsIAorMHgzMjYyMDBmZiwgMHgxNDQwMDAxMSwgMHgwLCAweDhmNDIwMzc4LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIAorMHg4ZmFiMDAzNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2MzcwLCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNjYwMDAwLCAKKzB4MzRhNTA3MDAsIDB4YzAwMmIzYiwgMHgzYzAzODIxLCAweDhmNDIwMmI4LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAyYjgsIDB4OGY0MjAyYjgsIDB4OGY0MjAyZjQsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDJmNCwgMHg4ZjQyMDJmNCwgMHg4ZmJmMDA1OCwgCisweDhmYmUwMDU0LCAweDhmYjUwMDUwLCAweDhmYjMwMDRjLCAweDhmYjIwMDQ4LCAKKzB4OGZiMTAwNDQsIDB4OGZiMDAwNDAsIDB4M2UwMDAwOCwgMHgyN2JkMDA2MCwgCisweDAsIDB4MCwgMHgwLCAweDI3YmRmZmUwLCAKKzB4Mjc2NDQwMDAsIDB4YWZiZjAwMTgsIDB4YzAwMmJhOCwgMHgyNDA1MTAwMCwgCisweDNjMDMwMDAxLCAweDM0NjMyY2MwLCAweDNjMDQwMDAxLCAweDM0ODQyZWM4LCAKKzB4MjQwMjAwMjAsIDB4YWY4MjAxMWMsIDB4MmUzMTAyMSwgMHhhZjgwMDEwMCwgCisweGFmODAwMTA0LCAweGFmODAwMTA4LCAweGFmODAwMTEwLCAweGFmODAwMTE0LCAKKzB4YWY4MDAxMTgsIDB4YWY4MDAxMjAsIDB4YWY4MDAxMjQsIDB4YWY4MDAxMjgsIAorMHhhZjgwMDEzMCwgMHhhZjgwMDEzNCwgMHhhZjgwMDEzOCwgMHhhZjQyMDBlYywgCisweDJlMzEwMjEsIDB4YWY0MjAwZjAsIDB4MmU0MTAyMSwgMHhhZjQyMDBmNCwgCisweDJlNDEwMjEsIDB4YWY0MjAwZjgsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAKKzB4OTA0MjQwZjQsIDB4MTQ0MDAwMWMsIDB4M2MwNTAwMDEsIDB4OGY4MjAxMWMsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjQ3MCwgMHgzYzA1MDAwMSwgMHgzNDQyMDAwMSwgCisweGFmODIwMTFjLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTFjLCAKKzB4MzRhNTAxMDAsIDB4YzAwMmIzYiwgMHgzODIxLCAweDhjMDIwMjE4LCAKKzB4MzA0MjAwNDAsIDB4MTA0MDAwMTQsIDB4MCwgMHg4ZjgyMDExYywgCisweDNjMDQwMDAxLCAweDI0ODQ2NDdjLCAweDNjMDUwMDAxLCAweDM0NDIwMDA0LCAKKzB4YWY4MjAxMWMsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAxMWMsIAorMHgxMDAwMDAwNywgMHgzNGE1MDIwMCwgMHgzYzA0MDAwMSwgMHgyNDg0NjQ4NCwgCisweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTFjLCAweDM0YTUwMzAwLCAKKzB4YzAwMmIzYiwgMHgzODIxLCAweDhmYmYwMDE4LCAweDNlMDAwMDgsIAorMHgyN2JkMDAyMCwgMHg4ZmE5MDAxMCwgMHg4ZjgzMDEyYywgMHg4ZmFhMDAxNCwgCisweDhmYWIwMDE4LCAweDEwNjAwMDBhLCAweDI3NjI0ZmUwLCAweDE0NjIwMDAyLCAKKzB4MjQ2ODAwMjAsIDB4Mjc2ODQ4MDAsIDB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIAorMHgwLCAweDhmODIwMTI0LCAweDE1MDIwMDA3LCAweDAsIAorMHg4ZjQzMDMzNCwgMHgxMDIxLCAweDI0NjMwMDAxLCAweGFmNDMwMzM0LCAKKzB4MTAwMDAwMzksIDB4OGY0MzAzMzQsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIAorMHhhYzY2MDAwOCwgMHhhNDY3MDAwZSwgMHhhYzY5MDAxOCwgMHhhYzZhMDAxYywgCisweGFjNmIwMDEwLCAweGFjNjIwMDE0LCAweGFmODgwMTIwLCAweDhmNDIwMGZjLCAKKzB4OGY0NDAwZjQsIDB4MjQ0MmZmZmYsIDB4YWY0MjAwZmMsIDB4OGM4MjAwMDAsIAorMHgxMDQ5MDAwNSwgMHgzMDQyZmY4ZiwgMHgxMDQwMDAxOSwgMHgzMTIyZmY4ZiwgCisweDEwNDAwMDE4LCAweDNjMDIwMDAxLCAweDhjODMwMDA0LCAweDJjNjIwMDEwLCAKKzB4MTA0MDAwMTMsIDB4M2MwMjAwMDEsIDB4MjQ2MzAwMDEsIDB4YWM4MzAwMDQsIAorMHg4ZjQzMDBmOCwgMHgzNDQyMzBjOCwgMHgyZTIxMDIxLCAweDU0NjIwMDA0LCAKKzB4MjQ2MjAwMDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJlYzgsIDB4MmUyMTAyMSwgCisweDE0NDQwMDE1LCAweDI0MDIwMDAxLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAKKzB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4MTAwMDAwMGYsIDB4MjQwMjAwMDEsIAorMHgzYzAyMDAwMSwgMHgzNDQyMzBjOCwgMHgyZTIxMDIxLCAweDU0ODIwMDA0LCAKKzB4MjQ4MjAwMDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJlYzgsIDB4MmUyMTAyMSwgCisweDQwMjAyMSwgMHgyNDAyMDAwMSwgMHhhZjQ0MDBmNCwgMHhhYzg5MDAwMCwgCisweGFjODIwMDA0LCAweDI0MDIwMDAxLCAweDNlMDAwMDgsIDB4MCwgCisweDNlMDAwMDgsIDB4MCwgMHg4ZmE5MDAxMCwgMHg4ZjgzMDEwYywgCisweDhmYWEwMDE0LCAweDhmYWIwMDE4LCAweDEwNjAwMDBhLCAweDI3NjI0N2UwLCAKKzB4MTQ2MjAwMDIsIDB4MjQ2ODAwMjAsIDB4Mjc2ODQwMDAsIDB4OGY4MjAxMDgsIAorMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTA0LCAweDE1MDIwMDA3LCAKKzB4MCwgMHg4ZjQzMDMzOCwgMHgxMDIxLCAweDI0NjMwMDAxLCAKKzB4YWY0MzAzMzgsIDB4MTAwMDAwMzUsIDB4OGY0MzAzMzgsIDB4YWM2NDAwMDAsIAorMHhhYzY1MDAwNCwgMHhhYzY2MDAwOCwgMHhhNDY3MDAwZSwgMHhhYzY5MDAxOCwgCisweGFjNmEwMDFjLCAweGFjNmIwMDEwLCAweGFjNjIwMDE0LCAweGFmODgwMTAwLCAKKzB4OGY0NDAwZWMsIDB4OGM4MjAwMDAsIDB4MzA0MjAwMDYsIDB4MTA0MDAwMTksIAorMHgzMTIyMDAwNiwgMHgxMDQwMDAxOCwgMHgzYzAyMDAwMSwgMHg4YzgzMDAwNCwgCisweDJjNjIwMDEwLCAweDEwNDAwMDEzLCAweDNjMDIwMDAxLCAweDI0NjMwMDAxLCAKKzB4YWM4MzAwMDQsIDB4OGY0MzAwZjAsIDB4MzQ0MjJlYzAsIDB4MmUyMTAyMSwgCisweDU0NjIwMDA0LCAweDI0NjIwMDA4LCAweDNjMDIwMDAxLCAweDM0NDIyY2MwLCAKKzB4MmUyMTAyMSwgMHgxNDQ0MDAxNSwgMHgyNDAyMDAwMSwgMHg4ZjgyMDEwOCwgCisweDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDEwMDAwMDBmLCAKKzB4MjQwMjAwMDEsIDB4M2MwMjAwMDEsIDB4MzQ0MjJlYzAsIDB4MmUyMTAyMSwgCisweDU0ODIwMDA0LCAweDI0ODIwMDA4LCAweDNjMDIwMDAxLCAweDM0NDIyY2MwLCAKKzB4MmUyMTAyMSwgMHg0MDIwMjEsIDB4MjQwMjAwMDEsIDB4YWY0NDAwZWMsIAorMHhhYzg5MDAwMCwgMHhhYzgyMDAwNCwgMHgyNDAyMDAwMSwgMHgzZTAwMDA4LCAKKzB4MCwgMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZDgsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjQ4YywgMHgzYzA1MDAwMSwgMHhhZmJmMDAyNCwgCisweGFmYjIwMDIwLCAweGFmYjEwMDFjLCAweGFmYjAwMDE4LCAweDhmOTAwMTA0LCAKKzB4OGY5MTAwYjAsIDB4OGY5MjAxMWMsIDB4MzRhNTI1MDAsIDB4OGY4MjAxMDAsIAorMHgyNDAzMDIxLCAweDIyMDM4MjEsIDB4YWZhMjAwMTAsIDB4YzAwMmIzYiwgCisweGFmYjAwMDE0LCAweDhlMDIwMDA4LCAweGFmYTIwMDEwLCAweDhlMDIwMDBjLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDY0OTgsIDB4YWZhMjAwMTQsIDB4OGUwNjAwMDAsIAorMHg4ZTA3MDAwNCwgMHgzYzA1MDAwMSwgMHhjMDAyYjNiLCAweDM0YTUyNTEwLCAKKzB4OGUwMjAwMTgsIDB4YWZhMjAwMTAsIDB4OGUwMjAwMWMsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjRhNCwgMHhhZmEyMDAxNCwgMHg4ZTA2MDAxMCwgMHg4ZTA3MDAxNCwgCisweDNjMDUwMDAxLCAweGMwMDJiM2IsIDB4MzRhNTI1MjAsIDB4M2MwMjdmMDAsIAorMHgyMjIxMDI0LCAweDNjMDMwODAwLCAweDU0NDMwMDE2LCAweDNjMDMwMjAwLCAKKzB4OGY4MjAwOWMsIDB4MzA0MmZmZmYsIDB4MTQ0MDAwMTIsIDB4M2MwMzAyMDAsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjRiMCwgMHgzYzA1MDAwMiwgMHgzNGE1ZjAzMCwgCisweDMwMjEsIDB4MzgyMSwgMHgzNjQyMDAwMiwgMHhhZjgyMDExYywgCisweDM2MjIwMDAxLCAweGFmODIwMGIwLCAweGFmOTAwMTA0LCAweGFmOTIwMTFjLCAKKzB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgxMDAwMDAyNCwgCisweDAsIDB4MmMzMTAyNCwgMHgxMDQwMDAwZCwgMHgyMjMxMDI0LCAKKzB4MTA0MDAwMGIsIDB4MzY0MjAwMDIsIDB4YWY4MjAxMWMsIDB4MzYyMjAwMDEsIAorMHhhZjgyMDBiMCwgMHhhZjkwMDEwNCwgMHhhZjkyMDExYywgMHg4ZjQyMDMzMCwgCisweDI0NDIwMDAxLCAweGFmNDIwMzMwLCAweDEwMDAwMDE1LCAweDhmNDIwMzMwLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDY0YjgsIDB4MjQwMjAyYTksIDB4YWZhMjAwMTAsIAorMHhhZmEwMDAxNCwgMHg4Zjg2MDE0NCwgMHgzYzA3MDAwMSwgMHgyNGU3NjRjMCwgCisweGMwMDJiM2IsIDB4MzQwNWRlYWQsIDB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsIAorMHhhZjgyMDExYywgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgCisweDhmODIwMTQwLCAweDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDE0MCwgCisweDhmYmYwMDI0LCAweDhmYjIwMDIwLCAweDhmYjEwMDFjLCAweDhmYjAwMDE4LCAKKzB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgyN2JkZmZkOCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2NGU4LCAweDNjMDUwMDAxLCAweGFmYmYwMDI0LCAweGFmYjIwMDIwLCAKKzB4YWZiMTAwMWMsIDB4YWZiMDAwMTgsIDB4OGY5MDAxMjQsIDB4OGY5MTAwYTAsIAorMHg4ZjkyMDExYywgMHgzNGE1MjYwMCwgMHg4ZjgyMDEyMCwgMHgyNDAzMDIxLCAKKzB4MjIwMzgyMSwgMHhhZmEyMDAxMCwgMHhjMDAyYjNiLCAweGFmYjAwMDE0LCAKKzB4OGUwMjAwMDgsIDB4YWZhMjAwMTAsIDB4OGUwMjAwMGMsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjRmNCwgMHhhZmEyMDAxNCwgMHg4ZTA2MDAwMCwgMHg4ZTA3MDAwNCwgCisweDNjMDUwMDAxLCAweGMwMDJiM2IsIDB4MzRhNTI2MTAsIDB4OGUwMjAwMTgsIAorMHhhZmEyMDAxMCwgMHg4ZTAyMDAxYywgMHgzYzA0MDAwMSwgMHgyNDg0NjUwMCwgCisweGFmYTIwMDE0LCAweDhlMDYwMDEwLCAweDhlMDcwMDE0LCAweDNjMDUwMDAxLCAKKzB4YzAwMmIzYiwgMHgzNGE1MjYyMCwgMHgzYzAyN2YwMCwgMHgyMjIxMDI0LCAKKzB4M2MwMzA4MDAsIDB4NTQ0MzAwMTYsIDB4M2MwMzAyMDAsIDB4OGY4MjAwYWMsIAorMHgzMDQyZmZmZiwgMHgxNDQwMDAxMiwgMHgzYzAzMDIwMCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2NTBjLCAweDNjMDUwMDAxLCAweDM0YTVmMDMwLCAweDMwMjEsIAorMHgzODIxLCAweDM2NDIwMDAyLCAweGFmODIwMTFjLCAweDM2MjIwMDAxLCAKKzB4YWY4MjAwYTAsIDB4YWY5MDAxMjQsIDB4YWY5MjAxMWMsIDB4YWZhMDAwMTAsIAorMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDEwMDAwMDI0LCAweDAsIAorMHgyYzMxMDI0LCAweDEwNDAwMDBkLCAweDIyMzEwMjQsIDB4MTA0MDAwMGIsIAorMHgzNjQyMDAwMiwgMHhhZjgyMDExYywgMHgzNjIyMDAwMSwgMHhhZjgyMDBhMCwgCisweGFmOTAwMTI0LCAweGFmOTIwMTFjLCAweDhmNDIwMzJjLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzMmMsIDB4MTAwMDAwMTUsIDB4OGY0MjAzMmMsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjRiOCwgMHgyNDAyMDJlMiwgMHhhZmEyMDAxMCwgMHhhZmEwMDAxNCwgCisweDhmODYwMTQ0LCAweDNjMDcwMDAxLCAweDI0ZTc2NGMwLCAweGMwMDJiM2IsIAorMHgzNDA1ZGVhZCwgMHg4ZjgyMDExYywgMHgzNDQyMDAwMiwgMHhhZjgyMDExYywgCisweDhmODIwMjIwLCAweDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDhmODIwMTQwLCAKKzB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMTQwLCAweDhmYmYwMDI0LCAKKzB4OGZiMjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgCisweDI3YmQwMDI4LCAweDYwMjEsIDB4NTAyMSwgMHgzMDIxLCAKKzB4MjgyMSwgMHg2ODIxLCAweDQ4MjEsIDB4NzgyMSwgCisweDcwMjEsIDB4OGY4ODAxMjQsIDB4OGY4NzAxMDQsIDB4MTU4MDAwMmUsIAorMHg4ZjhiMDExYywgMHgxMWEwMDAxNCwgMHgzMTYyMDgwMCwgMHg4ZjgyMDEyMCwgCisweDEwNDYwMDI5LCAweDAsIDB4M2MwNDAwMDEsIDB4OGM4NDZlZTQsIAorMHg4Y2MyMDAwMCwgMHg4Y2MzMDAwNCwgMHhhYzgyMDAwMCwgMHhhYzgzMDAwNCwgCisweDhjYzIwMDA4LCAweGFjODIwMDA4LCAweDk0YzIwMDBlLCAweGE0ODIwMDBlLCAKKzB4OGNjMjAwMTAsIDB4MjQwYzAwMDEsIDB4YWM4MjAwMTAsIDB4OGNjMjAwMTQsIAorMHgxMDAwMDAxMiwgMHgyNGM2MDAyMCwgMHgxMDQwMDAxNywgMHgwLCAKKzB4M2MwNDAwMDEsIDB4OGM4NDZlZTQsIDB4OGQwMjAwMDAsIDB4OGQwMzAwMDQsIAorMHhhYzgyMDAwMCwgMHhhYzgzMDAwNCwgMHg4ZDAyMDAwOCwgMHhhYzgyMDAwOCwgCisweDk1MDIwMDBlLCAweGE0ODIwMDBlLCAweDhkMDIwMDEwLCAweDI1MDYwMDIwLCAKKzB4YWM4MjAwMTAsIDB4OGQwMjAwMTQsIDB4MjQwYzAwMDEsIDB4YzAxODIxLCAKKzB4YWM4MjAwMTQsIDB4Mjc2MjRmZTAsIDB4NDMxMDJiLCAweDU0NDAwMDAxLCAKKzB4Mjc2MzQ4MDAsIDB4NjAzMDIxLCAweDE1NDAwMDJmLCAweDMxNjIwMTAwLCAKKzB4MTEyMDAwMTQsIDB4MzE2MjgwMDAsIDB4OGY4MjAxMDAsIDB4MTA0NTAwMmEsIAorMHgzMTYyMDEwMCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmVlMCwgMHg4Y2EyMDAwMCwgCisweDhjYTMwMDA0LCAweGFjODIwMDAwLCAweGFjODMwMDA0LCAweDhjYTIwMDA4LCAKKzB4YWM4MjAwMDgsIDB4OTRhMjAwMGUsIDB4YTQ4MjAwMGUsIDB4OGNhMjAwMTAsIAorMHgyNDBhMDAwMSwgMHhhYzgyMDAxMCwgMHg4Y2EyMDAxNCwgMHgxMDAwMDAxMiwgCisweDI0YTUwMDIwLCAweDEwNDAwMDE4LCAweDMxNjIwMTAwLCAweDNjMDQwMDAxLCAKKzB4OGM4NDZlZTAsIDB4OGNlMjAwMDAsIDB4OGNlMzAwMDQsIDB4YWM4MjAwMDAsIAorMHhhYzgzMDAwNCwgMHg4Y2UyMDAwOCwgMHhhYzgyMDAwOCwgMHg5NGUyMDAwZSwgCisweGE0ODIwMDBlLCAweDhjZTIwMDEwLCAweDI0ZTUwMDIwLCAweGFjODIwMDEwLCAKKzB4OGNlMjAwMTQsIDB4MjQwYTAwMDEsIDB4YTAxODIxLCAweGFjODIwMDE0LCAKKzB4Mjc2MjQ3ZTAsIDB4NDMxMDJiLCAweDU0NDAwMDAxLCAweDI3NjM0MDAwLCAKKzB4NjAyODIxLCAweDMxNjIwMTAwLCAweDU0NDAwMDFkLCAweDMxNjIxMDAwLCAKKzB4MTFhMDAwMDksIDB4MzFhMjA4MDAsIDB4MTA0MDAwMDQsIDB4MjUwMjAwMjAsIAorMHg4ZjgyMDBhOCwgMHhhNWUyMDAwMCwgMHgyNTAyMDAyMCwgMHhhZjgyMDEyNCwgCisweDhmODgwMTI0LCAweDY4MjEsIDB4MTE4MDAwMTEsIDB4MzE2MjEwMDAsIAorMHgzYzA0MDAwMSwgMHg4Yzg0NmVlNCwgMHg4YzgyMDAwMCwgMHg4YzgzMDAwNCwgCisweGFmODIwMDgwLCAweGFmODMwMDg0LCAweDhjODIwMDA4LCAweGFmODIwMGE0LCAKKzB4OTQ4MjAwMGUsIDB4YWY4MjAwYWMsIDB4OGM4MjAwMTAsIDB4NjAyMSwgCisweGFmODIwMGEwLCAweDhjOGQwMDEwLCAweDhjOGYwMDE0LCAweDMxNjIxMDAwLCAKKzB4MTQ0MGZmODIsIDB4MCwgMHgxMTIwMDAwZiwgMHgzMTIyMDgwMCwgCisweDEwNDAwMDA0LCAweDNjMDIwMDAyLCAweDhmODIwMGI4LCAweGE1YzIwMDAwLCAKKzB4M2MwMjAwMDIsIDB4MTIyMTAyNCwgMHgxMDQwMDAwNCwgMHgyNGUyMDAyMCwgCisweDhmODIwMGI0LCAweGFmODIwMGQ0LCAweDI0ZTIwMDIwLCAweGFmODIwMTA0LCAKKzB4OGY4NzAxMDQsIDB4NDgyMSwgMHgxMTQwZmY3MCwgMHgwLCAKKzB4M2MwNDAwMDEsIDB4OGM4NDZlZTAsIDB4OGM4MjAwMDAsIDB4OGM4MzAwMDQsIAorMHhhZjgyMDA5MCwgMHhhZjgzMDA5NCwgMHg4YzgyMDAwOCwgMHhhZjgyMDBiNCwgCisweDk0ODIwMDBlLCAweGFmODIwMDljLCAweDhjODIwMDEwLCAweDUwMjEsIAorMHhhZjgyMDBiMCwgMHg4Yzg5MDAxMCwgMHgxMDAwZmY2MCwgMHg4YzhlMDAxNCwgCisweDNlMDAwMDgsIDB4MCwgMHg2MDIxLCAweDU4MjEsIAorMHgzMDIxLCAweDI4MjEsIDB4NjgyMSwgMHg1MDIxLCAKKzB4NzgyMSwgMHg3MDIxLCAweDhmODgwMTI0LCAweDhmODcwMTA0LCAKKzB4M2MxODAxMDAsIDB4MTU4MDAwMmUsIDB4OGY4OTAxMWMsIDB4MTFhMDAwMTQsIAorMHgzMTIyMDgwMCwgMHg4ZjgyMDEyMCwgMHgxMDQ2MDAyOSwgMHgwLCAKKzB4M2MwNDAwMDEsIDB4OGM4NDZlZTQsIDB4OGNjMjAwMDAsIDB4OGNjMzAwMDQsIAorMHhhYzgyMDAwMCwgMHhhYzgzMDAwNCwgMHg4Y2MyMDAwOCwgMHhhYzgyMDAwOCwgCisweDk0YzIwMDBlLCAweGE0ODIwMDBlLCAweDhjYzIwMDEwLCAweDI0MGMwMDAxLCAKKzB4YWM4MjAwMTAsIDB4OGNjMjAwMTQsIDB4MTAwMDAwMTIsIDB4MjRjNjAwMjAsIAorMHgxMDQwMDAxNywgMHgwLCAweDNjMDQwMDAxLCAweDhjODQ2ZWU0LCAKKzB4OGQwMjAwMDAsIDB4OGQwMzAwMDQsIDB4YWM4MjAwMDAsIDB4YWM4MzAwMDQsIAorMHg4ZDAyMDAwOCwgMHhhYzgyMDAwOCwgMHg5NTAyMDAwZSwgMHhhNDgyMDAwZSwgCisweDhkMDIwMDEwLCAweDI1MDYwMDIwLCAweGFjODIwMDEwLCAweDhkMDIwMDE0LCAKKzB4MjQwYzAwMDEsIDB4YzAxODIxLCAweGFjODIwMDE0LCAweDI3NjI0ZmUwLCAKKzB4NDMxMDJiLCAweDU0NDAwMDAxLCAweDI3NjM0ODAwLCAweDYwMzAyMSwgCisweDE1NjAwMDJmLCAweDMxMjIwMTAwLCAweDExNDAwMDE0LCAweDMxMjI4MDAwLCAKKzB4OGY4MjAxMDAsIDB4MTA0NTAwMmEsIDB4MzEyMjAxMDAsIDB4M2MwNDAwMDEsIAorMHg4Yzg0NmVlMCwgMHg4Y2EyMDAwMCwgMHg4Y2EzMDAwNCwgMHhhYzgyMDAwMCwgCisweGFjODMwMDA0LCAweDhjYTIwMDA4LCAweGFjODIwMDA4LCAweDk0YTIwMDBlLCAKKzB4YTQ4MjAwMGUsIDB4OGNhMjAwMTAsIDB4MjQwYjAwMDEsIDB4YWM4MjAwMTAsIAorMHg4Y2EyMDAxNCwgMHgxMDAwMDAxMiwgMHgyNGE1MDAyMCwgMHgxMDQwMDAxOCwgCisweDMxMjIwMTAwLCAweDNjMDQwMDAxLCAweDhjODQ2ZWUwLCAweDhjZTIwMDAwLCAKKzB4OGNlMzAwMDQsIDB4YWM4MjAwMDAsIDB4YWM4MzAwMDQsIDB4OGNlMjAwMDgsIAorMHhhYzgyMDAwOCwgMHg5NGUyMDAwZSwgMHhhNDgyMDAwZSwgMHg4Y2UyMDAxMCwgCisweDI0ZTUwMDIwLCAweGFjODIwMDEwLCAweDhjZTIwMDE0LCAweDI0MGIwMDAxLCAKKzB4YTAxODIxLCAweGFjODIwMDE0LCAweDI3NjI0N2UwLCAweDQzMTAyYiwgCisweDU0NDAwMDAxLCAweDI3NjM0MDAwLCAweDYwMjgyMSwgMHgzMTIyMDEwMCwgCisweDU0NDAwMDFkLCAweDMxMjIxMDAwLCAweDExYTAwMDA5LCAweDMxYTIwODAwLCAKKzB4MTA0MDAwMDQsIDB4MjUwMjAwMjAsIDB4OGY4MjAwYTgsIDB4YTVlMjAwMDAsIAorMHgyNTAyMDAyMCwgMHhhZjgyMDEyNCwgMHg4Zjg4MDEyNCwgMHg2ODIxLCAKKzB4MTE4MDAwMTEsIDB4MzEyMjEwMDAsIDB4M2MwNDAwMDEsIDB4OGM4NDZlZTQsIAorMHg4YzgyMDAwMCwgMHg4YzgzMDAwNCwgMHhhZjgyMDA4MCwgMHhhZjgzMDA4NCwgCisweDhjODIwMDA4LCAweGFmODIwMGE0LCAweDk0ODIwMDBlLCAweGFmODIwMGFjLCAKKzB4OGM4MjAwMTAsIDB4NjAyMSwgMHhhZjgyMDBhMCwgMHg4YzhkMDAxMCwgCisweDhjOGYwMDE0LCAweDMxMjIxMDAwLCAweDE0NDAwMDIyLCAweDAsIAorMHgxMTQwMDAwZiwgMHgzMTQyMDgwMCwgMHgxMDQwMDAwNCwgMHgzYzAyMDAwMiwgCisweDhmODIwMGI4LCAweGE1YzIwMDAwLCAweDNjMDIwMDAyLCAweDE0MjEwMjQsIAorMHgxMDQwMDAwNCwgMHgyNGUyMDAyMCwgMHg4ZjgyMDBiNCwgMHhhZjgyMDBkNCwgCisweDI0ZTIwMDIwLCAweGFmODIwMTA0LCAweDhmODcwMTA0LCAweDUwMjEsIAorMHgxMTYwMDAxMCwgMHgwLCAweDNjMDQwMDAxLCAweDhjODQ2ZWUwLCAKKzB4OGM4MjAwMDAsIDB4OGM4MzAwMDQsIDB4YWY4MjAwOTAsIDB4YWY4MzAwOTQsIAorMHg4YzgyMDAwOCwgMHhhZjgyMDBiNCwgMHg5NDgyMDAwZSwgMHhhZjgyMDA5YywgCisweDhjODIwMDEwLCAweDU4MjEsIDB4YWY4MjAwYjAsIDB4OGM4YTAwMTAsIAorMHg4YzhlMDAxNCwgMHg4ZjgyMDA3MCwgMHgzYzAzMTAwMCwgMHg0MzEwMjQsIAorMHgxMDQwZmY1YywgMHgwLCAweDhmODIwMDU0LCAweDI0NDIwMDA1LCAKKzB4YWY4MjAwNzgsIDB4OGMwNDAyMzQsIDB4MTA4MDAwMTYsIDB4MTgyMSwgCisweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyNDBlOCwgMHgyNDQyMDAwNSwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyNDBlOCwgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg4YzQyNDBlOCwgMHg0NDEwMmIsIDB4MTQ0MDAwMDksIAorMHgyNDAyMDAwMSwgMHgzYzAzMDA4MCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhYzIwNDBlOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4MTAwMDAwMGMsIAorMHhhMDIyNDBmMCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjQwZjAsIAorMHgxNDQwMDAwNiwgMHgzYzAyMDA4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg5MDQyNDBmMSwgMHgxMDQwMDAwMiwgMHgzYzAyMDA4MCwgMHg2MjE4MjUsIAorMHg4YzA0MDIzMCwgMHgxMDgwMDAxMywgMHgwLCAweDNjMDIwMDAxLCAKKzB4NTcxMDIxLCAweDhjNDI0MGVjLCAweDI0NDIwMDA1LCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweGFjMjI0MGVjLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgCisweDhjNDI0MGVjLCAweDQ0MTAyYiwgMHgxNDQwMDAwNiwgMHgwLCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjA0MGVjLCAweDEwMDAwMDA2LCAKKzB4NzgxODI1LCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyNDBmMiwgCisweDU0NDAwMDAxLCAweDc4MTgyNSwgMHgxMDYwZmYxYSwgMHgwLCAKKzB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwgMHhhZjgwMDA0YywgCisweDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsIAorMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLCAKKzB4MCwgMHg4ZjgyMDA2MCwgMHg0MzEwMjUsIDB4YWY4MjAwNjAsIAorMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAweDEwMDBmZjA1LCAKKzB4YWY4MDAwNGMsIDB4MTAwMGZmMDMsIDB4YWY4MDAwNDgsIDB4M2UwMDAwOCwgCisweDAsIDB4MCwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjZkMjgsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTQsIDB4MTQ0MDAwMTIsIAorMHhhZmIwMDAxMCwgMHgzYzEwMDAwMSwgMHgyNjEwNmY5MCwgMHgyMDAyMDIxLCAKKzB4YzAwMmJhOCwgMHgyNDA1MjAwMCwgMHgyNjAyMWZlMCwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZWVjLCAweDNjMDEwMDAxLCAweGFjMjI2ZWU4LCAweGFjMDIwMjUwLCAKKzB4MjQwMjIwMDAsIDB4YWMxMDAyNTQsIDB4YWMwMjAyNTgsIDB4MjQwMjAwMDEsIAorMHgzYzAxMDAwMSwgMHhhYzIyNmQyOCwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgCisweDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4M2MwOTAwMDEsIDB4OGQyOTZlZWMsIAorMHg4YzgyMDAwMCwgMHg4ZmEzMDAxMCwgMHg4ZmE4MDAxNCwgMHhhZDIyMDAwMCwgCisweDhjODIwMDA0LCAweGFkMjUwMDA4LCAweGFkMjIwMDA0LCAweDhmODIwMDU0LCAKKzB4YWQyNjAwMTAsIDB4YWQyNzAwMTQsIDB4YWQyMzAwMTgsIDB4YWQyODAwMWMsIAorMHhhZDIyMDAwYywgMHgyNTI5ZmZlMCwgMHgzYzAyMDAwMSwgMHgyNDQyNmY5MCwgCisweDEyMjEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHgzYzA5MDAwMSwgCisweDhkMjk2ZWU4LCAweDNjMDIwMDAxLCAweDhjNDI2ZDEwLCAweGFkMjIwMDAwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZkMTAsIDB4M2MwMTAwMDEsIDB4YWMyOTZlZWMsIAorMHhhZDIyMDAwNCwgMHhhYzA5MDI1MCwgMHgzZTAwMDA4LCAweDAsIAorMHgyN2JkZmZkMCwgMHhhZmIwMDAxMCwgMHgzYzEwMDAwMSwgMHg4ZTEwNmVlYywgCisweDNjMDIwMDAxLCAweDhjNDI2ZDEwLCAweGFmYjEwMDE0LCAweDgwODgyMSwgCisweGFmYmUwMDI0LCAweDhmYmUwMDQwLCAweDhmYTQwMDQ4LCAweGFmYjIwMDE4LCAKKzB4YTA5MDIxLCAweGFmYmYwMDI4LCAweGFmYjUwMDIwLCAweGFmYjMwMDFjLCAKKzB4YWUwMjAwMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkMTAsIDB4YzA5ODIxLCAKKzB4ZTBhODIxLCAweDEwODAwMDA2LCAweGFlMDIwMDA0LCAweDI2MDUwMDA4LCAKKzB4YzAwMmJiMywgMHgyNDA2MDAxOCwgMHgxMDAwMDAwNSwgMHgyNjEwZmZlMCwgCisweDI2MDQwMDA4LCAweGMwMDJiYTgsIDB4MjQwNTAwMTgsIDB4MjYxMGZmZTAsIAorMHgzYzAzMDAwMSwgMHgyNDYzNmY5MCwgMHgyMDMxMDJiLCAweDEwNDAwMDAzLCAKKzB4MCwgMHgzYzEwMDAwMSwgMHg4ZTEwNmVlOCwgMHg4ZTIyMDAwMCwgCisweGFlMDIwMDAwLCAweDhlMjIwMDA0LCAweGFlMTIwMDA4LCAweGFlMDIwMDA0LCAKKzB4OGY4MjAwNTQsIDB4YWUxMzAwMTAsIDB4YWUxNTAwMTQsIDB4YWUxZTAwMTgsIAorMHg4ZmE4MDA0NCwgMHhhZTA4MDAxYywgMHhhZTAyMDAwYywgMHgyNjEwZmZlMCwgCisweDIwMzEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHgzYzEwMDAwMSwgCisweDhlMTA2ZWU4LCAweDNjMDIwMDAxLCAweDhjNDI2ZDEwLCAweGFlMDIwMDAwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZkMTAsIDB4M2MwMTAwMDEsIDB4YWMzMDZlZWMsIAorMHhhZTAyMDAwNCwgMHhhYzEwMDI1MCwgMHg4ZmJmMDAyOCwgMHg4ZmJlMDAyNCwgCisweDhmYjUwMDIwLCAweDhmYjMwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAKKzB4OGZiMDAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAzMCwgMHg4NTE4MjEsIAorMHg4MzEwMmIsIDB4MTA0MDAwMDYsIDB4MCwgMHhhYzgwMDAwMCwgCisweDI0ODQwMDA0LCAweDgzMTAyYiwgMHg1NDQwZmZmZCwgMHhhYzgwMDAwMCwgCisweDNlMDAwMDgsIDB4MCwgMHhhNjE4MjEsIDB4YTMxMDJiLCAKKzB4MTA0MDAwMDcsIDB4MCwgMHg4YzgyMDAwMCwgMHhhY2EyMDAwMCwgCisweDI0YTUwMDA0LCAweGEzMTAyYiwgMHgxNDQwZmZmYiwgMHgyNDg0MDAwNCwgCisweDNlMDAwMDgsIDB4MCwgMHg4NjE4MjEsIDB4ODMxMDJiLCAKKzB4MTA0MDAwMDcsIDB4MCwgMHg4Y2EyMDAwMCwgMHhhYzgyMDAwMCwgCisweDI0ODQwMDA0LCAweDgzMTAyYiwgMHgxNDQwZmZmYiwgMHgyNGE1MDAwNCwgCisweDNlMDAwMDgsIDB4MCwgMHg2MzA4MCwgMHg4NjE4MjEsIAorMHg4MzEwMmIsIDB4MTA0MDAwMDYsIDB4MCwgMHhhYzg1MDAwMCwgCisweDI0ODQwMDA0LCAweDgzMTAyYiwgMHg1NDQwZmZmZCwgMHhhYzg1MDAwMCwgCisweDNlMDAwMDgsIDB4MCwgMHgwLCAweDI2ZTUwMDI4LCAKKzB4YTAzMDIxLCAweDI3NDMwMWMwLCAweDhmNGQwMzU4LCAweDhmNDcwMzVjLCAKKzB4OGY0ODAzNjAsIDB4OGY0OTAzNjQsIDB4OGY0YTAzNjgsIDB4OGY0YjAyMDQsIAorMHg4ZjRjMDIwMCwgMHgyNDY0MDQwMCwgMHg2NDEwMmIsIDB4MTA0MDAwMDgsIAorMHgzYzAyMDhmZiwgMHg4Y2MyMDAwMCwgMHhhYzYyMDAwMCwgMHgyNDYzMDAwNCwgCisweDY0MTAyYiwgMHgxNDQwZmZmYiwgMHgyNGM2MDAwNCwgMHgzYzAyMDhmZiwgCisweDM0NDJmZmZmLCAweDNjMDNjMGZmLCAweGFmNGQwMzU4LCAweGFmNDcwMzVjLCAKKzB4YWY0ODAzNjAsIDB4YWY0OTAzNjQsIDB4YWY0YTAzNjgsIDB4YWY0YjAyMDQsIAorMHhhZjRjMDIwMCwgMHg4Zjg0MDIyMCwgMHgzNDYzZmZmZiwgMHg4Zjg2MDIwMCwgCisweDgyMTAyNCwgMHgzNDQyMDAwNCwgMHhjMzE4MjQsIDB4MzQ2MzAwMDQsIAorMHhhZjgyMDIyMCwgMHhhZjgzMDIwMCwgMHg4Y2EyMDIxNCwgMHhhYzAyMDA4NCwgCisweDhjYTIwMjE4LCAweGFjMDIwMDg4LCAweDhjYTIwMjFjLCAweGFjMDIwMDhjLCAKKzB4OGNhMjAyMjAsIDB4YWMwMjAwOTAsIDB4OGNhMjAyMjQsIDB4YWMwMjAwOTQsIAorMHg4Y2EyMDIyOCwgMHhhYzAyMDA5OCwgMHg4Y2EyMDIyYywgMHhhYzAyMDA5YywgCisweDhjYTIwMjMwLCAweGFjMDIwMGEwLCAweDhjYTIwMjM0LCAweGFjMDIwMGE0LCAKKzB4OGNhMjAyMzgsIDB4YWMwMjAwYTgsIDB4OGNhMjAyM2MsIDB4YWMwMjAwYWMsIAorMHg4Y2EyMDI0MCwgMHhhYzAyMDBiMCwgMHg4Y2EyMDI0NCwgMHhhYzAyMDBiNCwgCisweDhjYTIwMjQ4LCAweGFjMDIwMGI4LCAweDhjYTIwMjRjLCAweGFjMDIwMGJjLCAKKzB4OGNhMjAwMWMsIDB4YWMwMjAwODAsIDB4OGNhMjAwMTgsIDB4YWMwMjAwYzAsIAorMHg4Y2EyMDAyMCwgMHhhYzAyMDBjYywgMHg4Y2EyMDAyNCwgMHhhYzAyMDBkMCwgCisweDhjYTIwMWQwLCAweGFjMDIwMGUwLCAweDhjYTIwMWQ0LCAweGFjMDIwMGU0LCAKKzB4OGNhMjAxZDgsIDB4YWMwMjAwZTgsIDB4OGNhMjAxZGMsIDB4YWMwMjAwZWMsIAorMHg4Y2EyMDFlMCwgMHhhYzAyMDBmMCwgMHg4Y2EyMDA5OCwgMHg4Y2EzMDA5YywgCisweGFjMDMwMGZjLCAweDhjYTIwMGE4LCAweDhjYTMwMGFjLCAweGFjMDMwMGY0LCAKKzB4OGNhMjAwYTAsIDB4OGNhMzAwYTQsIDB4MzA4NDAwMDQsIDB4YWMwMzAwZjgsIAorMHgxNDgwMDAwNywgMHgzMGMyMDAwNCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgCisweDM0NjNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHgzMGMyMDAwNCwgCisweDE0NDAwMDA2LCAweDAsIDB4OGY4MjAyMDAsIDB4M2MwM2MwZmYsIAorMHgzNDYzZmZmYiwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsIDB4OGY0MjAyZGMsIAorMHhhMzQwMDVjNSwgMHgyNDQyMDAwMSwgMHhhZjQyMDJkYywgMHg4ZjQyMDJkYywgCisweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyNCwgCisweGFmYjAwMDIwLCAweDhmNDMwMDI0LCAweDhmNDIwMDIwLCAweDEwNjIwMDM4LCAKKzB4MCwgMHg4ZjQzMDAyMCwgMHg4ZjQyMDAyNCwgMHg2MjIwMjMsIAorMHg0ODEwMDAzLCAweDAsIDB4OGY0MjAwNDAsIDB4ODIyMDIxLCAKKzB4OGY0MzAwMzAsIDB4OGY0MjAwMjQsIDB4NDMxMDJiLCAweDE0NDAwMDA1LCAKKzB4MCwgMHg4ZjQzMDA0MCwgMHg4ZjQyMDAyNCwgMHgxMDAwMDAwNSwgCisweDYyMTAyMywgMHg4ZjQyMDAzMCwgMHg4ZjQzMDAyNCwgMHg0MzEwMjMsIAorMHgyNDQyZmZmZiwgMHg0MDYwMjEsIDB4OGMxMDJhLCAweDU0NDAwMDAxLCAKKzB4ODA2MDIxLCAweDhmNGEwMDI0LCAweDhmNDkwMDQwLCAweDhmNDgwMDI0LCAKKzB4OGY0NDAxODAsIDB4OGY0NTAxODQsIDB4OGY0NjAwMjQsIDB4OGY0YjAwMWMsIAorMHgyNDA3MDAwMSwgMHhhZmE3MDAxMCwgMHg4NDEwMCwgMHgxMDAxODIxLCAKKzB4MTRjNTAyMSwgMHgyNTI5ZmZmZiwgMHgxNDk4MDI0LCAweGFmYjAwMDE0LCAKKzB4OGY0NzAwMTQsIDB4MTAyMSwgMHg2MzEwMCwgMHhhZmE3MDAxOCwgCisweGEzMjgyMSwgMHhhMzM4MmIsIDB4ODIyMDIxLCAweDg3MjAyMSwgCisweDhmNDIwMTA4LCAweDE2NjMwMjEsIDB4NDBmODA5LCAweGMzOTAwLCAKKzB4NTQ0MDAwMDEsIDB4YWY1MDAwMjQsIDB4OGY0MzAwMjQsIDB4OGY0MjAwMjAsIAorMHgxNDYyMDAxOCwgMHgwLCAweDhmNDIwMDAwLCAweDEwNDAwMDA3LCAKKzB4MCwgMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgCisweDAsIDB4MTAwMDAwMDUsIDB4MCwgMHhhZjgwMDA0OCwgCisweDhmODIwMDQ4LCAweDEwNDBmZmZkLCAweDAsIDB4OGY4MjAwNjAsIAorMHgyNDAzZmZlZiwgMHg0MzEwMjQsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsIAorMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDAyLCAweGFmODAwMDRjLCAKKzB4YWY4MDAwNDgsIDB4OGZiZjAwMjQsIDB4OGZiMDAwMjAsIDB4M2UwMDAwOCwgCisweDI3YmQwMDI4LCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZjMCwgCisweDMyYzIwMDIwLCAweGFmYmYwMDM4LCAweGFmYjMwMDM0LCAweGFmYjIwMDMwLCAKKzB4YWZiMTAwMmMsIDB4MTA0MDAwMDQsIDB4YWZiMDAwMjgsIDB4OGY1MzAwMjgsIAorMHgxMDAwMDAwMiwgMHgwLCAweDhmNTMwMDIwLCAweDhmNDIwMDMwLCAKKzB4MTA1MzAwZWIsIDB4MjExMDAsIDB4OGY0MzAwMWMsIDB4NjI4MDIxLCAKKzB4OGUwNDAwMDAsIDB4OGUwNTAwMDQsIDB4OTYxMjAwMDgsIDB4OGY0MjAwOTAsIAorMHg5NjExMDAwYSwgMHgzMjQ2ZmZmZiwgMHg0NjEwMmEsIDB4MTA0MDAwMTcsIAorMHgwLCAweDhmODIwMGQ4LCAweDhmNDMwMDk4LCAweDQzMTAyMywgCisweDI0NDJkY2JlLCAweGFmNDIwMDkwLCAweDhmNDIwMDkwLCAweDI4NDJkY2JmLCAKKzB4MTA0MDAwMDUsIDB4MCwgMHg4ZjQyMDA5MCwgMHg4ZjQzMDE0NCwgCisweDQzMTAyMSwgMHhhZjQyMDA5MCwgMHg4ZjQyMDA5MCwgMHg0NjEwMmEsIAorMHgxMDQwMDAwNiwgMHgwLCAweDhmNDIwMzQ4LCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzNDgsIDB4MTAwMDAwZTEsIDB4OGY0MjAzNDgsIDB4OGY4MjAwZmMsIAorMHgxNDQwMDAwNiwgMHgwLCAweDhmNDIwMzQ0LCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzNDQsIDB4MTAwMDAwZDksIDB4OGY0MjAzNDQsIDB4OTM0MjA1YzIsIAorMHgxMDQwMDAwYiwgMHgzMmMyMDAwOCwgMHgxMDQwMDAwOCwgMHgzMjIyMDIwMCwgCisweDEwNDAwMDA2LCAweDNjMDM0MDAwLCAweDk2MDIwMDBlLCAweGFmNDMwMGFjLCAKKzB4MjE0MDAsIDB4MTAwMDAwMDIsIDB4YWY0MjAwYjAsIDB4YWY0MDAwYWMsIAorMHgzMjIyMDAwNCwgMHgxMDQwMDA3ZiwgMHgzMjIyMDgwMCwgMHgxMDQwMDAwMywgCisweDMyNDdmZmZmLCAweDEwMDAwMDAyLCAweDI0MDIwMDIwLCAweDI0MDIwMDA0LCAKKzB4YWZhMjAwMTAsIDB4OGY0MjAwMzAsIDB4YWZhMjAwMTQsIDB4OGY0MjAwMTAsIAorMHgzYzAzMDAwMiwgMHg0MzEwMjUsIDB4YWZhMjAwMTgsIDB4OGY0NjAwOTgsIAorMHg4ZjQyMDEwOCwgMHg0MGY4MDksIDB4MCwgMHgxMDQwMDBiNywgCisweDAsIDB4OGY0MjAwOWMsIDB4OGY0MzAwOTQsIDB4MjQyMTAyMSwgCisweGFmNDIwMDljLCAweGFlMDMwMDBjLCAweDhmNDIwMGFjLCAweDEwNDAwMDA4LCAKKzB4M2MwMzQwMDAsIDB4OGY0MjAwOTQsIDB4NDMxMDI1LCAweGFmYTIwMDIwLCAKKzB4OGY0MjAwOWMsIDB4OGY0MzAwYjAsIDB4MTAwMDAwMDQsIDB4NDMxMDI1LCAKKzB4OGY0MjAwOTQsIDB4YWZhMjAwMjAsIDB4OGY0MjAwOWMsIDB4YWZhMjAwMjQsIAorMHg4ZjgyMDBmYywgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDAwMCwgCisweGFjNDQwMDA0LCAweDI0NDIwMDA4LCAweGFmODIwMGYwLCAweDhmNDIwMDljLCAKKzB4OGY0NDAyNzAsIDB4OGY0NTAyNzQsIDB4NDAxODIxLCAweDEwMjEsIAorMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsIAorMHgzMjIzMDA2MCwgMHgyNDAyMDA0MCwgMHhhZjQ0MDI3MCwgMHhhZjQ1MDI3NCwgCisweDEwNjIwMDE3LCAweDJjNjIwMDQxLCAweDEwNDAwMDA1LCAweDI0MDIwMDIwLCAKKzB4MTA2MjAwMDgsIDB4MjQwMjAwMDEsIDB4MTAwMDAwMjYsIDB4MCwgCisweDI0MDIwMDYwLCAweDEwNjIwMDE5LCAweDI0MDIwMDAxLCAweDEwMDAwMDIxLCAKKzB4MCwgMHg4ZjQyMDI3OCwgMHg4ZjQzMDI3YywgMHgyNDYzMDAwMSwgCisweDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZjQyMDI3OCwgMHhhZjQzMDI3YywgCisweDhmNDIwMjc4LCAweDhmNDMwMjdjLCAweDEwMDAwMDE2LCAweDI0MDIwMDAxLCAKKzB4OGY0MjAyODAsIDB4OGY0MzAyODQsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIAorMHg0NDEwMjEsIDB4YWY0MjAyODAsIDB4YWY0MzAyODQsIDB4OGY0MjAyODAsIAorMHg4ZjQzMDI4NCwgMHgxMDAwMDAwYiwgMHgyNDAyMDAwMSwgMHg4ZjQyMDI4OCwgCisweDhmNDMwMjhjLCAweDI0NjMwMDAxLCAweDJjNjQwMDAxLCAweDQ0MTAyMSwgCisweGFmNDIwMjg4LCAweGFmNDMwMjhjLCAweDhmNDIwMjg4LCAweDhmNDMwMjhjLCAKKzB4MjQwMjAwMDEsIDB4YTM0MjA1YzIsIDB4OGY0MjAwOTgsIDB4MzI0NGZmZmYsIAorMHgyNDA2ZmZmOCwgMHg4ZjQ1MDEzYywgMHg0NDEwMjEsIDB4MjQ0MjAwMDcsIAorMHg0NjEwMjQsIDB4MjQ4NDAwMDcsIDB4YWY0MjAwOTQsIDB4OGY0MjAwOTAsIAorMHg4ZjQzMDA5NCwgMHg4NjIwMjQsIDB4NDQxMDIzLCAweDY1MTgyYiwgCisweDE0NjAwMDA1LCAweGFmNDIwMDkwLCAweDhmNDIwMDk0LCAweDhmNDMwMTQ0LCAKKzB4NDMxMDIzLCAweGFmNDIwMDk0LCAweDhmNDIwMDk0LCAweDEwMDAwMDIzLCAKKzB4YWY0MDAwOWMsIDB4MzI0N2ZmZmYsIDB4NTBlMDAwMjIsIDB4MzJjMjAwMjAsIAorMHgxNDQwMDAwMiwgMHgyNDAyMDAxMCwgMHgyNDAyMDAwMiwgMHhhZmEyMDAxMCwgCisweDhmNDIwMDMwLCAweGFmYTIwMDE0LCAweDhmNDIwMDEwLCAweGFmYTIwMDE4LCAKKzB4OGY0NjAwOTgsIDB4OGY0MjAxMDgsIDB4NDBmODA5LCAweDAsIAorMHgxMDQwMDAzYSwgMHgzMjQ1ZmZmZiwgMHg4ZjQyMDA5OCwgMHg4ZjQzMDA5MCwgCisweDhmNDYwMTNjLCAweDQ1MTAyMSwgMHhhZjQyMDA5OCwgMHg4ZjQyMDA5YywgCisweDhmNDQwMDk4LCAweGEzNDAwNWMyLCAweDY1MTgyMywgMHhhZjQzMDA5MCwgCisweDQ1MTAyMSwgMHg4NjIwMmIsIDB4MTQ4MDAwMDUsIDB4YWY0MjAwOWMsIAorMHg4ZjQyMDA5OCwgMHg4ZjQzMDE0NCwgMHg0MzEwMjMsIDB4YWY0MjAwOTgsIAorMHgzMmMyMDAyMCwgMHgxMDQwMDAwNSwgMHgwLCAweDhmNDIwMzU4LCAKKzB4MjQ0MmZmZmYsIDB4YWY0MjAzNTgsIDB4OGY0MjAzNTgsIDB4OGY0MjAwMzAsIAorMHg4ZjQzMDA0MCwgMHgyNDQyMDAwMSwgMHgyNDYzZmZmZiwgMHg0MzEwMjQsIAorMHhhZjQyMDAzMCwgMHg4ZjQyMDAzMCwgMHgxNDUzMDAxOCwgMHgwLCAKKzB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwgMHhhZjgwMDA0YywgCisweDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsIAorMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLCAKKzB4MCwgMHg4ZjgyMDA2MCwgMHgyNDAzZmZmNywgMHg0MzEwMjQsIAorMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAKKzB4MTAwMDAwMDIsIDB4YWY4MDAwNGMsIDB4YWY4MDAwNDgsIDB4OGZiZjAwMzgsIAorMHg4ZmIzMDAzNCwgMHg4ZmIyMDAzMCwgMHg4ZmIxMDAyYywgMHg4ZmIwMDAyOCwgCisweDNlMDAwMDgsIDB4MjdiZDAwNDAsIDB4M2UwMDAwOCwgMHgwLCAKKzB4MjdiZGZmZDAsIDB4MzJjMjAwMjAsIDB4YWZiZjAwMmMsIDB4YWZiMjAwMjgsIAorMHhhZmIxMDAyNCwgMHgxMDQwMDAwNCwgMHhhZmIwMDAyMCwgMHg4ZjUyMDAyOCwgCisweDEwMDAwMDAyLCAweDAsIDB4OGY1MjAwMjAsIDB4OGY0MjAwMzAsIAorMHgxMDUyMDBiNSwgMHgyMTEwMCwgMHg4ZjQzMDAxYywgMHg2MjgwMjEsIAorMHg4ZTA0MDAwMCwgMHg4ZTA1MDAwNCwgMHg5NjExMDAwOCwgMHg4ZjQyMDA5MCwgCisweDk2MDcwMDBhLCAweDMyMjZmZmZmLCAweDQ2MTAyYSwgMHgxMDQwMDAxNywgCisweDAsIDB4OGY4MjAwZDgsIDB4OGY0MzAwOTgsIDB4NDMxMDIzLCAKKzB4MjQ0MmRjNDYsIDB4YWY0MjAwOTAsIDB4OGY0MjAwOTAsIDB4Mjg0MmRjNDcsIAorMHgxMDQwMDAwNSwgMHgwLCAweDhmNDIwMDkwLCAweDhmNDMwMTQ0LCAKKzB4NDMxMDIxLCAweGFmNDIwMDkwLCAweDhmNDIwMDkwLCAweDQ2MTAyYSwgCisweDEwNDAwMDA2LCAweDAsIDB4OGY0MjAzNDgsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDM0OCwgMHgxMDAwMDBhYiwgMHg4ZjQyMDM0OCwgMHg4Zjg2MDBmYywgCisweDEwYzAwMDBjLCAweDAsIDB4OGY4MjAwZjQsIDB4MjQwM2ZmZjgsIAorMHg0MzEwMjQsIDB4NDYxMDIzLCAweDIxOGMzLCAweDU4NjAwMDAxLCAKKzB4MjQ2MzAxMDAsIDB4OGY0MjAwOGMsIDB4NDMxMDJiLCAweDE0NDAwMDA2LCAKKzB4NzEyYzIsIDB4OGY0MjAzNDQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNDQsIAorMHgxMDAwMDA5OCwgMHg4ZjQyMDM0NCwgMHg5MzQzMDVjMiwgMHgxMDYwMDAwZiwgCisweDMwNDYwMDAxLCAweDhmNDIwMDEwLCAweDM0NDgwNDAwLCAweDMyYzIwMDA4LCAKKzB4MTA0MDAwMDgsIDB4MzBlMjAyMDAsIDB4MTA0MDAwMDYsIDB4M2MwMzQwMDAsIAorMHg5NjAyMDAwZSwgMHhhZjQzMDBhYywgMHgyMTQwMCwgMHgxMDAwMDAwNCwgCisweGFmNDIwMGIwLCAweDEwMDAwMDAyLCAweGFmNDAwMGFjLCAweDhmNDgwMDEwLCAKKzB4MzBlMjAwMDQsIDB4MTA0MDAwNDUsIDB4MzIyN2ZmZmYsIDB4OGY0OTAwYWMsIAorMHgxMTIwMDAwNSwgMHgzMGMyMDBmZiwgMHgxNDQwMDAwNiwgMHgyNDAyMDA0MCwgCisweDEwMDAwMDA0LCAweDI0MDIwMDA4LCAweDE0NDAwMDAyLCAweDI0MDIwMDIwLCAKKzB4MjQwMjAwMDQsIDB4YWZhMjAwMTAsIDB4OGY0MzAwMzAsIDB4MTEyMDAwMDQsIAorMHhhZmEzMDAxNCwgMHg4ZjQyMDBiMCwgMHg2MjEwMjUsIDB4YWZhMjAwMTQsIAorMHgzYzAyMDAwMiwgMHgxMDIxMDI1LCAweGFmYTIwMDE4LCAweDhmNDYwMDk4LCAKKzB4OGY0MjAxMDgsIDB4NDBmODA5LCAweDAsIDB4MTA0MDAwNjksIAorMHgzMjI0ZmZmZiwgMHg4ZjQyMDA4YywgMHg4ZjQzMDA5NCwgMHgyNDQyMDAwMSwgCisweGFmNDIwMDhjLCAweDI0MDIwMDAxLCAweGFlMDMwMDBjLCAweGEzNDIwNWMyLCAKKzB4OGY0MjAwOTgsIDB4MjQwNmZmZjgsIDB4OGY0NTAxM2MsIDB4NDQxMDIxLCAKKzB4MjQ0MjAwMDcsIDB4NDYxMDI0LCAweDI0ODQwMDA3LCAweGFmNDIwMDk0LCAKKzB4OGY0MjAwOTAsIDB4OGY0MzAwOTQsIDB4ODYyMDI0LCAweDQ0MTAyMywgCisweDY1MTgyYiwgMHgxNDYwMDAwNSwgMHhhZjQyMDA5MCwgMHg4ZjQyMDA5NCwgCisweDhmNDMwMTQ0LCAweDQzMTAyMywgMHhhZjQyMDA5NCwgMHg4ZjQzMDA5NCwgCisweDhmNDIwMTQwLCAweDQzMTAyYiwgMHgxMDQwMDAwOSwgMHgwLCAKKzB4OGY0MzAxM2MsIDB4OGY0NDAwOTQsIDB4OGY0MjAwOTAsIDB4OGY0NTAxMzgsIAorMHg2NDE4MjMsIDB4NDMxMDIzLCAweGFmNDIwMDkwLCAweGFmNDUwMDk0LCAKKzB4OGY0MjAwOTQsIDB4MTAwMDAwMWYsIDB4YWY0MjAwOTgsIDB4MTBlMDAwMWQsIAorMHgzMGMyMDBmZiwgMHgxNDQwMDAwMiwgMHgyNDAyMDAxMCwgMHgyNDAyMDAwMiwgCisweGFmYTIwMDEwLCAweDhmNDIwMDMwLCAweGFmYTgwMDE4LCAweGFmYTIwMDE0LCAKKzB4OGY0NjAwOTgsIDB4OGY0MjAxMDgsIDB4NDBmODA5LCAweDAsIAorMHgxMDQwMDAzMCwgMHgzMjI1ZmZmZiwgMHg4ZjQyMDA5OCwgMHg4ZjQ0MDEzYywgCisweDQ1MTAyMSwgMHhhZjQyMDA5OCwgMHg4ZjQyMDA5MCwgMHg4ZjQzMDA5OCwgCisweGEzNDAwNWMyLCAweDQ1MTAyMywgMHg2NDE4MmIsIDB4MTQ2MDAwMDUsIAorMHhhZjQyMDA5MCwgMHg4ZjQyMDA5OCwgMHg4ZjQzMDE0NCwgMHg0MzEwMjMsIAorMHhhZjQyMDA5OCwgMHg4ZjQyMDAzMCwgMHg4ZjQzMDA0MCwgMHgyNDQyMDAwMSwgCisweDI0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjQyMDAzMCwgMHg4ZjQyMDAzMCwgCisweDE0NTIwMDE4LCAweDAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIAorMHgwLCAweGFmODAwMDRjLCAweDhmODIwMDRjLCAweDEwNDBmZmZkLCAKKzB4MCwgMHgxMDAwMDAwNSwgMHgwLCAweGFmODAwMDQ4LCAKKzB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA2MCwgCisweDI0MDNmZmY3LCAweDQzMTAyNCwgMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgCisweDEwNDAwMDAzLCAweDAsIDB4MTAwMDAwMDIsIDB4YWY4MDAwNGMsIAorMHhhZjgwMDA0OCwgMHg4ZmJmMDAyYywgMHg4ZmIyMDAyOCwgMHg4ZmIxMDAyNCwgCisweDhmYjAwMDIwLCAweDNlMDAwMDgsIDB4MjdiZDAwMzAsIDB4M2UwMDAwOCwgCisweDAsIDB4MjdiZGZmZDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJlYzAsIAorMHhhZmJmMDAyMCwgMHg4ZjQzMDBmMCwgMHg4Zjg0MDEwOCwgMHgyZTIxMDIxLCAKKzB4NTQ2MjAwMDQsIDB4MjQ2MjAwMDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJjYzAsIAorMHgyZTIxMDIxLCAweDQwMTgyMSwgMHhhZjQzMDBmMCwgMHhhYzYwMDAwMCwgCisweDhmNDIwMGVjLCAweDhjNjYwMDA0LCAweDE0NjIwMDA0LCAweDNjMDIwMDAxLCAKKzB4MjQ4MjAwMjAsIDB4MTAwMDAwMGYsIDB4YWY4MjAxMDgsIDB4OGY0MzAwZjAsIAorMHgzNDQyMmVjMCwgMHgyZTIxMDIxLCAweDU0NjIwMDA0LCAweDI0NjIwMDA4LCAKKzB4M2MwMjAwMDEsIDB4MzQ0MjJjYzAsIDB4MmUyMTAyMSwgMHg0MDE4MjEsIAorMHg4YzYyMDAwNCwgMHgyMTE0MCwgMHg4MjEwMjEsIDB4YWY4MjAxMDgsIAorMHhhYzYwMDAwMCwgMHg4Yzg1MDAxOCwgMHgzMGEyMDAzNiwgMHgxMDQwMDA2YywgCisweDMwYTIwMDAxLCAweDhjODIwMDFjLCAweDhmNDMwMDQwLCAweDhmNDQwMDM0LCAKKzB4MjQ0MjAwMDEsIDB4MjQ2M2ZmZmYsIDB4NDMxMDI0LCAweDg2MjAyMSwgCisweGFmNDIwMDJjLCAweDMwYTIwMDMwLCAweDE0NDAwMDA2LCAweGFmNDQwMDM0LCAKKzB4OGY0MjAwMzQsIDB4OGMwMzAyM2MsIDB4NDMxMDJiLCAweDE0NDAwMGI0LCAKKzB4MCwgMHgzMmMyMDAxMCwgMHgxMDQwMDAyOCwgMHgyNDA3MDAwOCwgCisweDhmNDQwMTcwLCAweDhmNDUwMTc0LCAweDhmNDMwMDJjLCAweDhmNDgwMDBjLCAKKzB4OGY4NjAxMjAsIDB4MjQwMjAwODAsIDB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIAorMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsIAorMHgxNDQwMDAxMSwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhMDIyNDBmMSwgMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyOCwgCisweDNjMDQwMDAxLCAweDI0ODQ2N2M0LCAweGFmYTIwMDE0LCAweDhmNDYwMDJjLCAKKzB4OGY4NzAxMjAsIDB4M2MwNTAwMDksIDB4YzAwMmIzYiwgMHgzNGE1MTEwMCwgCisweDEwMDAwMDM2LCAweDAsIDB4OGY0MjAzMDAsIDB4OGY0MzAwMmMsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDMwMCwgMHg4ZjQyMDMwMCwgMHgyNDAyMDAwMSwgCisweGEzNDIwNWMxLCAweDEwMDAwMDI2LCAweGFmNDMwMDM4LCAweDhmNDQwMTcwLCAKKzB4OGY0NTAxNzQsIDB4OGY0MzAwMmMsIDB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsIAorMHgyNDAyMDAyMCwgMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwgCisweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwMDAxMSwgCisweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIyNDBmMCwgCisweDhmODIwMTI0LCAweGFmYTIwMDEwLCAweDhmODIwMTI4LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDY3YjgsIDB4YWZhMjAwMTQsIDB4OGY0NjAwMmMsIDB4OGY4NzAxMjAsIAorMHgzYzA1MDAwOSwgMHhjMDAyYjNiLCAweDM0YTUwOTAwLCAweDEwMDAwMDBmLCAKKzB4MCwgMHg4ZjQyMDMwMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwMCwgCisweDhmNDIwMzAwLCAweDhmNDIwMDJjLCAweGEzNDAwNWMxLCAweGFmNDIwMDM4LCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA0MGYxLCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweGEwMjA0MGYwLCAweGFmNDAwMDM0LCAweDhmNDIwMzE0LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzMTQsIDB4MTAwMDAwNTksIDB4OGY0MjAzMTQsIAorMHgxMDQwMDAyMiwgMHgzMGEyNzAwMCwgMHg4Yzg1MDAxYywgMHg4ZjQyMDAyOCwgCisweGEyMjAyMywgMHg0ODEwMDAzLCAweDAsIDB4OGY0MjAwNDAsIAorMHg4MjIwMjEsIDB4OGY0MjAzNTgsIDB4OGY0MzAwMDAsIDB4YWY0NTAwMjgsIAorMHg0NDEwMjEsIDB4MTA2MDAwMDcsIDB4YWY0MjAzNTgsIDB4YWY4MDAwNGMsIAorMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAKKzB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgCisweDAsIDB4OGY4MjAwNjAsIDB4MzQ0MjAwMDgsIDB4YWY4MjAwNjAsIAorMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDM4LCAKKzB4YWY4MDAwNGMsIDB4MTAwMDAwMzYsIDB4YWY4MDAwNDgsIDB4MTA0MDAwMmYsIAorMHgzMGEyMTAwMCwgMHgxMDQwMDAwYywgMHgzMGEyNDAwMCwgMHg4YzgzMDAxYywgCisweDhmNDIwMDUwLCAweDYyMjAyMywgMHg0ODIwMDAxLCAweDI0ODQwMjAwLCAKKzB4OGY0MjAzNWMsIDB4NDQxMDIxLCAweGFmNDIwMzVjLCAweDhmNDIwMzY4LCAKKzB4MTAwMDAwMWEsIDB4YWY0MzAwNTAsIDB4MTA0MDAwMGMsIDB4MzJjMjgwMDAsIAorMHg4YzgzMDAxYywgMHg4ZjQyMDA3MCwgMHg2MjIwMjMsIDB4NDgyMDAwMSwgCisweDI0ODQwNDAwLCAweDhmNDIwMzY0LCAweDQ0MTAyMSwgMHhhZjQyMDM2NCwgCisweDhmNDIwMzY4LCAweDEwMDAwMDBkLCAweGFmNDMwMDcwLCAweDEwNDAwMDBlLCAKKzB4M2MwMjA4MDAsIDB4OGM4MzAwMWMsIDB4OGY0MjAwNjAsIDB4NjIyMDIzLCAKKzB4NDgyMDAwMSwgMHgyNDg0MDEwMCwgMHg4ZjQyMDM2MCwgMHg0NDEwMjEsIAorMHhhZjQyMDM2MCwgMHg4ZjQyMDM2OCwgMHhhZjQzMDA2MCwgMHg0NDEwMjEsIAorMHhhZjQyMDM2OCwgMHgzYzAyMDgwMCwgMHgyYzIxMDI0LCAweDUwNDAwMDA4LCAKKzB4MzY5NDAwNDAsIDB4MTAwMDAwMDYsIDB4MCwgMHgzMGEyMDEwMCwgCisweDEwNDAwMDAzLCAweDAsIDB4YzAwMmJkOCwgMHgwLCAKKzB4OGZiZjAwMjAsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzZTAwMDA4LCAKKzB4MCwgMHgyN2JkZmZhOCwgMHhhZmJmMDA1MCwgMHhhZmJlMDA0YywgCisweGFmYjUwMDQ4LCAweGFmYjMwMDQ0LCAweGFmYjIwMDQwLCAweGFmYjEwMDNjLCAKKzB4YWZiMDAwMzgsIDB4OGY5MTAxMDgsIDB4MjYyMjAwMjAsIDB4YWY4MjAxMDgsIAorMHg4ZTMyMDAxOCwgMHhhODIxLCAweDMyNDIwMDI0LCAweDEwNDAwMWJhLCAKKzB4ZjAyMSwgMHg4ZTI2MDAxYywgMHg4ZjQzMDAxYywgMHg2MTEwMCwgCisweDYyMTgyMSwgMHg4YzcwMDAwYywgMHg5NjA0MDAwYywgMHg5NjJkMDAxNiwgCisweDk0NzMwMDBhLCAweDJjODMwNWRkLCAweDM4ODI4ODcwLCAweDJjNDIwMDAxLCAKKzB4NjIxODI1LCAweDEwNjAwMDE1LCAweDI4MjEsIDB4MzJjMjAwNDAsIAorMHgxMDQwMDAxNSwgMHgyNDAyMDgwMCwgMHg5NjAzMDAxNCwgMHgxNDYyMDAxMiwgCisweDM0MDJhYWFhLCAweDk2MDMwMDBlLCAweDE0NjIwMDA3LCAweDIwMjEsIAorMHg5NjAzMDAxMCwgMHgyNDAyMDMwMCwgMHgxNDYyMDAwNCwgMHg4MDEwMjEsIAorMHg5NjAyMDAxMiwgMHgyYzQ0MDAwMSwgMHg4MDEwMjEsIDB4NTQ0MDAwMDYsIAorMHgyNDA1MDAxNiwgMHgxMDAwMDAwNCwgMHgwLCAweDI0MDIwODAwLCAKKzB4NTA4MjAwMDEsIDB4MjQwNTAwMGUsIDB4OTM0MjA1YzMsIDB4MTQ0MDAwMDgsIAorMHg1ODIxLCAweDI0MGIwMDAxLCAweDMyNjIwMTgwLCAweGFmNDUwMGE4LCAKKzB4YWY1MDAwYTAsIDB4MTA0MDAwMDIsIDB4YWY0NjAwYTQsIDB4YTM0YjA1YzMsIAorMHgxMGEwMDA4NSwgMHgyMDU0MDIxLCAweDkxMDIwMDAwLCAweDM4MjEsIAorMHgzMDQyMDAwZiwgMHgyNTA4MCwgMHgzMmMyMDAwMiwgMHgxMDQwMDAxMiwgCisweDEwYTE4MjEsIDB4MzI2MjAwMDIsIDB4MTA0MDAwMTAsIDB4MzJjMjAwMDEsIAorMHgxMDAyMDIxLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLCAweGUyMzgyMSwgCisweDgzMTAyYiwgMHgxNDQwZmZmYiwgMHgzMGUyZmZmZiwgMHg3MWMwMiwgCisweDYyMzgyMSwgMHg3MWMwMiwgMHgzMGUyZmZmZiwgMHg2MjM4MjEsIAorMHg3MTAyNywgMHhhNTAyMDAwYSwgMHgzMmMyMDAwMSwgMHgxMDQwMDA2YSwgCisweDMyNjIwMDAxLCAweDEwNDAwMDY4LCAweDAsIDB4OGY0MjAwYTgsIAorMHgxMDQwMDA2NSwgMHgwLCAweDhmNDIwMGEwLCAweDhmNDMwMGE4LCAKKzB4NDMxMDIxLCAweDkwNGMwMDA5LCAweDMxODkwMGZmLCAweDM5MjMwMDA2LCAKKzB4MzE4MmIsIDB4MzkyMjAwMTEsIDB4MjEwMmIsIDB4NjIxODI0LCAKKzB4MTA2MDAwMGMsIDB4M2MwNTAwMDYsIDB4OGY0MjAwYTQsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjdkNCwgMHhhZmEyMDAxMCwgMHg4ZjQyMDBhMCwgMHgzNGE1NDYwMCwgCisweDEyMDM4MjEsIDB4YzAwMmIzYiwgMHhhZmEyMDAxNCwgMHgxMDAwMDA0ZSwgCisweDAsIDB4MzJjMjAwMDQsIDB4MTQ0MDAwMTMsIDB4MjgyMSwgCisweDMxNjIwMGZmLCAweDE0NDAwMDA0LCAweDAsIDB4OTUwMjAwMDIsIAorMHgxMDAwMDAwZCwgMHg0YTI4MjMsIDB4OTUwNTAwMGMsIDB4OTUwMjAwMGUsIAorMHg5NTAzMDAxMCwgMHhhMjI4MjEsIDB4YTMyODIxLCAweDk1MDMwMDEyLCAKKzB4OTEwNDAwMDksIDB4OTUwMjAwMDIsIDB4YTMyODIxLCAweGE0MjgyMSwgCisweDRhMTAyMywgMHhhMjI4MjEsIDB4MjAwMjAyMSwgMHg5NDgyMDAwMCwgCisweDI0ODQwMDAyLCAweGUyMzgyMSwgMHg4ODEwMmIsIDB4MTQ0MGZmZmIsIAorMHg3MWMwMiwgMHgzMGUyZmZmZiwgMHg2MjM4MjEsIDB4NzFjMDIsIAorMHgzMGUyZmZmZiwgMHg2MjM4MjEsIDB4MWE1MjgyMSwgMHg1MWMwMiwgCisweDMwYTJmZmZmLCAweDYyMjgyMSwgMHg1MWMwMiwgMHgzMGEyZmZmZiwgCisweDYyMjgyMSwgMHhhNzI4MjMsIDB4NTE0MDIsIDB4YTIyODIxLCAKKzB4MzBhNWZmZmYsIDB4NTBhMDAwMDEsIDB4MzQwNWZmZmYsIDB4MzE2MjAwZmYsIAorMHgxNDQwMDAwOCwgMHgzMTgzMDBmZiwgMHg4ZjQzMDBhMCwgMHg4ZjQyMDBhOCwgCisweDYyNDAyMSwgMHg5MTAyMDAwMCwgMHgzMDQyMDAwZiwgMHgyNTA4MCwgCisweDMxODMwMGZmLCAweDI0MDIwMDA2LCAweDE0NjIwMDAzLCAweDEwYTEwMjEsIAorMHgxMDAwMDAwMiwgMHgyNDQ0MDAxMCwgMHgyNDQ0MDAwNiwgMHgzMTYyMDBmZiwgCisweDE0NDAwMDA2LCAweDAsIDB4OTQ4MjAwMDAsIDB4YTIyODIxLCAKKzB4NTFjMDIsIDB4MzBhMmZmZmYsIDB4NjIyODIxLCAweDkzNDIwNWMzLCAKKzB4MTA0MDAwMDMsIDB4MzI2MjAxMDAsIDB4NTA0MDAwMDMsIDB4YTQ4NTAwMDAsIAorMHg1MjgyNywgMHhhNDg1MDAwMCwgMHg5NjIyMDAwZSwgMHg4ZjQzMDA5YywgCisweDYyMTgyMSwgMHgzMmEyMDBmZiwgMHgxMDQwMDAwNywgMHhhZjQzMDA5YywgCisweDNjMDI0MDAwLCAweDIwMjEwMjUsIDB4YWZhMjAwMjAsIDB4OGY0MjAwOWMsIAorMHgxMDAwMDAwMywgMHg1ZTEwMjUsIDB4YWZiMDAwMjAsIDB4OGY0MjAwOWMsIAorMHhhZmEyMDAyNCwgMHgzMjYyMDA4MCwgMHgxMDQwMDAxMCwgMHgzMjYyMDEwMCwgCisweDhmNDIwMGI0LCAweDI0NDMwMDAxLCAweDIxMGMwLCAweDU3MTAyMSwgCisweGFmNDMwMGI0LCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweDNjMDEwMDAxLCAKKzB4MjIwODIxLCAweGFjMjMzOGU4LCAweDNjMDEwMDAxLCAweDIyMDgyMSwgCisweGFjMjQzOGVjLCAweDEwMDAwMGE1LCAweDMyYzIwMDIwLCAweDEwNDAwMDY0LCAKKzB4MCwgMHg4ZjQyMDBiNCwgMHgyNDQzMDAwMSwgMHgyMTBjMCwgCisweDU3MTAyMSwgMHhhZjQzMDBiNCwgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgCisweDNjMDEwMDAxLCAweDIyMDgyMSwgMHhhYzIzMzhlOCwgMHgzYzAxMDAwMSwgCisweDIyMDgyMSwgMHhhYzI0MzhlYywgMHg4ZjQyMDBiNCwgMHgxMDQwMDA1MSwgCisweDM4MjEsIDB4M2MwOTAwMDEsIDB4MzUyOTM4ZTgsIDB4M2MwODAwMWYsIAorMHgzNTA4ZmZmZiwgMHgyNDBiZmZmZiwgMHgzNDBhZmZmZiwgMHg3MTBjMCwgCisweDU3MTAyMSwgMHg0OTEwMjEsIDB4OGM0MzAwMDAsIDB4OGM0NDAwMDQsIAorMHhhZmEzMDAyOCwgMHhhZmE0MDAyYywgMHg4ZjgyMDBmYywgMHg4ZmEzMDAyOCwgCisweDhmYTQwMDJjLCAweGFjNDMwMDAwLCAweGFjNDQwMDA0LCAweDI0NDIwMDA4LCAKKzB4YWY4MjAwZjAsIDB4OGY0MjAwOGMsIDB4MjQ0MmZmZmYsIDB4YWY0MjAwOGMsIAorMHg5N2EyMDAyZSwgMHg4ZjQ0MDI3MCwgMHg4ZjQ1MDI3NCwgMHg0MDE4MjEsIAorMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAKKzB4ODYyMDIxLCAweGFmNDQwMjcwLCAweGFmNDUwMjc0LCAweDhmYTIwMDI4LCAKKzB4NDgxMDI0LCAweDkwNDMwMDAwLCAweDMwNjMwMDAxLCAweDE0NjAwMDBiLCAKKzB4NDAyMDIxLCAweDhmNDIwMjc4LCAweDhmNDMwMjdjLCAweDI0NjMwMDAxLCAKKzB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFmNDIwMjc4LCAweGFmNDMwMjdjLCAKKzB4OGY0MjAyNzgsIDB4MTAwMDAwMWEsIDB4OGY0MzAyN2MsIDB4OGM4MjAwMDAsIAorMHgxNDRiMDAwZSwgMHgwLCAweDk0ODIwMDA0LCAweDE0NGEwMDBiLCAKKzB4MCwgMHg4ZjQyMDI4OCwgMHg4ZjQzMDI4YywgMHgyNDYzMDAwMSwgCisweDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZjQyMDI4OCwgMHhhZjQzMDI4YywgCisweDhmNDIwMjg4LCAweDEwMDAwMDBhLCAweDhmNDMwMjhjLCAweDhmNDIwMjgwLCAKKzB4OGY0MzAyODQsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLCAKKzB4YWY0MjAyODAsIDB4YWY0MzAyODQsIDB4OGY0MjAyODAsIDB4OGY0MzAyODQsIAorMHg4ZjQyMDBiNCwgMHgyNGU3MDAwMSwgMHhlMjEwMmIsIDB4MTQ0MGZmYjgsIAorMHg3MTBjMCwgMHhhMzQwMDVjMywgMHgxMDAwMDAzZiwgMHhhZjQwMDBiNCwgCisweDhmODIwMGZjLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwMDAwLCAKKzB4YWM0NDAwMDQsIDB4MjQ0MjAwMDgsIDB4YWY4MjAwZjAsIDB4OGY0MjAwOWMsIAorMHg4ZjQ2MDA4YywgMHg4ZjQ0MDI3MCwgMHg4ZjQ1MDI3NCwgMHg0MDE4MjEsIAorMHgxMDIxLCAweDI0YzZmZmZmLCAweGFmNDYwMDhjLCAweGEzMjgyMSwgCisweGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFmNDQwMjcwLCAKKzB4YWY0NTAyNzQsIDB4OTIwMjAwMDAsIDB4MzA0MjAwMDEsIDB4MTQ0MDAwMGMsIAorMHgyNDAyZmZmZiwgMHg4ZjQyMDI3OCwgMHg4ZjQzMDI3YywgMHgyNDYzMDAwMSwgCisweDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZjQyMDI3OCwgMHhhZjQzMDI3YywgCisweDhmNDIwMjc4LCAweDhmNDMwMjdjLCAweDEwMDAwMDFjLCAweDMyYzIwMDIwLCAKKzB4OGUwMzAwMDAsIDB4MTQ2MjAwMGYsIDB4MzQwMmZmZmYsIDB4OTYwMzAwMDQsIAorMHgxNDYyMDAwYywgMHgwLCAweDhmNDIwMjg4LCAweDhmNDMwMjhjLCAKKzB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFmNDIwMjg4LCAKKzB4YWY0MzAyOGMsIDB4OGY0MjAyODgsIDB4OGY0MzAyOGMsIDB4MTAwMDAwMGIsIAorMHgzMmMyMDAyMCwgMHg4ZjQyMDI4MCwgMHg4ZjQzMDI4NCwgMHgyNDYzMDAwMSwgCisweDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZjQyMDI4MCwgMHhhZjQzMDI4NCwgCisweDhmNDIwMjgwLCAweDhmNDMwMjg0LCAweDMyYzIwMDIwLCAweDEwNDAwMDA1LCAKKzB4YWY0MDAwOWMsIDB4OGY0MjAzNTgsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNTgsIAorMHg4ZjQyMDM1OCwgMHg4ZTIyMDAxYywgMHg4ZjQzMDA0MCwgMHgyNDQyMDAwMSwgCisweDI0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjQyMDAyYywgMHgzMjQyMDA2MCwgCisweDE0NDAwMDA4LCAweDMyYzIwMDEwLCAweDhmNDIwMDM0LCAweDI0NDIwMDAxLCAKKzB4YWY0MjAwMzQsIDB4OGMwMzAyM2MsIDB4NDMxMDJiLCAweDE0NDAwMTAyLCAKKzB4MzJjMjAwMTAsIDB4MTA0MDAwMTgsIDB4MjQwNzAwMDgsIDB4OGY0NDAxNzAsIAorMHg4ZjQ1MDE3NCwgMHg4ZjQzMDAyYywgMHg4ZjQ4MDAwYywgMHg4Zjg2MDEyMCwgCisweDI0MDIwMDgwLCAweGFmYTIwMDEwLCAweGFmYTMwMDE0LCAweGFmYTgwMDE4LCAKKzB4OGY0MjAxMGMsIDB4NDBmODA5LCAweDI0YzYwMDFjLCAweDEwNDAwMDQ3LCAKKzB4MjQwMjAwMDEsIDB4OGY0MjAzMDAsIDB4OGY0MzAwMmMsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDMwMCwgMHg4ZjQyMDMwMCwgMHgyNDAyMDAwMSwgMHhhMzQyMDVjMSwgCisweDEwMDAwMDdjLCAweGFmNDMwMDM4LCAweDhmNDQwMTcwLCAweDhmNDUwMTc0LCAKKzB4OGY0MzAwMmMsIDB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsIDB4MjQwMjAwMjAsIAorMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgCisweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxMDQwMDA1NywgMHgyNDAyMDAwMSwgCisweDEwMDAwMDY1LCAweDAsIDB4MzI0MjAwMTIsIDB4MTA0MDAwNzUsIAorMHgzMjQyMDAwMSwgMHg5NjIyMDAwZSwgMHg4ZjQzMDA5YywgMHg2MjE4MjEsIAorMHgzMmMyMDAyMCwgMHgxMDQwMDAwNSwgMHhhZjQzMDA5YywgMHg4ZjQyMDM1OCwgCisweDI0NDJmZmZmLCAweGFmNDIwMzU4LCAweDhmNDIwMzU4LCAweDhlMjIwMDFjLCAKKzB4OGY0MzAwNDAsIDB4MjQ0MjAwMDEsIDB4MjQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4YWY0MjAwMmMsIDB4MzI0MjAwMTAsIDB4MTQ0MDAwMDgsIDB4MzJjMjAwMTAsIAorMHg4ZjQyMDAzNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDAzNCwgMHg4YzAzMDIzYywgCisweDQzMTAyYiwgMHgxNDQwMDBiYywgMHgzMmMyMDAxMCwgMHgxMDQwMDAyOCwgCisweDI0MDcwMDA4LCAweDhmNDQwMTcwLCAweDhmNDUwMTc0LCAweDhmNDMwMDJjLCAKKzB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsIDB4MjQwMjAwODAsIDB4YWZhMjAwMTAsIAorMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksIAorMHgyNGM2MDAxYywgMHgxNDQwMDAxMSwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhMDIyNDBmMSwgMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwgCisweDhmODIwMTI4LCAweDNjMDQwMDAxLCAweDI0ODQ2N2M0LCAweGFmYTIwMDE0LCAKKzB4OGY0NjAwMmMsIDB4OGY4NzAxMjAsIDB4M2MwNTAwMDksIDB4YzAwMmIzYiwgCisweDM0YTUxMTAwLCAweDEwMDAwMDM2LCAweDAsIDB4OGY0MjAzMDAsIAorMHg4ZjQzMDAyYywgMHgyNDQyMDAwMSwgMHhhZjQyMDMwMCwgMHg4ZjQyMDMwMCwgCisweDI0MDIwMDAxLCAweGEzNDIwNWMxLCAweDEwMDAwMDI2LCAweGFmNDMwMDM4LCAKKzB4OGY0NDAxNzAsIDB4OGY0NTAxNzQsIDB4OGY0MzAwMmMsIDB4OGY0ODAwMGMsIAorMHg4Zjg2MDEyMCwgMHgyNDAyMDAyMCwgMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgCisweGFmYTgwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywgCisweDE0NDAwMDExLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgCisweGEwMjI0MGYwLCAweDhmODIwMTI0LCAweGFmYTIwMDEwLCAweDhmODIwMTI4LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDY3YjgsIDB4YWZhMjAwMTQsIDB4OGY0NjAwMmMsIAorMHg4Zjg3MDEyMCwgMHgzYzA1MDAwOSwgMHhjMDAyYjNiLCAweDM0YTUwOTAwLCAKKzB4MTAwMDAwMGYsIDB4MCwgMHg4ZjQyMDMwMCwgMHgyNDQyMDAwMSwgCisweGFmNDIwMzAwLCAweDhmNDIwMzAwLCAweDhmNDIwMDJjLCAweGEzNDAwNWMxLCAKKzB4YWY0MjAwMzgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA0MGYxLCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA0MGYwLCAweGFmNDAwMDM0LCAKKzB4OGY0MjAzMTQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMTQsIDB4MTAwMDAwNjIsIAorMHg4ZjQyMDMxNCwgMHgxMDQwMDAyMiwgMHgzMjQyNzAwMCwgMHg4ZTI1MDAxYywgCisweDhmNDIwMDI4LCAweGEyMjAyMywgMHg0ODEwMDAzLCAweDAsIAorMHg4ZjQyMDA0MCwgMHg4MjIwMjEsIDB4OGY0MjAzNTgsIDB4OGY0MzAwMDAsIAorMHhhZjQ1MDAyOCwgMHg0NDEwMjEsIDB4MTA2MDAwMDcsIDB4YWY0MjAzNTgsIAorMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAKKzB4MTAwMDAwMDUsIDB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgCisweDEwNDBmZmZkLCAweDAsIDB4OGY4MjAwNjAsIDB4MzQ0MjAwMDgsIAorMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAKKzB4MTAwMDAwNDEsIDB4YWY4MDAwNGMsIDB4MTAwMDAwM2YsIDB4YWY4MDAwNDgsIAorMHgxMDQwMDAyZiwgMHgzMjQyMTAwMCwgMHgxMDQwMDAwYywgMHgzMjQyNDAwMCwgCisweDhlMjMwMDFjLCAweDhmNDIwMDUwLCAweDYyMjAyMywgMHg0ODIwMDAxLCAKKzB4MjQ4NDAyMDAsIDB4OGY0MjAzNWMsIDB4NDQxMDIxLCAweGFmNDIwMzVjLCAKKzB4OGY0MjAzNjgsIDB4MTAwMDAwMWEsIDB4YWY0MzAwNTAsIDB4MTA0MDAwMGMsIAorMHgzMmMyODAwMCwgMHg4ZTIzMDAxYywgMHg4ZjQyMDA3MCwgMHg2MjIwMjMsIAorMHg0ODIwMDAxLCAweDI0ODQwNDAwLCAweDhmNDIwMzY0LCAweDQ0MTAyMSwgCisweGFmNDIwMzY0LCAweDhmNDIwMzY4LCAweDEwMDAwMDBkLCAweGFmNDMwMDcwLCAKKzB4MTA0MDAwMGUsIDB4M2MwMjA4MDAsIDB4OGUyMzAwMWMsIDB4OGY0MjAwNjAsIAorMHg2MjIwMjMsIDB4NDgyMDAwMSwgMHgyNDg0MDEwMCwgMHg4ZjQyMDM2MCwgCisweDQ0MTAyMSwgMHhhZjQyMDM2MCwgMHg4ZjQyMDM2OCwgMHhhZjQzMDA2MCwgCisweDQ0MTAyMSwgMHhhZjQyMDM2OCwgMHgzYzAyMDgwMCwgMHgyYzIxMDI0LCAKKzB4NTA0MDAwMTEsIDB4MzY5NDAwNDAsIDB4MTAwMDAwMGYsIDB4MCwgCisweDMyNDIwMDQ4LCAweDEwNDAwMDA3LCAweDI0MTUwMDAxLCAweDhlMjIwMDFjLCAKKzB4M2MwM2ZmZmYsIDB4NDNmMDI0LCAweDMwNDJmZmZmLCAweDEwMDBmZDc1LCAKKzB4YWUyMjAwMWMsIDB4MzI0MjAxMDAsIDB4MTA0MDAwMDMsIDB4MCwgCisweGMwMDJiZDgsIDB4MCwgMHg4ZmJmMDA1MCwgMHg4ZmJlMDA0YywgCisweDhmYjUwMDQ4LCAweDhmYjMwMDQ0LCAweDhmYjIwMDQwLCAweDhmYjEwMDNjLCAKKzB4OGZiMDAwMzgsIDB4M2UwMDAwOCwgMHgyN2JkMDA1OCwgMHgzZTAwMDA4LCAKKzB4MCwgMHgwLCAweDAsIDB4OGY4MzAwZTQsIAorMHg4ZjgyMDBlMCwgMHgyNDA0ZmZmOCwgMHg0NDEwMjQsIDB4NjIxMDI2LCAKKzB4MjEwMmIsIDB4MjEwMjMsIDB4M2UwMDAwOCwgMHg2MjEwMjQsIAorMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMWMsIAorMHhhZmIwMDAxOCwgMHg4Zjg2MDBjNCwgMHg4Zjg0MDBlMCwgMHg4Zjg1MDBlNCwgCisweDI0MDJmZmY4LCAweDgyMTgyNCwgMHgxMGEzMDAwOSwgMHgyNzYyM2ZmOCwgCisweDE0YTIwMDAyLCAweDI0YTIwMDA4LCAweDI3NjIzMDAwLCAweDQwODAyMSwgCisweDE2MDMwMDA1LCAweDMwODIwMDA0LCAweDEwNDAwMDA0LCAweGMwMjAyMSwgCisweDEwMDAwMDIyLCAweDEwMjEsIDB4OGUwNDAwMDAsIDB4OGY0MjAxMWMsIAorMHgxNGEyMDAwMywgMHgwLCAweDhmNDIwMTIwLCAweGFmNDIwMTE0LCAKKzB4OGNhMzAwMDAsIDB4OGY0MjAxNDgsIDB4ODMxODIzLCAweDQzMTAyYiwgCisweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsIDB4NjIxODIxLCAKKzB4OTRhMjAwMDYsIDB4MjQ0MjAwNTAsIDB4NjIxMDJiLCAweDE0NDAwMDBmLCAKKzB4YTAxMDIxLCAweGFmYTQwMDEwLCAweGFmYTMwMDE0LCAweDhjYTYwMDAwLCAKKzB4OGNhNzAwMDQsIDB4M2MwNDAwMDEsIDB4YzAwMmIzYiwgMHgyNDg0Njg5NCwgCisweDhmNDIwMjBjLCAweDI0NDIwMDAxLCAweGFmNDIwMjBjLCAweDhmNDIwMjBjLCAKKzB4MTAyMSwgMHhhZjkwMDBlOCwgMHhhZjkwMDBlNCwgMHg4ZmJmMDAxYywgCisweDhmYjAwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4M2UwMDAwOCwgCisweDAsIDB4OGY4NDAwZTAsIDB4OGY4ODAwYzQsIDB4OGY4MzAwZTgsIAorMHgyNDAyZmZmOCwgMHg4MjM4MjQsIDB4ZTMyMDIzLCAweDJjODIxMDAwLCAKKzB4NTA0MDAwMDEsIDB4MjQ4NDEwMDAsIDB4NDIwYzIsIDB4ODAxODIxLCAKKzB4OGY0NDAyNTgsIDB4OGY0NTAyNWMsIDB4MTAyMSwgMHhhMzI4MjEsIAorMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwgMHhhZjQ0MDI1OCwgCisweGFmNDUwMjVjLCAweDhmODMwMGM4LCAweDhmNDIwMTQ4LCAweDEwMzIwMjMsIAorMHg4MjEwMmIsIDB4MTQ0MDAwMDQsIDB4ODAxODIxLCAweDhmNDIwMTQ4LCAKKzB4ODIyMDIxLCAweDgwMTgyMSwgMHg4ZjQ0MDI1MCwgMHg4ZjQ1MDI1NCwgCisweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIAorMHg4NjIwMjEsIDB4YWY0NDAyNTAsIDB4YWY0NTAyNTQsIDB4YWY4ODAwYzgsIAorMHhhZjg3MDBlNCwgMHhhZjg3MDBlOCwgMHgzZTAwMDA4LCAweDAsIAorMHgyN2JkZmYzMCwgMHgyNDBhMDAwMSwgMHhhZmJmMDBjOCwgMHhhZmJlMDBjNCwgCisweGFmYjUwMGMwLCAweGFmYjMwMGJjLCAweGFmYjIwMGI4LCAweGFmYjEwMGI0LCAKKzB4YWZiMDAwYjAsIDB4YTNhMDAwOTcsIDB4YWZhMDAwNDQsIDB4YWZhYTAwNWMsIAorMHg5MzQyMDVjNCwgMHhhN2EwMDA4ZSwgMHgxMDQwMDAwYSwgMHhhN2EwMDA4NiwgCisweDhmNGIwMGM0LCAweGFmYWIwMDY0LCAweDhmNGEwMGMwLCAweGFmYWEwMDZjLCAKKzB4OGY0YjAwY2MsIDB4YWZhYjAwNzQsIDB4OGY0YTAwYzgsIDB4MTAwMDAxMjksIAorMHhhZmFhMDA3YywgMHg4ZjQyMDExNCwgMHg0MGY4MDksIDB4MCwgCisweDQwMzAyMSwgMHgxMGMwMDM0ZiwgMHgwLCAweDhjYzIwMDAwLCAKKzB4OGNjMzAwMDQsIDB4YWZhMjAwMjAsIDB4YWZhMzAwMjQsIDB4OGZhYjAwMjQsIAorMHg4ZmFhMDAyMCwgMHgzMTYyZmZmZiwgMHgyNDQyZmZmYywgMHhhZmEyMDA2YywgCisweDNjMDIwMDA2LCAweDJjMjEwMjQsIDB4YWZhYjAwN2MsIDB4MTQ0MDAwMTUsIAorMHhhZmFhMDA2NCwgMHg5MTQyMDAwMCwgMHgzMDQyMDAwMSwgMHgxMDQwMDAxMSwgCisweDI0MDJmZmZmLCAweDhkNDMwMDAwLCAweDE0NjIwMDA0LCAweDM0MDJmZmZmLCAKKzB4OTU0MzAwMDQsIDB4MTA2MjAwMGIsIDB4MCwgMHhjMDAyNGJiLCAKKzB4OGZhNDAwNjQsIDB4MzA0MjAwZmYsIDB4MTQ0MDAwMDYsIDB4MCwgCisweDhmNDIwMTE4LCAweDQwZjgwOSwgMHgwLCAweDEwMDAwMzJkLCAKKzB4MCwgMHg4ZmEyMDAyNCwgMHgzYzAzZmZiZiwgMHgzNDYzZmZmZiwgCisweDQzMTAyNCwgMHgzYzAzZmZmZiwgMHg0MzE4MjQsIDB4MTQ2MDAwMDMsIAorMHhhZmEyMDAyNCwgMHgxMDAwMDA0MCwgMHgxODIxLCAweDNjMDIwMDgwLCAKKzB4NjIxMDI0LCAweDEwNDAwMDA3LCAweDAsIDB4OGY0MjAzOGMsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDM4YywgMHg4ZjQyMDM4YywgMHgxMDAwMDAzNiwgCisweDI0MDMwMDAxLCAweDhmNDIwMjEwLCAweDI0NDIwMDAxLCAweGFmNDIwMjEwLCAKKzB4OGY0MjAyMTAsIDB4M2MwMjAwMDEsIDB4NjIxMDI0LCAweDEwNDAwMDA2LCAKKzB4M2MwMjAwMDIsIDB4OGY0MjAxYzQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAxYzQsIAorMHg4ZjQyMDFjNCwgMHgzYzAyMDAwMiwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsIAorMHgzYzAyMDAwNCwgMHg4ZjQyMDM3YywgMHgyNDQyMDAwMSwgMHhhZjQyMDM3YywgCisweDhmNDIwMzdjLCAweDNjMDIwMDA0LCAweDYyMTAyNCwgMHgxMDQwMDAwNiwgCisweDNjMDIwMDA4LCAweDhmNDIwMzgwLCAweDI0NDIwMDAxLCAweGFmNDIwMzgwLCAKKzB4OGY0MjAzODAsIDB4M2MwMjAwMDgsIDB4NjIxMDI0LCAweDEwNDAwMDA2LCAKKzB4M2MwMjAwMTAsIDB4OGY0MjAzODQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzODQsIAorMHg4ZjQyMDM4NCwgMHgzYzAyMDAxMCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsIAorMHgzYzAyMDAyMCwgMHg4ZjQyMDFjMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDFjMCwgCisweDhmNDIwMWMwLCAweDNjMDIwMDIwLCAweDYyMTAyNCwgMHgxMDQwMDAwNiwgCisweDI0MDMwMDAxLCAweDhmNDIwMzg4LCAweDI0NDIwMDAxLCAweGFmNDIwMzg4LCAKKzB4OGY0MjAzODgsIDB4MjQwMzAwMDEsIDB4OGMwMjAyNjAsIDB4OGZhYjAwNmMsIAorMHg0YjEwMmIsIDB4MTA0MDAwMTQsIDB4MzA3MDAwZmYsIDB4OGY0MjAxZTgsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDFlOCwgMHg4ZjQyMDFlOCwgMHg4ZmFhMDA3YywgCisweDhmODIwMGUwLCAweDM1NGEwMTAwLCAweGFmYWEwMDdjLCAweGFmYTIwMDEwLCAKKzB4OGY4MjAwZTQsIDB4MjQxMDAwMDEsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4YTAsIAorMHhhZmEyMDAxNCwgMHg4ZmE2MDAyMCwgMHg4ZmE3MDAyNCwgMHgzYzA1MDAwNywgCisweGMwMDJiM2IsIDB4MzRhNTA4MDAsIDB4MTIwMDAwMTAsIDB4M2MwMjAwODAsIAorMHgyYzIxMDI0LCAweDE0NDAwMDBlLCAweDMyYzIwNDAwLCAweDhmYWIwMDdjLCAKKzB4M2MwMjAwODAsIDB4MzQ0MjAxMDAsIDB4MTYyMTAyNCwgMHgxMDQwMDAwNSwgCisweDAsIDB4OGY0MjAyMGMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyMGMsIAorMHg4ZjQyMDIwYywgMHgxMDAwMDJiMCwgMHg4ZmEzMDA2YywgMHgzMmMyMDQwMCwgCisweDEwNDAwMDE1LCAweDM0MDI4MTAwLCAweDhmYWEwMDY0LCAweDk1NDMwMDBjLCAKKzB4MTQ2MjAwMTIsIDB4M2MwMjAxMDAsIDB4MjQwYjAyMDAsIDB4YTdhYjAwOGUsIAorMHg5NTQyMDAwZSwgMHg4ZDQzMDAwOCwgMHg4ZDQ0MDAwNCwgMHg4ZDQ1MDAwMCwgCisweDhmYWEwMDZjLCAweDhmYWIwMDY0LCAweDI1NGFmZmZjLCAweGFmYWEwMDZjLCAKKzB4YTdhMjAwODYsIDB4YWQ2MzAwMGMsIDB4YWQ2NDAwMDgsIDB4YWQ2NTAwMDQsIAorMHgyNTZiMDAwNCwgMHhhZmFiMDA2NCwgMHgzYzAyMDEwMCwgMHgyYzIxMDI0LCAKKzB4MTA0MDAwMDQsIDB4MCwgMHg4ZmFhMDA2YywgMHgyNTRhMDAwNCwgCisweGFmYWEwMDZjLCAweDhmNDIwMGJjLCAweDUwNDAwMDBhLCAweGFmYTAwMDc0LCAKKzB4OGZhYjAwNmMsIDB4NGIxMDJiLCAweDUwNDAwMDA2LCAweGFmYTAwMDc0LCAKKzB4OGY0MjAwYmMsIDB4MTYyMTAyMywgMHhhZmEyMDA3NCwgMHg4ZjRhMDBiYywgCisweGFmYWEwMDZjLCAweDhmNDIwMDgwLCAweDhmYWIwMDZjLCAweDRiMTAyYiwgCisweDEwNDAwMDU2LCAweDMyYzI4MDAwLCAweDEwNDAwMDVlLCAweDI0MGEwMDAzLCAKKzB4MzJjMjEwMDAsIDB4MTA0MDAwNWIsIDB4YWZhYTAwNWMsIDB4MTAwMDAwNTgsIAorMHgyNDBiMDAwNCwgMHg4ZjQyMDM1MCwgMHgyNDAzZmZiZiwgMHgyODNhMDI0LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzNTAsIDB4MTAwMDAyNGYsIDB4OGY0MjAzNTAsIAorMHgyYzJiMDI1LCAweDI0MDJmZmJmLCAweDI4MmEwMjQsIDB4OGY4MzAxMjgsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjhkMCwgMHgyNjYyMDAwMSwgMHhhZmEyMDAxNCwgCisweGFmYTMwMDEwLCAweDhmODYwMTIwLCAweDhmODcwMTI0LCAweDNjMDUwMDA3LCAKKzB4YzAwMmIzYiwgMHgzNGE1MjI1MCwgMHgxMDAwMDIzZiwgMHgwLCAKKzB4MmMyYjAyNSwgMHgyNDAyZmZiZiwgMHgyODJhMDI0LCAweDhmODMwMTI4LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDY4ZDAsIDB4MjQwMjAwMDIsIDB4YWZhMjAwMTQsIAorMHhhZmEzMDAxMCwgMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwNywgCisweGMwMDJiM2IsIDB4MzRhNTI0NTAsIDB4MTAwMDAyMmYsIDB4MCwgCisweDhlYTIwMDAwLCAweDhlYTMwMDA0LCAweDNjMDQwMDAxLCAweDI0ODQ2OGU4LCAKKzB4YWZiMDAwMTAsIDB4YWZiZTAwMTQsIDB4OGVhNzAwMTgsIDB4MzRhNTI4MDAsIAorMHhjMDAyYjNiLCAweDYwMzAyMSwgMHgxMDAwMDIyMywgMHgwLCAKKzB4YTZiMTAwMGEsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4ZjAsIAorMHhhZmJlMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZjQ2MDA0NCwgMHg4Zjg3MDEyMCwgCisweDNjMDUwMDA3LCAweGMwMDJiM2IsIDB4MzRhNTMwMDAsIDB4MTAwMDAyMTYsIAorMHgwLCAweGE2YjEwMDBhLCAweGE2YjIwMDBlLCAweDhmODIwMTI0LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDY4ZmMsIDB4YWZiZTAwMTQsIDB4YWZhMjAwMTAsIAorMHg4ZjQ2MDA0NCwgMHg4Zjg3MDEyMCwgMHgzYzA1MDAwNywgMHhjMDAyYjNiLCAKKzB4MzRhNTMyMDAsIDB4MTAwMDAyMDgsIDB4MCwgMHg4ZjQyMDA4NCwgCisweDhmYWEwMDZjLCAweDRhMTAyYiwgMHgxNDQwMDAwNywgMHgzYzAyMDAwMSwgCisweDJjMjEwMjQsIDB4MTA0MDAwMDQsIDB4MCwgMHgyNDBiMDAwMiwgCisweGFmYWIwMDVjLCAweDhmYWEwMDZjLCAweDExNDAwMjFiLCAweDI3YWIwMDIwLCAKKzB4YWZhYjAwYTQsIDB4M2MwYTAwMWYsIDB4MzU0YWZmZmYsIDB4YWZhYTAwOWMsIAorMHg4ZmFiMDA1YywgMHgyNDBhMDAwMSwgMHg1NTZhMDAyMSwgMHgyNDBhMDAwMiwgCisweDhmNDMwMDU0LCAweDhmNDIwMDUwLCAweDEwNjIwMDBiLCAweDI3NGIwMDU0LCAKKzB4OGY1ZTAwNTQsIDB4MzQwM2VjYzAsIDB4YWZhYjAwNGMsIDB4MjdjMjAwMDEsIAorMHgzMDQyMDFmZiwgMHhhZmEyMDA1NCwgMHgxZTExNDAsIDB4NDMxMDIxLCAKKzB4MTAwMDAwNmIsIDB4MmUyYTgyMSwgMHg4ZjQyMDA0NCwgMHg4ZmFhMDA2YywgCisweDNjMDQwMDAxLCAweDI0ODQ2OGFjLCAweGFmYWEwMDE0LCAweGFmYTIwMDEwLCAKKzB4OGY0NjAwNTQsIDB4OGY0NzAwNTAsIDB4M2MwNTAwMDcsIDB4YzAwMmIzYiwgCisweDM0YTUxMzAwLCAweDhmNDMwMzUwLCAweDI0MDJmZmJmLCAweDI4MmEwMjQsIAorMHgyNDYzMDAwMSwgMHhhZjQzMDM1MCwgMHgxMDAwMDFkMywgMHg4ZjQyMDM1MCwgCisweDE1NmEwMDFkLCAweDAsIDB4OGY0MzAwNzQsIDB4OGY0MjAwNzAsIAorMHgxMDYyMDAwYSwgMHgyNzRiMDA3NCwgMHg4ZjVlMDA3NCwgMHhhZmFiMDA0YywgCisweDI3YzIwMDAxLCAweDMwNDIwM2ZmLCAweGFmYTIwMDU0LCAweDFlMTE0MCwgCisweDI0NDI2Y2MwLCAweDEwMDAwMDRhLCAweDJlMmE4MjEsIDB4OGY0MjAwNDQsIAorMHg4ZmFhMDA2YywgMHgzYzA0MDAwMSwgMHgyNDg0NjhiOCwgMHgzYzA1MDAwNywgCisweGFmYWEwMDE0LCAweGFmYTIwMDEwLCAweDhmNDYwMDc0LCAweDhmNDcwMDcwLCAKKzB4MzRhNTE1MDAsIDB4MjQwYjAwMDEsIDB4YzAwMmIzYiwgMHhhZmFiMDA1YywgCisweDEwMDBmZmMzLCAweDAsIDB4OGY0MzAwNjQsIDB4OGY0MjAwNjAsIAorMHgxMDYyMDAxYSwgMHgyNzRhMDA2NCwgMHg4ZjVlMDA2NCwgMHg4ZmFiMDA1YywgCisweGFmYWEwMDRjLCAweDI3YzIwMDAxLCAweDMwNDIwMGZmLCAweGFmYTIwMDU0LCAKKzB4MjQwMjAwMDQsIDB4MTU2MjAwMGUsIDB4MWUxMTQwLCAweDFlMTE4MCwgCisweDI0NDIwY2MwLCAweDJlMjEwMjEsIDB4YWZhMjAwNDQsIDB4OTQ0MjAwMmEsIAorMHg4ZmFhMDA0NCwgMHg4ZmFiMDA2YywgMHg0YjEwMmIsIDB4MTA0MDAwMjQsIAorMHgyNTU1MDAyMCwgMHgyNDBhMDAwMSwgMHgxMDAwMDAyMSwgMHhhM2FhMDA5NywgCisweDI0NDI0Y2MwLCAweDEwMDAwMDFlLCAweDJlMmE4MjEsIDB4OGY0MjAwNDQsIAorMHg4ZmFiMDA2YywgMHgzYzA0MDAwMSwgMHgyNDg0NjhjNCwgMHhhZmFiMDAxNCwgCisweGFmYTIwMDEwLCAweDhmNDYwMDY0LCAweDhmNDcwMDYwLCAweDNjMDUwMDA3LCAKKzB4YzAwMmIzYiwgMHgzNGE1MTgwMCwgMHgzYzAyMDAwOCwgMHgyYzIxMDI0LCAKKzB4MTQ0MGZmMzQsIDB4MCwgMHg4ZjQyMDM3MCwgMHgyNDBhMDAwMSwgCisweGFmYWEwMDVjLCAweDI0NDIwMDAxLCAweGFmNDIwMzcwLCAweDEwMDBmZjkwLCAKKzB4OGY0MjAzNzAsIDB4MjdhMzAwMzYsIDB4MTMxMDQwLCAweDYyMTgyMSwgCisweDk0NjIwMDAwLCAweDQ0MTAyMSwgMHgxMDAwMDAyMCwgMHhhNDYyMDAwMCwgCisweDhmYWIwMDY0LCAweGFlYWIwMDE4LCAweDkzYTIwMDk3LCAweDEwNDAwMDcyLCAKKzB4OTgyMSwgMHg4ZmFhMDA0NCwgMHg4ZmE0MDA2YywgMHg4ZmEzMDBhNCwgCisweDI1NDIwMDIwLCAweGFmYTIwMDI4LCAweDI1NDIwMDA4LCAweGFmYTIwMDMwLCAKKzB4MjU0MjAwMTAsIDB4YWZhYTAwMmMsIDB4YWZhMjAwMzQsIDB4OTU0MjAwMmEsIAorMHhhN2EyMDAzOCwgMHg5NTQyMDAxOCwgMHhhN2EyMDAzYSwgMHg5NTQyMDAxYSwgCisweGE3YTIwMDNjLCAweDk1NDIwMDFjLCAweGE3YTIwMDNlLCAweDk0NjIwMDE4LCAKKzB4MjQ2MzAwMDIsIDB4ODIyMDIzLCAweDE4ODBmZmRlLCAweDI2NzMwMDAxLCAKKzB4MmU2MjAwMDQsIDB4MTQ0MGZmZjksIDB4MCwgMHg4ZjQyMDBmYywgCisweDI2NjUwMDAxLCAweGEyMTAyYSwgMHgxNDQwMDAyYiwgMHgyNDAzMDAwMSwgCisweDhmODMwMTJjLCAweDEwNjAwMDIzLCAweDAsIDB4OGY4MjAxMjQsIAorMHg0MzEwMjMsIDB4MjIxNDMsIDB4NTg4MDAwMDEsIDB4MjQ4NDAwNDAsIAorMHg4ZjgyMDEyOCwgMHg0MzEwMjMsIDB4MjE5NDMsIDB4NTg2MDAwMDEsIAorMHgyNDYzMDA0MCwgMHg2NDEwMmEsIDB4NTQ0MDAwMDEsIDB4NjAyMDIxLCAKKzB4YWY0NDAwZmMsIDB4OGY0MjAwZmMsIDB4YTIxMDJhLCAweDEwNDAwMDExLCAKKzB4MjQwMzAwMDEsIDB4MTAwMDAwMTUsIDB4MzA2MjAwZmYsIDB4OGZhYjAwNjQsIAorMHg5NjA3MDAxOCwgMHhhZmFiMDAxMCwgMHg4ZTIyMDAwOCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2OGRjLCAweDhjNDMwMDA0LCAweDhjNDIwMDAwLCAweDM0YTUyNDAwLCAKKzB4MjQwMzAyMSwgMHhjMDAyYjNiLCAweGFmYTMwMDE0LCAweDEwMDAwMDJiLCAKKzB4MCwgMHg4ZjQyMDMzNCwgMHgxODIxLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzMzQsIDB4OGY0MjAzMzQsIDB4MzA2MjAwZmYsIDB4NTA0MGZlZGMsIAorMHgzYzAyMDgwMCwgMHgxMjYwMDAyMSwgMHg5MDIxLCAweDhmYjEwMGE0LCAKKzB4MjIwODAyMSwgMHg4ZTIyMDAwOCwgMHg5NjA3MDAxOCwgMHg4ZmE2MDA2NCwgCisweDhjNDQwMDAwLCAweDhjNDUwMDA0LCAweDI0MGEwMDAxLCAweGFmYWEwMDEwLCAKKzB4YWZiZTAwMTQsIDB4OGY0MjAwMDgsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIAorMHg0MGY4MDksIDB4MCwgMHgxMDQwZmZkOCwgMHgzYzA1MDAwNywgCisweDk2MDIwMDE4LCAweDhmYWIwMDY0LCAweDhmYWEwMDljLCAweDE2MjU4MjEsIAorMHgxNGIxMDJiLCAweDEwNDAwMDA0LCAweGFmYWIwMDY0LCAweDhmNDIwMTQ4LCAKKzB4MTYyNTgyMywgMHhhZmFiMDA2NCwgMHgyNjEwMDAwMiwgMHgyNjUyMDAwMSwgCisweDI1MzEwMmIsIDB4MTQ0MGZmZTMsIDB4MjYzMTAwMDQsIDB4OGZiMDAwNmMsIAorMHgxMDAwMDAzNiwgMHg5N2IxMDAzOCwgMHg4ZjQyMDBmYywgMHgyNDA1MDAwMiwgCisweGEyMTAyYSwgMHgxNDQwMDAxYiwgMHgyNDAzMDAwMSwgMHg4ZjgzMDEyYywgCisweDEwNjAwMDEzLCAweDAsIDB4OGY4MjAxMjQsIDB4NDMxMDIzLCAKKzB4MjIxNDMsIDB4NTg4MDAwMDEsIDB4MjQ4NDAwNDAsIDB4OGY4MjAxMjgsIAorMHg0MzEwMjMsIDB4MjE5NDMsIDB4NTg2MDAwMDEsIDB4MjQ2MzAwNDAsIAorMHg2NDEwMmEsIDB4NTQ0MDAwMDEsIDB4NjAyMDIxLCAweGFmNDQwMGZjLCAKKzB4OGY0MjAwZmMsIDB4YTIxMDJhLCAweDE0NDAwMDA2LCAweDI0MDMwMDAxLCAKKzB4OGY0MjAzMzQsIDB4MTgyMSwgMHgyNDQyMDAwMSwgMHhhZjQyMDMzNCwgCisweDhmNDIwMzM0LCAweDMwNjIwMGZmLCAweDEwNDBmZWE1LCAweDNjMDIwODAwLCAKKzB4OTZiMTAwMGEsIDB4OGZiMDAwNmMsIDB4MzIyM2ZmZmYsIDB4NzAxMDJiLCAKKzB4NTQ0MDAwMDEsIDB4NjA4MDIxLCAweDhlYTQwMDAwLCAweDhlYTUwMDA0LCAKKzB4MjQwYjAwMDEsIDB4YWZhYjAwMTAsIDB4YWZiZTAwMTQsIDB4OGY0MjAwMDgsIAorMHg4ZmE2MDA2NCwgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksIAorMHgyMDAzODIxLCAweDEwNDBmZWEyLCAweDNjMDUwMDA3LCAweDk2YTMwMDBlLCAKKzB4OTdhYTAwOGUsIDB4MTE0MDAwMDcsIDB4NjA5MDIxLCAweDkzNDIwNWM0LCAKKzB4MTQ0MDAwMDQsIDB4MCwgMHg5N2FiMDA4NiwgMHg2YTE4MjUsIAorMHhhNmFiMDAxNiwgMHg4ZmFhMDA3YywgMHgzYzAyZmZmZiwgMHgxNDIxMDI0LCAKKzB4MTA0MDAwMDMsIDB4YTE0MDIsIDB4MzQ2MzA0MDAsIDB4YTZhMjAwMTQsIAorMHg4ZmFiMDA2YywgMHg1NjBiMDA3MiwgMHhhNmEzMDAwZSwgMHgzNDYyMDAwNCwgCisweGE2YTIwMDBlLCAweDhmYWEwMDc0LCAweDE2YTEwMjEsIDB4YTZhMjAwMGEsIAorMHg4ZjQzMDA0NCwgMHg4ZjQ0MDFhMCwgMHg4ZjQ1MDFhNCwgMHgzNDAyODAwMCwgCisweGFmYTIwMDEwLCAweDhmNDIwMDQ0LCAweDJhMDMwMjEsIDB4MjQwNzAwMjAsIAorMHhhZmEyMDAxNCwgMHg4ZjQyMDAwYywgMHgzMTk0MCwgMHg2MDQ4MjEsIAorMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHg0MDIxLCAweGE5MjgyMSwgCisweGE5MTgyYiwgMHg4ODIwMjEsIDB4NDBmODA5LCAweDgzMjAyMSwgCisweDUwNDBmZTdmLCAweGE2YjIwMDBlLCAweDhmNDIwMzY4LCAweGFmYTAwMDZjLCAKKzB4YTM0MDA1YzQsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjgsIDB4OGZhYjAwNWMsIAorMHgyNDBhMDAwMSwgMHg4ZjQyMDM2OCwgMHgxNTZhMDAwNiwgMHgyNDBhMDAwMiwgCisweDhmNDIwMzVjLCAweDI0NDJmZmZmLCAweGFmNDIwMzVjLCAweDEwMDAwMDBjLCAKKzB4OGY0MjAzNWMsIDB4MTU2YTAwMDYsIDB4MCwgMHg4ZjQyMDM2NCwgCisweDI0NDJmZmZmLCAweGFmNDIwMzY0LCAweDEwMDAwMDA1LCAweDhmNDIwMzY0LCAKKzB4OGY0MjAzNjAsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjAsIDB4OGY0MjAzNjAsIAorMHg4ZmFhMDA1NCwgMHg4ZmFiMDA0YywgMHhhZDZhMDAwMCwgMHg4ZjQyMDA0NCwgCisweDhmNDQwMDg4LCAweDhmNDMwMDc4LCAweDI0NDIwMDAxLCAweDQ0MTAyNCwgCisweDI0NjMwMDAxLCAweGFmNDIwMDQ0LCAweGFmNDMwMDc4LCAweDhjMDIwMjQwLCAKKzB4NjIxODJiLCAweDE0NjAwMDc1LCAweDI0MDcwMDA4LCAweDhmNDQwMTY4LCAKKzB4OGY0NTAxNmMsIDB4OGY0MzAwNDQsIDB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsIAorMHgyNDAyMDA0MCwgMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwgCisweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwMDAxMSwgCisweDI0MGIwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDJiNDBmMiwgCisweDhmODIwMTI0LCAweGFmYTIwMDEwLCAweDhmODIwMTI4LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDY4OGMsIDB4YWZhMjAwMTQsIDB4OGY0NjAwNDQsIDB4OGY4NzAxMjAsIAorMHgzYzA1MDAwOSwgMHhjMDAyYjNiLCAweDM0YTUxMzAwLCAweDEwMDAwMDBiLCAKKzB4MCwgMHg4ZjQyMDMwNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwNCwgCisweDhmNDIwMzA0LCAweDhmNDIwMDQ0LCAweGFmNDIwMDdjLCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweGEwMjA0MGYyLCAweGFmNDAwMDc4LCAweDhmNDIwMzE4LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzMTgsIDB4MTAwMDAwNDgsIDB4OGY0MjAzMTgsIAorMHhhNmIwMDAwYSwgMHg4ZjQzMDA0NCwgMHg4ZjQ0MDFhMCwgMHg4ZjQ1MDFhNCwgCisweDM0MDI4MDAwLCAweGFmYTIwMDEwLCAweDhmNDIwMDQ0LCAweDJhMDMwMjEsIAorMHgyNDA3MDAyMCwgMHhhZmEyMDAxNCwgMHg4ZjQyMDAwYywgMHgzMTk0MCwgCisweDYwNDgyMSwgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHg0MDIxLCAKKzB4YTkyODIxLCAweGE5MTgyYiwgMHg4ODIwMjEsIDB4NDBmODA5LCAKKzB4ODMyMDIxLCAweDEwNDBmZTFmLCAweDI0MGEwMDAxLCAweGEzNGEwNWM0LCAKKzB4OGZhYjAwNmMsIDB4OGZhYTAwNjQsIDB4MTcwNTgyMywgMHhhZmFiMDA2YywgCisweDhmYWIwMDljLCAweDE1MDUwMjEsIDB4MTZhMTAyYiwgMHgxMDQwMDAwNCwgCisweGFmYWEwMDY0LCAweDhmNDIwMTQ4LCAweDE0MjUwMjMsIDB4YWZhYTAwNjQsIAorMHg4ZjQyMDM2OCwgMHgyNDQyZmZmZiwgMHhhZjQyMDM2OCwgMHg4ZmFhMDA1YywgCisweDI0MGIwMDAxLCAweDhmNDIwMzY4LCAweDE1NGIwMDA2LCAweDI0MGIwMDAyLCAKKzB4OGY0MjAzNWMsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNWMsIDB4MTAwMDAwMGMsIAorMHg4ZjQyMDM1YywgMHgxMTRiMDAwNiwgMHgwLCAweDhmNDIwMzYwLCAKKzB4MjQ0MmZmZmYsIDB4YWY0MjAzNjAsIDB4MTAwMDAwMDUsIDB4OGY0MjAzNjAsIAorMHg4ZjQyMDM2NCwgMHgyNDQyZmZmZiwgMHhhZjQyMDM2NCwgMHg4ZjQyMDM2NCwgCisweDhmYWIwMDU0LCAweDhmYWEwMDRjLCAweGFkNGIwMDAwLCAweDhmNDIwMDQ0LCAKKzB4OGY0NDAwODgsIDB4OGY0MzAwNzgsIDB4MjQ0MjAwMDEsIDB4NDQxMDI0LCAKKzB4MjQ2MzAwMDEsIDB4YWY0MjAwNDQsIDB4YWY0MzAwNzgsIDB4OGZhYTAwNmMsIAorMHgxNTQwZmUwYiwgMHgwLCAweDhmYWIwMDZjLCAweDExNjAwMDFlLCAKKzB4MCwgMHg5MzQyMDVjNCwgMHgxMDQwMDAwOSwgMHgwLCAKKzB4OGZhYTAwNjQsIDB4YWY0YTAwYzQsIDB4YWY0YjAwYzAsIDB4OGZhYjAwN2MsIAorMHhhZjRiMDBjOCwgMHg4ZmFhMDA3NCwgMHgxMDAwMDAwZSwgMHhhZjRhMDBjYywgCisweDk3YWIwMDhlLCAweDExNjAwMDBiLCAweDM0MDM4MTAwLCAweDhmYTIwMDIwLCAKKzB4OGM0NjAwMGMsIDB4YTQ0MzAwMGMsIDB4OTdhYTAwODYsIDB4OGM0NDAwMDQsIAorMHg4YzQ1MDAwOCwgMHhhNDRhMDAwZSwgMHhhYzQ0MDAwMCwgMHhhYzQ1MDAwNCwgCisweGFjNDYwMDA4LCAweDhmNDIwMzRjLCAweDI0NDIwMDAxLCAweGFmNDIwMzRjLCAKKzB4MTAwMDAwMTAsIDB4OGY0MjAzNGMsIDB4OGZhYjAwN2MsIDB4MzE2NGZmZmYsIAorMHgyNDg0ZmZmYywgMHg4MDE4MjEsIDB4OGY0NDAyNTAsIDB4OGY0NTAyNTQsIAorMHg4ZjQ2MDExOCwgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzM4MmIsIAorMHg4MjIwMjEsIDB4ODcyMDIxLCAweGFmNDQwMjUwLCAweGMwZjgwOSwgCisweGFmNDUwMjU0LCAweDhmYmYwMGM4LCAweDhmYmUwMGM0LCAweDhmYjUwMGMwLCAKKzB4OGZiMzAwYmMsIDB4OGZiMjAwYjgsIDB4OGZiMTAwYjQsIDB4OGZiMDAwYjAsIAorMHgzZTAwMDA4LCAweDI3YmQwMGQwLCAweDNlMDAwMDgsIDB4MCwgCisweDI3YmRmZjM4LCAweDI0MGIwMDAxLCAweGFmYmYwMGMwLCAweGFmYmUwMGJjLCAKKzB4YWZiNTAwYjgsIDB4YWZiMzAwYjQsIDB4YWZiMjAwYjAsIDB4YWZiMTAwYWMsIAorMHhhZmIwMDBhOCwgMHhhM2EwMDA4NywgMHhhZmEwMDA0NCwgMHhhZmFiMDA1YywgCisweDkzNDIwNWM0LCAweGE3YTAwMDc2LCAweDEwNDAwMDA3LCAweGE3YTAwMDdlLCAKKzB4OGY0YzAwYzAsIDB4YWZhYzAwNjQsIDB4OGY0YjAwYzgsIDB4OGY1ZTAwYzQsIAorMHgxMDAwMDEzMCwgMHhhZmFiMDA2YywgMHg4ZjQyMDExNCwgMHg0MGY4MDksIAorMHgwLCAweDQwMzAyMSwgMHgxMGMwMDJhMSwgMHgwLCAKKzB4OGNjMjAwMDAsIDB4OGNjMzAwMDQsIDB4YWZhMjAwMjAsIDB4YWZhMzAwMjQsIAorMHg4ZmFjMDAyNCwgMHg4ZmJlMDAyMCwgMHgzMTgyZmZmZiwgMHgyNDQyZmZmYywgCisweGFmYTIwMDY0LCAweDNjMDIwMDA2LCAweDJjMjEwMjQsIDB4MTQ0MDAwMTUsIAorMHhhZmFjMDA2YywgMHg5M2MyMDAwMCwgMHgzMDQyMDAwMSwgMHgxMDQwMDAxMSwgCisweDI0MDJmZmZmLCAweDhmYzMwMDAwLCAweDE0NjIwMDA0LCAweDM0MDJmZmZmLCAKKzB4OTdjMzAwMDQsIDB4MTA2MjAwMGIsIDB4MCwgMHhjMDAyNGJiLCAKKzB4M2MwMjAyMSwgMHgzMDQyMDBmZiwgMHgxNDQwMDAwNiwgMHgwLCAKKzB4OGY0MjAxMTgsIDB4NDBmODA5LCAweDAsIDB4MTAwMDAyODAsIAorMHgwLCAweDhmYTIwMDI0LCAweDNjMDNmZmJmLCAweDM0NjNmZmZmLCAKKzB4NDMxMDI0LCAweDNjMDNmZmZmLCAweDQzMTgyNCwgMHgxNDYwMDAwMywgCisweGFmYTIwMDI0LCAweDEwMDAwMDQwLCAweDgwMjEsIDB4M2MwMjAwODAsIAorMHg2MjEwMjQsIDB4MTA0MDAwMDcsIDB4MCwgMHg4ZjQyMDM4YywgCisweDI0NDIwMDAxLCAweGFmNDIwMzhjLCAweDhmNDIwMzhjLCAweDEwMDAwMDM2LCAKKzB4MjQxMDAwMDEsIDB4OGY0MjAyMTAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyMTAsIAorMHg4ZjQyMDIxMCwgMHgzYzAyMDAwMSwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsIAorMHgzYzAyMDAwMiwgMHg4ZjQyMDFjNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDFjNCwgCisweDhmNDIwMWM0LCAweDNjMDIwMDAyLCAweDYyMTAyNCwgMHgxMDQwMDAwNiwgCisweDNjMDIwMDA0LCAweDhmNDIwMzdjLCAweDI0NDIwMDAxLCAweGFmNDIwMzdjLCAKKzB4OGY0MjAzN2MsIDB4M2MwMjAwMDQsIDB4NjIxMDI0LCAweDEwNDAwMDA2LCAKKzB4M2MwMjAwMDgsIDB4OGY0MjAzODAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzODAsIAorMHg4ZjQyMDM4MCwgMHgzYzAyMDAwOCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsIAorMHgzYzAyMDAxMCwgMHg4ZjQyMDM4NCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM4NCwgCisweDhmNDIwMzg0LCAweDNjMDIwMDEwLCAweDYyMTAyNCwgMHgxMDQwMDAwNiwgCisweDNjMDIwMDIwLCAweDhmNDIwMWMwLCAweDI0NDIwMDAxLCAweGFmNDIwMWMwLCAKKzB4OGY0MjAxYzAsIDB4M2MwMjAwMjAsIDB4NjIxMDI0LCAweDEwNDAwMDA2LCAKKzB4MjQxMDAwMDEsIDB4OGY0MjAzODgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzODgsIAorMHg4ZjQyMDM4OCwgMHgyNDEwMDAwMSwgMHg4YzAyMDI2MCwgMHg4ZmFiMDA2NCwgCisweDRiMTAyYiwgMHgxMDQwMDAxNSwgMHgzMjAyMDBmZiwgMHg4ZjQyMDFlOCwgCisweDI0NDIwMDAxLCAweGFmNDIwMWU4LCAweDhmNDIwMWU4LCAweDhmYWMwMDZjLCAKKzB4OGY4MjAwZTAsIDB4MzU4YzAxMDAsIDB4YWZhYzAwNmMsIDB4YWZhMjAwMTAsIAorMHg4ZjgyMDBlNCwgMHgyNDEwMDAwMSwgMHgzYzA0MDAwMSwgMHgyNDg0NjhhMCwgCisweGFmYTIwMDE0LCAweDhmYTYwMDIwLCAweDhmYTcwMDI0LCAweDNjMDUwMDA3LCAKKzB4YzAwMmIzYiwgMHgzNGE1MzYwMCwgMHgzMjAyMDBmZiwgMHgxMDQwMDAxMCwgCisweDNjMDIwMDgwLCAweDJjMjEwMjQsIDB4MTQ0MDAwMGUsIDB4MzJjMjA0MDAsIAorMHg4ZmFiMDA2YywgMHgzYzAyMDA4MCwgMHgzNDQyMDEwMCwgMHgxNjIxMDI0LCAKKzB4MTA0MDAwMDUsIDB4MCwgMHg4ZjQyMDIwYywgMHgyNDQyMDAwMSwgCisweGFmNDIwMjBjLCAweDhmNDIwMjBjLCAweDEwMDAwMjAyLCAweDhmYTMwMDY0LCAKKzB4MzJjMjA0MDAsIDB4MTA0MDAwMTIsIDB4MzQwMjgxMDAsIDB4OTdjMzAwMGMsIAorMHgxNDYyMDAwZiwgMHgwLCAweDI0MGMwMjAwLCAweGE3YWMwMDc2LCAKKzB4OTdjMjAwMGUsIDB4OGZjMzAwMDgsIDB4OGZjNDAwMDQsIDB4OGZhYjAwNjQsIAorMHg4ZmM1MDAwMCwgMHgyNTZiZmZmYywgMHhhZmFiMDA2NCwgMHhhN2EyMDA3ZSwgCisweGFmYzMwMDBjLCAweGFmYzQwMDA4LCAweGFmYzUwMDA0LCAweDI3ZGUwMDA0LCAKKzB4OGZhNzAwNjQsIDB4MzIwMjAwZmYsIDB4MTQ0MDAwMzQsIDB4M2MwMjAxMDAsIAorMHg5N2M0MDAwYywgMHgyYzgzMDVkZCwgMHgzODgyODg3MCwgMHgyYzQyMDAwMSwgCisweDYyMTgyNSwgMHgxMDYwMDAxNSwgMHgyODIxLCAweDMyYzIwODAwLCAKKzB4MTA0MDAwMTUsIDB4MjQwMjA4MDAsIDB4OTdjMzAwMTQsIDB4MTQ2MjAwMTIsIAorMHgzNDAyYWFhYSwgMHg5N2MzMDAwZSwgMHgxNDYyMDAwNywgMHgyMDIxLCAKKzB4OTdjMzAwMTAsIDB4MjQwMjAzMDAsIDB4MTQ2MjAwMDQsIDB4ODAxMDIxLCAKKzB4OTdjMjAwMTIsIDB4MmM0NDAwMDEsIDB4ODAxMDIxLCAweDU0NDAwMDA2LCAKKzB4MjQwNTAwMTYsIDB4MTAwMDAwMDQsIDB4MCwgMHgyNDAyMDgwMCwgCisweDUwODIwMDAxLCAweDI0MDUwMDBlLCAweDEwYTAwMDEzLCAweDNjNTIwMjEsIAorMHgyNDgzMDAwOSwgMHgzYzAyMDAxZiwgMHgzNDQyZmZmZiwgMHg0MzEwMmIsIAorMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LCAweDYyMTgyMywgCisweDkwNjIwMDAwLCAweDM4NDMwMDA2LCAweDJjNjMwMDAxLCAweDM4NDIwMDExLCAKKzB4MmM0MjAwMDEsIDB4NjIxODI1LCAweDEwNjAwMDA0LCAweDNjMDIwMTAwLCAKKzB4OTQ4MjAwMDIsIDB4NDUzODIxLCAweDNjMDIwMTAwLCAweDJjMjEwMjQsIAorMHg1MDQwMDAwZSwgMHhhZmE3MDA2NCwgMHg4ZmFjMDA2NCwgMHgxMGVjMDAwOCwgCisweDNjMDUwMDA3LCAweDNjMDQwMDAxLCAweDI0ODQ2OTA4LCAweDhmYTYwMDY0LCAKKzB4MzRhNTQwMDAsIDB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgCisweDhmYWIwMDY0LCAweDI1NmIwMDA0LCAweGFmYWIwMDY0LCAweDhmNDIwMDgwLCAKKzB4OGZhYzAwNjQsIDB4NGMxMDJiLCAweDEwNDAwMDJjLCAweDMyYzI4MDAwLCAKKzB4MTA0MDAwMzQsIDB4MjQwYjAwMDMsIDB4MzJjMjEwMDAsIDB4MTA0MDAwMzEsIAorMHhhZmFiMDA1YywgMHgxMDAwMDAyZSwgMHgyNDBjMDAwNCwgMHg4ZjQyMDM1MCwgCisweDI0MDNmZmJmLCAweDI4M2EwMjQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNTAsIAorMHgxMDAwMDE3MywgMHg4ZjQyMDM1MCwgMHgzYzAyMDgwMCwgMHgyYzJiMDI1LCAKKzB4MjQwMmZmYmYsIDB4MjgyYTAyNCwgMHg4ZjgzMDEyOCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2OGQwLCAweDI2NjIwMDAxLCAweGFmYTIwMDE0LCAweGFmYTMwMDEwLCAKKzB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDcsIDB4YzAwMmIzYiwgCisweDM0YTU1MzAwLCAweDEwMDAwMTYyLCAweDAsIDB4OGVhMjAwMDAsIAorMHg4ZWEzMDAwNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjhlOCwgMHhhZmIwMDAxMCwgCisweGFmYjEwMDE0LCAweDhlYTcwMDE4LCAweDM0YTU1OTAwLCAweGMwMDJiM2IsIAorMHg2MDMwMjEsIDB4MTAwMDAxNTYsIDB4MCwgMHg4ZjQyMDA4NCwgCisweDhmYWIwMDY0LCAweDRiMTAyYiwgMHgxNDQwMDAwNywgMHgzYzAyMDAwMSwgCisweDJjMjEwMjQsIDB4MTA0MDAwMDQsIDB4MCwgMHgyNDBjMDAwMiwgCisweGFmYWMwMDVjLCAweDhmYWIwMDY0LCAweDExNjAwMTY2LCAweDI3YWMwMDIwLCAKKzB4YWZhYzAwOGMsIDB4OGZhYjAwNWMsIDB4MjQwYzAwMDEsIDB4NTU2YzAwMjEsIAorMHgyNDBjMDAwMiwgMHg4ZjQzMDA1NCwgMHg4ZjQyMDA1MCwgMHgxMDYyMDAwYiwgCisweDI3NGIwMDU0LCAweDhmNTEwMDU0LCAweDM0MDNlY2MwLCAweGFmYWIwMDRjLCAKKzB4MjYyMjAwMDEsIDB4MzA0MjAxZmYsIDB4YWZhMjAwNTQsIDB4MTExMTQwLCAKKzB4NDMxMDIxLCAweDEwMDAwMDZiLCAweDJlMmE4MjEsIDB4OGY0MjAwNDQsIAorMHg4ZmFjMDA2NCwgMHgzYzA0MDAwMSwgMHgyNDg0NjhhYywgMHhhZmFjMDAxNCwgCisweGFmYTIwMDEwLCAweDhmNDYwMDU0LCAweDhmNDcwMDUwLCAweDNjMDUwMDA3LCAKKzB4YzAwMmIzYiwgMHgzNGE1NDMwMCwgMHg4ZjQzMDM1MCwgMHgyNDAyZmZiZiwgCisweDI4MmEwMjQsIDB4MjQ2MzAwMDEsIDB4YWY0MzAzNTAsIDB4MTAwMDAxMjQsIAorMHg4ZjQyMDM1MCwgMHgxNTZjMDAxZCwgMHgwLCAweDhmNDMwMDc0LCAKKzB4OGY0MjAwNzAsIDB4MTA2MjAwMGEsIDB4Mjc0YjAwNzQsIDB4OGY1MTAwNzQsIAorMHhhZmFiMDA0YywgMHgyNjIyMDAwMSwgMHgzMDQyMDNmZiwgMHhhZmEyMDA1NCwgCisweDExMTE0MCwgMHgyNDQyNmNjMCwgMHgxMDAwMDA0YSwgMHgyZTJhODIxLCAKKzB4OGY0MjAwNDQsIDB4OGZhYzAwNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4YjgsIAorMHgzYzA1MDAwNywgMHhhZmFjMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZjQ2MDA3NCwgCisweDhmNDcwMDcwLCAweDM0YTU0NTAwLCAweDI0MGIwMDAxLCAweGMwMDJiM2IsIAorMHhhZmFiMDA1YywgMHgxMDAwZmZjMywgMHgwLCAweDhmNDMwMDY0LCAKKzB4OGY0MjAwNjAsIDB4MTA2MjAwMWEsIDB4Mjc0YzAwNjQsIDB4OGY1MTAwNjQsIAorMHg4ZmFiMDA1YywgMHhhZmFjMDA0YywgMHgyNjIyMDAwMSwgMHgzMDQyMDBmZiwgCisweGFmYTIwMDU0LCAweDI0MDIwMDA0LCAweDE1NjIwMDBlLCAweDExMTE0MCwgCisweDExMTE4MCwgMHgyNDQyMGNjMCwgMHgyZTIxMDIxLCAweGFmYTIwMDQ0LCAKKzB4OTQ0MjAwMmEsIDB4OGZhYzAwNDQsIDB4OGZhYjAwNjQsIDB4NGIxMDJiLCAKKzB4MTA0MDAwMjQsIDB4MjU5NTAwMjAsIDB4MjQwYzAwMDEsIDB4MTAwMDAwMjEsIAorMHhhM2FjMDA4NywgMHgyNDQyNGNjMCwgMHgxMDAwMDAxZSwgMHgyZTJhODIxLCAKKzB4OGY0MjAwNDQsIDB4OGZhYjAwNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4YzQsIAorMHhhZmFiMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZjQ2MDA2NCwgMHg4ZjQ3MDA2MCwgCisweDNjMDUwMDA3LCAweGMwMDJiM2IsIDB4MzRhNTQ4MDAsIDB4M2MwMjAwMDgsIAorMHgyYzIxMDI0LCAweDE0NDBmZjYxLCAweDAsIDB4OGY0MjAzNzAsIAorMHgyNDBjMDAwMSwgMHhhZmFjMDA1YywgMHgyNDQyMDAwMSwgMHhhZjQyMDM3MCwgCisweDEwMDBmZjkwLCAweDhmNDIwMzcwLCAweDI3YTMwMDM2LCAweDEzMTA0MCwgCisweDYyMTgyMSwgMHg5NDYyMDAwMCwgMHg0NDEwMjEsIDB4MTAwMDAwMWYsIAorMHhhNDYyMDAwMCwgMHhhZWJlMDAxOCwgMHg5M2EyMDA4NywgMHgxMDQwMDA4NCwgCisweDk4MjEsIDB4OGZhYjAwNDQsIDB4OGZhNDAwNjQsIDB4OGZhMzAwOGMsIAorMHgyNTYyMDAyMCwgMHhhZmEyMDAyOCwgMHgyNTYyMDAwOCwgMHhhZmEyMDAzMCwgCisweDI1NjIwMDEwLCAweGFmYWIwMDJjLCAweGFmYTIwMDM0LCAweDk1NjIwMDJhLCAKKzB4YTdhMjAwMzgsIDB4OTU2MjAwMTgsIDB4YTdhMjAwM2EsIDB4OTU2MjAwMWEsIAorMHhhN2EyMDAzYywgMHg5NTYyMDAxYywgMHhhN2EyMDAzZSwgMHg5NDYyMDAxOCwgCisweDI0NjMwMDAyLCAweDgyMjAyMywgMHgxODgwZmZkZiwgMHgyNjczMDAwMSwgCisweDJlNjIwMDA0LCAweDE0NDBmZmY5LCAweDAsIDB4OGY0MjAwZmMsIAorMHgyNjIxMDJhLCAweDE0NDAwMDMwLCAweDI0MDMwMDAxLCAweDhmODMwMTJjLCAKKzB4MTA2MDAwMjgsIDB4MCwgMHg4ZjgyMDEyNCwgMHg0MzEwMjMsIAorMHgyMjE0MywgMHg1ODgwMDAwMSwgMHgyNDg0MDA0MCwgMHg4ZjgyMDEyOCwgCisweDQzMTAyMywgMHgyMTk0MywgMHg1ODYwMDAwMSwgMHgyNDYzMDA0MCwgCisweDY0MTAyYSwgMHg1NDQwMDAwMSwgMHg2MDIwMjEsIDB4YWY0NDAwZmMsIAorMHg4ZjQyMDBmYywgMHgyNjIxMDJhLCAweDEwNDAwMDE2LCAweDI0MDMwMDAxLCAKKzB4MTAwMDAwMWEsIDB4MzA2MjAwZmYsIDB4OGZhYzAwOGMsIDB4MTAxMDQwLCAKKzB4NGMxMDIxLCAweDk0NDcwMDE4LCAweDEwMTA4MCwgMHg0YzEwMjEsIAorMHhhZmJlMDAxMCwgMHg4YzQyMDAwOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjhkYywgCisweDNjMDUwMDA3LCAweDhjNDMwMDA0LCAweDhjNDIwMDAwLCAweDM0YTU1NTAwLCAKKzB4MjAwMzAyMSwgMHhjMDAyYjNiLCAweGFmYTMwMDE0LCAweDEwMDAwMDM5LCAKKzB4MCwgMHg4ZjQyMDMzNCwgMHgxODIxLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzMzQsIDB4OGY0MjAzMzQsIDB4MzA2MjAwZmYsIDB4MTA0MGZmMDYsIAorMHg4MDIxLCAweDhmNDMwMDA4LCAweDI0MDJmYmZmLCAweDEyNjAwMDJkLCAKKzB4NjI1MDI0LCAweDNjMGI0MDAwLCAweDIyYjQwMjUsIDB4OGZiMTAwOGMsIAorMHgyNjY5ZmZmZiwgMHgyMjA5MDIxLCAweDhlNDIwMDA4LCAweDk2MjcwMDE4LCAKKzB4OGM0NDAwMDAsIDB4OGM0NTAwMDQsIDB4NTYwOTAwMDQsIDB4MjQwYjAwMDEsIAorMHgyNDBjMDAwMiwgMHgxMDAwMDAwMiwgMHhhZmFjMDAxMCwgMHhhZmFiMDAxMCwgCisweDE2MDAwMDA0LCAweGFmYTgwMDE0LCAweDhmNDIwMDA4LCAweDEwMDAwMDAyLCAKKzB4YWZhMjAwMTgsIDB4YWZhYTAwMTgsIDB4OGY0MjAxMGMsIDB4M2MwMzAyMSwgCisweGFmYTgwMDk4LCAweGFmYTkwMDljLCAweDQwZjgwOSwgMHhhZmFhMDBhMCwgCisweDhmYTgwMDk4LCAweDhmYTkwMDljLCAweDhmYWEwMGEwLCAweDEwNDBmZmMyLCAKKzB4M2MwMjAwMWYsIDB4OTYyMzAwMTgsIDB4MzQ0MmZmZmYsIDB4M2MzZjAyMSwgCisweDVlMTAyYiwgMHgxMDQwMDAwMywgMHgyNjMxMDAwMiwgMHg4ZjQyMDE0OCwgCisweDNjMmYwMjMsIDB4MjYxMDAwMDEsIDB4MjEzMTAyYiwgMHgxNDQwZmZkYSwgCisweDI2NTIwMDA0LCAweDhmYjAwMDY0LCAweDEwMDAwMDFhLCAweDAsIAorMHg5NmEzMDAwYSwgMHg4ZmIwMDA2NCwgMHg3MDEwMmIsIDB4NTQ0MDAwMDEsIAorMHg2MDgwMjEsIDB4OGVhNDAwMDAsIDB4OGVhNTAwMDQsIDB4OGZhYjAwNWMsIAorMHgyNDBjMDAwMiwgMHhhZmFjMDAxMCwgMHg5MzQzMDVjNCwgMHhiMTcwMCwgCisweDEwNjAwMDAzLCAweDIyMjMwMjUsIDB4M2MwMjA4MDAsIDB4YzIzMDI1LCAKKzB4YWZhNjAwMTQsIDB4OGY0MjAwMDgsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIAorMHgzYzAzMDIxLCAweDQwZjgwOSwgMHgyMDAzODIxLCAweDEwNDBmZWNiLCAKKzB4M2MwNTAwMDcsIDB4OTdhYzAwNzYsIDB4MTE4MDAwMDcsIDB4OTZhMzAwMGUsIAorMHg5MzQyMDVjNCwgMHgxNDQwMDAwNCwgMHgwLCAweDk3YWIwMDdlLCAKKzB4NmMxODI1LCAweGE2YWIwMDE2LCAweDhmYWMwMDZjLCAweDNjMDJmZmZmLCAKKzB4MTgyMTAyNCwgMHgxMDQwMDAwMywgMHhjMTQwMiwgMHgzNDYzMDQwMCwgCisweGE2YTIwMDE0LCAweGE2YjAwMDBhLCAweDhmYWIwMDY0LCAweDU2MGIwMDA2LCAKKzB4M2QwZjAyMSwgMHgzNDYyMDAwNCwgMHhhZmEwMDA2NCwgMHhhNmEyMDAwZSwgCisweDEwMDAwMDBkLCAweGEzNDAwNWM0LCAweDhmYWMwMDY0LCAweDNjMDIwMDFmLCAKKzB4MzQ0MmZmZmYsIDB4NWUxMDJiLCAweDE5MDYwMjMsIDB4YWZhYzAwNjQsIAorMHhhNmEzMDAwZSwgMHgyNDBiMDAwMSwgMHgxMDQwMDAwMywgMHhhMzRiMDVjNCwgCisweDhmNDIwMTQ4LCAweDNjMmYwMjMsIDB4OGZhYjAwNTQsIDB4OGZhYzAwNGMsIAorMHhhZDhiMDAwMCwgMHg4ZmFjMDA2NCwgMHgxNTgwZmViYSwgMHgwLCAKKzB4OGZhYjAwNjQsIDB4MTE2MDAwMWIsIDB4MCwgMHg5MzQyMDVjNCwgCisweDEwNDAwMDA2LCAweDAsIDB4YWY1ZTAwYzQsIDB4YWY0YjAwYzAsIAorMHg4ZmFjMDA2YywgMHgxMDAwMDAwZSwgMHhhZjRjMDBjOCwgMHg5N2FiMDA3NiwgCisweDExNjAwMDBiLCAweDM0MDM4MTAwLCAweDhmYTIwMDIwLCAweDhjNDYwMDBjLCAKKzB4YTQ0MzAwMGMsIDB4OTdhYzAwN2UsIDB4OGM0NDAwMDQsIDB4OGM0NTAwMDgsIAorMHhhNDRjMDAwZSwgMHhhYzQ0MDAwMCwgMHhhYzQ1MDAwNCwgMHhhYzQ2MDAwOCwgCisweDhmNDIwMzRjLCAweDI0NDIwMDAxLCAweGFmNDIwMzRjLCAweDEwMDAwMDEwLCAKKzB4OGY0MjAzNGMsIDB4OGZhYjAwNmMsIDB4MzE2NGZmZmYsIDB4MjQ4NGZmZmMsIAorMHg4MDE4MjEsIDB4OGY0NDAyNTAsIDB4OGY0NTAyNTQsIDB4OGY0NjAxMTgsIAorMHgxMDIxLCAweGEzMjgyMSwgMHhhMzM4MmIsIDB4ODIyMDIxLCAKKzB4ODcyMDIxLCAweGFmNDQwMjUwLCAweGMwZjgwOSwgMHhhZjQ1MDI1NCwgCisweDhmYmYwMGMwLCAweDhmYmUwMGJjLCAweDhmYjUwMGI4LCAweDhmYjMwMGI0LCAKKzB4OGZiMjAwYjAsIDB4OGZiMTAwYWMsIDB4OGZiMDAwYTgsIDB4M2UwMDAwOCwgCisweDI3YmQwMGM4LCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwgCisweGFmYmYwMDI0LCAweGFmYjAwMDIwLCAweDhmNDMwMDRjLCAweDhmNDIwMDQ4LCAKKzB4MTA2MjAwMzQsIDB4MCwgMHg4ZjQzMDA0OCwgMHg4ZjQyMDA0YywgCisweDYyMjAyMywgMHg0ODIwMDAxLCAweDI0ODQwMjAwLCAweDhmNDMwMDU0LCAKKzB4OGY0MjAwNGMsIDB4NDMxMDJiLCAweDE0NDAwMDA0LCAweDI0MDIwMjAwLCAKKzB4OGY0MzAwNGMsIDB4MTAwMDAwMDUsIDB4NDMxMDIzLCAweDhmNDIwMDU0LCAKKzB4OGY0MzAwNGMsIDB4NDMxMDIzLCAweDI0NDJmZmZmLCAweDQwNTAyMSwgCisweDhhMTAyYSwgMHg1NDQwMDAwMSwgMHg4MDUwMjEsIDB4OGY0OTAwNGMsIAorMHg4ZjQ4MDA0YywgMHg4ZjQ0MDE4OCwgMHg4ZjQ1MDE4YywgMHg4ZjQ2MDA0YywgCisweDI0MDcxMDAwLCAweGFmYTcwMDEwLCAweDg0MTQwLCAweDEwMDE4MjEsIAorMHgxMmE0ODIxLCAweDMxMzAwMWZmLCAweGFmYjAwMDE0LCAweDhmNDcwMDE0LCAKKzB4MTAyMSwgMHg2MzE0MCwgMHhhZmE3MDAxOCwgMHhhMzI4MjEsIAorMHhhMzM4MmIsIDB4ODIyMDIxLCAweDg3MjAyMSwgMHgzNDAyZWNjMCwgCisweGMyMzAyMSwgMHg4ZjQyMDEwOCwgMHgyZTYzMDIxLCAweDQwZjgwOSwgCisweGEzOTQwLCAweDU0NDAwMDAxLCAweGFmNTAwMDRjLCAweDhmNDMwMDRjLCAKKzB4OGY0MjAwNDgsIDB4MTQ2MjAwMTgsIDB4MCwgMHg4ZjQyMDAwMCwgCisweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIAorMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsIAorMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAKKzB4OGY4MjAwNjAsIDB4MjQwM2ZkZmYsIDB4NDMxMDI0LCAweGFmODIwMDYwLCAKKzB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwMDAwMiwgCisweGFmODAwMDRjLCAweGFmODAwMDQ4LCAweDhmYmYwMDI0LCAweDhmYjAwMDIwLCAKKzB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzZTAwMDA4LCAweDAsIAorMHgyN2JkZmZkOCwgMHhhZmJmMDAyNCwgMHhhZmIwMDAyMCwgMHg4ZjQzMDA1YywgCisweDhmNDIwMDU4LCAweDEwNjIwMDQ5LCAweDAsIDB4OGY0MzAwNTgsIAorMHg4ZjQyMDA1YywgMHg2MjIwMjMsIDB4NDgyMDAwMSwgMHgyNDg0MDEwMCwgCisweDhmNDMwMDY0LCAweDhmNDIwMDVjLCAweDQzMTAyYiwgMHgxNDQwMDAwNCwgCisweDI0MDIwMTAwLCAweDhmNDMwMDVjLCAweDEwMDAwMDA1LCAweDQzMTAyMywgCisweDhmNDIwMDY0LCAweDhmNDMwMDVjLCAweDQzMTAyMywgMHgyNDQyZmZmZiwgCisweDQwMzgyMSwgMHg4NzEwMmEsIDB4NTQ0MDAwMDEsIDB4ODAzODIxLCAKKzB4OGY0MjAwNWMsIDB4NDcxMDIxLCAweDMwNTAwMGZmLCAweDMyYzIxMDAwLCAKKzB4MTA0MDAwMTUsIDB4MjQwODIwMDAsIDB4OGY0OTAwNWMsIDB4OGY0NDAxOTAsIAorMHg4ZjQ1MDE5NCwgMHg4ZjQ2MDA1YywgMHg3Mzk4MCwgMHhhZmE4MDAxMCwgCisweGFmYjAwMDE0LCAweDhmNDgwMDE0LCAweDk0OTgwLCAweDEyMDE4MjEsIAorMHgxMDIxLCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLCAKKzB4ODkyMDIxLCAweDYzMTgwLCAweGFmYTgwMDE4LCAweDhmNDIwMTA4LCAKKzB4MTAwMDAwMTQsIDB4MjRjNjBjYzAsIDB4OGY0OTAwNWMsIDB4OGY0NDAxOTAsIAorMHg4ZjQ1MDE5NCwgMHg4ZjQ2MDA1YywgMHg3Mzk0MCwgMHhhZmE4MDAxMCwgCisweGFmYjAwMDE0LCAweDhmNDgwMDE0LCAweDk0OTQwLCAweDEyMDE4MjEsIAorMHgxMDIxLCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLCAKKzB4ODkyMDIxLCAweDYzMTQwLCAweGFmYTgwMDE4LCAweDhmNDIwMTA4LCAKKzB4MjRjNjRjYzAsIDB4NDBmODA5LCAweDJlNjMwMjEsIDB4NTQ0MDAwMDEsIAorMHhhZjUwMDA1YywgMHg4ZjQzMDA1YywgMHg4ZjQyMDA1OCwgMHgxNDYyMDAxOCwgCisweDAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwgCisweGFmODAwMDRjLCAweDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIAorMHgxMDAwMDAwNSwgMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAKKzB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA2MCwgMHgyNDAzZmVmZiwgCisweDQzMTAyNCwgMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgCisweDAsIDB4MTAwMDAwMDIsIDB4YWY4MDAwNGMsIDB4YWY4MDAwNDgsIAorMHg4ZmJmMDAyNCwgMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAKKzB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmQ4LCAweGFmYmYwMDI0LCAKKzB4YWZiMDAwMjAsIDB4OGY0MzAwNmMsIDB4OGY0MjAwNjgsIDB4MTA2MjAwMzMsIAorMHgwLCAweDhmNDMwMDY4LCAweDhmNDIwMDZjLCAweDYyMjAyMywgCisweDQ4MjAwMDEsIDB4MjQ4NDA0MDAsIDB4OGY0MzAwNzQsIDB4OGY0MjAwNmMsIAorMHg0MzEwMmIsIDB4MTQ0MDAwMDQsIDB4MjQwMjA0MDAsIDB4OGY0MzAwNmMsIAorMHgxMDAwMDAwNSwgMHg0MzEwMjMsIDB4OGY0MjAwNzQsIDB4OGY0MzAwNmMsIAorMHg0MzEwMjMsIDB4MjQ0MmZmZmYsIDB4NDA1MDIxLCAweDhhMTAyYSwgCisweDU0NDAwMDAxLCAweDgwNTAyMSwgMHg4ZjQ5MDA2YywgMHg4ZjQ4MDA2YywgCisweDhmNDQwMTk4LCAweDhmNDUwMTljLCAweDhmNDYwMDZjLCAweDI0MDc0MDAwLCAKKzB4YWZhNzAwMTAsIDB4ODQxNDAsIDB4MTAwMTgyMSwgMHgxMmE0ODIxLCAKKzB4MzEzMDAzZmYsIDB4YWZiMDAwMTQsIDB4OGY0NzAwMTQsIDB4MTAyMSwgCisweDYzMTQwLCAweDI0YzY2Y2MwLCAweGFmYTcwMDE4LCAweGEzMjgyMSwgCisweGEzMzgyYiwgMHg4MjIwMjEsIDB4ODcyMDIxLCAweDhmNDIwMTA4LCAKKzB4MmU2MzAyMSwgMHg0MGY4MDksIDB4YTM5NDAsIDB4NTQ0MDAwMDEsIAorMHhhZjUwMDA2YywgMHg4ZjQzMDA2YywgMHg4ZjQyMDA2OCwgMHgxNDYyMDAxOCwgCisweDAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwgCisweGFmODAwMDRjLCAweDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIAorMHgxMDAwMDAwNSwgMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAKKzB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA2MCwgMHgyNDAzZjdmZiwgCisweDQzMTAyNCwgMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgCisweDAsIDB4MTAwMDAwMDIsIDB4YWY4MDAwNGMsIDB4YWY4MDAwNDgsIAorMHg4ZmJmMDAyNCwgMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAKKzB4M2UwMDAwOCwgMHgwLCAweDhmNDIwMGZjLCAweDNjMDMwMDAxLCAKKzB4OGY0NDAwZjgsIDB4MzQ2MzMwYzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAwZmMsIAorMHg4Zjg1MDEyOCwgMHgyZTMxMDIxLCAweDU0ODIwMDA0LCAweDI0ODIwMDA4LCAKKzB4M2MwMjAwMDEsIDB4MzQ0MjJlYzgsIDB4MmUyMTAyMSwgMHg0MDE4MjEsIAorMHhhZjQzMDBmOCwgMHhhYzYwMDAwMCwgMHg4ZjQyMDBmNCwgMHgxNDYyMDAwNCwgCisweDNjMDIwMDAxLCAweDI0YTIwMDIwLCAweDEwMDAwMDBmLCAweGFmODIwMTI4LCAKKzB4OGY0MzAwZjgsIDB4MzQ0MjMwYzgsIDB4MmUyMTAyMSwgMHg1NDYyMDAwNCwgCisweDI0NjIwMDA4LCAweDNjMDIwMDAxLCAweDM0NDIyZWM4LCAweDJlMjEwMjEsIAorMHg0MDE4MjEsIDB4OGM2MjAwMDQsIDB4MjExNDAsIDB4YTIxMDIxLCAKKzB4YWY4MjAxMjgsIDB4YWM2MDAwMDAsIDB4OGNhMzAwMTgsIDB4MzA2MjAwNzAsIAorMHgxMDQwMDAyZCwgMHgzMDYyMDAyMCwgMHgxMDQwMDAwNCwgMHgzYzAyMDAxMCwgCisweDJjMjEwMjQsIDB4MTA0MDAwMGQsIDB4MCwgMHgzMDYyMDA0MCwgCisweDEwNDAwMDA0LCAweDNjMDIwMDIwLCAweDJjMjEwMjQsIDB4MTA0MDAwMDcsIAorMHgwLCAweDMwNjIwMDEwLCAweDEwNDAwMDFmLCAweDNjMDIwMDQwLCAKKzB4MmMyMTAyNCwgMHgxNDQwMDAxYywgMHgwLCAweDhmODIwMDQwLCAKKzB4MzA0MjAwMDEsIDB4MTQ0MDAwMDgsIDB4MjAyMSwgMHg4YzAzMDEwNCwgCisweDI0MDIwMDAxLCAweDUwNjIwMDA1LCAweDI0MDQwMDAxLCAweDhjMDIwMjY0LCAKKzB4MTA0MDAwMDMsIDB4ODAxMDIxLCAweDI0MDQwMDAxLCAweDgwMTAyMSwgCisweDEwNDAwMDA2LCAweDAsIDB4OGY0MjAzMGMsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDMwYywgMHgxMDAwMDAwOCwgMHg4ZjQyMDMwYywgMHg4ZjgyMDA0NCwgCisweDM0NDIwMDA0LCAweGFmODIwMDQ0LCAweDhmNDIwMzA4LCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsIDB4M2UwMDAwOCwgMHgwLCAKKzB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZjk4LCAweGFmYmYwMDYwLCAKKzB4YWZiZTAwNWMsIDB4YWZiNTAwNTgsIDB4YWZiMzAwNTQsIDB4YWZiMjAwNTAsIAorMHhhZmIxMDA0YywgMHhhZmIwMDA0OCwgMHg4ZjQyMDBmYywgMHgyNDQyMDAwMSwgCisweGFmNDIwMGZjLCAweDhmODgwMTI4LCAweDI1MDIwMDIwLCAweGFmODIwMTI4LCAKKzB4OGQwMzAwMTgsIDB4MzA2MjAwNzAsIDB4MTA0MDAwMmUsIDB4MzA2MjAwMjAsIAorMHgxMDQwMDAwNCwgMHgzYzAyMDAxMCwgMHgyYzIxMDI0LCAweDEwNDAwMDBkLCAKKzB4MCwgMHgzMDYyMDA0MCwgMHgxMDQwMDAwNCwgMHgzYzAyMDAyMCwgCisweDJjMjEwMjQsIDB4MTA0MDAwMDcsIDB4MCwgMHgzMDYyMDAxMCwgCisweDEwNDAwMWE5LCAweDNjMDIwMDQwLCAweDJjMjEwMjQsIDB4MTQ0MDAxYTYsIAorMHgwLCAweDhmODIwMDQwLCAweDMwNDIwMDAxLCAweDE0NDAwMDA4LCAKKzB4MjAyMSwgMHg4YzAzMDEwNCwgMHgyNDAyMDAwMSwgMHg1MDYyMDAwNSwgCisweDI0MDQwMDAxLCAweDhjMDIwMjY0LCAweDEwNDAwMDAzLCAweDgwMTAyMSwgCisweDI0MDQwMDAxLCAweDgwMTAyMSwgMHgxMDQwMDAwNiwgMHgwLCAKKzB4OGY0MjAzMGMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMGMsIDB4MTAwMDAxOTIsIAorMHg4ZjQyMDMwYywgMHg4ZjgyMDA0NCwgMHgzNDQyMDAwNCwgMHhhZjgyMDA0NCwgCisweDhmNDIwMzA4LCAweDI0NDIwMDAxLCAweGFmNDIwMzA4LCAweDEwMDAwMThhLCAKKzB4OGY0MjAzMDgsIDB4MzA2MjAwMDIsIDB4MTA0MDAxNGIsIDB4M2MwMjA4MDAsIAorMHg4ZDFlMDAxYywgMHgxZTU3MDIsIDB4YWZhYTAwMzQsIDB4OTUwYTAwMTYsIAorMHgzYzIyMDI0LCAweGFmYWEwMDI0LCAweDhmYWEwMDM0LCAweDI0MDIwMDAxLCAKKzB4MTU0MjAwMDYsIDB4MzNkZWZmZmYsIDB4MWUxMTQwLCAweDM0MDNlY2MwLCAKKzB4NDMxMDIxLCAweDEwMDAwMDEwLCAweDJlMmE4MjEsIDB4MjQwMjAwMDIsIAorMHgxNTQyMDAwNSwgMHgyNDAyMDAwMywgMHgxZTExNDAsIDB4MjQ0MjZjYzAsIAorMHgxMDAwMDAwOSwgMHgyZTJhODIxLCAweDE1NDIwMDA1LCAweDFlMTE4MCwgCisweDFlMTE0MCwgMHgyNDQyNGNjMCwgMHgxMDAwMDAwMywgMHgyZTJhODIxLCAKKzB4NTcxMDIxLCAweDI0NTUwY2UwLCAweDk2YTIwMDBlLCAweDMwNGFmZmZjLCAKKzB4MzA0MjA0MDAsIDB4MTA0MDAwMDMsIDB4YWZhYTAwMmMsIDB4MTAwMDAwZTEsIAorMHg4ODIxLCAweDEwODAwMDA0LCAweDg4MjEsIDB4OTdiMTAwMjYsIAorMHgxMDAwMDBkZCwgMHhhNmIxMDAxMiwgMHg4ZWIzMDAxOCwgMHg5NjZhMDAwYywgCisweGE3YWEwMDNlLCAweDk3YTUwMDNlLCAweDJjYTMwNWRkLCAweDM4YTI4ODcwLCAKKzB4MmM0MjAwMDEsIDB4NjIxODI1LCAweDEwNjAwMDE1LCAweDIwMjEsIAorMHgzMmMyMDgwMCwgMHgxMDQwMDAxNSwgMHgyNDAyMDgwMCwgMHg5NjYzMDAxNCwgCisweDE0NjIwMDEyLCAweDM0MDJhYWFhLCAweDk2NjMwMDBlLCAweDE0NjIwMDA3LCAKKzB4MjgyMSwgMHg5NjYzMDAxMCwgMHgyNDAyMDMwMCwgMHgxNDYyMDAwNCwgCisweGEwMTAyMSwgMHg5NjYyMDAxMiwgMHgyYzQ1MDAwMSwgMHhhMDEwMjEsIAorMHg1NDQwMDAwNiwgMHgyNDA0MDAxNiwgMHgxMDAwMDAwNCwgMHgwLCAKKzB4MjQwMjA4MDAsIDB4NTBhMjAwMDEsIDB4MjQwNDAwMGUsIDB4MTA4MDAwYjksIAorMHgyNjQ5MDIxLCAweDkyNDIwMDAwLCAweDMwNDIwMDBmLCAweDI4MDgwLCAKKzB4MzJjMjAxMDAsIDB4MTA0MDAwMjAsIDB4MjUwMTgyMSwgMHgzYzAyMDAyMCwgCisweDQzMTAyYiwgMHgxNDQwMDAwZSwgMHgyNDAyMDIxLCAweDI4MjEsIAorMHg5NDgyMDAwMCwgMHgyNDg0MDAwMiwgMHhhMjI4MjEsIDB4ODMxMDJiLCAKKzB4MTQ0MGZmZmIsIDB4MzBhMmZmZmYsIDB4NTFjMDIsIDB4NjIyODIxLCAKKzB4NTFjMDIsIDB4MzBhMmZmZmYsIDB4MTAwMDAwMDksIDB4NjIyODIxLCAKKzB4OGY0NzAxNDgsIDB4OGY0MjAxMTAsIDB4MTAyODQyLCAweDNjMDYwMDIwLCAKKzB4NDBmODA5LCAweGFmYTgwMDQwLCAweDMwNDVmZmZmLCAweDhmYTgwMDQwLCAKKzB4NTBhMDAwMDEsIDB4MzQwNWZmZmYsIDB4OGZhYTAwMmMsIDB4MzU0YTAwMDIsIAorMHgxMDAwMDAwMiwgMHhhZmFhMDAyYywgMHgyODIxLCAweDMyYzIwMDgwLCAKKzB4MTA0MDAwOTAsIDB4YTZhNTAwMTAsIDB4MjY0MzAwMDksIDB4M2MwMjAwMWYsIAorMHgzNDQyZmZmZiwgMHg0MzEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgCisweDhmNDIwMTQ4LCAweDYyMTgyMywgMHg5MDY2MDAwMCwgMHgzMGMyMDBmZiwgCisweDM4NDMwMDA2LCAweDJjNjMwMDAxLCAweDM4NDIwMDExLCAweDJjNDIwMDAxLCAKKzB4NjIxODI1LCAweDEwNjAwMDdmLCAweDI0MDIwODAwLCAweDg4MjEsIAorMHg5N2EzMDAzZSwgMHgxNDYyMDAwZiwgMHgyNjAyMDIxLCAweDk2NzEwMDAwLCAKKzB4OTY2MjAwMDIsIDB4OTY2MzAwMDQsIDB4OTY2NDAwMDYsIDB4MjIyODgyMSwgCisweDIyMzg4MjEsIDB4MjI0ODgyMSwgMHg5NjYyMDAwOCwgMHg5NjYzMDAwYSwgCisweDk2NjQwMDBjLCAweDIyMjg4MjEsIDB4MjIzODgyMSwgMHgxMDAwMDAwNywgCisweDIyNDg4MjEsIDB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIDB4MjIyODgyMSwgCisweDkyMTAyYiwgMHgxNDQwZmZmYiwgMHgwLCAweDExMWMwMiwgCisweDMyMjJmZmZmLCAweDYyODgyMSwgMHgxMTFjMDIsIDB4MzIyMmZmZmYsIAorMHg2Mjg4MjEsIDB4MzJjMjAyMDAsIDB4MTA0MDAwMDMsIDB4MjY0NDAwMDYsIAorMHgxMDAwMDAzZSwgMHg4MDIxLCAweDNjMDUwMDFmLCAweDM0YTVmZmZmLCAKKzB4YTQxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsIAorMHg4MjIwMjMsIDB4OTQ4MjAwMDAsIDB4MzA0MjFmZmYsIDB4MTA0MDAwMDQsIAorMHgyNjQ0MDAwYywgMHg5NjQyMDAwMiwgMHgxMDAwMDAzMCwgMHg1MDgwMjMsIAorMHg5NjQyMDAwMiwgMHgyNjQzMDAxNCwgMHg1MDgwMjMsIDB4M2MwMjAwMjAsIAorMHg0MzEwMmIsIDB4MTQ0MDAwMGEsIDB4ZDA4MDIxLCAweDk2NDIwMDBjLCAKKzB4MjAyODAyMSwgMHg5NjQyMDAwZSwgMHg5NjQzMDAxMCwgMHg5NjQ0MDAxMiwgCisweDIwMjgwMjEsIDB4MjAzODAyMSwgMHgxMDAwMDAyMCwgMHgyMDQ4MDIxLCAKKzB4YTQxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsIAorMHg4MjIwMjMsIDB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIDB4MjAyODAyMSwgCisweGE0MTAyYiwgMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LCAKKzB4ODIyMDIzLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLCAweDIwMjgwMjEsIAorMHhhNDEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwgCisweDgyMjAyMywgMHg5NDgyMDAwMCwgMHgyNDg0MDAwMiwgMHgyMDI4MDIxLCAKKzB4YTQxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsIAorMHg4MjIwMjMsIDB4OTQ4MjAwMDAsIDB4MjAyODAyMSwgMHgzYzAyMDEwMCwgCisweDJjMjEwMjQsIDB4MTA0MDAwMGUsIDB4MCwgMHg4ZmFhMDAyYywgCisweDMxNDIwMDA0LCAweDEwNDAwMDBhLCAweDAsIDB4OTUwNDAwMGUsIAorMHgyNjQyMDIxLCAweGMwMDNlZWMsIDB4MjQ4NGZmZmMsIDB4MzA0MmZmZmYsIAorMHgyMjI4ODIxLCAweDExMWMwMiwgMHgzMjIyZmZmZiwgMHg2Mjg4MjEsIAorMHg4ZmFhMDAyNCwgMHgxNTE4ODIzLCAweDExMTQwMiwgMHgyMjI4ODIxLCAKKzB4MjMwODgyMSwgMHgxMTE0MDIsIDB4MjIyODgyMSwgMHgzMjMxZmZmZiwgCisweDUyMjAwMDAxLCAweDM0MTFmZmZmLCAweDhmYWEwMDJjLCAweDM1NGEwMDAxLCAKKzB4YWZhYTAwMmMsIDB4YTZiMTAwMTIsIDB4OTdhYTAwMmUsIDB4YTZhYTAwMGUsIAorMHg4ZmFhMDAyYywgMHgzMTQyMDAwNCwgMHgxMDQwMDAwMiwgMHgyNDA5MTAwMCwgCisweDM0MDk4MDAwLCAweDhmNDgwMDQ0LCAweDhmNDQwMWEwLCAweDhmNDUwMWE0LCAKKzB4YWZhOTAwMTAsIDB4OGY0OTAwNDQsIDB4ODQxNDAsIDB4MTAwMTgyMSwgCisweGFmYTkwMDE0LCAweDhmNDgwMDBjLCAweDJhMDMwMjEsIDB4MjQwNzAwMjAsIAorMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgxMDIxLCAweGEzMjgyMSwgCisweGEzNDgyYiwgMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsIAorMHgxNDQwMDAwYiwgMHgwLCAweDhmODIwMTI4LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDY5MTQsIDB4YWZiZTAwMTQsIDB4YWZhMjAwMTAsIDB4OGY4NjAxMjQsIAorMHg4Zjg3MDEyMCwgMHgzYzA1MDAwNywgMHhjMDAyYjNiLCAweDM0YTU5OTIwLCAKKzB4OGY0MjAzNjgsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjgsIDB4OGY0MjAwNDQsIAorMHg4ZjQzMDA4OCwgMHgyNDQyMDAwMSwgMHg0MzEwMjQsIDB4YWY0MjAwNDQsIAorMHg4ZmFhMDAzNCwgMHg4ZjQ0MDM2OCwgMHgyNDAyMDAwMSwgMHgxNTQyMDAwNiwgCisweDI0MDIwMDAyLCAweDhmNDIwMzVjLCAweDI0NDJmZmZmLCAweGFmNDIwMzVjLCAKKzB4MTAwMDAwNDksIDB4OGY0MjAzNWMsIDB4MTU0MjAwMDYsIDB4MCwgCisweDhmNDIwMzY0LCAweDI0NDJmZmZmLCAweGFmNDIwMzY0LCAweDEwMDAwMDQyLCAKKzB4OGY0MjAzNjQsIDB4OGY0MjAzNjAsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjAsIAorMHgxMDAwMDAzZCwgMHg4ZjQyMDM2MCwgMHgzMDYyMTAwMCwgMHgxMDQwMDAwNSwgCisweDMwNjI4MDAwLCAweDhmNDIwMDc4LCAweDI0NDIwMDAxLCAweDEwMDAwMDM2LCAKKzB4YWY0MjAwNzgsIDB4MTA0MDAwMzQsIDB4MCwgMHg4ZjQyMDA3OCwgCisweDI0NDIwMDAxLCAweGFmNDIwMDc4LCAweDhjMDMwMjQwLCAweDQzMTAyYiwgCisweDE0NDAwMDJkLCAweDI0MDcwMDA4LCAweDhmNDQwMTY4LCAweDhmNDUwMTZjLCAKKzB4OGY0MzAwNDQsIDB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsIDB4MjQwMjAwNDAsIAorMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgCisweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwMDAxMSwgMHgyNDAyMDAwMSwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIyNDBmMiwgMHg4ZjgyMDEyNCwgCisweGFmYTIwMDEwLCAweDhmODIwMTI4LCAweDNjMDQwMDAxLCAweDI0ODQ2ODhjLCAKKzB4YWZhMjAwMTQsIDB4OGY0NjAwNDQsIDB4OGY4NzAxMjAsIDB4M2MwNTAwMDksIAorMHhjMDAyYjNiLCAweDM0YTUxMzAwLCAweDEwMDAwMDBiLCAweDAsIAorMHg4ZjQyMDMwNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwNCwgMHg4ZjQyMDMwNCwgCisweDhmNDIwMDQ0LCAweGFmNDIwMDdjLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgCisweGEwMjA0MGYyLCAweGFmNDAwMDc4LCAweDhmNDIwMzE4LCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzMTgsIDB4OGY0MjAzMTgsIDB4OGZiZjAwNjAsIDB4OGZiZTAwNWMsIAorMHg4ZmI1MDA1OCwgMHg4ZmIzMDA1NCwgMHg4ZmIyMDA1MCwgMHg4ZmIxMDA0YywgCisweDhmYjAwMDQ4LCAweDNlMDAwMDgsIDB4MjdiZDAwNjgsIDB4M2UwMDAwOCwgCisweDAsIDB4MCwgMHgwLCAweDhmNDIwMTNjLCAKKzB4YWY4MjAwYzAsIDB4OGY0MjAxM2MsIDB4YWY4MjAwYzQsIDB4OGY0MjAxM2MsIAorMHhhZjgyMDBjOCwgMHg4ZjQyMDEzOCwgMHhhZjgyMDBkMCwgMHg4ZjQyMDEzOCwgCisweGFmODIwMGQ0LCAweDhmNDIwMTM4LCAweDNlMDAwMDgsIDB4YWY4MjAwZDgsIAorMHgyN2JkZmZlMCwgMHgyNzg0MDIwOCwgMHgyNDA1MDIwMCwgMHhhZmJmMDAxOCwgCisweGMwMDJiYmYsIDB4MjQwNjAwMDgsIDB4OGMwMjAyMDQsIDB4YzAwNDAxMiwgCisweGFmODIwMjEwLCAweDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDMwNDIwMDAyLCAKKzB4MTA0MDAwMGUsIDB4MjAyMSwgMHg4YzA2MDI0OCwgMHgyNDAyMDAwMiwgCisweDNjMDEwMDAxLCAweGFjMjI2ZDk4LCAweGMwMDUxMDQsIDB4MjQwNTAwMDIsIAorMHgyMDIxLCAweDhjMDYwMjQ4LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAKKzB4YWMyMjZkOTgsIDB4MTAwMDAwMTEsIDB4MjQwNTAwMDEsIDB4OGMwNjAyNDgsIAorMHgyNDAyMDAwNCwgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5OCwgMHhjMDA1MTA0LCAKKzB4MjQwNTAwMDQsIDB4M2MwMjAwMDEsIDB4OGM0MjZkOTQsIDB4MzA0MjAwMDEsIAorMHgxMDQwMDAwOCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5OCwgCisweDIwMjEsIDB4MjQwNTAwMDEsIDB4M2MwNjYwMWIsIDB4YzAwNTEwNCwgCisweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDY5ZDAsIDB4OGY0MjAxNTAsIAorMHg4ZjQzMDE1NCwgMHgzYzA1MDAwOCwgMHg4ZjQ2MDE1OCwgMHgyMTY0MCwgCisweDMxOTQwLCAweDM0NjMwNDAzLCAweDQzMTAyNSwgMHg2MzNjMCwgCisweDQ2MTAyNSwgMHhhZjgyMDIxYywgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgCisweDhmODYwMjFjLCAweDM0YTUwMjAwLCAweGMwMDJiM2IsIDB4MzgyMSwgCisweDNjMDEwMDAxLCAweGFjMjA2ZDkwLCAweDNjMDEwMDAxLCAweGFjMjA2ZGE4LCAKKzB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyN2JkZmZlMCwgCisweDNjMDUwMDA4LCAweDM0YTUwMzAwLCAweGFmYmYwMDE4LCAweGFmYTAwMDEwLCAKKzB4YWZhMDAwMTQsIDB4OGY4NjAyMDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDY5ZGMsIAorMHhjMDAyYjNiLCAweDM4MjEsIDB4OGY0MjA0MTAsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDQxMCwgMHg4ZjQyMDQxMCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwMjAsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjAsIDB4YWZiMTAwMWMsIAorMHhhZmIwMDAxOCwgMHg4ZjQyMDNhNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDNhNCwgCisweDhmNDIwM2E0LCAweDhmOTAwMjIwLCAweDhmODIwMGUwLCAweGFmYTIwMDEwLCAKKzB4OGY4MjAwZTQsIDB4YWZhMjAwMTQsIDB4OGY4NjAwYzQsIDB4OGY4NzAwYzgsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjllOCwgMHhjMDAyYjNiLCAweDIwMDI4MjEsIAorMHgzYzA0NDAwMCwgMHgyMDQxMDI0LCAweDUwNDAwMGI0LCAweDNjMDQwMTAwLCAKKzB4OGY0MjAzYmMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzYmMsIDB4OGY0MjAzYmMsIAorMHg4Zjg3MDBjNCwgMHg4ZjgzMDBjOCwgMHg4ZjQyMDE0OCwgMHg2NzE4MjMsIAorMHg0MzEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwgCisweDYyMTgyMSwgMHgxMDYwMDAwNSwgMHgwLCAweDhmNDIwMTRjLCAKKzB4NDMxMDJiLCAweDEwNDAwMDBiLCAweDAsIDB4OGY4MjAwZTAsIAorMHg4ZjQzMDEyNCwgMHhhZjQyMDExYywgMHhhZjQzMDExNCwgMHg4ZjgyMDIyMCwgCisweDNjMDMwOGZmLCAweDM0NjNmZmZiLCAweDQzMTAyNCwgMHgxMDAwMDBjZSwgCisweDQ0MTAyNSwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwgCisweDQzMTAyNCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDBlMCwgCisweDhmNDMwMTI0LCAweGFmNDIwMTFjLCAweGFmNDMwMTE0LCAweDhmODYwMGM4LCAKKzB4OGY4NDAxMjAsIDB4OGY4MzAxMjQsIDB4MTAwMDAwMDUsIDB4MjgyMSwgCisweDE0NjIwMDAyLCAweDI0NjIwMDIwLCAweDI3NjI0ODAwLCAweDQwMTgyMSwgCisweDEwNjQwMDBjLCAweDMwYTIwMGZmLCAweDhjNjIwMDE4LCAweDMwNDIwMDAzLCAKKzB4MTA0MGZmZjcsIDB4Mjc2MjRmZTAsIDB4OGY0MjAzZDAsIDB4MjQwNTAwMDEsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDNkMCwgMHg4ZjQyMDNkMCwgMHg4YzY2MDAwOCwgCisweDMwYTIwMGZmLCAweDE0NDAwMDU4LCAweDAsIDB4OTM0MjA1YzQsIAorMHgxNDQwMDA1NSwgMHgwLCAweDhmODcwMGM0LCAweDhmODgwMGUwLCAKKzB4OGY4NDAwZTQsIDB4MjQwMmZmZjgsIDB4MTAyNDAyNCwgMHgxMDQxMDIzLCAKKzB4MjE4YzMsIDB4NDYyMDAwMSwgMHgyNDYzMDIwMCwgMHgxMDYwMDAwNSwgCisweDI0MDIwMDAxLCAweDEwNjIwMDA5LCAweDAsIDB4MTAwMDAwMWYsIAorMHgwLCAweDhmNDIwM2MwLCAweGUwMzAyMSwgMHgyNDQyMDAwMSwgCisweGFmNDIwM2MwLCAweDEwMDAwMDQwLCAweDhmNDIwM2MwLCAweDhmNDIwM2M0LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzYzQsIDB4OGM4NjAwMDAsIDB4OGY0MjAxNDgsIAorMHg4ZjQzMDNjNCwgMHhlNjE4MjMsIDB4NDMxMDJiLCAweDEwNDAwMDA0LCAKKzB4MmM2MjIzM2YsIDB4OGY0MjAxNDgsIDB4NjIxODIxLCAweDJjNjIyMzNmLCAKKzB4MTQ0MDAwMzEsIDB4MCwgMHg4ZjQyMDIwYywgMHgyNDQyMDAwMSwgCisweGFmNDIwMjBjLCAweDhmNDIwMjBjLCAweGUwMzAyMSwgMHgyNDgyMDAwOCwgCisweGFmODIwMGU0LCAweDEwMDAwMDI4LCAweGFmODIwMGU4LCAweDhmNDIwM2M4LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzYzgsIDB4OGY0MjAzYzgsIDB4OGM4NTAwMDAsIAorMHg4ZjQyMDE0OCwgMHhhNzE4MjMsIDB4NDMxMDJiLCAweDEwNDAwMDAzLCAKKzB4MCwgMHg4ZjQyMDE0OCwgMHg2MjE4MjEsIDB4OGY0MjAxNGMsIAorMHg0MzEwMmIsIDB4NTQ0MDAwMGEsIDB4YTAzMDIxLCAweDhmNDIwMjBjLCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAyMGMsIDB4OGY0MjAyMGMsIDB4MjQ4MjAwMDgsIAorMHhhZjgyMDBlNCwgMHg4Zjg0MDBlNCwgMHgxNDg4ZmZlYywgMHhhZjg0MDBlOCwgCisweDE0ODgwMDBkLCAweDI3NjIzMDAwLCAweDE0ODIwMDAyLCAweDI0ODJmZmY4LCAKKzB4Mjc2MjNmZjgsIDB4OTQ0MzAwMDYsIDB4M2MwMjAwMWYsIDB4MzQ0MmZmZmYsIAorMHhjMzMwMjEsIDB4NDYxMDJiLCAweDEwNDAwMDAzLCAweDAsIAorMHg4ZjQyMDE0OCwgMHhjMjMwMjMsIDB4YWY4NjAwYzgsIDB4OGY4MzAwYzQsIAorMHg4ZjQyMDE0OCwgMHhjMzE4MjMsIDB4NDMxMDJiLCAweDEwNDAwMDAzLCAKKzB4MCwgMHg4ZjQyMDE0OCwgMHg2MjE4MjEsIDB4MTA2MDAwMDUsIAorMHgwLCAweDhmNDIwMTRjLCAweDQzMTAyYiwgMHg1MDQwMDAwOCwgCisweDNjMDJmZGZmLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZiLCAKKzB4NDMxMDI0LCAweDNjMDM0MDAwLCAweDEwMDAwMDNmLCAweDQzMTAyNSwgCisweDhmNDMwM2NjLCAweDM0NDJmZmZmLCAweDI4MmEwMjQsIDB4MjQ2MzAwMDEsIAorMHhhZjQzMDNjYywgMHgxMDAwMDAzOSwgMHg4ZjQyMDNjYywgMHgyMDQxMDI0LCAKKzB4MTA0MDAwMGUsIDB4M2MxMTAyMDAsIDB4OGY0MjAzYTgsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDNhOCwgMHg4ZjQyMDNhOCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgCisweDM0NjNmZmZmLCAweDQzMTAyNCwgMHg0NDEwMjUsIDB4YzAwM2RhZiwgCisweGFmODIwMjIwLCAweDEwMDAwMDI5LCAweDAsIDB4MjExMTAyNCwgCisweDUwNDAwMDA4LCAweDNjMTEwNDAwLCAweDhmNDIwM2FjLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzYWMsIDB4YzAwM2RhZiwgMHg4ZjQyMDNhYywgMHgxMDAwMDAxOSwgCisweDAsIDB4MjExMTAyNCwgMHgxMDQwMDAxYywgMHgwLCAKKzB4OGY4MzAyMjQsIDB4MjQwMjE0MDIsIDB4MTQ2MjAwMDksIDB4M2MwNTAwMDgsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjlmNCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgCisweDhmODYwMjI0LCAweDM0YTUwNTAwLCAweGMwMDJiM2IsIDB4MzgyMSwgCisweDhmNDIwM2IwLCAweDI0NDIwMDAxLCAweGFmNDIwM2IwLCAweDhmNDIwM2IwLCAKKzB4OGY4MjAyMjAsIDB4MjAwMjAyMSwgMHgzNDQyMDAwMiwgMHhjMDA0ZTljLCAKKzB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsIAorMHg0MzEwMjQsIDB4NTExMDI1LCAweGFmODIwMjIwLCAweDhmYmYwMDIwLCAKKzB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgCisweDNlMDAwMDgsIDB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhOCwgCisweDI3YmRmZmIwLCAweGFmYmYwMDQ4LCAweGFmYmUwMDQ0LCAweGFmYjUwMDQwLCAKKzB4YWZiMzAwM2MsIDB4YWZiMjAwMzgsIDB4YWZiMTAwMzQsIDB4MTA0MDAwMGYsIAorMHhhZmIwMDAzMCwgMHgzYzA0MDAwMSwgMHgyNDg0NmEwMCwgMHgzYzA1MDAwOCwgCisweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMjIwLCAweDM0YTUwNjAwLCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMDZkYTgsIDB4M2MwMTAwMDEsIAorMHhhYzIyNmQ5YywgMHhjMDAyYjNiLCAweDM4MjEsIDB4M2MwMzdmZmYsIAorMHg4YzAyMDI2OCwgMHgzNDYzZmZmZiwgMHgzYzA0ZmRmZiwgMHg0MzEwMjQsIAorMHhhYzAyMDI2OCwgMHg4ZjQyMDAwNCwgMHgzNDg0ZmZmZiwgMHgzMDQyMDAwMiwgCisweDEwNDAwMDkyLCAweDI4NGEwMjQsIDB4M2MwNDA2MDAsIDB4MzQ4NDIwMDAsIAorMHg4ZjQyMDAwNCwgMHgyODIxLCAweDI0MDNmZmZkLCAweDQzMTAyNCwgCisweGFmNDIwMDA0LCAweGFmYTQwMDIwLCAweDhmNWUwMDE4LCAweDI3YWEwMDIwLCAKKzB4MjQwMjAwZmYsIDB4MTNjMjAwMDIsIDB4YWZhYTAwMmMsIDB4MjdjNTAwMDEsIAorMHg4YzAyMDIyOCwgMHhhMDkwMjEsIDB4MTY0MjAwMGUsIDB4MWUzOGMwLCAKKzB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIAorMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwgMHgyNDg0Njk5OCwgMHgzYzA1MDAwOSwgCisweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmYTYwMDIwLCAweDEwMDAwMDZkLCAKKzB4MzRhNTA1MDAsIDB4ZjcxMDIxLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAKKzB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIAorMHgyNDcwMDNlOCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDEwNDAwMDFiLCAKKzB4OTgyMSwgMHhlMDg4MjEsIDB4MjYzNTA0YzAsIDB4OGY0NDAxNzgsIAorMHg4ZjQ1MDE3YywgMHgyMjAxODIxLCAweDI0MGEwMDA0LCAweGFmYWEwMDEwLCAKKzB4YWZiMjAwMTQsIDB4OGY0ODAwMGMsIDB4MTAyMSwgMHgyZjUzMDIxLCAKKzB4YWZhODAwMTgsIDB4OGY0ODAxMGMsIDB4MjQwNzAwMDgsIDB4YTMyODIxLCAKKzB4YTM0ODJiLCAweDgyMjAyMSwgMHgxMDBmODA5LCAweDg5MjAyMSwgCisweDU0NDAwMDA2LCAweDI0MTMwMDAxLCAweDhmODIwMDU0LCAweDIwMjEwMjMsIAorMHgyYzQyMDNlOSwgMHgxNDQwZmZlOSwgMHgwLCAweDMyNjIwMGZmLCAKKzB4NTQ0MDAwMTcsIDB4YWY1MjAwMTgsIDB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwgMHg4ZmFhMDAyYywgCisweGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2OWE0LCAKKzB4M2MwNTAwMDksIDB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsIDB4MTAwMDAwMzUsIAorMHgzNGE1MDYwMCwgMHg4ZjQyMDMwOCwgMHgyNDEzMDAwMSwgMHgyNDQyMDAwMSwgCisweGFmNDIwMzA4LCAweDhmNDIwMzA4LCAweDEwMDAwMDFlLCAweDMyNjIwMGZmLCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgCisweDJjNDIwM2U5LCAweDEwNDAwMDE2LCAweDk4MjEsIDB4M2MxNTAwMjAsIAorMHgyNDExMDAxMCwgMHg4ZjQyMDAwYywgMHg4ZjQ0MDE2MCwgMHg4ZjQ1MDE2NCwgCisweDhmODYwMTIwLCAweGFmYjEwMDEwLCAweGFmYjIwMDE0LCAweDU1MTAyNSwgCisweGFmYTIwMDE4LCAweDhmNDIwMTBjLCAweDI0MDcwMDA4LCAweDQwZjgwOSwgCisweDI0YzYwMDFjLCAweDE0NDBmZmUzLCAweDAsIDB4OGY4MjAwNTQsIAorMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmVlLCAweDAsIAorMHgzMjYyMDBmZiwgMHgxNDQwMDAxMSwgMHgwLCAweDhmNDIwMzc4LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIAorMHg4ZmFhMDAyYywgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2OWFjLCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNDYwMDAwLCAKKzB4MzRhNTA3MDAsIDB4YzAwMmIzYiwgMHgzYzAzODIxLCAweDhmNDIwMmVjLCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAyZWMsIDB4OGY0MjAyZWMsIDB4OGZiZjAwNDgsIAorMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwgMHg4ZmIzMDAzYywgMHg4ZmIyMDAzOCwgCisweDhmYjEwMDM0LCAweDhmYjAwMDMwLCAweDNlMDAwMDgsIDB4MjdiZDAwNTAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmRhOCwgMHgyN2JkZmZlMCwgMHgxNDQwMDAwZCwgCisweGFmYmYwMDE4LCAweDNjMDQwMDAxLCAweDI0ODQ2YTBjLCAweDNjMDUwMDA4LCAKKzB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAyMjAsIDB4MzRhNTA3MDAsIAorMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmRhOCwgMHhjMDAyYjNiLCAKKzB4MzgyMSwgMHgzYzAyMDAwNCwgMHgyYzIxMDI0LCAweDEwNDAwMDA3LCAKKzB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwgCisweDQzMTAyNCwgMHgzNDQyMDAwOCwgMHhhZjgyMDIyMCwgMHgzYzA1MDAwMSwgCisweDhjYTU2ZDk4LCAweDI0MDIwMDAxLCAweDE0YTIwMDA3LCAweDIwMjEsIAorMHhjMDA1MjliLCAweDI0MDUwMDAxLCAweGFjMDIwMjZjLCAweDhjMDMwMjZjLCAKKzB4MTAwMDAwMDYsIDB4M2MwMjAwMDcsIDB4YzAwNTI5YiwgMHgyMDIxLCAKKzB4YWMwMjAyNjgsIDB4OGMwMzAyNjgsIDB4M2MwMjAwMDcsIDB4NjIxODI0LCAKKzB4M2MwMjAwMDIsIDB4NTA2MjAwMGQsIDB4M2MwMjA1ZjUsIDB4NDMxMDJiLCAKKzB4MTQ0MDAwMDYsIDB4M2MwMjAwMDQsIDB4M2MwMjAwMDEsIDB4MTA2MjAwMDksIAorMHgzYzAyMDA5OCwgMHgxMDAwMDAwYiwgMHgwLCAweDE0NjIwMDA5LCAKKzB4M2MwMjNiOWEsIDB4MTAwMDAwMDQsIDB4MzQ0MmNhMDAsIDB4MTAwMDAwMDIsIAorMHgzNDQyZTEwMCwgMHgzNDQyOTY4MCwgMHhhZjQyMDFmYywgMHg4ZjQyMDFmYywgCisweGFlZTIwMDY0LCAweDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIAorMHgwLCAweDAsIDB4MCwgMHg4NjEwMmIsIAorMHg1MDQwMDAwMSwgMHg4NzIwMjMsIDB4YzQxMDIzLCAweDI0ODQzLCAKKzB4MTI1MTAyYiwgMHgxMDQwMDAxYiwgMHg5MTA0MCwgMHg4MjQwMjEsIAorMHg4ODEwMmIsIDB4MTA0MDAwMDcsIDB4MTgyMSwgMHg5NDgyMDAwMCwgCisweDI0ODQwMDAyLCAweDYyMTgyMSwgMHg4ODEwMmIsIDB4MTQ0MGZmZmIsIAorMHgwLCAweDYwMjAyMSwgMHhjNzMwMjMsIDB4YTkxMDIzLCAKKzB4MjEwNDAsIDB4YzIyODIxLCAweGM1MTAyYiwgMHgxMDQwMDAwNywgCisweDE4MjEsIDB4OTRjMjAwMDAsIDB4MjRjNjAwMDIsIDB4NjIxODIxLCAKKzB4YzUxMDJiLCAweDE0NDBmZmZiLCAweDAsIDB4MTAwMDAwMGQsIAorMHg4MzIwMjEsIDB4NTEwNDAsIDB4ODIyODIxLCAweDg1MTAyYiwgCisweDEwNDAwMDA3LCAweDE4MjEsIDB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIAorMHg2MjE4MjEsIDB4ODUxMDJiLCAweDE0NDBmZmZiLCAweDAsIAorMHg2MDIwMjEsIDB4NDFjMDIsIDB4MzA4MmZmZmYsIDB4NjIyMDIxLCAKKzB4NDFjMDIsIDB4MzA4MmZmZmYsIDB4NjIyMDIxLCAweDNlMDAwMDgsIAorMHgzMDgyZmZmZiwgMHgzZTAwMDA4LCAweDAsIDB4ODAyODIxLCAKKzB4MzBhMjAwMDEsIDB4MTA0MDAwMmIsIDB4M2MwMzAwMWYsIDB4MzQ2M2ZmZmYsIAorMHgyNGEyMDAwNCwgMHg2MjEwMmIsIDB4NTQ0MDAwMDcsIDB4NjUxMDJiLCAKKzB4OTBhMjAwMDEsIDB4OTBhNDAwMDMsIDB4OTBhMzAwMDAsIDB4OTBhNTAwMDIsIAorMHgxMDAwMDAyYSwgMHg0NDEwMjEsIDB4MTA0MDAwMDMsIDB4MCwgCisweDhmNDIwMTQ4LCAweGEyMjgyMywgMHg5MGE0MDAwMCwgMHgyNGE1MDAwMSwgCisweDY1MTAyYiwgMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LCAKKzB4YTIyODIzLCAweDkwYTIwMDAwLCAweDI0YTUwMDAxLCAweDIxMjAwLCAKKzB4ODIyMDIxLCAweDY1MTAyYiwgMHgxMDQwMDAwMywgMHgwLCAKKzB4OGY0MjAxNDgsIDB4YTIyODIzLCAweDkwYTIwMDAwLCAweDI0YTUwMDAxLCAKKzB4ODIyMDIxLCAweDY1MTAyYiwgMHgxMDQwMDAwMywgMHgwLCAKKzB4OGY0MjAxNDgsIDB4YTIyODIzLCAweDkwYTIwMDAwLCAweDEwMDAwMDJkLCAKKzB4MjEyMDAsIDB4MzQ2M2ZmZmYsIDB4MjRhMjAwMDQsIDB4NjIxMDJiLCAKKzB4NTQ0MDAwMGEsIDB4NjUxMDJiLCAweDkwYTIwMDAwLCAweDkwYTQwMDAyLCAKKzB4OTBhMzAwMDEsIDB4OTBhNTAwMDMsIDB4NDQxMDIxLCAweDIxMjAwLCAKKzB4NjUxODIxLCAweDEwMDAwMDIwLCAweDQzMjAyMSwgMHgxMDQwMDAwMywgCisweDAsIDB4OGY0MjAxNDgsIDB4YTIyODIzLCAweDkwYTIwMDAwLCAKKzB4MjRhNTAwMDEsIDB4MjIyMDAsIDB4NjUxMDJiLCAweDEwNDAwMDAzLCAKKzB4MCwgMHg4ZjQyMDE0OCwgMHhhMjI4MjMsIDB4OTBhMjAwMDAsIAorMHgyNGE1MDAwMSwgMHg4MjIwMjEsIDB4NjUxMDJiLCAweDEwNDAwMDAzLCAKKzB4MCwgMHg4ZjQyMDE0OCwgMHhhMjI4MjMsIDB4OTBhMjAwMDAsIAorMHgyNGE1MDAwMSwgMHgyMTIwMCwgMHg4MjIwMjEsIDB4NjUxMDJiLCAKKzB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwgMHhhMjI4MjMsIAorMHg5MGEyMDAwMCwgMHg4MjIwMjEsIDB4NDFjMDIsIDB4MzA4MmZmZmYsIAorMHg2MjIwMjEsIDB4NDFjMDIsIDB4MzA4MmZmZmYsIDB4NjIyMDIxLCAKKzB4M2UwMDAwOCwgMHgzMDgyZmZmZiwgMHgwLCAweDhmODIwMjIwLCAKKzB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZjgsIAorMHgzMDQyNDAwMCwgMHgxMDQwMDA1NCwgMHgyNDA0MDAwMSwgMHg4ZjgyMDIwMCwgCisweDI0MDY3ZmZmLCAweDhmODMwMjAwLCAweDMwNDUwMDAyLCAweDI0MDJmZmZkLCAKKzB4NjIxODI0LCAweGFmODMwMjAwLCAweGFmODQwMjA0LCAweDhmODMwMDU0LCAKKzB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIAorMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwgCisweDhmODIwMjI0LCAweDE0NDQwMDRkLCAweDQyMDQwLCAweGM0MTAyYiwgCisweDEwNDBmZmYxLCAweDAsIDB4OGY4MjAyMDAsIDB4NDUxMDI1LCAKKzB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsIDB4MzQ0MjgwMDAsIDB4YWY4MjAyMjAsIAorMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwgCisweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgCisweDAsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDQsIDB4NDMxMDI0LCAKKzB4MTQ0MDAwMGYsIDB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzZmZmZiwgCisweDM0NjM3ZmZmLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LCAKKzB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsIAorMHg4ZjgyMDIyMCwgMHgzYzAzMDAwNCwgMHg0MzEwMjQsIDB4MTQ0MDAwMGQsIAorMHgwLCAweDhmODIwMjIwLCAweDM0NDI4MDAwLCAweGFmODIwMjIwLCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsIAorMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIAorMHgwLCAweDhmODIwMjIwLCAweDNjMDMwMDA0LCAweDQzMTAyNCwgCisweDEwNDAwMDFiLCAweDEwMjEsIDB4OGY4MzAyMjAsIDB4MjQwMjAwMDEsIAorMHgxMDAwMDAxNSwgMHgzYzA0ZjcwMCwgMHg4ZjgyMDIyMCwgMHgzYzA0ZjcwMCwgCisweDQ0MTAyNSwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgyNDAzZmZmZCwgCisweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDMwMCwgCisweDQzMTAyNCwgMHgxNDQwMDAwMywgMHgwLCAweDEwMDAwMDA4LCAKKzB4MTAyMSwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgCisweDhmODMwMjIwLCAweDI0MDIwMDAxLCAweDY0MTgyNSwgMHhhZjgzMDIyMCwgCisweDNlMDAwMDgsIDB4MCwgMHgyMDIxLCAweDNjMDUwMTAwLCAKKzB4MjQwMjAwMDEsIDB4YWY4MDAyMWMsIDB4YWY4MjAyMDAsIDB4YWY4MjAyMjAsIAorMHgyNzYyNTAwMCwgMHhhZjgyMDBjMCwgMHgyNzYyNTAwMCwgMHhhZjgyMDBjNCwgCisweDI3NjI1MDAwLCAweGFmODIwMGM4LCAweDI3NjI1MDAwLCAweGFmODIwMGQwLCAKKzB4Mjc2MjUwMDAsIDB4YWY4MjAwZDQsIDB4Mjc2MjUwMDAsIDB4YWY4MjAwZDgsIAorMHgyNzYyMzAwMCwgMHhhZjgyMDBlMCwgMHgyNzYyMzAwMCwgMHhhZjgyMDBlNCwgCisweDI3NjIzMDAwLCAweGFmODIwMGU4LCAweDI3NjIyODAwLCAweGFmODIwMGYwLCAKKzB4Mjc2MjI4MDAsIDB4YWY4MjAwZjQsIDB4Mjc2MjI4MDAsIDB4YWY4MjAwZjgsIAorMHg0MThjMCwgMHgyNDg0MDAwMSwgMHgzNjMxMDIxLCAweGFjNDUzMDA0LCAKKzB4MzYzMTAyMSwgMHhhYzQwMzAwMCwgMHgyODgyMDIwMCwgMHgxNDQwZmZmOSwgCisweDQxOGMwLCAweDIwMjEsIDB4NDE4YzAsIDB4MjQ4NDAwMDEsIAorMHgzNjMxMDIxLCAweGFjNDAyODA0LCAweDM2MzEwMjEsIDB4YWM0MDI4MDAsIAorMHgyODgyMDEwMCwgMHgxNDQwZmZmOSwgMHg0MThjMCwgMHhhZjgwMDIzYywgCisweDI0MDMwMDgwLCAweDI0MDQwMTAwLCAweGFjNjAwMDAwLCAweDI0NjMwMDA0LCAKKzB4NjQxMDJiLCAweDU0NDBmZmZkLCAweGFjNjAwMDAwLCAweDhmODMwMDQwLCAKKzB4M2MwMmYwMDAsIDB4NjIxODI0LCAweDNjMDI1MDAwLCAweDEwNjIwMDBjLCAKKzB4NDMxMDJiLCAweDE0NDAwMDA2LCAweDNjMDI2MDAwLCAweDNjMDI0MDAwLCAKKzB4MTA2MjAwMDgsIDB4MjQwMjA4MDAsIDB4MTAwMDAwMDgsIDB4MCwgCisweDEwNjIwMDA0LCAweDI0MDIwODAwLCAweDEwMDAwMDA0LCAweDAsIAorMHgyNDAyMDcwMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmRhYywgMHgzZTAwMDA4LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRiYywgMHgyN2JkZmZkMCwgCisweGFmYmYwMDJjLCAweGFmYjIwMDI4LCAweGFmYjEwMDI0LCAweGFmYjAwMDIwLCAKKzB4M2MwMTAwMDEsIDB4MTA0MDAwMDUsIDB4YWMyMDZkOTQsIDB4YzAwNGQ5ZSwgCisweDAsIDB4M2MwMTAwMDEsIDB4YWMyMDZkYmMsIDB4OGY4MzAwNTQsIAorMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwgCisweDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywgMHgwLCAKKzB4YzAwNGRiOSwgMHgwLCAweDI0MDQwMDAxLCAweDI4MjEsIAorMHgyN2E2MDAxOCwgMHgzNDAyODAwMCwgMHhjMDA0NWJlLCAweGE3YTIwMDE4LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwNjQsIAorMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwNjQsIAorMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwNjQsIAorMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIAorMHgyNDA0MDAwMSwgMHgzYzA2MDAwMSwgMHgyNGM2NmYyNCwgMHhjMDA0NTdjLCAKKzB4MjQwNTAwMDIsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIAorMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIAorMHgxNDQwZmZmYywgMHgyNDA0MDAwMSwgMHgyNDA1MDAwMywgMHgzYzEwMDAwMSwgCisweDI2MTA2ZjI2LCAweGMwMDQ1N2MsIDB4MjAwMzAyMSwgMHg5N2E2MDAxOCwgCisweDNjMDcwMDAxLCAweDk0ZTc2ZjI0LCAweDNjMDQwMDAxLCAweDI0ODQ2YWUwLCAKKzB4YWZhMDAwMTQsIDB4OTYwMjAwMDAsIDB4M2MwNTAwMGQsIDB4MzRhNTAxMDAsIAorMHhjMDAyYjNiLCAweGFmYTIwMDEwLCAweDk3YTIwMDE4LCAweDEwNDAwMDRkLCAKKzB4MjQwMzYwNDAsIDB4OTYwMjAwMDAsIDB4MzA0MmZmZjAsIDB4MTQ0MzAwMGMsIAorMHgyNDAyMDAyMCwgMHgzYzAzMDAwMSwgMHg5NDYzNmYyNCwgMHgxNDYyMDAwYiwgCisweDI0MDI3ODMwLCAweDI0MDIwMDAzLCAweDNjMDEwMDAxLCAweGFjMjI2ZDk0LCAKKzB4MjQwMjAwMDUsIDB4M2MwMTAwMDEsIDB4MTAwMDAwM2YsIDB4YWMyMjZmMzQsIAorMHgzYzAzMDAwMSwgMHg5NDYzNmYyNCwgMHgyNDAyNzgzMCwgMHgxNDYyMDAwYywgCisweDI0MDMwMDEwLCAweDNjMDIwMDAxLCAweDk0NDI2ZjI2LCAweDMwNDJmZmYwLCAKKzB4MTQ0MzAwMDcsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTQsIAorMHgyNDAyMDAwNiwgMHgzYzAxMDAwMSwgMHgxMDAwMDAyZiwgMHhhYzIyNmYzNCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDNjMDMwMDAxLCAweDk0NjM2ZjI0LCAKKzB4MzQ0MjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTQsIDB4MjQwMjAwMTUsIAorMHgxNDYyMDAwYiwgMHgwLCAweDNjMDIwMDAxLCAweDk0NDI2ZjI2LCAKKzB4MzA0MmZmZjAsIDB4Mzg0M2Y0MjAsIDB4MmM2MzAwMDEsIDB4Mzg0MmY0MzAsIAorMHgyYzQyMDAwMSwgMHg2MjE4MjUsIDB4MTQ2MDAwMWIsIDB4MjQwMjAwMDMsIAorMHgzYzAzMDAwMSwgMHg5NDYzNmYyNCwgMHgyNDAyNzgxMCwgMHgxNDYyMDAxNiwgCisweDI0MDIwMDAyLCAweDNjMDIwMDAxLCAweDk0NDI2ZjI2LCAweDMwNDJmZmYwLCAKKzB4MTQ0MDAwMTEsIDB4MjQwMjAwMDIsIDB4MTAwMDAwMGYsIDB4MjQwMjAwMDQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmQ5NCwgMHgzNDQyMDAwOCwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZDk0LCAweDEwMDAwMDVlLCAweDI0MDIwMDA0LCAweDNjMDIwMDAxLCAKKzB4OGM0MjZkOTQsIDB4MzQ0MjAwMDQsIDB4M2MwMTAwMDEsIDB4MTAwMDAwYWYsIAorMHhhYzIyNmQ5NCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmY0MCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDMwNDIwMDAyLCAweDE0NDAwMGIyLCAKKzB4M2MwOWZmZjAsIDB4MjQwMjBlMDAsIDB4YWY4MjAyMzgsIDB4OGY4NDAwNTQsIAorMHg4ZjgyMDA1NCwgMHgyNDAzMDAwOCwgMHgzYzAxMDAwMSwgMHhhYzIzNmQ5OCwgCisweDEwMDAwMDAyLCAweDI0ODQwMWY0LCAweDhmODIwMDU0LCAweDgyMTAyMywgCisweDJjNDIwMWY1LCAweDE0NDBmZmZjLCAweDNjMDIwMGM4LCAweDM0NDIwMWZiLCAKKzB4YWY4MjAyMzgsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIAorMHgyNDYzMDFmNCwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAxZjUsIAorMHgxNDQwZmZmYywgMHg4MDIxLCAweDI0MTIwMDAxLCAweDI0MTEwMDA5LCAKKzB4YzAwNDQ4MiwgMHgwLCAweDNjMDEwMDAxLCAweGFjMzI2ZGI0LCAKKzB4YzAwNDU0NywgMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGI0LCAKKzB4MTQ1MWZmZmIsIDB4M2MwMjAwYzgsIDB4MzQ0MjAxZjYsIDB4YWY4MjAyMzgsIAorMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDAwYSwgCisweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwYiwgMHgxNDQwZmZmYywgCisweDAsIDB4OGY4MjAyMjAsIDB4MjQwNDAwMDEsIDB4MzQ0MjAwMDIsIAorMHhhZjgyMDIyMCwgMHg4ZjgzMDIwMCwgMHgyNDA1N2ZmZiwgMHgyNDAyZmZmZCwgCisweDYyMTgyNCwgMHhhZjgzMDIwMCwgMHhhZjg0MDIwNCwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LCAKKzB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsIAorMHg4ZjgyMDIyNCwgMHgxNDQ0MDAwNSwgMHgzNDAyODAwMCwgMHg0MjA0MCwgCisweGE0MTAyYiwgMHgxMDQwZmZmMCwgMHgzNDAyODAwMCwgMHgxMDgyZmZhMCwgCisweDI2MTAwMDAxLCAweDJlMDIwMDE0LCAweDE0NDBmZmNkLCAweDI0MDIwMDA0LCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZkOTgsIDB4ODAyMSwgMHgyNDEyMDAwOSwgCisweDNjMTFmZmZmLCAweDM2MzEzZjdmLCAweGMwMDQ0ODIsIDB4MCwgCisweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZGI0LCAweGMwMDQ1NDcsIAorMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGI0LCAweDE0NTJmZmZiLCAKKzB4MCwgMHg4ZjgyMDA0NCwgMHg1MTEwMjQsIDB4MzQ0MjUwODAsIAorMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgCisweDI0NjMwMDBhLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwYiwgCisweDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsIDB4NTExMDI0LCAKKzB4MzQ0MmYwODAsIDB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIAorMHgxMDAwMDAwMiwgMHgyNDYzMDAwYSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIAorMHgyYzQyMDAwYiwgMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMjIwLCAKKzB4M2MwM2Y3MDAsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAweDhmODMwMDU0LCAKKzB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwNjQsIDB4OGY4MjAwNTQsIAorMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIDB4MCwgCisweDhmODIwMjIwLCAweDI0MDQwMDAxLCAweDM0NDIwMDAyLCAweGFmODIwMjIwLCAKKzB4OGY4MzAyMDAsIDB4MjQwNTdmZmYsIDB4MjQwMmZmZmQsIDB4NjIxODI0LCAKKzB4YWY4MzAyMDAsIDB4YWY4NDAyMDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIAorMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIAorMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMjI0LCAKKzB4MTQ0NDAwMDUsIDB4MzQwMjgwMDAsIDB4NDIwNDAsIDB4YTQxMDJiLCAKKzB4MTA0MGZmZjAsIDB4MzQwMjgwMDAsIDB4MTA4MmZmNTAsIDB4MjYxMDAwMDEsIAorMHgyZTAyMDA2NCwgMHgxNDQwZmZiMCwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjZkOTQsIDB4MzA0MjAwMDQsIDB4MTQ0MDAwMDcsIDB4M2MwOWZmZjAsIAorMHg4ZjgyMDA0NCwgMHgzYzAzZmZmZiwgMHgzNDYzM2Y3ZiwgMHg0MzEwMjQsIAorMHhhZjgyMDA0NCwgMHgzYzA5ZmZmMCwgMHgzNTI5YmRjMCwgMHgzYzA2MDAwMSwgCisweDhjYzY2ZDk0LCAweDNjMDQwMDAxLCAweDI0ODQ2YWUwLCAweDI0MDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZkOWMsIDB4OGY4MjAwNTQsIDB4M2MwNzAwMDEsIAorMHg4Y2U3NmY0MCwgMHgzYzAzMDAwMSwgMHg5NDYzNmYyNCwgMHgzYzA4MDAwMSwgCisweDk1MDg2ZjI2LCAweDNjMDUwMDBkLCAweDM0YTUwMTAwLCAweDNjMDEwMDAxLCAKKzB4YWMyMDZkOTgsIDB4NDkxMDIxLCAweDNjMDEwMDAxLCAweGFjMjI2ZjMwLCAKKzB4YWZhMzAwMTAsIDB4YzAwMmIzYiwgMHhhZmE4MDAxNCwgMHg4ZmJmMDAyYywgCisweDhmYjIwMDI4LCAweDhmYjEwMDI0LCAweDhmYjAwMDIwLCAweDNlMDAwMDgsIAorMHgyN2JkMDAzMCwgMHgyN2JkZmZlOCwgMHgzYzA1MDAwMSwgMHg4Y2E1NmQ5OCwgCisweDI0MDYwMDA0LCAweDI0MDIwMDAxLCAweDE0YTIwMDE0LCAweGFmYmYwMDEwLCAKKzB4M2MwMjAwMDIsIDB4OGM0MjhmZmMsIDB4MzA0MjgwMDAsIDB4MTA0MDAwMDUsIAorMHgzYzA0MDAwZiwgMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgxMDAwMDAwNSwgCisweDM0ODQ0MjQwLCAweDNjMDQwMDA0LCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAKKzB4MzQ4NDkzZTAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMTYsIDB4MCwgCisweDNjMDQwMDNkLCAweDEwMDAwMDEzLCAweDM0ODQwOTAwLCAweDNjMDIwMDAyLCAKKzB4OGM0MjhmZjgsIDB4MzA0MjgwMDAsIDB4MTA0MDAwMDUsIDB4M2MwNDAwMWUsIAorMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgxMDAwMDAwNSwgMHgzNDg0ODQ4MCwgCisweDNjMDQwMDBmLCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDM0ODQ0MjQwLCAKKzB4MjQwMjAwMDUsIDB4MTQ2MjAwMDMsIDB4MCwgMHgzYzA0MDA3YSwgCisweDM0ODQxMjAwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjMwLCAweDhmODMwMDU0LCAKKzB4NDQxMDIxLCAweDQzMTAyMywgMHg0NDEwMmIsIDB4MTQ0MDAwNGMsIAorMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGEwLCAweDE0NDAwMDQ4LCAKKzB4MCwgMHgzYzAxMDAwMSwgMHgxMGMwMDAyNSwgMHhhYzIwNmRiMCwgCisweDNjMDkwMDAxLCAweDhkMjk2ZDk0LCAweDI0MDcwMDAxLCAweDNjMDQ0MDAwLCAKKzB4M2MwODAwMDIsIDB4MjUwODhmZmMsIDB4MjUwYWZmZmMsIDB4NTI4NDIsIAorMHgxNGEwMDAwMiwgMHgyNGM2ZmZmZiwgMHgyNDA1MDAwOCwgMHhhOTEwMjQsIAorMHgxMDQwMDAxMCwgMHgwLCAweDE0YTcwMDA4LCAweDAsIAorMHg4ZDAyMDAwMCwgMHg0NDEwMjQsIDB4MTA0MDAwMGEsIDB4MCwgCisweDNjMDEwMDAxLCAweDEwMDAwMDA3LCAweGFjMjU2ZGIwLCAweDhkNDIwMDAwLCAKKzB4NDQxMDI0LCAweDEwNDAwMDAzLCAweDAsIDB4M2MwMTAwMDEsIAorMHhhYzI3NmRiMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRiMCwgMHg2MTgyYiwgCisweDJjNDIwMDAxLCAweDQzMTAyNCwgMHg1NDQwZmZlNSwgMHg1Mjg0MiwgCisweDhmODIwMDU0LCAweDNjMDMwMDAxLCAweDhjNjM2ZGIwLCAweDNjMDEwMDAxLCAKKzB4YWMyMjZmMzAsIDB4MTA2MDAwM2IsIDB4MjQwMjAwMDUsIDB4M2MwMzAwMDEsIAorMHg4YzYzNmY0MCwgMHgzYzAxMDAwMSwgMHhhYzI1NmQ5OCwgMHgxNDYyMDAxMiwgCisweDI0MDIwMDAxLCAweDNjMDIwMDAyLCAweDhjNDI4ZmY4LCAweDNjMDMyMDAwLCAKKzB4MzQ2MzUwMDAsIDB4NDMxMDI0LCAweDE0NDAwMDA2LCAweDI0MDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4YWMyMDZmMWMsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTgsIAorMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmUyNCwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZGE0LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZDljLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZkYjAsIDB4MTA0MDAwMWUsIDB4MCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDljLCAweDEwNDAwMDA4LCAweDI0MDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4YWMyMDZkOWMsIDB4YWVlMjA0YjgsIDB4M2MwMTAwMDEsIAorMHhhYzIwNmUxYywgMHgzYzAxMDAwMSwgMHhhYzIyNmRkNCwgMHg4ZWUzMDRiOCwgCisweDI0MDIwMDA4LCAweDEwNjIwMDA1LCAweDI0MDIwMDAxLCAweGMwMDQyMzksIAorMHgwLCAweDEwMDAwMDBiLCAweDAsIDB4M2MwMzAwMDEsIAorMHg4YzYzNmQ5OCwgMHgxMDYyMDAwNywgMHgyNDAyMDAwZSwgMHgzYzAzMDAwMiwgCisweDhjNjM4ZjkwLCAweDEwNjIwMDAzLCAweDAsIDB4YzAwNGU5YywgCisweDhmODQwMjIwLCAweDhmYmYwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMTgsIAorMHgyN2JkZmZlMCwgMHgzYzAzZmRmZiwgMHgzYzA0MDAwMSwgMHg4Yzg0NmQ5OCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZGMwLCAweDM0NjNmZmZmLCAweDI4M2EwMjQsIAorMHgxNDgyMDAwNiwgMHhhZmJmMDAxOCwgMHg4ZWUzMDRiOCwgMHgzYzAyMDAwMSwgCisweDhjNDI2ZGM0LCAweDEwNjIwMDA2LCAweDAsIDB4OGVlMjA0YjgsIAorMHgzYzAxMDAwMSwgMHhhYzI0NmRjMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmRjNCwgCisweDNjMDMwMDAxLCAweDhjNjM2ZDk4LCAweDI0MDIwMDAyLCAweDEwNjIwMTljLCAKKzB4MmM2MjAwMDMsIDB4MTA0MDAwMDUsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMGEsIAorMHgwLCAweDEwMDAwMjI2LCAweDAsIDB4MjQwMjAwMDQsIAorMHgxMDYyMDBiNiwgMHgyNDAyMDAwOCwgMHgxMDYyMDEwYSwgMHgyNDAyMDAwMSwgCisweDEwMDAwMjFmLCAweDAsIDB4OGVlMjA0YjgsIDB4MjQ0M2ZmZmYsIAorMHgyYzYyMDAwOCwgMHgxMDQwMDIxYywgMHgzMTA4MCwgMHgzYzAxMDAwMSwgCisweDIyMDgyMSwgMHg4YzIyNmFmOCwgMHg0MDAwMDgsIDB4MCwgCisweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDI0MDIwMDA1LCAweDE0NjIwMDEwLCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhNCwgMHgxMDQwMDAwOCwgCisweDI0MDIwMDAzLCAweGMwMDQ0ODIsIDB4MCwgMHgyNDAyMDAwMiwgCisweGFlZTIwNGI4LCAweDNjMDEwMDAxLCAweDEwMDAwMDAyLCAweGFjMjA2ZGE0LCAKKzB4YWVlMjA0YjgsIDB4M2MwMTAwMDEsIDB4MTAwMDAyMDMsIDB4YWMyMDZkMzAsIAorMHhjMDA0NDgyLCAweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYTQsIAorMHgzYzAxMDAwMSwgMHhhYzIwNmQzMCwgMHgxNDQwMDE3YSwgMHgyNDAyMDAwMiwgCisweDEwMDAwMTlkLCAweDI0MDIwMDA3LCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAKKzB4MjQwMjAwMDUsIDB4MTQ2MjAwMDMsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIAorMHhhYzIyNmRkMCwgMHhjMDA0NWZmLCAweDAsIDB4M2MwMzAwMDEsIAorMHg4YzYzNmRkMCwgMHgxMDAwMDE3NCwgMHgyNDAyMDAxMSwgMHgzYzA1MDAwMSwgCisweDhjYTU2ZDk4LCAweDNjMDYwMDAyLCAweDhjYzY4ZmZjLCAweGMwMDUxMDQsIAorMHgyMDIxLCAweDI0MDIwMDA1LCAweDNjMDEwMDAxLCAweGFjMjA2ZGE0LCAKKzB4MTAwMDAxZTEsIDB4YWVlMjA0YjgsIDB4M2MwNDAwMDEsIDB4MjQ4NDZhZWMsIAorMHgzYzA1MDAwZiwgMHgzNGE1MDEwMCwgMHgzMDIxLCAweDM4MjEsIAorMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDEwMDAwMWQ2LCAKKzB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwNCwgMHg0MzEwMjQsIAorMHgxNDQwMDE3NSwgMHgyNDAyMDAwNywgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgCisweDhjNDI2ZjI4LCAweDI0NjNkOGYwLCAweDQzMTAyMywgMHgyYzQyMjcxMCwgCisweDE0NDAwMDAzLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZDljLCAKKzB4M2MwMjAwMDIsIDB4OGM0MjhmZmMsIDB4MzA0MjUwMDAsIDB4MTA0MDAxYzIsIAorMHgwLCAweDhmODIwMjIwLCAweDMwNDI4MDAwLCAweDEwNDAwMTdkLCAKKzB4MCwgMHgxMDAwMDE3NSwgMHgwLCAweDNjMDUwMDAxLCAKKzB4OGNhNTZkOTgsIDB4YzAwNTI5YiwgMHgyMDIxLCAweGMwMDU1MWIsIAorMHgyMDIxLCAweDNjMDMwMDAyLCAweDhjNjM4ZmY0LCAweDQ2MTAxYjAsIAorMHgyNDAyMDAwMSwgMHgzYzAyMDAwOCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsIAorMHgwLCAweDhmODIwMjE0LCAweDNjMDNmZmZmLCAweDQzMTAyNCwgCisweDEwMDAwMDA1LCAweDM0NDIyNTFmLCAweDhmODIwMjE0LCAweDNjMDNmZmZmLCAKKzB4NDMxMDI0LCAweDM0NDIyNDFmLCAweGFmODIwMjE0LCAweDhmODIwMjIwLCAKKzB4M2MwMzAyMDAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4MjQwMjAwMDgsIAorMHhhZWUyMDRiOCwgMHg4ZjgyMDIyMCwgMHgyODNhMDI1LCAweDNjMDMwMDA0LCAKKzB4NDMxMDI0LCAweDE0NDAwMDE2LCAweDAsIDB4M2MwMjAwMDIsIAorMHg4YzQyOGZmYywgMHgzMDQyNTAwMCwgMHgxMDQwMDAwZCwgMHgwLCAKKzB4OGY4MjAyMjAsIDB4MzA0MjgwMDAsIDB4MTA0MDAwMDYsIDB4MCwgCisweDhmODIwMjIwLCAweDNjMDNmZmZmLCAweDM0NjM3ZmZmLCAweDEwMDAwMDAzLCAKKzB4NDMxMDI0LCAweDhmODIwMjIwLCAweDM0NDI4MDAwLCAweGFmODIwMjIwLCAKKzB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMGEsIAorMHgwLCAweDNjMDIwMDAxLCAweDk0NDI2ZjI2LCAweDI0NDI5ZmJjLCAKKzB4MmM0MjAwMDQsIDB4MTA0MDAwMDQsIDB4MjQwNDAwMTgsIDB4MjQwNTAwMDIsIAorMHhjMDA0ZGRiLCAweDI0MDYwMDIwLCAweGMwMDNlNmQsIDB4MCwgCisweDNjMDEwMDAxLCAweDEwMDAwMTcwLCAweGFjMjA2ZTIwLCAweDhlZTIwNGI4LCAKKzB4MjQ0M2ZmZmYsIDB4MmM2MjAwMDgsIDB4MTA0MDAxNmIsIDB4MzEwODAsIAorMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjZiMTgsIDB4NDAwMDA4LCAKKzB4MCwgMHhjMDA0NTQ3LCAweDAsIDB4M2MwMzAwMDEsIAorMHg4YzYzNmRiNCwgMHgxMDAwMDBlOCwgMHgyNDAyMDAwOSwgMHgzYzAyMDAwMiwgCisweDhjNDI4ZmY4LCAweDMwNDI0MDAwLCAweDEwNDAwMDA0LCAweDAsIAorMHg4ZjgyMDA0NCwgMHgxMDAwMDAwNiwgMHgzNDQyZjA4MCwgMHg4ZjgyMDA0NCwgCisweDNjMDNmZmZmLCAweDM0NjMzZjdmLCAweDQzMTAyNCwgMHgzNDQyYTA4MCwgCisweGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDEwMDAwMGVhLCAweDI0MDIwMDA0LCAKKzB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMjgsIDB4MjQ2M2Q4ZjAsIAorMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAxNDcsIDB4MjQwMjAwMDUsIAorMHgxMDAwMDBkOCwgMHgwLCAweDhmODIwMjIwLCAweDNjMDNmNzAwLCAKKzB4NDMxMDI1LCAweGFmODIwMjIwLCAweGFmODAwMjA0LCAweDNjMDEwMDAyLCAKKzB4MTAwMDAwZDYsIDB4YWMyMDhmZTAsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIAorMHg4YzQyNmYyOCwgMHgyNDYzZmZmNiwgMHg0MzEwMjMsIDB4MmM0MjAwMGEsIAorMHgxNDQwMDEzNSwgMHgyNDAyMDAwNywgMHgxMDAwMDBkNywgMHgwLCAKKzB4YzAwM2Y1MCwgMHgwLCAweDEwNDAwMTJkLCAweDI0MDIwMDAxLCAKKzB4OGY4MjAyMTQsIDB4M2MwM2ZmZmYsIDB4M2MwNDAwMDEsIDB4OGM4NDZmMWMsIAorMHg0MzEwMjQsIDB4MzQ0MjI1MWYsIDB4YWY4MjAyMTQsIDB4MjQwMjAwMDgsIAorMHgxMDgwMDAwNSwgMHhhZWUyMDRiOCwgMHgzYzAyMDAwMSwgMHg4YzQyNmU0NCwgCisweDEwNDAwMDY0LCAweDI0MDIwMDAxLCAweDhmODIwMjIwLCAweDNjMDMwMDA4LCAKKzB4NDMxMDI0LCAweDEwNDAwMDZhLCAweDNjMDIwMjAwLCAweDEwMDAwMDc4LCAKKzB4MCwgMHg4ZWUyMDRiOCwgMHgyNDQzZmZmZiwgMHgyYzYyMDAwNywgCisweDEwNDAwMTE1LCAweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgCisweDhjMjI2YjM4LCAweDQwMDAwOCwgMHgwLCAweGMwMDNkYWYsIAorMHgwLCAweDNjMDEwMDAxLCAweGFjMjA2ZDljLCAweGFmODAwMjA0LCAKKzB4M2MwMTAwMDIsIDB4YzAwNDQ4MiwgMHhhYzIwOGZlMCwgMHgyNDAyMDAwMSwgCisweDNjMDEwMDAxLCAweGFjMjI2ZGI0LCAweDI0MDIwMDAyLCAweDEwMDAwMTAyLCAKKzB4YWVlMjA0YjgsIDB4YzAwNDU0NywgMHgwLCAweDNjMDMwMDAxLCAKKzB4OGM2MzZkYjQsIDB4MTAwMDAwODQsIDB4MjQwMjAwMDksIDB4M2MwMjAwMDIsIAorMHg4YzQyOGZmOCwgMHgzMDQyNDAwMCwgMHgxMDQwMDAwMywgMHgzYzAyMDBjOCwgCisweDEwMDAwMDAyLCAweDM0NDIwMWY2LCAweDM0NDIwMWZlLCAweGFmODIwMjM4LCAKKzB4OGY4MzAwNTQsIDB4MTAwMDAwOGIsIDB4MjQwMjAwMDQsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmYyOCwgMHgyNDYzZDhmMCwgMHg0MzEwMjMsIAorMHgyYzQyMjcxMCwgMHgxNDQwMDBlOCwgMHgyNDAyMDAwNSwgMHgxMDAwMDA3OSwgCisweDAsIDB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsIDB4NDMxMDI1LCAKKzB4YWY4MjAyMjAsIDB4YWY4MDAyMDQsIDB4M2MwMTAwMDIsIDB4MTAwMDAwNzcsIAorMHhhYzIwOGZlMCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYyOCwgCisweDI0NjNmZmY2LCAweDQzMTAyMywgMHgyYzQyMDAwYSwgMHgxNDQwMDBkNiwgCisweDI0MDIwMDA3LCAweDEwMDAwMDc4LCAweDAsIDB4YzAwM2Y1MCwgCisweDAsIDB4MTA0MDAwY2UsIDB4MjQwMjAwMDEsIDB4OGY4MjAyMTQsIAorMHgzYzAzZmZmZiwgMHgzYzA0MDAwMSwgMHg4Yzg0NmYxYywgMHg0MzEwMjQsIAorMHgzNDQyMjUxZiwgMHhhZjgyMDIxNCwgMHgyNDAyMDAwOCwgMHgxMDgwMDAwZiwgCisweGFlZTIwNGI4LCAweDNjMDIwMDAxLCAweDhjNDI2ZTQ0LCAweDE0NDAwMDBiLCAKKzB4MCwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgCisweDI0MDIwMDAxLCAweDNjMDEwMDAyLCAweGFjMjI4ZjkwLCAweGMwMDRlOWMsIAorMHg4Zjg0MDIyMCwgMHgxMDAwMDAxNiwgMHgwLCAweDhmODIwMjIwLCAKKzB4M2MwMzAwMDgsIDB4NDMxMDI0LCAweDE0NDAwMDExLCAweDNjMDIwMjAwLCAKKzB4MjgyYTAyNSwgMHgyNDAyMDAwZSwgMHgzYzAxMDAwMiwgMHhhYzIyOGY5MCwgCisweGMwMDU1MWIsIDB4MjAyMSwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgCisweGMwMDNlNmQsIDB4YWY4MjAyMjAsIDB4M2MwNTAwMDEsIDB4OGNhNTZkOTgsIAorMHhjMDA1MjliLCAweDIwMjEsIDB4MTAwMDAwYTMsIDB4MCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZTQ0LCAweDEwNDAwMDlmLCAweDAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmU0MCwgMHgyNDQyZmZmZiwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZTQwLCAweDE0NDAwMDk4LCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLCAKKzB4YWMyMDZlNDQsIDB4M2MwMTAwMDEsIDB4MTAwMDAwOTMsIDB4YWMyMjZlNDAsIAorMHg4ZWUyMDRiOCwgMHgyNDQzZmZmZiwgMHgyYzYyMDAwNywgMHgxMDQwMDA4ZSwgCisweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNmI1OCwgCisweDQwMDAwOCwgMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGE0LCAKKzB4MTA0MDAwMTgsIDB4MjQwMjAwMDUsIDB4YzAwNDQ4MiwgMHgwLCAKKzB4MjQwMjAwMDIsIDB4YWVlMjA0YjgsIDB4M2MwMTAwMDEsIDB4MTAwMDAwN2UsIAorMHhhYzIwNmRhNCwgMHhjMDA0OTYzLCAweDAsIDB4M2MwMzAwMDEsIAorMHg4YzYzNmRkNCwgMHgyNDAyMDAwNiwgMHgxNDYyMDA3NywgMHgyNDAyMDAwMywgCisweDEwMDAwMDc1LCAweGFlZTIwNGI4LCAweDNjMDUwMDAxLCAweDhjYTU2ZDk4LCAKKzB4M2MwNjAwMDIsIDB4OGNjNjhmZjgsIDB4YzAwNTEwNCwgMHgyMDIxLCAKKzB4MjQwMjAwMDUsIDB4MTAwMDAwNmMsIDB4YWVlMjA0YjgsIDB4OGY4MjAyMjAsIAorMHgzYzAzZjcwMCwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4OGY4MzAwNTQsIAorMHgyNDAyMDAwNiwgMHhhZWUyMDRiOCwgMHgzYzAxMDAwMSwgMHgxMDAwMDA2MiwgCisweGFjMjM2ZjI4LCAweDhmODIwMjIwLCAweDNjMDMwMDA0LCAweDQzMTAyNCwgCisweDEwNDAwMDAzLCAweDI0MDIwMDA3LCAweDEwMDAwMDViLCAweGFlZTIwNGI4LCAKKzB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMjgsIDB4MjQ2M2Q4ZjAsIAorMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAwMDMsIDB4MjQwMjAwMDEsIAorMHgzYzAxMDAwMSwgMHhhYzIyNmQ5YywgMHgzYzAyMDAwMiwgMHg4YzQyOGZmOCwgCisweDMwNDI1MDAwLCAweDEwNDAwMDRjLCAweDAsIDB4OGY4MjAyMjAsIAorMHgzMDQyODAwMCwgMHgxMDQwMDAwNywgMHgwLCAweDhmODIwMjIwLCAKKzB4M2MwM2ZmZmYsIDB4MzQ2MzdmZmYsIDB4NDMxMDI0LCAweDEwMDAwMDQyLCAKKzB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4MzQ0MjgwMDAsIDB4MTAwMDAwM2UsIAorMHhhZjgyMDIyMCwgMHgzYzA1MDAwMSwgMHg4Y2E1NmQ5OCwgMHhjMDA1MjliLCAKKzB4MjAyMSwgMHhjMDA1NTFiLCAweDIwMjEsIDB4M2MwMjAwMDIsIAorMHg4YzQyOGZmMCwgMHg0NDEwMDMyLCAweDI0MDIwMDAxLCAweDhmODIwMjE0LCAKKzB4M2MwM2ZmZmYsIDB4NDMxMDI0LCAweDM0NDIyNTFmLCAweGFmODIwMjE0LCAKKzB4MjQwMjAwMDgsIDB4YWVlMjA0YjgsIDB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsIAorMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwNCwgMHg0MzEwMjQsIAorMHgxNDQwMDAxNiwgMHgwLCAweDNjMDIwMDAyLCAweDhjNDI4ZmY4LCAKKzB4MzA0MjUwMDAsIDB4MTA0MDAwMGQsIDB4MCwgMHg4ZjgyMDIyMCwgCisweDMwNDI4MDAwLCAweDEwNDAwMDA2LCAweDAsIDB4OGY4MjAyMjAsIAorMHgzYzAzZmZmZiwgMHgzNDYzN2ZmZiwgMHgxMDAwMDAwMywgMHg0MzEwMjQsIAorMHg4ZjgyMDIyMCwgMHgzNDQyODAwMCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgCisweDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgMHgzYzAyMDAwMSwgCisweDk0NDI2ZjI2LCAweDI0NDI5ZmJjLCAweDJjNDIwMDA0LCAweDEwNDAwMDA0LCAKKzB4MjQwNDAwMTgsIDB4MjQwNTAwMDIsIDB4YzAwNGRkYiwgMHgyNDA2MDAyMCwgCisweGMwMDNlNmQsIDB4MCwgMHgxMDAwMDAwMywgMHgwLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZkOWMsIDB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgCisweDI3YmQwMDIwLCAweDhmODIwMjAwLCAweDhmODIwMjIwLCAweDhmODIwMjIwLCAKKzB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMDAsIDB4M2MwNTAwMDEsIAorMHg4Y2E1NmQ5OCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIwMCwgMHgyNDAyMDAwMiwgCisweDEwYTIwMDRiLCAweDJjYTIwMDAzLCAweDEwNDAwMDA1LCAweDI0MDIwMDAxLCAKKzB4MTBhMjAwMGEsIDB4MCwgMHgxMDAwMDBiMSwgMHgwLCAKKzB4MjQwMjAwMDQsIDB4MTBhMjAwNzIsIDB4MjQwMjAwMDgsIDB4MTBhMjAwODUsIAorMHgzYzAyZjBmZiwgMHgxMDAwMDBhYSwgMHgwLCAweDhmODMwMDUwLCAKKzB4M2MwMmYwZmYsIDB4MzQ0MmZmZmYsIDB4M2MwNDAwMDEsIDB4OGM4NDZmNDAsIAorMHg2MjE4MjQsIDB4M2MwMjA3MDAsIDB4NjIxODI1LCAweDI0MDIwZTAwLCAKKzB4MjQ4NGZmZmIsIDB4MmM4NDAwMDIsIDB4YWY4MzAwNTAsIDB4YWY4NTAyMDAsIAorMHhhZjg1MDIyMCwgMHgxNDgwMDAwNiwgMHhhZjgyMDIzOCwgMHg4ZjgyMDA0NCwgCisweDNjMDNmZmZmLCAweDM0NjMzZjdmLCAweDQzMTAyNCwgMHhhZjgyMDA0NCwgCisweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDI0MDIwMDA1LCAweDE0NjIwMDA0LCAKKzB4MCwgMHg4ZjgyMDA0NCwgMHgzNDQyNTAwMCwgMHhhZjgyMDA0NCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDg4LCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAKKzB4MzQ0MjAwMjIsIDB4MjQ2M2ZmZmMsIDB4MmM2MzAwMDIsIDB4MTQ2MDAwMGMsIAorMHhhZjgyMDIwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhYywgMHgzYzAzMDAwMSwgCisweDhjNjM2ZDkwLCAweDNjMDQwMDAxLCAweDhjODQ2ZDhjLCAweDM0NDI4MDAwLCAKKzB4NjIxODI1LCAweDY0MTgyNSwgMHgxMDAwMDAwYSwgMHgzNDYyMDAwMiwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDkwLCAweDNjMDMwMDAxLCAweDhjNjM2ZGFjLCAKKzB4M2MwNDAwMDEsIDB4OGM4NDZkOGMsIDB4NDMxMDI1LCAweDQ0MTAyNSwgCisweDM0NDIwMDAyLCAweGFmODIwMjIwLCAweDEwMDAwMDJmLCAweDI0MDIwMDAxLCAKKzB4MjQwMjBlMDEsIDB4YWY4MjAyMzgsIDB4OGY4MzAwNTAsIDB4M2MwMmYwZmYsIAorMHgzNDQyZmZmZiwgMHgzYzA0MDAwMSwgMHg4Yzg0NmYxYywgMHg2MjE4MjQsIAorMHgzYzAyMGQwMCwgMHg2MjE4MjUsIDB4MjQwMjAwMDEsIDB4YWY4MzAwNTAsIAorMHhhZjgyMDIwMCwgMHhhZjgyMDIyMCwgMHgxMDgwMDAwNSwgMHgzYzAzM2YwMCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDgwLCAweDEwMDAwMDA0LCAweDM0NjMwMDcwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZkODAsIDB4MzQ2MzAwNzIsIDB4NDMxMDI1LCAKKzB4YWY4MjAyMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzZkODQsIDB4M2MwMmY3MDAsIAorMHg2MjE4MjUsIDB4M2MwMjAwMDEsIDB4OGM0MjZkOTAsIDB4M2MwNDAwMDEsIAorMHg4Yzg0NmRhYywgMHgzYzA1MDAwMSwgMHg4Y2E1NmY0MCwgMHg0MzEwMjUsIAorMHg0NDEwMjUsIDB4YWY4MjAyMjAsIDB4MjQwMjAwMDUsIDB4MTRhMjAwMDYsIAorMHgyNDAyMDAwMSwgMHg4ZjgyMDA0NCwgMHgyNDAzYWZmZiwgMHg0MzEwMjQsIAorMHhhZjgyMDA0NCwgMHgyNDAyMDAwMSwgMHgxMDAwMDAzZCwgMHhhZjgyMDIzOCwgCisweDhmODMwMDUwLCAweDNjMDJmMGZmLCAweDM0NDJmZmZmLCAweDNjMDQwMDAxLCAKKzB4OGM4NDZmMWMsIDB4NjIxODI0LCAweDNjMDIwYTAwLCAweDYyMTgyNSwgCisweDI0MDIwMDAxLCAweGFmODMwMDUwLCAweGFmODIwMjAwLCAweDEwODAwMDFlLCAKKzB4YWY4MjAyMjAsIDB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTQ0MDAwMWEsIAorMHgzYzAzM2YwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmQ4MCwgMHgxMDAwMDAxYSwgCisweDM0NjMwMGUwLCAweDhmODMwMDUwLCAweDNjMDQwMDAxLCAweDhjODQ2ZjFjLCAKKzB4MzQ0MmZmZmYsIDB4NjIxODI0LCAweDEwODAwMDBmLCAweGFmODMwMDUwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTQ0MDAwMGIsIDB4M2MwNDNmMDAsIAorMHgzYzAzMDAwMSwgMHg4YzYzNmQ4MCwgMHgzNDg0MDBlMCwgMHgyNDAyMDAwMSwgCisweGFmODIwMjAwLCAweGFmODIwMjIwLCAweDY0MTgyNSwgMHhhZjgzMDIwMCwgCisweDEwMDAwMDA4LCAweDNjMDVmNzAwLCAweDNjMDIwMDAxLCAweDhjNDI2ZDgwLCAKKzB4M2MwMzNmMDAsIDB4MzQ2MzAwZTIsIDB4NDMxMDI1LCAweGFmODIwMjAwLCAKKzB4M2MwNWY3MDAsIDB4MzRhNTgwMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzZkODQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmQ5MCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmRhYywgCisweDY1MTgyNSwgMHg0MzEwMjUsIDB4NDQxMDI1LCAweGFmODIwMjIwLCAKKzB4M2UwMDAwOCwgMHgwLCAweDNjMDMwMDAxLCAweDhjNjM2ZGI0LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZkYjgsIDB4MTA2MjAwMDMsIDB4MjQwMjAwMDIsIAorMHgzYzAxMDAwMSwgMHhhYzIzNmRiOCwgMHgxMDYyMDAxZCwgMHgyYzYyMDAwMywgCisweDEwNDAwMDI1LCAweDI0MDIwMDAxLCAweDE0NjIwMDIzLCAweDI0MDIwMDA0LCAKKzB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsIDB4MTA2MjAwMDYsIDB4MjQwMjAwMDgsIAorMHgxNDYyMDAwYywgMHgzYzAyMDBjOCwgMHgzNDQyMDFmYiwgMHgxMDAwMDAwOSwgCisweGFmODIwMjM4LCAweDI0MDIwZTAxLCAweGFmODIwMjM4LCAweDhmODIwMDQ0LCAKKzB4M2MwM2ZmZmYsIDB4MzQ2MzNmN2YsIDB4NDMxMDI0LCAweDM0NDIwMDgwLCAKKzB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsIAorMHhhYzIyNmRiNCwgMHgzYzAxMDAwMSwgMHgxMDAwMDAwYiwgMHhhYzIzNmYyYywgCisweDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI2ZjJjLCAweDI0NjNkOGYwLCAKKzB4NDMxMDIzLCAweDJjNDIyNzEwLCAweDE0NDAwMDAzLCAweDI0MDIwMDA5LCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZkYjQsIDB4M2UwMDAwOCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MjdiZGZmZDgsIAorMHhhZmIyMDAxOCwgMHg4MDkwMjEsIDB4YWZiMzAwMWMsIDB4YTA5ODIxLCAKKzB4YWZiMTAwMTQsIDB4YzA4ODIxLCAweGFmYjAwMDEwLCAweDgwMjEsIAorMHhhZmJmMDAyMCwgMHhhNjIwMDAwMCwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAKKzB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwgCisweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHgyNDEwMDAxMCwgMHgyNTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgCisweDI1MDEwMjQsIDB4MjQxMDAwMTAsIDB4MjcwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgyNzAxMDI0LCAweGMwMDRkYjksIDB4MzQxMDgwMDAsIAorMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgMHgwLCAKKzB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLCAweDUwMTAyNSwgCisweGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLCAKKzB4YzAwNGRiOSwgMHgwLCAweDhmYmYwMDIwLCAweDhmYjMwMDFjLCAKKzB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4M2UwMDAwOCwgCisweDI3YmQwMDI4LCAweDI3YmRmZmQ4LCAweGFmYjEwMDE0LCAweDgwODgyMSwgCisweGFmYjIwMDE4LCAweGEwOTAyMSwgMHhhZmIzMDAxYywgMHhjMDk4MjEsIAorMHhhZmIwMDAxMCwgMHg4MDIxLCAweGFmYmYwMDIwLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgCisweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDIzMDEwMjQsIDB4MTA0MDAwMDIsIAorMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZmEsIDB4MjMwMTAyNCwgMHgyNDEwMDAxMCwgMHgyNTAxMDI0LCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDI1MDEwMjQsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgzNDEwODAwMCwgCisweDk2NjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZjgsIAorMHgwLCAweGMwMDRkYjksIDB4MCwgMHg4ZmJmMDAyMCwgCisweDhmYjMwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLCAKKzB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmRkMCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZTE4LCAweDI3YmRmZmQ4LCAweGFmYmYwMDIwLCAKKzB4YWZiMTAwMWMsIDB4MTA4MjAwMDMsIDB4YWZiMDAwMTgsIDB4M2MwMTAwMDEsIAorMHhhYzI0NmUxOCwgMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgyNDAyMDAwNSwgCisweDE0NjIwMDA1LCAweDI0ODNmZmZmLCAweGMwMDQ5NjMsIDB4MCwgCisweDEwMDAwMzRjLCAweDAsIDB4MmM2MjAwMTMsIDB4MTA0MDAzNDksIAorMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjZiODAsIAorMHg0MDAwMDgsIDB4MCwgMHhjMDA0ZGI5LCAweDgwMjEsIAorMHgzNDAyODAwMCwgMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIAorMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LCAKKzB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsIDB4MCwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgCisweDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwgMHgwLCAKKzB4MTAwMDAzMGUsIDB4MjQwMjAwMDIsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIAorMHg4MDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIAorMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIAorMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwgCisweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgCisweDI0MTAwMDEwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYywgMHgwLCAweGMwMDRkYjksIDB4MzQxMDgwMDAsIAorMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgMHgwLCAKKzB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLCAweDUwMTAyNSwgCisweGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLCAKKzB4YzAwNGRiOSwgMHgwLCAweDk3YTIwMDEwLCAweDMwNDI4MDAwLCAKKzB4MTQ0MDAyZGMsIDB4MjQwMjAwMDMsIDB4MTAwMDAyZDgsIDB4MCwgCisweDI0MDIxMjAwLCAweGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHhjMDA0ZDc4LCAweDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLCAKKzB4MCwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgyMDIxLCAweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDEwODA0MiwgMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIAorMHgwLCAweDhmODMwMDU0LCAweDEwMDAwMjk2LCAweDI0MDIwMDA0LCAKKzB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIAorMHg0MzEwMjMsIDB4MmM0MjAwNjQsIDB4MTQ0MDAyOWUsIDB4MjQwMjAwMDIsIAorMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgxMDYyMDI5NywgMHgyYzYyMDAwMywgCisweDE0NDAwMjk2LCAweDI0MDIwMDExLCAweDI0MDIwMDAzLCAweDEwNjIwMDA1LCAKKzB4MjQwMjAwMDQsIDB4MTA2MjAyOTEsIDB4MjQwMjAwMGYsIDB4MTAwMDAyOGYsIAorMHgyNDAyMDAxMSwgMHgxMDAwMDI4ZCwgMHgyNDAyMDAwNSwgMHgyNDAyMDAxNCwgCisweGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAKKzB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIAorMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMTIsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTIsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgzNDEwODAwMCwgCisweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZjgsIAorMHgwLCAweGMwMDRkYjksIDB4MCwgMHg4ZjgzMDA1NCwgCisweDEwMDAwMjQ4LCAweDI0MDIwMDA2LCAweDhmODMwMDU0LCAweDNjMDIwMDAxLCAKKzB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLCAweDJjNDIwMDY0LCAKKzB4MTQ0MDAyNTAsIDB4MjQwMjAwMDcsIDB4MTAwMDAyNGMsIDB4MCwgCisweDI0MDIwMDA2LCAweGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxMywgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTMsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIDB4MCwgCisweDhmODMwMDU0LCAweDEwMDAwMjA3LCAweDI0MDIwMDA4LCAweDhmODMwMDU0LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLCAKKzB4MmM0MjAwNjQsIDB4MTQ0MDAyMGYsIDB4MjQwMjAwMDksIDB4MTAwMDAyMGIsIAorMHgwLCAweDI3YjEwMDEwLCAweGE3YTAwMDEwLCAweDgwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsIAorMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwgCisweGMwMDRkNTgsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsIAorMHg5NjIyMDAwMCwgMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZGI5LCAweDgwMjEsIAorMHg5N2EyMDAxMCwgMHgyN2IxMDAxMCwgMHgzNDQyMDAwMSwgMHhhN2EyMDAxMCwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIAorMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgCisweDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgCisweDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwgMHgwLCAKKzB4OGY4MzAwNTQsIDB4MTAwMDAxOTMsIDB4MjQwMjAwMGEsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmYzYywgMHgyNDYzZmY5YywgMHg0MzEwMjMsIAorMHgyYzQyMDA2NCwgMHgxNDQwMDE5YiwgMHgyNDAyMDAwYiwgMHgxMDAwMDE5NywgCisweDAsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIAorMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgCisweGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgCisweDMyMDIwMDE3LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxNywgCisweGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLCAKKzB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwgCisweDk2MjIwMDAwLCAweDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIDB4ODAyMSwgCisweDk3YTIwMDEwLCAweDI3YjEwMDEwLCAweDM0NDIwNzAwLCAweGE3YTIwMDEwLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgCisweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAKKzB4MzIwMjAwMTcsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgCisweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE3LCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIAorMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZGI5LCAweDAsIAorMHg4ZjgzMDA1NCwgMHgxMDAwMDExZiwgMHgyNDAyMDAwYywgMHg4ZjgzMDA1NCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZjNjLCAweDI0NjNmZjljLCAweDQzMTAyMywgCisweDJjNDIwMDY0LCAweDE0NDAwMTI3LCAweDI0MDIwMDEyLCAweDEwMDAwMTIzLCAKKzB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgCisweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAKKzB4MzIwMjAwMTQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgCisweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE0LCAKKzB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsIAorMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAKKzB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgCisweDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwgMHg4MDIxLCAKKzB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzQ0MjAwMTAsIDB4YTdhMjAwMTAsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxNCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTQsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIDB4MCwgCisweDhmODMwMDU0LCAweDEwMDAwMGFiLCAweDI0MDIwMDEzLCAweDhmODMwMDU0LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLCAKKzB4MmM0MjAwNjQsIDB4MTQ0MDAwYjMsIDB4MjQwMjAwMGQsIDB4MTAwMDAwYWYsIAorMHgwLCAweDI3YjEwMDEwLCAweGE3YTAwMDEwLCAweDgwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsIAorMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwgCisweGMwMDRkNTgsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsIAorMHg5NjIyMDAwMCwgMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZGI5LCAweDgwMjEsIAorMHg5N2EyMDAxMCwgMHgyN2IxMDAxMCwgMHgzMDQyZmZmZSwgMHhhN2EyMDAxMCwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIAorMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgCisweDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgCisweDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwgMHgwLCAKKzB4OGY4MzAwNTQsIDB4MTAwMDAwMzcsIDB4MjQwMjAwMGUsIDB4MjQwMjA4NDAsIAorMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHg4MDIxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgCisweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgCisweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDEzLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDEzLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MzQxMDgwMDAsIAorMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmY4LCAKKzB4MCwgMHhjMDA0ZGI5LCAweDAsIDB4OGY4MzAwNTQsIAorMHgyNDAyMDAxMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmRkMCwgMHgzYzAxMDAwMSwgCisweDEwMDAwMDBjLCAweGFjMjM2ZjNjLCAweDhmODMwMDU0LCAweDNjMDIwMDAxLCAKKzB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLCAweDJjNDIwMDY0LCAKKzB4MTQ0MDAwMDQsIDB4MCwgMHgyNDAyMDAxMSwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZGQwLCAweDhmYmYwMDIwLCAweDhmYjEwMDFjLCAweDhmYjAwMDE4LCAKKzB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzYzAzMDAwMSwgMHg4YzYzNmQ5OCwgCisweDI3YmRmZmM4LCAweDI0MDIwMDAyLCAweGFmYmYwMDM0LCAweGFmYjIwMDMwLCAKKzB4YWZiMTAwMmMsIDB4MTQ2MjAwMDQsIDB4YWZiMDAwMjgsIDB4M2MxMjAwMDIsIAorMHgxMDAwMDAwMywgMHg4ZTUyOGZmOCwgMHgzYzEyMDAwMiwgMHg4ZTUyOGZmYywgCisweDNjMDMwMDAxLCAweDhjNjM2ZGQ0LCAweDNjMDIwMDAxLCAweDhjNDI2ZTFjLCAKKzB4NTA2MjAwMDQsIDB4MjQ2M2ZmZmYsIDB4M2MwMTAwMDEsIDB4YWMyMzZlMWMsIAorMHgyNDYzZmZmZiwgMHgyYzYyMDAwNiwgMHgxMDQwMDM3NywgMHgzMTA4MCwgCisweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNmJkOCwgMHg0MDAwMDgsIAorMHgwLCAweDIwMjEsIDB4MjgyMSwgMHhjMDA0ZGRiLCAKKzB4MzQwNjgwMDAsIDB4MjQwNDAwMTAsIDB4MjQwNTAwMDIsIDB4MjQwNjAwMDIsIAorMHgyNDAyMDAwMiwgMHhjMDA0ZGRiLCAweGE3YTIwMDE4LCAweDI0MDIwMDAyLCAKKzB4M2MwMTAwMDEsIDB4MTAwMDAzNjQsIDB4YWMyMjZkZDQsIDB4MjdiMTAwMTgsIAorMHhhN2EwMDAxOCwgMHg4MDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAKKzB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgCisweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDEwODA0MiwgMHgxNjAwZmZmYywgMHgwLCAweGMwMDRkYjksIAorMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgCisweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLCAKKzB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgCisweDAsIDB4YzAwNGRiOSwgMHgwLCAweDk3YTIwMDE4LCAKKzB4MzA0MjgwMDAsIDB4MTQ0MDAwMDQsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsIAorMHhhYzIyNmRkNCwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwgMHgxMDAwMDMyYSwgCisweGFjMjI2ZGQ0LCAweDI0MDQwMDEwLCAweDI0MDUwMDAyLCAweDI0MDYwMDAyLCAKKzB4MjQwMjAwMDIsIDB4YzAwNGRkYiwgMHhhN2EyMDAxOCwgMHgzYzAzMDAwMSwgCisweDhjNjM2ZTIwLCAweDI0MDIwMDAxLCAweDE0NjIwMWUxLCAweDgwMjEsIAorMHgyN2IxMDAxOCwgMHhhN2EwMDAxOCwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAKKzB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwgCisweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgMHgyMDIxLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIAorMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwgMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAKKzB4YzAwNGRiOSwgMHgwLCAweGMwMDRkNTgsIDB4MCwgCisweDUwNDAwMDA1LCAweDEwODA0MiwgMHg5NjIyMDAwMCwgMHg1MDEwMjUsIAorMHhhNjIyMDAwMCwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsIDB4MCwgCisweGMwMDRkYjksIDB4ODAyMSwgMHgyN2IxMDAxOCwgMHhhN2EwMDAxOCwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIAorMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgCisweGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgCisweDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwgCisweGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLCAKKzB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwgCisweDk2MjIwMDAwLCAweDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIDB4ODAyMSwgCisweDI0MDQwMDE4LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDQwNCwgCisweGE3YTAwMDFhLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIAorMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIAorMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwgCisweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgCisweDI0MTAwMDEwLCAweDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgCisweDMyMDIwMDE4LCAweGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgCisweDAsIDB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAKKzB4MTA4MDQyLCAweDk3YTIwMDFhLCAweDUwMTAyNSwgMHhhN2EyMDAxYSwgCisweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIAorMHg4MDIxLCAweGE3YTAwMDFhLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAKKzB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgCisweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDE4LCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgCisweDE2MDBmZmZhLCAweDMyMDIwMDE4LCAweGMwMDRkYjksIDB4MzQxMDgwMDAsIAorMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgMHgwLCAKKzB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk3YTIwMDFhLCAweDUwMTAyNSwgCisweGE3YTIwMDFhLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLCAKKzB4YzAwNGRiOSwgMHg4MDIxLCAweGE3YTAwMDFjLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgCisweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgyMDIxLCAweDI0MTAwMDEwLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDEwODA0MiwgMHgxNjAwZmZmYywgMHgwLCAweDI0MTAwMDEwLCAKKzB4MzIwMjAwMWUsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgCisweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDFlLCAKKzB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsIAorMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAKKzB4OTdhMjAwMWMsIDB4NTAxMDI1LCAweGE3YTIwMDFjLCAweDEwODA0MiwgCisweDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwgMHg4MDIxLCAKKzB4YTdhMDAwMWMsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgCisweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgCisweDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLCAKKzB4YzAwNGQ3OCwgMHgyMDIxLCAweDEwODA0MiwgMHgxNjAwZmZmYywgCisweDAsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMWUsIDB4MTA0MDAwMDIsIAorMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZmEsIDB4MzIwMjAwMWUsIDB4YzAwNGRiOSwgMHgzNDEwODAwMCwgCisweGMwMDRkYjksIDB4MCwgMHhjMDA0ZDU4LCAweDAsIAorMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTdhMjAwMWMsIDB4NTAxMDI1LCAKKzB4YTdhMjAwMWMsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsIAorMHhjMDA0ZGI5LCAweDgwMjEsIDB4MjQwMjAwMDIsIDB4YTdhMjAwMWUsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwgCisweDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLCAweDAsIAorMHgyNDEwMDAxMCwgMHgzMjAyMDAxZSwgMHgxMDQwMDAwMiwgMHgyMDIxLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIAorMHgzMjAyMDAxZSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgyMDIxLCAweDM0MTA4MDAwLCAweDk3YTIwMDFlLCAweDUwMTAyNCwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDEwODA0MiwgMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIAorMHg4MDIxLCAweGE3YTAwMDIwLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAKKzB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDI0MTAwMDEwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYywgMHgwLCAweDI0MTAwMDEwLCAweDMyMDIwMDFlLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDFlLCAweGMwMDRkYjksIAorMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgCisweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk3YTIwMDIwLCAKKzB4NTAxMDI1LCAweGE3YTIwMDIwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgCisweDAsIDB4YzAwNGRiOSwgMHg4MDIxLCAweGE3YTAwMDIwLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgCisweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLCAweGMwMDRkNzgsIAorMHgyMDIxLCAweDEwODA0MiwgMHgxNjAwZmZmYywgMHgwLCAKKzB4MjQxMDAwMTAsIDB4MzIwMjAwMWUsIDB4MTA0MDAwMDIsIDB4MjAyMSwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAKKzB4MzIwMjAwMWUsIDB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAKKzB4MCwgMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsIAorMHgxMDgwNDIsIDB4OTdhMjAwMjAsIDB4NTAxMDI1LCAweGE3YTIwMDIwLCAKKzB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwgCisweDgwMjEsIDB4YTdhMDAwMjIsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgCisweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsIAorMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgCisweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAKKzB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDEwODA0MiwgCisweDE2MDBmZmZjLCAweDAsIDB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwgCisweDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLCAweDAsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk3YTIwMDIyLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIDB4MCwgCisweDI0MDQwMDE4LCAweDI0MDUwMDAyLCAweGMwMDRkZGIsIDB4MjQwNjAwMDQsIAorMHgzYzEwMDAwMSwgMHg4ZTEwNmUyNCwgMHgyNDAyMDAwMSwgMHgxNjAyMDExZCwgCisweDAsIDB4M2MwMjAwMDEsIDB4OTQ0MjZmMjYsIDB4M2MwMTAwMDEsIAorMHhhYzIwNmUyNCwgMHgyNDQyOWZiYywgMHgyYzQyMDAwNCwgMHgxMDQwMDAwYywgCisweDI0MDQwMDA5LCAweDI0MDUwMDAxLCAweGMwMDRkZGIsIDB4MjQwNjA0MDAsIAorMHgyNDA0MDAxOCwgMHgyNDA1MDAwMSwgMHhjMDA0ZGRiLCAweDI0MDYwMDIwLCAKKzB4MjQwNDAwMTgsIDB4MjQwNTAwMDEsIDB4YzAwNGRkYiwgMHgyNDA2MjAwMCwgCisweDNjMDI0MDAwLCAweDI0MjEwMjQsIDB4MTA0MDAxMjMsIDB4M2MwMjIwMDAsIAorMHgyNDIxMDI0LCAweDEwNDAwMDA0LCAweDAsIDB4M2MwMTAwMDEsIAorMHgxMDAwMDAwMywgMHhhYzMwNmYxYywgMHgzYzAxMDAwMSwgMHhhYzIwNmYxYywgCisweDNjMDMwMDAxLCAweDhjNjM2ZjM0LCAweDI0MDIwMDA1LCAweDE0NjIwMGY5LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywgMHgxMDQwMDA2NywgCisweDNjMDIwMDA0LCAweDI0MjEwMjQsIDB4MTA0MDAwMTEsIDB4YTdhMDAwMTgsIAorMHgzYzAyMDAwOCwgMHgyNDIxMDI0LCAweDEwNDAwMDAyLCAweDI0MDIwMjAwLCAKKzB4YTdhMjAwMTgsIDB4M2MwMjAwMTAsIDB4MjQyMTAyNCwgMHgxMDQwMDAwNCwgCisweDAsIDB4OTdhMjAwMTgsIDB4MzQ0MjAxMDAsIDB4YTdhMjAwMTgsIAorMHg5N2E2MDAxOCwgMHgyNDA0MDAwOSwgMHgxMDAwMDAwNCwgMHgyODIxLCAKKzB4MjQwNDAwMDksIDB4MjgyMSwgMHgzMDIxLCAweGMwMDRkZGIsIAorMHgwLCAweDI0MDIwMDAxLCAweGE3YTIwMDFhLCAweDNjMDIwMDA4LCAKKzB4MjQyMTAyNCwgMHgxMDQwMDAwYywgMHgzYzAyMDAwMiwgMHgyNDIxMDI0LCAKKzB4MTA0MDAwMDIsIDB4MjQwMjAxMDEsIDB4YTdhMjAwMWEsIDB4M2MwMjAwMDEsIAorMHgyNDIxMDI0LCAweDEwNDAwMDA1LCAweDNjMDIwMDEwLCAweDk3YTIwMDFhLCAKKzB4MzQ0MjAwNDAsIDB4YTdhMjAwMWEsIDB4M2MwMjAwMTAsIDB4MjQyMTAyNCwgCisweDEwNDAwMDBlLCAweDNjMDIwMDAyLCAweDI0MjEwMjQsIDB4MTA0MDAwMDUsIAorMHgzYzAyMDAwMSwgMHg5N2EyMDAxYSwgMHgzNDQyMDA4MCwgMHhhN2EyMDAxYSwgCisweDNjMDIwMDAxLCAweDI0MjEwMjQsIDB4MTA0MDAwMDUsIDB4M2MwMzAwYTAsIAorMHg5N2EyMDAxYSwgMHgzNDQyMDAyMCwgMHhhN2EyMDAxYSwgMHgzYzAzMDBhMCwgCisweDI0MzEwMjQsIDB4NTQ0MzAwMDQsIDB4M2MwMjAwMjAsIDB4OTdhMjAwMWEsIAorMHgxMDAwMDAwYywgMHgzNDQyMDQwMCwgMHgyNDIxMDI0LCAweDUwNDAwMDA0LCAKKzB4M2MwMjAwODAsIDB4OTdhMjAwMWEsIDB4MTAwMDAwMDYsIDB4MzQ0MjA4MDAsIAorMHgyNDIxMDI0LCAweDEwNDAwMDA0LCAweDAsIDB4OTdhMjAwMWEsIAorMHgzNDQyMGMwMCwgMHhhN2EyMDAxYSwgMHg5N2E2MDAxYSwgMHgyNDA0MDAwNCwgCisweGMwMDRkZGIsIDB4MjgyMSwgMHgzYzAyMDAwNCwgMHgyNDIxMDI0LCAKKzB4MTA0MDAwMDQsIDB4YTdhMDAwMWMsIDB4MzI0MjUwMDAsIDB4MTQ0MDAwMDQsIAorMHgwLCAweDMyNDI0MDAwLCAweDEwNDAwMDA1LCAweDIwMjEsIAorMHhjMDA0Y2Y5LCAweDI0MDIwMjEsIDB4MTAwMDAwOTYsIDB4MCwgCisweDk3YTYwMDFjLCAweDI4MjEsIDB4MzRjNjEyMDAsIDB4YzAwNGRkYiwgCisweGE3YTYwMDFjLCAweDEwMDAwMDhmLCAweDAsIDB4MjQyMTAyNCwgCisweDEwNDAwMDA0LCAweGE3YTAwMDE4LCAweDMyNDI1MDAwLCAweDE0NDAwMDA0LCAKKzB4MCwgMHgzMjQyNDAwMCwgMHgxMDQwMDAwNSwgMHgzYzAyMDAxMCwgCisweGMwMDRjZjksIDB4MjQwMjAyMSwgMHgxMDAwMDAxOSwgMHhhN2EwMDAxYSwgCisweDI0MjEwMjQsIDB4MTA0MDAwMDQsIDB4MCwgMHg5N2EyMDAxOCwgCisweDEwMDAwMDA0LCAweGE3YTIwMDE4LCAweDk3YTIwMDE4LCAweDM0NDIwMTAwLCAKKzB4YTdhMjAwMTgsIDB4M2MwMjAwMDEsIDB4MjQyMTAyNCwgMHgxMDQwMDAwNCwgCisweDAsIDB4OTdhMjAwMTgsIDB4MTAwMDAwMDQsIDB4YTdhMjAwMTgsIAorMHg5N2EyMDAxOCwgMHgzNDQyMjAwMCwgMHhhN2EyMDAxOCwgMHg5N2E2MDAxOCwgCisweDIwMjEsIDB4YzAwNGRkYiwgMHgyODIxLCAweGE3YTAwMDFhLCAKKzB4ODAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAKKzB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAKKzB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIAorMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZmMsIDB4MCwgMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAKKzB4YzAwNGRiOSwgMHgwLCAweGMwMDRkNTgsIDB4MCwgCisweDUwNDAwMDA1LCAweDEwODA0MiwgMHg5N2EyMDAxYSwgMHg1MDEwMjUsIAorMHhhN2EyMDAxYSwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsIDB4MCwgCisweGMwMDRkYjksIDB4ODAyMSwgMHhhN2EwMDAxYSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIAorMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LCAKKzB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsIDB4MCwgCisweGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLCAKKzB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwgCisweDk3YTIwMDFhLCAweDUwMTAyNSwgMHhhN2EyMDAxYSwgMHgxMDgwNDIsIAorMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIDB4MCwgCisweDNjMDQwMDAxLCAweDI0ODQ2YmNjLCAweDk3YTYwMDE4LCAweDk3YTcwMDFhLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZkOTgsIDB4M2MwMzAwMDEsIDB4OGM2MzZmMWMsIAorMHgzYzA1MDAwZCwgMHgzNGE1MDIwNSwgMHhhZmEyMDAxMCwgMHhjMDAyYjNiLCAKKzB4YWZhMzAwMTQsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMDQsIDB4M2MwMTAwMDEsIAorMHhhYzIyNmRkNCwgMHgzYzAxMDAwMSwgMHgxMDAwMDAxNywgMHhhYzIzNmYzOCwgCisweDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI2ZjM4LCAweDI0NjNmZjljLCAKKzB4NDMxMDIzLCAweDJjNDIwMDY0LCAweDE0NDAwMDBmLCAweDAsIAorMHg4ZjgyMDIyMCwgMHgyNDAzMDAwNSwgMHgzYzAxMDAwMSwgMHhhYzIzNmRkNCwgCisweDNjMDNmNzAwLCAweDQzMTAyNSwgMHgxMDAwMDAwNywgMHhhZjgyMDIyMCwgCisweDI0MDIwMDA2LCAweDNjMDEwMDAxLCAweGFjMjI2ZGQ0LCAweDI0MDIwMDExLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZkZDAsIDB4OGZiZjAwMzQsIDB4OGZiMjAwMzAsIAorMHg4ZmIxMDAyYywgMHg4ZmIwMDAyOCwgMHgzZTAwMDA4LCAweDI3YmQwMDM4LCAKKzB4MjdiZGZmZDgsIDB4YWZiMDAwMTgsIDB4ODA4MDIxLCAweGFmYjEwMDFjLCAKKzB4ODgyMSwgMHgzMjAyNDAwMCwgMHgxMDQwMDAxMywgMHhhZmJmMDAyMCwgCisweDNjMDIwMDEwLCAweDIwMjEwMjQsIDB4MmM0MjAwMDEsIDB4MjEwMjMsIAorMHgzMDQzNDEwMCwgMHgzYzAyMDAwMSwgMHgyMDIxMDI0LCAweDE0NDAwMDA2LCAKKzB4MzQ3MTQwMDAsIDB4M2MwMjAwMDIsIDB4MjAyMTAyNCwgMHgxNDQwMDAwMiwgCisweDM0NzE2MDAwLCAweDM0NzE0MDQwLCAweDIwMjEsIDB4MjgyMSwgCisweDEwMDAwMDM2LCAweDIyMDMwMjEsIDB4MzIwMjEwMDAsIDB4MTA0MDAwMzUsIAorMHgyMDIxLCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDA0MCwgCisweDI0MDQwMDE4LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MGMwMCwgCisweDI0MDQwMDE3LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDQwMCwgCisweDI0MDQwMDE2LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAwNiwgCisweDI0MDQwMDE3LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MjUwMCwgCisweDI0MDQwMDE2LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAwNiwgCisweDI0MDQwMDE3LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2NDYwMCwgCisweDI0MDQwMDE2LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAwNiwgCisweDI0MDQwMDE3LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2NjcwMCwgCisweDI0MDQwMDE2LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAwNiwgCisweDI0MDQwMDFmLCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAxMCwgCisweDI0MDQwMDA5LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MTUwMCwgCisweDI0MDQwMDA5LCAweDI4MjEsIDB4MjQwNjFkMDAsIDB4YzAwNGRkYiwgCisweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDZiZjAsIDB4M2MwNTAwMGUsIAorMHgzNGE1MDEwMCwgMHgyMDAzMDIxLCAweDIyMDM4MjEsIDB4YWZhMDAwMTAsIAorMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmYmYwMDIwLCAweDhmYjEwMDFjLCAKKzB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHg4Zjg1MDA0NCwgCisweDhmODIwMDQ0LCAweDNjMDMwMDAxLCAweDQzMTAyNSwgMHgzYzAzMDAwOCwgCisweGFmODIwMDQ0LCAweDhmODQwMDU0LCAweDhmODIwMDU0LCAweGEzMjgyNCwgCisweDEwMDAwMDAyLCAweDI0ODQwMDAxLCAweDhmODIwMDU0LCAweDgyMTAyMywgCisweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsIAorMHgzYzAzZmZmZSwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsIAorMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwgCisweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgCisweDAsIDB4M2UwMDAwOCwgMHhhMDEwMjEsIDB4OGY4MzAwNDQsIAorMHgzYzAyZmZmMCwgMHgzNDQyZmZmZiwgMHg0MjQ4MCwgMHg2MjE4MjQsIAorMHgzYzAyMDAwMiwgMHg4MjIwMjUsIDB4NjQxODI1LCAweGFmODMwMDQ0LCAKKzB4OGY4MjAwNDQsIDB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIAorMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsIAorMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMDQ0LCAweDNjMDMwMDAxLCAKKzB4NDMxMDI1LCAweGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAKKzB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLCAKKzB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwgMHgzZTAwMDA4LCAKKzB4MCwgMHg4ZjgyMDA0NCwgMHgyNDAzZmY3ZiwgMHg0MzEwMjQsIAorMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgCisweDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgCisweDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwODAsIAorMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgCisweDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgCisweDE0NDBmZmZjLCAweDAsIDB4M2UwMDAwOCwgMHgwLCAKKzB4OGY4MjAwNDQsIDB4M2MwM2ZmZjAsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4YWY4MjAwNDQsIDB4OGY4MjAwNDQsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LCAKKzB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIAorMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsIAorMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMDQ0LCAweDNjMDNmZmZlLCAKKzB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMDQ0LCAweDhmODMwMDU0LCAKKzB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIAorMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwgCisweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZjOCwgMHhhZmIzMDAyNCwgCisweDgwOTgyMSwgMHhhZmJlMDAyYywgMHhhMGYwMjEsIDB4YWZiMjAwMjAsIAorMHhjMDkwMjEsIDB4MzNjMmZmZmYsIDB4YWZiZjAwMzAsIDB4YWZiNTAwMjgsIAorMHhhZmIxMDAxYywgMHhhZmIwMDAxOCwgMHgxNDQwMDAzNCwgMHhhN2IyMDAxMCwgCisweDMyNzFmZmZmLCAweDI3YjIwMDEwLCAweDgwMjEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAKKzB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIAorMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MjMwMTAyNCwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgyMzAxMDI0LCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MzQxMDgwMDAsIAorMHg5NjQyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDEyMDAwMDc1LCAKKzB4MCwgMHgxMDAwZmZmNiwgMHgwLCAweDMyNzVmZmZmLCAKKzB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIAorMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgyYjAxMDI0LCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDJiMDEwMjQsIDB4YzAwNGRiOSwgCisweDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwgMHhjMDA0ZDU4LCAKKzB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTYyMjAwMDAsIAorMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAKKzB4MCwgMHhjMDA0ZGI5LCAweDAsIDB4MzNjNWZmZmYsIAorMHgyNDAyMDAwMSwgMHg1NGEyMDAwNCwgMHgyNDAyMDAwMiwgMHg5N2EyMDAxMCwgCisweDEwMDAwMDA2LCAweDUyMTAyNSwgMHgxNGEyMDAwNiwgMHgzMjcxZmZmZiwgCisweDk3YTIwMDEwLCAweDEyMTgyNywgMHg0MzEwMjQsIDB4YTdhMjAwMTAsIAorMHgzMjcxZmZmZiwgMHgyN2IyMDAxMCwgMHg4MDIxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgCisweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgCisweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDIzMDEwMjQsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MjMwMTAyNCwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDM0MTA4MDAwLCAKKzB4OTY0MjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmOCwgCisweDAsIDB4YzAwNGRiOSwgMHgwLCAweDhmYmYwMDMwLCAKKzB4OGZiZTAwMmMsIDB4OGZiNTAwMjgsIDB4OGZiMzAwMjQsIDB4OGZiMjAwMjAsIAorMHg4ZmIxMDAxYywgMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDM4LCAKKzB4MCwgMHgwLCAweDAsIDB4MjdiZGZmZTgsIAorMHhhZmJmMDAxMCwgMHg4ZWUzMDRiOCwgMHgyNDAyMDAwOCwgMHgxNDYyMDFlMCwgCisweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsIDB4MTQ0MDAwMDUsIAorMHgwLCAweGMwMDNkYWYsIDB4OGY4NDAyMjQsIDB4MTAwMDAxZDgsIAorMHgwLCAweDhmODIwMjIwLCAweDNjMDMwMDA4LCAweDQzMTAyNCwgCisweDEwNDAwMDI2LCAweDI0MDIwMDAxLCAweDhmODQwMjI0LCAweDhmODIwMjIwLCAKKzB4M2MwMzA0MDAsIDB4NDMxMDI0LCAweDEwNDAwMDA2LCAweDAsIAorMHgzYzAxMDAwMiwgMHhhYzIwOGZhMCwgMHgzYzAxMDAwMiwgMHgxMDAwMDAwYiwgCisweGFjMjA4ZmMwLCAweDNjMDMwMDAyLCAweDI0NjM4ZmEwLCAweDhjNjIwMDAwLCAKKzB4MjQ0MjAwMDEsIDB4YWM2MjAwMDAsIDB4MmM0MjAwMDIsIDB4MTQ0MDAwMDMsIAorMHgyNDAyMDAwMSwgMHgzYzAxMDAwMiwgMHhhYzIyOGZjMCwgMHgzYzAyMDAwMiwgCisweDhjNDI4ZmMwLCAweDEwNDAwMDA2LCAweDMwODIwMDQwLCAweDEwNDAwMDA0LCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDIsIDB4MTAwMDAwMDMsIDB4YWMyMjhmYzQsIAorMHgzYzAxMDAwMiwgMHhhYzIwOGZjNCwgMHgzYzAxMDAwMiwgMHhhYzI0OGY5YywgCisweDNjMDEwMDAyLCAweDEwMDAwMDBiLCAweGFjMjA4ZmQwLCAweDNjMDEwMDAyLCAKKzB4YWMyMjhmZDAsIDB4M2MwMTAwMDIsIDB4YWMyMDhmYzAsIDB4M2MwMTAwMDIsIAorMHhhYzIwOGZhMCwgMHgzYzAxMDAwMiwgMHhhYzIwOGZjNCwgMHgzYzAxMDAwMiwgCisweGFjMjA4ZjljLCAweDNjMDMwMDAyLCAweDhjNjM4ZjkwLCAweDNjMDIwMDAyLCAKKzB4OGM0MjhmOTQsIDB4NTA2MjAwMDQsIDB4MjQ2M2ZmZmYsIDB4M2MwMTAwMDIsIAorMHhhYzIzOGY5NCwgMHgyNDYzZmZmZiwgMHgyYzYyMDAwZSwgMHgxMDQwMDE5NCwgCisweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNmMwMCwgCisweDQwMDAwOCwgMHgwLCAweDI0MDIwMDAyLCAweDNjMDEwMDAyLCAKKzB4YWMyMDhmYzAsIDB4M2MwMTAwMDIsIDB4YWMyMDhmYTAsIDB4M2MwMTAwMDIsIAorMHhhYzIwOGY5YywgMHgzYzAxMDAwMiwgMHhhYzIwOGZjNCwgMHgzYzAxMDAwMiwgCisweGFjMjA4ZmI4LCAweDNjMDEwMDAyLCAweGFjMjA4ZmIwLCAweGFmODAwMjI0LCAKKzB4M2MwMTAwMDIsIDB4YWMyMjhmOTAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZDAsIAorMHgxNDQwMDA0ZiwgMHgzYzAyZmRmZiwgMHgzNDQyZmZmZiwgMHhjMDAzZGFmLCAKKzB4MjgyYTAyNCwgMHhhZjgwMDIwNCwgMHg4ZjgyMDIwMCwgMHgyNDAzZmZmZCwgCisweDQzMTAyNCwgMHhhZjgyMDIwMCwgMHgzYzAxMDAwMiwgMHhhYzIwOGZlMCwgCisweDhmODMwMDU0LCAweDNjMDIwMDAyLCAweDhjNDI4ZmI4LCAweDI0MDQwMDAxLCAKKzB4M2MwMTAwMDIsIDB4YWMyNDhmY2MsIDB4MjQ0MjAwMDEsIDB4M2MwMTAwMDIsIAorMHhhYzIyOGZiOCwgMHgyYzQyMDAwNCwgMHgzYzAxMDAwMiwgMHhhYzIzOGZiNCwgCisweDE0NDAwMDA2LCAweDI0MDIwMDAzLCAweDNjMDEwMDAxLCAweGFjMjQ2ZDljLCAKKzB4M2MwMTAwMDIsIDB4MTAwMDAxNWUsIDB4YWMyMDhmYjgsIDB4M2MwMTAwMDIsIAorMHgxMDAwMDE1YiwgMHhhYzIyOGY5MCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMiwgCisweDhjNDI4ZmI0LCAweDI0NjNkOGYwLCAweDQzMTAyMywgMHgyYzQyMjcxMCwgCisweDE0NDAwMDAzLCAweDI0MDIwMDA0LCAweDNjMDEwMDAyLCAweGFjMjI4ZjkwLCAKKzB4M2MwMjAwMDIsIDB4OGM0MjhmZDAsIDB4MTQ0MDAwMjEsIDB4M2MwMmZkZmYsIAorMHgzNDQyZmZmZiwgMHgxMDAwMDE0YSwgMHgyODJhMDI0LCAweDNjMDQwMDAxLCAKKzB4OGM4NDZmMjAsIDB4M2MwMTAwMDIsIDB4YzAwNTA4NCwgMHhhYzIwOGZhOCwgCisweDNjMDIwMDAyLCAweDhjNDI4ZmRjLCAweGFmODIwMjA0LCAweDNjMDIwMDAyLCAKKzB4OGM0MjhmZDAsIDB4MTQ0MDAwMTIsIDB4M2MwM2ZkZmYsIDB4OGY4MjAyMDQsIAorMHgzNDYzZmZmZiwgMHgzMDQyMDAzMCwgMHgxNDQwMDEyZiwgMHgyODNhMDI0LCAKKzB4M2MwMzAwMDIsIDB4OGM2MzhmZGMsIDB4MjQwMjAwMDUsIDB4M2MwMTAwMDIsIAorMHhhYzIyOGY5MCwgMHgzYzAxMDAwMiwgMHgxMDAwMDEzMSwgMHhhYzIzOGZlMCwgCisweDNjMDIwMDAyLCAweDhjNDI4ZmQwLCAweDEwNDAwMDEwLCAweDNjMDJmZGZmLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZlM2MsIDB4MjQ0MjAwMDEsIDB4M2MwMTAwMDEsIAorMHhhYzIyNmUzYywgMHgyYzQyMDAwMiwgMHgxNDQwMDEyNSwgMHgyNDAyMDAwMSwgCisweDNjMDEwMDAxLCAweGFjMjI2ZTQ0LCAweDNjMDEwMDAxLCAweGFjMjA2ZTNjLCAKKzB4M2MwMTAwMDEsIDB4MTAwMDAxMWUsIDB4YWMyMjZkOWMsIDB4M2MwMzAwMDIsIAorMHg4YzYzOGZjMCwgMHgzNDQyZmZmZiwgMHgxMDYwMDExOSwgMHgyODJhMDI0LCAKKzB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsIDB4MTA0MDAxMTUsIDB4MCwgCisweDNjMDEwMDAyLCAweGFjMjI4ZmM4LCAweDI0MDIwMDAzLCAweDNjMDEwMDAyLCAKKzB4YWMyMjhmYTAsIDB4MTAwMDAwYjgsIDB4MjQwMjAwMDYsIDB4M2MwMTAwMDIsIAorMHhhYzIwOGZhOCwgMHg4ZjgyMDIwNCwgMHgzNDQyMDA0MCwgMHhhZjgyMDIwNCwgCisweDNjMDIwMDAyLCAweDhjNDI4ZmUwLCAweDI0MDMwMDA3LCAweDNjMDEwMDAyLCAKKzB4YWMyMzhmOTAsIDB4MzQ0MjAwNDAsIDB4M2MwMTAwMDIsIDB4YWMyMjhmZTAsIAorMHgzYzAyMDAwMiwgMHg4YzQyOGZjMCwgMHgxMDQwMDAwNSwgMHgwLCAKKzB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsIDB4MTA0MDAwZjAsIDB4MjQwMjAwMDIsIAorMHgzYzA1MDAwMiwgMHgyNGE1OGZhMCwgMHg4Y2EyMDAwMCwgMHgyYzQyNGUyMSwgCisweDEwNDAwMGVhLCAweDI0MDIwMDAyLCAweDNjMDIwMDAyLCAweDhjNDI4ZmM0LCAKKzB4MTA0MDAwZWYsIDB4MjQwNGZmYmYsIDB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsIAorMHgzYzAzMDAwMiwgMHg4YzYzOGZjOCwgMHg0NDEwMjQsIDB4NjQxODI0LCAKKzB4MTA0MzAwMDQsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDIsIDB4MTAwMDAwZTQsIAorMHhhYzIyOGY5MCwgMHgyNDAyMDAwMywgMHhhY2EyMDAwMCwgMHgyNDAyMDAwOCwgCisweDNjMDEwMDAyLCAweGFjMjI4ZjkwLCAweDNjMDIwMDAyLCAweDhjNDI4ZmNjLCAKKzB4MTA0MDAwMGMsIDB4MjQwMjAwMDEsIDB4M2MwNDAwMDIsIDB4YzAwNTA5MSwgCisweDhjODQ4ZjljLCAweDNjMDIwMDAyLCAweDhjNDI4ZmU4LCAweDE0NDAwMDA1LCAKKzB4MjQwMjAwMDEsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZTQsIDB4MTA0MDAwMDYsIAorMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5YywgMHgzYzAxMDAwMiwgCisweDEwMDAwMGNiLCAweGFjMjA4ZmI4LCAweDNjMDIwMDAyLCAweDhjNDI4ZmIwLCAKKzB4M2MwMzAwMDIsIDB4OGM2MzhmOWMsIDB4MmM0MjAwMDEsIDB4MjEwYzAsIAorMHgzMDYzMDAwOCwgMHgzYzAxMDAwMiwgMHhhYzIyOGZiMCwgMHgzYzAxMDAwMiwgCisweGFjMjM4ZmFjLCAweDhmODMwMDU0LCAweDI0MDIwMDA5LCAweDNjMDEwMDAyLCAKKzB4YWMyMjhmOTAsIDB4M2MwMTAwMDIsIDB4MTAwMDAwYjksIDB4YWMyMzhmYjQsIAorMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMiwgMHg4YzQyOGZiNCwgMHgyNDYzZDhmMCwgCisweDQzMTAyMywgMHgyYzQyMjcxMCwgMHgxNDQwMDA5ZiwgMHgwLCAKKzB4M2MwMjAwMDIsIDB4OGM0MjhmYzAsIDB4MTA0MDAwMDUsIDB4MCwgCisweDNjMDIwMDAyLCAweDhjNDI4ZjljLCAweDEwNDAwMGEwLCAweDI0MDIwMDAyLCAKKzB4M2MwMzAwMDIsIDB4MjQ2MzhmYTAsIDB4OGM2MjAwMDAsIDB4MmM0MjRlMjEsIAorMHgxMDQwMDA5YSwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMiwgMHg4YzQyOGZjYywgCisweDEwNDAwMDBlLCAweDAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsIAorMHgzYzAxMDAwMiwgMHhhYzIwOGZjYywgMHgzMDQyMDA4MCwgMHgxMDQwMDAyZiwgCisweDI0MDIwMDBjLCAweDhmODIwMjA0LCAweDMwNDIwMDgwLCAweDE0NDAwMDBjLCAKKzB4MjQwMjAwMDMsIDB4MTAwMDAwMjksIDB4MjQwMjAwMGMsIDB4M2MwMjAwMDIsIAorMHg4YzQyOGY5YywgMHgzMDQyMDA4MCwgMHgxNDQwMDAwNSwgMHgyNDAyMDAwMywgCisweDhmODIwMjA0LCAweDMwNDIwMDgwLCAweDEwNDAwMDFmLCAweDI0MDIwMDAzLCAKKzB4YWM2MjAwMDAsIDB4MjQwMjAwMGEsIDB4M2MwMTAwMDIsIDB4YWMyMjhmOTAsIAorMHgzYzA0MDAwMiwgMHgyNDg0OGZkOCwgMHg4YzgyMDAwMCwgMHgzYzAzMDAwMiwgCisweDhjNjM4ZmIwLCAweDQzMTAyNSwgMHhhZjgyMDIwNCwgMHg4YzgzMDAwMCwgCisweDNjMDQwMDAyLCAweDhjODQ4ZmIwLCAweDI0MDIwMDBiLCAweDNjMDEwMDAyLCAKKzB4YWMyMjhmOTAsIDB4NjQxODI1LCAweDNjMDEwMDAyLCAweGFjMjM4ZmUwLCAKKzB4M2MwNTAwMDIsIDB4MjRhNThmYTAsIDB4OGNhMjAwMDAsIDB4MmM0MjRlMjEsIAorMHgxMDQwMDA2NiwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMiwgMHg4YzQyOGZkMCwgCisweDEwNDAwMDA1LCAweDAsIDB4MjQwMjAwMGMsIDB4M2MwMTAwMDIsIAorMHgxMDAwMDA2NywgMHhhYzIyOGY5MCwgMHgzYzAyMDAwMiwgMHg4YzQyOGZjMCwgCisweDEwNDAwMDYzLCAweDAsIDB4M2MwNDAwMDIsIDB4OGM4NDhmOWMsIAorMHgxMDgwMDA1NSwgMHgzMDgyMDAwOCwgMHgzYzAzMDAwMiwgMHg4YzYzOGZhYywgCisweDEwNjIwMDViLCAweDI0MDIwMDAzLCAweDNjMDEwMDAyLCAweGFjMjQ4ZmM4LCAKKzB4YWNhMjAwMDAsIDB4MjQwMjAwMDYsIDB4M2MwMTAwMDIsIDB4MTAwMDAwNTQsIAorMHhhYzIyOGY5MCwgMHg4ZjgyMDIwMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIwMCwgCisweDhmODMwMDU0LCAweDI0MDIwMDBkLCAweDNjMDEwMDAyLCAweGFjMjI4ZjkwLCAKKzB4M2MwMTAwMDIsIDB4YWMyMzhmYjQsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDIsIAorMHg4YzQyOGZiNCwgMHgyNDYzZDhmMCwgMHg0MzEwMjMsIDB4MmM0MjI3MTAsIAorMHgxNDQwMDAzMSwgMHgwLCAweDNjMDIwMDAyLCAweDhjNDI4ZmQwLCAKKzB4MTA0MDAwMjAsIDB4MjQwMjAwMGUsIDB4M2MwMzAwMDIsIDB4OGM2MzhmZTQsIAorMHgzYzAxMDAwMiwgMHgxNDYwMDAxNSwgMHhhYzIyOGY5MCwgMHhjMDAzZTZkLCAKKzB4MCwgMHgzYzA1MDAwMSwgMHg4Y2E1NmQ5OCwgMHhjMDA1MjliLCAKKzB4MjAyMSwgMHgzYzAzMDAwMSwgMHg4YzYzNmQ5OCwgMHgyNDAyMDAwNCwgCisweDE0NjIwMDA1LCAweDI0MDNmZmZiLCAweDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAKKzB4MTAwMDAwMDMsIDB4MjQwM2ZmZjcsIDB4M2MwMjAwMDEsIDB4OGM0MjZkOTQsIAorMHg0MzEwMjQsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTQsIDB4OGY4MzAyMjQsIAorMHgzYzAyMDIwMCwgMHgzYzAxMDAwMiwgMHhhYzIzOGZlYywgMHgxMDAwMDAyMCwgCisweDI4MmEwMjUsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYzAsIDB4MTA0MDAwMDUsIAorMHgwLCAweDNjMDIwMDAyLCAweDhjNDI4ZjljLCAweDEwNDAwMDBmLCAKKzB4MjQwMjAwMDIsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYTAsIDB4MmM0MjRlMjEsIAorMHgxMDQwMDAwYSwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMiwgMHg4YzQyOGZjMCwgCisweDEwNDAwMDBmLCAweDAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsIAorMHgxNDQwMDAwYiwgMHgwLCAweDI0MDIwMDAyLCAweDNjMDEwMDAyLCAKKzB4MTAwMDAwMDcsIDB4YWMyMjhmOTAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYzAsIAorMHgxMDQwMDAwMywgMHgwLCAweGMwMDNkYWYsIDB4MCwgCisweDhmODIwMjIwLCAweDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgCisweDhmYmYwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4M2MwMzAwMDIsIAorMHgyNDYzOGZlOCwgMHg4YzYyMDAwMCwgMHgxMDQwMDAwNSwgMHgzNDQyMjAwMCwgCisweDNjMDEwMDAyLCAweGFjMjI4ZmRjLCAweDEwMDAwMDAzLCAweGFjNjAwMDAwLCAKKzB4M2MwMTAwMDIsIDB4YWMyNDhmZGMsIDB4M2UwMDAwOCwgMHgwLCAKKzB4MjdiZGZmZTAsIDB4MzA4MjAwMzAsIDB4YWZiZjAwMTgsIDB4M2MwMTAwMDIsIAorMHhhYzIyOGZlNCwgMHgxNDQwMDA2NywgMHgzYzAyZmZmZiwgMHgzNDQyMWYwZSwgCisweDgyMTAyNCwgMHgxNDQwMDA2MSwgMHgyNDAyMDAzMCwgMHgzMDgyMjAwMCwgCisweDEwNDAwMDVkLCAweDMwODM4MDAwLCAweDMxYTAyLCAweDMwODIwMDAxLCAKKzB4MjEyMDAsIDB4M2MwNDAwMDEsIDB4OGM4NDZmMjAsIDB4NjIxODI1LCAKKzB4MzMxYzIsIDB4M2MwMzAwMDEsIDB4MjQ2MzZlNDgsIDB4MzA4MjgwMDAsIAorMHgyMTIwMiwgMHgzMDg0MDAwMSwgMHg0MjIwMCwgMHg0NDEwMjUsIAorMHgyMzljMiwgMHg2MTA4MCwgMHg0MzEwMjEsIDB4NDcxMDIxLCAKKzB4OTA0MzAwMDAsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMjUsIDB4MCwgCisweDEwNjAwMDA3LCAweDI0MDIwMDAyLCAweDEwNjIwMDEzLCAweDI0MDIwMDAzLCAKKzB4MTA2MjAwMmMsIDB4M2MwNTAwMGYsIDB4MTAwMDAwMzcsIDB4MCwgCisweDhmODIwMjAwLCAweDI0MDNmZWZmLCAweDQzMTAyNCwgMHhhZjgyMDIwMCwgCisweDhmODIwMjIwLCAweDNjMDNmZmZlLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgCisweGFmODIwMjIwLCAweDNjMDEwMDAyLCAweGFjMjA5MDA0LCAweDNjMDEwMDAyLCAKKzB4MTAwMDAwMzQsIDB4YWMyMDkwMGMsIDB4OGY4MjAyMDAsIDB4MzQ0MjAxMDAsIAorMHhhZjgyMDIwMCwgMHg4ZjgyMDIyMCwgMHgzYzAzZmZmZSwgMHgzNDYzZmZmZiwgCisweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHgyNDAyMDEwMCwgMHgzYzAxMDAwMiwgCisweGFjMjI5MDA0LCAweDNjMDEwMDAyLCAweDEwMDAwMDI2LCAweGFjMjA5MDBjLCAKKzB4OGY4MjAyMDAsIDB4MjQwM2ZlZmYsIDB4NDMxMDI0LCAweGFmODIwMjAwLCAKKzB4OGY4MjAyMjAsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAKKzB4M2MwMTAwMDIsIDB4YWMyMDkwMDQsIDB4M2MwMTAwMDIsIDB4MTAwMDAwMTksIAorMHhhYzIzOTAwYywgMHg4ZjgyMDIwMCwgMHgzNDQyMDEwMCwgMHhhZjgyMDIwMCwgCisweDhmODIwMjIwLCAweDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgCisweDI0MDIwMTAwLCAweDNjMDEwMDAyLCAweGFjMjI5MDA0LCAweDNjMDEwMDAyLCAKKzB4MTAwMDAwMGMsIDB4YWMyMzkwMGMsIDB4MzRhNWZmZmYsIDB4M2MwNDAwMDEsIAorMHgyNDg0NmMzOCwgMHhhZmEzMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAKKzB4MTAwMDAwMDQsIDB4MCwgMHgyNDAyMDAzMCwgMHgzYzAxMDAwMiwgCisweGFjMjI4ZmU4LCAweDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIAorMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZjOCwgCisweGFmYjIwMDI4LCAweDgwOTAyMSwgMHhhZmIzMDAyYywgMHhhMDk4MjEsIAorMHhhZmIwMDAyMCwgMHhjMDgwMjEsIDB4M2MwNDAwMDEsIDB4MjQ4NDZjNTAsIAorMHgzYzA1MDAwOSwgMHgzYzAyMDAwMSwgMHg4YzQyNmQ5OCwgMHgzNGE1OTAwMSwgCisweDI0MDMwMjEsIDB4MjYwMzgyMSwgMHhhZmJmMDAzMCwgMHhhZmIxMDAyNCwgCisweGE3YTAwMDFhLCAweGFmYjAwMDE0LCAweGMwMDJiM2IsIDB4YWZhMjAwMTAsIAorMHgyNDAyMDAwMiwgMHgxMjYyMDA4MywgMHgyZTYyMDAwMywgMHgxMDQwMDAwNSwgCisweDI0MDIwMDAxLCAweDEyNjIwMDBhLCAweDAsIDB4MTAwMDAxNzMsIAorMHgwLCAweDI0MDIwMDA0LCAweDEyNjIwMGY4LCAweDI0MDIwMDA4LCAKKzB4MTI2MjAwZjcsIDB4M2MwMmZmZWMsIDB4MTAwMDAxNmMsIDB4MCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDMwNDIwMDAyLCAweDE0NDAwMDA0LCAKKzB4MTI4OTQwLCAweDNjMDJmZmZiLCAweDM0NDJmZmZmLCAweDIwMjgwMjQsIAorMHgzYzAxMDAwMiwgMHgzMTA4MjEsIDB4YWMzMDhmZmMsIDB4M2MwMjQwMDAsIAorMHgyMDIxMDI0LCAweDEwNDAwMDRlLCAweDEwMjNjMiwgMHgzMDg0MDAzMCwgCisweDEwMTM4MiwgMHgzMDQyMDAxYywgMHgzYzAzMDAwMSwgMHgyNDYzNmRkOCwgCisweDQzMTAyMSwgMHg4MjM4MjEsIDB4M2MwMjAwMjAsIDB4MjAyMTAyNCwgCisweDEwNDAwMDA2LCAweDI0MDIwMTAwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwgCisweGFjMjI5MDAwLCAweDEwMDAwMDA1LCAweDNjMDIwMDgwLCAweDNjMDEwMDAyLCAKKzB4MzEwODIxLCAweGFjMjA5MDAwLCAweDNjMDIwMDgwLCAweDIwMjEwMjQsIAorMHgxMDQwMDAwNiwgMHgxMjE5NDAsIDB4M2MwMjAwMDEsIDB4M2MwMTAwMDIsIAorMHgyMzA4MjEsIDB4MTAwMDAwMDUsIDB4YWMyMjkwMDgsIDB4MTIxMTQwLCAKKzB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDA4LCAweDk0ZTQwMDAwLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsIDB4MjQwMjAwMDUsIDB4MTA2MjAwMTAsIAorMHhhN2E0MDAxOCwgMHgzMjAyNDAwMCwgMHgxMDQwMDAwMiwgMHgzNDgyNDAwMCwgCisweGE3YTIwMDE4LCAweDI0MDQwMDAxLCAweDk0ZTIwMDAyLCAweDI0MDUwMDA0LCAKKzB4MjRlNjAwMDIsIDB4MzQ0MjAwMDEsIDB4YzAwNDViZSwgMHhhNGUyMDAwMiwgCisweDI0MDQwMDAxLCAweDI4MjEsIDB4YzAwNDViZSwgMHgyN2E2MDAxOCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDk4LCAweDI0MTEwMDAxLCAweDNjMDEwMDAxLCAKKzB4YWMzMTZkYTQsIDB4MTQ1MzAwMDQsIDB4MzIwMjgwMDAsIDB4YzAwM2RhZiwgCisweDAsIDB4MzIwMjgwMDAsIDB4MTA0MDAxMWMsIDB4MCwgCisweGMwMDNkYWYsIDB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgCisweDI0MDIwMDA1LCAweDEwNjIwMTE1LCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLCAKKzB4YWMzMTZkOWMsIDB4M2MwMTAwMDEsIDB4MTAwMDAxMTAsIDB4YWMyMjZkOTgsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAwNCwgMHgyN2IwMDAxYSwgMHhjMDA0NWJlLCAKKzB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyODIxLCAweGMwMDQ1YmUsIAorMHgyMDAzMDIxLCAweDNjMDIwMDAyLCAweDUxMTAyMSwgMHg4YzQyOGZmNCwgCisweDNjMDQwMDAxLCAweDhjODQ2ZDk4LCAweDNjMDNiZmZmLCAweDM0NjNmZmZmLCAKKzB4M2MwMTAwMDEsIDB4YWMzMzZkYTQsIDB4NDMxMDI0LCAweDNjMDEwMDAyLCAKKzB4MzEwODIxLCAweDEwOTMwMGY3LCAweGFjMjI4ZmY0LCAweDEwMDAwMGY3LCAKKzB4MCwgMHgzYzAyMjAwMCwgMHgyMDIxMDI0LCAweDEwNDAwMDA1LCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMWMsIDB4MTAwMDAwMDQsIAorMHgxMjg5NDAsIDB4M2MwMTAwMDEsIDB4YWMyMDZmMWMsIDB4MTI4OTQwLCAKKzB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMzA4ZmY4LCAweDNjMDI0MDAwLCAKKzB4MjAyMTAyNCwgMHgxNDQwMDAxNCwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjZmMWMsIDB4MTA0MDAwMDYsIDB4MjQwNDAwMDQsIDB4MjQwNTAwMDEsIAorMHhjMDA0ZGRiLCAweDI0MDYyMDAwLCAweDI0MDIwMDAxLCAweGFlZTIwNGI4LCAKKzB4M2MwMjAwMDIsIDB4NTExMDIxLCAweDhjNDI4ZmYwLCAweDNjMDNiZmZmLCAKKzB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweDNjMDEwMDAyLCAweDMxMDgyMSwgCisweDEwMDAwMGQwLCAweGFjMjI4ZmYwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjFjLCAKKzB4MTA0MDAwMjgsIDB4M2MwMzAwYTAsIDB4MjAzMTAyNCwgMHg1NDQzMDAwZCwgCisweDNjMDIwMDIwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjIwLCAweDI0MDMwMTAwLCAKKzB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMjM5MDA0LCAweDNjMDMwMDAxLCAKKzB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMjM5MDBjLCAweDEwMDAwMDE1LCAKKzB4MzQ0MjA0MDAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwOCwgMHgyNDAzMDEwMCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZjIwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwgCisweGFjMjM5MDA0LCAweDEwMDAwMDBiLCAweDM0NDIwODAwLCAweDNjMDIwMDgwLCAKKzB4MjAyMTAyNCwgMHgxMDQwMDAyZSwgMHgzYzAzMDAwMSwgMHgzYzAyMDAwMSwgCisweDhjNDI2ZjIwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwgMHhhYzIzOTAwYywgCisweDM0NDIwYzAwLCAweDNjMDEwMDAxLCAweGFjMjI2ZjIwLCAweDEwMDAwMDI1LCAKKzB4MjQwNDAwMDEsIDB4M2MwMjAwMjAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwNiwgCisweDI0MDIwMTAwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwgMHhhYzIyOTAwNCwgCisweDEwMDAwMDA1LCAweDNjMDIwMDgwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwgCisweGFjMjA5MDA0LCAweDNjMDIwMDgwLCAweDIwMjEwMjQsIDB4MTA0MDAwMDcsIAorMHgxMjE5NDAsIDB4M2MwMjAwMDEsIDB4M2MwMTAwMDIsIDB4MjMwODIxLCAKKzB4YWMyMjkwMGMsIDB4MTAwMDAwMDYsIDB4MjQwNDAwMDEsIDB4MTIxMTQwLCAKKzB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDBjLCAweDI0MDQwMDAxLCAKKzB4MjgyMSwgMHgyN2IwMDAxZSwgMHhjMDA0NTdjLCAweDIwMDMwMjEsIAorMHgyNDA0MDAwMSwgMHgyODIxLCAweGMwMDQ1N2MsIDB4MjAwMzAyMSwgCisweDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweDI3YjAwMDFjLCAweGMwMDQ1N2MsIAorMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweGMwMDQ1N2MsIAorMHgyMDAzMDIxLCAweDEwMDAwMDc3LCAweDAsIDB4M2MwMmZmZWMsIAorMHgzNDQyZmZmZiwgMHgyMDI4MDI0LCAweDNjMDIwMDA4LCAweDIwMjgwMjUsIAorMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMzA4ZmY4LCAKKzB4M2MwMjIwMDAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwOSwgMHgwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTQ0MDAwMDUsIDB4MjQwMjAwMDEsIAorMHgzYzAxMDAwMSwgMHhhYzIyNmYxYywgMHgxMDAwMDAwNCwgMHgzYzAyNDAwMCwgCisweDNjMDEwMDAxLCAweGFjMjA2ZjFjLCAweDNjMDI0MDAwLCAweDIwMjEwMjQsIAorMHgxNDQwMDAxZCwgMHgyNDAyMGUwMSwgMHgzYzAzMDAwMSwgMHg4YzYzNmYxYywgCisweGFmODIwMjM4LCAweDNjMDEwMDAxLCAweGFjMjA2ZGIwLCAweDEwNjAwMDA1LCAKKzB4MjQwMjIwMjAsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMjAsIDB4MjQwMjAwMDEsIAorMHhhZWUyMDRiOCwgMHgzYzA0YmZmZiwgMHgxMjE5NDAsIDB4M2MwMjAwMDIsIAorMHg0MzEwMjEsIDB4OGM0MjhmZjAsIDB4M2MwNTAwMDEsIDB4OGNhNTZkOTgsIAorMHgzNDg0ZmZmZiwgMHg0NDEwMjQsIDB4M2MwMTAwMDIsIDB4MjMwODIxLCAKKzB4YWMyMjhmZjAsIDB4MjQwMjAwMDEsIDB4MTBhMjAwNDQsIDB4MCwgCisweDEwMDAwMDQwLCAweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsIAorMHgxMDQwMDAxYywgMHgyNDAyMjAwMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmYyMCwgCisweDNjMDMwMGEwLCAweDIwMzEwMjQsIDB4MTQ0MzAwMDUsIDB4MTIxMTQwLCAKKzB4MzQwMmEwMDAsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMmQsIDB4YWMyMjZmMjAsIAorMHgzYzAzMDAwMiwgMHg2MjE4MjEsIDB4OGM2MzhmZjgsIDB4M2MwMjAwMjAsIAorMHg2MjEwMjQsIDB4MTA0MDAwMDQsIDB4MjQwMjIwMDEsIDB4M2MwMTAwMDEsIAorMHgxMDAwMDAyMywgMHhhYzIyNmYyMCwgMHgzYzAyMDA4MCwgMHg2MjEwMjQsIAorMHgxMDQwMDAxZiwgMHgzNDAyYTAwMSwgMHgzYzAxMDAwMSwgMHgxMDAwMDAxYywgCisweGFjMjI2ZjIwLCAweDNjMDIwMDIwLCAweDIwMjEwMjQsIDB4MTA0MDAwMDcsIAorMHgxMjE5NDAsIDB4MjQwMjAxMDAsIDB4M2MwMTAwMDIsIDB4MjMwODIxLCAKKzB4YWMyMjkwMDQsIDB4MTAwMDAwMDYsIDB4M2MwMjAwODAsIDB4MTIxMTQwLCAKKzB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDA0LCAweDNjMDIwMDgwLCAKKzB4MjAyMTAyNCwgMHgxMDQwMDAwNiwgMHgxMjE5NDAsIDB4M2MwMjAwMDEsIAorMHgzYzAxMDAwMiwgMHgyMzA4MjEsIDB4MTAwMDAwMDUsIDB4YWMyMjkwMGMsIAorMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDBjLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMDMsIAorMHgwLCAweGMwMDNkYWYsIDB4MCwgMHg4ZmJmMDAzMCwgCisweDhmYjMwMDJjLCAweDhmYjIwMDI4LCAweDhmYjEwMDI0LCAweDhmYjAwMDIwLCAKKzB4M2UwMDAwOCwgMHgyN2JkMDAzOCwgMHgyN2JkZmZiMCwgMHhhZmIzMDAzYywgCisweDk4MjEsIDB4YWZiNTAwNDAsIDB4YTgyMSwgMHhhZmIxMDAzNCwgCisweDg4MjEsIDB4MjQwMjAwMDIsIDB4YWZiZjAwNDgsIDB4YWZiZTAwNDQsIAorMHhhZmIyMDAzOCwgMHhhZmIwMDAzMCwgMHhhZmE0MDAyYywgMHhhN2EwMDAxYSwgCisweGE3YTAwMDE4LCAweGE3YTAwMDIwLCAweGE3YTAwMDFlLCAweGE3YTAwMDIyLCAKKzB4MTBhMjAxMzAsIDB4YTdhMDAwMWMsIDB4MmNhMjAwMDMsIDB4MTA0MDAwMDUsIAorMHgyNDAyMDAwMSwgMHgxMGEyMDAwYSwgMHgzYzAyNDAwMCwgMHgxMDAwMDI1ZCwgCisweDIyMDEwMjEsIDB4MjQwMjAwMDQsIDB4MTBhMjAyMGEsIDB4MjQwMjAwMDgsIAorMHgxMGEyMDIwOCwgMHgyMjAxMDIxLCAweDEwMDAwMjU2LCAweDAsIAorMHg4ZmE4MDAyYywgMHg4ODE0MCwgMHgzYzAzMDAwMiwgMHg3MDE4MjEsIAorMHg4YzYzOGZmYywgMHg2MjEwMjQsIDB4MTQ0MDAwMDksIDB4MjQwNDAwMDEsIAorMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwgMHg2Mjg4MjQsIDB4M2MwMTAwMDIsIAorMHgzMDA4MjEsIDB4YWMzMThmZjQsIDB4MTAwMDAyNDYsIDB4MjIwMTAyMSwgCisweDI0MDUwMDAxLCAweGMwMDQ1N2MsIDB4MjdhNjAwMTgsIDB4MjQwNDAwMDEsIAorMHgyNDA1MDAwMSwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LCAweDk3YTIwMDE4LCAKKzB4MzA0MjAwMDQsIDB4MTA0MDAwZDksIDB4M2MxMTQwMDAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNmY0MCwgMHgyNDQzZmZmZiwgMHgyYzYyMDAwNiwgMHgxMDQwMDBkOSwgCisweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNmM2OCwgCisweDQwMDAwOCwgMHgwLCAweDI0MDQwMDAxLCAweDI0MDUwMDExLCAKKzB4MjdiMDAwMWEsIDB4YzAwNDU3YywgMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAKKzB4MjQwNTAwMTEsIDB4YzAwNDU3YywgMHgyMDAzMDIxLCAweDk3YTMwMDFhLCAKKzB4MzA2MjQwMDAsIDB4MTA0MDAwMDIsIDB4M2MxNTAwMTAsIDB4M2MxNTAwMDgsIAorMHgzMDYyODAwMCwgMHgxMDQwMDBhYSwgMHgzYzEzMDAwMSwgMHgxMDAwMDBhOCwgCisweDNjMTMwMDAyLCAweDI0MDQwMDAxLCAweDI0MDUwMDE0LCAweDI3YjAwMDFhLCAKKzB4YzAwNDU3YywgMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDE0LCAKKzB4YzAwNDU3YywgMHgyMDAzMDIxLCAweDk3YTMwMDFhLCAweDMwNjIxMDAwLCAKKzB4MTA0MDAwMDIsIDB4M2MxNTAwMTAsIDB4M2MxNTAwMDgsIDB4MzA2MjA4MDAsIAorMHgxMDQwMDA5NywgMHgzYzEzMDAwMSwgMHgxMDAwMDA5NSwgMHgzYzEzMDAwMiwgCisweDI0MDQwMDAxLCAweDI0MDUwMDE5LCAweDI3YjAwMDFjLCAweGMwMDQ1N2MsIAorMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDE5LCAweGMwMDQ1N2MsIAorMHgyMDAzMDIxLCAweDk3YTIwMDFjLCAweDMwNDMwNzAwLCAweDI0MDIwNDAwLCAKKzB4MTA2MjAwMjcsIDB4Mjg2MjA0MDEsIDB4MTA0MDAwMGUsIDB4MjQwMjAyMDAsIAorMHgxMDYyMDAxZiwgMHgyODYyMDIwMSwgMHgxMDQwMDAwNSwgMHgyNDAyMDEwMCwgCisweDUwNjIwMDFlLCAweDNjMTMwMDAxLCAweDEwMDAwMDFlLCAweDI0MDQwMDAxLCAKKzB4MjQwMjAzMDAsIDB4NTA2MjAwMTksIDB4M2MxMzAwMDIsIDB4MTAwMDAwMTksIAorMHgyNDA0MDAwMSwgMHgyNDAyMDYwMCwgMHgxMDYyMDAwZCwgMHgyODYyMDYwMSwgCisweDEwNDAwMDA1LCAweDI0MDIwNTAwLCAweDUwNjIwMDBiLCAweDNjMTMwMDAyLCAKKzB4MTAwMDAwMTAsIDB4MjQwNDAwMDEsIDB4MjQwMjA3MDAsIDB4MTQ2MjAwMGQsIAorMHgyNDA0MDAwMSwgMHgzYzEzMDAwNCwgMHgxMDAwMDAwYSwgMHgzYzE1MDAwOCwgCisweDEwMDAwMDA2LCAweDNjMTMwMDA0LCAweDEwMDAwMDA1LCAweDNjMTUwMDA4LCAKKzB4M2MxMzAwMDEsIDB4MTAwMDAwMDIsIDB4M2MxNTAwMDgsIDB4M2MxNTAwMTAsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAxOCwgMHgyN2IwMDAxZSwgMHhjMDA0NTdjLCAKKzB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyNDA1MDAxOCwgMHhjMDA0NTdjLCAKKzB4MjAwMzAyMSwgMHg4ZmE4MDAyYywgMHg5N2E3MDAxZSwgMHg4MTE0MCwgCisweDNjMDYwMDAyLCAweGMyMzAyMSwgMHg4Y2M2OGZmNCwgMHg5N2EyMDAyMiwgCisweDNjMTAwMDAxLCAweDI2MTA2YzVjLCAweDIwMDIwMjEsIDB4YWZhMjAwMTAsIAorMHg5N2EyMDAxYywgMHgzYzA1MDAwYywgMHgzNGE1MDMwMywgMHhjMDAyYjNiLCAKKzB4YWZhMjAwMTQsIDB4M2MwMjAwMDQsIDB4MTY2MjAwMTAsIDB4M2MwMjAwMDEsIAorMHg4Zjg0MDA1NCwgMHgyNDAzMDAwMSwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMSwgCisweGFjMjM2ZDljLCAweDNjMDEwMDAxLCAweGFjMjI2ZDk4LCAweDNjMDEwMDAxLCAKKzB4YWMyMzZkYTQsIDB4M2MwMTAwMDEsIDB4YWMyMzZlMjQsIDB4M2MwMTAwMDEsIAorMHhhYzI0NmYzMCwgMHgxMDAwMDA0ZiwgMHgyYjM4ODI1LCAweDE2NjIwMDM5LCAKKzB4M2MwMjgwMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZlMjAsIDB4MTQ0MDAwMWUsIAorMHgyNDA0MDAxOCwgMHgyMDIxLCAweDI4MjEsIDB4YzAwNGRkYiwgCisweDM0MDY4MDAwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDJiMzg4MjUsIAorMHgxMDAwMDAwMiwgMHgyNDYzMDAzMiwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIAorMHgyYzQyMDAzMywgMHgxNDQwZmZmYywgMHgwLCAweDhmODMwMDU0LCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlMjAsIDB4M2MwMTAwMDEsIAorMHhhYzIyNmQ5YywgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5OCwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZGE0LCAweDNjMDEwMDAxLCAweGFjMjI2ZTI0LCAweDNjMDEwMDAxLCAKKzB4MTAwMDAwMmMsIDB4YWMyMzZmMzAsIDB4MjgyMSwgMHhjMDA0ZGRiLCAKKzB4MjQwNjA0MDQsIDB4MjAyMSwgMHgyNDA1MDAxZSwgMHgyN2E2MDAxOCwgCisweDI0MDIwMDAyLCAweGMwMDQ1YmUsIDB4YTdhMjAwMTgsIDB4MjAyMSwgCisweDI4MjEsIDB4MjdhNjAwMTgsIDB4YzAwNDViZSwgMHhhN2EwMDAxOCwgCisweDI0MDQwMDE4LCAweDI0MDUwMDAyLCAweGMwMDRkZGIsIDB4MjQwNjAwMDQsIAorMHgzYzAyODAwMCwgMHgyMjIxMDI1LCAweDJiMzE4MjUsIDB4MTAwMDAwMTUsIAorMHg0Mzg4MjUsIDB4MjIyMTAyNSwgMHgyNzUxODI1LCAweDQzODgyNSwgCisweDIwMDIwMjEsIDB4OTdhNjAwMWMsIDB4M2MwNzAwMDEsIDB4OGNlNzZkOTgsIAorMHgzYzA1MDAwYywgMHgzNGE1MDMyNiwgMHhhZmIzMDAxMCwgMHhjMDAyYjNiLCAKKzB4YWZiMTAwMTQsIDB4MTAwMDAwMDcsIDB4MCwgMHgzYzExMDAwMiwgCisweDIzMDg4MjEsIDB4OGUzMThmZmMsIDB4M2MwMjdmZmYsIDB4MzQ0MmZmZmYsIAorMHgyMjI4ODI0LCAweDNjMDIwMDAxLCAweDhjNDI2ZGE4LCAweDEwNDAwMDFlLCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywgMHgxMDQwMDAwMiwgCisweDNjMDIyMDAwLCAweDIyMjg4MjUsIDB4OGZhODAwMmMsIDB4ODExNDAsIAorMHgzYzAxMDAwMiwgMHgyMjA4MjEsIDB4OGMyMjkwMDAsIDB4MTA0MDAwMDMsIAorMHgzYzAyMDAyMCwgMHgxMDAwMDAwNSwgMHgyMjI4ODI1LCAweDNjMDJmZmRmLCAKKzB4MzQ0MmZmZmYsIDB4MjIyODgyNCwgMHg4ZmE4MDAyYywgMHg4MTE0MCwgCisweDNjMDEwMDAyLCAweDIyMDgyMSwgMHg4YzIyOTAwOCwgMHgxMDQwMDAwMywgCisweDNjMDIwMDgwLCAweDEwMDAwMDA0LCAweDIyMjg4MjUsIDB4M2MwMmZmN2YsIAorMHgzNDQyZmZmZiwgMHgyMjI4ODI0LCAweDhmYTgwMDJjLCAweDgxMTQwLCAKKzB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMzE4ZmY0LCAweDEwMDAwMTM1LCAKKzB4MjIwMTAyMSwgMHg4ZmE4MDAyYywgMHg4ZjE0MCwgMHgzYzAzMDAwMiwgCisweDdlMTgyMSwgMHg4YzYzOGZmOCwgMHgzYzAyNDAwMCwgMHg2MjEwMjQsIAorMHgxNDQwMDAwOSwgMHgyNDA0MDAwMSwgMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwgCisweDYyODgyNCwgMHgzYzAxMDAwMiwgMHgzZTA4MjEsIDB4YWMzMThmZjAsIAorMHgxMDAwMDEyNCwgMHgyMjAxMDIxLCAweDI4MjEsIDB4YzAwNDU3YywgCisweDI3YTYwMDE4LCAweDI0MDQwMDAxLCAweDI4MjEsIDB4YzAwNDU3YywgCisweDI3YTYwMDE4LCAweDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweDI3YjIwMDIwLCAKKzB4YzAwNDU3YywgMHgyNDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDAxLCAKKzB4YzAwNDU3YywgMHgyNDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDA0LCAKKzB4MjdiMTAwMWUsIDB4YzAwNDU3YywgMHgyMjAzMDIxLCAweDI0MDQwMDAxLCAKKzB4MjQwNTAwMDQsIDB4YzAwNDU3YywgMHgyMjAzMDIxLCAweDI0MDQwMDAxLCAKKzB4MjQwNTAwMDUsIDB4MjdiMDAwMjIsIDB4YzAwNDU3YywgMHgyMDAzMDIxLCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMDUsIDB4YzAwNDU3YywgMHgyMDAzMDIxLCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMTAsIDB4YzAwNDU3YywgMHgyN2E2MDAxOCwgCisweDI0MDQwMDAxLCAweDI0MDUwMDEwLCAweGMwMDQ1N2MsIDB4MjdhNjAwMTgsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAwYSwgMHhjMDA0NTdjLCAweDI0MDMwMjEsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAwYSwgMHhjMDA0NTdjLCAweDI0MDMwMjEsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAxOCwgMHhjMDA0NTdjLCAweDIyMDMwMjEsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAxOCwgMHhjMDA0NTdjLCAweDIyMDMwMjEsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsIDB4YzAwNDU3YywgMHgyN2E2MDAxOCwgCisweDk3YTIwMDE4LCAweDMwNDIwMDA0LCAweDEwNDAwMDY2LCAweDNjMTE0MDAwLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzZmMzQsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwNjcsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAxOSwgMHgyN2IwMDAxYywgMHhjMDA0NTdjLCAKKzB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyNDA1MDAxOSwgMHhjMDA0NTdjLCAKKzB4MjAwMzAyMSwgMHg5N2EyMDAxYywgMHgzMDQzMDcwMCwgMHgyNDAyMDQwMCwgCisweDEwNjIwMDI3LCAweDI4NjIwNDAxLCAweDEwNDAwMDBlLCAweDI0MDIwMjAwLCAKKzB4MTA2MjAwMWYsIDB4Mjg2MjAyMDEsIDB4MTA0MDAwMDUsIDB4MjQwMjAxMDAsIAorMHg1MDYyMDAxZSwgMHgzYzEzMDAwMSwgMHgxMDAwMDAxZSwgMHgzYzAyMDAwNCwgCisweDI0MDIwMzAwLCAweDUwNjIwMDE5LCAweDNjMTMwMDAyLCAweDEwMDAwMDE5LCAKKzB4M2MwMjAwMDQsIDB4MjQwMjA2MDAsIDB4MTA2MjAwMGQsIDB4Mjg2MjA2MDEsIAorMHgxMDQwMDAwNSwgMHgyNDAyMDUwMCwgMHg1MDYyMDAwYiwgMHgzYzEzMDAwMiwgCisweDEwMDAwMDEwLCAweDNjMDIwMDA0LCAweDI0MDIwNzAwLCAweDE0NjIwMDBkLCAKKzB4M2MwMjAwMDQsIDB4M2MxMzAwMDQsIDB4MTAwMDAwMGEsIDB4M2MxNTAwMDgsIAorMHgxMDAwMDAwNiwgMHgzYzEzMDAwNCwgMHgxMDAwMDAwNSwgMHgzYzE1MDAwOCwgCisweDNjMTMwMDAxLCAweDEwMDAwMDAyLCAweDNjMTUwMDA4LCAweDNjMTUwMDEwLCAKKzB4M2MwMjAwMDQsIDB4MTI2MjAwMTcsIDB4M2MwMjgwMDAsIDB4OGY4MjAwNTQsIAorMHgyNDEwMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzMwNmQ5YywgMHgzYzAxMDAwMSwgCisweGFjMzA2ZDk4LCAweDNjMDEwMDAxLCAweGFjMzA2ZGE0LCAweDNjMDEwMDAxLCAKKzB4YWMzMDZlMjQsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMzAsIDB4M2MwMjAwMDEsIAorMHgxNjYyMDAyMiwgMHgyNzU4ODI1LCAweDIwMjEsIDB4MjgyMSwgCisweGMwMDRkZGIsIDB4MzQwNjgwMDAsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMWIsIAorMHhhYzMwNmUyMCwgMHgyMjIxMDI1LCAweDJiMzE4MjUsIDB4NDM4ODI1LCAKKzB4OTdhNjAwMWMsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsIDB4M2MwNzAwMDEsIAorMHg4Y2U3NmQ5OCwgMHgzYzA0MDAwMSwgMHgyNDg0NmM1YywgMHhhZmEyMDAxMCwgCisweDk3YTIwMDFlLCAweDNjMDUwMDBjLCAweDM0YTUwMzIzLCAweDNjMDEwMDAxLCAKKzB4YWMyMDZlMjAsIDB4YzAwMmIzYiwgMHhhZmEyMDAxNCwgMHgxMDAwMDAwNywgCisweDAsIDB4M2MxMTAwMDIsIDB4MjNlODgyMSwgMHg4ZTMxOGZmMCwgCisweDNjMDI3ZmZmLCAweDM0NDJmZmZmLCAweDIyMjg4MjQsIDB4M2MwMjAwMDEsIAorMHg4YzQyNmRhOCwgMHgxMDQwMDA2OSwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjZmMWMsIDB4MTA0MDAwMDIsIDB4M2MwMjIwMDAsIDB4MjIyODgyNSwgCisweDhmYTgwMDJjLCAweDgxMTQwLCAweDNjMDEwMDAyLCAweDIyMDgyMSwgCisweDhjMjI5MDA0LCAweDEwNDAwMDAzLCAweDNjMDIwMDIwLCAweDEwMDAwMDA1LCAKKzB4MjIyODgyNSwgMHgzYzAyZmZkZiwgMHgzNDQyZmZmZiwgMHgyMjI4ODI0LCAKKzB4OGZhODAwMmMsIDB4ODExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAKKzB4OGMyMjkwMGMsIDB4MTA0MDAwMDMsIDB4M2MwMjAwODAsIDB4MTAwMDAwNGYsIAorMHgyMjI4ODI1LCAweDNjMDJmZjdmLCAweDM0NDJmZmZmLCAweDEwMDAwMDRiLCAKKzB4MjIyODgyNCwgMHg4ZmE4MDAyYywgMHg4Mjk0MCwgMHgzYzAzMDAwMiwgCisweDY1MTgyMSwgMHg4YzYzOGZmOCwgMHgzYzAyNDAwMCwgMHg2MjEwMjQsIAorMHgxNDQwMDAwOCwgMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwgMHg2Mjg4MjQsIAorMHgzYzAxMDAwMiwgMHgyNTA4MjEsIDB4YWMzMThmZjAsIDB4MTAwMDAwNDEsIAorMHgyMjAxMDIxLCAweDNjMDIwMDAxLCAweDhjNDI2ZGE4LCAweDEwNDAwMDM0LCAKKzB4M2MxMWMwMGMsIDB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4M2MwNGMwMGMsIAorMHgzNDg0MjAwMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmYxYywgMHgyMTAyYiwgCisweDIxMDIzLCAweDQ0MTAyNCwgMHgxMDYwMDAwMywgMHg1MTg4MjUsIAorMHgzYzAyMjAwMCwgMHgyMjI4ODI1LCAweDNjMDIwMDAyLCAweDQ1MTAyMSwgCisweDhjNDI5MDA0LCAweDEwNDAwMDAzLCAweDNjMDIwMDIwLCAweDEwMDAwMDA0LCAKKzB4MjIyODgyNSwgMHgzYzAyZmZkZiwgMHgzNDQyZmZmZiwgMHgyMjI4ODI0LCAKKzB4OGZhODAwMmMsIDB4ODExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAKKzB4OGMyMjkwMGMsIDB4MTA0MDAwMDMsIDB4M2MwMjAwODAsIDB4MTAwMDAwMDQsIAorMHgyMjI4ODI1LCAweDNjMDJmZjdmLCAweDM0NDJmZmZmLCAweDIyMjg4MjQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmUzMCwgMHgxMDQwMDAwMiwgMHgzYzAyMDgwMCwgCisweDIyMjg4MjUsIDB4M2MwMjAwMDEsIDB4OGM0MjZlMzQsIDB4MTA0MDAwMDIsIAorMHgzYzAyMDQwMCwgMHgyMjI4ODI1LCAweDNjMDIwMDAxLCAweDhjNDI2ZTM4LCAKKzB4MTA0MDAwMDYsIDB4M2MwMjAxMDAsIDB4MTAwMDAwMDQsIDB4MjIyODgyNSwgCisweDNjMDI3ZmZmLCAweDM0NDJmZmZmLCAweDYyODgyNCwgMHg4ZmE4MDAyYywgCisweDgxMTQwLCAweDNjMDEwMDAyLCAweDIyMDgyMSwgMHhhYzMxOGZmMCwgCisweDIyMDEwMjEsIDB4OGZiZjAwNDgsIDB4OGZiZTAwNDQsIDB4OGZiNTAwNDAsIAorMHg4ZmIzMDAzYywgMHg4ZmIyMDAzOCwgMHg4ZmIxMDAzNCwgMHg4ZmIwMDAzMCwgCisweDNlMDAwMDgsIDB4MjdiZDAwNTAsIDB4MjdiZGZmZDAsIDB4YWZiMjAwMjgsIAorMHg4MDkwMjEsIDB4YWZiZjAwMmMsIDB4YWZiMTAwMjQsIDB4YWZiMDAwMjAsIAorMHg4Zjg0MDIwMCwgMHgzYzEwMDAwMSwgMHg4ZTEwNmQ5OCwgMHg4Zjg2MDIyMCwgCisweDI0MDIwMDAyLCAweDEyMDIwMDVjLCAweDJlMDIwMDAzLCAweDEwNDAwMDA1LCAKKzB4MjQwMjAwMDEsIDB4MTIwMjAwMGEsIDB4MTIxOTQwLCAweDEwMDAwMTBjLCAKKzB4MCwgMHgyNDAyMDAwNCwgMHgxMjAyMDBiZiwgMHgyNDAyMDAwOCwgCisweDEyMDIwMGJlLCAweDEyODk0MCwgMHgxMDAwMDEwNSwgMHgwLCAKKzB4M2MwNTAwMDIsIDB4YTMyODIxLCAweDhjYTU4ZmZjLCAweDNjMTAwMDAyLCAKKzB4MjAzODAyMSwgMHg4ZTEwOGZmNCwgMHgzYzAyNDAwMCwgMHhhMjEwMjQsIAorMHgxMDQwMDAzOCwgMHgzYzAyMDAwOCwgMHgyMDIxMDI0LCAweDEwNDAwMDIwLCAKKzB4MzQ4NDAwMDIsIDB4M2MwMjAwMDIsIDB4NDMxMDIxLCAweDhjNDI5MDAwLCAKKzB4MTA0MDAwMDUsIDB4MzQ4NDAwMjAsIDB4MzQ4NDAxMDAsIDB4M2MwMjAwMjAsIAorMHgxMDAwMDAwNiwgMHgyMDI4MDI1LCAweDI0MDJmZWZmLCAweDgyMjAyNCwgCisweDNjMDJmZmRmLCAweDM0NDJmZmZmLCAweDIwMjgwMjQsIDB4MTIxMTQwLCAKKzB4M2MwMTAwMDIsIDB4MjIwODIxLCAweDhjMjI5MDA4LCAweDEwNDAwMDA1LCAKKzB4M2MwMjAwMDEsIDB4YzIzMDI1LCAweDNjMDIwMDgwLCAweDEwMDAwMDE2LCAKKzB4MjAyODAyNSwgMHgzYzAyZmZmZSwgMHgzNDQyZmZmZiwgMHhjMjMwMjQsIAorMHgzYzAyZmY3ZiwgMHgzNDQyZmZmZiwgMHgxMDAwMDAwZiwgMHgyMDI4MDI0LCAKKzB4MjQwMmZlZGYsIDB4ODIyMDI0LCAweDNjMDJmZmZlLCAweDM0NDJmZmZmLCAKKzB4YzIzMDI0LCAweDNjMDJmZjVmLCAweDM0NDJmZmZmLCAweDIwMjgwMjQsIAorMHgzYzAxMDAwMiwgMHgyMzA4MjEsIDB4YWMyMDkwMDAsIDB4M2MwMTAwMDIsIAorMHgyMzA4MjEsIDB4YWMyMDkwMDgsIDB4YWY4NDAyMDAsIDB4YWY4NjAyMjAsIAorMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgMHgxMDAwMDAwYSwgCisweDEyMTE0MCwgMHgzYzAyYmZmZiwgMHgzNDQyZmZmZiwgMHg4ZjgzMDIwMCwgCisweDIwMjgwMjQsIDB4MjQwMmZmZmQsIDB4NjIxODI0LCAweGMwMDNkYWYsIAorMHhhZjgzMDIwMCwgMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAKKzB4MTAwMDAwYjcsIDB4YWMzMDhmZjQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsIAorMHgxMDQwMDA2OSwgMHgyNDA1MDAwNCwgMHgyNDA0MDAwMSwgMHhjMDA0NTdjLCAKKzB4MjdhNjAwMTgsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMDUsIDB4YzAwNDU3YywgCisweDI3YTYwMDFhLCAweDk3YTMwMDE4LCAweDk3YTIwMDFhLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDZlNDgsIDB4MzA2MzBjMDAsIDB4MzFhODIsIDB4MzA0MjBjMDAsIAorMHgyMTI4MiwgMHhhN2EyMDAxYSwgMHgyMTA4MCwgMHg0NDEwMjEsIAorMHg0MzEwMjEsIDB4YTdhMzAwMTgsIDB4OTA0ODAwMDAsIDB4MjQwMjAwMDEsIAorMHgzMTAzZmZmZiwgMHgxMDYyMDAyOSwgMHgyODYyMDAwMiwgMHgxMDQwMDAwNSwgCisweDAsIDB4MTA2MDAwMDksIDB4MCwgMHgxMDAwMDAzZCwgCisweDAsIDB4MTA3MDAwMTMsIDB4MjQwMjAwMDMsIDB4MTA2MjAwMmMsIAorMHgwLCAweDEwMDAwMDM3LCAweDAsIDB4OGY4MjAyMDAsIAorMHgyNDAzZmVmZiwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsIAorMHgzYzAzZmZmZSwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsIAorMHgzYzAxMDAwMiwgMHhhYzIwOTAwNCwgMHgzYzAxMDAwMiwgMHgxMDAwMDAzMiwgCisweGFjMjA5MDBjLCAweDhmODIwMjAwLCAweDM0NDIwMTAwLCAweGFmODIwMjAwLCAKKzB4OGY4MjAyMjAsIDB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4YWY4MjAyMjAsIDB4MjQwMjAxMDAsIDB4M2MwMTAwMDIsIDB4YWMyMjkwMDQsIAorMHgzYzAxMDAwMiwgMHgxMDAwMDAyNCwgMHhhYzIwOTAwYywgMHg4ZjgyMDIwMCwgCisweDI0MDNmZWZmLCAweDQzMTAyNCwgMHhhZjgyMDIwMCwgMHg4ZjgyMDIyMCwgCisweDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgMHgzYzAxMDAwMiwgCisweGFjMjA5MDA0LCAweDNjMDEwMDAyLCAweDEwMDAwMDE3LCAweGFjMjM5MDBjLCAKKzB4OGY4MjAyMDAsIDB4MzQ0MjAxMDAsIDB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsIAorMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4MjQwMjAxMDAsIAorMHgzYzAxMDAwMiwgMHhhYzIyOTAwNCwgMHgzYzAxMDAwMiwgMHgxMDAwMDAwYSwgCisweGFjMjM5MDBjLCAweDNjMDQwMDAxLCAweDI0ODQ2YzgwLCAweDk3YTYwMDFhLCAKKzB4OTdhNzAwMTgsIDB4M2MwNTAwMDEsIDB4MzRhNWZmZmYsIDB4YWZhODAwMTAsIAorMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmODIwMjAwLCAweDM0NDIwMDAyLCAKKzB4MTAwMDAwNGIsIDB4YWY4MjAyMDAsIDB4MTI4OTQwLCAweDNjMDUwMDAyLCAKKzB4YjEyODIxLCAweDhjYTU4ZmY4LCAweDNjMTAwMDAyLCAweDIxMTgwMjEsIAorMHg4ZTEwOGZmMCwgMHgzYzAyNDAwMCwgMHhhMjEwMjQsIDB4MTQ0MDAwMTAsIAorMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjFjLCAweDE0NDAwMDA1LCAKKzB4M2MwMmJmZmYsIDB4OGY4MjAyMDAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMDAsIAorMHgzYzAyYmZmZiwgMHgzNDQyZmZmZiwgMHhjMDAzZGFmLCAweDIwMjgwMjQsIAorMHgzYzAxMDAwMiwgMHgzMTA4MjEsIDB4MTAwMDAwMzEsIDB4YWMzMDhmZjAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywgMHgxMDQwMDAwNSwgMHgzYzAyMDAyMCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZTQ0LCAweDEwNDAwMDI1LCAweDNjMDIwMDIwLCAKKzB4YTIxMDI0LCAweDEwNDAwMDA3LCAweDM0ODQwMDIwLCAweDI0MDIwMTAwLCAKKzB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMjI5MDA0LCAweDEwMDAwMDA2LCAKKzB4MzQ4NDAxMDAsIDB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMjA5MDA0LCAKKzB4MjQwMmZlZmYsIDB4ODIyMDI0LCAweDNjMDIwMDgwLCAweGEyMTAyNCwgCisweDEwNDAwMDA3LCAweDEyMTk0MCwgMHgzYzAyMDAwMSwgMHgzYzAxMDAwMiwgCisweDIzMDgyMSwgMHhhYzIyOTAwYywgMHgxMDAwMDAwOCwgMHhjMjMwMjUsIAorMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDBjLCAKKzB4M2MwMmZmZmUsIDB4MzQ0MmZmZmYsIDB4YzIzMDI0LCAweGFmODQwMjAwLCAKKzB4YWY4NjAyMjAsIDB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIAorMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMzA4ZmYwLCAKKzB4OGZiZjAwMmMsIDB4OGZiMjAwMjgsIDB4OGZiMTAwMjQsIDB4OGZiMDAwMjAsIAorMHgzZTAwMDA4LCAweDI3YmQwMDMwLCAweDAsIDB4MTgyMSwgCisweDMwODQwMGZmLCAweDI0MDVmZmRmLCAweDI0MDZmZmJmLCAweDY0MTAwNywgCisweDMwNDIwMDAxLCAweDEwNDAwMDA0LCAweDAsIDB4OGY4MjAwNDQsIAorMHgxMDAwMDAwMywgMHgzNDQyMDA0MCwgMHg4ZjgyMDA0NCwgMHg0NjEwMjQsIAorMHhhZjgyMDA0NCwgMHg4ZjgyMDA0NCwgMHgzNDQyMDAyMCwgMHhhZjgyMDA0NCwgCisweDhmODIwMDQ0LCAweDQ1MTAyNCwgMHhhZjgyMDA0NCwgMHgyNDYzMDAwMSwgCisweDI4NjIwMDA4LCAweDU0NDBmZmVlLCAweDY0MTAwNywgMHgzZTAwMDA4LCAKKzB4MCwgMHgyYzgyMDAwOCwgMHgxMDQwMDAxYiwgMHgwLCAKKzB4MjQwNWZmZGYsIDB4MjQwNmZmYmYsIDB4NDE4ODAsIDB4M2MwMjAwMDEsIAorMHgyNDQyNmU2MCwgMHg2MjE4MjEsIDB4MjQ2NDAwMDQsIDB4OTA2MjAwMDAsIAorMHgxMDQwMDAwNCwgMHgwLCAweDhmODIwMDQ0LCAweDEwMDAwMDAzLCAKKzB4MzQ0MjAwNDAsIDB4OGY4MjAwNDQsIDB4NDYxMDI0LCAweGFmODIwMDQ0LCAKKzB4OGY4MjAwNDQsIDB4MzQ0MjAwMjAsIDB4YWY4MjAwNDQsIDB4OGY4MjAwNDQsIAorMHg0NTEwMjQsIDB4YWY4MjAwNDQsIDB4MjQ2MzAwMDEsIDB4NjQxMDJiLCAKKzB4MTQ0MGZmZWUsIDB4MCwgMHgzZTAwMDA4LCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHg4Zjg0MDBjNCwgCisweDhmODYwMGUwLCAweDhmODcwMGU0LCAweDI0MDJmZmY4LCAweGMyMjgyNCwgCisweDEwZTUwMDFhLCAweDI3NjIzZmY4LCAweDE0ZTIwMDAyLCAweDI0ZTgwMDA4LCAKKzB4Mjc2ODMwMDAsIDB4NTUwNTAwMDQsIDB4OGQwYTAwMDAsIDB4MzBjMjAwMDQsIAorMHgxNDQwMDAxMiwgMHg4MDUwMjEsIDB4OGNlOTAwMDAsIDB4OGY0MjAxM2MsIAorMHgxNDk0ODIzLCAweDQ5MTgyYiwgMHg5NGViMDAwNiwgMHgxMDYwMDAwMiwgCisweDI1NjMwMDUwLCAweDQ5NDgyMSwgMHgxMjMxODJiLCAweDUwNDAwMDAzLCAKKzB4OGY0MjAxZmMsIDB4M2UwMDAwOCwgMHhlMDEwMjEsIDB4YWY4ODAwZTgsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDFmYywgMHhhZjg4MDBlNCwgMHgzZTAwMDA4LCAKKzB4MTAyMSwgMHgzZTAwMDA4LCAweDAsIDB4OGY4MzAwZTQsIAorMHgyNzYyM2ZmOCwgMHgxMDYyMDAwNCwgMHgyNDYyMDAwOCwgMHhhZjgyMDBlOCwgCisweDNlMDAwMDgsIDB4YWY4MjAwZTQsIDB4Mjc2MjMwMDAsIDB4YWY4MjAwZTgsIAorMHgzZTAwMDA4LCAweGFmODIwMGU0LCAweDNlMDAwMDgsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDhmODgwMTIwLCAKKzB4Mjc2MjRmZTAsIDB4OGY4MzAxMjgsIDB4MTUwMjAwMDIsIDB4MjUwOTAwMjAsIAorMHgyNzY5NDgwMCwgMHgxMTIzMDAxMiwgMHg4ZmEyMDAxMCwgMHhhZDA0MDAwMCwgCisweGFkMDUwMDA0LCAweGFkMDYwMDA4LCAweGE1MDcwMDBlLCAweDhmYTMwMDE0LCAKKzB4YWQwMjAwMTgsIDB4OGZhMjAwMTgsIDB4YWQwMzAwMWMsIDB4MjUwMzAwMTYsIAorMHhhZDAyMDAxMCwgMHhhZDAzMDAxNCwgMHhhZjg5MDEyMCwgMHg4ZjQzMDBmYywgCisweDI0MDIwMDAxLCAweDI0NjNmZmZmLCAweDNlMDAwMDgsIDB4YWY0MzAwZmMsIAorMHg4ZjQzMDMyNCwgMHgxMDIxLCAweDI0NjMwMDAxLCAweDNlMDAwMDgsIAorMHhhZjQzMDMyNCwgMHgzZTAwMDA4LCAweDAsIDB4OGY4ODAxMDAsIAorMHgyNzYyNDdlMCwgMHg4ZjgzMDEwOCwgMHgxNTAyMDAwMiwgMHgyNTA5MDAyMCwgCisweDI3Njk0MDAwLCAweDExMjMwMDBmLCAweDhmYTIwMDEwLCAweGFkMDQwMDAwLCAKKzB4YWQwNTAwMDQsIDB4YWQwNjAwMDgsIDB4YTUwNzAwMGUsIDB4OGZhMzAwMTQsIAorMHhhZDAyMDAxOCwgMHg4ZmEyMDAxOCwgMHhhZDAzMDAxYywgMHgyNTAzMDAxNiwgCisweGFkMDIwMDEwLCAweGFkMDMwMDE0LCAweGFmODkwMTAwLCAweDNlMDAwMDgsIAorMHgyNDAyMDAwMSwgMHg4ZjQzMDMyOCwgMHgxMDIxLCAweDI0NjMwMDAxLCAKKzB4M2UwMDAwOCwgMHhhZjQzMDMyOCwgMHgzZTAwMDA4LCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwIH07CitzdGF0aWMgdTMyIHRpZ29uMkZ3Um9kYXRhWyhNQVhfUk9EQVRBX0xFTi80KSArIDFdIF9faW5pdGRhdGEgPSB7CisweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLCAKKzB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsIAorMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwgCisweDZlMmY2Njc3LCAweDZkNjE2OTZlLCAweDJlNjMyYzc2LCAweDIwMzEyZTMxLCAKKzB4MmUzMjJlMzQsIDB4MzUyMDMxMzksIDB4MzkzOTJmMzAsIDB4MzEyZjMyMzQsIAorMHgyMDMwMzAzYSwgMHgzMTMwM2EzNSwgMHgzNTIwNzM2OCwgMHg3NTYxNmU2NywgCisweDIwNDU3ODcwLCAweDIwMjQwMDAwLCAweDY1NzY3NDUyLCAweDZlNjc0NjAwLCAKKzB4NTE2NTc2NzQsIDB4NDYwMDAwMDAsIDB4NTE2NTc2NzQsIDB4NTA1ZjQ2MDAsIAorMHg0ZDY1NzY3NCwgMHg1MjZlNjc0NiwgMHgwLCAweDRkNTE2NTc2LCAKKzB4NzQ0NjAwMDAsIDB4NGQ1MTY1NzYsIDB4NTA1ZjQ2MDAsIDB4NTE3MzQzNmYsIAorMHg2ZTQ5NWY0NiwgMHgwLCAweDUxNzM0MzZmLCAweDZlNzM0NjAwLCAKKzB4NTE3MjUwNzIsIDB4NmY2NDQ2MDAsIDB4NjI2MTY0NGQsIDB4NjU2ZDUzN2EsIAorMHgwLCAweDY4Nzc1NjY1LCAweDcyMDAwMDAwLCAweDYyNjE2NDQ4LCAKKzB4Nzc1NjY1NzIsIDB4MCwgMHgyYTJhNDQ0MSwgMHg1NzRlNWY0MSwgCisweDAsIDB4NzQ3ODUyNzgsIDB4NDI2NjUzN2EsIDB4MCwgCisweDYyNjY0MTc0LCAweDZlNGQ3MjZiLCAweDAsIDB4NzI2NTY0NWEsIAorMHg2ZjZlNjUzMSwgMHgwLCAweDcwNjM2OTQzLCAweDZmNmU2NjAwLCAKKzB4Njc2NTZlNDMsIDB4NmY2ZTY2MDAsIDB4MmE2NDZkNjEsIDB4NTI0NDY2NmMsIAorMHgwLCAweDJhNTA0MTRlLCAweDQ5NDMyYTAwLCAweDJlMmUyZjJlLCAKKzB4MmUyZjJlMmUsIDB4MmYyZTJlMmYsIDB4MmUyZTJmNzMsIDB4NzI2MzJmNmUsIAorMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwgMHg2ZTJmNjY3NywgCisweDZkNjE2OTZlLCAweDJlNjMwMDAwLCAweDcyNjM2MjQ2LCAweDZjNjE2NzczLCAKKzB4MCwgMHg2MjYxNjQ1MiwgMHg3ODUyNjM2MiwgMHgwLCAKKzB4Njc2YzZmNjIsIDB4NDY2YzY3NzMsIDB4MCwgMHgyYjVmNjQ2OSwgCisweDczNzA1ZjZjLCAweDZmNmY3MDAwLCAweDJiNjU3NjVmLCAweDY4NjE2ZTY0LCAKKzB4NmM2NTcyMDAsIDB4NjM2MTZlNzQsIDB4MzE0NDZkNjEsIDB4MCwgCisweDJiNzE1ZjY0LCAweDZkNjE1Zjc0LCAweDZmNWY2ZTY5LCAweDYzNWY2MzZiLCAKKzB4NzM3NTZkMDAsIDB4MmI2ODVmNzMsIDB4NjU2ZTY0NWYsIDB4NjQ2MTc0NjEsIAorMHg1ZjcyNjU2MSwgMHg2NDc5NWY2MywgMHg2YjczNzU2ZCwgMHgwLCAKKzB4MmI2ODVmNjQsIDB4NmQ2MTVmNzIsIDB4NjQ1ZjYxNzMsIDB4NzM2OTczNzQsIAorMHg1ZjYzNmI3MywgMHg3NTZkMDAwMCwgMHg3NDQzNmI3MywgMHg2ZDRmNmUwMCwgCisweDJiNzE1ZjY0LCAweDZkNjE1Zjc0LCAweDZmNWY2ZTY5LCAweDYzMDAwMDAwLCAKKzB4MmI2ODVmNzMsIDB4NjU2ZTY0NWYsIDB4NjQ2MTc0NjEsIDB4NWY3MjY1NjEsIAorMHg2NDc5MDAwMCwgMHgyYjY4NWY2NCwgMHg2ZDYxNWY3MiwgMHg2NDVmNjE3MywgCisweDczNjk3Mzc0LCAweDAsIDB4NzQ0MzZiNzMsIDB4NmQ0ZjY2NjYsIAorMHgwLCAweDJiNjg1ZjczLCAweDY1NmU2NDVmLCAweDYyNjQ1ZjcyLCAKKzB4NjU2MTY0NzksIDB4MCwgMHg2ODczNzQ1MywgMHg1MjY5NmU2NywgCisweDAsIDB4NjI2MTY0NTMsIDB4NTI2OTZlNjcsIDB4MCwgCisweDZlNjk2MzUzLCAweDUyNjk2ZTY3LCAweDAsIDB4Nzc0NDZkNjEsIAorMHg0MTZjNmM0MSwgMHgwLCAweDJiNzE1ZjY0LCAweDZkNjE1Zjc0LCAKKzB4NmY1ZjY4NmYsIDB4NzM3NDVmNjMsIDB4NmI3Mzc1NmQsIDB4MCwgCisweDJiNjg1ZjZkLCAweDYxNjM1ZjcyLCAweDc4NWY2MzZmLCAweDZkNzA1ZjYzLCAKKzB4NmI3Mzc1NmQsIDB4MCwgMHgyYjY4NWY2NCwgMHg2ZDYxNWY3NywgCisweDcyNWY2MTczLCAweDczNjk3Mzc0LCAweDVmNjM2YjczLCAweDc1NmQwMDAwLCAKKzB4NzI0MzZiNzMsIDB4NmQ0ZjZlMDAsIDB4MmI3MTVmNjQsIDB4NmQ2MTVmNzQsIAorMHg2ZjVmNjg2ZiwgMHg3Mzc0MDAwMCwgMHgyYjY4NWY2ZCwgMHg2MTYzNWY3MiwgCisweDc4NWY2MzZmLCAweDZkNzAwMDAwLCAweDJiNjg1ZjY0LCAweDZkNjE1Zjc3LCAKKzB4NzI1ZjYxNzMsIDB4NzM2OTczNzQsIDB4MCwgMHg3MjQzNmI3MywgCisweDZkNGY2NjY2LCAweDAsIDB4MmI2ODVmNzIsIDB4NjU2Mzc2NWYsIAorMHg2MjY0NWY3MiwgMHg2NTYxNjQ3OSwgMHgwLCAweDJiNjg1ZjcyLCAKKzB4NjU2Mzc2NWYsIDB4NmE3NTZkNjIsIDB4NmY1ZjYyNjQsIDB4NWY3MjY1NjEsIAorMHg2NDc5MDAwMCwgMHgyYjY4NWY3MiwgMHg2NTYzNzY1ZiwgMHg2ZDY5NmU2OSwgCisweDVmNjI2NDVmLCAweDcyNjU2MTY0LCAweDc5MDAwMDAwLCAweDJiNmQ2ODVmLCAKKzB4NjM2ZjZkNmQsIDB4NjE2ZTY0MDAsIDB4MmI2ODVmNzQsIDB4Njk2ZDY1NzIsIAorMHgwLCAweDJiNjg1ZjY0LCAweDZmNWY3NTcwLCAweDY0NjE3NDY1LCAKKzB4NWY3NDc4NWYsIDB4NjM2ZjZlNzMsIDB4MCwgMHgyYjY4NWY2NCwgCisweDZmNWY3NTcwLCAweDY0NjE3NDY1LCAweDVmNzI3ODVmLCAweDcwNzI2ZjY0LCAKKzB4MCwgMHgyYjYzNmI3MywgMHg3NTZkMzEzNiwgMHgwLCAKKzB4MmI3MDY1NjUsIDB4NmI1ZjZkNjEsIDB4NjM1ZjcyNzgsIDB4NWY3NzYxMDAsIAorMHgyYjcwNjU2NSwgMHg2YjVmNmQ2MSwgMHg2MzVmNzI3OCwgMHgwLCAKKzB4MmI2NDY1NzEsIDB4NWY2ZDYxNjMsIDB4NWY3Mjc4MDAsIDB4MmI2ODVmNmQsIAorMHg2MTYzNWY3MiwgMHg3ODVmNjE3NCwgMHg3NDZlMDAwMCwgMHg2MjYxNjQ1MiwgCisweDY1NzQ1MzdhLCAweDAsIDB4NzI3ODQyNjQsIDB4NDI2NjUzN2EsIAorMHgwLCAweDJiNmU3NTZjLCAweDZjNWY2ODYxLCAweDZlNjQ2YzY1LCAKKzB4NzIwMDAwMDAsIDB4NjY3NzRmNzAsIDB4NDY2MTY5NmMsIDB4MCwgCisweDJiNjg1Zjc1LCAweDcwNjQ2MTc0LCAweDY1NWY2YzY1LCAweDY0MzQwMDAwLCAKKzB4MmI2ODVmNzUsIDB4NzA2NDYxNzQsIDB4NjU1ZjZjNjUsIDB4NjQzNjAwMDAsIAorMHgyYjY4NWY3NSwgMHg3MDY0NjE3NCwgMHg2NTVmNmM2NSwgMHg2NDMyMDAwMCwgCisweDY5NmU3NDUzLCAweDc0NjE3NDY1LCAweDAsIDB4MmEyYTY5NmUsIAorMHg2OTc0NDM3MCwgMHgwLCAweDIzNzM2MzcyLCAweDY1NjE2ZDAwLCAKKzB4Njk1Mzc0NjEsIDB4NjM2YjQ1NzIsIDB4MCwgMHg3MDcyNmY2MiwgCisweDY1NGQ2NTZkLCAweDAsIDB4MmEyYTQ0NDEsIDB4NTc0ZTVmNDIsIAorMHgwLCAweDJiNzM3NzVmLCAweDY0NmQ2MTVmLCAweDYxNzM3MzY5LCAKKzB4NzM3NDVmNzAsIDB4NmM3NTczNWYsIDB4NzQ2OTZkNjUsIDB4NzIwMDAwMDAsIAorMHgyYjI2NzA3MiwgMHg2NTZjNmY2MSwgMHg2NDVmNzc3MiwgMHg1ZjY0NjU3MywgCisweDYzNzIwMDAwLCAweDJiMjY3MDcyLCAweDY1NmM2ZjYxLCAweDY0NWY3MjY0LCAKKzB4NWY2NDY1NzMsIDB4NjM3MjAwMDAsIDB4MmI2ODVmNjgsIDB4NjY1Zjc0NjksIAorMHg2ZDY1NzIwMCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsIAorMHg2ZTJmNzQ2OSwgMHg2ZDY1NzIyZSwgMHg2MzJjNzYyMCwgMHgzMTJlMzEyZSwgCisweDMyMmUzMzM1LCAweDIwMzEzOTM5LCAweDM5MmYzMDMxLCAweDJmMzIzNzIwLCAKKzB4MzEzOTNhMzAsIDB4MzkzYTM1MzAsIDB4MjA2ODYxNzksIDB4NjU3MzIwNDUsIAorMHg3ODcwMjAyNCwgMHgwLCAweDY1NzY3NDUyLCAweDZlNjc0NjAwLCAKKzB4NTE2NTc2NzQsIDB4NDYwMDAwMDAsIDB4NTE2NTc2NzQsIDB4NTA1ZjQ2MDAsIAorMHg0ZDY1NzY3NCwgMHg1MjZlNjc0NiwgMHgwLCAweDRkNTE2NTc2LCAKKzB4NzQ0NjAwMDAsIDB4NGQ1MTY1NzYsIDB4NTA1ZjQ2MDAsIDB4NTE3MzQzNmYsIAorMHg2ZTQ5NWY0NiwgMHgwLCAweDUxNzM0MzZmLCAweDZlNzM0NjAwLCAKKzB4NTE3MjUwNzIsIDB4NmY2NDQ2MDAsIDB4NTQyZDQ0NmQsIDB4NjE1MjY0MzIsIAorMHgwLCAweDU0MmQ0NDZkLCAweDYxNTI2NDMxLCAweDAsIAorMHg1NDJkNDQ2ZCwgMHg2MTUyNjQ0MiwgMHgwLCAweDU0MmQ0NDZkLCAKKzB4NjE1NzcyMzIsIDB4MCwgMHg1NDJkNDQ2ZCwgMHg2MTU3NzIzMSwgCisweDAsIDB4NTQyZDQ0NmQsIDB4NjE1NzcyNDIsIDB4MCwgCisweDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsIAorMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwgCisweDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLCAKKzB4NmUyZjYzNmYsIDB4NmQ2ZDYxNmUsIDB4NjQyZTYzMmMsIDB4NzYyMDMxMmUsIAorMHgzMTJlMzIyZSwgMHgzMjM4MjAzMSwgMHgzOTM5MzkyZiwgMHgzMDMxMmYzMiwgCisweDMwMjAzMTM5LCAweDNhMzQzOTNhLCAweDM0MzkyMDczLCAweDY4NzU2MTZlLCAKKzB4NjcyMDQ1NzgsIDB4NzAyMDI0MDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsIAorMHg1MTY1NzY3NCwgMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwgCisweDRkNjU3Njc0LCAweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsIAorMHg3NDQ2MDAwMCwgMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwgCisweDZlNDk1ZjQ2LCAweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsIAorMHg1MTcyNTA3MiwgMHg2ZjY0NDYwMCwgMHgzZjQ4NjM2ZCwgMHg2NDRkNjI3OCwgCisweDAsIDB4M2Y2MzZkNjQsIDB4NDg3Mzc0NTMsIDB4MCwgCisweDNmNjM2ZDY0LCAweDRkNjM0ZDY0LCAweDAsIDB4M2Y2MzZkNjQsIAorMHg1MDcyNmY2ZCwgMHgwLCAweDNmNjM2ZDY0LCAweDRjNjk2ZTZiLCAKKzB4MCwgMHgzZjYzNmQ2NCwgMHg0NTcyNzIwMCwgMHg4NmFjLCAKKzB4OGU1YywgMHg4ZTVjLCAweDhkZTQsIDB4OGI3OCwgCisweDhlMzAsIDB4OGU1YywgMHg4NzkwLCAweDg4MDAsIAorMHg4OTkwLCAweDhhNjgsIDB4OGEzNCwgMHg4ZTVjLCAKKzB4ODg3MCwgMHg4YjI0LCAweDhlNWMsIDB4OGIzNCwgCisweDg3YjQsIDB4ODgyNCwgMHgwLCAweDAsIAorMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLCAKKzB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsIAorMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwgCisweDZlMmY2ZDYzLCAweDYxNzM3NDJlLCAweDYzMmM3NjIwLCAweDMxMmUzMTJlLCAKKzB4MzIyZTM4MjAsIDB4MzEzOTM5MzgsIDB4MmYzMTMyMmYsIDB4MzAzODIwMzAsIAorMHgzMjNhMzMzNiwgMHgzYTMzMzYyMCwgMHg3MzY4NzU2MSwgMHg2ZTY3MjA0NSwgCisweDc4NzAyMDI0LCAweDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsIAorMHg1MTY1NzY3NCwgMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwgCisweDRkNjU3Njc0LCAweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsIAorMHg3NDQ2MDAwMCwgMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwgCisweDZlNDk1ZjQ2LCAweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsIAorMHg1MTcyNTA3MiwgMHg2ZjY0NDYwMCwgMHg2MTY0NjQ0ZCwgMHg2MzQ0NzU3MCwgCisweDAsIDB4NjE2NDY0NGQsIDB4NjM0Njc1NmMsIDB4MCwgCisweDY0NjU2YzRkLCAweDYzNGU2ZjQ1LCAweDAsIDB4MCwgCisweDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsIAorMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwgCisweDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLCAKKzB4NmUyZjY0NmQsIDB4NjEyZTYzMmMsIDB4NzYyMDMxMmUsIDB4MzEyZTMyMmUsIAorMHgzMjM0MjAzMSwgMHgzOTM5MzgyZiwgMHgzMTMyMmYzMiwgMHgzMTIwMzAzMCwgCisweDNhMzMzMzNhLCAweDMwMzkyMDczLCAweDY4NzU2MTZlLCAweDY3MjA0NTc4LCAKKzB4NzAyMDI0MDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsIDB4NTE2NTc2NzQsIAorMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwgMHg0ZDY1NzY3NCwgCisweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsIDB4NzQ0NjAwMDAsIAorMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwgMHg2ZTQ5NWY0NiwgCisweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsIDB4NTE3MjUwNzIsIAorMHg2ZjY0NDYwMCwgMHg3Mzc3NDQ2ZCwgMHg2MTRmNjY2NiwgMHgwLCAKKzB4MzE0NDZkNjEsIDB4NGY2ZTAwMDAsIDB4NzM3NzQ0NmQsIDB4NjE0ZjZlMDAsIAorMHgyMzcyNDQ2ZCwgMHg2MTQxNTQ0ZSwgMHgwLCAweDcyNDQ2ZDYxLCAKKzB4NDE1NDRlMzAsIDB4MCwgMHg3MjQ0NmQ2MSwgMHg0MTU0NGUzMSwgCisweDAsIDB4NzI0NDZkNjEsIDB4MzQ0NzYyMDAsIDB4MmE1MDQxNGUsIAorMHg0OTQzMmEwMCwgMHgyZTJlMmYyZSwgMHgyZTJmMmUyZSwgMHgyZjJlMmUyZiwgCisweDJlMmUyZjczLCAweDcyNjMyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAKKzB4NmY2ZDZkNmYsIDB4NmUyZjY0NmQsIDB4NjEyZTYzMDAsIDB4MjM3NzQ0NmQsIAorMHg2MTQxNTQ0ZSwgMHgwLCAweDc3NDQ2ZDYxLCAweDQxNTQ0ZTMwLCAKKzB4MCwgMHg3NzQ0NmQ2MSwgMHg0MTU0NGUzMSwgMHgwLCAKKzB4Nzc0NDZkNjEsIDB4MzQ0NzYyMDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsIAorMHg2ZTJmNzQ3MiwgMHg2MTYzNjUyZSwgMHg2MzJjNzYyMCwgMHgzMTJlMzEyZSwgCisweDMyMmUzNTIwLCAweDMxMzkzOTM4LCAweDJmMzAzOTJmLCAweDMzMzAyMDMxLCAKKzB4MzgzYTM1MzAsIDB4M2EzMjM4MjAsIDB4NzM2ODc1NjEsIDB4NmU2NzIwNDUsIAorMHg3ODcwMjAyNCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsIAorMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwgCisweDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLCAKKzB4NmUyZjY0NjEsIDB4NzQ2MTJlNjMsIDB4MmM3NjIwMzEsIDB4MmUzMTJlMzIsIAorMHgyZTMxMzIyMCwgMHgzMTM5MzkzOSwgMHgyZjMwMzEyZiwgMHgzMjMwMjAzMSwgCisweDM5M2EzNDM5LCAweDNhMzUzMTIwLCAweDczNjg3NTYxLCAweDZlNjcyMDQ1LCAKKzB4Nzg3MDIwMjQsIDB4MCwgMHg0NjU3NWY1NiwgMHg0NTUyNTM0OSwgCisweDRmNGUzYTIwLCAweDIzMzEyMDQ2LCAweDcyNjkyMDQxLCAweDcwNzIyMDM3LCAKKzB4MjAzMTM3M2EsIDB4MzUzNzNhMzUsIDB4MzIyMDUwNDQsIDB4NTQyMDMyMzAsIAorMHgzMDMwMDAwMCwgMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY1NCwgCisweDQ5NGQ0NTNhLCAweDIwMzEzNzNhLCAweDM1MzczYTM1LCAweDMyMDAwMDAwLCAKKzB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksIDB4NGM0NTVmNDIsIDB4NTkzYTIwNjQsIAorMHg2NTc2NzI2MywgMHg3MzAwMDAwMCwgMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgCisweDRjNDU1ZjQ4LCAweDRmNTM1NDNhLCAweDIwNjM2ZjZkLCAweDcwNzU3NDY1LCAKKzB4MCwgMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY0NCwgCisweDRmNGQ0MTQ5LCAweDRlM2EyMDY1LCAweDZlNjcyZTYxLCAweDYzNzQ2NTZmLCAKKzB4NmUyZTYzNmYsIDB4NmQwMDAwMDAsIDB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksIAorMHg0YzQ1NTIzYSwgMHgyMDY3NjM2MywgMHgyMDc2NjU3MiwgMHg3MzY5NmY2ZSwgCisweDIwMzIyZTM3LCAweDJlMzIwMDAwLCAweDAsIDB4MTIwNDExMDAsIAorMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLCAKKzB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsIAorMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwgCisweDZlMmY2ZDY1LCAweDZkMmU2MzJjLCAweDc2MjAzMTJlLCAweDMxMmUzMjJlLCAKKzB4MzUyMDMxMzksIDB4MzkzODJmMzAsIDB4MzkyZjMzMzAsIDB4MjAzMTM4M2EsIAorMHgzNTMwM2EzMCwgMHgzODIwNzM2OCwgMHg3NTYxNmU2NywgMHgyMDQ1Nzg3MCwgCisweDIwMjQwMDAwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLCAKKzB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsIAorMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwgCisweDZlMmY3MzY1LCAweDZlNjQyZTYzLCAweDJjNzYyMDMxLCAweDJlMzEyZTMyLCAKKzB4MmUzNDM0MjAsIDB4MzEzOTM5MzgsIDB4MmYzMTMyMmYsIDB4MzIzMTIwMzAsIAorMHgzMDNhMzMzMywgMHgzYTMxMzgyMCwgMHg3MzY4NzU2MSwgMHg2ZTY3MjA0NSwgCisweDc4NzAyMDI0LCAweDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsIAorMHg1MTY1NzY3NCwgMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwgCisweDRkNjU3Njc0LCAweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsIAorMHg3NDQ2MDAwMCwgMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwgCisweDZlNDk1ZjQ2LCAweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsIAorMHg1MTcyNTA3MiwgMHg2ZjY0NDYwMCwgMHg2OTczNmU3NCwgMHg1NDYzNzA1NSwgCisweDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsIAorMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwgCisweDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLCAKKzB4NmUyZjcyNjUsIDB4NjM3NjJlNjMsIDB4MmM3NjIwMzEsIDB4MmUzMTJlMzIsIAorMHgyZTM1MzMyMCwgMHgzMTM5MzkzOSwgMHgyZjMwMzEyZiwgMHgzMTM2MjAzMCwgCisweDMyM2EzNTM1LCAweDNhMzQzMzIwLCAweDczNjg3NTYxLCAweDZlNjcyMDQ1LCAKKzB4Nzg3MDIwMjQsIDB4MCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwgCisweDUxNjU3Njc0LCAweDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLCAKKzB4NGQ2NTc2NzQsIDB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwgCisweDc0NDYwMDAwLCAweDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLCAKKzB4NmU0OTVmNDYsIDB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwgCisweDUxNzI1MDcyLCAweDZmNjQ0NjAwLCAweDcyNGQ2MTYzLCAweDQzNjg2YjMwLCAKKzB4MCwgMHg3Mjc4NDY3MiwgMHg2ZDMyNGM2NywgMHgwLCAKKzB4NzI3ODRlNmYsIDB4NTM3NDQyNjQsIDB4MCwgMHg3Mjc4NGU2ZiwgCisweDRkNjk0MjY0LCAweDAsIDB4NzI3ODRlNmYsIDB4NGE2ZDQyNjQsIAorMHgwLCAweDcyNzg0MzZiLCAweDQ0NmQ2MTQ2LCAweDAsIAorMHg3Mjc4NTE0NCwgMHg2ZDQ1Nzg0NiwgMHgwLCAweDcyNzg1MTQ0LCAKKzB4NmQ2MTQ2MDAsIDB4NzI3ODUxNDQsIDB4NGM0MjY0NDYsIDB4MCwgCisweDcyNzg1MTQ0LCAweDZkNDI2NDQ2LCAweDAsIDB4NzI3ODQzNzIsIAorMHg2MzUwNjE2NCwgMHgwLCAweDcyNTM2ZDUxLCAweDQ0NmQ2MTQ2LCAKKzB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsIAorMHg2ZTJmNmQ2MSwgMHg2MzJlNjMyYywgMHg3NjIwMzEyZSwgMHgzMTJlMzIyZSwgCisweDMyMzIyMDMxLCAweDM5MzkzODJmLCAweDMxMzIyZjMwLCAweDM4MjAzMDMyLCAKKzB4M2EzMzM2M2EsIDB4MzMzMDIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsIAorMHg3MDIwMjQwMCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwgMHg1MTY1NzY3NCwgCisweDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLCAweDRkNjU3Njc0LCAKKzB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwgMHg3NDQ2MDAwMCwgCisweDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLCAweDZlNDk1ZjQ2LCAKKzB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwgMHg1MTcyNTA3MiwgCisweDZmNjQ0NjAwLCAweDZkNjE2MzU0LCAweDY4NzI2NTczLCAweDAsIAorMHgyMzc0NGQ2MSwgMHg2MzQxNTQ0ZSwgMHgwLCAweDIzNzI0ZDYxLCAKKzB4NjM0MTU0NGUsIDB4MCwgMHg3MjY1NmQ0MSwgMHg3MzczNzI3NCwgCisweDAsIDB4NmM2OTZlNmIsIDB4NDQ0ZjU3NGUsIDB4MCwgCisweDZjNjk2ZTZiLCAweDU1NTAwMDAwLCAweDAsIDB4MCwgCisweDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsIAorMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwgCisweDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLCAKKzB4NmUyZjYzNmIsIDB4NzM3NTZkMmUsIDB4NjMyYzc2MjAsIDB4MzEyZTMxMmUsIAorMHgzMjJlMzkyMCwgMHgzMTM5MzkzOSwgMHgyZjMwMzEyZiwgMHgzMTM0MjAzMCwgCisweDMwM2EzMDMzLCAweDNhMzQzODIwLCAweDczNjg3NTYxLCAweDZlNjcyMDQ1LCAKKzB4Nzg3MDIwMjQsIDB4MCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwgCisweDUxNjU3Njc0LCAweDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLCAKKzB4NGQ2NTc2NzQsIDB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwgCisweDc0NDYwMDAwLCAweDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLCAKKzB4NmU0OTVmNDYsIDB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwgCisweDUxNzI1MDcyLCAweDZmNjQ0NjAwLCAweDAsIDB4MCwgCisweDAsIDB4NTA3MjZmNjIsIDB4NjU1MDY4NzksIDB4MCwgCisweDZjNmU2YjQxLCAweDUzNTM1MjU0LCAweDAsIDB4MTA5YTQsIAorMHgxMGExYywgMHgxMGE1MCwgMHgxMGE3YywgMHgxMTA1MCwgCisweDEwYWE4LCAweDEwYjEwLCAweDExMWZjLCAweDEwZGMwLCAKKzB4MTBjNjgsIDB4MTBjODAsIDB4MTBjYzQsIDB4MTBjZWMsIAorMHgxMGQwYywgMHgxMGQzNCwgMHgxMTFmYywgMHgxMGRjMCwgCisweDEwZGY4LCAweDEwZTEwLCAweDEwZTQwLCAweDEwZTY4LCAKKzB4MTBlODgsIDB4MTBlYjAsIDB4MCwgMHgxMGZkYywgCisweDExMDA4LCAweDExMDJjLCAweDExMWZjLCAweDExMDUwLCAKKzB4MTEwNzgsIDB4MTExMDgsIDB4MCwgMHgwLCAKKzB4MCwgMHgxMTg2YywgMHgxMTkzYywgMHgxMWExNCwgCisweDExYWU0LCAweDExYjQwLCAweDExYzFjLCAweDExYzQ0LCAKKzB4MTFkMjAsIDB4MTFkNDgsIDB4MTFlZjAsIDB4MTFmMTgsIAorMHgxMjBjMCwgMHgxMjJiOCwgMHgxMjU0YywgMHgxMjQ2MCwgCisweDEyNTRjLCAweDEyNTc4LCAweDEyMGU4LCAweDEyMjkwLCAKKzB4NzI3Mzc0NWYsIDB4Njc2ZDY5NjksIDB4MCwgMHgxMjYwOCwgCisweDEyNjQwLCAweDEyNzI4LCAweDEzMzc0LCAweDEzM2I0LCAKKzB4MTMzY2MsIDB4NzM2NTc0NmMsIDB4NmY2ZjcwMDAsIDB4MCwgCisweDAsIDB4MTNiYmMsIDB4MTNiZmMsIDB4MTNjOGMsIAorMHgxM2NkMCwgMHgxM2QzNCwgMHgxM2RjMCwgMHgxM2RmNCwgCisweDEzZTdjLCAweDEzZjE0LCAweDEzZmU0LCAweDE0MDI0LCAKKzB4MTQwYTgsIDB4MTQwY2MsIDB4MTQxZGMsIDB4NjQ2ZjQyNjEsIAorMHg3MzY1NTA2NywgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4NzM3NDZkNjEsIDB4NjM0YzRlNGIsIDB4MCwgCisweDY3NjU3NDZkLCAweDYzNmM2ZTZiLCAweDAsIDB4MTRlZDgsIAorMHgxNGVkOCwgMHgxNGI4YywgMHgxNGJkOCwgMHgxNGMyNCwgCisweDE0ZWQ4LCAweDczNjU3NDZkLCAweDYxNjM2MTYzLCAweDc0MDAwMDAwLCAKKzB4MCwgMHgwIH07CitzdGF0aWMgdTMyIHRpZ29uMkZ3RGF0YVsoTUFYX0RBVEFfTEVOLzQpICsgMV0gX19pbml0ZGF0YSA9IHsKKzB4MSwgCisweDEsIDB4MSwgMHhjMDAxZmMsIDB4M2ZmYywgCisweGMwMDAwMCwgMHg0MTZjNzQ2NSwgMHg2ZjZlMjA0MSwgMHg2MzY1NGU0OSwgCisweDQzMjA1NjAwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4NDE2Yzc0NjUsIAorMHg2ZjZlMjA0MSwgMHg2MzY1NGU0OSwgMHg0MzIwNTYwMCwgMHg0MjQyNDI0MiwgCisweDAsIDB4MCwgMHgwLCAweDFmZmZmYywgCisweDFmZmY3YywgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDYwY2YwMCwgCisweDYwLCAweGNmMDAwMDAwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MywgMHgwLCAKKzB4MSwgMHgwLCAweDAsIDB4MCwgCisweDEsIDB4MCwgMHgxLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgxLCAKKzB4MSwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgxMDAwMDAwLCAweDIxMDAwMDAwLCAKKzB4MTIwMDAxNDAsIDB4MCwgMHgwLCAweDIwMDAwMDAwLCAKKzB4MTIwMDAwYTAsIDB4MCwgMHgxMjAwMDA2MCwgMHgxMjAwMDE4MCwgCisweDEyMDAwMWUwLCAweDAsIDB4MCwgMHgwLCAKKzB4MSwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDIsIAorMHgwLCAweDAsIDB4MzAwMDEsIDB4MSwgCisweDMwMjAxLCAweDAsIDB4MCwgMHgxMDEwMTAxLCAKKzB4MTAxMDEwMCwgMHgxMDEwMCwgMHgxMDEwMDAxLCAweDEwMDAxLCAKKzB4MTAwMDEwMSwgMHgxMDEsIDB4MCwgMHgwIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hbWQ4MTExZS5jIGIvZHJpdmVycy9uZXQvYW1kODExMWUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMmU5MzdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYW1kODExMWUuYwpAQCAtMCwwICsxLDIxNjcgQEAKKworLyogQWR2YW5jZWQgIE1pY3JvIERldmljZXMgSW5jLiBBTUQ4MTExRSBMaW51eCBOZXR3b3JrIERyaXZlciAKKyAqIENvcHlyaWdodCAoQykgMjAwNCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzIAorICoKKyAqIAorICogQ29weXJpZ2h0IDIwMDEsMjAwMiBKZWZmIEdhcnppayA8amdhcnppa0BtYW5kcmFrZXNvZnQuY29tPiBbIDgxMzljcC5jLHRnMy5jIF0KKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pWyB0ZzMuY10KKyAqIENvcHlyaWdodCAxOTk2LTE5OTkgVGhvbWFzIEJvZ2VuZG9lcmZlciBbIHBjbmV0MzIuYyBdCisgKiBEZXJpdmVkIGZyb20gdGhlIGxhbmNlIGRyaXZlciB3cml0dGVuIDE5OTMsMTk5NCwxOTk1IGJ5IERvbmFsZCBCZWNrZXIuCisgKiBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKglEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LlsgcGNuZXQzMi5jIF0KKyAqIENhcnN0ZW4gTGFuZ2dhYXJkLCBjYXJzdGVubEBtaXBzLmNvbSBbIHBjbmV0MzIuYyBdCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAKKyAqIFVTQQorICAKK01vZHVsZSBOYW1lOgorCisJYW1kODExMWUuYworCitBYnN0cmFjdDoKKwkKKyAJIEFNRDgxMTEgYmFzZWQgMTAvMTAwIEV0aGVybmV0IENvbnRyb2xsZXIgRHJpdmVyLiAKKworRW52aXJvbm1lbnQ6CisKKwlLZXJuZWwgTW9kZQorCitSZXZpc2lvbiBIaXN0b3J5OgorIAkzLjAuMAorCSAgIEluaXRpYWwgUmV2aXNpb24uCisJMy4wLjEKKwkgMS4gRHluYW1pYyBpbnRlcnJ1cHQgY29hbGVzY2luZy4KKwkgMi4gUmVtb3ZlZCBwcmV2X3N0YXRzLgorCSAzLiBNSUkgc3VwcG9ydC4KKwkgNC4gRHluYW1pYyBJUEcgc3VwcG9ydAorCTMuMC4yICAwNS8yOS8yMDAzCisJIDEuIEJ1ZyBmaXg6IEZpeGVkIGZhaWx1cmUgdG8gc2VuZCBqdW1ibyBwYWNrZXRzIGxhcmdlciB0aGFuIDRrLgorCSAyLiBCdWcgZml4OiBGaXhlZCBWTEFOIHN1cHBvcnQgZmFpbHVyZS4KKwkgMy4gQnVnIGZpeDogRml4ZWQgcmVjZWl2ZSBpbnRlcnJ1cHQgY29hbGVzY2luZyBidWcuCisJIDQuIER5bmFtaWMgSVBHIHN1cHBvcnQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKwkzLjAuMyAwNi8wNS8yMDAzCisJIDEuIEJ1ZyBmaXg6IEZpeGVkIGZhaWx1cmUgdG8gY2xvc2UgdGhlIGludGVyZmFjZSBpZiBTTVAgaXMgZW5hYmxlZC4KKwkzLjAuNCAxMi8wOS8yMDAzCisJIDEuIEFkZGVkIHNldF9tYWNfYWRkcmVzcyByb3V0aW5lIGZvciBib25kaW5nIGRyaXZlciBzdXBwb3J0LgorCSAyLiBUZXN0ZWQgdGhlIGRyaXZlciBmb3IgYm9uZGluZyBzdXBwb3J0CisJIDMuIEJ1ZyBmaXg6IEZpeGVkIG1pc21hY2ggaW4gYWN0dWFsIHJlY2VpdmUgYnVmZmVyIGxlbnRoIGFuZCBsZW50aCAKKwkgICAgaW5kaWNhdGVkIHRvIHRoZSBoL3cuCisJIDQuIE1vZGlmaWVkIGFtZDgxMTFlX3J4KCkgcm91dGluZSB0byByZWNlaXZlIGFsbCB0aGUgcmVjZWl2ZWQgcGFja2V0cyAKKwkgICAgaW4gdGhlIGZpcnN0IGludGVycnVwdC4KKwkgNS4gQnVnIGZpeDogQ29ycmVjdGVkICByeF9lcnJvcnMgIHJlcG9ydGVkIGluIGdldF9zdGF0cygpIGZ1bmN0aW9uLgorCTMuMC41IDAzLzIyLzIwMDQKKwkgMS4gQWRkZWQgTkFQSSBzdXBwb3J0ICAKKworKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4JCisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2RlZmluZSBBTUQ4MTExRV9WTEFOX1RBR19VU0VEIDEKKyNlbHNlCisjZGVmaW5lIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQgMAorI2VuZGlmCisKKyNpbmNsdWRlICJhbWQ4MTExZS5oIgorI2RlZmluZSBNT0RVTEVfTkFNRQkiYW1kODExMWUiCisjZGVmaW5lIE1PRFVMRV9WRVJTCSIzLjAuNSIKK01PRFVMRV9BVVRIT1IoIkFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4iKTsKK01PRFVMRV9ERVNDUklQVElPTiAoIkFNRDgxMTEgYmFzZWQgMTAvMTAwIEV0aGVybmV0IENvbnRyb2xsZXIuIERyaXZlciBWZXJzaW9uIDMuMC4zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYW1kODExMWVfcGNpX3RibCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoc3BlZWRfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhzcGVlZF9kdXBsZXgsICJTZXQgZGV2aWNlIHNwZWVkIGFuZCBkdXBsZXggbW9kZXMsIDA6IEF1dG8gTmVnb3RpdGF0ZSwgMTogMTBNYnBzIEhhbGYgRHVwbGV4LCAyOiAxME1icHMgRnVsbCBEdXBsZXgsIDM6IDEwME1icHMgSGFsZiBEdXBsZXgsIDQ6IDEwME1icHMgRnVsbCBEdXBsZXgiKTsKK21vZHVsZV9wYXJhbV9hcnJheShjb2FsZXNjZSwgYm9vbCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNvYWxlc2NlLCAiRW5hYmxlIG9yIERpc2FibGUgaW50ZXJydXB0IGNvYWxlc2NpbmcsIDE6IEVuYWJsZSwgMDogRGlzYWJsZSIpOworbW9kdWxlX3BhcmFtX2FycmF5KGR5bmFtaWNfaXBnLCBib29sLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZHluYW1pY19pcGcsICJFbmFibGUgb3IgRGlzYWJsZSBkeW5hbWljIElQRywgMTogRW5hYmxlLCAwOiBEaXNhYmxlIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhbWQ4MTExZV9wY2lfdGJsW10gPSB7CisJCQorCXsgUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EODExMUVfNzQ2MiwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyAwLCB9CisKK307CisvKiAKK1RoaXMgZnVuY3Rpb24gd2lsbCByZWFkIHRoZSBQSFkgcmVnaXN0ZXJzLgorKi8KK3N0YXRpYyBpbnQgYW1kODExMWVfcmVhZF9waHkoc3RydWN0IGFtZDgxMTFlX3ByaXYqIGxwLCBpbnQgcGh5X2lkLCBpbnQgcmVnLCB1MzIqIHZhbCkKK3sKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBscC0+bW1pbzsKKwl1bnNpZ25lZCBpbnQgcmVnX3ZhbDsKKwl1bnNpZ25lZCBpbnQgcmVwZWF0PSBSRVBFQVRfQ05UOworCisJcmVnX3ZhbCA9IHJlYWRsKG1taW8gKyBQSFlfQUNDRVNTKTsKKwl3aGlsZSAocmVnX3ZhbCAmIFBIWV9DTURfQUNUSVZFKQorCQlyZWdfdmFsID0gcmVhZGwoIG1taW8gKyBQSFlfQUNDRVNTICk7CisKKwl3cml0ZWwoIFBIWV9SRF9DTUQgfCAoKHBoeV9pZCAmIDB4MWYpIDw8IDIxKSB8CisJCQkgICAoKHJlZyAmIDB4MWYpIDw8IDE2KSwgIG1taW8gK1BIWV9BQ0NFU1MpOworCWRveworCQlyZWdfdmFsID0gcmVhZGwobW1pbyArIFBIWV9BQ0NFU1MpOworCQl1ZGVsYXkoMzApOyAgLyogSXQgdGFrZXMgMzAgdXMgdG8gcmVhZC93cml0ZSBkYXRhICovCisJfSB3aGlsZSAoLS1yZXBlYXQgJiYgKHJlZ192YWwgJiBQSFlfQ01EX0FDVElWRSkpOworCWlmKHJlZ192YWwgJiBQSFlfUkRfRVJSKQorCQlnb3RvIGVycl9waHlfcmVhZDsKKwkKKwkqdmFsID0gcmVnX3ZhbCAmIDB4ZmZmZjsKKwlyZXR1cm4gMDsKK2Vycl9waHlfcmVhZDoJCisJKnZhbCA9IDA7CisJcmV0dXJuIC1FSU5WQUw7CisJCit9CisKKy8qIAorVGhpcyBmdW5jdGlvbiB3aWxsIHdyaXRlIGludG8gUEhZIHJlZ2lzdGVycy4gCisqLworc3RhdGljIGludCBhbWQ4MTExZV93cml0ZV9waHkoc3RydWN0IGFtZDgxMTFlX3ByaXYqIGxwLGludCBwaHlfaWQsIGludCByZWcsIHUzMiB2YWwpCit7CisJdW5zaWduZWQgaW50IHJlcGVhdCA9IFJFUEVBVF9DTlQKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBscC0+bW1pbzsKKwl1bnNpZ25lZCBpbnQgcmVnX3ZhbDsKKworCXJlZ192YWwgPSByZWFkbChtbWlvICsgUEhZX0FDQ0VTUyk7CisJd2hpbGUgKHJlZ192YWwgJiBQSFlfQ01EX0FDVElWRSkKKwkJcmVnX3ZhbCA9IHJlYWRsKCBtbWlvICsgUEhZX0FDQ0VTUyApOworCisJd3JpdGVsKCBQSFlfV1JfQ01EIHwgKChwaHlfaWQgJiAweDFmKSA8PCAyMSkgfAorCQkJICAgKChyZWcgJiAweDFmKSA8PCAxNil8dmFsLCBtbWlvICsgUEhZX0FDQ0VTUyk7CisKKwlkb3sKKwkJcmVnX3ZhbCA9IHJlYWRsKG1taW8gKyBQSFlfQUNDRVNTKTsKKwkJdWRlbGF5KDMwKTsgIC8qIEl0IHRha2VzIDMwIHVzIHRvIHJlYWQvd3JpdGUgdGhlIGRhdGEgKi8KKwl9IHdoaWxlICgtLXJlcGVhdCAmJiAocmVnX3ZhbCAmIFBIWV9DTURfQUNUSVZFKSk7CisJCisJaWYocmVnX3ZhbCAmIFBIWV9SRF9FUlIpCisJCWdvdG8gZXJyX3BoeV93cml0ZTsKKwkKKwlyZXR1cm4gMDsKKworZXJyX3BoeV93cml0ZToJCisJcmV0dXJuIC1FSU5WQUw7CisJCit9CisvKiAKK1RoaXMgaXMgdGhlIG1paSByZWdpc3RlciByZWFkIGZ1bmN0aW9uIHByb3ZpZGVkIHRvIHRoZSBtaWkgaW50ZXJmYWNlLgorKi8gCitzdGF0aWMgaW50IGFtZDgxMTFlX21kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0pCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYqIGxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgcmVnX3ZhbDsKKworCWFtZDgxMTFlX3JlYWRfcGh5KGxwLHBoeV9pZCxyZWdfbnVtLCZyZWdfdmFsKTsKKwlyZXR1cm4gcmVnX3ZhbDsKKwkKK30KKworLyogCitUaGlzIGlzIHRoZSBtaWkgcmVnaXN0ZXIgd3JpdGUgZnVuY3Rpb24gcHJvdmlkZWQgdG8gdGhlIG1paSBpbnRlcmZhY2UuCisqLyAKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX21kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBwaHlfaWQsIGludCByZWdfbnVtLCBpbnQgdmFsKQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2KiBscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlhbWQ4MTExZV93cml0ZV9waHkobHAsIHBoeV9pZCwgcmVnX251bSwgdmFsKTsKK30KKworLyoKK1RoaXMgZnVuY3Rpb24gd2lsbCBzZXQgUEhZIHNwZWVkLiBEdXJpbmcgaW5pdGlhbGl6YXRpb24gc2V0cyB0aGUgb3JpZ2luYWwgc3BlZWQgdG8gMTAwIGZ1bGwuCisqLworc3RhdGljIHZvaWQgYW1kODExMWVfc2V0X2V4dF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBibWNyLGFkdmVydCx0bXA7CisJCisJLyogRGV0ZXJtaW5lIG1paSByZWdpc3RlciB2YWx1ZXMgdG8gc2V0IHRoZSBzcGVlZCAqLworCWFkdmVydCA9IGFtZDgxMTFlX21kaW9fcmVhZChkZXYsIGxwLT5leHRfcGh5X2FkZHIsIE1JSV9BRFZFUlRJU0UpOworCXRtcCA9IGFkdmVydCAmIH4oQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV8xMDBCQVNFNCk7CisJc3dpdGNoIChscC0+ZXh0X3BoeV9vcHRpb24peworCisJCWRlZmF1bHQ6CisJCWNhc2UgU1BFRURfQVVUT05FRzogLyogYWR2ZXJ0aXNlIGFsbCB2YWx1ZXMgKi8KKwkJCXRtcCB8PSAoIEFEVkVSVElTRV8xMEhBTEZ8QURWRVJUSVNFXzEwRlVMTHwKKwkJCQlBRFZFUlRJU0VfMTAwSEFMRnxBRFZFUlRJU0VfMTAwRlVMTCkgOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRUQxMF9IQUxGOgorCQkJdG1wIHw9IEFEVkVSVElTRV8xMEhBTEY7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRDEwX0ZVTEw6CisJCQl0bXAgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEMTAwX0hBTEY6IAorCQkJdG1wIHw9IEFEVkVSVElTRV8xMDBIQUxGOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRUQxMDBfRlVMTDoKKwkJCXRtcCB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwkJCWJyZWFrOworCX0KKworCWlmKGFkdmVydCAhPSB0bXApCisJCWFtZDgxMTFlX21kaW9fd3JpdGUoZGV2LCBscC0+ZXh0X3BoeV9hZGRyLCBNSUlfQURWRVJUSVNFLCB0bXApOworCS8qIFJlc3RhcnQgYXV0byBuZWdvdGlhdGlvbiAqLworCWJtY3IgPSBhbWQ4MTExZV9tZGlvX3JlYWQoZGV2LCBscC0+ZXh0X3BoeV9hZGRyLCBNSUlfQk1DUik7CisJYm1jciB8PSAoQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKwlhbWQ4MTExZV9tZGlvX3dyaXRlKGRldiwgbHAtPmV4dF9waHlfYWRkciwgTUlJX0JNQ1IsIGJtY3IpOworCit9CisKKy8qIAorVGhpcyBmdW5jdGlvbiB3aWxsIHVubWFwIHNrYi0+ZGF0YSBzcGFjZSBhbmQgd2lsbCBmcmVlIAorYWxsIHRyYW5zbWl0IGFuZCByZWNlaXZlIHNrYnVmZnMuCisqLworc3RhdGljIGludCBhbWQ4MTExZV9mcmVlX3NrYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmKiByeF9za2J1ZmY7CisJaW50IGk7CisKKwkvKiBGcmVlaW5nIHRyYW5zbWl0IHNrYnMgKi8KKwlmb3IoaSA9IDA7IGkgPCBOVU1fVFhfQlVGRkVSUzsgaSsrKXsKKwkJaWYobHAtPnR4X3NrYnVmZltpXSl7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LGxwLT50eF9kbWFfYWRkcltpXSwJCQkJCWxwLT50eF9za2J1ZmZbaV0tPmxlbixQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IgKGxwLT50eF9za2J1ZmZbaV0pOworCQkJbHAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCQlscC0+dHhfZG1hX2FkZHJbaV0gPSAwOworCQl9CisJfQorCS8qIEZyZWVpbmcgcHJldmlvdXNseSBhbGxvY2F0ZWQgcmVjZWl2ZSBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9CVUZGRVJTOyBpKyspeworCQlyeF9za2J1ZmYgPSBscC0+cnhfc2tidWZmW2ldOworCQlpZihyeF9za2J1ZmYgIT0gTlVMTCl7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LGxwLT5yeF9kbWFfYWRkcltpXSwKKwkJCQkgIGxwLT5yeF9idWZmX2xlbiAtIDIsUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IobHAtPnJ4X3NrYnVmZltpXSk7CisJCQlscC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJCWxwLT5yeF9kbWFfYWRkcltpXSA9IDA7CisJCX0KKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCitUaGlzIHdpbGwgc2V0IHRoZSByZWNlaXZlIGJ1ZmZlciBsZW5ndGggY29ycmVzcG9uZGluZyB0byB0aGUgbXR1IHNpemUgb2YgbmV0d29ya2ludGVyZmFjZS4KKyovCitzdGF0aWMgaW5saW5lIHZvaWQgYW1kODExMWVfc2V0X3J4X2J1ZmZfbGVuKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYqIGxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgbXR1ID0gZGV2LT5tdHU7CisJCisJaWYgKG10dSA+IEVUSF9EQVRBX0xFTil7CisJCS8qIE1UVSArIGV0aGVybmV0IGhlYWRlciArIEZDUworCQkrIG9wdGlvbmFsIFZMQU4gdGFnICsgc2tiIHJlc2VydmUgc3BhY2UgMiAqLworCisJCWxwLT5yeF9idWZmX2xlbiA9IG10dSArIEVUSF9ITEVOICsgMTA7CisJCWxwLT5vcHRpb25zIHw9IE9QVElPTl9KVU1CT19FTkFCTEU7CisJfSBlbHNleworCQlscC0+cnhfYnVmZl9sZW4gPSBQS1RfQlVGRl9TWjsKKwkJbHAtPm9wdGlvbnMgJj0gfk9QVElPTl9KVU1CT19FTkFCTEU7CisJfQorfQorCisvKiAKK1RoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIGFsbCB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnVmZmVycywgZGV0ZXJtaW5lIG5ldyByZWNlaXZlIGJ1ZmZlciBsZW5ndGggIGFuZCB3aWxsIGFsbG9jYXRlIG5ldyByZWNlaXZlIGJ1ZmZlcnMuIFRoaXMgZnVuY3Rpb24gYWxzbyBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIGJvdGggdGhlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlIGhhcmR3YXJlIGRlc2NyaXB0b3JzLgorICovCitzdGF0aWMgaW50IGFtZDgxMTFlX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlscC0+cnhfaWR4ID0gbHAtPnR4X2lkeCA9IDA7CisJbHAtPnR4X2NvbXBsZXRlX2lkeCA9IDA7CisJbHAtPnR4X3JpbmdfaWR4ID0gMDsKKwkKKworCWlmKGxwLT5vcGVuZWQpCisJCS8qIEZyZWUgcHJldmlvdXNseSBhbGxvY2F0ZWQgdHJhbnNtaXQgYW5kIHJlY2VpdmUgc2ticyAqLworCQlhbWQ4MTExZV9mcmVlX3NrYnMoZGV2KTsJCisKKwllbHNleworCQkgLyogYWxsb2NhdGUgdGhlIHR4IGFuZCByeCBkZXNjcmlwdG9ycyAqLworCSAgICAgCWlmKChscC0+dHhfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGxwLT5wY2lfZGV2LCAKKwkJCXNpemVvZihzdHJ1Y3QgYW1kODExMWVfdHhfZHIpKk5VTV9UWF9SSU5HX0RSLAorCQkJJmxwLT50eF9yaW5nX2RtYV9hZGRyKSkgPT0gTlVMTCkKKwkJCisJCQlnb3RvIGVycl9ub19tZW07CisJCisJICAgICAJaWYoKGxwLT5yeF9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsIAorCQkJc2l6ZW9mKHN0cnVjdCBhbWQ4MTExZV9yeF9kcikqTlVNX1JYX1JJTkdfRFIsCisJCQkmbHAtPnJ4X3JpbmdfZG1hX2FkZHIpKSA9PSBOVUxMKQorCQkKKwkJCWdvdG8gZXJyX2ZyZWVfdHhfcmluZzsKKworCX0KKwkvKiBTZXQgbmV3IHJlY2VpdmUgYnVmZiBzaXplICovCisJYW1kODExMWVfc2V0X3J4X2J1ZmZfbGVuKGRldik7CisKKwkvKiBBbGxvY2F0aW5nIHJlY2VpdmUgIHNrYnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0JVRkZFUlM7IGkrKykgeworCisJCWlmICghKGxwLT5yeF9za2J1ZmZbaV0gPSBkZXZfYWxsb2Nfc2tiKGxwLT5yeF9idWZmX2xlbikpKSB7CisJCQkJLyogUmVsZWFzZSBwcmV2aW9zIGFsbG9jYXRlZCBza2JzICovCisJCQkJZm9yKC0taTsgaSA+PSAwIDtpLS0pCisJCQkJCWRldl9rZnJlZV9za2IobHAtPnJ4X3NrYnVmZltpXSk7CisJCQkJZ290byBlcnJfZnJlZV9yeF9yaW5nOworCQl9CisJCXNrYl9yZXNlcnZlKGxwLT5yeF9za2J1ZmZbaV0sMik7CisJfQorICAgICAgICAvKiBJbml0aWxhaXppbmcgcmVjZWl2ZSBkZXNjcmlwdG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfQlVGRkVSUzsgaSsrKSB7CisJCWxwLT5yeF9kbWFfYWRkcltpXSA9IHBjaV9tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCAKKwkJCWxwLT5yeF9za2J1ZmZbaV0tPmRhdGEsbHAtPnJ4X2J1ZmZfbGVuLTIsIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJbHAtPnJ4X3JpbmdbaV0uYnVmZl9waHlfYWRkciA9IGNwdV90b19sZTMyKGxwLT5yeF9kbWFfYWRkcltpXSk7CisJCWxwLT5yeF9yaW5nW2ldLmJ1ZmZfY291bnQgPSBjcHVfdG9fbGUxNihscC0+cnhfYnVmZl9sZW4tMik7CisJCXdtYigpOworCQlscC0+cnhfcmluZ1tpXS5yeF9mbGFncyA9IGNwdV90b19sZTE2KE9XTl9CSVQpOworCX0KKworCS8qIEluaXRpYWxpemluZyB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfUklOR19EUjsgaSsrKSB7CisJCWxwLT50eF9yaW5nW2ldLmJ1ZmZfcGh5X2FkZHIgPSAwOworCQlscC0+dHhfcmluZ1tpXS50eF9mbGFncyA9IDA7CisJCWxwLT50eF9yaW5nW2ldLmJ1ZmZfY291bnQgPSAwOworCX0KKworCXJldHVybiAwOworCitlcnJfZnJlZV9yeF9yaW5nOgorCQorCXBjaV9mcmVlX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsIAorCQlzaXplb2Yoc3RydWN0IGFtZDgxMTFlX3J4X2RyKSpOVU1fUlhfUklOR19EUixscC0+cnhfcmluZywKKwkJbHAtPnJ4X3JpbmdfZG1hX2FkZHIpOworCitlcnJfZnJlZV90eF9yaW5nOgorCQorCXBjaV9mcmVlX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsCisJCSBzaXplb2Yoc3RydWN0IGFtZDgxMTFlX3R4X2RyKSpOVU1fVFhfUklOR19EUixscC0+dHhfcmluZywgCisJCSBscC0+dHhfcmluZ19kbWFfYWRkcik7CisKK2Vycl9ub19tZW06CisJcmV0dXJuIC1FTk9NRU07Cit9CisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2V0IHRoZSBpbnRlcnJ1cHQgY29hbGVzY2luZyBhY2NvcmRpbmcgdG8gdGhlIGlucHV0IGFyZ3VtZW50cyAqLworc3RhdGljIGludCBhbWQ4MTExZV9zZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGVudW0gY29hbF9tb2RlIGNtb2QpCit7CisJdW5zaWduZWQgaW50IHRpbWVvdXQ7CisJdW5zaWduZWQgaW50IGV2ZW50X2NvdW50OworCisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBscC0+bW1pbzsKKwlzdHJ1Y3QgYW1kODExMWVfY29hbGVzY2VfY29uZiAqIGNvYWxfY29uZiA9ICZscC0+Y29hbF9jb25mOworCisKKwlzd2l0Y2goY21vZCkKKwl7CisJCWNhc2UgUlhfSU5UUl9DT0FMIDoKKwkJCXRpbWVvdXQgPSBjb2FsX2NvbmYtPnJ4X3RpbWVvdXQ7CisJCQlldmVudF9jb3VudCA9IGNvYWxfY29uZi0+cnhfZXZlbnRfY291bnQ7CisJCQlpZiggdGltZW91dCA+IE1BWF9USU1FT1VUIHx8IAorCQkJCQlldmVudF9jb3VudCA+IE1BWF9FVkVOVF9DT1VOVCApIAorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXRpbWVvdXQgPSB0aW1lb3V0ICogREVMQVlfVElNRVJfQ09OVjsgCisJCQl3cml0ZWwoVkFMMHxTVElOVEVOLCBtbWlvK0lOVEVOMCk7CisJCQl3cml0ZWwoKHUzMilETFlfSU5UX0FfUjB8KCBldmVudF9jb3VudDw8IDE2ICl8dGltZW91dCwKKwkJCQkJCQltbWlvK0RMWV9JTlRfQSk7CisJCQlicmVhazsKKworCQljYXNlIFRYX0lOVFJfQ09BTCA6CisJCQl0aW1lb3V0ID0gY29hbF9jb25mLT50eF90aW1lb3V0OworCQkJZXZlbnRfY291bnQgPSBjb2FsX2NvbmYtPnR4X2V2ZW50X2NvdW50OworCQkJaWYoIHRpbWVvdXQgPiBNQVhfVElNRU9VVCB8fCAKKwkJCQkJZXZlbnRfY291bnQgPiBNQVhfRVZFTlRfQ09VTlQgKSAKKwkJCXJldHVybiAtRUlOVkFMOworCisJCSAgIAorCQkJdGltZW91dCA9IHRpbWVvdXQgKiBERUxBWV9USU1FUl9DT05WOyAKKwkJCXdyaXRlbChWQUwwfFNUSU5URU4sbW1pbytJTlRFTjApOworCQkJd3JpdGVsKCh1MzIpRExZX0lOVF9CX1QwfCggZXZlbnRfY291bnQ8PCAxNiApfHRpbWVvdXQsCisJCQkJCQkJIG1taW8rRExZX0lOVF9CKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElTQUJMRV9DT0FMOgorCQkJd3JpdGVsKDAsbW1pbytTVFZBTCk7CisJCQl3cml0ZWwoU1RJTlRFTiwgbW1pbytJTlRFTjApOworCQkJd3JpdGVsKDAsIG1taW8gK0RMWV9JTlRfQik7CisJCQl3cml0ZWwoMCwgbW1pbytETFlfSU5UX0EpOworCQkJYnJlYWs7CisJCSBjYXNlIEVOQUJMRV9DT0FMOiAKKwkJICAgICAgIC8qIFN0YXJ0IHRoZSB0aW1lciAqLworCQkJd3JpdGVsKCh1MzIpU09GVF9USU1FUl9GUkVRLCBtbWlvK1NUVkFMKTsgLyogIDAuNSBzZWMgKi8KKwkJCXdyaXRlbChWQUwwfFNUSU5URU4sIG1taW8rSU5URU4wKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisKKyAgIH0KKwlyZXR1cm4gMDsKKworfQorCisvKiAKK1RoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGRldmljZSByZWdpc3RlcnMgIGFuZCBzdGFydHMgdGhlIGRldmljZS4gIAorKi8KK3N0YXRpYyBpbnQgYW1kODExMWVfcmVzdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICptbWlvID0gbHAtPm1taW87CisJaW50IGkscmVnX3ZhbDsKKworCS8qIHN0b3AgdGhlIGNoaXAgKi8KKwkgd3JpdGVsKFJVTiwgbW1pbyArIENNRDApOworCisJaWYoYW1kODExMWVfaW5pdF9yaW5nKGRldikpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogZW5hYmxlIHRoZSBwb3J0IG1hbmFnZXIgYW5kIHNldCBhdXRvIG5lZ290aWF0aW9uIGFsd2F5cyAqLworCXdyaXRlbCgodTMyKSBWQUwxfEVOX1BNR1IsIG1taW8gKyBDTUQzICk7CisJd3JpdGVsKCh1MzIpWFBIWUFORXxYUEhZUlNUICwgbW1pbyArIENUUkwyKTsgCisJCisJYW1kODExMWVfc2V0X2V4dF9waHkoZGV2KTsKKworCS8qIHNldCBjb250cm9sIHJlZ2lzdGVycyAqLworCXJlZ192YWwgPSByZWFkbChtbWlvICsgQ1RSTDEpOworCXJlZ192YWwgJj0gflhNVFNQX01BU0s7CisJd3JpdGVsKCByZWdfdmFsfCBYTVRTUF8xMjggfCBDQUNIRV9BTElHTiwgbW1pbyArIENUUkwxICk7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0ICovCisJd3JpdGVsKCBBUElOVDVFTiB8IEFQSU5UNEVOIHwgQVBJTlQzRU4gfCBBUElOVDJFTiB8IEFQSU5UMUVOIHwgCisJCUFQSU5UMEVOIHwgTUlJUERUSU5URU4gfCBNQ0NJSU5URU4gfCBNQ0NJTlRFTiB8IE1SRUlOVEVOIHwKKwkJU1BORElOVEVOIHwgTVBJTlRFTiB8IFNJTlRFTiB8IFNUSU5URU4sIG1taW8gKyBJTlRFTjApOworCisJd3JpdGVsKFZBTDMgfCBMQ0lOVEVOIHwgVkFMMSB8IFRJTlRFTjAgfCBWQUwwIHwgUklOVEVOMCwgbW1pbyArIElOVEVOMCk7CisKKwkvKiBpbml0aWFsaXplIHR4IGFuZCByeCByaW5nIGJhc2UgYWRkcmVzc2VzICovCisJd3JpdGVsKCh1MzIpbHAtPnR4X3JpbmdfZG1hX2FkZHIsbW1pbyArIFhNVF9SSU5HX0JBU0VfQUREUjApOworCXdyaXRlbCgodTMyKWxwLT5yeF9yaW5nX2RtYV9hZGRyLG1taW8rIFJDVl9SSU5HX0JBU0VfQUREUjApOworCisJd3JpdGV3KCh1MzIpTlVNX1RYX1JJTkdfRFIsIG1taW8gKyBYTVRfUklOR19MRU4wKTsKKwl3cml0ZXcoKHUxNilOVU1fUlhfUklOR19EUiwgbW1pbyArIFJDVl9SSU5HX0xFTjApOworCQorCS8qIHNldCBkZWZhdWx0IElQRyB0byA5NiAqLworCXdyaXRldygodTMyKURFRkFVTFRfSVBHLG1taW8rSVBHKTsKKwl3cml0ZXcoKHUzMikoREVGQVVMVF9JUEctSUZTMV9ERUxUQSksIG1taW8gKyBJRlMxKTsgCisKKwlpZihscC0+b3B0aW9ucyAmIE9QVElPTl9KVU1CT19FTkFCTEUpeworCQl3cml0ZWwoKHUzMilWQUwyfEpVTUJPLCBtbWlvICsgQ01EMyk7CisJCS8qIFJlc2V0IFJFWF9VRkxPICovCisJCXdyaXRlbCggUkVYX1VGTE8sIG1taW8gKyBDTUQyKTsKKwkJLyogU2hvdWxkIG5vdCBzZXQgUkVYX1VGTE8gZm9yIGp1bWJvIGZyYW1lcyAqLworCQl3cml0ZWwoIFZBTDAgfCBBUEFEX1hNVHxSRVhfUlRSWSAsIG1taW8gKyBDTUQyKTsKKwl9ZWxzZXsKKwkJd3JpdGVsKCBWQUwwIHwgQVBBRF9YTVQgfCBSRVhfUlRSWXxSRVhfVUZMTywgbW1pbyArIENNRDIpOworCQl3cml0ZWwoKHUzMilKVU1CTywgbW1pbyArIENNRDMpOworCX0KKworI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQKKwl3cml0ZWwoKHUzMikgVkFMMnxWU0laRXxWTF9UQUdfREVMLCBtbWlvICsgQ01EMyk7CisjZW5kaWYKKwl3cml0ZWwoIFZBTDAgfCBBUEFEX1hNVCB8IFJFWF9SVFJZLCBtbWlvICsgQ01EMiApOworCQorCS8qIFNldHRpbmcgdGhlIE1BQyBhZGRyZXNzIHRvIHRoZSBkZXZpY2UgKi8KKwlmb3IoaSA9IDA7IGkgPCBFVEhfQUREUl9MRU47IGkrKykKKwkJd3JpdGViKCBkZXYtPmRldl9hZGRyW2ldLCBtbWlvICsgUEFEUiArIGkgKTsgCisKKwkvKiBFbmFibGUgaW50ZXJydXB0IGNvYWxlc2NlICovCisJaWYobHAtPm9wdGlvbnMgJiBPUFRJT05fSU5UUl9DT0FMX0VOQUJMRSl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcnJ1cHQgQ29hbGVzY2luZyBFbmFibGVkLlxuIiwKKwkJCQkJCQkJZGV2LT5uYW1lKTsKKwkJYW1kODExMWVfc2V0X2NvYWxlc2NlKGRldixFTkFCTEVfQ09BTCk7CisJfQorCQorCS8qIHNldCBSVU4gYml0IHRvIHN0YXJ0IHRoZSBjaGlwICovCisJd3JpdGVsKFZBTDIgfCBSRE1EMCwgbW1pbyArIENNRDApOworCXdyaXRlbChWQUwwIHwgSU5UUkVOIHwgUlVOLCBtbWlvICsgQ01EMCk7CisJCisJLyogVG8gYXZvaWQgUENJIHBvc3RpbmcgYnVnICovCisJcmVhZGwobW1pbytDTUQwKTsKKwlyZXR1cm4gMDsKK30KKy8qIAorVGhpcyBmdW5jdGlvbiBjbGVhcnMgbmVjZXNzYXJ5IHRoZSBkZXZpY2UgcmVnaXN0ZXJzLiAKKyovCQorc3RhdGljIHZvaWQgYW1kODExMWVfaW5pdF9od19kZWZhdWx0KCBzdHJ1Y3QgYW1kODExMWVfcHJpdiogbHApCit7CisJdW5zaWduZWQgaW50IHJlZ192YWw7CisJdW5zaWduZWQgaW50IGxvZ2ljX2ZpbHRlclsyXSA9ezAsfTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBscC0+bW1pbzsKKworCisgICAgICAgIC8qIHN0b3AgdGhlIGNoaXAgKi8KKwl3cml0ZWwoUlVOLCBtbWlvICsgQ01EMCk7CisKKwkvKiBBVVRPUE9MTDAgUmVnaXN0ZXIgKi8vKlRCRCBkZWZhdWx0IHZhbHVlIGlzIDgxMDAgaW4gRlBTICovCisJd3JpdGV3KCAweDgxMDAgfCBscC0+ZXh0X3BoeV9hZGRyLCBtbWlvICsgQVVUT1BPTEwwKTsKKworCS8qIENsZWFyIFJDVl9SSU5HX0JBU0VfQUREUiAqLworCXdyaXRlbCgwLCBtbWlvICsgUkNWX1JJTkdfQkFTRV9BRERSMCk7CisKKwkvKiBDbGVhciBYTVRfUklOR19CQVNFX0FERFIgKi8KKwl3cml0ZWwoMCwgbW1pbyArIFhNVF9SSU5HX0JBU0VfQUREUjApOworCXdyaXRlbCgwLCBtbWlvICsgWE1UX1JJTkdfQkFTRV9BRERSMSk7CisJd3JpdGVsKDAsIG1taW8gKyBYTVRfUklOR19CQVNFX0FERFIyKTsKKwl3cml0ZWwoMCwgbW1pbyArIFhNVF9SSU5HX0JBU0VfQUREUjMpOworCisJLyogQ2xlYXIgQ01EMCAgKi8KKwl3cml0ZWwoQ01EMF9DTEVBUixtbWlvICsgQ01EMCk7CisJCisJLyogQ2xlYXIgQ01EMiAqLworCXdyaXRlbChDTUQyX0NMRUFSLCBtbWlvICtDTUQyKTsKKworCS8qIENsZWFyIENNRDcgKi8KKwl3cml0ZWwoQ01EN19DTEVBUiAsIG1taW8gKyBDTUQ3KTsKKworCS8qIENsZWFyIERMWV9JTlRfQSBhbmQgRExZX0lOVF9CICovCisJd3JpdGVsKDB4MCwgbW1pbyArIERMWV9JTlRfQSk7CisJd3JpdGVsKDB4MCwgbW1pbyArIERMWV9JTlRfQik7CisKKwkvKiBDbGVhciBGTE9XX0NPTlRST0wgKi8KKwl3cml0ZWwoMHgwLCBtbWlvICsgRkxPV19DT05UUk9MKTsKKworCS8qIENsZWFyIElOVDAgIHdyaXRlIDEgdG8gY2xlYXIgcmVnaXN0ZXIgKi8KKwlyZWdfdmFsID0gcmVhZGwobW1pbyArIElOVDApOworCXdyaXRlbChyZWdfdmFsLCBtbWlvICsgSU5UMCk7CisKKwkvKiBDbGVhciBTVFZBTCAqLworCXdyaXRlbCgweDAsIG1taW8gKyBTVFZBTCk7CisKKwkvKiBDbGVhciBJTlRFTjAgKi8KKwl3cml0ZWwoIElOVEVOMF9DTEVBUiwgbW1pbyArIElOVEVOMCk7CisKKwkvKiBDbGVhciBMQURSRiAqLworCXdyaXRlbCgweDAgLCBtbWlvICsgTEFEUkYpOworCisJLyogU2V0IFNSQU1fU0laRSAmIFNSQU1fQk9VTkRBUlkgcmVnaXN0ZXJzICAqLworCXdyaXRlbCggMHg4MDAxMCxtbWlvICsgU1JBTV9TSVpFKTsKKworCS8qIENsZWFyIFJDVl9SSU5HMF9MRU4gKi8KKwl3cml0ZWwoMHgwLCBtbWlvICsgIFJDVl9SSU5HX0xFTjApOworCisJLyogQ2xlYXIgWE1UX1JJTkcwLzEvMi8zX0xFTiAqLworCXdyaXRlbCgweDAsIG1taW8gKyAgWE1UX1JJTkdfTEVOMCk7CisJd3JpdGVsKDB4MCwgbW1pbyArICBYTVRfUklOR19MRU4xKTsKKwl3cml0ZWwoMHgwLCBtbWlvICsgIFhNVF9SSU5HX0xFTjIpOworCXdyaXRlbCgweDAsIG1taW8gKyAgWE1UX1JJTkdfTEVOMyk7CisKKwkvKiBDbGVhciBYTVRfUklOR19MSU1JVCAqLworCXdyaXRlbCgweDAsIG1taW8gKyBYTVRfUklOR19MSU1JVCk7CisKKwkvKiBDbGVhciBNSUIgKi8KKwl3cml0ZXcoTUlCX0NMRUFSLCBtbWlvICsgTUlCX0FERFIpOworCisJLyogQ2xlYXIgTEFSRiAqLworCWFtZDgxMTFlX3dyaXRlcSgqKHU2NCopbG9naWNfZmlsdGVyLG1taW8rTEFEUkYpOworCisJLyogU1JBTV9TSVpFIHJlZ2lzdGVyICovCisJcmVnX3ZhbCA9IHJlYWRsKG1taW8gKyBTUkFNX1NJWkUpOworCQorCWlmKGxwLT5vcHRpb25zICYgT1BUSU9OX0pVTUJPX0VOQUJMRSkKKwkJd3JpdGVsKCBWQUwyfEpVTUJPLCBtbWlvICsgQ01EMyk7CisjaWYgQU1EODExMUVfVkxBTl9UQUdfVVNFRAorCXdyaXRlbChWQUwyfFZTSVpFfFZMX1RBR19ERUwsIG1taW8gKyBDTUQzICk7CisjZW5kaWYKKwkvKiBTZXQgZGVmYXVsdCB2YWx1ZSB0byBDVFJMMSBSZWdpc3RlciAqLworCXdyaXRlbChDVFJMMV9ERUZBVUxULCBtbWlvICsgQ1RSTDEpOworCisJLyogVG8gYXZvaWQgUENJIHBvc3RpbmcgYnVnICovCisJcmVhZGwobW1pbyArIENNRDIpOworCit9CisKKy8qIAorVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyB0aGUgaW50ZXJydXB0IGFuZCBjbGVhcnMgYWxsIHRoZSBwZW5kaW5nIAoraW50ZXJydXB0cyBpbiBJTlQwCisgKi8KK3N0YXRpYyB2b2lkIGFtZDgxMTFlX2Rpc2FibGVfaW50ZXJydXB0KHN0cnVjdCBhbWQ4MTExZV9wcml2KiBscCkKK3sJCisJdTMyIGludHIwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHQgKi8KKwl3cml0ZWwoSU5UUkVOLCBscC0+bW1pbyArIENNRDApOworCQorCS8qIENsZWFyIElOVDAgKi8KKwlpbnRyMCA9IHJlYWRsKGxwLT5tbWlvICsgSU5UMCk7CisJd3JpdGVsKGludHIwLCBscC0+bW1pbyArIElOVDApOworCQorCS8qIFRvIGF2b2lkIFBDSSBwb3N0aW5nIGJ1ZyAqLworCXJlYWRsKGxwLT5tbWlvICsgSU5UMCk7CisKK30KKworLyoKK1RoaXMgZnVuY3Rpb24gc3RvcHMgdGhlIGNoaXAuIAorKi8KK3N0YXRpYyB2b2lkIGFtZDgxMTFlX3N0b3BfY2hpcChzdHJ1Y3QgYW1kODExMWVfcHJpdiogbHApCit7CisJd3JpdGVsKFJVTiwgbHAtPm1taW8gKyBDTUQwKTsKKwkKKwkvKiBUbyBhdm9pZCBQQ0kgcG9zdGluZyBidWcgKi8KKwlyZWFkbChscC0+bW1pbyArIENNRDApOworfQorCisvKiAKK1RoaXMgZnVuY3Rpb24gZnJlZXMgdGhlICB0cmFuc21pdGVyIGFuZCByZWNlaXZlciBkZXNjcmlwdG9yIHJpbmdzLgorKi8KK3N0YXRpYyB2b2lkIGFtZDgxMTFlX2ZyZWVfcmluZyhzdHJ1Y3QgYW1kODExMWVfcHJpdiogbHApCit7CQorCisJLyogRnJlZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBza2JzICovCisJYW1kODExMWVfZnJlZV9za2JzKGxwLT5hbWQ4MTExZV9uZXRfZGV2KTsKKworCS8qIEZyZWUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgZGVzY3JpcHRvciByaW5ncyAqLworCWlmKGxwLT5yeF9yaW5nKXsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChscC0+cGNpX2RldiwgCisJCQlzaXplb2Yoc3RydWN0IGFtZDgxMTFlX3J4X2RyKSpOVU1fUlhfUklOR19EUiwKKwkJCWxwLT5yeF9yaW5nLCBscC0+cnhfcmluZ19kbWFfYWRkcik7CisJCWxwLT5yeF9yaW5nID0gTlVMTDsKKwl9CisJCisJaWYobHAtPnR4X3JpbmcpeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGxwLT5wY2lfZGV2LCAKKwkJCXNpemVvZihzdHJ1Y3QgYW1kODExMWVfdHhfZHIpKk5VTV9UWF9SSU5HX0RSLAorCQkJbHAtPnR4X3JpbmcsIGxwLT50eF9yaW5nX2RtYV9hZGRyKTsKKworCQlscC0+dHhfcmluZyA9IE5VTEw7CisJfQorCit9CisjaWYgQU1EODExMUVfVkxBTl9UQUdfVVNFRAkKKy8qIAorVGhpcyBpcyB0aGUgcmVjZWl2ZSBpbmRpY2F0aW9uIGZ1bmN0aW9uIGZvciBwYWNrZXRzIHdpdGggdmxhbiB0YWcuCisqLwkKK3N0YXRpYyBpbnQgYW1kODExMWVfdmxhbl9yeChzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAsIHN0cnVjdCBza19idWZmICpza2IsIHUxNiB2bGFuX3RhZykKK3sKKyNpZmRlZiBDT05GSUdfQU1EODExMUVfTkFQSQorCXJldHVybiB2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCBscC0+dmxncnAsdmxhbl90YWcpOworI2Vsc2UKKwlyZXR1cm4gdmxhbl9od2FjY2VsX3J4KHNrYiwgbHAtPnZsZ3JwLCB2bGFuX3RhZyk7CisjZW5kaWYgLyogQ09ORklHX0FNRDgxMTFFX05BUEkgKi8KK30KKyNlbmRpZgorCisvKgorVGhpcyBmdW5jdGlvbiB3aWxsIGZyZWUgYWxsIHRoZSB0cmFuc21pdCBza2JzIHRoYXQgYXJlIGFjdHVhbGx5IHRyYW5zbWl0dGVkIGJ5IHRoZSBkZXZpY2UuIEl0IHdpbGwgY2hlY2sgdGhlIG93bmVyc2hpcCBvZiB0aGUgc2tiIGJlZm9yZSBmcmVlaW5nIHRoZSBza2IuIAorKi8KK3N0YXRpYyBpbnQgYW1kODExMWVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiogbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB0eF9pbmRleCA9IGxwLT50eF9jb21wbGV0ZV9pZHggJiBUWF9SSU5HX0RSX01PRF9NQVNLOworCWludCBzdGF0dXM7CisJLyogQ29tcGxldGUgYWxsIHRoZSB0cmFuc21pdCBwYWNrZXQgKi8KKwl3aGlsZSAobHAtPnR4X2NvbXBsZXRlX2lkeCAhPSBscC0+dHhfaWR4KXsKKwkJdHhfaW5kZXggPSAgbHAtPnR4X2NvbXBsZXRlX2lkeCAmIFRYX1JJTkdfRFJfTU9EX01BU0s7CisJCXN0YXR1cyA9IGxlMTZfdG9fY3B1KGxwLT50eF9yaW5nW3R4X2luZGV4XS50eF9mbGFncyk7CisKKwkJaWYoc3RhdHVzICYgT1dOX0JJVCkKKwkJCWJyZWFrOwkvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBUeGVkICovCisKKwkJbHAtPnR4X3JpbmdbdHhfaW5kZXhdLmJ1ZmZfcGh5X2FkZHIgPSAwOworCisJCS8qIFdlIG11c3QgZnJlZSB0aGUgb3JpZ2luYWwgc2tiICovCisJCWlmIChscC0+dHhfc2tidWZmW3R4X2luZGV4XSkgeworCQkJcGNpX3VubWFwX3NpbmdsZShscC0+cGNpX2RldiwgbHAtPnR4X2RtYV9hZGRyW3R4X2luZGV4XSwKKwkJCQkgIAlscC0+dHhfc2tidWZmW3R4X2luZGV4XS0+bGVuLAorCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfaXJxIChscC0+dHhfc2tidWZmW3R4X2luZGV4XSk7CisJCQlscC0+dHhfc2tidWZmW3R4X2luZGV4XSA9IE5VTEw7CisJCQlscC0+dHhfZG1hX2FkZHJbdHhfaW5kZXhdID0gMDsKKwkJfQorCQlscC0+dHhfY29tcGxldGVfaWR4Kys7CisJCS8qQ09BTCB1cGRhdGUgdHggY29hbGVzY2luZyBwYXJhbWV0ZXJzICovCisJCWxwLT5jb2FsX2NvbmYudHhfcGFja2V0cysrOworCQlscC0+Y29hbF9jb25mLnR4X2J5dGVzICs9IGxwLT50eF9yaW5nW3R4X2luZGV4XS5idWZmX2NvdW50OwkKKworCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJCQlscC0+dHhfY29tcGxldGVfaWR4ID4gbHAtPnR4X2lkeCAtIE5VTV9UWF9CVUZGRVJTICsyKXsKKwkJCS8qIFRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsLCBjbGVhciB0YnVzeS4gKi8KKwkJCS8qIGxwLT50eF9mdWxsID0gMDsgKi8KKwkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQU1EODExMUVfTkFQSQorLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBkcml2ZXIgcmVjZWl2ZSBvcGVyYXRpb24gaW4gcG9sbGluZyBtb2RlICovCitzdGF0aWMgaW50IGFtZDgxMTFlX3J4X3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICogYnVkZ2V0KQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJ4X2luZGV4ID0gbHAtPnJ4X2lkeCAmIFJYX1JJTkdfRFJfTU9EX01BU0s7CisJdm9pZCBfX2lvbWVtICptbWlvID0gbHAtPm1taW87CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwqbmV3X3NrYjsKKwlpbnQgbWluX3BrdF9sZW4sIHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgaW50cjA7CisJaW50IG51bV9yeF9wa3QgPSAwOworCS8qaW50IG1heF9yeF9wa3QgPSBOVU1fUlhfQlVGRkVSUzsqLworCXNob3J0IHBrdF9sZW47CisjaWYgQU1EODExMUVfVkxBTl9UQUdfVVNFRAkJCisJc2hvcnQgdnRhZzsKKyNlbmRpZgorCWludCByeF9wa3RfbGltaXQgPSBkZXYtPnF1b3RhOworCQorCWRveyAgIAorCQkvKiBwcm9jZXNzIHJlY2VpdmUgcGFja2V0cyB1bnRpbCB3ZSB1c2UgdGhlIHF1b3RhKi8KKwkJLyogSWYgd2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKwkJd2hpbGUoMSkgeworCQkJc3RhdHVzID0gbGUxNl90b19jcHUobHAtPnJ4X3JpbmdbcnhfaW5kZXhdLnJ4X2ZsYWdzKTsKKwkJCWlmIChzdGF0dXMgJiBPV05fQklUKQorCQkJCWJyZWFrOworCisJCQkvKiAKKwkJCSAqIFRoZXJlIGlzIGEgdHJpY2t5IGVycm9yIG5vdGVkIGJ5IEpvaG4gTXVycGh5LAorCQkJICogPG11cmZAcGVyZnRlY2guY29tPiB0byBSdXNzIE5lbHNvbjogRXZlbiB3aXRoCisJCQkgKiBmdWxsLXNpemVkICogYnVmZmVycyBpdCdzIHBvc3NpYmxlIGZvciBhICAKKwkJCSAqIGphYmJlciBwYWNrZXQgdG8gdXNlIHR3byBidWZmZXJzLCB3aXRoIG9ubHkgCisJCQkgKiB0aGUgbGFzdCBjb3JyZWN0bHkgbm90aW5nIHRoZSBlcnJvci4KKwkJCSAqLworCisJCQlpZihzdGF0dXMgJiBFUlJfQklUKSB7CisJCQkJLyogcmVzZXRpbmcgZmxhZ3MgKi8KKwkJCQlscC0+cnhfcmluZ1tyeF9pbmRleF0ucnhfZmxhZ3MgJj0gUkVTRVRfUlhfRkxBR1M7CisJCQkJZ290byBlcnJfbmV4dF9wa3Q7CisJCQl9CisJCQkvKiBjaGVjayBmb3IgU1RQIGFuZCBFTlAgKi8KKwkJCWlmKCEoKHN0YXR1cyAmIFNUUF9CSVQpICYmIChzdGF0dXMgJiBFTlBfQklUKSkpeworCQkJCS8qIHJlc2V0aW5nIGZsYWdzICovCisJCQkJbHAtPnJ4X3JpbmdbcnhfaW5kZXhdLnJ4X2ZsYWdzICY9IFJFU0VUX1JYX0ZMQUdTOworCQkJCWdvdG8gZXJyX25leHRfcGt0OworCQkJfQorCQkJcGt0X2xlbiA9IGxlMTZfdG9fY3B1KGxwLT5yeF9yaW5nW3J4X2luZGV4XS5tc2dfY291bnQpIC0gNDsKKworI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQJCQorCQkJdnRhZyA9IHN0YXR1cyAmIFRUX01BU0s7CisJCQkvKk1BQyB3aWxsIHN0cmlwIHZsYW4gdGFnKi8gCisJCQlpZihscC0+dmxncnAgIT0gTlVMTCAmJiB2dGFnICE9MCkKKwkJCQltaW5fcGt0X2xlbiA9TUlOX1BLVF9MRU4gLSA0OworCQkJZWxzZQorI2VuZGlmCisJCQkJbWluX3BrdF9sZW4gPU1JTl9QS1RfTEVOOworCisJCQlpZiAocGt0X2xlbiA8IG1pbl9wa3RfbGVuKSB7CisJCQkJbHAtPnJ4X3JpbmdbcnhfaW5kZXhdLnJ4X2ZsYWdzICY9IFJFU0VUX1JYX0ZMQUdTOworCQkJCWxwLT5kcnZfcnhfZXJyb3JzKys7CisJCQkJZ290byBlcnJfbmV4dF9wa3Q7CisJCQl9CisJCQlpZigtLXJ4X3BrdF9saW1pdCA8IDApCisJCQkJZ290byByeF9ub3RfZW1wdHk7CisJCQlpZighKG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKGxwLT5yeF9idWZmX2xlbikpKXsKKwkJCQkvKiBpZiBhbGxvY2F0aW9uIGZhaWwsIAorCQkJCSAgIGlnbm9yZSB0aGF0IHBrdCBhbmQgZ28gdG8gbmV4dCBvbmUgKi8KKwkJCQlscC0+cnhfcmluZ1tyeF9pbmRleF0ucnhfZmxhZ3MgJj0gUkVTRVRfUlhfRkxBR1M7CisJCQkJbHAtPmRydl9yeF9lcnJvcnMrKzsKKwkJCQlnb3RvIGVycl9uZXh0X3BrdDsKKwkJCX0KKwkJCisJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCAyKTsKKwkJCXNrYiA9IGxwLT5yeF9za2J1ZmZbcnhfaW5kZXhdOworCQkJcGNpX3VubWFwX3NpbmdsZShscC0+cGNpX2RldixscC0+cnhfZG1hX2FkZHJbcnhfaW5kZXhdLAorCQkJCQkgbHAtPnJ4X2J1ZmZfbGVuLTIsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQlza2ItPmRldiA9IGRldjsKKwkJCWxwLT5yeF9za2J1ZmZbcnhfaW5kZXhdID0gbmV3X3NrYjsKKwkJCW5ld19za2ItPmRldiA9IGRldjsKKwkJCWxwLT5yeF9kbWFfYWRkcltyeF9pbmRleF0gPSBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2RldiwKKwkJCQkJCQkJICAgbmV3X3NrYi0+ZGF0YSwKKwkJCQkJCQkJICAgbHAtPnJ4X2J1ZmZfbGVuLTIsCisJCQkJCQkJCSAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCisjaWYgQU1EODExMUVfVkxBTl9UQUdfVVNFRAkJCisJCQlpZihscC0+dmxncnAgIT0gTlVMTCAmJiAodnRhZyA9PSBUVF9WTEFOX1RBR0dFRCkpeworCQkJCWFtZDgxMTFlX3ZsYW5fcngobHAsIHNrYiwKKwkJCQkJIGxlMTZfdG9fY3B1KGxwLT5yeF9yaW5nW3J4X2luZGV4XS50YWdfY3RybF9pbmZvKSk7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCQkvKkNPQUwgdXBkYXRlIHJ4IGNvYWxlc2NpbmcgcGFyYW1ldGVycyovCisJCQlscC0+Y29hbF9jb25mLnJ4X3BhY2tldHMrKzsKKwkJCWxwLT5jb2FsX2NvbmYucnhfYnl0ZXMgKz0gcGt0X2xlbjsJCisJCQludW1fcnhfcGt0Kys7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQorCQllcnJfbmV4dF9wa3Q6CQorCQkJbHAtPnJ4X3JpbmdbcnhfaW5kZXhdLmJ1ZmZfcGh5X2FkZHIKKwkJCQk9IGNwdV90b19sZTMyKGxwLT5yeF9kbWFfYWRkcltyeF9pbmRleF0pOworCQkJbHAtPnJ4X3JpbmdbcnhfaW5kZXhdLmJ1ZmZfY291bnQgPSAKKwkJCQljcHVfdG9fbGUxNihscC0+cnhfYnVmZl9sZW4tMik7CisJCQl3bWIoKTsKKwkJCWxwLT5yeF9yaW5nW3J4X2luZGV4XS5yeF9mbGFncyB8PSBjcHVfdG9fbGUxNihPV05fQklUKTsKKwkJCXJ4X2luZGV4ID0gKCsrbHAtPnJ4X2lkeCkgJiBSWF9SSU5HX0RSX01PRF9NQVNLOworCQl9CisJCS8qIENoZWNrIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIGZvciBtb3JlIHBhY2tldHMgaW4gdGhlIAorCQkgICBtZWFuIHRpbWUuIFByb2Nlc3MgdGhlbSBzaW5jZSB3ZSBoYXZlIG5vdCB1c2VkIHVwIG91ciBxdW90YS4qLworCisJCWludHIwID0gcmVhZGwobW1pbyArIElOVDApOworCQkvKkFjayByZWNlaXZlIHBhY2tldHMgKi8KKwkJd3JpdGVsKGludHIwICYgUklOVDAsbW1pbyArIElOVDApOworCisJfSB3aGlsZShpbnRyMCAmIFJJTlQwKTsKKworCS8qIFJlY2VpdmUgZGVzY3JpcHRvciBpcyBlbXB0eSBub3cgKi8KKwlkZXYtPnF1b3RhIC09IG51bV9yeF9wa3Q7CisJKmJ1ZGdldCAtPSBudW1fcnhfcGt0OworCW5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisJLyogZW5hYmxlIHJlY2VpdmUgaW50ZXJydXB0ICovCisJd3JpdGVsKFZBTDB8UklOVEVOMCwgbW1pbyArIElOVEVOMCk7CisJd3JpdGVsKFZBTDIgfCBSRE1EMCwgbW1pbyArIENNRDApOworCXJldHVybiAwOworcnhfbm90X2VtcHR5OgorCS8qIERvIG5vdCBjYWxsIGEgbmV0aWZfcnhfY29tcGxldGUgKi8KKwlkZXYtPnF1b3RhIC09IG51bV9yeF9wa3Q7CQorCSpidWRnZXQgLT0gbnVtX3J4X3BrdDsKKwlyZXR1cm4gMTsKKworCQorfQorCisjZWxzZQorLyogCitUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgdGhlIG93bmVyc2hpcCBvZiByZWNlaXZlIGJ1ZmZlcnMgYW5kIGRlc2NyaXB0b3JzLiBJdCB3aWxsIGluZGljYXRlIHRvIGtlcm5lbCB1cCB0byBoYWxmIHRoZSBudW1iZXIgb2YgbWF4aW11bSByZWNlaXZlIGJ1ZmZlcnMgaW4gdGhlIGRlc2NyaXB0b3IgcmluZywgaW4gYSBzaW5nbGUgcmVjZWl2ZSBpbnRlcnJ1cHQuIEl0IHdpbGwgYWxzbyByZXBsZW5pc2ggdGhlIGRlc2NyaXB0b3JzIHdpdGggbmV3IHNrYnMuCisqLworc3RhdGljIGludCBhbWQ4MTExZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwqbmV3X3NrYjsKKwlpbnQgcnhfaW5kZXggPSBscC0+cnhfaWR4ICYgUlhfUklOR19EUl9NT0RfTUFTSzsKKwlpbnQgbWluX3BrdF9sZW4sIHN0YXR1czsKKwlpbnQgbnVtX3J4X3BrdCA9IDA7CisJaW50IG1heF9yeF9wa3QgPSBOVU1fUlhfQlVGRkVSUzsKKwlzaG9ydCBwa3RfbGVuOworI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQJCQorCXNob3J0IHZ0YWc7CisjZW5kaWYKKwkKKwkvKiBJZiB3ZSBvd24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworCXdoaWxlKCsrbnVtX3J4X3BrdCA8PSBtYXhfcnhfcGt0KXsKKwkJc3RhdHVzID0gbGUxNl90b19jcHUobHAtPnJ4X3JpbmdbcnhfaW5kZXhdLnJ4X2ZsYWdzKTsKKwkJaWYoc3RhdHVzICYgT1dOX0JJVCkKKwkJCXJldHVybiAwOworCSAgICAgICAKKwkJLyogY2hlY2sgaWYgZXJyIHN1bW1hcnkgYml0IGlzIHNldCAqLyAKKwkJaWYoc3RhdHVzICYgRVJSX0JJVCl7CisJCQkvKiAKKwkJCSAqIFRoZXJlIGlzIGEgdHJpY2t5IGVycm9yIG5vdGVkIGJ5IEpvaG4gTXVycGh5LAorCQkJICogPG11cmZAcGVyZnRlY2guY29tPiB0byBSdXNzIE5lbHNvbjogRXZlbiB3aXRoIGZ1bGwtc2l6ZWQKKwkJCSAqIGJ1ZmZlcnMgaXQncyBwb3NzaWJsZSBmb3IgYSBqYWJiZXIgcGFja2V0IHRvIHVzZSB0d28KKwkJCSAqIGJ1ZmZlcnMsIHdpdGggb25seSB0aGUgbGFzdCBjb3JyZWN0bHkgbm90aW5nIHRoZSBlcnJvci4JCQkgKi8KKwkJCS8qIHJlc2V0aW5nIGZsYWdzICovCisJCQlscC0+cnhfcmluZ1tyeF9pbmRleF0ucnhfZmxhZ3MgJj0gUkVTRVRfUlhfRkxBR1M7CisJCQlnb3RvIGVycl9uZXh0X3BrdDsKKwkJfQorCQkvKiBjaGVjayBmb3IgU1RQIGFuZCBFTlAgKi8KKwkJaWYoISgoc3RhdHVzICYgU1RQX0JJVCkgJiYgKHN0YXR1cyAmIEVOUF9CSVQpKSl7CisJCQkvKiByZXNldGluZyBmbGFncyAqLworCQkJbHAtPnJ4X3JpbmdbcnhfaW5kZXhdLnJ4X2ZsYWdzICY9IFJFU0VUX1JYX0ZMQUdTOworCQkJZ290byBlcnJfbmV4dF9wa3Q7CisJCX0KKwkJcGt0X2xlbiA9IGxlMTZfdG9fY3B1KGxwLT5yeF9yaW5nW3J4X2luZGV4XS5tc2dfY291bnQpIC0gNDsKKworI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQJCQorCQl2dGFnID0gc3RhdHVzICYgVFRfTUFTSzsKKwkJLypNQUMgd2lsbCBzdHJpcCB2bGFuIHRhZyovIAorCQlpZihscC0+dmxncnAgIT0gTlVMTCAmJiB2dGFnICE9MCkKKwkJCW1pbl9wa3RfbGVuID1NSU5fUEtUX0xFTiAtIDQ7CisJCWVsc2UKKyNlbmRpZgorCQkJbWluX3BrdF9sZW4gPU1JTl9QS1RfTEVOOworCisJCWlmIChwa3RfbGVuIDwgbWluX3BrdF9sZW4pIHsKKwkJCWxwLT5yeF9yaW5nW3J4X2luZGV4XS5yeF9mbGFncyAmPSBSRVNFVF9SWF9GTEFHUzsKKwkJCWxwLT5kcnZfcnhfZXJyb3JzKys7CisJCQlnb3RvIGVycl9uZXh0X3BrdDsKKwkJfQorCQlpZighKG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKGxwLT5yeF9idWZmX2xlbikpKXsKKwkJCS8qIGlmIGFsbG9jYXRpb24gZmFpbCwgCisJCQkJaWdub3JlIHRoYXQgcGt0IGFuZCBnbyB0byBuZXh0IG9uZSAqLworCQkJbHAtPnJ4X3JpbmdbcnhfaW5kZXhdLnJ4X2ZsYWdzICY9IFJFU0VUX1JYX0ZMQUdTOworCQkJbHAtPmRydl9yeF9lcnJvcnMrKzsKKwkJCWdvdG8gZXJyX25leHRfcGt0OworCQl9CisJCQorCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCAyKTsKKwkJc2tiID0gbHAtPnJ4X3NrYnVmZltyeF9pbmRleF07CisJCXBjaV91bm1hcF9zaW5nbGUobHAtPnBjaV9kZXYsbHAtPnJ4X2RtYV9hZGRyW3J4X2luZGV4XSwKKwkJCWxwLT5yeF9idWZmX2xlbi0yLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCXNrYi0+ZGV2ID0gZGV2OworCQlscC0+cnhfc2tidWZmW3J4X2luZGV4XSA9IG5ld19za2I7CisJCW5ld19za2ItPmRldiA9IGRldjsKKwkJbHAtPnJ4X2RtYV9hZGRyW3J4X2luZGV4XSA9IHBjaV9tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LAorCQkJbmV3X3NrYi0+ZGF0YSwgbHAtPnJ4X2J1ZmZfbGVuLTIsUENJX0RNQV9GUk9NREVWSUNFKTsKKwkKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQJCQkJCisJCWlmKGxwLT52bGdycCAhPSBOVUxMICYmICh2dGFnID09IFRUX1ZMQU5fVEFHR0VEKSl7CisJCQlhbWQ4MTExZV92bGFuX3J4KGxwLCBza2IsCisJCQkJIGxlMTZfdG9fY3B1KGxwLT5yeF9yaW5nW3J4X2luZGV4XS50YWdfY3RybF9pbmZvKSk7CisJCX0gZWxzZQorI2VuZGlmCisJCQkKKwkJCW5ldGlmX3J4IChza2IpOworCQkJLypDT0FMIHVwZGF0ZSByeCBjb2FsZXNjaW5nIHBhcmFtZXRlcnMqLworCQkJbHAtPmNvYWxfY29uZi5yeF9wYWNrZXRzKys7CisJCQlscC0+Y29hbF9jb25mLnJ4X2J5dGVzICs9IHBrdF9sZW47CQorCisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQorZXJyX25leHRfcGt0OgorCQlscC0+cnhfcmluZ1tyeF9pbmRleF0uYnVmZl9waHlfYWRkcgorCQkJID0gY3B1X3RvX2xlMzIobHAtPnJ4X2RtYV9hZGRyW3J4X2luZGV4XSk7CisJCWxwLT5yeF9yaW5nW3J4X2luZGV4XS5idWZmX2NvdW50ID0gCisJCQkJY3B1X3RvX2xlMTYobHAtPnJ4X2J1ZmZfbGVuLTIpOworCQl3bWIoKTsKKwkJbHAtPnJ4X3JpbmdbcnhfaW5kZXhdLnJ4X2ZsYWdzIHw9IGNwdV90b19sZTE2KE9XTl9CSVQpOworCQlyeF9pbmRleCA9ICgrK2xwLT5yeF9pZHgpICYgUlhfUklOR19EUl9NT0RfTUFTSzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfQU1EODExMUVfTkFQSSAqLworLyogCitUaGlzIGZ1bmN0aW9uIHdpbGwgaW5kaWNhdGUgdGhlIGxpbmsgc3RhdHVzIHRvIHRoZSBrZXJuZWwuCisqLworc3RhdGljIGludCBhbWQ4MTExZV9saW5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQorewkKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBzdGF0dXMwLHNwZWVkOworCisJLyogcmVhZCB0aGUgbGluayBjaGFuZ2UgKi8KKyAgICAgCXN0YXR1czAgPSByZWFkbChscC0+bW1pbyArIFNUQVQwKTsKKwkKKwlpZihzdGF0dXMwICYgTElOS19TVEFUUyl7CisJCWlmKHN0YXR1czAgJiBBVVRPTkVHX0NPTVBMRVRFKQorCQkJbHAtPmxpbmtfY29uZmlnLmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwkJZWxzZSAKKwkJCWxwLT5saW5rX2NvbmZpZy5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCisJCWlmKHN0YXR1czAgJiBGVUxMX0RQTFgpCisJCQlscC0+bGlua19jb25maWcuZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWVsc2UgCisJCQlscC0+bGlua19jb25maWcuZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCXNwZWVkID0gKHN0YXR1czAgJiBTUEVFRF9NQVNLKSA+PiA3OworCQlpZihzcGVlZCA9PSBQSFlfU1BFRURfMTApCisJCQlscC0+bGlua19jb25maWcuc3BlZWQgPSBTUEVFRF8xMDsKKwkJZWxzZSBpZihzcGVlZCA9PSBQSFlfU1BFRURfMTAwKQorCQkJbHAtPmxpbmtfY29uZmlnLnNwZWVkID0gU1BFRURfMTAwOworCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGlzIFVwLiBTcGVlZCBpcyAlcyBNYnBzICVzIER1cGxleFxuIiwJCQlkZXYtPm5hbWUsCisJCSAgICAgICAobHAtPmxpbmtfY29uZmlnLnNwZWVkID09IFNQRUVEXzEwMCkgPyAiMTAwIjogIjEwIiwgCisJCSAgICAgICAobHAtPmxpbmtfY29uZmlnLmR1cGxleCA9PSBEVVBMRVhfRlVMTCk/ICJGdWxsIjogIkhhbGYiKTsgCisJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwl9CisJZWxzZXsJCisJCWxwLT5saW5rX2NvbmZpZy5zcGVlZCA9IFNQRUVEX0lOVkFMSUQ7CisJCWxwLT5saW5rX2NvbmZpZy5kdXBsZXggPSBEVVBMRVhfSU5WQUxJRDsKKwkJbHAtPmxpbmtfY29uZmlnLmF1dG9uZWcgPSBBVVRPTkVHX0lOVkFMSUQ7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGlzIERvd24uXG4iLGRldi0+bmFtZSk7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJfQorCQkKKwlyZXR1cm4gMDsKK30KKy8qCitUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBtaWIgY291bnRlcnMuIAkgCisqLworc3RhdGljIGludCBhbWQ4MTExZV9yZWFkX21pYih2b2lkIF9faW9tZW0gKm1taW8sIHU4IE1JQl9DT1VOVEVSKQoreworCXVuc2lnbmVkIGludCAgc3RhdHVzOworCXVuc2lnbmVkICBpbnQgZGF0YTsKKwl1bnNpZ25lZCBpbnQgcmVwZWF0ID0gUkVQRUFUX0NOVDsKKworCXdyaXRldyggTUlCX1JEX0NNRCB8IE1JQl9DT1VOVEVSLCBtbWlvICsgTUlCX0FERFIpOworCWRvIHsKKwkJc3RhdHVzID0gcmVhZHcobW1pbyArIE1JQl9BRERSKTsKKwkJdWRlbGF5KDIpOwkvKiBjb250cm9sbGVyIHRha2VzIE1BWCAyIHVzIHRvIGdldCBtaWIgZGF0YSAqLworCX0KKwl3aGlsZSAoLS1yZXBlYXQgJiYgKHN0YXR1cyAmIE1JQl9DTURfQUNUSVZFKSk7CisKKwlkYXRhID0gcmVhZGwobW1pbyArIE1JQl9EQVRBKTsKKwlyZXR1cm4gZGF0YTsKK30KKworLyoKK1RoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIG1pYiByZWdpc3RlcnMgYW5kIHJldHVybnMgdGhlIGhhcmR3YXJlIHN0YXRpc3RpY3MuIEl0ICB1cGRhdGVzIHByZXZpb3VzIGludGVybmFsIGRyaXZlciBzdGF0aXN0aWNzIHdpdGggbmV3IHZhbHVlcy4KKyovIAorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphbWQ4MTExZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBscC0+bW1pbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8qIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwcmV2X3N0YXRzID0gJmxwLT5wcmV2X3N0YXRzOyAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiBuZXdfc3RhdHMgPSAmbHAtPnN0YXRzOworCQorCWlmKCFscC0+b3BlbmVkKQorCQlyZXR1cm4gJmxwLT5zdGF0czsJCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZscC0+bG9jaywgZmxhZ3MpOworCisJLyogc3RhdHMucnhfcGFja2V0cyAqLworCW5ld19zdGF0cy0+cnhfcGFja2V0cyA9IGFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHJjdl9icm9hZGNhc3RfcGt0cykrCisJCQkJYW1kODExMWVfcmVhZF9taWIobW1pbywgcmN2X211bHRpY2FzdF9wa3RzKSsKKwkJCQlhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3ZfdW5pY2FzdF9wa3RzKTsKKworCS8qIHN0YXRzLnR4X3BhY2tldHMgKi8KKwluZXdfc3RhdHMtPnR4X3BhY2tldHMgPSBhbWQ4MTExZV9yZWFkX21pYihtbWlvLCB4bXRfcGFja2V0cyk7CisKKwkvKnN0YXRzLnJ4X2J5dGVzICovCisJbmV3X3N0YXRzLT5yeF9ieXRlcyA9IGFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHJjdl9vY3RldHMpOworCisJLyogc3RhdHMudHhfYnl0ZXMgKi8KKwluZXdfc3RhdHMtPnR4X2J5dGVzID0gYW1kODExMWVfcmVhZF9taWIobW1pbywgeG10X29jdGV0cyk7CisKKwkvKiBzdGF0cy5yeF9lcnJvcnMgKi8KKwkvKiBodyBlcnJvcnMgKyBlcnJvcnMgZHJpdmVyIHJlcG9ydGVkICovCisJbmV3X3N0YXRzLT5yeF9lcnJvcnMgPSBhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3ZfdW5kZXJzaXplX3BrdHMpKworCQkJCWFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHJjdl9mcmFnbWVudHMpKworCQkJCWFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHJjdl9qYWJiZXJzKSsKKwkJCQlhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3ZfYWxpZ25tZW50X2Vycm9ycykrCisJCQkJYW1kODExMWVfcmVhZF9taWIobW1pbywgcmN2X2Zjc19lcnJvcnMpKworCQkJCWFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHJjdl9taXNzX3BrdHMpKworCQkJCWxwLT5kcnZfcnhfZXJyb3JzOworCisJLyogc3RhdHMudHhfZXJyb3JzICovCisJbmV3X3N0YXRzLT50eF9lcnJvcnMgPSBhbWQ4MTExZV9yZWFkX21pYihtbWlvLCB4bXRfdW5kZXJydW5fcGt0cyk7CisKKwkvKiBzdGF0cy5yeF9kcm9wcGVkKi8KKwluZXdfc3RhdHMtPnJ4X2Ryb3BwZWQgPSBhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3ZfbWlzc19wa3RzKTsKKworCS8qIHN0YXRzLnR4X2Ryb3BwZWQqLworCW5ld19zdGF0cy0+dHhfZHJvcHBlZCA9IGFtZDgxMTFlX3JlYWRfbWliKG1taW8sICB4bXRfdW5kZXJydW5fcGt0cyk7CisKKwkvKiBzdGF0cy5tdWx0aWNhc3QqLworCW5ld19zdGF0cy0+bXVsdGljYXN0ID0gYW1kODExMWVfcmVhZF9taWIobW1pbywgcmN2X211bHRpY2FzdF9wa3RzKTsKKworCS8qIHN0YXRzLmNvbGxpc2lvbnMqLworCW5ld19zdGF0cy0+Y29sbGlzaW9ucyA9IGFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHhtdF9jb2xsaXNpb25zKTsKKworCS8qIHN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMqLworCW5ld19zdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyA9IAorCQlhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3ZfdW5kZXJzaXplX3BrdHMpKworCQlhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3Zfb3ZlcnNpemVfcGt0cyk7CisKKwkvKiBzdGF0cy5yeF9vdmVyX2Vycm9ycyovCisJbmV3X3N0YXRzLT5yeF9vdmVyX2Vycm9ycyA9IGFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHJjdl9taXNzX3BrdHMpOworCisJLyogc3RhdHMucnhfY3JjX2Vycm9ycyovCisJbmV3X3N0YXRzLT5yeF9jcmNfZXJyb3JzID0gYW1kODExMWVfcmVhZF9taWIobW1pbywgcmN2X2Zjc19lcnJvcnMpOworCisJLyogc3RhdHMucnhfZnJhbWVfZXJyb3JzKi8KKwluZXdfc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyA9CisJCWFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHJjdl9hbGlnbm1lbnRfZXJyb3JzKTsKKworCS8qIHN0YXRzLnJ4X2ZpZm9fZXJyb3JzICovCisJbmV3X3N0YXRzLT5yeF9maWZvX2Vycm9ycyA9IGFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHJjdl9taXNzX3BrdHMpOworCisJLyogc3RhdHMucnhfbWlzc2VkX2Vycm9ycyAqLworCW5ld19zdGF0cy0+cnhfbWlzc2VkX2Vycm9ycyA9IGFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHJjdl9taXNzX3BrdHMpOworCisJLyogc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMqLworCW5ld19zdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgPSAKKwkJYW1kODExMWVfcmVhZF9taWIobW1pbywgeG10X2V4Y2Vzc2l2ZV9jb2xsaXNpb24pOworCisJLyogc3RhdHMudHhfY2Fycmllcl9lcnJvcnMqLworCW5ld19zdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMgPSAKKwkJYW1kODExMWVfcmVhZF9taWIobW1pbywgeG10X2xvc3NfY2Fycmllcik7CisKKwkvKiBzdGF0cy50eF9maWZvX2Vycm9ycyovCisJbmV3X3N0YXRzLT50eF9maWZvX2Vycm9ycyA9IGFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHhtdF91bmRlcnJ1bl9wa3RzKTsKKworCS8qIHN0YXRzLnR4X3dpbmRvd19lcnJvcnMqLworCW5ld19zdGF0cy0+dHhfd2luZG93X2Vycm9ycyA9CisJCWFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHhtdF9sYXRlX2NvbGxpc2lvbik7CisKKwkvKiBSZXNldCB0aGUgbWlicyBmb3IgY29sbGVjdGluZyBuZXcgc3RhdGlzdGljcyAqLworCS8qIHdyaXRldyhNSUJfQ0xFQVIsIG1taW8gKyBNSUJfQUREUik7Ki8KKwkJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbmV3X3N0YXRzOworfQorLyogVGhpcyBmdW5jdGlvbiByZWNhbGN1bGF0ZSB0aGUgaW50ZXJ1cHQgY29hbGVzY2luZyAgbW9kZSBvbiBldmVyeSBpbnRlcnJ1cHQgCithY2NvcmRpbmcgdG8gdGhlIGRhdGFyYXRlIGFuZCB0aGUgcGFja2V0IHJhdGUuCisqLworc3RhdGljIGludCBhbWQ4MTExZV9jYWxjX2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYW1kODExMWVfY29hbGVzY2VfY29uZiAqIGNvYWxfY29uZiA9ICZscC0+Y29hbF9jb25mOworCWludCB0eF9wa3RfcmF0ZTsKKwlpbnQgcnhfcGt0X3JhdGU7CisJaW50IHR4X2RhdGFfcmF0ZTsKKwlpbnQgcnhfZGF0YV9yYXRlOworCWludCByeF9wa3Rfc2l6ZTsKKwlpbnQgdHhfcGt0X3NpemU7CisKKwl0eF9wa3RfcmF0ZSA9IGNvYWxfY29uZi0+dHhfcGFja2V0cyAtIGNvYWxfY29uZi0+dHhfcHJldl9wYWNrZXRzOworCWNvYWxfY29uZi0+dHhfcHJldl9wYWNrZXRzID0gIGNvYWxfY29uZi0+dHhfcGFja2V0czsKKwkKKwl0eF9kYXRhX3JhdGUgPSBjb2FsX2NvbmYtPnR4X2J5dGVzIC0gY29hbF9jb25mLT50eF9wcmV2X2J5dGVzOworCWNvYWxfY29uZi0+dHhfcHJldl9ieXRlcyA9ICBjb2FsX2NvbmYtPnR4X2J5dGVzOworCQorCXJ4X3BrdF9yYXRlID0gY29hbF9jb25mLT5yeF9wYWNrZXRzIC0gY29hbF9jb25mLT5yeF9wcmV2X3BhY2tldHM7CisJY29hbF9jb25mLT5yeF9wcmV2X3BhY2tldHMgPSAgY29hbF9jb25mLT5yeF9wYWNrZXRzOworCQorCXJ4X2RhdGFfcmF0ZSA9IGNvYWxfY29uZi0+cnhfYnl0ZXMgLSBjb2FsX2NvbmYtPnJ4X3ByZXZfYnl0ZXM7CisJY29hbF9jb25mLT5yeF9wcmV2X2J5dGVzID0gIGNvYWxfY29uZi0+cnhfYnl0ZXM7CisJCisJaWYocnhfcGt0X3JhdGUgPCA4MDApeworCQlpZihjb2FsX2NvbmYtPnJ4X2NvYWxfdHlwZSAhPSBOT19DT0FMRVNDRSl7CisJCQkKKwkJCWNvYWxfY29uZi0+cnhfdGltZW91dCA9IDB4MDsKKwkJCWNvYWxfY29uZi0+cnhfZXZlbnRfY291bnQgPSAwOworCQkJYW1kODExMWVfc2V0X2NvYWxlc2NlKGRldixSWF9JTlRSX0NPQUwpOworCQkJY29hbF9jb25mLT5yeF9jb2FsX3R5cGUgPSBOT19DT0FMRVNDRTsKKwkJfQorCX0KKwllbHNleworCQorCQlyeF9wa3Rfc2l6ZSA9IHJ4X2RhdGFfcmF0ZS9yeF9wa3RfcmF0ZTsKKwkJaWYgKHJ4X3BrdF9zaXplIDwgMTI4KXsKKwkJCWlmKGNvYWxfY29uZi0+cnhfY29hbF90eXBlICE9IE5PX0NPQUxFU0NFKXsKKwkJCQorCQkJCWNvYWxfY29uZi0+cnhfdGltZW91dCA9IDA7CisJCQkJY29hbF9jb25mLT5yeF9ldmVudF9jb3VudCA9IDA7CisJCQkJYW1kODExMWVfc2V0X2NvYWxlc2NlKGRldixSWF9JTlRSX0NPQUwpOworCQkJCWNvYWxfY29uZi0+cnhfY29hbF90eXBlID0gTk9fQ09BTEVTQ0U7CisJCQl9CisKKwkJfQorCQllbHNlIGlmICggKHJ4X3BrdF9zaXplID49IDEyOCkgJiYgKHJ4X3BrdF9zaXplIDwgNTEyKSApeworCQorCQkJaWYoY29hbF9jb25mLT5yeF9jb2FsX3R5cGUgIT0gIExPV19DT0FMRVNDRSl7CisJCQkJY29hbF9jb25mLT5yeF90aW1lb3V0ID0gMTsKKwkJCQljb2FsX2NvbmYtPnJ4X2V2ZW50X2NvdW50ID0gNDsKKwkJCQlhbWQ4MTExZV9zZXRfY29hbGVzY2UoZGV2LFJYX0lOVFJfQ09BTCk7CisJCQkJY29hbF9jb25mLT5yeF9jb2FsX3R5cGUgPSBMT1dfQ09BTEVTQ0U7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoKHJ4X3BrdF9zaXplID49IDUxMikgJiYgKHJ4X3BrdF9zaXplIDwgMTAyNCkpeworCQkJCisJCQlpZihjb2FsX2NvbmYtPnJ4X2NvYWxfdHlwZSAhPSAgTUVESVVNX0NPQUxFU0NFKXsKKwkJCQljb2FsX2NvbmYtPnJ4X3RpbWVvdXQgPSAxOworCQkJCWNvYWxfY29uZi0+cnhfZXZlbnRfY291bnQgPSA0OworCQkJCWFtZDgxMTFlX3NldF9jb2FsZXNjZShkZXYsUlhfSU5UUl9DT0FMKTsKKwkJCQljb2FsX2NvbmYtPnJ4X2NvYWxfdHlwZSA9IE1FRElVTV9DT0FMRVNDRTsKKwkJCX0JCQorCQkJCQorCQl9CisJCWVsc2UgaWYocnhfcGt0X3NpemUgPj0gMTAyNCl7CisJCQlpZihjb2FsX2NvbmYtPnJ4X2NvYWxfdHlwZSAhPSAgSElHSF9DT0FMRVNDRSl7CisJCQkJY29hbF9jb25mLT5yeF90aW1lb3V0ID0gMjsKKwkJCQljb2FsX2NvbmYtPnJ4X2V2ZW50X2NvdW50ID0gMzsKKwkJCQlhbWQ4MTExZV9zZXRfY29hbGVzY2UoZGV2LFJYX0lOVFJfQ09BTCk7CisJCQkJY29hbF9jb25mLT5yeF9jb2FsX3R5cGUgPSBISUdIX0NPQUxFU0NFOworCQkJfQkJCisJCX0KKwl9CisgICAgCS8qIE5PVyBGT1IgVFggSU5UUiBDT0FMRVNDICovCisJaWYodHhfcGt0X3JhdGUgPCA4MDApeworCQlpZihjb2FsX2NvbmYtPnR4X2NvYWxfdHlwZSAhPSBOT19DT0FMRVNDRSl7CisJCQkKKwkJCWNvYWxfY29uZi0+dHhfdGltZW91dCA9IDB4MDsKKwkJCWNvYWxfY29uZi0+dHhfZXZlbnRfY291bnQgPSAwOworCQkJYW1kODExMWVfc2V0X2NvYWxlc2NlKGRldixUWF9JTlRSX0NPQUwpOworCQkJY29hbF9jb25mLT50eF9jb2FsX3R5cGUgPSBOT19DT0FMRVNDRTsKKwkJfQorCX0KKwllbHNleworCQorCQl0eF9wa3Rfc2l6ZSA9IHR4X2RhdGFfcmF0ZS90eF9wa3RfcmF0ZTsKKwkJaWYgKHR4X3BrdF9zaXplIDwgMTI4KXsKKwkJCisJCQlpZihjb2FsX2NvbmYtPnR4X2NvYWxfdHlwZSAhPSBOT19DT0FMRVNDRSl7CisJCQkKKwkJCQljb2FsX2NvbmYtPnR4X3RpbWVvdXQgPSAwOworCQkJCWNvYWxfY29uZi0+dHhfZXZlbnRfY291bnQgPSAwOworCQkJCWFtZDgxMTFlX3NldF9jb2FsZXNjZShkZXYsVFhfSU5UUl9DT0FMKTsKKwkJCQljb2FsX2NvbmYtPnR4X2NvYWxfdHlwZSA9IE5PX0NPQUxFU0NFOworCQkJfQorCisJCX0KKwkJZWxzZSBpZiAoICh0eF9wa3Rfc2l6ZSA+PSAxMjgpICYmICh0eF9wa3Rfc2l6ZSA8IDUxMikgKXsKKwkKKwkJCWlmKGNvYWxfY29uZi0+dHhfY29hbF90eXBlICE9ICBMT1dfQ09BTEVTQ0UpeworCQkJCWNvYWxfY29uZi0+dHhfdGltZW91dCA9IDE7CisJCQkJY29hbF9jb25mLT50eF9ldmVudF9jb3VudCA9IDI7CisJCQkJYW1kODExMWVfc2V0X2NvYWxlc2NlKGRldixUWF9JTlRSX0NPQUwpOworCQkJCWNvYWxfY29uZi0+dHhfY29hbF90eXBlID0gTE9XX0NPQUxFU0NFOworCisJCQl9CisJCX0KKwkJZWxzZSBpZiAoKHR4X3BrdF9zaXplID49IDUxMikgJiYgKHR4X3BrdF9zaXplIDwgMTAyNCkpeworCQkJCisJCQlpZihjb2FsX2NvbmYtPnR4X2NvYWxfdHlwZSAhPSAgTUVESVVNX0NPQUxFU0NFKXsKKwkJCQljb2FsX2NvbmYtPnR4X3RpbWVvdXQgPSAyOworCQkJCWNvYWxfY29uZi0+dHhfZXZlbnRfY291bnQgPSA1OworCQkJCWFtZDgxMTFlX3NldF9jb2FsZXNjZShkZXYsVFhfSU5UUl9DT0FMKTsKKwkJCQljb2FsX2NvbmYtPnR4X2NvYWxfdHlwZSA9IE1FRElVTV9DT0FMRVNDRTsKKwkJCX0JCQorCQkJCQorCQl9CisJCWVsc2UgaWYodHhfcGt0X3NpemUgPj0gMTAyNCl7CisJCQlpZiAodHhfcGt0X3NpemUgPj0gMTAyNCl7CisJCQkJaWYoY29hbF9jb25mLT50eF9jb2FsX3R5cGUgIT0gIEhJR0hfQ09BTEVTQ0UpeworCQkJCQljb2FsX2NvbmYtPnR4X3RpbWVvdXQgPSA0OworCQkJCQljb2FsX2NvbmYtPnR4X2V2ZW50X2NvdW50ID0gODsKKwkJCQkJYW1kODExMWVfc2V0X2NvYWxlc2NlKGRldixUWF9JTlRSX0NPQUwpOworCQkJCQljb2FsX2NvbmYtPnR4X2NvYWxfdHlwZSA9IEhJR0hfQ09BTEVTQ0U7CisJCQkJfQkJCisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7CisKK30KKy8qCitUaGlzIGlzIGRldmljZSBpbnRlcnJ1cHQgZnVuY3Rpb24uIEl0IGhhbmRsZXMgdHJhbnNtaXQsIHJlY2VpdmUsbGluayBjaGFuZ2UgYW5kIGhhcmR3YXJlIHRpbWVyIGludGVycnVwdHMuCisqLworc3RhdGljIGlycXJldHVybl90IGFtZDgxMTFlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCisJc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICptbWlvID0gbHAtPm1taW87CisJdW5zaWduZWQgaW50IGludHIwOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMTsKKworCWlmKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlpZiAocmVncykgc3Bpbl9sb2NrICgmbHAtPmxvY2spOworCS8qIGRpc2FibGluZyBpbnRlcnJ1cHQgKi8KKwl3cml0ZWwoSU5UUkVOLCBtbWlvICsgQ01EMCk7CisKKwkvKiBSZWFkIGludGVycnVwdCBzdGF0dXMgKi8KKwlpbnRyMCA9IHJlYWRsKG1taW8gKyBJTlQwKTsKKworCS8qIFByb2Nlc3MgYWxsIHRoZSBJTlQgZXZlbnQgdW50aWwgSU5UUiBiaXQgaXMgY2xlYXIuICovCisKKwlpZiAoIShpbnRyMCAmIElOVFIpKXsKKwkJaGFuZGxlZCA9IDA7CisJCWdvdG8gZXJyX25vX2ludGVycnVwdDsKKwl9CisJCSAKKwkvKiBDdXJyZW50IGRyaXZlciBwcm9jZXNzZXMgNCBpbnRlcnJ1cHRzIDogUklOVCxUSU5ULExDSU5ULFNUSU5UICovCisJd3JpdGVsKGludHIwLCBtbWlvICsgSU5UMCk7CisKKwkvKiBDaGVjayBpZiBSZWNlaXZlIEludGVycnVwdCBoYXMgb2NjdXJyZWQuICovCisjaWYgQ09ORklHX0FNRDgxMTFFX05BUEkKKwlpZihpbnRyMCAmIFJJTlQwKXsKKwkJaWYobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChkZXYpKXsKKwkJCS8qIERpc2FibGUgcmVjZWl2ZSBpbnRlcnVwdHMgKi8KKwkJCXdyaXRlbChSSU5URU4wLCBtbWlvICsgSU5URU4wKTsKKwkJCS8qIFNjaGVkdWxlIGEgcG9sbGluZyByb3V0aW5lICovCisJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJCX0KKwkJZWxzZSB7CisJCQlwcmludGsoIioqKioqKioqKioqKkRyaXZlciBidWchIFwKKwkJCQlpbnRlcnJ1cHQgd2hpbGUgaW4gcG9sbFxuIik7CisJCQkvKiBGaXggYnkgZGlzYWJsaW5nIGludGVycnVwdHMgKi8KKwkJCXdyaXRlbChSSU5UMCwgbW1pbyArIElOVDApOworCQl9CisJfQorI2Vsc2UKKwlpZihpbnRyMCAmIFJJTlQwKXsKKwkJYW1kODExMWVfcngoZGV2KTsKKwkJd3JpdGVsKFZBTDIgfCBSRE1EMCwgbW1pbyArIENNRDApOworCX0KKyNlbmRpZiAvKiBDT05GSUdfQU1EODExMUVfTkFQSSAqLworCS8qIENoZWNrIGlmICBUcmFuc21pdCBJbnRlcnJ1cHQgaGFzIG9jY3VycmVkLiAqLworCWlmKGludHIwICYgVElOVDApCisJCWFtZDgxMTFlX3R4KGRldik7CisJCQorCS8qIENoZWNrIGlmICBMaW5rIENoYW5nZSBJbnRlcnJ1cHQgaGFzIG9jY3VycmVkLiAqLworCWlmIChpbnRyMCAmIExDSU5UKQorCQlhbWQ4MTExZV9saW5rX2NoYW5nZShkZXYpOworCisJLyogQ2hlY2sgaWYgSGFyZHdhcmUgVGltZXIgSW50ZXJydXB0IGhhcyBvY2N1cnJlZC4gKi8KKwlpZiAoaW50cjAgJiBTVElOVCkKKwkJYW1kODExMWVfY2FsY19jb2FsZXNjZShkZXYpOworCitlcnJfbm9faW50ZXJydXB0OgorCXdyaXRlbCggVkFMMCB8IElOVFJFTixtbWlvICsgQ01EMCk7CisJCisJaWYgKHJlZ3MpIHNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgYW1kODExMWVfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreyAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOyAKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWFtZDgxMTFlX2ludGVycnVwdCgwLCBkZXYsIE5VTEwpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgCit9IAorI2VuZGlmCisKKworLyoKK1RoaXMgZnVuY3Rpb24gY2xvc2VzIHRoZSBuZXR3b3JrIGludGVyZmFjZSBhbmQgdXBkYXRlcyB0aGUgc3RhdGlzdGljcyBzbyB0aGF0IG1vc3QgcmVjZW50IHN0YXRpc3RpY3Mgd2lsbCBiZSBhdmFpbGFibGUgYWZ0ZXIgdGhlIGludGVyZmFjZSBpcyBkb3duLgorKi8KK3N0YXRpYyBpbnQgYW1kODExMWVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCQorCWFtZDgxMTFlX2Rpc2FibGVfaW50ZXJydXB0KGxwKTsKKwlhbWQ4MTExZV9zdG9wX2NoaXAobHApOworCWFtZDgxMTFlX2ZyZWVfcmluZyhscCk7CisJCisJbmV0aWZfY2Fycmllcl9vZmYobHAtPmFtZDgxMTFlX25ldF9kZXYpOworCisJLyogRGVsZXRlIGlwZyB0aW1lciAqLworCWlmKGxwLT5vcHRpb25zICYgT1BUSU9OX0RZTl9JUEdfRU5BQkxFKQkgICAgICAgIAorCQlkZWxfdGltZXJfc3luYygmbHAtPmlwZ19kYXRhLmlwZ190aW1lcik7CisKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkKKwkvKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3MgYmVmb3JlIGNsb3NpbmcgKi8KKwlhbWQ4MTExZV9nZXRfc3RhdHMoZGV2KTsKKwlscC0+b3BlbmVkID0gMDsKKwlyZXR1cm4gMDsKK30KKy8qIFRoaXMgZnVuY3Rpb24gb3BlbnMgbmV3IGludGVyZmFjZS5JdCByZXF1ZXN0cyBpcnEgZm9yIHRoZSBkZXZpY2UsIGluaXRpYWxpemVzIHRoZSBkZXZpY2UsYnVmZmVycyBhbmQgZGVzY3JpcHRvcnMsIGFuZCBzdGFydHMgdGhlIGRldmljZS4gCisqLworc3RhdGljIGludCBhbWQ4MTExZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2ICkKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYoZGV2LT5pcnEgPT0wIHx8IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBhbWQ4MTExZV9pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJCQkgZGV2LT5uYW1lLCBkZXYpKSAKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisKKwlhbWQ4MTExZV9pbml0X2h3X2RlZmF1bHQobHApOworCisJaWYoYW1kODExMWVfcmVzdGFydChkZXYpKXsKKwkJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisJCWlmIChkZXYtPmlycSkKKwkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogU3RhcnQgaXBnIHRpbWVyICovCisJaWYobHAtPm9wdGlvbnMgJiBPUFRJT05fRFlOX0lQR19FTkFCTEUpewkgICAgICAgIAorCQlhZGRfdGltZXIoJmxwLT5pcGdfZGF0YS5pcGdfdGltZXIpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogRHluYW1pYyBJUEcgRW5hYmxlZC5cbiIsZGV2LT5uYW1lKTsKKwl9CisKKwlscC0+b3BlbmVkID0gMTsKKworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOwkJCit9CisvKiAKK1RoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZXJlIGlzIGFueSB0cmFuc21pdCAgZGVzY3JpcHRvcnMgYXZhaWxhYmxlIHRvIHF1ZXVlIG1vcmUgcGFja2V0LgorKi8KK3N0YXRpYyBpbnQgYW1kODExMWVfdHhfcXVldWVfYXZhaWwoc3RydWN0IGFtZDgxMTFlX3ByaXYqIGxwICkKK3sJCisJaW50IHR4X2luZGV4ID0gbHAtPnR4X2lkeCAmIFRYX0JVRkZfTU9EX01BU0s7CisJaWYobHAtPnR4X3NrYnVmZlt0eF9pbmRleF0gIT0gMCkKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIDA7CisJCit9CisvKiAKK1RoaXMgZnVuY3Rpb24gd2lsbCBxdWV1ZSB0aGUgdHJhbnNtaXQgcGFja2V0cyB0byB0aGUgZGVzY3JpcHRvcnMgYW5kIHdpbGwgdHJpZ2dlciB0aGUgc2VuZCBvcGVyYXRpb24uIEl0IGFsc28gaW5pdGlhbGl6ZXMgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3JzIHdpdGggYnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MsIGJ5dGUgY291bnQsIG93bmVyc2hpcCB0byBoYXJkd2FyZSBldGMuCisqLworCitzdGF0aWMgaW50IGFtZDgxMTFlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgdHhfaW5kZXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJdHhfaW5kZXggPSBscC0+dHhfaWR4ICYgVFhfUklOR19EUl9NT0RfTUFTSzsKKworCWxwLT50eF9yaW5nW3R4X2luZGV4XS5idWZmX2NvdW50ID0gY3B1X3RvX2xlMTYoc2tiLT5sZW4pOworCisJbHAtPnR4X3NrYnVmZlt0eF9pbmRleF0gPSBza2I7CisJbHAtPnR4X3JpbmdbdHhfaW5kZXhdLnR4X2ZsYWdzID0gMDsKKworI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQKKwlpZigobHAtPnZsZ3JwICE9IE5VTEwpICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSl7CisJCWxwLT50eF9yaW5nW3R4X2luZGV4XS50YWdfY3RybF9jbWQgfD0gCisJCQkJY3B1X3RvX2xlMTYoVENDX1ZMQU5fSU5TRVJUKTsJCisJCWxwLT50eF9yaW5nW3R4X2luZGV4XS50YWdfY3RybF9pbmZvID0gCisJCQkJY3B1X3RvX2xlMTYodmxhbl90eF90YWdfZ2V0KHNrYikpOworCisJfQorI2VuZGlmCisJbHAtPnR4X2RtYV9hZGRyW3R4X2luZGV4XSA9CisJICAgIHBjaV9tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlscC0+dHhfcmluZ1t0eF9pbmRleF0uYnVmZl9waHlfYWRkciA9CisJICAgICh1MzIpIGNwdV90b19sZTMyKGxwLT50eF9kbWFfYWRkclt0eF9pbmRleF0pOworCisJLyogIFNldCBGQ1MgYW5kIExUSU5UIGJpdHMgKi8KKwl3bWIoKTsKKwlscC0+dHhfcmluZ1t0eF9pbmRleF0udHhfZmxhZ3MgfD0KKwkgICAgY3B1X3RvX2xlMTYoT1dOX0JJVCB8IFNUUF9CSVQgfCBFTlBfQklUfEFERF9GQ1NfQklUfExUSU5UX0JJVCk7CisKKwlscC0+dHhfaWR4Kys7CisKKwkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSBzZW5kIHBvbGwuICovCisJd3JpdGVsKCBWQUwxIHwgVERNRDAsIGxwLT5tbWlvICsgQ01EMCk7CisJd3JpdGVsKCBWQUwyIHwgUkRNRDAsbHAtPm1taW8gKyBDTUQwKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJaWYoYW1kODExMWVfdHhfcXVldWVfYXZhaWwobHApIDwgMCl7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKy8qCitUaGlzIGZ1bmN0aW9uIHJldHVybnMgYWxsIHRoZSBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyBvZiB0aGUgZGV2aWNlLgorKi8KK3N0YXRpYyB2b2lkIGFtZDgxMTFlX3JlYWRfcmVncyhzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAsIHUzMiAqYnVmKQoreworCXZvaWQgX19pb21lbSAqbW1pbyA9IGxwLT5tbWlvOworCS8qIFJlYWQgb25seSBuZWNlc3NhcnkgcmVnaXN0ZXJzICovCisJYnVmWzBdID0gcmVhZGwobW1pbyArIFhNVF9SSU5HX0JBU0VfQUREUjApOworCWJ1ZlsxXSA9IHJlYWRsKG1taW8gKyBYTVRfUklOR19MRU4wKTsKKwlidWZbMl0gPSByZWFkbChtbWlvICsgUkNWX1JJTkdfQkFTRV9BRERSMCk7CisJYnVmWzNdID0gcmVhZGwobW1pbyArIFJDVl9SSU5HX0xFTjApOworCWJ1Zls0XSA9IHJlYWRsKG1taW8gKyBDTUQwKTsKKwlidWZbNV0gPSByZWFkbChtbWlvICsgQ01EMik7CisJYnVmWzZdID0gcmVhZGwobW1pbyArIENNRDMpOworCWJ1Zls3XSA9IHJlYWRsKG1taW8gKyBDTUQ3KTsKKwlidWZbOF0gPSByZWFkbChtbWlvICsgSU5UMCk7CisJYnVmWzldID0gcmVhZGwobW1pbyArIElOVEVOMCk7CisJYnVmWzEwXSA9IHJlYWRsKG1taW8gKyBMQURSRik7CisJYnVmWzExXSA9IHJlYWRsKG1taW8gKyBMQURSRis0KTsKKwlidWZbMTJdID0gcmVhZGwobW1pbyArIFNUQVQwKTsKK30KKworLyoKK2FtZDgxMTFlIGNyYyBnZW5lcmF0b3IgaW1wbGVtZW50YXRpb24gaXMgZGlmZmVyZW50IGZyb20gdGhlIGtlcm5lbAorZXRoZXJfY3JjKCkgZnVuY3Rpb24uCisqLworc3RhdGljIGludCBhbWQ4MTExZV9ldGhlcl9jcmMoaW50IGxlbiwgY2hhciogbWFjX2FkZHIpCit7CisJaW50IGksYnl0ZTsKKwl1bnNpZ25lZCBjaGFyIG9jdGV0OworCXUzMiBjcmM9IElOSVRDUkM7CisKKwlmb3IoYnl0ZT0wOyBieXRlIDwgbGVuOyBieXRlKyspeworCQlvY3RldCA9IG1hY19hZGRyW2J5dGVdOworCQlmb3IoIGk9MDtpIDwgODsgaSsrKXsKKwkJCS8qSWYgdGhlIG5leHQgYml0IGZvcm0gdGhlIGlucHV0IHN0cmVhbSBpcyAxLHN1YnRyYWN0CQkJCSB0aGUgZGl2aXNvciAoQ1JDMzIpIGZyb20gdGhlIGRpdmlkZW5kKGNyYykuKi8KKwkJCWlmKCAob2N0ZXQgJiAweDEpIF4gKGNyYyAmIDB4MSkgKXsKKwkJCQljcmMgPj49IDE7CisJCQkJY3JjIF49IENSQzMyOworCQkJfQorCQkJZWxzZQorCQkJCWNyYyA+Pj0gMTsKKwkJCQorCQkJb2N0ZXQgPj49IDE7CisJCX0KKwl9CQorCXJldHVybiBjcmM7IAorfQorLyoKK1RoaXMgZnVuY3Rpb24gc2V0cyBwcm9taXNjdW9zIG1vZGUsIGFsbC1tdWx0aSBtb2RlIG9yIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyAKK2xpc3QgdG8gdGhlIGRldmljZS4KKyovCitzdGF0aWMgdm9pZCBhbWQ4MTExZV9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X21jX2xpc3QqIG1jX3B0cjsKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBtY19maWx0ZXJbMl0gOworCWludCBpLGJpdF9udW07CisJaWYoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNldHRpbmcgIHByb21pc2N1b3VzIG1vZGUuXG4iLGRldi0+bmFtZSk7CisJCXdyaXRlbCggVkFMMiB8IFBST00sIGxwLT5tbWlvICsgQ01EMik7CisJCXJldHVybjsKKwl9CisJZWxzZQorCQl3cml0ZWwoIFBST00sIGxwLT5tbWlvICsgQ01EMik7CisJaWYoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSB8fCBkZXYtPm1jX2NvdW50ID4gTUFYX0ZJTFRFUl9TSVpFKXsKKwkJLyogZ2V0IGFsbCBtdWx0aWNhc3QgcGFja2V0ICovCisJCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IDB4ZmZmZmZmZmY7CisJCWxwLT5tY19saXN0ID0gZGV2LT5tY19saXN0OworCQlscC0+b3B0aW9ucyB8PSBPUFRJT05fTVVMVElDQVNUX0VOQUJMRTsKKwkJYW1kODExMWVfd3JpdGVxKCoodTY0KiltY19maWx0ZXIsbHAtPm1taW8gKyBMQURSRik7CisJCXJldHVybjsKKwl9CisJaWYoIGRldi0+bWNfY291bnQgPT0gMCApeworCQkvKiBnZXQgb25seSBvd24gcGFja2V0cyAqLworCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAwOworCQlscC0+bWNfbGlzdCA9IE5VTEw7CisJCWxwLT5vcHRpb25zICY9IH5PUFRJT05fTVVMVElDQVNUX0VOQUJMRTsKKwkJYW1kODExMWVfd3JpdGVxKCoodTY0KiltY19maWx0ZXIsbHAtPm1taW8gKyBMQURSRik7CisJCS8qIGRpc2FibGUgcHJvbWlzY291cyBtb2RlICovCisJCXdyaXRlbChQUk9NLCBscC0+bW1pbyArIENNRDIpOworCQlyZXR1cm47CisJfQorCS8qIGxvYWQgYWxsIHRoZSBtdWx0aWNhc3QgYWRkcmVzc2VzIGluIHRoZSBsb2dpYyBmaWx0ZXIgKi8KKwlscC0+b3B0aW9ucyB8PSBPUFRJT05fTVVMVElDQVNUX0VOQUJMRTsKKwlscC0+bWNfbGlzdCA9IGRldi0+bWNfbGlzdDsKKwltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAwOworCWZvciAoaSA9IDAsIG1jX3B0ciA9IGRldi0+bWNfbGlzdDsgbWNfcHRyICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkgICAgIGkrKywgbWNfcHRyID0gbWNfcHRyLT5uZXh0KSB7CisJCWJpdF9udW0gPSAoIGFtZDgxMTFlX2V0aGVyX2NyYyhFVEhfQUxFTixtY19wdHItPmRtaV9hZGRyKQkJCQkJCQkgPj4gMjYgKSAmIDB4M2Y7CisJCW1jX2ZpbHRlcltiaXRfbnVtID4+IDVdIHw9IDEgPDwgKGJpdF9udW0gJiAzMSk7CisJfQkKKwlhbWQ4MTExZV93cml0ZXEoKih1NjQqKW1jX2ZpbHRlcixscC0+bW1pbysgTEFEUkYpOworCisJLyogVG8gZWxpbWluYXRlIFBDSSBwb3N0aW5nIGJ1ZyAqLworCXJlYWRsKGxwLT5tbWlvICsgQ01EMik7CisKK30KKworc3RhdGljIHZvaWQgYW1kODExMWVfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gbHAtPnBjaV9kZXY7CisJc3RyY3B5IChpbmZvLT5kcml2ZXIsIE1PRFVMRV9OQU1FKTsKKwlzdHJjcHkgKGluZm8tPnZlcnNpb24sIE1PRFVMRV9WRVJTKTsKKwlzcHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sIiV1IixjaGlwX3ZlcnNpb24pOworCXN0cmNweSAoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHBjaV9kZXYpKTsKK30KKworc3RhdGljIGludCBhbWQ4MTExZV9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gQU1EODExMUVfUkVHX0RVTVBfTEVOOworfQorCitzdGF0aWMgdm9pZCBhbWQ4MTExZV9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpidWYpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZWdzLT52ZXJzaW9uID0gMDsKKwlhbWQ4MTExZV9yZWFkX3JlZ3MobHAsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgYW1kODExMWVfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwltaWlfZXRodG9vbF9nc2V0KCZscC0+bWlpX2lmLCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWQ4MTExZV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJlczsKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJcmVzID0gbWlpX2V0aHRvb2xfc3NldCgmbHAtPm1paV9pZiwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBhbWQ4MTExZV9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmbHAtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgYW1kODExMWVfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBtaWlfbGlua19vaygmbHAtPm1paV9pZik7Cit9CisKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sX2luZm8pCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl3b2xfaW5mby0+c3VwcG9ydGVkID0gV0FLRV9NQUdJQ3xXQUtFX1BIWTsKKwlpZiAobHAtPm9wdGlvbnMgJiBPUFRJT05fV09MX0VOQUJMRSkKKwkJd29sX2luZm8tPndvbG9wdHMgPSBXQUtFX01BR0lDOworfQorCitzdGF0aWMgaW50IGFtZDgxMTFlX3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sX2luZm8pCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAod29sX2luZm8tPndvbG9wdHMgJiB+KFdBS0VfTUFHSUN8V0FLRV9QSFkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJaWYgKHdvbF9pbmZvLT53b2xvcHRzICYgV0FLRV9NQUdJQykKKwkJbHAtPm9wdGlvbnMgfD0gCisJCQkoT1BUSU9OX1dPTF9FTkFCTEUgfCBPUFRJT05fV0FLRV9NQUdJQ19FTkFCTEUpOworCWVsc2UgaWYod29sX2luZm8tPndvbG9wdHMgJiBXQUtFX1BIWSkKKwkJbHAtPm9wdGlvbnMgfD0gCisJCQkoT1BUSU9OX1dPTF9FTkFCTEUgfCBPUFRJT05fV0FLRV9QSFlfRU5BQkxFKTsKKwllbHNlCisJCWxwLT5vcHRpb25zICY9IH5PUFRJT05fV09MX0VOQUJMRTsgCisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IGFtZDgxMTFlX2dldF9kcnZpbmZvLAorCS5nZXRfcmVnc19sZW4gPSBhbWQ4MTExZV9nZXRfcmVnc19sZW4sCisJLmdldF9yZWdzID0gYW1kODExMWVfZ2V0X3JlZ3MsCisJLmdldF9zZXR0aW5ncyA9IGFtZDgxMTFlX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzID0gYW1kODExMWVfc2V0X3NldHRpbmdzLAorCS5ud2F5X3Jlc2V0ID0gYW1kODExMWVfbndheV9yZXNldCwKKwkuZ2V0X2xpbmsgPSBhbWQ4MTExZV9nZXRfbGluaywKKwkuZ2V0X3dvbCA9IGFtZDgxMTFlX2dldF93b2wsCisJLnNldF93b2wgPSBhbWQ4MTExZV9zZXRfd29sLAorfTsKKworLyoKK1RoaXMgZnVuY3Rpb24gaGFuZGxlcyBhbGwgdGhlICBldGh0b29sIGlvY3Rscy4gSXQgZ2l2ZXMgZHJpdmVyIGluZm8sIGdldHMvc2V0cyBkcml2ZXIgc3BlZWQsIGdldHMgbWVtb3J5IG1hcHBlZCByZWdpc3RlciB2YWx1ZXMsIGZvcmNlcyBhdXRvIG5lZ290aWF0aW9uLCBzZXRzL2dldHMgV09MIG9wdGlvbnMgZm9yIGV0aHRvb2wgYXBwbGljYXRpb24uIAorKi8KKwkKK3N0YXRpYyBpbnQgYW1kODExMWVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYgLCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkoaWZyKTsKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisJdTMyIG1paV9yZWd2YWw7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToKKwkJZGF0YS0+cGh5X2lkID0gbHAtPmV4dF9waHlfYWRkcjsKKworCS8qIGZhbGx0aHJ1ICovCisJY2FzZSBTSU9DR01JSVJFRzogCisKKwkJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCQllcnIgPSBhbWQ4MTExZV9yZWFkX3BoeShscCwgZGF0YS0+cGh5X2lkLAorCQkJZGF0YS0+cmVnX251bSAmIFBIWV9SRUdfQUREUl9NQVNLLCAmbWlpX3JlZ3ZhbCk7CisJCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCisJCWRhdGEtPnZhbF9vdXQgPSBtaWlfcmVndmFsOworCQlyZXR1cm4gZXJyOworCisJY2FzZSBTSU9DU01JSVJFRzoKKworCQlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJCWVyciA9IGFtZDgxMTFlX3dyaXRlX3BoeShscCwgZGF0YS0+cGh5X2lkLAorCQkJZGF0YS0+cmVnX251bSAmIFBIWV9SRUdfQUREUl9NQVNLLCBkYXRhLT52YWxfaW4pOworCQlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKworCQlyZXR1cm4gZXJyOworCisJZGVmYXVsdDoKKwkJLyogZG8gbm90aGluZyAqLworCQlicmVhazsKKwl9CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorc3RhdGljIGludCBhbWQ4MTExZV9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCS8qIFNldHRpbmcgdGhlIE1BQyBhZGRyZXNzIHRvIHRoZSBkZXZpY2UgKi8KKwlmb3IoaSA9IDA7IGkgPCBFVEhfQUREUl9MRU47IGkrKykKKwkJd3JpdGViKCBkZXYtPmRldl9hZGRyW2ldLCBscC0+bW1pbyArIFBBRFIgKyBpICk7IAorCQkKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiAKK1RoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgbXR1IG9mIHRoZSBkZXZpY2UuIEl0IHJlc3RhcnRzIHRoZSBkZXZpY2UgIHRvIGluaXRpYWxpemUgdGhlIGRlc2NyaXB0b3Igd2l0aCBuZXcgcmVjZWl2ZSBidWZmZXJzLgorKi8gIAorc3RhdGljIGludCBhbWQ4MTExZV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCWlmICgobmV3X210dSA8IEFNRDgxMTFFX01JTl9NVFUpIHx8IChuZXdfbXR1ID4gQU1EODExMUVfTUFYX01UVSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJLyogbmV3X210dSB3aWxsIGJlIHVzZWQKKwkJICAgd2hlbiBkZXZpY2Ugc3RhcnRzIG5ldHh0IHRpbWUgKi8gCisJCWRldi0+bXR1ID0gbmV3X210dTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCisgICAgICAgIC8qIHN0b3AgdGhlIGNoaXAgKi8KKwl3cml0ZWwoUlVOLCBscC0+bW1pbyArIENNRDApOworCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCisJZXJyID0gYW1kODExMWVfcmVzdGFydChkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCWlmKCFlcnIpCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIGVycjsKK30KKworI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKwlzdHJ1Y3QgIGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJbHAtPnZsZ3JwID0gZ3JwOworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworfQorCQorc3RhdGljIHZvaWQgYW1kODExMWVfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJaWYgKGxwLT52bGdycCkKKwkJbHAtPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7Cit9CisjZW5kaWYKK3N0YXRpYyBpbnQgYW1kODExMWVfZW5hYmxlX21hZ2ljcGt0KHN0cnVjdCBhbWQ4MTExZV9wcml2KiBscCkKK3sKKwl3cml0ZWwoIFZBTDF8TVBQTEJBLCBscC0+bW1pbyArIENNRDMpOworCXdyaXRlbCggVkFMMHxNUEVOX1NXLCBscC0+bW1pbyArIENNRDcpOworCisJLyogVG8gZWxpbWluYXRlIFBDSSBwb3N0aW5nIGJ1ZyAqLworCXJlYWRsKGxwLT5tbWlvICsgQ01ENyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1kODExMWVfZW5hYmxlX2xpbmtfY2hhbmdlKHN0cnVjdCBhbWQ4MTExZV9wcml2KiBscCkKK3sKKworCS8qIEFkYXB0ZXIgaXMgYWxyZWFkeSBzdG9wZWQvc3VzcGVuZGVkL2ludGVycnVwdC1kaXNhYmxlZCAqLworCXdyaXRlbChWQUwwfExDTU9ERV9TVyxscC0+bW1pbyArIENNRDcpOworCQorCS8qIFRvIGVsaW1pbmF0ZSBQQ0kgcG9zdGluZyBidWcgKi8KKwlyZWFkbChscC0+bW1pbyArIENNRDcpOworCXJldHVybiAwOworfQkKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBwYWNrZXQgdHJhbnNtaXNzaW9uIGZhaWxzIHRvIGNvbXBsZXRlIHdpdGhpbiBhICByZXNvbmFibGUgcGVyaW9kLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFuIGludGVycnVwdHMgaGF2ZSBiZWVuIGZhaWxlZCBvciB0aGUgIGludGVyZmFjZSBpcyBsb2NrZWQgdXAuIFRoaXMgZnVuY3Rpb24gd2lsbCByZWluaXRpYWxpemUgdGhlIGhhcmR3YXJlICovCisKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiogbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHJlc2V0dGluZ1xuIiwKKwkgCQkJCQkgICAgICBkZXYtPm5hbWUpOworCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwllcnIgPSBhbWQ4MTExZV9yZXN0YXJ0KGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisJaWYoIWVycikKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorc3RhdGljIGludCBhbWQ4MTExZV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJYW1kODExMWVfZGlzYWJsZV9pbnRlcnJ1cHQobHApOworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQorCS8qIHN0b3AgY2hpcCAqLworCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwlpZihscC0+b3B0aW9ucyAmIE9QVElPTl9EWU5fSVBHX0VOQUJMRSkJICAgICAgICAKKwkJZGVsX3RpbWVyX3N5bmMoJmxwLT5pcGdfZGF0YS5pcGdfdGltZXIpOworCWFtZDgxMTFlX3N0b3BfY2hpcChscCk7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisKKwlpZihscC0+b3B0aW9ucyAmIE9QVElPTl9XT0xfRU5BQkxFKXsKKwkJIC8qIGVuYWJsZSB3b2wgKi8KKwkJaWYobHAtPm9wdGlvbnMgJiBPUFRJT05fV0FLRV9NQUdJQ19FTkFCTEUpCisJCQlhbWQ4MTExZV9lbmFibGVfbWFnaWNwa3QobHApOwkKKwkJaWYobHAtPm9wdGlvbnMgJiBPUFRJT05fV0FLRV9QSFlfRU5BQkxFKQorCQkJYW1kODExMWVfZW5hYmxlX2xpbmtfY2hhbmdlKGxwKTsJCisJCQorCQlwY2lfZW5hYmxlX3dha2UocGNpX2RldiwgUENJX0QzaG90LCAxKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBjaV9kZXYsIFBDSV9EM2NvbGQsIDEpOworCisJfQorCWVsc2V7CQkKKwkJcGNpX2VuYWJsZV93YWtlKHBjaV9kZXYsIFBDSV9EM2hvdCwgMCk7CisJCXBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBQQ0lfRDNjb2xkLCAwKTsKKwl9CisJCisJcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBQQ0lfRDNob3QpOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IGFtZDgxMTFlX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOworCisJcGNpX2VuYWJsZV93YWtlKHBjaV9kZXYsIFBDSV9EM2hvdCwgMCk7CisJcGNpX2VuYWJsZV93YWtlKHBjaV9kZXYsIFBDSV9EM2NvbGQsIDApOyAvKiBEMyBjb2xkICovCisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJYW1kODExMWVfcmVzdGFydChkZXYpOworCS8qIFJlc3RhcnQgaXBnIHRpbWVyICovCisJaWYobHAtPm9wdGlvbnMgJiBPUFRJT05fRFlOX0lQR19FTkFCTEUpCSAgICAgICAgCisJCW1vZF90aW1lcigmbHAtPmlwZ19kYXRhLmlwZ190aW1lciwgCisJCQkJamlmZmllcyArIElQR19DT05WRVJHRV9KSUZGSUVTKTsKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhbWQ4MTExZV9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaWYgKGRldikgeworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlpb3VubWFwKCgoc3RydWN0IGFtZDgxMTFlX3ByaXYgKiluZXRkZXZfcHJpdihkZXYpKS0+bW1pbyk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCX0KK30KK3N0YXRpYyB2b2lkIGFtZDgxMTFlX2NvbmZpZ19pcGcoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpcGdfaW5mbyogaXBnX2RhdGEgPSAmbHAtPmlwZ19kYXRhOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGxwLT5tbWlvOworCXVuc2lnbmVkIGludCBwcmV2X2NvbF9jbnQgPSBpcGdfZGF0YS0+Y29sX2NudDsKKwl1bnNpZ25lZCBpbnQgdG90YWxfY29sX2NudDsKKwl1bnNpZ25lZCBpbnQgdG1wX2lwZzsKKwkKKwlpZihscC0+bGlua19jb25maWcuZHVwbGV4ID09IERVUExFWF9GVUxMKXsKKwkJaXBnX2RhdGEtPmlwZyA9IERFRkFVTFRfSVBHOworCQlyZXR1cm47CisJfQorCisJaWYoaXBnX2RhdGEtPmlwZ19zdGF0ZSA9PSBTU1RBVEUpeworCQkKKwkJaWYoaXBnX2RhdGEtPnRpbWVyX3RpY2sgPT0gSVBHX1NUQUJMRV9USU1FKXsKKwkJCQorCQkJaXBnX2RhdGEtPnRpbWVyX3RpY2sgPSAwOworCQkJaXBnX2RhdGEtPmlwZyA9IE1JTl9JUEcgLSBJUEdfU1RFUDsKKwkJCWlwZ19kYXRhLT5jdXJyZW50X2lwZyA9IE1JTl9JUEc7CisJCQlpcGdfZGF0YS0+ZGlmZl9jb2xfY250ID0gMHhGRkZGRkZGRjsKKwkJCWlwZ19kYXRhLT5pcGdfc3RhdGUgPSBDU1RBVEU7CisJCX0KKwkJZWxzZQorCQkJaXBnX2RhdGEtPnRpbWVyX3RpY2srKzsKKwl9CisKKwlpZihpcGdfZGF0YS0+aXBnX3N0YXRlID09IENTVEFURSl7CisJCQorCQkvKiBHZXQgdGhlIGN1cnJlbnQgY29sbGlzaW9uIGNvdW50ICovCisKKwkJdG90YWxfY29sX2NudCA9IGlwZ19kYXRhLT5jb2xfY250ID0gCisJCQkJYW1kODExMWVfcmVhZF9taWIobW1pbywgeG10X2NvbGxpc2lvbnMpOworCisJCWlmICgodG90YWxfY29sX2NudCAtIHByZXZfY29sX2NudCkgPCAKKwkJCQkoaXBnX2RhdGEtPmRpZmZfY29sX2NudCkpeworCQkJCisJCQlpcGdfZGF0YS0+ZGlmZl9jb2xfY250ID0KKwkJCQl0b3RhbF9jb2xfY250IC0gcHJldl9jb2xfY250IDsKKworCQkJaXBnX2RhdGEtPmlwZyA9IGlwZ19kYXRhLT5jdXJyZW50X2lwZzsKKwkJfQorCisJCWlwZ19kYXRhLT5jdXJyZW50X2lwZyArPSBJUEdfU1RFUDsKKworCQlpZiAoaXBnX2RhdGEtPmN1cnJlbnRfaXBnIDw9IE1BWF9JUEcpCisJCQl0bXBfaXBnID0gaXBnX2RhdGEtPmN1cnJlbnRfaXBnOworCQllbHNleworCQkJdG1wX2lwZyA9IGlwZ19kYXRhLT5pcGc7CisJCQlpcGdfZGF0YS0+aXBnX3N0YXRlID0gU1NUQVRFOworCQl9CisJCXdyaXRldygodTMyKXRtcF9pcGcsIG1taW8gKyBJUEcpOyAKKwkJd3JpdGV3KCh1MzIpKHRtcF9pcGcgLSBJRlMxX0RFTFRBKSwgbW1pbyArIElGUzEpOyAKKwl9CisJIG1vZF90aW1lcigmbHAtPmlwZ19kYXRhLmlwZ190aW1lciwgamlmZmllcyArIElQR19DT05WRVJHRV9KSUZGSUVTKTsKKwlyZXR1cm47CisKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGFtZDgxMTFlX3Byb2JlX2V4dF9waHkoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJZm9yIChpID0gMHgxZTsgaSA+PSAwOyBpLS0pIHsKKwkJdTMyIGlkMSwgaWQyOworCisJCWlmIChhbWQ4MTExZV9yZWFkX3BoeShscCwgaSwgTUlJX1BIWVNJRDEsICZpZDEpKQorCQkJY29udGludWU7CisJCWlmIChhbWQ4MTExZV9yZWFkX3BoeShscCwgaSwgTUlJX1BIWVNJRDIsICZpZDIpKQorCQkJY29udGludWU7CisJCWxwLT5leHRfcGh5X2lkID0gKGlkMSA8PCAxNikgfCBpZDI7CisJCWxwLT5leHRfcGh5X2FkZHIgPSBpOworCQlyZXR1cm47CisJfQorCWxwLT5leHRfcGh5X2lkID0gMDsKKwlscC0+ZXh0X3BoeV9hZGRyID0gMTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYW1kODExMWVfcHJvYmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgZXJyLGkscG1fY2FwOworCXVuc2lnbmVkIGxvbmcgcmVnX2FkZHIscmVnX2xlbjsKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiogbHA7CisJc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmKGVycil7CisJCXByaW50ayhLRVJOX0VSUiAiYW1kODExMWU6IENhbm5vdCBlbmFibGUgbmV3IFBDSSBkZXZpY2UsIgorCQkJImV4aXRpbmcuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZighKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSl7CisJCXByaW50ayhLRVJOX0VSUiAiYW1kODExMWU6IENhbm5vdCBmaW5kIFBDSSBiYXNlIGFkZHJlc3MiCisJCSAgICAgICAiZXhpdGluZy5cbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9kaXNhYmxlX3BkZXY7CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBNT0RVTEVfTkFNRSk7CisJaWYoZXJyKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbWQ4MTExZTogQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzLCAiCisJCSAgICAgICAiZXhpdGluZy5cbiIpOworCQlnb3RvIGVycl9kaXNhYmxlX3BkZXY7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBGaW5kIHBvd2VyLW1hbmFnZW1lbnQgY2FwYWJpbGl0eS4gKi8KKwlpZigocG1fY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1BNKSk9PTApeworCQlwcmludGsoS0VSTl9FUlIgImFtZDgxMTFlOiBObyBQb3dlciBNYW5hZ2VtZW50IGNhcGFiaWxpdHksICIKKwkJICAgICAgICJleGl0aW5nLlxuIik7CisJCWdvdG8gZXJyX2ZyZWVfcmVnOworCX0KKworCS8qIEluaXRpYWxpemUgRE1BICovCisJaWYoIXBjaV9kbWFfc3VwcG9ydGVkKHBkZXYsIDB4ZmZmZmZmZmYpKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbWQ4MTExZTogRE1BIG5vdCBzdXBwb3J0ZWQsIgorCQkJImV4aXRpbmcuXG4iKTsKKwkJZ290byAgZXJyX2ZyZWVfcmVnOworCX0gZWxzZQorCQlwZGV2LT5kbWFfbWFzayA9IDB4ZmZmZmZmZmY7CisJCisJcmVnX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJcmVnX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGFtZDgxMTFlX3ByaXYpKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgImFtZDgxMTFlOiBFdGhlcmRldiBhbGxvYyBmYWlsZWQsIGV4aXRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9yZWc7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKyNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlggOworCWRldi0+dmxhbl9yeF9yZWdpc3RlciA9YW1kODExMWVfdmxhbl9yeF9yZWdpc3RlcjsKKwlkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSBhbWQ4MTExZV92bGFuX3J4X2tpbGxfdmlkOworI2VuZGlmCQorCQorCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlscC0+cGNpX2RldiA9IHBkZXY7CisJbHAtPmFtZDgxMTFlX25ldF9kZXYgPSBkZXY7CisJbHAtPnBtX2NhcCA9IHBtX2NhcDsKKworCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisKKwlscC0+bW1pbyA9IGlvcmVtYXAocmVnX2FkZHIsIHJlZ19sZW4pOworCWlmIChscC0+bW1pbyA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYW1kODExMWU6IENhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVycywgIgorCQkgICAgICAgImV4aXRpbmdcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX2RldjsKKwl9CisJCisJLyogSW5pdGlhbGl6aW5nIE1BQyBhZGRyZXNzICovCisJZm9yKGkgPSAwOyBpIDwgRVRIX0FERFJfTEVOOyBpKyspCisJCQlkZXYtPmRldl9hZGRyW2ldID1yZWFkYihscC0+bW1pbyArIFBBRFIgKyBpKTsKKwkKKwkvKiBTZXR0aW5nIHVzZXIgZGVmaW5lZCBwYXJhbWV0cnMgKi8KKwlscC0+ZXh0X3BoeV9vcHRpb24gPSBzcGVlZF9kdXBsZXhbY2FyZF9pZHhdOworCWlmKGNvYWxlc2NlW2NhcmRfaWR4XSkKKwkJbHAtPm9wdGlvbnMgfD0gT1BUSU9OX0lOVFJfQ09BTF9FTkFCTEU7CQkKKwlpZihkeW5hbWljX2lwZ1tjYXJkX2lkeCsrXSkKKwkJbHAtPm9wdGlvbnMgfD0gT1BUSU9OX0RZTl9JUEdfRU5BQkxFOwkgICAgICAgIAkKKworCS8qIEluaXRpYWxpemUgZHJpdmVyIGVudHJ5IHBvaW50cyAqLworCWRldi0+b3BlbiA9IGFtZDgxMTFlX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBhbWQ4MTExZV9zdGFydF94bWl0OworCWRldi0+c3RvcCA9IGFtZDgxMTFlX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gYW1kODExMWVfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gYW1kODExMWVfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gYW1kODExMWVfc2V0X21hY19hZGRyZXNzOworCWRldi0+ZG9faW9jdGwgPSBhbWQ4MTExZV9pb2N0bDsKKwlkZXYtPmNoYW5nZV9tdHUgPSBhbWQ4MTExZV9jaGFuZ2VfbXR1OworCVNFVF9FVEhUT09MX09QUyhkZXYsICZvcHMpOworCWRldi0+aXJxID1wZGV2LT5pcnE7CisJZGV2LT50eF90aW1lb3V0ID0gYW1kODExMWVfdHhfdGltZW91dDsgCisJZGV2LT53YXRjaGRvZ190aW1lbyA9IEFNRDgxMTFFX1RYX1RJTUVPVVQ7IAorI2lmZGVmIENPTkZJR19BTUQ4MTExRV9OQVBJCisJZGV2LT5wb2xsID0gYW1kODExMWVfcnhfcG9sbDsKKwlkZXYtPndlaWdodCA9IDMyOworI2VuZGlmCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGFtZDgxMTFlX3BvbGw7IAorI2VuZGlmCisKKyNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlg7CisJZGV2LT52bGFuX3J4X3JlZ2lzdGVyID1hbWQ4MTExZV92bGFuX3J4X3JlZ2lzdGVyOworCWRldi0+dmxhbl9yeF9raWxsX3ZpZCA9IGFtZDgxMTFlX3ZsYW5fcnhfa2lsbF92aWQ7CisjZW5kaWYJCisJLyogUHJvYmUgdGhlIGV4dGVybmFsIFBIWSAqLworCWFtZDgxMTFlX3Byb2JlX2V4dF9waHkoZGV2KTsKKworCS8qIHNldHRpbmcgbWlpIGRlZmF1bHQgdmFsdWVzICovCisJbHAtPm1paV9pZi5kZXYgPSBkZXY7CisJbHAtPm1paV9pZi5tZGlvX3JlYWQgPSBhbWQ4MTExZV9tZGlvX3JlYWQ7CisJbHAtPm1paV9pZi5tZGlvX3dyaXRlID0gYW1kODExMWVfbWRpb193cml0ZTsKKwlscC0+bWlpX2lmLnBoeV9pZCA9IGxwLT5leHRfcGh5X2FkZHI7CisKKwkvKiBTZXQgcmVjZWl2ZSBidWZmZXIgbGVuZ3RoIGFuZCBzZXQganVtYm8gb3B0aW9uKi8KKwlhbWQ4MTExZV9zZXRfcnhfYnVmZl9sZW4oZGV2KTsKKworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgImFtZDgxMTFlOiBDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgIgorCQkgICAgICAgImV4aXRpbmcuXG4iKTsKKwkJZ290byBlcnJfaW91bm1hcDsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwkKKwkvKiBJbml0aWFsaXplIHNvZnR3YXJlIGlwZyB0aW1lciAqLworCWlmKGxwLT5vcHRpb25zICYgT1BUSU9OX0RZTl9JUEdfRU5BQkxFKXsJICAgICAgICAKKwkJaW5pdF90aW1lcigmbHAtPmlwZ19kYXRhLmlwZ190aW1lcik7CisJCWxwLT5pcGdfZGF0YS5pcGdfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJCWxwLT5pcGdfZGF0YS5pcGdfdGltZXIuZnVuY3Rpb24gPSAodm9pZCAqKSZhbWQ4MTExZV9jb25maWdfaXBnOworCQlscC0+aXBnX2RhdGEuaXBnX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgCisJCQkJCQkgSVBHX0NPTlZFUkdFX0pJRkZJRVM7CisJCWxwLT5pcGdfZGF0YS5pcGcgPSBERUZBVUxUX0lQRzsKKwkJbHAtPmlwZ19kYXRhLmlwZ19zdGF0ZSA9IENTVEFURTsKKwl9OworCisJLyogIGRpc3BsYXkgZHJpdmVyIGFuZCBkZXZpY2UgaW5mb3JtYXRpb24gKi8KKworICAgIAljaGlwX3ZlcnNpb24gPSAocmVhZGwobHAtPm1taW8gKyBDSElQSUQpICYgMHhmMDAwMDAwMCk+PjI4OworICAgIAlwcmludGsoS0VSTl9JTkZPICIlczogQU1ELTgxMTFlIERyaXZlciBWZXJzaW9uOiAlc1xuIiwJCQkJCQkJCSBkZXYtPm5hbWUsTU9EVUxFX1ZFUlMpOworICAgIAlwcmludGsoS0VSTl9JTkZPICIlczogWyBSZXYgJXggXSBQQ0kgMTAvMTAwQmFzZVQgRXRoZXJuZXQgIiwJCQkJCQkJZGV2LT5uYW1lLCBjaGlwX3ZlcnNpb24pOworICAgIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLGRldi0+ZGV2X2FkZHJbaV0saSA9PSA1ID8gJyAnIDogJzonKTsKKyAgICAJcHJpbnRrKCAiXG4iKTsJCisJaWYgKGxwLT5leHRfcGh5X2lkKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogRm91bmQgTUlJIFBIWSBJRCAweCUwOHggYXQgYWRkcmVzcyAweCUwMnhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGxwLT5leHRfcGh5X2lkLCBscC0+ZXh0X3BoeV9hZGRyKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VsZG4ndCBkZXRlY3QgTUlJIFBIWSwgYXNzdW1pbmcgYWRkcmVzcyAweDAxXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyAgICAJcmV0dXJuIDA7CitlcnJfaW91bm1hcDoKKwlpb3VubWFwKGxwLT5tbWlvKTsKKworZXJyX2ZyZWVfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisKK2Vycl9mcmVlX3JlZzoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCitlcnJfZGlzYWJsZV9wZGV2OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIGVycjsKKworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYW1kODExMWVfZHJpdmVyID0geworCS5uYW1lICAgCT0gTU9EVUxFX05BTUUsCisJLmlkX3RhYmxlCT0gYW1kODExMWVfcGNpX3RibCwKKwkucHJvYmUJCT0gYW1kODExMWVfcHJvYmVfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYW1kODExMWVfcmVtb3ZlX29uZSksCisJLnN1c3BlbmQJPSBhbWQ4MTExZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYW1kODExMWVfcmVzdW1lCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbWQ4MTExZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmYW1kODExMWVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFtZDgxMTFlX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFtZDgxMTFlX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFtZDgxMTFlX2luaXQpOworbW9kdWxlX2V4aXQoYW1kODExMWVfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hbWQ4MTExZS5oIGIvZHJpdmVycy9uZXQvYW1kODExMWUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZmUzYTQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYW1kODExMWUuaApAQCAtMCwwICsxLDgyMyBAQAorLyoKKyAqIEFkdmFuY2VkICBNaWNybyBEZXZpY2VzIEluYy4gQU1EODExMUUgTGludXggTmV0d29yayBEcml2ZXIgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgQWR2YW5jZWQgTWljcm8gRGV2aWNlcyAKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAKKyAqIFVTQQorCitNb2R1bGUgTmFtZToKKworICAgIGFtZDgxMTFlLmgKKworQWJzdHJhY3Q6CisJCisgCSBBTUQ4MTExIGJhc2VkIDEwLzEwMCBFdGhlcm5ldCBDb250cm9sbGVyIGRyaXZlciBkZWZpbml0aW9ucy4gCisKK0Vudmlyb25tZW50OgorICAgIAorCUtlcm5lbCBNb2RlCisKK1JldmlzaW9uIEhpc3Rvcnk6CisgCTMuMC4wCisJICAgSW5pdGlhbCBSZXZpc2lvbi4KKwkzLjAuMQorKi8KKworI2lmbmRlZiBfQU1EODExRV9ICisjZGVmaW5lIF9BTUQ4MTFFX0gKKworLyogQ29tbWFuZCBzdHlsZSByZWdpc3RlciBhY2Nlc3MKKworUmVnaXN0ZXJzIENNRDAsIENNRDIsIENNRDMsQ01ENyBhbmQgSU5URU4wIHVzZXMgYSB3cml0ZSBhY2Nlc3MgdGVjaG5pcXVlIGNhbGxlZCBjb21tYW5kIHN0eWxlIGFjY2Vzcy4gSXQgYWxsb3dzIHRoZSB3cml0ZSB0byBzZWxlY3RlZCBiaXRzIG9mIHRoaXMgcmVnaXN0ZXIgd2l0aG91dCBhbHRlcmluZyB0aGUgYml0cyB0aGF0IGFyZSBub3Qgc2VsZWN0ZWQuIENvbW1hbmQgc3R5bGUgcmVnaXN0ZXJzIGFyZSBkaXZpZGVkIGludG8gNCBieXRlcyB0aGF0IGNhbiBiZSB3cml0dGVuIGluZGVwZW5kZW50bHkuIEhpZ2hlciBvcmRlciBiaXQgb2YgZWFjaCBieXRlIGlzIHRoZSAgdmFsdWUgYml0IHRoYXQgc3BlY2lmaWVzIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgd3JpdHRlbiBpbnRvIHRoZSBzZWxlY3RlZCBiaXRzIG9mIHJlZ2lzdGVyLiAKKworZWcuLCBpZiB0aGUgdmFsdWUgMTAwMTEwMTBiIGlzIHdyaXR0ZW4gaW50byB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiBhIGNvbW1hbmQgc3R5bGUgcmVnaXN0ZXIsIGJpdHMgMSwzIGFuZCA0IG9mIHRoZSByZWdpc3RlciB3aWxsIGJlIHNldCB0byAxLCBhbmQgdGhlIG90aGVyIGJpdHMgd2lsbCBub3QgYmUgYWx0ZXJlZC4gSWYgdGhlIHZhbHVlIDAwMDExMDEwYiBpcyB3cml0dGVuIGludG8gdGhlIHNhbWUgYnl0ZSwgYml0cyAxLDMgYW5kIDQgd2lsbCBiZSBjbGVhcmVkIHRvIDAgYW5kIHRoZSBvdGhlciBiaXRzIHdpbGwgbm90IGJlIGFsdGVyZWQuCisKKyovCisKKy8qICBPZmZzZXQgZm9yIE1lbW9yeSBNYXBwZWQgUmVnaXN0ZXJzLiAqLworLyogMzIgYml0IHJlZ2lzdGVycyAqLworCisjZGVmaW5lICBBU0ZfU1RBVAkJMHgwMAkvKiBBU0Ygc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIENISVBJRAkJCTB4MDQJLyogQ2hpcCBJRCByZWdzaXRlciAqLworI2RlZmluZQlNSUJfREFUQQkJMHgxMAkvKiBNSUIgZGF0YSByZWdpc3RlciAqLworI2RlZmluZSBNSUJfQUREUgkJMHgxNAkvKiBNSUIgYWRkcmVzcyByZWdpc3RlciAqLworI2RlZmluZSBTVEFUMAkJCTB4MzAJLyogU3RhdHVzMCByZWdpc3RlciAqLworI2RlZmluZSBJTlQwCQkJMHgzOAkvKiBJbnRlcnJ1cHQwIHJlZ2lzdGVyICovCisjZGVmaW5lIElOVEVOMAkJCTB4NDAJLyogSW50ZXJydXB0MCAgZW5hYmxlIHJlZ2lzdGVyKi8KKyNkZWZpbmUgQ01EMAkJCTB4NDgJLyogQ29tbWFuZDAgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ01EMgkJCTB4NTAJLyogQ29tbWFuZDIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ01EMwkJCTB4NTQJLyogQ29tbWFuZDMgcmVzaXRlciAqLworI2RlZmluZSBDTUQ3CQkJMHg2NAkvKiBDb21tYW5kNyByZWdpc3RlciAqLworCisjZGVmaW5lIENUUkwxIAkJCTB4NkMJLyogQ29udHJvbDEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ1RSTDIgCQkJMHg3MAkvKiBDb250cm9sMiByZWdpc3RlciAqLworCisjZGVmaW5lIFhNVF9SSU5HX0xJTUlUCQkweDdDCS8qIFRyYW5zbWl0IHJpbmcgbGltaXQgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBBVVRPUE9MTDAJCTB4ODgJLyogQXV0by1wb2xsMCByZWdpc3RlciAqLworI2RlZmluZSBBVVRPUE9MTDEJCTB4OEEJLyogQXV0by1wb2xsMSByZWdpc3RlciAqLworI2RlZmluZSBBVVRPUE9MTDIJCTB4OEMJLyogQXV0by1wb2xsMiByZWdpc3RlciAqLworI2RlZmluZSBBVVRPUE9MTDMJCTB4OEUJLyogQXV0by1wb2xsMyByZWdpc3RlciAqLworI2RlZmluZSBBVVRPUE9MTDQJCTB4OTAJLyogQXV0by1wb2xsNCByZWdpc3RlciAqLworI2RlZmluZQlBVVRPUE9MTDUJCTB4OTIJLyogQXV0by1wb2xsNSByZWdpc3RlciAqLworCisjZGVmaW5lIEFQX1ZBTFVFCQkweDk4CS8qIEF1dG8tcG9sbCB2YWx1ZSByZWdpc3RlciAqLworI2RlZmluZSBETFlfSU5UX0EJCTB4QTgJLyogR3JvdXAgQSBkZWxheWVkIGludGVycnVwdCByZWdpc3RlciAqLworI2RlZmluZSBETFlfSU5UX0IJCTB4QUMJLyogR3JvdXAgQiBkZWxheWVkIGludGVycnVwdCByZWdpc3RlciAqLworCisjZGVmaW5lIEZMT1dfQ09OVFJPTAkJMHhDOAkvKiBGbG93IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX0FDQ0VTUwkJMHhEMAkvKiBQSFkgYWNjZXNzIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgU1RWQUwJCQkweEQ4CS8qIFNvZnR3YXJlIHRpbWVyIHZhbHVlIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgWE1UX1JJTkdfQkFTRV9BRERSMAkweDEwMAkvKiBUcmFuc21pdCByaW5nMCBiYXNlIGFkZHIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1UX1JJTkdfQkFTRV9BRERSMQkweDEwOAkvKiBUcmFuc21pdCByaW5nMSBiYXNlIGFkZHIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1UX1JJTkdfQkFTRV9BRERSMgkweDExMAkvKiBUcmFuc21pdCByaW5nMiBiYXNlIGFkZHIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1UX1JJTkdfQkFTRV9BRERSMwkweDExOAkvKiBUcmFuc21pdCByaW5nMiBiYXNlIGFkZHIgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBSQ1ZfUklOR19CQVNFX0FERFIwCTB4MTIwCS8qIFRyYW5zbWl0IHJpbmcwIGJhc2UgYWRkciByZWdpc3RlciAqLworCisjZGVmaW5lIFBNQVQwCQkJMHgxOTAJLyogT25Ob3cgcGF0dGVybiByZWdpc3RlcjAgKi8KKyNkZWZpbmUgUE1BVDEJCQkweDE5NAkvKiBPbk5vdyBwYXR0ZXJuIHJlZ2lzdGVyMSAqLworCisvKiAxNmJpdCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBYTVRfUklOR19MRU4wCQkweDE0MAkvKiBUcmFuc21pdCBSaW5nMCBsZW5ndGggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1UX1JJTkdfTEVOMQkJMHgxNDQJLyogVHJhbnNtaXQgUmluZzEgbGVuZ3RoIHJlZ2lzdGVyICovCisjZGVmaW5lIFhNVF9SSU5HX0xFTjIJCTB4MTQ4IAkvKiBUcmFuc21pdCBSaW5nMiBsZW5ndGggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1UX1JJTkdfTEVOMwkJMHgxNEMJLyogVHJhbnNtaXQgUmluZzMgbGVuZ3RoIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgUkNWX1JJTkdfTEVOMAkJMHgxNTAJLyogUmVjZWl2ZSBSaW5nMCBsZW5ndGggcmVnaXN0ZXIgKi8KKworI2RlZmluZSBTUkFNX1NJWkUJCTB4MTc4CS8qIFNSQU0gc2l6ZSByZWdpc3RlciAqLworI2RlZmluZSBTUkFNX0JPVU5EQVJZCQkweDE3QQkvKiBTUkFNIGJvdW5kYXJ5IHJlZ2lzdGVyICovCisKKy8qIDQ4Yml0IHJlZ2lzdGVyICovCisKKyNkZWZpbmUgUEFEUgkJCTB4MTYwCS8qIFBoeXNpY2FsIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBJRlMxCQkJMHgxOEMJLyogSW50ZXItZnJhbWUgc3BhY2luZyBQYXJ0MSByZWdpc3RlciAqLworI2RlZmluZSBJRlMJCQkweDE4RAkvKiBJbnRlci1mcmFtZSBzcGFjaW5nIHJlZ2lzdGVyICovCisjZGVmaW5lIElQRwkJCTB4MThFCS8qIEludGVyLWZyYW1lIGdhcCByZWdpc3RlciAqLworLyogNjRiaXQgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBMQURSRgkJCTB4MTY4CS8qIExvZ2ljYWwgYWRkcmVzcyBmaWx0ZXIgcmVnaXN0ZXIgKi8KKworCisvKiBSZWdpc3RlciBCaXQgRGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgZW51bSB7CisKKwlBU0ZfSU5JVF9ET05FCQk9ICgxIDw8IDEpLAorCUFTRl9JTklUX1BSRVNFTlQJPSAoMSA8PCAwKSwKKworfVNUQVRfQVNGX0JJVFM7IAorICAgCit0eXBlZGVmIGVudW0geworCisJTUlCX0NNRF9BQ1RJVkUJCT0gKDEgPDwgMTUgKSwKKwlNSUJfUkRfQ01ECQk9ICgxIDw8IDEzICksCisJTUlCX0NMRUFSCQk9ICgxIDw8IDEyICksCisJTUlCX0FERFJFU1MJCT0gKDEgPDwgMCkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpIHwgKDEgPDwgMyl8CisJCQkJCSgxIDw8IDQpIHwgKDEgPDwgNSksCit9TUlCX0FERFJfQklUUzsKKworCit0eXBlZGVmIGVudW0geworCQorCVBNQVRfREVUCQk9ICgxIDw8IDEyKSwKKwlNUF9ERVQJCSAgICAgICAgPSAoMSA8PCAxMSksCisJTENfREVUCQkJPSAoMSA8PCAxMCksCisJU1BFRURfTUFTSwkJPSAoMSA8PCA5KXwoMSA8PCA4KXwoMSA8PCA3KSwKKwlGVUxMX0RQTFgJCT0gKDEgPDwgNiksCisJTElOS19TVEFUUwkJPSAoMSA8PCA1KSwKKwlBVVRPTkVHX0NPTVBMRVRFCT0gKDEgPDwgNCksCisJTUlJUEQJCQk9ICgxIDw8IDMpLAorCVJYX1NVU1BFTkRFRAkJPSAoMSA8PCAyKSwKKwlUWF9TVVNQRU5ERUQJCT0gKDEgPDwgMSksCisJUlVOTklORwkJCT0gKDEgPDwgMCksCisKK31TVEFUMF9CSVRTOworCisjZGVmaW5lIFBIWV9TUEVFRF8xMAkJMHgyCisjZGVmaW5lIFBIWV9TUEVFRF8xMDAJCTB4MworCisvKiBJTlQwCQkJCTB4MzgsIDMyYml0IHJlZ2lzdGVyICovCit0eXBlZGVmIGVudW0geworCisJSU5UUgkJCT0gKDEgPDwgMzEpLAorCVBDU0lOVAkJCT0gKDEgPDwgMjgpLCAKKwlMQ0lOVAkJCT0gKDEgPDwgMjcpLAorCUFQSU5UNQkJCT0gKDEgPDwgMjYpLAorCUFQSU5UNAkJCT0gKDEgPDwgMjUpLAorCUFQSU5UMwkJCT0gKDEgPDwgMjQpLAorCVRJTlRfU1VNCQk9ICgxIDw8IDIzKSwKKwlBUElOVDIJCQk9ICgxIDw8IDIyKSwKKwlBUElOVDEJCQk9ICgxIDw8IDIxKSwKKwlBUElOVDAJCQk9ICgxIDw8IDIwKSwKKwlNSUlQRFRJTlQJCT0gKDEgPDwgMTkpLAorCU1DQ0lOVAkJCT0gKDEgPDwgMTcpLAorCU1SRUlOVAkJCT0gKDEgPDwgMTYpLAorCVJJTlRfU1VNCQk9ICgxIDw8IDE1KSwKKwlTUE5ESU5UCQkJPSAoMSA8PCAxNCksCisJTVBJTlQJCQk9ICgxIDw8IDEzKSwKKwlTSU5UCQkJPSAoMSA8PCAxMiksCisJVElOVDMJCQk9ICgxIDw8IDExKSwKKwlUSU5UMgkJCT0gKDEgPDwgMTApLAorCVRJTlQxCQkJPSAoMSA8PCA5KSwKKwlUSU5UMAkJCT0gKDEgPDwgOCksCisJVUlOVAkJCT0gKDEgPDwgNyksCisJU1RJTlQJCQk9ICgxIDw8IDQpLAorCVJJTlQwCQkJPSAoMSA8PCAwKSwKKworfUlOVDBfQklUUzsKKwordHlwZWRlZiBlbnVtIHsKKworCVZBTDMJCQk9ICgxIDw8IDMxKSwgICAvKiBWQUwgYml0IGZvciBieXRlIDMgKi8KKwlWQUwyCQkJPSAoMSA8PCAyMyksICAgLyogVkFMIGJpdCBmb3IgYnl0ZSAyICovCisJVkFMMQkJCT0gKDEgPDwgMTUpLCAgIC8qIFZBTCBiaXQgZm9yIGJ5dGUgMSAqLworCVZBTDAJCQk9ICgxIDw8IDcpLCAgICAvKiBWQUwgYml0IGZvciBieXRlIDAgKi8KKworfVZBTF9CSVRTOworCit0eXBlZGVmIGVudW0geworCisJLyogVkFMMyAqLworCUxDSU5URU4JCQk9ICgxIDw8IDI3KSwKKwlBUElOVDVFTgkJPSAoMSA8PCAyNiksCisJQVBJTlQ0RU4JCT0gKDEgPDwgMjUpLAorCUFQSU5UM0VOCQk9ICgxIDw8IDI0KSwKKwkvKiBWQUwyICovCisJQVBJTlQyRU4JCT0gKDEgPDwgMjIpLAorCUFQSU5UMUVOCQk9ICgxIDw8IDIxKSwKKwlBUElOVDBFTgkJPSAoMSA8PCAyMCksCisJTUlJUERUSU5URU4JCT0gKDEgPDwgMTkpLAorCU1DQ0lJTlRFTgkJPSAoMSA8PCAxOCksCisJTUNDSU5URU4JCT0gKDEgPDwgMTcpLAorCU1SRUlOVEVOCQk9ICgxIDw8IDE2KSwKKwkvKiBWQUwxICovCisJU1BORElOVEVOCQk9ICgxIDw8IDE0KSwKKwlNUElOVEVOCQkJPSAoMSA8PCAxMyksCisJVElOVEVOMwkJCT0gKDEgPDwgMTEpLAorCVNJTlRFTgkJCT0gKDEgPDwgMTIpLAorCVRJTlRFTjIJCQk9ICgxIDw8IDEwKSwKKwlUSU5URU4xCQkJPSAoMSA8PCA5KSwKKwlUSU5URU4wCQkJPSAoMSA8PCA4KSwKKwkvKiBWQUwwICovCisJU1RJTlRFTgkJCT0gKDEgPDwgNCksCisJUklOVEVOMAkJCT0gKDEgPDwgMCksCisKKwlJTlRFTjBfQ0xFQVIgCQk9IDB4MUY3RjdGMUYsIC8qIENvbW1hbmQgc3R5bGUgcmVnaXN0ZXIgKi8KKworfUlOVEVOMF9CSVRTOwkJCisKK3R5cGVkZWYgZW51bSB7CisJLyogVkFMMiAqLworCVJETUQwCQkJPSAoMSA8PCAxNiksCisJLyogVkFMMSAqLworCVRETUQzCQkJPSAoMSA8PCAxMSksCisJVERNRDIJCQk9ICgxIDw8IDEwKSwKKwlURE1EMQkJCT0gKDEgPDwgOSksCisJVERNRDAJCQk9ICgxIDw8IDgpLAorCS8qIFZBTDAgKi8KKwlVSU5UQ01ECQkJPSAoMSA8PCA2KSwKKwlSWF9GQVNUX1NQTkQJCT0gKDEgPDwgNSksCisJVFhfRkFTVF9TUE5ECQk9ICgxIDw8IDQpLAorCVJYX1NQTkQJCQk9ICgxIDw8IDMpLAorCVRYX1NQTkQJCQk9ICgxIDw8IDIpLAorCUlOVFJFTgkJCT0gKDEgPDwgMSksCisJUlVOCQkJPSAoMSA8PCAwKSwKKworCUNNRDBfQ0xFQVIgCQk9IDB4MDAwRjBGN0YsICAgLyogQ29tbWFuZCBzdHlsZSByZWdpc3RlciAqLwkKKworfUNNRDBfQklUUzsKKwordHlwZWRlZiBlbnVtIHsKKworCS8qIFZBTDMgKi8KKwlDT05EVUlUX01PREUJCT0gKDEgPDwgMjkpLAorCS8qIFZBTDIgKi8KKwlSUEEJCQk9ICgxIDw8IDE5KSwKKwlEUkNWUEEJCQk9ICgxIDw8IDE4KSwKKwlEUkNWQkMJCQk9ICgxIDw8IDE3KSwKKwlQUk9NCQkJPSAoMSA8PCAxNiksCisJLyogVkFMMSAqLworCUFTVFJQX1JDVgkJPSAoMSA8PCAxMyksCisJUkNWX0RST1AwCSAgCT0gKDEgPDwgMTIpLAorCUVNQkEJCQk9ICgxIDw8IDExKSwKKwlEWE1UMlBECQkJPSAoMSA8PCAxMCksCisJTFRJTlRFTgkJCT0gKDEgPDwgOSksCisJRFhNVEZDUwkJCT0gKDEgPDwgOCksCisJLyogVkFMMCAqLworCUFQQURfWE1UCQk9ICgxIDw8IDYpLAorCURSVFkJCQk9ICgxIDw8IDUpLAorCUlOTE9PUAkJCT0gKDEgPDwgNCksCisJRVhMT09QCQkJPSAoMSA8PCAzKSwKKwlSRVhfUlRSWQkJPSAoMSA8PCAyKSwKKwlSRVhfVUZMTwkJPSAoMSA8PCAxKSwKKwlSRVhfTENPTAkJPSAoMSA8PCAwKSwKKworCUNNRDJfQ0xFQVIgCQk9IDB4M0Y3RjNGN0YsICAgLyogQ29tbWFuZCBzdHlsZSByZWdpc3RlciAqLworCit9Q01EMl9CSVRTOworCit0eXBlZGVmIGVudW0geworCisJLyogVkFMMyAqLworCUFTRl9JTklUX0RPTkVfQUxJQVMJPSAoMSA8PCAyOSksCisJLyogVkFMMiAqLworCUpVTUJPCQkJPSAoMSA8PCAyMSksCisJVlNJWkUJCQk9ICgxIDw8IDIwKSwJCisJVkxPTkxZCQkJPSAoMSA8PCAxOSksCisJVkxfVEFHX0RFTAkJPSAoMSA8PCAxOCksCQorCS8qIFZBTDEgKi8KKwlFTl9QTUdSCQkJPSAoMSA8PCAxNCksCQkJCisJSU5UTEVWRUwJCT0gKDEgPDwgMTMpLAorCUZPUkNFX0ZVTExfRFVQTEVYCT0gKDEgPDwgMTIpLAkKKwlGT1JDRV9MSU5LX1NUQVRVUwk9ICgxIDw8IDExKSwJCisJQVBFUAkJCT0gKDEgPDwgMTApLAkKKwlNUFBMQkEJCQk9ICgxIDw8IDkpLAkKKwkvKiBWQUwwICovCisJUkVTRVRfUEhZX1BVTFNFCQk9ICgxIDw8IDIpLAkKKwlSRVNFVF9QSFkJCT0gKDEgPDwgMSksCQorCVBIWV9SU1RfUE9MCQk9ICgxIDw8IDApLAkKKworfUNNRDNfQklUUzsKKworCit0eXBlZGVmIGVudW0geworCisJLyogVkFMMCAqLworCVBNQVRfU0FWRV9NQVRDSAkJPSAoMSA8PCA0KSwKKwlQTUFUX01PREUJCT0gKDEgPDwgMyksCisJTVBFTl9TVwkJCT0gKDEgPDwgMSksCisJTENNT0RFX1NXCQk9ICgxIDw8IDApLAorCisJQ01EN19DTEVBUiAgCQk9IDB4MDAwMDAwMUIJLyogQ29tbWFuZCBzdHlsZSByZWdpc3RlciAqLworCit9Q01EN19CSVRTOworCisKK3R5cGVkZWYgZW51bSB7CisKKwlSRVNFVF9QSFlfV0lEVEgJCT0gKDB4RiA8PCAxNikgfCAoMHhGPDwgMjApLCAvKiAweDAwRkYwMDAwICovCisJWE1UU1BfTUFTSwkJPSAoMSA8PCA5KSB8ICgxIDw8IDgpLAkvKiA5OjggKi8KKwlYTVRTUF8xMjgJCT0gKDEgPDwgOSksCS8qIDkgKi8JCisJWE1UU1BfNjQJCT0gKDEgPDwgOCksCisJQ0FDSEVfQUxJR04JCT0gKDEgPDwgNCksCisJQlVSU1RfTElNSVRfTUFTSwk9ICgweEYgPDwgMCApLAorCUNUUkwxX0RFRkFVTFQJCT0gMHgwMDAxMDExMSwKKworfUNUUkwxX0JJVFM7CisKK3R5cGVkZWYgZW51bSB7CisKKwlGTURDX01BU0sJCT0gKDEgPDwgOSl8KDEgPDwgOCksCS8qIDk6OCAqLworCVhQSFlSU1QJCQk9ICgxIDw8IDcpLAorCVhQSFlBTkUJCQk9ICgxIDw8IDYpLAorCVhQSFlGRAkJCT0gKDEgPDwgNSksCisJWFBIWVNQCQkJPSAoMSA8PCA0KSB8ICgxIDw8IDMpLAkvKiA0OjMgKi8KKwlBUERXX01BU0sJCT0gKDEgPDwJMikgfCAoMSA8PCAxKSB8ICgxIDw8IDApLCAvKiAyOjAgKi8KKworfUNUUkwyX0JJVFM7CisKKy8qIFhNVF9SSU5HX0xJTUlUCQkweDdDLCAzMmJpdCByZWdpc3RlciAqLwordHlwZWRlZiBlbnVtIHsKKworCVhNVF9SSU5HMl9MSU1JVAkJPSAoMHhGRiA8PCAxNiksCS8qIDIzOjE2ICovCisJWE1UX1JJTkcxX0xJTUlUCQk9ICgweEZGIDw8IDgpLAkvKiAxNTo4ICovCisJWE1UX1JJTkcwX0xJTUlUCQk9ICgweEZGIDw8IDApLCAJLyogNzowICovCisKK31YTVRfUklOR19MSU1JVF9CSVRTOworCit0eXBlZGVmIGVudW0geworCisJQVBfUkVHMF9FTgkJPSAoMSA8PCAxNSksCisJQVBfUkVHMF9BRERSX01BU0sJPSAoMHhGIDw8IDgpIHwoMSA8PCAxMiksLyogMTI6OCAqLworCUFQX1BIWTBfQUREUl9NQVNLCT0gKDB4RiA8PCAwKSB8KDEgPDwgNCksLyogNDowICovCisKK31BVVRPUE9MTDBfQklUUzsKKworLyogQVVUT1BPTEwxCQkJMHg4QSwgMTZiaXQgcmVnaXN0ZXIgKi8KK3R5cGVkZWYgZW51bSB7CisKKwlBUF9SRUcxX0VOCQk9ICgxIDw8IDE1KSwKKwlBUF9SRUcxX0FERFJfTUFTSwk9ICgweEYgPDwgOCkgfCgxIDw8IDEyKSwvKiAxMjo4ICovCisJQVBfUFJFX1NVUDEJCT0gKDEgPDwgNiksCisJQVBfUEhZMV9ERkxUCQk9ICgxIDw8IDUpLAorCUFQX1BIWTFfQUREUl9NQVNLCT0gKDB4RiA8PCAwKSB8KDEgPDwgNCksLyogNDowICovCisKK31BVVRPUE9MTDFfQklUUzsKKworCit0eXBlZGVmIGVudW0geworCisJQVBfUkVHMl9FTgkJPSAoMSA8PCAxNSksCisJQVBfUkVHMl9BRERSX01BU0sJPSAoMHhGIDw8IDgpIHwoMSA8PCAxMiksLyogMTI6OCAqLworCUFQX1BSRV9TVVAyCQk9ICgxIDw8IDYpLAorCUFQX1BIWTJfREZMVAkJPSAoMSA8PCA1KSwKKwlBUF9QSFkyX0FERFJfTUFTSwk9ICgweEYgPDwgMCkgfCgxIDw8IDQpLC8qIDQ6MCAqLworCit9QVVUT1BPTEwyX0JJVFM7CisKK3R5cGVkZWYgZW51bSB7CisKKwlBUF9SRUczX0VOCQk9ICgxIDw8IDE1KSwKKwlBUF9SRUczX0FERFJfTUFTSwk9ICgweEYgPDwgOCkgfCgxIDw8IDEyKSwvKiAxMjo4ICovCisJQVBfUFJFX1NVUDMJCT0gKDEgPDwgNiksCisJQVBfUEhZM19ERkxUCQk9ICgxIDw8IDUpLAorCUFQX1BIWTNfQUREUl9NQVNLCT0gKDB4RiA8PCAwKSB8KDEgPDwgNCksLyogNDowICovCisKK31BVVRPUE9MTDNfQklUUzsKKworCit0eXBlZGVmIGVudW0geworCisJQVBfUkVHNF9FTgkJPSAoMSA8PCAxNSksCisJQVBfUkVHNF9BRERSX01BU0sJPSAoMHhGIDw8IDgpIHwoMSA8PCAxMiksLyogMTI6OCAqLworCUFQX1BSRV9TVVA0CQk9ICgxIDw8IDYpLAorCUFQX1BIWTRfREZMVAkJPSAoMSA8PCA1KSwKKwlBUF9QSFk0X0FERFJfTUFTSwk9ICgweEYgPDwgMCkgfCgxIDw8IDQpLC8qIDQ6MCAqLworCit9QVVUT1BPTEw0X0JJVFM7CisKKwordHlwZWRlZiBlbnVtIHsKKworCUFQX1JFRzVfRU4JCT0gKDEgPDwgMTUpLAorCUFQX1JFRzVfQUREUl9NQVNLCT0gKDB4RiA8PCA4KSB8KDEgPDwgMTIpLC8qIDEyOjggKi8KKwlBUF9QUkVfU1VQNQkJPSAoMSA8PCA2KSwKKwlBUF9QSFk1X0RGTFQJCT0gKDEgPDwgNSksCisJQVBfUEhZNV9BRERSX01BU0sJPSAoMHhGIDw8IDApIHwoMSA8PCA0KSwvKiA0OjAgKi8KKworfUFVVE9QT0xMNV9CSVRTOworCisKKworCisvKiBBUF9WQUxVRSAJCQkweDk4LCAzMmJpdCByYWdpc3RlciAqLwordHlwZWRlZiBlbnVtIHsKKworCUFQX1ZBTF9BQ1RJVkUJCT0gKDEgPDwgMzEpLAorCUFQX1ZBTF9SRF9DTUQJCT0gKCAxIDw8IDI5KSwKKwlBUF9BRERSCQkJPSAoMSA8PCAxOCl8KDEgPDwgMTcpfCgxIDw8IDE2KSwgLyogMTg6MTYgKi8KKwlBUF9WQUwJCQk9ICgweEYgPDwgMCkgfCAoMHhGIDw8IDQpIHwoIDB4RiA8PCA4KSB8CisJCQkJICAoMHhGIDw8IDEyKSwJLyogMTU6MCAqLworCit9QVBfVkFMVUVfQklUUzsKKwordHlwZWRlZiBlbnVtIHsKKworCURMWV9JTlRfQV9SMwkJPSAoMSA8PCAzMSksCisJRExZX0lOVF9BX1IyCQk9ICgxIDw8IDMwKSwKKwlETFlfSU5UX0FfUjEJCT0gKDEgPDwgMjkpLAorCURMWV9JTlRfQV9SMAkJPSAoMSA8PCAyOCksCisJRExZX0lOVF9BX1QzCQk9ICgxIDw8IDI3KSwKKwlETFlfSU5UX0FfVDIJCT0gKDEgPDwgMjYpLAorCURMWV9JTlRfQV9UMQkJPSAoMSA8PCAyNSksCisJRExZX0lOVF9BX1QwCQk9ICggMSA8PCAyNCksCisJRVZFTlRfQ09VTlRfQQkJPSAoMHhGIDw8IDE2KSB8ICgweDEgPDwgMjApLC8qIDIwOjE2ICovCisJTUFYX0RFTEFZX1RJTUVfQQk9ICgweEYgPDwgMCkgfCAoMHhGIDw8IDQpIHwgKDEgPDwgOCl8CisJCQkJICAoMSA8PCA5KSB8ICgxIDw8IDEwKSwJLyogMTA6MCAqLworCit9RExZX0lOVF9BX0JJVFM7CisKK3R5cGVkZWYgZW51bSB7CisKKwlETFlfSU5UX0JfUjMJCT0gKDEgPDwgMzEpLAorCURMWV9JTlRfQl9SMgkJPSAoMSA8PCAzMCksCisJRExZX0lOVF9CX1IxCQk9ICgxIDw8IDI5KSwKKwlETFlfSU5UX0JfUjAJCT0gKDEgPDwgMjgpLAorCURMWV9JTlRfQl9UMwkJPSAoMSA8PCAyNyksCisJRExZX0lOVF9CX1QyCQk9ICgxIDw8IDI2KSwKKwlETFlfSU5UX0JfVDEJCT0gKDEgPDwgMjUpLAorCURMWV9JTlRfQl9UMAkJPSAoIDEgPDwgMjQpLAorCUVWRU5UX0NPVU5UX0IJCT0gKDB4RiA8PCAxNikgfCAoMHgxIDw8IDIwKSwvKiAyMDoxNiAqLworCU1BWF9ERUxBWV9USU1FX0IJPSAoMHhGIDw8IDApIHwgKDB4RiA8PCA0KSB8ICgxIDw8IDgpfCAKKwkJCQkgICgxIDw8IDkpIHwgKDEgPDwgMTApLAkvKiAxMDowICovCit9RExZX0lOVF9CX0JJVFM7CisKKworLyogRkxPV19DT05UUk9MIAkJMHhDOCwgMzJiaXQgcmVnaXN0ZXIgKi8KK3R5cGVkZWYgZW51bSB7CisKKwlQQVVTRV9MRU5fQ0hHCQk9ICgxIDw8IDMwKSwKKwlGVFBFCQkJPSAoMSA8PCAyMiksCisJRlJQRQkJCT0gKDEgPDwgMjEpLAorCU5BUEEJCQk9ICgxIDw8IDIwKSwKKwlOUEEJCQk9ICgxIDw8IDE5KSwKKwlGSVhQCQkJPSAoIDEgPDwgMTgpLAorCUZDQ01ECQkJPSAoIDEgPDwgMTYpLAorCVBBVVNFX0xFTgkJPSAoMHhGIDw8IDApIHwgKDB4RiA8PCA0KSB8KCAweEYgPDwgOCkgfAkgCQkJCSAgKDB4RiA8PCAxMiksCS8qIDE1OjAgKi8KKworfUZMT1dfQ09OVFJPTF9CSVRTOworCisvKiBQSFlfIEFDQ0VTUwkJCTB4RDAsIDMyYml0IHJlZ2lzdGVyICovCit0eXBlZGVmIGVudW0geworCisJUEhZX0NNRF9BQ1RJVkUJCT0gKDEgPDwgMzEpLAorCVBIWV9XUl9DTUQJCT0gKDEgPDwgMzApLAorCVBIWV9SRF9DTUQJCT0gKDEgPDwgMjkpLAorCVBIWV9SRF9FUlIJCT0gKDEgPDwgMjgpLAorCVBIWV9QUkVfU1VQCQk9ICgxIDw8IDI3KSwKKwlQSFlfQUREUgkJPSAoMSA8PCAyMSkgfCAoMSA8PCAyMikgfCAoMSA8PCAyMyl8CisJCQkJICAJKDEgPDwgMjQpIHwoMSA8PCAyNSksLyogMjU6MjEgKi8KKwlQSFlfUkVHX0FERFIJCT0gKDEgPDwgMTYpIHwgKDEgPDwgMTcpIHwgKDEgPDwgMTgpfAkgCQkJICAJICAgCSAgCSgxIDw8IDE5KSB8ICgxIDw8IDIwKSwvKiAyMDoxNiAqLworCVBIWV9EQVRBCQk9ICgweEYgPDwgMCl8KDB4RiA8PCA0KSB8KDB4RiA8PCA4KXwKKwkJCQkJKDB4RiA8PCAxMiksLyogMTU6MCAqLworCit9UEhZX0FDQ0VTU19CSVRTOworCisKKy8qIFBNQVQwCQkJMHgxOTAsCSAzMmJpdCByZWdpc3RlciAqLwordHlwZWRlZiBlbnVtIHsKKwlQTVJfQUNUSVZFCQk9ICgxIDw8IDMxKSwKKwlQTVJfV1JfQ01ECQk9ICgxIDw8IDMwKSwKKwlQTVJfUkRfQ01ECQk9ICgxIDw8IDI5KSwKKwlQTVJfQkFOSwkJPSAoMSA8PDI4KSwKKwlQTVJfQUREUgkJPSAoMHhGIDw8IDE2KXwoMSA8PCAyMCl8KDEgPDwgMjEpfAorCQkJCSAgCSgxIDw8IDIyKSwvKiAyMjoxNiAqLworCVBNUl9CNAkJCT0gKDB4RiA8PCAwKSB8ICgweEYgPDwgNCksLyogMTU6MCAqLworfVBNQVQwX0JJVFM7CisKKworLyogUE1BVDEJCQkweDE5NCwJIDMyYml0IHJlZ2lzdGVyICovCit0eXBlZGVmIGVudW0geworCVBNUl9CMwkJCT0gKDB4RiA8PCAyNCkgfCAoMHhGIDw8MjgpLC8qIDMxOjI0ICovCisJUE1SX0IyCQkJPSAoMHhGIDw8IDE2KSB8KDB4RiA8PCAyMCksLyogMjM6MTYgKi8KKwlQTVJfQjEJCQk9ICgweEYgPDwgOCkgfCAoMHhGIDw8MTIpLCAvKiAxNTo4ICovCisJUE1SX0IwCQkJPSAoMHhGIDw8IDApfCgweEYgPDwgNCksLyogNzowICovCit9UE1BVDFfQklUUzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICBNSUIgY291bnRlciBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgcmN2X21pc3NfcGt0cwkJCQkweDAwCisjZGVmaW5lIHJjdl9vY3RldHMJCQkJMHgwMQorI2RlZmluZSByY3ZfYnJvYWRjYXN0X3BrdHMJCQkweDAyCisjZGVmaW5lIHJjdl9tdWx0aWNhc3RfcGt0cwkJCTB4MDMKKyNkZWZpbmUgcmN2X3VuZGVyc2l6ZV9wa3RzCQkJMHgwNAorI2RlZmluZSByY3Zfb3ZlcnNpemVfcGt0cwkJCTB4MDUKKyNkZWZpbmUgcmN2X2ZyYWdtZW50cwkJCQkweDA2CisjZGVmaW5lIHJjdl9qYWJiZXJzCQkJCTB4MDcKKyNkZWZpbmUgcmN2X3VuaWNhc3RfcGt0cwkJCTB4MDgKKyNkZWZpbmUgcmN2X2FsaWdubWVudF9lcnJvcnMJCQkweDA5CisjZGVmaW5lIHJjdl9mY3NfZXJyb3JzCQkJCTB4MEEKKyNkZWZpbmUgcmN2X2dvb2Rfb2N0ZXRzCQkJCTB4MEIKKyNkZWZpbmUgcmN2X21hY19jdHJsCQkJCTB4MEMKKyNkZWZpbmUgcmN2X2Zsb3dfY3RybAkJCQkweDBECisjZGVmaW5lIHJjdl9wa3RzXzY0X29jdGV0cwkJCTB4MEUKKyNkZWZpbmUgcmN2X3BrdHNfNjV0bzEyN19vY3RldHMJCQkweDBGCisjZGVmaW5lIHJjdl9wa3RzXzEyOHRvMjU1X29jdGV0cwkJMHgxMAorI2RlZmluZSByY3ZfcGt0c18yNTZ0bzUxMV9vY3RldHMJCTB4MTEKKyNkZWZpbmUgcmN2X3BrdHNfNTEydG8xMDIzX29jdGV0cwkJMHgxMgorI2RlZmluZSByY3ZfcGt0c18xMDI0dG8xNTE4X29jdGV0cwkJMHgxMworI2RlZmluZSByY3ZfdW5zdXBwb3J0ZWRfb3Bjb2RlCQkJMHgxNAorI2RlZmluZSByY3Zfc3ltYm9sX2Vycm9ycwkJCTB4MTUKKyNkZWZpbmUgcmN2X2Ryb3BfcGt0c19yaW5nMQkJCTB4MTYKKyNkZWZpbmUgcmN2X2Ryb3BfcGt0c19yaW5nMgkJCTB4MTcKKyNkZWZpbmUgcmN2X2Ryb3BfcGt0c19yaW5nMwkJCTB4MTgKKyNkZWZpbmUgcmN2X2Ryb3BfcGt0c19yaW5nNAkJCTB4MTkKKyNkZWZpbmUgcmN2X2p1bWJvX3BrdHMJCQkJMHgxQQorCisjZGVmaW5lIHhtdF91bmRlcnJ1bl9wa3RzCQkJMHgyMAorI2RlZmluZSB4bXRfb2N0ZXRzCQkJCTB4MjEKKyNkZWZpbmUgeG10X3BhY2tldHMJCQkJMHgyMgorI2RlZmluZSB4bXRfYnJvYWRjYXN0X3BrdHMJCQkweDIzCisjZGVmaW5lIHhtdF9tdWx0aWNhc3RfcGt0cwkJCTB4MjQKKyNkZWZpbmUgeG10X2NvbGxpc2lvbnMJCQkJMHgyNQorI2RlZmluZSB4bXRfdW5pY2FzdF9wa3RzCQkJMHgyNgorI2RlZmluZSB4bXRfb25lX2NvbGxpc2lvbgkJCTB4MjcKKyNkZWZpbmUgeG10X211bHRpcGxlX2NvbGxpc2lvbgkJCTB4MjgKKyNkZWZpbmUgeG10X2RlZmVycmVkX3RyYW5zbWl0CQkJMHgyOQorI2RlZmluZSB4bXRfbGF0ZV9jb2xsaXNpb24JCQkweDJBCisjZGVmaW5lIHhtdF9leGNlc3NpdmVfZGVmZXIJCQkweDJCCisjZGVmaW5lIHhtdF9sb3NzX2NhcnJpZXIJCQkweDJDCisjZGVmaW5lIHhtdF9leGNlc3NpdmVfY29sbGlzaW9uCQkJMHgyRAorI2RlZmluZSB4bXRfYmFja19wcmVzc3VyZQkJCTB4MkUKKyNkZWZpbmUgeG10X2Zsb3dfY3RybAkJCQkweDJGCisjZGVmaW5lIHhtdF9wa3RzXzY0X29jdGV0cwkJCTB4MzAKKyNkZWZpbmUgeG10X3BrdHNfNjV0bzEyN19vY3RldHMJCQkweDMxCisjZGVmaW5lIHhtdF9wa3RzXzEyOHRvMjU1X29jdGV0cwkJMHgzMgorI2RlZmluZSB4bXRfcGt0c18yNTZ0bzUxMV9vY3RldHMJCTB4MzMKKyNkZWZpbmUgeG10X3BrdHNfNTEydG8xMDIzX29jdGV0cwkJMHgzNAorI2RlZmluZSB4bXRfcGt0c18xMDI0dG8xNTE4X29jdGV0CQkweDM1CisjZGVmaW5lIHhtdF9vdmVyc2l6ZV9wa3RzCQkJMHgzNgorI2RlZmluZSB4bXRfanVtYm9fcGt0cwkJCQkweDM3CisKKworLyogRHJpdmVyIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUJIFBDSV9WRU5ET1JfSURfQU1ECQkweDEwMjIKKyNkZWZpbmUgIFBDSV9ERVZJQ0VfSURfQU1EODExMUVfNzQ2MgkweDc0NjIKKworI2RlZmluZSBNQVhfVU5JVFMJCQk4IC8qIE1heGltdW0gbnVtYmVyIG9mIGRldmljZXMgcG9zc2libGUgKi8KKworI2RlZmluZSBOVU1fVFhfQlVGRkVSUwkJCTMyIC8qIE51bWJlciBvZiB0cmFuc21pdCBidWZmZXJzICovCisjZGVmaW5lIE5VTV9SWF9CVUZGRVJTCQkJMzIgLyogTnVtYmVyIG9mIHJlY2VpdmUgYnVmZmVycyAqLwkKKworI2RlZmluZSBUWF9CVUZGX01PRF9NQVNLICAgICAgICAgCTMxIC8qIChOVU1fVFhfQlVGRkVSUyAtMSkgKi8KKyNkZWZpbmUgUlhfQlVGRl9NT0RfTUFTSyAgICAgICAgIAkzMSAvKiAoTlVNX1JYX0JVRkZFUlMgLTEpICovCisKKyNkZWZpbmUgTlVNX1RYX1JJTkdfRFIJCQkzMiAgCisjZGVmaW5lIE5VTV9SWF9SSU5HX0RSCQkJMzIgCisKKyNkZWZpbmUgVFhfUklOR19EUl9NT0RfTUFTSyAgICAgICAgIAkzMSAvKiAoTlVNX1RYX1JJTkdfRFIgLTEpICovCisjZGVmaW5lIFJYX1JJTkdfRFJfTU9EX01BU0sgICAgICAgICAJMzEgLyogKE5VTV9SWF9SSU5HX0RSIC0xKSAqLworCisjZGVmaW5lIE1BWF9GSUxURVJfU0laRQkJCTY0IC8qIE1heGltdW0gbXVsdGljYXN0IGFkZHJlc3MgKi8gCisjZGVmaW5lIEFNRDgxMTFFX01JTl9NVFUJIAk2MCAJCisjZGVmaW5lIEFNRDgxMTFFX01BWF9NVFUJCTkwMDAJCQkKKworI2RlZmluZSBQS1RfQlVGRl9TWgkJCTE1MzYKKyNkZWZpbmUgTUlOX1BLVF9MRU4JCQk2MAorI2RlZmluZSBFVEhfQUREUl9MRU4JCQk2CisKKyNkZWZpbmUgIEFNRDgxMTFFX1RYX1RJTUVPVVQJCSgzICogSFopLyogMyBzZWMgKi8KKyNkZWZpbmUgU09GVF9USU1FUl9GUkVRIAkJMHhCRUJDICAvKiAwLjUgc2VjICovCisjZGVmaW5lIERFTEFZX1RJTUVSX0NPTlYJCTUwICAgIC8qIG1zZWMgdG8gMTAgdXNlYyBjb252ZXJzaW9uLgorCQkJCQkJIE9ubHkgNTAwIHVzZWMgcmVzb2x1dGlvbiAqLyAJCQkJCQkgCisjZGVmaW5lIE9QVElPTl9WTEFOX0VOQUJMRQkJMHgwMDAxCisjZGVmaW5lIE9QVElPTl9KVU1CT19FTkFCTEUJCTB4MDAwMgorI2RlZmluZSBPUFRJT05fTVVMVElDQVNUX0VOQUJMRQkJMHgwMDA0CisjZGVmaW5lIE9QVElPTl9XT0xfRU5BQkxFCQkweDAwMDgKKyNkZWZpbmUgT1BUSU9OX1dBS0VfTUFHSUNfRU5BQkxFCTB4MDAxMAorI2RlZmluZSBPUFRJT05fV0FLRV9QSFlfRU5BQkxFCQkweDAwMjAKKyNkZWZpbmUgT1BUSU9OX0lOVFJfQ09BTF9FTkFCTEUJCTB4MDA0MAorI2RlZmluZSBPUFRJT05fRFlOX0lQR19FTkFCTEUJICAgICAgICAweDAwODAKKworI2RlZmluZSBQSFlfUkVHX0FERFJfTUFTSwkJMHgxZgorCisvKiBpcGcgcGFyYW1ldGVycyAqLworI2RlZmluZSBERUZBVUxUX0lQRwkJCTB4NjAKKyNkZWZpbmUgSUZTMV9ERUxUQQkJCTM2CisjZGVmaW5lCUlQR19DT05WRVJHRV9KSUZGSUVTIChIWi8yKQorI2RlZmluZQlJUEdfU1RBQkxFX1RJTUUJNQorI2RlZmluZQlNSU5fSVBHCTk2CisjZGVmaW5lCU1BWF9JUEcJMjU1CisjZGVmaW5lIElQR19TVEVQCTE2CisjZGVmaW5lIENTVEFURSAgMSAKKyNkZWZpbmUgU1NUQVRFICAyIAorCisvKiBBc3N1bWUgY29udG9sbGVyIGdldHMgZGF0YSAxMCB0aW1lcyB0aGUgbWF4aW11bSBwcm9jZXNzaW5nIHRpbWUgKi8KKyNkZWZpbmUgIFJFUEVBVF9DTlQJCQkxMDsgCisgICAgIAorLyogYW1kODExMWUgZGVjcmlwdG9yIGZsYWcgZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgZW51bSB7CisKKwlPV05fQklUCQk9CSgxIDw8IDE1KSwKKwlBRERfRkNTX0JJVAk9CSgxIDw8IDEzKSwKKwlMVElOVF9CSVQJPQkoMSA8PCAxMiksCisJU1RQX0JJVAkJPQkoMSA8PCA5KSwKKwlFTlBfQklUCQk9CSgxIDw8IDgpLAorCUtJTExfQklUCT0gCSgxIDw8IDYpLAorCVRDQ19WTEFOX0lOU0VSVAk9CSgxIDw8IDEpLAorCVRDQ19WTEFOX1JFUExBQ0UgPQkoMSA8PCAxKSB8KCAxPDwgMCksCisKK31UWF9GTEFHX0JJVFM7CisKK3R5cGVkZWYgZW51bSB7CisJRVJSX0JJVCAJPQkoMSA8PCAxNCksCisJRlJBTV9CSVQJPSAgCSgxIDw8IDEzKSwKKwlPRkxPX0JJVAk9ICAgICAgICgxIDw8IDEyKSwKKwlDUkNfQklUCQk9CSgxIDw8IDExKSwKKwlQQU1fQklUCQk9CSgxIDw8IDYpLAorCUxBRk1fQklUCT0gCSgxIDw8IDUpLAorCUJBTV9CSVQJCT0JKDEgPDwgNCksCisJVFRfVkxBTl9UQUdHRUQJPSAJKDEgPDwgMykgfCgxIDw8IDIpLC8qIDB4MDAwICovCisJVFRfUFJUWV9UQUdHRUQJPQkoMSA8PCAzKSwvKiAweDAwMDggKi8KKworfVJYX0ZMQUdfQklUUzsKKworI2RlZmluZSBSRVNFVF9SWF9GTEFHUwkJMHgwMDAwCisjZGVmaW5lIFRUX01BU0sJCQkweDAwMGMKKyNkZWZpbmUgVENDX01BU0sJCTB4MDAwMworCisvKiBkcml2ZXIgaW9jdGwgcGFyYW1ldGVycyAqLworI2RlZmluZSBBTUQ4MTExRV9SRUdfRFVNUF9MRU4JIDEzKnNpemVvZih1MzIpIAorCisvKiBjcmMgZ2VuZXJhdG9yIGNvbnN0YW50cyAqLworI2RlZmluZSBDUkMzMiAweGVkYjg4MzIwCisjZGVmaW5lIElOSVRDUkMgMHhGRkZGRkZGRgorCisvKiBhbWQ4MTExZSBkZXNyaXB0b3IgZm9ybWF0ICovCisKK3N0cnVjdCBhbWQ4MTExZV90eF9kcnsKKworCXUxNiBidWZmX2NvdW50OyAvKiBTaXplIG9mIHRoZSBidWZmZXIgcG9pbnRlZCBieSB0aGlzIGRlc2NyaXB0b3IgKi8KKworCXUxNiB0eF9mbGFnczsKKworCXUxNiB0YWdfY3RybF9pbmZvOworCisJdTE2IHRhZ19jdHJsX2NtZDsKKworCXUzMiBidWZmX3BoeV9hZGRyOworCisJdTMyIHJlc2VydmVkOworfTsgCisKK3N0cnVjdCBhbWQ4MTExZV9yeF9kcnsKKwkKKwl1MzIgcmVzZXJ2ZWQ7CisKKwl1MTYgbXNnX2NvdW50OyAvKiBSZWNlaXZlZCBtZXNzYWdlIGxlbiAqLworCisJdTE2IHRhZ19jdHJsX2luZm87IAorCisJdTE2IGJ1ZmZfY291bnQ7ICAvKiBMZW4gb2YgdGhlIGJ1ZmZlciBwb2ludGVkIGJ5IGRlc2NyaXB0b3IuICovCisKKwl1MTYgcnhfZmxhZ3M7CisKKwl1MzIgYnVmZl9waHlfYWRkcjsKKworfTsKK3N0cnVjdCBhbWQ4MTExZV9saW5rX2NvbmZpZ3sKKworI2RlZmluZSBTUEVFRF9JTlZBTElECQkweGZmZmYKKyNkZWZpbmUgRFVQTEVYX0lOVkFMSUQJCTB4ZmYKKyNkZWZpbmUgQVVUT05FR19JTlZBTElECQkweGZmCisJCisJdW5zaWduZWQgbG9uZwkJCW9yaWdfcGh5X29wdGlvbjsKKwl1MTYJCQkJc3BlZWQ7CisJdTgJCQkJZHVwbGV4OworCXU4CQkJCWF1dG9uZWc7CisJdTgJCQkJcmVzZXJ2ZWQ7ICAvKiAzMmJpdCBhbGlnbm1lbnQgKi8KK307CisKK2VudW0gY29hbF90eXBleworCisJTk9fQ09BTEVTQ0UsCisJTE9XX0NPQUxFU0NFLAorCU1FRElVTV9DT0FMRVNDRSwKKwlISUdIX0NPQUxFU0NFLAorCit9OworCitlbnVtIGNvYWxfbW9kZXsgCisgICAgICAgCVJYX0lOVFJfQ09BTCwKKwlUWF9JTlRSX0NPQUwsCisJRElTQUJMRV9DT0FMLAorCUVOQUJMRV9DT0FMLAorCit9OworI2RlZmluZSBNQVhfVElNRU9VVAk0MAorI2RlZmluZSBNQVhfRVZFTlRfQ09VTlQgMzEKK3N0cnVjdCBhbWQ4MTExZV9jb2FsZXNjZV9jb25meworCisJdW5zaWduZWQgaW50IHJ4X3RpbWVvdXQ7CisJdW5zaWduZWQgaW50IHJ4X2V2ZW50X2NvdW50OworCXVuc2lnbmVkIGxvbmcgcnhfcGFja2V0czsKKwl1bnNpZ25lZCBsb25nIHJ4X3ByZXZfcGFja2V0czsKKwl1bnNpZ25lZCBsb25nIHJ4X2J5dGVzOworCXVuc2lnbmVkIGxvbmcgcnhfcHJldl9ieXRlczsKKwl1bnNpZ25lZCBpbnQgcnhfY29hbF90eXBlOworCQorCXVuc2lnbmVkIGludCB0eF90aW1lb3V0OworCXVuc2lnbmVkIGludCB0eF9ldmVudF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHR4X3BhY2tldHM7CisJdW5zaWduZWQgbG9uZyB0eF9wcmV2X3BhY2tldHM7CisJdW5zaWduZWQgbG9uZyB0eF9ieXRlczsKKwl1bnNpZ25lZCBsb25nIHR4X3ByZXZfYnl0ZXM7CisJdW5zaWduZWQgaW50IHR4X2NvYWxfdHlwZTsKKworfTsKK3N0cnVjdCBpcGdfaW5mb3sKKwkKKwl1bnNpZ25lZCBpbnQgaXBnX3N0YXRlOworCXVuc2lnbmVkIGludCBpcGc7CisJdW5zaWduZWQgaW50IGN1cnJlbnRfaXBnOworCXVuc2lnbmVkIGludCBjb2xfY250OworCXVuc2lnbmVkIGludCBkaWZmX2NvbF9jbnQ7CisJdW5zaWduZWQgaW50IHRpbWVyX3RpY2s7CisJdW5zaWduZWQgaW50IHByZXZfaXBnOworCXN0cnVjdCB0aW1lcl9saXN0IGlwZ190aW1lcjsKK307CisKK3N0cnVjdCBhbWQ4MTExZV9wcml2eworCQorCXN0cnVjdCBhbWQ4MTExZV90eF9kciogIHR4X3Jpbmc7CisJc3RydWN0IGFtZDgxMTFlX3J4X2RyKiByeF9yaW5nOworCWRtYV9hZGRyX3QgdHhfcmluZ19kbWFfYWRkcjsJLyogdHggZGVzY3JpcHRvciByaW5nIGJhc2UgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWFfYWRkcjsJLyogcnggZGVzY3JpcHRvciByaW5nIGJhc2UgYWRkcmVzcyAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CS8qIFB0ciB0byB0aGUgYXNzb2NpYXRlZCBwY2lfZGV2ICovCisJc3RydWN0IG5ldF9kZXZpY2UqIGFtZDgxMTFlX25ldF9kZXY7IAkvKiBwdHIgdG8gYXNzb2NpYXRlZCBuZXRfZGV2aWNlICovCisJLyogVHJhbnNtaXQgYW5kIHJlY2l2ZSBza2JzICovCisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnVmZltOVU1fVFhfQlVGRkVSU107CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYnVmZltOVU1fUlhfQlVGRkVSU107CisJLyogVHJhbnNtaXQgYW5kIHJlY2VpdmUgZG1hIG1hcHBlZCBhZGRyICovCisJZG1hX2FkZHJfdCB0eF9kbWFfYWRkcltOVU1fVFhfQlVGRkVSU107CisJZG1hX2FkZHJfdCByeF9kbWFfYWRkcltOVU1fUlhfQlVGRkVSU107CisJLyogUmVnIG1lbW9yeSBtYXBwZWQgYWRkcmVzcyAqLworCXZvaWQgX19pb21lbSAqbW1pbzsKKwkKKwlzcGlubG9ja190IGxvY2s7CS8qIEd1YXJkIGxvY2sgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2lkeCwgdHhfaWR4OwkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2NvbXBsZXRlX2lkeDsKKwl1bnNpZ25lZCBsb25nIHR4X3JpbmdfY29tcGxldGVfaWR4OworCXVuc2lnbmVkIGxvbmcgdHhfcmluZ19pZHg7CisJdW5zaWduZWQgaW50IHJ4X2J1ZmZfbGVuOwkvKiBCdWZmZXIgbGVuZ3RoIG9mIHJ4IGJ1ZmZlcnMgKi8KKwlpbnQgb3B0aW9uczsJCS8qIE9wdGlvbnMgZW5hYmxlZC9kaXNhYmxlZCBmb3IgdGhlIGRldmljZSAqLworCisJdW5zaWduZWQgbG9uZyBleHRfcGh5X29wdGlvbjsKKwlpbnQgZXh0X3BoeV9hZGRyOworCXUzMiBleHRfcGh5X2lkOworCQorCXN0cnVjdCBhbWQ4MTExZV9saW5rX2NvbmZpZyBsaW5rX2NvbmZpZzsKKwlpbnQgcG1fY2FwOworCisJc3RydWN0IG5ldF9kZXZpY2UgKm5leHQ7CisJaW50IG1paTsKKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpX2lmOworI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQKKwlzdHJ1Y3Qgdmxhbl9ncm91cAkJKnZsZ3JwOworI2VuZGlmCQorCWNoYXIgb3BlbmVkOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXVuc2lnbmVkIGludCBkcnZfcnhfZXJyb3JzOworCXN0cnVjdCBkZXZfbWNfbGlzdCogbWNfbGlzdDsKKwlzdHJ1Y3QgYW1kODExMWVfY29hbGVzY2VfY29uZiBjb2FsX2NvbmY7CisKKwlzdHJ1Y3QgaXBnX2luZm8gIGlwZ19kYXRhOwkKKwkKK307CisKKy8qIGtlcm5lbCBwcm92aWRlZCB3cml0ZXEgZG9lcyBub3Qgd3JpdGUgNjQgYml0cyBpbnRvIHRoZSBhbWQ4MTExZSBkZXZpY2UgcmVnaXN0ZXIgaW5zdGVhZCB3cml0ZXMgb25seSBoaWdoZXIgMzJiaXRzIGRhdGEgaW50byBsb3dlciAzMmJpdHMgb2YgdGhlIHJlZ2lzdGVyLgorQlVHPyAqLworI2RlZmluZSAgYW1kODExMWVfd3JpdGVxKF9VbERhdGEsX21lbU1hcCkgICBcCisJCXdyaXRlbCgqKHUzMiopKCZfVWxEYXRhKSwgX21lbU1hcCk7CVwKKwkJd3JpdGVsKCoodTMyKikoKHU4KikoJl9VbERhdGEpKzQpLCBfbWVtTWFwKzQpCQorCisvKiBtYXBzIHRoZSBleHRlcm5hbCBzcGVlZCBvcHRpb25zIHRvIGludGVybmFsIHZhbHVlICovCit0eXBlZGVmIGVudW0geworCVNQRUVEX0FVVE9ORUcsCisJU1BFRUQxMF9IQUxGLAorCVNQRUVEMTBfRlVMTCwKKwlTUEVFRDEwMF9IQUxGLAorCVNQRUVEMTAwX0ZVTEwsCit9RVhUX1BIWV9PUFRJT047CisKK3N0YXRpYyBpbnQgY2FyZF9pZHg7CitzdGF0aWMgaW50IHNwZWVkX2R1cGxleFtNQVhfVU5JVFNdID0geyAwLCB9Oworc3RhdGljIGludCBjb2FsZXNjZVtNQVhfVU5JVFNdID0gezEsMSwxLDEsMSwxLDEsMX07CitzdGF0aWMgaW50IGR5bmFtaWNfaXBnW01BWF9VTklUU10gPSB7MCwwLDAsMCwwLDAsMCwwfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2hpcF92ZXJzaW9uOworCisjZW5kaWYgLyogX0FNRDgxMTFFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBuZS5jIGIvZHJpdmVycy9uZXQvYXBuZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NDIxNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcG5lLmMKQEAgLTAsMCArMSw2MzcgQEAKKy8qCisgKiBBbWlnYSBMaW51eC82OGsgODM5MCBiYXNlZCBQQ01DSUEgRXRoZXJuZXQgRHJpdmVyIGZvciB0aGUgQW1pZ2EgMTIwMAorICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5NyBBbGFpbiBNYWxlaworICogICAgICAgICAgICAgICAgICAgIChBbGFpbi5NYWxla0BjcnlvZ2VuLmNvbSkKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uCisgKgorICogbmUuYzogICAgICAgQSBnZW5lcmFsIG5vbi1zaGFyZWQtbWVtb3J5IE5TODM5MCBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4CisgKiAgICAgICAgICAgICBXcml0dGVuIDE5OTItOTQgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiA4MzkwLmM6ICAgICBBIGdlbmVyYWwgTlM4MzkwIGV0aGVybmV0IGRyaXZlciBjb3JlIGZvciBsaW51eC4KKyAqICAgICAgICAgICAgIFdyaXR0ZW4gMTk5Mi05NCBieSBEb25hbGQgQmVja2VyLgorICoKKyAqIGNuZXRkZXZpY2U6IEEgU2FuYS1JSSBldGhlcm5ldCBkcml2ZXIgZm9yIEFtaWdhT1MKKyAqICAgICAgICAgICAgIFdyaXR0ZW4gYnkgQnJ1Y2UgQWJib3R0IChiaGFiYm90dEBpbmhiLmNvLm56KQorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgKKyAqIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYXlsZS5oPgorI2luY2x1ZGUgPGFzbS9hbWlwY21jaWEuaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworLyogLS0tLSBObyB1c2VyLXNlcnZpY2VhYmxlIHBhcnRzIGJlbG93IC0tLS0gKi8KKworI2RlZmluZSBEUlZfTkFNRSAiYXBuZSIKKworI2RlZmluZSBORV9CQVNFCSAoZGV2LT5iYXNlX2FkZHIpCisjZGVmaW5lIE5FX0NNRAkgCQkweDAwCisjZGVmaW5lIE5FX0RBVEFQT1JUCQkweDEwICAgICAgICAgICAgLyogTmF0U2VtaS1kZWZpbmVkIHBvcnQgd2luZG93IG9mZnNldC4gKi8KKyNkZWZpbmUgTkVfUkVTRVQJCTB4MWYgICAgICAgICAgICAvKiBJc3N1ZSBhIHJlYWQgdG8gcmVzZXQsIGEgd3JpdGUgdG8gY2xlYXIuICovCisjZGVmaW5lIE5FX0lPX0VYVEVOVAkgICAgICAgIDB4MjAKKworI2RlZmluZSBORV9FTjBfSVNSCQkweDA3CisjZGVmaW5lIE5FX0VOMF9EQ0ZHCQkweDBlCisKKyNkZWZpbmUgTkVfRU4wX1JTQVJMTwkgICAgICAgIDB4MDgKKyNkZWZpbmUgTkVfRU4wX1JTQVJISQkgICAgICAgIDB4MDkKKyNkZWZpbmUgTkVfRU4wX1JDTlRMTwkgICAgICAgIDB4MGEKKyNkZWZpbmUgTkVfRU4wX1JYQ1IJCTB4MGMKKyNkZWZpbmUgTkVfRU4wX1RYQ1IJCTB4MGQKKyNkZWZpbmUgTkVfRU4wX1JDTlRISQkgICAgICAgIDB4MGIKKyNkZWZpbmUgTkVfRU4wX0lNUgkJMHgwZgorCisjZGVmaW5lIE5FMVNNX1NUQVJUX1BHCTB4MjAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgTkUxU01fU1RPUF9QRyAJMHg0MAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworI2RlZmluZSBORVNNX1NUQVJUX1BHCTB4NDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgTkVTTV9TVE9QX1BHCTB4ODAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKworCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBhcG5lX3Byb2JlKGludCB1bml0KTsKK3N0YXRpYyBpbnQgYXBuZV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcik7CisKK3N0YXRpYyBpbnQgYXBuZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhcG5lX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBhcG5lX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhcG5lX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJICBpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIGFwbmVfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgYXBuZV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgaW50IGNvdW50LAorCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpOworc3RhdGljIGlycXJldHVybl90IGFwbmVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgaW50IGluaXRfcGNtY2lhKHZvaWQpOworCisvKiBJTyBiYXNlIGFkZHJlc3MgdXNlZCBmb3IgbmljICovCisKKyNkZWZpbmUgSU9CQVNFIDB4MzAwCisKKy8qCisgICB1c2UgTUFOVUFMX0NPTkZJRyBhbmQgTUFOVUFMX09GRlNFVCBmb3IgZW5hYmxpbmcgSU8gYnkgaGFuZAorICAgeW91IGNhbiBmaW5kIHRoZSB2YWx1ZXMgdG8gdXNlIGJ5IGxvb2tpbmcgYXQgdGhlIGNuZXQuZGV2aWNlCisgICBjb25maWcgZmlsZSBleGFtcGxlICh0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIGZvciB0aGUgQ05FVDQwQkMgY2FyZCkKKyovCisKKy8qCisjZGVmaW5lIE1BTlVBTF9DT05GSUcgMHgyMAorI2RlZmluZSBNQU5VQUxfT0ZGU0VUIDB4M2Y4CisKKyNkZWZpbmUgTUFOVUFMX0hXQUREUjAgMHgwMAorI2RlZmluZSBNQU5VQUxfSFdBRERSMSAweDEyCisjZGVmaW5lIE1BTlVBTF9IV0FERFIyIDB4MzQKKyNkZWZpbmUgTUFOVUFMX0hXQUREUjMgMHg1NgorI2RlZmluZSBNQU5VQUxfSFdBRERSNCAweDc4CisjZGVmaW5lIE1BTlVBTF9IV0FERFI1IDB4OWEKKyovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisgICAgImFwbmUuYzp2MS4xIDcvMTAvOTggQWxhaW4gTWFsZWsgKEFsYWluLk1hbGVrQGNyeW9nZW4uY2gpXG4iOworCitzdGF0aWMgaW50IGFwbmVfb3duZWQ7CS8qIHNpZ25hbCBpZiBjYXJkIGFscmVhZHkgb3duZWQgKi8KKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgYXBuZV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworI2lmbmRlZiBNQU5VQUxfQ09ORklHCisJY2hhciB0dXBsZVs4XTsKKyNlbmRpZgorCWludCBlcnI7CisKKwlpZiAoYXBuZV9vd25lZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlpZiAoICEoQU1JR0FIV19QUkVTRU5UKFBDTUNJQSkpICkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXByaW50aygiTG9va2luZyBmb3IgUENNQ0lBIGV0aGVybmV0IGNhcmQgOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkvKiBjaGVjayBpZiBhIGNhcmQgaXMgaW5zZXJ0ZWQgKi8KKwlpZiAoIShQQ01DSUFfSU5TRVJURUQpKSB7CisJCXByaW50aygiTk8gUENNQ0lBIGNhcmQgaW5zZXJ0ZWRcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwl9CisKKwlkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIGRpc2FibGUgcGNtY2lhIGlycSBmb3IgcmVhZHR1cGxlICovCisJcGNtY2lhX2Rpc2FibGVfaXJxKCk7CisKKyNpZm5kZWYgTUFOVUFMX0NPTkZJRworCWlmICgocGNtY2lhX2NvcHlfdHVwbGUoQ0lTVFBMX0ZVTkNJRCwgdHVwbGUsIDgpIDwgMykgfHwKKwkJKHR1cGxlWzJdICE9IENJU1RQTF9GVU5DSURfTkVUV09SSykpIHsKKwkJcHJpbnRrKCJub3QgYW4gZXRoZXJuZXQgY2FyZFxuIik7CisJCS8qIFhYWDogc2hvdWxkbid0IHdlIHJlLWVuYWJsZSBpcnEgaGVyZT8gKi8KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisJfQorI2VuZGlmCisKKwlwcmludGsoImV0aGVybmV0IFBDTUNJQSBjYXJkIGluc2VydGVkXG4iKTsKKworCWlmICghaW5pdF9wY21jaWEoKSkgeworCQkvKiBYWFg6IHNob3VsZG4ndCB3ZSByZS1lbmFibGUgaXJxIGhlcmU/ICovCisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oSU9CQVNFLCAweDIwLCBEUlZfTkFNRSkpIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKKwl9CisKKwllcnIgPSBhcG5lX3Byb2JlMShkZXYsIElPQkFTRSk7CisJaWYgKGVycikgeworCQlyZWxlYXNlX3JlZ2lvbihJT0JBU0UsIDB4MjApOworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoIWVycikKKwkJcmV0dXJuIGRldjsKKworCXBjbWNpYV9kaXNhYmxlX2lycSgpOworCWZyZWVfaXJxKElSUV9BTUlHQV9QT1JUUywgZGV2KTsKKwlwY21jaWFfcmVzZXQoKTsKKwlyZWxlYXNlX3JlZ2lvbihJT0JBU0UsIDB4MjApOworCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIGludCBfX2luaXQgYXBuZV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBjaGFyIFNBX3Byb21bMzJdOworICAgIGludCB3b3JkbGVuZ3RoID0gMjsKKyAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKyAgICBpbnQgc3RhcnRfcGFnZSwgc3RvcF9wYWdlOworI2lmbmRlZiBNQU5VQUxfSFdBRERSMAorICAgIGludCBuZVgwMDAsIGN0cm9uOworI2VuZGlmCisgICAgc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKyAKKyAgICBpZiAoZWlfZGVidWcgICYmICB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCXByaW50ayh2ZXJzaW9uKTsKKworICAgIHByaW50aygiUENNQ0lBIE5FKjAwMCBldGhlcmNhcmQgcHJvYmUiKTsKKworICAgIC8qIFJlc2V0IGNhcmQuIFdobyBrbm93cyB3aGF0IGRhaW4tYnJhbWFnZWQgc3RhdGUgaXQgd2FzIGxlZnQgaW4uICovCisgICAgewl1bnNpZ25lZCBsb25nIHJlc2V0X3N0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJb3V0YihpbmIoaW9hZGRyICsgTkVfUkVTRVQpLCBpb2FkZHIgKyBORV9SRVNFVCk7CisKKwl3aGlsZSAoKGluYihpb2FkZHIgKyBORV9FTjBfSVNSKSAmIEVOSVNSX1JFU0VUKSA9PSAwKQorCQlpZiAoamlmZmllcyAtIHJlc2V0X3N0YXJ0X3RpbWUgPiAyKkhaLzEwMCkgeworCQkJcHJpbnRrKCIgbm90IGZvdW5kIChubyByZXNldCBhY2spLlxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJb3V0YigweGZmLCBpb2FkZHIgKyBORV9FTjBfSVNSKTsJCS8qIEFjayBhbGwgaW50ci4gKi8KKyAgICB9CisKKyNpZm5kZWYgTUFOVUFMX0hXQUREUjAKKworICAgIC8qIFJlYWQgdGhlIDE2IGJ5dGVzIG9mIHN0YXRpb24gYWRkcmVzcyBQUk9NLgorICAgICAgIFdlIG11c3QgZmlyc3QgaW5pdGlhbGl6ZSByZWdpc3RlcnMsIHNpbWlsYXIgdG8gTlM4MzkwX2luaXQoZWlmZGV2LCAwKS4KKyAgICAgICBXZSBjYW4ndCByZWxpYWJseSByZWFkIHRoZSBTQVBST00gYWRkcmVzcyB3aXRob3V0IHRoaXMuCisgICAgICAgKEkgbGVhcm5lZCB0aGUgaGFyZCB3YXkhKS4gKi8KKyAgICB7CisJc3RydWN0IHt1bnNpZ25lZCBsb25nIHZhbHVlLCBvZmZzZXQ7IH0gcHJvZ3JhbV9zZXFbXSA9IHsKKwkgICAge0U4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIE5FX0NNRH0sIC8qIFNlbGVjdCBwYWdlIDAqLworCSAgICB7MHg0OCwJTkVfRU4wX0RDRkd9LAkvKiBTZXQgYnl0ZS13aWRlICgweDQ4KSBhY2Nlc3MuICovCisJICAgIHsweDAwLAlORV9FTjBfUkNOVExPfSwJLyogQ2xlYXIgdGhlIGNvdW50IHJlZ3MuICovCisJICAgIHsweDAwLAlORV9FTjBfUkNOVEhJfSwKKwkgICAgezB4MDAsCU5FX0VOMF9JTVJ9LAkvKiBNYXNrIGNvbXBsZXRpb24gaXJxLiAqLworCSAgICB7MHhGRiwJTkVfRU4wX0lTUn0sCisJICAgIHtFODM5MF9SWE9GRiwgTkVfRU4wX1JYQ1J9LAkvKiAweDIwICBTZXQgdG8gbW9uaXRvciAqLworCSAgICB7RTgzOTBfVFhPRkYsIE5FX0VOMF9UWENSfSwJLyogMHgwMiAgYW5kIGxvb3BiYWNrIG1vZGUuICovCisJICAgIHszMiwJTkVfRU4wX1JDTlRMT30sCisJICAgIHsweDAwLAlORV9FTjBfUkNOVEhJfSwKKwkgICAgezB4MDAsCU5FX0VOMF9SU0FSTE99LAkvKiBETUEgc3RhcnRpbmcgYXQgMHgwMDAwLiAqLworCSAgICB7MHgwMCwJTkVfRU4wX1JTQVJISX0sCisJICAgIHtFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgTkVfQ01EfSwKKwl9OworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHJvZ3JhbV9zZXEpL3NpemVvZihwcm9ncmFtX3NlcVswXSk7IGkrKykgeworCSAgICBvdXRiKHByb2dyYW1fc2VxW2ldLnZhbHVlLCBpb2FkZHIgKyBwcm9ncmFtX3NlcVtpXS5vZmZzZXQpOworCX0KKworICAgIH0KKyAgICBmb3IoaSA9IDA7IGkgPCAzMiAvKnNpemVvZihTQV9wcm9tKSovOyBpKz0yKSB7CisJU0FfcHJvbVtpXSA9IGluYihpb2FkZHIgKyBORV9EQVRBUE9SVCk7CisJU0FfcHJvbVtpKzFdID0gaW5iKGlvYWRkciArIE5FX0RBVEFQT1JUKTsKKwlpZiAoU0FfcHJvbVtpXSAhPSBTQV9wcm9tW2krMV0pCisJICAgIHdvcmRsZW5ndGggPSAxOworICAgIH0KKworICAgIC8qCUF0IHRoaXMgcG9pbnQsIHdvcmRsZW5ndGggKm9ubHkqIHRlbGxzIHVzIGlmIHRoZSBTQV9wcm9tIGlzIGRvdWJsZWQKKwl1cCBvciBub3QgYmVjYXVzZSBzb21lIGJyb2tlbiBQQ0kgY2FyZHMgZG9uJ3QgcmVzcGVjdCB0aGUgYnl0ZS13aWRlCisJcmVxdWVzdCBpbiBwcm9ncmFtX3NlcSBhYm92ZSwgYW5kIGhlbmNlIGRvbid0IGhhdmUgZG91YmxlZCB1cCB2YWx1ZXMuIAorCVRoZXNlIGJyb2tlbiBjYXJkcyB3b3VsZCBvdGhlcndpc2UgYmUgZGV0ZWN0ZWQgYXMgYW4gbmUxMDAwLiAgKi8KKworICAgIGlmICh3b3JkbGVuZ3RoID09IDIpCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCVNBX3Byb21baV0gPSBTQV9wcm9tW2kraV07CisgICAgCisgICAgaWYgKHdvcmRsZW5ndGggPT0gMikgeworCS8qIFdlIG11c3Qgc2V0IHRoZSA4MzkwIGZvciB3b3JkIG1vZGUuICovCisJb3V0YigweDQ5LCBpb2FkZHIgKyBORV9FTjBfRENGRyk7CisJc3RhcnRfcGFnZSA9IE5FU01fU1RBUlRfUEc7CisJc3RvcF9wYWdlID0gTkVTTV9TVE9QX1BHOworICAgIH0gZWxzZSB7CisJc3RhcnRfcGFnZSA9IE5FMVNNX1NUQVJUX1BHOworCXN0b3BfcGFnZSA9IE5FMVNNX1NUT1BfUEc7CisgICAgfQorCisgICAgbmVYMDAwID0gKFNBX3Byb21bMTRdID09IDB4NTcgICYmICBTQV9wcm9tWzE1XSA9PSAweDU3KTsKKyAgICBjdHJvbiA9ICAoU0FfcHJvbVswXSA9PSAweDAwICYmIFNBX3Byb21bMV0gPT0gMHgwMCAmJiBTQV9wcm9tWzJdID09IDB4MWQpOworCisgICAgLyogU2V0IHVwIHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzLiAqLworICAgIGlmIChuZVgwMDApIHsKKwluYW1lID0gKHdvcmRsZW5ndGggPT0gMikgPyAiTkUyMDAwIiA6ICJORTEwMDAiOworICAgIH0gZWxzZSBpZiAoY3Ryb24pIHsKKwluYW1lID0gKHdvcmRsZW5ndGggPT0gMikgPyAiQ3Ryb24tOCIgOiAiQ3Ryb24tMTYiOworCXN0YXJ0X3BhZ2UgPSAweDAxOworCXN0b3BfcGFnZSA9ICh3b3JkbGVuZ3RoID09IDIpID8gMHg0MCA6IDB4MjA7CisgICAgfSBlbHNlIHsKKwlwcmludGsoIiBub3QgZm91bmQuXG4iKTsKKwlyZXR1cm4gLUVOWElPOworCisgICAgfQorCisjZWxzZQorICAgIHdvcmRsZW5ndGggPSAyOworICAgIC8qIFdlIG11c3Qgc2V0IHRoZSA4MzkwIGZvciB3b3JkIG1vZGUuICovCisgICAgb3V0YigweDQ5LCBpb2FkZHIgKyBORV9FTjBfRENGRyk7CisgICAgc3RhcnRfcGFnZSA9IE5FU01fU1RBUlRfUEc7CisgICAgc3RvcF9wYWdlID0gTkVTTV9TVE9QX1BHOworCisgICAgU0FfcHJvbVswXSA9IE1BTlVBTF9IV0FERFIwOworICAgIFNBX3Byb21bMV0gPSBNQU5VQUxfSFdBRERSMTsKKyAgICBTQV9wcm9tWzJdID0gTUFOVUFMX0hXQUREUjI7CisgICAgU0FfcHJvbVszXSA9IE1BTlVBTF9IV0FERFIzOworICAgIFNBX3Byb21bNF0gPSBNQU5VQUxfSFdBRERSNDsKKyAgICBTQV9wcm9tWzVdID0gTUFOVUFMX0hXQUREUjU7CisgICAgbmFtZSA9ICJORTIwMDAiOworI2VuZGlmCisKKyAgICBkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworICAgIC8qIEluc3RhbGwgdGhlIEludGVycnVwdCBoYW5kbGVyICovCisgICAgaSA9IHJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgYXBuZV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBEUlZfTkFNRSwgZGV2KTsKKyAgICBpZiAoaSkgcmV0dXJuIGk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKSB7CisJcHJpbnRrKCIgJTIuMngiLCBTQV9wcm9tW2ldKTsKKwlkZXYtPmRldl9hZGRyW2ldID0gU0FfcHJvbVtpXTsKKyAgICB9CisKKyAgICBwcmludGsoIlxuJXM6ICVzIGZvdW5kLlxuIiwgZGV2LT5uYW1lLCBuYW1lKTsKKworICAgIGVpX3N0YXR1cy5uYW1lID0gbmFtZTsKKyAgICBlaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA9IHN0YXJ0X3BhZ2U7CisgICAgZWlfc3RhdHVzLnN0b3BfcGFnZSA9IHN0b3BfcGFnZTsKKyAgICBlaV9zdGF0dXMud29yZDE2ID0gKHdvcmRsZW5ndGggPT0gMik7CisKKyAgICBlaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IHN0YXJ0X3BhZ2UgKyBUWF9QQUdFUzsKKworICAgIGVpX3N0YXR1cy5yZXNldF84MzkwID0gJmFwbmVfcmVzZXRfODM5MDsKKyAgICBlaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmYXBuZV9ibG9ja19pbnB1dDsKKyAgICBlaV9zdGF0dXMuYmxvY2tfb3V0cHV0ID0gJmFwbmVfYmxvY2tfb3V0cHV0OworICAgIGVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmYXBuZV9nZXRfODM5MF9oZHI7CisgICAgZGV2LT5vcGVuID0gJmFwbmVfb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmYXBuZV9jbG9zZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorICAgIGRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorICAgIE5TODM5MF9pbml0KGRldiwgMCk7CisKKyAgICBwY21jaWFfYWNrX2ludChwY21jaWFfZ2V0X2ludHJlcSgpKTsJCS8qIGFjayBQQ01DSUEgaW50IHJlcSAqLworICAgIHBjbWNpYV9lbmFibGVfaXJxKCk7CisKKyAgICBhcG5lX293bmVkID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CithcG5lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBlaV9vcGVuKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FwbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpZiAoZWlfZGVidWcgPiAxKQorCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKyAgICBlaV9jbG9zZShkZXYpOworICAgIHJldHVybiAwOworfQorCisvKiBIYXJkIHJlc2V0IHRoZSBjYXJkLiAgVGhpcyB1c2VkIHRvIHBhdXNlIGZvciB0aGUgc2FtZSBwZXJpb2QgdGhhdCBhCisgICA4MzkwIHJlc2V0IGNvbW1hbmQgcmVxdWlyZWQsIGJ1dCB0aGF0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuICovCitzdGF0aWMgdm9pZAorYXBuZV9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgdW5zaWduZWQgbG9uZyByZXNldF9zdGFydF90aW1lID0gamlmZmllczsKKworICAgIGluaXRfcGNtY2lhKCk7CisKKyAgICBpZiAoZWlfZGVidWcgPiAxKSBwcmludGsoInJlc2V0dGluZyB0aGUgODM5MCB0PSVsZC4uLiIsIGppZmZpZXMpOworCisgICAgb3V0YihpbmIoTkVfQkFTRSArIE5FX1JFU0VUKSwgTkVfQkFTRSArIE5FX1JFU0VUKTsKKworICAgIGVpX3N0YXR1cy50eGluZyA9IDA7CisgICAgZWlfc3RhdHVzLmRtYWluZyA9IDA7CisKKyAgICAvKiBUaGlzIGNoZWNrIF9zaG91bGRfbm90XyBiZSBuZWNlc3NhcnksIG9taXQgZXZlbnR1YWxseS4gKi8KKyAgICB3aGlsZSAoKGluYihORV9CQVNFK05FX0VOMF9JU1IpICYgRU5JU1JfUkVTRVQpID09IDApCisJaWYgKGppZmZpZXMgLSByZXNldF9zdGFydF90aW1lID4gMipIWi8xMDApIHsKKwkgICAgcHJpbnRrKCIlczogbmVfcmVzZXRfODM5MCgpIGRpZCBub3QgY29tcGxldGUuXG4iLCBkZXYtPm5hbWUpOworCSAgICBicmVhazsKKwl9CisgICAgb3V0YihFTklTUl9SRVNFVCwgTkVfQkFTRSArIE5FX0VOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KK30KKworLyogR3JhYiB0aGUgODM5MCBzcGVjaWZpYyBoZWFkZXIuIFNpbWlsYXIgdG8gdGhlIGJsb2NrX2lucHV0IHJvdXRpbmUsIGJ1dAorICAgd2UgZG9uJ3QgbmVlZCB0byBiZSBjb25jZXJuZWQgd2l0aCByaW5nIHdyYXAgYXMgdGhlIGhlYWRlciB3aWxsIGJlIGF0CisgICB0aGUgc3RhcnQgb2YgYSBwYWdlLCBzbyB3ZSBvcHRpbWl6ZSBhY2NvcmRpbmdseS4gKi8KKworc3RhdGljIHZvaWQKK2FwbmVfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpCit7CisKKyAgICBpbnQgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgY250OworICAgIGNoYXIgKnB0cmM7CisgICAgc2hvcnQgKnB0cnM7CisKKyAgICAvKiBUaGlzICpzaG91bGRuJ3QqIGhhcHBlbi4gSWYgaXQgZG9lcywgaXQncyB0aGUgbGFzdCB0aGluZyB5b3UnbGwgc2VlICovCisgICAgaWYgKGVpX3N0YXR1cy5kbWFpbmcpIHsKKwlwcmludGsoIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gbmVfZ2V0XzgzOTBfaGRyICIKKwkgICAiW0RNQXN0YXQ6JWRdW2lycWxvY2s6JWRdW2ludHI6JWRdLlxuIiwKKwkgICBkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrLCBkZXYtPmlycSk7CisJcmV0dXJuOworICAgIH0KKworICAgIGVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKyAgICBvdXRiKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBuaWNfYmFzZSsgTkVfQ01EKTsKKyAgICBvdXRiKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsKKyAgICBvdXRiKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkciksIG5pY19iYXNlICsgTkVfRU4wX1JDTlRMTyk7CisgICAgb3V0YigwLCBuaWNfYmFzZSArIE5FX0VOMF9SQ05USEkpOworICAgIG91dGIoMCwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkxPKTsJCS8qIE9uIHBhZ2UgYm91bmRhcnkgKi8KKyAgICBvdXRiKHJpbmdfcGFnZSwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkhJKTsKKyAgICBvdXRiKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisKKyAgICBpZiAoZWlfc3RhdHVzLndvcmQxNikgeworICAgICAgICBwdHJzID0gKHNob3J0KiloZHI7CisgICAgICAgIGZvcihjbnQgPSAwOyBjbnQgPCAoc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKT4+MSk7IGNudCsrKQorICAgICAgICAgICAgKnB0cnMrKyA9IGludyhORV9CQVNFICsgTkVfREFUQVBPUlQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0cmMgPSAoY2hhciopaGRyOworICAgICAgICBmb3IoY250ID0gMDsgY250IDwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKTsgY250KyspCisgICAgICAgICAgICAqcHRyYysrID0gaW5iKE5FX0JBU0UgKyBORV9EQVRBUE9SVCk7CisgICAgfQorCisgICAgb3V0YihFTklTUl9SREMsIG5pY19iYXNlICsgTkVfRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworICAgIGVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7CisKKyAgICBsZTE2X3RvX2NwdXMoJmhkci0+Y291bnQpOworfQorCisvKiBCbG9jayBpbnB1dCBhbmQgb3V0cHV0LCBzaW1pbGFyIHRvIHRoZSBDcnlud3IgcGFja2V0IGRyaXZlci4gIElmIHlvdQorICAgYXJlIHBvcnRpbmcgdG8gYSBuZXcgZXRoZXJjYXJkLCBsb29rIGF0IHRoZSBwYWNrZXQgZHJpdmVyIHNvdXJjZSBmb3IgaGludHMuCisgICBUaGUgTkV4MDAwIGRvZXNuJ3Qgc2hhcmUgdGhlIG9uLWJvYXJkIHBhY2tldCBtZW1vcnkgLS0geW91IGhhdmUgdG8gcHV0CisgICB0aGUgcGFja2V0IG91dCB0aHJvdWdoIHRoZSAicmVtb3RlIERNQSIgZGF0YXBvcnQgdXNpbmcgb3V0Yi4gKi8KKworc3RhdGljIHZvaWQKK2FwbmVfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisgICAgaW50IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgY2hhciAqYnVmID0gc2tiLT5kYXRhOworICAgIGNoYXIgKnB0cmM7CisgICAgc2hvcnQgKnB0cnM7CisgICAgaW50IGNudDsKKworICAgIC8qIFRoaXMgKnNob3VsZG4ndCogaGFwcGVuLiBJZiBpdCBkb2VzLCBpdCdzIHRoZSBsYXN0IHRoaW5nIHlvdSdsbCBzZWUgKi8KKyAgICBpZiAoZWlfc3RhdHVzLmRtYWluZykgeworCXByaW50aygiJXM6IERNQWluZyBjb25mbGljdCBpbiBuZV9ibG9ja19pbnB1dCAiCisJICAgIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXVtpbnRyOiVkXS5cbiIsCisJICAgZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jaywgZGV2LT5pcnEpOworCXJldHVybjsKKyAgICB9CisgICAgZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworICAgIG91dGIoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIG5pY19iYXNlKyBORV9DTUQpOworICAgIG91dGIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOworICAgIG91dGIoY291bnQgJiAweGZmLCBuaWNfYmFzZSArIE5FX0VOMF9SQ05UTE8pOworICAgIG91dGIoY291bnQgPj4gOCwgbmljX2Jhc2UgKyBORV9FTjBfUkNOVEhJKTsKKyAgICBvdXRiKHJpbmdfb2Zmc2V0ICYgMHhmZiwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkxPKTsKKyAgICBvdXRiKHJpbmdfb2Zmc2V0ID4+IDgsIG5pY19iYXNlICsgTkVfRU4wX1JTQVJISSk7CisgICAgb3V0YihFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworICAgIGlmIChlaV9zdGF0dXMud29yZDE2KSB7CisgICAgICBwdHJzID0gKHNob3J0KilidWY7CisgICAgICBmb3IgKGNudCA9IDA7IGNudCA8IChjb3VudD4+MSk7IGNudCsrKQorICAgICAgICAqcHRycysrID0gaW53KE5FX0JBU0UgKyBORV9EQVRBUE9SVCk7CisgICAgICBpZiAoY291bnQgJiAweDAxKSB7CisJYnVmW2NvdW50LTFdID0gaW5iKE5FX0JBU0UgKyBORV9EQVRBUE9SVCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHB0cmMgPSAoY2hhciopYnVmOworICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBjb3VudDsgY250KyspCisgICAgICAgICpwdHJjKysgPSBpbmIoTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKKyAgICB9CisKKyAgICBvdXRiKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsJLyogQWNrIGludHIuICovCisgICAgZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKK30KKworc3RhdGljIHZvaWQKK2FwbmVfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSkKK3sKKyAgICBpbnQgbmljX2Jhc2UgPSBORV9CQVNFOworICAgIHVuc2lnbmVkIGxvbmcgZG1hX3N0YXJ0OworICAgIGNoYXIgKnB0cmM7CisgICAgc2hvcnQgKnB0cnM7CisgICAgaW50IGNudDsKKworICAgIC8qIFJvdW5kIHRoZSBjb3VudCB1cCBmb3Igd29yZCB3cml0ZXMuICBEbyB3ZSBuZWVkIHRvIGRvIHRoaXM/CisgICAgICAgV2hhdCBlZmZlY3Qgd2lsbCBhbiBvZGQgYnl0ZSBjb3VudCBoYXZlIG9uIHRoZSA4MzkwPworICAgICAgIEkgc2hvdWxkIGNoZWNrIHNvbWVkYXkuICovCisgICAgaWYgKGVpX3N0YXR1cy53b3JkMTYgJiYgKGNvdW50ICYgMHgwMSkpCisgICAgICBjb3VudCsrOworCisgICAgLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworICAgIGlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJcHJpbnRrKCIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2Jsb2NrX291dHB1dC4iCisJICAgIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXVtpbnRyOiVkXVxuIiwKKwkgICBkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrLCBkZXYtPmlycSk7CisJcmV0dXJuOworICAgIH0KKyAgICBlaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7CisgICAgLyogV2Ugc2hvdWxkIGFscmVhZHkgYmUgaW4gcGFnZSAwLCBidXQgdG8gYmUgc2FmZS4uLiAqLworICAgIG91dGIoRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQrRTgzOTBfTk9ETUEsIG5pY19iYXNlICsgTkVfQ01EKTsKKworICAgIG91dGIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOworCisgICAvKiBOb3cgdGhlIG5vcm1hbCBvdXRwdXQuICovCisgICAgb3V0Yihjb3VudCAmIDB4ZmYsIG5pY19iYXNlICsgTkVfRU4wX1JDTlRMTyk7CisgICAgb3V0Yihjb3VudCA+PiA4LCAgIG5pY19iYXNlICsgTkVfRU4wX1JDTlRISSk7CisgICAgb3V0YigweDAwLCBuaWNfYmFzZSArIE5FX0VOMF9SU0FSTE8pOworICAgIG91dGIoc3RhcnRfcGFnZSwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkhJKTsKKworICAgIG91dGIoRTgzOTBfUldSSVRFK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisgICAgaWYgKGVpX3N0YXR1cy53b3JkMTYpIHsKKyAgICAgICAgcHRycyA9IChzaG9ydCopYnVmOworICAgICAgICBmb3IgKGNudCA9IDA7IGNudCA8IGNvdW50Pj4xOyBjbnQrKykKKyAgICAgICAgICAgIG91dHcoKnB0cnMrKywgTkVfQkFTRStORV9EQVRBUE9SVCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRyYyA9IChjaGFyKilidWY7CisgICAgICAgIGZvciAoY250ID0gMDsgY250IDwgY291bnQ7IGNudCsrKQorCSAgICBvdXRiKCpwdHJjKyssIE5FX0JBU0UgKyBORV9EQVRBUE9SVCk7CisgICAgfQorCisgICAgZG1hX3N0YXJ0ID0gamlmZmllczsKKworICAgIHdoaWxlICgoaW5iKE5FX0JBU0UgKyBORV9FTjBfSVNSKSAmIEVOSVNSX1JEQykgPT0gMCkKKwlpZiAoamlmZmllcyAtIGRtYV9zdGFydCA+IDIqSFovMTAwKSB7CQkvKiAyMG1zICovCisJCXByaW50aygiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgVHggUkRDLlxuIiwgZGV2LT5uYW1lKTsKKwkJYXBuZV9yZXNldF84MzkwKGRldik7CisJCU5TODM5MF9pbml0KGRldiwxKTsKKwkJYnJlYWs7CisJfQorCisgICAgb3V0YihFTklTUl9SREMsIG5pY19iYXNlICsgTkVfRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworICAgIGVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXBuZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHBjbWNpYV9pbnRyZXE7CisKKyAgICBpZiAoIShnYXlsZS5pbnRlbiAmIEdBWUxFX0lSUV9JUlEpKQorICAgICAgICByZXR1cm4gSVJRX05PTkU7CisKKyAgICBwY21jaWFfaW50cmVxID0gcGNtY2lhX2dldF9pbnRyZXEoKTsKKworICAgIGlmICghKHBjbWNpYV9pbnRyZXEgJiBHQVlMRV9JUlFfSVJRKSkgeworICAgICAgICBwY21jaWFfYWNrX2ludChwY21jaWFfaW50cmVxKTsKKyAgICAgICAgcmV0dXJuIElSUV9OT05FOworICAgIH0KKyAgICBpZiAoZWlfZGVidWcgPiAzKQorICAgICAgICBwcmludGsoInBjbWNpYSBpbnRyZXEgPSAleFxuIiwgcGNtY2lhX2ludHJlcSk7CisgICAgcGNtY2lhX2Rpc2FibGVfaXJxKCk7CQkJLyogdG8gZ2V0IHJpZCBvZiB0aGUgc3RpKCkgd2l0aGluIGVpX2ludGVycnVwdCAqLworICAgIGVpX2ludGVycnVwdChpcnEsIGRldl9pZCwgcmVncyk7CisgICAgcGNtY2lhX2Fja19pbnQocGNtY2lhX2dldF9pbnRyZXEoKSk7CisgICAgcGNtY2lhX2VuYWJsZV9pcnEoKTsKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYXBuZV9kZXY7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWFwbmVfZGV2ID0gYXBuZV9wcm9iZSgtMSk7CisJaWYgKElTX0VSUihhcG5lX2RldikpCisJCXJldHVybiBQVFJfRVJSKGFwbmVfZGV2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KGFwbmVfZGV2KTsKKworCXBjbWNpYV9kaXNhYmxlX2lycSgpOworCisJZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBhcG5lX2Rldik7CisKKwlwY21jaWFfcmVzZXQoKTsKKworCXJlbGVhc2VfcmVnaW9uKElPQkFTRSwgMHgyMCk7CisKKwlmcmVlX25ldGRldihhcG5lX2Rldik7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IGluaXRfcGNtY2lhKHZvaWQpCit7CisJdV9jaGFyIGNvbmZpZzsKKyNpZm5kZWYgTUFOVUFMX0NPTkZJRworCXVfY2hhciB0dXBsZVszMl07CisJaW50IG9mZnNldF9sZW47CisjZW5kaWYKKwl1X2xvbmcgb2Zmc2V0OworCisJcGNtY2lhX3Jlc2V0KCk7CisJcGNtY2lhX3Byb2dyYW1fdm9sdGFnZShQQ01DSUFfMFYpOworCXBjbWNpYV9hY2Nlc3Nfc3BlZWQoUENNQ0lBX1NQRUVEXzI1ME5TKTsKKwlwY21jaWFfd3JpdGVfZW5hYmxlKCk7CisKKyNpZmRlZiBNQU5VQUxfQ09ORklHCisJY29uZmlnID0gTUFOVUFMX0NPTkZJRzsKKyNlbHNlCisJLyogZ2V0IGFuZCB3cml0ZSBjb25maWcgYnl0ZSB0byBlbmFibGUgSU8gcG9ydCAqLworCisJaWYgKHBjbWNpYV9jb3B5X3R1cGxlKENJU1RQTF9DRlRBQkxFX0VOVFJZLCB0dXBsZSwgMzIpIDwgMykKKwkJcmV0dXJuIDA7CisKKwljb25maWcgPSB0dXBsZVsyXSAmIDB4M2Y7CisjZW5kaWYKKyNpZmRlZiBNQU5VQUxfT0ZGU0VUCisJb2Zmc2V0ID0gTUFOVUFMX09GRlNFVDsKKyNlbHNlCisJaWYgKHBjbWNpYV9jb3B5X3R1cGxlKENJU1RQTF9DT05GSUcsIHR1cGxlLCAzMikgPCA2KQorCQlyZXR1cm4gMDsKKworCW9mZnNldF9sZW4gPSAodHVwbGVbMl0gJiAweDMpICsgMTsKKwlvZmZzZXQgPSAwOworCXdoaWxlKG9mZnNldF9sZW4tLSkgeworCQlvZmZzZXQgPSAob2Zmc2V0IDw8IDgpIHwgdHVwbGVbNCtvZmZzZXRfbGVuXTsKKwl9CisjZW5kaWYKKworCW91dF84KEdBWUxFX0FUVFJJQlVURStvZmZzZXQsIGNvbmZpZyk7CisKKwlyZXR1cm4gMTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL0tjb25maWcgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGIxOTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL0tjb25maWcKQEAgLTAsMCArMSw5OCBAQAorIworIyBBcHBsZXRhbGsgZHJpdmVyIGNvbmZpZ3VyYXRpb24KKyMKK2NvbmZpZyBERVZfQVBQTEVUQUxLCisJYm9vbCAiQXBwbGV0YWxrIGludGVyZmFjZXMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFUQUxLCisJaGVscAorCSAgQXBwbGVUYWxrIGlzIHRoZSBwcm90b2NvbCB0aGF0IEFwcGxlIGNvbXB1dGVycyBjYW4gdXNlIHRvIGNvbW11bmljYXRlCisJICBvbiBhIG5ldHdvcmsuICBJZiB5b3VyIExpbnV4IGJveCBpcyBjb25uZWN0ZWQgdG8gc3VjaCBhIG5ldHdvcmssIGFuZCB3aXNoCisJICB0byBkbyBJUCBvdmVyIGl0LCBvciB5b3UgaGF2ZSBhIExvY2FsVGFsayBjYXJkIGFuZCB3aXNoIHRvIHVzZSBpdCB0bworCSAgY29ubmVjdCB0byB0aGUgQXBwbGVUYWxrIG5ldHdvcmssIHNheSBZLgorCSAgCisKK2NvbmZpZyBMVFBDCisJdHJpc3RhdGUgIkFwcGxlL0ZhcmFsbG9uIExvY2FsVGFsayBQQyBzdXBwb3J0IgorCWRlcGVuZHMgb24gREVWX0FQUExFVEFMSyAmJiAoSVNBIHx8IEVJU0EpCisJaGVscAorCSAgVGhpcyBhbGxvd3MgeW91IHRvIHVzZSB0aGUgQXBwbGVUYWxrIFBDIGNhcmQgdG8gY29ubmVjdCB0byBMb2NhbFRhbGsKKwkgIG5ldHdvcmtzLiBUaGUgY2FyZCBpcyBhbHNvIGtub3duIGFzIHRoZSBGYXJhbGxvbiBQaG9uZU5ldCBQQyBjYXJkLgorCSAgSWYgeW91IGFyZSBpbiBkb3VidCwgdGhpcyBjYXJkIGlzIHRoZSBvbmUgd2l0aCB0aGUgNjVDMDIgY2hpcCBvbiBpdC4KKwkgIFlvdSBhbHNvIG5lZWQgdmVyc2lvbiAxLjMuMyBvciBsYXRlciBvZiB0aGUgbmV0YXRhbGsgcGFja2FnZS4KKwkgIFRoaXMgZHJpdmVyIGlzIGV4cGVyaW1lbnRhbCwgd2hpY2ggbWVhbnMgdGhhdCBpdCBtYXkgbm90IHdvcmsuCisJICBTZWUgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2x0cGMudHh0Pi4KKworY29uZmlnIENPUFMKKwl0cmlzdGF0ZSAiQ09QUyBMb2NhbFRhbGsgUEMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERFVl9BUFBMRVRBTEsgJiYgKElTQSB8fCBFSVNBKQorCWhlbHAKKwkgIFRoaXMgYWxsb3dzIHlvdSB0byB1c2UgQ09QUyBBcHBsZVRhbGsgY2FyZHMgdG8gY29ubmVjdCB0byBMb2NhbFRhbGsKKwkgIG5ldHdvcmtzLiBZb3UgYWxzbyBuZWVkIHZlcnNpb24gMS4zLjMgb3IgbGF0ZXIgb2YgdGhlIG5ldGF0YWxrCisJICBwYWNrYWdlLiBUaGlzIGRyaXZlciBpcyBleHBlcmltZW50YWwsIHdoaWNoIG1lYW5zIHRoYXQgaXQgbWF5IG5vdAorCSAgd29yay4gVGhpcyBkcml2ZXIgd2lsbCBvbmx5IHdvcmsgaWYgeW91IGNob29zZSAiQXBwbGVUYWxrIEREUCIKKwkgIG5ldHdvcmtpbmcgc3VwcG9ydCwgYWJvdmUuCisJICBQbGVhc2UgcmVhZCB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY29wcy50eHQ+LgorCitjb25maWcgQ09QU19EQVlOQQorCWJvb2wgIkRheW5hIGZpcm13YXJlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBDT1BTCisJaGVscAorCSAgU3VwcG9ydCBDT1BTIGNvbXBhdGlibGUgY2FyZHMgd2l0aCBEYXluYSBzdHlsZSBmaXJtd2FyZSAoRGF5bmEKKwkgIERMMjAwMC8gRGF5bmF0YWxrL1BDIChoYWxmIGxlbmd0aCksIENPUFMgTFQtOTUsIEZhcmFsbG9uIFBob25lTkVUIFBDCisJICBJSUksIEZhcmFsbG9uIFBob25lTkVUIFBDIElJKS4KKworY29uZmlnIENPUFNfVEFOR0VOVAorCWJvb2wgIlRhbmdlbnQgZmlybXdhcmUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIENPUFMKKwloZWxwCisJICBTdXBwb3J0IENPUFMgY29tcGF0aWJsZSBjYXJkcyB3aXRoIFRhbmdlbnQgc3R5bGUgZmlybXdhcmUgKFRhbmdlbnQKKwkgIEFUQl9JSSwgTm92ZWxsIE5MLTEwMDAsIERheXN0YXIgRGlnaXRhbCBMVC0yMDAuCisKK2NvbmZpZyBJUEREUAorCXRyaXN0YXRlICJBcHBsZXRhbGstSVAgZHJpdmVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBERVZfQVBQTEVUQUxLICYmIEFUQUxLCisJLS0taGVscC0tLQorCSAgVGhpcyBhbGxvd3MgSVAgbmV0d29ya2luZyBmb3IgdXNlcnMgd2hvIG9ubHkgaGF2ZSBBcHBsZVRhbGsKKwkgIG5ldHdvcmtpbmcgYXZhaWxhYmxlLiBUaGlzIGZlYXR1cmUgaXMgZXhwZXJpbWVudGFsLiBXaXRoIHRoaXMKKwkgIGRyaXZlciwgeW91IGNhbiBlbmNhcHN1bGF0ZSBJUCBpbnNpZGUgQXBwbGVUYWxrIChlLmcuIGlmIHlvdXIgTGludXgKKwkgIGJveCBpcyBzdHVjayBvbiBhbiBBcHBsZVRhbGsgb25seSBuZXR3b3JrKSBvciBkZWNhcHN1bGF0ZSAoZS5nLiBpZgorCSAgeW91IHdhbnQgeW91ciBMaW51eCBib3ggdG8gYWN0IGFzIGFuIEludGVybmV0IGdhdGV3YXkgZm9yIGEgem9vIG9mCisJICBBcHBsZVRhbGsgY29ubmVjdGVkIE1hY3MpLiBQbGVhc2Ugc2VlIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXBkZHAudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBBcHBsZVRhbGstSVAgc3VwcG9ydCB3aWxsIGJlIGNvbXBpbGVkIGludG8KKwkgIHRoZSBrZXJuZWwuIEluIHRoaXMgY2FzZSwgeW91IGNhbiBlaXRoZXIgdXNlIGVuY2Fwc3VsYXRpb24gb3IKKwkgIGRlY2Fwc3VsYXRpb24sIGJ1dCBub3QgYm90aC4gV2l0aCB0aGUgZm9sbG93aW5nIHR3byBxdWVzdGlvbnMsIHlvdQorCSAgZGVjaWRlIHdoaWNoIG9uZSB5b3Ugd2FudC4KKworCSAgVG8gY29tcGlsZSB0aGUgQXBwbGVUYWxrLUlQIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlwZGRwLgorCSAgSW4gdGhpcyBjYXNlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSBib3RoIGVuY2Fwc3VsYXRpb24gYW5kCisJICBkZWNhcHN1bGF0aW9uIHNpbXVsdGFuZW91c2x5LCBieSBsb2FkaW5nIHR3byBjb3BpZXMgb2YgdGhlIG1vZHVsZQorCSAgYW5kIHNwZWNpZnlpbmcgZGlmZmVyZW50IHZhbHVlcyBmb3IgdGhlIG1vZHVsZSBvcHRpb24gaXBkZHBfbW9kZS4KKworY29uZmlnIElQRERQX0VOQ0FQCisJYm9vbCAiSVAgdG8gQXBwbGV0YWxrLUlQIEVuY2Fwc3VsYXRpb24gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQRERQCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBBcHBsZVRhbGstSVAgY29kZSB3aWxsIGJlIGFibGUgdG8gZW5jYXBzdWxhdGUKKwkgIElQIHBhY2tldHMgaW5zaWRlIEFwcGxlVGFsayBmcmFtZXM7IHRoaXMgaXMgdXNlZnVsIGlmIHlvdXIgTGludXggYm94CisJICBpcyBzdHVjayBvbiBhbiBBcHBsZVRhbGsgbmV0d29yayAod2hpY2ggaG9wZWZ1bGx5IGNvbnRhaW5zIGEKKwkgIGRlY2Fwc3VsYXRvciBzb21ld2hlcmUpLiBQbGVhc2Ugc2VlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXBkZHAudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gSWYKKwkgIHlvdSBzYWlkIFkgdG8gIkFwcGxlVGFsay1JUCBkcml2ZXIgc3VwcG9ydCIgYWJvdmUgYW5kIHlvdSBzYXkgWQorCSAgaGVyZSwgdGhlbiB5b3UgY2Fubm90IHNheSBZIHRvICJBcHBsZVRhbGstSVAgdG8gSVAgRGVjYXBzdWxhdGlvbgorCSAgc3VwcG9ydCIsIGJlbG93LgorCitjb25maWcgSVBERFBfREVDQVAKKwlib29sICJBcHBsZXRhbGstSVAgdG8gSVAgRGVjYXBzdWxhdGlvbiBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVBERFAKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIEFwcGxlVGFsay1JUCBjb2RlIHdpbGwgYmUgYWJsZSB0byBkZWNhcHN1bGF0ZQorCSAgQXBwbGVUYWxrLUlQIGZyYW1lcyB0byBJUCBwYWNrZXRzOyB0aGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB5b3VyCisJICBMaW51eCBib3ggdG8gYWN0IGFzIGFuIEludGVybmV0IGdhdGV3YXkgZm9yIGFuIEFwcGxlVGFsayBuZXR3b3JrLgorCSAgUGxlYXNlIHNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXBkZHAudHh0PiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24uICBJZiB5b3Ugc2FpZCBZIHRvICJBcHBsZVRhbGstSVAgZHJpdmVyIHN1cHBvcnQiIGFib3ZlCisJICBhbmQgeW91IHNheSBZIGhlcmUsIHRoZW4geW91IGNhbm5vdCBzYXkgWSB0byAiSVAgdG8gQXBwbGVUYWxrLUlQCisJICBFbmNhcHN1bGF0aW9uIHN1cHBvcnQiLCBhYm92ZS4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZmM3MDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciBkcml2ZXJzL25ldC9hcHBsZXRhbGsKKyMKKworb2JqLSQoQ09ORklHX0lQRERQKSArPSBpcGRkcC5vCitvYmotJChDT05GSUdfQ09QUykgKz0gY29wcy5vCitvYmotJChDT05GSUdfTFRQQykgKz0gbHRwYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvY29wcy5jIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTYxYzJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHMuYwpAQCAtMCwwICsxLDEwNTkgQEAKKy8qICAgICAgY29wcy5jOiBMb2NhbFRhbGsgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKglBdXRob3JzOgorICogICAgICAtIEpheSBTY2h1bGlzdCA8anNjaGxzdEBzYW1iYS5vcmc+CisgKgorICoJV2l0aCBtb3JlIHRoYW4gYSBsaXR0bGUgaGVscCBmcm9tOworICoJLSBBbGFuIENveCA8QWxhbi5Db3hAbGludXgub3JnPiAKKyAqCisgKiAgICAgIERlcml2ZWQgZnJvbToKKyAqICAgICAgLSBza2VsZXRvbi5jOiBBIG5ldHdvcmsgZHJpdmVyIG91dGxpbmUgZm9yIGxpbnV4LgorICogICAgICAgIFdyaXR0ZW4gMTk5My05NCBieSBEb25hbGQgQmVja2VyLgorICoJLSBsdHBjLmM6IEEgZHJpdmVyIGZvciB0aGUgTG9jYWxUYWxrIFBDIGNhcmQuCisgKgkgIFdyaXR0ZW4gYnkgQnJhZGZvcmQgVy4gSm9obnNvbi4KKyAqCisgKiAgICAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqICAgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKyAqCisgKiAgICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICAgICAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKglDaGFuZ2VzOgorICoJMTk5NzA2MDgJQWxhbiBDb3gJQWxsb3dlZCBkdWFsIGNhcmQgdHlwZSBzdXBwb3J0CisgKgkJCQkJQ2FuIHNldCBib2FyZCB0eXBlIGluIGluc21vZAorICoJCQkJCUhvb2tzIGZvciBjb3BzX3NldHVwIHJvdXRpbmUKKyAqCQkJCQkobm90IHlldCBpbXBsZW1lbnRlZCkuCisgKgkxOTk3MTEwMQlKYXkgU2NodWxpc3QJRml4ZXMgZm9yIG11bHRpcGxlIGx0KiBkZXZpY2VzLgorICoJMTk5ODA2MDcJU3RldmVuIEhpcnNjaAlGaXhlZCB0aGUgYmFkbHkgYnJva2VuIHN1cHBvcnQKKyAqCQkJCQlmb3IgVGFuZ2VudCB0eXBlIGNhcmRzLiBPbmx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkIG9uIERheXN0YXIgTFQyMDAuIFNvbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwIG9mIGZvcm1hdHRpbmcgYW5kIHByb2dyYW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpYy4gIEFkZGVkIGVtYWNzICdsb2NhbC12YXJzJworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwIGZvciBKYXkncyBicmFjZSBzdHlsZS4KKyAqCTIwMDAwMjExCUFsYW4gQ294CUNsZWFuZWQgdXAgZm9yIHNvZnRuZXQKKyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbiA9CisiY29wcy5jOnYwLjA0IDYvNy85OCBKYXkgU2NodWxpc3QgPGpzY2hsc3RAc2FtYmEub3JnPlxuIjsKKy8qCisgKiAgU291cmNlczoKKyAqICAgICAgQ09QUyBMb2NhbHRhbGsgU0RLLiBUaGlzIHByb3ZpZGVzIGFsbW9zdCBhbGwgb2YgdGhlIGluZm9ybWF0aW9uCisgKiAgICAgIG5lZWRlZC4KKyAqLworCisvKgorICogaW5zbW9kL21vZHByb2JlIGNvbmZpZ3VyYWJsZSBzdHVmZi4KKyAqCS0gSU8gUG9ydCwgY2hvb3NlIG9uZSB5b3VyIGNhcmQgc3VwcG9ydHMgb3IgMCBpZiB5b3UgZGFyZS4KKyAqCS0gSVJRLCBhbHNvIGNob29zZSBvbmUgeW91ciBjYXJkIHN1cHBvcnRzIG9yIG5vdGhpbmcgYW5kIGxldAorICoJICB0aGUgZHJpdmVyIGZpZ3VyZSBpdCBvdXQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2x0YWxrLmg+CS8qIEZvciBsdGFsa19zZXR1cCgpICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogRm9yIHVkZWxheSgpICovCisjaW5jbHVkZSA8bGludXgvYXRhbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgImNvcHMuaCIJCS8qIE91ciBTdHVmZiAqLworI2luY2x1ZGUgImNvcHNfbHRkcnYuaCIJCS8qIEZpcm13YXJlIGNvZGUgZm9yIFRhbmdlbnQgdHlwZSBjYXJkcy4gKi8KKyNpbmNsdWRlICJjb3BzX2ZmZHJ2LmgiCQkvKiBGaXJtd2FyZSBjb2RlIGZvciBEYXluYSB0eXBlIGNhcmRzLiAqLworCisvKgorICogICAgICBUaGUgbmFtZSBvZiB0aGUgY2FyZC4gSXMgdXNlZCBmb3IgbWVzc2FnZXMgYW5kIGluIHRoZSByZXF1ZXN0cyBmb3IKKyAqICAgICAgaW8gcmVnaW9ucywgaXJxcyBhbmQgZG1hIGNoYW5uZWxzCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmNhcmRuYW1lID0gImNvcHMiOworCisjaWZkZWYgQ09ORklHX0NPUFNfREFZTkEKK3N0YXRpYyBpbnQgYm9hcmRfdHlwZSA9IERBWU5BOwkvKiBNb2R1bGUgZXhwb3J0ZWQgKi8KKyNlbHNlCitzdGF0aWMgaW50IGJvYXJkX3R5cGUgPSBUQU5HRU5UOworI2VuZGlmCisKK3N0YXRpYyBpbnQgaW8gPSAweDI0MDsJCS8qIERlZmF1bHQgSU8gZm9yIERheW5hICovCitzdGF0aWMgaW50IGlycSA9IDU7CQkvKiBEZWZhdWx0IElSUSAqLworCisvKgorICoJQ09QUyBBdXRvcHJvYmUgaW5mb3JtYXRpb24uCisgKglSaWdodCBub3cgaWYgcG9ydCBhZGRyZXNzIGlzIHJpZ2h0IGJ1dCBJUlEgaXMgbm90IDUgdGhpcyB3aWxsCisgKiAgICAgIHJldHVybiBhIDUgbm8gbWF0dGVyIHdoYXQgc2luY2Ugd2Ugd2lsbCBzdGlsbCBnZXQgYSBzdGF0dXMgcmVzcG9uc2UuCisgKiAgICAgIE5lZWQgb25lIG1vcmUgYWRkaXRpb25hbCBjaGVjayB0byBuYXJyb3cgZG93biBhZnRlciB3ZSBoYXZlIGdvdHRlbgorICogICAgICB0aGUgaW9hZGRyLiBCdXQgc2luY2Ugb25seSBvdGhlciBwb3NzaWJsZSBJUlFzIGlzIDMgYW5kIDQgc28gbm8gcmVhbAorICoJaHVycnkgb24gdGhpcy4gSSAqU1RST05HTFkqIHJlY29tbWVuZCB1c2luZyBJUlEgNSBmb3IgeW91ciBjYXJkIHdpdGgKKyAqCXRoaXMgZHJpdmVyLgorICogCisgKglUaGlzIGRyaXZlciBoYXMgMiBtb2RlcyBhbmQgdGhleSBhcmU6IERheW5hIG1vZGUgYW5kIFRhbmdlbnQgbW9kZS4KKyAqCUVhY2ggbW9kZSBjb3JyZXNwb25kcyB3aXRoIHRoZSB0eXBlIG9mIGNhcmQuIEl0IGhhcyBiZWVuIGZvdW5kCisgKgl0aGF0IHRoZXJlIGFyZSAyIG1haW4gdHlwZXMgb2YgY2FyZHMgYW5kIGFsbCBvdGhlciBjYXJkcyBhcmUKKyAqCXRoZSBzYW1lIGFuZCBqdXN0IGhhdmUgZGlmZmVyZW50IG5hbWVzIG9yIG9ubHkgaGF2ZSBtaW5vciBkaWZmZXJlbmNlcworICoJc3VjaCBhcyBtb3JlIElPIHBvcnRzLiBBcyB0aGlzIGRyaXZlciBpcyB0ZXN0ZWQgaXQgd2lsbAorICoJYmVjb21lIG1vcmUgY2xlYXIgb24gZXhhY3RseSB3aGF0IGNhcmRzIGFyZSBzdXBwb3J0ZWQuIFRoZSBkcml2ZXIKKyAqCWRlZmF1bHRzIHRvIHVzaW5nIERheW5hIG1vZGUuIFRvIGNoYW5nZSB0aGUgZHJpdmVycyBtb2RlLCBzaW1wbHkKKyAqCXNlbGVjdCBEYXluYSBvciBUYW5nZW50IG1vZGUgd2hlbiBjb25maWd1cmluZyB0aGUga2VybmVsLgorICoKKyAqICAgICAgVGhpcyBkcml2ZXIgc2hvdWxkIHN1cHBvcnQ6CisgKiAgICAgIFRBTkdFTlQgZHJpdmVyIG1vZGU6CisgKiAgICAgICAgICAgICAgVGFuZ2VudCBBVEItSUksIE5vdmVsbCBOTC0xMDAwLCBEYXlzdGFyIERpZ2l0YWwgTFQtMjAwLAorICoJCUNPUFMgTFQtMQorICogICAgICBEQVlOQSBkcml2ZXIgbW9kZToKKyAqICAgICAgICAgICAgICBEYXluYSBETDIwMDAvRGF5bmFUYWxrIFBDIChIYWxmIExlbmd0aCksIENPUFMgTFQtOTUsIAorICoJCUZhcmFsbG9uIFBob25lTkVUIFBDIElJSSwgRmFyYWxsb24gUGhvbmVORVQgUEMgSUkKKyAqCU90aGVyIGNhcmRzIHBvc3NpYmx5IHN1cHBvcnRlZCBtb2RlIHVua293biB0aG91Z2g6CisgKgkJRGF5bmEgREwyMDAwIChGdWxsIGxlbmd0aCksIENPUFMgTFQvTSAoTWljcm8tQ2hhbm5lbCkKKyAqCisgKglDYXJkcyBOT1Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyIGJ1dCBzdXBwb3J0ZWQgYnkgdGhlIGx0cGMuYworICoJZHJpdmVyIHdyaXR0ZW4gYnkgQnJhZGZvcmQgVy4gSm9obnNvbiA8am9obnMzOTNAbWFyb29uLnRjLnVtbi5lZHU+CisgKgkJRmFyYWxsb24gUGhvbmVORVQgUEMKKyAqCQlPcmlnaW5hbCBBcHBsZSBMb2NhbFRhbGsgUEMgY2FyZAorICogCisgKiAgICAgIE4uQi4KKyAqCisgKiAgICAgIFRoZSBEYXlzdGFyIERpZ2l0YWwgTFQyMDAgYm9hcmRzIGRvIG5vdCBzdXBwb3J0IGludGVycnVwdC1kcml2ZW4KKyAqICAgICAgSU8uICBZb3UgbXVzdCBzcGVjaWZ5ICdpcnE9MHhmZicgYXMgYSBtb2R1bGUgcGFyYW1ldGVyIHRvIGludm9rZQorICogICAgICBwb2xsZWQgbW9kZS4gIEkgYWxzbyBiZWxpZXZlIHRoYXQgdGhlIHBvcnQgcHJvYmluZyBsb2dpYyBpcyBxdWl0ZQorICogICAgICBkYW5nZXJvdXMgYXQgYmVzdCBhbmQgY2VydGFpbmx5IGhvcGVsZXNzIGZvciBhIHBvbGxlZCBjYXJkLiAgQmVzdCB0byAKKyAqICAgICAgc3BlY2lmeSBib3RoLiAtIFN0ZXZlIEguCisgKgorICovCisKKy8qCisgKiBaZXJvIHRlcm1pbmF0ZWQgbGlzdCBvZiBJTyBwb3J0cyB0byBwcm9iZS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IHBvcnRzW10gPSB7IAorCTB4MjQwLCAweDM0MCwgMHgyMDAsIDB4MjEwLCAweDIyMCwgMHgyMzAsIDB4MjYwLCAKKwkweDJBMCwgMHgzMDAsIDB4MzEwLCAweDMyMCwgMHgzMzAsIDB4MzUwLCAweDM2MCwKKwkwCit9OworCisvKgorICogWmVybyB0ZXJtaW5hdGVkIGxpc3Qgb2YgSVJRIHBvcnRzIHRvIHByb2JlLgorICovCisKK3N0YXRpYyBpbnQgY29wc19pcnFsaXN0W10gPSB7CisJNSwgNCwgMywgMCAKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBjb3BzX3RpbWVyOworCisvKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCAyIGZvciBkZWJ1ZywgMyBmb3IgdmVyYm9zZSBkZWJ1ZyAqLworI2lmbmRlZiBDT1BTX0RFQlVHCisjZGVmaW5lIENPUFNfREVCVUcgMSAKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludCBjb3BzX2RlYnVnID0gQ09QU19ERUJVRzsKKworLyogVGhlIG51bWJlciBvZiBsb3cgSS9PIHBvcnRzIHVzZWQgYnkgdGhlIGNhcmQuICovCisjZGVmaW5lIENPUFNfSU9fRVhURU5UICAgICAgIDgKKworLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkcyB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLiAqLworCitzdHJ1Y3QgY29wc19sb2NhbAoreworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyAgICAgICAgaW50IGJvYXJkOwkJCS8qIEhvbGRzIHdoYXQgYm9hcmQgdHlwZSBpcy4gKi8KKwlpbnQgbm9kZWlkOwkJCS8qIFNldCB0byAxIG9uY2UgaGF2ZSBub2RlaWQuICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgbm9kZV9hY3F1aXJlOwkvKiBOb2RlIElEIHdoZW4gYWNxdWlyZWQuICovCisgICAgICAgIHN0cnVjdCBhdGFsa19hZGRyIG5vZGVfYWRkcjsJLyogRnVsbCBub2RlIGFkZHJlc3MgKi8KKwlzcGlubG9ja190IGxvY2s7CQkvKiBSWC9UWCBsb2NrICovCit9OworCisvKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCitzdGF0aWMgaW50ICBjb3BzX3Byb2JlMSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcik7CitzdGF0aWMgaW50ICBjb3BzX2lycSAoaW50IGlvYWRkciwgaW50IGJvYXJkKTsKKworc3RhdGljIGludCAgY29wc19vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIGNvcHNfanVtcHN0YXJ0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNvcHNfcmVzZXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzbGVlcCk7CitzdGF0aWMgdm9pZCBjb3BzX2xvYWQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgY29wc19ub2RlaWQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBub2RlaWQpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgY29wc19pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgY29wc19wb2xsICh1bnNpZ25lZCBsb25nIGx0ZGV2KTsKK3N0YXRpYyB2b2lkIGNvcHNfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNvcHNfcnggKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgY29wc19zZW5kX3BhY2tldCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgY29wc19oYXJkX2hlYWRlciAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgCisJCQkgICAgICB1bnNpZ25lZCBsZW4pOworCitzdGF0aWMgaW50ICBjb3BzX2lvY3RsIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgIGNvcHNfY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpjb3BzX2dldF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChkZXYtPmlycSkKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIENPUFNfSU9fRVhURU5UKTsKK30KKworLyoKKyAqICAgICAgQ2hlY2sgZm9yIGEgbmV0d29yayBhZGFwdG9yIG9mIHRoaXMgdHlwZSwgYW5kIHJldHVybiAnMCcgaWZmIG9uZSBleGlzdHMuCisgKiAgICAgIElmIGRldi0+YmFzZV9hZGRyID09IDAsIHByb2JlIGFsbCBsaWtlbHkgbG9jYXRpb25zLgorICogICAgICBJZiBkZXYtPmJhc2VfYWRkciBpbiBbMS4uMHgxZmZdLCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCisgKiAgICAgICAgb3RoZXJ3aXNlIGdvIHdpdGggd2hhdCB3ZSBwYXNzIGluLgorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBjb3BzX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgKnBvcnQ7CisJaW50IGJhc2VfYWRkcjsKKwlpbnQgZXJyID0gMDsKKworCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGNvcHNfbG9jYWwpLCAibHQlZCIsIGx0YWxrX3NldHVwKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAibHQlZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQlpcnEgPSBkZXYtPmlycTsKKwkJYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJfSBlbHNlIHsKKwkJYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHIgPSBpbzsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoYmFzZV9hZGRyID4gMHgxZmYpIHsgICAgLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQllcnIgPSBjb3BzX3Byb2JlMShkZXYsIGJhc2VfYWRkcik7CisJfSBlbHNlIGlmIChiYXNlX2FkZHIgIT0gMCkgeyAvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCWVyciA9IC1FTlhJTzsKKwl9IGVsc2UgeworCQkvKiBGSVhNRSAgRG9lcyB0aGlzIHJlYWxseSB3b3JrIGZvciBjYXJkcyB3aGljaCBnZW5lcmF0ZSBpcnE/CisJCSAqIEl0J3MgZGVmaW5pdGVseSBOLkcuIGZvciBwb2xsZWQgVGFuZ2VudC4gc2gKKwkJICogRGF5bmEgY2FyZHMgZG9uJ3QgYXV0b3Byb2JlIHdlbGwgYXQgYWxsLCBidXQgaWYgeW91ciBjYXJkIGlzCisJCSAqIGF0IElSUSA1ICYgSU8gMHgyNDAgd2UgZmluZCBpdCBldmVyeSB0aW1lLiA7KSBKUworCQkgKi8KKwkJZm9yIChwb3J0ID0gcG9ydHM7ICpwb3J0ICYmIGNvcHNfcHJvYmUxKGRldiwgKnBvcnQpIDwgMDsgcG9ydCsrKQorCQkJOworCQlpZiAoISpwb3J0KQorCQkJZXJyID0gLUVOT0RFVjsKKwl9CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoKKyAqICAgICAgVGhpcyBpcyB0aGUgcmVhbCBwcm9iZSByb3V0aW5lLiBMaW51eCBoYXMgYSBoaXN0b3J5IG9mIGZyaWVuZGx5IGRldmljZQorICogICAgICBwcm9iZXMgb24gdGhlIElTQSBidXMuIEEgZ29vZCBkZXZpY2UgcHJvYmVzIGF2b2lkcyBkb2luZyB3cml0ZXMsIGFuZAorICogICAgICB2ZXJpZmllcyB0aGF0IHRoZSBjb3JyZWN0IGRldmljZSBleGlzdHMgYW5kIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIGludCBfX2luaXQgY29wc19wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKyAgICAgICAgc3RydWN0IGNvcHNfbG9jYWwgKmxwOworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisJaW50IGJvYXJkID0gYm9hcmRfdHlwZTsKKwlpbnQgcmV0dmFsOworCQorICAgICAgICBpZihjb3BzX2RlYnVnICYmIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50aygiJXMiLCB2ZXJzaW9uKTsKKworCS8qIEdyYWIgdGhlIHJlZ2lvbiBzbyBubyBvbmUgZWxzZSB0cmllcyB0byBwcm9iZSBvdXIgaW9wb3J0cy4gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgQ09QU19JT19FWFRFTlQsIGRldi0+bmFtZSkpCisJCXJldHVybiAtRUJVU1k7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2luY2UgdGhpcyBib2FyZCBoYXMganVtcGVyZWQgaW50ZXJydXB0cywgYWxsb2NhdGUgdGhlIGludGVycnVwdAorICAgICAgICAgKiB2ZWN0b3Igbm93LiBUaGVyZSBpcyBubyBwb2ludCBpbiB3YWl0aW5nIHNpbmNlIG5vIG90aGVyIGRldmljZQorICAgICAgICAgKiBjYW4gdXNlIHRoZSBpbnRlcnJ1cHQsIGFuZCB0aGlzIG1hcmtzIHRoZSBpcnEgYXMgYnVzeS4gSnVtcGVyZWQKKyAgICAgICAgICogaW50ZXJydXB0cyBhcmUgdHlwaWNhbGx5IG5vdCByZXBvcnRlZCBieSB0aGUgYm9hcmRzLCBhbmQgd2UgbXVzdAorICAgICAgICAgKiB1c2VkIEF1dG9JUlEgdG8gZmluZCB0aGVtLgorCSAqLworCWRldi0+aXJxID0gaXJxOworCXN3aXRjaCAoZGV2LT5pcnEpCisJeworCQljYXNlIDA6CisJCQkvKiBDT1BTIEF1dG9JUlEgcm91dGluZSAqLworCQkJZGV2LT5pcnEgPSBjb3BzX2lycShpb2FkZHIsIGJvYXJkKTsKKwkJCWlmIChkZXYtPmlycSkKKwkJCQlicmVhazsKKwkJCS8qIE5vIElSUSBmb3VuZCBvbiB0aGlzIHBvcnQsIGZhbGx0aHJvdWdoICovCisJCWNhc2UgMToKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9vdXQ7CisKKwkJLyogRml4dXAgZm9yIHVzZXJzIHRoYXQgZG9uJ3Qga25vdyB0aGF0IElSUSAyIGlzIHJlYWxseQorCQkgKiBJUlEgOSwgb3IgZG9uJ3Qga25vdyB3aGljaCBvbmUgdG8gc2V0LgorCQkgKi8KKwkJY2FzZSAyOgorCQkJZGV2LT5pcnEgPSA5OworCQkJYnJlYWs7CisKKwkJLyogUG9sbGVkIG9wZXJhdGlvbiByZXF1ZXN0ZWQuIEFsdGhvdWdoIGlycSBvZiB6ZXJvIHBhc3NlZCBhcworCQkgKiBhIHBhcmFtZXRlciB0ZWxscyB0aGUgaW5pdCByb3V0aW5lcyB0byBwcm9iZSwgd2UnbGwKKwkJICogb3ZlcmxvYWQgaXQgdG8gZGVub3RlIHBvbGxlZCBvcGVyYXRpb24gYXQgcnVudGltZS4KKwkJICovCisJCWNhc2UgMHhmZjoKKwkJCWRldi0+aXJxID0gMDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwkvKiBSZXNlcnZlIGFueSBhY3R1YWwgaW50ZXJydXB0LiAqLworCWlmIChkZXYtPmlycSkgeworCQlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJmNvcHNfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldik7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKyAgICAgICAgbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBtZW1zZXQobHAsIDAsIHNpemVvZihzdHJ1Y3QgY29wc19sb2NhbCkpOworICAgICAgICBzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisJLyogQ29weSBsb2NhbCBib2FyZCB2YXJpYWJsZSB0byBscCBzdHJ1Y3QuICovCisJbHAtPmJvYXJkICAgICAgICAgICAgICAgPSBib2FyZDsKKworCWRldi0+aGFyZF9zdGFydF94bWl0ICAgID0gY29wc19zZW5kX3BhY2tldDsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gY29wc190aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBIWiAqIDI7CisJZGV2LT5oYXJkX2hlYWRlcgk9IGNvcHNfaGFyZF9oZWFkZXI7CisgICAgICAgIGRldi0+Z2V0X3N0YXRzICAgICAgICAgID0gY29wc19nZXRfc3RhdHM7CisJZGV2LT5vcGVuICAgICAgICAgICAgICAgPSBjb3BzX29wZW47CisgICAgICAgIGRldi0+c3RvcCAgICAgICAgICAgICAgID0gY29wc19jbG9zZTsKKyAgICAgICAgZGV2LT5kb19pb2N0bCAgICAgICAgICAgPSBjb3BzX2lvY3RsOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2V0X211bHRpY2FzdF9saXN0OworICAgICAgICBkZXYtPm1jX2xpc3QgICAgICAgICAgICA9IE5VTEw7CisKKwkvKiBUZWxsIHRoZSB1c2VyIHdoZXJlIHRoZSBjYXJkIGlzIGFuZCB3aGF0IG1vZGUgd2UncmUgaW4uICovCisJaWYoYm9hcmQ9PURBWU5BKQorCQlwcmludGsoIiVzOiAlcyBhdCAlIzN4LCB1c2luZyBJUlEgJWQsIGluIERheW5hIG1vZGUuXG4iLCAKKwkJCWRldi0+bmFtZSwgY2FyZG5hbWUsIGlvYWRkciwgZGV2LT5pcnEpOworCWlmKGJvYXJkPT1UQU5HRU5UKSB7CisJCWlmKGRldi0+aXJxKQorCQkJcHJpbnRrKCIlczogJXMgYXQgJSMzeCwgSVJRICVkLCBpbiBUYW5nZW50IG1vZGVcbiIsIAorCQkJCWRldi0+bmFtZSwgY2FyZG5hbWUsIGlvYWRkciwgZGV2LT5pcnEpOworCQllbHNlCisJCQlwcmludGsoIiVzOiAlcyBhdCAlIzN4LCB1c2luZyBwb2xsZWQgSU8sIGluIFRhbmdlbnQgbW9kZS5cbiIsIAorCQkJCWRldi0+bmFtZSwgY2FyZG5hbWUsIGlvYWRkcik7CisKKwl9CisgICAgICAgIHJldHVybiAwOworCitlcnJfb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgQ09QU19JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNvcHNfaXJxIChpbnQgaW9hZGRyLCBpbnQgYm9hcmQpCit7ICAgICAgIC8qCisgICAgICAgICAqIFRoaXMgZG9lcyBub3QgdXNlIHRoZSBJUlEgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSBJUlEgaXMuIFdlIGp1c3QKKyAgICAgICAgICogYXNzdW1lIHRoYXQgd2hlbiB3ZSBnZXQgYSBjb3JyZWN0IHN0YXR1cyByZXNwb25zZSB0aGF0IGl0J3MgdGhlIElSUS4KKyAgICAgICAgICogVGhpcyByZWFsbHkganVzdCB2ZXJpZmllcyB0aGUgSU8gcG9ydCBidXQgc2luY2Ugd2Ugb25seSBoYXZlIGFjY2VzcworICAgICAgICAgKiB0byBzdWNoIGEgc21hbGwgbnVtYmVyIG9mIElSUXMgKDUsIDQsIDMpIHRoaXMgaXMgbm90IGJhZC4KKyAgICAgICAgICogVGhpcyB3aWxsIHByb2JhYmx5IG5vdCB3b3JrIGZvciBtb3JlIHRoYW4gb25lIGNhcmQuCisgICAgICAgICAqLworICAgICAgICBpbnQgaXJxYWRkcj0wOworICAgICAgICBpbnQgaSwgeCwgc3RhdHVzOworCisgICAgICAgIGlmKGJvYXJkPT1EQVlOQSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIG91dGIoMCwgaW9hZGRyK0RBWU5BX1JFU0VUKTsKKyAgICAgICAgICAgICAgICBpbmIoaW9hZGRyK0RBWU5BX1JFU0VUKTsKKyAgICAgICAgICAgICAgICBtZGVsYXkoMzMzKTsKKyAgICAgICAgfQorICAgICAgICBpZihib2FyZD09VEFOR0VOVCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGluYihpb2FkZHIpOworICAgICAgICAgICAgICAgIG91dGIoMCwgaW9hZGRyKTsKKyAgICAgICAgICAgICAgICBvdXRiKDAsIGlvYWRkcitUQU5HX1JFU0VUKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcihpPTA7IGNvcHNfaXJxbGlzdFtpXSAhPTA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlycWFkZHIgPSBjb3BzX2lycWxpc3RbaV07CisgICAgICAgICAgICAgICAgZm9yKHggPSAweEZGRkY7IHg+MDsgeCAtLSkgICAgLyogd2FpdCBmb3IgcmVzcG9uc2UgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihib2FyZD09REFZTkEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IChpbmIoaW9hZGRyK0RBWU5BX0NBUkRfU1RBVFVTKSYzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlycWFkZHI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZihib2FyZD09VEFOR0VOVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGluYihpb2FkZHIrVEFOR19DQVJEX1NUQVRVUykmIFRBTkdfVFhfUkVBRFkpICE9MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXJxYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7ICAgICAgIC8qIG5vIElSUSBmb3VuZCAqLworfQorCisvKgorICogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKKyAqIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKyAqLworc3RhdGljIGludCBjb3BzX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgY29wc19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYoZGV2LT5pcnE9PTApCisJeworCQkvKgorCQkgKiBJIGRvbid0IGtub3cgaWYgdGhlIERheW5hLXN0eWxlIGJvYXJkcyBzdXBwb3J0IHBvbGxlZCAKKwkJICogb3BlcmF0aW9uLiAgRm9yIG5vdywgb25seSBhbGxvdyBpdCBmb3IgVGFuZ2VudC4KKwkJICovCisJCWlmKGxwLT5ib2FyZD09VEFOR0VOVCkJLyogUG9sbCAyMCB0aW1lcyBwZXIgc2Vjb25kICovCisJCXsKKwkJICAgIGluaXRfdGltZXIoJmNvcHNfdGltZXIpOworCQkgICAgY29wc190aW1lci5mdW5jdGlvbiA9IGNvcHNfcG9sbDsKKwkJICAgIGNvcHNfdGltZXIuZGF0YSAJPSAodW5zaWduZWQgbG9uZylkZXY7CisJCSAgICBjb3BzX3RpbWVyLmV4cGlyZXMgCT0gamlmZmllcyArIEhaLzIwOworCQkgICAgYWRkX3RpbWVyKCZjb3BzX3RpbWVyKTsKKwkJfSAKKwkJZWxzZSAKKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vIGlycSBsaW5lIHNldFxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJfQorCisJY29wc19qdW1wc3RhcnQoZGV2KTsJLyogU3RhcnQgdGhlIGNhcmQgdXAuICovCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICAgICAgICByZXR1cm4gMDsKK30KKworLyoKKyAqCVRoaXMgYWxsb3dzIGZvciBhIGR5bmFtaWMgc3RhcnQvcmVzdGFydCBvZiB0aGUgZW50aXJlIGNhcmQuCisgKi8KK3N0YXRpYyBpbnQgY29wc19qdW1wc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY29wc19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyoKKyAgICAgICAgICogICAgICBPbmNlIHRoZSBjYXJkIGhhcyB0aGUgZmlybXdhcmUgbG9hZGVkIGFuZCBoYXMgYWNxdWlyZWQKKyAgICAgICAgICogICAgICB0aGUgbm9kZWlkLCBpZiBpdCBpcyByZXNldCBpdCB3aWxsIGxvc2UgaXQgYWxsLgorICAgICAgICAgKi8KKyAgICAgICAgY29wc19yZXNldChkZXYsMSk7CS8qIE5lZWQgdG8gcmVzZXQgY2FyZCBiZWZvcmUgbG9hZCBmaXJtd2FyZS4gKi8KKyAgICAgICAgY29wc19sb2FkKGRldik7CQkvKiBMb2FkIHRoZSBmaXJtd2FyZS4gKi8KKworCS8qCisJICoJSWYgYXRhbGtkIGFscmVhZHkgZ2F2ZSB1cyBhIG5vZGVpZCB3ZSB3aWxsIHVzZSB0aGF0CisJICoJb25lIGFnYWluLCBlbHNlIHdlIHdhaXQgZm9yIGF0YWxrZCB0byBnaXZlIHVzIGEgbm9kZWlkCisJICoJaW4gY29wc19pb2N0bC4gVGhpcyBtYXkgY2F1c2UgYSBwcm9ibGVtIGlmIHNvbWVvbmUgc3RlYWxzCisJICoJb3VyIG5vZGVpZCB3aGlsZSB3ZSBhcmUgcmVzZXR0aW5nLgorCSAqLwkKKwlpZihscC0+bm9kZWlkID09IDEpCisJCWNvcHNfbm9kZWlkKGRldixscC0+bm9kZV9hY3F1aXJlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0YW5nZW50X3dhaXRfcmVzZXQoaW50IGlvYWRkcikKK3sKKwlpbnQgdGltZW91dD0wOworCisJd2hpbGUodGltZW91dCsrIDwgNSAmJiAoaW5iKGlvYWRkcitUQU5HX0NBUkRfU1RBVFVTKSZUQU5HX1RYX1JFQURZKT09MCkKKwkJbWRlbGF5KDEpOyAgIC8qIFdhaXQgMSBzZWNvbmQgKi8KK30KKworLyoKKyAqICAgICAgUmVzZXQgdGhlIExvY2FsVGFsayBib2FyZC4KKyAqLworc3RhdGljIHZvaWQgY29wc19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc2xlZXApCit7CisgICAgICAgIHN0cnVjdCBjb3BzX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBpb2FkZHI9ZGV2LT5iYXNlX2FkZHI7CisKKyAgICAgICAgaWYobHAtPmJvYXJkPT1UQU5HRU5UKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5iKGlvYWRkcik7CQkvKiBDbGVhciByZXF1ZXN0IGxhdGNoLiAqLworICAgICAgICAgICAgICAgIG91dGIoMCxpb2FkZHIpOwkJLyogQ2xlYXIgdGhlIFRBTkdfVFhfUkVBRFkgZmxvcC4gKi8KKyAgICAgICAgICAgICAgICBvdXRiKDAsIGlvYWRkcitUQU5HX1JFU0VUKTsJLyogUmVzZXQgdGhlIGFkYXB0ZXIuICovCisKKwkJdGFuZ2VudF93YWl0X3Jlc2V0KGlvYWRkcik7CisgICAgICAgICAgICAgICAgb3V0YigwLCBpb2FkZHIrVEFOR19DTEVBUl9JTlQpOworICAgICAgICB9CisgICAgICAgIGlmKGxwLT5ib2FyZD09REFZTkEpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRiKDAsIGlvYWRkcitEQVlOQV9SRVNFVCk7CS8qIEFzc2VydCB0aGUgcmVzZXQgcG9ydCAqLworICAgICAgICAgICAgICAgIGluYihpb2FkZHIrREFZTkFfUkVTRVQpOwkvKiBDbGVhciB0aGUgcmVzZXQgKi8KKyAgICAgICAgICAgICAgICBpZihzbGVlcCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHNuYXA9amlmZmllczsKKworCQkJLyogTGV0IGNhcmQgZmluaXNoIGluaXRpYWxpemluZywgYWJvdXQgMS8zIHNlY29uZCAqLworCSAgICAgICAgICAgICAgICB3aGlsZShqaWZmaWVzLXNuYXA8SFovMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbWRlbGF5KDMzMyk7CisgICAgICAgIH0KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjb3BzX2xvYWQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBpZnJlcSBpZnI7CisgICAgICAgIHN0cnVjdCBsdGZpcm13YXJlICpsdGY9IChzdHJ1Y3QgbHRmaXJtd2FyZSAqKSZpZnIuaWZyX2lmcnU7CisgICAgICAgIHN0cnVjdCBjb3BzX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBpb2FkZHI9ZGV2LT5iYXNlX2FkZHI7CisJaW50IGxlbmd0aCwgaSA9IDA7CisKKyAgICAgICAgc3RyY3B5KGlmci5pZnJfbmFtZSwibHQwIik7CisKKyAgICAgICAgLyogR2V0IGNhcmQncyBmaXJtd2FyZSBjb2RlIGFuZCBkbyBzb21lIGNoZWNrcyBvbiBpdC4gKi8KKyNpZmRlZiBDT05GSUdfQ09QU19EQVlOQSAgICAgICAgCisgICAgICAgIGlmKGxwLT5ib2FyZD09REFZTkEpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsdGYtPmxlbmd0aD1zaXplb2YoZmZkcnZfY29kZSk7CisgICAgICAgICAgICAgICAgbHRmLT5kYXRhPWZmZHJ2X2NvZGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmICAgICAgICAKKyNpZmRlZiBDT05GSUdfQ09QU19UQU5HRU5UCisgICAgICAgIGlmKGxwLT5ib2FyZD09VEFOR0VOVCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGx0Zi0+bGVuZ3RoPXNpemVvZihsdGRydl9jb2RlKTsKKyAgICAgICAgICAgICAgICBsdGYtPmRhdGE9bHRkcnZfY29kZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKwl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOyB1bnN1cHBvcnRlZCBib2FyZCB0eXBlLlxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwkKKyAgICAgICAgLyogQ2hlY2sgdG8gbWFrZSBzdXJlIGZpcm13YXJlIGlzIGNvcnJlY3QgbGVuZ3RoLiAqLworICAgICAgICBpZihscC0+Ym9hcmQ9PURBWU5BICYmIGx0Zi0+bGVuZ3RoIT01OTgzKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZpcm13YXJlIGlzIG5vdCBsZW5ndGggb2YgRkZEUlYuQklOLlxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYobHAtPmJvYXJkPT1UQU5HRU5UICYmIGx0Zi0+bGVuZ3RoIT0yNTAxKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZpcm13YXJlIGlzIG5vdCBsZW5ndGggb2YgRFJWQ09ERS5CSU4uXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGxwLT5ib2FyZD09REFZTkEpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqICAgICAgV2UgbXVzdCB3YWl0IGZvciBhIHN0YXR1cyByZXNwb25zZQorICAgICAgICAgICAgICAgICAqICAgICAgd2l0aCB0aGUgREFZTkEgYm9hcmQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgd2hpbGUoKytpPDY1NTM2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgaWYoKGluYihpb2FkZHIrREFZTkFfQ0FSRF9TVEFUVVMpJjMpPT0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihpPT02NTUzNikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqICAgICAgVXBsb2FkIHRoZSBmaXJtd2FyZSBhbmQga2ljay4gQnl0ZS1ieS1ieXRlIHdvcmtzIG5pY2VseSBoZXJlLgorICAgICAgICAgKi8KKwlpPTA7CisgICAgICAgIGxlbmd0aCA9IGx0Zi0+bGVuZ3RoOworICAgICAgICB3aGlsZShsZW5ndGgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIG91dGIobHRmLT5kYXRhW2ldLCBpb2FkZHIpOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorCisJaWYoY29wc19kZWJ1ZyA+IDEpCisJCXByaW50aygiJXM6IFVwbG9hZGVkIGZpcm13YXJlIC0gJWQgYnl0ZXMgb2YgJWQgYnl0ZXMuXG4iLCAKKwkJCWRldi0+bmFtZSwgaSwgbHRmLT5sZW5ndGgpOworCisgICAgICAgIGlmKGxwLT5ib2FyZD09REFZTkEpIAkvKiBUZWxsIERheW5hIHRvIHJ1biB0aGUgZmlybXdhcmUgY29kZS4gKi8KKyAgICAgICAgICAgICAgICBvdXRiKDEsIGlvYWRkcitEQVlOQV9JTlRfQ0FSRCk7CisJZWxzZQkJCS8qIFRlbGwgVGFuZyB0byBydW4gdGhlIGZpcm13YXJlIGNvZGUuICovCisJCWluYihpb2FkZHIpOworCisgICAgICAgIGlmKGxwLT5ib2FyZD09VEFOR0VOVCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHRhbmdlbnRfd2FpdF9yZXNldChpb2FkZHIpOworICAgICAgICAgICAgICAgIGluYihpb2FkZHIpOwkvKiBDbGVhciBpbml0aWFsIHJlYWR5IHNpZ25hbC4gKi8KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKK30KKworLyoKKyAqIAlHZXQgdGhlIExvY2FsVGFsayBOb2RlaWQgZnJvbSB0aGUgY2FyZC4gV2UgY2FuIHN1Z2dlc3QKKyAqCWFueSBub2RlaWQgMS0yNTQuIFRoZSBjYXJkIHdpbGwgdHJ5IGFuZCBnZXQgdGhhdCBleGFjdAorICoJYWRkcmVzcyBlbHNlIHdlIGNhbiBzcGVjaWZ5IDAgYXMgdGhlIG5vZGVpZCBhbmQgdGhlIGNhcmQKKyAqCXdpbGwgYXV0b3Byb2JlIGZvciBhIG5vZGVpZC4KKyAqLworc3RhdGljIGludCBjb3BzX25vZGVpZCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5vZGVpZCkKK3sKKwlzdHJ1Y3QgY29wc19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmKGxwLT5ib2FyZCA9PSBEQVlOQSkKKyAgICAgICAgeworICAgICAgICAJLyogRW1wdHkgYW55IHBlbmRpbmcgYWRhcHRlciByZXNwb25zZXMuICovCisgICAgICAgICAgICAgICAgd2hpbGUoKGluYihpb2FkZHIrREFZTkFfQ0FSRF9TVEFUVVMpJkRBWU5BX1RYX1JFQURZKT09MCkKKyAgICAgICAgICAgICAgICB7CisJCQlvdXRiKDAsIGlvYWRkcitDT1BTX0NMRUFSX0lOVCk7CS8qIENsZWFyIGludGVycnVwdHMuICovCisgICAgICAgIAkJaWYoKGluYihpb2FkZHIrREFZTkFfQ0FSRF9TVEFUVVMpJjB4MDMpPT1EQVlOQV9SWF9SRVFVRVNUKQorICAgICAgICAgICAgICAgIAkJY29wc19yeChkZXYpOwkvKiBLaWNrIGFueSBwYWNrZXRzIHdhaXRpbmcuICovCisJCQlzY2hlZHVsZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG91dGIoMiwgaW9hZGRyKTsgICAgICAgCS8qIE91dHB1dCBjb21tYW5kIHBhY2tldCBsZW5ndGggYXMgMi4gKi8KKyAgICAgICAgICAgICAgICBvdXRiKDAsIGlvYWRkcik7CisgICAgICAgICAgICAgICAgb3V0YihMQVBfSU5JVCwgaW9hZGRyKTsJLyogU2VuZCBMQVBfSU5JVCBjb21tYW5kIGJ5dGUuICovCisgICAgICAgICAgICAgICAgb3V0Yihub2RlaWQsIGlvYWRkcik7ICAJLyogU3VnZ2VzdCBub2RlIGFkZHJlc3MuICovCisgICAgICAgIH0KKworCWlmKGxwLT5ib2FyZCA9PSBUQU5HRU5UKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRW1wdHkgYW55IHBlbmRpbmcgYWRhcHRlciByZXNwb25zZXMuICovCisgICAgICAgICAgICAgICAgd2hpbGUoaW5iKGlvYWRkcitUQU5HX0NBUkRfU1RBVFVTKSZUQU5HX1JYX1JFQURZKQorICAgICAgICAgICAgICAgIHsKKwkJCW91dGIoMCwgaW9hZGRyK0NPUFNfQ0xFQVJfSU5UKTsJLyogQ2xlYXIgaW50ZXJydXB0LiAqLworICAgICAgICAgICAgICAgIAljb3BzX3J4KGRldik7ICAgICAgICAgIAkvKiBLaWNrIG91dCBwYWNrZXRzIHdhaXRpbmcuICovCisJCQlzY2hlZHVsZSgpOworICAgICAgICAgICAgICAgIH0KKworCQkvKiBOb3Qgc3VyZSB3aGF0IFRhbmdlbnQgZG9lcyBpZiBub2RlaWQgcGlja2VkIGlzIHVzZWQuICovCisgICAgICAgICAgICAgICAgaWYobm9kZWlkID09IDApCSAgICAgICAgIAkJLyogU2VlZC4gKi8KKyAgICAgICAgICAgICAgICAJbm9kZWlkID0gamlmZmllcyYweEZGOwkJLyogR2V0IGEgcmFuZG9tIHRyeSAqLworICAgICAgICAgICAgICAgIG91dGIoMiwgaW9hZGRyKTsgICAgICAgIAkJLyogQ29tbWFuZCBsZW5ndGggTFNCICovCisgICAgICAgICAgICAgICAgb3V0YigwLCBpb2FkZHIpOyAgICAgICAJCQkvKiBDb21tYW5kIGxlbmd0aCBNU0IgKi8KKyAgICAgICAgICAgICAgICBvdXRiKExBUF9JTklULCBpb2FkZHIpOyAJCS8qIFNlbmQgTEFQX0lOSVQgYnl0ZSAqLworICAgICAgICAgICAgICAgIG91dGIobm9kZWlkLCBpb2FkZHIpOyAJCSAgCS8qIExBUCBhZGRyZXNzIGhpbnQuICovCisgICAgICAgICAgICAgICAgb3V0YigweEZGLCBpb2FkZHIpOyAgICAgCQkvKiBJbnQuIGxldmVsIHRvIHVzZSAqLworICAgICAgICB9CisKKwlscC0+bm9kZV9hY3F1aXJlPTA7CQkvKiBTZXQgbm9kZWlkIGhvbGRlciB0byAwLiAqLworICAgICAgICB3aGlsZShscC0+bm9kZV9hY3F1aXJlPT0wKQkvKiBHZXQgKlRydWUqIG5vZGVpZCBmaW5hbGx5LiAqLworCXsKKwkJb3V0YigwLCBpb2FkZHIrQ09QU19DTEVBUl9JTlQpOwkvKiBDbGVhciBhbnkgaW50ZXJydXB0LiAqLworCisJCWlmKGxwLT5ib2FyZCA9PSBEQVlOQSkKKwkJeworICAgICAgICAgICAgICAgIAlpZigoaW5iKGlvYWRkcitEQVlOQV9DQVJEX1NUQVRVUykmMHgwMyk9PURBWU5BX1JYX1JFUVVFU1QpCisgICAgICAgICAgICAgICAgCQljb3BzX3J4KGRldik7CS8qIEdyYWIgdGhlIG5vZGVpZCBwdXQgaW4gbHAtPm5vZGVfYWNxdWlyZS4gKi8KKwkJfQorCQlpZihscC0+Ym9hcmQgPT0gVEFOR0VOVCkKKwkJewkKKwkJCWlmKGluYihpb2FkZHIrVEFOR19DQVJEX1NUQVRVUykmVEFOR19SWF9SRUFEWSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29wc19yeChkZXYpOyAgIC8qIEdyYWIgdGhlIG5vZGVpZCBwdXQgaW4gbHAtPm5vZGVfYWNxdWlyZS4gKi8KKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKworCWlmKGNvcHNfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5vZGUgSUQgJWQgaGFzIGJlZW4gYWNxdWlyZWQuXG4iLCAKKwkJCWRldi0+bmFtZSwgbHAtPm5vZGVfYWNxdWlyZSk7CisKKwlscC0+bm9kZWlkPTE7CS8qIFNldCBnb3Qgbm9kZWlkIHRvIDEuICovCisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKglQb2xsIHRoZSBUYW5nZW50IHR5cGUgY2FyZHMgdG8gc2VlIGlmIHdlIGhhdmUgd29yay4KKyAqLworIAorc3RhdGljIHZvaWQgY29wc19wb2xsKHVuc2lnbmVkIGxvbmcgbHRkZXYpCit7CisJaW50IGlvYWRkciwgc3RhdHVzOworCWludCBib2d1c2NvdW50ID0gMDsKKworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilsdGRldjsKKworCWRlbF90aW1lcigmY29wc190aW1lcik7CisKKwlpZihkZXYgPT0gTlVMTCkKKwkJcmV0dXJuOwkvKiBXZSd2ZSBiZWVuIGRvd25lZCAqLworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJZG8geworCQlzdGF0dXM9aW5iKGlvYWRkcitUQU5HX0NBUkRfU1RBVFVTKTsKKwkJaWYoc3RhdHVzICYgVEFOR19SWF9SRUFEWSkKKwkJCWNvcHNfcngoZGV2KTsKKwkJaWYoc3RhdHVzICYgVEFOR19UWF9SRUFEWSkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJc3RhdHVzID0gaW5iKGlvYWRkcitUQU5HX0NBUkRfU1RBVFVTKTsKKwl9IHdoaWxlKCgrK2JvZ3VzY291bnQgPCAyMCkgJiYgKHN0YXR1cyYoVEFOR19SWF9SRUFEWXxUQU5HX1RYX1JFQURZKSkpOworCisJLyogcG9sbCAyMCB0aW1lcyBwZXIgc2Vjb25kICovCisJY29wc190aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaLzIwOworCWFkZF90aW1lcigmY29wc190aW1lcik7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiAgICAgIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisgKiAgICAgIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIGlycXJldHVybl90IGNvcHNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworICAgICAgICBzdHJ1Y3QgY29wc19sb2NhbCAqbHA7CisgICAgICAgIGludCBpb2FkZHIsIHN0YXR1czsKKyAgICAgICAgaW50IGJvZ3VzY291bnQgPSAwOworCisgICAgICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgICAgICBscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZihscC0+Ym9hcmQ9PURBWU5BKQorCXsKKwkJZG8geworCQkJb3V0YigwLCBpb2FkZHIgKyBDT1BTX0NMRUFSX0lOVCk7CisgICAgICAgICAgICAgICAgICAgICAgIAlzdGF0dXM9aW5iKGlvYWRkcitEQVlOQV9DQVJEX1NUQVRVUyk7CisgICAgICAgICAgICAgICAgICAgICAgIAlpZigoc3RhdHVzJjB4MDMpPT1EQVlOQV9SWF9SRVFVRVNUKQorICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBjb3BzX3J4KGRldik7CisgICAgICAgICAgICAgICAgCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfSB3aGlsZSgrK2JvZ3VzY291bnQgPCAyMCk7CisJfQorCWVsc2UKKwl7CisJCWRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCXN0YXR1cz1pbmIoaW9hZGRyK1RBTkdfQ0FSRF9TVEFUVVMpOworCQkJaWYoc3RhdHVzICYgVEFOR19SWF9SRUFEWSkKKwkJCQljb3BzX3J4KGRldik7CisJCQlpZihzdGF0dXMgJiBUQU5HX1RYX1JFQURZKQorCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCXN0YXR1cz1pbmIoaW9hZGRyK1RBTkdfQ0FSRF9TVEFUVVMpOworCQl9IHdoaWxlKCgrK2JvZ3VzY291bnQgPCAyMCkgJiYgKHN0YXR1cyYoVEFOR19SWF9SRUFEWXxUQU5HX1RYX1JFQURZKSkpOworCX0KKworICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiAgICAgIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLgorICovCitzdGF0aWMgdm9pZCBjb3BzX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBwa3RfbGVuID0gMDsKKyAgICAgICAgaW50IHJzcF90eXBlID0gMDsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisgICAgICAgIHN0cnVjdCBjb3BzX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAgICAgaW50IGJvZ3VzY291bnQgPSAwOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkKKyAgICAgICAgaWYobHAtPmJvYXJkPT1EQVlOQSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIG91dGIoMCwgaW9hZGRyKTsgICAgICAgICAgICAgICAgLyogU2VuZCBvdXQgWmVybyBsZW5ndGguICovCisgICAgICAgICAgICAgICAgb3V0YigwLCBpb2FkZHIpOworICAgICAgICAgICAgICAgIG91dGIoREFUQV9SRUFELCBpb2FkZHIpOyAgICAgICAgLyogU2VuZCByZWFkIGNvbW1hbmQgb3V0LiAqLworCisgICAgICAgICAgICAgICAgLyogV2FpdCBmb3IgRE1BIHRvIHR1cm4gYXJvdW5kLiAqLworICAgICAgICAgICAgICAgIHdoaWxlKCsrYm9ndXNjb3VudDwxMDAwMDAwKQorICAgICAgICAgICAgICAgIHsKKwkJCWJhcnJpZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKChpbmIoaW9hZGRyK0RBWU5BX0NBUkRfU1RBVFVTKSYweDAzKT09REFZTkFfUlhfUkVBRFkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKGJvZ3VzY291bnQ9PTEwMDAwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IERNQSB0aW1lZCBvdXQuXG4iLGRldi0+bmFtZSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEdldCByZXNwb25zZSBsZW5ndGguICovCisJaWYobHAtPmJvYXJkPT1EQVlOQSkKKyAgICAgICAgCXBrdF9sZW4gPSBpbmIoaW9hZGRyKSAmIDB4RkY7CisJZWxzZQorCQlwa3RfbGVuID0gaW5iKGlvYWRkcikgJiAweDAwRkY7CisgICAgICAgIHBrdF9sZW4gfD0gKGluYihpb2FkZHIpIDw8IDgpOworICAgICAgICAvKiBJbnB1dCBJTyBjb2RlLiAqLworICAgICAgICByc3BfdHlwZT1pbmIoaW9hZGRyKTsKKworICAgICAgICAvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4gKi8KKyAgICAgICAgc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKTsKKyAgICAgICAgaWYoc2tiID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCisJCQlkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisgICAgICAgICAgICAgICAgd2hpbGUocGt0X2xlbi0tKSAgICAgICAgLyogRGlzY2FyZCBwYWNrZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGluYihpb2FkZHIpOworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNrYi0+ZGV2ID0gZGV2OworICAgICAgICBza2JfcHV0KHNrYiwgcGt0X2xlbik7CisgICAgICAgIHNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9MT0NBTFRBTEspOworCisgICAgICAgIGluc2IoaW9hZGRyLCBza2ItPmRhdGEsIHBrdF9sZW4pOyAgICAgICAgICAgICAgIC8qIEVhdCB0aGUgRGF0YSAqLworCisgICAgICAgIGlmKGxwLT5ib2FyZD09REFZTkEpCisgICAgICAgICAgICAgICAgb3V0YigxLCBpb2FkZHIrREFZTkFfSU5UX0NBUkQpOyAgICAgICAgIC8qIEludGVycnVwdCB0aGUgY2FyZCAqLworCisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7ICAvKiBSZXN0b3JlIGludGVycnVwdHMuICovCisKKyAgICAgICAgLyogQ2hlY2sgZm9yIGJhZCByZXNwb25zZSBsZW5ndGggKi8KKyAgICAgICAgaWYocGt0X2xlbiA8IDAgfHwgcGt0X2xlbiA+IE1BWF9MTEFQX1NJWkUpCisgICAgICAgIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEJhZCBwYWNrZXQgbGVuZ3RoIG9mICVkIGJ5dGVzLlxuIiwgCisJCQlkZXYtPm5hbWUsIHBrdF9sZW4pOworICAgICAgICAgICAgICAgIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldCBub2RlaWQgYW5kIHRoZW4gZ2V0IG91dC4gKi8KKyAgICAgICAgaWYocnNwX3R5cGUgPT0gTEFQX0lOSVRfUlNQKQorICAgICAgICB7CS8qIE5vZGVpZCB0YWtlbiBmcm9tIHJlY2VpdmVkIHBhY2tldC4gKi8KKyAgICAgICAgICAgICAgICBscC0+bm9kZV9hY3F1aXJlID0gc2tiLT5kYXRhWzBdOworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogT25lIGxhc3QgY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSBnb29kIHBhY2tldC4gKi8KKyAgICAgICAgaWYocnNwX3R5cGUgIT0gTEFQX1JFU1BPTlNFKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEJhZCBwYWNrZXQgdHlwZSAlZC5cbiIsIGRldi0+bmFtZSwgcnNwX3R5cGUpOworICAgICAgICAgICAgICAgIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHNrYi0+bWFjLnJhdyAgICA9IHNrYi0+ZGF0YTsgICAgLyogUG9pbnQgdG8gZW50aXJlIHBhY2tldC4gKi8KKyAgICAgICAgc2tiX3B1bGwoc2tiLDMpOworICAgICAgICBza2ItPmgucmF3ICAgICAgPSBza2ItPmRhdGE7ICAgIC8qIFBvaW50IHRvIGRhdGEgKFNraXAgaGVhZGVyKS4gKi8KKworICAgICAgICAvKiBVcGRhdGUgdGhlIGNvdW50ZXJzLiAqLworICAgICAgICBscC0+c3RhdHMucnhfcGFja2V0cysrOworICAgICAgICBscC0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKyAgICAgICAgLyogU2VuZCBwYWNrZXQgdG8gYSBoaWdoZXIgcGxhY2UuICovCisgICAgICAgIG5ldGlmX3J4KHNrYik7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK30KKworc3RhdGljIHZvaWQgY29wc190aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBjb3BzX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICAgICAgaWYobHAtPmJvYXJkPT1UQU5HRU5UKQorICAgICAgICB7CisJCWlmKChpbmIoaW9hZGRyK1RBTkdfQ0FSRF9TVEFUVVMpJlRBTkdfVFhfUkVBRFkpPT0wKQorICAgICAgICAgICAgICAgCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gVFggY29tcGxldGUgaW50ZXJydXB0LlxuIiwgZGV2LT5uYW1lKTsKKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dC5cbiIsIGRldi0+bmFtZSk7CisJY29wc19qdW1wc3RhcnQoZGV2KTsJLyogUmVzdGFydCB0aGUgY2FyZC4gKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKworLyoKKyAqCU1ha2UgdGhlIGNhcmQgdHJhbnNtaXQgYSBMb2NhbFRhbGsgcGFja2V0LgorICovCisKK3N0YXRpYyBpbnQgY29wc19zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgY29wc19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQmxvY2sgYSB0aW1lci1iYXNlZCB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nLiAKKwkgKi8KKwkgCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJaWYobHAtPmJvYXJkID09IERBWU5BKQkgLyogV2FpdCBmb3IgYWRhcHRlciB0cmFuc21pdCBidWZmZXIuICovCisJCXdoaWxlKChpbmIoaW9hZGRyK0RBWU5BX0NBUkRfU1RBVFVTKSZEQVlOQV9UWF9SRUFEWSk9PTApCisJCQljcHVfcmVsYXgoKTsKKwlpZihscC0+Ym9hcmQgPT0gVEFOR0VOVCkgLyogV2FpdCBmb3IgYWRhcHRlciB0cmFuc21pdCBidWZmZXIuICovCisJCXdoaWxlKChpbmIoaW9hZGRyK1RBTkdfQ0FSRF9TVEFUVVMpJlRBTkdfVFhfUkVBRFkpPT0wKQorCQkJY3B1X3JlbGF4KCk7CisKKwkvKiBPdXRwdXQgSU8gbGVuZ3RoLiAqLworCW91dGIoc2tiLT5sZW4sIGlvYWRkcik7CisJaWYobHAtPmJvYXJkID09IERBWU5BKQorICAgICAgICAgICAgICAgCW91dGIoc2tiLT5sZW4gPj4gOCwgaW9hZGRyKTsKKwllbHNlCisJCW91dGIoKHNrYi0+bGVuID4+IDgpJjB4MEZGLCBpb2FkZHIpOworCisJLyogT3V0cHV0IElPIGNvZGUuICovCisJb3V0YihMQVBfV1JJVEUsIGlvYWRkcik7CisKKwlpZihscC0+Ym9hcmQgPT0gREFZTkEpCS8qIENoZWNrIHRoZSB0cmFuc21pdCBidWZmZXIgYWdhaW4uICovCisgICAgICAgIAl3aGlsZSgoaW5iKGlvYWRkcitEQVlOQV9DQVJEX1NUQVRVUykmREFZTkFfVFhfUkVBRFkpPT0wKTsKKworCW91dHNiKGlvYWRkciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CS8qIFNlbmQgb3V0IHRoZSBkYXRhLiAqLworCisJaWYobHAtPmJvYXJkPT1EQVlOQSkJLyogRGF5bmEgcmVxdWlyZXMgeW91IGtpY2sgdGhlIGNhcmQgKi8KKwkJb3V0YigxLCBpb2FkZHIrREFZTkFfSU5UX0NBUkQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsJLyogUmVzdG9yZSBpbnRlcnJ1cHRzLiAqLworCisJLyogRG9uZSBzZW5kaW5nIHBhY2tldCwgdXBkYXRlIGNvdW50ZXJzIGFuZCBjbGVhbnVwLiAqLworCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJbHAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWRldl9rZnJlZV9za2IgKHNrYik7CisgICAgICAgIHJldHVybiAwOworfQorCisvKgorICoJRHVtbXkgZnVuY3Rpb24gdG8ga2VlcCB0aGUgQXBwbGV0YWxrIGxheWVyIGhhcHB5LgorICovCisgCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgaWYoY29wc19kZWJ1ZyA+PSAzKQorCQlwcmludGsoIiVzOiBzZXRfbXVsdGljYXN0X2xpc3QgZXhlY3V0ZWRcbiIsIGRldi0+bmFtZSk7Cit9CisKKy8qCisgKiAgICAgIEFub3RoZXIgRHVtbXkgZnVuY3Rpb24gdG8ga2VlcCB0aGUgQXBwbGV0YWxrIGxheWVyIGhhcHB5LgorICovCisgCitzdGF0aWMgaW50IGNvcHNfaGFyZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsIAorCQkJICAgIHVuc2lnbmVkIGxlbikKK3sKKyAgICAgICAgaWYoY29wc19kZWJ1ZyA+PSAzKQorICAgICAgICAgICAgICAgIHByaW50aygiJXM6IGNvcHNfaGFyZF9oZWFkZXIgZXhlY3V0ZWQuIFdvdyFcbiIsIGRldi0+bmFtZSk7CisgICAgICAgIHJldHVybiAwOworfQorCisvKgorICogICAgICBTeXN0ZW0gaW9jdGxzIGZvciB0aGUgQ09QUyBMb2NhbFRhbGsgY2FyZC4KKyAqLworIAorc3RhdGljIGludCBjb3BzX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworICAgICAgICBzdHJ1Y3QgY29wc19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfYXQgKnNhID0gKHN0cnVjdCBzb2NrYWRkcl9hdCAqKSZpZnItPmlmcl9hZGRyOworICAgICAgICBzdHJ1Y3QgYXRhbGtfYWRkciAqYWEgPSAoc3RydWN0IGF0YWxrX2FkZHIgKikmbHAtPm5vZGVfYWRkcjsKKworICAgICAgICBzd2l0Y2goY21kKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBTSU9DU0lGQUREUjoKKwkJCS8qIEdldCBhbmQgc2V0IHRoZSBub2RlaWQgYW5kIG5ldHdvcmsgIyBhdGFsa2Qgd2FudHMuICovCisJCQljb3BzX25vZGVpZChkZXYsIHNhLT5zYXRfYWRkci5zX25vZGUpOworCQkJYWEtPnNfbmV0ICAgICAgICAgICAgICAgPSBzYS0+c2F0X2FkZHIuc19uZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBhYS0+c19ub2RlICAgICAgICAgICAgICA9IGxwLT5ub2RlX2FjcXVpcmU7CisKKwkJCS8qIFNldCBicm9hcmRjYXN0IGFkZHJlc3MuICovCisgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmJyb2FkY2FzdFswXSAgICAgICA9IDB4RkY7CisJCQkKKwkJCS8qIFNldCBoYXJkd2FyZSBhZGRyZXNzLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5kZXZfYWRkclswXSAgICAgICAgPSBhYS0+c19ub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5hZGRyX2xlbiAgICAgICAgICAgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNJT0NHSUZBRERSOgorICAgICAgICAgICAgICAgICAgICAgICAgc2EtPnNhdF9hZGRyLnNfbmV0ICAgICAgPSBhYS0+c19uZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzYS0+c2F0X2FkZHIuc19ub2RlICAgICA9IGFhLT5zX25vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgIH0KK30KKworLyoKKyAqCVRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gY29wc19vcGVuKCkuCisgKi8KKyAKK3N0YXRpYyBpbnQgY29wc19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjb3BzX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBJZiB3ZSB3ZXJlIHJ1bm5pbmcgcG9sbGVkLCB5YW5rIHRoZSB0aW1lci4KKwkgKi8KKwlpZihscC0+Ym9hcmQ9PVRBTkdFTlQgJiYgZGV2LT5pcnE9PTApCisJCWRlbF90aW1lcigmY29wc190aW1lcik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgIHJldHVybiAwOworfQorCisvKgorICogICAgICBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4KKyAqICAgICAgVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqY29wc19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGNvcHNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqY29wc19kZXY7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oYm9hcmRfdHlwZSwgaW50LCAwKTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaWYgKGlvID09IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBZb3Ugc2hvdWxkbid0IGF1dG9wcm9iZSB3aXRoIGluc21vZFxuIiwKKwkJCWNhcmRuYW1lKTsKKwljb3BzX2RldiA9IGNvcHNfcHJvYmUoLTEpOworCWlmIChJU19FUlIoY29wc19kZXYpKQorCQlyZXR1cm4gUFRSX0VSUihjb3BzX2Rldik7CisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYoY29wc19kZXYpOworCWNsZWFudXBfY2FyZChjb3BzX2Rldik7CisJZnJlZV9uZXRkZXYoY29wc19kZXYpOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFZFUlNJT05TIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMiAtYyBjb3BzLmMiCisgKiAgYy1iYXNpYy1vZmZzZXQ6IDQKKyAqICBjLWZpbGUtb2Zmc2V0czogKChzdWJzdGF0ZW1lbnQtb3BlbiAuIDApKQorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvY29wcy5oIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjhiYTljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHMuaApAQCAtMCwwICsxLDYwIEBACisvKiAgICAgIGNvcHMuaDogTG9jYWxUYWxrIGRyaXZlciBmb3IgTGludXguCisgKgorICogICAgICBBdXRob3JzOgorICogICAgICAtIEpheSBTY2h1bGlzdCA8anNjaGxzdEBzYW1iYS5vcmc+CisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0NPUFNMVEFMS19ICisjZGVmaW5lIF9fTElOVVhfQ09QU0xUQUxLX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyogTWF4IExMQVAgc2l6ZSB3ZSB3aWxsIGFjY2VwdC4gKi8KKyNkZWZpbmUgTUFYX0xMQVBfU0laRQkJNjAzCisKKy8qIFRhbmdlbnQgKi8KKyNkZWZpbmUgVEFOR19DQVJEX1NUQVRVUyAgICAgICAgMQorI2RlZmluZSBUQU5HX0NMRUFSX0lOVCAgICAgICAgICAxCisjZGVmaW5lIFRBTkdfUkVTRVQgICAgICAgICAgICAgIDMKKworI2RlZmluZSBUQU5HX1RYX1JFQURZICAgICAgICAgICAxCisjZGVmaW5lIFRBTkdfUlhfUkVBRFkgICAgICAgICAgIDIKKworLyogRGF5bmEgKi8KKyNkZWZpbmUgREFZTkFfQ01EX0RBVEEgICAgICAgICAgMAorI2RlZmluZSBEQVlOQV9DTEVBUl9JTlQgICAgICAgICAxCisjZGVmaW5lIERBWU5BX0NBUkRfU1RBVFVTICAgICAgIDIKKyNkZWZpbmUgREFZTkFfSU5UX0NBUkQgICAgICAgICAgMworI2RlZmluZSBEQVlOQV9SRVNFVCAgICAgICAgICAgICA0CisKKyNkZWZpbmUgREFZTkFfUlhfUkVBRFkgICAgICAgICAgMAorI2RlZmluZSBEQVlOQV9UWF9SRUFEWSAgICAgICAgICAxCisjZGVmaW5lIERBWU5BX1JYX1JFUVVFU1QgICAgICAgIDMKKworLyogU2FtZSBvbiBib3RoIGNhcmQgdHlwZXMgKi8KKyNkZWZpbmUgQ09QU19DTEVBUl9JTlQgIDEKKworLyogTEFQIHJlc3BvbnNlIGNvZGVzIHJlY2VpdmVkIGZyb20gdGhlIGNhcmRzLiAqLworI2RlZmluZSBMQVBfSU5JVCAgICAgICAgMSAgICAgICAvKiBJbml0IGNtZCAqLworI2RlZmluZSBMQVBfSU5JVF9SU1AgICAgMiAgICAgICAvKiBJbml0IHJlc3BvbnNlICovCisjZGVmaW5lIExBUF9XUklURSAgICAgICAzICAgICAgIC8qIFdyaXRlIGNtZCAqLworI2RlZmluZSBEQVRBX1JFQUQgICAgICAgNCAgICAgICAvKiBEYXRhIHJlYWQgKi8KKyNkZWZpbmUgTEFQX1JFU1BPTlNFICAgIDQgICAgICAgLyogUmVjZWl2ZWQgQUxBUCBmcmFtZSByZXNwb25zZSAqLworI2RlZmluZSBMQVBfR0VUU1RBVCAgICAgNSAgICAgICAvKiBHZXQgTEFQIGFuZCBIVyBzdGF0dXMgKi8KKyNkZWZpbmUgTEFQX1JTUFNUQVQgICAgIDYgICAgICAgLyogU3RhdHVzIHJlc3BvbnNlICovCisKKyNlbmRpZgorCisvKgorICoJU3RydWN0dXJlIHRvIGhvbGQgdGhlIGZpcm13YXJlIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3QgbHRmaXJtd2FyZQoreworICAgICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworICAgICAgICB1bnNpZ25lZCBjaGFyICogZGF0YTsKK307CisKKyNkZWZpbmUgREFZTkEgMQorI2RlZmluZSBUQU5HRU5UIDIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvY29wc19mZmRydi5oIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHNfZmZkcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTMxYjRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHNfZmZkcnYuaApAQCAtMCwwICsxLDUzMyBAQAorCisvKgorICoJVGhlIGZpcm13YXJlIHRoaXMgZHJpdmVyIGRvd25sb2FkcyBpbnRvIHRoZSBMb2NhbHRhbGsgY2FyZCBpcyBhCisgKglzZXBhcmF0ZSBwcm9ncmFtIGFuZCBpcyBub3QgR1BMJ2Qgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoZSBMaW51eAorICoJc2lkZSBkcml2ZXIgYW5kIHRoZSByb3V0aW5lIHRoYXQgbG9hZHMgdGhpcyBkYXRhIGludG8gdGhlIGNhcmQgYXJlLgorICoJCisgKglJdCBpcyB0YWtlbiBmcm9tIHRoZSBDT1BTIFNESyBhbmQgaXMgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlCisgKgorICoJVGhpcyBtYXRlcmlhbCBpcyBsaWNlbnNlZCB0byB5b3Ugc3RyaWN0bHkgZm9yIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoCisgKgl0aGUgdXNlIG9mIENPUFMgTG9jYWxUYWxrIGFkYXB0ZXJzLgorICoJVGhlcmUgaXMgbm8gY2hhcmdlIGZvciB0aGlzIFNESy4gQW5kIG5vIHdhcmFudHkgZXhwcmVzcyBvciBpbXBsaWVkCisgKglhYm91dCBpdHMgZml0bmVzcyBmb3IgYW55IHB1cnBvc2UuIEhvd2V2ZXIsIHdlIHdpbGwgY2hlZXJlZnVsbHkKKyAqCXJlZnVuZCBldmVyeSBwZW5ueSB5b3UgcGFpZCBmb3IgdGhpcyBTREsuLi4KKyAqCVJlZ2FyZHMsCisgKgorICoJVGhvbWFzIEYuIERpdmluZQorICoJQ2hpZWYgU2NpZW50aXN0CisgKi8KKworCisvKiAgICAgIGNvcHNfZmZkcnYuaDogTG9jYWxUYWxrIGRyaXZlciBmaXJtd2FyZSBkdW1wIGZvciBMaW51eC4KKyAqCisgKiAgICAgIEF1dGhvcnM6CisgKiAgICAgIC0gSmF5IFNjaHVsaXN0IDxqc2NobHN0QHNhbWJhLm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfQ09QU19EQVlOQQorCit1bnNpZ25lZCBjaGFyIGZmZHJ2X2NvZGVbXSA9IHsKKwk1OCwzLDAsNTAsMjI4LDE0OSwzMywyNTUsMjU1LDM0LDIyNiwxNDksCisJMjQ5LDE3LDQwLDE1MiwzMywyMDIsMTU0LDE4MywyMzcsODIsNzcsNjgsCisJMTEsMTA3LDk4LDE5LDU0LDAsMjM3LDE3NiwxNzUsNTAsODAsMCwKKwk2MiwxMjgsMjM3LDcxLDYyLDMyLDIzNyw1Nyw1MSw2MiwxMiwyMzcsCisJNTcsNTAsMjM3LDU3LDU0LDYyLDYsMjM3LDU3LDUyLDYyLDEyLAorCTIzNyw1Nyw0OSwzMywxMDcsMTM3LDM0LDMyLDEyOCwzMyw4MywxMzAsCisJMzQsNDAsMTI4LDMzLDg2LDEzMCwzNCw0MiwxMjgsMzMsMTEyLDEzMCwKKwkzNCwzNiwxMjgsMzMsMjExLDEzMCwzNCwzOCwxMjgsNjIsMCwyMzcsCisJNTcsMTYsMzMsNjMsMTQ4LDM0LDM0LDEyOCwyMzcsOTQsMjA1LDE1LAorCTEzMCwyNTEsMjA1LDE2OCwxNDUsMjQsMTQxLDY3LDExMSwxMTIsMTIxLDExNCwKKwkxMDUsMTAzLDEwNCwxMTYsMzIsNDAsNjcsNDEsMzIsNDksNTcsNTYsCisJNTYsMzIsNDUsMzIsNjgsOTcsMTIxLDExMCw5NywzMiw2NywxMTEsCisJMTA5LDEwOSwxMTcsMTEwLDEwNSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LAorCTMyLDMyLDMyLDY1LDEwOCwxMDgsMzIsMTE0LDEwNSwxMDMsMTA0LDExNiwKKwkxMTUsMzIsMTE0LDEwMSwxMTUsMTAxLDExNCwxMTgsMTAxLDEwMCw0NiwzMiwKKwkzMiw0MCw2OCw0MCw2OCw3LDE2LDgsMzQsNywyMiw2LAorCTE2LDUsMTIsNCw4LDMsNiwxNDAsMCwxNiwzOSwxMjgsCisJMCw0LDk2LDEwLDIyNCw2LDAsNywxMjYsMiw2NCwxMSwKKwkxMTgsMTIsNiwxMywwLDE0LDE5MywxNSwwLDUsOTYsMywKKwkxOTIsMSw2NCw5LDgsNjIsOSwyMTEsNjYsNjIsMTkyLDIxMSwKKwk2Niw2MiwxMDAsNjEsMzIsMjUzLDYsMjgsMzMsMjA1LDEyOSwxNCwKKwk2NiwyMzcsMTYzLDE5NCwyNTMsMTI5LDYsMjgsMzMsMjA1LDEyOSwxNCwKKwk2NCwyMzcsMTYzLDE5NCw5LDEzMCwyMDEsNjIsNDcsNTAsNzEsMTUyLAorCTYyLDQ3LDIxMSw2OCw1OCwyMDMsMTI5LDIzNyw1NywyMCw1OCwyMDQsCisJMTI5LDIzNyw1NywyMSwzMyw3NywxNTIsNTQsMTMyLDIwNSwyMzMsMTI5LAorCTU4LDIyOCwxNDksMjU0LDIwOSw0MCw2LDU2LDQsNjIsMCwyNCwKKwkyLDIxOSw5NiwzMywyMzMsMTQ5LDExOSwyMzAsNjIsMzMsMjMyLDE0OSwKKwkxMTksMjEzLDMzLDgsMTUyLDE3LDcsMCwyNSwxMTksMTksMjUsCisJMTE5LDIwOSwyMDEsMjUxLDIzNyw3NywyNDUsMTk3LDIxMywyMjksMjIxLDIyOSwKKwkyMDUsMjMzLDEyOSw2MiwxLDUwLDEwNiwxMzcsMjA1LDE1OCwxMzksMjIxLAorCTIyNSwyMjUsMjA5LDE5MywyNDEsMjUxLDIzNyw3NywyNDUsMTk3LDIxMywyMTksCisJNzIsMjM3LDU2LDE2LDIzMCw0NiwyMzcsNTcsMTYsMjM3LDU2LDEyLAorCTU4LDcyLDE1MiwxODMsMzIsMjYsNiwyMCwxNywxMjgsMiwyMzcsCisJNTYsNDYsMTg3LDMyLDM1LDIzNyw1Niw0NywxODYsMzIsMjksMjE5LAorCTcyLDIzMCwxLDMyLDMsNSwzMiwyMzIsMTc1LDUwLDcyLDE1MiwKKwkyMjksMjIxLDIyOSw2MiwxLDUwLDEwNiwxMzcsMjA1LDE1OCwxMzksMjIxLAorCTIyNSwyMjUsMjQsMjUsNjIsMSw1MCw3MiwxNTIsNTgsMjAxLDEyOSwKKwkyMzcsNTcsMTIsNTgsMjAyLDEyOSwyMzcsNTcsMTMsMjM3LDU2LDE2LAorCTI0NiwxNywyMzcsNTcsMTYsMjA5LDE5MywyNDEsMjUxLDIzNyw3NywyNDUsCisJMTk3LDIyOSwyMTMsMjIxLDIyOSwyMzcsNTYsMTYsMjMwLDE3LDIzNyw1NywKKwkxNiwyMzcsNTYsMjAsNTgsMzQsMTUyLDI0NiwxNiwyNDYsOCwyMTEsCisJNjgsNjIsNiw2MSwzMiwyNTMsNTgsMzQsMTUyLDI0Niw4LDIxMSwKKwk2OCw1OCwyMDMsMTI5LDIzNyw1NywyMCw1OCwyMDQsMTI5LDIzNyw1NywKKwkyMSwyMzcsNTYsMTYsMjQ2LDM0LDIzNyw1NywxNiwyMjEsMjI1LDIwOSwKKwkyMjUsMTkzLDI0MSwyNTEsMjM3LDc3LDMzLDIsMCw1NywxMjYsMjMwLAorCTMsMjM3LDEwMCwxLDQwLDIsMjQ2LDEyOCwyMzAsMTMwLDI0NSw2MiwKKwk1LDIxMSw2NCwyNDEsMjExLDY0LDIwMSwyMjksMjEzLDI0MywyMzcsNTYsCisJMTYsMjMwLDQ2LDIzNyw1NywxNiwyMzcsNTYsMTIsMjUxLDcwLDM1LAorCTM1LDEyNiwyNTQsMTc1LDIwMiw3NywxMzMsMjU0LDEyOSwyMDIsMTUsMTMzLAorCTIzMCwxMjgsMTk0LDE5MSwxMzIsNDMsNTgsNDQsMTUyLDExOSwzMyw3NiwKKwkxNTIsMTE5LDM1LDYyLDEzMiwxMTksMTIwLDI1NCwyNTUsNDAsNCw1OCwKKwk0OSwxNTIsMTE5LDIxOSw3Miw0Myw0MywxMTIsMTcsMywwLDIzNywKKwk1Niw1MiwyMzAsMjQ4LDIzNyw1Nyw1MiwyMTksNzIsMjMwLDEsMTk0LAorCTE0MSwxMzEsMjA5LDIyNSwyMzcsNTYsNTIsMjQ2LDYsMjM3LDU3LDUyLAorCTYyLDEsNTUsMjUxLDIwMSw2MiwzLDIxMSw2Niw2MiwxOTIsMjExLAorCTY2LDYyLDQ4LDIxMSw2NiwwLDAsMjE5LDY2LDIzMCwxLDQwLAorCTQsMjE5LDY3LDI0LDI0MCwyMDUsMjAzLDEzNSw1OCw3NSwxNTIsMjU0LAorCTI1NSwyMDIsMTI4LDEzMiw1OCw0OSwxNTIsMjU0LDE2MSwyNTAsMjA3LDEzMSwKKwk1OCwzNCwxNTIsMjExLDY4LDYyLDEwLDIxMSw2Niw2MiwxMjgsMjExLAorCTY2LDYyLDExLDIxMSw2Niw2Miw2LDIxMSw2NiwyNCwwLDYyLAorCTE0LDIxMSw2Niw2MiwzMywyMTEsNjYsNjIsMSwyMTEsNjYsNjIsCisJNjQsMjExLDY2LDYyLDMsMjExLDY2LDYyLDIwOSwyMTEsNjYsNjIsCisJMTAwLDcxLDIxOSw2NiwyMzAsMSwzMiw2LDUsMzIsMjQ3LDE5NSwKKwkyNDgsMTMyLDIxOSw2Nyw3MSw1OCw0NCwxNTIsMTg0LDE5NCwyNDgsMTMyLAorCTYyLDEwMCw3MSwyMTksNjYsMjMwLDEsMzIsNiw1LDMyLDI0NywKKwkxOTUsMjQ4LDEzMiwyMTksNjcsNjIsMTAwLDcxLDIxOSw2NiwyMzAsMSwKKwkzMiw2LDUsMzIsMjQ3LDE5NSwyNDgsMTMyLDIxOSw2NywyNTQsMTMzLAorCTMyLDcsNjIsMCw1MCw3NCwxNTIsMjQsMTcsMjU0LDE3MywzMiwKKwk3LDYyLDEsNTAsNzQsMTUyLDI0LDYsMjU0LDE0MSwxOTQsMjQ4LAorCTEzMiw3MSwyMDksMjI1LDU4LDQ5LDE1MiwyNTQsMTMyLDMyLDEwLDYyLAorCTUwLDIwNSwyLDEzNCwyMDUsMTQ0LDEzNSwyNCwyNywyNTQsMTQwLDMyLAorCTE1LDYyLDExMCwyMDUsMiwxMzQsNjIsMTQxLDE4NCwzMiw1LDIwNSwKKwkxNDQsMTM1LDI0LDgsNjIsMTAsMjA1LDIsMTM0LDIwNSw4LDEzNCwKKwk2MiwxLDUwLDEwNiwxMzcsMjA1LDE1OCwxMzksMjM3LDU2LDUyLDI0NiwKKwk2LDIzNyw1Nyw1MiwxNzUsMTgzLDI1MSwyMDEsNjIsMjAsMTM1LDIzNywKKwk1NywyMCwxNzUsMjM3LDU3LDIxLDIzNyw1NiwxNiwyNDYsMiwyMzcsCisJNTcsMTYsMjM3LDU2LDIwLDk1LDIzNyw1NiwyMSwxMjMsMjU0LDEwLAorCTQ4LDI0NCwyMzcsNTYsMTYsMjMwLDE3LDIzNyw1NywxNiwyMDksMjI1LAorCTIwNSwxNDQsMTM1LDYyLDEsNTAsMTA2LDEzNywyMDUsMTU4LDEzOSwyMzcsCisJNTYsNTIsMjQ2LDYsMjM3LDU3LDUyLDE3NSwxODMsMjUxLDIwMSwyMDksCisJMjI1LDI0MywyMTksNzIsMjMwLDEsNDAsMTMsNjIsMTAsMjExLDY2LAorCTAsMCwyMTksNjYsMjMwLDE5MiwyMDIsMjI2LDEzMiwyMzcsNTYsNTIsCisJMjQ2LDYsMjM3LDU3LDUyLDYyLDEsNTUsMjUxLDIwMSwyMDUsMjAzLAorCTEzNSw2MiwxLDUwLDEwNiwxMzcsMjA1LDE1OCwxMzksMjM3LDU2LDUyLAorCTI0Niw2LDIzNyw1Nyw1MiwxODMsMjUxLDIwMSwyMDksMjI1LDYyLDEsCisJNTAsMTA2LDEzNywyMDUsMTU4LDEzOSwyMzcsNTYsNTIsMjQ2LDYsMjM3LAorCTU3LDUyLDYyLDIsNTUsMjUxLDIwMSwyMDksMjI1LDI0MywyMTksNzIsCisJMjMwLDEsMjAyLDIxMywxMzIsNjIsMTAsMjExLDY2LDAsMCwyMTksCisJNjYsMjMwLDE5MiwxOTQsMjEzLDEzMiwyMjksNjIsMSw1MCwxMDYsMTM3LAorCTQyLDQwLDE1MiwyMDUsNjUsMTQzLDIyNSwxNywzLDAsMjA1LDExMSwKKwkxMzYsNjIsNiwyMTEsNjYsNTgsNDQsMTUyLDIxMSw2NiwyMzcsNTYsCisJNTIsMjQ2LDYsMjM3LDU3LDUyLDE4MywyNTEsMjAxLDIwOSwxOTcsMjM3LAorCTU2LDUyLDIzMCwyNDgsMjM3LDU3LDUyLDIxOSw3MiwyMzAsMSwzMiwKKwkxNSwxOTMsMjI1LDIzNyw1Niw1MiwyNDYsNiwyMzcsNTcsNTIsNjIsCisJMSw1NSwyNTEsMjAxLDE0LDIzLDU4LDM3LDE1MiwyNTQsMCw0MCwKKwkxNCwxNCwyLDI1NCwxLDMyLDUsNjIsMTQwLDExOSwyNCwzLAorCTYyLDEzMiwxMTksNDMsNDMsMTk3LDIwNSwyMDMsMTM1LDE5Myw2MiwxLAorCTIxMSw2Niw2Miw2NCwyMTEsNjYsNjIsMywyMTEsNjYsNjIsMTkzLAorCTIxMSw2Niw2MiwxMDAsMjAzLDM5LDcxLDIxOSw2NiwyMzAsMSwzMiwKKwk2LDUsMzIsMjQ3LDE5NSwyMjksMTMzLDMzLDIzOCwxNTEsMjE5LDY3LAorCTcxLDU4LDQ0LDE1MiwxODQsMTk0LDIyOSwxMzMsMTE5LDYyLDEwMCw3MSwKKwkyMTksNjYsMjMwLDEsMzIsNiw1LDMyLDI0NywxOTUsMjI5LDEzMywKKwkyMTksNjcsMzUsMTE5LDEzLDMyLDIzNCwxOTMsMjI1LDYyLDEsNTAsCisJMTA2LDEzNywyMDUsMTU4LDEzOSwyMzcsNTYsNTIsMjQ2LDYsMjM3LDU3LAorCTUyLDE3NSwxODMsMjUxLDIwMSwzMywyMzQsMTUxLDM1LDM1LDYyLDI1NSwKKwkxMTksMTkzLDIyNSw2MiwxLDUwLDEwNiwxMzcsMjA1LDE1OCwxMzksMjM3LAorCTU2LDUyLDI0Niw2LDIzNyw1Nyw1MiwxNzUsMjUxLDIwMSwyNDMsNjEsCisJMzIsMjUzLDI1MSwyMDEsNjIsMywyMTEsNjYsNjIsMTkyLDIxMSw2NiwKKwk1OCw0OSwxNTIsMjU0LDE0MCwzMiwxOSwxOTcsMjI5LDIxMywxNywxODEsCisJMTI5LDMzLDE4NSwxMjksMSwyLDAsMjM3LDE3NiwyMDksMjI1LDE5MywKKwkyNCwyNywyMjksMjEzLDMzLDE4NywxMjksNTgsNDksMTUyLDIzMCwxNSwKKwk4NywzMCwyLDIzNyw5MiwyNSwxNywxODEsMTI5LDEyNiwxOCwxOSwKKwkzNSwxMjYsMTgsMjA5LDIyNSw1OCwzNCwxNTIsMjQ2LDgsMjExLDY4LAorCTU4LDQ5LDE1MiwyNTQsMTY1LDQwLDE0LDI1NCwxNjQsNDAsMTAsNjIsCisJMTAsMjExLDY2LDYyLDIyNCwyMTEsNjYsMjQsMjUsNTgsNzQsMTUyLAorCTI1NCwwLDQwLDEwLDYyLDEwLDIxMSw2Niw2MiwxNjAsMjExLDY2LAorCTI0LDgsNjIsMTAsMjExLDY2LDYyLDEyOCwyMTEsNjYsNjIsMTEsCisJMjExLDY2LDYyLDYsMjExLDY2LDIwNSwxNDcsMTQzLDYyLDUsMjExLAorCTY2LDYyLDIyNCwyMTEsNjYsNjIsNSwyMTEsNjYsNjIsOTYsMjExLAorCTY2LDYyLDUsNjEsMzIsMjUzLDYyLDUsMjExLDY2LDYyLDIyNCwKKwkyMTEsNjYsNjIsMTQsNjEsMzIsMjUzLDYyLDUsMjExLDY2LDYyLAorCTIzMywyMTEsNjYsNjIsMTI4LDIxMSw2Niw1OCwxODEsMTI5LDYxLDMyLAorCTI1Myw2MiwxLDIxMSw2Niw2MiwxOTIsMjExLDY2LDEsMjU0LDE5LAorCTIzNyw1Niw0NiwxODcsMzIsNiwxMywzMiwyNDcsMTk1LDIyNiwxMzQsCisJNjIsMTkyLDIxMSw2NiwwLDAsMjE5LDY2LDIwMywxMTksNDAsMjUwLAorCTIxOSw2NiwyMDMsODcsNDAsMjUwLDI0MywyMzcsNTYsMTYsMjMwLDE3LAorCTIzNyw1NywxNiwyMzcsNTYsMjAsMjUxLDYyLDUsMjExLDY2LDYyLAorCTIyNCwyMTEsNjYsNTgsMTgyLDEyOSw2MSwzMiwyNTMsMjI5LDMzLDE4MSwKKwkxMjksNTgsMTgzLDEyOSwyMDMsNjMsMTE5LDM1LDU4LDE4NCwxMjksMTE5LAorCTIyNSw2MiwxMCwyMTEsNjYsNjIsMjI0LDIxMSw2Niw2MiwxMSwyMTEsCisJNjYsNjIsMTE4LDIxMSw2Niw2Miw0NywyMTEsNjgsNjIsNSwyMTEsCisJNjYsNjIsMjMzLDIxMSw2Niw1OCwxODEsMTI5LDYxLDMyLDI1Myw2MiwKKwk1LDIxMSw2Niw2MiwyMjQsMjExLDY2LDU4LDE4MiwxMjksNjEsMzIsCisJMjUzLDYyLDUsMjExLDY2LDYyLDk2LDIxMSw2NiwyMDEsMjI5LDIxMywKKwk1OCw1MCwxNTIsMjMwLDE1LDg3LDMwLDIsMjM3LDkyLDMzLDE4NywKKwkxMjksMjUsMTcsMTgxLDEyOSwxMjYsMTgsMzUsMTksMTI2LDE4LDIwOSwKKwkyMjUsNTgsNzEsMTUyLDI0Niw4LDIxMSw2OCw1OCw1MCwxNTIsMjU0LAorCTE2NSw0MCwxNCwyNTQsMTY0LDQwLDEwLDYyLDEwLDIxMSw2Niw2MiwKKwkyMjQsMjExLDY2LDI0LDgsNjIsMTAsMjExLDY2LDYyLDEyOCwyMTEsCisJNjYsNjIsMTEsMjExLDY2LDYyLDYsMjExLDY2LDE5NSwyNDgsMTM1LAorCTYyLDMsMjExLDY2LDYyLDE5MiwyMTEsNjYsMTk3LDIyOSwyMTMsMTcsCisJMTgxLDEyOSwzMywxODMsMTI5LDEsMiwwLDIzNywxNzYsMjA5LDIyNSwKKwkxOTMsNjIsNDcsMjExLDY4LDYyLDEwLDIxMSw2Niw2MiwyMjQsMjExLAorCTY2LDYyLDExLDIxMSw2Niw2MiwxMTgsMjExLDY2LDYyLDEsMjExLAorCTY2LDYyLDAsMjExLDY2LDIwNSwxNDcsMTQzLDE5NSwxNiwxMzYsNjIsCisJMywyMTEsNjYsNjIsMTkyLDIxMSw2NiwxOTcsMjI5LDIxMywxNywxODEsCisJMTI5LDMzLDE4MywxMjksMSwyLDAsMjM3LDE3NiwyMDksMjI1LDE5MywKKwk2Miw0NywyMTEsNjgsNjIsMTAsMjExLDY2LDYyLDIyNCwyMTEsNjYsCisJNjIsMTEsMjExLDY2LDYyLDExOCwyMTEsNjYsMjA1LDE0NywxNDMsNjIsCisJNSwyMTEsNjYsNjIsMjI0LDIxMSw2Niw2Miw1LDIxMSw2Niw2MiwKKwk5NiwyMTEsNjYsNjIsNSw2MSwzMiwyNTMsNjIsNSwyMTEsNjYsCisJNjIsMjI0LDIxMSw2Niw2MiwxNCw2MSwzMiwyNTMsNjIsNSwyMTEsCisJNjYsNjIsMjMzLDIxMSw2Niw2MiwxMjgsMjExLDY2LDU4LDE4MSwxMjksCisJNjEsMzIsMjUzLDYyLDEsMjExLDY2LDYyLDE5MiwyMTEsNjYsMSwKKwkyNTQsMTksMjM3LDU2LDQ2LDE4NywzMiw2LDEzLDMyLDI0NywxOTUsCisJODgsMTM2LDYyLDE5MiwyMTEsNjYsMCwwLDIxOSw2NiwyMDMsMTE5LAorCTQwLDI1MCwyMTksNjYsMjAzLDg3LDQwLDI1MCw2Miw1LDIxMSw2NiwKKwk2MiwyMjQsMjExLDY2LDU4LDE4MiwxMjksNjEsMzIsMjUzLDYyLDUsCisJMjExLDY2LDYyLDk2LDIxMSw2NiwyMDEsMTk3LDE0LDY3LDYsMCwKKwk2MiwzLDIxMSw2Niw2MiwxOTIsMjExLDY2LDYyLDQ4LDIxMSw2NiwKKwkwLDAsMjE5LDY2LDIzMCwxLDQwLDQsMjE5LDY3LDI0LDI0MCwKKwk2Miw1LDIxMSw2Niw2MiwyMzMsMjExLDY2LDYyLDEyOCwyMTEsNjYsCisJNTgsMTgxLDEyOSw2MSwzMiwyNTMsMjM3LDE2MywyOSw2MiwxOTIsMjExLAorCTY2LDIxOSw2NiwyMzAsNCw0MCwyNTAsMjM3LDE2MywyOSwzMiwyNDUsCisJMjE5LDY2LDIzMCw0LDQwLDI1MCw2MiwyNTUsNzEsMjE5LDY2LDIzMCwKKwk0LDQwLDMsNSwzMiwyNDcsMjE5LDY2LDIzMCw0LDQwLDI1MCwKKwk2Miw1LDIxMSw2Niw2MiwyMjQsMjExLDY2LDU4LDE4MiwxMjksNjEsCisJMzIsMjUzLDYyLDUsMjExLDY2LDYyLDk2LDIxMSw2Niw1OCw3MSwKKwkxNTIsMjU0LDEsMjAyLDE4LDEzNyw2MiwxNiwyMTEsNjYsNjIsNTYsCisJMjExLDY2LDYyLDE0LDIxMSw2Niw2MiwzMywyMTEsNjYsNjIsMSwKKwkyMTEsNjYsNjIsMjQ4LDIxMSw2NiwyMzcsNTYsNDgsMjQ2LDE1MywyMzAsCisJMjA3LDIzNyw1Nyw0OCw2MiwzLDIxMSw2Niw2MiwyMjEsMjExLDY2LAorCTE5MywyMDEsNTgsNzEsMTUyLDIxMSw2OCw2MiwxMCwyMTEsNjYsNjIsCisJMTI4LDIxMSw2Niw2MiwxMSwyMTEsNjYsNjIsNiwyMTEsNjYsNjIsCisJNiwyMTEsNjYsNTgsNDQsMTUyLDIxMSw2Niw2MiwxNiwyMTEsNjYsCisJNjIsNTYsMjExLDY2LDYyLDQ4LDIxMSw2NiwwLDAsNjIsMTQsCisJMjExLDY2LDYyLDMzLDIxMSw2Niw2MiwxLDIxMSw2Niw2MiwyNDgsCisJMjExLDY2LDIzNyw1Niw0OCwyNDYsMTQ1LDI0Niw4LDIzMCwyMDcsMjM3LAorCTU3LDQ4LDYyLDMsMjExLDY2LDYyLDIyMSwyMTEsNjYsMTkzLDIwMSwKKwk0NCwzLDEsMCw3MCw2OSwxLDI0NSwxOTcsMjEzLDIyOSwxNzUsCisJNTAsNzIsMTUyLDIzNyw1NiwxNiwyMzAsNDYsMjM3LDU3LDE2LDIzNywKKwk1NiwxMiw2MiwxLDIxMSw2NiwwLDAsMjE5LDY2LDk1LDIzMCwKKwkxNjAsMzIsMywxOTUsMjAsMTM5LDEyMywyMzAsOTYsMTk0LDcyLDEzOSwKKwk2Miw0OCwyMTEsNjYsNjIsMSwyMTEsNjYsNjIsNjQsMjExLDY2LAorCTIzNyw5MSw0MCwxNTIsMjA1LDIwNywxNDMsMjUsNDMsNTUsMjM3LDgyLAorCTIxOCw3MCwxMzksMzQsNDIsMTUyLDk4LDEwNyw1OCw0NCwxNTIsMTkwLAorCTE5NCwyMTAsMTM4LDM1LDM1LDYyLDEzMCwxOTAsMTk0LDIwMCwxMzcsNjIsCisJMSw1MCw0OCwxNTIsNjIsMTc1LDE5MCwyMDIsODIsMTM5LDYyLDEzMiwKKwkxOTAsMzIsNDQsNTAsNTAsMTUyLDYyLDQ3LDUwLDcxLDE1MiwyMjksCisJMTc1LDUwLDEwNiwxMzcsNDIsNDAsMTUyLDIwNSw2NSwxNDMsMjI1LDU0LAorCTEzMyw0Myw3MCw1OCw0NCwxNTIsMTE5LDQzLDExMiwxNywzLDAsCisJNjIsMTAsMjA1LDIsMTM0LDIwNSwxMTEsMTM2LDE5NSwxNTgsMTM4LDYyLAorCTE0MCwxOTAsMzIsMTksNTAsNTAsMTUyLDU4LDIzMywxNDksMjMwLDQsCisJMjAyLDIyMiwxMzgsNjIsMSw1MCw3MSwxNTIsMTk1LDIxOSwxMzcsMTI2LAorCTI1NCwxNjAsMjUwLDE4NSwxMzgsMjU0LDE2NiwyNDIsMTg1LDEzOCw1MCw1MCwKKwkxNTIsNDMsMTI2LDM1LDIyOSwyMTMsMzMsMjM0LDE0OSw5NSwyMiwwLAorCTI1LDEyNiwyNTQsMTMyLDQwLDE4LDI1NCwxNDAsNDAsMTQsNTgsNTAsCisJMTUyLDIzMCwxNSw4NywxMjYsMzEsMjEsMjQyLDY1LDEzOCw1NiwyLAorCTE3NSwxMTksNTgsNTAsMTUyLDIzMCwxNSw4Nyw1OCwyMzMsMTQ5LDIzMCwKKwk2MiwzMSwyMSwyNDIsODUsMTM4LDIxOCw5OCwxMzgsMjA5LDIyNSwxOTUsCisJMjAsMTM5LDU4LDUwLDE1MiwzMywxMDAsMTM3LDIzMCwxNSw5NSwyMiwKKwkwLDI1LDEyNiw1MCw3MSwxNTIsMjA5LDIyNSw1OCw1MCwxNTIsMjU0LAorCTE2NCwyNTAsMTM1LDEzOCw1OCw3MywxNTIsMjU0LDAsNDAsNCw1NCwKKwkxNzMsMjQsMiw1NCwxMzMsNDMsNzAsNTgsNDQsMTUyLDExOSw0MywKKwkxMTIsMTcsMywwLDIwNSw3MCwxMzUsMTc1LDUwLDEwNiwxMzcsMjA1LAorCTIwOCwxMzksNTgsMTk5LDEyOSwyMzcsNTcsMTIsNTgsMjAwLDEyOSwyMzcsCisJNTcsMTMsMjM3LDU2LDE2LDI0NiwxNywyMzcsNTcsMTYsMjI1LDIwOSwKKwkxOTMsMjQxLDI1MSwyMzcsNzcsNjIsMTI5LDE5MCwxOTQsMjI3LDEzOCw1NCwKKwkxMzAsNDMsNzAsNTgsNDQsMTUyLDExOSw0MywxMTIsMTcsMywwLAorCTIwNSwxNDQsMTM1LDE5NSwyMCwxMzksMzUsMzUsMTI2LDI1NCwxMzIsMTk0LAorCTIyNywxMzgsMTc1LDUwLDEwNiwxMzcsMjA1LDE1OCwxMzksMjQsNDIsNTgsCisJMjAxLDE1NCwyNTQsMSw0MCw3LDYyLDEsNTAsMTA2LDEzNywyNCwKKwkyMzcsNTgsMTA2LDEzNywyNTQsMSwyMDIsMjIyLDEzOCw2MiwxMjgsMTY2LAorCTE5NCwyMjIsMTM4LDIyMSwyMjksMjIxLDMzLDY3LDE1MiwyMDUsMTI3LDE0MiwKKwkyMDUsMTA5LDE0NCwyMjEsMjI1LDIyNSwyMDksMTkzLDI0MSwyNTEsMjM3LDc3LAorCTU4LDEwNiwxMzcsMjU0LDEsMjAyLDQ0LDEzOSw1OCw1MCwxNTIsMjU0LAorCTE2NCwyNTAsNDQsMTM5LDU4LDczLDE1MiwyMzgsMSw1MCw3MywxNTIsCisJMjIxLDIyOSwyMjEsMzMsNTEsMTUyLDIwNSwxMjcsMTQyLDIyMSwyMjUsNjIsCisJMSw1MCwxMDYsMTM3LDIwNSwxNTgsMTM5LDE5NSwxMywxMzksMjQsMjA4LAorCTI0LDIwNiwyNCwyMDQsMjMwLDY0LDQwLDMsMTk1LDIwLDEzOSwxOTUsCisJMjAsMTM5LDQzLDEyNiwzMyw4LDE1MiwxMTksMzUsNTgsNDQsMTUyLAorCTExOSw0MywyMzcsOTEsMzUsMTUyLDIwNSwyMDMsMTM1LDIwNSwxNTgsMTM5LAorCTE5NSwxMywxMzksMTc1LDUwLDc4LDE1Miw2MiwzLDIxMSw2Niw2MiwKKwkxOTIsMjExLDY2LDIwMSwxOTcsMzMsNCwwLDU3LDEyNiwzNSwxMDIsCisJMTExLDYyLDEsNTAsMTA2LDEzNywyMTksNzIsMjA1LDE0MSwxMzksMTkzLAorCTIwMSw2MiwxLDUwLDc4LDE1MiwzNCw0MCwxNTIsNTQsMCwzNSwKKwkzNSw1NCwwLDE5NSwxNjMsMTM5LDU4LDc4LDE1MiwxODMsMjAwLDIyOSwKKwkzMywxODEsMTI5LDU4LDE4MywxMjksMTE5LDM1LDU4LDE4NCwxMjksMTE5LAorCTIyNSw2Miw0NywyMTEsNjgsNjIsMTQsMjExLDY2LDYyLDE5MywyMTEsCisJNjYsNjIsMTAsMjExLDY2LDYyLDIyNCwyMTEsNjYsNjIsMTEsMjExLAorCTY2LDYyLDExOCwyMTEsNjYsMTk1LDMsMTQwLDU4LDc4LDE1MiwxODMsCisJMjAwLDU4LDcxLDE1MiwyMTEsNjgsMjU0LDY5LDQwLDQsMjU0LDcwLAorCTMyLDE3LDU4LDczLDE1MiwyNTQsMCw0MCwxMCw2MiwxMCwyMTEsCisJNjYsNjIsMTYwLDIxMSw2NiwyNCw4LDYyLDEwLDIxMSw2Niw2MiwKKwkxMjgsMjExLDY2LDYyLDExLDIxMSw2Niw2Miw2LDIxMSw2Niw2MiwKKwk2LDIxMSw2Niw1OCw0NCwxNTIsMjExLDY2LDYyLDE2LDIxMSw2NiwKKwk2Miw1NiwyMTEsNjYsNjIsNDgsMjExLDY2LDAsMCwyMTksNjYsCisJMjMwLDEsNDAsNCwyMTksNjcsMjQsMjQwLDYyLDE0LDIxMSw2NiwKKwk2MiwzMywyMTEsNjYsNDIsNDAsMTUyLDIwNSw2NSwxNDMsNjIsMSwKKwkyMTEsNjYsNjIsMjQ4LDIxMSw2NiwyMzcsNTYsNDgsMjQ2LDE0NSwyNDYsCisJOCwyMzAsMjA3LDIzNyw1Nyw0OCw2MiwzLDIxMSw2Niw2MiwyMjEsCisJMjExLDY2LDIwMSw2MiwxNiwyMTEsNjYsNjIsNTYsMjExLDY2LDYyLAorCTQ4LDIxMSw2NiwwLDAsMjE5LDY2LDIzMCwxLDQwLDQsMjE5LAorCTY3LDI0LDI0MCw2MiwxNCwyMTEsNjYsNjIsMzMsMjExLDY2LDYyLAorCTEsMjExLDY2LDYyLDI0OCwyMTEsNjYsMjM3LDU2LDQ4LDI0NiwxNTMsCisJMjMwLDIwNywyMzcsNTcsNDgsNjIsMywyMTEsNjYsNjIsMjIxLDIxMSwKKwk2NiwyMDEsMjI5LDIxMywzMywyMzQsMTQ5LDk1LDIyLDAsMjUsMTI2LAorCTI1NCwxMzIsNDAsNCwyNTQsMTQwLDMyLDIsMTc1LDExOSwxMjMsMjA5LAorCTIyNSwyMDEsNiw4LDE0LDAsMzEsNDgsMSwxMiwxNiwyNTAsCisJMTIxLDIwMSwzMyw0LDAsNTcsOTQsMzUsODYsMzMsMiwwLAorCTU3LDEyNiwzNSwxMDIsMTExLDIyMSwyMjksMzQsODksMTUyLDIzNyw4MywKKwk5MSwxNTIsMjIxLDMzLDYzLDE1MiwyMDUsMTI3LDE0Miw1OCw4MSwxNTIsCisJNTAsODIsMTUyLDU4LDgwLDE1MiwxMzUsNTAsODAsMTUyLDIwNSwxNjIsCisJMTQwLDI1NCwzLDU2LDE2LDU4LDgxLDE1MiwxMzUsNjAsMjMwLDE1LAorCTUwLDgxLDE1MiwxNzUsNTAsODAsMTUyLDI0LDIzLDU4LDc5LDE1MiwKKwkyMDUsMTYyLDE0MCwyNTQsMyw0OCwxMyw1OCw4MSwxNTIsMjAzLDYzLAorCTUwLDgxLDE1Miw2MiwyNTUsNTAsNzksMTUyLDU4LDgxLDE1Miw1MCwKKwk4MiwxNTIsNTgsNzksMTUyLDEzNSw1MCw3OSwxNTIsNjIsMzIsNTAsCisJODMsMTUyLDUwLDg0LDE1MiwyMzcsNTYsMTYsMjMwLDE3LDIzNyw1NywKKwkxNiwyMTksNzIsNjIsMTkyLDUwLDkzLDE1Miw2Miw5Myw1MCw5NCwKKwkxNTIsNTgsOTMsMTUyLDYxLDUwLDkzLDE1MiwzMiw5LDU4LDk0LAorCTE1Miw2MSw1MCw5NCwxNTIsNDAsNDQsNjIsMTcwLDIzNyw1NywyMCwKKwkxNzUsMjM3LDU3LDIxLDIzNyw1NiwxNiwyNDYsMiwyMzcsNTcsMTYsCisJMjE5LDcyLDIzMCwxLDIwMiwyOSwxNDEsMjM3LDU2LDIwLDcxLDIzNywKKwk1NiwyMSwxMjAsMjU0LDEwLDQ4LDIzNywyMzcsNTYsMTYsMjMwLDE3LAorCTIzNyw1NywxNiwyNDMsNjIsMTQsMjExLDY2LDYyLDY1LDIxMSw2NiwKKwkyNTEsNTgsMzksMTUyLDIzLDIzLDYwLDUwLDM5LDE1Miw3MSw1OCwKKwk4MiwxNTIsMTYwLDIzMCwxNSw0MCwyMiw3MSwxNCwxMCwyMTksNjYsCisJMjMwLDE2LDIwMiwxODYsMTQxLDIxOSw3MiwyMzAsMSwyMDIsMTg2LDE0MSwKKwkxMywzMiwyMzksMTYsMjM1LDQyLDg5LDE1MiwyMzcsOTEsOTEsMTUyLAorCTIwNSw0NywxMzEsNDgsNyw2MSwyMDIsMTg2LDE0MSwxOTUsMjI3LDE0MSwKKwkyMjEsMjI1LDMzLDAsMCwyMDEsMjIxLDMzLDU1LDE1MiwyMDUsMTI3LAorCTE0Miw1OCw4NCwxNTIsNjEsNTAsODQsMTUyLDQwLDE5LDU4LDgyLAorCTE1MiwyNDYsMSw1MCw4MiwxNTIsNTgsNzksMTUyLDI0NiwxLDUwLAorCTc5LDE1MiwxOTUsMjksMTQxLDIyMSwyMjUsMzMsMSwwLDIwMSwyMjEsCisJMzMsNTksMTUyLDIwNSwxMjcsMTQyLDU4LDgwLDE1MiwyNDYsMSw1MCwKKwk4MCwxNTIsNTgsODIsMTUyLDEzNSwyNDYsMSw1MCw4MiwxNTIsNTgsCisJODMsMTUyLDYxLDUwLDgzLDE1MiwxOTQsMjksMTQxLDIyMSwyMjUsMzMsCisJMiwwLDIwMSwyMjEsMjI5LDMzLDAsMCw1NywxNyw0LDAsCisJMjUsMTI2LDUwLDQ0LDE1MiwyMzAsMTI4LDUwLDg1LDE1Miw1OCw4NSwKKwkxNTIsMTgzLDQwLDYsMjIxLDMzLDg4LDIsMjQsNCwyMjEsMzMsCisJMTUwLDAsNTgsNDQsMTUyLDE4Myw0MCw1Myw2MCw0MCw1MCw2MCwKKwk0MCw0Nyw2MSw2MSwzMyw4NiwxNTIsMTE5LDM1LDExOSwzNSw1NCwKKwkxMjksMTc1LDUwLDQ4LDE1MiwyMjEsNDMsMjIxLDIyOSwyMjUsMTI0LDE4MSwKKwk0MCw0MiwzMyw4NiwxNTIsMTcsMywwLDIwNSwxODksMTQwLDE3LAorCTIzMiwzLDI3LDEyMywxNzgsMzIsMjUxLDU4LDQ4LDE1MiwxODMsNDAsCisJMjI0LDU4LDQ0LDE1Miw3MSw2Miw3LDEyOCwyMzAsMTI3LDcxLDU4LAorCTg1LDE1MiwxNzYsNTAsNDQsMTUyLDI0LDE2MiwyMjEsMjI1LDIwMSwxODMsCisJMjIxLDUyLDAsMTkyLDIyMSw1MiwxLDE5MiwyMjEsNTIsMiwxOTIsCisJMjIxLDUyLDMsMTkyLDU1LDIwMSwyNDUsNjIsMSwyMTEsMTAwLDI0MSwKKwkyMDEsMjQ1LDYyLDEsMjExLDk2LDI0MSwyMDEsMzMsMiwwLDU3LAorCTEyNiwzNSwxMDIsMTExLDIzNyw1Niw0OCwyMzAsMTc1LDIzNyw1Nyw0OCwKKwk2Miw0OCwyMzcsNTcsNDksMTI1LDIzNyw1NywzMiwxMjQsMjM3LDU3LAorCTMzLDYyLDAsMjM3LDU3LDM0LDYyLDg4LDIzNyw1NywzNSw2MiwKKwkwLDIzNyw1NywzNiwyMzcsNTcsMzcsMzMsMTI4LDIsMTI1LDIzNywKKwk1NywzOCwxMjQsMjM3LDU3LDM5LDIzNyw1Niw0OCwyNDYsOTcsMjMwLAorCTIwNywyMzcsNTcsNDgsNjIsMCwyMzcsNTcsMCw2MiwwLDIxMSwKKwk5NiwyMTEsMTAwLDIwMSwzMywyLDAsNTcsMTI2LDM1LDEwMiwxMTEsCisJMjM3LDU2LDQ4LDIzMCwxNzUsMjM3LDU3LDQ4LDYyLDEyLDIzNyw1NywKKwk0OSw2Miw3NiwyMzcsNTcsMzIsNjIsMCwyMzcsNTcsMzMsMjM3LAorCTU3LDM0LDEyNSwyMzcsNTcsMzUsMTI0LDIzNyw1NywzNiw2MiwwLAorCTIzNyw1NywzNywzMywxMjgsMiwxMjUsMjM3LDU3LDM4LDEyNCwyMzcsCisJNTcsMzksMjM3LDU2LDQ4LDI0Niw5NywyMzAsMjA3LDIzNyw1Nyw0OCwKKwk2MiwxLDIxMSw5NiwyMDEsMzMsMiwwLDU3LDEyNiwzNSwxMDIsCisJMTExLDIyOSwyMzcsNTYsNDgsMjMwLDg3LDIzNyw1Nyw0OCwxMjUsMjM3LAorCTU3LDQwLDEyNCwyMzcsNTcsNDEsNjIsMCwyMzcsNTcsNDIsNjIsCisJNjcsMjM3LDU3LDQzLDYyLDAsMjM3LDU3LDQ0LDU4LDEwNiwxMzcsCisJMjU0LDEsMzIsNSwzMyw2LDAsMjQsMywzMywxMjgsMiwKKwkxMjUsMjM3LDU3LDQ2LDEyNCwyMzcsNTcsNDcsMjM3LDU2LDUwLDIzMCwKKwkyNTIsMjQ2LDIsMjM3LDU3LDUwLDIyNSwyMDEsMzMsNCwwLDU3LAorCTk0LDM1LDg2LDMzLDIsMCw1NywxMjYsMzUsMTAyLDExMSwyMzcsCisJNTYsNDgsMjMwLDg3LDIzNyw1Nyw0OCwxMjUsMjM3LDU3LDQwLDEyNCwKKwkyMzcsNTcsNDEsNjIsMCwyMzcsNTcsNDIsNjIsNjcsMjM3LDU3LAorCTQzLDYyLDAsMjM3LDU3LDQ0LDEyMywyMzcsNTcsNDYsMTIyLDIzNywKKwk1Nyw0NywyMzcsNTYsNTAsMjMwLDI0NCwyNDYsMCwyMzcsNTcsNTAsCisJMjM3LDU2LDQ4LDI0NiwxNDUsMjMwLDIwNywyMzcsNTcsNDgsMjAxLDIxMywKKwkyMzcsNTYsNDYsOTUsMjM3LDU2LDQ3LDg3LDIzNyw1Niw0NiwxMTEsCisJMjM3LDU2LDQ3LDEwMywxODMsMjM3LDgyLDMyLDIzNSwzMywxMjgsMiwKKwkxODMsMjM3LDgyLDIwOSwyMDEsMjEzLDIzNyw1NiwzOCw5NSwyMzcsNTYsCisJMzksODcsMjM3LDU2LDM4LDExMSwyMzcsNTYsMzksMTAzLDE4MywyMzcsCisJODIsMzIsMjM1LDMzLDEyOCwyLDE4MywyMzcsODIsMjA5LDIwMSwyNDUsCisJMTk3LDEsNTIsMCwyMzcsMTIwLDIzMCwyNTMsMjM3LDEyMSwxOTMsMjQxLAorCTIwMSwyNDUsMTk3LDEsNTIsMCwyMzcsMTIwLDI0NiwyLDIzNywxMjEsCisJMTkzLDI0MSwyMDEsMzMsMiwwLDU3LDEyNiwzNSwxMDIsMTExLDEyNiwKKwkzNSwxMTAsMTAzLDIwMSwzMywwLDAsMzQsMTAyLDE1MiwzNCw5NiwKKwkxNTIsMzQsOTgsMTUyLDMzLDIwMiwxNTQsMzQsMTA0LDE1MiwyMzcsOTEsCisJMTA0LDE1Miw0MiwyMjYsMTQ5LDE4MywyMzcsODIsMTcsMCwyNTUsMjUsCisJMzQsMTAwLDE1MiwyMDMsMTI0LDQwLDYsMzMsMCwxMjUsMzQsMTAwLAorCTE1Miw0MiwxMDQsMTUyLDM1LDM1LDM1LDIyOSwyMDUsMTIwLDEzOSwxOTMsCisJMjAxLDIwNSwxODYsMTQ5LDIyOSw0Miw0MCwxNTIsMzUsMzUsMzUsMjI5LAorCTIwNSwzOSwxNDQsMTkzLDEyNCwyMzAsMywxMDMsMjIxLDExNywyNTQsMjIxLAorCTExNiwyNTUsMjM3LDkxLDQyLDE1MiwzNSwzNSwzNSwxODMsMjM3LDgyLAorCTMyLDEyLDE3LDUsMCw0Miw0MiwxNTIsMjA1LDE3MSwxNDksMjQyLAorCTE2OSwxNDQsNDIsNDAsMTUyLDIyOSwyMDUsMTIwLDEzOSwxOTMsMTk1LDE5OCwKKwkxNDksMjM3LDkxLDQyLDE1Miw0Miw5OCwxNTIsMjUsMzQsOTgsMTUyLAorCTE5LDE5LDE5LDQyLDEwMiwxNTIsMjUsMzQsMTAyLDE1MiwyMzcsOTEsCisJMTAwLDE1MiwzMywxNTgsMjUzLDI1LDIzNyw5MSwxMDIsMTUyLDIwNSwxNzEsCisJMTQ5LDI0MiwyMTQsMTQ0LDMzLDAsMCwzNCwxMDIsMTUyLDYyLDEsCisJNTAsOTUsMTUyLDIwNSwyMjUsMTQ0LDE5NSwxOTgsMTQ5LDU4LDk1LDE1MiwKKwkxODMsMjAwLDIzNyw5MSw5NiwxNTIsNDIsMTAyLDE1MiwyMDUsMTcxLDE0OSwKKwkyNDIsNSwxNDUsMjM3LDkxLDEwMiwxNTIsMzMsOTgsMiwyNSwyMzcsCisJOTEsOTYsMTUyLDIwNSwxNzEsMTQ5LDI1MCwzNywxNDUsMjM3LDkxLDk2LAorCTE1Miw0MiwxMDIsMTUyLDE4MywyMzcsODIsMzIsNyw0Miw5OCwxNTIsCisJMTI1LDE4MCw0MCwxMywyMzcsOTEsMTAyLDE1Miw0Miw5NiwxNTIsMjA1LAorCTE3MSwxNDksMjQyLDU4LDE0NSwyMzcsOTEsMTA0LDE1Miw0MiwxMDIsMTUyLAorCTI1LDM1LDM1LDM1LDIyOSwyMDUsMTIwLDEzOSwxOTMsMTc1LDUwLDk1LAorCTE1MiwyMDEsMTk1LDEwNywxMzksMjA1LDIwNiwxNDksMjUwLDI1NSwyNDMsMjA1LAorCTIyNSwxNDQsMjUxLDU4LDIzMCwxNDksMTgzLDE5NCwxOTgsMTQ5LDE3LDEsCisJMCw0Miw5OCwxNTIsMjA1LDE3MSwxNDksMjUwLDE5OCwxNDksNjIsMSwKKwk1MCwyMzAsMTQ5LDIzNyw5MSw5NiwxNTIsNDIsMTA0LDE1MiwyNSwyMjEsCisJMTE3LDI1MiwyMjEsMTE2LDI1MywyMzcsOTEsMTA0LDE1Miw0Miw5NiwxNTIsCisJMjUsMzUsMzUsMzUsMjIxLDExNywyNTQsMjIxLDExNiwyNTUsMzUsMzUsCisJMzUsMjI5LDIwNSwzOSwxNDQsMTI0LDIzMCwzLDEwMywzNSwzNSwzNSwKKwkyMjEsMTE3LDI1MCwyMjEsMTE2LDI1MSwyMzUsMjIxLDExMCwyNTIsMjIxLDEwMiwKKwkyNTMsMTE1LDM1LDExNCwzNSw1NCw0LDYyLDEsMjExLDEwMCwyMTEsCisJODQsMTk1LDE5OCwxNDksMzMsMCwwLDM0LDEwMiwxNTIsMzQsOTYsCisJMTUyLDM0LDk4LDE1MiwzMywyMDIsMTU0LDM0LDEwNCwxNTIsMjM3LDkxLAorCTEwNCwxNTIsNDIsMjI2LDE0OSwxODMsMjM3LDgyLDE3LDAsMjU1LDI1LAorCTM0LDEwMCwxNTIsMzMsMTA5LDE1Miw1NCwwLDMzLDEwNywxNTIsMjI5LAorCTIwNSwyNDAsMTQyLDE5Myw2Miw0Nyw1MCwzNCwxNTIsNjIsMTMyLDUwLAorCTQ5LDE1MiwyMDUsMjQxLDE0NSwyMDUsNjEsMTQ1LDU4LDM5LDE1Miw2MCwKKwk1MCwzOSwxNTIsMjQsMjQxLDIwNSwyMDYsMTQ5LDI1MSwyNTUsMzMsMTA5LAorCTE1MiwxMjYsMTgzLDIwMiwxOTgsMTQ5LDExMCwyMjEsMTE3LDI1MSwzMywxMDksCisJMTUyLDU0LDAsMjIxLDEyNiwyNTEsMjU0LDEsNDAsMjgsMjU0LDMsCisJNDAsMTAxLDI1NCw0LDIwMiwxOTAsMTQ3LDI1NCw1LDIwMiwxNDcsMTQ3LAorCTI1NCw4LDQwLDg3LDMzLDEwNywxNTIsMjI5LDIwNSwyNDAsMTQyLDE5NSwKKwkxOTgsMTQ5LDU4LDIwMSwxNTQsMTgzLDMyLDIxLDMzLDExMSwxNTIsMTI2LAorCTUwLDIyOSwxNDksMjA1LDUyLDE0NCwzMywxMTAsMTUyLDExMCwzOCwwLAorCTIyOSwyMDUsMTEsMTQyLDE5MywyMzcsOTEsOTYsMTUyLDQyLDEwNCwxNTIsCisJMjUsMjIxLDExNywyNTQsMjIxLDExNiwyNTUsMzUsMzUsNTQsMiwxNywKKwkyLDAsNDMsNDMsMTE1LDM1LDExNCw1OCw0NCwxNTIsMzUsMzUsCisJMTE5LDU4LDIyOCwxNDksMzUsMTE5LDYyLDEsMjExLDEwMCwyMTEsODQsCisJNjIsMSw1MCwyMDEsMTU0LDI0LDE2OSwyMDUsMTUzLDE0Miw1OCwyMzEsCisJMTQ5LDE4Myw0MCwyNTAsMTc1LDUwLDIzMSwxNDksMzMsMTEwLDE1MiwxMjYsCisJMjU0LDI1NSw0MCw5MSw1OCwyMzMsMTQ5LDIzMCw2MywxODMsNDAsODMsCisJOTQsMjIsMCwzMywyMzQsMTQ5LDI1LDEyNiwxODMsNDAsMTMsMzMsCisJMTEwLDE1Miw5NCwzMywyMzQsMTUwLDI1LDEyNiwyNTQsMywzMiwzNiwKKwkyMDUsODEsMTQ4LDEyNSwxODAsMzMsMTEwLDE1Miw5NCwyMiwwLDQwLAorCTE3LDMzLDIzNCwxNDksMjUsNTQsMCwzMywxMDcsMTUyLDIyOSwyMDUsCisJMjQwLDE0MiwxOTMsMTk1LDE5OCwxNDksMzMsMjM0LDE1MCwyNSw1NCwwLAorCTMzLDExMCwxNTIsOTQsMjIsMCwzMywyMzQsMTQ5LDI1LDEyNiw1MCwKKwk0OSwxNTIsMjU0LDEzMiwzMiwzNyw2Miw0Nyw1MCwzNCwxNTIsNDIsCisJMTA3LDE1MiwyMjksMzMsMTEwLDE1MiwyMjksMjA1LDE3NCwxNDAsMTkzLDE5MywKKwkxMjUsMTgwLDMzLDExMCwxNTIsOTQsMjIsMCwzMywyMzQsMTUwLDIwMiwKKwkxMTcsMTQ3LDI1LDUyLDE5NSwxMjAsMTQ3LDU4LDQ5LDE1MiwyNTQsMTQwLAorCTMyLDcsNjIsMSw1MCwzNCwxNTIsMjQsMjEwLDYyLDMyLDUwLAorCTEwNiwxNTIsMjQsMTksNTgsNDksMTUyLDk1LDU4LDEwNiwxNTIsMTYzLAorCTE4Myw1OCwxMDYsMTUyLDMyLDExLDIwMyw2Myw1MCwxMDYsMTUyLDU4LAorCTEwNiwxNTIsMTgzLDMyLDIzMSwyNTQsMiw0MCw1MSwyNTQsNCw0MCwKKwkzOCwyNTQsOCw0MCwyNiwyNTQsMTYsNDAsMTMsMjU0LDMyLDMyLAorCTE1OCw2MiwxNjUsNTAsNDksMTUyLDYyLDY5LDI0LDE5MCw2MiwxNjQsCisJNTAsNDksMTUyLDYyLDcwLDI0LDE4MSw2MiwxNjMsNTAsNDksMTUyLAorCTE3NSwyNCwxNzMsNjIsMTYyLDUwLDQ5LDE1Miw2MiwxLDI0LDE2NCwKKwk2MiwxNjEsNTAsNDksMTUyLDYyLDMsMjQsMTU1LDI1LDU0LDAsCisJMjIxLDEyNiwyNTEsMjU0LDgsNDAsNyw1OCwyMzAsMTQ5LDE4MywyMDIsCisJMzIsMTQ2LDMzLDEwNywxNTIsMjI5LDIwNSwyNDAsMTQyLDE5MywyMTEsODQsCisJMTk1LDE5OCwxNDksMjM3LDkxLDk2LDE1Miw0MiwxMDQsMTUyLDI1LDIyMSwKKwkxMTcsMjU0LDIyMSwxMTYsMjU1LDM1LDM1LDU0LDYsMTcsMiwwLAorCTQzLDQzLDExNSwzNSwxMTQsNTgsMjI4LDE0OSwzNSwzNSwxMTksNTgsCisJMjMzLDE0OSwzNSwxMTksMjA1LDE0NiwxNDIsMTk1LDMyLDE0NiwyMzcsOTEsCisJOTYsMTUyLDQyLDEwNCwxNTIsMjUsMjI5LDIwNSwxNjAsMTQyLDE5Myw1OCwKKwkyMzEsMTQ5LDE4Myw0MCwyNTAsMTc1LDUwLDIzMSwxNDksMjQzLDIzNyw5MSwKKwk5NiwxNTIsNDIsMTA0LDE1MiwyNSwyMjEsMTE3LDI1NCwyMjEsMTE2LDI1NSwKKwk3OCwzNSw3MCwyMjEsMTEzLDI1MiwyMjEsMTEyLDI1Myw4OSw4MCw0MiwKKwk5OCwxNTIsMTgzLDIzNyw4MiwzNCw5OCwxNTIsMjAzLDEyNCw0MCwxOSwKKwkzMywwLDAsMzQsOTgsMTUyLDM0LDEwMiwxNTIsMzQsOTYsMTUyLAorCTYyLDEsNTAsOTUsMTUyLDI0LDQwLDIyMSw5NCwyNTIsMjIxLDg2LAorCTI1MywxOSwxOSwxOSw0Miw5NiwxNTIsMjUsMzQsOTYsMTUyLDIzNywKKwk5MSwxMDAsMTUyLDMzLDE1OCwyNTMsMjUsMjM3LDkxLDk2LDE1MiwyMDUsCisJMTcxLDE0OSwyNDIsNTUsMTQ4LDMzLDAsMCwzNCw5NiwxNTIsMTc1LAorCTUwLDIzMCwxNDksMjUxLDE5NSwzMiwxNDYsMjQ1LDYyLDEsNTAsMjMxLAorCTE0OSw2MiwxNiwyMzcsNTcsMCwyMTEsODAsMjQxLDI1MSwyMzcsNzcsCisJMjAxLDIwNSwxODYsMTQ5LDIyOSwyMjksMzMsMCwwLDM0LDM3LDE1MiwKKwkzMywxMTAsMTUyLDEyNiw1MCwyMzQsMTUxLDU4LDQ0LDE1MiwzMywyMzUsCisJMTUxLDExOSwyMjEsNTQsMjUzLDAsMjIxLDU0LDI1NCwwLDE5NSwyMzAsCisJMTQ4LDMzLDIzNiwxNTEsNTQsMTc1LDMzLDMsMCwyMjksMzMsMjM0LAorCTE1MSwyMjksMjA1LDE3NCwxNDAsMTkzLDE5MywzMywyMzYsMTUxLDEyNiwyNTQsCisJMjU1LDQwLDc0LDMzLDI0NSwxNTEsMTEwLDIyMSwxMTcsMjU1LDMzLDI0OSwKKwkxNTEsMTI2LDIyMSwxNjYsMjU1LDIyMSwxMTksMjU1LDMzLDI1MywxNTEsMTI2LAorCTIyMSwxNjYsMjU1LDIyMSwxMTksMjU1LDU4LDIzMiwxNDksOTUsMjIxLDEyNiwKKwkyNTUsMTYzLDIyMSwxMTksMjU1LDE4Myw0MCwxNSwyMzAsMTkxLDMzLDExMCwKKwkxNTIsOTQsMjIsMCwzMywyMzQsMTQ5LDI1LDExOSwyNCwxMiwzMywKKwkxMTAsMTUyLDk0LDIyLDAsMzMsMjM0LDE0OSwyNSw1NCwxMzIsMzMsCisJMCwwLDE5NSwxOTgsMTQ5LDIyMSwxMTAsMjUzLDIyMSwxMDIsMjU0LDM1LAorCTIyMSwxMTcsMjUzLDIyMSwxMTYsMjU0LDE3LDMyLDAsMjIxLDExMCwyNTMsCisJMjIxLDEwMiwyNTQsMjA1LDE3MSwxNDksMjUwLDExNywxNDgsNTgsMjMzLDE0OSwKKwkyMDMsODcsNDAsODQsMzMsMSwwLDM0LDM3LDE1MiwyMjEsNTQsCisJMjUzLDAsMjIxLDU0LDI1NCwwLDI0LDUzLDMzLDIzNiwxNTEsNTQsCisJMTc1LDMzLDMsMCwyMjksMzMsMjM0LDE1MSwyMjksMjA1LDE3NCwxNDAsCisJMTkzLDE5MywzMywyMzYsMTUxLDEyNiwyNTQsMjU1LDQwLDE0LDMzLDExMCwKKwkxNTIsOTQsMjIsMCwzMywyMzQsMTQ5LDI1LDU0LDE0MCwyNCwxNTksCisJMjIxLDExMCwyNTMsMjIxLDEwMiwyNTQsMzUsMjIxLDExNywyNTMsMjIxLDExNiwKKwkyNTQsMTcsMzIsMCwyMjEsMTEwLDI1MywyMjEsMTAyLDI1NCwyMDUsMTcxLAorCTE0OSwyNTAsMTIsMTQ5LDMzLDIsMCwzNCwzNywxNTIsMjIxLDU0LAorCTI1MywwLDIyMSw1NCwyNTQsMCwyNCw1NCwzMywyMzYsMTUxLDU0LAorCTE3NSwzMywzLDAsMjI5LDMzLDIzNCwxNTEsMjI5LDIwNSwxNzQsMTQwLAorCTE5MywxOTMsMzMsMjM2LDE1MSwxMjYsMjU0LDI1NSw0MCwxNSwzMywxMTAsCisJMTUyLDk0LDIyLDAsMzMsMjM0LDE0OSwyNSw1NCwxMzIsMTk1LDIxMSwKKwkxNDgsMjIxLDExMCwyNTMsMjIxLDEwMiwyNTQsMzUsMjIxLDExNywyNTMsMjIxLAorCTExNiwyNTQsMTcsMzIsMCwyMjEsMTEwLDI1MywyMjEsMTAyLDI1NCwyMDUsCisJMTcxLDE0OSwyNTAsOTYsMTQ5LDMzLDEsMCwxOTUsMTk4LDE0OSwxMjQsCisJMTcwLDI1MCwxNzksMTQ5LDIzNyw4MiwyMDEsMTI0LDIzMCwxMjgsMjM3LDgyLAorCTYwLDIwMSwyMjUsMjUzLDIyOSwyMjEsMjI5LDIyMSwzMywwLDAsMjIxLAorCTU3LDIzMywyMjEsMjQ5LDIyMSwyMjUsMjUzLDIyNSwyMDEsMjMzLDIyNSwyNTMsCisJMjI5LDIyMSwyMjksMjIxLDMzLDAsMCwyMjEsNTcsOTQsMzUsODYsCisJMzUsMjM1LDU3LDI0OSwyMzUsMjMzLDAsMCwwLDAsMCwwLAorCTYyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkxNzUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDEzMywxLDAsMCwwLDYzLAorCTI1NSwyNTUsMjU1LDI1NSwwLDAsMCw2MywwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMjQsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwCisJfSA7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHNfbHRkcnYuaCBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzX2x0ZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkZTY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzX2x0ZHJ2LmgKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKglUaGUgZmlybXdhcmUgdGhpcyBkcml2ZXIgZG93bmxvYWRzIGludG8gdGhlIExvY2FsdGFsayBjYXJkIGlzIGEKKyAqCXNlcGFyYXRlIHByb2dyYW0gYW5kIGlzIG5vdCBHUEwnZCBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhlIExpbnV4CisgKglzaWRlIGRyaXZlciBhbmQgdGhlIHJvdXRpbmUgdGhhdCBsb2FkcyB0aGlzIGRhdGEgaW50byB0aGUgY2FyZCBhcmUuCisgKgkKKyAqCUl0IGlzIHRha2VuIGZyb20gdGhlIENPUFMgU0RLIGFuZCBpcyB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2UKKyAqCisgKglUaGlzIG1hdGVyaWFsIGlzIGxpY2Vuc2VkIHRvIHlvdSBzdHJpY3RseSBmb3IgdXNlIGluIGNvbmp1bmN0aW9uIHdpdGgKKyAqCXRoZSB1c2Ugb2YgQ09QUyBMb2NhbFRhbGsgYWRhcHRlcnMuCisgKglUaGVyZSBpcyBubyBjaGFyZ2UgZm9yIHRoaXMgU0RLLiBBbmQgbm8gd2FyYW50eSBleHByZXNzIG9yIGltcGxpZWQKKyAqCWFib3V0IGl0cyBmaXRuZXNzIGZvciBhbnkgcHVycG9zZS4gSG93ZXZlciwgd2Ugd2lsbCBjaGVlcmVmdWxseQorICoJcmVmdW5kIGV2ZXJ5IHBlbm55IHlvdSBwYWlkIGZvciB0aGlzIFNESy4uLgorICoJUmVnYXJkcywKKyAqCisgKglUaG9tYXMgRi4gRGl2aW5lCisgKglDaGllZiBTY2llbnRpc3QKKyAqLworCisKKy8qICAgICAgY29wc19sdGRydi5oOiBMb2NhbFRhbGsgZHJpdmVyIGZpcm13YXJlIGR1bXAgZm9yIExpbnV4LgorICoKKyAqICAgICAgQXV0aG9yczoKKyAqICAgICAgLSBKYXkgU2NodWxpc3QgPGpzY2hsc3RAc2FtYmEub3JnPgorICovCisgCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfQ09QU19UQU5HRU5UCisKK3Vuc2lnbmVkIGNoYXIgbHRkcnZfY29kZVtdID0geworCTU4LDMsMCw1MCwxNDgsMTAsMzMsMTQzLDE1LDYyLDg1LDExOSwKKwkxOTAsMzIsOSw2MiwxNzAsMTE5LDE5MCwzMiwzLDM1LDI0LDI0MSwKKwkzNCwxNDYsMTAsMjQ5LDE3LDE1MCwxMCwzMywxNDMsMTUsMTgzLDIzNywKKwk4Miw3Nyw2OCwxMSwxMDcsOTgsMTksNTQsMCwyMzcsMTc2LDYyLAorCTE2LDIzNyw1Nyw1MSw2MiwwLDIzNyw1Nyw1MCwyMzcsNTcsNTQsCisJNjIsMTIsMjM3LDU3LDQ5LDYyLDE5NSwzMywzOSwyLDUwLDU2LAorCTAsMzQsNTcsMCwyMzcsODYsMjA1LDMwLDIsMjUxLDIwNSw2MCwKKwkxMCwyNCwxNjksNjcsMTExLDExMiwxMjEsMTE0LDEwNSwxMDMsMTA0LDExNiwKKwkzMiw0MCw5OSw0MSwzMiw0OSw1Nyw1Niw1Niw0NSw0OSw1NywKKwk1Nyw1MCw0NCwzMiw4MCwxMTQsMTA1LDExMCwxMTYsMTA1LDExMCwxMDMsCisJMzIsNjcsMTExLDEwOSwxMDksMTE3LDExMCwxMDUsOTksOTcsMTE2LDEwNSwKKwkxMTEsMTEwLDExNSwzMiw2NSwxMTUsMTE1LDExMSw5OSwxMDUsOTcsMTE2LAorCTEwMSwxMTUsNDQsMzIsNzMsMTEwLDk5LDQ2LDY1LDEwOCwxMDgsMzIsCisJMTE0LDEwNSwxMDMsMTA0LDExNiwxMTUsMzIsMTE0LDEwMSwxMTUsMTAxLDExNCwKKwkxMTgsMTAxLDEwMCw0NiwzMiwzMiw0LDQsMjIsNDAsMjU1LDYwLAorCTQsOTYsMTAsMjI0LDYsMCw3LDEyNiwyLDY0LDExLDI0NiwKKwkxMiw2LDEzLDAsMTQsMTkzLDE1LDAsNSw5NiwzLDE5MiwKKwkxLDAsOSw4LDYyLDMsMjExLDgyLDYyLDE5MiwyMTEsODIsCisJMjAxLDYyLDMsMjExLDgyLDYyLDIxMywyMTEsODIsMjAxLDYyLDUsCisJMjExLDgyLDYyLDIyNCwyMTEsODIsMjAxLDYyLDUsMjExLDgyLDYyLAorCTIyNCwyMTEsODIsMjAxLDYyLDUsMjExLDgyLDYyLDk2LDIxMSw4MiwKKwkyMDEsNiwyOCwzMywxODAsMSwxNCw4MiwyMzcsMTYzLDE5NCw0LAorCTIsMzMsMzksMiwzNCw2NCwwLDU4LDMsMCwyMzAsMSwKKwkxOTIsNjIsMTEsMjM3LDEyMSw2MiwxMTgsMjM3LDEyMSwyMDEsMzMsMTgyLAorCTEwLDU0LDEzMiwyMDUsMjUzLDEsMjAxLDI0NSwxOTcsMjEzLDIyOSw0MiwKKwkxNTAsMTAsMTQsODMsMTcsOTgsMiw2NywyMCwyMzcsMTYyLDU4LAorCTE3OSwxLDk1LDIxOSw4MiwyMzAsMSwzMiw2LDI5LDMyLDI0NywKKwkxOTUsMTcsMyw2MiwxLDIxMSw4MiwyMTksODIsOTUsMjMwLDE2MCwKKwkzMiwxMCwyMzcsMTYyLDMyLDIyNSwyMSwzMiwyMjIsMTk1LDE1LDMsCisJMjM3LDE2MiwxMjMsMjMwLDk2LDE5NCwyMSwzLDYyLDQ4LDIxMSw4MiwKKwk2MiwxLDIxMSw4MiwxNzUsMjExLDgyLDIzNyw5MSwxNTAsMTAsNDMsCisJNTUsMjM3LDgyLDIxOCwxOSwzLDM0LDE1MiwxMCw5OCwxMDcsNTgsCisJMTU0LDEwLDE5MCwzMiw4MSw2MiwxLDUwLDE1OCwxMCwzNSwzNSwKKwk2MiwxMzIsMTkwLDMyLDQ0LDU0LDEzMyw0Myw3MCw1OCwxNTQsMTAsCisJMTE5LDQzLDExMiwxNywzLDAsMjA1LDEzNywzLDYyLDE2LDIxMSwKKwk4Miw2Miw1NiwyMTEsODIsMjA1LDIxNywxLDQyLDE1MCwxMCwxNCwKKwk4MywxNyw5OCwyLDY3LDIwLDU4LDE3OCwxLDk1LDE5NSw1OSwKKwkyLDYyLDEyOSwxOTAsMTk0LDIyNywyLDU0LDEzMCw0Myw3MCw1OCwKKwkxNTQsMTAsMTE5LDQzLDExMiwxNywzLDAsMjA1LDEzNywzLDE5NSwKKwkyNTQsMiwzNSwzNSwxMjYsMjU0LDEzMiwxOTQsMjI3LDIsMjA1LDYxLAorCTMsMjQsMjAsNjIsMTI4LDE2NiwxOTQsMjIyLDIsMjIxLDIyOSwyMjEsCisJMzMsMTc1LDEwLDIwNSw5Myw2LDIwNSwxNDQsNywyMjEsMjI1LDIyNSwKKwkyMDksMTkzLDI0MSwyNTEsMjM3LDc3LDIyMSwyMjksMjIxLDMzLDE1OSwxMCwKKwkyMDUsOTMsNiwyMjEsMjI1LDIwNSw2MSwzLDE5NSwyNDcsMiwyNCwKKwkyMzcsMjQsMjM1LDI0LDIzMywyMzAsNjQsNDAsMiwyNCwyMjcsMjQsCisJMjI1LDE3NSw1MCwxNzksMTAsMjA1LDIwOCwxLDIwMSwxOTcsMzMsNCwKKwkwLDU3LDEyNiwzNSwxMDIsMTExLDIwNSw1MSwzLDE5MywyMDEsNjIsCisJMSw1MCwxNzksMTAsMzQsMTUwLDEwLDU0LDAsNTgsMTc5LDEwLAorCTE4MywyMDAsNjIsMTQsMjExLDgyLDYyLDE5MywyMTEsODIsNjIsMTAsCisJMjExLDgyLDYyLDIyNCwyMTEsODIsNjIsNiwyMTEsODIsNTgsMTU0LAorCTEwLDIxMSw4Miw2MiwxNiwyMTEsODIsNjIsNTYsMjExLDgyLDYyLAorCTQ4LDIxMSw4MiwyMTksODIsMjMwLDEsNDAsNCwyMTksODMsMjQsCisJMjQyLDYyLDE0LDIxMSw4Miw2MiwzMywyMTEsODIsNjIsMSwyMTEsCisJODIsNjIsOSwyMTEsODIsNjIsMzIsMjExLDgyLDIwNSwyMTcsMSwKKwkyMDEsMTQsODMsMjA1LDIwOCwxLDI0LDIzLDE0LDgzLDIwNSwyMDgsCisJMSwyMDUsMjI2LDEsNTgsMTc0LDEsNjEsMzIsMjUzLDIwNSwyNDQsCisJMSw1OCwxNzQsMSw2MSwzMiwyNTMsMjA1LDIyNiwxLDU4LDE3NSwKKwkxLDYxLDMyLDI1Myw2Miw1LDIxMSw4Miw2MiwyMzMsMjExLDgyLAorCTYyLDEyOCwyMTEsODIsNTgsMTc2LDEsNjEsMzIsMjUzLDIzNywxNjMsCisJMjcsNjIsMTkyLDIxMSw4MiwyMTksODIsMjMwLDQsNDAsMjUwLDIzNywKKwkxNjMsMjcsMTIyLDE3OSwzMiwyNDMsMjE5LDgyLDIzMCw0LDQwLDI1MCwKKwk1OCwxNzgsMSw3MSwyMTksODIsMjMwLDQsNDAsMyw1LDMyLAorCTI0NywyMTksODIsMjMwLDQsNDAsMjUwLDIwNSwyMzUsMSw1OCwxNzcsCisJMSw2MSwzMiwyNTMsMjA1LDI0NCwxLDIwMSwyMjksMjEzLDM1LDM1LAorCTEyNiwyMzAsMTI4LDE5NCwxNDUsNCw0Myw1OCwxNTQsMTAsMTE5LDQzLAorCTcwLDMzLDE4MSwxMCwxMTksNDMsMTEyLDE3LDMsMCwyNDMsNjIsCisJMTAsMjExLDgyLDIxOSw4MiwyMzAsMTI4LDIwMiw0MSw0LDIwOSwyMjUsCisJNjIsMSw1NSwyNTEsMjAxLDIwNSwxNDQsMyw1OCwxODAsMTAsMjU0LAorCTI1NSwyMDIsMTI3LDQsMjA1LDIxNywxLDU4LDE3OCwxLDcxLDIxOSwKKwk4MiwyMzAsMSwzMiw2LDUsMzIsMjQ3LDE5NSwxNzMsNCwyMTksCisJODMsNzEsNTgsMTU0LDEwLDE4NCwxOTQsMTczLDQsNTgsMTc4LDEsCisJNzEsMjE5LDgyLDIzMCwxLDMyLDYsNSwzMiwyNDcsMTk1LDE3MywKKwk0LDIxOSw4Myw1OCwxNzgsMSw3MSwyMTksODIsMjMwLDEsMzIsCisJNiw1LDMyLDI0NywxOTUsMTczLDQsMjE5LDgzLDI1NCwxMzMsMTk0LAorCTE3Myw0LDU4LDE3OSwxLDI0LDQsNTgsMTc5LDEsMTM1LDYxLAorCTMyLDI1MywyMDksMjI1LDIwNSwxMzcsMywyMDUsNjEsMywxODMsMjUxLAorCTIwMSwyMDksMjI1LDI0Myw2MiwxMCwyMTEsODIsMjE5LDgyLDIzMCwxMjgsCisJMjAyLDE2NCw0LDYyLDEsNTUsMjUxLDIwMSwyMDUsMTQ0LDMsMjA1LAorCTYxLDMsMTgzLDI1MSwyMDEsMjA5LDIyNSw2MiwyLDU1LDI1MSwyMDEsCisJMjQzLDYyLDE0LDIxMSw4Miw2MiwzMywyMTEsODIsMjUxLDIwMSwzMywKKwk0LDAsNTcsOTQsMzUsODYsMzMsMiwwLDU3LDEyNiwzNSwKKwkxMDIsMTExLDIyMSwyMjksMzQsMTkzLDEwLDIzNyw4MywxOTUsMTAsMjIxLAorCTMzLDE3MSwxMCwyMDUsOTMsNiw1OCwxODUsMTAsNTAsMTg2LDEwLAorCTU4LDE4NCwxMCwxMzUsNTAsMTg0LDEwLDIwNSwxMTIsNiwyNTQsMywKKwk1NiwxNiw1OCwxODUsMTAsMTM1LDYwLDIzMCwxNSw1MCwxODUsMTAsCisJMTc1LDUwLDE4NCwxMCwyNCwyMyw1OCwxODMsMTAsMjA1LDExMiw2LAorCTI1NCwzLDQ4LDEzLDU4LDE4NSwxMCwyMDMsNjMsNTAsMTg1LDEwLAorCTYyLDI1NSw1MCwxODMsMTAsNTgsMTg1LDEwLDUwLDE4NiwxMCw1OCwKKwkxODMsMTAsMTM1LDUwLDE4MywxMCw2MiwzMiw1MCwxODcsMTAsNTAsCisJMTg4LDEwLDYsMjU1LDIxOSw4MiwyMzAsMTYsMzIsMyw1LDMyLAorCTI0NywyMDUsMTgwLDQsNiw0MCwyMTksODIsMjMwLDE2LDQwLDMsCisJNSwzMiwyNDcsNjIsMTAsMjExLDgyLDIxOSw4MiwyMzAsMTI4LDE5NCwKKwk0Niw1LDIxOSw4MiwyMzAsMTYsNDAsMjE0LDIzNyw5NSw3MSw1OCwKKwkxODYsMTAsMTYwLDIzMCwxNSw0MCwzMiw3MSwxNCwxMCw2MiwxMCwKKwkyMTEsODIsMjE5LDgyLDIzMCwxMjgsMjAyLDExOSw1LDIwNSwxODAsNCwKKwkxOTUsMTU2LDUsMjE5LDgyLDIzMCwxNiwyMDIsMTU2LDUsMTMsMzIsCisJMjI5LDE2LDIyNSw0MiwxOTMsMTAsMjM3LDkxLDE5NSwxMCwyMDUsMjUyLAorCTMsNDgsNyw2MSwyMDIsMTU2LDUsMTk1LDE5Nyw1LDIyMSwyMjUsCisJMzMsMCwwLDIwMSwyMjEsMzMsMTYzLDEwLDIwNSw5Myw2LDU4LAorCTE4OCwxMCw2MSw1MCwxODgsMTAsNDAsMTksNTgsMTg2LDEwLDI0NiwKKwkxLDUwLDE4NiwxMCw1OCwxODMsMTAsMjQ2LDEsNTAsMTgzLDEwLAorCTE5NSw0Niw1LDIyMSwyMjUsMzMsMSwwLDIwMSwyMjEsMzMsMTY3LAorCTEwLDIwNSw5Myw2LDU4LDE4NCwxMCwyNDYsMSw1MCwxODQsMTAsCisJNTgsMTg2LDEwLDEzNSwyNDYsMSw1MCwxODYsMTAsNTgsMTg3LDEwLAorCTYxLDUwLDE4NywxMCwxOTQsNDYsNSwyMjEsMjI1LDMzLDIsMCwKKwkyMDEsMjIxLDIyOSwzMywwLDAsNTcsMTcsNCwwLDI1LDEyNiwKKwk1MCwxNTQsMTAsMjMwLDEyOCw1MCwxODksMTAsNTgsMTg5LDEwLDE4MywKKwk0MCw2LDIyMSwzMyw4OCwyLDI0LDQsMjIxLDMzLDE1MCwwLAorCTU4LDE1NCwxMCwxODMsNDAsNDksNjAsNDAsNDYsNjEsMzMsMTkwLAorCTEwLDExOSwzNSwxMTksMzUsNTQsMTI5LDE3NSw1MCwxNTgsMTAsMjIxLAorCTQzLDIyMSwyMjksMjI1LDEyNCwxODEsNDAsNDIsMzMsMTkwLDEwLDE3LAorCTMsMCwyMDUsMjA2LDQsMTcsMjMyLDMsMjcsMTIzLDE3OCwzMiwKKwkyNTEsNTgsMTU4LDEwLDE4Myw0MCwyMjQsNTgsMTU0LDEwLDcxLDYyLAorCTcsMTI4LDIzMCwxMjcsNzEsNTgsMTg5LDEwLDE3Niw1MCwxNTQsMTAsCisJMjQsMTY2LDIyMSwyMjUsMjAxLDE4MywyMjEsNTIsMCwxOTIsMjIxLDUyLAorCTEsMTkyLDIyMSw1MiwyLDE5MiwyMjEsNTIsMywxOTIsNTUsMjAxLAorCTYsOCwxNCwwLDMxLDQ4LDEsMTIsMTYsMjUwLDEyMSwyMDEsCisJMzMsMiwwLDU3LDk0LDM1LDg2LDM1LDc4LDM1LDcwLDM1LAorCTEyNiwzNSwxMDIsMTA1LDc5LDEyMCw2OCwxMDMsMjM3LDE3NiwyMDEsMzMsCisJMiwwLDU3LDEyNiwzNSwxMDIsMTExLDYyLDE3LDIzNyw1Nyw0OCwKKwkxMjUsMjM3LDU3LDQwLDEyNCwyMzcsNTcsNDEsNjIsMCwyMzcsNTcsCisJNDIsNjIsNjQsMjM3LDU3LDQzLDYyLDAsMjM3LDU3LDQ0LDMzLAorCTEyOCwyLDEyNSwyMzcsNTcsNDYsMTI0LDIzNyw1Nyw0Nyw2MiwxNDUsCisJMjM3LDU3LDQ4LDIxMSw2OCw1OCwxNDksMTAsMjExLDY2LDIwMSwzMywKKwkyLDAsNTcsMTI2LDM1LDEwMiwxMTEsNjIsMzMsMjM3LDU3LDQ4LAorCTYyLDY0LDIzNyw1NywzMiw2MiwwLDIzNyw1NywzMywyMzcsNTcsCisJMzQsMTI1LDIzNyw1NywzNSwxMjQsMjM3LDU3LDM2LDYyLDAsMjM3LAorCTU3LDM3LDMzLDEyOCwyLDEyNSwyMzcsNTcsMzgsMTI0LDIzNyw1NywKKwkzOSw2Miw5NywyMzcsNTcsNDgsMjExLDY3LDU4LDE0OSwxMCwyMTEsCisJNjYsMjAxLDIzNyw1Niw0Niw5NSwyMzcsNTYsNDcsODcsMjM3LDU2LAorCTQ2LDExMSwyMzcsNTYsNDcsMTAzLDE4MywyMzcsODIsMzIsMjM1LDMzLAorCTEyOCwyLDE4MywyMzcsODIsMjAxLDIzNyw1NiwzOCw5NSwyMzcsNTYsCisJMzksODcsMjM3LDU2LDM4LDExMSwyMzcsNTYsMzksMTAzLDE4MywyMzcsCisJODIsMzIsMjM1LDMzLDEyOCwyLDE4MywyMzcsODIsMjAxLDIwNSwxMDYsCisJMTAsMjIxLDExMCw2LDIyMSwxMDIsNywxMjYsMzUsMTEwLDEwMywxOTUsCisJMTE4LDEwLDIwNSwxMDYsMTAsMzMsMCwwLDM0LDIwNSwxMCwzNCwKKwkxOTgsMTAsMzQsMjAwLDEwLDMzLDE0MywxNSwzNCwyMDcsMTAsMjM3LAorCTkxLDIwNywxMCw0MiwxNDYsMTAsMTgzLDIzNyw4MiwxNywwLDI1NSwKKwkyNSwzNCwyMDMsMTAsMjAzLDEyNCw0MCw2LDMzLDAsMTI1LDM0LAorCTIwMywxMCw0MiwyMDcsMTAsMjI5LDIwNSwzNywzLDE5NSwxMTgsMTAsCisJMjA1LDEwNiwxMCwyMjksNDIsMTUwLDEwLDM1LDM1LDM1LDIyOSwyMDUsCisJNzAsNywxOTMsMTI0LDIzMCwzLDEwMywyMjEsMTE3LDI1NCwyMjEsMTE2LAorCTI1NSwyMzcsOTEsMTUyLDEwLDM1LDM1LDM1LDE4MywyMzcsODIsMzIsCisJMTIsMTcsNSwwLDQyLDE1MiwxMCwyMDUsOTEsMTAsMjQyLDIwMywKKwk3LDQyLDE1MCwxMCwyMjksMjA1LDM3LDMsMTk1LDExOCwxMCwyMzcsCisJOTEsMTUyLDEwLDQyLDIwMCwxMCwyNSwzNCwyMDAsMTAsNDIsMjA1LAorCTEwLDI1LDM0LDIwNSwxMCwyMzcsOTEsMjAzLDEwLDMzLDE1OCwyNTMsCisJMjUsMjM3LDkxLDIwNSwxMCwyMDUsOTEsMTAsMjQyLDI0NSw3LDMzLAorCTAsMCwzNCwyMDUsMTAsNjIsMSw1MCwxOTcsMTAsMjA1LDUsCisJOCwzMywwLDAsNTcsMjQ5LDE5NSwxMTgsMTAsMjA1LDEwNiwxMCwKKwk1OCwxOTcsMTAsMTgzLDIwMiwxMTgsMTAsMjM3LDkxLDE5OCwxMCw0MiwKKwkyMDUsMTAsMjA1LDkxLDEwLDI0Miw0Niw4LDIzNyw5MSwyMDUsMTAsCisJMzMsOTgsMiwyNSwyMzcsOTEsMTk4LDEwLDIwNSw5MSwxMCwyNTAsCisJNzgsOCwyMzcsOTEsMTk4LDEwLDQyLDIwNSwxMCwxODMsMjM3LDgyLAorCTMyLDcsNDIsMjAwLDEwLDEyNSwxODAsNDAsMTMsMjM3LDkxLDIwNSwKKwkxMCw0MiwxOTgsMTAsMjA1LDkxLDEwLDI0Miw5Nyw4LDIzNyw5MSwKKwkyMDcsMTAsNDIsMjA1LDEwLDI1LDIyOSwyMDUsMzcsMywxNzUsNTAsCisJMTk3LDEwLDE5NSwxMTgsMTAsMjA1LDI5LDMsMzMsMCwwLDU3LAorCTI0OSwxOTUsMTE4LDEwLDIwNSwxMDYsMTAsNTgsMjAyLDEwLDE4Myw0MCwKKwkyMiwyMDUsMTQsNywyMzcsOTEsMjA5LDEwLDE5LDE5LDE5LDIwNSwKKwk5MSwxMCwyNDIsMTM5LDgsMzMsMSwwLDE5NSwxMTgsMTAsMzMsCisJMCwwLDE5NSwxMTgsMTAsMjA1LDEyNiwxMCwyNTIsMjU1LDIwNSwxMDgsCisJOCwxMjUsMTgwLDE5NCwxMTgsMTAsMjM3LDkxLDIwMCwxMCwzMywwLAorCTAsMjA1LDkxLDEwLDI0MiwxMTgsMTAsMjM3LDkxLDIwNywxMCw0MiwKKwkxOTgsMTAsMjUsMjIxLDExNywyNTQsMjIxLDExNiwyNTUsMzUsMzUsMzUsCisJMjI5LDIwNSw3MCw3LDE5MywxMjQsMjMwLDMsMTAzLDM1LDM1LDM1LAorCTIyMSwxMTcsMjUyLDIyMSwxMTYsMjUzLDIyOSwyMjEsMTEwLDI1NCwyMjEsMTAyLAorCTI1NSwyMjksMzMsMjEyLDEwLDIyOSwyMDUsMTI0LDYsMTkzLDE5MywyMjEsCisJMTEwLDI1MiwyMjEsMTAyLDI1MywzNCwyMDksMTAsMzMsMjExLDEwLDU0LAorCTQsMzMsMjA5LDEwLDIyNywyMDUsMTQ3LDYsMTkzLDYyLDEsNTAsCisJMjAyLDEwLDI0MywyMjEsOTQsMjUyLDIyMSw4NiwyNTMsNDIsMjAwLDEwLAorCTE4MywyMzcsODIsMzQsMjAwLDEwLDIwMywxMjQsNDAsMTcsMzMsMCwKKwkwLDM0LDIwMCwxMCwzNCwyMDUsMTAsMzQsMTk4LDEwLDUwLDE5NywKKwkxMCwyNCwzNywyMjEsOTQsMjUyLDIyMSw4NiwyNTMsNDIsMTk4LDEwLAorCTI1LDM0LDE5OCwxMCwyMzcsOTEsMjAzLDEwLDMzLDE1OCwyNTMsMjUsCisJMjM3LDkxLDE5OCwxMCwyMDUsOTEsMTAsMjQyLDY4LDksMzMsMCwKKwkwLDM0LDE5OCwxMCwyMDUsNSw4LDMzLDAsMCw1NywyNDksCisJMjUxLDE5NSwxMTgsMTAsMjA1LDEwNiwxMCwzMyw0OSwxMywxMjYsMTgzLAorCTQwLDE2LDIwNSw0Miw3LDIzNyw5MSw0NywxMywxOSwxOSwxOSwKKwkyMDUsOTEsMTAsMjQyLDExNyw5LDU4LDE0MiwxNSwxOTgsMSw1MCwKKwkxNDIsMTUsMTk1LDExOCwxMCwzMyw0OSwxMywxMjYsMjU0LDEsNDAsCisJMjUsMjU0LDMsMjAyLDcsMTAsMjU0LDUsMjAyLDIxLDEwLDMzLAorCTQ5LDEzLDU0LDAsMzMsNDcsMTMsMjI5LDIwNSwyMDcsNiwxOTUsCisJMTE4LDEwLDU4LDE0MSwxNSwxODMsMzIsNzIsMzMsNTEsMTMsMTI2LAorCTUwLDE0OSwxMCwyMDUsODYsNywzMyw1MCwxMywxMjYsMjMwLDEyNywKKwkxODMsMzIsNDAsNTgsMTQyLDE1LDIzMCwxMjcsNTAsMTQyLDE1LDE4MywKKwkzMiw1LDE5OCwxLDUwLDE0MiwxNSwzMyw1MCwxMywxMjYsMTExLAorCTIzLDE1OSwxMDMsMjAzLDEyNSw1OCwxNDIsMTUsNDAsNSwxOTgsMTI4LAorCTUwLDE0MiwxNSwzMyw1MCwxMywxMTksMzMsNTAsMTMsMTI2LDExMSwKKwkyMywxNTksMTAzLDIyOSwyMDUsMjM3LDUsMTkzLDMzLDIxMSwxMCw1NCwKKwkyLDMzLDIsMCwzNCwyMDksMTAsNTgsMTU0LDEwLDMzLDIxMiwKKwkxMCwxMTksNTgsMTQ4LDEwLDMzLDIxMywxMCwxMTksMzMsMjA5LDEwLAorCTIyOSwyMDUsMTQ3LDYsMTkzLDI0LDEyOCw0Miw0NywxMywyMjksMzMsCisJNTAsMTMsMjI5LDIwNSwxOTEsNCwxOTMsMjQsMjM5LDMzLDIxMSwxMCwKKwk1NCw2LDMzLDMsMCwzNCwyMDksMTAsNTgsMTU0LDEwLDMzLAorCTIxMiwxMCwxMTksNTgsMTQ4LDEwLDMzLDIxMywxMCwxMTksMzMsMjE0LAorCTEwLDU0LDUsMzMsMjA5LDEwLDIyOSwyMDUsMTQ3LDYsMjQsMjAwLAorCTIwNSwxMDYsMTAsMzMsNDksMTMsNTQsMCwzMyw0NywxMywyMjksCisJMjA1LDIwNyw2LDMzLDIwOSwxMCwyMjcsMjA1LDE0Nyw2LDE5MywyMDUsCisJODAsOSwyMDUsMTQ1LDgsMjQsMjQ4LDEyNCwxNzAsMjUwLDk5LDEwLAorCTIzNyw4MiwyMDEsMTI0LDIzMCwxMjgsMjM3LDgyLDYwLDIwMSwyMjUsMjUzLAorCTIyOSwyMjEsMjI5LDIyMSwzMywwLDAsMjIxLDU3LDIzMywyMjEsMjQ5LAorCTIyMSwyMjUsMjUzLDIyNSwyMDEsMjMzLDIyNSwyNTMsMjI5LDIyMSwyMjksMjIxLAorCTMzLDAsMCwyMjEsNTcsOTQsMzUsODYsMzUsMjM1LDU3LDI0OSwKKwkyMzUsMjMzLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwCisJfSA7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2lwZGRwLmMgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvaXBkZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTQ0YTc5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2lwZGRwLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKglpcGRkcC5jOiBJUCB0byBBcHBsZXRhbGstSVAgRW5jYXBzdWxhdGlvbiBkcml2ZXIgZm9yIExpbnV4CisgKgkJIEFwcGxldGFsay1JUCB0byBJUCBEZWNhcHN1bGF0aW9uIGRyaXZlciBmb3IgTGludXgKKyAqCisgKglBdXRob3JzOgorICogICAgICAtIEREUC1JUCBFbmNhcCBieTogQnJhZGZvcmQgVy4gSm9obnNvbiA8am9obnMzOTNAbWFyb29uLnRjLnVtbi5lZHU+CisgKgktIEREUC1JUCBEZWNhcCBieTogSmF5IFNjaHVsaXN0IDxqc2NobHN0QHNhbWJhLm9yZz4KKyAqCisgKglEZXJpdmVkIGZyb206CisgKgktIEFsbW9zdCBhbGwgY29kZSBhbHJlYWR5IGV4aXN0ZWQgaW4gbmV0L2FwcGxldGFsay9kZHAuYyBJIGp1c3QKKyAqCSAgbW92ZWQvcmVvcmdpbml6ZWQgaXQgaW50byBhIGRyaXZlciBmaWxlLiBPcmlnaW5hbCBJUC1vdmVyLUREUCBjb2RlCisgKgkgIHdhcyBkb25lIGJ5IEJyYWRmb3JkIFcuIEpvaG5zb24gPGpvaG5zMzkzQG1hcm9vbi50Yy51bW4uZWR1PgorICogICAgICAtIHNrZWxldG9uLmM6IEEgbmV0d29yayBkcml2ZXIgb3V0bGluZSBmb3IgbGludXguCisgKiAgICAgICAgV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisgKgktIGR1bW15LmM6IEEgZHVtbXkgbmV0IGRyaXZlci4gQnkgTmljayBIb2xsb3dheS4KKyAqCS0gTWFjR2F0ZTogQSB1c2VyIHNwYWNlIERhZW1vbiBmb3IgQXBwbGV0YWxrLUlQIERlY2FwIGZvcgorICoJICBMaW51eCBieSBKYXkgU2NodWxpc3QgPGpzY2hsc3RAc2FtYmEub3JnPgorICoKKyAqICAgICAgQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICogICAgICBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorICoKKyAqICAgICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogICAgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0YWxrLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImlwZGRwLmgiCQkvKiBPdXIgc3R1ZmYgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0gS0VSTl9JTkZPICJpcGRkcC5jOnYwLjAxIDgvMjgvOTcgQnJhZGZvcmQgVy4gSm9obnNvbiA8am9obnMzOTNAbWFyb29uLnRjLnVtbi5lZHU+XG4iOworCitzdGF0aWMgc3RydWN0IGlwZGRwX3JvdXRlICppcGRkcF9yb3V0ZV9saXN0OworCisjaWZkZWYgQ09ORklHX0lQRERQX0VOQ0FQCitzdGF0aWMgaW50IGlwZGRwX21vZGUgPSBJUEREUF9FTkNBUDsKKyNlbHNlCitzdGF0aWMgaW50IGlwZGRwX21vZGUgPSBJUEREUF9ERUNBUDsKKyNlbmRpZgorCisvKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCitzdGF0aWMgaW50IGlwZGRwX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlwZGRwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaXBkZHBfY3JlYXRlKHN0cnVjdCBpcGRkcF9yb3V0ZSAqbmV3X3J0KTsKK3N0YXRpYyBpbnQgaXBkZHBfZGVsZXRlKHN0cnVjdCBpcGRkcF9yb3V0ZSAqcnQpOworc3RhdGljIHN0cnVjdCBpcGRkcF9yb3V0ZSogaXBkZHBfZmluZF9yb3V0ZShzdHJ1Y3QgaXBkZHBfcm91dGUgKnJ0KTsKK3N0YXRpYyBpbnQgaXBkZHBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBpcGRkcF9pbml0KHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBlcnI7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJc3RyY3B5KGRldi0+bmFtZSwgImlwZGRwJWQiKTsKKworCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorICAgICAgICAgICAgICAgIHByaW50ayh2ZXJzaW9uKTsKKworCS8qIEluaXRhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKyAgICAgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpcGRkcF94bWl0OworICAgICAgICBkZXYtPmdldF9zdGF0cyAgICAgID0gaXBkZHBfZ2V0X3N0YXRzOworICAgICAgICBkZXYtPmRvX2lvY3RsICAgICAgID0gaXBkZHBfaW9jdGw7CisKKyAgICAgICAgZGV2LT50eXBlID0gQVJQSFJEX0lQRERQOyAgICAgICAJLyogSVAgb3ZlciBERFAgdHVubmVsICovCisgICAgICAgIGRldi0+bXR1ID0gNTg1OworICAgICAgICBkZXYtPmZsYWdzIHw9IElGRl9OT0FSUDsKKworICAgICAgICAvKgorICAgICAgICAgKiAgICAgIFRoZSB3b3JzdCBjYXNlIGhlYWRlciB3ZSB3aWxsIG5lZWQgaXMgY3VycmVudGx5IGEKKyAgICAgICAgICogICAgICBldGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKSBhbmQgYSBkZHAgaGVhZGVyIChzaXplb2YgZGRwZWhkcisxKQorICAgICAgICAgKiAgICAgIFdlIHNlbmQgb3ZlciBTTkFQIHNvIHRoYXQgdGFrZXMgYW5vdGhlciA4IGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSAxNCs4K3NpemVvZihzdHJ1Y3QgZGRwZWhkcikrMTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CisKKwkvKiBMZXQgdGhlIHVzZXIgbm93IHdoYXQgbW9kZSB3ZSBhcmUgaW4gKi8KKwlpZihpcGRkcF9tb2RlID09IElQRERQX0VOQ0FQKQorCQlwcmludGsoIiVzOiBBcHBsZXRhbGstSVAgRW5jYXAuIG1vZGUgYnkgQnJhZGZvcmQgVy4gSm9obnNvbiA8am9obnMzOTNAbWFyb29uLnRjLnVtbi5lZHU+XG4iLCAKKwkJCWRldi0+bmFtZSk7CisJaWYoaXBkZHBfbW9kZSA9PSBJUEREUF9ERUNBUCkKKwkJcHJpbnRrKCIlczogQXBwbGV0YWxrLUlQIERlY2FwLiBtb2RlIGJ5IEpheSBTY2h1bGlzdCA8anNjaGxzdEBzYW1iYS5vcmc+XG4iLCAKKwkJCWRldi0+bmFtZSk7CisKKyAgICAgICAgcmV0dXJuIGRldjsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yIGNsb3NlZC4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppcGRkcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgcmV0dXJuIGRldi0+cHJpdjsKK30KKworLyoKKyAqIFRyYW5zbWl0IExMQVAvRUxBUCBmcmFtZSB1c2luZyBhYXJwX3NlbmRfZGRwLgorICovCitzdGF0aWMgaW50IGlwZGRwX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MzIgcGFkZHIgPSAoKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0KS0+cnRfZ2F0ZXdheTsKKyAgICAgICAgc3RydWN0IGRkcGVoZHIgKmRkcDsKKyAgICAgICAgc3RydWN0IGlwZGRwX3JvdXRlICpydDsKKyAgICAgICAgc3RydWN0IGF0YWxrX2FkZHIgKm91cl9hZGRyOworCisJLyoKKyAgICAgICAgICogRmluZCBhcHByb3ByaWF0ZSByb3V0ZSB0byB1c2UsIGJhc2VkIG9ubHkgb24gSVAgbnVtYmVyLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yKHJ0ID0gaXBkZHBfcm91dGVfbGlzdDsgcnQgIT0gTlVMTDsgcnQgPSBydC0+bmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHJ0LT5pcCA9PSBwYWRkcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmKHJ0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgb3VyX2FkZHIgPSBhdGFsa19maW5kX2Rldl9hZGRyKHJ0LT5kZXYpOworCisJaWYoaXBkZHBfbW9kZSA9PSBJUEREUF9ERUNBUCkKKwkJLyogCisJCSAqIFB1bGwgb2ZmIHRoZSBleGNlc3Mgcm9vbSB0aGF0IHNob3VsZCBub3QgYmUgdGhlcmUuCisJCSAqIFRoaXMgaXMgZHVlIHRvIGEgaGFyZC1oZWFkZXIgcHJvYmxlbS4gVGhpcyBpcyB0aGUKKwkJICogcXVpY2sgZml4IGZvciBub3cgdGhvdWdoLCB0aWxsIGl0IGJyZWFrcy4KKwkJICovCisJCXNrYl9wdWxsKHNrYiwgMzUtKHNpemVvZihzdHJ1Y3QgZGRwZWhkcikrMSkpOworCisJLyogQ3JlYXRlIHRoZSBFeHRlbmRlZCBERFAgaGVhZGVyICovCisJZGRwID0gKHN0cnVjdCBkZHBlaGRyICopc2tiLT5kYXRhOworICAgICAgICBkZHAtPmRlaF9sZW4gPSBza2ItPmxlbjsKKyAgICAgICAgZGRwLT5kZWhfaG9wcyA9IDE7CisgICAgICAgIGRkcC0+ZGVoX3BhZCA9IDA7CisgICAgICAgIGRkcC0+ZGVoX3N1bSA9IDA7CisKKwkvKgorICAgICAgICAgKiBGb3IgTG9jYWx0YWxrIHdlIG5lZWQgYWFycF9zZW5kX2RkcCB0byBzdHJpcCB0aGUKKyAgICAgICAgICogbG9uZyBERFAgaGVhZGVyIGFuZCBwbGFjZSBhIHNob3QgRERQIGhlYWRlciBvbiBpdC4KKyAgICAgICAgICovCisgICAgICAgIGlmKHJ0LT5kZXYtPnR5cGUgPT0gQVJQSFJEX0xPQ0FMVExLKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgZGRwLT5kZWhfZG5ldCAgPSAwOyAgIC8qIEZJWE1FIG1vcmUgaG9wcz8/ICovCisgICAgICAgICAgICAgICAgZGRwLT5kZWhfc25ldCAgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGRkcC0+ZGVoX2RuZXQgID0gcnQtPmF0LnNfbmV0OyAgIC8qIEZJWE1FIG1vcmUgaG9wcz8/ICovCisgICAgICAgICAgICAgICAgZGRwLT5kZWhfc25ldCAgPSBvdXJfYWRkci0+c19uZXQ7CisgICAgICAgIH0KKyAgICAgICAgZGRwLT5kZWhfZG5vZGUgPSBydC0+YXQuc19ub2RlOworICAgICAgICBkZHAtPmRlaF9zbm9kZSA9IG91cl9hZGRyLT5zX25vZGU7CisgICAgICAgIGRkcC0+ZGVoX2Rwb3J0ID0gNzI7CisgICAgICAgIGRkcC0+ZGVoX3Nwb3J0ID0gNzI7CisKKyAgICAgICAgKigoX191OCAqKShkZHArMSkpID0gMjI7ICAgICAgICAJLyogZGRwIHR5cGUgPSBJUCAqLworICAgICAgICAqKChfX3UxNiAqKWRkcCk9bnRvaHMoKigoX191MTYgKilkZHApKTsJLyogZml4IHVwIGxlbmd0aCBmaWVsZCAqLworCisgICAgICAgIHNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BVEFMSyk7ICAgICAvKiBQcm90b2NvbCBoYXMgY2hhbmdlZCAqLworCisJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSBkZXYtPnByaXYpLT50eF9wYWNrZXRzKys7CisgICAgICAgICgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgZGV2LT5wcml2KS0+dHhfYnl0ZXMrPXNrYi0+bGVuOworCisgICAgICAgIGlmKGFhcnBfc2VuZF9kZHAocnQtPmRldiwgc2tiLCAmcnQtPmF0LCBOVUxMKSA8IDApCisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYihza2IpOworCisgICAgICAgIHJldHVybiAwOworfQorCisvKgorICogQ3JlYXRlIGEgcm91dGluZyBlbnRyeS4gV2UgZmlyc3QgdmVyaWZ5IHRoYXQgdGhlCisgKiByZWNvcmQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gSWYgaXQgZG9lcyB3ZSByZXR1cm4gLUVFWElTVAorICovCitzdGF0aWMgaW50IGlwZGRwX2NyZWF0ZShzdHJ1Y3QgaXBkZHBfcm91dGUgKm5ld19ydCkKK3sKKyAgICAgICAgc3RydWN0IGlwZGRwX3JvdXRlICpydCA9KHN0cnVjdCBpcGRkcF9yb3V0ZSopIGttYWxsb2Moc2l6ZW9mKCpydCksIEdGUF9LRVJORUwpOworCisgICAgICAgIGlmIChydCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgICAgIHJ0LT5pcCA9IG5ld19ydC0+aXA7CisgICAgICAgIHJ0LT5hdCA9IG5ld19ydC0+YXQ7CisgICAgICAgIHJ0LT5uZXh0ID0gTlVMTDsKKyAgICAgICAgaWYgKChydC0+ZGV2ID0gYXRydHJfZ2V0X2RldigmcnQtPmF0KSkgPT0gTlVMTCkgeworCQlrZnJlZShydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTkVUVU5SRUFDSDsKKyAgICAgICAgfQorCisJaWYgKGlwZGRwX2ZpbmRfcm91dGUocnQpKSB7CisJCWtmcmVlKHJ0KTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisgICAgICAgIHJ0LT5uZXh0ID0gaXBkZHBfcm91dGVfbGlzdDsKKyAgICAgICAgaXBkZHBfcm91dGVfbGlzdCA9IHJ0OworCisgICAgICAgIHJldHVybiAwOworfQorCisvKgorICogRGVsZXRlIGEgcm91dGUsIHdlIG9ubHkgZGVsZXRlIGEgRlVMTCBtYXRjaC4KKyAqIElmIHJvdXRlIGRvZXMgbm90IGV4aXN0IHdlIHJldHVybiAtRU5PRU5ULgorICovCitzdGF0aWMgaW50IGlwZGRwX2RlbGV0ZShzdHJ1Y3QgaXBkZHBfcm91dGUgKnJ0KQoreworICAgICAgICBzdHJ1Y3QgaXBkZHBfcm91dGUgKipyID0gJmlwZGRwX3JvdXRlX2xpc3Q7CisgICAgICAgIHN0cnVjdCBpcGRkcF9yb3V0ZSAqdG1wOworCisgICAgICAgIHdoaWxlKCh0bXAgPSAqcikgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHRtcC0+aXAgPT0gcnQtPmlwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0bXAtPmF0LnNfbmV0ID09IHJ0LT5hdC5zX25ldAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdG1wLT5hdC5zX25vZGUgPT0gcnQtPmF0LnNfbm9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqciA9IHRtcC0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgciA9ICZ0bXAtPm5leHQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKC1FTk9FTlQpOworfQorCisvKgorICogRmluZCBhIHJvdXRpbmcgZW50cnksIHdlIG9ubHkgcmV0dXJuIGEgRlVMTCBtYXRjaAorICovCitzdGF0aWMgc3RydWN0IGlwZGRwX3JvdXRlKiBpcGRkcF9maW5kX3JvdXRlKHN0cnVjdCBpcGRkcF9yb3V0ZSAqcnQpCit7CisgICAgICAgIHN0cnVjdCBpcGRkcF9yb3V0ZSAqZjsKKworICAgICAgICBmb3IoZiA9IGlwZGRwX3JvdXRlX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihmLT5pcCA9PSBydC0+aXAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGYtPmF0LnNfbmV0ID09IHJ0LT5hdC5zX25ldAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZi0+YXQuc19ub2RlID09IHJ0LT5hdC5zX25vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKK30KKworc3RhdGljIGludCBpcGRkcF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKyAgICAgICAgc3RydWN0IGlwZGRwX3JvdXRlIF9fdXNlciAqcnQgPSBpZnItPmlmcl9kYXRhOworICAgICAgICBzdHJ1Y3QgaXBkZHBfcm91dGUgcmNwOworCisgICAgICAgIGlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgICAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisKKwlpZihjb3B5X2Zyb21fdXNlcigmcmNwLCBydCwgc2l6ZW9mKHJjcCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworICAgICAgICBzd2l0Y2goY21kKQorICAgICAgICB7CisJCWNhc2UgU0lPQ0FERElQRERQUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGlwZGRwX2NyZWF0ZSgmcmNwKSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNJT0NGSU5ESVBERFBSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvcHlfdG9fdXNlcihydCwgaXBkZHBfZmluZF9yb3V0ZSgmcmNwKSwgc2l6ZW9mKHN0cnVjdCBpcGRkcF9yb3V0ZSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgY2FzZSBTSU9DREVMSVBERFBSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaXBkZHBfZGVsZXRlKCZyY3ApKTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9pcGRkcDsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtKGlwZGRwX21vZGUsIGludCwgMCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGlwZGRwX2luaXRfbW9kdWxlKHZvaWQpCit7CisJZGV2X2lwZGRwID0gaXBkZHBfaW5pdCgpOworICAgICAgICBpZiAoSVNfRVJSKGRldl9pcGRkcCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIoZGV2X2lwZGRwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlwZGRwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisgICAgICAgIHN0cnVjdCBpcGRkcF9yb3V0ZSAqcDsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldl9pcGRkcCk7CisgICAgICAgIGZyZWVfbmV0ZGV2KGRldl9pcGRkcCk7CisKKyAgICAgICAgd2hpbGUgKGlwZGRwX3JvdXRlX2xpc3QpIHsKKyAgICAgICAgICAgICAgICBwID0gaXBkZHBfcm91dGVfbGlzdC0+bmV4dDsKKyAgICAgICAgICAgICAgICBrZnJlZShpcGRkcF9yb3V0ZV9saXN0KTsKKyAgICAgICAgICAgICAgICBpcGRkcF9yb3V0ZV9saXN0ID0gcDsKKyAgICAgICAgfQorfQorCittb2R1bGVfaW5pdChpcGRkcF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChpcGRkcF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvaXBkZHAuaCBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9pcGRkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMDcyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvaXBkZHAuaApAQCAtMCwwICsxLDI3IEBACisvKgorICoJaXBkZHAuaDogSGVhZGVyIGZvciBJUC1vdmVyLUREUCBkcml2ZXIgZm9yIExpbnV4LgorICovCisKKyNpZm5kZWYgX19MSU5VWF9JUEREUF9ICisjZGVmaW5lIF9fTElOVVhfSVBERFBfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIFNJT0NBRERJUEREUFJUICAgKFNJT0NERVZQUklWQVRFKQorI2RlZmluZSBTSU9DREVMSVBERFBSVCAgIChTSU9DREVWUFJJVkFURSsxKQorI2RlZmluZSBTSU9DRklORElQRERQUlQgIChTSU9DREVWUFJJVkFURSsyKQorCitzdHJ1Y3QgaXBkZHBfcm91dGUKK3sKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsgICAgICAgICAgICAgLyogQ2FycmllciBkZXZpY2UgKi8KKyAgICAgICAgX191MzIgaXA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBJUCBhZGRyZXNzICovCisgICAgICAgIHN0cnVjdCBhdGFsa19hZGRyIGF0OyAgICAgICAgICAgICAgLyogR2F0ZXdheSBhcHBsZXRhbGsgYWRkcmVzcyAqLworICAgICAgICBpbnQgZmxhZ3M7CisgICAgICAgIHN0cnVjdCBpcGRkcF9yb3V0ZSAqbmV4dDsKK307CisKKyNkZWZpbmUgSVBERFBfRU5DQVAJMQorI2RlZmluZSBJUEREUF9ERUNBUAkyCisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX19MSU5VWF9JUEREUF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvbHRwYy5jIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2x0cGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDhlOTQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2x0cGMuYwpAQCAtMCwwICsxLDEzMTMgQEAKKy8qKiogICAgbHRwYy5jIC0tIGEgZHJpdmVyIGZvciB0aGUgTG9jYWxUYWxrIFBDIGNhcmQuCisgKgorICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTUsMTk5NiBCcmFkZm9yZCBXLiBKb2huc29uIDxqb2huczM5M0BtYXJvb24udGMudW1uLmVkdT4KKyAqCisgKiAgICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICAgICAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgICAgIFRoaXMgaXMgQUxQSEEgY29kZSBhdCBiZXN0LiAgSXQgbWF5IG5vdCB3b3JrIGZvciB5b3UuICBJdCBtYXkKKyAqICAgICAgZGFtYWdlIHlvdXIgZXF1aXBtZW50LiAgSXQgbWF5IGRhbWFnZSB5b3VyIHJlbGF0aW9ucyB3aXRoIG90aGVyCisgKiAgICAgIHVzZXJzIG9mIHlvdXIgbmV0d29yay4gIFVzZSBpdCBhdCB5b3VyIG93biByaXNrIQorICoKKyAqICAgICAgQmFzZWQgaW4gcGFydCBvbjoKKyAqICAgICAgc2tlbGV0b24uYyAgICAgIGJ5IERvbmFsZCBCZWNrZXIKKyAqICAgICAgZHVtbXkuYyAgICAgICAgIGJ5IE5pY2sgSG9sbG93YXkgYW5kIEFsYW4gQ294CisgKiAgICAgIGxvb3BiYWNrLmMgICAgICBieSBSb3NzIEJpcm8sIEZyZWQgdmFuIEthbXBlbiwgRG9uYWxkIEJlY2tlcgorICogICAgICB0aGUgbmV0YXRhbGsgc291cmNlIGNvZGUgKFVNSUNIKQorICogICAgICBsb3RzIG9mIHdvcmsgb24gdGhlIGNhcmQuLi4KKyAqCisgKiAgICAgIEkgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSAocHJvcHJpZXRhcnkpIFNESyB0aGF0IGdvZXMgd2l0aCB0aGUgY2FyZC4KKyAqICAgICAgSWYgeW91IGRvLCBJIGRvbid0IHdhbnQgdG8ga25vdyBhYm91dCBpdCwgYW5kIHlvdSBjYW4gcHJvYmFibHkgd3JpdGUKKyAqICAgICAgYSBiZXR0ZXIgZHJpdmVyIHlvdXJzZWxmIGFueXdheS4gIFRoaXMgZG9lcyBtZWFuIHRoYXQgdGhlIHBpZWNlcyB0aGF0CisgKiAgICAgIHRhbGsgdG8gdGhlIGNhcmQgYXJlIGd1ZXNzd29yayBvbiBteSBwYXJ0LCBzbyB1c2UgYXQgeW91ciBvd24gcmlzayEKKyAqCisgKiAgICAgIFRoaXMgaXMgbXkgZmlyc3QgdHJ5IGF0IHdyaXRpbmcgTGludXggbmV0d29ya2luZyBjb2RlLCBhbmQgaXMgYWxzbworICogICAgICBndWVzc3dvcmsuICBBZ2FpbiwgdXNlIGF0IHlvdXIgb3duIHJpc2shICAoQWx0aG91Z2ggb24gdGhpcyBwYXJ0LCBJJ2QKKyAqICAgICAgd2VsY29tZSBzdWdnZXN0aW9ucykKKyAqCisgKiAgICAgIFRoaXMgaXMgYSBsb2FkYWJsZSBrZXJuZWwgbW9kdWxlIHdoaWNoIHNlZW1zIHRvIHdvcmsgYXQgbXkgc2l0ZQorICogICAgICBjb25zaXN0aW5nIG9mIGEgMS4yLjEzIGxpbnV4IGJveCBydW5uaW5nIG5ldGF0YWxrIDEuMy4zLCBhbmQgd2l0aAorICogICAgICB0aGUga2VybmVsIHN1cHBvcnQgZnJvbSAxLjMuM2IyIGluY2x1ZGluZyBwYXRjaGVzIHJvdXRpbmcucGF0Y2gKKyAqICAgICAgYW5kIGRkcC5kaXNhcHBlYXJzLmZyb20uY2hvb3Nlci4gIEluIG9yZGVyIHRvIHJ1biBpdCwgeW91IHdpbGwgbmVlZAorICogICAgICB0byBwYXRjaCBkZHAuYyBhbmQgYWFycC5jIGluIHRoZSBrZXJuZWwsIGJ1dCBvbmx5IGEgbGl0dGxlLi4uCisgKgorICogICAgICBJJ20gZmFpcmx5IGNvbmZpZGVudCB0aGF0IHdoaWxlIHRoaXMgaXMgYXJndWFibHkgYmFkbHkgd3JpdHRlbiwgdGhlCisgKiAgICAgIHByb2JsZW1zIHRoYXQgcGVvcGxlIGV4cGVyaWVuY2Ugd2lsbCBiZSAiaGlnaGVyIGxldmVsIiwgdGhhdCBpcywgd2l0aAorICogICAgICBjb21wbGljYXRpb25zIGluIHRoZSBuZXRhdGFsayBjb2RlLiAgVGhlIGRyaXZlciBpdHNlbGYgZG9lc24ndCBkbworICogICAgICBhbnl0aGluZyB0ZXJyaWJseSBjb21wbGljYXRlZCAtLSBpdCBwcmV0ZW5kcyB0byBiZSBhbiBldGhlciBkZXZpY2UKKyAqICAgICAgYXMgZmFyIGFzIG5ldGF0YWxrIGlzIGNvbmNlcm5lZCwgc3RyaXBzIHRoZSBERFAgZGF0YSBvdXQgb2YgdGhlIGV0aGVyCisgKiAgICAgIGZyYW1lIGFuZCBidWlsZHMgYSBMTEFQIHBhY2tldCB0byBzZW5kIG91dCB0aGUgY2FyZC4gIEluIHRoZSBvdGhlcgorICogICAgICBkaXJlY3Rpb24sIGl0IHJlY2VpdmVzIExMQVAgZnJhbWVzIGZyb20gdGhlIGNhcmQgYW5kIGJ1aWxkcyBhIGZha2UKKyAqICAgICAgZXRoZXIgcGFja2V0IHRoYXQgaXQgdGhlbiB0b3NzZXMgdXAgdG8gdGhlIG5ldHdvcmtpbmcgY29kZS4gIFlvdSBjYW4KKyAqICAgICAgYXJndWUgKGNvcnJlY3RseSkgdGhhdCB0aGlzIGlzIGFuIHVnbHkgd2F5IHRvIGRvIHRoaW5ncywgYnV0IGl0CisgKiAgICAgIHJlcXVpcmVzIGEgbWluaW1hbCBhbW91bnQgb2YgZm9vbGluZyB3aXRoIHRoZSBjb2RlIGluIGRkcC5jIGFuZCBhYXJwLmMuCisgKgorICogICAgICBUaGUgY2FyZCB3aWxsIGRvIGEgbG90IG1vcmUgdGhhbiBpcyB1c2VkIGhlcmUgLS0gSSAqdGhpbmsqIGl0IGhhcyB0aGUKKyAqICAgICAgbGF5ZXJzIHVwIHRocm91Z2ggQVRQLiAgRXZlbiBpZiB5b3Uga25ldyBob3cgdGhhdCBwYXJ0IHdvcmtzICh3aGljaCBJCisgKiAgICAgIGRvbid0KSBpdCB3b3VsZCBiZSBhIGJpZyBqb2IgdG8gY2FydmUgdXAgdGhlIGtlcm5lbCBkZHAgY29kZSB0byBpbnNlcnQKKyAqICAgICAgdGhpbmdzIGF0IGEgaGlnaGVyIGxldmVsLCBhbmQgcHJvYmFibHkgYSBiYWQgaWRlYS4uLgorICoKKyAqICAgICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG90aGVyIGNhcmRzIHRoYXQgZG8gTG9jYWxUYWxrIG9uIHRoZSBQQy4gIElmCisgKiAgICAgIG5vYm9keSBmaW5kcyBhbnkgaW5zdXJtb3VudGFibGUgKGF0IHRoZSBuZXRhdGFsayBsZXZlbCkgcHJvYmxlbXMKKyAqICAgICAgaGVyZSwgdGhpcyBkcml2ZXIgc2hvdWxkIGVuY291cmFnZSBwZW9wbGUgdG8gcHV0IHNvbWUgd29yayBpbnRvIHRoZQorICogICAgICBvdGhlciBjYXJkcyAoc29tZSBvZiB3aGljaCBJIGdhdGhlciBhcmUgc3RpbGwgY29tbWVyY2lhbGx5IGF2YWlsYWJsZSkKKyAqICAgICAgYW5kIGFsc28gdG8gcHV0IGhvb2tzIGZvciBMb2NhbFRhbGsgaW50byB0aGUgb2ZmaWNpYWwgZGRwIGNvZGUuCisgKgorICogICAgICBJIHdlbGNvbWUgY29tbWVudHMgYW5kIHN1Z2dlc3Rpb25zLiAgVGhpcyBpcyBteSBmaXJzdCB0cnkgYXQgTGludXgKKyAqICAgICAgbmV0d29ya2luZyBzdHVmZiwgYW5kIHRoZXJlIGFyZSBwcm9iYWJseSBsb3RzIG9mIHRoaW5ncyB0aGF0IEkgZGlkCisgKiAgICAgIHN1Ym9wdGltYWxseS4gIAorICoKKyAqKiovCisKKy8qKioKKyAqCisgKiAkTG9nOiBsdHBjLmMsdiAkCisgKiBSZXZpc2lvbiAxLjEuMi4xICAyMDAwLzAzLzAxIDA1OjM1OjA3ICBqZ2FyemlrCisgKiBhdCBhbmQgdHIgY2xlYW51cAorICoKKyAqIFJldmlzaW9uIDEuOCAgMTk5Ny8wMS8yOCAwNTo0NDo1NCAgYnJhZGZvcmQKKyAqIENsZWFuIHVwIGZvciBub24tbW9kdWxlIGEgbGl0dGxlLgorICogSGFja2VkIGFib3V0IGEgYml0IHRvIGNsZWFuIHRoaW5ncyB1cCAtIEFsYW4gQ294IAorICogUHJvYmFibHkgYnJva2VuIGl0IGZyb20gdGhlIG9yaWdpbmEgMS44CisgKgorCisgKiAxOTk4LzExLzA5OiBEYXZpZCBIdWdnaW5zLURhaW5lcyA8ZGhkQGRlYmlhbi5vcmc+CisgKiBDbGVhbmVkIHVwIHRoZSBpbml0aWFsaXphdGlvbiBjb2RlIHRvIHVzZSB0aGUgc3RhbmRhcmQgYXV0b2lycSBtZXRob2RzLAorICAgYW5kIHRvIHByb2JlIGZvciB0aGluZ3MgaW4gdGhlIHN0YW5kYXJkIG9yZGVyIG9mIGkvbywgaXJxLCBkbWEuICBUaGlzCisgICByZW1vdmVzIHRoZSAicmVzZXQgdGhlIHJlc2V0IiBoYWNrLCBiZWNhdXNlIEkgY291bGRuJ3QgZmlndXJlIG91dCBhbgorICAgZWFzeSB3YXkgdG8gZ2V0IHRoZSBjYXJkIHRvIHRyaWdnZXIgYW4gaW50ZXJydXB0IGFmdGVyIGl0LgorICogQWRkZWQgc3VwcG9ydCBmb3IgcGFzc2luZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgb24gdGhlIGtlcm5lbCBjb21tYW5kCisgICBsaW5lIGFuZCB0aHJvdWdoIGluc21vZAorICogQ2hhbmdlZCB0aGUgZGV2aWNlIG5hbWUgZnJvbSAibHRhbGswIiB0byAibHQwIiwgYm90aCB0byBjb25mb3JtIHdpdGggdGhlCisgICBvdGhlciBsb2NhbHRhbGsgZHJpdmVyLCBhbmQgdG8gY2xlYXIgdXAgdGhlIGluY29uc2lzdGVuY3kgYmV0d2VlbiB0aGUKKyAgIG1vZHVsZSBhbmQgdGhlIG5vbi1tb2R1bGUgdmVyc2lvbnMgb2YgdGhlIGRyaXZlciA6LSkKKyAqIEFkZGVkIGEgYnVuY2ggb2YgY29tbWVudHMgKEkgd2FzIGdvaW5nIHRvIG1ha2Ugc29tZSBlbnVtcyBmb3IgdGhlIHN0YXRlCisgICBjb2RlcyBhbmQgdGhlIHJlZ2lzdGVyIG9mZnNldHMsIGJ1dCBJJ20gc3RpbGwgbm90IHN1cmUgZXhhY3RseSB3aGF0IHRoZWlyCisgICBzZW1hbnRpY3MgYXJlKQorICogRG9uJ3QgcG9sbCBhbnltb3JlIGluIGludGVycnVwdC1kcml2ZW4gbW9kZQorICogSXQgc2VlbXMgdG8gd29yayBhcyBhIG1vZHVsZSBub3cgKGFzIG9mIDIuMS4xMjcpLCBidXQgSSBkb24ndCB0aGluaworICAgSSdtIHJlc3BvbnNpYmxlIGZvciB0aGF0Li4uCisKKyAqCisgKiBSZXZpc2lvbiAxLjcgIDE5OTYvMTIvMTIgMDM6NDI6MzMgIGJyYWRmb3JkCisgKiBETUEgYWxsb2MgY3JpYmJlZCBmcm9tIDNjNTA1LmMuCisgKgorICogUmV2aXNpb24gMS42ICAxOTk2LzEyLzEyIDAzOjE4OjU4ICBicmFkZm9yZAorICogQWRkZWQgdmlydF90b19idXM7IHdvcmtzIGluIDIuMS4xMy4KKyAqCisgKiBSZXZpc2lvbiAxLjUgIDE5OTYvMTIvMTIgMDM6MTM6MjIgIHJvb3QKKyAqIHhtaXRRZWwgaW5pdGlhbGl6YXRpb24gLS0gdGhpbmsgdGhyb3VnaCBiZXR0ZXIgdGhvdWdoLgorICoKKyAqIFJldmlzaW9uIDEuNCAgMTk5Ni8wNi8xOCAxNDo1NTo1NSAgcm9vdAorICogQ2hhbmdlIG5hbWVzIHRvIGx0cGMuIFRhYnMuIFRvb2sgYSBzaG90IGF0IGRtYSBhbGxvYywKKyAqIGFsdGhvdWdoIG1vcmUgbmVlZHMgdG8gYmUgZG9uZSBldmVudHVhbGx5LgorICoKKyAqIFJldmlzaW9uIDEuMyAgMTk5Ni8wNS8yMiAxNDo1OTozOSAgcm9vdAorICogQ2hhbmdlIGRldi0+b3BlbiwgZGV2LT5jbG9zZSB0byB0cmFjayBkdW1teS5jIGluIDEuOTkuKGFyb3VuZCA3KQorICoKKyAqIFJldmlzaW9uIDEuMiAgMTk5Ni8wNS8yMiAxNDo1ODoyNCAgcm9vdAorICogQ2hhbmdlIHRhYnMgbW9zdGx5LgorICoKKyAqIFJldmlzaW9uIDEuMSAgMTk5Ni8wNC8yMyAwNDo0NTowOSAgcm9vdAorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqIFJldmlzaW9uIDAuMTYgIDE5OTYvMDMvMDUgMTU6NTk6NTYgIHJvb3QKKyAqIENoYW5nZSBBUlBIUkRfTE9DQUxUTEsgZGVmaW5pdGlvbiB0byB0aGUgInJlYWwiIG9uZS4KKyAqCisgKiBSZXZpc2lvbiAwLjE1ICAxOTk2LzAzLzA1IDA2OjI4OjMwICByb290CisgKiBDaGFuZ2VzIGZvciBrZXJuZWwgMS4zLjcwLiAgU3RpbGwgbmVlZCBhIGZldyBwYXRjaGVzIHRvIGtlcm5lbCwgYnV0CisgKiBpdCdzIGdldHRpbmcgY2xvc2VyLgorICoKKyAqIFJldmlzaW9uIDAuMTQgIDE5OTYvMDIvMjUgMTc6Mzg6MzIgIHJvb3QKKyAqIE1vcmUgY2xlYW51cHMuICBSZW1vdmVkIHF1ZXJ5IHRvIGNhcmQgb24gZ2V0X3N0YXRzLgorICoKKyAqIFJldmlzaW9uIDAuMTMgIDE5OTYvMDIvMjEgIDE2OjI3OjQwICByb290CisgKiBSZWZpeCBkZWJ1Z19wcmludF9za2IuICBGaXggbWFjLnJhdyBnb3RjaGEgdGhhdCBhcHBlYXJlZCBpbiAxLjMuNjUuCisgKiBDbGVhbiB1cCByZWNlaXZlIGNvZGUgYSBsaXR0bGUuCisgKgorICogUmV2aXNpb24gMC4xMiAgMTk5Ni8wMi8xOSAgMTY6MzQ6NTMgIHJvb3QKKyAqIEZpeCBkZWJ1Z19wcmludF9za2IuICBLbHVkZ2Ugb3V0Z29pbmcgc25ldCB0byAwIHdoZW4gdXNpbmcgc3RhcnR1cAorICogcmFuZ2UuICBDaGFuZ2UgZGVidWcgdG8gbWFzazogMSBmb3IgdmVyYm9zZSwgMiBmb3IgaGlnaGVyIGxldmVsIHN0dWZmCisgKiBpbmNsdWRpbmcgcGFja2V0IHByaW50aW5nLCA0IGZvciBsb3dlciBsZXZlbCAoY2FyZCBpL28pIHN0dWZmLgorICoKKyAqIFJldmlzaW9uIDAuMTEgIDE5OTYvMDIvMTIgIDE1OjUzOjM4ICByb290CisgKiBBZGRlZCByb3V0ZXIgc2VuZHMgKHJlcXVpcmVzIG5ldyBhYXJwLmMgcGF0Y2gpCisgKgorICogUmV2aXNpb24gMC4xMCAgMTk5Ni8wMi8xMSAgMDA6MTk6MzUgIHJvb3QKKyAqIENoYW5nZSBzb3VyY2UgTFRBTEtfTE9HR0lORyBkZWJ1ZyBzd2l0Y2ggdG8gaW5zbW9kIC4uLiBkZWJ1Zz0yLgorICoKKyAqIFJldmlzaW9uIDAuOSAgMTk5Ni8wMi8xMCAgMjM6NTk6MzUgIHJvb3QKKyAqIEZpeGVkIHRob3NlIGZpeGVzIGZvciAxLjIgLS0gREFOR0VSISAgVGhlIGF0LmggdGhhdCBjb21lcyB3aXRoIG5ldGF0YWxrCisgKiBoYXMgYSAqZGlmZmVyZW50KiBkZWZpbml0aW9uIG9mIHN0cnVjdCBzb2NrYWRkcl9hdCB0aGFuIHRoZSBMaW51eCBrZXJuZWwKKyAqIGRvZXMuICBUaGlzIGlzIGFuICJpbnNpZGlvdXMgYW5kIGludmlkaW91cyIgYnVnLi4uCisgKiAoQWN0dWFsbHkgdGhlIHByZWNlZGluZyBjb21tZW50IGlzIGZhbHNlIC0tIGl0J3MgdGhlIGF0YWxrLmggaW4gdGhlCisgKiBhbmNpZW50IGF0YWxrLTAuMDYgdGhhdCdzIHRoZSBwcm9ibGVtKQorICoKKyAqIFJldmlzaW9uIDAuOCAgMTk5Ni8wMi8xMCAxOTowOTowMCAgcm9vdAorICogTWVyZ2UgMS4zIGNoYW5nZXMuICBUZXN0ZWQgT0sgdW5kZXIgMS4zLjYwLgorICoKKyAqIFJldmlzaW9uIDAuNyAgMTk5Ni8wMi8xMCAxNzo1Njo1NiAgcm9vdAorICogQWRkZWQgZGVidWc9MSBwYXJhbWV0ZXIgb24gaW5zbW9kIGZvciBkZWJ1Z2dpbmcgcHJpbnRzLiAgVHJpZWQKKyAqIHRvIGZpeCB0aW1lciB1bmxvYWQgb24gcm1tb2QsIGJ1dCBJIGRvbid0IHRoaW5rIHRoYXQncyB0aGUgcHJvYmxlbS4KKyAqCisgKiBSZXZpc2lvbiAwLjYgIDE5OTUvMTIvMzEgIDE5OjAxOjA5ICByb290CisgKiBDbGVhbiB1cCBybW1vZCwgaXJxIGNvbW1lbnRzIHBlciBmZWVkYmFjayBmcm9tIENvcmluIEFuZGVyc29uIChUaGFua3MgQ29yZXkhKQorICogQ2xlYW4gdXAgaW5pdGlhbCBwcm9iaW5nIC0tIHNvbWV0aW1lcyB0aGUgY2FyZCB3YWtlcyB1cCBsYXRjaGVkIGluIHJlc2V0LgorICoKKyAqIFJldmlzaW9uIDAuNSAgMTk5NS8xMi8yMiAgMDY6MDM6NDQgIHJvb3QKKyAqIEFkZGVkIGNvbW1lbnRzIGluIGZyb250IGFuZCBjbGVhbmVkIHVwIGEgYml0LgorICogVGhpcyB2ZXJzaW9uIHNlbnQgb3V0IHRvIHBlb3BsZS4KKyAqCisgKiBSZXZpc2lvbiAwLjQgIDE5OTUvMTIvMTggIDAzOjQ2OjQ0ICByb290CisgKiBSZXR1cm4gc2hvcnRERFAgdG8gbG9uZ0REUCBmYWtlIHRvIDAvMC4gIEFkZGVkIGNvbW1hbmQgc3RydWN0cy4KKyAqCisgKioqLworCisvKiBsdHBjIGp1bXBlcnMgYXJlOgorKgorKglJbnRlcnJ1cHRzIC0tIHNldCBhdCBtb3N0IG9uZS4gIElmIG5vbmUgYXJlIHNldCwgdGhlIGRyaXZlciB1c2VzCisqCXBvbGxlZCBtb2RlLiAgQmVjYXVzZSB0aGUgY2FyZCB3YXMgZGV2ZWxvcGVkIGluIHRoZSBYVCBlcmEsIHRoZQorKglvcmlnaW5hbCBkb2N1bWVudGF0aW9uIHJlZmVycyB0byBJUlEyLiAgU2luY2UgeW91J2xsIGJlIHJ1bm5pbmcKKyoJdGhpcyBvbiBhbiBBVCAob3IgbGF0ZXIpIGNsYXNzIG1hY2hpbmUsIHRoYXQgcmVhbGx5IG1lYW5zIElSUTkuCisqCisqCVNXMQlJUlEgNAorKglTVzIJSVJRIDMKKyoJU1czCUlSUSA5ICgyIGluIG9yaWdpbmFsIGNhcmQgZG9jdW1lbnRhdGlvbiBvbmx5IGFwcGxpZXMgdG8gWFQpCisqCisqCisqCURNQSAtLSBjaG9vc2UgRE1BIDEgb3IgMywgYW5kIHNldCBib3RoIGNvcnJlc3BvbmRpbmcgc3dpdGNoZXMuCisqCisqCVNXNAlETUEgMworKglTVzUJRE1BIDEKKyoJU1c2CURNQSAzCisqCVNXNwlETUEgMQorKgorKgorKglJL08gYWRkcmVzcyAtLSBjaG9vc2Ugb25lLiAgCisqCisqCVNXOAkyMjAgLyAyNDAKKyovCisKKy8qCVRvIGhhdmUgc29tZSBzdHVmZiBsb2dnZWQsIGRvIAorKglpbnNtb2QgbHRwYy5vIGRlYnVnPTEKKyoKKyoJRm9yIGEgd2hvbGUgYnVuY2ggb2Ygc3R1ZmYsIHVzZSBoaWdoZXIgbnVtYmVycy4KKyoKKyoJVGhlIGRlZmF1bHQgaXMgMCwgaS5lLiBubyBtZXNzYWdlcyBleGNlcHQgZm9yIHRoZSBwcm9iZSByZXN1bHRzLgorKi8KKworLyogaW5zbW9kLXR3ZWFrYWJsZSB2YXJpYWJsZXMgKi8KK3N0YXRpYyBpbnQgZGVidWc7CisjZGVmaW5lIERFQlVHX1ZFUkJPU0UgMQorI2RlZmluZSBERUJVR19VUFBFUiAyCisjZGVmaW5lIERFQlVHX0xPV0VSIDQKKworc3RhdGljIGludCBpbzsKK3N0YXRpYyBpbnQgaXJxOworc3RhdGljIGludCBkbWE7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2x0YWxrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2F0YWxrLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiBvdXIgc3R1ZmYgKi8KKyNpbmNsdWRlICJsdHBjLmgiCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodHhxdWV1ZV9sb2NrKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWJveF9sb2NrKTsKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIGludCBkb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmNidWYsIGludCBjYnVmbGVuLAorCXZvaWQgKmRidWYsIGludCBkYnVmbGVuKTsKK3N0YXRpYyBpbnQgc2VuZHVwX2J1ZmZlciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIERtYSBNZW1vcnkgcmVsYXRlZCBzdHVmZiwgY3JpYmJlZCBkaXJlY3RseSBmcm9tIDNjNTA1LmMgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX21lbV9hbGxvYyhpbnQgc2l6ZSkKK3sKKyAgICAgICAgaW50IG9yZGVyID0gZ2V0X29yZGVyKHNpemUpOworCisgICAgICAgIHJldHVybiBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgb3JkZXIpOworfQorCisvKiBETUEgZGF0YSBidWZmZXIsIERNQSBjb21tYW5kIGJ1ZmZlciAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmx0ZG1hYnVmOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmx0ZG1hY2J1ZjsKKworLyogcHJpdmF0ZSBzdHJ1Y3QsIGhvbGRzIG91ciBhcHBsZXRhbGsgYWRkcmVzcyAqLworCitzdHJ1Y3QgbHRwY19wcml2YXRlCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGF0YWxrX2FkZHIgbXlfYWRkcjsKK307CisKKy8qIHRyYW5zbWl0IHF1ZXVlIGVsZW1lbnQgc3RydWN0ICovCisKK3N0cnVjdCB4bWl0UWVsIHsKKwlzdHJ1Y3QgeG1pdFFlbCAqbmV4dDsKKwkvKiBjb21tYW5kIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKmNidWY7CisJc2hvcnQgY2J1ZmxlbjsKKwkvKiBkYXRhIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKmRidWY7CisJc2hvcnQgZGJ1ZmxlbjsKKwl1bnNpZ25lZCBjaGFyIFFXcml0ZTsJLyogcmVhZCBvciB3cml0ZSBkYXRhICovCisJdW5zaWduZWQgY2hhciBtYWlsYm94OworfTsKKworLyogdGhlIHRyYW5zbWl0IHF1ZXVlIGl0c2VsZiAqLworCitzdGF0aWMgc3RydWN0IHhtaXRRZWwgKnhtUWhkLCAqeG1RdGw7CisKK3N0YXRpYyB2b2lkIGVuUShzdHJ1Y3QgeG1pdFFlbCAqcWVsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJcWVsLT5uZXh0ID0gTlVMTDsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHhxdWV1ZV9sb2NrLCBmbGFncyk7CisJaWYgKHhtUXRsKSB7CisJCXhtUXRsLT5uZXh0ID0gcWVsOworCX0gZWxzZSB7CisJCXhtUWhkID0gcWVsOworCX0KKwl4bVF0bCA9IHFlbDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eHF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWlmIChkZWJ1ZyAmIERFQlVHX0xPV0VSKQorCQlwcmludGsoImVucXVldWVkIGEgMHglMDJ4IGNvbW1hbmRcbiIscWVsLT5jYnVmWzBdKTsKK30KKworc3RhdGljIHN0cnVjdCB4bWl0UWVsICpkZVEodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCXN0cnVjdCB4bWl0UWVsICpxZWw9TlVMTDsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHhxdWV1ZV9sb2NrLCBmbGFncyk7CisJaWYgKHhtUWhkKSB7CisJCXFlbCA9IHhtUWhkOworCQl4bVFoZCA9IHFlbC0+bmV4dDsKKwkJaWYoIXhtUWhkKSB4bVF0bCA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4cXVldWVfbG9jaywgZmxhZ3MpOworCisJaWYgKChkZWJ1ZyAmIERFQlVHX0xPV0VSKSAmJiBxZWwpIHsKKwkJaW50IG47CisJCXByaW50ayhLRVJOX0RFQlVHICJsdHBjOiBkZXF1ZXVlZCBjb21tYW5kICIpOworCQluID0gcWVsLT5jYnVmbGVuOworCQlpZiAobj4xMDApIG49MTAwOworCQlmb3IoaT0wO2k8bjtpKyspIHByaW50aygiJTAyeCAiLHFlbC0+Y2J1ZltpXSk7CisJCXByaW50aygiXG4iKTsKKwl9CisKKwlyZXR1cm4gcWVsOworfQorCisvKiBhbmQuLi4gdGhlIHF1ZXVlIGVsZW1lbnRzIHdlJ2xsIGJlIHVzaW5nICovCitzdGF0aWMgc3RydWN0IHhtaXRRZWwgcWVsc1sxNl07CisKKy8qIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIG1haWxib3hlcyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgbWFpbGJveFsxNl07CitzdGF0aWMgdW5zaWduZWQgY2hhciBtYm94aW51c2VbMTZdID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9OworCitzdGF0aWMgaW50IHdhaXRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYykKK3sKKwkvKiByZXR1cm5zIHRydWUgaWYgaXQgc3RheWVkIGMgKi8KKwkvKiB0aGlzIHVzZXMgYmFzZSs2LCBidXQgaXQncyBvayAqLworCWludCBpOworCisJLyogdHdlbnR5IHNlY29uZCBvciBzbyB0b3RhbCAqLworCisJZm9yKGk9MDtpPDIwMDAwMDtpKyspIHsKKwkJaWYgKCBjICE9IGluYl9wKGRldi0+YmFzZV9hZGRyKzYpICkgcmV0dXJuIDA7CisJCXVkZWxheSgxMDApOworCX0KKwlyZXR1cm4gMTsgLyogdGltZWQgb3V0ICovCit9CisKKy8qIGdldCB0aGUgZmlyc3QgZnJlZSBtYWlsYm94ICovCisKK3N0YXRpYyBpbnQgZ2V0bWJveCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWJveF9sb2NrLCBmbGFncyk7CisJZm9yKGk9MTtpPDE2O2krKykgaWYoIW1ib3hpbnVzZVtpXSkgeworCQltYm94aW51c2VbaV09MTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWJveF9sb2NrLCBmbGFncyk7CisJCXJldHVybiBpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYm94X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCBhIGNvbW1hbmQgZnJvbSB0aGUgY2FyZCAqLworc3RhdGljIHZvaWQgaGFuZGxlZmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBjYWxsZWQgKm9ubHkqIGZyb20gaWRsZSwgbm9uLXJlZW50cmFudCAqLworCWludCBkbWEgPSBkZXYtPmRtYTsKKwlpbnQgYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJZGlzYWJsZV9kbWEoZG1hKTsKKwljbGVhcl9kbWFfZmYoZG1hKTsKKwlzZXRfZG1hX21vZGUoZG1hLERNQV9NT0RFX1JFQUQpOworCXNldF9kbWFfYWRkcihkbWEsdmlydF90b19idXMobHRkbWFjYnVmKSk7CisJc2V0X2RtYV9jb3VudChkbWEsNTApOworCWVuYWJsZV9kbWEoZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKworCWluYl9wKGJhc2UrMyk7CisJaW5iX3AoYmFzZSsyKTsKKworCWlmICggd2FpdF90aW1lb3V0KGRldiwweGZjKSApIHByaW50aygidGltZWQgb3V0IGluIGhhbmRsZWZjXG4iKTsKK30KKworLyogcmVhZCBkYXRhIGZyb20gdGhlIGNhcmQgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZWZkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGRtYSA9IGRldi0+ZG1hOworCWludCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJZGlzYWJsZV9kbWEoZG1hKTsKKwljbGVhcl9kbWFfZmYoZG1hKTsKKwlzZXRfZG1hX21vZGUoZG1hLERNQV9NT0RFX1JFQUQpOworCXNldF9kbWFfYWRkcihkbWEsdmlydF90b19idXMobHRkbWFidWYpKTsKKwlzZXRfZG1hX2NvdW50KGRtYSw4MDApOworCWVuYWJsZV9kbWEoZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKworCWluYl9wKGJhc2UrMyk7CisJaW5iX3AoYmFzZSsyKTsKKworCWlmICggd2FpdF90aW1lb3V0KGRldiwweGZkKSApIHByaW50aygidGltZWQgb3V0IGluIGhhbmRsZWZkXG4iKTsKKwlzZW5kdXBfYnVmZmVyKGRldik7Cit9IAorCitzdGF0aWMgdm9pZCBoYW5kbGV3cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGNhbGxlZCAqb25seSogZnJvbSBpZGxlLCBub24tcmVlbnRyYW50ICovCisJLyogb24gZW50cnksIDB4ZmIgYW5kIGx0ZG1hYnVmIGhvbGRzIGRhdGEgKi8KKwlpbnQgZG1hID0gZGV2LT5kbWE7CisJaW50IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJZGlzYWJsZV9kbWEoZG1hKTsKKwljbGVhcl9kbWFfZmYoZG1hKTsKKwlzZXRfZG1hX21vZGUoZG1hLERNQV9NT0RFX1dSSVRFKTsKKwlzZXRfZG1hX2FkZHIoZG1hLHZpcnRfdG9fYnVzKGx0ZG1hYnVmKSk7CisJc2V0X2RtYV9jb3VudChkbWEsODAwKTsKKwllbmFibGVfZG1hKGRtYSk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCisJaW5iX3AoYmFzZSszKTsKKwlpbmJfcChiYXNlKzIpOworCisJaWYgKCB3YWl0X3RpbWVvdXQoZGV2LDB4ZmIpICkgeworCQlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCQlwcmludGsoInRpbWVkIG91dCBpbiBoYW5kbGV3cml0ZSwgZG1hIHJlcyAlZFxuIiwKKwkJCWdldF9kbWFfcmVzaWR1ZShkZXYtPmRtYSkgKTsKKwkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBoYW5kbGVyZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogb24gZW50cnksIDB4ZmIgKi8KKwkvKiBvbiBleGl0LCBsdGRtYWJ1ZiBob2xkcyBkYXRhICovCisJaW50IGRtYSA9IGRldi0+ZG1hOworCWludCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQorCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJZGlzYWJsZV9kbWEoZG1hKTsKKwljbGVhcl9kbWFfZmYoZG1hKTsKKwlzZXRfZG1hX21vZGUoZG1hLERNQV9NT0RFX1JFQUQpOworCXNldF9kbWFfYWRkcihkbWEsdmlydF90b19idXMobHRkbWFidWYpKTsKKwlzZXRfZG1hX2NvdW50KGRtYSw4MDApOworCWVuYWJsZV9kbWEoZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKworCWluYl9wKGJhc2UrMyk7CisJaW5iX3AoYmFzZSsyKTsKKwlpZiAoIHdhaXRfdGltZW91dChkZXYsMHhmYikgKSBwcmludGsoInRpbWVkIG91dCBpbiBoYW5kbGVyZWFkXG4iKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlY29tbWFuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIG9uIGVudHJ5LCAweGZhIGFuZCBsdGRtYWNidWYgaG9sZHMgY29tbWFuZCAqLworCWludCBkbWEgPSBkZXYtPmRtYTsKKwlpbnQgYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGRtYSk7CisJY2xlYXJfZG1hX2ZmKGRtYSk7CisJc2V0X2RtYV9tb2RlKGRtYSxETUFfTU9ERV9XUklURSk7CisJc2V0X2RtYV9hZGRyKGRtYSx2aXJ0X3RvX2J1cyhsdGRtYWNidWYpKTsKKwlzZXRfZG1hX2NvdW50KGRtYSw1MCk7CisJZW5hYmxlX2RtYShkbWEpOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCWluYl9wKGJhc2UrMyk7CisJaW5iX3AoYmFzZSsyKTsKKwlpZiAoIHdhaXRfdGltZW91dChkZXYsMHhmYSkgKSBwcmludGsoInRpbWVkIG91dCBpbiBoYW5kbGVjb21tYW5kXG4iKTsKK30gCisKKy8qIHJlYWR5IG1hZGUgY29tbWFuZCBmb3IgZ2V0dGluZyB0aGUgcmVzdWx0IGZyb20gdGhlIGNhcmQgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlc2NidWZbMl0gPSB7TFRfR0VUUkVTVUxULDB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVzZGJ1ZlsyXTsKKworc3RhdGljIGludCBRSW5JZGxlOworCisvKiBpZGxlIGV4cGVjdHMgdG8gYmUgY2FsbGVkIHdpdGggdGhlIElSUSBsaW5lIGhpZ2ggLS0gZWl0aGVyIGJlY2F1c2Ugb2YKKyAqIGFuIGludGVycnVwdCwgb3IgYmVjYXVzZSB0aGUgbGluZSBpcyB0cmktc3RhdGVkCisgKi8KKworc3RhdGljIHZvaWQgaWRsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YXRlOworCS8qIEZJWE1FIFRoaXMgaXMgaW5pdGlhbGl6ZWQgdG8gc2h1dCB0aGUgd2FybmluZyB1cCwgYnV0IEkgbmVlZCB0bworCSAqIHRoaW5rIHRoaXMgdGhyb3VnaCBhZ2Fpbi4KKwkgKi8KKwlzdHJ1Y3QgeG1pdFFlbCAqcSA9IE5VTEw7CisJaW50IG9vcHM7CisJaW50IGk7CisJaW50IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0eHF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlpZihRSW5JZGxlKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4cXVldWVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCVFJbklkbGUgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4cXVldWVfbG9jaywgZmxhZ3MpOworCisJLyogdGhpcyB0cmktc3RhdGVzIHRoZSBJUlEgbGluZSAqLworCSh2b2lkKSBpbmJfcChiYXNlKzYpOworCisJb29wcyA9IDEwMDsKKworbG9vcDoKKwlpZiAoMD5vb3BzLS0pIHsgCisJCXByaW50aygiaWRsZTogbG9vcGVkIHRvbyBtYW55IHRpbWVzXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCXN0YXRlID0gaW5iX3AoYmFzZSs2KTsKKwlpZiAoc3RhdGUgIT0gaW5iX3AoYmFzZSs2KSkgZ290byBsb29wOworCisJc3dpdGNoKHN0YXRlKSB7CisJCWNhc2UgMHhmYzoKKwkJCS8qIGluY29taW5nIGNvbW1hbmQgKi8KKwkJCWlmIChkZWJ1ZyAmIERFQlVHX0xPV0VSKSBwcmludGsoImlkbGU6IGZjXG4iKTsKKwkJCWhhbmRsZWZjKGRldik7IAorCQkJYnJlYWs7CisJCWNhc2UgMHhmZDoKKwkJCS8qIGluY29taW5nIGRhdGEgKi8KKwkJCWlmKGRlYnVnICYgREVCVUdfTE9XRVIpIHByaW50aygiaWRsZTogZmRcbiIpOworCQkJaGFuZGxlZmQoZGV2KTsgCisJCQlicmVhazsKKwkJY2FzZSAweGY5OgorCQkJLyogcmVzdWx0IHJlYWR5ICovCisJCQlpZiAoZGVidWcgJiBERUJVR19MT1dFUikgcHJpbnRrKCJpZGxlOiBmOVxuIik7CisJCQlpZighbWJveGludXNlWzBdKSB7CisJCQkJbWJveGludXNlWzBdID0gMTsKKwkJCQlxZWxzWzBdLmNidWYgPSByZXNjYnVmOworCQkJCXFlbHNbMF0uY2J1ZmxlbiA9IDI7CisJCQkJcWVsc1swXS5kYnVmID0gcmVzZGJ1ZjsKKwkJCQlxZWxzWzBdLmRidWZsZW4gPSAyOworCQkJCXFlbHNbMF0uUVdyaXRlID0gMDsKKwkJCQlxZWxzWzBdLm1haWxib3ggPSAwOworCQkJCWVuUSgmcWVsc1swXSk7CisJCQl9CisJCQlpbmJfcChkZXYtPmJhc2VfYWRkcisxKTsKKwkJCWluYl9wKGRldi0+YmFzZV9hZGRyKzApOworCQkJaWYoIHdhaXRfdGltZW91dChkZXYsMHhmOSkgKQorCQkJCXByaW50aygidGltZWQgb3V0IGlkbGUgZjlcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMHhmODoKKwkJCS8qID8/ICovCisJCQlpZiAoeG1RaGQpIHsKKwkJCQlpbmJfcChkZXYtPmJhc2VfYWRkcisxKTsKKwkJCQlpbmJfcChkZXYtPmJhc2VfYWRkciswKTsKKwkJCQlpZih3YWl0X3RpbWVvdXQoZGV2LDB4ZjgpICkKKwkJCQkJcHJpbnRrKCJ0aW1lZCBvdXQgaWRsZSBmOFxuIik7CisJCQl9IGVsc2UgeworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4ZmE6CisJCQkvKiB3YWl0aW5nIGZvciBjb21tYW5kICovCisJCQlpZihkZWJ1ZyAmIERFQlVHX0xPV0VSKSBwcmludGsoImlkbGU6IGZhXG4iKTsKKwkJCWlmICh4bVFoZCkgeworCQkJCXE9ZGVRKCk7CisJCQkJbWVtY3B5KGx0ZG1hY2J1ZixxLT5jYnVmLHEtPmNidWZsZW4pOworCQkJCWx0ZG1hY2J1ZlsxXSA9IHEtPm1haWxib3g7CisJCQkJaWYgKGRlYnVnPjEpIHsgCisJCQkJCWludCBuOworCQkJCQlwcmludGsoImx0cGM6IHNlbnQgY29tbWFuZCAgICAgIik7CisJCQkJCW4gPSBxLT5jYnVmbGVuOworCQkJCQlpZiAobj4xMDApIG49MTAwOworCQkJCQlmb3IoaT0wO2k8bjtpKyspCisJCQkJCQlwcmludGsoIiUwMnggIixsdGRtYWNidWZbaV0pOworCQkJCQlwcmludGsoIlxuIik7CisJCQkJfQorCQkJCWhhbmRsZWNvbW1hbmQoZGV2KTsKKwkJCQkJaWYoMHhmYT09aW5iX3AoYmFzZSs2KSkgeworCQkJCQkJLyogd2UgdGltZWQgb3V0LCBzbyByZXR1cm4gKi8KKwkJCQkJCWdvdG8gZG9uZTsKKwkJCQkJfSAKKwkJCX0gZWxzZSB7CisJCQkJLyogd2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGEgY29tbWFuZCAqLworCQkJCWlmICghbWJveGludXNlWzBdKSB7CisJCQkJCW1ib3hpbnVzZVswXSA9IDE7CisJCQkJCXFlbHNbMF0uY2J1ZiA9IHJlc2NidWY7CisJCQkJCXFlbHNbMF0uY2J1ZmxlbiA9IDI7CisJCQkJCXFlbHNbMF0uZGJ1ZiA9IHJlc2RidWY7CisJCQkJCXFlbHNbMF0uZGJ1ZmxlbiA9IDI7CisJCQkJCXFlbHNbMF0uUVdyaXRlID0gMDsKKwkJCQkJcWVsc1swXS5tYWlsYm94ID0gMDsKKwkJCQkJZW5RKCZxZWxzWzBdKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsoInRyb3VibGU6IHJlc3BvbnNlIGNvbW1hbmQgYWxyZWFkeSBxdWV1ZWRcbiIpOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCQkJfSAKKwkJCWJyZWFrOworCQljYXNlIDBYZmI6CisJCQkvKiBkYXRhIHRyYW5zZmVyIHJlYWR5ICovCisJCQlpZihkZWJ1ZyAmIERFQlVHX0xPV0VSKSBwcmludGsoImlkbGU6IGZiXG4iKTsKKwkJCWlmKHEtPlFXcml0ZSkgeworCQkJCW1lbWNweShsdGRtYWJ1ZixxLT5kYnVmLHEtPmRidWZsZW4pOworCQkJCWhhbmRsZXdyaXRlKGRldik7CisJCQl9IGVsc2UgeworCQkJCWhhbmRsZXJlYWQoZGV2KTsKKwkJCQkvKiBub24temVybyBtYWlsYm94IG51bWJlcnMgYXJlIGZvcgorCQkJCSAgIGNvbW1tYW5kcywgMCBpcyBmb3IgR0VUUkVTVUxUCisJCQkJICAgcmVxdWVzdHMgKi8KKwkJCQlpZihxLT5tYWlsYm94KSB7CisJCQkJCW1lbWNweShxLT5kYnVmLGx0ZG1hYnVmLHEtPmRidWZsZW4pOworCQkJCX0gZWxzZSB7IAorCQkJCQkvKiB0aGlzIHdhcyBhIHJlc3VsdCAqLworCQkJCQltYWlsYm94WyAweDBmICYgbHRkbWFidWZbMF0gXSA9IGx0ZG1hYnVmWzFdOworCQkJCQltYm94aW51c2VbMF09MDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwl9CisJZ290byBsb29wOworCitkb25lOgorCVFJbklkbGU9MDsKKworCS8qIG5vdyBzZXQgdGhlIGludGVycnVwdHMgYmFjayBhcyBhcHByb3ByaWF0ZSAqLworCS8qIHRoZSBmaXJzdCByZWFkIHRha2VzIGl0IG91dCBvZiB0cmktc3RhdGUgKGJ1dCBzdGlsbCBoaWdoKSAqLworCS8qIHRoZSBzZWNvbmQgcmVzZXRzIGl0ICovCisJLyogbm90ZSB0aGF0IGFmdGVyIHRoaXMgcG9pbnQsIGFueSByZWFkIG9mIGJhc2UrNiB3aWxsCisJICAgdHJpZ2dlciBhbiBpbnRlcnJ1cHQgKi8KKworCWlmIChkZXYtPmlycSkgeworCQlpbmJfcChiYXNlKzcpOworCQlpbmJfcChiYXNlKzcpOworCX0KKwlyZXR1cm47Cit9CisKKworc3RhdGljIGludCBkb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpjYnVmLCBpbnQgY2J1ZmxlbiwKKwl2b2lkICpkYnVmLCBpbnQgZGJ1ZmxlbikKK3sKKworCWludCBpID0gZ2V0bWJveCgpOworCWludCByZXQ7CisKKwlpZihpKSB7CisJCXFlbHNbaV0uY2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGNidWY7CisJCXFlbHNbaV0uY2J1ZmxlbiA9IGNidWZsZW47CisJCXFlbHNbaV0uZGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGRidWY7CisJCXFlbHNbaV0uZGJ1ZmxlbiA9IGRidWZsZW47CisJCXFlbHNbaV0uUVdyaXRlID0gMTsKKwkJcWVsc1tpXS5tYWlsYm94ID0gaTsgIC8qIHRoaXMgc2hvdWxkIGJlIGluaXR0ZWQgcmF0aGVyICovCisJCWVuUSgmcWVsc1tpXSk7CisJCWlkbGUoZGV2KTsKKwkJcmV0ID0gbWFpbGJveFtpXTsKKwkJbWJveGludXNlW2ldPTA7CisJCXJldHVybiByZXQ7CisJfQorCXByaW50aygibHRwYzogY291bGQgbm90IGFsbG9jYXRlIG1ib3hcbiIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBkb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmNidWYsIGludCBjYnVmbGVuLAorCXZvaWQgKmRidWYsIGludCBkYnVmbGVuKQoreworCisJaW50IGkgPSBnZXRtYm94KCk7CisJaW50IHJldDsKKworCWlmKGkpIHsKKwkJcWVsc1tpXS5jYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgY2J1ZjsKKwkJcWVsc1tpXS5jYnVmbGVuID0gY2J1ZmxlbjsKKwkJcWVsc1tpXS5kYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgZGJ1ZjsKKwkJcWVsc1tpXS5kYnVmbGVuID0gZGJ1ZmxlbjsKKwkJcWVsc1tpXS5RV3JpdGUgPSAwOworCQlxZWxzW2ldLm1haWxib3ggPSBpOyAgLyogdGhpcyBzaG91bGQgYmUgaW5pdHRlZCByYXRoZXIgKi8KKwkJZW5RKCZxZWxzW2ldKTsKKwkJaWRsZShkZXYpOworCQlyZXQgPSBtYWlsYm94W2ldOworCQltYm94aW51c2VbaV09MDsKKwkJcmV0dXJuIHJldDsKKwl9CisJcHJpbnRrKCJsdHBjOiBjb3VsZCBub3QgYWxsb2NhdGUgbWJveFxuIik7CisJcmV0dXJuIC0xOworfQorCisvKiBlbmQgb2YgaWRsZSBoYW5kbGVycyAtLSB3aGF0IHNob3VsZCBiZSBzZWVuIGlzIGRvX3JlYWQsIGRvX3dyaXRlICovCisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBsdHBjX3RpbWVyOworCitzdGF0aWMgaW50IGx0cGNfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbHRwY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgcmVhZF8zMCAoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbHRfY29tbWFuZCBjOworCWMuZ2V0ZmxhZ3MuY29tbWFuZCA9IExUX0dFVEZMQUdTOworCXJldHVybiBkb19yZWFkKGRldiwgJmMsIHNpemVvZihjLmdldGZsYWdzKSwmYywwKTsKK30KKworc3RhdGljIGludCBzZXRfMzAgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IHgpCit7CisJbHRfY29tbWFuZCBjOworCWMuc2V0ZmxhZ3MuY29tbWFuZCA9IExUX1NFVEZMQUdTOworCWMuc2V0ZmxhZ3MuZmxhZ3MgPSB4OworCXJldHVybiBkb193cml0ZShkZXYsICZjLCBzaXplb2YoYy5zZXRmbGFncyksJmMsMCk7Cit9CisKKy8qIExMQVAgdG8gRERQIHRyYW5zbGF0aW9uICovCisKK3N0YXRpYyBpbnQgc2VuZHVwX2J1ZmZlciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBvbiBlbnRyeSwgY29tbWFuZCBpcyBpbiBsdGRtYWNidWYsIGRhdGEgaW4gbHRkbWFidWYgKi8KKwkvKiBjYWxsZWQgZnJvbSBpZGxlLCBub24tcmVlbnRyYW50ICovCisKKwlpbnQgZG5vZGUsIHNub2RlLCBsbGFwdHlwZSwgbGVuOyAKKwlpbnQgc2tsZW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmKChzdHJ1Y3QgbHRwY19wcml2YXRlICopZGV2LT5wcml2KS0+c3RhdHM7CisJc3RydWN0IGx0X3JjdmxhcCAqbHRjID0gKHN0cnVjdCBsdF9yY3ZsYXAgKikgbHRkbWFjYnVmOworCisJaWYgKGx0Yy0+Y29tbWFuZCAhPSBMVF9SQ1ZMQVApIHsKKwkJcHJpbnRrKCJ1bmtub3duIGNvbW1hbmQgMHglMDJ4IGZyb20gbHRwYyBjYXJkXG4iLGx0Yy0+Y29tbWFuZCk7CisJCXJldHVybigtMSk7CisJfQorCWRub2RlID0gbHRjLT5kbm9kZTsKKwlzbm9kZSA9IGx0Yy0+c25vZGU7CisJbGxhcHR5cGUgPSBsdGMtPmxhcHR5cGU7CisJbGVuID0gbHRjLT5sZW5ndGg7IAorCisJc2tsZW4gPSBsZW47CisJaWYgKGxsYXB0eXBlID09IDEpIAorCQlza2xlbiArPSA4OyAgLyogY29ycmVjdCBmb3Igc2hvcnQgZGRwICovCisJaWYoc2tsZW4gPiA4MDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vbnNlbnNlIGxlbmd0aCBpbiBsdHBjIGNvbW1hbmQgMHgxNDogMHglMDh4XG4iLAorCQkJZGV2LT5uYW1lLHNrbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICggKGxsYXB0eXBlPT0wKSB8fCAobGxhcHR5cGU+MikgKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB1bmtub3duIExMQVAgdHlwZTogJWRcbiIsZGV2LT5uYW1lLGxsYXB0eXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJc2tiID0gZGV2X2FsbG9jX3NrYigzK3NrbGVuKTsKKwlpZiAoc2tiID09IE5VTEwpIAorCXsKKwkJcHJpbnRrKCIlczogZHJvcHBpbmcgcGFja2V0IGR1ZSB0byBtZW1vcnkgc3F1ZWV6ZS5cbiIsCisJCQlkZXYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCXNrYi0+ZGV2ID0gZGV2OworCisJaWYgKHNrbGVuID4gbGVuKQorCQlza2JfcmVzZXJ2ZShza2IsOCk7CisJc2tiX3B1dChza2IsbGVuKzMpOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9MT0NBTFRBTEspOworCS8qIGFkZCBMTEFQIGhlYWRlciAqLworCXNrYi0+ZGF0YVswXSA9IGRub2RlOworCXNrYi0+ZGF0YVsxXSA9IHNub2RlOworCXNrYi0+ZGF0YVsyXSA9IGxsYXB0eXBlOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsJLyogc2F2ZSBwb2ludGVyIHRvIGxsYXAgaGVhZGVyICovCisJc2tiX3B1bGwoc2tiLDMpOworCisJLyogY29weSBkZHAocyxlKWhkciArIGNvbnRlbnRzICovCisJbWVtY3B5KHNrYi0+ZGF0YSwodm9pZCopbHRkbWFidWYsbGVuKTsKKworCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisKKwlzdGF0cy0+cnhfcGFja2V0cysrOworCXN0YXRzLT5yeF9ieXRlcys9c2tiLT5sZW47CisKKwkvKiB0b3NzIGl0IG9ud2FyZHMgKi8KKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJcmV0dXJuIDA7Cit9CisKKy8qIHRoZSBoYW5kbGVyIGZvciB0aGUgYm9hcmQgaW50ZXJydXB0ICovCisgCitzdGF0aWMgaXJxcmV0dXJuX3QKK2x0cGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ19wdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKworCWlmIChkZXY9PU5VTEwpIHsKKwkJcHJpbnRrKCJsdHBjX2ludGVycnVwdDogdW5rbm93biBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWluYl9wKGRldi0+YmFzZV9hZGRyKzYpOyAgLyogZGlzYWJsZSBmdXJ0aGVyIGludGVycnVwdHMgZnJvbSBib2FyZCAqLworCisJaWRsZShkZXYpOyAvKiBoYW5kbGUgd2hhdGV2ZXIgaXMgY29taW5nIGluICovCisgCisJLyogaWRsZSByZS1lbmFibGVzIGludGVycnVwdHMgZnJvbSBib2FyZCAqLyAKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqKgorICoKKyAqICAgIFRoZSBpb2N0bHMgdGhhdCB0aGUgZHJpdmVyIHJlc3BvbmRzIHRvIGFyZToKKyAqCisgKiAgICBTSU9DU0lGQUREUiAtLSBkbyBwcm9iZSB1c2luZyB0aGUgcGFzc2VkIG5vZGUgaGludC4KKyAqICAgIFNJT0NHSUZBRERSIC0tIHJldHVybiBuZXQsIG5vZGUuCisgKgorICogICAgc29tZSBvZiB0aGlzIHN0dWZmIHNob3VsZCBiZSBkb25lIGVsc2V3aGVyZS4KKyAqCisgKioqLworCitzdGF0aWMgaW50IGx0cGNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IHNvY2thZGRyX2F0ICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfYXQgKikgJmlmci0+aWZyX2FkZHI7CisJLyogd2UnbGwga2VlcCB0aGUgbG9jYWx0YWxrIG5vZGUgYWRkcmVzcyBpbiBkZXYtPnBhX2FkZHIgKi8KKwlzdHJ1Y3QgYXRhbGtfYWRkciAqYWEgPSAmKChzdHJ1Y3QgbHRwY19wcml2YXRlICopZGV2LT5wcml2KS0+bXlfYWRkcjsKKwlzdHJ1Y3QgbHRfaW5pdCBjOworCWludCBsdGZsYWdzOworCisJaWYoZGVidWcgJiBERUJVR19WRVJCT1NFKSBwcmludGsoImx0cGNfaW9jdGwgY2FsbGVkXG4iKTsKKworCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBTSU9DU0lGQUREUjoKKworCQkJYWEtPnNfbmV0ICA9IHNhLT5zYXRfYWRkci5zX25ldDsKKyAgICAgIAorCQkJLyogdGhpcyBkb2VzIHRoZSBwcm9iZSBhbmQgcmV0dXJucyB0aGUgbm9kZSBhZGRyICovCisJCQljLmNvbW1hbmQgPSBMVF9JTklUOworCQkJYy5oaW50ID0gc2EtPnNhdF9hZGRyLnNfbm9kZTsKKworCQkJYWEtPnNfbm9kZSA9IGRvX3JlYWQoZGV2LCZjLHNpemVvZihjKSwmYywwKTsKKworCQkJLyogZ2V0IGFsbCBsbGFwIGZyYW1lcyByYXcgKi8KKwkJCWx0ZmxhZ3MgPSByZWFkXzMwKGRldik7CisJCQlsdGZsYWdzIHw9IExUX0ZMQUdfQUxMTEFQOworCQkJc2V0XzMwIChkZXYsbHRmbGFncyk7ICAKKworCQkJZGV2LT5icm9hZGNhc3RbMF0gPSAweEZGOworCQkJZGV2LT5kZXZfYWRkclswXSA9IGFhLT5zX25vZGU7CisKKwkJCWRldi0+YWRkcl9sZW49MTsKKyAgIAorCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTSU9DR0lGQUREUjoKKworCQkJc2EtPnNhdF9hZGRyLnNfbmV0ID0gYWEtPnNfbmV0OworCQkJc2EtPnNhdF9hZGRyLnNfbm9kZSA9IGFhLT5zX25vZGU7CisKKwkJCXJldHVybiAwOworCisJCWRlZmF1bHQ6IAorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBUaGlzIG5lZWRzIHRvIGJlIHByZXNlbnQgdG8ga2VlcCBuZXRhdGFsayBoYXBweS4gKi8KKwkvKiBBY3R1YWxseSBuZXRhdGFsayBuZWVkcyBmaXhpbmchICovCit9CisKK3N0YXRpYyBpbnQgbHRwY19oYXJkX2hlYWRlciAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisJdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisJaWYoZGVidWcgJiBERUJVR19WRVJCT1NFKQorCQlwcmludGsoImx0cGNfaGFyZF9oZWFkZXIgY2FsbGVkIGZvciBkZXZpY2UgJXNcbiIsCisJCQlkZXYtPm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGx0cGNfcG9sbF9jb3VudGVyOworCitzdGF0aWMgdm9pZCBsdHBjX3BvbGwodW5zaWduZWQgbG9uZyBsKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgbDsKKworCWRlbF90aW1lcigmbHRwY190aW1lcik7CisKKwlpZihkZWJ1ZyAmIERFQlVHX1ZFUkJPU0UpIHsKKwkJaWYgKCFsdHBjX3BvbGxfY291bnRlcikgeworCQkJbHRwY19wb2xsX2NvdW50ZXIgPSA1MDsKKwkJCXByaW50aygibHRwYyBwb2xsIGlzIGFsaXZlXG4iKTsKKwkJfQorCQlsdHBjX3BvbGxfY291bnRlci0tOworCX0KKyAgCisJaWYgKCFkZXYpCisJCXJldHVybjsgIC8qIHdlJ3ZlIGJlZW4gZG93bmVkICovCisKKwkvKiBwb2xsIDIwIHRpbWVzIHBlciBzZWNvbmQgKi8KKwlpZGxlKGRldik7CisJbHRwY190aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaLzIwOworCQorCWFkZF90aW1lcigmbHRwY190aW1lcik7Cit9CisKKy8qIEREUCB0byBMTEFQIHRyYW5zbGF0aW9uICovCisKK3N0YXRpYyBpbnQgbHRwY194bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogaW4ga2VybmVsIDEuMy54eCwgb24gZW50cnkgc2tiLT5kYXRhIHBvaW50cyB0byBkZHAgaGVhZGVyLAorCSAqIGFuZCBza2ItPmxlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBkZHAgZGF0YSArIGRkcCBoZWFkZXIKKwkgKi8KKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICYoKHN0cnVjdCBsdHBjX3ByaXZhdGUgKilkZXYtPnByaXYpLT5zdGF0czsKKworCWludCBpOworCXN0cnVjdCBsdF9zZW5kbGFwIGNidWY7CisKKwljYnVmLmNvbW1hbmQgPSBMVF9TRU5ETEFQOworCWNidWYuZG5vZGUgPSBza2ItPmRhdGFbMF07CisJY2J1Zi5sYXB0eXBlID0gc2tiLT5kYXRhWzJdOworCXNrYl9wdWxsKHNrYiwzKTsJLyogc2tpcCBwYXN0IExMQVAgaGVhZGVyICovCisJY2J1Zi5sZW5ndGggPSBza2ItPmxlbjsJLyogdGhpcyBpcyBob3N0IG9yZGVyICovCisJc2tiLT5oLnJhdz1za2ItPmRhdGE7CisKKwlpZihkZWJ1ZyAmIERFQlVHX1VQUEVSKSB7CisJCXByaW50aygiY29tbWFuZCAiKTsKKwkJZm9yKGk9MDtpPDY7aSsrKQorCQkJcHJpbnRrKCIlMDJ4ICIsKCh1bnNpZ25lZCBjaGFyICopJmNidWYpW2ldKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKworCWRvX3dyaXRlKGRldiwmY2J1ZixzaXplb2YoY2J1Ziksc2tiLT5oLnJhdyxza2ItPmxlbik7CisKKwlpZihkZWJ1ZyAmIERFQlVHX1VQUEVSKSB7CisJCXByaW50aygic2VudCAlZCBkZHAgYnl0ZXNcbiIsc2tiLT5sZW4pOworCQlmb3IoaT0wO2k8c2tiLT5sZW47aSsrKSBwcmludGsoIiUwMnggIixza2ItPmgucmF3W2ldKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKworCXN0YXRzLT50eF9wYWNrZXRzKys7CisJc3RhdHMtPnR4X2J5dGVzKz1za2ItPmxlbjsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsdHBjX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICYoKHN0cnVjdCBsdHBjX3ByaXZhdGUgKikgZGV2LT5wcml2KS0+c3RhdHM7CisJcmV0dXJuIHN0YXRzOworfQorCisvKiBpbml0aWFsaXphdGlvbiBzdHVmZiAqLworICAKK3N0YXRpYyBpbnQgX19pbml0IGx0cGNfcHJvYmVfZG1hKGludCBiYXNlLCBpbnQgZG1hKQoreworCWludCB3YW50ID0gKGRtYSA9PSAzKSA/IDIgOiAoZG1hID09IDEpID8gMSA6IDM7CisgIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisgIAl1bnNpZ25lZCBsb25nIGY7CisgIAorICAJaWYgKHdhbnQgJiAxKSB7CisJCWlmIChyZXF1ZXN0X2RtYSgxLCJsdHBjIikpIHsKKwkJCXdhbnQgJj0gfjE7CisJCX0gZWxzZSB7CisJCQlmPWNsYWltX2RtYV9sb2NrKCk7CisJCQlkaXNhYmxlX2RtYSgxKTsKKwkJCWNsZWFyX2RtYV9mZigxKTsKKwkJCXNldF9kbWFfbW9kZSgxLERNQV9NT0RFX1dSSVRFKTsKKwkJCXNldF9kbWFfYWRkcigxLHZpcnRfdG9fYnVzKGx0ZG1hYnVmKSk7CisJCQlzZXRfZG1hX2NvdW50KDEsc2l6ZW9mKHN0cnVjdCBsdF9tZW0pKTsKKwkJCWVuYWJsZV9kbWEoMSk7CisJCQlyZWxlYXNlX2RtYV9sb2NrKGYpOworCQl9CisJfQorCWlmICh3YW50ICYgMikgeworCQlpZiAocmVxdWVzdF9kbWEoMywibHRwYyIpKSB7CisJCQl3YW50ICY9IH4yOworCQl9IGVsc2UgeworCQkJZj1jbGFpbV9kbWFfbG9jaygpOworCQkJZGlzYWJsZV9kbWEoMyk7CisJCQljbGVhcl9kbWFfZmYoMyk7CisJCQlzZXRfZG1hX21vZGUoMyxETUFfTU9ERV9XUklURSk7CisJCQlzZXRfZG1hX2FkZHIoMyx2aXJ0X3RvX2J1cyhsdGRtYWJ1ZikpOworCQkJc2V0X2RtYV9jb3VudCgzLHNpemVvZihzdHJ1Y3QgbHRfbWVtKSk7CisJCQllbmFibGVfZG1hKDMpOworCQkJcmVsZWFzZV9kbWFfbG9jayhmKTsKKwkJfQorCX0KKwkvKiBzZXQgdXAgcmVxdWVzdCAqLworCisJLyogRklYTUUgLS0gZG8gdGltaW5ncyBiZXR0ZXIhICovCisKKwlsdGRtYWJ1ZlswXSA9IExUX1JFQURNRU07CisJbHRkbWFidWZbMV0gPSAxOyAgLyogbWFpbGJveCAqLworCWx0ZG1hYnVmWzJdID0gMDsgbHRkbWFidWZbM10gPSAwOyAgLyogYWRkcmVzcyAqLworCWx0ZG1hYnVmWzRdID0gMDsgbHRkbWFidWZbNV0gPSAxOyAgLyogcmVhZCAweDAxMDAgYnl0ZXMgKi8KKwlsdGRtYWJ1Zls2XSA9IDA7IC8qIGR1bm5vIGlmIHRoaXMgaXMgbmVjZXNzYXJ5ICovCisKKwlpbmJfcChpbysxKTsKKwlpbmJfcChpbyswKTsKKwl0aW1lb3V0ID0gamlmZmllcysxMDAqSFovMTAwOworCXdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWlmICggMHhmYSA9PSBpbmJfcChpbys2KSApIGJyZWFrOworCX0KKworCWluYl9wKGlvKzMpOworCWluYl9wKGlvKzIpOworCXdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWlmICggMHhmYiA9PSBpbmJfcChpbys2KSApIGJyZWFrOworCX0KKworCS8qIHJlbGVhc2UgdGhlIG90aGVyIGRtYSBjaGFubmVsIChpZiB3ZSBvcGVuZWQgYm90aCBvZiB0aGVtKSAqLworCisJaWYgKCh3YW50ICYgMikgJiYgKGdldF9kbWFfcmVzaWR1ZSgzKT09c2l6ZW9mKHN0cnVjdCBsdF9tZW0pKSkgeworCQl3YW50ICY9IH4yOworCQlmcmVlX2RtYSgzKTsKKwl9CisKKwlpZiAoKHdhbnQgJiAxKSAmJiAoZ2V0X2RtYV9yZXNpZHVlKDEpPT1zaXplb2Yoc3RydWN0IGx0X21lbSkpKSB7CisJCXdhbnQgJj0gfjE7CisJCWZyZWVfZG1hKDEpOworCX0KKworCWlmICghd2FudCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKHdhbnQgJiAyKSA/IDMgOiAxOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBsdHBjX3Byb2JlKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyID0gLUVOT01FTTsKKwlpbnQgeD0wLHk9MDsKKwlpbnQgYXV0b2lycTsKKwl1bnNpZ25lZCBsb25nIGY7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgbHRwY19wcml2YXRlKSwgImx0JWQiLCBsdGFsa19zZXR1cCk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0OworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJLyogcHJvYmUgZm9yIHRoZSBJL08gcG9ydCBhZGRyZXNzICovCisJCisJaWYgKGlvICE9IDB4MjQwICYmIHJlcXVlc3RfcmVnaW9uKDB4MjIwLDgsImx0cGMiKSkgeworCQl4ID0gaW5iX3AoMHgyMjArNik7CisJCWlmICggKHghPTB4ZmYpICYmICh4Pj0weGYwKSApIHsKKwkJCWlvID0gMHgyMjA7CisJCQlnb3RvIGdvdF9wb3J0OworCQl9CisJCXJlbGVhc2VfcmVnaW9uKDB4MjIwLDgpOworCX0KKwlpZiAoaW8gIT0gMHgyMjAgJiYgcmVxdWVzdF9yZWdpb24oMHgyNDAsOCwibHRwYyIpKSB7CisJCXkgPSBpbmJfcCgweDI0MCs2KTsKKwkJaWYgKCAoeSE9MHhmZikgJiYgKHk+PTB4ZjApICl7IAorCQkJaW8gPSAweDI0MDsKKwkJCWdvdG8gZ290X3BvcnQ7CisJCX0KKwkJcmVsZWFzZV9yZWdpb24oMHgyNDAsOCk7CisJfSAKKworCS8qIGdpdmUgdXAgaW4gZGVzcGFpciAqLworCXByaW50ayhLRVJOX0VSUiAiTG9jYWxUYWxrIGNhcmQgbm90IGZvdW5kOyAyMjAgPSAlMDJ4LCAyNDAgPSAlMDJ4LlxuIiwgeCx5KTsKKwllcnIgPSAtRU5PREVWOworCWdvdG8gb3V0MTsKKworIGdvdF9wb3J0OgorCS8qIHByb2JlIGZvciB0aGUgSVJRIGxpbmUgKi8KKwlpZiAoaXJxIDwgMikgeworCQl1bnNpZ25lZCBsb25nIGlycV9tYXNrOworCisJCWlycV9tYXNrID0gcHJvYmVfaXJxX29uKCk7CisJCS8qIHJlc2V0IHRoZSBpbnRlcnJ1cHQgbGluZSAqLworCQlpbmJfcChpbys3KTsKKwkJaW5iX3AoaW8rNyk7CisJCS8qIHRyaWdnZXIgYW4gaW50ZXJydXB0IChJIGhvcGUpICovCisJCWluYl9wKGlvKzYpOworCQltZGVsYXkoMik7CisJCWF1dG9pcnEgPSBwcm9iZV9pcnFfb2ZmKGlycV9tYXNrKTsKKworCQlpZiAoYXV0b2lycSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImx0cGM6IHByb2JlIGF0ICUjeCBmYWlsZWQgdG8gZGV0ZWN0IElSUSBsaW5lLlxuIiwgaW8pOworCQl9IGVsc2UgeworCQkJaXJxID0gYXV0b2lycTsKKwkJfQorCX0KKworCS8qIGFsbG9jYXRlIGEgRE1BIGJ1ZmZlciAqLworCWx0ZG1hYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgZG1hX21lbV9hbGxvYygxMDAwKTsKKwlpZiAoIWx0ZG1hYnVmKSB7CisJCXByaW50ayhLRVJOX0VSUiAibHRwYzogbWVtIGFsbG9jIGZhaWxlZFxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0MjsKKwl9CisKKwlsdGRtYWNidWYgPSAmbHRkbWFidWZbODAwXTsKKworCWlmKGRlYnVnICYgREVCVUdfVkVSQk9TRSkgeworCQlwcmludGsoImx0ZG1hYnVmIHBvaW50ZXIgJTA4bHhcbiIsKHVuc2lnbmVkIGxvbmcpIGx0ZG1hYnVmKTsKKwl9CisKKwkvKiByZXNldCB0aGUgY2FyZCAqLworCisJaW5iX3AoaW8rMSk7CisJaW5iX3AoaW8rMyk7CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dCgyKkhaLzEwMCk7CisKKwlpbmJfcChpbyswKTsKKwlpbmJfcChpbysyKTsKKwlpbmJfcChpbys3KTsgLyogY2xlYXIgcmVzZXQgKi8KKwlpbmJfcChpbys0KTsgCisJaW5iX3AoaW8rNSk7CisJaW5iX3AoaW8rNSk7IC8qIGVuYWJsZSBkbWEgKi8KKwlpbmJfcChpbys2KTsgLyogdHJpLXN0YXRlIGludGVycnVwdCBsaW5lICovCisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChIWik7CisJCisJLyogbm93LCBmaWd1cmUgb3V0IHdoaWNoIGRtYSBjaGFubmVsIHdlJ3JlIHVzaW5nLCB1bmxlc3MgaXQncworCSAgIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQgKi8KKwkvKiB3ZWxsLCAwIGlzIGEgbGVnYWwgRE1BIGNoYW5uZWwsIGJ1dCB0aGUgTFRQQyBjYXJkIGRvZXNuJ3QKKwkgICB1c2UgaXQuLi4gKi8KKwlkbWEgPSBsdHBjX3Byb2JlX2RtYShpbywgZG1hKTsKKwlpZiAoIWRtYSkgeyAgLyogbm8gZG1hIGNoYW5uZWwgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJObyBETUEgY2hhbm5lbCBmb3VuZCBvbiBsdHBjIGNhcmQuXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXQzOworCX0KKworCS8qIHByaW50IG91dCBmcmllbmRseSBtZXNzYWdlICovCisJaWYoaXJxKQorCQlwcmludGsoS0VSTl9JTkZPICJBcHBsZS9GYXJhbGxvbiBMb2NhbFRhbGstUEMgY2FyZCBhdCAlMDN4LCBJUiVkLCBETUElZC5cbiIsaW8saXJxLGRtYSk7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJBcHBsZS9GYXJhbGxvbiBMb2NhbFRhbGstUEMgY2FyZCBhdCAlMDN4LCBETUElZC4gIFVzaW5nIHBvbGxlZCBtb2RlLlxuIixpbyxkbWEpOworCisJLyogRmlsbCBpbiB0aGUgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlIHdpdGggZXRoZXJuZXQtZ2VuZXJpYyB2YWx1ZXMuICovCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBsdHBjX3htaXQ7CisJZGV2LT5oYXJkX2hlYWRlciA9IGx0cGNfaGFyZF9oZWFkZXI7CisJZGV2LT5nZXRfc3RhdHMgPSBsdHBjX2dldF9zdGF0czsKKworCS8qIGFkZCB0aGUgbHRwYy1zcGVjaWZpYyB0aGluZ3MgKi8KKwlkZXYtPmRvX2lvY3RsID0gJmx0cGNfaW9jdGw7CisKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5tY19saXN0ID0gTlVMTDsKKwlkZXYtPmJhc2VfYWRkciA9IGlvOworCWRldi0+aXJxID0gaXJxOworCWRldi0+ZG1hID0gZG1hOworCisJLyogdGhlIGNhcmQgd2lsbCB3YW50IHRvIHNlbmQgYSByZXN1bHQgYXQgdGhpcyBwb2ludCAqLworCS8qIChJIHRoaW5rLi4uIGxlYXZpbmcgb3V0IHRoaXMgcGFydCBtYWtlcyB0aGUga2VybmVsIGNyYXNoLAorICAgICAgICAgICBzbyBJIHB1dCBpdCBiYWNrIGluLi4uKSAqLworCisJZj1jbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGRtYSk7CisJY2xlYXJfZG1hX2ZmKGRtYSk7CisJc2V0X2RtYV9tb2RlKGRtYSxETUFfTU9ERV9SRUFEKTsKKwlzZXRfZG1hX2FkZHIoZG1hLHZpcnRfdG9fYnVzKGx0ZG1hYnVmKSk7CisJc2V0X2RtYV9jb3VudChkbWEsMHgxMDApOworCWVuYWJsZV9kbWEoZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGYpOworCisJKHZvaWQpIGluYl9wKGlvKzMpOworCSh2b2lkKSBpbmJfcChpbysyKTsKKwl0aW1lb3V0ID0gamlmZmllcysxMDAqSFovMTAwOworCisJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJaWYoIDB4ZjkgPT0gaW5iX3AoaW8rNikpCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9CisKKwlpZihkZWJ1ZyAmIERFQlVHX1ZFUkJPU0UpIHsKKwkJcHJpbnRrKCJzZXR0aW5nIHVwIHRpbWVyIGFuZCBpcnFcbiIpOworCX0KKworCS8qIGdyYWIgaXQgYW5kIGRvbid0IGxldCBnbyA6LSkgKi8KKwlpZiAoaXJxICYmIHJlcXVlc3RfaXJxKCBpcnEsICZsdHBjX2ludGVycnVwdCwgMCwgImx0cGMiLCBkZXYpID49IDApCisJeworCQkodm9pZCkgaW5iX3AoaW8rNyk7ICAvKiBlbmFibGUgaW50ZXJydXB0cyBmcm9tIGJvYXJkICovCisJCSh2b2lkKSBpbmJfcChpbys3KTsgIC8qIGFuZCByZXNldCBpcnEgbGluZSAqLworCX0gZWxzZSB7CisJCWlmKCBpcnEgKQorCQkJcHJpbnRrKEtFUk5fRVJSICJsdHBjOiBJUlEgYWxyZWFkeSBpbiB1c2UsIHVzaW5nIHBvbGxlZCBtb2RlLlxuIik7CisJCWRldi0+aXJxID0gMDsKKwkJLyogcG9sbGVkIG1vZGUgLS0gMjAgdGltZXMgcGVyIHNlY29uZCAqLworCQkvKiB0aGlzIGlzIHJlYWxseSwgcmVhbGx5IHNsb3cuLi4gc2hvdWxkIGl0IHBvbGwgbW9yZSBvZnRlbj8gKi8KKwkJaW5pdF90aW1lcigmbHRwY190aW1lcik7CisJCWx0cGNfdGltZXIuZnVuY3Rpb249bHRwY19wb2xsOworCQlsdHBjX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCisJCWx0cGNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWi8yMDsKKwkJYWRkX3RpbWVyKCZsdHBjX3RpbWVyKTsKKwl9CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ0OworCisJcmV0dXJuIE5VTEw7CitvdXQ0OgorCWRlbF90aW1lcl9zeW5jKCZsdHBjX3RpbWVyKTsKKwlpZiAoZGV2LT5pcnEpCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworb3V0MzoKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWx0ZG1hYnVmLCBnZXRfb3JkZXIoMTAwMCkpOworb3V0MjoKKwlyZWxlYXNlX3JlZ2lvbihpbywgOCk7CitvdXQxOgorCWZyZWVfbmV0ZGV2KGRldik7CitvdXQ6CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworI2lmbmRlZiBNT0RVTEUKKy8qIGhhbmRsZXMgImx0cGM9aW8saXJxLGRtYSIga2VybmVsIGNvbW1hbmQgbGluZXMgKi8KK3N0YXRpYyBpbnQgX19pbml0IGx0cGNfc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpbnRzWzVdOworCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKworCWlmIChpbnRzWzBdID09IDApIHsKKwkJaWYgKHN0ciAmJiAhc3RybmNtcChzdHIsICJhdXRvIiwgNCkpIHsKKwkJCS8qIGRvIG5vdGhpbmcgOi0pICovCisJCX0KKwkJZWxzZSB7CisJCQkvKiB1c2FnZSBtZXNzYWdlICovCisJCQlwcmludGsgKEtFUk5fRVJSCisJCQkJImx0cGM6IHVzYWdlOiBsdHBjPWF1dG98aW9iYXNlWyxpcnFbLGRtYV1dXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJaW8gPSBpbnRzWzFdOworCQlpZiAoaW50c1swXSA+IDEpIHsKKwkJCWlycSA9IGludHNbMl07CisJCX0KKwkJaWYgKGludHNbMF0gPiAyKSB7CisJCQlkbWEgPSBpbnRzWzNdOworCQl9CisJCS8qIGlnbm9yZSBhbnkgb3RoZXIgcGFyYW10ZXJzICovCisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJsdHBjPSIsIGx0cGNfc2V0dXApOworI2VuZGlmIC8qIE1PRFVMRSAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9sdHBjOworCisjaWZkZWYgTU9EVUxFCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDApOworCisKK2ludCBfX2luaXQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKyAgICAgICAgaWYoaW8gPT0gMCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFCisJCSAgICAgICAibHRwYzogQXV0b3Byb2JpbmcgaXMgbm90IHJlY29tbWVuZGVkIGZvciBtb2R1bGVzXG4iKTsKKworCWRldl9sdHBjID0gbHRwY19wcm9iZSgpOworCWlmIChJU19FUlIoZGV2X2x0cGMpKQorCQlyZXR1cm4gUFRSX0VSUihkZXZfbHRwYyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19leGl0IGx0cGNfY2xlYW51cCh2b2lkKQoreworCisJaWYoZGVidWcgJiBERUJVR19WRVJCT1NFKSBwcmludGsoInVucmVnaXN0ZXJfbmV0ZGV2XG4iKTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfbHRwYyk7CisKKwlsdHBjX3RpbWVyLmRhdGEgPSAwOyAgLyogc2lnbmFsIHRoZSBwb2xsIHJvdXRpbmUgdGhhdCB3ZSdyZSBkb25lICovCisKKwlkZWxfdGltZXJfc3luYygmbHRwY190aW1lcik7CisKKwlpZihkZWJ1ZyAmIERFQlVHX1ZFUkJPU0UpIHByaW50aygiZnJlZWluZyBpcnFcbiIpOworCisJaWYgKGRldl9sdHBjLT5pcnEpCisJCWZyZWVfaXJxKGRldl9sdHBjLT5pcnEsIGRldl9sdHBjKTsKKworCWlmKGRlYnVnICYgREVCVUdfVkVSQk9TRSkgcHJpbnRrKCJmcmVlaW5nIGRtYVxuIik7CisKKwlpZiAoZGV2X2x0cGMtPmRtYSkKKwkJZnJlZV9kbWEoZGV2X2x0cGMtPmRtYSk7CisKKwlpZihkZWJ1ZyAmIERFQlVHX1ZFUkJPU0UpIHByaW50aygiZnJlZWluZyBpb2FkZHJcbiIpOworCisJaWYgKGRldl9sdHBjLT5iYXNlX2FkZHIpCisJCXJlbGVhc2VfcmVnaW9uKGRldl9sdHBjLT5iYXNlX2FkZHIsOCk7CisKKwlmcmVlX25ldGRldihkZXZfbHRwYyk7CisKKwlpZihkZWJ1ZyAmIERFQlVHX1ZFUkJPU0UpIHByaW50aygiZnJlZV9wYWdlc1xuIik7CisKKwlmcmVlX3BhZ2VzKCAodW5zaWduZWQgbG9uZykgbHRkbWFidWYsIGdldF9vcmRlcigxMDAwKSk7CisKKwlpZihkZWJ1ZyAmIERFQlVHX1ZFUkJPU0UpIHByaW50aygicmV0dXJuaW5nIGZyb20gY2xlYW51cF9tb2R1bGVcbiIpOworfQorCittb2R1bGVfZXhpdChsdHBjX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2x0cGMuaCBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9sdHBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzMDU0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9sdHBjLmgKQEAgLTAsMCArMSw3MyBAQAorLyoqKiAgIGx0cGMuaAorICoKKyAqCisgKioqLworCisjZGVmaW5lIExUX0dFVFJFU1VMVCAgMHgwMAorI2RlZmluZSBMVF9XUklURU1FTSAgIDB4MDEKKyNkZWZpbmUgTFRfUkVBRE1FTSAgICAweDAyCisjZGVmaW5lIExUX0dFVEZMQUdTICAgMHgwNAorI2RlZmluZSBMVF9TRVRGTEFHUyAgIDB4MDUKKyNkZWZpbmUgTFRfSU5JVCAgICAgICAweDEwCisjZGVmaW5lIExUX1NFTkRMQVAgICAgMHgxMworI2RlZmluZSBMVF9SQ1ZMQVAgICAgIDB4MTQKKworLyogdGhlIGZsYWcgdGhhdCB3ZSBjYXJlIGFib3V0ICovCisjZGVmaW5lIExUX0ZMQUdfQUxMTEFQIDB4MDQKKworc3RydWN0IGx0X2dldHJlc3VsdCB7CisJdW5zaWduZWQgY2hhciBjb21tYW5kOworCXVuc2lnbmVkIGNoYXIgbWFpbGJveDsKK307CisKK3N0cnVjdCBsdF9tZW0geworCXVuc2lnbmVkIGNoYXIgY29tbWFuZDsKKwl1bnNpZ25lZCBjaGFyIG1haWxib3g7CisJdW5zaWduZWQgc2hvcnQgYWRkcjsJLyogaG9zdCBvcmRlciAqLworCXVuc2lnbmVkIHNob3J0IGxlbmd0aDsJLyogaG9zdCBvcmRlciAqLworfTsKKworc3RydWN0IGx0X3NldGZsYWdzIHsKKwl1bnNpZ25lZCBjaGFyIGNvbW1hbmQ7CisJdW5zaWduZWQgY2hhciBtYWlsYm94OworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7Cit9OworCitzdHJ1Y3QgbHRfZ2V0ZmxhZ3MgeworCXVuc2lnbmVkIGNoYXIgY29tbWFuZDsKKwl1bnNpZ25lZCBjaGFyIG1haWxib3g7Cit9OworCitzdHJ1Y3QgbHRfaW5pdCB7CisJdW5zaWduZWQgY2hhciBjb21tYW5kOworCXVuc2lnbmVkIGNoYXIgbWFpbGJveDsKKwl1bnNpZ25lZCBjaGFyIGhpbnQ7Cit9OworCitzdHJ1Y3QgbHRfc2VuZGxhcCB7CisJdW5zaWduZWQgY2hhciBjb21tYW5kOworCXVuc2lnbmVkIGNoYXIgbWFpbGJveDsKKwl1bnNpZ25lZCBjaGFyIGRub2RlOworCXVuc2lnbmVkIGNoYXIgbGFwdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBsZW5ndGg7CS8qIGhvc3Qgb3JkZXIgKi8KK307CisKK3N0cnVjdCBsdF9yY3ZsYXAgeworCXVuc2lnbmVkIGNoYXIgY29tbWFuZDsKKwl1bnNpZ25lZCBjaGFyIGRub2RlOworCXVuc2lnbmVkIGNoYXIgc25vZGU7CisJdW5zaWduZWQgY2hhciBsYXB0eXBlOworCXVuc2lnbmVkIHNob3J0IGxlbmd0aDsJLyogaG9zdCBvcmRlciAqLworfTsKKwordW5pb24gbHRfY29tbWFuZCB7CisJc3RydWN0IGx0X2dldHJlc3VsdCBnZXRyZXN1bHQ7CisJc3RydWN0IGx0X21lbSBtZW07CisJc3RydWN0IGx0X3NldGZsYWdzIHNldGZsYWdzOworCXN0cnVjdCBsdF9nZXRmbGFncyBnZXRmbGFnczsKKwlzdHJ1Y3QgbHRfaW5pdCBpbml0OworCXN0cnVjdCBsdF9zZW5kbGFwIHNlbmRsYXA7CisJc3RydWN0IGx0X3JjdmxhcCByY3ZsYXA7Cit9OwordHlwZWRlZiB1bmlvbiBsdF9jb21tYW5kIGx0X2NvbW1hbmQ7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FyY25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvYXJjbmV0L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4ZGUyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9LY29uZmlnCkBAIC0wLDAgKzEsMTQwIEBACisjCisjIEFyY25ldCBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIkFSQ25ldCBkZXZpY2VzIgorCWRlcGVuZHMgb24gTkVUREVWSUNFUyAmJiAoSVNBIHx8IFBDSSkKKworY29uZmlnIEFSQ05FVAorCXRyaXN0YXRlICJBUkNuZXQgc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCBjaGVjayBvdXQgdGhlCisJICAoYXJndWFibHkpIGJlYXV0aWZ1bCBwb2V0cnkgaW4KKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9hcmNuZXQudHh0Pi4KKworCSAgWW91IG5lZWQgYm90aCB0aGlzIGRyaXZlciwgYW5kIHRoZSBkcml2ZXIgZm9yIHRoZSBwYXJ0aWN1bGFyIEFSQ25ldAorCSAgY2hpcHNldCBvZiB5b3VyIGNhcmQuIElmIHlvdSBkb24ndCBrbm93LCB0aGVuIGl0J3MgcHJvYmFibHkgYQorCSAgQ09NOTB4eCB0eXBlIGNhcmQsIHNvIHNheSBZIChvciBNKSB0byAiQVJDbmV0IENPTTkweHggY2hpcHNldAorCSAgc3VwcG9ydCIgYmVsb3cuCisKKwkgIFlvdSBtaWdodCBhbHNvIHdhbnQgdG8gaGF2ZSBhIGxvb2sgYXQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUKKwkgIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPihldmVuIHRob3VnaCBBUkNuZXQKKwkgIGlzIG5vdCByZWFsbHkgRXRoZXJuZXQpLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGFyY25ldC4KKworY29uZmlnIEFSQ05FVF8xMjAxCisJdHJpc3RhdGUgIkVuYWJsZSBzdGFuZGFyZCBBUkNOZXQgcGFja2V0IGZvcm1hdCAoUkZDIDEyMDEpIgorCWRlcGVuZHMgb24gQVJDTkVUCisJaGVscAorCSAgVGhpcyBhbGxvd3MgeW91IHRvIHVzZSBSRkMxMjAxIHdpdGggeW91ciBBUkNuZXQgY2FyZCB2aWEgdGhlIHZpcnR1YWwKKwkgIGFyYzAgZGV2aWNlLiAgWW91IG5lZWQgdG8gc2F5IFkgaGVyZSB0byBjb21tdW5pY2F0ZSB3aXRoCisJICBpbmR1c3RyeS1zdGFuZGFyZCBSRkMxMjAxIGltcGxlbWVudGF0aW9ucywgbGlrZSB0aGUgYXJjZXRoZXIuY29tCisJICBwYWNrZXQgZHJpdmVyIG9yIG1vc3QgRE9TL1dpbmRvd3MgT0RJIGRyaXZlcnMuICBQbGVhc2UgcmVhZCB0aGUKKwkgIEFSQ25ldCBkb2N1bWVudGF0aW9uIGluIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9hcmNuZXQudHh0PgorCSAgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgYXJjMC4KKworY29uZmlnIEFSQ05FVF8xMDUxCisJdHJpc3RhdGUgIkVuYWJsZSBvbGQgQVJDTmV0IHBhY2tldCBmb3JtYXQgKFJGQyAxMDUxKSIKKwlkZXBlbmRzIG9uIEFSQ05FVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgYWxsb3dzIHlvdSB0byB1c2UgUkZDMTA1MSB3aXRoIHlvdXIgQVJDbmV0IGNhcmQgdmlhIHRoZSB2aXJ0dWFsCisJICBhcmMwcyBkZXZpY2UuIFlvdSBvbmx5IG5lZWQgYXJjMHMgaWYgeW91IHdhbnQgdG8gdGFsayB0byBBUkNuZXQKKwkgIHNvZnR3YXJlIGNvbXBseWluZyB3aXRoIHRoZSAib2xkIiBzdGFuZGFyZCwgc3BlY2lmaWNhbGx5LCB0aGUgRE9TCisJICBhcmNuZXQuY29tIHBhY2tldCBkcml2ZXIsIEFtaWdhcyBydW5uaW5nIEFtaVRDUCwgYW5kIHNvbWUgdmFyaWFudHMKKwkgIG9mIE5ldEJTRC4gWW91IGRvIG5vdCBuZWVkIHRvIHNheSBZIGhlcmUgdG8gY29tbXVuaWNhdGUgd2l0aAorCSAgaW5kdXN0cnktc3RhbmRhcmQgUkZDMTIwMSBpbXBsZW1lbnRhdGlvbnMsIGxpa2UgdGhlIGFyY2V0aGVyLmNvbQorCSAgcGFja2V0IGRyaXZlciBvciBtb3N0IERPUy9XaW5kb3dzIE9ESSBkcml2ZXJzLiBSRkMxMjAxIGlzIGluY2x1ZGVkCisJICBhdXRvbWF0aWNhbGx5IGFzIHRoZSBhcmMwIGRldmljZS4gUGxlYXNlIHJlYWQgdGhlIEFSQ25ldAorCSAgZG9jdW1lbnRhdGlvbiBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYXJjbmV0LnR4dD4gZm9yIG1vcmUKKwkgIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIGFyYzBlIGFuZCBhcmMwcy4KKworY29uZmlnIEFSQ05FVF9SQVcKKwl0cmlzdGF0ZSAiRW5hYmxlIHJhdyBtb2RlIHBhY2tldCBpbnRlcmZhY2UiCisJZGVwZW5kcyBvbiBBUkNORVQKKwloZWxwCisJICBBUkNuZXQgInJhdyBtb2RlIiBwYWNrZXQgZW5jYXBzdWxhdGlvbiwgbm8gc29mdCBoZWFkZXJzLiAgVW5saWtlbHkKKwkgIHRvIHdvcmsgdW5sZXNzIHRhbGtpbmcgdG8gYSBjb3B5IG9mIHRoZSBzYW1lIExpbnV4IGFyY25ldCBkcml2ZXIsCisJICBidXQgcGVyaGFwcyBtYXJnaW5hbGx5IGZhc3RlciBpbiB0aGF0IGNhc2UuCisKK2NvbmZpZyBBUkNORVRfQ0FQCisJdHJpc3RhdGUgIkVuYWJsZSBDQVAgbW9kZSBwYWNrZXQgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gQVJDTkVUCisJaGVscAorCSAgQVJDbmV0ICJjYXAgbW9kZSIgcGFja2V0IGVuY2Fwc3VsYXRpb24uIFVzZWQgdG8gZ2V0IHRoZSBoYXJkd2FyZQorICAgICAgICAgIGFja25vd2xlZGdlIGJhY2sgdG8gdXNlcnNwYWNlLiBBZnRlciB0aGUgaW5pdGlhbCBwcm90b2NvbCBieXRlIGV2ZXJ5CisgICAgICAgICAgcGFja2V0IGlzIHN0dWZmZWQgd2l0aCBhbiBleHRyYSA0IGJ5dGUgImNvb2tpZSIgd2hpY2ggZG9lc24ndAorICAgICAgICAgIGFjdHVhbGx5IGFwcGVhciBvbiB0aGUgbmV0d29yay4gQWZ0ZXIgdHJhbnNtaXQgdGhlIGRyaXZlciB3aWxsIHNlbmQKKyAgICAgICAgICBiYWNrIGEgcGFja2V0IHdpdGggcHJvdG9jb2wgYnl0ZSAwIGNvbnRhaW5pbmcgdGhlIHN0YXR1cyBvZiB0aGUKKyAgICAgICAgICB0cmFuc21pdGlvbjoKKyAgICAgICAgICAgICAwPW5vIGhhcmR3YXJlIGFja25vd2xlZGdlCisgICAgICAgICAgICAgMT1leGNlc3NpdmUgbmFrCisgICAgICAgICAgICAgMj10cmFuc21pdGlvbiBhY2NlcHRlZCBieSB0aGUgcmVjaWV2ZXIgaGFyZHdhcmUKKworICAgICAgICAgIFJlY2VpdmVkIHBhY2tldHMgYXJlIGFsc28gc3R1ZmZlZCB3aXRoIHRoZSBleHRyYSA0IGJ5dGVzIGJ1dCBpdCB3aWxsCisgICAgICAgICAgYmUgcmFuZG9tIGRhdGEuCisKKyAgICAgICAgICBDYXAgb25seSBsaXN0ZW5zIHRvIHByb3RvY29sIDEtOC4KKworY29uZmlnIEFSQ05FVF9DT005MHh4CisJdHJpc3RhdGUgIkFSQ25ldCBDT005MHh4IChub3JtYWwpIGNoaXBzZXQgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJDTkVUCisJaGVscAorCSAgVGhpcyBpcyB0aGUgY2hpcHNldCBkcml2ZXIgZm9yIHRoZSBzdGFuZGFyZCBDT005MHh4IGNhcmRzLiBJZiB5b3UKKwkgIGhhdmUgYWx3YXlzIHVzZWQgdGhlIG9sZCBBUkNuZXQgZHJpdmVyIHdpdGhvdXQga25vd2luZyB3aGF0IHR5cGUgb2YKKwkgIGNhcmQgeW91IGhhZCwgdGhpcyBpcyBwcm9iYWJseSB0aGUgb25lIGZvciB5b3UuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgY29tOTB4eC4KKworY29uZmlnIEFSQ05FVF9DT005MHh4SU8KKwl0cmlzdGF0ZSAiQVJDbmV0IENPTTkweHggKElPIG1hcHBlZCkgY2hpcHNldCBkcml2ZXIiCisJZGVwZW5kcyBvbiBBUkNORVQKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBjaGlwc2V0IGRyaXZlciBmb3IgdGhlIENPTTkweHggY2FyZHMsIHVzaW5nIHRoZW0gaW4KKwkgIElPLW1hcHBlZCBtb2RlIGluc3RlYWQgb2YgbWVtb3J5LW1hcHBlZCBtb2RlLiBUaGlzIGlzIHNsb3dlciB0aGFuCisJICB0aGUgbm9ybWFsIGRyaXZlci4gT25seSB1c2UgaXQgaWYgeW91ciBjYXJkIGRvZXNuJ3Qgc3VwcG9ydCBzaGFyZWQKKwkgIG1lbW9yeS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBjb205MGlvLgorCitjb25maWcgQVJDTkVUX1JJTV9JCisJdHJpc3RhdGUgIkFSQ25ldCBDT005MHh4IChSSU0gSSkgY2hpcHNldCBkcml2ZXIiCisJZGVwZW5kcyBvbiBBUkNORVQKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHlldCBhbm90aGVyIGNoaXBzZXQgZHJpdmVyIGZvciB0aGUgQ09NOTB4eCBjYXJkcywgYnV0IHRoaXMKKwkgIHRpbWUgb25seSB1c2luZyBtZW1vcnktbWFwcGVkIG1vZGUsIGFuZCBubyBJTyBwb3J0cyBhdCBhbGwuIFRoaXMKKwkgIGRyaXZlciBpcyBjb21wbGV0ZWx5IHVudGVzdGVkLCBzbyBpZiB5b3UgaGF2ZSBvbmUgb2YgdGhlc2UgY2FyZHMsCisJICBwbGVhc2UgbWFpbCA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4sIGVzcGVjaWFsbHkgaWYgaXQgd29ya3MhCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgYXJjLXJpbWkuCisKK2NvbmZpZyBBUkNORVRfQ09NMjAwMjAKKwl0cmlzdGF0ZSAiQVJDbmV0IENPTTIwMDIwIGNoaXBzZXQgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJDTkVUCisJaGVscAorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgbmV3IENPTTIwMDIwIGNoaXBzZXQuIEl0IHN1cHBvcnRzIHN1Y2gKKwkgIHRoaW5ncyBhcyBwcm9taXNjdW91cyBtb2RlLCBzbyBwYWNrZXQgc25pZmZpbmcgaXMgcG9zc2libGUsIGFuZAorCSAgZXh0cmEgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBjb20yMDAyMC4KKworY29uZmlnIEFSQ05FVF9DT00yMDAyMF9JU0EKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgQ09NMjAwMjAgb24gSVNBIgorCWRlcGVuZHMgb24gQVJDTkVUX0NPTTIwMDIwICYmIElTQQorCitjb25maWcgQVJDTkVUX0NPTTIwMDIwX1BDSQorCXRyaXN0YXRlICJTdXBwb3J0IGZvciBDT00yMDAyMCBvbiBQQ0kiCisJZGVwZW5kcyBvbiBBUkNORVRfQ09NMjAwMjAgJiYgUENJCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvYXJjbmV0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjFhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIyBNYWtlZmlsZSBmb3IgbGludXgvZHJpdmVycy9uZXQvYXJjbmV0CisjCisKK29iai0kKENPTkZJR19BUkNORVQpICs9IGFyY25ldC5vCitvYmotJChDT05GSUdfQVJDTkVUXzEyMDEpICs9IHJmYzEyMDEubworb2JqLSQoQ09ORklHX0FSQ05FVF8xMDUxKSArPSByZmMxMDUxLm8KK29iai0kKENPTkZJR19BUkNORVRfUkFXKSArPSBhcmMtcmF3bW9kZS5vCitvYmotJChDT05GSUdfQVJDTkVUX0NBUCkgKz0gY2FwbW9kZS5vCitvYmotJChDT05GSUdfQVJDTkVUX0NPTTkweHgpICs9IGNvbTkweHgubworb2JqLSQoQ09ORklHX0FSQ05FVF9DT005MHh4SU8pICs9IGNvbTkwaW8ubworb2JqLSQoQ09ORklHX0FSQ05FVF9SSU1fSSkgKz0gYXJjLXJpbWkubworb2JqLSQoQ09ORklHX0FSQ05FVF9DT00yMDAyMCkgKz0gY29tMjAwMjAubworb2JqLSQoQ09ORklHX0FSQ05FVF9DT00yMDAyMF9JU0EpICs9IGNvbTIwMDIwLWlzYS5vCitvYmotJChDT05GSUdfQVJDTkVUX0NPTTIwMDIwX1BDSSkgKz0gY29tMjAwMjAtcGNpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FyY25ldC9hcmMtcmF3bW9kZS5jIGIvZHJpdmVycy9uZXQvYXJjbmV0L2FyYy1yYXdtb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFlYTI5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9hcmMtcmF3bW9kZS5jCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogTGludXggQVJDbmV0IGRyaXZlciAtICJyYXcgbW9kZSIgcGFja2V0IGVuY2Fwc3VsYXRpb24gKG5vIHNvZnQgaGVhZGVycykKKyAqIAorICogV3JpdHRlbiAxOTk0LTE5OTkgYnkgQXZlcnkgUGVubmFydW4uCisgKiBEZXJpdmVkIGZyb20gc2tlbGV0b24uYyBieSBEb25hbGQgQmVja2VyLgorICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIENvbnRlbXBvcmFyeSBDb250cm9scywgSW5jLiAod3d3LmNjb250cm9scy5jb20pCisgKiAgZm9yIHNwb25zb3JpbmcgdGhlIGZ1cnRoZXIgZGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgb2Ygc2tlbGV0b24uYyB3YXMgYXMgZm9sbG93czoKKyAqCisgKiBza2VsZXRvbi5jIFdyaXR0ZW4gMTk5MyBieSBEb25hbGQgQmVja2VyLgorICogQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICogRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZAorICogYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBtb2RpZmllZCBieSBTUkMsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgZHJpdmVycy9uZXQvYXJjbmV0LmMKKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYXJjZGV2aWNlLmg+CisKKyNkZWZpbmUgVkVSU0lPTiAiYXJjbmV0OiByYXcgbW9kZSAoYHInKSBlbmNhcHN1bGF0aW9uIHN1cHBvcnQgbG9hZGVkLlxuIgorCisKK3N0YXRpYyB2b2lkIHJ4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sCisJICAgICAgIHN0cnVjdCBhcmNoZHIgKnBrdGhkciwgaW50IGxlbmd0aCk7CitzdGF0aWMgaW50IGJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJdW5zaWduZWQgc2hvcnQgdHlwZSwgdWludDhfdCBkYWRkcik7CitzdGF0aWMgaW50IHByZXBhcmVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGFyY2hkciAqcGt0LCBpbnQgbGVuZ3RoLAorCQkgICAgICBpbnQgYnVmbnVtKTsKKworc3RydWN0IEFyY1Byb3RvIHJhd21vZGVfcHJvdG8gPQoreworCS5zdWZmaXgJCT0gJ3InLAorCS5tdHUJCT0gWE1UVSwKKwkucngJCT0gcngsCisJLmJ1aWxkX2hlYWRlcgk9IGJ1aWxkX2hlYWRlciwKKwkucHJlcGFyZV90eAk9IHByZXBhcmVfdHgsCisJLmNvbnRpbnVlX3R4ICAgID0gTlVMTCwKKwkuYWNrX3R4ICAgICAgICAgPSBOVUxMCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGFyY25ldF9yYXdfaW5pdCh2b2lkKQoreworCWludCBjb3VudDsKKworCXByaW50ayhWRVJTSU9OKTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDI1NjsgY291bnQrKykKKwkJaWYgKGFyY19wcm90b19tYXBbY291bnRdID09IGFyY19wcm90b19kZWZhdWx0KQorCQkJYXJjX3Byb3RvX21hcFtjb3VudF0gPSAmcmF3bW9kZV9wcm90bzsKKworCS8qIGZvciByYXcgbW9kZSwgd2Ugb25seSBzZXQgdGhlIGJjYXN0IHByb3RvIGlmIHRoZXJlJ3Mgbm8gYmV0dGVyIG9uZSAqLworCWlmIChhcmNfYmNhc3RfcHJvdG8gPT0gYXJjX3Byb3RvX2RlZmF1bHQpCisJCWFyY19iY2FzdF9wcm90byA9ICZyYXdtb2RlX3Byb3RvOworCisJYXJjX3Byb3RvX2RlZmF1bHQgPSAmcmF3bW9kZV9wcm90bzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFyY25ldF9yYXdfZXhpdCh2b2lkKQoreworCWFyY25ldF91bnJlZ2lzdGVyX3Byb3RvKCZyYXdtb2RlX3Byb3RvKTsKK30KKworbW9kdWxlX2luaXQoYXJjbmV0X3Jhd19pbml0KTsKK21vZHVsZV9leGl0KGFyY25ldF9yYXdfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCisvKiBwYWNrZXQgcmVjZWl2ZXIgKi8KK3N0YXRpYyB2b2lkIHJ4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sCisJICAgICAgIHN0cnVjdCBhcmNoZHIgKnBrdGhkciwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBhcmNoZHIgKnBrdCA9IHBrdGhkcjsKKwlpbnQgb2ZzOworCisJQlVHTVNHKERfRFVSSU5HLCAiaXQncyBhIHJhdyBwYWNrZXQgKGxlbmd0aD0lZClcbiIsIGxlbmd0aCk7CisKKwlpZiAobGVuZ3RoID49IE1pblRVKQorCQlvZnMgPSA1MTIgLSBsZW5ndGg7CisJZWxzZQorCQlvZnMgPSAyNTYgLSBsZW5ndGg7CisKKwlza2IgPSBhbGxvY19za2IobGVuZ3RoICsgQVJDX0hEUl9TSVpFLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJQlVHTVNHKERfTk9STUFMLCAiTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIpOworCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCXNrYl9wdXQoc2tiLCBsZW5ndGggKyBBUkNfSERSX1NJWkUpOworCXNrYi0+ZGV2ID0gZGV2OworCisJcGt0ID0gKHN0cnVjdCBhcmNoZHIgKikgc2tiLT5kYXRhOworCisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9wdWxsKHNrYiwgQVJDX0hEUl9TSVpFKTsKKworCS8qIHVwIHRvIHNpemVvZihwa3QtPnNvZnQpIGhhcyBhbHJlYWR5IGJlZW4gY29waWVkIGZyb20gdGhlIGNhcmQgKi8KKwltZW1jcHkocGt0LCBwa3RoZHIsIHNpemVvZihzdHJ1Y3QgYXJjaGRyKSk7CisJaWYgKGxlbmd0aCA+IHNpemVvZihwa3QtPnNvZnQpKQorCQlscC0+aHcuY29weV9mcm9tX2NhcmQoZGV2LCBidWZudW0sIG9mcyArIHNpemVvZihwa3QtPnNvZnQpLAorCQkJCSAgICAgIHBrdC0+c29mdC5yYXcgKyBzaXplb2YocGt0LT5zb2Z0KSwKKwkJCQkgICAgICBsZW5ndGggLSBzaXplb2YocGt0LT5zb2Z0KSk7CisKKwlCVUdMVkwoRF9TS0IpIGFyY25ldF9kdW1wX3NrYihkZXYsIHNrYiwgInJ4Iik7CisKKwlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9BUkNORVQpOworOworCW5ldGlmX3J4KHNrYik7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK30KKworCisvKgorICogQ3JlYXRlIHRoZSBBUkNuZXQgaGFyZC9zb2Z0IGhlYWRlcnMgZm9yIHJhdyBtb2RlLgorICogVGhlcmUgYXJlbid0IGFueSBzb2Z0IGhlYWRlcnMgaW4gcmF3IG1vZGUgLSBub3QgZXZlbiB0aGUgcHJvdG9jb2wgaWQuCisgKi8KK3N0YXRpYyBpbnQgYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQl1bnNpZ25lZCBzaG9ydCB0eXBlLCB1aW50OF90IGRhZGRyKQoreworCWludCBoZHJfc2l6ZSA9IEFSQ19IRFJfU0laRTsKKwlzdHJ1Y3QgYXJjaGRyICpwa3QgPSAoc3RydWN0IGFyY2hkciAqKSBza2JfcHVzaChza2IsIGhkcl9zaXplKTsKKworCS8qCisJICogU2V0IHRoZSBzb3VyY2UgaGFyZHdhcmUgYWRkcmVzcy4KKwkgKgorCSAqIFRoaXMgaXMgcHJldHR5IHBvaW50bGVzcyBmb3IgbW9zdCBwdXJwb3NlcywgYnV0IGl0IGNhbiBoZWxwIGluCisJICogZGVidWdnaW5nLiAgQVJDbmV0IGRvZXMgbm90IGFsbG93IHVzIHRvIGNoYW5nZSB0aGUgc291cmNlIGFkZHJlc3MgaW4KKwkgKiB0aGUgYWN0dWFsIHBhY2tldCBzZW50KQorCSAqLworCXBrdC0+aGFyZC5zb3VyY2UgPSAqZGV2LT5kZXZfYWRkcjsKKworCS8qIHNlZSBsaW51eC9uZXQvZXRoZXJuZXQvZXRoLmMgdG8gc2VlIHdoZXJlIEkgZ290IHRoZSBmb2xsb3dpbmcgKi8KKworCWlmIChkZXYtPmZsYWdzICYgKElGRl9MT09QQkFDSyB8IElGRl9OT0FSUCkpIHsKKwkJLyogCisJCSAqIEZJWE1FOiBmaWxsIGluIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGRlc3QgaXBhZGRyIGhlcmUgdG8gYmV0dGVyCisJCSAqIGNvbXBseSB3aXRoIFJGQzEwNTEgaW4gIm5vYXJwIiBtb2RlLgorCQkgKi8KKwkJcGt0LT5oYXJkLmRlc3QgPSAwOworCQlyZXR1cm4gaGRyX3NpemU7CisJfQorCS8qIG90aGVyd2lzZSwganVzdCBmaWxsIGl0IGluIGFuZCBnbyEgKi8KKwlwa3QtPmhhcmQuZGVzdCA9IGRhZGRyOworCisJcmV0dXJuIGhkcl9zaXplOwkvKiBzdWNjZXNzICovCit9CisKKworc3RhdGljIGludCBwcmVwYXJlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBhcmNoZHIgKnBrdCwgaW50IGxlbmd0aCwKKwkJICAgICAgaW50IGJ1Zm51bSkKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXJjX2hhcmR3YXJlICpoYXJkID0gJnBrdC0+aGFyZDsKKwlpbnQgb2ZzOworCisJQlVHTVNHKERfRFVSSU5HLCAicHJlcGFyZV90eDogdHhidWZzPSVkLyVkLyVkXG4iLAorCSAgICAgICBscC0+bmV4dF90eCwgbHAtPmN1cl90eCwgYnVmbnVtKTsKKworCWxlbmd0aCAtPSBBUkNfSERSX1NJWkU7CS8qIGhhcmQgaGVhZGVyIGlzIG5vdCBpbmNsdWRlZCBpbiBwYWNrZXQgbGVuZ3RoICovCisKKwlpZiAobGVuZ3RoID4gWE1UVSkgeworCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuISBvdGhlciBwZW9wbGUgYWxyZWFkeSBjaGVjayBmb3IgdGhpcy4gKi8KKwkJQlVHTVNHKERfTk9STUFMLCAiQnVnISAgcHJlcGFyZV90eCB3aXRoIHNpemUgJWQgKD4gJWQpXG4iLAorCQkgICAgICAgbGVuZ3RoLCBYTVRVKTsKKwkJbGVuZ3RoID0gWE1UVTsKKwl9CisJaWYgKGxlbmd0aCA+IE1pblRVKSB7CisJCWhhcmQtPm9mZnNldFswXSA9IDA7CisJCWhhcmQtPm9mZnNldFsxXSA9IG9mcyA9IDUxMiAtIGxlbmd0aDsKKwl9IGVsc2UgaWYgKGxlbmd0aCA+IE1UVSkgeworCQloYXJkLT5vZmZzZXRbMF0gPSAwOworCQloYXJkLT5vZmZzZXRbMV0gPSBvZnMgPSA1MTIgLSBsZW5ndGggLSAzOworCX0gZWxzZQorCQloYXJkLT5vZmZzZXRbMF0gPSBvZnMgPSAyNTYgLSBsZW5ndGg7CisKKwlCVUdNU0coRF9EVVJJTkcsICJwcmVwYXJlX3R4OiBsZW5ndGg9JWQgb2ZzPSVkXG4iLAorCSAgICAgICBsZW5ndGgsb2ZzKTsKKworCWxwLT5ody5jb3B5X3RvX2NhcmQoZGV2LCBidWZudW0sIDAsIGhhcmQsIEFSQ19IRFJfU0laRSk7CisJbHAtPmh3LmNvcHlfdG9fY2FyZChkZXYsIGJ1Zm51bSwgb2ZzLCAmcGt0LT5zb2Z0LCBsZW5ndGgpOworCisJbHAtPmxhc3Rsb2FkX2Rlc3QgPSBoYXJkLT5kZXN0OworCisJcmV0dXJuIDE7CQkvKiBkb25lICovCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvYXJjLXJpbWkuYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9hcmMtcmltaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YzNmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjLXJpbWkuYwpAQCAtMCwwICsxLDM2OCBAQAorLyoKKyAqIExpbnV4IEFSQ25ldCBkcml2ZXIgLSAiUklNIEkiIChlbnRpcmVseSBtZW0tbWFwcGVkKSBjYXJkcworICogCisgKiBXcml0dGVuIDE5OTQtMTk5OSBieSBBdmVyeSBQZW5uYXJ1bi4KKyAqIFdyaXR0ZW4gMTk5OS0yMDAwIGJ5IE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6Pi4KKyAqIERlcml2ZWQgZnJvbSBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gQ29udGVtcG9yYXJ5IENvbnRyb2xzLCBJbmMuICh3d3cuY2NvbnRyb2xzLmNvbSkKKyAqICBmb3Igc3BvbnNvcmluZyB0aGUgZnVydGhlciBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIG9yaWdpbmFsIGNvcHlyaWdodCBvZiBza2VsZXRvbi5jIHdhcyBhcyBmb2xsb3dzOgorICoKKyAqIHNrZWxldG9uLmMgV3JpdHRlbiAxOTkzIGJ5IERvbmFsZCBCZWNrZXIuCisgKiBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiAgVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkCisgKiBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIG1vZGlmaWVkIGJ5IFNSQywgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSBkcml2ZXJzL25ldC9hcmNuZXQuYworICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9hcmNkZXZpY2UuaD4KKworCisjZGVmaW5lIFZFUlNJT04gImFyY25ldDogUklNIEkgKGVudGlyZWx5IG1lbS1tYXBwZWQpIHN1cHBvcnRcbiIKKworCisvKiBJbnRlcm5hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KKworc3RhdGljIGludCBhcmNyaW1pX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhcmNyaW1pX2ZvdW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYXJjcmltaV9jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb21tYW5kKTsKK3N0YXRpYyBpbnQgYXJjcmltaV9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhcmNyaW1pX3NldG1hc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1hc2spOworc3RhdGljIGludCBhcmNyaW1pX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWFsbHlfcmVzZXQpOworc3RhdGljIHZvaWQgYXJjcmltaV9jb3B5X3RvX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwgaW50IG9mZnNldCwKKwkJCQkgdm9pZCAqYnVmLCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgYXJjcmltaV9jb3B5X2Zyb21fY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLCBpbnQgb2Zmc2V0LAorCQkJCSAgIHZvaWQgKmJ1ZiwgaW50IGNvdW50KTsKKworLyogSGFuZHkgZGVmaW5lcyBmb3IgQVJDbmV0IHNwZWNpZmljIHN0dWZmICovCisKKy8qIEFtb3VudCBvZiBJL08gbWVtb3J5IHVzZWQgYnkgdGhlIGNhcmQgKi8KKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDUxMikKKyNkZWZpbmUgTUlSUk9SX1NJWkUgKEJVRkZFUl9TSVpFKjQpCisKKy8qIENPTSA5MDI2IGNvbnRyb2xsZXIgY2hpcCAtLT4gQVJDbmV0IHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworI2RlZmluZSBfSU5UTUFTSyAoaW9hZGRyKzApCS8qIHdyaXRhYmxlICovCisjZGVmaW5lIF9TVEFUVVMgIChpb2FkZHIrMCkJLyogcmVhZGFibGUgKi8KKyNkZWZpbmUgX0NPTU1BTkQgKGlvYWRkcisxKQkvKiB3cml0YWJsZSwgcmV0dXJucyByYW5kb20gdmFscyBvbiByZWFkICg/KSAqLworI2RlZmluZSBfUkVTRVQgIChpb2FkZHIrOCkJLyogc29mdHdhcmUgcmVzZXQgKG9uIHJlYWQpICovCisjZGVmaW5lIF9NRU1EQVRBICAoaW9hZGRyKzEyKQkvKiBEYXRhIHBvcnQgZm9yIElPLW1hcHBlZCBtZW1vcnkgKi8KKyNkZWZpbmUgX0FERFJfSEkgIChpb2FkZHIrMTUpCS8qIENvbnRyb2wgcmVnaXN0ZXJzIGZvciBzYWlkICovCisjZGVmaW5lIF9BRERSX0xPICAoaW9hZGRyKzE0KQorI2RlZmluZSBfQ09ORklHICAoaW9hZGRyKzIpCS8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKworI3VuZGVmIEFTVEFUVVMKKyN1bmRlZiBBQ09NTUFORAorI3VuZGVmIEFJTlRNQVNLCisKKyNkZWZpbmUgQVNUQVRVUygpCXJlYWRiKF9TVEFUVVMpCisjZGVmaW5lIEFDT01NQU5EKGNtZCkJd3JpdGViKChjbWQpLF9DT01NQU5EKQorI2RlZmluZSBBSU5UTUFTSyhtc2spCXdyaXRlYigobXNrKSxfSU5UTUFTSykKKyNkZWZpbmUgU0VUQ09ORigpCXdyaXRlYihscC0+Y29uZmlnLF9DT05GSUcpCisKKworLyoKKyAqIFdlIGNhbm5vdCBwcm9iZSBmb3IgYSBSSU0gSSBjYXJkOyBvbmUgcmVhc29uIGlzIEkgZG9uJ3Qga25vdyBob3cgdG8gcmVzZXQKKyAqIHRoZW0uICBJbiBmYWN0LCB3ZSBjYW4ndCBldmVuIGdldCB0aGVpciBub2RlIElEIGF1dG9tYXRpY2FsbHkuICBTbywgd2UKKyAqIG5lZWQgdG8gYmUgcGFzc2VkIGEgc3BlY2lmaWMgc2htZW0gYWRkcmVzcywgSVJRLCBhbmQgbm9kZSBJRC4KKyAqLworc3RhdGljIGludCBfX2luaXQgYXJjcmltaV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCUJVR0xWTChEX05PUk1BTCkgcHJpbnRrKFZFUlNJT04pOworCUJVR0xWTChEX05PUk1BTCkgcHJpbnRrKCJFLW1haWwgbWUgaWYgeW91IGFjdHVhbGx5IHRlc3QgdGhlIFJJTSBJIGRyaXZlciwgcGxlYXNlIVxuIik7CisKKwlCVUdNU0coRF9OT1JNQUwsICJHaXZlbjogbm9kZSAlMDJYaCwgc2htZW0gJWxYaCwgaXJxICVkXG4iLAorCSAgICAgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPm1lbV9zdGFydCwgZGV2LT5pcnEpOworCisJaWYgKGRldi0+bWVtX3N0YXJ0IDw9IDAgfHwgZGV2LT5pcnEgPD0gMCkgeworCQlCVUdNU0coRF9OT1JNQUwsICJObyBhdXRvcHJvYmUgZm9yIFJJTSBJOyB5b3UgIgorCQkgICAgICAgIm11c3Qgc3BlY2lmeSB0aGUgc2htZW0gYW5kIGlycSFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLyoKKwkgKiBHcmFiIHRoZSBtZW1vcnkgcmVnaW9uIGF0IG1lbV9zdGFydCBmb3IgQlVGRkVSX1NJWkUgYnl0ZXMuCisJICogTGF0ZXIgaW4gYXJjcmltaV9mb3VuZCgpIHRoZSByZWFsIHNpemUgd2lsbCBiZSBkZXRlcm1pbmVkCisJICogYW5kIHRoaXMgcmVzZXJ2ZSB3aWxsIGJlIHJlbGVhc2VkIGFuZCB0aGUgY29ycmVjdCBzaXplCisJICogd2lsbCBiZSB0YWtlbi4KKwkgKi8KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihkZXYtPm1lbV9zdGFydCwgQlVGRkVSX1NJWkUsICJhcmNuZXQgKDkweHgpIikpIHsKKwkJQlVHTVNHKERfTk9STUFMLCAiQ2FyZCBtZW1vcnkgYWxyZWFkeSBhbGxvY2F0ZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKGRldi0+ZGV2X2FkZHJbMF0gPT0gMCkgeworCQlyZWxlYXNlX21lbV9yZWdpb24oZGV2LT5tZW1fc3RhcnQsIEJVRkZFUl9TSVpFKTsKKwkJQlVHTVNHKERfTk9STUFMLCAiWW91IG5lZWQgdG8gc3BlY2lmeSB5b3VyIGNhcmQncyBzdGF0aW9uICIKKwkJICAgICAgICJJRCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIGFyY3JpbWlfZm91bmQoZGV2KTsKK30KKworCisvKgorICogU2V0IHVwIHRoZSBzdHJ1Y3QgbmV0X2RldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYXJkLiAgQ2FsbGVkIGFmdGVyCisgKiBwcm9iaW5nIHN1Y2NlZWRzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhcmNyaW1pX2ZvdW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHA7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9taXJyb3IsIGxhc3RfbWlycm9yLCBzaG1lbTsKKwlpbnQgbWlycm9yX3NpemU7CisJaW50IGVycjsKKworCS8qIHJlc2VydmUgdGhlIGlycSAqLworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJmFyY25ldF9pbnRlcnJ1cHQsIDAsICJhcmNuZXQgKFJJTSBJKSIsIGRldikpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGRldi0+bWVtX3N0YXJ0LCBCVUZGRVJfU0laRSk7CisJCUJVR01TRyhEX05PUk1BTCwgIkNhbid0IGdldCBJUlEgJWQhXG4iLCBkZXYtPmlycSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNobWVtID0gZGV2LT5tZW1fc3RhcnQ7CisJaXNhX3dyaXRlYihURVNUdmFsdWUsIHNobWVtKTsKKwlpc2Ffd3JpdGViKGRldi0+ZGV2X2FkZHJbMF0sIHNobWVtICsgMSk7CS8qIGFjdHVhbGx5IHRoZSBub2RlIElEICovCisKKwkvKiBmaW5kIHRoZSByZWFsIHNoYXJlZCBtZW1vcnkgc3RhcnQvZW5kIHBvaW50cywgaW5jbHVkaW5nIG1pcnJvcnMgKi8KKworCS8qIGd1ZXNzIHRoZSBhY3R1YWwgc2l6ZSBvZiBvbmUgIm1lbW9yeSBtaXJyb3IiIC0gdGhlIG51bWJlciBvZgorCSAqIGJ5dGVzIGJldHdlZW4gY29waWVzIG9mIHRoZSBzaGFyZWQgbWVtb3J5LiAgT24gbW9zdCBjYXJkcywgaXQncworCSAqIDJrIChvciB0aGVyZSBhcmUgbm8gbWlycm9ycyBhdCBhbGwpIGJ1dCBvbiBzb21lLCBpdCdzIDRrLgorCSAqLworCW1pcnJvcl9zaXplID0gTUlSUk9SX1NJWkU7CisJaWYgKGlzYV9yZWFkYihzaG1lbSkgPT0gVEVTVHZhbHVlCisJICAgICYmIGlzYV9yZWFkYihzaG1lbSAtIG1pcnJvcl9zaXplKSAhPSBURVNUdmFsdWUKKwkgICAgJiYgaXNhX3JlYWRiKHNobWVtIC0gMiAqIG1pcnJvcl9zaXplKSA9PSBURVNUdmFsdWUpCisJCW1pcnJvcl9zaXplICo9IDI7CisKKwlmaXJzdF9taXJyb3IgPSBsYXN0X21pcnJvciA9IHNobWVtOworCXdoaWxlIChpc2FfcmVhZGIoZmlyc3RfbWlycm9yKSA9PSBURVNUdmFsdWUpCisJCWZpcnN0X21pcnJvciAtPSBtaXJyb3Jfc2l6ZTsKKwlmaXJzdF9taXJyb3IgKz0gbWlycm9yX3NpemU7CisKKwl3aGlsZSAoaXNhX3JlYWRiKGxhc3RfbWlycm9yKSA9PSBURVNUdmFsdWUpCisJCWxhc3RfbWlycm9yICs9IG1pcnJvcl9zaXplOworCWxhc3RfbWlycm9yIC09IG1pcnJvcl9zaXplOworCisJZGV2LT5tZW1fc3RhcnQgPSBmaXJzdF9taXJyb3I7CisJZGV2LT5tZW1fZW5kID0gbGFzdF9taXJyb3IgKyBNSVJST1JfU0laRSAtIDE7CisKKwkvKiBpbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCisJbHAgPSBkZXYtPnByaXY7CisJbHAtPmNhcmRfbmFtZSA9ICJSSU0gSSI7CisJbHAtPmh3LmNvbW1hbmQgPSBhcmNyaW1pX2NvbW1hbmQ7CisJbHAtPmh3LnN0YXR1cyA9IGFyY3JpbWlfc3RhdHVzOworCWxwLT5ody5pbnRtYXNrID0gYXJjcmltaV9zZXRtYXNrOworCWxwLT5ody5yZXNldCA9IGFyY3JpbWlfcmVzZXQ7CisJbHAtPmh3Lm93bmVyID0gVEhJU19NT0RVTEU7CisJbHAtPmh3LmNvcHlfdG9fY2FyZCA9IGFyY3JpbWlfY29weV90b19jYXJkOworCWxwLT5ody5jb3B5X2Zyb21fY2FyZCA9IGFyY3JpbWlfY29weV9mcm9tX2NhcmQ7CisKKwkvKgorCSAqIHJlLXJlc2VydmUgdGhlIG1lbW9yeSByZWdpb24gLSBhcmNyaW1pX3Byb2JlKCkgYWxsb2NlZCB0aGlzIHJlcWlvbgorCSAqIGJ1dCBkaWRuJ3Qga25vdyB0aGUgcmVhbCBzaXplLiAgRnJlZSB0aGF0IHJlZ2lvbiBhbmQgdGhlbiByZS1nZXQKKwkgKiB3aXRoIHRoZSBjb3JyZWN0IHNpemUuICBUaGVyZSBpcyBhIFZFUlkgc2xpbSBjaGFuY2UgdGhpcyBjb3VsZAorCSAqIGZhaWwuCisJICovCisJcmVsZWFzZV9tZW1fcmVnaW9uKHNobWVtLCBCVUZGRVJfU0laRSk7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZGV2LT5tZW1fc3RhcnQsCisJCQkJZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQgKyAxLAorCQkJCSJhcmNuZXQgKDkweHgpIikpIHsKKwkJQlVHTVNHKERfTk9STUFMLCAiQ2FyZCBtZW1vcnkgYWxyZWFkeSBhbGxvY2F0ZWRcbiIpOworCQlnb3RvIGVycl9mcmVlX2lycTsKKwl9CisKKwlscC0+bWVtX3N0YXJ0ID0gaW9yZW1hcChkZXYtPm1lbV9zdGFydCwgZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQgKyAxKTsKKwlpZiAoIWxwLT5tZW1fc3RhcnQpIHsKKwkJQlVHTVNHKERfTk9STUFMLCAiQ2FuJ3QgcmVtYXAgZGV2aWNlIG1lbW9yeSFcbiIpOworCQlnb3RvIGVycl9yZWxlYXNlX21lbTsKKwl9CisKKwkvKiBnZXQgYW5kIGNoZWNrIHRoZSBzdGF0aW9uIElEIGZyb20gb2Zmc2V0IDEgaW4gc2htZW0gKi8KKwlkZXYtPmRldl9hZGRyWzBdID0gcmVhZGIobHAtPm1lbV9zdGFydCArIDEpOworCisJQlVHTVNHKERfTk9STUFMLCAiQVJDbmV0IFJJTSBJOiBzdGF0aW9uICUwMlhoIGZvdW5kIGF0IElSUSAlZCwgIgorCSAgICAgICAiU2hNZW0gJWxYaCAoJWxkKiVkIGJ5dGVzKS5cbiIsCisJICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sCisJICAgICAgIGRldi0+aXJxLCBkZXYtPm1lbV9zdGFydCwKKwkgKGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0ICsgMSkgLyBtaXJyb3Jfc2l6ZSwgbWlycm9yX3NpemUpOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfdW5tYXA7CisKKwlyZXR1cm4gMDsKKworZXJyX3VubWFwOgorCWlvdW5tYXAobHAtPm1lbV9zdGFydCk7CitlcnJfcmVsZWFzZV9tZW06CisJcmVsZWFzZV9tZW1fcmVnaW9uKGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQgLSBkZXYtPm1lbV9zdGFydCArIDEpOworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJldHVybiAtRUlPOworfQorCisKKy8qCisgKiBEbyBhIGhhcmR3YXJlIHJlc2V0IG9uIHRoZSBjYXJkLCBhbmQgc2V0IHVwIG5lY2Vzc2FyeSByZWdpc3RlcnMuCisgKgorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFzIGxpdHRsZSBhcyBwb3NzaWJsZSwgYmVjYXVzZSBpdCBkaXNydXB0cyB0aGUKKyAqIHRva2VuIG9uIHRoZSBuZXR3b3JrIChjYXVzZXMgYSBSRUNPTikgYW5kIHJlcXVpcmVzIGEgc2lnbmlmaWNhbnQgZGVsYXkuCisgKgorICogSG93ZXZlciwgaXQgZG9lcyBtYWtlIHN1cmUgdGhlIGNhcmQgaXMgaW4gYSBkZWZpbmVkIHN0YXRlLgorICovCitzdGF0aWMgaW50IGFyY3JpbWlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJlYWxseV9yZXNldCkKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5tZW1fc3RhcnQgKyAweDgwMDsKKworCUJVR01TRyhEX0lOSVQsICJSZXNldHRpbmcgJXMgKHN0YXR1cz0lMDJYaClcbiIsIGRldi0+bmFtZSwgQVNUQVRVUygpKTsKKworCWlmIChyZWFsbHlfcmVzZXQpIHsKKwkJd3JpdGViKFRFU1R2YWx1ZSwgaW9hZGRyIC0gMHg4MDApOwkvKiBmYWtlIHJlc2V0ICovCisJCXJldHVybiAwOworCX0KKwlBQ09NTUFORChDRkxBR1NjbWQgfCBSRVNFVGNsZWFyKTsJLyogY2xlYXIgZmxhZ3MgJiBlbmQgcmVzZXQgKi8KKwlBQ09NTUFORChDRkxBR1NjbWQgfCBDT05GSUdjbGVhcik7CisKKwkvKiBlbmFibGUgZXh0ZW5kZWQgKDUxMi1ieXRlKSBwYWNrZXRzICovCisJQUNPTU1BTkQoQ09ORklHY21kIHwgRVhUY29uZik7CisKKwkvKiBkb25lISAgcmV0dXJuIHN1Y2Nlc3MuICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFyY3JpbWlfc2V0bWFzayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWFzaykKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5tZW1fc3RhcnQgKyAweDgwMDsKKworCUFJTlRNQVNLKG1hc2spOworfQorCitzdGF0aWMgaW50IGFyY3JpbWlfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+bWVtX3N0YXJ0ICsgMHg4MDA7CisKKwlyZXR1cm4gQVNUQVRVUygpOworfQorCitzdGF0aWMgdm9pZCBhcmNyaW1pX2NvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5tZW1fc3RhcnQgKyAweDgwMDsKKworCUFDT01NQU5EKGNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIGFyY3JpbWlfY29weV90b19jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sIGludCBvZmZzZXQsCisJCQkJIHZvaWQgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqbWVtYWRkciA9IGxwLT5tZW1fc3RhcnQgKyAweDgwMCArIGJ1Zm51bSAqIDUxMiArIG9mZnNldDsKKwlUSU1FKCJtZW1jcHlfdG9pbyIsIGNvdW50LCBtZW1jcHlfdG9pbyhtZW1hZGRyLCBidWYsIGNvdW50KSk7Cit9CisKKworc3RhdGljIHZvaWQgYXJjcmltaV9jb3B5X2Zyb21fY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLCBpbnQgb2Zmc2V0LAorCQkJCSAgIHZvaWQgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqbWVtYWRkciA9IGxwLT5tZW1fc3RhcnQgKyAweDgwMCArIGJ1Zm51bSAqIDUxMiArIG9mZnNldDsKKwlUSU1FKCJtZW1jcHlfZnJvbWlvIiwgY291bnQsIG1lbWNweV9mcm9taW8oYnVmLCBtZW1hZGRyLCBjb3VudCkpOworfQorCitzdGF0aWMgaW50IG5vZGU7CitzdGF0aWMgaW50IGlvOwkJCS8qIHVzZSB0aGUgaW5zbW9kIGlvPSBpcnE9IG5vZGU9IG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgaXJxOworc3RhdGljIGNoYXIgZGV2aWNlWzldOwkJLyogdXNlIGVnLiBkZXZpY2U9YXJjMSB0byBjaGFuZ2UgbmFtZSAqLworCittb2R1bGVfcGFyYW0obm9kZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fc3RyaW5nKGRldmljZSwgZGV2aWNlLCBzaXplb2YoZGV2aWNlKSwgMCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqbXlfZGV2OworCitzdGF0aWMgaW50IF9faW5pdCBhcmNfcmltaV9pbml0KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWRldiA9IGFsbG9jX2FyY2RldihkZXZpY2UpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChub2RlICYmIG5vZGUgIT0gMHhmZikKKwkJZGV2LT5kZXZfYWRkclswXSA9IG5vZGU7CisKKwlkZXYtPm1lbV9zdGFydCA9IGlvOworCWRldi0+aXJxID0gaXJxOworCWlmIChkZXYtPmlycSA9PSAyKQorCQlkZXYtPmlycSA9IDk7CisKKwlpZiAoYXJjcmltaV9wcm9iZShkZXYpKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCW15X2RldiA9IGRldjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFyY19yaW1pX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbXlfZGV2OworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpb3VubWFwKGxwLT5tZW1fc3RhcnQpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihkZXYtPm1lbV9zdGFydCwgZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQgKyAxKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgYXJjcmltaV9zZXR1cChjaGFyICpzKQoreworCWludCBpbnRzWzhdOworCXMgPSBnZXRfb3B0aW9ucyhzLCA4LCBpbnRzKTsKKwlpZiAoIWludHNbMF0pCisJCXJldHVybiAxOworCXN3aXRjaCAoaW50c1swXSkgeworCWRlZmF1bHQ6CQkvKiBFUlJPUiAqLworCQlwcmludGsoImFyY3JpbWk6IFRvbyBtYW55IGFyZ3VtZW50cy5cbiIpOworCWNhc2UgMzoJCS8qIE5vZGUgSUQgKi8KKwkJbm9kZSA9IGludHNbM107CisJY2FzZSAyOgkJLyogSVJRICovCisJCWlycSA9IGludHNbMl07CisJY2FzZSAxOgkJLyogSU8gYWRkcmVzcyAqLworCQlpbyA9IGludHNbMV07CisJfQorCWlmICgqcykKKwkJc25wcmludGYoZGV2aWNlLCBzaXplb2YoZGV2aWNlKSwgIiVzIiwgcyk7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJhcmNyaW1pPSIsIGFyY3JpbWlfc2V0dXApOworI2VuZGlmCQkJCS8qIE1PRFVMRSAqLworCittb2R1bGVfaW5pdChhcmNfcmltaV9pbml0KQorbW9kdWxlX2V4aXQoYXJjX3JpbWlfZXhpdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FyY25ldC9hcmNuZXQuYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9hcmNuZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjlmNjllCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJjbmV0L2FyY25ldC5jCkBAIC0wLDAgKzEsMTEwMiBAQAorLyoKKyAqIExpbnV4IEFSQ25ldCBkcml2ZXIgLSBkZXZpY2UtaW5kZXBlbmRlbnQgcm91dGluZXMKKyAqIAorICogV3JpdHRlbiAxOTk3IGJ5IERhdmlkIFdvb2Rob3VzZS4KKyAqIFdyaXR0ZW4gMTk5NC0xOTk5IGJ5IEF2ZXJ5IFBlbm5hcnVuLgorICogV3JpdHRlbiAxOTk5LTIwMDAgYnkgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+LgorICogRGVyaXZlZCBmcm9tIHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiBTcGVjaWFsIHRoYW5rcyB0byBDb250ZW1wb3JhcnkgQ29udHJvbHMsIEluYy4gKHd3dy5jY29udHJvbHMuY29tKQorICogIGZvciBzcG9uc29yaW5nIHRoZSBmdXJ0aGVyIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgb3JpZ2luYWwgY29weXJpZ2h0IHdhcyBhcyBmb2xsb3dzOgorICoKKyAqIHNrZWxldG9uLmMgV3JpdHRlbiAxOTkzIGJ5IERvbmFsZCBCZWNrZXIuCisgKiBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiAgVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkCisgKiBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIG1vZGlmaWVkIGJ5IFNSQywgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBUaGUgY2hhbmdlIGxvZyBpcyBub3cgaW4gYSBmaWxlIGNhbGxlZCBDaGFuZ2VMb2cgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogU291cmNlczoKKyAqICAtIENyeW53ciBhcmNuZXQuY29tL2FyY2V0aGVyLmNvbSBwYWNrZXQgZHJpdmVycy4KKyAqICAtIGFyY25ldC5jIHYwLjAwIGRhdGVkIDEvMS85NCBhbmQgYXBwYXJlbnRseSBieSAKKyAqICAgICBEb25hbGQgQmVja2VyIC0gaXQgZGlkbid0IHdvcmsgOikKKyAqICAtIHNrZWxldG9uLmMgdjAuMDUgZGF0ZWQgMTEvMTYvOTMgYnkgRG9uYWxkIEJlY2tlcgorICogICAgIChmcm9tIExpbnV4IEtlcm5lbCAxLjEuNDUpCisgKiAgLSBSRkMncyAxMjAxIGFuZCAxMDUxIC0gcmU6IFRDUC9JUCBvdmVyIEFSQ25ldAorICogIC0gVGhlIG9mZmljaWFsIEFSQ25ldCBDT005MDI2IGRhdGEgc2hlZXRzICghKSB0aGFua3MgdG8KKyAqICAgICBLZW4gQ29ybmV0ZXQgPGtjb3JuZXRlQG55eDEwLmNzLmR1LmVkdT4KKyAqICAtIFRoZSBvZmZpY2lhbCBBUkNuZXQgQ09NMjAwMjAgZGF0YSBzaGVldHMuCisgKiAgLSBJbmZvcm1hdGlvbiBvbiBzb21lIG1vcmUgb2JzY3VyZSBBUkNuZXQgY29udHJvbGxlciBjaGlwcywgdGhhbmtzCisgKiAgICAgdG8gdGhlIG5pY2UgcGVvcGxlIGF0IFNNU0MuCisgKiAgLSBuZXQvaW5ldC9ldGguYyAoZnJvbSBrZXJuZWwgMS4xLjUwKSBmb3IgaGVhZGVyLWJ1aWxkaW5nIGluZm8uCisgKiAgLSBBbHRlcm5hdGUgTGludXggQVJDbmV0IHNvdXJjZSBieSBWLlNoZXJnaW4gPHZzaGVyQHNhby5zdGF2cm9wb2wuc3U+CisgKiAgLSBUZXh0dWFsIGluZm9ybWF0aW9uIGFuZCBtb3JlIGFsdGVybmF0ZSBzb3VyY2UgZnJvbSBKb2FjaGltIEtvZW5pZworICogICAgIDxqb2pvQHJlcGFzLmRlPgorICovCisKKyNkZWZpbmUgVkVSU0lPTiAiYXJjbmV0OiB2My45MyBCRVRBIDIwMDAvMDQvMjkgLSBieSBBdmVyeSBQZW5uYXJ1biBldCBhbC5cbiIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FyY2RldmljZS5oPgorCisvKiAiZG8gbm90aGluZyIgZnVuY3Rpb25zIGZvciBwcm90b2NvbCBkcml2ZXJzICovCitzdGF0aWMgdm9pZCBudWxsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sCisJCSAgICBzdHJ1Y3QgYXJjaGRyICpwa3RoZHIsIGludCBsZW5ndGgpOworc3RhdGljIGludCBudWxsX2J1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCB1aW50OF90IGRhZGRyKTsKK3N0YXRpYyBpbnQgbnVsbF9wcmVwYXJlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBhcmNoZHIgKnBrdCwKKwkJCSAgIGludCBsZW5ndGgsIGludCBidWZudW0pOworCisKKy8qCisgKiBvbmUgQXJjUHJvdG8gcGVyIHBvc3NpYmxlIHByb3RvIElELiAgTm9uZSBvZiB0aGUgZWxlbWVudHMgb2YKKyAqIGFyY19wcm90b19tYXAgYXJlIGFsbG93ZWQgdG8gYmUgTlVMTDsgdGhleSB3aWxsIGdldCBzZXQgdG8KKyAqIGFyY19wcm90b19kZWZhdWx0IGluc3RlYWQuICBJdCBhbHNvIG11c3Qgbm90IGJlIE5VTEw7IGlmIHlvdSB3b3VsZCBsaWtlCisgKiB0byBzZXQgaXQgdG8gTlVMTCwgc2V0IGl0IHRvICZhcmNfcHJvdG9fbnVsbCBpbnN0ZWFkLgorICovCisgc3RydWN0IEFyY1Byb3RvICphcmNfcHJvdG9fbWFwWzI1Nl0sICphcmNfcHJvdG9fZGVmYXVsdCwKKyAgICphcmNfYmNhc3RfcHJvdG8sICphcmNfcmF3X3Byb3RvOworCitzdHJ1Y3QgQXJjUHJvdG8gYXJjX3Byb3RvX251bGwgPQoreworCS5zdWZmaXgJCT0gJz8nLAorCS5tdHUJCT0gWE1UVSwKKwkuaXNfaXAgICAgICAgICAgPSAwLAorCS5yeAkJPSBudWxsX3J4LAorCS5idWlsZF9oZWFkZXIJPSBudWxsX2J1aWxkX2hlYWRlciwKKwkucHJlcGFyZV90eAk9IG51bGxfcHJlcGFyZV90eCwKKwkuY29udGludWVfdHggICAgPSBOVUxMLAorCS5hY2tfdHggICAgICAgICA9IE5VTEwKK307CisKKy8qIEV4cG9ydGVkIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK2ludCBhcmNuZXRfZGVidWcgPSBBUkNORVRfREVCVUc7CisKK0VYUE9SVF9TWU1CT0woYXJjX3Byb3RvX21hcCk7CitFWFBPUlRfU1lNQk9MKGFyY19wcm90b19kZWZhdWx0KTsKK0VYUE9SVF9TWU1CT0woYXJjX2JjYXN0X3Byb3RvKTsKK0VYUE9SVF9TWU1CT0woYXJjX3Jhd19wcm90byk7CitFWFBPUlRfU1lNQk9MKGFyY19wcm90b19udWxsKTsKK0VYUE9SVF9TWU1CT0woYXJjbmV0X3VucmVnaXN0ZXJfcHJvdG8pOworRVhQT1JUX1NZTUJPTChhcmNuZXRfZGVidWcpOworRVhQT1JUX1NZTUJPTChhbGxvY19hcmNkZXYpOworRVhQT1JUX1NZTUJPTChhcmNuZXRfaW50ZXJydXB0KTsKKworLyogSW50ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIGludCBhcmNuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYXJjbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhcmNuZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhcmNuZXRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYXJjbmV0X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwKKwkJCSB1bnNpZ25lZCBsZW4pOworc3RhdGljIGludCBhcmNuZXRfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFyY25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGdvX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IGRlYnVnID0gQVJDTkVUX0RFQlVHOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9faW5pdCBhcmNuZXRfaW5pdCh2b2lkKQoreworCWludCBjb3VudDsKKworCWFyY25ldF9kZWJ1ZyA9IGRlYnVnOworCisJcHJpbnRrKFZFUlNJT04pOworCisjaWZkZWYgQUxQSEFfV0FSTklORworCUJVR0xWTChEX0VYVFJBKSB7CisJCXByaW50aygiYXJjbmV0OiAqKipcbiIKKwkJImFyY25ldDogKiBSZWFkIGFyY25ldC50eHQgZm9yIGltcG9ydGFudCByZWxlYXNlIG5vdGVzIVxuIgorCQkgICAgICAgImFyY25ldDogKlxuIgorCQkgICAgICAgImFyY25ldDogKiBUaGlzIGlzIGFuIEFMUEhBIHZlcnNpb24hIChMYXN0IHN0YWJsZSByZWxlYXNlOiB2My4wMikgIEUtbWFpbFxuIgorCQkgICAgICAgImFyY25ldDogKiBtZSBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zLCBjb21tZW50cywgb3IgYnVnIHJlcG9ydHMuXG4iCisJCSAgICAgICAiYXJjbmV0OiAqKipcbiIpOworCX0KKyNlbmRpZgorCisJLyogaW5pdGlhbGl6ZSB0aGUgcHJvdG9jb2wgbWFwICovCisJYXJjX3Jhd19wcm90byA9IGFyY19wcm90b19kZWZhdWx0ID0gYXJjX2JjYXN0X3Byb3RvID0gJmFyY19wcm90b19udWxsOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDI1NjsgY291bnQrKykKKwkJYXJjX3Byb3RvX21hcFtjb3VudF0gPSBhcmNfcHJvdG9fZGVmYXVsdDsKKworCUJVR0xWTChEX0RVUklORykKKwkgICAgcHJpbnRrKCJhcmNuZXQ6IHN0cnVjdCBzaXplczogJVpkICVaZCAlWmQgJVpkICVaZFxuIiwKKwkJIHNpemVvZihzdHJ1Y3QgYXJjX2hhcmR3YXJlKSwgc2l6ZW9mKHN0cnVjdCBhcmNfcmZjMTIwMSksCisJCXNpemVvZihzdHJ1Y3QgYXJjX3JmYzEwNTEpLCBzaXplb2Yoc3RydWN0IGFyY19ldGhfZW5jYXApLAorCQkgICBzaXplb2Yoc3RydWN0IGFyY2hkcikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhcmNuZXRfZXhpdCh2b2lkKQoreworfQorCittb2R1bGVfaW5pdChhcmNuZXRfaW5pdCk7Cittb2R1bGVfZXhpdChhcmNuZXRfZXhpdCk7CisKKy8qCisgKiBEdW1wIHRoZSBjb250ZW50cyBvZiBhbiBza19idWZmCisgKi8KKyNpZiBBUkNORVRfREVCVUdfTUFYICYgRF9TS0IKK3ZvaWQgYXJjbmV0X2R1bXBfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqZGVzYykKK3sKKwlpbnQgaTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlNnM6IHNrYiBkdW1wICglcykgZm9sbG93czoiLCBkZXYtPm5hbWUsIGRlc2MpOworCWZvciAoaSA9IDA7IGkgPCBza2ItPmxlbjsgaSsrKSB7CisJCWlmIChpICUgMTYgPT0gMCkKKwkJCXByaW50aygiXG4iIEtFUk5fREVCVUcgIlslMDRYXSAiLCBpKTsKKwkJcHJpbnRrKCIlMDJYICIsICgodV9jaGFyICopIHNrYi0+ZGF0YSlbaV0pOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKK0VYUE9SVF9TWU1CT0woYXJjbmV0X2R1bXBfc2tiKTsKKyNlbmRpZgorCisKKy8qCisgKiBEdW1wIHRoZSBjb250ZW50cyBvZiBhbiBBUkNuZXQgYnVmZmVyCisgKi8KKyNpZiAoQVJDTkVUX0RFQlVHX01BWCAmIChEX1JYIHwgRF9UWCkpCit2b2lkIGFyY25ldF9kdW1wX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLCBjaGFyICpkZXNjLAorCQkJaW50IHRha2VfYXJjbmV0X2xvY2spCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IGksIGxlbmd0aDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzdGF0aWMgdWludDhfdCBidWZbNTEyXTsKKworCS8qIGh3LmNvcHlfZnJvbV9jYXJkIGV4cGVjdHMgSVJRIGNvbnRleHQgc28gdGFrZSB0aGUgSVJRIGxvY2sKKwkgICB0byBrZWVwIGl0IHNpbmdsZSB0aHJlYWRlZCAqLworCWlmKHRha2VfYXJjbmV0X2xvY2spCisJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJbHAtPmh3LmNvcHlfZnJvbV9jYXJkKGRldiwgYnVmbnVtLCAwLCBidWYsIDUxMik7CisJaWYodGFrZV9hcmNuZXRfbG9jaykKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIGlmIHRoZSBvZmZzZXRbMF0gYnl0ZSBpcyBub256ZXJvLCB0aGlzIGlzIGEgMjU2LWJ5dGUgcGFja2V0ICovCisJbGVuZ3RoID0gKGJ1ZlsyXSA/IDI1NiA6IDUxMik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJTZzOiBwYWNrZXQgZHVtcCAoJXMpIGZvbGxvd3M6IiwgZGV2LT5uYW1lLCBkZXNjKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKGkgJSAxNiA9PSAwKQorCQkJcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAiWyUwNFhdICIsIGkpOworCQlwcmludGsoIiUwMlggIiwgYnVmW2ldKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCit9CisKK0VYUE9SVF9TWU1CT0woYXJjbmV0X2R1bXBfcGFja2V0KTsKKyNlbmRpZgorCisKKy8qCisgKiBVbnJlZ2lzdGVyIGEgcHJvdG9jb2wgZHJpdmVyIGZyb20gdGhlIGFyY19wcm90b19tYXAuICBQcm90b2NvbCBkcml2ZXJzCisgKiBhcmUgcmVzcG9uc2libGUgZm9yIHJlZ2lzdGVyaW5nIHRoZW1zZWx2ZXMsIGJ1dCB0aGUgdW5yZWdpc3RlciByb3V0aW5lCisgKiBpcyBwcmV0dHkgZ2VuZXJpYyBzbyB3ZSdsbCBkbyBpdCBoZXJlLgorICovCit2b2lkIGFyY25ldF91bnJlZ2lzdGVyX3Byb3RvKHN0cnVjdCBBcmNQcm90byAqcHJvdG8pCit7CisJaW50IGNvdW50OworCisJaWYgKGFyY19wcm90b19kZWZhdWx0ID09IHByb3RvKQorCQlhcmNfcHJvdG9fZGVmYXVsdCA9ICZhcmNfcHJvdG9fbnVsbDsKKwlpZiAoYXJjX2JjYXN0X3Byb3RvID09IHByb3RvKQorCQlhcmNfYmNhc3RfcHJvdG8gPSBhcmNfcHJvdG9fZGVmYXVsdDsKKwlpZiAoYXJjX3Jhd19wcm90byA9PSBwcm90bykKKwkJYXJjX3Jhd19wcm90byA9IGFyY19wcm90b19kZWZhdWx0OworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMjU2OyBjb3VudCsrKSB7CisJCWlmIChhcmNfcHJvdG9fbWFwW2NvdW50XSA9PSBwcm90bykKKwkJCWFyY19wcm90b19tYXBbY291bnRdID0gYXJjX3Byb3RvX2RlZmF1bHQ7CisJfQorfQorCisKKy8qCisgKiBBZGQgYSBidWZmZXIgdG8gdGhlIHF1ZXVlLiAgT25seSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaXMgYWxsb3dlZCB0byBkbworICogdGhpcywgdW5sZXNzIGludGVycnVwdHMgYXJlIGRpc2FibGVkLgorICogCisgKiBOb3RlOiB3ZSBkb24ndCBjaGVjayBmb3IgYSBmdWxsIHF1ZXVlLCBzaW5jZSB0aGVyZSBhcmVuJ3QgZW5vdWdoIGJ1ZmZlcnMKKyAqIHRvIG1vcmUgdGhhbiBmaWxsIGl0LgorICovCitzdGF0aWMgdm9pZCByZWxlYXNlX2FyY2J1ZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtKQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBpOworCisJbHAtPmJ1Zl9xdWV1ZVtscC0+Zmlyc3RfZnJlZV9idWYrK10gPSBidWZudW07CisJbHAtPmZpcnN0X2ZyZWVfYnVmICU9IDU7CisKKwlCVUdMVkwoRF9EVVJJTkcpIHsKKwkJQlVHTVNHKERfRFVSSU5HLCAicmVsZWFzZV9hcmNidWY6IGZyZWVkICMlZDsgYnVmZmVyIHF1ZXVlIGlzIG5vdzogIiwKKwkJICAgICAgIGJ1Zm51bSk7CisJCWZvciAoaSA9IGxwLT5uZXh0X2J1ZjsgaSAhPSBscC0+Zmlyc3RfZnJlZV9idWY7IGkgPSAoaSsxKSAlIDUpCisJCQlCVUdNU0cyKERfRFVSSU5HLCAiIyVkICIsIGxwLT5idWZfcXVldWVbaV0pOworCQlCVUdNU0cyKERfRFVSSU5HLCAiXG4iKTsKKwl9Cit9CisKKworLyoKKyAqIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSBxdWV1ZS4gIElmIHRoaXMgcmV0dXJucyAtMSwgdGhlcmUgYXJlIG5vIGJ1ZmZlcnMKKyAqIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGludCBnZXRfYXJjYnVmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IGJ1ZiA9IC0xLCBpOworCisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZscC0+YnVmX2xvY2spKSB7CisJCS8qIGFscmVhZHkgaW4gdGhpcyBmdW5jdGlvbiAqLworCQlCVUdNU0coRF9OT1JNQUwsICJnZXRfYXJjYnVmOiBvdmVybGFwICglZCkhXG4iLAorCQkgICAgICAgbHAtPmJ1Zl9sb2NrLmNvdW50ZXIpOworCX0KKwllbHNlIHsJCQkvKiB3ZSBjYW4gY29udGludWUgKi8KKwkJaWYgKGxwLT5uZXh0X2J1ZiA+PSA1KQorCQkJbHAtPm5leHRfYnVmIC09IDU7CisKKwkJaWYgKGxwLT5uZXh0X2J1ZiA9PSBscC0+Zmlyc3RfZnJlZV9idWYpCisJCQlCVUdNU0coRF9OT1JNQUwsICJnZXRfYXJjYnVmOiBCVUc6IG5vIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZT8/XG4iKTsKKwkJZWxzZSB7CisJCQlidWYgPSBscC0+YnVmX3F1ZXVlW2xwLT5uZXh0X2J1ZisrXTsKKwkJCWxwLT5uZXh0X2J1ZiAlPSA1OworCQl9CisJfQorCisKKwlCVUdMVkwoRF9EVVJJTkcpIHsKKwkJQlVHTVNHKERfRFVSSU5HLCAiZ2V0X2FyY2J1ZjogZ290ICMlZDsgYnVmZmVyIHF1ZXVlIGlzIG5vdzogIiwgYnVmKTsKKwkJZm9yIChpID0gbHAtPm5leHRfYnVmOyBpICE9IGxwLT5maXJzdF9mcmVlX2J1ZjsgaSA9IChpKzEpICUgNSkKKwkJCUJVR01TRzIoRF9EVVJJTkcsICIjJWQgIiwgbHAtPmJ1Zl9xdWV1ZVtpXSk7CisJCUJVR01TRzIoRF9EVVJJTkcsICJcbiIpOworCX0KKworCWF0b21pY19pbmMoJmxwLT5idWZfbG9jayk7CisJcmV0dXJuIGJ1ZjsKK30KKworCitzdGF0aWMgaW50IGNob29zZV9tdHUodm9pZCkKK3sKKwlpbnQgY291bnQsIG10dSA9IDY1NTM1OworCisJLyogY2hvb3NlIHRoZSBzbWFsbGVzdCBNVFUgb2YgYWxsIGF2YWlsYWJsZSBlbmNhcHMgKi8KKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyNTY7IGNvdW50KyspIHsKKwkJaWYgKGFyY19wcm90b19tYXBbY291bnRdICE9ICZhcmNfcHJvdG9fbnVsbAorCQkgICAgJiYgYXJjX3Byb3RvX21hcFtjb3VudF0tPm10dSA8IG10dSkgeworCQkJbXR1ID0gYXJjX3Byb3RvX21hcFtjb3VudF0tPm10dTsKKwkJfQorCX0KKworCXJldHVybiBtdHUgPT0gNjU1MzUgPyBYTVRVIDogbXR1OworfQorCisKKy8qIFNldHVwIGEgc3RydWN0IGRldmljZSBmb3IgQVJDbmV0LiAqLworc3RhdGljIHZvaWQgYXJjZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGV2LT50eXBlID0gQVJQSFJEX0FSQ05FVDsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IHNpemVvZihzdHJ1Y3QgYXJjaGRyKTsKKwlkZXYtPm10dSA9IGNob29zZV9tdHUoKTsKKworCWRldi0+YWRkcl9sZW4gPSBBUkNORVRfQUxFTjsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDEwMDsKKwlkZXYtPmJyb2FkY2FzdFswXSA9IDB4MDA7CS8qIGZvciB1cywgYnJvYWRjYXN0cyBhcmUgYWRkcmVzcyAwICovCisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisKKwkvKiBOZXctc3R5bGUgZmxhZ3MuICovCisJZGV2LT5mbGFncyA9IElGRl9CUk9BRENBU1Q7CisKKwkvKgorCSAqIFB1dCBpbiB0aGlzIHN0dWZmIGhlcmUsIHNvIHdlIGRvbid0IGhhdmUgdG8gZXhwb3J0IHRoZSBzeW1ib2xzIHRvCisJICogdGhlIGNoaXBzZXQgZHJpdmVycy4KKwkgKi8KKwlkZXYtPm9wZW4gPSBhcmNuZXRfb3BlbjsKKwlkZXYtPnN0b3AgPSBhcmNuZXRfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBhcmNuZXRfc2VuZF9wYWNrZXQ7CisJZGV2LT50eF90aW1lb3V0ID0gYXJjbmV0X3RpbWVvdXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBhcmNuZXRfZ2V0X3N0YXRzOworCWRldi0+aGFyZF9oZWFkZXIgPSBhcmNuZXRfaGVhZGVyOworCWRldi0+cmVidWlsZF9oZWFkZXIgPSBhcmNuZXRfcmVidWlsZF9oZWFkZXI7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19hcmNkZXYoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgYXJjbmV0X2xvY2FsKSwKKwkJCSAgIG5hbWUgJiYgKm5hbWUgPyBuYW1lIDogImFyYyVkIiwgYXJjZGV2X3NldHVwKTsKKwlpZihkZXYpIHsKKwkJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSAoc3RydWN0IGFyY25ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisJfQorCisJcmV0dXJuIGRldjsKK30KKworLyoKKyAqIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuICBUaGlzIGlzIGNhbGxlZCBzb21ldGltZSBhZnRlciBib290aW5nIHdoZW4KKyAqIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4gcmVnaXN0ZXJzCisgKiB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0IHRoZXJlIGlzCisgKiBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCitzdGF0aWMgaW50IGFyY25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IGNvdW50LCBuZXdtdHUsIGVycm9yOworCisJQlVHTVNHKERfSU5JVCwib3BlbmVkLiIpOworCisJaWYgKCF0cnlfbW9kdWxlX2dldChscC0+aHcub3duZXIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCUJVR0xWTChEX1BST1RPKSB7CisJCWludCBjb3VudDsKKwkJQlVHTVNHKERfUFJPVE8sICJwcm90b2NvbCBtYXAgKGRlZmF1bHQgaXMgJyVjJyk6ICIsCisJCSAgICAgICBhcmNfcHJvdG9fZGVmYXVsdC0+c3VmZml4KTsKKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMjU2OyBjb3VudCsrKQorCQkJQlVHTVNHMihEX1BST1RPLCAiJWMiLCBhcmNfcHJvdG9fbWFwW2NvdW50XS0+c3VmZml4KTsKKwkJQlVHTVNHMihEX1BST1RPLCAiXG4iKTsKKwl9CisKKworCUJVR01TRyhEX0lOSVQsICJhcmNuZXRfb3BlbjogcmVzZXR0aW5nIGNhcmQuXG4iKTsKKworCS8qIHRyeSB0byBwdXQgdGhlIGNhcmQgaW4gYSBkZWZpbmVkIHN0YXRlIC0gaWYgaXQgZmFpbHMgdGhlIGZpcnN0CisJICogdGltZSwgYWN0dWFsbHkgcmVzZXQgaXQuCisJICovCisJZXJyb3IgPSAtRU5PREVWOworCWlmIChBUkNSRVNFVCgwKSAmJiBBUkNSRVNFVCgxKSkKKwkJZ290byBvdXRfbW9kdWxlX3B1dDsKKworCW5ld210dSA9IGNob29zZV9tdHUoKTsKKwlpZiAobmV3bXR1IDwgZGV2LT5tdHUpCisJCWRldi0+bXR1ID0gbmV3bXR1OworCisJQlVHTVNHKERfSU5JVCwgImFyY25ldF9vcGVuOiBtdHU6ICVkLlxuIiwgZGV2LT5tdHUpOworCisJLyogYXV0b2RldGVjdCB0aGUgZW5jYXBzdWxhdGlvbiBmb3IgZWFjaCBob3N0LiAqLworCW1lbXNldChscC0+ZGVmYXVsdF9wcm90bywgMCwgc2l6ZW9mKGxwLT5kZWZhdWx0X3Byb3RvKSk7CisKKwkvKiB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgaXMgc3BlY2lhbCAtIHVzZSB0aGUgJ2JjYXN0JyBwcm90b2NvbCAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDI1NjsgY291bnQrKykgeworCQlpZiAoYXJjX3Byb3RvX21hcFtjb3VudF0gPT0gYXJjX2JjYXN0X3Byb3RvKSB7CisJCQlscC0+ZGVmYXVsdF9wcm90b1swXSA9IGNvdW50OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBpbml0aWFsaXplIGJ1ZmZlcnMgKi8KKwlhdG9taWNfc2V0KCZscC0+YnVmX2xvY2ssIDEpOworCisJbHAtPm5leHRfYnVmID0gbHAtPmZpcnN0X2ZyZWVfYnVmID0gMDsKKwlyZWxlYXNlX2FyY2J1ZihkZXYsIDApOworCXJlbGVhc2VfYXJjYnVmKGRldiwgMSk7CisJcmVsZWFzZV9hcmNidWYoZGV2LCAyKTsKKwlyZWxlYXNlX2FyY2J1ZihkZXYsIDMpOworCWxwLT5jdXJfdHggPSBscC0+bmV4dF90eCA9IC0xOworCWxwLT5jdXJfcnggPSAtMTsKKworCWxwLT5yZmMxMjAxLnNlcXVlbmNlID0gMTsKKworCS8qIGJyaW5nIHVwIHRoZSBoYXJkd2FyZSBkcml2ZXIgKi8KKwlpZiAobHAtPmh3Lm9wZW4pCisJCWxwLT5ody5vcGVuKGRldik7CisKKwlpZiAoZGV2LT5kZXZfYWRkclswXSA9PSAwKQorCQlCVUdNU0coRF9OT1JNQUwsICJXQVJOSU5HISAgU3RhdGlvbiBhZGRyZXNzIDAwIGlzIHJlc2VydmVkICIKKwkJICAgICAgICJmb3IgYnJvYWRjYXN0cyFcbiIpOworCWVsc2UgaWYgKGRldi0+ZGV2X2FkZHJbMF0gPT0gMjU1KQorCQlCVUdNU0coRF9OT1JNQUwsICJXQVJOSU5HISAgU3RhdGlvbiBhZGRyZXNzIEZGIG1heSBjb25mdXNlICIKKwkJICAgICAgICJET1MgbmV0d29ya2luZyBwcm9ncmFtcyFcbiIpOworCisJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyk7CisJaWYgKEFTVEFUVVMoKSAmIFJFU0VUZmxhZykgeworCSAgCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCQlBQ09NTUFORChDRkxBR1NjbWQgfCBSRVNFVGNsZWFyKTsKKwl9CisKKworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCS8qIG1ha2Ugc3VyZSB3ZSdyZSByZWFkeSB0byByZWNlaXZlIElSUSdzLiAqLworCUFJTlRNQVNLKDApOworCXVkZWxheSgxKTsJCS8qIGdpdmUgaXQgdGltZSB0byBzZXQgdGhlIG1hc2sgYmVmb3JlCisJCQkJICogd2UgcmVzZXQgaXQgYWdhaW4uIChtYXkgbm90IGV2ZW4gYmUKKwkJCQkgKiBuZWNlc3NhcnkpCisJCQkJICovCisJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyk7CisJbHAtPmludG1hc2sgPSBOT1JYZmxhZyB8IFJFQ09OZmxhZzsKKwlBSU5UTUFTSyhscC0+aW50bWFzayk7CisJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7CisKKyBvdXRfbW9kdWxlX3B1dDoKKwltb2R1bGVfcHV0KGxwLT5ody5vd25lcik7CisJcmV0dXJuIGVycm9yOworfQorCisKKy8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gYXJjbmV0X29wZW4gLSBzaHV0cyBkb3duIHRoZSBjYXJkLiAqLworc3RhdGljIGludCBhcmNuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIGZsdXNoIFRYIGFuZCBkaXNhYmxlIFJYICovCisJQUlOVE1BU0soMCk7CisJQUNPTU1BTkQoTk9UWGNtZCk7CS8qIHN0b3AgdHJhbnNtaXQgKi8KKwlBQ09NTUFORChOT1JYY21kKTsJLyogZGlzYWJsZSByZWNlaXZlICovCisJbWRlbGF5KDEpOworCisJLyogc2h1dCBkb3duIHRoZSBjYXJkICovCisJbHAtPmh3LmNsb3NlKGRldik7CisJbW9kdWxlX3B1dChscC0+aHcub3duZXIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXJjbmV0X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwKKwkJCSB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJdWludDhfdCBfZGFkZHIsIHByb3RvX251bTsKKwlzdHJ1Y3QgQXJjUHJvdG8gKnByb3RvOworCisJQlVHTVNHKERfRFVSSU5HLAorCSAgICAiY3JlYXRlIGhlYWRlciBmcm9tICVkIHRvICVkOyBwcm90b2NvbCAlZCAoJVhoKTsgc2l6ZSAldS5cbiIsCisJICAgICAgIHNhZGRyID8gKih1aW50OF90ICopIHNhZGRyIDogLTEsCisJICAgICAgIGRhZGRyID8gKih1aW50OF90ICopIGRhZGRyIDogLTEsCisJICAgICAgIHR5cGUsIHR5cGUsIGxlbik7CisKKwlpZiAoc2tiLT5sZW4hPTAgJiYgbGVuICE9IHNrYi0+bGVuKQorCQlCVUdNU0coRF9OT1JNQUwsICJhcmNuZXRfaGVhZGVyOiBZaWtlcyEgIHNrYi0+bGVuKCVkKSAhPSBsZW4oJWQpIVxuIiwKKwkJICAgICAgIHNrYi0+bGVuLCBsZW4pOworCisKKyAgCS8qIFR5cGUgaXMgaG9zdCBvcmRlciAtID8gKi8KKyAgCWlmKHR5cGUgPT0gRVRIX1BfQVJDTkVUKSB7CisgIAkJcHJvdG8gPSBhcmNfcmF3X3Byb3RvOworICAJCUJVR01TRyhEX0RFQlVHLCAiYXJjX3Jhd19wcm90byB1c2VkLiBwcm90bz0nJWMnXG4iLHByb3RvLT5zdWZmaXgpOworICAJCV9kYWRkciA9IGRhZGRyID8gKih1aW50OF90ICopIGRhZGRyIDogMDsKKyAgCX0KKwllbHNlIGlmICghZGFkZHIpIHsKKwkJLyoKKwkJICogaWYgdGhlIGRlc3QgYWRkciBpc24ndCBwcm92aWRlZCwgd2UgY2FuJ3QgY2hvb3NlIGFuIGVuY2Fwc3VsYXRpb24hCisJCSAqIFN0b3JlIHRoZSBwYWNrZXQgdHlwZSAoZWcuIEVUSF9QX0lQKSBmb3Igbm93LCBhbmQgd2UnbGwgcHVzaCBvbiBhCisJCSAqIHJlYWwgaGVhZGVyIHdoZW4gd2UgZG8gcmVidWlsZF9oZWFkZXIuCisJCSAqLworCQkqKHVpbnQxNl90ICopIHNrYl9wdXNoKHNrYiwgMikgPSB0eXBlOworCQlpZiAoc2tiLT5uaC5yYXcgLSBza2ItPm1hYy5yYXcgIT0gMikKKwkJCUJVR01TRyhEX05PUk1BTCwgImFyY25ldF9oZWFkZXI6IFlpa2VzISAgZGlmZiAoJWQpIGlzIG5vdCAyIVxuIiwKKwkJCSAgICAgICAoaW50KShza2ItPm5oLnJhdyAtIHNrYi0+bWFjLnJhdykpOworCQlyZXR1cm4gLTI7CS8qIHJldHVybiBlcnJvciAtLSBjYW4ndCB0cmFuc21pdCB5ZXQhICovCisJfQorCWVsc2UgeworCQkvKiBvdGhlcndpc2UsIHdlIGNhbiBqdXN0IGFkZCB0aGUgaGVhZGVyIGFzIHVzdWFsLiAqLworCQlfZGFkZHIgPSAqKHVpbnQ4X3QgKikgZGFkZHI7CisJCXByb3RvX251bSA9IGxwLT5kZWZhdWx0X3Byb3RvW19kYWRkcl07CisJCXByb3RvID0gYXJjX3Byb3RvX21hcFtwcm90b19udW1dOworCQlCVUdNU0coRF9EVVJJTkcsICJidWlsZGluZyBoZWFkZXIgZm9yICUwMlhoIHVzaW5nIHByb3RvY29sICclYydcbiIsCisJCSAgICAgICBwcm90b19udW0sIHByb3RvLT5zdWZmaXgpOworCQlpZiAocHJvdG8gPT0gJmFyY19wcm90b19udWxsICYmIGFyY19iY2FzdF9wcm90byAhPSBwcm90bykgeworCQkJQlVHTVNHKERfRFVSSU5HLCAiYWN0dWFsbHksIGxldCdzIHVzZSAnJWMnIGluc3RlYWQuXG4iLAorCQkJICAgICAgIGFyY19iY2FzdF9wcm90by0+c3VmZml4KTsKKwkJCXByb3RvID0gYXJjX2JjYXN0X3Byb3RvOworCQl9CisJfQorCXJldHVybiBwcm90by0+YnVpbGRfaGVhZGVyKHNrYiwgZGV2LCB0eXBlLCBfZGFkZHIpOworfQorCisKKy8qIAorICogUmVidWlsZCB0aGUgQVJDbmV0IGhhcmQgaGVhZGVyLiBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbiBBUlAgKG9yIGluIHRoZQorICogZnV0dXJlIG90aGVyIGFkZHJlc3MgcmVzb2x1dGlvbikgaGFzIGNvbXBsZXRlZCBvbiB0aGlzIHNrX2J1ZmYuIFdlIG5vdworICogbGV0IEFSUCBmaWxsIGluIHRoZSBkZXN0aW5hdGlvbiBmaWVsZC4KKyAqLworc3RhdGljIGludCBhcmNuZXRfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IHN0YXR1cyA9IDA7CQkvKiBkZWZhdWx0IGlzIGZhaWx1cmUgKi8KKwl1bnNpZ25lZCBzaG9ydCB0eXBlOworCXVpbnQ4X3QgZGFkZHI9MDsKKwlzdHJ1Y3QgQXJjUHJvdG8gKnByb3RvOworCisJaWYgKHNrYi0+bmgucmF3IC0gc2tiLT5tYWMucmF3ICE9IDIpIHsKKwkJQlVHTVNHKERfTk9STUFMLAorCQkgICAgICJyZWJ1aWxkX2hlYWRlcjogc2hvdWxkbid0IGJlIGhlcmUhIChoZHJzaXplPSVkKVxuIiwKKwkJICAgICAoaW50KShza2ItPm5oLnJhdyAtIHNrYi0+bWFjLnJhdykpOworCQlyZXR1cm4gMDsKKwl9CisJdHlwZSA9ICoodWludDE2X3QgKikgc2tiX3B1bGwoc2tiLCAyKTsKKwlCVUdNU0coRF9EVVJJTkcsICJyZWJ1aWxkIGhlYWRlciBmb3IgcHJvdG9jb2wgJVhoXG4iLCB0eXBlKTsKKworCWlmICh0eXBlID09IEVUSF9QX0lQKSB7CisjaWZkZWYgQ09ORklHX0lORVQKKwkJQlVHTVNHKERfRFVSSU5HLCAicmVidWlsZCBoZWFkZXIgZm9yIGV0aGVybmV0IHByb3RvY29sICVYaFxuIiwgdHlwZSk7CisJCXN0YXR1cyA9IGFycF9maW5kKCZkYWRkciwgc2tiKSA/IDEgOiAwOworCQlCVUdNU0coRF9EVVJJTkcsICIgcmVidWlsdDogZGVzdCBpcyAlZDsgcHJvdG9jb2wgJVhoXG4iLAorCQkgICAgICAgZGFkZHIsIHR5cGUpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJQlVHTVNHKERfTk9STUFMLAorCQkgICAgICAgIkkgZG9uJ3QgdW5kZXJzdGFuZCBldGhlcm5ldCBwcm90b2NvbCAlWGggYWRkcmVzc2VzIVxuIiwgdHlwZSk7CisJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJfQorCisJLyogaWYgd2UgY291bGRuJ3QgcmVzb2x2ZSB0aGUgYWRkcmVzcy4uLiBnaXZlIHVwLiAqLworCWlmICghc3RhdHVzKQorCQlyZXR1cm4gMDsKKworCS8qIGFkZCB0aGUgX3JlYWxfIGhlYWRlciB0aGlzIHRpbWUhICovCisJcHJvdG8gPSBhcmNfcHJvdG9fbWFwW2xwLT5kZWZhdWx0X3Byb3RvW2RhZGRyXV07CisJcHJvdG8tPmJ1aWxkX2hlYWRlcihza2IsIGRldiwgdHlwZSwgZGFkZHIpOworCisJcmV0dXJuIDE7CQkvKiBzdWNjZXNzICovCit9CisKKworCisvKiBDYWxsZWQgYnkgdGhlIGtlcm5lbCBpbiBvcmRlciB0byB0cmFuc21pdCBhIHBhY2tldC4gKi8KK3N0YXRpYyBpbnQgYXJjbmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IGFyY2hkciAqcGt0OworCXN0cnVjdCBhcmNfcmZjMTIwMSAqc29mdDsKKwlzdHJ1Y3QgQXJjUHJvdG8gKnByb3RvOworCWludCB0eGJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBmcmVlc2tiID0gMDsKKworCUJVR01TRyhEX0RVUklORywKKwkgICAgICAgInRyYW5zbWl0IHJlcXVlc3RlZCAoc3RhdHVzPSVYaCwgdHhidWZzPSVkLyVkLCBsZW49JWQsIHByb3RvY29sICV4KVxuIiwKKwkgICAgICAgQVNUQVRVUygpLCBscC0+Y3VyX3R4LCBscC0+bmV4dF90eCwgc2tiLT5sZW4sc2tiLT5wcm90b2NvbCk7CisKKwlwa3QgPSAoc3RydWN0IGFyY2hkciAqKSBza2ItPmRhdGE7CisJc29mdCA9ICZwa3QtPnNvZnQucmZjMTIwMTsKKwlwcm90byA9IGFyY19wcm90b19tYXBbc29mdC0+cHJvdG9dOworCisJQlVHTVNHKERfU0tCX1NJWkUsICJza2I6IHRyYW5zbWl0dGluZyAlZCBieXRlcyB0byAlMDJYXG4iLAorCQlza2ItPmxlbiwgcGt0LT5oYXJkLmRlc3QpOworCUJVR0xWTChEX1NLQikgYXJjbmV0X2R1bXBfc2tiKGRldiwgc2tiLCAidHgiKTsKKworCS8qIGZpdHMgaW4gb25lIHBhY2tldD8gKi8KKwlpZiAoc2tiLT5sZW4gLSBBUkNfSERSX1NJWkUgPiBYTVRVICYmICFwcm90by0+Y29udGludWVfdHgpIHsKKwkJQlVHTVNHKERfTk9STUFMLCAiZml4bWU6IHBhY2tldCB0b28gbGFyZ2U6IGNvbXBlbnNhdGluZyBiYWRseSFcbiIpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOwkvKiBkb24ndCB0cnkgYWdhaW4gKi8KKwl9CisKKwkvKiBXZSdyZSBidXN5IHRyYW5zbWl0dGluZyBhIHBhY2tldC4uLiAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCUFJTlRNQVNLKDApOworCisJdHhidWYgPSBnZXRfYXJjYnVmKGRldik7CisJaWYgKHR4YnVmICE9IC0xKSB7CisJCWlmIChwcm90by0+cHJlcGFyZV90eChkZXYsIHBrdCwgc2tiLT5sZW4sIHR4YnVmKSAmJgorCQkgICAgIXByb3RvLT5hY2tfdHgpIHsKKwkJCS8qIGRvbmUgcmlnaHQgYXdheSBhbmQgd2UgZG9uJ3Qgd2FudCB0byBhY2tub3dsZWRnZQorCQkJICAgdGhlIHBhY2thZ2UgbGF0ZXIgLSBmb3JnZXQgYWJvdXQgaXQgbm93ICovCisJCQlscC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQlmcmVlc2tiID0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIGRvIGl0IHRoZSAnc3BsaXQnIHdheSAqLworCQkJbHAtPm91dGdvaW5nLnByb3RvID0gcHJvdG87CisJCQlscC0+b3V0Z29pbmcuc2tiID0gc2tiOworCQkJbHAtPm91dGdvaW5nLnBrdCA9IHBrdDsKKworCQkJaWYgKHByb3RvLT5jb250aW51ZV90eCAmJgorCQkJICAgIHByb3RvLT5jb250aW51ZV90eChkZXYsIHR4YnVmKSkgeworCQkJICBCVUdNU0coRF9OT1JNQUwsCisJCQkJICJidWchIGNvbnRpbnVlX3R4IGZpbmlzaGVkIHRoZSBmaXJzdCB0aW1lISAiCisJCQkJICIocHJvdG89JyVjJylcbiIsIHByb3RvLT5zdWZmaXgpOworCQkJfQorCQl9CisKKwkJbHAtPm5leHRfdHggPSB0eGJ1ZjsKKwl9IGVsc2UgeworCQlmcmVlc2tiID0gMTsKKwl9CisKKwlCVUdNU0coRF9ERUJVRywgIiVzOiAlZDogJXMsIHN0YXR1czogJXhcbiIsX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fLEFTVEFUVVMoKSk7CisJLyogbWFrZSBzdXJlIHdlIGRpZG4ndCBpZ25vcmUgYSBUWCBJUlEgd2hpbGUgd2Ugd2VyZSBpbiBoZXJlICovCisJQUlOVE1BU0soMCk7CisKKwlCVUdNU0coRF9ERUJVRywgIiVzOiAlZDogJXNcbiIsX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fKTsKKwlscC0+aW50bWFzayB8PSBUWEZSRUVmbGFnfEVYQ05BS2ZsYWc7CisJQUlOVE1BU0sobHAtPmludG1hc2spOworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlcywgc3RhdHVzOiAleFxuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18sQVNUQVRVUygpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJaWYgKGZyZWVza2IpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKwlyZXR1cm4gMDsJCS8qIG5vIG5lZWQgdG8gdHJ5IGFnYWluICovCit9CisKKworLyoKKyAqIEFjdHVhbGx5IHN0YXJ0IHRyYW5zbWl0dGluZyBhIHBhY2tldCB0aGF0IHdhcyBsb2FkZWQgaW50byBhIGJ1ZmZlcgorICogYnkgcHJlcGFyZV90eC4gIFRoaXMgc2hvdWxkIF9vbmx5XyBiZSBjYWxsZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgaW50IGdvX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisKKwlCVUdNU0coRF9EVVJJTkcsICJnb190eDogc3RhdHVzPSVYaCwgaW50bWFzaz0lWGgsIG5leHRfdHg9JWQsIGN1cl90eD0lZFxuIiwKKwkgICAgICAgQVNUQVRVUygpLCBscC0+aW50bWFzaywgbHAtPm5leHRfdHgsIGxwLT5jdXJfdHgpOworCisJaWYgKGxwLT5jdXJfdHggIT0gLTEgfHwgbHAtPm5leHRfdHggPT0gLTEpCisJCXJldHVybiAwOworCisJQlVHTFZMKERfVFgpIGFyY25ldF9kdW1wX3BhY2tldChkZXYsIGxwLT5uZXh0X3R4LCAiZ29fdHgiLCAwKTsKKworCWxwLT5jdXJfdHggPSBscC0+bmV4dF90eDsKKwlscC0+bmV4dF90eCA9IC0xOworCisJLyogc3RhcnQgc2VuZGluZyAqLworCUFDT01NQU5EKFRYY21kIHwgKGxwLT5jdXJfdHggPDwgMykpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlscC0+bGFzdHRyYW5zX2Rlc3QgPSBscC0+bGFzdGxvYWRfZGVzdDsKKwlscC0+bGFzdGxvYWRfZGVzdCA9IDA7CisJbHAtPmV4Y25ha19wZW5kaW5nID0gMDsKKwlscC0+aW50bWFzayB8PSBUWEZSRUVmbGFnfEVYQ05BS2ZsYWc7CisKKwlyZXR1cm4gMTsKK30KKworCisvKiBDYWxsZWQgYnkgdGhlIGtlcm5lbCB3aGVuIHRyYW5zbWl0IHRpbWVzIG91dCAqLworc3RhdGljIHZvaWQgYXJjbmV0X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBzdGF0dXMgPSBBU1RBVFVTKCk7CisJY2hhciAqbXNnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJaWYgKHN0YXR1cyAmIFRYRlJFRWZsYWcpIHsJLyogdHJhbnNtaXQgX0RJRF8gZmluaXNoICovCisJCW1zZyA9ICIgLSBtaXNzZWQgSVJRPyI7CisJfSBlbHNlIHsKKwkJbXNnID0gIiI7CisJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQlscC0+dGltZWRfb3V0ID0gMTsKKwkJQUNPTU1BTkQoTk9UWGNtZCB8IChscC0+Y3VyX3R4IDw8IDMpKTsKKwl9CisJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJLyogbWFrZSBzdXJlIHdlIGRpZG4ndCBtaXNzIGEgVFggb3IgYSBFWEMgTkFLIElSUSAqLworCUFJTlRNQVNLKDApOworCWxwLT5pbnRtYXNrIHw9IFRYRlJFRWZsYWd8RVhDTkFLZmxhZzsKKwlBSU5UTUFTSyhscC0+aW50bWFzayk7CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChqaWZmaWVzIC0gbHAtPmxhc3RfdGltZW91dCA+IDEwKkhaKSB7CisJCUJVR01TRyhEX0VYVFJBLCAidHggdGltZWQgb3V0JXMgKHN0YXR1cz0lWGgsIGludG1hc2s9JVhoLCBkZXN0PSUwMlhoKVxuIiwKKwkJICAgICAgIG1zZywgc3RhdHVzLCBscC0+aW50bWFzaywgbHAtPmxhc3R0cmFuc19kZXN0KTsKKwkJbHAtPmxhc3RfdGltZW91dCA9IGppZmZpZXM7CisJfQorCisJaWYgKGxwLT5jdXJfdHggPT0gLTEpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworCisvKgorICogVGhlIHR5cGljYWwgd29ya2xvYWQgb2YgdGhlIGRyaXZlcjogSGFuZGxlIHRoZSBuZXR3b3JrIGludGVyZmFjZQorICogaW50ZXJydXB0cy4gRXN0YWJsaXNoIHdoaWNoIGRldmljZSBuZWVkcyBhdHRlbnRpb24sIGFuZCBjYWxsIHRoZSBjb3JyZWN0CisgKiBjaGlwc2V0IGludGVycnVwdCBoYW5kbGVyLgorICovCitpcnFyZXR1cm5fdCBhcmNuZXRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscDsKKwlpbnQgcmVjYnVmLCBzdGF0dXMsIGRpYWdzdGF0dXMsIGRpZHNvbWV0aGluZywgYm9ndXNjb3VudDsKKwlpbnQgcmV0dmFsID0gSVJRX05PTkU7CisKKwlCVUdNU0coRF9EVVJJTkcsICJcbiIpOworCisJQlVHTVNHKERfRFVSSU5HLCAiaW4gYXJjbmV0X2ludGVycnVwdFxuIik7CisJCisJbHAgPSBkZXYtPnByaXY7CisJaWYgKCFscCkKKwkJQlVHKCk7CisJCQorCXNwaW5fbG9jaygmbHAtPmxvY2spOworCisJLyoKKwkgKiBSRVNFVCBmbGFnIHdhcyBlbmFibGVkIC0gaWYgZGV2aWNlIGlzIG5vdCBydW5uaW5nLCB3ZSBtdXN0IGNsZWFyIGl0IHJpZ2h0CisJICogYXdheSAoYnV0IG5vdGhpbmcgZWxzZSkuCisJICovCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJaWYgKEFTVEFUVVMoKSAmIFJFU0VUZmxhZykKKwkJCUFDT01NQU5EKENGTEFHU2NtZCB8IFJFU0VUY2xlYXIpOworCQlBSU5UTUFTSygwKTsKKwkJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCUJVR01TRyhEX0RVUklORywgImluIGFyY25ldF9pbnRoYW5kbGVyIChzdGF0dXM9JVhoLCBpbnRtYXNrPSVYaClcbiIsCisJICAgICAgIEFTVEFUVVMoKSwgbHAtPmludG1hc2spOworCisJYm9ndXNjb3VudCA9IDU7CisJZG8geworCQlzdGF0dXMgPSBBU1RBVFVTKCk7CisgICAgICAgICAgICAgICAgZGlhZ3N0YXR1cyA9IChzdGF0dXMgPj4gOCkgJiAweEZGOworCisJCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlczogc3RhdHVzPSV4XG4iLAorCQkJX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fLHN0YXR1cyk7CisJCWRpZHNvbWV0aGluZyA9IDA7CisKKwkJLyoKKwkJICogUkVTRVQgZmxhZyB3YXMgZW5hYmxlZCAtIGNhcmQgaXMgcmVzZXR0aW5nIGFuZCBpZiBSWCBpcworCQkgKiBkaXNhYmxlZCwgaXQncyBOT1QgYmVjYXVzZSB3ZSBqdXN0IGdvdCBhIHBhY2tldC4KKwkJICogCisJCSAqIFRoZSBjYXJkIGlzIGluIGFuIHVuZGVmaW5lZCBzdGF0ZS4gIENsZWFyIGl0IG91dCBhbmQgc3RhcnQgb3Zlci4KKwkJICovCisJCWlmIChzdGF0dXMgJiBSRVNFVGZsYWcpIHsKKwkJCUJVR01TRyhEX05PUk1BTCwgInNwdXJpb3VzIHJlc2V0IChzdGF0dXM9JVhoKVxuIiwgc3RhdHVzKTsKKwkJCWFyY25ldF9jbG9zZShkZXYpOworCQkJYXJjbmV0X29wZW4oZGV2KTsKKworCQkJLyogZ2V0IG91dCBvZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIhICovCisJCQlicmVhazsKKwkJfQorCQkvKiAKKwkJICogUlggaXMgaW5oaWJpdGVkIC0gd2UgbXVzdCBoYXZlIHJlY2VpdmVkIHNvbWV0aGluZy4gUHJlcGFyZSB0bworCQkgKiByZWNlaXZlIGludG8gdGhlIG5leHQgYnVmZmVyLgorCQkgKiAKKwkJICogV2UgZG9uJ3QgYWN0dWFsbHkgY29weSB0aGUgcmVjZWl2ZWQgcGFja2V0IGZyb20gdGhlIGNhcmQgdW50aWwKKwkJICogYWZ0ZXIgdGhlIHRyYW5zbWl0IGhhbmRsZXIgcnVucyAoYW5kIHBvc3NpYmx5IGxhdW5jaGVzIHRoZSBuZXh0CisJCSAqIHR4KTsgdGhpcyBzaG91bGQgaW1wcm92ZSBsYXRlbmN5IHNsaWdodGx5IGlmIHdlIGdldCBib3RoIHR5cGVzCisJCSAqIG9mIGludGVycnVwdHMgYXQgb25jZS4gCisJCSAqLworCQlyZWNidWYgPSAtMTsKKwkJaWYgKHN0YXR1cyAmIGxwLT5pbnRtYXNrICYgTk9SWGZsYWcpIHsKKwkJCXJlY2J1ZiA9IGxwLT5jdXJfcng7CisJCQlCVUdNU0coRF9EVVJJTkcsICJCdWZmZXIgIyVkOiByZWNlaXZlIGlycSAoc3RhdHVzPSVYaClcbiIsCisJCQkgICAgICAgcmVjYnVmLCBzdGF0dXMpOworCisJCQlscC0+Y3VyX3J4ID0gZ2V0X2FyY2J1ZihkZXYpOworCQkJaWYgKGxwLT5jdXJfcnggIT0gLTEpIHsKKwkJCQlCVUdNU0coRF9EVVJJTkcsICJlbmFibGluZyByZWNlaXZlIHRvIGJ1ZmZlciAjJWRcbiIsCisJCQkJICAgICAgIGxwLT5jdXJfcngpOworCQkJCUFDT01NQU5EKFJYY21kIHwgKGxwLT5jdXJfcnggPDwgMykgfCBSWGJjYXN0cyk7CisJCQl9CisJCQlkaWRzb21ldGhpbmcrKzsKKwkJfQorCisJCWlmKChkaWFnc3RhdHVzICYgRVhDTkFLZmxhZykpIHsKKwkJCUJVR01TRyhEX0RVUklORywgIkVYQ05BSyBJUlEgKGRpYWdzdGF0PSVYaClcbiIsCisJCQkgICAgICAgZGlhZ3N0YXR1cyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFDT01NQU5EKE5PVFhjbWQpOyAgICAgIC8qIGRpc2FibGUgdHJhbnNtaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5leGNuYWtfcGVuZGluZyA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFDT01NQU5EKEVYQ05BS2NsZWFyKTsKKwkJCWxwLT5pbnRtYXNrICY9IH4oRVhDTkFLZmxhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWRzb21ldGhpbmcrKzsKKyAgICAgICAgICAgICAgICB9CisKKworCQkvKiBhIHRyYW5zbWl0IGZpbmlzaGVkLCBhbmQgd2UncmUgaW50ZXJlc3RlZCBpbiBpdC4gKi8KKwkJaWYgKChzdGF0dXMgJiBscC0+aW50bWFzayAmIFRYRlJFRWZsYWcpIHx8IGxwLT50aW1lZF9vdXQpIHsKKwkJCWxwLT5pbnRtYXNrICY9IH4oVFhGUkVFZmxhZ3xFWENOQUtmbGFnKTsKKworCQkJQlVHTVNHKERfRFVSSU5HLCAiVFggSVJRIChzdGF0PSVYaClcbiIsIHN0YXR1cyk7CisKKwkJCWlmIChscC0+Y3VyX3R4ICE9IC0xICYmICFscC0+dGltZWRfb3V0KSB7CisJCQkJaWYoIShzdGF0dXMgJiBUWEFDS2ZsYWcpKSB7CisJCQkJCWlmIChscC0+bGFzdHRyYW5zX2Rlc3QgIT0gMCkgeworCQkJCQkJQlVHTVNHKERfRVhUUkEsCisJCQkJCQkgICAgICAgInRyYW5zbWl0IHdhcyBub3QgYWNrbm93bGVkZ2VkISAiCisJCQkJCQkgICAgICAgIihzdGF0dXM9JVhoLCBkZXN0PSUwMlhoKVxuIiwKKwkJCQkJCSAgICAgICBzdGF0dXMsIGxwLT5sYXN0dHJhbnNfZGVzdCk7CisJCQkJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJCQlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUJVR01TRyhEX0RVUklORywKKwkJCQkJCSAgICAgICAiYnJvYWRjYXN0IHdhcyBub3QgYWNrbm93bGVkZ2VkOyB0aGF0J3Mgbm9ybWFsICIKKwkJCQkJCSAgICAgICAiKHN0YXR1cz0lWGgsIGRlc3Q9JTAyWGgpXG4iLAorCQkJCQkJICAgICAgIHN0YXR1cywgbHAtPmxhc3R0cmFuc19kZXN0KTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChscC0+b3V0Z29pbmcucHJvdG8gJiYKKwkJCQkgICAgbHAtPm91dGdvaW5nLnByb3RvLT5hY2tfdHgpIHsKKwkJCQkgIGludCBhY2tzdGF0dXM7CisJCQkJICBpZihzdGF0dXMgJiBUWEFDS2ZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2tzdGF0dXM9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGxwLT5leGNuYWtfcGVuZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFja3N0YXR1cz0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFja3N0YXR1cz0wOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPm91dGdvaW5nLnByb3RvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmFja190eChkZXYsIGFja3N0YXR1cyk7CisJCQkJfQorCQkJfQorCQkJaWYgKGxwLT5jdXJfdHggIT0gLTEpCisJCQkJcmVsZWFzZV9hcmNidWYoZGV2LCBscC0+Y3VyX3R4KTsKKworCQkJbHAtPmN1cl90eCA9IC0xOworCQkJbHAtPnRpbWVkX291dCA9IDA7CisJCQlkaWRzb21ldGhpbmcrKzsKKworCQkJLyogc2VuZCBhbm90aGVyIHBhY2tldCBpZiB0aGVyZSBpcyBvbmUgKi8KKwkJCWdvX3R4KGRldik7CisKKwkJCS8qIGNvbnRpbnVlIGEgc3BsaXQgcGFja2V0LCBpZiBhbnkgKi8KKwkJCWlmIChscC0+b3V0Z29pbmcucHJvdG8gJiYgbHAtPm91dGdvaW5nLnByb3RvLT5jb250aW51ZV90eCkgeworCQkJCWludCB0eGJ1ZiA9IGdldF9hcmNidWYoZGV2KTsKKwkJCQlpZiAodHhidWYgIT0gLTEpIHsKKwkJCQkJaWYgKGxwLT5vdXRnb2luZy5wcm90by0+Y29udGludWVfdHgoZGV2LCB0eGJ1ZikpIHsKKwkJCQkJCS8qIHRoYXQgd2FzIHRoZSBsYXN0IHNlZ21lbnQgKi8KKwkJCQkJCWxwLT5zdGF0cy50eF9ieXRlcyArPSBscC0+b3V0Z29pbmcuc2tiLT5sZW47CisJCQkJCQlpZighbHAtPm91dGdvaW5nLnByb3RvLT5hY2tfdHgpCisJCQkJCQkgIHsKKwkJCQkJCSAgICBkZXZfa2ZyZWVfc2tiX2lycShscC0+b3V0Z29pbmcuc2tiKTsKKwkJCQkJCSAgICBscC0+b3V0Z29pbmcucHJvdG8gPSBOVUxMOworCQkJCQkJICB9CisJCQkJCX0KKwkJCQkJbHAtPm5leHRfdHggPSB0eGJ1ZjsKKwkJCQl9CisJCQl9CisJCQkvKiBpbmZvcm0gdXBwZXIgbGF5ZXJzIG9mIGlkbGVuZXNzLCBpZiBuZWNlc3NhcnkgKi8KKwkJCWlmIChscC0+Y3VyX3R4ID09IC0xKQorCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCQkvKiBub3cgcHJvY2VzcyB0aGUgcmVjZWl2ZWQgcGFja2V0LCBpZiBhbnkgKi8KKwkJaWYgKHJlY2J1ZiAhPSAtMSkgeworCQkJQlVHTFZMKERfUlgpIGFyY25ldF9kdW1wX3BhY2tldChkZXYsIHJlY2J1ZiwgInJ4IGlycSIsIDApOworCisJCQlhcmNuZXRfcngoZGV2LCByZWNidWYpOworCQkJcmVsZWFzZV9hcmNidWYoZGV2LCByZWNidWYpOworCisJCQlkaWRzb21ldGhpbmcrKzsKKwkJfQorCQlpZiAoc3RhdHVzICYgbHAtPmludG1hc2sgJiBSRUNPTmZsYWcpIHsKKwkJCUFDT01NQU5EKENGTEFHU2NtZCB8IENPTkZJR2NsZWFyKTsKKwkJCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCisJCQlCVUdNU0coRF9SRUNPTiwgIk5ldHdvcmsgcmVjb25maWd1cmF0aW9uIGRldGVjdGVkIChzdGF0dXM9JVhoKVxuIiwKKwkJCSAgICAgICBzdGF0dXMpOworCisJCQkvKiBpcyB0aGUgUkVDT04gaW5mbyBlbXB0eSBvciBvbGQ/ICovCisJCQlpZiAoIWxwLT5maXJzdF9yZWNvbiB8fCAhbHAtPmxhc3RfcmVjb24gfHwKKwkJCSAgICBqaWZmaWVzIC0gbHAtPmxhc3RfcmVjb24gPiBIWiAqIDEwKSB7CisJCQkJaWYgKGxwLT5uZXR3b3JrX2Rvd24pCisJCQkJCUJVR01TRyhEX05PUk1BTCwgInJlY29uZmlndXJhdGlvbiBkZXRlY3RlZDogY2FibGluZyByZXN0b3JlZD9cbiIpOworCQkJCWxwLT5maXJzdF9yZWNvbiA9IGxwLT5sYXN0X3JlY29uID0gamlmZmllczsKKwkJCQlscC0+bnVtX3JlY29ucyA9IGxwLT5uZXR3b3JrX2Rvd24gPSAwOworCisJCQkJQlVHTVNHKERfRFVSSU5HLCAicmVjb246IGNsZWFyaW5nIGNvdW50ZXJzLlxuIik7CisJCQl9IGVsc2UgewkvKiBhZGQgdG8gY3VycmVudCBSRUNPTiBjb3VudGVyICovCisJCQkJbHAtPmxhc3RfcmVjb24gPSBqaWZmaWVzOworCQkJCWxwLT5udW1fcmVjb25zKys7CisKKwkJCQlCVUdNU0coRF9EVVJJTkcsICJyZWNvbjogY291bnRlcj0lZCwgdGltZT0lbGRzLCBuZXQ9JWRcbiIsCisJCQkJICAgICAgIGxwLT5udW1fcmVjb25zLAorCQkJCSAobHAtPmxhc3RfcmVjb24gLSBscC0+Zmlyc3RfcmVjb24pIC8gSFosCisJCQkJICAgICAgIGxwLT5uZXR3b3JrX2Rvd24pOworCisJCQkJLyogaWYgbmV0d29yayBpcyBtYXJrZWQgdXA7CisJCQkJICogYW5kIGZpcnN0X3JlY29uIGFuZCBsYXN0X3JlY29uIGFyZSA2MCsgYXBhcnQ7CisJCQkJICogYW5kIHRoZSBhdmVyYWdlIG5vLiBvZiByZWNvbnMgY291bnRlZCBpcworCQkJCSAqICAgID4gUkVDT05fVEhSRVNIT0xEL21pbjsKKwkJCQkgKiB0aGVuIHByaW50IGEgd2FybmluZyBtZXNzYWdlLgorCQkJCSAqLworCQkJCWlmICghbHAtPm5ldHdvcmtfZG93bgorCQkJCSAgICAmJiAobHAtPmxhc3RfcmVjb24gLSBscC0+Zmlyc3RfcmVjb24pIDw9IEhaICogNjAKKwkJCQkgICYmIGxwLT5udW1fcmVjb25zID49IFJFQ09OX1RIUkVTSE9MRCkgeworCQkJCQlscC0+bmV0d29ya19kb3duID0gMTsKKwkJCQkJQlVHTVNHKERfTk9STUFMLCAibWFueSByZWNvbmZpZ3VyYXRpb25zIGRldGVjdGVkOiBjYWJsaW5nIHByb2JsZW0/XG4iKTsKKwkJCQl9IGVsc2UgaWYgKCFscC0+bmV0d29ya19kb3duCisJCQkJCSAgICYmIGxwLT5sYXN0X3JlY29uIC0gbHAtPmZpcnN0X3JlY29uID4gSFogKiA2MCkgeworCQkJCQkvKiByZXNldCBjb3VudGVycyBpZiB3ZSd2ZSBnb25lIGZvciBvdmVyIGEgbWludXRlLiAqLworCQkJCQlscC0+Zmlyc3RfcmVjb24gPSBscC0+bGFzdF9yZWNvbjsKKwkJCQkJbHAtPm51bV9yZWNvbnMgPSAxOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChscC0+bmV0d29ya19kb3duICYmIGppZmZpZXMgLSBscC0+bGFzdF9yZWNvbiA+IEhaICogMTApIHsKKwkJCWlmIChscC0+bmV0d29ya19kb3duKQorCQkJCUJVR01TRyhEX05PUk1BTCwgImNhYmxpbmcgcmVzdG9yZWQ/XG4iKTsKKwkJCWxwLT5maXJzdF9yZWNvbiA9IGxwLT5sYXN0X3JlY29uID0gMDsKKwkJCWxwLT5udW1fcmVjb25zID0gbHAtPm5ldHdvcmtfZG93biA9IDA7CisKKwkJCUJVR01TRyhEX0RVUklORywgIm5vdCByZWNvbjogY2xlYXJpbmcgY291bnRlcnMgYW55d2F5LlxuIik7CisJCX0KKworCQlpZihkaWRzb21ldGhpbmcpIHsKKwkJCXJldHZhbCB8PSBJUlFfSEFORExFRDsKKwkJfQorCX0KKwl3aGlsZSAoLS1ib2d1c2NvdW50ICYmIGRpZHNvbWV0aGluZyk7CisKKwlCVUdNU0coRF9EVVJJTkcsICJhcmNuZXRfaW50ZXJydXB0IGNvbXBsZXRlIChzdGF0dXM9JVhoLCBjb3VudD0lZClcbiIsCisJICAgICAgIEFTVEFUVVMoKSwgYm9ndXNjb3VudCk7CisJQlVHTVNHKERfRFVSSU5HLCAiXG4iKTsKKworCisJQUlOVE1BU0soMCk7CisJdWRlbGF5KDEpOworCUFJTlRNQVNLKGxwLT5pbnRtYXNrKTsKKwkKKwlzcGluX3VubG9jaygmbHAtPmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgYSBnZW5lcmljIHBhY2tldCByZWNlaXZlciB0aGF0IGNhbGxzIGFyY25ldD8/X3J4IGRlcGVuZGluZyBvbiB0aGUKKyAqIHByb3RvY29sIElEIGZvdW5kLgorICovCit2b2lkIGFyY25ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtKQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBhcmNoZHIgcGt0OworCXN0cnVjdCBhcmNfcmZjMTIwMSAqc29mdDsKKwlpbnQgbGVuZ3RoLCBvZnM7CisKKwlzb2Z0ID0gJnBrdC5zb2Z0LnJmYzEyMDE7CisKKwlscC0+aHcuY29weV9mcm9tX2NhcmQoZGV2LCBidWZudW0sIDAsICZwa3QsIHNpemVvZihBUkNfSERSX1NJWkUpKTsKKwlpZiAocGt0LmhhcmQub2Zmc2V0WzBdKSB7CisJCW9mcyA9IHBrdC5oYXJkLm9mZnNldFswXTsKKwkJbGVuZ3RoID0gMjU2IC0gb2ZzOworCX0gZWxzZSB7CisJCW9mcyA9IHBrdC5oYXJkLm9mZnNldFsxXTsKKwkJbGVuZ3RoID0gNTEyIC0gb2ZzOworCX0KKworCS8qIGdldCB0aGUgZnVsbCBoZWFkZXIsIGlmIHBvc3NpYmxlICovCisJaWYgKHNpemVvZihwa3Quc29mdCkgPD0gbGVuZ3RoKQorCQlscC0+aHcuY29weV9mcm9tX2NhcmQoZGV2LCBidWZudW0sIG9mcywgc29mdCwgc2l6ZW9mKHBrdC5zb2Z0KSk7CisJZWxzZSB7CisJCW1lbXNldCgmcGt0LnNvZnQsIDAsIHNpemVvZihwa3Quc29mdCkpOworCQlscC0+aHcuY29weV9mcm9tX2NhcmQoZGV2LCBidWZudW0sIG9mcywgc29mdCwgbGVuZ3RoKTsKKwl9CisKKwlCVUdNU0coRF9EVVJJTkcsICJCdWZmZXIgIyVkOiByZWNlaXZlZCBwYWNrZXQgZnJvbSAlMDJYaCB0byAlMDJYaCAiCisJICAgICAgICIoJWQrNCBieXRlcylcbiIsCisJICAgICAgIGJ1Zm51bSwgcGt0LmhhcmQuc291cmNlLCBwa3QuaGFyZC5kZXN0LCBsZW5ndGgpOworCisJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuZ3RoICsgQVJDX0hEUl9TSVpFOworCisJLyogY2FsbCB0aGUgcmlnaHQgcmVjZWl2ZXIgZm9yIHRoZSBwcm90b2NvbCAqLworCWlmIChhcmNfcHJvdG9fbWFwW3NvZnQtPnByb3RvXS0+aXNfaXApIHsKKwkJQlVHTFZMKERfUFJPVE8pIHsKKwkJCXN0cnVjdCBBcmNQcm90bworCQkJKm9sZHAgPSBhcmNfcHJvdG9fbWFwW2xwLT5kZWZhdWx0X3Byb3RvW3BrdC5oYXJkLnNvdXJjZV1dLAorCQkJKm5ld3AgPSBhcmNfcHJvdG9fbWFwW3NvZnQtPnByb3RvXTsKKworCQkJaWYgKG9sZHAgIT0gbmV3cCkgeworCQkJCUJVR01TRyhEX1BST1RPLAorCQkJCSAgICAgICAiZ290IHByb3RvY29sICUwMlhoOyBlbmNhcCBmb3IgaG9zdCAlMDJYaCBpcyBub3cgJyVjJyIKKwkJCQkgICAgICAgIiAod2FzICclYycpXG4iLCBzb2Z0LT5wcm90bywgcGt0LmhhcmQuc291cmNlLAorCQkJCSAgICAgICBuZXdwLT5zdWZmaXgsIG9sZHAtPnN1ZmZpeCk7CisJCQl9CisJCX0KKworCQkvKiBicm9hZGNhc3RzIHdpbGwgYWx3YXlzIGJlIGRvbmUgd2l0aCB0aGUgbGFzdC11c2VkIGVuY2FwLiAqLworCQlscC0+ZGVmYXVsdF9wcm90b1swXSA9IHNvZnQtPnByb3RvOworCisJCS8qIGluIHN0cmlraW5nIGNvbnRyYXN0LCB0aGUgZm9sbG93aW5nIGlzbid0IGEgaGFjay4gKi8KKwkJbHAtPmRlZmF1bHRfcHJvdG9bcGt0LmhhcmQuc291cmNlXSA9IHNvZnQtPnByb3RvOworCX0KKwkvKiBjYWxsIHRoZSBwcm90b2NvbC1zcGVjaWZpYyByZWNlaXZlci4gKi8KKwlhcmNfcHJvdG9fbWFwW3NvZnQtPnByb3RvXS0+cngoZGV2LCBidWZudW0sICZwa3QsIGxlbmd0aCk7Cit9CisKKworCisvKiAKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLiAgVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvcgorICogY2xvc2VkLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFyY25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworCitzdGF0aWMgdm9pZCBudWxsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sCisJCSAgICBzdHJ1Y3QgYXJjaGRyICpwa3RoZHIsIGludCBsZW5ndGgpCit7CisJQlVHTVNHKERfUFJPVE8sCisJInJ4OiBkb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGggcHJvdG8gJTAyWGggZnJvbSBob3N0ICUwMlhoLlxuIiwKKwkgICAgICAgcGt0aGRyLT5zb2Z0LnJmYzEyMDEucHJvdG8sIHBrdGhkci0+aGFyZC5zb3VyY2UpOworfQorCisKK3N0YXRpYyBpbnQgbnVsbF9idWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgdWludDhfdCBkYWRkcikKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKworCUJVR01TRyhEX1BST1RPLAorCSAgICAgICAidHg6IGNhbid0IGJ1aWxkIGhlYWRlciBmb3IgZW5jYXAgJTAyWGg7IGxvYWQgYSBwcm90b2NvbCBkcml2ZXIuXG4iLAorCSAgICAgICBscC0+ZGVmYXVsdF9wcm90b1tkYWRkcl0pOworCisJLyogYWx3YXlzIGZhaWxzICovCisJcmV0dXJuIDA7Cit9CisKKworLyogdGhlICJkbyBub3RoaW5nIiBwcmVwYXJlX3R4IGZ1bmN0aW9uIHdhcm5zIHRoYXQgdGhlcmUncyBub3RoaW5nIHRvIGRvLiAqLworc3RhdGljIGludCBudWxsX3ByZXBhcmVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGFyY2hkciAqcGt0LAorCQkJICAgaW50IGxlbmd0aCwgaW50IGJ1Zm51bSkKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXJjX2hhcmR3YXJlIG5ld3BrdDsKKworCUJVR01TRyhEX1BST1RPLCAidHg6IG5vIGVuY2FwIGZvciB0aGlzIGhvc3Q7IGxvYWQgYSBwcm90b2NvbCBkcml2ZXIuXG4iKTsKKworCS8qIHNlbmQgYSBwYWNrZXQgdG8gbXlzZWxmIC0tIHdpbGwgbmV2ZXIgZ2V0IHJlY2VpdmVkLCBvZiBjb3Vyc2UgKi8KKwluZXdwa3Quc291cmNlID0gbmV3cGt0LmRlc3QgPSBkZXYtPmRldl9hZGRyWzBdOworCisJLyogb25seSBvbmUgYnl0ZSBvZiBhY3R1YWwgZGF0YSAoYW5kIGl0J3MgcmFuZG9tKSAqLworCW5ld3BrdC5vZmZzZXRbMF0gPSAweEZGOworCisJbHAtPmh3LmNvcHlfdG9fY2FyZChkZXYsIGJ1Zm51bSwgMCwgJm5ld3BrdCwgQVJDX0hEUl9TSVpFKTsKKworCXJldHVybiAxOwkJLyogZG9uZSAqLworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2NhcG1vZGUuYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jYXBtb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZlMTU1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jYXBtb2RlLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBMaW51eCBBUkNuZXQgZHJpdmVyIC0gImNhcCBtb2RlIiBwYWNrZXQgZW5jYXBzdWxhdGlvbi4KKyAqIEl0IGFkZHMgc2VxdWVuY2UgbnVtYmVycyB0byBwYWNrZXRzIGZvciBjb21tdW5pY2F0aW5nIGJldHdlZW4gYSB1c2VyIHNwYWNlCisgKiBhcHBsaWNhdGlvbiBhbmQgdGhlIGRyaXZlci4gQWZ0ZXIgYSB0cmFuc21pdCBpdCBzZW5kcyBhIHBhY2tldCB3aXRoIHByb3RvY29sCisgKiBieXRlIDAgYmFjayB1cCB0byB0aGUgdXNlcnNwYWNlIGNvbnRhaW5pbmcgdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgcGFja2V0CisgKiBwbHVzIHRoZSB0cmFuc21pdC1zdGF0dXMgb24gdGhlIEFyY05ldC4KKyAqCisgKiBXcml0dGVuIDIwMDItNCBieSBFc2JlbiBOaWVsc2VuLCBWZXN0YXMgV2luZCBTeXN0ZW1zIEEvUworICogRGVyaXZlZCBmcm9tIGFyYy1yYXdtb2RlLmMgYnkgQXZlcnkgUGVubmFydW4uCisgKiBhcmMtcmF3bW9kZSB3YXMgaW4gdHVybmVkIGJhc2VkIG9uIHNrZWxldG9uLmMsIHNlZSBiZWxvdy4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIG9yaWdpbmFsIGNvcHlyaWdodCBvZiBza2VsZXRvbi5jIHdhcyBhcyBmb2xsb3dzOgorICoKKyAqIHNrZWxldG9uLmMgV3JpdHRlbiAxOTkzIGJ5IERvbmFsZCBCZWNrZXIuCisgKiBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiAgVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkCisgKiBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIG1vZGlmaWVkIGJ5IFNSQywgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSBkcml2ZXJzL25ldC9hcmNuZXQuYworICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9hcmNkZXZpY2UuaD4KKworI2RlZmluZSBWRVJTSU9OICJhcmNuZXQ6IGNhcCBtb2RlIChgYycpIGVuY2Fwc3VsYXRpb24gc3VwcG9ydCBsb2FkZWQuXG4iCisKKworc3RhdGljIHZvaWQgcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwKKwkgICAgICAgc3RydWN0IGFyY2hkciAqcGt0aGRyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyBpbnQgYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJdW5zaWduZWQgc2hvcnQgdHlwZSwKKwkJCXVpbnQ4X3QgZGFkZHIpOworc3RhdGljIGludCBwcmVwYXJlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBhcmNoZHIgKnBrdCwgaW50IGxlbmd0aCwKKwkJICAgICAgaW50IGJ1Zm51bSk7CitzdGF0aWMgaW50IGFja190eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWNrZWQpOworCisKK3N0cnVjdCBBcmNQcm90byBjYXBtb2RlX3Byb3RvID0KK3sKKwkncicsCisJWE1UVSwKKwkwLAorICAgICAgIAlyeCwKKwlidWlsZF9oZWFkZXIsCisJcHJlcGFyZV90eCwKKwlOVUxMLAorCWFja190eAorfTsKKworCit2b2lkIGFyY25ldF9jYXBfaW5pdCh2b2lkKQoreworCWludCBjb3VudDsKKworCWZvciAoY291bnQgPSAxOyBjb3VudCA8PSA4OyBjb3VudCsrKQorCQlpZiAoYXJjX3Byb3RvX21hcFtjb3VudF0gPT0gYXJjX3Byb3RvX2RlZmF1bHQpCisJCQlhcmNfcHJvdG9fbWFwW2NvdW50XSA9ICZjYXBtb2RlX3Byb3RvOworCisJLyogZm9yIGNhcCBtb2RlLCB3ZSBvbmx5IHNldCB0aGUgYmNhc3QgcHJvdG8gaWYgdGhlcmUncyBubyBiZXR0ZXIgb25lICovCisJaWYgKGFyY19iY2FzdF9wcm90byA9PSBhcmNfcHJvdG9fZGVmYXVsdCkKKwkJYXJjX2JjYXN0X3Byb3RvID0gJmNhcG1vZGVfcHJvdG87CisKKwlhcmNfcHJvdG9fZGVmYXVsdCA9ICZjYXBtb2RlX3Byb3RvOworCWFyY19yYXdfcHJvdG8gPSAmY2FwbW9kZV9wcm90bzsKK30KKworCisjaWZkZWYgTU9EVUxFCisKK2ludCBfX2luaXQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwcmludGsoVkVSU0lPTik7CisJYXJjbmV0X2NhcF9pbml0KCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlhcmNuZXRfdW5yZWdpc3Rlcl9wcm90bygmY2FwbW9kZV9wcm90byk7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNlbmRpZgkJCQkvKiBNT0RVTEUgKi8KKworCisKKy8qIHBhY2tldCByZWNlaXZlciAqLworc3RhdGljIHZvaWQgcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwKKwkgICAgICAgc3RydWN0IGFyY2hkciAqcGt0aGRyLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gKHN0cnVjdCBhcmNuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGFyY2hkciAqcGt0ID0gcGt0aGRyOworCWNoYXIgKnBrdGJ1ZiwgKnBrdGhkcmJ1ZjsKKwlpbnQgb2ZzOworCisJQlVHTVNHKERfRFVSSU5HLCAiaXQncyBhIHJhdyhjYXApIHBhY2tldCAobGVuZ3RoPSVkKVxuIiwgbGVuZ3RoKTsKKworCWlmIChsZW5ndGggPj0gTWluVFUpCisJCW9mcyA9IDUxMiAtIGxlbmd0aDsKKwllbHNlCisJCW9mcyA9IDI1NiAtIGxlbmd0aDsKKworCXNrYiA9IGFsbG9jX3NrYihsZW5ndGggKyBBUkNfSERSX1NJWkUgKyBzaXplb2YoaW50KSwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCUJVR01TRyhEX05PUk1BTCwgIk1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iKTsKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKwlza2JfcHV0KHNrYiwgbGVuZ3RoICsgQVJDX0hEUl9TSVpFICsgc2l6ZW9mKGludCkpOworCXNrYi0+ZGV2ID0gZGV2OworCisJcGt0ID0gKHN0cnVjdCBhcmNoZHIgKikgc2tiLT5kYXRhOworCisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9wdWxsKHNrYiwgQVJDX0hEUl9TSVpFKTsKKworCS8qIHVwIHRvIHNpemVvZihwa3QtPnNvZnQpIGhhcyBhbHJlYWR5IGJlZW4gY29waWVkIGZyb20gdGhlIGNhcmQgKi8KKwkvKiBzcXVlZXplIGluIGFuIGludCBmb3IgdGhlIGNhcCBlbmNhcHN1bGF0aW9uICovCisKKwkvKiB1c2UgdGhlc2UgdmFyaWFibGVzIHRvIGJlIHN1cmUgd2UgY291bnQgaW4gYnl0ZXMsIG5vdCBpbgorCSAgIHNpemVvZihzdHJ1Y3QgYXJjaGRyKSAqLworCXBrdGJ1Zj0oY2hhciopcGt0OworCXBrdGhkcmJ1Zj0oY2hhciopcGt0aGRyOworCW1lbWNweShwa3RidWYsIHBrdGhkcmJ1ZiwgQVJDX0hEUl9TSVpFK3NpemVvZihwa3QtPnNvZnQuY2FwLnByb3RvKSk7CisJbWVtY3B5KHBrdGJ1ZitBUkNfSERSX1NJWkUrc2l6ZW9mKHBrdC0+c29mdC5jYXAucHJvdG8pK3NpemVvZihpbnQpLAorCSAgICAgICBwa3RoZHJidWYrQVJDX0hEUl9TSVpFK3NpemVvZihwa3QtPnNvZnQuY2FwLnByb3RvKSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBhcmNoZHIpLUFSQ19IRFJfU0laRS1zaXplb2YocGt0LT5zb2Z0LmNhcC5wcm90bykpOworCisJaWYgKGxlbmd0aCA+IHNpemVvZihwa3QtPnNvZnQpKQorCQlscC0+aHcuY29weV9mcm9tX2NhcmQoZGV2LCBidWZudW0sIG9mcyArIHNpemVvZihwa3QtPnNvZnQpLAorCQkJCSAgICAgIHBrdC0+c29mdC5yYXcgKyBzaXplb2YocGt0LT5zb2Z0KQorCQkJCSAgICAgICsgc2l6ZW9mKGludCksCisJCQkJICAgICAgbGVuZ3RoIC0gc2l6ZW9mKHBrdC0+c29mdCkpOworCisJQlVHTFZMKERfU0tCKSBhcmNuZXRfZHVtcF9za2IoZGV2LCBza2IsICJyeCIpOworCisJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQVJDTkVUKTsKKzsKKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Cit9CisKKworLyoKKyAqIENyZWF0ZSB0aGUgQVJDbmV0IGhhcmQvc29mdCBoZWFkZXJzIGZvciBjYXAgbW9kZS4KKyAqIFRoZXJlIGFyZW4ndCBhbnkgc29mdCBoZWFkZXJzIGluIGNhcCBtb2RlIC0gbm90IGV2ZW4gdGhlIHByb3RvY29sIGlkLgorICovCitzdGF0aWMgaW50IGJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXVuc2lnbmVkIHNob3J0IHR5cGUsCisJCQl1aW50OF90IGRhZGRyKQoreworCWludCBoZHJfc2l6ZSA9IEFSQ19IRFJfU0laRTsKKwlzdHJ1Y3QgYXJjaGRyICpwa3QgPSAoc3RydWN0IGFyY2hkciAqKSBza2JfcHVzaChza2IsIGhkcl9zaXplKTsKKworCUJVR01TRyhEX1BST1RPLCAiUHJlcGFyaW5nIGhlYWRlciBmb3IgY2FwIHBhY2tldCAleC5cbiIsCisJICAgICAgICooKGludCopJnBrdC0+c29mdC5jYXAuY29va2llWzBdKSk7CisJLyoKKwkgKiBTZXQgdGhlIHNvdXJjZSBoYXJkd2FyZSBhZGRyZXNzLgorCSAqCisJICogVGhpcyBpcyBwcmV0dHkgcG9pbnRsZXNzIGZvciBtb3N0IHB1cnBvc2VzLCBidXQgaXQgY2FuIGhlbHAgaW4KKwkgKiBkZWJ1Z2dpbmcuICBBUkNuZXQgZG9lcyBub3QgYWxsb3cgdXMgdG8gY2hhbmdlIHRoZSBzb3VyY2UgYWRkcmVzcyBpbgorCSAqIHRoZSBhY3R1YWwgcGFja2V0IHNlbnQpCisJICovCisJcGt0LT5oYXJkLnNvdXJjZSA9ICpkZXYtPmRldl9hZGRyOworCisJLyogc2VlIGxpbnV4L25ldC9ldGhlcm5ldC9ldGguYyB0byBzZWUgd2hlcmUgSSBnb3QgdGhlIGZvbGxvd2luZyAqLworCisJaWYgKGRldi0+ZmxhZ3MgJiAoSUZGX0xPT1BCQUNLIHwgSUZGX05PQVJQKSkgeworCQkvKgorCQkgKiBGSVhNRTogZmlsbCBpbiB0aGUgbGFzdCBieXRlIG9mIHRoZSBkZXN0IGlwYWRkciBoZXJlIHRvIGJldHRlcgorCQkgKiBjb21wbHkgd2l0aCBSRkMxMDUxIGluICJub2FycCIgbW9kZS4KKwkJICovCisJCXBrdC0+aGFyZC5kZXN0ID0gMDsKKwkJcmV0dXJuIGhkcl9zaXplOworCX0KKwkvKiBvdGhlcndpc2UsIGp1c3QgZmlsbCBpdCBpbiBhbmQgZ28hICovCisJcGt0LT5oYXJkLmRlc3QgPSBkYWRkcjsKKworCXJldHVybiBoZHJfc2l6ZTsJLyogc3VjY2VzcyAqLworfQorCisKK3N0YXRpYyBpbnQgcHJlcGFyZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYXJjaGRyICpwa3QsIGludCBsZW5ndGgsCisJCSAgICAgIGludCBidWZudW0pCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSAoc3RydWN0IGFyY25ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJc3RydWN0IGFyY19oYXJkd2FyZSAqaGFyZCA9ICZwa3QtPmhhcmQ7CisJaW50IG9mczsKKworCisJLyogaGFyZCBoZWFkZXIgaXMgbm90IGluY2x1ZGVkIGluIHBhY2tldCBsZW5ndGggKi8KKwlsZW5ndGggLT0gQVJDX0hEUl9TSVpFOworCS8qIEFuZCBuZWl0aGVyIGlzIHRoZSBjb29raWUgZmllbGQgKi8KKwlsZW5ndGggLT0gc2l6ZW9mKGludCk7CisKKwlCVUdNU0coRF9EVVJJTkcsICJwcmVwYXJlX3R4OiB0eGJ1ZnM9JWQvJWQvJWRcbiIsCisJICAgICAgIGxwLT5uZXh0X3R4LCBscC0+Y3VyX3R4LCBidWZudW0pOworCisJQlVHTVNHKERfUFJPVE8sICJTZW5kaW5nIGZvciBjYXAgcGFja2V0ICV4LlxuIiwKKwkgICAgICAgKigoaW50KikmcGt0LT5zb2Z0LmNhcC5jb29raWVbMF0pKTsKKworCWlmIChsZW5ndGggPiBYTVRVKSB7CisJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4hIG90aGVyIHBlb3BsZSBhbHJlYWR5IGNoZWNrIGZvciB0aGlzLiAqLworCQlCVUdNU0coRF9OT1JNQUwsICJCdWchICBwcmVwYXJlX3R4IHdpdGggc2l6ZSAlZCAoPiAlZClcbiIsCisJCSAgICAgICBsZW5ndGgsIFhNVFUpOworCQlsZW5ndGggPSBYTVRVOworCX0KKwlpZiAobGVuZ3RoID4gTWluVFUpIHsKKwkJaGFyZC0+b2Zmc2V0WzBdID0gMDsKKwkJaGFyZC0+b2Zmc2V0WzFdID0gb2ZzID0gNTEyIC0gbGVuZ3RoOworCX0gZWxzZSBpZiAobGVuZ3RoID4gTVRVKSB7CisJCWhhcmQtPm9mZnNldFswXSA9IDA7CisJCWhhcmQtPm9mZnNldFsxXSA9IG9mcyA9IDUxMiAtIGxlbmd0aCAtIDM7CisJfSBlbHNlCisJCWhhcmQtPm9mZnNldFswXSA9IG9mcyA9IDI1NiAtIGxlbmd0aDsKKworCUJVR01TRyhEX0RVUklORywgInByZXBhcmVfdHg6IGxlbmd0aD0lZCBvZnM9JWRcbiIsCisJICAgICAgIGxlbmd0aCxvZnMpOworCisJLy8gQ29weSB0aGUgYXJjbmV0LWhlYWRlciArIHRoZSBwcm90b2NvbCBieXRlIGRvd246CisJbHAtPmh3LmNvcHlfdG9fY2FyZChkZXYsIGJ1Zm51bSwgMCwgaGFyZCwgQVJDX0hEUl9TSVpFKTsKKwlscC0+aHcuY29weV90b19jYXJkKGRldiwgYnVmbnVtLCBvZnMsICZwa3QtPnNvZnQuY2FwLnByb3RvLAorCQkJICAgIHNpemVvZihwa3QtPnNvZnQuY2FwLnByb3RvKSk7CisKKwkvLyBTa2lwIHRoZSBleHRyYSBpbnRlZ2VyIHdlIGhhdmUgd3JpdHRlbiBpbnRvIGl0IGFzIGEgY29va2llCisJLy8gYnV0IHdyaXRlIHRoZSByZXN0IG9mIHRoZSBtZXNzYWdlOgorCWxwLT5ody5jb3B5X3RvX2NhcmQoZGV2LCBidWZudW0sIG9mcysxLAorCQkJICAgICgodW5zaWduZWQgY2hhciopJnBrdC0+c29mdC5jYXAubWVzKSxsZW5ndGgtMSk7CisKKwlscC0+bGFzdGxvYWRfZGVzdCA9IGhhcmQtPmRlc3Q7CisKKwlyZXR1cm4gMTsJCS8qIGRvbmUgKi8KK30KKworCitzdGF0aWMgaW50IGFja190eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWNrZWQpCit7CisgIHN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gKHN0cnVjdCBhcmNuZXRfbG9jYWwgKikgZGV2LT5wcml2OworICBzdHJ1Y3Qgc2tfYnVmZiAqYWNrc2tiOworICBzdHJ1Y3QgYXJjaGRyICphY2twa3Q7CisgIGludCBsZW5ndGg9c2l6ZW9mKHN0cnVjdCBhcmNfY2FwKTsKKworICBCVUdNU0coRF9EVVJJTkcsICJjYXBtb2RlOiBhY2tfdHg6IHByb3RvY29sOiAleDogcmVzdWx0OiAlZFxuIiwKKwkgbHAtPm91dGdvaW5nLnNrYi0+cHJvdG9jb2wsIGFja2VkKTsKKworICBCVUdMVkwoRF9TS0IpIGFyY25ldF9kdW1wX3NrYihkZXYsIGxwLT5vdXRnb2luZy5za2IsICJhY2tfdHgiKTsKKworICAvKiBOb3cgYWxsb2MgYSBza2IgdG8gc2VuZCBiYWNrIHVwIHRocm91Z2ggdGhlIGxheWVyczogKi8KKyAgYWNrc2tiID0gYWxsb2Nfc2tiKGxlbmd0aCArIEFSQ19IRFJfU0laRSAsIEdGUF9BVE9NSUMpOworICBpZiAoYWNrc2tiID09IE5VTEwpIHsKKwkgIEJVR01TRyhEX05PUk1BTCwgIk1lbW9yeSBzcXVlZXplLCBjYW4ndCBhY2tub3dsZWRnZS5cbiIpOworCSAgZ290byBmcmVlX291dHNrYjsKKyAgfQorCisgIHNrYl9wdXQoYWNrc2tiLCBsZW5ndGggKyBBUkNfSERSX1NJWkUgKTsKKyAgYWNrc2tiLT5kZXYgPSBkZXY7CisKKyAgYWNrcGt0ID0gKHN0cnVjdCBhcmNoZHIgKikgYWNrc2tiLT5kYXRhOworCisgIGFja3NrYi0+bWFjLnJhdyA9IGFja3NrYi0+ZGF0YTsKKyAgLyogc2tiX3B1bGwoYWNrc2tiLCBBUkNfSERSX1NJWkUpOyAqLworCisKKyAgbWVtY3B5KGFja3BrdCwgbHAtPm91dGdvaW5nLnNrYi0+ZGF0YSwgQVJDX0hEUl9TSVpFK3NpemVvZihzdHJ1Y3QgYXJjX2NhcCkpOworICBhY2twa3QtPnNvZnQuY2FwLnByb3RvPTA7IC8qIHVzaW5nIHByb3RvY29sIDAgZm9yIGFja25vd2xlZGdlICovCisgIGFja3BrdC0+c29mdC5jYXAubWVzLmFjaz1hY2tlZDsKKworICBCVUdNU0coRF9QUk9UTywgIkFja2tub3dsZWRnZSBmb3IgY2FwIHBhY2tldCAleC5cbiIsCisJICooKGludCopJmFja3BrdC0+c29mdC5jYXAuY29va2llWzBdKSk7CisKKyAgYWNrc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQVJDTkVUKTsKKworICBCVUdMVkwoRF9TS0IpIGFyY25ldF9kdW1wX3NrYihkZXYsIGFja3NrYiwgImFja190eF9yZWN2Iik7CisgIG5ldGlmX3J4KGFja3NrYik7CisKKyBmcmVlX291dHNrYjoKKyAgZGV2X2tmcmVlX3NrYl9pcnEobHAtPm91dGdvaW5nLnNrYik7CisgIGxwLT5vdXRnb2luZy5wcm90byA9IE5VTEw7IC8qIFdlIGFyZSBhbHdheXMgZmluaXNoZWQgd2hlbiBpbiB0aGlzIHByb3RvY29sICovCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAtaXNhLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAtaXNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4OWU2MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC1pc2EuYwpAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIExpbnV4IEFSQ25ldCBkcml2ZXIgLSBDT00yMDAyMCBjaGlwc2V0IHN1cHBvcnQKKyAqIAorICogV3JpdHRlbiAxOTk3IGJ5IERhdmlkIFdvb2Rob3VzZS4KKyAqIFdyaXR0ZW4gMTk5NC0xOTk5IGJ5IEF2ZXJ5IFBlbm5hcnVuLgorICogV3JpdHRlbiAxOTk5LTIwMDAgYnkgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+LgorICogRGVyaXZlZCBmcm9tIHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiBTcGVjaWFsIHRoYW5rcyB0byBDb250ZW1wb3JhcnkgQ29udHJvbHMsIEluYy4gKHd3dy5jY29udHJvbHMuY29tKQorICogIGZvciBzcG9uc29yaW5nIHRoZSBmdXJ0aGVyIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgb3JpZ2luYWwgY29weXJpZ2h0IG9mIHNrZWxldG9uLmMgd2FzIGFzIGZvbGxvd3M6CisgKgorICogc2tlbGV0b24uYyBXcml0dGVuIDE5OTMgYnkgRG9uYWxkIEJlY2tlci4KKyAqIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBvbmx5IGJlIHVzZWQKKyAqIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogbW9kaWZpZWQgYnkgU1JDLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRm9yIG1vcmUgZGV0YWlscywgc2VlIGRyaXZlcnMvbmV0L2FyY25ldC5jCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hcmNkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jb20yMDAyMC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgVkVSU0lPTiAiYXJjbmV0OiBDT00yMDAyMCBJU0Egc3VwcG9ydCAoYnkgRGF2aWQgV29vZGhvdXNlIGV0IGFsLilcbiIKKworCisvKgorICogV2UgY2Fubm90ICh5ZXQpIHByb2JlIGZvciBhbiBJTyBtYXBwZWQgY2FyZCwgYWx0aG91Z2ggd2UgY2FuIGNoZWNrIHRoYXQKKyAqIGl0J3Mgd2hlcmUgd2Ugd2VyZSB0b2xkIGl0IHdhcywgYW5kIGV2ZW4gZG8gYXV0b2lycS4KKyAqLworc3RhdGljIGludCBfX2luaXQgY29tMjAwMjBpc2FfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyOworCXVuc2lnbmVkIGxvbmcgYWlycW1hc2s7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IGVycjsKKworCUJVR0xWTChEX05PUk1BTCkgcHJpbnRrKFZFUlNJT04pOworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaWYgKCFpb2FkZHIpIHsKKwkJQlVHTVNHKERfTk9STUFMLCAiTm8gYXV0b3Byb2JlICh5ZXQpIGZvciBJTyBtYXBwZWQgY2FyZHM7IHlvdSAiCisJCSAgICAgICAibXVzdCBzcGVjaWZ5IHRoZSBiYXNlIGFkZHJlc3MhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBBUkNORVRfVE9UQUxfU0laRSwgImFyY25ldCAoQ09NMjAwMjApIikpIHsKKwkJQlVHTVNHKERfTk9STUFMLCAiSU8gcmVnaW9uICV4aC0leGggYWxyZWFkeSBhbGxvY2F0ZWQuXG4iLAorCQkgICAgICAgaW9hZGRyLCBpb2FkZHIgKyBBUkNORVRfVE9UQUxfU0laRSAtIDEpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlpZiAoQVNUQVRVUygpID09IDB4RkYpIHsKKwkJQlVHTVNHKERfTk9STUFMLCAiSU8gYWRkcmVzcyAleCBlbXB0eVxuIiwgaW9hZGRyKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCWlmIChjb20yMDAyMF9jaGVjayhkZXYpKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghZGV2LT5pcnEpIHsKKwkJLyogaWYgd2UgZG8gdGhpcywgd2UncmUgc3VyZSB0byBnZXQgYW4gSVJRIHNpbmNlIHRoZQorCQkgKiBjYXJkIGhhcyBqdXN0IHJlc2V0IGFuZCB0aGUgTk9SWGZsYWcgaXMgb24gdW50aWwKKwkJICogd2UgdGVsbCBpdCB0byBzdGFydCByZWNlaXZpbmcuCisJCSAqLworCQlCVUdNU0coRF9JTklUX1JFQVNPTlMsICJpbnRtYXNrIHdhcyAlMDJYaFxuIiwgaW5iKF9JTlRNQVNLKSk7CisJCW91dGIoMCwgX0lOVE1BU0spOworCQlhaXJxbWFzayA9IHByb2JlX2lycV9vbigpOworCQlvdXRiKE5PUlhmbGFnLCBfSU5UTUFTSyk7CisJCXVkZWxheSgxKTsKKwkJb3V0YigwLCBfSU5UTUFTSyk7CisJCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZihhaXJxbWFzayk7CisKKwkJaWYgKGRldi0+aXJxIDw9IDApIHsKKwkJCUJVR01TRyhEX0lOSVRfUkVBU09OUywgIkF1dG9wcm9iZSBJUlEgZmFpbGVkIGZpcnN0IHRpbWVcbiIpOworCQkJYWlycW1hc2sgPSBwcm9iZV9pcnFfb24oKTsKKwkJCW91dGIoTk9SWGZsYWcsIF9JTlRNQVNLKTsKKwkJCXVkZWxheSg1KTsKKwkJCW91dGIoMCwgX0lOVE1BU0spOworCQkJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmKGFpcnFtYXNrKTsKKwkJCWlmIChkZXYtPmlycSA8PSAwKSB7CisJCQkJQlVHTVNHKERfTk9STUFMLCAiQXV0b3Byb2JlIElSUSBmYWlsZWQuXG4iKTsKKwkJCQllcnIgPSAtRU5PREVWOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCisJbHAtPmNhcmRfbmFtZSA9ICJJU0EgQ09NMjAwMjAiOworCWlmICgoZXJyID0gY29tMjAwMjBfZm91bmQoZGV2LCAwKSkgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlyZXR1cm4gMDsKKworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgQVJDTkVUX1RPVEFMX1NJWkUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbm9kZSA9IDA7CitzdGF0aWMgaW50IGlvID0gMHgwOwkJLyogPC0tLSBFRElUIFRIRVNFIExJTkVTIEZPUiBZT1VSIENPTkZJR1VSQVRJT04gKi8KK3N0YXRpYyBpbnQgaXJxID0gMDsJCS8qIG9yIHVzZSB0aGUgaW5zbW9kIGlvPSBpcnE9IHNobWVtPSBvcHRpb25zICovCitzdGF0aWMgY2hhciBkZXZpY2VbOV07CQkvKiB1c2UgZWcuIGRldmljZT0iYXJjMSIgdG8gY2hhbmdlIG5hbWUgKi8KK3N0YXRpYyBpbnQgdGltZW91dCA9IDM7CitzdGF0aWMgaW50IGJhY2twbGFuZSA9IDA7CitzdGF0aWMgaW50IGNsb2NrcCA9IDA7CitzdGF0aWMgaW50IGNsb2NrbSA9IDA7CisKK21vZHVsZV9wYXJhbShub2RlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9zdHJpbmcoZGV2aWNlLCBkZXZpY2UsIHNpemVvZihkZXZpY2UpLCAwKTsKK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGJhY2twbGFuZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjbG9ja3AsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY2xvY2ttLCBpbnQsIDApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqbXlfZGV2OworCitzdGF0aWMgaW50IF9faW5pdCBjb20yMDAyMF9pbml0KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscDsKKworCWRldiA9IGFsbG9jX2FyY2RldihkZXZpY2UpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChub2RlICYmIG5vZGUgIT0gMHhmZikKKwkJZGV2LT5kZXZfYWRkclswXSA9IG5vZGU7CisKKwlscCA9IGRldi0+cHJpdjsKKwlscC0+YmFja3BsYW5lID0gYmFja3BsYW5lOworCWxwLT5jbG9ja3AgPSBjbG9ja3AgJiA3OworCWxwLT5jbG9ja20gPSBjbG9ja20gJiAzOworCWxwLT50aW1lb3V0ID0gdGltZW91dCAmIDM7CisJbHAtPmh3Lm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvOworCWRldi0+aXJxID0gaXJxOworCisJaWYgKGRldi0+aXJxID09IDIpCisJCWRldi0+aXJxID0gOTsKKworCWlmIChjb20yMDAyMGlzYV9wcm9iZShkZXYpKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCW15X2RldiA9IGRldjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNvbTIwMDIwX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihteV9kZXYpOworCWZyZWVfaXJxKG15X2Rldi0+aXJxLCBteV9kZXYpOworCXJlbGVhc2VfcmVnaW9uKG15X2Rldi0+YmFzZV9hZGRyLCBBUkNORVRfVE9UQUxfU0laRSk7CisJZnJlZV9uZXRkZXYobXlfZGV2KTsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IGNvbTIwMDIwaXNhX3NldHVwKGNoYXIgKnMpCit7CisJaW50IGludHNbOF07CisKKwlzID0gZ2V0X29wdGlvbnMocywgOCwgaW50cyk7CisJaWYgKCFpbnRzWzBdKQorCQlyZXR1cm4gMTsKKworCXN3aXRjaCAoaW50c1swXSkgeworCWRlZmF1bHQ6CQkvKiBFUlJPUiAqLworCQlwcmludGsoImNvbTkweHg6IFRvbyBtYW55IGFyZ3VtZW50cy5cbiIpOworCWNhc2UgNjoJCS8qIFRpbWVvdXQgKi8KKwkJdGltZW91dCA9IGludHNbNl07CisJY2FzZSA1OgkJLyogQ0tQIHZhbHVlICovCisJCWNsb2NrcCA9IGludHNbNV07CisJY2FzZSA0OgkJLyogQmFja3BsYW5lIGZsYWcgKi8KKwkJYmFja3BsYW5lID0gaW50c1s0XTsKKwljYXNlIDM6CQkvKiBOb2RlIElEICovCisJCW5vZGUgPSBpbnRzWzNdOworCWNhc2UgMjoJCS8qIElSUSAqLworCQlpcnEgPSBpbnRzWzJdOworCWNhc2UgMToJCS8qIElPIGFkZHJlc3MgKi8KKwkJaW8gPSBpbnRzWzFdOworCX0KKwlpZiAoKnMpCisJCXNucHJpbnRmKGRldmljZSwgc2l6ZW9mKGRldmljZSksICIlcyIsIHMpOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJjb20yMDAyMD0iLCBjb20yMDAyMGlzYV9zZXR1cCk7CisKKyNlbmRpZgkJCQkvKiBNT0RVTEUgKi8KKworbW9kdWxlX2luaXQoY29tMjAwMjBfaW5pdCkKK21vZHVsZV9leGl0KGNvbTIwMDIwX2V4aXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAtcGNpLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAtcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2MzZjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC1wY2kuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIExpbnV4IEFSQ25ldCBkcml2ZXIgLSBDT00yMDAyMCBQQ0kgc3VwcG9ydAorICogQ29udGVtcG9yYXJ5IENvbnRyb2xzIFBDSTIwIGFuZCBTT0hBUkQgU0gtQVJDIFBDSQorICogCisgKiBXcml0dGVuIDE5OTQtMTk5OSBieSBBdmVyeSBQZW5uYXJ1biwKKyAqICAgIGJhc2VkIG9uIGFuIElTQSB2ZXJzaW9uIGJ5IERhdmlkIFdvb2Rob3VzZS4KKyAqIFdyaXR0ZW4gMTk5OS0yMDAwIGJ5IE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6Pi4KKyAqIERlcml2ZWQgZnJvbSBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gQ29udGVtcG9yYXJ5IENvbnRyb2xzLCBJbmMuICh3d3cuY2NvbnRyb2xzLmNvbSkKKyAqICBmb3Igc3BvbnNvcmluZyB0aGUgZnVydGhlciBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIG9yaWdpbmFsIGNvcHlyaWdodCBvZiBza2VsZXRvbi5jIHdhcyBhcyBmb2xsb3dzOgorICoKKyAqIHNrZWxldG9uLmMgV3JpdHRlbiAxOTkzIGJ5IERvbmFsZCBCZWNrZXIuCisgKiBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiAgVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkCisgKiBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIG1vZGlmaWVkIGJ5IFNSQywgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSBkcml2ZXJzL25ldC9hcmNuZXQuYworICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYXJjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY29tMjAwMjAuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisKKyNkZWZpbmUgVkVSU0lPTiAiYXJjbmV0OiBDT00yMDAyMCBQQ0kgc3VwcG9ydFxuIgorCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCitzdGF0aWMgaW50IG5vZGU7CitzdGF0aWMgY2hhciBkZXZpY2VbOV07CQkvKiB1c2UgZWcuIGRldmljZT0iYXJjMSIgdG8gY2hhbmdlIG5hbWUgKi8KK3N0YXRpYyBpbnQgdGltZW91dCA9IDM7CitzdGF0aWMgaW50IGJhY2twbGFuZTsKK3N0YXRpYyBpbnQgY2xvY2twOworc3RhdGljIGludCBjbG9ja207CisKK21vZHVsZV9wYXJhbShub2RlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX3N0cmluZyhkZXZpY2UsIGRldmljZSwgc2l6ZW9mKGRldmljZSksIDApOworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oYmFja3BsYW5lLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNsb2NrcCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjbG9ja20sIGludCwgMCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNvbTIwMDIwcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscDsKKwlpbnQgaW9hZGRyLCBlcnI7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCXJldHVybiAtRUlPOworCWRldiA9IGFsbG9jX2FyY2RldihkZXZpY2UpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlscCA9IGRldi0+cHJpdjsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJLy8gU09IQVJEIG5lZWRzIFBDSSBiYXNlIGFkZHIgNAorCWlmIChwZGV2LT52ZW5kb3I9PTB4MTBCNSkgeworCQlCVUdNU0coRF9OT1JNQUwsICJTT0hBUkRcbiIpOworCQlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNCk7CisJfQorCWVsc2UgeworCQlCVUdNU0coRF9OT1JNQUwsICJDb250ZW1wb3JhcnkgQ29udHJvbHNcbiIpOworCQlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEFSQ05FVF9UT1RBTF9TSVpFLCAiY29tMjAwMjAtcGNpIikpIHsKKwkJQlVHTVNHKERfSU5JVCwgIklPIHJlZ2lvbiAleGgtJXhoIGFscmVhZHkgYWxsb2NhdGVkLlxuIiwKKwkJICAgICAgIGlvYWRkciwgaW9hZGRyICsgQVJDTkVUX1RPVEFMX1NJWkUgLSAxKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dF9kZXY7CisJfQorCisJLy8gRHVtbXkgYWNjZXNzIGFmdGVyIFJlc2V0CisJLy8gQVJDTkVUIGNvbnRyb2xsZXIgbmVlZHMgdGhpcyBhY2Nlc3MgdG8gZGV0ZWN0IGJ1c3R5cGUKKwlvdXRiKDB4MDAsaW9hZGRyKzEpOworCWluYihpb2FkZHIrMSk7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPmRldl9hZGRyWzBdID0gbm9kZTsKKwlscC0+Y2FyZF9uYW1lID0gIlBDSSBDT00yMDAyMCI7CisJbHAtPmNhcmRfZmxhZ3MgPSBpZC0+ZHJpdmVyX2RhdGE7CisJbHAtPmJhY2twbGFuZSA9IGJhY2twbGFuZTsKKwlscC0+Y2xvY2twID0gY2xvY2twICYgNzsKKwlscC0+Y2xvY2ttID0gY2xvY2ttICYgMzsKKwlscC0+dGltZW91dCA9IHRpbWVvdXQ7CisJbHAtPmh3Lm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlpZiAoQVNUQVRVUygpID09IDB4RkYpIHsKKwkJQlVHTVNHKERfTk9STUFMLCAiSU8gYWRkcmVzcyAlWGggd2FzIHJlcG9ydGVkIGJ5IFBDSSBCSU9TLCAiCisJCSAgICAgICAiYnV0IHNlZW1zIGVtcHR5IVxuIiwgaW9hZGRyKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBvdXRfcG9ydDsKKwl9CisJaWYgKGNvbTIwMDIwX2NoZWNrKGRldikpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBvdXRfcG9ydDsKKwl9CisKKwlpZiAoKGVyciA9IGNvbTIwMDIwX2ZvdW5kKGRldiwgU0FfU0hJUlEpKSAhPSAwKQorCSAgICAgICAgZ290byBvdXRfcG9ydDsKKworCXJldHVybiAwOworCitvdXRfcG9ydDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEFSQ05FVF9UT1RBTF9TSVpFKTsKK291dF9kZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgY29tMjAwMjBwY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgQVJDTkVUX1RPVEFMX1NJWkUpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjb20yMDAyMHBjaV9pZF90YWJsZVtdID0geworCXsgMHgxNTcxLCAweGEwMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDB4MTU3MSwgMHhhMDAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyAweDE1NzEsIDB4YTAwMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMHgxNTcxLCAweGEwMDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDB4MTU3MSwgMHhhMDA1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyAweDE1NzEsIDB4YTAwNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMHgxNTcxLCAweGEwMDcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDB4MTU3MSwgMHhhMDA4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyAweDE1NzEsIDB4YTAwOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVJDX0lTXzVNQklUIH0sCisJeyAweDE1NzEsIDB4YTAwYSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVJDX0lTXzVNQklUIH0sCisJeyAweDE1NzEsIDB4YTAwYiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVJDX0lTXzVNQklUIH0sCisJeyAweDE1NzEsIDB4YTAwYywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVJDX0lTXzVNQklUIH0sCisJeyAweDE1NzEsIDB4YTAwZCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVJDX0lTXzVNQklUIH0sCisJeyAweDE1NzEsIDB4YTIwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVJDX0NBTl8xME1CSVQgfSwKKwl7IDB4MTU3MSwgMHhhMjAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBUkNfQ0FOXzEwTUJJVCB9LAorCXsgMHgxNTcxLCAweGEyMDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFSQ19DQU5fMTBNQklUIH0sCisJeyAweDE1NzEsIDB4YTIwNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVJDX0NBTl8xME1CSVQgfSwKKwl7IDB4MTU3MSwgMHhhMjA1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBUkNfQ0FOXzEwTUJJVCB9LAorCXsgMHgxNTcxLCAweGEyMDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFSQ19DQU5fMTBNQklUIH0sCisJeyAweDEwQjUsIDB4OTA1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVJDX0NBTl8xME1CSVQgfSwKKwl7MCx9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY29tMjAwMjBwY2lfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY29tMjAwMjBwY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJjb20yMDAyMCIsCisJLmlkX3RhYmxlCT0gY29tMjAwMjBwY2lfaWRfdGFibGUsCisJLnByb2JlCQk9IGNvbTIwMDIwcGNpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoY29tMjAwMjBwY2lfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNvbTIwMDIwcGNpX2luaXQodm9pZCkKK3sKKwlCVUdMVkwoRF9OT1JNQUwpIHByaW50ayhWRVJTSU9OKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZjb20yMDAyMHBjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY29tMjAwMjBwY2lfY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY29tMjAwMjBwY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY29tMjAwMjBwY2lfaW5pdCkKK21vZHVsZV9leGl0KGNvbTIwMDIwcGNpX2NsZWFudXApCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAuYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb20yMDAyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYzcwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAuYwpAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqIExpbnV4IEFSQ25ldCBkcml2ZXIgLSBDT00yMDAyMCBjaGlwc2V0IHN1cHBvcnQKKyAqIAorICogV3JpdHRlbiAxOTk3IGJ5IERhdmlkIFdvb2Rob3VzZS4KKyAqIFdyaXR0ZW4gMTk5NC0xOTk5IGJ5IEF2ZXJ5IFBlbm5hcnVuLgorICogV3JpdHRlbiAxOTk5IGJ5IE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6Pi4KKyAqIERlcml2ZWQgZnJvbSBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gQ29udGVtcG9yYXJ5IENvbnRyb2xzLCBJbmMuICh3d3cuY2NvbnRyb2xzLmNvbSkKKyAqICBmb3Igc3BvbnNvcmluZyB0aGUgZnVydGhlciBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIG9yaWdpbmFsIGNvcHlyaWdodCBvZiBza2VsZXRvbi5jIHdhcyBhcyBmb2xsb3dzOgorICoKKyAqIHNrZWxldG9uLmMgV3JpdHRlbiAxOTkzIGJ5IERvbmFsZCBCZWNrZXIuCisgKiBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiAgVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkCisgKiBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIG1vZGlmaWVkIGJ5IFNSQywgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSBkcml2ZXJzL25ldC9hcmNuZXQuYworICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYXJjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY29tMjAwMjAuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIFZFUlNJT04gImFyY25ldDogQ09NMjAwMjAgY2hpcHNldCBzdXBwb3J0IChieSBEYXZpZCBXb29kaG91c2UgZXQgYWwuKVxuIgorCitzdGF0aWMgY2hhciAqY2xvY2tyYXRlc1tdID0KK3siMTAgTWIvcyIsICJSZXNlcnZlZCIsICI1IE1iL3MiLAorICIyLjUgTWIvcyIsICIxLjI1TWIvcyIsICI2MjUgS2IvcyIsICIzMTIuNSBLYi9zIiwKKyAiMTU2LjI1IEtiL3MiLCAiUmVzZXJ2ZWQiLCAiUmVzZXJ2ZWQiLCAiUmVzZXJ2ZWQifTsKKworc3RhdGljIHZvaWQgY29tMjAwMjBfY29tbWFuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY29tbWFuZCk7CitzdGF0aWMgaW50IGNvbTIwMDIwX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNvbTIwMDIwX3NldG1hc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1hc2spOworc3RhdGljIGludCBjb20yMDAyMF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhbGx5X3Jlc2V0KTsKK3N0YXRpYyB2b2lkIGNvbTIwMDIwX2NvcHlfdG9fY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLAorCQkJCSAgaW50IG9mZnNldCwgdm9pZCAqYnVmLCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgY29tMjAwMjBfY29weV9mcm9tX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwKKwkJCQkgICAgaW50IG9mZnNldCwgdm9pZCAqYnVmLCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgY29tMjAwMjBfc2V0X21jX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBjb20yMDAyMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworc3RhdGljIHZvaWQgY29tMjAwMjBfY29weV9mcm9tX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwKKwkJCQkgICAgaW50IG9mZnNldCwgdm9pZCAqYnVmLCBpbnQgY291bnQpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyLCBvZnMgPSA1MTIgKiBidWZudW0gKyBvZmZzZXQ7CisKKwkvKiBzZXQgdXAgdGhlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwlvdXRiKChvZnMgPj4gOCkgfCBSRERBVEFmbGFnIHwgQVVUT0lOQ2ZsYWcsIF9BRERSX0hJKTsKKwlvdXRiKG9mcyAmIDB4ZmYsIF9BRERSX0xPKTsKKworCS8qIGNvcHkgdGhlIGRhdGEgKi8KKwlUSU1FKCJpbnNiIiwgY291bnQsIGluc2IoX01FTURBVEEsIGJ1ZiwgY291bnQpKTsKK30KKworCitzdGF0aWMgdm9pZCBjb20yMDAyMF9jb3B5X3RvX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwKKwkJCQkgIGludCBvZmZzZXQsIHZvaWQgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciwgb2ZzID0gNTEyICogYnVmbnVtICsgb2Zmc2V0OworCisJLyogc2V0IHVwIHRoZSBhZGRyZXNzIHJlZ2lzdGVyICovCisJb3V0Yigob2ZzID4+IDgpIHwgQVVUT0lOQ2ZsYWcsIF9BRERSX0hJKTsKKwlvdXRiKG9mcyAmIDB4ZmYsIF9BRERSX0xPKTsKKworCS8qIGNvcHkgdGhlIGRhdGEgKi8KKwlUSU1FKCJvdXRzYiIsIGNvdW50LCBvdXRzYihfTUVNREFUQSwgYnVmLCBjb3VudCkpOworfQorCisKKy8qIFJlc2V0IHRoZSBjYXJkIGFuZCBjaGVjayBzb21lIGJhc2ljIHN0dWZmIGR1cmluZyB0aGUgZGV0ZWN0aW9uIHN0YWdlLiAqLworaW50IGNvbTIwMDIwX2NoZWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyLCBzdGF0dXM7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisKKwlBUkNSRVNFVDA7CisJbWRlbGF5KFJFU0VUdGltZSk7CisKKwlscC0+c2V0dXAgPSBscC0+Y2xvY2ttID8gMCA6IChscC0+Y2xvY2twIDw8IDEpOworCWxwLT5zZXR1cDIgPSAobHAtPmNsb2NrbSA8PCA0KSB8IDg7CisKKwkvKiBDSEVDSzogc2hvdWxkIHdlIGRvIHRoaXMgZm9yIFNPSEFSRCBjYXJkcyA/ICovCisJLyogRW5hYmxlIFAxTW9kZSBmb3IgYmFja3BsYW5lIG1vZGUgKi8KKwlscC0+c2V0dXAgPSBscC0+c2V0dXAgfCBQMU1PREU7CisKKwlTRVRfU1VCQURSKFNVQl9TRVRVUDEpOworCW91dGIobHAtPnNldHVwLCBfWFJFRyk7CisKKwlpZiAobHAtPmNhcmRfZmxhZ3MgJiBBUkNfQ0FOXzEwTUJJVCkKKwl7CisJCVNFVF9TVUJBRFIoU1VCX1NFVFVQMik7CisJCW91dGIobHAtPnNldHVwMiwgX1hSRUcpOworCQorCQkvKiBtdXN0IG5vdyB3cml0ZSB0aGUgbWFnaWMgInJlc3RhcnQgb3BlcmF0aW9uIiBjb21tYW5kICovCisJCW1kZWxheSgxKTsKKwkJb3V0YigweDE4LCBfQ09NTUFORCk7CisJfQorCisJbHAtPmNvbmZpZyA9IDB4MjEgfCAobHAtPnRpbWVvdXQgPDwgMykgfCAobHAtPmJhY2twbGFuZSA8PCAyKTsKKwkvKiBzZXQgbm9kZSBJRCB0byAweDQyIChidXQgdHJhbnNtaXR0ZXIgaXMgZGlzYWJsZWQsIHNvIGl0J3Mgb2theSkgKi8KKwlTRVRDT05GOworCW91dGIoMHg0MiwgaW9hZGRyICsgQlVTX0FMSUdOKjcpOworCisJc3RhdHVzID0gQVNUQVRVUygpOworCisJaWYgKChzdGF0dXMgJiAweDk5KSAhPSAoTk9SWGZsYWcgfCBUWEZSRUVmbGFnIHwgUkVTRVRmbGFnKSkgeworCQlCVUdNU0coRF9OT1JNQUwsICJzdGF0dXMgaW52YWxpZCAoJVhoKS5cbiIsIHN0YXR1cyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlCVUdNU0coRF9JTklUX1JFQVNPTlMsICJzdGF0dXMgYWZ0ZXIgcmVzZXQ6ICVYXG4iLCBzdGF0dXMpOworCisJLyogRW5hYmxlIFRYICovCisJb3V0YigweDM5LCBfQ09ORklHKTsKKwlvdXRiKGluYihpb2FkZHIgKyBCVVNfQUxJR04qOCksIGlvYWRkciArIEJVU19BTElHTio3KTsKKworCUFDT01NQU5EKENGTEFHU2NtZCB8IFJFU0VUY2xlYXIgfCBDT05GSUdjbGVhcik7CisKKwlzdGF0dXMgPSBBU1RBVFVTKCk7CisJQlVHTVNHKERfSU5JVF9SRUFTT05TLCAic3RhdHVzIGFmdGVyIHJlc2V0IGFja25vd2xlZGdlZDogJVhcbiIsCisJICAgICAgIHN0YXR1cyk7CisKKwkvKiBSZWFkIGZpcnN0IGxvY2F0aW9uIG9mIG1lbW9yeSAqLworCW91dGIoMCB8IFJEREFUQWZsYWcgfCBBVVRPSU5DZmxhZywgX0FERFJfSEkpOworCW91dGIoMCwgX0FERFJfTE8pOworCisJaWYgKChzdGF0dXMgPSBpbmIoX01FTURBVEEpKSAhPSBURVNUdmFsdWUpIHsKKwkJQlVHTVNHKERfTk9STUFMLCAiU2lnbmF0dXJlIGJ5dGUgbm90IGZvdW5kICglMDJYaCAhPSBEMWgpLlxuIiwKKwkJICAgICAgIHN0YXR1cyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogU2V0IHVwIHRoZSBzdHJ1Y3QgbmV0X2RldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYXJkLiAgQ2FsbGVkIGFmdGVyCisgKiBwcm9iaW5nIHN1Y2NlZWRzLgorICovCitpbnQgY29tMjAwMjBfZm91bmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNoYXJlZCkKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscDsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBJbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCisJbHAgPSBkZXYtPnByaXY7CisKKwlscC0+aHcub3duZXIgPSBUSElTX01PRFVMRTsKKwlscC0+aHcuY29tbWFuZCA9IGNvbTIwMDIwX2NvbW1hbmQ7CisJbHAtPmh3LnN0YXR1cyA9IGNvbTIwMDIwX3N0YXR1czsKKwlscC0+aHcuaW50bWFzayA9IGNvbTIwMDIwX3NldG1hc2s7CisJbHAtPmh3LnJlc2V0ID0gY29tMjAwMjBfcmVzZXQ7CisJbHAtPmh3LmNvcHlfdG9fY2FyZCA9IGNvbTIwMDIwX2NvcHlfdG9fY2FyZDsKKwlscC0+aHcuY29weV9mcm9tX2NhcmQgPSBjb20yMDAyMF9jb3B5X2Zyb21fY2FyZDsKKwlscC0+aHcuY2xvc2UgPSBjb20yMDAyMF9jbG9zZTsKKworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gY29tMjAwMjBfc2V0X21jX2xpc3Q7CisKKwlpZiAoIWRldi0+ZGV2X2FkZHJbMF0pCisJCWRldi0+ZGV2X2FkZHJbMF0gPSBpbmIoaW9hZGRyICsgQlVTX0FMSUdOKjgpOwkvKiBGSVhNRTogZG8gdGhpcyBzb21lIG90aGVyIHdheSEgKi8KKworCVNFVF9TVUJBRFIoU1VCX1NFVFVQMSk7CisJb3V0YihscC0+c2V0dXAsIF9YUkVHKTsKKworCWlmIChscC0+Y2FyZF9mbGFncyAmIEFSQ19DQU5fMTBNQklUKQorCXsKKwkJU0VUX1NVQkFEUihTVUJfU0VUVVAyKTsKKwkJb3V0YihscC0+c2V0dXAyLCBfWFJFRyk7CisJCisJCS8qIG11c3Qgbm93IHdyaXRlIHRoZSBtYWdpYyAicmVzdGFydCBvcGVyYXRpb24iIGNvbW1hbmQgKi8KKwkJbWRlbGF5KDEpOworCQlvdXRiKDB4MTgsIF9DT01NQU5EKTsKKwl9CisKKwlscC0+Y29uZmlnID0gMHgyMCB8IChscC0+dGltZW91dCA8PCAzKSB8IChscC0+YmFja3BsYW5lIDw8IDIpIHwgMTsKKwkvKiBEZWZhdWx0IDB4MzggKyByZWdpc3RlcjogTm9kZSBJRCAqLworCVNFVENPTkY7CisJb3V0YihkZXYtPmRldl9hZGRyWzBdLCBfWFJFRyk7CisKKwkvKiByZXNlcnZlIHRoZSBpcnEgKi8KKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZhcmNuZXRfaW50ZXJydXB0LCBzaGFyZWQsCisJCQkiYXJjbmV0IChDT00yMDAyMCkiLCBkZXYpKSB7CisJCUJVR01TRyhEX05PUk1BTCwgIkNhbid0IGdldCBJUlEgJWQhXG4iLCBkZXYtPmlycSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJQlVHTVNHKERfTk9STUFMLCAiJXM6IHN0YXRpb24gJTAyWGggZm91bmQgYXQgJTAzbFhoLCBJUlEgJWQuXG4iLAorCSAgICAgICBscC0+Y2FyZF9uYW1lLCBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCisJaWYgKGxwLT5iYWNrcGxhbmUpCisJCUJVR01TRyhEX05PUk1BTCwgIlVzaW5nIGJhY2twbGFuZSBtb2RlLlxuIik7CisKKwlpZiAobHAtPnRpbWVvdXQgIT0gMykKKwkJQlVHTVNHKERfTk9STUFMLCAiVXNpbmcgZXh0ZW5kZWQgdGltZW91dCB2YWx1ZSBvZiAlZC5cbiIsIGxwLT50aW1lb3V0KTsKKworCUJVR01TRyhEX05PUk1BTCwgIlVzaW5nIENLUCAlZCAtIGRhdGEgcmF0ZSAlcy5cbiIsCisJICAgICAgIGxwLT5zZXR1cCA+PiAxLCAKKwkgICAgICAgY2xvY2tyYXRlc1szIC0gKChscC0+c2V0dXAyICYgMHhGMCkgPj4gNCkgKyAoKGxwLT5zZXR1cCAmIDB4MEYpID4+IDEpXSk7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiAKKyAqIERvIGEgaGFyZHdhcmUgcmVzZXQgb24gdGhlIGNhcmQsIGFuZCBzZXQgdXAgbmVjZXNzYXJ5IHJlZ2lzdGVycy4KKyAqIAorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFzIGxpdHRsZSBhcyBwb3NzaWJsZSwgYmVjYXVzZSBpdCBkaXNydXB0cyB0aGUKKyAqIHRva2VuIG9uIHRoZSBuZXR3b3JrIChjYXVzZXMgYSBSRUNPTikgYW5kIHJlcXVpcmVzIGEgc2lnbmlmaWNhbnQgZGVsYXkuCisgKgorICogSG93ZXZlciwgaXQgZG9lcyBtYWtlIHN1cmUgdGhlIGNhcmQgaXMgaW4gYSBkZWZpbmVkIHN0YXRlLgorICovCitzdGF0aWMgaW50IGNvbTIwMDIwX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWFsbHlfcmVzZXQpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJdV9pbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdV9jaGFyIGluYnl0ZTsKKworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlczogZGV2OiAlcCwgbHA6ICVwLCBkZXYtPm5hbWU6ICVzXG4iLAorCQlfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18sZGV2LGxwLGRldi0+bmFtZSk7CisJQlVHTVNHKERfSU5JVCwgIlJlc2V0dGluZyAlcyAoc3RhdHVzPSUwMlhoKVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBBU1RBVFVTKCkpOworCisJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyk7CisJbHAtPmNvbmZpZyA9IFRYRU5jZmcgfCAobHAtPnRpbWVvdXQgPDwgMykgfCAobHAtPmJhY2twbGFuZSA8PCAyKTsKKwkvKiBwb3dlci11cCBkZWZhdWx0cyAqLworCVNFVENPTkY7CisJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyk7CisKKwlpZiAocmVhbGx5X3Jlc2V0KSB7CisJCS8qIHJlc2V0IHRoZSBjYXJkICovCisJCUFSQ1JFU0VUOworCQltZGVsYXkoUkVTRVR0aW1lICogMik7CS8qIENPTTIwMDIwIHNlZW1zIHRvIGJlIHNsb3dlciBzb21ldGltZXMgKi8KKwl9CisJLyogY2xlYXIgZmxhZ3MgJiBlbmQgcmVzZXQgKi8KKwlCVUdNU0coRF9ERUJVRywgIiVzOiAlZDogJXNcbiIsX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fKTsKKwlBQ09NTUFORChDRkxBR1NjbWQgfCBSRVNFVGNsZWFyIHwgQ09ORklHY2xlYXIpOworCisJLyogdmVyaWZ5IHRoYXQgdGhlIEFSQ25ldCBzaWduYXR1cmUgYnl0ZSBpcyBwcmVzZW50ICovCisJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyk7CisKKwljb20yMDAyMF9jb3B5X2Zyb21fY2FyZChkZXYsIDAsIDAsICZpbmJ5dGUsIDEpOworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCWlmIChpbmJ5dGUgIT0gVEVTVHZhbHVlKSB7CisJCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCQlCVUdNU0coRF9OT1JNQUwsICJyZXNldCBmYWlsZWQ6IFRFU1R2YWx1ZSBub3QgcHJlc2VudC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJLyogZW5hYmxlIGV4dGVuZGVkICg1MTItYnl0ZSkgcGFja2V0cyAqLworCUFDT01NQU5EKENPTkZJR2NtZCB8IEVYVGNvbmYpOworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCisJLyogZG9uZSEgIHJldHVybiBzdWNjZXNzLiAqLworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGNvbTIwMDIwX3NldG1hc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1hc2spCit7CisJdV9pbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJQlVHTVNHKERfRFVSSU5HLCAiU2V0dGluZyBtYXNrIHRvICV4IGF0ICV4XG4iLG1hc2ssaW9hZGRyKTsKKwlBSU5UTUFTSyhtYXNrKTsKK30KKworCitzdGF0aWMgdm9pZCBjb20yMDAyMF9jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjbWQpCit7CisJdV9pbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJQUNPTU1BTkQoY21kKTsKK30KKworCitzdGF0aWMgaW50IGNvbTIwMDIwX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVfaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJcmV0dXJuIEFTVEFUVVMoKSArIChBRElBR1NUQVRVUygpPDw4KTsKK30KKworc3RhdGljIHZvaWQgY29tMjAwMjBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBkaXNhYmxlIHRyYW5zbWl0dGVyICovCisJbHAtPmNvbmZpZyAmPSB+VFhFTmNmZzsKKwlTRVRDT05GOworfQorCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIG51bV9hZGRycyA9PSAtMSAgICBQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgKiBudW1fYWRkcnMgPT0gMCAgICAgICBOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAqIG51bV9hZGRycyA+IDAgICAgICAgIE11bHRpY2FzdCBtb2RlLCByZWNlaXZlIG5vcm1hbCBhbmQgTUMgcGFja2V0cywgYW5kIGRvCisgKiAgICAgICAgICAgICAgICAgICAgICBiZXN0LWVmZm9ydCBmaWx0ZXJpbmcuCisgKiAgICAgIEZJWE1FIC0gZG8gbXVsdGljYXN0IHN0dWZmLCBub3QganVzdCBwcm9taXNjdW91cy4KKyAqLworc3RhdGljIHZvaWQgY29tMjAwMjBfc2V0X21jX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgJiYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApKSB7CS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCWlmICghKGxwLT5zZXR1cCAmIFBST01JU0NzZXQpKQorCQkJQlVHTVNHKERfTk9STUFMLCAiU2V0dGluZyBwcm9taXNjdW91cyBmbGFnLi4uXG4iKTsKKwkJU0VUX1NVQkFEUihTVUJfU0VUVVAxKTsKKwkJbHAtPnNldHVwIHw9IFBST01JU0NzZXQ7CisJCW91dGIobHAtPnNldHVwLCBfWFJFRyk7CisJfSBlbHNlCisJCS8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSwgdXNlIG5vcm1hbCBtb2RlICovCisJeworCQlpZiAoKGxwLT5zZXR1cCAmIFBST01JU0NzZXQpKQorCQkJQlVHTVNHKERfTk9STUFMLCAiUmVzZXR0aW5nIHByb21pc2N1b3VzIGZsYWcuLi5cbiIpOworCQlTRVRfU1VCQURSKFNVQl9TRVRVUDEpOworCQlscC0+c2V0dXAgJj0gflBST01JU0NzZXQ7CisJCW91dGIobHAtPnNldHVwLCBfWFJFRyk7CisJfQorfQorCisjaWZkZWYgTU9EVUxFCisKK0VYUE9SVF9TWU1CT0woY29tMjAwMjBfY2hlY2spOworRVhQT1JUX1NZTUJPTChjb20yMDAyMF9mb3VuZCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJQlVHTFZMKERfTk9STUFMKSBwcmludGsoVkVSU0lPTik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKK30KKworI2VuZGlmCQkJCS8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTkwaW8uYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb205MGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjNzdjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb205MGlvLmMKQEAgLTAsMCArMSw0MzUgQEAKKy8qCisgKiBMaW51eCBBUkNuZXQgZHJpdmVyIC0gQ09NOTB4eCBjaGlwc2V0IChJTy1tYXBwZWQgYnVmZmVycykKKyAqIAorICogV3JpdHRlbiAxOTk3IGJ5IERhdmlkIFdvb2Rob3VzZS4KKyAqIFdyaXR0ZW4gMTk5NC0xOTk5IGJ5IEF2ZXJ5IFBlbm5hcnVuLgorICogV3JpdHRlbiAxOTk5LTIwMDAgYnkgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+LgorICogRGVyaXZlZCBmcm9tIHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiBTcGVjaWFsIHRoYW5rcyB0byBDb250ZW1wb3JhcnkgQ29udHJvbHMsIEluYy4gKHd3dy5jY29udHJvbHMuY29tKQorICogIGZvciBzcG9uc29yaW5nIHRoZSBmdXJ0aGVyIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgb3JpZ2luYWwgY29weXJpZ2h0IG9mIHNrZWxldG9uLmMgd2FzIGFzIGZvbGxvd3M6CisgKgorICogc2tlbGV0b24uYyBXcml0dGVuIDE5OTMgYnkgRG9uYWxkIEJlY2tlci4KKyAqIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBvbmx5IGJlIHVzZWQKKyAqIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogbW9kaWZpZWQgYnkgU1JDLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRm9yIG1vcmUgZGV0YWlscywgc2VlIGRyaXZlcnMvbmV0L2FyY25ldC5jCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2FyY2RldmljZS5oPgorCisKKyNkZWZpbmUgVkVSU0lPTiAiYXJjbmV0OiBDT005MHh4IElPLW1hcHBlZCBtb2RlIHN1cHBvcnQgKGJ5IERhdmlkIFdvb2Rob3VzZSBldCBlbC4pXG4iCisKKworLyogSW50ZXJuYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCisKK3N0YXRpYyBpbnQgY29tOTBpb19mb3VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNvbTkwaW9fY29tbWFuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY29tbWFuZCk7CitzdGF0aWMgaW50IGNvbTkwaW9fc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgY29tOTBpb19zZXRtYXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtYXNrKTsKK3N0YXRpYyBpbnQgY29tOTBpb19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhbGx5X3Jlc2V0KTsKK3N0YXRpYyB2b2lkIGNvbTkwaW9fY29weV90b19jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sIGludCBvZmZzZXQsCisJCQkJIHZvaWQgKmJ1ZiwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIGNvbTkwaW9fY29weV9mcm9tX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwgaW50IG9mZnNldCwKKwkJCQkgICB2b2lkICpidWYsIGludCBjb3VudCk7CisKKworLyogSGFuZHkgZGVmaW5lcyBmb3IgQVJDbmV0IHNwZWNpZmljIHN0dWZmICovCisKKy8qIFRoZSBudW1iZXIgb2YgbG93IEkvTyBwb3J0cyB1c2VkIGJ5IHRoZSBjYXJkLiAqLworI2RlZmluZSBBUkNORVRfVE9UQUxfU0laRSAxNgorCisvKiBDT00gOTAyNiBjb250cm9sbGVyIGNoaXAgLS0+IEFSQ25ldCByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgX0lOVE1BU0sgKGlvYWRkciswKQkvKiB3cml0YWJsZSAqLworI2RlZmluZSBfU1RBVFVTICAoaW9hZGRyKzApCS8qIHJlYWRhYmxlICovCisjZGVmaW5lIF9DT01NQU5EIChpb2FkZHIrMSkJLyogd3JpdGFibGUsIHJldHVybnMgcmFuZG9tIHZhbHMgb24gcmVhZCAoPykgKi8KKyNkZWZpbmUgX1JFU0VUICAoaW9hZGRyKzgpCS8qIHNvZnR3YXJlIHJlc2V0IChvbiByZWFkKSAqLworI2RlZmluZSBfTUVNREFUQSAgKGlvYWRkcisxMikJLyogRGF0YSBwb3J0IGZvciBJTy1tYXBwZWQgbWVtb3J5ICovCisjZGVmaW5lIF9BRERSX0hJICAoaW9hZGRyKzE1KQkvKiBDb250cm9sIHJlZ2lzdGVycyBmb3Igc2FpZCAqLworI2RlZmluZSBfQUREUl9MTyAgKGlvYWRkcisxNCkKKyNkZWZpbmUgX0NPTkZJRyAgKGlvYWRkcisyKQkvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisKKyN1bmRlZiBBU1RBVFVTCisjdW5kZWYgQUNPTU1BTkQKKyN1bmRlZiBBSU5UTUFTSworCisjZGVmaW5lIEFTVEFUVVMoKQlpbmIoX1NUQVRVUykKKyNkZWZpbmUgQUNPTU1BTkQoY21kKSBvdXRiKChjbWQpLF9DT01NQU5EKQorI2RlZmluZSBBSU5UTUFTSyhtc2spCW91dGIoKG1zayksX0lOVE1BU0spCisjZGVmaW5lIFNFVENPTkYoKSAJb3V0YigobHAtPmNvbmZpZyksX0NPTkZJRykKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIElPLW1hcHBlZCBvcGVyYXRpb24gcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyN1bmRlZiBPTkVfQVRfQV9USU1FX1RYCisjdW5kZWYgT05FX0FUX0FfVElNRV9SWAorCitzdGF0aWMgdV9jaGFyIGdldF9idWZmZXJfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBvZmZzZXQpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJb3V0YihvZmZzZXQgPj4gOCwgX0FERFJfSEkpOworCW91dGIob2Zmc2V0ICYgMHhmZiwgX0FERFJfTE8pOworCisJcmV0dXJuIGluYihfTUVNREFUQSk7Cit9CisKKyNpZmRlZiBPTkVfQVRfQV9USU1FX1RYCitzdGF0aWMgdm9pZCBwdXRfYnVmZmVyX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgb2Zmc2V0LCB1X2NoYXIgZGF0dW0pCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJb3V0YihvZmZzZXQgPj4gOCwgX0FERFJfSEkpOworCW91dGIob2Zmc2V0ICYgMHhmZiwgX0FERFJfTE8pOworCisJb3V0YihkYXR1bSwgX01FTURBVEEpOworfQorCisjZW5kaWYKKworCitzdGF0aWMgdm9pZCBnZXRfd2hvbGVfYnVmZmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3RoLCBjaGFyICpkZXN0KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW91dGIoKG9mZnNldCA+PiA4KSB8IEFVVE9JTkNmbGFnLCBfQUREUl9ISSk7CisJb3V0YihvZmZzZXQgJiAweGZmLCBfQUREUl9MTyk7CisKKwl3aGlsZSAobGVuZ3RoLS0pCisjaWZkZWYgT05FX0FUX0FfVElNRV9SWAorCQkqKGRlc3QrKykgPSBnZXRfYnVmZmVyX2J5dGUoZGV2LCBvZmZzZXQrKyk7CisjZWxzZQorCQkqKGRlc3QrKykgPSBpbmIoX01FTURBVEEpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHB1dF93aG9sZV9idWZmZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgsIGNoYXIgKmRlc3QpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJb3V0Yigob2Zmc2V0ID4+IDgpIHwgQVVUT0lOQ2ZsYWcsIF9BRERSX0hJKTsKKwlvdXRiKG9mZnNldCAmIDB4ZmYsIF9BRERSX0xPKTsKKworCXdoaWxlIChsZW5ndGgtLSkKKyNpZmRlZiBPTkVfQVRfQV9USU1FX1RYCisJCXB1dF9idWZmZXJfYnl0ZShkZXYsIG9mZnNldCsrLCAqKGRlc3QrKykpOworI2Vsc2UKKwkJb3V0YigqKGRlc3QrKyksIF9NRU1EQVRBKTsKKyNlbmRpZgorfQorCisvKgorICogV2UgY2Fubm90IHByb2JlIGZvciBhbiBJTyBtYXBwZWQgY2FyZCBlaXRoZXIsIGFsdGhvdWdoIHdlIGNhbiBjaGVjayB0aGF0CisgKiBpdCdzIHdoZXJlIHdlIHdlcmUgdG9sZCBpdCB3YXMsIGFuZCBldmVuIGF1dG9pcnEKKyAqLworc3RhdGljIGludCBfX2luaXQgY29tOTBpb19wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciwgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgYWlycW1hc2s7CisKKwlCVUdMVkwoRF9OT1JNQUwpIHByaW50ayhWRVJTSU9OKTsKKwlCVUdMVkwoRF9OT1JNQUwpIHByaW50aygiRS1tYWlsIG1lIGlmIHlvdSBhY3R1YWxseSB0ZXN0IHRoaXMgZHJpdmVyLCBwbGVhc2UhXG4iKTsKKworCWlmICghaW9hZGRyKSB7CisJCUJVR01TRyhEX05PUk1BTCwgIk5vIGF1dG9wcm9iZSBmb3IgSU8gbWFwcGVkIGNhcmRzOyB5b3UgIgorCQkgICAgICAgIm11c3Qgc3BlY2lmeSB0aGUgYmFzZSBhZGRyZXNzIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgQVJDTkVUX1RPVEFMX1NJWkUsICJjb205MGlvIHByb2JlIikpIHsKKwkJQlVHTVNHKERfSU5JVF9SRUFTT05TLCAiSU8gY2hlY2tfcmVnaW9uICV4LSV4IGZhaWxlZC5cbiIsCisJCSAgICAgICBpb2FkZHIsIGlvYWRkciArIEFSQ05FVF9UT1RBTF9TSVpFIC0gMSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCWlmIChBU1RBVFVTKCkgPT0gMHhGRikgeworCQlCVUdNU0coRF9JTklUX1JFQVNPTlMsICJJTyBhZGRyZXNzICV4IGVtcHR5XG4iLCBpb2FkZHIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWluYihfUkVTRVQpOworCW1kZWxheShSRVNFVHRpbWUpOworCisJc3RhdHVzID0gQVNUQVRVUygpOworCisJaWYgKChzdGF0dXMgJiAweDlEKSAhPSAoTk9SWGZsYWcgfCBSRUNPTmZsYWcgfCBUWEZSRUVmbGFnIHwgUkVTRVRmbGFnKSkgeworCQlCVUdNU0coRF9JTklUX1JFQVNPTlMsICJTdGF0dXMgaW52YWxpZCAoJVhoKS5cbiIsIHN0YXR1cyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJQlVHTVNHKERfSU5JVF9SRUFTT05TLCAiU3RhdHVzIGFmdGVyIHJlc2V0OiAlWFxuIiwgc3RhdHVzKTsKKworCUFDT01NQU5EKENGTEFHU2NtZCB8IFJFU0VUY2xlYXIgfCBDT05GSUdjbGVhcik7CisKKwlCVUdNU0coRF9JTklUX1JFQVNPTlMsICJTdGF0dXMgYWZ0ZXIgcmVzZXQgYWNrbm93bGVkZ2VkOiAlWFxuIiwgc3RhdHVzKTsKKworCXN0YXR1cyA9IEFTVEFUVVMoKTsKKworCWlmIChzdGF0dXMgJiBSRVNFVGZsYWcpIHsKKwkJQlVHTVNHKERfSU5JVF9SRUFTT05TLCAiRXRlcm5hbCByZXNldCAoc3RhdHVzPSVYaClcbiIsIHN0YXR1cyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJb3V0YigoMHgxNiB8IElPTUFQZmxhZykgJiB+RU5BQkxFMTZmbGFnLCBfQ09ORklHKTsKKworCS8qIFJlYWQgZmlyc3QgbG9jJ24gb2YgbWVtb3J5ICovCisKKwlvdXRiKEFVVE9JTkNmbGFnLCBfQUREUl9ISSk7CisJb3V0YigwLCBfQUREUl9MTyk7CisKKwlpZiAoKHN0YXR1cyA9IGluYihfTUVNREFUQSkpICE9IDB4ZDEpIHsKKwkJQlVHTVNHKERfSU5JVF9SRUFTT05TLCAiU2lnbmF0dXJlIGJ5dGUgbm90IGZvdW5kIgorCQkgICAgICAgIiAoJVhoIGluc3RlYWQpLlxuIiwgc3RhdHVzKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAoIWRldi0+aXJxKSB7CisJCS8qCisJCSAqIGlmIHdlIGRvIHRoaXMsIHdlJ3JlIHN1cmUgdG8gZ2V0IGFuIElSUSBzaW5jZSB0aGUKKwkJICogY2FyZCBoYXMganVzdCByZXNldCBhbmQgdGhlIE5PUlhmbGFnIGlzIG9uIHVudGlsCisJCSAqIHdlIHRlbGwgaXQgdG8gc3RhcnQgcmVjZWl2aW5nLgorCQkgKi8KKworCQlhaXJxbWFzayA9IHByb2JlX2lycV9vbigpOworCQlvdXRiKE5PUlhmbGFnLCBfSU5UTUFTSyk7CisJCXVkZWxheSgxKTsKKwkJb3V0YigwLCBfSU5UTUFTSyk7CisJCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZihhaXJxbWFzayk7CisKKwkJaWYgKGRldi0+aXJxIDw9IDApIHsKKwkJCUJVR01TRyhEX0lOSVRfUkVBU09OUywgIkF1dG9wcm9iZSBJUlEgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCX0KKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEFSQ05FVF9UT1RBTF9TSVpFKTsgLyogZW5kIG9mIHByb2JpbmcgKi8KKwlyZXR1cm4gY29tOTBpb19mb3VuZChkZXYpOworCitlcnJfb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgQVJDTkVUX1RPVEFMX1NJWkUpOworCXJldHVybiAtRU5PREVWOworfQorCisKKy8qIFNldCB1cCB0aGUgc3RydWN0IG5ldF9kZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FyZC4gIENhbGxlZCBhZnRlcgorICogcHJvYmluZyBzdWNjZWVkcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgY29tOTBpb19mb3VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgZXJyOworCisJLyogUmVzZXJ2ZSB0aGUgaXJxICovCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmYXJjbmV0X2ludGVycnVwdCwgMCwgImFyY25ldCAoQ09NOTB4eC1JTykiLCBkZXYpKSB7CisJCUJVR01TRyhEX05PUk1BTCwgIkNhbid0IGdldCBJUlEgJWQhXG4iLCBkZXYtPmlycSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiBSZXNlcnZlIHRoZSBJL08gcmVnaW9uIC0gZ3VhcmFudGVlZCB0byB3b3JrIGJ5IGNoZWNrX3JlZ2lvbiAqLworCWlmICghcmVxdWVzdF9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEFSQ05FVF9UT1RBTF9TSVpFLCAiYXJjbmV0IChDT005MHh4LUlPKSIpKSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWxwID0gZGV2LT5wcml2OworCWxwLT5jYXJkX25hbWUgPSAiQ09NOTB4eCBJL08iOworCWxwLT5ody5jb21tYW5kID0gY29tOTBpb19jb21tYW5kOworCWxwLT5ody5zdGF0dXMgPSBjb205MGlvX3N0YXR1czsKKwlscC0+aHcuaW50bWFzayA9IGNvbTkwaW9fc2V0bWFzazsKKwlscC0+aHcucmVzZXQgPSBjb205MGlvX3Jlc2V0OworCWxwLT5ody5vd25lciA9IFRISVNfTU9EVUxFOworCWxwLT5ody5jb3B5X3RvX2NhcmQgPSBjb205MGlvX2NvcHlfdG9fY2FyZDsKKwlscC0+aHcuY29weV9mcm9tX2NhcmQgPSBjb205MGlvX2NvcHlfZnJvbV9jYXJkOworCisJbHAtPmNvbmZpZyA9ICgweDE2IHwgSU9NQVBmbGFnKSAmIH5FTkFCTEUxNmZsYWc7CisJU0VUQ09ORigpOworCisJLyogZ2V0IGFuZCBjaGVjayB0aGUgc3RhdGlvbiBJRCBmcm9tIG9mZnNldCAxIGluIHNobWVtICovCisKKwlkZXYtPmRldl9hZGRyWzBdID0gZ2V0X2J1ZmZlcl9ieXRlKGRldiwgMSk7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCW91dGIoKGluYihfQ09ORklHKSAmIH5JT01BUGZsYWcpLCBfQ09ORklHKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBBUkNORVRfVE9UQUxfU0laRSk7CisJCXJldHVybiBlcnI7CisJfQorCisJQlVHTVNHKERfTk9STUFMLCAiQ09NOTBJTzogc3RhdGlvbiAlMDJYaCBmb3VuZCBhdCAlMDNsWGgsIElSUSAlZC5cbiIsCisJICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogRG8gYSBoYXJkd2FyZSByZXNldCBvbiB0aGUgY2FyZCwgYW5kIHNldCB1cCBuZWNlc3NhcnkgcmVnaXN0ZXJzLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhcyBsaXR0bGUgYXMgcG9zc2libGUsIGJlY2F1c2UgaXQgZGlzcnVwdHMgdGhlCisgKiB0b2tlbiBvbiB0aGUgbmV0d29yayAoY2F1c2VzIGEgUkVDT04pIGFuZCByZXF1aXJlcyBhIHNpZ25pZmljYW50IGRlbGF5LgorICoKKyAqIEhvd2V2ZXIsIGl0IGRvZXMgbWFrZSBzdXJlIHRoZSBjYXJkIGlzIGluIGEgZGVmaW5lZCBzdGF0ZS4KKyAqLworc3RhdGljIGludCBjb205MGlvX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWFsbHlfcmVzZXQpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlCVUdNU0coRF9JTklULCAiUmVzZXR0aW5nICVzIChzdGF0dXM9JTAyWGgpXG4iLCBkZXYtPm5hbWUsIEFTVEFUVVMoKSk7CisKKwlpZiAocmVhbGx5X3Jlc2V0KSB7CisJCS8qIHJlc2V0IHRoZSBjYXJkICovCisJCWluYihfUkVTRVQpOworCQltZGVsYXkoUkVTRVR0aW1lKTsKKwl9CisJLyogU2V0IHRoZSB0aGluZyB0byBJTy1tYXBwZWQsIDgtYml0ICBtb2RlICovCisJbHAtPmNvbmZpZyA9ICgweDFDIHwgSU9NQVBmbGFnKSAmIH5FTkFCTEUxNmZsYWc7CisJU0VUQ09ORigpOworCisJQUNPTU1BTkQoQ0ZMQUdTY21kIHwgUkVTRVRjbGVhcik7CS8qIGNsZWFyIGZsYWdzICYgZW5kIHJlc2V0ICovCisJQUNPTU1BTkQoQ0ZMQUdTY21kIHwgQ09ORklHY2xlYXIpOworCisJLyogdmVyaWZ5IHRoYXQgdGhlIEFSQ25ldCBzaWduYXR1cmUgYnl0ZSBpcyBwcmVzZW50ICovCisJaWYgKGdldF9idWZmZXJfYnl0ZShkZXYsIDApICE9IFRFU1R2YWx1ZSkgeworCQlCVUdNU0coRF9OT1JNQUwsICJyZXNldCBmYWlsZWQ6IFRFU1R2YWx1ZSBub3QgcHJlc2VudC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJLyogZW5hYmxlIGV4dGVuZGVkICg1MTItYnl0ZSkgcGFja2V0cyAqLworCUFDT01NQU5EKENPTkZJR2NtZCB8IEVYVGNvbmYpOworCisJLyogZG9uZSEgIHJldHVybiBzdWNjZXNzLiAqLworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGNvbTkwaW9fY29tbWFuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY21kKQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJQUNPTU1BTkQoY21kKTsKK30KKworCitzdGF0aWMgaW50IGNvbTkwaW9fc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlyZXR1cm4gQVNUQVRVUygpOworfQorCisKK3N0YXRpYyB2b2lkIGNvbTkwaW9fc2V0bWFzayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWFzaykKK3sKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCUFJTlRNQVNLKG1hc2spOworfQorCitzdGF0aWMgdm9pZCBjb205MGlvX2NvcHlfdG9fY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLCBpbnQgb2Zmc2V0LAorCQkJCSB2b2lkICpidWYsIGludCBjb3VudCkKK3sKKwlUSU1FKCJwdXRfd2hvbGVfYnVmZmVyIiwgY291bnQsIHB1dF93aG9sZV9idWZmZXIoZGV2LCBidWZudW0gKiA1MTIgKyBvZmZzZXQsIGNvdW50LCBidWYpKTsKK30KKworCitzdGF0aWMgdm9pZCBjb205MGlvX2NvcHlfZnJvbV9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sIGludCBvZmZzZXQsCisJCQkJICAgdm9pZCAqYnVmLCBpbnQgY291bnQpCit7CisJVElNRSgiZ2V0X3dob2xlX2J1ZmZlciIsIGNvdW50LCBnZXRfd2hvbGVfYnVmZmVyKGRldiwgYnVmbnVtICogNTEyICsgb2Zmc2V0LCBjb3VudCwgYnVmKSk7Cit9CisKK3N0YXRpYyBpbnQgaW87CQkJLyogdXNlIHRoZSBpbnNtb2QgaW89IGlycT0gc2htZW09IG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgaXJxOworc3RhdGljIGNoYXIgZGV2aWNlWzldOwkJLyogdXNlIGVnLiBkZXZpY2U9YXJjMSB0byBjaGFuZ2UgbmFtZSAqLworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX3N0cmluZyhkZXZpY2UsIGRldmljZSwgc2l6ZW9mKGRldmljZSksIDApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgY29tOTBpb19zZXR1cChjaGFyICpzKQoreworCWludCBpbnRzWzRdOworCXMgPSBnZXRfb3B0aW9ucyhzLCA0LCBpbnRzKTsKKwlpZiAoIWludHNbMF0pCisJCXJldHVybiAwOworCXN3aXRjaCAoaW50c1swXSkgeworCWRlZmF1bHQ6CQkvKiBFUlJPUiAqLworCQlwcmludGsoImNvbTkwaW86IFRvbyBtYW55IGFyZ3VtZW50cy5cbiIpOworCWNhc2UgMjoJCS8qIElSUSAqLworCQlpcnEgPSBpbnRzWzJdOworCWNhc2UgMToJCS8qIElPIGFkZHJlc3MgKi8KKwkJaW8gPSBpbnRzWzFdOworCX0KKwlpZiAoKnMpCisJCXNucHJpbnRmKGRldmljZSwgc2l6ZW9mKGRldmljZSksICIlcyIsIHMpOworCXJldHVybiAxOworfQorX19zZXR1cCgiY29tOTBpbz0iLCBjb205MGlvX3NldHVwKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKm15X2RldjsKKworc3RhdGljIGludCBfX2luaXQgY29tOTBpb19pbml0KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyOworCisJZGV2ID0gYWxsb2NfYXJjZGV2KGRldmljZSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJZGV2LT5iYXNlX2FkZHIgPSBpbzsKKwlkZXYtPmlycSA9IGlycTsKKwlpZiAoZGV2LT5pcnEgPT0gMikKKwkJZGV2LT5pcnEgPSA5OworCisJZXJyID0gY29tOTBpb19wcm9iZShkZXYpOworCisJaWYgKGVycikgeworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gZXJyOworCX0KKworCW15X2RldiA9IGRldjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNvbTkwaW9fZXhpdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBteV9kZXY7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCS8qIFNldCB0aGUgdGhpbmcgYmFjayB0byBNTUFQIG1vZGUsIGluIGNhc2UgdGhlIG9sZCBkcml2ZXIgaXMgbG9hZGVkIGxhdGVyICovCisJb3V0YigoaW5iKF9DT05GSUcpICYgfklPTUFQZmxhZyksIF9DT05GSUcpOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEFSQ05FVF9UT1RBTF9TSVpFKTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCittb2R1bGVfaW5pdChjb205MGlvX2luaXQpCittb2R1bGVfZXhpdChjb205MGlvX2V4aXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvY29tOTB4eC5jIGIvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTkweHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzJjOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTkweHguYwpAQCAtMCwwICsxLDY0NiBAQAorLyoKKyAqIExpbnV4IEFSQ25ldCBkcml2ZXIgLSBDT005MHh4IGNoaXBzZXQgKG1lbW9yeS1tYXBwZWQgYnVmZmVycykKKyAqIAorICogV3JpdHRlbiAxOTk0LTE5OTkgYnkgQXZlcnkgUGVubmFydW4uCisgKiBXcml0dGVuIDE5OTkgYnkgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+LgorICogRGVyaXZlZCBmcm9tIHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiBTcGVjaWFsIHRoYW5rcyB0byBDb250ZW1wb3JhcnkgQ29udHJvbHMsIEluYy4gKHd3dy5jY29udHJvbHMuY29tKQorICogIGZvciBzcG9uc29yaW5nIHRoZSBmdXJ0aGVyIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgb3JpZ2luYWwgY29weXJpZ2h0IG9mIHNrZWxldG9uLmMgd2FzIGFzIGZvbGxvd3M6CisgKgorICogc2tlbGV0b24uYyBXcml0dGVuIDE5OTMgYnkgRG9uYWxkIEJlY2tlci4KKyAqIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBvbmx5IGJlIHVzZWQKKyAqIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogbW9kaWZpZWQgYnkgU1JDLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRm9yIG1vcmUgZGV0YWlscywgc2VlIGRyaXZlcnMvbmV0L2FyY25ldC5jCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9hcmNkZXZpY2UuaD4KKworCisjZGVmaW5lIFZFUlNJT04gImFyY25ldDogQ09NOTB4eCBjaGlwc2V0IHN1cHBvcnRcbiIKKworCisvKiBEZWZpbmUgdGhpcyB0byBzcGVlZCB1cCB0aGUgYXV0b3Byb2JlIGJ5IGFzc3VtaW5nIGlmIG9ubHkgb25lIGlvIHBvcnQgYW5kCisgKiBzaG1lbSBhcmUgbGVmdCBpbiB0aGUgbGlzdCBhdCBTdGFnZSA1LCB0aGV5IG11c3QgY29ycmVzcG9uZCB0byBlYWNoCisgKiBvdGhlci4KKyAqCisgKiBUaGlzIGlzIHVuZGVmaW5lZCBieSBkZWZhdWx0IGJlY2F1c2UgaXQgbWlnaHQgbm90IGFsd2F5cyBiZSB0cnVlLCBhbmQgdGhlCisgKiBleHRyYSBjaGVjayBtYWtlcyB0aGUgYXV0b3Byb2JlIGV2ZW4gbW9yZSBjYXJlZnVsLiAgU3BlZWQgZGVtb25zIGNhbiB0dXJuCisgKiBpdCBvbiAtIEkgdGhpbmsgaXQgc2hvdWxkIGJlIGZpbmUgaWYgeW91IG9ubHkgaGF2ZSBvbmUgQVJDbmV0IGNhcmQKKyAqIGluc3RhbGxlZC4KKyAqCisgKiBJZiBubyBBUkNuZXQgY2FyZHMgYXJlIGluc3RhbGxlZCwgdGhpcyBkZWxheSBuZXZlciBoYXBwZW5zIGFueXdheSBhbmQgdGh1cworICogdGhlIG9wdGlvbiBoYXMgbm8gZWZmZWN0LgorICovCisjdW5kZWYgRkFTVF9QUk9CRQorCisKKy8qIEludGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIGludCBjb205MHh4X2ZvdW5kKGludCBpb2FkZHIsIGludCBhaXJxLCB1X2xvbmcgc2htZW0pOworc3RhdGljIHZvaWQgY29tOTB4eF9jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb21tYW5kKTsKK3N0YXRpYyBpbnQgY29tOTB4eF9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBjb205MHh4X3NldG1hc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1hc2spOworc3RhdGljIGludCBjb205MHh4X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWFsbHlfcmVzZXQpOworc3RhdGljIHZvaWQgY29tOTB4eF9jb3B5X3RvX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwgaW50IG9mZnNldCwKKwkJCQkgdm9pZCAqYnVmLCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgY29tOTB4eF9jb3B5X2Zyb21fY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLCBpbnQgb2Zmc2V0LAorCQkJCSAgIHZvaWQgKmJ1ZiwgaW50IGNvdW50KTsKKworLyogS25vd24gQVJDbmV0IGNhcmRzICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqY2FyZHNbMTZdOworc3RhdGljIGludCBudW1jYXJkczsKKworLyogSGFuZHkgZGVmaW5lcyBmb3IgQVJDbmV0IHNwZWNpZmljIHN0dWZmICovCisKKy8qIFRoZSBudW1iZXIgb2YgbG93IEkvTyBwb3J0cyB1c2VkIGJ5IHRoZSBjYXJkICovCisjZGVmaW5lIEFSQ05FVF9UT1RBTF9TSVpFCTE2CisKKy8qIEFtb3VudCBvZiBJL08gbWVtb3J5IHVzZWQgYnkgdGhlIGNhcmQgKi8KKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDUxMikKKyNkZWZpbmUgTUlSUk9SX1NJWkUgKEJVRkZFUl9TSVpFKjQpCisKKy8qIENPTSA5MDI2IGNvbnRyb2xsZXIgY2hpcCAtLT4gQVJDbmV0IHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworI2RlZmluZSBfSU5UTUFTSyAoaW9hZGRyKzApCS8qIHdyaXRhYmxlICovCisjZGVmaW5lIF9TVEFUVVMgIChpb2FkZHIrMCkJLyogcmVhZGFibGUgKi8KKyNkZWZpbmUgX0NPTU1BTkQgKGlvYWRkcisxKQkvKiB3cml0YWJsZSwgcmV0dXJucyByYW5kb20gdmFscyBvbiByZWFkICg/KSAqLworI2RlZmluZSBfQ09ORklHICAoaW9hZGRyKzIpCS8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgX1JFU0VUICAgKGlvYWRkcis4KQkvKiBzb2Z0d2FyZSByZXNldCAob24gcmVhZCkgKi8KKyNkZWZpbmUgX01FTURBVEEgKGlvYWRkcisxMikJLyogRGF0YSBwb3J0IGZvciBJTy1tYXBwZWQgbWVtb3J5ICovCisjZGVmaW5lIF9BRERSX0hJIChpb2FkZHIrMTUpCS8qIENvbnRyb2wgcmVnaXN0ZXJzIGZvciBzYWlkICovCisjZGVmaW5lIF9BRERSX0xPIChpb2FkZHIrMTQpCisKKyN1bmRlZiBBU1RBVFVTCisjdW5kZWYgQUNPTU1BTkQKKyN1bmRlZiBBSU5UTUFTSworCisjZGVmaW5lIEFTVEFUVVMoKQlpbmIoX1NUQVRVUykKKyNkZWZpbmUgQUNPTU1BTkQoY21kKSAJb3V0YigoY21kKSxfQ09NTUFORCkKKyNkZWZpbmUgQUlOVE1BU0sobXNrKQlvdXRiKChtc2spLF9JTlRNQVNLKQorCisKK3N0YXRpYyBpbnQgY29tOTB4eF9za2lwX3Byb2JlIF9faW5pdGRhdGEgPSAwOworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCitzdGF0aWMgaW50IGlvOwkJCS8qIHVzZSB0aGUgaW5zbW9kIGlvPSBpcnE9IHNobWVtPSBvcHRpb25zICovCitzdGF0aWMgaW50IGlycTsKK3N0YXRpYyBpbnQgc2htZW07CitzdGF0aWMgY2hhciBkZXZpY2VbOV07CQkvKiB1c2UgZWcuIGRldmljZT1hcmMxIHRvIGNoYW5nZSBuYW1lICovCisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc2htZW0sIGludCwgMCk7Cittb2R1bGVfcGFyYW1fc3RyaW5nKGRldmljZSwgZGV2aWNlLCBzaXplb2YoZGV2aWNlKSwgMCk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjb205MHh4X3Byb2JlKHZvaWQpCit7CisJaW50IGNvdW50LCBzdGF0dXMsIGlvYWRkciwgbnVtcHJpbnQsIGFpcnEsIG9wZW5wYXJlbiA9IDA7CisJdW5zaWduZWQgbG9uZyBhaXJxbWFzazsKKwlpbnQgcG9ydHNbKDB4M2YwIC0gMHgyMDApIC8gMTYgKyAxXSA9CisJezB9OworCXVfbG9uZyBzaG1lbXNbKDB4RkY4MDAgLSAweEEwMDAwKSAvIDIwNDggKyAxXSA9CisJezB9OworCWludCBudW1wb3J0cywgbnVtc2htZW1zLCAqcG9ydDsKKwl1X2xvbmcgKnA7CisKKwlpZiAoIWlvICYmICFpcnEgJiYgIXNobWVtICYmICEqZGV2aWNlICYmIGNvbTkweHhfc2tpcF9wcm9iZSkKKwkJcmV0dXJuOworCisJQlVHTFZMKERfTk9STUFMKSBwcmludGsoVkVSU0lPTik7CisKKwkvKiBzZXQgdXAgdGhlIGFycmF5cyB3aGVyZSB3ZSdsbCBzdG9yZSB0aGUgcG9zc2libGUgcHJvYmUgYWRkcmVzc2VzICovCisJbnVtcG9ydHMgPSBudW1zaG1lbXMgPSAwOworCWlmIChpbykKKwkJcG9ydHNbbnVtcG9ydHMrK10gPSBpbzsKKwllbHNlCisJCWZvciAoY291bnQgPSAweDIwMDsgY291bnQgPD0gMHgzZjA7IGNvdW50ICs9IDE2KQorCQkJcG9ydHNbbnVtcG9ydHMrK10gPSBjb3VudDsKKwlpZiAoc2htZW0pCisJCXNobWVtc1tudW1zaG1lbXMrK10gPSBzaG1lbTsKKwllbHNlCisJCWZvciAoY291bnQgPSAweEEwMDAwOyBjb3VudCA8PSAweEZGODAwOyBjb3VudCArPSAyMDQ4KQorCQkJc2htZW1zW251bXNobWVtcysrXSA9IGNvdW50OworCisJLyogU3RhZ2UgMTogYWJhbmRvbiBhbnkgcmVzZXJ2ZWQgcG9ydHMsIG9yIG9uZXMgd2l0aCBzdGF0dXM9PTB4RkYKKwkgKiAoZW1wdHkpLCBhbmQgcmVzZXQgYW55IG90aGVycyBieSByZWFkaW5nIHRoZSByZXNldCBwb3J0LgorCSAqLworCW51bXByaW50ID0gLTE7CisJZm9yIChwb3J0ID0gJnBvcnRzWzBdOyBwb3J0IC0gcG9ydHMgPCBudW1wb3J0czsgcG9ydCsrKSB7CisJCW51bXByaW50Kys7CisJCW51bXByaW50ICU9IDg7CisJCWlmICghbnVtcHJpbnQpIHsKKwkJCUJVR01TRzIoRF9JTklULCAiXG4iKTsKKwkJCUJVR01TRzIoRF9JTklULCAiUzE6ICIpOworCQl9CisJCUJVR01TRzIoRF9JTklULCAiJVhoICIsICpwb3J0KTsKKworCQlpb2FkZHIgPSAqcG9ydDsKKworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKCpwb3J0LCBBUkNORVRfVE9UQUxfU0laRSwgImFyY25ldCAoOTB4eCkiKSkgeworCQkJQlVHTVNHMihEX0lOSVRfUkVBU09OUywgIihyZXF1ZXN0X3JlZ2lvbilcbiIpOworCQkJQlVHTVNHMihEX0lOSVRfUkVBU09OUywgIlMxOiAiKTsKKwkJCUJVR0xWTChEX0lOSVRfUkVBU09OUykgbnVtcHJpbnQgPSAwOworCQkJKnBvcnQtLSA9IHBvcnRzWy0tbnVtcG9ydHNdOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKEFTVEFUVVMoKSA9PSAweEZGKSB7CisJCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiKGVtcHR5KVxuIik7CisJCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiUzE6ICIpOworCQkJQlVHTFZMKERfSU5JVF9SRUFTT05TKSBudW1wcmludCA9IDA7CisJCQlyZWxlYXNlX3JlZ2lvbigqcG9ydCwgQVJDTkVUX1RPVEFMX1NJWkUpOworCQkJKnBvcnQtLSA9IHBvcnRzWy0tbnVtcG9ydHNdOworCQkJY29udGludWU7CisJCX0KKwkJaW5iKF9SRVNFVCk7CS8qIGJlZ2luIHJlc2V0dGluZyBjYXJkICovCisKKwkJQlVHTVNHMihEX0lOSVRfUkVBU09OUywgIlxuIik7CisJCUJVR01TRzIoRF9JTklUX1JFQVNPTlMsICJTMTogIik7CisJCUJVR0xWTChEX0lOSVRfUkVBU09OUykgbnVtcHJpbnQgPSAwOworCX0KKwlCVUdNU0cyKERfSU5JVCwgIlxuIik7CisKKwlpZiAoIW51bXBvcnRzKSB7CisJCUJVR01TRzIoRF9OT1JNQUwsICJTMTogTm8gQVJDbmV0IGNhcmRzIGZvdW5kLlxuIik7CisJCXJldHVybjsKKwl9CisJLyogU3RhZ2UgMjogd2UgaGF2ZSBub3cgcmVzZXQgYW55IHBvc3NpYmxlIEFSQ25ldCBjYXJkcywgc28gd2UgY2FuJ3QKKwkgKiBkbyBhbnl0aGluZyB1bnRpbCB0aGV5IGZpbmlzaC4gIElmIERfSU5JVCwgcHJpbnQgdGhlIGxpc3Qgb2YKKwkgKiBjYXJkcyB0aGF0IGFyZSBsZWZ0LgorCSAqLworCW51bXByaW50ID0gLTE7CisJZm9yIChwb3J0ID0gJnBvcnRzWzBdOyBwb3J0IDwgcG9ydHMgKyBudW1wb3J0czsgcG9ydCsrKSB7CisJCW51bXByaW50Kys7CisJCW51bXByaW50ICU9IDg7CisJCWlmICghbnVtcHJpbnQpIHsKKwkJCUJVR01TRzIoRF9JTklULCAiXG4iKTsKKwkJCUJVR01TRzIoRF9JTklULCAiUzI6ICIpOworCQl9CisJCUJVR01TRzIoRF9JTklULCAiJVhoICIsICpwb3J0KTsKKwl9CisJQlVHTVNHMihEX0lOSVQsICJcbiIpOworCW1kZWxheShSRVNFVHRpbWUpOworCisJLyogU3RhZ2UgMzogYWJhbmRvbiBhbnkgc2htZW0gYWRkcmVzc2VzIHRoYXQgZG9uJ3QgaGF2ZSB0aGUgc2lnbmF0dXJlCisJICogMHhEMSBieXRlIGluIHRoZSByaWdodCBwbGFjZSwgb3IgYXJlIHJlYWQtb25seS4KKwkgKi8KKwludW1wcmludCA9IC0xOworCWZvciAocCA9ICZzaG1lbXNbMF07IHAgPCBzaG1lbXMgKyBudW1zaG1lbXM7IHArKykgeworCQl1X2xvbmcgcHRyID0gKnA7CisKKwkJbnVtcHJpbnQrKzsKKwkJbnVtcHJpbnQgJT0gODsKKwkJaWYgKCFudW1wcmludCkgeworCQkJQlVHTVNHMihEX0lOSVQsICJcbiIpOworCQkJQlVHTVNHMihEX0lOSVQsICJTMzogIik7CisJCX0KKwkJQlVHTVNHMihEX0lOSVQsICIlbFhoICIsICpwKTsKKworCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbigqcCwgQlVGRkVSX1NJWkUsICJhcmNuZXQgKDkweHgpIikpIHsKKwkJCUJVR01TRzIoRF9JTklUX1JFQVNPTlMsICIocmVxdWVzdF9tZW1fcmVnaW9uKVxuIik7CisJCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiU3RhZ2UgMzogIik7CisJCQlCVUdMVkwoRF9JTklUX1JFQVNPTlMpIG51bXByaW50ID0gMDsKKwkJCSpwLS0gPSBzaG1lbXNbLS1udW1zaG1lbXNdOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGlzYV9yZWFkYihwdHIpICE9IFRFU1R2YWx1ZSkgeworCQkJQlVHTVNHMihEX0lOSVRfUkVBU09OUywgIiglMDJYaCAhPSAlMDJYaClcbiIsCisJCQkJaXNhX3JlYWRiKHB0ciksIFRFU1R2YWx1ZSk7CisJCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiUzM6ICIpOworCQkJQlVHTFZMKERfSU5JVF9SRUFTT05TKSBudW1wcmludCA9IDA7CisJCQlyZWxlYXNlX21lbV9yZWdpb24oKnAsIEJVRkZFUl9TSVpFKTsKKwkJCSpwLS0gPSBzaG1lbXNbLS1udW1zaG1lbXNdOworCQkJY29udGludWU7CisJCX0KKwkJLyogQnkgd3JpdGluZyAweDQyIHRvIHRoZSBURVNUdmFsdWUgbG9jYXRpb24sIHdlIGFsc28gbWFrZQorCQkgKiBzdXJlIG5vICJtaXJyb3IiIHNobWVtIGFyZWFzIHNob3cgdXAgLSBpZiB0aGV5IG9jY3VyCisJCSAqIGluIGFub3RoZXIgcGFzcyB0aHJvdWdoIHRoaXMgbG9vcCwgdGhleSB3aWxsIGJlIGRpc2NhcmRlZAorCQkgKiBiZWNhdXNlICpjcHRyICE9IFRFU1R2YWx1ZS4KKwkJICovCisJCWlzYV93cml0ZWIoMHg0MiwgcHRyKTsKKwkJaWYgKGlzYV9yZWFkYihwdHIpICE9IDB4NDIpIHsKKwkJCUJVR01TRzIoRF9JTklUX1JFQVNPTlMsICIocmVhZCBvbmx5KVxuIik7CisJCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiUzM6ICIpOworCQkJcmVsZWFzZV9tZW1fcmVnaW9uKCpwLCBCVUZGRVJfU0laRSk7CisJCQkqcC0tID0gc2htZW1zWy0tbnVtc2htZW1zXTsKKwkJCWNvbnRpbnVlOworCQl9CisJCUJVR01TRzIoRF9JTklUX1JFQVNPTlMsICJcbiIpOworCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiUzM6ICIpOworCQlCVUdMVkwoRF9JTklUX1JFQVNPTlMpIG51bXByaW50ID0gMDsKKwl9CisJQlVHTVNHMihEX0lOSVQsICJcbiIpOworCisJaWYgKCFudW1zaG1lbXMpIHsKKwkJQlVHTVNHMihEX05PUk1BTCwgIlMzOiBObyBBUkNuZXQgY2FyZHMgZm91bmQuXG4iKTsKKwkJZm9yIChwb3J0ID0gJnBvcnRzWzBdOyBwb3J0IDwgcG9ydHMgKyBudW1wb3J0czsgcG9ydCsrKQorCQkJcmVsZWFzZV9yZWdpb24oKnBvcnQsIEFSQ05FVF9UT1RBTF9TSVpFKTsKKwkJcmV0dXJuOworCX0KKwkvKiBTdGFnZSA0OiBzb21ldGhpbmcgb2YgYSBkdW1teSwgdG8gcmVwb3J0IHRoZSBzaG1lbXMgdGhhdCBhcmUKKwkgKiBzdGlsbCBwb3NzaWJsZSBhZnRlciBzdGFnZSAzLgorCSAqLworCW51bXByaW50ID0gLTE7CisJZm9yIChwID0gJnNobWVtc1swXTsgcCA8IHNobWVtcyArIG51bXNobWVtczsgcCsrKSB7CisJCW51bXByaW50Kys7CisJCW51bXByaW50ICU9IDg7CisJCWlmICghbnVtcHJpbnQpIHsKKwkJCUJVR01TRzIoRF9JTklULCAiXG4iKTsKKwkJCUJVR01TRzIoRF9JTklULCAiUzQ6ICIpOworCQl9CisJCUJVR01TRzIoRF9JTklULCAiJWxYaCAiLCAqcCk7CisJfQorCUJVR01TRzIoRF9JTklULCAiXG4iKTsKKworCS8qIFN0YWdlIDU6IGZvciBhbnkgcG9ydHMgdGhhdCBoYXZlIHRoZSBjb3JyZWN0IHN0YXR1cywgY2FuIGRpc2FibGUKKwkgKiB0aGUgUkVTRVQgZmxhZywgYW5kIChpZiBubyBpcnEgaXMgZ2l2ZW4pIGdlbmVyYXRlIGFuIGF1dG9pcnEsCisJICogcmVnaXN0ZXIgYW4gQVJDbmV0IGRldmljZS4KKwkgKgorCSAqIEN1cnJlbnRseSwgd2UgY2FuIG9ubHkgcmVnaXN0ZXIgb25lIGRldmljZSBwZXIgcHJvYmUsIHNvIHF1aXQKKwkgKiBhZnRlciB0aGUgZmlyc3Qgb25lIGlzIGZvdW5kLgorCSAqLworCW51bXByaW50ID0gLTE7CisJZm9yIChwb3J0ID0gJnBvcnRzWzBdOyBwb3J0IDwgcG9ydHMgKyBudW1wb3J0czsgcG9ydCsrKSB7CisJCWludCBmb3VuZCA9IDA7CisJCW51bXByaW50Kys7CisJCW51bXByaW50ICU9IDg7CisJCWlmICghbnVtcHJpbnQpIHsKKwkJCUJVR01TRzIoRF9JTklULCAiXG4iKTsKKwkJCUJVR01TRzIoRF9JTklULCAiUzU6ICIpOworCQl9CisJCUJVR01TRzIoRF9JTklULCAiJVhoICIsICpwb3J0KTsKKworCQlpb2FkZHIgPSAqcG9ydDsKKwkJc3RhdHVzID0gQVNUQVRVUygpOworCisJCWlmICgoc3RhdHVzICYgMHg5RCkKKwkJICAgICE9IChOT1JYZmxhZyB8IFJFQ09OZmxhZyB8IFRYRlJFRWZsYWcgfCBSRVNFVGZsYWcpKSB7CisJCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiKHN0YXR1cz0lWGgpXG4iLCBzdGF0dXMpOworCQkJQlVHTVNHMihEX0lOSVRfUkVBU09OUywgIlM1OiAiKTsKKwkJCUJVR0xWTChEX0lOSVRfUkVBU09OUykgbnVtcHJpbnQgPSAwOworCQkJcmVsZWFzZV9yZWdpb24oKnBvcnQsIEFSQ05FVF9UT1RBTF9TSVpFKTsKKwkJCSpwb3J0LS0gPSBwb3J0c1stLW51bXBvcnRzXTsKKwkJCWNvbnRpbnVlOworCQl9CisJCUFDT01NQU5EKENGTEFHU2NtZCB8IFJFU0VUY2xlYXIgfCBDT05GSUdjbGVhcik7CisJCXN0YXR1cyA9IEFTVEFUVVMoKTsKKwkJaWYgKHN0YXR1cyAmIFJFU0VUZmxhZykgeworCQkJQlVHTVNHMihEX0lOSVRfUkVBU09OUywgIiAoZXRlcm5hbCByZXNldCwgc3RhdHVzPSVYaClcbiIsCisJCQkJc3RhdHVzKTsKKwkJCUJVR01TRzIoRF9JTklUX1JFQVNPTlMsICJTNTogIik7CisJCQlCVUdMVkwoRF9JTklUX1JFQVNPTlMpIG51bXByaW50ID0gMDsKKwkJCXJlbGVhc2VfcmVnaW9uKCpwb3J0LCBBUkNORVRfVE9UQUxfU0laRSk7CisJCQkqcG9ydC0tID0gcG9ydHNbLS1udW1wb3J0c107CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBza2lwIHRoaXMgY29tcGxldGVseSBpZiBhbiBJUlEgd2FzIGdpdmVuLCBiZWNhdXNlIG1heWJlCisJCSAqIHdlJ3JlIG9uIGEgbWFjaGluZSB0aGF0IGxvY2tzIGR1cmluZyBhdXRvaXJxIQorCQkgKi8KKwkJaWYgKCFpcnEpIHsKKwkJCS8qIGlmIHdlIGRvIHRoaXMsIHdlJ3JlIHN1cmUgdG8gZ2V0IGFuIElSUSBzaW5jZSB0aGUKKwkJCSAqIGNhcmQgaGFzIGp1c3QgcmVzZXQgYW5kIHRoZSBOT1JYZmxhZyBpcyBvbiB1bnRpbAorCQkJICogd2UgdGVsbCBpdCB0byBzdGFydCByZWNlaXZpbmcuCisJCQkgKi8KKwkJCWFpcnFtYXNrID0gcHJvYmVfaXJxX29uKCk7CisJCQlBSU5UTUFTSyhOT1JYZmxhZyk7CisJCQl1ZGVsYXkoMSk7CisJCQlBSU5UTUFTSygwKTsKKwkJCWFpcnEgPSBwcm9iZV9pcnFfb2ZmKGFpcnFtYXNrKTsKKworCQkJaWYgKGFpcnEgPD0gMCkgeworCQkJCUJVR01TRzIoRF9JTklUX1JFQVNPTlMsICIoYWlycT0lZClcbiIsIGFpcnEpOworCQkJCUJVR01TRzIoRF9JTklUX1JFQVNPTlMsICJTNTogIik7CisJCQkJQlVHTFZMKERfSU5JVF9SRUFTT05TKSBudW1wcmludCA9IDA7CisJCQkJcmVsZWFzZV9yZWdpb24oKnBvcnQsIEFSQ05FVF9UT1RBTF9TSVpFKTsKKwkJCQkqcG9ydC0tID0gcG9ydHNbLS1udW1wb3J0c107CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlhaXJxID0gaXJxOworCQl9CisKKwkJQlVHTVNHMihEX0lOSVQsICIoJWQsIiwgYWlycSk7CisJCW9wZW5wYXJlbiA9IDE7CisKKwkJLyogRXZlcnl0aGluZyBzZWVtcyBva2F5LiAgQnV0IHdoaWNoIHNobWVtLCBpZiBhbnksIHB1dHMKKwkJICogYmFjayBpdHMgc2lnbmF0dXJlIGJ5dGUgd2hlbiB0aGUgY2FyZCBpcyByZXNldD8KKwkJICoKKwkJICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNhcmRzIGluc3RhbGxlZCwgdGhlcmUgbWlnaHQgYmUKKwkJICogbXVsdGlwbGUgc2htZW1zIHN0aWxsIGluIHRoZSBsaXN0LgorCQkgKi8KKyNpZmRlZiBGQVNUX1BST0JFCisJCWlmIChudW1wb3J0cyA+IDEgfHwgbnVtc2htZW1zID4gMSkgeworCQkJaW5iKF9SRVNFVCk7CisJCQltZGVsYXkoUkVTRVR0aW1lKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGp1c3Qgb25lIHNobWVtIGFuZCBwb3J0LCBhc3N1bWUgdGhleSBtYXRjaCAqLworCQkJaXNhX3dyaXRlYihURVNUdmFsdWUsIHNobWVtc1swXSk7CisJCX0KKyNlbHNlCisJCWluYihfUkVTRVQpOworCQltZGVsYXkoUkVTRVR0aW1lKTsKKyNlbmRpZgorCisJCWZvciAocCA9ICZzaG1lbXNbMF07IHAgPCBzaG1lbXMgKyBudW1zaG1lbXM7IHArKykgeworCQkJdV9sb25nIHB0ciA9ICpwOworCisJCQlpZiAoaXNhX3JlYWRiKHB0cikgPT0gVEVTVHZhbHVlKSB7CS8qIGZvdW5kIG9uZSAqLworCQkJCUJVR01TRzIoRF9JTklULCAiJWxYaClcbiIsICpwKTsKKwkJCQlvcGVucGFyZW4gPSAwOworCisJCQkJLyogcmVnaXN0ZXIgdGhlIGNhcmQgKi8KKwkJCQlpZiAoY29tOTB4eF9mb3VuZCgqcG9ydCwgYWlycSwgKnApID09IDApCisJCQkJCWZvdW5kID0gMTsKKwkJCQludW1wcmludCA9IC0xOworCisJCQkJLyogcmVtb3ZlIHNobWVtIGZyb20gdGhlIGxpc3QgKi8KKwkJCQkqcCA9IHNobWVtc1stLW51bXNobWVtc107CisJCQkJYnJlYWs7CS8qIGdvIHRvIHRoZSBuZXh0IEkvTyBwb3J0ICovCisJCQl9IGVsc2UgeworCQkJCUJVR01TRzIoRF9JTklUX1JFQVNPTlMsICIlWGgtIiwgaXNhX3JlYWRiKHB0cikpOworCQkJfQorCQl9CisKKwkJaWYgKG9wZW5wYXJlbikgeworCQkJQlVHTFZMKERfSU5JVCkgcHJpbnRrKCJubyBtYXRjaGluZyBzaG1lbSlcbiIpOworCQkJQlVHTFZMKERfSU5JVF9SRUFTT05TKSBwcmludGsoIlM1OiAiKTsKKwkJCUJVR0xWTChEX0lOSVRfUkVBU09OUykgbnVtcHJpbnQgPSAwOworCQl9CisJCWlmICghZm91bmQpCisJCQlyZWxlYXNlX3JlZ2lvbigqcG9ydCwgQVJDTkVUX1RPVEFMX1NJWkUpOworCQkqcG9ydC0tID0gcG9ydHNbLS1udW1wb3J0c107CisJfQorCisJQlVHTFZMKERfSU5JVF9SRUFTT05TKSBwcmludGsoIlxuIik7CisKKwkvKiBOb3cgcHV0IGJhY2sgVEVTVHZhbHVlIG9uIGFsbCBsZWZ0b3ZlciBzaG1lbXMuICovCisJZm9yIChwID0gJnNobWVtc1swXTsgcCA8IHNobWVtcyArIG51bXNobWVtczsgcCsrKSB7CisJCWlzYV93cml0ZWIoVEVTVHZhbHVlLCAqcCk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbigqcCwgQlVGRkVSX1NJWkUpOworCX0KK30KKworCisvKiBTZXQgdXAgdGhlIHN0cnVjdCBuZXRfZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhcmQuICBDYWxsZWQgYWZ0ZXIKKyAqIHByb2Jpbmcgc3VjY2VlZHMuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNvbTkweHhfZm91bmQoaW50IGlvYWRkciwgaW50IGFpcnEsIHVfbG9uZyBzaG1lbSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscDsKKwl1X2xvbmcgZmlyc3RfbWlycm9yLCBsYXN0X21pcnJvcjsKKwlpbnQgbWlycm9yX3NpemU7CisKKwkvKiBhbGxvY2F0ZSBzdHJ1Y3QgbmV0X2RldmljZSAqLworCWRldiA9IGFsbG9jX2FyY2RldihkZXZpY2UpOworCWlmICghZGV2KSB7CisJCUJVR01TRzIoRF9OT1JNQUwsICJjb205MHh4OiBDYW4ndCBhbGxvY2F0ZSBkZXZpY2UhXG4iKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHNobWVtLCBCVUZGRVJfU0laRSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlscCA9IGRldi0+cHJpdjsKKwkvKiBmaW5kIHRoZSByZWFsIHNoYXJlZCBtZW1vcnkgc3RhcnQvZW5kIHBvaW50cywgaW5jbHVkaW5nIG1pcnJvcnMgKi8KKworCS8qIGd1ZXNzIHRoZSBhY3R1YWwgc2l6ZSBvZiBvbmUgIm1lbW9yeSBtaXJyb3IiIC0gdGhlIG51bWJlciBvZgorCSAqIGJ5dGVzIGJldHdlZW4gY29waWVzIG9mIHRoZSBzaGFyZWQgbWVtb3J5LiAgT24gbW9zdCBjYXJkcywgaXQncworCSAqIDJrIChvciB0aGVyZSBhcmUgbm8gbWlycm9ycyBhdCBhbGwpIGJ1dCBvbiBzb21lLCBpdCdzIDRrLgorCSAqLworCW1pcnJvcl9zaXplID0gTUlSUk9SX1NJWkU7CisJaWYgKGlzYV9yZWFkYihzaG1lbSkgPT0gVEVTVHZhbHVlCisJICAgICYmIGlzYV9yZWFkYihzaG1lbSAtIG1pcnJvcl9zaXplKSAhPSBURVNUdmFsdWUKKwkgICAgJiYgaXNhX3JlYWRiKHNobWVtIC0gMiAqIG1pcnJvcl9zaXplKSA9PSBURVNUdmFsdWUpCisJCW1pcnJvcl9zaXplICo9IDI7CisKKwlmaXJzdF9taXJyb3IgPSBsYXN0X21pcnJvciA9IHNobWVtOworCXdoaWxlIChpc2FfcmVhZGIoZmlyc3RfbWlycm9yKSA9PSBURVNUdmFsdWUpCisJCWZpcnN0X21pcnJvciAtPSBtaXJyb3Jfc2l6ZTsKKwlmaXJzdF9taXJyb3IgKz0gbWlycm9yX3NpemU7CisKKwl3aGlsZSAoaXNhX3JlYWRiKGxhc3RfbWlycm9yKSA9PSBURVNUdmFsdWUpCisJCWxhc3RfbWlycm9yICs9IG1pcnJvcl9zaXplOworCWxhc3RfbWlycm9yIC09IG1pcnJvcl9zaXplOworCisJZGV2LT5tZW1fc3RhcnQgPSBmaXJzdF9taXJyb3I7CisJZGV2LT5tZW1fZW5kID0gbGFzdF9taXJyb3IgKyBNSVJST1JfU0laRSAtIDE7CisKKwlyZWxlYXNlX21lbV9yZWdpb24oc2htZW0sIEJVRkZFUl9TSVpFKTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihkZXYtPm1lbV9zdGFydCwgZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQgKyAxLCAiYXJjbmV0ICg5MHh4KSIpKQorCQlnb3RvIGVycl9mcmVlX2RldjsKKworCS8qIHJlc2VydmUgdGhlIGlycSAqLworCWlmIChyZXF1ZXN0X2lycShhaXJxLCAmYXJjbmV0X2ludGVycnVwdCwgMCwgImFyY25ldCAoOTB4eCkiLCBkZXYpKSB7CisJCUJVR01TRyhEX05PUk1BTCwgIkNhbid0IGdldCBJUlEgJWQhXG4iLCBhaXJxKTsKKwkJZ290byBlcnJfcmVsZWFzZV9tZW07CisJfQorCWRldi0+aXJxID0gYWlycTsKKworCS8qIEluaXRpYWxpemUgdGhlIHJlc3Qgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJbHAtPmNhcmRfbmFtZSA9ICJDT005MHh4IjsKKwlscC0+aHcuY29tbWFuZCA9IGNvbTkweHhfY29tbWFuZDsKKwlscC0+aHcuc3RhdHVzID0gY29tOTB4eF9zdGF0dXM7CisJbHAtPmh3LmludG1hc2sgPSBjb205MHh4X3NldG1hc2s7CisJbHAtPmh3LnJlc2V0ID0gY29tOTB4eF9yZXNldDsKKwlscC0+aHcub3duZXIgPSBUSElTX01PRFVMRTsKKwlscC0+aHcuY29weV90b19jYXJkID0gY29tOTB4eF9jb3B5X3RvX2NhcmQ7CisJbHAtPmh3LmNvcHlfZnJvbV9jYXJkID0gY29tOTB4eF9jb3B5X2Zyb21fY2FyZDsKKwlscC0+bWVtX3N0YXJ0ID0gaW9yZW1hcChkZXYtPm1lbV9zdGFydCwgZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQgKyAxKTsKKwlpZiAoIWxwLT5tZW1fc3RhcnQpIHsKKwkJQlVHTVNHKERfTk9STUFMLCAiQ2FuJ3QgcmVtYXAgZGV2aWNlIG1lbW9yeSFcbiIpOworCQlnb3RvIGVycl9mcmVlX2lycTsKKwl9CisKKwkvKiBnZXQgYW5kIGNoZWNrIHRoZSBzdGF0aW9uIElEIGZyb20gb2Zmc2V0IDEgaW4gc2htZW0gKi8KKwlkZXYtPmRldl9hZGRyWzBdID0gcmVhZGIobHAtPm1lbV9zdGFydCArIDEpOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKwlCVUdNU0coRF9OT1JNQUwsICJDT005MHh4IHN0YXRpb24gJTAyWGggZm91bmQgYXQgJTAzbFhoLCBJUlEgJWQsICIKKwkgICAgICAgIlNoTWVtICVsWGggKCVsZColeGgpLlxuIiwKKwkgICAgICAgZGV2LT5kZXZfYWRkclswXSwKKwkgICAgICAgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLCBkZXYtPm1lbV9zdGFydCwKKwkgKGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0ICsgMSkgLyBtaXJyb3Jfc2l6ZSwgbWlycm9yX3NpemUpOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKQorCQlnb3RvIGVycl91bm1hcDsKKworCWNhcmRzW251bWNhcmRzKytdID0gZGV2OworCXJldHVybiAwOworCitlcnJfdW5tYXA6CisJaW91bm1hcChscC0+bWVtX3N0YXJ0KTsKK2Vycl9mcmVlX2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK2Vycl9yZWxlYXNlX21lbToKKwlyZWxlYXNlX21lbV9yZWdpb24oZGV2LT5tZW1fc3RhcnQsIGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0ICsgMSk7CitlcnJfZnJlZV9kZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gLUVJTzsKK30KKworCitzdGF0aWMgdm9pZCBjb205MHh4X2NvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNtZCkKK3sKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCUFDT01NQU5EKGNtZCk7Cit9CisKKworc3RhdGljIGludCBjb205MHh4X3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJcmV0dXJuIEFTVEFUVVMoKTsKK30KKworCitzdGF0aWMgdm9pZCBjb205MHh4X3NldG1hc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1hc2spCit7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlBSU5UTUFTSyhtYXNrKTsKK30KKworCisvKgorICogRG8gYSBoYXJkd2FyZSByZXNldCBvbiB0aGUgY2FyZCwgYW5kIHNldCB1cCBuZWNlc3NhcnkgcmVnaXN0ZXJzLgorICogCisgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYXMgbGl0dGxlIGFzIHBvc3NpYmxlLCBiZWNhdXNlIGl0IGRpc3J1cHRzIHRoZQorICogdG9rZW4gb24gdGhlIG5ldHdvcmsgKGNhdXNlcyBhIFJFQ09OKSBhbmQgcmVxdWlyZXMgYSBzaWduaWZpY2FudCBkZWxheS4KKyAqCisgKiBIb3dldmVyLCBpdCBkb2VzIG1ha2Ugc3VyZSB0aGUgY2FyZCBpcyBpbiBhIGRlZmluZWQgc3RhdGUuCisgKi8KK2ludCBjb205MHh4X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWFsbHlfcmVzZXQpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlCVUdNU0coRF9JTklULCAiUmVzZXR0aW5nIChzdGF0dXM9JTAyWGgpXG4iLCBBU1RBVFVTKCkpOworCisJaWYgKHJlYWxseV9yZXNldCkgeworCQkvKiByZXNldCB0aGUgY2FyZCAqLworCQlpbmIoX1JFU0VUKTsKKwkJbWRlbGF5KFJFU0VUdGltZSk7CisJfQorCUFDT01NQU5EKENGTEFHU2NtZCB8IFJFU0VUY2xlYXIpOwkvKiBjbGVhciBmbGFncyAmIGVuZCByZXNldCAqLworCUFDT01NQU5EKENGTEFHU2NtZCB8IENPTkZJR2NsZWFyKTsKKworCS8qIGRvbid0IGRvIHRoaXMgdW50aWwgd2UgdmVyaWZ5IHRoYXQgaXQgZG9lc24ndCBodXJ0IG9sZGVyIGNhcmRzISAqLworCS8qIG91dGIoaW5iKF9DT05GSUcpIHwgRU5BQkxFMTZmbGFnLCBfQ09ORklHKTsgKi8KKworCS8qIHZlcmlmeSB0aGF0IHRoZSBBUkNuZXQgc2lnbmF0dXJlIGJ5dGUgaXMgcHJlc2VudCAqLworCWlmIChyZWFkYihscC0+bWVtX3N0YXJ0KSAhPSBURVNUdmFsdWUpIHsKKwkJaWYgKHJlYWxseV9yZXNldCkKKwkJCUJVR01TRyhEX05PUk1BTCwgInJlc2V0IGZhaWxlZDogVEVTVHZhbHVlIG5vdCBwcmVzZW50LlxuIik7CisJCXJldHVybiAxOworCX0KKwkvKiBlbmFibGUgZXh0ZW5kZWQgKDUxMi1ieXRlKSBwYWNrZXRzICovCisJQUNPTU1BTkQoQ09ORklHY21kIHwgRVhUY29uZik7CisKKwkvKiBjbGVhbiBvdXQgYWxsIHRoZSBtZW1vcnkgdG8gbWFrZSBkZWJ1Z2dpbmcgbWFrZSBtb3JlIHNlbnNlIDopICovCisJQlVHTFZMKERfRFVSSU5HKQorCSAgICBtZW1zZXRfaW8obHAtPm1lbV9zdGFydCwgMHg0MiwgMjA0OCk7CisKKwkvKiBkb25lISAgcmV0dXJuIHN1Y2Nlc3MuICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbTkweHhfY29weV90b19jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sIGludCBvZmZzZXQsCisJCQkJIHZvaWQgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqbWVtYWRkciA9IGxwLT5tZW1fc3RhcnQgKyBidWZudW0gKiA1MTIgKyBvZmZzZXQ7CisJVElNRSgibWVtY3B5X3RvaW8iLCBjb3VudCwgbWVtY3B5X3RvaW8obWVtYWRkciwgYnVmLCBjb3VudCkpOworfQorCisKK3N0YXRpYyB2b2lkIGNvbTkweHhfY29weV9mcm9tX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwgaW50IG9mZnNldCwKKwkJCQkgICB2b2lkICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKm1lbWFkZHIgPSBscC0+bWVtX3N0YXJ0ICsgYnVmbnVtICogNTEyICsgb2Zmc2V0OworCVRJTUUoIm1lbWNweV9mcm9taW8iLCBjb3VudCwgbWVtY3B5X2Zyb21pbyhidWYsIG1lbWFkZHIsIGNvdW50KSk7Cit9CisKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9faW5pdCBjb205MHh4X2luaXQodm9pZCkKK3sKKwlpZiAoaXJxID09IDIpCisJCWlycSA9IDk7CisJY29tOTB4eF9wcm9iZSgpOworCWlmICghbnVtY2FyZHMpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY29tOTB4eF9leGl0KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscDsKKwlpbnQgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBudW1jYXJkczsgY291bnQrKykgeworCQlkZXYgPSBjYXJkc1tjb3VudF07CisJCWxwID0gZGV2LT5wcml2OworCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlpb3VubWFwKGxwLT5tZW1fc3RhcnQpOworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgQVJDTkVUX1RPVEFMX1NJWkUpOworCQlyZWxlYXNlX21lbV9yZWdpb24oZGV2LT5tZW1fc3RhcnQsIGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0ICsgMSk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorfQorCittb2R1bGVfaW5pdChjb205MHh4X2luaXQpOworbW9kdWxlX2V4aXQoY29tOTB4eF9leGl0KTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IGNvbTkweHhfc2V0dXAoY2hhciAqcykKK3sKKwlpbnQgaW50c1s4XTsKKworCXMgPSBnZXRfb3B0aW9ucyhzLCA4LCBpbnRzKTsKKwlpZiAoIWludHNbMF0gJiYgISpzKSB7CisJCXByaW50aygiY29tOTB4eDogRGlzYWJsZWQuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJc3dpdGNoIChpbnRzWzBdKSB7CisJZGVmYXVsdDoJCS8qIEVSUk9SICovCisJCXByaW50aygiY29tOTB4eDogVG9vIG1hbnkgYXJndW1lbnRzLlxuIik7CisJY2FzZSAzOgkJLyogTWVtIGFkZHJlc3MgKi8KKwkJc2htZW0gPSBpbnRzWzNdOworCWNhc2UgMjoJCS8qIElSUSAqLworCQlpcnEgPSBpbnRzWzJdOworCWNhc2UgMToJCS8qIElPIGFkZHJlc3MgKi8KKwkJaW8gPSBpbnRzWzFdOworCX0KKworCWlmICgqcykKKwkJc25wcmludGYoZGV2aWNlLCBzaXplb2YoZGV2aWNlKSwgIiVzIiwgcyk7CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiY29tOTB4eD0iLCBjb205MHh4X3NldHVwKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L3JmYzEwNTEuYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9yZmMxMDUxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3OTEzNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9yZmMxMDUxLmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBMaW51eCBBUkNuZXQgZHJpdmVyIC0gUkZDMTA1MSAoInNpbXBsZSIgc3RhbmRhcmQpIHBhY2tldCBlbmNhcHN1bGF0aW9uCisgKiAKKyAqIFdyaXR0ZW4gMTk5NC0xOTk5IGJ5IEF2ZXJ5IFBlbm5hcnVuLgorICogRGVyaXZlZCBmcm9tIHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiBTcGVjaWFsIHRoYW5rcyB0byBDb250ZW1wb3JhcnkgQ29udHJvbHMsIEluYy4gKHd3dy5jY29udHJvbHMuY29tKQorICogIGZvciBzcG9uc29yaW5nIHRoZSBmdXJ0aGVyIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgb3JpZ2luYWwgY29weXJpZ2h0IG9mIHNrZWxldG9uLmMgd2FzIGFzIGZvbGxvd3M6CisgKgorICogc2tlbGV0b24uYyBXcml0dGVuIDE5OTMgYnkgRG9uYWxkIEJlY2tlci4KKyAqIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBvbmx5IGJlIHVzZWQKKyAqIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogbW9kaWZpZWQgYnkgU1JDLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRm9yIG1vcmUgZGV0YWlscywgc2VlIGRyaXZlcnMvbmV0L2FyY25ldC5jCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9hcmNkZXZpY2UuaD4KKworI2RlZmluZSBWRVJTSU9OICJhcmNuZXQ6IFJGQzEwNTEgXCJzaW1wbGUgc3RhbmRhcmRcIiAoYHMnKSBlbmNhcHN1bGF0aW9uIHN1cHBvcnQgbG9hZGVkLlxuIgorCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwKKwkgICAgICAgc3RydWN0IGFyY2hkciAqcGt0aGRyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyBpbnQgYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQl1bnNpZ25lZCBzaG9ydCB0eXBlLCB1aW50OF90IGRhZGRyKTsKK3N0YXRpYyBpbnQgcHJlcGFyZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYXJjaGRyICpwa3QsIGludCBsZW5ndGgsCisJCSAgICAgIGludCBidWZudW0pOworCisKK3N0cnVjdCBBcmNQcm90byByZmMxMDUxX3Byb3RvID0KK3sKKwkuc3VmZml4CQk9ICdzJywKKwkubXR1CQk9IFhNVFUgLSBSRkMxMDUxX0hEUl9TSVpFLAorCS5pc19pcCAgICAgICAgICA9IDEsCisJLnJ4CQk9IHJ4LAorCS5idWlsZF9oZWFkZXIJPSBidWlsZF9oZWFkZXIsCisJLnByZXBhcmVfdHgJPSBwcmVwYXJlX3R4LAorCS5jb250aW51ZV90eCAgICA9IE5VTEwsCisJLmFja190eCAgICAgICAgID0gTlVMTAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBhcmNuZXRfcmZjMTA1MV9pbml0KHZvaWQpCit7CisJcHJpbnRrKFZFUlNJT04pOworCisJYXJjX3Byb3RvX21hcFtBUkNfUF9JUF9SRkMxMDUxXQorCSAgICA9IGFyY19wcm90b19tYXBbQVJDX1BfQVJQX1JGQzEwNTFdCisJICAgID0gJnJmYzEwNTFfcHJvdG87CisKKwkvKiBpZiBzb21lb25lIGVsc2UgYWxyZWFkeSBvd25zIHRoZSBicm9hZGNhc3QsIHdlIHdvbid0IHRha2UgaXQgKi8KKwlpZiAoYXJjX2JjYXN0X3Byb3RvID09IGFyY19wcm90b19kZWZhdWx0KQorCQlhcmNfYmNhc3RfcHJvdG8gPSAmcmZjMTA1MV9wcm90bzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXJjbmV0X3JmYzEwNTFfZXhpdCh2b2lkKQoreworCWFyY25ldF91bnJlZ2lzdGVyX3Byb3RvKCZyZmMxMDUxX3Byb3RvKTsKK30KKworbW9kdWxlX2luaXQoYXJjbmV0X3JmYzEwNTFfaW5pdCk7Cittb2R1bGVfZXhpdChhcmNuZXRfcmZjMTA1MV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogRGV0ZXJtaW5lIGEgcGFja2V0J3MgcHJvdG9jb2wgSUQuCisgKiAKKyAqIFdpdGggQVJDbmV0IHdlIGhhdmUgdG8gY29udmVydCBldmVyeXRoaW5nIHRvIEV0aGVybmV0LXN0eWxlIHN0dWZmLgorICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBhcmNoZHIgKnBrdCA9IChzdHJ1Y3QgYXJjaGRyICopIHNrYi0+ZGF0YTsKKwlzdHJ1Y3QgYXJjX3JmYzEwNTEgKnNvZnQgPSAmcGt0LT5zb2Z0LnJmYzEwNTE7CisJaW50IGhkcl9zaXplID0gQVJDX0hEUl9TSVpFICsgUkZDMTA1MV9IRFJfU0laRTsKKworCS8qIFB1bGwgb2ZmIHRoZSBhcmNuZXQgaGVhZGVyLiAqLworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcHVsbChza2IsIGhkcl9zaXplKTsKKworCWlmIChwa3QtPmhhcmQuZGVzdCA9PSAwKQorCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0JST0FEQ0FTVDsKKwllbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJLyogaWYgd2UncmUgbm90IHNlbmRpbmcgdG8gb3Vyc2VsdmVzIDopICovCisJCWlmIChwa3QtPmhhcmQuZGVzdCAhPSBkZXYtPmRldl9hZGRyWzBdKQorCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJfQorCS8qIG5vdyByZXR1cm4gdGhlIHByb3RvY29sIG51bWJlciAqLworCXN3aXRjaCAoc29mdC0+cHJvdG8pIHsKKwljYXNlIEFSQ19QX0lQX1JGQzEwNTE6CisJCXJldHVybiBodG9ucyhFVEhfUF9JUCk7CisJY2FzZSBBUkNfUF9BUlBfUkZDMTA1MToKKwkJcmV0dXJuIGh0b25zKEVUSF9QX0FSUCk7CisKKwlkZWZhdWx0OgorCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBodG9ucyhFVEhfUF9JUCk7Cit9CisKKworLyogcGFja2V0IHJlY2VpdmVyICovCitzdGF0aWMgdm9pZCByeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLAorCSAgICAgICBzdHJ1Y3QgYXJjaGRyICpwa3RoZHIsIGludCBsZW5ndGgpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgYXJjaGRyICpwa3QgPSBwa3RoZHI7CisJaW50IG9mczsKKworCUJVR01TRyhEX0RVUklORywgIml0J3MgYSByYXcgcGFja2V0IChsZW5ndGg9JWQpXG4iLCBsZW5ndGgpOworCisJaWYgKGxlbmd0aCA+PSBNaW5UVSkKKwkJb2ZzID0gNTEyIC0gbGVuZ3RoOworCWVsc2UKKwkJb2ZzID0gMjU2IC0gbGVuZ3RoOworCisJc2tiID0gYWxsb2Nfc2tiKGxlbmd0aCArIEFSQ19IRFJfU0laRSwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCUJVR01TRyhEX05PUk1BTCwgIk1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iKTsKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKwlza2JfcHV0KHNrYiwgbGVuZ3RoICsgQVJDX0hEUl9TSVpFKTsKKwlza2ItPmRldiA9IGRldjsKKworCXBrdCA9IChzdHJ1Y3QgYXJjaGRyICopIHNrYi0+ZGF0YTsKKworCS8qIHVwIHRvIHNpemVvZihwa3QtPnNvZnQpIGhhcyBhbHJlYWR5IGJlZW4gY29waWVkIGZyb20gdGhlIGNhcmQgKi8KKwltZW1jcHkocGt0LCBwa3RoZHIsIHNpemVvZihzdHJ1Y3QgYXJjaGRyKSk7CisJaWYgKGxlbmd0aCA+IHNpemVvZihwa3QtPnNvZnQpKQorCQlscC0+aHcuY29weV9mcm9tX2NhcmQoZGV2LCBidWZudW0sIG9mcyArIHNpemVvZihwa3QtPnNvZnQpLAorCQkJCSAgICAgIHBrdC0+c29mdC5yYXcgKyBzaXplb2YocGt0LT5zb2Z0KSwKKwkJCQkgICAgICBsZW5ndGggLSBzaXplb2YocGt0LT5zb2Z0KSk7CisKKwlCVUdMVkwoRF9TS0IpIGFyY25ldF9kdW1wX3NrYihkZXYsIHNrYiwgInJ4Iik7CisKKwlza2ItPnByb3RvY29sID0gdHlwZV90cmFucyhza2IsIGRldik7CisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworfQorCisKKy8qCisgKiBDcmVhdGUgdGhlIEFSQ25ldCBoYXJkL3NvZnQgaGVhZGVycyBmb3IgUkZDMTA1MS4KKyAqLworc3RhdGljIGludCBidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXVuc2lnbmVkIHNob3J0IHR5cGUsIHVpbnQ4X3QgZGFkZHIpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IGhkcl9zaXplID0gQVJDX0hEUl9TSVpFICsgUkZDMTA1MV9IRFJfU0laRTsKKwlzdHJ1Y3QgYXJjaGRyICpwa3QgPSAoc3RydWN0IGFyY2hkciAqKSBza2JfcHVzaChza2IsIGhkcl9zaXplKTsKKwlzdHJ1Y3QgYXJjX3JmYzEwNTEgKnNvZnQgPSAmcGt0LT5zb2Z0LnJmYzEwNTE7CisKKwkvKiBzZXQgdGhlIHByb3RvY29sIElEIGFjY29yZGluZyB0byBSRkMxMDUxICovCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFVEhfUF9JUDoKKwkJc29mdC0+cHJvdG8gPSBBUkNfUF9JUF9SRkMxMDUxOworCQlicmVhazsKKwljYXNlIEVUSF9QX0FSUDoKKwkJc29mdC0+cHJvdG8gPSBBUkNfUF9BUlBfUkZDMTA1MTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHTVNHKERfTk9STUFMLCAiUkZDMTA1MTogSSBkb24ndCB1bmRlcnN0YW5kIHByb3RvY29sICVkICglWGgpXG4iLAorCQkgICAgICAgdHlwZSwgdHlwZSk7CisJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCXJldHVybiAwOworCX0KKworCisJLyoKKwkgKiBTZXQgdGhlIHNvdXJjZSBoYXJkd2FyZSBhZGRyZXNzLgorCSAqCisJICogVGhpcyBpcyBwcmV0dHkgcG9pbnRsZXNzIGZvciBtb3N0IHB1cnBvc2VzLCBidXQgaXQgY2FuIGhlbHAgaW4KKwkgKiBkZWJ1Z2dpbmcuICBBUkNuZXQgZG9lcyBub3QgYWxsb3cgdXMgdG8gY2hhbmdlIHRoZSBzb3VyY2UgYWRkcmVzcyBpbgorCSAqIHRoZSBhY3R1YWwgcGFja2V0IHNlbnQpCisJICovCisJcGt0LT5oYXJkLnNvdXJjZSA9ICpkZXYtPmRldl9hZGRyOworCisJLyogc2VlIGxpbnV4L25ldC9ldGhlcm5ldC9ldGguYyB0byBzZWUgd2hlcmUgSSBnb3QgdGhlIGZvbGxvd2luZyAqLworCisJaWYgKGRldi0+ZmxhZ3MgJiAoSUZGX0xPT1BCQUNLIHwgSUZGX05PQVJQKSkgeworCQkvKiAKKwkJICogRklYTUU6IGZpbGwgaW4gdGhlIGxhc3QgYnl0ZSBvZiB0aGUgZGVzdCBpcGFkZHIgaGVyZSB0byBiZXR0ZXIKKwkJICogY29tcGx5IHdpdGggUkZDMTA1MSBpbiAibm9hcnAiIG1vZGUuCisJCSAqLworCQlwa3QtPmhhcmQuZGVzdCA9IDA7CisJCXJldHVybiBoZHJfc2l6ZTsKKwl9CisJLyogb3RoZXJ3aXNlLCBqdXN0IGZpbGwgaXQgaW4gYW5kIGdvISAqLworCXBrdC0+aGFyZC5kZXN0ID0gZGFkZHI7CisKKwlyZXR1cm4gaGRyX3NpemU7CS8qIHN1Y2Nlc3MgKi8KK30KKworCitzdGF0aWMgaW50IHByZXBhcmVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGFyY2hkciAqcGt0LCBpbnQgbGVuZ3RoLAorCQkgICAgICBpbnQgYnVmbnVtKQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBhcmNfaGFyZHdhcmUgKmhhcmQgPSAmcGt0LT5oYXJkOworCWludCBvZnM7CisKKwlCVUdNU0coRF9EVVJJTkcsICJwcmVwYXJlX3R4OiB0eGJ1ZnM9JWQvJWQvJWRcbiIsCisJICAgICAgIGxwLT5uZXh0X3R4LCBscC0+Y3VyX3R4LCBidWZudW0pOworCisJbGVuZ3RoIC09IEFSQ19IRFJfU0laRTsJLyogaGFyZCBoZWFkZXIgaXMgbm90IGluY2x1ZGVkIGluIHBhY2tldCBsZW5ndGggKi8KKworCWlmIChsZW5ndGggPiBYTVRVKSB7CisJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4hIG90aGVyIHBlb3BsZSBhbHJlYWR5IGNoZWNrIGZvciB0aGlzLiAqLworCQlCVUdNU0coRF9OT1JNQUwsICJCdWchICBwcmVwYXJlX3R4IHdpdGggc2l6ZSAlZCAoPiAlZClcbiIsCisJCSAgICAgICBsZW5ndGgsIFhNVFUpOworCQlsZW5ndGggPSBYTVRVOworCX0KKwlpZiAobGVuZ3RoID4gTWluVFUpIHsKKwkJaGFyZC0+b2Zmc2V0WzBdID0gMDsKKwkJaGFyZC0+b2Zmc2V0WzFdID0gb2ZzID0gNTEyIC0gbGVuZ3RoOworCX0gZWxzZSBpZiAobGVuZ3RoID4gTVRVKSB7CisJCWhhcmQtPm9mZnNldFswXSA9IDA7CisJCWhhcmQtPm9mZnNldFsxXSA9IG9mcyA9IDUxMiAtIGxlbmd0aCAtIDM7CisJfSBlbHNlCisJCWhhcmQtPm9mZnNldFswXSA9IG9mcyA9IDI1NiAtIGxlbmd0aDsKKworCWxwLT5ody5jb3B5X3RvX2NhcmQoZGV2LCBidWZudW0sIDAsIGhhcmQsIEFSQ19IRFJfU0laRSk7CisJbHAtPmh3LmNvcHlfdG9fY2FyZChkZXYsIGJ1Zm51bSwgb2ZzLCAmcGt0LT5zb2Z0LCBsZW5ndGgpOworCisJbHAtPmxhc3Rsb2FkX2Rlc3QgPSBoYXJkLT5kZXN0OworCisJcmV0dXJuIDE7CQkvKiBkb25lICovCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvcmZjMTIwMS5jIGIvZHJpdmVycy9uZXQvYXJjbmV0L3JmYzEyMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjZhZTRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJjbmV0L3JmYzEyMDEuYwpAQCAtMCwwICsxLDU0OSBAQAorLyoKKyAqIExpbnV4IEFSQ25ldCBkcml2ZXIgLSBSRkMxMjAxIChzdGFuZGFyZCkgcGFja2V0IGVuY2Fwc3VsYXRpb24KKyAqIAorICogV3JpdHRlbiAxOTk0LTE5OTkgYnkgQXZlcnkgUGVubmFydW4uCisgKiBEZXJpdmVkIGZyb20gc2tlbGV0b24uYyBieSBEb25hbGQgQmVja2VyLgorICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIENvbnRlbXBvcmFyeSBDb250cm9scywgSW5jLiAod3d3LmNjb250cm9scy5jb20pCisgKiAgZm9yIHNwb25zb3JpbmcgdGhlIGZ1cnRoZXIgZGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgb2Ygc2tlbGV0b24uYyB3YXMgYXMgZm9sbG93czoKKyAqCisgKiBza2VsZXRvbi5jIFdyaXR0ZW4gMTk5MyBieSBEb25hbGQgQmVja2VyLgorICogQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICogRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZAorICogYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBtb2RpZmllZCBieSBTUkMsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgZHJpdmVycy9uZXQvYXJjbmV0LmMKKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYXJjZGV2aWNlLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNkZWZpbmUgVkVSU0lPTiAiYXJjbmV0OiBSRkMxMjAxIFwic3RhbmRhcmRcIiAoYGEnKSBlbmNhcHN1bGF0aW9uIHN1cHBvcnQgbG9hZGVkLlxuIgorCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwKKwkgICAgICAgc3RydWN0IGFyY2hkciAqcGt0aGRyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyBpbnQgYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQl1bnNpZ25lZCBzaG9ydCB0eXBlLCB1aW50OF90IGRhZGRyKTsKK3N0YXRpYyBpbnQgcHJlcGFyZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYXJjaGRyICpwa3QsIGludCBsZW5ndGgsCisJCSAgICAgIGludCBidWZudW0pOworc3RhdGljIGludCBjb250aW51ZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtKTsKKworc3RydWN0IEFyY1Byb3RvIHJmYzEyMDFfcHJvdG8gPQoreworCS5zdWZmaXgJCT0gJ2EnLAorCS5tdHUJCT0gMTUwMCwJLyogY291bGQgYmUgbW9yZSwgYnV0IHNvbWUgcmVjZWl2ZXJzIGNhbid0IGhhbmRsZSBpdC4uLiAqLworCS5pc19pcCAgICAgICAgICA9IDEsICAgIC8qIFRoaXMgaXMgZm9yIHNlbmRpbmcgSVAgYW5kIEFSUCBwYWNrYWdlcyAqLworCS5yeAkJPSByeCwKKwkuYnVpbGRfaGVhZGVyCT0gYnVpbGRfaGVhZGVyLAorCS5wcmVwYXJlX3R4CT0gcHJlcGFyZV90eCwKKwkuY29udGludWVfdHgJPSBjb250aW51ZV90eCwKKwkuYWNrX3R4ICAgICAgICAgPSBOVUxMCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGFyY25ldF9yZmMxMjAxX2luaXQodm9pZCkKK3sKKwlwcmludGsoVkVSU0lPTik7CisKKwlhcmNfcHJvdG9fbWFwW0FSQ19QX0lQXQorCSAgICA9IGFyY19wcm90b19tYXBbQVJDX1BfSVBWNl0KKwkgICAgPSBhcmNfcHJvdG9fbWFwW0FSQ19QX0FSUF0KKwkgICAgPSBhcmNfcHJvdG9fbWFwW0FSQ19QX1JBUlBdCisJICAgID0gYXJjX3Byb3RvX21hcFtBUkNfUF9JUFhdCisJICAgID0gYXJjX3Byb3RvX21hcFtBUkNfUF9OT1ZFTExfRUNdCisJICAgID0gJnJmYzEyMDFfcHJvdG87CisKKwkvKiBpZiBzb21lb25lIGVsc2UgYWxyZWFkeSBvd25zIHRoZSBicm9hZGNhc3QsIHdlIHdvbid0IHRha2UgaXQgKi8KKwlpZiAoYXJjX2JjYXN0X3Byb3RvID09IGFyY19wcm90b19kZWZhdWx0KQorCQlhcmNfYmNhc3RfcHJvdG8gPSAmcmZjMTIwMV9wcm90bzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXJjbmV0X3JmYzEyMDFfZXhpdCh2b2lkKQoreworCWFyY25ldF91bnJlZ2lzdGVyX3Byb3RvKCZyZmMxMjAxX3Byb3RvKTsKK30KKworbW9kdWxlX2luaXQoYXJjbmV0X3JmYzEyMDFfaW5pdCk7Cittb2R1bGVfZXhpdChhcmNuZXRfcmZjMTIwMV9leGl0KTsKKworLyoKKyAqIERldGVybWluZSBhIHBhY2tldCdzIHByb3RvY29sIElELgorICogCisgKiBXaXRoIEFSQ25ldCB3ZSBoYXZlIHRvIGNvbnZlcnQgZXZlcnl0aGluZyB0byBFdGhlcm5ldC1zdHlsZSBzdHVmZi4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHR5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJjaGRyICpwa3QgPSAoc3RydWN0IGFyY2hkciAqKSBza2ItPmRhdGE7CisJc3RydWN0IGFyY19yZmMxMjAxICpzb2Z0ID0gJnBrdC0+c29mdC5yZmMxMjAxOworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBoZHJfc2l6ZSA9IEFSQ19IRFJfU0laRSArIFJGQzEyMDFfSERSX1NJWkU7CisKKwkvKiBQdWxsIG9mZiB0aGUgYXJjbmV0IGhlYWRlci4gKi8KKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLCBoZHJfc2l6ZSk7CisKKwlpZiAocGt0LT5oYXJkLmRlc3QgPT0gMCkKKwkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9CUk9BRENBU1Q7CisJZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIGlmIHdlJ3JlIG5vdCBzZW5kaW5nIHRvIG91cnNlbHZlcyA6KSAqLworCQlpZiAocGt0LT5oYXJkLmRlc3QgIT0gZGV2LT5kZXZfYWRkclswXSkKKwkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCX0KKwkvKiBub3cgcmV0dXJuIHRoZSBwcm90b2NvbCBudW1iZXIgKi8KKwlzd2l0Y2ggKHNvZnQtPnByb3RvKSB7CisJY2FzZSBBUkNfUF9JUDoKKwkJcmV0dXJuIGh0b25zKEVUSF9QX0lQKTsKKwljYXNlIEFSQ19QX0lQVjY6CisJCXJldHVybiBodG9ucyhFVEhfUF9JUFY2KTsKKwljYXNlIEFSQ19QX0FSUDoKKwkJcmV0dXJuIGh0b25zKEVUSF9QX0FSUCk7CisJY2FzZSBBUkNfUF9SQVJQOgorCQlyZXR1cm4gaHRvbnMoRVRIX1BfUkFSUCk7CisKKwljYXNlIEFSQ19QX0lQWDoKKwljYXNlIEFSQ19QX05PVkVMTF9FQzoKKwkJcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8zKTsKKwlkZWZhdWx0OgorCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBodG9ucyhFVEhfUF9JUCk7Cit9CisKKworLyogcGFja2V0IHJlY2VpdmVyICovCitzdGF0aWMgdm9pZCByeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLAorCSAgICAgICBzdHJ1Y3QgYXJjaGRyICpwa3RoZHIsIGludCBsZW5ndGgpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgYXJjaGRyICpwa3QgPSBwa3RoZHI7CisJc3RydWN0IGFyY19yZmMxMjAxICpzb2Z0ID0gJnBrdGhkci0+c29mdC5yZmMxMjAxOworCWludCBzYWRkciA9IHBrdC0+aGFyZC5zb3VyY2UsIG9mczsKKwlzdHJ1Y3QgSW5jb21pbmcgKmluID0gJmxwLT5yZmMxMjAxLmluY29taW5nW3NhZGRyXTsKKworCUJVR01TRyhEX0RVUklORywgIml0J3MgYW4gUkZDMTIwMSBwYWNrZXQgKGxlbmd0aD0lZClcbiIsIGxlbmd0aCk7CisKKwlpZiAobGVuZ3RoID49IE1pblRVKQorCQlvZnMgPSA1MTIgLSBsZW5ndGg7CisJZWxzZQorCQlvZnMgPSAyNTYgLSBsZW5ndGg7CisKKwlpZiAoc29mdC0+c3BsaXRfZmxhZyA9PSAweEZGKSB7CQkvKiBFeGNlcHRpb24gUGFja2V0ICovCisJCWlmIChsZW5ndGggPj0gNCArIFJGQzEyMDFfSERSX1NJWkUpCisJCQlCVUdNU0coRF9EVVJJTkcsICJjb21wZW5zYXRpbmcgZm9yIGV4Y2VwdGlvbiBwYWNrZXRcbiIpOworCQllbHNlIHsKKwkJCUJVR01TRyhEX0VYVFJBLCAic2hvcnQgUkZDMTIwMSBleGNlcHRpb24gcGFja2V0IGZyb20gJTAyWGgiLAorCQkJICAgICAgIHNhZGRyKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIHNraXAgb3ZlciA0LWJ5dGUganVua29sYSAqLworCQlsZW5ndGggLT0gNDsKKwkJb2ZzICs9IDQ7CisJCWxwLT5ody5jb3B5X2Zyb21fY2FyZChkZXYsIGJ1Zm51bSwgNTEyIC0gbGVuZ3RoLAorCQkJCSAgICAgIHNvZnQsIHNpemVvZihwa3QtPnNvZnQpKTsKKwl9CisJaWYgKCFzb2Z0LT5zcGxpdF9mbGFnKSB7CS8qIG5vdCBzcGxpdCAqLworCQlCVUdNU0coRF9SWCwgImluY29taW5nIGlzIG5vdCBzcGxpdCAoc3BsaXRmbGFnPSVkKVxuIiwKKwkJICAgICAgIHNvZnQtPnNwbGl0X2ZsYWcpOworCisJCWlmIChpbi0+c2tiKSB7CS8qIGFscmVhZHkgYXNzZW1ibGluZyBvbmUhICovCisJCQlCVUdNU0coRF9FWFRSQSwgImFib3J0aW5nIGFzc2VtYmx5IChzZXE9JWQpIGZvciB1bnNwbGl0IHBhY2tldCAoc3BsaXRmbGFnPSVkLCBzZXE9JWQpXG4iLAorCQkJIGluLT5zZXF1ZW5jZSwgc29mdC0+c3BsaXRfZmxhZywgc29mdC0+c2VxdWVuY2UpOworCQkJbHAtPnJmYzEyMDEuYWJvcnRlZF9zZXEgPSBzb2Z0LT5zZXF1ZW5jZTsKKwkJCWRldl9rZnJlZV9za2JfaXJxKGluLT5za2IpOworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJbHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJCWluLT5za2IgPSBOVUxMOworCQl9CisJCWluLT5zZXF1ZW5jZSA9IHNvZnQtPnNlcXVlbmNlOworCisJCXNrYiA9IGFsbG9jX3NrYihsZW5ndGggKyBBUkNfSERSX1NJWkUsIEdGUF9BVE9NSUMpOworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCUJVR01TRyhEX05PUk1BTCwgIk1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iKTsKKwkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlyZXR1cm47CisJCX0KKwkJc2tiX3B1dChza2IsIGxlbmd0aCArIEFSQ19IRFJfU0laRSk7CisJCXNrYi0+ZGV2ID0gZGV2OworCisJCXBrdCA9IChzdHJ1Y3QgYXJjaGRyICopIHNrYi0+ZGF0YTsKKwkJc29mdCA9ICZwa3QtPnNvZnQucmZjMTIwMTsKKworCQkvKiB1cCB0byBzaXplb2YocGt0LT5zb2Z0KSBoYXMgYWxyZWFkeSBiZWVuIGNvcGllZCBmcm9tIHRoZSBjYXJkICovCisJCW1lbWNweShwa3QsIHBrdGhkciwgc2l6ZW9mKHN0cnVjdCBhcmNoZHIpKTsKKwkJaWYgKGxlbmd0aCA+IHNpemVvZihwa3QtPnNvZnQpKQorCQkJbHAtPmh3LmNvcHlfZnJvbV9jYXJkKGRldiwgYnVmbnVtLCBvZnMgKyBzaXplb2YocGt0LT5zb2Z0KSwKKwkJCQkgICAgICAgcGt0LT5zb2Z0LnJhdyArIHNpemVvZihwa3QtPnNvZnQpLAorCQkJCQkgICAgICBsZW5ndGggLSBzaXplb2YocGt0LT5zb2Z0KSk7CisKKwkJLyoKKwkJICogQVJQIHBhY2tldHMgaGF2ZSBwcm9ibGVtcyB3aGVuIHNlbnQgZnJvbSBzb21lIERPUyBzeXN0ZW1zOiB0aGUKKwkJICogc291cmNlIGFkZHJlc3MgaXMgYWx3YXlzIDAhICBTbyB3ZSB0YWtlIHRoZSBoYXJkd2FyZSBzb3VyY2UgYWRkcgorCQkgKiAod2hpY2ggaXMgaW1wb3NzaWJsZSB0byBmdW1ibGUpIGFuZCBpbnNlcnQgaXQgb3Vyc2VsdmVzLgorCQkgKi8KKwkJaWYgKHNvZnQtPnByb3RvID09IEFSQ19QX0FSUCkgeworCQkJc3RydWN0IGFycGhkciAqYXJwID0gKHN0cnVjdCBhcnBoZHIgKikgc29mdC0+cGF5bG9hZDsKKworCQkJLyogbWFrZSBzdXJlIGFkZHJlc3NlcyBhcmUgdGhlIHJpZ2h0IGxlbmd0aCAqLworCQkJaWYgKGFycC0+YXJfaGxuID09IDEgJiYgYXJwLT5hcl9wbG4gPT0gNCkgeworCQkJCXVpbnQ4X3QgKmNwdHIgPSAodWludDhfdCAqKSBhcnAgKyBzaXplb2Yoc3RydWN0IGFycGhkcik7CisKKwkJCQlpZiAoISpjcHRyKSB7CS8qIGlzIHNhZGRyID0gMDA/ICovCisJCQkJCUJVR01TRyhEX0VYVFJBLAorCQkJCQkgICAgICAgIkFSUCBzb3VyY2UgYWRkcmVzcyB3YXMgMDBoLCBzZXQgdG8gJTAyWGguXG4iLAorCQkJCQkgICAgICAgc2FkZHIpOworCQkJCQlscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCQkqY3B0ciA9IHNhZGRyOworCQkJCX0gZWxzZSB7CisJCQkJCUJVR01TRyhEX0RVUklORywgIkFSUCBzb3VyY2UgYWRkcmVzcyAoJVhoKSBpcyBmaW5lLlxuIiwKKwkJCQkJICAgICAgICpjcHRyKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCUJVR01TRyhEX05PUk1BTCwgImZ1bm55LXNoYXBlZCBBUlAgcGFja2V0LiAoJVhoLCAlWGgpXG4iLAorCQkJCSAgICAgICBhcnAtPmFyX2hsbiwgYXJwLT5hcl9wbG4pOworCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJfQorCQl9CisJCUJVR0xWTChEX1NLQikgYXJjbmV0X2R1bXBfc2tiKGRldiwgc2tiLCAicngiKTsKKworCQlza2ItPnByb3RvY29sID0gdHlwZV90cmFucyhza2IsIGRldik7CisJCW5ldGlmX3J4KHNrYik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJfSBlbHNlIHsJCS8qIHNwbGl0IHBhY2tldCAqLworCQkvKgorCQkgKiBOT1RFOiBNU0RPUyBBUlAgcGFja2V0IGNvcnJlY3Rpb24gc2hvdWxkIG9ubHkgbmVlZCB0byBhcHBseSB0bworCQkgKiB1bnNwbGl0IHBhY2tldHMsIHNpbmNlIEFSUCBwYWNrZXRzIGFyZSBzbyBzaG9ydC4KKwkJICoKKwkJICogTXkgaW50ZXJwcmV0YXRpb24gb2YgdGhlIFJGQzEyMDEgZG9jdW1lbnQgaXMgdGhhdCBpZiBhIHBhY2tldCBpcworCQkgKiByZWNlaXZlZCBvdXQgb2Ygb3JkZXIsIHRoZSBlbnRpcmUgYXNzZW1ibHkgcHJvY2VzcyBzaG91bGQgYmUKKwkJICogYWJvcnRlZC4KKwkJICoKKwkJICogVGhlIFJGQyBhbHNvIG1lbnRpb25zICJpdCBpcyBwb3NzaWJsZSBmb3Igc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkCisJCSAqIHBhY2tldHMgdG8gYmUgcmV0cmFuc21pdHRlZC4iIEFzIG9mIDAuNDAgYWxsIHByZXZpb3VzbHkgcmVjZWl2ZWQKKwkJICogcGFja2V0cyBhcmUgYWxsb3dlZCwgbm90IGp1c3QgdGhlIG1vc3QgcmVjZW50IG9uZS4KKwkJICoKKwkJICogV2UgYWxsb3cgbXVsdGlwbGUgYXNzZW1ibHkgcHJvY2Vzc2VzLCBvbmUgZm9yIGVhY2ggQVJDbmV0IGNhcmQKKwkJICogcG9zc2libGUgb24gdGhlIG5ldHdvcmsuICBTZWVtcyByYXRoZXIgbGlrZSBhIHdhc3RlIG9mIG1lbW9yeSwKKwkJICogYnV0IHRoZXJlJ3Mgbm8gb3RoZXIgd2F5IHRvIGJlIHJlbGlhYmxlLgorCQkgKi8KKworCQlCVUdNU0coRF9SWCwgInBhY2tldCBpcyBzcGxpdCAoc3BsaXRmbGFnPSVkLCBzZXE9JWQpXG4iLAorCQkgICAgICAgc29mdC0+c3BsaXRfZmxhZywgaW4tPnNlcXVlbmNlKTsKKworCQlpZiAoaW4tPnNrYiAmJiBpbi0+c2VxdWVuY2UgIT0gc29mdC0+c2VxdWVuY2UpIHsKKwkJCUJVR01TRyhEX0VYVFJBLCAid3Jvbmcgc2VxIG51bWJlciAoc2FkZHI9JWQsIGV4cGVjdGVkPSVkLCBzZXE9JWQsIHNwbGl0ZmxhZz0lZClcbiIsCisJCQkgICAgICAgc2FkZHIsIGluLT5zZXF1ZW5jZSwgc29mdC0+c2VxdWVuY2UsCisJCQkgICAgICAgc29mdC0+c3BsaXRfZmxhZyk7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShpbi0+c2tiKTsKKwkJCWluLT5za2IgPSBOVUxMOworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJbHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJCWluLT5sYXN0cGFja2V0ID0gaW4tPm51bXBhY2tldHMgPSAwOworCQl9CisJCWlmIChzb2Z0LT5zcGxpdF9mbGFnICYgMSkgewkvKiBmaXJzdCBwYWNrZXQgaW4gc3BsaXQgKi8KKwkJCUJVR01TRyhEX1JYLCAiYnJhbmQgbmV3IHNwbGl0cGFja2V0IChzcGxpdGZsYWc9JWQpXG4iLAorCQkJICAgICAgIHNvZnQtPnNwbGl0X2ZsYWcpOworCQkJaWYgKGluLT5za2IpIHsJLyogYWxyZWFkeSBhc3NlbWJsaW5nIG9uZSEgKi8KKwkJCQlCVUdNU0coRF9FWFRSQSwgImFib3J0aW5nIHByZXZpb3VzIChzZXE9JWQpIGFzc2VtYmx5ICIKKwkJCQkgICAgICAgIihzcGxpdGZsYWc9JWQsIHNlcT0lZClcbiIsCisJCQkJICAgICAgIGluLT5zZXF1ZW5jZSwgc29mdC0+c3BsaXRfZmxhZywKKwkJCQkgICAgICAgc29mdC0+c2VxdWVuY2UpOworCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworCQkJCWRldl9rZnJlZV9za2JfaXJxKGluLT5za2IpOworCQkJfQorCQkJaW4tPnNlcXVlbmNlID0gc29mdC0+c2VxdWVuY2U7CisJCQlpbi0+bnVtcGFja2V0cyA9ICgodW5zaWduZWQpIHNvZnQtPnNwbGl0X2ZsYWcgPj4gMSkgKyAyOworCQkJaW4tPmxhc3RwYWNrZXQgPSAxOworCisJCQlpZiAoaW4tPm51bXBhY2tldHMgPiAxNikgeworCQkJCUJVR01TRyhEX0VYVFJBLCAiaW5jb21pbmcgcGFja2V0IG1vcmUgdGhhbiAxNiBzZWdtZW50czsgZHJvcHBpbmcuIChzcGxpdGZsYWc9JWQpXG4iLAorCQkJCSAgICAgICBzb2Z0LT5zcGxpdF9mbGFnKTsKKwkJCQlscC0+cmZjMTIwMS5hYm9ydGVkX3NlcSA9IHNvZnQtPnNlcXVlbmNlOworCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWluLT5za2IgPSBza2IgPSBhbGxvY19za2IoNTA4ICogaW4tPm51bXBhY2tldHMgKyBBUkNfSERSX1NJWkUsCisJCQkJCQkgIEdGUF9BVE9NSUMpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJQlVHTVNHKERfTk9STUFMLCAiKHNwbGl0KSBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIik7CisJCQkJbHAtPnJmYzEyMDEuYWJvcnRlZF9zZXEgPSBzb2Z0LT5zZXF1ZW5jZTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJcGt0ID0gKHN0cnVjdCBhcmNoZHIgKikgc2tiLT5kYXRhOworCQkJc29mdCA9ICZwa3QtPnNvZnQucmZjMTIwMTsKKworCQkJbWVtY3B5KHBrdCwgcGt0aGRyLCBBUkNfSERSX1NJWkUgKyBSRkMxMjAxX0hEUl9TSVpFKTsKKwkJCXNrYl9wdXQoc2tiLCBBUkNfSERSX1NJWkUgKyBSRkMxMjAxX0hEUl9TSVpFKTsKKworCQkJc29mdC0+c3BsaXRfZmxhZyA9IDA7CS8qIGVuZCByZXN1bHQgd29uJ3QgYmUgc3BsaXQgKi8KKwkJfSBlbHNlIHsJLyogbm90IGZpcnN0IHBhY2tldCAqLworCQkJaW50IHBhY2tldG51bSA9ICgodW5zaWduZWQpIHNvZnQtPnNwbGl0X2ZsYWcgPj4gMSkgKyAxOworCisJCQkvKgorCQkJICogaWYgd2UncmUgbm90IGFzc2VtYmxpbmcsIHRoZXJlJ3Mgbm8gcG9pbnQgdHJ5aW5nIHRvCisJCQkgKiBjb250aW51ZS4KKwkJCSAqLworCQkJaWYgKCFpbi0+c2tiKSB7CisJCQkJaWYgKGxwLT5yZmMxMjAxLmFib3J0ZWRfc2VxICE9IHNvZnQtPnNlcXVlbmNlKSB7CisJCQkJCUJVR01TRyhEX0VYVFJBLCAiY2FuJ3QgY29udGludWUgc3BsaXQgd2l0aG91dCBzdGFydGluZyAiCisJCQkJCSAgICAgICAiZmlyc3QhIChzcGxpdGZsYWc9JWQsIHNlcT0lZCwgYWJvcnRlZD0lZClcbiIsCisJCQkJCXNvZnQtPnNwbGl0X2ZsYWcsIHNvZnQtPnNlcXVlbmNlLAorCQkJCQkgICAgICAgbHAtPnJmYzEyMDEuYWJvcnRlZF9zZXEpOworCQkJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKys7CisJCQkJfQorCQkJCXJldHVybjsKKwkJCX0KKwkJCWluLT5sYXN0cGFja2V0Kys7CisJCQlpZiAocGFja2V0bnVtICE9IGluLT5sYXN0cGFja2V0KSB7CS8qIG5vdCB0aGUgcmlnaHQgZmxhZyEgKi8KKwkJCQkvKiBoYXJtbGVzcyBkdXBsaWNhdGU/IGlnbm9yZS4gKi8KKwkJCQlpZiAocGFja2V0bnVtIDw9IGluLT5sYXN0cGFja2V0IC0gMSkgeworCQkJCQlCVUdNU0coRF9FWFRSQSwgImR1cGxpY2F0ZSBzcGxpdHBhY2tldCBpZ25vcmVkISAoc3BsaXRmbGFnPSVkKVxuIiwKKwkJCQkJICAgICAgIHNvZnQtPnNwbGl0X2ZsYWcpOworCQkJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQkvKiAiYmFkIiBkdXBsaWNhdGUsIGtpbGwgcmVhc3NlbWJseSAqLworCQkJCUJVR01TRyhEX0VYVFJBLCAib3V0LW9mLW9yZGVyIHNwbGl0cGFja2V0LCByZWFzc2VtYmx5ICIKKwkJCQkgICAgICAgIihzZXE9JWQpIGFib3J0ZWQgKHNwbGl0ZmxhZz0lZCwgc2VxPSVkKVxuIiwKKwkJCQkgICAgICAgaW4tPnNlcXVlbmNlLCBzb2Z0LT5zcGxpdF9mbGFnLCBzb2Z0LT5zZXF1ZW5jZSk7CisJCQkJbHAtPnJmYzEyMDEuYWJvcnRlZF9zZXEgPSBzb2Z0LT5zZXF1ZW5jZTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShpbi0+c2tiKTsKKwkJCQlpbi0+c2tiID0gTlVMTDsKKwkJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJbHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJCQlpbi0+bGFzdHBhY2tldCA9IGluLT5udW1wYWNrZXRzID0gMDsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlwa3QgPSAoc3RydWN0IGFyY2hkciAqKSBpbi0+c2tiLT5kYXRhOworCQkJc29mdCA9ICZwa3QtPnNvZnQucmZjMTIwMTsKKwkJfQorCisJCXNrYiA9IGluLT5za2I7CisKKwkJbHAtPmh3LmNvcHlfZnJvbV9jYXJkKGRldiwgYnVmbnVtLCBvZnMgKyBSRkMxMjAxX0hEUl9TSVpFLAorCQkJCSAgICAgIHNrYi0+ZGF0YSArIHNrYi0+bGVuLAorCQkJCSAgICAgIGxlbmd0aCAtIFJGQzEyMDFfSERSX1NJWkUpOworCQlza2JfcHV0KHNrYiwgbGVuZ3RoIC0gUkZDMTIwMV9IRFJfU0laRSk7CisKKwkJLyogYXJlIHdlIGRvbmU/ICovCisJCWlmIChpbi0+bGFzdHBhY2tldCA9PSBpbi0+bnVtcGFja2V0cykgeworCQkJaW4tPnNrYiA9IE5VTEw7CisJCQlpbi0+bGFzdHBhY2tldCA9IGluLT5udW1wYWNrZXRzID0gMDsKKworCSAgICBCVUdNU0coRF9TS0JfU0laRSwgInNrYjogcmVjZWl2ZWQgJWQgYnl0ZXMgZnJvbSAlMDJYICh1bnNwbGl0KVxuIiwKKyAgICAJCXNrYi0+bGVuLCBwa3QtPmhhcmQuc291cmNlKTsKKwkgICAgQlVHTVNHKERfU0tCX1NJWkUsICJza2I6IHJlY2VpdmVkICVkIGJ5dGVzIGZyb20gJTAyWCAoc3BsaXQpXG4iLAorICAgIAkJc2tiLT5sZW4sIHBrdC0+aGFyZC5zb3VyY2UpOworCQkJQlVHTFZMKERfU0tCKSBhcmNuZXRfZHVtcF9za2IoZGV2LCBza2IsICJyeCIpOworCisJCQlza2ItPnByb3RvY29sID0gdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJfQorCX0KK30KKworCisvKiBDcmVhdGUgdGhlIEFSQ25ldCBoYXJkL3NvZnQgaGVhZGVycyBmb3IgUkZDMTIwMS4gKi8KK3N0YXRpYyBpbnQgYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQl1bnNpZ25lZCBzaG9ydCB0eXBlLCB1aW50OF90IGRhZGRyKQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBoZHJfc2l6ZSA9IEFSQ19IRFJfU0laRSArIFJGQzEyMDFfSERSX1NJWkU7CisJc3RydWN0IGFyY2hkciAqcGt0ID0gKHN0cnVjdCBhcmNoZHIgKikgc2tiX3B1c2goc2tiLCBoZHJfc2l6ZSk7CisJc3RydWN0IGFyY19yZmMxMjAxICpzb2Z0ID0gJnBrdC0+c29mdC5yZmMxMjAxOworCisJLyogc2V0IHRoZSBwcm90b2NvbCBJRCBhY2NvcmRpbmcgdG8gUkZDMTIwMSAqLworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRVRIX1BfSVA6CisJCXNvZnQtPnByb3RvID0gQVJDX1BfSVA7CisJCWJyZWFrOworCWNhc2UgRVRIX1BfSVBWNjoKKwkJc29mdC0+cHJvdG8gPSBBUkNfUF9JUFY2OworCQlicmVhazsKKwljYXNlIEVUSF9QX0FSUDoKKwkJc29mdC0+cHJvdG8gPSBBUkNfUF9BUlA7CisJCWJyZWFrOworCWNhc2UgRVRIX1BfUkFSUDoKKwkJc29mdC0+cHJvdG8gPSBBUkNfUF9SQVJQOworCQlicmVhazsKKwljYXNlIEVUSF9QX0lQWDoKKwljYXNlIEVUSF9QXzgwMl8zOgorCWNhc2UgRVRIX1BfODAyXzI6CisJCXNvZnQtPnByb3RvID0gQVJDX1BfSVBYOworCQlicmVhazsKKwljYXNlIEVUSF9QX0FUQUxLOgorCQlzb2Z0LT5wcm90byA9IEFSQ19QX0FUQUxLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUdNU0coRF9OT1JNQUwsICJSRkMxMjAxOiBJIGRvbid0IHVuZGVyc3RhbmQgcHJvdG9jb2wgJWQgKCVYaClcbiIsCisJCSAgICAgICB0eXBlLCB0eXBlKTsKKwkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBTZXQgdGhlIHNvdXJjZSBoYXJkd2FyZSBhZGRyZXNzLgorCSAqCisJICogVGhpcyBpcyBwcmV0dHkgcG9pbnRsZXNzIGZvciBtb3N0IHB1cnBvc2VzLCBidXQgaXQgY2FuIGhlbHAgaW4KKwkgKiBkZWJ1Z2dpbmcuICBBUkNuZXQgZG9lcyBub3QgYWxsb3cgdXMgdG8gY2hhbmdlIHRoZSBzb3VyY2UgYWRkcmVzcyBpbgorCSAqIHRoZSBhY3R1YWwgcGFja2V0IHNlbnQpCisJICovCisJcGt0LT5oYXJkLnNvdXJjZSA9ICpkZXYtPmRldl9hZGRyOworCisJc29mdC0+c2VxdWVuY2UgPSBodG9ucyhscC0+cmZjMTIwMS5zZXF1ZW5jZSsrKTsKKwlzb2Z0LT5zcGxpdF9mbGFnID0gMDsJLyogc3BsaXQgcGFja2V0cyBhcmUgZG9uZSBlbHNld2hlcmUgKi8KKworCS8qIHNlZSBsaW51eC9uZXQvZXRoZXJuZXQvZXRoLmMgdG8gc2VlIHdoZXJlIEkgZ290IHRoZSBmb2xsb3dpbmcgKi8KKworCWlmIChkZXYtPmZsYWdzICYgKElGRl9MT09QQkFDSyB8IElGRl9OT0FSUCkpIHsKKwkJLyogCisJCSAqIEZJWE1FOiBmaWxsIGluIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGRlc3QgaXBhZGRyIGhlcmUgdG8gYmV0dGVyCisJCSAqIGNvbXBseSB3aXRoIFJGQzEwNTEgaW4gIm5vYXJwIiBtb2RlLiAgRm9yIG5vdywgYWx3YXlzIGJyb2FkY2FzdGluZworCQkgKiB3aWxsIHByb2JhYmx5IGF0IGxlYXN0IGdldCBwYWNrZXRzIHNlbnQgb3V0IDopCisJCSAqLworCQlwa3QtPmhhcmQuZGVzdCA9IDA7CisJCXJldHVybiBoZHJfc2l6ZTsKKwl9CisJLyogb3RoZXJ3aXNlLCBkcm9wIGluIHRoZSBkZXN0IGFkZHJlc3MgKi8KKwlwa3QtPmhhcmQuZGVzdCA9IGRhZGRyOworCXJldHVybiBoZHJfc2l6ZTsKK30KKworCitzdGF0aWMgdm9pZCBsb2FkX3BrdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYXJjX2hhcmR3YXJlICpoYXJkLAorCQkgICAgIHN0cnVjdCBhcmNfcmZjMTIwMSAqc29mdCwgaW50IHNvZnRsZW4sIGludCBidWZudW0pCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IG9mczsKKworCS8qIGFzc3VtZSBsZW5ndGggPD0gWE1UVTogc29tZW9uZSBzaG91bGQgaGF2ZSBoYW5kbGVkIHRoYXQgYnkgbm93LiAqLworCisJaWYgKHNvZnRsZW4gPiBNaW5UVSkgeworCQloYXJkLT5vZmZzZXRbMF0gPSAwOworCQloYXJkLT5vZmZzZXRbMV0gPSBvZnMgPSA1MTIgLSBzb2Z0bGVuOworCX0gZWxzZSBpZiAoc29mdGxlbiA+IE1UVSkgewkvKiBleGNlcHRpb24gcGFja2V0IC0gYWRkIGFuIGV4dHJhIGhlYWRlciAqLworCQlzdHJ1Y3QgYXJjX3JmYzEyMDEgZXhjc29mdDsKKworCQlleGNzb2Z0LnByb3RvID0gc29mdC0+cHJvdG87CisJCWV4Y3NvZnQuc3BsaXRfZmxhZyA9IDB4ZmY7CisJCWV4Y3NvZnQuc2VxdWVuY2UgPSAweGZmZmY7CisKKwkJaGFyZC0+b2Zmc2V0WzBdID0gMDsKKwkJb2ZzID0gNTEyIC0gc29mdGxlbjsKKwkJaGFyZC0+b2Zmc2V0WzFdID0gb2ZzIC0gUkZDMTIwMV9IRFJfU0laRTsKKwkJbHAtPmh3LmNvcHlfdG9fY2FyZChkZXYsIGJ1Zm51bSwgb2ZzIC0gUkZDMTIwMV9IRFJfU0laRSwKKwkJCQkgICAgJmV4Y3NvZnQsIFJGQzEyMDFfSERSX1NJWkUpOworCX0gZWxzZQorCQloYXJkLT5vZmZzZXRbMF0gPSBvZnMgPSAyNTYgLSBzb2Z0bGVuOworCisJbHAtPmh3LmNvcHlfdG9fY2FyZChkZXYsIGJ1Zm51bSwgMCwgaGFyZCwgQVJDX0hEUl9TSVpFKTsKKwlscC0+aHcuY29weV90b19jYXJkKGRldiwgYnVmbnVtLCBvZnMsIHNvZnQsIHNvZnRsZW4pOworCisJbHAtPmxhc3Rsb2FkX2Rlc3QgPSBoYXJkLT5kZXN0OworfQorCisKK3N0YXRpYyBpbnQgcHJlcGFyZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYXJjaGRyICpwa3QsIGludCBsZW5ndGgsCisJCSAgICAgIGludCBidWZudW0pCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJY29uc3QgaW50IG1heHNlZ3NpemUgPSBYTVRVIC0gUkZDMTIwMV9IRFJfU0laRTsKKwlzdHJ1Y3QgT3V0Z29pbmcgKm91dDsKKworCisJQlVHTVNHKERfRFVSSU5HLCAicHJlcGFyZV90eDogdHhidWZzPSVkLyVkLyVkXG4iLAorCSAgICAgICBscC0+bmV4dF90eCwgbHAtPmN1cl90eCwgYnVmbnVtKTsKKworCWxlbmd0aCAtPSBBUkNfSERSX1NJWkU7CS8qIGhhcmQgaGVhZGVyIGlzIG5vdCBpbmNsdWRlZCBpbiBwYWNrZXQgbGVuZ3RoICovCisJcGt0LT5zb2Z0LnJmYzEyMDEuc3BsaXRfZmxhZyA9IDA7CisKKwkvKiBuZWVkIHRvIGRvIGEgc3BsaXQgcGFja2V0PyAqLworCWlmIChsZW5ndGggPiBYTVRVKSB7CisJCW91dCA9ICZscC0+b3V0Z29pbmc7CisKKwkJb3V0LT5sZW5ndGggPSBsZW5ndGggLSBSRkMxMjAxX0hEUl9TSVpFOworCQlvdXQtPmRhdGFsZWZ0ID0gbHAtPm91dGdvaW5nLmxlbmd0aDsKKwkJb3V0LT5udW1zZWdzID0gKG91dC0+ZGF0YWxlZnQgKyBtYXhzZWdzaXplIC0gMSkgLyBtYXhzZWdzaXplOworCQlvdXQtPnNlZ251bSA9IDA7CisKKwkJQlVHTVNHKERfRFVSSU5HLCAicmZjMTIwMSBwcmVwX3R4OiByZWFkeSBmb3IgJWQtc2VnbWVudCBzcGxpdCAiCisJCSAgICAgICAiKCVkIGJ5dGVzLCBzZXE9JWQpXG4iLCBvdXQtPm51bXNlZ3MsIG91dC0+bGVuZ3RoLAorCQkgICAgICAgcGt0LT5zb2Z0LnJmYzEyMDEuc2VxdWVuY2UpOworCisJCXJldHVybiAwOwkvKiBub3QgZG9uZSAqLworCX0KKwkvKiBqdXN0IGxvYWQgdGhlIHBhY2tldCBpbnRvIHRoZSBidWZmZXJzIGFuZCBzZW5kIGl0IG9mZiAqLworCWxvYWRfcGt0KGRldiwgJnBrdC0+aGFyZCwgJnBrdC0+c29mdC5yZmMxMjAxLCBsZW5ndGgsIGJ1Zm51bSk7CisKKwlyZXR1cm4gMTsJCS8qIGRvbmUgKi8KK30KKworCitzdGF0aWMgaW50IGNvbnRpbnVlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0pCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IE91dGdvaW5nICpvdXQgPSAmbHAtPm91dGdvaW5nOworCXN0cnVjdCBhcmNfaGFyZHdhcmUgKmhhcmQgPSAmb3V0LT5wa3QtPmhhcmQ7CisJc3RydWN0IGFyY19yZmMxMjAxICpzb2Z0ID0gJm91dC0+cGt0LT5zb2Z0LnJmYzEyMDEsICpuZXdzb2Z0OworCWludCBtYXhzZWdzaXplID0gWE1UVSAtIFJGQzEyMDFfSERSX1NJWkU7CisJaW50IHNlZ2xlbjsKKworCUJVR01TRyhEX0RVUklORywKKwkgICJyZmMxMjAxIGNvbnRpbnVlX3R4OiBsb2FkaW5nIHNlZ21lbnQgJWQoKzEpIG9mICVkIChzZXE9JWQpXG4iLAorCSAgICAgICBvdXQtPnNlZ251bSwgb3V0LT5udW1zZWdzLCBzb2Z0LT5zZXF1ZW5jZSk7CisKKwkvKiB0aGUgIm5ldyIgc29mdCBoZWFkZXIgY29tZXMgcmlnaHQgYmVmb3JlIHRoZSBkYXRhIGNodW5rICovCisJbmV3c29mdCA9IChzdHJ1Y3QgYXJjX3JmYzEyMDEgKikKKwkgICAgKG91dC0+cGt0LT5zb2Z0LnJhdyArIG91dC0+bGVuZ3RoIC0gb3V0LT5kYXRhbGVmdCk7CisKKwlpZiAoIW91dC0+c2VnbnVtKQkvKiBmaXJzdCBwYWNrZXQ7IG5ld3NvZnQgPT0gc29mdCAqLworCQluZXdzb2Z0LT5zcGxpdF9mbGFnID0gKChvdXQtPm51bXNlZ3MgLSAyKSA8PCAxKSB8IDE7CisJZWxzZSB7CisJCW5ld3NvZnQtPnNwbGl0X2ZsYWcgPSBvdXQtPnNlZ251bSA8PCAxOworCQluZXdzb2Z0LT5wcm90byA9IHNvZnQtPnByb3RvOworCQluZXdzb2Z0LT5zZXF1ZW5jZSA9IHNvZnQtPnNlcXVlbmNlOworCX0KKworCXNlZ2xlbiA9IG1heHNlZ3NpemU7CisJaWYgKHNlZ2xlbiA+IG91dC0+ZGF0YWxlZnQpCisJCXNlZ2xlbiA9IG91dC0+ZGF0YWxlZnQ7CisJb3V0LT5kYXRhbGVmdCAtPSBzZWdsZW47CisKKwlsb2FkX3BrdChkZXYsIGhhcmQsIG5ld3NvZnQsIHNlZ2xlbiArIFJGQzEyMDFfSERSX1NJWkUsIGJ1Zm51bSk7CisKKwlvdXQtPnNlZ251bSsrOworCWlmIChvdXQtPnNlZ251bSA+PSBvdXQtPm51bXNlZ3MpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmlhZG5lLmMgYi9kcml2ZXJzL25ldC9hcmlhZG5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlOTNhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FyaWFkbmUuYwpAQCAtMCwwICsxLDg3OCBAQAorLyoKKyAqICBBbWlnYSBMaW51eC9tNjhrIEFyaWFkbmUgRXRoZXJuZXQgRHJpdmVyCisgKgorICogIKkgQ29weXJpZ2h0IDE5OTUtMjAwMyBieSBHZWVydCBVeXR0ZXJob2V2ZW4gKGdlZXJ0QGxpbnV4LW02OGsub3JnKQorICoJCQkgICAgIFBldGVyIERlIFNjaHJpanZlciAocDJAbWluZC5iZSkKKyAqCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBiYXNlZCBvbgorICoKKyAqCWxhbmNlLmM6CUFuIEFNRCBMQU5DRSBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LgorICoJCQlXcml0dGVuIDE5OTMtOTQgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKglBbTc5Qzk2MDoJUENuZXQodG0pLUlTQSBTaW5nbGUtQ2hpcCBFdGhlcm5ldCBDb250cm9sbGVyCisgKgkJCUFkdmFuY2VkIE1pY3JvIERldmljZXMKKyAqCQkJUHVibGljYXRpb24gIzE2OTA3LCBSZXYuIEIsIEFtZW5kbWVudC8wLCBNYXkgMTk5NAorICoKKyAqCU1DNjgyMzA6CVBhcmFsbGVsIEludGVyZmFjZS9UaW1lciAoUEkvVCkKKyAqCQkJTW90b3JvbGEgU2VtaWNvbmR1Y3RvcnMsIERlY2VtYmVyLCAxOTgzCisgKgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4CisgKiAgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGUgQXJpYWRuZSBpcyBhIFpvcnJvLUlJIGJvYXJkIG1hZGUgYnkgVmlsbGFnZSBUcm9uaWMuIEl0IGNvbnRhaW5zOgorICoKKyAqCS0gYW4gQW03OUM5NjAgUENuZXQtSVNBIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIgd2l0aCBib3RoCisgKgkgIDEwQkFTRS0yICh0aGluIGNvYXgpIGFuZCAxMEJBU0UtVCAoVVRQKSBjb25uZWN0b3JzCisgKgorICoJLSBhbiBNQzY4MjMwIFBhcmFsbGVsIEludGVyZmFjZS9UaW1lciBjb25maWd1cmVkIGFzIDIgcGFyYWxsZWwgcG9ydHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvem9ycm8uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgImFyaWFkbmUuaCIKKworCisjaWZkZWYgQVJJQURORV9ERUJVRworaW50IGFyaWFkbmVfZGVidWcgPSBBUklBRE5FX0RFQlVHOworI2Vsc2UKK2ludCBhcmlhZG5lX2RlYnVnID0gMTsKKyNlbmRpZgorCisKKyAgICAvKgorICAgICAqCU1hY3JvcyB0byBGaXggRW5kaWFubmVzcyBwcm9ibGVtcworICAgICAqLworCisJCQkJLyogU3dhcCB0aGUgQnl0ZXMgaW4gYSBXT1JEICovCisjZGVmaW5lIHN3YXB3KHgpCSgoKHg+PjgpJjB4MDBmZil8KCh4PDw4KSYweGZmMDApKQorCQkJCS8qIEdldCB0aGUgTG93IEJZVEUgaW4gYSBXT1JEICovCisjZGVmaW5lIGxvd2IoeCkJCSh4JjB4ZmYpCisJCQkJLyogR2V0IHRoZSBTd2FwcGVkIEhpZ2ggV09SRCBpbiBhIExPTkcgKi8KKyNkZWZpbmUgc3doaWdodyh4KQkoKCgoeCk+PjgpJjB4ZmYwMCl8KCgoeCk+PjI0KSYweDAwZmYpKQorCQkJCS8qIEdldCB0aGUgU3dhcHBlZCBMb3cgV09SRCBpbiBhIExPTkcgKi8KKyNkZWZpbmUgc3dsb3d3KHgpCSgoKCh4KTw8OCkmMHhmZjAwKXwoKCh4KT4+OCkmMHgwMGZmKSkKKworCisgICAgLyoKKyAgICAgKglUcmFuc21pdC9SZWNlaXZlIFJpbmcgRGVmaW5pdGlvbnMKKyAgICAgKi8KKworI2RlZmluZSBUWF9SSU5HX1NJWkUJNQorI2RlZmluZSBSWF9SSU5HX1NJWkUJMTYKKworI2RlZmluZSBQS1RfQlVGX1NJWkUJMTUyMAorCisKKyAgICAvKgorICAgICAqCVByaXZhdGUgRGV2aWNlIERhdGEKKyAgICAgKi8KKworc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSB7CisgICAgdm9sYXRpbGUgc3RydWN0IFREUkUgKnR4X3JpbmdbVFhfUklOR19TSVpFXTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgUkRSRSAqcnhfcmluZ1tSWF9SSU5HX1NJWkVdOworICAgIHZvbGF0aWxlIHVfc2hvcnQgKnR4X2J1ZmZbVFhfUklOR19TSVpFXTsKKyAgICB2b2xhdGlsZSB1X3Nob3J0ICpyeF9idWZmW1JYX1JJTkdfU0laRV07CisgICAgaW50IGN1cl90eCwgY3VyX3J4OwkJCS8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSAqLworICAgIGludCBkaXJ0eV90eDsJCQkvKiBUaGUgcmluZyBlbnRyaWVzIHRvIGJlIGZyZWUoKWVkLiAqLworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworICAgIGNoYXIgdHhfZnVsbDsKK307CisKKworICAgIC8qCisgICAgICoJU3RydWN0dXJlIENyZWF0ZWQgaW4gdGhlIEFyaWFkbmUncyBSQU0gQnVmZmVyCisgICAgICovCisKK3N0cnVjdCBsYW5jZWRhdGEgeworICAgIHN0cnVjdCBURFJFIHR4X3JpbmdbVFhfUklOR19TSVpFXTsKKyAgICBzdHJ1Y3QgUkRSRSByeF9yaW5nW1JYX1JJTkdfU0laRV07CisgICAgdV9zaG9ydCB0eF9idWZmW1RYX1JJTkdfU0laRV1bUEtUX0JVRl9TSVpFL3NpemVvZih1X3Nob3J0KV07CisgICAgdV9zaG9ydCByeF9idWZmW1JYX1JJTkdfU0laRV1bUEtUX0JVRl9TSVpFL3NpemVvZih1X3Nob3J0KV07Cit9OworCitzdGF0aWMgaW50IGFyaWFkbmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGFyaWFkbmVfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhcmlhZG5lX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhcmlhZG5lX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGFyaWFkbmVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhcmlhZG5lX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGFyaWFkbmVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpmcCk7CitzdGF0aWMgaW50IGFyaWFkbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFyaWFkbmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2lmZGVmIEhBVkVfTVVMVElDQVNUCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKworCitzdGF0aWMgdm9pZCBtZW1jcHl3KHZvbGF0aWxlIHVfc2hvcnQgKmRlc3QsIHVfc2hvcnQgKnNyYywgaW50IGxlbikKK3sKKyAgICB3aGlsZSAobGVuID49IDIpIHsKKwkqKGRlc3QrKykgPSAqKHNyYysrKTsKKwlsZW4gLT0gMjsKKyAgICB9CisgICAgaWYgKGxlbiA9PSAxKQorCSpkZXN0ID0gKCoodV9jaGFyICopc3JjKTw8ODsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhcmlhZG5lX2luaXRfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnosCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHpvcnJvX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhcmlhZG5lX3JlbW92ZV9vbmUoc3RydWN0IHpvcnJvX2RldiAqeik7CisKKworc3RhdGljIHN0cnVjdCB6b3Jyb19kZXZpY2VfaWQgYXJpYWRuZV96b3Jyb190YmxbXSBfX2RldmluaXRkYXRhID0geworICAgIHsgWk9SUk9fUFJPRF9WSUxMQUdFX1RST05JQ19BUklBRE5FIH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgem9ycm9fZHJpdmVyIGFyaWFkbmVfZHJpdmVyID0geworICAgIC5uYW1lCT0gImFyaWFkbmUiLAorICAgIC5pZF90YWJsZQk9IGFyaWFkbmVfem9ycm9fdGJsLAorICAgIC5wcm9iZQk9IGFyaWFkbmVfaW5pdF9vbmUsCisgICAgLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGFyaWFkbmVfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhcmlhZG5lX2luaXRfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnosCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHpvcnJvX2RldmljZV9pZCAqZW50KQoreworICAgIHVuc2lnbmVkIGxvbmcgYm9hcmQgPSB6LT5yZXNvdXJjZS5zdGFydDsKKyAgICB1bnNpZ25lZCBsb25nIGJhc2VfYWRkciA9IGJvYXJkK0FSSUFETkVfTEFOQ0U7CisgICAgdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQgPSBib2FyZCtBUklBRE5FX1JBTTsKKyAgICBzdHJ1Y3QgcmVzb3VyY2UgKnIxLCAqcjI7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2OworICAgIGludCBlcnI7CisKKyAgICByMSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihiYXNlX2FkZHIsIHNpemVvZihzdHJ1Y3QgQW03OUM5NjApLCAiQW03OUM5NjAiKTsKKyAgICBpZiAoIXIxKQorCXJldHVybiAtRUJVU1k7CisgICAgcjIgPSByZXF1ZXN0X21lbV9yZWdpb24obWVtX3N0YXJ0LCBBUklBRE5FX1JBTV9TSVpFLCAiUkFNIik7CisgICAgaWYgKCFyMikgeworCXJlbGVhc2VfcmVzb3VyY2UocjEpOworCXJldHVybiAtRUJVU1k7CisgICAgfQorCisgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUpKTsKKyAgICBpZiAoZGV2ID09IE5VTEwpIHsKKwlyZWxlYXNlX3Jlc291cmNlKHIxKTsKKwlyZWxlYXNlX3Jlc291cmNlKHIyKTsKKwlyZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAgcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICByMS0+bmFtZSA9IGRldi0+bmFtZTsKKyAgICByMi0+bmFtZSA9IGRldi0+bmFtZTsKKworICAgIGRldi0+ZGV2X2FkZHJbMF0gPSAweDAwOworICAgIGRldi0+ZGV2X2FkZHJbMV0gPSAweDYwOworICAgIGRldi0+ZGV2X2FkZHJbMl0gPSAweDMwOworICAgIGRldi0+ZGV2X2FkZHJbM10gPSAoei0+cm9tLmVyX1NlcmlhbE51bWJlcj4+MTYpICYgMHhmZjsKKyAgICBkZXYtPmRldl9hZGRyWzRdID0gKHotPnJvbS5lcl9TZXJpYWxOdW1iZXI+PjgpICYgMHhmZjsKKyAgICBkZXYtPmRldl9hZGRyWzVdID0gei0+cm9tLmVyX1NlcmlhbE51bWJlciAmIDB4ZmY7CisgICAgZGV2LT5iYXNlX2FkZHIgPSBaVFdPX1ZBRERSKGJhc2VfYWRkcik7CisgICAgZGV2LT5tZW1fc3RhcnQgPSBaVFdPX1ZBRERSKG1lbV9zdGFydCk7CisgICAgZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQrQVJJQURORV9SQU1fU0laRTsKKworICAgIGRldi0+b3BlbiA9ICZhcmlhZG5lX29wZW47CisgICAgZGV2LT5zdG9wID0gJmFyaWFkbmVfY2xvc2U7CisgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmYXJpYWRuZV9zdGFydF94bWl0OworICAgIGRldi0+dHhfdGltZW91dCA9ICZhcmlhZG5lX3R4X3RpbWVvdXQ7CisgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CisgICAgZGV2LT5nZXRfc3RhdHMgPSAmYXJpYWRuZV9nZXRfc3RhdHM7CisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworCisgICAgZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgaWYgKGVycikgeworCXJlbGVhc2VfcmVzb3VyY2UocjEpOworCXJlbGVhc2VfcmVzb3VyY2UocjIpOworCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIGVycjsKKyAgICB9CisgICAgem9ycm9fc2V0X2RydmRhdGEoeiwgZGV2KTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBBcmlhZG5lIGF0IDB4JTA4bHgsIEV0aGVybmV0IEFkZHJlc3MgIgorCSAgICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgZGV2LT5uYW1lLCBib2FyZCwKKwkgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCSAgIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhcmlhZG5lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CisgICAgdV9zaG9ydCBpbjsKKyAgICB1X2xvbmcgdmVyc2lvbjsKKyAgICBpbnQgaTsKKworICAgIC8qIFJlc2V0IHRoZSBMQU5DRSAqLworICAgIGluID0gbGFuY2UtPlJlc2V0OworCisgICAgLyogU3RvcCB0aGUgTEFOQ0UgKi8KKyAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworICAgIGxhbmNlLT5SRFAgPSBTVE9QOworCisgICAgLyogQ2hlY2sgdGhlIExBTkNFIHZlcnNpb24gKi8KKyAgICBsYW5jZS0+UkFQID0gQ1NSODg7CQkvKiBDaGlwIElEICovCisgICAgdmVyc2lvbiA9IHN3YXB3KGxhbmNlLT5SRFApOworICAgIGxhbmNlLT5SQVAgPSBDU1I4OTsJCS8qIENoaXAgSUQgKi8KKyAgICB2ZXJzaW9uIHw9IHN3YXB3KGxhbmNlLT5SRFApPDwxNjsKKyAgICBpZiAoKHZlcnNpb24gJiAweDAwMDAwZmZmKSAhPSAweDAwMDAwMDAzKSB7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiYXJpYWRuZV9vcGVuOiBDb3VsZG4ndCBmaW5kIEFNRCBFdGhlcm5ldCBDaGlwXG4iKTsKKwlyZXR1cm4gLUVBR0FJTjsKKyAgICB9CisgICAgaWYgKCh2ZXJzaW9uICYgMHgwZmZmZjAwMCkgIT0gMHgwMDAwMzAwMCkgeworCXByaW50ayhLRVJOX1dBUk5JTkcgImFyaWFkbmVfb3BlbjogQ291bGRuJ3QgZmluZCBBbTc5Qzk2MCAoV3JvbmcgcGFydCAiCisJICAgICAgICJudW1iZXIgPSAlbGQpXG4iLCAodmVyc2lvbiAmIDB4MGZmZmYwMDApPj4xMik7CisJcmV0dXJuIC1FQUdBSU47CisgICAgfQorI2lmIDAKKyAgICBwcmludGsoS0VSTl9ERUJVRyAiYXJpYWRuZV9vcGVuOiBBbTc5Qzk2MCAoUENuZXQtSVNBKSBSZXZpc2lvbiAlbGRcbiIsCisJICAgKHZlcnNpb24gJiAweGYwMDAwMDAwKT4+MjgpOworI2VuZGlmCisKKyAgICBhcmlhZG5lX2luaXRfcmluZyhkZXYpOworCisgICAgLyogTWlzY2VsbGFuZW91cyBTdHVmZiAqLworICAgIGxhbmNlLT5SQVAgPSBDU1IzOwkJLyogSW50ZXJydXB0IE1hc2tzIGFuZCBEZWZlcnJhbCBDb250cm9sICovCisgICAgbGFuY2UtPlJEUCA9IDB4MDAwMDsKKyAgICBsYW5jZS0+UkFQID0gQ1NSNDsJCS8qIFRlc3QgYW5kIEZlYXR1cmVzIENvbnRyb2wgKi8KKyAgICBsYW5jZS0+UkRQID0gRFBPTEx8QVBBRF9YTVR8TUZDT018UkNWQ0NPTXxUWFNUUlRNfEpBQk07CisKKyAgICAvKiBTZXQgdGhlIE11bHRpY2FzdCBUYWJsZSAqLworICAgIGxhbmNlLT5SQVAgPSBDU1I4OwkJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciwgTEFEUkZbMTU6MF0gKi8KKyAgICBsYW5jZS0+UkRQID0gMHgwMDAwOworICAgIGxhbmNlLT5SQVAgPSBDU1I5OwkJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciwgTEFEUkZbMzE6MTZdICovCisgICAgbGFuY2UtPlJEUCA9IDB4MDAwMDsKKyAgICBsYW5jZS0+UkFQID0gQ1NSMTA7CQkvKiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyLCBMQURSRls0NzozMl0gKi8KKyAgICBsYW5jZS0+UkRQID0gMHgwMDAwOworICAgIGxhbmNlLT5SQVAgPSBDU1IxMTsJCS8qIExvZ2ljYWwgQWRkcmVzcyBGaWx0ZXIsIExBRFJGWzYzOjQ4XSAqLworICAgIGxhbmNlLT5SRFAgPSAweDAwMDA7CisKKyAgICAvKiBTZXQgdGhlIEV0aGVybmV0IEhhcmR3YXJlIEFkZHJlc3MgKi8KKyAgICBsYW5jZS0+UkFQID0gQ1NSMTI7CQkvKiBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyLCBQQURSWzE1OjBdICovCisgICAgbGFuY2UtPlJEUCA9ICgodV9zaG9ydCAqKSZkZXYtPmRldl9hZGRyWzBdKVswXTsKKyAgICBsYW5jZS0+UkFQID0gQ1NSMTM7CQkvKiBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyLCBQQURSWzMxOjE2XSAqLworICAgIGxhbmNlLT5SRFAgPSAoKHVfc2hvcnQgKikmZGV2LT5kZXZfYWRkclswXSlbMV07CisgICAgbGFuY2UtPlJBUCA9IENTUjE0OwkJLyogUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciwgUEFEUls0NzozMl0gKi8KKyAgICBsYW5jZS0+UkRQID0gKCh1X3Nob3J0ICopJmRldi0+ZGV2X2FkZHJbMF0pWzJdOworCisgICAgLyogU2V0IHRoZSBJbml0IEJsb2NrIE1vZGUgKi8KKyAgICBsYW5jZS0+UkFQID0gQ1NSMTU7CQkvKiBNb2RlIFJlZ2lzdGVyICovCisgICAgbGFuY2UtPlJEUCA9IDB4MDAwMDsKKworICAgIC8qIFNldCB0aGUgVHJhbnNtaXQgRGVzY3JpcHRvciBSaW5nIFBvaW50ZXIgKi8KKyAgICBsYW5jZS0+UkFQID0gQ1NSMzA7CQkvKiBCYXNlIEFkZHJlc3Mgb2YgVHJhbnNtaXQgUmluZyAqLworICAgIGxhbmNlLT5SRFAgPSBzd2xvd3coQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgdHhfcmluZykpOworICAgIGxhbmNlLT5SQVAgPSBDU1IzMTsJCS8qIEJhc2UgQWRkcmVzcyBvZiB0cmFuc21pdCBSaW5nICovCisgICAgbGFuY2UtPlJEUCA9IHN3aGlnaHcoQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgdHhfcmluZykpOworCisgICAgLyogU2V0IHRoZSBSZWNlaXZlIERlc2NyaXB0b3IgUmluZyBQb2ludGVyICovCisgICAgbGFuY2UtPlJBUCA9IENTUjI0OwkJLyogQmFzZSBBZGRyZXNzIG9mIFJlY2VpdmUgUmluZyAqLworICAgIGxhbmNlLT5SRFAgPSBzd2xvd3coQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgcnhfcmluZykpOworICAgIGxhbmNlLT5SQVAgPSBDU1IyNTsJCS8qIEJhc2UgQWRkcmVzcyBvZiBSZWNlaXZlIFJpbmcgKi8KKyAgICBsYW5jZS0+UkRQID0gc3doaWdodyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCByeF9yaW5nKSk7CisKKyAgICAvKiBTZXQgdGhlIE51bWJlciBvZiBSWCBhbmQgVFggUmluZyBFbnRyaWVzICovCisgICAgbGFuY2UtPlJBUCA9IENTUjc2OwkJLyogUmVjZWl2ZSBSaW5nIExlbmd0aCAqLworICAgIGxhbmNlLT5SRFAgPSBzd2FwdygoKHVfc2hvcnQpLVJYX1JJTkdfU0laRSkpOworICAgIGxhbmNlLT5SQVAgPSBDU1I3ODsJCS8qIFRyYW5zbWl0IFJpbmcgTGVuZ3RoICovCisgICAgbGFuY2UtPlJEUCA9IHN3YXB3KCgodV9zaG9ydCktVFhfUklOR19TSVpFKSk7CisKKyAgICAvKiBFbmFibGUgTWVkaWEgSW50ZXJmYWNlIFBvcnQgQXV0byBTZWxlY3QgKDEwQkFTRS0yLzEwQkFTRS1UKSAqLworICAgIGxhbmNlLT5SQVAgPSBJU0FDU1IyOwkvKiBNaXNjZWxsYW5lb3VzIENvbmZpZ3VyYXRpb24gKi8KKyAgICBsYW5jZS0+SURQID0gQVNFTDsKKworICAgIC8qIExFRCBDb250cm9sICovCisgICAgbGFuY2UtPlJBUCA9IElTQUNTUjU7CS8qIExFRDEgU3RhdHVzICovCisgICAgbGFuY2UtPklEUCA9IFBTRXxYTVRFOworICAgIGxhbmNlLT5SQVAgPSBJU0FDU1I2OwkvKiBMRUQyIFN0YXR1cyAqLworICAgIGxhbmNlLT5JRFAgPSBQU0V8Q09MRTsKKyAgICBsYW5jZS0+UkFQID0gSVNBQ1NSNzsJLyogTEVEMyBTdGF0dXMgKi8KKyAgICBsYW5jZS0+SURQID0gUFNFfFJDVkU7CisKKyAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisgICAgaSA9IHJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgYXJpYWRuZV9pbnRlcnJ1cHQsIFNBX1NISVJRLAorICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGRldik7CisgICAgaWYgKGkpIHJldHVybiBpOworCisgICAgbGFuY2UtPlJBUCA9IENTUjA7CQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KKyAgICBsYW5jZS0+UkRQID0gSU5FQXxTVFJUOworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgYXJpYWRuZV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VkYXRhICpsYW5jZWRhdGEgPSAoc3RydWN0IGxhbmNlZGF0YSAqKWRldi0+bWVtX3N0YXJ0OworICAgIGludCBpOworCisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgcHJpdi0+dHhfZnVsbCA9IDA7CisgICAgcHJpdi0+Y3VyX3J4ID0gcHJpdi0+Y3VyX3R4ID0gMDsKKyAgICBwcml2LT5kaXJ0eV90eCA9IDA7CisKKyAgICAvKiBTZXQgdXAgVFggUmluZyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCXZvbGF0aWxlIHN0cnVjdCBURFJFICp0ID0gJmxhbmNlZGF0YS0+dHhfcmluZ1tpXTsKKwl0LT5UTUQwID0gc3dsb3d3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHR4X2J1ZmZbaV0pKTsKKwl0LT5UTUQxID0gc3doaWdodyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCB0eF9idWZmW2ldKSkgfAorCQkgIFRGX1NUUCB8IFRGX0VOUDsKKwl0LT5UTUQyID0gc3dhcHcoKHVfc2hvcnQpLVBLVF9CVUZfU0laRSk7CisJdC0+VE1EMyA9IDA7CisJcHJpdi0+dHhfcmluZ1tpXSA9ICZsYW5jZWRhdGEtPnR4X3JpbmdbaV07CisJcHJpdi0+dHhfYnVmZltpXSA9IGxhbmNlZGF0YS0+dHhfYnVmZltpXTsKKyNpZiAwCisJcHJpbnRrKEtFUk5fREVCVUcgIlRYIEVudHJ5ICUyZCBhdCAlcCwgQnVmIGF0ICVwXG4iLCBpLAorCSAgICAgICAmbGFuY2VkYXRhLT50eF9yaW5nW2ldLCBsYW5jZWRhdGEtPnR4X2J1ZmZbaV0pOworI2VuZGlmCisgICAgfQorCisgICAgLyogU2V0IHVwIFJYIFJpbmcgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwl2b2xhdGlsZSBzdHJ1Y3QgUkRSRSAqciA9ICZsYW5jZWRhdGEtPnJ4X3JpbmdbaV07CisJci0+Uk1EMCA9IHN3bG93dyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCByeF9idWZmW2ldKSk7CisJci0+Uk1EMSA9IHN3aGlnaHcoQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgcnhfYnVmZltpXSkpIHwKKwkJICBSRl9PV047CisJci0+Uk1EMiA9IHN3YXB3KCh1X3Nob3J0KS1QS1RfQlVGX1NJWkUpOworCXItPlJNRDMgPSAweDAwMDA7CisJcHJpdi0+cnhfcmluZ1tpXSA9ICZsYW5jZWRhdGEtPnJ4X3JpbmdbaV07CisJcHJpdi0+cnhfYnVmZltpXSA9IGxhbmNlZGF0YS0+cnhfYnVmZltpXTsKKyNpZiAwCisJcHJpbnRrKEtFUk5fREVCVUcgIlJYIEVudHJ5ICUyZCBhdCAlcCwgQnVmIGF0ICVwXG4iLCBpLAorCSAgICAgICAmbGFuY2VkYXRhLT5yeF9yaW5nW2ldLCBsYW5jZWRhdGEtPnJ4X2J1ZmZbaV0pOworI2VuZGlmCisgICAgfQorfQorCisKK3N0YXRpYyBpbnQgYXJpYWRuZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgIGxhbmNlLT5SQVAgPSBDU1IxMTI7CS8qIE1pc3NlZCBGcmFtZSBDb3VudCAqLworICAgIHByaXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBzd2FwdyhsYW5jZS0+UkRQKTsKKyAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworCisgICAgaWYgKGFyaWFkbmVfZGVidWcgPiAxKSB7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlMi4yeC5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgbGFuY2UtPlJEUCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlbHUgcGFja2V0cyBtaXNzZWRcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgcHJpdi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyk7CisgICAgfQorCisgICAgLyogV2Ugc3RvcCB0aGUgTEFOQ0UgaGVyZSAtLSBpdCBvY2Nhc2lvbmFsbHkgcG9sbHMgbWVtb3J5IGlmIHdlIGRvbid0LiAqLworICAgIGxhbmNlLT5SRFAgPSBTVE9QOworCisgICAgZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGFyaWFkbmVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CisKKyAgICBsYW5jZS0+UkFQID0gQ1NSMDsJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCisgICAgbGFuY2UtPlJEUCA9IFNUT1A7CisgICAgYXJpYWRuZV9pbml0X3JpbmcoZGV2KTsKKyAgICBsYW5jZS0+UkRQID0gSU5FQXxTVFJUOworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IGFyaWFkbmVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CisgICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdjsKKyAgICBpbnQgY3NyMCwgYm9ndXNjbnQ7CisgICAgaW50IGhhbmRsZWQgPSAwOworCisgICAgaWYgKGRldiA9PSBOVUxMKSB7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiYXJpYWRuZV9pbnRlcnJ1cHQoKTogaXJxIGZvciB1bmtub3duIGRldmljZS5cbiIpOworCXJldHVybiBJUlFfTk9ORTsKKyAgICB9CisKKyAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KKworICAgIGlmICghKGxhbmNlLT5SRFAgJiBJTlRSKSkJCS8qIENoZWNrIGlmIGFueSBpbnRlcnJ1cHQgaGFzIGJlZW4gKi8KKwlyZXR1cm4gSVJRX05PTkU7CQkvKiBnZW5lcmF0ZWQgYnkgdGhlIGJvYXJkLiAqLworCisgICAgcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICBib2d1c2NudCA9IDEwOworICAgIHdoaWxlICgoY3NyMCA9IGxhbmNlLT5SRFApICYgKEVSUnxSSU5UfFRJTlQpICYmIC0tYm9ndXNjbnQgPj0gMCkgeworCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworCWxhbmNlLT5SRFAgPSBjc3IwICYgfihJTkVBfFRETUR8U1RPUHxTVFJUfElOSVQpOworCisjaWYgMAorCWlmIChhcmlhZG5lX2RlYnVnID4gNSkgeworCSAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludGVycnVwdCAgY3NyMD0lIzIuMnggbmV3IGNzcj0lIzIuMnguIiwKKwkJICAgZGV2LT5uYW1lLCBjc3IwLCBsYW5jZS0+UkRQKTsKKwkgICAgcHJpbnRrKCJbIik7CisJICAgIGlmIChjc3IwICYgSU5UUikKKwkJcHJpbnRrKCIgSU5UUiIpOworCSAgICBpZiAoY3NyMCAmIElORUEpCisJCXByaW50aygiIElORUEiKTsKKwkgICAgaWYgKGNzcjAgJiBSWE9OKQorCQlwcmludGsoIiBSWE9OIik7CisJICAgIGlmIChjc3IwICYgVFhPTikKKwkJcHJpbnRrKCIgVFhPTiIpOworCSAgICBpZiAoY3NyMCAmIFRETUQpCisJCXByaW50aygiIFRETUQiKTsKKwkgICAgaWYgKGNzcjAgJiBTVE9QKQorCQlwcmludGsoIiBTVE9QIik7CisJICAgIGlmIChjc3IwICYgU1RSVCkKKwkJcHJpbnRrKCIgU1RSVCIpOworCSAgICBpZiAoY3NyMCAmIElOSVQpCisJCXByaW50aygiIElOSVQiKTsKKwkgICAgaWYgKGNzcjAgJiBFUlIpCisJCXByaW50aygiIEVSUiIpOworCSAgICBpZiAoY3NyMCAmIEJBQkwpCisJCXByaW50aygiIEJBQkwiKTsKKwkgICAgaWYgKGNzcjAgJiBDRVJSKQorCQlwcmludGsoIiBDRVJSIik7CisJICAgIGlmIChjc3IwICYgTUlTUykKKwkJcHJpbnRrKCIgTUlTUyIpOworCSAgICBpZiAoY3NyMCAmIE1FUlIpCisJCXByaW50aygiIE1FUlIiKTsKKwkgICAgaWYgKGNzcjAgJiBSSU5UKQorCQlwcmludGsoIiBSSU5UIik7CisJICAgIGlmIChjc3IwICYgVElOVCkKKwkJcHJpbnRrKCIgVElOVCIpOworCSAgICBpZiAoY3NyMCAmIElET04pCisJCXByaW50aygiIElET04iKTsKKwkgICAgcHJpbnRrKCIgXVxuIik7CisJfQorI2VuZGlmCisKKwlpZiAoY3NyMCAmIFJJTlQpIHsJLyogUnggaW50ZXJydXB0ICovCisJICAgIGhhbmRsZWQgPSAxOworCSAgICBhcmlhZG5lX3J4KGRldik7CisJfQorCisJaWYgKGNzcjAgJiBUSU5UKSB7CS8qIFR4LWRvbmUgaW50ZXJydXB0ICovCisJICAgIGludCBkaXJ0eV90eCA9IHByaXYtPmRpcnR5X3R4OworCisJICAgIGhhbmRsZWQgPSAxOworCSAgICB3aGlsZSAoZGlydHlfdHggPCBwcml2LT5jdXJfdHgpIHsKKwkJaW50IGVudHJ5ID0gZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CisJCWludCBzdGF0dXMgPSBsb3diKHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQxKTsKKworCQlpZiAoc3RhdHVzICYgVEZfT1dOKQorCQkgICAgYnJlYWs7CS8qIEl0IHN0aWxsIGhhc24ndCBiZWVuIFR4ZWQgKi8KKworCQlwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMSAmPSAweGZmMDA7CisKKwkJaWYgKHN0YXR1cyAmIFRGX0VSUikgeworCQkgICAgLyogVGhlcmUgd2FzIGFuIG1ham9yIGVycm9yLCBsb2cgaXQuICovCisJCSAgICBpbnQgZXJyX3N0YXR1cyA9IHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQzOworCQkgICAgcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7CisJCSAgICBpZiAoZXJyX3N0YXR1cyAmIEVGX1JUUlkpCisJCQlwcml2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkgICAgaWYgKGVycl9zdGF0dXMgJiBFRl9MQ0FSKQorCQkJcHJpdi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJICAgIGlmIChlcnJfc3RhdHVzICYgRUZfTENPTCkKKwkJCXByaXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJICAgIGlmIChlcnJfc3RhdHVzICYgRUZfVUZMTykgeworCQkJLyogQWNrayEgIE9uIEZJRk8gZXJyb3JzIHRoZSBUeCB1bml0IGlzIHR1cm5lZCBvZmYhICovCisJCQlwcml2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJLyogUmVtb3ZlIHRoaXMgdmVyYm9zaXR5IGxhdGVyISAqLworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVHggRklGTyBlcnJvciEgU3RhdHVzICU0LjR4LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGNzcjApOworCQkJLyogUmVzdGFydCB0aGUgY2hpcC4gKi8KKwkJCWxhbmNlLT5SRFAgPSBTVFJUOworCQkgICAgfQorCQl9IGVsc2UgeworCQkgICAgaWYgKHN0YXR1cyAmIChURl9NT1JFfFRGX09ORSkpCisJCQlwcml2LT5zdGF0cy5jb2xsaXNpb25zKys7CisJCSAgICBwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCX0KKwkJZGlydHlfdHgrKzsKKwkgICAgfQorCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkgICAgaWYgKHByaXYtPmN1cl90eCAtIGRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIgIm91dC1vZi1zeW5jIGRpcnR5IHBvaW50ZXIsICVkIHZzLiAlZCwgIgorCQkgICAgICAgImZ1bGw9JWQuXG4iLCBkaXJ0eV90eCwgcHJpdi0+Y3VyX3R4LCBwcml2LT50eF9mdWxsKTsKKwkJZGlydHlfdHggKz0gVFhfUklOR19TSVpFOworCSAgICB9CisjZW5kaWYKKworCSAgICBpZiAocHJpdi0+dHhfZnVsbCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkJZGlydHlfdHggPiBwcml2LT5jdXJfdHggLSBUWF9SSU5HX1NJWkUgKyAyKSB7CisJCS8qIFRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsLiAqLworCQlwcml2LT50eF9mdWxsID0gMDsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCSAgICB9CisKKwkgICAgcHJpdi0+ZGlydHlfdHggPSBkaXJ0eV90eDsKKwl9CisKKwkvKiBMb2cgbWlzYyBlcnJvcnMuICovCisJaWYgKGNzcjAgJiBCQUJMKSB7CisJICAgIGhhbmRsZWQgPSAxOworCSAgICBwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsJLyogVHggYmFiYmxlLiAqLworCX0KKwlpZiAoY3NyMCAmIE1JU1MpIHsKKwkgICAgaGFuZGxlZCA9IDE7CisJICAgIHByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOwkvKiBNaXNzZWQgYSBSeCBmcmFtZS4gKi8KKwl9CisJaWYgKGNzcjAgJiBNRVJSKSB7CisJICAgIGhhbmRsZWQgPSAxOworCSAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBCdXMgbWFzdGVyIGFyYml0cmF0aW9uIGZhaWx1cmUsIHN0YXR1cyAiCisJCSAgICIlNC40eC5cbiIsIGRldi0+bmFtZSwgY3NyMCk7CisJICAgIC8qIFJlc3RhcnQgdGhlIGNoaXAuICovCisJICAgIGxhbmNlLT5SRFAgPSBTVFJUOworCX0KKyAgICB9CisKKyAgICAvKiBDbGVhciBhbnkgb3RoZXIgaW50ZXJydXB0LCBhbmQgc2V0IGludGVycnVwdCBlbmFibGUuICovCisgICAgbGFuY2UtPlJBUCA9IENTUjA7CQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KKyAgICBsYW5jZS0+UkRQID0gSU5FQXxCQUJMfENFUlJ8TUlTU3xNRVJSfElET047CisKKyNpZiAwCisgICAgaWYgKGFyaWFkbmVfZGVidWcgPiA0KQorCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIGNzciVkPSUjNC40eC5cbiIsIGRldi0+bmFtZSwKKwkgICAgICAgbGFuY2UtPlJBUCwgbGFuY2UtPlJEUCk7CisjZW5kaWYKKyAgICByZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCitzdGF0aWMgdm9pZCBhcmlhZG5lX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CisKKyAgICBwcmludGsoS0VSTl9FUlIgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlNC40eCwgcmVzZXR0aW5nLlxuIiwKKwkgICBkZXYtPm5hbWUsIGxhbmNlLT5SRFApOworICAgIGFyaWFkbmVfcmVzZXQoZGV2KTsKKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKworc3RhdGljIGludCBhcmlhZG5lX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGVudHJ5OworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgaW50IGxlbiA9IHNrYi0+bGVuOworCisjaWYgMAorICAgIGlmIChhcmlhZG5lX2RlYnVnID4gMykgeworCWxhbmNlLT5SQVAgPSBDU1IwOwkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGFyaWFkbmVfc3RhcnRfeG1pdCgpIGNhbGxlZCwgY3NyMCAlNC40eC5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgbGFuY2UtPlJEUCk7CisJbGFuY2UtPlJEUCA9IDB4MDAwMDsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIEZJWE1FOiBpcyB0aGUgNzlDOTYwIG5ldyBlbm91Z2ggdG8gZG8gaXRzIG93biBwYWRkaW5nIHJpZ2h0ID8gKi8KKyAgICBpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikKKyAgICB7CisgICAgCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKyAgICAJaWYgKHNrYiA9PSBOVUxMKQorICAgIAkgICAgcmV0dXJuIDA7CisgICAgCWxlbiA9IEVUSF9aTEVOOworICAgIH0KKworICAgIC8qIEZpbGwgaW4gYSBUeCByaW5nIGVudHJ5ICovCisKKyNpZiAwCisgICAgcHJpbnRrKEtFUk5fREVCVUcgIlRYIHBrdCB0eXBlIDB4JTA0eCBmcm9tICIsICgodV9zaG9ydCAqKXNrYi0+ZGF0YSlbNl0pOworICAgIHsKKwlpbnQgaTsKKwl1X2NoYXIgKnB0ciA9ICYoKHVfY2hhciAqKXNrYi0+ZGF0YSlbNl07CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkgICAgcHJpbnRrKCIlMDJ4IiwgcHRyW2ldKTsKKyAgICB9CisgICAgcHJpbnRrKCIgdG8gIik7CisgICAgeworCWludCBpOworCXVfY2hhciAqcHRyID0gKHVfY2hhciAqKXNrYi0+ZGF0YTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCSAgICBwcmludGsoIiUwMngiLCBwdHJbaV0pOworICAgIH0KKyAgICBwcmludGsoIiBkYXRhIDB4JTA4eCBsZW4gJWRcbiIsIChpbnQpc2tiLT5kYXRhLCAoaW50KXNrYi0+bGVuKTsKKyNlbmRpZgorCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisgICAgZW50cnkgPSBwcml2LT5jdXJfdHggJSBUWF9SSU5HX1NJWkU7CisKKyAgICAvKiBDYXV0aW9uOiB0aGUgd3JpdGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUsIHNldCB0aGUgYmFzZSBhZGRyZXNzIHdpdGgKKwkJdGhlICJvd25lcnNoaXAiIGJpdHMgbGFzdC4gKi8KKworICAgIHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQyID0gc3dhcHcoKHVfc2hvcnQpLXNrYi0+bGVuKTsKKyAgICBwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMyA9IDB4MDAwMDsKKyAgICBtZW1jcHl3KHByaXYtPnR4X2J1ZmZbZW50cnldLCAodV9zaG9ydCAqKXNrYi0+ZGF0YSwgbGVuKTsKKworI2lmIDAKKyAgICB7CisJaW50IGksIGxlbjsKKworCWxlbiA9IHNrYi0+bGVuID4gNjQgPyA2NCA6IHNrYi0+bGVuOworCWxlbiA+Pj0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHsKKwkgICAgaW50IGo7CisJICAgIHByaW50ayhLRVJOX0RFQlVHICIlMDR4OiIsIGkpOworCSAgICBmb3IgKGogPSAwOyAoaiA8IDgpICYmICgoaStqKSA8IGxlbik7IGorKykgeworCQlpZiAoIShqICYgMSkpCisJCSAgICBwcmludGsoIiAiKTsKKwkJcHJpbnRrKCIlMDR4IiwgcHJpdi0+dHhfYnVmZltlbnRyeV1baStqXSk7CisJICAgIH0KKwkgICAgcHJpbnRrKCJcbiIpOworCX0KKyAgICB9CisjZW5kaWYKKworICAgIHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQxID0gKHByaXYtPnR4X3JpbmdbZW50cnldLT5UTUQxJjB4ZmYwMCl8VEZfT1dOfFRGX1NUUHxURl9FTlA7CisKKyAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CisKKyAgICBwcml2LT5jdXJfdHgrKzsKKyAgICBpZiAoKHByaXYtPmN1cl90eCA+PSBUWF9SSU5HX1NJWkUpICYmIChwcml2LT5kaXJ0eV90eCA+PSBUWF9SSU5HX1NJWkUpKSB7CisKKyNpZiAwCisJcHJpbnRrKEtFUk5fREVCVUcgIioqKiBTdWJ0cmFjdGluZyBUWF9SSU5HX1NJWkUgZnJvbSBjdXJfdHggKCVkKSBhbmQgIgorCSAgICAgICAiZGlydHlfdHggKCVkKVxuIiwgcHJpdi0+Y3VyX3R4LCBwcml2LT5kaXJ0eV90eCk7CisjZW5kaWYKKworCXByaXYtPmN1cl90eCAtPSBUWF9SSU5HX1NJWkU7CisJcHJpdi0+ZGlydHlfdHggLT0gVFhfUklOR19TSVpFOworICAgIH0KKworICAgIC8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHNlbmQgcG9sbC4gKi8KKyAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworICAgIGxhbmNlLT5SRFAgPSBJTkVBfFRETUQ7CisKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworICAgIGlmIChsb3diKHByaXYtPnR4X3JpbmdbKGVudHJ5KzEpICUgVFhfUklOR19TSVpFXS0+VE1EMSkgIT0gMCkgeworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlwcml2LT50eF9mdWxsID0gMTsKKyAgICB9CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhcmlhZG5lX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGVudHJ5ID0gcHJpdi0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworICAgIGludCBpOworCisgICAgLyogSWYgd2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKyAgICB3aGlsZSAoIShsb3diKHByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQxKSAmIFJGX09XTikpIHsKKwlpbnQgc3RhdHVzID0gbG93Yihwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMSk7CisKKwlpZiAoc3RhdHVzICE9IChSRl9TVFB8UkZfRU5QKSkgewkvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCisJICAgIC8qIFRoZXJlIGlzIGEgdHJpY2t5IGVycm9yIG5vdGVkIGJ5IEpvaG4gTXVycGh5LAorCQk8bXVyZkBwZXJmdGVjaC5jb20+IHRvIFJ1c3MgTmVsc29uOiBFdmVuIHdpdGggZnVsbC1zaXplZAorCQlidWZmZXJzIGl0J3MgcG9zc2libGUgZm9yIGEgamFiYmVyIHBhY2tldCB0byB1c2UgdHdvCisJCWJ1ZmZlcnMsIHdpdGggb25seSB0aGUgbGFzdCBjb3JyZWN0bHkgbm90aW5nIHRoZSBlcnJvci4gKi8KKwkgICAgaWYgKHN0YXR1cyAmIFJGX0VOUCkKKwkJLyogT25seSBjb3VudCBhIGdlbmVyYWwgZXJyb3IgYXQgdGhlIGVuZCBvZiBhIHBhY2tldC4qLworCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkgICAgaWYgKHN0YXR1cyAmIFJGX0ZSQU0pCisJCXByaXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCSAgICBpZiAoc3RhdHVzICYgUkZfT0ZMTykKKwkJcHJpdi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkgICAgaWYgKHN0YXR1cyAmIFJGX0NSQykKKwkJcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCSAgICBpZiAoc3RhdHVzICYgUkZfQlVGRikKKwkJcHJpdi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkgICAgcHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEgJj0gMHhmZjAwfFJGX1NUUHxSRl9FTlA7CisJfSBlbHNlIHsKKwkgICAgLyogTWFsbG9jIHVwIG5ldyBidWZmZXIsIGNvbXBhdGlibGUgd2l0aCBuZXQtMy4gKi8KKwkgICAgc2hvcnQgcGt0X2xlbiA9IHN3YXB3KHByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQzKTsKKwkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCSAgICBza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMik7CisJICAgIGlmIChza2IgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQkgICAgaWYgKGxvd2IocHJpdi0+cnhfcmluZ1soZW50cnkraSkgJSBSWF9SSU5HX1NJWkVdLT5STUQxKSAmIFJGX09XTikKKwkJCWJyZWFrOworCisJCWlmIChpID4gUlhfUklOR19TSVpFLTIpIHsKKwkJICAgIHByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJICAgIHByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQxIHw9IFJGX09XTjsKKwkJICAgIHByaXYtPmN1cl9yeCsrOworCQl9CisJCWJyZWFrOworCSAgICB9CisKKworCSAgICBza2ItPmRldiA9IGRldjsKKwkgICAgc2tiX3Jlc2VydmUoc2tiLDIpOwkJLyogMTYgYnl0ZSBhbGlnbiAqLworCSAgICBza2JfcHV0KHNrYixwa3RfbGVuKTsJLyogTWFrZSByb29tICovCisJICAgIGV0aF9jb3B5X2FuZF9zdW0oc2tiLCAoY2hhciAqKXByaXYtPnJ4X2J1ZmZbZW50cnldLCBwa3RfbGVuLDApOworCSAgICBza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworI2lmIDAKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIlJYIHBrdCB0eXBlIDB4JTA0eCBmcm9tICIsCisJCSAgICgodV9zaG9ydCAqKXNrYi0+ZGF0YSlbNl0pOworCSAgICB7CisJCWludCBpOworCQl1X2NoYXIgKnB0ciA9ICYoKHVfY2hhciAqKXNrYi0+ZGF0YSlbNl07CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCSAgICBwcmludGsoIiUwMngiLCBwdHJbaV0pOworCSAgICB9CisJICAgIHByaW50aygiIHRvICIpOworCSAgICB7CisJCWludCBpOworCQl1X2NoYXIgKnB0ciA9ICh1X2NoYXIgKilza2ItPmRhdGE7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCSAgICBwcmludGsoIiUwMngiLCBwdHJbaV0pOworCSAgICB9CisJICAgIHByaW50aygiIGRhdGEgMHglMDh4IGxlbiAlZFxuIiwgKGludClza2ItPmRhdGEsIChpbnQpc2tiLT5sZW4pOworI2VuZGlmCisKKwkgICAgbmV0aWZfcngoc2tiKTsKKwkgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkgICAgcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworCSAgICBwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCX0KKworCXByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQxIHw9IFJGX09XTjsKKwllbnRyeSA9ICgrK3ByaXYtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CisgICAgfQorCisgICAgcHJpdi0+Y3VyX3J4ID0gcHJpdi0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCisgICAgLyogV2Ugc2hvdWxkIGNoZWNrIHRoYXQgYXQgbGVhc3QgdHdvIHJpbmcgZW50cmllcyBhcmUgZnJlZS4JIElmIG5vdCwKKyAgICAgICB3ZSBzaG91bGQgZnJlZSBvbmUgYW5kIG1hcmsgc3RhdHMtPnJ4X2Ryb3BwZWQrKy4gKi8KKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXJpYWRuZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CisgICAgc2hvcnQgc2F2ZWRfYWRkcjsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIHNhdmVkX2FkZHIgPSBsYW5jZS0+UkFQOworICAgIGxhbmNlLT5SQVAgPSBDU1IxMTI7CQkvKiBNaXNzZWQgRnJhbWUgQ291bnQgKi8KKyAgICBwcml2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gc3dhcHcobGFuY2UtPlJEUCk7CisgICAgbGFuY2UtPlJBUCA9IHNhdmVkX2FkZHI7CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgcmV0dXJuICZwcml2LT5zdGF0czsKK30KKworCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAgICBudW1fYWRkcnMgPT0gLTEJUHJvbWlzY3VvdXMgbW9kZSwgcmVjZWl2ZSBhbGwgcGFja2V0cworICAgIG51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICAgIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLCBhbmQgZG8KKwkJCWJlc3QtZWZmb3J0IGZpbHRlcmluZy4KKyAqLworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOworCisgICAgaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJcmV0dXJuOworCisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgLyogV2UgdGFrZSB0aGUgc2ltcGxlIHdheSBvdXQgYW5kIGFsd2F5cyBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZS4gKi8KKyAgICBsYW5jZS0+UkFQID0gQ1NSMDsJCQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KKyAgICBsYW5jZS0+UkRQID0gU1RPUDsJCQkvKiBUZW1wb3JhcmlseSBzdG9wIHRoZSBsYW5jZS4gKi8KKyAgICBhcmlhZG5lX2luaXRfcmluZyhkZXYpOworCisgICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCS8qIExvZyBhbnkgbmV0IHRhcHMuICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJbGFuY2UtPlJBUCA9IENTUjE1OwkJLyogTW9kZSBSZWdpc3RlciAqLworCWxhbmNlLT5SRFAgPSBQUk9NOwkJLyogU2V0IHByb21pc2N1b3VzIG1vZGUgKi8KKyAgICB9IGVsc2UgeworCXNob3J0IG11bHRpY2FzdF90YWJsZVs0XTsKKwlpbnQgbnVtX2FkZHJzID0gZGV2LT5tY19jb3VudDsKKwlpbnQgaTsKKwkvKiBXZSBkb24ndCB1c2UgdGhlIG11bHRpY2FzdCB0YWJsZSwgYnV0IHJlbHkgb24gdXBwZXItbGF5ZXIgZmlsdGVyaW5nLiAqLworCW1lbXNldChtdWx0aWNhc3RfdGFibGUsIChudW1fYWRkcnMgPT0gMCkgPyAwIDogLTEsCisJICAgICAgIHNpemVvZihtdWx0aWNhc3RfdGFibGUpKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJICAgIGxhbmNlLT5SQVAgPSBDU1I4KyhpPDw4KTsJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciAqLworCSAgICBsYW5jZS0+UkRQID0gc3dhcHcobXVsdGljYXN0X3RhYmxlW2ldKTsKKwl9CisJbGFuY2UtPlJBUCA9IENTUjE1OwkJLyogTW9kZSBSZWdpc3RlciAqLworCWxhbmNlLT5SRFAgPSAweDAwMDA7CQkvKiBVbnNldCBwcm9taXNjdW91cyBtb2RlICovCisgICAgfQorCisgICAgbGFuY2UtPlJBUCA9IENTUjA7CQkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCisgICAgbGFuY2UtPlJEUCA9IElORUF8U1RSVHxJRE9OOwkvKiBSZXN1bWUgbm9ybWFsIG9wZXJhdGlvbi4gKi8KKworICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYXJpYWRuZV9yZW1vdmVfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnopCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHpvcnJvX2dldF9kcnZkYXRhKHopOworCisgICAgdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICByZWxlYXNlX21lbV9yZWdpb24oWlRXT19QQUREUihkZXYtPmJhc2VfYWRkciksIHNpemVvZihzdHJ1Y3QgQW03OUM5NjApKTsKKyAgICByZWxlYXNlX21lbV9yZWdpb24oWlRXT19QQUREUihkZXYtPm1lbV9zdGFydCksIEFSSUFETkVfUkFNX1NJWkUpOworICAgIGZyZWVfbmV0ZGV2KGRldik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFyaWFkbmVfaW5pdF9tb2R1bGUodm9pZCkKK3sKKyAgICByZXR1cm4gem9ycm9fbW9kdWxlX2luaXQoJmFyaWFkbmVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFyaWFkbmVfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKyAgICB6b3Jyb191bnJlZ2lzdGVyX2RyaXZlcigmYXJpYWRuZV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhcmlhZG5lX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFyaWFkbmVfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmlhZG5lLmggYi9kcml2ZXJzL25ldC9hcmlhZG5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5MTNkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FyaWFkbmUuaApAQCAtMCwwICsxLDQxNSBAQAorLyoKKyAqICBBbWlnYSBMaW51eC9tNjhrIEFyaWFkbmUgRXRoZXJuZXQgRHJpdmVyCisgKgorICogIKkgQ29weXJpZ2h0IDE5OTUgYnkgR2VlcnQgVXl0dGVyaG9ldmVuIChnZWVydEBsaW51eC1tNjhrLm9yZykKKyAqCQkJUGV0ZXIgRGUgU2NocmlqdmVyCisgKgkJICAgICAgIChQZXRlci5EZVNjaHJpanZlckBsaW51eC5jYy5rdWxldXZlbi5hYy5iZSkKKyAqCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgYmFzZWQgb24KKyAqCisgKglsYW5jZS5jOglBbiBBTUQgTEFOQ0UgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4KKyAqCQkJV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICoJQW03OUM5NjA6CVBDbmV0KHRtKS1JU0EgU2luZ2xlLUNoaXAgRXRoZXJuZXQgQ29udHJvbGxlcgorICoJCQlBZHZhbmNlZCBNaWNybyBEZXZpY2VzCisgKgkJCVB1YmxpY2F0aW9uICMxNjkwNywgUmV2LiBCLCBBbWVuZG1lbnQvMCwgTWF5IDE5OTQKKyAqCisgKglNQzY4MjMwOglQYXJhbGxlbCBJbnRlcmZhY2UvVGltZXIgKFBJL1QpCisgKgkJCU1vdG9yb2xhIFNlbWljb25kdWN0b3JzLCBEZWNlbWJlciwgMTk4MworICoKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgKKyAqICBkaXN0cmlidXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGUgQXJpYWRuZSBpcyBhIFpvcnJvLUlJIGJvYXJkIG1hZGUgYnkgVmlsbGFnZSBUcm9uaWMuIEl0IGNvbnRhaW5zOgorICoKKyAqCS0gYW4gQW03OUM5NjAgUENuZXQtSVNBIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIgd2l0aCBib3RoCisgKgkgIDEwQkFTRS0yICh0aGluIGNvYXgpIGFuZCAxMEJBU0UtVCAoVVRQKSBjb25uZWN0b3JzCisgKgorICoJLSBhbiBNQzY4MjMwIFBhcmFsbGVsIEludGVyZmFjZS9UaW1lciBjb25maWd1cmVkIGFzIDIgcGFyYWxsZWwgcG9ydHMKKyAqLworCisKKyAgICAvKgorICAgICAqCUFtNzlDOTYwIFBDbmV0LUlTQQorICAgICAqLworCitzdHJ1Y3QgQW03OUM5NjAgeworICAgIHZvbGF0aWxlIHVfc2hvcnQgQWRkcmVzc1BST01bOF07CisJCQkJLyogSUVFRSBBZGRyZXNzIFBST00gKFVudXNlZCBpbiB0aGUgQXJpYWRuZSkgKi8KKyAgICB2b2xhdGlsZSB1X3Nob3J0IFJEUDsJLyogUmVnaXN0ZXIgRGF0YSBQb3J0ICovCisgICAgdm9sYXRpbGUgdV9zaG9ydCBSQVA7CS8qIFJlZ2lzdGVyIEFkZHJlc3MgUG9ydCAqLworICAgIHZvbGF0aWxlIHVfc2hvcnQgUmVzZXQ7CS8qIFJlc2V0IENoaXAgb24gUmVhZCBBY2Nlc3MgKi8KKyAgICB2b2xhdGlsZSB1X3Nob3J0IElEUDsJLyogSVNBQ1NSIERhdGEgUG9ydCAqLworfTsKKworCisgICAgLyoKKyAgICAgKglBbTc5Qzk2MCBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXJzCisgICAgICoKKyAgICAgKglUaGVzZSB2YWx1ZXMgYXJlIGFscmVhZHkgc3dhcCgpZWQhIQorICAgICAqCisgICAgICoJT25seSByZWdpc3RlcnMgbWFya2VkIHdpdGggYSBgLScgYXJlIGludGVuZGVkIGZvciBuZXR3b3JrIHNvZnR3YXJlCisgICAgICoJYWNjZXNzCisgICAgICovCisKKyNkZWZpbmUgQ1NSMAkJMHgwMDAwCS8qIC0gUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCisjZGVmaW5lIENTUjEJCTB4MDEwMAkvKiAtIElBRFJbMTU6MF0gKi8KKyNkZWZpbmUgQ1NSMgkJMHgwMjAwCS8qIC0gSUFEUlsyMzoxNl0gKi8KKyNkZWZpbmUgQ1NSMwkJMHgwMzAwCS8qIC0gSW50ZXJydXB0IE1hc2tzIGFuZCBEZWZlcnJhbCBDb250cm9sICovCisjZGVmaW5lIENTUjQJCTB4MDQwMAkvKiAtIFRlc3QgYW5kIEZlYXR1cmVzIENvbnRyb2wgKi8KKyNkZWZpbmUgQ1NSNgkJMHgwNjAwCS8qICAgUkNWL1hNVCBEZXNjcmlwdG9yIFRhYmxlIExlbmd0aCAqLworI2RlZmluZSBDU1I4CQkweDA4MDAJLyogLSBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyLCBMQURSRlsxNTowXSAqLworI2RlZmluZSBDU1I5CQkweDA5MDAJLyogLSBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyLCBMQURSRlszMToxNl0gKi8KKyNkZWZpbmUgQ1NSMTAJCTB4MGEwMAkvKiAtIExvZ2ljYWwgQWRkcmVzcyBGaWx0ZXIsIExBRFJGWzQ3OjMyXSAqLworI2RlZmluZSBDU1IxMQkJMHgwYjAwCS8qIC0gTG9naWNhbCBBZGRyZXNzIEZpbHRlciwgTEFEUkZbNjM6NDhdICovCisjZGVmaW5lIENTUjEyCQkweDBjMDAJLyogLSBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyLCBQQURSWzE1OjBdICovCisjZGVmaW5lIENTUjEzCQkweDBkMDAJLyogLSBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyLCBQQURSWzMxOjE2XSAqLworI2RlZmluZSBDU1IxNAkJMHgwZTAwCS8qIC0gUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciwgUEFEUls0NzozMl0gKi8KKyNkZWZpbmUgQ1NSMTUJCTB4MGYwMAkvKiAtIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ1NSMTYJCTB4MTAwMAkvKiAgIEluaXRpYWxpemF0aW9uIEJsb2NrIEFkZHJlc3MgTG93ZXIgKi8KKyNkZWZpbmUgQ1NSMTcJCTB4MTEwMAkvKiAgIEluaXRpYWxpemF0aW9uIEJsb2NrIEFkZHJlc3MgVXBwZXIgKi8KKyNkZWZpbmUgQ1NSMTgJCTB4MTIwMAkvKiAgIEN1cnJlbnQgUmVjZWl2ZSBCdWZmZXIgQWRkcmVzcyAqLworI2RlZmluZSBDU1IxOQkJMHgxMzAwCS8qICAgQ3VycmVudCBSZWNlaXZlIEJ1ZmZlciBBZGRyZXNzICovCisjZGVmaW5lIENTUjIwCQkweDE0MDAJLyogICBDdXJyZW50IFRyYW5zbWl0IEJ1ZmZlciBBZGRyZXNzICovCisjZGVmaW5lIENTUjIxCQkweDE1MDAJLyogICBDdXJyZW50IFRyYW5zbWl0IEJ1ZmZlciBBZGRyZXNzICovCisjZGVmaW5lIENTUjIyCQkweDE2MDAJLyogICBOZXh0IFJlY2VpdmUgQnVmZmVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSMjMJCTB4MTcwMAkvKiAgIE5leHQgUmVjZWl2ZSBCdWZmZXIgQWRkcmVzcyAqLworI2RlZmluZSBDU1IyNAkJMHgxODAwCS8qIC0gQmFzZSBBZGRyZXNzIG9mIFJlY2VpdmUgUmluZyAqLworI2RlZmluZSBDU1IyNQkJMHgxOTAwCS8qIC0gQmFzZSBBZGRyZXNzIG9mIFJlY2VpdmUgUmluZyAqLworI2RlZmluZSBDU1IyNgkJMHgxYTAwCS8qICAgTmV4dCBSZWNlaXZlIERlc2NyaXB0b3IgQWRkcmVzcyAqLworI2RlZmluZSBDU1IyNwkJMHgxYjAwCS8qICAgTmV4dCBSZWNlaXZlIERlc2NyaXB0b3IgQWRkcmVzcyAqLworI2RlZmluZSBDU1IyOAkJMHgxYzAwCS8qICAgQ3VycmVudCBSZWNlaXZlIERlc2NyaXB0b3IgQWRkcmVzcyAqLworI2RlZmluZSBDU1IyOQkJMHgxZDAwCS8qICAgQ3VycmVudCBSZWNlaXZlIERlc2NyaXB0b3IgQWRkcmVzcyAqLworI2RlZmluZSBDU1IzMAkJMHgxZTAwCS8qIC0gQmFzZSBBZGRyZXNzIG9mIFRyYW5zbWl0IFJpbmcgKi8KKyNkZWZpbmUgQ1NSMzEJCTB4MWYwMAkvKiAtIEJhc2UgQWRkcmVzcyBvZiB0cmFuc21pdCBSaW5nICovCisjZGVmaW5lIENTUjMyCQkweDIwMDAJLyogICBOZXh0IFRyYW5zbWl0IERlc2NyaXB0b3IgQWRkcmVzcyAqLworI2RlZmluZSBDU1IzMwkJMHgyMTAwCS8qICAgTmV4dCBUcmFuc21pdCBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSMzQJCTB4MjIwMAkvKiAgIEN1cnJlbnQgVHJhbnNtaXQgRGVzY3JpcHRvciBBZGRyZXNzICovCisjZGVmaW5lIENTUjM1CQkweDIzMDAJLyogICBDdXJyZW50IFRyYW5zbWl0IERlc2NyaXB0b3IgQWRkcmVzcyAqLworI2RlZmluZSBDU1IzNgkJMHgyNDAwCS8qICAgTmV4dCBOZXh0IFJlY2VpdmUgRGVzY3JpcHRvciBBZGRyZXNzICovCisjZGVmaW5lIENTUjM3CQkweDI1MDAJLyogICBOZXh0IE5leHQgUmVjZWl2ZSBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSMzgJCTB4MjYwMAkvKiAgIE5leHQgTmV4dCBUcmFuc21pdCBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSMzkJCTB4MjcwMAkvKiAgIE5leHQgTmV4dCBUcmFuc21pdCBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSNDAJCTB4MjgwMAkvKiAgIEN1cnJlbnQgUmVjZWl2ZSBTdGF0dXMgYW5kIEJ5dGUgQ291bnQgKi8KKyNkZWZpbmUgQ1NSNDEJCTB4MjkwMAkvKiAgIEN1cnJlbnQgUmVjZWl2ZSBTdGF0dXMgYW5kIEJ5dGUgQ291bnQgKi8KKyNkZWZpbmUgQ1NSNDIJCTB4MmEwMAkvKiAgIEN1cnJlbnQgVHJhbnNtaXQgU3RhdHVzIGFuZCBCeXRlIENvdW50ICovCisjZGVmaW5lIENTUjQzCQkweDJiMDAJLyogICBDdXJyZW50IFRyYW5zbWl0IFN0YXR1cyBhbmQgQnl0ZSBDb3VudCAqLworI2RlZmluZSBDU1I0NAkJMHgyYzAwCS8qICAgTmV4dCBSZWNlaXZlIFN0YXR1cyBhbmQgQnl0ZSBDb3VudCAqLworI2RlZmluZSBDU1I0NQkJMHgyZDAwCS8qICAgTmV4dCBSZWNlaXZlIFN0YXR1cyBhbmQgQnl0ZSBDb3VudCAqLworI2RlZmluZSBDU1I0NgkJMHgyZTAwCS8qICAgUG9sbCBUaW1lIENvdW50ZXIgKi8KKyNkZWZpbmUgQ1NSNDcJCTB4MmYwMAkvKiAgIFBvbGxpbmcgSW50ZXJ2YWwgKi8KKyNkZWZpbmUgQ1NSNDgJCTB4MzAwMAkvKiAgIFRlbXBvcmFyeSBTdG9yYWdlICovCisjZGVmaW5lIENTUjQ5CQkweDMxMDAJLyogICBUZW1wb3JhcnkgU3RvcmFnZSAqLworI2RlZmluZSBDU1I1MAkJMHgzMjAwCS8qICAgVGVtcG9yYXJ5IFN0b3JhZ2UgKi8KKyNkZWZpbmUgQ1NSNTEJCTB4MzMwMAkvKiAgIFRlbXBvcmFyeSBTdG9yYWdlICovCisjZGVmaW5lIENTUjUyCQkweDM0MDAJLyogICBUZW1wb3JhcnkgU3RvcmFnZSAqLworI2RlZmluZSBDU1I1MwkJMHgzNTAwCS8qICAgVGVtcG9yYXJ5IFN0b3JhZ2UgKi8KKyNkZWZpbmUgQ1NSNTQJCTB4MzYwMAkvKiAgIFRlbXBvcmFyeSBTdG9yYWdlICovCisjZGVmaW5lIENTUjU1CQkweDM3MDAJLyogICBUZW1wb3JhcnkgU3RvcmFnZSAqLworI2RlZmluZSBDU1I1NgkJMHgzODAwCS8qICAgVGVtcG9yYXJ5IFN0b3JhZ2UgKi8KKyNkZWZpbmUgQ1NSNTcJCTB4MzkwMAkvKiAgIFRlbXBvcmFyeSBTdG9yYWdlICovCisjZGVmaW5lIENTUjU4CQkweDNhMDAJLyogICBUZW1wb3JhcnkgU3RvcmFnZSAqLworI2RlZmluZSBDU1I1OQkJMHgzYjAwCS8qICAgVGVtcG9yYXJ5IFN0b3JhZ2UgKi8KKyNkZWZpbmUgQ1NSNjAJCTB4M2MwMAkvKiAgIFByZXZpb3VzIFRyYW5zbWl0IERlc2NyaXB0b3IgQWRkcmVzcyAqLworI2RlZmluZSBDU1I2MQkJMHgzZDAwCS8qICAgUHJldmlvdXMgVHJhbnNtaXQgRGVzY3JpcHRvciBBZGRyZXNzICovCisjZGVmaW5lIENTUjYyCQkweDNlMDAJLyogICBQcmV2aW91cyBUcmFuc21pdCBTdGF0dXMgYW5kIEJ5dGUgQ291bnQgKi8KKyNkZWZpbmUgQ1NSNjMJCTB4M2YwMAkvKiAgIFByZXZpb3VzIFRyYW5zbWl0IFN0YXR1cyBhbmQgQnl0ZSBDb3VudCAqLworI2RlZmluZSBDU1I2NAkJMHg0MDAwCS8qICAgTmV4dCBUcmFuc21pdCBCdWZmZXIgQWRkcmVzcyAqLworI2RlZmluZSBDU1I2NQkJMHg0MTAwCS8qICAgTmV4dCBUcmFuc21pdCBCdWZmZXIgQWRkcmVzcyAqLworI2RlZmluZSBDU1I2NgkJMHg0MjAwCS8qICAgTmV4dCBUcmFuc21pdCBTdGF0dXMgYW5kIEJ5dGUgQ291bnQgKi8KKyNkZWZpbmUgQ1NSNjcJCTB4NDMwMAkvKiAgIE5leHQgVHJhbnNtaXQgU3RhdHVzIGFuZCBCeXRlIENvdW50ICovCisjZGVmaW5lIENTUjY4CQkweDQ0MDAJLyogICBUcmFuc21pdCBTdGF0dXMgVGVtcG9yYXJ5IFN0b3JhZ2UgKi8KKyNkZWZpbmUgQ1NSNjkJCTB4NDUwMAkvKiAgIFRyYW5zbWl0IFN0YXR1cyBUZW1wb3JhcnkgU3RvcmFnZSAqLworI2RlZmluZSBDU1I3MAkJMHg0NjAwCS8qICAgVGVtcG9yYXJ5IFN0b3JhZ2UgKi8KKyNkZWZpbmUgQ1NSNzEJCTB4NDcwMAkvKiAgIFRlbXBvcmFyeSBTdG9yYWdlICovCisjZGVmaW5lIENTUjcyCQkweDQ4MDAJLyogICBSZWNlaXZlIFJpbmcgQ291bnRlciAqLworI2RlZmluZSBDU1I3NAkJMHg0YTAwCS8qICAgVHJhbnNtaXQgUmluZyBDb3VudGVyICovCisjZGVmaW5lIENTUjc2CQkweDRjMDAJLyogLSBSZWNlaXZlIFJpbmcgTGVuZ3RoICovCisjZGVmaW5lIENTUjc4CQkweDRlMDAJLyogLSBUcmFuc21pdCBSaW5nIExlbmd0aCAqLworI2RlZmluZSBDU1I4MAkJMHg1MDAwCS8qIC0gQnVyc3QgYW5kIEZJRk8gVGhyZXNob2xkIENvbnRyb2wgKi8KKyNkZWZpbmUgQ1NSODIJCTB4NTIwMAkvKiAtIEJ1cyBBY3Rpdml0eSBUaW1lciAqLworI2RlZmluZSBDU1I4NAkJMHg1NDAwCS8qICAgRE1BIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSODUJCTB4NTUwMAkvKiAgIERNQSBBZGRyZXNzICovCisjZGVmaW5lIENTUjg2CQkweDU2MDAJLyogICBCdWZmZXIgQnl0ZSBDb3VudGVyICovCisjZGVmaW5lIENTUjg4CQkweDU4MDAJLyogLSBDaGlwIElEICovCisjZGVmaW5lIENTUjg5CQkweDU5MDAJLyogLSBDaGlwIElEICovCisjZGVmaW5lIENTUjkyCQkweDVjMDAJLyogICBSaW5nIExlbmd0aCBDb252ZXJzaW9uICovCisjZGVmaW5lIENTUjk0CQkweDVlMDAJLyogICBUcmFuc21pdCBUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5IENvdW50ICovCisjZGVmaW5lIENTUjk2CQkweDYwMDAJLyogICBCdXMgSW50ZXJmYWNlIFNjcmF0Y2ggUmVnaXN0ZXIgMCAqLworI2RlZmluZSBDU1I5NwkJMHg2MTAwCS8qICAgQnVzIEludGVyZmFjZSBTY3JhdGNoIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgQ1NSOTgJCTB4NjIwMAkvKiAgIEJ1cyBJbnRlcmZhY2UgU2NyYXRjaCBSZWdpc3RlciAxICovCisjZGVmaW5lIENTUjk5CQkweDYzMDAJLyogICBCdXMgSW50ZXJmYWNlIFNjcmF0Y2ggUmVnaXN0ZXIgMSAqLworI2RlZmluZSBDU1IxMDQJCTB4NjgwMAkvKiAgIFNXQVAgKi8KKyNkZWZpbmUgQ1NSMTA1CQkweDY5MDAJLyogICBTV0FQICovCisjZGVmaW5lIENTUjEwOAkJMHg2YzAwCS8qICAgQnVmZmVyIE1hbmFnZW1lbnQgU2NyYXRjaCAqLworI2RlZmluZSBDU1IxMDkJCTB4NmQwMAkvKiAgIEJ1ZmZlciBNYW5hZ2VtZW50IFNjcmF0Y2ggKi8KKyNkZWZpbmUgQ1NSMTEyCQkweDcwMDAJLyogLSBNaXNzZWQgRnJhbWUgQ291bnQgKi8KKyNkZWZpbmUgQ1NSMTE0CQkweDcyMDAJLyogLSBSZWNlaXZlIENvbGxpc2lvbiBDb3VudCAqLworI2RlZmluZSBDU1IxMjQJCTB4N2MwMAkvKiAtIEJ1ZmZlciBNYW5hZ2VtZW50IFVuaXQgVGVzdCAqLworCisKKyAgICAvKgorICAgICAqCUFtNzlDOTYwIElTQSBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXJzCisgICAgICoKKyAgICAgKglUaGVzZSB2YWx1ZXMgYXJlIGFscmVhZHkgc3dhcCgpZWQhIQorICAgICAqLworCisjZGVmaW5lIElTQUNTUjAJCTB4MDAwMAkvKiBNYXN0ZXIgTW9kZSBSZWFkIEFjdGl2ZSAqLworI2RlZmluZSBJU0FDU1IxCQkweDAxMDAJLyogTWFzdGVyIE1vZGUgV3JpdGUgQWN0aXZlICovCisjZGVmaW5lIElTQUNTUjIJCTB4MDIwMAkvKiBNaXNjZWxsYW5lb3VzIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSVNBQ1NSNAkJMHgwNDAwCS8qIExFRDAgU3RhdHVzIChMaW5rIEludGVncml0eSkgKi8KKyNkZWZpbmUgSVNBQ1NSNQkJMHgwNTAwCS8qIExFRDEgU3RhdHVzICovCisjZGVmaW5lIElTQUNTUjYJCTB4MDYwMAkvKiBMRUQyIFN0YXR1cyAqLworI2RlZmluZSBJU0FDU1I3CQkweDA3MDAJLyogTEVEMyBTdGF0dXMgKi8KKworCisgICAgLyoKKyAgICAgKglCaXQgZGVmaW5pdGlvbnMgZm9yIENTUjAgKFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cykKKyAgICAgKgorICAgICAqCVRoZXNlIHZhbHVlcyBhcmUgYWxyZWFkeSBzd2FwKCllZCEhCisgICAgICovCisKKyNkZWZpbmUgRVJSCQkweDAwODAJLyogRXJyb3IgKi8KKyNkZWZpbmUgQkFCTAkJMHgwMDQwCS8qIEJhYmJsZTogVHJhbnNtaXR0ZWQgdG9vIG1hbnkgYml0cyAqLworI2RlZmluZSBDRVJSCQkweDAwMjAJLyogTm8gSGVhcnRiZWF0ICgxMEJBU0UtVCkgKi8KKyNkZWZpbmUgTUlTUwkJMHgwMDEwCS8qIE1pc3NlZCBGcmFtZSAqLworI2RlZmluZSBNRVJSCQkweDAwMDgJLyogTWVtb3J5IEVycm9yICovCisjZGVmaW5lIFJJTlQJCTB4MDAwNAkvKiBSZWNlaXZlIEludGVycnVwdCAqLworI2RlZmluZSBUSU5UCQkweDAwMDIJLyogVHJhbnNtaXQgSW50ZXJydXB0ICovCisjZGVmaW5lIElET04JCTB4MDAwMQkvKiBJbml0aWFsaXphdGlvbiBEb25lICovCisjZGVmaW5lIElOVFIJCTB4ODAwMAkvKiBJbnRlcnJ1cHQgRmxhZyAqLworI2RlZmluZSBJTkVBCQkweDQwMDAJLyogSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBSWE9OCQkweDIwMDAJLyogUmVjZWl2ZSBPbiAqLworI2RlZmluZSBUWE9OCQkweDEwMDAJLyogVHJhbnNtaXQgT24gKi8KKyNkZWZpbmUgVERNRAkJMHgwODAwCS8qIFRyYW5zbWl0IERlbWFuZCAqLworI2RlZmluZSBTVE9QCQkweDA0MDAJLyogU3RvcCAqLworI2RlZmluZSBTVFJUCQkweDAyMDAJLyogU3RhcnQgKi8KKyNkZWZpbmUgSU5JVAkJMHgwMTAwCS8qIEluaXRpYWxpemUgKi8KKworCisgICAgLyoKKyAgICAgKglCaXQgZGVmaW5pdGlvbnMgZm9yIENTUjMgKEludGVycnVwdCBNYXNrcyBhbmQgRGVmZXJyYWwgQ29udHJvbCkKKyAgICAgKgorICAgICAqCVRoZXNlIHZhbHVlcyBhcmUgYWxyZWFkeSBzd2FwKCllZCEhCisgICAgICovCisKKyNkZWZpbmUgQkFCTE0JCTB4MDA0MAkvKiBCYWJibGUgTWFzayAqLworI2RlZmluZSBNSVNTTQkJMHgwMDEwCS8qIE1pc3NlZCBGcmFtZSBNYXNrICovCisjZGVmaW5lIE1FUlJNCQkweDAwMDgJLyogTWVtb3J5IEVycm9yIE1hc2sgKi8KKyNkZWZpbmUgUklOVE0JCTB4MDAwNAkvKiBSZWNlaXZlIEludGVycnVwdCBNYXNrICovCisjZGVmaW5lIFRJTlRNCQkweDAwMDIJLyogVHJhbnNtaXQgSW50ZXJydXB0IE1hc2sgKi8KKyNkZWZpbmUgSURPTk0JCTB4MDAwMQkvKiBJbml0aWFsaXphdGlvbiBEb25lIE1hc2sgKi8KKyNkZWZpbmUgRFhNVDJQRAkJMHgxMDAwCS8qIERpc2FibGUgVHJhbnNtaXQgVHdvIFBhcnQgRGVmZXJyYWwgKi8KKyNkZWZpbmUgRU1CQQkJMHgwODAwCS8qIEVuYWJsZSBNb2RpZmllZCBCYWNrLW9mZiBBbGdvcml0aG0gKi8KKworCisgICAgLyoKKyAgICAgKglCaXQgZGVmaW5pdGlvbnMgZm9yIENTUjQgKFRlc3QgYW5kIEZlYXR1cmVzIENvbnRyb2wpCisgICAgICoKKyAgICAgKglUaGVzZSB2YWx1ZXMgYXJlIGFscmVhZHkgc3dhcCgpZWQhIQorICAgICAqLworCisjZGVmaW5lIEVOVFNUCQkweDAwODAJLyogRW5hYmxlIFRlc3QgTW9kZSAqLworI2RlZmluZSBETUFQTFVTCQkweDAwNDAJLyogRGlzYWJsZSBCdXJzdCBUcmFuc2FjdGlvbiBDb3VudGVyICovCisjZGVmaW5lIFRJTUVSCQkweDAwMjAJLyogVGltZXIgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIERQT0xMCQkweDAwMTAJLyogRGlzYWJsZSBUcmFuc21pdCBQb2xsaW5nICovCisjZGVmaW5lIEFQQURfWE1UCTB4MDAwOAkvKiBBdXRvIFBhZCBUcmFuc21pdCAqLworI2RlZmluZSBBU1RSUF9SQ1YJMHgwMDA0CS8qIEF1dG8gUGFkIFN0cmlwcGluZyAqLworI2RlZmluZSBNRkNPCQkweDAwMDIJLyogTWlzc2VkIEZyYW1lIENvdW50ZXIgT3ZlcmZsb3cgSW50ZXJydXB0ICovCisjZGVmaW5lIE1GQ09NCQkweDAwMDEJLyogTWlzc2VkIEZyYW1lIENvdW50ZXIgT3ZlcmZsb3cgTWFzayAqLworI2RlZmluZSBSQ1ZDQ08JCTB4MjAwMAkvKiBSZWNlaXZlIENvbGxpc2lvbiBDb3VudGVyIE92ZXJmbG93IEludGVycnVwdCAqLworI2RlZmluZSBSQ1ZDQ09NCQkweDEwMDAJLyogUmVjZWl2ZSBDb2xsaXNpb24gQ291bnRlciBPdmVyZmxvdyBNYXNrICovCisjZGVmaW5lIFRYU1RSVAkJMHgwODAwCS8qIFRyYW5zbWl0IFN0YXJ0IFN0YXR1cyAqLworI2RlZmluZSBUWFNUUlRNCQkweDA0MDAJLyogVHJhbnNtaXQgU3RhcnQgTWFzayAqLworI2RlZmluZSBKQUIJCTB4MDIwMAkvKiBKYWJiZXIgRXJyb3IgKi8KKyNkZWZpbmUgSkFCTQkJMHgwMTAwCS8qIEphYmJlciBFcnJvciBNYXNrICovCisKKworICAgIC8qCisgICAgICoJQml0IGRlZmluaXRpb25zIGZvciBDU1IxNSAoTW9kZSBSZWdpc3RlcikKKyAgICAgKgorICAgICAqCVRoZXNlIHZhbHVlcyBhcmUgYWxyZWFkeSBzd2FwKCllZCEhCisgICAgICovCisKKyNkZWZpbmUgUFJPTQkJMHgwMDgwCS8qIFByb21pc2N1b3VzIE1vZGUgKi8KKyNkZWZpbmUgRFJDVkJDCQkweDAwNDAJLyogRGlzYWJsZSBSZWNlaXZlIEJyb2FkY2FzdCAqLworI2RlZmluZSBEUkNWUEEJCTB4MDAyMAkvKiBEaXNhYmxlIFJlY2VpdmUgUGh5c2ljYWwgQWRkcmVzcyAqLworI2RlZmluZSBETE5LVFNUCQkweDAwMTAJLyogRGlzYWJsZSBMaW5rIFN0YXR1cyAqLworI2RlZmluZSBEQVBDCQkweDAwMDgJLyogRGlzYWJsZSBBdXRvbWF0aWMgUG9sYXJpdHkgQ29ycmVjdGlvbiAqLworI2RlZmluZSBNRU5ERUNMCQkweDAwMDQJLyogTUVOREVDIExvb3BiYWNrIE1vZGUgKi8KKyNkZWZpbmUgTFJUVFNFTAkJMHgwMDAyCS8qIExvdyBSZWNlaXZlIFRyZXNob2xkL1RyYW5zbWl0IE1vZGUgU2VsZWN0ICovCisjZGVmaW5lIFBPUlRTRUwxCTB4MDAwMQkvKiBQb3J0IFNlbGVjdCBCaXRzICovCisjZGVmaW5lIFBPUlRTRUwyCTB4ODAwMAkvKiBQb3J0IFNlbGVjdCBCaXRzICovCisjZGVmaW5lIElOVEwJCTB4NDAwMAkvKiBJbnRlcm5hbCBMb29wYmFjayAqLworI2RlZmluZSBEUlRZCQkweDIwMDAJLyogRGlzYWJsZSBSZXRyeSAqLworI2RlZmluZSBGQ09MTAkJMHgxMDAwCS8qIEZvcmNlIENvbGxpc2lvbiAqLworI2RlZmluZSBEWE1URkNTCQkweDA4MDAJLyogRGlzYWJsZSBUcmFuc21pdCBDUkMgKi8KKyNkZWZpbmUgTE9PUAkJMHgwNDAwCS8qIExvb3BiYWNrIEVuYWJsZSAqLworI2RlZmluZSBEVFgJCTB4MDIwMAkvKiBEaXNhYmxlIFRyYW5zbWl0dGVyICovCisjZGVmaW5lIERSWAkJMHgwMTAwCS8qIERpc2FibGUgUmVjZWl2ZXIgKi8KKworCisgICAgLyoKKyAgICAgKglCaXQgZGVmaW5pdGlvbnMgZm9yIElTQUNTUjIgKE1pc2NlbGxhbmVvdXMgQ29uZmlndXJhdGlvbikKKyAgICAgKgorICAgICAqCVRoZXNlIHZhbHVlcyBhcmUgYWxyZWFkeSBzd2FwKCllZCEhCisgICAgICovCisKKyNkZWZpbmUgQVNFTAkJMHgwMjAwCS8qIE1lZGlhIEludGVyZmFjZSBQb3J0IEF1dG8gU2VsZWN0ICovCisKKworICAgIC8qCisgICAgICoJQml0IGRlZmluaXRpb25zIGZvciBJU0FDU1I1LTcgKExFRDEtMyBTdGF0dXMpCisgICAgICoKKyAgICAgKglUaGVzZSB2YWx1ZXMgYXJlIGFscmVhZHkgc3dhcCgpZWQhIQorICAgICAqLworCisjZGVmaW5lIExFRE9VVAkJMHgwMDgwCS8qIEN1cnJlbnQgTEVEIFN0YXR1cyAqLworI2RlZmluZSBQU0UJCTB4ODAwMAkvKiBQdWxzZSBTdHJldGNoZXIgRW5hYmxlICovCisjZGVmaW5lIFhNVEUJCTB4MTAwMAkvKiBFbmFibGUgVHJhbnNtaXQgU3RhdHVzIFNpZ25hbCAqLworI2RlZmluZSBSVlBPTEUJCTB4MDgwMAkvKiBFbmFibGUgUmVjZWl2ZSBQb2xhcml0eSBTaWduYWwgKi8KKyNkZWZpbmUgUkNWRQkJMHgwNDAwCS8qIEVuYWJsZSBSZWNlaXZlIFN0YXR1cyBTaWduYWwgKi8KKyNkZWZpbmUgSkFCRQkJMHgwMjAwCS8qIEVuYWJsZSBKYWJiZXIgU2lnbmFsICovCisjZGVmaW5lIENPTEUJCTB4MDEwMAkvKiBFbmFibGUgQ29sbGlzaW9uIFNpZ25hbCAqLworCisKKyAgICAvKgorICAgICAqCVJlY2VpdmUgRGVzY3JpcHRvciBSaW5nIEVudHJ5CisgICAgICovCisKK3N0cnVjdCBSRFJFIHsKKyAgICB2b2xhdGlsZSB1X3Nob3J0IFJNRDA7CS8qIExBRFJbMTU6MF0gKi8KKyAgICB2b2xhdGlsZSB1X3Nob3J0IFJNRDE7CS8qIEhBRFJbMjM6MTZdIHwgUmVjZWl2ZSBGbGFncyAqLworICAgIHZvbGF0aWxlIHVfc2hvcnQgUk1EMjsJLyogQnVmZmVyIEJ5dGUgQ291bnQgKHR3bydzIGNvbXBsZW1lbnQpICovCisgICAgdm9sYXRpbGUgdV9zaG9ydCBSTUQzOwkvKiBNZXNzYWdlIEJ5dGUgQ291bnQgKi8KK307CisKKworICAgIC8qCisgICAgICoJVHJhbnNtaXQgRGVzY3JpcHRvciBSaW5nIEVudHJ5CisgICAgICovCisKK3N0cnVjdCBURFJFIHsKKyAgICB2b2xhdGlsZSB1X3Nob3J0IFRNRDA7CS8qIExBRFJbMTU6MF0gKi8KKyAgICB2b2xhdGlsZSB1X3Nob3J0IFRNRDE7CS8qIEhBRFJbMjM6MTZdIHwgVHJhbnNtaXQgRmxhZ3MgKi8KKyAgICB2b2xhdGlsZSB1X3Nob3J0IFRNRDI7CS8qIEJ1ZmZlciBCeXRlIENvdW50ICh0d28ncyBjb21wbGVtZW50KSAqLworICAgIHZvbGF0aWxlIHVfc2hvcnQgVE1EMzsJLyogRXJyb3IgRmxhZ3MgKi8KK307CisKKworICAgIC8qCisgICAgICoJUmVjZWl2ZSBGbGFncworICAgICAqLworCisjZGVmaW5lIFJGX09XTgkJMHgwMDgwCS8qIFBDbmV0LUlTQSBjb250cm9sbGVyIG93bnMgdGhlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgUkZfRVJSCQkweDAwNDAJLyogRXJyb3IgKi8KKyNkZWZpbmUgUkZfRlJBTQkJMHgwMDIwCS8qIEZyYW1pbmcgRXJyb3IgKi8KKyNkZWZpbmUgUkZfT0ZMTwkJMHgwMDEwCS8qIE92ZXJmbG93IEVycm9yICovCisjZGVmaW5lIFJGX0NSQwkJMHgwMDA4CS8qIENSQyBFcnJvciAqLworI2RlZmluZSBSRl9CVUZGCQkweDAwMDQJLyogQnVmZmVyIEVycm9yICovCisjZGVmaW5lIFJGX1NUUAkJMHgwMDAyCS8qIFN0YXJ0IG9mIFBhY2tldCAqLworI2RlZmluZSBSRl9FTlAJCTB4MDAwMQkvKiBFbmQgb2YgUGFja2V0ICovCisKKworICAgIC8qCisgICAgICoJVHJhbnNtaXQgRmxhZ3MKKyAgICAgKi8KKworI2RlZmluZSBURl9PV04JCTB4MDA4MAkvKiBQQ25ldC1JU0EgY29udHJvbGxlciBvd25zIHRoZSBkZXNjcmlwdG9yICovCisjZGVmaW5lIFRGX0VSUgkJMHgwMDQwCS8qIEVycm9yICovCisjZGVmaW5lIFRGX0FERF9GQ1MJMHgwMDIwCS8qIENvbnRyb2xzIEZDUyBHZW5lcmF0aW9uICovCisjZGVmaW5lIFRGX01PUkUJCTB4MDAxMAkvKiBNb3JlIHRoYW4gb25lIHJldHJ5IG5lZWRlZCAqLworI2RlZmluZSBURl9PTkUJCTB4MDAwOAkvKiBPbmUgcmV0cnkgbmVlZGVkICovCisjZGVmaW5lIFRGX0RFRgkJMHgwMDA0CS8qIERlZmVycmVkICovCisjZGVmaW5lIFRGX1NUUAkJMHgwMDAyCS8qIFN0YXJ0IG9mIFBhY2tldCAqLworI2RlZmluZSBURl9FTlAJCTB4MDAwMQkvKiBFbmQgb2YgUGFja2V0ICovCisKKworICAgIC8qCisgICAgICoJRXJyb3IgRmxhZ3MKKyAgICAgKi8KKworI2RlZmluZSBFRl9CVUZGCQkweDAwODAJLyogQnVmZmVyIEVycm9yICovCisjZGVmaW5lIEVGX1VGTE8JCTB4MDA0MAkvKiBVbmRlcmZsb3cgRXJyb3IgKi8KKyNkZWZpbmUgRUZfTENPTAkJMHgwMDEwCS8qIExhdGUgQ29sbGlzaW9uICovCisjZGVmaW5lIEVGX0xDQVIJCTB4MDAwOAkvKiBMb3NzIG9mIENhcnJpZXIgKi8KKyNkZWZpbmUgRUZfUlRSWQkJMHgwMDA0CS8qIFJldHJ5IEVycm9yICovCisjZGVmaW5lIEVGX1REUgkJMHhmZjAzCS8qIFRpbWUgRG9tYWluIFJlZmxlY3RvbWV0cnkgKi8KKworCisKKyAgICAvKgorICAgICAqCU1DNjgyMzAgUGFyYWxsZWwgSW50ZXJmYWNlL1RpbWVyCisgICAgICovCisKK3N0cnVjdCBNQzY4MjMwIHsKKyAgICB2b2xhdGlsZSB1X2NoYXIgUEdDUjsJLyogUG9ydCBHZW5lcmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgICB1X2NoYXIgUGFkMVsxXTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgUFNSUjsJLyogUG9ydCBTZXJ2aWNlIFJlcXVlc3QgUmVnaXN0ZXIgKi8KKyAgICB1X2NoYXIgUGFkMlsxXTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgUEFERFI7CS8qIFBvcnQgQSBEYXRhIERpcmVjdGlvbiBSZWdpc3RlciAqLworICAgIHVfY2hhciBQYWQzWzFdOworICAgIHZvbGF0aWxlIHVfY2hhciBQQkREUjsJLyogUG9ydCBCIERhdGEgRGlyZWN0aW9uIFJlZ2lzdGVyICovCisgICAgdV9jaGFyIFBhZDRbMV07CisgICAgdm9sYXRpbGUgdV9jaGFyIFBDRERSOwkvKiBQb3J0IEMgRGF0YSBEaXJlY3Rpb24gUmVnaXN0ZXIgKi8KKyAgICB1X2NoYXIgUGFkNVsxXTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgUElWUjsJLyogUG9ydCBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyICovCisgICAgdV9jaGFyIFBhZDZbMV07CisgICAgdm9sYXRpbGUgdV9jaGFyIFBBQ1I7CS8qIFBvcnQgQSBDb250cm9sIFJlZ2lzdGVyICovCisgICAgdV9jaGFyIFBhZDdbMV07CisgICAgdm9sYXRpbGUgdV9jaGFyIFBCQ1I7CS8qIFBvcnQgQiBDb250cm9sIFJlZ2lzdGVyICovCisgICAgdV9jaGFyIFBhZDhbMV07CisgICAgdm9sYXRpbGUgdV9jaGFyIFBBRFI7CS8qIFBvcnQgQSBEYXRhIFJlZ2lzdGVyICovCisgICAgdV9jaGFyIFBhZDlbMV07CisgICAgdm9sYXRpbGUgdV9jaGFyIFBCRFI7CS8qIFBvcnQgQiBEYXRhIFJlZ2lzdGVyICovCisgICAgdV9jaGFyIFBhZDEwWzFdOworICAgIHZvbGF0aWxlIHVfY2hhciBQQUFSOwkvKiBQb3J0IEEgQWx0ZXJuYXRlIFJlZ2lzdGVyICovCisgICAgdV9jaGFyIFBhZDExWzFdOworICAgIHZvbGF0aWxlIHVfY2hhciBQQkFSOwkvKiBQb3J0IEIgQWx0ZXJuYXRlIFJlZ2lzdGVyICovCisgICAgdV9jaGFyIFBhZDEyWzFdOworICAgIHZvbGF0aWxlIHVfY2hhciBQQ0RSOwkvKiBQb3J0IEMgRGF0YSBSZWdpc3RlciAqLworICAgIHVfY2hhciBQYWQxM1sxXTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgUFNSOwkvKiBQb3J0IFN0YXR1cyBSZWdpc3RlciAqLworICAgIHVfY2hhciBQYWQxNFs1XTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgVENSOwkvKiBUaW1lciBDb250cm9sIFJlZ2lzdGVyICovCisgICAgdV9jaGFyIFBhZDE1WzFdOworICAgIHZvbGF0aWxlIHVfY2hhciBUSVZSOwkvKiBUaW1lciBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyICovCisgICAgdV9jaGFyIFBhZDE2WzNdOworICAgIHZvbGF0aWxlIHVfY2hhciBDUFJIOwkvKiBDb3VudGVyIFByZWxvYWQgUmVnaXN0ZXIgKEhpZ2gpICovCisgICAgdV9jaGFyIFBhZDE3WzFdOworICAgIHZvbGF0aWxlIHVfY2hhciBDUFJNOwkvKiBDb3VudGVyIFByZWxvYWQgUmVnaXN0ZXIgKE1pZCkgKi8KKyAgICB1X2NoYXIgUGFkMThbMV07CisgICAgdm9sYXRpbGUgdV9jaGFyIENQUkw7CS8qIENvdW50ZXIgUHJlbG9hZCBSZWdpc3RlciAoTG93KSAqLworICAgIHVfY2hhciBQYWQxOVszXTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgQ05UUkg7CS8qIENvdW50IFJlZ2lzdGVyIChIaWdoKSAqLworICAgIHVfY2hhciBQYWQyMFsxXTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgQ05UUk07CS8qIENvdW50IFJlZ2lzdGVyIChNaWQpICovCisgICAgdV9jaGFyIFBhZDIxWzFdOworICAgIHZvbGF0aWxlIHVfY2hhciBDTlRSTDsJLyogQ291bnQgUmVnaXN0ZXIgKExvdykgKi8KKyAgICB1X2NoYXIgUGFkMjJbMV07CisgICAgdm9sYXRpbGUgdV9jaGFyIFRTUjsJLyogVGltZXIgU3RhdHVzIFJlZ2lzdGVyICovCisgICAgdV9jaGFyIFBhZDIzWzExXTsKK307CisKKworICAgIC8qCisgICAgICoJQXJpYWRuZSBFeHBhbnNpb24gQm9hcmQgU3RydWN0dXJlCisgICAgICovCisKKyNkZWZpbmUgQVJJQURORV9MQU5DRQkJMHgzNjAKKworI2RlZmluZSBBUklBRE5FX1BJVAkJMHgxMDAwCisKKyNkZWZpbmUgQVJJQURORV9CT09UUFJPTQkweDQwMDAJLyogSSBndWVzcyBpdCdzIGhlcmUgOi0pICovCisjZGVmaW5lIEFSSUFETkVfQk9PVFBST01fU0laRQkweDQwMDAKKworI2RlZmluZSBBUklBRE5FX1JBTQkJMHg4MDAwCS8qIEFsd2F5cyBhY2Nlc3MgV09SRHMhISAqLworI2RlZmluZSBBUklBRE5FX1JBTV9TSVpFCTB4ODAwMAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2FybS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MDM2NGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcm0vS2NvbmZpZwpAQCAtMCwwICsxLDQ2IEBACisjCisjIEFjb3JuIE5ldHdvcmsgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMgIFRoZXNlIGFyZSBmb3IgQWNvcm4ncyBFeHBhbnNpb24gY2FyZCBuZXR3b3JrIGludGVyZmFjZXMKKyMKK2NvbmZpZyBBUk1fQU03OUM5NjFBCisJYm9vbCAiQVJNIEVCU0ExMTAgQU03OUM5NjFBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgQVJNICYmIEFSQ0hfRUJTQTExMAorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSB3aXNoIHRvIGNvbXBpbGUgYSBrZXJuZWwgZm9yIHRoZSBFQlNBLTExMCwgdGhlbiB5b3Ugc2hvdWxkCisJICBhbHdheXMgYW5zd2VyIFkgdG8gdGhpcy4KKworY29uZmlnIEFSTV9FVEhFUjEKKwl0cmlzdGF0ZSAiQWNvcm4gRXRoZXIxIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgQVJNICYmIEFSQ0hfQUNPUk4KKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhbiBBY29ybiBzeXN0ZW0gd2l0aCBvbmUgb2YgdGhlc2UgKEFLQTI1KSBuZXR3b3JrIGNhcmRzLAorCSAgeW91IHNob3VsZCBzYXkgWSB0byB0aGlzIG9wdGlvbiBpZiB5b3Ugd2lzaCB0byB1c2UgaXQgd2l0aCBMaW51eC4KKworY29uZmlnIEFSTV9FVEhFUjMKKwl0cmlzdGF0ZSAiQWNvcm4vQU5UIEV0aGVyMyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIEFSTSAmJiBBUkNIX0FDT1JOCisJaGVscAorCSAgSWYgeW91IGhhdmUgYW4gQWNvcm4gc3lzdGVtIHdpdGggb25lIG9mIHRoZXNlIG5ldHdvcmsgY2FyZHMsIHlvdQorCSAgc2hvdWxkIHNheSBZIHRvIHRoaXMgb3B0aW9uIGlmIHlvdSB3aXNoIHRvIHVzZSBpdCB3aXRoIExpbnV4LgorCitjb25maWcgQVJNX0VUSEVSSAorCXRyaXN0YXRlICJJLWN1YmVkIEV0aGVySC9BTlQgRXRoZXJNIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgQVJNICYmIEFSQ0hfQUNPUk4KKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhbiBBY29ybiBzeXN0ZW0gd2l0aCBvbmUgb2YgdGhlc2UgbmV0d29yayBjYXJkcywgeW91CisJICBzaG91bGQgc2F5IFkgdG8gdGhpcyBvcHRpb24gaWYgeW91IHdpc2ggdG8gdXNlIGl0IHdpdGggTGludXguCisKK2NvbmZpZyBBUk1fRVRIRVIwMAorCXRyaXN0YXRlICJBbHRlcmEgRXRoZXIwMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIEFSTSAmJiBBUkNIX0NBTUVMT1QKKwloZWxwCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIEFsdGVyYSdzIGV0aGVyMDAgZXRoZXJuZXQgbWFjIElQIGNvcmUuIFNheQorCSAgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoaXMgaW50byB0aGUga2VybmVsLiBJdAorCSAgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgKHNheSBNIGhlcmUpIHRoYXQgY2FuIGJlIGluc2VydGVkLworCSAgcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgUExEIGlzIGNvbmZpZ3VyZWQuCisJICBJZiB0aGlzIGRyaXZlciBpcyBydW5uaW5nIG9uIGFuIGVweGExMCBkZXZlbG9wbWVudCBib2FyZCB0aGVuIGl0CisJICB3aWxsIGdlbmVyYXRlIGEgc3VpdGFibGUgaHcgYWRkcmVzcyBiYXNlZCBvbiB0aGUgYm9hcmQgc2VyaWFsCisJICBudW1iZXIgKE1URCBzdXBwb3J0IGlzIHJlcXVpcmVkIGZvciB0aGlzKS4gT3RoZXJ3aXNlIHlvdSB3aWxsCisJICBuZWVkIHRvIHNldCBhIHN1aXRhYmxlIGh3IGFkZHJlc3MgdXNpbmcgaWZjb25maWcuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9hcm0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkNzA2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FybS9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACisjIEZpbGU6IGRyaXZlcnMvbmV0L2FybS9NYWtlZmlsZQorIworIyBNYWtlZmlsZSBmb3IgdGhlIEFSTSBuZXR3b3JrIGRldmljZSBkcml2ZXJzCisjCisKK29iai0kKENPTkZJR19BUk1fQU03OUM5NjFBKQkrPSBhbTc5Yzk2MWEubworb2JqLSQoQ09ORklHX0FSTV9FVEhFUjAwKQkrPSBldGhlcjAwLm8KK29iai0kKENPTkZJR19BUk1fRVRIRVJIKQkrPSBldGhlcmgubworb2JqLSQoQ09ORklHX0FSTV9FVEhFUjMpCSs9IGV0aGVyMy5vCitvYmotJChDT05GSUdfQVJNX0VUSEVSMSkJKz0gZXRoZXIxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9hbTc5Yzk2MWEuYyBiL2RyaXZlcnMvbmV0L2FybS9hbTc5Yzk2MWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjY1OWUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJtL2FtNzljOTYxYS5jCkBAIC0wLDAgKzEsNzUwIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvbmV0L2FtNzljOTYxLmMKKyAqCisgKiAgYnkgUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4gMTk5NS0yMDAxLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogRGVyaXZlZCBmcm9tIHZhcmlvdXMgdGhpbmdzIGluY2x1ZGluZyBza2VsZXRvbi5jCisgKgorICogVGhpcyBpcyBhIHNwZWNpYWwgZHJpdmVyIGZvciB0aGUgYW03OWM5NjFBIExhbmNlIGNoaXAgdXNlZCBpbiB0aGUKKyAqIEludGVsIChmb3JtYWxseSBEaWdpdGFsIEVxdWlwbWVudCBDb3JwKSBFQlNBMTEwIHBsYXRmb3JtLiAgUGxlYXNlCisgKiBub3RlIHRoYXQgdGhpcyBjYW4gbm90IGJlIGJ1aWx0IGFzIGEgbW9kdWxlIChpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UpLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNkZWZpbmUgVFhfQlVGRkVSUyAxNQorI2RlZmluZSBSWF9CVUZGRVJTIDI1CisKKyNpbmNsdWRlICJhbTc5Yzk2MWEuaCIKKworc3RhdGljIGlycXJldHVybl90CithbTc5Yzk2MV9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldF9kZWJ1ZyA9IE5FVF9ERUJVRzsKKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKwkiYW03OWM5NjEgZXRoZXJuZXQgZHJpdmVyIChDKSAxOTk1LTIwMDEgUnVzc2VsbCBLaW5nIHYwLjA0XG4iOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIF9fYXJtX18KK3N0YXRpYyB2b2lkIHdyaXRlX3JyZWcodV9sb25nIGJhc2UsIHVfaW50IHJlZywgdV9pbnQgdmFsKQoreworCV9fYXNtX18oCisJInN0ciU/aAklMSwgWyUyXQlAIE5FVF9SQVBcblx0IgorCSJzdHIlP2gJJTAsIFslMiwgIy00XQlAIE5FVF9SRFAiCisJOgorCTogInIiICh2YWwpLCAiciIgKHJlZyksICJyIiAoSVNBSU9fQkFTRSArIDB4MDQ2NCkpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHJlYWRfcnJlZyh1X2xvbmcgYmFzZV9hZGRyLCB1X2ludCByZWcpCit7CisJdW5zaWduZWQgc2hvcnQgdjsKKwlfX2FzbV9fKAorCSJzdHIlP2gJJTEsIFslMl0JQCBORVRfUkFQXG5cdCIKKwkibGRyJT9oCSUwLCBbJTIsICMtNF0JQCBORVRfUkRQIgorCTogIj1yIiAodikKKwk6ICJyIiAocmVnKSwgInIiIChJU0FJT19CQVNFICsgMHgwNDY0KSk7CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9pcmVnKHVfbG9uZyBiYXNlLCB1X2ludCByZWcsIHVfaW50IHZhbCkKK3sKKwlfX2FzbV9fKAorCSJzdHIlP2gJJTEsIFslMl0JQCBORVRfUkFQXG5cdCIKKwkic3RyJT9oCSUwLCBbJTIsICM4XQlAIE5FVF9JRFAiCisJOgorCTogInIiICh2YWwpLCAiciIgKHJlZyksICJyIiAoSVNBSU9fQkFTRSArIDB4MDQ2NCkpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHJlYWRfaXJlZyh1X2xvbmcgYmFzZV9hZGRyLCB1X2ludCByZWcpCit7CisJdV9zaG9ydCB2OworCV9fYXNtX18oCisJInN0ciU/aAklMSwgWyUyXQlAIE5BVF9SQVBcblx0IgorCSJzdHIlP2gJJTAsIFslMiwgIzhdCUAgTkVUX0lEUFxuXHQiCisJOiAiPXIiICh2KQorCTogInIiIChyZWcpLCAiciIgKElTQUlPX0JBU0UgKyAweDA0NjQpKTsKKwlyZXR1cm4gdjsKK30KKworI2RlZmluZSBhbV93cml0ZXdvcmQoZGV2LG9mZix2YWwpIF9fcmF3X3dyaXRldyh2YWwsIElTQU1FTV9CQVNFICsgKChvZmYpIDw8IDEpKQorI2RlZmluZSBhbV9yZWFkd29yZChkZXYsb2ZmKSAgICAgIF9fcmF3X3JlYWR3KElTQU1FTV9CQVNFICsgKChvZmYpIDw8IDEpKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2FtX3dyaXRlYnVmZmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfaW50IG9mZnNldCwgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCW9mZnNldCA9IElTQU1FTV9CQVNFICsgKG9mZnNldCA8PCAxKTsKKwlsZW5ndGggPSAobGVuZ3RoICsgMSkgJiB+MTsKKwlpZiAoKGludClidWYgJiAyKSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdHIlP2gJJTIsIFslMF0sICM0IgorCQkgOiAiPSZyIiAob2Zmc2V0KSA6ICIwIiAob2Zmc2V0KSwgInIiIChidWZbMF0gfCAoYnVmWzFdIDw8IDgpKSk7CisJCWJ1ZiArPSAyOworCQlsZW5ndGggLT0gMjsKKwl9CisJd2hpbGUgKGxlbmd0aCA+IDgpIHsKKwkJdW5zaWduZWQgaW50IHRtcCwgdG1wMjsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCQkibGRtJT9pYQklMSEsIHslMiwgJTN9XG5cdCIKKwkJCSJzdHIlP2gJJTIsIFslMF0sICM0XG5cdCIKKwkJCSJtb3YlPwklMiwgJTIsIGxzciAjMTZcblx0IgorCQkJInN0ciU/aAklMiwgWyUwXSwgIzRcblx0IgorCQkJInN0ciU/aAklMywgWyUwXSwgIzRcblx0IgorCQkJIm1vdiU/CSUzLCAlMywgbHNyICMxNlxuXHQiCisJCQkic3RyJT9oCSUzLCBbJTBdLCAjNCIKKwkJOiAiPSZyIiAob2Zmc2V0KSwgIj0mciIgKGJ1ZiksICI9ciIgKHRtcCksICI9ciIgKHRtcDIpCisJCTogIjAiIChvZmZzZXQpLCAiMSIgKGJ1ZikpOworCQlsZW5ndGggLT0gODsKKwl9CisJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN0ciU/aAklMiwgWyUwXSwgIzQiCisJCSA6ICI9JnIiIChvZmZzZXQpIDogIjAiIChvZmZzZXQpLCAiciIgKGJ1ZlswXSB8IChidWZbMV0gPDwgOCkpKTsKKwkJYnVmICs9IDI7CisJCWxlbmd0aCAtPSAyOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCithbV9yZWFkYnVmZmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfaW50IG9mZnNldCwgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCW9mZnNldCA9IElTQU1FTV9CQVNFICsgKG9mZnNldCA8PCAxKTsKKwlsZW5ndGggPSAobGVuZ3RoICsgMSkgJiB+MTsKKwlpZiAoKGludClidWYgJiAyKSB7CisJCXVuc2lnbmVkIGludCB0bXA7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJImxkciU/aAklMiwgWyUwXSwgIzRcblx0IgorCQkJInN0ciU/YgklMiwgWyUxXSwgIzFcblx0IgorCQkJIm1vdiU/CSUyLCAlMiwgbHNyICM4XG5cdCIKKwkJCSJzdHIlP2IJJTIsIFslMV0sICMxIgorCQk6ICI9JnIiIChvZmZzZXQpLCAiPSZyIiAoYnVmKSwgIj1yIiAodG1wKTogIjAiIChvZmZzZXQpLCAiMSIgKGJ1ZikpOworCQlsZW5ndGggLT0gMjsKKwl9CisJd2hpbGUgKGxlbmd0aCA+IDgpIHsKKwkJdW5zaWduZWQgaW50IHRtcCwgdG1wMiwgdG1wMzsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCQkibGRyJT9oCSUyLCBbJTBdLCAjNFxuXHQiCisJCQkibGRyJT9oCSUzLCBbJTBdLCAjNFxuXHQiCisJCQkib3JyJT8JJTIsICUyLCAlMywgbHNsICMxNlxuXHQiCisJCQkibGRyJT9oCSUzLCBbJTBdLCAjNFxuXHQiCisJCQkibGRyJT9oCSU0LCBbJTBdLCAjNFxuXHQiCisJCQkib3JyJT8JJTMsICUzLCAlNCwgbHNsICMxNlxuXHQiCisJCQkic3RtJT9pYQklMSEsIHslMiwgJTN9IgorCQk6ICI9JnIiIChvZmZzZXQpLCAiPSZyIiAoYnVmKSwgIj1yIiAodG1wKSwgIj1yIiAodG1wMiksICI9ciIgKHRtcDMpCisJCTogIjAiIChvZmZzZXQpLCAiMSIgKGJ1ZikpOworCQlsZW5ndGggLT0gODsKKwl9CisJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJdW5zaWduZWQgaW50IHRtcDsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCQkibGRyJT9oCSUyLCBbJTBdLCAjNFxuXHQiCisJCQkic3RyJT9iCSUyLCBbJTFdLCAjMVxuXHQiCisJCQkibW92JT8JJTIsICUyLCBsc3IgIzhcblx0IgorCQkJInN0ciU/YgklMiwgWyUxXSwgIzEiCisJCTogIj0mciIgKG9mZnNldCksICI9JnIiIChidWYpLCAiPXIiICh0bXApIDogIjAiIChvZmZzZXQpLCAiMSIgKGJ1ZikpOworCQlsZW5ndGggLT0gMjsKKwl9Cit9CisjZWxzZQorI2Vycm9yIE5vdCBjb21wYXRpYmxlCisjZW5kaWYKKworc3RhdGljIGludAorYW03OWM5NjFfcmFtdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IGttYWxsb2MgKDY1NTM2LCBHRlBfS0VSTkVMKTsKKwlpbnQgaSwgZXJyb3IgPSAwLCBlcnJvcmNvdW50ID0gMDsKKworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gMDsKKwltZW1zZXQgKGJ1ZmZlciwgdmFsLCA2NTUzNik7CisJYW1fd3JpdGVidWZmZXIoZGV2LCAwLCBidWZmZXIsIDY1NTM2KTsKKwltZW1zZXQgKGJ1ZmZlciwgdmFsIF4gMjU1LCA2NTUzNik7CisJYW1fcmVhZGJ1ZmZlcihkZXYsIDAsIGJ1ZmZlciwgNjU1MzYpOworCWZvciAoaSA9IDA7IGkgPCA2NTUzNjsgaSsrKSB7CisJCWlmIChidWZmZXJbaV0gIT0gdmFsICYmICFlcnJvcikgeworCQkJcHJpbnRrICgiJXM6IGJ1ZmZlciBlcnJvciAoJTAyWCAlMDJYKSAlMDVYIC0gIiwgZGV2LT5uYW1lLCB2YWwsIGJ1ZmZlcltpXSwgaSk7CisJCQllcnJvciA9IDE7CisJCQllcnJvcmNvdW50ICsrOworCQl9IGVsc2UgaWYgKGVycm9yICYmIGJ1ZmZlcltpXSA9PSB2YWwpIHsKKwkJCXByaW50ayAoIiUwNVhcbiIsIGkpOworCQkJZXJyb3IgPSAwOworCQl9CisJfQorCWlmIChlcnJvcikKKwkJcHJpbnRrICgiMTAwMDBcbiIpOworCWtmcmVlIChidWZmZXIpOworCXJldHVybiBlcnJvcmNvdW50OworfQorCitzdGF0aWMgdm9pZAorYW03OWM5NjFfaW5pdF9mb3Jfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyICpwOworCXVfaW50IGhkcl9hZGRyLCBmaXJzdF9mcmVlX2FkZHI7CisJaW50IGk7CisKKwkvKgorCSAqIFN0b3AgdGhlIGNoaXAuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUocHJpdi0+Y2hpcF9sb2NrLCBmbGFncyk7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIENTUjAsIENTUjBfQkFCTHxDU1IwX0NFUlJ8Q1NSMF9NSVNTfENTUjBfTUVSUnxDU1IwX1RJTlR8Q1NSMF9SSU5UfENTUjBfU1RPUCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwcml2LT5jaGlwX2xvY2ssIGZsYWdzKTsKKworCXdyaXRlX2lyZWcgKGRldi0+YmFzZV9hZGRyLCA1LCAweDAwYTApOyAvKiBSZWNlaXZlIGFkZHJlc3MgTEVEICovCisJd3JpdGVfaXJlZyAoZGV2LT5iYXNlX2FkZHIsIDYsIDB4MDA4MSk7IC8qIENvbGxpc2lvbiBMRUQgKi8KKwl3cml0ZV9pcmVnIChkZXYtPmJhc2VfYWRkciwgNywgMHgwMDkwKTsgLyogWE1JVCBMRUQgKi8KKwl3cml0ZV9pcmVnIChkZXYtPmJhc2VfYWRkciwgMiwgMHgwMDAwKTsgLyogTU9ERSByZWdpc3RlciBzZWxlY3RzIG1lZGlhICovCisKKwlmb3IgKGkgPSBMQURSTDsgaSA8PSBMQURSSDsgaSsrKQorCQl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgaSwgMCk7CisKKwlmb3IgKGkgPSBQQURSTCwgcCA9IGRldi0+ZGV2X2FkZHI7IGkgPD0gUEFEUkg7IGkrKywgcCArPSAyKQorCQl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgaSwgcFswXSB8IChwWzFdIDw8IDgpKTsKKworCWkgPSBNT0RFX1BPUlRfMTBCVDsKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQlpIHw9IE1PREVfUFJPTUlTQzsKKworCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBNT0RFLCBpKTsKKwl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgUE9MTElOVCwgMCk7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIFNJWkVSWFIsIC1SWF9CVUZGRVJTKTsKKwl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgU0laRVRYUiwgLVRYX0JVRkZFUlMpOworCisJZmlyc3RfZnJlZV9hZGRyID0gUlhfQlVGRkVSUyAqIDggKyBUWF9CVUZGRVJTICogOCArIDE2OworCWhkcl9hZGRyID0gMDsKKworCXByaXYtPnJ4aGVhZCA9IDA7CisJcHJpdi0+cnh0YWlsID0gMDsKKwlwcml2LT5yeGhkciA9IGhkcl9hZGRyOworCisJZm9yIChpID0gMDsgaSA8IFJYX0JVRkZFUlM7IGkrKykgeworCQlwcml2LT5yeGJ1ZmZlcltpXSA9IGZpcnN0X2ZyZWVfYWRkcjsKKwkJYW1fd3JpdGV3b3JkIChkZXYsIGhkcl9hZGRyLCBmaXJzdF9mcmVlX2FkZHIpOworCQlhbV93cml0ZXdvcmQgKGRldiwgaGRyX2FkZHIgKyAyLCBSTURfT1dOKTsKKwkJYW1fd3JpdGV3b3JkIChkZXYsIGhkcl9hZGRyICsgNCwgKC0xNjAwKSk7CisJCWFtX3dyaXRld29yZCAoZGV2LCBoZHJfYWRkciArIDYsIDApOworCQlmaXJzdF9mcmVlX2FkZHIgKz0gMTYwMDsKKwkJaGRyX2FkZHIgKz0gODsKKwl9CisJcHJpdi0+dHhoZWFkID0gMDsKKwlwcml2LT50eHRhaWwgPSAwOworCXByaXYtPnR4aGRyID0gaGRyX2FkZHI7CisJZm9yIChpID0gMDsgaSA8IFRYX0JVRkZFUlM7IGkrKykgeworCQlwcml2LT50eGJ1ZmZlcltpXSA9IGZpcnN0X2ZyZWVfYWRkcjsKKwkJYW1fd3JpdGV3b3JkIChkZXYsIGhkcl9hZGRyLCBmaXJzdF9mcmVlX2FkZHIpOworCQlhbV93cml0ZXdvcmQgKGRldiwgaGRyX2FkZHIgKyAyLCBUTURfU1RQfFRNRF9FTlApOworCQlhbV93cml0ZXdvcmQgKGRldiwgaGRyX2FkZHIgKyA0LCAweGYwMDApOworCQlhbV93cml0ZXdvcmQgKGRldiwgaGRyX2FkZHIgKyA2LCAwKTsKKwkJZmlyc3RfZnJlZV9hZGRyICs9IDE2MDA7CisJCWhkcl9hZGRyICs9IDg7CisJfQorCisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIEJBU0VSWEwsIHByaXYtPnJ4aGRyKTsKKwl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgQkFTRVJYSCwgMCk7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIEJBU0VUWEwsIHByaXYtPnR4aGRyKTsKKwl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgQkFTRVJYSCwgMCk7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIENTUjAsIENTUjBfU1RPUCk7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIENTUjMsIENTUjNfSURPTk18Q1NSM19CQUJMTXxDU1IzX0RYU1VGTE8pOworCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBDU1I0LCBDU1I0X0FQQURfWE1JVHxDU1I0X01GQ09NfENTUjRfUkNWQ0NPTXxDU1I0X1RYU1RSVE18Q1NSNF9KQUJNKTsKKwl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgQ1NSMCwgQ1NSMF9JRU5BfENTUjBfU1RSVCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtNzljOTYxX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBsbmtzdGF0LCBjYXJyaWVyOworCisJbG5rc3RhdCA9IHJlYWRfaXJlZyhkZXYtPmJhc2VfYWRkciwgSVNBTEVEMCkgJiBJU0FMRUQwX0xOS1NUOworCWNhcnJpZXIgPSBuZXRpZl9jYXJyaWVyX29rKGRldik7CisKKwlpZiAobG5rc3RhdCAmJiAhY2FycmllcikKKwkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCWVsc2UgaWYgKCFsbmtzdGF0ICYmIGNhcnJpZXIpCisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwltb2RfdGltZXIoJnByaXYtPnRpbWVyLCBqaWZmaWVzICsgNSpIWik7Cit9CisKKy8qCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLgorICovCitzdGF0aWMgaW50CithbTc5Yzk2MV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJbWVtc2V0ICgmcHJpdi0+c3RhdHMsIDAsIHNpemVvZiAocHJpdi0+c3RhdHMpKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBhbTc5Yzk2MV9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYW03OWM5NjFfaW5pdF9mb3Jfb3BlbihkZXYpOworCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCXByaXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzOworCWFkZF90aW1lcigmcHJpdi0+dGltZXIpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhlIGludmVyc2Ugcm91dGluZSB0byBhbTc5Yzk2MV9vcGVuKCkuCisgKi8KK3N0YXRpYyBpbnQKK2FtNzljOTYxX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPnRpbWVyKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUocHJpdi0+Y2hpcF9sb2NrLCBmbGFncyk7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIENTUjAsIENTUjBfU1RPUCk7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIENTUjMsIENTUjNfTUFTS0FMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwcml2LT5jaGlwX2xvY2ssIGZsYWdzKTsKKworCWZyZWVfaXJxIChkZXYtPmlycSwgZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYW03OWM5NjFfZ2V0c3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJnByaXYtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBhbTc5Yzk2MV9tY19oYXNoKHN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pLCB1bnNpZ25lZCBzaG9ydCAqaGFzaCkKK3sKKwlpZiAoZG1pLT5kbWlfYWRkcmxlbiA9PSBFVEhfQUxFTiAmJiBkbWktPmRtaV9hZGRyWzBdICYgMHgwMSkgeworCQlpbnQgaWR4LCBiaXQ7CisJCXUzMiBjcmM7CisKKwkJY3JjID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBkbWktPmRtaV9hZGRyKTsKKworCQlpZHggPSBjcmMgPj4gMzA7CisJCWJpdCA9IChjcmMgPj4gMjYpICYgMTU7CisKKwkJaGFzaFtpZHhdIHw9IDEgPDwgYml0OworCX0KK30KKworLyoKKyAqIFNldCBvciBjbGVhciBwcm9taXNjdW91cy9tdWx0aWNhc3QgbW9kZSBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRlci4KKyAqLworc3RhdGljIHZvaWQgYW03OWM5NjFfc2V0bXVsdGljYXN0bGlzdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgbXVsdGlfaGFzaFs0XSwgbW9kZTsKKwlpbnQgaSwgc3RvcHBlZDsKKworCW1vZGUgPSBNT0RFX1BPUlRfMTBCVDsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJbW9kZSB8PSBNT0RFX1BST01JU0M7CisJfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCW1lbXNldChtdWx0aV9oYXNoLCAweGZmLCBzaXplb2YobXVsdGlfaGFzaCkpOworCX0gZWxzZSB7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCisJCW1lbXNldChtdWx0aV9oYXNoLCAweDAwLCBzaXplb2YobXVsdGlfaGFzaCkpOworCisJCWZvciAoZG1pID0gZGV2LT5tY19saXN0OyBkbWk7IGRtaSA9IGRtaS0+bmV4dCkKKwkJCWFtNzljOTYxX21jX2hhc2goZG1pLCBtdWx0aV9oYXNoKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZShwcml2LT5jaGlwX2xvY2ssIGZsYWdzKTsKKworCXN0b3BwZWQgPSByZWFkX3JyZWcoZGV2LT5iYXNlX2FkZHIsIENTUjApICYgQ1NSMF9TVE9QOworCisJaWYgKCFzdG9wcGVkKSB7CisJCS8qCisJCSAqIFB1dCB0aGUgY2hpcCBpbnRvIHN1c3BlbmQgbW9kZQorCQkgKi8KKwkJd3JpdGVfcnJlZyhkZXYtPmJhc2VfYWRkciwgQ1RSTDEsIENUUkwxX1NQTkQpOworCisJCS8qCisJCSAqIFNwaW4gd2FpdGluZyBmb3IgY2hpcCB0byByZXBvcnQgc3VzcGVuZCBtb2RlCisJCSAqLworCQl3aGlsZSAoKHJlYWRfcnJlZyhkZXYtPmJhc2VfYWRkciwgQ1RSTDEpICYgQ1RSTDFfU1BORCkgPT0gMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwcml2LT5jaGlwX2xvY2ssIGZsYWdzKTsKKwkJCW5vcCgpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUocHJpdi0+Y2hpcF9sb2NrLCBmbGFncyk7CisJCX0KKwl9CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgbXVsdGljYXN0IGhhc2ggdGFibGUKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG11bHRpX2hhc2gpIC8gc2l6ZW9mKG11bHRpX2hhc2hbMF0pOyBpKyspCisJCXdyaXRlX3JyZWcoZGV2LT5iYXNlX2FkZHIsIGkgKyBMQURSTCwgbXVsdGlfaGFzaFtpXSk7CisKKwkvKgorCSAqIFdyaXRlIHRoZSBtb2RlIHJlZ2lzdGVyCisJICovCisJd3JpdGVfcnJlZyhkZXYtPmJhc2VfYWRkciwgTU9ERSwgbW9kZSk7CisKKwlpZiAoIXN0b3BwZWQpIHsKKwkJLyoKKwkJICogUHV0IHRoZSBjaGlwIGJhY2sgaW50byBydW5uaW5nIG1vZGUKKwkJICovCisJCXdyaXRlX3JyZWcoZGV2LT5iYXNlX2FkZHIsIENUUkwxLCAwKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHByaXYtPmNoaXBfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhbTc5Yzk2MV90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgbmV0d29yayBjYWJsZSBwcm9ibGVtP1xuIiwKKwkJZGV2LT5uYW1lKTsKKworCS8qCisJICogb3VnaHQgdG8gZG8gc29tZSBzZXR1cCBvZiB0aGUgdHggc2lkZSBoZXJlCisJICovCisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKiBUcmFuc21pdCBhIHBhY2tldAorICovCitzdGF0aWMgaW50CithbTc5Yzk2MV9zZW5kcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgaGRyYWRkciwgYnVmYWRkcjsKKwl1bnNpZ25lZCBpbnQgaGVhZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaGVhZCA9IHByaXYtPnR4aGVhZDsKKwloZHJhZGRyID0gcHJpdi0+dHhoZHIgKyAoaGVhZCA8PCAzKTsKKwlidWZhZGRyID0gcHJpdi0+dHhidWZmZXJbaGVhZF07CisJaGVhZCArPSAxOworCWlmIChoZWFkID49IFRYX0JVRkZFUlMpCisJCWhlYWQgPSAwOworCisJYW1fd3JpdGVidWZmZXIgKGRldiwgYnVmYWRkciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJYW1fd3JpdGV3b3JkIChkZXYsIGhkcmFkZHIgKyA0LCAtc2tiLT5sZW4pOworCWFtX3dyaXRld29yZCAoZGV2LCBoZHJhZGRyICsgMiwgVE1EX09XTnxUTURfU1RQfFRNRF9FTlApOworCXByaXYtPnR4aGVhZCA9IGhlYWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShwcml2LT5jaGlwX2xvY2ssIGZsYWdzKTsKKwl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgQ1NSMCwgQ1NSMF9URE1EfENTUjBfSUVOQSk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwcml2LT5jaGlwX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogSWYgdGhlIG5leHQgcGFja2V0IGlzIG93bmVkIGJ5IHRoZSBldGhlcm5ldCBkZXZpY2UsCisJICogdGhlbiB0aGUgdHggcmluZyBpcyBmdWxsIGFuZCB3ZSBjYW4ndCBhZGQgYW5vdGhlcgorCSAqIHBhY2tldC4KKwkgKi8KKwlpZiAoYW1fcmVhZHdvcmQoZGV2LCBwcml2LT50eGhkciArIChwcml2LT50eGhlYWQgPDwgMykgKyAyKSAmIFRNRF9PV04pCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogSWYgd2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkCithbTc5Yzk2MV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZGV2X3ByaXYgKnByaXYpCit7CisJZG8geworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQl1X2ludCBoZHJhZGRyOworCQl1X2ludCBwa3RhZGRyOworCQl1X2ludCBzdGF0dXM7CisJCWludCBsZW47CisKKwkJaGRyYWRkciA9IHByaXYtPnJ4aGRyICsgKHByaXYtPnJ4dGFpbCA8PCAzKTsKKwkJcGt0YWRkciA9IHByaXYtPnJ4YnVmZmVyW3ByaXYtPnJ4dGFpbF07CisKKwkJc3RhdHVzID0gYW1fcmVhZHdvcmQgKGRldiwgaGRyYWRkciArIDIpOworCQlpZiAoc3RhdHVzICYgUk1EX09XTikgLyogZG8gd2Ugb3duIGl0PyAqLworCQkJYnJlYWs7CisKKwkJcHJpdi0+cnh0YWlsICsrOworCQlpZiAocHJpdi0+cnh0YWlsID49IFJYX0JVRkZFUlMpCisJCQlwcml2LT5yeHRhaWwgPSAwOworCisJCWlmICgoc3RhdHVzICYgKFJNRF9FUlJ8Uk1EX1NUUHxSTURfRU5QKSkgIT0gKFJNRF9TVFB8Uk1EX0VOUCkpIHsKKwkJCWFtX3dyaXRld29yZCAoZGV2LCBoZHJhZGRyICsgMiwgUk1EX09XTik7CisJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMgKys7CisJCQlpZiAoc3RhdHVzICYgUk1EX0VSUikgeworCQkJCWlmIChzdGF0dXMgJiBSTURfRlJBTSkKKwkJCQkJcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICsrOworCQkJCWlmIChzdGF0dXMgJiBSTURfQ1JDKQorCQkJCQlwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzICsrOworCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBSTURfU1RQKQorCQkJCXByaXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWxlbiA9IGFtX3JlYWR3b3JkKGRldiwgaGRyYWRkciArIDYpOworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOworCisJCWlmIChza2IpIHsKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKworCQkJYW1fcmVhZGJ1ZmZlcihkZXYsIHBrdGFkZHIsIHNrYl9wdXQoc2tiLCBsZW4pLCBsZW4pOworCQkJYW1fd3JpdGV3b3JkKGRldiwgaGRyYWRkciArIDIsIFJNRF9PV04pOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQkJcHJpdi0+c3RhdHMucnhfcGFja2V0cyArKzsKKwkJfSBlbHNlIHsKKwkJCWFtX3dyaXRld29yZCAoZGV2LCBoZHJhZGRyICsgMiwgUk1EX09XTik7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCArKzsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7Cit9CisKKy8qCisgKiBVcGRhdGUgc3RhdHMgZm9yIHRoZSB0cmFuc21pdHRlZCBwYWNrZXQKKyAqLworc3RhdGljIHZvaWQKK2FtNzljOTYxX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZfcHJpdiAqcHJpdikKK3sKKwlkbyB7CisJCXNob3J0IGxlbjsKKwkJdV9pbnQgaGRyYWRkcjsKKwkJdV9pbnQgc3RhdHVzOworCisJCWhkcmFkZHIgPSBwcml2LT50eGhkciArIChwcml2LT50eHRhaWwgPDwgMyk7CisJCXN0YXR1cyA9IGFtX3JlYWR3b3JkIChkZXYsIGhkcmFkZHIgKyAyKTsKKwkJaWYgKHN0YXR1cyAmIFRNRF9PV04pCisJCQlicmVhazsKKworCQlwcml2LT50eHRhaWwgKys7CisJCWlmIChwcml2LT50eHRhaWwgPj0gVFhfQlVGRkVSUykKKwkJCXByaXYtPnR4dGFpbCA9IDA7CisKKwkJaWYgKHN0YXR1cyAmIFRNRF9FUlIpIHsKKwkJCXVfaW50IHN0YXR1czI7CisKKwkJCXByaXYtPnN0YXRzLnR4X2Vycm9ycyArKzsKKworCQkJc3RhdHVzMiA9IGFtX3JlYWR3b3JkIChkZXYsIGhkcmFkZHIgKyA2KTsKKworCQkJLyoKKwkJCSAqIENsZWFyIHRoZSBlcnJvciBieXRlCisJCQkgKi8KKwkJCWFtX3dyaXRld29yZCAoZGV2LCBoZHJhZGRyICsgNiwgMCk7CisKKwkJCWlmIChzdGF0dXMyICYgVFNUX1JUUlkpCisJCQkJcHJpdi0+c3RhdHMuY29sbGlzaW9ucyArPSAxNjsKKwkJCWlmIChzdGF0dXMyICYgVFNUX0xDT0wpCisJCQkJcHJpdi0+c3RhdHMudHhfd2luZG93X2Vycm9ycyArKzsKKwkJCWlmIChzdGF0dXMyICYgVFNUX0xDQVIpCisJCQkJcHJpdi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgKys7CisJCQlpZiAoc3RhdHVzMiAmIFRTVF9VRkxPKQorCQkJCXByaXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzICsrOworCQkJY29udGludWU7CisJCX0KKwkJcHJpdi0+c3RhdHMudHhfcGFja2V0cyArKzsKKwkJbGVuID0gYW1fcmVhZHdvcmQgKGRldiwgaGRyYWRkciArIDQpOworCQlwcml2LT5zdGF0cy50eF9ieXRlcyArPSAtbGVuOworCX0gd2hpbGUgKHByaXYtPnR4dGFpbCAhPSBwcml2LT50eGhlYWQpOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK2FtNzljOTYxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IGRldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1X2ludCBzdGF0dXMsIG4gPSAxMDA7CisJaW50IGhhbmRsZWQgPSAwOworCisJZG8geworCQlzdGF0dXMgPSByZWFkX3JyZWcoZGV2LT5iYXNlX2FkZHIsIENTUjApOworCQl3cml0ZV9ycmVnKGRldi0+YmFzZV9hZGRyLCBDU1IwLCBzdGF0dXMgJgorCQkJICAgKENTUjBfSUVOQXxDU1IwX1RJTlR8Q1NSMF9SSU5UfAorCQkJICAgIENTUjBfTUVSUnxDU1IwX01JU1N8Q1NSMF9DRVJSfENTUjBfQkFCTCkpOworCisJCWlmIChzdGF0dXMgJiBDU1IwX1JJTlQpIHsKKwkJCWhhbmRsZWQgPSAxOworCQkJYW03OWM5NjFfcngoZGV2LCBwcml2KTsKKwkJfQorCQlpZiAoc3RhdHVzICYgQ1NSMF9USU5UKSB7CisJCQloYW5kbGVkID0gMTsKKwkJCWFtNzljOTYxX3R4KGRldiwgcHJpdik7CisJCX0KKwkJaWYgKHN0YXR1cyAmIENTUjBfTUlTUykgeworCQkJaGFuZGxlZCA9IDE7CisJCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkICsrOworCQl9CisJCWlmIChzdGF0dXMgJiBDU1IwX0NFUlIpIHsKKwkJCWhhbmRsZWQgPSAxOworCQkJbW9kX3RpbWVyKCZwcml2LT50aW1lciwgamlmZmllcyk7CisJCX0KKwl9IHdoaWxlICgtLW4gJiYgc3RhdHVzICYgKENTUjBfUklOVCB8IENTUjBfVElOVCkpOworCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgYW03OWM5NjFfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYW03OWM5NjFfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKyNlbmRpZgorCisvKgorICogSW5pdGlhbGlzZSB0aGUgY2hpcC4gIE5vdGUgdGhhdCB3ZSBhbHdheXMgZXhwZWN0CisgKiB0byBiZSBlbnRlcmVkIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLgorICovCitzdGF0aWMgaW50CithbTc5Yzk2MV9od19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJnByaXYtPmNoaXBfbG9jayk7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIENTUjAsIENTUjBfU1RPUCk7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIENTUjMsIENTUjNfTUFTS0FMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5jaGlwX2xvY2spOworCisJYW03OWM5NjFfcmFtdGVzdChkZXYsIDB4NjYpOworCWFtNzljOTYxX3JhbXRlc3QoZGV2LCAweDk5KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgYW03OWM5NjFfYmFubmVyKHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKworCWlmIChuZXRfZGVidWcgJiYgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKK30KKworc3RhdGljIGludCBfX2luaXQgYW03OWM5NjFfaW5pdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGRldl9wcml2ICpwcml2OworCWludCBpLCByZXQ7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGRldl9wcml2KSk7CisJcmV0ID0gLUVOT01FTTsKKwlpZiAoIWRldikKKwkJZ290byBvdXQ7CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qCisJICogRml4ZWQgYWRkcmVzcyBhbmQgSVJRIGxpbmVzIGhlcmUuCisJICogVGhlIFBOUCBpbml0aWFsaXNhdGlvbiBzaG91bGQgaGF2ZSBiZWVuCisJICogZG9uZSBieSB0aGUgZXRoZXIgYm9vdHAgbG9hZGVyLgorCSAqLworCWRldi0+YmFzZV9hZGRyID0gMHgyMjA7CisJZGV2LT5pcnEgPSBJUlFfRUJTQTExMF9FVEhFUk5FVDsKKworICAgIAlyZXQgPSAtRU5PREVWOworCWlmICghcmVxdWVzdF9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIDB4MTgsIGRldi0+bmFtZSkpCisJCWdvdG8gbm9kZXY7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBkZXZpY2UuCisJICovCisJaW5iKGRldi0+YmFzZV9hZGRyICsgTkVUX1JFU0VUKTsKKwl1ZGVsYXkoNSk7CisKKwkvKgorCSAqIENoZWNrIHRoZSBtYW51ZmFjdHVyZXIgcGFydCBvZiB0aGUKKwkgKiBldGhlciBhZGRyZXNzLgorCSAqLworCWlmIChpbmIoZGV2LT5iYXNlX2FkZHIpICE9IDB4MDggfHwKKwkgICAgaW5iKGRldi0+YmFzZV9hZGRyICsgMikgIT0gMHgwMCB8fAorCSAgICBpbmIoZGV2LT5iYXNlX2FkZHIgKyA0KSAhPSAweDJiKQorCSAgICAJZ290byByZWxlYXNlOworCisJYW03OWM5NjFfYmFubmVyKCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGV0aGVyIGFkZHJlc3MgIiwgZGV2LT5uYW1lKTsKKworCS8qIFJldHJpdmUgYW5kIHByaW50IHRoZSBldGhlcm5ldCBhZGRyZXNzLiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGluYihkZXYtPmJhc2VfYWRkciArIGkgKiAyKSAmIDB4ZmY7CisJCXByaW50ayAoaSA9PSA1ID8gIiUwMnhcbiIgOiAiJTAyeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+Y2hpcF9sb2NrKTsKKwlpbml0X3RpbWVyKCZwcml2LT50aW1lcik7CisJcHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlwcml2LT50aW1lci5mdW5jdGlvbiA9IGFtNzljOTYxX3RpbWVyOworCisJaWYgKGFtNzljOTYxX2h3X2luaXQoZGV2KSkKKwkJZ290byByZWxlYXNlOworCisJZGV2LT5vcGVuCQk9IGFtNzljOTYxX29wZW47CisJZGV2LT5zdG9wCQk9IGFtNzljOTYxX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gYW03OWM5NjFfc2VuZHBhY2tldDsKKwlkZXYtPmdldF9zdGF0cwkJPSBhbTc5Yzk2MV9nZXRzdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdAk9IGFtNzljOTYxX3NldG11bHRpY2FzdGxpc3Q7CisJZGV2LT50eF90aW1lb3V0CQk9IGFtNzljOTYxX3RpbWVvdXQ7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlcgk9IGFtNzljOTYxX3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgorCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gMDsKKworcmVsZWFzZToKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgMHgxOCk7Citub2RldjoKKwlmcmVlX25ldGRldihkZXYpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK19faW5pdGNhbGwoYW03OWM5NjFfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vYW03OWM5NjFhLmggYi9kcml2ZXJzL25ldC9hcm0vYW03OWM5NjFhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU5YjA1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FybS9hbTc5Yzk2MWEuaApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvbmV0L2FtNzljOTYxLmgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX2FtNzljOTYxYV9ICisjZGVmaW5lIF9MSU5VWF9hbTc5Yzk2MWFfSAorCisvKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcuIGRlYnVnIGZsYWdzOiAqLworI2RlZmluZSBERUJVR19UWAkgMgorI2RlZmluZSBERUJVR19SWAkgNAorI2RlZmluZSBERUJVR19JTlQJIDgKKyNkZWZpbmUgREVCVUdfSUMJMTYKKyNpZm5kZWYgTkVUX0RFQlVHCisjZGVmaW5lIE5FVF9ERUJVRyAJMAorI2VuZGlmCisKKyNkZWZpbmUgTkVUX1VJRAkJMAorI2RlZmluZSBORVRfUkRQCQkweDEwCisjZGVmaW5lIE5FVF9SQVAJCTB4MTIKKyNkZWZpbmUgTkVUX1JFU0VUCTB4MTQKKyNkZWZpbmUgTkVUX0lEUAkJMHgxNgorCisvKgorICogUkFQIHJlZ2lzdGVycworICovCisjZGVmaW5lIENTUjAJCTAKKyNkZWZpbmUgQ1NSMF9JTklUCTB4MDAwMQorI2RlZmluZSBDU1IwX1NUUlQJMHgwMDAyCisjZGVmaW5lIENTUjBfU1RPUAkweDAwMDQKKyNkZWZpbmUgQ1NSMF9URE1ECTB4MDAwOAorI2RlZmluZSBDU1IwX1RYT04JMHgwMDEwCisjZGVmaW5lIENTUjBfUlhPTgkweDAwMjAKKyNkZWZpbmUgQ1NSMF9JRU5BCTB4MDA0MAorI2RlZmluZSBDU1IwX0lOVFIJMHgwMDgwCisjZGVmaW5lIENTUjBfSURPTgkweDAxMDAKKyNkZWZpbmUgQ1NSMF9USU5UCTB4MDIwMAorI2RlZmluZSBDU1IwX1JJTlQJMHgwNDAwCisjZGVmaW5lIENTUjBfTUVSUgkweDA4MDAKKyNkZWZpbmUgQ1NSMF9NSVNTCTB4MTAwMAorI2RlZmluZSBDU1IwX0NFUlIJMHgyMDAwCisjZGVmaW5lIENTUjBfQkFCTAkweDQwMDAKKyNkZWZpbmUgQ1NSMF9FUlIJMHg4MDAwCisKKyNkZWZpbmUgQ1NSMwkJMworI2RlZmluZSBDU1IzX0VNQkEJMHgwMDA4CisjZGVmaW5lIENTUjNfRFhNVDJQRAkweDAwMTAKKyNkZWZpbmUgQ1NSM19MQVBQRU4JMHgwMDIwCisjZGVmaW5lIENTUjNfRFhTVUZMTwkweDAwNDAKKyNkZWZpbmUgQ1NSM19JRE9OTQkweDAxMDAKKyNkZWZpbmUgQ1NSM19USU5UTQkweDAyMDAKKyNkZWZpbmUgQ1NSM19SSU5UTQkweDA0MDAKKyNkZWZpbmUgQ1NSM19NRVJSTQkweDA4MDAKKyNkZWZpbmUgQ1NSM19NSVNTTQkweDEwMDAKKyNkZWZpbmUgQ1NSM19CQUJMTQkweDQwMDAKKyNkZWZpbmUgQ1NSM19NQVNLQUxMCTB4NUYwMAorCisjZGVmaW5lIENTUjQJCTQKKyNkZWZpbmUgQ1NSNF9KQUJNCTB4MDAwMQorI2RlZmluZSBDU1I0X0pBQgkweDAwMDIKKyNkZWZpbmUgQ1NSNF9UWFNUUlRNCTB4MDAwNAorI2RlZmluZSBDU1I0X1RYU1RSVAkweDAwMDgKKyNkZWZpbmUgQ1NSNF9SQ1ZDQ09NCTB4MDAxMAorI2RlZmluZSBDU1I0X1JDVkNDTwkweDAwMjAKKyNkZWZpbmUgQ1NSNF9NRkNPTQkweDAxMDAKKyNkZWZpbmUgQ1NSNF9NRkNPCTB4MDIwMAorI2RlZmluZSBDU1I0X0FTVFJQX1JDVgkweDA0MDAKKyNkZWZpbmUgQ1NSNF9BUEFEX1hNSVQJMHgwODAwCisKKyNkZWZpbmUgQ1RSTDEJCTUKKyNkZWZpbmUgQ1RSTDFfU1BORAkweDAwMDEKKworI2RlZmluZSBMQURSTAkJOAorI2RlZmluZSBMQURSTTEJCTkKKyNkZWZpbmUgTEFEUk0yCQkxMAorI2RlZmluZSBMQURSSAkJMTEKKyNkZWZpbmUgUEFEUkwJCTEyCisjZGVmaW5lIFBBRFJNCQkxMworI2RlZmluZSBQQURSSAkJMTQKKworI2RlZmluZSBNT0RFCQkxNQorI2RlZmluZSBNT0RFX0RJU1JYCTB4MDAwMQorI2RlZmluZSBNT0RFX0RJU1RYCTB4MDAwMgorI2RlZmluZSBNT0RFX0xPT1AJMHgwMDA0CisjZGVmaW5lIE1PREVfRFRDUkMJMHgwMDA4CisjZGVmaW5lIE1PREVfQ09MTAkweDAwMTAKKyNkZWZpbmUgTU9ERV9EUkVUUlkJMHgwMDIwCisjZGVmaW5lIE1PREVfSU5UTE9PUAkweDAwNDAKKyNkZWZpbmUgTU9ERV9QT1JUX0FVSQkweDAwMDAKKyNkZWZpbmUgTU9ERV9QT1JUXzEwQlQJMHgwMDgwCisjZGVmaW5lIE1PREVfRFJYUEEJMHgyMDAwCisjZGVmaW5lIE1PREVfRFJYQkEJMHg0MDAwCisjZGVmaW5lIE1PREVfUFJPTUlTQwkweDgwMDAKKworI2RlZmluZSBCQVNFUlhMCQkyNAorI2RlZmluZSBCQVNFUlhICQkyNQorI2RlZmluZSBCQVNFVFhMCQkzMAorI2RlZmluZSBCQVNFVFhICQkzMQorCisjZGVmaW5lIFBPTExJTlQJCTQ3CisKKyNkZWZpbmUgU0laRVJYUgkJNzYKKyNkZWZpbmUgU0laRVRYUgkJNzgKKworI2RlZmluZSBDU1JfTUZDCQkxMTIKKworI2RlZmluZSBSTURfRU5QCQkweDAxMDAKKyNkZWZpbmUgUk1EX1NUUAkJMHgwMjAwCisjZGVmaW5lIFJNRF9DUkMJCTB4MDgwMAorI2RlZmluZSBSTURfRlJBTQkweDIwMDAKKyNkZWZpbmUgUk1EX0VSUgkJMHg0MDAwCisjZGVmaW5lIFJNRF9PV04JCTB4ODAwMAorCisjZGVmaW5lIFRNRF9FTlAJCTB4MDEwMAorI2RlZmluZSBUTURfU1RQCQkweDAyMDAKKyNkZWZpbmUgVE1EX01PUkUJMHgxMDAwCisjZGVmaW5lIFRNRF9FUlIJCTB4NDAwMAorI2RlZmluZSBUTURfT1dOCQkweDgwMDAKKworI2RlZmluZSBUU1RfUlRSWQkweDA0MDAKKyNkZWZpbmUgVFNUX0xDQVIJMHgwODAwCisjZGVmaW5lIFRTVF9MQ09MCTB4MTAwMAorI2RlZmluZSBUU1RfVUZMTwkweDQwMDAKKyNkZWZpbmUgVFNUX0JVRkYJMHg4MDAwCisKKyNkZWZpbmUgSVNBTEVEMAkJMHgwMDA0CisjZGVmaW5lIElTQUxFRDBfTE5LU1QJMHg4MDAwCisKK3N0cnVjdCBkZXZfcHJpdiB7CisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisgICAgdW5zaWduZWQgbG9uZwlyeGJ1ZmZlcltSWF9CVUZGRVJTXTsKKyAgICB1bnNpZ25lZCBsb25nCXR4YnVmZmVyW1RYX0JVRkZFUlNdOworICAgIHVuc2lnbmVkIGNoYXIJdHhoZWFkOworICAgIHVuc2lnbmVkIGNoYXIJdHh0YWlsOworICAgIHVuc2lnbmVkIGNoYXIJcnhoZWFkOworICAgIHVuc2lnbmVkIGNoYXIJcnh0YWlsOworICAgIHVuc2lnbmVkIGxvbmcJcnhoZHI7CisgICAgdW5zaWduZWQgbG9uZwl0eGhkcjsKKyAgICBzcGlubG9ja190CQljaGlwX2xvY2s7CisgICAgc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7Cit9OworCitleHRlcm4gaW50CWFtNzljOTYxX3Byb2JlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vZXRoZXIwMC5jIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjFmNGUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyMDAuYwpAQCAtMCwwICsxLDEwMTcgQEAKKy8qCisgKiAgZHJpdmVycy9uZXQvZXRoZXIwMC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMSBBbHRlcmEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworLyogaW5jbHVkZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHF1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsZC9wbGRfaG90c3dhcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2V4Y2FsaWJ1ci5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZXRoZXIwMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3Rka3BoeS5oPgorCisKK01PRFVMRV9BVVRIT1IoIkNsaXZlIERhdmllcyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbHRlcmEgRXRoZXIwMCBJUCBjb3JlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIFBLVF9CVUZfU1ogMTU0MCAvKiBTaXplIG9mIGVhY2ggcnggYnVmZmVyICovCisjZGVmaW5lIEVUSF9OUiA0IC8qIE51bWJlciBvZiBNQUNzIHRoaXMgZHJpdmVyIHN1cHBvcnRzICovCisKKyNkZWZpbmUgREVCVUcoeCkKKworI2RlZmluZSBfX2RtYV92YSh4KSAodW5zaWduZWQgaW50KSgodW5zaWduZWQgaW50KXByaXYtPmRtYV9kYXRhKygoKHVuc2lnbmVkIGludCkoeCkpJihFWENfU1BTUkFNX0JMT0NLMF9TSVpFLTEpKSkKKyNkZWZpbmUgX19kbWFfcGEoeCkgKHVuc2lnbmVkIGludCkoRVhDX1NQU1JBTV9CTE9DSzBfQkFTRSsoKCh1bnNpZ25lZCBpbnQpKHgpKS0odW5zaWduZWQgaW50KXByaXYtPmRtYV9kYXRhKSkKKworI2RlZmluZSBFVEhFUjAwX0JBU0UJMAorI2RlZmluZQlFVEhFUjAwX1RZUEUKKyNkZWZpbmUgRVRIRVIwMF9OQU1FICJldGhlcjAwIgorI2RlZmluZSBNQUNfUkVHX1NJWkUgMHg0MDAgLyogc2l6ZSBvZiBNQUMgcmVnaXN0ZXIgYXJlYSAqLworCisKKworLyogdHlwZWRlZnMgKi8KKworLyogVGhlIGRlZmluaXRpb24gb2YgdGhlIGRyaXZlciBjb250cm9sIHN0cnVjdHVyZSAqLworCisjZGVmaW5lIFJYX05VTV9CVUZGICAgICAxMAorI2RlZmluZSBSWF9OVU1fRkRFU0MgICAgMTAKKyNkZWZpbmUgVFhfTlVNX0ZERVNDICAgIDEwCisKK3N0cnVjdCB0eF9mZGFfZW50eworCUZEQV9ERVNDICBmZDsKKwlCVUZfREVTQyAgYmQ7CisJQlVGX0RFU0MgIHBhZDsKK307CitzdHJ1Y3QgcnhfZmRhX2VudHsKKwlGREFfREVTQyAgZmQ7CisJQlVGX0RFU0MgIGJkOworCUJVRl9ERVNDICBwYWQ7Cit9Oworc3RydWN0IHJ4X2JsaXN0X2VudHsKKwlGREFfREVTQyAgZmQ7CisJQlVGX0RFU0MgIGJkOworCUJVRl9ERVNDICBwYWQ7Cit9Oworc3RydWN0IG5ldF9wcml2Cit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHNrX2J1ZmYqIHNrYjsKKwl2b2lkKiBkbWFfZGF0YTsKKwlzdHJ1Y3QgcnhfYmxpc3RfZW50KiAgcnhfYmxpc3RfdnA7CisJc3RydWN0IHJ4X2ZkYV9lbnQqIHJ4X2ZkYV9wdHI7CisJc3RydWN0IHR4X2ZkYV9lbnQqIHR4X2ZkYWxpc3RfdnA7CisJc3RydWN0IHRxX3N0cnVjdCAgdHFfbWVtdXBkYXRlOworCXVuc2lnbmVkIGNoYXIgICBtZW11cGRhdGVfc2NoZWR1bGVkOworCXVuc2lnbmVkIGNoYXIgICByeF9kaXNhYmxlZDsKKwl1bnNpZ25lZCBjaGFyICAgcXVldWVfc3RvcHBlZDsKKwlzcGlubG9ja190IHJ4X2xvY2s7Cit9OworCitzdGF0aWMgY29uc3QgY2hhciB2ZW5kb3JfaWRbMl09ezB4MDcsMHhlZH07CisKKyNpZmRlZiBFVEhFUjAwX0RFQlVHCisKKy8qIER1bXAgKG1vc3QpIHJlZ2lzdGVycyBmb3IgZGVidWdnaW5nIHB1cG9zZXMgKi8KKworc3RhdGljIHZvaWQgZHVtcF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpeworCXN0cnVjdCBuZXRfcHJpdiogcHJpdj1kZXYtPnByaXY7CisJdW5zaWduZWQgaW50KiBpOworCisJcHJpbnRrKCJcbiBSWCBmcmVlIGRlc2NyaXB0b3IgYXJlYTpcbiIpOworCisJZm9yKGk9KHVuc2lnbmVkIGludCopcHJpdi0+cnhfZmRhX3B0cjsKKwkgICAgaTwoKHVuc2lnbmVkIGludCopKHByaXYtPnJ4X2ZkYV9wdHIrUlhfTlVNX0ZERVNDKSk7KXsKKwkJcHJpbnRrKCIlIzh4ICUjOHggJSM4eCAlIzh4XG4iLCppLCooaSsxKSwqKGkrMiksKihpKzMpKTsKKwkJaSs9NDsKKwl9CisKKwlwcmludGsoIlxuIFJYIGJ1ZmZlciBsaXN0OlxuIik7CisKKwlmb3IoaT0odW5zaWduZWQgaW50Kilwcml2LT5yeF9ibGlzdF92cDsKKwkgICAgaTwoKHVuc2lnbmVkIGludCopKHByaXYtPnJ4X2JsaXN0X3ZwK1JYX05VTV9CVUZGKSk7KXsKKwkJcHJpbnRrKCIlIzh4ICUjOHggJSM4eCAlIzh4XG4iLCppLCooaSsxKSwqKGkrMiksKihpKzMpKTsKKwkJaSs9NDsKKwl9CisKKwlwcmludGsoIlxuIFRYIGZyYW1lIGRlc2NyaXB0b3IgbGlzdDpcbiIpOworCisJZm9yKGk9KHVuc2lnbmVkIGludCopcHJpdi0+dHhfZmRhbGlzdF92cDsKKwkgICAgaTwoKHVuc2lnbmVkIGludCopKHByaXYtPnR4X2ZkYWxpc3RfdnArVFhfTlVNX0ZERVNDKSk7KXsKKwkJcHJpbnRrKCIlIzh4ICUjOHggJSM4eCAlIzh4XG4iLCppLCooaSsxKSwqKGkrMiksKihpKzMpKTsKKwkJaSs9NDsKKwl9CisKKwlwcmludGsoIlxuZG1hIGN0bD0lI3hcbiIscmVhZHcoRVRIRVJfRE1BX0NUTChkZXYtPmJhc2VfYWRkcikpKTsKKwlwcmludGsoInR4ZnJtcHRyPSUjeFxuIixyZWFkdyhFVEhFUl9UWEZSTVBUUihkZXYtPmJhc2VfYWRkcikpKTsKKwlwcmludGsoInR4dGhyc2g9JSN4XG4iLHJlYWR3KEVUSEVSX1RYVEhSU0goZGV2LT5iYXNlX2FkZHIpKSk7CisJcHJpbnRrKCJ0eHBvbGxjdHI9JSN4XG4iLHJlYWR3KEVUSEVSX1RYUE9MTENUUihkZXYtPmJhc2VfYWRkcikpKTsKKwlwcmludGsoImJsZnJtcHRyPSUjeFxuIixyZWFkdyhFVEhFUl9CTEZSTVBUUihkZXYtPmJhc2VfYWRkcikpKTsKKwlwcmludGsoInJ4ZnJhZ3NpemU9JSN4XG4iLHJlYWR3KEVUSEVSX1JYRlJBR1NJWkUoZGV2LT5iYXNlX2FkZHIpKSk7CisJcHJpbnRrKCJ0eF9pbnRfZW49JSN4XG4iLHJlYWR3KEVUSEVSX0lOVF9FTihkZXYtPmJhc2VfYWRkcikpKTsKKwlwcmludGsoImZkYV9iYXM9JSN4XG4iLHJlYWR3KEVUSEVSX0ZEQV9CQVMoZGV2LT5iYXNlX2FkZHIpKSk7CisJcHJpbnRrKCJmZGFfbGltPSUjeFxuIixyZWFkdyhFVEhFUl9GREFfTElNKGRldi0+YmFzZV9hZGRyKSkpOworCXByaW50aygiaW50X3NyYz0lI3hcbiIscmVhZHcoRVRIRVJfSU5UX1NSQyhkZXYtPmJhc2VfYWRkcikpKTsKKwlwcmludGsoInBhdXNlY250PSUjeFxuIixyZWFkdyhFVEhFUl9QQVVTRUNOVChkZXYtPmJhc2VfYWRkcikpKTsKKwlwcmludGsoInJlbXBhdWNudD0lI3hcbiIscmVhZHcoRVRIRVJfUkVNUEFVQ05UKGRldi0+YmFzZV9hZGRyKSkpOworCXByaW50aygidHhjb25mcm1zdGF0PSUjeFxuIixyZWFkdyhFVEhFUl9UWENPTkZSTVNUQVQoZGV2LT5iYXNlX2FkZHIpKSk7CisJcHJpbnRrKCJtYWNfY3RsPSUjeFxuIixyZWFkdyhFVEhFUl9NQUNfQ1RMKGRldi0+YmFzZV9hZGRyKSkpOworCXByaW50aygiYXJjX2N0bD0lI3hcbiIscmVhZHcoRVRIRVJfQVJDX0NUTChkZXYtPmJhc2VfYWRkcikpKTsKKwlwcmludGsoInR4X2N0bD0lI3hcbiIscmVhZHcoRVRIRVJfVFhfQ1RMKGRldi0+YmFzZV9hZGRyKSkpOworfQorI2VuZGlmIC8qIEVUSEVSMDBfREVCVUcgKi8KKworCitzdGF0aWMgaW50IGV0aGVyMDBfd3JpdGVfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGFkZHJlc3MsIHNob3J0IHZhbHVlKQoreworCXZvbGF0aWxlIGludCBjb3VudCA9IDEwMjQ7CisJd3JpdGV3KHZhbHVlLEVUSEVSX01EX0RBVEEoZGV2LT5iYXNlX2FkZHIpKTsKKwl3cml0ZXcoIEVUSEVSX01EX0NBX0JVU1lfTVNLIHwKKwkJRVRIRVJfTURfQ0FfV1JfTVNLIHwKKwkJKGFkZHJlc3MgJiBFVEhFUl9NRF9DQV9BRERSX01TSyksCisJCUVUSEVSX01EX0NBKGRldi0+YmFzZV9hZGRyKSk7CisKKwkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCXdoaWxlKChyZWFkdyhFVEhFUl9NRF9DQShkZXYtPmJhc2VfYWRkcikpICYgRVRIRVJfTURfQ0FfQlVTWV9NU0spJiZjb3VudCl7CisJCWNvdW50LS07CisJfQorCWlmICghY291bnQpeworCQlwcmludGsoIldyaXRlIHRvIHBoeSBmYWlsZWQsIGFkZHI9JSN4LCBkYXRhPSUjeFxuIixhZGRyZXNzLCB2YWx1ZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGhlcjAwX3JlYWRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGFkZHJlc3MpCit7CisJdm9sYXRpbGUgaW50IGNvdW50ID0gMTAyNDsKKwl3cml0ZXcoIEVUSEVSX01EX0NBX0JVU1lfTVNLIHwKKwkJKGFkZHJlc3MgJiBFVEhFUl9NRF9DQV9BRERSX01TSyksCisJCUVUSEVSX01EX0NBKGRldi0+YmFzZV9hZGRyKSk7CisKKwkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCXdoaWxlKChyZWFkdyhFVEhFUl9NRF9DQShkZXYtPmJhc2VfYWRkcikpICYgRVRIRVJfTURfQ0FfQlVTWV9NU0spJiZjb3VudCl7CisJCWNvdW50LS07CisJfQorCWlmICghY291bnQpeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZWFkIGZyb20gcGh5IHRpbWVkIG91dFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gcmVhZHcoRVRIRVJfTURfREFUQShkZXYtPmJhc2VfYWRkcikpOworfQorCitzdGF0aWMgdm9pZCBldGhlcjAwX3BoeV9pbnQoaW50IGlycV9udW0sIHZvaWQqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UqIGRldj1kZXZfaWQ7CisJaW50IGlycV9zdGF0dXM7CisKKwlpcnFfc3RhdHVzPWV0aGVyMDBfcmVhZF9waHkoZGV2LCBQSFlfSVJRX0NPTlRST0wpOworCisJaWYoaXJxX3N0YXR1cyAmIFBIWV9JUlFfQ09OVFJPTF9BTkVHX0NPTVBfSU5UX01TSyl7CisJCS8qCisJCSAqIEF1dG9uZWdvdGlhdGlvbiBjb21wbGV0ZSBvbiBlcHhhMTBkYi4gVGhlIG1hYyBkb2Vzbid0CisJCSAqIHR3aWcgaWYgd2UncmUgaW4gZnVsbCBkdXBsZXggc28gd2UgbmVlZCB0byBjaGVjayB0aGUKKwkJICogcGh5IHN0YXR1cyByZWdpc3RlciBhbmQgY29uZmlndXJlIHRoZSBtYWMgYWNjb3JkaW5nbHkKKwkJICovCisJCWlmKGV0aGVyMDBfcmVhZF9waHkoZGV2LCBQSFlfU1RBVFVTKSYoUEhZX1NUQVRVU18xMFRfRl9NU0t8UEhZX1NUQVRVU18xMDBfWF9GX01TSykpeworCQkJaW50IHRtcDsKKwkJCXRtcD1yZWFkbChFVEhFUl9NQUNfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisJCQl3cml0ZWwodG1wfEVUSEVSX01BQ19DVExfRlVMTERVUF9NU0ssRVRIRVJfTUFDX0NUTChkZXYtPmJhc2VfYWRkcikpOworCQl9CisJfQorCisJaWYoaXJxX3N0YXR1cyZQSFlfSVJRX0NPTlRST0xfTFNfQ0hHX0lOVF9NU0speworCisJCWlmKGV0aGVyMDBfcmVhZF9waHkoZGV2LCBQSFlfU1RBVFVTKSYgUEhZX1NUQVRVU19MSU5LX01TSyl7CisJCQkvKiBMaW5rIGlzIHVwICovCisJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCQkvL3ByaW50aygiQ2FycmllciBvblxuIik7CisJCX1lbHNleworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJCS8vcHJpbnRrKCJDYXJyaWVyIG9mZlxuIik7CisKKwkJfQorCX0KKworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9ibGlzdF9lbnRyeShzdHJ1Y3Qgc2tfYnVmZiogc2tiLHN0cnVjdCByeF9ibGlzdF9lbnQqIGJsaXN0X2VudF9wdHIpeworCS8qIE1ha2UgdGhlIGJ1ZmZlciBjb25zaXN0ZW50IHdpdGggdGhlIGNhY2hlIGFzIHRoZSBtYWMgaXMgZ29pbmcgdG8gd3JpdGUKKwkgKiBkaXJlY3RseSBpbnRvIGl0Ki8KKwlibGlzdF9lbnRfcHRyLT5mZC5GRFN5c3RlbT0odW5zaWduZWQgaW50KXNrYjsKKwlibGlzdF9lbnRfcHRyLT5iZC5CdWZmRGF0YT0oY2hhciopX19wYShza2ItPmRhdGEpOworCWNvbnNpc3RlbnRfc3luYyhza2ItPmRhdGEsUEtUX0JVRl9TWixQQ0lfRE1BX0ZST01ERVZJQ0UpOworICAgICAgICAvKiBhbGlnbiBJUCBvbiAxNiBCeXRlIChETUFfQ1RMIHNldCB0byBza2lwIDIgYnl0ZXMpICovCisJc2tiX3Jlc2VydmUoc2tiLDIpOworCWJsaXN0X2VudF9wdHItPmJkLkJ1ZmZMZW5ndGg9UEtUX0JVRl9TWi0yOworCWJsaXN0X2VudF9wdHItPmZkLkZETGVuZ3RoPTE7CisJYmxpc3RfZW50X3B0ci0+ZmQuRkRDdGw9RkRDVExfQ09XTlNGRF9NU0s7CisJYmxpc3RfZW50X3B0ci0+YmQuQkRDdGw9QkRDVExfQ09XTlNCRF9NU0s7Cit9CisKKworc3RhdGljIGludCBldGhlcjAwX21lbV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IG5ldF9wcml2KiBwcml2PWRldi0+cHJpdjsKKwlzdHJ1Y3QgdHhfZmRhX2VudCAqdHhfZmRfcHRyLCp0eF9lbmRfcHRyOworCXN0cnVjdCByeF9ibGlzdF9lbnQqIGJsaXN0X2VudF9wdHI7CisJaW50IGk7CisKKwkvKgorCSAqIEdyYWIgYSBibG9jayBvZiBvbiBjaGlwIFNSQU0gdG8gY29udGFpbiB0aGUgY29udHJvbCBzdHVjdHVyZXMgZm9yCisJICogdGhlIGV0aGVybmV0IE1BQy4gVGhpcyB1bmNhY2hlZCBiZWN1YXNlIGl0IG5lZWRzIHRvIGJlIGFjY2Vzc2VzIGJ5IGJvdGgKKwkgKiBidXMgbWFzdGVycyAoY3B1ICsgbWFjKS4gSG93ZXZlciwgaXQgc2hvdWxkbid0IG1hdHRlciB0b28gbXVjaCBpbiB0ZXJtcworCSAqIG9mIHNwZWVkIGFzIGl0cyBvbiBjaGlwIG1lbW9yeQorCSAqLworCXByaXYtPmRtYV9kYXRhPWlvcmVtYXBfbm9jYWNoZShFWENfU1BTUkFNX0JMT0NLMF9CQVNFLEVYQ19TUFNSQU1fQkxPQ0swX1NJWkUgKTsKKwlpZiAoIXByaXYtPmRtYV9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPnJ4X2ZkYV9wdHI9KHN0cnVjdCByeF9mZGFfZW50Kilwcml2LT5kbWFfZGF0YTsKKwkvKgorCSAqIE5vdyBzaGFyZSBpdCBvdXQgYW1vbmdzdCB0aGUgRnJhbWUgZGVzY3JpcHRvcnMgYW5kIHRoZSBidWZmZXIgbGlzdAorCSAqLworCXByaXYtPnJ4X2JsaXN0X3ZwPShzdHJ1Y3QgcnhfYmxpc3RfZW50KikoKHVuc2lnbmVkIGludClwcml2LT5kbWFfZGF0YStSWF9OVU1fRkRFU0Mqc2l6ZW9mKHN0cnVjdCByeF9mZGFfZW50KSk7CisKKwkvKgorCSAqSW5pdGFsaXNlIHRoZSBGREEgbGlzdAorCSAqLworCS8qIHNldCBvd25lcnNoaXAgdG8gdGhlIGNvbnRyb2xsZXIgKi8KKwltZW1zZXQocHJpdi0+cnhfZmRhX3B0ciwweDgwLFJYX05VTV9GREVTQypzaXplb2Yoc3RydWN0IHJ4X2ZkYV9lbnQpKTsKKworCS8qCisJICpJbml0aWFsaXNlIHRoZSBidWZmZXIgbGlzdAorCSAqLworCWJsaXN0X2VudF9wdHI9cHJpdi0+cnhfYmxpc3RfdnA7CisJaT0wOworCXdoaWxlKGJsaXN0X2VudF9wdHI8KHByaXYtPnJ4X2JsaXN0X3ZwK1JYX05VTV9CVUZGKSl7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWJsaXN0X2VudF9wdHItPmZkLkZETGVuZ3RoPTE7CisJCXNrYj1kZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOworCQlpZihza2IpeworCQkJc2V0dXBfYmxpc3RfZW50cnkoc2tiLGJsaXN0X2VudF9wdHIpOworCQkJYmxpc3RfZW50X3B0ci0+ZmQuRkROZXh0PShGREFfREVTQyopX19kbWFfcGEoYmxpc3RfZW50X3B0cisxKTsKKwkJCWJsaXN0X2VudF9wdHItPmJkLkJEU3RhdD1pKys7CisJCQlibGlzdF9lbnRfcHRyKys7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludGsoIkZhaWxlZCB0byBpbml0YWxpc2UgYnVmZmVyIGxpc3RcbiIpOworCQl9CisKKwl9CisJYmxpc3RfZW50X3B0ci0tOworCWJsaXN0X2VudF9wdHItPmZkLkZETmV4dD0oRkRBX0RFU0MqKV9fZG1hX3BhKHByaXYtPnJ4X2JsaXN0X3ZwKTsKKworCXByaXYtPnR4X2ZkYWxpc3RfdnA9KHN0cnVjdCB0eF9mZGFfZW50KikocHJpdi0+cnhfYmxpc3RfdnArUlhfTlVNX0JVRkYpOworCisJLyogSW5pdGlhbGlzZSB0aGUgYnVmZmVycyB0byBiZSBhIGNpcmN1bGFyIGxpc3QuIFRoZSBtYWMgd2lsbCB0aGVuIGdvIHBvbGwKKwkgKiB0aGUgbGlzdCB1bnRpbCBpdCBmaW5kcyBhIGZyYW1lIHJlYWR5IHRvIHRyYW5zbWl0ICovCisJdHhfZW5kX3B0cj1wcml2LT50eF9mZGFsaXN0X3ZwK1RYX05VTV9GREVTQzsKKwlmb3IodHhfZmRfcHRyPXByaXYtPnR4X2ZkYWxpc3RfdnA7dHhfZmRfcHRyPHR4X2VuZF9wdHI7dHhfZmRfcHRyKyspeworCQl0eF9mZF9wdHItPmZkLkZETmV4dD0oRkRBX0RFU0MqKV9fZG1hX3BhKCh0eF9mZF9wdHIrMSkpOworCQl0eF9mZF9wdHItPmZkLkZEQ3RsPTE7CisJCXR4X2ZkX3B0ci0+ZmQuRkRTdGF0PTA7CisJCXR4X2ZkX3B0ci0+ZmQuRkRMZW5ndGg9MTsKKworCX0KKwkvKiBDaGFuZ2UgdGhlIGxhc3QgRkROZXh0IHBvaW50ZXIgdG8gbWFrZSBhIGNpcmN1bGFyIGxpc3QgKi8KKwl0eF9mZF9wdHItLTsKKwl0eF9mZF9wdHItPmZkLkZETmV4dD0oRkRBX0RFU0MqKV9fZG1hX3BhKHByaXYtPnR4X2ZkYWxpc3RfdnApOworCisJLyogUG9pbnQgdGhlIGRldmljZSBhdCB0aGUgY2hhaW4gb2YgUnggYW5kIFR4IEJ1ZmZlcnMgKi8KKwl3cml0ZWwoKHVuc2lnbmVkIGludClfX2RtYV9wYShwcml2LT5yeF9mZGFfcHRyKSxFVEhFUl9GREFfQkFTKGRldi0+YmFzZV9hZGRyKSk7CisJd3JpdGVsKChSWF9OVU1fRkRFU0MtMSkqc2l6ZW9mKHN0cnVjdCByeF9mZGFfZW50KSxFVEhFUl9GREFfTElNKGRldi0+YmFzZV9hZGRyKSk7CisJd3JpdGVsKCh1bnNpZ25lZCBpbnQpX19kbWFfcGEocHJpdi0+cnhfYmxpc3RfdnApLEVUSEVSX0JMRlJNUFRSKGRldi0+YmFzZV9hZGRyKSk7CisKKwl3cml0ZWwoKHVuc2lnbmVkIGludClfX2RtYV9wYShwcml2LT50eF9mZGFsaXN0X3ZwKSxFVEhFUl9UWEZSTVBUUihkZXYtPmJhc2VfYWRkcikpOworCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBldGhlcjAwX21lbV91cGRhdGUodm9pZCogZGV2X2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXY9ZGV2X2lkOworCXN0cnVjdCBuZXRfcHJpdiogcHJpdj1kZXYtPnByaXY7CisJc3RydWN0IHNrX2J1ZmYqIHNrYjsKKwlzdHJ1Y3QgdHhfZmRhX2VudCAqZmRhX3B0cj1wcml2LT50eF9mZGFsaXN0X3ZwOworCXN0cnVjdCByeF9ibGlzdF9lbnQqIGJsaXN0X2VudF9wdHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByaXYtPnRxX21lbXVwZGF0ZS5zeW5jPTA7CisJLy9wcml2LT50cV9tZW11cGRhdGUubGlzdD0KKwlwcml2LT5tZW11cGRhdGVfc2NoZWR1bGVkPTA7CisKKwkvKiBUcmFuc21pdCBpbnRlcnJ1cHQgKi8KKwl3aGlsZShmZGFfcHRyPChwcml2LT50eF9mZGFsaXN0X3ZwK1RYX05VTV9GREVTQykpeworCQlpZighKEZEQ1RMX0NPV05TRkRfTVNLJmZkYV9wdHItPmZkLkZEQ3RsKSAmJiAoRVRIRVJfVFhfU1RBVF9DT01QX01TSyZmZGFfcHRyLT5mZC5GRFN0YXQpKXsKKwkJCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCXByaXYtPnN0YXRzLnR4X2J5dGVzKz1mZGFfcHRyLT5iZC5CdWZmTGVuZ3RoOworCQkJc2tiPShzdHJ1Y3Qgc2tfYnVmZiopZmRhX3B0ci0+ZmQuRkRTeXN0ZW07CisJCQkvL3ByaW50aygiJWQ6dHhjbG46ZmRhPSUjeCBza2I9JSN4XG4iLGppZmZpZXMsZmRhX3B0cixza2IpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJZmRhX3B0ci0+ZmQuRkRTeXN0ZW09MDsKKwkJCWZkYV9wdHItPmZkLkZEU3RhdD0wOworCQkJZmRhX3B0ci0+ZmQuRkRDdGw9MDsKKwkJfQorCQlmZGFfcHRyKys7CisJfQorCS8qIEZpbGwgaW4gYW55IG1pc3NpbmcgYnVmZmVycyBmcm9tIHRoZSByZWNlaXZlZCBxdWV1ZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLGZsYWdzKTsKKwlibGlzdF9lbnRfcHRyPXByaXYtPnJ4X2JsaXN0X3ZwOworCXdoaWxlKGJsaXN0X2VudF9wdHI8KHByaXYtPnJ4X2JsaXN0X3ZwK1JYX05VTV9CVUZGKSl7CisJCS8qIGZkLkZEU3lzdGVtIG9mIDAgaW5kaWNhdGVzIHdlIGZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyIGluIHRoZSBJU1IgKi8KKwkJaWYoIWJsaXN0X2VudF9wdHItPmZkLkZEU3lzdGVtKXsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQlza2I9ZGV2X2FsbG9jX3NrYihQS1RfQlVGX1NaKTsKKwkJCWJsaXN0X2VudF9wdHItPmZkLkZEU3lzdGVtPSh1bnNpZ25lZCBpbnQpc2tiOworCQkJaWYoc2tiKXsKKwkJCQlzZXR1cF9ibGlzdF9lbnRyeShza2IsYmxpc3RfZW50X3B0cik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYmxpc3RfZW50X3B0cisrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLGZsYWdzKTsKKwlpZihwcml2LT5xdWV1ZV9zdG9wcGVkKXsKKwkJLy9wcmludGsoIiVkOmNsbjpzdGFydCBxXG4iLGppZmZpZXMpOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCX0KKwlpZihwcml2LT5yeF9kaXNhYmxlZCl7CisJCS8vcHJpbnRrKCIlZDplbmFibGVfaXJxXG4iLGppZmZpZXMpOworCQlwcml2LT5yeF9kaXNhYmxlZD0wOworCQl3cml0ZWwoRVRIRVJfUlhfQ1RMX1JYRU5fTVNLLEVUSEVSX1JYX0NUTChkZXYtPmJhc2VfYWRkcikpOworCisJfQorfQorCisKK3N0YXRpYyB2b2lkIGV0aGVyMDBfaW50KCBpbnQgaXJxX251bSwgdm9pZCogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyogcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2PWRldl9pZDsKKwlzdHJ1Y3QgbmV0X3ByaXYqIHByaXY9ZGV2LT5wcml2OworCisJdW5zaWduZWQgaW50ICAgaW50ZXJydXB0VmFsdWU7CisKKwlpbnRlcnJ1cHRWYWx1ZT1yZWFkbChFVEhFUl9JTlRfU1JDKGRldi0+YmFzZV9hZGRyKSk7CisKKwkvL3ByaW50aygiSU5UX1NSQz0leFxuIixpbnRlcnJ1cHRWYWx1ZSk7CisKKwlpZighKHJlYWRsKEVUSEVSX0lOVF9TUkMoZGV2LT5iYXNlX2FkZHIpKSAmIEVUSEVSX0lOVF9TUkNfSVJRX01TSykpCisJeworCQlyZXR1cm47CQkvKiBJbnRlcnJ1cHQgd2Fzbid0IGNhdXNlZCBieSB1cyEhICovCisJfQorCisJaWYocmVhZGwoRVRIRVJfSU5UX1NSQyhkZXYtPmJhc2VfYWRkcikpJgorCSAgIChFVEhFUl9JTlRfU1JDX0lOVE1BQ1JYX01TSyB8CisJICAgIEVUSEVSX0lOVF9TUkNfRkRBRVhfTVNLIHwKKwkgICAgRVRIRVJfSU5UX1NSQ19CTEVYX01TSykpIHsKKwkJc3RydWN0IHJ4X2JsaXN0X2VudCogYmxpc3RfZW50X3B0cjsKKwkJc3RydWN0IHJ4X2ZkYV9lbnQqIGZkYV9lbnRfcHRyOworCQlzdHJ1Y3Qgc2tfYnVmZiogc2tiOworCisJCWZkYV9lbnRfcHRyPXByaXYtPnJ4X2ZkYV9wdHI7CisJCXNwaW5fbG9jaygmcHJpdi0+cnhfbG9jayk7CisJCXdoaWxlKGZkYV9lbnRfcHRyPChwcml2LT5yeF9mZGFfcHRyK1JYX05VTV9GREVTQykpeworCQkJaW50IHJlc3VsdDsKKworCQkJaWYoIShmZGFfZW50X3B0ci0+ZmQuRkRDdGwmRkRDVExfQ09XTlNGRF9NU0spKQorCQkJeworCQkJCS8qIFRoaXMgZnJhbWUgaXMgcmVhZHkgZm9yIHByb2Nlc3NpbmcgKi8KKwkJCQkvKmZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgYnVmZmVyIGluIHRoZSBidWZmZXJsaXN0ICovCisJCQkJYmxpc3RfZW50X3B0cj1wcml2LT5yeF9ibGlzdF92cCtmZGFfZW50X3B0ci0+YmQuQkRTdGF0OworCQkJCXNrYj0oc3RydWN0IHNrX2J1ZmYqKWJsaXN0X2VudF9wdHItPmZkLkZEU3lzdGVtOworCisJCQkJLyogUGFzcyB0aGlzIHNrYiB1cCB0aGUgc3RhY2sgKi8KKwkJCQlza2ItPmRldj1kZXY7CisJCQkJc2tiX3B1dChza2IsZmRhX2VudF9wdHItPmZkLkZETGVuZ3RoKTsKKwkJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkJCXNrYi0+aXBfc3VtbWVkPUNIRUNLU1VNX1VOTkVDRVNTQVJZOworCQkJCXJlc3VsdD1uZXRpZl9yeChza2IpOworCQkJCS8qIFVwZGF0ZSBzdGF0aXN0aWNzICovCisJCQkJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCXByaXYtPnN0YXRzLnJ4X2J5dGVzKz1mZGFfZW50X3B0ci0+ZmQuRkRMZW5ndGg7CisKKwkJCQkvKiBGcmVlIHRoZSBGREEgZW50cnkgKi8KKwkJCQlmZGFfZW50X3B0ci0+YmQuQkRTdGF0PTB4ZmY7CisJCQkJZmRhX2VudF9wdHItPmZkLkZEQ3RsPUZEQ1RMX0NPV05TRkRfTVNLOworCisJCQkJLyogQWxsb2NhdGUgYSBuZXcgc2tiIGFuZCBwb2ludCB0aGUgYmQgZW50cnkgdG8gaXQgKi8KKwkJCQlibGlzdF9lbnRfcHRyLT5mZC5GRFN5c3RlbT0wOworCQkJCXNrYj1kZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOworCQkJCS8vcHJpbnRrKCJhbGxvY3NrYj0lI3hcbiIsc2tiKTsKKwkJCQlpZihza2IpeworCQkJCQlzZXR1cF9ibGlzdF9lbnRyeShza2IsYmxpc3RfZW50X3B0cik7CisKKwkJCQl9CisJCQkJZWxzZSBpZighcHJpdi0+bWVtdXBkYXRlX3NjaGVkdWxlZCl7CisJCQkJCWludCB0bXA7CisJCQkJCS8qIFRoZXJlIGFyZSBubyBidWZmZXJzIGF0IHRoZSBtb21lbnQsIHNvIHNjaGVkdWxlICovCisJCQkJCS8qIHRoZSBiYWNrZ3JvdW5kIHRhc2sgdG8gc29ydCB0aGlzIG91dCAqLworCQkJCQlzY2hlZHVsZV90YXNrKCZwcml2LT50cV9tZW11cGRhdGUpOworCQkJCQlwcml2LT5tZW11cGRhdGVfc2NoZWR1bGVkPTE7CisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczpObyBidWZmZXJzIixkZXYtPm5hbWUpOworCQkJCQkvKiBJZiB0aGlzIGludGVycnVwdCB3YXMgZHVlIHRvIGEgbGFjayBvZiBidWZmZXJzIHRoZW4KKwkJCQkJICogd2UnZCBiZXR0ZXIgc3RvcCB0aGUgcmVjZWl2ZXIgdG9vICovCisJCQkJCWlmKGludGVycnVwdFZhbHVlJkVUSEVSX0lOVF9TUkNfQkxFWF9NU0speworCQkJCQkJcHJpdi0+cnhfZGlzYWJsZWQ9MTsKKwkJCQkJCXRtcD1yZWFkbChFVEhFUl9JTlRfU1JDKGRldi0+YmFzZV9hZGRyKSk7CisJCQkJCQl3cml0ZWwodG1wJn5FVEhFUl9SWF9DVExfUlhFTl9NU0ssRVRIRVJfUlhfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6SGFsdGluZyByeCIsZGV2LT5uYW1lKTsKKwkJCQkJfQorCisJCQkJfQorCisJCQl9CisJCQlmZGFfZW50X3B0cisrOworCQl9CisJCXNwaW5fdW5sb2NrKCZwcml2LT5yeF9sb2NrKTsKKworCQkvKiBDbGVhciB0aGUgIGludGVycnVwdHMgKi8KKwkJd3JpdGVsKEVUSEVSX0lOVF9TUkNfSU5UTUFDUlhfTVNLIHwgRVRIRVJfSU5UX1NSQ19GREFFWF9NU0sKKwkJICAgICAgIHwgRVRIRVJfSU5UX1NSQ19CTEVYX01TSyxFVEhFUl9JTlRfU1JDKGRldi0+YmFzZV9hZGRyKSk7CisKKwl9CisKKwlpZihyZWFkbChFVEhFUl9JTlRfU1JDKGRldi0+YmFzZV9hZGRyKSkmRVRIRVJfSU5UX1NSQ19JTlRNQUNUWF9NU0speworCisJCWlmKCFwcml2LT5tZW11cGRhdGVfc2NoZWR1bGVkKXsKKwkJCXNjaGVkdWxlX3Rhc2soJnByaXYtPnRxX21lbXVwZGF0ZSk7CisJCQlwcml2LT5tZW11cGRhdGVfc2NoZWR1bGVkPTE7CisJCX0KKwkJLyogQ2xlYXIgdGhlIGludGVycnVwdCAqLworCQl3cml0ZWwoRVRIRVJfSU5UX1NSQ19JTlRNQUNUWF9NU0ssRVRIRVJfSU5UX1NSQyhkZXYtPmJhc2VfYWRkcikpOworCX0KKworCWlmIChyZWFkbChFVEhFUl9JTlRfU1JDKGRldi0+YmFzZV9hZGRyKSkgJiAoRVRIRVJfSU5UX1NSQ19TV0lOVF9NU0t8CisJCQkJCQkgICAgRVRIRVJfSU5UX1NSQ19JTlRFQVJOT1RfTVNLfAorCQkJCQkJICAgIEVUSEVSX0lOVF9TUkNfSU5UTElOS19NU0t8CisJCQkJCQkgICAgRVRIRVJfSU5UX1NSQ19JTlRFWEJEX01TS3wKKwkJCQkJCSAgICBFVEhFUl9JTlRfU1JDX0lOVFRYQ1RMQ01QX01TSykpCisJeworCQkvKgorCQkgKglOb3QgdXNpbmcgYW55IG9mIHRoZXNlIHNvIHRoZXkgc2hvdWxkbid0IGhhcHBlbgorCQkgKgorCQkgKglJbiB0aGUgY2FzZWQgb2YgSU5URVhCRCAtIGlmIHlvdSBhbGxvY2F0ZSBtb3JlCisJCSAqICAgICAgdGhhbiAyOCBkZWNzcmlwdG9ycyB5b3UgbWF5IG5lZWQgdG8gdGhpbmsgYWJvdXQgdGhpcworCQkgKi8KKwkJcHJpbnRrKCJOb3QgdXNpbmcgdGhpcyBpbnRlcnJ1cHRcbiIpOworCX0KKworCWlmIChyZWFkbChFVEhFUl9JTlRfU1JDKGRldi0+YmFzZV9hZGRyKSkgJgorCSAgICAoRVRIRVJfSU5UX1NSQ19JTlRTQlVTX01TSyB8CisJICAgICBFVEhFUl9JTlRfU1JDX0lOVE5SQUJUX01TSworCSAgICAgfEVUSEVSX0lOVF9TUkNfRE1QQVJFUlJfTVNLKSkKKwl7CisJCS8qCisJCSAqIEhhcmR3YXJlIGVycm9ycywgd2UgY2FuIGVpdGhlciBpZ25vcmUgdGhlbSBhbmQgaG9wZSB0aGV5IGdvIGF3YXkKKwkJICpvciByZXNldCB0aGUgZGV2aWNlLCBJJ2xsIHRyeSB0aGUgZmlyc3QgZm9yIG5vdyB0byBzZWUgaWYgdGhleSBoYXBwZW4KKwkJICovCisJCXByaW50aygiSGFyZHdhcmUgZXJyb3JcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgZXRoZXIwMF9zZXR1cF9ldGhlcm5ldF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJaW50IHRtcDsKKworCWRldi0+YWRkcl9sZW49NjsKKwl3cml0ZXcoMCxFVEhFUl9BUkNfQURSKGRldi0+YmFzZV9hZGRyKSk7CisJd3JpdGVsKChkZXYtPmRldl9hZGRyWzBdPDwyNCkgfAorCQkoZGV2LT5kZXZfYWRkclsxXTw8MTYpIHwKKwkJKGRldi0+ZGV2X2FkZHJbMl08PDgpIHwKKwkJZGV2LT5kZXZfYWRkclszXSwKKwkJRVRIRVJfQVJDX0RBVEEoZGV2LT5iYXNlX2FkZHIpKTsKKworCXdyaXRldyg0LEVUSEVSX0FSQ19BRFIoZGV2LT5iYXNlX2FkZHIpKTsKKwl0bXA9cmVhZGwoRVRIRVJfQVJDX0RBVEEoZGV2LT5iYXNlX2FkZHIpKTsKKwl0bXAmPTB4ZmZmZjsKKwl0bXB8PShkZXYtPmRldl9hZGRyWzRdPDwyNCkgfCAoZGV2LT5kZXZfYWRkcls1XTw8MTYpOworCXdyaXRlbCh0bXAsIEVUSEVSX0FSQ19EQVRBKGRldi0+YmFzZV9hZGRyKSk7CisJLyogRW5hYmxlIHRoaXMgZW50cnkgaW4gdGhlIEFSQyAqLworCisJd3JpdGVsKDEsRVRIRVJfQVJDX0VOQShkZXYtPmJhc2VfYWRkcikpOworCisJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkIGV0aGVyMDBfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiByZXNldCB0aGUgY29udHJvbGxlciAqLworCXdyaXRldyhFVEhFUl9NQUNfQ1RMX1JFU0VUX01TSyxFVEhFUl9NQUNfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSdyZSBub3QgZ29pbmcgdG8gc2VuZCBhbnl0aGluZworCSAqLworCisJd3JpdGV3KEVUSEVSX1RYX0NUTF9UWEhBTFRfTVNLLEVUSEVSX1RYX0NUTChkZXYtPmJhc2VfYWRkcikpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgd2UncmUgbm90IGdvaW5nIHRvIHJlY2VpdmUgYW55dGhpbmcKKwkgKi8KKwl3cml0ZXcoRVRIRVJfUlhfQ1RMX1JYSEFMVF9NU0ssRVRIRVJfUlhfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisKKwkvKgorCSAqIERpc2FibGUgSW50ZXJydXB0cyBmb3Igbm93LCBhbmQgc2V0IHRoZSBidXJzdCBzaXplIHRvIDggYnl0ZXMKKwkgKi8KKworCXdyaXRlbChFVEhFUl9ETUFfQ1RMX0lOVE1BU0tfTVNLIHwKKwkgICAgICAgKCg4IDw8IEVUSEVSX0RNQV9DVExfRE1CVVJTVF9PRlNUKSAmIEVUSEVSX0RNQV9DVExfRE1CVVJTVF9NU0spCisJICAgICAgIHwoMjw8RVRIRVJfRE1BX0NUTF9SWEFMSUdOX09GU1QpLAorCSAgICAgICBFVEhFUl9ETUFfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisKKworCS8qCisJICogU2V0IFR4VGhyc2ggLSBzdGFydCB0cmFuc21pdHRpbmcgYSBwYWNrZXQgYWZ0ZXIgMTUxNAorCSAqIGJ5dGVzIG9yIHdoZW4gYSBwYWNrZXQgaXMgY29tcGxldGUsIHdoaWNoZXZlciBjb21lcyBmaXJzdAorCSAqLworCSB3cml0ZXcoMTUxNCxFVEhFUl9UWFRIUlNIKGRldi0+YmFzZV9hZGRyKSk7CisKKwkvKgorCSAqIFNldCBUeFBvbGxDdHIuICBFYWNoIGN5Y2xlIGlzCisJICogNjEuNDQgbWljcm9zZWNvbmRzIHdpdGggYSAzMyBNSHogYnVzCisJICovCisJIHdyaXRldygxLEVUSEVSX1RYUE9MTENUUihkZXYtPmJhc2VfYWRkcikpOworCisJLyoKKwkgKiBTZXQgUnhfQ3RsIC0gVHVybiBvZmYgcmVjZXB0aW9uIGFuZCBsZXQgUnhEYXRhIHR1cm4gaXQKKwkgKiBvbiBsYXRlcgorCSAqLworCSB3cml0ZXcoRVRIRVJfUlhfQ1RMX1JYSEFMVF9NU0ssRVRIRVJfUlhfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisKK30KKworCitzdGF0aWMgdm9pZCBldGhlcjAwX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlpbnQgY291bnQ9ZGV2LT5tY19jb3VudDsKKworCS8qIFNldCBwcm9taXNjdW91cyBtb2RlIGlmIGl0J3MgYXNrZWQgZm9yLiAqLworCisJaWYgKGRldi0+ZmxhZ3MmSUZGX1BST01JU0MpeworCisJCXdyaXRldyggRVRIRVJfQVJDX0NUTF9DT01QRU5fTVNLIHwKKwkJCUVUSEVSX0FSQ19DVExfQlJPQURBQ0NfTVNLIHwKKwkJCUVUSEVSX0FSQ19DVExfR1JPVVBBQ0NfTVNLIHwKKwkJCUVUSEVSX0FSQ19DVExfU1RBVElPTkFDQ19NU0ssCisJCQlFVEhFUl9BUkNfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEdldCBhbGwgbXVsdGljYXN0IHBhY2tldHMgaWYgcmVxdWlyZWQsIG9yIGlmIHRoZXJlIGFyZSB0b28KKwkgKiBtYW55IGFkZHJlc3NlcyB0byBmaXQgaW4gaGFyZHdhcmUKKwkgKi8KKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSl7CisJCXdyaXRldyggRVRIRVJfQVJDX0NUTF9DT01QRU5fTVNLIHwKKwkJCUVUSEVSX0FSQ19DVExfR1JPVVBBQ0NfTVNLIHwKKwkJCUVUSEVSX0FSQ19DVExfQlJPQURBQ0NfTVNLLAorCQkJRVRIRVJfQVJDX0NUTChkZXYtPmJhc2VfYWRkcikpOworCQlyZXR1cm47CisJfQorCWlmIChkZXYtPm1jX2NvdW50ID4gKEVUSEVSX0FSQ19TSVpFIC0gMSkpeworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlRvbyBtYW55IG11bHRpY2FzdCBhZGRyZXNzZXMgZm9yIGhhcmR3YXJlIHRvIGZpbHRlciAtIHJlY2VpdmluZyBhbGwgbXVsdGljYXN0IHBhY2tldHNcbiIpOworCQl3cml0ZXcoIEVUSEVSX0FSQ19DVExfQ09NUEVOX01TSyB8CisJCQlFVEhFUl9BUkNfQ1RMX0dST1VQQUNDX01TSyB8CisJCQlFVEhFUl9BUkNfQ1RMX0JST0FEQUNDX01TSywKKwkJCUVUSEVSX0FSQ19DVEwoZGV2LT5iYXNlX2FkZHIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmKGRldi0+bWNfY291bnQpeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jX2xpc3RfZW50PWRldi0+bWNfbGlzdDsKKwkJdW5zaWduZWQgaW50IHRlbXAsaTsKKwkJREVCVUcocHJpbnRrKCJtY19jb3VudD0lZCBtY19saXN0PSUjeFxuIixkZXYtPiBtY19jb3VudCwgZGV2LT5tY19saXN0KSk7CisJCURFQlVHKHByaW50aygibWMgYWRkcj0lMDIjeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJICAgICBtY19saXN0X2VudC0+ZG1pX2FkZHJbNV0sCisJCQkgICAgIG1jX2xpc3RfZW50LT5kbWlfYWRkcls0XSwKKwkJCSAgICAgbWNfbGlzdF9lbnQtPmRtaV9hZGRyWzNdLAorCQkJICAgICBtY19saXN0X2VudC0+ZG1pX2FkZHJbMl0sCisJCQkgICAgIG1jX2xpc3RfZW50LT5kbWlfYWRkclsxXSwKKwkJCSAgICAgbWNfbGlzdF9lbnQtPmRtaV9hZGRyWzBdKTspCisKKwkJLyoKKwkJICogVGhlIGZpcnN0IDYgYnl0ZXMgYXJlIHRoZSBNQUMgYWRkcmVzcywgc28KKwkJICogZG9uJ3QgY2hhbmdlIHRoZW0hCisJCSAqLworCQl3cml0ZXcoNCxFVEhFUl9BUkNfQURSKGRldi0+YmFzZV9hZGRyKSk7CisJCXRlbXA9cmVhZGwoRVRIRVJfQVJDX0RBVEEoZGV2LT5iYXNlX2FkZHIpKTsKKwkJdGVtcCY9MHhmZmZmMDAwMDsKKworCQkvKiBEaXNhYmxlIHRoZSBjdXJyZW50IG11bHRpY2FzdCBzdHVmZiAqLworCQl3cml0ZWwoMSxFVEhFUl9BUkNfRU5BKGRldi0+YmFzZV9hZGRyKSk7CisKKwkJZm9yKDs7KXsKKwkJCXRlbXB8PW1jX2xpc3RfZW50LT5kbWlfYWRkclsxXSB8CisJCQkJbWNfbGlzdF9lbnQtPmRtaV9hZGRyWzBdPDw4OworCQkJd3JpdGVsKHRlbXAsRVRIRVJfQVJDX0RBVEEoZGV2LT5iYXNlX2FkZHIpKTsKKworCQkJaT1yZWFkbChFVEhFUl9BUkNfQURSKGRldi0+YmFzZV9hZGRyKSk7CisJCQl3cml0ZXcoaSs0LEVUSEVSX0FSQ19BRFIoZGV2LT5iYXNlX2FkZHIpKTsKKworCQkJdGVtcD1tY19saXN0X2VudC0+ZG1pX2FkZHJbNV18CisJCQkJbWNfbGlzdF9lbnQtPmRtaV9hZGRyWzRdPDw4IHwKKwkJCQltY19saXN0X2VudC0+ZG1pX2FkZHJbM108PDE2IHwKKwkJCQltY19saXN0X2VudC0+ZG1pX2FkZHJbMl08PDI0OworCQkJd3JpdGVsKHRlbXAsRVRIRVJfQVJDX0RBVEEoZGV2LT5iYXNlX2FkZHIpKTsKKworCQkJY291bnQtLTsKKwkJCWlmKCFtY19saXN0X2VudC0+bmV4dCB8fCAhY291bnQpeworCQkJCWJyZWFrOworCQkJfQorCQkJREVCVUcocHJpbnRrKCJtY19saXN0X25leHQ9JSN4XG4iLG1jX2xpc3RfZW50LT5uZXh0KTspCisJCQltY19saXN0X2VudD1tY19saXN0X2VudC0+bmV4dDsKKworCisJCQlpPXJlYWRsKEVUSEVSX0FSQ19BRFIoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCXdyaXRlbChpKzQsRVRIRVJfQVJDX0FEUihkZXYtPmJhc2VfYWRkcikpOworCisJCQl0ZW1wPW1jX2xpc3RfZW50LT5kbWlfYWRkclszXXwKKwkJCQltY19saXN0X2VudC0+ZG1pX2FkZHJbMl08PDggfAorCQkJCW1jX2xpc3RfZW50LT5kbWlfYWRkclsxXTw8MTYgfAorCQkJCW1jX2xpc3RfZW50LT5kbWlfYWRkclswXTw8MjQ7CisJCQl3cml0ZWwodGVtcCxFVEhFUl9BUkNfREFUQShkZXYtPmJhc2VfYWRkcikpOworCisJCQlpPXJlYWRsKEVUSEVSX0FSQ19BRFIoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCXdyaXRlbChpKzQsRVRIRVJfQVJDX0FEUihkZXYtPmJhc2VfYWRkcikpOworCisJCQl0ZW1wPW1jX2xpc3RfZW50LT5kbWlfYWRkcls0XTw8MTYgfAorCQkJCW1jX2xpc3RfZW50LT5kbWlfYWRkcls1XTw8MjQ7CisKKwkJCXdyaXRlbCh0ZW1wLEVUSEVSX0FSQ19EQVRBKGRldi0+YmFzZV9hZGRyKSk7CisKKwkJCWNvdW50LS07CisJCQlpZighbWNfbGlzdF9lbnQtPm5leHQgfHwgIWNvdW50KXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW1jX2xpc3RfZW50PW1jX2xpc3RfZW50LT5uZXh0OworCQl9CisKKworCQlpZihjb3VudCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk11bHRpY2FzdCBsaXN0IHNpemUgZXJyb3JcbiIpOworCisKKwkJd3JpdGV3KCBFVEhFUl9BUkNfQ1RMX0JST0FEQUNDX01TS3wKKwkJCUVUSEVSX0FSQ19DVExfQ09NUEVOX01TSywKKwkJCUVUSEVSX0FSQ19DVEwoZGV2LT5iYXNlX2FkZHIpKTsKKworCX0KKworCS8qIGVuYWJsZSB0aGUgYWN0aXZlIEFSQyBlbnRpZXMgKi8KKwl3cml0ZXcoKDE8PChjb3VudCsyKSktMSxFVEhFUl9BUkNfRU5BKGRldi0+YmFzZV9hZGRyKSk7Cit9CisKKworc3RhdGljIGludCBldGhlcjAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlpbnQgcmVzdWx0LHRtcDsKKwlzdHJ1Y3QgbmV0X3ByaXYqIHByaXY7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogSW5zdGFsbCBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KKwlyZXN1bHQ9cmVxdWVzdF9pcnEoZGV2LT5pcnEsZXRoZXIwMF9pbnQsMCwiZXRoZXIwMCIsZGV2KTsKKwlpZihyZXN1bHQpCisJCWdvdG8gb3Blbl9lcnIxOworCisJcmVzdWx0PXJlcXVlc3RfaXJxKDIsZXRoZXIwMF9waHlfaW50LDAsImV0aGVyMDBfcGh5IixkZXYpOworCWlmKHJlc3VsdCkKKwkJZ290byBvcGVuX2VycjI7CisKKwlldGhlcjAwX3Jlc2V0KGRldik7CisJcmVzdWx0PWV0aGVyMDBfbWVtX2luaXQoZGV2KTsKKwlpZihyZXN1bHQpCisJCWdvdG8gb3Blbl9lcnIzOworCisKKwlldGhlcjAwX3NldHVwX2V0aGVybmV0X2FkZHJlc3MoZGV2KTsKKworCWV0aGVyMDBfc2V0X211bHRpY2FzdChkZXYpOworCisJcmVzdWx0PWV0aGVyMDBfd3JpdGVfcGh5KGRldixQSFlfQ09OVFJPTCwgUEhZX0NPTlRST0xfQU5FR0VOX01TSyB8IFBIWV9DT05UUk9MX1JBTkVHX01TSyk7CisJaWYocmVzdWx0KQorCQlnb3RvIG9wZW5fZXJyNDsKKwlyZXN1bHQ9ZXRoZXIwMF93cml0ZV9waHkoZGV2LFBIWV9JUlFfQ09OVFJPTCwgUEhZX0lSUV9DT05UUk9MX0xTX0NIR19JRV9NU0sgfAorCQkJCSBQSFlfSVJRX0NPTlRST0xfQU5FR19DT01QX0lFX01TSyk7CisJaWYocmVzdWx0KQorCQlnb3RvIG9wZW5fZXJyNDsKKworCS8qIFN0YXJ0IHRoZSBkZXZpY2UgZW5hYmxlIGludGVycnVwdHMgKi8KKwl3cml0ZXcoRVRIRVJfUlhfQ1RMX1JYRU5fTVNLCisvLwkgICAgICAgfCBFVEhFUl9SWF9DVExfU1RSSVBDUkNfTVNLCisJICAgICAgIHwgRVRIRVJfUlhfQ1RMX0VOR09PRF9NU0sKKwkgICAgICAgfCBFVEhFUl9SWF9DVExfRU5SWFBBUl9NU0t8IEVUSEVSX1JYX0NUTF9FTkxPTkdFUlJfTVNLCisJICAgICAgIHwgRVRIRVJfUlhfQ1RMX0VOT1ZFUl9NU0t8IEVUSEVSX1JYX0NUTF9FTkNSQ0VSUl9NU0ssCisJICAgICAgIEVUSEVSX1JYX0NUTChkZXYtPmJhc2VfYWRkcikpOworCisJd3JpdGV3KEVUSEVSX1RYX0NUTF9UWEVOX01TS3wKKwkgICAgICAgRVRIRVJfVFhfQ1RMX0VORVhERUZFUl9NU0t8CisJICAgICAgIEVUSEVSX1RYX0NUTF9FTkxDQVJSX01TS3wKKwkgICAgICAgRVRIRVJfVFhfQ1RMX0VORVhDT0xMX01TS3wKKwkgICAgICAgRVRIRVJfVFhfQ1RMX0VOTEFURUNPTExfTVNLfAorCSAgICAgICBFVEhFUl9UWF9DVExfRU5UWFBBUl9NU0t8CisJICAgICAgIEVUSEVSX1RYX0NUTF9FTkNPTVBfTVNLLAorCSAgICAgICBFVEhFUl9UWF9DVEwoZGV2LT5iYXNlX2FkZHIpKTsKKworCXRtcD1yZWFkbChFVEhFUl9ETUFfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisJd3JpdGVsKHRtcCZ+RVRIRVJfRE1BX0NUTF9JTlRNQVNLX01TSyxFVEhFUl9ETUFfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisKKwlyZXR1cm4gMDsKKworIG9wZW5fZXJyNDoKKwlldGhlcjAwX3Jlc2V0KGRldik7Cisgb3Blbl9lcnIzOgorCWZyZWVfaXJxKDIsZGV2KTsKKyBvcGVuX2VycjI6CisJZnJlZV9pcnEoZGV2LT5pcnEsZGV2KTsKKyBvcGVuX2VycjE6CisJcmV0dXJuIHJlc3VsdDsKKworfQorCisKK3N0YXRpYyBpbnQgZXRoZXIwMF90eChzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCBuZXRfcHJpdiAqcHJpdj1kZXYtPnByaXY7CisJc3RydWN0IHR4X2ZkYV9lbnQgKmZkYV9wdHI7CisJaW50IGk7CisKKworCS8qCisJICoJRmluZCBhbiBlbXB0eSBzbG90IGluIHdoaWNoIHRvIHN0aWNrIHRoZSBmcmFtZQorCSAqLworCWZkYV9wdHI9KHN0cnVjdCB0eF9mZGFfZW50KilfX2RtYV92YShyZWFkbChFVEhFUl9UWEZSTVBUUihkZXYtPmJhc2VfYWRkcikpKTsKKwlpPTA7CisJd2hpbGUoaTxUWF9OVU1fRkRFU0MpeworCQlpZiAoZmRhX3B0ci0+ZmQuRkRTdGF0fHwoZmRhX3B0ci0+ZmQuRkRDdGwgJiBGRENUTF9DT1dOU0ZEX01TSykpeworCQkJZmRhX3B0ciA9KHN0cnVjdCB0eF9mZGFfZW50KikgX19kbWFfdmEoKHN0cnVjdCB0eF9mZGFfZW50KilmZGFfcHRyLT5mZC5GRE5leHQpOworCQl9CisJCWVsc2UgeworCQkJYnJlYWs7CisJCX0KKwkJaSsrOworCX0KKworCS8qIFdyaXRlIHRoZSBza2IgZGF0YSBmcm9tIHRoZSBjYWNoZSovCisJY29uc2lzdGVudF9zeW5jKHNrYi0+ZGF0YSxza2ItPmxlbixQQ0lfRE1BX1RPREVWSUNFKTsKKwlmZGFfcHRyLT5iZC5CdWZmRGF0YT0oY2hhciopX19wYShza2ItPmRhdGEpOworCWZkYV9wdHItPmJkLkJ1ZmZMZW5ndGg9KHVuc2lnbmVkIHNob3J0KXNrYi0+bGVuOworCS8qIFNhdmUgdGhlIHBvaW50ZXIgdG8gdGhlIHNrYiBmb3IgZnJlZWluZyBsYXRlciAqLworCWZkYV9wdHItPmZkLkZEU3lzdGVtPSh1bnNpZ25lZCBpbnQpc2tiOworCWZkYV9wdHItPmZkLkZEU3RhdD0wOworCS8qIFBhc3Mgb3duZXJzaGlwIG9mIHRoZSBidWZmZXJzIHRvIHRoZSBjb250cm9sbGVyICovCisJZmRhX3B0ci0+ZmQuRkRDdGw9MTsKKwlmZGFfcHRyLT5mZC5GREN0bHw9RkRDVExfQ09XTlNGRF9NU0s7CisKKwkvKiBJZiB0aGUgbmV4dCBidWZmZXIgaW4gdGhlIGxpc3QgaXMgZnVsbCwgc3RvcCB0aGUgcXVldWUgKi8KKwlmZGFfcHRyPShzdHJ1Y3QgdHhfZmRhX2VudCopX19kbWFfdmEoZmRhX3B0ci0+ZmQuRkROZXh0KTsKKwlpZiAoKGZkYV9wdHItPmZkLkZEU3RhdCl8fChmZGFfcHRyLT5mZC5GREN0bCAmIEZEQ1RMX0NPV05TRkRfTVNLKSl7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcHJpdi0+cXVldWVfc3RvcHBlZD0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmV0aGVyMDBfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgbmV0X3ByaXYgKnByaXY9ZGV2LT5wcml2OworCXJldHVybiAmcHJpdi0+c3RhdHM7Cit9CisKKworc3RhdGljIGludCBldGhlcjAwX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgbmV0X3ByaXYgKnByaXY9ZGV2LT5wcml2OworCWludCB0bXA7CisKKwkvKiBTdG9wL2Rpc2FibGUgdGhlIGRldmljZS4gKi8KKwl0bXA9cmVhZHcoRVRIRVJfUlhfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisJdG1wJj1+KEVUSEVSX1JYX0NUTF9SWEVOX01TSyB8IEVUSEVSX1JYX0NUTF9FTkdPT0RfTVNLKTsKKwl0bXB8PUVUSEVSX1JYX0NUTF9SWEhBTFRfTVNLOworCXdyaXRldyh0bXAsRVRIRVJfUlhfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisKKwl0bXA9cmVhZGwoRVRIRVJfVFhfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisJdG1wJj1+RVRIRVJfVFhfQ1RMX1RYRU5fTVNLOworCXRtcHw9RVRIRVJfVFhfQ1RMX1RYSEFMVF9NU0s7CisJd3JpdGVsKHRtcCxFVEhFUl9UWF9DVEwoZGV2LT5iYXNlX2FkZHIpKTsKKworCS8qIEZyZWUgdXAgc3lzdGVtIHJlc291cmNlcyAqLworCWZyZWVfaXJxKGRldi0+aXJxLGRldik7CisJZnJlZV9pcnEoMixkZXYpOworCWlvdW5tYXAocHJpdi0+ZG1hX2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgZXRoZXIwMF9nZXRfZXRoZXJuZXRfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCBtdGRfaW5mbyAqbXltdGQ9TlVMTDsKKwlpbnQgaTsKKwlzaXplX3QgcmV0bGVuOworCisJLyoKKwkgKiBGb3IgdGhlIEVweGExMCBkZXYgYm9hcmQgKGNhbWVsb3QpLCB0aGUgZXRoZXJuZXQgTUFDCisJICogYWRkcmVzcyBpcyBvZiB0aGUgZm9ybSAgMDA6YWE6YWE6MDA6eHg6eHggd2hlcmUKKwkgKiAwMDphYTphYSBpcyB0aGUgQWx0ZXJhIHZlbmRvciBJRCBhbmQgeHg6eHggaXMgdGhlCisJICogbGFzdCAyIGJ5dGVzIG9mIHRoZSBib2FyZCBzZXJpYWwgbnVtYmVyLCBhcyBwcm9ncmFtbWVkCisJICogaW50byB0aGUgT1RQIGFyZWEgb2YgdGhlIGZsYXNoIGRldmljZSBvbiBFQkkxLiBJZiB0aGlzCisJICogaXNuJ3QgYW4gZXhwYTEwIGRldiBib2FyZCwgb3IgdGhlcmUncyBubyBtdGQgc3VwcG9ydCB0bworCSAqIHJlYWQgdGhlIHNlcmlhbCBudW1iZXIgZnJvbSBmbGFzaCB0aGVuIHdlJ2xsIGZvcmNlIHRoZQorCSAqIHVzZSB0byBzZXQgdGhlaXIgb3duIG1hYyBhZGRyZXNzIHVzaW5nIGlmY29uZmlnLgorCSAqLworCisjaWZkZWYgQ09ORklHX0FSQ0hfQ0FNRUxPVAorI2lmZGVmIENPTkZJR19NVEQKKwkvKiBnZXQgdGhlIG10ZF9pbmZvIHN0cnVjdHVyZSBmb3IgdGhlIGZpcnN0IG10ZCBkZXZpY2UqLworCWZvcihpPTA7aTxNQVhfTVREX0RFVklDRVM7aSsrKXsKKwkJbXltdGQ9Z2V0X210ZF9kZXZpY2UoTlVMTCxpKTsKKwkJaWYoIW15bXRkfHwhc3RyY21wKG15bXRkLT5uYW1lLCJFUFhBMTBEQiBmbGFzaCIpKQorCQkJYnJlYWs7CisJfQorCisJaWYoIW15bXRkIHx8ICFteW10ZC0+cmVhZF91c2VyX3Byb3RfcmVnKXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZhaWxlZCB0byByZWFkIE1BQyBhZGRyZXNzIGZyb20gZmxhc2hcbiIsZGV2LT5uYW1lKTsKKwl9ZWxzZXsKKwkJbXltdGQtPnJlYWRfdXNlcl9wcm90X3JlZyhteW10ZCwyLDEsJnJldGxlbiwmZGV2LT5kZXZfYWRkcls1XSk7CisJCW15bXRkLT5yZWFkX3VzZXJfcHJvdF9yZWcobXltdGQsMywxLCZyZXRsZW4sJmRldi0+ZGV2X2FkZHJbNF0pOworCQlkZXYtPmRldl9hZGRyWzNdPTA7CisJCWRldi0+ZGV2X2FkZHJbMl09dmVuZG9yX2lkWzFdOworCQlkZXYtPmRldl9hZGRyWzFdPXZlbmRvcl9pZFswXTsKKwkJZGV2LT5kZXZfYWRkclswXT0wOworCX0KKyNlbHNlCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1URCBzdXBwb3J0IHJlcXVpcmVkIHRvIHJlYWQgTUFDIGFkZHJlc3MgZnJvbSBFUFhBMTAgZGV2IGJvYXJkXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisjZW5kaWYKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkKKwkJcHJpbnRrKCIlczogSW52YWxpZCBldGhlcm5ldCBNQUMgYWRkcmVzcy4gIFBsZWFzZSBzZXQgdXNpbmcgIgorCQkJImlmY29uZmlnXG4iLCBkZXYtPm5hbWUpOworCit9CisKKy8qCisgKiBLZWVwIGEgbWFwcGluZyBvZiBkZXZfaW5mbyBhZGRyZXNzZXMgLT4gcG9ydCBsaW5lcyB0byB1c2Ugd2hlbgorICogcmVtb3ZpbmcgcG9ydHMgZGV2PT1OVUxMIGluZGljYXRlcyB1bnVzZWQgZW50cnkKKyAqLworCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSogZGV2X2xpc3RbRVRIX05SXTsKKworc3RhdGljIGludCBldGhlcjAwX2FkZF9kZXZpY2Uoc3RydWN0IHBsZGhzX2Rldl9pbmZvKiBkZXZfaW5mbyx2b2lkKiBkZXZfcHNfZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRfcHJpdiAqcHJpdjsKKwl2b2lkICptYXBfYWRkcjsKKwlpbnQgcmVzdWx0OworCWludCBpOworCisJaT0wOworCXdoaWxlKGRldl9saXN0W2ldICYmIGkgPCBFVEhfTlIpCisJCWkrKzsKKworCWlmKGk9PUVUSF9OUil7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImV0aGVyMDA6IE1heGltdW0gbnVtYmVyIG9mIHBvcnRzIHJlYWNoZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGRldl9pbmZvLT5iYXNlX2FkZHIsIE1BQ19SRUdfU0laRSwgImV0aGVyMDAiKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X3ByaXYpKTsKKwlpZighZGV2KSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCXByaXYgPSBkZXYtPnByaXY7CisKKwlwcml2LT50cV9tZW11cGRhdGUucm91dGluZT1ldGhlcjAwX21lbV91cGRhdGU7CisJcHJpdi0+dHFfbWVtdXBkYXRlLmRhdGE9KHZvaWQqKSBkZXY7CisKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cnhfbG9jayk7CisKKwltYXBfYWRkcj1pb3JlbWFwX25vY2FjaGUoZGV2X2luZm8tPmJhc2VfYWRkcixTWl80Syk7CisJaWYoIW1hcF9hZGRyKXsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJb3V0X2tmcmVlOworCX0KKworCWRldi0+b3Blbj1ldGhlcjAwX29wZW47CisJZGV2LT5zdG9wPWV0aGVyMDBfc3RvcDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdD1ldGhlcjAwX3NldF9tdWx0aWNhc3Q7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQ9ZXRoZXIwMF90eDsKKwlkZXYtPmdldF9zdGF0cz1ldGhlcjAwX3N0YXRzOworCisJZXRoZXIwMF9nZXRfZXRoZXJuZXRfYWRkcmVzcyhkZXYpOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJZGV2LT5iYXNlX2FkZHI9KHVuc2lnbmVkIGludCltYXBfYWRkcjsKKwlkZXYtPmlycT1kZXZfaW5mby0+aXJxOworCWRldi0+ZmVhdHVyZXM9TkVUSUZfRl9EWU5BTExPQyB8IE5FVElGX0ZfSFdfQ1NVTTsKKworCXJlc3VsdD1yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZihyZXN1bHQpeworCQlwcmludGsoIkV0aGVyMDA6IEVycm9yICVpIHJlZ2lzdGVyaW5nIGRyaXZlclxuIixyZXN1bHQpOworCQlnb3RvIG91dF91bm1hcDsKKwl9CisJcHJpbnRrKCJyZWdpc3RlcmVkIGV0aGVyMDAgZGV2aWNlIGF0ICUjeFxuIixkZXZfaW5mby0+YmFzZV9hZGRyKTsKKworCWRldl9saXN0W2ldPWRldjsKKworCXJldHVybiByZXN1bHQ7CisKKyBvdXRfdW5tYXA6CisJaW91bm1hcChtYXBfYWRkcik7Cisgb3V0X2tmcmVlOgorCWZyZWVfbmV0ZGV2KGRldik7Cisgb3V0X3JlbGVhc2U6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGRldl9pbmZvLT5iYXNlX2FkZHIsIE1BQ19SRUdfU0laRSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgaW50IGV0aGVyMDBfcmVtb3ZlX2RldmljZXModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvcihpPTA7aTxFVEhfTlI7aSsrKXsKKwkJaWYoZGV2X2xpc3RbaV0peworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXZfbGlzdFtpXSk7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXZfbGlzdFtpXSk7CisJCQlpb3VubWFwKCh2b2lkKilkZXZfbGlzdFtpXS0+YmFzZV9hZGRyKTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihkZXZfbGlzdFtpXS0+YmFzZV9hZGRyLCBNQUNfUkVHX1NJWkUpOworCQkJZnJlZV9uZXRkZXYoZGV2X2xpc3RbaV0pOworCQkJZGV2X2xpc3RbaV09MDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGRfaG90c3dhcF9vcHMgZXRoZXIwMF9wbGRoc19vcHM9eworCS5uYW1lID0gRVRIRVIwMF9OQU1FLAorCS5hZGRfZGV2aWNlID0gZXRoZXIwMF9hZGRfZGV2aWNlLAorCS5yZW1vdmVfZGV2aWNlcyA9IGV0aGVyMDBfcmVtb3ZlX2RldmljZXMsCit9OworCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBldGhlcjAwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlyZXN1bHQ9ZXRoZXIwMF9yZW1vdmVfZGV2aWNlcygpOworCWlmKHJlc3VsdCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXRoZXIwMDogZmFpbGVkIHRvIHJlbW92ZSBhbGwgZGV2aWNlc1xuIik7CisKKwlwbGRoc191bnJlZ2lzdGVyX2RyaXZlcihFVEhFUjAwX05BTUUpOworfQorbW9kdWxlX2V4aXQoZXRoZXIwMF9jbGVhbnVwX21vZHVsZSk7CisKKworc3RhdGljIGludCBfX2luaXQgZXRoZXIwMF9tb2RfaW5pdCh2b2lkKQoreworCXByaW50aygibW9kIGluaXRcbiIpOworCXJldHVybiBwbGRoc19yZWdpc3Rlcl9kcml2ZXIoJmV0aGVyMDBfcGxkaHNfb3BzKTsKKworfQorCittb2R1bGVfaW5pdChldGhlcjAwX21vZF9pbml0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyMS5jIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDc1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXIxLmMKQEAgLTAsMCArMSwxMTEwIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvYWNvcm4vbmV0L2V0aGVyMS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ni0yMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIEFjb3JuIGV0aGVyMSBkcml2ZXIgKDgyNTg2IGNoaXApIGZvciBBY29ybiBtYWNoaW5lcworICoKKyAqIFdlIGJhc2ljYWxseSBrZWVwIHR3byBxdWV1ZXMgaW4gdGhlIGNhcmRzIG1lbW9yeSAtIG9uZSBmb3IgdHJhbnNtaXQKKyAqIGFuZCBvbmUgZm9yIHJlY2VpdmUuICBFYWNoIGhhcyBhIGhlYWQgYW5kIGEgdGFpbC4gIFRoZSBoZWFkIGlzIHdoZXJlCisgKiB3ZS90aGUgY2hpcCBhZGRzIHBhY2tldHMgdG8gYmUgdHJhbnNtaXR0ZWQvcmVjZWl2ZWQsIGFuZCB0aGUgdGFpbAorICogaXMgd2hlcmUgdGhlIHRyYW5zbWl0dGVyIGhhcyBnb3QgdG8vd2hlcmUgdGhlIHJlY2VpdmVyIHdpbGwgc3RvcC4KKyAqIEJvdGggb2YgdGhlc2UgcXVldWVzIGFyZSBjaXJjdWxhciwgYW5kIHNpbmNlIHRoZSBjaGlwIGlzIHJ1bm5pbmcKKyAqIGFsbCB0aGUgdGltZSwgd2UgaGF2ZSB0byBiZSBjYXJlZnVsIHdoZW4gd2UgbW9kaWZ5IHRoZSBwb2ludGVycyBldGMKKyAqIHNvIHRoYXQgdGhlIGJ1ZmZlciBtZW1vcnkgY29udGVudHMgaXMgdmFsaWQgYWxsIHRoZSB0aW1lLgorICoKKyAqIENoYW5nZSBsb2c6CisgKiAxLjAwCVJNSwkJCVJlbGVhc2VkCisgKiAxLjAxCVJNSwkxOS8wMy8xOTk2CVRyYW5zZmVycyB0aGUgbGFzdCBvZGQgYnl0ZSBvbnRvL29mZiBvZiB0aGUgY2FyZCBub3cuCisgKiAxLjAyCVJNSwkyNS8wNS8xOTk3CUFkZGVkIGNvZGUgdG8gcmVzdGFydCBSVSBpZiBpdCBnb2VzIG5vdCByZWFkeQorICogMS4wMwlSTUsJMTQvMDkvMTk5NwlDbGVhbmVkIHVwIHRoZSBoYW5kbGluZyBvZiBhIHJlc2V0IGR1cmluZyB0aGUgVFggaW50ZXJydXB0LgorICoJCQkJU2hvdWxkIHByZXZlbnQgbG9ja3VwLgorICogMS4wNCBSTUsJMTcvMDkvMTk5NwlBZGRlZCBtb3JlIGluZm8gd2hlbiBpbml0aWFsc2F0aW9uIG9mIGNoaXAgZ29lcyB3cm9uZy4KKyAqCQkJCVREUiBub3cgb25seSByZXBvcnRzIGZhaWx1cmUgd2hlbiBjaGlwIHJlcG9ydHMgbm9uLXplcm8KKyAqCQkJCVREUiB0aW1lLWRpc3RhbmNlLgorICogMS4wNQlSTUsJMzEvMTIvMTk5NwlSZW1vdmVkIGNhbGxzIHRvIGRldl90aW50IGZvciAyLjEKKyAqIDEuMDYJUk1LCTEwLzAyLzIwMDAJVXBkYXRlZCBmb3IgMi4zLjQzCisgKiAxLjA3CVJNSwkxMy8wNS8yMDAwCVVwZGF0ZWQgZm9yIDIuMy45OS1wcmU4CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9lY2FyZC5oPgorCisjZGVmaW5lIF9fRVRIRVIxX0MKKyNpbmNsdWRlICJldGhlcjEuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBuZXRfZGVidWcgPSBORVRfREVCVUc7CisKKyNkZWZpbmUgQlVGRkVSX1NJWkUJMHgxMDAwMAorI2RlZmluZSBUWF9BUkVBX1NUQVJUCTB4MDAxMDAKKyNkZWZpbmUgVFhfQVJFQV9FTkQJMHgwNTAwMAorI2RlZmluZSBSWF9BUkVBX1NUQVJUCTB4MDUwMDAKKyNkZWZpbmUgUlhfQVJFQV9FTkQJMHgwZmMwMAorCitzdGF0aWMgaW50IGV0aGVyMV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBldGhlcjFfc2VuZHBhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBldGhlcjFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBldGhlcjFfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmV0aGVyMV9nZXRzdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGV0aGVyMV9zZXRtdWx0aWNhc3RsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZXRoZXIxX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSAiZXRoZXIxIGV0aGVybmV0IGRyaXZlciAoYykgMjAwMCBSdXNzZWxsIEtpbmcgdjEuMDdcbiI7CisKKyNkZWZpbmUgQlVTXzE2IDE2CisjZGVmaW5lIEJVU184ICA4CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBESVNBQkxFSVJRUyAxCisjZGVmaW5lIE5PUk1BTElSUVMgIDAKKworI2RlZmluZSBldGhlcjFfcmVhZHcoZGV2LCBhZGRyLCB0eXBlLCBvZmZzZXQsIHN2ZmxncykgZXRoZXIxX2lud19wIChkZXYsIGFkZHIgKyAoaW50KSgmKCh0eXBlICopMCktPm9mZnNldCksIHN2ZmxncykKKyNkZWZpbmUgZXRoZXIxX3dyaXRldyhkZXYsIHZhbCwgYWRkciwgdHlwZSwgb2Zmc2V0LCBzdmZsZ3MpIGV0aGVyMV9vdXR3X3AgKGRldiwgdmFsLCBhZGRyICsgKGludCkoJigodHlwZSAqKTApLT5vZmZzZXQpLCBzdmZsZ3MpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQKK2V0aGVyMV9pbndfcCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFkZHIsIGludCBzdmZsZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCByZXQ7CisKKwlpZiAoc3ZmbGdzKQorCQlsb2NhbF9pcnFfc2F2ZSAoZmxhZ3MpOworCisJd3JpdGViKGFkZHIgPj4gMTIsIFJFR19QQUdFKTsKKwlyZXQgPSByZWFkdyhFVEhFUjFfUkFNICsgKChhZGRyICYgNDA5NSkgPDwgMSkpOworCWlmIChzdmZsZ3MpCisJCWxvY2FsX2lycV9yZXN0b3JlIChmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitldGhlcjFfb3V0d19wIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2YWwsIGludCBhZGRyLCBpbnQgc3ZmbGdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc3ZmbGdzKQorCQlsb2NhbF9pcnFfc2F2ZSAoZmxhZ3MpOworCisJd3JpdGViKGFkZHIgPj4gMTIsIFJFR19QQUdFKTsKKwl3cml0ZXcodmFsLCBFVEhFUjFfUkFNICsgKChhZGRyICYgNDA5NSkgPDwgMSkpOworCWlmIChzdmZsZ3MpCisJCWxvY2FsX2lycV9yZXN0b3JlIChmbGFncyk7Cit9CisKKy8qCisgKiBTb21lIGlubGluZSBhc3NlbWJsZXIgdG8gYWxsb3cgZmFzdCB0cmFuc2ZlcnMgb24gdG8vb2ZmIG9mIHRoZSBjYXJkLgorICogU2luY2UgdGhpcyBkcml2ZXIgZGVwZW5kcyBvbiBzb21lIGZlYXR1cmVzIHByZXNlbnRlZCBieSB0aGUgQVJNCisgKiBzcGVjaWZpYyBhcmNoaXRlY3R1cmUsIGFuZCB0aGF0IHlvdSBjYW4ndCBjb25maWd1cmUgdGhpcyBkcml2ZXIKKyAqIHdpdGhvdXQgc3BlY2lmaWluZyBBUk0gbW9kZSwgdGhpcyBpcyBub3QgYSBwcm9ibGVtLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBlc3NlbnRpYWxseSBhbiBvcHRpbWlzZWQgbWVtY3B5IGZyb20gdGhlIGNhcmQncworICogb25ib2FyZCBSQU0gdG8ga2VybmVsIG1lbW9yeS4KKyAqLworc3RhdGljIHZvaWQKK2V0aGVyMV93cml0ZWJ1ZmZlciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCXVuc2lnbmVkIGludCBwYWdlLCB0aGlzbGVuLCBvZmZzZXQ7CisJdm9pZCBfX2lvbWVtICphZGRyOworCisJb2Zmc2V0ID0gc3RhcnQgJiA0MDk1OworCXBhZ2UgPSBzdGFydCA+PiAxMjsKKwlhZGRyID0gRVRIRVIxX1JBTSArIChvZmZzZXQgPDwgMSk7CisKKwlpZiAob2Zmc2V0ICsgbGVuZ3RoID4gNDA5NikKKwkJdGhpc2xlbiA9IDQwOTYgLSBvZmZzZXQ7CisJZWxzZQorCQl0aGlzbGVuID0gbGVuZ3RoOworCisJZG8geworCQlpbnQgdXNlZDsKKworCQl3cml0ZWIocGFnZSwgUkVHX1BBR0UpOworCQlsZW5ndGggLT0gdGhpc2xlbjsKKworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkic3VicwklMywgJTMsICMyXG5cCisJYm1pCTJmXG5cCisxOglsZHIJJTAsIFslMV0sICMyXG5cCisJbW92CSUwLCAlMCwgbHNsICMxNlxuXAorCW9ycgklMCwgJTAsICUwLCBsc3IgIzE2XG5cCisJc3RyCSUwLCBbJTJdLCAjNFxuXAorCXN1YnMJJTMsICUzLCAjMlxuXAorCWJtaQkyZlxuXAorCWxkcgklMCwgWyUxXSwgIzJcblwKKwltb3YJJTAsICUwLCBsc2wgIzE2XG5cCisJb3JyCSUwLCAlMCwgJTAsIGxzciAjMTZcblwKKwlzdHIJJTAsIFslMl0sICM0XG5cCisJc3VicwklMywgJTMsICMyXG5cCisJYm1pCTJmXG5cCisJbGRyCSUwLCBbJTFdLCAjMlxuXAorCW1vdgklMCwgJTAsIGxzbCAjMTZcblwKKwlvcnIJJTAsICUwLCAlMCwgbHNyICMxNlxuXAorCXN0cgklMCwgWyUyXSwgIzRcblwKKwlzdWJzCSUzLCAlMywgIzJcblwKKwlibWkJMmZcblwKKwlsZHIJJTAsIFslMV0sICMyXG5cCisJbW92CSUwLCAlMCwgbHNsICMxNlxuXAorCW9ycgklMCwgJTAsICUwLCBsc3IgIzE2XG5cCisJc3RyCSUwLCBbJTJdLCAjNFxuXAorCXN1YnMJJTMsICUzLCAjMlxuXAorCWJwbAkxYlxuXAorMjoJYWRkcwklMywgJTMsICMxXG5cCisJbGRyZXFiCSUwLCBbJTFdXG5cCisJc3RyZXFiCSUwLCBbJTJdIgorCQk6ICI9JnIiICh1c2VkKSwgIj0mciIgKGRhdGEpCisJCTogInIiICAoYWRkciksICJyIiAodGhpc2xlbiksICIxIiAoZGF0YSkpOworCisJCWFkZHIgPSBFVEhFUjFfUkFNOworCisJCXRoaXNsZW4gPSBsZW5ndGg7CisJCWlmICh0aGlzbGVuID4gNDA5NikKKwkJCXRoaXNsZW4gPSA0MDk2OworCQlwYWdlKys7CisJfSB3aGlsZSAodGhpc2xlbik7Cit9CisKK3N0YXRpYyB2b2lkCitldGhlcjFfcmVhZGJ1ZmZlciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCXVuc2lnbmVkIGludCBwYWdlLCB0aGlzbGVuLCBvZmZzZXQ7CisJdm9pZCBfX2lvbWVtICphZGRyOworCisJb2Zmc2V0ID0gc3RhcnQgJiA0MDk1OworCXBhZ2UgPSBzdGFydCA+PiAxMjsKKwlhZGRyID0gRVRIRVIxX1JBTSArIChvZmZzZXQgPDwgMSk7CisKKwlpZiAob2Zmc2V0ICsgbGVuZ3RoID4gNDA5NikKKwkJdGhpc2xlbiA9IDQwOTYgLSBvZmZzZXQ7CisJZWxzZQorCQl0aGlzbGVuID0gbGVuZ3RoOworCisJZG8geworCQlpbnQgdXNlZDsKKworCQl3cml0ZWIocGFnZSwgUkVHX1BBR0UpOworCQlsZW5ndGggLT0gdGhpc2xlbjsKKworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkic3VicwklMywgJTMsICMyXG5cCisJYm1pCTJmXG5cCisxOglsZHIJJTAsIFslMl0sICM0XG5cCisJc3RyYgklMCwgWyUxXSwgIzFcblwKKwltb3YJJTAsICUwLCBsc3IgIzhcblwKKwlzdHJiCSUwLCBbJTFdLCAjMVxuXAorCXN1YnMJJTMsICUzLCAjMlxuXAorCWJtaQkyZlxuXAorCWxkcgklMCwgWyUyXSwgIzRcblwKKwlzdHJiCSUwLCBbJTFdLCAjMVxuXAorCW1vdgklMCwgJTAsIGxzciAjOFxuXAorCXN0cmIJJTAsIFslMV0sICMxXG5cCisJc3VicwklMywgJTMsICMyXG5cCisJYm1pCTJmXG5cCisJbGRyCSUwLCBbJTJdLCAjNFxuXAorCXN0cmIJJTAsIFslMV0sICMxXG5cCisJbW92CSUwLCAlMCwgbHNyICM4XG5cCisJc3RyYgklMCwgWyUxXSwgIzFcblwKKwlzdWJzCSUzLCAlMywgIzJcblwKKwlibWkJMmZcblwKKwlsZHIJJTAsIFslMl0sICM0XG5cCisJc3RyYgklMCwgWyUxXSwgIzFcblwKKwltb3YJJTAsICUwLCBsc3IgIzhcblwKKwlzdHJiCSUwLCBbJTFdLCAjMVxuXAorCXN1YnMJJTMsICUzLCAjMlxuXAorCWJwbAkxYlxuXAorMjoJYWRkcwklMywgJTMsICMxXG5cCisJbGRyZXFiCSUwLCBbJTJdXG5cCisJc3RyZXFiCSUwLCBbJTFdIgorCQk6ICI9JnIiICh1c2VkKSwgIj0mciIgKGRhdGEpCisJCTogInIiICAoYWRkciksICJyIiAodGhpc2xlbiksICIxIiAoZGF0YSkpOworCisJCWFkZHIgPSBFVEhFUjFfUkFNOworCisJCXRoaXNsZW4gPSBsZW5ndGg7CisJCWlmICh0aGlzbGVuID4gNDA5NikKKwkJCXRoaXNsZW4gPSA0MDk2OworCQlwYWdlKys7CisJfSB3aGlsZSAodGhpc2xlbik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0CitldGhlcjFfcmFtdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyID0ga21hbGxvYyAoQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOworCWludCBpLCByZXQgPSBCVUZGRVJfU0laRTsKKwlpbnQgbWF4X2Vycm9ycyA9IDE1OworCWludCBiYWQgPSAtMTsKKwlpbnQgYmFkX3N0YXJ0ID0gMDsKKworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gMTsKKworCW1lbXNldCAoYnVmZmVyLCBieXRlLCBCVUZGRVJfU0laRSk7CisJZXRoZXIxX3dyaXRlYnVmZmVyIChkZXYsIGJ1ZmZlciwgMCwgQlVGRkVSX1NJWkUpOworCW1lbXNldCAoYnVmZmVyLCBieXRlIF4gMHhmZiwgQlVGRkVSX1NJWkUpOworCWV0aGVyMV9yZWFkYnVmZmVyIChkZXYsIGJ1ZmZlciwgMCwgQlVGRkVSX1NJWkUpOworCisJZm9yIChpID0gMDsgaSA8IEJVRkZFUl9TSVpFOyBpKyspIHsKKwkJaWYgKGJ1ZmZlcltpXSAhPSBieXRlKSB7CisJCQlpZiAobWF4X2Vycm9ycyA+PSAwICYmIGJhZCAhPSBidWZmZXJbaV0pIHsKKwkJCQlpZiAoYmFkICE9IC0xKQorCQkJCQlwcmludGsgKCJcbiIpOworCQkJCXByaW50ayAoS0VSTl9DUklUICIlczogUkFNIGZhaWxlZCB3aXRoICglMDJYIGluc3RlYWQgb2YgJTAyWCkgYXQgMHglMDRYIiwKKwkJCQkJZGV2LT5uYW1lLCBidWZmZXJbaV0sIGJ5dGUsIGkpOworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJbWF4X2Vycm9ycyAtLTsKKwkJCQliYWQgPSBidWZmZXJbaV07CisJCQkJYmFkX3N0YXJ0ID0gaTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChiYWQgIT0gLTEpIHsKKwkJCSAgICAJaWYgKGJhZF9zdGFydCA9PSBpIC0gMSkKKwkJCQkJcHJpbnRrICgiXG4iKTsKKwkJCQllbHNlCisJCQkJCXByaW50ayAoIiAtIDB4JTA0WFxuIiwgaSAtIDEpOworCQkJCWJhZCA9IC0xOworCQkJfQorCQl9CisJfQorCisJaWYgKGJhZCAhPSAtMSkKKwkJcHJpbnRrICgiIC0gMHglMDRYXG4iLCBCVUZGRVJfU0laRSk7CisJa2ZyZWUgKGJ1ZmZlcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitldGhlcjFfcmVzZXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGViKENUUkxfUlNUfENUUkxfQUNLLCBSRUdfQ09OVFJPTCk7CisJcmV0dXJuIEJVU18xNjsKK30KKworc3RhdGljIGludCBfX2luaXQKK2V0aGVyMV9pbml0XzIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlkZXYtPm1lbV9zdGFydCA9IDA7CisKKwlpID0gZXRoZXIxX3JhbXRlc3QgKGRldiwgMHg1YSk7CisKKwlpZiAoaSA+IDApCisJCWkgPSBldGhlcjFfcmFtdGVzdCAoZGV2LCAweDFlKTsKKworCWlmIChpIDw9IDApCisJICAgIAlyZXR1cm4gLUVOT0RFVjsKKworCWRldi0+bWVtX2VuZCA9IGk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHN0cnVjdHVyZXMgdGhhdCBhcmUgbG9hZGVkIGludG8gdGhlIGV0aGVyIFJBTSBjYXJkIHRvCisgKiBpbml0aWFsaXNlIHRoZSA4MjU4NgorICovCisKKy8qIGF0IDB4MDEwMCAqLworI2RlZmluZSBOT1BfQUREUgkoVFhfQVJFQV9TVEFSVCkKKyNkZWZpbmUgTk9QX1NJWkUJKDB4MDYpCitzdGF0aWMgbm9wX3QgIGluaXRfbm9wICA9IHsKKwkwLAorCUNNRF9OT1AsCisJTk9QX0FERFIKK307CisKKy8qIGF0IDB4MDAzYSAqLworI2RlZmluZSBURFJfQUREUgkoMHgwMDNhKQorI2RlZmluZSBURFJfU0laRQkoMHgwOCkKK3N0YXRpYyB0ZHJfdCAgaW5pdF90ZHIJPSB7CisJMCwKKwlDTURfVERSIHwgQ01EX0lOVFIsCisJTk9QX0FERFIsCisJMAorfTsKKworLyogYXQgMHgwMDJlICovCisjZGVmaW5lIE1DX0FERFIJCSgweDAwMmUpCisjZGVmaW5lIE1DX1NJWkUJCSgweDBjKQorc3RhdGljIG1jX3QgICBpbml0X21jICAgPSB7CisJMCwKKwlDTURfU0VUTVVMVElDQVNULAorCVREUl9BRERSLAorCTAsCisJeyB7IDAsIH0gfQorfTsKKworLyogYXQgMHgwMDIyICovCisjZGVmaW5lIFNBX0FERFIJCSgweDAwMjIpCisjZGVmaW5lIFNBX1NJWkUJCSgweDBjKQorc3RhdGljIHNhX3QgICBpbml0X3NhICAgPSB7CisJMCwKKwlDTURfU0VUQUREUkVTUywKKwlNQ19BRERSLAorCXsgMCwgfQorfTsKKworLyogYXQgMHgwMDEwICovCisjZGVmaW5lIENGR19BRERSCSgweDAwMTApCisjZGVmaW5lIENGR19TSVpFCSgweDEyKQorc3RhdGljIGNmZ190ICBpbml0X2NmZyAgPSB7CisJMCwKKwlDTURfQ09ORklHLAorCVNBX0FERFIsCisJOCwKKwk4LAorCUNGRzhfU1JEWSwKKwlDRkc5X1BSRUFNQjggfCBDRkc5X0FERFJMRU5CVUYgfCBDRkc5X0FERFJMRU4oNiksCisJMCwKKwkweDYwLAorCTAsCisJQ0ZHMTNfUkVUUlkoMTUpIHwgQ0ZHMTNfU0xPVEgoMiksCisJMCwKK307CisKKy8qIGF0IDB4MDAwMCAqLworI2RlZmluZSBTQ0JfQUREUgkoMHgwMDAwKQorI2RlZmluZSBTQ0JfU0laRQkoMHgxMCkKK3N0YXRpYyBzY2JfdCAgaW5pdF9zY2IgID0geworCTAsCisJU0NCX0NNREFDS1JOUiB8IFNDQl9DTURBQ0tDTkEgfCBTQ0JfQ01EQUNLRlIgfCBTQ0JfQ01EQUNLQ1gsCisJQ0ZHX0FERFIsCisJUlhfQVJFQV9TVEFSVCwKKwkwLAorCTAsCisJMCwKKwkwCit9OworCisvKiBhdCAweGZmZWUgKi8KKyNkZWZpbmUgSVNDUF9BRERSCSgweGZmZWUpCisjZGVmaW5lIElTQ1BfU0laRQkoMHgwOCkKK3N0YXRpYyBpc2NwX3QgaW5pdF9pc2NwID0geworCTEsCisJU0NCX0FERFIsCisJMHgwMDAwLAorCTB4MDAwMAorfTsKKworLyogYXQgMHhmZmY2ICovCisjZGVmaW5lIFNDUF9BRERSCSgweGZmZjYpCisjZGVmaW5lIFNDUF9TSVpFCSgweDBhKQorc3RhdGljIHNjcF90ICBpbml0X3NjcCAgPSB7CisJU0NQX1NZXzE2QkJVUywKKwl7IDAsIDAgfSwKKwlJU0NQX0FERFIsCisJMAorfTsKKworI2RlZmluZSBSRkRfU0laRQkoMHgxNikKK3N0YXRpYyByZmRfdCAgaW5pdF9yZmQJPSB7CisJMCwKKwkwLAorCTAsCisJMCwKKwl7IDAsIH0sCisJeyAwLCB9LAorCTAKK307CisKKyNkZWZpbmUgUkJEX1NJWkUJKDB4MGEpCitzdGF0aWMgcmJkX3QgIGluaXRfcmJkCT0geworCTAsCisJMCwKKwkwLAorCTAsCisJRVRIX0ZSQU1FX0xFTiArIDgKK307CisKKyNkZWZpbmUgVFhfU0laRQkJKDB4MDgpCisjZGVmaW5lIFRCRF9TSVpFCSgweDA4KQorCitzdGF0aWMgaW50CitldGhlcjFfaW5pdF9mb3Jfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaSwgc3RhdHVzLCBhZGRyLCBuZXh0LCBuZXh0MjsKKwlpbnQgZmFpbHVyZXMgPSAwOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCXdyaXRlYihDVFJMX1JTVHxDVFJMX0FDSywgUkVHX0NPTlRST0wpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJaW5pdF9zYS5zYV9hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKworCS8qIGxvYWQgZGF0YSBzdHJ1Y3R1cmVzIGludG8gZXRoZXIxIFJBTSAqLworCWV0aGVyMV93cml0ZWJ1ZmZlciAoZGV2LCAmaW5pdF9zY3AsICBTQ1BfQUREUiwgIFNDUF9TSVpFKTsKKwlldGhlcjFfd3JpdGVidWZmZXIgKGRldiwgJmluaXRfaXNjcCwgSVNDUF9BRERSLCBJU0NQX1NJWkUpOworCWV0aGVyMV93cml0ZWJ1ZmZlciAoZGV2LCAmaW5pdF9zY2IsICBTQ0JfQUREUiwgIFNDQl9TSVpFKTsKKwlldGhlcjFfd3JpdGVidWZmZXIgKGRldiwgJmluaXRfY2ZnLCAgQ0ZHX0FERFIsICBDRkdfU0laRSk7CisJZXRoZXIxX3dyaXRlYnVmZmVyIChkZXYsICZpbml0X3NhLCAgIFNBX0FERFIsICAgU0FfU0laRSk7CisJZXRoZXIxX3dyaXRlYnVmZmVyIChkZXYsICZpbml0X21jLCAgIE1DX0FERFIsICAgTUNfU0laRSk7CisJZXRoZXIxX3dyaXRlYnVmZmVyIChkZXYsICZpbml0X3RkciwgIFREUl9BRERSLCAgVERSX1NJWkUpOworCWV0aGVyMV93cml0ZWJ1ZmZlciAoZGV2LCAmaW5pdF9ub3AsICBOT1BfQUREUiwgIE5PUF9TSVpFKTsKKworCWlmIChldGhlcjFfcmVhZHcoZGV2LCBDRkdfQUREUiwgY2ZnX3QsIGNmZ19jb21tYW5kLCBOT1JNQUxJUlFTKSAhPSBDTURfQ09ORklHKSB7CisJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBkZXRlY3RlZCBlaXRoZXIgUkFNIGZhdWx0IG9yIGNvbXBpbGVyIGJ1Z1xuIiwKKwkJCWRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogc2V0dXAgY2lyY3VsYXJseSBsaW5rZWQgbGlzdCBvZiB7IHJmZCwgcmJkLCBidWZmZXIgfSwgd2l0aAorCSAqIGFsbCByZmRzIGNpcmN1bGFybHkgbGlua2VkLCByYmRzIGNpcmN1bGFybHkgbGlua2VkLgorCSAqIEZpcnN0IHJmZCBpcyBsaW5rZWQgdG8gc2NwLCBmaXJzdCByYmQgaXMgbGlua2VkIHRvIGZpcnN0CisJICogcmZkLiAgTGFzdCByYmQgaGFzIGEgc3VzcGVuZCBjb21tYW5kLgorCSAqLworCWFkZHIgPSBSWF9BUkVBX1NUQVJUOworCWRvIHsKKwkJbmV4dCA9IGFkZHIgKyBSRkRfU0laRSArIFJCRF9TSVpFICsgRVRIX0ZSQU1FX0xFTiArIDEwOworCQluZXh0MiA9IG5leHQgKyBSRkRfU0laRSArIFJCRF9TSVpFICsgRVRIX0ZSQU1FX0xFTiArIDEwOworCisJCWlmIChuZXh0MiA+PSBSWF9BUkVBX0VORCkgeworCQkJbmV4dCA9IFJYX0FSRUFfU1RBUlQ7CisJCQlpbml0X3JmZC5yZmRfY29tbWFuZCA9IFJGRF9DTURFTCB8IFJGRF9DTURTVVNQRU5EOworCQkJcHJpdihkZXYpLT5yeF90YWlsID0gYWRkcjsKKwkJfSBlbHNlCisJCQlpbml0X3JmZC5yZmRfY29tbWFuZCA9IDA7CisJCWlmIChhZGRyID09IFJYX0FSRUFfU1RBUlQpCisJCQlpbml0X3JmZC5yZmRfcmJkb2Zmc2V0ID0gYWRkciArIFJGRF9TSVpFOworCQllbHNlCisJCQlpbml0X3JmZC5yZmRfcmJkb2Zmc2V0ID0gMDsKKwkJaW5pdF9yZmQucmZkX2xpbmsgPSBuZXh0OworCQlpbml0X3JiZC5yYmRfbGluayA9IG5leHQgKyBSRkRfU0laRTsKKwkJaW5pdF9yYmQucmJkX2J1ZmwgPSBhZGRyICsgUkZEX1NJWkUgKyBSQkRfU0laRTsKKworCQlldGhlcjFfd3JpdGVidWZmZXIgKGRldiwgJmluaXRfcmZkLCBhZGRyLCBSRkRfU0laRSk7CisJCWV0aGVyMV93cml0ZWJ1ZmZlciAoZGV2LCAmaW5pdF9yYmQsIGFkZHIgKyBSRkRfU0laRSwgUkJEX1NJWkUpOworCQlhZGRyID0gbmV4dDsKKwl9IHdoaWxlIChuZXh0MiA8IFJYX0FSRUFfRU5EKTsKKworCXByaXYoZGV2KS0+dHhfbGluayA9IE5PUF9BRERSOworCXByaXYoZGV2KS0+dHhfaGVhZCA9IE5PUF9BRERSICsgTk9QX1NJWkU7CisJcHJpdihkZXYpLT50eF90YWlsID0gVERSX0FERFI7CisJcHJpdihkZXYpLT5yeF9oZWFkID0gUlhfQVJFQV9TVEFSVDsKKworCS8qIHJlbGVhc2UgcmVzZXQgJiBnaXZlIDU4NiBhIHByb2QgKi8KKwlwcml2KGRldiktPnJlc2V0dGluZyA9IDE7CisJcHJpdihkZXYpLT5pbml0aWFsaXNpbmcgPSAxOworCXdyaXRlYihDVFJMX1JTVCwgUkVHX0NPTlRST0wpOworCXdyaXRlYigwLCBSRUdfQ09OVFJPTCk7CisJd3JpdGViKENUUkxfQ0EsIFJFR19DT05UUk9MKTsKKworCS8qIDU4NiBzaG91bGQgbm93IHVuc2V0IGlzY3AuYnVzeSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgSFovMjsKKwl3aGlsZSAoZXRoZXIxX3JlYWR3KGRldiwgSVNDUF9BRERSLCBpc2NwX3QsIGlzY3BfYnVzeSwgRElTQUJMRUlSUVMpID09IDEpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogY2FuJ3QgaW5pdGlhbGlzZSA4MjU4NjogaXNjcCBpcyBidXN5XG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKiBjaGVjayBzdGF0dXMgb2YgY29tbWFuZHMgdGhhdCB3ZSBpc3N1ZWQgKi8KKwl0aW1lb3V0ICs9IEhaLzEwOworCXdoaWxlICgoKHN0YXR1cyA9IGV0aGVyMV9yZWFkdyhkZXYsIENGR19BRERSLCBjZmdfdCwgY2ZnX3N0YXR1cywgRElTQUJMRUlSUVMpKQorCQkJJiBTVEFUX0NPTVBMRVRFKSA9PSAwKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKChzdGF0dXMgJiAoU1RBVF9DT01QTEVURSB8IFNUQVRfT0spKSAhPSAoU1RBVF9DT01QTEVURSB8IFNUQVRfT0spKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogY2FuJ3QgaW5pdGlhbGlzZSA4MjU4NjogY29uZmlnIHN0YXR1cyAlMDRYXG4iLCBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IFNDQj1bU1RTPSUwNFggQ01EPSUwNFggQ0JMPSUwNFggUkZBPSUwNFhdXG4iLCBkZXYtPm5hbWUsCisJCQlldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9zdGF0dXMsIE5PUk1BTElSUVMpLAorCQkJZXRoZXIxX3JlYWR3KGRldiwgU0NCX0FERFIsIHNjYl90LCBzY2JfY29tbWFuZCwgTk9STUFMSVJRUyksCisJCQlldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9jYmxfb2Zmc2V0LCBOT1JNQUxJUlFTKSwKKwkJCWV0aGVyMV9yZWFkdyhkZXYsIFNDQl9BRERSLCBzY2JfdCwgc2NiX3JmYV9vZmZzZXQsIE5PUk1BTElSUVMpKTsKKwkJZmFpbHVyZXMgKz0gMTsKKwl9CisKKwl0aW1lb3V0ICs9IEhaLzEwOworCXdoaWxlICgoKHN0YXR1cyA9IGV0aGVyMV9yZWFkdyhkZXYsIFNBX0FERFIsIHNhX3QsIHNhX3N0YXR1cywgRElTQUJMRUlSUVMpKQorCQkJJiBTVEFUX0NPTVBMRVRFKSA9PSAwKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKChzdGF0dXMgJiAoU1RBVF9DT01QTEVURSB8IFNUQVRfT0spKSAhPSAoU1RBVF9DT01QTEVURSB8IFNUQVRfT0spKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogY2FuJ3QgaW5pdGlhbGlzZSA4MjU4Njogc2V0IGFkZHJlc3Mgc3RhdHVzICUwNFhcbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogU0NCPVtTVFM9JTA0WCBDTUQ9JTA0WCBDQkw9JTA0WCBSRkE9JTA0WF1cbiIsIGRldi0+bmFtZSwKKwkJCWV0aGVyMV9yZWFkdyhkZXYsIFNDQl9BRERSLCBzY2JfdCwgc2NiX3N0YXR1cywgTk9STUFMSVJRUyksCisJCQlldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9jb21tYW5kLCBOT1JNQUxJUlFTKSwKKwkJCWV0aGVyMV9yZWFkdyhkZXYsIFNDQl9BRERSLCBzY2JfdCwgc2NiX2NibF9vZmZzZXQsIE5PUk1BTElSUVMpLAorCQkJZXRoZXIxX3JlYWR3KGRldiwgU0NCX0FERFIsIHNjYl90LCBzY2JfcmZhX29mZnNldCwgTk9STUFMSVJRUykpOworCQlmYWlsdXJlcyArPSAxOworCX0KKworCXRpbWVvdXQgKz0gSFovMTA7CisJd2hpbGUgKCgoc3RhdHVzID0gZXRoZXIxX3JlYWR3KGRldiwgTUNfQUREUiwgbWNfdCwgbWNfc3RhdHVzLCBESVNBQkxFSVJRUykpCisJCQkmIFNUQVRfQ09NUExFVEUpID09IDApIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoKHN0YXR1cyAmIChTVEFUX0NPTVBMRVRFIHwgU1RBVF9PSykpICE9IChTVEFUX0NPTVBMRVRFIHwgU1RBVF9PSykpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBjYW4ndCBpbml0aWFsaXNlIDgyNTg2OiBzZXQgbXVsdGljYXN0IHN0YXR1cyAlMDRYXG4iLCBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IFNDQj1bU1RTPSUwNFggQ01EPSUwNFggQ0JMPSUwNFggUkZBPSUwNFhdXG4iLCBkZXYtPm5hbWUsCisJCQlldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9zdGF0dXMsIE5PUk1BTElSUVMpLAorCQkJZXRoZXIxX3JlYWR3KGRldiwgU0NCX0FERFIsIHNjYl90LCBzY2JfY29tbWFuZCwgTk9STUFMSVJRUyksCisJCQlldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9jYmxfb2Zmc2V0LCBOT1JNQUxJUlFTKSwKKwkJCWV0aGVyMV9yZWFkdyhkZXYsIFNDQl9BRERSLCBzY2JfdCwgc2NiX3JmYV9vZmZzZXQsIE5PUk1BTElSUVMpKTsKKwkJZmFpbHVyZXMgKz0gMTsKKwl9CisKKwl0aW1lb3V0ICs9IEhaOworCXdoaWxlICgoKHN0YXR1cyA9IGV0aGVyMV9yZWFkdyhkZXYsIFREUl9BRERSLCB0ZHJfdCwgdGRyX3N0YXR1cywgRElTQUJMRUlSUVMpKQorCQkJJiBTVEFUX0NPTVBMRVRFKSA9PSAwKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKChzdGF0dXMgJiAoU1RBVF9DT01QTEVURSB8IFNUQVRfT0spKSAhPSAoU1RBVF9DT01QTEVURSB8IFNUQVRfT0spKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogY2FuJ3QgdGRyIChpZ25vcmVkKVxuIiwgZGV2LT5uYW1lKTsKKwkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogU0NCPVtTVFM9JTA0WCBDTUQ9JTA0WCBDQkw9JTA0WCBSRkE9JTA0WF1cbiIsIGRldi0+bmFtZSwKKwkJCWV0aGVyMV9yZWFkdyhkZXYsIFNDQl9BRERSLCBzY2JfdCwgc2NiX3N0YXR1cywgTk9STUFMSVJRUyksCisJCQlldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9jb21tYW5kLCBOT1JNQUxJUlFTKSwKKwkJCWV0aGVyMV9yZWFkdyhkZXYsIFNDQl9BRERSLCBzY2JfdCwgc2NiX2NibF9vZmZzZXQsIE5PUk1BTElSUVMpLAorCQkJZXRoZXIxX3JlYWR3KGRldiwgU0NCX0FERFIsIHNjYl90LCBzY2JfcmZhX29mZnNldCwgTk9STUFMSVJRUykpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGV0aGVyMV9yZWFkdyhkZXYsIFREUl9BRERSLCB0ZHJfdCwgdGRyX3Jlc3VsdCwgRElTQUJMRUlSUVMpOworCQlpZiAoc3RhdHVzICYgVERSX1hDVlJQUk9CKQorCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBpL2YgZmFpbGVkIHRkcjogdHJhbnNjZWl2ZXIgcHJvYmxlbVxuIiwgZGV2LT5uYW1lKTsKKwkJZWxzZSBpZiAoKHN0YXR1cyAmIChURFJfU0hPUlR8VERSX09QRU4pKSAmJiAoc3RhdHVzICYgVERSX1RJTUUpKSB7CisjaWZkZWYgRkFOQ1kKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaS9mIGZhaWxlZCB0ZHI6IGNhYmxlICVzICVkLiVkIHVzIGF3YXlcbiIsIGRldi0+bmFtZSwKKwkJCQlzdGF0dXMgJiBURFJfU0hPUlQgPyAic2hvcnQiIDogIm9wZW4iLCAoc3RhdHVzICYgVERSX1RJTUUpIC8gMTAsCisJCQkJKHN0YXR1cyAmIFREUl9USU1FKSAlIDEwKTsKKyNlbHNlCisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGkvZiBmYWlsZWQgdGRyOiBjYWJsZSAlcyAlZCBjbGtzIGF3YXlcbiIsIGRldi0+bmFtZSwKKwkJCQlzdGF0dXMgJiBURFJfU0hPUlQgPyAic2hvcnQiIDogIm9wZW4iLCAoc3RhdHVzICYgVERSX1RJTUUpKTsKKyNlbmRpZgorCQl9CisJfQorCisJaWYgKGZhaWx1cmVzKQorCQlldGhlcjFfcmVzZXQgKGRldik7CisJcmV0dXJuIGZhaWx1cmVzID8gMSA6IDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludAorZXRoZXIxX3R4YWxsb2MgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzaXplKQoreworCWludCBzdGFydCwgdGFpbDsKKworCXNpemUgPSAoc2l6ZSArIDEpICYgfjE7CisJdGFpbCA9IHByaXYoZGV2KS0+dHhfdGFpbDsKKworCWlmIChwcml2KGRldiktPnR4X2hlYWQgKyBzaXplID4gVFhfQVJFQV9FTkQpIHsKKwkJaWYgKHRhaWwgPiBwcml2KGRldiktPnR4X2hlYWQpCisJCQlyZXR1cm4gLTE7CisJCXN0YXJ0ID0gVFhfQVJFQV9TVEFSVDsKKwkJaWYgKHN0YXJ0ICsgc2l6ZSA+IHRhaWwpCisJCQlyZXR1cm4gLTE7CisJCXByaXYoZGV2KS0+dHhfaGVhZCA9IHN0YXJ0ICsgc2l6ZTsKKwl9IGVsc2UgeworCQlpZiAocHJpdihkZXYpLT50eF9oZWFkIDwgdGFpbCAmJiAocHJpdihkZXYpLT50eF9oZWFkICsgc2l6ZSkgPiB0YWlsKQorCQkJcmV0dXJuIC0xOworCQlzdGFydCA9IHByaXYoZGV2KS0+dHhfaGVhZDsKKwkJcHJpdihkZXYpLT50eF9oZWFkICs9IHNpemU7CisJfQorCisJcmV0dXJuIHN0YXJ0OworfQorCitzdGF0aWMgaW50CitldGhlcjFfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWQgZXRoZXJuZXQgTUFDIGFkZHJlc3NcbiIsCisJCQlkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGV0aGVyMV9pbnRlcnJ1cHQsIDAsICJldGhlcjEiLCBkZXYpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCW1lbXNldCAoJnByaXYoZGV2KS0+c3RhdHMsIDAsIHNpemVvZiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKworCWlmIChldGhlcjFfaW5pdF9mb3Jfb3BlbiAoZGV2KSkgeworCQlmcmVlX2lycSAoZGV2LT5pcnEsIGRldik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2V0aGVyMV90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVvdXQsIG5ldHdvcmsgY2FibGUgcHJvYmxlbT9cbiIsCisJCWRldi0+bmFtZSk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlc2V0dGluZyBkZXZpY2VcbiIsIGRldi0+bmFtZSk7CisKKwlldGhlcjFfcmVzZXQgKGRldik7CisKKwlpZiAoZXRoZXIxX2luaXRfZm9yX29wZW4gKGRldikpCisJCXByaW50ayAoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gcmVzdGFydCBpbnRlcmZhY2VcbiIsIGRldi0+bmFtZSk7CisKKwlwcml2KGRldiktPnN0YXRzLnR4X2Vycm9ycysrOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludAorZXRoZXIxX3NlbmRwYWNrZXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHRtcCwgdHN0LCBub3BhZGRyLCB0eGFkZHIsIHRiZGFkZHIsIGRhdGFkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl0eF90IHR4OworCXRiZF90IHRiZDsKKwlub3BfdCBub3A7CisKKwlpZiAocHJpdihkZXYpLT5yZXN0YXJ0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZXNldHRpbmcgZGV2aWNlXG4iLCBkZXYtPm5hbWUpOworCisJCWV0aGVyMV9yZXNldChkZXYpOworCisJCWlmIChldGhlcjFfaW5pdF9mb3Jfb3BlbihkZXYpKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHJlc3RhcnQgaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOworCQllbHNlCisJCQlwcml2KGRldiktPnJlc3RhcnQgPSAwOworCX0KKworCWlmIChza2ItPmxlbiA8IEVUSF9aTEVOKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBpbnNlcnQgcGFja2V0IGZvbGxvd2VkIGJ5IGEgbm9wCisJICovCisJdHhhZGRyID0gZXRoZXIxX3R4YWxsb2MgKGRldiwgVFhfU0laRSk7CisJdGJkYWRkciA9IGV0aGVyMV90eGFsbG9jIChkZXYsIFRCRF9TSVpFKTsKKwlkYXRhZGRyID0gZXRoZXIxX3R4YWxsb2MgKGRldiwgc2tiLT5sZW4pOworCW5vcGFkZHIgPSBldGhlcjFfdHhhbGxvYyAoZGV2LCBOT1BfU0laRSk7CisKKwl0eC50eF9zdGF0dXMgPSAwOworCXR4LnR4X2NvbW1hbmQgPSBDTURfVFggfCBDTURfSU5UUjsKKwl0eC50eF9saW5rID0gbm9wYWRkcjsKKwl0eC50eF90YmRvZmZzZXQgPSB0YmRhZGRyOworCXRiZC50YmRfb3B0cyA9IFRCRF9FT0wgfCBza2ItPmxlbjsKKwl0YmQudGJkX2xpbmsgPSBJODI1ODZfTlVMTDsKKwl0YmQudGJkX2J1ZmwgPSBkYXRhZGRyOworCXRiZC50YmRfYnVmaCA9IDA7CisJbm9wLm5vcF9zdGF0dXMgPSAwOworCW5vcC5ub3BfY29tbWFuZCA9IENNRF9OT1A7CisJbm9wLm5vcF9saW5rID0gbm9wYWRkcjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlldGhlcjFfd3JpdGVidWZmZXIgKGRldiwgJnR4LCB0eGFkZHIsIFRYX1NJWkUpOworCWV0aGVyMV93cml0ZWJ1ZmZlciAoZGV2LCAmdGJkLCB0YmRhZGRyLCBUQkRfU0laRSk7CisJZXRoZXIxX3dyaXRlYnVmZmVyIChkZXYsIHNrYi0+ZGF0YSwgZGF0YWRkciwgc2tiLT5sZW4pOworCWV0aGVyMV93cml0ZWJ1ZmZlciAoZGV2LCAmbm9wLCBub3BhZGRyLCBOT1BfU0laRSk7CisJdG1wID0gcHJpdihkZXYpLT50eF9saW5rOworCXByaXYoZGV2KS0+dHhfbGluayA9IG5vcGFkZHI7CisKKwkvKiBub3cgcmVzZXQgdGhlIHByZXZpb3VzIG5vcCBwb2ludGVyICovCisJZXRoZXIxX3dyaXRldyhkZXYsIHR4YWRkciwgdG1wLCBub3BfdCwgbm9wX2xpbmssIE5PUk1BTElSUVMpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJLyogaGFuZGxlIHRyYW5zbWl0ICovCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwkvKiBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSByb29tIGZvciBhIGZ1bGwgc2l6ZWQgZXRoZXIgZnJhbWUgKi8KKwl0bXAgPSBwcml2KGRldiktPnR4X2hlYWQ7CisJdHN0ID0gZXRoZXIxX3R4YWxsb2MgKGRldiwgVFhfU0laRSArIFRCRF9TSVpFICsgTk9QX1NJWkUgKyBFVEhfRlJBTUVfTEVOKTsKKwlwcml2KGRldiktPnR4X2hlYWQgPSB0bXA7CisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKworCWlmICh0c3QgPT0gLTEpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworIG91dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2V0aGVyMV94bWl0X2RvbmUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbm9wX3Qgbm9wOworCWludCBjYWRkciwgdHN0OworCisJY2FkZHIgPSBwcml2KGRldiktPnR4X3RhaWw7CisKK2FnYWluOgorCWV0aGVyMV9yZWFkYnVmZmVyIChkZXYsICZub3AsIGNhZGRyLCBOT1BfU0laRSk7CisKKwlzd2l0Y2ggKG5vcC5ub3BfY29tbWFuZCAmIENNRF9NQVNLKSB7CisJY2FzZSBDTURfVERSOgorCQkvKiBzcGVjaWFsIGNhc2UgKi8KKwkJaWYgKGV0aGVyMV9yZWFkdyhkZXYsIFNDQl9BRERSLCBzY2JfdCwgc2NiX2NibF9vZmZzZXQsIE5PUk1BTElSUVMpCisJCQkJIT0gKHVuc2lnbmVkIHNob3J0KUk4MjU4Nl9OVUxMKSB7CisJCQlldGhlcjFfd3JpdGV3KGRldiwgU0NCX0NNRENVQ1NUQVJUIHwgU0NCX0NNRFJYU1RBUlQsIFNDQl9BRERSLCBzY2JfdCwKKwkJCQkgICAgc2NiX2NvbW1hbmQsIE5PUk1BTElSUVMpOworCQkJd3JpdGViKENUUkxfQ0EsIFJFR19DT05UUk9MKTsKKwkJfQorCQlwcml2KGRldiktPnR4X3RhaWwgPSBOT1BfQUREUjsKKwkJcmV0dXJuOworCisJY2FzZSBDTURfTk9QOgorCQlpZiAobm9wLm5vcF9saW5rID09IGNhZGRyKSB7CisJCQlpZiAocHJpdihkZXYpLT5pbml0aWFsaXNpbmcgPT0gMCkKKwkJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHN0cmFuZ2UgY29tbWFuZCBjb21wbGV0ZSB3aXRoIG5vIHR4IGNvbW1hbmQhXG4iLCBkZXYtPm5hbWUpOworCQkJZWxzZQorCQkJICAgICAgICBwcml2KGRldiktPmluaXRpYWxpc2luZyA9IDA7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGNhZGRyID09IG5vcC5ub3BfbGluaykKKwkJCXJldHVybjsKKwkJY2FkZHIgPSBub3Aubm9wX2xpbms7CisJCWdvdG8gYWdhaW47CisKKwljYXNlIENNRF9UWDoKKwkJaWYgKG5vcC5ub3Bfc3RhdHVzICYgU1RBVF9DT01QTEVURSkKKwkJCWJyZWFrOworCQlwcmludGsgKEtFUk5fRVJSICIlczogc3RyYW5nZSBjb21tYW5kIGNvbXBsZXRlIHdpdGhvdXQgY29tcGxldGVkIGNvbW1hbmRcbiIsIGRldi0+bmFtZSk7CisJCXByaXYoZGV2KS0+cmVzdGFydCA9IDE7CisJCXJldHVybjsKKworCWRlZmF1bHQ6CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogc3RyYW5nZSBjb21tYW5kICVkIGNvbXBsZXRlISAob2Zmc2V0ICUwNFgpIiwgZGV2LT5uYW1lLAorCQkJbm9wLm5vcF9jb21tYW5kICYgQ01EX01BU0ssIGNhZGRyKTsKKwkJcHJpdihkZXYpLT5yZXN0YXJ0ID0gMTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChub3Aubm9wX3N0YXR1cyAmIFNUQVRfQ09NUExFVEUpIHsKKwkJaWYgKG5vcC5ub3Bfc3RhdHVzICYgU1RBVF9PSykgeworCQkJcHJpdihkZXYpLT5zdGF0cy50eF9wYWNrZXRzICsrOworCQkJcHJpdihkZXYpLT5zdGF0cy5jb2xsaXNpb25zICs9IChub3Aubm9wX3N0YXR1cyAmIFNUQVRfQ09MTElTSU9OUyk7CisJCX0gZWxzZSB7CisJCQlwcml2KGRldiktPnN0YXRzLnR4X2Vycm9ycyArKzsKKworCQkJaWYgKG5vcC5ub3Bfc3RhdHVzICYgU1RBVF9DT0xMQUZURVJUWCkKKwkJCQlwcml2KGRldiktPnN0YXRzLmNvbGxpc2lvbnMgKys7CisJCQlpZiAobm9wLm5vcF9zdGF0dXMgJiBTVEFUX05PQ0FSUklFUikKKwkJCQlwcml2KGRldiktPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzICsrOworCQkJaWYgKG5vcC5ub3Bfc3RhdHVzICYgU1RBVF9UWExPU1RDVFMpCisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBjdHMgbG9zdFxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChub3Aubm9wX3N0YXR1cyAmIFNUQVRfVFhTTE9XRE1BKQorCQkJCXByaXYoZGV2KS0+c3RhdHMudHhfZmlmb19lcnJvcnMgKys7CisJCQlpZiAobm9wLm5vcF9zdGF0dXMgJiBTVEFUX0NPTExFWENFU1NJVkUpCisJCQkJcHJpdihkZXYpLT5zdGF0cy5jb2xsaXNpb25zICs9IDE2OworCQl9CisKKwkJaWYgKG5vcC5ub3BfbGluayA9PSBjYWRkcikgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IHR4IGJ1ZmZlciBjaGFpbmluZyBlcnJvcjogdHggY29tbWFuZCBwb2ludHMgdG8gaXRzZWxmXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCQljYWRkciA9IG5vcC5ub3BfbGluazsKKwkJZXRoZXIxX3JlYWRidWZmZXIgKGRldiwgJm5vcCwgY2FkZHIsIE5PUF9TSVpFKTsKKwkJaWYgKChub3Aubm9wX2NvbW1hbmQgJiBDTURfTUFTSykgIT0gQ01EX05PUCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IHR4IGJ1ZmZlciBjaGFpbmluZyBlcnJvcjogbm8gbm9wIGFmdGVyIHR4IGNvbW1hbmRcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjYWRkciA9PSBub3Aubm9wX2xpbmspCisJCQlicmVhazsKKworCQljYWRkciA9IG5vcC5ub3BfbGluazsKKwkJZXRoZXIxX3JlYWRidWZmZXIgKGRldiwgJm5vcCwgY2FkZHIsIE5PUF9TSVpFKTsKKwkJaWYgKChub3Aubm9wX2NvbW1hbmQgJiBDTURfTUFTSykgIT0gQ01EX1RYKSB7CisJCQlwcmludGsgKEtFUk5fRVJSICIlczogdHggYnVmZmVyIGNoYWluaW5nIGVycm9yOiBubyB0eCBjb21tYW5kIGFmdGVyIG5vcFxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXByaXYoZGV2KS0+dHhfdGFpbCA9IGNhZGRyOworCisJY2FkZHIgPSBwcml2KGRldiktPnR4X2hlYWQ7CisJdHN0ID0gZXRoZXIxX3R4YWxsb2MgKGRldiwgVFhfU0laRSArIFRCRF9TSVpFICsgTk9QX1NJWkUgKyBFVEhfRlJBTUVfTEVOKTsKKwlwcml2KGRldiktPnR4X2hlYWQgPSBjYWRkcjsKKwlpZiAodHN0ICE9IC0xKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkCitldGhlcjFfcmVjdl9kb25lIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBzdGF0dXM7CisJaW50IG5leHR0YWlsLCByYmRhZGRyOworCXJiZF90IHJiZDsKKworCWRvIHsKKwkJc3RhdHVzID0gZXRoZXIxX3JlYWR3KGRldiwgcHJpdihkZXYpLT5yeF9oZWFkLCByZmRfdCwgcmZkX3N0YXR1cywgTk9STUFMSVJRUyk7CisJCWlmICgoc3RhdHVzICYgUkZEX0NPTVBMRVRFKSA9PSAwKQorCQkJYnJlYWs7CisKKwkJcmJkYWRkciA9IGV0aGVyMV9yZWFkdyhkZXYsIHByaXYoZGV2KS0+cnhfaGVhZCwgcmZkX3QsIHJmZF9yYmRvZmZzZXQsIE5PUk1BTElSUVMpOworCQlldGhlcjFfcmVhZGJ1ZmZlciAoZGV2LCAmcmJkLCByYmRhZGRyLCBSQkRfU0laRSk7CisKKwkJaWYgKChyYmQucmJkX3N0YXR1cyAmIChSQkRfRU9GIHwgUkJEX0FDTlRWQUxJRCkpID09IChSQkRfRU9GIHwgUkJEX0FDTlRWQUxJRCkpIHsKKwkJCWludCBsZW5ndGggPSByYmQucmJkX3N0YXR1cyAmIFJCRF9BQ05UOworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJbGVuZ3RoID0gKGxlbmd0aCArIDEpICYgfjE7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiIChsZW5ndGggKyAyKTsKKworCQkJaWYgKHNrYikgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlIChza2IsIDIpOworCisJCQkJZXRoZXIxX3JlYWRidWZmZXIgKGRldiwgc2tiX3B1dCAoc2tiLCBsZW5ndGgpLCByYmQucmJkX2J1ZmwsIGxlbmd0aCk7CisKKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMgKHNrYiwgZGV2KTsKKwkJCQluZXRpZl9yeCAoc2tiKTsKKwkJCQlwcml2KGRldiktPnN0YXRzLnJ4X3BhY2tldHMgKys7CisJCQl9IGVsc2UKKwkJCQlwcml2KGRldiktPnN0YXRzLnJ4X2Ryb3BwZWQgKys7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXNcbiIsIGRldi0+bmFtZSwKKwkJCQkocmJkLnJiZF9zdGF0dXMgJiBSQkRfRU9GKSA/ICJvdmVyc2l6ZWQgcGFja2V0IiA6ICJhY250IG5vdCB2YWxpZCIpOworCQkJcHJpdihkZXYpLT5zdGF0cy5yeF9kcm9wcGVkICsrOworCQl9CisKKwkJbmV4dHRhaWwgPSBldGhlcjFfcmVhZHcoZGV2LCBwcml2KGRldiktPnJ4X3RhaWwsIHJmZF90LCByZmRfbGluaywgTk9STUFMSVJRUyk7CisJCS8qIG5leHR0YWlsIHNob3VsZCBiZSByeF9oZWFkICovCisJCWlmIChuZXh0dGFpbCAhPSBwcml2KGRldiktPnJ4X2hlYWQpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWNlaXZlciBidWZmZXIgY2hhaW5pbmcgZXJyb3IgKCUwNFggIT0gJTA0WClcbiIsCisJCQkJZGV2LT5uYW1lLCBuZXh0dGFpbCwgcHJpdihkZXYpLT5yeF9oZWFkKTsKKwkJZXRoZXIxX3dyaXRldyhkZXYsIFJGRF9DTURFTCB8IFJGRF9DTURTVVNQRU5ELCBuZXh0dGFpbCwgcmZkX3QsIHJmZF9jb21tYW5kLCBOT1JNQUxJUlFTKTsKKwkJZXRoZXIxX3dyaXRldyhkZXYsIDAsIHByaXYoZGV2KS0+cnhfdGFpbCwgcmZkX3QsIHJmZF9jb21tYW5kLCBOT1JNQUxJUlFTKTsKKwkJZXRoZXIxX3dyaXRldyhkZXYsIDAsIHByaXYoZGV2KS0+cnhfdGFpbCwgcmZkX3QsIHJmZF9zdGF0dXMsIE5PUk1BTElSUVMpOworCQlldGhlcjFfd3JpdGV3KGRldiwgMCwgcHJpdihkZXYpLT5yeF90YWlsLCByZmRfdCwgcmZkX3JiZG9mZnNldCwgTk9STUFMSVJRUyk7CisJCisJCXByaXYoZGV2KS0+cnhfdGFpbCA9IG5leHR0YWlsOworCQlwcml2KGRldiktPnJ4X2hlYWQgPSBldGhlcjFfcmVhZHcoZGV2LCBwcml2KGRldiktPnJ4X2hlYWQsIHJmZF90LCByZmRfbGluaywgTk9STUFMSVJRUyk7CisJfSB3aGlsZSAoMSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorZXRoZXIxX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9zdGF0dXMsIE5PUk1BTElSUVMpOworCisJaWYgKHN0YXR1cykgeworCQlldGhlcjFfd3JpdGV3KGRldiwgc3RhdHVzICYgKFNDQl9TVFJOUiB8IFNDQl9TVENOQSB8IFNDQl9TVEZSIHwgU0NCX1NUQ1gpLAorCQkJICAgIFNDQl9BRERSLCBzY2JfdCwgc2NiX2NvbW1hbmQsIE5PUk1BTElSUVMpOworCQl3cml0ZWIoQ1RSTF9DQSB8IENUUkxfQUNLLCBSRUdfQ09OVFJPTCk7CisJCWlmIChzdGF0dXMgJiBTQ0JfU1RDWCkgeworCQkJZXRoZXIxX3htaXRfZG9uZSAoZGV2KTsKKwkJfQorCQlpZiAoc3RhdHVzICYgU0NCX1NUQ05BKSB7CisJCQlpZiAocHJpdihkZXYpLT5yZXNldHRpbmcgPT0gMCkKKwkJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IENVIHdlbnQgbm90IHJlYWR5ID8/P1xuIiwgZGV2LT5uYW1lKTsKKwkJCWVsc2UKKwkJCQlwcml2KGRldiktPnJlc2V0dGluZyArPSAxOworCQkJaWYgKGV0aGVyMV9yZWFkdyhkZXYsIFNDQl9BRERSLCBzY2JfdCwgc2NiX2NibF9vZmZzZXQsIE5PUk1BTElSUVMpCisJCQkJCSE9ICh1bnNpZ25lZCBzaG9ydClJODI1ODZfTlVMTCkgeworCQkJCWV0aGVyMV93cml0ZXcoZGV2LCBTQ0JfQ01EQ1VDU1RBUlQsIFNDQl9BRERSLCBzY2JfdCwgc2NiX2NvbW1hbmQsIE5PUk1BTElSUVMpOworCQkJCXdyaXRlYihDVFJMX0NBLCBSRUdfQ09OVFJPTCk7CisJCQl9CisJCQlpZiAocHJpdihkZXYpLT5yZXNldHRpbmcgPT0gMikKKwkJCQlwcml2KGRldiktPnJlc2V0dGluZyA9IDA7CisJCX0KKwkJaWYgKHN0YXR1cyAmIFNDQl9TVEZSKSB7CisJCQlldGhlcjFfcmVjdl9kb25lIChkZXYpOworCQl9CisJCWlmIChzdGF0dXMgJiBTQ0JfU1RSTlIpIHsKKwkJCWlmIChldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9zdGF0dXMsIE5PUk1BTElSUVMpICYgU0NCX1NUUlhTVVNQKSB7CisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBSVSB3ZW50IG5vdCByZWFkeTogUlUgc3VzcGVuZGVkXG4iLCBkZXYtPm5hbWUpOworCQkJCWV0aGVyMV93cml0ZXcoZGV2LCBTQ0JfQ01EUlhSRVNVTUUsIFNDQl9BRERSLCBzY2JfdCwgc2NiX2NvbW1hbmQsIE5PUk1BTElSUVMpOworCQkJCXdyaXRlYihDVFJMX0NBLCBSRUdfQ09OVFJPTCk7CisJCQkJcHJpdihkZXYpLT5zdGF0cy5yeF9kcm9wcGVkICsrOwkvKiB3ZSBzdXNwZW5kZWQgZHVlIHRvIGxhY2sgb2YgYnVmZmVyIHNwYWNlICovCisJCQl9IGVsc2UKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUlUgd2VudCBub3QgcmVhZHk6ICUwNFhcbiIsIGRldi0+bmFtZSwKKwkJCQkJZXRoZXIxX3JlYWR3KGRldiwgU0NCX0FERFIsIHNjYl90LCBzY2Jfc3RhdHVzLCBOT1JNQUxJUlFTKSk7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiUlUgcHRyID0gJTA0WFxuIiwgZXRoZXIxX3JlYWR3KGRldiwgU0NCX0FERFIsIHNjYl90LCBzY2JfcmZhX29mZnNldCwKKwkJCQkJCU5PUk1BTElSUVMpKTsKKwkJfQorCX0gZWxzZQorCQl3cml0ZWIoQ1RSTF9BQ0ssIFJFR19DT05UUk9MKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludAorZXRoZXIxX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWV0aGVyMV9yZXNldCAoZGV2KTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitldGhlcjFfZ2V0c3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICZwcml2KGRldiktPnN0YXRzOworfQorCisvKgorICogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgKiBudW1fYWRkcnMgPT0gLTEJUHJvbWlzY3VvdXMgbW9kZSwgcmVjZWl2ZSBhbGwgcGFja2V0cy4KKyAqIG51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdC4KKyAqIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLCBhbmQgZG8KKyAqCQkJYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCitzdGF0aWMgdm9pZAorZXRoZXIxX3NldG11bHRpY2FzdGxpc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgX19pbml0IGV0aGVyMV9iYW5uZXIodm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgaW50IHZlcnNpb25fcHJpbnRlZCA9IDA7CisKKwlpZiAobmV0X2RlYnVnICYmIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitldGhlcjFfcHJvYmUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYywgY29uc3Qgc3RydWN0IGVjYXJkX2lkICppZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpLCByZXQgPSAwOworCisJZXRoZXIxX2Jhbm5lcigpOworCisJcmV0ID0gZWNhcmRfcmVxdWVzdF9yZXNvdXJjZXMoZWMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBldGhlcjFfcHJpdikpOworCWlmICghZGV2KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gcmVsZWFzZTsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmZWMtPmRldik7CisKKwlkZXYtPmlycSA9IGVjLT5pcnE7CisJcHJpdihkZXYpLT5iYXNlID0gaW9yZW1hcChlY2FyZF9yZXNvdXJjZV9zdGFydChlYywgRUNBUkRfUkVTX0lPQ0ZBU1QpLAorCQkJCSAgZWNhcmRfcmVzb3VyY2VfbGVuKGVjLCBFQ0FSRF9SRVNfSU9DRkFTVCkpOworCWlmICghcHJpdihkZXYpLT5iYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZnJlZTsKKwl9CisKKwlpZiAoKHByaXYoZGV2KS0+YnVzX3R5cGUgPSBldGhlcjFfcmVzZXQoZGV2KSkgPT0gMCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IHJlYWRiKElEUFJPTV9BRERSRVNTICsgKGkgPDwgMikpOworCisJaWYgKGV0aGVyMV9pbml0XzIoZGV2KSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWU7CisJfQorCisJZGV2LT5vcGVuCQk9IGV0aGVyMV9vcGVuOworCWRldi0+c3RvcAkJPSBldGhlcjFfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgICAgPSBldGhlcjFfc2VuZHBhY2tldDsKKwlkZXYtPmdldF9zdGF0cwkJPSBldGhlcjFfZ2V0c3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBldGhlcjFfc2V0bXVsdGljYXN0bGlzdDsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gZXRoZXIxX3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IDUgKiBIWiAvIDEwMDsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZnJlZTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBldGhlcjEgaW4gc2xvdCAlZCwgIiwKKwkJZGV2LT5uYW1lLCBlYy0+c2xvdF9ubyk7CisgICAgCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrICgiJTIuMnglYyIsIGRldi0+ZGV2X2FkZHJbaV0sIGkgPT0gNSA/ICdcbicgOiAnOicpOworCisJZWNhcmRfc2V0X2RydmRhdGEoZWMsIGRldik7CisJcmV0dXJuIDA7CisKKyBmcmVlOgorCWlmIChwcml2KGRldiktPmJhc2UpCisJCWlvdW5tYXAocHJpdihkZXYpLT5iYXNlKTsKKwlmcmVlX25ldGRldihkZXYpOworIHJlbGVhc2U6CisJZWNhcmRfcmVsZWFzZV9yZXNvdXJjZXMoZWMpOworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZXRoZXIxX3JlbW92ZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisKKwllY2FyZF9zZXRfZHJ2ZGF0YShlYywgTlVMTCk7CQorCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpb3VubWFwKHByaXYoZGV2KS0+YmFzZSk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwllY2FyZF9yZWxlYXNlX3Jlc291cmNlcyhlYyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWNhcmRfaWQgZXRoZXIxX2lkc1tdID0geworCXsgTUFOVV9BQ09STiwgUFJPRF9BQ09STl9FVEhFUjEgfSwKKwl7IDB4ZmZmZiwgMHhmZmZmIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZWNhcmRfZHJpdmVyIGV0aGVyMV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGV0aGVyMV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGV0aGVyMV9yZW1vdmUpLAorCS5pZF90YWJsZQk9IGV0aGVyMV9pZHMsCisJLmRydiA9IHsKKwkJLm5hbWUJPSAiZXRoZXIxIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZXRoZXIxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZWNhcmRfcmVnaXN0ZXJfZHJpdmVyKCZldGhlcjFfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV0aGVyMV9leGl0KHZvaWQpCit7CisJZWNhcmRfcmVtb3ZlX2RyaXZlcigmZXRoZXIxX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGV0aGVyMV9pbml0KTsKK21vZHVsZV9leGl0KGV0aGVyMV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyMS5oIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YTRiMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXIxLmgKQEAgLTAsMCArMSwyODEgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9hY29ybi9uZXQvZXRoZXIxLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk2IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIE5ldHdvcmsgZHJpdmVyIGZvciBBY29ybiBFdGhlcjEgY2FyZHMuCisgKi8KKworI2lmbmRlZiBfTElOVVhfZXRoZXIxX0gKKyNkZWZpbmUgX0xJTlVYX2V0aGVyMV9ICisKKyNpZmRlZiBfX0VUSEVSMV9DCisvKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcgKi8KKyNpZm5kZWYgTkVUX0RFQlVHCisjZGVmaW5lIE5FVF9ERUJVRyAwCisjZW5kaWYKKworI2RlZmluZSBwcml2KGRldikJKChzdHJ1Y3QgZXRoZXIxX3ByaXYgKiluZXRkZXZfcHJpdihkZXYpKQorCisvKiBQYWdlIHJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19QQUdFCShwcml2KGRldiktPmJhc2UgKyAweDAwMDApCisKKy8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX0NPTlRST0wJKHByaXYoZGV2KS0+YmFzZSArIDB4MDAwNCkKKyNkZWZpbmUgQ1RSTF9SU1QJMHgwMQorI2RlZmluZSBDVFJMX0xPT1BCQUNLCTB4MDIKKyNkZWZpbmUgQ1RSTF9DQQkJMHgwNAorI2RlZmluZSBDVFJMX0FDSwkweDA4CisKKyNkZWZpbmUgRVRIRVIxX1JBTQkocHJpdihkZXYpLT5iYXNlICsgMHgyMDAwKQorCisvKiBIVyBhZGRyZXNzICovCisjZGVmaW5lIElEUFJPTV9BRERSRVNTCShwcml2KGRldiktPmJhc2UgKyAweDAwMjQpCisKK3N0cnVjdCBldGhlcjFfcHJpdiB7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXVuc2lnbmVkIGludCB0eF9saW5rOworCXVuc2lnbmVkIGludCB0eF9oZWFkOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB0eF90YWlsOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCByeF9oZWFkOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCByeF90YWlsOworCXVuc2lnbmVkIGNoYXIgYnVzX3R5cGU7CisJdW5zaWduZWQgY2hhciByZXNldHRpbmc7CisJdW5zaWduZWQgY2hhciBpbml0aWFsaXNpbmcgOiAxOworCXVuc2lnbmVkIGNoYXIgcmVzdGFydCAgICAgIDogMTsKK307CisKKyNkZWZpbmUgSTgyNTg2X05VTEwgKC0xKQorCit0eXBlZGVmIHN0cnVjdCB7IC8qIHRkciAqLworCXVuc2lnbmVkIHNob3J0IHRkcl9zdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgdGRyX2NvbW1hbmQ7CisJdW5zaWduZWQgc2hvcnQgdGRyX2xpbms7CisJdW5zaWduZWQgc2hvcnQgdGRyX3Jlc3VsdDsKKyNkZWZpbmUgVERSX1RJTUUJKDB4N2ZmKQorI2RlZmluZSBURFJfU0hPUlQJKDEgPDwgMTIpCisjZGVmaW5lIFREUl9PUEVOCSgxIDw8IDEzKQorI2RlZmluZSBURFJfWENWUlBST0IJKDEgPDwgMTQpCisjZGVmaW5lIFREUl9MTktPSwkoMSA8PCAxNSkKK30gdGRyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsgLyogdHJhbnNtaXQgKi8KKwl1bnNpZ25lZCBzaG9ydCB0eF9zdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgdHhfY29tbWFuZDsKKwl1bnNpZ25lZCBzaG9ydCB0eF9saW5rOworCXVuc2lnbmVkIHNob3J0IHR4X3RiZG9mZnNldDsKK30gdHhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeyAvKiB0YmQgKi8KKwl1bnNpZ25lZCBzaG9ydCB0YmRfb3B0czsKKyNkZWZpbmUgVEJEX0NOVAkJKDB4M2ZmZikKKyNkZWZpbmUgVEJEX0VPTAkJKDEgPDwgMTUpCisJdW5zaWduZWQgc2hvcnQgdGJkX2xpbms7CisJdW5zaWduZWQgc2hvcnQgdGJkX2J1Zmw7CisJdW5zaWduZWQgc2hvcnQgdGJkX2J1Zmg7Cit9IHRiZF90OworCit0eXBlZGVmIHN0cnVjdCB7IC8qIHJmZCAqLworCXVuc2lnbmVkIHNob3J0IHJmZF9zdGF0dXM7CisjZGVmaW5lIFJGRF9OT0VPRgkoMSA8PCA2KQorI2RlZmluZSBSRkRfRlJBTUVTSE9SVAkoMSA8PCA3KQorI2RlZmluZSBSRkRfRE1BT1ZSTgkoMSA8PCA4KQorI2RlZmluZSBSRkRfTk9SRVNPVVJDRVMJKDEgPDwgOSkKKyNkZWZpbmUgUkZEX0FMSUdORVJST1IJKDEgPDwgMTApCisjZGVmaW5lIFJGRF9DUkNFUlJPUgkoMSA8PCAxMSkKKyNkZWZpbmUgUkZEX09LCQkoMSA8PCAxMykKKyNkZWZpbmUgUkZEX0ZEQ09OU1VNRUQJKDEgPDwgMTQpCisjZGVmaW5lIFJGRF9DT01QTEVURQkoMSA8PCAxNSkKKwl1bnNpZ25lZCBzaG9ydCByZmRfY29tbWFuZDsKKyNkZWZpbmUgUkZEX0NNRFNVU1BFTkQJKDEgPDwgMTQpCisjZGVmaW5lIFJGRF9DTURFTAkoMSA8PCAxNSkKKwl1bnNpZ25lZCBzaG9ydCByZmRfbGluazsKKwl1bnNpZ25lZCBzaG9ydCByZmRfcmJkb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgIHJmZF9kZXN0WzZdOworCXVuc2lnbmVkIGNoYXIgIHJmZF9zcmNbNl07CisJdW5zaWduZWQgc2hvcnQgcmZkX2xlbjsKK30gcmZkX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsgLyogcmJkICovCisJdW5zaWduZWQgc2hvcnQgcmJkX3N0YXR1czsKKyNkZWZpbmUgUkJEX0FDTlQJKDB4M2ZmZikKKyNkZWZpbmUgUkJEX0FDTlRWQUxJRAkoMSA8PCAxNCkKKyNkZWZpbmUgUkJEX0VPRgkJKDEgPDwgMTUpCisJdW5zaWduZWQgc2hvcnQgcmJkX2xpbms7CisJdW5zaWduZWQgc2hvcnQgcmJkX2J1Zmw7CisJdW5zaWduZWQgc2hvcnQgcmJkX2J1Zmg7CisJdW5zaWduZWQgc2hvcnQgcmJkX2xlbjsKK30gcmJkX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsgLyogbm9wICovCisJdW5zaWduZWQgc2hvcnQgbm9wX3N0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBub3BfY29tbWFuZDsKKwl1bnNpZ25lZCBzaG9ydCBub3BfbGluazsKK30gbm9wX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsgLyogc2V0IG11bHRpY2FzdCAqLworCXVuc2lnbmVkIHNob3J0IG1jX3N0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBtY19jb21tYW5kOworCXVuc2lnbmVkIHNob3J0IG1jX2xpbms7CisJdW5zaWduZWQgc2hvcnQgbWNfY250OworCXVuc2lnbmVkIGNoYXIgIG1jX2FkZHJzWzFdWzZdOworfSBtY190OworCit0eXBlZGVmIHN0cnVjdCB7IC8qIHNldCBhZGRyZXNzICovCisJdW5zaWduZWQgc2hvcnQgc2Ffc3RhdHVzOworCXVuc2lnbmVkIHNob3J0IHNhX2NvbW1hbmQ7CisJdW5zaWduZWQgc2hvcnQgc2FfbGluazsKKwl1bnNpZ25lZCBjaGFyICBzYV9hZGRyWzZdOworfSBzYV90OworCit0eXBlZGVmIHN0cnVjdCB7IC8qIGNvbmZpZyBjb21tYW5kICovCisJdW5zaWduZWQgc2hvcnQgY2ZnX3N0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBjZmdfY29tbWFuZDsKKwl1bnNpZ25lZCBzaG9ydCBjZmdfbGluazsKKwl1bnNpZ25lZCBjaGFyICBjZmdfYnl0ZWNudDsJLyogc2l6ZSBmb2xsIGRhdGE6IDQgLSAxMgkJICovCisJdW5zaWduZWQgY2hhciAgY2ZnX2ZpZm9saW07CS8qIEZJRk8gdGhyZXNob2xkCQkJICovCisJdW5zaWduZWQgY2hhciAgY2ZnX2J5dGU4OworI2RlZmluZSBDRkc4X1NSRFkJKDEgPDwgNikKKyNkZWZpbmUgQ0ZHOF9TQVZFQkFERgkoMSA8PCA3KQorCXVuc2lnbmVkIGNoYXIgIGNmZ19ieXRlOTsKKyNkZWZpbmUgQ0ZHOV9BRERSTEVOKHgpCSh4KQorI2RlZmluZSBDRkc5X0FERFJMRU5CVUYJKDEgPDwgMykKKyNkZWZpbmUgQ0ZHOV9QUkVBTUIyCSgwIDw8IDQpCisjZGVmaW5lIENGRzlfUFJFQU1CNAkoMSA8PCA0KQorI2RlZmluZSBDRkc5X1BSRUFNQjgJKDIgPDwgNCkKKyNkZWZpbmUgQ0ZHOV9QUkVBTUIxNgkoMyA8PCA0KQorI2RlZmluZSBDRkc5X0lMT09QQkFDSwkoMSA8PCA2KQorI2RlZmluZSBDRkc5X0VMT09QQkFDSwkoMSA8PCA3KQorCXVuc2lnbmVkIGNoYXIgIGNmZ19ieXRlMTA7CisjZGVmaW5lIENGRzEwX0xJTlBSSSh4KQkoeCkKKyNkZWZpbmUgQ0ZHMTBfQUNSKHgpCSh4IDw8IDQpCisjZGVmaW5lIENGRzEwX0JPRk1FVAkoMSA8PCA3KQorCXVuc2lnbmVkIGNoYXIgIGNmZ19pZnM7CisJdW5zaWduZWQgY2hhciAgY2ZnX3Nsb3RsOworCXVuc2lnbmVkIGNoYXIgIGNmZ19ieXRlMTM7CisjZGVmaW5lIENGRzEzX1NMT1RIKHgpCSh4KQorI2RlZmluZSBDRkcxM19SRVRSWSh4KQkoeCA8PCA0KQorCXVuc2lnbmVkIGNoYXIgIGNmZ19ieXRlMTQ7CisjZGVmaW5lIENGRzE0X1BST01JU0MJKDEgPDwgMCkKKyNkZWZpbmUgQ0ZHMTRfRElTQlJECSgxIDw8IDEpCisjZGVmaW5lIENGRzE0X01BTkNICSgxIDw8IDIpCisjZGVmaW5lIENGRzE0X1ROQ1JTCSgxIDw8IDMpCisjZGVmaW5lIENGRzE0X05PQ1JDCSgxIDw8IDQpCisjZGVmaW5lIENGRzE0X0NSQzE2CSgxIDw8IDUpCisjZGVmaW5lIENGRzE0X0JUU1RGCSgxIDw8IDYpCisjZGVmaW5lIENGRzE0X0ZMR1BBRAkoMSA8PCA3KQorCXVuc2lnbmVkIGNoYXIgIGNmZ19ieXRlMTU7CisjZGVmaW5lIENGRzE1X0NTVEYoeCkJKHgpCisjZGVmaW5lIENGRzE1X0lDU1MJKDEgPDwgMykKKyNkZWZpbmUgQ0ZHMTVfQ0RURih4KQkoeCA8PCA0KQorI2RlZmluZSBDRkcxNV9JQ0RTCSgxIDw8IDcpCisJdW5zaWduZWQgc2hvcnQgY2ZnX21pbmZybWxlbjsKK30gY2ZnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsgLyogc2NiICovCisJdW5zaWduZWQgc2hvcnQgc2NiX3N0YXR1czsJLyogc3RhdHVzIG9mIDgyNTg2CQkJKi8KKyNkZWZpbmUgU0NCX1NUUlhNQVNLCQkoNyA8PCA0KQkvKiBSZWNlaXZlIHVuaXQgc3RhdHVzCQkqLworI2RlZmluZSBTQ0JfU1RSWElETEUJCSgwIDw8IDQpCS8qIElkbGUJCQkJKi8KKyNkZWZpbmUgU0NCX1NUUlhTVVNQCQkoMSA8PCA0KQkvKiBTdXNwZW5kZWQJCQkqLworI2RlZmluZSBTQ0JfU1RSWE5SRVMJCSgyIDw8IDQpCS8qIE5vIHJlc291cmNlcwkJCSovCisjZGVmaW5lIFNDQl9TVFJYUkRZCQkoNCA8PCA0KQkvKiBSZWFkeQkJCSovCisjZGVmaW5lIFNDQl9TVENVTUFTSwkJKDcgPDwgOCkJLyogQ29tbWFuZCB1bml0IHN0YXR1cwkJKi8KKyNkZWZpbmUgU0NCX1NUQ1VJRExFCQkoMCA8PCA4KQkvKiBJZGxlCQkJCSovCisjZGVmaW5lIFNDQl9TVENVU1VTUAkJKDEgPDwgOCkJLyogU3VzcGVuZGVkCQkJKi8KKyNkZWZpbmUgU0NCX1NUQ1VBQ1RWCQkoMiA8PCA4KQkvKiBBY3RpdmUJCQkqLworI2RlZmluZSBTQ0JfU1RSTlIJCSgxIDw8IDEyKQkvKiBSZWNlaXZlIHVuaXQgbm90IHJlYWR5CSovCisjZGVmaW5lIFNDQl9TVENOQQkJKDEgPDwgMTMpCS8qIENvbW1hbmQgdW5pdCBub3QgcmVhZHkJKi8KKyNkZWZpbmUgU0NCX1NURlIJCSgxIDw8IDE0KQkvKiBGcmFtZSByZWNlaXZlZAkJKi8KKyNkZWZpbmUgU0NCX1NUQ1gJCSgxIDw8IDE1KQkvKiBDb21tYW5kIGNvbXBsZXRlZAkJKi8KKwl1bnNpZ25lZCBzaG9ydCBzY2JfY29tbWFuZDsJLyogTmV4dCBjb21tYW5kCQkJCSovCisjZGVmaW5lIFNDQl9DTURSWFNUQVJUCQkoMSA8PCA0KQkvKiBTdGFydCAoYXQgcmZhX29mZnNldCkJKi8KKyNkZWZpbmUgU0NCX0NNRFJYUkVTVU1FCQkoMiA8PCA0KQkvKiBSZXN1bWUgcmVjZXB0aW9uCQkqLworI2RlZmluZSBTQ0JfQ01EUlhTVVNQRU5ECSgzIDw8IDQpCS8qIFN1c3BlbmQgcmVjZXB0aW9uCQkqLworI2RlZmluZSBTQ0JfQ01EUlhBQk9SVAkJKDQgPDwgNCkJLyogQWJvcnQgcmVjZXB0aW9uCQkqLworI2RlZmluZSBTQ0JfQ01EQ1VDU1RBUlQJCSgxIDw8IDgpCS8qIFN0YXJ0IChhdCBjYmxfb2Zmc2V0KQkqLworI2RlZmluZSBTQ0JfQ01EQ1VDUkVTVU1FCSgyIDw8IDgpCS8qIFJlc3VtZSBleGVjdXRpb24JCSovCisjZGVmaW5lIFNDQl9DTURDVUNTVVNQRU5ECSgzIDw8IDgpCS8qIFN1c3BlbmQgZXhlY3V0aW9uCQkqLworI2RlZmluZSBTQ0JfQ01EQ1VDQUJPUlQJCSg0IDw8IDgpCS8qIEFib3J0IGV4ZWN1dGlvbgkJKi8KKyNkZWZpbmUgU0NCX0NNREFDS1JOUgkJKDEgPDwgMTIpCS8qIEFjayBSVSBub3QgcmVhZHkJCSovCisjZGVmaW5lIFNDQl9DTURBQ0tDTkEJCSgxIDw8IDEzKQkvKiBBY2sgQ1Ugbm90IHJlYWR5CQkqLworI2RlZmluZSBTQ0JfQ01EQUNLRlIJCSgxIDw8IDE0KQkvKiBBY2sgRnJhbWUgcmVjZWl2ZWQJCSovCisjZGVmaW5lIFNDQl9DTURBQ0tDWAkJKDEgPDwgMTUpCS8qIEFjayBDb21tYW5kIGNvbXBsZXRlCQkqLworCXVuc2lnbmVkIHNob3J0IHNjYl9jYmxfb2Zmc2V0OwkvKiBPZmZzZXQgb2YgZmlyc3QgY29tbWFuZCB1bml0CQkqLworCXVuc2lnbmVkIHNob3J0IHNjYl9yZmFfb2Zmc2V0OwkvKiBPZmZzZXQgb2YgZmlyc3QgcmVjZWl2ZSBmcmFtZSBhcmVhCSovCisJdW5zaWduZWQgc2hvcnQgc2NiX2NyY19lcnJvcnM7CS8qIFByb3Blcmx5IGFsaWduZWQgZnJhbWUgd2l0aCBDUkMgZXJyb3IqLworCXVuc2lnbmVkIHNob3J0IHNjYl9hbG5fZXJyb3JzOwkvKiBNaXNhbGlnbmVkIGZyYW1lcwkJCSovCisJdW5zaWduZWQgc2hvcnQgc2NiX3JzY19lcnJvcnM7CS8qIEZyYW1lcyBsb3N0IGR1ZSB0byBubyBzcGFjZQkJKi8KKwl1bnNpZ25lZCBzaG9ydCBzY2Jfb3ZuX2Vycm9yczsJLyogRnJhbWVzIGxvc3QgZHVlIHRvIHNsb3cgYnVzCQkqLworfSBzY2JfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeyAvKiBpc2NwICovCisJdW5zaWduZWQgc2hvcnQgaXNjcF9idXN5OwkvKiBzZXQgYnkgQ1BVIGJlZm9yZSBDQQkJCSovCisJdW5zaWduZWQgc2hvcnQgaXNjcF9vZmZzZXQ7CS8qIG9mZnNldCBvZiBTQ0IJCQkqLworCXVuc2lnbmVkIHNob3J0IGlzY3BfYmFzZWw7CS8qIGJhc2Ugb2YgU0NCCQkJCSovCisJdW5zaWduZWQgc2hvcnQgaXNjcF9iYXNlaDsKK30gaXNjcF90OworCisgICAgLyogdGhpcyBhZGRyZXNzIG11c3QgYmUgMHhmZmY2ICovCit0eXBlZGVmIHN0cnVjdCB7IC8qIHNjcCAqLworCXVuc2lnbmVkIHNob3J0IHNjcF9zeXNidXM7CS8qIGJ1cyBzaXplICovCisjZGVmaW5lIFNDUF9TWV8xNkJCVVMJMHgwMAorI2RlZmluZSBTQ1BfU1lfOEJCVVMJMHgwMQorCXVuc2lnbmVkIHNob3J0IHNjcF9qdW5rWzJdOwkvKiBqdW5rICovCisJdW5zaWduZWQgc2hvcnQgc2NwX2lzY3BsOwkvKiBsb3dlciAxNiBiaXRzIG9mIGlzY3AgKi8KKwl1bnNpZ25lZCBzaG9ydCBzY3BfaXNjcGg7CS8qIHVwcGVyIDE2IGJpdHMgb2YgaXNjcCAqLworfSBzY3BfdDsKKworLyogY29tbWFuZHMgKi8KKyNkZWZpbmUgQ01EX05PUAkJCTAKKyNkZWZpbmUgQ01EX1NFVEFERFJFU1MJCTEKKyNkZWZpbmUgQ01EX0NPTkZJRwkJMgorI2RlZmluZSBDTURfU0VUTVVMVElDQVNUCTMKKyNkZWZpbmUgQ01EX1RYCQkJNAorI2RlZmluZSBDTURfVERSCQkJNQorI2RlZmluZSBDTURfRFVNUAkJNgorI2RlZmluZSBDTURfRElBR05PU0UJCTcKKworI2RlZmluZSBDTURfTUFTSwkJNworCisjZGVmaW5lIENNRF9JTlRSCQkoMSA8PCAxMykKKyNkZWZpbmUgQ01EX1NVU1AJCSgxIDw8IDE0KQorI2RlZmluZSBDTURfRU9MCQkJKDEgPDwgMTUpCisKKyNkZWZpbmUgU1RBVF9DT0xMSVNJT05TCQkoMTUpCisjZGVmaW5lIFNUQVRfQ09MTEVYQ0VTU0lWRQkoMSA8PCA1KQorI2RlZmluZSBTVEFUX0NPTExBRlRFUlRYCSgxIDw8IDYpCisjZGVmaW5lIFNUQVRfVFhERUZFUlJFRAkJKDEgPDwgNykKKyNkZWZpbmUgU1RBVF9UWFNMT1dETUEJCSgxIDw8IDgpCisjZGVmaW5lIFNUQVRfVFhMT1NUQ1RTCQkoMSA8PCA5KQorI2RlZmluZSBTVEFUX05PQ0FSUklFUgkJKDEgPDwgMTApCisjZGVmaW5lIFNUQVRfRkFJTAkJKDEgPDwgMTEpCisjZGVmaW5lIFNUQVRfQUJPUlRFRAkJKDEgPDwgMTIpCisjZGVmaW5lIFNUQVRfT0sJCQkoMSA8PCAxMykKKyNkZWZpbmUgU1RBVF9CVVNZCQkoMSA8PCAxNCkKKyNkZWZpbmUgU1RBVF9DT01QTEVURQkJKDEgPDwgMTUpCisjZW5kaWYKKyNlbmRpZgorCisvKgorICogRXRoZXIxIGNhcmQgZGVmaW5pdGlvbnM6CisgKgorICogRkFTVCBhY2Nlc3NlczoKKyAqCSswCVBhZ2UgcmVnaXN0ZXIKKyAqIAkJCTE2IHBhZ2VzCisgKgkrNAlDb250cm9sCisgKgkJCScxJyA9IHJlc2V0CisgKgkJCScyJyA9IGxvb3BiYWNrCisgKgkJCSc0JyA9IENBCisgKgkJCSc4JyA9IGludCBhY2sKKyAqCisgKiBSQU0gYXQgYWRkcmVzcyArIDB4MjAwMAorICogUG9kLiBQcm9kIGlkID0gMworICogV29yZHMgYWZ0ZXIgSUQgYmxvY2sgW2Jhc2UgKyA4IHdvcmRzXQorICoJKzAgcGNiIGlzc3VlICgweDBjIGFuZCAweGYzIGludmFsaWQpCisgKgkrMSAtICs2IGV0aCBodyBhZGRyZXNzCisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9ldGhlcjMuYyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2M1M2FiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyMy5jCkBAIC0wLDAgKzEsOTM2IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvYWNvcm4vbmV0L2V0aGVyMy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogU0VFUSBucTgwMDUgZXRoZXJuZXQgZHJpdmVyIGZvciBBY29ybi9BTlQgRXRoZXIzIGNhcmQKKyAqICBmb3IgQWNvcm4gbWFjaGluZXMKKyAqCisgKiBCeSBSdXNzZWxsIEtpbmcsIHdpdGggc29tZSBzdWdnZXN0aW9ucyBmcm9tIGJvcnJpc0BhbnQuY28udWsKKyAqCisgKiBDaGFuZ2Vsb2c6CisgKiAxLjA0CVJNSwkyOS8wMi8xOTk2CVdvbid0IHBhc3MgcGFja2V0cyB0aGF0IGFyZSBmcm9tIG91ciBldGhlcm5ldAorICoJCQkJYWRkcmVzcyB1cCB0byB0aGUgaGlnaGVyIGxldmVscyAtIHRoZXkncmUKKyAqCQkJCXNpbGVudGx5IGlnbm9yZWQuICBJL0YgY2FuIG5vdyBiZSBwdXQgaW50bworICoJCQkJbXVsdGljYXN0IG1vZGUuICBSZWNlaXZlciByb3V0aW5lIG9wdGltaXNlZC4KKyAqIDEuMDUJUk1LCTMwLzAyLzE5OTYJTm93IGNsYWltcyBpbnRlcnJ1cHQgYXQgb3BlbiB3aGVuIHBhcnQgb2YKKyAqCQkJCXRoZSBrZXJuZWwgcmF0aGVyIHRoYW4gd2hlbiBhIG1vZHVsZS4KKyAqIDEuMDYJUk1LCTAyLzAzLzE5OTYJVmFyaW91cyBjb2RlIGNsZWFudXBzCisgKiAxLjA3CVJNSwkxMy8xMC8xOTk2CU9wdGltaXNlZCBpbnRlcnJ1cHQgcm91dGluZSBhbmQgdHJhbnNtaXQKKyAqCQkJCXJvdXRpbmVzLgorICogMS4wOAlSTUsJMTQvMTAvMTk5NglGaXhlZCBwcm9ibGVtIHdpdGggdG9vIG1hbnkgcGFja2V0cywKKyAqCQkJCXByZXZlbnRlZCB0aGUga2VybmVsIG1lc3NhZ2UgYWJvdXQgZHJvcHBlZAorICoJCQkJcGFja2V0cyBhcHBlYXJpbmcgdG9vIG1hbnkgdGltZXMgYSBzZWNvbmQuCisgKgkJCQlOb3cgZG9lcyBub3QgZGlzYWJsZSBhbGwgSVJRcywgb25seSB0aGUgSVJRCisgKgkJCQl1c2VkIGJ5IHRoaXMgY2FyZC4KKyAqIDEuMDkJUk1LCTEwLzExLzE5OTYJT25seSBlbmFibGVzIFRYIGlycSB3aGVuIGJ1ZmZlciBzcGFjZSBpcyBsb3csCisgKgkJCQlidXQgd2Ugc3RpbGwgc2VydmljZSB0aGUgVFggcXVldWUgaWYgd2UgZ2V0IGEKKyAqCQkJCVJYIGludGVycnVwdC4KKyAqIDEuMTAJUk1LCTE1LzA3LzE5OTcJRml4ZWQgYXV0b3Byb2Jpbmcgb2YgTlE4MDA0LgorICogMS4xMQlSTUsJMTYvMTEvMTk5NwlGaXhlZCBhdXRvcHJvYmluZyBvZiBOUTgwMDVBLgorICogMS4xMglSTUsJMzEvMTIvMTk5NwlSZW1vdmVkIHJlZmVyZW5jZSB0byBkZXZfdGludCBmb3IgTGludXggMi4xLgorICogICAgICBSTUsJMjcvMDYvMTk5OAlDaGFuZ2VkIGFzbS9kZWxheS5oIHRvIGxpbnV4L2RlbGF5LmguCisgKiAxLjEzCVJNSwkyOS8wNi8xOTk4CUZpeGVkIHByb2JsZW0gd2l0aCB0cmFuc21pc3Npb24gb2YgcGFja2V0cy4KKyAqCQkJCUNoaXAgc2VlbXMgdG8gaGF2ZSBhIGJ1ZyBpbiwgd2hlcmVieSBpZiB0aGUKKyAqCQkJCXBhY2tldCBzdGFydHMgdHdvIGJ5dGVzIGZyb20gdGhlIGVuZCBvZiB0aGUKKyAqCQkJCWJ1ZmZlciwgaXQgY29ycnVwdHMgdGhlIHJlY2VpdmVyIGNoYWluLCBhbmQKKyAqCQkJCW5ldmVyIHVwZGF0ZXMgdGhlIHRyYW5zbWl0IHN0YXR1cyBjb3JyZWN0bHkuCisgKiAxLjE0CVJNSwkwNy8wMS8xOTk4CUFkZGVkIGluaXRpYWwgY29kZSBmb3IgRVRIRVJCIGFkZHJlc3NpbmcuCisgKiAxLjE1CVJNSwkzMC8wNC8xOTk5CU1vcmUgZml4ZXMgdG8gdGhlIHRyYW5zbWl0IHJvdXRpbmUgZm9yIGJ1Z2d5CisgKgkJCQloYXJkd2FyZS4KKyAqIDEuMTYJUk1LCTEwLzAyLzIwMDAJVXBkYXRlZCBmb3IgMi4zLjQzCisgKiAxLjE3CVJNSwkxMy8wNS8yMDAwCVVwZGF0ZWQgZm9yIDIuMy45OS1wcmU4CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vZWNhcmQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gImV0aGVyMyBldGhlcm5ldCBkcml2ZXIgKGMpIDE5OTUtMjAwMCBSLk0uS2luZyB2MS4xN1xuIjsKKworI2luY2x1ZGUgImV0aGVyMy5oIgorCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldF9kZWJ1ZyA9IE5FVF9ERUJVRzsKKworc3RhdGljIHZvaWQJZXRoZXIzX3NldG11bHRpY2FzdGxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CWV0aGVyM19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbWF4Y250KTsKK3N0YXRpYyB2b2lkCWV0aGVyM190eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJZXRoZXIzX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAlldGhlcjNfc2VuZHBhY2tldCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZXRoZXIzX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50CWV0aGVyM19jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmV0aGVyM19nZXRzdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAlldGhlcjNfc2V0bXVsdGljYXN0bGlzdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAlldGhlcjNfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworI2RlZmluZSBCVVNfMTYJCTIKKyNkZWZpbmUgQlVTXzgJCTEKKyNkZWZpbmUgQlVTX1VOS05PV04JMAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordHlwZWRlZiBlbnVtIHsKKwlidWZmZXJfd3JpdGUsCisJYnVmZmVyX3JlYWQKK30gYnVmZmVyX3J3X3Q7CisKKy8qCisgKiBldGhlcjMgcmVhZC93cml0ZS4gIFNsb3cgdGhpbmdzIGRvd24gYSBiaXQuLi4KKyAqIFRoZSBTRUVRODAwNSBkb2Vzbid0IGxpa2UgdXMgd3JpdGluZyB0byBpdHMgcmVnaXN0ZXJzCisgKiB0b28gcXVpY2tseS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGV0aGVyM19vdXRiKGludCB2LCBjb25zdCB2b2lkIF9faW9tZW0gKnIpCit7CisJd3JpdGViKHYsIHIpOworCXVkZWxheSgxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV0aGVyM19vdXR3KGludCB2LCBjb25zdCB2b2lkIF9faW9tZW0gKnIpCit7CisJd3JpdGV3KHYsIHIpOworCXVkZWxheSgxKTsKK30KKyNkZWZpbmUgZXRoZXIzX2luYihyKQkJKHsgdW5zaWduZWQgaW50IF9fdiA9IHJlYWRiKChyKSk7IHVkZWxheSgxKTsgX192OyB9KQorI2RlZmluZSBldGhlcjNfaW53KHIpCQkoeyB1bnNpZ25lZCBpbnQgX192ID0gcmVhZHcoKHIpKTsgdWRlbGF5KDEpOyBfX3Y7IH0pCisKK3N0YXRpYyBpbnQKK2V0aGVyM19zZXRidWZmZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYnVmZmVyX3J3X3QgcmVhZCwgaW50IHN0YXJ0KQoreworCWludCB0aW1lb3V0ID0gMTAwMDsKKworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb25maWcxIHwgQ0ZHMV9MT0NCVUZNRU0sIFJFR19DT05GSUcxKTsKKwlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29tbWFuZCB8IENNRF9GSUZPV1JJVEUsIFJFR19DT01NQU5EKTsKKworCXdoaWxlICgoZXRoZXIzX2ludyhSRUdfU1RBVFVTKSAmIFNUQVRfRklGT0VNUFRZKSA9PSAwKSB7CisJCWlmICghdGltZW91dC0tKSB7CisJCQlwcmludGsoIiVzOiBzZXRidWZmZXIgYnJva2VuXG4iLCBkZXYtPm5hbWUpOworCQkJcHJpdihkZXYpLT5icm9rZW4gPSAxOworCQkJcmV0dXJuIDE7CisJCX0KKwkJdWRlbGF5KDEpOworCX0KKworCWlmIChyZWFkID09IGJ1ZmZlcl9yZWFkKSB7CisJCWV0aGVyM19vdXR3KHN0YXJ0LCBSRUdfRE1BQUREUik7CisJCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb21tYW5kIHwgQ01EX0ZJRk9SRUFELCBSRUdfQ09NTUFORCk7CisJfSBlbHNlIHsKKwkJZXRoZXIzX291dHcocHJpdihkZXYpLT5yZWdzLmNvbW1hbmQgfCBDTURfRklGT1dSSVRFLCBSRUdfQ09NTUFORCk7CisJCWV0aGVyM19vdXR3KHN0YXJ0LCBSRUdfRE1BQUREUik7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogd3JpdGUgZGF0YSB0byB0aGUgYnVmZmVyIG1lbW9yeQorICovCisjZGVmaW5lIGV0aGVyM193cml0ZWJ1ZmZlcihkZXYsZGF0YSxsZW5ndGgpCQkJXAorCXdyaXRlc3coUkVHX0JVRldJTiwgKGRhdGEpLCAobGVuZ3RoKSA+PiAxKQorCisjZGVmaW5lIGV0aGVyM193cml0ZXdvcmQoZGV2LGRhdGEpCQkJCVwKKwl3cml0ZXcoKGRhdGEpLCBSRUdfQlVGV0lOKQorCisjZGVmaW5lIGV0aGVyM193cml0ZWxvbmcoZGV2LGRhdGEpCXsJCQlcCisJdm9pZCBfX2lvbWVtICpyZWdfYnVmd2luID0gUkVHX0JVRldJTjsJCQlcCisJd3JpdGV3KChkYXRhKSwgcmVnX2J1Zndpbik7CQkJCVwKKwl3cml0ZXcoKGRhdGEpID4+IDE2LCByZWdfYnVmd2luKTsJCQlcCit9CisKKy8qCisgKiByZWFkIGRhdGEgZnJvbSB0aGUgYnVmZmVyIG1lbW9yeQorICovCisjZGVmaW5lIGV0aGVyM19yZWFkYnVmZmVyKGRldixkYXRhLGxlbmd0aCkJCQlcCisJcmVhZHN3KFJFR19CVUZXSU4sIChkYXRhKSwgKGxlbmd0aCkgPj4gMSkKKworI2RlZmluZSBldGhlcjNfcmVhZHdvcmQoZGV2KQkJCQkJXAorCXJlYWR3KFJFR19CVUZXSU4pCisKKyNkZWZpbmUgZXRoZXIzX3JlYWRsb25nKGRldikJIAkJCQlcCisJcmVhZHcoUkVHX0JVRldJTikgfCAocmVhZHcoUkVHX0JVRldJTikgPDwgMTYpCisKKy8qCisgKiBTd2l0Y2ggTEVEIG9mZi4uLgorICovCitzdGF0aWMgdm9pZCBldGhlcjNfbGVkb2ZmKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29uZmlnMiB8PSBDRkcyX0NUUkxPLCBSRUdfQ09ORklHMik7Cit9CisKKy8qCisgKiBzd2l0Y2ggTEVEIG9uLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBldGhlcjNfbGVkb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkZWxfdGltZXIoJnByaXYoZGV2KS0+dGltZXIpOworCXByaXYoZGV2KS0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAvIDUwOyAvKiBsZWF2ZSBvbiBmb3IgMS81MHRoIHNlY29uZCAqLworCXByaXYoZGV2KS0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlwcml2KGRldiktPnRpbWVyLmZ1bmN0aW9uID0gZXRoZXIzX2xlZG9mZjsKKwlhZGRfdGltZXIoJnByaXYoZGV2KS0+dGltZXIpOworCWlmIChwcml2KGRldiktPnJlZ3MuY29uZmlnMiAmIENGRzJfQ1RSTE8pCisJCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb25maWcyICY9IH5DRkcyX0NUUkxPLCBSRUdfQ09ORklHMik7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBldGhlcm5ldCBhZGRyZXNzIHN0cmluZyBmcm9tIHRoZSBvbiBib2FyZCByb20uCisgKiBUaGlzIGlzIGFuIGFzY2lpIHN0cmluZyEhIQorICovCitzdGF0aWMgaW50IF9faW5pdAorZXRoZXIzX2FkZHIoY2hhciAqYWRkciwgc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYykKK3sKKwlzdHJ1Y3QgaW5fY2h1bmtfZGlyIGNkOworCWNoYXIgKnM7CisJCisJaWYgKGVjYXJkX3JlYWRjaHVuaygmY2QsIGVjLCAweGY1LCAwKSAmJiAocyA9IHN0cmNocihjZC5kLnN0cmluZywgJygnKSkpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGk8NjsgaSsrKSB7CisJCQlhZGRyW2ldID0gc2ltcGxlX3N0cnRvdWwocyArIDEsICZzLCAweDEwKTsKKwkJCWlmICgqcyAhPSAoaT09NT8nKScgOiAnOicgKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSA2KQorCQkJcmV0dXJuIDA7CisJfQorCS8qIEkgd29uZGVyIGlmIHdlIHNob3VsZCBldmVuIGxldCB0aGUgdXNlciBjb250aW51ZSBpbiB0aGlzIGNhc2UKKwkgKiAgIC0gbm8sIGl0IHdvdWxkIGJlIGJldHRlciB0byBkaXNhYmxlIHRoZSBkZXZpY2UKKwkgKi8KKwlwcmludGsoS0VSTl9FUlIgImV0aGVyMzogQ291bGRuJ3QgcmVhZCBhIHZhbGlkIE1BQyBhZGRyZXNzIGZyb20gY2FyZC5cbiIpOworCXJldHVybiAtRU5PREVWOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBfX2luaXQKK2V0aGVyM19yYW10ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYnl0ZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBrbWFsbG9jKFJYX0VORCwgR0ZQX0tFUk5FTCk7CisJaW50IGkscmV0ID0gMDsKKwlpbnQgbWF4X2Vycm9ycyA9IDQ7CisJaW50IGJhZCA9IC0xOworCisJaWYgKCFidWZmZXIpCisJCXJldHVybiAxOworCisJbWVtc2V0KGJ1ZmZlciwgYnl0ZSwgUlhfRU5EKTsKKwlldGhlcjNfc2V0YnVmZmVyKGRldiwgYnVmZmVyX3dyaXRlLCAwKTsKKwlldGhlcjNfd3JpdGVidWZmZXIoZGV2LCBidWZmZXIsIFRYX0VORCk7CisJZXRoZXIzX3NldGJ1ZmZlcihkZXYsIGJ1ZmZlcl93cml0ZSwgUlhfU1RBUlQpOworCWV0aGVyM193cml0ZWJ1ZmZlcihkZXYsIGJ1ZmZlciArIFJYX1NUQVJULCBSWF9MRU4pOworCW1lbXNldChidWZmZXIsIGJ5dGUgXiAweGZmLCBSWF9FTkQpOworCWV0aGVyM19zZXRidWZmZXIoZGV2LCBidWZmZXJfcmVhZCwgMCk7CisJZXRoZXIzX3JlYWRidWZmZXIoZGV2LCBidWZmZXIsIFRYX0VORCk7CisJZXRoZXIzX3NldGJ1ZmZlcihkZXYsIGJ1ZmZlcl9yZWFkLCBSWF9TVEFSVCk7CisJZXRoZXIzX3JlYWRidWZmZXIoZGV2LCBidWZmZXIgKyBSWF9TVEFSVCwgUlhfTEVOKTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9FTkQ7IGkrKykgeworCQlpZiAoYnVmZmVyW2ldICE9IGJ5dGUpIHsKKwkJCWlmIChtYXhfZXJyb3JzID4gMCAmJiBiYWQgIT0gYnVmZmVyW2ldKSB7CisJCQkJcHJpbnRrKCIlczogUkFNIGZhaWxlZCB3aXRoICglMDJYIGluc3RlYWQgb2YgJTAyWCkgYXQgMHglMDRYIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBidWZmZXJbaV0sIGJ5dGUsIGkpOworCQkJCXJldCA9IDI7CisJCQkJbWF4X2Vycm9ycy0tOworCQkJCWJhZCA9IGk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoYmFkICE9IC0xKSB7CisJCQkJaWYgKGJhZCAhPSBpIC0gMSkKKwkJCQkJcHJpbnRrKCIgLSAweCUwNFhcbiIsIGkgLSAxKTsKKwkJCQlwcmludGsoIlxuIik7CisJCQkJYmFkID0gLTE7CisJCQl9CisJCX0KKwl9CisJaWYgKGJhZCAhPSAtMSkKKwkJcHJpbnRrKCIgLSAweGZmZmZcbiIpOworCWtmcmVlKGJ1ZmZlcik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19pbml0IGV0aGVyM19pbml0XzIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKworCXByaXYoZGV2KS0+cmVncy5jb25maWcxID0gQ0ZHMV9SRUNWQ09NUFNUQVQwfENGRzFfRE1BQlVSU1Q4OworCXByaXYoZGV2KS0+cmVncy5jb25maWcyID0gQ0ZHMl9DVFJMT3xDRkcyX1JFQ1ZDUkN8Q0ZHMl9FUlJFTkNSQzsKKwlwcml2KGRldiktPnJlZ3MuY29tbWFuZCA9IDA7CisKKwkvKgorCSAqIFNldCB1cCBvdXIgaGFyZHdhcmUgYWRkcmVzcworCSAqLworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb25maWcxIHwgQ0ZHMV9CVUZTRUxTVEFUMCwgUkVHX0NPTkZJRzEpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWV0aGVyM19vdXRiKGRldi0+ZGV2X2FkZHJbaV0sIFJFR19CVUZXSU4pOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJcHJpdihkZXYpLT5yZWdzLmNvbmZpZzEgfD0gQ0ZHMV9SRUNWUFJPTUlTQzsKKwllbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX01VTFRJQ0FTVCkKKwkJcHJpdihkZXYpLT5yZWdzLmNvbmZpZzEgfD0gQ0ZHMV9SRUNWU1BFQ0JSTVVMVEk7CisJZWxzZQorCQlwcml2KGRldiktPnJlZ3MuY29uZmlnMSB8PSBDRkcxX1JFQ1ZTUEVDQlJPQUQ7CisKKwkvKgorCSAqIFRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBOUTgwMDUgaW4gdGhhdCBpdCBvY2Nhc2lvbmFsbHkgbG9zZXMgdGhlCisJICogbGFzdCB0d28gYnl0ZXMuICBUbyBnZXQgcm91bmQgdGhpcyBwcm9ibGVtLCB3ZSByZWNlaXZlIHRoZSBDUkMgYXMKKwkgKiB3ZWxsLiAgVGhhdCB3YXksIGlmIHdlIGRvIGxvc2UgdGhlIGxhc3QgdHdvLCB0aGVuIGl0IGRvZXNuJ3QgbWF0dGVyLgorCSAqLworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb25maWcxIHwgQ0ZHMV9UUkFOU0VORCwgUkVHX0NPTkZJRzEpOworCWV0aGVyM19vdXR3KChUWF9FTkQ+PjgpIC0gMSwgUkVHX0JVRldJTik7CisJZXRoZXIzX291dHcocHJpdihkZXYpLT5yeF9oZWFkLCBSRUdfUkVDVlBUUik7CisJZXRoZXIzX291dHcoMCwgUkVHX1RSQU5TTUlUUFRSKTsKKwlldGhlcjNfb3V0dyhwcml2KGRldiktPnJ4X2hlYWQgPj4gOCwgUkVHX1JFQ1ZFTkQpOworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb25maWcyLCBSRUdfQ09ORklHMik7CisJZXRoZXIzX291dHcocHJpdihkZXYpLT5yZWdzLmNvbmZpZzEgfCBDRkcxX0xPQ0JVRk1FTSwgUkVHX0NPTkZJRzEpOworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb21tYW5kLCBSRUdfQ09NTUFORCk7CisKKwlpID0gZXRoZXIzX3JhbXRlc3QoZGV2LCAweDVBKTsKKwlpZihpKQorCQlyZXR1cm4gaTsKKwlpID0gZXRoZXIzX3JhbXRlc3QoZGV2LCAweDFFKTsKKwlpZihpKQorCQlyZXR1cm4gaTsKKworCWV0aGVyM19zZXRidWZmZXIoZGV2LCBidWZmZXJfd3JpdGUsIDApOworCWV0aGVyM193cml0ZWxvbmcoZGV2LCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2V0aGVyM19pbml0X2Zvcl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisKKwltZW1zZXQoJnByaXYoZGV2KS0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCisJLyogUmVzZXQgdGhlIGNoaXAgKi8KKwlldGhlcjNfb3V0dyhDRkcyX1JFU0VULCBSRUdfQ09ORklHMik7CisJdWRlbGF5KDQpOworCisJcHJpdihkZXYpLT5yZWdzLmNvbW1hbmQgPSAwOworCWV0aGVyM19vdXR3KENNRF9SWE9GRnxDTURfVFhPRkYsIFJFR19DT01NQU5EKTsKKwl3aGlsZSAoZXRoZXIzX2ludyhSRUdfU1RBVFVTKSAmIChTVEFUX1JYT058U1RBVF9UWE9OKSkKKwkJYmFycmllcigpOworCisJZXRoZXIzX291dHcocHJpdihkZXYpLT5yZWdzLmNvbmZpZzEgfCBDRkcxX0JVRlNFTFNUQVQwLCBSRUdfQ09ORklHMSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZXRoZXIzX291dGIoZGV2LT5kZXZfYWRkcltpXSwgUkVHX0JVRldJTik7CisKKwlwcml2KGRldiktPnR4X2hlYWQJPSAwOworCXByaXYoZGV2KS0+dHhfdGFpbAk9IDA7CisJcHJpdihkZXYpLT5yZWdzLmNvbmZpZzIgfD0gQ0ZHMl9DVFJMTzsKKwlwcml2KGRldiktPnJ4X2hlYWQJPSBSWF9TVEFSVDsKKworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb25maWcxIHwgQ0ZHMV9UUkFOU0VORCwgUkVHX0NPTkZJRzEpOworCWV0aGVyM19vdXR3KChUWF9FTkQ+PjgpIC0gMSwgUkVHX0JVRldJTik7CisJZXRoZXIzX291dHcocHJpdihkZXYpLT5yeF9oZWFkLCBSRUdfUkVDVlBUUik7CisJZXRoZXIzX291dHcocHJpdihkZXYpLT5yeF9oZWFkID4+IDgsIFJFR19SRUNWRU5EKTsKKwlldGhlcjNfb3V0dygwLCBSRUdfVFJBTlNNSVRQVFIpOworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb25maWcyLCBSRUdfQ09ORklHMik7CisJZXRoZXIzX291dHcocHJpdihkZXYpLT5yZWdzLmNvbmZpZzEgfCBDRkcxX0xPQ0JVRk1FTSwgUkVHX0NPTkZJRzEpOworCisJZXRoZXIzX3NldGJ1ZmZlcihkZXYsIGJ1ZmZlcl93cml0ZSwgMCk7CisJZXRoZXIzX3dyaXRlbG9uZyhkZXYsIDApOworCisJcHJpdihkZXYpLT5yZWdzLmNvbW1hbmQgPSBDTURfRU5JTlRSWCB8IENNRF9FTklOVFRYOworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb21tYW5kIHwgQ01EX1JYT04sIFJFR19DT01NQU5EKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V0aGVyM19wcm9iZV9idXNfOChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmFsKQoreworCWludCB3cml0ZV9sb3csIHdyaXRlX2hpZ2gsIHJlYWRfbG93LCByZWFkX2hpZ2g7CisKKwl3cml0ZV9sb3cgPSB2YWwgJiAyNTU7CisJd3JpdGVfaGlnaCA9IHZhbCA+PiA4OworCisJcHJpbnRrKEtFUk5fREVCVUcgImV0aGVyM19wcm9iZTogd3JpdGU4IFslMDJYOiUwMlhdIiwgd3JpdGVfaGlnaCwgd3JpdGVfbG93KTsKKworCWV0aGVyM19vdXRiKHdyaXRlX2xvdywgUkVHX1JFQ1ZQVFIpOworCWV0aGVyM19vdXRiKHdyaXRlX2hpZ2gsIFJFR19SRUNWUFRSICsgNCk7CisKKwlyZWFkX2xvdyA9IGV0aGVyM19pbmIoUkVHX1JFQ1ZQVFIpOworCXJlYWRfaGlnaCA9IGV0aGVyM19pbmIoUkVHX1JFQ1ZQVFIgKyA0KTsKKworCXByaW50aygiLCByZWFkOCBbJTAyWDolMDJYXVxuIiwgcmVhZF9oaWdoLCByZWFkX2xvdyk7CisKKwlyZXR1cm4gcmVhZF9sb3cgPT0gd3JpdGVfbG93ICYmIHJlYWRfaGlnaCA9PSB3cml0ZV9oaWdoOworfQorCitzdGF0aWMgaW5saW5lIGludAorZXRoZXIzX3Byb2JlX2J1c18xNihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmFsKQoreworCWludCByZWFkX3ZhbDsKKworCWV0aGVyM19vdXR3KHZhbCwgUkVHX1JFQ1ZQVFIpOworCXJlYWRfdmFsID0gZXRoZXIzX2ludyhSRUdfUkVDVlBUUik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiZXRoZXIzX3Byb2JlOiB3cml0ZTE2IFslMDRYXSwgcmVhZDE2IFslMDRYXVxuIiwgdmFsLCByZWFkX3ZhbCk7CisKKwlyZXR1cm4gcmVhZF92YWwgPT0gdmFsOworfQorCisvKgorICogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpCisgKiBzb21ldGltZSBhZnRlciBib290aW5nIHdoZW4gdGhlICdpZmNvbmZpZycgcHJvZ3JhbSBpcyBydW4uCisgKgorICogVGhpcyByb3V0aW5lIHNob3VsZCBzZXQgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgorICogcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKKyAqIHRoZXJlIGlzIG5vbi1yZWJvb3Qgd2F5IHRvIHJlY292ZXIgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisgKi8KK3N0YXRpYyBpbnQKK2V0aGVyM19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIGV0aGVybmV0IE1BQyBhZGRyZXNzXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBldGhlcjNfaW50ZXJydXB0LCAwLCAiZXRoZXIzIiwgZGV2KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlldGhlcjNfaW5pdF9mb3Jfb3BlbihkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhlIGludmVyc2Ugcm91dGluZSB0byBldGhlcjNfb3BlbigpLgorICovCitzdGF0aWMgaW50CitldGhlcjNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisKKwlldGhlcjNfb3V0dyhDTURfUlhPRkZ8Q01EX1RYT0ZGLCBSRUdfQ09NTUFORCk7CisJcHJpdihkZXYpLT5yZWdzLmNvbW1hbmQgPSAwOworCXdoaWxlIChldGhlcjNfaW53KFJFR19TVEFUVVMpICYgKFNUQVRfUlhPTnxTVEFUX1RYT04pKQorCQliYXJyaWVyKCk7CisJZXRoZXIzX291dGIoMHg4MCwgUkVHX0NPTkZJRzIgKyA0KTsKKwlldGhlcjNfb3V0dygwLCBSRUdfQ09NTUFORCk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCVRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IKKyAqIGNsb3NlZC4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpldGhlcjNfZ2V0c3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gJnByaXYoZGV2KS0+c3RhdHM7Cit9CisKKy8qCisgKiBTZXQgb3IgY2xlYXIgcHJvbWlzY3VvdXMvbXVsdGljYXN0IG1vZGUgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgKgorICogV2UgZG9uJ3QgYXR0ZW1wdCBhbnkgcGFja2V0IGZpbHRlcmluZy4gIFRoZSBjYXJkIG1heSBoYXZlIGEgU0VFUSA4MDA0CisgKiBpbiB3aGljaCBkb2VzIG5vdCBoYXZlIHRoZSBvdGhlciBldGhlcm5ldCBhZGRyZXNzIHJlZ2lzdGVycyBwcmVzZW50Li4uCisgKi8KK3N0YXRpYyB2b2lkIGV0aGVyM19zZXRtdWx0aWNhc3RsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHJpdihkZXYpLT5yZWdzLmNvbmZpZzEgJj0gfkNGRzFfUkVDVlBST01JU0M7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJcHJpdihkZXYpLT5yZWdzLmNvbmZpZzEgfD0gQ0ZHMV9SRUNWUFJPTUlTQzsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJcHJpdihkZXYpLT5yZWdzLmNvbmZpZzEgfD0gQ0ZHMV9SRUNWU1BFQ0JSTVVMVEk7CisJfSBlbHNlCisJCXByaXYoZGV2KS0+cmVncy5jb25maWcxIHw9IENGRzFfUkVDVlNQRUNCUk9BRDsKKworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb25maWcxIHwgQ0ZHMV9MT0NCVUZNRU0sIFJFR19DT05GSUcxKTsKK30KKworc3RhdGljIHZvaWQgZXRoZXIzX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGVsX3RpbWVyKCZwcml2KGRldiktPnRpbWVyKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIG5ldHdvcmsgY2FibGUgcHJvYmxlbT9cbiIsIGRldi0+bmFtZSk7CisJcHJpbnRrKEtFUk5fRVJSICIlczogc3RhdGU6IHsgc3RhdHVzPSUwNFggY2ZnMT0lMDRYIGNmZzI9JTA0WCB9XG4iLCBkZXYtPm5hbWUsCisJCWV0aGVyM19pbncoUkVHX1NUQVRVUyksIGV0aGVyM19pbncoUkVHX0NPTkZJRzEpLCBldGhlcjNfaW53KFJFR19DT05GSUcyKSk7CisJcHJpbnRrKEtFUk5fRVJSICIlczogeyBycHI9JTA0WCByZWE9JTA0WCB0cHI9JTA0WCB9XG4iLCBkZXYtPm5hbWUsCisJCWV0aGVyM19pbncoUkVHX1JFQ1ZQVFIpLCBldGhlcjNfaW53KFJFR19SRUNWRU5EKSwgZXRoZXIzX2ludyhSRUdfVFJBTlNNSVRQVFIpKTsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiB0eCBoZWFkPSVYIHR4IHRhaWw9JVhcbiIsIGRldi0+bmFtZSwKKwkJcHJpdihkZXYpLT50eF9oZWFkLCBwcml2KGRldiktPnR4X3RhaWwpOworCWV0aGVyM19zZXRidWZmZXIoZGV2LCBidWZmZXJfcmVhZCwgcHJpdihkZXYpLT50eF90YWlsKTsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBwYWNrZXQgc3RhdHVzID0gJTA4WFxuIiwgZGV2LT5uYW1lLCBldGhlcjNfcmVhZGxvbmcoZGV2KSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcHJpdihkZXYpLT5yZWdzLmNvbmZpZzIgfD0gQ0ZHMl9DVFJMTzsKKwlwcml2KGRldiktPnN0YXRzLnR4X2Vycm9ycyArPSAxOworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb25maWcyLCBSRUdfQ09ORklHMik7CisJcHJpdihkZXYpLT50eF9oZWFkID0gcHJpdihkZXYpLT50eF90YWlsID0gMDsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoKKyAqIFRyYW5zbWl0IGEgcGFja2V0CisgKi8KK3N0YXRpYyBpbnQKK2V0aGVyM19zZW5kcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47CisJdW5zaWduZWQgaW50IHB0ciwgbmV4dF9wdHI7CisKKwlpZiAocHJpdihkZXYpLT5icm9rZW4pIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlwcml2KGRldiktPnN0YXRzLnR4X2Ryb3BwZWQgKys7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCXJldHVybiAwOworCX0KKworCWxlbmd0aCA9IChsZW5ndGggKyAxKSAmIH4xOworCWlmIChsZW5ndGggIT0gc2tiLT5sZW4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgbGVuZ3RoKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJfQorCisJbmV4dF9wdHIgPSAocHJpdihkZXYpLT50eF9oZWFkICsgMSkgJiAxNTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmIChwcml2KGRldiktPnR4X3RhaWwgPT0gbmV4dF9wdHIpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gMTsJLyogdW5hYmxlIHRvIHF1ZXVlICovCisJfQorCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcHRyCQkgPSAweDYwMCAqIHByaXYoZGV2KS0+dHhfaGVhZDsKKwlwcml2KGRldiktPnR4X2hlYWQgPSBuZXh0X3B0cjsKKwluZXh0X3B0cgkqPSAweDYwMDsKKworI2RlZmluZSBUWEhEUl9GTEFHUyAoVFhIRFJfVFJBTlNNSVR8VFhIRFJfQ0hBSU5DT05USU5VRXxUWEhEUl9EQVRBRk9MTE9XU3xUWEhEUl9FTlNVQ0NFU1MpCisKKwlldGhlcjNfc2V0YnVmZmVyKGRldiwgYnVmZmVyX3dyaXRlLCBuZXh0X3B0cik7CisJZXRoZXIzX3dyaXRlbG9uZyhkZXYsIDApOworCWV0aGVyM19zZXRidWZmZXIoZGV2LCBidWZmZXJfd3JpdGUsIHB0cik7CisJZXRoZXIzX3dyaXRlbG9uZyhkZXYsIDApOworCWV0aGVyM193cml0ZWJ1ZmZlcihkZXYsIHNrYi0+ZGF0YSwgbGVuZ3RoKTsKKwlldGhlcjNfd3JpdGV3b3JkKGRldiwgaHRvbnMobmV4dF9wdHIpKTsKKwlldGhlcjNfd3JpdGV3b3JkKGRldiwgVFhIRFJfQ0hBSU5DT05USU5VRSA+PiAxNik7CisJZXRoZXIzX3NldGJ1ZmZlcihkZXYsIGJ1ZmZlcl93cml0ZSwgcHRyKTsKKwlldGhlcjNfd3JpdGV3b3JkKGRldiwgaHRvbnMoKHB0ciArIGxlbmd0aCArIDQpKSk7CisJZXRoZXIzX3dyaXRld29yZChkZXYsIFRYSERSX0ZMQUdTID4+IDE2KTsKKwlldGhlcjNfbGVkb24oZGV2KTsKKworCWlmICghKGV0aGVyM19pbncoUkVHX1NUQVRVUykgJiBTVEFUX1RYT04pKSB7CisJCWV0aGVyM19vdXR3KHB0ciwgUkVHX1RSQU5TTUlUUFRSKTsKKwkJZXRoZXIzX291dHcocHJpdihkZXYpLT5yZWdzLmNvbW1hbmQgfCBDTURfVFhPTiwgUkVHX0NPTU1BTkQpOworCX0KKworCW5leHRfcHRyID0gKHByaXYoZGV2KS0+dHhfaGVhZCArIDEpICYgMTU7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJaWYgKHByaXYoZGV2KS0+dHhfdGFpbCA9PSBuZXh0X3B0cikKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK2V0aGVyM19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXVuc2lnbmVkIGludCBzdGF0dXMsIGhhbmRsZWQgPSBJUlFfTk9ORTsKKworI2lmIE5FVF9ERUJVRyA+IDEKKwlpZihuZXRfZGVidWcgJiBERUJVR19JTlQpCisJCXByaW50aygiZXRoM2lycTogJWQgIiwgaXJxKTsKKyNlbmRpZgorCisJc3RhdHVzID0gZXRoZXIzX2ludyhSRUdfU1RBVFVTKTsKKworCWlmIChzdGF0dXMgJiBTVEFUX0lOVFJYKSB7CisJCWV0aGVyM19vdXR3KENNRF9BQ0tJTlRSWCB8IHByaXYoZGV2KS0+cmVncy5jb21tYW5kLCBSRUdfQ09NTUFORCk7CisJCWV0aGVyM19yeChkZXYsIDEyKTsKKwkJaGFuZGxlZCA9IElSUV9IQU5ETEVEOworCX0KKworCWlmIChzdGF0dXMgJiBTVEFUX0lOVFRYKSB7CisJCWV0aGVyM19vdXR3KENNRF9BQ0tJTlRUWCB8IHByaXYoZGV2KS0+cmVncy5jb21tYW5kLCBSRUdfQ09NTUFORCk7CisJCWV0aGVyM190eChkZXYpOworCQloYW5kbGVkID0gSVJRX0hBTkRMRUQ7CisJfQorCisjaWYgTkVUX0RFQlVHID4gMQorCWlmKG5ldF9kZWJ1ZyAmIERFQlVHX0lOVCkKKwkJcHJpbnRrKCJkb25lXG4iKTsKKyNlbmRpZgorCXJldHVybiBoYW5kbGVkOworfQorCisvKgorICogSWYgd2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyBpbnQgZXRoZXIzX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBtYXhjbnQpCit7CisJdW5zaWduZWQgaW50IG5leHRfcHRyID0gcHJpdihkZXYpLT5yeF9oZWFkLCByZWNlaXZlZCA9IDA7CisKKwlldGhlcjNfbGVkb24oZGV2KTsKKworCWRvIHsKKwkJdW5zaWduZWQgaW50IHRoaXNfcHRyLCBzdGF0dXM7CisJCXVuc2lnbmVkIGNoYXIgYWRkcnNbMTZdOworCisJCS8qCisJCSAqIHJlYWQgdGhlIGZpcnN0IDE2IGJ5dGVzIGZyb20gdGhlIGJ1ZmZlci4KKwkJICogVGhpcyBjb250YWlucyB0aGUgc3RhdHVzIGJ5dGVzIGV0YyBhbmQgZXRoZXJuZXQgYWRkcmVzc2VzLAorCQkgKiBhbmQgd2UgYWxzbyBjaGVjayB0aGUgc291cmNlIGV0aGVybmV0IGFkZHJlc3MgdG8gc2VlIGlmCisJCSAqIGl0IG9yaWdpbmF0ZWQgZnJvbSB1cy4KKwkJICovCisJCXsKKwkJCXVuc2lnbmVkIGludCB0ZW1wX3B0cjsKKwkJCWV0aGVyM19zZXRidWZmZXIoZGV2LCBidWZmZXJfcmVhZCwgbmV4dF9wdHIpOworCQkJdGVtcF9wdHIgPSBldGhlcjNfcmVhZHdvcmQoZGV2KTsKKwkJCXN0YXR1cyA9IGV0aGVyM19yZWFkd29yZChkZXYpOworCQkJaWYgKChzdGF0dXMgJiAoUlhTVEFUX0RPTkUgfCBSWEhEUl9DSEFJTkNPTlRJTlVFIHwgUlhIRFJfUkVDRUlWRSkpICE9CisJCQkJKFJYU1RBVF9ET05FIHwgUlhIRFJfQ0hBSU5DT05USU5VRSkgfHwgIXRlbXBfcHRyKQorCQkJCWJyZWFrOworCisJCQl0aGlzX3B0ciA9IG5leHRfcHRyICsgNDsKKwkJCW5leHRfcHRyID0gbnRvaHModGVtcF9wdHIpOworCQl9CisJCWV0aGVyM19zZXRidWZmZXIoZGV2LCBidWZmZXJfcmVhZCwgdGhpc19wdHIpOworCQlldGhlcjNfcmVhZGJ1ZmZlcihkZXYsIGFkZHJzKzIsIDEyKTsKKworaWYgKG5leHRfcHRyIDwgUlhfU1RBUlQgfHwgbmV4dF9wdHIgPj0gUlhfRU5EKSB7CisgaW50IGk7CisgcHJpbnRrKCIlczogYmFkIG5leHQgcG9pbnRlciBAJTA0WDogIiwgZGV2LT5uYW1lLCBwcml2KGRldiktPnJ4X2hlYWQpOworIHByaW50aygiJTAyWCAlMDJYICUwMlggJTAyWCAiLCBuZXh0X3B0ciA+PiA4LCBuZXh0X3B0ciAmIDI1NSwgc3RhdHVzICYgMjU1LCBzdGF0dXMgPj4gOCk7CisgZm9yIChpID0gMjsgaSA8IDE0OyBpKyspCisgICBwcmludGsoIiUwMlggIiwgYWRkcnNbaV0pOworIHByaW50aygiXG4iKTsKKyBuZXh0X3B0ciA9IHByaXYoZGV2KS0+cnhfaGVhZDsKKyBicmVhazsKK30KKwkJLyoKKyAJCSAqIGlnbm9yZSBvdXIgb3duIHBhY2tldHMuLi4KKwkgCSAqLworCQlpZiAoISgqKHVuc2lnbmVkIGxvbmcgKikmZGV2LT5kZXZfYWRkclswXSBeICoodW5zaWduZWQgbG9uZyAqKSZhZGRyc1syKzZdKSAmJgorCQkgICAgISgqKHVuc2lnbmVkIHNob3J0ICopJmRldi0+ZGV2X2FkZHJbNF0gXiAqKHVuc2lnbmVkIHNob3J0ICopJmFkZHJzWzIrMTBdKSkgeworCQkJbWF4Y250ICsrOyAvKiBjb21wZW5zYXRlIGZvciBsb29wZWRiYWNrIHBhY2tldCAqLworCQkJZXRoZXIzX291dHcobmV4dF9wdHIgPj4gOCwgUkVHX1JFQ1ZFTkQpOworCQl9IGVsc2UKKwkJaWYgKCEoc3RhdHVzICYgKFJYU1RBVF9PVkVSU0laRXxSWFNUQVRfQ1JDRVJST1J8UlhTVEFUX0RSSUJCTEVFUlJPUnxSWFNUQVRfU0hPUlRQQUNLRVQpKSkgeworCQkJdW5zaWduZWQgaW50IGxlbmd0aCA9IG5leHRfcHRyIC0gdGhpc19wdHI7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlpZiAobmV4dF9wdHIgPD0gdGhpc19wdHIpCisJCQkJbGVuZ3RoICs9IFJYX0VORCAtIFJYX1NUQVJUOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbmd0aCArIDIpOworCQkJaWYgKHNrYikgeworCQkJCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCQkJYnVmID0gc2tiX3B1dChza2IsIGxlbmd0aCk7CisJCQkJZXRoZXIzX3JlYWRidWZmZXIoZGV2LCBidWYgKyAxMiwgbGVuZ3RoIC0gMTIpOworCQkJCWV0aGVyM19vdXR3KG5leHRfcHRyID4+IDgsIFJFR19SRUNWRU5EKTsKKwkJCQkqKHVuc2lnbmVkIHNob3J0ICopKGJ1ZiArIDApCT0gKih1bnNpZ25lZCBzaG9ydCAqKShhZGRycyArIDIpOworCQkJCSoodW5zaWduZWQgbG9uZyAqKShidWYgKyAyKQk9ICoodW5zaWduZWQgbG9uZyAqKShhZGRycyArIDQpOworCQkJCSoodW5zaWduZWQgbG9uZyAqKShidWYgKyA2KQk9ICoodW5zaWduZWQgbG9uZyAqKShhZGRycyArIDgpOworCQkJCSoodW5zaWduZWQgc2hvcnQgKikoYnVmICsgMTApCT0gKih1bnNpZ25lZCBzaG9ydCAqKShhZGRycyArIDEyKTsKKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJcmVjZWl2ZWQgKys7CisJCQl9IGVsc2UKKwkJCQlnb3RvIGRyb3BwaW5nOworCQl9IGVsc2UgeworCQkJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYoZGV2KS0+c3RhdHM7CisJCQlldGhlcjNfb3V0dyhuZXh0X3B0ciA+PiA4LCBSRUdfUkVDVkVORCk7CisJCQlpZiAoc3RhdHVzICYgUlhTVEFUX09WRVJTSVpFKQkgIHN0YXRzLT5yeF9vdmVyX2Vycm9ycyArKzsKKwkJCWlmIChzdGF0dXMgJiBSWFNUQVRfQ1JDRVJST1IpCSAgc3RhdHMtPnJ4X2NyY19lcnJvcnMgKys7CisJCQlpZiAoc3RhdHVzICYgUlhTVEFUX0RSSUJCTEVFUlJPUikgc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzICsrOworCQkJaWYgKHN0YXR1cyAmIFJYU1RBVF9TSE9SVFBBQ0tFVCkgIHN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzICsrOworCQkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQl9CisJfQorCXdoaWxlICgtLSBtYXhjbnQpOworCitkb25lOgorCXByaXYoZGV2KS0+c3RhdHMucnhfcGFja2V0cyArPSByZWNlaXZlZDsKKwlwcml2KGRldiktPnJ4X2hlYWQgPSBuZXh0X3B0cjsKKwkvKgorCSAqIElmIHJ4IHdlbnQgb2ZmIGxpbmUsIHRoZW4gdGhhdCBtZWFucyB0aGF0IHRoZSBidWZmZXIgbWF5IGJlIGZ1bGwuICBXZQorCSAqIGhhdmUgZHJvcHBlZCBhdCBsZWFzdCBvbmUgcGFja2V0LgorCSAqLworCWlmICghKGV0aGVyM19pbncoUkVHX1NUQVRVUykgJiBTVEFUX1JYT04pKSB7CisJCXByaXYoZGV2KS0+c3RhdHMucnhfZHJvcHBlZCArKzsKKyAgICAJCWV0aGVyM19vdXR3KG5leHRfcHRyLCBSRUdfUkVDVlBUUik7CisJCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb21tYW5kIHwgQ01EX1JYT04sIFJFR19DT01NQU5EKTsKKwl9CisKKwlyZXR1cm4gbWF4Y250OworCitkcm9wcGluZzp7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF93YXJuZWQ7CisKKwlldGhlcjNfb3V0dyhuZXh0X3B0ciA+PiA4LCBSRUdfUkVDVkVORCk7CisJLyoKKwkgKiBEb24ndCBwcmludCB0aGlzIG1lc3NhZ2UgdG9vIG1hbnkgdGltZXMuLi4KKwkgKi8KKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBsYXN0X3dhcm5lZCArIDEwICogSFopKSB7CisJCWxhc3Rfd2FybmVkID0gamlmZmllczsKKwkJcHJpbnRrKCIlczogbWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7CisJfQorCXByaXYoZGV2KS0+c3RhdHMucnhfZHJvcHBlZCArKzsKKwlnb3RvIGRvbmU7CisJfQorfQorCisvKgorICogVXBkYXRlIHN0YXRzIGZvciB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0KHMpCisgKi8KK3N0YXRpYyB2b2lkIGV0aGVyM190eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGludCB0eF90YWlsID0gcHJpdihkZXYpLT50eF90YWlsOworCWludCBtYXhfd29yayA9IDE0OworCisJZG8geworCSAgICAJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKyAgICAJCS8qCisJICAgIAkgKiBSZWFkIHRoZSBwYWNrZXQgaGVhZGVyCisgICAgCQkgKi8KKwkgICAgCWV0aGVyM19zZXRidWZmZXIoZGV2LCBidWZmZXJfcmVhZCwgdHhfdGFpbCAqIDB4NjAwKTsKKyAgICAJCXN0YXR1cyA9IGV0aGVyM19yZWFkbG9uZyhkZXYpOworCisJCS8qCisJCSAqIENoZWNrIHRvIHNlZSBpZiB0aGlzIHBhY2tldCBoYXMgYmVlbiB0cmFuc21pdHRlZAorCQkgKi8KKwkJaWYgKChzdGF0dXMgJiAoVFhTVEFUX0RPTkUgfCBUWEhEUl9UUkFOU01JVCkpICE9CisJCSAgICAoVFhTVEFUX0RPTkUgfCBUWEhEUl9UUkFOU01JVCkpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBVcGRhdGUgZXJyb3JzCisJCSAqLworCQlpZiAoIShzdGF0dXMgJiAoVFhTVEFUX0JBQkJMRUQgfCBUWFNUQVRfMTZDT0xMSVNJT05TKSkpCisJCQlwcml2KGRldiktPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJZWxzZSB7CisJCQlwcml2KGRldiktPnN0YXRzLnR4X2Vycm9ycyArKzsKKwkJCWlmIChzdGF0dXMgJiBUWFNUQVRfMTZDT0xMSVNJT05TKQorCQkJCXByaXYoZGV2KS0+c3RhdHMuY29sbGlzaW9ucyArPSAxNjsKKwkJCWlmIChzdGF0dXMgJiBUWFNUQVRfQkFCQkxFRCkKKwkJCQlwcml2KGRldiktPnN0YXRzLnR4X2ZpZm9fZXJyb3JzICsrOworCQl9CisKKwkJdHhfdGFpbCA9ICh0eF90YWlsICsgMSkgJiAxNTsKKwl9IHdoaWxlICgtLW1heF93b3JrKTsKKworCWlmIChwcml2KGRldiktPnR4X3RhaWwgIT0gdHhfdGFpbCkgeworCQlwcml2KGRldiktPnR4X3RhaWwgPSB0eF90YWlsOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZXRoZXIzX2Jhbm5lcih2b2lkKQoreworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQgPSAwOworCisJaWYgKG5ldF9kZWJ1ZyAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZXRoZXIzX3Byb2JlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCAqaWQpCit7CisJY29uc3Qgc3RydWN0IGV0aGVyM19kYXRhICpkYXRhID0gaWQtPmRhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaSwgYnVzX3R5cGUsIHJldDsKKworCWV0aGVyM19iYW5uZXIoKTsKKworCXJldCA9IGVjYXJkX3JlcXVlc3RfcmVzb3VyY2VzKGVjKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZGV2X3ByaXYpKTsKKwlpZiAoIWRldikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHJlbGVhc2U7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJmVjLT5kZXYpOworCisJcHJpdihkZXYpLT5iYXNlID0gaW9yZW1hcChlY2FyZF9yZXNvdXJjZV9zdGFydChlYywgRUNBUkRfUkVTX01FTUMpLAorCQkJCSAgZWNhcmRfcmVzb3VyY2VfbGVuKGVjLCBFQ0FSRF9SRVNfTUVNQykpOworCWlmICghcHJpdihkZXYpLT5iYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZnJlZTsKKwl9CisKKwllYy0+aXJxYWRkciA9IHByaXYoZGV2KS0+YmFzZSArIGRhdGEtPmJhc2Vfb2Zmc2V0OworCWVjLT5pcnFtYXNrID0gMHhmMDsKKworCXByaXYoZGV2KS0+c2VlcSA9IHByaXYoZGV2KS0+YmFzZSArIGRhdGEtPmJhc2Vfb2Zmc2V0OworCWRldi0+aXJxID0gZWMtPmlycTsKKworCWV0aGVyM19hZGRyKGRldi0+ZGV2X2FkZHIsIGVjKTsKKworCWluaXRfdGltZXIoJnByaXYoZGV2KS0+dGltZXIpOworCisJLyogUmVzZXQgY2FyZC4uLgorCSAqLworCWV0aGVyM19vdXRiKDB4ODAsIFJFR19DT05GSUcyICsgNCk7CisJYnVzX3R5cGUgPSBCVVNfVU5LTk9XTjsKKwl1ZGVsYXkoNCk7CisKKwkvKiBUZXN0IHVzaW5nIFJlY2VpdmUgUG9pbnRlciAoMTYtYml0IHJlZ2lzdGVyKSB0byBmaW5kIG91dAorCSAqIGhvdyB0aGUgZXRoZXIzIGlzIGNvbm5lY3RlZCB0byB0aGUgYnVzLi4uCisJICovCisJaWYgKGV0aGVyM19wcm9iZV9idXNfOChkZXYsIDB4MTAwKSAmJgorCSAgICBldGhlcjNfcHJvYmVfYnVzXzgoZGV2LCAweDIwMSkpCisJCWJ1c190eXBlID0gQlVTXzg7CisKKwlpZiAoYnVzX3R5cGUgPT0gQlVTX1VOS05PV04gJiYKKwkgICAgZXRoZXIzX3Byb2JlX2J1c18xNihkZXYsIDB4MTAxKSAmJgorCSAgICBldGhlcjNfcHJvYmVfYnVzXzE2KGRldiwgMHgyMDEpKQorCQlidXNfdHlwZSA9IEJVU18xNjsKKworCXN3aXRjaCAoYnVzX3R5cGUpIHsKKwljYXNlIEJVU19VTktOT1dOOgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gaWRlbnRpZnkgYnVzIHdpZHRoXG4iLCBkZXYtPm5hbWUpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWU7CisKKwljYXNlIEJVU184OgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBmb3VuZCwgYnV0IGlzIGFuIHVuc3VwcG9ydGVkICIKKwkJCSI4LWJpdCBjYXJkXG4iLCBkZXYtPm5hbWUsIGRhdGEtPm5hbWUpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWU7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoZXRoZXIzX2luaXRfMihkZXYpKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZTsKKwl9CisKKwlkZXYtPm9wZW4JCT0gZXRoZXIzX29wZW47CisJZGV2LT5zdG9wCQk9IGV0aGVyM19jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IGV0aGVyM19zZW5kcGFja2V0OworCWRldi0+Z2V0X3N0YXRzCQk9IGV0aGVyM19nZXRzdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdAk9IGV0aGVyM19zZXRtdWx0aWNhc3RsaXN0OworCWRldi0+dHhfdGltZW91dAkJPSBldGhlcjNfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gNSAqIEhaIC8gMTAwOworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCkKKwkJZ290byBmcmVlOworCisJcHJpbnRrKCIlczogJXMgaW4gc2xvdCAlZCwgIiwgZGV2LT5uYW1lLCBkYXRhLT5uYW1lLCBlYy0+c2xvdF9ubyk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVjIiwgZGV2LT5kZXZfYWRkcltpXSwgaSA9PSA1ID8gJ1xuJyA6ICc6Jyk7CisKKwllY2FyZF9zZXRfZHJ2ZGF0YShlYywgZGV2KTsKKwlyZXR1cm4gMDsKKworIGZyZWU6CisJaWYgKHByaXYoZGV2KS0+YmFzZSkKKwkJaW91bm1hcChwcml2KGRldiktPmJhc2UpOworCWZyZWVfbmV0ZGV2KGRldik7CisgcmVsZWFzZToKKwllY2FyZF9yZWxlYXNlX3Jlc291cmNlcyhlYyk7Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBldGhlcjNfcmVtb3ZlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGVjYXJkX2dldF9kcnZkYXRhKGVjKTsKKworCWVjYXJkX3NldF9kcnZkYXRhKGVjLCBOVUxMKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaW91bm1hcChwcml2KGRldiktPmJhc2UpOworCWZyZWVfbmV0ZGV2KGRldik7CisJZWNhcmRfcmVsZWFzZV9yZXNvdXJjZXMoZWMpOworfQorCitzdGF0aWMgc3RydWN0IGV0aGVyM19kYXRhIGV0aGVyMyA9IHsKKwkubmFtZQkJPSAiZXRoZXIzIiwKKwkuYmFzZV9vZmZzZXQJPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBldGhlcjNfZGF0YSBldGhlcmIgPSB7CisJLm5hbWUJCT0gImV0aGVyYiIsCisJLmJhc2Vfb2Zmc2V0CT0gMHg4MDAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVjYXJkX2lkIGV0aGVyM19pZHNbXSA9IHsKKwl7IE1BTlVfQU5UMiwgUFJPRF9BTlRfRVRIRVIzLCAmZXRoZXIzIH0sCisJeyBNQU5VX0FOVCwgIFBST0RfQU5UX0VUSEVSMywgJmV0aGVyMyB9LAorCXsgTUFOVV9BTlQsICBQUk9EX0FOVF9FVEhFUkIsICZldGhlcmIgfSwKKwl7IDB4ZmZmZiwgMHhmZmZmIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZWNhcmRfZHJpdmVyIGV0aGVyM19kcml2ZXIgPSB7CisJLnByb2JlCQk9IGV0aGVyM19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGV0aGVyM19yZW1vdmUpLAorCS5pZF90YWJsZQk9IGV0aGVyM19pZHMsCisJLmRydiA9IHsKKwkJLm5hbWUJPSAiZXRoZXIzIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZXRoZXIzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZWNhcmRfcmVnaXN0ZXJfZHJpdmVyKCZldGhlcjNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV0aGVyM19leGl0KHZvaWQpCit7CisJZWNhcmRfcmVtb3ZlX2RyaXZlcigmZXRoZXIzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGV0aGVyM19pbml0KTsKK21vZHVsZV9leGl0KGV0aGVyM19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyMy5oIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MjFhM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXIzLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9hY29ybi9uZXQvZXRoZXIzLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgbmV0d29yayBkcml2ZXIgZm9yIEFjb3JuL0FOVCBFdGhlcjMgY2FyZHMKKyAqLworCisjaWZuZGVmIF9MSU5VWF9ldGhlcjNfSAorI2RlZmluZSBfTElOVVhfZXRoZXIzX0gKKworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnLiBkZWJ1ZyBmbGFnczogKi8KKyNkZWZpbmUgREVCVUdfVFgJIDIKKyNkZWZpbmUgREVCVUdfUlgJIDQKKyNkZWZpbmUgREVCVUdfSU5UCSA4CisjZGVmaW5lIERFQlVHX0lDCTE2CisjaWZuZGVmIE5FVF9ERUJVRworI2RlZmluZSBORVRfREVCVUcgCTAKKyNlbmRpZgorCisjZGVmaW5lIHByaXYoZGV2KQkoKHN0cnVjdCBkZXZfcHJpdiAqKW5ldGRldl9wcml2KGRldikpCisKKy8qIENvbW1hbmQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgJiBiaXRzICovCisjZGVmaW5lIFJFR19DT01NQU5ECQkocHJpdihkZXYpLT5zZWVxICsgMHgwMDAwKQorI2RlZmluZSBDTURfRU5JTlRETUEJCTB4MDAwMQorI2RlZmluZSBDTURfRU5JTlRSWAkJMHgwMDAyCisjZGVmaW5lIENNRF9FTklOVFRYCQkweDAwMDQKKyNkZWZpbmUgQ01EX0VOSU5UQlVGV0lOCQkweDAwMDgKKyNkZWZpbmUgQ01EX0FDS0lOVERNQQkJMHgwMDEwCisjZGVmaW5lIENNRF9BQ0tJTlRSWAkJMHgwMDIwCisjZGVmaW5lIENNRF9BQ0tJTlRUWAkJMHgwMDQwCisjZGVmaW5lIENNRF9BQ0tJTlRCVUZXSU4JMHgwMDgwCisjZGVmaW5lIENNRF9ETUFPTgkJMHgwMTAwCisjZGVmaW5lIENNRF9SWE9OCQkweDAyMDAKKyNkZWZpbmUgQ01EX1RYT04JCTB4MDQwMAorI2RlZmluZSBDTURfRE1BT0ZGCQkweDA4MDAKKyNkZWZpbmUgQ01EX1JYT0ZGCQkweDEwMDAKKyNkZWZpbmUgQ01EX1RYT0ZGCQkweDIwMDAKKyNkZWZpbmUgQ01EX0ZJRk9SRUFECQkweDQwMDAKKyNkZWZpbmUgQ01EX0ZJRk9XUklURQkJMHg4MDAwCisKKy8qIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBSRUdfU1RBVFVTCQkocHJpdihkZXYpLT5zZWVxICsgMHgwMDAwKQorI2RlZmluZSBTVEFUX0VOSU5UU1RBVAkJMHgwMDAxCisjZGVmaW5lIFNUQVRfRU5JTlRSWAkJMHgwMDAyCisjZGVmaW5lIFNUQVRfRU5JTlRUWAkJMHgwMDA0CisjZGVmaW5lIFNUQVRfRU5JTlRCVUZXSU4JMHgwMDA4CisjZGVmaW5lIFNUQVRfSU5URE1BCQkweDAwMTAKKyNkZWZpbmUgU1RBVF9JTlRSWAkJMHgwMDIwCisjZGVmaW5lIFNUQVRfSU5UVFgJCTB4MDA0MAorI2RlZmluZSBTVEFUX0lOVEJVRldJTgkJMHgwMDgwCisjZGVmaW5lIFNUQVRfRE1BT04JCTB4MDEwMAorI2RlZmluZSBTVEFUX1JYT04JCTB4MDIwMAorI2RlZmluZSBTVEFUX1RYT04JCTB4MDQwMAorI2RlZmluZSBTVEFUX0ZJRk9GVUxMCQkweDIwMDAKKyNkZWZpbmUgU1RBVF9GSUZPRU1QVFkJCTB4NDAwMAorI2RlZmluZSBTVEFUX0ZJRk9ESVIJCTB4ODAwMAorCisvKiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgUkVHX0NPTkZJRzEJCShwcml2KGRldiktPnNlZXEgKyAweDAwNDApCisjZGVmaW5lIENGRzFfQlVGU0VMU1RBVDAJMHgwMDAwCisjZGVmaW5lIENGRzFfQlVGU0VMU1RBVDEJMHgwMDAxCisjZGVmaW5lIENGRzFfQlVGU0VMU1RBVDIJMHgwMDAyCisjZGVmaW5lIENGRzFfQlVGU0VMU1RBVDMJMHgwMDAzCisjZGVmaW5lIENGRzFfQlVGU0VMU1RBVDQJMHgwMDA0CisjZGVmaW5lIENGRzFfQlVGU0VMU1RBVDUJMHgwMDA1CisjZGVmaW5lIENGRzFfQUREUlBST00JCTB4MDAwNgorI2RlZmluZSBDRkcxX1RSQU5TRU5ECQkweDAwMDcKKyNkZWZpbmUgQ0ZHMV9MT0NCVUZNRU0JCTB4MDAwOAorI2RlZmluZSBDRkcxX0lOVFZFQ1RPUgkJMHgwMDA5CisjZGVmaW5lIENGRzFfUkVDVlNQRUNPTkxZCTB4MDAwMAorI2RlZmluZSBDRkcxX1JFQ1ZTUEVDQlJPQUQJMHg0MDAwCisjZGVmaW5lIENGRzFfUkVDVlNQRUNCUk1VTFRJCTB4ODAwMAorI2RlZmluZSBDRkcxX1JFQ1ZQUk9NSVNDCTB4QzAwMAorCisvKiBUaGUgZm9sbG93aW5nIGFyZW4ndCBpbiA4MDA0ICovCisjZGVmaW5lIENGRzFfRE1BQlVSU1RDT05UCTB4MDAwMAorI2RlZmluZSBDRkcxX0RNQUJVUlNUODAwTlMJMHgwMDEwCisjZGVmaW5lIENGRzFfRE1BQlVSU1QxNjAwTlMJMHgwMDIwCisjZGVmaW5lIENGRzFfRE1BQlVSU1QzMjAwTlMJMHgwMDMwCisjZGVmaW5lIENGRzFfRE1BQlVSU1QxCQkweDAwMDAKKyNkZWZpbmUgQ0ZHMV9ETUFCVVJTVDQJCTB4MDA0MAorI2RlZmluZSBDRkcxX0RNQUJVUlNUOAkJMHgwMDgwCisjZGVmaW5lIENGRzFfRE1BQlVSU1QxNgkJMHgwMEMwCisjZGVmaW5lIENGRzFfUkVDVkNPTVBTVEFUMAkweDAxMDAKKyNkZWZpbmUgQ0ZHMV9SRUNWQ09NUFNUQVQxCTB4MDIwMAorI2RlZmluZSBDRkcxX1JFQ1ZDT01QU1RBVDIJMHgwNDAwCisjZGVmaW5lIENGRzFfUkVDVkNPTVBTVEFUMwkweDA4MDAKKyNkZWZpbmUgQ0ZHMV9SRUNWQ09NUFNUQVQ0CTB4MTAwMAorI2RlZmluZSBDRkcxX1JFQ1ZDT01QU1RBVDUJMHgyMDAwCisKKy8qIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMiAqLworI2RlZmluZSBSRUdfQ09ORklHMgkJKHByaXYoZGV2KS0+c2VlcSArIDB4MDA4MCkKKyNkZWZpbmUgQ0ZHMl9CWVRFU1dBUAkJMHgwMDAxCisjZGVmaW5lIENGRzJfRVJSRU5DUkMJCTB4MDAwOAorI2RlZmluZSBDRkcyX0VSUkVORFJJQkJMRQkweDAwMTAKKyNkZWZpbmUgQ0ZHMl9FUlJTSE9SVEZSQU1FCTB4MDAyMAorI2RlZmluZSBDRkcyX1NMT1RTRUxFQ1QJCTB4MDA0MAorI2RlZmluZSBDRkcyX1BSRUFNU0VMRUNUCTB4MDA4MAorI2RlZmluZSBDRkcyX0FERFJMRU5HVEgJCTB4MDEwMAorI2RlZmluZSBDRkcyX1JFQ1ZDUkMJCTB4MDIwMAorI2RlZmluZSBDRkcyX1hNSVROT0NSQwkJMHgwNDAwCisjZGVmaW5lIENGRzJfTE9PUEJBQ0sJCTB4MDgwMAorI2RlZmluZSBDRkcyX0NUUkxPCQkweDEwMDAKKyNkZWZpbmUgQ0ZHMl9SRVNFVAkJMHg4MDAwCisKKyNkZWZpbmUgUkVHX1JFQ1ZFTkQJCShwcml2KGRldiktPnNlZXEgKyAweDAwYzApCisKKyNkZWZpbmUgUkVHX0JVRldJTgkJKHByaXYoZGV2KS0+c2VlcSArIDB4MDEwMCkKKworI2RlZmluZSBSRUdfUkVDVlBUUgkJKHByaXYoZGV2KS0+c2VlcSArIDB4MDE0MCkKKworI2RlZmluZSBSRUdfVFJBTlNNSVRQVFIJCShwcml2KGRldiktPnNlZXEgKyAweDAxODApCisKKyNkZWZpbmUgUkVHX0RNQUFERFIJCShwcml2KGRldiktPnNlZXEgKyAweDAxYzApCisKKy8qCisgKiBDYXJkcyB0cmFuc21pdC9yZWNlaXZlIGhlYWRlcnMKKyAqLworI2RlZmluZSBUWF9ORVhUCQkJKDB4ZmZmZikKKyNkZWZpbmUgVFhIRFJfRU5CQUJCTEVJTlQJKDEgPDwgMTYpCisjZGVmaW5lIFRYSERSX0VOQ09MTElTSU9OSU5UCSgxIDw8IDE3KQorI2RlZmluZSBUWEhEUl9FTjE2Q09MTElTSU9OCSgxIDw8IDE4KQorI2RlZmluZSBUWEhEUl9FTlNVQ0NFU1MJCSgxIDw8IDE5KQorI2RlZmluZSBUWEhEUl9EQVRBRk9MTE9XUwkoMSA8PCAyMSkKKyNkZWZpbmUgVFhIRFJfQ0hBSU5DT05USU5VRQkoMSA8PCAyMikKKyNkZWZpbmUgVFhIRFJfVFJBTlNNSVQJCSgxIDw8IDIzKQorI2RlZmluZSBUWFNUQVRfQkFCQkxFRAkJKDEgPDwgMjQpCisjZGVmaW5lIFRYU1RBVF9DT0xMSVNJT04JKDEgPDwgMjUpCisjZGVmaW5lIFRYU1RBVF8xNkNPTExJU0lPTlMJKDEgPDwgMjYpCisjZGVmaW5lIFRYU1RBVF9ET05FCQkoMSA8PCAzMSkKKworI2RlZmluZSBSWF9ORVhUCQkJKDB4ZmZmZikKKyNkZWZpbmUgUlhIRFJfQ0hBSU5DT05USU5VRQkoMSA8PCA2KQorI2RlZmluZSBSWEhEUl9SRUNFSVZFCQkoMSA8PCA3KQorI2RlZmluZSBSWFNUQVRfT1ZFUlNJWkUJCSgxIDw8IDgpCisjZGVmaW5lIFJYU1RBVF9DUkNFUlJPUgkJKDEgPDwgOSkKKyNkZWZpbmUgUlhTVEFUX0RSSUJCTEVFUlJPUgkoMSA8PCAxMCkKKyNkZWZpbmUgUlhTVEFUX1NIT1JUUEFDS0VUCSgxIDw8IDExKQorI2RlZmluZSBSWFNUQVRfRE9ORQkJKDEgPDwgMTUpCisKKworI2RlZmluZSBUWF9TVEFSVAkweDAwMDAKKyNkZWZpbmUgVFhfRU5ECQkweDYwMDAKKyNkZWZpbmUgUlhfU1RBUlQJMHg2MDAwCisjZGVmaW5lIFJYX0xFTgkJMHhBMDAwCisjZGVmaW5lIFJYX0VORAkJMHgxMDAwMAorLyogbXVzdCBiZSBhIHBvd2VyIG9mIDIgYW5kIGdyZWF0ZXIgdGhhbiBNQVhfVFhfQlVGRkVSRUQgKi8KKyNkZWZpbmUgTUFYX1RYRUQJMTYKKyNkZWZpbmUgTUFYX1RYX0JVRkZFUkVECTEwCisKK3N0cnVjdCBkZXZfcHJpdiB7CisgICAgdm9pZCBfX2lvbWVtICpiYXNlOworICAgIHZvaWQgX19pb21lbSAqc2VlcTsKKyAgICBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBjb21tYW5kOworCXVuc2lnbmVkIGludCBjb25maWcxOworCXVuc2lnbmVkIGludCBjb25maWcyOworICAgIH0gcmVnczsKKyAgICB1bnNpZ25lZCBjaGFyIHR4X2hlYWQ7CQkvKiBidWZmZXIgbnIgdG8gaW5zZXJ0IG5leHQgcGFja2V0CSAqLworICAgIHVuc2lnbmVkIGNoYXIgdHhfdGFpbDsJCS8qIGJ1ZmZlciBuciBvZiB0cmFuc21pdHRpbmcgcGFja2V0CSAqLworICAgIHVuc2lnbmVkIGludCByeF9oZWFkOwkJLyogYWRkcmVzcyB0byBmZXRjaCBuZXh0IHBhY2tldCBmcm9tCSAqLworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworICAgIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworICAgIGludCBicm9rZW47CQkJCS8qIDAgPSBvaywgMSA9IHNvbWV0aGluZyB3ZW50IHdyb25nCSAqLworfTsKKworc3RydWN0IGV0aGVyM19kYXRhIHsKKwljb25zdCBjaGFyIG5hbWVbOF07CisJdW5zaWduZWQgbG9uZyBiYXNlX29mZnNldDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyaC5jIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmEyODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXJoLmMKQEAgLTAsMCArMSw4NjIgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9hY29ybi9uZXQvZXRoZXJoLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOUzgzOTAgSS1jdWJlZCBFdGhlckggYW5kIEFOVCBFdGhlck0gc3BlY2lmaWMgZHJpdmVyCisgKiBUaGFua3MgdG8gSS1DdWJlZCBmb3IgaW5mb3JtYXRpb24gb24gdGhlaXIgY2FyZHMuCisgKiBFdGhlck0gY29udmVyc2lvbiAoQykgMTk5OSBDaHJpcyBLZW1wIGFuZCBUaW0gV2F0dGVydG9uCisgKiBFdGhlck0gaW50ZWdyYXRpb24gKEMpIDIwMDAgQWxlcGggT25lIEx0ZCAoVGFrLVNoaW5nIENoYW4pCisgKiBFdGhlck0gaW50ZWdyYXRpb24gcmUtZW5naW5lZXJlZCBieSBSdXNzZWxsIEtpbmcuCisgKgorICogQ2hhbmdlbG9nOgorICogIDA4LTEyLTE5OTYJUk1LCTEuMDAJQ3JlYXRlZAorICoJCVJNSwkxLjAzCUFkZGVkIHN1cHBvcnQgZm9yIEV0aGVyTGFuNTAwIGNhcmRzCisgKiAgMjMtMTEtMTk5NwlSTUsJMS4wNAlBZGRlZCBtZWRpYSBhdXRvZGV0ZWN0aW9uCisgKiAgMTYtMDQtMTk5OAlSTUsJMS4wNQlJbXByb3ZlZCBtZWRpYSBhdXRvZGV0ZWN0aW9uCisgKiAgMTAtMDItMjAwMAlSTUsJMS4wNglVcGRhdGVkIGZvciAyLjMuNDMKKyAqICAxMy0wNS0yMDAwCVJNSwkxLjA3CVVwZGF0ZWQgZm9yIDIuMy45OS1wcmU4CisgKiAgMTItMTAtMTk5OSAgQ0svVEVXCQlFdGhlck0gZHJpdmVyIGZpcnN0IHJlbGVhc2UKKyAqICAyMS0xMi0yMDAwCVRUQwkJRXRoZXJIL0V0aGVyTSBpbnRlZ3JhdGlvbgorICogIDI1LTEyLTIwMDAJUk1LCTEuMDgJQ2xlYW4gaW50ZWdyYXRpb24gb2YgRXRoZXJNIGludG8gdGhpcyBkcml2ZXIuCisgKiAgMDMtMDEtMjAwMglSTUsJMS4wOQlBbHdheXMgZW5hYmxlIElSUXMgaWYgd2UncmUgaW4gdGhlIG5pYyBzbG90LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9lY2FyZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgIi4uLzgzOTAuaCIKKworI2RlZmluZSBORVRfREVCVUcgIDAKKyNkZWZpbmUgREVCVUdfSU5JVCAyCisKKyNkZWZpbmUgRFJWX05BTUUJImV0aGVyaCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMTEiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV0X2RlYnVnID0gTkVUX0RFQlVHOworCitzdHJ1Y3QgZXRoZXJoX3ByaXYgeworCXZvaWQgX19pb21lbQkqaW9jX2Zhc3Q7CisJdm9pZCBfX2lvbWVtCSptZW1jOworCXZvaWQgX19pb21lbQkqZG1hX2Jhc2U7CisJdW5zaWduZWQgaW50CWlkOworCXZvaWQgX19pb21lbQkqY3RybF9wb3J0OworCXVuc2lnbmVkIGNoYXIJY3RybDsKKwl1MzIJCXN1cHBvcnRlZDsKK307CisKK3N0cnVjdCBldGhlcmhfZGF0YSB7CisJdW5zaWduZWQgbG9uZwluczgzOTBfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcJZGF0YXBvcnRfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcJY3RybHBvcnRfb2Zmc2V0OworCWludAkJY3RybF9pb2M7CisJY29uc3QgY2hhcgluYW1lWzE2XTsKKwl1MzIJCXN1cHBvcnRlZDsKKwl1bnNpZ25lZCBjaGFyCXR4X3N0YXJ0X3BhZ2U7CisJdW5zaWduZWQgY2hhcglzdG9wX3BhZ2U7Cit9OworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiRXRoZXJIL0V0aGVyTSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPQorCSJFdGhlckgvRXRoZXJNIERyaXZlciAoYykgMjAwMi0yMDA0IFJ1c3NlbGwgS2luZyAiIERSVl9WRVJTSU9OICJcbiI7CisKKyNkZWZpbmUgRVRIRVJINTAwX0RBVEFQT1JUCTB4ODAwCS8qIE1FTUMgKi8KKyNkZWZpbmUgRVRIRVJINTAwX05TODM5MAkweDAwMAkvKiBNRU1DICovCisjZGVmaW5lIEVUSEVSSDUwMF9DVFJMUE9SVAkweDgwMAkvKiBJT0MgICovCisKKyNkZWZpbmUgRVRIRVJINjAwX0RBVEFQT1JUCTB4MDQwCS8qIE1FTUMgKi8KKyNkZWZpbmUgRVRIRVJINjAwX05TODM5MAkweDgwMAkvKiBNRU1DICovCisjZGVmaW5lIEVUSEVSSDYwMF9DVFJMUE9SVAkweDIwMAkvKiBNRU1DICovCisKKyNkZWZpbmUgRVRIRVJIX0NQX0lFCQkxCisjZGVmaW5lIEVUSEVSSF9DUF9JRgkJMgorI2RlZmluZSBFVEhFUkhfQ1BfSEVBUlRCRUFUCTIKKworI2RlZmluZSBFVEhFUkhfVFhfU1RBUlRfUEFHRQkxCisjZGVmaW5lIEVUSEVSSF9TVE9QX1BBR0UJMTI3CisKKy8qCisgKiBUaGVzZSBjYW1lIGZyb20gQ0svVEVXCisgKi8KKyNkZWZpbmUgRVRIRVJNX0RBVEFQT1JUCQkweDIwMAkvKiBNRU1DICovCisjZGVmaW5lIEVUSEVSTV9OUzgzOTAJCTB4ODAwCS8qIE1FTUMgKi8KKyNkZWZpbmUgRVRIRVJNX0NUUkxQT1JUCQkweDIzYwkvKiBNRU1DICovCisKKyNkZWZpbmUgRVRIRVJNX1RYX1NUQVJUX1BBR0UJNjQKKyNkZWZpbmUgRVRIRVJNX1NUT1BfUEFHRQkxMjcKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgZXRoZXJoX3ByaXYoZGV2KSBcCisgKChzdHJ1Y3QgZXRoZXJoX3ByaXYgKikoKChjaGFyICopbmV0ZGV2X3ByaXYoZGV2KSkgKyBzaXplb2Yoc3RydWN0IGVpX2RldmljZSkpKQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXRoZXJoX3NldF9jdHJsKHN0cnVjdCBldGhlcmhfcHJpdiAqZWgsIHVuc2lnbmVkIGNoYXIgbWFzaykKK3sKKwl1bnNpZ25lZCBjaGFyIGN0cmwgPSBlaC0+Y3RybCB8IG1hc2s7CisJZWgtPmN0cmwgPSBjdHJsOworCXdyaXRlYihjdHJsLCBlaC0+Y3RybF9wb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV0aGVyaF9jbHJfY3RybChzdHJ1Y3QgZXRoZXJoX3ByaXYgKmVoLCB1bnNpZ25lZCBjaGFyIG1hc2spCit7CisJdW5zaWduZWQgY2hhciBjdHJsID0gZWgtPmN0cmwgJiB+bWFzazsKKwllaC0+Y3RybCA9IGN0cmw7CisJd3JpdGViKGN0cmwsIGVoLT5jdHJsX3BvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBldGhlcmhfZ2V0X3N0YXQoc3RydWN0IGV0aGVyaF9wcml2ICplaCkKK3sKKwlyZXR1cm4gcmVhZGIoZWgtPmN0cmxfcG9ydCk7Cit9CisKKworCisKK3N0YXRpYyB2b2lkIGV0aGVyaF9pcnFfZW5hYmxlKGVjYXJkX3QgKmVjLCBpbnQgaXJxbnIpCit7CisJc3RydWN0IGV0aGVyaF9wcml2ICplaCA9IGVjLT5pcnFfZGF0YTsKKworCWV0aGVyaF9zZXRfY3RybChlaCwgRVRIRVJIX0NQX0lFKTsKK30KKworc3RhdGljIHZvaWQgZXRoZXJoX2lycV9kaXNhYmxlKGVjYXJkX3QgKmVjLCBpbnQgaXJxbnIpCit7CisJc3RydWN0IGV0aGVyaF9wcml2ICplaCA9IGVjLT5pcnFfZGF0YTsKKworCWV0aGVyaF9jbHJfY3RybChlaCwgRVRIRVJIX0NQX0lFKTsKK30KKworc3RhdGljIGV4cGFuc2lvbmNhcmRfb3BzX3QgZXRoZXJoX29wcyA9IHsKKwkuaXJxZW5hYmxlCT0gZXRoZXJoX2lycV9lbmFibGUsCisJLmlycWRpc2FibGUJPSBldGhlcmhfaXJxX2Rpc2FibGUsCit9OworCisKKworCitzdGF0aWMgdm9pZAorZXRoZXJoX3NldGlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX2lvbWVtICphZGRyOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogc2V0IHRoZSBpbnRlcmZhY2UgdHlwZSAqLworCXN3aXRjaCAoZXRoZXJoX3ByaXYoZGV2KS0+aWQpIHsKKwljYXNlIFBST0RfSTNfRVRIRVJMQU42MDA6CisJY2FzZSBQUk9EX0kzX0VUSEVSTEFONjAwQToKKwkJYWRkciA9ICh2b2lkICopZGV2LT5iYXNlX2FkZHIgKyBFTjBfUkNOVEhJOworCisJCXN3aXRjaCAoZGV2LT5pZl9wb3J0KSB7CisJCWNhc2UgSUZfUE9SVF8xMEJBU0UyOgorCQkJd3JpdGViKChyZWFkYihhZGRyKSAmIDB4ZjgpIHwgMSwgYWRkcik7CisJCQlicmVhazsKKwkJY2FzZSBJRl9QT1JUXzEwQkFTRVQ6CisJCQl3cml0ZWIoKHJlYWRiKGFkZHIpICYgMHhmOCksIGFkZHIpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBST0RfSTNfRVRIRVJMQU41MDA6CisJCXN3aXRjaCAoZGV2LT5pZl9wb3J0KSB7CisJCWNhc2UgSUZfUE9SVF8xMEJBU0UyOgorCQkJZXRoZXJoX2Nscl9jdHJsKGV0aGVyaF9wcml2KGRldiksIEVUSEVSSF9DUF9JRik7CisJCQlicmVhazsKKworCQljYXNlIElGX1BPUlRfMTBCQVNFVDoKKwkJCWV0aGVyaF9zZXRfY3RybChldGhlcmhfcHJpdihkZXYpLCBFVEhFUkhfQ1BfSUYpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQKK2V0aGVyaF9nZXRpZnN0YXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICphZGRyOworCWludCBzdGF0ID0gMDsKKworCXN3aXRjaCAoZXRoZXJoX3ByaXYoZGV2KS0+aWQpIHsKKwljYXNlIFBST0RfSTNfRVRIRVJMQU42MDA6CisJY2FzZSBQUk9EX0kzX0VUSEVSTEFONjAwQToKKwkJYWRkciA9ICh2b2lkICopZGV2LT5iYXNlX2FkZHIgKyBFTjBfUkNOVEhJOworCQlzd2l0Y2ggKGRldi0+aWZfcG9ydCkgeworCQljYXNlIElGX1BPUlRfMTBCQVNFMjoKKwkJCXN0YXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgSUZfUE9SVF8xMEJBU0VUOgorCQkJc3RhdCA9IHJlYWRiKGFkZHIpICYgNDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQUk9EX0kzX0VUSEVSTEFONTAwOgorCQlzd2l0Y2ggKGRldi0+aWZfcG9ydCkgeworCQljYXNlIElGX1BPUlRfMTBCQVNFMjoKKwkJCXN0YXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgSUZfUE9SVF8xMEJBU0VUOgorCQkJc3RhdCA9IGV0aGVyaF9nZXRfc3RhdChldGhlcmhfcHJpdihkZXYpKSAmIEVUSEVSSF9DUF9IRUFSVEJFQVQ7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN0YXQgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdCAhPSAwOworfQorCisvKgorICogQ29uZmlndXJlIHRoZSBpbnRlcmZhY2UuICBOb3RlIHRoYXQgd2UgaWdub3JlIHRoZSBvdGhlcgorICogcGFydHMgb2YgaWZtYXAsIHNpbmNlIGl0cyBtb3N0bHkgbWVhbmluZ2xlc3MgZm9yIHRoaXMgZHJpdmVyLgorICovCitzdGF0aWMgaW50IGV0aGVyaF9zZXRfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQoreworCXN3aXRjaCAobWFwLT5wb3J0KSB7CisJY2FzZSBJRl9QT1JUXzEwQkFTRTI6CisJY2FzZSBJRl9QT1JUXzEwQkFTRVQ6CisJCS8qCisJCSAqIElmIHRoZSB1c2VyIGV4cGxpY2l0bHkgc2V0cyB0aGUgaW50ZXJmYWNlCisJCSAqIG1lZGlhIHR5cGUsIHR1cm4gb2ZmIGF1dG9tZWRpYSBkZXRlY3Rpb24uCisJCSAqLworCQlkZXYtPmZsYWdzICY9IH5JRkZfQVVUT01FRElBOworCQlkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXRoZXJoX3NldGlmKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlc2V0IHRoZSA4MzkwIChoYXJkIHJlc2V0KS4gIE5vdGUgdGhhdCB3ZSBjYW4ndCBhY3R1YWxseSBkbyB0aGlzLgorICovCitzdGF0aWMgdm9pZAorZXRoZXJoX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqYWRkciA9ICh2b2lkICopZGV2LT5iYXNlX2FkZHI7CisKKwl3cml0ZWIoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgYWRkcik7CisKKwkvKgorCSAqIFNlZSBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgaW50ZXJmYWNlIHR5cGUuCisJICogTm90ZSB0aGF0IHdlIHVzZSAnaW50ZXJmYWNlX251bScgYXMgYSBmbGFnCisJICogdG8gaW5kaWNhdGUgdGhhdCB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgbWVkaWEuCisJICovCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQVVUT01FRElBICYmIGVpX2xvY2FsLT5pbnRlcmZhY2VfbnVtKSB7CisJCWVpX2xvY2FsLT5pbnRlcmZhY2VfbnVtID0gMDsKKworCQlpZiAoZGV2LT5pZl9wb3J0ID09IElGX1BPUlRfMTBCQVNFVCkKKwkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTBCQVNFMjsKKwkJZWxzZQorCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMEJBU0VUOworCisJCWV0aGVyaF9zZXRpZihkZXYpOworCX0KK30KKworLyoKKyAqIFdyaXRlIGEgYmxvY2sgb2YgZGF0YSBvdXQgdG8gdGhlIDgzOTAKKyAqLworc3RhdGljIHZvaWQKK2V0aGVyaF9ibG9ja19vdXRwdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSkKK3sKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBkbWFfc3RhcnQ7CisJdm9pZCBfX2lvbWVtICpkbWFfYmFzZSwgKmFkZHI7CisKKwlpZiAoZWlfbG9jYWwtPmRtYWluZykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gZXRoZXJoX2Jsb2NrX2lucHV0OiAiCisJCQkiIERNQXN0YXQgJWQgaXJxbG9jayAlZFxuIiwgZGV2LT5uYW1lLAorCQkJZWlfbG9jYWwtPmRtYWluZywgZWlfbG9jYWwtPmlycWxvY2spOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHJvdW5kIG51bWJlciBvZiBieXRlcyBpZiB3ZSdyZSBpbiB3b3JkIG1vZGUuCisJICovCisJaWYgKGNvdW50ICYgMSAmJiBlaV9sb2NhbC0+d29yZDE2KQorCQljb3VudCsrOworCisJZWlfbG9jYWwtPmRtYWluZyA9IDE7CisKKwlhZGRyID0gKHZvaWQgKilkZXYtPmJhc2VfYWRkcjsKKwlkbWFfYmFzZSA9IGV0aGVyaF9wcml2KGRldiktPmRtYV9iYXNlOworCisJY291bnQgPSAoY291bnQgKyAxKSAmIH4xOworCXdyaXRlYiAoRTgzOTBfTk9ETUEgfCBFODM5MF9QQUdFMCB8IEU4MzkwX1NUQVJULCBhZGRyICsgRTgzOTBfQ01EKTsKKworCXdyaXRlYiAoMHg0MiwgYWRkciArIEVOMF9SQ05UTE8pOworCXdyaXRlYiAoMHgwMCwgYWRkciArIEVOMF9SQ05USEkpOworCXdyaXRlYiAoMHg0MiwgYWRkciArIEVOMF9SU0FSTE8pOworCXdyaXRlYiAoMHgwMCwgYWRkciArIEVOMF9SU0FSSEkpOworCXdyaXRlYiAoRTgzOTBfUlJFQUQgfCBFODM5MF9TVEFSVCwgYWRkciArIEU4MzkwX0NNRCk7CisKKwl1ZGVsYXkgKDEpOworCisJd3JpdGViIChFTklTUl9SREMsIGFkZHIgKyBFTjBfSVNSKTsKKwl3cml0ZWIgKGNvdW50LCBhZGRyICsgRU4wX1JDTlRMTyk7CisJd3JpdGViIChjb3VudCA+PiA4LCBhZGRyICsgRU4wX1JDTlRISSk7CisJd3JpdGViICgwLCBhZGRyICsgRU4wX1JTQVJMTyk7CisJd3JpdGViIChzdGFydF9wYWdlLCBhZGRyICsgRU4wX1JTQVJISSk7CisJd3JpdGViIChFODM5MF9SV1JJVEUgfCBFODM5MF9TVEFSVCwgYWRkciArIEU4MzkwX0NNRCk7CisKKwlpZiAoZWlfbG9jYWwtPndvcmQxNikKKwkJd3JpdGVzdyAoZG1hX2Jhc2UsIGJ1ZiwgY291bnQgPj4gMSk7CisJZWxzZQorCQl3cml0ZXNiIChkbWFfYmFzZSwgYnVmLCBjb3VudCk7CisKKwlkbWFfc3RhcnQgPSBqaWZmaWVzOworCisJd2hpbGUgKChyZWFkYiAoYWRkciArIEVOMF9JU1IpICYgRU5JU1JfUkRDKSA9PSAwKQorCQlpZiAoamlmZmllcyAtIGRtYV9zdGFydCA+IDIqSFovMTAwKSB7IC8qIDIwbXMgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgVFggUkRDXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCQlldGhlcmhfcmVzZXQgKGRldik7CisJCQlOUzgzOTBfaW5pdCAoZGV2LCAxKTsKKwkJCWJyZWFrOworCQl9CisKKwl3cml0ZWIgKEVOSVNSX1JEQywgYWRkciArIEVOMF9JU1IpOworCWVpX2xvY2FsLT5kbWFpbmcgPSAwOworfQorCisvKgorICogUmVhZCBhIGJsb2NrIG9mIGRhdGEgZnJvbSB0aGUgODM5MAorICovCitzdGF0aWMgdm9pZAorZXRoZXJoX2Jsb2NrX2lucHV0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXZvaWQgX19pb21lbSAqZG1hX2Jhc2UsICphZGRyOworCisJaWYgKGVpX2xvY2FsLT5kbWFpbmcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BaW5nIGNvbmZsaWN0IGluIGV0aGVyaF9ibG9ja19pbnB1dDogIgorCQkJIiBETUFzdGF0ICVkIGlycWxvY2sgJWRcbiIsIGRldi0+bmFtZSwKKwkJCWVpX2xvY2FsLT5kbWFpbmcsIGVpX2xvY2FsLT5pcnFsb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWVpX2xvY2FsLT5kbWFpbmcgPSAxOworCisJYWRkciA9ICh2b2lkICopZGV2LT5iYXNlX2FkZHI7CisJZG1hX2Jhc2UgPSBldGhlcmhfcHJpdihkZXYpLT5kbWFfYmFzZTsKKworCWJ1ZiA9IHNrYi0+ZGF0YTsKKwl3cml0ZWIgKEU4MzkwX05PRE1BIHwgRTgzOTBfUEFHRTAgfCBFODM5MF9TVEFSVCwgYWRkciArIEU4MzkwX0NNRCk7CisJd3JpdGViIChjb3VudCwgYWRkciArIEVOMF9SQ05UTE8pOworCXdyaXRlYiAoY291bnQgPj4gOCwgYWRkciArIEVOMF9SQ05USEkpOworCXdyaXRlYiAocmluZ19vZmZzZXQsIGFkZHIgKyBFTjBfUlNBUkxPKTsKKwl3cml0ZWIgKHJpbmdfb2Zmc2V0ID4+IDgsIGFkZHIgKyBFTjBfUlNBUkhJKTsKKwl3cml0ZWIgKEU4MzkwX1JSRUFEIHwgRTgzOTBfU1RBUlQsIGFkZHIgKyBFODM5MF9DTUQpOworCisJaWYgKGVpX2xvY2FsLT53b3JkMTYpIHsKKwkJcmVhZHN3IChkbWFfYmFzZSwgYnVmLCBjb3VudCA+PiAxKTsKKwkJaWYgKGNvdW50ICYgMSkKKwkJCWJ1Zltjb3VudCAtIDFdID0gcmVhZGIgKGRtYV9iYXNlKTsKKwl9IGVsc2UKKwkJcmVhZHNiIChkbWFfYmFzZSwgYnVmLCBjb3VudCk7CisKKwl3cml0ZWIgKEVOSVNSX1JEQywgYWRkciArIEVOMF9JU1IpOworCWVpX2xvY2FsLT5kbWFpbmcgPSAwOworfQorCisvKgorICogUmVhZCBhIGhlYWRlciBmcm9tIHRoZSA4MzkwCisgKi8KK3N0YXRpYyB2b2lkCitldGhlcmhfZ2V0X2hlYWRlciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICpkbWFfYmFzZSwgKmFkZHI7CisKKwlpZiAoZWlfbG9jYWwtPmRtYWluZykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gZXRoZXJoX2dldF9oZWFkZXI6ICIKKwkJCSIgRE1Bc3RhdCAlZCBpcnFsb2NrICVkXG4iLCBkZXYtPm5hbWUsCisJCQllaV9sb2NhbC0+ZG1haW5nLCBlaV9sb2NhbC0+aXJxbG9jayk7CisJCXJldHVybjsKKwl9CisKKwllaV9sb2NhbC0+ZG1haW5nID0gMTsKKworCWFkZHIgPSAodm9pZCAqKWRldi0+YmFzZV9hZGRyOworCWRtYV9iYXNlID0gZXRoZXJoX3ByaXYoZGV2KS0+ZG1hX2Jhc2U7CisKKwl3cml0ZWIgKEU4MzkwX05PRE1BIHwgRTgzOTBfUEFHRTAgfCBFODM5MF9TVEFSVCwgYWRkciArIEU4MzkwX0NNRCk7CisJd3JpdGViIChzaXplb2YgKCpoZHIpLCBhZGRyICsgRU4wX1JDTlRMTyk7CisJd3JpdGViICgwLCBhZGRyICsgRU4wX1JDTlRISSk7CisJd3JpdGViICgwLCBhZGRyICsgRU4wX1JTQVJMTyk7CisJd3JpdGViIChyaW5nX3BhZ2UsIGFkZHIgKyBFTjBfUlNBUkhJKTsKKwl3cml0ZWIgKEU4MzkwX1JSRUFEIHwgRTgzOTBfU1RBUlQsIGFkZHIgKyBFODM5MF9DTUQpOworCisJaWYgKGVpX2xvY2FsLT53b3JkMTYpCisJCXJlYWRzdyAoZG1hX2Jhc2UsIGhkciwgc2l6ZW9mICgqaGRyKSA+PiAxKTsKKwllbHNlCisJCXJlYWRzYiAoZG1hX2Jhc2UsIGhkciwgc2l6ZW9mICgqaGRyKSk7CisKKwl3cml0ZWIgKEVOSVNSX1JEQywgYWRkciArIEVOMF9JU1IpOworCWVpX2xvY2FsLT5kbWFpbmcgPSAwOworfQorCisvKgorICogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpCisgKiBzb21ldGltZSBhZnRlciBib290aW5nIHdoZW4gdGhlICdpZmNvbmZpZycgcHJvZ3JhbSBpcyBydW4uCisgKgorICogVGhpcyByb3V0aW5lIHNob3VsZCBzZXQgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgorICogcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKKyAqIHRoZXJlIGlzIG5vbi1yZWJvb3Qgd2F5IHRvIHJlY292ZXIgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisgKi8KK3N0YXRpYyBpbnQKK2V0aGVyaF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIGV0aGVybmV0IE1BQyBhZGRyZXNzXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGFyZW4ndCBnb2luZyB0byBjaGFuZ2UgdGhlCisJICogbWVkaWEgdHlwZSBvbiB0aGUgbmV4dCByZXNldCAtIHdlIGFyZSBhYm91dCB0bworCSAqIGRvIGF1dG9tZWRpYSBtYW51YWxseSBub3cuCisJICovCisJZWlfbG9jYWwtPmludGVyZmFjZV9udW0gPSAwOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgZG9pbmcgYXV0b21lZGlhIGRldGVjdGlvbiwgZG8gaXQgbm93LgorCSAqIFRoaXMgaXMgbW9yZSByZWxpYWJsZSB0aGFuIHRoZSA4MzkwJ3MgZGV0ZWN0aW9uLgorCSAqLworCWlmIChkZXYtPmZsYWdzICYgSUZGX0FVVE9NRURJQSkgeworCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwQkFTRVQ7CisJCWV0aGVyaF9zZXRpZihkZXYpOworCQltZGVsYXkoMSk7CisJCWlmICghZXRoZXJoX2dldGlmc3RhdChkZXYpKSB7CisJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwQkFTRTI7CisJCQlldGhlcmhfc2V0aWYoZGV2KTsKKwkJfQorCX0gZWxzZQorCQlldGhlcmhfc2V0aWYoZGV2KTsKKworCWV0aGVyaF9yZXNldChkZXYpOworCWVpX29wZW4oZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhlIGludmVyc2Ugcm91dGluZSB0byBldGhlcmhfb3BlbigpLgorICovCitzdGF0aWMgaW50CitldGhlcmhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllaV9jbG9zZSAoZGV2KTsKKwlmcmVlX2lycSAoZGV2LT5pcnEsIGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbml0aWFsaXNhdGlvbgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBldGhlcmhfYmFubmVyKHZvaWQpCit7CisJc3RhdGljIGludCB2ZXJzaW9uX3ByaW50ZWQ7CisKKwlpZiAobmV0X2RlYnVnICYmIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBldGhlcm5ldCBhZGRyZXNzIHN0cmluZyBmcm9tIHRoZSBvbiBib2FyZCByb20uCisgKiBUaGlzIGlzIGFuIGFzY2lpIHN0cmluZy4uLgorICovCitzdGF0aWMgaW50IF9faW5pdCBldGhlcmhfYWRkcihjaGFyICphZGRyLCBzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCXN0cnVjdCBpbl9jaHVua19kaXIgY2Q7CisJY2hhciAqczsKKwkKKwlpZiAoIWVjYXJkX3JlYWRjaHVuaygmY2QsIGVjLCAweGY1LCAwKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gcmVhZCBwb2R1bGUgZGVzY3JpcHRpb24gc3RyaW5nXG4iLAorCQkgICAgICAgZWMtPmRldi5idXNfaWQpOworCQlnb3RvIG5vX2FkZHI7CisJfQorCisJcyA9IHN0cmNocihjZC5kLnN0cmluZywgJygnKTsKKwlpZiAocykgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQlhZGRyW2ldID0gc2ltcGxlX3N0cnRvdWwocyArIDEsICZzLCAweDEwKTsKKwkJCWlmICgqcyAhPSAoaSA9PSA1PyAnKScgOiAnOicpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gNikKKwkJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBwYXJzZSBNQUMgYWRkcmVzczogJXNcbiIsCisJICAgICAgIGVjLT5kZXYuYnVzX2lkLCBjZC5kLnN0cmluZyk7CisKKyBub19hZGRyOgorCXJldHVybiAtRU5PREVWOworfQorCisvKgorICogQ3JlYXRlIGFuIGV0aGVybmV0IGFkZHJlc3MgZnJvbSB0aGUgc3lzdGVtIHNlcmlhbCBudW1iZXIuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGV0aGVybV9hZGRyKGNoYXIgKmFkZHIpCit7CisJdW5zaWduZWQgaW50IHNlcmlhbDsKKworCWlmIChzeXN0ZW1fc2VyaWFsX2xvdyA9PSAwICYmIHN5c3RlbV9zZXJpYWxfaGlnaCA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNlcmlhbCA9IHN5c3RlbV9zZXJpYWxfbG93IHwgc3lzdGVtX3NlcmlhbF9oaWdoOworCisJYWRkclswXSA9IDA7CisJYWRkclsxXSA9IDA7CisJYWRkclsyXSA9IDB4YTQ7CisJYWRkclszXSA9IDB4MTAgKyAoc2VyaWFsID4+IDI0KTsKKwlhZGRyWzRdID0gc2VyaWFsID4+IDE2OworCWFkZHJbNV0gPSBzZXJpYWwgPj4gODsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXRoZXJoX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBkZXYtPmNsYXNzX2Rldi5kZXYtPmJ1c19pZCwKKwkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7Cit9CisKK3N0YXRpYyBpbnQgZXRoZXJoX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwljbWQtPnN1cHBvcnRlZAk9IGV0aGVyaF9wcml2KGRldiktPnN1cHBvcnRlZDsKKwljbWQtPnNwZWVkCT0gU1BFRURfMTA7CisJY21kLT5kdXBsZXgJPSBEVVBMRVhfSEFMRjsKKwljbWQtPnBvcnQJPSBkZXYtPmlmX3BvcnQgPT0gSUZfUE9SVF8xMEJBU0VUID8gUE9SVF9UUCA6IFBPUlRfQk5DOworCWNtZC0+YXV0b25lZwk9IGRldi0+ZmxhZ3MgJiBJRkZfQVVUT01FRElBID8gQVVUT05FR19FTkFCTEUgOiBBVVRPTkVHX0RJU0FCTEU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXRoZXJoX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzd2l0Y2ggKGNtZC0+YXV0b25lZykgeworCWNhc2UgQVVUT05FR19FTkFCTEU6CisJCWRldi0+ZmxhZ3MgfD0gSUZGX0FVVE9NRURJQTsKKwkJYnJlYWs7CisKKwljYXNlIEFVVE9ORUdfRElTQUJMRToKKwkJc3dpdGNoIChjbWQtPnBvcnQpIHsKKwkJY2FzZSBQT1JUX1RQOgorCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMEJBU0VUOworCQkJYnJlYWs7CisKKwkJY2FzZSBQT1JUX0JOQzoKKwkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTBCQVNFMjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlkZXYtPmZsYWdzICY9IH5JRkZfQVVUT01FRElBOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWV0aGVyaF9zZXRpZihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRoZXJoX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MJPSBldGhlcmhfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJPSBldGhlcmhfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwk9IGV0aGVyaF9nZXRfZHJ2aW5mbywKK307CisKK3N0YXRpYyB1MzIgZXRoZXJoX3JlZ29mZnNldHNbMTZdOworc3RhdGljIHUzMiBldGhlcm1fcmVnb2Zmc2V0c1sxNl07CisKK3N0YXRpYyBpbnQgX19pbml0CitldGhlcmhfcHJvYmUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYywgY29uc3Qgc3RydWN0IGVjYXJkX2lkICppZCkKK3sKKwljb25zdCBzdHJ1Y3QgZXRoZXJoX2RhdGEgKmRhdGEgPSBpZC0+ZGF0YTsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBldGhlcmhfcHJpdiAqZWg7CisJaW50IGksIHJldDsKKworCWV0aGVyaF9iYW5uZXIoKTsKKworCXJldCA9IGVjYXJkX3JlcXVlc3RfcmVzb3VyY2VzKGVjKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWRldiA9IF9fYWxsb2NfZWlfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgZXRoZXJoX3ByaXYpKTsKKwlpZiAoIWRldikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHJlbGVhc2U7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJmVjLT5kZXYpOworCisJZGV2LT5vcGVuCQk9IGV0aGVyaF9vcGVuOworCWRldi0+c3RvcAkJPSBldGhlcmhfY2xvc2U7CisJZGV2LT5zZXRfY29uZmlnCQk9IGV0aGVyaF9zZXRfY29uZmlnOworCWRldi0+aXJxCQk9IGVjLT5pcnE7CisJZGV2LT5ldGh0b29sX29wcwk9ICZldGhlcmhfZXRodG9vbF9vcHM7CisKKwlpZiAoZGF0YS0+c3VwcG9ydGVkICYgU1VQUE9SVEVEX0F1dG9uZWcpCisJCWRldi0+ZmxhZ3MgfD0gSUZGX0FVVE9NRURJQTsKKwlpZiAoZGF0YS0+c3VwcG9ydGVkICYgU1VQUE9SVEVEX1RQKSB7CisJCWRldi0+ZmxhZ3MgfD0gSUZGX1BPUlRTRUw7CisJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTBCQVNFVDsKKwl9IGVsc2UgaWYgKGRhdGEtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9CTkMpIHsKKwkJZGV2LT5mbGFncyB8PSBJRkZfUE9SVFNFTDsKKwkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMEJBU0UyOworCX0gZWxzZQorCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUX1VOS05PV047CisKKwllaCA9IGV0aGVyaF9wcml2KGRldik7CisJZWgtPnN1cHBvcnRlZAkJPSBkYXRhLT5zdXBwb3J0ZWQ7CisJZWgtPmN0cmwJCT0gMDsKKwllaC0+aWQJCQk9IGVjLT5jaWQucHJvZHVjdDsKKwllaC0+bWVtYwkJPSBpb3JlbWFwKGVjYXJkX3Jlc291cmNlX3N0YXJ0KGVjLCBFQ0FSRF9SRVNfTUVNQyksIFBBR0VfU0laRSk7CisJaWYgKCFlaC0+bWVtYykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZyZWU7CisJfQorCisJZWgtPmN0cmxfcG9ydCA9IGVoLT5tZW1jOworCWlmIChkYXRhLT5jdHJsX2lvYykgeworCQllaC0+aW9jX2Zhc3QgPSBpb3JlbWFwKGVjYXJkX3Jlc291cmNlX3N0YXJ0KGVjLCBFQ0FSRF9SRVNfSU9DRkFTVCksIFBBR0VfU0laRSk7CisJCWlmICghZWgtPmlvY19mYXN0KSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBmcmVlOworCQl9CisJCWVoLT5jdHJsX3BvcnQgPSBlaC0+aW9jX2Zhc3Q7CisJfQorCisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZyllaC0+bWVtYyArIGRhdGEtPm5zODM5MF9vZmZzZXQ7CisJZWgtPmRtYV9iYXNlID0gZWgtPm1lbWMgKyBkYXRhLT5kYXRhcG9ydF9vZmZzZXQ7CisJZWgtPmN0cmxfcG9ydCArPSBkYXRhLT5jdHJscG9ydF9vZmZzZXQ7CisKKwkvKgorCSAqIElSUSBhbmQgY29udHJvbCBwb3J0IGhhbmRsaW5nIC0gb25seSBmb3Igbm9uLU5JQyBzbG90IGNhcmRzLgorCSAqLworCWlmIChlYy0+c2xvdF9ubyAhPSA4KSB7CisJCWVjLT5vcHMJCT0gJmV0aGVyaF9vcHM7CisJCWVjLT5pcnFfZGF0YQk9IGVoOworCX0gZWxzZSB7CisJCS8qCisJCSAqIElmIHdlJ3JlIGluIHRoZSBOSUMgc2xvdCwgbWFrZSBzdXJlIHRoZSBJUlEgaXMgZW5hYmxlZAorCQkgKi8KKwkJZXRoZXJoX3NldF9jdHJsKGVoLCBFVEhFUkhfQ1BfSUUpOworCX0KKworCWVpX2xvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaW5pdCgmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisKKwlpZiAoZWMtPmNpZC5wcm9kdWN0ID09IFBST0RfQU5UX0VUSEVSTSkgeworCQlldGhlcm1fYWRkcihkZXYtPmRldl9hZGRyKTsKKwkJZWlfbG9jYWwtPnJlZ19vZmZzZXQgPSBldGhlcm1fcmVnb2Zmc2V0czsKKwl9IGVsc2UgeworCQlldGhlcmhfYWRkcihkZXYtPmRldl9hZGRyLCBlYyk7CisJCWVpX2xvY2FsLT5yZWdfb2Zmc2V0ID0gZXRoZXJoX3JlZ29mZnNldHM7CisJfQorCisJZWlfbG9jYWwtPm5hbWUgICAgICAgICAgPSBkZXYtPm5hbWU7CisJZWlfbG9jYWwtPndvcmQxNiAgICAgICAgPSAxOworCWVpX2xvY2FsLT50eF9zdGFydF9wYWdlID0gZGF0YS0+dHhfc3RhcnRfcGFnZTsKKwllaV9sb2NhbC0+cnhfc3RhcnRfcGFnZSA9IGVpX2xvY2FsLT50eF9zdGFydF9wYWdlICsgVFhfUEFHRVM7CisJZWlfbG9jYWwtPnN0b3BfcGFnZSAgICAgPSBkYXRhLT5zdG9wX3BhZ2U7CisJZWlfbG9jYWwtPnJlc2V0XzgzOTAgICAgPSBldGhlcmhfcmVzZXQ7CisJZWlfbG9jYWwtPmJsb2NrX2lucHV0ICAgPSBldGhlcmhfYmxvY2tfaW5wdXQ7CisJZWlfbG9jYWwtPmJsb2NrX291dHB1dCAgPSBldGhlcmhfYmxvY2tfb3V0cHV0OworCWVpX2xvY2FsLT5nZXRfODM5MF9oZHIgID0gZXRoZXJoX2dldF9oZWFkZXI7CisJZWlfbG9jYWwtPmludGVyZmFjZV9udW0gPSAwOworCisJZXRoZXJoX3Jlc2V0KGRldik7CisJTlM4MzkwX2luaXQoZGV2LCAwKTsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZnJlZTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBpbiBzbG90ICVkLCAiLAorCQlkZXYtPm5hbWUsIGRhdGEtPm5hbWUsIGVjLT5zbG90X25vKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJTIuMnglYyIsIGRldi0+ZGV2X2FkZHJbaV0sIGkgPT0gNSA/ICdcbicgOiAnOicpOworCisJZWNhcmRfc2V0X2RydmRhdGEoZWMsIGRldik7CisKKwlyZXR1cm4gMDsKKworIGZyZWU6CisJaWYgKGVoLT5pb2NfZmFzdCkKKwkJaW91bm1hcChlaC0+aW9jX2Zhc3QpOworCWlmIChlaC0+bWVtYykKKwkJaW91bm1hcChlaC0+bWVtYyk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKyByZWxlYXNlOgorCWVjYXJkX3JlbGVhc2VfcmVzb3VyY2VzKGVjKTsKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGV0aGVyaF9yZW1vdmUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZWNhcmRfZ2V0X2RydmRhdGEoZWMpOworCXN0cnVjdCBldGhlcmhfcHJpdiAqZWggPSBldGhlcmhfcHJpdihkZXYpOworCisJZWNhcmRfc2V0X2RydmRhdGEoZWMsIE5VTEwpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwllYy0+b3BzID0gTlVMTDsKKworCWlmIChlaC0+aW9jX2Zhc3QpCisJCWlvdW5tYXAoZWgtPmlvY19mYXN0KTsKKwlpb3VubWFwKGVoLT5tZW1jKTsKKworCWZyZWVfbmV0ZGV2KGRldik7CisKKwllY2FyZF9yZWxlYXNlX3Jlc291cmNlcyhlYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRoZXJoX2RhdGEgZXRoZXJtX2RhdGEgPSB7CisJLm5zODM5MF9vZmZzZXQJCT0gRVRIRVJNX05TODM5MCwKKwkuZGF0YXBvcnRfb2Zmc2V0CT0gRVRIRVJNX05TODM5MCArIEVUSEVSTV9EQVRBUE9SVCwKKwkuY3RybHBvcnRfb2Zmc2V0CT0gRVRIRVJNX05TODM5MCArIEVUSEVSTV9DVFJMUE9SVCwKKwkubmFtZQkJCT0gIkFOVCBFdGhlck0iLAorCS5zdXBwb3J0ZWQJCT0gU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiwKKwkudHhfc3RhcnRfcGFnZQkJPSBFVEhFUk1fVFhfU1RBUlRfUEFHRSwKKwkuc3RvcF9wYWdlCQk9IEVUSEVSTV9TVE9QX1BBR0UsCit9OworCitzdGF0aWMgc3RydWN0IGV0aGVyaF9kYXRhIGV0aGVybGFuNTAwX2RhdGEgPSB7CisJLm5zODM5MF9vZmZzZXQJCT0gRVRIRVJINTAwX05TODM5MCwKKwkuZGF0YXBvcnRfb2Zmc2V0CT0gRVRIRVJINTAwX05TODM5MCArIEVUSEVSSDUwMF9EQVRBUE9SVCwKKwkuY3RybHBvcnRfb2Zmc2V0CT0gRVRIRVJINTAwX0NUUkxQT1JULAorCS5jdHJsX2lvYwkJPSAxLAorCS5uYW1lCQkJPSAiaTMgRXRoZXJIIDUwMCIsCisJLnN1cHBvcnRlZAkJPSBTVVBQT1JURURfMTBiYXNlVF9IYWxmLAorCS50eF9zdGFydF9wYWdlCQk9IEVUSEVSSF9UWF9TVEFSVF9QQUdFLAorCS5zdG9wX3BhZ2UJCT0gRVRIRVJIX1NUT1BfUEFHRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXRoZXJoX2RhdGEgZXRoZXJsYW42MDBfZGF0YSA9IHsKKwkubnM4MzkwX29mZnNldAkJPSBFVEhFUkg2MDBfTlM4MzkwLAorCS5kYXRhcG9ydF9vZmZzZXQJPSBFVEhFUkg2MDBfTlM4MzkwICsgRVRIRVJINjAwX0RBVEFQT1JULAorCS5jdHJscG9ydF9vZmZzZXQJPSBFVEhFUkg2MDBfTlM4MzkwICsgRVRIRVJINjAwX0NUUkxQT1JULAorCS5uYW1lCQkJPSAiaTMgRXRoZXJIIDYwMCIsCisJLnN1cHBvcnRlZAkJPSBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX0JOQyB8IFNVUFBPUlRFRF9BdXRvbmVnLAorCS50eF9zdGFydF9wYWdlCQk9IEVUSEVSSF9UWF9TVEFSVF9QQUdFLAorCS5zdG9wX3BhZ2UJCT0gRVRIRVJIX1NUT1BfUEFHRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXRoZXJoX2RhdGEgZXRoZXJsYW42MDBhX2RhdGEgPSB7CisJLm5zODM5MF9vZmZzZXQJCT0gRVRIRVJINjAwX05TODM5MCwKKwkuZGF0YXBvcnRfb2Zmc2V0CT0gRVRIRVJINjAwX05TODM5MCArIEVUSEVSSDYwMF9EQVRBUE9SVCwKKwkuY3RybHBvcnRfb2Zmc2V0CT0gRVRIRVJINjAwX05TODM5MCArIEVUSEVSSDYwMF9DVFJMUE9SVCwKKwkubmFtZQkJCT0gImkzIEV0aGVySCA2MDBBIiwKKwkuc3VwcG9ydGVkCQk9IFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfVFAgfCBTVVBQT1JURURfQk5DIHwgU1VQUE9SVEVEX0F1dG9uZWcsCisJLnR4X3N0YXJ0X3BhZ2UJCT0gRVRIRVJIX1RYX1NUQVJUX1BBR0UsCisJLnN0b3BfcGFnZQkJPSBFVEhFUkhfU1RPUF9QQUdFLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCBldGhlcmhfaWRzW10gPSB7CisJeyBNQU5VX0FOVCwgUFJPRF9BTlRfRVRIRVJNLCAgICAgICZldGhlcm1fZGF0YSAgICAgICB9LAorCXsgTUFOVV9JMywgIFBST0RfSTNfRVRIRVJMQU41MDAsICAmZXRoZXJsYW41MDBfZGF0YSAgfSwKKwl7IE1BTlVfSTMsICBQUk9EX0kzX0VUSEVSTEFONjAwLCAgJmV0aGVybGFuNjAwX2RhdGEgIH0sCisJeyBNQU5VX0kzLCAgUFJPRF9JM19FVEhFUkxBTjYwMEEsICZldGhlcmxhbjYwMGFfZGF0YSB9LAorCXsgMHhmZmZmLCAgIDB4ZmZmZiB9Cit9OworCitzdGF0aWMgc3RydWN0IGVjYXJkX2RyaXZlciBldGhlcmhfZHJpdmVyID0geworCS5wcm9iZQkJPSBldGhlcmhfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChldGhlcmhfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBldGhlcmhfaWRzLAorCS5kcnYgPSB7CisJCS5uYW1lCT0gRFJWX05BTUUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGV0aGVyaF9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlldGhlcmhfcmVnb2Zmc2V0c1tpXSA9IGkgPDwgMjsKKwkJZXRoZXJtX3JlZ29mZnNldHNbaV0gPSBpIDw8IDU7CisJfQorCisJcmV0dXJuIGVjYXJkX3JlZ2lzdGVyX2RyaXZlcigmZXRoZXJoX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBldGhlcmhfZXhpdCh2b2lkKQoreworCWVjYXJkX3JlbW92ZV9kcml2ZXIoJmV0aGVyaF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChldGhlcmhfaW5pdCk7Cittb2R1bGVfZXhpdChldGhlcmhfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdDE3MDAuYyBiL2RyaXZlcnMvbmV0L2F0MTcwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWIyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hdDE3MDAuYwpAQCAtMCwwICsxLDkzOSBAQAorLyogYXQxNzAwLmM6IEEgbmV0d29yayBkZXZpY2UgZHJpdmVyIGZvciAgdGhlIEFsbGllZCBUZWxlc2lzIEFUMTcwMC4KKworCVdyaXR0ZW4gMTk5My05OCBieSBEb25hbGQgQmVja2VyLgorCisJQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCVRoaXMgaXMgYSBkZXZpY2UgZHJpdmVyIGZvciB0aGUgQWxsaWVkIFRlbGVzaXMgQVQxNzAwLCBhbmQKKyAgICAgICAgRnVqaXRzdSBGTVYtMTgxLzE4Mi8xODFBLzE4MkEvMTgzLzE4NC8xODNBLzE4NEEsIHdoaWNoIGFyZQorCXN0cmFpZ2h0LWZvcndhcmQgRnVqaXRzdSBNQjg2OTY1IGltcGxlbWVudGF0aW9ucy4KKworCU1vZGlmaWNhdGlvbiBmb3IgRnVqaXRzdSBGTVYtMThYIGNhcmRzIGlzIGRvbmUgYnkgWXV0YWthIFRhbWl5YQorCSh0YW15QGZsYWIuZnVqaXRzdS5jby5qcCkuIAorCisgIFNvdXJjZXM6CisgICAgVGhlIEZ1aml0c3UgTUI4Njk2NSBkYXRhc2hlZXQuCisKKwlBZnRlciB0aGUgaW5pdGlhbCB2ZXJzaW9uIG9mIHRoaXMgZHJpdmVyIHdhcyB3cml0dGVuIEdlcnJ5IFNhd2tpbnMgb2YKKwlBVEkgcHJvdmlkZWQgdGhlaXIgRUVQUk9NIGNvbmZpZ3VyYXRpb24gY29kZSBoZWFkZXIgZmlsZS4KKyAgICBUaGFua3MgdG8gTklJQkUgWXV0YWthIDxnbmlpYmVAbXJpLmNvLmpwPiBmb3IgYnVnIGZpeGVzLgorCisgICAgTUNBIGJ1cyAoQVQxNzIwKSBzdXBwb3J0IGJ5IFJlbmUgU2NobWl0IDxyZW5lQGJzcy5sdT4KKworICBCdWdzOgorCVRoZSBNQjg2OTY1IGhhcyBhIGRlc2lnbiBmbGF3IHRoYXQgbWFrZXMgYWxsIHByb2JlcyB1bnJlbGlhYmxlLiAgTm90CisJb25seSBpcyBpdCBkaWZmaWN1bHQgdG8gZGV0ZWN0LCBpdCBhbHNvIG1vdmVzIGFyb3VuZCBpbiBJL08gc3BhY2UgaW4KKwlyZXNwb25zZSB0byBpbmIoKXMgZnJvbSBvdGhlciBkZXZpY2UgcHJvYmVzIQorKi8KKy8qCisJOTkvMDMvMDMgIEFsbGllZCBUZWxlc2lzIFJFMTAwMCBQbHVzIHN1cHBvcnQgYnkgVC5IYWdhd2EKKwk5OS8xMi8zMAlwb3J0IHRvIDIuMy4zNSBieSBLLlRha2FpCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS1sZWdhY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9CisJImF0MTcwMC5jOnYxLjE1IDQvNy85OCAgRG9uYWxkIEJlY2tlciAoYmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292KVxuIjsKKworI2RlZmluZSBEUlZfTkFNRSAiYXQxNzAwIgorCisvKiBUdW5hYmxlIHBhcmFtZXRlcnMuICovCisKKy8qIFdoZW4gdG8gc3dpdGNoIGZyb20gdGhlIDY0LWVudHJ5IG11bHRpY2FzdCBmaWx0ZXIgdG8gUngtYWxsLW11bHRpY2FzdC4gKi8KKyNkZWZpbmUgTUNfRklMVEVSQlJFQUsgNjQKKworLyogVGhlc2UgdW51c3VhbCBhZGRyZXNzIG9yZGVycyBhcmUgdXNlZCB0byB2ZXJpZnkgdGhlIENPTkZJRyByZWdpc3Rlci4gKi8KKworc3RhdGljIGludCBmbXYxOHhfcHJvYmVfbGlzdFtdIF9faW5pdGRhdGEgPSB7CisJMHgyMjAsIDB4MjQwLCAweDI2MCwgMHgyODAsIDB4MmEwLCAweDJjMCwgMHgzMDAsIDB4MzQwLCAwCit9OworCisvKgorICoJSVNBCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGF0MTcwMF9wcm9iZV9saXN0W10gX19pbml0ZGF0YSA9IHsKKwkweDI2MCwgMHgyODAsIDB4MmEwLCAweDI0MCwgMHgzNDAsIDB4MzIwLCAweDM4MCwgMHgzMDAsIDAKK307CisKKy8qCisgKglNQ0EKKyAqLworI2lmZGVmIENPTkZJR19NQ0FfTEVHQUNZCitzdGF0aWMgaW50IGF0MTcwMF9pb2FkZHJfcGF0dGVybltdIF9faW5pdGRhdGEgPSB7CisJMHgwMCwgMHgwNCwgMHgwMSwgMHgwNSwgMHgwMiwgMHgwNiwgMHgwMywgMHgwNworfTsKKworc3RhdGljIGludCBhdDE3MDBfbWNhX3Byb2JlX2xpc3RbXSBfX2luaXRkYXRhID0geworCTB4NDAwLCAweDE0MDAsIDB4MjQwMCwgMHgzNDAwLCAweDQ0MDAsIDB4NTQwMCwgMHg2NDAwLCAweDc0MDAsIDAKK307CisKK3N0YXRpYyBpbnQgYXQxNzAwX2lycV9wYXR0ZXJuW10gX19pbml0ZGF0YSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDMwLCAweDcwLCAweGIwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4ZjAsIDB4MzQsIDB4NzQsIDB4YjQsIDB4MDAsIDB4MDAsIDB4ZjQsIDB4MDAKK307CisjZW5kaWYKKworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnICovCisjaWZuZGVmIE5FVF9ERUJVRworI2RlZmluZSBORVRfREVCVUcgMQorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldF9kZWJ1ZyA9IE5FVF9ERUJVRzsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVjaGFyOworCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3N0cnVjdCBuZXRfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCBjaGFyIG1jX2ZpbHRlcls4XTsKKwl1aW50IGp1bXBlcmVkOjE7CQkJLyogU2V0IGlmZiB0aGUgYm9hcmQgaGFzIGp1bXBlciBjb25maWcuICovCisJdWludCB0eF9zdGFydGVkOjE7CQkJLyogUGFja2V0cyBhcmUgb24gdGhlIFR4IHF1ZXVlLiAqLworCXVpbnQgdHhfcXVldWVfcmVhZHk6MTsJCQkvKiBUeCBxdWV1ZSBpcyByZWFkeSB0byBiZSBzZW50LiAqLworCXVpbnQgcnhfc3RhcnRlZDoxOwkJCS8qIFBhY2tldHMgYXJlIFJ4aW5nLiAqLworCXVjaGFyIHR4X3F1ZXVlOwkJCQkvKiBOdW1iZXIgb2YgcGFja2V0IG9uIHRoZSBUeCBxdWV1ZS4gKi8KKwljaGFyIG1jYV9zbG90OwkJCQkvKiAtMSBtZWFucyBJU0EgKi8KKwl1c2hvcnQgdHhfcXVldWVfbGVuOwkJCS8qIEN1cnJlbnQgbGVuZ3RoIG9mIHRoZSBUeCBxdWV1ZS4gKi8KK307CisKKworLyogT2Zmc2V0cyBmcm9tIHRoZSBiYXNlIGFkZHJlc3MuICovCisjZGVmaW5lIFNUQVRVUwkJCTAKKyNkZWZpbmUgVFhfU1RBVFVTCQkwCisjZGVmaW5lIFJYX1NUQVRVUwkJMQorI2RlZmluZSBUWF9JTlRSCQkJMgkJLyogQml0LW1hcHBlZCBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgUlhfSU5UUgkJCTMKKyNkZWZpbmUgVFhfTU9ERQkJCTQKKyNkZWZpbmUgUlhfTU9ERQkJCTUKKyNkZWZpbmUgQ09ORklHXzAJCTYJCS8qIE1pc2MuIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuICovCisjZGVmaW5lIENPTkZJR18xCQk3CisvKiBSdW4tdGltZSByZWdpc3RlciBiYW5rIDIgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIERBVEFQT1JUCQk4CQkvKiBXb3JkLXdpZGUgRE1BIG9yIHByb2dyYW1tZWQtSS9PIGRhdGFwb3J0LiAqLworI2RlZmluZSBUWF9TVEFSVAkJMTAKKyNkZWZpbmUgQ09MMTZDTlRMCQkxMQkJLyogQ29udHJvbGwgUmVnIGZvciAxNiBjb2xsaXNpb25zICovCisjZGVmaW5lIE1PREUxMwkJCTEzCisjZGVmaW5lIFJYX0NUUkwJCQkxNAorLyogQ29uZmlndXJhdGlvbiByZWdpc3RlcnMgb25seSBvbiB0aGUgJzg2NUEvQiBjaGlwcy4gKi8KKyNkZWZpbmUgRUVQUk9NX0N0cmwgCTE2CisjZGVmaW5lIEVFUFJPTV9EYXRhIAkxNworI2RlZmluZSBDQVJEU1RBVFVTCTE2CQkJLyogRk1WLTE4eCBDYXJkIFN0YXR1cyAqLworI2RlZmluZSBDQVJEU1RBVFVTMQkxNwkJCS8qIEZNVi0xOHggQ2FyZCBTdGF0dXMgKi8KKyNkZWZpbmUgSU9DT05GSUcJCTE4CQkvKiBFaXRoZXIgcmVhZCB0aGUganVtcGVyLCBvciBtb3ZlIHRoZSBJL08uICovCisjZGVmaW5lIElPQ09ORklHMQkJMTkKKyNkZWZpbmUJU0FQUk9NCQkJMjAJCS8qIFRoZSBzdGF0aW9uIGFkZHJlc3MgUFJPTSwgaWYgbm8gRUVQUk9NLiAqLworI2RlZmluZSBNT0RFMjQJCQkyNAorI2RlZmluZSBSRVNFVAkJCTMxCQkvKiBXcml0ZSB0byByZXNldCBzb21lIHBhcnRzIG9mIHRoZSBjaGlwLiAqLworI2RlZmluZSBBVDE3MDBfSU9fRVhURU5UCTMyCisjZGVmaW5lIFBPUlRfT0ZGU0VUKG8pIChvKQorCisKKyNkZWZpbmUgVFhfVElNRU9VVAkJMTAKKworCisvKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisKK3N0YXRpYyBpbnQgYXQxNzAwX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQgcmVhZF9lZXByb20obG9uZyBpb2FkZHIsIGludCBsb2NhdGlvbik7CitzdGF0aWMgaW50IG5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAluZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgbmV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIG5ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBuZXRfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwwKKyNpZmRlZiBDT05GSUdfTUNBX0xFR0FDWQorc3RydWN0IGF0MTcyMF9tY2FfYWRhcHRlcnNfc3RydWN0IHsKKwljaGFyKiBuYW1lOworCWludCBpZDsKK307CisvKiByRW5FIDogbWF5YmUgdGhlcmUgYXJlIG90aGVycyBJIGRvbid0IGtub3cgb2ZmLi4uICovCisKK3N0YXRpYyBzdHJ1Y3QgYXQxNzIwX21jYV9hZGFwdGVyc19zdHJ1Y3QgYXQxNzIwX21jYV9hZGFwdGVyc1tdIF9faW5pdGRhdGEgPSB7CisJeyAiQWxsaWVkIFRlbGVzeXMgQVQxNzIwQVQiLAkweDY0MTAgfSwKKwl7ICJBbGxpZWQgVGVsZXN5cyBBVDE3MjBCVCIsIAkweDY0MTMgfSwKKwl7ICJBbGxpZWQgVGVsZXN5cyBBVDE3MjBUIiwJMHg2NDE2IH0sCisJeyBOVUxMLCAwIH0sCit9OworI2VuZGlmCisKKy8qIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUsIGFuZCByZXR1cm4gJzAnIGlmZiBvbmUgZXhpc3RzLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMCwgcHJvYmUgYWxsIGxpa2VseSBsb2NhdGlvbnMuCisgICBJZiBkZXYtPmJhc2VfYWRkciA9PSAxLCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCisgICBJZiBkZXYtPmJhc2VfYWRkciA9PSAyLCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGRldmljZSBhbmQgcmV0dXJuIHN1Y2Nlc3MKKyAgIChkZXRhY2hhYmxlIGRldmljZXMgb25seSkuCisgICAqLworCitzdGF0aWMgaW50IGlvID0gMHgyNjA7CisKK3N0YXRpYyBpbnQgaXJxOworCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBDT05GSUdfTUNBX0xFR0FDWQorCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAobHAtPm1jYV9zbG90ID49IDApCisJCW1jYV9tYXJrX2FzX3VudXNlZChscC0+bWNhX3Nsb3QpOworI2VuZGlmCQorCWZyZWVfaXJxKGRldi0+aXJxLCBOVUxMKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgQVQxNzAwX0lPX0VYVEVOVCk7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGF0MTcwMF9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwl1bnNpZ25lZCAqcG9ydDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQlpbyA9IGRldi0+YmFzZV9hZGRyOworCQlpcnEgPSBkZXYtPmlycTsKKwl9IGVsc2UgeworCQlkZXYtPmJhc2VfYWRkciA9IGlvOworCQlkZXYtPmlycSA9IGlycTsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoaW8gPiAweDFmZikgewkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCWVyciA9IGF0MTcwMF9wcm9iZTEoZGV2LCBpbyk7CisJfSBlbHNlIGlmIChpbyAhPSAwKSB7CS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJZXJyID0gLUVOWElPOworCX0gZWxzZSB7CisJCWZvciAocG9ydCA9IGF0MTcwMF9wcm9iZV9saXN0OyAqcG9ydDsgcG9ydCsrKSB7CisJCQlpZiAoYXQxNzAwX3Byb2JlMShkZXYsICpwb3J0KSA9PSAwKQorCQkJCWJyZWFrOworCQkJZGV2LT5pcnEgPSBpcnE7CisJCX0KKwkJaWYgKCEqcG9ydCkKKwkJCWVyciA9IC1FTk9ERVY7CisJfQorCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwljbGVhbnVwX2NhcmQoZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qIFRoZSBGdWppdHN1IGRhdGFzaGVldCBzdWdnZXN0cyB0aGF0IHRoZSBOSUMgYmUgcHJvYmVkIGZvciBieSBjaGVja2luZyBpdHMKKyAgICJzaWduYXR1cmUiLCB0aGUgZGVmYXVsdCBiaXQgcGF0dGVybiBhZnRlciBhIHJlc2V0LiAgVGhpcyAqZG9lc24ndCogd29yayAtLQorICAgdGhlcmUgaXMgbm8gd2F5IHRvIHJlc2V0IHRoZSBidXMgaW50ZXJmYWNlIHdpdGhvdXQgYSBjb21wbGV0ZSBwb3dlci1jeWNsZSEKKworICAgSXQgdHVybnMgb3V0IHRoYXQgQVRJIGNhbWUgdG8gdGhlIHNhbWUgY29uY2x1c2lvbiBJIGRpZDogdGhlIG9ubHkgdGhpbmcKKyAgIHRoYXQgY2FuIGJlIGRvbmUgaXMgY2hlY2tpbmcgYSBmZXcgYml0cyBhbmQgdGhlbiBkaXZpbmcgcmlnaHQgaW50byBhbgorICAgRUVQUk9NIHJlYWQuICovCisKK3N0YXRpYyBpbnQgX19pbml0IGF0MTcwMF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwljaGFyIGZtdl9pcnFtYXBbNF0gPSB7MywgNywgMTAsIDE1fTsKKwljaGFyIGZtdl9pcnFtYXBfcG5wWzhdID0gezMsIDQsIDUsIDcsIDksIDEwLCAxMSwgMTV9OworCWNoYXIgYXQxNzAwX2lycW1hcFs4XSA9IHszLCA0LCA1LCA5LCAxMCwgMTEsIDE0LCAxNX07CisJdW5zaWduZWQgaW50IGksIGlycSwgaXNfZm12MTh4ID0gMCwgaXNfYXQxNzAwID0gMDsKKwlpbnQgc2xvdCwgcmV0ID0gLUVOT0RFVjsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgQVQxNzAwX0lPX0VYVEVOVCwgRFJWX05BTUUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogUmVzZXR0aW5nIHRoZSBjaGlwIGRvZXNuJ3QgcmVzZXQgdGhlIElTQSBpbnRlcmZhY2UsIHNvIGRvbid0IGJvdGhlci4KKwkgICBUaGF0IG1lYW5zIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB3aXRoIHRoZSByZWdpc3RlciB2YWx1ZXMgd2UgcHJvYmUKKwkgICBmb3IuCisJICovCisjaWZkZWYgbm90ZGVmCisJcHJpbnRrKCJhdDE3MDAgcHJvYmUgYXQgJSN4LCBlZXByb20gaXMgJTQuNHggJTQuNHggJTQuNHggY3RybCAlNC40eC5cbiIsCisJCSAgIGlvYWRkciwgcmVhZF9lZXByb20oaW9hZGRyLCA0KSwgcmVhZF9lZXByb20oaW9hZGRyLCA1KSwKKwkJICAgcmVhZF9lZXByb20oaW9hZGRyLCA2KSwgaW53KGlvYWRkciArIEVFUFJPTV9DdHJsKSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQ0FfTEVHQUNZCisJLyogckVuRSAocmVuZUBic3MubHUpOiBnb3QgdGhpcyBmcm9tIDNjNTA5IGRyaXZlciBzb3VyY2UgLCBhZGFwdGVkIGZvciBBVDE3MjAgKi8KKworICAgIC8qIEJhc2VkIG9uIEVyaWsgTnlncmVuJ3MgKG55Z3JlbkBtaXQuZWR1KSAzYzUyOSBwYXRjaCwgaGVhdmlseQorCW1vZGlmaWVkIGJ5IENocmlzIEJlYXVyZWdhcmQgKGNwYmVhdXJlQGNzY2x1Yi51d2F0ZXJsb28uY2EpCisJdG8gc3VwcG9ydCBzdGFuZGFyZCBNQ0EgcHJvYmluZy4gKi8KKworCS8qIHJlZG9uZSBmb3IgbXVsdGktY2FyZCBkZXRlY3Rpb24gYnkgWlAgR3UgKHpwZ0BjYXN0bGUubmV0KSAqLworCS8qIG5vdyB3b3JrcyBhcyBhIG1vZHVsZSAqLworCisJaWYgKE1DQV9idXMpIHsKKwkJaW50IGo7CisJCWludCBsX2k7CisJCXVfY2hhciBwb3MzLCBwb3M0OworCisJCWZvciAoaiA9IDA7IGF0MTcyMF9tY2FfYWRhcHRlcnNbal0ubmFtZSAhPSBOVUxMOyBqICsrKSB7CisJCQlzbG90ID0gMDsKKwkJCXdoaWxlIChzbG90ICE9IE1DQV9OT1RGT1VORCkgeworCQkJCQorCQkJCXNsb3QgPSBtY2FfZmluZF91bnVzZWRfYWRhcHRlciggYXQxNzIwX21jYV9hZGFwdGVyc1tqXS5pZCwgc2xvdCApOworCQkJCWlmIChzbG90ID09IE1DQV9OT1RGT1VORCkgYnJlYWs7CisKKwkJCQkvKiBpZiB3ZSBnZXQgdGhpcyBmYXIsIGFuIGFkYXB0ZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIGlzCisJCQkJZW5hYmxlZCAqLworCisJCQkJcG9zMyA9IG1jYV9yZWFkX3N0b3JlZF9wb3MoIHNsb3QsIDMgKTsKKwkJCQlwb3M0ID0gbWNhX3JlYWRfc3RvcmVkX3Bvcyggc2xvdCwgNCApOworCisJCQkJZm9yIChsX2kgPSAwOyBsX2kgPCAweDA5OyBsX2krKykKKwkJCQkJaWYgKCggcG9zMyAmIDB4MDcpID09IGF0MTcwMF9pb2FkZHJfcGF0dGVybltsX2ldKQorCQkJCQkJYnJlYWs7CisJCQkJaW9hZGRyID0gYXQxNzAwX21jYV9wcm9iZV9saXN0W2xfaV07CisJCQkJCisJCQkJZm9yIChpcnEgPSAwOyBpcnEgPCAweDEwOyBpcnErKykKKwkJCQkJaWYgKCgoKChwb3M0Pj40KSAmIDB4MGYpIHwgKHBvczMgJiAweGYwKSkgJiAweGZmKSA9PSBhdDE3MDBfaXJxX3BhdHRlcm5baXJxXSkKKwkJCQkJCWJyZWFrOworCisJCQkJCS8qIHByb2JpbmcgZm9yIGEgY2FyZCBhdCBhIHBhcnRpY3VsYXIgSU8vSVJRICovCisJCQkJaWYgKChkZXYtPmlycSAmJiBkZXYtPmlycSAhPSBpcnEpIHx8CisJCQkJICAgIChkZXYtPmJhc2VfYWRkciAmJiBkZXYtPmJhc2VfYWRkciAhPSBpb2FkZHIpKSB7CisJCQkJICAJc2xvdCsrOwkJLyogcHJvYmluZyBuZXh0IHNsb3QgKi8KKwkJCQkgIAljb250aW51ZTsKKwkJCQl9CisKKwkJCQlkZXYtPmlycSA9IGlycTsKKwkJCQkKKwkJCQkvKiBjbGFpbSB0aGUgc2xvdCAqLworCQkJCW1jYV9zZXRfYWRhcHRlcl9uYW1lKCBzbG90LCBhdDE3MjBfbWNhX2FkYXB0ZXJzW2pdLm5hbWUgKTsKKwkJCQltY2FfbWFya19hc191c2VkKHNsb3QpOworCisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJfQorCQkvKiBpZiB3ZSBnZXQgaGVyZSwgd2UgZGlkbid0IGZpbmQgYW4gTUNBIGFkYXB0ZXIgLSB0cnkgSVNBICovCisJfQorI2VuZGlmCisJc2xvdCA9IC0xOworCS8qIFdlIG11c3QgY2hlY2sgZm9yIHRoZSBFRVBST00tY29uZmlnIGJvYXJkcyBmaXJzdCwgZWxzZSBhY2Nlc3NpbmcKKwkgICBJT0NPTkZJRzAgd2lsbCBtb3ZlIHRoZSBib2FyZCEgKi8KKwlpZiAoYXQxNzAwX3Byb2JlX2xpc3RbaW5iKGlvYWRkciArIElPQ09ORklHMSkgJiAweDA3XSA9PSBpb2FkZHIKKwkJJiYgcmVhZF9lZXByb20oaW9hZGRyLCA0KSA9PSAweDAwMDAKKwkJJiYgKHJlYWRfZWVwcm9tKGlvYWRkciwgNSkgJiAweGZmMDApID09IDB4RjQwMCkKKwkJaXNfYXQxNzAwID0gMTsKKwllbHNlIGlmIChpbmIoaW9hZGRyICAgKyBTQVBST00gICAgKSA9PSAweDAwCisJCSYmIGluYihpb2FkZHIgKyBTQVBST00gKyAxKSA9PSAweDAwCisJCSYmIGluYihpb2FkZHIgKyBTQVBST00gKyAyKSA9PSAweDBlKQorCQlpc19mbXYxOHggPSAxOworCWVsc2UgeworCQlnb3RvIGVycl9vdXQ7CisJfQorCQkJCisjaWZkZWYgQ09ORklHX01DQV9MRUdBQ1kKK2ZvdW5kOgorI2VuZGlmCisKKwkJLyogUmVzZXQgdGhlIGludGVybmFsIHN0YXRlIG1hY2hpbmVzLiAqLworCW91dGIoMCwgaW9hZGRyICsgUkVTRVQpOworCisJaWYgKGlzX2F0MTcwMCkgeworCQlpcnEgPSBhdDE3MDBfaXJxbWFwWyhyZWFkX2VlcHJvbShpb2FkZHIsIDEyKSYweDA0KQorCQkJCQkJICAgfCAocmVhZF9lZXByb20oaW9hZGRyLCAwKT4+MTQpXTsKKwl9IGVsc2UgeworCQkvKiBDaGVjayBQblAgbW9kZSBmb3IgRk1WLTE4My8xODQvMTgzQS8xODRBLiAqLworCQkvKiBUaGlzIFBuUCByb3V0aW5lIGlzIHZlcnkgcG9vci4gSU8gYW5kIElSUSBzaG91bGQgYmUga25vd24uICovCisJCWlmIChpbmIoaW9hZGRyICsgQ0FSRFNUQVRVUzEpICYgMHgyMCkgeworCQkJaXJxID0gZGV2LT5pcnE7CisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQkJaWYgKGlycSA9PSBmbXZfaXJxbWFwX3BucFtpXSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaSA9PSA4KSB7CisJCQkJZ290byBlcnJfbWNhOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGZtdjE4eF9wcm9iZV9saXN0W2luYihpb2FkZHIgKyBJT0NPTkZJRykgJiAweDA3XSAhPSBpb2FkZHIpCisJCQkJZ290byBlcnJfbWNhOworCQkJaXJxID0gZm12X2lycW1hcFsoaW5iKGlvYWRkciArIElPQ09ORklHKT4+NikgJiAweDAzXTsKKwkJfQorCX0KKworCXByaW50aygiJXM6ICVzIGZvdW5kIGF0ICUjM3gsIElSUSAlZCwgYWRkcmVzcyAiLCBkZXYtPm5hbWUsCisJCSAgIGlzX2F0MTcwMCA/ICJBVDE3MDAiIDogIkZNVi0xOFgiLCBpb2FkZHIsIGlycSk7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKworCWlmIChpc19hdDE3MDApIHsKKwkJZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQl1bnNpZ25lZCBzaG9ydCBlZXByb21fdmFsID0gcmVhZF9lZXByb20oaW9hZGRyLCA0K2kpOworCQkJcHJpbnRrKCIlMDR4IiwgZWVwcm9tX3ZhbCk7CisJCQkoKHVuc2lnbmVkIHNob3J0ICopZGV2LT5kZXZfYWRkcilbaV0gPSBudG9ocyhlZXByb21fdmFsKTsKKwkJfQorCX0gZWxzZSB7CisJCWZvcihpID0gMDsgaSA8IDY7IGkrKykgeworCQkJdW5zaWduZWQgY2hhciB2YWwgPSBpbmIoaW9hZGRyICsgU0FQUk9NICsgaSk7CisJCQlwcmludGsoIiUwMngiLCB2YWwpOworCQkJZGV2LT5kZXZfYWRkcltpXSA9IHZhbDsKKwkJfQorCX0KKworCS8qIFRoZSBFRVBST00gd29yZCAxMiBiaXQgMHgwNDAwIG1lYW5zIHVzZSByZWd1bGFyIDEwMCBvaG0gMTBiYXNlVCBzaWduYWxzLAorCSAgIHJhdGhlciB0aGFuIDE1MCBvaG0gc2hpZWxkZWQgdHdpc3RlZCBwYWlyIGNvbXBlbnNhdGlvbi4KKwkgICAweDAwMDAgPT0gYXV0by1zZW5zZSB0aGUgaW50ZXJmYWNlCisJICAgMHgwODAwID09IHVzZSBUUCBpbnRlcmZhY2UKKwkgICAweDE4MDAgPT0gdXNlIGNvYXggaW50ZXJmYWNlCisJICAgKi8KKwl7CisJCWNvbnN0IGNoYXIgKnBvcnR0eXBlW10gPSB7ImF1dG8tc2Vuc2UiLCAiMTBiYXNlVCIsICJhdXRvLXNlbnNlIiwgIjEwYmFzZTIifTsKKwkJaWYgKGlzX2F0MTcwMCkgeworCQkJdXNob3J0IHNldHVwX3ZhbHVlID0gcmVhZF9lZXByb20oaW9hZGRyLCAxMik7CisJCQlkZXYtPmlmX3BvcnQgPSBzZXR1cF92YWx1ZSA+PiA4OworCQl9IGVsc2UgeworCQkJdXNob3J0IHNldHVwX3ZhbHVlID0gaW5iKGlvYWRkciArIENBUkRTVEFUVVMpOworCQkJc3dpdGNoIChzZXR1cF92YWx1ZSAmIDB4MDcpIHsKKwkJCWNhc2UgMHgwMTogLyogMTBiYXNlNSAqLworCQkJY2FzZSAweDAyOiAvKiAxMGJhc2UyICovCisJCQkJZGV2LT5pZl9wb3J0ID0gMHgxODsgYnJlYWs7CisJCQljYXNlIDB4MDQ6IC8qIDEwYmFzZVQgKi8KKwkJCQlkZXYtPmlmX3BvcnQgPSAweDA4OyBicmVhazsKKwkJCWRlZmF1bHQ6ICAgLyogYXV0by1zZW5zZSAqLworCQkJCWRldi0+aWZfcG9ydCA9IDB4MDA7IGJyZWFrOworCQkJfQorCQl9CisJCXByaW50aygiICVzIGludGVyZmFjZS5cbiIsIHBvcnR0eXBlWyhkZXYtPmlmX3BvcnQ+PjMpICYgM10pOworCX0KKworCS8qIFNldCB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlciAwIHRvIDMySyAxMDBucy4gYnl0ZS13aWRlIG1lbW9yeSwgMTYgYml0CisJICAgYnVzIGFjY2VzcywgdHdvIDRLIFR4IHF1ZXVlcywgYW5kIGRpc2FibGVkIFR4IGFuZCBSeC4gKi8KKwlvdXRiKDB4ZGEsIGlvYWRkciArIENPTkZJR18wKTsKKworCS8qIFNldCB0aGUgc3RhdGlvbiBhZGRyZXNzIGluIGJhbmsgemVyby4gKi8KKwlvdXRiKDB4MDAsIGlvYWRkciArIENPTkZJR18xKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlvdXRiKGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIFBPUlRfT0ZGU0VUKDggKyBpKSk7CisKKwkvKiBTd2l0Y2ggdG8gYmFuayAxIGFuZCBzZXQgdGhlIG11bHRpY2FzdCB0YWJsZSB0byBhY2NlcHQgbm9uZS4gKi8KKwlvdXRiKDB4MDQsIGlvYWRkciArIENPTkZJR18xKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlvdXRiKDB4MDAsIGlvYWRkciArIFBPUlRfT0ZGU0VUKDggKyBpKSk7CisKKworCS8qIFN3aXRjaCB0byBiYW5rIDIgKi8KKwkvKiBMb2NrIG91ciBJL08gYWRkcmVzcywgYW5kIHNldCBtYW51YWwgcHJvY2Vzc2luZyBtb2RlIGZvciAxNiBjb2xsaXNpb25zLiAqLworCW91dGIoMHgwOCwgaW9hZGRyICsgQ09ORklHXzEpOworCW91dGIoZGV2LT5pZl9wb3J0LCBpb2FkZHIgKyBNT0RFMTMpOworCW91dGIoMHgwMCwgaW9hZGRyICsgQ09MMTZDTlRMKTsKKworCWlmIChuZXRfZGVidWcpCisJCXByaW50ayh2ZXJzaW9uKTsKKworCW1lbXNldChscCwgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKworCWRldi0+b3BlbgkJPSBuZXRfb3BlbjsKKwlkZXYtPnN0b3AJCT0gbmV0X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbmV0X3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzCT0gbmV0X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKwlkZXYtPnR4X3RpbWVvdXQgPSBuZXRfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKworCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisKKwlscC0+anVtcGVyZWQgPSBpc19mbXYxOHg7CisJbHAtPm1jYV9zbG90ID0gc2xvdDsKKwkvKiBTbmFyZiB0aGUgaW50ZXJydXB0IHZlY3RvciBub3cuICovCisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCAmbmV0X2ludGVycnVwdCwgMCwgRFJWX05BTUUsIGRldik7CisJaWYgKHJldCkgeworCQlwcmludGsgKCIgIEFUMTcwMCBhdCAlIzN4IGlzIHVudXNhYmxlIGR1ZSB0byBhIGNvbmZsaWN0IG9uIgorCQkJCSJJUlEgJWQuXG4iLCBpb2FkZHIsIGlycSk7CisJCWdvdG8gZXJyX21jYTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX21jYToKKyNpZmRlZiBDT05GSUdfTUNBX0xFR0FDWQorCWlmIChzbG90ID49IDApCisJCW1jYV9tYXJrX2FzX3VudXNlZChzbG90KTsKKyNlbmRpZgorZXJyX291dDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEFUMTcwMF9JT19FWFRFTlQpOworCXJldHVybiByZXQ7Cit9CisKKwwKKy8qICBFRVBST01fQ3RybCBiaXRzLiAqLworI2RlZmluZSBFRV9TSElGVF9DTEsJMHg0MAkvKiBFRVBST00gc2hpZnQgY2xvY2ssIGluIHJlZy4gMTYuICovCisjZGVmaW5lIEVFX0NTCQkJMHgyMAkvKiBFRVBST00gY2hpcCBzZWxlY3QsIGluIHJlZy4gMTYuICovCisjZGVmaW5lIEVFX0RBVEFfV1JJVEUJMHg4MAkvKiBFRVBST00gY2hpcCBkYXRhIGluLCBpbiByZWcuIDE3LiAqLworI2RlZmluZSBFRV9EQVRBX1JFQUQJMHg4MAkvKiBFRVBST00gY2hpcCBkYXRhIG91dCwgaW4gcmVnLiAxNy4gKi8KKworLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCisjZGVmaW5lIEVFX1dSSVRFX0NNRAkoNSA8PCA2KQorI2RlZmluZSBFRV9SRUFEX0NNRAkJKDYgPDwgNikKKyNkZWZpbmUgRUVfRVJBU0VfQ01ECSg3IDw8IDYpCisKK3N0YXRpYyBpbnQgX19pbml0IHJlYWRfZWVwcm9tKGxvbmcgaW9hZGRyLCBpbnQgbG9jYXRpb24pCit7CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgcmV0dmFsID0gMDsKKwlsb25nIGVlX2FkZHIgPSBpb2FkZHIgKyBFRVBST01fQ3RybDsKKwlsb25nIGVlX2RhZGRyID0gaW9hZGRyICsgRUVQUk9NX0RhdGE7CisJaW50IHJlYWRfY21kID0gbG9jYXRpb24gfCBFRV9SRUFEX0NNRDsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gOTsgaSA+PSAwOyBpLS0pIHsKKwkJc2hvcnQgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFX0RBVEFfV1JJVEUgOiAwOworCQlvdXRiKEVFX0NTLCBlZV9hZGRyKTsKKwkJb3V0YihkYXRhdmFsLCBlZV9kYWRkcik7CisJCW91dGIoRUVfQ1MgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOwkvKiBFRVBST00gY2xvY2sgdGljay4gKi8KKwl9CisJb3V0YihFRV9EQVRBX1dSSVRFLCBlZV9kYWRkcik7CisJZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwkJb3V0YihFRV9DUywgZWVfYWRkcik7CisJCW91dGIoRUVfQ1MgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOworCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbmIoZWVfZGFkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKwl9CisKKwkvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisJb3V0YihFRV9DUywgZWVfYWRkcik7CisJb3V0YihFRV9TSElGVF9DTEssIGVlX2FkZHIpOworCW91dGIoMCwgZWVfYWRkcik7CisJcmV0dXJuIHJldHZhbDsKK30KKworDAorCitzdGF0aWMgaW50IG5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8qIFNldCB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlciAwIHRvIDMySyAxMDBucy4gYnl0ZS13aWRlIG1lbW9yeSwgMTYgYml0CisJICAgYnVzIGFjY2VzcywgYW5kIHR3byA0SyBUeCBxdWV1ZXMuICovCisJb3V0YigweDVhLCBpb2FkZHIgKyBDT05GSUdfMCk7CisKKwkvKiBQb3dlcnVwLCBzd2l0Y2ggdG8gcmVnaXN0ZXIgYmFuayAyLCBhbmQgZW5hYmxlIHRoZSBSeCBhbmQgVHguICovCisJb3V0YigweGU4LCBpb2FkZHIgKyBDT05GSUdfMSk7CisKKwlscC0+dHhfc3RhcnRlZCA9IDA7CisJbHAtPnR4X3F1ZXVlX3JlYWR5ID0gMTsKKwlscC0+cnhfc3RhcnRlZCA9IDA7CisJbHAtPnR4X3F1ZXVlID0gMDsKKwlscC0+dHhfcXVldWVfbGVuID0gMDsKKworCS8qIFR1cm4gb24gaGFyZHdhcmUgVHggYW5kIFJ4IGludGVycnVwdHMuICovCisJb3V0YigweDgyLCBpb2FkZHIgKyBUWF9JTlRSKTsKKwlvdXRiKDB4ODEsIGlvYWRkciArIFJYX0lOVFIpOworCisJLyogRW5hYmxlIHRoZSBJUlEgb24gYm9hcmRzIG9mIGZtdjE4eCBpdCBpcyBmZWFzaWJsZS4gKi8KKwlpZiAobHAtPmp1bXBlcmVkKSB7CisJCW91dGIoMHg4MCwgaW9hZGRyICsgSU9DT05GSUcxKTsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZXRfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJcHJpbnRrICgiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCB3aXRoIHN0YXR1cyAlMDR4LCAlcz9cbiIsIGRldi0+bmFtZSwKKwkJaW53IChpb2FkZHIgKyBTVEFUVVMpLCBpbmIgKGlvYWRkciArIFRYX1NUQVRVUykgJiAweDgwCisJCT8gIklSUSBjb25mbGljdCIgOiAibmV0d29yayBjYWJsZSBwcm9ibGVtIik7CisJcHJpbnRrICgiJXM6IHRpbWVvdXQgcmVnaXN0ZXJzOiAlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHguXG4iLAorCSBkZXYtPm5hbWUsIGludyhpb2FkZHIgKyBUWF9TVEFUVVMpLCBpbncoaW9hZGRyICsgVFhfSU5UUiksIGludyhpb2FkZHIgKyBUWF9NT0RFKSwKKwkJaW53KGlvYWRkciArIENPTkZJR18wKSwgaW53KGlvYWRkciArIERBVEFQT1JUKSwgaW53KGlvYWRkciArIFRYX1NUQVJUKSwKKwkJaW53KGlvYWRkciArIE1PREUxMyAtIDEpLCBpbncoaW9hZGRyICsgUlhfQ1RSTCkpOworCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkvKiBUb0RvOiBXZSBzaG91bGQgdHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuLi4gKi8KKwlvdXR3KDB4ZmZmZiwgaW9hZGRyICsgTU9ERTI0KTsKKwlvdXR3ICgweGZmZmYsIGlvYWRkciArIFRYX1NUQVRVUyk7CisJb3V0YiAoMHg1YSwgaW9hZGRyICsgQ09ORklHXzApOworCW91dGIgKDB4ZTgsIGlvYWRkciArIENPTkZJR18xKTsKKwlvdXR3ICgweDgxODIsIGlvYWRkciArIFRYX0lOVFIpOworCW91dGIgKDB4MDAsIGlvYWRkciArIFRYX1NUQVJUKTsKKwlvdXRiICgweDAzLCBpb2FkZHIgKyBDT0wxNkNOVEwpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlscC0+dHhfc3RhcnRlZCA9IDA7CisJbHAtPnR4X3F1ZXVlX3JlYWR5ID0gMTsKKwlscC0+cnhfc3RhcnRlZCA9IDA7CisJbHAtPnR4X3F1ZXVlID0gMDsKKwlscC0+dHhfcXVldWVfbGVuID0gMDsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworCitzdGF0aWMgaW50IG5ldF9zZW5kX3BhY2tldCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXNob3J0IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCXNob3J0IGxlbiA9IHNrYi0+bGVuOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKwlzdGF0aWMgdTggcGFkW0VUSF9aTEVOXTsKKworCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKwkvKiBXZSBtYXkgbm90IHN0YXJ0IHRyYW5zbWl0dGluZyB1bmxlc3Mgd2UgZmluaXNoIHRyYW5zZmVycmluZworCSAgIGEgcGFja2V0IGludG8gdGhlIFR4IHF1ZXVlLiBEdXJpbmcgZXhlY3V0aW5nIHRoZSBmb2xsb3dpbmcKKwkgICBjb2RlcyB3ZSBwb3NzaWJseSBjYXRjaCBhIFR4IGludGVycnVwdC4gVGh1cyB3ZSBmbGFnIG9mZgorCSAgIHR4X3F1ZXVlX3JlYWR5LCBzbyB0aGF0IHdlIHByZXZlbnQgdGhlIGludGVycnVwdCByb3V0aW5lCisJICAgKG5ldF9pbnRlcnJ1cHQpIHRvIHN0YXJ0IHRyYW5zbWl0dGluZy4gKi8KKwlscC0+dHhfcXVldWVfcmVhZHkgPSAwOworCXsKKwkJb3V0dyAobGVuZ3RoLCBpb2FkZHIgKyBEQVRBUE9SVCk7CisJCS8qIFBhY2tldCBkYXRhICovCisJCW91dHN3IChpb2FkZHIgKyBEQVRBUE9SVCwgYnVmLCBsZW4gPj4gMSk7CisJCS8qIENoZWNrIGZvciBkcmliYmxlIGJ5dGUgKi8KKwkJaWYgKGxlbiAmIDEpIHsKKwkJCW91dHcoc2tiLT5kYXRhW3NrYi0+bGVuLTFdLCBpb2FkZHIgKyBEQVRBUE9SVCk7CisJCQlsZW4rKzsKKwkJfQorCQkvKiBDaGVjayBmb3IgcGFja2V0IHBhZGRpbmcgKi8KKwkJaWYgKGxlbmd0aCAhPSBza2ItPmxlbikKKwkJCW91dHN3KGlvYWRkciArIERBVEFQT1JULCBwYWQsIChsZW5ndGggLSBsZW4gKyAxKSA+PiAxKTsKKworCQlscC0+dHhfcXVldWUrKzsKKwkJbHAtPnR4X3F1ZXVlX2xlbiArPSBsZW5ndGggKyAyOworCX0KKwlscC0+dHhfcXVldWVfcmVhZHkgPSAxOworCisJaWYgKGxwLT50eF9zdGFydGVkID09IDApIHsKKwkJLyogSWYgdGhlIFR4IGlzIGlkbGUsIGFsd2F5cyB0cmlnZ2VyIGEgdHJhbnNtaXQuICovCisJCW91dGIgKDB4ODAgfCBscC0+dHhfcXVldWUsIGlvYWRkciArIFRYX1NUQVJUKTsKKwkJbHAtPnR4X3F1ZXVlID0gMDsKKwkJbHAtPnR4X3F1ZXVlX2xlbiA9IDA7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlscC0+dHhfc3RhcnRlZCA9IDE7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCX0gZWxzZSBpZiAobHAtPnR4X3F1ZXVlX2xlbiA8IDQwOTYgLSAxNTAyKQorCQkvKiBZZXMsIHRoZXJlIGlzIHJvb20gZm9yIG9uZSBtb3JlIHBhY2tldC4gKi8KKwkJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKworCXJldHVybiAwOworfQorDAorLyogVGhlIHR5cGljYWwgd29ya2xvYWQgb2YgdGhlIGRyaXZlcjoKKyAgIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorbmV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IG5ldF9sb2NhbCAqbHA7CisJaW50IGlvYWRkciwgc3RhdHVzOworCWludCBoYW5kbGVkID0gMDsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsgKCJhdDE3MDBfaW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCXNwaW5fbG9jayAoJmxwLT5sb2NrKTsKKwkKKwlzdGF0dXMgPSBpbncoaW9hZGRyICsgVFhfU1RBVFVTKTsKKwlvdXR3KHN0YXR1cywgaW9hZGRyICsgVFhfU1RBVFVTKTsKKworCWlmIChuZXRfZGVidWcgPiA0KQorCQlwcmludGsoIiVzOiBJbnRlcnJ1cHQgd2l0aCBzdGF0dXMgJTA0eC5cbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKwlpZiAobHAtPnJ4X3N0YXJ0ZWQgPT0gMCAmJgorCSAgICAoc3RhdHVzICYgMHhmZjAwIHx8IChpbmIoaW9hZGRyICsgUlhfTU9ERSkgJiAweDQwKSA9PSAwKSkgeworCQkvKiBHb3QgYSBwYWNrZXQocykuCisJCSAgIFdlIGNhbm5vdCBleGVjdXRlIG5ldF9yeCBtb3JlIHRoYW4gb25jZSBhdCB0aGUgc2FtZSB0aW1lIGZvcgorCQkgICB0aGUgc2FtZSBkZXZpY2UuIER1cmluZyBleGVjdXRpbmcgbmV0X3J4LCB3ZSBwb3NzaWJseSBjYXRjaCBhCisJCSAgIFR4IGludGVycnVwdC4gVGh1cyB3ZSBmbGFnIG9uIHJ4X3N0YXJ0ZWQsIHNvIHRoYXQgd2UgcHJldmVudAorCQkgICB0aGUgaW50ZXJydXB0IHJvdXRpbmUgKG5ldF9pbnRlcnJ1cHQpIHRvIGRpdmUgaW50byBuZXRfcngKKwkJICAgYWdhaW4uICovCisJCWhhbmRsZWQgPSAxOworCQlscC0+cnhfc3RhcnRlZCA9IDE7CisJCW91dGIoMHgwMCwgaW9hZGRyICsgUlhfSU5UUik7CS8qIERpc2FibGUgUlggaW50ci4gKi8KKwkJbmV0X3J4KGRldik7CisJCW91dGIoMHg4MSwgaW9hZGRyICsgUlhfSU5UUik7CS8qIEVuYWJsZSAgUlggaW50ci4gKi8KKwkJbHAtPnJ4X3N0YXJ0ZWQgPSAwOworCX0KKwlpZiAoc3RhdHVzICYgMHgwMGZmKSB7CisJCWhhbmRsZWQgPSAxOworCQlpZiAoc3RhdHVzICYgMHgwMikgeworCQkJLyogTW9yZSB0aGFuIDE2IGNvbGxpc2lvbnMgb2NjdXJyZWQgKi8KKwkJCWlmIChuZXRfZGVidWcgPiA0KQorCQkJCXByaW50aygiJXM6IDE2IENvbGxpc2lvbiBvY2N1ciBkdXJpbmcgVHhpbmcuXG4iLCBkZXYtPm5hbWUpOworCQkJLyogQ2FuY2VsIHNlbmRpbmcgYSBwYWNrZXQuICovCisJCQlvdXRiKDB4MDMsIGlvYWRkciArIENPTDE2Q05UTCk7CisJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOworCQl9CisJCWlmIChzdGF0dXMgJiAweDgyKSB7CisJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJLyogVGhlIFR4IHF1ZXVlIGhhcyBhbnkgcGFja2V0cyBhbmQgaXMgbm90IGJlaW5nCisJCQkgICB0cmFuc2ZlcnJlZCBhIHBhY2tldCBmcm9tIHRoZSBob3N0LCBzdGFydAorCQkJICAgdHJhbnNtaXR0aW5nLiAqLworCQkJaWYgKGxwLT50eF9xdWV1ZSAmJiBscC0+dHhfcXVldWVfcmVhZHkpIHsKKwkJCQlvdXRiKDB4ODAgfCBscC0+dHhfcXVldWUsIGlvYWRkciArIFRYX1NUQVJUKTsKKwkJCQlscC0+dHhfcXVldWUgPSAwOworCQkJCWxwLT50eF9xdWV1ZV9sZW4gPSAwOworCQkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCQl9IGVsc2UgeworCQkJCWxwLT50eF9zdGFydGVkID0gMDsKKwkJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQkJfQorCQl9CisJfQorCisJc3Bpbl91bmxvY2sgKCZscC0+bG9jayk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLiAqLworc3RhdGljIHZvaWQKK25ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGJvZ3VzY291bnQgPSA1OworCisJd2hpbGUgKChpbmIoaW9hZGRyICsgUlhfTU9ERSkgJiAweDQwKSA9PSAwKSB7CisJCXVzaG9ydCBzdGF0dXMgPSBpbncoaW9hZGRyICsgREFUQVBPUlQpOworCQl1c2hvcnQgcGt0X2xlbiA9IGludyhpb2FkZHIgKyBEQVRBUE9SVCk7CisKKwkJaWYgKG5ldF9kZWJ1ZyA+IDQpCisJCQlwcmludGsoIiVzOiBSeGluZyBwYWNrZXQgbW9kZSAlMDJ4IHN0YXR1cyAlMDR4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGluYihpb2FkZHIgKyBSWF9NT0RFKSwgc3RhdHVzKTsKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQlpZiAoc3RhdHVzID09IDApIHsKKwkJCW91dGIoMHgwNSwgaW9hZGRyICsgUlhfQ1RSTCk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwkJaWYgKChzdGF0dXMgJiAweEYwKSAhPSAweDIwKSB7CS8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAweDA4KSBscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIDB4MDQpIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAweDAyKSBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIDB4MDEpIGxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlpZiAocGt0X2xlbiA+IDE1NTApIHsKKwkJCQlwcmludGsoIiVzOiBUaGUgQVQxNzAwIGNsYWltZWQgYSB2ZXJ5IGxhcmdlIHBhY2tldCwgc2l6ZSAlZC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCQkJLyogUHJpbWUgdGhlIEZJRk8gYW5kIHRoZW4gZmx1c2ggdGhlIHBhY2tldC4gKi8KKwkJCQlpbncoaW9hZGRyICsgREFUQVBPUlQpOyBpbncoaW9hZGRyICsgREFUQVBPUlQpOworCQkJCW91dGIoMHgwNSwgaW9hZGRyICsgUlhfQ1RSTCk7CisJCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWJyZWFrOworCQkJfQorCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzMpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKCIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldCAobGVuICVkKS5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCQkJLyogUHJpbWUgdGhlIEZJRk8gYW5kIHRoZW4gZmx1c2ggdGhlIHBhY2tldC4gKi8KKwkJCQlpbncoaW9hZGRyICsgREFUQVBPUlQpOyBpbncoaW9hZGRyICsgREFUQVBPUlQpOworCQkJCW91dGIoMHgwNSwgaW9hZGRyICsgUlhfQ1RSTCk7CisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUoc2tiLDIpOworCisJCQlpbnN3KGlvYWRkciArIERBVEFQT1JULCBza2JfcHV0KHNrYixwa3RfbGVuKSwgKHBrdF9sZW4gKyAxKSA+PiAxKTsKKwkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0KKwkJaWYgKC0tYm9ndXNjb3VudCA8PSAwKQorCQkJYnJlYWs7CisJfQorCisJLyogSWYgYW55IHdvcnRoLXdoaWxlIHBhY2tldHMgaGF2ZSBiZWVuIHJlY2VpdmVkLCBkZXZfcmludCgpCisJICAgaGFzIGRvbmUgYSBtYXJrX2JoKE5FVF9CSCkgZm9yIHVzIGFuZCB3aWxsIHdvcmsgb24gdGhlbQorCSAgIHdoZW4gd2UgZ2V0IHRvIHRoZSBib3R0b20taGFsZiByb3V0aW5lLiAqLworCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCQlpZiAoKGluYihpb2FkZHIgKyBSWF9NT0RFKSAmIDB4NDApID09IDB4NDApCisJCQkJYnJlYWs7CisJCQlpbncoaW9hZGRyICsgREFUQVBPUlQpOwkJCQkvKiBkdW1teSBzdGF0dXMgcmVhZCAqLworCQkJb3V0YigweDA1LCBpb2FkZHIgKyBSWF9DVFJMKTsKKwkJfQorCisJCWlmIChuZXRfZGVidWcgPiA1KQorCQkJcHJpbnRrKCIlczogRXhpbnQgUnggcGFja2V0IHdpdGggbW9kZSAlMDJ4IGFmdGVyICVkIHRpY2tzLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGluYihpb2FkZHIgKyBSWF9NT0RFKSwgaSk7CisJfQorCXJldHVybjsKK30KKworLyogVGhlIGludmVyc2Ugcm91dGluZSB0byBuZXRfb3BlbigpLiAqLworc3RhdGljIGludCBuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogU2V0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMCB0byBkaXNhYmxlIFR4IGFuZCBSeC4gKi8KKwlvdXRiKDB4ZGEsIGlvYWRkciArIENPTkZJR18wKTsKKworCS8qIE5vIHN0YXRpc3RpYyBjb3VudGVycyBvbiB0aGUgY2hpcCB0byB1cGRhdGUuICovCisKKwkvKiBEaXNhYmxlIHRoZSBJUlEgb24gYm9hcmRzIG9mIGZtdjE4eCB3aGVyZSBpdCBpcyBmZWFzaWJsZS4gKi8KKwlpZiAobHAtPmp1bXBlcmVkKSB7CisJCW91dGIoMHgwMCwgaW9hZGRyICsgSU9DT05GSUcxKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJfQorCisJLyogUG93ZXItZG93biB0aGUgY2hpcC4gIEdyZWVuLCBncmVlbiwgZ3JlZW4hICovCisJb3V0YigweDAwLCBpb2FkZHIgKyBDT05GSUdfMSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLgorICAgVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQuCisgICBUaGVyZSBhcmUgbm8gb24tY2hpcCBjb3VudGVycywgc28gdGhpcyBmdW5jdGlvbiBpcyB0cml2aWFsLgorKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCituZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKgorICBTZXQgdGhlIG11bHRpY2FzdC9wcm9taXNjdW91cyBtb2RlIGZvciB0aGlzIGFkYXB0b3IuCisqLworCitzdGF0aWMgdm9pZAorc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgbWNfZmlsdGVyWzhdOwkJIC8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50aygiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJb3V0YigzLCBpb2FkZHIgKyBSWF9NT0RFKTsJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPiBNQ19GSUxURVJCUkVBSworCQkJICAgfHwgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBmaWx0ZXIgcGVyZmVjdGx5IC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJbWVtc2V0KG1jX2ZpbHRlciwgMHhmZiwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlvdXRiKDIsIGlvYWRkciArIFJYX01PREUpOwkvKiBVc2Ugbm9ybWFsIG1vZGUuICovCisJfSBlbHNlIGlmIChkZXYtPm1jX2NvdW50ID09IDApIHsKKwkJbWVtc2V0KG1jX2ZpbHRlciwgMHgwMCwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlvdXRiKDEsIGlvYWRkciArIFJYX01PREUpOwkvKiBJZ25vcmUgYWxtb3N0IGFsbCBtdWx0aWNhc3RzLiAqLworCX0gZWxzZSB7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQlpbnQgaTsKKworCQltZW1zZXQobWNfZmlsdGVyLCAwLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkJIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQl1bnNpZ25lZCBpbnQgYml0ID0KKwkJCQlldGhlcl9jcmNfbGUoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDI2OworCQkJbWNfZmlsdGVyW2JpdCA+PiAzXSB8PSAoMSA8PCBiaXQpOworCQl9CisJCW91dGIoMHgwMiwgaW9hZGRyICsgUlhfTU9ERSk7CS8qIFVzZSBub3JtYWwgbW9kZS4gKi8KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJmxwLT5sb2NrLCBmbGFncyk7CisJaWYgKG1lbWNtcChtY19maWx0ZXIsIGxwLT5tY19maWx0ZXIsIHNpemVvZihtY19maWx0ZXIpKSkgeworCQlpbnQgc2F2ZWRfYmFuayA9IGludyhpb2FkZHIgKyBDT05GSUdfMCk7CisJCS8qIFN3aXRjaCB0byBiYW5rIDEgYW5kIHNldCB0aGUgbXVsdGljYXN0IHRhYmxlLiAqLworCQlvdXR3KChzYXZlZF9iYW5rICYgfjB4MEMwMCkgfCAweDA0ODAsIGlvYWRkciArIENPTkZJR18wKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCW91dGIobWNfZmlsdGVyW2ldLCBpb2FkZHIgKyBQT1JUX09GRlNFVCg4ICsgaSkpOworCQltZW1jcHkobHAtPm1jX2ZpbHRlciwgbWNfZmlsdGVyLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCW91dHcoc2F2ZWRfYmFuaywgaW9hZGRyICsgQ09ORklHXzApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmbHAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm47Cit9CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2F0MTcwMDsKKworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShuZXRfZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiQVQxNzAwL0ZNVjE4WCBJL08gYmFzZSBhZGRyZXNzIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIkFUMTcwMC9GTVYxOFggSVJRIG51bWJlciIpOworTU9EVUxFX1BBUk1fREVTQyhuZXRfZGVidWcsICJBVDE3MDAvRk1WMThYIGRlYnVnIGxldmVsICgwLTYpIik7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWlmIChpbyA9PSAwKQorCQlwcmludGsoImF0MTcwMDogWW91IHNob3VsZCBub3QgdXNlIGF1dG8tcHJvYmluZyB3aXRoIGluc21vZCFcbiIpOworCWRldl9hdDE3MDAgPSBhdDE3MDBfcHJvYmUoLTEpOworCWlmIChJU19FUlIoZGV2X2F0MTcwMCkpCisJCXJldHVybiBQVFJfRVJSKGRldl9hdDE3MDApOworCXJldHVybiAwOworfQorCit2b2lkCitjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldl9hdDE3MDApOworCWNsZWFudXBfY2FyZChkZXZfYXQxNzAwKTsKKwlmcmVlX25ldGRldihkZXZfYXQxNzAwKTsKK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1jIGF0MTcwMC5jIgorICogIGFsdC1jb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RWRVJTSU9OUyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWMgYXQxNzAwLmMiCisgKiAgdGFiLXdpZHRoOiA0CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDQKKyAqICBjLWluZGVudC1sZXZlbDogNAorICogRW5kOgorICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0YXJpX2Jpb25ldC5jIGIvZHJpdmVycy9uZXQvYXRhcmlfYmlvbmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5OGNlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2F0YXJpX2Jpb25ldC5jCkBAIC0wLDAgKzEsNjc0IEBACisvKiBiaW9uZXQuYyAgICAgQmlvTmV0LTEwMCBkZXZpY2UgZHJpdmVyIGZvciBsaW51eDY4ay4KKyAqCisgKiBWZXJzaW9uOglAKCMpYmlvbmV0LmMJMS4wCTAyLzA2Lzk2CisgKgorICogQXV0aG9yOglIYXJ0bXV0IExhdWUgPGxhdWVAaWZrLW1wLnVuaS1raWVsLmRlPgorICogYW5kCQlUb3JzdGVuIE5hcmplcyA8bmFyamVzQGlmay1tcC51bmkta2llbC5kZT4KKyAqCisgKiBMaXR0bGUgYWRhcHRpb25zIGZvciBpbnRlZ3JhdGlvbiBpbnRvIHBsNyBieSBSb21hbiBIb2RlaworICoKKyAqIFNvbWUgY2hhbmdlcyBpbiBiaW9uZXRfcG9sbF9yeCBieSBLYXJsLUhlaW56IExvaG5lcgorICoKKwlXaGF0IGlzIGl0ID8KKwktLS0tLS0tLS0tLS0KKwlUaGlzIGRyaXZlciBjb250cm9scyB0aGUgQklPTkVULTEwMCBMQU4tQWRhcHRlciB3aGljaCBjb25uZWN0cworCWFuIEFUQVJJIFNUL1RUIHZpYSB0aGUgQUNTSS1wb3J0IHRvIGFuIEV0aGVybmV0LWJhc2VkIG5ldHdvcmsuCisKKwlUaGlzIHZlcnNpb24gY2FuIGJlIGNvbXBpbGVkIGFzIGEgbG9hZGFibGUgbW9kdWxlIChTZWUgdGhlCisJY29tcGlsZSBjb21tYW5kIGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlKS4KKwlBdCBsb2FkIHRpbWUsIHlvdSBjYW4gb3B0aW9uYWxseSBzZXQgdGhlIGRlYnVnZ2luZyBsZXZlbCBhbmQgdGhlCisJZmFzdGVzdCByZXNwb25zZSB0aW1lIG9uIHRoZSBjb21tYW5kIGxpbmUgb2YgJ2luc21vZCcuCisKKwknYmlvbmV0X2RlYnVnJworCQljb250cm9scyB0aGUgYW1vdW50IG9mIGRpYWdub3N0aWMgbWVzc2FnZXM6CisJICAwICA6IG5vIG1lc3NhZ2VzCisJICA+MCA6IHNlZSBjb2RlIGZvciBtZWFuaW5nIG9mIHByaW50ZWQgbWVzc2FnZXMKKworCSdiaW9uZXRfbWluX3BvbGxfdGltZScgKGFsd2F5cyA+PTEpCisJCWdpdmVzIHRoZSB0aW1lIChpbiBqaWZmaWVzKSBiZXR3ZWVuIHBvbGxzLiBMb3cgdmFsdWVzCisJCWluY3JlYXNlIHRoZSBzeXN0ZW0gbG9hZCAoYmV3YXJlISkKKworCVdoZW4gbG9hZGVkLCBhIG5ldCBkZXZpY2Ugd2l0aCB0aGUgbmFtZSAnYmlvMCcgYmVjb21lcyBhdmFpbGFibGUsCisJd2hpY2ggY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgdXN1YWwgJ2lmY29uZmlnJyBjb21tYW5kLgorCisJSXQgaXMgcG9zc2libGUgdG8gY29tcGlsZSB0aGlzIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwgbGlrZSBvdGhlcgorCShuZXQpIGRyaXZlcnMuIEZvciB0aGlzIHB1cnBvc2UsIHNvbWUgc291cmNlIGZpbGVzIChlLmcuIGNvbmZpZy1maWxlcworCW1ha2VmaWxlcywgU3BhY2UuYykgbXVzdCBiZSBjaGFuZ2VkIGFjY29yZGluZ2x5LiAoWW91IG1heSByZWZlciB0bworCW90aGVyIGRyaXZlcnMgaG93IHRvIGRvIGl0LikgSW4gdGhpcyBjYXNlLCB0aGUgZGV2aWNlIHdpbGwgYmUgZGV0ZWN0ZWQKKwlhdCBib290IHRpbWUgYW5kIChwcm9iYWJseSkgYXBwZWFyIGFzICdldGgwJy4KKworCVRoaXMgY29kZSBpcyBiYXNlZCBvbiBzZXZlcmFsIHNvdXJjZXM6CisJLSBUaGUgZHJpdmVyIGNvZGUgZm9yIGEgcGFyYWxsZWwgcG9ydCBldGhlcm5ldCBhZGFwdGVyIGJ5CisJICBEb25hbGQgQmVja2VyIChzZWUgZmlsZSAnYXRwLmMnIGZyb20gdGhlIFBDIGxpbnV4IGRpc3RyaWJ1dGlvbikKKwktIFRoZSBBQ1NJIGNvZGUgYnkgUm9tYW4gSG9kZWsgZm9yIHRoZSBBVEFSSS1BQ1NJIGhhcmRkaXNrIHN1cHBvcnQKKwkgIGFuZCBETUEgaGFuZGxpbmcuCisJLSBWZXJ5IGxpbWl0ZWQgaW5mb3JtYXRpb24gYWJvdXQgbW92aW5nIHBhY2tldHMgaW4gYW5kIG91dCBvZiB0aGUKKwkgIEJJT05FVC1hZGFwdGVyIGZyb20gdGhlIFRDUCBwYWNrYWdlIGZvciBUT1MgYnkgQmlvRGF0YSBHbWJILgorCisJVGhlb3J5IG9mIE9wZXJhdGlvbgorCS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlCZWNhdXNlIHRoZSBBVEFSSSBETUEgcG9ydCBpcyB1c3VhbGx5IHNoYXJlZCBiZXR3ZWVuIHNldmVyYWwKKwlkZXZpY2VzIChlZy4gaGFyZGRpc2ssIGZsb3BweSkgd2UgY2Fubm90IGJsb2NrIHRoZSBBQ1NJIGJ1cworCXdoaWxlIHdhaXRpbmcgZm9yIGludGVycnVwdHMuIFRoZXJlZm9yZSB3ZSB1c2UgYSBwb2xsaW5nIG1lY2hhbmlzbQorCXRvIGZldGNoIHBhY2tldHMgZnJvbSB0aGUgYWRhcHRlci4gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2Ugc2VuZAorCXBhY2tldHMgd2l0aG91dCBjaGVja2luZyB0aGF0IHRoZSBwcmV2aW91cyBwYWNrZXQgaGFzIGJlZW4gc2VudCB0bworCXRoZSBMQU4uIFdlIHJlbHkgb24gdGhlIGhpZ2hlciBsZXZlbHMgb2YgdGhlIG5ldHdvcmtpbmcgY29kZSB0byBkZXRlY3QKKwltaXNzaW5nIHBhY2tldHMgYW5kIHJlc2VuZCB0aGVtLgorCisJQmVmb3JlIHdlIGFjY2VzcyB0aGUgQVRBUkkgRE1BIGNvbnRyb2xsZXIsIHdlIGNoZWNrIGlmIGFub3RoZXIKKwlwcm9jZXNzIGlzIHVzaW5nIHRoZSBETUEuIElmIG5vdCwgd2UgbG9jayB0aGUgRE1BLCBwZXJmb3JtIG9uZSBvcgorCW1vcmUgcGFja2V0IHRyYW5zZmVycyBhbmQgdW5sb2NrIHRoZSBETUEgYmVmb3JlIHJldHVybmluZy4KKwlXZSBkbyBub3QgdXNlICdzdGRtYV9sb2NrJyB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBpdCBpcyB1bmNsZWFyCisJaWYgdGhlIG5ldHdvcmtpbmcgY29kZSBjYW4gYmUgc2V0IHRvIHNsZWVwLCB3aGljaCB3aWxsIGhhcHBlbiBpZgorCWFub3RoZXIgKHBvc3NpYmx5IHNsb3cpIGRldmljZSBpcyB1c2luZyB0aGUgRE1BIGNvbnRyb2xsZXIuCisKKwlUaGUgcG9sbGluZyBpcyBkb25lIHZpYSB0aW1lciBpbnRlcnJ1cHRzIHdoaWNoIHBlcmlvZGljYWxseQorCSdzaW11bGF0ZScgYW4gaW50ZXJydXB0IGZyb20gdGhlIEV0aGVybmV0IGFkYXB0ZXIuIFRoZSB0aW1lIChpbiBqaWZmaWVzKQorCWJldHdlZW4gcG9sbHMgdmFyaWVzIGRlcGVuZGluZyBvbiBhbiBlc3RpbWF0ZSBvZiB0aGUgbmV0IGFjdGl2aXR5LgorCVRoZSBhbGxvd2VkIHJhbmdlIGlzIGdpdmVuIGJ5IHRoZSB2YXJpYWJsZSAnYmlvbmV0X21pbl9wb2xsX3RpbWUnCisJZm9yIHRoZSBsb3dlciAoZmFzdGVzdCkgbGltaXQgYW5kIHRoZSBjb25zdGFudCAnTUFYX1BPTExfVElNRScKKwlmb3IgdGhlIGhpZ2hlciAoc2xvd2VzdCkgbGltaXQuCisKKwlXaGVuZXZlciBhIHBhY2tldCBhcnJpdmVzLCB3ZSBzd2l0Y2ggdG8gZmFzdGVzdCByZXNwb25zZSBieSBzZXR0aW5nCisJdGhlIHBvbGxpbmcgdGltZSB0byBpdHMgbG93ZXN0IGxpbWl0LiBJZiB0aGUgZm9sbG93aW5nIHBvbGwgZmFpbHMsCisJYmVjYXVzZSBubyBwYWNrZXRzIGhhdmUgYXJyaXZlZCwgd2UgaW5jcmVhc2UgdGhlIHRpbWUgZm9yIHRoZSBuZXh0CisJcG9sbC4gV2hlbiB0aGUgbmV0IGFjdGl2aXR5IGlzIGxvdywgdGhlIHBvbGxpbmcgdGltZSBlZmZlY3RpdmVseQorCXN0YXlzIGF0IGl0cyBtYXhpbXVtIHZhbHVlLCByZXN1bHRpbmcgaW4gdGhlIGxvd2VzdCBsb2FkIGZvciB0aGUKKwltYWNoaW5lLgorICovCisKKyNkZWZpbmUgTUFYX1BPTExfVElNRQkxMAorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gPQorCSJiaW9uZXQuYzp2MS4wIDA2LWZlYi05NiAoYykgSGFydG11dCBMYXVlLlxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+CisjaW5jbHVkZSA8YXNtL2F0YXJpaW50cy5oPgorI2luY2x1ZGUgPGFzbS9hdGFyaV9hY3NpLmg+CisjaW5jbHVkZSA8YXNtL2F0YXJpX3N0ZG1hLmg+CisKKworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnCisgKi8KKyNpZm5kZWYgTkVUX0RFQlVHCisjZGVmaW5lIE5FVF9ERUJVRyAwCisjZW5kaWYKKy8qCisgKiBHbG9iYWwgdmFyaWFibGUgJ2Jpb25ldF9kZWJ1ZycuIENhbiBiZSBzZXQgYXQgbG9hZCB0aW1lIGJ5ICdpbnNtb2QnCisgKi8KK3Vuc2lnbmVkIGludCBiaW9uZXRfZGVidWcgPSBORVRfREVCVUc7CitNT0RVTEVfUEFSTShiaW9uZXRfZGVidWcsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGJpb25ldF9kZWJ1ZywgImJpb25ldCBkZWJ1ZyBsZXZlbCAoMC0yKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGJpb25ldF9taW5fcG9sbF90aW1lID0gMjsKKworCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4KKyAqLworc3RydWN0IG5ldF9sb2NhbCB7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJbG9uZyBvcGVuX3RpbWU7CQkJLyogZm9yIGRlYnVnZ2luZyAqLworCWludCAgcG9sbF90aW1lOwkJCS8qIHBvbGxpbmcgdGltZSB2YXJpZXMgd2l0aCBuZXQgbG9hZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBuaWNfcGt0X3MgewkJLyogcGFja2V0IGZvcm1hdCAqLworCXVuc2lnbmVkIGNoYXIJc3RhdHVzOworCXVuc2lnbmVkIGNoYXIJZHVtbXk7CisJdW5zaWduZWQgY2hhcglsX2xvLCBsX2hpOworCXVuc2lnbmVkIGNoYXIJYnVmZmVyWzMwMDBdOworfSAqbmljX3BhY2tldDsKK3Vuc2lnbmVkIGNoYXIgKnBoeXNfbmljX3BhY2tldDsKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLgorICovCitzdGF0aWMgaW50IGJpb25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBiaW9uZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBiaW9uZXRfcG9sbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgYmlvbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYmlvbmV0X3RpY2sodW5zaWduZWQgbG9uZyk7CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBiaW9uZXRfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihiaW9uZXRfdGljaywgMCwgMCk7CisKKyNkZWZpbmUgU1RSQU1fQUREUihhKQkoKChhKSAmIDB4ZmYwMDAwMDApID09IDApCisKKy8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYWNjZXNzIHRoZSBldGhlcm5ldCBib2FyZCBjb25uZWN0ZWQgdG8gdGhlCisgKiBBQ1NJIHBvcnQgdmlhIHRoZSBzdF9kbWEgY2hpcC4KKyAqLworI2RlZmluZSBOT0RFX0FEUiAweDYwCisKKyNkZWZpbmUgQ19SRUFEIDgKKyNkZWZpbmUgQ19XUklURSAweDBhCisjZGVmaW5lIENfR0VURUEgMHgwZgorI2RlZmluZSBDX1NFVENSIDB4MGUKKworc3RhdGljIGludAorc2VuZGNtZCh1bnNpZ25lZCBpbnQgYTAsIHVuc2lnbmVkIGludCBtb2QsIHVuc2lnbmVkIGludCBjbWQpIHsKKwl1bnNpZ25lZCBpbnQgYzsKKworCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAobW9kIHwgKChhMCkgPyAyIDogMCkgfCAweDg4KTsKKwlkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50ID0gY21kOworCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAobW9kIHwgMHg4YSk7CisKKwlpZiggIWFjc2lfd2FpdF9mb3JfSVJRKEhaLzIpICkJLyogd2FpdCBmb3IgY21kIGFjayAqLworCQlyZXR1cm4gLTE7CQkvKiB0aW1lb3V0ICovCisKKwljID0gZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudDsKKwlyZXR1cm4gKGMgJiAweGZmKTsKK30KKworCitzdGF0aWMgdm9pZAorc2V0X3N0YXR1cyhpbnQgY3IpIHsKKwlzZW5kY21kKDAsMHgxMDAsTk9ERV9BRFIgfCBDX1NFVENSKTsgICAgLyogQ01EOiBTRVQgQ1IgKi8KKwlzZW5kY21kKDEsMHgxMDAsY3IpOworCisJZG1hX3dkLmRtYV9tb2RlX3N0YXR1cyA9IDB4ODA7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9zdGF0dXModW5zaWduZWQgY2hhciAqYWRyKSB7CisJaW50IGksYzsKKworCURJU0FCTEVfSVJRKCk7CisJYyA9IHNlbmRjbWQoMCwweDAwLE5PREVfQURSIHwgQ19HRVRFQSk7ICAvKiBDTUQ6IEdFVCBFVEggQURSKi8KKwlpZiggYyA8IDAgKSBnb3RvIGdzZW5kOworCisJLyogbm93IHJlYWQgc3RhdHVzIGJ5dGVzICovCisKKwlmb3IgKGk9MDsgaTw2OyBpKyspIHsKKwkJZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudCA9IDA7CS8qIHJlcXVlc3QgbmV4dCBieXRlICovCisKKyAgICAJCWlmKCAhYWNzaV93YWl0X2Zvcl9JUlEoSFovMikgKSB7CS8qIHdhaXQgZm9yIGNtZCBhY2sgKi8KKwkJCWMgPSAtMTsKKwkJCWdvdG8gZ3NlbmQ7CQkvKiB0aW1lb3V0ICovCisJCX0KKwkJYyA9IGRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQ7CisJCSphZHIrKyA9ICh1bnNpZ25lZCBjaGFyKWM7CisJfQorCWMgPSAxOworZ3NlbmQ6CisgIAlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gMHg4MDsKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIGlycXJldHVybl90CitiaW9uZXRfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqZnApIHsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworc3RhdGljIGludAorZ2V0X2ZyYW1lKHVuc2lnbmVkIGxvbmcgcGFkZHIsIGludCBvZGQpIHsKKwlpbnQgYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRElTQUJMRV9JUlEoKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCQk9IDB4OWE7CisJZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwkJPSAweDE5YTsKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCQk9IDB4OWE7CisJZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudAk9IDB4MDQ7CQkvKiBzZWN0b3IgY291bnQgKHdhcyA1KSAqLworCWRtYV93ZC5kbWFfbG8JCQk9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOworCXBhZGRyID4+PSA4OworCWRtYV93ZC5kbWFfbWQJCQk9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOworCXBhZGRyID4+PSA4OworCWRtYV93ZC5kbWFfaGkJCQk9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWMgPSBzZW5kY21kKDAsMHgwMCxOT0RFX0FEUiB8IENfUkVBRCk7CS8qIENNRDogUkVBRCAqLworCWlmKCBjIDwgMTI4ICkgZ290byByZW5kOworCisJLyogbm93IHJlYWQgYmxvY2sgKi8KKworCWMgPSBzZW5kY21kKDEsMHgwMCxvZGQpOwkvKiBvZGQgZmxhZyBmb3IgYWRkcmVzcyBzaGlmdCAqLworCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDBhOworCisJaWYoICFhY3NpX3dhaXRfZm9yX0lSUSgxMDApICkgewkvKiB3YWl0IGZvciBETUEgdG8gY29tcGxldGUgKi8KKwkJYyA9IC0xOworCQlnb3RvIHJlbmQ7CisJfQorCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDhhOworCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDE4YTsKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHg4YTsKKwljID0gZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudDsKKworCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDg4OworCWMgPSBkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50OworCWMgPSAxOworCityZW5kOgorCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDgwOworCXVkZWxheSg0MCk7CisJYWNzaV93YWl0X2Zvcl9ub0lSUSgyMCk7CisJcmV0dXJuIGM7Cit9CisKKworc3RhdGljIGludAoraGFyZHdhcmVfc2VuZF9wYWNrZXQodW5zaWduZWQgbG9uZyBwYWRkciwgaW50IGNudCkgeworCXVuc2lnbmVkIGludCBjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlESVNBQkxFX0lSUSgpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDE5YTsKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHg5YTsKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHgxOWE7CisJZG1hX3dkLmRtYV9sbwkJPSAodW5zaWduZWQgY2hhcilwYWRkcjsKKwlwYWRkciA+Pj0gODsKKwlkbWFfd2QuZG1hX21kCQk9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOworCXBhZGRyID4+PSA4OworCWRtYV93ZC5kbWFfaGkJCT0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7CisKKwlkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50CT0gMHg0OwkJLyogc2VjdG9yIGNvdW50ICovCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJYyA9IHNlbmRjbWQoMCwweDEwMCxOT0RFX0FEUiB8IENfV1JJVEUpOwkvKiBDTUQ6IFdSSVRFICovCisJYyA9IHNlbmRjbWQoMSwweDEwMCxjbnQmMHhmZik7CisJYyA9IHNlbmRjbWQoMSwweDEwMCxjbnQ+PjgpOworCisJLyogbm93IHdyaXRlIGJsb2NrICovCisKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHgxMGE7CS8qIERNQSBlbmFibGUgKi8KKwlpZiggIWFjc2lfd2FpdF9mb3JfSVJRKDEwMCkgKQkJLyogd2FpdCBmb3IgRE1BIHRvIGNvbXBsZXRlICovCisJCWdvdG8gZW5kOworCisJZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4MTlhOwkvKiBETUEgZGlzYWJsZSAhICovCisJYyA9IGRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQ7CisKK2VuZDoKKwljID0gc2VuZGNtZCgxLDB4MTAwLDApOworCWMgPSBzZW5kY21kKDEsMHgxMDAsMCk7CisKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHgxODA7CisJdWRlbGF5KDQwKTsKKwlhY3NpX3dhaXRfZm9yX25vSVJRKDIwKTsKKwlyZXR1cm4oIGMgJiAweDAyKTsKK30KKworCisvKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0b3Igb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZiBvbmUgZXhpc3RzLgorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBiaW9uZXRfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBjaGFyIHN0YXRpb25fYWRkcls2XTsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCXN0YXRpYyBpbnQgbm9fbW9yZV9mb3VuZDsJLyogYXZvaWQgIlByb2JpbmcgZm9yLi4uIiBwcmludGVkIDQgdGltZXMgKi8KKwlpbnQgaTsKKwlpbnQgZXJyOworCisJaWYgKCFNQUNIX0lTX0FUQVJJIHx8IG5vX21vcmVfZm91bmQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCXByaW50aygiUHJvYmluZyBmb3IgQmlvTmV0IDEwMCBBZGFwdGVyLi4uXG4iKTsKKworCXN0ZG1hX2xvY2soYmlvbmV0X2ludHIsIE5VTEwpOworCWkgPSBnZXRfc3RhdHVzKHN0YXRpb25fYWRkcik7CS8qIFJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBQUk9NLiAgKi8KKwlFTkFCTEVfSVJRKCk7CisJc3RkbWFfcmVsZWFzZSgpOworCisJLyogQ2hlY2sgdGhlIGZpcnN0IHRocmVlIG9jdGV0cyBvZiB0aGUgUy5BLiBmb3IgdGhlIG1hbnVmYWN0b3IncyBjb2RlLgorCSAqLworCisJaWYoIGkgPCAwCisJfHwgIHN0YXRpb25fYWRkclswXSAhPSAnQicKKwl8fCAgc3RhdGlvbl9hZGRyWzFdICE9ICdJJworCXx8ICBzdGF0aW9uX2FkZHJbMl0gIT0gJ08nICkgeworCQlub19tb3JlX2ZvdW5kID0gMTsKKwkJcHJpbnRrKCAiTm8gQmlvTmV0IDEwMCBmb3VuZC5cbiIgKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisJfQorCisJaWYgKGJpb25ldF9kZWJ1ZyA+IDAgJiYgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJcHJpbnRrKCIlczogJXMgZm91bmQsIGV0aC1hZGRyOiAlMDJ4LSUwMngtJTAyeDolMDJ4LSUwMngtJTAyeC5cbiIsCisJCWRldi0+bmFtZSwgIkJpb05ldCAxMDAiLAorCQlzdGF0aW9uX2FkZHJbMF0sIHN0YXRpb25fYWRkclsxXSwgc3RhdGlvbl9hZGRyWzJdLAorCQlzdGF0aW9uX2FkZHJbM10sIHN0YXRpb25fYWRkcls0XSwgc3RhdGlvbl9hZGRyWzVdKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisKKwluaWNfcGFja2V0ID0gKHN0cnVjdCBuaWNfcGt0X3MgKilhY3NpX2J1ZmZlcjsKKwlwaHlzX25pY19wYWNrZXQgPSAodW5zaWduZWQgY2hhciAqKXBoeXNfYWNzaV9idWZmZXI7CisJaWYgKGJpb25ldF9kZWJ1ZyA+IDApIHsKKwkJcHJpbnRrKCJuaWNfcGFja2V0IGF0IDB4JXAsIHBoeXMgYXQgMHglcFxuIiwKKwkJCW5pY19wYWNrZXQsIHBoeXNfbmljX3BhY2tldCApOworCX0KKworCWRldi0+b3BlbgkJPSBiaW9uZXRfb3BlbjsKKwlkZXYtPnN0b3AJCT0gYmlvbmV0X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gYmlvbmV0X3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzCQk9IG5ldF9nZXRfc3RhdHM7CisKKwkvKiBGaWxsIGluIHRoZSBmaWVsZHMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCBldGhlcm5ldC1nZW5lcmljCisJICogdmFsdWVzLiBUaGlzIHNob3VsZCBiZSBpbiBhIGNvbW1vbiBmaWxlIGluc3RlYWQgb2YgcGVyLWRyaXZlci4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisjaWYgMAorCQlkZXYtPmJyb2FkY2FzdFtpXSA9IDB4ZmY7CisjZW5kaWYKKwkJZGV2LT5kZXZfYWRkcltpXSAgPSBzdGF0aW9uX2FkZHJbaV07CisJfQorCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmICghZXJyKQorCQlyZXR1cm4gZGV2OworCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpCisgICBzb21ldGltZSBhZnRlciBib290aW5nIHdoZW4gdGhlICdpZmNvbmZpZycgcHJvZ3JhbSBpcyBydW4uCisKKyAgIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAgIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgICB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCitzdGF0aWMgaW50CitiaW9uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGJpb25ldF9kZWJ1ZyA+IDApCisJCXByaW50aygiYmlvbmV0X29wZW5cbiIpOworCXN0ZG1hX2xvY2soYmlvbmV0X2ludHIsIE5VTEwpOworCisJLyogUmVzZXQgdGhlIGhhcmR3YXJlIGhlcmUuCisJICovCisJc2V0X3N0YXR1cyg0KTsKKwlscC0+b3Blbl90aW1lID0gMDsJLypqaWZmaWVzKi8KKwlscC0+cG9sbF90aW1lID0gTUFYX1BPTExfVElNRTsKKworCWRldi0+dGJ1c3kgPSAwOworCWRldi0+aW50ZXJydXB0ID0gMDsKKwlkZXYtPnN0YXJ0ID0gMTsKKworCXN0ZG1hX3JlbGVhc2UoKTsKKwliaW9uZXRfdGltZXIuZGF0YSA9IChsb25nKWRldjsKKwliaW9uZXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBscC0+cG9sbF90aW1lOworCWFkZF90aW1lcigmYmlvbmV0X3RpbWVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYmlvbmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIEJsb2NrIGEgdGltZXItYmFzZWQgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4gIFRoaXMgY291bGQgYmV0dGVyIGJlCisJICogZG9uZSB3aXRoIGF0b21pY19zd2FwKDEsIGRldi0+dGJ1c3kpLCBidXQgc2V0X2JpdCgpIHdvcmtzIGFzIHdlbGwuCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaWYgKHN0ZG1hX2lzbG9ja2VkKCkpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJfQorCWVsc2UgeworCQlpbnQgbGVuZ3RoID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47CisJCXVuc2lnbmVkIGxvbmcgYnVmID0gdmlydF90b19waHlzKHNrYi0+ZGF0YSk7CisJCWludCBzdGF0OworCisJCXN0ZG1hX2xvY2soYmlvbmV0X2ludHIsIE5VTEwpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWlmKCAhU1RSQU1fQUREUihidWYrbGVuZ3RoLTEpICkgeworCQkJbWVtY3B5KG5pY19wYWNrZXQtPmJ1ZmZlciwgc2tiLT5kYXRhLCBsZW5ndGgpOworCQkJYnVmID0gKHVuc2lnbmVkIGxvbmcpJigoc3RydWN0IG5pY19wa3RfcyAqKXBoeXNfbmljX3BhY2tldCktPmJ1ZmZlcjsKKwkJfQorCisJCWlmIChiaW9uZXRfZGVidWcgPjEpIHsKKwkJCXVfY2hhciAqZGF0YSA9IG5pY19wYWNrZXQtPmJ1ZmZlciwgKnA7CisJCQlpbnQgaTsKKwkJCQorCQkJcHJpbnRrKCAiJXM6IFRYIHBrdCB0eXBlIDB4JTR4IGZyb20gIiwgZGV2LT5uYW1lLAorCQkJCSAgKCh1X3Nob3J0ICopZGF0YSlbNl0pOworCisJCQlmb3IoIHAgPSAmZGF0YVs2XSwgaSA9IDA7IGkgPCA2OyBpKysgKQorCQkJCXByaW50aygiJTAyeCVzIiwgKnArKyxpICE9IDUgPyAiOiIgOiAiIiApOworCQkJcHJpbnRrKCIgdG8gIik7CisKKwkJCWZvciggcCA9IGRhdGEsIGkgPSAwOyBpIDwgNjsgaSsrICkKKwkJCQlwcmludGsoIiUwMnglcyIsICpwKyssaSAhPSA1ID8gIjoiIDogIiIgIlxuIiApOworCisJCQlwcmludGsoICIlczogIiwgZGV2LT5uYW1lICk7CisJCQlwcmludGsoIiBkYXRhICUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMngiCisJCQkgICAgICAgIiAlMDJ4JTAyeCUwMnglMDJ4IGxlbiAlZFxuIiwKKwkJCQkgIGRhdGFbMTJdLCBkYXRhWzEzXSwgZGF0YVsxNF0sIGRhdGFbMTVdLCBkYXRhWzE2XSwgZGF0YVsxN10sIGRhdGFbMThdLCBkYXRhWzE5XSwKKwkJCQkgIGRhdGFbMjBdLCBkYXRhWzIxXSwgZGF0YVsyMl0sIGRhdGFbMjNdLCBkYXRhWzI0XSwgZGF0YVsyNV0sIGRhdGFbMjZdLCBkYXRhWzI3XSwKKwkJCQkgIGRhdGFbMjhdLCBkYXRhWzI5XSwgZGF0YVszMF0sIGRhdGFbMzFdLCBkYXRhWzMyXSwgZGF0YVszM10sCisJCQkJICBsZW5ndGggKTsKKwkJfQorCQlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoYnVmLCBsZW5ndGgsIDEpOworCisJCXN0YXQgPSBoYXJkd2FyZV9zZW5kX3BhY2tldChidWYsIGxlbmd0aCk7CisJCUVOQUJMRV9JUlEoKTsKKwkJc3RkbWFfcmVsZWFzZSgpOworCisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlkZXYtPnRidXN5CSA9IDA7CisJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWxwLT5zdGF0cy50eF9ieXRlcys9bGVuZ3RoOworCX0KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkCitiaW9uZXRfcG9sbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBib2d1c2NvdW50ID0gMTA7CisJaW50IHBrdF9sZW4sIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCS8qICsrcm9tYW46IFRha2UgY2FyZSBhdCBsb2NraW5nIHRoZSBTVC1ETUEuLi4gVGhpcyBtdXN0IGJlIGRvbmUgd2l0aCBpbnRzCisJICogb2ZmLCBzaW5jZSBvdGhlcndpc2UgYW4gaW50IGNvdWxkIHNsaXAgaW4gYmV0d2VlbiB0aGUgcXVlc3Rpb24gYW5kIHRoZQorCSAqIGxvY2tpbmcgaXRzZWxmLCBhbmQgdGhlbiB3ZSdkIGdvIHRvIHNsZWVwLi4uIEFuZCBsb2NraW5nIGl0c2VsZiBpcworCSAqIG5lY2Vzc2FyeSB0byBrZWVwIHRoZSBmbG9wcHlfY2hhbmdlIHRpbWVyIGZyb20gd29ya2luZyB3aXRoIFNULURNQQorCSAqIHJlZ2lzdGVycy4gKi8KKwlpZiAoc3RkbWFfaXNsb2NrZWQoKSkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybjsKKwl9CisJc3RkbWFfbG9jayhiaW9uZXRfaW50ciwgTlVMTCk7CisJRElTQUJMRV9JUlEoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlpZiggbHAtPnBvbGxfdGltZSA8IE1BWF9QT0xMX1RJTUUgKSBscC0+cG9sbF90aW1lKys7CisKKwl3aGlsZShib2d1c2NvdW50LS0pIHsKKwkJc3RhdHVzID0gZ2V0X2ZyYW1lKCh1bnNpZ25lZCBsb25nKXBoeXNfbmljX3BhY2tldCwgMCk7CisKKwkJaWYoIHN0YXR1cyA9PSAwICkgYnJlYWs7CisKKwkJLyogR29vZCBwYWNrZXQuLi4gKi8KKworCQlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoKHVuc2lnbmVkIGxvbmcpcGh5c19uaWNfcGFja2V0LCAxNTIwLCAwKTsKKworCQlwa3RfbGVuID0gKG5pY19wYWNrZXQtPmxfaGkgPDwgOCkgfCBuaWNfcGFja2V0LT5sX2xvOworCisJCWxwLT5wb2xsX3RpbWUgPSBiaW9uZXRfbWluX3BvbGxfdGltZTsgICAgLyogZmFzdCBwb2xsICovCisJCWlmKCBwa3RfbGVuID49IDYwICYmIHBrdF9sZW4gPD0gMTUyMCApIHsKKwkJCQkJLyoJXl5eXiB3YXIgMTUxNCAgS0hMICovCisJCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4KKwkJCSAqLworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoIHBrdF9sZW4gKyAyICk7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWJyZWFrOworCQkJfQorCisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlKCBza2IsIDIgKTsJCS8qIDE2IEJ5dGUgYWxpZ24gICovCisJCQlza2JfcHV0KCBza2IsIHBrdF9sZW4gKTsJLyogbWFrZSByb29tICovCisKKwkJCS8qICdza2ItPmRhdGEnIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEuCisJCQkgKi8KKwkJCW1lbWNweShza2ItPmRhdGEsIG5pY19wYWNrZXQtPmJ1ZmZlciwgcGt0X2xlbik7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoIHNrYiwgZGV2ICk7IAorCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJbHAtPnN0YXRzLnJ4X2J5dGVzKz1wa3RfbGVuOworCisJLyogSWYgYW55IHdvcnRoLXdoaWxlIHBhY2tldHMgaGF2ZSBiZWVuIHJlY2VpdmVkLCBkZXZfcmludCgpCisJICAgaGFzIGRvbmUgYSBtYXJrX2JoKElORVRfQkgpIGZvciB1cyBhbmQgd2lsbCB3b3JrIG9uIHRoZW0KKwkgICB3aGVuIHdlIGdldCB0byB0aGUgYm90dG9tLWhhbGYgcm91dGluZS4KKwkgKi8KKworIAkJCWlmIChiaW9uZXRfZGVidWcgPjEpIHsKKyAJCQkJdV9jaGFyICpkYXRhID0gbmljX3BhY2tldC0+YnVmZmVyLCAqcDsKKyAJCQkJaW50IGk7CisgCQkJCQorIAkJCQlwcmludGsoICIlczogUlggcGt0IHR5cGUgMHglNHggZnJvbSAiLCBkZXYtPm5hbWUsCisgCQkJCQkgICgodV9zaG9ydCAqKWRhdGEpWzZdKTsKKyAJCQkJCSAKKyAJCQkJCisgCQkJCWZvciggcCA9ICZkYXRhWzZdLCBpID0gMDsgaSA8IDY7IGkrKyApCisgCQkJCQlwcmludGsoIiUwMnglcyIsICpwKyssaSAhPSA1ID8gIjoiIDogIiIgKTsKKyAJCQkJcHJpbnRrKCIgdG8gIik7CisgCQkJCWZvciggcCA9IGRhdGEsIGkgPSAwOyBpIDwgNjsgaSsrICkKKyAJCQkJCXByaW50aygiJTAyeCVzIiwgKnArKyxpICE9IDUgPyAiOiIgOiAiIiAiXG4iICk7CisgCisgCQkJCXByaW50ayggIiVzOiAiLCBkZXYtPm5hbWUgKTsKKyAJCQkJcHJpbnRrKCIgZGF0YSAlMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4IgorIAkJCQkgICAgICAgIiAlMDJ4JTAyeCUwMnglMDJ4IGxlbiAlZFxuIiwKKyAJCQkJCSAgZGF0YVsxMl0sIGRhdGFbMTNdLCBkYXRhWzE0XSwgZGF0YVsxNV0sIGRhdGFbMTZdLCBkYXRhWzE3XSwgZGF0YVsxOF0sIGRhdGFbMTldLAorIAkJCQkJICBkYXRhWzIwXSwgZGF0YVsyMV0sIGRhdGFbMjJdLCBkYXRhWzIzXSwgZGF0YVsyNF0sIGRhdGFbMjVdLCBkYXRhWzI2XSwgZGF0YVsyN10sCisgCQkJCQkgIGRhdGFbMjhdLCBkYXRhWzI5XSwgZGF0YVszMF0sIGRhdGFbMzFdLCBkYXRhWzMyXSwgZGF0YVszM10sCisgCQkJCQkJICBwa3RfbGVuICk7CisgCQkJfQorIAkJfQorIAkJZWxzZSB7CisgCQkJcHJpbnRrKCIgUGFja2V0IGhhcyB3cm9uZyBsZW5ndGg6ICUwNGQgYnl0ZXNcbiIsIHBrdF9sZW4pOworIAkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKyAJCX0KKyAJfQorCXN0ZG1hX3JlbGVhc2UoKTsKKwlFTkFCTEVfSVJRKCk7CisJcmV0dXJuOworfQorCisvKiBiaW9uZXRfdGljazogY2FsbGVkIGJ5IGJpb25ldF90aW1lci4gUmVhZHMgcGFja2V0cyBmcm9tIHRoZSBhZGFwdGVyLAorICogcGFzc2VzIHRoZW0gdG8gdGhlIGhpZ2hlciBsYXllcnMgYW5kIHJlc3RhcnRzIHRoZSB0aW1lci4KKyAqLworc3RhdGljIHZvaWQKK2Jpb25ldF90aWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkgeworCXN0cnVjdCBuZXRfZGV2aWNlCSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiggYmlvbmV0X2RlYnVnID4gMCAmJiAobHAtPm9wZW5fdGltZSsrICYgNykgPT0gOCApCisJCXByaW50aygiYmlvbmV0X3RpY2s6ICVsZFxuIiwgbHAtPm9wZW5fdGltZSk7CisKKwlpZiggIXN0ZG1hX2lzbG9ja2VkKCkgKSBiaW9uZXRfcG9sbF9yeChkZXYpOworCisJYmlvbmV0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbHAtPnBvbGxfdGltZTsKKwlhZGRfdGltZXIoJmJpb25ldF90aW1lcik7Cit9CisKKy8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gYmlvbmV0X29wZW4oKS4KKyAqLworc3RhdGljIGludAorYmlvbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoYmlvbmV0X2RlYnVnID4gMCkKKwkJcHJpbnRrKCJiaW9uZXRfY2xvc2UsIG9wZW5fdGltZT0lbGRcbiIsIGxwLT5vcGVuX3RpbWUpOworCWRlbF90aW1lcigmYmlvbmV0X3RpbWVyKTsKKwlzdGRtYV9sb2NrKGJpb25ldF9pbnRyLCBOVUxMKTsKKworCXNldF9zdGF0dXMoMCk7CisJbHAtPm9wZW5fdGltZSA9IDA7CisKKwlkZXYtPnRidXN5ID0gMTsKKwlkZXYtPnN0YXJ0ID0gMDsKKworCXN0ZG1hX3JlbGVhc2UoKTsKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCisgICBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yIGNsb3NlZC4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYmlvX2RldjsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJYmlvX2RldiA9IGJpb25ldF9wcm9iZSgtMSk7CisJaWYgKElTX0VSUihiaW9fZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIoYmlvX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihiaW9fZGV2KTsKKwlmcmVlX25ldGRldihiaW9fZGV2KTsKK30KKworI2VuZGlmIC8qIE1PRFVMRSAqLworCisvKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSS91c3Ivc3JjL2xpbnV4L2luY2x1ZGUKKwktYiBtNjhrLWxpbnV4YW91dCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMgorCS1mb21pdC1mcmFtZS1wb2ludGVyIC1waXBlIC1ETU9EVUxFIC1JLi4vLi4vbmV0L2luZXQgLWMgYmlvbmV0LmMiCisgKiAgdmVyc2lvbi1jb250cm9sOiB0CisgKiAga2VwdC1uZXctdmVyc2lvbnM6IDUKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRhcmlfcGFtc25ldC5jIGIvZHJpdmVycy9uZXQvYXRhcmlfcGFtc25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYzM2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hdGFyaV9wYW1zbmV0LmMKQEAgLTAsMCArMSw4OTUgQEAKKy8qIGF0YXJpX3BhbXNuZXQuYyAgICAgUEFNc05ldCBkZXZpY2UgZHJpdmVyIGZvciBsaW51eDY4ay4KKyAqCisgKiBWZXJzaW9uOglAKCMpUEFNc05ldC5jCTAuMt8JMDMvMzEvOTYKKyAqCisgKiBBdXRob3I6ICBUb3JzdGVuIExhbmcgPFRvcnN0ZW4uTGFuZ0BhcC5waHlzaWsudW5pLWdpZXNzZW4uZGU+CisgKiAgICAgICAgICAgICAgICAgICAgICAgPFRvcnN0ZW4uTGFuZ0BqdW5nLmRlPgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIG15IGRyaXZlciBQQU1TRE1BLmMgZm9yIE1pTlQtTmV0IGFuZAorICogb24gdGhlIGRyaXZlciBiaW9uZXQuYyB3cml0dGVuIGJ5CisgKiAgICAgICAgICBIYXJ0bXV0IExhdWUgPGxhdWVAaWZrLW1wLnVuaS1raWVsLmRlPgorICogYW5kICAgICAgVG9yc3RlbiBOYXJqZXMgPG5hcmplc0BpZmstbXAudW5pLWtpZWwuZGU+CisgKgorICogTGl0dGxlIGFkYXB0aW9ucyBmb3IgaW50ZWdyYXRpb24gaW50byBwbDcgYnkgUm9tYW4gSG9kZWsKKyAqCisJV2hhdCBpcyBpdCA/CisJLS0tLS0tLS0tLS0tCisJVGhpcyBkcml2ZXIgY29udHJvbHMgdGhlIFBBTXNOZXQgTEFOLUFkYXB0ZXIgd2hpY2ggY29ubmVjdHMKKwlhbiBBVEFSSSBTVC9UVCB2aWEgdGhlIEFDU0ktcG9ydCB0byBhbiBFdGhlcm5ldC1iYXNlZCBuZXR3b3JrLgorCisJVGhpcyB2ZXJzaW9uIGNhbiBiZSBjb21waWxlZCBhcyBhIGxvYWRhYmxlIG1vZHVsZSAoU2VlIHRoZQorCWNvbXBpbGUgY29tbWFuZCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgZmlsZSkuCisJQXQgbG9hZCB0aW1lLCB5b3UgY2FuIG9wdGlvbmFsbHkgc2V0IHRoZSBkZWJ1Z2dpbmcgbGV2ZWwgYW5kIHRoZQorCWZhc3Rlc3QgcmVzcG9uc2UgdGltZSBvbiB0aGUgY29tbWFuZCBsaW5lIG9mICdpbnNtb2QnLgorCisJJ3BhbXNuZXRfZGVidWcnCisJCWNvbnRyb2xzIHRoZSBhbW91bnQgb2YgZGlhZ25vc3RpYyBtZXNzYWdlczoKKwkgIDAgIDogbm8gbWVzc2FnZXMKKwkgID4wIDogc2VlIGNvZGUgZm9yIG1lYW5pbmcgb2YgcHJpbnRlZCBtZXNzYWdlcworCisJJ3BhbXNuZXRfbWluX3BvbGxfdGltZScgKGFsd2F5cyA+PTEpCisJCWdpdmVzIHRoZSB0aW1lIChpbiBqaWZmaWVzKSBiZXR3ZWVuIHBvbGxzLiBMb3cgdmFsdWVzCisJCWluY3JlYXNlIHRoZSBzeXN0ZW0gbG9hZCAoYmV3YXJlISkKKworCVdoZW4gbG9hZGVkLCBhIG5ldCBkZXZpY2Ugd2l0aCB0aGUgbmFtZSAnZXRoPycgYmVjb21lcyBhdmFpbGFibGUsCisJd2hpY2ggY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgdXN1YWwgJ2lmY29uZmlnJyBjb21tYW5kLgorCisJSXQgaXMgcG9zc2libGUgdG8gY29tcGlsZSB0aGlzIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwgbGlrZSBvdGhlcgorCShuZXQpIGRyaXZlcnMuIEZvciB0aGlzIHB1cnBvc2UsIHNvbWUgc291cmNlIGZpbGVzIChlLmcuIGNvbmZpZy1maWxlcworCW1ha2VmaWxlcywgU3BhY2UuYykgbXVzdCBiZSBjaGFuZ2VkIGFjY29yZGluZ2x5LiAoWW91IG1heSByZWZlciB0bworCW90aGVyIGRyaXZlcnMgaG93IHRvIGRvIGl0LikgSW4gdGhpcyBjYXNlLCB0aGUgZGV2aWNlIHdpbGwgYmUgZGV0ZWN0ZWQKKwlhdCBib290IHRpbWUgYW5kIChwcm9iYWJseSkgYXBwZWFyIGFzICdldGgwJy4KKworCVRoZW9yeSBvZiBPcGVyYXRpb24KKwktLS0tLS0tLS0tLS0tLS0tLS0tCisJQmVjYXVzZSB0aGUgQVRBUkkgRE1BIHBvcnQgaXMgdXN1YWxseSBzaGFyZWQgYmV0d2VlbiBzZXZlcmFsCisJZGV2aWNlcyAoZWcuIGhhcmRkaXNrLCBmbG9wcHkpIHdlIGNhbm5vdCBibG9jayB0aGUgQUNTSSBidXMKKwl3aGlsZSB3YWl0aW5nIGZvciBpbnRlcnJ1cHRzLiBUaGVyZWZvcmUgd2UgdXNlIGEgcG9sbGluZyBtZWNoYW5pc20KKwl0byBmZXRjaCBwYWNrZXRzIGZyb20gdGhlIGFkYXB0ZXIuIEZvciB0aGUgc2FtZSByZWFzb24sIHdlIHNlbmQKKwlwYWNrZXRzIHdpdGhvdXQgY2hlY2tpbmcgdGhhdCB0aGUgcHJldmlvdXMgcGFja2V0IGhhcyBiZWVuIHNlbnQgdG8KKwl0aGUgTEFOLiBXZSByZWx5IG9uIHRoZSBoaWdoZXIgbGV2ZWxzIG9mIHRoZSBuZXR3b3JraW5nIGNvZGUgdG8gZGV0ZWN0CisJbWlzc2luZyBwYWNrZXRzIGFuZCByZXNlbmQgdGhlbS4KKworCUJlZm9yZSB3ZSBhY2Nlc3MgdGhlIEFUQVJJIERNQSBjb250cm9sbGVyLCB3ZSBjaGVjayBpZiBhbm90aGVyCisJcHJvY2VzcyBpcyB1c2luZyB0aGUgRE1BLiBJZiBub3QsIHdlIGxvY2sgdGhlIERNQSwgcGVyZm9ybSBvbmUgb3IKKwltb3JlIHBhY2tldCB0cmFuc2ZlcnMgYW5kIHVubG9jayB0aGUgRE1BIGJlZm9yZSByZXR1cm5pbmcuCisJV2UgZG8gbm90IHVzZSAnc3RkbWFfbG9jaycgdW5jb25kaXRpb25hbGx5IGJlY2F1c2UgaXQgaXMgdW5jbGVhcgorCWlmIHRoZSBuZXR3b3JraW5nIGNvZGUgY2FuIGJlIHNldCB0byBzbGVlcCwgd2hpY2ggd2lsbCBoYXBwZW4gaWYKKwlhbm90aGVyIChwb3NzaWJseSBzbG93KSBkZXZpY2UgaXMgdXNpbmcgdGhlIERNQSBjb250cm9sbGVyLgorCisJVGhlIHBvbGxpbmcgaXMgZG9uZSB2aWEgdGltZXIgaW50ZXJydXB0cyB3aGljaCBwZXJpb2RpY2FsbHkKKwknc2ltdWxhdGUnIGFuIGludGVycnVwdCBmcm9tIHRoZSBFdGhlcm5ldCBhZGFwdGVyLiBUaGUgdGltZSAoaW4gamlmZmllcykKKwliZXR3ZWVuIHBvbGxzIHZhcmllcyBkZXBlbmRpbmcgb24gYW4gZXN0aW1hdGUgb2YgdGhlIG5ldCBhY3Rpdml0eS4KKwlUaGUgYWxsb3dlZCByYW5nZSBpcyBnaXZlbiBieSB0aGUgdmFyaWFibGUgJ2Jpb25ldF9taW5fcG9sbF90aW1lJworCWZvciB0aGUgbG93ZXIgKGZhc3Rlc3QpIGxpbWl0IGFuZCB0aGUgY29uc3RhbnQgJ01BWF9QT0xMX1RJTUUnCisJZm9yIHRoZSBoaWdoZXIgKHNsb3dlc3QpIGxpbWl0LgorCisJV2hlbmV2ZXIgYSBwYWNrZXQgYXJyaXZlcywgd2Ugc3dpdGNoIHRvIGZhc3Rlc3QgcmVzcG9uc2UgYnkgc2V0dGluZworCXRoZSBwb2xsaW5nIHRpbWUgdG8gaXRzIGxvd2VzdCBsaW1pdC4gSWYgdGhlIGZvbGxvd2luZyBwb2xsIGZhaWxzLAorCWJlY2F1c2Ugbm8gcGFja2V0cyBoYXZlIGFycml2ZWQsIHdlIGluY3JlYXNlIHRoZSB0aW1lIGZvciB0aGUgbmV4dAorCXBvbGwuIFdoZW4gdGhlIG5ldCBhY3Rpdml0eSBpcyBsb3csIHRoZSBwb2xsaW5nIHRpbWUgZWZmZWN0aXZlbHkKKwlzdGF5cyBhdCBpdHMgbWF4aW11bSB2YWx1ZSwgcmVzdWx0aW5nIGluIHRoZSBsb3dlc3QgbG9hZCBmb3IgdGhlCisJbWFjaGluZS4KKyAqLworCisjZGVmaW5lIE1BWF9QT0xMX1RJTUUJMTAKKworc3RhdGljIGNoYXIgKnZlcnNpb24gPQorCSJwYW1zbmV0LmM6djAuMmJldGEgMzAtbWFyLTk2IChjKSBUb3JzdGVuIExhbmcuXG4iOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+CisjaW5jbHVkZSA8YXNtL2F0YXJpaW50cy5oPgorI2luY2x1ZGUgPGFzbS9hdGFyaV9zdGRtYS5oPgorI2luY2x1ZGUgPGFzbS9hdGFyaV9hY3NpLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI3VuZGVmIFJFQUQKKyN1bmRlZiBXUklURQorCisvKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcKKyAqLworI2lmbmRlZiBORVRfREVCVUcKKyNkZWZpbmUgTkVUX0RFQlVHIDAKKyNlbmRpZgorLyoKKyAqIEdsb2JhbCB2YXJpYWJsZSAncGFtc25ldF9kZWJ1ZycuIENhbiBiZSBzZXQgYXQgbG9hZCB0aW1lIGJ5ICdpbnNtb2QnCisgKi8KK3Vuc2lnbmVkIGludCBwYW1zbmV0X2RlYnVnID0gTkVUX0RFQlVHOworTU9EVUxFX1BBUk0ocGFtc25ldF9kZWJ1ZywgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MocGFtc25ldF9kZWJ1ZywgInBhbXNuZXQgZGVidWcgZW5hYmxlICgwLTEpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGFtc25ldF9taW5fcG9sbF90aW1lID0gMjsKKworCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4KKyAqLworc3RydWN0IG5ldF9sb2NhbCB7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJbG9uZyBvcGVuX3RpbWU7CQkJLyogZm9yIGRlYnVnZ2luZyAqLworCWludCAgcG9sbF90aW1lOwkJCS8qIHBvbGxpbmcgdGltZSB2YXJpZXMgd2l0aCBuZXQgbG9hZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBuaWNfcGt0X3MgewkJLyogcGFja2V0IGZvcm1hdCAqLworCXVuc2lnbmVkIGNoYXIJYnVmZmVyWzIwNDhdOworfSAqbmljX3BhY2tldCA9IDA7Cit1bnNpZ25lZCBjaGFyICpwaHlzX25pY19wYWNrZXQ7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBIQUREUls2XTsgLyogNi1ieXRlIGhhcmR3YXJlIGFkZHJlc3Mgb2YgbGFuY2UgKi8KKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLgorICovCitzdGF0aWMgdm9pZAlzdGFydCAoaW50IHRhcmdldCk7CitzdGF0aWMgaW50CXN0b3AgKGludCB0YXJnZXQpOworc3RhdGljIGludAl0ZXN0cGt0IChpbnQgdGFyZ2V0KTsKK3N0YXRpYyBpbnQJc2VuZHBrdCAoaW50IHRhcmdldCwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyBpbnQJcmVjZWl2ZXBrdCAoaW50IHRhcmdldCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKK3N0YXRpYyBpbnQJaW5xdWlyeSAoaW50IHRhcmdldCwgdW5zaWduZWQgY2hhciAqYnVmZmVyKTsKK3N0YXRpYyBIQUREUgkqcmVhZF9od19hZGRyKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcik7CitzdGF0aWMgdm9pZAlzZXR1cF9kbWEgKHZvaWQgKmFkZHJlc3MsIHVuc2lnbmVkIHJ3X2ZsYWcsIGludCBudW1fYmxvY2tzKTsKK3N0YXRpYyBpbnQJc2VuZF9maXJzdCAoaW50IHRhcmdldCwgdW5zaWduZWQgY2hhciBieXRlKTsKK3N0YXRpYyBpbnQJc2VuZF8xXzUgKGludCBsdW4sIHVuc2lnbmVkIGNoYXIgKmNvbW1hbmQsIGludCBkbWEpOworc3RhdGljIGludAlnZXRfc3RhdHVzICh2b2lkKTsKK3N0YXRpYyBpbnQJY2FsY19yZWNlaXZlZCAodm9pZCAqc3RhcnRfYWRkcmVzcyk7CisKK3N0YXRpYyBpbnQgcGFtc25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBwYW1zbmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcGFtc25ldF9wb2xsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBwYW1zbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcGFtc25ldF90aWNrKHVuc2lnbmVkIGxvbmcpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgcGFtc25ldF9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpmcCk7CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBwYW1zbmV0X3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIocGFtc25ldF90aWNrLCAwLCAwKTsKKworI2RlZmluZSBTVFJBTV9BRERSKGEpCSgoKGEpICYgMHhmZjAwMDAwMCkgPT0gMCkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkMVsweDM4XTsKKwlIQUREUiAgaHdhZGRyOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQyWzB4MWMyXTsKK30gRE1BSFdBRERSOworCisvKgorICogRGVmaW5pdGlvbnMgb2YgY29tbWFuZHMgdW5kZXJzdG9vZCBieSB0aGUgUEFNcyBETUEgYWRhcHRvci4KKyAqCisgKiBJbiBnZW5lcmFsIHRoZSBETUEgYWRhcHRvciB1c2VzIExVTiAwLCA1LCA2IGFuZCA3IG9uIG9uZSBJRCBjaGFuZ2VhYmxlCisgKiBieSB0aGUgUEFNJ3MgTmV0IHNvZnR3YXJlLgorICoKKyAqIExVTiAwIHdvcmtzIGFzIGEgaGFyZGRpc2suIFlvdSBjYW4gYm9vdCB0aGUgUEFNJ3MgTmV0IGRyaXZlciB0aGVyZS4KKyAqIExVTiA1IHdvcmtzIGFzIGEgaGFyZGRpc2sgYW5kIGxldHMgeW91IGFjY2VzcyB0aGUgUkFNIGFuZCBzb21lIEkvTyBIVworICogICAgICAgYXJlYS4gSW4gc2VjdG9yIDAsIGJ5dGVzIDB4MzgtMHgzZCB5b3UgZmluZCB0aGUgZXRoZXJuZXQgSFcgYWRkcmVzcworICogICAgICAgb2YgdGhlIGFkYXB0b3IuCisgKiBMVU4gNiB3b3JrcyBhcyBhIGhhcmRkaXNrIGFuZCBsZXRzIHlvdSBhY2Nlc3MgdGhlIGZpcm13YXJlIFJPTS4KKyAqIExVTiA3IGxldHMgeW91IHNlbmQgYW5kIHJlY2VpdmUgcGFja2V0cy4KKyAqCisgKiBTb21lIGNvbW1hbmRzIGxpa2UgdGhlIElOUVVJUlkgY29tbWFuZCB3b3JrIGlkZW50aWNhbCBvbiBhbGwgdXNlZCBMVU5zLgorICoKKyAqIFVOS05PV04xIHNlZW1zIHRvIHJlYWQgc29tZSBkYXRhLgorICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgNiBieXRlcy4KKyAqIFVOS05PV04yIHNlZW1zIHRvIHJlYWQgc29tZSBkYXRhIChjb21tYW5kIGJ5dGUgMSBtdXN0IGJlICE9MCkuIFRoZQorICogICAgICAgICAgZm9sbG93aW5nIGJ5dGVzIHNlZW0gdG8gYmUgc29tZXRoaW5nIGxpa2UgYW4gYWxsb2NhdGlvbiBsZW5ndGguCisgKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyA2IGJ5dGVzLgorICogUkVBRFBLVCAgcmVhZHMgYSBwYWNrZXQgcmVjZWl2ZWQgYnkgdGhlIERNQSBhZGFwdG9yLgorICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgNiBieXRlcy4KKyAqIFdSSVRFUEtUIHNlbmRzIGEgcGFja2V0IHRyYW5zZmVycmVkIGJ5IHRoZSBmb2xsb3dpbmcgRE1BIHBoYXNlLiBUaGUgbGVuZ3RoCisgKiAgICAgICAgICBvZiB0aGUgcGFja2V0IGlzIHRyYW5zZmVycmVkIGluIGNvbW1hbmQgYnl0ZXMgMyBhbmQgNC4KKyAqICAgICAgICAgIFRoZSBhZGFwdG9yIGF1dG9tYXRpY2FsbHkgcmVwbGFjZXMgdGhlIHNyYyBodyBhZGRyZXNzIGluIGFuIGV0aGVybmV0CisgKiAgICAgICAgICBwYWNrZXQgYnkgaXRzIG93biBodyBhZGRyZXNzLgorICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgNiBieXRlcy4KKyAqIElOUVVJUlkgIGhhcyB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGUgSU5RVUlSWSBjb21tYW5kIHN1cHBvcnRlZCBieSBoYXJkZGlza3MKKyAqICAgICAgICAgIGFuZCBvdGhlciBTQ1NJIGRldmljZXMuIEl0IGxldHMgeW91IGRldGVjdCB3aGljaCBkZXZpY2UgeW91IGZvdW5kCisgKiAgICAgICAgICBhdCBhIGdpdmVuIGFkZHJlc3MuCisgKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyA2IGJ5dGVzLgorICogU1RBUlQgICAgaW5pdGlhbGl6ZXMgdGhlIERNQSBhZGFwdG9yLiBBZnRlciB0aGlzIGNvbW1hbmQgaXQgaXMgYWJsZSB0byBzZW5kCisgKiAgICAgICAgICBhbmQgcmVjZWl2ZSBwYWNrZXRzLiBUaGVyZSBpcyBubyBzdGF0dXMgYnl0ZSByZXR1cm5lZCEKKyAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDEgYnl0ZS4KKyAqIE5VTVBLVFMgIGdpdmVzIGJhY2sgdGhlIG51bWJlciBvZiByZWNlaXZlZCBwYWNrZXRzIHdhaXRpbmcgaW4gdGhlIHF1ZXVlIGluCisgKiAgICAgICAgICB0aGUgc3RhdHVzIGJ5dGUuCisgKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyAxIGJ5dGUuCisgKiBVTktOT1dOMworICogVU5LTk9XTjQgRnVuY3Rpb24gb2YgdGhlc2UgdGhyZWUgY29tbWFuZHMgaXMgdW5rbm93bi4KKyAqIFVOS05PV041IFRoZSBjb21tYW5kIGxlbmd0aCBvZiB0aGVzZSB0aHJlZSBjb21tYW5kcyBpcyAxIGJ5dGUuCisgKiBERVNFTEVDVCBpbW1lZGlhdGVseSBkZXNlbGVjdHMgdGhlIERNQSBhZGFwdG9yLiBNYXkgaW1wb3J0YW50IHdpdGggaW50ZXJydXB0CisgKiAgICAgICAgICBkcml2ZW4gb3BlcmF0aW9uLgorICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgMSBieXRlLgorICogU1RPUCAgICAgcmVzZXRzIHRoZSBETUEgYWRhcHRvci4gQWZ0ZXIgdGhpcyBjb21tYW5kIHBhY2tldHMgY2FuIG5vIGxvbmdlcgorICogICAgICAgICAgYmUgcmVjZWl2ZWQgb3IgdHJhbnNmZXJyZWQuCisgKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyA2IGJ5dGUuCisgKi8KKworZW51bSB7VU5LTk9XTjE9MywgUkVBRFBLVD04LCBVTktOT1dOMiwgV1JJVEVQS1Q9MTAsIElOUVVJUlk9MTgsIFNUQVJULAorICAgICAgTlVNUEtUUz0yMiwgVU5LTk9XTjMsIFVOS05PV040LCBVTktOT1dONSwgREVTRUxFQ1QsIFNUT1B9OworCisjZGVmaW5lIFJFQURTRUNUT1IgIFJFQURQS1QKKyNkZWZpbmUgV1JJVEVTRUNUT1IgV1JJVEVQS1QKKwordV9jaGFyICppbnF1aXJlOD0iTVYgICAgICBQQU0ncyBORVQvR0siOworCisjZGVmaW5lIERNQUxPVyAgIGRtYV93ZC5kbWFfbG8KKyNkZWZpbmUgRE1BTUlEICAgZG1hX3dkLmRtYV9tZAorI2RlZmluZSBETUFISUdIICBkbWFfd2QuZG1hX2hpCisjZGVmaW5lIERBQ0NFU1MgIGRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQKKworI2RlZmluZSBNRlBfR1BJUCBtZnAucGFyX2R0X3JlZworCisvKiBTb21lIHVzZWZ1bCBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBJTlQgICAgICAoIShNRlBfR1BJUCAmIDB4MjApKQorI2RlZmluZSBERUxBWSAoe01GUF9HUElQOyBNRlBfR1BJUDsgTUZQX0dQSVA7fSkKKyNkZWZpbmUgV1JJVEVNT0RFKHZhbHVlKQkJCQkJXAorCSh7CXVfc2hvcnQgZHVtbXkgPSB2YWx1ZTsJCQkJXAorCQlfX2FzbV9fIHZvbGF0aWxlKCJtb3ZldyAlMCwgMHhGRkZGODYwNiIgOiA6ICJkIihkdW1teSkpOwlcCisJCURFTEFZOwkJCQkJCVwKKwl9KQorI2RlZmluZSBXUklURUJPVEgodmFsdWUxLCB2YWx1ZTIpCQkJCVwKKwkoewl1X2xvbmcgZHVtbXkgPSAodV9sb25nKSh2YWx1ZTEpPDwxNiB8ICh1X3Nob3J0KSh2YWx1ZTIpOwlcCisJCV9fYXNtX18gdm9sYXRpbGUoIm1vdmVsICUwLCAweEZGRkY4NjA0IiA6IDogImQiKGR1bW15KSk7CVwKKwkJREVMQVk7CQkJCQkJXAorCX0pCisKKy8qIERlZmluaXRpb25zIGZvciBETU9ERSAqLworCisjZGVmaW5lIFJFQUQgICAgICAgIDB4MDAwCisjZGVmaW5lIFdSSVRFICAgICAgIDB4MTAwCisKKyNkZWZpbmUgRE1BX0ZEQyAgICAgMHgwODAKKyNkZWZpbmUgRE1BX0FDU0kgICAgMHgwMDAKKworI2RlZmluZSBETUFfRElTQUJMRSAweDA0MAorCisjZGVmaW5lIFNFQ19DT1VOVCAgIDB4MDEwCisjZGVmaW5lIERNQV9XSU5ET1cgIDB4MDAwCisKKyNkZWZpbmUgUkVHX0FDU0kgICAgMHgwMDgKKyNkZWZpbmUgUkVHX0ZEQyAgICAgMHgwMDAKKworI2RlZmluZSBBMSAgICAgICAgICAweDAwMgorCisvKiBUaW1lb3V0IGNvbnN0YW50cyAqLworCisjZGVmaW5lIFRJTUVPVVRDTUQgSFovMiAgIC8qIGNhLiA1MDBtcyAqLworI2RlZmluZSBUSU1FT1VURE1BIEhaICAgICAvKiBjYS4gMXMgKi8KKyNkZWZpbmUgQ09NTUFORF9ERUxBWSA1MDAgLyogY2EuIDAuNW1zICovCisKK3Vuc2lnbmVkIHJ3OworaW50IGxhbmNlX3RhcmdldCA9IC0xOworaW50IGlmX3VwID0gMDsKKworLyogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhY2Nlc3MgdGhlIGV0aGVybmV0IGJvYXJkIGNvbm5lY3RlZCB0byB0aGUKKyAqIEFDU0kgcG9ydCB2aWEgdGhlIHN0X2RtYSBjaGlwLgorICovCisKKy8qIFRoZSBmb2xsb3dpbmcgbG93bGV2ZWwgcm91dGluZXMgd29yayBvbiBwaHlzaWNhbCBhZGRyZXNzZXMgb25seSBhbmQgYXNzdW1lCisgKiB0aGF0IGV2ZW50dWFsbHkgbmVlZGVkIGJ1ZmZlcnMgYXJlCisgKiAtIGNvbXBsZXRlbHkgbG9jYXRlZCBpbiBTVCBSQU0KKyAqIC0gYXJlIGNvbnRpZ291cyBpbiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZQorICovCisKKy8qIFNldHVwIHRoZSBETUEgY291bnRlciAqLworCitzdGF0aWMgdm9pZAorc2V0dXBfZG1hIChhZGRyZXNzLCByd19mbGFnLCBudW1fYmxvY2tzKQorCXZvaWQgKmFkZHJlc3M7CisJdW5zaWduZWQgcndfZmxhZzsKKwlpbnQgbnVtX2Jsb2NrczsKK3sKKwlXUklURU1PREUoKHVuc2lnbmVkKSByd19mbGFnICAgICAgICAgIHwgRE1BX0ZEQyB8IFNFQ19DT1VOVCB8IFJFR19BQ1NJIHwKKwkJICBBMSk7CisJV1JJVEVNT0RFKCh1bnNpZ25lZCkocndfZmxhZyBeIFdSSVRFKSB8IERNQV9GREMgfCBTRUNfQ09VTlQgfCBSRUdfQUNTSSB8CisJCSAgQTEpOworCVdSSVRFTU9ERSgodW5zaWduZWQpIHJ3X2ZsYWcgICAgICAgICAgfCBETUFfRkRDIHwgU0VDX0NPVU5UIHwgUkVHX0FDU0kgfAorCQkgIEExKTsKKwlETUFMT1cgID0gKHVuc2lnbmVkIGNoYXIpKCh1bnNpZ25lZCBsb25nKWFkZHJlc3MgJiAweEZGKTsKKwlETUFNSUQgID0gKHVuc2lnbmVkIGNoYXIpKCgodW5zaWduZWQgbG9uZylhZGRyZXNzID4+ICA4KSAmIDB4RkYpOworCURNQUhJR0ggPSAodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBsb25nKWFkZHJlc3MgPj4gMTYpICYgMHhGRik7CisJV1JJVEVCT1RIKCh1bnNpZ25lZCludW1fYmxvY2tzICYgMHhGRiwKKwkJICByd19mbGFnIHwgRE1BX0ZEQyB8IERNQV9XSU5ET1cgfCBSRUdfQUNTSSB8IEExKTsKKwlydyA9IHJ3X2ZsYWc7Cit9CisKKy8qIFNlbmQgdGhlIGZpcnN0IGJ5dGUgb2YgYW4gY29tbWFuZCBibG9jayAqLworCitzdGF0aWMgaW50CitzZW5kX2ZpcnN0ICh0YXJnZXQsIGJ5dGUpCisJaW50IHRhcmdldDsKKwl1bnNpZ25lZCBjaGFyIGJ5dGU7Cit7CisJcncgPSBSRUFEOworCWFjc2lfZGVsYXlfZW5kKENPTU1BTkRfREVMQVkpOworCS8qCisJICogd2FrZSB1cCBBQ1NJCisJICovCisJV1JJVEVNT0RFKERNQV9GREMgfCBETUFfV0lORE9XIHwgUkVHX0FDU0kpOworCS8qCisJICogd3JpdGUgY29tbWFuZCBieXRlCisJICovCisJV1JJVEVCT1RIKCh0YXJnZXQgPDwgNSkgfCAoYnl0ZSAmIDB4MUYpLCBETUFfRkRDIHwKKwkgICAgICAgICAgRE1BX1dJTkRPVyB8IFJFR19BQ1NJIHwgQTEpOworCXJldHVybiAoIWFjc2lfd2FpdF9mb3JfSVJRKFRJTUVPVVRDTUQpKTsKK30KKworLyogU2VuZCB0aGUgcmVzdCBvZiBhbiBjb21tYW5kIGJsb2NrICovCisKK3N0YXRpYyBpbnQKK3NlbmRfMV81IChsdW4sIGNvbW1hbmQsIGRtYSkKKwlpbnQgbHVuOworCXVuc2lnbmVkIGNoYXIgKmNvbW1hbmQ7CisJaW50IGRtYTsKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaT0wOyBpPDU7IGkrKykgeworCQlXUklURUJPVEgoKCFpID8gKCgobHVuICYgMHg3KSA8PCA1KSB8IChjb21tYW5kW2ldICYgMHgxRikpCisJCQkgICAgICA6IGNvbW1hbmRbaV0pLAorCQkJICBydyB8IFJFR19BQ1NJIHwgRE1BX1dJTkRPVyB8CisJCQkgICAoKGkgPCA0KSA/IERNQV9GREMKKwkJCQkgICAgOiAoZG1hID8gRE1BX0FDU0kKKwkJCQkJICAgOiBETUFfRkRDKSkgfCBBMSk7CisJCWlmIChpIDwgNCAmJiAoaiA9ICFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VUQ01EKSkpCisJCQlyZXR1cm4gKGopOworCX0KKwlyZXR1cm4gKDApOworfQorCisvKiBSZWFkIGEgc3RhdHVzIGJ5dGUgKi8KKworc3RhdGljIGludAorZ2V0X3N0YXR1cyAodm9pZCkKK3sKKwlXUklURU1PREUoRE1BX0ZEQyB8IERNQV9XSU5ET1cgfCBSRUdfQUNTSSB8IEExKTsKKwlhY3NpX2RlbGF5X3N0YXJ0KCk7CisJcmV0dXJuICgoaW50KShEQUNDRVNTICYgMHhGRikpOworfQorCisvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiByZWNlaXZlZCBieXRlcyAqLworCitzdGF0aWMgaW50CitjYWxjX3JlY2VpdmVkIChzdGFydF9hZGRyZXNzKQorCXZvaWQgKnN0YXJ0X2FkZHJlc3M7Cit7CisJcmV0dXJuIChpbnQpKAorCQkoKCh1bnNpZ25lZCBsb25nKURNQUhJR0ggPDwgMTYpIHwgKCh1bnNpZ25lZClETUFNSUQgPDwgOCkgfCBETUFMT1cpCisJICAgICAgLSAodW5zaWduZWQgbG9uZylzdGFydF9hZGRyZXNzKTsKK30KKworLyogVGhlIGZvbGxvd2luZyBtaWRsZXZlbCByb3V0aW5lcyBzdGlsbCB3b3JrIG9uIHBoeXNpY2FsIGFkZHJlc3NlcyAuLi4gKi8KKworLyogc3RhcnQoKSBzdGFydHMgdGhlIFBBTSdzIERNQSBhZGFwdG9yICovCisKK3N0YXRpYyB2b2lkCitzdGFydCAodGFyZ2V0KQorCWludCB0YXJnZXQ7Cit7CisJc2VuZF9maXJzdCh0YXJnZXQsIFNUQVJUKTsKK30KKworLyogc3RvcCgpIHN0b3BzIHRoZSBQQU0ncyBETUEgYWRhcHRvciBhbmQgcmV0dXJucyBhIHZhbHVlIG9mIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzICovCisKK3N0YXRpYyBpbnQKK3N0b3AgKHRhcmdldCkKKwlpbnQgdGFyZ2V0OworeworCWludCByZXQgPSAtMTsKKwl1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbNV07CisKKwlpZiAoc2VuZF9maXJzdCh0YXJnZXQsIFNUT1ApKQorCQlnb3RvIGJhZDsKKwljbWRfYnVmZmVyWzBdID0gY21kX2J1ZmZlclsxXSA9IGNtZF9idWZmZXJbMl0gPQorCWNtZF9idWZmZXJbM10gPSBjbWRfYnVmZmVyWzRdID0gMDsKKwlpZiAoc2VuZF8xXzUoNywgY21kX2J1ZmZlciwgMCkgfHwKKwkgICAgIWFjc2lfd2FpdF9mb3JfSVJRKFRJTUVPVVRETUEpIHx8CisJICAgIGdldF9zdGF0dXMoKSkKKwkJZ290byBiYWQ7CisJcmV0ID0gMDsKK2JhZDoKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qIHRlc3Rwa3QoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyB3YWl0aW5nIGluIHRoZSBxdWV1ZSAqLworCitzdGF0aWMgaW50Cit0ZXN0cGt0KHRhcmdldCkKKwlpbnQgdGFyZ2V0OworeworCWludCByZXQgPSAtMTsKKworCWlmIChzZW5kX2ZpcnN0KHRhcmdldCwgTlVNUEtUUykpCisJCWdvdG8gYmFkOworCXJldCA9IGdldF9zdGF0dXMoKTsKK2JhZDoKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qIGlucXVpcnkoKSByZXR1cm5zIDAgd2hlbiBQQU0ncyBETUEgZm91bmQsIC0xIHdoZW4gdGltZW91dCwgLTIgb3RoZXJ3aXNlICovCisvKiBQbGVhc2Ugbm90ZTogVGhlIGJ1ZmZlciBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkgYnV0IG11c3QgYmUgZGVmaW5lZCEgICAqLworCitzdGF0aWMgaW50CitpbnF1aXJ5ICh0YXJnZXQsIGJ1ZmZlcikKKwlpbnQgdGFyZ2V0OworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKK3sKKwlpbnQgcmV0ID0gLTE7CisJdW5zaWduZWQgY2hhciAqdmJ1ZmZlciA9IHBoeXNfdG9fdmlydCgodW5zaWduZWQgbG9uZylidWZmZXIpOworCXVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlcls1XTsKKworCWlmIChzZW5kX2ZpcnN0KHRhcmdldCwgSU5RVUlSWSkpCisJCWdvdG8gYmFkOworCXNldHVwX2RtYShidWZmZXIsIFJFQUQsIDEpOworCXZidWZmZXJbOF0gPSB2YnVmZmVyWzI3XSA9IDA7IC8qIEF2b2lkIGNvbmZ1c2lvbiB3aXRoIHByZXZpb3VzIHJlYWQgZGF0YSAqLworCWNtZF9idWZmZXJbMF0gPSBjbWRfYnVmZmVyWzFdID0gY21kX2J1ZmZlclsyXSA9IGNtZF9idWZmZXJbNF0gPSAwOworCWNtZF9idWZmZXJbM10gPSA0ODsKKwlpZiAoc2VuZF8xXzUoNSwgY21kX2J1ZmZlciwgMSkgfHwKKwkgICAgIWFjc2lfd2FpdF9mb3JfSVJRKFRJTUVPVVRETUEpIHx8CisJICAgIGdldF9zdGF0dXMoKSB8fAorCSAgICAoY2FsY19yZWNlaXZlZChidWZmZXIpIDwgMzIpKQorCQlnb3RvIGJhZDsKKwlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoKHVuc2lnbmVkIGxvbmcpKGJ1ZmZlcis4KSwgMjAsIDApOworCWlmIChtZW1jbXAoaW5xdWlyZTgsIHZidWZmZXIrOCwgMjApKQorCQlnb3RvIGJhZDsKKwlyZXQgPSAwOworYmFkOgorCWlmICghIU5FVF9ERUJVRykgeworCQl2YnVmZmVyWzgrMjBdPTA7CisJCXByaW50aygiaW5xdWlyeSBvZiB0YXJnZXQgJWQ6ICVzXG4iLCB0YXJnZXQsIHZidWZmZXIrOCk7CisJfQorCXJldHVybiAocmV0KTsKK30KKworLyoKKyAqIHJlYWRfaHdfYWRkcigpIHJlYWRzIHRoZSBzZWN0b3IgY29udGFpbmluZyB0aGUgaHdhZGRyIGFuZCByZXR1cm5zCisgKiBhIHBvaW50ZXIgdG8gaXQgKHZpcnR1YWwgYWRkcmVzcyEpIG9yIDAgaW4gY2FzZSBvZiBhbiBlcnJvcgorICovCisKK3N0YXRpYyBIQUREUgorKnJlYWRfaHdfYWRkcih0YXJnZXQsIGJ1ZmZlcikKKwlpbnQgdGFyZ2V0OworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKK3sKKwlIQUREUiAqcmV0ID0gMDsKKwl1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbNV07CisKKwlpZiAoc2VuZF9maXJzdCh0YXJnZXQsIFJFQURTRUNUT1IpKQorCQlnb3RvIGJhZDsKKwlzZXR1cF9kbWEoYnVmZmVyLCBSRUFELCAxKTsKKwljbWRfYnVmZmVyWzBdID0gY21kX2J1ZmZlclsxXSA9IGNtZF9idWZmZXJbMl0gPSBjbWRfYnVmZmVyWzRdID0gMDsKKwljbWRfYnVmZmVyWzNdID0gMTsKKwlpZiAoc2VuZF8xXzUoNSwgY21kX2J1ZmZlciwgMSkgfHwKKwkgICAgIWFjc2lfd2FpdF9mb3JfSVJRKFRJTUVPVVRETUEpIHx8CisJICAgIGdldF9zdGF0dXMoKSkKKwkJZ290byBiYWQ7CisJcmV0ID0gcGh5c190b192aXJ0KCh1bnNpZ25lZCBsb25nKSYoKChETUFIV0FERFIgKilidWZmZXIpLT5od2FkZHIpKTsKKwlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoKHVuc2lnbmVkIGxvbmcpYnVmZmVyLCA1MTIsIDApOworYmFkOgorCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIGlycXJldHVybl90CitwYW1zbmV0X2ludHIoaXJxLCBkYXRhLCBmcCkKKwlpbnQgaXJxOworCXZvaWQgKmRhdGE7CisJc3RydWN0IHB0X3JlZ3MgKmZwOworeworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogcmVjZWl2ZXBrdCgpIGxvYWRzIGEgcGFja2V0IHRvIGEgZ2l2ZW4gYnVmZmVyIGFuZCByZXR1cm5zIGl0cyBsZW5ndGggKi8KKworc3RhdGljIGludAorcmVjZWl2ZXBrdCAodGFyZ2V0LCBidWZmZXIpCisJaW50IHRhcmdldDsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7Cit7CisJaW50IHJldCA9IC0xOworCXVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlcls1XTsKKworCWlmIChzZW5kX2ZpcnN0KHRhcmdldCwgUkVBRFBLVCkpCisJCWdvdG8gYmFkOworCXNldHVwX2RtYShidWZmZXIsIFJFQUQsIDMpOworCWNtZF9idWZmZXJbMF0gPSBjbWRfYnVmZmVyWzFdID0gY21kX2J1ZmZlclsyXSA9IGNtZF9idWZmZXJbNF0gPSAwOworCWNtZF9idWZmZXJbM10gPSAzOworCWlmIChzZW5kXzFfNSg3LCBjbWRfYnVmZmVyLCAxKSB8fAorCSAgICAhYWNzaV93YWl0X2Zvcl9JUlEoVElNRU9VVERNQSkgfHwKKwkgICAgZ2V0X3N0YXR1cygpKQorCQlnb3RvIGJhZDsKKwlyZXQgPSBjYWxjX3JlY2VpdmVkKGJ1ZmZlcik7CitiYWQ6CisJcmV0dXJuIChyZXQpOworfQorCisvKiBzZW5kcGt0KCkgc2VuZHMgYSBwYWNrZXQgYW5kIHJldHVybnMgYSB2YWx1ZSBvZiB6ZXJvIHdoZW4gdGhlIHBhY2tldCB3YXMgc2VudAorICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSAqLworCitzdGF0aWMgaW50CitzZW5kcGt0ICh0YXJnZXQsIGJ1ZmZlciwgbGVuZ3RoKQorCWludCB0YXJnZXQ7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCWludCBsZW5ndGg7Cit7CisJaW50IHJldCA9IC0xOworCXVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlcls1XTsKKworCWlmIChzZW5kX2ZpcnN0KHRhcmdldCwgV1JJVEVQS1QpKQorCQlnb3RvIGJhZDsKKwlzZXR1cF9kbWEoYnVmZmVyLCBXUklURSwgMyk7CisJY21kX2J1ZmZlclswXSA9IGNtZF9idWZmZXJbMV0gPSBjbWRfYnVmZmVyWzRdID0gMDsKKwljbWRfYnVmZmVyWzJdID0gbGVuZ3RoID4+IDg7CisJY21kX2J1ZmZlclszXSA9IGxlbmd0aCAmIDB4RkY7CisJaWYgKHNlbmRfMV81KDcsIGNtZF9idWZmZXIsIDEpIHx8CisJICAgICFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VURE1BKSB8fAorCSAgICBnZXRfc3RhdHVzKCkpCisJCWdvdG8gYmFkOworCXJldCA9IDA7CitiYWQ6CisJcmV0dXJuIChyZXQpOworfQorCisvKiBUaGUgZm9sbG93aW5nIGhpZ2hlciBsZXZlbCByb3V0aW5lcyB3b3JrIG9uIHZpcnR1YWwgYWRkcmVzc2VzIGFuZCBjb252ZXJ0IHRoZW0gdG8KKyAqIHBoeXNpY2FsIGFkZHJlc3NlcyB3aGVuIHBhc3NlZCB0byB0aGUgbG93bGV2ZWwgcm91dGluZXMuIEl0J3MgdXAgdG8gdGhlIGhpZ2hlciBsZXZlbAorICogcm91dGluZXMgdG8gY29weSBkYXRhIGZyb20gQWx0ZXJuYXRlIFJBTSB0byBTVCBSQU0gaWYgbmVjY2VzYXJ5IQorICovCisKKy8qIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUsIGFuZCByZXR1cm4gJzAnIGlmIG9uZSBleGlzdHMuCisgKi8KKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgcGFtc25ldF9wcm9iZSAoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaTsKKwlIQUREUiAqaHdhZGRyOworCWludCBlcnI7CisKKwl1bnNpZ25lZCBjaGFyIHN0YXRpb25fYWRkcls2XTsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCS8qIGF2b2lkICJQcm9iaW5nIGZvci4uLiIgcHJpbnRlZCA0IHRpbWVzIC0gdGhlIGRyaXZlciBpcyBzdXBwb3J0aW5nIG9ubHkgb25lIGFkYXB0ZXIgbm93ISAqLworCXN0YXRpYyBpbnQgbm9fbW9yZV9mb3VuZDsKKworCWlmIChub19tb3JlX2ZvdW5kKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwlub19tb3JlX2ZvdW5kID0gMTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlwcmludGsoIlByb2JpbmcgZm9yIFBBTSdzIE5ldC9HSyBBZGFwdGVyLi4uXG4iKTsKKworCS8qIEFsbG9jYXRlIHRoZSBETUEgYnVmZmVyIGhlcmUgc2luY2Ugd2UgbmVlZCBpdCBmb3IgcHJvYmluZyEgKi8KKworCW5pY19wYWNrZXQgPSAoc3RydWN0IG5pY19wa3RfcyAqKWFjc2lfYnVmZmVyOworCXBoeXNfbmljX3BhY2tldCA9ICh1bnNpZ25lZCBjaGFyICopcGh5c19hY3NpX2J1ZmZlcjsKKwlpZiAocGFtc25ldF9kZWJ1ZyA+IDApIHsKKwkJcHJpbnRrKCJuaWNfcGFja2V0IGF0IDB4JXAsIHBoeXMgYXQgMHglcFxuIiwKKwkJCSAgIG5pY19wYWNrZXQsIHBoeXNfbmljX3BhY2tldCApOworCX0KKworCXN0ZG1hX2xvY2socGFtc25ldF9pbnRyLCBOVUxMKTsKKwlESVNBQkxFX0lSUSgpOworCisJZm9yIChpPTA7IGk8ODsgaSsrKSB7CisJCS8qIERvIHR3byBpbnF1aXJpZXMgdG8gY292ZXIgY2FzZXMgd2l0aCBzdHJhbmdlIGVxdWlwbWVudCBvbiBwcmV2aW91cyBJRCAqLworCQkvKiBibG9ja2luZyB0aGUgQUNTSSBidXMgKGxpa2UgdGhlIFNMTUM4MDQgbGFzZXIgcHJpbnRlciBjb250cm9sbGVyLi4uICAgKi8KKwkJaW5xdWlyeShpLCBwaHlzX25pY19wYWNrZXQpOworCQlpZiAoIWlucXVpcnkoaSwgcGh5c19uaWNfcGFja2V0KSkgeworCQkJbGFuY2VfdGFyZ2V0ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCEhTkVUX0RFQlVHKQorCQlwcmludGsoIklEOiAlZFxuIixpKTsKKworCWlmIChsYW5jZV90YXJnZXQgPj0gMCkgeworCQlpZiAoIShod2FkZHIgPSByZWFkX2h3X2FkZHIobGFuY2VfdGFyZ2V0LCBwaHlzX25pY19wYWNrZXQpKSkKKwkJCWxhbmNlX3RhcmdldCA9IC0xOworCQllbHNlCisJCQltZW1jcHkgKHN0YXRpb25fYWRkciwgaHdhZGRyLCBFVEhfQUxFTik7CisJfQorCisJRU5BQkxFX0lSUSgpOworCXN0ZG1hX3JlbGVhc2UoKTsKKworCWlmIChsYW5jZV90YXJnZXQgPCAwKSB7CisJCXByaW50aygiTm8gUEFNJ3MgTmV0L0dLIGZvdW5kLlxuIik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCX0KKworCWlmIChwYW1zbmV0X2RlYnVnID4gMCAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwlwcmludGsoIiVzOiAlcyBmb3VuZCBvbiB0YXJnZXQgJTAxZCwgZXRoLWFkZHI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LlxuIiwKKwkJZGV2LT5uYW1lLCAiUEFNJ3MgTmV0L0dLIiwgbGFuY2VfdGFyZ2V0LAorCQlzdGF0aW9uX2FkZHJbMF0sIHN0YXRpb25fYWRkclsxXSwgc3RhdGlvbl9hZGRyWzJdLAorCQlzdGF0aW9uX2FkZHJbM10sIHN0YXRpb25fYWRkcls0XSwgc3RhdGlvbl9hZGRyWzVdKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuCQk9IHBhbXNuZXRfb3BlbjsKKwlkZXYtPnN0b3AJCT0gcGFtc25ldF9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHBhbXNuZXRfc2VuZF9wYWNrZXQ7CisJZGV2LT5nZXRfc3RhdHMJCT0gbmV0X2dldF9zdGF0czsKKworCS8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSB3aXRoIGV0aGVybmV0LWdlbmVyaWMKKwkgKiB2YWx1ZXMuIFRoaXMgc2hvdWxkIGJlIGluIGEgY29tbW9uIGZpbGUgaW5zdGVhZCBvZiBwZXItZHJpdmVyLgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKyNpZiAwCisJCWRldi0+YnJvYWRjYXN0W2ldID0gMHhmZjsKKyNlbmRpZgorCQlkZXYtPmRldl9hZGRyW2ldICA9IHN0YXRpb25fYWRkcltpXTsKKwl9CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKCFlcnIpCisJCXJldHVybiBkZXY7CisKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuICBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICAgc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorCisgICBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgICByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICAgdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworc3RhdGljIGludAorcGFtc25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAocGFtc25ldF9kZWJ1ZyA+IDApCisJCXByaW50aygicGFtc25ldF9vcGVuXG4iKTsKKwlzdGRtYV9sb2NrKHBhbXNuZXRfaW50ciwgTlVMTCk7CisJRElTQUJMRV9JUlEoKTsKKworCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSBoZXJlLgorCSAqLworCWlmICghaWZfdXApCisJCXN0YXJ0KGxhbmNlX3RhcmdldCk7CisJaWZfdXAgPSAxOworCWxwLT5vcGVuX3RpbWUgPSAwOwkvKmppZmZpZXMqLworCWxwLT5wb2xsX3RpbWUgPSBNQVhfUE9MTF9USU1FOworCisJZGV2LT50YnVzeSA9IDA7CisJZGV2LT5pbnRlcnJ1cHQgPSAwOworCWRldi0+c3RhcnQgPSAxOworCisJRU5BQkxFX0lSUSgpOworCXN0ZG1hX3JlbGVhc2UoKTsKKwlwYW1zbmV0X3RpbWVyLmRhdGEgPSAobG9uZylkZXY7CisJcGFtc25ldF90aW1lci5leHBpcmVzID0gamlmZmllcyArIGxwLT5wb2xsX3RpbWU7CisJYWRkX3RpbWVyKCZwYW1zbmV0X3RpbWVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcGFtc25ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBCbG9jayBhIHRpbWVyLWJhc2VkIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuICBUaGlzIGNvdWxkIGJldHRlciBiZQorCSAqIGRvbmUgd2l0aCBhdG9taWNfc3dhcCgxLCBkZXYtPnRidXN5KSwgYnV0IHNldF9iaXQoKSB3b3JrcyBhcyB3ZWxsLgorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmIChzdGRtYV9pc2xvY2tlZCgpKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCX0KKwllbHNlIHsKKwkJaW50IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCQl1bnNpZ25lZCBsb25nIGJ1ZiA9IHZpcnRfdG9fcGh5cyhza2ItPmRhdGEpOworCQlpbnQgc3RhdDsKKworCQlzdGRtYV9sb2NrKHBhbXNuZXRfaW50ciwgTlVMTCk7CisJCURJU0FCTEVfSVJRKCk7CisKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlpZiggIVNUUkFNX0FERFIoYnVmK2xlbmd0aC0xKSApIHsKKwkJCW1lbWNweShuaWNfcGFja2V0LT5idWZmZXIsIHNrYi0+ZGF0YSwgbGVuZ3RoKTsKKwkJCWJ1ZiA9ICh1bnNpZ25lZCBsb25nKXBoeXNfbmljX3BhY2tldDsKKwkJfQorCisJCWRtYV9jYWNoZV9tYWludGVuYW5jZShidWYsIGxlbmd0aCwgMSk7CisKKwkJc3RhdCA9IHNlbmRwa3QobGFuY2VfdGFyZ2V0LCAodW5zaWduZWQgY2hhciAqKWJ1ZiwgbGVuZ3RoKTsKKwkJRU5BQkxFX0lSUSgpOworCQlzdGRtYV9yZWxlYXNlKCk7CisKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWRldi0+dGJ1c3kJID0gMDsKKwkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJbHAtPnN0YXRzLnR4X2J5dGVzKz1sZW5ndGg7CisJfQorCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisvKiBXZSBoYXZlIGEgZ29vZCBwYWNrZXQocyksIGdldCBpdC90aGVtIG91dCBvZiB0aGUgYnVmZmVycy4KKyAqLworc3RhdGljIHZvaWQKK3BhbXNuZXRfcG9sbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBib2d1c2NvdW50OworCWludCBwa3RfbGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkvKiArK3JvbWFuOiBUYWtlIGNhcmUgYXQgbG9ja2luZyB0aGUgU1QtRE1BLi4uIFRoaXMgbXVzdCBiZSBkb25lIHdpdGggaW50cworCSAqIG9mZiwgc2luY2Ugb3RoZXJ3aXNlIGFuIGludCBjb3VsZCBzbGlwIGluIGJldHdlZW4gdGhlIHF1ZXN0aW9uIGFuZCB0aGUKKwkgKiBsb2NraW5nIGl0c2VsZiwgYW5kIHRoZW4gd2UnZCBnbyB0byBzbGVlcC4uLiBBbmQgbG9ja2luZyBpdHNlbGYgaXMKKwkgKiBuZWNlc3NhcnkgdG8ga2VlcCB0aGUgZmxvcHB5X2NoYW5nZSB0aW1lciBmcm9tIHdvcmtpbmcgd2l0aCBTVC1ETUEKKwkgKiByZWdpc3RlcnMuICovCisJaWYgKHN0ZG1hX2lzbG9ja2VkKCkpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXN0ZG1hX2xvY2socGFtc25ldF9pbnRyLCBOVUxMKTsKKwlESVNBQkxFX0lSUSgpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWJvZ3VzY291bnQgPSB0ZXN0cGt0KGxhbmNlX3RhcmdldCk7CisJaWYoIGxwLT5wb2xsX3RpbWUgPCBNQVhfUE9MTF9USU1FICkgbHAtPnBvbGxfdGltZSsrOworCisJd2hpbGUoYm9ndXNjb3VudC0tKSB7CisJCXBrdF9sZW4gPSByZWNlaXZlcGt0KGxhbmNlX3RhcmdldCwgcGh5c19uaWNfcGFja2V0KTsKKworCQlpZiggcGt0X2xlbiA8IDYwICkgYnJlYWs7CisKKwkJLyogR29vZCBwYWNrZXQuLi4gKi8KKworCQlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoKHVuc2lnbmVkIGxvbmcpcGh5c19uaWNfcGFja2V0LCBwa3RfbGVuLCAwKTsKKworCQlscC0+cG9sbF90aW1lID0gcGFtc25ldF9taW5fcG9sbF90aW1lOyAgICAvKiBmYXN0IHBvbGwgKi8KKwkJaWYoIHBrdF9sZW4gPj0gNjAgJiYgcGt0X2xlbiA8PSAyMDQ4ICkgeworCQkJaWYgKHBrdF9sZW4gPiAxNTE0KQorCQkJCXBrdF9sZW4gPSAxNTE0OworCisJCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4KKwkJCSAqLworCQkJc2tiID0gYWxsb2Nfc2tiKHBrdF9sZW4sIEdGUF9BVE9NSUMpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKCIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNrYi0+bGVuID0gcGt0X2xlbjsKKwkJCXNrYi0+ZGV2ID0gZGV2OworCisJCQkvKiAnc2tiLT5kYXRhJyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHNrX2J1ZmYgZGF0YSBhcmVhLgorCQkJICovCisJCQltZW1jcHkoc2tiLT5kYXRhLCBuaWNfcGFja2V0LT5idWZmZXIsIHBrdF9sZW4pOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJbHAtPnN0YXRzLnJ4X2J5dGVzKz1wa3RfbGVuOworCQl9CisJfQorCisJLyogSWYgYW55IHdvcnRoLXdoaWxlIHBhY2tldHMgaGF2ZSBiZWVuIHJlY2VpdmVkLCBkZXZfcmludCgpCisJICAgaGFzIGRvbmUgYSBtYXJrX2JoKElORVRfQkgpIGZvciB1cyBhbmQgd2lsbCB3b3JrIG9uIHRoZW0KKwkgICB3aGVuIHdlIGdldCB0byB0aGUgYm90dG9tLWhhbGYgcm91dGluZS4KKwkgKi8KKworCUVOQUJMRV9JUlEoKTsKKwlzdGRtYV9yZWxlYXNlKCk7CisJcmV0dXJuOworfQorCisvKiBwYW1zbmV0X3RpY2s6IGNhbGxlZCBieSBwYW1zbmV0X3RpbWVyLiBSZWFkcyBwYWNrZXRzIGZyb20gdGhlIGFkYXB0ZXIsCisgKiBwYXNzZXMgdGhlbSB0byB0aGUgaGlnaGVyIGxheWVycyBhbmQgcmVzdGFydHMgdGhlIHRpbWVyLgorICovCitzdGF0aWMgdm9pZAorcGFtc25ldF90aWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkgeworCXN0cnVjdCBuZXRfZGV2aWNlCSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiggcGFtc25ldF9kZWJ1ZyA+IDAgJiYgKGxwLT5vcGVuX3RpbWUrKyAmIDcpID09IDggKQorCQlwcmludGsoInBhbXNuZXRfdGljazogJWxkXG4iLCBscC0+b3Blbl90aW1lKTsKKworCXBhbXNuZXRfcG9sbF9yeChkZXYpOworCisJcGFtc25ldF90aW1lci5leHBpcmVzID0gamlmZmllcyArIGxwLT5wb2xsX3RpbWU7CisJYWRkX3RpbWVyKCZwYW1zbmV0X3RpbWVyKTsKK30KKworLyogVGhlIGludmVyc2Ugcm91dGluZSB0byBwYW1zbmV0X29wZW4oKS4KKyAqLworc3RhdGljIGludAorcGFtc25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHBhbXNuZXRfZGVidWcgPiAwKQorCQlwcmludGsoInBhbXNuZXRfY2xvc2UsIG9wZW5fdGltZT0lbGRcbiIsIGxwLT5vcGVuX3RpbWUpOworCWRlbF90aW1lcigmcGFtc25ldF90aW1lcik7CisJc3RkbWFfbG9jayhwYW1zbmV0X2ludHIsIE5VTEwpOworCURJU0FCTEVfSVJRKCk7CisKKwlpZiAoaWZfdXApCisJCXN0b3AobGFuY2VfdGFyZ2V0KTsKKwlpZl91cCA9IDA7CisKKwlscC0+b3Blbl90aW1lID0gMDsKKworCWRldi0+dGJ1c3kgPSAxOworCWRldi0+c3RhcnQgPSAwOworCisJRU5BQkxFX0lSUSgpOworCXN0ZG1hX3JlbGVhc2UoKTsKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCisgICBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yIGNsb3NlZC4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcGFtX2RldjsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJcGFtX2RldiA9IHBhbXNuZXRfcHJvYmUoLTEpOworCWlmIChJU19FUlIocGFtX2RldikpCisJCXJldHVybiBQVFJfRVJSKHBhbV9kZXYpOworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYocGFtX2Rldik7CisJZnJlZV9uZXRkZXYocGFtX2Rldik7Cit9CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworLyogTG9jYWwgdmFyaWFibGVzOgorICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRF9fS0VSTkVMX18gLUkvdXNyL3NyYy9saW51eC9pbmNsdWRlCisJLWIgbTY4ay1saW51eGFvdXQgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIKKwktZm9taXQtZnJhbWUtcG9pbnRlciAtcGlwZSAtRE1PRFVMRSAtSS4uLy4uL25ldC9pbmV0IC1jIGF0YXJpX3BhbXNuZXQuYyIKKyAqICB2ZXJzaW9uLWNvbnRyb2w6IHQKKyAqICBrZXB0LW5ldy12ZXJzaW9uczogNQorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGFyaWxhbmNlLmMgYi9kcml2ZXJzL25ldC9hdGFyaWxhbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwMTEyMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2F0YXJpbGFuY2UuYwpAQCAtMCwwICsxLDEyMDYgQEAKKy8qIGF0YXJpbGFuY2UuYzogRXRoZXJuZXQgZHJpdmVyIGZvciBWTUUgTGFuY2UgY2FyZHMgb24gdGhlIEF0YXJpICovCisvKgorCVdyaXR0ZW4gMTk5NS85NiBieSBSb21hbiBIb2RlayAoUm9tYW4uSG9kZWtAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGUpCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVRoaXMgZHJpdmVycyB3YXMgd3JpdHRlbiB3aXRoIHRoZSBmb2xsb3dpbmcgc291cmNlcyBvZiByZWZlcmVuY2U6CisJIC0gVGhlIGRyaXZlciBmb3IgdGhlIFJpZWJsIExhbmNlIGNhcmQgYnkgdGhlIFRVIFZpZW5uYS4KKwkgLSBUaGUgbW9kaWZpZWQgVFVXIGRyaXZlciBmb3IgUEFNJ3MgVk1FIGNhcmRzCisJIC0gVGhlIFBDLUxpbnV4IGRyaXZlciBmb3IgTGFuY2UgY2FyZHMgKGJ1dCB0aGlzIGlzIGZvciBidXMgbWFzdGVyCisgICAgICAgY2FyZHMsIG5vdCB0aGUgc2hhcmVkIG1lbW9yeSBvbmVzKQorCSAtIFRoZSBBbWlnYSBBcmlhZG5lIGRyaXZlcgorCisJdjEuMDogKGluIDEuMi4xM3BsNC8wLjkuMTMpCisJICAgICAgSW5pdGlhbCB2ZXJzaW9uCisJdjEuMTogKGluIDEuMi4xM3BsNSkKKwkgICAgICBtb3JlIGNvbW1lbnRzCisJCSAgZGVsZXRlZCBzb21lIGRlYnVnZ2luZyBzdHVmZgorCQkgIG9wdGltaXplZCByZWdpc3RlciBhY2Nlc3MgKGtlZXAgQVJFRyBwb2ludGluZyB0byBDU1IwKQorCQkgIGZvbGxvd2luZyBBTUQsIENTUjBfU1RSVCBzaG91bGQgYmUgc2V0IG9ubHkgYWZ0ZXIgSURPTiBpcyBkZXRlY3RlZAorCQkgIHVzZSBtZW1jcHkoKSBmb3IgZGF0YSB0cmFuc2ZlcnMsIHRoYXQgYWxzbyBlbXBsb3lzIGxvbmcgd29yZCBtb3ZlcworCQkgIGJldHRlciBwcm9iZSBwcm9jZWR1cmUgZm9yIDI0LWJpdCBzeXN0ZW1zCisgICAgICAgICAgbm9uLVZNRS1SaWVibENhcmRzIG5lZWQgZXh0cmEgZGVsYXlzIGluIG1lbWNweQorCQkgIG11c3QgYWxzbyBkbyB3cml0ZSB0ZXN0LCBzaW5jZSAweGZ4ZTAwMDAwIG1heSBoaXQgUk9NCisJCSAgdXNlIDgvMzIgdHgvcnggYnVmZmVycywgd2hpY2ggc2hvdWxkIGdpdmUgYmV0dGVyIE5GUyBwZXJmb3JtYW5jZTsKKwkJICAgIHRoaXMgaXMgbWFkZSBwb3NzaWJsZSBieSBzaGlmdGluZyB0aGUgbGFzdCBwYWNrZXQgYnVmZmVyIGFmdGVyIHRoZQorCQkgICAgUmllYmxDYXJkIHJlc2VydmVkIGFyZWEKKyAgICB2MS4yOiAoaW4gMS4yLjEzcGw4KQorCSAgICAgIGFnYWluIGZpeGVkIHByb2JpbmcgZm9yIHRoZSBGYWxjb247IDB4ZmUwMTAwMCBoaXRzIHBoeXMuIDB4MDAwMTAwMDAKKwkJICBhbmQgdGh1cyBSQU0sIGluIGNhc2Ugb2Ygbm8gTGFuY2UgZm91bmQgYWxsIG1lbW9yeSBjb250ZW50cyBoYXZlIHRvCisJCSAgYmUgcmVzdG9yZWQhCisJCSAgTm93IHBvc3NpYmxlIHRvIGNvbXBpbGUgYXMgbW9kdWxlLgorCXYxLjM6IDAzLzMwLzk2IEplcyBTb3JlbnNlbiwgUm9tYW4gKGluIDEuMykKKwkgICAgICBTZXZlcmFsIGxpdHRsZSAxLjMgYWRhcHRpb25zCisJCSAgV2hlbiB0aGUgbGFuY2UgaXMgc3RvcHBlZCBpdCBqdW1wcyBiYWNrIGludG8gbGl0dGxlLWVuZGlhbgorCQkgIG1vZGUuIEl0IGlzIHRoZXJlZm9yZSBuZWNlc3NhcnkgdG8gcHV0IGl0IGJhY2sgd2hlcmUgaXQKKwkJICBiZWxvbmdzLCBpbiBiaWcgZW5kaWFuIG1vZGUsIGluIG9yZGVyIHRvIG1ha2UgdGhpbmdzIHdvcmsuCisJCSAgVGhpcyBtaWdodCBiZSB0aGUgcmVhc29uIHdoeSBtdWx0aWNhc3QtbW9kZSBkaWRuJ3Qgd29yaworCQkgIGJlZm9yZSwgYnV0IEknbSBub3QgYWJsZSB0byB0ZXN0IGl0IGFzIEkgb25seSBnb3QgYW4gQW1pZ2EKKwkJICAod2UgaGFkIHNpbWlsYXIgcHJvYmxlbXMgd2l0aCB0aGUgQTIwNjUgZHJpdmVyKS4KKworKi8KKworc3RhdGljIGNoYXIgdmVyc2lvbltdID0gImF0YXJpbGFuY2UuYzogdjEuMyAwNC8wNC85NiAiCisJCQkJCSAgICJSb21hbi5Ib2Rla0BpbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+CisjaW5jbHVkZSA8YXNtL2F0YXJpaW50cy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiBEZWJ1ZyBsZXZlbDoKKyAqICAwID0gc2lsZW50LCBwcmludCBvbmx5IHNlcmlvdXMgZXJyb3JzCisgKiAgMSA9IG5vcm1hbCwgcHJpbnQgZXJyb3IgbWVzc2FnZXMKKyAqICAyID0gZGVidWcsIHByaW50IGRlYnVnIGluZm9zCisgKiAgMyA9IGRlYnVnLCBwcmludCBldmVuIG1vcmUgZGVidWcgaW5mb3MgKHBhY2tldCBkYXRhKQorICovCisKKyNkZWZpbmUJTEFOQ0VfREVCVUcJMQorCisjaWZkZWYgTEFOQ0VfREVCVUcKK3N0YXRpYyBpbnQgbGFuY2VfZGVidWcgPSBMQU5DRV9ERUJVRzsKKyNlbHNlCitzdGF0aWMgaW50IGxhbmNlX2RlYnVnID0gMTsKKyNlbmRpZgorTU9EVUxFX1BBUk0obGFuY2VfZGVidWcsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGxhbmNlX2RlYnVnLCAiYXRhcmlsYW5jZSBkZWJ1ZyBsZXZlbCAoMC0zKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBQcmludCBkZWJ1ZyBtZXNzYWdlcyBvbiBwcm9iaW5nPyAqLworI3VuZGVmIExBTkNFX0RFQlVHX1BST0JFCisKKyNkZWZpbmUJRFBSSU5USyhuLGEpCQkJCQkJCVwKKwlkbyB7CQkJCQkJCQkJCVwKKwkJaWYgKGxhbmNlX2RlYnVnID49IG4pCQkJCQlcCisJCQlwcmludGsgYTsJCQkJCQkJXAorCX0gd2hpbGUoIDAgKQorCisjaWZkZWYgTEFOQ0VfREVCVUdfUFJPQkUKKyMgZGVmaW5lIFBST0JFX1BSSU5UKGEpCXByaW50ayBhCisjZWxzZQorIyBkZWZpbmUgUFJPQkVfUFJJTlQoYSkKKyNlbmRpZgorCisvKiBUaGVzZSBkZWZpbmUgdGhlIG51bWJlciBvZiBSeCBhbmQgVHggYnVmZmVycyBhcyBsb2cyLiAoT25seSBwb3dlcnMKKyAqIG9mIHR3byBhcmUgdmFsaWQpCisgKiBNdWNoIG1vcmUgcnggYnVmZmVycyAoMzIpIGFyZSByZXNlcnZlZCB0aGFuIHR4IGJ1ZmZlcnMgKDgpLCBzaW5jZSByZWNlaXZpbmcKKyAqIGlzIG1vcmUgdGltZSBjcml0aWNhbCB0aGVuIHNlbmRpbmcgYW5kIHBhY2tldHMgbWF5IGhhdmUgdG8gcmVtYWluIGluIHRoZQorICogYm9hcmQncyBtZW1vcnkgd2hlbiBtYWluIG1lbW9yeSBpcyBsb3cuCisgKi8KKworI2RlZmluZSBUWF9MT0dfUklOR19TSVpFCQkJMworI2RlZmluZSBSWF9MT0dfUklOR19TSVpFCQkJNQorCisvKiBUaGVzZSBhcmUgdGhlIGRlcml2ZWQgdmFsdWVzICovCisKKyNkZWZpbmUgVFhfUklOR19TSVpFCQkJKDEgPDwgVFhfTE9HX1JJTkdfU0laRSkKKyNkZWZpbmUgVFhfUklOR19MRU5fQklUUwkJKFRYX0xPR19SSU5HX1NJWkUgPDwgNSkKKyNkZWZpbmUJVFhfUklOR19NT0RfTUFTSwkJKFRYX1JJTkdfU0laRSAtIDEpCisKKyNkZWZpbmUgUlhfUklOR19TSVpFCQkJKDEgPDwgUlhfTE9HX1JJTkdfU0laRSkKKyNkZWZpbmUgUlhfUklOR19MRU5fQklUUwkJKFJYX0xPR19SSU5HX1NJWkUgPDwgNSkKKyNkZWZpbmUJUlhfUklOR19NT0RfTUFTSwkJKFJYX1JJTkdfU0laRSAtIDEpCisKKyNkZWZpbmUgVFhfVElNRU9VVAkyMAorCisvKiBUaGUgTEFOQ0UgUnggYW5kIFR4IHJpbmcgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3QgbGFuY2VfcnhfaGVhZCB7CisJdW5zaWduZWQgc2hvcnQJCQliYXNlOwkJLyogTG93IHdvcmQgb2YgYmFzZSBhZGRyICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhcglmbGFnOworCXVuc2lnbmVkIGNoYXIJCQliYXNlX2hpOwkvKiBIaWdoIHdvcmQgb2YgYmFzZSBhZGRyICh1bnVzZWQpICovCisJc2hvcnQJCQkJCWJ1Zl9sZW5ndGg7CS8qIFRoaXMgbGVuZ3RoIGlzIDJzIGNvbXBsZW1lbnQhICovCisJdm9sYXRpbGUgc2hvcnQJCQltc2dfbGVuZ3RoOwkvKiBUaGlzIGxlbmd0aCBpcyAibm9ybWFsIi4gKi8KK307CisKK3N0cnVjdCBsYW5jZV90eF9oZWFkIHsKKwl1bnNpZ25lZCBzaG9ydAkJCWJhc2U7CQkvKiBMb3cgd29yZCBvZiBiYXNlIGFkZHIgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCWZsYWc7CisJdW5zaWduZWQgY2hhcgkJCWJhc2VfaGk7CS8qIEhpZ2ggd29yZCBvZiBiYXNlIGFkZHIgKHVudXNlZCkgKi8KKwlzaG9ydAkJCQkJbGVuZ3RoOwkJLyogTGVuZ3RoIGlzIDJzIGNvbXBsZW1lbnQhICovCisJdm9sYXRpbGUgc2hvcnQJCQltaXNjOworfTsKKworc3RydWN0IHJpbmdkZXNjIHsKKwl1bnNpZ25lZCBzaG9ydAlhZHJfbG87CQkvKiBMb3cgMTYgYml0cyBvZiBhZGRyZXNzICovCisJdW5zaWduZWQgY2hhcglsZW47CQkvKiBMZW5ndGggYml0cyAqLworCXVuc2lnbmVkIGNoYXIJYWRyX2hpOwkJLyogSGlnaCA4IGJpdHMgb2YgYWRkcmVzcyAodW51c2VkKSAqLworfTsKKworLyogVGhlIExBTkNFIGluaXRpYWxpemF0aW9uIGJsb2NrLCBkZXNjcmliZWQgaW4gZGF0YWJvb2suICovCitzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayB7CisJdW5zaWduZWQgc2hvcnQJbW9kZTsJCS8qIFByZS1zZXQgbW9kZSAqLworCXVuc2lnbmVkIGNoYXIJaHdhZGRyWzZdOwkvKiBQaHlzaWNhbCBldGhlcm5ldCBhZGRyZXNzICovCisJdW5zaWduZWQJCWZpbHRlclsyXTsJLyogTXVsdGljYXN0IGZpbHRlciAodW51c2VkKS4gKi8KKwkvKiBSZWNlaXZlIGFuZCB0cmFuc21pdCByaW5nIGJhc2UsIGFsb25nIHdpdGggbGVuZ3RoIGJpdHMuICovCisJc3RydWN0IHJpbmdkZXNjCXJ4X3Jpbmc7CisJc3RydWN0IHJpbmdkZXNjCXR4X3Jpbmc7Cit9OworCisvKiBUaGUgd2hvbGUgbGF5b3V0IG9mIHRoZSBMYW5jZSBzaGFyZWQgbWVtb3J5ICovCitzdHJ1Y3QgbGFuY2VfbWVtb3J5IHsKKwlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jawlpbml0OworCXN0cnVjdCBsYW5jZV90eF9oZWFkCXR4X2hlYWRbVFhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgbGFuY2VfcnhfaGVhZAlyeF9oZWFkW1JYX1JJTkdfU0laRV07CisJY2hhcgkJCQkJcGFja2V0X2FyZWFbMF07CS8qIHBhY2tldCBkYXRhIGZvbGxvdyBhZnRlciB0aGUKKwkJCQkJCQkJCQkJICogaW5pdCBibG9jayBhbmQgdGhlIHJpbmcKKwkJCQkJCQkJCQkJICogZGVzY3JpcHRvcnMgYW5kIGFyZSBsb2NhdGVkCisJCQkJCQkJCQkJCSAqIGF0IHJ1bnRpbWUgKi8KK307CisKKy8qIFJpZWJsQ2FyZCBzcGVjaWZpY3M6CisgKiBUaGUgb3JpZ2luYWwgVE9TIGRyaXZlciBmb3IgdGhlc2UgY2FyZHMgcmVzZXJ2ZXMgdGhlIGFyZWEgZnJvbSBvZmZzZXQKKyAqIDB4ZWU3MCB0byAweGVlYmIgZm9yIHN0b3JpbmcgY29uZmlndXJhdGlvbiBkYXRhLiBPZiBpbnRlcmVzdCB0byB1cyBpcyB0aGUKKyAqIEV0aGVybmV0IGFkZHJlc3MgdGhlcmUsIGFuZCB0aGUgbWFnaWMgZm9yIHZlcmlmeWluZyB0aGUgZGF0YSdzIHZhbGlkaXR5LgorICogVGhlIHJlc2VydmVkIGFyZWEgaXNuJ3QgdG91Y2ggYnkgcGFja2V0IGJ1ZmZlcnMuIEZ1cnRoZXJtb3JlLCBvZmZzZXQgMHhmZmZlCisgKiBpcyByZXNlcnZlZCBmb3IgdGhlIGludGVycnVwdCB2ZWN0b3IgbnVtYmVyLgorICovCisjZGVmaW5lCVJJRUJMX1JTVkRfU1RBUlQJMHhlZTcwCisjZGVmaW5lCVJJRUJMX1JTVkRfRU5ECQkweGVlYzAKKyNkZWZpbmUgUklFQkxfTUFHSUMJCQkweDA5MDUxOTkwCisjZGVmaW5lIFJJRUJMX01BR0lDX0FERFIJKCh1bnNpZ25lZCBsb25nICopKCgoY2hhciAqKU1FTSkgKyAweGVlOGEpKQorI2RlZmluZSBSSUVCTF9IV0FERFJfQUREUgkoKHVuc2lnbmVkIGNoYXIgKikoKChjaGFyICopTUVNKSArIDB4ZWU4ZSkpCisjZGVmaW5lIFJJRUJMX0lWRUNfQUREUgkJKCh1bnNpZ25lZCBzaG9ydCAqKSgoKGNoYXIgKilNRU0pICsgMHhmZmZlKSkKKworLyogVGhpcyBpcyBhIGRlZmF1bHQgYWRkcmVzcyBmb3IgdGhlIG9sZCBSaWVibENhcmRzIHdpdGhvdXQgYSBiYXR0ZXJ5CisgKiB0aGF0IGhhdmUgbm8gZXRoZXJuZXQgYWRkcmVzcyBhdCBib290IHRpbWUuIDAwOjAwOjM2OjA0IGlzIHRoZQorICogcHJlZml4IGZvciBSaWVibCBjYXJkcywgdGhlIDAwOjAwIGF0IHRoZSBlbmQgaXMgYXJiaXRyYXJ5LgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIE9sZFJpZWJsRGVmSHdhZGRyWzZdID0geworCTB4MDAsIDB4MDAsIDB4MzYsIDB4MDQsIDB4MDAsIDB4MDAKK307CisKKworLyogSS9PIHJlZ2lzdGVycyBvZiB0aGUgTGFuY2UgY2hpcCAqLworCitzdHJ1Y3QgbGFuY2VfaW9yZWcgeworLyogYmFzZSsweDAgKi8Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQJZGF0YTsKKy8qIGJhc2UrMHgyICovCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0CWFkZHI7CisJCQkJdW5zaWduZWQgY2hhcgkJCV9kdW1teTFbM107CisvKiBiYXNlKzB4NyAqLwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCWl2ZWM7CisJCQkJdW5zaWduZWQgY2hhcgkJCV9kdW1teTJbNV07CisvKiBiYXNlKzB4ZCAqLwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCWVlcHJvbTsKKwkJCQl1bnNpZ25lZCBjaGFyCQkJX2R1bW15MzsKKy8qIGJhc2UrMHhmICovCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJbWVtOworfTsKKworLyogVHlwZXMgb2YgYm9hcmRzIHRoaXMgZHJpdmVyIHN1cHBvcnRzICovCisKK2VudW0gbGFuY2VfdHlwZSB7CisJT0xEX1JJRUJMLAkJLyogb2xkIFJpZWJsIGNhcmQgd2l0aG91dCBiYXR0ZXJ5ICovCisJTkVXX1JJRUJMLAkJLyogbmV3IFJpZWJsIGNhcmQgd2l0aCBiYXR0ZXJ5ICovCisJUEFNX0NBUkQJCS8qIFBBTSBjYXJkIHdpdGggRUVQUk9NICovCit9OworCitzdGF0aWMgY2hhciAqbGFuY2VfbmFtZXNbXSA9IHsKKwkiUmllYmwtQ2FyZCAod2l0aG91dCBiYXR0ZXJ5KSIsCisJIlJpZWJsLUNhcmQgKHdpdGggYmF0dGVyeSkiLAorCSJQQU0gaW50ZXJuIGNhcmQiCit9OworCisvKiBUaGUgZHJpdmVyJ3MgcHJpdmF0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisKK3N0cnVjdCBsYW5jZV9wcml2YXRlIHsKKwllbnVtIGxhbmNlX3R5cGUJCWNhcmR0eXBlOworCXN0cnVjdCBsYW5jZV9pb3JlZwkqaW9iYXNlOworCXN0cnVjdCBsYW5jZV9tZW1vcnkJKm1lbTsKKwlpbnQJCSAJY3VyX3J4LCBjdXJfdHg7CS8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSAqLworCWludAkJCWRpcnR5X3R4OwkJLyogUmluZyBlbnRyaWVzIHRvIGJlIGZyZWVkLiAqLworCQkJCS8qIGNvcHkgZnVuY3Rpb24gKi8KKwl2b2lkCQkJKigqbWVtY3B5X2YpKCB2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90ICk7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisvKiBUaGlzIG11c3QgYmUgbG9uZyBmb3Igc2V0X2JpdCgpICovCisJbG9uZwkJCXR4X2Z1bGw7CisJc3BpbmxvY2tfdAkJZGV2bG9jazsKK307CisKKy8qIEkvTyByZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCisKKyNkZWZpbmUJTUVNCQlscC0+bWVtCisjZGVmaW5lCURSRUcJSU8tPmRhdGEKKyNkZWZpbmUJQVJFRwlJTy0+YWRkcgorI2RlZmluZQlSRUdBKGEpCSggQVJFRyA9IChhKSwgRFJFRyApCisKKy8qIERlZmluaXRpb25zIGZvciBwYWNrZXQgYnVmZmVyIGFjY2VzczogKi8KKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTU0NAorLyogR2V0IHRoZSBhZGRyZXNzIG9mIGEgcGFja2V0IGJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gYnVmZmVyIGhlYWQgKi8KKyNkZWZpbmUJUEtUQlVGX0FERFIoaGVhZCkJKCgodW5zaWduZWQgY2hhciAqKShNRU0pKSArIChoZWFkKS0+YmFzZSkKKworLyogUG9zc2libGUgbWVtb3J5L0lPIGFkZHJlc3NlcyBmb3IgcHJvYmluZyAqLworCitzdHJ1Y3QgbGFuY2VfYWRkciB7CisJdW5zaWduZWQgbG9uZwltZW1hZGRyOworCXVuc2lnbmVkIGxvbmcJaW9hZGRyOworCWludAkJCQlzbG93X2ZsYWc7Cit9IGxhbmNlX2FkZHJfbGlzdFtdID0geworCXsgMHhmZTAxMDAwMCwgMHhmZTAwZmZmMCwgMCB9LAkvKiBSaWVibENhcmQgVk1FIGluIFRUICovCisJeyAweGZmYzEwMDAwLCAweGZmYzBmZmYwLCAwIH0sCS8qIFJpZWJsQ2FyZCBWTUUgaW4gTWVnYVNURQorCQkJCQkJCQkJICAgKGhpZ2hlc3QgYnl0ZSBzdHJpcHBlZCkgKi8KKwl7IDB4ZmZlMDAwMDAsIDB4ZmZmZjcwMDAsIDEgfSwJLyogUmllYmxDYXJkIGluIFNUCisJCQkJCQkJCQkgICAoaGlnaGVzdCBieXRlIHN0cmlwcGVkKSAqLworCXsgMHhmZmQwMDAwMCwgMHhmZmZmNzAwMCwgMSB9LAkvKiBSaWVibENhcmQgaW4gU1Qgd2l0aCBodyBtb2RpZi4gdG8KKwkJCQkJCQkJCSAgIGF2b2lkIGNvbmZsaWN0IHdpdGggUk9NCisJCQkJCQkJCQkgICAoaGlnaGVzdCBieXRlIHN0cmlwcGVkKSAqLworCXsgMHhmZmNmMDAwMCwgMHhmZmNmZmZmMCwgMCB9LAkvKiBQQU1DYXJkIFZNRSBpbiBUVCBhbmQgTVNURQorCQkJCQkJCQkJICAgKGhpZ2hlc3QgYnl0ZSBzdHJpcHBlZCkgKi8KKwl7IDB4ZmVjZjAwMDAsIDB4ZmVjZmZmZjAsIDAgfSwJLyogUmhvdHJvbidzIFBBTUNhcmQgVk1FIGluIFRUIGFuZCBNU1RFCisJCQkJCQkJCQkgICAoaGlnaGVzdCBieXRlIHN0cmlwcGVkKSAqLworfTsKKworI2RlZmluZQlOX0xBTkNFX0FERFIJKHNpemVvZihsYW5jZV9hZGRyX2xpc3QpL3NpemVvZigqbGFuY2VfYWRkcl9saXN0KSkKKworCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIExhbmNlICovCisKKy8qIHR4X2hlYWQgZmxhZ3MgKi8KKyNkZWZpbmUgVE1EMV9FTlAJCTB4MDEJLyogZW5kIG9mIHBhY2tldCAqLworI2RlZmluZSBUTUQxX1NUUAkJMHgwMgkvKiBzdGFydCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgVE1EMV9ERUYJCTB4MDQJLyogZGVmZXJyZWQgKi8KKyNkZWZpbmUgVE1EMV9PTkUJCTB4MDgJLyogb25lIHJldHJ5IG5lZWRlZCAqLworI2RlZmluZSBUTUQxX01PUkUJCTB4MTAJLyogbW9yZSB0aGFuIG9uZSByZXRyeSBuZWVkZWQgKi8KKyNkZWZpbmUgVE1EMV9FUlIJCTB4NDAJLyogZXJyb3Igc3VtbWFyeSAqLworI2RlZmluZSBUTUQxX09XTiAJCTB4ODAJLyogb3duZXJzaGlwIChzZXQ6IGNoaXAgb3ducykgKi8KKworI2RlZmluZSBUTUQxX09XTl9DSElQCVRNRDFfT1dOCisjZGVmaW5lIFRNRDFfT1dOX0hPU1QJMAorCisvKiB0eF9oZWFkIG1pc2MgZmllbGQgKi8KKyNkZWZpbmUgVE1EM19URFIJCTB4MDNGRgkvKiBUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5IGNvdW50ZXIgKi8KKyNkZWZpbmUgVE1EM19SVFJZCQkweDA0MDAJLyogZmFpbGVkIGFmdGVyIDE2IHJldHJpZXMgKi8KKyNkZWZpbmUgVE1EM19MQ0FSCQkweDA4MDAJLyogY2FycmllciBsb3N0ICovCisjZGVmaW5lIFRNRDNfTENPTAkJMHgxMDAwCS8qIGxhdGUgY29sbGlzaW9uICovCisjZGVmaW5lIFRNRDNfVUZMTwkJMHg0MDAwCS8qIHVuZGVyZmxvdyAobGF0ZSBtZW1vcnkpICovCisjZGVmaW5lIFRNRDNfQlVGRgkJMHg4MDAwCS8qIGJ1ZmZlcmluZyBlcnJvciAobm8gRU5QKSAqLworCisvKiByeF9oZWFkIGZsYWdzICovCisjZGVmaW5lIFJNRDFfRU5QCQkweDAxCS8qIGVuZCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgUk1EMV9TVFAJCTB4MDIJLyogc3RhcnQgb2YgcGFja2V0ICovCisjZGVmaW5lIFJNRDFfQlVGRgkJMHgwNAkvKiBidWZmZXIgZXJyb3IgKi8KKyNkZWZpbmUgUk1EMV9DUkMJCTB4MDgJLyogQ1JDIGVycm9yICovCisjZGVmaW5lIFJNRDFfT0ZMTwkJMHgxMAkvKiBvdmVyZmxvdyAqLworI2RlZmluZSBSTUQxX0ZSQU0JCTB4MjAJLyogZnJhbWluZyBlcnJvciAqLworI2RlZmluZSBSTUQxX0VSUgkJMHg0MAkvKiBlcnJvciBzdW1tYXJ5ICovCisjZGVmaW5lIFJNRDFfT1dOIAkJMHg4MAkvKiBvd25lcnNoaXAgKHNldDogc2hpcCBvd25zKSAqLworCisjZGVmaW5lIFJNRDFfT1dOX0NISVAJUk1EMV9PV04KKyNkZWZpbmUgUk1EMV9PV05fSE9TVAkwCisKKy8qIHJlZ2lzdGVyIG5hbWVzICovCisjZGVmaW5lIENTUjAJMAkJLyogbW9kZS9zdGF0dXMgKi8KKyNkZWZpbmUgQ1NSMQkxCQkvKiBpbml0IGJsb2NrIGFkZHIgKGxvdykgKi8KKyNkZWZpbmUgQ1NSMgkyCQkvKiBpbml0IGJsb2NrIGFkZHIgKGhpZ2gpICovCisjZGVmaW5lIENTUjMJMwkJLyogbWlzYyAqLworI2RlZmluZSBDU1I4CTgJICAJLyogYWRkcmVzcyBmaWx0ZXIgKi8KKyNkZWZpbmUgQ1NSMTUJMTUJCS8qIHByb21pc2N1b3VzIG1vZGUgKi8KKworLyogQ1NSMCAqLworLyogKFI9cmVhZGFibGUsIFc9d3JpdGVhYmxlLCBTPXNldCBvbiB3cml0ZSwgQz1jbGVhciBvbiB3cml0ZSkgKi8KKyNkZWZpbmUgQ1NSMF9JTklUCTB4MDAwMQkJLyogaW5pdGlhbGl6ZSAoUlMpICovCisjZGVmaW5lIENTUjBfU1RSVAkweDAwMDIJCS8qIHN0YXJ0IChSUykgKi8KKyNkZWZpbmUgQ1NSMF9TVE9QCTB4MDAwNAkJLyogc3RvcCAoUlMpICovCisjZGVmaW5lIENTUjBfVERNRAkweDAwMDgJCS8qIHRyYW5zbWl0IGRlbWFuZCAoUlMpICovCisjZGVmaW5lIENTUjBfVFhPTgkweDAwMTAJCS8qIHRyYW5zbWl0dGVyIG9uIChSKSAqLworI2RlZmluZSBDU1IwX1JYT04JMHgwMDIwCQkvKiByZWNlaXZlciBvbiAoUikgKi8KKyNkZWZpbmUgQ1NSMF9JTkVBCTB4MDA0MAkJLyogaW50ZXJydXB0IGVuYWJsZSAoUlcpICovCisjZGVmaW5lIENTUjBfSU5UUgkweDAwODAJCS8qIGludGVycnVwdCBhY3RpdmUgKFIpICovCisjZGVmaW5lIENTUjBfSURPTgkweDAxMDAJCS8qIGluaXRpYWxpemF0aW9uIGRvbmUgKFJDKSAqLworI2RlZmluZSBDU1IwX1RJTlQJMHgwMjAwCQkvKiB0cmFuc21pdHRlciBpbnRlcnJ1cHQgKFJDKSAqLworI2RlZmluZSBDU1IwX1JJTlQJMHgwNDAwCQkvKiByZWNlaXZlciBpbnRlcnJ1cHQgKFJDKSAqLworI2RlZmluZSBDU1IwX01FUlIJMHgwODAwCQkvKiBtZW1vcnkgZXJyb3IgKFJDKSAqLworI2RlZmluZSBDU1IwX01JU1MJMHgxMDAwCQkvKiBtaXNzZWQgZnJhbWUgKFJDKSAqLworI2RlZmluZSBDU1IwX0NFUlIJMHgyMDAwCQkvKiBjYXJyaWVyIGVycm9yIChubyBoZWFydGJlYXQgOi0pIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9CQUJMCTB4NDAwMAkJLyogYmFiYmxlOiB0eC1lZCB0b28gbWFueSBiaXRzIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9FUlIJMHg4MDAwCQkvKiBlcnJvciAoUkMpICovCisKKy8qIENTUjMgKi8KKyNkZWZpbmUgQ1NSM19CQ09OCTB4MDAwMQkJLyogYnl0ZSBjb250cm9sICovCisjZGVmaW5lIENTUjNfQUNPTgkweDAwMDIJCS8qIEFMRSBjb250cm9sICovCisjZGVmaW5lIENTUjNfQlNXUAkweDAwMDQJCS8qIGJ5dGUgc3dhcCAoMT1iaWcgZW5kaWFuKSAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgYWRkcl9hY2Nlc3NpYmxlKCB2b2xhdGlsZSB2b2lkICpyZWdwLCBpbnQgd29yZGZsYWcsIGludAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlZmxhZyApOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFuY2VfcHJvYmUxKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbGFuY2VfYWRkcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5pdF9yZWMgKTsKK3N0YXRpYyBpbnQgbGFuY2Vfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworc3RhdGljIHZvaWQgbGFuY2VfaW5pdF9yaW5nKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgaW50IGxhbmNlX3N0YXJ0X3htaXQoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBsYW5jZV9pbnRlcnJ1cHQoIGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwICk7CitzdGF0aWMgaW50IGxhbmNlX3J4KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgaW50IGxhbmNlX2Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmxhbmNlX2dldF9zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgaW50IGxhbmNlX3NldF9tYWNfYWRkcmVzcyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkciApOworc3RhdGljIHZvaWQgbGFuY2VfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworDAorCitzdGF0aWMgdm9pZCAqc2xvd19tZW1jcHkoIHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbGVuICkKKworewljaGFyICpjdG8gPSBkc3Q7CisJY29uc3QgY2hhciAqY2Zyb20gPSBzcmM7CisKKwl3aGlsZSggbGVuLS0gKSB7CisJCSpjdG8rKyA9ICpjZnJvbSsrOworCQlNRlBERUxBWSgpOworCX0KKwlyZXR1cm4oIGRzdCApOworfQorCisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGF0YXJpbGFuY2VfcHJvYmUoaW50IHVuaXQpCit7CisJaW50IGk7CisJc3RhdGljIGludCBmb3VuZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBlcnIgPSAtRU5PREVWOworCisJaWYgKCFNQUNIX0lTX0FUQVJJIHx8IGZvdW5kKQorCQkvKiBBc3N1bWUgdGhlcmUncyBvbmx5IG9uZSBib2FyZCBwb3NzaWJsZS4uLiBUaGF0IHNlZW1zIHRydWUsIHNpbmNlCisJCSAqIHRoZSBSaWVibC9QQU0gYm9hcmQncyBhZGRyZXNzIGNhbm5vdCBiZSBjaGFuZ2VkLiAqLworCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJZm9yKCBpID0gMDsgaSA8IE5fTEFOQ0VfQUREUjsgKytpICkgeworCQlpZiAobGFuY2VfcHJvYmUxKCBkZXYsICZsYW5jZV9hZGRyX2xpc3RbaV0gKSkgeworCQkJZm91bmQgPSAxOworCQkJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQlpZiAoIWVycikKKwkJCQlyZXR1cm4gZGV2OworCQkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCQlicmVhazsKKwkJfQorCX0KKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKworLyogRGVyaXZlZCBmcm9tIGh3cmVnX3ByZXNlbnQoKSBpbiBhdGFyaS9jb25maWcuYzogKi8KKworc3RhdGljIGludCBfX2luaXQgYWRkcl9hY2Nlc3NpYmxlKCB2b2xhdGlsZSB2b2lkICpyZWdwLCBpbnQgd29yZGZsYWcsIGludCB3cml0ZWZsYWcgKQoreworCWludAkJcmV0OworCWxvbmcJZmxhZ3M7CisJbG9uZwkqdmJyLCBzYXZlX2JlcnI7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJtb3ZlYwklL3ZiciwlMCIgOiAiPXIiICh2YnIpIDogKTsKKwlzYXZlX2JlcnIgPSB2YnJbMl07CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXworCSgJIm1vdmVsCSUvc3AsJS9kMVxuXHQiCisJCSJtb3ZlbAkjTGJlcnIsJTJAXG5cdCIKKwkJIm1vdmVxCSMwLCUwXG5cdCIKKwkJInRzdGwgICAlM1xuXHQiCisJCSJibmUJMWZcblx0IgorCQkibW92ZWIJJTFALCUvZDBcblx0IgorCQkibm9wCVxuXHQiCisJCSJicmEJMmZcbiIKKyIxOgkJIG1vdmV3CSUxQCwlL2QwXG5cdCIKKwkJIm5vcAlcbiIKKyIyOgkJIHRzdGwgICAlNFxuXHQiCisJCSJiZXEJMmZcblx0IgorCQkidHN0bAklM1xuXHQiCisJCSJibmUJMWZcblx0IgorCQkiY2xyYgklMUBcblx0IgorCQkibm9wCVxuXHQiCisJCSJtb3ZlYgklL2QwLCUxQFxuXHQiCisJCSJub3AJXG5cdCIKKwkJImJyYQkyZlxuIgorIjE6CQkgY2xydwklMUBcblx0IgorCQkibm9wCVxuXHQiCisJCSJtb3ZldwklL2QwLCUxQFxuXHQiCisJCSJub3AJXG4iCisiMjoJCSBtb3ZlcQkjMSwlMFxuIgorIkxiZXJyOgkgbW92ZWwJJS9kMSwlL3NwIgorCQk6ICI9JmQiIChyZXQpCisJCTogImEiIChyZWdwKSwgImEiICgmdmJyWzJdKSwgInJtIiAod29yZGZsYWcpLCAicm0iICh3cml0ZWZsYWcpCisJCTogImQwIiwgImQxIiwgIm1lbW9yeSIKKwkpOworCisJdmJyWzJdID0gc2F2ZV9iZXJyOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiggcmV0ICk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGxhbmNlX3Byb2JlMSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgc3RydWN0IGxhbmNlX2FkZHIgKmluaXRfcmVjICkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqbWVtYWRkciA9CisJCSh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKWluaXRfcmVjLT5tZW1hZGRyOworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICppb2FkZHIgPQorCQkodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilpbml0X3JlYy0+aW9hZGRyOworCXN0cnVjdCBsYW5jZV9wcml2YXRlCSpscDsKKwlzdHJ1Y3QgbGFuY2VfaW9yZWcJCSpJTzsKKwlpbnQgCQkJCQlpOworCXN0YXRpYyBpbnQgCQkJCWRpZF92ZXJzaW9uOworCXVuc2lnbmVkIHNob3J0CQkJc2F2ZTEsIHNhdmUyOworCisJUFJPQkVfUFJJTlQoKCAiUHJvYmluZyBmb3IgTGFuY2UgY2FyZCBhdCBtZW0gJSNseCBpbyAlI2x4XG4iLAorCQkJCSAgKGxvbmcpbWVtYWRkciwgKGxvbmcpaW9hZGRyICkpOworCisJLyogVGVzdCB3aGV0aGVyIG1lbW9yeSByZWFkYWJsZSBhbmQgd3JpdGFibGUgKi8KKwlQUk9CRV9QUklOVCgoICJsYW5jZV9wcm9iZTE6IHRlc3RpbmcgbWVtb3J5IHRvIGJlIGFjY2Vzc2libGVcbiIgKSk7CisJaWYgKCFhZGRyX2FjY2Vzc2libGUoIG1lbWFkZHIsIDEsIDEgKSkgZ290byBwcm9iZV9mYWlsOworCisJLyogV3JpdHRlbiB2YWx1ZXMgc2hvdWxkIGNvbWUgYmFjay4uLiAqLworCVBST0JFX1BSSU5UKCggImxhbmNlX3Byb2JlMTogdGVzdGluZyBtZW1vcnkgdG8gYmUgd3JpdGFibGUgKDEpXG4iICkpOworCXNhdmUxID0gKm1lbWFkZHI7CisJKm1lbWFkZHIgPSAweDAwMDE7CisJaWYgKCptZW1hZGRyICE9IDB4MDAwMSkgZ290byBwcm9iZV9mYWlsOworCVBST0JFX1BSSU5UKCggImxhbmNlX3Byb2JlMTogdGVzdGluZyBtZW1vcnkgdG8gYmUgd3JpdGFibGUgKDIpXG4iICkpOworCSptZW1hZGRyID0gMHgwMDAwOworCWlmICgqbWVtYWRkciAhPSAweDAwMDApIGdvdG8gcHJvYmVfZmFpbDsKKwkqbWVtYWRkciA9IHNhdmUxOworCisJLyogRmlyc3QgcG9ydCBzaG91bGQgYmUgcmVhZGFibGUgYW5kIHdyaXRhYmxlICovCisJUFJPQkVfUFJJTlQoKCAibGFuY2VfcHJvYmUxOiB0ZXN0aW5nIGlvcG9ydCB0byBiZSBhY2Nlc3NpYmxlXG4iICkpOworCWlmICghYWRkcl9hY2Nlc3NpYmxlKCBpb2FkZHIsIDEsIDEgKSkgZ290byBwcm9iZV9mYWlsOworCisJLyogYW5kIHdyaXR0ZW4gdmFsdWVzIHNob3VsZCBiZSByZWFkYWJsZSAqLworCVBST0JFX1BSSU5UKCggImxhbmNlX3Byb2JlMTogdGVzdGluZyBpb3BvcnQgdG8gYmUgd3JpdGVhYmxlXG4iICkpOworCXNhdmUyID0gaW9hZGRyWzFdOworCWlvYWRkclsxXSA9IDB4MDAwMTsKKwlpZiAoaW9hZGRyWzFdICE9IDB4MDAwMSkgZ290byBwcm9iZV9mYWlsOworCisJLyogVGhlIENTUjBfSU5JVCBiaXQgc2hvdWxkIG5vdCBiZSByZWFkYWJsZSAqLworCVBST0JFX1BSSU5UKCggImxhbmNlX3Byb2JlMTogdGVzdGluZyBDU1IwIHJlZ2lzdGVyIGZ1bmN0aW9uICgxKVxuIiApKTsKKwlzYXZlMSA9IGlvYWRkclswXTsKKwlpb2FkZHJbMV0gPSBDU1IwOworCWlvYWRkclswXSA9IENTUjBfSU5JVCB8IENTUjBfU1RPUDsKKwlpZiAoaW9hZGRyWzBdICE9IENTUjBfU1RPUCkgeworCQlpb2FkZHJbMF0gPSBzYXZlMTsKKwkJaW9hZGRyWzFdID0gc2F2ZTI7CisJCWdvdG8gcHJvYmVfZmFpbDsKKwl9CisJUFJPQkVfUFJJTlQoKCAibGFuY2VfcHJvYmUxOiB0ZXN0aW5nIENTUjAgcmVnaXN0ZXIgZnVuY3Rpb24gKDIpXG4iICkpOworCWlvYWRkclswXSA9IENTUjBfU1RPUDsKKwlpZiAoaW9hZGRyWzBdICE9IENTUjBfU1RPUCkgeworCQlpb2FkZHJbMF0gPSBzYXZlMTsKKwkJaW9hZGRyWzFdID0gc2F2ZTI7CisJCWdvdG8gcHJvYmVfZmFpbDsKKwl9CisKKwkvKiBOb3cgb2suLi4gKi8KKwlQUk9CRV9QUklOVCgoICJsYW5jZV9wcm9iZTE6IExhbmNlIGNhcmQgZGV0ZWN0ZWRcbiIgKSk7CisJZ290byBwcm9iZV9vazsKKworICBwcm9iZV9mYWlsOgorCXJldHVybiggMCApOworCisgIHByb2JlX29rOgorCWxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopZGV2LT5wcml2OworCU1FTSA9IChzdHJ1Y3QgbGFuY2VfbWVtb3J5ICopbWVtYWRkcjsKKwlJTyA9IGxwLT5pb2Jhc2UgPSAoc3RydWN0IGxhbmNlX2lvcmVnICopaW9hZGRyOworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9hZGRyOyAvKiBpbmZvcm1hdGlvbmFsIG9ubHkgKi8KKwlscC0+bWVtY3B5X2YgPSBpbml0X3JlYy0+c2xvd19mbGFnID8gc2xvd19tZW1jcHkgOiBtZW1jcHk7CisKKwlSRUdBKCBDU1IwICkgPSBDU1IwX1NUT1A7CisKKwkvKiBOb3cgdGVzdCBmb3IgdHlwZTogSWYgdGhlIGVlcHJvbSBJL08gcG9ydCBpcyByZWFkYWJsZSwgaXQgaXMgYQorCSAqIFBBTSBjYXJkICovCisJaWYgKGFkZHJfYWNjZXNzaWJsZSggJihJTy0+ZWVwcm9tKSwgMCwgMCApKSB7CisJCS8qIFN3aXRjaCBiYWNrIHRvIFJhbSAqLworCQlpID0gSU8tPm1lbTsKKwkJbHAtPmNhcmR0eXBlID0gUEFNX0NBUkQ7CisJfQorCWVsc2UgaWYgKCpSSUVCTF9NQUdJQ19BRERSID09IFJJRUJMX01BR0lDKSB7CisJCWxwLT5jYXJkdHlwZSA9IE5FV19SSUVCTDsKKwl9CisJZWxzZQorCQlscC0+Y2FyZHR5cGUgPSBPTERfUklFQkw7CisKKwlpZiAobHAtPmNhcmR0eXBlID09IFBBTV9DQVJEIHx8CisJCW1lbWFkZHIgPT0gKHVuc2lnbmVkIHNob3J0ICopMHhmZmUwMDAwMCkgeworCQkvKiBQQU1zIGNhcmQgYW5kIFJpZWJsIG9uIFNUIHVzZSBsZXZlbCA1IGF1dG92ZWN0b3IgKi8KKwkJaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzUsIGxhbmNlX2ludGVycnVwdCwgSVJRX1RZUEVfUFJJTywKKwkJICAgICAgICAgICAgIlBBTS9SaWVibC1TVCBFdGhlcm5ldCIsIGRldikpIHsgCisJCQlwcmludGsoICJMYW5jZTogcmVxdWVzdCBmb3IgaXJxICVkIGZhaWxlZFxuIiwgSVJRX0FVVE9fNSApOworCQkJcmV0dXJuKCAwICk7CisJCX0KKwkJZGV2LT5pcnEgPSAodW5zaWduZWQgc2hvcnQpSVJRX0FVVE9fNTsKKwl9CisJZWxzZSB7CisJCS8qIEZvciBWTUUtUmllYmxDYXJkcywgcmVxdWVzdCBhIGZyZWUgVk1FIGludDsKKwkJICogKFRoaXMgbXVzdCBiZSB1bnNpZ25lZCBsb25nLCBzaW5jZSBkZXYtPmlycSBpcyBzaG9ydCBhbmQgdGhlCisJCSAqIElSUV9NQUNIU1BFQyBiaXQgd291bGQgYmUgY3V0IG9mZi4uLikKKwkJICovCisJCXVuc2lnbmVkIGxvbmcgaXJxID0gYXRhcmlfcmVnaXN0ZXJfdm1lX2ludCgpOworCQlpZiAoIWlycSkgeworCQkJcHJpbnRrKCAiTGFuY2U6IHJlcXVlc3QgZm9yIFZNRSBpbnRlcnJ1cHQgZmFpbGVkXG4iICk7CisJCQlyZXR1cm4oIDAgKTsKKwkJfQorCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBsYW5jZV9pbnRlcnJ1cHQsIElSUV9UWVBFX1BSSU8sCisJCSAgICAgICAgICAgICJSaWVibC1WTUUgRXRoZXJuZXQiLCBkZXYpKSB7CisJCQlwcmludGsoICJMYW5jZTogcmVxdWVzdCBmb3IgaXJxICVsZCBmYWlsZWRcbiIsIGlycSApOworCQkJcmV0dXJuKCAwICk7CisJCX0KKwkJZGV2LT5pcnEgPSBpcnE7CisJfQorCisJcHJpbnRrKCIlczogJXMgYXQgaW8gJSNseCwgbWVtICUjbHgsIGlycSAlZCVzLCBod2FkZHIgIiwKKwkJICAgZGV2LT5uYW1lLCBsYW5jZV9uYW1lc1tscC0+Y2FyZHR5cGVdLAorCQkgICAodW5zaWduZWQgbG9uZylpb2FkZHIsCisJCSAgICh1bnNpZ25lZCBsb25nKW1lbWFkZHIsCisJCSAgIGRldi0+aXJxLAorCQkgICBpbml0X3JlYy0+c2xvd19mbGFnID8gIiAoc2xvdyBtZW1jcHkpIiA6ICIiICk7CisKKwkvKiBHZXQgdGhlIGV0aGVybmV0IGFkZHJlc3MgKi8KKwlzd2l0Y2goIGxwLT5jYXJkdHlwZSApIHsKKwkgIGNhc2UgT0xEX1JJRUJMOgorCQkvKiBObyBldGhlcm5ldCBhZGRyZXNzISAoU2V0IHNvbWUgZGVmYXVsdCBhZGRyZXNzKSAqLworCQltZW1jcHkoIGRldi0+ZGV2X2FkZHIsIE9sZFJpZWJsRGVmSHdhZGRyLCA2ICk7CisJCWJyZWFrOworCSAgY2FzZSBORVdfUklFQkw6CisJCWxwLT5tZW1jcHlfZiggZGV2LT5kZXZfYWRkciwgUklFQkxfSFdBRERSX0FERFIsIDYgKTsKKwkJYnJlYWs7CisJICBjYXNlIFBBTV9DQVJEOgorCQlpID0gSU8tPmVlcHJvbTsKKwkJZm9yKCBpID0gMDsgaSA8IDY7ICsraSApCisJCQlkZXYtPmRldl9hZGRyW2ldID0KKwkJCQkoKCgodW5zaWduZWQgc2hvcnQgKilNRU0pW2kqMl0gJiAweDBmKSA8PCA0KSB8CisJCQkJKCgoKHVuc2lnbmVkIHNob3J0ICopTUVNKVtpKjIrMV0gJiAweDBmKSk7CisJCWkgPSBJTy0+bWVtOworCQlicmVhazsKKwl9CisJZm9yKCBpID0gMDsgaSA8IDY7ICsraSApCisJCXByaW50ayggIiUwMnglcyIsIGRldi0+ZGV2X2FkZHJbaV0sIChpIDwgNSkgPyAiOiIgOiAiXG4iICk7CisJaWYgKGxwLT5jYXJkdHlwZSA9PSBPTERfUklFQkwpIHsKKwkJcHJpbnRrKCAiJXM6IFdhcm5pbmc6IFRoaXMgaXMgYSBkZWZhdWx0IGV0aGVybmV0IGFkZHJlc3MhXG4iLAorCQkJCWRldi0+bmFtZSApOworCQlwcmludGsoICIgICAgICBVc2UgXCJpZmNvbmZpZyBodyBldGhlciAuLi5cIiB0byBzZXQgdGhlIGFkZHJlc3MuXG4iICk7CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJmxwLT5kZXZsb2NrKTsKKworCU1FTS0+aW5pdC5tb2RlID0gMHgwMDAwOwkJLyogRGlzYWJsZSBSeCBhbmQgVHguICovCisJZm9yKCBpID0gMDsgaSA8IDY7IGkrKyApCisJCU1FTS0+aW5pdC5od2FkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2leMV07IC8qIDwtIDE2IGJpdCBzd2FwISAqLworCU1FTS0+aW5pdC5maWx0ZXJbMF0gPSAweDAwMDAwMDAwOworCU1FTS0+aW5pdC5maWx0ZXJbMV0gPSAweDAwMDAwMDAwOworCU1FTS0+aW5pdC5yeF9yaW5nLmFkcl9sbyA9IG9mZnNldG9mKCBzdHJ1Y3QgbGFuY2VfbWVtb3J5LCByeF9oZWFkICk7CisJTUVNLT5pbml0LnJ4X3JpbmcuYWRyX2hpID0gMDsKKwlNRU0tPmluaXQucnhfcmluZy5sZW4gICAgPSBSWF9SSU5HX0xFTl9CSVRTOworCU1FTS0+aW5pdC50eF9yaW5nLmFkcl9sbyA9IG9mZnNldG9mKCBzdHJ1Y3QgbGFuY2VfbWVtb3J5LCB0eF9oZWFkICk7CisJTUVNLT5pbml0LnR4X3JpbmcuYWRyX2hpID0gMDsKKwlNRU0tPmluaXQudHhfcmluZy5sZW4gICAgPSBUWF9SSU5HX0xFTl9CSVRTOworCisJaWYgKGxwLT5jYXJkdHlwZSA9PSBQQU1fQ0FSRCkKKwkJSU8tPml2ZWMgPSBJUlFfU09VUkNFX1RPX1ZFQ1RPUihkZXYtPmlycSk7CisJZWxzZQorCQkqUklFQkxfSVZFQ19BRERSID0gSVJRX1NPVVJDRV9UT19WRUNUT1IoZGV2LT5pcnEpOworCisJaWYgKGRpZF92ZXJzaW9uKysgPT0gMCkKKwkJRFBSSU5USyggMSwgKCB2ZXJzaW9uICkpOworCisJLyogVGhlIExBTkNFLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuID0gJmxhbmNlX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmbGFuY2Vfc3RhcnRfeG1pdDsKKwlkZXYtPnN0b3AgPSAmbGFuY2VfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmbGFuY2VfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZsYW5jZV9zZXRfbWFjX2FkZHJlc3M7CisKKwkvKiBYWFggTVNjaCAqLworCWRldi0+dHhfdGltZW91dCA9IGxhbmNlX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisJCQkKKworI2lmIDAKKwlkZXYtPnN0YXJ0ID0gMDsKKyNlbmRpZgorCisJbWVtc2V0KCAmbHAtPnN0YXRzLCAwLCBzaXplb2YobHAtPnN0YXRzKSApOworCisJcmV0dXJuKCAxICk7Cit9CisKKwwKK3N0YXRpYyBpbnQgbGFuY2Vfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCisKK3sJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopZGV2LT5wcml2OworCXN0cnVjdCBsYW5jZV9pb3JlZwkgKklPID0gbHAtPmlvYmFzZTsKKwlpbnQgaTsKKworCURQUklOVEsoIDIsICggIiVzOiBsYW5jZV9vcGVuKClcbiIsIGRldi0+bmFtZSApKTsKKworCWxhbmNlX2luaXRfcmluZyhkZXYpOworCS8qIFJlLWluaXRpYWxpemUgdGhlIExBTkNFLCBhbmQgc3RhcnQgaXQgd2hlbiBkb25lLiAqLworCisJUkVHQSggQ1NSMyApID0gQ1NSM19CU1dQIHwgKGxwLT5jYXJkdHlwZSA9PSBQQU1fQ0FSRCA/IENTUjNfQUNPTiA6IDApOworCVJFR0EoIENTUjIgKSA9IDA7CisJUkVHQSggQ1NSMSApID0gMDsKKwlSRUdBKCBDU1IwICkgPSBDU1IwX0lOSVQ7CisJLyogRnJvbSBub3cgb24sIEFSRUcgaXMga2VwdCB0byBwb2ludCB0byBDU1IwICovCisKKwlpID0gMTAwMDAwMDsKKwl3aGlsZSAoLS1pID4gMCkKKwkJaWYgKERSRUcgJiBDU1IwX0lET04pCisJCQlicmVhazsKKwlpZiAoaSA8IDAgfHwgKERSRUcgJiBDU1IwX0VSUikpIHsKKwkJRFBSSU5USyggMiwgKCAibGFuY2Vfb3BlbigpOiBvcGVuaW5nICVzIGZhaWxlZCwgaT0lZCwgY3NyMD0lMDR4XG4iLAorCQkJCQkgIGRldi0+bmFtZSwgaSwgRFJFRyApKTsKKwkJRFJFRyA9IENTUjBfU1RPUDsKKwkJcmV0dXJuKCAtRUlPICk7CisJfQorCURSRUcgPSBDU1IwX0lET047CisJRFJFRyA9IENTUjBfU1RSVDsKKwlEUkVHID0gQ1NSMF9JTkVBOworCisJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisKKwlEUFJJTlRLKCAyLCAoICIlczogTEFOQ0UgaXMgb3BlbiwgY3NyMCAlMDR4XG4iLCBkZXYtPm5hbWUsIERSRUcgKSk7CisKKwlyZXR1cm4oIDAgKTsKK30KKworCisvKiBJbml0aWFsaXplIHRoZSBMQU5DRSBSeCBhbmQgVHggcmluZ3MuICovCisKK3N0YXRpYyB2b2lkIGxhbmNlX2luaXRfcmluZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCisKK3sJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopZGV2LT5wcml2OworCWludCBpOworCXVuc2lnbmVkIG9mZnNldDsKKworCWxwLT50eF9mdWxsID0gMDsKKwlscC0+Y3VyX3J4ID0gbHAtPmN1cl90eCA9IDA7CisJbHAtPmRpcnR5X3R4ID0gMDsKKworCW9mZnNldCA9IG9mZnNldG9mKCBzdHJ1Y3QgbGFuY2VfbWVtb3J5LCBwYWNrZXRfYXJlYSApOworCisvKiBJZiB0aGUgcGFja2V0IGJ1ZmZlciBhdCBvZmZzZXQgJ28nIHdvdWxkIGNvbmZsaWN0IHdpdGggdGhlIHJlc2VydmVkIGFyZWEKKyAqIG9mIFJpZWJsQ2FyZHMsIGFkdmFuY2UgaXQgKi8KKyNkZWZpbmUJQ0hFQ0tfT0ZGU0VUKG8pCQkJCQkJCQkJCQkJCQkgXAorCWRvIHsJCQkJCQkJCQkJCQkJCQkJCSBcCisJCWlmIChscC0+Y2FyZHR5cGUgPT0gT0xEX1JJRUJMIHx8IGxwLT5jYXJkdHlwZSA9PSBORVdfUklFQkwpIHsJCSBcCisJCQlpZiAoKChvKSA8IFJJRUJMX1JTVkRfU1RBUlQpID8gKG8pK1BLVF9CVUZfU1ogPiBSSUVCTF9SU1ZEX1NUQVJUIFwKKwkJCQkJCQkJCQkgOiAobykgPCBSSUVCTF9SU1ZEX0VORCkJCQkgXAorCQkJCShvKSA9IFJJRUJMX1JTVkRfRU5EOwkJCQkJCQkJCQkgXAorCQl9CQkJCQkJCQkJCQkJCQkJCQkgXAorCX0gd2hpbGUoMCkKKworCWZvciggaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKyApIHsKKwkJQ0hFQ0tfT0ZGU0VUKG9mZnNldCk7CisJCU1FTS0+dHhfaGVhZFtpXS5iYXNlID0gb2Zmc2V0OworCQlNRU0tPnR4X2hlYWRbaV0uZmxhZyA9IFRNRDFfT1dOX0hPU1Q7CisgCQlNRU0tPnR4X2hlYWRbaV0uYmFzZV9oaSA9IDA7CisJCU1FTS0+dHhfaGVhZFtpXS5sZW5ndGggPSAwOworCQlNRU0tPnR4X2hlYWRbaV0ubWlzYyA9IDA7CisJCW9mZnNldCArPSBQS1RfQlVGX1NaOworCX0KKworCWZvciggaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKyApIHsKKwkJQ0hFQ0tfT0ZGU0VUKG9mZnNldCk7CisJCU1FTS0+cnhfaGVhZFtpXS5iYXNlID0gb2Zmc2V0OworCQlNRU0tPnJ4X2hlYWRbaV0uZmxhZyA9IFRNRDFfT1dOX0NISVA7CisJCU1FTS0+cnhfaGVhZFtpXS5iYXNlX2hpID0gMDsKKwkJTUVNLT5yeF9oZWFkW2ldLmJ1Zl9sZW5ndGggPSAtUEtUX0JVRl9TWjsKKwkJTUVNLT5yeF9oZWFkW2ldLm1zZ19sZW5ndGggPSAwOworCQlvZmZzZXQgKz0gUEtUX0JVRl9TWjsKKwl9Cit9CisKKworLyogWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCAqLworCisKK3N0YXRpYyB2b2lkIGxhbmNlX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgbGFuY2VfaW9yZWcJICpJTyA9IGxwLT5pb2Jhc2U7CisJCisJQVJFRyA9IENTUjA7CisJRFBSSU5USyggMSwgKCAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUwNHgsIHJlc2V0dGluZy5cbiIsCisJCQkgIGRldi0+bmFtZSwgRFJFRyApKTsKKwlEUkVHID0gQ1NSMF9TVE9QOworCS8qCisJICogQWx3YXlzIHNldCBCU1dQIGFmdGVyIGEgU1RPUCBhcyBTVE9QIHB1dHMgaXQgYmFjayBpbnRvCisJICogbGl0dGxlIGVuZGlhbiBtb2RlLgorCSAqLworCVJFR0EoIENTUjMgKSA9IENTUjNfQlNXUCB8IChscC0+Y2FyZHR5cGUgPT0gUEFNX0NBUkQgPyBDU1IzX0FDT04gOiAwKTsKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJewlpbnQgaTsKKwkJCURQUklOVEsoIDIsICggIlJpbmcgZGF0YTogZGlydHlfdHggJWQgY3VyX3R4ICVkJXMgY3VyX3J4ICVkXG4iLAorCQkJCQkJICBscC0+ZGlydHlfdHgsIGxwLT5jdXJfdHgsCisJCQkJCQkgIGxwLT50eF9mdWxsID8gIiAoZnVsbCkiIDogIiIsCisJCQkJCQkgIGxwLT5jdXJfcnggKSk7CisJCQlmb3IoIGkgPSAwIDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrICkKKwkJCQlEUFJJTlRLKCAyLCAoICJyeCAjJWQ6IGJhc2U9JTA0eCBibGVuPSUwNHggbWxlbj0lMDR4XG4iLAorCQkJCQkJCSAgaSwgTUVNLT5yeF9oZWFkW2ldLmJhc2UsCisJCQkJCQkJICAtTUVNLT5yeF9oZWFkW2ldLmJ1Zl9sZW5ndGgsCisJCQkJCQkJICBNRU0tPnJ4X2hlYWRbaV0ubXNnX2xlbmd0aCApKTsKKwkJCWZvciggaSA9IDAgOyBpIDwgVFhfUklOR19TSVpFOyBpKysgKQorCQkJCURQUklOVEsoIDIsICggInR4ICMlZDogYmFzZT0lMDR4IGxlbj0lMDR4IG1pc2M9JTA0eFxuIiwKKwkJCQkJCQkgIGksIE1FTS0+dHhfaGVhZFtpXS5iYXNlLAorCQkJCQkJCSAgLU1FTS0+dHhfaGVhZFtpXS5sZW5ndGgsCisJCQkJCQkJICBNRU0tPnR4X2hlYWRbaV0ubWlzYyApKTsKKwkJfQorI2VuZGlmIAkgCisJLyogWFhYIE1TY2g6IG1heWJlIHB1cmdlL3JlaW5pdCByaW5nIGhlcmUgKi8KKwkvKiBsYW5jZV9yZXN0YXJ0LCBlc3NlbnRpYWxseSAqLworCWxhbmNlX2luaXRfcmluZyhkZXYpOworCVJFR0EoIENTUjAgKSA9IENTUjBfSU5FQSB8IENTUjBfSU5JVCB8IENTUjBfU1RSVDsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworfQorCisvKiBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYICovCisKK3N0YXRpYyBpbnQgbGFuY2Vfc3RhcnRfeG1pdCggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCisKK3sJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopZGV2LT5wcml2OworCXN0cnVjdCBsYW5jZV9pb3JlZwkgKklPID0gbHAtPmlvYmFzZTsKKwlpbnQgZW50cnksIGxlbjsKKwlzdHJ1Y3QgbGFuY2VfdHhfaGVhZCAqaGVhZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRFBSSU5USyggMiwgKCAiJXM6IGxhbmNlX3N0YXJ0X3htaXQoKSBjYWxsZWQsIGNzcjAgJTQuNHguXG4iLAorCQkJCSAgZGV2LT5uYW1lLCBEUkVHICkpOworCisKKwkvKiBUaGUgb2xkIExBTkNFIGNoaXBzIGRvZXNuJ3QgYXV0b21hdGljYWxseSBwYWQgYnVmZmVycyB0byBtaW4uIHNpemUuICovCisJbGVuID0gc2tiLT5sZW47CisJaWYgKGxlbiA8IEVUSF9aTEVOKQorCQlsZW4gPSBFVEhfWkxFTjsKKwkvKiBQQU0tQ2FyZCBoYXMgYSBidWc6IENhbiBvbmx5IHNlbmQgcGFja2V0cyB3aXRoIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzISAqLworCWVsc2UgaWYgKGxwLT5jYXJkdHlwZSA9PSBQQU1fQ0FSRCAmJiAobGVuICYgMSkpCisJCSsrbGVuOworCQkKKwlpZiAobGVuID4gc2tiLT5sZW4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgbGVuKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJfQorCQkKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCisJLyogRmlsbCBpbiBhIFR4IHJpbmcgZW50cnkgKi8KKwlpZiAobGFuY2VfZGVidWcgPj0gMykgeworCQl1X2NoYXIgKnA7CisJCWludCBpOworCQlwcmludGsoICIlczogVFggcGt0IHR5cGUgMHglMDR4IGZyb20gIiwgZGV2LT5uYW1lLAorCQkJCSgodV9zaG9ydCAqKXNrYi0+ZGF0YSlbNl0pOworCQlmb3IoIHAgPSAmKCh1X2NoYXIgKilza2ItPmRhdGEpWzZdLCBpID0gMDsgaSA8IDY7IGkrKyApCisJCQlwcmludGsoIiUwMnglcyIsICpwKyssIGkgIT0gNSA/ICI6IiA6ICIiICk7CisJCXByaW50aygiIHRvICIpOworCQlmb3IoIHAgPSAodV9jaGFyICopc2tiLT5kYXRhLCBpID0gMDsgaSA8IDY7IGkrKyApCisJCQlwcmludGsoIiUwMnglcyIsICpwKyssIGkgIT0gNSA/ICI6IiA6ICIiICk7CisJCXByaW50aygiIGRhdGEgYXQgMHglMDh4IGxlbiAlZFxuIiwgKGludClza2ItPmRhdGEsCisJCQkgICAoaW50KXNrYi0+bGVuICk7CisJfQorCisJLyogV2UncmUgbm90IHByZXBhcmVkIGZvciB0aGUgaW50IHVudGlsIHRoZSBsYXN0IGZsYWdzIGFyZSBzZXQvcmVzZXQuIEFuZAorCSAqIHRoZSBpbnQgbWF5IGhhcHBlbiBhbHJlYWR5IGFmdGVyIHNldHRpbmcgdGhlIE9XTl9DSElQLi4uICovCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZscC0+ZGV2bG9jaywgZmxhZ3MpOworCisJLyogTWFzayB0byByaW5nIGJ1ZmZlciBib3VuZGFyeS4gKi8KKwllbnRyeSA9IGxwLT5jdXJfdHggJiBUWF9SSU5HX01PRF9NQVNLOworCWhlYWQgID0gJihNRU0tPnR4X2hlYWRbZW50cnldKTsKKworCS8qIENhdXRpb246IHRoZSB3cml0ZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgc2V0IHRoZSAib3duZXJzaGlwIiBiaXRzCisJICogbGFzdC4KKwkgKi8KKworCisJaGVhZC0+bGVuZ3RoID0gLWxlbjsKKwloZWFkLT5taXNjID0gMDsKKwlscC0+bWVtY3B5X2YoIFBLVEJVRl9BRERSKGhlYWQpLCAodm9pZCAqKXNrYi0+ZGF0YSwgc2tiLT5sZW4gKTsKKwloZWFkLT5mbGFnID0gVE1EMV9PV05fQ0hJUCB8IFRNRDFfRU5QIHwgVE1EMV9TVFA7CisJbHAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCWRldl9rZnJlZV9za2IoIHNrYiApOworCWxwLT5jdXJfdHgrKzsKKwl3aGlsZSggbHAtPmN1cl90eCA+PSBUWF9SSU5HX1NJWkUgJiYgbHAtPmRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSApIHsKKwkJbHAtPmN1cl90eCAtPSBUWF9SSU5HX1NJWkU7CisJCWxwLT5kaXJ0eV90eCAtPSBUWF9SSU5HX1NJWkU7CisJfQorCisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgc2VuZCBwb2xsLiAqLworCURSRUcgPSBDU1IwX0lORUEgfCBDU1IwX1RETUQ7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlpZiAoKE1FTS0+dHhfaGVhZFsoZW50cnkrMSkgJiBUWF9SSU5HX01PRF9NQVNLXS5mbGFnICYgVE1EMV9PV04pID09CisJCVRNRDFfT1dOX0hPU1QpCisJCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCWVsc2UKKwkJbHAtPnR4X2Z1bGwgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZscC0+ZGV2bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBMQU5DRSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KKworc3RhdGljIGlycXJldHVybl90IGxhbmNlX2ludGVycnVwdCggaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHA7CisJc3RydWN0IGxhbmNlX2lvcmVnCSAqSU87CisJaW50IGNzcjAsIGJvZ3VzY250ID0gMTA7CisJaW50IGhhbmRsZWQgPSAwOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCURQUklOVEsoIDEsICggImxhbmNlX2ludGVycnVwdCgpOiBpbnRlcnJ1cHQgZm9yIHVua25vd24gZGV2aWNlLlxuIiApKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopZGV2LT5wcml2OworCUlPID0gbHAtPmlvYmFzZTsKKwlzcGluX2xvY2sgKCZscC0+ZGV2bG9jayk7CisKKwlBUkVHID0gQ1NSMDsKKworCXdoaWxlKCAoKGNzcjAgPSBEUkVHKSAmIChDU1IwX0VSUiB8IENTUjBfVElOVCB8IENTUjBfUklOVCkpICYmCisJCSAgIC0tYm9ndXNjbnQgPj0gMCkgeworCQloYW5kbGVkID0gMTsKKwkJLyogQWNrbm93bGVkZ2UgYWxsIG9mIHRoZSBjdXJyZW50IGludGVycnVwdCBzb3VyY2VzIEFTQVAuICovCisJCURSRUcgPSBjc3IwICYgfihDU1IwX0lOSVQgfCBDU1IwX1NUUlQgfCBDU1IwX1NUT1AgfAorCQkJCQkJCQkJQ1NSMF9URE1EIHwgQ1NSMF9JTkVBKTsKKworCQlEUFJJTlRLKCAyLCAoICIlczogaW50ZXJydXB0ICBjc3IwPSUwNHggbmV3IGNzcj0lMDR4LlxuIiwKKwkJCQkJICBkZXYtPm5hbWUsIGNzcjAsIERSRUcgKSk7CisKKwkJaWYgKGNzcjAgJiBDU1IwX1JJTlQpCQkJLyogUnggaW50ZXJydXB0ICovCisJCQlsYW5jZV9yeCggZGV2ICk7CisKKwkJaWYgKGNzcjAgJiBDU1IwX1RJTlQpIHsJCQkvKiBUeC1kb25lIGludGVycnVwdCAqLworCQkJaW50IGRpcnR5X3R4ID0gbHAtPmRpcnR5X3R4OworCisJCQl3aGlsZSggZGlydHlfdHggPCBscC0+Y3VyX3R4KSB7CisJCQkJaW50IGVudHJ5ID0gZGlydHlfdHggJiBUWF9SSU5HX01PRF9NQVNLOworCQkJCWludCBzdGF0dXMgPSBNRU0tPnR4X2hlYWRbZW50cnldLmZsYWc7CisKKwkJCQlpZiAoc3RhdHVzICYgVE1EMV9PV05fQ0hJUCkKKwkJCQkJYnJlYWs7CQkJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gVHhlZCAqLworCisJCQkJTUVNLT50eF9oZWFkW2VudHJ5XS5mbGFnID0gMDsKKworCQkJCWlmIChzdGF0dXMgJiBUTUQxX0VSUikgeworCQkJCQkvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KKwkJCQkJaW50IGVycl9zdGF0dXMgPSBNRU0tPnR4X2hlYWRbZW50cnldLm1pc2M7CisJCQkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQkJaWYgKGVycl9zdGF0dXMgJiBUTUQzX1JUUlkpIGxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCQlpZiAoZXJyX3N0YXR1cyAmIFRNRDNfTENBUikgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJCWlmIChlcnJfc3RhdHVzICYgVE1EM19MQ09MKSBscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJCQlpZiAoZXJyX3N0YXR1cyAmIFRNRDNfVUZMTykgeworCQkJCQkJLyogQWNrayEgIE9uIEZJRk8gZXJyb3JzIHRoZSBUeCB1bml0IGlzIHR1cm5lZCBvZmYhICovCisJCQkJCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQkJCS8qIFJlbW92ZSB0aGlzIHZlcmJvc2l0eSBsYXRlciEgKi8KKwkJCQkJCURQUklOVEsoIDEsICggIiVzOiBUeCBGSUZPIGVycm9yISBTdGF0dXMgJTA0eFxuIiwKKwkJCQkJCQkJCSAgZGV2LT5uYW1lLCBjc3IwICkpOworCQkJCQkJLyogUmVzdGFydCB0aGUgY2hpcC4gKi8KKwkJCQkJCURSRUcgPSBDU1IwX1NUUlQ7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoc3RhdHVzICYgKFRNRDFfTU9SRSB8IFRNRDFfT05FIHwgVE1EMV9ERUYpKQorCQkJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCQl9CisKKwkJCQkvKiBYWFggTVNjaDogZnJlZSBza2I/PyAqLworCQkJCWRpcnR5X3R4Kys7CisJCQl9CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJaWYgKGxwLT5jdXJfdHggLSBkaXJ0eV90eCA+PSBUWF9SSU5HX1NJWkUpIHsKKwkJCQlEUFJJTlRLKCAwLCAoICJvdXQtb2Ytc3luYyBkaXJ0eSBwb2ludGVyLCIKKwkJCQkJCQkgICIgJWQgdnMuICVkLCBmdWxsPSVsZC5cbiIsCisJCQkJCQkJICBkaXJ0eV90eCwgbHAtPmN1cl90eCwgbHAtPnR4X2Z1bGwgKSk7CisJCQkJZGlydHlfdHggKz0gVFhfUklOR19TSVpFOworCQkJfQorI2VuZGlmCisKKwkJCWlmIChscC0+dHhfZnVsbCAmJiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQkJCSYmIGRpcnR5X3R4ID4gbHAtPmN1cl90eCAtIFRYX1JJTkdfU0laRSArIDIpIHsKKwkJCQkvKiBUaGUgcmluZyBpcyBubyBsb25nZXIgZnVsbCwgY2xlYXIgdGJ1c3kuICovCisJCQkJbHAtPnR4X2Z1bGwgPSAwOworCQkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCQl9CisKKwkJCWxwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCQl9CisKKwkJLyogTG9nIG1pc2MgZXJyb3JzLiAqLworCQlpZiAoY3NyMCAmIENTUjBfQkFCTCkgbHAtPnN0YXRzLnR4X2Vycm9ycysrOyAvKiBUeCBiYWJibGUuICovCisJCWlmIChjc3IwICYgQ1NSMF9NSVNTKSBscC0+c3RhdHMucnhfZXJyb3JzKys7IC8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLworCQlpZiAoY3NyMCAmIENTUjBfTUVSUikgeworCQkJRFBSSU5USyggMSwgKCAiJXM6IEJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gZmFpbHVyZSAoPyE/KSwgIgorCQkJCQkJICAic3RhdHVzICUwNHguXG4iLCBkZXYtPm5hbWUsIGNzcjAgKSk7CisJCQkvKiBSZXN0YXJ0IHRoZSBjaGlwLiAqLworCQkJRFJFRyA9IENTUjBfU1RSVDsKKwkJfQorCX0KKworICAgIC8qIENsZWFyIGFueSBvdGhlciBpbnRlcnJ1cHQsIGFuZCBzZXQgaW50ZXJydXB0IGVuYWJsZS4gKi8KKwlEUkVHID0gQ1NSMF9CQUJMIHwgQ1NSMF9DRVJSIHwgQ1NSMF9NSVNTIHwgQ1NSMF9NRVJSIHwKKwkJICAgQ1NSMF9JRE9OIHwgQ1NSMF9JTkVBOworCisJRFBSSU5USyggMiwgKCAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBjc3IwPSUjMDR4LlxuIiwKKwkJCQkgIGRldi0+bmFtZSwgRFJFRyApKTsKKworCXNwaW5fdW5sb2NrICgmbHAtPmRldmxvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKK3N0YXRpYyBpbnQgbGFuY2VfcngoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQorCit7CXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlpbnQgZW50cnkgPSBscC0+Y3VyX3J4ICYgUlhfUklOR19NT0RfTUFTSzsKKwlpbnQgaTsKKworCURQUklOVEsoIDIsICggIiVzOiByeCBpbnQsIGZsYWc9JTA0eFxuIiwgZGV2LT5uYW1lLAorCQkJCSAgTUVNLT5yeF9oZWFkW2VudHJ5XS5mbGFnICkpOworCisJLyogSWYgd2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKwl3aGlsZSggKE1FTS0+cnhfaGVhZFtlbnRyeV0uZmxhZyAmIFJNRDFfT1dOKSA9PSBSTUQxX09XTl9IT1NUICkgeworCQlzdHJ1Y3QgbGFuY2VfcnhfaGVhZCAqaGVhZCA9ICYoTUVNLT5yeF9oZWFkW2VudHJ5XSk7CisJCWludCBzdGF0dXMgPSBoZWFkLT5mbGFnOworCisJCWlmIChzdGF0dXMgIT0gKFJNRDFfRU5QfFJNRDFfU1RQKSkgewkJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLworCQkJLyogVGhlcmUgaXMgYSB0cmlja3kgZXJyb3Igbm90ZWQgYnkgSm9obiBNdXJwaHksCisJCQkgICA8bXVyZkBwZXJmdGVjaC5jb20+IHRvIFJ1c3MgTmVsc29uOiBFdmVuIHdpdGggZnVsbC1zaXplZAorCQkJICAgYnVmZmVycyBpdCdzIHBvc3NpYmxlIGZvciBhIGphYmJlciBwYWNrZXQgdG8gdXNlIHR3bworCQkJICAgYnVmZmVycywgd2l0aCBvbmx5IHRoZSBsYXN0IGNvcnJlY3RseSBub3RpbmcgdGhlIGVycm9yLiAqLworCQkJaWYgKHN0YXR1cyAmIFJNRDFfRU5QKQkvKiBPbmx5IGNvdW50IGEgZ2VuZXJhbCBlcnJvciBhdCB0aGUgKi8KKwkJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7IC8qIGVuZCBvZiBhIHBhY2tldC4qLworCQkJaWYgKHN0YXR1cyAmIFJNRDFfRlJBTSkgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFJNRDFfT0ZMTykgbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUk1EMV9DUkMpIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUk1EMV9CVUZGKSBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCWhlYWQtPmZsYWcgJj0gKFJNRDFfRU5QfFJNRDFfU1RQKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLCBjb21wYXRpYmxlIHdpdGggbmV0LTMuICovCisJCQlzaG9ydCBwa3RfbGVuID0gaGVhZC0+bXNnX2xlbmd0aCAmIDB4ZmZmOworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJaWYgKHBrdF9sZW4gPCA2MCkgeworCQkJCXByaW50ayggIiVzOiBSdW50IHBhY2tldCFcbiIsIGRldi0+bmFtZSApOworCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXNrYiA9IGRldl9hbGxvY19za2IoIHBrdF9sZW4rMiApOworCQkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCQlEUFJJTlRLKCAxLCAoICIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkJCQkJCQkgIGRldi0+bmFtZSApKTsKKwkJCQkJZm9yKCBpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrICkKKwkJCQkJCWlmIChNRU0tPnJ4X2hlYWRbKGVudHJ5K2kpICYgUlhfUklOR19NT0RfTUFTS10uZmxhZyAmCisJCQkJCQkJUk1EMV9PV05fQ0hJUCkKKwkJCQkJCQlicmVhazsKKworCQkJCQlpZiAoaSA+IFJYX1JJTkdfU0laRSAtIDIpIHsKKwkJCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJCQloZWFkLT5mbGFnIHw9IFJNRDFfT1dOX0NISVA7CisJCQkJCQlscC0+Y3VyX3J4Kys7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKGxhbmNlX2RlYnVnID49IDMpIHsKKwkJCQkJdV9jaGFyICpkYXRhID0gUEtUQlVGX0FERFIoaGVhZCksICpwOworCQkJCQlwcmludGsoICIlczogUlggcGt0IHR5cGUgMHglMDR4IGZyb20gIiwgZGV2LT5uYW1lLAorCQkJCQkJCSgodV9zaG9ydCAqKWRhdGEpWzZdKTsKKwkJCQkJZm9yKCBwID0gJmRhdGFbNl0sIGkgPSAwOyBpIDwgNjsgaSsrICkKKwkJCQkJCXByaW50aygiJTAyeCVzIiwgKnArKywgaSAhPSA1ID8gIjoiIDogIiIgKTsKKwkJCQkJcHJpbnRrKCIgdG8gIik7CisJCQkJCWZvciggcCA9IGRhdGEsIGkgPSAwOyBpIDwgNjsgaSsrICkKKwkJCQkJCXByaW50aygiJTAyeCVzIiwgKnArKywgaSAhPSA1ID8gIjoiIDogIiIgKTsKKwkJCQkJcHJpbnRrKCIgZGF0YSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggIgorCQkJCQkJICAgImxlbiAlZFxuIiwKKwkJCQkJCSAgIGRhdGFbMTVdLCBkYXRhWzE2XSwgZGF0YVsxN10sIGRhdGFbMThdLAorCQkJCQkJICAgZGF0YVsxOV0sIGRhdGFbMjBdLCBkYXRhWzIxXSwgZGF0YVsyMl0sCisJCQkJCQkgICBwa3RfbGVuICk7CisJCQkJfQorCisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoIHNrYiwgMiApOwkvKiAxNiBieXRlIGFsaWduICovCisJCQkJc2tiX3B1dCggc2tiLCBwa3RfbGVuICk7CS8qIE1ha2Ugcm9vbSAqLworCQkJCWxwLT5tZW1jcHlfZiggc2tiLT5kYXRhLCBQS1RCVUZfQUREUihoZWFkKSwgcGt0X2xlbiApOworCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyggc2tiLCBkZXYgKTsKKwkJCQluZXRpZl9yeCggc2tiICk7CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQkJfQorCQl9CisKKwkJaGVhZC0+ZmxhZyB8PSBSTUQxX09XTl9DSElQOworCQllbnRyeSA9ICgrK2xwLT5jdXJfcngpICYgUlhfUklOR19NT0RfTUFTSzsKKwl9CisJbHAtPmN1cl9yeCAmPSBSWF9SSU5HX01PRF9NQVNLOworCisJLyogRnJvbSBsYW5jZS5jIChEb25hbGQgQmVja2VyKTogKi8KKwkvKiBXZSBzaG91bGQgY2hlY2sgdGhhdCBhdCBsZWFzdCB0d28gcmluZyBlbnRyaWVzIGFyZSBmcmVlLgkgSWYgbm90LAorCSAgIHdlIHNob3VsZCBmcmVlIG9uZSBhbmQgbWFyayBzdGF0cy0+cnhfZHJvcHBlZCsrLiAqLworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBsYW5jZV9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCisKK3sJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopZGV2LT5wcml2OworCXN0cnVjdCBsYW5jZV9pb3JlZwkgKklPID0gbHAtPmlvYmFzZTsKKworCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKwlBUkVHID0gQ1NSMDsKKworCURQUklOVEsoIDIsICggIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlMi4yeC5cbiIsCisJCQkJICBkZXYtPm5hbWUsIERSRUcgKSk7CisKKwkvKiBXZSBzdG9wIHRoZSBMQU5DRSBoZXJlIC0tIGl0IG9jY2FzaW9uYWxseSBwb2xscworCSAgIG1lbW9yeSBpZiB3ZSBkb24ndC4gKi8KKwlEUkVHID0gQ1NSMF9TVE9QOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsYW5jZV9nZXRfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQorCit7CXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICAgbnVtX2FkZHJzID09IC0xCQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgICBudW1fYWRkcnMgPT0gMAkJTm9ybWFsIG1vZGUsIGNsZWFyIG11bHRpY2FzdCBsaXN0CisgICBudW1fYWRkcnMgPiAwCQlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsIGFuZCBkbworCQkJCQkJYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCisKK3sJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopZGV2LT5wcml2OworCXN0cnVjdCBsYW5jZV9pb3JlZwkgKklPID0gbHAtPmlvYmFzZTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCS8qIE9ubHkgcG9zc2libGUgaWYgYm9hcmQgaXMgYWxyZWFkeSBzdGFydGVkICovCisJCXJldHVybjsKKworCS8qIFdlIHRha2UgdGhlIHNpbXBsZSB3YXkgb3V0IGFuZCBhbHdheXMgZW5hYmxlIHByb21pc2N1b3VzIG1vZGUuICovCisJRFJFRyA9IENTUjBfU1RPUDsgLyogVGVtcG9yYXJpbHkgc3RvcCB0aGUgbGFuY2UuICovCisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIExvZyBhbnkgbmV0IHRhcHMuICovCisJCURQUklOVEsoIDEsICggIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUgKSk7CisJCVJFR0EoIENTUjE1ICkgPSAweDgwMDA7IC8qIFNldCBwcm9taXNjdW91cyBtb2RlICovCisJfSBlbHNlIHsKKwkJc2hvcnQgbXVsdGljYXN0X3RhYmxlWzRdOworCQlpbnQgbnVtX2FkZHJzID0gZGV2LT5tY19jb3VudDsKKwkJaW50IGk7CisJCS8qIFdlIGRvbid0IHVzZSB0aGUgbXVsdGljYXN0IHRhYmxlLCBidXQgcmVseSBvbiB1cHBlci1sYXllcgorCQkgKiBmaWx0ZXJpbmcuICovCisJCW1lbXNldCggbXVsdGljYXN0X3RhYmxlLCAobnVtX2FkZHJzID09IDApID8gMCA6IC0xLAorCQkJCXNpemVvZihtdWx0aWNhc3RfdGFibGUpICk7CisJCWZvciggaSA9IDA7IGkgPCA0OyBpKysgKQorCQkJUkVHQSggQ1NSOCtpICkgPSBtdWx0aWNhc3RfdGFibGVbaV07CisJCVJFR0EoIENTUjE1ICkgPSAwOyAvKiBVbnNldCBwcm9taXNjdW91cyBtb2RlICovCisJfQorCisJLyoKKwkgKiBBbHdheXMgc2V0IEJTV1AgYWZ0ZXIgYSBTVE9QIGFzIFNUT1AgcHV0cyBpdCBiYWNrIGludG8KKwkgKiBsaXR0bGUgZW5kaWFuIG1vZGUuCisJICovCisJUkVHQSggQ1NSMyApID0gQ1NSM19CU1dQIHwgKGxwLT5jYXJkdHlwZSA9PSBQQU1fQ0FSRCA/IENTUjNfQUNPTiA6IDApOworCisJLyogUmVzdW1lIG5vcm1hbCBvcGVyYXRpb24gYW5kIHJlc2V0IEFSRUcgdG8gQ1NSMCAqLworCVJFR0EoIENTUjAgKSA9IENTUjBfSURPTiB8IENTUjBfSU5FQSB8IENTUjBfU1RSVDsKK30KKworCisvKiBUaGlzIGlzIG5lZWRlZCBmb3Igb2xkIFJpZWJsQ2FyZHMgYW5kIHBvc3NpYmxlIGZvciBuZXcgUmllYmxDYXJkcyAqLworCitzdGF0aWMgaW50IGxhbmNlX3NldF9tYWNfYWRkcmVzcyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkciApCisKK3sJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopZGV2LT5wcml2OworCXN0cnVjdCBzb2NrYWRkciAqc2FkZHIgPSBhZGRyOworCWludCBpOworCisJaWYgKGxwLT5jYXJkdHlwZSAhPSBPTERfUklFQkwgJiYgbHAtPmNhcmR0eXBlICE9IE5FV19SSUVCTCkKKwkJcmV0dXJuKCAtRU9QTk9UU1VQUCApOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkvKiBPbmx5IHBvc3NpYmxlIHdoaWxlIGNhcmQgaXNuJ3Qgc3RhcnRlZCAqLworCQlEUFJJTlRLKCAxLCAoICIlczogaHdhZGRyIGNhbiBiZSBzZXQgb25seSB3aGlsZSBjYXJkIGlzbid0IG9wZW4uXG4iLAorCQkJCQkgIGRldi0+bmFtZSApKTsKKwkJcmV0dXJuKCAtRUlPICk7CisJfQorCisJbWVtY3B5KCBkZXYtPmRldl9hZGRyLCBzYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbiApOworCWZvciggaSA9IDA7IGkgPCA2OyBpKysgKQorCQlNRU0tPmluaXQuaHdhZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXjFdOyAvKiA8LSAxNiBiaXQgc3dhcCEgKi8KKwlscC0+bWVtY3B5X2YoIFJJRUJMX0hXQUREUl9BRERSLCBkZXYtPmRldl9hZGRyLCA2ICk7CisJLyogc2V0IGFsc28gdGhlIG1hZ2ljIGZvciBmdXR1cmUgc2Vzc2lvbnMgKi8KKwkqUklFQkxfTUFHSUNfQUREUiA9IFJJRUJMX01BR0lDOworCisJcmV0dXJuKCAwICk7Cit9CisKKwwKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYXRhcmlsYW5jZV9kZXY7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWF0YXJpbGFuY2VfZGV2ID0gYXRhcmlsYW5jZV9wcm9iZSgtMSk7CisJaWYgKElTX0VSUihhdGFyaWxhbmNlX2RldikpCisJCXJldHVybiBQVFJfRVJSKGF0YXJpbGFuY2VfZGV2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KGF0YXJpbGFuY2VfZGV2KTsKKwlmcmVlX2lycShhdGFyaWxhbmNlX2Rldi0+aXJxLCBhdGFyaWxhbmNlX2Rldik7CisJZnJlZV9uZXRkZXYoYXRhcmlsYW5jZV9kZXYpOworfQorCisjZW5kaWYgLyogTU9EVUxFICovCisMCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDQKKyAqICB0YWItd2lkdGg6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRwLmMgYi9kcml2ZXJzL25ldC9hdHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmE2NzRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXRwLmMKQEAgLTAsMCArMSw5NTIgQEAKKy8qIGF0cC5jOiBBdHRhY2hlZCAocG9ja2V0KSBldGhlcm5ldCBhZGFwdGVyIGRyaXZlciBmb3IgbGludXguICovCisvKgorCVRoaXMgaXMgYSBkcml2ZXIgZm9yIGNvbW1vbmx5IE9FTSBwb2NrZXQgKHBhcmFsbGVsIHBvcnQpCisJZXRoZXJuZXQgYWRhcHRlcnMgYmFzZWQgb24gdGhlIFJlYWx0ZWsgUlRMODAwMiBhbmQgUlRMODAxMiBjaGlwcy4KKworCVdyaXR0ZW4gMTk5My0yMDAwIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisJdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKwlEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisJcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorCWEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisKKwlDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlIERpcmVjdG9yLAorCU5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIENvcHlyaWdodCAxOTk0LTIwMDAgcmV0YWluZWQgYnkgdGhlIG9yaWdpbmFsCisJYXV0aG9yLCBEb25hbGQgQmVja2VyLiBUaGUgdGltZXItYmFzZWQgcmVzZXQgY29kZSB3YXMgc3VwcGxpZWQgaW4gMTk5NQorCWJ5IEJpbGwgQ2FybHNvbiwgd3djQHN1cGVyLm9yZy4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCVN1cHBvcnQgaW5mb3JtYXRpb24gYW5kIHVwZGF0ZXMgYXZhaWxhYmxlIGF0CisJaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay9hdHAuaHRtbAorCisKKwlNb2R1bGFyIHN1cHBvcnQvc29mdG5ldCBhZGRlZCBieSBBbGFuIENveC4KKwlfYml0IGFidXNlIGZpeGVkIHVwIGJ5IEFsYW4gQ294CisKKyovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25BW10gPQorImF0cC5jOnYxLjA5PWFjIDIwMDIvMTAvMDEgRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT5cbiI7CitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uQltdID0KKyIgIGh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvYXRwLmh0bWxcbiI7CisKKy8qIFRoZSB1c2VyLWNvbmZpZ3VyYWJsZSB2YWx1ZXMuCisgICBUaGVzZSBtYXkgYmUgbW9kaWZpZWQgd2hlbiBhIGRyaXZlciBtb2R1bGUgaXMgbG9hZGVkLiovCisKK3N0YXRpYyBpbnQgZGVidWcgPSAxOyAJCQkvKiAxIG5vcm1hbCBtZXNzYWdlcywgMCBxdWlldCAuLiA3IHZlcmJvc2UuICovCisjZGVmaW5lIG5ldF9kZWJ1ZyBkZWJ1ZworCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0LiAqLworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAxNTsKKworI2RlZmluZSBOVU1fVU5JVFMgMgorLyogVGhlIHN0YW5kYXJkIHNldCBvZiBJU0EgbW9kdWxlIHBhcmFtZXRlcnMuICovCitzdGF0aWMgaW50IGlvW05VTV9VTklUU107CitzdGF0aWMgaW50IGlycVtOVU1fVU5JVFNdOworc3RhdGljIGludCB4Y3ZyW05VTV9VTklUU107IAkJCS8qIFRoZSBkYXRhIHRyYW5zZmVyIG1vZGUuICovCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZS4gKi8KKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoNDAwKkhaLzEwMDApCisKKy8qCisJVGhpcyBmaWxlIGlzIGEgZGV2aWNlIGRyaXZlciBmb3IgdGhlIFJlYWxUZWsgKGFrYSBBVC1MYW4tVGVjKSBwb2NrZXQKKwlldGhlcm5ldCBhZGFwdGVyLiAgVGhpcyBpcyBhIGNvbW1vbiBsb3ctY29zdCBPRU0gcG9ja2V0IGV0aGVybmV0CisJYWRhcHRlciwgc29sZCB1bmRlciBtYW55IG5hbWVzLgorCisgIFNvdXJjZXM6CisJVGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gZnJvbSB0aGUgcGFja2V0IGRyaXZlciBhc3NlbWJseSBjb2RlIHByb3ZpZGVkIGJ5CisJVmluY2VudCBCb25vIG9mIEFULUxhbi1UZWMuCSBFdmVyIHRyeSB0byBmaWd1cmUgb3V0IGhvdyBhIGNvbXBsaWNhdGVkCisJZGV2aWNlIHdvcmtzIGp1c3QgZnJvbSB0aGUgYXNzZW1ibHkgY29kZT8gIEl0IGFpbid0IHByZXR0eS4gIFRoZSBmb2xsb3dpbmcKKwlkZXNjcmlwdGlvbiBpcyB3cml0dGVuIGJhc2VkIG9uIGd1ZXNzZXMgYW5kIHdyaXRpbmcgbG90cyBvZiBzcGVjaWFsLXB1cnBvc2UKKwljb2RlIHRvIHRlc3QgbXkgdGhlb3JpemVkIG9wZXJhdGlvbi4KKworCUluIDE5OTcgUmVhbHRlayBtYWRlIGF2YWlsYWJsZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHNlY29uZCBnZW5lcmF0aW9uCisJUlRMODAxMiBjaGlwLCB3aGljaCBoYXMgbGVhZCB0byBzZXZlcmFsIGRyaXZlciBpbXByb3ZlbWVudHMuCisJICBodHRwOi8vd3d3LnJlYWx0ZWsuY29tLnR3L2NuL2NuLmh0bWwKKworCQkJCQlUaGVvcnkgb2YgT3BlcmF0aW9uCisKKwlUaGUgUlRMODAwMiBhZGFwdGVyIHNlZW1zIHRvIGJlIGJ1aWx0IGFyb3VuZCBhIGN1c3RvbSBzcGluIG9mIHRoZSBTRUVRCisJY29udHJvbGxlciBjb3JlLiAgSXQgcHJvYmFibHkgaGFzIGEgMTZLIG9yIDY0SyBpbnRlcm5hbCBwYWNrZXQgYnVmZmVyLCBvZgorCXdoaWNoIHRoZSBmaXJzdCA0SyBpcyBkZXZvdGVkIHRvIHRyYW5zbWl0IGFuZCB0aGUgcmVzdCB0byByZWNlaXZlLgorCVRoZSBjb250cm9sbGVyIG1haW50YWlucyB0aGUgcXVldWUgb2YgcmVjZWl2ZWQgcGFja2V0IGFuZCB0aGUgcGFja2V0IGJ1ZmZlcgorCWFjY2VzcyBwb2ludGVyIGludGVybmFsbHksIHdpdGggb25seSAncmVzZXQgdG8gYmVnaW5uaW5nJyBhbmQgJ3NraXAgdG8gbmV4dAorCXBhY2tldCcgY29tbWFuZHMgdmlzaWJsZS4gIFRoZSB0cmFuc21pdCBwYWNrZXQgcXVldWUgaG9sZHMgdHdvIChvciBtb3JlPykKKwlwYWNrZXRzOiBib3RoICdyZXRyYW5zbWl0IHRoaXMgcGFja2V0JyAoZHVlIHRvIGNvbGxpc2lvbikgYW5kICd0cmFuc21pdCBuZXh0CisJcGFja2V0JyBjb21tYW5kcyBtdXN0IGJlIHN0YXJ0ZWQgYnkgaGFuZC4KKworCVRoZSBzdGF0aW9uIGFkZHJlc3MgaXMgc3RvcmVkIGluIGEgc3RhbmRhcmQgYml0LXNlcmlhbCBFRVBST00gd2hpY2ggbXVzdCBiZQorCXJlYWQgKHVnaGgpIGJ5IHRoZSBkZXZpY2UgZHJpdmVyLiAgKFByb3Zpc2lvbnMgaGF2ZSBiZWVuIG1hZGUgZm9yCisJc3Vic3RpdHV0aW5nIGEgNzRTMjg4IFBST00sIGJ1dCBJIGhhdmVuJ3QgZ290dGVuIHJlcG9ydHMgb2YgYW55IG1vZGVscworCXVzaW5nIGl0LikgIFVubGlrZSBidWlsdC1pbiBkZXZpY2VzLCBhIHBvY2tldCBhZGFwdGVyIGNhbiB0ZW1wb3JhcmlseSBsb3NlCisJcG93ZXIgd2l0aG91dCBpbmRpY2F0aW9uIHRvIHRoZSBkZXZpY2UgZHJpdmVyLiAgVGhlIG1ham9yIGVmZmVjdCBpcyB0aGF0CisJdGhlIHN0YXRpb24gYWRkcmVzcywgcmVjZWl2ZSBmaWx0ZXIgKHByb21pc2N1b3VzLCBldGMuKSBhbmQgdHJhbnNjZWl2ZXIKKwltdXN0IGJlIHJlc2V0LgorCisJVGhlIGNvbnRyb2xsZXIgaXRzZWxmIGhhcyAxNiByZWdpc3RlcnMsIHNvbWUgb2Ygd2hpY2ggdXNlIG9ubHkgdGhlIGxvd2VyCisJYml0cy4gIFRoZSByZWdpc3RlcnMgYXJlIHJlYWQgYW5kIHdyaXR0ZW4gNCBiaXRzIGF0IGEgdGltZS4gIFRoZSBmb3VyIGJpdAorCXJlZ2lzdGVyIGFkZHJlc3MgaXMgcHJlc2VudGVkIG9uIHRoZSBkYXRhIGxpbmVzIGFsb25nIHdpdGggYSBmZXcgYWRkaXRpb25hbAorCXRpbWluZyBhbmQgY29udHJvbCBiaXRzLiAgVGhlIGRhdGEgaXMgdGhlbiByZWFkIGZyb20gc3RhdHVzIHBvcnQgb3Igd3JpdHRlbgorCXRvIHRoZSBkYXRhIHBvcnQuCisKKwlDb3JyZWN0aW9uOiB0aGUgY29udHJvbGxlciBoYXMgdHdvIGJhbmtzIG9mIDE2IHJlZ2lzdGVycy4gIFRoZSBzZWNvbmQKKwliYW5rIGNvbnRhaW5zIG9ubHkgdGhlIG11bHRpY2FzdCBmaWx0ZXIgdGFibGUgKG5vdyB1c2VkKSBhbmQgdGhlIEVFUFJPTQorCWFjY2VzcyByZWdpc3RlcnMuCisKKwlTaW5jZSB0aGUgYnVsayBkYXRhIHRyYW5zZmVyIG9mIHRoZSBhY3R1YWwgcGFja2V0cyB0aHJvdWdoIHRoZSBzbG93CisJcGFyYWxsZWwgcG9ydCBkb21pbmF0ZXMgdGhlIGRyaXZlcidzIHJ1bm5pbmcgdGltZSwgZm91ciBkaXN0aW5jdCBkYXRhCisJKG5vbi1yZWdpc3RlcikgdHJhbnNmZXIgbW9kZXMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBhZGFwdGVyLCB0d28gaW4gZWFjaAorCWRpcmVjdGlvbi4gIEluIHRoZSBmaXJzdCBtb2RlIHRpbWluZyBmb3IgdGhlIG5pYmJsZSB0cmFuc2ZlcnMgaXMKKwlwcm92aWRlZCB0aHJvdWdoIHRoZSBkYXRhIHBvcnQuICBJbiB0aGUgc2Vjb25kIG1vZGUgdGhlIHNhbWUgdGltaW5nIGlzCisJcHJvdmlkZWQgdGhyb3VnaCB0aGUgY29udHJvbCBwb3J0LiAgSW4gZWl0aGVyIGNhc2UgdGhlIGRhdGEgaXMgcmVhZCBmcm9tCisJdGhlIHN0YXR1cyBwb3J0IGFuZCB3cml0dGVuIHRvIHRoZSBkYXRhIHBvcnQsIGp1c3QgYXMgaXQgaXMgYWNjZXNzaW5nCisJcmVnaXN0ZXJzLgorCisJSW4gYWRkaXRpb24gdG8gdGhlIGJhc2ljIGRhdGEgdHJhbnNmZXIgbWV0aG9kcywgc2V2ZXJhbCBtb3JlIGFyZSBtb2RlcyBhcmUKKwljcmVhdGVkIGJ5IGFkZGluZyBzb21lIGRlbGF5IGJ5IGRvaW5nIG11bHRpcGxlIHJlYWRzIG9mIHRoZSBkYXRhIHRvIGFsbG93CisJaXQgdG8gc3RhYmlsaXplLiAgVGhpcyBkZWxheSBzZWVtcyB0byBiZSBuZWVkZWQgb24gbW9zdCBtYWNoaW5lcy4KKworCVRoZSBkYXRhIHRyYW5zZmVyIG1vZGUgaXMgc3RvcmVkIGluIHRoZSAnZGV2LT5pZl9wb3J0JyBmaWVsZC4gIEl0cyBkZWZhdWx0CisJdmFsdWUgaXMgJzQnLiAgSXQgbWF5IGJlIG92ZXJyaWRkZW4gYXQgYm9vdC10aW1lIHVzaW5nIHRoZSB0aGlyZCBwYXJhbWV0ZXIKKwl0byB0aGUgImV0aGVyPS4uLiIgaW5pdGlhbGl6YXRpb24uCisKKwlUaGUgaGVhZGVyIGZpbGUgPGF0cC5oPiBwcm92aWRlcyBpbmxpbmUgZnVuY3Rpb25zIHRoYXQgZW5jYXBzdWxhdGUgdGhlCisJcmVnaXN0ZXIgYW5kIGRhdGEgYWNjZXNzIG1ldGhvZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIGhhbmQtdHVuZWQgdG8KKwlnZW5lcmF0ZSByZWFzb25hYmxlIG9iamVjdCBjb2RlLiAgVGhpcyBoZWFkZXIgZmlsZSBhbHNvIGRvY3VtZW50cyBteQorCWludGVycHJldGF0aW9ucyBvZiB0aGUgZGV2aWNlIHJlZ2lzdGVycy4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlICJhdHAuaCIKKworTU9EVUxFX0FVVEhPUigiRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVhbFRlayBSVEw4MDAyLzgwMTIgcGFyYWxsZWwgcG9ydCBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoeGN2ciwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2ludGVycnVwdF93b3JrLCAiQVRQIG1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkFUUCBkZWJ1ZyBsZXZlbCAoMC03KSIpOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkFUUCBJL08gYmFzZSBhZGRyZXNzKGVzKSIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJBVFAgSVJRIG51bWJlcihzKSIpOworTU9EVUxFX1BBUk1fREVTQyh4Y3ZyLCAiQVRQIHRyYW5zY2VpdmVyKHMpICgwPWludGVybmFsLCAxPWV4dGVybmFsKSIpOworCisvKiBUaGUgbnVtYmVyIG9mIGxvdyBJL08gcG9ydHMgdXNlZCBieSB0aGUgZXRoZXJjYXJkLiAqLworI2RlZmluZSBFVEhFUkNBUkRfVE9UQUxfU0laRQkzCisKKy8qIFNlcXVlbmNlIHRvIHN3aXRjaCBhbiA4MDEyIGZyb20gcHJpbnRlciBtdXggdG8gZXRoZXJuZXQgbW9kZS4gKi8KK3N0YXRpYyBjaGFyIG11eF84MDEyW10gPSB7IDB4ZmYsIDB4ZjcsIDB4ZmYsIDB4ZmIsIDB4ZjMsIDB4ZmIsIDB4ZmYsIDB4ZjcsfTsKKworc3RydWN0IG5ldF9sb2NhbCB7CisgICAgc3BpbmxvY2tfdCBsb2NrOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X21vZHVsZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogTWVkaWEgc2VsZWN0aW9uIHRpbWVyLiAqLworICAgIGxvbmcgbGFzdF9yeF90aW1lOwkJLyogTGFzdCBSeCwgaW4gamlmZmllcywgdG8gaGFuZGxlIFJ4IGhhbmcuICovCisgICAgaW50IHNhdmVkX3R4X3NpemU7CisgICAgdW5zaWduZWQgaW50IHR4X3VuaXRfYnVzeToxOworICAgIHVuc2lnbmVkIGNoYXIgcmVfdHgsCS8qIE51bWJlciBvZiBwYWNrZXQgcmV0cmFuc21pc3Npb25zLiAqLworCQlhZGRyX21vZGUsCQkvKiBDdXJyZW50IFJ4IGZpbHRlciBlLmcuIHByb21pc2N1b3VzLCBldGMuICovCisJCXBhY19jbnRfaW5fdHhfYnVmLAorCQljaGlwX3R5cGU7Cit9OworCisvKiBUaGlzIGNvZGUsIHdyaXR0ZW4gYnkgd3djQHN1cGVyLm9yZywgcmVzZXRzIHRoZSBhZGFwdGVyIGV2ZXJ5CisgICBUSU1FRF9DSEVDS0VSIHRpY2tzLiAgVGhpcyByZWNvdmVycyBmcm9tIGFuIHVua25vd24gZXJyb3Igd2hpY2gKKyAgIGhhbmdzIHRoZSBkZXZpY2UuICovCisjZGVmaW5lIFRJTUVEX0NIRUNLRVIgKEhaLzQpCisjaWZkZWYgVElNRURfQ0hFQ0tFUgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CitzdGF0aWMgdm9pZCBhdHBfdGltZWRfY2hlY2tlcih1bnNpZ25lZCBsb25nIGlnbm9yZWQpOworI2VuZGlmCisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KKworc3RhdGljIGludCBhdHBfcHJvYmUxKGxvbmcgaW9hZGRyKTsKK3N0YXRpYyB2b2lkIGdldF9ub2RlX0lEKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGVlcHJvbV9vcChsb25nIGlvYWRkciwgdW5zaWduZWQgaW50IGNtZCk7CitzdGF0aWMgaW50IG5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaGFyZHdhcmVfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHdyaXRlX3BhY2tldChsb25nIGlvYWRkciwgaW50IGxlbmd0aCwgdW5zaWduZWQgY2hhciAqcGFja2V0LCBpbnQgcGFkLCBpbnQgbW9kZSk7CitzdGF0aWMgdm9pZCB0cmlnZ2VyX3NlbmQobG9uZyBpb2FkZHIsIGludCBsZW5ndGgpOworc3RhdGljIGludAlhdHBfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgYXRwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIG5ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJlYWRfYmxvY2sobG9uZyBpb2FkZHIsIGludCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGRhdGFfbW9kZSk7CitzdGF0aWMgaW50IG5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlXzgwMDIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZV84MDEyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCisvKiBBIGxpc3Qgb2YgYWxsIGluc3RhbGxlZCBBVFAgZGV2aWNlcywgZm9yIHJlbW92aW5nIHRoZSBkcml2ZXIgbW9kdWxlLiAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpyb290X2F0cF9kZXY7CisKKy8qIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRlciBvZiB0aGlzIHR5cGUsIGFuZCByZXR1cm4gJzAnIGlmZiBvbmUgZXhpc3RzLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMCwgcHJvYmUgYWxsIGxpa2VseSBsb2NhdGlvbnMuCisgICBJZiBkZXYtPmJhc2VfYWRkciA9PSAxLCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCisgICBJZiBkZXYtPmJhc2VfYWRkciA9PSAyLCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGRldmljZSBhbmQgcmV0dXJuIHN1Y2Nlc3MKKyAgIChkZXRhY2hhYmxlIGRldmljZXMgb25seSkuCisgICAKKyAgIEZJWE1FOiB3ZSBzaG91bGQgdXNlIHRoZSBwYXJwb3J0IGxheWVyIGZvciB0aGlzCisgICAqLworc3RhdGljIGludCBfX2luaXQgYXRwX2luaXQodm9pZCkKK3sKKwlpbnQgKnBvcnQsIHBvcnRzW10gPSB7MHgzNzgsIDB4Mjc4LCAweDNiYywgMH07CisJaW50IGJhc2VfYWRkciA9IGlvWzBdOworCisJaWYgKGJhc2VfYWRkciA+IDB4MWZmKQkJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQlyZXR1cm4gYXRwX3Byb2JlMShiYXNlX2FkZHIpOworCWVsc2UgaWYgKGJhc2VfYWRkciA9PSAxKQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisKKwlmb3IgKHBvcnQgPSBwb3J0czsgKnBvcnQ7IHBvcnQrKykgeworCQlsb25nIGlvYWRkciA9ICpwb3J0OworCQlvdXRiKDB4NTcsIGlvYWRkciArIFBBUl9EQVRBKTsKKwkJaWYgKGluYihpb2FkZHIgKyBQQVJfREFUQSkgIT0gMHg1NykKKwkJCWNvbnRpbnVlOworCQlpZiAoYXRwX3Byb2JlMShpb2FkZHIpID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBfX2luaXQgYXRwX3Byb2JlMShsb25nIGlvYWRkcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKwlpbnQgc2F2ZWRfY3RybF9yZWcsIHN0YXR1cywgaTsKKwlpbnQgcmVzOworCisJb3V0YigweGZmLCBpb2FkZHIgKyBQQVJfREFUQSk7CisJLyogU2F2ZSB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIENvbnRyb2wgcmVnaXN0ZXIsIGluIGNhc2Ugd2UgZ3Vlc3NlZAorCSAgIHdyb25nLiAqLworCXNhdmVkX2N0cmxfcmVnID0gaW5iKGlvYWRkciArIFBBUl9DT05UUk9MKTsKKwlpZiAobmV0X2RlYnVnID4gMykKKwkJcHJpbnRrKCJhdHA6IENvbnRyb2wgcmVnaXN0ZXIgd2FzICUjMi4yeC5cbiIsIHNhdmVkX2N0cmxfcmVnKTsKKwkvKiBJUlFFTj0wLCBTTENUQj1oaWdoIElOSVRCPWhpZ2gsIEFVVE9GREI9aGlnaCwgU1RCQj1oaWdoLiAqLworCW91dGIoMHgwNCwgaW9hZGRyICsgUEFSX0NPTlRST0wpOworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJaWYgKG5ldF9kZWJ1ZyA+IDMpIHsKKwkJLyogVHVybiBvZmYgdGhlIHByaW50ZXIgbXVsdGlwbGV4ZXIgb24gdGhlIDgwMTIuICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlvdXRiKG11eF84MDEyW2ldLCBpb2FkZHIgKyBQQVJfREFUQSk7CisJCXdyaXRlX3JlZyhpb2FkZHIsIE1PRFNFTCwgMHgwMCk7CisJCXByaW50aygiYXRwOiBSZWdpc3RlcnMgYXJlICIpOworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJCXByaW50aygiICUyLjJ4IiwgcmVhZF9uaWJibGUoaW9hZGRyLCBpKSk7CisJCXByaW50aygiLlxuIik7CisJfQorI2VuZGlmCisJLyogVHVybiBvZmYgdGhlIHByaW50ZXIgbXVsdGlwbGV4ZXIgb24gdGhlIDgwMTIuICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJb3V0YihtdXhfODAxMltpXSwgaW9hZGRyICsgUEFSX0RBVEEpOworCXdyaXRlX3JlZ19oaWdoKGlvYWRkciwgQ01SMSwgQ01SMWhfUkVTRVQpOworCS8qIHVkZWxheSgpIGhlcmU/ICovCisJc3RhdHVzID0gcmVhZF9uaWJibGUoaW9hZGRyLCBDTVIxKTsKKworCWlmIChuZXRfZGVidWcgPiAzKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJhdHA6IFN0YXR1cyBuaWJibGUgd2FzICUjMi4yeC4uIiwgc3RhdHVzKTsKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCQlwcmludGsoIiAlMi4yeCIsIHJlYWRfbmliYmxlKGlvYWRkciwgaSkpOworCQlwcmludGsoIlxuIik7CisJfQorCisJaWYgKChzdGF0dXMgJiAweDc4KSAhPSAweDA4KSB7CisJCS8qIFRoZSBwb2NrZXQgYWRhcHRlciBwcm9iZSBmYWlsZWQsIHJlc3RvcmUgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuICovCisJCW91dGIoc2F2ZWRfY3RybF9yZWcsIGlvYWRkciArIFBBUl9DT05UUk9MKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXN0YXR1cyA9IHJlYWRfbmliYmxlKGlvYWRkciwgQ01SMl9oKTsKKwlpZiAoKHN0YXR1cyAmIDB4NzgpICE9IDB4MTApIHsKKwkJb3V0YihzYXZlZF9jdHJsX3JlZywgaW9hZGRyICsgUEFSX0NPTlRST0wpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBGaW5kIHRoZSBJUlEgdXNlZCBieSB0cmlnZ2VyaW5nIGFuIGludGVycnVwdC4gKi8KKwl3cml0ZV9yZWdfYnl0ZShpb2FkZHIsIENNUjIsIDB4MDEpOwkJCS8qIE5vIGFjY2VwdCBtb2RlLCBJUlEgb3V0LiAqLworCXdyaXRlX3JlZ19oaWdoKGlvYWRkciwgQ01SMSwgQ01SMWhfUnhFTkFCTEUgfCBDTVIxaF9UeEVOQUJMRSk7CS8qIEVuYWJsZSBUeCBhbmQgUnguICovCisKKwkvKiBPbWl0IGF1dG9JUlEgcm91dGluZSBmb3Igbm93LiBVc2UgInRhYmxlIGxvb2t1cCIgaW5zdGVhZC4gIFVoZ2dnaC4gKi8KKwlpZiAoaXJxWzBdKQorCQlkZXYtPmlycSA9IGlycVswXTsKKwllbHNlIGlmIChpb2FkZHIgPT0gMHgzNzgpCisJCWRldi0+aXJxID0gNzsKKwllbHNlCisJCWRldi0+aXJxID0gNTsKKwl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIENNUjEsIENNUjFoX1R4UnhPRkYpOyAvKiBEaXNhYmxlIFR4IGFuZCBSeCB1bml0cy4gKi8KKwl3cml0ZV9yZWcoaW9hZGRyLCBDTVIyLCBDTVIyX05VTEwpOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKwkvKiBSZWFkIHRoZSBzdGF0aW9uIGFkZHJlc3MgUFJPTS4gICovCisJZ2V0X25vZGVfSUQoZGV2KTsKKworI2lmbmRlZiBNT0RVTEUKKwlpZiAobmV0X2RlYnVnKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIgS0VSTl9JTkZPICIlcyIsIHZlcnNpb25BLCB2ZXJzaW9uQik7CisjZW5kaWYKKworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFBvY2tldCBhZGFwdGVyIGZvdW5kIGF0ICUjM2x4LCBJUlEgJWQsIFNBUFJPTSAiCisJCSAgICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWC5cbiIsIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsCisJCSAgIGRldi0+aXJxLCBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCQkgICBkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdKTsKKworCS8qIFJlc2V0IHRoZSBldGhlcm5ldCBoYXJkd2FyZSBhbmQgYWN0aXZhdGUgdGhlIHByaW50ZXIgcGFzcy10aHJvdWdoLiAqLworCXdyaXRlX3JlZ19oaWdoKGlvYWRkciwgQ01SMSwgQ01SMWhfUkVTRVQgfCBDTVIxaF9NVVgpOworCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxwLT5jaGlwX3R5cGUgPSBSVEw4MDAyOworCWxwLT5hZGRyX21vZGUgPSBDTVIyaF9Ob3JtYWw7CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworCS8qIEZvciB0aGUgQVRQIGFkYXB0ZXIgdGhlICJpZl9wb3J0IiBpcyByZWFsbHkgdGhlIGRhdGEgdHJhbnNmZXIgbW9kZS4gKi8KKwlpZiAoeGN2clswXSkKKwkJZGV2LT5pZl9wb3J0ID0geGN2clswXTsKKwllbHNlCisJCWRldi0+aWZfcG9ydCA9IChkZXYtPm1lbV9zdGFydCAmIDB4ZikgPyAoZGV2LT5tZW1fc3RhcnQgJiAweDcpIDogNDsKKwlpZiAoZGV2LT5tZW1fZW5kICYgMHhmKQorCQluZXRfZGVidWcgPSBkZXYtPm1lbV9lbmQgJiA3OworCisJZGV2LT5vcGVuCQk9IG5ldF9vcGVuOworCWRldi0+c3RvcAkJPSBuZXRfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBhdHBfc2VuZF9wYWNrZXQ7CisJZGV2LT5nZXRfc3RhdHMJCT0gbmV0X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9CisJICBscC0+Y2hpcF90eXBlID09IFJUTDgwMDIgPyAmc2V0X3J4X21vZGVfODAwMiA6ICZzZXRfcnhfbW9kZV84MDEyOworCWRldi0+dHhfdGltZW91dAkJPSB0eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOworCisJcmVzID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJlcykgeworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gcmVzOworCX0KKworCWxwLT5uZXh0X21vZHVsZSA9IHJvb3RfYXRwX2RldjsKKwlyb290X2F0cF9kZXYgPSBkZXY7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVhZCB0aGUgc3RhdGlvbiBhZGRyZXNzIFBST00sIHVzdWFsbHkgYSB3b3JkLXdpZGUgRUVQUk9NLiAqLworc3RhdGljIHZvaWQgX19pbml0IGdldF9ub2RlX0lEKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgc2Ffb2Zmc2V0ID0gMDsKKwlpbnQgaTsKKworCXdyaXRlX3JlZyhpb2FkZHIsIENNUjIsIENNUjJfRUVQUk9NKTsJICAvKiBQb2ludCB0byB0aGUgRUVQUk9NIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCisJLyogU29tZSBhZGFwdGVycyBoYXZlIHRoZSBzdGF0aW9uIGFkZHJlc3MgYXQgb2Zmc2V0IDE1IGluc3RlYWQgb2Ygb2Zmc2V0CisJICAgemVyby4gIENoZWNrIGZvciBpdCwgYW5kIGZpeCBpdCBpZiBuZWVkZWQuICovCisJaWYgKGVlcHJvbV9vcChpb2FkZHIsIEVFX1JFQUQoMCkpID09IDB4ZmZmZikKKwkJc2Ffb2Zmc2V0ID0gMTU7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkoKHUxNiAqKWRldi0+ZGV2X2FkZHIpW2ldID0KKwkJCWJlMTZfdG9fY3B1KGVlcHJvbV9vcChpb2FkZHIsIEVFX1JFQUQoc2Ffb2Zmc2V0ICsgaSkpKTsKKworCXdyaXRlX3JlZyhpb2FkZHIsIENNUjIsIENNUjJfTlVMTCk7Cit9CisKKy8qCisgIEFuIEVFUFJPTSByZWFkIGNvbW1hbmQgc3RhcnRzIGJ5IHNoaWZ0aW5nIG91dCAweDYwK2FkZHJlc3MsIGFuZCB0aGVuCisgIHNoaWZ0aW5nIGluIHRoZSBzZXJpYWwgZGF0YS4gU2VlIHRoZSBOYXRTZW1pIGRhdGFib29rIGZvciBkZXRhaWxzLgorICoJCSAgIF9fX19fX19fX19fX19fX18KKyAqIENTIDogX198CisgKgkJCSAgIF9fXwkgICBfX18KKyAqIENMSzogX19fX19ffAkgIHxfX198CSAgfAorICoJCSBfXyBfX19fX19fIF9fX19fX18KKyAqIERJIDoJIF9fWF9fX19fX19YX19fX19fX1gKKyAqIERPIDoJIF9fX19fX19fX1hfX19fX19fWAorICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBfX2luaXQgZWVwcm9tX29wKGxvbmcgaW9hZGRyLCB1MzIgY21kKQoreworCXVuc2lnbmVkIGVlZGF0YV9vdXQgPSAwOworCWludCBudW1fYml0cyA9IEVFX0NNRF9TSVpFOworCisJd2hpbGUgKC0tbnVtX2JpdHMgPj0gMCkgeworCQljaGFyIG91dHZhbCA9IChjbWQgJiAoMTw8bnVtX2JpdHMpKSA/IEVFX0RBVEFfV1JJVEUgOiAwOworCQl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIFBST01fQ01ELCBvdXR2YWwgfCBFRV9DTEtfTE9XKTsKKwkJd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBQUk9NX0NNRCwgb3V0dmFsIHwgRUVfQ0xLX0hJR0gpOworCQllZWRhdGFfb3V0IDw8PSAxOworCQlpZiAocmVhZF9uaWJibGUoaW9hZGRyLCBQUk9NX0RBVEEpICYgRUVfREFUQV9SRUFEKQorCQkJZWVkYXRhX291dCsrOworCX0KKwl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIFBST01fQ01ELCBFRV9DTEtfTE9XICYgfkVFX0NTKTsKKwlyZXR1cm4gZWVkYXRhX291dDsKK30KKworCisvKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKKyAgIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKworICAgVGhpcyByb3V0aW5lIHNldHMgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgorICAgcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKKyAgIHRoZXJlIGlzIG5vbi1yZWJvb3Qgd2F5IHRvIHJlY292ZXIgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisKKyAgIFRoaXMgaXMgYW4gYXR0YWNoYWJsZSBkZXZpY2U6IGlmIHRoZXJlIGlzIG5vIGRldi0+cHJpdiBlbnRyeSB0aGVuIGl0IHdhc24ndAorICAgcHJvYmVkIGZvciBhdCBib290LXRpbWUsIGFuZCB3ZSBuZWVkIHRvIHByb2JlIGZvciBpdCBhZ2Fpbi4KKyAgICovCitzdGF0aWMgaW50IG5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXQ7CisKKwkvKiBUaGUgaW50ZXJydXB0IGxpbmUgaXMgdHVybmVkIG9mZiAodHJpLXN0YXRlZCkgd2hlbiB0aGUgZGV2aWNlIGlzbid0IGluCisJICAgdXNlLiAgVGhhdCdzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciAiYXR0YWNoZWQiIGludGVyZmFjZXMgd2hlcmUgdGhlCisJICAgcG9ydCBvciBpbnRlcnJ1cHQgbWF5IGJlIHNoYXJlZC4gKi8KKwlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJmF0cF9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaGFyZHdhcmVfaW5pdChkZXYpOworCisJaW5pdF90aW1lcigmbHAtPnRpbWVyKTsKKwlscC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBUSU1FRF9DSEVDS0VSOworCWxwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWxwLT50aW1lci5mdW5jdGlvbiA9ICZhdHBfdGltZWRfY2hlY2tlcjsgICAgLyogdGltZXIgaGFuZGxlciAqLworCWFkZF90aW1lcigmbHAtPnRpbWVyKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgcm91dGluZSByZXNldHMgdGhlIGhhcmR3YXJlLiAgV2UgaW5pdGlhbGl6ZSBldmVyeXRoaW5nLCBhc3N1bWluZyB0aGF0CisgICB0aGUgaGFyZHdhcmUgbWF5IGhhdmUgYmVlbiB0ZW1wb3JhcmlseSBkZXRhY2hlZC4gKi8KK3N0YXRpYyB2b2lkIGhhcmR3YXJlX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaTsKKworCS8qIFR1cm4gb2ZmIHRoZSBwcmludGVyIG11bHRpcGxleGVyIG9uIHRoZSA4MDEyLiAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCW91dGIobXV4XzgwMTJbaV0sIGlvYWRkciArIFBBUl9EQVRBKTsKKwl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIENNUjEsIENNUjFoX1JFU0VUKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXdyaXRlX3JlZ19ieXRlKGlvYWRkciwgUEFSMCArIGksIGRldi0+ZGV2X2FkZHJbaV0pOworCisJd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBDTVIyLCBscC0+YWRkcl9tb2RlKTsKKworCWlmIChuZXRfZGVidWcgPiAyKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVzZXQ6IGN1cnJlbnQgUnggbW9kZSAlZC5cbiIsIGRldi0+bmFtZSwKKwkJCSAgIChyZWFkX25pYmJsZShpb2FkZHIsIENNUjJfaCkgPj4gMykgJiAweDBmKTsKKwl9CisKKyAgICB3cml0ZV9yZWcoaW9hZGRyLCBDTVIyLCBDTVIyX0lSUU9VVCk7CisgICAgd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBDTVIxLCBDTVIxaF9SeEVOQUJMRSB8IENNUjFoX1R4RU5BQkxFKTsKKworCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0IGxpbmUgZnJvbSB0aGUgc2VyaWFsIHBvcnQuICovCisJb3V0YihDdHJsX1NlbERhdGEgKyBDdHJsX0lSUUVOLCBpb2FkZHIgKyBQQVJfQ09OVFJPTCk7CisKKwkvKiBVbm1hc2sgdGhlIGludGVyZXN0aW5nIGludGVycnVwdHMuICovCisgICAgd3JpdGVfcmVnKGlvYWRkciwgSU1SLCBJU1JfUnhPSyB8IElTUl9UeEVyciB8IElTUl9UeE9LKTsKKyAgICB3cml0ZV9yZWdfaGlnaChpb2FkZHIsIElNUiwgSVNSaF9SeEVycik7CisKKwlscC0+dHhfdW5pdF9idXN5ID0gMDsKKyAgICBscC0+cGFjX2NudF9pbl90eF9idWYgPSAwOworCWxwLT5zYXZlZF90eF9zaXplID0gMDsKK30KKworc3RhdGljIHZvaWQgdHJpZ2dlcl9zZW5kKGxvbmcgaW9hZGRyLCBpbnQgbGVuZ3RoKQoreworCXdyaXRlX3JlZ19ieXRlKGlvYWRkciwgVHhDTlQwLCBsZW5ndGggJiAweGZmKTsKKwl3cml0ZV9yZWcoaW9hZGRyLCBUeENOVDEsIGxlbmd0aCA+PiA4KTsKKwl3cml0ZV9yZWcoaW9hZGRyLCBDTVIxLCBDTVIxX1htaXQpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9wYWNrZXQobG9uZyBpb2FkZHIsIGludCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKnBhY2tldCwgaW50IHBhZF9sZW4sIGludCBkYXRhX21vZGUpCit7CisgICAgaWYgKGxlbmd0aCAmIDEpCisgICAgeworICAgIAlsZW5ndGgrKzsKKyAgICAJcGFkX2xlbisrOworICAgIH0KKworICAgIG91dGIoRU9DK01BUiwgaW9hZGRyICsgUEFSX0RBVEEpOworICAgIGlmICgoZGF0YV9tb2RlICYgMSkgPT0gMCkgeworCQkvKiBXcml0ZSB0aGUgcGFja2V0IG91dCwgc3RhcnRpbmcgd2l0aCB0aGUgd3JpdGUgYWRkci4gKi8KKwkJb3V0YihXckFkZHIrTUFSLCBpb2FkZHIgKyBQQVJfREFUQSk7CisJCWRvIHsKKwkJCXdyaXRlX2J5dGVfbW9kZTAoaW9hZGRyLCAqcGFja2V0KyspOworCQl9IHdoaWxlICgtLWxlbmd0aCA+IHBhZF9sZW4pIDsKKwkJZG8geworCQkJd3JpdGVfYnl0ZV9tb2RlMChpb2FkZHIsIDApOworCQl9IHdoaWxlICgtLWxlbmd0aCA+IDApIDsKKyAgICB9IGVsc2UgeworCQkvKiBXcml0ZSB0aGUgcGFja2V0IG91dCBpbiBzbG93IG1vZGUuICovCisJCXVuc2lnbmVkIGNoYXIgb3V0Ynl0ZSA9ICpwYWNrZXQrKzsKKworCQlvdXRiKEN0cmxfTE5pYldyaXRlICsgQ3RybF9JUlFFTiwgaW9hZGRyICsgUEFSX0NPTlRST0wpOworCQlvdXRiKFdyQWRkcitNQVIsIGlvYWRkciArIFBBUl9EQVRBKTsKKworCQlvdXRiKChvdXRieXRlICYgMHgwZil8MHg0MCwgaW9hZGRyICsgUEFSX0RBVEEpOworCQlvdXRiKG91dGJ5dGUgJiAweDBmLCBpb2FkZHIgKyBQQVJfREFUQSk7CisJCW91dGJ5dGUgPj49IDQ7CisJCW91dGIob3V0Ynl0ZSAmIDB4MGYsIGlvYWRkciArIFBBUl9EQVRBKTsKKwkJb3V0YihDdHJsX0hOaWJXcml0ZSArIEN0cmxfSVJRRU4sIGlvYWRkciArIFBBUl9DT05UUk9MKTsKKwkJd2hpbGUgKC0tbGVuZ3RoID4gcGFkX2xlbikKKwkJCXdyaXRlX2J5dGVfbW9kZTEoaW9hZGRyLCAqcGFja2V0KyspOworCQl3aGlsZSAoLS1sZW5ndGggPiAwKQorCQkJd3JpdGVfYnl0ZV9tb2RlMShpb2FkZHIsIDApOworICAgIH0KKyAgICAvKiBUZXJtaW5hdGUgdGhlIFR4IGZyYW1lLiAgRW5kIG9mIHdyaXRlOiBFQ0IuICovCisgICAgb3V0YigweGZmLCBpb2FkZHIgKyBQQVJfREFUQSk7CisgICAgb3V0YihDdHJsX0hOaWJXcml0ZSB8IEN0cmxfU2VsRGF0YSB8IEN0cmxfSVJRRU4sIGlvYWRkciArIFBBUl9DT05UUk9MKTsKK30KKworc3RhdGljIHZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dCwgJXM/XG4iLCBkZXYtPm5hbWUsCisJCSAgIGluYihpb2FkZHIgKyBQQVJfQ09OVFJPTCkgJiAweDEwID8gIm5ldHdvcmsgY2FibGUgcHJvYmxlbSIKKwkJICAgOiAgIklSUSBjb25mbGljdCIpOworCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRlci4gKi8KKwloYXJkd2FyZV9pbml0KGRldik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKK30KKworc3RhdGljIGludCBhdHBfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsZW5ndGggPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSB3cml0aW5nIDB4MDAgdG8gdGhlIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyLgorCSAgIFRoaXMgc2VxdWVuY2UgbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgYW4gaW5jb21pbmcgcGFja2V0LiAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJd3JpdGVfcmVnKGlvYWRkciwgSU1SLCAwKTsKKwl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIElNUiwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXdyaXRlX3BhY2tldChpb2FkZHIsIGxlbmd0aCwgc2tiLT5kYXRhLCBsZW5ndGgtc2tiLT5sZW4sIGRldi0+aWZfcG9ydCk7CisKKwlscC0+cGFjX2NudF9pbl90eF9idWYrKzsKKwlpZiAobHAtPnR4X3VuaXRfYnVzeSA9PSAwKSB7CisJCXRyaWdnZXJfc2VuZChpb2FkZHIsIGxlbmd0aCk7CisJCWxwLT5zYXZlZF90eF9zaXplID0gMDsgCQkJCS8qIFJlZHVuZGFudCAqLworCQlscC0+cmVfdHggPSAwOworCQlscC0+dHhfdW5pdF9idXN5ID0gMTsKKwl9IGVsc2UKKwkJbHAtPnNhdmVkX3R4X3NpemUgPSBsZW5ndGg7CisJLyogUmUtZW5hYmxlIHRoZSBMUFQgaW50ZXJydXB0cy4gKi8KKwl3cml0ZV9yZWcoaW9hZGRyLCBJTVIsIElTUl9SeE9LIHwgSVNSX1R4RXJyIHwgSVNSX1R4T0spOworCXdyaXRlX3JlZ19oaWdoKGlvYWRkciwgSU1SLCBJU1JoX1J4RXJyKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWRldl9rZnJlZV9za2IgKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKworLyogVGhlIHR5cGljYWwgd29ya2xvYWQgb2YgdGhlIGRyaXZlcjoKKyAgIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorYXRwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2luc3RhbmNlOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwOworCWxvbmcgaW9hZGRyOworCXN0YXRpYyBpbnQgbnVtX3R4X3NpbmNlX3J4OworCWludCBib2d1c2NvdW50ID0gbWF4X2ludGVycnVwdF93b3JrOworCWludCBoYW5kbGVkID0gMDsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkFUUF9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisKKwkvKiBEaXNhYmxlIGFkZGl0aW9uYWwgc3B1cmlvdXMgaW50ZXJydXB0cy4gKi8KKwlvdXRiKEN0cmxfU2VsRGF0YSwgaW9hZGRyICsgUEFSX0NPTlRST0wpOworCisJLyogVGhlIGFkYXB0ZXIncyBvdXRwdXQgaXMgY3VycmVudGx5IHRoZSBJUlEgbGluZSwgc3dpdGNoIGl0IHRvIGRhdGEuICovCisJd3JpdGVfcmVnKGlvYWRkciwgQ01SMiwgQ01SMl9OVUxMKTsKKwl3cml0ZV9yZWcoaW9hZGRyLCBJTVIsIDApOworCisJaWYgKG5ldF9kZWJ1ZyA+IDUpIHByaW50ayhLRVJOX0RFQlVHICIlczogSW4gaW50ZXJydXB0ICIsIGRldi0+bmFtZSk7CisgICAgd2hpbGUgKC0tYm9ndXNjb3VudCA+IDApIHsKKwkJaW50IHN0YXR1cyA9IHJlYWRfbmliYmxlKGlvYWRkciwgSVNSKTsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDUpIHByaW50aygibG9vcCBzdGF0dXMgJTAyeC4uIiwgc3RhdHVzKTsKKworCQlpZiAoc3RhdHVzICYgKElTUl9SeE9LPDwzKSkgeworCQkJaGFuZGxlZCA9IDE7CisJCQl3cml0ZV9yZWcoaW9hZGRyLCBJU1IsIElTUl9SeE9LKTsgLyogQ2xlYXIgdGhlIFJ4IGludGVycnVwdC4gKi8KKwkJCWRvIHsKKwkJCQlpbnQgcmVhZF9zdGF0dXMgPSByZWFkX25pYmJsZShpb2FkZHIsIENNUjEpOworCQkJCWlmIChuZXRfZGVidWcgPiA2KQorCQkJCQlwcmludGsoImhhbmRsaW5nIFJ4IHBhY2tldCAlMDJ4Li4iLCByZWFkX3N0YXR1cyk7CisJCQkJLyogV2UgYWNrbm93bGVkZ2VkIHRoZSBub3JtYWwgUnggaW50ZXJydXB0LCBzbyBpZiB0aGUgaW50ZXJydXB0CisJCQkJICAgaXMgc3RpbGwgb3V0c3RhbmRpbmcgd2UgbXVzdCBoYXZlIGEgUnggZXJyb3IuICovCisJCQkJaWYgKHJlYWRfc3RhdHVzICYgKENNUjFfSVJRIDw8IDMpKSB7IC8qIE92ZXJydW4uICovCisJCQkJCWxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJCQkvKiBTZXQgdG8gbm8tYWNjZXB0IG1vZGUgbG9uZyBlbm91Z2ggdG8gcmVtb3ZlIGEgcGFja2V0LiAqLworCQkJCQl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIENNUjIsIENNUjJoX09GRik7CisJCQkJCW5ldF9yeChkZXYpOworCQkJCQkvKiBDbGVhciB0aGUgaW50ZXJydXB0IGFuZCByZXR1cm4gdG8gbm9ybWFsIFJ4IG1vZGUuICovCisJCQkJCXdyaXRlX3JlZ19oaWdoKGlvYWRkciwgSVNSLCBJU1JoX1J4RXJyKTsKKwkJCQkJd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBDTVIyLCBscC0+YWRkcl9tb2RlKTsKKwkJCQl9IGVsc2UgaWYgKChyZWFkX3N0YXR1cyAmIChDTVIxX0J1ZkVuYiA8PCAzKSkgPT0gMCkgeworCQkJCQluZXRfcngoZGV2KTsKKwkJCQkJbnVtX3R4X3NpbmNlX3J4ID0gMDsKKwkJCQl9IGVsc2UKKwkJCQkJYnJlYWs7CisJCQl9IHdoaWxlICgtLWJvZ3VzY291bnQgPiAwKTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiAoKElTUl9UeEVyciArIElTUl9UeE9LKTw8MykpIHsKKwkJCWhhbmRsZWQgPSAxOworCQkJaWYgKG5ldF9kZWJ1ZyA+IDYpICBwcmludGsoImhhbmRsaW5nIFR4IGRvbmUuLiIpOworCQkJLyogQ2xlYXIgdGhlIFR4IGludGVycnVwdC4gIFdlIHNob3VsZCBjaGVjayBmb3IgdG9vIG1hbnkgZmFpbHVyZXMKKwkJCSAgIGFuZCByZWluaXRpYWxpemUgdGhlIGFkYXB0ZXIuICovCisJCQl3cml0ZV9yZWcoaW9hZGRyLCBJU1IsIElTUl9UeEVyciArIElTUl9UeE9LKTsKKwkJCWlmIChzdGF0dXMgJiAoSVNSX1R4RXJyPDwzKSkgeworCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCQkJaWYgKCsrbHAtPnJlX3R4ID4gMTUpIHsKKwkJCQkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJCWhhcmR3YXJlX2luaXQoZGV2KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIEF0dGVtcHQgdG8gcmV0cmFuc21pdC4gKi8KKwkJCQlpZiAobmV0X2RlYnVnID4gNikgIHByaW50aygiYXR0ZW1wdGluZyB0byBSZVR4Iik7CisJCQkJd3JpdGVfcmVnKGlvYWRkciwgQ01SMSwgQ01SMV9SZVhtaXQgKyBDTVIxX1htaXQpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBGaW5pc2ggdXAgdGhlIHRyYW5zbWl0LiAqLworCQkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJbHAtPnBhY19jbnRfaW5fdHhfYnVmLS07CisJCQkJaWYgKCBscC0+c2F2ZWRfdHhfc2l6ZSkgeworCQkJCQl0cmlnZ2VyX3NlbmQoaW9hZGRyLCBscC0+c2F2ZWRfdHhfc2l6ZSk7CisJCQkJCWxwLT5zYXZlZF90eF9zaXplID0gMDsKKwkJCQkJbHAtPnJlX3R4ID0gMDsKKwkJCQl9IGVsc2UKKwkJCQkJbHAtPnR4X3VuaXRfYnVzeSA9IDA7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwkvKiBJbmZvcm0gdXBwZXIgbGF5ZXJzLiAqLworCQkJfQorCQkJbnVtX3R4X3NpbmNlX3J4Kys7CisJCX0gZWxzZSBpZiAobnVtX3R4X3NpbmNlX3J4ID4gOAorCQkJCSAgICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgZGV2LT5sYXN0X3J4ICsgSFopKSB7CisJCQlpZiAobmV0X2RlYnVnID4gMikKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1pc3NlZCBwYWNrZXQ/IE5vIFJ4IGFmdGVyICVkIFR4IGFuZCAiCisJCQkJCSAgICIlbGQgamlmZmllcyBzdGF0dXMgJTAyeCAgQ01SMSAlMDJ4LlxuIiwgZGV2LT5uYW1lLAorCQkJCQkgICBudW1fdHhfc2luY2VfcngsIGppZmZpZXMgLSBkZXYtPmxhc3RfcngsIHN0YXR1cywKKwkJCQkJICAgKHJlYWRfbmliYmxlKGlvYWRkciwgQ01SMSkgPj4gMykgJiAxNSk7CisJCQlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworCQkJaGFyZHdhcmVfaW5pdChkZXYpOworCQkJbnVtX3R4X3NpbmNlX3J4ID0gMDsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCWJyZWFrOworICAgIH0KKworCS8qIFRoaXMgZm9sbG93aW5nIGNvZGUgZml4ZXMgYSByYXJlIChhbmQgdmVyeSBkaWZmaWN1bHQgdG8gdHJhY2sgZG93bikKKwkgICBwcm9ibGVtIHdoZXJlIHRoZSBhZGFwdGVyIGZvcmdldHMgaXRzIGV0aGVybmV0IGFkZHJlc3MuICovCisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXdyaXRlX3JlZ19ieXRlKGlvYWRkciwgUEFSMCArIGksIGRldi0+ZGV2X2FkZHJbaV0pOworI2lmIDAgJiYgZGVmaW5lZChUSU1FRF9DSEVDS0VSKQorCQltb2RfdGltZXIoJmxwLT50aW1lciwgamlmZmllcyArIFRJTUVEX0NIRUNLRVIpOworI2VuZGlmCisJfQorCisJLyogVGVsbCB0aGUgYWRhcHRlciB0aGF0IGl0IGNhbiBnbyBiYWNrIHRvIHVzaW5nIHRoZSBvdXRwdXQgbGluZSBhcyBJUlEuICovCisgICAgd3JpdGVfcmVnKGlvYWRkciwgQ01SMiwgQ01SMl9JUlFPVVQpOworCS8qIEVuYWJsZSB0aGUgcGh5c2ljYWwgaW50ZXJydXB0IGxpbmUsIHdoaWNoIGlzIHN1cmUgdG8gYmUgbG93IHVudGlsLi4gKi8KKwlvdXRiKEN0cmxfU2VsRGF0YSArIEN0cmxfSVJRRU4sIGlvYWRkciArIFBBUl9DT05UUk9MKTsKKwkvKiAuLiB3ZSBlbmFibGUgdGhlIGludGVycnVwdCBzb3VyY2VzLiAqLworCXdyaXRlX3JlZyhpb2FkZHIsIElNUiwgSVNSX1J4T0sgfCBJU1JfVHhFcnIgfCBJU1JfVHhPSyk7CisJd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBJTVIsIElTUmhfUnhFcnIpOyAJCQkvKiBIbW1tLCByZWFsbHkgbmVlZGVkPyAqLworCisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKworCWlmIChuZXRfZGVidWcgPiA1KSBwcmludGsoImV4aXRpbmcgaW50ZXJydXB0LlxuIik7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKyNpZmRlZiBUSU1FRF9DSEVDS0VSCisvKiBUaGlzIGZvbGxvd2luZyBjb2RlIGZpeGVzIGEgcmFyZSAoYW5kIHZlcnkgZGlmZmljdWx0IHRvIHRyYWNrIGRvd24pCisgICBwcm9ibGVtIHdoZXJlIHRoZSBhZGFwdGVyIGZvcmdldHMgaXRzIGV0aGVybmV0IGFkZHJlc3MuICovCitzdGF0aWMgdm9pZCBhdHBfdGltZWRfY2hlY2tlcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHRpY2tzc29mYXIgPSBqaWZmaWVzIC0gbHAtPmxhc3RfcnhfdGltZTsKKwlpbnQgaTsKKworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCWlmICh0aWNrc3NvZmFyID4gMipIWikgeworI2lmIDEKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXdyaXRlX3JlZ19ieXRlKGlvYWRkciwgUEFSMCArIGksIGRldi0+ZGV2X2FkZHJbaV0pOworCQlscC0+bGFzdF9yeF90aW1lID0gamlmZmllczsKKyNlbHNlCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlpZiAocmVhZF9jbWRfYnl0ZShpb2FkZHIsIFBBUjAgKyBpKSAhPSBhdHBfdGltZWRfZGV2LT5kZXZfYWRkcltpXSkKKwkJCQl7CisJCQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGF0cF90aW1lZF9kZXYpOworCQkJd3JpdGVfcmVnX2J5dGUoaW9hZGRyLCBQQVIwICsgaSwgYXRwX3RpbWVkX2Rldi0+ZGV2X2FkZHJbaV0pOworCQkJaWYgKGkgPT0gMikKKwkJCSAgbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJZWxzZSBpZiAoaSA9PSAzKQorCQkJICBscC0+c3RhdHMudHhfZHJvcHBlZCsrOworCQkJZWxzZSBpZiAoaSA9PSA0KQorCQkJICBscC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJZWxzZQorCQkJICBscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCSAgfQorI2VuZGlmCisJfQorCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJbHAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgVElNRURfQ0hFQ0tFUjsKKwlhZGRfdGltZXIoJmxwLT50aW1lcik7Cit9CisjZW5kaWYKKworLyogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuICovCitzdGF0aWMgdm9pZCBuZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgcnhfaGVhZGVyIHJ4X2hlYWQ7CisKKwkvKiBQcm9jZXNzIHRoZSByZWNlaXZlZCBwYWNrZXQuICovCisJb3V0YihFT0MrTUFSLCBpb2FkZHIgKyBQQVJfREFUQSk7CisJcmVhZF9ibG9jayhpb2FkZHIsIDgsICh1bnNpZ25lZCBjaGFyKikmcnhfaGVhZCwgZGV2LT5pZl9wb3J0KTsKKwlpZiAobmV0X2RlYnVnID4gNSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiByeF9jb3VudCAlMDR4ICUwNHggJTA0eCAlMDR4Li4iLCByeF9oZWFkLnBhZCwKKwkJCSAgIHJ4X2hlYWQucnhfY291bnQsIHJ4X2hlYWQucnhfc3RhdHVzLCByeF9oZWFkLmN1cl9hZGRyKTsKKwlpZiAoKHJ4X2hlYWQucnhfc3RhdHVzICYgMHg3NykgIT0gMHgwMSkgeworCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWlmIChyeF9oZWFkLnJ4X3N0YXR1cyAmIDB4MDAwNCkgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQllbHNlIGlmIChyeF9oZWFkLnJ4X3N0YXR1cyAmIDB4MDAwMikgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDMpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFVua25vd24gQVRQIFJ4IGVycm9yICUwNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgcnhfaGVhZC5yeF9zdGF0dXMpOworCQlpZiAgKHJ4X2hlYWQucnhfc3RhdHVzICYgMHgwMDIwKSB7CisJCQlscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCXdyaXRlX3JlZ19oaWdoKGlvYWRkciwgQ01SMSwgQ01SMWhfVHhFTkFCTEUpOworCQkJd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBDTVIxLCBDTVIxaF9SeEVOQUJMRSB8IENNUjFoX1R4RU5BQkxFKTsKKwkJfSBlbHNlIGlmIChyeF9oZWFkLnJ4X3N0YXR1cyAmIDB4MDA1MCkKKwkJCWhhcmR3YXJlX2luaXQoZGV2KTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiBUaGUgIi00IiBvbWl0cyB0aGUgRkNTIChDUkMpLiAqLworCQlpbnQgcGt0X2xlbiA9IChyeF9oZWFkLnJ4X2NvdW50ICYgMHg3ZmYpIC0gNDsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKTsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUpOworCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlza2ItPmRldiA9IGRldjsKKworCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KKwkJcmVhZF9ibG9jayhpb2FkZHIsIHBrdF9sZW4sIHNrYl9wdXQoc2tiLHBrdF9sZW4pLCBkZXYtPmlmX3BvcnQpOworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQluZXRpZl9yeChza2IpOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwl9CisgZG9uZToKKwl3cml0ZV9yZWcoaW9hZGRyLCBDTVIxLCBDTVIxX05leHRQa3QpOworCWxwLT5sYXN0X3J4X3RpbWUgPSBqaWZmaWVzOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcmVhZF9ibG9jayhsb25nIGlvYWRkciwgaW50IGxlbmd0aCwgdW5zaWduZWQgY2hhciAqcCwgaW50IGRhdGFfbW9kZSkKK3sKKworCWlmIChkYXRhX21vZGUgPD0gMykgeyAvKiBNb2RlIDAgb3IgMSAqLworCQlvdXRiKEN0cmxfTE5pYlJlYWQsIGlvYWRkciArIFBBUl9DT05UUk9MKTsKKwkJb3V0YihsZW5ndGggPT0gOCAgPyAgUmRBZGRyIHwgSE5pYiB8IE1BUiAgOiAgUmRBZGRyIHwgTUFSLAorCQkJIGlvYWRkciArIFBBUl9EQVRBKTsKKwkJaWYgKGRhdGFfbW9kZSA8PSAxKSB7IC8qIE1vZGUgMCBvciAxICovCisJCQlkbyAgKnArKyA9IHJlYWRfYnl0ZV9tb2RlMChpb2FkZHIpOyAgd2hpbGUgKC0tbGVuZ3RoID4gMCk7CisJCX0gZWxzZQkvKiBNb2RlIDIgb3IgMyAqLworCQkJZG8gICpwKysgPSByZWFkX2J5dGVfbW9kZTIoaW9hZGRyKTsgIHdoaWxlICgtLWxlbmd0aCA+IDApOworCX0gZWxzZSBpZiAoZGF0YV9tb2RlIDw9IDUpCisJCWRvICAgICAgKnArKyA9IHJlYWRfYnl0ZV9tb2RlNChpb2FkZHIpOyAgd2hpbGUgKC0tbGVuZ3RoID4gMCk7CisJZWxzZQorCQlkbyAgICAgICpwKysgPSByZWFkX2J5dGVfbW9kZTYoaW9hZGRyKTsgIHdoaWxlICgtLWxlbmd0aCA+IDApOworCisgICAgb3V0YihFT0MrSE5pYitNQVIsIGlvYWRkciArIFBBUl9EQVRBKTsKKwlvdXRiKEN0cmxfU2VsRGF0YSwgaW9hZGRyICsgUEFSX0NPTlRST0wpOworfQorCisvKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIG5ldF9vcGVuKCkuICovCitzdGF0aWMgaW50CituZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWRlbF90aW1lcl9zeW5jKCZscC0+dGltZXIpOworCisJLyogRmx1c2ggdGhlIFR4IGFuZCBkaXNhYmxlIFJ4IGhlcmUuICovCisJbHAtPmFkZHJfbW9kZSA9IENNUjJoX09GRjsKKwl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIENNUjIsIENNUjJoX09GRik7CisKKwkvKiBGcmVlIHRoZSBJUlEgbGluZS4gKi8KKwlvdXRiKDB4MDAsIGlvYWRkciArIFBBUl9DT05UUk9MKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCS8qIFJlc2V0IHRoZSBldGhlcm5ldCBoYXJkd2FyZSBhbmQgYWN0aXZhdGUgdGhlIHByaW50ZXIgcGFzcy10aHJvdWdoLiAqLworCXdyaXRlX3JlZ19oaWdoKGlvYWRkciwgQ01SMSwgQ01SMWhfUkVTRVQgfCBDTVIxaF9NVVgpOworCXJldHVybiAwOworfQorCisvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4JVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvcgorICAgY2xvc2VkLiAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qCisgKglTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRlci4KKyAqLworCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZV84MDAyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoIGRldi0+bWNfY291bnQgPiAwIHx8IChkZXYtPmZsYWdzICYgKElGRl9BTExNVUxUSXxJRkZfUFJPTUlTQykpKSB7CisJCS8qIFdlIG11c3QgbWFrZSB0aGUga2VybmVsIHJlYWxpc2Ugd2UgaGFkIHRvIG1vdmUKKwkJICoJaW50byBwcm9taXNjIG1vZGUgb3Igd2Ugc3RhcnQgYWxsIG91dCB3YXIgb24KKwkJICoJdGhlIGNhYmxlLiAtIEFDCisJCSAqLworCQlkZXYtPmZsYWdzfD1JRkZfUFJPTUlTQzsKKwkJbHAtPmFkZHJfbW9kZSA9IENNUjJoX1BST01JU0M7CisJfSBlbHNlCisJCWxwLT5hZGRyX21vZGUgPSBDTVIyaF9Ob3JtYWw7CisJd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBDTVIyLCBscC0+YWRkcl9tb2RlKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGVfODAxMihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGNoYXIgbmV3X21vZGUsIG1jX2ZpbHRlcls4XTsgLyogTXVsdGljYXN0IGhhc2ggZmlsdGVyICovCisJaW50IGk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CQkJLyogU2V0IHByb21pc2N1b3VzLiAqLworCQluZXdfbW9kZSA9IENNUjJoX1BST01JU0M7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IDEwMDApICB8fCAgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIGZpbHRlciBwZXJmZWN0bHkgLS0gYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQltZW1zZXQobWNfZmlsdGVyLCAweGZmLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCW5ld19tb2RlID0gQ01SMmhfTm9ybWFsOworCX0gZWxzZSB7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCisJCW1lbXNldChtY19maWx0ZXIsIDAsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCQkgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpCisJCXsKKwkJCWludCBmaWx0ZXJiaXQgPSBldGhlcl9jcmNfbGUoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpICYgMHgzZjsKKwkJCW1jX2ZpbHRlcltmaWx0ZXJiaXQgPj4gNV0gfD0gMSA8PCAoZmlsdGVyYml0ICYgMzEpOworCQl9CisJCW5ld19tb2RlID0gQ01SMmhfTm9ybWFsOworCX0KKwlscC0+YWRkcl9tb2RlID0gbmV3X21vZGU7CisgICAgd3JpdGVfcmVnKGlvYWRkciwgQ01SMiwgQ01SMl9JUlFPVVQgfCAweDA0KTsgLyogU3dpdGNoIHRvIHBhZ2UgMS4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQl3cml0ZV9yZWdfYnl0ZShpb2FkZHIsIGksIG1jX2ZpbHRlcltpXSk7CisJaWYgKG5ldF9kZWJ1ZyA+IDIgfHwgMSkgeworCQlscC0+YWRkcl9tb2RlID0gMTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNb2RlICVkLCBzZXR0aW5nIG11bHRpY2FzdCBmaWx0ZXIgdG8iLAorCQkJICAgZGV2LT5uYW1lLCBscC0+YWRkcl9tb2RlKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCXByaW50aygiICUyLjJ4IiwgbWNfZmlsdGVyW2ldKTsKKwkJcHJpbnRrKCIuXG4iKTsKKwl9CisKKwl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIENNUjIsIGxwLT5hZGRyX21vZGUpOworICAgIHdyaXRlX3JlZyhpb2FkZHIsIENNUjIsIENNUjJfSVJRT1VUKTsgLyogU3dpdGNoIGJhY2sgdG8gcGFnZSAwICovCit9CisKK3N0YXRpYyBpbnQgX19pbml0IGF0cF9pbml0X21vZHVsZSh2b2lkKSB7CisJaWYgKGRlYnVnKQkJCQkJLyogRW1pdCB2ZXJzaW9uIGV2ZW4gaWYgbm8gY2FyZHMgZGV0ZWN0ZWQuICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiBLRVJOX0lORk8gIiVzIiwgdmVyc2lvbkEsIHZlcnNpb25CKTsKKwlyZXR1cm4gYXRwX2luaXQoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF0cF9jbGVhbnVwX21vZHVsZSh2b2lkKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5leHRfZGV2OworCisJd2hpbGUgKHJvb3RfYXRwX2RldikgeworCQluZXh0X2RldiA9ICgoc3RydWN0IG5ldF9sb2NhbCAqKXJvb3RfYXRwX2Rldi0+cHJpdiktPm5leHRfbW9kdWxlOworCQl1bnJlZ2lzdGVyX25ldGRldihyb290X2F0cF9kZXYpOworCQkvKiBObyBuZWVkIHRvIHJlbGVhc2VfcmVnaW9uKCksIHNpbmNlIHdlIG5ldmVyIHNuYXJmIGl0LiAqLworCQlmcmVlX25ldGRldihyb290X2F0cF9kZXYpOworCQlyb290X2F0cF9kZXYgPSBuZXh0X2RldjsKKwl9Cit9CisKK21vZHVsZV9pbml0KGF0cF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhdHBfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRwLmggYi9kcml2ZXJzL25ldC9hdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWRjNjQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXRwLmgKQEAgLTAsMCArMSwyNTkgQEAKKy8qIExpbnV4IGhlYWRlciBmaWxlIGZvciB0aGUgQVRQIHBvY2tldCBldGhlcm5ldCBhZGFwdGVyLiAqLworLyogdjEuMDkgOC85LzIwMDAgYmVja2VyQHNjeWxkLmNvbS4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogVGhlIGhlYWRlciBwcmVwZW5kZWQgdG8gcmVjZWl2ZWQgcGFja2V0cy4gKi8KK3N0cnVjdCByeF9oZWFkZXIgeworICAgIHVzaG9ydCBwYWQ7CQkJLyogUGFkLiAqLworICAgIHVzaG9ydCByeF9jb3VudDsKKyAgICB1c2hvcnQgcnhfc3RhdHVzOwkJLyogVW5rbm93biBiaXQgYXNzaWdubWVudHMgOi08LiAgKi8KKyAgICB1c2hvcnQgY3VyX2FkZHI7CQkvKiBBcHBhcmVudGx5IHRoZSBjdXJyZW50IGJ1ZmZlciBhZGRyZXNzKD8pICovCit9OworCisjZGVmaW5lIFBBUl9EQVRBCTAKKyNkZWZpbmUgUEFSX1NUQVRVUwkxCisjZGVmaW5lIFBBUl9DT05UUk9MIDIKKworZW51bSBjaGlwX3R5cGUgeyBSVEw4MDAyLCBSVEw4MDEyIH07CisKKyNkZWZpbmUgQ3RybF9MTmliUmVhZAkweDA4CS8qIExQX1BTRUxFQ1AgKi8KKyNkZWZpbmUgQ3RybF9ITmliUmVhZAkwCisjZGVmaW5lIEN0cmxfTE5pYldyaXRlCTB4MDgJLyogTFBfUFNFTEVDUCAqLworI2RlZmluZSBDdHJsX0hOaWJXcml0ZQkwCisjZGVmaW5lIEN0cmxfU2VsRGF0YQkweDA0CS8qIExQX1BJTklUUCAqLworI2RlZmluZSBDdHJsX0lSUUVOCTB4MTAJLyogTFBfUElOVEVOICovCisKKyNkZWZpbmUgRU9XCTB4RTAKKyNkZWZpbmUgRU9DCTB4RTAKKyNkZWZpbmUgV3JBZGRyCTB4NDAJLyogU2V0IGFkZHJlc3Mgb2YgRVBMQyByZWFkLCB3cml0ZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgUmRBZGRyCTB4QzAKKyNkZWZpbmUgSE5pYgkweDEwCisKK2VudW0gcGFnZTBfcmVncworeworICAgIC8qIFRoZSBmaXJzdCBzaXggcmVnaXN0ZXJzIGhvbGQgdGhlIGV0aGVybmV0IHBoeXNpY2FsIHN0YXRpb24gYWRkcmVzcy4gKi8KKyAgICBQQVIwID0gMCwgUEFSMSA9IDEsIFBBUjIgPSAyLCBQQVIzID0gMywgUEFSNCA9IDQsIFBBUjUgPSA1LAorICAgIFR4Q05UMCA9IDYsIFR4Q05UMSA9IDcsCQkvKiBUaGUgdHJhbnNtaXQgYnl0ZSBjb3VudC4gKi8KKyAgICBUeFNUQVQgPSA4LCBSeFNUQVQgPSA5LAkJLyogVHggYW5kIFJ4IHN0YXR1cy4gKi8KKyAgICBJU1IgPSAxMCwgSU1SID0gMTEsCQkJLyogSW50ZXJydXB0IHN0YXR1cyBhbmQgbWFzay4gKi8KKyAgICBDTVIxID0gMTIsCQkJCS8qIENvbW1hbmQgcmVnaXN0ZXIgMS4gKi8KKyAgICBDTVIyID0gMTMsCQkJCS8qIENvbW1hbmQgcmVnaXN0ZXIgMi4gKi8KKyAgICBNT0RTRUwgPSAxNCwJCQkvKiBNb2RlIHNlbGVjdCByZWdpc3Rlci4gKi8KKyAgICBNQVIgPSAxNCwJCQkJLyogTWVtb3J5IGFkZHJlc3MgcmVnaXN0ZXIgKD8pLiAqLworICAgIENNUjJfaCA9IDB4MWQsIH07CisKK2VudW0gZWVwYWdlX3JlZ3MKK3sgUFJPTV9DTUQgPSA2LCBQUk9NX0RBVEEgPSA3IH07CS8qIE5vdGUgdGhhdCBQUk9NX0NNRCBpcyBpbiB0aGUgImhpZ2giIGJpdHMuICovCisKKworI2RlZmluZSBJU1JfVHhPSwkweDAxCisjZGVmaW5lIElTUl9SeE9LCTB4MDQKKyNkZWZpbmUgSVNSX1R4RXJyCTB4MDIKKyNkZWZpbmUgSVNSaF9SeEVycgkweDExCS8qIElTUiwgaGlnaCBuaWJibGUgKi8KKworI2RlZmluZSBDTVIxaF9NVVgJMHgwOAkvKiBTZWxlY3QgcHJpbnRlciBtdWx0aXBsZXhvciBvbiA4MDEyLiAqLworI2RlZmluZSBDTVIxaF9SRVNFVAkweDA0CS8qIFJlc2V0LiAqLworI2RlZmluZSBDTVIxaF9SeEVOQUJMRQkweDAyCS8qIFJ4IHVuaXQgZW5hYmxlLiAgKi8KKyNkZWZpbmUgQ01SMWhfVHhFTkFCTEUJMHgwMQkvKiBUeCB1bml0IGVuYWJsZS4gICovCisjZGVmaW5lIENNUjFoX1R4UnhPRkYJMHgwMAorI2RlZmluZSBDTVIxX1JlWG1pdAkweDA4CS8qIFRyaWdnZXIgYSByZXRyYW5zbWl0LiAqLworI2RlZmluZSBDTVIxX1htaXQJMHgwNAkvKiBUcmlnZ2VyIGEgdHJhbnNtaXQuICovCisjZGVmaW5lCUNNUjFfSVJRCTB4MDIJLyogSW50ZXJydXB0IGFjdGl2ZS4gKi8KKyNkZWZpbmUJQ01SMV9CdWZFbmIJMHgwMQkvKiBFbmFibGUgdGhlIGJ1ZmZlcig/KS4gKi8KKyNkZWZpbmUJQ01SMV9OZXh0UGt0CTB4MDEJLyogRW5hYmxlIHRoZSBidWZmZXIoPykuICovCisKKyNkZWZpbmUgQ01SMl9OVUxMCTgKKyNkZWZpbmUgQ01SMl9JUlFPVVQJOQorI2RlZmluZSBDTVIyX1JBTVRFU1QJMTAKKyNkZWZpbmUgQ01SMl9FRVBST00JMTIJLyogU2V0IHRvIHBhZ2UgMSwgZm9yIHJlYWRpbmcgdGhlIEVFUFJPTS4gKi8KKworI2RlZmluZSBDTVIyaF9PRkYJMAkvKiBObyBhY2NlcHQgbW9kZS4gKi8KKyNkZWZpbmUgQ01SMmhfUGh5c2ljYWwJMQkvKiBBY2NlcHQgYSBwaHlzaWNhbCBhZGRyZXNzIG1hdGNoIG9ubHkuICovCisjZGVmaW5lIENNUjJoX05vcm1hbAkyCS8qIEFjY2VwdCBwaHlzaWNhbCBhbmQgYnJvYWRjYXN0IGFkZHJlc3MuICovCisjZGVmaW5lIENNUjJoX1BST01JU0MJMwkvKiBQcm9taXNjdW91cyBtb2RlLiAqLworCisvKiBBbiBpbmxpbmUgZnVuY3Rpb24gdXNlZCBiZWxvdzogaXQgZGlmZmVycyBmcm9tIGluYigpIGJ5IGV4cGxpY2l0bHkgcmV0dXJuIGFuIHVuc2lnbmVkCisgICBjaGFyLCBzYXZpbmcgYSB0cnVuY2F0aW9uLiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGluYnl0ZSh1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworICAgIHVuc2lnbmVkIGNoYXIgX3Y7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpbmIgJXcxLCViMCIgOiI9YSIgKF92KToiZCIgKHBvcnQpKTsKKyAgICByZXR1cm4gX3Y7Cit9CisKKy8qIFJlYWQgcmVnaXN0ZXIgT0ZGU0VULgorICAgVGhpcyBjb21tYW5kIHNob3VsZCBhbHdheXMgYmUgdGVybWluYXRlZCB3aXRoIHJlYWRfZW5kKCkuICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZF9uaWJibGUoc2hvcnQgcG9ydCwgdW5zaWduZWQgY2hhciBvZmZzZXQpCit7CisgICAgdW5zaWduZWQgY2hhciByZXR2YWw7CisgICAgb3V0YihFT0Mrb2Zmc2V0LCBwb3J0ICsgUEFSX0RBVEEpOworICAgIG91dGIoUmRBZGRyK29mZnNldCwgcG9ydCArIFBBUl9EQVRBKTsKKyAgICBpbmJ5dGUocG9ydCArIFBBUl9TVEFUVVMpOwkJLyogU2V0dGxpbmcgdGltZSBkZWxheSAqLworICAgIHJldHZhbCA9IGluYnl0ZShwb3J0ICsgUEFSX1NUQVRVUyk7CisgICAgb3V0YihFT0Mrb2Zmc2V0LCBwb3J0ICsgUEFSX0RBVEEpOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyogRnVuY3Rpb25zIGZvciBidWxrIGRhdGEgcmVhZC4gIFRoZSBpbnRlcnJ1cHQgbGluZSBpcyBhbHdheXMgZGlzYWJsZWQuICovCisvKiBHZXQgYSBieXRlIHVzaW5nIHJlYWQgbW9kZSAwLCByZWFkaW5nIGRhdGEgZnJvbSB0aGUgY29udHJvbCBsaW5lcy4gKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZWFkX2J5dGVfbW9kZTAoc2hvcnQgaW9hZGRyKQoreworICAgIHVuc2lnbmVkIGNoYXIgbG93X25pYjsKKworICAgIG91dGIoQ3RybF9MTmliUmVhZCwgaW9hZGRyICsgUEFSX0NPTlRST0wpOworICAgIGluYnl0ZShpb2FkZHIgKyBQQVJfU1RBVFVTKTsKKyAgICBsb3dfbmliID0gKGluYnl0ZShpb2FkZHIgKyBQQVJfU1RBVFVTKSA+PiAzKSAmIDB4MGY7CisgICAgb3V0YihDdHJsX0hOaWJSZWFkLCBpb2FkZHIgKyBQQVJfQ09OVFJPTCk7CisgICAgaW5ieXRlKGlvYWRkciArIFBBUl9TVEFUVVMpOwkvKiBTZXR0bGluZyB0aW1lIGRlbGF5IC0tIG5lZWRlZCEgICovCisgICAgaW5ieXRlKGlvYWRkciArIFBBUl9TVEFUVVMpOwkvKiBTZXR0bGluZyB0aW1lIGRlbGF5IC0tIG5lZWRlZCEgICovCisgICAgcmV0dXJuIGxvd19uaWIgfCAoKGluYnl0ZShpb2FkZHIgKyBQQVJfU1RBVFVTKSA8PCAxKSAmIDB4ZjApOworfQorCisvKiBUaGUgc2FtZSBhcyByZWFkX2J5dGVfbW9kZTAoKSwgYnV0IGRvZXMgbXVsdGlwbGUgaW5iKClzIGZvciBzdGFiaWxpdHkuICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZF9ieXRlX21vZGUyKHNob3J0IGlvYWRkcikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGxvd19uaWI7CisKKyAgICBvdXRiKEN0cmxfTE5pYlJlYWQsIGlvYWRkciArIFBBUl9DT05UUk9MKTsKKyAgICBpbmJ5dGUoaW9hZGRyICsgUEFSX1NUQVRVUyk7CisgICAgbG93X25pYiA9IChpbmJ5dGUoaW9hZGRyICsgUEFSX1NUQVRVUykgPj4gMykgJiAweDBmOworICAgIG91dGIoQ3RybF9ITmliUmVhZCwgaW9hZGRyICsgUEFSX0NPTlRST0wpOworICAgIGluYnl0ZShpb2FkZHIgKyBQQVJfU1RBVFVTKTsJLyogU2V0dGxpbmcgdGltZSBkZWxheSAtLSBuZWVkZWQhICAqLworICAgIHJldHVybiBsb3dfbmliIHwgKChpbmJ5dGUoaW9hZGRyICsgUEFSX1NUQVRVUykgPDwgMSkgJiAweGYwKTsKK30KKworLyogUmVhZCBhIGJ5dGUgdGhyb3VnaCB0aGUgZGF0YSByZWdpc3Rlci4gKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZWFkX2J5dGVfbW9kZTQoc2hvcnQgaW9hZGRyKQoreworICAgIHVuc2lnbmVkIGNoYXIgbG93X25pYjsKKworICAgIG91dGIoUmRBZGRyIHwgTUFSLCBpb2FkZHIgKyBQQVJfREFUQSk7CisgICAgbG93X25pYiA9IChpbmJ5dGUoaW9hZGRyICsgUEFSX1NUQVRVUykgPj4gMykgJiAweDBmOworICAgIG91dGIoUmRBZGRyIHwgSE5pYiB8IE1BUiwgaW9hZGRyICsgUEFSX0RBVEEpOworICAgIHJldHVybiBsb3dfbmliIHwgKChpbmJ5dGUoaW9hZGRyICsgUEFSX1NUQVRVUykgPDwgMSkgJiAweGYwKTsKK30KKworLyogUmVhZCBhIGJ5dGUgdGhyb3VnaCB0aGUgZGF0YSByZWdpc3RlciwgZG91YmxlIHJlYWRpbmcgdG8gYWxsb3cgc2V0dGxpbmcuICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZF9ieXRlX21vZGU2KHNob3J0IGlvYWRkcikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGxvd19uaWI7CisKKyAgICBvdXRiKFJkQWRkciB8IE1BUiwgaW9hZGRyICsgUEFSX0RBVEEpOworICAgIGluYnl0ZShpb2FkZHIgKyBQQVJfU1RBVFVTKTsKKyAgICBsb3dfbmliID0gKGluYnl0ZShpb2FkZHIgKyBQQVJfU1RBVFVTKSA+PiAzKSAmIDB4MGY7CisgICAgb3V0YihSZEFkZHIgfCBITmliIHwgTUFSLCBpb2FkZHIgKyBQQVJfREFUQSk7CisgICAgaW5ieXRlKGlvYWRkciArIFBBUl9TVEFUVVMpOworICAgIHJldHVybiBsb3dfbmliIHwgKChpbmJ5dGUoaW9hZGRyICsgUEFSX1NUQVRVUykgPDwgMSkgJiAweGYwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit3cml0ZV9yZWcoc2hvcnQgcG9ydCwgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisgICAgdW5zaWduZWQgY2hhciBvdXR2YWw7CisgICAgb3V0YihFT0MgfCByZWcsIHBvcnQgKyBQQVJfREFUQSk7CisgICAgb3V0dmFsID0gV3JBZGRyIHwgcmVnOworICAgIG91dGIob3V0dmFsLCBwb3J0ICsgUEFSX0RBVEEpOworICAgIG91dGIob3V0dmFsLCBwb3J0ICsgUEFSX0RBVEEpOwkvKiBEb3VibGUgd3JpdGUgZm9yIFBTLzIuICovCisKKyAgICBvdXR2YWwgJj0gMHhmMDsKKyAgICBvdXR2YWwgfD0gdmFsdWU7CisgICAgb3V0YihvdXR2YWwsIHBvcnQgKyBQQVJfREFUQSk7CisgICAgb3V0dmFsICY9IDB4MWY7CisgICAgb3V0YihvdXR2YWwsIHBvcnQgKyBQQVJfREFUQSk7CisgICAgb3V0YihvdXR2YWwsIHBvcnQgKyBQQVJfREFUQSk7CisKKyAgICBvdXRiKEVPQyB8IG91dHZhbCwgcG9ydCArIFBBUl9EQVRBKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit3cml0ZV9yZWdfaGlnaChzaG9ydCBwb3J0LCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIG91dHZhbCA9IEVPQyB8IEhOaWIgfCByZWc7CisKKyAgICBvdXRiKG91dHZhbCwgcG9ydCArIFBBUl9EQVRBKTsKKyAgICBvdXR2YWwgJj0gV3JBZGRyIHwgSE5pYiB8IDB4MGY7CisgICAgb3V0YihvdXR2YWwsIHBvcnQgKyBQQVJfREFUQSk7CisgICAgb3V0YihvdXR2YWwsIHBvcnQgKyBQQVJfREFUQSk7CS8qIERvdWJsZSB3cml0ZSBmb3IgUFMvMi4gKi8KKworICAgIG91dHZhbCA9IFdyQWRkciB8IEhOaWIgfCB2YWx1ZTsKKyAgICBvdXRiKG91dHZhbCwgcG9ydCArIFBBUl9EQVRBKTsKKyAgICBvdXR2YWwgJj0gSE5pYiB8IDB4MGY7CQkvKiBITmliIHwgdmFsdWUgKi8KKyAgICBvdXRiKG91dHZhbCwgcG9ydCArIFBBUl9EQVRBKTsKKyAgICBvdXRiKG91dHZhbCwgcG9ydCArIFBBUl9EQVRBKTsKKworICAgIG91dGIoRU9DIHwgSE5pYiB8IG91dHZhbCwgcG9ydCArIFBBUl9EQVRBKTsKK30KKworLyogV3JpdGUgYSBieXRlIG91dCB1c2luZyBuaWJibGUgbW9kZS4gIFRoZSBsb3cgbmliYmxlIGlzIHdyaXR0ZW4gZmlyc3QuICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3dyaXRlX3JlZ19ieXRlKHNob3J0IHBvcnQsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworICAgIHVuc2lnbmVkIGNoYXIgb3V0dmFsOworICAgIG91dGIoRU9DIHwgcmVnLCBwb3J0ICsgUEFSX0RBVEEpOyAJLyogUmVzZXQgdGhlIGFkZHJlc3MgcmVnaXN0ZXIuICovCisgICAgb3V0dmFsID0gV3JBZGRyIHwgcmVnOworICAgIG91dGIob3V0dmFsLCBwb3J0ICsgUEFSX0RBVEEpOworICAgIG91dGIob3V0dmFsLCBwb3J0ICsgUEFSX0RBVEEpOwkvKiBEb3VibGUgd3JpdGUgZm9yIFBTLzIuICovCisKKyAgICBvdXRiKChvdXR2YWwgJiAweGYwKSB8ICh2YWx1ZSAmIDB4MGYpLCBwb3J0ICsgUEFSX0RBVEEpOworICAgIG91dGIodmFsdWUgJiAweDBmLCBwb3J0ICsgUEFSX0RBVEEpOworICAgIHZhbHVlID4+PSA0OworICAgIG91dGIodmFsdWUsIHBvcnQgKyBQQVJfREFUQSk7CisgICAgb3V0YigweDEwIHwgdmFsdWUsIHBvcnQgKyBQQVJfREFUQSk7CisgICAgb3V0YigweDEwIHwgdmFsdWUsIHBvcnQgKyBQQVJfREFUQSk7CisKKyAgICBvdXRiKEVPQyAgfCB2YWx1ZSwgcG9ydCArIFBBUl9EQVRBKTsgCS8qIFJlc2V0IHRoZSBhZGRyZXNzIHJlZ2lzdGVyLiAqLworfQorCisvKgorICogQnVsayBkYXRhIHdyaXRlcyB0byB0aGUgcGFja2V0IGJ1ZmZlci4gIFRoZSBpbnRlcnJ1cHQgbGluZSByZW1haW5zIGVuYWJsZWQuCisgKiBUaGUgZmlyc3QsIGZhc3RlciBtZXRob2QgdXNlcyBvbmx5IHRoZSBkYXRhcG9ydCAoZGF0YSBtb2RlcyAwLCAyICYgNCkuCisgKiBUaGUgc2Vjb25kIChiYWNrdXApIG1ldGhvZCB1c2VzIGRhdGEgYW5kIGNvbnRyb2wgcmVncyAobW9kZXMgMSwgMyAmIDUpLgorICogSXQgc2hvdWxkIG9ubHkgYmUgbmVlZGVkIHdoZW4gdGhlcmUgaXMgc2tldyBiZXR3ZWVuIHRoZSBpbmRpdmlkdWFsIGRhdGEKKyAqIGxpbmVzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfYnl0ZV9tb2RlMChzaG9ydCBpb2FkZHIsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisgICAgb3V0Yih2YWx1ZSAmIDB4MGYsIGlvYWRkciArIFBBUl9EQVRBKTsKKyAgICBvdXRiKCh2YWx1ZT4+NCkgfCAweDEwLCBpb2FkZHIgKyBQQVJfREFUQSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9ieXRlX21vZGUxKHNob3J0IGlvYWRkciwgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKyAgICBvdXRiKHZhbHVlICYgMHgwZiwgaW9hZGRyICsgUEFSX0RBVEEpOworICAgIG91dGIoQ3RybF9JUlFFTiB8IEN0cmxfTE5pYldyaXRlLCBpb2FkZHIgKyBQQVJfQ09OVFJPTCk7CisgICAgb3V0YigodmFsdWU+PjQpIHwgMHgxMCwgaW9hZGRyICsgUEFSX0RBVEEpOworICAgIG91dGIoQ3RybF9JUlFFTiB8IEN0cmxfSE5pYldyaXRlLCBpb2FkZHIgKyBQQVJfQ09OVFJPTCk7Cit9CisKKy8qIFdyaXRlIDE2Yml0IFZBTFVFIHRvIHRoZSBwYWNrZXQgYnVmZmVyOiB0aGUgc2FtZSBhcyBhYm92ZSBqdXN0IGRvdWJsZWQuICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfd29yZF9tb2RlMChzaG9ydCBpb2FkZHIsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworICAgIG91dGIodmFsdWUgJiAweDBmLCBpb2FkZHIgKyBQQVJfREFUQSk7CisgICAgdmFsdWUgPj49IDQ7CisgICAgb3V0YigodmFsdWUgJiAweDBmKSB8IDB4MTAsIGlvYWRkciArIFBBUl9EQVRBKTsKKyAgICB2YWx1ZSA+Pj0gNDsKKyAgICBvdXRiKHZhbHVlICYgMHgwZiwgaW9hZGRyICsgUEFSX0RBVEEpOworICAgIHZhbHVlID4+PSA0OworICAgIG91dGIoKHZhbHVlICYgMHgwZikgfCAweDEwLCBpb2FkZHIgKyBQQVJfREFUQSk7Cit9CisKKy8qICBFRVBST01fQ3RybCBiaXRzLiAqLworI2RlZmluZSBFRV9TSElGVF9DTEsJMHgwNAkvKiBFRVBST00gc2hpZnQgY2xvY2suICovCisjZGVmaW5lIEVFX0NTCQkweDAyCS8qIEVFUFJPTSBjaGlwIHNlbGVjdC4gKi8KKyNkZWZpbmUgRUVfQ0xLX0hJR0gJMHgxMgorI2RlZmluZSBFRV9DTEtfTE9XCTB4MTYKKyNkZWZpbmUgRUVfREFUQV9XUklURQkweDAxCS8qIEVFUFJPTSBjaGlwIGRhdGEgaW4uICovCisjZGVmaW5lIEVFX0RBVEFfUkVBRAkweDA4CS8qIEVFUFJPTSBjaGlwIGRhdGEgb3V0LiAqLworCisvKiBEZWxheSBiZXR3ZWVuIEVFUFJPTSBjbG9jayB0cmFuc2l0aW9ucy4gKi8KKyNkZWZpbmUgZWVwcm9tX2RlbGF5KHRpY2tzKSBcCitkbyB7IGludCBfaSA9IDQwOyB3aGlsZSAoLS1faSA+IDApIHsgX19TTE9XX0RPV05fSU87IH19IHdoaWxlICgwKQorCisvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfQ01EKG9mZnNldCkJKCgoNSA8PCA2KSArIChvZmZzZXQpKSA8PCAxNykKKyNkZWZpbmUgRUVfUkVBRChvZmZzZXQpIAkoKCg2IDw8IDYpICsgKG9mZnNldCkpIDw8IDE3KQorI2RlZmluZSBFRV9FUkFTRShvZmZzZXQpCSgoKDcgPDwgNikgKyAob2Zmc2V0KSkgPDwgMTcpCisjZGVmaW5lIEVFX0NNRF9TSVpFCTI3CS8qIFRoZSBjb21tYW5kK2FkZHJlc3MrZGF0YSBzaXplLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5jIGIvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMmVmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmMKQEAgLTAsMCArMSwyMjczIEBACisvKgorICoKKyAqIEFsY2hlbXkgQXUxeDAwIGV0aGVybmV0IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDAxLDIwMDIsMjAwMyBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIENvcHlyaWdodCAyMDAyIFRpbWVTeXMgQ29ycC4KKyAqIEFkZGVkIGV0aHRvb2wvbWlpLXRvb2wgc3VwcG9ydCwKKyAqIENvcHlyaWdodCAyMDA0IE1hdHQgUG9ydGVyIDxtcG9ydGVyQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKiBVcGRhdGU6IDIwMDQgQmpvZXJuIFJpZW1lciwgcmllbWVyQGZva3VzLmZyYXVuaG9mZXIuZGUgCisgKiBvciByaWVtZXJAcmllbWVyLW50LmRlOiBmaXhlZCB0aGUgbGluayBiZWF0IGRldGVjdGlvbiB3aXRoIAorICogaW9jdGxzIChTSU9DR01JSVBIWSkKKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICAJcHBvcG92QG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20KKyAqCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKSBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqCisgKiAKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KKyNpbmNsdWRlIDxhc20vY3B1Lmg+CisjaW5jbHVkZSAiYXUxMDAwX2V0aC5oIgorCisjaWZkZWYgQVUxMDAwX0VUSF9ERUJVRworc3RhdGljIGludCBhdTEwMDBfZGVidWcgPSA1OworI2Vsc2UKK3N0YXRpYyBpbnQgYXUxMDAwX2RlYnVnID0gMzsKKyNlbmRpZgorCisjZGVmaW5lIERSVl9OQU1FCSJhdTEwMDBldGgiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjUiCisjZGVmaW5lIERSVl9BVVRIT1IJIlBldGUgUG9wb3YgPHBwb3BvdkBlbWJlZGRlZGFsbGV5LmNvbT4iCisjZGVmaW5lIERSVl9ERVNDCSJBdTF4eHggb24tY2hpcCBFdGhlcm5ldCBkcml2ZXIiCisKK01PRFVMRV9BVVRIT1IoRFJWX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJWX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyBwcm90b3R5cGVzCitzdGF0aWMgdm9pZCBoYXJkX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBlbmFibGVfcnhfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKiBhdTEwMDBfcHJvYmUodTMyIGlvYWRkciwgaW50IGlycSwgaW50IHBvcnRfbnVtKTsKK3N0YXRpYyBpbnQgYXUxMDAwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IGF1MTAwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBhdTEwMDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IGF1MTAwMF90eChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgYXUxMDAwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGlycXJldHVybl90IGF1MTAwMF9pbnRlcnJ1cHQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIHZvaWQgYXUxMDAwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IGF1MTAwMF9zZXRfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdTEwMDBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV90eF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIsIHUzMik7CitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3J4X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICosIHUzMik7CitzdGF0aWMgdm9pZCBhdTEwMDBfdGltZXIodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgaW50IGF1MTAwMF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50KTsKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCBpbnQsIHUxNik7CitzdGF0aWMgdm9pZCBkdW1wX21paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkKTsKKworLy8gZXh0ZXJucworZXh0ZXJuICB2b2lkIGFja19yaXNlX2VkZ2VfaXJxKHVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IGdldF9ldGhlcm5ldF9hZGRyKGNoYXIgKmV0aGVybmV0X2FkZHIpOworZXh0ZXJuIHZvaWQgc3RyMmVhZGRyKHVuc2lnbmVkIGNoYXIgKmVhLCB1bnNpZ25lZCBjaGFyICpzdHIpOworZXh0ZXJuIGNoYXIgKiBfX2luaXQgcHJvbV9nZXRjbWRsaW5lKHZvaWQpOworCisvKgorICogVGhlb3J5IG9mIG9wZXJhdGlvbgorICoKKyAqIFRoZSBBdTEwMDAgTUFDcyB1c2UgYSBzaW1wbGUgcnggYW5kIHR4IGRlc2NyaXB0b3IgcmluZyBzY2hlbWUuIAorICogVGhlcmUgYXJlIGZvdXIgcmVjZWl2ZSBhbmQgZm91ciB0cmFuc21pdCBkZXNjcmlwdG9ycy4gIFRoZXNlIAorICogZGVzY3JpcHRvcnMgYXJlIG5vdCBpbiBtZW1vcnk7IHJhdGhlciwgdGhleSBhcmUganVzdCBhIHNldCBvZiAKKyAqIGhhcmR3YXJlIHJlZ2lzdGVycy4KKyAqCisgKiBTaW5jZSB0aGUgQXUxMDAwIGhhcyBhIGNvaGVyZW50IGRhdGEgY2FjaGUsIHRoZSByZWNlaXZlIGFuZAorICogdHJhbnNtaXQgYnVmZmVycyBhcmUgYWxsb2NhdGVkIGZyb20gdGhlIEtTRUcwIHNlZ21lbnQuIFRoZSAKKyAqIGhhcmR3YXJlIHJlZ2lzdGVycywgaG93ZXZlciwgYXJlIHN0aWxsIG1hcHBlZCBhdCBLU0VHMSB0bworICogbWFrZSBzdXJlIHRoZXJlJ3Mgbm8gb3V0LW9mLW9yZGVyIHdyaXRlcywgYW5kIHRoYXQgYWxsIHdyaXRlcworICogY29tcGxldGUgaW1tZWRpYXRlbHkuCisgKi8KKworLyogVGhlc2UgYWRkcmVzc2VzIGFyZSBvbmx5IHVzZWQgaWYgeWFtb24gZG9lc24ndCB0ZWxsIHVzIHdoYXQKKyAqIHRoZSBtYWMgYWRkcmVzcyBpcywgYW5kIHRoZSBtYWMgYWRkcmVzcyBpcyBub3QgcGFzc2VkIG9uIHRoZQorICogY29tbWFuZCBsaW5lLgorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBhdTEwMDBfbWFjX2FkZHJbNl0gX19kZXZpbml0ZGF0YSA9IHsgCisJMHgwMCwgMHg1MCwgMHhjMiwgMHgwYywgMHgzMCwgMHgwMAorfTsKKworI2RlZmluZSBuaWJzd2FwKHgpICgoKCh4KSA+PiA0KSAmIDB4MGYpIHwgKCgoeCkgPDwgNCkgJiAweGYwKSkKKyNkZWZpbmUgUlVOX0FUKHgpIChqaWZmaWVzICsgKHgpKQorCisvLyBGb3IgcmVhZGluZy93cml0aW5nIDMyLWJpdCB3b3JkcyBmcm9tL3RvIERNQSBtZW1vcnkKKyNkZWZpbmUgY3B1X3RvX2RtYTMyIGNwdV90b19iZTMyCisjZGVmaW5lIGRtYTMyX3RvX2NwdSBiZTMyX3RvX2NwdQorCitzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1X21hY3NbTlVNX0VUSF9JTlRFUkZBQ0VTXTsKKworLyogRklYTUUgCisgKiBBbGwgb2YgdGhlIFBIWSBjb2RlIHJlYWxseSBzaG91bGQgYmUgZGV0YWNoZWQgZnJvbSB0aGUgTUFDIAorICogY29kZS4KKyAqLworCisvKiBEZWZhdWx0IGFkdmVydGlzZSAqLworI2RlZmluZSBHRU5NSUlfREVGQVVMVF9BRFZFUlRJU0UgXAorCUFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfCBcCisJQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwgXAorCUFEVkVSVElTRURfQXV0b25lZworCisjZGVmaW5lIEdFTk1JSV9ERUZBVUxUX0ZFQVRVUkVTIFwKKwlTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8IFwKKwlTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwgXAorCVNVUFBPUlRFRF9BdXRvbmVnCisKK3N0YXRpYyBjaGFyICpwaHlfbGlua1tdID0gCit7CSJ1bmtub3duIiwgCisJIjEwQmFzZTIiLCAiMTBCYXNlVCIsIAorCSJBVUkiLAorCSIxMDBCYXNlVCIsICIxMDBCYXNlVFgiLCAiMTAwQmFzZUZYIgorfTsKKworaW50IGJjbV81MjAxX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyKQoreworCXMxNiBkYXRhOworCQorCS8qIFN0b3AgYXV0by1uZWdvdGlhdGlvbiAqLworCWRhdGEgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wsIGRhdGEgJiB+TUlJX0NOVExfQVVUTyk7CisKKwkvKiBTZXQgYWR2ZXJ0aXNlbWVudCB0byAxMC8xMDAgYW5kIEhhbGYvRnVsbCBkdXBsZXgKKwkgKiAoZnVsbCBjYXBhYmlsaXRpZXMpICovCisJZGF0YSA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQU5BRFYpOworCWRhdGEgfD0gTUlJX05XQVlfVFggfCBNSUlfTldBWV9UWF9GRFggfCBNSUlfTldBWV9UX0ZEWCB8IE1JSV9OV0FZX1Q7CisJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQU5BRFYsIGRhdGEpOworCQorCS8qIFJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbiAqLworCWRhdGEgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCWRhdGEgfD0gTUlJX0NOVExfUlNUX0FVVE8gfCBNSUlfQ05UTF9BVVRPOworCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wsIGRhdGEpOworCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpIAorCQlkdW1wX21paShkZXYsIHBoeV9hZGRyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJjbV81MjAxX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikKK3sKKwlzMTYgbWlpX2NvbnRyb2wsIHRpbWVvdXQ7CisJCisJbWlpX2NvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wsIG1paV9jb250cm9sIHwgTUlJX0NOVExfUkVTRVQpOworCW1kZWxheSgxKTsKKwlmb3IgKHRpbWVvdXQgPSAxMDA7IHRpbWVvdXQgPiAwOyAtLXRpbWVvdXQpIHsKKwkJbWlpX2NvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCQlpZiAoKG1paV9jb250cm9sICYgTUlJX0NOVExfUkVTRVQpID09IDApCisJCQlicmVhazsKKwkJbWRlbGF5KDEpOworCX0KKwlpZiAobWlpX2NvbnRyb2wgJiBNSUlfQ05UTF9SRVNFVCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzIFBIWSByZXNldCB0aW1lb3V0ICFcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCAKK2JjbV81MjAxX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIHUxNiAqbGluaywgdTE2ICpzcGVlZCkKK3sKKwl1MTYgbWlpX2RhdGE7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXA7CisKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgImJjbV81MjAxX3N0YXR1cyBlcnJvcjogTlVMTCBkZXZcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJbWlpX2RhdGEgPSBtZGlvX3JlYWQoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKwlpZiAobWlpX2RhdGEgJiBNSUlfU1RBVF9MSU5LKSB7CisJCSpsaW5rID0gMTsKKwkJbWlpX2RhdGEgPSBtZGlvX3JlYWQoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQVVYX0NOVFJMKTsKKwkJaWYgKG1paV9kYXRhICYgTUlJX0FVWF8xMDApIHsKKwkJCWlmIChtaWlfZGF0YSAmIE1JSV9BVVhfRkRYKSB7CisJCQkJKnNwZWVkID0gSUZfUE9SVF8xMDBCQVNFRlg7CisJCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMDBCQVNFRlg7CisJCQl9CisJCQllbHNlIHsKKwkJCQkqc3BlZWQgPSBJRl9QT1JUXzEwMEJBU0VUWDsKKwkJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwMEJBU0VUWDsKKwkJCX0KKwkJfQorCQllbHNlICB7CisJCQkqc3BlZWQgPSBJRl9QT1JUXzEwQkFTRVQ7CisJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwQkFTRVQ7CisJCX0KKworCX0KKwllbHNlIHsKKwkJKmxpbmsgPSAwOworCQkqc3BlZWQgPSAwOworCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUX1VOS05PV047CisJfQorCXJldHVybiAwOworfQorCitpbnQgbHNpXzgwMjI3X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyKQoreworCWlmIChhdTEwMDBfZGVidWcgPiA0KQorCQlwcmludGsoImxzaV84MDIyN19pbml0XG4iKTsKKworCS8qIHJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbiAqLworCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wsCisJCSAgIE1JSV9DTlRMX0YxMDAgfCBNSUlfQ05UTF9BVVRPIHwgTUlJX0NOVExfUlNUX0FVVE8pOyAvLyB8IE1JSV9DTlRMX0ZEWCk7CisJbWRlbGF5KDEpOworCisJLyogc2V0IHVwIExFRHMgdG8gY29ycmVjdCBkaXNwbGF5ICovCisjaWZkZWYgQ09ORklHX01JUFNfTVRYMQorCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgMTcsIDB4ZmY4MCk7CisjZWxzZQorCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgMTcsIDB4ZmZjMCk7CisjZW5kaWYKKworCWlmIChhdTEwMDBfZGVidWcgPiA0KQorCQlkdW1wX21paShkZXYsIHBoeV9hZGRyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxzaV84MDIyN19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIpCit7CisJczE2IG1paV9jb250cm9sLCB0aW1lb3V0OworCQorCWlmIChhdTEwMDBfZGVidWcgPiA0KSB7CisJCXByaW50aygibHNpXzgwMjI3X3Jlc2V0XG4iKTsKKwkJZHVtcF9taWkoZGV2LCBwaHlfYWRkcik7CisJfQorCisJbWlpX2NvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wsIG1paV9jb250cm9sIHwgTUlJX0NOVExfUkVTRVQpOworCW1kZWxheSgxKTsKKwlmb3IgKHRpbWVvdXQgPSAxMDA7IHRpbWVvdXQgPiAwOyAtLXRpbWVvdXQpIHsKKwkJbWlpX2NvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCQlpZiAoKG1paV9jb250cm9sICYgTUlJX0NOVExfUkVTRVQpID09IDApCisJCQlicmVhazsKKwkJbWRlbGF5KDEpOworCX0KKwlpZiAobWlpX2NvbnRyb2wgJiBNSUlfQ05UTF9SRVNFVCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzIFBIWSByZXNldCB0aW1lb3V0ICFcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludAorbHNpXzgwMjI3X3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIHUxNiAqbGluaywgdTE2ICpzcGVlZCkKK3sKKwl1MTYgbWlpX2RhdGE7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXA7CisKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgImxzaV84MDIyN19zdGF0dXMgZXJyb3I6IE5VTEwgZGV2XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlhdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX1NUQVRVUyk7CisJaWYgKG1paV9kYXRhICYgTUlJX1NUQVRfTElOSykgeworCQkqbGluayA9IDE7CisJCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0xTSV9QSFlfU1RBVCk7CisJCWlmIChtaWlfZGF0YSAmIE1JSV9MU0lfUEhZX1NUQVRfU1BEKSB7CisJCQlpZiAobWlpX2RhdGEgJiBNSUlfTFNJX1BIWV9TVEFUX0ZEWCkgeworCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFTRUZYOworCQkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTAwQkFTRUZYOworCQkJfQorCQkJZWxzZSB7CisJCQkJKnNwZWVkID0gSUZfUE9SVF8xMDBCQVNFVFg7CisJCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMDBCQVNFVFg7CisJCQl9CisJCX0KKwkJZWxzZSAgeworCQkJKnNwZWVkID0gSUZfUE9SVF8xMEJBU0VUOworCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMEJBU0VUOworCQl9CisKKwl9CisJZWxzZSB7CisJCSpsaW5rID0gMDsKKwkJKnNwZWVkID0gMDsKKwkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF9VTktOT1dOOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGFtNzljOTAxX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyKQoreworCXByaW50aygiYW03OWM5MDFfaW5pdFxuIik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbTc5YzkwMV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIpCit7CisJcHJpbnRrKCJhbTc5YzkwMV9yZXNldFxuIik7CisJcmV0dXJuIDA7Cit9CisKK2ludCAKK2FtNzljOTAxX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIHUxNiAqbGluaywgdTE2ICpzcGVlZCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IGFtNzljODc0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyKQoreworCXMxNiBkYXRhOworCisJLyogNzljODc0IGhhcyBxdWl0IHJlc2VtYmxlZCBiaXQgYXNzaWdubWVudHMgdG8gQkNNNTIwMSAqLworCWlmIChhdTEwMDBfZGVidWcgPiA0KQorCQlwcmludGsoImFtNzljODQ3X2luaXRcbiIpOworCisJLyogU3RvcCBhdXRvLW5lZ290aWF0aW9uICovCisJZGF0YSA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7CisJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgZGF0YSAmIH5NSUlfQ05UTF9BVVRPKTsKKworCS8qIFNldCBhZHZlcnRpc2VtZW50IHRvIDEwLzEwMCBhbmQgSGFsZi9GdWxsIGR1cGxleAorCSAqIChmdWxsIGNhcGFiaWxpdGllcykgKi8KKwlkYXRhID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9BTkFEVik7CisJZGF0YSB8PSBNSUlfTldBWV9UWCB8IE1JSV9OV0FZX1RYX0ZEWCB8IE1JSV9OV0FZX1RfRkRYIHwgTUlJX05XQVlfVDsKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9BTkFEViwgZGF0YSk7CisJCisJLyogUmVzdGFydCBhdXRvLW5lZ290aWF0aW9uICovCisJZGF0YSA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7CisJZGF0YSB8PSBNSUlfQ05UTF9SU1RfQVVUTyB8IE1JSV9DTlRMX0FVVE87CisKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBkYXRhKTsKKworCWlmIChhdTEwMDBfZGVidWcgPiA0KSBkdW1wX21paShkZXYsIHBoeV9hZGRyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFtNzljODc0X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikKK3sKKwlzMTYgbWlpX2NvbnRyb2wsIHRpbWVvdXQ7CisJCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpCisJCXByaW50aygiYW03OWM4NzRfcmVzZXRcbiIpOworCisJbWlpX2NvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wsIG1paV9jb250cm9sIHwgTUlJX0NOVExfUkVTRVQpOworCW1kZWxheSgxKTsKKwlmb3IgKHRpbWVvdXQgPSAxMDA7IHRpbWVvdXQgPiAwOyAtLXRpbWVvdXQpIHsKKwkJbWlpX2NvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCQlpZiAoKG1paV9jb250cm9sICYgTUlJX0NOVExfUkVTRVQpID09IDApCisJCQlicmVhazsKKwkJbWRlbGF5KDEpOworCX0KKwlpZiAobWlpX2NvbnRyb2wgJiBNSUlfQ05UTF9SRVNFVCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzIFBIWSByZXNldCB0aW1lb3V0ICFcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCAKK2FtNzljODc0X3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIHUxNiAqbGluaywgdTE2ICpzcGVlZCkKK3sKKwl1MTYgbWlpX2RhdGE7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXA7CisKKwkvLyBwcmludGsoImFtNzljODc0X3N0YXR1c1xuIik7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbTc5Yzg3NF9zdGF0dXMgZXJyb3I6IE5VTEwgZGV2XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX1NUQVRVUyk7CisKKwlpZiAobWlpX2RhdGEgJiBNSUlfU1RBVF9MSU5LKSB7CisJCSpsaW5rID0gMTsKKwkJbWlpX2RhdGEgPSBtZGlvX3JlYWQoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQU1EX1BIWV9TVEFUKTsKKwkJaWYgKG1paV9kYXRhICYgTUlJX0FNRF9QSFlfU1RBVF9TUEQpIHsKKwkJCWlmIChtaWlfZGF0YSAmIE1JSV9BTURfUEhZX1NUQVRfRkRYKSB7CisJCQkJKnNwZWVkID0gSUZfUE9SVF8xMDBCQVNFRlg7CisJCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMDBCQVNFRlg7CisJCQl9CisJCQllbHNlIHsKKwkJCQkqc3BlZWQgPSBJRl9QT1JUXzEwMEJBU0VUWDsKKwkJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwMEJBU0VUWDsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCSpzcGVlZCA9IElGX1BPUlRfMTBCQVNFVDsKKwkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTBCQVNFVDsKKwkJfQorCisJfQorCWVsc2UgeworCQkqbGluayA9IDA7CisJCSpzcGVlZCA9IDA7CisJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfVU5LTk9XTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBseHQ5NzFhX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyKQoreworCWlmIChhdTEwMDBfZGVidWcgPiA0KQorCQlwcmludGsoImx4dDk3MWFfaW5pdFxuIik7CisKKwkvKiByZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24gKi8KKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLAorCQkgICBNSUlfQ05UTF9GMTAwIHwgTUlJX0NOVExfQVVUTyB8IE1JSV9DTlRMX1JTVF9BVVRPIHwgTUlJX0NOVExfRkRYKTsKKworCS8qIHNldCB1cCBMRURzIHRvIGNvcnJlY3QgZGlzcGxheSAqLworCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgMjAsIDB4MDQyMik7CisKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkKKwkJZHVtcF9taWkoZGV2LCBwaHlfYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBseHQ5NzFhX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikKK3sKKwlzMTYgbWlpX2NvbnRyb2wsIHRpbWVvdXQ7CisJCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpIHsKKwkJcHJpbnRrKCJseHQ5NzFhX3Jlc2V0XG4iKTsKKwkJZHVtcF9taWkoZGV2LCBwaHlfYWRkcik7CisJfQorCisJbWlpX2NvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wsIG1paV9jb250cm9sIHwgTUlJX0NOVExfUkVTRVQpOworCW1kZWxheSgxKTsKKwlmb3IgKHRpbWVvdXQgPSAxMDA7IHRpbWVvdXQgPiAwOyAtLXRpbWVvdXQpIHsKKwkJbWlpX2NvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCQlpZiAoKG1paV9jb250cm9sICYgTUlJX0NOVExfUkVTRVQpID09IDApCisJCQlicmVhazsKKwkJbWRlbGF5KDEpOworCX0KKwlpZiAobWlpX2NvbnRyb2wgJiBNSUlfQ05UTF9SRVNFVCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzIFBIWSByZXNldCB0aW1lb3V0ICFcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludAorbHh0OTcxYV9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyLCB1MTYgKmxpbmssIHUxNiAqc3BlZWQpCit7CisJdTE2IG1paV9kYXRhOworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJseHQ5NzFhX3N0YXR1cyBlcnJvcjogTlVMTCBkZXZcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJbWlpX2RhdGEgPSBtZGlvX3JlYWQoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKwlpZiAobWlpX2RhdGEgJiBNSUlfU1RBVF9MSU5LKSB7CisJCSpsaW5rID0gMTsKKwkJbWlpX2RhdGEgPSBtZGlvX3JlYWQoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfSU5URUxfUEhZX1NUQVQpOworCQlpZiAobWlpX2RhdGEgJiBNSUlfSU5URUxfUEhZX1NUQVRfU1BEKSB7CisJCQlpZiAobWlpX2RhdGEgJiBNSUlfSU5URUxfUEhZX1NUQVRfRkRYKSB7CisJCQkJKnNwZWVkID0gSUZfUE9SVF8xMDBCQVNFRlg7CisJCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMDBCQVNFRlg7CisJCQl9CisJCQllbHNlIHsKKwkJCQkqc3BlZWQgPSBJRl9QT1JUXzEwMEJBU0VUWDsKKwkJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwMEJBU0VUWDsKKwkJCX0KKwkJfQorCQllbHNlICB7CisJCQkqc3BlZWQgPSBJRl9QT1JUXzEwQkFTRVQ7CisJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwQkFTRVQ7CisJCX0KKworCX0KKwllbHNlIHsKKwkJKmxpbmsgPSAwOworCQkqc3BlZWQgPSAwOworCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUX1VOS05PV047CisJfQorCXJldHVybiAwOworfQorCitpbnQga3M4OTk1bV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikKK3sKKwlzMTYgZGF0YTsKKwkKKy8vCXByaW50aygia3M4OTk1bV9pbml0XG4iKTsKKwkvKiBTdG9wIGF1dG8tbmVnb3RpYXRpb24gKi8KKwlkYXRhID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBkYXRhICYgfk1JSV9DTlRMX0FVVE8pOworCisJLyogU2V0IGFkdmVydGlzZW1lbnQgdG8gMTAvMTAwIGFuZCBIYWxmL0Z1bGwgZHVwbGV4CisJICogKGZ1bGwgY2FwYWJpbGl0aWVzKSAqLworCWRhdGEgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0FOQURWKTsKKwlkYXRhIHw9IE1JSV9OV0FZX1RYIHwgTUlJX05XQVlfVFhfRkRYIHwgTUlJX05XQVlfVF9GRFggfCBNSUlfTldBWV9UOworCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0FOQURWLCBkYXRhKTsKKwkKKwkvKiBSZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24gKi8KKwlkYXRhID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwlkYXRhIHw9IE1JSV9DTlRMX1JTVF9BVVRPIHwgTUlJX0NOVExfQVVUTzsKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBkYXRhKTsKKworCWlmIChhdTEwMDBfZGVidWcgPiA0KSBkdW1wX21paShkZXYsIHBoeV9hZGRyKTsKKworCXJldHVybiAwOworfQorCitpbnQga3M4OTk1bV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIpCit7CisJczE2IG1paV9jb250cm9sLCB0aW1lb3V0OworCQorLy8JcHJpbnRrKCJrczg5OTVtX3Jlc2V0XG4iKTsKKwltaWlfY29udHJvbCA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7CisJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgbWlpX2NvbnRyb2wgfCBNSUlfQ05UTF9SRVNFVCk7CisJbWRlbGF5KDEpOworCWZvciAodGltZW91dCA9IDEwMDsgdGltZW91dCA+IDA7IC0tdGltZW91dCkgeworCQltaWlfY29udHJvbCA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7CisJCWlmICgobWlpX2NvbnRyb2wgJiBNSUlfQ05UTF9SRVNFVCkgPT0gMCkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisJfQorCWlmIChtaWlfY29udHJvbCAmIE1JSV9DTlRMX1JFU0VUKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgUEhZIHJlc2V0IHRpbWVvdXQgIVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGtzODk5NW1fc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkciwgdTE2ICpsaW5rLCB1MTYgKnNwZWVkKQoreworCXUxNiBtaWlfZGF0YTsKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cDsKKworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAia3M4OTk1bV9zdGF0dXMgZXJyb3I6IE5VTEwgZGV2XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlhdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX1NUQVRVUyk7CisJaWYgKG1paV9kYXRhICYgTUlJX1NUQVRfTElOSykgeworCQkqbGluayA9IDE7CisJCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0FVWF9DTlRSTCk7CisJCWlmIChtaWlfZGF0YSAmIE1JSV9BVVhfMTAwKSB7CisJCQlpZiAobWlpX2RhdGEgJiBNSUlfQVVYX0ZEWCkgeworCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFTRUZYOworCQkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTAwQkFTRUZYOworCQkJfQorCQkJZWxzZSB7CisJCQkJKnNwZWVkID0gSUZfUE9SVF8xMDBCQVNFVFg7CisJCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMDBCQVNFVFg7CisJCQl9CisJCX0KKwkJZWxzZSAgewkJCQkJCQkJCQkJCisJCQkqc3BlZWQgPSBJRl9QT1JUXzEwQkFTRVQ7CisJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwQkFTRVQ7CisJCX0KKworCX0KKwllbHNlIHsKKwkJKmxpbmsgPSAwOworCQkqc3BlZWQgPSAwOworCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUX1VOS05PV047CisJfQorCXJldHVybiAwOworfQorCitpbnQKK3Ntc2NfODNDMTg1X2luaXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikKK3sKKwlzMTYgZGF0YTsKKworCWlmIChhdTEwMDBfZGVidWcgPiA0KQorCQlwcmludGsoInNtc2NfODNDMTg1X2luaXRcbiIpOworCisJLyogU3RvcCBhdXRvLW5lZ290aWF0aW9uICovCisJZGF0YSA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7CisJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgZGF0YSAmIH5NSUlfQ05UTF9BVVRPKTsKKworCS8qIFNldCBhZHZlcnRpc2VtZW50IHRvIDEwLzEwMCBhbmQgSGFsZi9GdWxsIGR1cGxleAorCSAqIChmdWxsIGNhcGFiaWxpdGllcykgKi8KKwlkYXRhID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9BTkFEVik7CisJZGF0YSB8PSBNSUlfTldBWV9UWCB8IE1JSV9OV0FZX1RYX0ZEWCB8IE1JSV9OV0FZX1RfRkRYIHwgTUlJX05XQVlfVDsKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9BTkFEViwgZGF0YSk7CisJCisJLyogUmVzdGFydCBhdXRvLW5lZ290aWF0aW9uICovCisJZGF0YSA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7CisJZGF0YSB8PSBNSUlfQ05UTF9SU1RfQVVUTyB8IE1JSV9DTlRMX0FVVE87CisKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBkYXRhKTsKKworCWlmIChhdTEwMDBfZGVidWcgPiA0KSBkdW1wX21paShkZXYsIHBoeV9hZGRyKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitzbXNjXzgzQzE4NV9yZXNldCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyKQoreworCXMxNiBtaWlfY29udHJvbCwgdGltZW91dDsKKwkKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkKKwkJcHJpbnRrKCJzbXNjXzgzQzE4NV9yZXNldFxuIik7CisKKwltaWlfY29udHJvbCA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7CisJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgbWlpX2NvbnRyb2wgfCBNSUlfQ05UTF9SRVNFVCk7CisJbWRlbGF5KDEpOworCWZvciAodGltZW91dCA9IDEwMDsgdGltZW91dCA+IDA7IC0tdGltZW91dCkgeworCQltaWlfY29udHJvbCA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7CisJCWlmICgobWlpX2NvbnRyb2wgJiBNSUlfQ05UTF9SRVNFVCkgPT0gMCkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisJfQorCWlmIChtaWlfY29udHJvbCAmIE1JSV9DTlRMX1JFU0VUKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgUEhZIHJlc2V0IHRpbWVvdXQgIVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IAorc21zY184M0MxODVfc3RhdHVzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIHUxNiAqbGluaywgdTE2ICpzcGVlZCkKK3sKKwl1MTYgbWlpX2RhdGE7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXA7CisKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgInNtc2NfODNDMTg1X3N0YXR1cyBlcnJvcjogTlVMTCBkZXZcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJbWlpX2RhdGEgPSBtZGlvX3JlYWQoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKworCWlmIChtaWlfZGF0YSAmIE1JSV9TVEFUX0xJTkspIHsKKwkJKmxpbmsgPSAxOworCQltaWlfZGF0YSA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIDB4MWYpOworCQlpZiAobWlpX2RhdGEgJiAoMTw8MykpIHsKKwkJCWlmIChtaWlfZGF0YSAmICgxPDw0KSkgeworCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFTRUZYOworCQkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTAwQkFTRUZYOworCQkJfQorCQkJZWxzZSB7CisJCQkJKnNwZWVkID0gSUZfUE9SVF8xMDBCQVNFVFg7CisJCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMDBCQVNFVFg7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkqc3BlZWQgPSBJRl9QT1JUXzEwQkFTRVQ7CisJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwQkFTRVQ7CisJCX0KKwl9CisJZWxzZSB7CisJCSpsaW5rID0gMDsKKwkJKnNwZWVkID0gMDsKKwkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF9VTktOT1dOOworCX0KKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgQ09ORklHX01JUFNfQk9TUE9SVVMKK2ludCBzdHViX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyKQoreworCS8vcHJpbnRrKCJQSFkgc3R1Yl9pbml0XG4iKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHN0dWJfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyKQoreworCS8vcHJpbnRrKCJQSFkgc3R1Yl9yZXNldFxuIik7CisJcmV0dXJuIDA7Cit9CisKK2ludCAKK3N0dWJfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkciwgdTE2ICpsaW5rLCB1MTYgKnNwZWVkKQoreworCS8vcHJpbnRrKCJQSFkgc3R1Yl9zdGF0dXNcbiIpOworCSpsaW5rID0gMTsKKwkvKiBobW1tLCByZXZpc2l0ICovCisJKnNwZWVkID0gSUZfUE9SVF8xMDBCQVNFRlg7CisJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMDBCQVNFRlg7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RydWN0IHBoeV9vcHMgYmNtXzUyMDFfb3BzID0geworCWJjbV81MjAxX2luaXQsCisJYmNtXzUyMDFfcmVzZXQsCisJYmNtXzUyMDFfc3RhdHVzLAorfTsKKworc3RydWN0IHBoeV9vcHMgYW03OWM4NzRfb3BzID0geworCWFtNzljODc0X2luaXQsCisJYW03OWM4NzRfcmVzZXQsCisJYW03OWM4NzRfc3RhdHVzLAorfTsKKworc3RydWN0IHBoeV9vcHMgYW03OWM5MDFfb3BzID0geworCWFtNzljOTAxX2luaXQsCisJYW03OWM5MDFfcmVzZXQsCisJYW03OWM5MDFfc3RhdHVzLAorfTsKKworc3RydWN0IHBoeV9vcHMgbHNpXzgwMjI3X29wcyA9IHsgCisJbHNpXzgwMjI3X2luaXQsCisJbHNpXzgwMjI3X3Jlc2V0LAorCWxzaV84MDIyN19zdGF0dXMsCit9OworCitzdHJ1Y3QgcGh5X29wcyBseHQ5NzFhX29wcyA9IHsgCisJbHh0OTcxYV9pbml0LAorCWx4dDk3MWFfcmVzZXQsCisJbHh0OTcxYV9zdGF0dXMsCit9OworCitzdHJ1Y3QgcGh5X29wcyBrczg5OTVtX29wcyA9IHsKKwlrczg5OTVtX2luaXQsCisJa3M4OTk1bV9yZXNldCwKKwlrczg5OTVtX3N0YXR1cywKK307CisKK3N0cnVjdCBwaHlfb3BzIHNtc2NfODNDMTg1X29wcyA9IHsKKwlzbXNjXzgzQzE4NV9pbml0LAorCXNtc2NfODNDMTg1X3Jlc2V0LAorCXNtc2NfODNDMTg1X3N0YXR1cywKK307CisKKyNpZmRlZiBDT05GSUdfTUlQU19CT1NQT1JVUworc3RydWN0IHBoeV9vcHMgc3R1Yl9vcHMgPSB7CisJc3R1Yl9pbml0LAorCXN0dWJfcmVzZXQsCisJc3R1Yl9zdGF0dXMsCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgbWlpX2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqIG5hbWU7CisJdTE2IHBoeV9pZDA7CisJdTE2IHBoeV9pZDE7CisJc3RydWN0IHBoeV9vcHMgKnBoeV9vcHM7CQorCWludCBkdWFsX3BoeTsKK30gbWlpX2NoaXBfdGFibGVbXSA9IHsKKwl7IkJyb2FkY29tIEJDTTUyMDEgMTAvMTAwIEJhc2VUIFBIWSIsMHgwMDQwLDB4NjIxMiwgJmJjbV81MjAxX29wcywwfSwKKwl7IkJyb2FkY29tIEJDTTUyMjEgMTAvMTAwIEJhc2VUIFBIWSIsMHgwMDQwLDB4NjFlNCwgJmJjbV81MjAxX29wcywwfSwKKwl7IkJyb2FkY29tIEJDTTUyMjIgMTAvMTAwIEJhc2VUIFBIWSIsMHgwMDQwLDB4NjMyMiwgJmJjbV81MjAxX29wcywxfSwKKwl7IkFNRCA3OUM5MDEgSG9tZVBOQSBQSFkiLDB4MDAwMCwweDM1YzgsICZhbTc5YzkwMV9vcHMsMH0sCisJeyJBTUQgNzlDODc0IDEwLzEwMCBCYXNlVCBQSFkiLDB4MDAyMiwweDU2MWIsICZhbTc5Yzg3NF9vcHMsMH0sCisJeyJMU0kgODAyMjcgMTAvMTAwIEJhc2VUIFBIWSIsMHgwMDE2LDB4Zjg0MCwgJmxzaV84MDIyN19vcHMsMH0sCisJeyJJbnRlbCBMWFQ5NzFBIER1YWwgU3BlZWQgUEhZIiwweDAwMTMsMHg3OGUyLCAmbHh0OTcxYV9vcHMsMH0sCisJeyJLZW5kaW4gS1M4OTk1TSAxMC8xMDAgQmFzZVQgUEhZIiwweDAwMjIsMHgxNDUwLCAma3M4OTk1bV9vcHMsMH0sCisJeyJTTVNDIExBTjgzQzE4NSAxMC8xMDAgQmFzZVQgUEhZIiwweDAwMDcsMHhjMGEzLCAmc21zY184M0MxODVfb3BzLDB9LAorI2lmZGVmIENPTkZJR19NSVBTX0JPU1BPUlVTCisJeyJTdHViIiwgMHgxMjM0LCAweDU2NzgsICZzdHViX29wcyB9LAorI2VuZGlmCisJezAsfSwKK307CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCByZWcpCit7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKwl2b2xhdGlsZSB1MzIgKm1paV9jb250cm9sX3JlZzsKKwl2b2xhdGlsZSB1MzIgKm1paV9kYXRhX3JlZzsKKwl1MzIgdGltZWRvdXQgPSAyMDsKKwl1MzIgbWlpX2NvbnRyb2w7CisKKwkjaWZkZWYgQ09ORklHX0JDTTUyMjJfRFVBTF9QSFkKKwkvKiBGaXJzdCB0aW1lIHdlIHByb2JlLCBpdCdzIGZvciB0aGUgbWFjMCBwaHkuCisJICogU2luY2Ugd2UgaGF2ZW4ndCBkZXRlcm1pbmVkIHlldCB0aGF0IHdlIGhhdmUgYSBkdWFsIHBoeSwKKwkgKiBhdXAtPm1paS0+bWlpX2NvbnRyb2xfcmVnIHdvbid0IGJlIHNldHVwIGFuZCB3ZSdsbAorCSAqIGRlZmF1bHQgdG8gdGhlIGVsc2Ugc3RhdGVtZW50LgorCSAqIEJ5IHRoZSB0aW1lIHdlIHByb2JlIGZvciB0aGUgbWFjMSBwaHksIHRoZSBtaWlfY29udHJvbF9yZWcKKwkgKiB3aWxsIGJlIHNldHVwIHRvIGJlIHRoZSBhZGRyZXNzIG9mIHRoZSBtYWMwIHBoeSBjb250cm9sIHNpbmNlCisJICogYm90aCBwaHlzIGFyZSBjb250cm9sbGVkIHRocm91Z2ggbWFjMC4KKwkgKi8KKwlpZiAoYXVwLT5taWkgJiYgYXVwLT5taWktPm1paV9jb250cm9sX3JlZykgeworCQltaWlfY29udHJvbF9yZWcgPSBhdXAtPm1paS0+bWlpX2NvbnRyb2xfcmVnOworCQltaWlfZGF0YV9yZWcgPSBhdXAtPm1paS0+bWlpX2RhdGFfcmVnOworCX0KKwllbHNlIGlmIChhdV9tYWNzWzBdLT5taWkgJiYgYXVfbWFjc1swXS0+bWlpLT5taWlfY29udHJvbF9yZWcpIHsKKwkJLyogYXNzdW1lIGJvdGggcGh5cyBhcmUgY29udHJvbGxlZCB0aHJvdWdoIG1hYzAgKi8KKwkJbWlpX2NvbnRyb2xfcmVnID0gYXVfbWFjc1swXS0+bWlpLT5taWlfY29udHJvbF9yZWc7CisJCW1paV9kYXRhX3JlZyA9IGF1X21hY3NbMF0tPm1paS0+bWlpX2RhdGFfcmVnOworCX0KKwllbHNlIAorCSNlbmRpZgorCXsKKwkJLyogZGVmYXVsdCBjb250cm9sIGFuZCBkYXRhIHJlZyBhZGRyZXNzZXMgKi8KKwkJbWlpX2NvbnRyb2xfcmVnID0gJmF1cC0+bWFjLT5taWlfY29udHJvbDsKKwkJbWlpX2RhdGFfcmVnID0gJmF1cC0+bWFjLT5taWlfZGF0YTsKKwl9CisKKwl3aGlsZSAoKm1paV9jb250cm9sX3JlZyAmIE1BQ19NSUlfQlVTWSkgeworCQltZGVsYXkoMSk7CisJCWlmICgtLXRpbWVkb3V0ID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlYWRfTUlJIGJ1c3kgdGltZW91dCEhXG4iLCAKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCW1paV9jb250cm9sID0gTUFDX1NFVF9NSUlfU0VMRUNUX1JFRyhyZWcpIHwgCisJCU1BQ19TRVRfTUlJX1NFTEVDVF9QSFkocGh5X2lkKSB8IE1BQ19NSUlfUkVBRDsKKworCSptaWlfY29udHJvbF9yZWcgPSBtaWlfY29udHJvbDsKKworCXRpbWVkb3V0ID0gMjA7CisJd2hpbGUgKCptaWlfY29udHJvbF9yZWcgJiBNQUNfTUlJX0JVU1kpIHsKKwkJbWRlbGF5KDEpOworCQlpZiAoLS10aW1lZG91dCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZGlvX3JlYWQgYnVzeSB0aW1lb3V0ISFcbiIsIAorCQkJCQlkZXYtPm5hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAoaW50KSptaWlfZGF0YV9yZWc7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IHJlZywgdTE2IHZhbHVlKQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdm9sYXRpbGUgdTMyICptaWlfY29udHJvbF9yZWc7CisJdm9sYXRpbGUgdTMyICptaWlfZGF0YV9yZWc7CisJdTMyIHRpbWVkb3V0ID0gMjA7CisJdTMyIG1paV9jb250cm9sOworCisJI2lmZGVmIENPTkZJR19CQ001MjIyX0RVQUxfUEhZCisJaWYgKGF1cC0+bWlpICYmIGF1cC0+bWlpLT5taWlfY29udHJvbF9yZWcpIHsKKwkJbWlpX2NvbnRyb2xfcmVnID0gYXVwLT5taWktPm1paV9jb250cm9sX3JlZzsKKwkJbWlpX2RhdGFfcmVnID0gYXVwLT5taWktPm1paV9kYXRhX3JlZzsKKwl9CisJZWxzZSBpZiAoYXVfbWFjc1swXS0+bWlpICYmIGF1X21hY3NbMF0tPm1paS0+bWlpX2NvbnRyb2xfcmVnKSB7CisJCS8qIGFzc3VtZSBib3RoIHBoeXMgYXJlIGNvbnRyb2xsZWQgdGhyb3VnaCBtYWMwICovCisJCW1paV9jb250cm9sX3JlZyA9IGF1X21hY3NbMF0tPm1paS0+bWlpX2NvbnRyb2xfcmVnOworCQltaWlfZGF0YV9yZWcgPSBhdV9tYWNzWzBdLT5taWktPm1paV9kYXRhX3JlZzsKKwl9CisJZWxzZSAKKwkjZW5kaWYKKwl7CisJCS8qIGRlZmF1bHQgY29udHJvbCBhbmQgZGF0YSByZWcgYWRkcmVzc2VzICovCisJCW1paV9jb250cm9sX3JlZyA9ICZhdXAtPm1hYy0+bWlpX2NvbnRyb2w7CisJCW1paV9kYXRhX3JlZyA9ICZhdXAtPm1hYy0+bWlpX2RhdGE7CisJfQorCisJd2hpbGUgKCptaWlfY29udHJvbF9yZWcgJiBNQUNfTUlJX0JVU1kpIHsKKwkJbWRlbGF5KDEpOworCQlpZiAoLS10aW1lZG91dCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZGlvX3dyaXRlIGJ1c3kgdGltZW91dCEhXG4iLCAKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCW1paV9jb250cm9sID0gTUFDX1NFVF9NSUlfU0VMRUNUX1JFRyhyZWcpIHwgCisJCU1BQ19TRVRfTUlJX1NFTEVDVF9QSFkocGh5X2lkKSB8IE1BQ19NSUlfV1JJVEU7CisKKwkqbWlpX2RhdGFfcmVnID0gdmFsdWU7CisJKm1paV9jb250cm9sX3JlZyA9IG1paV9jb250cm9sOworfQorCisKK3N0YXRpYyB2b2lkIGR1bXBfbWlpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQpCit7CisJaW50IGksIHZhbDsKKworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJaWYgKCh2YWwgPSBtZGlvX3JlYWQoZGV2LCBwaHlfaWQsIGkpKSA+PSAwKQorCQkJcHJpbnRrKCIlczogTUlJIFJlZyAlZD0leFxuIiwgZGV2LT5uYW1lLCBpLCB2YWwpOworCX0KKwlmb3IgKGkgPSAxNjsgaSA8IDI1OyBpKyspIHsKKwkJaWYgKCh2YWwgPSBtZGlvX3JlYWQoZGV2LCBwaHlfaWQsIGkpKSA+PSAwKQorCQkJcHJpbnRrKCIlczogTUlJIFJlZyAlZD0leFxuIiwgZGV2LT5uYW1lLCBpLCB2YWwpOworCX0KK30KKworc3RhdGljIGludCBtaWlfcHJvYmUgKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJaW50IHBoeV9hZGRyOworI2lmZGVmIENPTkZJR19NSVBTX0JPU1BPUlVTCisJaW50IHBoeV9mb3VuZD0wOworI2VuZGlmCisKKwkvKiBzZWFyY2ggZm9yIHRvdGFsIG9mIDMyIHBvc3NpYmxlIG1paSBwaHkgYWRkcmVzc2VzICovCisJZm9yIChwaHlfYWRkciA9IDA7IHBoeV9hZGRyIDwgMzI7IHBoeV9hZGRyKyspIHsKKwkJdTE2IG1paV9zdGF0dXM7CisJCXUxNiBwaHlfaWQwLCBwaHlfaWQxOworCQlpbnQgaTsKKworCQkjaWZkZWYgQ09ORklHX0JDTTUyMjJfRFVBTF9QSFkKKwkJLyogTWFzayB0aGUgYWxyZWFkeSBmb3VuZCBwaHksIHRyeSBuZXh0IG9uZSAqLworCQlpZiAoYXVfbWFjc1swXS0+bWlpICYmIGF1X21hY3NbMF0tPm1paS0+bWlpX2NvbnRyb2xfcmVnKSB7CisJCQlpZiAoYXVfbWFjc1swXS0+cGh5X2FkZHIgPT0gcGh5X2FkZHIpCisJCQkJY29udGludWU7CisJCX0KKwkJI2VuZGlmCisKKwkJbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKwkJaWYgKG1paV9zdGF0dXMgPT0gMHhmZmZmIHx8IG1paV9zdGF0dXMgPT0gMHgwMDAwKQorCQkJLyogdGhlIG1paSBpcyBub3QgYWNjZXNzYWJsZSwgdHJ5IG5leHQgb25lICovCisJCQljb250aW51ZTsKKworCQlwaHlfaWQwID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9QSFlfSUQwKTsKKwkJcGh5X2lkMSA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfUEhZX0lEMSk7CisKKwkJLyogc2VhcmNoIG91ciBtaWkgdGFibGUgZm9yIHRoZSBjdXJyZW50IG1paSAqLyAKKwkJZm9yIChpID0gMDsgbWlpX2NoaXBfdGFibGVbaV0ucGh5X2lkMTsgaSsrKSB7CisJCQlpZiAocGh5X2lkMCA9PSBtaWlfY2hpcF90YWJsZVtpXS5waHlfaWQwICYmCisJCQkgICAgcGh5X2lkMSA9PSBtaWlfY2hpcF90YWJsZVtpXS5waHlfaWQxKSB7CisJCQkJc3RydWN0IG1paV9waHkgKiBtaWlfcGh5ID0gYXVwLT5taWk7CisKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgYXQgcGh5IGFkZHJlc3MgJWRcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgbWlpX2NoaXBfdGFibGVbaV0ubmFtZSwgCisJCQkJICAgICAgIHBoeV9hZGRyKTsKKyNpZmRlZiBDT05GSUdfTUlQU19CT1NQT1JVUworCQkJCXBoeV9mb3VuZCA9IDE7CisjZW5kaWYKKwkJCQltaWlfcGh5LT5jaGlwX2luZm8gPSBtaWlfY2hpcF90YWJsZStpOworCQkJCWF1cC0+cGh5X2FkZHIgPSBwaHlfYWRkcjsKKwkJCQlhdXAtPndhbnRfYXV0b25lZyA9IDE7CisJCQkJYXVwLT5waHlfb3BzID0gbWlpX2NoaXBfdGFibGVbaV0ucGh5X29wczsKKwkJCQlhdXAtPnBoeV9vcHMtPnBoeV9pbml0KGRldixwaHlfYWRkcik7CisKKwkJCQkvLyBDaGVjayBmb3IgZHVhbC1waHkgYW5kIHRoZW4gc3RvcmUgcmVxdWlyZWQgCisJCQkJLy8gdmFsdWVzIGFuZCBzZXQgaW5kaWNhdG9ycy4gV2UgbmVlZCB0byBkbyAKKwkJCQkvLyB0aGlzIG5vdyBzaW5jZSBtZGlvX3tyZWFkLHdyaXRlfSBuZWVkIHRoZSAKKwkJCQkvLyBjb250cm9sIGFuZCBkYXRhIHJlZ2lzdGVyIGFkZHJlc3Nlcy4KKwkJCQkjaWZkZWYgQ09ORklHX0JDTTUyMjJfRFVBTF9QSFkKKwkJCQlpZiAoIG1paV9jaGlwX3RhYmxlW2ldLmR1YWxfcGh5KSB7CisKKwkJCQkJLyogYXNzdW1lIGJvdGggcGh5cyBhcmUgY29udHJvbGxlZCAKKwkJCQkJICogdGhyb3VnaCBNQUMwLiBCb2FyZCBzcGVjaWZpYz8gKi8KKwkJCQkJCisJCQkJCS8qIHNhbml0eSBjaGVjayAqLworCQkJCQlpZiAoIWF1X21hY3NbMF0gfHwgIWF1X21hY3NbMF0tPm1paSkKKwkJCQkJCXJldHVybiAtMTsKKwkJCQkJYXVwLT5taWktPm1paV9jb250cm9sX3JlZyA9ICh1MzIgKikKKwkJCQkJCSZhdV9tYWNzWzBdLT5tYWMtPm1paV9jb250cm9sOworCQkJCQlhdXAtPm1paS0+bWlpX2RhdGFfcmVnID0gKHUzMiAqKQorCQkJCQkJJmF1X21hY3NbMF0tPm1hYy0+bWlpX2RhdGE7CisJCQkJfQorCQkJCSNlbmRpZgorCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwl9Citmb3VuZDoKKworI2lmZGVmIENPTkZJR19NSVBTX0JPU1BPUlVTCisJLyogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSBNaWNyZWwvS2VuZGluIDUgcG9ydCBzd2l0Y2gKKwkgICBUaGUgc2Vjb25kIE1BQyBkb2Vzbid0IHNlZSBhIFBIWSBjb25uZWN0ZWQuLi4gc28gd2UgbmVlZCB0bworCSAgIHRyaWNrIGl0IGludG8gdGhpbmtpbmcgd2UgaGF2ZSBvbmUuCisJCQorCSAgIElmIHRoaXMga2VybmVsIGlzIHJ1biBvbiBhbm90aGVyIEF1MTUwMCBkZXZlbG9wbWVudCBib2FyZAorCSAgIHRoZSBzdHViIHdpbGwgYmUgZm91bmQgYXMgd2VsbCBhcyB0aGUgYWN0dWFsIFBIWS4gSG93ZXZlciwKKwkgICB0aGUgbGFzdCBmb3VuZCBQSFkgd2lsbCBiZSB1c2VkLi4uIHVzdWFsbHkgYXQgQWRkciAzMSAoRGIxNTAwKS4JCisJKi8KKwlpZiAoICghcGh5X2ZvdW5kKSApCisJeworCQl1MTYgcGh5X2lkMCwgcGh5X2lkMTsKKwkJaW50IGk7CisKKwkJcGh5X2lkMCA9IDB4MTIzNDsKKwkJcGh5X2lkMSA9IDB4NTY3ODsKKworCQkvKiBzZWFyY2ggb3VyIG1paSB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgbWlpICovIAorCQlmb3IgKGkgPSAwOyBtaWlfY2hpcF90YWJsZVtpXS5waHlfaWQxOyBpKyspIHsKKwkJCWlmIChwaHlfaWQwID09IG1paV9jaGlwX3RhYmxlW2ldLnBoeV9pZDAgJiYKKwkJCSAgICBwaHlfaWQxID09IG1paV9jaGlwX3RhYmxlW2ldLnBoeV9pZDEpIHsKKwkJCQlzdHJ1Y3QgbWlpX3BoeSAqIG1paV9waHk7CisKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgYXQgcGh5IGFkZHJlc3MgJWRcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgbWlpX2NoaXBfdGFibGVbaV0ubmFtZSwgCisJCQkJICAgICAgIHBoeV9hZGRyKTsKKwkJCQltaWlfcGh5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1paV9waHkpLCAKKwkJCQkJCUdGUF9LRVJORUwpOworCQkJCWlmIChtaWlfcGh5KSB7CisJCQkJCW1paV9waHktPmNoaXBfaW5mbyA9IG1paV9jaGlwX3RhYmxlK2k7CisJCQkJCWF1cC0+cGh5X2FkZHIgPSBwaHlfYWRkcjsKKwkJCQkJbWlpX3BoeS0+bmV4dCA9IGF1cC0+bWlpOworCQkJCQlhdXAtPnBoeV9vcHMgPSAKKwkJCQkJCW1paV9jaGlwX3RhYmxlW2ldLnBoeV9vcHM7CisJCQkJCWF1cC0+bWlpID0gbWlpX3BoeTsKKwkJCQkJYXVwLT5waHlfb3BzLT5waHlfaW5pdChkZXYscGh5X2FkZHIpOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG91dCBvZiBtZW1vcnlcbiIsIAorCQkJCQkJCWRldi0+bmFtZSk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJbWlpX3BoeS0+Y2hpcF9pbmZvID0gbWlpX2NoaXBfdGFibGUraTsKKwkJCQlhdXAtPnBoeV9hZGRyID0gcGh5X2FkZHI7CisJCQkJYXVwLT5waHlfb3BzID0gbWlpX2NoaXBfdGFibGVbaV0ucGh5X29wczsKKwkJCQlhdXAtPnBoeV9vcHMtPnBoeV9pbml0KGRldixwaHlfYWRkcik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKGF1cC0+bWFjX2lkID09IDApIHsKKwkJLyogdGhlIEJvc3BvcnVzIHBoeSByZXNwb25kcyB0byBhZGRyZXNzZXMgMC01IGJ1dCAKKwkJICogNSBpcyB0aGUgY29ycmVjdCBvbmUuCisJCSAqLworCQlhdXAtPnBoeV9hZGRyID0gNTsKKwl9CisjZW5kaWYKKworCWlmIChhdXAtPm1paS0+Y2hpcF9pbmZvID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQXUxeCBObyBNSUkgdHJhbnNjZWl2ZXJzIGZvdW5kIVxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVzaW5nICVzIGFzIGRlZmF1bHRcbiIsIAorCQkJZGV2LT5uYW1lLCBhdXAtPm1paS0+Y2hpcF9pbmZvLT5uYW1lKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBCdWZmZXIgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gcm91dGluZXMuIFRoZSBidWZmZXIgZGVzY3JpcHRvciByZXR1cm5lZAorICogaGFzIHRoZSB2aXJ0dWFsIGFuZCBkbWEgYWRkcmVzcyBvZiBhIGJ1ZmZlciBzdWl0YWJsZSBmb3IgCisgKiBib3RoLCByZWNlaXZlIGFuZCB0cmFuc21pdCBvcGVyYXRpb25zLgorICovCitzdGF0aWMgZGJfZGVzdF90ICpHZXRGcmVlREIoc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXApCit7CisJZGJfZGVzdF90ICpwREI7CisJcERCID0gYXVwLT5wREJmcmVlOworCisJaWYgKHBEQikgeworCQlhdXAtPnBEQmZyZWUgPSBwREItPnBuZXh0OworCX0KKwlyZXR1cm4gcERCOworfQorCit2b2lkIFJlbGVhc2VEQihzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCwgZGJfZGVzdF90ICpwREIpCit7CisJZGJfZGVzdF90ICpwREJmcmVlID0gYXVwLT5wREJmcmVlOworCWlmIChwREJmcmVlKQorCQlwREJmcmVlLT5wbmV4dCA9IHBEQjsKKwlhdXAtPnBEQmZyZWUgPSBwREI7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9yeF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGVuYWJsZV9yeF90eFxuIiwgZGV2LT5uYW1lKTsKKworCWF1cC0+bWFjLT5jb250cm9sIHw9IChNQUNfUlhfRU5BQkxFIHwgTUFDX1RYX0VOQUJMRSk7CisJYXVfc3luY19kZWxheSgxMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhcmRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGhhcmQgc3RvcFxuIiwgZGV2LT5uYW1lKTsKKworCWF1cC0+bWFjLT5jb250cm9sICY9IH4oTUFDX1JYX0VOQUJMRSB8IE1BQ19UWF9FTkFCTEUpOworCWF1X3N5bmNfZGVsYXkoMTApOworfQorCisKK3N0YXRpYyB2b2lkIHJlc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXUzMiBmbGFnczsKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpIAorCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVzZXQgbWFjLCBhdXAgJXhcbiIsIAorCQkJCWRldi0+bmFtZSwgKHVuc2lnbmVkKWF1cCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXVwLT5sb2NrLCBmbGFncyk7CisJaWYgKGF1cC0+dGltZXIuZnVuY3Rpb24gPT0gJmF1MTAwMF90aW1lcikgey8qIGNoZWNrIGlmIHRpbWVyIGluaXR0ZWQgKi8KKwkJZGVsX3RpbWVyKCZhdXAtPnRpbWVyKTsKKwl9CisKKwloYXJkX3N0b3AoZGV2KTsKKwkjaWZkZWYgQ09ORklHX0JDTTUyMjJfRFVBTF9QSFkKKwlpZiAoYXVwLT5tYWNfaWQgIT0gMCkgeworCSNlbmRpZgorCQkvKiBJZiBCQ001MjIyLCB3ZSBjYW4ndCBsZWF2ZSBNQUMwIGluIHJlc2V0IGJlY2F1c2UgdGhlbiAKKwkJICogd2UgY2FuJ3QgYWNjZXNzIHRoZSBkdWFsIHBoeSBmb3IgRVRIMSAqLworCQkqYXVwLT5lbmFibGUgPSBNQUNfRU5fQ0xPQ0tfRU5BQkxFOworCQlhdV9zeW5jX2RlbGF5KDIpOworCQkqYXVwLT5lbmFibGUgPSAwOworCQlhdV9zeW5jX2RlbGF5KDIpOworCSNpZmRlZiBDT05GSUdfQkNNNTIyMl9EVUFMX1BIWQorCX0KKwkjZW5kaWYKKwlhdXAtPnR4X2Z1bGwgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfRE1BOyBpKyspIHsKKwkJLyogcmVzZXQgY29udHJvbCBiaXRzICovCisJCWF1cC0+cnhfZG1hX3JpbmdbaV0tPmJ1ZmZfc3RhdCAmPSB+MHhmOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RNQTsgaSsrKSB7CisJCS8qIHJlc2V0IGNvbnRyb2wgYml0cyAqLworCQlhdXAtPnR4X2RtYV9yaW5nW2ldLT5idWZmX3N0YXQgJj0gfjB4ZjsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVwLT5sb2NrLCBmbGFncyk7Cit9CisKKworLyogCisgKiBTZXR1cCB0aGUgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgInJpbmdzIi4gIFRoZXNlIHBvaW50ZXJzIGFyZSB0aGUgYWRkcmVzc2VzCisgKiBvZiB0aGUgcnggYW5kIHR4IE1BQyBETUEgcmVnaXN0ZXJzIHNvIHRoZXkgYXJlIGZpeGVkIGJ5IHRoZSBoYXJkd2FyZSAtLQorICogdGhlc2UgYXJlIG5vdCBkZXNjcmlwdG9ycyBzaXR0aW5nIGluIG1lbW9yeS4KKyAqLworc3RhdGljIHZvaWQgCitzZXR1cF9od19yaW5ncyhzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCwgdTMyIHJ4X2Jhc2UsIHUzMiB0eF9iYXNlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9ETUE7IGkrKykgeworCQlhdXAtPnJ4X2RtYV9yaW5nW2ldID0gCisJCQkodm9sYXRpbGUgcnhfZG1hX3QgKikgKHJ4X2Jhc2UgKyBzaXplb2YocnhfZG1hX3QpKmkpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RNQTsgaSsrKSB7CisJCWF1cC0+dHhfZG1hX3JpbmdbaV0gPSAKKwkJCSh2b2xhdGlsZSB0eF9kbWFfdCAqKSAodHhfYmFzZSArIHNpemVvZih0eF9kbWFfdCkqaSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgcG9ydDsKKwl1MzIgYmFzZV9hZGRyOworCXUzMiBtYWNlbl9hZGRyOworCWludCBpcnE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKK30gaWZsaXN0WzJdOworCitzdGF0aWMgaW50IG51bV9pZnM7CisKKy8qCisgKiBTZXR1cCB0aGUgYmFzZSBhZGRyZXNzIGFuZCBpbnRlcnVwdCBvZiB0aGUgQXUxeHh4IGV0aGVybmV0IG1hY3MKKyAqIGJhc2VkIG9uIGNwdSB0eXBlIGFuZCB3aGV0aGVyIHRoZSBpbnRlcmZhY2UgaXMgZW5hYmxlZCBpbiBzeXNfcGluZnVuYworICogcmVnaXN0ZXIuIFRoZSBsYXN0IGludGVyZmFjZSBpcyBlbmFibGVkIGlmIFNZU19QRl9OSTIgKGJpdCA0KSBpcyAwLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhdTEwMDBfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgY3B1aW5mb19taXBzICpjID0gJmN1cnJlbnRfY3B1X2RhdGE7CisJaW50IG5pID0gKGludCkoKGF1X3JlYWRsKFNZU19QSU5GVU5DKSAmICh1MzIpKFNZU19QRl9OSTIpKSA+PiA0KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpLCBmb3VuZF9vbmUgPSAwOworCisJc3dpdGNoIChjLT5jcHV0eXBlKSB7CisjaWZkZWYgQ09ORklHX1NPQ19BVTEwMDAKKwljYXNlIENQVV9BVTEwMDA6CisJCW51bV9pZnMgPSAyIC0gbmk7CisJCWlmbGlzdFswXS5iYXNlX2FkZHIgPSBBVTEwMDBfRVRIMF9CQVNFOworCQlpZmxpc3RbMV0uYmFzZV9hZGRyID0gQVUxMDAwX0VUSDFfQkFTRTsKKwkJaWZsaXN0WzBdLm1hY2VuX2FkZHIgPSBBVTEwMDBfTUFDMF9FTkFCTEU7CisJCWlmbGlzdFsxXS5tYWNlbl9hZGRyID0gQVUxMDAwX01BQzFfRU5BQkxFOworCQlpZmxpc3RbMF0uaXJxID0gQVUxMDAwX01BQzBfRE1BX0lOVDsKKwkJaWZsaXN0WzFdLmlycSA9IEFVMTAwMF9NQUMxX0RNQV9JTlQ7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NPQ19BVTExMDAKKwljYXNlIENQVV9BVTExMDA6CisJCW51bV9pZnMgPSAxIC0gbmk7CisJCWlmbGlzdFswXS5iYXNlX2FkZHIgPSBBVTExMDBfRVRIMF9CQVNFOworCQlpZmxpc3RbMF0ubWFjZW5fYWRkciA9IEFVMTEwMF9NQUMwX0VOQUJMRTsKKwkJaWZsaXN0WzBdLmlycSA9IEFVMTEwMF9NQUMwX0RNQV9JTlQ7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NPQ19BVTE1MDAKKwljYXNlIENQVV9BVTE1MDA6CisJCW51bV9pZnMgPSAyIC0gbmk7CisJCWlmbGlzdFswXS5iYXNlX2FkZHIgPSBBVTE1MDBfRVRIMF9CQVNFOworCQlpZmxpc3RbMV0uYmFzZV9hZGRyID0gQVUxNTAwX0VUSDFfQkFTRTsKKwkJaWZsaXN0WzBdLm1hY2VuX2FkZHIgPSBBVTE1MDBfTUFDMF9FTkFCTEU7CisJCWlmbGlzdFsxXS5tYWNlbl9hZGRyID0gQVUxNTAwX01BQzFfRU5BQkxFOworCQlpZmxpc3RbMF0uaXJxID0gQVUxNTAwX01BQzBfRE1BX0lOVDsKKwkJaWZsaXN0WzFdLmlycSA9IEFVMTUwMF9NQUMxX0RNQV9JTlQ7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NPQ19BVTE1NTAKKwljYXNlIENQVV9BVTE1NTA6CisJCW51bV9pZnMgPSAyIC0gbmk7CisJCWlmbGlzdFswXS5iYXNlX2FkZHIgPSBBVTE1NTBfRVRIMF9CQVNFOworCQlpZmxpc3RbMV0uYmFzZV9hZGRyID0gQVUxNTUwX0VUSDFfQkFTRTsKKwkJaWZsaXN0WzBdLm1hY2VuX2FkZHIgPSBBVTE1NTBfTUFDMF9FTkFCTEU7CisJCWlmbGlzdFsxXS5tYWNlbl9hZGRyID0gQVUxNTUwX01BQzFfRU5BQkxFOworCQlpZmxpc3RbMF0uaXJxID0gQVUxNTUwX01BQzBfRE1BX0lOVDsKKwkJaWZsaXN0WzFdLmlycSA9IEFVMTU1MF9NQUMxX0RNQV9JTlQ7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJbnVtX2lmcyA9IDA7CisJfQorCWZvcihpID0gMDsgaSA8IG51bV9pZnM7IGkrKykgeworCQlkZXYgPSBhdTEwMDBfcHJvYmUoaWZsaXN0W2ldLmJhc2VfYWRkciwgaWZsaXN0W2ldLmlycSwgaSk7CisJCWlmbGlzdFtpXS5kZXYgPSBkZXY7CisJCWlmIChkZXYpCisJCQlmb3VuZF9vbmUrKzsKKwl9CisJaWYgKCFmb3VuZF9vbmUpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1MTAwMF9zZXR1cF9hbmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhZHZlcnRpc2UpCit7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopZGV2LT5wcml2OworCXUxNiBjdGwsIGFkdjsKKworCS8qIFNldHVwIHN0YW5kYXJkIGFkdmVydGlzZSAqLworCWFkdiA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9BRFZFUlRJU0UpOworCWFkdiAmPSB+KEFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfMTAwQkFTRTQpOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKKwkJYWR2IHw9IEFEVkVSVElTRV8xMEhBTEY7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKKwkJYWR2IHw9IEFEVkVSVElTRV8xMDBGVUxMOworCW1kaW9fd3JpdGUoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQURWRVJUSVNFLCBhZHYpOworCisJLyogU3RhcnQvUmVzdGFydCBhbmVnICovCisJY3RsID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0JNQ1IpOworCWN0bCB8PSAoQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKwltZGlvX3dyaXRlKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0JNQ1IsIGN0bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdTEwMDBfc2V0dXBfZm9yY2VkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzcGVlZCwgaW50IGZkKQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwl1MTYgY3RsOworCisJY3RsID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0JNQ1IpOworCWN0bCAmPSB+KEJNQ1JfRlVMTERQTFggfCBCTUNSX1NQRUVEMTAwIHwgQk1DUl9BTkVOQUJMRSk7CisKKwkvKiBGaXJzdCByZXNldCB0aGUgUEhZICovCisJbWRpb193cml0ZShkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9CTUNSLCBjdGwgfCBCTUNSX1JFU0VUKTsKKworCS8qIFNlbGVjdCBzcGVlZCAmIGR1cGxleCAqLworCXN3aXRjaCAoc3BlZWQpIHsKKwkJY2FzZSBTUEVFRF8xMDoKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMDoKKwkJCWN0bCB8PSBCTUNSX1NQRUVEMTAwOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMTAwMDoKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZmQgPT0gRFVQTEVYX0ZVTEwpCisJCWN0bCB8PSBCTUNSX0ZVTExEUExYOworCW1kaW9fd3JpdGUoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQk1DUiwgY3RsKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkCithdTEwMDBfc3RhcnRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTMyIGFkdmVydGlzZTsKKwlpbnQgYXV0b25lZzsKKwlpbnQgZm9yY2VkX3NwZWVkOworCWludCBmb3JjZWRfZHVwbGV4OworCisJLyogRGVmYXVsdCBhZHZlcnRpc2UgKi8KKwlhZHZlcnRpc2UgPSBHRU5NSUlfREVGQVVMVF9BRFZFUlRJU0U7CisJYXV0b25lZyA9IGF1cC0+d2FudF9hdXRvbmVnOworCWZvcmNlZF9zcGVlZCA9IFNQRUVEXzEwMDsKKwlmb3JjZWRfZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisKKwkvKiBTZXR1cCBsaW5rIHBhcmFtZXRlcnMgKi8KKwlpZiAoY21kKSB7CisJCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJCWFkdmVydGlzZSA9IGNtZC0+YWR2ZXJ0aXNpbmc7CisJCQlhdXRvbmVnID0gMTsKKwkJfSBlbHNlIHsKKwkJCWF1dG9uZWcgPSAwOworCisJCQlmb3JjZWRfc3BlZWQgPSBjbWQtPnNwZWVkOworCQkJZm9yY2VkX2R1cGxleCA9IGNtZC0+ZHVwbGV4OworCQl9CisJfQorCisJLyogQ29uZmlndXJlIFBIWSAmIHN0YXJ0IGFuZWcgKi8KKwlhdXAtPndhbnRfYXV0b25lZyA9IGF1dG9uZWc7CisJaWYgKGF1dG9uZWcpCisJCWF1MTAwMF9zZXR1cF9hbmVnKGRldiwgYWR2ZXJ0aXNlKTsKKwllbHNlCisJCWF1MTAwMF9zZXR1cF9mb3JjZWQoZGV2LCBmb3JjZWRfc3BlZWQsIGZvcmNlZF9kdXBsZXgpOworCW1vZF90aW1lcigmYXVwLT50aW1lciwgamlmZmllcyArIEhaKTsKK30KKworc3RhdGljIGludCBhdTEwMDBfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwl1MTYgbGluaywgc3BlZWQ7CisKKwljbWQtPnN1cHBvcnRlZCA9IEdFTk1JSV9ERUZBVUxUX0ZFQVRVUkVTOworCWNtZC0+YWR2ZXJ0aXNpbmcgPSBHRU5NSUlfREVGQVVMVF9BRFZFUlRJU0U7CisJY21kLT5wb3J0ID0gUE9SVF9NSUk7CisJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisJY21kLT5waHlfYWRkcmVzcyA9IGF1cC0+cGh5X2FkZHI7CisJc3Bpbl9sb2NrX2lycSgmYXVwLT5sb2NrKTsKKwljbWQtPmF1dG9uZWcgPSBhdXAtPndhbnRfYXV0b25lZzsKKwlhdXAtPnBoeV9vcHMtPnBoeV9zdGF0dXMoZGV2LCBhdXAtPnBoeV9hZGRyLCAmbGluaywgJnNwZWVkKTsKKwlpZiAoKHNwZWVkID09IElGX1BPUlRfMTAwQkFTRVRYKSB8fCAoc3BlZWQgPT0gSUZfUE9SVF8xMDBCQVNFRlgpKQorCQljbWQtPnNwZWVkID0gU1BFRURfMTAwOworCWVsc2UgaWYgKHNwZWVkID09IElGX1BPUlRfMTBCQVNFVCkKKwkJY21kLT5zcGVlZCA9IFNQRUVEXzEwOworCWlmIChsaW5rICYmIChkZXYtPmlmX3BvcnQgPT0gSUZfUE9SVF8xMDBCQVNFRlgpKQorCQljbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOworCWVsc2UKKwkJY21kLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwlzcGluX3VubG9ja19pcnEoJmF1cC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXUxMDAwX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwkgc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopZGV2LT5wcml2OworCSAgdW5zaWduZWQgbG9uZyBmZWF0dXJlcyA9IEdFTk1JSV9ERUZBVUxUX0ZFQVRVUkVTOworCisJIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJIHJldHVybiAtRVBFUk07CisKKwkgaWYgKGNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSAmJiBjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19ESVNBQkxFKQorCQkgcmV0dXJuIC1FSU5WQUw7CisJIGlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUgJiYgY21kLT5hZHZlcnRpc2luZyA9PSAwKQorCQkgcmV0dXJuIC1FSU5WQUw7CisJIGlmIChjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJiBjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkKKwkJIHJldHVybiAtRUlOVkFMOworCSBpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSkKKwkJIHN3aXRjaCAoY21kLT5zcGVlZCkgeworCQkgY2FzZSBTUEVFRF8xMDoKKwkJCSBpZiAoY21kLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYgJiYKKwkJCQkgKGZlYXR1cmVzICYgU1VQUE9SVEVEXzEwYmFzZVRfSGFsZikgPT0gMCkKKwkJCQkgcmV0dXJuIC1FSU5WQUw7CisJCQkgaWYgKGNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMICYmCisJCQkJIChmZWF0dXJlcyAmIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwpID09IDApCisJCQkJIHJldHVybiAtRUlOVkFMOworCQkJIGJyZWFrOworCQkgY2FzZSBTUEVFRF8xMDA6CisJCQkgaWYgKGNtZC0+ZHVwbGV4ID09IERVUExFWF9IQUxGICYmCisJCQkJIChmZWF0dXJlcyAmIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmKSA9PSAwKQorCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCSBpZiAoY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwgJiYKKwkJCQkgKGZlYXR1cmVzICYgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwpID09IDApCisJCQkJIHJldHVybiAtRUlOVkFMOworCQkJIGJyZWFrOworCQkgZGVmYXVsdDoKKwkJCSByZXR1cm4gLUVJTlZBTDsKKwkJIH0KKwkgZWxzZSBpZiAoKGZlYXR1cmVzICYgU1VQUE9SVEVEX0F1dG9uZWcpID09IDApCisJCSByZXR1cm4gLUVJTlZBTDsKKworCSBzcGluX2xvY2tfaXJxKCZhdXAtPmxvY2spOworCSBhdTEwMDBfc3RhcnRfbGluayhkZXYsIGNtZCk7CisJIHNwaW5fdW5sb2NrX2lycSgmYXVwLT5sb2NrKTsKKwkgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXUxMDAwX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKilkZXYtPnByaXY7CisKKwlpZiAoIWF1cC0+d2FudF9hdXRvbmVnKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzcGluX2xvY2tfaXJxKCZhdXAtPmxvY2spOworCWF1MTAwMF9zdGFydF9saW5rKGRldiwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZhdXAtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYXUxMDAwX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopZGV2LT5wcml2OworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJaW5mby0+ZndfdmVyc2lvblswXSA9ICdcMCc7CisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIiVzICVkIiwgRFJWX05BTUUsIGF1cC0+bWFjX2lkKTsKKwlpbmZvLT5yZWdkdW1wX2xlbiA9IDA7Cit9CisKK3N0YXRpYyB1MzIgYXUxMDAwX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIG5ldGlmX2NhcnJpZXJfb2soZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBhdTEwMDBfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncyA9IGF1MTAwMF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyA9IGF1MTAwMF9zZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvID0gYXUxMDAwX2dldF9kcnZpbmZvLAorCS5ud2F5X3Jlc2V0ID0gYXUxMDAwX253YXlfcmVzZXQsCisJLmdldF9saW5rID0gYXUxMDAwX2dldF9saW5rCit9OworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKgorYXUxMDAwX3Byb2JlKHUzMiBpb2FkZHIsIGludCBpcnEsIGludCBwb3J0X251bSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkID0gMDsKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJZGJfZGVzdF90ICpwREIsICpwREJmcmVlOworCWNoYXIgKnBtYWMsICphcmdwdHI7CisJY2hhciBldGhhZGRyWzZdOworCWludCBpLCBlcnI7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihDUEhZU0FERFIoaW9hZGRyKSwgTUFDX0lPU0laRSwgIkF1MXgwMCBFTkVUIikpCisJCXJldHVybiBOVUxMOworCisJaWYgKHZlcnNpb25fcHJpbnRlZCsrID09IDApIAorCQlwcmludGsoIiVzIHZlcnNpb24gJXMgJXNcbiIsIERSVl9OQU1FLCBEUlZfVkVSU0lPTiwgRFJWX0FVVEhPUik7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGF1MTAwMF9wcml2YXRlKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiYXUxMDAwIGV0aDogYWxsb2NfZXRoZXJkZXYgZmFpbGVkXG4iKTsgIAorCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkF1MXhfZXRoIENhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlIGVyciAlZFxuIiwKKwkJCQllcnIpOworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwcmludGsoIiVzOiBBdTF4IEV0aGVybmV0IGZvdW5kIGF0IDB4JXgsIGlycSAlZFxuIiwgCisJCQlkZXYtPm5hbWUsIGlvYWRkciwgaXJxKTsKKworCWF1cCA9IGRldi0+cHJpdjsKKworCS8qIEFsbG9jYXRlIHRoZSBkYXRhIGJ1ZmZlcnMgKi8KKwkvKiBTbm9vcGluZyB3b3JrcyBmaW5lIHdpdGggZXRoIG9uIGFsbCBhdTF4eHggKi8KKwlhdXAtPnZhZGRyID0gKHUzMilkbWFfYWxsb2Nfbm9uY29oZXJlbnQoTlVMTCwKKwkJCU1BWF9CVUZfU0laRSAqIChOVU1fVFhfQlVGRlMrTlVNX1JYX0JVRkZTKSwKKwkJCSZhdXAtPmRtYV9hZGRyLAorCQkJMCk7CisJaWYgKCFhdXAtPnZhZGRyKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihDUEhZU0FERFIoaW9hZGRyKSwgTUFDX0lPU0laRSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGF1cC0+bWFjIGlzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIE1BQydzIHJlZ2lzdGVycyAqLworCWF1cC0+bWFjID0gKHZvbGF0aWxlIG1hY19yZWdfdCAqKSgodW5zaWduZWQgbG9uZylpb2FkZHIpOworCS8qIFNldHVwIHNvbWUgdmFyaWFibGVzIGZvciBxdWljayByZWdpc3RlciBhZGRyZXNzIGFjY2VzcyAqLworCWlmIChpb2FkZHIgPT0gaWZsaXN0WzBdLmJhc2VfYWRkcikKKwl7CisJCS8qIGNoZWNrIGVudiB2YXJpYWJsZXMgZmlyc3QgKi8KKwkJaWYgKCFnZXRfZXRoZXJuZXRfYWRkcihldGhhZGRyKSkgeyAKKwkJCW1lbWNweShhdTEwMDBfbWFjX2FkZHIsIGV0aGFkZHIsIHNpemVvZihhdTEwMDBfbWFjX2FkZHIpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIENoZWNrIGNvbW1hbmQgbGluZSAqLworCQkJYXJncHRyID0gcHJvbV9nZXRjbWRsaW5lKCk7CisJCQlpZiAoKHBtYWMgPSBzdHJzdHIoYXJncHRyLCAiZXRoYWRkcj0iKSkgPT0gTlVMTCkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBObyBtYWMgYWRkcmVzcyBmb3VuZFxuIiwgCisJCQkJCQlkZXYtPm5hbWUpOworCQkJCS8qIHVzZSB0aGUgaGFyZCBjb2RlZCBtYWMgYWRkcmVzc2VzICovCisJCQl9IGVsc2UgeworCQkJCXN0cjJlYWRkcihldGhhZGRyLCBwbWFjICsgc3RybGVuKCJldGhhZGRyPSIpKTsKKwkJCQltZW1jcHkoYXUxMDAwX21hY19hZGRyLCBldGhhZGRyLCAKKwkJCQkJCXNpemVvZihhdTEwMDBfbWFjX2FkZHIpKTsKKwkJCX0KKwkJfQorCQkJYXVwLT5lbmFibGUgPSAodm9sYXRpbGUgdTMyICopIAorCQkJCSgodW5zaWduZWQgbG9uZylpZmxpc3RbMF0ubWFjZW5fYWRkcik7CisJCW1lbWNweShkZXYtPmRldl9hZGRyLCBhdTEwMDBfbWFjX2FkZHIsIHNpemVvZihhdTEwMDBfbWFjX2FkZHIpKTsKKwkJc2V0dXBfaHdfcmluZ3MoYXVwLCBNQUMwX1JYX0RNQV9BRERSLCBNQUMwX1RYX0RNQV9BRERSKTsKKwkJYXVwLT5tYWNfaWQgPSAwOworCQlhdV9tYWNzWzBdID0gYXVwOworCX0KKwkJZWxzZQorCWlmIChpb2FkZHIgPT0gaWZsaXN0WzFdLmJhc2VfYWRkcikKKwl7CisJCQlhdXAtPmVuYWJsZSA9ICh2b2xhdGlsZSB1MzIgKikgCisJCQkJKCh1bnNpZ25lZCBsb25nKWlmbGlzdFsxXS5tYWNlbl9hZGRyKTsKKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGF1MTAwMF9tYWNfYWRkciwgc2l6ZW9mKGF1MTAwMF9tYWNfYWRkcikpOworCQlkZXYtPmRldl9hZGRyWzRdICs9IDB4MTA7CisJCXNldHVwX2h3X3JpbmdzKGF1cCwgTUFDMV9SWF9ETUFfQUREUiwgTUFDMV9UWF9ETUFfQUREUik7CisJCWF1cC0+bWFjX2lkID0gMTsKKwkJYXVfbWFjc1sxXSA9IGF1cDsKKwl9CisJZWxzZQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYmFkIGlvYWRkclxuIiwgZGV2LT5uYW1lKTsKKwl9CisKKwkvKiBicmluZyB0aGUgZGV2aWNlIG91dCBvZiByZXNldCwgb3RoZXJ3aXNlIHByb2JpbmcgdGhlIG1paQorCSAqIHdpbGwgaGFuZyAqLworCSphdXAtPmVuYWJsZSA9IE1BQ19FTl9DTE9DS19FTkFCTEU7CisJYXVfc3luY19kZWxheSgyKTsKKwkqYXVwLT5lbmFibGUgPSBNQUNfRU5fUkVTRVQwIHwgTUFDX0VOX1JFU0VUMSB8IAorCQlNQUNfRU5fUkVTRVQyIHwgTUFDX0VOX0NMT0NLX0VOQUJMRTsKKwlhdV9zeW5jX2RlbGF5KDIpOworCisJYXVwLT5taWkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlpX3BoeSksIEdGUF9LRVJORUwpOworCWlmICghYXVwLT5taWkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogb3V0IG9mIG1lbW9yeVxuIiwgZGV2LT5uYW1lKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlhdXAtPm1paS0+bWlpX2NvbnRyb2xfcmVnID0gMDsKKwlhdXAtPm1paS0+bWlpX2RhdGFfcmVnID0gMDsKKworCWlmIChtaWlfcHJvYmUoZGV2KSAhPSAwKSB7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlwREJmcmVlID0gTlVMTDsKKwkvKiBzZXR1cCB0aGUgZGF0YSBidWZmZXIgZGVzY3JpcHRvcnMgYW5kIGF0dGFjaCBhIGJ1ZmZlciB0byBlYWNoIG9uZSAqLworCXBEQiA9IGF1cC0+ZGI7CisJZm9yIChpID0gMDsgaSA8IChOVU1fVFhfQlVGRlMrTlVNX1JYX0JVRkZTKTsgaSsrKSB7CisJCXBEQi0+cG5leHQgPSBwREJmcmVlOworCQlwREJmcmVlID0gcERCOworCQlwREItPnZhZGRyID0gKHUzMiAqKSgodW5zaWduZWQpYXVwLT52YWRkciArIE1BWF9CVUZfU0laRSppKTsKKwkJcERCLT5kbWFfYWRkciA9IChkbWFfYWRkcl90KXZpcnRfdG9fYnVzKHBEQi0+dmFkZHIpOworCQlwREIrKzsKKwl9CisJYXVwLT5wREJmcmVlID0gcERCZnJlZTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfRE1BOyBpKyspIHsKKwkJcERCID0gR2V0RnJlZURCKGF1cCk7CisJCWlmICghcERCKSB7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJYXVwLT5yeF9kbWFfcmluZ1tpXS0+YnVmZl9zdGF0ID0gKHVuc2lnbmVkKXBEQi0+ZG1hX2FkZHI7CisJCWF1cC0+cnhfZGJfaW51c2VbaV0gPSBwREI7CisJfQorCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfRE1BOyBpKyspIHsKKwkJcERCID0gR2V0RnJlZURCKGF1cCk7CisJCWlmICghcERCKSB7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJYXVwLT50eF9kbWFfcmluZ1tpXS0+YnVmZl9zdGF0ID0gKHVuc2lnbmVkKXBEQi0+ZG1hX2FkZHI7CisJCWF1cC0+dHhfZG1hX3JpbmdbaV0tPmxlbiA9IDA7CisJCWF1cC0+dHhfZGJfaW51c2VbaV0gPSBwREI7CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJmF1cC0+bG9jayk7CisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5vcGVuID0gYXUxMDAwX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBhdTEwMDBfdHg7CisJZGV2LT5zdG9wID0gYXUxMDAwX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gYXUxMDAwX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKwlkZXYtPmRvX2lvY3RsID0gJmF1MTAwMF9pb2N0bDsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmYXUxMDAwX2V0aHRvb2xfb3BzKTsKKwlkZXYtPnNldF9jb25maWcgPSAmYXUxMDAwX3NldF9jb25maWc7CisJZGV2LT50eF90aW1lb3V0ID0gYXUxMDAwX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IEVUSF9UWF9USU1FT1VUOworCisJLyogCisJICogVGhlIGJvb3QgY29kZSB1c2VzIHRoZSBldGhlcm5ldCBjb250cm9sbGVyLCBzbyByZXNldCBpdCB0byBzdGFydCAKKwkgKiBmcmVzaC4gIGF1MTAwMF9pbml0KCkgZXhwZWN0cyB0aGF0IHRoZSBkZXZpY2UgaXMgaW4gcmVzZXQgc3RhdGUuCisJICovCisJcmVzZXRfbWFjKGRldik7CisKKwlyZXR1cm4gZGV2OworCitlcnJfb3V0OgorCS8qIGhlcmUgd2Ugc2hvdWxkIGhhdmUgYSB2YWxpZCBkZXYgcGx1cyBhdXAtPiByZWdpc3RlciBhZGRyZXNzZXMKKwkgKiBzbyB3ZSBjYW4gcmVzZXQgdGhlIG1hYyBwcm9wZXJseS4qLworCXJlc2V0X21hYyhkZXYpOworCWlmIChhdXAtPm1paSkKKwkJa2ZyZWUoYXVwLT5taWkpOworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfRE1BOyBpKyspIHsKKwkJaWYgKGF1cC0+cnhfZGJfaW51c2VbaV0pCisJCQlSZWxlYXNlREIoYXVwLCBhdXAtPnJ4X2RiX2ludXNlW2ldKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9ETUE7IGkrKykgeworCQlpZiAoYXVwLT50eF9kYl9pbnVzZVtpXSkKKwkJCVJlbGVhc2VEQihhdXAsIGF1cC0+dHhfZGJfaW51c2VbaV0pOworCX0KKwlkbWFfZnJlZV9ub25jb2hlcmVudChOVUxMLAorCQkJTUFYX0JVRl9TSVpFICogKE5VTV9UWF9CVUZGUytOVU1fUlhfQlVGRlMpLAorCQkJKHZvaWQgKilhdXAtPnZhZGRyLAorCQkJYXVwLT5kbWFfYWRkcik7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihDUEhZU0FERFIoaW9hZGRyKSwgTUFDX0lPU0laRSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIAorICogSW5pdGlhbGl6ZSB0aGUgaW50ZXJmYWNlLgorICoKKyAqIFdoZW4gdGhlIGRldmljZSBwb3dlcnMgdXAsIHRoZSBjbG9ja3MgYXJlIGRpc2FibGVkIGFuZCB0aGUKKyAqIG1hYyBpcyBpbiByZXNldCBzdGF0ZS4gIFdoZW4gdGhlIGludGVyZmFjZSBpcyBjbG9zZWQsIHdlCisgKiBkbyB0aGUgc2FtZSAtLSByZXNldCB0aGUgZGV2aWNlIGFuZCBkaXNhYmxlIHRoZSBjbG9ja3MgdG8KKyAqIGNvbnNlcnZlIHBvd2VyLiBUaHVzLCB3aGVuZXZlciBhdTEwMDBfaW5pdCgpIGlzIGNhbGxlZCwKKyAqIHRoZSBkZXZpY2Ugc2hvdWxkIGFscmVhZHkgYmUgaW4gcmVzZXQgc3RhdGUuCisgKi8KK3N0YXRpYyBpbnQgYXUxMDAwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXUzMiBmbGFnczsKKwlpbnQgaTsKKwl1MzIgY29udHJvbDsKKwl1MTYgbGluaywgc3BlZWQ7CisKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkgCisJCXByaW50aygiJXM6IGF1MTAwMF9pbml0XG4iLCBkZXYtPm5hbWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmF1cC0+bG9jaywgZmxhZ3MpOworCisJLyogYnJpbmcgdGhlIGRldmljZSBvdXQgb2YgcmVzZXQgKi8KKwkqYXVwLT5lbmFibGUgPSBNQUNfRU5fQ0xPQ0tfRU5BQkxFOworICAgICAgICBhdV9zeW5jX2RlbGF5KDIpOworCSphdXAtPmVuYWJsZSA9IE1BQ19FTl9SRVNFVDAgfCBNQUNfRU5fUkVTRVQxIHwgCisJCU1BQ19FTl9SRVNFVDIgfCBNQUNfRU5fQ0xPQ0tfRU5BQkxFOworCWF1X3N5bmNfZGVsYXkoMjApOworCisJYXVwLT5tYWMtPmNvbnRyb2wgPSAwOworCWF1cC0+dHhfaGVhZCA9IChhdXAtPnR4X2RtYV9yaW5nWzBdLT5idWZmX3N0YXQgJiAweEMpID4+IDI7CisJYXVwLT50eF90YWlsID0gYXVwLT50eF9oZWFkOworCWF1cC0+cnhfaGVhZCA9IChhdXAtPnJ4X2RtYV9yaW5nWzBdLT5idWZmX3N0YXQgJiAweEMpID4+IDI7CisKKwlhdXAtPm1hYy0+bWFjX2FkZHJfaGlnaCA9IGRldi0+ZGV2X2FkZHJbNV08PDggfCBkZXYtPmRldl9hZGRyWzRdOworCWF1cC0+bWFjLT5tYWNfYWRkcl9sb3cgPSBkZXYtPmRldl9hZGRyWzNdPDwyNCB8IGRldi0+ZGV2X2FkZHJbMl08PDE2IHwKKwkJZGV2LT5kZXZfYWRkclsxXTw8OCB8IGRldi0+ZGV2X2FkZHJbMF07CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RNQTsgaSsrKSB7CisJCWF1cC0+cnhfZG1hX3JpbmdbaV0tPmJ1ZmZfc3RhdCB8PSBSWF9ETUFfRU5BQkxFOworCX0KKwlhdV9zeW5jKCk7CisKKwlhdXAtPnBoeV9vcHMtPnBoeV9zdGF0dXMoZGV2LCBhdXAtPnBoeV9hZGRyLCAmbGluaywgJnNwZWVkKTsKKwljb250cm9sID0gTUFDX0RJU0FCTEVfUlhfT1dOIHwgTUFDX1JYX0VOQUJMRSB8IE1BQ19UWF9FTkFCTEU7CisjaWZuZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgorCWNvbnRyb2wgfD0gTUFDX0JJR19FTkRJQU47CisjZW5kaWYKKwlpZiAobGluayAmJiAoZGV2LT5pZl9wb3J0ID09IElGX1BPUlRfMTAwQkFTRUZYKSkgeworCQljb250cm9sIHw9IE1BQ19GVUxMX0RVUExFWDsKKwl9CisKKwkvKiBmaXggZm9yIHN0YXJ0dXAgd2l0aG91dCBjYWJsZSAqLworCWlmICghbGluaykgCisJCWRldi0+ZmxhZ3MgJj0gfklGRl9SVU5OSU5HOworCisJYXVwLT5tYWMtPmNvbnRyb2wgPSBjb250cm9sOworCWF1cC0+bWFjLT52bGFuMV90YWcgPSAweDgxMDA7IC8qIGFjdGl2YXRlIHZsYW4gc3VwcG9ydCAqLworCWF1X3N5bmMoKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1cC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdTEwMDBfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgY2hhciBpZl9wb3J0OworCXUxNiBsaW5rLCBzcGVlZDsKKworCWlmICghZGV2KSB7CisJCS8qIGZhdGFsIGVycm9yLCBkb24ndCByZXN0YXJ0IHRoZSB0aW1lciAqLworCQlwcmludGsoS0VSTl9FUlIgImF1MTAwMF90aW1lciBlcnJvcjogTlVMTCBkZXZcbiIpOworCQlyZXR1cm47CisJfQorCisJaWZfcG9ydCA9IGRldi0+aWZfcG9ydDsKKwlpZiAoYXVwLT5waHlfb3BzLT5waHlfc3RhdHVzKGRldiwgYXVwLT5waHlfYWRkciwgJmxpbmssICZzcGVlZCkgPT0gMCkgeworCQlpZiAobGluaykgeworCQkJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9SVU5OSU5HKSkgeworCQkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJCQlkZXYtPmZsYWdzIHw9IElGRl9SVU5OSU5HOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHVwXG4iLCBkZXYtPm5hbWUpOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUlVOTklORykgeworCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQkJZGV2LT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7CisJCQkJZGV2LT5pZl9wb3J0ID0gMDsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayBkb3duXG4iLCBkZXYtPm5hbWUpOworCQkJfQorCQl9CisJfQorCisJaWYgKGxpbmsgJiYgKGRldi0+aWZfcG9ydCAhPSBpZl9wb3J0KSAmJiAKKwkJCShkZXYtPmlmX3BvcnQgIT0gSUZfUE9SVF9VTktOT1dOKSkgeworCQloYXJkX3N0b3AoZGV2KTsKKwkJaWYgKGRldi0+aWZfcG9ydCA9PSBJRl9QT1JUXzEwMEJBU0VGWCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGdvaW5nIHRvIGZ1bGwgZHVwbGV4XG4iLCAKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCWF1cC0+bWFjLT5jb250cm9sIHw9IE1BQ19GVUxMX0RVUExFWDsKKwkJCWF1X3N5bmNfZGVsYXkoMSk7CisJCX0KKwkJZWxzZSB7CisJCQlhdXAtPm1hYy0+Y29udHJvbCAmPSB+TUFDX0ZVTExfRFVQTEVYOworCQkJYXVfc3luY19kZWxheSgxKTsKKwkJfQorCQllbmFibGVfcnhfdHgoZGV2KTsKKwl9CisKKwlhdXAtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQoKDEqSFopKTsgCisJYXVwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWF1cC0+dGltZXIuZnVuY3Rpb24gPSAmYXUxMDAwX3RpbWVyOyAvKiB0aW1lciBoYW5kbGVyICovCisJYWRkX3RpbWVyKCZhdXAtPnRpbWVyKTsKKworfQorCitzdGF0aWMgaW50IGF1MTAwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpCisJCXByaW50aygiJXM6IG9wZW46IGRldj0lcFxuIiwgZGV2LT5uYW1lLCBkZXYpOworCisJaWYgKChyZXR2YWwgPSBhdTEwMDBfaW5pdChkZXYpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBpbiBhdTEwMDBfaW5pdFxuIiwgZGV2LT5uYW1lKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCXJldHVybiByZXR2YWw7CisJfQorCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmYXUxMDAwX2ludGVycnVwdCwgMCwgCisJCQkJCWRldi0+bmFtZSwgZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBJUlEgJWRcbiIsIAorCQkJCWRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWluaXRfdGltZXIoJmF1cC0+dGltZXIpOyAvKiB1c2VkIGluIGlvY3RsKCkgKi8KKwlhdXAtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQoKDMqSFopKTsgCisJYXVwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWF1cC0+dGltZXIuZnVuY3Rpb24gPSAmYXUxMDAwX3RpbWVyOyAvKiB0aW1lciBoYW5kbGVyICovCisJYWRkX3RpbWVyKCZhdXAtPnRpbWVyKTsKKworCWlmIChhdTEwMDBfZGVidWcgPiA0KQorCQlwcmludGsoIiVzOiBvcGVuOiBJbml0aWFsaXphdGlvbiBkb25lLlxuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1MTAwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXUzMiBmbGFnczsKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpCisJCXByaW50aygiJXM6IGNsb3NlOiBkZXY9JXBcbiIsIGRldi0+bmFtZSwgZGV2KTsKKworCXJlc2V0X21hYyhkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmF1cC0+bG9jaywgZmxhZ3MpOworCQorCS8qIHN0b3AgdGhlIGRldmljZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIGRpc2FibGUgdGhlIGludGVycnVwdCAqLworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1cC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdTEwMDBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwOworCisJZm9yIChpID0gMDsgaSA8IG51bV9pZnM7IGkrKykgeworCQlkZXYgPSBpZmxpc3RbaV0uZGV2OworCQlpZiAoZGV2KSB7CisJCQlhdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQlpZiAoYXVwLT5taWkpCisJCQkJa2ZyZWUoYXVwLT5taWkpOworCQkJZm9yIChqID0gMDsgaiA8IE5VTV9SWF9ETUE7IGorKykgeworCQkJCWlmIChhdXAtPnJ4X2RiX2ludXNlW2pdKQorCQkJCQlSZWxlYXNlREIoYXVwLCBhdXAtPnJ4X2RiX2ludXNlW2pdKTsKKwkJCX0KKwkJCWZvciAoaiA9IDA7IGogPCBOVU1fVFhfRE1BOyBqKyspIHsKKwkJCQlpZiAoYXVwLT50eF9kYl9pbnVzZVtqXSkKKwkJCQkJUmVsZWFzZURCKGF1cCwgYXVwLT50eF9kYl9pbnVzZVtqXSk7CisJCQl9CisJCQlkbWFfZnJlZV9ub25jb2hlcmVudChOVUxMLAorCQkJCQlNQVhfQlVGX1NJWkUgKiAoTlVNX1RYX0JVRkZTK05VTV9SWF9CVUZGUyksCisJCQkJCSh2b2lkICopYXVwLT52YWRkciwKKwkJCQkJYXVwLT5kbWFfYWRkcik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJcmVsZWFzZV9tZW1fcmVnaW9uKENQSFlTQUREUihpZmxpc3RbaV0uYmFzZV9hZGRyKSwgTUFDX0lPU0laRSk7CisJCX0KKwl9Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIAordXBkYXRlX3R4X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdGF0dXMsIHUzMiBwa3RfbGVuKQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBzID0gJmF1cC0+c3RhdHM7CisKKwlwcy0+dHhfcGFja2V0cysrOworCXBzLT50eF9ieXRlcyArPSBwa3RfbGVuOworCisJaWYgKHN0YXR1cyAmIFRYX0ZSQU1FX0FCT1JURUQpIHsKKwkJaWYgKGRldi0+aWZfcG9ydCA9PSBJRl9QT1JUXzEwMEJBU0VGWCkgeworCQkJaWYgKHN0YXR1cyAmIChUWF9KQUJfVElNRU9VVCB8IFRYX1VOREVSUlVOKSkgeworCQkJCS8qIGFueSBvdGhlciB0eCBlcnJvcnMgYXJlIG9ubHkgdmFsaWQKKwkJCQkgKiBpbiBoYWxmIGR1cGxleCBtb2RlICovCisJCQkJcHMtPnR4X2Vycm9ycysrOworCQkJCXBzLT50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJcHMtPnR4X2Vycm9ycysrOworCQkJcHMtPnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgKFRYX05PX0NBUlJJRVIgfCBUWF9MT1NTX0NBUlJJRVIpKQorCQkJCXBzLT50eF9jYXJyaWVyX2Vycm9ycysrOworCQl9CisJfQorfQorCisKKy8qCisgKiBDYWxsZWQgZnJvbSB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSB0byBhY2tub3dsZWRnZQorICogdGhlIFRYIERPTkUgYml0cy4gIFRoaXMgaXMgYSBtdXN0IGlmIHRoZSBpcnEgaXMgc2V0dXAgYXMKKyAqIGVkZ2UgdHJpZ2dlcmVkLgorICovCitzdGF0aWMgdm9pZCBhdTEwMDBfdHhfYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKwl2b2xhdGlsZSB0eF9kbWFfdCAqcHR4ZDsKKworCXB0eGQgPSBhdXAtPnR4X2RtYV9yaW5nW2F1cC0+dHhfdGFpbF07CisKKwl3aGlsZSAocHR4ZC0+YnVmZl9zdGF0ICYgVFhfVF9ET05FKSB7CisJCXVwZGF0ZV90eF9zdGF0cyhkZXYsIHB0eGQtPnN0YXR1cywgcHR4ZC0+bGVuICYgMHgzZmYpOworCQlwdHhkLT5idWZmX3N0YXQgJj0gflRYX1RfRE9ORTsKKwkJcHR4ZC0+bGVuID0gMDsKKwkJYXVfc3luYygpOworCisJCWF1cC0+dHhfdGFpbCA9IChhdXAtPnR4X3RhaWwgKyAxKSAmIChOVU1fVFhfRE1BIC0gMSk7CisJCXB0eGQgPSBhdXAtPnR4X2RtYV9yaW5nW2F1cC0+dHhfdGFpbF07CisKKwkJaWYgKGF1cC0+dHhfZnVsbCkgeworCQkJYXVwLT50eF9mdWxsID0gMDsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCX0KK30KKworCisvKgorICogQXUxMDAwIHRyYW5zbWl0IHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQgYXUxMDAwX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKwl2b2xhdGlsZSB0eF9kbWFfdCAqcHR4ZDsKKwl1MzIgYnVmZl9zdGF0OworCWRiX2Rlc3RfdCAqcERCOworCWludCBpOworCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDUpCisJCXByaW50aygiJXM6IHR4OiBhdXAgJXggbGVuPSVkLCBkYXRhPSVwLCBoZWFkICVkXG4iLCAKKwkJCQlkZXYtPm5hbWUsICh1bnNpZ25lZClhdXAsIHNrYi0+bGVuLCAKKwkJCQlza2ItPmRhdGEsIGF1cC0+dHhfaGVhZCk7CisKKwlwdHhkID0gYXVwLT50eF9kbWFfcmluZ1thdXAtPnR4X2hlYWRdOworCWJ1ZmZfc3RhdCA9IHB0eGQtPmJ1ZmZfc3RhdDsKKwlpZiAoYnVmZl9zdGF0ICYgVFhfRE1BX0VOQUJMRSkgeworCQkvKiBXZSd2ZSB3cmFwcGVkIGFyb3VuZCBhbmQgdGhlIHRyYW5zbWl0dGVyIGlzIHN0aWxsIGJ1c3kgKi8KKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlhdXAtPnR4X2Z1bGwgPSAxOworCQlyZXR1cm4gMTsKKwl9CisJZWxzZSBpZiAoYnVmZl9zdGF0ICYgVFhfVF9ET05FKSB7CisJCXVwZGF0ZV90eF9zdGF0cyhkZXYsIHB0eGQtPnN0YXR1cywgcHR4ZC0+bGVuICYgMHgzZmYpOworCQlwdHhkLT5sZW4gPSAwOworCX0KKworCWlmIChhdXAtPnR4X2Z1bGwpIHsKKwkJYXVwLT50eF9mdWxsID0gMDsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworCXBEQiA9IGF1cC0+dHhfZGJfaW51c2VbYXVwLT50eF9oZWFkXTsKKwltZW1jcHkoKHZvaWQgKilwREItPnZhZGRyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgeworCQlmb3IgKGk9c2tiLT5sZW47IGk8RVRIX1pMRU47IGkrKykgeyAKKwkJCSgoY2hhciAqKXBEQi0+dmFkZHIpW2ldID0gMDsKKwkJfQorCQlwdHhkLT5sZW4gPSBFVEhfWkxFTjsKKwl9CisJZWxzZQorCQlwdHhkLT5sZW4gPSBza2ItPmxlbjsKKworCXB0eGQtPmJ1ZmZfc3RhdCA9IHBEQi0+ZG1hX2FkZHIgfCBUWF9ETUFfRU5BQkxFOworCWF1X3N5bmMoKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJYXVwLT50eF9oZWFkID0gKGF1cC0+dHhfaGVhZCArIDEpICYgKE5VTV9UWF9ETUEgLSAxKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3J4X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdGF0dXMpCit7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcHMgPSAmYXVwLT5zdGF0czsKKworCXBzLT5yeF9wYWNrZXRzKys7CisJaWYgKHN0YXR1cyAmIFJYX01DQVNUX0ZSQU1FKQorCQlwcy0+bXVsdGljYXN0Kys7CisKKwlpZiAoc3RhdHVzICYgUlhfRVJST1IpIHsKKwkJcHMtPnJ4X2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgUlhfTUlTU0VEX0ZSQU1FKQorCQkJcHMtPnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIChSWF9PVkVSTEVOIHwgUlhfT1ZFUkxFTiB8IFJYX0xFTl9FUlJPUikpCisJCQlwcy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgUlhfQ1JDX0VSUk9SKQorCQkJcHMtPnJ4X2NyY19lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJYX0NPTEwpCisJCQlwcy0+Y29sbGlzaW9ucysrOworCX0KKwllbHNlIAorCQlwcy0+cnhfYnl0ZXMgKz0gc3RhdHVzICYgUlhfRlJBTUVfTEVOX01BU0s7CisKK30KKworLyoKKyAqIEF1MTAwMCByZWNlaXZlIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQgYXUxMDAwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXZvbGF0aWxlIHJ4X2RtYV90ICpwcnhkOworCXUzMiBidWZmX3N0YXQsIHN0YXR1czsKKwlkYl9kZXN0X3QgKnBEQjsKKwl1MzIJZnJtbGVuOworCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDUpCisJCXByaW50aygiJXM6IGF1MTAwMF9yeCBoZWFkICVkXG4iLCBkZXYtPm5hbWUsIGF1cC0+cnhfaGVhZCk7CisKKwlwcnhkID0gYXVwLT5yeF9kbWFfcmluZ1thdXAtPnJ4X2hlYWRdOworCWJ1ZmZfc3RhdCA9IHByeGQtPmJ1ZmZfc3RhdDsKKwl3aGlsZSAoYnVmZl9zdGF0ICYgUlhfVF9ET05FKSAgeworCQlzdGF0dXMgPSBwcnhkLT5zdGF0dXM7CisJCXBEQiA9IGF1cC0+cnhfZGJfaW51c2VbYXVwLT5yeF9oZWFkXTsKKwkJdXBkYXRlX3J4X3N0YXRzKGRldiwgc3RhdHVzKTsKKwkJaWYgKCEoc3RhdHVzICYgUlhfRVJST1IpKSAgeworCisJCQkvKiBnb29kIGZyYW1lICovCisJCQlmcm1sZW4gPSAoc3RhdHVzICYgUlhfRlJBTUVfTEVOX01BU0spOworCQkJZnJtbGVuIC09IDQ7IC8qIFJlbW92ZSBGQ1MgKi8KKwkJCXNrYiA9IGRldl9hbGxvY19za2IoZnJtbGVuICsgMik7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQlhdXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBJUCBoZWFkZXIgYWxpZ24gKi8KKwkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLAorCQkJCSh1bnNpZ25lZCBjaGFyICopcERCLT52YWRkciwgZnJtbGVuLCAwKTsKKwkJCXNrYl9wdXQoc2tiLCBmcm1sZW4pOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CS8qIHBhc3MgdGhlIHBhY2tldCB0byB1cHBlciBsYXllcnMgKi8KKwkJfQorCQllbHNlIHsKKwkJCWlmIChhdTEwMDBfZGVidWcgPiA0KSB7CisJCQkJaWYgKHN0YXR1cyAmIFJYX01JU1NFRF9GUkFNRSkgCisJCQkJCXByaW50aygicnggbWlzc1xuIik7CisJCQkJaWYgKHN0YXR1cyAmIFJYX1dET0dfVElNRVIpIAorCQkJCQlwcmludGsoInJ4IHdkb2dcbiIpOworCQkJCWlmIChzdGF0dXMgJiBSWF9SVU5UKSAKKwkJCQkJcHJpbnRrKCJyeCBydW50XG4iKTsKKwkJCQlpZiAoc3RhdHVzICYgUlhfT1ZFUkxFTikgCisJCQkJCXByaW50aygicnggb3ZlcmxlblxuIik7CisJCQkJaWYgKHN0YXR1cyAmIFJYX0NPTEwpCisJCQkJCXByaW50aygicnggY29sbFxuIik7CisJCQkJaWYgKHN0YXR1cyAmIFJYX01JSV9FUlJPUikKKwkJCQkJcHJpbnRrKCJyeCBtaWkgZXJyb3JcbiIpOworCQkJCWlmIChzdGF0dXMgJiBSWF9DUkNfRVJST1IpCisJCQkJCXByaW50aygicnggY3JjIGVycm9yXG4iKTsKKwkJCQlpZiAoc3RhdHVzICYgUlhfTEVOX0VSUk9SKQorCQkJCQlwcmludGsoInJ4IGxlbiBlcnJvclxuIik7CisJCQkJaWYgKHN0YXR1cyAmIFJYX1VfQ05UUkxfRlJBTUUpCisJCQkJCXByaW50aygicnggdSBjb250cm9sIGZyYW1lXG4iKTsKKwkJCQlpZiAoc3RhdHVzICYgUlhfTUlTU0VEX0ZSQU1FKQorCQkJCQlwcmludGsoInJ4IG1pc3NcbiIpOworCQkJfQorCQl9CisJCXByeGQtPmJ1ZmZfc3RhdCA9ICh1MzIpKHBEQi0+ZG1hX2FkZHIgfCBSWF9ETUFfRU5BQkxFKTsKKwkJYXVwLT5yeF9oZWFkID0gKGF1cC0+cnhfaGVhZCArIDEpICYgKE5VTV9SWF9ETUEgLSAxKTsKKwkJYXVfc3luYygpOworCisJCS8qIG5leHQgZGVzY3JpcHRvciAqLworCQlwcnhkID0gYXVwLT5yeF9kbWFfcmluZ1thdXAtPnJ4X2hlYWRdOworCQlidWZmX3N0YXQgPSBwcnhkLT5idWZmX3N0YXQ7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiBBdTEwMDAgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4KKyAqLworc3RhdGljIGlycXJldHVybl90IGF1MTAwMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpc3I6IG51bGwgZGV2IHB0clxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIElSUV9SRVRWQUwoMSk7CisJfQorCisJLyogSGFuZGxlIFJYIGludGVycnVwdHMgZmlyc3QgdG8gbWluaW1pemUgY2hhbmNlIG9mIG92ZXJydW4gKi8KKworCWF1MTAwMF9yeChkZXYpOworCWF1MTAwMF90eF9hY2soZGV2KTsKKwlyZXR1cm4gSVJRX1JFVFZBTCgxKTsKK30KKworCisvKgorICogVGhlIFR4IHJpbmcgaGFzIGJlZW4gZnVsbCBsb25nZXIgdGhhbiB0aGUgd2F0Y2hkb2cgdGltZW91dAorICogdmFsdWUuIFRoZSB0cmFuc21pdHRlciBtdXN0IGJlIGh1bmc/CisgKi8KK3N0YXRpYyB2b2lkIGF1MTAwMF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHJpbnRrKEtFUk5fRVJSICIlczogYXUxMDAwX3R4X3RpbWVvdXQ6IGRldj0lcFxuIiwgZGV2LT5uYW1lLCBkZXYpOworCXJlc2V0X21hYyhkZXYpOworCWF1MTAwMF9pbml0KGRldik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBjb25zdCBldGhlcm5ldF9wb2x5bm9taWFsID0gMHgwNGMxMWRiN1U7CitzdGF0aWMgaW5saW5lIHUzMiBldGhlcl9jcmMoaW50IGxlbmd0aCwgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKyAgICBpbnQgY3JjID0gLTE7CisKKyAgICB3aGlsZSgtLWxlbmd0aCA+PSAwKSB7CisJCXVuc2lnbmVkIGNoYXIgY3VycmVudF9vY3RldCA9ICpkYXRhKys7CisJCWludCBiaXQ7CisJCWZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyssIGN1cnJlbnRfb2N0ZXQgPj49IDEpCisJCQljcmMgPSAoY3JjIDw8IDEpIF4KKwkJCQkoKGNyYyA8IDApIF4gKGN1cnJlbnRfb2N0ZXQgJiAxKSA/IAorCQkJCSBldGhlcm5ldF9wb2x5bm9taWFsIDogMCk7CisgICAgfQorICAgIHJldHVybiBjcmM7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCWlmIChhdTEwMDBfZGVidWcgPiA0KSAKKwkJcHJpbnRrKCIlczogc2V0X3J4X21vZGU6IGZsYWdzPSV4XG4iLCBkZXYtPm5hbWUsIGRldi0+ZmxhZ3MpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkJCS8qIFNldCBwcm9taXNjdW91cy4gKi8KKwkJYXVwLT5tYWMtPmNvbnRyb2wgfD0gTUFDX1BST01JU0NVT1VTOworCQlwcmludGsoS0VSTl9JTkZPICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwl9IGVsc2UgaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSAgfHwKKwkJCSAgIGRldi0+bWNfY291bnQgPiBNVUxUSUNBU1RfRklMVEVSX0xJTUlUKSB7CisJCWF1cC0+bWFjLT5jb250cm9sIHw9IE1BQ19QQVNTX0FMTF9NVUxUSTsKKwkJYXVwLT5tYWMtPmNvbnRyb2wgJj0gfk1BQ19QUk9NSVNDVU9VUzsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBhc3MgYWxsIG11bHRpY2FzdFxuIiwgZGV2LT5uYW1lKTsKKwl9IGVsc2UgeworCQlpbnQgaTsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCXUzMiBtY19maWx0ZXJbMl07CS8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworCisJCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IDA7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkJIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQlzZXRfYml0KGV0aGVyX2NyYyhFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcik+PjI2LCAKKwkJCQkJKGxvbmcgKiltY19maWx0ZXIpOworCQl9CisJCWF1cC0+bWFjLT5tdWx0aV9oYXNoX2hpZ2ggPSBtY19maWx0ZXJbMV07CisJCWF1cC0+bWFjLT5tdWx0aV9oYXNoX2xvdyA9IG1jX2ZpbHRlclswXTsKKwkJYXVwLT5tYWMtPmNvbnRyb2wgJj0gfk1BQ19QUk9NSVNDVU9VUzsKKwkJYXVwLT5tYWMtPmNvbnRyb2wgfD0gTUFDX0hBU0hfTU9ERTsKKwl9Cit9CisKKworc3RhdGljIGludCBhdTEwMDBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTE2ICpkYXRhID0gKHUxNiAqKSZycS0+aWZyX2lmcnU7CisKKwlzd2l0Y2goY21kKSB7IAorCQljYXNlIFNJT0NERVZQUklWQVRFOgkvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIFBIWSBpbiB1c2UuICovCisJCWNhc2UgU0lPQ0dNSUlQSFk6CisJCSAgICAgICAgaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHJldHVybiAtRUlOVkFMOworCQkJZGF0YVswXSA9IGF1cC0+cGh5X2FkZHI7CisJCWNhc2UgU0lPQ0RFVlBSSVZBVEUrMToJLyogUmVhZCB0aGUgc3BlY2lmaWVkIE1JSSByZWdpc3Rlci4gKi8KKwkJY2FzZSBTSU9DR01JSVJFRzoKKwkJCWRhdGFbM10gPSAgbWRpb19yZWFkKGRldiwgZGF0YVswXSwgZGF0YVsxXSk7IAorCQkJcmV0dXJuIDA7CisJCWNhc2UgU0lPQ0RFVlBSSVZBVEUrMjoJLyogV3JpdGUgdGhlIHNwZWNpZmllZCBNSUkgcmVnaXN0ZXIgKi8KKwkJY2FzZSBTSU9DU01JSVJFRzogCisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCW1kaW9fd3JpdGUoZGV2LCBkYXRhWzBdLCBkYXRhWzFdLGRhdGFbMl0pOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCit9CisKKworc3RhdGljIGludCBhdTEwMDBfc2V0X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKK3sKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXUxNiBjb250cm9sOworCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpICB7CisJCXByaW50aygiJXM6IHNldF9jb25maWcgY2FsbGVkOiBkZXYtPmlmX3BvcnQgJWQgbWFwLT5wb3J0ICV4XG4iLCAKKwkJCQlkZXYtPm5hbWUsIGRldi0+aWZfcG9ydCwgbWFwLT5wb3J0KTsKKwl9CisKKwlzd2l0Y2gobWFwLT5wb3J0KXsKKwkJY2FzZSBJRl9QT1JUX1VOS05PV046IC8qIHVzZSBhdXRvIGhlcmUgKi8gICAKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjb25maWcgcGh5IGZvciBhbmVnXG4iLCAKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCWRldi0+aWZfcG9ydCA9IG1hcC0+cG9ydDsKKwkJCS8qIExpbmsgRG93bjogdGhlIHRpbWVyIHdpbGwgYnJpbmcgaXQgdXAgKi8KKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCisJCQkvKiByZWFkIGN1cnJlbnQgY29udHJvbCAqLworCQkJY29udHJvbCA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwkJCWNvbnRyb2wgJj0gfihNSUlfQ05UTF9GRFggfCBNSUlfQ05UTF9GMTAwKTsKKworCQkJLyogZW5hYmxlIGF1dG8gbmVnb3RpYXRpb24gYW5kIHJlc2V0IHRoZSBuZWdvdGlhdGlvbiAqLworCQkJbWRpb193cml0ZShkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9DT05UUk9MLCAKKwkJCQkJY29udHJvbCB8IE1JSV9DTlRMX0FVVE8gfCAKKwkJCQkJTUlJX0NOVExfUlNUX0FVVE8pOworCisJCQlicmVhazsKKyAgICAKKwkJY2FzZSBJRl9QT1JUXzEwQkFTRVQ6IC8qIDEwQmFzZVQgKi8gICAgICAgICAKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjb25maWcgcGh5IGZvciAxMEJhc2VUXG4iLCAKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCWRldi0+aWZfcG9ydCA9IG1hcC0+cG9ydDsKKwkKKwkJCS8qIExpbmsgRG93bjogdGhlIHRpbWVyIHdpbGwgYnJpbmcgaXQgdXAgKi8KKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwkJCS8qIHNldCBTcGVlZCB0byAxME1icHMsIEhhbGYgRHVwbGV4ICovCisJCQljb250cm9sID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0NPTlRST0wpOworCQkJY29udHJvbCAmPSB+KE1JSV9DTlRMX0YxMDAgfCBNSUlfQ05UTF9BVVRPIHwgCisJCQkJCU1JSV9DTlRMX0ZEWCk7CisJCisJCQkvKiBkaXNhYmxlIGF1dG8gbmVnb3RpYXRpb24gYW5kIGZvcmNlIDEwTS9IRCBtb2RlKi8KKwkJCW1kaW9fd3JpdGUoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgY29udHJvbCk7CisJCQlicmVhazsKKyAgICAKKwkJY2FzZSBJRl9QT1JUXzEwMEJBU0VUOiAvKiAxMDBCYXNlVCAqLworCQljYXNlIElGX1BPUlRfMTAwQkFTRVRYOiAvKiAxMDBCYXNlVHggKi8gCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY29uZmlnIHBoeSBmb3IgMTAwQmFzZVRYXG4iLCAKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCWRldi0+aWZfcG9ydCA9IG1hcC0+cG9ydDsKKwkKKwkJCS8qIExpbmsgRG93bjogdGhlIHRpbWVyIHdpbGwgYnJpbmcgaXQgdXAgKi8KKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCisJCQkvKiBzZXQgU3BlZWQgdG8gMTAwTWJwcywgSGFsZiBEdXBsZXggKi8KKwkJCS8qIGRpc2FibGUgYXV0byBuZWdvdGlhdGlvbiBhbmQgZW5hYmxlIDEwME1CaXQgTW9kZSAqLworCQkJY29udHJvbCA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwkJCWNvbnRyb2wgJj0gfihNSUlfQ05UTF9BVVRPIHwgTUlJX0NOVExfRkRYKTsKKwkJCWNvbnRyb2wgfD0gTUlJX0NOVExfRjEwMDsKKwkJCW1kaW9fd3JpdGUoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgY29udHJvbCk7CisJCQlicmVhazsKKyAgICAKKwkJY2FzZSBJRl9QT1JUXzEwMEJBU0VGWDogLyogMTAwQmFzZUZ4ICovCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY29uZmlnIHBoeSBmb3IgMTAwQmFzZUZYXG4iLCAKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCWRldi0+aWZfcG9ydCA9IG1hcC0+cG9ydDsKKwkKKwkJCS8qIExpbmsgRG93bjogdGhlIHRpbWVyIHdpbGwgYnJpbmcgaXQgdXAgKi8KKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCisJCQkvKiBzZXQgU3BlZWQgdG8gMTAwTWJwcywgRnVsbCBEdXBsZXggKi8KKwkJCS8qIGRpc2FibGUgYXV0byBuZWdvdGlhdGlvbiBhbmQgZW5hYmxlIDEwME1CaXQgTW9kZSAqLworCQkJY29udHJvbCA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwkJCWNvbnRyb2wgJj0gfk1JSV9DTlRMX0FVVE87CisJCQljb250cm9sIHw9ICBNSUlfQ05UTF9GMTAwIHwgTUlJX0NOVExfRkRYOworCQkJbWRpb193cml0ZShkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9DT05UUk9MLCBjb250cm9sKTsKKwkJCWJyZWFrOworCQljYXNlIElGX1BPUlRfMTBCQVNFMjogLyogMTBCYXNlMiAqLworCQljYXNlIElGX1BPUlRfQVVJOiAvKiBBVUkgKi8KKwkJLyogVGhlc2UgTW9kZXMgYXJlIG5vdCBzdXBwb3J0ZWQgKGFyZSB0aGV5PykqLworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogMTBCYXNlMi9BVUkgbm90IHN1cHBvcnRlZCIsIAorCQkJCQlkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisgICAgCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIG1lZGlhIHNlbGVjdGVkIiwgCisJCQkJCWRldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXUxMDAwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkKKwkJcHJpbnRrKCIlczogYXUxMDAwX2dldF9zdGF0czogZGV2PSVwXG4iLCBkZXYtPm5hbWUsIGRldik7CisKKwlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkgeworCQlyZXR1cm4gJmF1cC0+c3RhdHM7CisJfQorCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChhdTEwMDBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYXUxMDAwX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguaCBiL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjkzMjZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5oCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICoKKyAqIEFsY2hlbXkgQXUxeDAwIGV0aGVybmV0IGRyaXZlciBpbmNsdWRlIGZpbGUKKyAqCisgKiBBdXRob3I6IFBldGUgUG9wb3YgPHBwb3BvdkBtdmlzdGEuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICoKKyAqIAorICovCisKKworI2RlZmluZSBNQUNfSU9TSVpFIDB4MTAwMDAKKyNkZWZpbmUgTlVNX1JYX0RNQSA0ICAgICAgIC8qIEF1MXgwMCBoYXMgNCByeCBoYXJkd2FyZSBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBOVU1fVFhfRE1BIDQgICAgICAgLyogQXUxeDAwIGhhcyA0IHR4IGhhcmR3YXJlIGRlc2NyaXB0b3JzICovCisKKyNkZWZpbmUgTlVNX1JYX0JVRkZTIDQKKyNkZWZpbmUgTlVNX1RYX0JVRkZTIDQKKyNkZWZpbmUgTUFYX0JVRl9TSVpFIDIwNDgKKworI2RlZmluZSBFVEhfVFhfVElNRU9VVCBIWi80CisjZGVmaW5lIE1BQ19NSU5fUEtUX1NJWkUgNjQKKworI2RlZmluZSBNVUxUSUNBU1RfRklMVEVSX0xJTUlUIDY0CisKKy8qIEZJWE1FIAorICogVGhlIFBIWSBkZWZpbmVzIHNob3VsZCBiZSBpbiBhIHNlcGFyYXRlIGZpbGUuCisgKi8KKworLyogTUlJIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUJTUlJX0NPTlRST0wgMHgwMDAwCisjZGVmaW5lIE1JSV9TVEFUVVMgIDB4MDAwMQorI2RlZmluZSBNSUlfUEhZX0lEMCAweDAwMDIKKyNkZWZpbmUJTUlJX1BIWV9JRDEgMHgwMDAzCisjZGVmaW5lIE1JSV9BTkFEViAgIDB4MDAwNAorI2RlZmluZSBNSUlfQU5MUEFSICAweDAwMDUKKyNkZWZpbmUgTUlJX0FFWFAgICAgMHgwMDA2CisjZGVmaW5lIE1JSV9BTkVYVCAgIDB4MDAwNworI2RlZmluZSBNSUlfTFNJX1BIWV9DT05GSUcgMHgwMDExCisvKiBTdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0xTSV9QSFlfU1RBVCAgIDB4MDAxMgorI2RlZmluZSBNSUlfQU1EX1BIWV9TVEFUICAgTUlJX0xTSV9QSFlfU1RBVAorI2RlZmluZSBNSUlfSU5URUxfUEhZX1NUQVQgMHgwMDExCisKKyNkZWZpbmUgTUlJX0FVWF9DTlRSTCAgMHgwMDE4CisvKiBtaWkgcmVnaXN0ZXJzIHNwZWNpZmljIHRvIEFNRCA3OUM5MDEgKi8KKyNkZWZpbmUJTUlJX1NUQVRVU19TVU1NQVJZID0gMHgwMDE4CisKKy8qIE1JSSBDb250cm9sIHJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUJTUlJX0NOVExfRkRYICAgICAgMHgwMTAwCisjZGVmaW5lIE1JSV9DTlRMX1JTVF9BVVRPIDB4MDIwMAorI2RlZmluZQlNSUlfQ05UTF9JU09MQVRFICAweDA0MDAKKyNkZWZpbmUgTUlJX0NOVExfUFdSRFdOICAgMHgwODAwCisjZGVmaW5lCU1JSV9DTlRMX0FVVE8gICAgIDB4MTAwMAorI2RlZmluZSBNSUlfQ05UTF9GMTAwICAgICAweDIwMDAKKyNkZWZpbmUJTUlJX0NOVExfTFBCSyAgICAgMHg0MDAwCisjZGVmaW5lIE1JSV9DTlRMX1JFU0VUICAgIDB4ODAwMAorCisvKiBNSUkgU3RhdHVzIHJlZ2lzdGVyIGJpdCAgKi8KKyNkZWZpbmUJTUlJX1NUQVRfRVhUICAgICAgICAweDAwMDEgCisjZGVmaW5lIE1JSV9TVEFUX0pBQiAgICAgICAgMHgwMDAyCisjZGVmaW5lCU1JSV9TVEFUX0xJTksgICAgICAgMHgwMDA0CisjZGVmaW5lIE1JSV9TVEFUX0NBTl9BVVRPICAgMHgwMDA4CisjZGVmaW5lCU1JSV9TVEFUX0ZBVUxUICAgICAgMHgwMDEwIAorI2RlZmluZSBNSUlfU1RBVF9BVVRPX0RPTkUgIDB4MDAyMAorI2RlZmluZQlNSUlfU1RBVF9DQU5fVCAgICAgIDB4MDgwMAorI2RlZmluZSBNSUlfU1RBVF9DQU5fVF9GRFggIDB4MTAwMAorI2RlZmluZQlNSUlfU1RBVF9DQU5fVFggICAgIDB4MjAwMCAKKyNkZWZpbmUgTUlJX1NUQVRfQ0FOX1RYX0ZEWCAweDQwMDAKKyNkZWZpbmUJTUlJX1NUQVRfQ0FOX1Q0ICAgICAweDgwMDAKKworCisjZGVmaW5lCQlNSUlfSUQxX09VSV9MTwkJMHhGQzAwCS8qIGxvdyBiaXRzIG9mIE9VSSBtYXNrICovCisjZGVmaW5lCQlNSUlfSUQxX01PREVMCQkweDAzRjAJLyogbW9kZWwgbnVtYmVyICovCisjZGVmaW5lCQlNSUlfSUQxX1JFVgkJMHgwMDBGCS8qIG1vZGVsIG51bWJlciAqLworCisvKiBNSUkgTldBWSBSZWdpc3RlciBCaXRzIC4uLgorICAgdmFsaWQgZm9yIHRoZSBBTkFSIChBdXRvLU5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQpIGFuZAorICAgQU5MUEFSIChBdXRvLU5lZ290aWF0aW9uIExpbmsgUGFydG5lcikgcmVnaXN0ZXJzICovCisjZGVmaW5lCU1JSV9OV0FZX05PREVfU0VMIDB4MDAxZgorI2RlZmluZSBNSUlfTldBWV9DU01BX0NEICAweDAwMDEKKyNkZWZpbmUJTUlJX05XQVlfVAkgIDB4MDAyMAorI2RlZmluZSBNSUlfTldBWV9UX0ZEWCAgICAweDAwNDAKKyNkZWZpbmUJTUlJX05XQVlfVFggICAgICAgMHgwMDgwCisjZGVmaW5lIE1JSV9OV0FZX1RYX0ZEWCAgIDB4MDEwMAorI2RlZmluZQlNSUlfTldBWV9UNCAgICAgICAweDAyMDAgCisjZGVmaW5lIE1JSV9OV0FZX1BBVVNFICAgIDB4MDQwMCAKKyNkZWZpbmUJTUlJX05XQVlfUkYgICAgICAgMHgyMDAwIC8qIFJlbW90ZSBGYXVsdCAqLworI2RlZmluZSBNSUlfTldBWV9BQ0sgICAgICAweDQwMDAgLyogUmVtb3RlIEFja25vd2xlZGdlICovCisjZGVmaW5lCU1JSV9OV0FZX05QICAgICAgIDB4ODAwMCAvKiBOZXh0IFBhZ2UgKEVuYWJsZSkgKi8KKworLyogbWlpIHN0c291dCByZWdpc3RlciBiaXRzICovCisjZGVmaW5lCU1JSV9TVFNPVVRfTElOS19GQUlMIDB4NDAwMAorI2RlZmluZQlNSUlfU1RTT1VUX1NQRCAgICAgICAweDAwODAKKyNkZWZpbmUgTUlJX1NUU09VVF9EUExYICAgICAgMHgwMDQwCisKKy8qIG1paSBzdHNpY3MgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZQlNSUlfU1RTSUNTX1NQRCAgICAgICAweDgwMDAKKyNkZWZpbmUgTUlJX1NUU0lDU19EUExYICAgICAgMHg0MDAwCisjZGVmaW5lCU1JSV9TVFNJQ1NfTElOS1NUUyAgIDB4MDAwMQorCisvKiBtaWkgc3Rzc3VtIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUJTUlJX1NUU1NVTV9MSU5LICAweDAwMDgKKyNkZWZpbmUgTUlJX1NUU1NVTV9EUExYICAweDAwMDQKKyNkZWZpbmUJTUlJX1NUU1NVTV9BVVRPICAweDAwMDIKKyNkZWZpbmUgTUlJX1NUU1NVTV9TUEQgICAweDAwMDEKKworLyogbHNpIHBoeSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0xTSV9QSFlfU1RBVF9GRFgJMHgwMDQwCisjZGVmaW5lIE1JSV9MU0lfUEhZX1NUQVRfU1BECTB4MDA4MAorCisvKiBhbWQgcGh5IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQU1EX1BIWV9TVEFUX0ZEWAkweDA4MDAKKyNkZWZpbmUgTUlJX0FNRF9QSFlfU1RBVF9TUEQJMHgwNDAwCisKKy8qIGludGVsIHBoeSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0lOVEVMX1BIWV9TVEFUX0ZEWAkweDAyMDAKKyNkZWZpbmUgTUlJX0lOVEVMX1BIWV9TVEFUX1NQRAkweDQwMDAKKworLyogQXV4aWxsaWFyeSBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQVVYX0ZEWCAgICAgIDB4MDAwMQorI2RlZmluZSBNSUlfQVVYXzEwMCAgICAgIDB4MDAwMgorI2RlZmluZSBNSUlfQVVYX0YxMDAgICAgIDB4MDAwNAorI2RlZmluZSBNSUlfQVVYX0FORUcgICAgIDB4MDAwOAorCit0eXBlZGVmIHN0cnVjdCBtaWlfcGh5IHsKKwlzdHJ1Y3QgbWlpX3BoeSAqIG5leHQ7CisJc3RydWN0IG1paV9jaGlwX2luZm8gKiBjaGlwX2luZm87CisJdTE2IHN0YXR1czsKKwl1MzIgKm1paV9jb250cm9sX3JlZzsKKwl1MzIgKm1paV9kYXRhX3JlZzsKK30gbWlpX3BoeV90OworCitzdHJ1Y3QgcGh5X29wcyB7CisJaW50ICgqcGh5X2luaXQpIChzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQpOworCWludCAoKnBoeV9yZXNldCkgKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCk7CisJaW50ICgqcGh5X3N0YXR1cykgKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgdTE2ICosIHUxNiAqKTsKK307CisKKy8qIAorICogRGF0YSBCdWZmZXIgRGVzY3JpcHRvci4gRGF0YSBidWZmZXJzIG11c3QgYmUgYWxpZ25lZCBvbiAzMiBieXRlIAorICogYm91bmRhcnkgZm9yIGJvdGgsIHJlY2VpdmUgYW5kIHRyYW5zbWl0LgorICovCit0eXBlZGVmIHN0cnVjdCBkYl9kZXN0IHsKKwlzdHJ1Y3QgZGJfZGVzdCAqcG5leHQ7CisJdm9sYXRpbGUgdTMyICp2YWRkcjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworfSBkYl9kZXN0X3Q7CisKKy8qCisgKiBUaGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgZGVzY3JpcHRvcnMgYXJlIG1lbW9yeSAKKyAqIG1hcHBlZCByZWdpc3RlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHR4X2RtYSB7CisJdTMyIHN0YXR1czsKKwl1MzIgYnVmZl9zdGF0OworCXUzMiBsZW47CisJdTMyIHBhZDsKK30gdHhfZG1hX3Q7CisKK3R5cGVkZWYgc3RydWN0IHJ4X2RtYSB7CisJdTMyIHN0YXR1czsKKwl1MzIgYnVmZl9zdGF0OworCXUzMiBwYWRbMl07Cit9IHJ4X2RtYV90OworCisKKy8qCisgKiBNQUMgY29udHJvbCByZWdpc3RlcnMsIG1lbW9yeSBtYXBwZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1hY19yZWcgeworCXUzMiBjb250cm9sOworCXUzMiBtYWNfYWRkcl9oaWdoOworCXUzMiBtYWNfYWRkcl9sb3c7CisJdTMyIG11bHRpX2hhc2hfaGlnaDsKKwl1MzIgbXVsdGlfaGFzaF9sb3c7CisJdTMyIG1paV9jb250cm9sOworCXUzMiBtaWlfZGF0YTsKKwl1MzIgZmxvd19jb250cm9sOworCXUzMiB2bGFuMV90YWc7CisJdTMyIHZsYW4yX3RhZzsKK30gbWFjX3JlZ190OworCisKK3N0cnVjdCBhdTEwMDBfcHJpdmF0ZSB7CisJCisJZGJfZGVzdF90ICpwREJmcmVlOworCWRiX2Rlc3RfdCBkYltOVU1fUlhfQlVGRlMrTlVNX1RYX0JVRkZTXTsKKwl2b2xhdGlsZSByeF9kbWFfdCAqcnhfZG1hX3JpbmdbTlVNX1JYX0RNQV07CisJdm9sYXRpbGUgdHhfZG1hX3QgKnR4X2RtYV9yaW5nW05VTV9UWF9ETUFdOworCWRiX2Rlc3RfdCAqcnhfZGJfaW51c2VbTlVNX1JYX0RNQV07CisJZGJfZGVzdF90ICp0eF9kYl9pbnVzZVtOVU1fVFhfRE1BXTsKKwl1MzIgcnhfaGVhZDsKKwl1MzIgdHhfaGVhZDsKKwl1MzIgdHhfdGFpbDsKKwl1MzIgdHhfZnVsbDsKKworCWludCBtYWNfaWQ7CisJbWlpX3BoeV90ICptaWk7CisJc3RydWN0IHBoeV9vcHMgKnBoeV9vcHM7CisJCisJLyogVGhlc2UgdmFyaWFibGVzIGFyZSBqdXN0IGZvciBxdWljayBhY2Nlc3MgdG8gY2VydGFpbiByZWdzIGFkZHJlc3Nlcy4gKi8KKwl2b2xhdGlsZSBtYWNfcmVnX3QgKm1hYzsgIC8qIG1hYyByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgKi8gICAKKwl2b2xhdGlsZSB1MzIgKmVuYWJsZTsgICAgIC8qIGFkZHJlc3Mgb2YgTUFDIEVuYWJsZSBSZWdpc3RlciAgICAgKi8KKworCXUzMiB2YWRkcjsgICAgICAgICAgICAgICAgLyogdmlydHVhbCBhZGRyZXNzIG9mIHJ4L3R4IGJ1ZmZlcnMgICAqLworCWRtYV9hZGRyX3QgZG1hX2FkZHI7ICAgICAgLyogZG1hIGFkZHJlc3Mgb2YgcngvdHggYnVmZmVycyAgICAgICAqLworCisJdTggKmhhc2hfdGFibGU7CisJdTMyIGhhc2hfbW9kZTsKKwl1MzIgaW50cl93b3JrX2RvbmU7IC8qIG51bWJlciBvZiBSeCBhbmQgVHggcGt0cyBwcm9jZXNzZWQgaW4gdGhlIGlzciAqLworCWludCBwaHlfYWRkcjsgICAgICAgICAgLyogcGh5IGFkZHJlc3MgKi8KKwl1MzIgb3B0aW9uczsgICAgICAgICAgIC8qIFVzZXItc2V0dGFibGUgbWlzYy4gZHJpdmVyIG9wdGlvbnMuICovCisJdTMyIGRydl9mbGFnczsKKwlpbnQgd2FudF9hdXRvbmVnOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXNwaW5sb2NrX3QgbG9jazsgICAgICAgLyogU2VyaWFsaXNlIGFjY2VzcyB0byBkZXZpY2UgKi8KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iNDQuYyBiL2RyaXZlcnMvbmV0L2I0NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZThiYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9iNDQuYwpAQCAtMCwwICsxLDE5NzggQEAKKy8qIGI0NC5jOiBCcm9hZGNvbSA0NDAwIGRldmljZSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIEZpeGVkIGJ5IFBla2thIFBpZXRpa2FpbmVuIChwcEBlZS5vdWx1LmZpKQorICoKKyAqIERpc3RyaWJ1dGUgdW5kZXIgR1BMLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgImI0NC5oIgorCisjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJImI0NCIKKyNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMC45NSIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJBdWcgMywgMjAwNCIKKworI2RlZmluZSBCNDRfREVGX01TR19FTkFCTEUJICBcCisJKE5FVElGX01TR19EUlYJCXwgXAorCSBORVRJRl9NU0dfUFJPQkUJfCBcCisJIE5FVElGX01TR19MSU5LCQl8IFwKKwkgTkVUSUZfTVNHX1RJTUVSCXwgXAorCSBORVRJRl9NU0dfSUZET1dOCXwgXAorCSBORVRJRl9NU0dfSUZVUAkJfCBcCisJIE5FVElGX01TR19SWF9FUlIJfCBcCisJIE5FVElGX01TR19UWF9FUlIpCisKKy8qIGxlbmd0aCBvZiB0aW1lIGJlZm9yZSB3ZSBkZWNpZGUgdGhlIGhhcmR3YXJlIGlzIGJvcmtlZCwKKyAqIGFuZCBkZXYtPnR4X3RpbWVvdXQoKSBzaG91bGQgYmUgY2FsbGVkIHRvIGZpeCB0aGUgcHJvYmxlbQorICovCisjZGVmaW5lIEI0NF9UWF9USU1FT1VUCQkJKDUgKiBIWikKKworLyogaGFyZHdhcmUgbWluaW11bSBhbmQgbWF4aW11bSBmb3IgYSBzaW5nbGUgZnJhbWUncyBkYXRhIHBheWxvYWQgKi8KKyNkZWZpbmUgQjQ0X01JTl9NVFUJCQk2MAorI2RlZmluZSBCNDRfTUFYX01UVQkJCTE1MDAKKworI2RlZmluZSBCNDRfUlhfUklOR19TSVpFCQk1MTIKKyNkZWZpbmUgQjQ0X0RFRl9SWF9SSU5HX1BFTkRJTkcJCTIwMAorI2RlZmluZSBCNDRfUlhfUklOR19CWVRFUwkoc2l6ZW9mKHN0cnVjdCBkbWFfZGVzYykgKiBcCisJCQkJIEI0NF9SWF9SSU5HX1NJWkUpCisjZGVmaW5lIEI0NF9UWF9SSU5HX1NJWkUJCTUxMgorI2RlZmluZSBCNDRfREVGX1RYX1JJTkdfUEVORElORwkJKEI0NF9UWF9SSU5HX1NJWkUgLSAxKQorI2RlZmluZSBCNDRfVFhfUklOR19CWVRFUwkoc2l6ZW9mKHN0cnVjdCBkbWFfZGVzYykgKiBcCisJCQkJIEI0NF9UWF9SSU5HX1NJWkUpCisjZGVmaW5lIEI0NF9ETUFfTUFTSyAweDNmZmZmZmZmCisKKyNkZWZpbmUgVFhfUklOR19HQVAoQlApCVwKKwkoQjQ0X1RYX1JJTkdfU0laRSAtIChCUCktPnR4X3BlbmRpbmcpCisjZGVmaW5lIFRYX0JVRkZTX0FWQUlMKEJQKQkJCQkJCVwKKwkoKChCUCktPnR4X2NvbnMgPD0gKEJQKS0+dHhfcHJvZCkgPwkJCQlcCisJICAoQlApLT50eF9jb25zICsgKEJQKS0+dHhfcGVuZGluZyAtIChCUCktPnR4X3Byb2QgOgkJXAorCSAgKEJQKS0+dHhfY29ucyAtIChCUCktPnR4X3Byb2QgLSBUWF9SSU5HX0dBUChCUCkpCisjZGVmaW5lIE5FWFRfVFgoTikJCSgoKE4pICsgMSkgJiAoQjQ0X1RYX1JJTkdfU0laRSAtIDEpKQorCisjZGVmaW5lIFJYX1BLVF9CVUZfU1oJCSgxNTM2ICsgYnAtPnJ4X29mZnNldCArIDY0KQorI2RlZmluZSBUWF9QS1RfQlVGX1NaCQkoQjQ0X01BWF9NVFUgKyBFVEhfSExFTiArIDgpCisKKy8qIG1pbmltdW0gbnVtYmVyIG9mIGZyZWUgVFggZGVzY3JpcHRvcnMgcmVxdWlyZWQgdG8gd2FrZSB1cCBUWCBwcm9jZXNzICovCisjZGVmaW5lIEI0NF9UWF9XQUtFVVBfVEhSRVNICQkoQjQ0X1RYX1JJTkdfU0laRSAvIDQpCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKwlEUlZfTU9EVUxFX05BTUUgIi5jOnYiIERSVl9NT0RVTEVfVkVSU0lPTiAiICgiIERSVl9NT0RVTEVfUkVMREFURSAiKVxuIjsKKworTU9EVUxFX0FVVEhPUigiRmxvcmlhbiBTY2hpcm1lciwgUGVra2EgUGlldGlrYWluZW4sIERhdmlkIFMuIE1pbGxlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSA0NDAwIDEwLzEwMCBQQ0kgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOworCitzdGF0aWMgaW50IGI0NF9kZWJ1ZyA9IC0xOwkvKiAtMSA9PSB1c2UgQjQ0X0RFRl9NU0dfRU5BQkxFIGFzIHZhbHVlICovCittb2R1bGVfcGFyYW0oYjQ0X2RlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhiNDRfZGVidWcsICJCNDQgYml0bWFwcGVkIGRlYnVnZ2luZyBtZXNzYWdlIGVuYWJsZSB2YWx1ZSIpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYjQ0X3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfQkNNNDQwMSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9CQ000NDAxQjAsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfQkNNNDQwMUIxLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0IHdpdGggZW1wdHkgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBiNDRfcGNpX3RibCk7CisKK3N0YXRpYyB2b2lkIGI0NF9oYWx0KHN0cnVjdCBiNDQgKik7CitzdGF0aWMgdm9pZCBiNDRfaW5pdF9yaW5ncyhzdHJ1Y3QgYjQ0ICopOworc3RhdGljIHZvaWQgYjQ0X2luaXRfaHcoc3RydWN0IGI0NCAqKTsKK3N0YXRpYyBpbnQgYjQ0X3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBiNDRfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBicjMyKGNvbnN0IHN0cnVjdCBiNDQgKmJwLCB1bnNpZ25lZCBsb25nIHJlZykKK3sKKwlyZXR1cm4gcmVhZGwoYnAtPnJlZ3MgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnczMihjb25zdCBzdHJ1Y3QgYjQ0ICpicCwgCisJCQl1bnNpZ25lZCBsb25nIHJlZywgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJd3JpdGVsKHZhbCwgYnAtPnJlZ3MgKyByZWcpOworfQorCitzdGF0aWMgaW50IGI0NF93YWl0X2JpdChzdHJ1Y3QgYjQ0ICpicCwgdW5zaWduZWQgbG9uZyByZWcsCisJCQl1MzIgYml0LCB1bnNpZ25lZCBsb25nIHRpbWVvdXQsIGNvbnN0IGludCBjbGVhcikKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7CisJCXUzMiB2YWwgPSBicjMyKGJwLCByZWcpOworCisJCWlmIChjbGVhciAmJiAhKHZhbCAmIGJpdCkpCisJCQlicmVhazsKKwkJaWYgKCFjbGVhciAmJiAodmFsICYgYml0KSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoaSA9PSB0aW1lb3V0KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBCVUchICBUaW1lb3V0IHdhaXRpbmcgZm9yIGJpdCAlMDh4IG9mIHJlZ2lzdGVyICIKKwkJICAgICAgICIlbHggdG8gJXMuXG4iLAorCQkgICAgICAgYnAtPmRldi0+bmFtZSwKKwkJICAgICAgIGJpdCwgcmVnLAorCQkgICAgICAgKGNsZWFyID8gImNsZWFyIiA6ICJzZXQiKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogU29uaWNzIFNpbGljb25CYWNrcGxhbmUgc3VwcG9ydCByb3V0aW5lcy4gIFJPRkwsIHlvdSBzaG91bGQgc2VlIGFsbCB0aGUKKyAqIGJ1enogd29yZHMgdXNlZCBvbiB0aGlzIGNvbXBhbnkncyB3ZWJzaXRlIDotKQorICoKKyAqIEFsbCBvZiB0aGVzZSByb3V0aW5lcyBtdXN0IGJlIGludm9rZWQgd2l0aCBicC0+bG9jayBoZWxkIGFuZAorICogaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqLworCisjZGVmaW5lIFNCX1BDSV9ETUEgICAgICAgICAgICAgMHg0MDAwMDAwMCAgICAgIC8qIENsaWVudCBNb2RlIFBDSSBtZW1vcnkgYWNjZXNzIHNwYWNlICgxIEdCKSAqLworI2RlZmluZSBCQ000NDAwX1BDSV9DT1JFX0FERFIgIDB4MTgwMDIwMDAgICAgICAvKiBBZGRyZXNzIG9mIFBDSSBjb3JlIG9uIEJDTTQ0MDAgY2FyZHMgKi8KKworc3RhdGljIHUzMiBzc2JfZ2V0X2NvcmVfcmV2KHN0cnVjdCBiNDQgKmJwKQoreworCXJldHVybiAoYnIzMihicCwgQjQ0X1NCSURISUdIKSAmIFNCSURISUdIX1JDX01BU0spOworfQorCitzdGF0aWMgdTMyIHNzYl9wY2lfc2V0dXAoc3RydWN0IGI0NCAqYnAsIHUzMiBjb3JlcykKK3sKKwl1MzIgYmFyX29yaWcsIHBjaV9yZXYsIHZhbDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicC0+cGRldiwgU1NCX0JBUjBfV0lOLCAmYmFyX29yaWcpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnAtPnBkZXYsIFNTQl9CQVIwX1dJTiwgQkNNNDQwMF9QQ0lfQ09SRV9BRERSKTsKKwlwY2lfcmV2ID0gc3NiX2dldF9jb3JlX3JldihicCk7CisKKwl2YWwgPSBicjMyKGJwLCBCNDRfU0JJTlRWRUMpOworCXZhbCB8PSBjb3JlczsKKwlidzMyKGJwLCBCNDRfU0JJTlRWRUMsIHZhbCk7CisKKwl2YWwgPSBicjMyKGJwLCBTU0JfUENJX1RSQU5TXzIpOworCXZhbCB8PSBTU0JfUENJX1BSRUYgfCBTU0JfUENJX0JVUlNUOworCWJ3MzIoYnAsIFNTQl9QQ0lfVFJBTlNfMiwgdmFsKTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnAtPnBkZXYsIFNTQl9CQVIwX1dJTiwgYmFyX29yaWcpOworCisJcmV0dXJuIHBjaV9yZXY7Cit9CisKK3N0YXRpYyB2b2lkIHNzYl9jb3JlX2Rpc2FibGUoc3RydWN0IGI0NCAqYnApCit7CisJaWYgKGJyMzIoYnAsIEI0NF9TQlRNU0xPVykgJiBTQlRNU0xPV19SRVNFVCkKKwkJcmV0dXJuOworCisJYnczMihicCwgQjQ0X1NCVE1TTE9XLCAoU0JUTVNMT1dfUkVKRUNUIHwgU0JUTVNMT1dfQ0xPQ0spKTsKKwliNDRfd2FpdF9iaXQoYnAsIEI0NF9TQlRNU0xPVywgU0JUTVNMT1dfUkVKRUNULCAxMDAwMDAsIDApOworCWI0NF93YWl0X2JpdChicCwgQjQ0X1NCVE1TSElHSCwgU0JUTVNISUdIX0JVU1ksIDEwMDAwMCwgMSk7CisJYnczMihicCwgQjQ0X1NCVE1TTE9XLCAoU0JUTVNMT1dfRkdDIHwgU0JUTVNMT1dfQ0xPQ0sgfAorCQkJICAgIFNCVE1TTE9XX1JFSkVDVCB8IFNCVE1TTE9XX1JFU0VUKSk7CisJYnIzMihicCwgQjQ0X1NCVE1TTE9XKTsKKwl1ZGVsYXkoMSk7CisJYnczMihicCwgQjQ0X1NCVE1TTE9XLCAoU0JUTVNMT1dfUkVKRUNUIHwgU0JUTVNMT1dfUkVTRVQpKTsKKwlicjMyKGJwLCBCNDRfU0JUTVNMT1cpOworCXVkZWxheSgxKTsKK30KKworc3RhdGljIHZvaWQgc3NiX2NvcmVfcmVzZXQoc3RydWN0IGI0NCAqYnApCit7CisJdTMyIHZhbDsKKworCXNzYl9jb3JlX2Rpc2FibGUoYnApOworCWJ3MzIoYnAsIEI0NF9TQlRNU0xPVywgKFNCVE1TTE9XX1JFU0VUIHwgU0JUTVNMT1dfQ0xPQ0sgfCBTQlRNU0xPV19GR0MpKTsKKwlicjMyKGJwLCBCNDRfU0JUTVNMT1cpOworCXVkZWxheSgxKTsKKworCS8qIENsZWFyIFNFUlIgaWYgc2V0LCB0aGlzIGlzIGEgaHcgYnVnIHdvcmthcm91bmQuICAqLworCWlmIChicjMyKGJwLCBCNDRfU0JUTVNISUdIKSAmIFNCVE1TSElHSF9TRVJSKQorCQlidzMyKGJwLCBCNDRfU0JUTVNISUdILCAwKTsKKworCXZhbCA9IGJyMzIoYnAsIEI0NF9TQklNU1RBVEUpOworCWlmICh2YWwgJiAoU0JJTVNUQVRFX0lCRSB8IFNCSU1TVEFURV9UTykpCisJCWJ3MzIoYnAsIEI0NF9TQklNU1RBVEUsIHZhbCAmIH4oU0JJTVNUQVRFX0lCRSB8IFNCSU1TVEFURV9UTykpOworCisJYnczMihicCwgQjQ0X1NCVE1TTE9XLCAoU0JUTVNMT1dfQ0xPQ0sgfCBTQlRNU0xPV19GR0MpKTsKKwlicjMyKGJwLCBCNDRfU0JUTVNMT1cpOworCXVkZWxheSgxKTsKKworCWJ3MzIoYnAsIEI0NF9TQlRNU0xPVywgKFNCVE1TTE9XX0NMT0NLKSk7CisJYnIzMihicCwgQjQ0X1NCVE1TTE9XKTsKKwl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyBpbnQgc3NiX2NvcmVfdW5pdChzdHJ1Y3QgYjQ0ICpicCkKK3sKKyNpZiAwCisJdTMyIHZhbCA9IGJyMzIoYnAsIEI0NF9TQkFETUFUQ0gwKTsKKwl1MzIgYmFzZTsKKworCXR5cGUgPSB2YWwgJiBTQkFETUFUQ0gwX1RZUEVfTUFTSzsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIDA6CisJCWJhc2UgPSB2YWwgJiBTQkFETUFUQ0gwX0JTMF9NQVNLOworCQlicmVhazsKKworCWNhc2UgMToKKwkJYmFzZSA9IHZhbCAmIFNCQURNQVRDSDBfQlMxX01BU0s7CisJCWJyZWFrOworCisJY2FzZSAyOgorCWRlZmF1bHQ6CisJCWJhc2UgPSB2YWwgJiBTQkFETUFUQ0gwX0JTMl9NQVNLOworCQlicmVhazsKKwl9OworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3NiX2lzX2NvcmVfdXAoc3RydWN0IGI0NCAqYnApCit7CisJcmV0dXJuICgoYnIzMihicCwgQjQ0X1NCVE1TTE9XKSAmIChTQlRNU0xPV19SRVNFVCB8IFNCVE1TTE9XX1JFSkVDVCB8IFNCVE1TTE9XX0NMT0NLKSkKKwkJPT0gU0JUTVNMT1dfQ0xPQ0spOworfQorCitzdGF0aWMgdm9pZCBfX2I0NF9jYW1fd3JpdGUoc3RydWN0IGI0NCAqYnAsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBpbmRleCkKK3sKKwl1MzIgdmFsOworCisJdmFsICA9ICgodTMyKSBkYXRhWzJdKSA8PCAyNDsKKwl2YWwgfD0gKCh1MzIpIGRhdGFbM10pIDw8IDE2OworCXZhbCB8PSAoKHUzMikgZGF0YVs0XSkgPDwgIDg7CisJdmFsIHw9ICgodTMyKSBkYXRhWzVdKSA8PCAgMDsKKwlidzMyKGJwLCBCNDRfQ0FNX0RBVEFfTE8sIHZhbCk7CisJdmFsID0gKENBTV9EQVRBX0hJX1ZBTElEIHwgCisJICAgICAgICgoKHUzMikgZGF0YVswXSkgPDwgOCkgfAorCSAgICAgICAoKCh1MzIpIGRhdGFbMV0pIDw8IDApKTsKKwlidzMyKGJwLCBCNDRfQ0FNX0RBVEFfSEksIHZhbCk7CisJYnczMihicCwgQjQ0X0NBTV9DVFJMLCAoQ0FNX0NUUkxfV1JJVEUgfAorCQkJICAgIChpbmRleCA8PCBDQU1fQ1RSTF9JTkRFWF9TSElGVCkpKTsKKwliNDRfd2FpdF9iaXQoYnAsIEI0NF9DQU1fQ1RSTCwgQ0FNX0NUUkxfQlVTWSwgMTAwLCAxKTsJCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2I0NF9kaXNhYmxlX2ludHMoc3RydWN0IGI0NCAqYnApCit7CisJYnczMihicCwgQjQ0X0lNQVNLLCAwKTsKK30KKworc3RhdGljIHZvaWQgYjQ0X2Rpc2FibGVfaW50cyhzdHJ1Y3QgYjQ0ICpicCkKK3sKKwlfX2I0NF9kaXNhYmxlX2ludHMoYnApOworCisJLyogRmx1c2ggcG9zdGVkIHdyaXRlcy4gKi8KKwlicjMyKGJwLCBCNDRfSU1BU0spOworfQorCitzdGF0aWMgdm9pZCBiNDRfZW5hYmxlX2ludHMoc3RydWN0IGI0NCAqYnApCit7CisJYnczMihicCwgQjQ0X0lNQVNLLCBicC0+aW1hc2spOworfQorCitzdGF0aWMgaW50IGI0NF9yZWFkcGh5KHN0cnVjdCBiNDQgKmJwLCBpbnQgcmVnLCB1MzIgKnZhbCkKK3sKKwlpbnQgZXJyOworCisJYnczMihicCwgQjQ0X0VNQUNfSVNUQVQsIEVNQUNfSU5UX01JSSk7CisJYnczMihicCwgQjQ0X01ESU9fREFUQSwgKE1ESU9fREFUQV9TQl9TVEFSVCB8CisJCQkgICAgIChNRElPX09QX1JFQUQgPDwgTURJT19EQVRBX09QX1NISUZUKSB8CisJCQkgICAgIChicC0+cGh5X2FkZHIgPDwgTURJT19EQVRBX1BNRF9TSElGVCkgfAorCQkJICAgICAocmVnIDw8IE1ESU9fREFUQV9SQV9TSElGVCkgfAorCQkJICAgICAoTURJT19UQV9WQUxJRCA8PCBNRElPX0RBVEFfVEFfU0hJRlQpKSk7CisJZXJyID0gYjQ0X3dhaXRfYml0KGJwLCBCNDRfRU1BQ19JU1RBVCwgRU1BQ19JTlRfTUlJLCAxMDAsIDApOworCSp2YWwgPSBicjMyKGJwLCBCNDRfTURJT19EQVRBKSAmIE1ESU9fREFUQV9EQVRBOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiNDRfd3JpdGVwaHkoc3RydWN0IGI0NCAqYnAsIGludCByZWcsIHUzMiB2YWwpCit7CisJYnczMihicCwgQjQ0X0VNQUNfSVNUQVQsIEVNQUNfSU5UX01JSSk7CisJYnczMihicCwgQjQ0X01ESU9fREFUQSwgKE1ESU9fREFUQV9TQl9TVEFSVCB8CisJCQkgICAgIChNRElPX09QX1dSSVRFIDw8IE1ESU9fREFUQV9PUF9TSElGVCkgfAorCQkJICAgICAoYnAtPnBoeV9hZGRyIDw8IE1ESU9fREFUQV9QTURfU0hJRlQpIHwKKwkJCSAgICAgKHJlZyA8PCBNRElPX0RBVEFfUkFfU0hJRlQpIHwKKwkJCSAgICAgKE1ESU9fVEFfVkFMSUQgPDwgTURJT19EQVRBX1RBX1NISUZUKSB8CisJCQkgICAgICh2YWwgJiBNRElPX0RBVEFfREFUQSkpKTsKKwlyZXR1cm4gYjQ0X3dhaXRfYml0KGJwLCBCNDRfRU1BQ19JU1RBVCwgRU1BQ19JTlRfTUlJLCAxMDAsIDApOworfQorCisvKiBtaWlsaWIgaW50ZXJmYWNlICovCisvKiBGSVhNRSBGSVhNRTogcGh5X2lkIGlzIGlnbm9yZWQsIGJwLT5waHlfYWRkciB1c2UgaXMgdW5jb25kaXRpb25hbAorICogZHVlIHRvIGNvZGUgZXhpc3RpbmcgYmVmb3JlIG1paWxpYiB1c2Ugd2FzIGFkZGVkIHRvIHRoaXMgZHJpdmVyLgorICogU29tZW9uZSBzaG91bGQgcmVtb3ZlIHRoaXMgYXJ0aWZpY2lhbCBkcml2ZXIgbGltaXRhdGlvbiBpbgorICogYjQ0X3tyZWFkLHdyaXRlfXBoeS4gIGJwLT5waHlfYWRkciBpdHNlbGYgaXMgZmluZSAoYW5kIG5lZWRlZCkuCisgKi8KK3N0YXRpYyBpbnQgYjQ0X21paV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwl1MzIgdmFsOworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmMgPSBiNDRfcmVhZHBoeShicCwgbG9jYXRpb24sICZ2YWwpOworCWlmIChyYykKKwkJcmV0dXJuIDB4ZmZmZmZmZmY7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgYjQ0X21paV93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sCisJCQkgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJYjQ0X3dyaXRlcGh5KGJwLCBsb2NhdGlvbiwgdmFsKTsKK30KKworc3RhdGljIGludCBiNDRfcGh5X3Jlc2V0KHN0cnVjdCBiNDQgKmJwKQoreworCXUzMiB2YWw7CisJaW50IGVycjsKKworCWVyciA9IGI0NF93cml0ZXBoeShicCwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJdWRlbGF5KDEwMCk7CisJZXJyID0gYjQ0X3JlYWRwaHkoYnAsIE1JSV9CTUNSLCAmdmFsKTsKKwlpZiAoIWVycikgeworCQlpZiAodmFsICYgQk1DUl9SRVNFVCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IFBIWSBSZXNldCB3b3VsZCBub3QgY29tcGxldGUuXG4iLAorCQkJICAgICAgIGJwLT5kZXYtPm5hbWUpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2I0NF9zZXRfZmxvd19jdHJsKHN0cnVjdCBiNDQgKmJwLCB1MzIgcGF1c2VfZmxhZ3MpCit7CisJdTMyIHZhbDsKKworCWJwLT5mbGFncyAmPSB+KEI0NF9GTEFHX1RYX1BBVVNFIHwgQjQ0X0ZMQUdfUlhfUEFVU0UpOworCWJwLT5mbGFncyB8PSBwYXVzZV9mbGFnczsKKworCXZhbCA9IGJyMzIoYnAsIEI0NF9SWENPTkZJRyk7CisJaWYgKHBhdXNlX2ZsYWdzICYgQjQ0X0ZMQUdfUlhfUEFVU0UpCisJCXZhbCB8PSBSWENPTkZJR19GTE9XOworCWVsc2UKKwkJdmFsICY9IH5SWENPTkZJR19GTE9XOworCWJ3MzIoYnAsIEI0NF9SWENPTkZJRywgdmFsKTsKKworCXZhbCA9IGJyMzIoYnAsIEI0NF9NQUNfRkxPVyk7CisJaWYgKHBhdXNlX2ZsYWdzICYgQjQ0X0ZMQUdfVFhfUEFVU0UpCisJCXZhbCB8PSAoTUFDX0ZMT1dfUEFVU0VfRU5BQiB8CisJCQkoMHhjMCAmIE1BQ19GTE9XX1JYX0hJX1dBVEVSKSk7CisJZWxzZQorCQl2YWwgJj0gfk1BQ19GTE9XX1BBVVNFX0VOQUI7CisJYnczMihicCwgQjQ0X01BQ19GTE9XLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBiNDRfc2V0X2Zsb3dfY3RybChzdHJ1Y3QgYjQ0ICpicCwgdTMyIGxvY2FsLCB1MzIgcmVtb3RlKQoreworCXUzMiBwYXVzZV9lbmFiID0gYnAtPmZsYWdzICYgKEI0NF9GTEFHX1RYX1BBVVNFIHwKKwkJCQkgICAgICBCNDRfRkxBR19SWF9QQVVTRSk7CisKKwlpZiAobG9jYWwgJiBBRFZFUlRJU0VfUEFVU0VfQ0FQKSB7CisJCWlmIChsb2NhbCAmIEFEVkVSVElTRV9QQVVTRV9BU1lNKSB7CisJCQlpZiAocmVtb3RlICYgTFBBX1BBVVNFX0NBUCkKKwkJCQlwYXVzZV9lbmFiIHw9IChCNDRfRkxBR19UWF9QQVVTRSB8CisJCQkJCSAgICAgICBCNDRfRkxBR19SWF9QQVVTRSk7CisJCQllbHNlIGlmIChyZW1vdGUgJiBMUEFfUEFVU0VfQVNZTSkKKwkJCQlwYXVzZV9lbmFiIHw9IEI0NF9GTEFHX1JYX1BBVVNFOworCQl9IGVsc2UgeworCQkJaWYgKHJlbW90ZSAmIExQQV9QQVVTRV9DQVApCisJCQkJcGF1c2VfZW5hYiB8PSAoQjQ0X0ZMQUdfVFhfUEFVU0UgfAorCQkJCQkgICAgICAgQjQ0X0ZMQUdfUlhfUEFVU0UpOworCQl9CisJfSBlbHNlIGlmIChsb2NhbCAmIEFEVkVSVElTRV9QQVVTRV9BU1lNKSB7CisJCWlmICgocmVtb3RlICYgTFBBX1BBVVNFX0NBUCkgJiYKKwkJICAgIChyZW1vdGUgJiBMUEFfUEFVU0VfQVNZTSkpCisJCQlwYXVzZV9lbmFiIHw9IEI0NF9GTEFHX1RYX1BBVVNFOworCX0KKworCV9fYjQ0X3NldF9mbG93X2N0cmwoYnAsIHBhdXNlX2VuYWIpOworfQorCitzdGF0aWMgaW50IGI0NF9zZXR1cF9waHkoc3RydWN0IGI0NCAqYnApCit7CisJdTMyIHZhbDsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBiNDRfcmVhZHBoeShicCwgQjQ0X01JSV9BTEVEQ1RSTCwgJnZhbCkpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoZXJyID0gYjQ0X3dyaXRlcGh5KGJwLCBCNDRfTUlJX0FMRURDVFJMLAorCQkJCXZhbCAmIE1JSV9BTEVEQ1RSTF9BTExNU0spKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKGVyciA9IGI0NF9yZWFkcGh5KGJwLCBCNDRfTUlJX1RMRURDVFJMLCAmdmFsKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChlcnIgPSBiNDRfd3JpdGVwaHkoYnAsIEI0NF9NSUlfVExFRENUUkwsCisJCQkJdmFsIHwgTUlJX1RMRURDVFJMX0VOQUJMRSkpICE9IDApCisJCWdvdG8gb3V0OworCisJaWYgKCEoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRk9SQ0VfTElOSykpIHsKKwkJdTMyIGFkdiA9IEFEVkVSVElTRV9DU01BOworCisJCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19BRFZfMTBIQUxGKQorCQkJYWR2IHw9IEFEVkVSVElTRV8xMEhBTEY7CisJCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19BRFZfMTBGVUxMKQorCQkJYWR2IHw9IEFEVkVSVElTRV8xMEZVTEw7CisJCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19BRFZfMTAwSEFMRikKKwkJCWFkdiB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKKwkJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0FEVl8xMDBGVUxMKQorCQkJYWR2IHw9IEFEVkVSVElTRV8xMDBGVUxMOworCisJCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19QQVVTRV9BVVRPKQorCQkJYWR2IHw9IEFEVkVSVElTRV9QQVVTRV9DQVAgfCBBRFZFUlRJU0VfUEFVU0VfQVNZTTsKKworCQlpZiAoKGVyciA9IGI0NF93cml0ZXBoeShicCwgTUlJX0FEVkVSVElTRSwgYWR2KSkgIT0gMCkKKwkJCWdvdG8gb3V0OworCQlpZiAoKGVyciA9IGI0NF93cml0ZXBoeShicCwgTUlJX0JNQ1IsIChCTUNSX0FORU5BQkxFIHwKKwkJCQkJCSAgICAgICBCTUNSX0FOUkVTVEFSVCkpKSAhPSAwKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJdTMyIGJtY3I7CisKKwkJaWYgKChlcnIgPSBiNDRfcmVhZHBoeShicCwgTUlJX0JNQ1IsICZibWNyKSkgIT0gMCkKKwkJCWdvdG8gb3V0OworCQlibWNyICY9IH4oQk1DUl9GVUxMRFBMWCB8IEJNQ1JfQU5FTkFCTEUgfCBCTUNSX1NQRUVEMTAwKTsKKwkJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHXzEwMF9CQVNFX1QpCisJCQlibWNyIHw9IEJNQ1JfU1BFRUQxMDA7CisJCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19GVUxMX0RVUExFWCkKKwkJCWJtY3IgfD0gQk1DUl9GVUxMRFBMWDsKKwkJaWYgKChlcnIgPSBiNDRfd3JpdGVwaHkoYnAsIE1JSV9CTUNSLCBibWNyKSkgIT0gMCkKKwkJCWdvdG8gb3V0OworCisJCS8qIFNpbmNlIHdlIHdpbGwgbm90IGJlIG5lZ290aWF0aW5nIHRoZXJlIGlzIG5vIHNhZmUgd2F5CisJCSAqIHRvIGRldGVybWluZSBpZiB0aGUgbGluayBwYXJ0bmVyIHN1cHBvcnRzIGZsb3cgY29udHJvbAorCQkgKiBvciBub3QuICBTbyBqdXN0IGRpc2FibGUgaXQgY29tcGxldGVseSBpbiB0aGlzIGNhc2UuCisJCSAqLworCQliNDRfc2V0X2Zsb3dfY3RybChicCwgMCwgMCk7CisJfQorCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgYjQ0X3N0YXRzX3VwZGF0ZShzdHJ1Y3QgYjQ0ICpicCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZzsKKwl1MzIgKnZhbDsKKworCXZhbCA9ICZicC0+aHdfc3RhdHMudHhfZ29vZF9vY3RldHM7CisJZm9yIChyZWcgPSBCNDRfVFhfR09PRF9POyByZWcgPD0gQjQ0X1RYX1BBVVNFOyByZWcgKz0gNFVMKSB7CisJCSp2YWwrKyArPSBicjMyKGJwLCByZWcpOworCX0KKwl2YWwgPSAmYnAtPmh3X3N0YXRzLnJ4X2dvb2Rfb2N0ZXRzOworCWZvciAocmVnID0gQjQ0X1JYX0dPT0RfTzsgcmVnIDw9IEI0NF9SWF9OUEFVU0U7IHJlZyArPSA0VUwpIHsKKwkJKnZhbCsrICs9IGJyMzIoYnAsIHJlZyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBiNDRfbGlua19yZXBvcnQoc3RydWN0IGI0NCAqYnApCit7CisJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGJwLT5kZXYpKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogTGluayBpcyBkb3duLlxuIiwgYnAtPmRldi0+bmFtZSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBMaW5rIGlzIHVwIGF0ICVkIE1icHMsICVzIGR1cGxleC5cbiIsCisJCSAgICAgICBicC0+ZGV2LT5uYW1lLAorCQkgICAgICAgKGJwLT5mbGFncyAmIEI0NF9GTEFHXzEwMF9CQVNFX1QpID8gMTAwIDogMTAsCisJCSAgICAgICAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRlVMTF9EVVBMRVgpID8gImZ1bGwiIDogImhhbGYiKTsKKworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IEZsb3cgY29udHJvbCBpcyAlcyBmb3IgVFggYW5kICIKKwkJICAgICAgICIlcyBmb3IgUlguXG4iLAorCQkgICAgICAgYnAtPmRldi0+bmFtZSwKKwkJICAgICAgIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19UWF9QQVVTRSkgPyAib24iIDogIm9mZiIsCisJCSAgICAgICAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfUlhfUEFVU0UpID8gIm9uIiA6ICJvZmYiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGI0NF9jaGVja19waHkoc3RydWN0IGI0NCAqYnApCit7CisJdTMyIGJtc3IsIGF1eDsKKworCWlmICghYjQ0X3JlYWRwaHkoYnAsIE1JSV9CTVNSLCAmYm1zcikgJiYKKwkgICAgIWI0NF9yZWFkcGh5KGJwLCBCNDRfTUlJX0FVWENUUkwsICZhdXgpICYmCisJICAgIChibXNyICE9IDB4ZmZmZikpIHsKKwkJaWYgKGF1eCAmIE1JSV9BVVhDVFJMX1NQRUVEKQorCQkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHXzEwMF9CQVNFX1Q7CisJCWVsc2UKKwkJCWJwLT5mbGFncyAmPSB+QjQ0X0ZMQUdfMTAwX0JBU0VfVDsKKwkJaWYgKGF1eCAmIE1JSV9BVVhDVFJMX0RVUExFWCkKKwkJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19GVUxMX0RVUExFWDsKKwkJZWxzZQorCQkJYnAtPmZsYWdzICY9IH5CNDRfRkxBR19GVUxMX0RVUExFWDsKKworCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2soYnAtPmRldikgJiYKKwkJICAgIChibXNyICYgQk1TUl9MU1RBVFVTKSkgeworCQkJdTMyIHZhbCA9IGJyMzIoYnAsIEI0NF9UWF9DVFJMKTsKKwkJCXUzMiBsb2NhbF9hZHYsIHJlbW90ZV9hZHY7CisKKwkJCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19GVUxMX0RVUExFWCkKKwkJCQl2YWwgfD0gVFhfQ1RSTF9EVVBMRVg7CisJCQllbHNlCisJCQkJdmFsICY9IH5UWF9DVFJMX0RVUExFWDsKKwkJCWJ3MzIoYnAsIEI0NF9UWF9DVFJMLCB2YWwpOworCisJCQlpZiAoIShicC0+ZmxhZ3MgJiBCNDRfRkxBR19GT1JDRV9MSU5LKSAmJgorCQkJICAgICFiNDRfcmVhZHBoeShicCwgTUlJX0FEVkVSVElTRSwgJmxvY2FsX2FkdikgJiYKKwkJCSAgICAhYjQ0X3JlYWRwaHkoYnAsIE1JSV9MUEEsICZyZW1vdGVfYWR2KSkKKwkJCQliNDRfc2V0X2Zsb3dfY3RybChicCwgbG9jYWxfYWR2LCByZW1vdGVfYWR2KTsKKworCQkJLyogTGluayBub3cgdXAgKi8KKwkJCW5ldGlmX2NhcnJpZXJfb24oYnAtPmRldik7CisJCQliNDRfbGlua19yZXBvcnQoYnApOworCQl9IGVsc2UgaWYgKG5ldGlmX2NhcnJpZXJfb2soYnAtPmRldikgJiYgIShibXNyICYgQk1TUl9MU1RBVFVTKSkgeworCQkJLyogTGluayBub3cgZG93biAqLworCQkJbmV0aWZfY2Fycmllcl9vZmYoYnAtPmRldik7CisJCQliNDRfbGlua19yZXBvcnQoYnApOworCQl9CisKKwkJaWYgKGJtc3IgJiBCTVNSX1JGQVVMVCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICIlczogUmVtb3RlIGZhdWx0IGRldGVjdGVkIGluIFBIWVxuIiwKKwkJCSAgICAgICBicC0+ZGV2LT5uYW1lKTsKKwkJaWYgKGJtc3IgJiBCTVNSX0pDRCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICIlczogSmFiYmVyIGRldGVjdGVkIGluIFBIWVxuIiwKKwkJCSAgICAgICBicC0+ZGV2LT5uYW1lKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGI0NF90aW1lcih1bnNpZ25lZCBsb25nIF9fb3BhcXVlKQoreworCXN0cnVjdCBiNDQgKmJwID0gKHN0cnVjdCBiNDQgKikgX19vcGFxdWU7CisKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisKKwliNDRfY2hlY2tfcGh5KGJwKTsKKworCWI0NF9zdGF0c191cGRhdGUoYnApOworCisJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisKKwlicC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwlhZGRfdGltZXIoJmJwLT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIGI0NF90eChzdHJ1Y3QgYjQ0ICpicCkKK3sKKwl1MzIgY3VyLCBjb25zOworCisJY3VyICA9IGJyMzIoYnAsIEI0NF9ETUFUWF9TVEFUKSAmIERNQVRYX1NUQVRfQ0RNQVNLOworCWN1ciAvPSBzaXplb2Yoc3RydWN0IGRtYV9kZXNjKTsKKworCS8qIFhYWCBuZWVkcyB1cGRhdGluZyB3aGVuIE5FVElGX0ZfU0cgaXMgc3VwcG9ydGVkICovCisJZm9yIChjb25zID0gYnAtPnR4X2NvbnM7IGNvbnMgIT0gY3VyOyBjb25zID0gTkVYVF9UWChjb25zKSkgeworCQlzdHJ1Y3QgcmluZ19pbmZvICpycCA9ICZicC0+dHhfYnVmZmVyc1tjb25zXTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJwLT5za2I7CisKKwkJaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMKSkKKwkJCUJVRygpOworCisJCXBjaV91bm1hcF9zaW5nbGUoYnAtPnBkZXYsCisJCQkJIHBjaV91bm1hcF9hZGRyKHJwLCBtYXBwaW5nKSwKKwkJCQkgc2tiLT5sZW4sCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlycC0+c2tiID0gTlVMTDsKKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwl9CisKKwlicC0+dHhfY29ucyA9IGNvbnM7CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoYnAtPmRldikgJiYKKwkgICAgVFhfQlVGRlNfQVZBSUwoYnApID4gQjQ0X1RYX1dBS0VVUF9USFJFU0gpCisJCW5ldGlmX3dha2VfcXVldWUoYnAtPmRldik7CisKKwlidzMyKGJwLCBCNDRfR1BUSU1FUiwgMCk7Cit9CisKKy8qIFdvcmtzIGxpa2UgdGhpcy4gIFRoaXMgY2hpcCB3cml0ZXMgYSAnc3RydWN0IHJ4X2hlYWRlciIgMzAgYnl0ZXMKKyAqIGJlZm9yZSB0aGUgRE1BIGFkZHJlc3MgeW91IGdpdmUgaXQuICBTbyB3ZSBhbGxvY2F0ZSAzMCBtb3JlIGJ5dGVzCisgKiBmb3IgdGhlIFJYIGJ1ZmZlciwgRE1BIG1hcCBhbGwgb2YgaXQsIHNrYl9yZXNlcnZlIHRoZSAzMCBieXRlcywgdGhlbgorICogcG9pbnQgdGhlIGNoaXAgYXQgMzAgYnl0ZXMgcGFzdCB3aGVyZSB0aGUgcnhfaGVhZGVyIHdpbGwgZ28uCisgKi8KK3N0YXRpYyBpbnQgYjQ0X2FsbG9jX3J4X3NrYihzdHJ1Y3QgYjQ0ICpicCwgaW50IHNyY19pZHgsIHUzMiBkZXN0X2lkeF91bm1hc2tlZCkKK3sKKwlzdHJ1Y3QgZG1hX2Rlc2MgKmRwOworCXN0cnVjdCByaW5nX2luZm8gKnNyY19tYXAsICptYXA7CisJc3RydWN0IHJ4X2hlYWRlciAqcmg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJaW50IGRlc3RfaWR4OworCXUzMiBjdHJsOworCisJc3JjX21hcCA9IE5VTEw7CisJaWYgKHNyY19pZHggPj0gMCkKKwkJc3JjX21hcCA9ICZicC0+cnhfYnVmZmVyc1tzcmNfaWR4XTsKKwlkZXN0X2lkeCA9IGRlc3RfaWR4X3VubWFza2VkICYgKEI0NF9SWF9SSU5HX1NJWkUgLSAxKTsKKwltYXAgPSAmYnAtPnJ4X2J1ZmZlcnNbZGVzdF9pZHhdOworCXNrYiA9IGRldl9hbGxvY19za2IoUlhfUEtUX0JVRl9TWik7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShicC0+cGRldiwgc2tiLT5kYXRhLAorCQkJCSBSWF9QS1RfQlVGX1NaLAorCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJLyogSGFyZHdhcmUgYnVnIHdvcmstYXJvdW5kLCB0aGUgY2hpcCBpcyB1bmFibGUgdG8gZG8gUENJIERNQQorCSAgIHRvL2Zyb20gYW55dGhpbmcgYWJvdmUgMUdCIDotKCAqLworCWlmKG1hcHBpbmcrUlhfUEtUX0JVRl9TWiA+IEI0NF9ETUFfTUFTSykgeworCQkvKiBTaWdoLi4uICovCisJCXBjaV91bm1hcF9zaW5nbGUoYnAtPnBkZXYsIG1hcHBpbmcsIFJYX1BLVF9CVUZfU1osUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJc2tiID0gX19kZXZfYWxsb2Nfc2tiKFJYX1BLVF9CVUZfU1osR0ZQX0RNQSk7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoYnAtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJIFJYX1BLVF9CVUZfU1osCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlpZihtYXBwaW5nK1JYX1BLVF9CVUZfU1ogPiBCNDRfRE1BX01BU0spIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoYnAtPnBkZXYsIG1hcHBpbmcsIFJYX1BLVF9CVUZfU1osUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCXNrYi0+ZGV2ID0gYnAtPmRldjsKKwlza2JfcmVzZXJ2ZShza2IsIGJwLT5yeF9vZmZzZXQpOworCisJcmggPSAoc3RydWN0IHJ4X2hlYWRlciAqKQorCQkoc2tiLT5kYXRhIC0gYnAtPnJ4X29mZnNldCk7CisJcmgtPmxlbiA9IDA7CisJcmgtPmZsYWdzID0gMDsKKworCW1hcC0+c2tiID0gc2tiOworCXBjaV91bm1hcF9hZGRyX3NldChtYXAsIG1hcHBpbmcsIG1hcHBpbmcpOworCisJaWYgKHNyY19tYXAgIT0gTlVMTCkKKwkJc3JjX21hcC0+c2tiID0gTlVMTDsKKworCWN0cmwgID0gKERFU0NfQ1RSTF9MRU4gJiAoUlhfUEtUX0JVRl9TWiAtIGJwLT5yeF9vZmZzZXQpKTsKKwlpZiAoZGVzdF9pZHggPT0gKEI0NF9SWF9SSU5HX1NJWkUgLSAxKSkKKwkJY3RybCB8PSBERVNDX0NUUkxfRU9UOworCisJZHAgPSAmYnAtPnJ4X3JpbmdbZGVzdF9pZHhdOworCWRwLT5jdHJsID0gY3B1X3RvX2xlMzIoY3RybCk7CisJZHAtPmFkZHIgPSBjcHVfdG9fbGUzMigodTMyKSBtYXBwaW5nICsgYnAtPnJ4X29mZnNldCArIGJwLT5kbWFfb2Zmc2V0KTsKKworCXJldHVybiBSWF9QS1RfQlVGX1NaOworfQorCitzdGF0aWMgdm9pZCBiNDRfcmVjeWNsZV9yeChzdHJ1Y3QgYjQ0ICpicCwgaW50IHNyY19pZHgsIHUzMiBkZXN0X2lkeF91bm1hc2tlZCkKK3sKKwlzdHJ1Y3QgZG1hX2Rlc2MgKnNyY19kZXNjLCAqZGVzdF9kZXNjOworCXN0cnVjdCByaW5nX2luZm8gKnNyY19tYXAsICpkZXN0X21hcDsKKwlzdHJ1Y3QgcnhfaGVhZGVyICpyaDsKKwlpbnQgZGVzdF9pZHg7CisJdTMyIGN0cmw7CisKKwlkZXN0X2lkeCA9IGRlc3RfaWR4X3VubWFza2VkICYgKEI0NF9SWF9SSU5HX1NJWkUgLSAxKTsKKwlkZXN0X2Rlc2MgPSAmYnAtPnJ4X3JpbmdbZGVzdF9pZHhdOworCWRlc3RfbWFwID0gJmJwLT5yeF9idWZmZXJzW2Rlc3RfaWR4XTsKKwlzcmNfZGVzYyA9ICZicC0+cnhfcmluZ1tzcmNfaWR4XTsKKwlzcmNfbWFwID0gJmJwLT5yeF9idWZmZXJzW3NyY19pZHhdOworCisJZGVzdF9tYXAtPnNrYiA9IHNyY19tYXAtPnNrYjsKKwlyaCA9IChzdHJ1Y3QgcnhfaGVhZGVyICopIHNyY19tYXAtPnNrYi0+ZGF0YTsKKwlyaC0+bGVuID0gMDsKKwlyaC0+ZmxhZ3MgPSAwOworCXBjaV91bm1hcF9hZGRyX3NldChkZXN0X21hcCwgbWFwcGluZywKKwkJCSAgIHBjaV91bm1hcF9hZGRyKHNyY19tYXAsIG1hcHBpbmcpKTsKKworCWN0cmwgPSBzcmNfZGVzYy0+Y3RybDsKKwlpZiAoZGVzdF9pZHggPT0gKEI0NF9SWF9SSU5HX1NJWkUgLSAxKSkKKwkJY3RybCB8PSBjcHVfdG9fbGUzMihERVNDX0NUUkxfRU9UKTsKKwllbHNlCisJCWN0cmwgJj0gY3B1X3RvX2xlMzIofkRFU0NfQ1RSTF9FT1QpOworCisJZGVzdF9kZXNjLT5jdHJsID0gY3RybDsKKwlkZXN0X2Rlc2MtPmFkZHIgPSBzcmNfZGVzYy0+YWRkcjsKKwlzcmNfbWFwLT5za2IgPSBOVUxMOworCisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGJwLT5wZGV2LCBzcmNfZGVzYy0+YWRkciwKKwkJCQkgICAgICAgUlhfUEtUX0JVRl9TWiwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKK30KKworc3RhdGljIGludCBiNDRfcngoc3RydWN0IGI0NCAqYnAsIGludCBidWRnZXQpCit7CisJaW50IHJlY2VpdmVkOworCXUzMiBjb25zLCBwcm9kOworCisJcmVjZWl2ZWQgPSAwOworCXByb2QgID0gYnIzMihicCwgQjQ0X0RNQVJYX1NUQVQpICYgRE1BUlhfU1RBVF9DRE1BU0s7CisJcHJvZCAvPSBzaXplb2Yoc3RydWN0IGRtYV9kZXNjKTsKKwljb25zID0gYnAtPnJ4X2NvbnM7CisKKwl3aGlsZSAoY29ucyAhPSBwcm9kICYmIGJ1ZGdldCA+IDApIHsKKwkJc3RydWN0IHJpbmdfaW5mbyAqcnAgPSAmYnAtPnJ4X2J1ZmZlcnNbY29uc107CisJCXN0cnVjdCBza19idWZmICpza2IgPSBycC0+c2tiOworCQlkbWFfYWRkcl90IG1hcCA9IHBjaV91bm1hcF9hZGRyKHJwLCBtYXBwaW5nKTsKKwkJc3RydWN0IHJ4X2hlYWRlciAqcmg7CisJCXUxNiBsZW47CisKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGJwLT5wZGV2LCBtYXAsCisJCQkJCSAgICBSWF9QS1RfQlVGX1NaLAorCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJcmggPSAoc3RydWN0IHJ4X2hlYWRlciAqKSBza2ItPmRhdGE7CisJCWxlbiA9IGNwdV90b19sZTE2KHJoLT5sZW4pOworCQlpZiAoKGxlbiA+IChSWF9QS1RfQlVGX1NaIC0gYnAtPnJ4X29mZnNldCkpIHx8CisJCSAgICAocmgtPmZsYWdzICYgY3B1X3RvX2xlMTYoUlhfRkxBR19FUlJPUlMpKSkgeworCQlkcm9wX2l0OgorCQkJYjQ0X3JlY3ljbGVfcngoYnAsIGNvbnMsIGJwLT5yeF9wcm9kKTsKKwkJZHJvcF9pdF9ub19yZWN5Y2xlOgorCQkJYnAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gbmV4dF9wa3Q7CisJCX0KKworCQlpZiAobGVuID09IDApIHsKKwkJCWludCBpID0gMDsKKworCQkJZG8geworCQkJCXVkZWxheSgyKTsKKwkJCQliYXJyaWVyKCk7CisJCQkJbGVuID0gY3B1X3RvX2xlMTYocmgtPmxlbik7CisJCQl9IHdoaWxlIChsZW4gPT0gMCAmJiBpKysgPCA1KTsKKwkJCWlmIChsZW4gPT0gMCkKKwkJCQlnb3RvIGRyb3BfaXQ7CisJCX0KKworCQkvKiBPbWl0IENSQy4gKi8KKwkJbGVuIC09IDQ7CisKKwkJaWYgKGxlbiA+IFJYX0NPUFlfVEhSRVNIT0xEKSB7CisJCQlpbnQgc2tiX3NpemU7CisJCQlza2Jfc2l6ZSA9IGI0NF9hbGxvY19yeF9za2IoYnAsIGNvbnMsIGJwLT5yeF9wcm9kKTsKKwkJCWlmIChza2Jfc2l6ZSA8IDApCisJCQkJZ290byBkcm9wX2l0OworCQkJcGNpX3VubWFwX3NpbmdsZShicC0+cGRldiwgbWFwLAorCQkJCQkgc2tiX3NpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkvKiBMZWF2ZSBvdXQgcnhfaGVhZGVyICovCisgICAgICAgICAgICAgICAgCXNrYl9wdXQoc2tiLCBsZW4rYnAtPnJ4X29mZnNldCk7CisgICAgICAgICAgICAJICAgICAgICBza2JfcHVsbChza2IsYnAtPnJ4X29mZnNldCk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqY29weV9za2I7CisKKwkJCWI0NF9yZWN5Y2xlX3J4KGJwLCBjb25zLCBicC0+cnhfcHJvZCk7CisJCQljb3B5X3NrYiA9IGRldl9hbGxvY19za2IobGVuICsgMik7CisJCQlpZiAoY29weV9za2IgPT0gTlVMTCkKKwkJCQlnb3RvIGRyb3BfaXRfbm9fcmVjeWNsZTsKKworCQkJY29weV9za2ItPmRldiA9IGJwLT5kZXY7CisJCQlza2JfcmVzZXJ2ZShjb3B5X3NrYiwgMik7CisJCQlza2JfcHV0KGNvcHlfc2tiLCBsZW4pOworCQkJLyogRE1BIHN5bmMgZG9uZSBhYm92ZSwgY29weSBqdXN0IHRoZSBhY3R1YWwgcGFja2V0ICovCisJCQltZW1jcHkoY29weV9za2ItPmRhdGEsIHNrYi0+ZGF0YSticC0+cnhfb2Zmc2V0LCBsZW4pOworCisJCQlza2IgPSBjb3B5X3NrYjsKKwkJfQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGJwLT5kZXYpOworCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCQlicC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJcmVjZWl2ZWQrKzsKKwkJYnVkZ2V0LS07CisJbmV4dF9wa3Q6CisJCWJwLT5yeF9wcm9kID0gKGJwLT5yeF9wcm9kICsgMSkgJgorCQkJKEI0NF9SWF9SSU5HX1NJWkUgLSAxKTsKKwkJY29ucyA9IChjb25zICsgMSkgJiAoQjQ0X1JYX1JJTkdfU0laRSAtIDEpOworCX0KKworCWJwLT5yeF9jb25zID0gY29uczsKKwlidzMyKGJwLCBCNDRfRE1BUlhfUFRSLCBjb25zICogc2l6ZW9mKHN0cnVjdCBkbWFfZGVzYykpOworCisJcmV0dXJuIHJlY2VpdmVkOworfQorCitzdGF0aWMgaW50IGI0NF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgZG9uZTsKKworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKworCWlmIChicC0+aXN0YXQgJiAoSVNUQVRfVFggfCBJU1RBVF9UTykpIHsKKwkJLyogc3Bpbl9sb2NrKCZicC0+dHhfbG9jayk7ICovCisJCWI0NF90eChicCk7CisJCS8qIHNwaW5fdW5sb2NrKCZicC0+dHhfbG9jayk7ICovCisJfQorCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworCisJZG9uZSA9IDE7CisJaWYgKGJwLT5pc3RhdCAmIElTVEFUX1JYKSB7CisJCWludCBvcmlnX2J1ZGdldCA9ICpidWRnZXQ7CisJCWludCB3b3JrX2RvbmU7CisKKwkJaWYgKG9yaWdfYnVkZ2V0ID4gbmV0ZGV2LT5xdW90YSkKKwkJCW9yaWdfYnVkZ2V0ID0gbmV0ZGV2LT5xdW90YTsKKworCQl3b3JrX2RvbmUgPSBiNDRfcngoYnAsIG9yaWdfYnVkZ2V0KTsKKworCQkqYnVkZ2V0IC09IHdvcmtfZG9uZTsKKwkJbmV0ZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisKKwkJaWYgKHdvcmtfZG9uZSA+PSBvcmlnX2J1ZGdldCkKKwkJCWRvbmUgPSAwOworCX0KKworCWlmIChicC0+aXN0YXQgJiBJU1RBVF9FUlJPUlMpIHsKKwkJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOworCQliNDRfaGFsdChicCk7CisJCWI0NF9pbml0X3JpbmdzKGJwKTsKKwkJYjQ0X2luaXRfaHcoYnApOworCQluZXRpZl93YWtlX3F1ZXVlKGJwLT5kZXYpOworCQlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKwkJZG9uZSA9IDE7CisJfQorCisJaWYgKGRvbmUpIHsKKwkJbmV0aWZfcnhfY29tcGxldGUobmV0ZGV2KTsKKwkJYjQ0X2VuYWJsZV9pbnRzKGJwKTsKKwl9CisKKwlyZXR1cm4gKGRvbmUgPyAwIDogMSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBiNDRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgaXN0YXQsIGltYXNrOworCWludCBoYW5kbGVkID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCisJaXN0YXQgPSBicjMyKGJwLCBCNDRfSVNUQVQpOworCWltYXNrID0gYnIzMihicCwgQjQ0X0lNQVNLKTsKKworCS8qID8/PyBXaGF0IHRoZSBmdWNrIGlzIHRoZSBwdXJwb3NlIG9mIHRoZSBpbnRlcnJ1cHQgbWFzaworCSAqID8/PyByZWdpc3RlciBpZiB3ZSBoYXZlIHRvIG1hc2sgaXQgb3V0IGJ5IGhhbmQgYW55d2F5cz8KKwkgKi8KKwlpc3RhdCAmPSBpbWFzazsKKwlpZiAoaXN0YXQpIHsKKwkJaGFuZGxlZCA9IDE7CisJCWlmIChuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpIHsKKwkJCS8qIE5PVEU6IFRoZXNlIHdyaXRlcyBhcmUgcG9zdGVkIGJ5IHRoZSByZWFkYmFjayBvZgorCQkJICogICAgICAgdGhlIElTVEFUIHJlZ2lzdGVyIGJlbG93LgorCQkJICovCisJCQlicC0+aXN0YXQgPSBpc3RhdDsKKwkJCV9fYjQ0X2Rpc2FibGVfaW50cyhicCk7CisJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogRXJyb3IsIHBvbGwgYWxyZWFkeSBzY2hlZHVsZWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJfQorCisJCWJ3MzIoYnAsIEI0NF9JU1RBVCwgaXN0YXQpOworCQlicjMyKGJwLCBCNDRfSVNUQVQpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgdm9pZCBiNDRfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHJlc2V0dGluZ1xuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKworCWI0NF9oYWx0KGJwKTsKKwliNDRfaW5pdF9yaW5ncyhicCk7CisJYjQ0X2luaXRfaHcoYnApOworCisJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisKKwliNDRfZW5hYmxlX2ludHMoYnApOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGI0NF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpib3VuY2Vfc2tiOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKwl1MzIgbGVuLCBlbnRyeSwgY3RybDsKKworCWxlbiA9IHNrYi0+bGVuOworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKworCS8qIFRoaXMgaXMgYSBoYXJkIGVycm9yLCBsb2cgaXQuICovCisJaWYgKHVubGlrZWx5KFRYX0JVRkZTX0FWQUlMKGJwKSA8IDEpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBCVUchIFR4IFJpbmcgZnVsbCB3aGVuIHF1ZXVlIGF3YWtlIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShicC0+cGRldiwgc2tiLT5kYXRhLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmKG1hcHBpbmcrbGVuID4gQjQ0X0RNQV9NQVNLKSB7CisJCS8qIENoaXAgY2FuJ3QgaGFuZGxlIERNQSB0by9mcm9tID4xR0IsIHVzZSBib3VuY2UgYnVmZmVyICovCisJCXBjaV91bm1hcF9zaW5nbGUoYnAtPnBkZXYsIG1hcHBpbmcsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJYm91bmNlX3NrYiA9IF9fZGV2X2FsbG9jX3NrYihUWF9QS1RfQlVGX1NaLAorCQkJCQkgICAgIEdGUF9BVE9NSUN8R0ZQX0RNQSk7CisJCWlmICghYm91bmNlX3NrYikKKwkJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKworCQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoYnAtPnBkZXYsIGJvdW5jZV9za2ItPmRhdGEsCisJCQkJCSBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlpZihtYXBwaW5nK2xlbiA+IEI0NF9ETUFfTUFTSykgeworCQkJcGNpX3VubWFwX3NpbmdsZShicC0+cGRldiwgbWFwcGluZywKKwkJCQkJIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShib3VuY2Vfc2tiKTsKKwkJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwkJfQorCisJCW1lbWNweShza2JfcHV0KGJvdW5jZV9za2IsIGxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlza2IgPSBib3VuY2Vfc2tiOworCX0KKworCWVudHJ5ID0gYnAtPnR4X3Byb2Q7CisJYnAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9IHNrYjsKKwlwY2lfdW5tYXBfYWRkcl9zZXQoJmJwLT50eF9idWZmZXJzW2VudHJ5XSwgbWFwcGluZywgbWFwcGluZyk7CisKKwljdHJsICA9IChsZW4gJiBERVNDX0NUUkxfTEVOKTsKKwljdHJsIHw9IERFU0NfQ1RSTF9JT0MgfCBERVNDX0NUUkxfU09GIHwgREVTQ19DVFJMX0VPRjsKKwlpZiAoZW50cnkgPT0gKEI0NF9UWF9SSU5HX1NJWkUgLSAxKSkKKwkJY3RybCB8PSBERVNDX0NUUkxfRU9UOworCisJYnAtPnR4X3JpbmdbZW50cnldLmN0cmwgPSBjcHVfdG9fbGUzMihjdHJsKTsKKwlicC0+dHhfcmluZ1tlbnRyeV0uYWRkciA9IGNwdV90b19sZTMyKCh1MzIpIG1hcHBpbmcrYnAtPmRtYV9vZmZzZXQpOworCisJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKworCWJwLT50eF9wcm9kID0gZW50cnk7CisKKwl3bWIoKTsKKworCWJ3MzIoYnAsIEI0NF9ETUFUWF9QVFIsIGVudHJ5ICogc2l6ZW9mKHN0cnVjdCBkbWFfZGVzYykpOworCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19CVUdHWV9UWFBUUikKKwkJYnczMihicCwgQjQ0X0RNQVRYX1BUUiwgZW50cnkgKiBzaXplb2Yoc3RydWN0IGRtYV9kZXNjKSk7CisJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX1JFT1JERVJfQlVHKQorCQlicjMyKGJwLCBCNDRfRE1BVFhfUFRSKTsKKworCWlmIChUWF9CVUZGU19BVkFJTChicCkgPCAxKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYjQ0X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ld19tdHUgPCBCNDRfTUlOX01UVSB8fCBuZXdfbXR1ID4gQjQ0X01BWF9NVFUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJLyogV2UnbGwganVzdCBjYXRjaCBpdCBsYXRlciB3aGVuIHRoZQorCQkgKiBkZXZpY2UgaXMgdXAnZC4KKwkJICovCisJCWRldi0+bXR1ID0gbmV3X210dTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOworCWI0NF9oYWx0KGJwKTsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJYjQ0X2luaXRfcmluZ3MoYnApOworCWI0NF9pbml0X2h3KGJwKTsKKwlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKworCWI0NF9lbmFibGVfaW50cyhicCk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIEZyZWUgdXAgcGVuZGluZyBwYWNrZXRzIGluIGFsbCByeC90eCByaW5ncy4KKyAqCisgKiBUaGUgY2hpcCBoYXMgYmVlbiBzaHV0IGRvd24gYW5kIHRoZSBkcml2ZXIgZGV0YWNoZWQgZnJvbQorICogdGhlIG5ldHdvcmtpbmcsIHNvIG5vIGludGVycnVwdHMgb3IgbmV3IHR4IHBhY2tldHMgd2lsbAorICogZW5kIHVwIGluIHRoZSBkcml2ZXIuICBicC0+bG9jayBpcyBub3QgaGVsZCBhbmQgd2UgYXJlIG5vdAorICogaW4gYW4gaW50ZXJydXB0IGNvbnRleHQgYW5kIHRodXMgbWF5IHNsZWVwLgorICovCitzdGF0aWMgdm9pZCBiNDRfZnJlZV9yaW5ncyhzdHJ1Y3QgYjQ0ICpicCkKK3sKKwlzdHJ1Y3QgcmluZ19pbmZvICpycDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBCNDRfUlhfUklOR19TSVpFOyBpKyspIHsKKwkJcnAgPSAmYnAtPnJ4X2J1ZmZlcnNbaV07CisKKwkJaWYgKHJwLT5za2IgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlwY2lfdW5tYXBfc2luZ2xlKGJwLT5wZGV2LAorCQkJCSBwY2lfdW5tYXBfYWRkcihycCwgbWFwcGluZyksCisJCQkJIFJYX1BLVF9CVUZfU1osCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWRldl9rZnJlZV9za2JfYW55KHJwLT5za2IpOworCQlycC0+c2tiID0gTlVMTDsKKwl9CisKKwkvKiBYWFggbmVlZHMgY2hhbmdlcyBvbmNlIE5FVElGX0ZfU0cgaXMgc2V0Li4uICovCisJZm9yIChpID0gMDsgaSA8IEI0NF9UWF9SSU5HX1NJWkU7IGkrKykgeworCQlycCA9ICZicC0+dHhfYnVmZmVyc1tpXTsKKworCQlpZiAocnAtPnNrYiA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXBjaV91bm1hcF9zaW5nbGUoYnAtPnBkZXYsCisJCQkJIHBjaV91bm1hcF9hZGRyKHJwLCBtYXBwaW5nKSwKKwkJCQkgcnAtPnNrYi0+bGVuLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkocnAtPnNrYik7CisJCXJwLT5za2IgPSBOVUxMOworCX0KK30KKworLyogSW5pdGlhbGl6ZSB0eC9yeCByaW5ncyBmb3IgcGFja2V0IHByb2Nlc3NpbmcuCisgKgorICogVGhlIGNoaXAgaGFzIGJlZW4gc2h1dCBkb3duIGFuZCB0aGUgZHJpdmVyIGRldGFjaGVkIGZyb20KKyAqIHRoZSBuZXR3b3JraW5nLCBzbyBubyBpbnRlcnJ1cHRzIG9yIG5ldyB0eCBwYWNrZXRzIHdpbGwKKyAqIGVuZCB1cCBpbiB0aGUgZHJpdmVyLiAgYnAtPmxvY2sgaXMgbm90IGhlbGQgYW5kIHdlIGFyZSBub3QKKyAqIGluIGFuIGludGVycnVwdCBjb250ZXh0IGFuZCB0aHVzIG1heSBzbGVlcC4KKyAqLworc3RhdGljIHZvaWQgYjQ0X2luaXRfcmluZ3Moc3RydWN0IGI0NCAqYnApCit7CisJaW50IGk7CisKKwliNDRfZnJlZV9yaW5ncyhicCk7CisKKwltZW1zZXQoYnAtPnJ4X3JpbmcsIDAsIEI0NF9SWF9SSU5HX0JZVEVTKTsKKwltZW1zZXQoYnAtPnR4X3JpbmcsIDAsIEI0NF9UWF9SSU5HX0JZVEVTKTsKKworCWZvciAoaSA9IDA7IGkgPCBicC0+cnhfcGVuZGluZzsgaSsrKSB7CisJCWlmIChiNDRfYWxsb2Nfcnhfc2tiKGJwLCAtMSwgaSkgPCAwKQorCQkJYnJlYWs7CisJfQorfQorCisvKgorICogTXVzdCBub3QgYmUgaW52b2tlZCB3aXRoIGludGVycnVwdCBzb3VyY2VzIGRpc2FibGVkIGFuZAorICogdGhlIGhhcmR3YXJlIHNodXRkb3duIGRvd24uCisgKi8KK3N0YXRpYyB2b2lkIGI0NF9mcmVlX2NvbnNpc3RlbnQoc3RydWN0IGI0NCAqYnApCit7CisJaWYgKGJwLT5yeF9idWZmZXJzKSB7CisJCWtmcmVlKGJwLT5yeF9idWZmZXJzKTsKKwkJYnAtPnJ4X2J1ZmZlcnMgPSBOVUxMOworCX0KKwlpZiAoYnAtPnR4X2J1ZmZlcnMpIHsKKwkJa2ZyZWUoYnAtPnR4X2J1ZmZlcnMpOworCQlicC0+dHhfYnVmZmVycyA9IE5VTEw7CisJfQorCWlmIChicC0+cnhfcmluZykgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGJwLT5wZGV2LCBETUFfVEFCTEVfQllURVMsCisJCQkJICAgIGJwLT5yeF9yaW5nLCBicC0+cnhfcmluZ19kbWEpOworCQlicC0+cnhfcmluZyA9IE5VTEw7CisJfQorCWlmIChicC0+dHhfcmluZykgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGJwLT5wZGV2LCBETUFfVEFCTEVfQllURVMsCisJCQkJICAgIGJwLT50eF9yaW5nLCBicC0+dHhfcmluZ19kbWEpOworCQlicC0+dHhfcmluZyA9IE5VTEw7CisJfQorfQorCisvKgorICogTXVzdCBub3QgYmUgaW52b2tlZCB3aXRoIGludGVycnVwdCBzb3VyY2VzIGRpc2FibGVkIGFuZAorICogdGhlIGhhcmR3YXJlIHNodXRkb3duIGRvd24uICBDYW4gc2xlZXAuCisgKi8KK3N0YXRpYyBpbnQgYjQ0X2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IGI0NCAqYnApCit7CisJaW50IHNpemU7CisKKwlzaXplICA9IEI0NF9SWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJpbmdfaW5mbyk7CisJYnAtPnJ4X2J1ZmZlcnMgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghYnAtPnJ4X2J1ZmZlcnMpCisJCWdvdG8gb3V0X2VycjsKKwltZW1zZXQoYnAtPnJ4X2J1ZmZlcnMsIDAsIHNpemUpOworCisJc2l6ZSA9IEI0NF9UWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJpbmdfaW5mbyk7CisJYnAtPnR4X2J1ZmZlcnMgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghYnAtPnR4X2J1ZmZlcnMpCisJCWdvdG8gb3V0X2VycjsKKwltZW1zZXQoYnAtPnR4X2J1ZmZlcnMsIDAsIHNpemUpOworCisJc2l6ZSA9IERNQV9UQUJMRV9CWVRFUzsKKwlicC0+cnhfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGJwLT5wZGV2LCBzaXplLCAmYnAtPnJ4X3JpbmdfZG1hKTsKKwlpZiAoIWJwLT5yeF9yaW5nKQorCQlnb3RvIG91dF9lcnI7CisKKwlicC0+dHhfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGJwLT5wZGV2LCBzaXplLCAmYnAtPnR4X3JpbmdfZG1hKTsKKwlpZiAoIWJwLT50eF9yaW5nKQorCQlnb3RvIG91dF9lcnI7CisKKwlyZXR1cm4gMDsKKworb3V0X2VycjoKKwliNDRfZnJlZV9jb25zaXN0ZW50KGJwKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyogYnAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyB2b2lkIGI0NF9jbGVhcl9zdGF0cyhzdHJ1Y3QgYjQ0ICpicCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZzsKKworCWJ3MzIoYnAsIEI0NF9NSUJfQ1RSTCwgTUlCX0NUUkxfQ0xSX09OX1JFQUQpOworCWZvciAocmVnID0gQjQ0X1RYX0dPT0RfTzsgcmVnIDw9IEI0NF9UWF9QQVVTRTsgcmVnICs9IDRVTCkKKwkJYnIzMihicCwgcmVnKTsKKwlmb3IgKHJlZyA9IEI0NF9SWF9HT09EX087IHJlZyA8PSBCNDRfUlhfTlBBVVNFOyByZWcgKz0gNFVMKQorCQlicjMyKGJwLCByZWcpOworfQorCisvKiBicC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIHZvaWQgYjQ0X2NoaXBfcmVzZXQoc3RydWN0IGI0NCAqYnApCit7CisJaWYgKHNzYl9pc19jb3JlX3VwKGJwKSkgeworCQlidzMyKGJwLCBCNDRfUkNWX0xBWlksIDApOworCQlidzMyKGJwLCBCNDRfRU5FVF9DVFJMLCBFTkVUX0NUUkxfRElTQUJMRSk7CisJCWI0NF93YWl0X2JpdChicCwgQjQ0X0VORVRfQ1RSTCwgRU5FVF9DVFJMX0RJU0FCTEUsIDEwMCwgMSk7CisJCWJ3MzIoYnAsIEI0NF9ETUFUWF9DVFJMLCAwKTsKKwkJYnAtPnR4X3Byb2QgPSBicC0+dHhfY29ucyA9IDA7CisJCWlmIChicjMyKGJwLCBCNDRfRE1BUlhfU1RBVCkgJiBETUFSWF9TVEFUX0VNQVNLKSB7CisJCQliNDRfd2FpdF9iaXQoYnAsIEI0NF9ETUFSWF9TVEFULCBETUFSWF9TVEFUX1NJRExFLAorCQkJCSAgICAgMTAwLCAwKTsKKwkJfQorCQlidzMyKGJwLCBCNDRfRE1BUlhfQ1RSTCwgMCk7CisJCWJwLT5yeF9wcm9kID0gYnAtPnJ4X2NvbnMgPSAwOworCX0gZWxzZSB7CisJCXNzYl9wY2lfc2V0dXAoYnAsIChicC0+Y29yZV91bml0ID09IDAgPworCQkJCSAgIFNCSU5UVkVDX0VORVQwIDoKKwkJCQkgICBTQklOVFZFQ19FTkVUMSkpOworCX0KKworCXNzYl9jb3JlX3Jlc2V0KGJwKTsKKworCWI0NF9jbGVhcl9zdGF0cyhicCk7CisKKwkvKiBNYWtlIFBIWSBhY2Nlc3NpYmxlLiAqLworCWJ3MzIoYnAsIEI0NF9NRElPX0NUUkwsIChNRElPX0NUUkxfUFJFQU1CTEUgfAorCQkJICAgICAoMHgwZCAmIE1ESU9fQ1RSTF9NQVhGX01BU0spKSk7CisJYnIzMihicCwgQjQ0X01ESU9fQ1RSTCk7CisKKwlpZiAoIShicjMyKGJwLCBCNDRfREVWQ1RSTCkgJiBERVZDVFJMX0lQUCkpIHsKKwkJYnczMihicCwgQjQ0X0VORVRfQ1RSTCwgRU5FVF9DVFJMX0VQU0VMKTsKKwkJYnIzMihicCwgQjQ0X0VORVRfQ1RSTCk7CisJCWJwLT5mbGFncyAmPSB+QjQ0X0ZMQUdfSU5URVJOQUxfUEhZOworCX0gZWxzZSB7CisJCXUzMiB2YWwgPSBicjMyKGJwLCBCNDRfREVWQ1RSTCk7CisKKwkJaWYgKHZhbCAmIERFVkNUUkxfRVBSKSB7CisJCQlidzMyKGJwLCBCNDRfREVWQ1RSTCwgKHZhbCAmIH5ERVZDVFJMX0VQUikpOworCQkJYnIzMihicCwgQjQ0X0RFVkNUUkwpOworCQkJdWRlbGF5KDEwMCk7CisJCX0KKwkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0lOVEVSTkFMX1BIWTsKKwl9Cit9CisKKy8qIGJwLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgdm9pZCBiNDRfaGFsdChzdHJ1Y3QgYjQ0ICpicCkKK3sKKwliNDRfZGlzYWJsZV9pbnRzKGJwKTsKKwliNDRfY2hpcF9yZXNldChicCk7Cit9CisKKy8qIGJwLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgdm9pZCBfX2I0NF9zZXRfbWFjX2FkZHIoc3RydWN0IGI0NCAqYnApCit7CisJYnczMihicCwgQjQ0X0NBTV9DVFJMLCAwKTsKKwlpZiAoIShicC0+ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSkgeworCQl1MzIgdmFsOworCisJCV9fYjQ0X2NhbV93cml0ZShicCwgYnAtPmRldi0+ZGV2X2FkZHIsIDApOworCQl2YWwgPSBicjMyKGJwLCBCNDRfQ0FNX0NUUkwpOworCQlidzMyKGJwLCBCNDRfQ0FNX0NUUkwsIHZhbCB8IENBTV9DVFJMX0VOQUJMRSk7CisJfQorfQorCitzdGF0aWMgaW50IGI0NF9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUJVU1k7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisJX19iNDRfc2V0X21hY19hZGRyKGJwKTsKKwlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgYXQgZGV2aWNlIG9wZW4gdGltZSB0byBnZXQgdGhlIGNoaXAgcmVhZHkgZm9yCisgKiBwYWNrZXQgcHJvY2Vzc2luZy4gIEludm9rZWQgd2l0aCBicC0+bG9jayBoZWxkLgorICovCitzdGF0aWMgdm9pZCBfX2I0NF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIGI0NF9pbml0X2h3KHN0cnVjdCBiNDQgKmJwKQoreworCXUzMiB2YWw7CisKKwliNDRfY2hpcF9yZXNldChicCk7CisJYjQ0X3BoeV9yZXNldChicCk7CisJYjQ0X3NldHVwX3BoeShicCk7CisKKwkvKiBFbmFibGUgQ1JDMzIsIHNldCBwcm9wZXIgTEVEIG1vZGVzIGFuZCBwb3dlciBvbiBQSFkgKi8KKwlidzMyKGJwLCBCNDRfTUFDX0NUUkwsIE1BQ19DVFJMX0NSQzMyX0VOQUIgfCBNQUNfQ1RSTF9QSFlfTEVEQ1RSTCk7CisJYnczMihicCwgQjQ0X1JDVl9MQVpZLCAoMSA8PCBSQ1ZfTEFaWV9GQ19TSElGVCkpOworCisJLyogVGhpcyBzZXRzIHRoZSBNQUMgYWRkcmVzcyB0b28uICAqLworCV9fYjQ0X3NldF9yeF9tb2RlKGJwLT5kZXYpOworCisJLyogTVRVICsgZXRoIGhlYWRlciArIHBvc3NpYmxlIFZMQU4gdGFnICsgc3RydWN0IHJ4X2hlYWRlciAqLworCWJ3MzIoYnAsIEI0NF9SWE1BWExFTiwgYnAtPmRldi0+bXR1ICsgRVRIX0hMRU4gKyA4ICsgUlhfSEVBREVSX0xFTik7CisJYnczMihicCwgQjQ0X1RYTUFYTEVOLCBicC0+ZGV2LT5tdHUgKyBFVEhfSExFTiArIDggKyBSWF9IRUFERVJfTEVOKTsKKworCWJ3MzIoYnAsIEI0NF9UWF9XTUFSSywgNTYpOyAvKiBYWFggbWFnaWMgKi8KKwlidzMyKGJwLCBCNDRfRE1BVFhfQ1RSTCwgRE1BVFhfQ1RSTF9FTkFCTEUpOworCWJ3MzIoYnAsIEI0NF9ETUFUWF9BRERSLCBicC0+dHhfcmluZ19kbWEgKyBicC0+ZG1hX29mZnNldCk7CisJYnczMihicCwgQjQ0X0RNQVJYX0NUUkwsIChETUFSWF9DVFJMX0VOQUJMRSB8CisJCQkgICAgICAoYnAtPnJ4X29mZnNldCA8PCBETUFSWF9DVFJMX1JPU0hJRlQpKSk7CisJYnczMihicCwgQjQ0X0RNQVJYX0FERFIsIGJwLT5yeF9yaW5nX2RtYSArIGJwLT5kbWFfb2Zmc2V0KTsKKworCWJ3MzIoYnAsIEI0NF9ETUFSWF9QVFIsIGJwLT5yeF9wZW5kaW5nKTsKKwlicC0+cnhfcHJvZCA9IGJwLT5yeF9wZW5kaW5nOwkKKworCWJ3MzIoYnAsIEI0NF9NSUJfQ1RSTCwgTUlCX0NUUkxfQ0xSX09OX1JFQUQpOworCisJdmFsID0gYnIzMihicCwgQjQ0X0VORVRfQ1RSTCk7CisJYnczMihicCwgQjQ0X0VORVRfQ1RSTCwgKHZhbCB8IEVORVRfQ1RSTF9FTkFCTEUpKTsKK30KKworc3RhdGljIGludCBiNDRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCisJZXJyID0gYjQ0X2FsbG9jX2NvbnNpc3RlbnQoYnApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgYjQ0X2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZTsKKworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKworCWI0NF9pbml0X3JpbmdzKGJwKTsKKwliNDRfaW5pdF9odyhicCk7CisJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0lOSVRfQ09NUExFVEU7CisKKwlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKworCWluaXRfdGltZXIoJmJwLT50aW1lcik7CisJYnAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJYnAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYnA7CisJYnAtPnRpbWVyLmZ1bmN0aW9uID0gYjQ0X3RpbWVyOworCWFkZF90aW1lcigmYnAtPnRpbWVyKTsKKworCWI0NF9lbmFibGVfaW50cyhicCk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlOgorCWI0NF9mcmVlX2NvbnNpc3RlbnQoYnApOworCXJldHVybiBlcnI7Cit9CisKKyNpZiAwCisvKnN0YXRpYyovIHZvaWQgYjQ0X2R1bXBfc3RhdGUoc3RydWN0IGI0NCAqYnApCit7CisJdTMyIHZhbDMyLCB2YWwzMl8yLCB2YWwzMl8zLCB2YWwzMl80LCB2YWwzMl81OworCXUxNiB2YWwxNjsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJwLT5wZGV2LCBQQ0lfU1RBVFVTLCAmdmFsMTYpOworCXByaW50aygiREVCVUc6IFBDSSBzdGF0dXMgWyUwNHhdIFxuIiwgdmFsMTYpOworCit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisvKgorICogUG9sbGluZyByZWNlaXZlIC0gdXNlZCBieSBuZXRjb25zb2xlIGFuZCBvdGhlciBkaWFnbm9zdGljIHRvb2xzCisgKiB0byBhbGxvdyBuZXR3b3JrIGkvbyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIGI0NF9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJYjQ0X2ludGVycnVwdChkZXYtPmlycSwgZGV2LCBOVUxMKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGI0NF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWRlbF90aW1lcl9zeW5jKCZicC0+dGltZXIpOworCisJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOworCisjaWYgMAorCWI0NF9kdW1wX3N0YXRlKGJwKTsKKyNlbmRpZgorCWI0NF9oYWx0KGJwKTsKKwliNDRfZnJlZV9yaW5ncyhicCk7CisJYnAtPmZsYWdzICY9IH5CNDRfRkxBR19JTklUX0NPTVBMRVRFOworCW5ldGlmX2NhcnJpZXJfb2ZmKGJwLT5kZXYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCWI0NF9mcmVlX2NvbnNpc3RlbnQoYnApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYjQ0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnN0YXQgPSAmYnAtPnN0YXRzOworCXN0cnVjdCBiNDRfaHdfc3RhdHMgKmh3c3RhdCA9ICZicC0+aHdfc3RhdHM7CisKKwkvKiBDb252ZXJ0IEhXIHN0YXRzIGludG8gbmV0ZGV2aWNlIHN0YXRzLiAqLworCW5zdGF0LT5yeF9wYWNrZXRzID0gaHdzdGF0LT5yeF9wa3RzOworCW5zdGF0LT50eF9wYWNrZXRzID0gaHdzdGF0LT50eF9wa3RzOworCW5zdGF0LT5yeF9ieXRlcyAgID0gaHdzdGF0LT5yeF9vY3RldHM7CisJbnN0YXQtPnR4X2J5dGVzICAgPSBod3N0YXQtPnR4X29jdGV0czsKKwluc3RhdC0+dHhfZXJyb3JzICA9IChod3N0YXQtPnR4X2phYmJlcl9wa3RzICsKKwkJCSAgICAgaHdzdGF0LT50eF9vdmVyc2l6ZV9wa3RzICsKKwkJCSAgICAgaHdzdGF0LT50eF91bmRlcnJ1bnMgKworCQkJICAgICBod3N0YXQtPnR4X2V4Y2Vzc2l2ZV9jb2xzICsKKwkJCSAgICAgaHdzdGF0LT50eF9sYXRlX2NvbHMpOworCW5zdGF0LT5tdWx0aWNhc3QgID0gaHdzdGF0LT50eF9tdWx0aWNhc3RfcGt0czsKKwluc3RhdC0+Y29sbGlzaW9ucyA9IGh3c3RhdC0+dHhfdG90YWxfY29sczsKKworCW5zdGF0LT5yeF9sZW5ndGhfZXJyb3JzID0gKGh3c3RhdC0+cnhfb3ZlcnNpemVfcGt0cyArCisJCQkJICAgaHdzdGF0LT5yeF91bmRlcnNpemUpOworCW5zdGF0LT5yeF9vdmVyX2Vycm9ycyAgID0gaHdzdGF0LT5yeF9taXNzZWRfcGt0czsKKwluc3RhdC0+cnhfZnJhbWVfZXJyb3JzICA9IGh3c3RhdC0+cnhfYWxpZ25fZXJyczsKKwluc3RhdC0+cnhfY3JjX2Vycm9ycyAgICA9IGh3c3RhdC0+cnhfY3JjX2VycnM7CisJbnN0YXQtPnJ4X2Vycm9ycyAgICAgICAgPSAoaHdzdGF0LT5yeF9qYWJiZXJfcGt0cyArCisJCQkJICAgaHdzdGF0LT5yeF9vdmVyc2l6ZV9wa3RzICsKKwkJCQkgICBod3N0YXQtPnJ4X21pc3NlZF9wa3RzICsKKwkJCQkgICBod3N0YXQtPnJ4X2NyY19hbGlnbl9lcnJzICsKKwkJCQkgICBod3N0YXQtPnJ4X3VuZGVyc2l6ZSArCisJCQkJICAgaHdzdGF0LT5yeF9jcmNfZXJycyArCisJCQkJICAgaHdzdGF0LT5yeF9hbGlnbl9lcnJzICsKKwkJCQkgICBod3N0YXQtPnJ4X3N5bWJvbF9lcnJzKTsKKworCW5zdGF0LT50eF9hYm9ydGVkX2Vycm9ycyA9IGh3c3RhdC0+dHhfdW5kZXJydW5zOworI2lmIDAKKwkvKiBDYXJyaWVyIGxvc3QgY291bnRlciBzZWVtcyB0byBiZSBicm9rZW4gZm9yIHNvbWUgZGV2aWNlcyAqLworCW5zdGF0LT50eF9jYXJyaWVyX2Vycm9ycyA9IGh3c3RhdC0+dHhfY2Fycmllcl9sb3N0OworI2VuZGlmCisKKwlyZXR1cm4gbnN0YXQ7Cit9CisKK3N0YXRpYyBpbnQgX19iNDRfbG9hZF9tY2FzdChzdHJ1Y3QgYjQ0ICpicCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwlpbnQgaSwgbnVtX2VudHM7CisKKwludW1fZW50cyA9IG1pbl90KGludCwgZGV2LT5tY19jb3VudCwgQjQ0X01DQVNUX1RBQkxFX1NJWkUpOworCW1jbGlzdCA9IGRldi0+bWNfbGlzdDsKKwlmb3IgKGkgPSAwOyBtY2xpc3QgJiYgaSA8IG51bV9lbnRzOyBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQlfX2I0NF9jYW1fd3JpdGUoYnAsIG1jbGlzdC0+ZG1pX2FkZHIsIGkgKyAxKTsKKwl9CisJcmV0dXJuIGkrMTsKK30KKworc3RhdGljIHZvaWQgX19iNDRfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHZhbDsKKwlpbnQgaT0wOworCXVuc2lnbmVkIGNoYXIgemVyb1s2XSA9IHswLDAsMCwwLDAsMH07CisKKwl2YWwgPSBicjMyKGJwLCBCNDRfUlhDT05GSUcpOworCXZhbCAmPSB+KFJYQ09ORklHX1BST01JU0MgfCBSWENPTkZJR19BTExNVUxUSSk7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQl2YWwgfD0gUlhDT05GSUdfUFJPTUlTQzsKKwkJYnczMihicCwgQjQ0X1JYQ09ORklHLCB2YWwpOworCX0gZWxzZSB7CisJCV9fYjQ0X3NldF9tYWNfYWRkcihicCk7CisKKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCisJCQl2YWwgfD0gUlhDT05GSUdfQUxMTVVMVEk7CisJCWVsc2UKKwkJCWk9X19iNDRfbG9hZF9tY2FzdChicCwgZGV2KTsKKwkJCisJCWZvcig7aTw2NDtpKyspIHsKKwkJCV9fYjQ0X2NhbV93cml0ZShicCwgemVybywgaSk7CQkJCisJCX0KKwkJYnczMihicCwgQjQ0X1JYQ09ORklHLCB2YWwpOworICAgICAgICAJdmFsID0gYnIzMihicCwgQjQ0X0NBTV9DVFJMKTsKKwkgICAgICAgIGJ3MzIoYnAsIEI0NF9DQU1fQ1RSTCwgdmFsIHwgQ0FNX0NUUkxfRU5BQkxFKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGI0NF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKwlfX2I0NF9zZXRfcnhfbW9kZShkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworfQorCitzdGF0aWMgdTMyIGI0NF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIGJwLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZCBiNDRfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJYnAtPm1zZ19lbmFibGUgPSB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQgYjQ0X2dldF9kcnZpbmZvIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IGJwLT5wZGV2OworCisJc3RyY3B5IChpbmZvLT5kcml2ZXIsIERSVl9NT0RVTEVfTkFNRSk7CisJc3RyY3B5IChpbmZvLT52ZXJzaW9uLCBEUlZfTU9EVUxFX1ZFUlNJT04pOworCXN0cmNweSAoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHBjaV9kZXYpKTsKK30KKworc3RhdGljIGludCBiNDRfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgYm1jcjsKKwlpbnQgcjsKKworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKwliNDRfcmVhZHBoeShicCwgTUlJX0JNQ1IsICZibWNyKTsKKwliNDRfcmVhZHBoeShicCwgTUlJX0JNQ1IsICZibWNyKTsKKwlyID0gLUVJTlZBTDsKKwlpZiAoYm1jciAmIEJNQ1JfQU5FTkFCTEUpIHsKKwkJYjQ0X3dyaXRlcGh5KGJwLCBNSUlfQk1DUiwKKwkJCSAgICAgYm1jciB8IEJNQ1JfQU5SRVNUQVJUKTsKKwkJciA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgYjQ0X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIShicC0+ZmxhZ3MgJiBCNDRfRkxBR19JTklUX0NPTVBMRVRFKSkKKwkJcmV0dXJuIC1FQUdBSU47CisJY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEX0F1dG9uZWcpOworCWNtZC0+c3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8CisJCQkgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCSAgU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8CisJCQkgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJICBTVVBQT1JURURfTUlJKTsKKworCWNtZC0+YWR2ZXJ0aXNpbmcgPSAwOworCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19BRFZfMTBIQUxGKQorCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRV8xMEhBTEY7CisJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0FEVl8xMEZVTEwpCisJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfQURWXzEwMEhBTEYpCisJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0FEVl8xMDBGVUxMKQorCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRV8xMDBGVUxMOworCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFX1BBVVNFX0NBUCB8IEFEVkVSVElTRV9QQVVTRV9BU1lNOworCWNtZC0+c3BlZWQgPSAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfMTAwX0JBU0VfVCkgPworCQlTUEVFRF8xMDAgOiBTUEVFRF8xMDsKKwljbWQtPmR1cGxleCA9IChicC0+ZmxhZ3MgJiBCNDRfRkxBR19GVUxMX0RVUExFWCkgPworCQlEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOworCWNtZC0+cG9ydCA9IDA7CisJY21kLT5waHlfYWRkcmVzcyA9IGJwLT5waHlfYWRkcjsKKwljbWQtPnRyYW5zY2VpdmVyID0gKGJwLT5mbGFncyAmIEI0NF9GTEFHX0lOVEVSTkFMX1BIWSkgPworCQlYQ1ZSX0lOVEVSTkFMIDogWENWUl9FWFRFUk5BTDsKKwljbWQtPmF1dG9uZWcgPSAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRk9SQ0VfTElOSykgPworCQlBVVRPTkVHX0RJU0FCTEUgOiBBVVRPTkVHX0VOQUJMRTsKKwljbWQtPm1heHR4cGt0ID0gMDsKKwljbWQtPm1heHJ4cGt0ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiNDRfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghKGJwLT5mbGFncyAmIEI0NF9GTEFHX0lOSVRfQ09NUExFVEUpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qIFdlIGRvIG5vdCBzdXBwb3J0IGdpZ2FiaXQuICovCisJaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmCisJCSAgICAoQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8CisJCSAgICAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKChjbWQtPnNwZWVkICE9IFNQRUVEXzEwMCAmJgorCQkgICAgY21kLT5zcGVlZCAhPSBTUEVFRF8xMCkgfHwKKwkJICAgKGNtZC0+ZHVwbGV4ICE9IERVUExFWF9IQUxGICYmCisJCSAgICBjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKworCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJYnAtPmZsYWdzICY9IH5CNDRfRkxBR19GT1JDRV9MSU5LOworCQlicC0+ZmxhZ3MgJj0gfihCNDRfRkxBR19BRFZfMTBIQUxGIHwKKwkJCSAgICAgICBCNDRfRkxBR19BRFZfMTBGVUxMIHwKKwkJCSAgICAgICBCNDRfRkxBR19BRFZfMTAwSEFMRiB8CisJCQkgICAgICAgQjQ0X0ZMQUdfQURWXzEwMEZVTEwpOworCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRV8xMEhBTEYpCisJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfQURWXzEwSEFMRjsKKwkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VfMTBGVUxMKQorCQkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0FEVl8xMEZVTEw7CisJCWlmIChjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFXzEwMEhBTEYpCisJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfQURWXzEwMEhBTEY7CisJCWlmIChjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFXzEwMEZVTEwpCisJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfQURWXzEwMEZVTEw7CisJfSBlbHNlIHsKKwkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0ZPUkNFX0xJTks7CisJCWlmIChjbWQtPnNwZWVkID09IFNQRUVEXzEwMCkKKwkJCWJwLT5mbGFncyB8PSBCNDRfRkxBR18xMDBfQkFTRV9UOworCQlpZiAoY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfRlVMTF9EVVBMRVg7CisJfQorCisJYjQ0X3NldHVwX3BoeShicCk7CisKKwlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiNDRfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICplcmluZykKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwllcmluZy0+cnhfbWF4X3BlbmRpbmcgPSBCNDRfUlhfUklOR19TSVpFIC0gMTsKKwllcmluZy0+cnhfcGVuZGluZyA9IGJwLT5yeF9wZW5kaW5nOworCisJLyogWFhYIGV0aHRvb2wgbGFja3MgYSB0eF9tYXhfcGVuZGluZywgb29wcy4uLiAqLworfQorCitzdGF0aWMgaW50IGI0NF9zZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqZXJpbmcpCit7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKChlcmluZy0+cnhfcGVuZGluZyA+IEI0NF9SWF9SSU5HX1NJWkUgLSAxKSB8fAorCSAgICAoZXJpbmctPnJ4X21pbmlfcGVuZGluZyAhPSAwKSB8fAorCSAgICAoZXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgIT0gMCkgfHwKKwkgICAgKGVyaW5nLT50eF9wZW5kaW5nID4gQjQ0X1RYX1JJTkdfU0laRSAtIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKworCWJwLT5yeF9wZW5kaW5nID0gZXJpbmctPnJ4X3BlbmRpbmc7CisJYnAtPnR4X3BlbmRpbmcgPSBlcmluZy0+dHhfcGVuZGluZzsKKworCWI0NF9oYWx0KGJwKTsKKwliNDRfaW5pdF9yaW5ncyhicCk7CisJYjQ0X2luaXRfaHcoYnApOworCW5ldGlmX3dha2VfcXVldWUoYnAtPmRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisKKwliNDRfZW5hYmxlX2ludHMoYnApOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiNDRfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICplcGF1c2UpCit7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZXBhdXNlLT5hdXRvbmVnID0KKwkJKGJwLT5mbGFncyAmIEI0NF9GTEFHX1BBVVNFX0FVVE8pICE9IDA7CisJZXBhdXNlLT5yeF9wYXVzZSA9CisJCShicC0+ZmxhZ3MgJiBCNDRfRkxBR19SWF9QQVVTRSkgIT0gMDsKKwllcGF1c2UtPnR4X3BhdXNlID0KKwkJKGJwLT5mbGFncyAmIEI0NF9GTEFHX1RYX1BBVVNFKSAhPSAwOworfQorCitzdGF0aWMgaW50IGI0NF9zZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwYXVzZSkKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisJaWYgKGVwYXVzZS0+YXV0b25lZykKKwkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX1BBVVNFX0FVVE87CisJZWxzZQorCQlicC0+ZmxhZ3MgJj0gfkI0NF9GTEFHX1BBVVNFX0FVVE87CisJaWYgKGVwYXVzZS0+cnhfcGF1c2UpCisJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19SWF9QQVVTRTsKKwllbHNlCisJCWJwLT5mbGFncyAmPSB+QjQ0X0ZMQUdfUlhfUEFVU0U7CisJaWYgKGVwYXVzZS0+dHhfcGF1c2UpCisJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19UWF9QQVVTRTsKKwllbHNlCisJCWJwLT5mbGFncyAmPSB+QjQ0X0ZMQUdfVFhfUEFVU0U7CisJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX1BBVVNFX0FVVE8pIHsKKwkJYjQ0X2hhbHQoYnApOworCQliNDRfaW5pdF9yaW5ncyhicCk7CisJCWI0NF9pbml0X2h3KGJwKTsKKwl9IGVsc2UgeworCQlfX2I0NF9zZXRfZmxvd19jdHJsKGJwLCBicC0+ZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKworCWI0NF9lbmFibGVfaW50cyhicCk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgYjQ0X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBiNDRfZ2V0X2RydmluZm8sCisJLmdldF9zZXR0aW5ncwkJPSBiNDRfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gYjQ0X3NldF9zZXR0aW5ncywKKwkubndheV9yZXNldAkJPSBiNDRfbndheV9yZXNldCwKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3JpbmdwYXJhbQkJPSBiNDRfZ2V0X3JpbmdwYXJhbSwKKwkuc2V0X3JpbmdwYXJhbQkJPSBiNDRfc2V0X3JpbmdwYXJhbSwKKwkuZ2V0X3BhdXNlcGFyYW0JCT0gYjQ0X2dldF9wYXVzZXBhcmFtLAorCS5zZXRfcGF1c2VwYXJhbQkJPSBiNDRfc2V0X3BhdXNlcGFyYW0sCisJLmdldF9tc2dsZXZlbAkJPSBiNDRfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gYjQ0X3NldF9tc2dsZXZlbCwKK307CisKK3N0YXRpYyBpbnQgYjQ0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShpZnIpOworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOworCWVyciA9IGdlbmVyaWNfbWlpX2lvY3RsKCZicC0+bWlpX2lmLCBkYXRhLCBjbWQsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworCisJcmV0dXJuIGVycjsKK30KKworLyogUmVhZCAxMjgtYnl0ZXMgb2YgRUVQUk9NLiAqLworc3RhdGljIGludCBiNDRfcmVhZF9lZXByb20oc3RydWN0IGI0NCAqYnAsIHU4ICpkYXRhKQoreworCWxvbmcgaTsKKwl1MTYgKnB0ciA9ICh1MTYgKikgZGF0YTsKKworCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkgKz0gMikKKwkJcHRyW2kgLyAyXSA9IHJlYWR3KGJwLT5yZWdzICsgNDA5NiArIGkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGI0NF9nZXRfaW52YXJpYW50cyhzdHJ1Y3QgYjQ0ICpicCkKK3sKKwl1OCBlZXByb21bMTI4XTsKKwlpbnQgZXJyOworCisJZXJyID0gYjQ0X3JlYWRfZWVwcm9tKGJwLCAmZWVwcm9tWzBdKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWJwLT5kZXYtPmRldl9hZGRyWzBdID0gZWVwcm9tWzc5XTsKKwlicC0+ZGV2LT5kZXZfYWRkclsxXSA9IGVlcHJvbVs3OF07CisJYnAtPmRldi0+ZGV2X2FkZHJbMl0gPSBlZXByb21bODFdOworCWJwLT5kZXYtPmRldl9hZGRyWzNdID0gZWVwcm9tWzgwXTsKKwlicC0+ZGV2LT5kZXZfYWRkcls0XSA9IGVlcHJvbVs4M107CisJYnAtPmRldi0+ZGV2X2FkZHJbNV0gPSBlZXByb21bODJdOworCisJYnAtPnBoeV9hZGRyID0gZWVwcm9tWzkwXSAmIDB4MWY7CisKKwkvKiBXaXRoIHRoaXMsIHBsdXMgdGhlIHJ4X2hlYWRlciBwcmVwZW5kZWQgdG8gdGhlIGRhdGEgYnkgdGhlCisJICogaGFyZHdhcmUsIHdlJ2xsIGxhbmQgdGhlIGV0aGVybmV0IGhlYWRlciBvbiBhIDItYnl0ZSBib3VuZGFyeS4KKwkgKi8KKwlicC0+cnhfb2Zmc2V0ID0gMzA7CisKKwlicC0+aW1hc2sgPSBJTUFTS19ERUY7CisKKwlicC0+Y29yZV91bml0ID0gc3NiX2NvcmVfdW5pdChicCk7CisJYnAtPmRtYV9vZmZzZXQgPSBTQl9QQ0lfRE1BOworCisJLyogWFhYIC0gcmVhbGx5IHJlcXVpcmVkPyAKKwkgICBicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfQlVHR1lfVFhQVFI7CisgICAgICAgICAqLworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGI0NF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBiNDRfdmVyc2lvbl9wcmludGVkID0gMDsKKwl1bnNpZ25lZCBsb25nIGI0NHJlZ19iYXNlLCBiNDRyZWdfbGVuOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGI0NCAqYnA7CisJaW50IGVyciwgaTsKKworCWlmIChiNDRfdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGZpbmQgcHJvcGVyIFBDSSBkZXZpY2UgIgorCQkgICAgICAgImJhc2UgYWRkcmVzcywgYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGRldjsKKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9NT0RVTEVfTkFNRSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXMsICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9wZGV2OworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAodTY0KSBCNDRfRE1BX01BU0spOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCX0KKwkKKwllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgKHU2NCkgQjQ0X0RNQV9NQVNLKTsKKwlpZiAoZXJyKSB7CisJICBwcmludGsoS0VSTl9FUlIgUEZYICJObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb24sICIKKwkJICJhYm9ydGluZy5cbiIpOworCSAgZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCX0KKworCWI0NHJlZ19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWI0NHJlZ19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCpicCkpOworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkV0aGVyZGV2IGFsbG9jIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsJnBkZXYtPmRldik7CisKKwkvKiBObyBpbnRlcmVzdGluZyBuZXRkZXZpY2UgZmVhdHVyZXMgaW4gdGhpcyBjYXJkLi4uICovCisJZGV2LT5mZWF0dXJlcyB8PSAwOworCisJYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWJwLT5wZGV2ID0gcGRldjsKKwlicC0+ZGV2ID0gZGV2OworCWlmIChiNDRfZGVidWcgPj0gMCkKKwkJYnAtPm1zZ19lbmFibGUgPSAoMSA8PCBiNDRfZGVidWcpIC0gMTsKKwllbHNlCisJCWJwLT5tc2dfZW5hYmxlID0gQjQ0X0RFRl9NU0dfRU5BQkxFOworCisJc3Bpbl9sb2NrX2luaXQoJmJwLT5sb2NrKTsKKworCWJwLT5yZWdzID0gaW9yZW1hcChiNDRyZWdfYmFzZSwgYjQ0cmVnX2xlbik7CisJaWYgKGJwLT5yZWdzID09IDBVTCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgbWFwIGRldmljZSByZWdpc3RlcnMsICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CisJfQorCisJYnAtPnJ4X3BlbmRpbmcgPSBCNDRfREVGX1JYX1JJTkdfUEVORElORzsKKwlicC0+dHhfcGVuZGluZyA9IEI0NF9ERUZfVFhfUklOR19QRU5ESU5HOworCisJZGV2LT5vcGVuID0gYjQ0X29wZW47CisJZGV2LT5zdG9wID0gYjQ0X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYjQ0X3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBiNDRfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gYjQ0X3NldF9yeF9tb2RlOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gYjQ0X3NldF9tYWNfYWRkcjsKKwlkZXYtPmRvX2lvY3RsID0gYjQ0X2lvY3RsOworCWRldi0+dHhfdGltZW91dCA9IGI0NF90eF90aW1lb3V0OworCWRldi0+cG9sbCA9IGI0NF9wb2xsOworCWRldi0+d2VpZ2h0ID0gNjQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IEI0NF9UWF9USU1FT1VUOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBiNDRfcG9sbF9jb250cm9sbGVyOworI2VuZGlmCisJZGV2LT5jaGFuZ2VfbXR1ID0gYjQ0X2NoYW5nZV9tdHU7CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmI0NF9ldGh0b29sX29wcyk7CisKKwllcnIgPSBiNDRfZ2V0X2ludmFyaWFudHMoYnApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUHJvYmxlbSBmZXRjaGluZyBpbnZhcmlhbnRzIG9mIGNoaXAsICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwlicC0+bWlpX2lmLmRldiA9IGRldjsKKwlicC0+bWlpX2lmLm1kaW9fcmVhZCA9IGI0NF9taWlfcmVhZDsKKwlicC0+bWlpX2lmLm1kaW9fd3JpdGUgPSBiNDRfbWlpX3dyaXRlOworCWJwLT5taWlfaWYucGh5X2lkID0gYnAtPnBoeV9hZGRyOworCWJwLT5taWlfaWYucGh5X2lkX21hc2sgPSAweDFmOworCWJwLT5taWlfaWYucmVnX251bV9tYXNrID0gMHgxZjsKKworCS8qIEJ5IGRlZmF1bHQsIGFkdmVydGlzZSBhbGwgc3BlZWQvZHVwbGV4IHNldHRpbmdzLiAqLworCWJwLT5mbGFncyB8PSAoQjQ0X0ZMQUdfQURWXzEwSEFMRiB8IEI0NF9GTEFHX0FEVl8xMEZVTEwgfAorCQkgICAgICBCNDRfRkxBR19BRFZfMTAwSEFMRiB8IEI0NF9GTEFHX0FEVl8xMDBGVUxMKTsKKworCS8qIEJ5IGRlZmF1bHQsIGF1dG8tbmVnb3RpYXRlIFBBVVNFLiAqLworCWJwLT5mbGFncyB8PSBCNDRfRkxBR19QQVVTRV9BVVRPOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJcGNpX3NhdmVfc3RhdGUoYnAtPnBkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJyb2FkY29tIDQ0MDAgMTAvMTAwQmFzZVQgRXRoZXJuZXQgIiwgZGV2LT5uYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLCBkZXYtPmRldl9hZGRyW2ldLAorCQkgICAgICAgaSA9PSA1ID8gJ1xuJyA6ICc6Jyk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9pb3VubWFwOgorCWlvdW5tYXAoYnAtPnJlZ3MpOworCitlcnJfb3V0X2ZyZWVfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisKK2Vycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworZXJyX291dF9kaXNhYmxlX3BkZXY6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYjQ0X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkZXYpIHsKKwkJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWlvdW5tYXAoYnAtPnJlZ3MpOworCQlmcmVlX25ldGRldihkZXYpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYjQ0X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKwlkZWxfdGltZXJfc3luYygmYnAtPnRpbWVyKTsKKworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsgCisKKwliNDRfaGFsdChicCk7CisJbmV0aWZfY2Fycmllcl9vZmYoYnAtPmRldik7IAorCW5ldGlmX2RldmljZV9kZXRhY2goYnAtPmRldik7CisJYjQ0X2ZyZWVfcmluZ3MoYnApOworCisJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYjQ0X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOworCisJYjQ0X2luaXRfcmluZ3MoYnApOworCWI0NF9pbml0X2h3KGJwKTsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGJwLT5kZXYpOworCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworCisJYnAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJYWRkX3RpbWVyKCZicC0+dGltZXIpOworCisJYjQ0X2VuYWJsZV9pbnRzKGJwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGI0NF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX01PRFVMRV9OQU1FLAorCS5pZF90YWJsZQk9IGI0NF9wY2lfdGJsLAorCS5wcm9iZQkJPSBiNDRfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChiNDRfcmVtb3ZlX29uZSksCisgICAgICAgIC5zdXNwZW5kICAgICAgICA9IGI0NF9zdXNwZW5kLAorICAgICAgICAucmVzdW1lICAgICAgICAgPSBiNDRfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYjQ0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZiNDRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGI0NF9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZiNDRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYjQ0X2luaXQpOworbW9kdWxlX2V4aXQoYjQ0X2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iNDQuaCBiL2RyaXZlcnMvbmV0L2I0NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYzQwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9iNDQuaApAQCAtMCwwICsxLDQyNyBAQAorI2lmbmRlZiBfQjQ0X0gKKyNkZWZpbmUgX0I0NF9ICisKKy8qIFJlZ2lzdGVyIGxheW91dC4gKFRoZXNlIGNvcnJlc3BvbmQgdG8gc3RydWN0IF9iY21lbmV0dHJlZ3MgaW4gYmNtNDQwMC4pICovCisjZGVmaW5lCUI0NF9ERVZDVFJMCTB4MDAwMFVMIC8qIERldmljZSBDb250cm9sICovCisjZGVmaW5lICBERVZDVFJMX01QTQkJMHgwMDAwMDA0MCAvKiBNYWdpYyBQYWNrZXQgUE1FIEVuYWJsZSAoQjAgb25seSkgKi8KKyNkZWZpbmUgIERFVkNUUkxfUEZFCQkweDAwMDAwMDgwIC8qIFBhdHRlcm4gRmlsdGVyaW5nIEVuYWJsZSAqLworI2RlZmluZSAgREVWQ1RSTF9JUFAJCTB4MDAwMDA0MDAgLyogSW50ZXJuYWwgRVBIWSBQcmVzZW50ICovCisjZGVmaW5lICBERVZDVFJMX0VQUgkJMHgwMDAwODAwMCAvKiBFUEhZIFJlc2V0ICovCisjZGVmaW5lICBERVZDVFJMX1BNRQkJMHgwMDAwMTAwMCAvKiBQSFkgTW9kZSBFbmFibGUgKi8KKyNkZWZpbmUgIERFVkNUUkxfUE1DRQkJMHgwMDAwMjAwMCAvKiBQSFkgTW9kZSBDbG9ja3MgRW5hYmxlICovCisjZGVmaW5lICBERVZDVFJMX1BBRERSCQkweDAwMDdjMDAwIC8qIFBIWSBBZGRyZXNzICovCisjZGVmaW5lICBERVZDVFJMX1BBRERSX1NISUZUCTE4CisjZGVmaW5lIEI0NF9CSVNUX1NUQVQJMHgwMDBDVUwgLyogQnVpbHQtSW4gU2VsZi1UZXN0IFN0YXR1cyAqLworI2RlZmluZSBCNDRfV0tVUF9MRU4JMHgwMDEwVUwgLyogV2FrZXVwIExlbmd0aCAqLworI2RlZmluZSAgV0tVUF9MRU5fUDBfTUFTSwkweDAwMDAwMDdmIC8qIFBhdHRlcm4gMCAqLworI2RlZmluZSAgV0tVUF9MRU5fRDAJCTB4MDAwMDAwODAKKyNkZWZpbmUgIFdLVVBfTEVOX1AxX01BU0sJMHgwMDAwN2YwMCAvKiBQYXR0ZXJuIDEgKi8KKyNkZWZpbmUgIFdLVVBfTEVOX1AxX1NISUZUCTgKKyNkZWZpbmUgIFdLVVBfTEVOX0QxCQkweDAwMDA4MDAwCisjZGVmaW5lICBXS1VQX0xFTl9QMl9NQVNLCTB4MDA3ZjAwMDAgLyogUGF0dGVybiAyICovCisjZGVmaW5lICBXS1VQX0xFTl9QMl9TSElGVAkxNgorI2RlZmluZSAgV0tVUF9MRU5fRDIJCTB4MDAwMDAwMDAKKyNkZWZpbmUgIFdLVVBfTEVOX1AzX01BU0sJMHg3ZjAwMDAwMCAvKiBQYXR0ZXJuIDMgKi8KKyNkZWZpbmUgIFdLVVBfTEVOX1AzX1NISUZUCTI0CisjZGVmaW5lICBXS1VQX0xFTl9EMwkJMHg4MDAwMDAwMAorI2RlZmluZSBCNDRfSVNUQVQJMHgwMDIwVUwgLyogSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSAgSVNUQVRfTFMJCTB4MDAwMDAwMjAgLyogTGluayBDaGFuZ2UgKEIwIG9ubHkpICovCisjZGVmaW5lICBJU1RBVF9QTUUJCTB4MDAwMDAwNDAgLyogUG93ZXIgTWFuYWdlbWVudCBFdmVudCAqLworI2RlZmluZSAgSVNUQVRfVE8JCTB4MDAwMDAwODAgLyogR2VuZXJhbCBQdXJwb3NlIFRpbWVvdXQgKi8KKyNkZWZpbmUgIElTVEFUX0RTQ0UJCTB4MDAwMDA0MDAgLyogRGVzY3JpcHRvciBFcnJvciAqLworI2RlZmluZSAgSVNUQVRfREFUQUUJCTB4MDAwMDA4MDAgLyogRGF0YSBFcnJvciAqLworI2RlZmluZSAgSVNUQVRfRFBFCQkweDAwMDAxMDAwIC8qIERlc2NyLiBQcm90b2NvbCBFcnJvciAqLworI2RlZmluZSAgSVNUQVRfUkRVCQkweDAwMDAyMDAwIC8qIFJlY2VpdmUgRGVzY3IuIFVuZGVyZmxvdyAqLworI2RlZmluZSAgSVNUQVRfUkZPCQkweDAwMDA0MDAwIC8qIFJlY2VpdmUgRklGTyBPdmVyZmxvdyAqLworI2RlZmluZSAgSVNUQVRfVEZVCQkweDAwMDA4MDAwIC8qIFRyYW5zbWl0IEZJRk8gVW5kZXJmbG93ICovCisjZGVmaW5lICBJU1RBVF9SWAkJMHgwMDAxMDAwMCAvKiBSWCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgIElTVEFUX1RYCQkweDAxMDAwMDAwIC8qIFRYIEludGVycnVwdCAqLworI2RlZmluZSAgSVNUQVRfRU1BQwkJMHgwNDAwMDAwMCAvKiBFTUFDIEludGVycnVwdCAqLworI2RlZmluZSAgSVNUQVRfTUlJX1dSSVRFCTB4MDgwMDAwMDAgLyogTUlJIFdyaXRlIEludGVycnVwdCAqLworI2RlZmluZSAgSVNUQVRfTUlJX1JFQUQJCTB4MTAwMDAwMDAgLyogTUlJIFJlYWQgSW50ZXJydXB0ICovCisjZGVmaW5lICBJU1RBVF9FUlJPUlMgKElTVEFUX0RTQ0V8SVNUQVRfREFUQUV8SVNUQVRfRFBFfElTVEFUX1JEVXxJU1RBVF9SRk98SVNUQVRfVEZVKQorI2RlZmluZSBCNDRfSU1BU0sJMHgwMDI0VUwgLyogSW50ZXJydXB0IE1hc2sgKi8KKyNkZWZpbmUgIElNQVNLX0RFRgkJKElTVEFUX0VSUk9SUyB8IElTVEFUX1RPIHwgSVNUQVRfUlggfCBJU1RBVF9UWCkKKyNkZWZpbmUgQjQ0X0dQVElNRVIJMHgwMDI4VUwgLyogR2VuZXJhbCBQdXJwb3NlIFRpbWVyICovCisjZGVmaW5lIEI0NF9BRERSX0xPCTB4MDA4OFVMIC8qIEVORVQgQWRkcmVzcyBMbyAoQjAgb25seSkgKi8KKyNkZWZpbmUgQjQ0X0FERFJfSEkJMHgwMDhDVUwgLyogRU5FVCBBZGRyZXNzIEhpIChCMCBvbmx5KSAqLworI2RlZmluZSBCNDRfRklMVF9BRERSCTB4MDA5MFVMIC8qIEVORVQgRmlsdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQjQ0X0ZJTFRfREFUQQkweDAwOTRVTCAvKiBFTkVUIEZpbHRlciBEYXRhICovCisjZGVmaW5lIEI0NF9UWEJVUlNUCTB4MDBBMFVMIC8qIFRYIE1heCBCdXJzdCBMZW5ndGggKi8KKyNkZWZpbmUgQjQ0X1JYQlVSU1QJMHgwMEE0VUwgLyogUlggTWF4IEJ1cnN0IExlbmd0aCAqLworI2RlZmluZSBCNDRfTUFDX0NUUkwJMHgwMEE4VUwgLyogTUFDIENvbnRyb2wgKi8KKyNkZWZpbmUgIE1BQ19DVFJMX0NSQzMyX0VOQUIJMHgwMDAwMDAwMSAvKiBDUkMzMiBHZW5lcmF0aW9uIEVuYWJsZSAqLworI2RlZmluZSAgTUFDX0NUUkxfUEhZX1BET1dOCTB4MDAwMDAwMDQgLyogT25jaGlwIEVQSFkgUG93ZXJkb3duICovCisjZGVmaW5lICBNQUNfQ1RSTF9QSFlfRURFVAkweDAwMDAwMDA4IC8qIE9uY2hpcCBFUEhZIEVuZXJneSBEZXRlY3RlZCAqLworI2RlZmluZSAgTUFDX0NUUkxfUEhZX0xFRENUUkwJMHgwMDAwMDBlMCAvKiBPbmNoaXAgRVBIWSBMRUQgQ29udHJvbCAqLworI2RlZmluZSAgTUFDX0NUUkxfUEhZX0xFRENUUkxfU0hJRlQgNQorI2RlZmluZSBCNDRfTUFDX0ZMT1cJMHgwMEFDVUwgLyogTUFDIEZsb3cgQ29udHJvbCAqLworI2RlZmluZSAgTUFDX0ZMT1dfUlhfSElfV0FURVIJMHgwMDAwMDBmZiAvKiBSZWNlaXZlIEZJRk8gSEkgV2F0ZXIgTWFyayAqLworI2RlZmluZSAgTUFDX0ZMT1dfUEFVU0VfRU5BQgkweDAwMDA4MDAwIC8qIEVuYWJsZSBQYXVzZSBGcmFtZSBHZW5lcmF0aW9uICovCisjZGVmaW5lIEI0NF9SQ1ZfTEFaWQkweDAxMDBVTCAvKiBMYXp5IEludGVycnVwdCBDb250cm9sICovCisjZGVmaW5lICBSQ1ZfTEFaWV9UT19NQVNLCTB4MDBmZmZmZmYgLyogVGltZW91dCAqLworI2RlZmluZSAgUkNWX0xBWllfRkNfTUFTSwkweGZmMDAwMDAwIC8qIEZyYW1lIENvdW50ICovCisjZGVmaW5lICBSQ1ZfTEFaWV9GQ19TSElGVAkyNAorI2RlZmluZSBCNDRfRE1BVFhfQ1RSTAkweDAyMDBVTCAvKiBETUEgVFggQ29udHJvbCAqLworI2RlZmluZSAgRE1BVFhfQ1RSTF9FTkFCTEUJMHgwMDAwMDAwMSAvKiBFbmFibGUgKi8KKyNkZWZpbmUgIERNQVRYX0NUUkxfU1VTUEVORAkweDAwMDAwMDAyIC8qIFN1ZXBlbmQgUmVxdWVzdCAqLworI2RlZmluZSAgRE1BVFhfQ1RSTF9MUEJBQ0sJMHgwMDAwMDAwNCAvKiBMb29wYmFjayBFbmFibGUgKi8KKyNkZWZpbmUgIERNQVRYX0NUUkxfRkFJUlBSSU9SCTB4MDAwMDAwMDggLyogRmFpciBQcmlvcml0eSAqLworI2RlZmluZSAgRE1BVFhfQ1RSTF9GTFVTSAkweDAwMDAwMDEwIC8qIEZsdXNoIFJlcXVlc3QgKi8KKyNkZWZpbmUgQjQ0X0RNQVRYX0FERFIJMHgwMjA0VUwgLyogRE1BIFRYIERlc2NyaXB0b3IgUmluZyBBZGRyZXNzICovCisjZGVmaW5lIEI0NF9ETUFUWF9QVFIJMHgwMjA4VUwgLyogRE1BIFRYIExhc3QgUG9zdGVkIERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgQjQ0X0RNQVRYX1NUQVQJMHgwMjBDVUwgLyogRE1BIFRYIEN1cnJlbnQgQWN0aXZlIERlc2MuICsgU3RhdHVzICovCisjZGVmaW5lICBETUFUWF9TVEFUX0NETUFTSwkweDAwMDAwZmZmIC8qIEN1cnJlbnQgRGVzY3JpcHRvciBNYXNrICovCisjZGVmaW5lICBETUFUWF9TVEFUX1NNQVNLCTB4MDAwMGYwMDAgLyogU3RhdGUgTWFzayAqLworI2RlZmluZSAgRE1BVFhfU1RBVF9TRElTQUJMRUQJMHgwMDAwMDAwMCAvKiBTdGF0ZSBEaXNhYmxlZCAqLworI2RlZmluZSAgRE1BVFhfU1RBVF9TQUNUSVZFCTB4MDAwMDEwMDAgLyogU3RhdGUgQWN0aXZlICovCisjZGVmaW5lICBETUFUWF9TVEFUX1NJRExFCTB4MDAwMDIwMDAgLyogU3RhdGUgSWRsZSBXYWl0ICovCisjZGVmaW5lICBETUFUWF9TVEFUX1NTVE9QUEVECTB4MDAwMDMwMDAgLyogU3RhdGUgU3RvcHBlZCAqLworI2RlZmluZSAgRE1BVFhfU1RBVF9TU1VTUAkweDAwMDA0MDAwIC8qIFN0YXRlIFN1c3BlbmQgUGVuZGluZyAqLworI2RlZmluZSAgRE1BVFhfU1RBVF9FTUFTSwkweDAwMGYwMDAwIC8qIEVycm9yIE1hc2sgKi8KKyNkZWZpbmUgIERNQVRYX1NUQVRfRU5PTkUJMHgwMDAwMDAwMCAvKiBFcnJvciBOb25lICovCisjZGVmaW5lICBETUFUWF9TVEFUX0VEUEUJMHgwMDAxMDAwMCAvKiBFcnJvciBEZXNjLiBQcm90b2NvbCBFcnJvciAqLworI2RlZmluZSAgRE1BVFhfU1RBVF9FREZVCTB4MDAwMjAwMDAgLyogRXJyb3IgRGF0YSBGSUZPIFVuZGVycnVuICovCisjZGVmaW5lICBETUFUWF9TVEFUX0VCRUJSCTB4MDAwMzAwMDAgLyogRXJyb3IgQnVzIEVycm9yIG9uIEJ1ZmZlciBSZWFkICovCisjZGVmaW5lICBETUFUWF9TVEFUX0VCRURBCTB4MDAwNDAwMDAgLyogRXJyb3IgQnVzIEVycm9yIG9uIERlc2MuIEFjY2VzcyAqLworI2RlZmluZSAgRE1BVFhfU1RBVF9GTFVTSEVECTB4MDAxMDAwMDAgLyogRmx1c2hlZCAqLworI2RlZmluZSBCNDRfRE1BUlhfQ1RSTAkweDAyMTBVTCAvKiBETUEgUlggQ29udHJvbCAqLworI2RlZmluZSAgRE1BUlhfQ1RSTF9FTkFCTEUJMHgwMDAwMDAwMSAvKiBFbmFibGUgKi8KKyNkZWZpbmUgIERNQVJYX0NUUkxfUk9NQVNLCTB4MDAwMDAwZmUgLyogUmVjZWl2ZSBPZmZzZXQgTWFzayAqLworI2RlZmluZSAgRE1BUlhfQ1RSTF9ST1NISUZUCTEgCSAgIC8qIFJlY2VpdmUgT2Zmc2V0IFNoaWZ0ICovCisjZGVmaW5lIEI0NF9ETUFSWF9BRERSCTB4MDIxNFVMIC8qIERNQSBSWCBEZXNjcmlwdG9yIFJpbmcgQWRkcmVzcyAqLworI2RlZmluZSBCNDRfRE1BUlhfUFRSCTB4MDIxOFVMIC8qIERNQSBSWCBMYXN0IFBvc3RlZCBEZXNjcmlwdG9yICovCisjZGVmaW5lIEI0NF9ETUFSWF9TVEFUCTB4MDIxQ1VMIC8qIERNQSBSWCBDdXJyZW50IEFjdGl2ZSBEZXNjLiArIFN0YXR1cyAqLworI2RlZmluZSAgRE1BUlhfU1RBVF9DRE1BU0sJMHgwMDAwMGZmZiAvKiBDdXJyZW50IERlc2NyaXB0b3IgTWFzayAqLworI2RlZmluZSAgRE1BUlhfU1RBVF9TTUFTSwkweDAwMDBmMDAwIC8qIFN0YXRlIE1hc2sgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfU0RJU0FCTEVECTB4MDAwMDAwMDAgLyogU3RhdGUgRGlzYmFsZWQgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfU0FDVElWRQkweDAwMDAxMDAwIC8qIFN0YXRlIEFjdGl2ZSAqLworI2RlZmluZSAgRE1BUlhfU1RBVF9TSURMRQkweDAwMDAyMDAwIC8qIFN0YXRlIElkbGUgV2FpdCAqLworI2RlZmluZSAgRE1BUlhfU1RBVF9TU1RPUFBFRAkweDAwMDAzMDAwIC8qIFN0YXRlIFN0b3BwZWQgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfRU1BU0sJMHgwMDBmMDAwMCAvKiBFcnJvciBNYXNrICovCisjZGVmaW5lICBETUFSWF9TVEFUX0VOT05FCTB4MDAwMDAwMDAgLyogRXJyb3IgTm9uZSAqLworI2RlZmluZSAgRE1BUlhfU1RBVF9FRFBFCTB4MDAwMTAwMDAgLyogRXJyb3IgRGVzYy4gUHJvdG9jb2wgRXJyb3IgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfRURGTwkweDAwMDIwMDAwIC8qIEVycm9yIERhdGEgRklGTyBPdmVyZmxvdyAqLworI2RlZmluZSAgRE1BUlhfU1RBVF9FQkVCVwkweDAwMDMwMDAwIC8qIEVycm9yIEJ1cyBFcnJvciBvbiBCdWZmZXIgV3JpdGUgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfRUJFREEJMHgwMDA0MDAwMCAvKiBFcnJvciBCdXMgRXJyb3Igb24gRGVzYy4gQWNjZXNzICovCisjZGVmaW5lIEI0NF9ETUFGSUZPX0FECTB4MDIyMFVMIC8qIERNQSBGSUZPIERpYWcgQWRkcmVzcyAqLworI2RlZmluZSAgRE1BRklGT19BRF9PTUFTSwkweDAwMDBmZmZmIC8qIE9mZnNldCBNYXNrICovCisjZGVmaW5lICBETUFGSUZPX0FEX1NNQVNLCTB4MDAwZjAwMDAgLyogU2VsZWN0IE1hc2sgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfU1hERAkweDAwMDAwMDAwIC8qIFNlbGVjdCBUcmFuc21pdCBETUEgRGF0YSAqLworI2RlZmluZSAgRE1BRklGT19BRF9TWERQCTB4MDAwMTAwMDAgLyogU2VsZWN0IFRyYW5zbWl0IERNQSBQb2ludGVycyAqLworI2RlZmluZSAgRE1BRklGT19BRF9TUkRECTB4MDAwNDAwMDAgLyogU2VsZWN0IFJlY2VpdmUgRE1BIERhdGEgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfU1JEUAkweDAwMDUwMDAwIC8qIFNlbGVjdCBSZWNlaXZlIERNQSBQb2ludGVycyAqLworI2RlZmluZSAgRE1BRklGT19BRF9TWEZECTB4MDAwODAwMDAgLyogU2VsZWN0IFRyYW5zbWl0IEZJRk8gRGF0YSAqLworI2RlZmluZSAgRE1BRklGT19BRF9TWEZQCTB4MDAwOTAwMDAgLyogU2VsZWN0IFRyYW5zbWl0IEZJRk8gUG9pbnRlcnMgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfU1JGRAkweDAwMGMwMDAwIC8qIFNlbGVjdCBSZWNlaXZlIEZJRk8gRGF0YSAqLworI2RlZmluZSAgRE1BRklGT19BRF9TUkZQCTB4MDAwYzAwMDAgLyogU2VsZWN0IFJlY2VpdmUgRklGTyBQb2ludGVycyAqLworI2RlZmluZSBCNDRfRE1BRklGT19MTwkweDAyMjRVTCAvKiBETUEgRklGTyBEaWFnIExvdyBEYXRhICovCisjZGVmaW5lIEI0NF9ETUFGSUZPX0hJCTB4MDIyOFVMIC8qIERNQSBGSUZPIERpYWcgSGlnaCBEYXRhICovCisjZGVmaW5lIEI0NF9SWENPTkZJRwkweDA0MDBVTCAvKiBFTUFDIFJYIENvbmZpZyAqLworI2RlZmluZSAgUlhDT05GSUdfREJDQVNUCTB4MDAwMDAwMDEgLyogRGlzYWJsZSBCcm9hZGNhc3QgKi8KKyNkZWZpbmUgIFJYQ09ORklHX0FMTE1VTFRJCTB4MDAwMDAwMDIgLyogQWNjZXB0IEFsbCBNdWx0aWNhc3QgKi8KKyNkZWZpbmUgIFJYQ09ORklHX05PUlhfV0hJTEVfVFgJMHgwMDAwMDAwNCAvKiBSZWNlaXZlIERpc2FibGUgV2hpbGUgVHJhbnNtaXR0aW5nICovCisjZGVmaW5lICBSWENPTkZJR19QUk9NSVNDCTB4MDAwMDAwMDggLyogUHJvbWlzY3VvdXMgRW5hYmxlICovCisjZGVmaW5lICBSWENPTkZJR19MUEJBQ0sJMHgwMDAwMDAxMCAvKiBMb29wYmFjayBFbmFibGUgKi8KKyNkZWZpbmUgIFJYQ09ORklHX0ZMT1cJCTB4MDAwMDAwMjAgLyogRmxvdyBDb250cm9sIEVuYWJsZSAqLworI2RlZmluZSAgUlhDT05GSUdfRkxPV19BQ0NFUFQJMHgwMDAwMDA0MCAvKiBBY2NlcHQgVW5pY2FzdCBGbG93IENvbnRyb2wgRnJhbWUgKi8KKyNkZWZpbmUgIFJYQ09ORklHX1JGSUxUCQkweDAwMDAwMDgwIC8qIFJlamVjdCBGaWx0ZXIgKi8KKyNkZWZpbmUgQjQ0X1JYTUFYTEVOCTB4MDQwNFVMIC8qIEVNQUMgUlggTWF4IFBhY2tldCBMZW5ndGggKi8KKyNkZWZpbmUgQjQ0X1RYTUFYTEVOCTB4MDQwOFVMIC8qIEVNQUMgVFggTWF4IFBhY2tldCBMZW5ndGggKi8KKyNkZWZpbmUgQjQ0X01ESU9fQ1RSTAkweDA0MTBVTCAvKiBFTUFDIE1ESU8gQ29udHJvbCAqLworI2RlZmluZSAgTURJT19DVFJMX01BWEZfTUFTSwkweDAwMDAwMDdmIC8qIE1EQyBGcmVxdWVuY3kgKi8KKyNkZWZpbmUgIE1ESU9fQ1RSTF9QUkVBTUJMRQkweDAwMDAwMDgwIC8qIE1JSSBQcmVhbWJsZSBFbmFibGUgKi8KKyNkZWZpbmUgQjQ0X01ESU9fREFUQQkweDA0MTRVTCAvKiBFTUFDIE1ESU8gRGF0YSAqLworI2RlZmluZSAgTURJT19EQVRBX0RBVEEJCTB4MDAwMGZmZmYgLyogUi9XIERhdGEgKi8KKyNkZWZpbmUgIE1ESU9fREFUQV9UQV9NQVNLCTB4MDAwMzAwMDAgLyogVHVybmFyb3VuZCBWYWx1ZSAqLworI2RlZmluZSAgTURJT19EQVRBX1RBX1NISUZUCTE2CisjZGVmaW5lICBNRElPX1RBX1ZBTElECQkyCisjZGVmaW5lICBNRElPX0RBVEFfUkFfTUFTSwkweDAwN2MwMDAwIC8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgIE1ESU9fREFUQV9SQV9TSElGVAkxOAorI2RlZmluZSAgTURJT19EQVRBX1BNRF9NQVNLCTB4MGY4MDAwMDAgLyogUGh5c2ljYWwgTWVkaWEgRGV2aWNlICovCisjZGVmaW5lICBNRElPX0RBVEFfUE1EX1NISUZUCTIzCisjZGVmaW5lICBNRElPX0RBVEFfT1BfTUFTSwkweDMwMDAwMDAwIC8qIE9wY29kZSAqLworI2RlZmluZSAgTURJT19EQVRBX09QX1NISUZUCTI4CisjZGVmaW5lICBNRElPX09QX1dSSVRFCQkxCisjZGVmaW5lICBNRElPX09QX1JFQUQJCTIKKyNkZWZpbmUgIE1ESU9fREFUQV9TQl9NQVNLCTB4YzAwMDAwMDAgLyogU3RhcnQgQml0cyAqLworI2RlZmluZSAgTURJT19EQVRBX1NCX1NISUZUCTMwCisjZGVmaW5lICBNRElPX0RBVEFfU0JfU1RBUlQJMHg0MDAwMDAwMCAvKiBTdGFydCBPZiBGcmFtZSAqLworI2RlZmluZSBCNDRfRU1BQ19JTUFTSwkweDA0MThVTCAvKiBFTUFDIEludGVycnVwdCBNYXNrICovCisjZGVmaW5lIEI0NF9FTUFDX0lTVEFUCTB4MDQxQ1VMIC8qIEVNQUMgSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSAgRU1BQ19JTlRfTUlJCQkweDAwMDAwMDAxIC8qIE1JSSBNRElPIEludGVycnVwdCAqLworI2RlZmluZSAgRU1BQ19JTlRfTUlCCQkweDAwMDAwMDAyIC8qIE1JQiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgIEVNQUNfSU5UX0ZMT1cJCTB4MDAwMDAwMDMgLyogRmxvdyBDb250cm9sIEludGVycnVwdCAqLworI2RlZmluZSBCNDRfQ0FNX0RBVEFfTE8JMHgwNDIwVUwgLyogRU1BQyBDQU0gRGF0YSBMb3cgKi8KKyNkZWZpbmUgQjQ0X0NBTV9EQVRBX0hJCTB4MDQyNFVMIC8qIEVNQUMgQ0FNIERhdGEgSGlnaCAqLworI2RlZmluZSAgQ0FNX0RBVEFfSElfVkFMSUQJMHgwMDAxMDAwMCAvKiBWYWxpZCBCaXQgKi8KKyNkZWZpbmUgQjQ0X0NBTV9DVFJMCTB4MDQyOFVMIC8qIEVNQUMgQ0FNIENvbnRyb2wgKi8KKyNkZWZpbmUgIENBTV9DVFJMX0VOQUJMRQkweDAwMDAwMDAxIC8qIENBTSBFbmFibGUgKi8KKyNkZWZpbmUgIENBTV9DVFJMX01TRUwJCTB4MDAwMDAwMDIgLyogTWFzayBTZWxlY3QgKi8KKyNkZWZpbmUgIENBTV9DVFJMX1JFQUQJCTB4MDAwMDAwMDQgLyogUmVhZCAqLworI2RlZmluZSAgQ0FNX0NUUkxfV1JJVEUJCTB4MDAwMDAwMDggLyogUmVhZCAqLworI2RlZmluZSAgQ0FNX0NUUkxfSU5ERVhfTUFTSwkweDAwM2YwMDAwIC8qIEluZGV4IE1hc2sgKi8KKyNkZWZpbmUgIENBTV9DVFJMX0lOREVYX1NISUZUCTE2CisjZGVmaW5lICBDQU1fQ1RSTF9CVVNZCQkweDgwMDAwMDAwIC8qIENBTSBCdXN5ICovCisjZGVmaW5lIEI0NF9FTkVUX0NUUkwJMHgwNDJDVUwgLyogRU1BQyBFTkVUIENvbnRyb2wgKi8KKyNkZWZpbmUgIEVORVRfQ1RSTF9FTkFCTEUJMHgwMDAwMDAwMSAvKiBFTUFDIEVuYWJsZSAqLworI2RlZmluZSAgRU5FVF9DVFJMX0RJU0FCTEUJMHgwMDAwMDAwMiAvKiBFTUFDIERpc2FibGUgKi8KKyNkZWZpbmUgIEVORVRfQ1RSTF9TUlNUCQkweDAwMDAwMDA0IC8qIEVNQUMgU29mdCBSZXNldCAqLworI2RlZmluZSAgRU5FVF9DVFJMX0VQU0VMCTB4MDAwMDAwMDggLyogRXh0ZXJuYWwgUEhZIFNlbGVjdCAqLworI2RlZmluZSBCNDRfVFhfQ1RSTAkweDA0MzBVTCAvKiBFTUFDIFRYIENvbnRyb2wgKi8KKyNkZWZpbmUgIFRYX0NUUkxfRFVQTEVYCQkweDAwMDAwMDAxIC8qIEZ1bGwgRHVwbGV4ICovCisjZGVmaW5lICBUWF9DVFJMX0ZNT0RFCQkweDAwMDAwMDAyIC8qIEZsb3cgTW9kZSAqLworI2RlZmluZSAgVFhfQ1RSTF9TQkVOQUIJCTB4MDAwMDAwMDQgLyogU2luZ2xlIEJhY2tvZmYgRW5hYmxlICovCisjZGVmaW5lICBUWF9DVFJMX1NNQUxMX1NMT1QJMHgwMDAwMDAwOCAvKiBTbWFsbCBTbG90dGltZSAqLworI2RlZmluZSBCNDRfVFhfV01BUksJMHgwNDM0VUwgLyogRU1BQyBUWCBXYXRlcm1hcmsgKi8KKyNkZWZpbmUgQjQ0X01JQl9DVFJMCTB4MDQzOFVMIC8qIEVNQUMgTUlCIENvbnRyb2wgKi8KKyNkZWZpbmUgIE1JQl9DVFJMX0NMUl9PTl9SRUFECTB4MDAwMDAwMDEgLyogQXV0b2NsZWFyIG9uIFJlYWQgKi8KKyNkZWZpbmUgQjQ0X1RYX0dPT0RfTwkweDA1MDBVTCAvKiBNSUIgVFggR29vZCBPY3RldHMgKi8KKyNkZWZpbmUgQjQ0X1RYX0dPT0RfUAkweDA1MDRVTCAvKiBNSUIgVFggR29vZCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9UWF9PCTB4MDUwOFVMIC8qIE1JQiBUWCBPY3RldHMgKi8KKyNkZWZpbmUgQjQ0X1RYX1AJMHgwNTBDVUwgLyogTUlCIFRYIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1RYX0JDQVNUCTB4MDUxMFVMIC8qIE1JQiBUWCBCcm9hZGNhc3QgUGFja2V0cyAqLworI2RlZmluZSBCNDRfVFhfTUNBU1QJMHgwNTE0VUwgLyogTUlCIFRYIE11bHRpY2FzdCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9UWF82NAkweDA1MThVTCAvKiBNSUIgVFggPD0gNjQgYnl0ZSBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9UWF82NV8xMjcJMHgwNTFDVUwgLyogTUlCIFRYIDY1IHRvIDEyNyBieXRlIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1RYXzEyOF8yNTUJMHgwNTIwVUwgLyogTUlCIFRYIDEyOCB0byAyNTUgYnl0ZSBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9UWF8yNTZfNTExCTB4MDUyNFVMIC8qIE1JQiBUWCAyNTYgdG8gNTExIGJ5dGUgUGFja2V0cyAqLworI2RlZmluZSBCNDRfVFhfNTEyXzEwMjMJMHgwNTI4VUwgLyogTUlCIFRYIDUxMiB0byAxMDIzIGJ5dGUgUGFja2V0cyAqLworI2RlZmluZSBCNDRfVFhfMTAyNF9NQVgJMHgwNTJDVUwgLyogTUlCIFRYIDEwMjQgdG8gbWF4IGJ5dGUgUGFja2V0cyAqLworI2RlZmluZSBCNDRfVFhfSkFCQkVSCTB4MDUzMFVMIC8qIE1JQiBUWCBKYWJiZXIgUGFja2V0cyAqLworI2RlZmluZSBCNDRfVFhfT1NJWkUJMHgwNTM0VUwgLyogTUlCIFRYIE92ZXJzaXplIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1RYX0ZSQUcJMHgwNTM4VUwgLyogTUlCIFRYIEZyYWdtZW50IFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1RYX1VSVU5TCTB4MDUzQ1VMIC8qIE1JQiBUWCBVbmRlcnJ1bnMgKi8KKyNkZWZpbmUgQjQ0X1RYX1RDT0xTCTB4MDU0MFVMIC8qIE1JQiBUWCBUb3RhbCBDb2xsaXNpb25zICovCisjZGVmaW5lIEI0NF9UWF9TQ09MUwkweDA1NDRVTCAvKiBNSUIgVFggU2luZ2xlIENvbGxpc2lvbnMgKi8KKyNkZWZpbmUgQjQ0X1RYX01DT0xTCTB4MDU0OFVMIC8qIE1JQiBUWCBNdWx0aXBsZSBDb2xsaXNpb25zICovCisjZGVmaW5lIEI0NF9UWF9FQ09MUwkweDA1NENVTCAvKiBNSUIgVFggRXhjZXNzaXZlIENvbGxpc2lvbnMgKi8KKyNkZWZpbmUgQjQ0X1RYX0xDT0xTCTB4MDU1MFVMIC8qIE1JQiBUWCBMYXRlIENvbGxpc2lvbnMgKi8KKyNkZWZpbmUgQjQ0X1RYX0RFRkVSRUQJMHgwNTU0VUwgLyogTUlCIFRYIERlZmVyZWQgUGFja2V0cyAqLworI2RlZmluZSBCNDRfVFhfQ0xPU1QJMHgwNTU4VUwgLyogTUlCIFRYIENhcnJpZXIgTG9zdCAqLworI2RlZmluZSBCNDRfVFhfUEFVU0UJMHgwNTVDVUwgLyogTUlCIFRYIFBhdXNlIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX0dPT0RfTwkweDA1ODBVTCAvKiBNSUIgUlggR29vZCBPY3RldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX0dPT0RfUAkweDA1ODRVTCAvKiBNSUIgUlggR29vZCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9SWF9PCTB4MDU4OFVMIC8qIE1JQiBSWCBPY3RldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX1AJMHgwNThDVUwgLyogTUlCIFJYIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX0JDQVNUCTB4MDU5MFVMIC8qIE1JQiBSWCBCcm9hZGNhc3QgUGFja2V0cyAqLworI2RlZmluZSBCNDRfUlhfTUNBU1QJMHgwNTk0VUwgLyogTUlCIFJYIE11bHRpY2FzdCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9SWF82NAkweDA1OThVTCAvKiBNSUIgUlggPD0gNjQgYnl0ZSBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9SWF82NV8xMjcJMHgwNTlDVUwgLyogTUlCIFJYIDY1IHRvIDEyNyBieXRlIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYXzEyOF8yNTUJMHgwNUEwVUwgLyogTUlCIFJYIDEyOCB0byAyNTUgYnl0ZSBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9SWF8yNTZfNTExCTB4MDVBNFVMIC8qIE1JQiBSWCAyNTYgdG8gNTExIGJ5dGUgUGFja2V0cyAqLworI2RlZmluZSBCNDRfUlhfNTEyXzEwMjMJMHgwNUE4VUwgLyogTUlCIFJYIDUxMiB0byAxMDIzIGJ5dGUgUGFja2V0cyAqLworI2RlZmluZSBCNDRfUlhfMTAyNF9NQVgJMHgwNUFDVUwgLyogTUlCIFJYIDEwMjQgdG8gbWF4IGJ5dGUgUGFja2V0cyAqLworI2RlZmluZSBCNDRfUlhfSkFCQkVSCTB4MDVCMFVMIC8qIE1JQiBSWCBKYWJiZXIgUGFja2V0cyAqLworI2RlZmluZSBCNDRfUlhfT1NJWkUJMHgwNUI0VUwgLyogTUlCIFJYIE92ZXJzaXplIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX0ZSQUcJMHgwNUI4VUwgLyogTUlCIFJYIEZyYWdtZW50IFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX01JU1MJMHgwNUJDVUwgLyogTUlCIFJYIE1pc3NlZCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9SWF9DUkNBCTB4MDVDMFVMIC8qIE1JQiBSWCBDUkMgQWxpZ24gRXJyb3JzICovCisjZGVmaW5lIEI0NF9SWF9VU0laRQkweDA1QzRVTCAvKiBNSUIgUlggVW5kZXJzaXplIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX0NSQwkweDA1QzhVTCAvKiBNSUIgUlggQ1JDIEVycm9ycyAqLworI2RlZmluZSBCNDRfUlhfQUxJR04JMHgwNUNDVUwgLyogTUlCIFJYIEFsaWduIEVycm9ycyAqLworI2RlZmluZSBCNDRfUlhfU1lNCTB4MDVEMFVMIC8qIE1JQiBSWCBTeW1ib2wgRXJyb3JzICovCisjZGVmaW5lIEI0NF9SWF9QQVVTRQkweDA1RDRVTCAvKiBNSUIgUlggUGF1c2UgUGFja2V0cyAqLworI2RlZmluZSBCNDRfUlhfTlBBVVNFCTB4MDVEOFVMIC8qIE1JQiBSWCBOb24tUGF1c2UgUGFja2V0cyAqLworCisvKiBTaWxpY29uIGJhY2twbGFuZSByZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBCNDRfU0JJTVNUQVRFCTB4MEY5MFVMIC8qIFNCIEluaXRpYXRvciBBZ2VudCBTdGF0ZSAqLworI2RlZmluZSAgU0JJTVNUQVRFX1BDCQkweDAwMDAwMDBmIC8qIFBpcGUgQ291bnQgKi8KKyNkZWZpbmUgIFNCSU1TVEFURV9BUF9NQVNLCTB4MDAwMDAwMzAgLyogQXJiaXRyYXRpb24gUHJpb3JpdHkgKi8KKyNkZWZpbmUgIFNCSU1TVEFURV9BUF9CT1RICTB4MDAwMDAwMDAgLyogVXNlIGJvdGggdGltZXNsaWNlcyBhbmQgdG9rZW4gKi8KKyNkZWZpbmUgIFNCSU1TVEFURV9BUF9UUwkweDAwMDAwMDEwIC8qIFVzZSB0aW1lc2xpY2VzIG9ubHkgKi8KKyNkZWZpbmUgIFNCSU1TVEFURV9BUF9USwkweDAwMDAwMDIwIC8qIFVzZSB0b2tlbiBvbmx5ICovCisjZGVmaW5lICBTQklNU1RBVEVfQVBfUlNWCTB4MDAwMDAwMzAgLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgIFNCSU1TVEFURV9JQkUJCTB4MDAwMjAwMDAgLyogSW4gQmFuZCBFcnJvciAqLworI2RlZmluZSAgU0JJTVNUQVRFX1RPCQkweDAwMDQwMDAwIC8qIFRpbWVvdXQgKi8KKyNkZWZpbmUgQjQ0X1NCSU5UVkVDCTB4MEY5NFVMIC8qIFNCIEludGVycnVwdCBNYXNrICovCisjZGVmaW5lICBTQklOVFZFQ19QQ0kJCTB4MDAwMDAwMDEgLyogRW5hYmxlIGludGVycnVwdHMgZm9yIFBDSSAqLworI2RlZmluZSAgU0JJTlRWRUNfRU5FVDAJCTB4MDAwMDAwMDIgLyogRW5hYmxlIGludGVycnVwdHMgZm9yIGVuZXQgMCAqLworI2RlZmluZSAgU0JJTlRWRUNfSUxJTkUyMAkweDAwMDAwMDA0IC8qIEVuYWJsZSBpbnRlcnJ1cHRzIGZvciBpbGluZTIwICovCisjZGVmaW5lICBTQklOVFZFQ19DT0RFQwkJMHgwMDAwMDAwOCAvKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgdjkwIGNvZGVjICovCisjZGVmaW5lICBTQklOVFZFQ19VU0IJCTB4MDAwMDAwMTAgLyogRW5hYmxlIGludGVycnVwdHMgZm9yIHVzYiAqLworI2RlZmluZSAgU0JJTlRWRUNfRVhUSUYJCTB4MDAwMDAwMjAgLyogRW5hYmxlIGludGVycnVwdHMgZm9yIGV4dGVybmFsIGkvZiAqLworI2RlZmluZSAgU0JJTlRWRUNfRU5FVDEJCTB4MDAwMDAwNDAgLyogRW5hYmxlIGludGVycnVwdHMgZm9yIGVuZXQgMSAqLworI2RlZmluZSBCNDRfU0JUTVNMT1cJMHgwRjk4VUwgLyogU0IgVGFyZ2V0IFN0YXRlIExvdyAqLworI2RlZmluZSAgU0JUTVNMT1dfUkVTRVQJCTB4MDAwMDAwMDEgLyogUmVzZXQgKi8KKyNkZWZpbmUgIFNCVE1TTE9XX1JFSkVDVAkweDAwMDAwMDAyIC8qIFJlamVjdCAqLworI2RlZmluZSAgU0JUTVNMT1dfQ0xPQ0sJCTB4MDAwMTAwMDAgLyogQ2xvY2sgRW5hYmxlICovCisjZGVmaW5lICBTQlRNU0xPV19GR0MJCTB4MDAwMjAwMDAgLyogRm9yY2UgR2F0ZWQgQ2xvY2tzIE9uICovCisjZGVmaW5lICBTQlRNU0xPV19QRQkJMHg0MDAwMDAwMCAvKiBQb3dlciBNYW5hZ2VtZW50IEVuYWJsZSAqLworI2RlZmluZSAgU0JUTVNMT1dfQkUJCTB4ODAwMDAwMDAgLyogQklTVCBFbmFibGUgKi8KKyNkZWZpbmUgQjQ0X1NCVE1TSElHSAkweDBGOUNVTCAvKiBTQiBUYXJnZXQgU3RhdGUgSGlnaCAqLworI2RlZmluZSAgU0JUTVNISUdIX1NFUlIJCTB4MDAwMDAwMDEgLyogUy1lcnJvciAqLworI2RlZmluZSAgU0JUTVNISUdIX0lOVAkJMHgwMDAwMDAwMiAvKiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgIFNCVE1TSElHSF9CVVNZCQkweDAwMDAwMDA0IC8qIEJ1c3kgKi8KKyNkZWZpbmUgIFNCVE1TSElHSF9HQ1IJCTB4MjAwMDAwMDAgLyogR2F0ZWQgQ2xvY2sgUmVxdWVzdCAqLworI2RlZmluZSAgU0JUTVNISUdIX0JJU1RGCTB4NDAwMDAwMDAgLyogQklTVCBGYWlsZWQgKi8KKyNkZWZpbmUgIFNCVE1TSElHSF9CSVNURAkweDgwMDAwMDAwIC8qIEJJU1QgRG9uZSAqLworI2RlZmluZSBCNDRfU0JJREhJR0gJMHgwRkZDVUwgLyogU0IgSWRlbnRpZmljYXRpb24gSGlnaCAqLworI2RlZmluZSAgU0JJREhJR0hfUkNfTUFTSwkweDAwMDAwMDBmIC8qIFJldmlzaW9uIENvZGUgKi8KKyNkZWZpbmUgIFNCSURISUdIX0NDX01BU0sJMHgwMDAwZmZmMCAvKiBDb3JlIENvZGUgKi8KKyNkZWZpbmUgIFNCSURISUdIX0NDX1NISUZUCTQKKyNkZWZpbmUgIFNCSURISUdIX1ZDX01BU0sJMHhmZmZmMDAwMCAvKiBWZW5kb3IgQ29kZSAqLworI2RlZmluZSAgU0JJREhJR0hfVkNfU0hJRlQJMTYKKworLyogU1NCIFBDSSBjb25maWcgc3BhY2UgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUJU1NCX0JBUjBfV0lOCQkweDgwCisjZGVmaW5lCVNTQl9CQVIxX1dJTgkJMHg4NAorI2RlZmluZQlTU0JfU1BST01fQ09OVFJPTAkweDg4CisjZGVmaW5lCVNTQl9CQVIxX0NPTlRST0wJMHg4YworCisvKiBTU0IgY29yZSBhbmQgaG9zdCBjb250cm9sIHJlZ2lzdGVycy4gICovCisjZGVmaW5lIFNTQl9DT05UUk9MCQkweDAwMDBVTAorI2RlZmluZSBTU0JfQVJCQ09OVFJPTAkJMHgwMDEwVUwKKyNkZWZpbmUgU1NCX0lTVEFUCQkweDAwMjBVTAorI2RlZmluZSBTU0JfSU1BU0sJCTB4MDAyNFVMCisjZGVmaW5lIFNTQl9NQk9YCQkweDAwMjhVTAorI2RlZmluZSBTU0JfQkNBU1RfQUREUgkJMHgwMDUwVUwKKyNkZWZpbmUgU1NCX0JDQVNUX0RBVEEJCTB4MDA1NFVMCisjZGVmaW5lIFNTQl9QQ0lfVFJBTlNfMAkJMHgwMTAwVUwKKyNkZWZpbmUgU1NCX1BDSV9UUkFOU18xCQkweDAxMDRVTAorI2RlZmluZSBTU0JfUENJX1RSQU5TXzIJCTB4MDEwOFVMCisjZGVmaW5lIFNTQl9TUFJPTQkJMHgwODAwVUwKKworI2RlZmluZSBTU0JfUENJX01FTQkJMHgwMDAwMDAwMAorI2RlZmluZSBTU0JfUENJX0lPCQkweDAwMDAwMDAxCisjZGVmaW5lIFNTQl9QQ0lfQ0ZHMAkJMHgwMDAwMDAwMgorI2RlZmluZSBTU0JfUENJX0NGRzEJCTB4MDAwMDAwMDMKKyNkZWZpbmUgU1NCX1BDSV9QUkVGCQkweDAwMDAwMDA0CisjZGVmaW5lIFNTQl9QQ0lfQlVSU1QJCTB4MDAwMDAwMDgKKyNkZWZpbmUgU1NCX1BDSV9NQVNLMAkJMHhmYzAwMDAwMAorI2RlZmluZSBTU0JfUENJX01BU0sxCQkweGZjMDAwMDAwCisjZGVmaW5lIFNTQl9QQ0lfTUFTSzIJCTB4YzAwMDAwMDAKKworLyogNDQwMCBQSFkgcmVnaXN0ZXJzICovCisjZGVmaW5lIEI0NF9NSUlfQVVYQ1RSTAkJMjQJLyogQXV4aWxpYXJ5IENvbnRyb2wgKi8KKyNkZWZpbmUgIE1JSV9BVVhDVFJMX0RVUExFWAkweDAwMDEgIC8qIEZ1bGwgRHVwbGV4ICovCisjZGVmaW5lICBNSUlfQVVYQ1RSTF9TUEVFRAkweDAwMDIgIC8qIDE9MTAwTWJwcywgMD0xME1icHMgKi8KKyNkZWZpbmUgIE1JSV9BVVhDVFJMX0ZPUkNFRAkweDAwMDQJLyogRm9yY2VkIDEwLzEwMCAqLworI2RlZmluZSBCNDRfTUlJX0FMRURDVFJMCTI2CS8qIEFjdGl2aXR5IExFRCAqLworI2RlZmluZSAgTUlJX0FMRURDVFJMX0FMTE1TSwkweDdmZmYKKyNkZWZpbmUgQjQ0X01JSV9UTEVEQ1RSTAkyNwkvKiBUcmFmZmljIE1ldGVyIExFRCAqLworI2RlZmluZSAgTUlJX1RMRURDVFJMX0VOQUJMRQkweDAwNDAKKworc3RydWN0IGRtYV9kZXNjIHsKKwl1MzIJY3RybDsKKwl1MzIJYWRkcjsKK307CisKKy8qIFRoZXJlIGFyZSBvbmx5IDEyIGJpdHMgaW4gdGhlIERNQSBlbmdpbmUgZm9yIGRlc2NyaXB0b3Igb2Zmc2V0dGluZworICogc28gdGhlIHRhYmxlIG11c3QgYmUgYWxpZ25lZCBvbiBhIGJvdW5kYXJ5IG9mIHRoaXMuCisgKi8KKyNkZWZpbmUgRE1BX1RBQkxFX0JZVEVTCQk0MDk2CisKKyNkZWZpbmUgREVTQ19DVFJMX0xFTgkweDAwMDAxZmZmCisjZGVmaW5lIERFU0NfQ1RSTF9DTUFTSwkweDBmZjAwMDAwIC8qIENvcmUgc3BlY2lmaWMgYml0cyAqLworI2RlZmluZSBERVNDX0NUUkxfRU9UCTB4MTAwMDAwMDAgLyogRW5kIG9mIFRhYmxlICovCisjZGVmaW5lIERFU0NfQ1RSTF9JT0MJMHgyMDAwMDAwMCAvKiBJbnRlcnJ1cHQgT24gQ29tcGxldGlvbiAqLworI2RlZmluZSBERVNDX0NUUkxfRU9GCTB4NDAwMDAwMDAgLyogRW5kIG9mIEZyYW1lICovCisjZGVmaW5lIERFU0NfQ1RSTF9TT0YJMHg4MDAwMDAwMCAvKiBTdGFydCBvZiBGcmFtZSAqLworCisjZGVmaW5lIFJYX0NPUFlfVEhSRVNIT0xEICAJMjU2CisKK3N0cnVjdCByeF9oZWFkZXIgeworCXUxNglsZW47CisJdTE2CWZsYWdzOworCXUxNglwYWRbMTJdOworfTsKKyNkZWZpbmUgUlhfSEVBREVSX0xFTgkyOAorCisjZGVmaW5lIFJYX0ZMQUdfT0ZJRk8JMHgwMDAwMDAwMSAvKiBGSUZPIE92ZXJmbG93ICovCisjZGVmaW5lIFJYX0ZMQUdfQ1JDRVJSCTB4MDAwMDAwMDIgLyogQ1JDIEVycm9yICovCisjZGVmaW5lIFJYX0ZMQUdfU0VSUgkweDAwMDAwMDA0IC8qIFJlY2VpdmUgU3ltYm9sIEVycm9yICovCisjZGVmaW5lIFJYX0ZMQUdfT0RECTB4MDAwMDAwMDggLyogRnJhbWUgaGFzIG9kZCBudW1iZXIgb2YgbmliYmxlcyAqLworI2RlZmluZSBSWF9GTEFHX0xBUkdFCTB4MDAwMDAwMTAgLyogRnJhbWUgaXMgPiBSWCBNQVggTGVuZ3RoICovCisjZGVmaW5lIFJYX0ZMQUdfTUNBU1QJMHgwMDAwMDAyMCAvKiBEZXN0IGlzIE11bHRpY2FzdCBBZGRyZXNzICovCisjZGVmaW5lIFJYX0ZMQUdfQkNBU1QJMHgwMDAwMDA0MCAvKiBEZXN0IGlzIEJyb2FkY2FzdCBBZGRyZXNzICovCisjZGVmaW5lIFJYX0ZMQUdfTUlTUwkweDAwMDAwMDgwIC8qIFJlY2VpdmVkIGR1ZSB0byBwcm9taXNjIG1vZGUgKi8KKyNkZWZpbmUgUlhfRkxBR19MQVNUCTB4MDAwMDA4MDAgLyogTGFzdCBidWZmZXIgaW4gZnJhbWUgKi8KKyNkZWZpbmUgUlhfRkxBR19FUlJPUlMJKFJYX0ZMQUdfT0REIHwgUlhfRkxBR19TRVJSIHwgUlhfRkxBR19DUkNFUlIgfCBSWF9GTEFHX09GSUZPKQorCitzdHJ1Y3QgcmluZ19pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsKKwlERUNMQVJFX1BDSV9VTk1BUF9BRERSKG1hcHBpbmcpOworfTsKKworI2RlZmluZSBCNDRfTUNBU1RfVEFCTEVfU0laRQkzMgorCisvKiBTVyBjb3B5IG9mIGRldmljZSBzdGF0aXN0aWNzLCBrZXB0IHVwIHRvIGRhdGUgYnkgcGVyaW9kaWMgdGltZXIKKyAqIHdoaWNoIHByb2JlcyBIVyB2YWx1ZXMuICBNdXN0IGhhdmUgc2FtZSByZWxhdGl2ZSBsYXlvdXQgYXMgSFcKKyAqIHJlZ2lzdGVyIGFib3ZlLCBiZWNhdXNlIGI0NF9zdGF0c191cGRhdGUgZGVwZW5kcyB1cG9uIHRoaXMuCisgKi8KK3N0cnVjdCBiNDRfaHdfc3RhdHMgeworCXUzMiB0eF9nb29kX29jdGV0cywgdHhfZ29vZF9wa3RzLCB0eF9vY3RldHM7CisJdTMyIHR4X3BrdHMsIHR4X2Jyb2FkY2FzdF9wa3RzLCB0eF9tdWx0aWNhc3RfcGt0czsKKwl1MzIgdHhfbGVuXzY0LCB0eF9sZW5fNjVfdG9fMTI3LCB0eF9sZW5fMTI4X3RvXzI1NTsKKwl1MzIgdHhfbGVuXzI1Nl90b181MTEsIHR4X2xlbl81MTJfdG9fMTAyMywgdHhfbGVuXzEwMjRfdG9fbWF4OworCXUzMiB0eF9qYWJiZXJfcGt0cywgdHhfb3ZlcnNpemVfcGt0cywgdHhfZnJhZ21lbnRfcGt0czsKKwl1MzIgdHhfdW5kZXJydW5zLCB0eF90b3RhbF9jb2xzLCB0eF9zaW5nbGVfY29sczsKKwl1MzIgdHhfbXVsdGlwbGVfY29scywgdHhfZXhjZXNzaXZlX2NvbHMsIHR4X2xhdGVfY29sczsKKwl1MzIgdHhfZGVmZXJlZCwgdHhfY2Fycmllcl9sb3N0LCB0eF9wYXVzZV9wa3RzOworCXUzMiBfX3BhZDFbOF07CisKKwl1MzIgcnhfZ29vZF9vY3RldHMsIHJ4X2dvb2RfcGt0cywgcnhfb2N0ZXRzOworCXUzMiByeF9wa3RzLCByeF9icm9hZGNhc3RfcGt0cywgcnhfbXVsdGljYXN0X3BrdHM7CisJdTMyIHJ4X2xlbl82NCwgcnhfbGVuXzY1X3RvXzEyNywgcnhfbGVuXzEyOF90b18yNTU7CisJdTMyIHJ4X2xlbl8yNTZfdG9fNTExLCByeF9sZW5fNTEyX3RvXzEwMjMsIHJ4X2xlbl8xMDI0X3RvX21heDsKKwl1MzIgcnhfamFiYmVyX3BrdHMsIHJ4X292ZXJzaXplX3BrdHMsIHJ4X2ZyYWdtZW50X3BrdHM7CisJdTMyIHJ4X21pc3NlZF9wa3RzLCByeF9jcmNfYWxpZ25fZXJycywgcnhfdW5kZXJzaXplOworCXUzMiByeF9jcmNfZXJycywgcnhfYWxpZ25fZXJycywgcnhfc3ltYm9sX2VycnM7CisJdTMyIHJ4X3BhdXNlX3BrdHMsIHJ4X25vbnBhdXNlX3BrdHM7Cit9OworCitzdHJ1Y3QgYjQ0IHsKKwlzcGlubG9ja190CQlsb2NrOworCisJdTMyCQkJaW1hc2ssIGlzdGF0OworCisJc3RydWN0IGRtYV9kZXNjCQkqcnhfcmluZywgKnR4X3Jpbmc7CisKKwl1MzIJCQl0eF9wcm9kLCB0eF9jb25zOworCXUzMgkJCXJ4X3Byb2QsIHJ4X2NvbnM7CisKKwlzdHJ1Y3QgcmluZ19pbmZvCSpyeF9idWZmZXJzOworCXN0cnVjdCByaW5nX2luZm8JKnR4X2J1ZmZlcnM7CisKKwl1MzIJCQlkbWFfb2Zmc2V0OworCXUzMgkJCWZsYWdzOworI2RlZmluZSBCNDRfRkxBR19JTklUX0NPTVBMRVRFCTB4MDAwMDAwMDEKKyNkZWZpbmUgQjQ0X0ZMQUdfQlVHR1lfVFhQVFIJMHgwMDAwMDAwMgorI2RlZmluZSBCNDRfRkxBR19SRU9SREVSX0JVRwkweDAwMDAwMDA0CisjZGVmaW5lIEI0NF9GTEFHX1BBVVNFX0FVVE8JMHgwMDAwODAwMAorI2RlZmluZSBCNDRfRkxBR19GVUxMX0RVUExFWAkweDAwMDEwMDAwCisjZGVmaW5lIEI0NF9GTEFHXzEwMF9CQVNFX1QJMHgwMDAyMDAwMAorI2RlZmluZSBCNDRfRkxBR19UWF9QQVVTRQkweDAwMDQwMDAwCisjZGVmaW5lIEI0NF9GTEFHX1JYX1BBVVNFCTB4MDAwODAwMDAKKyNkZWZpbmUgQjQ0X0ZMQUdfRk9SQ0VfTElOSwkweDAwMTAwMDAwCisjZGVmaW5lIEI0NF9GTEFHX0FEVl8xMEhBTEYJMHgwMTAwMDAwMAorI2RlZmluZSBCNDRfRkxBR19BRFZfMTBGVUxMCTB4MDIwMDAwMDAKKyNkZWZpbmUgQjQ0X0ZMQUdfQURWXzEwMEhBTEYJMHgwNDAwMDAwMAorI2RlZmluZSBCNDRfRkxBR19BRFZfMTAwRlVMTAkweDA4MDAwMDAwCisjZGVmaW5lIEI0NF9GTEFHX0lOVEVSTkFMX1BIWQkweDEwMDAwMDAwCisKKwl1MzIJCQlyeF9vZmZzZXQ7CisKKwl1MzIJCQltc2dfZW5hYmxlOworCisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKwlzdHJ1Y3QgYjQ0X2h3X3N0YXRzCWh3X3N0YXRzOworCisJdm9pZCBfX2lvbWVtCQkqcmVnczsKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKworCWRtYV9hZGRyX3QJCXJ4X3JpbmdfZG1hLCB0eF9yaW5nX2RtYTsKKworCXUzMgkJCXJ4X3BlbmRpbmc7CisJdTMyCQkJdHhfcGVuZGluZzsKKwl1OAkJCXBoeV9hZGRyOworCXU4CQkJY29yZV91bml0OworCisJc3RydWN0IG1paV9pZl9pbmZvCW1paV9pZjsKK307CisKKyNlbmRpZiAvKiBfQjQ0X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JtYWMuYyBiL2RyaXZlcnMvbmV0L2JtYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDJiZTdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYm1hYy5jCkBAIC0wLDAgKzEsMTcwOCBAQAorLyoKKyAqIE5ldHdvcmsgZGV2aWNlIGRyaXZlciBmb3IgdGhlIEJNQUMgZXRoZXJuZXQgY29udHJvbGxlciBvbgorICogQXBwbGUgUG93ZXJtYWNzLiAgQXNzdW1lcyBpdCdzIHVuZGVyIGEgREJETUEgY29udHJvbGxlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggUmFuZHkgR29iYmVsLgorICoKKyAqIE1heSAxOTk5LCBBbCBWaXJvOiBwcm9wZXIgcmVsZWFzZSBvZiAvcHJvYy9uZXQvYm1hYyBlbnRyeSwgc3dpdGNoZWQgdG8KKyAqIGR5bmFtaWMgcHJvY2ZzIGlub2RlLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vZGJkbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAiYm1hYy5oIgorCisjZGVmaW5lIHRydW5jX3BhZ2UoeCkJKCh2b2lkICopKCgodW5zaWduZWQgbG9uZykoeCkpICYgfigodW5zaWduZWQgbG9uZykoUEFHRV9TSVpFIC0gMSkpKSkKKyNkZWZpbmUgcm91bmRfcGFnZSh4KQl0cnVuY19wYWdlKCgodW5zaWduZWQgbG9uZykoeCkpICsgKCh1bnNpZ25lZCBsb25nKShQQUdFX1NJWkUgLSAxKSkpCisKKy8qCisgKiBDUkMgcG9seW5vbWlhbCAtIHVzZWQgaW4gd29ya2luZyBvdXQgbXVsdGljYXN0IGZpbHRlciBiaXRzLgorICovCisjZGVmaW5lIEVORVRfQ1JDUE9MWSAweDA0YzExZGI3CisKKy8qIHN3aXRjaCB0byB1c2UgbXVsdGljYXN0IGNvZGUgbGlmdGVkIGZyb20gc3VuaG1lIGRyaXZlciAqLworI2RlZmluZSBTVU5ITUVfTVVMVElDQVNUCisKKyNkZWZpbmUgTl9SWF9SSU5HCTY0CisjZGVmaW5lIE5fVFhfUklORwkzMgorI2RlZmluZSBNQVhfVFhfQUNUSVZFCTEKKyNkZWZpbmUgRVRIRVJDUkMJNAorI2RlZmluZSBFVEhFUk1JTlBBQ0tFVAk2NAorI2RlZmluZSBFVEhFUk1UVQkxNTAwCisjZGVmaW5lIFJYX0JVRkxFTgkoRVRIRVJNVFUgKyAxNCArIEVUSEVSQ1JDICsgMikKKyNkZWZpbmUgVFhfVElNRU9VVAlIWgkvKiAxIHNlY29uZCAqLworCisvKiBCaXRzIGluIHRyYW5zbWl0IERNQSBzdGF0dXMgKi8KKyNkZWZpbmUgVFhfRE1BX0VSUgkweDgwCisKKyNkZWZpbmUgWFhERUJVRyhhcmdzKQorCitzdHJ1Y3QgYm1hY19kYXRhIHsKKwkvKiB2b2xhdGlsZSBzdHJ1Y3QgYm1hYyAqYm1hYzsgKi8KKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxdWV1ZTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICp0eF9kbWE7CisJaW50IHR4X2RtYV9pbnRyOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnJ4X2RtYTsKKwlpbnQgcnhfZG1hX2ludHI7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqdHhfY21kczsJLyogeG1pdCBkbWEgY29tbWFuZCBsaXN0ICovCisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqcnhfY21kczsJLyogcmVjdiBkbWEgY29tbWFuZCBsaXN0ICovCisJc3RydWN0IG1hY2lvX2RldiAqbWRldjsKKwlpbnQgaXNfYm1hY19wbHVzOworCXN0cnVjdCBza19idWZmICpyeF9idWZzW05fUlhfUklOR107CisJaW50IHJ4X2ZpbGw7CisJaW50IHJ4X2VtcHR5OworCXN0cnVjdCBza19idWZmICp0eF9idWZzW05fVFhfUklOR107CisJaW50IHR4X2ZpbGw7CisJaW50IHR4X2VtcHR5OworCXVuc2lnbmVkIGNoYXIgdHhfZnVsbHVwOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCB0aW1lcl9saXN0IHR4X3RpbWVvdXQ7CisJaW50IHRpbWVvdXRfYWN0aXZlOworCWludCBzbGVlcGluZzsKKwlpbnQgb3BlbmVkOworCXVuc2lnbmVkIHNob3J0IGhhc2hfdXNlX2NvdW50WzY0XTsKKwl1bnNpZ25lZCBzaG9ydCBoYXNoX3RhYmxlX21hc2tbNF07CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworI2lmIDAgLyogTW92ZSB0aGF0IHRvIGV0aHRvb2wgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYm1hY19yZWdfZW50cnkgeworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgc2hvcnQgcmVnX29mZnNldDsKK30gYm1hY19yZWdfZW50cnlfdDsKKworI2RlZmluZSBOX1JFR19FTlRSSUVTIDMxCisKK3N0YXRpYyBibWFjX3JlZ19lbnRyeV90IHJlZ19lbnRyaWVzW05fUkVHX0VOVFJJRVNdID0geworCXsiTUVNQUREIiwgTUVNQUREfSwKKwl7Ik1FTURBVEFISSIsIE1FTURBVEFISX0sCisJeyJNRU1EQVRBTE8iLCBNRU1EQVRBTE99LAorCXsiVFhQTlRSIiwgVFhQTlRSfSwKKwl7IlJYUE5UUiIsIFJYUE5UUn0sCisJeyJJUEcxIiwgSVBHMX0sCisJeyJJUEcyIiwgSVBHMn0sCisJeyJBTElNSVQiLCBBTElNSVR9LAorCXsiU0xPVCIsIFNMT1R9LAorCXsiUEFMRU4iLCBQQUxFTn0sCisJeyJQQVBBVCIsIFBBUEFUfSwKKwl7IlRYU0ZEIiwgVFhTRkR9LAorCXsiSkFNIiwgSkFNfSwKKwl7IlRYQ0ZHIiwgVFhDRkd9LAorCXsiVFhNQVgiLCBUWE1BWH0sCisJeyJUWE1JTiIsIFRYTUlOfSwKKwl7IlBBUkVHIiwgUEFSRUd9LAorCXsiRENOVCIsIERDTlR9LAorCXsiTkNDTlQiLCBOQ0NOVH0sCisJeyJOVENOVCIsIE5UQ05UfSwKKwl7IkVYQ05UIiwgRVhDTlR9LAorCXsiTFRDTlQiLCBMVENOVH0sCisJeyJUWFNNIiwgVFhTTX0sCisJeyJSWENGRyIsIFJYQ0ZHfSwKKwl7IlJYTUFYIiwgUlhNQVh9LAorCXsiUlhNSU4iLCBSWE1JTn0sCisJeyJGUkNOVCIsIEZSQ05UfSwKKwl7IkFFQ05UIiwgQUVDTlR9LAorCXsiRkVDTlQiLCBGRUNOVH0sCisJeyJSWFNNIiwgUlhTTX0sCisJeyJSWENWIiwgUlhDVn0KK307CisKKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqYm1hY19lbWVyZ2VuY3lfcnhidWY7CisKKy8qCisgKiBOdW1iZXIgb2YgYnl0ZXMgb2YgcHJpdmF0ZSBkYXRhIHBlciBCTUFDOiBhbGxvdyBlbm91Z2ggZm9yCisgKiB0aGUgcnggYW5kIHR4IGRtYSBjb21tYW5kcyBwbHVzIGEgYnJhbmNoIGRtYSBjb21tYW5kIGVhY2gsCisgKiBhbmQgYW5vdGhlciAxNiBieXRlcyB0byBhbGxvdyB1cyB0byBhbGlnbiB0aGUgZG1hIGNvbW1hbmQKKyAqIGJ1ZmZlcnMgb24gYSAxNiBieXRlIGJvdW5kYXJ5LgorICovCisjZGVmaW5lIFBSSVZfQllURVMJKHNpemVvZihzdHJ1Y3QgYm1hY19kYXRhKSBcCisJKyAoTl9SWF9SSU5HICsgTl9UWF9SSU5HICsgNCkgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCkgXAorCSsgc2l6ZW9mKHN0cnVjdCBza19idWZmX2hlYWQpKQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBiaXRyZXYodW5zaWduZWQgY2hhciBiKTsKK3N0YXRpYyBpbnQgYm1hY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBibWFjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBibWFjX3RyYW5zbWl0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYm1hY19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGJtYWNfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGJtYWNfcmVzZXRfYW5kX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGJtYWNfc3RhcnRfY2hpcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGJtYWNfaW5pdF9jaGlwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYm1hY19pbml0X3JlZ2lzdGVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGJtYWNfZW5hYmxlX2FuZF9yZXNldF9jaGlwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBibWFjX3NldF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpOworc3RhdGljIGlycXJldHVybl90IGJtYWNfbWlzY19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGlycXJldHVybl90IGJtYWNfdHhkbWFfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBibWFjX3J4ZG1hX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBibWFjX3NldF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYm1hY190eF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgaW50IGJtYWNfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYm1hY19zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworI2RlZmluZQlEQkRNQV9TRVQoeCkJKCAoKHgpIHwgKHgpIDw8IDE2KSApCisjZGVmaW5lCURCRE1BX0NMRUFSKHgpCSggKHgpIDw8IDE2KQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RiZG1hX3N0MzIodm9sYXRpbGUgX191MzIgX19pb21lbSAqYSwgdW5zaWduZWQgbG9uZyB4KQoreworCV9fYXNtX18gdm9sYXRpbGUoICJzdHdicnggJTAsMCwlMSIgOiA6ICJyIiAoeCksICJyIiAoYSkgOiAibWVtb3J5Iik7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK2RiZG1hX2xkMzIodm9sYXRpbGUgX191MzIgX19pb21lbSAqYSkKK3sKKwlfX3UzMiBzd2FwOworCV9fYXNtX18gdm9sYXRpbGUgKCJsd2JyeCAlMCwwLCUxIiA6ICAiPXIiIChzd2FwKSA6ICJyIiAoYSkpOworCXJldHVybiBzd2FwOworfQorCitzdGF0aWMgdm9pZAorZGJkbWFfY29udGludWUodm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZG1hcCkKK3sKKwlkYmRtYV9zdDMyKCZkbWFwLT5jb250cm9sLAorCQkgICBEQkRNQV9TRVQoUlVOfFdBS0UpIHwgREJETUFfQ0xFQVIoUEFVU0V8REVBRCkpOworCWVpZWlvKCk7Cit9CisKK3N0YXRpYyB2b2lkCitkYmRtYV9yZXNldCh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpkbWFwKQoreworCWRiZG1hX3N0MzIoJmRtYXAtPmNvbnRyb2wsCisJCSAgIERCRE1BX0NMRUFSKEFDVElWRXxERUFEfFdBS0V8RkxVU0h8UEFVU0V8UlVOKSk7CisJZWllaW8oKTsKKwl3aGlsZSAoZGJkbWFfbGQzMigmZG1hcC0+c3RhdHVzKSAmIFJVTikKKwkJZWllaW8oKTsKK30KKworc3RhdGljIHZvaWQKK2RiZG1hX3NldGNtZCh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcCwKKwkgICAgIHVuc2lnbmVkIHNob3J0IGNtZCwgdW5zaWduZWQgY291bnQsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkgICAgIHVuc2lnbmVkIGxvbmcgY21kX2RlcCkKK3sKKwlvdXRfbGUxNigmY3AtPmNvbW1hbmQsIGNtZCk7CisJb3V0X2xlMTYoJmNwLT5yZXFfY291bnQsIGNvdW50KTsKKwlvdXRfbGUzMigmY3AtPnBoeV9hZGRyLCBhZGRyKTsKKwlvdXRfbGUzMigmY3AtPmNtZF9kZXAsIGNtZF9kZXApOworCW91dF9sZTE2KCZjcC0+eGZlcl9zdGF0dXMsIDApOworCW91dF9sZTE2KCZjcC0+cmVzX2NvdW50LCAwKTsKK30KKworc3RhdGljIGlubGluZQordm9pZCBibXdyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcmVnX29mZnNldCwgdW5zaWduZWQgZGF0YSApCit7CisJb3V0X2xlMTYoKHZvaWQgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyICsgcmVnX29mZnNldCwgZGF0YSk7Cit9CisKKworc3RhdGljIGlubGluZQordm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgYm1yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcmVnX29mZnNldCApCit7CisJcmV0dXJuIGluX2xlMTYoKHZvaWQgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyICsgcmVnX29mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkCitibWFjX2VuYWJsZV9hbmRfcmVzZXRfY2hpcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpyZCA9IGJwLT5yeF9kbWE7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqdGQgPSBicC0+dHhfZG1hOworCisJaWYgKHJkKQorCQlkYmRtYV9yZXNldChyZCk7CisJaWYgKHRkKQorCQlkYmRtYV9yZXNldCh0ZCk7CisKKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9CTUFDX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUoYnAtPm1kZXYpLCAwLCAxKTsKK30KKworI2RlZmluZSBNSUZERUxBWQl1ZGVsYXkoMTApCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2JtYWNfbWlmX3JlYWRiaXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuYikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKworCXdoaWxlICgtLW5iID49IDApIHsKKwkJYm13cml0ZShkZXYsIE1JRkNTUiwgMCk7CisJCU1JRkRFTEFZOworCQlpZiAoYm1yZWFkKGRldiwgTUlGQ1NSKSAmIDgpCisJCQl2YWwgfD0gMSA8PCBuYjsKKwkJYm13cml0ZShkZXYsIE1JRkNTUiwgMSk7CisJCU1JRkRFTEFZOworCX0KKwlibXdyaXRlKGRldiwgTUlGQ1NSLCAwKTsKKwlNSUZERUxBWTsKKwlibXdyaXRlKGRldiwgTUlGQ1NSLCAxKTsKKwlNSUZERUxBWTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZAorYm1hY19taWZfd3JpdGViaXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB2YWwsIGludCBuYikKK3sKKwlpbnQgYjsKKworCXdoaWxlICgtLW5iID49IDApIHsKKwkJYiA9ICh2YWwgJiAoMSA8PCBuYikpPyA2OiA0OworCQlibXdyaXRlKGRldiwgTUlGQ1NSLCBiKTsKKwkJTUlGREVMQVk7CisJCWJtd3JpdGUoZGV2LCBNSUZDU1IsIGJ8MSk7CisJCU1JRkRFTEFZOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGludAorYm1hY19taWZfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJYm13cml0ZShkZXYsIE1JRkNTUiwgNCk7CisJTUlGREVMQVk7CisJYm1hY19taWZfd3JpdGViaXRzKGRldiwgfjBVLCAzMik7CisJYm1hY19taWZfd3JpdGViaXRzKGRldiwgNiwgNCk7CisJYm1hY19taWZfd3JpdGViaXRzKGRldiwgYWRkciwgMTApOworCWJtd3JpdGUoZGV2LCBNSUZDU1IsIDIpOworCU1JRkRFTEFZOworCWJtd3JpdGUoZGV2LCBNSUZDU1IsIDEpOworCU1JRkRFTEFZOworCXZhbCA9IGJtYWNfbWlmX3JlYWRiaXRzKGRldiwgMTcpOworCWJtd3JpdGUoZGV2LCBNSUZDU1IsIDQpOworCU1JRkRFTEFZOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitibWFjX21pZl93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlibXdyaXRlKGRldiwgTUlGQ1NSLCA0KTsKKwlNSUZERUxBWTsKKwlibWFjX21pZl93cml0ZWJpdHMoZGV2LCB+MFUsIDMyKTsKKwlibWFjX21pZl93cml0ZWJpdHMoZGV2LCA1LCA0KTsKKwlibWFjX21pZl93cml0ZWJpdHMoZGV2LCBhZGRyLCAxMCk7CisJYm1hY19taWZfd3JpdGViaXRzKGRldiwgMiwgMik7CisJYm1hY19taWZfd3JpdGViaXRzKGRldiwgdmFsLCAxNik7CisJYm1hY19taWZfd3JpdGViaXRzKGRldiwgMywgMik7Cit9CisKK3N0YXRpYyB2b2lkCitibWFjX2luaXRfcmVnaXN0ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IHJlZ1ZhbHVlOworCXVuc2lnbmVkIHNob3J0ICpwV29yZDE2OworCWludCBpOworCisJLyogWFhERUJVRygoImJtYWM6IGVudGVyIGluaXRfcmVnaXN0ZXJzXG4iKSk7ICovCisKKwlibXdyaXRlKGRldiwgUlhSU1QsIFJ4UmVzZXRWYWx1ZSk7CisJYm13cml0ZShkZXYsIFRYUlNULCBUeFJlc2V0Qml0KTsKKworCWkgPSAxMDA7CisJZG8geworCQktLWk7CisJCXVkZWxheSgxMDAwMCk7CisJCXJlZ1ZhbHVlID0gYm1yZWFkKGRldiwgVFhSU1QpOyAvKiB3YWl0IGZvciByZXNldCB0byBjbGVhci4uYWNrbm93bGVkZ2UgKi8KKwl9IHdoaWxlICgocmVnVmFsdWUgJiBUeFJlc2V0Qml0KSAmJiBpID4gMCk7CisKKwlpZiAoIWJwLT5pc19ibWFjX3BsdXMpIHsKKwkJcmVnVmFsdWUgPSBibXJlYWQoZGV2LCBYQ1ZSSUYpOworCQlyZWdWYWx1ZSB8PSBDbGtCaXQgfCBTZXJpYWxNb2RlIHwgQ09MQWN0aXZlTG93OworCQlibXdyaXRlKGRldiwgWENWUklGLCByZWdWYWx1ZSk7CisJCXVkZWxheSgxMDAwMCk7CisJfQorCisJYm13cml0ZShkZXYsIFJTRUVELCAodW5zaWduZWQgc2hvcnQpMHgxOTY4KTsJCQorCisJcmVnVmFsdWUgPSBibXJlYWQoZGV2LCBYSUZDKTsKKwlyZWdWYWx1ZSB8PSBUeE91dHB1dEVuYWJsZTsKKwlibXdyaXRlKGRldiwgWElGQywgcmVnVmFsdWUpOworCisJYm1yZWFkKGRldiwgUEFSRUcpOworCisJLyogc2V0IGNvbGxpc2lvbiBjb3VudGVycyB0byAwICovCisJYm13cml0ZShkZXYsIE5DQ05ULCAwKTsKKwlibXdyaXRlKGRldiwgTlRDTlQsIDApOworCWJtd3JpdGUoZGV2LCBFWENOVCwgMCk7CisJYm13cml0ZShkZXYsIExUQ05ULCAwKTsKKworCS8qIHNldCByeCBjb3VudGVycyB0byAwICovCisJYm13cml0ZShkZXYsIEZSQ05ULCAwKTsKKwlibXdyaXRlKGRldiwgTEVDTlQsIDApOworCWJtd3JpdGUoZGV2LCBBRUNOVCwgMCk7CisJYm13cml0ZShkZXYsIEZFQ05ULCAwKTsKKwlibXdyaXRlKGRldiwgUlhDViwgMCk7CisKKwkvKiBzZXQgdHggZmlmbyBpbmZvcm1hdGlvbiAqLworCWJtd3JpdGUoZGV2LCBUWFRILCA0KTsJLyogNCBvY3RldHMgYmVmb3JlIHR4IHN0YXJ0cyAqLworCisJYm13cml0ZShkZXYsIFRYRklGT0NTUiwgMCk7CS8qIGZpcnN0IGRpc2FibGUgdHhGSUZPICovCisJYm13cml0ZShkZXYsIFRYRklGT0NTUiwgVHhGSUZPRW5hYmxlICk7CisKKwkvKiBzZXQgcnggZmlmbyBpbmZvcm1hdGlvbiAqLworCWJtd3JpdGUoZGV2LCBSWEZJRk9DU1IsIDApOwkvKiBmaXJzdCBkaXNhYmxlIHJ4RklGTyAqLworCWJtd3JpdGUoZGV2LCBSWEZJRk9DU1IsIFJ4RklGT0VuYWJsZSApOworCisJLy9ibXdyaXRlKGRldiwgVFhDRkcsIFR4TUFDRW5hYmxlKTsJICAgICAgIAkvKiBUeE5ldmVyR2l2ZVVwIG1heWJlIGxhdGVyICovCisJYm1yZWFkKGRldiwgU1RBVFVTKTsJCS8qIHJlYWQgaXQganVzdCB0byBjbGVhciBpdCAqLworCisJLyogemVybyBvdXQgdGhlIGNoaXAgSGFzaCBGaWx0ZXIgcmVnaXN0ZXJzICovCisJZm9yIChpPTA7IGk8NDsgaSsrKSBicC0+aGFzaF90YWJsZV9tYXNrW2ldID0gMDsKKwlibXdyaXRlKGRldiwgQkhBU0gzLCBicC0+aGFzaF90YWJsZV9tYXNrWzBdKTsgCS8qIGJpdHMgMTUgLSAwICovCisJYm13cml0ZShkZXYsIEJIQVNIMiwgYnAtPmhhc2hfdGFibGVfbWFza1sxXSk7IAkvKiBiaXRzIDMxIC0gMTYgKi8KKwlibXdyaXRlKGRldiwgQkhBU0gxLCBicC0+aGFzaF90YWJsZV9tYXNrWzJdKTsgCS8qIGJpdHMgNDcgLSAzMiAqLworCWJtd3JpdGUoZGV2LCBCSEFTSDAsIGJwLT5oYXNoX3RhYmxlX21hc2tbM10pOyAJLyogYml0cyA2MyAtIDQ4ICovCisJCisJcFdvcmQxNiA9ICh1bnNpZ25lZCBzaG9ydCAqKWRldi0+ZGV2X2FkZHI7CisJYm13cml0ZShkZXYsIE1BREQwLCAqcFdvcmQxNisrKTsKKwlibXdyaXRlKGRldiwgTUFERDEsICpwV29yZDE2KyspOworCWJtd3JpdGUoZGV2LCBNQUREMiwgKnBXb3JkMTYpOworCisJYm13cml0ZShkZXYsIFJYQ0ZHLCBSeENSQ05vU3RyaXAgfCBSeEhhc2hGaWx0ZXJFbmFibGUgfCBSeFJlamVjdE93blBhY2tldHMpOworCisJYm13cml0ZShkZXYsIElOVERJU0FCTEUsIEVuYWJsZU5vcm1hbCk7CisKKwlyZXR1cm47Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorYm1hY19kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlibXdyaXRlKGRldiwgSU5URElTQUJMRSwgRGlzYWJsZUFsbCk7Cit9CisKK3N0YXRpYyB2b2lkCitibWFjX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJYm13cml0ZShkZXYsIElOVERJU0FCTEUsIEVuYWJsZU5vcm1hbCk7Cit9CisjZW5kaWYKKworCitzdGF0aWMgdm9pZAorYm1hY19zdGFydF9jaGlwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnJkID0gYnAtPnJ4X2RtYTsKKwl1bnNpZ25lZCBzaG9ydAlvbGRDb25maWc7CisKKwkvKiBlbmFibGUgcnggZG1hIGNoYW5uZWwgKi8KKwlkYmRtYV9jb250aW51ZShyZCk7CisKKwlvbGRDb25maWcgPSBibXJlYWQoZGV2LCBUWENGRyk7CQkKKwlibXdyaXRlKGRldiwgVFhDRkcsIG9sZENvbmZpZyB8IFR4TUFDRW5hYmxlICk7CisKKwkvKiB0dXJuIG9uIHJ4IHBsdXMgYW55IG90aGVyIGJpdHMgYWxyZWFkeSBvbiAocHJvbWlzY3VvdXMgcG9zc2libHkpICovCisJb2xkQ29uZmlnID0gYm1yZWFkKGRldiwgUlhDRkcpOwkJCisJYm13cml0ZShkZXYsIFJYQ0ZHLCBvbGRDb25maWcgfCBSeE1BQ0VuYWJsZSApOworCXVkZWxheSgyMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkCitibWFjX2luaXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IGFkZHI7CisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcHJpbnRrKEtFUk5fREVCVUcgInBoeSByZWdpc3RlcnM6Iik7CisJZm9yIChhZGRyID0gMDsgYWRkciA8IDMyOyArK2FkZHIpIHsKKwkJaWYgKChhZGRyICYgNykgPT0gMCkKKwkJCXByaW50aygiXG4iIEtFUk5fREVCVUcpOworCQlwcmludGsoIiAlLjR4IiwgYm1hY19taWZfcmVhZChkZXYsIGFkZHIpKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCWlmIChicC0+aXNfYm1hY19wbHVzKSB7CisJCXVuc2lnbmVkIGludCBjYXBhYmxlLCBjdHJsOworCisJCWN0cmwgPSBibWFjX21pZl9yZWFkKGRldiwgMCk7CisJCWNhcGFibGUgPSAoKGJtYWNfbWlmX3JlYWQoZGV2LCAxKSAmIDB4ZjgwMCkgPj4gNikgfCAxOworCQlpZiAoYm1hY19taWZfcmVhZChkZXYsIDQpICE9IGNhcGFibGUKKwkJICAgIHx8IChjdHJsICYgMHgxMDAwKSA9PSAwKSB7CisJCQlibWFjX21pZl93cml0ZShkZXYsIDQsIGNhcGFibGUpOworCQkJYm1hY19taWZfd3JpdGUoZGV2LCAwLCAweDEyMDApOworCQl9IGVsc2UKKwkJCWJtYWNfbWlmX3dyaXRlKGRldiwgMCwgMHgxMDAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJtYWNfaW5pdF9jaGlwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJYm1hY19pbml0X3BoeShkZXYpOworCWJtYWNfaW5pdF9yZWdpc3RlcnMoZGV2KTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBibWFjX3N1c3BlbmQoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgdTMyIHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgPSBtYWNpb19nZXRfZHJ2ZGF0YShtZGV2KTsJCisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgY29uZmlnOworCWludCBpOworCQorCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkvKiBwcm9sbHkgc2hvdWxkIHdhaXQgZm9yIGRtYSB0byBmaW5pc2ggJiB0dXJuIG9mZiB0aGUgY2hpcCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCWlmIChicC0+dGltZW91dF9hY3RpdmUpIHsKKwkJZGVsX3RpbWVyKCZicC0+dHhfdGltZW91dCk7CisJCWJwLT50aW1lb3V0X2FjdGl2ZSA9IDA7CisJfQorCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlkaXNhYmxlX2lycShicC0+dHhfZG1hX2ludHIpOworCWRpc2FibGVfaXJxKGJwLT5yeF9kbWFfaW50cik7CisJYnAtPnNsZWVwaW5nID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCWlmIChicC0+b3BlbmVkKSB7CisJCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnJkID0gYnAtPnJ4X2RtYTsKKwkJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqdGQgPSBicC0+dHhfZG1hOworCQkJCisJCWNvbmZpZyA9IGJtcmVhZChkZXYsIFJYQ0ZHKTsKKwkJYm13cml0ZShkZXYsIFJYQ0ZHLCAoY29uZmlnICYgflJ4TUFDRW5hYmxlKSk7CisJCWNvbmZpZyA9IGJtcmVhZChkZXYsIFRYQ0ZHKTsKKyAgICAgICAJCWJtd3JpdGUoZGV2LCBUWENGRywgKGNvbmZpZyAmIH5UeE1BQ0VuYWJsZSkpOworCQlibXdyaXRlKGRldiwgSU5URElTQUJMRSwgRGlzYWJsZUFsbCk7IC8qIGRpc2FibGUgYWxsIGludHJzICovCisgICAgICAgCQkvKiBkaXNhYmxlIHJ4IGFuZCB0eCBkbWEgKi8KKyAgICAgICAJCXN0X2xlMzIoJnJkLT5jb250cm9sLCBEQkRNQV9DTEVBUihSVU58UEFVU0V8RkxVU0h8V0FLRSkpOwkvKiBjbGVhciBydW4gYml0ICovCisgICAgICAgCQlzdF9sZTMyKCZ0ZC0+Y29udHJvbCwgREJETUFfQ0xFQVIoUlVOfFBBVVNFfEZMVVNIfFdBS0UpKTsJLyogY2xlYXIgcnVuIGJpdCAqLworICAgICAgIAkJLyogZnJlZSBzb21lIHNrYidzICovCisgICAgICAgCQlmb3IgKGk9MDsgaTxOX1JYX1JJTkc7IGkrKykgeworICAgICAgIAkJCWlmIChicC0+cnhfYnVmc1tpXSAhPSBOVUxMKSB7CisgICAgICAgCQkJCWRldl9rZnJlZV9za2IoYnAtPnJ4X2J1ZnNbaV0pOworICAgICAgIAkJCQlicC0+cnhfYnVmc1tpXSA9IE5VTEw7CisgICAgICAgCQkJfQorICAgICAgIAkJfQorICAgICAgIAkJZm9yIChpID0gMDsgaTxOX1RYX1JJTkc7IGkrKykgeworCQkJaWYgKGJwLT50eF9idWZzW2ldICE9IE5VTEwpIHsKKwkJICAgICAgIAkJZGV2X2tmcmVlX3NrYihicC0+dHhfYnVmc1tpXSk7CisJICAgICAgIAkJCWJwLT50eF9idWZzW2ldID0gTlVMTDsKKwkJICAgICAgIAl9CisJCX0KKwl9CisgICAgICAgCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX0JNQUNfRU5BQkxFLCBtYWNpb19nZXRfb2Zfbm9kZShicC0+bWRldiksIDAsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJtYWNfcmVzdW1lKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UqIGRldiA9IG1hY2lvX2dldF9kcnZkYXRhKG1kZXYpOwkKKwlzdHJ1Y3QgYm1hY19kYXRhICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBzZWUgaWYgdGhpcyBpcyBlbm91Z2ggKi8KKwlpZiAoYnAtPm9wZW5lZCkKKwkJYm1hY19yZXNldF9hbmRfZW5hYmxlKGRldik7CisKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKKyAgICAgICAJZW5hYmxlX2lycShicC0+dHhfZG1hX2ludHIpOworICAgICAgIAllbmFibGVfaXJxKGJwLT5yeF9kbWFfaW50cik7CisgICAgICAgCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgaW50IGJtYWNfc2V0X2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3QgYm1hY19kYXRhICpicCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgY2hhciAqcCA9IGFkZHI7CisJdW5zaWduZWQgc2hvcnQgKnBXb3JkMTY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCVhYREVCVUcoKCJibWFjOiBlbnRlciBzZXRfYWRkcmVzc1xuIikpOworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IDY7ICsraSkgeworCQlkZXYtPmRldl9hZGRyW2ldID0gcFtpXTsKKwl9CisJLyogbG9hZCB1cCB0aGUgaGFyZHdhcmUgYWRkcmVzcyAqLworCXBXb3JkMTYgID0gKHVuc2lnbmVkIHNob3J0ICopZGV2LT5kZXZfYWRkcjsKKwlibXdyaXRlKGRldiwgTUFERDAsICpwV29yZDE2KyspOworCWJtd3JpdGUoZGV2LCBNQUREMSwgKnBXb3JkMTYrKyk7CisJYm13cml0ZShkZXYsIE1BREQyLCAqcFdvcmQxNik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCVhYREVCVUcoKCJibWFjOiBleGl0IHNldF9hZGRyZXNzXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibWFjX3NldF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoYnAtPnRpbWVvdXRfYWN0aXZlKQorCQlkZWxfdGltZXIoJmJwLT50eF90aW1lb3V0KTsKKwlicC0+dHhfdGltZW91dC5leHBpcmVzID0gamlmZmllcyArIFRYX1RJTUVPVVQ7CisJYnAtPnR4X3RpbWVvdXQuZnVuY3Rpb24gPSBibWFjX3R4X3RpbWVvdXQ7CisJYnAtPnR4X3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJYWRkX3RpbWVyKCZicC0+dHhfdGltZW91dCk7CisJYnAtPnRpbWVvdXRfYWN0aXZlID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAorYm1hY19jb25zdHJ1Y3RfeG10KHN0cnVjdCBza19idWZmICpza2IsIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmNwKQoreworCXZvaWQgKnZhZGRyOworCXVuc2lnbmVkIGxvbmcgYmFkZHI7CisJdW5zaWduZWQgbG9uZyBsZW47CisKKwlsZW4gPSBza2ItPmxlbjsKKwl2YWRkciA9IHNrYi0+ZGF0YTsKKwliYWRkciA9IHZpcnRfdG9fYnVzKHZhZGRyKTsKKworCWRiZG1hX3NldGNtZChjcCwgKE9VVFBVVF9MQVNUIHwgSU5UUl9BTFdBWVMgfCBXQUlUX0lGQ0xSKSwgbGVuLCBiYWRkciwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitibWFjX2NvbnN0cnVjdF9yeGJ1ZmYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY3ApCit7CisJdW5zaWduZWQgY2hhciAqYWRkciA9IHNrYj8gc2tiLT5kYXRhOiBibWFjX2VtZXJnZW5jeV9yeGJ1ZjsKKworCWRiZG1hX3NldGNtZChjcCwgKElOUFVUX0xBU1QgfCBJTlRSX0FMV0FZUyksIFJYX0JVRkxFTiwKKwkJICAgICB2aXJ0X3RvX2J1cyhhZGRyKSwgMCk7Cit9CisKKy8qIEJpdC1yZXZlcnNlIG9uZSBieXRlIG9mIGFuIGV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MuICovCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYml0cmV2KHVuc2lnbmVkIGNoYXIgYikKK3sKKwlpbnQgZCA9IDAsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgKytpLCBiID4+PSAxKQorCQlkID0gKGQgPDwgMSkgfCAoYiAmIDEpOworCXJldHVybiBkOworfQorCisKK3N0YXRpYyB2b2lkCitibWFjX2luaXRfdHhfcmluZyhzdHJ1Y3QgYm1hY19kYXRhICpicCkKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICp0ZCA9IGJwLT50eF9kbWE7CisKKwltZW1zZXQoKGNoYXIgKilicC0+dHhfY21kcywgMCwgKE5fVFhfUklORysxKSAqIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSk7CisKKwlicC0+dHhfZW1wdHkgPSAwOworCWJwLT50eF9maWxsID0gMDsKKwlicC0+dHhfZnVsbHVwID0gMDsKKworCS8qIHB1dCBhIGJyYW5jaCBhdCB0aGUgZW5kIG9mIHRoZSB0eCBjb21tYW5kIGxpc3QgKi8KKwlkYmRtYV9zZXRjbWQoJmJwLT50eF9jbWRzW05fVFhfUklOR10sCisJCSAgICAgKERCRE1BX05PUCB8IEJSX0FMV0FZUyksIDAsIDAsIHZpcnRfdG9fYnVzKGJwLT50eF9jbWRzKSk7CisKKwkvKiByZXNldCB0eCBkbWEgKi8KKwlkYmRtYV9yZXNldCh0ZCk7CisJb3V0X2xlMzIoJnRkLT53YWl0X3NlbCwgMHgwMDIwMDAyMCk7CisJb3V0X2xlMzIoJnRkLT5jbWRwdHIsIHZpcnRfdG9fYnVzKGJwLT50eF9jbWRzKSk7Cit9CisKK3N0YXRpYyBpbnQKK2JtYWNfaW5pdF9yeF9yaW5nKHN0cnVjdCBibWFjX2RhdGEgKmJwKQoreworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnJkID0gYnAtPnJ4X2RtYTsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyogaW5pdGlhbGl6ZSBsaXN0IG9mIHNrX2J1ZmZzIGZvciByZWNlaXZpbmcgYW5kIHNldCB1cCByZWN2IGRtYSAqLworCW1lbXNldCgoY2hhciAqKWJwLT5yeF9jbWRzLCAwLAorCSAgICAgICAoTl9SWF9SSU5HICsgMSkgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCkpOworCWZvciAoaSA9IDA7IGkgPCBOX1JYX1JJTkc7IGkrKykgeworCQlpZiAoKHNrYiA9IGJwLT5yeF9idWZzW2ldKSA9PSBOVUxMKSB7CisJCQlicC0+cnhfYnVmc1tpXSA9IHNrYiA9IGRldl9hbGxvY19za2IoUlhfQlVGTEVOKzIpOworCQkJaWYgKHNrYiAhPSBOVUxMKQorCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCX0KKwkJYm1hY19jb25zdHJ1Y3RfcnhidWZmKHNrYiwgJmJwLT5yeF9jbWRzW2ldKTsKKwl9CisKKwlicC0+cnhfZW1wdHkgPSAwOworCWJwLT5yeF9maWxsID0gaTsKKworCS8qIFB1dCBhIGJyYW5jaCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlY2VpdmUgY29tbWFuZCBsaXN0ICovCisJZGJkbWFfc2V0Y21kKCZicC0+cnhfY21kc1tOX1JYX1JJTkddLAorCQkgICAgIChEQkRNQV9OT1AgfCBCUl9BTFdBWVMpLCAwLCAwLCB2aXJ0X3RvX2J1cyhicC0+cnhfY21kcykpOworCisJLyogc3RhcnQgcnggZG1hICovCisJZGJkbWFfcmVzZXQocmQpOworCW91dF9sZTMyKCZyZC0+Y21kcHRyLCB2aXJ0X3RvX2J1cyhicC0+cnhfY21kcykpOworCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBibWFjX3RyYW5zbWl0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICp0ZCA9IGJwLT50eF9kbWE7CisJaW50IGk7CisKKwkvKiBzZWUgaWYgdGhlcmUncyBhIGZyZWUgc2xvdCBpbiB0aGUgdHggcmluZyAqLworCS8qIFhYREVCVUcoKCJibWFjX3htaXRfc3RhcnQ6IGVtcHR5PSVkIGZpbGw9JWRcbiIsICovCisJLyogCSAgICAgYnAtPnR4X2VtcHR5LCBicC0+dHhfZmlsbCkpOyAqLworCWkgPSBicC0+dHhfZmlsbCArIDE7CisJaWYgKGkgPj0gTl9UWF9SSU5HKQorCQlpID0gMDsKKwlpZiAoaSA9PSBicC0+dHhfZW1wdHkpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlicC0+dHhfZnVsbHVwID0gMTsKKwkJWFhERUJVRygoImJtYWNfdHJhbnNtaXRfcGFja2V0OiB0eCByaW5nIGZ1bGxcbiIpKTsKKwkJcmV0dXJuIC0xOwkJLyogY2FuJ3QgdGFrZSBpdCBhdCB0aGUgbW9tZW50ICovCisJfQorCisJZGJkbWFfc2V0Y21kKCZicC0+dHhfY21kc1tpXSwgREJETUFfU1RPUCwgMCwgMCwgMCk7CisKKwlibWFjX2NvbnN0cnVjdF94bXQoc2tiLCAmYnAtPnR4X2NtZHNbYnAtPnR4X2ZpbGxdKTsKKworCWJwLT50eF9idWZzW2JwLT50eF9maWxsXSA9IHNrYjsKKwlicC0+dHhfZmlsbCA9IGk7CisKKwlicC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwlkYmRtYV9jb250aW51ZSh0ZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByeGludGNvdW50OworCitzdGF0aWMgaXJxcmV0dXJuX3QgYm1hY19yeGRtYV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnJkID0gYnAtPnJ4X2RtYTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcDsKKwlpbnQgaSwgbmIsIHN0YXQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgcmVzaWR1YWw7CisJaW50IGxhc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCsrcnhpbnRjb3VudCA8IDEwKSB7CisJCVhYREVCVUcoKCJibWFjX3J4ZG1hX2ludHJcbiIpKTsKKwl9CisKKwlsYXN0ID0gLTE7CisJaSA9IGJwLT5yeF9lbXB0eTsKKworCXdoaWxlICgxKSB7CisJCWNwID0gJmJwLT5yeF9jbWRzW2ldOworCQlzdGF0ID0gbGRfbGUxNigmY3AtPnhmZXJfc3RhdHVzKTsKKwkJcmVzaWR1YWwgPSBsZF9sZTE2KCZjcC0+cmVzX2NvdW50KTsKKwkJaWYgKChzdGF0ICYgQUNUSVZFKSA9PSAwKQorCQkJYnJlYWs7CisJCW5iID0gUlhfQlVGTEVOIC0gcmVzaWR1YWwgLSAyOworCQlpZiAobmIgPCAoRVRIRVJNSU5QQUNLRVQgLSBFVEhFUkNSQykpIHsKKwkJCXNrYiA9IE5VTEw7CisJCQlicC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJYnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJc2tiID0gYnAtPnJ4X2J1ZnNbaV07CisJCQlicC0+cnhfYnVmc1tpXSA9IE5VTEw7CisJCX0KKwkJaWYgKHNrYiAhPSBOVUxMKSB7CisJCQluYiAtPSBFVEhFUkNSQzsKKwkJCXNrYl9wdXQoc2tiLCBuYik7CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCSsrYnAtPnN0YXRzLnJ4X3BhY2tldHM7CisJCQlicC0+c3RhdHMucnhfYnl0ZXMgKz0gbmI7CisJCX0gZWxzZSB7CisJCQkrK2JwLT5zdGF0cy5yeF9kcm9wcGVkOworCQl9CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCWlmICgoc2tiID0gYnAtPnJ4X2J1ZnNbaV0pID09IE5VTEwpIHsKKwkJCWJwLT5yeF9idWZzW2ldID0gc2tiID0gZGV2X2FsbG9jX3NrYihSWF9CVUZMRU4rMik7CisJCQlpZiAoc2tiICE9IE5VTEwpCisJCQkJc2tiX3Jlc2VydmUoYnAtPnJ4X2J1ZnNbaV0sIDIpOworCQl9CisJCWJtYWNfY29uc3RydWN0X3J4YnVmZihza2IsICZicC0+cnhfY21kc1tpXSk7CisJCXN0X2xlMTYoJmNwLT5yZXNfY291bnQsIDApOworCQlzdF9sZTE2KCZjcC0+eGZlcl9zdGF0dXMsIDApOworCQlsYXN0ID0gaTsKKwkJaWYgKCsraSA+PSBOX1JYX1JJTkcpIGkgPSAwOworCX0KKworCWlmIChsYXN0ICE9IC0xKSB7CisJCWJwLT5yeF9maWxsID0gbGFzdDsKKwkJYnAtPnJ4X2VtcHR5ID0gaTsKKwl9CisKKwlkYmRtYV9jb250aW51ZShyZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChyeGludGNvdW50IDwgMTApIHsKKwkJWFhERUJVRygoImJtYWNfcnhkbWFfaW50ciBkb25lXG4iKSk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB0eGludGNvdW50OworCitzdGF0aWMgaXJxcmV0dXJuX3QgYm1hY190eGRtYV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmNwOworCWludCBzdGF0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKworCWlmICh0eGludGNvdW50KysgPCAxMCkgeworCQlYWERFQlVHKCgiYm1hY190eGRtYV9pbnRyXG4iKSk7CisJfQorCisJLyogICAgIGRlbF90aW1lcigmYnAtPnR4X3RpbWVvdXQpOyAqLworCS8qICAgICBicC0+dGltZW91dF9hY3RpdmUgPSAwOyAqLworCisJd2hpbGUgKDEpIHsKKwkJY3AgPSAmYnAtPnR4X2NtZHNbYnAtPnR4X2VtcHR5XTsKKwkJc3RhdCA9IGxkX2xlMTYoJmNwLT54ZmVyX3N0YXR1cyk7CisJCWlmICh0eGludGNvdW50IDwgMTApIHsKKwkJCVhYREVCVUcoKCJibWFjX3R4ZG1hX3hmZXJfc3RhdD0lIzB4XG4iLCBzdGF0KSk7CisJCX0KKwkJaWYgKCEoc3RhdCAmIEFDVElWRSkpIHsKKwkJCS8qCisJCQkgKiBzdGF0dXMgZmllbGQgbWlnaHQgbm90IGhhdmUgYmVlbiBmaWxsZWQgYnkgREJETUEKKwkJCSAqLworCQkJaWYgKGNwID09IGJ1c190b192aXJ0KGluX2xlMzIoJmJwLT50eF9kbWEtPmNtZHB0cikpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGJwLT50eF9idWZzW2JwLT50eF9lbXB0eV0pIHsKKwkJCSsrYnAtPnN0YXRzLnR4X3BhY2tldHM7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShicC0+dHhfYnVmc1ticC0+dHhfZW1wdHldKTsKKwkJfQorCQlicC0+dHhfYnVmc1ticC0+dHhfZW1wdHldID0gTlVMTDsKKwkJYnAtPnR4X2Z1bGx1cCA9IDA7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJaWYgKCsrYnAtPnR4X2VtcHR5ID49IE5fVFhfUklORykKKwkJCWJwLT50eF9lbXB0eSA9IDA7CisJCWlmIChicC0+dHhfZW1wdHkgPT0gYnAtPnR4X2ZpbGwpCisJCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHR4aW50Y291bnQgPCAxMCkgeworCQlYWERFQlVHKCgiYm1hY190eGRtYV9pbnRyIGRvbmUtPmJtYWNfc3RhcnRcbiIpKTsKKwl9CisKKwlibWFjX3N0YXJ0KGRldik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJtYWNfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYm1hY19kYXRhICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAmcC0+c3RhdHM7Cit9CisKKyNpZm5kZWYgU1VOSE1FX01VTFRJQ0FTVAorLyogUmVhbCBmYXN0IGJpdC1yZXZlcnNhbCBhbGdvcml0aG0sIDYtYml0IHZhbHVlcyAqLworc3RhdGljIGludCByZXZlcnNlNls2NF0gPSB7CisJMHgwLDB4MjAsMHgxMCwweDMwLDB4OCwweDI4LDB4MTgsMHgzOCwKKwkweDQsMHgyNCwweDE0LDB4MzQsMHhjLDB4MmMsMHgxYywweDNjLAorCTB4MiwweDIyLDB4MTIsMHgzMiwweGEsMHgyYSwweDFhLDB4M2EsCisJMHg2LDB4MjYsMHgxNiwweDM2LDB4ZSwweDJlLDB4MWUsMHgzZSwKKwkweDEsMHgyMSwweDExLDB4MzEsMHg5LDB4MjksMHgxOSwweDM5LAorCTB4NSwweDI1LDB4MTUsMHgzNSwweGQsMHgyZCwweDFkLDB4M2QsCisJMHgzLDB4MjMsMHgxMywweDMzLDB4YiwweDJiLDB4MWIsMHgzYiwKKwkweDcsMHgyNywweDE3LDB4MzcsMHhmLDB4MmYsMHgxZiwweDNmCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50CitjcmM0MTYodW5zaWduZWQgaW50IGN1cnZhbCwgdW5zaWduZWQgc2hvcnQgbnh0dmFsKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBjb3VudGVyLCBjdXIgPSBjdXJ2YWwsIG5leHQgPSBueHR2YWw7CisJcmVnaXN0ZXIgaW50IGhpZ2hfY3JjX3NldCwgbG93X2RhdGFfc2V0OworCisJLyogU3dhcCBieXRlcyAqLworCW5leHQgPSAoKG5leHQgJiAweDAwRkYpIDw8IDgpIHwgKG5leHQgPj4gOCk7CisKKwkvKiBDb21wdXRlIGJpdC1ieS1iaXQgKi8KKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMTY7ICsrY291bnRlcikgeworCQkvKiBpcyBoaWdoIENSQyBiaXQgc2V0PyAqLworCQlpZiAoKGN1ciAmIDB4ODAwMDAwMDApID09IDApIGhpZ2hfY3JjX3NldCA9IDA7CisJCWVsc2UgaGlnaF9jcmNfc2V0ID0gMTsKKworCQljdXIgPSBjdXIgPDwgMTsKKwkKKwkJaWYgKChuZXh0ICYgMHgwMDAxKSA9PSAwKSBsb3dfZGF0YV9zZXQgPSAwOworCQllbHNlIGxvd19kYXRhX3NldCA9IDE7CisKKwkJbmV4dCA9IG5leHQgPj4gMTsKKwkKKwkJLyogZG8gdGhlIFhPUiAqLworCQlpZiAoaGlnaF9jcmNfc2V0IF4gbG93X2RhdGFfc2V0KSBjdXIgPSBjdXIgXiBFTkVUX0NSQ1BPTFk7CisJfQorCXJldHVybiBjdXI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2JtYWNfY3JjKHVuc2lnbmVkIHNob3J0ICphZGRyZXNzKQorewkKKwl1bnNpZ25lZCBpbnQgbmV3Y3JjOworCisJWFhERUJVRygoImJtYWNfY3JjOiBhZGRyPSUjMDR4LCAlIzA0eCwgJSMwNHhcbiIsICphZGRyZXNzLCBhZGRyZXNzWzFdLCBhZGRyZXNzWzJdKSk7CisJbmV3Y3JjID0gY3JjNDE2KDB4ZmZmZmZmZmYsICphZGRyZXNzKTsJLyogYWRkcmVzcyBiaXRzIDQ3IC0gMzIgKi8KKwluZXdjcmMgPSBjcmM0MTYobmV3Y3JjLCBhZGRyZXNzWzFdKTsJLyogYWRkcmVzcyBiaXRzIDMxIC0gMTYgKi8KKwluZXdjcmMgPSBjcmM0MTYobmV3Y3JjLCBhZGRyZXNzWzJdKTsJLyogYWRkcmVzcyBiaXRzIDE1IC0gMCAgKi8KKworCXJldHVybihuZXdjcmMpOworfQorCisvKgorICogQWRkIHJlcXVlc3RlZCBtY2FzdCBhZGRyIHRvIEJNYWMncyBoYXNoIHRhYmxlIGZpbHRlci4KKyAqCisgKi8KKworc3RhdGljIHZvaWQKK2JtYWNfYWRkaGFzaChzdHJ1Y3QgYm1hY19kYXRhICpicCwgdW5zaWduZWQgY2hhciAqYWRkcikKK3sJCisJdW5zaWduZWQgaW50CSBjcmM7CisJdW5zaWduZWQgc2hvcnQJIG1hc2s7CisKKwlpZiAoISgqYWRkcikpIHJldHVybjsKKwljcmMgPSBibWFjX2NyYygodW5zaWduZWQgc2hvcnQgKilhZGRyKSAmIDB4M2Y7IC8qIEJpZy1lbmRpYW4gYWxlcnQhICovCisJY3JjID0gcmV2ZXJzZTZbY3JjXTsJLyogSHlwZXJmYXN0IGJpdC1yZXZlcnNpbmcgYWxnb3JpdGhtICovCisJaWYgKGJwLT5oYXNoX3VzZV9jb3VudFtjcmNdKyspIHJldHVybjsgLyogVGhpcyBiaXQgaXMgYWxyZWFkeSBzZXQgKi8KKwltYXNrID0gY3JjICUgMTY7CisJbWFzayA9ICh1bnNpZ25lZCBjaGFyKTEgPDwgbWFzazsKKwlicC0+aGFzaF91c2VfY291bnRbY3JjLzE2XSB8PSBtYXNrOworfQorCitzdGF0aWMgdm9pZAorYm1hY19yZW1vdmVoYXNoKHN0cnVjdCBibWFjX2RhdGEgKmJwLCB1bnNpZ25lZCBjaGFyICphZGRyKQorewkKKwl1bnNpZ25lZCBpbnQgY3JjOworCXVuc2lnbmVkIGNoYXIgbWFzazsKKworCS8qIE5vdywgZGVsZXRlIHRoZSBhZGRyZXNzIGZyb20gdGhlIGZpbHRlciBjb3B5LCBhcyBpbmRpY2F0ZWQgKi8KKwljcmMgPSBibWFjX2NyYygodW5zaWduZWQgc2hvcnQgKilhZGRyKSAmIDB4M2Y7IC8qIEJpZy1lbmRpYW4gYWxlcnQhICovCisJY3JjID0gcmV2ZXJzZTZbY3JjXTsJLyogSHlwZXJmYXN0IGJpdC1yZXZlcnNpbmcgYWxnb3JpdGhtICovCisJaWYgKGJwLT5oYXNoX3VzZV9jb3VudFtjcmNdID09IDApIHJldHVybjsgLyogVGhhdCBiaXQgd2Fzbid0IGluIHVzZSEgKi8KKwlpZiAoLS1icC0+aGFzaF91c2VfY291bnRbY3JjXSkgcmV0dXJuOyAvKiBUaGF0IGJpdCBpcyBzdGlsbCBpbiB1c2UgKi8KKwltYXNrID0gY3JjICUgMTY7CisJbWFzayA9ICgodW5zaWduZWQgY2hhcikxIDw8IG1hc2spIF4gMHhmZmZmOyAvKiBUbyB0dXJuIG9mZiBiaXQgKi8KKwlicC0+aGFzaF90YWJsZV9tYXNrW2NyYy8xNl0gJj0gbWFzazsKK30KKworLyoKKyAqIFN5bmMgdGhlIGFkYXB0ZXIgd2l0aCB0aGUgc29mdHdhcmUgY29weSBvZiB0aGUgbXVsdGljYXN0IG1hc2sKKyAqICAobG9naWNhbCBhZGRyZXNzIGZpbHRlcikuCisgKi8KKworc3RhdGljIHZvaWQKK2JtYWNfcnhfb2ZmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgc2hvcnQgcnhfY2ZnOworCisJcnhfY2ZnID0gYm1yZWFkKGRldiwgUlhDRkcpOworCXJ4X2NmZyAmPSB+UnhNQUNFbmFibGU7CisJYm13cml0ZShkZXYsIFJYQ0ZHLCByeF9jZmcpOworCWRvIHsKKwkJcnhfY2ZnID0gYm1yZWFkKGRldiwgUlhDRkcpOworCX0gIHdoaWxlIChyeF9jZmcgJiBSeE1BQ0VuYWJsZSk7Cit9CisKK3Vuc2lnbmVkIHNob3J0CitibWFjX3J4X29uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBoYXNoX2VuYWJsZSwgaW50IHByb21pc2NfZW5hYmxlKQoreworCXVuc2lnbmVkIHNob3J0IHJ4X2NmZzsKKworCXJ4X2NmZyA9IGJtcmVhZChkZXYsIFJYQ0ZHKTsKKwlyeF9jZmcgfD0gUnhNQUNFbmFibGU7CisJaWYgKGhhc2hfZW5hYmxlKSByeF9jZmcgfD0gUnhIYXNoRmlsdGVyRW5hYmxlOworCWVsc2UgcnhfY2ZnICY9IH5SeEhhc2hGaWx0ZXJFbmFibGU7CisJaWYgKHByb21pc2NfZW5hYmxlKSByeF9jZmcgfD0gUnhQcm9taXNjRW5hYmxlOworCWVsc2UgcnhfY2ZnICY9IH5SeFByb21pc2NFbmFibGU7CisJYm13cml0ZShkZXYsIFJYUlNULCBSeFJlc2V0VmFsdWUpOworCWJtd3JpdGUoZGV2LCBSWEZJRk9DU1IsIDApOwkvKiBmaXJzdCBkaXNhYmxlIHJ4RklGTyAqLworCWJtd3JpdGUoZGV2LCBSWEZJRk9DU1IsIFJ4RklGT0VuYWJsZSApOworCWJtd3JpdGUoZGV2LCBSWENGRywgcnhfY2ZnICk7CisJcmV0dXJuIHJ4X2NmZzsKK30KKworc3RhdGljIHZvaWQKK2JtYWNfdXBkYXRlX2hhc2hfdGFibGVfbWFzayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYm1hY19kYXRhICpicCkKK3sKKwlibXdyaXRlKGRldiwgQkhBU0gzLCBicC0+aGFzaF90YWJsZV9tYXNrWzBdKTsgLyogYml0cyAxNSAtIDAgKi8KKwlibXdyaXRlKGRldiwgQkhBU0gyLCBicC0+aGFzaF90YWJsZV9tYXNrWzFdKTsgLyogYml0cyAzMSAtIDE2ICovCisJYm13cml0ZShkZXYsIEJIQVNIMSwgYnAtPmhhc2hfdGFibGVfbWFza1syXSk7IC8qIGJpdHMgNDcgLSAzMiAqLworCWJtd3JpdGUoZGV2LCBCSEFTSDAsIGJwLT5oYXNoX3RhYmxlX21hc2tbM10pOyAvKiBiaXRzIDYzIC0gNDggKi8KK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCitibWFjX2FkZF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCSAgICAgICBzdHJ1Y3QgYm1hY19kYXRhICpicCwgdW5zaWduZWQgY2hhciAqYWRkcikKK3sKKwkvKiBYWERFQlVHKCgiYm1hYzogZW50ZXIgYm1hY19hZGRfbXVsdGlcbiIpKTsgKi8KKwlibWFjX2FkZGhhc2goYnAsIGFkZHIpOworCWJtYWNfcnhfb2ZmKGRldik7CisJYm1hY191cGRhdGVfaGFzaF90YWJsZV9tYXNrKGRldiwgYnApOworCWJtYWNfcnhfb24oZGV2LCAxLCAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKT8gMSA6IDApOworCS8qIFhYREVCVUcoKCJibWFjOiBleGl0IGJtYWNfYWRkX211bHRpXG4iKSk7ICovCit9CisKK3N0YXRpYyB2b2lkCitibWFjX3JlbW92ZV9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgIHN0cnVjdCBibWFjX2RhdGEgKmJwLCB1bnNpZ25lZCBjaGFyICphZGRyKQoreworCWJtYWNfcmVtb3ZlaGFzaChicCwgYWRkcik7CisJYm1hY19yeF9vZmYoZGV2KTsKKwlibWFjX3VwZGF0ZV9oYXNoX3RhYmxlX21hc2soZGV2LCBicCk7CisJYm1hY19yeF9vbihkZXYsIDEsIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpPyAxIDogMCk7Cit9CisjZW5kaWYKKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgICAgbnVtX2FkZHJzID09IC0xCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKyAgICBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAgICBudW1fYWRkcnMgPiAwCU11bHRpY2FzdCBtb2RlLCByZWNlaXZlIG5vcm1hbCBhbmQgTUMgcGFja2V0cywgYW5kIGRvCisJCQliZXN0LWVmZm9ydCBmaWx0ZXJpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGJtYWNfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgbnVtX2FkZHJzID0gZGV2LT5tY19jb3VudDsKKwl1bnNpZ25lZCBzaG9ydCByeF9jZmc7CisJaW50IGk7CisKKwlpZiAoYnAtPnNsZWVwaW5nKQorCQlyZXR1cm47CisKKwlYWERFQlVHKCgiYm1hYzogZW50ZXIgYm1hY19zZXRfbXVsdGljYXN0LCBuX2FkZHJzPSVkXG4iLCBudW1fYWRkcnMpKTsKKworCWlmKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCAoZGV2LT5tY19jb3VudCA+IDY0KSkgeworCQlmb3IgKGk9MDsgaTw0OyBpKyspIGJwLT5oYXNoX3RhYmxlX21hc2tbaV0gPSAweGZmZmY7CisJCWJtYWNfdXBkYXRlX2hhc2hfdGFibGVfbWFzayhkZXYsIGJwKTsKKwkJcnhfY2ZnID0gYm1hY19yeF9vbihkZXYsIDEsIDApOworCQlYWERFQlVHKCgiYm1hYzogYWxsIG11bHRpLCByeF9jZmc9JSMwOHhcbiIpKTsKKwl9IGVsc2UgaWYgKChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHx8IChudW1fYWRkcnMgPCAwKSkgeworCQlyeF9jZmcgPSBibXJlYWQoZGV2LCBSWENGRyk7CisJCXJ4X2NmZyB8PSBSeFByb21pc2NFbmFibGU7CisJCWJtd3JpdGUoZGV2LCBSWENGRywgcnhfY2ZnKTsKKwkJcnhfY2ZnID0gYm1hY19yeF9vbihkZXYsIDAsIDEpOworCQlYWERFQlVHKCgiYm1hYzogcHJvbWlzYyBtb2RlIGVuYWJsZWQsIHJ4X2NmZz0lIzA4eFxuIiwgcnhfY2ZnKSk7CisJfSBlbHNlIHsKKwkJZm9yIChpPTA7IGk8NDsgaSsrKSBicC0+aGFzaF90YWJsZV9tYXNrW2ldID0gMDsKKwkJZm9yIChpPTA7IGk8NjQ7IGkrKykgYnAtPmhhc2hfdXNlX2NvdW50W2ldID0gMDsKKwkJaWYgKG51bV9hZGRycyA9PSAwKSB7CisJCQlyeF9jZmcgPSBibWFjX3J4X29uKGRldiwgMCwgMCk7CisJCQlYWERFQlVHKCgiYm1hYzogbXVsdGkgZGlzYWJsZWQsIHJ4X2NmZz0lIzA4eFxuIiwgcnhfY2ZnKSk7CisJCX0gZWxzZSB7CisJCQlmb3IgKGRtaT1kZXYtPm1jX2xpc3Q7IGRtaSE9TlVMTDsgZG1pPWRtaS0+bmV4dCkKKwkJCQlibWFjX2FkZGhhc2goYnAsIGRtaS0+ZG1pX2FkZHIpOworCQkJYm1hY191cGRhdGVfaGFzaF90YWJsZV9tYXNrKGRldiwgYnApOworCQkJcnhfY2ZnID0gYm1hY19yeF9vbihkZXYsIDEsIDApOworCQkJWFhERUJVRygoImJtYWM6IG11bHRpIGVuYWJsZWQsIHJ4X2NmZz0lIzA4eFxuIiwgcnhfY2ZnKSk7CisJCX0KKwl9CisJLyogWFhERUJVRygoImJtYWM6IGV4aXQgYm1hY19zZXRfbXVsdGljYXN0XG4iKSk7ICovCit9CisjZWxzZSAvKiBpZmRlZiBTVU5ITUVfTVVMVElDQVNUICovCisKKy8qIFRoZSB2ZXJzaW9uIG9mIHNldF9tdWx0aWNhc3QgYmVsb3cgd2FzIGxpZnRlZCBmcm9tIHN1bmhtZS5jICovCisKK3N0YXRpYyB2b2lkIGJtYWNfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCWNoYXIgKmFkZHJzOworCWludCBpOworCXVuc2lnbmVkIHNob3J0IHJ4X2NmZzsKKwl1MzIgY3JjOworCisJaWYoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8IChkZXYtPm1jX2NvdW50ID4gNjQpKSB7CisJCWJtd3JpdGUoZGV2LCBCSEFTSDAsIDB4ZmZmZik7CisJCWJtd3JpdGUoZGV2LCBCSEFTSDEsIDB4ZmZmZik7CisJCWJtd3JpdGUoZGV2LCBCSEFTSDIsIDB4ZmZmZik7CisJCWJtd3JpdGUoZGV2LCBCSEFTSDMsIDB4ZmZmZik7CisJfSBlbHNlIGlmKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlyeF9jZmcgPSBibXJlYWQoZGV2LCBSWENGRyk7CisJCXJ4X2NmZyB8PSBSeFByb21pc2NFbmFibGU7CisJCWJtd3JpdGUoZGV2LCBSWENGRywgcnhfY2ZnKTsKKwl9IGVsc2UgeworCQl1MTYgaGFzaF90YWJsZVs0XTsKKwkKKwkJcnhfY2ZnID0gYm1yZWFkKGRldiwgUlhDRkcpOworCQlyeF9jZmcgJj0gflJ4UHJvbWlzY0VuYWJsZTsKKwkJYm13cml0ZShkZXYsIFJYQ0ZHLCByeF9jZmcpOworCisJCWZvcihpID0gMDsgaSA8IDQ7IGkrKykgaGFzaF90YWJsZVtpXSA9IDA7CisJCisJCWZvcihpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgeworCQkJYWRkcnMgPSBkbWktPmRtaV9hZGRyOworCQkJZG1pID0gZG1pLT5uZXh0OworCisJCQlpZighKCphZGRycyAmIDEpKQorCQkJCWNvbnRpbnVlOworCisJCQljcmMgPSBldGhlcl9jcmNfbGUoNiwgYWRkcnMpOworCQkJY3JjID4+PSAyNjsKKwkJCWhhc2hfdGFibGVbY3JjID4+IDRdIHw9IDEgPDwgKGNyYyAmIDB4Zik7CisJCX0KKwkJYm13cml0ZShkZXYsIEJIQVNIMCwgaGFzaF90YWJsZVswXSk7CisJCWJtd3JpdGUoZGV2LCBCSEFTSDEsIGhhc2hfdGFibGVbMV0pOworCQlibXdyaXRlKGRldiwgQkhBU0gyLCBoYXNoX3RhYmxlWzJdKTsKKwkJYm13cml0ZShkZXYsIEJIQVNIMywgaGFzaF90YWJsZVszXSk7CisJfQorfQorI2VuZGlmIC8qIFNVTkhNRV9NVUxUSUNBU1QgKi8KKworc3RhdGljIGludCBtaXNjaW50Y291bnQ7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBibWFjX21pc2NfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzID0gYm1yZWFkKGRldiwgU1RBVFVTKTsKKwlpZiAobWlzY2ludGNvdW50KysgPCAxMCkgeworCQlYWERFQlVHKCgiYm1hY19taXNjX2ludHJcbiIpKTsKKwl9CisJLyogWFhERUJVRygoImJtYWNfbWlzY19pbnRyLCBzdGF0dXM9JSMwOHhcbiIsIHN0YXR1cykpOyAqLworCS8qICAgICBibWFjX3R4ZG1hX2ludHJfaW5uZXIoaXJxLCBkZXZfaWQsIHJlZ3MpOyAqLworCS8qICAgaWYgKHN0YXR1cyAmIEZyYW1lUmVjZWl2ZWQpIGJwLT5zdGF0cy5yeF9kcm9wcGVkKys7ICovCisJaWYgKHN0YXR1cyAmIFJ4RXJyb3JNYXNrKSBicC0+c3RhdHMucnhfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFJ4Q1JDQ250RXhwKSBicC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBSeExlbkNudEV4cCkgYnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgUnhPdmVyRmxvdykgYnAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFJ4QWxpZ25DbnRFeHApIGJwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKworCS8qICAgaWYgKHN0YXR1cyAmIEZyYW1lU2VudCkgYnAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsgKi8KKwlpZiAoc3RhdHVzICYgVHhFcnJvck1hc2spIGJwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgVHhVbmRlcnJ1bikgYnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFR4Tm9ybWFsQ29sbEV4cCkgYnAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBQcm9jZWR1cmUgZm9yIHJlYWRpbmcgRUVQUk9NCisgKi8KKyNkZWZpbmUgU1JPTUFkZHJlc3NMZW5ndGgJNQorI2RlZmluZSBEYXRhSW5PbgkJMHgwMDA4CisjZGVmaW5lIERhdGFJbk9mZgkJMHgwMDAwCisjZGVmaW5lIENsawkJCTB4MDAwMgorI2RlZmluZSBDaGlwU2VsZWN0CQkweDAwMDEKKyNkZWZpbmUgU0RJU2hpZnRDb3VudAkJMworI2RlZmluZSBTRDBTaGlmdENvdW50CQkyCisjZGVmaW5lCURlbGF5VmFsdWUJCTEwMDAJLyogbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyAqLworI2RlZmluZSBTUk9NU3RhcnRPZmZzZXQJCTEwCS8qIHRoaXMgaXMgaW4gd29yZHMgKi8KKyNkZWZpbmUgU1JPTVJlYWRDb3VudAkJMwkvKiBudW1iZXIgb2Ygd29yZHMgdG8gcmVhZCBmcm9tIFNST00gKi8KKyNkZWZpbmUgU1JPTUFkZHJlc3NCaXRzCQk2CisjZGVmaW5lIEVuZXRBZGRyZXNzT2Zmc2V0CTIwCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCitibWFjX2Nsb2NrX291dF9iaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgIGRhdGE7CisJdW5zaWduZWQgc2hvcnQgICAgICAgICB2YWw7CisKKwlibXdyaXRlKGRldiwgU1JPTUNTUiwgQ2hpcFNlbGVjdCB8IENsayk7CisJdWRlbGF5KERlbGF5VmFsdWUpOworCisJZGF0YSA9IGJtcmVhZChkZXYsIFNST01DU1IpOworCXVkZWxheShEZWxheVZhbHVlKTsKKwl2YWwgPSAoZGF0YSA+PiBTRDBTaGlmdENvdW50KSAmIDE7CisKKwlibXdyaXRlKGRldiwgU1JPTUNTUiwgQ2hpcFNlbGVjdCk7CisJdWRlbGF5KERlbGF5VmFsdWUpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQKK2JtYWNfY2xvY2tfaW5fYml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgc2hvcnQgZGF0YTsKKworCWlmICh2YWwgIT0gMCAmJiB2YWwgIT0gMSkgcmV0dXJuOworCisJZGF0YSA9ICh2YWwgPDwgU0RJU2hpZnRDb3VudCk7CisJYm13cml0ZShkZXYsIFNST01DU1IsIGRhdGEgfCBDaGlwU2VsZWN0ICApOworCXVkZWxheShEZWxheVZhbHVlKTsKKworCWJtd3JpdGUoZGV2LCBTUk9NQ1NSLCBkYXRhIHwgQ2hpcFNlbGVjdCB8IENsayApOworCXVkZWxheShEZWxheVZhbHVlKTsKKworCWJtd3JpdGUoZGV2LCBTUk9NQ1NSLCBkYXRhIHwgQ2hpcFNlbGVjdCk7CisJdWRlbGF5KERlbGF5VmFsdWUpOworfQorCitzdGF0aWMgdm9pZAorcmVzZXRfYW5kX3NlbGVjdF9zcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogZmlyc3QgcmVzZXQgKi8KKwlibXdyaXRlKGRldiwgU1JPTUNTUiwgMCk7CisJdWRlbGF5KERlbGF5VmFsdWUpOworCisJLyogc2VuZCBpdCB0aGUgcmVhZCBjb21tYW5kICgxMTApICovCisJYm1hY19jbG9ja19pbl9iaXQoZGV2LCAxKTsKKwlibWFjX2Nsb2NrX2luX2JpdChkZXYsIDEpOworCWJtYWNfY2xvY2tfaW5fYml0KGRldiwgMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorcmVhZF9zcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgYWRkcl9sZW4pCit7CisJdW5zaWduZWQgc2hvcnQgZGF0YSwgdmFsOworCWludCBpOworCisJLyogc2VuZCBvdXQgdGhlIGFkZHJlc3Mgd2Ugd2FudCB0byByZWFkIGZyb20gKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWRkcl9sZW47IGkrKykJeworCQl2YWwgPSBhZGRyID4+IChhZGRyX2xlbi1pLTEpOworCQlibWFjX2Nsb2NrX2luX2JpdChkZXYsIHZhbCAmIDEpOworCX0KKworCS8qIE5vdyByZWFkIGluIHRoZSAxNi1iaXQgZGF0YSAqLworCWRhdGEgPSAwOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQl7CisJCXZhbCA9IGJtYWNfY2xvY2tfb3V0X2JpdChkZXYpOworCQlkYXRhIDw8PSAxOworCQlkYXRhIHw9IHZhbDsKKwl9CisJYm13cml0ZShkZXYsIFNST01DU1IsIDApOworCisJcmV0dXJuIGRhdGE7Cit9CisKKy8qCisgKiBJdCBsb29rcyBsaWtlIENvZ2VudCBhbmQgU01DIHVzZSBkaWZmZXJlbnQgbWV0aG9kcyBmb3IgY2FsY3VsYXRpbmcKKyAqIGNoZWNrc3Vtcy4gV2hhdCBhIHBhaW4uLgorICovCisKK3N0YXRpYyBpbnQKK2JtYWNfdmVyaWZ5X2NoZWNrc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgc2hvcnQgZGF0YSwgc3RvcmVkQ1M7CisKKwlyZXNldF9hbmRfc2VsZWN0X3Nyb20oZGV2KTsKKwlkYXRhID0gcmVhZF9zcm9tKGRldiwgMywgU1JPTUFkZHJlc3NCaXRzKTsKKwlzdG9yZWRDUyA9ICgoZGF0YSA+PiA4KSAmIDB4MGZmKSB8ICgoZGF0YSA8PCA4KSAmIDB4ZmYwMCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAorYm1hY19nZXRfc3RhdGlvbl9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKmVhKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0IGRhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQkKKwkJeworCQkJcmVzZXRfYW5kX3NlbGVjdF9zcm9tKGRldik7CisJCQlkYXRhID0gcmVhZF9zcm9tKGRldiwgaSArIEVuZXRBZGRyZXNzT2Zmc2V0LzIsIFNST01BZGRyZXNzQml0cyk7CisJCQllYVsyKmldICAgPSBiaXRyZXYoZGF0YSAmIDB4MGZmKTsKKwkJCWVhWzIqaSsxXSA9IGJpdHJldigoZGF0YSA+PiA4KSAmIDB4MGZmKTsKKwkJfQorfQorCitzdGF0aWMgdm9pZCBibWFjX3Jlc2V0X2FuZF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYm1hY19kYXRhICpicCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlibWFjX2VuYWJsZV9hbmRfcmVzZXRfY2hpcChkZXYpOworCWJtYWNfaW5pdF90eF9yaW5nKGJwKTsKKwlibWFjX2luaXRfcnhfcmluZyhicCk7CisJYm1hY19pbml0X2NoaXAoZGV2KTsKKwlibWFjX3N0YXJ0X2NoaXAoZGV2KTsKKwlibXdyaXRlKGRldiwgSU5URElTQUJMRSwgRW5hYmxlTm9ybWFsKTsKKwlicC0+c2xlZXBpbmcgPSAwOworCQorCS8qCisJICogSXQgc2VlbXMgdGhhdCB0aGUgYm1hYyBjYW4ndCByZWNlaXZlIHVudGlsIGl0J3MgdHJhbnNtaXR0ZWQKKwkgKiBhIHBhY2tldC4gIFNvIHdlIGdpdmUgaXQgYSBkdW1teSBwYWNrZXQgdG8gdHJhbnNtaXQuCisJICovCisJc2tiID0gZGV2X2FsbG9jX3NrYihFVEhFUk1JTlBBQ0tFVCk7CisJaWYgKHNrYiAhPSBOVUxMKSB7CisJCWRhdGEgPSBza2JfcHV0KHNrYiwgRVRIRVJNSU5QQUNLRVQpOworCQltZW1zZXQoZGF0YSwgMCwgRVRIRVJNSU5QQUNLRVQpOworCQltZW1jcHkoZGF0YSwgZGV2LT5kZXZfYWRkciwgNik7CisJCW1lbWNweShkYXRhKzYsIGRldi0+ZGV2X2FkZHIsIDYpOworCQlibWFjX3RyYW5zbWl0X3BhY2tldChza2IsIGRldik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJtYWNfcHJvYmUoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3sKKwlpbnQgaiwgcmV2LCByZXQ7CisJc3RydWN0IGJtYWNfZGF0YSAqYnA7CisJdW5zaWduZWQgY2hhciAqYWRkcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpc19ibWFjX3BsdXMgPSAoKGludCltYXRjaC0+ZGF0YSkgIT0gMDsKKworCWlmIChtYWNpb19yZXNvdXJjZV9jb3VudChtZGV2KSAhPSAzIHx8IG1hY2lvX2lycV9jb3VudChtZGV2KSAhPSAzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQk1BQzogY2FuJ3QgdXNlLCBuZWVkIDMgYWRkcnMgYW5kIDMgaW50cnNcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJYWRkciA9IGdldF9wcm9wZXJ0eShtYWNpb19nZXRfb2Zfbm9kZShtZGV2KSwgIm1hYy1hZGRyZXNzIiwgTlVMTCk7CisJaWYgKGFkZHIgPT0gTlVMTCkgeworCQlhZGRyID0gZ2V0X3Byb3BlcnR5KG1hY2lvX2dldF9vZl9ub2RlKG1kZXYpLCAibG9jYWwtbWFjLWFkZHJlc3MiLCBOVUxMKTsKKwkJaWYgKGFkZHIgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJCTUFDOiBDYW4ndCBnZXQgbWFjLWFkZHJlc3NcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihQUklWX0JZVEVTKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgIkJNQUM6IGFsbG9jX2V0aGVyZGV2IGZhaWxlZCwgb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkJCisJYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZtZGV2LT5vZmRldi5kZXYpOworCW1hY2lvX3NldF9kcnZkYXRhKG1kZXYsIGRldik7CisKKwlicC0+bWRldiA9IG1kZXY7CisJc3Bpbl9sb2NrX2luaXQoJmJwLT5sb2NrKTsKKworCWlmIChtYWNpb19yZXF1ZXN0X3Jlc291cmNlcyhtZGV2LCAiYm1hYyIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQk1BQzogY2FuJ3QgcmVxdWVzdCBJTyByZXNvdXJjZSAhXG4iKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKQorCQlpb3JlbWFwKG1hY2lvX3Jlc291cmNlX3N0YXJ0KG1kZXYsIDApLCBtYWNpb19yZXNvdXJjZV9sZW4obWRldiwgMCkpOworCWlmIChkZXYtPmJhc2VfYWRkciA9PSAwKQorCQlnb3RvIG91dF9yZWxlYXNlOworCisJZGV2LT5pcnEgPSBtYWNpb19pcnEobWRldiwgMCk7CisKKwlibWFjX2VuYWJsZV9hbmRfcmVzZXRfY2hpcChkZXYpOworCWJtd3JpdGUoZGV2LCBJTlRESVNBQkxFLCBEaXNhYmxlQWxsKTsKKworCXJldiA9IGFkZHJbMF0gPT0gMCAmJiBhZGRyWzFdID09IDB4QTA7CisJZm9yIChqID0gMDsgaiA8IDY7ICsraikKKwkJZGV2LT5kZXZfYWRkcltqXSA9IHJldj8gYml0cmV2KGFkZHJbal0pOiBhZGRyW2pdOworCisJLyogRW5hYmxlIGNoaXAgd2l0aG91dCBpbnRlcnJ1cHRzIGZvciBub3cgKi8KKwlibWFjX2VuYWJsZV9hbmRfcmVzZXRfY2hpcChkZXYpOworCWJtd3JpdGUoZGV2LCBJTlRESVNBQkxFLCBEaXNhYmxlQWxsKTsKKworCWRldi0+b3BlbiA9IGJtYWNfb3BlbjsKKwlkZXYtPnN0b3AgPSBibWFjX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYm1hY19vdXRwdXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBibWFjX3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gYm1hY19zZXRfbXVsdGljYXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gYm1hY19zZXRfYWRkcmVzczsKKworCWJtYWNfZ2V0X3N0YXRpb25fYWRkcmVzcyhkZXYsIGFkZHIpOworCWlmIChibWFjX3ZlcmlmeV9jaGVja3N1bShkZXYpICE9IDApCisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCisJYnAtPmlzX2JtYWNfcGx1cyA9IGlzX2JtYWNfcGx1czsKKwlicC0+dHhfZG1hID0gaW9yZW1hcChtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAxKSwgbWFjaW9fcmVzb3VyY2VfbGVuKG1kZXYsIDEpKTsKKwlpZiAoIWJwLT50eF9kbWEpCisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCWJwLT50eF9kbWFfaW50ciA9IG1hY2lvX2lycShtZGV2LCAxKTsKKwlicC0+cnhfZG1hID0gaW9yZW1hcChtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAyKSwgbWFjaW9fcmVzb3VyY2VfbGVuKG1kZXYsIDIpKTsKKwlpZiAoIWJwLT5yeF9kbWEpCisJCWdvdG8gZXJyX291dF9pb3VubWFwX3R4OworCWJwLT5yeF9kbWFfaW50ciA9IG1hY2lvX2lycShtZGV2LCAyKTsKKworCWJwLT50eF9jbWRzID0gKHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKikgREJETUFfQUxJR04oYnAgKyAxKTsKKwlicC0+cnhfY21kcyA9IGJwLT50eF9jbWRzICsgTl9UWF9SSU5HICsgMTsKKworCWJwLT5xdWV1ZSA9IChzdHJ1Y3Qgc2tfYnVmZl9oZWFkICopKGJwLT5yeF9jbWRzICsgTl9SWF9SSU5HICsgMSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdChicC0+cXVldWUpOworCisJaW5pdF90aW1lcigmYnAtPnR4X3RpbWVvdXQpOworCisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGJtYWNfbWlzY19pbnRyLCAwLCAiQk1BQy1taXNjIiwgZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiQk1BQzogY2FuJ3QgZ2V0IGlycSAlZFxuIiwgZGV2LT5pcnEpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcF9yeDsKKwl9CisJcmV0ID0gcmVxdWVzdF9pcnEoYnAtPnR4X2RtYV9pbnRyLCBibWFjX3R4ZG1hX2ludHIsIDAsICJCTUFDLXR4ZG1hIiwgZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiQk1BQzogY2FuJ3QgZ2V0IGlycSAlZFxuIiwgYnAtPnR4X2RtYV9pbnRyKTsKKwkJZ290byBlcnJfb3V0X2lycTA7CisJfQorCXJldCA9IHJlcXVlc3RfaXJxKGJwLT5yeF9kbWFfaW50ciwgYm1hY19yeGRtYV9pbnRyLCAwLCAiQk1BQy1yeGRtYSIsIGRldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIkJNQUM6IGNhbid0IGdldCBpcnEgJWRcbiIsIGJwLT5yeF9kbWFfaW50cik7CisJCWdvdG8gZXJyX291dF9pcnExOworCX0KKworCS8qIE1hc2sgY2hpcCBpbnRlcnJ1cHRzIGFuZCBkaXNhYmxlIGNoaXAsIHdpbGwgYmUKKwkgKiByZS1lbmFibGVkIG9uIG9wZW4oKQorCSAqLworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9CTUFDX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUoYnAtPm1kZXYpLCAwLCAwKTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQk1BQzogRXRoZXJuZXQgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX291dF9pcnEyOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBCTUFDJXMgYXQiLCBkZXYtPm5hbWUsIChpc19ibWFjX3BsdXM/ICIrIjogIiIpKTsKKwlmb3IgKGogPSAwOyBqIDwgNjsgKytqKQorCQlwcmludGsoIiVjJS4yeCIsIChqPyAnOic6ICcgJyksIGRldi0+ZGV2X2FkZHJbal0pOworCVhYREVCVUcoKCIsIGJhc2VfYWRkcj0lIzBseCIsIGRldi0+YmFzZV9hZGRyKSk7CisJcHJpbnRrKCJcbiIpOworCQorCXJldHVybiAwOworCitlcnJfb3V0X2lycTI6CisJZnJlZV9pcnEoYnAtPnJ4X2RtYV9pbnRyLCBkZXYpOworZXJyX291dF9pcnExOgorCWZyZWVfaXJxKGJwLT50eF9kbWFfaW50ciwgZGV2KTsKK2Vycl9vdXRfaXJxMDoKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK2Vycl9vdXRfaW91bm1hcF9yeDoKKwlpb3VubWFwKGJwLT5yeF9kbWEpOworZXJyX291dF9pb3VubWFwX3R4OgorCWlvdW5tYXAoYnAtPnR4X2RtYSk7CitlcnJfb3V0X2lvdW5tYXA6CisJaW91bm1hcCgodm9pZCBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHIpOworb3V0X3JlbGVhc2U6CisJbWFjaW9fcmVsZWFzZV9yZXNvdXJjZXMobWRldik7CitvdXRfZnJlZToKKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9CTUFDX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUoYnAtPm1kZXYpLCAwLCAwKTsKKwlmcmVlX25ldGRldihkZXYpOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgYm1hY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCS8qIFhYREVCVUcoKCJibWFjOiBlbnRlciBvcGVuXG4iKSk7ICovCisJLyogcmVzZXQgdGhlIGNoaXAgKi8KKwlicC0+b3BlbmVkID0gMTsKKwlibWFjX3Jlc2V0X2FuZF9lbmFibGUoZGV2KTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKKwlkZXYtPmZsYWdzIHw9IElGRl9SVU5OSU5HOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJtYWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYm1hY19kYXRhICpicCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqcmQgPSBicC0+cnhfZG1hOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnRkID0gYnAtPnR4X2RtYTsKKwl1bnNpZ25lZCBzaG9ydCBjb25maWc7CisJaW50IGk7CisKKwlicC0+c2xlZXBpbmcgPSAxOworCWRldi0+ZmxhZ3MgJj0gfihJRkZfVVAgfCBJRkZfUlVOTklORyk7CisKKwkvKiBkaXNhYmxlIHJ4IGFuZCB0eCAqLworCWNvbmZpZyA9IGJtcmVhZChkZXYsIFJYQ0ZHKTsKKwlibXdyaXRlKGRldiwgUlhDRkcsIChjb25maWcgJiB+UnhNQUNFbmFibGUpKTsKKworCWNvbmZpZyA9IGJtcmVhZChkZXYsIFRYQ0ZHKTsKKwlibXdyaXRlKGRldiwgVFhDRkcsIChjb25maWcgJiB+VHhNQUNFbmFibGUpKTsKKworCWJtd3JpdGUoZGV2LCBJTlRESVNBQkxFLCBEaXNhYmxlQWxsKTsgLyogZGlzYWJsZSBhbGwgaW50cnMgKi8KKworCS8qIGRpc2FibGUgcnggYW5kIHR4IGRtYSAqLworCXN0X2xlMzIoJnJkLT5jb250cm9sLCBEQkRNQV9DTEVBUihSVU58UEFVU0V8RkxVU0h8V0FLRSkpOwkvKiBjbGVhciBydW4gYml0ICovCisJc3RfbGUzMigmdGQtPmNvbnRyb2wsIERCRE1BX0NMRUFSKFJVTnxQQVVTRXxGTFVTSHxXQUtFKSk7CS8qIGNsZWFyIHJ1biBiaXQgKi8KKworCS8qIGZyZWUgc29tZSBza2IncyAqLworCVhYREVCVUcoKCJibWFjOiBmcmVlIHJ4IGJ1ZnNcbiIpKTsKKwlmb3IgKGk9MDsgaTxOX1JYX1JJTkc7IGkrKykgeworCQlpZiAoYnAtPnJ4X2J1ZnNbaV0gIT0gTlVMTCkgeworCQkJZGV2X2tmcmVlX3NrYihicC0+cnhfYnVmc1tpXSk7CisJCQlicC0+cnhfYnVmc1tpXSA9IE5VTEw7CisJCX0KKwl9CisJWFhERUJVRygoImJtYWM6IGZyZWUgdHggYnVmc1xuIikpOworCWZvciAoaSA9IDA7IGk8Tl9UWF9SSU5HOyBpKyspIHsKKwkJaWYgKGJwLT50eF9idWZzW2ldICE9IE5VTEwpIHsKKwkJCWRldl9rZnJlZV9za2IoYnAtPnR4X2J1ZnNbaV0pOworCQkJYnAtPnR4X2J1ZnNbaV0gPSBOVUxMOworCQl9CisJfQorCVhYREVCVUcoKCJibWFjOiBhbGwgYnVmcyBmcmVlZFxuIikpOworCisJYnAtPm9wZW5lZCA9IDA7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX0JNQUNfRU5BQkxFLCBtYWNpb19nZXRfb2Zfbm9kZShicC0+bWRldiksIDAsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitibWFjX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChicC0+c2xlZXBpbmcpCisJCXJldHVybjsKKwkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJd2hpbGUgKDEpIHsKKwkJaSA9IGJwLT50eF9maWxsICsgMTsKKwkJaWYgKGkgPj0gTl9UWF9SSU5HKQorCQkJaSA9IDA7CisJCWlmIChpID09IGJwLT50eF9lbXB0eSkKKwkJCWJyZWFrOworCQlza2IgPSBza2JfZGVxdWV1ZShicC0+cXVldWUpOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlicmVhazsKKwkJYm1hY190cmFuc21pdF9wYWNrZXQoc2tiLCBkZXYpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50CitibWFjX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlza2JfcXVldWVfdGFpbChicC0+cXVldWUsIHNrYik7CisJYm1hY19zdGFydChkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBibWFjX3R4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlzdHJ1Y3QgYm1hY19kYXRhICpicCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqdGQgPSBicC0+dHhfZG1hOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnJkID0gYnAtPnJ4X2RtYTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHNob3J0IGNvbmZpZywgb2xkQ29uZmlnOworCWludCBpOworCisJWFhERUJVRygoImJtYWM6IHR4X3RpbWVvdXQgY2FsbGVkXG4iKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJYnAtPnRpbWVvdXRfYWN0aXZlID0gMDsKKworCS8qIHVwZGF0ZSB2YXJpb3VzIGNvdW50ZXJzICovCisvKiAgICAgCWJtYWNfaGFuZGxlX21pc2NfaW50cnMoYnAsIDApOyAqLworCisJY3AgPSAmYnAtPnR4X2NtZHNbYnAtPnR4X2VtcHR5XTsKKy8qCVhYREVCVUcoKEtFUk5fREVCVUcgImJtYWM6IHR4IGRtYXN0YXQ9JXggJXggcnVudD0lZCBwcj0leCBmcz0leCBmYz0leFxuIiwgKi8KKy8qIAkgICBsZF9sZTMyKCZ0ZC0+c3RhdHVzKSwgbGRfbGUxNigmY3AtPnhmZXJfc3RhdHVzKSwgYnAtPnR4X2JhZF9ydW50LCAqLworLyogCSAgIG1iLT5wciwgbWItPnhtdGZzLCBtYi0+Zmlmb2ZjKSk7ICovCisKKwkvKiB0dXJuIG9mZiBib3RoIHR4IGFuZCByeCBhbmQgcmVzZXQgdGhlIGNoaXAgKi8KKwljb25maWcgPSBibXJlYWQoZGV2LCBSWENGRyk7CisJYm13cml0ZShkZXYsIFJYQ0ZHLCAoY29uZmlnICYgflJ4TUFDRW5hYmxlKSk7CisJY29uZmlnID0gYm1yZWFkKGRldiwgVFhDRkcpOworCWJtd3JpdGUoZGV2LCBUWENGRywgKGNvbmZpZyAmIH5UeE1BQ0VuYWJsZSkpOworCW91dF9sZTMyKCZ0ZC0+Y29udHJvbCwgREJETUFfQ0xFQVIoUlVOfFBBVVNFfEZMVVNIfFdBS0V8QUNUSVZFfERFQUQpKTsKKwlwcmludGsoS0VSTl9FUlIgImJtYWM6IHRyYW5zbWl0IHRpbWVvdXQgLSByZXNldHRpbmdcbiIpOworCWJtYWNfZW5hYmxlX2FuZF9yZXNldF9jaGlwKGRldik7CisKKwkvKiByZXN0YXJ0IHJ4IGRtYSAqLworCWNwID0gYnVzX3RvX3ZpcnQobGRfbGUzMigmcmQtPmNtZHB0cikpOworCW91dF9sZTMyKCZyZC0+Y29udHJvbCwgREJETUFfQ0xFQVIoUlVOfFBBVVNFfEZMVVNIfFdBS0V8QUNUSVZFfERFQUQpKTsKKwlvdXRfbGUxNigmY3AtPnhmZXJfc3RhdHVzLCAwKTsKKwlvdXRfbGUzMigmcmQtPmNtZHB0ciwgdmlydF90b19idXMoY3ApKTsKKwlvdXRfbGUzMigmcmQtPmNvbnRyb2wsIERCRE1BX1NFVChSVU58V0FLRSkpOworCisJLyogZml4IHVwIHRoZSB0cmFuc21pdCBzaWRlICovCisJWFhERUJVRygoS0VSTl9ERUJVRyAiYm1hYzogdHggZW1wdHk9JWQgZmlsbD0lZCBmdWxsdXA9JWRcbiIsCisJCSBicC0+dHhfZW1wdHksIGJwLT50eF9maWxsLCBicC0+dHhfZnVsbHVwKSk7CisJaSA9IGJwLT50eF9lbXB0eTsKKwkrK2JwLT5zdGF0cy50eF9lcnJvcnM7CisJaWYgKGkgIT0gYnAtPnR4X2ZpbGwpIHsKKwkJZGV2X2tmcmVlX3NrYihicC0+dHhfYnVmc1tpXSk7CisJCWJwLT50eF9idWZzW2ldID0gTlVMTDsKKwkJaWYgKCsraSA+PSBOX1RYX1JJTkcpIGkgPSAwOworCQlicC0+dHhfZW1wdHkgPSBpOworCX0KKwlicC0+dHhfZnVsbHVwID0gMDsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJaWYgKGkgIT0gYnAtPnR4X2ZpbGwpIHsKKwkJY3AgPSAmYnAtPnR4X2NtZHNbaV07CisJCW91dF9sZTE2KCZjcC0+eGZlcl9zdGF0dXMsIDApOworCQlvdXRfbGUxNigmY3AtPmNvbW1hbmQsIE9VVFBVVF9MQVNUKTsKKwkJb3V0X2xlMzIoJnRkLT5jbWRwdHIsIHZpcnRfdG9fYnVzKGNwKSk7CisJCW91dF9sZTMyKCZ0ZC0+Y29udHJvbCwgREJETUFfU0VUKFJVTikpOworCQkvKiAJYm1hY19zZXRfdGltZW91dChkZXYpOyAqLworCQlYWERFQlVHKChLRVJOX0RFQlVHICJibWFjOiBzdGFydGluZyAlZFxuIiwgaSkpOworCX0KKworCS8qIHR1cm4gaXQgYmFjayBvbiAqLworCW9sZENvbmZpZyA9IGJtcmVhZChkZXYsIFJYQ0ZHKTsJCQorCWJtd3JpdGUoZGV2LCBSWENGRywgb2xkQ29uZmlnIHwgUnhNQUNFbmFibGUgKTsKKwlvbGRDb25maWcgPSBibXJlYWQoZGV2LCBUWENGRyk7CQkKKwlibXdyaXRlKGRldiwgVFhDRkcsIG9sZENvbmZpZyB8IFR4TUFDRW5hYmxlICk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgZHVtcF9kYmRtYSh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcCxpbnQgY291bnQpCit7CisJaW50IGksKmlwOworCQorCWZvciAoaT0wO2k8IGNvdW50O2krKykgeworCQlpcCA9IChpbnQqKShjcCtpKTsKKwkKKwkJcHJpbnRrKCJkYmRtYSByZXEgMHgleCBhZGRyIDB4JXggYmFkZHIgMHgleCB4ZmVyL3JlcyAweCV4XG4iLAorCQkgICAgICAgbGRfbGUzMihpcCswKSwKKwkJICAgICAgIGxkX2xlMzIoaXArMSksCisJCSAgICAgICBsZF9sZTMyKGlwKzIpLAorCQkgICAgICAgbGRfbGUzMihpcCszKSk7CisJfQorCit9CisjZW5kaWYKKworI2lmIDAKK3N0YXRpYyBpbnQKK2JtYWNfcHJvY19pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpCit7CisJaW50IGxlbiA9IDA7CisJb2ZmX3QgcG9zICAgPSAwOworCW9mZl90IGJlZ2luID0gMDsKKwlpbnQgaTsKKworCWlmIChibWFjX2RldnMgPT0gTlVMTCkKKwkJcmV0dXJuICgtRU5PU1lTKTsKKworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciwgIkJNQUMgY291bnRlcnMgJiByZWdpc3RlcnNcbiIpOworCisJZm9yIChpID0gMDsgaTxOX1JFR19FTlRSSUVTOyBpKyspIHsKKwkJbGVuICs9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiJXM6ICUjMDh4XG4iLAorCQkJICAgICAgIHJlZ19lbnRyaWVzW2ldLm5hbWUsCisJCQkgICAgICAgYm1yZWFkKGJtYWNfZGV2cywgcmVnX2VudHJpZXNbaV0ucmVnX29mZnNldCkpOworCQlwb3MgPSBiZWdpbiArIGxlbjsKKworCQlpZiAocG9zIDwgb2Zmc2V0KSB7CisJCQlsZW4gPSAwOworCQkJYmVnaW4gPSBwb3M7CisJCX0KKworCQlpZiAocG9zID4gb2Zmc2V0K2xlbmd0aCkgYnJlYWs7CisJfQorCisJKnN0YXJ0ID0gYnVmZmVyICsgKG9mZnNldCAtIGJlZ2luKTsKKwlsZW4gLT0gKG9mZnNldCAtIGJlZ2luKTsKKworCWlmIChsZW4gPiBsZW5ndGgpIGxlbiA9IGxlbmd0aDsKKworCXJldHVybiBsZW47Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmV4aXQgYm1hY19yZW1vdmUoc3RydWN0IG1hY2lvX2RldiAqbWRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbWFjaW9fZ2V0X2RydmRhdGEobWRldik7CisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworICAgICAgIAlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlmcmVlX2lycShicC0+dHhfZG1hX2ludHIsIGRldik7CQorCWZyZWVfaXJxKGJwLT5yeF9kbWFfaW50ciwgZGV2KTsKKworCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyKTsKKwlpb3VubWFwKGJwLT50eF9kbWEpOworCWlvdW5tYXAoYnAtPnJ4X2RtYSk7CisKKwltYWNpb19yZWxlYXNlX3Jlc291cmNlcyhtZGV2KTsKKworCWZyZWVfbmV0ZGV2KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBibWFjX21hdGNoW10gPSAKK3sKKwl7CisJLm5hbWUgCQk9ICJibWFjIiwKKwkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCisJLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gsCisJLmRhdGEJCT0gKHZvaWQgKikwLAorCX0sCisJeworCS5uYW1lIAkJPSBPRl9BTllfTUFUQ0gsCisJLnR5cGUJCT0gIm5ldHdvcmsiLAorCS5jb21wYXRpYmxlCT0gImJtYWMrIiwKKwkuZGF0YQkJPSAodm9pZCAqKTEsCisJfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFjaW9fZHJpdmVyIGJtYWNfZHJpdmVyID0gCit7CisJLm5hbWUgCQk9ICJibWFjIiwKKwkubWF0Y2hfdGFibGUJPSBibWFjX21hdGNoLAorCS5wcm9iZQkJPSBibWFjX3Byb2JlLAorCS5yZW1vdmUJCT0gYm1hY19yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBibWFjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBibWFjX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBibWFjX2luaXQodm9pZCkKK3sKKwlpZiAoYm1hY19lbWVyZ2VuY3lfcnhidWYgPT0gTlVMTCkgeworCQlibWFjX2VtZXJnZW5jeV9yeGJ1ZiA9IGttYWxsb2MoUlhfQlVGTEVOLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJtYWNfZW1lcmdlbmN5X3J4YnVmID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQk1BQzogY2FuJ3QgYWxsb2NhdGUgZW1lcmdlbmN5IFJYIGJ1ZmZlclxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCXJldHVybiBtYWNpb19yZWdpc3Rlcl9kcml2ZXIoJmJtYWNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJtYWNfZXhpdCh2b2lkKQoreworCW1hY2lvX3VucmVnaXN0ZXJfZHJpdmVyKCZibWFjX2RyaXZlcik7CisKKwlpZiAoYm1hY19lbWVyZ2VuY3lfcnhidWYgIT0gTlVMTCkgeworCQlrZnJlZShibWFjX2VtZXJnZW5jeV9yeGJ1Zik7CisJCWJtYWNfZW1lcmdlbmN5X3J4YnVmID0gTlVMTDsKKwl9Cit9CisKK01PRFVMRV9BVVRIT1IoIlJhbmR5IEdvYmJlbC9QYXVsIE1hY2tlcnJhcyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQb3dlck1hYyBCTUFDIGV0aGVybmV0IGRyaXZlci4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoYm1hY19pbml0KTsKK21vZHVsZV9leGl0KGJtYWNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibWFjLmggYi9kcml2ZXJzL25ldC9ibWFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzYjkzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JtYWMuaApAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIG1hY2UuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgcmVnaXN0ZXJzIGluIHRoZSAiQmlnIE1hYyIKKyAqICBFdGhlcm5ldCBjb250cm9sbGVyIGZvdW5kIGluIFBvd2VyTWFjIEczIG1vZGVscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggUmFuZHkgR29iYmVsLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyogVGhlICJCaWcgTUFDIiBhcHBlYXJzIHRvIGhhdmUgc29tZSBwYXJ0cyBpbiBjb21tb24gd2l0aCB0aGUgU3VuICJIYXBweSBNZWFsIgorICogKEhNRSkgY29udHJvbGxlci4gIFNlZSBzdW5obWUuaAorICovCisKKyAKKy8qIHJlZ2lzdGVyIG9mZnNldHMgKi8KKworLyogZ2xvYmFsIHN0YXR1cyBhbmQgY29udHJvbCAqLworI2RlZmluZQlYSUZDCQkweDAwMCAgIC8qIGxvdy1sZXZlbCBpbnRlcmZhY2UgY29udHJvbCAqLworIwlkZWZpbmUJVHhPdXRwdXRFbmFibGUJMHgwMDAxIC8qIG91dHB1dCBkcml2ZXIgZW5hYmxlICovCisjCWRlZmluZQlYSUZMb29wYmFjawkweDAwMDIgLyogTG9vcGJhY2stbW9kZSBYSUYgZW5hYmxlICovCisjCWRlZmluZQlNSUlMb29wYmFjawkweDAwMDQgLyogTG9vcGJhY2stbW9kZSBNSUkgZW5hYmxlICovCisjCWRlZmluZQlNSUlMb29wYmFja0JpdHMJMHgwMDA2CisjCWRlZmluZQlNSUlCdWZmRGlzYWJsZQkweDAwMDggLyogTUlJIHJlY2VpdmUgYnVmZmVyIGRpc2FibGUgKi8KKyMJZGVmaW5lCVNRRVRlc3RFbmFibGUJMHgwMDEwIC8qIFNRRSB0ZXN0IGVuYWJsZSAqLworIwlkZWZpbmUJU1FFVGltZVdpbmRvdwkweDAzZTAgLyogU1FFIHRpbWUgd2luZG93ICovCisjCWRlZmluZQlYSUZMYW5jZU1vZGUJMHgwMDEwIC8qIExhbmNlIG1vZGUgZW5hYmxlICovCisjCWRlZmluZQlYSUZMYW5jZUlQRzAJMHgwM2UwIC8qIExhbmNlIG1vZGUgSVBHMCAqLworI2RlZmluZQlUWEZJRk9DU1IJMHgxMDAgICAvKiB0cmFuc21pdCBGSUZPIGNvbnRyb2wgKi8KKyMJZGVmaW5lCVR4RklGT0VuYWJsZQkweDAwMDEKKyNkZWZpbmUJVFhUSAkJMHgxMTAgICAvKiB0cmFuc21pdCB0aHJlc2hvbGQgKi8KKyMJZGVmaW5lCVR4VGhyZXNob2xkCTB4MDAwNAorI2RlZmluZSBSWEZJRk9DU1IJMHgxMjAgICAvKiByZWNlaXZlIEZJRk8gY29udHJvbCAqLworIwlkZWZpbmUJUnhGSUZPRW5hYmxlCTB4MDAwMQorI2RlZmluZSBNRU1BREQJCTB4MTMwICAgLyogbWVtb3J5IGFkZHJlc3MsIHVua25vd24gZnVuY3Rpb24gKi8KKyNkZWZpbmUgTUVNREFUQUhJCTB4MTQwICAgLyogbWVtb3J5IGRhdGEgaGlnaCwgcHJlc2VudGx5IHVudXNlZCBpbiBkcml2ZXIgKi8KKyNkZWZpbmUgTUVNREFUQUxPCTB4MTUwICAgLyogbWVtb3J5IGRhdGEgbG93LCBwcmVzZW50bHkgdW51c2VkIGluIGRyaXZlciAqLworI2RlZmluZSBYQ1ZSSUYJCTB4MTYwICAgLyogdHJhbnNjZWl2ZXIgaW50ZXJmYWNlIGNvbnRyb2wgKi8KKyMJZGVmaW5lCUNPTEFjdGl2ZUxvdwkweDAwMDIKKyMJZGVmaW5lCVNlcmlhbE1vZGUJMHgwMDA0CisjCWRlZmluZQlDbGtCaXQJCTB4MDAwOAorIwlkZWZpbmUJTGlua1N0YXR1cwkweDAxMDAKKyNkZWZpbmUgQ0hJUElEICAgICAgICAgIDB4MTcwICAgLyogY2hpcCBJRCAqLworI2RlZmluZQlNSUZDU1IJCTB4MTgwICAgLyogPz8/ICovCisjZGVmaW5lCVNST01DU1IJCTB4MTkwICAgLyogU1JPTSBjb250cm9sICovCisjCWRlZmluZQlDaGlwU2VsZWN0CTB4MDAwMQorIwlkZWZpbmUJQ2xrCQkweDAwMDIKKyNkZWZpbmUgVFhQTlRSCQkweDFhMCAgIC8qIHRyYW5zbWl0IHBvaW50ZXIgKi8KKyNkZWZpbmUJUlhQTlRSCQkweDFiMCAgIC8qIHJlY2VpdmUgcG9pbnRlciAqLworI2RlZmluZQlTVEFUVVMJCTB4MjAwICAgLyogc3RhdHVzLS1yZWFkaW5nIHRoaXMgY2xlYXJzIGl0ICovCisjZGVmaW5lCUlOVERJU0FCTEUJMHgyMTAgICAvKiBpbnRlcnJ1cHQgZW5hYmxlL2Rpc2FibGUgY29udHJvbCAqLworLyogYml0cyBiZWxvdyBhcmUgdGhlIHNhbWUgaW4gYm90aCBTVEFUVVMgYW5kIElOVERJU0FCTEUgcmVnaXN0ZXJzICovCisjCWRlZmluZQlGcmFtZVJlY2VpdmVkCTB4MDAwMDAwMDEgLyogUmVjZWl2ZWQgYSBmcmFtZSAqLworIwlkZWZpbmUJUnhGcmFtZUNudEV4cAkweDAwMDAwMDAyIC8qIFJlY2VpdmUgZnJhbWUgY291bnRlciBleHBpcmVkICovCisjCWRlZmluZQlSeEFsaWduQ250RXhwCTB4MDAwMDAwMDQgLyogQWxpZ24tZXJyb3IgY291bnRlciBleHBpcmVkICovCisjCWRlZmluZQlSeENSQ0NudEV4cAkweDAwMDAwMDA4IC8qIENSQy1lcnJvciBjb3VudGVyIGV4cGlyZWQgKi8KKyMJZGVmaW5lCVJ4TGVuQ250RXhwCTB4MDAwMDAwMTAgLyogTGVuZ3RoLWVycm9yIGNvdW50ZXIgZXhwaXJlZCAqLworIwlkZWZpbmUJUnhPdmVyRmxvdwkweDAwMDAwMDIwIC8qIFJlY2VpdmUgRklGTyBvdmVyZmxvdyAqLworIwlkZWZpbmUJUnhDb2RlVmlvbGF0aW9uCTB4MDAwMDAwNDAgLyogQ29kZS12aW9sYXRpb24gY291bnRlciBleHBpcmVkICovCisjCWRlZmluZQlTUUVUZXN0RXJyb3IJMHgwMDAwMDA4MCAvKiBUZXN0IGVycm9yIGluIFhJRiBmb3IgU1FFICovCisjCWRlZmluZQlGcmFtZVNlbnQJMHgwMDAwMDEwMCAvKiBUcmFuc21pdHRlZCBhIGZyYW1lICovCisjCWRlZmluZQlUeFVuZGVycnVuCTB4MDAwMDAyMDAgLyogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biAqLworIwlkZWZpbmUJVHhNYXhTaXplRXJyb3IJMHgwMDAwMDQwMCAvKiBNYXgtcGFja2V0IHNpemUgZXJyb3IgKi8KKyMJZGVmaW5lCVR4Tm9ybWFsQ29sbEV4cAkweDAwMDAwODAwIC8qIE5vcm1hbC1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICovCisjCWRlZmluZQlUeEV4Y2Vzc0NvbGxFeHAJMHgwMDAwMTAwMCAvKiBFeGNlc3MtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAqLworIwlkZWZpbmUJVHhMYXRlQ29sbEV4cAkweDAwMDAyMDAwIC8qIExhdGUtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAqLworIwlkZWZpbmUJVHhOZXR3b3JrQ29sbEV4cCAweDAwMDA0MDAwIC8qIEZpcnN0LWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgKi8KKyMJZGVmaW5lCVR4RGVmZXJUaW1lckV4cAkweDAwMDA4MDAwIC8qIERlZmVyLXRpbWVyIGV4cGlyZWQgKi8KKyMJZGVmaW5lCVJ4RklGT1RvSG9zdAkweDAwMDEwMDAwIC8qIERhdGEgbW92ZWQgZnJvbSBGSUZPIHRvIGhvc3QgKi8KKyMJZGVmaW5lCVJ4Tm9EZXNjcmlwdG9ycwkweDAwMDIwMDAwIC8qIE5vIG1vcmUgcmVjZWl2ZSBkZXNjcmlwdG9ycyAqLworIwlkZWZpbmUJUnhETUFFcnJvcgkweDAwMDQwMDAwIC8qIEVycm9yIGR1cmluZyByZWNlaXZlIERNQSAqLworIwlkZWZpbmUJUnhETUFMYXRlRXJyCTB4MDAwODAwMDAgLyogUmVjZWl2ZSBETUEsIGRhdGEgbGF0ZSAqLworIwlkZWZpbmUJUnhQYXJpdHlFcnIJMHgwMDEwMDAwMCAvKiBQYXJpdHkgZXJyb3IgZHVyaW5nIHJlY2VpdmUgRE1BICovCisjCWRlZmluZQlSeFRhZ0Vycm9yCTB4MDAyMDAwMDAgLyogVGFnIGVycm9yIGR1cmluZyByZWNlaXZlIERNQSAqLworIwlkZWZpbmUJVHhFT1BFcnJvcgkweDAwNDAwMDAwIC8qIFR4IGRlc2NyaXB0b3IgZGlkIG5vdCBoYXZlIEVPUCBzZXQgKi8KKyMJZGVmaW5lCU1JRkludHJFdmVudAkweDAwODAwMDAwIC8qIE1JRiBpcyBzaWduYWxpbmcgYW4gaW50ZXJydXB0ICovCisjCWRlZmluZQlUeEhvc3RUb0ZJRk8JMHgwMTAwMDAwMCAvKiBEYXRhIG1vdmVkIGZyb20gaG9zdCB0byBGSUZPICAqLworIwlkZWZpbmUJVHhGSUZPQWxsU2VudAkweDAyMDAwMDAwIC8qIFRyYW5zbWl0dGVkIGFsbCBwYWNrZXRzIGluIEZJRk8gKi8KKyMJZGVmaW5lCVR4RE1BRXJyb3IJMHgwNDAwMDAwMCAvKiBFcnJvciBkdXJpbmcgdHJhbnNtaXQgRE1BICovCisjCWRlZmluZQlUeERNQUxhdGVFcnJvcgkweDA4MDAwMDAwIC8qIExhdGUgZXJyb3IgZHVyaW5nIHRyYW5zbWl0IERNQSAqLworIwlkZWZpbmUJVHhQYXJpdHlFcnJvcgkweDEwMDAwMDAwIC8qIFBhcml0eSBlcnJvciBkdXJpbmcgdHJhbnNtaXQgRE1BICovCisjCWRlZmluZQlUeFRhZ0Vycm9yCTB4MjAwMDAwMDAgLyogVGFnIGVycm9yIGR1cmluZyB0cmFuc21pdCBETUEgKi8KKyMJZGVmaW5lCVBJT0Vycm9yCTB4NDAwMDAwMDAgLyogUElPIGFjY2VzcyBnb3QgYW4gZXJyb3IgKi8KKyMJZGVmaW5lCVBJT1Bhcml0eUVycm9yCTB4ODAwMDAwMDAgLyogUElPIGFjY2VzcyBnb3QgYSBwYXJpdHkgZXJyb3IgICovCisjCWRlZmluZQlEaXNhYmxlQWxsCTB4ZmZmZmZmZmYKKyMJZGVmaW5lCUVuYWJsZUFsbAkweDAwMDAwMDAwCisvKiAjCWRlZmluZQlOb3JtYWxJbnRFdmVudHMJfihGcmFtZVJlY2VpdmVkIHwgRnJhbWVTZW50IHwgVHhVbmRlcnJ1bikgKi8KKyMJZGVmaW5lCUVuYWJsZU5vcm1hbAl+KEZyYW1lUmVjZWl2ZWQgfCBGcmFtZVNlbnQpCisjCWRlZmluZQlFbmFibGVFcnJvcnMJKEZyYW1lUmVjZWl2ZWQgfCBGcmFtZVNlbnQpCisjCWRlZmluZQlSeEVycm9yTWFzawkoUnhGcmFtZUNudEV4cCB8IFJ4QWxpZ25DbnRFeHAgfCBSeENSQ0NudEV4cCB8IFwKKwkJCQkgUnhMZW5DbnRFeHAgfCBSeE92ZXJGbG93IHwgUnhDb2RlVmlvbGF0aW9uKQorIwlkZWZpbmUJVHhFcnJvck1hc2sJKFR4VW5kZXJydW4gfCBUeE1heFNpemVFcnJvciB8IFR4RXhjZXNzQ29sbEV4cCB8IFwKKwkJCQkgVHhMYXRlQ29sbEV4cCB8IFR4TmV0d29ya0NvbGxFeHAgfCBUeERlZmVyVGltZXJFeHApCisKKy8qIHRyYW5zbWl0IGNvbnRyb2wgKi8KKyNkZWZpbmUJVFhSU1QJCTB4NDIwICAgLyogdHJhbnNtaXQgcmVzZXQgKi8KKyMJZGVmaW5lCVR4UmVzZXRCaXQJMHgwMDAxCisjZGVmaW5lCVRYQ0ZHCQkweDQzMCAgIC8qIHRyYW5zbWl0IGNvbmZpZ3VyYXRpb24gY29udHJvbCovCisjCWRlZmluZQlUeE1BQ0VuYWJsZQkweDAwMDEgLyogb3V0cHV0IGRyaXZlciBlbmFibGUgKi8KKyMJZGVmaW5lCVR4U2xvd01vZGUJMHgwMDIwIC8qIGVuYWJsZSBzbG93IG1vZGUgKi8KKyMJZGVmaW5lCVR4SWdub3JlQ29sbAkweDAwNDAgLyogaWdub3JlIHRyYW5zbWl0IGNvbGxpc2lvbnMgKi8KKyMJZGVmaW5lCVR4Tm9GQ1MJCTB4MDA4MCAvKiBkbyBub3QgZW1pdCBGQ1MgKi8KKyMJZGVmaW5lCVR4Tm9CYWNrb2ZmCTB4MDEwMCAvKiBubyBiYWNrb2ZmIGluIGNhc2Ugb2YgY29sbGlzaW9ucyAqLworIwlkZWZpbmUJVHhGdWxsRHVwbGV4CTB4MDIwMCAvKiBlbmFibGUgZnVsbC1kdXBsZXggKi8KKyMJZGVmaW5lCVR4TmV2ZXJHaXZlVXAJMHgwNDAwIC8qIGRvbid0IGdpdmUgdXAgb24gdHJhbnNtaXRzICovCisjZGVmaW5lIElQRzEJCTB4NDQwICAgLyogSW50ZXItcGFja2V0IGdhcCAxICovCisjZGVmaW5lIElQRzIJCTB4NDUwICAgLyogSW50ZXItcGFja2V0IGdhcCAyICovCisjZGVmaW5lIEFMSU1JVAkJMHg0NjAgICAvKiBUcmFuc21pdCBhdHRlbXB0IGxpbWl0ICovCisjZGVmaW5lIFNMT1QJCTB4NDcwICAgLyogVHJhbnNtaXQgc2xvdCB0aW1lICovCisjZGVmaW5lIFBBTEVOCQkweDQ4MCAgIC8qIFNpemUgb2YgdHJhbnNtaXQgcHJlYW1ibGUgKi8KKyNkZWZpbmUgUEFQQVQJCTB4NDkwICAgLyogUGF0dGVybiBmb3IgdHJhbnNtaXQgcHJlYW1ibGUgKi8KKyNkZWZpbmUgVFhTRkQJCTB4NGEwICAgLyogVHJhbnNtaXQgZnJhbWUgZGVsaW1pdGVyICovCisjZGVmaW5lIEpBTQkJMHg0YjAgICAvKiBKYW0gc2l6ZSAqLworI2RlZmluZSBUWE1BWAkJMHg0YzAgICAvKiBUcmFuc21pdCBtYXggcGt0IHNpemUgKi8KKyNkZWZpbmUgVFhNSU4JCTB4NGQwICAgLyogVHJhbnNtaXQgbWluIHBrdCBzaXplICovCisjZGVmaW5lIFBBUkVHCQkweDRlMCAgIC8qIENvdW50IG9mIHRyYW5zbWl0IHBlYWsgYXR0ZW1wdHMgKi8KKyNkZWZpbmUgRENOVAkJMHg0ZjAgICAvKiBUcmFuc21pdCBkZWZlciB0aW1lciAqLworI2RlZmluZSBOQ0NOVAkJMHg1MDAgICAvKiBUcmFuc21pdCBub3JtYWwtY29sbGlzaW9uIGNvdW50ZXIgKi8KKyNkZWZpbmUgTlRDTlQJCTB4NTEwICAgLyogVHJhbnNtaXQgZmlyc3QtY29sbGlzaW9uIGNvdW50ZXIgKi8KKyNkZWZpbmUgRVhDTlQJCTB4NTIwICAgLyogVHJhbnNtaXQgZXhjZXNzLWNvbGxpc2lvbiBjb3VudGVyICovCisjZGVmaW5lIExUQ05UCQkweDUzMCAgIC8qIFRyYW5zbWl0IGxhdGUtY29sbGlzaW9uIGNvdW50ZXIgKi8KKyNkZWZpbmUgUlNFRUQJCTB4NTQwICAgLyogVHJhbnNtaXQgcmFuZG9tIG51bWJlciBzZWVkICovCisjZGVmaW5lIFRYU00JCTB4NTUwICAgLyogVHJhbnNtaXQgc3RhdGUgbWFjaGluZSAqLworCisvKiByZWNlaXZlIGNvbnRyb2wgKi8KKyNkZWZpbmUgUlhSU1QJCTB4NjIwICAgLyogcmVjZWl2ZSByZXNldCAqLworIwlkZWZpbmUJUnhSZXNldFZhbHVlCTB4MDAwMAorI2RlZmluZSBSWENGRwkJMHg2MzAgICAvKiByZWNlaXZlIGNvbmZpZ3VyYXRpb24gY29udHJvbCAqLworIwlkZWZpbmUJUnhNQUNFbmFibGUJMHgwMDAxIC8qIHJlY2VpdmVyIG92ZXJhbGwgZW5hYmxlICovCisjCWRlZmluZQlSeENGR1Jlc2VydmVkCTB4MDAwNAorIwlkZWZpbmUJUnhQYWRTdHJpcEVuYWIJMHgwMDIwIC8qIGVuYWJsZSBwYWQgYnl0ZSBzdHJpcHBpbmcgKi8KKyMJZGVmaW5lCVJ4UHJvbWlzY0VuYWJsZQkweDAwNDAgLyogdHVybiBvbiBwcm9taXNjdW91cyBtb2RlICovCisjCWRlZmluZQlSeE5vRXJyQ2hlY2sJMHgwMDgwIC8qIGRpc2FibGUgcmVjZWl2ZSBlcnJvciBjaGVja2luZyAqLworIwlkZWZpbmUJUnhDUkNOb1N0cmlwCTB4MDEwMCAvKiBkaXNhYmxlIGF1dG8tQ1JDLXN0cmlwcGluZyAqLworIwlkZWZpbmUJUnhSZWplY3RPd25QYWNrZXRzIDB4MDIwMCAvKiBkb24ndCByZWNlaXZlIG91ciBvd24gcGFja2V0cyAqLworIwlkZWZpbmUJUnhHcnBQcm9taXNjawkweDA0MDAgLyogZW5hYmxlIGdyb3VwIHByb21pc2N1b3VzIG1vZGUgKi8KKyMJZGVmaW5lCVJ4SGFzaEZpbHRlckVuYWJsZSAweDA4MDAgLyogZW5hYmxlIGhhc2ggZmlsdGVyICovCisjCWRlZmluZQlSeEFkZHJGaWx0ZXJFbmFibGUgMHgxMDAwIC8qIGVuYWJsZSBhZGRyZXNzIGZpbHRlciAqLworI2RlZmluZSBSWE1BWAkJMHg2NDAgICAvKiBNYXggcmVjZWl2ZSBwYWNrZXQgc2l6ZSAqLworI2RlZmluZSBSWE1JTgkJMHg2NTAgICAvKiBNaW4gcmVjZWl2ZSBwYWNrZXQgc2l6ZSAqLworI2RlZmluZSBNQUREMgkJMHg2NjAgICAvKiBvdXIgZW5ldCBhZGRyZXNzLCBoaWdoIHBhcnQgKi8KKyNkZWZpbmUgTUFERDEJCTB4NjcwICAgLyogb3VyIGVuZXQgYWRkcmVzcywgbWlkZGxlIHBhcnQgKi8KKyNkZWZpbmUgTUFERDAJCTB4NjgwICAgLyogb3VyIGVuZXQgYWRkcmVzcywgbG93IHBhcnQgKi8KKyNkZWZpbmUgRlJDTlQJCTB4NjkwICAgLyogcmVjZWl2ZSBmcmFtZSBjb3VudGVyICovCisjZGVmaW5lIExFQ05UCQkweDZhMCAgIC8qIFJlY2VpdmUgZXhjZXNzIGxlbmd0aCBlcnJvciBjb3VudGVyICovCisjZGVmaW5lIEFFQ05UCQkweDZiMCAgIC8qIFJlY2VpdmUgbWlzYWxpZ25lZCBlcnJvciBjb3VudGVyICovCisjZGVmaW5lIEZFQ05UCQkweDZjMCAgIC8qIFJlY2VpdmUgQ1JDIGVycm9yIGNvdW50ZXIgKi8KKyNkZWZpbmUgUlhTTQkJMHg2ZDAgICAvKiBSZWNlaXZlIHN0YXRlIG1hY2hpbmUgKi8KKyNkZWZpbmUgUlhDVgkJMHg2ZTAgICAvKiBSZWNlaXZlIGNvZGUgdmlvbGF0aW9uICovCisKKyNkZWZpbmUgQkhBU0gzCQkweDcwMCAgIC8qIG11bHRpY2FzdCBoYXNoIHJlZ2lzdGVyICovCisjZGVmaW5lIEJIQVNIMgkJMHg3MTAgICAvKiBtdWx0aWNhc3QgaGFzaCByZWdpc3RlciAqLworI2RlZmluZSBCSEFTSDEJCTB4NzIwICAgLyogbXVsdGljYXN0IGhhc2ggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQkhBU0gwCQkweDczMCAgIC8qIG11bHRpY2FzdCBoYXNoIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgQUZSMgkJMHg3NDAgICAvKiBhZGRyZXNzIGZpbHRlcmluZyBzZXR1cD8gKi8KKyNkZWZpbmUgQUZSMQkJMHg3NTAgICAvKiBhZGRyZXNzIGZpbHRlcmluZyBzZXR1cD8gKi8KKyNkZWZpbmUgQUZSMAkJMHg3NjAgICAvKiBhZGRyZXNzIGZpbHRlcmluZyBzZXR1cD8gKi8KKyNkZWZpbmUgQUZDUgkJMHg3NzAgICAvKiBhZGRyZXNzIGZpbHRlciBjb21wYXJlIHJlZ2lzdGVyPyAqLworIwlkZWZpbmUJRW5hYmxlQWxsQ29tcGFyZXMgMHgwZmZmCisKKy8qIGJpdHMgaW4gWElGQyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1MDM4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgRXRoZXJuZXQgQm9uZGluZyBkcml2ZXIKKyMKKworb2JqLSQoQ09ORklHX0JPTkRJTkcpICs9IGJvbmRpbmcubworCitib25kaW5nLW9ianMgOj0gYm9uZF9tYWluLm8gYm9uZF8zYWQubyBib25kX2FsYi5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF8zYWQuYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF8zYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjMzYzRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5jCkBAIC0wLDAgKzEsMjQ1MSBAQAorLyoKKyAqIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICoKKyAqIENoYW5nZXM6CisgKgorICogMjAwMy8wNS8wMSAtIFRzaXBweSBNZW5kZWxzb24gPHRzaXBweS5tZW5kZWxzb24gYXQgaW50ZWwgZG90IGNvbT4gYW5kCisgKgkJQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQWRkZWQgc3VwcG9ydCBmb3IgbGFjcF9yYXRlIG1vZHVsZSBwYXJhbS4KKyAqCisgKiAyMDAzLzA1LzAxIC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIEJhc2VkIG9uIGRpc2N1c3Npb24gb24gbWFpbGluZyBsaXN0LCBjaGFuZ2VkIGxvY2tpbmcgc2NoZW1lCisgKgkgIHRvIHVzZSBsb2NrL3VubG9jayBvciBsb2NrX2JoL3VubG9ja19iaCBhcHByb3ByaWF0ZWx5IGluc3RlYWQKKyAqCSAgb2YgbG9ja19pcnFzYXZlL3VubG9ja19pcnFyZXN0b3JlLiBUaGUgbmV3IHNjaGVtZSBoZWxwcyBleHBvc2luZworICoJICBoaWRkZW4gYnVncyBhbmQgc29sdmVzIHN5c3RlbSBoYW5ncyB0aGF0IG9jY3VycmVkIGR1ZSB0byB0aGUgZmFjdAorICoJICB0aGF0IGhvbGRpbmcgbG9ja19pcnFzYXZlIGRvZXNuJ3QgcHJldmVudCBzb2Z0aXJxcyBmcm9tIHJ1bm5pbmcuCisgKgkgIFRoaXMgYWxzbyBpbmNyZWFzZXMgdG90YWwgdGhyb3VnaHB1dCBzaW5jZSBpbnRlcnJ1cHRzIGFyZSBub3QKKyAqCSAgYmxvY2tlZCBvbiBlYWNoIHRyYW5zbWl0dGVkIHBhY2tldHMgb3IgbW9uaXRvciB0aW1lb3V0LgorICoKKyAqIDIwMDMvMDUvMDEgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gUmVuYW1lZCBib25kXzNhZF9saW5rX3N0YXR1c19jaGFuZ2VkKCkgdG8KKyAqCSAgYm9uZF8zYWRfaGFuZGxlX2xpbmtfY2hhbmdlKCkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBUTEIuCisgKgorICogMjAwMy8wNS8yMCAtIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKgktIEZpeCBsb25nIGZhaWwgb3ZlciB0aW1lIHdoZW4gcmVsZWFzaW5nIGxhc3Qgc2xhdmUgb2YgYW4gYWN0aXZlCisgKgkgIGFnZ3JlZ2F0b3IgLSBzZW5kIExBQ1BEVSBvbiB1bmJpbmQgb2Ygc2xhdmUgdG8gdGVsbCBwYXJ0bmVyIHRoaXMKKyAqCSAgcG9ydCBpcyBubyBsb25nZXIgYWdncmVnYXRhYmxlLgorICoKKyAqIDIwMDMvMDYvMjUgLSBUc2lwcHkgTWVuZGVsc29uIDx0c2lwcHkubWVuZGVsc29uIGF0IGludGVsIGRvdCBjb20+CisgKgktIFNlbmQgTEFDUERVIGFzIGhpZ2hlc3QgcHJpb3JpdHkgcGFja2V0IHRvIGZ1cnRoZXIgZml4IHRoZSBhYm92ZQorICoJICBwcm9ibGVtIG9uIHZlcnkgaGlnaCBUeCB0cmFmZmljIGxvYWQgd2hlcmUgcGFja2V0cyBtYXkgZ2V0IGRyb3BwZWQKKyAqCSAgYnkgdGhlIHNsYXZlLgorICoKKyAqIDIwMDMvMTIvMDEgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQ29kZSBjbGVhbnVwIGFuZCBzdHlsZSBjaGFuZ2VzCisgKi8KKworLy8jZGVmaW5lIEJPTkRJTkdfREVCVUcgMQorCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ib25kaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSAiYm9uZGluZy5oIgorI2luY2x1ZGUgImJvbmRfM2FkLmgiCisKKy8vIEdlbmVyYWwgZGVmaW5pdGlvbnMKKyNkZWZpbmUgQURfU0hPUlRfVElNRU9VVCAgICAgICAgICAgMQorI2RlZmluZSBBRF9MT05HX1RJTUVPVVQgICAgICAgICAgICAwCisjZGVmaW5lIEFEX1NUQU5EQlkgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBBRF9NQVhfVFhfSU5fU0VDT05EICAgICAgICAzCisjZGVmaW5lIEFEX0NPTExFQ1RPUl9NQVhfREVMQVkgICAgIDAKKworLy8gVGltZXIgZGVmaW5pdGlvbnMoNDMuNC40IGluIHRoZSA4MDIuM2FkIHN0YW5kYXJkKQorI2RlZmluZSBBRF9GQVNUX1BFUklPRElDX1RJTUUgICAgICAxCisjZGVmaW5lIEFEX1NMT1dfUEVSSU9ESUNfVElNRSAgICAgIDMwCisjZGVmaW5lIEFEX1NIT1JUX1RJTUVPVVRfVElNRSAgICAgICgzKkFEX0ZBU1RfUEVSSU9ESUNfVElNRSkKKyNkZWZpbmUgQURfTE9OR19USU1FT1VUX1RJTUUgICAgICAgKDMqQURfU0xPV19QRVJJT0RJQ19USU1FKQorI2RlZmluZSBBRF9DSFVSTl9ERVRFQ1RJT05fVElNRSAgICA2MAorI2RlZmluZSBBRF9BR0dSRUdBVEVfV0FJVF9USU1FICAgICAyCisKKy8vIFBvcnQgc3RhdGUgZGVmaW5pdGlvbnMoNDMuNC4yLjIgaW4gdGhlIDgwMi4zYWQgc3RhbmRhcmQpCisjZGVmaW5lIEFEX1NUQVRFX0xBQ1BfQUNUSVZJVFkgICAweDEKKyNkZWZpbmUgQURfU1RBVEVfTEFDUF9USU1FT1VUICAgIDB4MgorI2RlZmluZSBBRF9TVEFURV9BR0dSRUdBVElPTiAgICAgMHg0CisjZGVmaW5lIEFEX1NUQVRFX1NZTkNIUk9OSVpBVElPTiAweDgKKyNkZWZpbmUgQURfU1RBVEVfQ09MTEVDVElORyAgICAgIDB4MTAKKyNkZWZpbmUgQURfU1RBVEVfRElTVFJJQlVUSU5HICAgIDB4MjAKKyNkZWZpbmUgQURfU1RBVEVfREVGQVVMVEVEICAgICAgIDB4NDAKKyNkZWZpbmUgQURfU1RBVEVfRVhQSVJFRCAgICAgICAgIDB4ODAKKworLy8gUG9ydCBWYXJpYWJsZXMgZGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgU3RhdGUgTWFjaGluZXMoNDMuNC43IGluIHRoZSA4MDIuM2FkIHN0YW5kYXJkKQorI2RlZmluZSBBRF9QT1JUX0JFR0lOICAgICAgICAgICAweDEKKyNkZWZpbmUgQURfUE9SVF9MQUNQX0VOQUJMRUQgICAgMHgyCisjZGVmaW5lIEFEX1BPUlRfQUNUT1JfQ0hVUk4gICAgIDB4NAorI2RlZmluZSBBRF9QT1JUX1BBUlRORVJfQ0hVUk4gICAweDgKKyNkZWZpbmUgQURfUE9SVF9SRUFEWSAgICAgICAgICAgMHgxMAorI2RlZmluZSBBRF9QT1JUX1JFQURZX04gICAgICAgICAweDIwCisjZGVmaW5lIEFEX1BPUlRfTUFUQ0hFRCAgICAgICAgIDB4NDAKKyNkZWZpbmUgQURfUE9SVF9TVEFOREJZICAgICAgICAgMHg4MAorI2RlZmluZSBBRF9QT1JUX1NFTEVDVEVEICAgICAgICAweDEwMAorI2RlZmluZSBBRF9QT1JUX01PVkVEICAgICAgICAgICAweDIwMAorCisvLyBQb3J0IEtleSBkZWZpbml0aW9ucworLy8ga2V5IGlzIGRldGVybWluZWQgYWNjb3JkaW5nIHRvIHRoZSBsaW5rIHNwZWVkLCBkdXBsZXggYW5kCisvLyB1c2VyIGtleSh3aGljaCBpcyB5ZXQgbm90IHN1cHBvcnRlZCkKKy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBvcnQga2V5IDogICB8IFVzZXIga2V5ICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgU3BlZWQgICAgICAgfER1cGxleHwKKy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAgICAgICAgICAgICAgMSAwCisjZGVmaW5lICBBRF9EVVBMRVhfS0VZX0JJVFMgICAgMHgxCisjZGVmaW5lICBBRF9TUEVFRF9LRVlfQklUUyAgICAgMHgzRQorI2RlZmluZSAgQURfVVNFUl9LRVlfQklUUyAgICAgIDB4RkZDMAorCisvL2RhbGxvdW4KKyNkZWZpbmUgICAgIEFEX0xJTktfU1BFRURfQklUTUFTS18xTUJQUyAgICAgICAweDEKKyNkZWZpbmUgICAgIEFEX0xJTktfU1BFRURfQklUTUFTS18xME1CUFMgICAgICAweDIKKyNkZWZpbmUgICAgIEFEX0xJTktfU1BFRURfQklUTUFTS18xMDBNQlBTICAgICAweDQKKyNkZWZpbmUgICAgIEFEX0xJTktfU1BFRURfQklUTUFTS18xMDAwTUJQUyAgICAweDgKKy8vZW5kYWxsb3VuCisKKy8vIGNvbXBhcmUgTUFDIGFkZHJlc3NlcworI2RlZmluZSBNQUNfQUREUkVTU19DT01QQVJFKEEsIEIpIG1lbWNtcChBLCBCLCBFVEhfQUxFTikKKworc3RhdGljIHN0cnVjdCBtYWNfYWRkciBudWxsX21hY19hZGRyID0ge3swLCAwLCAwLCAwLCAwLCAwfX07CitzdGF0aWMgdTE2IGFkX3RpY2tzX3Blcl9zZWM7CitzdGF0aWMgY29uc3QgaW50IGFkX2RlbHRhX2luX3RpY2tzID0gKEFEX1RJTUVSX0lOVEVSVkFMICogSFopIC8gMTAwMDsKKworLy8gPT09PT09PT09PT09PT09PT0gM0FEIGFwaSB0byBib25kaW5nIGFuZCBrZXJuZWwgY29kZSA9PT09PT09PT09PT09PT09PT0KK3N0YXRpYyB1MTYgX19nZXRfbGlua19zcGVlZChzdHJ1Y3QgcG9ydCAqcG9ydCk7CitzdGF0aWMgdTggX19nZXRfZHVwbGV4KHN0cnVjdCBwb3J0ICpwb3J0KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXRpYWxpemVfcG9ydF9sb2NrcyhzdHJ1Y3QgcG9ydCAqcG9ydCk7CisvL2NvbnZlcnNpb25zCitzdGF0aWMgdm9pZCBfX250b2hzX2xhY3BkdShzdHJ1Y3QgbGFjcGR1ICpsYWNwZHUpOworc3RhdGljIHUxNiBfX2FkX3RpbWVyX3RvX3RpY2tzKHUxNiB0aW1lcl90eXBlLCB1MTYgUGFyKTsKKworCisvLyA9PT09PT09PT09PT09PT09PSBhZCBjb2RlIGhlbHBlciBmdW5jdGlvbnMgPT09PT09PT09PT09PT09PT09CisvL25lZWRlZCBieSBhZF9yeF9tYWNoaW5lKC4uLikKK3N0YXRpYyB2b2lkIF9fcmVjb3JkX3BkdShzdHJ1Y3QgbGFjcGR1ICpsYWNwZHUsIHN0cnVjdCBwb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIF9fcmVjb3JkX2RlZmF1bHQoc3RydWN0IHBvcnQgKnBvcnQpOworc3RhdGljIHZvaWQgX191cGRhdGVfc2VsZWN0ZWQoc3RydWN0IGxhY3BkdSAqbGFjcGR1LCBzdHJ1Y3QgcG9ydCAqcG9ydCk7CitzdGF0aWMgdm9pZCBfX3VwZGF0ZV9kZWZhdWx0X3NlbGVjdGVkKHN0cnVjdCBwb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIF9fY2hvb3NlX21hdGNoZWQoc3RydWN0IGxhY3BkdSAqbGFjcGR1LCBzdHJ1Y3QgcG9ydCAqcG9ydCk7CitzdGF0aWMgdm9pZCBfX3VwZGF0ZV9udHQoc3RydWN0IGxhY3BkdSAqbGFjcGR1LCBzdHJ1Y3QgcG9ydCAqcG9ydCk7CisKKy8vbmVlZGVkIGZvciBhZF9tdXhfbWFjaGluZSguLikKK3N0YXRpYyB2b2lkIF9fYXR0YWNoX2JvbmRfdG9fYWdnKHN0cnVjdCBwb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIF9fZGV0YWNoX2JvbmRfZnJvbV9hZ2coc3RydWN0IHBvcnQgKnBvcnQpOworc3RhdGljIGludCBfX2FnZ19wb3J0c19hcmVfcmVhZHkoc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3IpOworc3RhdGljIHZvaWQgX19zZXRfYWdnX3BvcnRzX3JlYWR5KHN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yLCBpbnQgdmFsKTsKKworLy9uZWVkZWQgZm9yIGFkX2FnZ19zZWxlY3Rpb25fbG9naWMoLi4uKQorc3RhdGljIHUzMiBfX2dldF9hZ2dfYmFuZHdpZHRoKHN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yKTsKK3N0YXRpYyBzdHJ1Y3QgYWdncmVnYXRvciAqX19nZXRfYWN0aXZlX2FnZyhzdHJ1Y3QgYWdncmVnYXRvciAqYWdncmVnYXRvcik7CisKKworLy8gPT09PT09PT09PT09PT09PT0gbWFpbiA4MDIuM2FkIHByb3RvY29sIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09PT0KK3N0YXRpYyBpbnQgYWRfbGFjcGR1X3NlbmQoc3RydWN0IHBvcnQgKnBvcnQpOworc3RhdGljIGludCBhZF9tYXJrZXJfc2VuZChzdHJ1Y3QgcG9ydCAqcG9ydCwgc3RydWN0IG1hcmtlciAqbWFya2VyKTsKK3N0YXRpYyB2b2lkIGFkX211eF9tYWNoaW5lKHN0cnVjdCBwb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIGFkX3J4X21hY2hpbmUoc3RydWN0IGxhY3BkdSAqbGFjcGR1LCBzdHJ1Y3QgcG9ydCAqcG9ydCk7CitzdGF0aWMgdm9pZCBhZF90eF9tYWNoaW5lKHN0cnVjdCBwb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIGFkX3BlcmlvZGljX21hY2hpbmUoc3RydWN0IHBvcnQgKnBvcnQpOworc3RhdGljIHZvaWQgYWRfcG9ydF9zZWxlY3Rpb25fbG9naWMoc3RydWN0IHBvcnQgKnBvcnQpOworc3RhdGljIHZvaWQgYWRfYWdnX3NlbGVjdGlvbl9sb2dpYyhzdHJ1Y3QgYWdncmVnYXRvciAqYWdncmVnYXRvcik7CitzdGF0aWMgdm9pZCBhZF9jbGVhcl9hZ2coc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3IpOworc3RhdGljIHZvaWQgYWRfaW5pdGlhbGl6ZV9hZ2coc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3IpOworc3RhdGljIHZvaWQgYWRfaW5pdGlhbGl6ZV9wb3J0KHN0cnVjdCBwb3J0ICpwb3J0LCBpbnQgbGFjcF9mYXN0KTsKK3N0YXRpYyB2b2lkIGFkX2luaXRpYWxpemVfbGFjcGR1KHN0cnVjdCBsYWNwZHUgKkxhY3BkdSk7CitzdGF0aWMgdm9pZCBhZF9lbmFibGVfY29sbGVjdGluZ19kaXN0cmlidXRpbmcoc3RydWN0IHBvcnQgKnBvcnQpOworc3RhdGljIHZvaWQgYWRfZGlzYWJsZV9jb2xsZWN0aW5nX2Rpc3RyaWJ1dGluZyhzdHJ1Y3QgcG9ydCAqcG9ydCk7CitzdGF0aWMgdm9pZCBhZF9tYXJrZXJfaW5mb19yZWNlaXZlZChzdHJ1Y3QgbWFya2VyICptYXJrZXJfaW5mbywgc3RydWN0IHBvcnQgKnBvcnQpOworc3RhdGljIHZvaWQgYWRfbWFya2VyX3Jlc3BvbnNlX3JlY2VpdmVkKHN0cnVjdCBtYXJrZXIgKm1hcmtlciwgc3RydWN0IHBvcnQgKnBvcnQpOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gPT09PT09PT09PT09PT09PT0gYXBpIHRvIGJvbmRpbmcgYW5kIGtlcm5lbCBjb2RlID09PT09PT09PT09PT09PT09PQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogX19nZXRfYm9uZF9ieV9wb3J0IC0gZ2V0IHRoZSBwb3J0J3MgYm9uZGluZyBzdHJ1Y3QKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogUmV0dXJuIEBwb3J0J3MgYm9uZGluZyBzdHJ1Y3QsIG9yICVOVUxMIGlmIGl0IGNhbid0IGJlIGZvdW5kLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBib25kaW5nICpfX2dldF9ib25kX2J5X3BvcnQoc3RydWN0IHBvcnQgKnBvcnQpCit7CisJaWYgKHBvcnQtPnNsYXZlID09IE5VTEwpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGJvbmRfZ2V0X2JvbmRfYnlfc2xhdmUocG9ydC0+c2xhdmUpOworfQorCisvKioKKyAqIF9fZ2V0X2ZpcnN0X3BvcnQgLSBnZXQgdGhlIGZpcnN0IHBvcnQgaW4gdGhlIGJvbmQKKyAqIEBib25kOiB0aGUgYm9uZCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogUmV0dXJuIHRoZSBwb3J0IG9mIHRoZSBmaXJzdCBzbGF2ZSBpbiBAYm9uZCwgb3IgJU5VTEwgaWYgaXQgY2FuJ3QgYmUgZm91bmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBvcnQgKl9fZ2V0X2ZpcnN0X3BvcnQoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJaWYgKGJvbmQtPnNsYXZlX2NudCA9PSAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAmKFNMQVZFX0FEX0lORk8oYm9uZC0+Zmlyc3Rfc2xhdmUpLnBvcnQpOworfQorCisvKioKKyAqIF9fZ2V0X25leHRfcG9ydCAtIGdldCB0aGUgbmV4dCBwb3J0IGluIHRoZSBib25kCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqIFJldHVybiB0aGUgcG9ydCBvZiB0aGUgc2xhdmUgdGhhdCBpcyBuZXh0IGluIGxpbmUgb2YgQHBvcnQncyBzbGF2ZSBpbiB0aGUKKyAqIGJvbmQsIG9yICVOVUxMIGlmIGl0IGNhbid0IGJlIGZvdW5kLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3J0ICpfX2dldF9uZXh0X3BvcnQoc3RydWN0IHBvcnQgKnBvcnQpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBfX2dldF9ib25kX2J5X3BvcnQocG9ydCk7CisJc3RydWN0IHNsYXZlICpzbGF2ZSA9IHBvcnQtPnNsYXZlOworCisJLy8gSWYgdGhlcmUncyBubyBib25kIGZvciB0aGlzIHBvcnQsIG9yIHRoaXMgaXMgdGhlIGxhc3Qgc2xhdmUKKwlpZiAoKGJvbmQgPT0gTlVMTCkgfHwgKHNsYXZlLT5uZXh0ID09IGJvbmQtPmZpcnN0X3NsYXZlKSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gJihTTEFWRV9BRF9JTkZPKHNsYXZlLT5uZXh0KS5wb3J0KTsKK30KKworLyoqCisgKiBfX2dldF9maXJzdF9hZ2cgLSBnZXQgdGhlIGZpcnN0IGFnZ3JlZ2F0b3IgaW4gdGhlIGJvbmQKKyAqIEBib25kOiB0aGUgYm9uZCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogUmV0dXJuIHRoZSBhZ2dyZWdhdG9yIG9mIHRoZSBmaXJzdCBzbGF2ZSBpbiBAYm9uZCwgb3IgJU5VTEwgaWYgaXQgY2FuJ3QgYmUKKyAqIGZvdW5kLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhZ2dyZWdhdG9yICpfX2dldF9maXJzdF9hZ2coc3RydWN0IHBvcnQgKnBvcnQpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBfX2dldF9ib25kX2J5X3BvcnQocG9ydCk7CisKKwkvLyBJZiB0aGVyZSdzIG5vIGJvbmQgZm9yIHRoaXMgcG9ydCwgb3IgYm9uZCBoYXMgbm8gc2xhdmVzCisJaWYgKChib25kID09IE5VTEwpIHx8IChib25kLT5zbGF2ZV9jbnQgPT0gMCkpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuICYoU0xBVkVfQURfSU5GTyhib25kLT5maXJzdF9zbGF2ZSkuYWdncmVnYXRvcik7Cit9CisKKy8qKgorICogX19nZXRfbmV4dF9hZ2cgLSBnZXQgdGhlIG5leHQgYWdncmVnYXRvciBpbiB0aGUgYm9uZAorICogQGFnZ3JlZ2F0b3I6IHRoZSBhZ2dyZWdhdG9yIHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKiBSZXR1cm4gdGhlIGFnZ3JlZ2F0b3Igb2YgdGhlIHNsYXZlIHRoYXQgaXMgbmV4dCBpbiBsaW5lIG9mIEBhZ2dyZWdhdG9yJ3MKKyAqIHNsYXZlIGluIHRoZSBib25kLCBvciAlTlVMTCBpZiBpdCBjYW4ndCBiZSBmb3VuZC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWdncmVnYXRvciAqX19nZXRfbmV4dF9hZ2coc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3IpCit7CisJc3RydWN0IHNsYXZlICpzbGF2ZSA9IGFnZ3JlZ2F0b3ItPnNsYXZlOworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9nZXRfYm9uZF9ieV9zbGF2ZShzbGF2ZSk7CisKKwkvLyBJZiB0aGVyZSdzIG5vIGJvbmQgZm9yIHRoaXMgYWdncmVnYXRvciwgb3IgdGhpcyBpcyB0aGUgbGFzdCBzbGF2ZQorCWlmICgoYm9uZCA9PSBOVUxMKSB8fCAoc2xhdmUtPm5leHQgPT0gYm9uZC0+Zmlyc3Rfc2xhdmUpKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAmKFNMQVZFX0FEX0lORk8oc2xhdmUtPm5leHQpLmFnZ3JlZ2F0b3IpOworfQorCisvKioKKyAqIF9fZGlzYWJsZV9wb3J0IC0gZGlzYWJsZSB0aGUgcG9ydCdzIHNsYXZlCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fZGlzYWJsZV9wb3J0KHN0cnVjdCBwb3J0ICpwb3J0KQoreworCWJvbmRfc2V0X3NsYXZlX2luYWN0aXZlX2ZsYWdzKHBvcnQtPnNsYXZlKTsKK30KKworLyoqCisgKiBfX2VuYWJsZV9wb3J0IC0gZW5hYmxlIHRoZSBwb3J0J3Mgc2xhdmUsIGlmIGl0J3MgdXAKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19lbmFibGVfcG9ydChzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlID0gcG9ydC0+c2xhdmU7CisKKwlpZiAoKHNsYXZlLT5saW5rID09IEJPTkRfTElOS19VUCkgJiYgSVNfVVAoc2xhdmUtPmRldikpIHsKKwkJYm9uZF9zZXRfc2xhdmVfYWN0aXZlX2ZsYWdzKHNsYXZlKTsKKwl9Cit9CisKKy8qKgorICogX19wb3J0X2lzX2VuYWJsZWQgLSBjaGVjayBpZiB0aGUgcG9ydCdzIHNsYXZlIGlzIGluIGFjdGl2ZSBzdGF0ZQorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fcG9ydF9pc19lbmFibGVkKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXJldHVybihwb3J0LT5zbGF2ZS0+c3RhdGUgPT0gQk9ORF9TVEFURV9BQ1RJVkUpOworfQorCisvKioKKyAqIF9fZ2V0X2FnZ19zZWxlY3Rpb25fbW9kZSAtIGdldCB0aGUgYWdncmVnYXRvciBzZWxlY3Rpb24gbW9kZQorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKiBHZXQgdGhlIGFnZ3JlZ2F0b3Igc2VsZWN0aW9uIG1vZGUuIENhbiBiZSAlQkFORFdJRFRIIG9yICVDT1VOVC4KKyAqLworc3RhdGljIGlubGluZSB1MzIgX19nZXRfYWdnX3NlbGVjdGlvbl9tb2RlKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gX19nZXRfYm9uZF9ieV9wb3J0KHBvcnQpOworCisJaWYgKGJvbmQgPT0gTlVMTCkgeworCQlyZXR1cm4gQURfQkFORFdJRFRIOworCX0KKworCXJldHVybiBCT05EX0FEX0lORk8oYm9uZCkuYWdnX3NlbGVjdF9tb2RlOworfQorCisvKioKKyAqIF9fY2hlY2tfYWdnX3NlbGVjdGlvbl90aW1lciAtIGNoZWNrIGlmIHRoZSBzZWxlY3Rpb24gdGltZXIgaGFzIGV4cGlyZWQKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICovCitzdGF0aWMgaW5saW5lIGludCBfX2NoZWNrX2FnZ19zZWxlY3Rpb25fdGltZXIoc3RydWN0IHBvcnQgKnBvcnQpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBfX2dldF9ib25kX2J5X3BvcnQocG9ydCk7CisKKwlpZiAoYm9uZCA9PSBOVUxMKSB7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBCT05EX0FEX0lORk8oYm9uZCkuYWdnX3NlbGVjdF90aW1lciA/IDEgOiAwOworfQorCisvKioKKyAqIF9fZ2V0X3J4X21hY2hpbmVfbG9jayAtIGxvY2sgdGhlIHBvcnQncyBSWCBtYWNoaW5lCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fZ2V0X3J4X21hY2hpbmVfbG9jayhzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlzcGluX2xvY2soJihTTEFWRV9BRF9JTkZPKHBvcnQtPnNsYXZlKS5yeF9tYWNoaW5lX2xvY2spKTsKK30KKworLyoqCisgKiBfX3JlbGVhc2VfcnhfbWFjaGluZV9sb2NrIC0gdW5sb2NrIHRoZSBwb3J0J3MgUlggbWFjaGluZQorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3JlbGVhc2VfcnhfbWFjaGluZV9sb2NrKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXNwaW5fdW5sb2NrKCYoU0xBVkVfQURfSU5GTyhwb3J0LT5zbGF2ZSkucnhfbWFjaGluZV9sb2NrKSk7Cit9CisKKy8qKgorICogX19nZXRfbGlua19zcGVlZCAtIGdldCBhIHBvcnQncyBzcGVlZAorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKiBSZXR1cm4gQHBvcnQncyBzcGVlZCBpbiA4MDIuM2FkIGJpdG1hc2sgZm9ybWF0LiBpLmUuIG9uZSBvZjoKKyAqICAgICAwLAorICogICAgICVBRF9MSU5LX1NQRUVEX0JJVE1BU0tfMTBNQlBTLAorICogICAgICVBRF9MSU5LX1NQRUVEX0JJVE1BU0tfMTAwTUJQUywKKyAqICAgICAlQURfTElOS19TUEVFRF9CSVRNQVNLXzEwMDBNQlBTCisgKi8KK3N0YXRpYyB1MTYgX19nZXRfbGlua19zcGVlZChzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlID0gcG9ydC0+c2xhdmU7CisJdTE2IHNwZWVkOworCisJLyogdGhpcyBpZiBjb3ZlcnMgb25seSBhIHNwZWNpYWwgY2FzZTogd2hlbiB0aGUgY29uZmlndXJhdGlvbiBzdGFydHMgd2l0aAorCSAqIGxpbmsgZG93biwgaXQgc2V0cyB0aGUgc3BlZWQgdG8gMC4KKwkgKiBUaGlzIGlzIGRvbmUgaW4gc3BpdGUgb2YgdGhlIGZhY3QgdGhhdCB0aGUgZTEwMCBkcml2ZXIgcmVwb3J0cyAwIHRvIGJlCisJICogY29tcGF0aWJsZSB3aXRoIE1WVCBpbiB0aGUgZnV0dXJlLiovCisJaWYgKHNsYXZlLT5saW5rICE9IEJPTkRfTElOS19VUCkgeworCQlzcGVlZD0wOworCX0gZWxzZSB7CisJCXN3aXRjaCAoc2xhdmUtPnNwZWVkKSB7CisJCWNhc2UgU1BFRURfMTA6CisJCQlzcGVlZCA9IEFEX0xJTktfU1BFRURfQklUTUFTS18xME1CUFM7CisJCQlicmVhazsKKworCQljYXNlIFNQRUVEXzEwMDoKKwkJCXNwZWVkID0gQURfTElOS19TUEVFRF9CSVRNQVNLXzEwME1CUFM7CisJCQlicmVhazsKKworCQljYXNlIFNQRUVEXzEwMDA6CisJCQlzcGVlZCA9IEFEX0xJTktfU1BFRURfQklUTUFTS18xMDAwTUJQUzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlzcGVlZCA9IDA7IC8vIHVua25vd24gc3BlZWQgdmFsdWUgZnJvbSBldGh0b29sLiBzaG91bGRuJ3QgaGFwcGVuCisJCQlicmVhazsKKwkJfQorCX0KKworCWRwcmludGsoIlBvcnQgJWQgUmVjZWl2ZWQgbGluayBzcGVlZCAlZCB1cGRhdGUgZnJvbSBhZGFwdGVyXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlciwgc3BlZWQpOworCXJldHVybiBzcGVlZDsKK30KKworLyoqCisgKiBfX2dldF9kdXBsZXggLSBnZXQgYSBwb3J0J3MgZHVwbGV4CisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqIFJldHVybiBAcG9ydCdzIGR1cGxleCBpbiA4MDIuM2FkIGJpdG1hc2sgZm9ybWF0LiBpLmUuOgorICogICAgIDB4MDEgaWYgaW4gZnVsbCBkdXBsZXgKKyAqICAgICAweDAwIG90aGVyd2lzZQorICovCitzdGF0aWMgdTggX19nZXRfZHVwbGV4KHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXN0cnVjdCBzbGF2ZSAqc2xhdmUgPSBwb3J0LT5zbGF2ZTsKKworCXU4IHJldHZhbDsKKworCS8vICBoYW5kbGluZyBhIHNwZWNpYWwgY2FzZTogd2hlbiB0aGUgY29uZmlndXJhdGlvbiBzdGFydHMgd2l0aAorCS8vIGxpbmsgZG93biwgaXQgc2V0cyB0aGUgZHVwbGV4IHRvIDAuCisJaWYgKHNsYXZlLT5saW5rICE9IEJPTkRfTElOS19VUCkgeworCQlyZXR2YWw9MHgwOworCX0gZWxzZSB7CisJCXN3aXRjaCAoc2xhdmUtPmR1cGxleCkgeworCQljYXNlIERVUExFWF9GVUxMOgorCQkJcmV0dmFsPTB4MTsKKwkJCWRwcmludGsoIlBvcnQgJWQgUmVjZWl2ZWQgc3RhdHVzIGZ1bGwgZHVwbGV4IHVwZGF0ZSBmcm9tIGFkYXB0ZXJcbiIsIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyKTsKKwkJCWJyZWFrOworCQljYXNlIERVUExFWF9IQUxGOgorCQlkZWZhdWx0OgorCQkJcmV0dmFsPTB4MDsKKwkJCWRwcmludGsoIlBvcnQgJWQgUmVjZWl2ZWQgc3RhdHVzIE5PVCBmdWxsIGR1cGxleCB1cGRhdGUgZnJvbSBhZGFwdGVyXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcik7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIF9faW5pdGlhbGl6ZV9wb3J0X2xvY2tzIC0gaW5pdGlhbGl6ZSBhIHBvcnQncyBSWCBtYWNoaW5lIHNwaW5sb2NrCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9faW5pdGlhbGl6ZV9wb3J0X2xvY2tzKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCS8vIG1ha2Ugc3VyZSBpdCBpc24ndCBjYWxsZWQgdHdpY2UKKwlzcGluX2xvY2tfaW5pdCgmKFNMQVZFX0FEX0lORk8ocG9ydC0+c2xhdmUpLnJ4X21hY2hpbmVfbG9jaykpOworfQorCisvL2NvbnZlcnNpb25zCisvKioKKyAqIF9fbnRvaHNfbGFjcGR1IC0gY29udmVydCB0aGUgY29udGVudHMgb2YgYSBMQUNQRFUgdG8gaG9zdCBieXRlIG9yZGVyCisgKiBAbGFjcGR1OiB0aGUgc3BlaWNpZmVkIGxhY3BkdQorICoKKyAqIEZvciBlYWNoIG11bHRpLWJ5dGUgZmllbGQgaW4gdGhlIGxhY3BkdSwgY29udmVydCBpdHMgY29udGVudAorICovCitzdGF0aWMgdm9pZCBfX250b2hzX2xhY3BkdShzdHJ1Y3QgbGFjcGR1ICpsYWNwZHUpCit7CisJaWYgKGxhY3BkdSkgeworCQlsYWNwZHUtPmFjdG9yX3N5c3RlbV9wcmlvcml0eSA9ICAgbnRvaHMobGFjcGR1LT5hY3Rvcl9zeXN0ZW1fcHJpb3JpdHkpOworCQlsYWNwZHUtPmFjdG9yX2tleSA9ICAgICAgICAgICAgICAgbnRvaHMobGFjcGR1LT5hY3Rvcl9rZXkpOworCQlsYWNwZHUtPmFjdG9yX3BvcnRfcHJpb3JpdHkgPSAgICAgbnRvaHMobGFjcGR1LT5hY3Rvcl9wb3J0X3ByaW9yaXR5KTsKKwkJbGFjcGR1LT5hY3Rvcl9wb3J0ID0gICAgICAgICAgICAgIG50b2hzKGxhY3BkdS0+YWN0b3JfcG9ydCk7CisJCWxhY3BkdS0+cGFydG5lcl9zeXN0ZW1fcHJpb3JpdHkgPSBudG9ocyhsYWNwZHUtPnBhcnRuZXJfc3lzdGVtX3ByaW9yaXR5KTsKKwkJbGFjcGR1LT5wYXJ0bmVyX2tleSA9ICAgICAgICAgICAgIG50b2hzKGxhY3BkdS0+cGFydG5lcl9rZXkpOworCQlsYWNwZHUtPnBhcnRuZXJfcG9ydF9wcmlvcml0eSA9ICAgbnRvaHMobGFjcGR1LT5wYXJ0bmVyX3BvcnRfcHJpb3JpdHkpOworCQlsYWNwZHUtPnBhcnRuZXJfcG9ydCA9ICAgICAgICAgICAgbnRvaHMobGFjcGR1LT5wYXJ0bmVyX3BvcnQpOworCQlsYWNwZHUtPmNvbGxlY3Rvcl9tYXhfZGVsYXkgPSAgICAgbnRvaHMobGFjcGR1LT5jb2xsZWN0b3JfbWF4X2RlbGF5KTsKKwl9Cit9CisKKy8qKgorICogX19hZF90aW1lcl90b190aWNrcyAtIGNvbnZlcnQgYSBnaXZlbiB0aW1lciB0eXBlIHRvIEFEIG1vZHVsZSB0aWNrcworICogQHRpbWVyX3R5cGU6CXdoaWNoIHRpbWVyIHRvIG9wZXJhdGUKKyAqIEBwYXI6IHRpbWVyIHBhcmFtZXRlci4gc2VlIGJlbG93CisgKgorICogSWYgQHRpbWVyX3R5cGUgaXMgJWN1cnJlbnRfd2hpbGVfdGltZXIsIEBwYXIgaW5kaWNhdGVzIGxvbmcvc2hvcnQgdGltZXIuCisgKiBJZiBAdGltZXJfdHlwZSBpcyAlcGVyaW9kaWNfdGltZXIsIEBwYXIgaXMgb25lIG9mICVGQVNUX1BFUklPRElDX1RJTUUsCisgKgkJCQkJCSAgICAlU0xPV19QRVJJT0RJQ19USU1FLgorICovCitzdGF0aWMgdTE2IF9fYWRfdGltZXJfdG9fdGlja3ModTE2IHRpbWVyX3R5cGUsIHUxNiBwYXIpCit7CisJdTE2IHJldHZhbD0wOwkgLy90byBzaWxlbmNlIHRoZSBjb21waWxlcgorCisJc3dpdGNoICh0aW1lcl90eXBlKSB7CisJY2FzZSBBRF9DVVJSRU5UX1dISUxFX1RJTUVSOiAgIC8vIGZvciByeCBtYWNoaW5lIHVzYWdlCisJCWlmIChwYXIpIHsJICAgICAgLy8gZm9yIHNob3J0IG9yIGxvbmcgdGltZW91dAorCQkJcmV0dmFsID0gKEFEX1NIT1JUX1RJTUVPVVRfVElNRSphZF90aWNrc19wZXJfc2VjKTsgLy8gc2hvcnQgdGltZW91dAorCQl9IGVsc2UgeworCQkJcmV0dmFsID0gKEFEX0xPTkdfVElNRU9VVF9USU1FKmFkX3RpY2tzX3Blcl9zZWMpOyAvLyBsb25nIHRpbWVvdXQKKwkJfQorCQlicmVhazsKKwljYXNlIEFEX0FDVE9SX0NIVVJOX1RJTUVSOgkgICAgLy8gZm9yIGxvY2FsIGNodXJuIG1hY2hpbmUKKwkJcmV0dmFsID0gKEFEX0NIVVJOX0RFVEVDVElPTl9USU1FKmFkX3RpY2tzX3Blcl9zZWMpOworCQlicmVhazsKKwljYXNlIEFEX1BFUklPRElDX1RJTUVSOgkgICAgLy8gZm9yIHBlcmlvZGljIG1hY2hpbmUKKwkJcmV0dmFsID0gKHBhciphZF90aWNrc19wZXJfc2VjKTsgLy8gbG9uZyB0aW1lb3V0CisJCWJyZWFrOworCWNhc2UgQURfUEFSVE5FUl9DSFVSTl9USU1FUjogICAvLyBmb3IgcmVtb3RlIGNodXJuIG1hY2hpbmUKKwkJcmV0dmFsID0gKEFEX0NIVVJOX0RFVEVDVElPTl9USU1FKmFkX3RpY2tzX3Blcl9zZWMpOworCQlicmVhazsKKwljYXNlIEFEX1dBSVRfV0hJTEVfVElNRVI6CSAgICAvLyBmb3Igc2VsZWN0aW9uIG1hY2hpbmUKKwkJcmV0dmFsID0gKEFEX0FHR1JFR0FURV9XQUlUX1RJTUUqYWRfdGlja3NfcGVyX3NlYyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gPT09PT09PT09PT09PT09PT0gYWRfcnhfbWFjaGluZSBoZWxwZXIgZnVuY3Rpb25zID09PT09PT09PT09PT09PT09PQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogX19yZWNvcmRfcGR1IC0gcmVjb3JkIHBhcmFtZXRlcnMgZnJvbSBhIHJlY2VpdmVkIGxhY3BkdQorICogQGxhY3BkdTogdGhlIGxhY3BkdSB3ZSd2ZSByZWNlaXZlZAorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKiBSZWNvcmQgdGhlIHBhcmFtZXRlciB2YWx1ZXMgZm9yIHRoZSBBY3RvciBjYXJyaWVkIGluIGEgcmVjZWl2ZWQgbGFjcGR1IGFzCisgKiB0aGUgY3VycmVudCBwYXJ0bmVyIG9wZXJhdGlvbmFsIHBhcmFtZXRlciB2YWx1ZXMgYW5kIHNldHMKKyAqIGFjdG9yX29wZXJfcG9ydF9zdGF0ZS5kZWZhdWx0ZWQgdG8gRkFMU0UuCisgKi8KK3N0YXRpYyB2b2lkIF9fcmVjb3JkX3BkdShzdHJ1Y3QgbGFjcGR1ICpsYWNwZHUsIHN0cnVjdCBwb3J0ICpwb3J0KQoreworCS8vIHZhbGlkYXRlIGxhY3BkdSBhbmQgcG9ydAorCWlmIChsYWNwZHUgJiYgcG9ydCkgeworCQkvLyByZWNvcmQgdGhlIG5ldyBwYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgcGFydG5lciBvcGVyYXRpb25hbAorCQlwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9udW1iZXIgPSBsYWNwZHUtPmFjdG9yX3BvcnQ7CisJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3ByaW9yaXR5ID0gbGFjcGR1LT5hY3Rvcl9wb3J0X3ByaW9yaXR5OworCQlwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtID0gbGFjcGR1LT5hY3Rvcl9zeXN0ZW07CisJCXBvcnQtPnBhcnRuZXJfb3Blcl9zeXN0ZW1fcHJpb3JpdHkgPSBsYWNwZHUtPmFjdG9yX3N5c3RlbV9wcmlvcml0eTsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX2tleSA9IGxhY3BkdS0+YWN0b3Jfa2V5OworCQkvLyB6ZXJvIHBhcnRlbmVyJ3MgbGFzZSBzdGF0ZXMKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgPSAwOworCQlwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSB8PSAobGFjcGR1LT5hY3Rvcl9zdGF0ZSAmIEFEX1NUQVRFX0xBQ1BfQUNUSVZJVFkpOworCQlwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSB8PSAobGFjcGR1LT5hY3Rvcl9zdGF0ZSAmIEFEX1NUQVRFX0xBQ1BfVElNRU9VVCk7CisJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlIHw9IChsYWNwZHUtPmFjdG9yX3N0YXRlICYgQURfU1RBVEVfQUdHUkVHQVRJT04pOworCQlwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSB8PSAobGFjcGR1LT5hY3Rvcl9zdGF0ZSAmIEFEX1NUQVRFX1NZTkNIUk9OSVpBVElPTik7CisJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlIHw9IChsYWNwZHUtPmFjdG9yX3N0YXRlICYgQURfU1RBVEVfQ09MTEVDVElORyk7CisJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlIHw9IChsYWNwZHUtPmFjdG9yX3N0YXRlICYgQURfU1RBVEVfRElTVFJJQlVUSU5HKTsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgfD0gKGxhY3BkdS0+YWN0b3Jfc3RhdGUgJiBBRF9TVEFURV9ERUZBVUxURUQpOworCQlwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSB8PSAobGFjcGR1LT5hY3Rvcl9zdGF0ZSAmIEFEX1NUQVRFX0VYUElSRUQpOworCisJCS8vIHNldCBhY3Rvcl9vcGVyX3BvcnRfc3RhdGUuZGVmYXVsdGVkIHRvIEZBTFNFCisJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSAmPSB+QURfU1RBVEVfREVGQVVMVEVEOworCisJCS8vIHNldCB0aGUgcGFydG5lciBzeW5jLiB0byBvbiBpZiB0aGUgcGFydG5lciBpcyBzeW5jLiBhbmQgdGhlIHBvcnQgaXMgbWF0Y2hlZAorCQlpZiAoKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX01BVENIRUQpICYmIChsYWNwZHUtPmFjdG9yX3N0YXRlICYgQURfU1RBVEVfU1lOQ0hST05JWkFUSU9OKSkgeworCQkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgfD0gQURfU1RBVEVfU1lOQ0hST05JWkFUSU9OOworCQl9IGVsc2UgeworCQkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgJj0gfkFEX1NUQVRFX1NZTkNIUk9OSVpBVElPTjsKKwkJfQorCX0KK30KKworLyoqCisgKiBfX3JlY29yZF9kZWZhdWx0IC0gcmVjb3JkIGRlZmF1bHQgcGFyYW1ldGVycworICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlY29yZHMgdGhlIGRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIHBhcnRuZXIgY2FycmllZAorICogaW4gdGhlIFBhcnRuZXIgQWRtaW4gcGFyYW1ldGVycyBhcyB0aGUgY3VycmVudCBwYXJ0bmVyIG9wZXJhdGlvbmFsIHBhcmFtZXRlcgorICogdmFsdWVzIGFuZCBzZXRzIGFjdG9yX29wZXJfcG9ydF9zdGF0ZS5kZWZhdWx0ZWQgdG8gVFJVRS4KKyAqLworc3RhdGljIHZvaWQgX19yZWNvcmRfZGVmYXVsdChzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwkvLyB2YWxpZGF0ZSB0aGUgcG9ydAorCWlmIChwb3J0KSB7CisJCS8vIHJlY29yZCB0aGUgcGFydG5lciBhZG1pbiBwYXJhbWV0ZXJzCisJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X251bWJlciA9IHBvcnQtPnBhcnRuZXJfYWRtaW5fcG9ydF9udW1iZXI7CisJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3ByaW9yaXR5ID0gcG9ydC0+cGFydG5lcl9hZG1pbl9wb3J0X3ByaW9yaXR5OworCQlwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtID0gcG9ydC0+cGFydG5lcl9hZG1pbl9zeXN0ZW07CisJCXBvcnQtPnBhcnRuZXJfb3Blcl9zeXN0ZW1fcHJpb3JpdHkgPSBwb3J0LT5wYXJ0bmVyX2FkbWluX3N5c3RlbV9wcmlvcml0eTsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX2tleSA9IHBvcnQtPnBhcnRuZXJfYWRtaW5fa2V5OworCQlwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSA9IHBvcnQtPnBhcnRuZXJfYWRtaW5fcG9ydF9zdGF0ZTsKKworCQkvLyBzZXQgYWN0b3Jfb3Blcl9wb3J0X3N0YXRlLmRlZmF1bHRlZCB0byB0cnVlCisJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSB8PSBBRF9TVEFURV9ERUZBVUxURUQ7CisJfQorfQorCisvKioKKyAqIF9fdXBkYXRlX3NlbGVjdGVkIC0gdXBkYXRlIGEgcG9ydCdzIFNlbGVjdGVkIHZhcmlhYmxlIGZyb20gYSByZWNlaXZlZCBsYWNwZHUKKyAqIEBsYWNwZHU6IHRoZSBsYWNwZHUgd2UndmUgcmVjZWl2ZWQKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgdmFyaWFibGUsIHVzaW5nIHBhcmFtZXRlciB2YWx1ZXMgZnJvbSBhCisgKiBuZXdseSByZWNlaXZlZCBsYWNwZHUuIFRoZSBwYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgQWN0b3IgY2FycmllZCBpbiB0aGUKKyAqIHJlY2VpdmVkIFBEVSBhcmUgY29tcGFyZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb25hbCBwYXJhbWV0ZXIKKyAqIHZhbHVlcyBmb3IgdGhlIHBvcnRzIHBhcnRuZXIuIElmIG9uZSBvciBtb3JlIG9mIHRoZSBjb21wYXJpc29ucyBzaG93cyB0aGF0CisgKiB0aGUgdmFsdWUocykgcmVjZWl2ZWQgaW4gdGhlIFBEVSBkaWZmZXIgZnJvbSB0aGUgY3VycmVudCBvcGVyYXRpb25hbCB2YWx1ZXMsCisgKiB0aGVuIHNlbGVjdGVkIGlzIHNldCB0byBGQUxTRSBhbmQgYWN0b3Jfb3Blcl9wb3J0X3N0YXRlLnN5bmNocm9uaXphdGlvbiBpcworICogc2V0IHRvIG91dF9vZl9zeW5jLiBPdGhlcndpc2UsIHNlbGVjdGVkIHJlbWFpbnMgdW5jaGFuZ2VkLgorICovCitzdGF0aWMgdm9pZCBfX3VwZGF0ZV9zZWxlY3RlZChzdHJ1Y3QgbGFjcGR1ICpsYWNwZHUsIHN0cnVjdCBwb3J0ICpwb3J0KQoreworCS8vIHZhbGlkYXRlIGxhY3BkdSBhbmQgcG9ydAorCWlmIChsYWNwZHUgJiYgcG9ydCkgeworCQkvLyBjaGVjayBpZiBhbnkgcGFyYW1ldGVyIGlzIGRpZmZlcmVudAorCQlpZiAoKGxhY3BkdS0+YWN0b3JfcG9ydCAhPSBwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9udW1iZXIpIHx8CisJCSAgICAobGFjcGR1LT5hY3Rvcl9wb3J0X3ByaW9yaXR5ICE9IHBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3ByaW9yaXR5KSB8fAorCQkgICAgTUFDX0FERFJFU1NfQ09NUEFSRSgmKGxhY3BkdS0+YWN0b3Jfc3lzdGVtKSwgJihwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtKSkgfHwKKwkJICAgIChsYWNwZHUtPmFjdG9yX3N5c3RlbV9wcmlvcml0eSAhPSBwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtX3ByaW9yaXR5KSB8fAorCQkgICAgKGxhY3BkdS0+YWN0b3Jfa2V5ICE9IHBvcnQtPnBhcnRuZXJfb3Blcl9rZXkpIHx8CisJCSAgICAoKGxhY3BkdS0+YWN0b3Jfc3RhdGUgJiBBRF9TVEFURV9BR0dSRUdBVElPTikgIT0gKHBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlICYgQURfU1RBVEVfQUdHUkVHQVRJT04pKQorCQkgICApIHsKKwkJCS8vIHVwZGF0ZSB0aGUgc3RhdGUgbWFjaGluZSBTZWxlY3RlZCB2YXJpYWJsZQorCQkJcG9ydC0+c21fdmFycyAmPSB+QURfUE9SVF9TRUxFQ1RFRDsKKwkJfQorCX0KK30KKworLyoqCisgKiBfX3VwZGF0ZV9kZWZhdWx0X3NlbGVjdGVkIC0gdXBkYXRlIGEgcG9ydCdzIFNlbGVjdGVkIHZhcmlhYmxlIGZyb20gUGFydG5lcgorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHZhbHVlIG9mIHRoZSBzZWxlY3RlZCB2YXJpYWJsZSwgdXNpbmcgdGhlIHBhcnRuZXIKKyAqIGFkbWluaXN0cmF0aXZlIHBhcmFtZXRlciB2YWx1ZXMuIFRoZSBhZG1pbmlzdHJhdGl2ZSB2YWx1ZXMgYXJlIGNvbXBhcmVkIHdpdGgKKyAqIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbmFsIHBhcmFtZXRlciB2YWx1ZXMgZm9yIHRoZSBwYXJ0bmVyLiBJZiBvbmUgb3IKKyAqIG1vcmUgb2YgdGhlIGNvbXBhcmlzb25zIHNob3dzIHRoYXQgdGhlIGFkbWluaXN0cmF0aXZlIHZhbHVlKHMpIGRpZmZlciBmcm9tCisgKiB0aGUgY3VycmVudCBvcGVyYXRpb25hbCB2YWx1ZXMsIHRoZW4gU2VsZWN0ZWQgaXMgc2V0IHRvIEZBTFNFIGFuZAorICogYWN0b3Jfb3Blcl9wb3J0X3N0YXRlLnN5bmNocm9uaXphdGlvbiBpcyBzZXQgdG8gT1VUX09GX1NZTkMuIE90aGVyd2lzZSwKKyAqIFNlbGVjdGVkIHJlbWFpbnMgdW5jaGFuZ2VkLgorICovCitzdGF0aWMgdm9pZCBfX3VwZGF0ZV9kZWZhdWx0X3NlbGVjdGVkKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCS8vIHZhbGlkYXRlIHRoZSBwb3J0CisJaWYgKHBvcnQpIHsKKwkJLy8gY2hlY2sgaWYgYW55IHBhcmFtZXRlciBpcyBkaWZmZXJlbnQKKwkJaWYgKChwb3J0LT5wYXJ0bmVyX2FkbWluX3BvcnRfbnVtYmVyICE9IHBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X251bWJlcikgfHwKKwkJICAgIChwb3J0LT5wYXJ0bmVyX2FkbWluX3BvcnRfcHJpb3JpdHkgIT0gcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfcHJpb3JpdHkpIHx8CisJCSAgICBNQUNfQUREUkVTU19DT01QQVJFKCYocG9ydC0+cGFydG5lcl9hZG1pbl9zeXN0ZW0pLCAmKHBvcnQtPnBhcnRuZXJfb3Blcl9zeXN0ZW0pKSB8fAorCQkgICAgKHBvcnQtPnBhcnRuZXJfYWRtaW5fc3lzdGVtX3ByaW9yaXR5ICE9IHBvcnQtPnBhcnRuZXJfb3Blcl9zeXN0ZW1fcHJpb3JpdHkpIHx8CisJCSAgICAocG9ydC0+cGFydG5lcl9hZG1pbl9rZXkgIT0gcG9ydC0+cGFydG5lcl9vcGVyX2tleSkgfHwKKwkJICAgICgocG9ydC0+cGFydG5lcl9hZG1pbl9wb3J0X3N0YXRlICYgQURfU1RBVEVfQUdHUkVHQVRJT04pICE9IChwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSAmIEFEX1NUQVRFX0FHR1JFR0FUSU9OKSkKKwkJICAgKSB7CisJCQkvLyB1cGRhdGUgdGhlIHN0YXRlIG1hY2hpbmUgU2VsZWN0ZWQgdmFyaWFibGUKKwkJCXBvcnQtPnNtX3ZhcnMgJj0gfkFEX1BPUlRfU0VMRUNURUQ7CisJCX0KKwl9Cit9CisKKy8qKgorICogX19jaG9vc2VfbWF0Y2hlZCAtIHVwZGF0ZSBhIHBvcnQncyBtYXRjaGVkIHZhcmlhYmxlIGZyb20gYSByZWNlaXZlZCBsYWNwZHUKKyAqIEBsYWNwZHU6IHRoZSBsYWNwZHUgd2UndmUgcmVjZWl2ZWQKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgbWF0Y2hlZCB2YXJpYWJsZSwgdXNpbmcgcGFyYW1ldGVyIHZhbHVlcyBmcm9tIGEKKyAqIG5ld2x5IHJlY2VpdmVkIGxhY3BkdS4gUGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIHBhcnRuZXIgY2FycmllZCBpbiB0aGUKKyAqIHJlY2VpdmVkIFBEVSBhcmUgY29tcGFyZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb25hbCBwYXJhbWV0ZXIKKyAqIHZhbHVlcyBmb3IgdGhlIGFjdG9yLiBNYXRjaGVkIGlzIHNldCB0byBUUlVFIGlmIGFsbCBvZiB0aGVzZSBwYXJhbWV0ZXJzCisgKiBtYXRjaCBhbmQgdGhlIFBEVSBwYXJhbWV0ZXIgcGFydG5lcl9zdGF0ZS5hZ2dyZWdhdGlvbiBoYXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAqIGFjdG9yX29wZXJfcG9ydF9zdGF0ZS5hZ2dyZWdhdGlvbiBhbmQgbGFjcCB3aWxsIGFjdGl2ZWx5IG1haW50YWluIHRoZSBsaW5rCisgKiBpbiB0aGUgYWdncmVnYXRpb24uIE1hdGNoZWQgaXMgYWxzbyBzZXQgdG8gVFJVRSBpZiB0aGUgdmFsdWUgb2YKKyAqIGFjdG9yX3N0YXRlLmFnZ3JlZ2F0aW9uIGluIHRoZSByZWNlaXZlZCBQRFUgaXMgc2V0IHRvIEZBTFNFLCBpLmUuLCBpbmRpY2F0ZXMKKyAqIGFuIGluZGl2aWR1YWwgbGluayBhbmQgbGFjcCB3aWxsIGFjdGl2ZWx5IG1haW50YWluIHRoZSBsaW5rLiBPdGhlcndpc2UsCisgKiBtYXRjaGVkIGlzIHNldCB0byBGQUxTRS4gTEFDUCBpcyBjb25zaWRlcmVkIHRvIGJlIGFjdGl2ZWx5IG1haW50YWluaW5nIHRoZQorICogbGluayBpZiBlaXRoZXIgdGhlIFBEVSdzIGFjdG9yX3N0YXRlLmxhY3BfYWN0aXZpdHkgdmFyaWFibGUgaXMgVFJVRSBvciBib3RoCisgKiB0aGUgYWN0b3IncyBhY3Rvcl9vcGVyX3BvcnRfc3RhdGUubGFjcF9hY3Rpdml0eSBhbmQgdGhlIFBEVSdzCisgKiBwYXJ0bmVyX3N0YXRlLmxhY3BfYWN0aXZpdHkgdmFyaWFibGVzIGFyZSBUUlVFLgorICovCitzdGF0aWMgdm9pZCBfX2Nob29zZV9tYXRjaGVkKHN0cnVjdCBsYWNwZHUgKmxhY3BkdSwgc3RydWN0IHBvcnQgKnBvcnQpCit7CisJLy8gdmFsaWRhdGUgbGFjcGR1IGFuZCBwb3J0CisJaWYgKGxhY3BkdSAmJiBwb3J0KSB7CisJCS8vIGNoZWNrIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBhbGlrZQorCQlpZiAoKChsYWNwZHUtPnBhcnRuZXJfcG9ydCA9PSBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcikgJiYKKwkJICAgICAobGFjcGR1LT5wYXJ0bmVyX3BvcnRfcHJpb3JpdHkgPT0gcG9ydC0+YWN0b3JfcG9ydF9wcmlvcml0eSkgJiYKKwkJICAgICAhTUFDX0FERFJFU1NfQ09NUEFSRSgmKGxhY3BkdS0+cGFydG5lcl9zeXN0ZW0pLCAmKHBvcnQtPmFjdG9yX3N5c3RlbSkpICYmCisJCSAgICAgKGxhY3BkdS0+cGFydG5lcl9zeXN0ZW1fcHJpb3JpdHkgPT0gcG9ydC0+YWN0b3Jfc3lzdGVtX3ByaW9yaXR5KSAmJgorCQkgICAgIChsYWNwZHUtPnBhcnRuZXJfa2V5ID09IHBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXkpICYmCisJCSAgICAgKChsYWNwZHUtPnBhcnRuZXJfc3RhdGUgJiBBRF9TVEFURV9BR0dSRUdBVElPTikgPT0gKHBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSAmIEFEX1NUQVRFX0FHR1JFR0FUSU9OKSkpIHx8CisJCSAgICAvLyBvciB0aGlzIGlzIGluZGl2aWR1YWwgbGluayhhZ2dyZWdhdGlvbiA9PSBGQUxTRSkKKwkJICAgICgobGFjcGR1LT5hY3Rvcl9zdGF0ZSAmIEFEX1NUQVRFX0FHR1JFR0FUSU9OKSA9PSAwKQorCQkgICApIHsKKwkJCS8vIHVwZGF0ZSB0aGUgc3RhdGUgbWFjaGluZSBNYXRjaGVkIHZhcmlhYmxlCisJCQlwb3J0LT5zbV92YXJzIHw9IEFEX1BPUlRfTUFUQ0hFRDsKKwkJfSBlbHNlIHsKKwkJCXBvcnQtPnNtX3ZhcnMgJj0gfkFEX1BPUlRfTUFUQ0hFRDsKKwkJfQorCX0KK30KKworLyoqCisgKiBfX3VwZGF0ZV9udHQgLSB1cGRhdGUgYSBwb3J0J3MgbnR0IHZhcmlhYmxlIGZyb20gYSByZWNlaXZlZCBsYWNwZHUKKyAqIEBsYWNwZHU6IHRoZSBsYWNwZHUgd2UndmUgcmVjZWl2ZWQKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogVXBkYXRlcyB0aGUgdmFsdWUgb2YgdGhlIG50dCB2YXJpYWJsZSwgdXNpbmcgcGFyYW1ldGVyIHZhbHVlcyBmcm9tIGEgbmV3bHkKKyAqIHJlY2VpdmVkIGxhY3BkdS4gVGhlIHBhcmFtZXRlciB2YWx1ZXMgZm9yIHRoZSBwYXJ0bmVyIGNhcnJpZWQgaW4gdGhlCisgKiByZWNlaXZlZCBQRFUgYXJlIGNvbXBhcmVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uYWwgcGFyYW1ldGVyCisgKiB2YWx1ZXMgZm9yIHRoZSBBY3Rvci4gSWYgb25lIG9yIG1vcmUgb2YgdGhlIGNvbXBhcmlzb25zIHNob3dzIHRoYXQgdGhlCisgKiB2YWx1ZShzKSByZWNlaXZlZCBpbiB0aGUgUERVIGRpZmZlciBmcm9tIHRoZSBjdXJyZW50IG9wZXJhdGlvbmFsIHZhbHVlcywKKyAqIHRoZW4gbnR0IGlzIHNldCB0byBUUlVFLiBPdGhlcndpc2UsIG50dCByZW1haW5zIHVuY2hhbmdlZC4KKyAqLworc3RhdGljIHZvaWQgX191cGRhdGVfbnR0KHN0cnVjdCBsYWNwZHUgKmxhY3BkdSwgc3RydWN0IHBvcnQgKnBvcnQpCit7CisJLy8gdmFsaWRhdGUgbGFjcGR1IGFuZCBwb3J0CisJaWYgKGxhY3BkdSAmJiBwb3J0KSB7CisJCS8vIGNoZWNrIGlmIGFueSBwYXJhbWV0ZXIgaXMgZGlmZmVyZW50CisJCWlmICgobGFjcGR1LT5wYXJ0bmVyX3BvcnQgIT0gcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIpIHx8CisJCSAgICAobGFjcGR1LT5wYXJ0bmVyX3BvcnRfcHJpb3JpdHkgIT0gcG9ydC0+YWN0b3JfcG9ydF9wcmlvcml0eSkgfHwKKwkJICAgIE1BQ19BRERSRVNTX0NPTVBBUkUoJihsYWNwZHUtPnBhcnRuZXJfc3lzdGVtKSwgJihwb3J0LT5hY3Rvcl9zeXN0ZW0pKSB8fAorCQkgICAgKGxhY3BkdS0+cGFydG5lcl9zeXN0ZW1fcHJpb3JpdHkgIT0gcG9ydC0+YWN0b3Jfc3lzdGVtX3ByaW9yaXR5KSB8fAorCQkgICAgKGxhY3BkdS0+cGFydG5lcl9rZXkgIT0gcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X2tleSkgfHwKKwkJICAgICgobGFjcGR1LT5wYXJ0bmVyX3N0YXRlICYgQURfU1RBVEVfTEFDUF9BQ1RJVklUWSkgIT0gKHBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSAmIEFEX1NUQVRFX0xBQ1BfQUNUSVZJVFkpKSB8fAorCQkgICAgKChsYWNwZHUtPnBhcnRuZXJfc3RhdGUgJiBBRF9TVEFURV9MQUNQX1RJTUVPVVQpICE9IChwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJiBBRF9TVEFURV9MQUNQX1RJTUVPVVQpKSB8fAorCQkgICAgKChsYWNwZHUtPnBhcnRuZXJfc3RhdGUgJiBBRF9TVEFURV9TWU5DSFJPTklaQVRJT04pICE9IChwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJiBBRF9TVEFURV9TWU5DSFJPTklaQVRJT04pKSB8fAorCQkgICAgKChsYWNwZHUtPnBhcnRuZXJfc3RhdGUgJiBBRF9TVEFURV9BR0dSRUdBVElPTikgIT0gKHBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSAmIEFEX1NUQVRFX0FHR1JFR0FUSU9OKSkKKwkJICAgKSB7CisJCQkvLyBzZXQgbnR0IHRvIGJlIFRSVUUKKwkJCXBvcnQtPm50dCA9IDE7CisJCX0KKwl9Cit9CisKKy8qKgorICogX19hdHRhY2hfYm9uZF90b19hZ2cKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogSGFuZGxlIHRoZSBhdHRhY2hpbmcgb2YgdGhlIHBvcnQncyBjb250cm9sIHBhcnNlci9tdWx0aXBsZXhlciBhbmQgdGhlCisgKiBhZ2dyZWdhdG9yLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZyBzaW5jZSB0aGUgcGFyc2VyL211bHRpcGxleGVyIG9mIHRoZQorICogcmVjZWl2ZSBhbmQgdGhlIHBhcnNlci9tdWx0aXBsZXhlciBvZiB0aGUgYWdncmVnYXRvciBhcmUgYWxyZWFkeSBjb21iaW5lZC4KKyAqLworc3RhdGljIHZvaWQgX19hdHRhY2hfYm9uZF90b19hZ2coc3RydWN0IHBvcnQgKnBvcnQpCit7CisJcG9ydD1OVUxMOyAvLyBqdXN0IHRvIHNhdGlzZnkgdGhlIGNvbXBpbGVyCisJLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgc2luY2UgdGhlIHBhcnNlci9tdWx0aXBsZXhlciBvZiB0aGUgcmVjZWl2ZQorCS8vIGFuZCB0aGUgcGFyc2VyL211bHRpcGxleGVyIG9mIHRoZSBhZ2dyZWdhdG9yIGFyZSBhbHJlYWR5IGNvbWJpbmVkCit9CisKKy8qKgorICogX19kZXRhY2hfYm9uZF9mcm9tX2FnZworICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKiBIYW5kbGUgdGhlIGRldGFjaGluZyBvZiB0aGUgcG9ydCdzIGNvbnRyb2wgcGFyc2VyL211bHRpcGxleGVyIGZyb20gdGhlCisgKiBhZ2dyZWdhdG9yLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZyBzaW5jZSB0aGUgcGFyc2VyL211bHRpcGxleGVyIG9mIHRoZQorICogcmVjZWl2ZSBhbmQgdGhlIHBhcnNlci9tdWx0aXBsZXhlciBvZiB0aGUgYWdncmVnYXRvciBhcmUgYWxyZWFkeSBjb21iaW5lZC4KKyAqLworc3RhdGljIHZvaWQgX19kZXRhY2hfYm9uZF9mcm9tX2FnZyhzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlwb3J0PU5VTEw7IC8vIGp1c3QgdG8gc2F0aXNmeSB0aGUgY29tcGlsZXIKKwkvLyBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZyBzaWVuY2UgdGhlIHBhcnNlci9tdWx0aXBsZXhlciBvZiB0aGUgcmVjZWl2ZQorCS8vIGFuZCB0aGUgcGFyc2VyL211bHRpcGxleGVyIG9mIHRoZSBhZ2dyZWdhdG9yIGFyZSBhbHJlYWR5IGNvbWJpbmVkCit9CisKKy8qKgorICogX19hZ2dfcG9ydHNfYXJlX3JlYWR5IC0gY2hlY2sgaWYgYWxsIHBvcnRzIGluIGFuIGFnZ3JlZ2F0b3IgYXJlIHJlYWR5CisgKiBAYWdncmVnYXRvcjogdGhlIGFnZ3JlZ2F0b3Igd2UncmUgbG9va2luZyBhdAorICoKKyAqLworc3RhdGljIGludCBfX2FnZ19wb3J0c19hcmVfcmVhZHkoc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3IpCit7CisJc3RydWN0IHBvcnQgKnBvcnQ7CisJaW50IHJldHZhbCA9IDE7CisKKwlpZiAoYWdncmVnYXRvcikgeworCQkvLyBzY2FuIGFsbCBwb3J0cyBpbiB0aGlzIGFnZ3JlZ2F0b3IgdG8gdmVyZnkgaWYgdGhleSBhcmUgYWxsIHJlYWR5CisJCWZvciAocG9ydD1hZ2dyZWdhdG9yLT5sYWdfcG9ydHM7IHBvcnQ7IHBvcnQ9cG9ydC0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3IpIHsKKwkJCWlmICghKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX1JFQURZX04pKSB7CisJCQkJcmV0dmFsID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogX19zZXRfYWdnX3BvcnRzX3JlYWR5IC0gc2V0IHZhbHVlIG9mIFJlYWR5IGJpdCBpbiBhbGwgcG9ydHMgb2YgYW4gYWdncmVnYXRvcgorICogQGFnZ3JlZ2F0b3I6IHRoZSBhZ2dyZWdhdG9yIHdlJ3JlIGxvb2tpbmcgYXQKKyAqIEB2YWw6IFNob3VsZCB0aGUgcG9ydHMnIHJlYWR5IGJpdCBiZSBzZXQgb24gb3Igb2ZmCisgKgorICovCitzdGF0aWMgdm9pZCBfX3NldF9hZ2dfcG9ydHNfcmVhZHkoc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3IsIGludCB2YWwpCit7CisJc3RydWN0IHBvcnQgKnBvcnQ7CisKKwlmb3IgKHBvcnQ9YWdncmVnYXRvci0+bGFnX3BvcnRzOyBwb3J0OyBwb3J0PXBvcnQtPm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yKSB7CisJCWlmICh2YWwpIHsKKwkJCXBvcnQtPnNtX3ZhcnMgfD0gQURfUE9SVF9SRUFEWTsKKwkJfSBlbHNlIHsKKwkJCXBvcnQtPnNtX3ZhcnMgJj0gfkFEX1BPUlRfUkVBRFk7CisJCX0KKwl9Cit9CisKKy8qKgorICogX19nZXRfYWdnX2JhbmR3aWR0aCAtIGdldCB0aGUgdG90YWwgYmFuZHdpZHRoIG9mIGFuIGFnZ3JlZ2F0b3IKKyAqIEBhZ2dyZWdhdG9yOiB0aGUgYWdncmVnYXRvciB3ZSdyZSBsb29raW5nIGF0CisgKgorICovCitzdGF0aWMgdTMyIF9fZ2V0X2FnZ19iYW5kd2lkdGgoc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3IpCit7CisJdTMyIGJhbmR3aWR0aD0wOworCXUzMiBiYXNpY19zcGVlZDsKKworCWlmIChhZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHMpIHsKKwkJYmFzaWNfc3BlZWQgPSBfX2dldF9saW5rX3NwZWVkKGFnZ3JlZ2F0b3ItPmxhZ19wb3J0cyk7CisJCXN3aXRjaCAoYmFzaWNfc3BlZWQpIHsKKwkJY2FzZSBBRF9MSU5LX1NQRUVEX0JJVE1BU0tfMU1CUFM6CisJCQliYW5kd2lkdGggPSBhZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHM7CisJCQlicmVhazsKKwkJY2FzZSBBRF9MSU5LX1NQRUVEX0JJVE1BU0tfMTBNQlBTOgorCQkJYmFuZHdpZHRoID0gYWdncmVnYXRvci0+bnVtX29mX3BvcnRzICogMTA7CisJCQlicmVhazsKKwkJY2FzZSBBRF9MSU5LX1NQRUVEX0JJVE1BU0tfMTAwTUJQUzoKKwkJCWJhbmR3aWR0aCA9IGFnZ3JlZ2F0b3ItPm51bV9vZl9wb3J0cyAqIDEwMDsKKwkJCWJyZWFrOworCQljYXNlIEFEX0xJTktfU1BFRURfQklUTUFTS18xMDAwTUJQUzoKKwkJCWJhbmR3aWR0aCA9IGFnZ3JlZ2F0b3ItPm51bV9vZl9wb3J0cyAqIDEwMDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJhbmR3aWR0aD0wOyAvLyB0byBzaWxlbnQgdGhlIGNvbXBpbG9yIC4uLi4KKwkJfQorCX0KKwlyZXR1cm4gYmFuZHdpZHRoOworfQorCisvKioKKyAqIF9fZ2V0X2FjdGl2ZV9hZ2cgLSBnZXQgdGhlIGN1cnJlbnQgYWN0aXZlIGFnZ3JlZ2F0b3IKKyAqIEBhZ2dyZWdhdG9yOiB0aGUgYWdncmVnYXRvciB3ZSdyZSBsb29raW5nIGF0CisgKgorICovCitzdGF0aWMgc3RydWN0IGFnZ3JlZ2F0b3IgKl9fZ2V0X2FjdGl2ZV9hZ2coc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3IpCit7CisJc3RydWN0IGFnZ3JlZ2F0b3IgKnJldHZhbCA9IE5VTEw7CisKKwlmb3IgKDsgYWdncmVnYXRvcjsgYWdncmVnYXRvciA9IF9fZ2V0X25leHRfYWdnKGFnZ3JlZ2F0b3IpKSB7CisJCWlmIChhZ2dyZWdhdG9yLT5pc19hY3RpdmUpIHsKKwkJCXJldHZhbCA9IGFnZ3JlZ2F0b3I7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogX191cGRhdGVfbGFjcGR1X2Zyb21fcG9ydCAtIHVwZGF0ZSBhIHBvcnQncyBsYWNwZHUgZmllbGRzCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fdXBkYXRlX2xhY3BkdV9mcm9tX3BvcnQoc3RydWN0IHBvcnQgKnBvcnQpCit7CisJc3RydWN0IGxhY3BkdSAqbGFjcGR1ID0gJnBvcnQtPmxhY3BkdTsKKworCS8qIHVwZGF0ZSBjdXJyZW50IGFjdHVhbCBBY3RvciBwYXJhbWV0ZXJzICovCisJLyogbGFjcGR1LT5zdWJ0eXBlICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkCisJICogbGFjcGR1LT52ZXJzaW9uX251bWJlciAgICAgICAgICAgIGluaXRpYWxpemVkCisJICogbGFjcGR1LT50bHZfdHlwZV9hY3Rvcl9pbmZvICAgICAgIGluaXRpYWxpemVkCisJICogbGFjcGR1LT5hY3Rvcl9pbmZvcm1hdGlvbl9sZW5ndGggIGluaXRpYWxpemVkCisJICovCisKKwlsYWNwZHUtPmFjdG9yX3N5c3RlbV9wcmlvcml0eSA9IHBvcnQtPmFjdG9yX3N5c3RlbV9wcmlvcml0eTsKKwlsYWNwZHUtPmFjdG9yX3N5c3RlbSA9IHBvcnQtPmFjdG9yX3N5c3RlbTsKKwlsYWNwZHUtPmFjdG9yX2tleSA9IHBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXk7CisJbGFjcGR1LT5hY3Rvcl9wb3J0X3ByaW9yaXR5ID0gcG9ydC0+YWN0b3JfcG9ydF9wcmlvcml0eTsKKwlsYWNwZHUtPmFjdG9yX3BvcnQgPSBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcjsKKwlsYWNwZHUtPmFjdG9yX3N0YXRlID0gcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlOworCisJLyogbGFjcGR1LT5yZXNlcnZlZF8zXzEgICAgICAgICAgICAgIGluaXRpYWxpemVkCisJICogbGFjcGR1LT50bHZfdHlwZV9wYXJ0bmVyX2luZm8gICAgIGluaXRpYWxpemVkCisJICogbGFjcGR1LT5wYXJ0bmVyX2luZm9ybWF0aW9uX2xlbmd0aCBpbml0aWFsaXplZAorCSAqLworCisJbGFjcGR1LT5wYXJ0bmVyX3N5c3RlbV9wcmlvcml0eSA9IHBvcnQtPnBhcnRuZXJfb3Blcl9zeXN0ZW1fcHJpb3JpdHk7CisJbGFjcGR1LT5wYXJ0bmVyX3N5c3RlbSA9IHBvcnQtPnBhcnRuZXJfb3Blcl9zeXN0ZW07CisJbGFjcGR1LT5wYXJ0bmVyX2tleSA9IHBvcnQtPnBhcnRuZXJfb3Blcl9rZXk7CisJbGFjcGR1LT5wYXJ0bmVyX3BvcnRfcHJpb3JpdHkgPSBwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9wcmlvcml0eTsKKwlsYWNwZHUtPnBhcnRuZXJfcG9ydCA9IHBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X251bWJlcjsKKwlsYWNwZHUtPnBhcnRuZXJfc3RhdGUgPSBwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZTsKKworCS8qIGxhY3BkdS0+cmVzZXJ2ZWRfM18yICAgICAgICAgICAgICBpbml0aWFsaXplZAorCSAqIGxhY3BkdS0+dGx2X3R5cGVfY29sbGVjdG9yX2luZm8gICBpbml0aWFsaXplZAorCSAqIGxhY3BkdS0+Y29sbGVjdG9yX2luZm9ybWF0aW9uX2xlbmd0aCBpbml0aWFsaXplZAorCSAqIGNvbGxlY3Rvcl9tYXhfZGVsYXkgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQKKwkgKiByZXNlcnZlZF8xMlsxMl0gICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQKKwkgKiB0bHZfdHlwZV90ZXJtaW5hdG9yICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQKKwkgKiB0ZXJtaW5hdG9yX2xlbmd0aCAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQKKwkgKiByZXNlcnZlZF81MFs1MF0gICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQKKwkgKi8KKworCS8qIENvbnZlcnQgYWxsIG5vbiB1OCBwYXJhbWV0ZXJzIHRvIEJpZyBFbmRpYW4gZm9yIHRyYW5zbWl0ICovCisJX19udG9oc19sYWNwZHUobGFjcGR1KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vID09PT09PT09PT09PT09PT09IG1haW4gODAyLjNhZCBwcm90b2NvbCBjb2RlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIGFkX2xhY3BkdV9zZW5kIC0gc2VuZCBvdXQgYSBsYWNwZHUgcGFja2V0IG9uIGEgZ2l2ZW4gcG9ydAorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKiBSZXR1cm5zOiAgIDAgb24gc3VjY2VzcworICogICAgICAgICAgPCAwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgYWRfbGFjcGR1X3NlbmQoc3RydWN0IHBvcnQgKnBvcnQpCit7CisJc3RydWN0IHNsYXZlICpzbGF2ZSA9IHBvcnQtPnNsYXZlOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGxhY3BkdV9oZWFkZXIgKmxhY3BkdV9oZWFkZXI7CisJaW50IGxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgbGFjcGR1X2hlYWRlcik7CisJc3RydWN0IG1hY19hZGRyIGxhY3BkdV9tdWx0aWNhc3RfYWRkcmVzcyA9IEFEX01VTFRJQ0FTVF9MQUNQRFVfQUREUjsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuZ3RoKTsKKwlpZiAoIXNrYikgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlza2ItPmRldiA9IHNsYXZlLT5kZXY7CisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhICsgRVRIX0hMRU47CisJc2tiLT5wcm90b2NvbCA9IFBLVF9UWVBFX0xBQ1BEVTsKKwlza2ItPnByaW9yaXR5ID0gVENfUFJJT19DT05UUk9MOworCisJbGFjcGR1X2hlYWRlciA9IChzdHJ1Y3QgbGFjcGR1X2hlYWRlciAqKXNrYl9wdXQoc2tiLCBsZW5ndGgpOworCisJbGFjcGR1X2hlYWRlci0+YWRfaGVhZGVyLmRlc3RpbmF0aW9uX2FkZHJlc3MgPSBsYWNwZHVfbXVsdGljYXN0X2FkZHJlc3M7CisJLyogTm90ZTogc291cmNlIGFkZHJlcyBpcyBzZXQgdG8gYmUgdGhlIG1lbWJlcidzIFBFUk1BTkVOVCBhZGRyZXNzLCBiZWNhdXNlIHdlIHVzZSBpdAorCSAgIHRvIGlkZW50aWZ5IGxvb3BiYWNrIGxhY3BkdXMgaW4gcmVjZWl2ZS4gKi8KKwlsYWNwZHVfaGVhZGVyLT5hZF9oZWFkZXIuc291cmNlX2FkZHJlc3MgPSAqKChzdHJ1Y3QgbWFjX2FkZHIgKikoc2xhdmUtPnBlcm1faHdhZGRyKSk7CisJbGFjcGR1X2hlYWRlci0+YWRfaGVhZGVyLmxlbmd0aF90eXBlID0gUEtUX1RZUEVfTEFDUERVOworCisJbGFjcGR1X2hlYWRlci0+bGFjcGR1ID0gcG9ydC0+bGFjcGR1OyAvLyBzdHJ1Y3QgY29weQorCisJZGV2X3F1ZXVlX3htaXQoc2tiKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGFkX21hcmtlcl9zZW5kIC0gc2VuZCBtYXJrZXIgaW5mb3JtYXRpb24vcmVzcG9uc2Ugb24gYSBnaXZlbiBwb3J0CisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICogQG1hcmtlcjogbWFya2VyIGRhdGEgdG8gc2VuZAorICoKKyAqIFJldHVybnM6ICAgMCBvbiBzdWNjZXNzCisgKiAgICAgICAgICA8IDAgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBhZF9tYXJrZXJfc2VuZChzdHJ1Y3QgcG9ydCAqcG9ydCwgc3RydWN0IG1hcmtlciAqbWFya2VyKQoreworCXN0cnVjdCBzbGF2ZSAqc2xhdmUgPSBwb3J0LT5zbGF2ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBtYXJrZXJfaGVhZGVyICptYXJrZXJfaGVhZGVyOworCWludCBsZW5ndGggPSBzaXplb2Yoc3RydWN0IG1hcmtlcl9oZWFkZXIpOworCXN0cnVjdCBtYWNfYWRkciBsYWNwZHVfbXVsdGljYXN0X2FkZHJlc3MgPSBBRF9NVUxUSUNBU1RfTEFDUERVX0FERFI7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbmd0aCArIDE2KTsKKwlpZiAoIXNrYikgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlza2JfcmVzZXJ2ZShza2IsIDE2KTsKKworCXNrYi0+ZGV2ID0gc2xhdmUtPmRldjsKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGEgKyBFVEhfSExFTjsKKwlza2ItPnByb3RvY29sID0gUEtUX1RZUEVfTEFDUERVOworCisJbWFya2VyX2hlYWRlciA9IChzdHJ1Y3QgbWFya2VyX2hlYWRlciAqKXNrYl9wdXQoc2tiLCBsZW5ndGgpOworCisJbWFya2VyX2hlYWRlci0+YWRfaGVhZGVyLmRlc3RpbmF0aW9uX2FkZHJlc3MgPSBsYWNwZHVfbXVsdGljYXN0X2FkZHJlc3M7CisJLyogTm90ZTogc291cmNlIGFkZHJlcyBpcyBzZXQgdG8gYmUgdGhlIG1lbWJlcidzIFBFUk1BTkVOVCBhZGRyZXNzLCBiZWNhdXNlIHdlIHVzZSBpdAorCSAgIHRvIGlkZW50aWZ5IGxvb3BiYWNrIE1BUktFUnMgaW4gcmVjZWl2ZS4gKi8KKwltYXJrZXJfaGVhZGVyLT5hZF9oZWFkZXIuc291cmNlX2FkZHJlc3MgPSAqKChzdHJ1Y3QgbWFjX2FkZHIgKikoc2xhdmUtPnBlcm1faHdhZGRyKSk7CisJbWFya2VyX2hlYWRlci0+YWRfaGVhZGVyLmxlbmd0aF90eXBlID0gUEtUX1RZUEVfTEFDUERVOworCisJbWFya2VyX2hlYWRlci0+bWFya2VyID0gKm1hcmtlcjsgLy8gc3RydWN0IGNvcHkKKworCWRldl9xdWV1ZV94bWl0KHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhZF9tdXhfbWFjaGluZSAtIGhhbmRsZSBhIHBvcnQncyBtdXggc3RhdGUgbWFjaGluZQorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGFkX211eF9tYWNoaW5lKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCW11eF9zdGF0ZXNfdCBsYXN0X3N0YXRlOworCisJLy8ga2VlcCBjdXJyZW50IFN0YXRlIE1hY2hpbmUgc3RhdGUgdG8gY29tcGFyZSBsYXRlciBpZiBpdCB3YXMgY2hhbmdlZAorCWxhc3Rfc3RhdGUgPSBwb3J0LT5zbV9tdXhfc3RhdGU7CisKKwlpZiAocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfQkVHSU4pIHsKKwkJcG9ydC0+c21fbXV4X3N0YXRlID0gQURfTVVYX0RFVEFDSEVEOwkJIC8vIG5leHQgc3RhdGUKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHBvcnQtPnNtX211eF9zdGF0ZSkgeworCQljYXNlIEFEX01VWF9ERVRBQ0hFRDoKKwkJCWlmICgocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfU0VMRUNURUQpIHx8IChwb3J0LT5zbV92YXJzICYgQURfUE9SVF9TVEFOREJZKSkgeyAvLyBpZiBTRUxFQ1RFRCBvciBTVEFOREJZCisJCQkJcG9ydC0+c21fbXV4X3N0YXRlID0gQURfTVVYX1dBSVRJTkc7IC8vIG5leHQgc3RhdGUKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEFEX01VWF9XQUlUSU5HOgorCQkJLy8gaWYgU0VMRUNURUQgPT0gRkFMU0UgcmV0dXJuIHRvIERFVEFDSCBzdGF0ZQorCQkJaWYgKCEocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfU0VMRUNURUQpKSB7IC8vIGlmIFVOU0VMRUNURUQKKwkJCQlwb3J0LT5zbV92YXJzICY9IH5BRF9QT1JUX1JFQURZX047CisJCQkJLy8gaW4gb3JkZXIgdG8gd2l0aGhvbGQgdGhlIFNlbGVjdGlvbiBMb2dpYyB0byBjaGVjayBhbGwgcG9ydHMgUkVBRFlfTiB2YWx1ZQorCQkJCS8vIGV2ZXJ5IGNhbGxiYWNrIGN5Y2xlIHRvIHVwZGF0ZSByZWFkeSB2YXJpYWJsZSwgd2UgY2hlY2sgUkVBRFlfTiBhbmQgdXBkYXRlIFJFQURZIGhlcmUKKwkJCQlfX3NldF9hZ2dfcG9ydHNfcmVhZHkocG9ydC0+YWdncmVnYXRvciwgX19hZ2dfcG9ydHNfYXJlX3JlYWR5KHBvcnQtPmFnZ3JlZ2F0b3IpKTsKKwkJCQlwb3J0LT5zbV9tdXhfc3RhdGUgPSBBRF9NVVhfREVUQUNIRUQ7CSAvLyBuZXh0IHN0YXRlCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8vIGNoZWNrIGlmIHRoZSB3YWl0X3doaWxlX3RpbWVyIGV4cGlyZWQKKwkJCWlmIChwb3J0LT5zbV9tdXhfdGltZXJfY291bnRlciAmJiAhKC0tcG9ydC0+c21fbXV4X3RpbWVyX2NvdW50ZXIpKSB7CisJCQkJcG9ydC0+c21fdmFycyB8PSBBRF9QT1JUX1JFQURZX047CisJCQl9CisKKwkJCS8vIGluIG9yZGVyIHRvIHdpdGhob2xkIHRoZSBzZWxlY3Rpb24gbG9naWMgdG8gY2hlY2sgYWxsIHBvcnRzIFJFQURZX04gdmFsdWUKKwkJCS8vIGV2ZXJ5IGNhbGxiYWNrIGN5Y2xlIHRvIHVwZGF0ZSByZWFkeSB2YXJpYWJsZSwgd2UgY2hlY2sgUkVBRFlfTiBhbmQgdXBkYXRlIFJFQURZIGhlcmUKKwkJCV9fc2V0X2FnZ19wb3J0c19yZWFkeShwb3J0LT5hZ2dyZWdhdG9yLCBfX2FnZ19wb3J0c19hcmVfcmVhZHkocG9ydC0+YWdncmVnYXRvcikpOworCisJCQkvLyBpZiB0aGUgd2FpdF93aGlsZV90aW1lciBleHBpcmVkLCBhbmQgdGhlIHBvcnQgaXMgaW4gUkVBRFkgc3RhdGUsIG1vdmUgdG8gQVRUQUNIRUQgc3RhdGUKKwkJCWlmICgocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfUkVBRFkpICYmICFwb3J0LT5zbV9tdXhfdGltZXJfY291bnRlcikgeworCQkJCXBvcnQtPnNtX211eF9zdGF0ZSA9IEFEX01VWF9BVFRBQ0hFRDsJIC8vIG5leHQgc3RhdGUKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEFEX01VWF9BVFRBQ0hFRDoKKwkJCS8vIGNoZWNrIGFsc28gaWYgYWdnX3NlbGVjdF90aW1lciBleHBpcmVkKHNvIHRoZSBlZGFibGUgcG9ydCB3aWxsIHRha2UgcGxhY2Ugb25seSBhZnRlciB0aGlzIHRpbWVyKQorCQkJaWYgKChwb3J0LT5zbV92YXJzICYgQURfUE9SVF9TRUxFQ1RFRCkgJiYgKHBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlICYgQURfU1RBVEVfU1lOQ0hST05JWkFUSU9OKSAmJiAhX19jaGVja19hZ2dfc2VsZWN0aW9uX3RpbWVyKHBvcnQpKSB7CisJCQkJcG9ydC0+c21fbXV4X3N0YXRlID0gQURfTVVYX0NPTExFQ1RJTkdfRElTVFJJQlVUSU5HOy8vIG5leHQgc3RhdGUKKwkJCX0gZWxzZSBpZiAoIShwb3J0LT5zbV92YXJzICYgQURfUE9SVF9TRUxFQ1RFRCkgfHwgKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX1NUQU5EQlkpKSB7CSAgLy8gaWYgVU5TRUxFQ1RFRCBvciBTVEFOREJZCisJCQkJcG9ydC0+c21fdmFycyAmPSB+QURfUE9SVF9SRUFEWV9OOworCQkJCS8vIGluIG9yZGVyIHRvIHdpdGhob2xkIHRoZSBzZWxlY3Rpb24gbG9naWMgdG8gY2hlY2sgYWxsIHBvcnRzIFJFQURZX04gdmFsdWUKKwkJCQkvLyBldmVyeSBjYWxsYmFjayBjeWNsZSB0byB1cGRhdGUgcmVhZHkgdmFyaWFibGUsIHdlIGNoZWNrIFJFQURZX04gYW5kIHVwZGF0ZSBSRUFEWSBoZXJlCisJCQkJX19zZXRfYWdnX3BvcnRzX3JlYWR5KHBvcnQtPmFnZ3JlZ2F0b3IsIF9fYWdnX3BvcnRzX2FyZV9yZWFkeShwb3J0LT5hZ2dyZWdhdG9yKSk7CisJCQkJcG9ydC0+c21fbXV4X3N0YXRlID0gQURfTVVYX0RFVEFDSEVEOy8vIG5leHQgc3RhdGUKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEFEX01VWF9DT0xMRUNUSU5HX0RJU1RSSUJVVElORzoKKwkJCWlmICghKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX1NFTEVDVEVEKSB8fCAocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfU1RBTkRCWSkgfHwKKwkJCSAgICAhKHBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlICYgQURfU1RBVEVfU1lOQ0hST05JWkFUSU9OKQorCQkJICAgKSB7CisJCQkJcG9ydC0+c21fbXV4X3N0YXRlID0gQURfTVVYX0FUVEFDSEVEOy8vIG5leHQgc3RhdGUKKworCQkJfSBlbHNlIHsKKwkJCQkvLyBpZiBwb3J0IHN0YXRlIGhhc24ndCBjaGFuZ2VkIG1ha2UKKwkJCQkvLyBzdXJlIHRoYXQgYSBjb2xsZWN0aW5nIGRpc3RyaWJ1dGluZworCQkJCS8vIHBvcnQgaW4gYW4gYWN0aXZlIGFnZ3JlZ2F0b3IgaXMgZW5hYmxlZAorCQkJCWlmIChwb3J0LT5hZ2dyZWdhdG9yICYmCisJCQkJICAgIHBvcnQtPmFnZ3JlZ2F0b3ItPmlzX2FjdGl2ZSAmJgorCQkJCSAgICAhX19wb3J0X2lzX2VuYWJsZWQocG9ydCkpIHsKKworCQkJCQlfX2VuYWJsZV9wb3J0KHBvcnQpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAgICAvL3RvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIGNoZWNrIGlmIHRoZSBzdGF0ZSBtYWNoaW5lIHdhcyBjaGFuZ2VkCisJaWYgKHBvcnQtPnNtX211eF9zdGF0ZSAhPSBsYXN0X3N0YXRlKSB7CisJCWRwcmludGsoIk11eCBNYWNoaW5lOiBQb3J0PSVkLCBMYXN0IFN0YXRlPSVkLCBDdXJyIFN0YXRlPSVkXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlciwgbGFzdF9zdGF0ZSwgcG9ydC0+c21fbXV4X3N0YXRlKTsKKwkJc3dpdGNoIChwb3J0LT5zbV9tdXhfc3RhdGUpIHsKKwkJY2FzZSBBRF9NVVhfREVUQUNIRUQ6CisJCQlfX2RldGFjaF9ib25kX2Zyb21fYWdnKHBvcnQpOworCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICY9IH5BRF9TVEFURV9TWU5DSFJPTklaQVRJT047CisJCQlhZF9kaXNhYmxlX2NvbGxlY3RpbmdfZGlzdHJpYnV0aW5nKHBvcnQpOworCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICY9IH5BRF9TVEFURV9DT0xMRUNUSU5HOworCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICY9IH5BRF9TVEFURV9ESVNUUklCVVRJTkc7CisJCQlwb3J0LT5udHQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgQURfTVVYX1dBSVRJTkc6CisJCQlwb3J0LT5zbV9tdXhfdGltZXJfY291bnRlciA9IF9fYWRfdGltZXJfdG9fdGlja3MoQURfV0FJVF9XSElMRV9USU1FUiwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBBRF9NVVhfQVRUQUNIRUQ6CisJCQlfX2F0dGFjaF9ib25kX3RvX2FnZyhwb3J0KTsKKwkJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSB8PSBBRF9TVEFURV9TWU5DSFJPTklaQVRJT047CisJCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJj0gfkFEX1NUQVRFX0NPTExFQ1RJTkc7CisJCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJj0gfkFEX1NUQVRFX0RJU1RSSUJVVElORzsKKwkJCWFkX2Rpc2FibGVfY29sbGVjdGluZ19kaXN0cmlidXRpbmcocG9ydCk7CisJCQlwb3J0LT5udHQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgQURfTVVYX0NPTExFQ1RJTkdfRElTVFJJQlVUSU5HOgorCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlIHw9IEFEX1NUQVRFX0NPTExFQ1RJTkc7CisJCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgfD0gQURfU1RBVEVfRElTVFJJQlVUSU5HOworCQkJYWRfZW5hYmxlX2NvbGxlY3RpbmdfZGlzdHJpYnV0aW5nKHBvcnQpOworCQkJcG9ydC0+bnR0ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAgICAvL3RvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoqCisgKiBhZF9yeF9tYWNoaW5lIC0gaGFuZGxlIGEgcG9ydCdzIHJ4IFN0YXRlIE1hY2hpbmUKKyAqIEBsYWNwZHU6IHRoZSBsYWNwZHUgd2UndmUgcmVjZWl2ZWQKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogSWYgbGFjcGR1IGFycml2ZWQsIHN0b3AgcHJldmlvdXMgdGltZXIgKGlmIGV4aXN0cykgYW5kIHNldCB0aGUgbmV4dCBzdGF0ZSBhcworICogQ1VSUkVOVC4gSWYgdGltZXIgZXhwaXJlZCBzZXQgdGhlIHN0YXRlIG1hY2hpbmUgaW4gdGhlIHByb3BlciBzdGF0ZS4KKyAqIEluIG90aGVyIGNhc2VzLCB0aGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB3ZSBuZWVkIHRvIHN3aXRjaCB0byBvdGhlciBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgYWRfcnhfbWFjaGluZShzdHJ1Y3QgbGFjcGR1ICpsYWNwZHUsIHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXJ4X3N0YXRlc190IGxhc3Rfc3RhdGU7CisKKwkvLyBMb2NrIHRvIHByZXZlbnQgMiBpbnN0YW5jZXMgb2YgdGhpcyBmdW5jdGlvbiB0byBydW4gc2ltdWx0YW5lb3VzbHkocnggaW50ZXJydXB0IGFuZCBwZXJpb2RpYyBtYWNoaW5lIGNhbGxiYWNrKQorCV9fZ2V0X3J4X21hY2hpbmVfbG9jayhwb3J0KTsKKworCS8vIGtlZXAgY3VycmVudCBTdGF0ZSBNYWNoaW5lIHN0YXRlIHRvIGNvbXBhcmUgbGF0ZXIgaWYgaXQgd2FzIGNoYW5nZWQKKwlsYXN0X3N0YXRlID0gcG9ydC0+c21fcnhfc3RhdGU7CisKKwkvLyBjaGVjayBpZiBzdGF0ZSBtYWNoaW5lIHNob3VsZCBjaGFuZ2Ugc3RhdGUKKwkvLyBmaXJzdCwgY2hlY2sgaWYgcG9ydCB3YXMgcmVpbml0aWFsaXplZAorCWlmIChwb3J0LT5zbV92YXJzICYgQURfUE9SVF9CRUdJTikgeworCQlwb3J0LT5zbV9yeF9zdGF0ZSA9IEFEX1JYX0lOSVRJQUxJWkU7CQkgICAgLy8gbmV4dCBzdGF0ZQorCX0KKwkvLyBjaGVjayBpZiBwb3J0IGlzIG5vdCBlbmFibGVkCisJZWxzZSBpZiAoIShwb3J0LT5zbV92YXJzICYgQURfUE9SVF9CRUdJTikgJiYgIXBvcnQtPmlzX2VuYWJsZWQgJiYgIShwb3J0LT5zbV92YXJzICYgQURfUE9SVF9NT1ZFRCkpIHsKKwkJcG9ydC0+c21fcnhfc3RhdGUgPSBBRF9SWF9QT1JUX0RJU0FCTEVEOwkgICAgLy8gbmV4dCBzdGF0ZQorCX0KKwkvLyBjaGVjayBpZiBuZXcgbGFjcGR1IGFycml2ZWQKKwllbHNlIGlmIChsYWNwZHUgJiYgKChwb3J0LT5zbV9yeF9zdGF0ZSA9PSBBRF9SWF9FWFBJUkVEKSB8fCAocG9ydC0+c21fcnhfc3RhdGUgPT0gQURfUlhfREVGQVVMVEVEKSB8fCAocG9ydC0+c21fcnhfc3RhdGUgPT0gQURfUlhfQ1VSUkVOVCkpKSB7CisJCXBvcnQtPnNtX3J4X3RpbWVyX2NvdW50ZXIgPSAwOyAvLyB6ZXJvIHRpbWVyCisJCXBvcnQtPnNtX3J4X3N0YXRlID0gQURfUlhfQ1VSUkVOVDsKKwl9IGVsc2UgeworCQkvLyBpZiB0aW1lciBpcyBvbiwgYW5kIGlmIGl0IGlzIGV4cGlyZWQKKwkJaWYgKHBvcnQtPnNtX3J4X3RpbWVyX2NvdW50ZXIgJiYgISgtLXBvcnQtPnNtX3J4X3RpbWVyX2NvdW50ZXIpKSB7CisJCQlzd2l0Y2ggKHBvcnQtPnNtX3J4X3N0YXRlKSB7CisJCQljYXNlIEFEX1JYX0VYUElSRUQ6CisJCQkJcG9ydC0+c21fcnhfc3RhdGUgPSBBRF9SWF9ERUZBVUxURUQ7CQkvLyBuZXh0IHN0YXRlCisJCQkJYnJlYWs7CisJCQljYXNlIEFEX1JYX0NVUlJFTlQ6CisJCQkJcG9ydC0+c21fcnhfc3RhdGUgPSBBRF9SWF9FWFBJUkVEOwkgICAgLy8gbmV4dCBzdGF0ZQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDogICAgLy90byBzaWxlbmNlIHRoZSBjb21waWxlcgorCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJLy8gaWYgbm8gbGFjcGR1IGFycml2ZWQgYW5kIG5vIHRpbWVyIGlzIG9uCisJCQlzd2l0Y2ggKHBvcnQtPnNtX3J4X3N0YXRlKSB7CisJCQljYXNlIEFEX1JYX1BPUlRfRElTQUJMRUQ6CisJCQkJaWYgKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX01PVkVEKSB7CisJCQkJCXBvcnQtPnNtX3J4X3N0YXRlID0gQURfUlhfSU5JVElBTElaRTsJICAgIC8vIG5leHQgc3RhdGUKKwkJCQl9IGVsc2UgaWYgKHBvcnQtPmlzX2VuYWJsZWQgJiYgKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX0xBQ1BfRU5BQkxFRCkpIHsKKwkJCQkJcG9ydC0+c21fcnhfc3RhdGUgPSBBRF9SWF9FWFBJUkVEOwkvLyBuZXh0IHN0YXRlCisJCQkJfSBlbHNlIGlmIChwb3J0LT5pc19lbmFibGVkICYmICgocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfTEFDUF9FTkFCTEVEKSA9PSAwKSkgeworCQkJCQlwb3J0LT5zbV9yeF9zdGF0ZSA9IEFEX1JYX0xBQ1BfRElTQUJMRUQ7ICAgIC8vIG5leHQgc3RhdGUKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OiAgICAvL3RvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCisJCQkJYnJlYWs7CisKKwkJCX0KKwkJfQorCX0KKworCS8vIGNoZWNrIGlmIHRoZSBTdGF0ZSBtYWNoaW5lIHdhcyBjaGFuZ2VkIG9yIG5ldyBsYWNwZHUgYXJyaXZlZAorCWlmICgocG9ydC0+c21fcnhfc3RhdGUgIT0gbGFzdF9zdGF0ZSkgfHwgKGxhY3BkdSkpIHsKKwkJZHByaW50aygiUnggTWFjaGluZTogUG9ydD0lZCwgTGFzdCBTdGF0ZT0lZCwgQ3VyciBTdGF0ZT0lZFxuIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIsIGxhc3Rfc3RhdGUsIHBvcnQtPnNtX3J4X3N0YXRlKTsKKwkJc3dpdGNoIChwb3J0LT5zbV9yeF9zdGF0ZSkgeworCQljYXNlIEFEX1JYX0lOSVRJQUxJWkU6CisJCQlpZiAoIShwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5ICYgQURfRFVQTEVYX0tFWV9CSVRTKSkgeworCQkJCXBvcnQtPnNtX3ZhcnMgJj0gfkFEX1BPUlRfTEFDUF9FTkFCTEVEOworCQkJfSBlbHNlIHsKKwkJCQlwb3J0LT5zbV92YXJzIHw9IEFEX1BPUlRfTEFDUF9FTkFCTEVEOworCQkJfQorCQkJcG9ydC0+c21fdmFycyAmPSB+QURfUE9SVF9TRUxFQ1RFRDsKKwkJCV9fcmVjb3JkX2RlZmF1bHQocG9ydCk7CisJCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJj0gfkFEX1NUQVRFX0VYUElSRUQ7CisJCQlwb3J0LT5zbV92YXJzICY9IH5BRF9QT1JUX01PVkVEOworCQkJcG9ydC0+c21fcnhfc3RhdGUgPSBBRF9SWF9QT1JUX0RJU0FCTEVEOwkvLyBuZXh0IHN0YXRlCisKKwkJCS8qLSBGYWxsIFRocm91Z2ggLSovCisKKwkJY2FzZSBBRF9SWF9QT1JUX0RJU0FCTEVEOgorCQkJcG9ydC0+c21fdmFycyAmPSB+QURfUE9SVF9NQVRDSEVEOworCQkJYnJlYWs7CisJCWNhc2UgQURfUlhfTEFDUF9ESVNBQkxFRDoKKwkJCXBvcnQtPnNtX3ZhcnMgJj0gfkFEX1BPUlRfU0VMRUNURUQ7CisJCQlfX3JlY29yZF9kZWZhdWx0KHBvcnQpOworCQkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgJj0gfkFEX1NUQVRFX0FHR1JFR0FUSU9OOworCQkJcG9ydC0+c21fdmFycyB8PSBBRF9QT1JUX01BVENIRUQ7CisJCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJj0gfkFEX1NUQVRFX0VYUElSRUQ7CisJCQlicmVhazsKKwkJY2FzZSBBRF9SWF9FWFBJUkVEOgorCQkJLy9SZXNldCBvZiB0aGUgU3luY2hyb25pemF0aW9uIGZsYWcuIChTdGFuZGFyZCA0My40LjEyKQorCQkJLy9UaGlzIHJlc2V0IGNhdXNlIHRvIGRpc2FibGUgdGhpcyBwb3J0IGluIHRoZSBDT0xMRUNUSU5HX0RJU1RSSUJVVElORyBzdGF0ZSBvZiB0aGUKKwkJCS8vbXV4IG1hY2hpbmUgaW4gY2FzZSBvZiBFWFBJUkVEIGV2ZW4gaWYgTElOS19ET1dOIGRpZG4ndCBhcnJpdmUgZm9yIHRoZSBwb3J0LgorCQkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgJj0gfkFEX1NUQVRFX1NZTkNIUk9OSVpBVElPTjsKKwkJCXBvcnQtPnNtX3ZhcnMgJj0gfkFEX1BPUlRfTUFUQ0hFRDsKKwkJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlIHw9IEFEX1NIT1JUX1RJTUVPVVQ7CisJCQlwb3J0LT5zbV9yeF90aW1lcl9jb3VudGVyID0gX19hZF90aW1lcl90b190aWNrcyhBRF9DVVJSRU5UX1dISUxFX1RJTUVSLCAodTE2KShBRF9TSE9SVF9USU1FT1VUKSk7CisJCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgfD0gQURfU1RBVEVfRVhQSVJFRDsKKwkJCWJyZWFrOworCQljYXNlIEFEX1JYX0RFRkFVTFRFRDoKKwkJCV9fdXBkYXRlX2RlZmF1bHRfc2VsZWN0ZWQocG9ydCk7CisJCQlfX3JlY29yZF9kZWZhdWx0KHBvcnQpOworCQkJcG9ydC0+c21fdmFycyB8PSBBRF9QT1JUX01BVENIRUQ7CisJCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJj0gfkFEX1NUQVRFX0VYUElSRUQ7CisJCQlicmVhazsKKwkJY2FzZSBBRF9SWF9DVVJSRU5UOgorCQkJLy8gZGV0ZWN0IGxvb3BiYWNrIHNpdHVhdGlvbgorCQkJaWYgKCFNQUNfQUREUkVTU19DT01QQVJFKCYobGFjcGR1LT5hY3Rvcl9zeXN0ZW0pLCAmKHBvcnQtPmFjdG9yX3N5c3RlbSkpKSB7CisJCQkJLy8gSU5GT19SRUNFSVZFRF9MT09QQkFDS19GUkFNRVMKKwkJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogQW4gaWxsZWdhbCBsb29wYmFjayBvY2N1cnJlZCBvbiBhZGFwdGVyICglcylcbiIsCisJCQkJCQlwb3J0LT5zbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkNoZWNrIHRoZSBjb25maWd1cmF0aW9uIHRvIHZlcmlmeSB0aGF0IGFsbCBBZGFwdGVycyAiCisJCQkJCQkiYXJlIGNvbm5lY3RlZCB0byA4MDIuM2FkIGNvbXBsaWFudCBzd2l0Y2ggcG9ydHNcbiIpOworCQkJCV9fcmVsZWFzZV9yeF9tYWNoaW5lX2xvY2socG9ydCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJX191cGRhdGVfc2VsZWN0ZWQobGFjcGR1LCBwb3J0KTsKKwkJCV9fdXBkYXRlX250dChsYWNwZHUsIHBvcnQpOworCQkJX19yZWNvcmRfcGR1KGxhY3BkdSwgcG9ydCk7CisJCQlfX2Nob29zZV9tYXRjaGVkKGxhY3BkdSwgcG9ydCk7CisJCQlwb3J0LT5zbV9yeF90aW1lcl9jb3VudGVyID0gX19hZF90aW1lcl90b190aWNrcyhBRF9DVVJSRU5UX1dISUxFX1RJTUVSLCAodTE2KShwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJiBBRF9TVEFURV9MQUNQX1RJTUVPVVQpKTsKKwkJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSAmPSB+QURfU1RBVEVfRVhQSVJFRDsKKwkJCS8vIHZlcmlmeSB0aGF0IGlmIHRoZSBhZ2dyZWdhdG9yIGlzIGVuYWJsZWQsIHRoZSBwb3J0IGlzIGVuYWJsZWQgdG9vLgorCQkJLy8oYmVjYXVzZSBpZiB0aGUgbGluayBnb2VzIGRvd24gZm9yIGEgc2hvcnQgdGltZSwgdGhlIDgwMi4zYWQgd2lsbCBub3QKKwkJCS8vIGNhdGNoIGl0LCBhbmQgdGhlIHBvcnQgd2lsbCBjb250aW51ZSB0byBiZSBkaXNhYmxlZCkKKwkJCWlmIChwb3J0LT5hZ2dyZWdhdG9yICYmIHBvcnQtPmFnZ3JlZ2F0b3ItPmlzX2FjdGl2ZSAmJiAhX19wb3J0X2lzX2VuYWJsZWQocG9ydCkpIHsKKwkJCQlfX2VuYWJsZV9wb3J0KHBvcnQpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6ICAgIC8vdG8gc2lsZW5jZSB0aGUgY29tcGlsZXIKKwkJCWJyZWFrOworCQl9CisJfQorCV9fcmVsZWFzZV9yeF9tYWNoaW5lX2xvY2socG9ydCk7Cit9CisKKy8qKgorICogYWRfdHhfbWFjaGluZSAtIGhhbmRsZSBhIHBvcnQncyB0eCBzdGF0ZSBtYWNoaW5lCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqLworc3RhdGljIHZvaWQgYWRfdHhfbWFjaGluZShzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwkvLyBjaGVjayBpZiB0eCB0aW1lciBleHBpcmVkLCB0byB2ZXJpZnkgdGhhdCB3ZSBkbyBub3Qgc2VuZCBtb3JlIHRoYW4gMyBwYWNrZXRzIHBlciBzZWNvbmQKKwlpZiAocG9ydC0+c21fdHhfdGltZXJfY291bnRlciAmJiAhKC0tcG9ydC0+c21fdHhfdGltZXJfY291bnRlcikpIHsKKwkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHNlbmQKKwkJaWYgKHBvcnQtPm50dCAmJiAocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfTEFDUF9FTkFCTEVEKSkgeworCQkJX191cGRhdGVfbGFjcGR1X2Zyb21fcG9ydChwb3J0KTsKKwkJCS8vIHNlbmQgdGhlIGxhY3BkdQorCQkJaWYgKGFkX2xhY3BkdV9zZW5kKHBvcnQpID49IDApIHsKKwkJCQlkcHJpbnRrKCJTZW50IExBQ1BEVSBvbiBwb3J0ICVkXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcik7CisJCQkJLy8gbWFyayBudHQgYXMgZmFsc2UsIHNvIGl0IHdpbGwgbm90IGJlIHNlbnQgYWdhaW4gdW50aWwgZGVtYW5kZWQKKwkJCQlwb3J0LT5udHQgPSAwOworCQkJfQorCQl9CisJCS8vIHJlc3RhcnQgdHggdGltZXIodG8gdmVyaWZ5IHRoYXQgd2Ugd2lsbCBub3QgZXhjZWVkIEFEX01BWF9UWF9JTl9TRUNPTkQKKwkJcG9ydC0+c21fdHhfdGltZXJfY291bnRlcj1hZF90aWNrc19wZXJfc2VjL0FEX01BWF9UWF9JTl9TRUNPTkQ7CisJfQorfQorCisvKioKKyAqIGFkX3BlcmlvZGljX21hY2hpbmUgLSBoYW5kbGUgYSBwb3J0J3MgcGVyaW9kaWMgc3RhdGUgbWFjaGluZQorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKiBUdXJuIG50dCBmbGFnIG9uIHByaW9kaWNhbGx5IHRvIHBlcmZvcm0gcGVyaW9kaWMgdHJhbnNtaXNzaW9uIG9mIGxhY3BkdSdzLgorICovCitzdGF0aWMgdm9pZCBhZF9wZXJpb2RpY19tYWNoaW5lKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXBlcmlvZGljX3N0YXRlc190IGxhc3Rfc3RhdGU7CisKKwkvLyBrZWVwIGN1cnJlbnQgc3RhdGUgbWFjaGluZSBzdGF0ZSB0byBjb21wYXJlIGxhdGVyIGlmIGl0IHdhcyBjaGFuZ2VkCisJbGFzdF9zdGF0ZSA9IHBvcnQtPnNtX3BlcmlvZGljX3N0YXRlOworCisJLy8gY2hlY2sgaWYgcG9ydCB3YXMgcmVpbml0aWFsaXplZAorCWlmICgoKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX0JFR0lOKSB8fCAhKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX0xBQ1BfRU5BQkxFRCkgfHwgIXBvcnQtPmlzX2VuYWJsZWQpIHx8CisJICAgICghKHBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSAmIEFEX1NUQVRFX0xBQ1BfQUNUSVZJVFkpICYmICEocG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgJiBBRF9TVEFURV9MQUNQX0FDVElWSVRZKSkKKwkgICApIHsKKwkJcG9ydC0+c21fcGVyaW9kaWNfc3RhdGUgPSBBRF9OT19QRVJJT0RJQzsJICAgICAvLyBuZXh0IHN0YXRlCisJfQorCS8vIGNoZWNrIGlmIHN0YXRlIG1hY2hpbmUgc2hvdWxkIGNoYW5nZSBzdGF0ZQorCWVsc2UgaWYgKHBvcnQtPnNtX3BlcmlvZGljX3RpbWVyX2NvdW50ZXIpIHsKKwkJLy8gY2hlY2sgaWYgcGVyaW9kaWMgc3RhdGUgbWFjaGluZSBleHBpcmVkCisJCWlmICghKC0tcG9ydC0+c21fcGVyaW9kaWNfdGltZXJfY291bnRlcikpIHsKKwkJCS8vIGlmIGV4cGlyZWQgdGhlbiBkbyB0eAorCQkJcG9ydC0+c21fcGVyaW9kaWNfc3RhdGUgPSBBRF9QRVJJT0RJQ19UWDsgICAgLy8gbmV4dCBzdGF0ZQorCQl9IGVsc2UgeworCQkJLy8gSWYgbm90IGV4cGlyZWQsIGNoZWNrIGlmIHRoZXJlIGlzIHNvbWUgbmV3IHRpbWVvdXQgcGFyYW1ldGVyIGZyb20gdGhlIHBhcnRuZXIgc3RhdGUKKwkJCXN3aXRjaCAocG9ydC0+c21fcGVyaW9kaWNfc3RhdGUpIHsKKwkJCWNhc2UgQURfRkFTVF9QRVJJT0RJQzoKKwkJCQlpZiAoIShwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSAmIEFEX1NUQVRFX0xBQ1BfVElNRU9VVCkpIHsKKwkJCQkJcG9ydC0+c21fcGVyaW9kaWNfc3RhdGUgPSBBRF9TTE9XX1BFUklPRElDOyAgLy8gbmV4dCBzdGF0ZQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQURfU0xPV19QRVJJT0RJQzoKKwkJCQlpZiAoKHBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlICYgQURfU1RBVEVfTEFDUF9USU1FT1VUKSkgeworCQkJCQkvLyBzdG9wIGN1cnJlbnQgdGltZXIKKwkJCQkJcG9ydC0+c21fcGVyaW9kaWNfdGltZXJfY291bnRlciA9IDA7CisJCQkJCXBvcnQtPnNtX3BlcmlvZGljX3N0YXRlID0gQURfUEVSSU9ESUNfVFg7CSAvLyBuZXh0IHN0YXRlCisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDogICAgLy90byBzaWxlbmNlIHRoZSBjb21waWxlcgorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChwb3J0LT5zbV9wZXJpb2RpY19zdGF0ZSkgeworCQljYXNlIEFEX05PX1BFUklPRElDOgorCQkJcG9ydC0+c21fcGVyaW9kaWNfc3RhdGUgPSBBRF9GQVNUX1BFUklPRElDOwkgLy8gbmV4dCBzdGF0ZQorCQkJYnJlYWs7CisJCWNhc2UgQURfUEVSSU9ESUNfVFg6CisJCQlpZiAoIShwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSAmIEFEX1NUQVRFX0xBQ1BfVElNRU9VVCkpIHsKKwkJCQlwb3J0LT5zbV9wZXJpb2RpY19zdGF0ZSA9IEFEX1NMT1dfUEVSSU9ESUM7ICAvLyBuZXh0IHN0YXRlCisJCQl9IGVsc2UgeworCQkJCXBvcnQtPnNtX3BlcmlvZGljX3N0YXRlID0gQURfRkFTVF9QRVJJT0RJQzsgIC8vIG5leHQgc3RhdGUKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAgICAvL3RvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIGNoZWNrIGlmIHRoZSBzdGF0ZSBtYWNoaW5lIHdhcyBjaGFuZ2VkCisJaWYgKHBvcnQtPnNtX3BlcmlvZGljX3N0YXRlICE9IGxhc3Rfc3RhdGUpIHsKKwkJZHByaW50aygiUGVyaW9kaWMgTWFjaGluZTogUG9ydD0lZCwgTGFzdCBTdGF0ZT0lZCwgQ3VyciBTdGF0ZT0lZFxuIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIsIGxhc3Rfc3RhdGUsIHBvcnQtPnNtX3BlcmlvZGljX3N0YXRlKTsKKwkJc3dpdGNoIChwb3J0LT5zbV9wZXJpb2RpY19zdGF0ZSkgeworCQljYXNlIEFEX05PX1BFUklPRElDOgorCQkJcG9ydC0+c21fcGVyaW9kaWNfdGltZXJfY291bnRlciA9IDA7CSAgIC8vIHplcm8gdGltZXIKKwkJCWJyZWFrOworCQljYXNlIEFEX0ZBU1RfUEVSSU9ESUM6CisJCQlwb3J0LT5zbV9wZXJpb2RpY190aW1lcl9jb3VudGVyID0gX19hZF90aW1lcl90b190aWNrcyhBRF9QRVJJT0RJQ19USU1FUiwgKHUxNikoQURfRkFTVF9QRVJJT0RJQ19USU1FKSktMTsgLy8gZGVjcmVtZW50IDEgdGljayB3ZSBsb3N0IGluIHRoZSBQRVJJT0RJQ19UWCBjeWNsZQorCQkJYnJlYWs7CisJCWNhc2UgQURfU0xPV19QRVJJT0RJQzoKKwkJCXBvcnQtPnNtX3BlcmlvZGljX3RpbWVyX2NvdW50ZXIgPSBfX2FkX3RpbWVyX3RvX3RpY2tzKEFEX1BFUklPRElDX1RJTUVSLCAodTE2KShBRF9TTE9XX1BFUklPRElDX1RJTUUpKS0xOyAvLyBkZWNyZW1lbnQgMSB0aWNrIHdlIGxvc3QgaW4gdGhlIFBFUklPRElDX1RYIGN5Y2xlCisJCQlicmVhazsKKwkJY2FzZSBBRF9QRVJJT0RJQ19UWDoKKwkJCXBvcnQtPm50dCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDogICAgLy90byBzaWxlbmNlIHRoZSBjb21waWxlcgorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qKgorICogYWRfcG9ydF9zZWxlY3Rpb25fbG9naWMgLSBzZWxlY3QgYWdncmVnYXRpb24gZ3JvdXBzCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqIFNlbGVjdCBhZ2dyZWdhdGlvbiBncm91cHMsIGFuZCBhc3NpZ24gZWFjaCBwb3J0IGZvciBpdCdzIGFnZ3JlZ2V0b3IuIFRoZQorICogc2VsZWN0aW9uIGxvZ2ljIGlzIGNhbGxlZCBpbiB0aGUgaW5pdGl0YWxpemF0aW9uIChhZnRlciBhbGwgdGhlIGhhbmRzaGtlcyksCisgKiBhbmQgYWZ0ZXIgZXZlcnkgbGFjcGR1IHJlY2VpdmUgKGlmIHNlbGVjdGVkIGlzIG9mZikuCisgKi8KK3N0YXRpYyB2b2lkIGFkX3BvcnRfc2VsZWN0aW9uX2xvZ2ljKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yLCAqZnJlZV9hZ2dyZWdhdG9yID0gTlVMTCwgKnRlbXBfYWdncmVnYXRvcjsKKwlzdHJ1Y3QgcG9ydCAqbGFzdF9wb3J0ID0gTlVMTCwgKmN1cnJfcG9ydDsKKwlpbnQgZm91bmQgPSAwOworCisJLy8gaWYgdGhlIHBvcnQgaXMgYWxyZWFkeSBTZWxlY3RlZCwgZG8gbm90aGluZworCWlmIChwb3J0LT5zbV92YXJzICYgQURfUE9SVF9TRUxFQ1RFRCkgeworCQlyZXR1cm47CisJfQorCisJLy8gaWYgdGhlIHBvcnQgaXMgY29ubmVjdGVkIHRvIG90aGVyIGFnZ3JlZ2F0b3IsIGRldGFjaCBpdAorCWlmIChwb3J0LT5hZ2dyZWdhdG9yKSB7CisJCS8vIGRldGFjaCB0aGUgcG9ydCBmcm9tIGl0cyBmb3JtZXIgYWdncmVnYXRvcgorCQl0ZW1wX2FnZ3JlZ2F0b3I9cG9ydC0+YWdncmVnYXRvcjsKKwkJZm9yIChjdXJyX3BvcnQ9dGVtcF9hZ2dyZWdhdG9yLT5sYWdfcG9ydHM7IGN1cnJfcG9ydDsgbGFzdF9wb3J0PWN1cnJfcG9ydCwgY3Vycl9wb3J0PWN1cnJfcG9ydC0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3IpIHsKKwkJCWlmIChjdXJyX3BvcnQgPT0gcG9ydCkgeworCQkJCXRlbXBfYWdncmVnYXRvci0+bnVtX29mX3BvcnRzLS07CisJCQkJaWYgKCFsYXN0X3BvcnQpIHsvLyBpZiBpdCBpcyB0aGUgZmlyc3QgcG9ydCBhdHRhY2hlZCB0byB0aGUgYWdncmVnYXRvcgorCQkJCQl0ZW1wX2FnZ3JlZ2F0b3ItPmxhZ19wb3J0cz1wb3J0LT5uZXh0X3BvcnRfaW5fYWdncmVnYXRvcjsKKwkJCQl9IGVsc2Ugey8vIG5vdCB0aGUgZmlyc3QgcG9ydCBhdHRhY2hlZCB0byB0aGUgYWdncmVnYXRvcgorCQkJCQlsYXN0X3BvcnQtPm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yPXBvcnQtPm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yOworCQkJCX0KKworCQkJCS8vIGNsZWFyIHRoZSBwb3J0J3MgcmVsYXRpb25zIHRvIHRoaXMgYWdncmVnYXRvcgorCQkJCXBvcnQtPmFnZ3JlZ2F0b3IgPSBOVUxMOworCQkJCXBvcnQtPm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yPU5VTEw7CisJCQkJcG9ydC0+YWN0b3JfcG9ydF9hZ2dyZWdhdG9yX2lkZW50aWZpZXI9MDsKKworCQkJCWRwcmludGsoIlBvcnQgJWQgbGVmdCBMQUcgJWRcbiIsIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyLCB0ZW1wX2FnZ3JlZ2F0b3ItPmFnZ3JlZ2F0b3JfaWRlbnRpZmllcik7CisJCQkJLy8gaWYgdGhlIGFnZ3JlZ2F0b3IgaXMgZW1wdHksIGNsZWFyIGl0cyBwYXJhbWV0ZXJzLCBhbmQgc2V0IGl0IHJlYWR5IHRvIGJlIGF0dGFjaGVkCisJCQkJaWYgKCF0ZW1wX2FnZ3JlZ2F0b3ItPmxhZ19wb3J0cykgeworCQkJCQlhZF9jbGVhcl9hZ2codGVtcF9hZ2dyZWdhdG9yKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFjdXJyX3BvcnQpIHsgLy8gbWVhbmluZzogdGhlIHBvcnQgd2FzIHJlbGF0ZWQgdG8gYW4gYWdncmVnYXRvciBidXQgd2FzIG5vdCBvbiB0aGUgYWdncmVnYXRvciBwb3J0IGxpc3QKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogV2FybmluZzogUG9ydCAlZCAob24gJXMpIHdhcyAiCisJCQkgICAgICAgInJlbGF0ZWQgdG8gYWdncmVnYXRvciAlZCBidXQgd2FzIG5vdCBvbiBpdHMgcG9ydCBsaXN0XG4iLAorCQkJICAgICAgIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyLCBwb3J0LT5zbGF2ZS0+ZGV2LT5uYW1lLAorCQkJICAgICAgIHBvcnQtPmFnZ3JlZ2F0b3ItPmFnZ3JlZ2F0b3JfaWRlbnRpZmllcik7CisJCX0KKwl9CisJLy8gc2VhcmNoIG9uIGFsbCBhZ2dyZWdhdG9ycyBmb3IgYSBzdWl0YWJsZSBhZ2dyZWdhdG9yIGZvciB0aGlzIHBvcnQKKwlmb3IgKGFnZ3JlZ2F0b3IgPSBfX2dldF9maXJzdF9hZ2cocG9ydCk7IGFnZ3JlZ2F0b3I7CisJICAgICBhZ2dyZWdhdG9yID0gX19nZXRfbmV4dF9hZ2coYWdncmVnYXRvcikpIHsKKworCQkvLyBrZWVwIGEgZnJlZSBhZ2dyZWdhdG9yIGZvciBsYXRlciB1c2UoaWYgbmVlZGVkKQorCQlpZiAoIWFnZ3JlZ2F0b3ItPmxhZ19wb3J0cykgeworCQkJaWYgKCFmcmVlX2FnZ3JlZ2F0b3IpIHsKKwkJCQlmcmVlX2FnZ3JlZ2F0b3I9YWdncmVnYXRvcjsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCS8vIGNoZWNrIGlmIGN1cnJlbnQgYWdncmVnYXRvciBzdWl0cyB1cworCQlpZiAoKChhZ2dyZWdhdG9yLT5hY3Rvcl9vcGVyX2FnZ3JlZ2F0b3Jfa2V5ID09IHBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXkpICYmIC8vIGlmIGFsbCBwYXJhbWV0ZXJzIG1hdGNoIEFORAorCQkgICAgICFNQUNfQUREUkVTU19DT01QQVJFKCYoYWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW0pLCAmKHBvcnQtPnBhcnRuZXJfb3Blcl9zeXN0ZW0pKSAmJgorCQkgICAgIChhZ2dyZWdhdG9yLT5wYXJ0bmVyX3N5c3RlbV9wcmlvcml0eSA9PSBwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtX3ByaW9yaXR5KSAmJgorCQkgICAgIChhZ2dyZWdhdG9yLT5wYXJ0bmVyX29wZXJfYWdncmVnYXRvcl9rZXkgPT0gcG9ydC0+cGFydG5lcl9vcGVyX2tleSkKKwkJICAgICkgJiYKKwkJICAgICgoTUFDX0FERFJFU1NfQ09NUEFSRSgmKHBvcnQtPnBhcnRuZXJfb3Blcl9zeXN0ZW0pLCAmKG51bGxfbWFjX2FkZHIpKSAmJiAvLyBwYXJ0bmVyIGFuc3dlcnMKKwkJICAgICAgIWFnZ3JlZ2F0b3ItPmlzX2luZGl2aWR1YWwpICAvLyBidXQgaXMgbm90IGluZGl2aWR1YWwgT1IKKwkJICAgICkKKwkJICAgKSB7CisJCQkvLyBhdHRhY2ggdG8gdGhlIGZvdW5kZWQgYWdncmVnYXRvcgorCQkJcG9ydC0+YWdncmVnYXRvciA9IGFnZ3JlZ2F0b3I7CisJCQlwb3J0LT5hY3Rvcl9wb3J0X2FnZ3JlZ2F0b3JfaWRlbnRpZmllcj1wb3J0LT5hZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXI7CisJCQlwb3J0LT5uZXh0X3BvcnRfaW5fYWdncmVnYXRvcj1hZ2dyZWdhdG9yLT5sYWdfcG9ydHM7CisJCQlwb3J0LT5hZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHMrKzsKKwkJCWFnZ3JlZ2F0b3ItPmxhZ19wb3J0cz1wb3J0OworCQkJZHByaW50aygiUG9ydCAlZCBqb2luZWQgTEFHICVkKGV4aXN0aW5nIExBRylcbiIsIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyLCBwb3J0LT5hZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIpOworCisJCQkvLyBtYXJrIHRoaXMgcG9ydCBhcyBzZWxlY3RlZAorCQkJcG9ydC0+c21fdmFycyB8PSBBRF9QT1JUX1NFTEVDVEVEOworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyB0aGUgcG9ydCBjb3VsZG4ndCBmaW5kIGFuIGFnZ3JlZ2F0b3IgLSBhdHRhY2ggaXQgdG8gYSBuZXcgYWdncmVnYXRvcgorCWlmICghZm91bmQpIHsKKwkJaWYgKGZyZWVfYWdncmVnYXRvcikgeworCQkJLy8gYXNzaWduIHBvcnQgYSBuZXcgYWdncmVnYXRvcgorCQkJcG9ydC0+YWdncmVnYXRvciA9IGZyZWVfYWdncmVnYXRvcjsKKwkJCXBvcnQtPmFjdG9yX3BvcnRfYWdncmVnYXRvcl9pZGVudGlmaWVyPXBvcnQtPmFnZ3JlZ2F0b3ItPmFnZ3JlZ2F0b3JfaWRlbnRpZmllcjsKKworCQkJLy8gdXBkYXRlIHRoZSBuZXcgYWdncmVnYXRvcidzIHBhcmFtZXRlcnMKKwkJCS8vIGlmIHBvcnQgd2FzIHJlc3BvbnNlZCBmcm9tIHRoZSBlbmQtdXNlcgorCQkJaWYgKHBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXkgJiBBRF9EVVBMRVhfS0VZX0JJVFMpIHsvLyBpZiBwb3J0IGlzIGZ1bGwgZHVwbGV4CisJCQkJcG9ydC0+YWdncmVnYXRvci0+aXNfaW5kaXZpZHVhbCA9IDA7CisJCQl9IGVsc2UgeworCQkJCXBvcnQtPmFnZ3JlZ2F0b3ItPmlzX2luZGl2aWR1YWwgPSAxOworCQkJfQorCisJCQlwb3J0LT5hZ2dyZWdhdG9yLT5hY3Rvcl9hZG1pbl9hZ2dyZWdhdG9yX2tleSA9IHBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5OworCQkJcG9ydC0+YWdncmVnYXRvci0+YWN0b3Jfb3Blcl9hZ2dyZWdhdG9yX2tleSA9IHBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXk7CisJCQlwb3J0LT5hZ2dyZWdhdG9yLT5wYXJ0bmVyX3N5c3RlbT1wb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtOworCQkJcG9ydC0+YWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW1fcHJpb3JpdHkgPSBwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtX3ByaW9yaXR5OworCQkJcG9ydC0+YWdncmVnYXRvci0+cGFydG5lcl9vcGVyX2FnZ3JlZ2F0b3Jfa2V5ID0gcG9ydC0+cGFydG5lcl9vcGVyX2tleTsKKwkJCXBvcnQtPmFnZ3JlZ2F0b3ItPnJlY2VpdmVfc3RhdGUgPSAxOworCQkJcG9ydC0+YWdncmVnYXRvci0+dHJhbnNtaXRfc3RhdGUgPSAxOworCQkJcG9ydC0+YWdncmVnYXRvci0+bGFnX3BvcnRzID0gcG9ydDsKKwkJCXBvcnQtPmFnZ3JlZ2F0b3ItPm51bV9vZl9wb3J0cysrOworCisJCQkvLyBtYXJrIHRoaXMgcG9ydCBhcyBzZWxlY3RlZAorCQkJcG9ydC0+c21fdmFycyB8PSBBRF9QT1JUX1NFTEVDVEVEOworCisJCQlkcHJpbnRrKCJQb3J0ICVkIGpvaW5lZCBMQUcgJWQobmV3IExBRylcbiIsIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyLCBwb3J0LT5hZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IFBvcnQgJWQgKG9uICVzKSBkaWQgbm90IGZpbmQgYSBzdWl0YWJsZSBhZ2dyZWdhdG9yXG4iLAorCQkJICAgICAgIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyLCBwb3J0LT5zbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJfQorCX0KKwkvLyBpZiBhbGwgYWdncmVnYXRvcidzIHBvcnRzIGFyZSBSRUFEWV9OID09IFRSVUUsIHNldCByZWFkeT1UUlVFIGluIGFsbCBhZ2dyZWdhdG9yJ3MgcG9ydHMKKwkvLyBlbHNlIHNldCByZWFkeT1GQUxTRSBpbiBhbGwgYWdncmVnYXRvcidzIHBvcnRzCisJX19zZXRfYWdnX3BvcnRzX3JlYWR5KHBvcnQtPmFnZ3JlZ2F0b3IsIF9fYWdnX3BvcnRzX2FyZV9yZWFkeShwb3J0LT5hZ2dyZWdhdG9yKSk7CisKKwlpZiAoIV9fY2hlY2tfYWdnX3NlbGVjdGlvbl90aW1lcihwb3J0KSAmJiAoYWdncmVnYXRvciA9IF9fZ2V0X2ZpcnN0X2FnZyhwb3J0KSkpIHsKKwkJYWRfYWdnX3NlbGVjdGlvbl9sb2dpYyhhZ2dyZWdhdG9yKTsKKwl9Cit9CisKKy8qKgorICogYWRfYWdnX3NlbGVjdGlvbl9sb2dpYyAtIHNlbGVjdCBhbiBhZ2dyZWdhdGlvbiBncm91cCBmb3IgYSB0ZWFtCisgKiBAYWdncmVnYXRvcjogdGhlIGFnZ3JlZ2F0b3Igd2UncmUgbG9va2luZyBhdAorICoKKyAqIEl0IGlzIGFzc3VtZWQgdGhhdCBvbmx5IG9uZSBhZ2dyZWdhdG9yIG1heSBiZSBzZWxlY3RlZCBmb3IgYSB0ZWFtLgorICogVGhlIGxvZ2ljIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gc2VsZWN0IChhdCBmaXJzdCB0aW1lKSB0aGUgYWdncmVnYXRvciB3aXRoCisgKiB0aGUgbW9zdCBwb3J0cyBhdHRhY2hlZCB0byBpdCwgYW5kIHRvIHJlc2VsZWN0IHRoZSBhY3RpdmUgYWdncmVnYXRvciBvbmx5IGlmCisgKiB0aGUgcHJldmlvdXMgYWdncmVnYXRvciBoYXMgbm8gbW9yZSBwb3J0cyByZWxhdGVkIHRvIGl0LgorICoKKyAqIEZJWE1FOiB0aGlzIGZ1bmN0aW9uIE1VU1QgYmUgY2FsbGVkIHdpdGggdGhlIGZpcnN0IGFnZyBpbiB0aGUgYm9uZCwgb3IKKyAqIF9fZ2V0X2FjdGl2ZV9hZ2coKSB3b24ndCB3b3JrIGNvcnJlY3RseS4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYmV0dGVyCisgKiBjYWxsZWQgd2l0aCB0aGUgYm9uZCBpdHNlbGYsIGFuZCByZXRyaWV2ZSB0aGUgZmlyc3QgYWdnIGZyb20gaXQuCisgKi8KK3N0YXRpYyB2b2lkIGFkX2FnZ19zZWxlY3Rpb25fbG9naWMoc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3IpCit7CisJc3RydWN0IGFnZ3JlZ2F0b3IgKmJlc3RfYWdncmVnYXRvciA9IE5VTEwsICphY3RpdmVfYWdncmVnYXRvciA9IE5VTEw7CisJc3RydWN0IGFnZ3JlZ2F0b3IgKmxhc3RfYWN0aXZlX2FnZ3JlZ2F0b3IgPSBOVUxMLCAqb3JpZ2luX2FnZ3JlZ2F0b3I7CisJc3RydWN0IHBvcnQgKnBvcnQ7CisJdTE2IG51bV9vZl9hZ2dzPTA7CisKKwlvcmlnaW5fYWdncmVnYXRvciA9IGFnZ3JlZ2F0b3I7CisKKwkvL2dldCBjdXJyZW50IGFjdGl2ZSBhZ2dyZWdhdG9yCisJbGFzdF9hY3RpdmVfYWdncmVnYXRvciA9IF9fZ2V0X2FjdGl2ZV9hZ2coYWdncmVnYXRvcik7CisKKwkvLyBzZWFyY2ggZm9yIHRoZSBhZ2dyZWdhdG9yIHdpdGggdGhlIG1vc3QgcG9ydHMgYXR0YWNoZWQgdG8gaXQuCisJZG8geworCQkvLyBjb3VudCBob3cgbWFueSBjYW5kaWRhdGUgbGFnJ3Mgd2UgaGF2ZQorCQlpZiAoYWdncmVnYXRvci0+bGFnX3BvcnRzKSB7CisJCQludW1fb2ZfYWdncysrOworCQl9CisJCWlmIChhZ2dyZWdhdG9yLT5pc19hY3RpdmUgJiYgIWFnZ3JlZ2F0b3ItPmlzX2luZGl2aWR1YWwgJiYgICAvLyBpZiBjdXJyZW50IGFnZ3JlZ2F0b3IgaXMgdGhlIGFjdGl2ZSBhZ2dyZWdhdG9yCisJCSAgICBNQUNfQUREUkVTU19DT01QQVJFKCYoYWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW0pLCAmKG51bGxfbWFjX2FkZHIpKSkgeyAgIC8vIGFuZCBwYXJ0bmVyIGFuc3dlcnMgdG8gODAyLjNhZCBQRFVzCisJCQlpZiAoYWdncmVnYXRvci0+bnVtX29mX3BvcnRzKSB7CS8vIGlmIGFueSBwb3J0cyBhdHRhY2hlZCB0byB0aGUgY3VycmVudCBhZ2dyZWdhdG9yCisJCQkJYmVzdF9hZ2dyZWdhdG9yPU5VTEw7CSAvLyBkaXNyZWdhcmQgdGhlIGJlc3QgYWdncmVnYXRvciB0aGF0IHdhcyBjaG9zZW4gYnkgbm93CisJCQkJYnJlYWs7CQkgLy8gc3RvcCB0aGUgc2VsZWN0aW9uIG9mIG90aGVyIGFnZ3JlZ2F0b3IgaWYgdGhlcmUgYXJlIGFueSBwb3J0cyBhdHRhY2hlZCB0byB0aGlzIGFjdGl2ZSBhZ2dyZWdhdG9yCisJCQl9IGVsc2UgeyAvLyBubyBwb3J0cyBhdHRhY2hlZCB0byB0aGlzIGFjdGl2ZSBhZ2dyZWdhdG9yCisJCQkJYWdncmVnYXRvci0+aXNfYWN0aXZlID0gMDsgLy8gbWFyayB0aGlzIGFnZ3JlZ2F0b3IgYXMgbm90IGFjdGl2ZSBhbnltb3JlCisJCQl9CisJCX0KKwkJaWYgKGFnZ3JlZ2F0b3ItPm51bV9vZl9wb3J0cykgewkvLyBpZiBhbnkgcG9ydHMgYXR0YWNoZWQKKwkJCWlmIChiZXN0X2FnZ3JlZ2F0b3IpIHsJLy8gaWYgdGhlcmUgaXMgYSBjYW5kaWR0ZSBhZ2dyZWdhdG9yCisJCQkJLy9UaGUgcmVhc29ucyBmb3IgY2hvb3NpbmcgbmV3IGJlc3QgYWdncmVnYXRvcjoKKwkJCQkvLyAxLiBpZiBjdXJyZW50IGFnZyBpcyBOT1QgaW5kaXZpZHVhbCBhbmQgdGhlIGJlc3QgYWdnIGNob3NlbiBzbyBmYXIgaXMgaW5kaXZpZHVhbCBPUgorCQkJCS8vIGN1cnJlbnQgYW5kIGJlc3QgYWdncyBhcmUgYm90aCBpbmRpdmlkdWFsIG9yIGJvdGggbm90IGluZGl2aWR1YWwsIEFORAorCQkJCS8vIDJhLiAgY3VycmVudCBhZ2cgcGFydG5lciByZXBseSBidXQgYmVzdCBhZ2cgcGFydG5lciBkbyBub3QgcmVwbHkgT1IKKwkJCQkvLyAyYi4gIGN1cnJlbnQgYWdnIHBhcnRuZXIgcmVwbHkgT1IgY3VycmVudCBhZ2cgcGFydG5lciBkbyBub3QgcmVwbHkgQU5EIGJlc3QgYWdnIHBhcnRuZXIgYWxzbyBkbyBub3QgcmVwbHkgQU5ECisJCQkJLy8gICAgICBjdXJyZW50IGhhcyBtb3JlIHBvcnRzL2JhbmR3aWR0aCwgb3Igc2FtZSBhbW91bnQgb2YgcG9ydHMgYnV0IGN1cnJlbnQgaGFzIGZhc3RlciBwb3J0cywgVEhFTgorCQkJCS8vICAgICAgY3VycmVudCBhZ2cgYmVjb21lIGJlc3QgYWdnIHNvIGZhcgorCisJCQkJLy9pZiBjdXJyZW50IGFnZyBpcyBOT1QgaW5kaXZpZHVhbCBhbmQgdGhlIGJlc3QgYWdnIGNob3NlbiBzbyBmYXIgaXMgaW5kaXZpZHVhbCBjaGFuZ2UgYmVzdF9hZ2dyZWdhdG9yCisJCQkJaWYgKCFhZ2dyZWdhdG9yLT5pc19pbmRpdmlkdWFsICYmIGJlc3RfYWdncmVnYXRvci0+aXNfaW5kaXZpZHVhbCkgeworCQkJCQliZXN0X2FnZ3JlZ2F0b3I9YWdncmVnYXRvcjsKKwkJCQl9CisJCQkJLy8gY3VycmVudCBhbmQgYmVzdCBhZ2dzIGFyZSBib3RoIGluZGl2aWR1YWwgb3IgYm90aCBub3QgaW5kaXZpZHVhbAorCQkJCWVsc2UgaWYgKChhZ2dyZWdhdG9yLT5pc19pbmRpdmlkdWFsICYmIGJlc3RfYWdncmVnYXRvci0+aXNfaW5kaXZpZHVhbCkgfHwKKwkJCQkJICghYWdncmVnYXRvci0+aXNfaW5kaXZpZHVhbCAmJiAhYmVzdF9hZ2dyZWdhdG9yLT5pc19pbmRpdmlkdWFsKSkgeworCQkJCQkvLyAgY3VycmVudCBhbmQgYmVzdCBhZ2dzIGFyZSBib3RoIGluZGl2aWR1YWwgb3IgYm90aCBub3QgaW5kaXZpZHVhbCBBTkQKKwkJCQkJLy8gIGN1cnJlbnQgYWdnIHBhcnRuZXIgcmVwbHkgYnV0IGJlc3QgYWdnIHBhcnRuZXIgZG8gbm90IHJlcGx5CisJCQkJCWlmICgoTUFDX0FERFJFU1NfQ09NUEFSRSgmKGFnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtKSwgJihudWxsX21hY19hZGRyKSkgJiYKKwkJCQkJICAgICAhTUFDX0FERFJFU1NfQ09NUEFSRSgmKGJlc3RfYWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW0pLCAmKG51bGxfbWFjX2FkZHIpKSkpIHsKKwkJCQkJCWJlc3RfYWdncmVnYXRvcj1hZ2dyZWdhdG9yOworCQkJCQl9CisJCQkJCS8vICBjdXJyZW50IGFnZyBwYXJ0bmVyIHJlcGx5IE9SIGN1cnJlbnQgYWdnIHBhcnRuZXIgZG8gbm90IHJlcGx5IEFORCBiZXN0IGFnZyBwYXJ0bmVyIGFsc28gZG8gbm90IHJlcGx5CisJCQkJCWVsc2UgaWYgKCEgKCFNQUNfQUREUkVTU19DT01QQVJFKCYoYWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW0pLCAmKG51bGxfbWFjX2FkZHIpKSAmJgorCQkJCQkJICAgIE1BQ19BRERSRVNTX0NPTVBBUkUoJihiZXN0X2FnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtKSwgJihudWxsX21hY19hZGRyKSkpKSB7CisJCQkJCQlpZiAoKF9fZ2V0X2FnZ19zZWxlY3Rpb25fbW9kZShhZ2dyZWdhdG9yLT5sYWdfcG9ydHMpID09IEFEX0JBTkRXSURUSCkmJgorCQkJCQkJICAgIChfX2dldF9hZ2dfYmFuZHdpZHRoKGFnZ3JlZ2F0b3IpID4gX19nZXRfYWdnX2JhbmR3aWR0aChiZXN0X2FnZ3JlZ2F0b3IpKSkgeworCQkJCQkJCWJlc3RfYWdncmVnYXRvcj1hZ2dyZWdhdG9yOworCQkJCQkJfSBlbHNlIGlmIChfX2dldF9hZ2dfc2VsZWN0aW9uX21vZGUoYWdncmVnYXRvci0+bGFnX3BvcnRzKSA9PSBBRF9DT1VOVCkgeworCQkJCQkJCWlmICgoKGFnZ3JlZ2F0b3ItPm51bV9vZl9wb3J0cyA+IGJlc3RfYWdncmVnYXRvci0+bnVtX29mX3BvcnRzKSAmJgorCQkJCQkJCSAgICAgKGFnZ3JlZ2F0b3ItPmFjdG9yX29wZXJfYWdncmVnYXRvcl9rZXkgJiBBRF9TUEVFRF9LRVlfQklUUykpfHwKKwkJCQkJCQkgICAgKChhZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHMgPT0gYmVzdF9hZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHMpICYmCisJCQkJCQkJICAgICAoKHUxNikoYWdncmVnYXRvci0+YWN0b3Jfb3Blcl9hZ2dyZWdhdG9yX2tleSAmIEFEX1NQRUVEX0tFWV9CSVRTKSA+CisJCQkJCQkJICAgICAgKHUxNikoYmVzdF9hZ2dyZWdhdG9yLT5hY3Rvcl9vcGVyX2FnZ3JlZ2F0b3Jfa2V5ICYgQURfU1BFRURfS0VZX0JJVFMpKSkpIHsKKwkJCQkJCQkJYmVzdF9hZ2dyZWdhdG9yPWFnZ3JlZ2F0b3I7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQliZXN0X2FnZ3JlZ2F0b3I9YWdncmVnYXRvcjsKKwkJCX0KKwkJfQorCQlhZ2dyZWdhdG9yLT5pc19hY3RpdmUgPSAwOyAvLyBtYXJrIGFsbCBhZ2dyZWdhdG9ycyBhcyBub3QgYWN0aXZlIGFueW1vcmUKKwl9IHdoaWxlICgoYWdncmVnYXRvciA9IF9fZ2V0X25leHRfYWdnKGFnZ3JlZ2F0b3IpKSk7CisKKwkvLyBpZiB3ZSBoYXZlIG5ldyBhZ2dyZWdhdG9yIHNlbGVjdGVkLCBkb24ndCByZXBsYWNlIHRoZSBvbGQgYWdncmVnYXRvciBpZiBpdCBoYXMgYW4gYW5zd2VyaW5nIHBhcnRuZXIsCisJLy8gb3IgaWYgYm90aCBvbGQgYWdncmVnYXRvciBhbmQgbmV3IGFnZ3JlZ2F0b3IgZG9uJ3QgaGF2ZSBhbnN3ZXJpbmcgcGFydG5lcgorCWlmIChiZXN0X2FnZ3JlZ2F0b3IpIHsKKwkJaWYgKGxhc3RfYWN0aXZlX2FnZ3JlZ2F0b3IgJiYgbGFzdF9hY3RpdmVfYWdncmVnYXRvci0+bGFnX3BvcnRzICYmIGxhc3RfYWN0aXZlX2FnZ3JlZ2F0b3ItPmxhZ19wb3J0cy0+aXNfZW5hYmxlZCAmJgorCQkgICAgKE1BQ19BRERSRVNTX0NPTVBBUkUoJihsYXN0X2FjdGl2ZV9hZ2dyZWdhdG9yLT5wYXJ0bmVyX3N5c3RlbSksICYobnVsbF9tYWNfYWRkcikpIHx8ICAgLy8gcGFydG5lciBhbnN3ZXJzIE9SCisJCSAgICAgKCFNQUNfQUREUkVTU19DT01QQVJFKCYobGFzdF9hY3RpdmVfYWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW0pLCAmKG51bGxfbWFjX2FkZHIpKSAmJgkvLyBib3RoIG9sZCBhbmQgbmV3CisJCSAgICAgICFNQUNfQUREUkVTU19DT01QQVJFKCYoYmVzdF9hZ2dyZWdhdG9yLT5wYXJ0bmVyX3N5c3RlbSksICYobnVsbF9tYWNfYWRkcikpKSkgICAgIC8vIHBhcnRuZXIgZG8gbm90IGFuc3dlcgorCQkgICApIHsKKwkJCS8vIGlmIG5ldyBhZ2dyZWdhdG9yIGhhcyBsaW5rLCBhbmQgb2xkIGFnZ3JlZ2F0b3IgZG9lcyBub3QsIHJlcGxhY2Ugb2xkIGFnZ3JlZ2F0b3IuKGRvIG5vdGhpbmcpCisJCQkvLyAtPiBkb24ndCByZXBsYWNlIG90aGVyd2lzZS4KKwkJCWlmICghKCFsYXN0X2FjdGl2ZV9hZ2dyZWdhdG9yLT5hY3Rvcl9vcGVyX2FnZ3JlZ2F0b3Jfa2V5ICYmIGJlc3RfYWdncmVnYXRvci0+YWN0b3Jfb3Blcl9hZ2dyZWdhdG9yX2tleSkpIHsKKwkJCQliZXN0X2FnZ3JlZ2F0b3I9TlVMTDsKKwkJCQlsYXN0X2FjdGl2ZV9hZ2dyZWdhdG9yLT5pc19hY3RpdmUgPSAxOyAvLyBkb24ndCByZXBsYWNlIGdvb2Qgb2xkIGFnZ3JlZ2F0b3IKKworCQkJfQorCQl9CisJfQorCisJLy8gaWYgdGhlcmUgaXMgbmV3IGJlc3QgYWdncmVnYXRvciwgYWN0aXZhdGUgaXQKKwlpZiAoYmVzdF9hZ2dyZWdhdG9yKSB7CisJCWZvciAoYWdncmVnYXRvciA9IF9fZ2V0X2ZpcnN0X2FnZyhiZXN0X2FnZ3JlZ2F0b3ItPmxhZ19wb3J0cyk7CisJCSAgICBhZ2dyZWdhdG9yOworCQkgICAgYWdncmVnYXRvciA9IF9fZ2V0X25leHRfYWdnKGFnZ3JlZ2F0b3IpKSB7CisKKwkJCWRwcmludGsoIkFnZz0lZDsgUG9ydHM9JWQ7IGEga2V5PSVkOyBwIGtleT0lZDsgSW5kaXY9JWQ7IEFjdGl2ZT0lZFxuIiwKKwkJCQkJYWdncmVnYXRvci0+YWdncmVnYXRvcl9pZGVudGlmaWVyLCBhZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHMsCisJCQkJCWFnZ3JlZ2F0b3ItPmFjdG9yX29wZXJfYWdncmVnYXRvcl9rZXksIGFnZ3JlZ2F0b3ItPnBhcnRuZXJfb3Blcl9hZ2dyZWdhdG9yX2tleSwKKwkJCQkJYWdncmVnYXRvci0+aXNfaW5kaXZpZHVhbCwgYWdncmVnYXRvci0+aXNfYWN0aXZlKTsKKwkJfQorCisJCS8vIGNoZWNrIGlmIGFueSBwYXJ0bmVyIHJlcGx5cworCQlpZiAoYmVzdF9hZ2dyZWdhdG9yLT5pc19pbmRpdmlkdWFsKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IFdhcm5pbmc6IE5vIDgwMi4zYWQgcmVzcG9uc2UgZnJvbSB0aGUgbGluayBwYXJ0bmVyICIKKwkJCQkJImZvciBhbnkgYWRhcHRlcnMgaW4gdGhlIGJvbmRcbiIpOworCQl9CisKKwkJLy8gY2hlY2sgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgYWdncmVnYXRvcgorCQlpZiAobnVtX29mX2FnZ3MgPiAxKSB7CisJCQlkcHJpbnRrKCJXYXJuaW5nOiBNb3JlIHRoYW4gb25lIExpbmsgQWdncmVnYXRpb24gR3JvdXAgd2FzICIKKwkJCQkiZm91bmQgaW4gdGhlIGJvbmQuIE9ubHkgb25lIGdyb3VwIHdpbGwgZnVuY3Rpb24gaW4gdGhlIGJvbmRcbiIpOworCQl9CisKKwkJYmVzdF9hZ2dyZWdhdG9yLT5pc19hY3RpdmUgPSAxOworCQlkcHJpbnRrKCJMQUcgJWQgY2hvb3NlZCBhcyB0aGUgYWN0aXZlIExBR1xuIiwgYmVzdF9hZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIpOworCQlkcHJpbnRrKCJBZ2c9JWQ7IFBvcnRzPSVkOyBhIGtleT0lZDsgcCBrZXk9JWQ7IEluZGl2PSVkOyBBY3RpdmU9JWRcbiIsCisJCQkJYmVzdF9hZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIsIGJlc3RfYWdncmVnYXRvci0+bnVtX29mX3BvcnRzLAorCQkJCWJlc3RfYWdncmVnYXRvci0+YWN0b3Jfb3Blcl9hZ2dyZWdhdG9yX2tleSwgYmVzdF9hZ2dyZWdhdG9yLT5wYXJ0bmVyX29wZXJfYWdncmVnYXRvcl9rZXksCisJCQkJYmVzdF9hZ2dyZWdhdG9yLT5pc19pbmRpdmlkdWFsLCBiZXN0X2FnZ3JlZ2F0b3ItPmlzX2FjdGl2ZSk7CisKKwkJLy8gZGlzYWJsZSB0aGUgcG9ydHMgdGhhdCB3ZXJlIHJlbGF0ZWQgdG8gdGhlIGZvcm1lciBhY3RpdmVfYWdncmVnYXRvcgorCQlpZiAobGFzdF9hY3RpdmVfYWdncmVnYXRvcikgeworCQkJZm9yIChwb3J0PWxhc3RfYWN0aXZlX2FnZ3JlZ2F0b3ItPmxhZ19wb3J0czsgcG9ydDsgcG9ydD1wb3J0LT5uZXh0X3BvcnRfaW5fYWdncmVnYXRvcikgeworCQkJCV9fZGlzYWJsZV9wb3J0KHBvcnQpOworCQkJfQorCQl9CisJfQorCisJLy8gaWYgdGhlIHNlbGVjdGVkIGFnZ3JlZ2F0b3IgaXMgb2Ygam9pbiBpbmRpdmlkdWFscyhwYXJ0bmVyX3N5c3RlbSBpcyBOVUxMKSwgZW5hYmxlIHRoZWlyIHBvcnRzCisJYWN0aXZlX2FnZ3JlZ2F0b3IgPSBfX2dldF9hY3RpdmVfYWdnKG9yaWdpbl9hZ2dyZWdhdG9yKTsKKworCWlmIChhY3RpdmVfYWdncmVnYXRvcikgeworCQlpZiAoIU1BQ19BRERSRVNTX0NPTVBBUkUoJihhY3RpdmVfYWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW0pLCAmKG51bGxfbWFjX2FkZHIpKSkgeworCQkJZm9yIChwb3J0PWFjdGl2ZV9hZ2dyZWdhdG9yLT5sYWdfcG9ydHM7IHBvcnQ7IHBvcnQ9cG9ydC0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3IpIHsKKwkJCQlfX2VuYWJsZV9wb3J0KHBvcnQpOworCQkJfQorCQl9CisJfQorfQorCisvKioKKyAqIGFkX2NsZWFyX2FnZyAtIGNsZWFyIGEgZ2l2ZW4gYWdncmVnYXRvcidzIHBhcmFtZXRlcnMKKyAqIEBhZ2dyZWdhdG9yOiB0aGUgYWdncmVnYXRvciB3ZSdyZSBsb29raW5nIGF0CisgKgorICovCitzdGF0aWMgdm9pZCBhZF9jbGVhcl9hZ2coc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3IpCit7CisJaWYgKGFnZ3JlZ2F0b3IpIHsKKwkJYWdncmVnYXRvci0+aXNfaW5kaXZpZHVhbCA9IDA7CisJCWFnZ3JlZ2F0b3ItPmFjdG9yX2FkbWluX2FnZ3JlZ2F0b3Jfa2V5ID0gMDsKKwkJYWdncmVnYXRvci0+YWN0b3Jfb3Blcl9hZ2dyZWdhdG9yX2tleSA9IDA7CisJCWFnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtID0gbnVsbF9tYWNfYWRkcjsKKwkJYWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW1fcHJpb3JpdHkgPSAwOworCQlhZ2dyZWdhdG9yLT5wYXJ0bmVyX29wZXJfYWdncmVnYXRvcl9rZXkgPSAwOworCQlhZ2dyZWdhdG9yLT5yZWNlaXZlX3N0YXRlID0gMDsKKwkJYWdncmVnYXRvci0+dHJhbnNtaXRfc3RhdGUgPSAwOworCQlhZ2dyZWdhdG9yLT5sYWdfcG9ydHMgPSBOVUxMOworCQlhZ2dyZWdhdG9yLT5pc19hY3RpdmUgPSAwOworCQlhZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHMgPSAwOworCQlkcHJpbnRrKCJMQUcgJWQgd2FzIGNsZWFyZWRcbiIsIGFnZ3JlZ2F0b3ItPmFnZ3JlZ2F0b3JfaWRlbnRpZmllcik7CisJfQorfQorCisvKioKKyAqIGFkX2luaXRpYWxpemVfYWdnIC0gaW5pdGlhbGl6ZSBhIGdpdmVuIGFnZ3JlZ2F0b3IncyBwYXJhbWV0ZXJzCisgKiBAYWdncmVnYXRvcjogdGhlIGFnZ3JlZ2F0b3Igd2UncmUgbG9va2luZyBhdAorICoKKyAqLworc3RhdGljIHZvaWQgYWRfaW5pdGlhbGl6ZV9hZ2coc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3IpCit7CisJaWYgKGFnZ3JlZ2F0b3IpIHsKKwkJYWRfY2xlYXJfYWdnKGFnZ3JlZ2F0b3IpOworCisJCWFnZ3JlZ2F0b3ItPmFnZ3JlZ2F0b3JfbWFjX2FkZHJlc3MgPSBudWxsX21hY19hZGRyOworCQlhZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIgPSAwOworCQlhZ2dyZWdhdG9yLT5zbGF2ZSA9IE5VTEw7CisJfQorfQorCisvKioKKyAqIGFkX2luaXRpYWxpemVfcG9ydCAtIGluaXRpYWxpemUgYSBnaXZlbiBwb3J0J3MgcGFyYW1ldGVycworICogQGFnZ3JlZ2F0b3I6IHRoZSBhZ2dyZWdhdG9yIHdlJ3JlIGxvb2tpbmcgYXQKKyAqIEBsYWNwX2Zhc3Q6IGJvb2xlYW4uIHdoZXRoZXIgZmFzdCBwZXJpb2RpYyBzaG91bGQgYmUgdXNlZAorICoKKyAqLworc3RhdGljIHZvaWQgYWRfaW5pdGlhbGl6ZV9wb3J0KHN0cnVjdCBwb3J0ICpwb3J0LCBpbnQgbGFjcF9mYXN0KQoreworCWlmIChwb3J0KSB7CisJCXBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyID0gMTsKKwkJcG9ydC0+YWN0b3JfcG9ydF9wcmlvcml0eSA9IDB4ZmY7CisJCXBvcnQtPmFjdG9yX3N5c3RlbSA9IG51bGxfbWFjX2FkZHI7CisJCXBvcnQtPmFjdG9yX3N5c3RlbV9wcmlvcml0eSA9IDB4ZmZmZjsKKwkJcG9ydC0+YWN0b3JfcG9ydF9hZ2dyZWdhdG9yX2lkZW50aWZpZXIgPSAwOworCQlwb3J0LT5udHQgPSAwOworCQlwb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleSA9IDE7CisJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXkgID0gMTsKKwkJcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9zdGF0ZSA9IEFEX1NUQVRFX0FHR1JFR0FUSU9OIHwgQURfU1RBVEVfTEFDUF9BQ1RJVklUWTsKKwkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICA9IEFEX1NUQVRFX0FHR1JFR0FUSU9OIHwgQURfU1RBVEVfTEFDUF9BQ1RJVklUWTsKKworCQlpZiAobGFjcF9mYXN0KSB7CisJCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgfD0gQURfU1RBVEVfTEFDUF9USU1FT1VUOworCQl9CisKKwkJcG9ydC0+cGFydG5lcl9hZG1pbl9zeXN0ZW0gPSBudWxsX21hY19hZGRyOworCQlwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtICA9IG51bGxfbWFjX2FkZHI7CisJCXBvcnQtPnBhcnRuZXJfYWRtaW5fc3lzdGVtX3ByaW9yaXR5ID0gMHhmZmZmOworCQlwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtX3ByaW9yaXR5ICA9IDB4ZmZmZjsKKwkJcG9ydC0+cGFydG5lcl9hZG1pbl9rZXkgPSAxOworCQlwb3J0LT5wYXJ0bmVyX29wZXJfa2V5ICA9IDE7CisJCXBvcnQtPnBhcnRuZXJfYWRtaW5fcG9ydF9udW1iZXIgPSAxOworCQlwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9udW1iZXIgID0gMTsKKwkJcG9ydC0+cGFydG5lcl9hZG1pbl9wb3J0X3ByaW9yaXR5ID0gMHhmZjsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfcHJpb3JpdHkgID0gMHhmZjsKKwkJcG9ydC0+cGFydG5lcl9hZG1pbl9wb3J0X3N0YXRlID0gMTsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgID0gMTsKKwkJcG9ydC0+aXNfZW5hYmxlZCA9IDE7CisJCS8vICoqKioqKiBwcml2YXRlIHBhcmFtZXRlcnMgKioqKioqCisJCXBvcnQtPnNtX3ZhcnMgPSAweDM7CisJCXBvcnQtPnNtX3J4X3N0YXRlID0gMDsKKwkJcG9ydC0+c21fcnhfdGltZXJfY291bnRlciA9IDA7CisJCXBvcnQtPnNtX3BlcmlvZGljX3N0YXRlID0gMDsKKwkJcG9ydC0+c21fcGVyaW9kaWNfdGltZXJfY291bnRlciA9IDA7CisJCXBvcnQtPnNtX211eF9zdGF0ZSA9IDA7CisJCXBvcnQtPnNtX211eF90aW1lcl9jb3VudGVyID0gMDsKKwkJcG9ydC0+c21fdHhfc3RhdGUgPSAwOworCQlwb3J0LT5zbV90eF90aW1lcl9jb3VudGVyID0gMDsKKwkJcG9ydC0+c2xhdmUgPSBOVUxMOworCQlwb3J0LT5hZ2dyZWdhdG9yID0gTlVMTDsKKwkJcG9ydC0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3IgPSBOVUxMOworCQlwb3J0LT50cmFuc2FjdGlvbl9pZCA9IDA7CisKKwkJYWRfaW5pdGlhbGl6ZV9sYWNwZHUoJihwb3J0LT5sYWNwZHUpKTsKKwl9Cit9CisKKy8qKgorICogYWRfZW5hYmxlX2NvbGxlY3RpbmdfZGlzdHJpYnV0aW5nIC0gZW5hYmxlIGEgcG9ydCdzIHRyYW5zbWl0L3JlY2VpdmUKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogRW5hYmxlIEBwb3J0IGlmIGl0J3MgaW4gYW4gYWN0aXZlIGFnZ3JlZ2F0b3IKKyAqLworc3RhdGljIHZvaWQgYWRfZW5hYmxlX2NvbGxlY3RpbmdfZGlzdHJpYnV0aW5nKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCWlmIChwb3J0LT5hZ2dyZWdhdG9yLT5pc19hY3RpdmUpIHsKKwkJZHByaW50aygiRW5hYmxpbmcgcG9ydCAlZChMQUcgJWQpXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlciwgcG9ydC0+YWdncmVnYXRvci0+YWdncmVnYXRvcl9pZGVudGlmaWVyKTsKKwkJX19lbmFibGVfcG9ydChwb3J0KTsKKwl9Cit9CisKKy8qKgorICogYWRfZGlzYWJsZV9jb2xsZWN0aW5nX2Rpc3RyaWJ1dGluZyAtIGRpc2FibGUgYSBwb3J0J3MgdHJhbnNtaXQvcmVjZWl2ZQorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGFkX2Rpc2FibGVfY29sbGVjdGluZ19kaXN0cmlidXRpbmcoc3RydWN0IHBvcnQgKnBvcnQpCit7CisJaWYgKHBvcnQtPmFnZ3JlZ2F0b3IgJiYgTUFDX0FERFJFU1NfQ09NUEFSRSgmKHBvcnQtPmFnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtKSwgJihudWxsX21hY19hZGRyKSkpIHsKKwkJZHByaW50aygiRGlzYWJsaW5nIHBvcnQgJWQoTEFHICVkKVxuIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIsIHBvcnQtPmFnZ3JlZ2F0b3ItPmFnZ3JlZ2F0b3JfaWRlbnRpZmllcik7CisJCV9fZGlzYWJsZV9wb3J0KHBvcnQpOworCX0KK30KKworI2lmIDAKKy8qKgorICogYWRfbWFya2VyX2luZm9fc2VuZCAtIHNlbmQgYSBtYXJrZXIgaW5mb3JtYXRpb24gZnJhbWUKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgc2luY2Ugd2UgZGVjaWRlZCBub3QgdG8gaW1wbGVtZW50IHNlbmQgYW5kIGhhbmRsZQorICogcmVzcG9uc2UgZm9yIG1hcmtlciBQRFUncywgaW4gdGhpcyBzdGFnZSwgYnV0IG9ubHkgdG8gcmVzcG9uZCB0byBtYXJrZXIKKyAqIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgdm9pZCBhZF9tYXJrZXJfaW5mb19zZW5kKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXN0cnVjdCBtYXJrZXIgbWFya2VyOworCXUxNiBpbmRleDsKKworCS8vIGZpbGwgdGhlIG1hcmtlciBQRFUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzCisJbWFya2VyLnN1YnR5cGUgPSAweDAyOworCW1hcmtlci52ZXJzaW9uX251bWJlciA9IDB4MDE7CisJbWFya2VyLnRsdl90eXBlID0gQURfTUFSS0VSX0lORk9STUFUSU9OX1NVQlRZUEU7CisJbWFya2VyLm1hcmtlcl9sZW5ndGggPSAweDE2OworCS8vIGNvbnZlcnQgcmVxdWVzdGVyX3BvcnQgdG8gQmlnIEVuZGlhbgorCW1hcmtlci5yZXF1ZXN0ZXJfcG9ydCA9ICgoKHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyICYgMHhGRikgPDwgOCkgfCgodTE2KShwb3J0LT5hY3Rvcl9wb3J0X251bWJlciAmIDB4RkYwMCkgPj4gOCkpOworCW1hcmtlci5yZXF1ZXN0ZXJfc3lzdGVtID0gcG9ydC0+YWN0b3Jfc3lzdGVtOworCS8vIGNvbnZlcnQgcmVxdWVzdGVyX3BvcnQodTMyKSB0byBCaWcgRW5kaWFuCisJbWFya2VyLnJlcXVlc3Rlcl90cmFuc2FjdGlvbl9pZCA9ICgoKCsrcG9ydC0+dHJhbnNhY3Rpb25faWQgJiAweEZGKSA8PCAyNCkgfCgocG9ydC0+dHJhbnNhY3Rpb25faWQgJiAweEZGMDApIDw8IDgpIHwoKHBvcnQtPnRyYW5zYWN0aW9uX2lkICYgMHhGRjAwMDApID4+IDgpIHwoKHBvcnQtPnRyYW5zYWN0aW9uX2lkICYgMHhGRjAwMDAwMCkgPj4gMjQpKTsKKwltYXJrZXIucGFkID0gMDsKKwltYXJrZXIudGx2X3R5cGVfdGVybWluYXRvciA9IDB4MDA7CisJbWFya2VyLnRlcm1pbmF0b3JfbGVuZ3RoID0gMHgwMDsKKwlmb3IgKGluZGV4PTA7IGluZGV4PDkwOyBpbmRleCsrKSB7CisJCW1hcmtlci5yZXNlcnZlZF85MFtpbmRleF09MDsKKwl9CisKKwkvLyBzZW5kIHRoZSBtYXJrZXIgaW5mb3JtYXRpb24KKwlpZiAoYWRfbWFya2VyX3NlbmQocG9ydCwgJm1hcmtlcikgPj0gMCkgeworCQlkcHJpbnRrKCJTZW50IE1hcmtlciBJbmZvcm1hdGlvbiBvbiBwb3J0ICVkXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcik7CisJfQorfQorI2VuZGlmCisKKy8qKgorICogYWRfbWFya2VyX2luZm9fcmVjZWl2ZWQgLSBoYW5kbGUgcmVjZWl2ZSBvZiBhIE1hcmtlciBpbmZvcm1hdGlvbiBmcmFtZQorICogQG1hcmtlcl9pbmZvOiBNYXJrZXIgaW5mbyByZWNlaXZlZAorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGFkX21hcmtlcl9pbmZvX3JlY2VpdmVkKHN0cnVjdCBtYXJrZXIgKm1hcmtlcl9pbmZvLHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXN0cnVjdCBtYXJrZXIgbWFya2VyOworCisJLy8gY29weSB0aGUgcmVjZWl2ZWQgbWFya2VyIGRhdGEgdG8gdGhlIHJlc3BvbnNlIG1hcmtlcgorCS8vbWFya2VyID0gKm1hcmtlcl9pbmZvOworCW1lbWNweSgmbWFya2VyLCBtYXJrZXJfaW5mbywgc2l6ZW9mKHN0cnVjdCBtYXJrZXIpKTsKKwkvLyBjaGFuZ2UgdGhlIG1hcmtlciBzdWJ0eXBlIHRvIG1hcmtlciByZXNwb25zZQorCW1hcmtlci50bHZfdHlwZT1BRF9NQVJLRVJfUkVTUE9OU0VfU1VCVFlQRTsKKwkvLyBzZW5kIHRoZSBtYXJrZXIgcmVzcG9uc2UKKworCWlmIChhZF9tYXJrZXJfc2VuZChwb3J0LCAmbWFya2VyKSA+PSAwKSB7CisJCWRwcmludGsoIlNlbnQgTWFya2VyIFJlc3BvbnNlIG9uIHBvcnQgJWRcbiIsIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyKTsKKwl9Cit9CisKKy8qKgorICogYWRfbWFya2VyX3Jlc3BvbnNlX3JlY2VpdmVkIC0gaGFuZGxlIHJlY2VpdmUgb2YgYSBtYXJrZXIgcmVzcG9uc2UgZnJhbWUKKyAqIEBtYXJrZXI6IG1hcmtlciBQRFUgcmVjZWl2ZWQKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgc2luY2Ugd2UgZGVjaWRlZCBub3QgdG8gaW1wbGVtZW50IHNlbmQgYW5kIGhhbmRsZQorICogcmVzcG9uc2UgZm9yIG1hcmtlciBQRFUncywgaW4gdGhpcyBzdGFnZSwgYnV0IG9ubHkgdG8gcmVzcG9uZCB0byBtYXJrZXIKKyAqIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgdm9pZCBhZF9tYXJrZXJfcmVzcG9uc2VfcmVjZWl2ZWQoc3RydWN0IG1hcmtlciAqbWFya2VyLCBzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwltYXJrZXI9TlVMTDsgLy8ganVzdCB0byBzYXRpc2Z5IHRoZSBjb21waWxlcgorCXBvcnQ9TlVMTDsgIC8vIGp1c3QgdG8gc2F0aXNmeSB0aGUgY29tcGlsZXIKKwkvLyBETyBOT1RISU5HLCBTSU5DRSBXRSBERUNJREVEIE5PVCBUTyBJTVBMRU1FTlQgVEhJUyBGRUFUVVJFIEZPUiBOT1cKK30KKworLyoqCisgKiBhZF9pbml0aWFsaXplX2xhY3BkdSAtIGluaXRpYWxpemUgYSBnaXZlbiBsYWNwZHUgc3RydWN0dXJlCisgKiBAbGFjcGR1OiBsYWNwZHUgc3RydWN0dXJlIHRvIGluaXRpYWxpemUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGFkX2luaXRpYWxpemVfbGFjcGR1KHN0cnVjdCBsYWNwZHUgKmxhY3BkdSkKK3sKKwl1MTYgaW5kZXg7CisKKwkvLyBpbml0aWFsaXplIGxhY3BkdSBkYXRhCisJbGFjcGR1LT5zdWJ0eXBlID0gMHgwMTsKKwlsYWNwZHUtPnZlcnNpb25fbnVtYmVyID0gMHgwMTsKKwlsYWNwZHUtPnRsdl90eXBlX2FjdG9yX2luZm8gPSAweDAxOworCWxhY3BkdS0+YWN0b3JfaW5mb3JtYXRpb25fbGVuZ3RoID0gMHgxNDsKKwkvLyBsYWNwZHUtPmFjdG9yX3N5c3RlbV9wcmlvcml0eSAgICB1cGRhdGVkIG9uIHNlbmQKKwkvLyBsYWNwZHUtPmFjdG9yX3N5c3RlbSAgICAgICAgICAgICB1cGRhdGVkIG9uIHNlbmQKKwkvLyBsYWNwZHUtPmFjdG9yX2tleSAgICAgICAgICAgICAgICB1cGRhdGVkIG9uIHNlbmQKKwkvLyBsYWNwZHUtPmFjdG9yX3BvcnRfcHJpb3JpdHkgICAgICB1cGRhdGVkIG9uIHNlbmQKKwkvLyBsYWNwZHUtPmFjdG9yX3BvcnQgICAgICAgICAgICAgICB1cGRhdGVkIG9uIHNlbmQKKwkvLyBsYWNwZHUtPmFjdG9yX3N0YXRlICAgICAgICAgICAgICB1cGRhdGVkIG9uIHNlbmQKKwlsYWNwZHUtPnRsdl90eXBlX3BhcnRuZXJfaW5mbyA9IDB4MDI7CisJbGFjcGR1LT5wYXJ0bmVyX2luZm9ybWF0aW9uX2xlbmd0aCA9IDB4MTQ7CisJZm9yIChpbmRleD0wOyBpbmRleDw9MjsgaW5kZXgrKykgeworCQlsYWNwZHUtPnJlc2VydmVkXzNfMVtpbmRleF09MDsKKwl9CisJLy8gbGFjcGR1LT5wYXJ0bmVyX3N5c3RlbV9wcmlvcml0eSAgdXBkYXRlZCBvbiBzZW5kCisJLy8gbGFjcGR1LT5wYXJ0bmVyX3N5c3RlbSAgICAgICAgICAgdXBkYXRlZCBvbiBzZW5kCisJLy8gbGFjcGR1LT5wYXJ0bmVyX2tleSAgICAgICAgICAgICAgdXBkYXRlZCBvbiBzZW5kCisJLy8gbGFjcGR1LT5wYXJ0bmVyX3BvcnRfcHJpb3JpdHkgICAgdXBkYXRlZCBvbiBzZW5kCisJLy8gbGFjcGR1LT5wYXJ0bmVyX3BvcnQgICAgICAgICAgICAgdXBkYXRlZCBvbiBzZW5kCisJLy8gbGFjcGR1LT5wYXJ0bmVyX3N0YXRlICAgICAgICAgICAgdXBkYXRlZCBvbiBzZW5kCisJZm9yIChpbmRleD0wOyBpbmRleDw9MjsgaW5kZXgrKykgeworCQlsYWNwZHUtPnJlc2VydmVkXzNfMltpbmRleF09MDsKKwl9CisJbGFjcGR1LT50bHZfdHlwZV9jb2xsZWN0b3JfaW5mbyA9IDB4MDM7CisJbGFjcGR1LT5jb2xsZWN0b3JfaW5mb3JtYXRpb25fbGVuZ3RoPSAweDEwOworCWxhY3BkdS0+Y29sbGVjdG9yX21heF9kZWxheSA9IEFEX0NPTExFQ1RPUl9NQVhfREVMQVk7CisJZm9yIChpbmRleD0wOyBpbmRleDw9MTE7IGluZGV4KyspIHsKKwkJbGFjcGR1LT5yZXNlcnZlZF8xMltpbmRleF09MDsKKwl9CisJbGFjcGR1LT50bHZfdHlwZV90ZXJtaW5hdG9yID0gMHgwMDsKKwlsYWNwZHUtPnRlcm1pbmF0b3JfbGVuZ3RoID0gMDsKKwlmb3IgKGluZGV4PTA7IGluZGV4PD00OTsgaW5kZXgrKykgeworCQlsYWNwZHUtPnJlc2VydmVkXzUwW2luZGV4XT0wOworCX0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vID09PT09PT09PT09PT09PT09IEFEIGV4cG9ydGVkIGZ1bmN0aW9ucyB0byB0aGUgbWFpbiBib25kaW5nIGNvZGUgPT09PT09PT09PT09PT09PT09CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBDaGVjayBhZ2dyZWdhdG9ycyBzdGF0dXMgaW4gdGVhbSBldmVyeSBUIHNlY29uZHMKKyNkZWZpbmUgQURfQUdHUkVHQVRPUl9TRUxFQ1RJT05fVElNRVIgIDgKKworc3RhdGljIHUxNiBhZ2dyZWdhdG9yX2lkZW50aWZpZXI7CisKKy8qKgorICogYm9uZF8zYWRfaW5pdGlhbGl6ZSAtIGluaXRpYWxpemUgYSBib25kJ3MgODAyLjNhZCBwYXJhbWV0ZXJzIGFuZCBzdHJ1Y3R1cmVzCisgKiBAYm9uZDogYm9uZGluZyBzdHJ1Y3QgdG8gd29yayBvbgorICogQHRpY2tfcmVzb2x1dGlvbjogdGljayBkdXJhdGlvbiAobWlsbGlzZWNvbmQgcmVzb2x1dGlvbikKKyAqIEBsYWNwX2Zhc3Q6IGJvb2xlYW4uIHdoZXRoZXIgZmFzdCBwZXJpb2RpYyBzaG91bGQgYmUgdXNlZAorICoKKyAqIENhbiBiZSBjYWxsZWQgb25seSBhZnRlciB0aGUgbWFjIGFkZHJlc3Mgb2YgdGhlIGJvbmQgaXMgc2V0LgorICovCit2b2lkIGJvbmRfM2FkX2luaXRpYWxpemUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHUxNiB0aWNrX3Jlc29sdXRpb24sIGludCBsYWNwX2Zhc3QpCit7ICAgICAgICAgICAgICAgICAgICAgICAgIAorCS8vIGNoZWNrIHRoYXQgdGhlIGJvbmQgaXMgbm90IGluaXRpYWxpemVkIHlldAorCWlmIChNQUNfQUREUkVTU19DT01QQVJFKCYoQk9ORF9BRF9JTkZPKGJvbmQpLnN5c3RlbS5zeXNfbWFjX2FkZHIpLCAmKGJvbmQtPmRldi0+ZGV2X2FkZHIpKSkgeworCisJCWFnZ3JlZ2F0b3JfaWRlbnRpZmllciA9IDA7CisKKwkJQk9ORF9BRF9JTkZPKGJvbmQpLmxhY3BfZmFzdCA9IGxhY3BfZmFzdDsKKwkJQk9ORF9BRF9JTkZPKGJvbmQpLnN5c3RlbS5zeXNfcHJpb3JpdHkgPSAweEZGRkY7CisJCUJPTkRfQURfSU5GTyhib25kKS5zeXN0ZW0uc3lzX21hY19hZGRyID0gKigoc3RydWN0IG1hY19hZGRyICopYm9uZC0+ZGV2LT5kZXZfYWRkcik7CisKKwkJLy8gaW5pdGlhbGl6ZSBob3cgbWFueSB0aW1lcyB0aGlzIG1vZHVsZSBpcyBjYWxsZWQgaW4gb25lIHNlY29uZChzaG91bGQgYmUgYWJvdXQgZXZlcnkgMTAwbXMpCisJCWFkX3RpY2tzX3Blcl9zZWMgPSB0aWNrX3Jlc29sdXRpb247CisKKwkJLy8gaW5pdGlhbGl6ZSB0aGUgYWdncmVnYXRvciBzZWxlY3Rpb24gdGltZXIodG8gYWN0aXZhdGUgYW4gYWdncmVnYXRpb24gc2VsZWN0aW9uIGFmdGVyIGluaXRpYWxpemUpCisJCUJPTkRfQURfSU5GTyhib25kKS5hZ2dfc2VsZWN0X3RpbWVyID0gKEFEX0FHR1JFR0FUT1JfU0VMRUNUSU9OX1RJTUVSICogYWRfdGlja3NfcGVyX3NlYyk7CisJCUJPTkRfQURfSU5GTyhib25kKS5hZ2dfc2VsZWN0X21vZGUgPSBBRF9CQU5EV0lEVEg7CisJfQorfQorCisvKioKKyAqIGJvbmRfM2FkX2JpbmRfc2xhdmUgLSBpbml0aWFsaXplIGEgc2xhdmUncyBwb3J0CisgKiBAc2xhdmU6IHNsYXZlIHN0cnVjdCB0byB3b3JrIG9uCisgKgorICogUmV0dXJuczogICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgICAgIDwgMCBvbiBlcnJvcgorICovCitpbnQgYm9uZF8zYWRfYmluZF9zbGF2ZShzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9nZXRfYm9uZF9ieV9zbGF2ZShzbGF2ZSk7CisJc3RydWN0IHBvcnQgKnBvcnQ7CisJc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3I7CisKKwlpZiAoYm9uZCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVGhlIHNsYXZlICVzIGlzIG5vdCBhdHRhY2hlZCB0byBpdHMgYm9uZFxuIiwgc2xhdmUtPmRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvL2NoZWNrIHRoYXQgdGhlIHNsYXZlIGhhcyBub3QgYmVlbiBpbnRpYWxpemVkIHlldC4KKwlpZiAoU0xBVkVfQURfSU5GTyhzbGF2ZSkucG9ydC5zbGF2ZSAhPSBzbGF2ZSkgeworCisJCS8vIHBvcnQgaW5pdGlhbGl6YXRpb24KKwkJcG9ydCA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSkucG9ydCk7CisKKwkJYWRfaW5pdGlhbGl6ZV9wb3J0KHBvcnQsIEJPTkRfQURfSU5GTyhib25kKS5sYWNwX2Zhc3QpOworCisJCXBvcnQtPnNsYXZlID0gc2xhdmU7CisJCXBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyID0gU0xBVkVfQURfSU5GTyhzbGF2ZSkuaWQ7CisJCS8vIGtleSBpcyBkZXRlcm1pbmVkIGFjY29yZGluZyB0byB0aGUgbGluayBzcGVlZCwgZHVwbGV4IGFuZCB1c2VyIGtleSh3aGljaCBpcyB5ZXQgbm90IHN1cHBvcnRlZCkKKwkJLy8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBQb3J0IGtleSA6ICAgfCBVc2VyIGtleSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFNwZWVkICAgICAgIHxEdXBsZXh8CisJCS8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgICAgICAgICAgICAgICAxIDAKKwkJcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgPSAwOwkvLyBpbml0aWFsaXplIHRoaXMgcGFyYW1ldGVyCisJCXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5IHw9IF9fZ2V0X2R1cGxleChwb3J0KTsKKwkJcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgfD0gKF9fZ2V0X2xpbmtfc3BlZWQocG9ydCkgPDwgMSk7CisJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXkgPSBwb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleTsKKwkJLy8gaWYgdGhlIHBvcnQgaXMgbm90IGZ1bGwgZHVwbGV4LCB0aGVuIHRoZSBwb3J0IHNob3VsZCBiZSBub3QgbGFjcCBFbmFibGVkCisJCWlmICghKHBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXkgJiBBRF9EVVBMRVhfS0VZX0JJVFMpKSB7CisJCQlwb3J0LT5zbV92YXJzICY9IH5BRF9QT1JUX0xBQ1BfRU5BQkxFRDsKKwkJfQorCQkvLyBhY3RvciBzeXN0ZW0gaXMgdGhlIGJvbmQncyBzeXN0ZW0KKwkJcG9ydC0+YWN0b3Jfc3lzdGVtID0gQk9ORF9BRF9JTkZPKGJvbmQpLnN5c3RlbS5zeXNfbWFjX2FkZHI7CisJCS8vIHR4IHRpbWVyKHRvIHZlcmlmeSB0aGF0IG5vIG1vcmUgdGhhbiBNQVhfVFhfSU5fU0VDT05EIGxhY3BkdSdzIGFyZSBzZW50IGluIG9uZSBzZWNvbmQpCisJCXBvcnQtPnNtX3R4X3RpbWVyX2NvdW50ZXIgPSBhZF90aWNrc19wZXJfc2VjL0FEX01BWF9UWF9JTl9TRUNPTkQ7CisJCXBvcnQtPmFnZ3JlZ2F0b3IgPSBOVUxMOworCQlwb3J0LT5uZXh0X3BvcnRfaW5fYWdncmVnYXRvciA9IE5VTEw7CisKKwkJX19kaXNhYmxlX3BvcnQocG9ydCk7CisJCV9faW5pdGlhbGl6ZV9wb3J0X2xvY2tzKHBvcnQpOworCisKKwkJLy8gYWdncmVnYXRvciBpbml0aWFsaXphdGlvbgorCQlhZ2dyZWdhdG9yID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS5hZ2dyZWdhdG9yKTsKKworCQlhZF9pbml0aWFsaXplX2FnZyhhZ2dyZWdhdG9yKTsKKworCQlhZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX21hY19hZGRyZXNzID0gKigoc3RydWN0IG1hY19hZGRyICopYm9uZC0+ZGV2LT5kZXZfYWRkcik7CisJCWFnZ3JlZ2F0b3ItPmFnZ3JlZ2F0b3JfaWRlbnRpZmllciA9ICgrK2FnZ3JlZ2F0b3JfaWRlbnRpZmllcik7CisJCWFnZ3JlZ2F0b3ItPnNsYXZlID0gc2xhdmU7CisJCWFnZ3JlZ2F0b3ItPmlzX2FjdGl2ZSA9IDA7CisJCWFnZ3JlZ2F0b3ItPm51bV9vZl9wb3J0cyA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYm9uZF8zYWRfdW5iaW5kX3NsYXZlIC0gZGVpbml0aWFsaXplIGEgc2xhdmUncyBwb3J0CisgKiBAc2xhdmU6IHNsYXZlIHN0cnVjdCB0byB3b3JrIG9uCisgKgorICogU2VhcmNoIGZvciB0aGUgYWdncmVnYXRvciB0aGF0IGlzIHJlbGF0ZWQgdG8gdGhpcyBwb3J0LCByZW1vdmUgdGhlCisgKiBhZ2dyZWdhdG9yIGFuZCBhc3NpZ24gYW5vdGhlciBhZ2dyZWdhdG9yIGZvciBvdGhlciBwb3J0IHJlbGF0ZWQgdG8gaXQKKyAqIChpZiBhbnkpLCBhbmQgcmVtb3ZlIHRoZSBwb3J0LgorICovCit2b2lkIGJvbmRfM2FkX3VuYmluZF9zbGF2ZShzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCXN0cnVjdCBwb3J0ICpwb3J0LCAqcHJldl9wb3J0LCAqdGVtcF9wb3J0OworCXN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yLCAqbmV3X2FnZ3JlZ2F0b3IsICp0ZW1wX2FnZ3JlZ2F0b3I7CisJaW50IHNlbGVjdF9uZXdfYWN0aXZlX2FnZyA9IDA7CisJCisJLy8gZmluZCB0aGUgYWdncmVnYXRvciByZWxhdGVkIHRvIHRoaXMgc2xhdmUKKwlhZ2dyZWdhdG9yID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS5hZ2dyZWdhdG9yKTsKKworCS8vIGZpbmQgdGhlIHBvcnQgcmVsYXRlZCB0byB0aGlzIHNsYXZlCisJcG9ydCA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSkucG9ydCk7CisKKwkvLyBpZiBzbGF2ZSBpcyBudWxsLCB0aGUgd2hvbGUgcG9ydCBpcyBub3QgaW5pdGlhbGl6ZWQKKwlpZiAoIXBvcnQtPnNsYXZlKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogVHJ5aW5nIHRvIHVuYmluZCBhbiB1bmluaXRpYWxpemVkIHBvcnQgb24gJXNcbiIsIHNsYXZlLT5kZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJZHByaW50aygiVW5iaW5kaW5nIExpbmsgQWdncmVnYXRpb24gR3JvdXAgJWRcbiIsIGFnZ3JlZ2F0b3ItPmFnZ3JlZ2F0b3JfaWRlbnRpZmllcik7CisKKwkvKiBUZWxsIHRoZSBwYXJ0bmVyIHRoYXQgdGhpcyBwb3J0IGlzIG5vdCBzdWl0YWJsZSBmb3IgYWdncmVnYXRpb24gKi8KKwlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJj0gfkFEX1NUQVRFX0FHR1JFR0FUSU9OOworCV9fdXBkYXRlX2xhY3BkdV9mcm9tX3BvcnQocG9ydCk7CisJYWRfbGFjcGR1X3NlbmQocG9ydCk7CisKKwkvLyBjaGVjayBpZiB0aGlzIGFnZ3JlZ2F0b3IgaXMgb2NjdXBpZWQKKwlpZiAoYWdncmVnYXRvci0+bGFnX3BvcnRzKSB7CisJCS8vIGNoZWNrIGlmIHRoZXJlIGFyZSBvdGhlciBwb3J0cyByZWxhdGVkIHRvIHRoaXMgYWdncmVnYXRvciBleGNlcHQKKwkJLy8gdGhlIHBvcnQgcmVsYXRlZCB0byB0aGlzIHNsYXZlKHRoYXRzIGVuc3VyZSB1cyB0aGF0IHRoZXJlIGlzIGEKKwkJLy8gcmVhc29uIHRvIHNlYXJjaCBmb3IgbmV3IGFnZ3JlZ2F0b3IsIGFuZCB0aGF0IHdlIHdpbGwgZmluZCBvbmUKKwkJaWYgKChhZ2dyZWdhdG9yLT5sYWdfcG9ydHMgIT0gcG9ydCkgfHwgKGFnZ3JlZ2F0b3ItPmxhZ19wb3J0cy0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3IpKSB7CisJCQkvLyBmaW5kIG5ldyBhZ2dyZWdhdG9yIGZvciB0aGUgcmVsYXRlZCBwb3J0KHMpCisJCQluZXdfYWdncmVnYXRvciA9IF9fZ2V0X2ZpcnN0X2FnZyhwb3J0KTsKKwkJCWZvciAoOyBuZXdfYWdncmVnYXRvcjsgbmV3X2FnZ3JlZ2F0b3IgPSBfX2dldF9uZXh0X2FnZyhuZXdfYWdncmVnYXRvcikpIHsKKwkJCQkvLyBpZiB0aGUgbmV3IGFnZ3JlZ2F0b3IgaXMgZW1wdHksIG9yIGl0IGNvbm5lY3RlZCB0byB0byBvdXIgcG9ydCBvbmx5CisJCQkJaWYgKCFuZXdfYWdncmVnYXRvci0+bGFnX3BvcnRzIHx8ICgobmV3X2FnZ3JlZ2F0b3ItPmxhZ19wb3J0cyA9PSBwb3J0KSAmJiAhbmV3X2FnZ3JlZ2F0b3ItPmxhZ19wb3J0cy0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3IpKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8vIGlmIG5ldyBhZ2dyZWdhdG9yIGZvdW5kLCBjb3B5IHRoZSBhZ2dyZWdhdG9yJ3MgcGFyYW1ldGVycworCQkJLy8gYW5kIGNvbm5lY3QgdGhlIHJlbGF0ZWQgbGFnX3BvcnRzIHRvIHRoZSBuZXcgYWdncmVnYXRvcgorCQkJaWYgKChuZXdfYWdncmVnYXRvcikgJiYgKCghbmV3X2FnZ3JlZ2F0b3ItPmxhZ19wb3J0cykgfHwgKChuZXdfYWdncmVnYXRvci0+bGFnX3BvcnRzID09IHBvcnQpICYmICFuZXdfYWdncmVnYXRvci0+bGFnX3BvcnRzLT5uZXh0X3BvcnRfaW5fYWdncmVnYXRvcikpKSB7CisJCQkJZHByaW50aygiU29tZSBwb3J0KHMpIHJlbGF0ZWQgdG8gTEFHICVkIC0gcmVwbGFjZWluZyB3aXRoIExBRyAlZFxuIiwgYWdncmVnYXRvci0+YWdncmVnYXRvcl9pZGVudGlmaWVyLCBuZXdfYWdncmVnYXRvci0+YWdncmVnYXRvcl9pZGVudGlmaWVyKTsKKworCQkJCWlmICgobmV3X2FnZ3JlZ2F0b3ItPmxhZ19wb3J0cyA9PSBwb3J0KSAmJiBuZXdfYWdncmVnYXRvci0+aXNfYWN0aXZlKSB7CisJCQkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUgIjogUmVtb3ZpbmcgYW4gYWN0aXZlIGFnZ3JlZ2F0b3JcbiIpOworCQkJCQkvLyBzZWxlY3QgbmV3IGFjdGl2ZSBhZ2dyZWdhdG9yCisJCQkJCSBzZWxlY3RfbmV3X2FjdGl2ZV9hZ2cgPSAxOworCQkJCX0KKworCQkJCW5ld19hZ2dyZWdhdG9yLT5pc19pbmRpdmlkdWFsID0gYWdncmVnYXRvci0+aXNfaW5kaXZpZHVhbDsKKwkJCQluZXdfYWdncmVnYXRvci0+YWN0b3JfYWRtaW5fYWdncmVnYXRvcl9rZXkgPSBhZ2dyZWdhdG9yLT5hY3Rvcl9hZG1pbl9hZ2dyZWdhdG9yX2tleTsKKwkJCQluZXdfYWdncmVnYXRvci0+YWN0b3Jfb3Blcl9hZ2dyZWdhdG9yX2tleSA9IGFnZ3JlZ2F0b3ItPmFjdG9yX29wZXJfYWdncmVnYXRvcl9rZXk7CisJCQkJbmV3X2FnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtID0gYWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW07CisJCQkJbmV3X2FnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtX3ByaW9yaXR5ID0gYWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW1fcHJpb3JpdHk7CisJCQkJbmV3X2FnZ3JlZ2F0b3ItPnBhcnRuZXJfb3Blcl9hZ2dyZWdhdG9yX2tleSA9IGFnZ3JlZ2F0b3ItPnBhcnRuZXJfb3Blcl9hZ2dyZWdhdG9yX2tleTsKKwkJCQluZXdfYWdncmVnYXRvci0+cmVjZWl2ZV9zdGF0ZSA9IGFnZ3JlZ2F0b3ItPnJlY2VpdmVfc3RhdGU7CisJCQkJbmV3X2FnZ3JlZ2F0b3ItPnRyYW5zbWl0X3N0YXRlID0gYWdncmVnYXRvci0+dHJhbnNtaXRfc3RhdGU7CisJCQkJbmV3X2FnZ3JlZ2F0b3ItPmxhZ19wb3J0cyA9IGFnZ3JlZ2F0b3ItPmxhZ19wb3J0czsKKwkJCQluZXdfYWdncmVnYXRvci0+aXNfYWN0aXZlID0gYWdncmVnYXRvci0+aXNfYWN0aXZlOworCQkJCW5ld19hZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHMgPSBhZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHM7CisKKwkJCQkvLyB1cGRhdGUgdGhlIGluZm9ybWF0aW9uIHRoYXQgaXMgd3JpdHRlbiBvbiB0aGUgcG9ydHMgYWJvdXQgdGhlIGFnZ3JlZ2F0b3IKKwkJCQlmb3IgKHRlbXBfcG9ydD1hZ2dyZWdhdG9yLT5sYWdfcG9ydHM7IHRlbXBfcG9ydDsgdGVtcF9wb3J0PXRlbXBfcG9ydC0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3IpIHsKKwkJCQkJdGVtcF9wb3J0LT5hZ2dyZWdhdG9yPW5ld19hZ2dyZWdhdG9yOworCQkJCQl0ZW1wX3BvcnQtPmFjdG9yX3BvcnRfYWdncmVnYXRvcl9pZGVudGlmaWVyID0gbmV3X2FnZ3JlZ2F0b3ItPmFnZ3JlZ2F0b3JfaWRlbnRpZmllcjsKKwkJCQl9CisKKwkJCQkvLyBjbGVhciB0aGUgYWdncmVnYXRvcgorCQkJCWFkX2NsZWFyX2FnZyhhZ2dyZWdhdG9yKTsKKwkJCQkKKwkJCQlpZiAoc2VsZWN0X25ld19hY3RpdmVfYWdnKSB7CisJCQkJCWFkX2FnZ19zZWxlY3Rpb25fbG9naWMoX19nZXRfZmlyc3RfYWdnKHBvcnQpKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogV2FybmluZzogdW5iaW5kaW5nIGFnZ3JlZ2F0b3IsICIKKwkJCQkgICAgICAgImFuZCBjb3VsZCBub3QgZmluZCBhIG5ldyBhZ2dyZWdhdG9yIGZvciBpdHMgcG9ydHNcbiIpOworCQkJfQorCQl9IGVsc2UgeyAvLyBpbiBjYXNlIHRoYXQgdGhlIG9ubHkgcG9ydCByZWxhdGVkIHRvIHRoaXMgYWdncmVnYXRvciBpcyB0aGUgb25lIHdlIHdhbnQgdG8gcmVtb3ZlCisJCQlzZWxlY3RfbmV3X2FjdGl2ZV9hZ2cgPSBhZ2dyZWdhdG9yLT5pc19hY3RpdmU7CisJCQkvLyBjbGVhciB0aGUgYWdncmVnYXRvcgorCQkJYWRfY2xlYXJfYWdnKGFnZ3JlZ2F0b3IpOworCQkJaWYgKHNlbGVjdF9uZXdfYWN0aXZlX2FnZykgeworCQkJCXByaW50ayhLRVJOX0lORk8gIlJlbW92aW5nIGFuIGFjdGl2ZSBhZ2dyZWdhdG9yXG4iKTsKKwkJCQkvLyBzZWxlY3QgbmV3IGFjdGl2ZSBhZ2dyZWdhdG9yCisJCQkJYWRfYWdnX3NlbGVjdGlvbl9sb2dpYyhfX2dldF9maXJzdF9hZ2cocG9ydCkpOworCQkJfQorCQl9CisJfQorCisJZHByaW50aygiVW5iaW5kaW5nIHBvcnQgJWRcbiIsIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyKTsKKwkvLyBmaW5kIHRoZSBhZ2dyZWdhdG9yIHRoYXQgdGhpcyBwb3J0IGlzIGNvbm5lY3RlZCB0bworCXRlbXBfYWdncmVnYXRvciA9IF9fZ2V0X2ZpcnN0X2FnZyhwb3J0KTsKKwlmb3IgKDsgdGVtcF9hZ2dyZWdhdG9yOyB0ZW1wX2FnZ3JlZ2F0b3IgPSBfX2dldF9uZXh0X2FnZyh0ZW1wX2FnZ3JlZ2F0b3IpKSB7CisJCXByZXZfcG9ydCA9IE5VTEw7CisJCS8vIHNlYXJjaCB0aGUgcG9ydCBpbiB0aGUgYWdncmVnYXRvcidzIHJlbGF0ZWQgcG9ydHMKKwkJZm9yICh0ZW1wX3BvcnQ9dGVtcF9hZ2dyZWdhdG9yLT5sYWdfcG9ydHM7IHRlbXBfcG9ydDsgcHJldl9wb3J0PXRlbXBfcG9ydCwgdGVtcF9wb3J0PXRlbXBfcG9ydC0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3IpIHsKKwkJCWlmICh0ZW1wX3BvcnQgPT0gcG9ydCkgeyAvLyB0aGUgYWdncmVnYXRvciBmb3VuZCAtIGRldGFjaCB0aGUgcG9ydCBmcm9tIHRoaXMgYWdncmVnYXRvcgorCQkJCWlmIChwcmV2X3BvcnQpIHsKKwkJCQkJcHJldl9wb3J0LT5uZXh0X3BvcnRfaW5fYWdncmVnYXRvciA9IHRlbXBfcG9ydC0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3I7CisJCQkJfSBlbHNlIHsKKwkJCQkJdGVtcF9hZ2dyZWdhdG9yLT5sYWdfcG9ydHMgPSB0ZW1wX3BvcnQtPm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yOworCQkJCX0KKwkJCQl0ZW1wX2FnZ3JlZ2F0b3ItPm51bV9vZl9wb3J0cy0tOworCQkJCWlmICh0ZW1wX2FnZ3JlZ2F0b3ItPm51bV9vZl9wb3J0cz09MCkgeworCQkJCQlzZWxlY3RfbmV3X2FjdGl2ZV9hZ2cgPSB0ZW1wX2FnZ3JlZ2F0b3ItPmlzX2FjdGl2ZTsKKwkJCQkJLy8gY2xlYXIgdGhlIGFnZ3JlZ2F0b3IKKwkJCQkJYWRfY2xlYXJfYWdnKHRlbXBfYWdncmVnYXRvcik7CisJCQkJCWlmIChzZWxlY3RfbmV3X2FjdGl2ZV9hZ2cpIHsKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIlJlbW92aW5nIGFuIGFjdGl2ZSBhZ2dyZWdhdG9yXG4iKTsKKwkJCQkJCS8vIHNlbGVjdCBuZXcgYWN0aXZlIGFnZ3JlZ2F0b3IKKwkJCQkJCWFkX2FnZ19zZWxlY3Rpb25fbG9naWMoX19nZXRfZmlyc3RfYWdnKHBvcnQpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlwb3J0LT5zbGF2ZT1OVUxMOwkKK30KKworLyoqCisgKiBib25kXzNhZF9zdGF0ZV9tYWNoaW5lX2hhbmRsZXIgLSBoYW5kbGUgc3RhdGUgbWFjaGluZXMgdGltZW91dAorICogQGJvbmQ6IGJvbmRpbmcgc3RydWN0IHRvIHdvcmsgb24KKyAqCisgKiBUaGUgc3RhdGUgbWFjaGluZSBoYW5kbGluZyBjb25jZXB0IGluIHRoaXMgbW9kdWxlIGlzIHRvIGNoZWNrIGV2ZXJ5IHRpY2sKKyAqIHdoaWNoIHN0YXRlIG1hY2hpbmUgc2hvdWxkIG9wZXJhdGUgYW55IGZ1bmN0aW9uLiBUaGUgZXhlY3V0aW9uIG9yZGVyIGlzCisgKiByb3VuZCByb2Jpbiwgc28gd2hlbiB3ZSBoYXZlIGFuIGludGVyYWN0aW9uIGJldHdlZW4gc3RhdGUgbWFjaGluZXMsIHRoZQorICogcmVwbHkgb2Ygb25lIHRvIGVhY2ggb3RoZXIgbWlnaHQgYmUgZGVsYXllZCB1bnRpbCBuZXh0IHRpY2suCisgKgorICogVGhpcyBmdW5jdGlvbiBhbHNvIGNvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiB3aGVuIHRoZSBhZ2dfc2VsZWN0X3RpbWVyCisgKiB0aW1lcyBvdXQsIGFuZCBpdCBzZWxlY3RzIGFuIGFnZ3JlZ2F0b3IgZm9yIHRoZSBwb3J0cyB0aGF0IGFyZSB5ZXQgbm90CisgKiByZWxhdGVkIHRvIGFueSBhZ2dyZWdhdG9yLCBhbmQgc2VsZWN0cyB0aGUgYWN0aXZlIGFnZ3JlZ2F0b3IgZm9yIGEgYm9uZC4KKyAqLwordm9pZCBib25kXzNhZF9zdGF0ZV9tYWNoaW5lX2hhbmRsZXIoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IHBvcnQgKnBvcnQ7CisJc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3I7CisKKwlyZWFkX2xvY2soJmJvbmQtPmxvY2spOworCisJaWYgKGJvbmQtPmtpbGxfdGltZXJzKSB7CisJCWdvdG8gb3V0OworCX0KKworCS8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzbGF2ZXMKKwlpZiAoYm9uZC0+c2xhdmVfY250ID09IDApIHsKKwkJZ290byByZV9hcm07CisJfQorCisJLy8gY2hlY2sgaWYgYWdnX3NlbGVjdF90aW1lciB0aW1lciBhZnRlciBpbml0aWFsaXplIGlzIHRpbWVkIG91dAorCWlmIChCT05EX0FEX0lORk8oYm9uZCkuYWdnX3NlbGVjdF90aW1lciAmJiAhKC0tQk9ORF9BRF9JTkZPKGJvbmQpLmFnZ19zZWxlY3RfdGltZXIpKSB7CisJCS8vIHNlbGVjdCB0aGUgYWN0aXZlIGFnZ3JlZ2F0b3IgZm9yIHRoZSBib25kCisJCWlmICgocG9ydCA9IF9fZ2V0X2ZpcnN0X3BvcnQoYm9uZCkpKSB7CisJCQlpZiAoIXBvcnQtPnNsYXZlKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiBXYXJuaW5nOiBib25kJ3MgZmlyc3QgcG9ydCBpcyB1bmluaXRpYWxpemVkXG4iKTsKKwkJCQlnb3RvIHJlX2FybTsKKwkJCX0KKworCQkJYWdncmVnYXRvciA9IF9fZ2V0X2ZpcnN0X2FnZyhwb3J0KTsKKwkJCWFkX2FnZ19zZWxlY3Rpb25fbG9naWMoYWdncmVnYXRvcik7CisJCX0KKwl9CisKKwkvLyBmb3IgZWFjaCBwb3J0IHJ1biB0aGUgc3RhdGUgbWFjaGluZXMKKwlmb3IgKHBvcnQgPSBfX2dldF9maXJzdF9wb3J0KGJvbmQpOyBwb3J0OyBwb3J0ID0gX19nZXRfbmV4dF9wb3J0KHBvcnQpKSB7CisJCWlmICghcG9ydC0+c2xhdmUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogV2FybmluZzogRm91bmQgYW4gdW5pbml0aWFsaXplZCBwb3J0XG4iKTsKKwkJCWdvdG8gcmVfYXJtOworCQl9CisKKwkJYWRfcnhfbWFjaGluZShOVUxMLCBwb3J0KTsKKwkJYWRfcGVyaW9kaWNfbWFjaGluZShwb3J0KTsKKwkJYWRfcG9ydF9zZWxlY3Rpb25fbG9naWMocG9ydCk7CisJCWFkX211eF9tYWNoaW5lKHBvcnQpOworCQlhZF90eF9tYWNoaW5lKHBvcnQpOworCisJCS8vIHR1cm4gb2ZmIHRoZSBCRUdJTiBiaXQsIHNpbmNlIHdlIGFscmVhZHkgaGFuZGxlZCBpdAorCQlpZiAocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfQkVHSU4pIHsKKwkJCXBvcnQtPnNtX3ZhcnMgJj0gfkFEX1BPUlRfQkVHSU47CisJCX0KKwl9CisKK3JlX2FybToKKwltb2RfdGltZXIoJihCT05EX0FEX0lORk8oYm9uZCkuYWRfdGltZXIpLCBqaWZmaWVzICsgYWRfZGVsdGFfaW5fdGlja3MpOworb3V0OgorCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKK30KKworLyoqCisgKiBib25kXzNhZF9yeF9pbmRpY2F0aW9uIC0gaGFuZGxlIGEgcmVjZWl2ZWQgZnJhbWUKKyAqIEBsYWNwZHU6IHJlY2VpdmVkIGxhY3BkdQorICogQHNsYXZlOiBzbGF2ZSBzdHJ1Y3QgdG8gd29yayBvbgorICogQGxlbmd0aDogbGVuZ3RoIG9mIHRoZSBkYXRhIHJlY2VpdmVkCisgKgorICogSXQgaXMgYXNzdW1lZCB0aGF0IGZyYW1lcyB0aGF0IHdlcmUgc2VudCBvbiB0aGlzIE5JQyBkb24ndCByZXR1cm5lZCBhcyBuZXcKKyAqIHJlY2VpdmVkIGZyYW1lcyAobG9vcGJhY2spLiBTaW5jZSBvbmx5IHRoZSBwYXlsb2FkIGlzIGdpdmVuIHRvIHRoaXMKKyAqIGZ1bmN0aW9uLCBpdCBjaGVjayBmb3IgbG9vcGJhY2suCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfM2FkX3J4X2luZGljYXRpb24oc3RydWN0IGxhY3BkdSAqbGFjcGR1LCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCB1MTYgbGVuZ3RoKQoreworCXN0cnVjdCBwb3J0ICpwb3J0OworCisJaWYgKGxlbmd0aCA+PSBzaXplb2Yoc3RydWN0IGxhY3BkdSkpIHsKKworCQlwb3J0ID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS5wb3J0KTsKKworCQlpZiAoIXBvcnQtPnNsYXZlKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IFdhcm5pbmc6IHBvcnQgb2Ygc2xhdmUgJXMgaXMgdW5pbml0aWFsaXplZFxuIiwgc2xhdmUtPmRldi0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKworCQlzd2l0Y2ggKGxhY3BkdS0+c3VidHlwZSkgeworCQljYXNlIEFEX1RZUEVfTEFDUERVOgorCQkJX19udG9oc19sYWNwZHUobGFjcGR1KTsKKwkJCWRwcmludGsoIlJlY2VpdmVkIExBQ1BEVSBvbiBwb3J0ICVkXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcik7CisJCQlhZF9yeF9tYWNoaW5lKGxhY3BkdSwgcG9ydCk7CisJCQlicmVhazsKKworCQljYXNlIEFEX1RZUEVfTUFSS0VSOgorCQkJLy8gTm8gbmVlZCB0byBjb252ZXJ0IGZpZWxkcyB0byBMaXR0bGUgRW5kaWFuIHNpbmNlIHdlIGRvbid0IHVzZSB0aGUgbWFya2VyJ3MgZmllbGRzLgorCisJCQlzd2l0Y2ggKCgoc3RydWN0IG1hcmtlciAqKWxhY3BkdSktPnRsdl90eXBlKSB7CisJCQljYXNlIEFEX01BUktFUl9JTkZPUk1BVElPTl9TVUJUWVBFOgorCQkJCWRwcmludGsoIlJlY2VpdmVkIE1hcmtlciBJbmZvcm1hdGlvbiBvbiBwb3J0ICVkXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcik7CisJCQkJYWRfbWFya2VyX2luZm9fcmVjZWl2ZWQoKHN0cnVjdCBtYXJrZXIgKilsYWNwZHUsIHBvcnQpOworCQkJCWJyZWFrOworCisJCQljYXNlIEFEX01BUktFUl9SRVNQT05TRV9TVUJUWVBFOgorCQkJCWRwcmludGsoIlJlY2VpdmVkIE1hcmtlciBSZXNwb25zZSBvbiBwb3J0ICVkXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcik7CisJCQkJYWRfbWFya2VyX3Jlc3BvbnNlX3JlY2VpdmVkKChzdHJ1Y3QgbWFya2VyICopbGFjcGR1LCBwb3J0KTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlkcHJpbnRrKCJSZWNlaXZlZCBhbiB1bmtub3duIE1hcmtlciBzdWJ0eXBlIG9uIHNsb3QgJWRcbiIsIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiBib25kXzNhZF9hZGFwdGVyX3NwZWVkX2NoYW5nZWQgLSBoYW5kbGUgYSBzbGF2ZSdzIHNwZWVkIGNoYW5nZSBpbmRpY2F0aW9uCisgKiBAc2xhdmU6IHNsYXZlIHN0cnVjdCB0byB3b3JrIG9uCisgKgorICogSGFuZGxlIHJlc2VsZWN0aW9uIG9mIGFnZ3JlZ2F0b3IgKGlmIG5lZWRlZCkgZm9yIHRoaXMgcG9ydC4KKyAqLwordm9pZCBib25kXzNhZF9hZGFwdGVyX3NwZWVkX2NoYW5nZWQoc3RydWN0IHNsYXZlICpzbGF2ZSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcG9ydDsKKworCXBvcnQgPSAmKFNMQVZFX0FEX0lORk8oc2xhdmUpLnBvcnQpOworCisJLy8gaWYgc2xhdmUgaXMgbnVsbCwgdGhlIHdob2xlIHBvcnQgaXMgbm90IGluaXRpYWxpemVkCisJaWYgKCFwb3J0LT5zbGF2ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IFdhcm5pbmc6IHNwZWVkIGNoYW5nZWQgZm9yIHVuaW5pdGlhbGl6ZWQgcG9ydCBvbiAlc1xuIiwKKwkJICAgICAgIHNsYXZlLT5kZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgJj0gfkFEX1NQRUVEX0tFWV9CSVRTOworCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXk9cG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgfD0gKF9fZ2V0X2xpbmtfc3BlZWQocG9ydCkgPDwgMSk7CisJZHByaW50aygiUG9ydCAlZCBjaGFuZ2VkIHNwZWVkXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcik7CisJLy8gdGhlcmUgaXMgbm8gbmVlZCB0byByZXNlbGVjdCBhIG5ldyBhZ2dyZWdhdG9yLCBqdXN0IHNpZ25hbCB0aGUKKwkvLyBzdGF0ZSBtYWNoaW5lcyB0byByZWluaXRpYWxpemUKKwlwb3J0LT5zbV92YXJzIHw9IEFEX1BPUlRfQkVHSU47Cit9CisKKy8qKgorICogYm9uZF8zYWRfYWRhcHRlcl9kdXBsZXhfY2hhbmdlZCAtIGhhbmRsZSBhIHNsYXZlJ3MgZHVwbGV4IGNoYW5nZSBpbmRpY2F0aW9uCisgKiBAc2xhdmU6IHNsYXZlIHN0cnVjdCB0byB3b3JrIG9uCisgKgorICogSGFuZGxlIHJlc2VsZWN0aW9uIG9mIGFnZ3JlZ2F0b3IgKGlmIG5lZWRlZCkgZm9yIHRoaXMgcG9ydC4KKyAqLwordm9pZCBib25kXzNhZF9hZGFwdGVyX2R1cGxleF9jaGFuZ2VkKHN0cnVjdCBzbGF2ZSAqc2xhdmUpCit7CisJc3RydWN0IHBvcnQgKnBvcnQ7CisKKwlwb3J0PSYoU0xBVkVfQURfSU5GTyhzbGF2ZSkucG9ydCk7CisKKwkvLyBpZiBzbGF2ZSBpcyBudWxsLCB0aGUgd2hvbGUgcG9ydCBpcyBub3QgaW5pdGlhbGl6ZWQKKwlpZiAoIXBvcnQtPnNsYXZlKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogV2FybmluZzogZHVwbGV4IGNoYW5nZWQgZm9yIHVuaW5pdGlhbGl6ZWQgcG9ydCBvbiAlc1xuIiwKKwkJICAgICAgIHNsYXZlLT5kZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgJj0gfkFEX0RVUExFWF9LRVlfQklUUzsKKwlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5PXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5IHw9IF9fZ2V0X2R1cGxleChwb3J0KTsKKwlkcHJpbnRrKCJQb3J0ICVkIGNoYW5nZWQgZHVwbGV4XG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcik7CisJLy8gdGhlcmUgaXMgbm8gbmVlZCB0byByZXNlbGVjdCBhIG5ldyBhZ2dyZWdhdG9yLCBqdXN0IHNpZ25hbCB0aGUKKwkvLyBzdGF0ZSBtYWNoaW5lcyB0byByZWluaXRpYWxpemUKKwlwb3J0LT5zbV92YXJzIHw9IEFEX1BPUlRfQkVHSU47Cit9CisKKy8qKgorICogYm9uZF8zYWRfaGFuZGxlX2xpbmtfY2hhbmdlIC0gaGFuZGxlIGEgc2xhdmUncyBsaW5rIHN0YXR1cyBjaGFuZ2UgaW5kaWNhdGlvbgorICogQHNsYXZlOiBzbGF2ZSBzdHJ1Y3QgdG8gd29yayBvbgorICogQHN0YXR1czogd2hldGhlciB0aGUgbGluayBpcyBub3cgdXAgb3IgZG93bgorICoKKyAqIEhhbmRsZSByZXNlbGVjdGlvbiBvZiBhZ2dyZWdhdG9yIChpZiBuZWVkZWQpIGZvciB0aGlzIHBvcnQuCisgKi8KK3ZvaWQgYm9uZF8zYWRfaGFuZGxlX2xpbmtfY2hhbmdlKHN0cnVjdCBzbGF2ZSAqc2xhdmUsIGNoYXIgbGluaykKK3sKKwlzdHJ1Y3QgcG9ydCAqcG9ydDsKKworCXBvcnQgPSAmKFNMQVZFX0FEX0lORk8oc2xhdmUpLnBvcnQpOworCisJLy8gaWYgc2xhdmUgaXMgbnVsbCwgdGhlIHdob2xlIHBvcnQgaXMgbm90IGluaXRpYWxpemVkCisJaWYgKCFwb3J0LT5zbGF2ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IFdhcm5pbmc6IGxpbmsgc3RhdHVzIGNoYW5nZWQgZm9yIHVuaW5pdGlhbGl6ZWQgcG9ydCBvbiAlc1xuIiwKKwkJCXNsYXZlLT5kZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJLy8gb24gbGluayBkb3duIHdlIGFyZSB6ZXJvaW5nIGR1cGxleCBhbmQgc3BlZWQgc2luY2Ugc29tZSBvZiB0aGUgYWRhcHRvcnMoY2UxMDAwLmxhbikgcmVwb3J0IGZ1bGwgZHVwbGV4L3NwZWVkIGluc3RlYWQgb2YgTi9BKGR1cGxleCkgLyAwKHNwZWVkKQorCS8vIG9uIGxpbmsgdXAgd2UgYXJlIGZvcmNpbmcgcmVjaGVjayBvbiB0aGUgZHVwbGV4IGFuZCBzcGVlZCBzaW5jZSBzb21lIG9mIGhlIGFkYXB0b3JzKGNlMTAwMC5sYW4pIHJlcG9ydAorCWlmIChsaW5rID09IEJPTkRfTElOS19VUCkgeworCQlwb3J0LT5pc19lbmFibGVkID0gMTsKKwkJcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgJj0gfkFEX0RVUExFWF9LRVlfQklUUzsKKwkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X2tleT1wb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleSB8PSBfX2dldF9kdXBsZXgocG9ydCk7CisJCXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5ICY9IH5BRF9TUEVFRF9LRVlfQklUUzsKKwkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X2tleT1wb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleSB8PSAoX19nZXRfbGlua19zcGVlZChwb3J0KSA8PCAxKTsKKwl9IGVsc2UgeworCQkvKiBsaW5rIGhhcyBmYWlsZWQgKi8KKwkJcG9ydC0+aXNfZW5hYmxlZCA9IDA7CisJCXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5ICY9IH5BRF9EVVBMRVhfS0VZX0JJVFM7CisJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXk9IChwb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleSAmPSB+QURfU1BFRURfS0VZX0JJVFMpOworCX0KKwkvL0JPTkRfUFJJTlRfREJHKCgiUG9ydCAlZCBjaGFuZ2VkIGxpbmsgc3RhdHVzIHRvICVzIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIsICgobGluayA9PSBCT05EX0xJTktfVVApPyJVUCI6IkRPV04iKSkpOworCS8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZWxlY3QgYSBuZXcgYWdncmVnYXRvciwganVzdCBzaWduYWwgdGhlCisJLy8gc3RhdGUgbWFjaGluZXMgdG8gcmVpbml0aWFsaXplCisJcG9ydC0+c21fdmFycyB8PSBBRF9QT1JUX0JFR0lOOworfQorCisvKioKKyAqIGJvbmRfM2FkX2dldF9hY3RpdmVfYWdnX2luZm8gLSBnZXQgaW5mb3JtYXRpb24gb2YgdGhlIGFjdGl2ZSBhZ2dyZWdhdG9yCisgKiBAYm9uZDogYm9uZGluZyBzdHJ1Y3QgdG8gd29yayBvbgorICogQGFkX2luZm86IGFkX2luZm8gc3RydWN0IHRvIGZpbGwgd2l0aCB0aGUgYm9uZCdzIGluZm8KKyAqCisgKiBSZXR1cm5zOiAgIDAgb24gc3VjY2VzcworICogICAgICAgICAgPCAwIG9uIGVycm9yCisgKi8KK2ludCBib25kXzNhZF9nZXRfYWN0aXZlX2FnZ19pbmZvKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3QgYWRfaW5mbyAqYWRfaW5mbykKK3sKKwlzdHJ1Y3QgYWdncmVnYXRvciAqYWdncmVnYXRvciA9IE5VTEw7CisJc3RydWN0IHBvcnQgKnBvcnQ7CisKKwlmb3IgKHBvcnQgPSBfX2dldF9maXJzdF9wb3J0KGJvbmQpOyBwb3J0OyBwb3J0ID0gX19nZXRfbmV4dF9wb3J0KHBvcnQpKSB7CisJCWlmIChwb3J0LT5hZ2dyZWdhdG9yICYmIHBvcnQtPmFnZ3JlZ2F0b3ItPmlzX2FjdGl2ZSkgeworCQkJYWdncmVnYXRvciA9IHBvcnQtPmFnZ3JlZ2F0b3I7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChhZ2dyZWdhdG9yKSB7CisJCWFkX2luZm8tPmFnZ3JlZ2F0b3JfaWQgPSBhZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXI7CisJCWFkX2luZm8tPnBvcnRzID0gYWdncmVnYXRvci0+bnVtX29mX3BvcnRzOworCQlhZF9pbmZvLT5hY3Rvcl9rZXkgPSBhZ2dyZWdhdG9yLT5hY3Rvcl9vcGVyX2FnZ3JlZ2F0b3Jfa2V5OworCQlhZF9pbmZvLT5wYXJ0bmVyX2tleSA9IGFnZ3JlZ2F0b3ItPnBhcnRuZXJfb3Blcl9hZ2dyZWdhdG9yX2tleTsKKwkJbWVtY3B5KGFkX2luZm8tPnBhcnRuZXJfc3lzdGVtLCBhZ2dyZWdhdG9yLT5wYXJ0bmVyX3N5c3RlbS5tYWNfYWRkcl92YWx1ZSwgRVRIX0FMRU4pOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBib25kXzNhZF94bWl0X3hvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbGF2ZSAqc2xhdmUsICpzdGFydF9hdDsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgZXRoaGRyICpkYXRhID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CisJaW50IHNsYXZlX2FnZ19ubzsKKwlpbnQgc2xhdmVzX2luX2FnZzsKKwlpbnQgYWdnX2lkOworCWludCBpOworCXN0cnVjdCBhZF9pbmZvIGFkX2luZm87CisJaW50IHJlcyA9IDE7CisKKwkvKiBtYWtlIHN1cmUgdGhhdCB0aGUgc2xhdmVzIGxpc3Qgd2lsbAorCSAqIG5vdCBjaGFuZ2UgZHVyaW5nIHR4CisJICovCisJcmVhZF9sb2NrKCZib25kLT5sb2NrKTsKKworCWlmICghQk9ORF9JU19PSyhib25kKSkgeworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYm9uZF8zYWRfZ2V0X2FjdGl2ZV9hZ2dfaW5mbyhib25kLCAmYWRfaW5mbykpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVSUk9SOiBib25kXzNhZF9nZXRfYWN0aXZlX2FnZ19pbmZvIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXNsYXZlc19pbl9hZ2cgPSBhZF9pbmZvLnBvcnRzOworCWFnZ19pZCA9IGFkX2luZm8uYWdncmVnYXRvcl9pZDsKKworCWlmIChzbGF2ZXNfaW5fYWdnID09IDApIHsKKwkJLyp0aGUgYWdncmVnYXRvciBpcyBlbXB0eSovCisJCXByaW50ayhLRVJOX0RFQlVHICJFUlJPUjogYWN0aXZlIGFnZ3JlZ2F0b3IgaXMgZW1wdHlcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzbGF2ZV9hZ2dfbm8gPSAoZGF0YS0+aF9kZXN0WzVdXmJvbmQtPmRldi0+ZGV2X2FkZHJbNV0pICUgc2xhdmVzX2luX2FnZzsKKworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZyA9IFNMQVZFX0FEX0lORk8oc2xhdmUpLnBvcnQuYWdncmVnYXRvcjsKKworCQlpZiAoYWdnICYmIChhZ2ctPmFnZ3JlZ2F0b3JfaWRlbnRpZmllciA9PSBhZ2dfaWQpKSB7CisJCQlzbGF2ZV9hZ2dfbm8tLTsKKwkJCWlmIChzbGF2ZV9hZ2dfbm8gPCAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoc2xhdmVfYWdnX25vID49IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IEVycm9yOiBDb3VsZG4ndCBmaW5kIGEgc2xhdmUgdG8gdHggb24gZm9yIGFnZ3JlZ2F0b3IgSUQgJWRcbiIsIGFnZ19pZCk7CisJCWdvdG8gb3V0OworCX0KKworCXN0YXJ0X2F0ID0gc2xhdmU7CisKKwlib25kX2Zvcl9lYWNoX3NsYXZlX2Zyb20oYm9uZCwgc2xhdmUsIGksIHN0YXJ0X2F0KSB7CisJCWludCBzbGF2ZV9hZ2dfaWQgPSAwOworCQlzdHJ1Y3QgYWdncmVnYXRvciAqYWdnID0gU0xBVkVfQURfSU5GTyhzbGF2ZSkucG9ydC5hZ2dyZWdhdG9yOworCisJCWlmIChhZ2cpIHsKKwkJCXNsYXZlX2FnZ19pZCA9IGFnZy0+YWdncmVnYXRvcl9pZGVudGlmaWVyOworCQl9CisKKwkJaWYgKFNMQVZFX0lTX09LKHNsYXZlKSAmJiBhZ2cgJiYgKHNsYXZlX2FnZ19pZCA9PSBhZ2dfaWQpKSB7CisJCQlyZXMgPSBib25kX2Rldl9xdWV1ZV94bWl0KGJvbmQsIHNrYiwgc2xhdmUtPmRldik7CisJCQlicmVhazsKKwkJfQorCX0KKworb3V0OgorCWlmIChyZXMpIHsKKwkJLyogbm8gc3VpdGFibGUgaW50ZXJmYWNlLCBmcmFtZSBub3Qgc2VudCAqLworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJvbmRfM2FkX2xhY3BkdV9yZWN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYWNrZXRfdHlwZSogcHR5cGUpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBkZXYtPnByaXY7CisJc3RydWN0IHNsYXZlICpzbGF2ZSA9IE5VTEw7CisJaW50IHJldCA9IE5FVF9SWF9EUk9QOworCisJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9NQVNURVIpKSB7CisJCWdvdG8gb3V0OworCX0KKworCXJlYWRfbG9jaygmYm9uZC0+bG9jayk7CisJc2xhdmUgPSBib25kX2dldF9zbGF2ZV9ieV9kZXYoKHN0cnVjdCBib25kaW5nICopZGV2LT5wcml2LAorCQkJCSAgICAgIHNrYi0+cmVhbF9kZXYpOworCWlmIChzbGF2ZSA9PSBOVUxMKSB7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlib25kXzNhZF9yeF9pbmRpY2F0aW9uKChzdHJ1Y3QgbGFjcGR1ICopIHNrYi0+ZGF0YSwgc2xhdmUsIHNrYi0+bGVuKTsKKworCXJldCA9IE5FVF9SWF9TVUNDRVNTOworCitvdXRfdW5sb2NrOgorCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKK291dDoKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmggYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2ODIzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF8zYWQuaApAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICoKKyAqIENoYW5nZXM6CisgKgorICogMjAwMy8wNS8wMSAtIFRzaXBweSBNZW5kZWxzb24gPHRzaXBweS5tZW5kZWxzb24gYXQgaW50ZWwgZG90IGNvbT4gYW5kCisgKgkJQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQWRkZWQgc3VwcG9ydCBmb3IgbGFjcF9yYXRlIG1vZHVsZSBwYXJhbS4KKyAqCisgKiAyMDAzLzA1LzAxIC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIFJlbmFtZWQgYm9uZF8zYWRfbGlua19zdGF0dXNfY2hhbmdlZCgpIHRvCisgKgkgIGJvbmRfM2FkX2hhbmRsZV9saW5rX2NoYW5nZSgpIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVExCLgorICoKKyAqIDIwMDMvMTIvMDEgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQ29kZSBjbGVhbnVwIGFuZCBzdHlsZSBjaGFuZ2VzCisgKi8KKworI2lmbmRlZiBfX0JPTkRfM0FEX0hfXworI2RlZmluZSBfX0JPTkRfM0FEX0hfXworCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisvLyBHZW5lcmFsIGRlZmluaXRpb25zCisjZGVmaW5lIEJPTkRfRVRIX1BfTEFDUERVICAgICAgIDB4ODgwOQorI2RlZmluZSBQS1RfVFlQRV9MQUNQRFUgICAgICAgICBfX2NvbnN0YW50X2h0b25zKEJPTkRfRVRIX1BfTEFDUERVKQorI2RlZmluZSBBRF9USU1FUl9JTlRFUlZBTCAgICAgICAxMDAgLyptc2VjKi8KKworI2RlZmluZSBNVUxUSUNBU1RfTEFDUERVX0FERFIgICAgezB4MDEsIDB4ODAsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDJ9CisjZGVmaW5lIEFEX01VTFRJQ0FTVF9MQUNQRFVfQUREUiAgICB7TVVMVElDQVNUX0xBQ1BEVV9BRERSfQorCisjZGVmaW5lIEFEX0xBQ1BfU0xPVyAwCisjZGVmaW5lIEFEX0xBQ1BfRkFTVCAxCisKK3R5cGVkZWYgc3RydWN0IG1hY19hZGRyIHsKKwl1OCBtYWNfYWRkcl92YWx1ZVtFVEhfQUxFTl07Cit9IG1hY19hZGRyX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJQURfQkFORFdJRFRIID0gMCwKKwlBRF9DT1VOVAorfSBhZ2dfc2VsZWN0aW9uX3Q7CisKKy8vIHJ4IG1hY2hpbmUgc3RhdGVzKDQzLjQuMTEgaW4gdGhlIDgwMi4zYWQgc3RhbmRhcmQpCit0eXBlZGVmIGVudW0geworCUFEX1JYX0RVTU1ZLAorCUFEX1JYX0lOSVRJQUxJWkUsICAgICAvLyByeCBNYWNoaW5lCisJQURfUlhfUE9SVF9ESVNBQkxFRCwgIC8vIHJ4IE1hY2hpbmUKKwlBRF9SWF9MQUNQX0RJU0FCTEVELCAgLy8gcnggTWFjaGluZQorCUFEX1JYX0VYUElSRUQsCSAgICAgIC8vIHJ4IE1hY2hpbmUKKwlBRF9SWF9ERUZBVUxURUQsICAgICAgLy8gcnggTWFjaGluZQorCUFEX1JYX0NVUlJFTlQJICAgICAgLy8gcnggTWFjaGluZQorfSByeF9zdGF0ZXNfdDsKKworLy8gcGVyaW9kaWMgbWFjaGluZSBzdGF0ZXMoNDMuNC4xMiBpbiB0aGUgODAyLjNhZCBzdGFuZGFyZCkKK3R5cGVkZWYgZW51bSB7CisJQURfUEVSSU9ESUNfRFVNTVksCisJQURfTk9fUEVSSU9ESUMsCSAgICAgICAvLyBwZXJpb2RpYyBtYWNoaW5lCisJQURfRkFTVF9QRVJJT0RJQywgICAgICAvLyBwZXJpb2RpYyBtYWNoaW5lCisJQURfU0xPV19QRVJJT0RJQywgICAgICAvLyBwZXJpb2RpYyBtYWNoaW5lCisJQURfUEVSSU9ESUNfVFgJICAgLy8gcGVyaW9kaWMgbWFjaGluZQorfSBwZXJpb2RpY19zdGF0ZXNfdDsKKworLy8gbXV4IG1hY2hpbmUgc3RhdGVzKDQzLjQuMTMgaW4gdGhlIDgwMi4zYWQgc3RhbmRhcmQpCit0eXBlZGVmIGVudW0geworCUFEX01VWF9EVU1NWSwKKwlBRF9NVVhfREVUQUNIRUQsICAgICAgIC8vIG11eCBtYWNoaW5lCisJQURfTVVYX1dBSVRJTkcsCSAgICAgICAvLyBtdXggbWFjaGluZQorCUFEX01VWF9BVFRBQ0hFRCwgICAgICAgLy8gbXV4IG1hY2hpbmUKKwlBRF9NVVhfQ09MTEVDVElOR19ESVNUUklCVVRJTkcgLy8gbXV4IG1hY2hpbmUKK30gbXV4X3N0YXRlc190OworCisvLyB0eCBtYWNoaW5lIHN0YXRlcyg0My40LjE1IGluIHRoZSA4MDIuM2FkIHN0YW5kYXJkKQordHlwZWRlZiBlbnVtIHsKKwlBRF9UWF9EVU1NWSwKKwlBRF9UUkFOU01JVAkgICAvLyB0eCBNYWNoaW5lCit9IHR4X3N0YXRlc190OworCisvLyByeCBpbmRpY2F0aW9uIHR5cGVzCit0eXBlZGVmIGVudW0geworCUFEX1RZUEVfTEFDUERVID0gMSwgICAgLy8gdHlwZSBsYWNwZHUKKwlBRF9UWVBFX01BUktFUgkgICAvLyB0eXBlIG1hcmtlcgorfSBwZHVfdHlwZV90OworCisvLyByeCBtYXJrZXIgaW5kaWNhdGlvbiB0eXBlcwordHlwZWRlZiBlbnVtIHsKKwlBRF9NQVJLRVJfSU5GT1JNQVRJT05fU1VCVFlQRSA9IDEsIC8vIG1hcmtlciBpbWZvcm1hdGlvbiBzdWJ0eXBlCisJQURfTUFSS0VSX1JFU1BPTlNFX1NVQlRZUEUgICAgIC8vIG1hcmtlciByZXNwb25zZSBzdWJ0eXBlCit9IG1hcmtlcl9zdWJ0eXBlX3Q7CisKKy8vIHRpbWVycyB0eXBlcyg0My40LjkgaW4gdGhlIDgwMi4zYWQgc3RhbmRhcmQpCit0eXBlZGVmIGVudW0geworCUFEX0NVUlJFTlRfV0hJTEVfVElNRVIsCisJQURfQUNUT1JfQ0hVUk5fVElNRVIsCisJQURfUEVSSU9ESUNfVElNRVIsCisJQURfUEFSVE5FUl9DSFVSTl9USU1FUiwKKwlBRF9XQUlUX1dISUxFX1RJTUVSCit9IGFkX3RpbWVyc190OworCisjcHJhZ21hIHBhY2soMSkKKwordHlwZWRlZiBzdHJ1Y3QgYWRfaGVhZGVyIHsKKwlzdHJ1Y3QgbWFjX2FkZHIgZGVzdGluYXRpb25fYWRkcmVzczsKKwlzdHJ1Y3QgbWFjX2FkZHIgc291cmNlX2FkZHJlc3M7CisJdTE2IGxlbmd0aF90eXBlOworfSBhZF9oZWFkZXJfdDsKKworLy8gTGluayBBZ2dyZWdhdGlvbiBDb250cm9sIFByb3RvY29sKExBQ1ApIGRhdGEgdW5pdCBzdHJ1Y3R1cmUoNDMuNC4yLjIgaW4gdGhlIDgwMi4zYWQgc3RhbmRhcmQpCit0eXBlZGVmIHN0cnVjdCBsYWNwZHUgeworCXU4IHN1YnR5cGU7CQkgICAgIC8vID0gTEFDUCg9IDB4MDEpCisJdTggdmVyc2lvbl9udW1iZXI7CisJdTggdGx2X3R5cGVfYWN0b3JfaW5mbzsJICAgICAgLy8gPSBhY3RvciBpbmZvcm1hdGlvbih0eXBlL2xlbmd0aC92YWx1ZSkKKwl1OCBhY3Rvcl9pbmZvcm1hdGlvbl9sZW5ndGg7IC8vID0gMjAKKwl1MTYgYWN0b3Jfc3lzdGVtX3ByaW9yaXR5OworCXN0cnVjdCBtYWNfYWRkciBhY3Rvcl9zeXN0ZW07CisJdTE2IGFjdG9yX2tleTsKKwl1MTYgYWN0b3JfcG9ydF9wcmlvcml0eTsKKwl1MTYgYWN0b3JfcG9ydDsKKwl1OCBhY3Rvcl9zdGF0ZTsKKwl1OCByZXNlcnZlZF8zXzFbM107CSAgICAgLy8gPSAwCisJdTggdGx2X3R5cGVfcGFydG5lcl9pbmZvOyAgICAgLy8gPSBwYXJ0bmVyIGluZm9ybWF0aW9uCisJdTggcGFydG5lcl9pbmZvcm1hdGlvbl9sZW5ndGg7CSAvLyA9IDIwCisJdTE2IHBhcnRuZXJfc3lzdGVtX3ByaW9yaXR5OworCXN0cnVjdCBtYWNfYWRkciBwYXJ0bmVyX3N5c3RlbTsKKwl1MTYgcGFydG5lcl9rZXk7CisJdTE2IHBhcnRuZXJfcG9ydF9wcmlvcml0eTsKKwl1MTYgcGFydG5lcl9wb3J0OworCXU4IHBhcnRuZXJfc3RhdGU7CisJdTggcmVzZXJ2ZWRfM18yWzNdOwkgICAgIC8vID0gMAorCXU4IHRsdl90eXBlX2NvbGxlY3Rvcl9pbmZvOwkgIC8vID0gY29sbGVjdG9yIGluZm9ybWF0aW9uCisJdTggY29sbGVjdG9yX2luZm9ybWF0aW9uX2xlbmd0aDsgLy8gPSAxNgorCXUxNiBjb2xsZWN0b3JfbWF4X2RlbGF5OworCXU4IHJlc2VydmVkXzEyWzEyXTsKKwl1OCB0bHZfdHlwZV90ZXJtaW5hdG9yOwkgICAgIC8vID0gdGVybWluYXRvcgorCXU4IHRlcm1pbmF0b3JfbGVuZ3RoOwkgICAgIC8vID0gMAorCXU4IHJlc2VydmVkXzUwWzUwXTsJICAgICAvLyA9IDAKK30gbGFjcGR1X3Q7CisKK3R5cGVkZWYgc3RydWN0IGxhY3BkdV9oZWFkZXIgeworCXN0cnVjdCBhZF9oZWFkZXIgYWRfaGVhZGVyOworCXN0cnVjdCBsYWNwZHUgbGFjcGR1OworfSBsYWNwZHVfaGVhZGVyX3Q7CisKKy8vIE1hcmtlciBQcm90b2NvbCBEYXRhIFVuaXQoUERVKSBzdHJ1Y3R1cmUoNDMuNS4zLjIgaW4gdGhlIDgwMi4zYWQgc3RhbmRhcmQpCit0eXBlZGVmIHN0cnVjdCBtYXJrZXIgeworCXU4IHN1YnR5cGU7CQkgLy8gID0gMHgwMiAgKG1hcmtlciBQRFUpCisJdTggdmVyc2lvbl9udW1iZXI7CSAvLyAgPSAweDAxCisJdTggdGx2X3R5cGU7CQkgLy8gID0gMHgwMSAgKG1hcmtlciBpbmZvcm1hdGlvbikKKwkvLyAgPSAweDAyICAobWFya2VyIHJlc3BvbnNlIGluZm9ybWF0aW9uKQorCXU4IG1hcmtlcl9sZW5ndGg7CSAvLyAgPSAweDE2CisJdTE2IHJlcXVlc3Rlcl9wb3J0OwkgLy8gICBUaGUgbnVtYmVyIGFzc2lnbmVkIHRvIHRoZSBwb3J0IGJ5IHRoZSByZXF1ZXN0ZXIKKwlzdHJ1Y3QgbWFjX2FkZHIgcmVxdWVzdGVyX3N5c3RlbTsgICAgICAvLyAgIFRoZSByZXF1ZXN0ZXIncyBzeXN0ZW0gaWQKKwl1MzIgcmVxdWVzdGVyX3RyYW5zYWN0aW9uX2lkOwkvLyAgIFRoZSB0cmFuc2FjdGlvbiBpZCBhbGxvY2F0ZWQgYnkgdGhlIHJlcXVlc3RlciwKKwl1MTYgcGFkOwkJIC8vICA9IDAKKwl1OCB0bHZfdHlwZV90ZXJtaW5hdG9yOwkgICAgIC8vICA9IDB4MDAKKwl1OCB0ZXJtaW5hdG9yX2xlbmd0aDsJICAgICAvLyAgPSAweDAwCisJdTggcmVzZXJ2ZWRfOTBbOTBdOwkgICAgIC8vICA9IDAKK30gbWFya2VyX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1hcmtlcl9oZWFkZXIgeworCXN0cnVjdCBhZF9oZWFkZXIgYWRfaGVhZGVyOworCXN0cnVjdCBtYXJrZXIgbWFya2VyOworfSBtYXJrZXJfaGVhZGVyX3Q7CisKKyNwcmFnbWEgcGFjaygpCisKK3N0cnVjdCBzbGF2ZTsKK3N0cnVjdCBib25kaW5nOworc3RydWN0IGFkX2luZm87CitzdHJ1Y3QgcG9ydDsKKworI2lmZGVmIF9faWE2NF9fCisjcHJhZ21hIHBhY2soOCkKKyNlbmRpZgorCisvLyBhZ2dyZWdhdG9yIHN0cnVjdHVyZSg0My40LjUgaW4gdGhlIDgwMi4zYWQgc3RhbmRhcmQpCit0eXBlZGVmIHN0cnVjdCBhZ2dyZWdhdG9yIHsKKwlzdHJ1Y3QgbWFjX2FkZHIgYWdncmVnYXRvcl9tYWNfYWRkcmVzczsKKwl1MTYgYWdncmVnYXRvcl9pZGVudGlmaWVyOworCXUxNiBpc19pbmRpdmlkdWFsOwkJIC8vIEJPT0xFQU4KKwl1MTYgYWN0b3JfYWRtaW5fYWdncmVnYXRvcl9rZXk7CisJdTE2IGFjdG9yX29wZXJfYWdncmVnYXRvcl9rZXk7CisJc3RydWN0IG1hY19hZGRyIHBhcnRuZXJfc3lzdGVtOworCXUxNiBwYXJ0bmVyX3N5c3RlbV9wcmlvcml0eTsKKwl1MTYgcGFydG5lcl9vcGVyX2FnZ3JlZ2F0b3Jfa2V5OworCXUxNiByZWNlaXZlX3N0YXRlOwkJLy8gQk9PTEVBTgorCXUxNiB0cmFuc21pdF9zdGF0ZTsJCS8vIEJPT0xFQU4KKwlzdHJ1Y3QgcG9ydCAqbGFnX3BvcnRzOworCS8vICoqKioqKiBQUklWQVRFIFBBUkFNRVRFUlMgKioqKioqCisJc3RydWN0IHNsYXZlICpzbGF2ZTsJICAgIC8vIHBvaW50ZXIgdG8gdGhlIGJvbmQgc2xhdmUgdGhhdCB0aGlzIGFnZ3JlZ2F0b3IgYmVsb25ncyB0bworCXUxNiBpc19hY3RpdmU7CSAgICAvLyBCT09MRUFOLiBJbmRpY2F0ZXMgaWYgdGhpcyBhZ2dyZWdhdG9yIGlzIGFjdGl2ZQorCXUxNiBudW1fb2ZfcG9ydHM7Cit9IGFnZ3JlZ2F0b3JfdDsKKworLy8gcG9ydCBzdHJ1Y3R1cmUoNDMuNC42IGluIHRoZSA4MDIuM2FkIHN0YW5kYXJkKQordHlwZWRlZiBzdHJ1Y3QgcG9ydCB7CisJdTE2IGFjdG9yX3BvcnRfbnVtYmVyOworCXUxNiBhY3Rvcl9wb3J0X3ByaW9yaXR5OworCXN0cnVjdCBtYWNfYWRkciBhY3Rvcl9zeXN0ZW07CSAgICAgICAvLyBUaGlzIHBhcmFtZXRlciBpcyBhZGRlZCBoZXJlIGFsdGhvdWdoIGl0IGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHN0YW5kYXJkLCBqdXN0IGZvciBzaW1wbGlmaWNhdGlvbgorCXUxNiBhY3Rvcl9zeXN0ZW1fcHJpb3JpdHk7CSAvLyBUaGlzIHBhcmFtZXRlciBpcyBhZGRlZCBoZXJlIGFsdGhvdWdoIGl0IGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHN0YW5kYXJkLCBqdXN0IGZvciBzaW1wbGlmaWNhdGlvbgorCXUxNiBhY3Rvcl9wb3J0X2FnZ3JlZ2F0b3JfaWRlbnRpZmllcjsKKwl1MTYgbnR0OwkJCSAvLyBCT09MRUFOCisJdTE2IGFjdG9yX2FkbWluX3BvcnRfa2V5OworCXUxNiBhY3Rvcl9vcGVyX3BvcnRfa2V5OworCXU4IGFjdG9yX2FkbWluX3BvcnRfc3RhdGU7CisJdTggYWN0b3Jfb3Blcl9wb3J0X3N0YXRlOworCXN0cnVjdCBtYWNfYWRkciBwYXJ0bmVyX2FkbWluX3N5c3RlbTsKKwlzdHJ1Y3QgbWFjX2FkZHIgcGFydG5lcl9vcGVyX3N5c3RlbTsKKwl1MTYgcGFydG5lcl9hZG1pbl9zeXN0ZW1fcHJpb3JpdHk7CisJdTE2IHBhcnRuZXJfb3Blcl9zeXN0ZW1fcHJpb3JpdHk7CisJdTE2IHBhcnRuZXJfYWRtaW5fa2V5OworCXUxNiBwYXJ0bmVyX29wZXJfa2V5OworCXUxNiBwYXJ0bmVyX2FkbWluX3BvcnRfbnVtYmVyOworCXUxNiBwYXJ0bmVyX29wZXJfcG9ydF9udW1iZXI7CisJdTE2IHBhcnRuZXJfYWRtaW5fcG9ydF9wcmlvcml0eTsKKwl1MTYgcGFydG5lcl9vcGVyX3BvcnRfcHJpb3JpdHk7CisJdTggcGFydG5lcl9hZG1pbl9wb3J0X3N0YXRlOworCXU4IHBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlOworCXUxNiBpc19lbmFibGVkOwkgICAgICAvLyBCT09MRUFOCisJLy8gKioqKioqIFBSSVZBVEUgUEFSQU1FVEVSUyAqKioqKioKKwl1MTYgc21fdmFyczsJICAgICAgLy8gYWxsIHN0YXRlIG1hY2hpbmVzIHZhcmlhYmxlcyBmb3IgdGhpcyBwb3J0CisJcnhfc3RhdGVzX3Qgc21fcnhfc3RhdGU7CS8vIHN0YXRlIG1hY2hpbmUgcnggc3RhdGUKKwl1MTYgc21fcnhfdGltZXJfY291bnRlcjsgICAgLy8gc3RhdGUgbWFjaGluZSByeCB0aW1lciBjb3VudGVyCisJcGVyaW9kaWNfc3RhdGVzX3Qgc21fcGVyaW9kaWNfc3RhdGU7Ly8gc3RhdGUgbWFjaGluZSBwZXJpb2RpYyBzdGF0ZQorCXUxNiBzbV9wZXJpb2RpY190aW1lcl9jb3VudGVyOwkvLyBzdGF0ZSBtYWNoaW5lIHBlcmlvZGljIHRpbWVyIGNvdW50ZXIKKwltdXhfc3RhdGVzX3Qgc21fbXV4X3N0YXRlOwkvLyBzdGF0ZSBtYWNoaW5lIG11eCBzdGF0ZQorCXUxNiBzbV9tdXhfdGltZXJfY291bnRlcjsgICAvLyBzdGF0ZSBtYWNoaW5lIG11eCB0aW1lciBjb3VudGVyCisJdHhfc3RhdGVzX3Qgc21fdHhfc3RhdGU7CS8vIHN0YXRlIG1hY2hpbmUgdHggc3RhdGUKKwl1MTYgc21fdHhfdGltZXJfY291bnRlcjsgICAgLy8gc3RhdGUgbWFjaGluZSB0eCB0aW1lciBjb3VudGVyKGFsbHdheXMgb24gLSBlbnRlciB0byB0cmFuc21pdCBzdGF0ZSAzIHRpbWUgcGVyIHNlY29uZCkKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOwkgICAgLy8gcG9pbnRlciB0byB0aGUgYm9uZCBzbGF2ZSB0aGF0IHRoaXMgcG9ydCBiZWxvbmdzIHRvCisJc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3I7CSAgIC8vIHBvaW50ZXIgdG8gYW4gYWdncmVnYXRvciB0aGF0IHRoaXMgcG9ydCByZWxhdGVkIHRvCisJc3RydWN0IHBvcnQgKm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yOyAvLyBOZXh0IHBvcnQgb24gdGhlIGxpbmtlZCBsaXN0IG9mIHRoZSBwYXJlbnQgYWdncmVnYXRvcgorCXUzMiB0cmFuc2FjdGlvbl9pZDsJICAgIC8vIGNvbnRpbnVvdXMgbnVtYmVyIGZvciBpZGVudGlmaWNhdGlvbiBvZiBNYXJrZXIgUERVJ3M7CisJc3RydWN0IGxhY3BkdSBsYWNwZHU7CSAgICAgICAvLyB0aGUgbGFjcGR1IHRoYXQgd2lsbCBiZSBzZW50IGZvciB0aGlzIHBvcnQKK30gcG9ydF90OworCisvLyBzeXN0ZW0gc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCBhZF9zeXN0ZW0geworCXUxNiBzeXNfcHJpb3JpdHk7CisJc3RydWN0IG1hY19hZGRyIHN5c19tYWNfYWRkcjsKK30gYWRfc3lzdGVtX3Q7CisKKyNpZmRlZiBfX2lhNjRfXworI3ByYWdtYSBwYWNrKCkKKyNlbmRpZgorCisvLyA9PT09PT09PT09PT09PT09PSBBRCBFeHBvcnRlZCBzdHJ1Y3R1cmVzIHRvIHRoZSBtYWluIGJvbmRpbmcgY29kZSA9PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQk9ORF9BRF9JTkZPKGJvbmQpICAgKChib25kKS0+YWRfaW5mbykKKyNkZWZpbmUgU0xBVkVfQURfSU5GTyhzbGF2ZSkgKChzbGF2ZSktPmFkX2luZm8pCisKK3N0cnVjdCBhZF9ib25kX2luZm8geworCWFkX3N5c3RlbV90IHN5c3RlbTsJICAgIC8vIDgwMi4zYWQgc3lzdGVtIHN0cnVjdHVyZQorCXUzMiBhZ2dfc2VsZWN0X3RpbWVyOwkgICAgLy8gVGltZXIgdG8gc2VsZWN0IGFnZ3JlZ2F0b3IgYWZ0ZXIgYWxsIGFkYXB0ZXIncyBoYW5kIHNoYWtlcworCXUzMiBhZ2dfc2VsZWN0X21vZGU7CSAgICAvLyBNb2RlIG9mIHNlbGVjdGlvbiBvZiBhY3RpdmUgYWdncmVnYXRvcihiYW5kd2lkdGgvY291bnQpCisJaW50IGxhY3BfZmFzdDsJCS8qIHdoZXRoZXIgZmFzdCBwZXJpb2RpYyB0eCBzaG91bGQgYmUKKwkJCQkgKiByZXF1ZXN0ZWQKKwkJCQkgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBhZF90aW1lcjsKKwlzdHJ1Y3QgcGFja2V0X3R5cGUgYWRfcGt0X3R5cGU7Cit9OworCitzdHJ1Y3QgYWRfc2xhdmVfaW5mbyB7CisJc3RydWN0IGFnZ3JlZ2F0b3IgYWdncmVnYXRvcjsJICAgIC8vIDgwMi4zYWQgYWdncmVnYXRvciBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgcG9ydCBwb3J0OwkJICAgIC8vIDgwMi4zYWQgcG9ydCBzdHJ1Y3R1cmUKKwlzcGlubG9ja190IHJ4X21hY2hpbmVfbG9jazsgLy8gVG8gYXZvaWQgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBjYWxsYmFjayBhbmQgcmVjZWl2ZSBpbnRlcnJ1cHQKKwl1MTYgaWQ7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PSBBRCBFeHBvcnRlZCBmdW5jdGlvbnMgdG8gdGhlIG1haW4gYm9uZGluZyBjb2RlID09PT09PT09PT09PT09PT09PQordm9pZCBib25kXzNhZF9pbml0aWFsaXplKHN0cnVjdCBib25kaW5nICpib25kLCB1MTYgdGlja19yZXNvbHV0aW9uLCBpbnQgbGFjcF9mYXN0KTsKK2ludCAgYm9uZF8zYWRfYmluZF9zbGF2ZShzdHJ1Y3Qgc2xhdmUgKnNsYXZlKTsKK3ZvaWQgYm9uZF8zYWRfdW5iaW5kX3NsYXZlKHN0cnVjdCBzbGF2ZSAqc2xhdmUpOwordm9pZCBib25kXzNhZF9zdGF0ZV9tYWNoaW5lX2hhbmRsZXIoc3RydWN0IGJvbmRpbmcgKmJvbmQpOwordm9pZCBib25kXzNhZF9hZGFwdGVyX3NwZWVkX2NoYW5nZWQoc3RydWN0IHNsYXZlICpzbGF2ZSk7Cit2b2lkIGJvbmRfM2FkX2FkYXB0ZXJfZHVwbGV4X2NoYW5nZWQoc3RydWN0IHNsYXZlICpzbGF2ZSk7Cit2b2lkIGJvbmRfM2FkX2hhbmRsZV9saW5rX2NoYW5nZShzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCBjaGFyIGxpbmspOworaW50ICBib25kXzNhZF9nZXRfYWN0aXZlX2FnZ19pbmZvKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3QgYWRfaW5mbyAqYWRfaW5mbyk7CitpbnQgYm9uZF8zYWRfeG1pdF94b3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgYm9uZF8zYWRfbGFjcGR1X3JlY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHBhY2tldF90eXBlKiBwdHlwZSk7CisjZW5kaWYgLy9fX0JPTkRfM0FEX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlNjA2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYwpAQCAtMCwwICsxLDE2OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqIDIwMDMvMDYvMjUgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gRml4ZWQgc2lnbmVkL3Vuc2lnbmVkIGNhbGN1bGF0aW9uIGVycm9ycyB0aGF0IGNhdXNlZCBsb2FkIHNoYXJpbmcKKyAqCSAgdG8gY29sbGFwc2UgdG8gb25lIHNsYXZlIHVuZGVyIHZlcnkgaGVhdnkgVURQIFR4IHN0cmVzcy4KKyAqCisgKiAyMDAzLzA4LzA2IC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQWRkIHN1cHBvcnQgZm9yIHNldHRpbmcgYm9uZCdzIE1BQyBhZGRyZXNzIHdpdGggc3BlY2lhbAorICoJICBoYW5kbGluZyByZXF1aXJlZCBmb3IgQUxCL1RMQi4KKyAqCisgKiAyMDAzLzEyLzAxIC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIENvZGUgY2xlYW51cCBhbmQgc3R5bGUgY2hhbmdlcworICoKKyAqIDIwMDMvMTIvMzAgLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBGaXhlZDogQ2Fubm90IHJlbW92ZSBhbmQgcmUtZW5zbGF2ZSB0aGUgb3JpZ2luYWwgYWN0aXZlIHNsYXZlLgorICoKKyAqIDIwMDQvMDEvMTQgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQWRkIGNhcGFiaWxpdHkgdG8gdGFnIHNlbGYgZ2VuZXJhdGVkIHBhY2tldHMgaW4gQUxCL1RMQiBtb2Rlcy4KKyAqLworCisvLyNkZWZpbmUgQk9ORElOR19ERUJVRyAxCisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ib25kaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bmV0L2lweC5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSAiYm9uZGluZy5oIgorI2luY2x1ZGUgImJvbmRfYWxiLmgiCisKKworI2RlZmluZSBBTEJfVElNRVJfVElDS1NfUEVSX1NFQwkgICAgMTAJLyogc2hvdWxkIGJlIGEgZGl2aXNvciBvZiBIWiAqLworI2RlZmluZSBCT05EX1RMQl9SRUJBTEFOQ0VfSU5URVJWQUwgMTAJLyogSW4gc2Vjb25kcywgcGVyaW9kaWMgcmUtYmFsYW5jaW5nLgorCQkJCQkgKiBVc2VkIGZvciBkaXZpc2lvbiAtIG5ldmVyIHNldAorCQkJCQkgKiB0byB6ZXJvICEhIQorCQkJCQkgKi8KKyNkZWZpbmUgQk9ORF9BTEJfTFBfSU5URVJWQUwJICAgIDEJLyogSW4gc2Vjb25kcywgcGVyaW9kaWMgc2VuZCBvZgorCQkJCQkgKiBsZWFybmluZyBwYWNrZXRzIHRvIHRoZSBzd2l0Y2gKKwkJCQkJICovCisKKyNkZWZpbmUgQk9ORF9UTEJfUkVCQUxBTkNFX1RJQ0tTIChCT05EX1RMQl9SRUJBTEFOQ0VfSU5URVJWQUwgXAorCQkJCSAgKiBBTEJfVElNRVJfVElDS1NfUEVSX1NFQykKKworI2RlZmluZSBCT05EX0FMQl9MUF9USUNLUyAoQk9ORF9BTEJfTFBfSU5URVJWQUwgXAorCQkJICAgKiBBTEJfVElNRVJfVElDS1NfUEVSX1NFQykKKworI2RlZmluZSBUTEJfSEFTSF9UQUJMRV9TSVpFIDI1NgkvKiBUaGUgc2l6ZSBvZiB0aGUgY2xpZW50cyBoYXNoIHRhYmxlLgorCQkJCSAqIE5vdGUgdGhhdCB0aGlzIHZhbHVlIE1VU1QgTk9UIGJlIHNtYWxsZXIKKwkJCQkgKiBiZWNhdXNlIHRoZSBrZXkgaGFzaCB0YWJsZSBpcyBCWVRFIHdpZGUgIQorCQkJCSAqLworCisKKyNkZWZpbmUgVExCX05VTExfSU5ERVgJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgTUFYX0xQX0JVUlNUCQkzCisKKy8qIHJsYiBkZWZzICovCisjZGVmaW5lIFJMQl9IQVNIX1RBQkxFX1NJWkUJMjU2CisjZGVmaW5lIFJMQl9OVUxMX0lOREVYCQkweGZmZmZmZmZmCisjZGVmaW5lIFJMQl9VUERBVEVfREVMQVkJMipBTEJfVElNRVJfVElDS1NfUEVSX1NFQyAvKiAyIHNlY29uZHMgKi8KKyNkZWZpbmUgUkxCX0FSUF9CVVJTVF9TSVpFCTIKKyNkZWZpbmUgUkxCX1VQREFURV9SRVRSWQkzCS8qIDMtdGlja3MgLSBtdXN0IGJlIHNtYWxsZXIgdGhhbiB0aGUgcmxiCisJCQkJCSAqIHJlYmFsYW5jZSBpbnRlcnZhbCAoNSBtaW4pLgorCQkJCQkgKi8KKy8qIFJMQl9QUk9NSVNDX1RJTUVPVVQgPSAxMCBzZWMgZXF1YWxzIHRoZSB0aW1lIHRoYXQgdGhlIGN1cnJlbnQgc2xhdmUgaXMKKyAqIHByb21pc2N1b3VzIGFmdGVyIGZhaWxvdmVyCisgKi8KKyNkZWZpbmUgUkxCX1BST01JU0NfVElNRU9VVAkxMCpBTEJfVElNRVJfVElDS1NfUEVSX1NFQworCitzdGF0aWMgY29uc3QgdTggbWFjX2JjYXN0W0VUSF9BTEVOXSA9IHsweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZn07CitzdGF0aWMgY29uc3QgaW50IGFsYl9kZWx0YV9pbl90aWNrcyA9IEhaIC8gQUxCX1RJTUVSX1RJQ0tTX1BFUl9TRUM7CisKKyNwcmFnbWEgcGFjaygxKQorc3RydWN0IGxlYXJuaW5nX3BrdCB7CisJdTggbWFjX2RzdFtFVEhfQUxFTl07CisJdTggbWFjX3NyY1tFVEhfQUxFTl07CisJdTE2IHR5cGU7CisJdTggcGFkZGluZ1tFVEhfWkxFTiAtIEVUSF9ITEVOXTsKK307CisKK3N0cnVjdCBhcnBfcGt0IHsKKwl1MTYgICAgIGh3X2FkZHJfc3BhY2U7CisJdTE2ICAgICBwcm90X2FkZHJfc3BhY2U7CisJdTggICAgICBod19hZGRyX2xlbjsKKwl1OCAgICAgIHByb3RfYWRkcl9sZW47CisJdTE2ICAgICBvcF9jb2RlOworCXU4ICAgICAgbWFjX3NyY1tFVEhfQUxFTl07CS8qIHNlbmRlciBoYXJkd2FyZSBhZGRyZXNzICovCisJdTMyICAgICBpcF9zcmM7CQkJLyogc2VuZGVyIElQIGFkZHJlc3MgKi8KKwl1OCAgICAgIG1hY19kc3RbRVRIX0FMRU5dOwkvKiB0YXJnZXQgaGFyZHdhcmUgYWRkcmVzcyAqLworCXUzMiAgICAgaXBfZHN0OwkJCS8qIHRhcmdldCBJUCBhZGRyZXNzICovCit9OworI3ByYWdtYSBwYWNrKCkKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQgYWxiX3NlbmRfbGVhcm5pbmdfcGFja2V0cyhzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCB1OCBtYWNfYWRkcltdKTsKKworc3RhdGljIGlubGluZSB1OCBfc2ltcGxlX2hhc2godTggKmhhc2hfc3RhcnQsIGludCBoYXNoX3NpemUpCit7CisJaW50IGk7CisJdTggaGFzaCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgaGFzaF9zaXplOyBpKyspIHsKKwkJaGFzaCBePSBoYXNoX3N0YXJ0W2ldOworCX0KKworCXJldHVybiBoYXNoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogdGxiIHNwZWNpZmljIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfbG9ja190eF9oYXNodGJsKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXNwaW5fbG9jaygmKEJPTkRfQUxCX0lORk8oYm9uZCkudHhfaGFzaHRibF9sb2NrKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfdW5sb2NrX3R4X2hhc2h0Ymwoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3Bpbl91bmxvY2soJihCT05EX0FMQl9JTkZPKGJvbmQpLnR4X2hhc2h0YmxfbG9jaykpOworfQorCisvKiBDYWxsZXIgbXVzdCBob2xkIHR4X2hhc2h0YmwgbG9jayAqLworc3RhdGljIGlubGluZSB2b2lkIHRsYl9pbml0X3RhYmxlX2VudHJ5KHN0cnVjdCB0bGJfY2xpZW50X2luZm8gKmVudHJ5LCBpbnQgc2F2ZV9sb2FkKQoreworCWlmIChzYXZlX2xvYWQpIHsKKwkJZW50cnktPmxvYWRfaGlzdG9yeSA9IDEgKyBlbnRyeS0+dHhfYnl0ZXMgLworCQkJCSAgICAgIEJPTkRfVExCX1JFQkFMQU5DRV9JTlRFUlZBTDsKKwkJZW50cnktPnR4X2J5dGVzID0gMDsKKwl9CisKKwllbnRyeS0+dHhfc2xhdmUgPSBOVUxMOworCWVudHJ5LT5uZXh0ID0gVExCX05VTExfSU5ERVg7CisJZW50cnktPnByZXYgPSBUTEJfTlVMTF9JTkRFWDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRsYl9pbml0X3NsYXZlKHN0cnVjdCBzbGF2ZSAqc2xhdmUpCit7CisJU0xBVkVfVExCX0lORk8oc2xhdmUpLmxvYWQgPSAwOworCVNMQVZFX1RMQl9JTkZPKHNsYXZlKS5oZWFkID0gVExCX05VTExfSU5ERVg7Cit9CisKKy8qIENhbGxlciBtdXN0IGhvbGQgYm9uZCBsb2NrIGZvciByZWFkICovCitzdGF0aWMgdm9pZCB0bGJfY2xlYXJfc2xhdmUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBzbGF2ZSAqc2xhdmUsIGludCBzYXZlX2xvYWQpCit7CisJc3RydWN0IHRsYl9jbGllbnRfaW5mbyAqdHhfaGFzaF90YWJsZTsKKwl1MzIgaW5kZXg7CisKKwlfbG9ja190eF9oYXNodGJsKGJvbmQpOworCisJLyogY2xlYXIgc2xhdmUgZnJvbSB0eF9oYXNodGJsICovCisJdHhfaGFzaF90YWJsZSA9IEJPTkRfQUxCX0lORk8oYm9uZCkudHhfaGFzaHRibDsKKworCWluZGV4ID0gU0xBVkVfVExCX0lORk8oc2xhdmUpLmhlYWQ7CisJd2hpbGUgKGluZGV4ICE9IFRMQl9OVUxMX0lOREVYKSB7CisJCXUzMiBuZXh0X2luZGV4ID0gdHhfaGFzaF90YWJsZVtpbmRleF0ubmV4dDsKKwkJdGxiX2luaXRfdGFibGVfZW50cnkoJnR4X2hhc2hfdGFibGVbaW5kZXhdLCBzYXZlX2xvYWQpOworCQlpbmRleCA9IG5leHRfaW5kZXg7CisJfQorCisJX3VubG9ja190eF9oYXNodGJsKGJvbmQpOworCisJdGxiX2luaXRfc2xhdmUoc2xhdmUpOworfQorCisvKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgdGhlIG1vbml0b3IgdGltZXIgKi8KK3N0YXRpYyBpbnQgdGxiX2luaXRpYWxpemUoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IGFsYl9ib25kX2luZm8gKmJvbmRfaW5mbyA9ICYoQk9ORF9BTEJfSU5GTyhib25kKSk7CisJaW50IHNpemUgPSBUTEJfSEFTSF9UQUJMRV9TSVpFICogc2l6ZW9mKHN0cnVjdCB0bGJfY2xpZW50X2luZm8pOworCWludCBpOworCisJc3Bpbl9sb2NrX2luaXQoJihib25kX2luZm8tPnR4X2hhc2h0YmxfbG9jaykpOworCisJX2xvY2tfdHhfaGFzaHRibChib25kKTsKKworCWJvbmRfaW5mby0+dHhfaGFzaHRibCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFib25kX2luZm8tPnR4X2hhc2h0YmwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCSAgICAgICAiOiBFcnJvcjogJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBUTEIgaGFzaCB0YWJsZVxuIiwKKwkJICAgICAgIGJvbmQtPmRldi0+bmFtZSk7CisJCV91bmxvY2tfdHhfaGFzaHRibChib25kKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbXNldChib25kX2luZm8tPnR4X2hhc2h0YmwsIDAsIHNpemUpOworCisJZm9yIChpID0gMDsgaSA8IFRMQl9IQVNIX1RBQkxFX1NJWkU7IGkrKykgeworCQl0bGJfaW5pdF90YWJsZV9lbnRyeSgmYm9uZF9pbmZvLT50eF9oYXNodGJsW2ldLCAxKTsKKwl9CisKKwlfdW5sb2NrX3R4X2hhc2h0YmwoYm9uZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBhbGwgc2xhdmVzIGhhdmUgYmVlbiByZWxlYXNlZCAqLworc3RhdGljIHZvaWQgdGxiX2RlaW5pdGlhbGl6ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzdHJ1Y3QgYWxiX2JvbmRfaW5mbyAqYm9uZF9pbmZvID0gJihCT05EX0FMQl9JTkZPKGJvbmQpKTsKKworCV9sb2NrX3R4X2hhc2h0YmwoYm9uZCk7CisKKwlrZnJlZShib25kX2luZm8tPnR4X2hhc2h0YmwpOworCWJvbmRfaW5mby0+dHhfaGFzaHRibCA9IE5VTEw7CisKKwlfdW5sb2NrX3R4X2hhc2h0YmwoYm9uZCk7Cit9CisKKy8qIENhbGxlciBtdXN0IGhvbGQgYm9uZCBsb2NrIGZvciByZWFkICovCitzdGF0aWMgc3RydWN0IHNsYXZlICp0bGJfZ2V0X2xlYXN0X2xvYWRlZF9zbGF2ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCAqbGVhc3RfbG9hZGVkOworCXM2NCBtYXhfZ2FwOworCWludCBpLCBmb3VuZCA9IDA7CisKKwkvKiBGaW5kIHRoZSBmaXJzdCBlbmFibGVkIHNsYXZlICovCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQlpZiAoU0xBVkVfSVNfT0soc2xhdmUpKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghZm91bmQpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGVhc3RfbG9hZGVkID0gc2xhdmU7CisJbWF4X2dhcCA9IChzNjQpKHNsYXZlLT5zcGVlZCA8PCAyMCkgLSAvKiBDb252ZXJ0IHRvIE1lZ2FiaXQgcGVyIHNlYyAqLworCQkJKHM2NCkoU0xBVkVfVExCX0lORk8oc2xhdmUpLmxvYWQgPDwgMyk7IC8qIEJ5dGVzIHRvIGJpdHMgKi8KKworCS8qIEZpbmQgdGhlIHNsYXZlIHdpdGggdGhlIGxhcmdlc3QgZ2FwICovCisJYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tKGJvbmQsIHNsYXZlLCBpLCBsZWFzdF9sb2FkZWQpIHsKKwkJaWYgKFNMQVZFX0lTX09LKHNsYXZlKSkgeworCQkJczY0IGdhcCA9IChzNjQpKHNsYXZlLT5zcGVlZCA8PCAyMCkgLQorCQkJCQkoczY0KShTTEFWRV9UTEJfSU5GTyhzbGF2ZSkubG9hZCA8PCAzKTsKKwkJCWlmIChtYXhfZ2FwIDwgZ2FwKSB7CisJCQkJbGVhc3RfbG9hZGVkID0gc2xhdmU7CisJCQkJbWF4X2dhcCA9IGdhcDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBsZWFzdF9sb2FkZWQ7Cit9CisKKy8qIENhbGxlciBtdXN0IGhvbGQgYm9uZCBsb2NrIGZvciByZWFkICovCitzdGF0aWMgc3RydWN0IHNsYXZlICp0bGJfY2hvb3NlX2NoYW5uZWwoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHUzMiBoYXNoX2luZGV4LCB1MzIgc2tiX2xlbikKK3sKKwlzdHJ1Y3QgYWxiX2JvbmRfaW5mbyAqYm9uZF9pbmZvID0gJihCT05EX0FMQl9JTkZPKGJvbmQpKTsKKwlzdHJ1Y3QgdGxiX2NsaWVudF9pbmZvICpoYXNoX3RhYmxlOworCXN0cnVjdCBzbGF2ZSAqYXNzaWduZWRfc2xhdmU7CisKKwlfbG9ja190eF9oYXNodGJsKGJvbmQpOworCisJaGFzaF90YWJsZSA9IGJvbmRfaW5mby0+dHhfaGFzaHRibDsKKwlhc3NpZ25lZF9zbGF2ZSA9IGhhc2hfdGFibGVbaGFzaF9pbmRleF0udHhfc2xhdmU7CisJaWYgKCFhc3NpZ25lZF9zbGF2ZSkgeworCQlhc3NpZ25lZF9zbGF2ZSA9IHRsYl9nZXRfbGVhc3RfbG9hZGVkX3NsYXZlKGJvbmQpOworCisJCWlmIChhc3NpZ25lZF9zbGF2ZSkgeworCQkJc3RydWN0IHRsYl9zbGF2ZV9pbmZvICpzbGF2ZV9pbmZvID0KKwkJCQkmKFNMQVZFX1RMQl9JTkZPKGFzc2lnbmVkX3NsYXZlKSk7CisJCQl1MzIgbmV4dF9pbmRleCA9IHNsYXZlX2luZm8tPmhlYWQ7CisKKwkJCWhhc2hfdGFibGVbaGFzaF9pbmRleF0udHhfc2xhdmUgPSBhc3NpZ25lZF9zbGF2ZTsKKwkJCWhhc2hfdGFibGVbaGFzaF9pbmRleF0ubmV4dCA9IG5leHRfaW5kZXg7CisJCQloYXNoX3RhYmxlW2hhc2hfaW5kZXhdLnByZXYgPSBUTEJfTlVMTF9JTkRFWDsKKworCQkJaWYgKG5leHRfaW5kZXggIT0gVExCX05VTExfSU5ERVgpIHsKKwkJCQloYXNoX3RhYmxlW25leHRfaW5kZXhdLnByZXYgPSBoYXNoX2luZGV4OworCQkJfQorCisJCQlzbGF2ZV9pbmZvLT5oZWFkID0gaGFzaF9pbmRleDsKKwkJCXNsYXZlX2luZm8tPmxvYWQgKz0KKwkJCQloYXNoX3RhYmxlW2hhc2hfaW5kZXhdLmxvYWRfaGlzdG9yeTsKKwkJfQorCX0KKworCWlmIChhc3NpZ25lZF9zbGF2ZSkgeworCQloYXNoX3RhYmxlW2hhc2hfaW5kZXhdLnR4X2J5dGVzICs9IHNrYl9sZW47CisJfQorCisJX3VubG9ja190eF9oYXNodGJsKGJvbmQpOworCisJcmV0dXJuIGFzc2lnbmVkX3NsYXZlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogcmxiIHNwZWNpZmljIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgX2xvY2tfcnhfaGFzaHRibChzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzcGluX2xvY2soJihCT05EX0FMQl9JTkZPKGJvbmQpLnJ4X2hhc2h0YmxfbG9jaykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX3VubG9ja19yeF9oYXNodGJsKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXNwaW5fdW5sb2NrKCYoQk9ORF9BTEJfSU5GTyhib25kKS5yeF9oYXNodGJsX2xvY2spKTsKK30KKworLyogd2hlbiBhbiBBUlAgUkVQTFkgaXMgcmVjZWl2ZWQgZnJvbSBhIGNsaWVudCB1cGRhdGUgaXRzIGluZm8KKyAqIGluIHRoZSByeF9oYXNodGJsCisgKi8KK3N0YXRpYyB2b2lkIHJsYl91cGRhdGVfZW50cnlfZnJvbV9hcnAoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBhcnBfcGt0ICphcnApCit7CisJc3RydWN0IGFsYl9ib25kX2luZm8gKmJvbmRfaW5mbyA9ICYoQk9ORF9BTEJfSU5GTyhib25kKSk7CisJc3RydWN0IHJsYl9jbGllbnRfaW5mbyAqY2xpZW50X2luZm87CisJdTMyIGhhc2hfaW5kZXg7CisKKwlfbG9ja19yeF9oYXNodGJsKGJvbmQpOworCisJaGFzaF9pbmRleCA9IF9zaW1wbGVfaGFzaCgodTgqKSYoYXJwLT5pcF9zcmMpLCBzaXplb2YoYXJwLT5pcF9zcmMpKTsKKwljbGllbnRfaW5mbyA9ICYoYm9uZF9pbmZvLT5yeF9oYXNodGJsW2hhc2hfaW5kZXhdKTsKKworCWlmICgoY2xpZW50X2luZm8tPmFzc2lnbmVkKSAmJgorCSAgICAoY2xpZW50X2luZm8tPmlwX3NyYyA9PSBhcnAtPmlwX2RzdCkgJiYKKwkgICAgKGNsaWVudF9pbmZvLT5pcF9kc3QgPT0gYXJwLT5pcF9zcmMpKSB7CisJCS8qIHVwZGF0ZSB0aGUgY2xpZW50cyBNQUMgYWRkcmVzcyAqLworCQltZW1jcHkoY2xpZW50X2luZm8tPm1hY19kc3QsIGFycC0+bWFjX3NyYywgRVRIX0FMRU4pOworCQljbGllbnRfaW5mby0+bnR0ID0gMTsKKwkJYm9uZF9pbmZvLT5yeF9udHQgPSAxOworCX0KKworCV91bmxvY2tfcnhfaGFzaHRibChib25kKTsKK30KKworc3RhdGljIGludCBybGJfYXJwX3JlY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IGFycF9wa3QgKmFycCA9IChzdHJ1Y3QgYXJwX3BrdCAqKXNrYi0+ZGF0YTsKKwlpbnQgcmVzID0gTkVUX1JYX0RST1A7CisKKwlpZiAoIShib25kX2Rldi0+ZmxhZ3MgJiBJRkZfTUFTVEVSKSkgeworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWFycCkgeworCQlkcHJpbnRrKCJQYWNrZXQgaGFzIG5vIEFSUCBkYXRhXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBhcnBfcGt0KSkgeworCQlkcHJpbnRrKCJQYWNrZXQgaXMgdG9vIHNtYWxsIHRvIGJlIGFuIEFSUFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChhcnAtPm9wX2NvZGUgPT0gaHRvbnMoQVJQT1BfUkVQTFkpKSB7CisJCS8qIHVwZGF0ZSByeCBoYXNoIHRhYmxlIGZvciB0aGlzIEFSUCAqLworCQlybGJfdXBkYXRlX2VudHJ5X2Zyb21fYXJwKGJvbmQsIGFycCk7CisJCWRwcmludGsoIlNlcnZlciByZWNlaXZlZCBhbiBBUlAgUmVwbHkgZnJvbSBjbGllbnRcbiIpOworCX0KKworCXJlcyA9IE5FVF9SWF9TVUNDRVNTOworCitvdXQ6CisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIHJlczsKK30KKworLyogQ2FsbGVyIG11c3QgaG9sZCBib25kIGxvY2sgZm9yIHJlYWQgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2xhdmUgKnJsYl9uZXh0X3J4X3NsYXZlKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBhbGJfYm9uZF9pbmZvICpib25kX2luZm8gPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkpOworCXN0cnVjdCBzbGF2ZSAqcnhfc2xhdmUsICpzbGF2ZSwgKnN0YXJ0X2F0OworCWludCBpID0gMDsKKworCWlmIChib25kX2luZm8tPm5leHRfcnhfc2xhdmUpIHsKKwkJc3RhcnRfYXQgPSBib25kX2luZm8tPm5leHRfcnhfc2xhdmU7CisJfSBlbHNlIHsKKwkJc3RhcnRfYXQgPSBib25kLT5maXJzdF9zbGF2ZTsKKwl9CisKKwlyeF9zbGF2ZSA9IE5VTEw7CisKKwlib25kX2Zvcl9lYWNoX3NsYXZlX2Zyb20oYm9uZCwgc2xhdmUsIGksIHN0YXJ0X2F0KSB7CisJCWlmIChTTEFWRV9JU19PSyhzbGF2ZSkpIHsKKwkJCWlmICghcnhfc2xhdmUpIHsKKwkJCQlyeF9zbGF2ZSA9IHNsYXZlOworCQkJfSBlbHNlIGlmIChzbGF2ZS0+c3BlZWQgPiByeF9zbGF2ZS0+c3BlZWQpIHsKKwkJCQlyeF9zbGF2ZSA9IHNsYXZlOworCQkJfQorCQl9CisJfQorCisJaWYgKHJ4X3NsYXZlKSB7CisJCWJvbmRfaW5mby0+bmV4dF9yeF9zbGF2ZSA9IHJ4X3NsYXZlLT5uZXh0OworCX0KKworCXJldHVybiByeF9zbGF2ZTsKK30KKworLyogdGVhY2ggdGhlIHN3aXRjaCB0aGUgbWFjIG9mIGEgZGlzYWJsZWQgc2xhdmUKKyAqIG9uIHRoZSBwcmltYXJ5IGZvciBmYXVsdCB0b2xlcmFuY2UKKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQtPmN1cnJfc2xhdmVfbG9jayBmb3Igd3JpdGUgb3IgYm9uZCBsb2NrIGZvciB3cml0ZQorICovCitzdGF0aWMgdm9pZCBybGJfdGVhY2hfZGlzYWJsZWRfbWFjX29uX3ByaW1hcnkoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHU4IGFkZHJbXSkKK3sKKwlpZiAoIWJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWJvbmQtPmFsYl9pbmZvLnByaW1hcnlfaXNfcHJvbWlzYykgeworCQlib25kLT5hbGJfaW5mby5wcmltYXJ5X2lzX3Byb21pc2MgPSAxOworCQlkZXZfc2V0X3Byb21pc2N1aXR5KGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlLT5kZXYsIDEpOworCX0KKworCWJvbmQtPmFsYl9pbmZvLnJsYl9wcm9taXNjX3RpbWVvdXRfY291bnRlciA9IDA7CisKKwlhbGJfc2VuZF9sZWFybmluZ19wYWNrZXRzKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlLCBhZGRyKTsKK30KKworLyogc2xhdmUgYmVpbmcgcmVtb3ZlZCBzaG91bGQgbm90IGJlIGFjdGl2ZSBhdCB0aGlzIHBvaW50CisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBib25kIGxvY2sgZm9yIHJlYWQKKyAqLworc3RhdGljIHZvaWQgcmxiX2NsZWFyX3NsYXZlKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCXN0cnVjdCBhbGJfYm9uZF9pbmZvICpib25kX2luZm8gPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkpOworCXN0cnVjdCBybGJfY2xpZW50X2luZm8gKnJ4X2hhc2hfdGFibGU7CisJdTMyIGluZGV4LCBuZXh0X2luZGV4OworCisJLyogY2xlYXIgc2xhdmUgZnJvbSByeF9oYXNodGJsICovCisJX2xvY2tfcnhfaGFzaHRibChib25kKTsKKworCXJ4X2hhc2hfdGFibGUgPSBib25kX2luZm8tPnJ4X2hhc2h0Ymw7CisJaW5kZXggPSBib25kX2luZm8tPnJ4X2hhc2h0YmxfaGVhZDsKKwlmb3IgKDsgaW5kZXggIT0gUkxCX05VTExfSU5ERVg7IGluZGV4ID0gbmV4dF9pbmRleCkgeworCQluZXh0X2luZGV4ID0gcnhfaGFzaF90YWJsZVtpbmRleF0ubmV4dDsKKwkJaWYgKHJ4X2hhc2hfdGFibGVbaW5kZXhdLnNsYXZlID09IHNsYXZlKSB7CisJCQlzdHJ1Y3Qgc2xhdmUgKmFzc2lnbmVkX3NsYXZlID0gcmxiX25leHRfcnhfc2xhdmUoYm9uZCk7CisKKwkJCWlmIChhc3NpZ25lZF9zbGF2ZSkgeworCQkJCXJ4X2hhc2hfdGFibGVbaW5kZXhdLnNsYXZlID0gYXNzaWduZWRfc2xhdmU7CisJCQkJaWYgKG1lbWNtcChyeF9oYXNoX3RhYmxlW2luZGV4XS5tYWNfZHN0LAorCQkJCQkgICBtYWNfYmNhc3QsIEVUSF9BTEVOKSkgeworCQkJCQlib25kX2luZm8tPnJ4X2hhc2h0YmxbaW5kZXhdLm50dCA9IDE7CisJCQkJCWJvbmRfaW5mby0+cnhfbnR0ID0gMTsKKwkJCQkJLyogQSBzbGF2ZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlCisJCQkJCSAqIHRhYmxlIGJlY2F1c2UgaXQgaXMgZWl0aGVyIGRpc2FibGVkCisJCQkJCSAqIG9yIGJlaW5nIHJlbGVhc2VkLiBXZSBtdXN0IHJldHJ5IHRoZQorCQkJCQkgKiB1cGRhdGUgdG8gYXZvaWQgY2xpZW50cyBmcm9tIG5vdAorCQkJCQkgKiBiZWluZyB1cGRhdGVkICYgZGlzY29ubmVjdGluZyB3aGVuCisJCQkJCSAqIHRoZXJlIGlzIHN0cmVzcworCQkJCQkgKi8KKwkJCQkJYm9uZF9pbmZvLT5ybGJfdXBkYXRlX3JldHJ5X2NvdW50ZXIgPQorCQkJCQkJUkxCX1VQREFURV9SRVRSWTsKKwkJCQl9CisJCQl9IGVsc2UgeyAgLyogdGhlcmUgaXMgbm8gYWN0aXZlIHNsYXZlICovCisJCQkJcnhfaGFzaF90YWJsZVtpbmRleF0uc2xhdmUgPSBOVUxMOworCQkJfQorCQl9CisJfQorCisJX3VubG9ja19yeF9oYXNodGJsKGJvbmQpOworCisJd3JpdGVfbG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCWlmIChzbGF2ZSAhPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeworCQlybGJfdGVhY2hfZGlzYWJsZWRfbWFjX29uX3ByaW1hcnkoYm9uZCwgc2xhdmUtPmRldi0+ZGV2X2FkZHIpOworCX0KKworCXdyaXRlX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcmxiX3VwZGF0ZV9jbGllbnQoc3RydWN0IHJsYl9jbGllbnRfaW5mbyAqY2xpZW50X2luZm8pCit7CisJaW50IGk7CisKKwlpZiAoIWNsaWVudF9pbmZvLT5zbGF2ZSkgeworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IFJMQl9BUlBfQlVSU1RfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gYXJwX2NyZWF0ZShBUlBPUF9SRVBMWSwgRVRIX1BfQVJQLAorCQkJCSBjbGllbnRfaW5mby0+aXBfZHN0LAorCQkJCSBjbGllbnRfaW5mby0+c2xhdmUtPmRldiwKKwkJCQkgY2xpZW50X2luZm8tPmlwX3NyYywKKwkJCQkgY2xpZW50X2luZm8tPm1hY19kc3QsCisJCQkJIGNsaWVudF9pbmZvLT5zbGF2ZS0+ZGV2LT5kZXZfYWRkciwKKwkJCQkgY2xpZW50X2luZm8tPm1hY19kc3QpOworCQlpZiAoIXNrYikgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkgICAgICAgIjogRXJyb3I6IGZhaWxlZCB0byBjcmVhdGUgYW4gQVJQIHBhY2tldFxuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXNrYi0+ZGV2ID0gY2xpZW50X2luZm8tPnNsYXZlLT5kZXY7CisKKwkJaWYgKGNsaWVudF9pbmZvLT50YWcpIHsKKwkJCXNrYiA9IHZsYW5fcHV0X3RhZyhza2IsIGNsaWVudF9pbmZvLT52bGFuX2lkKTsKKwkJCWlmICghc2tiKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkJICAgICAgICI6IEVycm9yOiBmYWlsZWQgdG8gaW5zZXJ0IFZMQU4gdGFnXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCWFycF94bWl0KHNrYik7CisJfQorfQorCisvKiBzZW5kcyBBUlAgUkVQTElFUyB0aGF0IHVwZGF0ZSB0aGUgY2xpZW50cyB0aGF0IG5lZWQgdXBkYXRpbmcgKi8KK3N0YXRpYyB2b2lkIHJsYl91cGRhdGVfcnhfY2xpZW50cyhzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzdHJ1Y3QgYWxiX2JvbmRfaW5mbyAqYm9uZF9pbmZvID0gJihCT05EX0FMQl9JTkZPKGJvbmQpKTsKKwlzdHJ1Y3QgcmxiX2NsaWVudF9pbmZvICpjbGllbnRfaW5mbzsKKwl1MzIgaGFzaF9pbmRleDsKKworCV9sb2NrX3J4X2hhc2h0YmwoYm9uZCk7CisKKwloYXNoX2luZGV4ID0gYm9uZF9pbmZvLT5yeF9oYXNodGJsX2hlYWQ7CisJZm9yICg7IGhhc2hfaW5kZXggIT0gUkxCX05VTExfSU5ERVg7IGhhc2hfaW5kZXggPSBjbGllbnRfaW5mby0+bmV4dCkgeworCQljbGllbnRfaW5mbyA9ICYoYm9uZF9pbmZvLT5yeF9oYXNodGJsW2hhc2hfaW5kZXhdKTsKKwkJaWYgKGNsaWVudF9pbmZvLT5udHQpIHsKKwkJCXJsYl91cGRhdGVfY2xpZW50KGNsaWVudF9pbmZvKTsKKwkJCWlmIChib25kX2luZm8tPnJsYl91cGRhdGVfcmV0cnlfY291bnRlciA9PSAwKSB7CisJCQkJY2xpZW50X2luZm8tPm50dCA9IDA7CisJCQl9CisJCX0KKwl9CisKKwkvKiBkbyBub3QgdXBkYXRlIHRoZSBlbnRyaWVzIGFnYWluIHVudGlsbCB0aGlzIGNvdW50ZXIgaXMgemVybyBzbyB0aGF0CisJICogbm90IHRvIGNvbmZ1c2UgdGhlIGNsaWVudHMuCisJICovCisJYm9uZF9pbmZvLT5ybGJfdXBkYXRlX2RlbGF5X2NvdW50ZXIgPSBSTEJfVVBEQVRFX0RFTEFZOworCisJX3VubG9ja19yeF9oYXNodGJsKGJvbmQpOworfQorCisvKiBUaGUgc2xhdmUgd2FzIGFzc2lnbmVkIGEgbmV3IG1hYyBhZGRyZXNzIC0gdXBkYXRlIHRoZSBjbGllbnRzICovCitzdGF0aWMgdm9pZCBybGJfcmVxX3VwZGF0ZV9zbGF2ZV9jbGllbnRzKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCXN0cnVjdCBhbGJfYm9uZF9pbmZvICpib25kX2luZm8gPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkpOworCXN0cnVjdCBybGJfY2xpZW50X2luZm8gKmNsaWVudF9pbmZvOworCWludCBudHQgPSAwOworCXUzMiBoYXNoX2luZGV4OworCisJX2xvY2tfcnhfaGFzaHRibChib25kKTsKKworCWhhc2hfaW5kZXggPSBib25kX2luZm8tPnJ4X2hhc2h0YmxfaGVhZDsKKwlmb3IgKDsgaGFzaF9pbmRleCAhPSBSTEJfTlVMTF9JTkRFWDsgaGFzaF9pbmRleCA9IGNsaWVudF9pbmZvLT5uZXh0KSB7CisJCWNsaWVudF9pbmZvID0gJihib25kX2luZm8tPnJ4X2hhc2h0YmxbaGFzaF9pbmRleF0pOworCisJCWlmICgoY2xpZW50X2luZm8tPnNsYXZlID09IHNsYXZlKSAmJgorCQkgICAgbWVtY21wKGNsaWVudF9pbmZvLT5tYWNfZHN0LCBtYWNfYmNhc3QsIEVUSF9BTEVOKSkgeworCQkJY2xpZW50X2luZm8tPm50dCA9IDE7CisJCQludHQgPSAxOworCQl9CisJfQorCisJLy8gdXBkYXRlIHRoZSB0ZWFtJ3MgZmxhZyBvbmx5IGFmdGVyIHRoZSB3aG9sZSBpdGVyYXRpb24KKwlpZiAobnR0KSB7CisJCWJvbmRfaW5mby0+cnhfbnR0ID0gMTsKKwkJLy9mYXN0ZW4gdGhlIGNoYW5nZQorCQlib25kX2luZm8tPnJsYl91cGRhdGVfcmV0cnlfY291bnRlciA9IFJMQl9VUERBVEVfUkVUUlk7CisJfQorCisJX3VubG9ja19yeF9oYXNodGJsKGJvbmQpOworfQorCisvKiBtYXJrIGFsbCBjbGllbnRzIHVzaW5nIHNyY19pcCB0byBiZSB1cGRhdGVkICovCitzdGF0aWMgdm9pZCBybGJfcmVxX3VwZGF0ZV9zdWJuZXRfY2xpZW50cyhzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgdTMyIHNyY19pcCkKK3sKKwlzdHJ1Y3QgYWxiX2JvbmRfaW5mbyAqYm9uZF9pbmZvID0gJihCT05EX0FMQl9JTkZPKGJvbmQpKTsKKwlzdHJ1Y3QgcmxiX2NsaWVudF9pbmZvICpjbGllbnRfaW5mbzsKKwl1MzIgaGFzaF9pbmRleDsKKworCV9sb2NrX3J4X2hhc2h0YmwoYm9uZCk7CisKKwloYXNoX2luZGV4ID0gYm9uZF9pbmZvLT5yeF9oYXNodGJsX2hlYWQ7CisJZm9yICg7IGhhc2hfaW5kZXggIT0gUkxCX05VTExfSU5ERVg7IGhhc2hfaW5kZXggPSBjbGllbnRfaW5mby0+bmV4dCkgeworCQljbGllbnRfaW5mbyA9ICYoYm9uZF9pbmZvLT5yeF9oYXNodGJsW2hhc2hfaW5kZXhdKTsKKworCQlpZiAoIWNsaWVudF9pbmZvLT5zbGF2ZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkgICAgICAgIjogRXJyb3I6IGZvdW5kIGEgY2xpZW50IHdpdGggbm8gY2hhbm5lbCBpbiAiCisJCQkgICAgICAgInRoZSBjbGllbnQncyBoYXNoIHRhYmxlXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qdXBkYXRlIGFsbCBjbGllbnRzIHVzaW5nIHRoaXMgc3JjX2lwLCB0aGF0IGFyZSBub3QgYXNzaWduZWQKKwkJICogdG8gdGhlIHRlYW0ncyBhZGRyZXNzIChjdXJyX2FjdGl2ZV9zbGF2ZSkgYW5kIGhhdmUgYSBrbm93bgorCQkgKiB1bmljYXN0IG1hYyBhZGRyZXNzLgorCQkgKi8KKwkJaWYgKChjbGllbnRfaW5mby0+aXBfc3JjID09IHNyY19pcCkgJiYKKwkJICAgIG1lbWNtcChjbGllbnRfaW5mby0+c2xhdmUtPmRldi0+ZGV2X2FkZHIsCisJCQkgICBib25kLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgJiYKKwkJICAgIG1lbWNtcChjbGllbnRfaW5mby0+bWFjX2RzdCwgbWFjX2JjYXN0LCBFVEhfQUxFTikpIHsKKwkJCWNsaWVudF9pbmZvLT5udHQgPSAxOworCQkJYm9uZF9pbmZvLT5yeF9udHQgPSAxOworCQl9CisJfQorCisJX3VubG9ja19yeF9oYXNodGJsKGJvbmQpOworfQorCisvKiBDYWxsZXIgbXVzdCBob2xkIGJvdGggYm9uZCBhbmQgcHRyIGxvY2tzIGZvciByZWFkICovCitzdGF0aWMgc3RydWN0IHNsYXZlICpybGJfY2hvb3NlX2NoYW5uZWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IGFsYl9ib25kX2luZm8gKmJvbmRfaW5mbyA9ICYoQk9ORF9BTEJfSU5GTyhib25kKSk7CisJc3RydWN0IGFycF9wa3QgKmFycCA9IChzdHJ1Y3QgYXJwX3BrdCAqKXNrYi0+bmgucmF3OworCXN0cnVjdCBzbGF2ZSAqYXNzaWduZWRfc2xhdmU7CisJc3RydWN0IHJsYl9jbGllbnRfaW5mbyAqY2xpZW50X2luZm87CisJdTMyIGhhc2hfaW5kZXggPSAwOworCisJX2xvY2tfcnhfaGFzaHRibChib25kKTsKKworCWhhc2hfaW5kZXggPSBfc2ltcGxlX2hhc2goKHU4ICopJmFycC0+aXBfZHN0LCBzaXplb2YoYXJwLT5pcF9zcmMpKTsKKwljbGllbnRfaW5mbyA9ICYoYm9uZF9pbmZvLT5yeF9oYXNodGJsW2hhc2hfaW5kZXhdKTsKKworCWlmIChjbGllbnRfaW5mby0+YXNzaWduZWQpIHsKKwkJaWYgKChjbGllbnRfaW5mby0+aXBfc3JjID09IGFycC0+aXBfc3JjKSAmJgorCQkgICAgKGNsaWVudF9pbmZvLT5pcF9kc3QgPT0gYXJwLT5pcF9kc3QpKSB7CisJCQkvKiB0aGUgZW50cnkgaXMgYWxyZWFkeSBhc3NpZ25lZCB0byB0aGlzIGNsaWVudCAqLworCQkJaWYgKG1lbWNtcChhcnAtPm1hY19kc3QsIG1hY19iY2FzdCwgRVRIX0FMRU4pKSB7CisJCQkJLyogdXBkYXRlIG1hYyBhZGRyZXNzIGZyb20gYXJwICovCisJCQkJbWVtY3B5KGNsaWVudF9pbmZvLT5tYWNfZHN0LCBhcnAtPm1hY19kc3QsIEVUSF9BTEVOKTsKKwkJCX0KKworCQkJYXNzaWduZWRfc2xhdmUgPSBjbGllbnRfaW5mby0+c2xhdmU7CisJCQlpZiAoYXNzaWduZWRfc2xhdmUpIHsKKwkJCQlfdW5sb2NrX3J4X2hhc2h0YmwoYm9uZCk7CisJCQkJcmV0dXJuIGFzc2lnbmVkX3NsYXZlOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogdGhlIGVudHJ5IGlzIGFscmVhZHkgYXNzaWduZWQgdG8gc29tZSBvdGhlciBjbGllbnQsCisJCQkgKiBtb3ZlIHRoZSBvbGQgY2xpZW50IHRvIHByaW1hcnkgKGN1cnJfYWN0aXZlX3NsYXZlKSBzbworCQkJICogdGhhdCB0aGUgbmV3IGNsaWVudCBjYW4gYmUgYXNzaWduZWQgdG8gdGhpcyBlbnRyeS4KKwkJCSAqLworCQkJaWYgKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlICYmCisJCQkgICAgY2xpZW50X2luZm8tPnNsYXZlICE9IGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSB7CisJCQkJY2xpZW50X2luZm8tPnNsYXZlID0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmU7CisJCQkJcmxiX3VwZGF0ZV9jbGllbnQoY2xpZW50X2luZm8pOworCQkJfQorCQl9CisJfQorCS8qIGFzc2lnbiBhIG5ldyBzbGF2ZSAqLworCWFzc2lnbmVkX3NsYXZlID0gcmxiX25leHRfcnhfc2xhdmUoYm9uZCk7CisKKwlpZiAoYXNzaWduZWRfc2xhdmUpIHsKKwkJY2xpZW50X2luZm8tPmlwX3NyYyA9IGFycC0+aXBfc3JjOworCQljbGllbnRfaW5mby0+aXBfZHN0ID0gYXJwLT5pcF9kc3Q7CisJCS8qIGFycC0+bWFjX2RzdCBpcyBicm9hZGNhc3QgZm9yIGFycCByZXFldXN0cy4KKwkJICogd2lsbCBiZSB1cGRhdGVkIHdpdGggY2xpZW50cyBhY3R1YWwgdW5pY2FzdCBtYWMgYWRkcmVzcworCQkgKiB1cG9uIHJlY2VpdmluZyBhbiBhcnAgcmVwbHkuCisJCSAqLworCQltZW1jcHkoY2xpZW50X2luZm8tPm1hY19kc3QsIGFycC0+bWFjX2RzdCwgRVRIX0FMRU4pOworCQljbGllbnRfaW5mby0+c2xhdmUgPSBhc3NpZ25lZF9zbGF2ZTsKKworCQlpZiAobWVtY21wKGNsaWVudF9pbmZvLT5tYWNfZHN0LCBtYWNfYmNhc3QsIEVUSF9BTEVOKSkgeworCQkJY2xpZW50X2luZm8tPm50dCA9IDE7CisJCQlib25kLT5hbGJfaW5mby5yeF9udHQgPSAxOworCQl9IGVsc2UgeworCQkJY2xpZW50X2luZm8tPm50dCA9IDA7CisJCX0KKworCQlpZiAoIWxpc3RfZW1wdHkoJmJvbmQtPnZsYW5fbGlzdCkpIHsKKwkJCXVuc2lnbmVkIHNob3J0IHZsYW5faWQ7CisJCQlpbnQgcmVzID0gdmxhbl9nZXRfdGFnKHNrYiwgJnZsYW5faWQpOworCQkJaWYgKCFyZXMpIHsKKwkJCQljbGllbnRfaW5mby0+dGFnID0gMTsKKwkJCQljbGllbnRfaW5mby0+dmxhbl9pZCA9IHZsYW5faWQ7CisJCQl9CisJCX0KKworCQlpZiAoIWNsaWVudF9pbmZvLT5hc3NpZ25lZCkgeworCQkJdTMyIHByZXZfdGJsX2hlYWQgPSBib25kX2luZm8tPnJ4X2hhc2h0YmxfaGVhZDsKKwkJCWJvbmRfaW5mby0+cnhfaGFzaHRibF9oZWFkID0gaGFzaF9pbmRleDsKKwkJCWNsaWVudF9pbmZvLT5uZXh0ID0gcHJldl90YmxfaGVhZDsKKwkJCWlmIChwcmV2X3RibF9oZWFkICE9IFJMQl9OVUxMX0lOREVYKSB7CisJCQkJYm9uZF9pbmZvLT5yeF9oYXNodGJsW3ByZXZfdGJsX2hlYWRdLnByZXYgPQorCQkJCQloYXNoX2luZGV4OworCQkJfQorCQkJY2xpZW50X2luZm8tPmFzc2lnbmVkID0gMTsKKwkJfQorCX0KKworCV91bmxvY2tfcnhfaGFzaHRibChib25kKTsKKworCXJldHVybiBhc3NpZ25lZF9zbGF2ZTsKK30KKworLyogY2hvb3NlcyAoYW5kIHJldHVybnMpIHRyYW5zbWl0IGNoYW5uZWwgZm9yIGFycCByZXBseQorICogZG9lcyBub3QgY2hvb3NlIGNoYW5uZWwgZm9yIG90aGVyIGFycCB0eXBlcyBzaW5jZSB0aGV5IGFyZQorICogc2VudCBvbiB0aGUgY3Vycl9hY3RpdmVfc2xhdmUKKyAqLworc3RhdGljIHN0cnVjdCBzbGF2ZSAqcmxiX2FycF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBhcnBfcGt0ICphcnAgPSAoc3RydWN0IGFycF9wa3QgKilza2ItPm5oLnJhdzsKKwlzdHJ1Y3Qgc2xhdmUgKnR4X3NsYXZlID0gTlVMTDsKKworCWlmIChhcnAtPm9wX2NvZGUgPT0gX19jb25zdGFudF9odG9ucyhBUlBPUF9SRVBMWSkpIHsKKwkJLyogdGhlIGFycCBtdXN0IGJlIHNlbnQgb24gdGhlIHNlbGVjdGVkCisJCSogcnggY2hhbm5lbAorCQkqLworCQl0eF9zbGF2ZSA9IHJsYl9jaG9vc2VfY2hhbm5lbChza2IsIGJvbmQpOworCQlpZiAodHhfc2xhdmUpIHsKKwkJCW1lbWNweShhcnAtPm1hY19zcmMsdHhfc2xhdmUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwkJfQorCQlkcHJpbnRrKCJTZXJ2ZXIgc2VudCBBUlAgUmVwbHkgcGFja2V0XG4iKTsKKwl9IGVsc2UgaWYgKGFycC0+b3BfY29kZSA9PSBfX2NvbnN0YW50X2h0b25zKEFSUE9QX1JFUVVFU1QpKSB7CisJCS8qIENyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgcnhfaGFzaHRibCBmb3IgdGhpcyBjbGllbnQgYXMgYQorCQkgKiBwbGFjZSBob2xkZXIuCisJCSAqIFdoZW4gdGhlIGFycCByZXBseSBpcyByZWNlaXZlZCB0aGUgZW50cnkgd2lsbCBiZSB1cGRhdGVkCisJCSAqIHdpdGggdGhlIGNvcnJlY3QgdW5pY2FzdCBhZGRyZXNzIG9mIHRoZSBjbGllbnQuCisJCSAqLworCQlybGJfY2hvb3NlX2NoYW5uZWwoc2tiLCBib25kKTsKKworCQkvKiBUaGUgQVJQIHJlbHB5IHBhY2tldHMgbXVzdCBiZSBkZWxheWVkIHNvIHRoYXQKKwkJICogdGhleSBjYW4gY2FuY2VsIG91dCB0aGUgaW5mbHVlbmNlIG9mIHRoZSBBUlAgcmVxdWVzdC4KKwkJICovCisJCWJvbmQtPmFsYl9pbmZvLnJsYl91cGRhdGVfZGVsYXlfY291bnRlciA9IFJMQl9VUERBVEVfREVMQVk7CisKKwkJLyogYXJwIHJlcXVlc3RzIGFyZSBicm9hZGNhc3QgYW5kIGFyZSBzZW50IG9uIHRoZSBwcmltYXJ5CisJCSAqIHRoZSBhcnAgcmVxdWVzdCB3aWxsIGNvbGxhcHNlIGFsbCBjbGllbnRzIG9uIHRoZSBzdWJuZXQgdG8KKwkJICogdGhlIHByaW1hcnkgc2xhdmUuIFdlIG11c3QgcmVnaXN0ZXIgdGhlc2UgY2xpZW50cyB0byBiZQorCQkgKiB1cGRhdGVkIHdpdGggdGhlaXIgYXNzaWduZWQgbWFjLgorCQkgKi8KKwkJcmxiX3JlcV91cGRhdGVfc3VibmV0X2NsaWVudHMoYm9uZCwgYXJwLT5pcF9zcmMpOworCQlkcHJpbnRrKCJTZXJ2ZXIgc2VudCBBUlAgUmVxdWVzdCBwYWNrZXRcbiIpOworCX0KKworCXJldHVybiB0eF9zbGF2ZTsKK30KKworLyogQ2FsbGVyIG11c3QgaG9sZCBib25kIGxvY2sgZm9yIHJlYWQgKi8KK3N0YXRpYyB2b2lkIHJsYl9yZWJhbGFuY2Uoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IGFsYl9ib25kX2luZm8gKmJvbmRfaW5mbyA9ICYoQk9ORF9BTEJfSU5GTyhib25kKSk7CisJc3RydWN0IHNsYXZlICphc3NpZ25lZF9zbGF2ZTsKKwlzdHJ1Y3QgcmxiX2NsaWVudF9pbmZvICpjbGllbnRfaW5mbzsKKwlpbnQgbnR0OworCXUzMiBoYXNoX2luZGV4OworCisJX2xvY2tfcnhfaGFzaHRibChib25kKTsKKworCW50dCA9IDA7CisJaGFzaF9pbmRleCA9IGJvbmRfaW5mby0+cnhfaGFzaHRibF9oZWFkOworCWZvciAoOyBoYXNoX2luZGV4ICE9IFJMQl9OVUxMX0lOREVYOyBoYXNoX2luZGV4ID0gY2xpZW50X2luZm8tPm5leHQpIHsKKwkJY2xpZW50X2luZm8gPSAmKGJvbmRfaW5mby0+cnhfaGFzaHRibFtoYXNoX2luZGV4XSk7CisJCWFzc2lnbmVkX3NsYXZlID0gcmxiX25leHRfcnhfc2xhdmUoYm9uZCk7CisJCWlmIChhc3NpZ25lZF9zbGF2ZSAmJiAoY2xpZW50X2luZm8tPnNsYXZlICE9IGFzc2lnbmVkX3NsYXZlKSkgeworCQkJY2xpZW50X2luZm8tPnNsYXZlID0gYXNzaWduZWRfc2xhdmU7CisJCQljbGllbnRfaW5mby0+bnR0ID0gMTsKKwkJCW50dCA9IDE7CisJCX0KKwl9CisKKwkvKiB1cGRhdGUgdGhlIHRlYW0ncyBmbGFnIG9ubHkgYWZ0ZXIgdGhlIHdob2xlIGl0ZXJhdGlvbiAqLworCWlmIChudHQpIHsKKwkJYm9uZF9pbmZvLT5yeF9udHQgPSAxOworCX0KKwlfdW5sb2NrX3J4X2hhc2h0YmwoYm9uZCk7Cit9CisKKy8qIENhbGxlciBtdXN0IGhvbGQgcnhfaGFzaHRibCBsb2NrICovCitzdGF0aWMgdm9pZCBybGJfaW5pdF90YWJsZV9lbnRyeShzdHJ1Y3QgcmxiX2NsaWVudF9pbmZvICplbnRyeSkKK3sKKwltZW1zZXQoZW50cnksIDAsIHNpemVvZihzdHJ1Y3QgcmxiX2NsaWVudF9pbmZvKSk7CisJZW50cnktPm5leHQgPSBSTEJfTlVMTF9JTkRFWDsKKwllbnRyeS0+cHJldiA9IFJMQl9OVUxMX0lOREVYOworfQorCitzdGF0aWMgaW50IHJsYl9pbml0aWFsaXplKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBhbGJfYm9uZF9pbmZvICpib25kX2luZm8gPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkpOworCXN0cnVjdCBwYWNrZXRfdHlwZSAqcGtfdHlwZSA9ICYoQk9ORF9BTEJfSU5GTyhib25kKS5ybGJfcGt0X3R5cGUpOworCWludCBzaXplID0gUkxCX0hBU0hfVEFCTEVfU0laRSAqIHNpemVvZihzdHJ1Y3QgcmxiX2NsaWVudF9pbmZvKTsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pbml0KCYoYm9uZF9pbmZvLT5yeF9oYXNodGJsX2xvY2spKTsKKworCV9sb2NrX3J4X2hhc2h0YmwoYm9uZCk7CisKKwlib25kX2luZm8tPnJ4X2hhc2h0YmwgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghYm9uZF9pbmZvLT5yeF9oYXNodGJsKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkgICAgICAgIjogRXJyb3I6ICVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgUkxCIGhhc2ggdGFibGVcbiIsCisJCSAgICAgICBib25kLT5kZXYtPm5hbWUpOworCQlfdW5sb2NrX3J4X2hhc2h0YmwoYm9uZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlib25kX2luZm8tPnJ4X2hhc2h0YmxfaGVhZCA9IFJMQl9OVUxMX0lOREVYOworCisJZm9yIChpID0gMDsgaSA8IFJMQl9IQVNIX1RBQkxFX1NJWkU7IGkrKykgeworCQlybGJfaW5pdF90YWJsZV9lbnRyeShib25kX2luZm8tPnJ4X2hhc2h0YmwgKyBpKTsKKwl9CisKKwlfdW5sb2NrX3J4X2hhc2h0YmwoYm9uZCk7CisKKwkvKmluaXRpYWxpemUgcGFja2V0IHR5cGUqLworCXBrX3R5cGUtPnR5cGUgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FSUCk7CisJcGtfdHlwZS0+ZGV2ID0gYm9uZC0+ZGV2OworCXBrX3R5cGUtPmZ1bmMgPSBybGJfYXJwX3JlY3Y7CisKKwkvKiByZWdpc3RlciB0byByZWNlaXZlIEFSUHMgKi8KKwlkZXZfYWRkX3BhY2socGtfdHlwZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmxiX2RlaW5pdGlhbGl6ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzdHJ1Y3QgYWxiX2JvbmRfaW5mbyAqYm9uZF9pbmZvID0gJihCT05EX0FMQl9JTkZPKGJvbmQpKTsKKworCWRldl9yZW1vdmVfcGFjaygmKGJvbmRfaW5mby0+cmxiX3BrdF90eXBlKSk7CisKKwlfbG9ja19yeF9oYXNodGJsKGJvbmQpOworCisJa2ZyZWUoYm9uZF9pbmZvLT5yeF9oYXNodGJsKTsKKwlib25kX2luZm8tPnJ4X2hhc2h0YmwgPSBOVUxMOworCWJvbmRfaW5mby0+cnhfaGFzaHRibF9oZWFkID0gUkxCX05VTExfSU5ERVg7CisKKwlfdW5sb2NrX3J4X2hhc2h0YmwoYm9uZCk7Cit9CisKK3N0YXRpYyB2b2lkIHJsYl9jbGVhcl92bGFuKHN0cnVjdCBib25kaW5nICpib25kLCB1bnNpZ25lZCBzaG9ydCB2bGFuX2lkKQoreworCXN0cnVjdCBhbGJfYm9uZF9pbmZvICpib25kX2luZm8gPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkpOworCXUzMiBjdXJyX2luZGV4OworCisJX2xvY2tfcnhfaGFzaHRibChib25kKTsKKworCWN1cnJfaW5kZXggPSBib25kX2luZm8tPnJ4X2hhc2h0YmxfaGVhZDsKKwl3aGlsZSAoY3Vycl9pbmRleCAhPSBSTEJfTlVMTF9JTkRFWCkgeworCQlzdHJ1Y3QgcmxiX2NsaWVudF9pbmZvICpjdXJyID0gJihib25kX2luZm8tPnJ4X2hhc2h0YmxbY3Vycl9pbmRleF0pOworCQl1MzIgbmV4dF9pbmRleCA9IGJvbmRfaW5mby0+cnhfaGFzaHRibFtjdXJyX2luZGV4XS5uZXh0OworCQl1MzIgcHJldl9pbmRleCA9IGJvbmRfaW5mby0+cnhfaGFzaHRibFtjdXJyX2luZGV4XS5wcmV2OworCisJCWlmIChjdXJyLT50YWcgJiYgKGN1cnItPnZsYW5faWQgPT0gdmxhbl9pZCkpIHsKKwkJCWlmIChjdXJyX2luZGV4ID09IGJvbmRfaW5mby0+cnhfaGFzaHRibF9oZWFkKSB7CisJCQkJYm9uZF9pbmZvLT5yeF9oYXNodGJsX2hlYWQgPSBuZXh0X2luZGV4OworCQkJfQorCQkJaWYgKHByZXZfaW5kZXggIT0gUkxCX05VTExfSU5ERVgpIHsKKwkJCQlib25kX2luZm8tPnJ4X2hhc2h0YmxbcHJldl9pbmRleF0ubmV4dCA9IG5leHRfaW5kZXg7CisJCQl9CisJCQlpZiAobmV4dF9pbmRleCAhPSBSTEJfTlVMTF9JTkRFWCkgeworCQkJCWJvbmRfaW5mby0+cnhfaGFzaHRibFtuZXh0X2luZGV4XS5wcmV2ID0gcHJldl9pbmRleDsKKwkJCX0KKworCQkJcmxiX2luaXRfdGFibGVfZW50cnkoY3Vycik7CisJCX0KKworCQljdXJyX2luZGV4ID0gbmV4dF9pbmRleDsKKwl9CisKKwlfdW5sb2NrX3J4X2hhc2h0YmwoYm9uZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiB0bGIvcmxiIHNoYXJlZCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBhbGJfc2VuZF9sZWFybmluZ19wYWNrZXRzKHN0cnVjdCBzbGF2ZSAqc2xhdmUsIHU4IG1hY19hZGRyW10pCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2dldF9ib25kX2J5X3NsYXZlKHNsYXZlKTsKKwlzdHJ1Y3QgbGVhcm5pbmdfcGt0IHBrdDsKKwlpbnQgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbGVhcm5pbmdfcGt0KTsKKwlpbnQgaTsKKworCW1lbXNldCgmcGt0LCAwLCBzaXplKTsKKwltZW1jcHkocGt0Lm1hY19kc3QsIG1hY19hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KHBrdC5tYWNfc3JjLCBtYWNfYWRkciwgRVRIX0FMRU4pOworCXBrdC50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9MT09QKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTFBfQlVSU1Q7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQljaGFyICpkYXRhOworCisJCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSk7CisJCWlmICghc2tiKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlkYXRhID0gc2tiX3B1dChza2IsIHNpemUpOworCQltZW1jcHkoZGF0YSwgJnBrdCwgc2l6ZSk7CisKKwkJc2tiLT5tYWMucmF3ID0gZGF0YTsKKwkJc2tiLT5uaC5yYXcgPSBkYXRhICsgRVRIX0hMRU47CisJCXNrYi0+cHJvdG9jb2wgPSBwa3QudHlwZTsKKwkJc2tiLT5wcmlvcml0eSA9IFRDX1BSSU9fQ09OVFJPTDsKKwkJc2tiLT5kZXYgPSBzbGF2ZS0+ZGV2OworCisJCWlmICghbGlzdF9lbXB0eSgmYm9uZC0+dmxhbl9saXN0KSkgeworCQkJc3RydWN0IHZsYW5fZW50cnkgKnZsYW47CisKKwkJCXZsYW4gPSBib25kX25leHRfdmxhbihib25kLAorCQkJCQkgICAgICBib25kLT5hbGJfaW5mby5jdXJyZW50X2FsYl92bGFuKTsKKworCQkJYm9uZC0+YWxiX2luZm8uY3VycmVudF9hbGJfdmxhbiA9IHZsYW47CisJCQlpZiAoIXZsYW4pIHsKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc2tiID0gdmxhbl9wdXRfdGFnKHNrYiwgdmxhbi0+dmxhbl9pZCk7CisJCQlpZiAoIXNrYikgeworCQkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJCSAgICAgICAiOiBFcnJvcjogZmFpbGVkIHRvIGluc2VydCBWTEFOIHRhZ1xuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlkZXZfcXVldWVfeG1pdChza2IpOworCX0KK30KKworLyogaHcgaXMgYSBib29sZWFuIHBhcmFtZXRlciB0aGF0IGRldGVybWluZXMgd2hldGhlciB3ZSBzaG91bGQgdHJ5IGFuZAorICogc2V0IHRoZSBodyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgd2VsbCBhcyB0aGUgaHcgYWRkcmVzcyBvZiB0aGUKKyAqIG5ldF9kZXZpY2UKKyAqLworc3RhdGljIGludCBhbGJfc2V0X3NsYXZlX21hY19hZGRyKHN0cnVjdCBzbGF2ZSAqc2xhdmUsIHU4IGFkZHJbXSwgaW50IGh3KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzbGF2ZS0+ZGV2OworCXN0cnVjdCBzb2NrYWRkciBzX2FkZHI7CisKKwlpZiAoIWh3KSB7CisJCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLCBkZXYtPmFkZHJfbGVuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZm9yIHJsYiBlYWNoIHNsYXZlIG11c3QgaGF2ZSBhIHVuaXF1ZSBodyBtYWMgYWRkcmVzc2VzIHNvIHRoYXQgKi8KKwkvKiBlYWNoIHNsYXZlIHdpbGwgcmVjZWl2ZSBwYWNrZXRzIGRlc3RpbmVkIHRvIGEgZGlmZmVyZW50IG1hYyAqLworCW1lbWNweShzX2FkZHIuc2FfZGF0YSwgYWRkciwgZGV2LT5hZGRyX2xlbik7CisJc19hZGRyLnNhX2ZhbWlseSA9IGRldi0+dHlwZTsKKwlpZiAoZGV2X3NldF9tYWNfYWRkcmVzcyhkZXYsICZzX2FkZHIpKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkgICAgICAgIjogRXJyb3I6IGRldl9zZXRfbWFjX2FkZHJlc3Mgb2YgZGV2ICVzIGZhaWxlZCEgQUxCICIKKwkJICAgICAgICJtb2RlIHJlcXVpcmVzIHRoYXQgdGhlIGJhc2UgZHJpdmVyIHN1cHBvcnQgc2V0dGluZyAiCisJCSAgICAgICAidGhlIGh3IGFkZHJlc3MgYWxzbyB3aGVuIHRoZSBuZXR3b3JrIGRldmljZSdzICIKKwkJICAgICAgICJpbnRlcmZhY2UgaXMgb3BlblxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlciBtdXN0IGhvbGQgYm9uZCBsb2NrIGZvciB3cml0ZSBvciBjdXJyX3NsYXZlX2xvY2sgZm9yIHdyaXRlKi8KK3N0YXRpYyB2b2lkIGFsYl9zd2FwX21hY19hZGRyKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlMSwgc3RydWN0IHNsYXZlICpzbGF2ZTIpCit7CisJc3RydWN0IHNsYXZlICpkaXNhYmxlZF9zbGF2ZSA9IE5VTEw7CisJdTggdG1wX21hY19hZGRyW0VUSF9BTEVOXTsKKwlpbnQgc2xhdmVzX3N0YXRlX2RpZmZlcjsKKworCXNsYXZlc19zdGF0ZV9kaWZmZXIgPSAoU0xBVkVfSVNfT0soc2xhdmUxKSAhPSBTTEFWRV9JU19PSyhzbGF2ZTIpKTsKKworCW1lbWNweSh0bXBfbWFjX2FkZHIsIHNsYXZlMS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCWFsYl9zZXRfc2xhdmVfbWFjX2FkZHIoc2xhdmUxLCBzbGF2ZTItPmRldi0+ZGV2X2FkZHIsIGJvbmQtPmFsYl9pbmZvLnJsYl9lbmFibGVkKTsKKwlhbGJfc2V0X3NsYXZlX21hY19hZGRyKHNsYXZlMiwgdG1wX21hY19hZGRyLCBib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCk7CisKKwkvKiBmYXN0ZW4gdGhlIGNoYW5nZSBpbiB0aGUgc3dpdGNoICovCisJaWYgKFNMQVZFX0lTX09LKHNsYXZlMSkpIHsKKwkJYWxiX3NlbmRfbGVhcm5pbmdfcGFja2V0cyhzbGF2ZTEsIHNsYXZlMS0+ZGV2LT5kZXZfYWRkcik7CisJCWlmIChib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCkgeworCQkJLyogaW5mb3JtIHRoZSBjbGllbnRzIHRoYXQgdGhlIG1hYyBhZGRyZXNzCisJCQkgKiBoYXMgY2hhbmdlZAorCQkJICovCisJCQlybGJfcmVxX3VwZGF0ZV9zbGF2ZV9jbGllbnRzKGJvbmQsIHNsYXZlMSk7CisJCX0KKwl9IGVsc2UgeworCQlkaXNhYmxlZF9zbGF2ZSA9IHNsYXZlMTsKKwl9CisKKwlpZiAoU0xBVkVfSVNfT0soc2xhdmUyKSkgeworCQlhbGJfc2VuZF9sZWFybmluZ19wYWNrZXRzKHNsYXZlMiwgc2xhdmUyLT5kZXYtPmRldl9hZGRyKTsKKwkJaWYgKGJvbmQtPmFsYl9pbmZvLnJsYl9lbmFibGVkKSB7CisJCQkvKiBpbmZvcm0gdGhlIGNsaWVudHMgdGhhdCB0aGUgbWFjIGFkZHJlc3MKKwkJCSAqIGhhcyBjaGFuZ2VkCisJCQkgKi8KKwkJCXJsYl9yZXFfdXBkYXRlX3NsYXZlX2NsaWVudHMoYm9uZCwgc2xhdmUyKTsKKwkJfQorCX0gZWxzZSB7CisJCWRpc2FibGVkX3NsYXZlID0gc2xhdmUyOworCX0KKworCWlmIChib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCAmJiBzbGF2ZXNfc3RhdGVfZGlmZmVyKSB7CisJCS8qIEEgZGlzYWJsZWQgc2xhdmUgd2FzIGFzc2lnbmVkIGFuIGFjdGl2ZSBtYWMgYWRkciAqLworCQlybGJfdGVhY2hfZGlzYWJsZWRfbWFjX29uX3ByaW1hcnkoYm9uZCwKKwkJCQkJCSAgZGlzYWJsZWRfc2xhdmUtPmRldi0+ZGV2X2FkZHIpOworCX0KK30KKworLyoqCisgKiBhbGJfY2hhbmdlX2h3X2FkZHJfb25fZGV0YWNoCisgKiBAYm9uZDogYm9uZGluZyB3ZSdyZSB3b3JraW5nIG9uCisgKiBAc2xhdmU6IHRoZSBzbGF2ZSB0aGF0IHdhcyBqdXN0IGRldGFjaGVkCisgKgorICogV2UgYXNzdW1lIHRoYXQgQHNsYXZlIHdhcyBhbHJlYWR5IGRldGFjaGVkIGZyb20gdGhlIHNsYXZlIGxpc3QuCisgKgorICogSWYgQHNsYXZlJ3MgcGVybWFuZW50IGh3IGFkZHJlc3MgaXMgZGlmZmVyZW50IGJvdGggZnJvbSBpdHMgY3VycmVudAorICogYWRkcmVzcyBhbmQgZnJvbSBAYm9uZCdzIGFkZHJlc3MsIHRoZW4gc29tZXdoZXJlIGluIHRoZSBib25kIHRoZXJlJ3MKKyAqIGEgc2xhdmUgdGhhdCBoYXMgQHNsYXZlJ3MgcGVybWFuZXQgYWRkcmVzcyBhcyBpdHMgY3VycmVudCBhZGRyZXNzLgorICogV2UnbGwgbWFrZSBzdXJlIHRoYXQgdGhhdCBzbGF2ZSBubyBsb25nZXIgdXNlcyBAc2xhdmUncyBwZXJtYW5lbnQgYWRkcmVzcy4KKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQgbG9jaworICovCitzdGF0aWMgdm9pZCBhbGJfY2hhbmdlX2h3X2FkZHJfb25fZGV0YWNoKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCWludCBwZXJtX2N1cnJfZGlmZjsKKwlpbnQgcGVybV9ib25kX2RpZmY7CisKKwlwZXJtX2N1cnJfZGlmZiA9IG1lbWNtcChzbGF2ZS0+cGVybV9od2FkZHIsCisJCQkJc2xhdmUtPmRldi0+ZGV2X2FkZHIsCisJCQkJRVRIX0FMRU4pOworCXBlcm1fYm9uZF9kaWZmID0gbWVtY21wKHNsYXZlLT5wZXJtX2h3YWRkciwKKwkJCQlib25kLT5kZXYtPmRldl9hZGRyLAorCQkJCUVUSF9BTEVOKTsKKworCWlmIChwZXJtX2N1cnJfZGlmZiAmJiBwZXJtX2JvbmRfZGlmZikgeworCQlzdHJ1Y3Qgc2xhdmUgKnRtcF9zbGF2ZTsKKwkJaW50IGksIGZvdW5kID0gMDsKKworCQlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHRtcF9zbGF2ZSwgaSkgeworCQkJaWYgKCFtZW1jbXAoc2xhdmUtPnBlcm1faHdhZGRyLAorCQkJCSAgICB0bXBfc2xhdmUtPmRldi0+ZGV2X2FkZHIsCisJCQkJICAgIEVUSF9BTEVOKSkgeworCQkJCWZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChmb3VuZCkgeworCQkJYWxiX3N3YXBfbWFjX2FkZHIoYm9uZCwgc2xhdmUsIHRtcF9zbGF2ZSk7CisJCX0KKwl9Cit9CisKKy8qKgorICogYWxiX2hhbmRsZV9hZGRyX2NvbGxpc2lvbl9vbl9hdHRhY2gKKyAqIEBib25kOiBib25kaW5nIHdlJ3JlIHdvcmtpbmcgb24KKyAqIEBzbGF2ZTogdGhlIHNsYXZlIHRoYXQgd2FzIGp1c3QgYXR0YWNoZWQKKyAqCisgKiBjaGVja3MgdW5pcXVlbmVzcyBvZiBzbGF2ZSdzIG1hYyBhZGRyZXNzIGFuZCBoYW5kbGVzIHRoZSBjYXNlIHRoZQorICogbmV3IHNsYXZlIHVzZXMgdGhlIGJvbmRzIG1hYyBhZGRyZXNzLgorICoKKyAqIElmIHRoZSBwZXJtYW5lbnQgaHcgYWRkcmVzcyBvZiBAc2xhdmUgaXMgQGJvbmQncyBodyBhZGRyZXNzLCB3ZSBuZWVkIHRvCisgKiBmaW5kIGEgZGlmZmVyZW50IGh3IGFkZHJlc3MgdG8gZ2l2ZSBAc2xhdmUsIHRoYXQgaXNuJ3QgaW4gdXNlIGJ5IGFueSBvdGhlcgorICogc2xhdmUgaW4gdGhlIGJvbmQuIFRoaXMgYWRkcmVzcyBtdXN0IGJlLCBvZiBjb3Vyc2UsIG9uZSBvZiB0aGUgcHJlbWFuZW50CisgKiBhZGRyZXNzZXMgb2YgdGhlIG90aGVyIHNsYXZlcy4KKyAqCisgKiBXZSBnbyBvdmVyIHRoZSBzbGF2ZSBsaXN0LCBhbmQgZm9yIGVhY2ggc2xhdmUgdGhlcmUgd2UgY29tcGFyZSBpdHMKKyAqIHBlcm1hbmVudCBodyBhZGRyZXNzIHdpdGggdGhlIGN1cnJlbnQgYWRkcmVzcyBvZiBhbGwgdGhlIG90aGVyIHNsYXZlcy4KKyAqIElmIG5vIG1hdGNoIHdhcyBmb3VuZCwgdGhlbiB3ZSd2ZSBmb3VuZCBhIHNsYXZlIHdpdGggYSBwZXJtYW5lbnQgYWRkcmVzcworICogdGhhdCBpc24ndCB1c2VkIGJ5IGFueSBvdGhlciBzbGF2ZSBpbiB0aGUgYm9uZCwgc28gd2UgY2FuIGFzc2lnbiBpdCB0bworICogQHNsYXZlLgorICoKKyAqIGFzc3VtcHRpb246IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBAc2xhdmUgaXMgYXR0YWNoZWQgdG8gdGhlCisgKiAJICAgICAgIGJvbmQgc2xhdmUgbGlzdC4KKyAqCisgKiBjYWxsZXIgbXVzdCBob2xkIHRoZSBib25kIGxvY2sgZm9yIHdyaXRlIHNpbmNlIHRoZSBtYWMgYWRkcmVzc2VzIGFyZSBjb21wYXJlZAorICogYW5kIG1heSBiZSBzd2FwcGVkLgorICovCitzdGF0aWMgaW50IGFsYl9oYW5kbGVfYWRkcl9jb2xsaXNpb25fb25fYXR0YWNoKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCXN0cnVjdCBzbGF2ZSAqdG1wX3NsYXZlMSwgKnRtcF9zbGF2ZTIsICpmcmVlX21hY19zbGF2ZTsKKwlzdHJ1Y3Qgc2xhdmUgKmhhc19ib25kX2FkZHIgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKKwlpbnQgaSwgaiwgZm91bmQgPSAwOworCisJaWYgKGJvbmQtPnNsYXZlX2NudCA9PSAwKSB7CisJCS8qIHRoaXMgaXMgdGhlIGZpcnN0IHNsYXZlICovCisJCXJldHVybiAwOworCX0KKworCS8qIGlmIHNsYXZlJ3MgbWFjIGFkZHJlc3MgZGlmZmVycyBmcm9tIGJvbmQncyBtYWMgYWRkcmVzcworCSAqIGNoZWNrIHVuaXF1ZW5lc3Mgb2Ygc2xhdmUncyBtYWMgYWRkcmVzcyBhZ2FpbnN0IHRoZSBvdGhlcgorCSAqIHNsYXZlcyBpbiB0aGUgYm9uZC4KKwkgKi8KKwlpZiAobWVtY21wKHNsYXZlLT5wZXJtX2h3YWRkciwgYm9uZC0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKSB7CisJCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgdG1wX3NsYXZlMSwgaSkgeworCQkJaWYgKCFtZW1jbXAodG1wX3NsYXZlMS0+ZGV2LT5kZXZfYWRkciwgc2xhdmUtPmRldi0+ZGV2X2FkZHIsCisJCQkJICAgIEVUSF9BTEVOKSkgeworCQkJCWZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChmb3VuZCkgeworCQkJLyogYSBzbGF2ZSB3YXMgZm91bmQgdGhhdCBpcyB1c2luZyB0aGUgbWFjIGFkZHJlc3MKKwkJCSAqIG9mIHRoZSBuZXcgc2xhdmUKKwkJCSAqLworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkgICAgICAgIjogRXJyb3I6IHRoZSBodyBhZGRyZXNzIG9mIHNsYXZlICVzIGlzIG5vdCAiCisJCQkgICAgICAgInVuaXF1ZSAtIGNhbm5vdCBlbnNsYXZlIGl0ISIsCisJCQkgICAgICAgc2xhdmUtPmRldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJldHVybiAwOworCX0KKworCS8qIFRoZSBzbGF2ZSdzIGFkZHJlc3MgaXMgZXF1YWwgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGJvbmQuCisJICogU2VhcmNoIGZvciBhIHNwYXJlIGFkZHJlc3MgaW4gdGhlIGJvbmQgZm9yIHRoaXMgc2xhdmUuCisJICovCisJZnJlZV9tYWNfc2xhdmUgPSBOVUxMOworCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCB0bXBfc2xhdmUxLCBpKSB7CisJCWZvdW5kID0gMDsKKwkJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCB0bXBfc2xhdmUyLCBqKSB7CisJCQlpZiAoIW1lbWNtcCh0bXBfc2xhdmUxLT5wZXJtX2h3YWRkciwKKwkJCQkgICAgdG1wX3NsYXZlMi0+ZGV2LT5kZXZfYWRkciwKKwkJCQkgICAgRVRIX0FMRU4pKSB7CisJCQkJZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFmb3VuZCkgeworCQkJLyogbm8gc2xhdmUgaGFzIHRtcF9zbGF2ZTEncyBwZXJtIGFkZHIKKwkJCSAqIGFzIGl0cyBjdXJyIGFkZHIKKwkJCSAqLworCQkJZnJlZV9tYWNfc2xhdmUgPSB0bXBfc2xhdmUxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIWhhc19ib25kX2FkZHIpIHsKKwkJCWlmICghbWVtY21wKHRtcF9zbGF2ZTEtPmRldi0+ZGV2X2FkZHIsCisJCQkJICAgIGJvbmQtPmRldi0+ZGV2X2FkZHIsCisJCQkJICAgIEVUSF9BTEVOKSkgeworCisJCQkJaGFzX2JvbmRfYWRkciA9IHRtcF9zbGF2ZTE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZnJlZV9tYWNfc2xhdmUpIHsKKwkJYWxiX3NldF9zbGF2ZV9tYWNfYWRkcihzbGF2ZSwgZnJlZV9tYWNfc2xhdmUtPnBlcm1faHdhZGRyLAorCQkJCSAgICAgICBib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCk7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkgICAgICAgIjogV2FybmluZzogdGhlIGh3IGFkZHJlc3Mgb2Ygc2xhdmUgJXMgaXMgaW4gdXNlIGJ5ICIKKwkJICAgICAgICJ0aGUgYm9uZDsgZ2l2aW5nIGl0IHRoZSBodyBhZGRyZXNzIG9mICVzXG4iLAorCQkgICAgICAgc2xhdmUtPmRldi0+bmFtZSwgZnJlZV9tYWNfc2xhdmUtPmRldi0+bmFtZSk7CisKKwl9IGVsc2UgaWYgKGhhc19ib25kX2FkZHIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCSAgICAgICAiOiBFcnJvcjogdGhlIGh3IGFkZHJlc3Mgb2Ygc2xhdmUgJXMgaXMgaW4gdXNlIGJ5IHRoZSAiCisJCSAgICAgICAiYm9uZDsgY291bGRuJ3QgZmluZCBhIHNsYXZlIHdpdGggYSBmcmVlIGh3IGFkZHJlc3MgdG8gIgorCQkgICAgICAgImdpdmUgaXQgKHRoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkKVxuIiwKKwkJICAgICAgIHNsYXZlLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhbGJfc2V0X21hY19hZGRyZXNzCisgKiBAYm9uZDoKKyAqIEBhZGRyOgorICoKKyAqIEluIFRMQiBtb2RlIGFsbCBzbGF2ZXMgYXJlIGNvbmZpZ3VyZWQgdG8gdGhlIGJvbmQncyBodyBhZGRyZXNzLCBidXQgc2V0CisgKiB0aGVpciBkZXZfYWRkciBmaWVsZCB0byBkaWZmZXJlbnQgYWRkcmVzc2VzIChiYXNlZCBvbiB0aGVpciBwZXJtYW5lbnQgaHcKKyAqIGFkZHJlc3NlcykuCisgKgorICogRm9yIGVhY2ggc2xhdmUsIHRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBuZXcgYWRkcmVzcyBhbmQgdGhlbgorICogY2hhbmdlcyBpdHMgZGV2X2FkZHIgZmllbGQgdG8gaXRzIHByZXZpb3VzIHZhbHVlLgorICoKKyAqIFVud2luZGluZyBhc3N1bWVzIGJvbmQncyBtYWMgYWRkcmVzcyBoYXMgbm90IHlldCBjaGFuZ2VkLgorICovCitzdGF0aWMgaW50IGFsYl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IGJvbmRpbmcgKmJvbmQsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyIHNhOworCXN0cnVjdCBzbGF2ZSAqc2xhdmUsICpzdG9wX2F0OworCWNoYXIgdG1wX2FkZHJbRVRIX0FMRU5dOworCWludCByZXM7CisJaW50IGk7CisKKwlpZiAoYm9uZC0+YWxiX2luZm8ucmxiX2VuYWJsZWQpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQlpZiAoc2xhdmUtPmRldi0+c2V0X21hY19hZGRyZXNzID09IE5VTEwpIHsKKwkJCXJlcyA9IC1FT1BOT1RTVVBQOworCQkJZ290byB1bndpbmQ7CisJCX0KKworCQkvKiBzYXZlIG5ldF9kZXZpY2UncyBjdXJyZW50IGh3IGFkZHJlc3MgKi8KKwkJbWVtY3B5KHRtcF9hZGRyLCBzbGF2ZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisJCXJlcyA9IGRldl9zZXRfbWFjX2FkZHJlc3Moc2xhdmUtPmRldiwgYWRkcik7CisKKwkJLyogcmVzdG9yZSBuZXRfZGV2aWNlJ3MgaHcgYWRkcmVzcyAqLworCQltZW1jcHkoc2xhdmUtPmRldi0+ZGV2X2FkZHIsIHRtcF9hZGRyLCBFVEhfQUxFTik7CisKKwkJaWYgKHJlcykgeworCQkJZ290byB1bndpbmQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKwordW53aW5kOgorCW1lbWNweShzYS5zYV9kYXRhLCBib25kLT5kZXYtPmRldl9hZGRyLCBib25kLT5kZXYtPmFkZHJfbGVuKTsKKwlzYS5zYV9mYW1pbHkgPSBib25kLT5kZXYtPnR5cGU7CisKKwkvKiB1bndpbmQgZnJvbSBoZWFkIHRvIHRoZSBzbGF2ZSB0aGF0IGZhaWxlZCAqLworCXN0b3BfYXQgPSBzbGF2ZTsKKwlib25kX2Zvcl9lYWNoX3NsYXZlX2Zyb21fdG8oYm9uZCwgc2xhdmUsIGksIGJvbmQtPmZpcnN0X3NsYXZlLCBzdG9wX2F0KSB7CisJCW1lbWNweSh0bXBfYWRkciwgc2xhdmUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwkJZGV2X3NldF9tYWNfYWRkcmVzcyhzbGF2ZS0+ZGV2LCAmc2EpOworCQltZW1jcHkoc2xhdmUtPmRldi0+ZGV2X2FkZHIsIHRtcF9hZGRyLCBFVEhfQUxFTik7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBleHBvcnRlZCBhbGIgZnVuY2lvbnMgKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgYm9uZF9hbGJfaW5pdGlhbGl6ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgaW50IHJsYl9lbmFibGVkKQoreworCWludCByZXM7CisKKwlyZXMgPSB0bGJfaW5pdGlhbGl6ZShib25kKTsKKwlpZiAocmVzKSB7CisJCXJldHVybiByZXM7CisJfQorCisJaWYgKHJsYl9lbmFibGVkKSB7CisJCWJvbmQtPmFsYl9pbmZvLnJsYl9lbmFibGVkID0gMTsKKwkJLyogaW5pdGlhbGl6ZSBybGIgKi8KKwkJcmVzID0gcmxiX2luaXRpYWxpemUoYm9uZCk7CisJCWlmIChyZXMpIHsKKwkJCXRsYl9kZWluaXRpYWxpemUoYm9uZCk7CisJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYm9uZF9hbGJfZGVpbml0aWFsaXplKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBhbGJfYm9uZF9pbmZvICpib25kX2luZm8gPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkpOworCisJdGxiX2RlaW5pdGlhbGl6ZShib25kKTsKKworCWlmIChib25kX2luZm8tPnJsYl9lbmFibGVkKSB7CisJCXJsYl9kZWluaXRpYWxpemUoYm9uZCk7CisJfQorfQorCitpbnQgYm9uZF9hbGJfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlzdHJ1Y3QgZXRoaGRyICpldGhfZGF0YTsKKwlzdHJ1Y3QgYWxiX2JvbmRfaW5mbyAqYm9uZF9pbmZvID0gJihCT05EX0FMQl9JTkZPKGJvbmQpKTsKKwlzdHJ1Y3Qgc2xhdmUgKnR4X3NsYXZlID0gTlVMTDsKKwlzdGF0aWMgdTMyIGlwX2JjYXN0ID0gMHhmZmZmZmZmZjsKKwlpbnQgaGFzaF9zaXplID0gMDsKKwlpbnQgZG9fdHhfYmFsYW5jZSA9IDE7CisJdTMyIGhhc2hfaW5kZXggPSAwOworCXU4ICpoYXNoX3N0YXJ0ID0gTlVMTDsKKwlpbnQgcmVzID0gMTsKKworCXNrYi0+bWFjLnJhdyA9ICh1bnNpZ25lZCBjaGFyICopc2tiLT5kYXRhOworCWV0aF9kYXRhID0gZXRoX2hkcihza2IpOworCisJLyogbWFrZSBzdXJlIHRoYXQgdGhlIGN1cnJfYWN0aXZlX3NsYXZlIGFuZCB0aGUgc2xhdmVzIGxpc3QgZG8KKwkgKiBub3QgY2hhbmdlIGR1cmluZyB0eAorCSAqLworCXJlYWRfbG9jaygmYm9uZC0+bG9jayk7CisJcmVhZF9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJaWYgKCFCT05EX0lTX09LKGJvbmQpKSB7CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAobnRvaHMoc2tiLT5wcm90b2NvbCkpIHsKKwljYXNlIEVUSF9QX0lQOgorCQlpZiAoKG1lbWNtcChldGhfZGF0YS0+aF9kZXN0LCBtYWNfYmNhc3QsIEVUSF9BTEVOKSA9PSAwKSB8fAorCQkgICAgKHNrYi0+bmguaXBoLT5kYWRkciA9PSBpcF9iY2FzdCkgfHwKKwkJICAgIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JR01QKSkgeworCQkJZG9fdHhfYmFsYW5jZSA9IDA7CisJCQlicmVhazsKKwkJfQorCQloYXNoX3N0YXJ0ID0gKGNoYXIqKSYoc2tiLT5uaC5pcGgtPmRhZGRyKTsKKwkJaGFzaF9zaXplID0gc2l6ZW9mKHNrYi0+bmguaXBoLT5kYWRkcik7CisJCWJyZWFrOworCWNhc2UgRVRIX1BfSVBWNjoKKwkJaWYgKG1lbWNtcChldGhfZGF0YS0+aF9kZXN0LCBtYWNfYmNhc3QsIEVUSF9BTEVOKSA9PSAwKSB7CisJCQlkb190eF9iYWxhbmNlID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaGFzaF9zdGFydCA9IChjaGFyKikmKHNrYi0+bmguaXB2NmgtPmRhZGRyKTsKKwkJaGFzaF9zaXplID0gc2l6ZW9mKHNrYi0+bmguaXB2NmgtPmRhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhfUF9JUFg6CisJCWlmIChpcHhfaGRyKHNrYiktPmlweF9jaGVja3N1bSAhPQorCQkgICAgX19jb25zdGFudF9odG9ucyhJUFhfTk9fQ0hFQ0tTVU0pKSB7CisJCQkvKiBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGlzIHBhY2tldCAqLworCQkJZG9fdHhfYmFsYW5jZSA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChpcHhfaGRyKHNrYiktPmlweF90eXBlICE9IElQWF9UWVBFX05DUCkgeworCQkJLyogVGhlIG9ubHkgcHJvdG9jb2wgd29ydGggYmFsYW5jaW5nIGluCisJCQkgKiB0aGlzIGZhbWlseSBzaW5jZSBpdCBoYXMgYW4gIkFSUCIgbGlrZQorCQkJICogbWVjaGFuaXNtCisJCQkgKi8KKwkJCWRvX3R4X2JhbGFuY2UgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQloYXNoX3N0YXJ0ID0gKGNoYXIqKWV0aF9kYXRhLT5oX2Rlc3Q7CisJCWhhc2hfc2l6ZSA9IEVUSF9BTEVOOworCQlicmVhazsKKwljYXNlIEVUSF9QX0FSUDoKKwkJZG9fdHhfYmFsYW5jZSA9IDA7CisJCWlmIChib25kX2luZm8tPnJsYl9lbmFibGVkKSB7CisJCQl0eF9zbGF2ZSA9IHJsYl9hcnBfeG1pdChza2IsIGJvbmQpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRvX3R4X2JhbGFuY2UgPSAwOworCQlicmVhazsKKwl9CisKKwlpZiAoZG9fdHhfYmFsYW5jZSkgeworCQloYXNoX2luZGV4ID0gX3NpbXBsZV9oYXNoKGhhc2hfc3RhcnQsIGhhc2hfc2l6ZSk7CisJCXR4X3NsYXZlID0gdGxiX2Nob29zZV9jaGFubmVsKGJvbmQsIGhhc2hfaW5kZXgsIHNrYi0+bGVuKTsKKwl9CisKKwlpZiAoIXR4X3NsYXZlKSB7CisJCS8qIHVuYmFsYW5jZWQgb3IgdW5hc3NpZ25lZCwgc2VuZCB0aHJvdWdoIHByaW1hcnkgKi8KKwkJdHhfc2xhdmUgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKKwkJYm9uZF9pbmZvLT51bmJhbGFuY2VkX2xvYWQgKz0gc2tiLT5sZW47CisJfQorCisJaWYgKHR4X3NsYXZlICYmIFNMQVZFX0lTX09LKHR4X3NsYXZlKSkgeworCQlpZiAodHhfc2xhdmUgIT0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpIHsKKwkJCW1lbWNweShldGhfZGF0YS0+aF9zb3VyY2UsCisJCQkgICAgICAgdHhfc2xhdmUtPmRldi0+ZGV2X2FkZHIsCisJCQkgICAgICAgRVRIX0FMRU4pOworCQl9CisKKwkJcmVzID0gYm9uZF9kZXZfcXVldWVfeG1pdChib25kLCBza2IsIHR4X3NsYXZlLT5kZXYpOworCX0gZWxzZSB7CisJCWlmICh0eF9zbGF2ZSkgeworCQkJdGxiX2NsZWFyX3NsYXZlKGJvbmQsIHR4X3NsYXZlLCAwKTsKKwkJfQorCX0KKworb3V0OgorCWlmIChyZXMpIHsKKwkJLyogbm8gc3VpdGFibGUgaW50ZXJmYWNlLCBmcmFtZSBub3Qgc2VudCAqLworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorCXJlYWRfdW5sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBib25kX2FsYl9tb25pdG9yKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBhbGJfYm9uZF9pbmZvICpib25kX2luZm8gPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkpOworCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CisJaW50IGk7CisKKwlyZWFkX2xvY2soJmJvbmQtPmxvY2spOworCisJaWYgKGJvbmQtPmtpbGxfdGltZXJzKSB7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChib25kLT5zbGF2ZV9jbnQgPT0gMCkgeworCQlib25kX2luZm8tPnR4X3JlYmFsYW5jZV9jb3VudGVyID0gMDsKKwkJYm9uZF9pbmZvLT5scF9jb3VudGVyID0gMDsKKwkJZ290byByZV9hcm07CisJfQorCisJYm9uZF9pbmZvLT50eF9yZWJhbGFuY2VfY291bnRlcisrOworCWJvbmRfaW5mby0+bHBfY291bnRlcisrOworCisJLyogc2VuZCBsZWFybmluZyBwYWNrZXRzICovCisJaWYgKGJvbmRfaW5mby0+bHBfY291bnRlciA+PSBCT05EX0FMQl9MUF9USUNLUykgeworCQkvKiBjaGFuZ2Ugb2YgY3Vycl9hY3RpdmVfc2xhdmUgaW52b2x2ZXMgc3dhcHBpbmcgb2YgbWFjIGFkZHJlc3Nlcy4KKwkJICogaW4gb3JkZXIgdG8gYXZvaWQgdGhpcyBzd2FwcGluZyBmcm9tIGhhcHBlbmluZyB3aGlsZQorCQkgKiBzZW5kaW5nIHRoZSBsZWFybmluZyBwYWNrZXRzLCB0aGUgY3Vycl9zbGF2ZV9sb2NrIG11c3QgYmUgaGVsZCBmb3IKKwkJICogcmVhZC4KKwkJICovCisJCXJlYWRfbG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCQlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCQlhbGJfc2VuZF9sZWFybmluZ19wYWNrZXRzKHNsYXZlLHNsYXZlLT5kZXYtPmRldl9hZGRyKTsKKwkJfQorCisJCXJlYWRfdW5sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJCWJvbmRfaW5mby0+bHBfY291bnRlciA9IDA7CisJfQorCisJLyogcmViYWxhbmNlIHR4IHRyYWZmaWMgKi8KKwlpZiAoYm9uZF9pbmZvLT50eF9yZWJhbGFuY2VfY291bnRlciA+PSBCT05EX1RMQl9SRUJBTEFOQ0VfVElDS1MpIHsKKworCQlyZWFkX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwkJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQkJdGxiX2NsZWFyX3NsYXZlKGJvbmQsIHNsYXZlLCAxKTsKKwkJCWlmIChzbGF2ZSA9PSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeworCQkJCVNMQVZFX1RMQl9JTkZPKHNsYXZlKS5sb2FkID0KKwkJCQkJYm9uZF9pbmZvLT51bmJhbGFuY2VkX2xvYWQgLworCQkJCQkJQk9ORF9UTEJfUkVCQUxBTkNFX0lOVEVSVkFMOworCQkJCWJvbmRfaW5mby0+dW5iYWxhbmNlZF9sb2FkID0gMDsKKwkJCX0KKwkJfQorCisJCXJlYWRfdW5sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJCWJvbmRfaW5mby0+dHhfcmViYWxhbmNlX2NvdW50ZXIgPSAwOworCX0KKworCS8qIGhhbmRsZSBybGIgc3R1ZmYgKi8KKwlpZiAoYm9uZF9pbmZvLT5ybGJfZW5hYmxlZCkgeworCQkvKiB0aGUgZm9sbG93aW5nIGNvZGUgY2hhbmdlcyB0aGUgcHJvbWlzY3VpdHkgb2YgdGhlCisJCSAqIHRoZSBjdXJyX2FjdGl2ZV9zbGF2ZS4gSXQgbmVlZHMgdG8gYmUgbG9ja2VkIHdpdGggYQorCQkgKiB3cml0ZSBsb2NrIHRvIHByb3RlY3QgZnJvbSBvdGhlciBjb2RlIHRoYXQgYWxzbworCQkgKiBzZXRzIHRoZSBwcm9taXNjdWl0eS4KKwkJICovCisJCXdyaXRlX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwkJaWYgKGJvbmRfaW5mby0+cHJpbWFyeV9pc19wcm9taXNjICYmCisJCSAgICAoKytib25kX2luZm8tPnJsYl9wcm9taXNjX3RpbWVvdXRfY291bnRlciA+PSBSTEJfUFJPTUlTQ19USU1FT1VUKSkgeworCisJCQlib25kX2luZm8tPnJsYl9wcm9taXNjX3RpbWVvdXRfY291bnRlciA9IDA7CisKKwkJCS8qIElmIHRoZSBwcmltYXJ5IHdhcyBzZXQgdG8gcHJvbWlzY3VvdXMgbW9kZQorCQkJICogYmVjYXVzZSBhIHNsYXZlIHdhcyBkaXNhYmxlZCB0aGVuCisJCQkgKiBpdCBjYW4gbm93IGxlYXZlIHByb21pc2N1b3VzIG1vZGUuCisJCQkgKi8KKwkJCWRldl9zZXRfcHJvbWlzY3VpdHkoYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUtPmRldiwgLTEpOworCQkJYm9uZF9pbmZvLT5wcmltYXJ5X2lzX3Byb21pc2MgPSAwOworCQl9CisKKwkJd3JpdGVfdW5sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJCWlmIChib25kX2luZm8tPnJsYl9yZWJhbGFuY2UpIHsKKwkJCWJvbmRfaW5mby0+cmxiX3JlYmFsYW5jZSA9IDA7CisJCQlybGJfcmViYWxhbmNlKGJvbmQpOworCQl9CisKKwkJLyogY2hlY2sgaWYgY2xpZW50cyBuZWVkIHVwZGF0aW5nICovCisJCWlmIChib25kX2luZm8tPnJ4X250dCkgeworCQkJaWYgKGJvbmRfaW5mby0+cmxiX3VwZGF0ZV9kZWxheV9jb3VudGVyKSB7CisJCQkJLS1ib25kX2luZm8tPnJsYl91cGRhdGVfZGVsYXlfY291bnRlcjsKKwkJCX0gZWxzZSB7CisJCQkJcmxiX3VwZGF0ZV9yeF9jbGllbnRzKGJvbmQpOworCQkJCWlmIChib25kX2luZm8tPnJsYl91cGRhdGVfcmV0cnlfY291bnRlcikgeworCQkJCQktLWJvbmRfaW5mby0+cmxiX3VwZGF0ZV9yZXRyeV9jb3VudGVyOworCQkJCX0gZWxzZSB7CisJCQkJCWJvbmRfaW5mby0+cnhfbnR0ID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK3JlX2FybToKKwltb2RfdGltZXIoJihib25kX2luZm8tPmFsYl90aW1lciksIGppZmZpZXMgKyBhbGJfZGVsdGFfaW5fdGlja3MpOworb3V0OgorCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKK30KKworLyogYXNzdW1wdGlvbjogY2FsbGVkIGJlZm9yZSB0aGUgc2xhdmUgaXMgYXR0YWNoZWQgdG8gdGhlIGJvbmQKKyAqIGFuZCBub3QgbG9ja2VkIGJ5IHRoZSBib25kIGxvY2sKKyAqLworaW50IGJvbmRfYWxiX2luaXRfc2xhdmUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBzbGF2ZSAqc2xhdmUpCit7CisJaW50IHJlczsKKworCXJlcyA9IGFsYl9zZXRfc2xhdmVfbWFjX2FkZHIoc2xhdmUsIHNsYXZlLT5wZXJtX2h3YWRkciwKKwkJCQkgICAgIGJvbmQtPmFsYl9pbmZvLnJsYl9lbmFibGVkKTsKKwlpZiAocmVzKSB7CisJCXJldHVybiByZXM7CisJfQorCisJLyogY2FsbGVyIG11c3QgaG9sZCB0aGUgYm9uZCBsb2NrIGZvciB3cml0ZSBzaW5jZSB0aGUgbWFjIGFkZHJlc3NlcworCSAqIGFyZSBjb21wYXJlZCBhbmQgbWF5IGJlIHN3YXBwZWQuCisJICovCisJd3JpdGVfbG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwlyZXMgPSBhbGJfaGFuZGxlX2FkZHJfY29sbGlzaW9uX29uX2F0dGFjaChib25kLCBzbGF2ZSk7CisKKwl3cml0ZV91bmxvY2tfYmgoJmJvbmQtPmxvY2spOworCisJaWYgKHJlcykgeworCQlyZXR1cm4gcmVzOworCX0KKworCXRsYl9pbml0X3NsYXZlKHNsYXZlKTsKKworCS8qIG9yZGVyIGEgcmViYWxhbmNlIEFTQVAgKi8KKwlib25kLT5hbGJfaW5mby50eF9yZWJhbGFuY2VfY291bnRlciA9IEJPTkRfVExCX1JFQkFMQU5DRV9USUNLUzsKKworCWlmIChib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCkgeworCQlib25kLT5hbGJfaW5mby5ybGJfcmViYWxhbmNlID0gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVyIG11c3QgaG9sZCBib25kIGxvY2sgZm9yIHdyaXRlICovCit2b2lkIGJvbmRfYWxiX2RlaW5pdF9zbGF2ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpzbGF2ZSkKK3sKKwlpZiAoYm9uZC0+c2xhdmVfY250ID4gMSkgeworCQlhbGJfY2hhbmdlX2h3X2FkZHJfb25fZGV0YWNoKGJvbmQsIHNsYXZlKTsKKwl9CisKKwl0bGJfY2xlYXJfc2xhdmUoYm9uZCwgc2xhdmUsIDApOworCisJaWYgKGJvbmQtPmFsYl9pbmZvLnJsYl9lbmFibGVkKSB7CisJCWJvbmQtPmFsYl9pbmZvLm5leHRfcnhfc2xhdmUgPSBOVUxMOworCQlybGJfY2xlYXJfc2xhdmUoYm9uZCwgc2xhdmUpOworCX0KK30KKworLyogQ2FsbGVyIG11c3QgaG9sZCBib25kIGxvY2sgZm9yIHJlYWQgKi8KK3ZvaWQgYm9uZF9hbGJfaGFuZGxlX2xpbmtfY2hhbmdlKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCBjaGFyIGxpbmspCit7CisJc3RydWN0IGFsYl9ib25kX2luZm8gKmJvbmRfaW5mbyA9ICYoQk9ORF9BTEJfSU5GTyhib25kKSk7CisKKwlpZiAobGluayA9PSBCT05EX0xJTktfRE9XTikgeworCQl0bGJfY2xlYXJfc2xhdmUoYm9uZCwgc2xhdmUsIDApOworCQlpZiAoYm9uZC0+YWxiX2luZm8ucmxiX2VuYWJsZWQpIHsKKwkJCXJsYl9jbGVhcl9zbGF2ZShib25kLCBzbGF2ZSk7CisJCX0KKwl9IGVsc2UgaWYgKGxpbmsgPT0gQk9ORF9MSU5LX1VQKSB7CisJCS8qIG9yZGVyIGEgcmViYWxhbmNlIEFTQVAgKi8KKwkJYm9uZF9pbmZvLT50eF9yZWJhbGFuY2VfY291bnRlciA9IEJPTkRfVExCX1JFQkFMQU5DRV9USUNLUzsKKwkJaWYgKGJvbmQtPmFsYl9pbmZvLnJsYl9lbmFibGVkKSB7CisJCQlib25kLT5hbGJfaW5mby5ybGJfcmViYWxhbmNlID0gMTsKKwkJCS8qIElmIHRoZSB1cGRlbGF5IG1vZHVsZSBwYXJhbWV0ZXIgaXMgc21hbGxlciB0aGFuIHRoZQorCQkJICogZm9yd2FyZGluZyBkZWxheSBvZiB0aGUgc3dpdGNoIHRoZSByZWJhbGFuY2Ugd2lsbAorCQkJICogbm90IHdvcmsgYmVjYXVzZSB0aGUgcmViYWxhbmNlIGFycCByZXBsaWVzIHdpbGwKKwkJCSAqIG5vdCBiZSBmb3J3YXJkZWQgdG8gdGhlIGNsaWVudHMuLgorCQkJICovCisJCX0KKwl9Cit9CisKKy8qKgorICogYm9uZF9hbGJfaGFuZGxlX2FjdGl2ZV9jaGFuZ2UgLSBhc3NpZ24gbmV3IGN1cnJfYWN0aXZlX3NsYXZlCisgKiBAYm9uZDogb3VyIGJvbmRpbmcgc3RydWN0CisgKiBAbmV3X3NsYXZlOiBuZXcgc2xhdmUgdG8gYXNzaWduCisgKgorICogU2V0IHRoZSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSB0byBAbmV3X3NsYXZlIGFuZCBoYW5kbGUKKyAqIG1hYyBhZGRyZXNzIHN3YXBwaW5nIGFuZCBwcm9taXNjdWl0eSBjaGFuZ2VzIGFzIG5lZWRlZC4KKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQgY3Vycl9zbGF2ZV9sb2NrIGZvciB3cml0ZSAob3IgYm9uZCBsb2NrIGZvciB3cml0ZSkKKyAqLwordm9pZCBib25kX2FsYl9oYW5kbGVfYWN0aXZlX2NoYW5nZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpuZXdfc2xhdmUpCit7CisJc3RydWN0IHNsYXZlICpzd2FwX3NsYXZlOworCWludCBpOworCisJaWYgKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlID09IG5ld19zbGF2ZSkgeworCQlyZXR1cm47CisJfQorCisJaWYgKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlICYmIGJvbmQtPmFsYl9pbmZvLnByaW1hcnlfaXNfcHJvbWlzYykgeworCQlkZXZfc2V0X3Byb21pc2N1aXR5KGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlLT5kZXYsIC0xKTsKKwkJYm9uZC0+YWxiX2luZm8ucHJpbWFyeV9pc19wcm9taXNjID0gMDsKKwkJYm9uZC0+YWxiX2luZm8ucmxiX3Byb21pc2NfdGltZW91dF9jb3VudGVyID0gMDsKKwl9CisKKwlzd2FwX3NsYXZlID0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmU7CisJYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUgPSBuZXdfc2xhdmU7CisKKwlpZiAoIW5ld19zbGF2ZSB8fCAoYm9uZC0+c2xhdmVfY250ID09IDApKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBzZXQgdGhlIG5ldyBjdXJyX2FjdGl2ZV9zbGF2ZSB0byB0aGUgYm9uZHMgbWFjIGFkZHJlc3MKKwkgKiBpLmUuIHN3YXAgbWFjIGFkZHJlc3NlcyBvZiBvbGQgY3Vycl9hY3RpdmVfc2xhdmUgYW5kIG5ldyBjdXJyX2FjdGl2ZV9zbGF2ZQorCSAqLworCWlmICghc3dhcF9zbGF2ZSkgeworCQlzdHJ1Y3Qgc2xhdmUgKnRtcF9zbGF2ZTsKKwkJLyogZmluZCBzbGF2ZSB0aGF0IGlzIGhvbGRpbmcgdGhlIGJvbmQncyBtYWMgYWRkcmVzcyAqLworCQlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHRtcF9zbGF2ZSwgaSkgeworCQkJaWYgKCFtZW1jbXAodG1wX3NsYXZlLT5kZXYtPmRldl9hZGRyLAorCQkJCSAgICBib25kLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpIHsKKwkJCQlzd2FwX3NsYXZlID0gdG1wX3NsYXZlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyogY3Vycl9hY3RpdmVfc2xhdmUgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgYWxiX3N3YXBfbWFjX2FkZHIgKi8KKwlpZiAoc3dhcF9zbGF2ZSkgeworCQkvKiBzd2FwIG1hYyBhZGRyZXNzICovCisJCWFsYl9zd2FwX21hY19hZGRyKGJvbmQsIHN3YXBfc2xhdmUsIG5ld19zbGF2ZSk7CisJfSBlbHNlIHsKKwkJLyogc2V0IHRoZSBuZXdfc2xhdmUgdG8gdGhlIGJvbmQgbWFjIGFkZHJlc3MgKi8KKwkJYWxiX3NldF9zbGF2ZV9tYWNfYWRkcihuZXdfc2xhdmUsIGJvbmQtPmRldi0+ZGV2X2FkZHIsCisJCQkJICAgICAgIGJvbmQtPmFsYl9pbmZvLnJsYl9lbmFibGVkKTsKKwkJLyogZmFzdGVuIGJvbmQgbWFjIG9uIG5ldyBjdXJyZW50IHNsYXZlICovCisJCWFsYl9zZW5kX2xlYXJuaW5nX3BhY2tldHMobmV3X3NsYXZlLCBib25kLT5kZXYtPmRldl9hZGRyKTsKKwl9Cit9CisKK2ludCBib25kX2FsYl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IGFkZHI7CisJc3RydWN0IHNsYXZlICpzbGF2ZSwgKnN3YXBfc2xhdmU7CisJaW50IHJlczsKKwlpbnQgaTsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihzYS0+c2FfZGF0YSkpIHsKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCX0KKworCXJlcyA9IGFsYl9zZXRfbWFjX2FkZHJlc3MoYm9uZCwgYWRkcik7CisJaWYgKHJlcykgeworCQlyZXR1cm4gcmVzOworCX0KKworCW1lbWNweShib25kX2Rldi0+ZGV2X2FkZHIsIHNhLT5zYV9kYXRhLCBib25kX2Rldi0+YWRkcl9sZW4pOworCisJLyogSWYgdGhlcmUgaXMgbm8gY3Vycl9hY3RpdmVfc2xhdmUgdGhlcmUgaXMgbm90aGluZyBlbHNlIHRvIGRvLgorCSAqIE90aGVyd2lzZSB3ZSdsbCBuZWVkIHRvIHBhc3MgdGhlIG5ldyBhZGRyZXNzIHRvIGl0IGFuZCBoYW5kbGUKKwkgKiBkdXBsaWNhdGlvbnMuCisJICovCisJaWYgKCFib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2FwX3NsYXZlID0gTlVMTDsKKworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJaWYgKCFtZW1jbXAoc2xhdmUtPmRldi0+ZGV2X2FkZHIsIGJvbmRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKSB7CisJCQlzd2FwX3NsYXZlID0gc2xhdmU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChzd2FwX3NsYXZlKSB7CisJCWFsYl9zd2FwX21hY19hZGRyKGJvbmQsIHN3YXBfc2xhdmUsIGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKTsKKwl9IGVsc2UgeworCQlhbGJfc2V0X3NsYXZlX21hY19hZGRyKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlLCBib25kX2Rldi0+ZGV2X2FkZHIsCisJCQkJICAgICAgIGJvbmQtPmFsYl9pbmZvLnJsYl9lbmFibGVkKTsKKworCQlhbGJfc2VuZF9sZWFybmluZ19wYWNrZXRzKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlLCBib25kX2Rldi0+ZGV2X2FkZHIpOworCQlpZiAoYm9uZC0+YWxiX2luZm8ucmxiX2VuYWJsZWQpIHsKKwkJCS8qIGluZm9ybSBjbGllbnRzIG1hYyBhZGRyZXNzIGhhcyBjaGFuZ2VkICovCisJCQlybGJfcmVxX3VwZGF0ZV9zbGF2ZV9jbGllbnRzKGJvbmQsIGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGJvbmRfYWxiX2NsZWFyX3ZsYW4oc3RydWN0IGJvbmRpbmcgKmJvbmQsIHVuc2lnbmVkIHNob3J0IHZsYW5faWQpCit7CisJaWYgKGJvbmQtPmFsYl9pbmZvLmN1cnJlbnRfYWxiX3ZsYW4gJiYKKwkgICAgKGJvbmQtPmFsYl9pbmZvLmN1cnJlbnRfYWxiX3ZsYW4tPnZsYW5faWQgPT0gdmxhbl9pZCkpIHsKKwkJYm9uZC0+YWxiX2luZm8uY3VycmVudF9hbGJfdmxhbiA9IE5VTEw7CisJfQorCisJaWYgKGJvbmQtPmFsYl9pbmZvLnJsYl9lbmFibGVkKSB7CisJCXJsYl9jbGVhcl92bGFuKGJvbmQsIHZsYW5faWQpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5oIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDkxY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqIDIwMDMvMDgvMDYgLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBBZGQgc3VwcG9ydCBmb3Igc2V0dGluZyBib25kJ3MgTUFDIGFkZHJlc3Mgd2l0aCBzcGVjaWFsCisgKgkgIGhhbmRsaW5nIHJlcXVpcmVkIGZvciBBTEIvVExCLgorICoKKyAqIDIwMDMvMTIvMDEgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQ29kZSBjbGVhbnVwIGFuZCBzdHlsZSBjaGFuZ2VzCisgKi8KKworI2lmbmRlZiBfX0JPTkRfQUxCX0hfXworI2RlZmluZSBfX0JPTkRfQUxCX0hfXworCisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKworc3RydWN0IGJvbmRpbmc7CitzdHJ1Y3Qgc2xhdmU7CisKKyNkZWZpbmUgQk9ORF9BTEJfSU5GTyhib25kKSAgICgoYm9uZCktPmFsYl9pbmZvKQorI2RlZmluZSBTTEFWRV9UTEJfSU5GTyhzbGF2ZSkgKChzbGF2ZSktPnRsYl9pbmZvKQorCitzdHJ1Y3QgdGxiX2NsaWVudF9pbmZvIHsKKwlzdHJ1Y3Qgc2xhdmUgKnR4X3NsYXZlOwkvKiBBIHBvaW50ZXIgdG8gc2xhdmUgdXNlZCBmb3IgdHJhbnNtaXRpbmcKKwkJCQkgKiBwYWNrZXRzIHRvIGEgQ2xpZW50IHRoYXQgdGhlIEhhc2ggZnVuY3Rpb24KKwkJCQkgKiBnYXZlIHRoaXMgZW50cnkgaW5kZXguCisJCQkJICovCisJdTMyIHR4X2J5dGVzOwkJLyogRWFjaCBDbGllbnQgYWN1bXVsYXRlcyB0aGUgQnl0ZXNUeCB0aGF0CisJCQkJICogd2VyZSB0cmFubWl0dGVkIHRvIGl0LCBhbmQgYWZ0ZXIgZWFjaAorCQkJCSAqIENhbGxCYWNrIHRoZSBMb2FkSGlzdG9yeSBpcyBkZXZpZGVkCisJCQkJICogYnkgdGhlIGJhbGFuY2UgaW50ZXJ2YWwKKwkJCQkgKi8KKwl1MzIgbG9hZF9oaXN0b3J5OwkvKiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBhbW91bnQgb2YgQnl0ZXMKKwkJCQkgKiB0aGF0IHdlcmUgdHJhbnNtaXR0ZWQgdG8gdGhpcyBjbGllbnQgYnkKKwkJCQkgKiB0aGUgc2VydmVyIG9uIHRoZSBwcmV2aW91cyBiYWxhbmNlCisJCQkJICogaW50ZXJ2YWwgaW4gQnBzLgorCQkJCSAqLworCXUzMiBuZXh0OwkJLyogVGhlIG5leHQgSGFzaCB0YWJsZSBlbnRyeSBpbmRleCwgYXNzaWduZWQKKwkJCQkgKiB0byB1c2UgdGhlIHNhbWUgYWRhcHRlciBmb3IgdHJhbnNtaXQuCisJCQkJICovCisJdTMyIHByZXY7CQkvKiBUaGUgcHJldmlvdXMgSGFzaCB0YWJsZSBlbnRyeSBpbmRleCwKKwkJCQkgKiBhc3NpZ25lZCB0byB1c2UgdGhlIHNhbWUKKwkJCQkgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHN0cnVjdCBybGJfY2xpZW50X2luZm8gY29udGFpbnMgYWxsIGluZm8gcmVsYXRlZCB0byBhIHNwZWNpZmljIHJ4IGNsaWVudAorICogY29ubmVjdGlvbi4gVGhpcyBpcyB0aGUgQ2xpZW50cyBIYXNoIFRhYmxlIGVudHJ5IHN0cnVjdAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdHJ1Y3QgcmxiX2NsaWVudF9pbmZvIHsKKwl1MzIgaXBfc3JjOwkJLyogdGhlIHNlcnZlciBJUCBhZGRyZXNzICovCisJdTMyIGlwX2RzdDsJCS8qIHRoZSBjbGllbnQgSVAgYWRkcmVzcyAqLworCXU4ICBtYWNfZHN0W0VUSF9BTEVOXTsJLyogdGhlIGNsaWVudCBNQUMgYWRkcmVzcyAqLworCXUzMiBuZXh0OwkJLyogVGhlIG5leHQgSGFzaCB0YWJsZSBlbnRyeSBpbmRleCAqLworCXUzMiBwcmV2OwkJLyogVGhlIHByZXZpb3VzIEhhc2ggdGFibGUgZW50cnkgaW5kZXggKi8KKwl1OCAgYXNzaWduZWQ7CQkvKiBjaGVja2luZyB3aGV0aGVyIHRoaXMgZW50cnkgaXMgYXNzaWduZWQgKi8KKwl1OCAgbnR0OwkJLyogZmxhZyAtIG5lZWQgdG8gdHJhbnNtaXQgY2xpZW50IGluZm8gKi8KKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOwkvKiB0aGUgc2xhdmUgYXNzaWduZWQgdG8gdGhpcyBjbGllbnQgKi8KKwl1OCB0YWc7CQkJLyogZmxhZyAtIG5lZWQgdG8gdGFnIHNrYiAqLworCXVuc2lnbmVkIHNob3J0IHZsYW5faWQ7CS8qIFZMQU4gdGFnIGFzc29jaWF0ZWQgd2l0aCBJUCBhZGRyZXNzICovCit9OworCitzdHJ1Y3QgdGxiX3NsYXZlX2luZm8geworCXUzMiBoZWFkOwkvKiBJbmRleCB0byB0aGUgaGVhZCBvZiB0aGUgYmktZGlyZWN0aW9uYWwgY2xpZW50cworCQkJICogaGFzaCB0YWJsZSBlbnRyaWVzIGxpc3QuIFRoZSBlbnRyaWVzIGluIHRoZSBsaXN0CisJCQkgKiBhcmUgdGhlIGVudHJpZXMgdGhhdCB3ZXJlIGFzc2lnbmVkIHRvIHVzZSB0aGlzCisJCQkgKiBzbGF2ZSBmb3IgdHJhbnNtaXQuCisJCQkgKi8KKwl1MzIgbG9hZDsJLyogRWFjaCBzbGF2ZSBzdW1zIHRoZSBsb2FkSGlzdG9yeSBvZiBhbGwgY2xpZW50cworCQkJICogYXNzaWduZWQgdG8gaXQKKwkJCSAqLworfTsKKworc3RydWN0IGFsYl9ib25kX2luZm8geworCXN0cnVjdCB0aW1lcl9saXN0CWFsYl90aW1lcjsKKwlzdHJ1Y3QgdGxiX2NsaWVudF9pbmZvCSp0eF9oYXNodGJsOyAvKiBEeW5hbWljYWxseSBhbGxvY2F0ZWQgKi8KKwlzcGlubG9ja190CQl0eF9oYXNodGJsX2xvY2s7CisJdTMyCQkJdW5iYWxhbmNlZF9sb2FkOworCWludAkJCXR4X3JlYmFsYW5jZV9jb3VudGVyOworCWludAkJCWxwX2NvdW50ZXI7CisJLyogLS0tLS0tLS0gcmxiIHBhcmFtZXRlcnMgLS0tLS0tLS0gKi8KKwlpbnQgcmxiX2VuYWJsZWQ7CisJc3RydWN0IHBhY2tldF90eXBlCXJsYl9wa3RfdHlwZTsKKwlzdHJ1Y3QgcmxiX2NsaWVudF9pbmZvCSpyeF9oYXNodGJsOwkvKiBSZWNlaXZlIGhhc2ggdGFibGUgKi8KKwlzcGlubG9ja190CQlyeF9oYXNodGJsX2xvY2s7CisJdTMyCQkJcnhfaGFzaHRibF9oZWFkOworCXU4CQkJcnhfbnR0OwkvKiBmbGFnIC0gbmVlZCB0byB0cmFuc21pdAorCQkJCQkgKiB0byBhbGwgcnggY2xpZW50cworCQkJCQkgKi8KKwlzdHJ1Y3Qgc2xhdmUJCSpuZXh0X3J4X3NsYXZlOy8qIG5leHQgc2xhdmUgdG8gYmUgYXNzaWduZWQKKwkJCQkJCSogdG8gYSBuZXcgcnggY2xpZW50IGZvcgorCQkJCQkJKi8KKwl1MzIJCQlybGJfaW50ZXJ2YWxfY291bnRlcjsKKwl1OAkJCXByaW1hcnlfaXNfcHJvbWlzYzsJICAgLyogYm9vbGVhbiAqLworCXUzMgkJCXJsYl9wcm9taXNjX3RpbWVvdXRfY291bnRlcjsvKiBjb3VudHMgcHJpbWFyeQorCQkJCQkJCSAgICAgKiBwcm9taXNjdWl0eSB0aW1lCisJCQkJCQkJICAgICAqLworCXUzMgkJCXJsYl91cGRhdGVfZGVsYXlfY291bnRlcjsKKwl1MzIJCQlybGJfdXBkYXRlX3JldHJ5X2NvdW50ZXI7LyogY291bnRlciBvZiByZXRyaWVzCisJCQkJCQkJICAqIG9mIGNsaWVudCB1cGRhdGUKKwkJCQkJCQkgICovCisJdTgJCQlybGJfcmViYWxhbmNlOwkvKiBmbGFnIC0gaW5kaWNhdGVzIHRoYXQgdGhlCisJCQkJCQkgKiByeCB0cmFmZmljIHNob3VsZCBiZQorCQkJCQkJICogcmViYWxhbmNlZAorCQkJCQkJICovCisJc3RydWN0IHZsYW5fZW50cnkJKmN1cnJlbnRfYWxiX3ZsYW47Cit9OworCitpbnQgYm9uZF9hbGJfaW5pdGlhbGl6ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgaW50IHJsYl9lbmFibGVkKTsKK3ZvaWQgYm9uZF9hbGJfZGVpbml0aWFsaXplKHN0cnVjdCBib25kaW5nICpib25kKTsKK2ludCBib25kX2FsYl9pbml0X3NsYXZlKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlKTsKK3ZvaWQgYm9uZF9hbGJfZGVpbml0X3NsYXZlKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlKTsKK3ZvaWQgYm9uZF9hbGJfaGFuZGxlX2xpbmtfY2hhbmdlKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCBjaGFyIGxpbmspOwordm9pZCBib25kX2FsYl9oYW5kbGVfYWN0aXZlX2NoYW5nZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpuZXdfc2xhdmUpOworaW50IGJvbmRfYWxiX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KTsKK3ZvaWQgYm9uZF9hbGJfbW9uaXRvcihzdHJ1Y3QgYm9uZGluZyAqYm9uZCk7CitpbnQgYm9uZF9hbGJfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2Rldiwgdm9pZCAqYWRkcik7Cit2b2lkIGJvbmRfYWxiX2NsZWFyX3ZsYW4oc3RydWN0IGJvbmRpbmcgKmJvbmQsIHVuc2lnbmVkIHNob3J0IHZsYW5faWQpOworI2VuZGlmIC8qIF9fQk9ORF9BTEJfSF9fICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MGUyOGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC0wLDAgKzEsNDcwOCBAQAorLyoKKyAqIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGR1bW15IGRldmljZS4KKyAqCisgKiBDb3B5cmlnaHQgMTk5OSwgVGhvbWFzIERhdmlzLCB0YWRhdmlzQGxibC5nb3YuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLiBCYXNlZCBvbiBkdW1teS5jLCBhbmQgZXFsLmMgZGV2aWNlcy4KKyAqCisgKiBib25kaW5nLmM6IGFuIEV0aGVybmV0IEJvbmRpbmcgZHJpdmVyCisgKgorICogVGhpcyBpcyB1c2VmdWwgdG8gdGFsayB0byBhIENpc2NvIEV0aGVyQ2hhbm5lbCBjb21wYXRpYmxlIGVxdWlwbWVudDoKKyAqCUNpc2NvIDU1MDAKKyAqCVN1biBUcnVua2luZyAoU29sYXJpcykKKyAqCUFsdGVvbiBBY2VEaXJlY3RvciBUcnVua3MKKyAqCUxpbnV4IEJvbmRpbmcKKyAqCWFuZCBwcm9iYWJseSBtYW55IEwyIHN3aXRjaGVzIC4uLgorICoKKyAqIEhvdyBpdCB3b3JrczoKKyAqICAgIGlmY29uZmlnIGJvbmQwIGlwYWRkcmVzcyBuZXRtYXNrIHVwCisgKiAgICAgIHdpbGwgc2V0dXAgYSBuZXR3b3JrIGRldmljZSwgd2l0aCBhbiBpcCBhZGRyZXNzLiAgTm8gbWFjIGFkZHJlc3MKKyAqCXdpbGwgYmUgYXNzaWduZWQgYXQgdGhpcyB0aW1lLiAgVGhlIGh3IG1hYyBhZGRyZXNzIHdpbGwgY29tZSBmcm9tCisgKgl0aGUgZmlyc3Qgc2xhdmUgYm9uZGVkIHRvIHRoZSBjaGFubmVsLiAgQWxsIHNsYXZlcyB3aWxsIHRoZW4gdXNlCisgKgl0aGlzIGh3IG1hYyBhZGRyZXNzLgorICoKKyAqICAgIGlmY29uZmlnIGJvbmQwIGRvd24KKyAqICAgICAgICAgd2lsbCByZWxlYXNlIGFsbCBzbGF2ZXMsIG1hcmtpbmcgdGhlbSBhcyBkb3duLgorICoKKyAqICAgIGlmZW5zbGF2ZSBib25kMCBldGgwCisgKgl3aWxsIGF0dGFjaCBldGgwIHRvIGJvbmQwIGFzIGEgc2xhdmUuICBldGgwIGh3IG1hYyBhZGRyZXNzIHdpbGwgZWl0aGVyCisgKglhOiBiZSB1c2VkIGFzIGluaXRpYWwgbWFjIGFkZHJlc3MKKyAqCWI6IGlmIGEgaHcgbWFjIGFkZHJlc3MgYWxyZWFkeSBpcyB0aGVyZSwgZXRoMCdzIGh3IG1hYyBhZGRyZXNzCisgKgkgICB3aWxsIHRoZW4gYmUgc2V0IGZyb20gYm9uZDAuCisgKgorICogdjAuMSAtIGZpcnN0IHdvcmtpbmcgdmVyc2lvbi4KKyAqIHYwLjIgLSBjaGFuZ2VkIHN0YXRzIHRvIGJlIGNhbGN1bGF0ZWQgYnkgc3VtbWluZyBzbGF2ZXMgc3RhdHMuCisgKgorICogQ2hhbmdlczoKKyAqIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICogLSBmaXggbGVha3Mgb24gZmFpbHVyZSBhdCBib25kX2luaXQKKyAqCisgKiAyMDAwLzA5LzMwIC0gV2lsbHkgVGFycmVhdSA8d2lsbHkgYXQgbWV0YS14Lm9yZz4KKyAqICAgICAtIGFkZGVkIHRyaXZpYWwgY29kZSB0byByZWxlYXNlIGEgc2xhdmUgZGV2aWNlLgorICogICAgIC0gZml4ZWQgc2VjdXJpdHkgYnVnIChDQVBfTkVUX0FETUlOIG5vdCBjaGVja2VkKQorICogICAgIC0gaW1wbGVtZW50ZWQgTUlJIGxpbmsgbW9uaXRvcmluZyB0byBkaXNhYmxlIGRlYWQgbGlua3MgOgorICogICAgICAgQWxsIE1JSSBjYXBhYmxlIHNsYXZlcyBhcmUgY2hlY2tlZCBldmVyeSA8bWlpbW9uPiBtaWxsaXNlY29uZHMKKyAqICAgICAgICgxMDAgbXMgc2VlbXMgZ29vZCkuIFRoaXMgdmFsdWUgY2FuIGJlIGNoYW5nZWQgYnkgcGFzc2luZyBpdCB0bworICogICAgICAgaW5zbW9kLiBBIHZhbHVlIG9mIHplcm8gZGlzYWJsZXMgdGhlIG1vbml0b3JpbmcgKGRlZmF1bHQpLgorICogICAgIC0gZml4ZWQgYW4gaW5maW5pdGUgbG9vcCBpbiBib25kX3htaXRfcm91bmRyb2JpbigpIHdoZW4gdGhlcmUncyBubworICogICAgICAgZ29vZCBzbGF2ZS4KKyAqICAgICAtIG1hZGUgdGhlIGNvZGUgaG9wZWZ1bGx5IFNNUCBzYWZlCisgKgorICogMjAwMC8xMC8wMyAtIFdpbGx5IFRhcnJlYXUgPHdpbGx5IGF0IG1ldGEteC5vcmc+CisgKiAgICAgLSBvcHRpbWl6ZWQgc2xhdmUgbGlzdHMgYmFzZWQgb24gcmVsZXZhbnQgc3VnZ2VzdGlvbnMgZnJvbSBUaG9tYXMgRGF2aXMKKyAqICAgICAtIGltcGxlbWVudGVkIGFjdGl2ZS1iYWNrdXAgbWV0aG9kIHRvIG9idGFpbiBIQSB3aXRoIHR3byBzd2l0Y2hlczoKKyAqICAgICAgIHN0YXkgYXMgbG9uZyBhcyBwb3NzaWJsZSBvbiB0aGUgc2FtZSBhY3RpdmUgaW50ZXJmYWNlLCB3aGlsZSB3ZQorICogICAgICAgYWxzbyBtb25pdG9yIHRoZSBiYWNrdXAgb25lIChNSUkgbGluayBzdGF0dXMpIGJlY2F1c2Ugd2Ugd2FudCB0byBrbm93CisgKiAgICAgICBpZiB3ZSBhcmUgYWJsZSB0byBzd2l0Y2ggYXQgYW55IHRpbWUuICggcGFzcyAibW9kZT0xIiB0byBpbnNtb2QgKQorICogICAgIC0gbG90cyBvZiBzdHJlc3MgdGVzdGluZ3MgYmVjYXVzZSB3ZSBuZWVkIGl0IHRvIGJlIG1vcmUgcm9idXN0IHRoYW4gdGhlCisgKiAgICAgICB3aXJlcyAhIDotPgorICoKKyAqIDIwMDAvMTAvMDkgLSBXaWxseSBUYXJyZWF1IDx3aWxseSBhdCBtZXRhLXgub3JnPgorICogICAgIC0gYWRkZWQgdXAgYW5kIGRvd24gZGVsYXlzIGFmdGVyIGxpbmsgc3RhdGUgY2hhbmdlLgorICogICAgIC0gb3B0aW1pemVkIHRoZSBzbGF2ZXMgY2hhaW5pbmcgc28gdGhhdCB3aGVuIHdlIHJ1biBmb3J3YXJkLCB3ZSBuZXZlcgorICogICAgICAgcmVwYXNzIHRocm91Z2ggdGhlIGJvbmQgaXRzZWxmLCBidXQgd2UgY2FuIGZpbmQgaXQgYnkgc2VhcmNoaW5nCisgKiAgICAgICBiYWNrd2FyZHMuIFJlbmRlcnMgdGhlIGRlbGV0aW9uIG1vcmUgZGlmZmljdWx0LCBidXQgYWNjZWxlcmF0ZXMgdGhlCisgKiAgICAgICBzY2FuLgorICogICAgIC0gc21hcnRlciBlbnNsYXZpbmcgYW5kIHJlbGVhc2luZy4KKyAqICAgICAtIGZpbmVyIGFuZCBtb3JlIHJvYnVzdCBTTVAgbG9ja2luZworICoKKyAqIDIwMDAvMTAvMTcgLSBXaWxseSBUYXJyZWF1IDx3aWxseSBhdCBtZXRhLXgub3JnPgorICogICAgIC0gZml4ZWQgdHdvIHBvdGVudGlhbCBTTVAgcmFjZSBjb25kaXRpb25zCisgKgorICogMjAwMC8xMC8xOCAtIFdpbGx5IFRhcnJlYXUgPHdpbGx5IGF0IG1ldGEteC5vcmc+CisgKiAgICAgLSBzbWFsbCBmaXhlcyB0byB0aGUgbW9uaXRvcmluZyBGU00gaW4gY2FzZSBvZiB6ZXJvIGRlbGF5cworICogMjAwMC8xMS8wMSAtIFdpbGx5IFRhcnJlYXUgPHdpbGx5IGF0IG1ldGEteC5vcmc+CisgKiAgICAgLSBmaXhlZCBmaXJzdCBzbGF2ZSBub3QgYXV0b21hdGljYWxseSB1c2VkIGluIHRydW5rIG1vZGUuCisgKiAyMDAwLzExLzEwIDogc3BlbGxpbmcgb2YgIkV0aGVyQ2hhbm5lbCIgY29ycmVjdGVkLgorICogMjAwMC8xMS8xMyA6IGZpeGVkIGEgcmFjZSBjb25kaXRpb24gaW4gY2FzZSBvZiBjb25jdXJyZW50IGFjY2Vzc2VzIHRvIGlvY3RsKCkuCisgKiAyMDAwLzEyLzE2IDogZml4ZWQgaW1wcm9wZXIgdXNhZ2Ugb2YgcnRubF9leGxvY2tfbm93YWl0KCkuCisgKgorICogMjAwMS8xLzMgLSBDaGFkIE4uIFRpbmRlbCA8Y3RpbmRlbCBhdCBpZWVlIGRvdCBvcmc+CisgKiAgICAgLSBUaGUgYm9uZGluZyBkcml2ZXIgbm93IHNpbXVsYXRlcyBNSUkgc3RhdHVzIG1vbml0b3JpbmcsIGp1c3QgbGlrZQorICogICAgICAgYSBub3JtYWwgbmV0d29yayBkZXZpY2UuICBJdCB3aWxsIHNob3cgdGhhdCB0aGUgbGluayBpcyBkb3duIGlmZgorICogICAgICAgZXZlcnkgc2xhdmUgaW4gdGhlIGJvbmQgc2hvd3MgdGhhdCB0aGVpciBsaW5rcyBhcmUgZG93bi4gIElmIGF0IGxlYXN0CisgKiAgICAgICBvbmUgc2xhdmUgaXMgdXAsIHRoZSBib25kJ3MgTUlJIHN0YXR1cyB3aWxsIGFwcGVhciBhcyB1cC4KKyAqCisgKiAyMDAxLzIvNyAtIENoYWQgTi4gVGluZGVsIDxjdGluZGVsIGF0IGllZWUgZG90IG9yZz4KKyAqICAgICAtIEFwcGxpY2F0aW9ucyBjYW4gbm93IHF1ZXJ5IHRoZSBib25kIGZyb20gdXNlciBzcGFjZSB0byBnZXQKKyAqICAgICAgIGluZm9ybWF0aW9uIHdoaWNoIG1heSBiZSB1c2VmdWwuICBUaGV5IGRvIHRoaXMgYnkgY2FsbGluZworICogICAgICAgdGhlIEJPTkRfSU5GT19RVUVSWSBpb2N0bC4gIE9uY2UgdGhlIGFwcCBrbm93cyBob3cgbWFueSBzbGF2ZXMKKyAqICAgICAgIGFyZSBpbiB0aGUgYm9uZCwgaXQgY2FuIGNhbGwgdGhlIEJPTkRfU0xBVkVfSU5GT19RVUVSWSBpb2N0bCB0bworICogICAgICAgZ2V0IHNsYXZlIHNwZWNpZmljIGluZm9ybWF0aW9uICgjIGxpbmsgZmFpbHVyZXMsIGV0YykuICBTZWUKKyAqICAgICAgIDxsaW51eC9pZl9ib25kaW5nLmg+IGZvciBtb3JlIGRldGFpbHMuICBUaGUgc3RydWN0cyBvZiBpbnRlcmVzdAorICogICAgICAgYXJlIGlmYm9uZCBhbmQgaWZzbGF2ZS4KKyAqCisgKiAyMDAxLzQvNSAtIENoYWQgTi4gVGluZGVsIDxjdGluZGVsIGF0IGllZWUgZG90IG9yZz4KKyAqICAgICAtIFBvcnRlZCB0byAyLjQgS2VybmVsCisgKgorICogMjAwMS81LzIgLSBKZWZmcmV5IEUuIE1hc3QgPGplZmYgYXQgbWFzdGZhbWlseSBkb3QgY29tPgorICogICAgIC0gV2hlbiBhIGRldmljZSBpcyBkZXRhY2hlZCBmcm9tIGEgYm9uZCwgdGhlIHNsYXZlIGRldmljZSBpcyBubyBsb25nZXIKKyAqICAgICAgIGxlZnQgdGhpbmtpbmcgdGhhdCBpcyBoYXMgYSBtYXN0ZXIuCisgKgorICogMjAwMS81LzE2IC0gSmVmZnJleSBFLiBNYXN0IDxqZWZmIGF0IG1hc3RmYW1pbHkgZG90IGNvbT4KKyAqICAgICAtIG1lbXNldCBkaWQgbm90IGFwcHJvcHJpYXRlbHkgaW5pdGlhbGl6ZWQgdGhlIGJvbmQgcndfbG9ja3MuIFVzZWQKKyAqICAgICAgIHJ3bG9ja19pbml0IHRvIGluaXRpYWxpemUgdG8gdW5sb2NrZWQgc3RhdGUgdG8gcHJldmVudCBkZWFkbG9jayB3aGVuCisgKiAgICAgICBmaXJzdCBhdHRlbXB0aW5nIGEgbG9jaworICogICAgIC0gQ2FsbGVkIFNFVF9NT0RVTEVfT1dORVIgZm9yIGJvbmQgZGV2aWNlCisgKgorICogMjAwMS81LzE3IC0gVGltIEFuZGVyc29uIDx0c2EgYXQgbXZpc3RhLmNvbT4KKyAqICAgICAtIDIgcGF0aHMgZm9yIHJlbGVhc2luZyBmb3Igc2xhdmUgcmVsZWFzZTsgMSB0aHJvdWdoIGlvY3RsCisgKiAgICAgICBhbmQgMikgdGhyb3VnaCBjbG9zZS4gQm90aCBwYXRocyBuZWVkIHRvIHJlbGVhc2UgdGhlIHNhbWUgd2F5LgorICogICAgIC0gdGhlIGZyZWUgc2xhdmUgaW4gYm9uZCByZWxlYXNlIGlzIGNoYW5naW5nIHNsYXZlIHN0YXR1cyBiZWZvcmUKKyAqICAgICAgIHRoZSBmcmVlLiBUaGUgbmV0ZGV2X3NldF9tYXN0ZXIoKSBpcyBpbnRlbmRlZCB0byBjaGFuZ2Ugc2xhdmUgc3RhdGUKKyAqICAgICAgIHNvIGl0IHNob3VsZCBub3QgYmUgZG9uZSBhcyBwYXJ0IG9mIHRoZSByZWxlYXNlIHByb2Nlc3MuCisgKiAgICAgLSBTaW1wbGUgcnVsZSBmb3Igc2xhdmUgc3RhdGUgYXQgcmVsZWFzZTogb25seSB0aGUgYWN0aXZlIGluIEEvQiBhbmQKKyAqICAgICAgIG9ubHkgb25lIGluIHRoZSB0cnVua2VkIGNhc2UuCisgKgorICogMjAwMS82LzAxIC0gVGltIEFuZGVyc29uIDx0c2EgYXQgbXZpc3RhLmNvbT4KKyAqICAgICAtIE5vdyBjYWxsIGRldl9jbG9zZSB3aGVuIHJlbGVhc2luZyBhIHNsYXZlIHNvIGl0IGRvZXNuJ3Qgc2NyZXcgdXAKKyAqICAgICAgIG91dCByb3V0aW5nIHRhYmxlLgorICoKKyAqIDIwMDEvNi8wMSAtIENoYWQgTi4gVGluZGVsIDxjdGluZGVsIGF0IGllZWUgZG90IG9yZz4KKyAqICAgICAtIEFkZGVkIC9wcm9jIHN1cHBvcnQgZm9yIGdldHRpbmcgYm9uZCBhbmQgc2xhdmUgaW5mb3JtYXRpb24uCisgKiAgICAgICBJbmZvcm1hdGlvbiBpcyBpbiAvcHJvYy9uZXQvPGJvbmQgZGV2aWNlPi9pbmZvLgorICogICAgIC0gQ2hhbmdlZCB0aGUgbG9ja2luZyB3aGVuIGNhbGxpbmcgYm9uZF9jbG9zZSB0byBwcmV2ZW50IGRlYWRsb2NrLgorICoKKyAqIDIwMDEvOC8wNSAtIEphbmljZSBHaXJvdWFyZCA8Z2lyb3VhcmQgYXQgdXMuaWJtLmNvbT4KKyAqICAgICAtIGNvcnJlY3QgcHJvYmxlbSB3aGVyZSByZWZjbnQgb2Ygc2xhdmUgaXMgbm90IGluY3JlbWVudGVkIGluIGJvbmRfaW9jdGwKKyAqICAgICAgIHNvIHRoZSBzeXN0ZW0gaGFuZ3Mgd2hlbiBoYWx0aW5nLgorICogICAgIC0gY29ycmVjdCBsb2NraW5nIHByb2JsZW0gd2hlbiB1bmFibGUgdG8gbWFsbG9jIGluIGJvbmRfZW5zbGF2ZS4KKyAqICAgICAtIGFkZGluZyBib25kX3htaXRfeG9yIGxvZ2ljLgorICogICAgIC0gYWRkaW5nIG11bHRpcGxlIGJvbmQgZGV2aWNlIHN1cHBvcnQuCisgKgorICogMjAwMS84LzEzIC0gRXJpayBIYWJiaW5nYSA8ZXJpa19oYWJiaW5nYSBhdCBocCBkb3QgY29tPgorICogICAgIC0gY29ycmVjdCBsb2NraW5nIHByb2JsZW0gd2l0aCBydG5sX2V4bG9ja19ub3dhaXQKKyAqCisgKiAyMDAxLzgvMjMgLSBKYW5pY2UgR2lyb3VhcmQgPGdpcm91YXJkIGF0IHVzLmlibS5jb20+CisgKiAgICAgLSBiemVybyBpbml0aWFsIGRldl9ib25kcywgdG8gY29ycmVjdCBvb3BzCisgKiAgICAgLSBjb252ZXJ0IFNJT0NERVZQUklWQVRFIHRvIG5ldyBNSUkgaW9jdGwgY2FsbHMKKyAqCisgKiAyMDAxLzkvMTMgLSBUYWthbyBJbmRvaCA8aW5kb3UgZG90IHRha2FvIGF0IGpwIGRvdCBmdWppdHN1IGRvdCBjb20+CisgKiAgICAgLSBBZGQgdGhlIEJPTkRfQ0hBTkdFX0FDVElWRSBpb2N0bCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIDIwMDEvOS8xNCAtIE1hcmsgSHV0aCA8bWh1dGggYXQgbXZpc3RhIGRvdCBjb20+CisgKiAgICAgLSBDaGFuZ2UgTUlJX0xJTktfUkVBRFkgdG8gbm90IGNoZWNrIGZvciBlbmQgb2YgYXV0by1uZWdvdGlhdGlvbiwKKyAqICAgICAgIGJ1dCBvbmx5IGZvciBhbiB1cCBsaW5rLgorICoKKyAqIDIwMDEvOS8yMCAtIENoYWQgTi4gVGluZGVsIDxjdGluZGVsIGF0IGllZWUgZG90IG9yZz4KKyAqICAgICAtIEFkZCB0aGUgZGV2aWNlIGZpZWxkIHRvIGJvbmRpbmdfdC4gIFByZXZpb3VzbHkgdGhlIG5ldF9kZXZpY2UKKyAqICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gYSBib25kIHdhc24ndCBhdmFpbGFibGUgZnJvbSB0aGUgYm9uZGluZ190CisgKiAgICAgICBzdHJ1Y3R1cmUuCisgKgorICogMjAwMS85LzI1IC0gSmFuaWNlIEdpcm91YXJkIDxnaXJvdWFyZCBhdCB1cy5pYm0uY29tPgorICogICAgIC0gYWRkIGFycF9tb25pdG9yIGZvciBhY3RpdmUgYmFja3VwIG1vZGUKKyAqCisgKiAyMDAxLzEwLzIzIC0gVGFrYW8gSW5kb2ggPGluZG91IGRvdCB0YWthbyBhdCBqcCBkb3QgZnVqaXRzdSBkb3QgY29tPgorICogICAgIC0gVmFyaW91cyBtZW1vcnkgbGVhayBmaXhlcworICoKKyAqIDIwMDEvMTEvNSAtIE1hcmsgSHV0aCA8bWFyayBkb3QgaHV0aCBhdCBtdmlzdGEgZG90IGNvbT4KKyAqICAgICAtIERvbid0IHRha2UgcnRubCBsb2NrIGluIGJvbmRfbWlpX21vbml0b3IgYXMgaXQgZGVhZGxvY2tzIHVuZGVyCisgKiAgICAgICBjZXJ0YWluIGhvdHN3YXAgY29uZGl0aW9ucy4KKyAqICAgICAgIE5vdGU6ICB0aGlzIHNhbWUgY2hhbmdlIG1heSBiZSByZXF1aXJlZCBpbiBib25kX2FycF9tb25pdG9yID8/PworICogICAgIC0gUmVtb3ZlIHBvc3NpYmlsaXR5IG9mIGNhbGxpbmcgYm9uZF9zZXRod2FkZHIgd2l0aCBOVUxMIHNsYXZlX2RldiBwdHIKKyAqICAgICAtIEhhbmRsZSBob3Qgc3dhcCBldGhlcm5ldCBpbnRlcmZhY2UgZGVyZWdpc3RyYXRpb24gZXZlbnRzIHRvIHJlbW92ZQorICogICAgICAga2VybmVsIG9vcHMgZm9sbG93aW5nIGhvdCBzd2FwIG9mIGVuc2xhdmVkIGludGVyZmFjZQorICoKKyAqIDIwMDIvMS8yIC0gQ2hhZCBOLiBUaW5kZWwgPGN0aW5kZWwgYXQgaWVlZSBkb3Qgb3JnPgorICogICAgIC0gUmVzdG9yZSBvcmlnaW5hbCBzbGF2ZSBmbGFncyBhdCByZWxlYXNlIHRpbWUuCisgKgorICogMjAwMi8wMi8xOCAtIEVyaWsgSGFiYmluZ2EgPGVyaWtfaGFiYmluZ2EgYXQgaHAgZG90IGNvbT4KKyAqICAgICAtIGJvbmRfcmVsZWFzZSgpOiBjYWxsaW5nIGtmcmVlIG9uIG91cl9zbGF2ZSBhZnRlciBjYWxsIHRvCisgKiAgICAgICBib25kX3Jlc3RvcmVfc2xhdmVfZmxhZ3MsIG5vdCBiZWZvcmUKKyAqICAgICAtIGJvbmRfZW5zbGF2ZSgpOiBzYXZpbmcgc2xhdmUgZmxhZ3MgaW50byBvcmlnaW5hbF9mbGFncyBiZWZvcmUKKyAqICAgICAgIGNhbGwgdG8gbmV0ZGV2X3NldF9tYXN0ZXIsIHNvIHRoZSBJRkZfU0xBVkUgZmxhZyBkb2Vzbid0IGVuZAorICogICAgICAgdXAgaW4gb3JpZ2luYWxfZmxhZ3MKKyAqCisgKiAyMDAyLzA0LzA1IC0gTWFyayBTbWl0aCA8bWFyay5zbWl0aCBhdCBjb21kZXYgZG90IGNjPiBhbmQKKyAqICAgICAgICAgICAgICBTdGV2ZSBNZWFkIDxzdGV2ZS5tZWFkIGF0IGNvbWRldiBkb3QgY2M+CisgKiAgICAgLSBQb3J0IEdsZWIgTmF0YXBvdidzIG11bHRpY2FzdCBzdXBwb3J0IHBhdGNocyBmcm9tIDIuNC4xMgorICogICAgICAgdG8gMi40LjE4IGFkZGluZyBzdXBwb3J0IGZvciBtdWx0aWNhc3QuCisgKgorICogMjAwMi8wNi8xMCAtIFRvbnkgQ3VyZWluZ3RvbiA8dG9ueS5jdXJlaW5ndG9uICogaHBfY29tPgorICogICAgIC0gY29ycmVjdGVkIHVuaW5pdGlhbGl6ZWQgcG9pbnRlciAoaWZyLmlmcl9kYXRhKSBpbiBib25kX2NoZWNrX2Rldl9saW5rOworICogICAgICAgYWN0dWFsbHkgY2hhbmdlZCBmdW5jdGlvbiB0byB1c2UgTUlJUEhZLCB0aGVuIE1JSVJFRywgYW5kIGZpbmFsbHkKKyAqICAgICAgIEVUSFRPT0wgdG8gZGV0ZXJtaW5lIHRoZSBsaW5rIHN0YXR1cworICogICAgIC0gZml4ZWQgYmFkIGlmcl9kYXRhIHBvaW50ZXIgYXNzaWdubWVudHMgaW4gYm9uZF9pb2N0bAorICogICAgIC0gY29ycmVjdGVkIG1vZGUgMSBiZWluZyByZXBvcnRlZCBhcyBhY3RpdmUtYmFja3VwIGluIGJvbmRfZ2V0X2luZm87CisgKiAgICAgICBhbHNvIGFkZGVkIHRleHQgdG8gZGlzdGluZ3Vpc2ggdHlwZSBvZiBsb2FkIGJhbGFuY2luZyAocnIgb3IgeG9yKQorICogICAgIC0gY2hhbmdlIGFycF9pcF90YXJnZXQgbW9kdWxlIHBhcmFtIGZyb20gIjEtMTJzIiAoYXJyYXkgb2YgMTIgcHRycykKKyAqICAgICAgIHRvICJzIiAoYSBzaW5nbGUgcHRyKQorICoKKyAqIDIwMDIvMDgvMzAgLSBKYXkgVm9zYnVyZ2ggPGZ1YmFyIGF0IHVzIGRvdCBpYm0gZG90IGNvbT4KKyAqICAgICAtIFJlbW92ZWQgYWNxdWlzaXRpb24gb2YgeG1pdF9sb2NrIGluIHNldF9tdWx0aWNhc3RfbGlzdDsgY2F1c2VkCisgKiAgICAgICBkZWFkbG9jayBvbiBTTVAgKGxvY2sgaXMgaGVsZCBieSBjYWxsZXIpLgorICogICAgIC0gUmV2YW1wZWQgU0lPQ0dNSUlQSFksIFNJT0NHTUlJUkVHIHBvcnRpb24gb2YgYm9uZF9jaGVja19kZXZfbGluaygpLgorICoKKyAqIDIwMDIvMDkvMTggLSBKYXkgVm9zYnVyZ2ggPGZ1YmFyIGF0IHVzIGRvdCBpYm0gZG90IGNvbT4KKyAqICAgICAtIEZpeGVkIHVwIGJvbmRfY2hlY2tfZGV2X2xpbmsoKSAoYW5kIGNhbGxlcnMpOiByZW1vdmVkIHNvbWUgbWFnaWMKKyAqCSBudW1iZXJzLCBiYW5pc2hlZCBsb2NhbCBNSUlfIGRlZmluZXMsIHdyYXBwZWQgaW9jdGwgY2FsbHMgdG8KKyAqCSBwcmV2ZW50IEVGQVVMVCBlcnJvcnMKKyAqCisgKiAyMDAyLzkvMzAgLSBKYXkgVm9zYnVyZ2ggPGZ1YmFyIGF0IHVzIGRvdCBpYm0gZG90IGNvbT4KKyAqICAgICAtIG1ha2Ugc3VyZSB0aGUgaXAgdGFyZ2V0IG1hdGNoZXMgdGhlIGFycF90YXJnZXQgYmVmb3JlIHNhdmluZyB0aGUKKyAqCSBodyBhZGRyZXNzLgorICoKKyAqIDIwMDIvOS8zMCAtIERhbiBFaXNuZXIgPGVpc25lciBhdCAycm9ib3RzIGRvdCBjb20+CisgKiAgICAgLSBtYWtlIHN1cmUgbXlfaXAgaXMgc2V0IGJlZm9yZSB0YWtpbmcgZG93biB0aGUgbGluaywgc2luY2UKKyAqCSBub3QgYWxsIHN3aXRjaGVzIHJlc3BvbmQgaWYgdGhlIHNvdXJjZSBpcCBpcyBub3Qgc2V0LgorICoKKyAqIDIwMDIvMTAvOCAtIEphbmljZSBHaXJvdWFyZCA8Z2lyb3VhcmQgYXQgdXMgZG90IGlibSBkb3QgY29tPgorICogICAgIC0gcmVhZCBpbiB0aGUgbG9jYWwgaXAgYWRkcmVzcyB3aGVuIGVuc2xhdmluZyBhIGRldmljZQorICogICAgIC0gYWRkIHByaW1hcnkgc3VwcG9ydAorICogICAgIC0gbWFrZSBzdXJlIDIqYXJwX2ludGVydmFsIGhhcyBwYXNzZWQgd2hlbiBhIG5ldyBkZXZpY2UKKyAqICAgICAgIGlzIGJyb3VnaHQgb24tbGluZSBiZWZvcmUgdGFraW5nIGl0IGRvd24uCisgKgorICogMjAwMi8wOS8xMSAtIFBoaWxpcHBlIERlIE11eXRlciA8cGhkbSBhdCBtYWNxZWwgZG90IGJlPgorICogICAgIC0gQWRkZWQgYm9uZF94bWl0X2Jyb2FkY2FzdCBsb2dpYy4KKyAqICAgICAtIEFkZGVkIGJvbmRfbW9kZSgpIHN1cHBvcnQgZnVuY3Rpb24uCisgKgorICogMjAwMi8xMC8yNiAtIExhdXJlbnQgRGVuaWVsIDxsYXVyZW50LmRlbmllbCBhdCBmcmVlLmZyPgorICogICAgIC0gYWxsb3cgdG8gcmVnaXN0ZXIgbXVsdGljYXN0IGFkZHJlc3NlcyBvbmx5IG9uIGFjdGl2ZSBzbGF2ZQorICogICAgICAgKHVzZWZ1bCBpbiBhY3RpdmUtYmFja3VwIG1vZGUpCisgKiAgICAgLSBhZGQgbXVsdGljYXN0IG1vZHVsZSBwYXJhbWV0ZXIKKyAqICAgICAtIGZpeCBkZWxldGlvbiBvZiBtdWx0aWNhc3QgZ3JvdXBzIGFmdGVyIHVubG9hZGluZyBtb2R1bGUKKyAqCisgKiAyMDAyLzExLzA2IC0gS2FtZXNod2FyYSBSYXlhcHJvbHUgPGthbWVzaHdhcmEucmFvICogd2lwcm9fY29tPgorICogICAgIC0gQ2hhbmdlcyB0byBwcmV2ZW50IHBhbmljIGZyb20gY2xvc2luZyB0aGUgZGV2aWNlIHR3aWNlOyBpZiB3ZSBjbG9zZQorICogICAgICAgdGhlIGRldmljZSBpbiBib25kX3JlbGVhc2UsIHdlIG11c3Qgc2V0IHRoZSBvcmlnaW5hbF9mbGFncyB0byBkb3duCisgKiAgICAgICBzbyBpdCB3b24ndCBiZSBjbG9zZWQgYWdhaW4gYnkgdGhlIG5ldHdvcmsgbGF5ZXIuCisgKgorICogMjAwMi8xMS8wNyAtIFRvbnkgQ3VyZWluZ3RvbiA8dG9ueS5jdXJlaW5ndG9uICogaHBfY29tPgorICogICAgIC0gRml4IGFycF90YXJnZXRfaHdfYWRkciBtZW1vcnkgbGVhaworICogICAgIC0gQ3JlYXRlZCBhY3RpdmViYWNrdXBfYXJwX21vbml0b3IgZnVuY3Rpb24gdG8gaGFuZGxlIGFycCBtb25pdG9yaW5nCisgKiAgICAgICBpbiBhY3RpdmUgYmFja3VwIG1vZGUgLSB0aGUgYm9uZF9hcnBfbW9uaXRvciBoYWQgc2V2ZXJhbCBwcm9ibGVtcy4uLgorICogICAgICAgc3VjaCBhcyBhbGxvd2luZyBzbGF2ZXMgdG8gdHggYXJwcyBzZXF1ZW50aWFsbHkgd2l0aG91dCBhbnkgZGVsYXkKKyAqICAgICAgIGZvciBhIHJlc3BvbnNlCisgKiAgICAgLSBSZW5hbWVkIGJvbmRfYXJwX21vbml0b3IgdG8gbG9hZGJhbGFuY2VfYXJwX21vbml0b3IgYW5kIHJlLXdyb3RlCisgKiAgICAgICB0aGlzIGZ1bmN0aW9uIHRvIGp1c3QgaGFuZGxlIGFycCBtb25pdG9yaW5nIGluIGxvYWQtYmFsYW5jaW5nIG1vZGU7CisgKiAgICAgICBpdCBpcyBhIGxvdCBtb3JlIGNvbXBhY3Qgbm93CisgKiAgICAgLSBDaGFuZ2VzIHRvIGVuc3VyZSBvbmUgYW5kIG9ubHkgb25lIHNsYXZlIHRyYW5zbWl0cyBpbiBhY3RpdmUtYmFja3VwCisgKiAgICAgICBtb2RlCisgKiAgICAgLSBSb2J1c3Rlc2l6ZSBwYXJhbWV0ZXJzOyB3YXJuIHVzZXJzIGFib3V0IGJhZCBjb21iaW5hdGlvbnMgb2YKKyAqICAgICAgIHBhcmFtZXRlcnM7IGFsc28gaWYgbWlpbW9uIGlzIHNwZWNpZmllZCBhbmQgYSBuZXR3b3JrIGRyaXZlciBkb2VzCisgKiAgICAgICBub3Qgc3VwcG9ydCBNSUkgb3IgRVRIVE9PTCwgaW5mb3JtIHRoZSB1c2VyIG9mIHRoaXMKKyAqICAgICAtIENoYW5nZXMgdG8gc3VwcG9ydCBsaW5rX2ZhaWx1cmVfY291bnQgd2hlbiBpbiBhcnAgbW9uaXRvcmluZyBtb2RlCisgKiAgICAgLSBGaXggdXAvZG93biBkZWxheSByZXBvcnRlZCBpbiAvcHJvYworICogICAgIC0gQWRkZWQgdmVyc2lvbjsgbG9nIHZlcnNpb247IG1ha2UgdmVyc2lvbiBhdmFpbGFibGUgZnJvbSAibW9kaW5mbyAtZCIKKyAqICAgICAtIEZpeGVkIHByb2JsZW0gaW4gYm9uZF9jaGVja19kZXZfbGluayAtIGlmIHRoZSBmaXJzdCBJT0NUTCAoU0lPQ0dNSUlQSCkKKyAqCSBmYWlsZWQsIHRoZSBFVEhUT09MIGlvY3RsIG5ldmVyIGdvdCBhIGNoYW5jZQorICoKKyAqIDIwMDIvMTEvMTYgLSBMYXVyZW50IERlbmllbCA8bGF1cmVudC5kZW5pZWwgYXQgZnJlZS5mcj4KKyAqICAgICAtIGZpeCBtdWx0aWNhc3QgaGFuZGxpbmcgaW4gYWN0aXZlYmFja3VwX2FycF9tb25pdG9yCisgKiAgICAgLSByZW1vdmUgb25lIHVubmVjZXNzYXJ5IGFuZCBjb25mdXNpbmcgY3Vycl9hY3RpdmVfc2xhdmUgPT0gc2xhdmUgdGVzdAorICoJIGluIGFjdGl2ZWJhY2t1cF9hcnBfbW9uaXRvcgorICoKKyAqICAyMDAyLzExLzE3IC0gTGF1cmVudCBEZW5pZWwgPGxhdXJlbnQuZGVuaWVsIGF0IGZyZWUuZnI+CisgKiAgICAgLSBmaXggYm9uZF9zbGF2ZV9pbmZvX3F1ZXJ5IHdoZW4gc2xhdmVfaWQgPSBudW1fc2xhdmVzCisgKgorICogIDIwMDIvMTEvMTkgLSBKYW5pY2UgR2lyb3VhcmQgPGdpcm91YXJkIGF0IHVzIGRvdCBpYm0gZG90IGNvbT4KKyAqICAgICAtIGNvcnJlY3QgaWZyX2RhdGEgcmVmZXJlbmNlLiAgVXBkYXRlIGlmcl9kYXRhIHJlZmVyZW5jZQorICogICAgICAgdG8gbWlpX2lvY3RsX2RhdGEgc3RydWN0IHZhbHVlcyB0byBhdm9pZCBjb25mdXNpb24uCisgKgorICogIDIwMDIvMTEvMjIgLSBCZXJ0IEJhcmJlIDxiZXJ0LmJhcmJlIGF0IG9yYWNsZSBkb3QgY29tPgorICogICAgICAtIEFkZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBhcnBfaXBfdGFyZ2V0CisgKgorICogIDIwMDIvMTIvMTMgLSBKYXkgVm9zYnVyZ2ggPGZ1YmFyIGF0IHVzIGRvdCBpYm0gZG90IGNvbT4KKyAqCS0gQ2hhbmdlZCB0byBhbGxvdyB0ZXh0IHN0cmluZ3MgZm9yIG1vZGUgYW5kIG11bHRpY2FzdCwgZS5nLiwKKyAqCSAgaW5zbW9kIGJvbmRpbmcgbW9kZT1hY3RpdmUtYmFja3VwLiAgVGhlIG51bWJlcnMgc3RpbGwgd29yay4KKyAqCSAgT25lIGNoYW5nZTogYW4gaW52YWxpZCBjaG9pY2Ugd2lsbCBjYXVzZSBtb2R1bGUgbG9hZCBmYWlsdXJlLAorICoJICByYXRoZXIgdGhhbiB0aGUgcHJldmlvdXMgYmVoYXZpb3Igb2YganVzdCBwaWNraW5nIG9uZS4KKyAqCS0gTWlub3IgY2xlYW51cHM7IGdvdCByaWQgb2YgZHVwIGN0eXBlIHN0dWZmLCBhdG9pIGZ1bmN0aW9uCisgKgorICogMjAwMy8wMi8wNyAtIEpheSBWb3NidXJnaCA8ZnViYXIgYXQgdXMgZG90IGlibSBkb3QgY29tPgorICoJLSBBZGRlZCB1c2VfY2FycmllciBtb2R1bGUgcGFyYW1ldGVyIHRoYXQgY2F1c2VzIG1paW1vbiB0bworICoJICB1c2UgbmV0aWZfY2Fycmllcl9vaygpIHRlc3QgaW5zdGVhZCBvZiBNSUkvRVRIVE9PTCBpb2N0bHMuCisgKgktIE1pbm9yIGNsZWFudXBzOyBjb25zb2xpZGF0ZWQgaW9jdGwgY2FsbHMgdG8gb25lIGZ1bmN0aW9uLgorICoKKyAqIDIwMDMvMDIvMDcgLSBUb255IEN1cmVpbmd0b24gPHRvbnkuY3VyZWluZ3RvbiAqIGhwX2NvbT4KKyAqCS0gRml4IGJvbmRfbWlpX21vbml0b3IoKSBsb2dpYyBlcnJvciB0aGF0IGNvdWxkIHJlc3VsdCBpbgorICoJICBib25kaW5nIHJvdW5kLXJvYmluIG1vZGUgaWdub3JpbmcgbGlua3MgYWZ0ZXIgZmFpbG92ZXIvcmVjb3ZlcnkKKyAqCisgKiAyMDAzLzAzLzE3IC0gSmF5IFZvc2J1cmdoIDxmdWJhciBhdCB1cyBkb3QgaWJtIGRvdCBjb20+CisgKgktIGttYWxsb2MgZml4IChHRlBfS0VSTkVMIHRvIEdGUF9BVE9NSUMpIHJlcG9ydGVkIGJ5CisgKgkgIFNobXVsaWsgZG90IEhlbiBhdCBpbnRlbC5jb20uCisgKgktIEJhc2VkIG9uIGRpc2N1c3Npb24gb24gbWFpbGluZyBsaXN0LCBjaGFuZ2VkIHVzZSBvZgorICoJICB1cGRhdGVfc2xhdmVfY250KCksIGNyZWF0ZWQgd3JhcHBlciBmdW5jdGlvbnMgZm9yIGFkZGluZy9yZW1vdmluZworICoJICBzbGF2ZXMsIGNoYW5nZWQgYm9uZF94bWl0X3hvcigpIHRvIGNoZWNrIHNsYXZlX2NudCBpbnN0ZWFkIG9mCisgKgkgIGNoZWNraW5nIHNsYXZlIGFuZCBzbGF2ZS0+ZGV2ICh3aGljaCBvbmx5IHdvcmtlZCBieSBhY2NpZGVudCkuCisgKgktIE1pc2MgY29kZSBjbGVhbnVwOiBnZXQgYXJwX3NlbmQoKSBwcm90b3R5cGUgZnJvbSBoZWFkZXIgZmlsZSwKKyAqCSAgYWRkIG1heF9ib25kcyB0byBib25kaW5nLnR4dC4KKyAqCisgKiAyMDAzLzAzLzE4IC0gVHNpcHB5IE1lbmRlbHNvbiA8dHNpcHB5Lm1lbmRlbHNvbiBhdCBpbnRlbCBkb3QgY29tPiBhbmQKKyAqCQlTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gTWFrZSBzdXJlIG9ubHkgYm9uZF9hdHRhY2hfc2xhdmUoKSBhbmQgYm9uZF9kZXRhY2hfc2xhdmUoKSBjYW4KKyAqCSAgbWFuaXB1bGF0ZSB0aGUgc2xhdmUgbGlzdCwgaW5jbHVkaW5nIHNsYXZlX2NudCwgZXZlbiB3aGVuIGluCisgKgkgIGJvbmRfcmVsZWFzZV9hbGwoKS4KKyAqCS0gRml4ZWQgaGFuZyBpbiBib25kX3JlbGVhc2UoKSB3aXRoIHRyYWZmaWMgcnVubmluZzoKKyAqCSAgbmV0ZGV2X3NldF9tYXN0ZXIoKSBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGJvbmQgbG9jay4KKyAqCisgKiAyMDAzLzAzLzE4IC0gVHNpcHB5IE1lbmRlbHNvbiA8dHNpcHB5Lm1lbmRlbHNvbiBhdCBpbnRlbCBkb3QgY29tPiBhbmQKKyAqCQlTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gRml4ZWQgaGFuZyBpbiBib25kX2Vuc2xhdmUoKSB3aXRoIHRyYWZmaWMgcnVubmluZzoKKyAqCSAgbmV0ZGV2X3NldF9tYXN0ZXIoKSBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGJvbmQgbG9jay4KKyAqCisgKiAyMDAzLzAzLzE4IC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQWRkZWQgc3VwcG9ydCBmb3IgZ2V0dGluZyBzbGF2ZSdzIHNwZWVkIGFuZCBkdXBsZXggdmlhIGV0aHRvb2wuCisgKgkgIE5lZWRlZCBmb3IgODAyLjNhZCBhbmQgb3RoZXIgZnV0dXJlIG1vZGVzLgorICoKKyAqIDIwMDMvMDMvMTggLSBUc2lwcHkgTWVuZGVsc29uIDx0c2lwcHkubWVuZGVsc29uIGF0IGludGVsIGRvdCBjb20+IGFuZAorICoJCVNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBFbmFibGUgc3VwcG9ydCBvZiBtb2RlcyB0aGF0IG5lZWQgdG8gdXNlIHRoZSB1bmlxdWUgbWFjIGFkZHJlc3Mgb2YKKyAqCSAgZWFjaCBzbGF2ZS4KKyAqCSAgKiBib25kX2Vuc2xhdmUoKTogTW92ZWQgc2V0dGluZyB0aGUgc2xhdmUncyBtYWMgYWRkcmVzcywgYW5kCisgKgkgICAgb3Blbm5pbmcgaXQsIGZyb20gdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBkcml2ZXIuIFRoaXMgYnJlYWtzCisgKgkgICAgYmFja3dhcmQgY29tYXB0aWJpbGl0eSB3aXRoIG9sZCB2ZXJzaW9ucyBvZiBpZmVuc2xhdmUgdGhhdCBvcGVuCisgKgkgICAgIHRoZSBzbGF2ZSBiZWZvcmUgZW5hbHN2aW5nIGl0ICEhIS4KKyAqCSAgKiBib25kX3JlbGVhc2UoKTogVGhlIGRyaXZlciBhbHNvIHRha2VzIGNhcmUgb2YgY2xvc2luZyB0aGUgc2xhdmUKKyAqCSAgICBhbmQgcmVzdG9yaW5nIGl0cyBvcmlnaW5hbCBtYWMgYWRkcmVzcy4KKyAqCS0gUmVtb3ZlZCB0aGUgY29kZSB0aGF0IHJlc3RvcmVzIGFsbCBiYXNlIGRyaXZlcidzIGZsYWdzLgorICoJICBGbGFncyBhcmUgYXV0b21hdGljYWxseSByZXN0b3JlZCBvbmNlIGFsbCB1bmRvIHN0YWdlcyBhcmUgZG9uZQorICoJICBwcm9wZXJseS4KKyAqCS0gQmxvY2sgcG9zc2liaWxpdHkgb2YgZW5zbGF2aW5nIGJlZm9yZSB0aGUgbWFzdGVyIGlzIHVwLiBUaGlzCisgKgkgIHByZXZlbnRzIHB1dHRpbmcgdGhlIHN5c3RlbSBpbiBhbiB1bnN0YWJsZSBzdGF0ZS4KKyAqCisgKiAyMDAzLzAzLzE4IC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4sCisgKgkJVHNpcHB5IE1lbmRlbHNvbiA8dHNpcHB5Lm1lbmRlbHNvbiBhdCBpbnRlbCBkb3QgY29tPiBhbmQKKyAqCQlTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQWRkZWQgc3VwcG9ydCBmb3IgSUVFRSA4MDIuM2FkIER5bmFtaWMgbGluayBhZ2dyZWdhdGlvbiBtb2RlLgorICoKKyAqIDIwMDMvMDUvMDEgLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBBZGRlZCBBQkkgdmVyc2lvbiBjb250cm9sIHRvIHJlc3RvcmUgY29tcGF0aWJpbGl0eSBiZXR3ZWVuCisgKgkgIG5ldy9vbGQgaWZlbnNsYXZlIGFuZCBuZXcvb2xkIGJvbmRpbmcuCisgKgorICogMjAwMy8wNS8wMSAtIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBGaXhlZCBidWcgaW4gYm9uZF9yZWxlYXNlX2FsbCgpOiBzYXZlIG9sZCB2YWx1ZSBvZiBjdXJyX2FjdGl2ZV9zbGF2ZQorICoJICBiZWZvcmUgc2V0dGluZyBpdCB0byBOVUxMLgorICoJLSBDaGFuZ2VkIGRyaXZlciB2ZXJzaW9uaW5nIHNjaGVtZSB0byBpbmNsdWRlIHZlcnNpb24gbnVtYmVyIGluc3RlYWQKKyAqCSAgb2YgcmVsZWFzZSBkYXRlICh0aGF0IGlzIGFscmVhZHkgaW4gYW5vdGhlciBmaWVsZCkuIFRoZXJlIGFyZSAzCisgKgkgIGZpZWxkcyBYLlkuWiB3aGVyZToKKyAqCQlYIC0gTWFqb3IgdmVyc2lvbiAtIGJpZyBiZWhhdmlvciBjaGFuZ2VzCisgKgkJWSAtIE1pbm9yIHZlcnNpb24gLSBhZGRpdGlvbiBvZiBmZWF0dXJlcworICoJCVogLSBFeHRyYSB2ZXJzaW9uIC0gbWlub3IgY2hhbmdlcyBhbmQgYnVnIGZpeGVzCisgKgkgIFRoZSBjdXJyZW50IHZlcnNpb24gaXMgMS4wLjAgYXMgYSBiYXNlIGxpbmUuCisgKgorICogMjAwMy8wNS8wMSAtIFRzaXBweSBNZW5kZWxzb24gPHRzaXBweS5tZW5kZWxzb24gYXQgaW50ZWwgZG90IGNvbT4gYW5kCisgKgkJQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQWRkZWQgc3VwcG9ydCBmb3IgbGFjcF9yYXRlIG1vZHVsZSBwYXJhbS4KKyAqCS0gQ29kZSBiZWF1dGlmaWNhdGlvbiBhbmQgc3R5bGUgY2hhbmdlcyAobWFpbmx5IGluIGNvbW1lbnRzKS4KKyAqCSAgbmV3IHZlcnNpb24gLSAxLjAuMQorICoKKyAqIDIwMDMvMDUvMDEgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQmFzZWQgb24gZGlzY3Vzc2lvbiBvbiBtYWlsaW5nIGxpc3QsIGNoYW5nZWQgbG9ja2luZyBzY2hlbWUKKyAqCSAgdG8gdXNlIGxvY2svdW5sb2NrIG9yIGxvY2tfYmgvdW5sb2NrX2JoIGFwcHJvcHJpYXRlbHkgaW5zdGVhZAorICoJICBvZiBsb2NrX2lycXNhdmUvdW5sb2NrX2lycXJlc3RvcmUuIFRoZSBuZXcgc2NoZW1lIGhlbHBzIGV4cG9zaW5nCisgKgkgIGhpZGRlbiBidWdzIGFuZCBzb2x2ZXMgc3lzdGVtIGhhbmdzIHRoYXQgb2NjdXJyZWQgZHVlIHRvIHRoZSBmYWN0CisgKgkgIHRoYXQgaG9sZGluZyBsb2NrX2lycXNhdmUgZG9lc24ndCBwcmV2ZW50IHNvZnRpcnFzIGZyb20gcnVubmluZy4KKyAqCSAgVGhpcyBhbHNvIGluY3JlYXNlcyB0b3RhbCB0aHJvdWdocHV0IHNpbmNlIGludGVycnVwdHMgYXJlIG5vdAorICoJICBibG9ja2VkIG9uIGVhY2ggdHJhbnNtaXR0ZWQgcGFja2V0cyBvciBtb25pdG9yIHRpbWVvdXQuCisgKgkgIG5ldyB2ZXJzaW9uIC0gMi4wLjAKKyAqCisgKiAyMDAzLzA1LzAxIC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIEFkZGVkIHN1cHBvcnQgZm9yIFRyYW5zbWl0IGxvYWQgYmFsYW5jaW5nIG1vZGUuCisgKgktIENvbmNlbnRyYXRlIGFsbCBhc3NpZ25tZW50cyBvZiBjdXJyX2FjdGl2ZV9zbGF2ZSB0byBhIHNpbmdsZSBwb2ludAorICoJICBzbyBzcGVjaWZpYyBtb2RlcyBjYW4gdGFrZSBhY3Rpb25zIHdoZW4gdGhlIHByaW1hcnkgYWRhcHRlciBpcworICoJICBjaGFuZ2VkLgorICoJLSBUYWtlIHRoZSB1cGRlbGF5IHBhcmFtZXRlciBpbnRvIGNvbnNpZGVyYXRpb24gZHVyaW5nIGJvbmRfZW5zbGF2ZQorICoJICBzaW5jZSBzb21lIGFkYXB0ZXJzIGxvb3NlIHRoZWlyIGxpbmsgZHVyaW5nIHNldHRpbmcgdGhlIGRldmljZS4KKyAqCS0gUmVuYW1lZCBib25kXzNhZF9saW5rX3N0YXR1c19jaGFuZ2VkKCkgdG8KKyAqCSAgYm9uZF8zYWRfaGFuZGxlX2xpbmtfY2hhbmdlKCkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBUTEIuCisgKgkgIG5ldyB2ZXJzaW9uIC0gMi4xLjAKKyAqCisgKiAyMDAzLzA1LzAxIC0gVHNpcHB5IE1lbmRlbHNvbiA8dHNpcHB5Lm1lbmRlbHNvbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBBZGRlZCBzdXBwb3J0IGZvciBBZGFwdGl2ZSBsb2FkIGJhbGFuY2luZyBtb2RlIHdoaWNoIGlzCisgKgkgIGVxdWl2YWxlbnQgdG8gVHJhbnNtaXQgbG9hZCBiYWxhbmNpbmcgKyBSZWNlaXZlIGxvYWQgYmFsYW5jaW5nLgorICoJICBuZXcgdmVyc2lvbiAtIDIuMi4wCisgKgorICogMjAwMy8wNS8xNSAtIEpheSBWb3NidXJnaCA8ZnViYXIgYXQgdXMgZG90IGlibSBkb3QgY29tPgorICoJLSBBcHBsaWVkIGZpeCB0byBhY3RpdmViYWNrdXBfYXJwX21vbml0b3IgcG9zdGVkIHRvIGJvbmRpbmctZGV2ZWwKKyAqCSAgYnkgVG9ueSBDdXJlaW5ndG9uIDx0b255LmN1cmVpbmd0b24gKiBocF9jb20+LiAgRml4ZXMgQVJQCisgKgkgIG1vbml0b3IgZW5kbGVzcyBmYWlsb3ZlciBidWcuICBWZXJzaW9uIHRvIDIuMi4xMAorICoKKyAqIDIwMDMvMDUvMjAgLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBGaXhlZCBidWcgaW4gQUJJIHZlcnNpb24gY29udHJvbCAtIERvbid0IGNvbW1pdCB0byBhIHNwZWNpZmljCisgKgkgIEFCSSB2ZXJzaW9uIGlmIHJlY2VpdmluZyB1bnN1cHBvcnRlZCBpb2N0bCBjb21tYW5kcy4KKyAqCisgKiAyMDAzLzA1LzIyIC0gSmF5IFZvc2J1cmdoIDxmdWJhciBhdCB1cyBkb3QgaWJtIGRvdCBjb20+CisgKgktIEZpeCBpZmVuc2xhdmUgLWMgY2F1c2luZyBib25kIHRvIGxvb3NlIGV4aXN0aW5nIHJvdXRlczsKKyAqCSAgYWRkZWQgYm9uZF9zZXRfbWFjX2FkZHJlc3MoKSB0aGF0IGRvZXNuJ3QgcmVxdWlyZSB0aGUKKyAqCSAgYm9uZCB0byBiZSBkb3duLgorICoJLSBJbiBjb25qdW5jdGlvbiB3aXRoIGZpeCBmb3IgaWZlbnNsYXZlIC1jLCBpbgorICoJICBib25kX2NoYW5nZV9hY3RpdmUoKSwgY2hhbmdpbmcgdG8gdGhlIGFscmVhZHkgYWN0aXZlIHNsYXZlCisgKgkgIGlzIG5vIGxvbmdlciBhbiBlcnJvciAoaXQgc3VjY2Vzc2Z1bGx5IGRvZXMgbm90aGluZykuCisgKgorICogMjAwMy8wNi8zMCAtIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKiAJLSBGaXhlZCBib25kX2NoYW5nZV9hY3RpdmUoKSBmb3IgQUxCL1RMQiBtb2Rlcy4KKyAqCSAgVmVyc2lvbiB0byAyLjIuMTQuCisgKgorICogMjAwMy8wNy8yOSAtIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKiAJLSBGaXhlZCBBUlAgbW9uaXRvcmluZyBidWcuCisgKgkgIFZlcnNpb24gdG8gMi4yLjE1LgorICoKKyAqIDIwMDMvMDcvMzEgLSBXaWxseSBUYXJyZWF1IDx3aWxseSBhdCBvZHMgZG90IG9yZz4KKyAqIAktIEZpeGVkIGtlcm5lbCBwYW5pYyB3aGVuIHVzaW5nIEFSUCBtb25pdG9yaW5nIHdpdGhvdXQKKyAqCSAgc2V0dGluZyBib25kJ3MgSVAgYWRkcmVzcy4KKyAqCSAgVmVyc2lvbiB0byAyLjIuMTYuCisgKgorICogMjAwMy8wOC8wNiAtIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKiAJLSBCYWNrIHBvcnQgZnJvbSAyLjY6IHVzZSBhbGxvY19uZXRkZXYoKTsgZml4IC9wcm9jIGhhbmRsaW5nOworICoJICBtYWRlIHN0YXRzIGEgcGFydCBvZiBib25kIHN0cnVjdCBzbyBubyBuZWVkIHRvIGFsbG9jYXRlCisgKgkgIGFuZCBmcmVlIGl0IHNlcGFyYXRlbHk7IHVzZSBzdGFuZGFyZCBsaXN0IG9wZXJhdGlvbnMgaW5zdGVhZAorICoJICBvZiBwcmUtYWxsb2NhdGVkIGFycmF5IG9mIGJvbmRzLgorICoJICBWZXJzaW9uIHRvIDIuMy4wLgorICoKKyAqIDIwMDMvMDgvMDcgLSBKYXkgVm9zYnVyZ2ggPGZ1YmFyIGF0IHVzIGRvdCBpYm0gZG90IGNvbT4sCisgKgkgICAgICAgQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4gYW5kCisgKgkgICAgICAgU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIFByb3BhZ2F0aW5nIG1hc3RlcidzIHNldHRpbmdzOiBEaXN0aW5ndWlzaCBiZXR3ZWVuIG1vZGVzIHRoYXQKKyAqCSAgdXNlIGEgcHJpbWFyeSBzbGF2ZSBmcm9tIHRob3NlIHRoYXQgZG9uJ3QsIGFuZCBwcm9wYWdhdGUgc2V0dGluZ3MKKyAqCSAgYWNjb3JkaW5nbHk7IENvbnNvbGlkYXRlIGNoYW5nZV9hY3RpdmUgb3BlYXJ0aW9ucyBhbmQgYWRkCisgKgkgIHJlc2VsZWN0X2FjdGl2ZSBhbmQgZmluZF9iZXN0IG9wZWFydGlvbnM7IERlY291cGxlIHByb21pc2N1b3VzCisgKgkgIGhhbmRsaW5nIGZyb20gdGhlIG11bHRpY2FzdCBtb2RlIHNldHRpbmc7IEFkZCBzdXBwb3J0IGZvciBjaGFuZ2luZworICoJICBIVyBhZGRyZXNzIGFuZCBNVFUgd2l0aCBwcm9wZXIgdW53aW5kOyBDb25zb2xpZGF0ZSBwcm9jZnMgY29kZSwKKyAqCSAgYWRkIENIQU5HRU5BTUUgaGFuZGxlcjsgRW5oYW5jZSBuZXRkZXYgbm90aWZpY2F0aW9uIGhhbmRsaW5nLgorICoJICBWZXJzaW9uIHRvIDIuNC4wLgorICoKKyAqIDIwMDMvMDkvMTUgLSBTdGVwaGVuIEhlbW1pbmdlciA8c2hlbW1pbmdlciBhdCBvc2RsIGRvdCBvcmc+LAorICoJICAgICAgIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKgktIENvbnZlcnQgL3Byb2MgdG8gc2VxX2ZpbGUgaW50ZXJmYWNlLgorICoJICBDaGFuZ2UgL3Byb2MvbmV0L2JvbmRYL2luZm8gdG8gL3Byb2MvbmV0L2JvbmRpbmcvYm9uZFguCisgKgkgIFNldCB2ZXJzaW9uIHRvIDIuNC4xLgorICoKKyAqIDIwMDMvMTEvMjAgLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBGaXggL3Byb2MgY3JlYXRpb24vZGVzdHJ1Y3Rpb24uCisgKgorICogMjAwMy8xMi8wMSAtIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBNYXNzaXZlIGNsZWFudXAgLSBTZXQgdmVyc2lvbiB0byAyLjUuMAorICoJICBDb2RlIGNoYW5nZXM6CisgKgkgIG8gQ29uc29saWRhdGUgZm9ybWF0IG9mIHByaW50cyBhbmQgZGVidWcgcHJpbnRzLgorICoJICBvIFJlbW92ZSBib25kaW5nX3Qvc2xhdmVfdCB0eXBlZGVmcyBhbmQgY29uc29saWRhdGUgYWxsIGNhc3RzLgorICoJICBvIFJlbW92ZSBkZWFkIGNvZGUgYW5kIHVubmVjZXNzYXJ5IGNoZWNrcy4KKyAqCSAgbyBDb25zb2xpZGF0ZSBzdGFydGluZy9zdG9wcGluZyB0aW1lcnMuCisgKgkgIG8gQ29uc29saWRhdGUgaGFuZGxpbmcgb2YgcHJpbWFyeSBtb2R1bGUgcGFyYW0gdGhyb3VnaG91dCB0aGUgY29kZS4KKyAqCSAgbyBSZW1vdmVkIG11bHRpY2FzdCBtb2R1bGUgcGFyYW0gc3VwcG9ydCAtIGFsbCBzZXR0aW5ncyBhcmUgZG9uZQorICoJICAgIGFjY29yZGluZyB0byBtb2RlLgorICoJICBvIFNsYXZlIGxpc3QgaXRlcmF0aW9uIC0gYm9uZCBpcyBubyBsb25nZXIgcGFydCBvZiB0aGUgbGlzdCwKKyAqCSAgICBhZGRlZCBjeWNsaWMgbGlzdCBpdGVyYXRpb24gbWFjcm9zLgorICoJICBvIENvbnNvbGlkYXRlIGVycm9yIGhhbmRsaW5nIGluIGFsbCB4bWl0IGZ1bmN0aW9ucy4KKyAqCSAgU3R5bGUgY2hhbmdlczoKKyAqCSAgbyBDb25zb2xpZGF0ZSBmdW5jdGlvbiBuYW1pbmcgYW5kIGRlY2xhcmF0aW9ucy4KKyAqCSAgbyBDb25zb2xpZGF0ZSBmdW5jdGlvbiBwYXJhbXMgYW5kIGxvY2FsIHZhcmlhYmxlcyBuYW1lcy4KKyAqCSAgbyBDb25zb2xpZGF0ZSByZXR1cm4gdmFsdWVzLgorICoJICBvIENvbnNvbGlkYXRlIGN1cmx5IGJyYWNlcy4KKyAqCSAgbyBDb25zb2xpZGF0ZSBjb25kaXRpb25hbHMgZm9ybWF0LgorICoJICBvIENoYW5nZSBzdHJ1Y3QgbWVtYmVyIG5hbWVzIGFuZCB0eXBlcy4KKyAqCSAgbyBDaG9tcCB0cmFpbGluZyBzcGFjZXMsIHJlbW92ZSBlbXB0eSBsaW5lcywgZml4IGluZGVudGF0aW9ucy4KKyAqCSAgbyBSZS1vcmdhbml6ZSBjb2RlIGFjY29yZGluZyB0byBjb250ZXh0LgorICoKKyAqIDIwMDMvMTIvMzAgLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBGaXhlZDogQ2Fubm90IHJlbW92ZSBhbmQgcmUtZW5zbGF2ZSB0aGUgb3JpZ2luYWwgYWN0aXZlIHNsYXZlLgorICoJLSBGaXhlZDogUmVsZWFzaW5nIHRoZSBvcmlnaW5hbCBhY3RpdmUgc2xhdmUgY2F1c2VzIG1hYyBhZGRyZXNzCisgKgkJIGR1cGxpY2F0aW9uLgorICoJLSBBZGQgc3VwcG9ydCBmb3Igc2xhdmVzIHRoYXQgdXNlIGV0aHRvb2xfb3BzLgorICoJICBTZXQgdmVyc2lvbiB0byAyLjUuMy4KKyAqCisgKiAyMDA0LzAxLzA1IC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gU2F2ZSBib25kaW5nIHBhcmFtZXRlcnMgcGVyIGJvbmQgaW5zdGVhZCBvZiB1c2luZyB0aGUgZ2xvYmFsIHZhbHVlcy4KKyAqCSAgU2V0IHZlcnNpb24gdG8gMi41LjQuCisgKgorICogMjAwNC8wMS8xNCAtIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBFbmhhbmNlIFZMQU4gc3VwcG9ydDoKKyAqCSAgKiBBZGQgc3VwcG9ydCBmb3IgVkxBTiBoYXJkd2FyZSBhY2NlbGVyYXRpb24gY2FwYWJsZSBzbGF2ZXMuCisgKgkgICogQWRkIGNhcGFiaWxpdHkgdG8gdGFnIHNlbGYgZ2VuZXJhdGVkIHBhY2tldHMgaW4gQUxCL1RMQiBtb2Rlcy4KKyAqCSAgU2V0IHZlcnNpb24gdG8gMi42LjAuCisgKiAyMDA0LzEwLzI5IC0gTWl0Y2ggV2lsbGlhbXMgPG1pdGNoLmEud2lsbGlhbXMgYXQgaW50ZWwgZG90IGNvbT4KKyAqICAgICAgLSBGaXhlZCBidWcgd2hlbiB1bmxvYWRpbmcgbW9kdWxlIHdoaWxlIHVzaW5nIDgwMi4zYWQuICBJZgorICogICAgICAgIHNwaW5sb2NrIGRlYnVnZ2luZyBpcyB0dXJuZWQgb24sIHRoaXMgY2F1c2VzIGEgc3RhY2sgZHVtcC4KKyAqICAgICAgICBTb2x1dGlvbiBpcyB0byBtb3ZlIGNhbGwgdG8gZGV2X3JlbW92ZV9wYWNrIG91dHNpZGUgb2YgdGhlCisgKiAgICAgICAgc3BpbmxvY2suCisgKiAgICAgICAgU2V0IHZlcnNpb24gdG8gMi42LjEuCisgKgorICovCisKKy8vI2RlZmluZSBCT05ESU5HX0RFQlVHIDEKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2JvbmRpbmcuaD4KKyNpbmNsdWRlICJib25kaW5nLmgiCisjaW5jbHVkZSAiYm9uZF8zYWQuaCIKKyNpbmNsdWRlICJib25kX2FsYi5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTW9kdWxlIHBhcmFtZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG1vbml0b3IgYWxsIGxpbmtzIHRoYXQgb2Z0ZW4gKGluIG1pbGxpc2Vjb25kcykuIDw9MCBkaXNhYmxlcyBtb25pdG9yaW5nICovCisjZGVmaW5lIEJPTkRfTElOS19NT05fSU5URVJWCTAKKyNkZWZpbmUgQk9ORF9MSU5LX0FSUF9JTlRFUlYJMAorCitzdGF0aWMgaW50IG1heF9ib25kcwk9IEJPTkRfREVGQVVMVF9NQVhfQk9ORFM7CitzdGF0aWMgaW50IG1paW1vbgk9IEJPTkRfTElOS19NT05fSU5URVJWOworc3RhdGljIGludCB1cGRlbGF5CT0gMDsKK3N0YXRpYyBpbnQgZG93bmRlbGF5CT0gMDsKK3N0YXRpYyBpbnQgdXNlX2NhcnJpZXIJPSAxOworc3RhdGljIGNoYXIgKm1vZGUJPSBOVUxMOworc3RhdGljIGNoYXIgKnByaW1hcnkJPSBOVUxMOworc3RhdGljIGNoYXIgKmxhY3BfcmF0ZQk9IE5VTEw7CitzdGF0aWMgaW50IGFycF9pbnRlcnZhbCA9IEJPTkRfTElOS19BUlBfSU5URVJWOworc3RhdGljIGNoYXIgKmFycF9pcF90YXJnZXRbQk9ORF9NQVhfQVJQX1RBUkdFVFNdID0geyBOVUxMLCB9OworCittb2R1bGVfcGFyYW0obWF4X2JvbmRzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfYm9uZHMsICJNYXggbnVtYmVyIG9mIGJvbmRlZCBkZXZpY2VzIik7Cittb2R1bGVfcGFyYW0obWlpbW9uLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtaWltb24sICJMaW5rIGNoZWNrIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyIpOworbW9kdWxlX3BhcmFtKHVwZGVsYXksIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHVwZGVsYXksICJEZWxheSBiZWZvcmUgY29uc2lkZXJpbmcgbGluayB1cCwgaW4gbWlsbGlzZWNvbmRzIik7Cittb2R1bGVfcGFyYW0oZG93bmRlbGF5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkb3duZGVsYXksICJEZWxheSBiZWZvcmUgY29uc2lkZXJpbmcgbGluayBkb3duLCBpbiBtaWxsaXNlY29uZHMiKTsKK21vZHVsZV9wYXJhbSh1c2VfY2FycmllciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModXNlX2NhcnJpZXIsICJVc2UgbmV0aWZfY2Fycmllcl9vayAodnMgTUlJIGlvY3RscykgaW4gbWlpbW9uOyAwIGZvciBvZmYsIDEgZm9yIG9uIChkZWZhdWx0KSIpOworbW9kdWxlX3BhcmFtKG1vZGUsIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZSwgIk1vZGUgb2Ygb3BlcmF0aW9uIDogMCBmb3Igcm91bmQgcm9iaW4sIDEgZm9yIGFjdGl2ZS1iYWNrdXAsIDIgZm9yIHhvciIpOworbW9kdWxlX3BhcmFtKHByaW1hcnksIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJpbWFyeSwgIlByaW1hcnkgbmV0d29yayBkZXZpY2UgdG8gdXNlIik7Cittb2R1bGVfcGFyYW0obGFjcF9yYXRlLCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxhY3BfcmF0ZSwgIkxBQ1BEVSB0eCByYXRlIHRvIHJlcXVlc3QgZnJvbSA4MDIuM2FkIHBhcnRuZXIgKHNsb3cvZmFzdCkiKTsKK21vZHVsZV9wYXJhbShhcnBfaW50ZXJ2YWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFycF9pbnRlcnZhbCwgImFycCBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMiKTsKK21vZHVsZV9wYXJhbV9hcnJheShhcnBfaXBfdGFyZ2V0LCBjaGFycCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFycF9pcF90YXJnZXQsICJhcnAgdGFyZ2V0cyBpbiBuLm4ubi5uIGZvcm0iKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbiA9CisJRFJWX0RFU0NSSVBUSU9OICI6IHYiIERSVl9WRVJTSU9OICIgKCIgRFJWX1JFTERBVEUgIilcbiI7CisKK3N0YXRpYyBMSVNUX0hFQUQoYm9uZF9kZXZfbGlzdCk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYm9uZF9wcm9jX2RpciA9IE5VTEw7CisjZW5kaWYKKworc3RhdGljIHUzMiBhcnBfdGFyZ2V0W0JPTkRfTUFYX0FSUF9UQVJHRVRTXSA9IHsgMCwgfSA7CitzdGF0aWMgaW50IGFycF9pcF9jb3VudAk9IDA7CitzdGF0aWMgdTMyIG15X2lwCT0gMDsKK3N0YXRpYyBpbnQgYm9uZF9tb2RlCT0gQk9ORF9NT0RFX1JPVU5EUk9CSU47CitzdGF0aWMgaW50IGxhY3BfZmFzdAk9IDA7CitzdGF0aWMgaW50IGFwcF9hYmlfdmVyCT0gMDsKK3N0YXRpYyBpbnQgb3JpZ19hcHBfYWJpX3ZlciA9IC0xOyAvKiBUaGlzIGlzIHVzZWQgdG8gc2F2ZSB0aGUgZmlyc3QgQUJJIHZlcnNpb24KKwkJCQkgICAqIHdlIHJlY2VpdmUgZnJvbSB0aGUgYXBwbGljYXRpb24uIE9uY2Ugc2V0LAorCQkJCSAgICogaXQgd29uJ3QgYmUgY2hhbmdlZCwgYW5kIHRoZSBtb2R1bGUgd2lsbAorCQkJCSAgICogcmVmdXNlIHRvIGVuc2xhdmUvcmVsZWFzZSBpbnRlcmZhY2VzIGlmIHRoZQorCQkJCSAgICogY29tbWFuZCBjb21lcyBmcm9tIGFuIGFwcGxpY2F0aW9uIHVzaW5nCisJCQkJICAgKiBhbm90aGVyIEFCSSB2ZXJzaW9uLgorCQkJCSAgICovCisKK3N0cnVjdCBib25kX3Bhcm1fdGJsIHsKKwljaGFyICptb2RlbmFtZTsKKwlpbnQgbW9kZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYm9uZF9wYXJtX3RibCBib25kX2xhY3BfdGJsW10gPSB7Cit7CSJzbG93IiwJCUFEX0xBQ1BfU0xPV30sCit7CSJmYXN0IiwJCUFEX0xBQ1BfRkFTVH0sCit7CU5VTEwsCQktMX0sCit9OworCitzdGF0aWMgc3RydWN0IGJvbmRfcGFybV90YmwgYm9uZF9tb2RlX3RibFtdID0geworewkiYmFsYW5jZS1yciIsCQlCT05EX01PREVfUk9VTkRST0JJTn0sCit7CSJhY3RpdmUtYmFja3VwIiwJQk9ORF9NT0RFX0FDVElWRUJBQ0tVUH0sCit7CSJiYWxhbmNlLXhvciIsCQlCT05EX01PREVfWE9SfSwKK3sJImJyb2FkY2FzdCIsCQlCT05EX01PREVfQlJPQURDQVNUfSwKK3sJIjgwMi4zYWQiLAkJQk9ORF9NT0RFXzgwMjNBRH0sCit7CSJiYWxhbmNlLXRsYiIsCQlCT05EX01PREVfVExCfSwKK3sJImJhbGFuY2UtYWxiIiwJCUJPTkRfTU9ERV9BTEJ9LAorewlOVUxMLAkJCS0xfSwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRm9yd2FyZCBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSB2b2lkIGJvbmRfc2V0X21vZGVfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiwgaW50IG1vZGUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2VuZXJhbCByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBjb25zdCBjaGFyICpib25kX21vZGVfbmFtZShpbnQgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEJPTkRfTU9ERV9ST1VORFJPQklOIDoKKwkJcmV0dXJuICJsb2FkIGJhbGFuY2luZyAocm91bmQtcm9iaW4pIjsKKwljYXNlIEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVAgOgorCQlyZXR1cm4gImZhdWx0LXRvbGVyYW5jZSAoYWN0aXZlLWJhY2t1cCkiOworCWNhc2UgQk9ORF9NT0RFX1hPUiA6CisJCXJldHVybiAibG9hZCBiYWxhbmNpbmcgKHhvcikiOworCWNhc2UgQk9ORF9NT0RFX0JST0FEQ0FTVCA6CisJCXJldHVybiAiZmF1bHQtdG9sZXJhbmNlIChicm9hZGNhc3QpIjsKKwljYXNlIEJPTkRfTU9ERV84MDIzQUQ6CisJCXJldHVybiAiSUVFRSA4MDIuM2FkIER5bmFtaWMgbGluayBhZ2dyZWdhdGlvbiI7CisJY2FzZSBCT05EX01PREVfVExCOgorCQlyZXR1cm4gInRyYW5zbWl0IGxvYWQgYmFsYW5jaW5nIjsKKwljYXNlIEJPTkRfTU9ERV9BTEI6CisJCXJldHVybiAiYWRhcHRpdmUgbG9hZCBiYWxhbmNpbmciOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVkxBTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogYm9uZF9hZGRfdmxhbiAtIGFkZCBhIG5ldyB2bGFuIGlkIG9uIGJvbmQKKyAqIEBib25kOiBib25kIHRoYXQgZ290IHRoZSBub3RpZmljYXRpb24KKyAqIEB2bGFuX2lkOiB0aGUgdmxhbiBpZCB0byBhZGQKKyAqCisgKiBSZXR1cm5zIC1FTk9NRU0gaWYgYWxsb2NhdGlvbiBmYWlsZWQuCisgKi8KK3N0YXRpYyBpbnQgYm9uZF9hZGRfdmxhbihzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgdW5zaWduZWQgc2hvcnQgdmxhbl9pZCkKK3sKKwlzdHJ1Y3Qgdmxhbl9lbnRyeSAqdmxhbjsKKworCWRwcmludGsoImJvbmQ6ICVzLCB2bGFuIGlkICVkXG4iLAorCQkoYm9uZCA/IGJvbmQtPmRldi0+bmFtZTogIk5vbmUiKSwgdmxhbl9pZCk7CisKKwl2bGFuID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZsYW5fZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZsYW4pIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnZsYW4tPnZsYW5fbGlzdCk7CisJdmxhbi0+dmxhbl9pZCA9IHZsYW5faWQ7CisKKwl3cml0ZV9sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCWxpc3RfYWRkX3RhaWwoJnZsYW4tPnZsYW5fbGlzdCwgJmJvbmQtPnZsYW5fbGlzdCk7CisKKwl3cml0ZV91bmxvY2tfYmgoJmJvbmQtPmxvY2spOworCisJZHByaW50aygiYWRkZWQgVkxBTiBJRCAlZCBvbiBib25kICVzXG4iLCB2bGFuX2lkLCBib25kLT5kZXYtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYm9uZF9kZWxfdmxhbiAtIGRlbGV0ZSBhIHZsYW4gaWQgZnJvbSBib25kCisgKiBAYm9uZDogYm9uZCB0aGF0IGdvdCB0aGUgbm90aWZpY2F0aW9uCisgKiBAdmxhbl9pZDogdGhlIHZsYW4gaWQgdG8gZGVsZXRlCisgKgorICogcmV0dXJucyAtRU5PREVWIGlmIEB2bGFuX2lkIHdhcyBub3QgZm91bmQgaW4gQGJvbmQuCisgKi8KK3N0YXRpYyBpbnQgYm9uZF9kZWxfdmxhbihzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgdW5zaWduZWQgc2hvcnQgdmxhbl9pZCkKK3sKKwlzdHJ1Y3Qgdmxhbl9lbnRyeSAqdmxhbiwgKm5leHQ7CisJaW50IHJlcyA9IC1FTk9ERVY7CisKKwlkcHJpbnRrKCJib25kOiAlcywgdmxhbiBpZCAlZFxuIiwgYm9uZC0+ZGV2LT5uYW1lLCB2bGFuX2lkKTsKKworCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmxvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZsYW4sIG5leHQsICZib25kLT52bGFuX2xpc3QsIHZsYW5fbGlzdCkgeworCQlpZiAodmxhbi0+dmxhbl9pZCA9PSB2bGFuX2lkKSB7CisJCQlsaXN0X2RlbCgmdmxhbi0+dmxhbl9saXN0KTsKKworCQkJaWYgKChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfVExCKSB8fAorCQkJICAgIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUxCKSkgeworCQkJCWJvbmRfYWxiX2NsZWFyX3ZsYW4oYm9uZCwgdmxhbl9pZCk7CisJCQl9CisKKwkJCWRwcmludGsoInJlbW92ZWQgVkxBTiBJRCAlZCBmcm9tIGJvbmQgJXNcbiIsIHZsYW5faWQsCisJCQkJYm9uZC0+ZGV2LT5uYW1lKTsKKworCQkJa2ZyZWUodmxhbik7CisKKwkJCWlmIChsaXN0X2VtcHR5KCZib25kLT52bGFuX2xpc3QpICYmCisJCQkgICAgKGJvbmQtPnNsYXZlX2NudCA9PSAwKSkgeworCQkJCS8qIExhc3QgVkxBTiByZW1vdmVkIGFuZCBubyBzbGF2ZXMsIHNvCisJCQkJICogcmVzdG9yZSBibG9jayBvbiBhZGRpbmcgVkxBTnMuIFRoaXMgd2lsbAorCQkJCSAqIGJlIHJlbW92ZWQgb25jZSBuZXcgc2xhdmVzIHRoYXQgYXJlIG5vdAorCQkJCSAqIFZMQU4gY2hhbGxlbmdlZCB3aWxsIGJlIGFkZGVkLgorCQkJCSAqLworCQkJCWJvbmQtPmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQ7CisJCQl9CisKKwkJCXJlcyA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWRwcmludGsoImNvdWxkbid0IGZpbmQgVkxBTiBJRCAlZCBpbiBib25kICVzXG4iLCB2bGFuX2lkLAorCQlib25kLT5kZXYtPm5hbWUpOworCitvdXQ6CisJd3JpdGVfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIGJvbmRfaGFzX2NoYWxsZW5nZWRfc2xhdmVzCisgKiBAYm9uZDogdGhlIGJvbmQgd2UncmUgd29ya2luZyBvbgorICoKKyAqIFNlYXJjaGVzIHRoZSBzbGF2ZSBsaXN0LiBSZXR1cm5zIDEgaWYgYSB2bGFuIGNoYWxsZW5nZWQgc2xhdmUKKyAqIHdhcyBmb3VuZCwgMCBvdGhlcndpc2UuCisgKgorICogQXNzdW1lcyBib25kLT5sb2NrIGlzIGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgYm9uZF9oYXNfY2hhbGxlbmdlZF9zbGF2ZXMoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IHNsYXZlICpzbGF2ZTsKKwlpbnQgaTsKKworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJaWYgKHNsYXZlLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQpIHsKKwkJCWRwcmludGsoImZvdW5kIFZMQU4gY2hhbGxlbmdlZCBzbGF2ZSAtICVzXG4iLAorCQkJCXNsYXZlLT5kZXYtPm5hbWUpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlkcHJpbnRrKCJubyBWTEFOIGNoYWxsZW5nZWQgc2xhdmVzIGZvdW5kXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBib25kX25leHRfdmxhbiAtIHNhZmVseSBza2lwIHRvIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHZsYW5zIGxpc3QuCisgKiBAYm9uZDogdGhlIGJvbmQgd2UncmUgd29ya2luZyBvbgorICogQGN1cnI6IGl0ZW0gd2UncmUgYWR2YW5jaW5nIGZyb20KKyAqCisgKiBSZXR1cm5zICVOVUxMIGlmIGxpc3QgaXMgZW1wdHksIGJvbmQtPm5leHRfdmxhbiBpZiBAY3VyciBpcyAlTlVMTCwKKyAqIG9yIEBjdXJyLT5uZXh0IG90aGVyd2lzZSAoZXZlbiBpZiBpdCBpcyBAY3VyciBpdHNlbGYgYWdhaW4pLgorICogCisgKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQtPmxvY2sKKyAqLworc3RydWN0IHZsYW5fZW50cnkgKmJvbmRfbmV4dF92bGFuKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgdmxhbl9lbnRyeSAqY3VycikKK3sKKwlzdHJ1Y3Qgdmxhbl9lbnRyeSAqbmV4dCwgKmxhc3Q7CisKKwlpZiAobGlzdF9lbXB0eSgmYm9uZC0+dmxhbl9saXN0KSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWN1cnIpIHsKKwkJbmV4dCA9IGxpc3RfZW50cnkoYm9uZC0+dmxhbl9saXN0Lm5leHQsCisJCQkJICBzdHJ1Y3Qgdmxhbl9lbnRyeSwgdmxhbl9saXN0KTsKKwl9IGVsc2UgeworCQlsYXN0ID0gbGlzdF9lbnRyeShib25kLT52bGFuX2xpc3QucHJldiwKKwkJCQkgIHN0cnVjdCB2bGFuX2VudHJ5LCB2bGFuX2xpc3QpOworCQlpZiAobGFzdCA9PSBjdXJyKSB7CisJCQluZXh0ID0gbGlzdF9lbnRyeShib25kLT52bGFuX2xpc3QubmV4dCwKKwkJCQkJICBzdHJ1Y3Qgdmxhbl9lbnRyeSwgdmxhbl9saXN0KTsKKwkJfSBlbHNlIHsKKwkJCW5leHQgPSBsaXN0X2VudHJ5KGN1cnItPnZsYW5fbGlzdC5uZXh0LAorCQkJCQkgIHN0cnVjdCB2bGFuX2VudHJ5LCB2bGFuX2xpc3QpOworCQl9CisJfQorCisJcmV0dXJuIG5leHQ7Cit9CisKKy8qKgorICogYm9uZF9kZXZfcXVldWVfeG1pdCAtIFByZXBhcmUgc2tiIGZvciB4bWl0LgorICogCisgKiBAYm9uZDogYm9uZCBkZXZpY2UgdGhhdCBnb3QgdGhpcyBza2IgZm9yIHR4LgorICogQHNrYjogaHcgYWNjZWwgVkxBTiB0YWdnZWQgc2tiIHRvIHRyYW5zbWl0CisgKiBAc2xhdmVfZGV2OiBzbGF2ZSB0aGF0IGlzIHN1cHBvc2VkIHRvIHhtaXQgdGhpcyBza2J1ZmYKKyAqIAorICogV2hlbiB0aGUgYm9uZCBnZXRzIGFuIHNrYiB0byB0cmFuc21pdCB0aGF0IGlzCisgKiBhbHJlYWR5IGhhcmR3YXJlIGFjY2VsZXJhdGVkIFZMQU4gdGFnZ2VkLCBhbmQgaXQKKyAqIG5lZWRzIHRvIHJlbGF5IHRoaXMgc2tiIHRvIGEgc2xhdmUgdGhhdCBpcyBub3QKKyAqIGh3IGFjY2VsIGNhcGFibGUsIHRoZSBza2IgbmVlZHMgdG8gYmUgInVuYWNjZWxlcmF0ZWQiLAorICogaS5lLiBzdHJpcCB0aGUgaHdhY2NlbCB0YWcgYW5kIHJlLWluc2VydCBpdCBhcyBwYXJ0CisgKiBvZiB0aGUgcGF5bG9hZC4KKyAqLworaW50IGJvbmRfZGV2X3F1ZXVlX3htaXQoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYpCit7CisJdW5zaWduZWQgc2hvcnQgdmxhbl9pZDsKKworCWlmICghbGlzdF9lbXB0eSgmYm9uZC0+dmxhbl9saXN0KSAmJgorCSAgICAhKHNsYXZlX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fVFgpICYmCisJICAgIHZsYW5fZ2V0X3RhZyhza2IsICZ2bGFuX2lkKSA9PSAwKSB7CisJCXNrYi0+ZGV2ID0gc2xhdmVfZGV2OworCQlza2IgPSB2bGFuX3B1dF90YWcoc2tiLCB2bGFuX2lkKTsKKwkJaWYgKCFza2IpIHsKKwkJCS8qIHZsYW5fcHV0X3RhZygpIGZyZWVzIHRoZSBza2IgaW4gY2FzZSBvZiBlcnJvciwKKwkJCSAqIHNvIHJldHVybiBzdWNjZXNzIGhlcmUgc28gdGhlIGNhbGxpbmcgZnVuY3Rpb25zCisJCQkgKiB3b24ndCBhdHRlbXB0IHRvIGZyZWUgaXMgYWdhaW4uCisJCQkgKi8KKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJc2tiLT5kZXYgPSBzbGF2ZV9kZXY7CisJfQorCisJc2tiLT5wcmlvcml0eSA9IDE7CisJZGV2X3F1ZXVlX3htaXQoc2tiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogSW4gdGhlIGZvbGxvd2luZyAzIGZ1bmN0aW9ucywgYm9uZF92bGFuX3J4X3JlZ2lzdGVyKCksIGJvbmRfdmxhbl9yeF9hZGRfdmlkCisgKiBhbmQgYm9uZF92bGFuX3J4X2tpbGxfdmlkLCBXZSBkb24ndCBwcm90ZWN0IHRoZSBzbGF2ZSBsaXN0IGl0ZXJhdGlvbiB3aXRoIGEKKyAqIGxvY2sgYmVjYXVzZToKKyAqIGEuIFRoaXMgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBpbiBJT0NUTCBjb250ZXh0LAorICogYi4gVGhlIG9wZXJhdGlvbiBpcyBwcm90ZWN0ZWQgYnkgdGhlIFJUTkwgc2VtYXBob3JlIGluIHRoZSA4MDIxcSBjb2RlLAorICogYy4gSG9sZGluZyBhIGxvY2sgd2l0aCBCSCBkaXNhYmxlZCB3aGlsZSBkaXJlY3RseSBjYWxsaW5nIGEgYmFzZSBkcml2ZXIKKyAqICAgIGVudHJ5IHBvaW50IGlzIGdlbmVyYWxseSBhIEJBRCBpZGVhLgorICogCisgKiBUaGUgZGVzaWduIG9mIHN5bmNocm9uaXphdGlvbi9wcm90ZWN0aW9uIGZvciB0aGlzIG9wZXJhdGlvbiBpbiB0aGUgODAyMXEKKyAqIG1vZHVsZSBpcyBnb29kIGZvciBvbmUgb3IgbW9yZSBWTEFOIGRldmljZXMgb3ZlciBhIHNpbmdsZSBwaHlzaWNhbCBkZXZpY2UKKyAqIGFuZCBjYW5ub3QgYmUgZXh0ZW5kZWQgZm9yIGEgdGVhbWluZyBzb2x1dGlvbiBsaWtlIGJvbmRpbmcsIHNvIHRoZXJlIGlzIGEKKyAqIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBoZXJlIHdoZXJlIGEgbmV0IGRldmljZSBmcm9tIHRoZSB2bGFuIGdyb3VwIG1pZ2h0CisgKiBiZSByZWZlcmVuY2VkIChlaXRoZXIgYnkgYSBiYXNlIGRyaXZlciBvciB0aGUgODAyMXEgY29kZSkgd2hpbGUgaXQgaXMgYmVpbmcKKyAqIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtLiBIb3dldmVyLCBpdCB0dXJucyBvdXQgd2UncmUgbm90IG1ha2luZyBtYXR0ZXJzCisgKiB3b3JzZSwgYW5kIGlmIGl0IHdvcmtzIGZvciByZWd1bGFyIFZMQU4gdXNhZ2UgaXQgd2lsbCB3b3JrIGhlcmUgdG9vLgorKi8KKworLyoqCisgKiBib25kX3ZsYW5fcnhfcmVnaXN0ZXIgLSBQcm9wYWdhdGVzIHJlZ2lzdHJhdGlvbiB0byBzbGF2ZXMKKyAqIEBib25kX2RldjogYm9uZGluZyBuZXQgZGV2aWNlIHRoYXQgZ290IGNhbGxlZAorICogQGdycDogdmxhbiBncm91cCBiZWluZyByZWdpc3RlcmVkCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOworCWludCBpOworCisJYm9uZC0+dmxncnAgPSBncnA7CisKKwlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYgPSBzbGF2ZS0+ZGV2OworCisJCWlmICgoc2xhdmVfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkgJiYKKwkJICAgIHNsYXZlX2Rldi0+dmxhbl9yeF9yZWdpc3RlcikgeworCQkJc2xhdmVfZGV2LT52bGFuX3J4X3JlZ2lzdGVyKHNsYXZlX2RldiwgZ3JwKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBib25kX3ZsYW5fcnhfYWRkX3ZpZCAtIFByb3BhZ2F0ZXMgYWRkaW5nIGFuIGlkIHRvIHNsYXZlcworICogQGJvbmRfZGV2OiBib25kaW5nIG5ldCBkZXZpY2UgdGhhdCBnb3QgY2FsbGVkCisgKiBAdmlkOiB2bGFuIGlkIGJlaW5nIGFkZGVkCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiwgdWludDE2X3QgdmlkKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IHNsYXZlICpzbGF2ZTsKKwlpbnQgaSwgcmVzOworCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2ID0gc2xhdmUtPmRldjsKKworCQlpZiAoKHNsYXZlX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fRklMVEVSKSAmJgorCQkgICAgc2xhdmVfZGV2LT52bGFuX3J4X2FkZF92aWQpIHsKKwkJCXNsYXZlX2Rldi0+dmxhbl9yeF9hZGRfdmlkKHNsYXZlX2RldiwgdmlkKTsKKwkJfQorCX0KKworCXJlcyA9IGJvbmRfYWRkX3ZsYW4oYm9uZCwgdmlkKTsKKwlpZiAocmVzKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkgICAgICAgIjogJXM6IEZhaWxlZCB0byBhZGQgdmxhbiBpZCAlZFxuIiwKKwkJICAgICAgIGJvbmRfZGV2LT5uYW1lLCB2aWQpOworCX0KK30KKworLyoqCisgKiBib25kX3ZsYW5fcnhfa2lsbF92aWQgLSBQcm9wYWdhdGVzIGRlbGV0aW5nIGFuIGlkIHRvIHNsYXZlcworICogQGJvbmRfZGV2OiBib25kaW5nIG5ldCBkZXZpY2UgdGhhdCBnb3QgY2FsbGVkCisgKiBAdmlkOiB2bGFuIGlkIGJlaW5nIHJlbW92ZWQKKyAqLworc3RhdGljIHZvaWQgYm9uZF92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiwgdWludDE2X3QgdmlkKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IHNsYXZlICpzbGF2ZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbl9kZXY7CisJaW50IGksIHJlczsKKworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldiA9IHNsYXZlLT5kZXY7CisKKwkJaWYgKChzbGF2ZV9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUikgJiYKKwkJICAgIHNsYXZlX2Rldi0+dmxhbl9yeF9raWxsX3ZpZCkgeworCQkJLyogU2F2ZSBhbmQgdGhlbiByZXN0b3JlIHZsYW5fZGV2IGluIHRoZSBncnAgYXJyYXksCisJCQkgKiBzaW5jZSB0aGUgc2xhdmUncyBkcml2ZXIgbWlnaHQgY2xlYXIgaXQuCisJCQkgKi8KKwkJCXZsYW5fZGV2ID0gYm9uZC0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdOworCQkJc2xhdmVfZGV2LT52bGFuX3J4X2tpbGxfdmlkKHNsYXZlX2RldiwgdmlkKTsKKwkJCWJvbmQtPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSA9IHZsYW5fZGV2OworCQl9CisJfQorCisJcmVzID0gYm9uZF9kZWxfdmxhbihib25kLCB2aWQpOworCWlmIChyZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCSAgICAgICAiOiAlczogRmFpbGVkIHRvIHJlbW92ZSB2bGFuIGlkICVkXG4iLAorCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsIHZpZCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBib25kX2FkZF92bGFuc19vbl9zbGF2ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldikKK3sKKwlzdHJ1Y3Qgdmxhbl9lbnRyeSAqdmxhbjsKKworCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmxvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJmJvbmQtPnZsYW5fbGlzdCkpIHsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChzbGF2ZV9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKSAmJgorCSAgICBzbGF2ZV9kZXYtPnZsYW5fcnhfcmVnaXN0ZXIpIHsKKwkJc2xhdmVfZGV2LT52bGFuX3J4X3JlZ2lzdGVyKHNsYXZlX2RldiwgYm9uZC0+dmxncnApOworCX0KKworCWlmICghKHNsYXZlX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fRklMVEVSKSB8fAorCSAgICAhKHNsYXZlX2Rldi0+dmxhbl9yeF9hZGRfdmlkKSkgeworCQlnb3RvIG91dDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZib25kLT52bGFuX2xpc3QsIHZsYW5fbGlzdCkgeworCQlzbGF2ZV9kZXYtPnZsYW5fcnhfYWRkX3ZpZChzbGF2ZV9kZXYsIHZsYW4tPnZsYW5faWQpOworCX0KKworb3V0OgorCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGJvbmRfZGVsX3ZsYW5zX2Zyb21fc2xhdmUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYpCit7CisJc3RydWN0IHZsYW5fZW50cnkgKnZsYW47CisJc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5fZGV2OworCisJd3JpdGVfbG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwlpZiAobGlzdF9lbXB0eSgmYm9uZC0+dmxhbl9saXN0KSkgeworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIShzbGF2ZV9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUikgfHwKKwkgICAgIShzbGF2ZV9kZXYtPnZsYW5fcnhfa2lsbF92aWQpKSB7CisJCWdvdG8gdW5yZWc7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bGFuLCAmYm9uZC0+dmxhbl9saXN0LCB2bGFuX2xpc3QpIHsKKwkJLyogU2F2ZSBhbmQgdGhlbiByZXN0b3JlIHZsYW5fZGV2IGluIHRoZSBncnAgYXJyYXksCisJCSAqIHNpbmNlIHRoZSBzbGF2ZSdzIGRyaXZlciBtaWdodCBjbGVhciBpdC4KKwkJICovCisJCXZsYW5fZGV2ID0gYm9uZC0+dmxncnAtPnZsYW5fZGV2aWNlc1t2bGFuLT52bGFuX2lkXTsKKwkJc2xhdmVfZGV2LT52bGFuX3J4X2tpbGxfdmlkKHNsYXZlX2Rldiwgdmxhbi0+dmxhbl9pZCk7CisJCWJvbmQtPnZsZ3JwLT52bGFuX2RldmljZXNbdmxhbi0+dmxhbl9pZF0gPSB2bGFuX2RldjsKKwl9CisKK3VucmVnOgorCWlmICgoc2xhdmVfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkgJiYKKwkgICAgc2xhdmVfZGV2LT52bGFuX3J4X3JlZ2lzdGVyKSB7CisJCXNsYXZlX2Rldi0+dmxhbl9yeF9yZWdpc3RlcihzbGF2ZV9kZXYsIE5VTEwpOworCX0KKworb3V0OgorCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+bG9jayk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaW5rIHN0YXR1cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEdldCBsaW5rIHNwZWVkIGFuZCBkdXBsZXggZnJvbSB0aGUgc2xhdmUncyBiYXNlIGRyaXZlcgorICogdXNpbmcgZXRodG9vbC4gSWYgZm9yIHNvbWUgcmVhc29uIHRoZSBjYWxsIGZhaWxzIG9yIHRoZQorICogdmFsdWVzIGFyZSBpbnZhbGlkLCBmYWtlIHNwZWVkIGFuZCBkdXBsZXggdG8gMTAwL0Z1bGwKKyAqIGFuZCByZXR1cm4gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgYm9uZF91cGRhdGVfc3BlZWRfZHVwbGV4KHN0cnVjdCBzbGF2ZSAqc2xhdmUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldiA9IHNsYXZlLT5kZXY7CisJc3RhdGljIGludCAoKiBpb2N0bCkoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCk7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlzdHJ1Y3QgZXRodG9vbF9jbWQgZXRvb2w7CisKKwkvKiBGYWtlIHNwZWVkIGFuZCBkdXBsZXggKi8KKwlzbGF2ZS0+c3BlZWQgPSBTUEVFRF8xMDA7CisJc2xhdmUtPmR1cGxleCA9IERVUExFWF9GVUxMOworCisJaWYgKHNsYXZlX2Rldi0+ZXRodG9vbF9vcHMpIHsKKwkJdTMyIHJlczsKKworCQlpZiAoIXNsYXZlX2Rldi0+ZXRodG9vbF9vcHMtPmdldF9zZXR0aW5ncykgeworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcmVzID0gc2xhdmVfZGV2LT5ldGh0b29sX29wcy0+Z2V0X3NldHRpbmdzKHNsYXZlX2RldiwgJmV0b29sKTsKKwkJaWYgKHJlcyA8IDApIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWdvdG8gdmVyaWZ5OworCX0KKworCWlvY3RsID0gc2xhdmVfZGV2LT5kb19pb2N0bDsKKwlzdHJuY3B5KGlmci5pZnJfbmFtZSwgc2xhdmVfZGV2LT5uYW1lLCBJRk5BTVNJWik7CisJZXRvb2wuY21kID0gRVRIVE9PTF9HU0VUOworCWlmci5pZnJfZGF0YSA9IChjaGFyKikmZXRvb2w7CisJaWYgKCFpb2N0bCB8fCAoSU9DVEwoc2xhdmVfZGV2LCAmaWZyLCBTSU9DRVRIVE9PTCkgPCAwKSkgeworCQlyZXR1cm4gLTE7CisJfQorCit2ZXJpZnk6CisJc3dpdGNoIChldG9vbC5zcGVlZCkgeworCWNhc2UgU1BFRURfMTA6CisJY2FzZSBTUEVFRF8xMDA6CisJY2FzZSBTUEVFRF8xMDAwOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCisJc3dpdGNoIChldG9vbC5kdXBsZXgpIHsKKwljYXNlIERVUExFWF9GVUxMOgorCWNhc2UgRFVQTEVYX0hBTEY6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisKKwlzbGF2ZS0+c3BlZWQgPSBldG9vbC5zcGVlZDsKKwlzbGF2ZS0+ZHVwbGV4ID0gZXRvb2wuZHVwbGV4OworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpZiA8ZGV2PiBzdXBwb3J0cyBNSUkgbGluayBzdGF0dXMgcmVwb3J0aW5nLCBjaGVjayBpdHMgbGluayBzdGF0dXMuCisgKgorICogV2UgZWl0aGVyIGRvIE1JSS9FVEhUT09MIGlvY3Rscywgb3IgY2hlY2sgbmV0aWZfY2Fycmllcl9vaygpLAorICogZGVwZW5pbmcgdXBvbiB0aGUgc2V0dGluZyBvZiB0aGUgdXNlX2NhcnJpZXIgcGFyYW1ldGVyLgorICoKKyAqIFJldHVybiBlaXRoZXIgQk1TUl9MU1RBVFVTLCBtZWFuaW5nIHRoYXQgdGhlIGxpbmsgaXMgdXAgKG9yIHdlCisgKiBjYW4ndCB0ZWxsIGFuZCBqdXN0IHByZXRlbmQgaXQgaXMpLCBvciAwLCBtZWFuaW5nIHRoYXQgdGhlIGxpbmsgaXMKKyAqIGRvd24uCisgKgorICogSWYgcmVwb3J0aW5nIGlzIG5vbi16ZXJvLCBpbnN0ZWFkIG9mIGZha2luZyBsaW5rIHVwLCByZXR1cm4gLTEgaWYKKyAqIGJvdGggRVRIVE9PTCBhbmQgTUlJIGlvY3RscyBmYWlsIChtZWFuaW5nIHRoZSBkZXZpY2UgZG9lcyBub3QKKyAqIHN1cHBvcnQgdGhlbSkuICBJZiB1c2VfY2FycmllciBpcyBzZXQsIHJldHVybiB3aGF0ZXZlciBpdCBzYXlzLgorICogSXQnZCBiZSBuaWNlIGlmIHRoZXJlIHdhcyBhIGdvb2Qgd2F5IHRvIHRlbGwgaWYgYSBkcml2ZXIgc3VwcG9ydHMKKyAqIG5ldGlmX2NhcnJpZXIsIGJ1dCB0aGVyZSByZWFsbHkgaXNuJ3QuCisgKi8KK3N0YXRpYyBpbnQgYm9uZF9jaGVja19kZXZfbGluayhzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldiwgaW50IHJlcG9ydGluZykKK3sKKwlzdGF0aWMgaW50ICgqIGlvY3RsKShzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50KTsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqbWlpOworCXN0cnVjdCBldGh0b29sX3ZhbHVlIGV0b29sOworCisJaWYgKGJvbmQtPnBhcmFtcy51c2VfY2FycmllcikgeworCQlyZXR1cm4gbmV0aWZfY2Fycmllcl9vayhzbGF2ZV9kZXYpID8gQk1TUl9MU1RBVFVTIDogMDsKKwl9CisKKwlpb2N0bCA9IHNsYXZlX2Rldi0+ZG9faW9jdGw7CisJaWYgKGlvY3RsKSB7CisJCS8qIFRPRE86IHNldCBwb2ludGVyIHRvIGNvcnJlY3QgaW9jdGwgb24gYSBwZXIgdGVhbSBtZW1iZXIgKi8KKwkJLyogICAgICAgYmFzZXMgdG8gbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50LiB0aGF0IGlzLCBvbmNlICAqLworCQkvKiAgICAgICB3ZSBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgaW9jdGwsIHdlIHdpbGwgYWx3YXlzICAgICovCisJCS8qICAgICAgIGNhbGwgaXQgYW5kIG5vdCB0aGUgb3RoZXJzIGZvciB0aGF0IHRlYW0gICAgICAgICAgKi8KKwkJLyogICAgICAgbWVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJCS8qCisJCSAqIFdlIGNhbm5vdCBhc3N1bWUgdGhhdCBTSU9DR01JSVBIWSB3aWxsIGFsc28gcmVhZCBhCisJCSAqIHJlZ2lzdGVyOyBub3QgYWxsIG5ldHdvcmsgZHJpdmVycyAoZS5nLiwgZTEwMCkKKwkJICogc3VwcG9ydCB0aGF0LgorCQkgKi8KKworCQkvKiBZZXMsIHRoZSBtaWkgaXMgb3ZlcmxhaWQgb24gdGhlIGlmcmVxLmlmcl9pZnJ1ICovCisJCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBzbGF2ZV9kZXYtPm5hbWUsIElGTkFNU0laKTsKKwkJbWlpID0gaWZfbWlpKCZpZnIpOworCQlpZiAoSU9DVEwoc2xhdmVfZGV2LCAmaWZyLCBTSU9DR01JSVBIWSkgPT0gMCkgeworCQkJbWlpLT5yZWdfbnVtID0gTUlJX0JNU1I7CisJCQlpZiAoSU9DVEwoc2xhdmVfZGV2LCAmaWZyLCBTSU9DR01JSVJFRykgPT0gMCkgeworCQkJCXJldHVybiAobWlpLT52YWxfb3V0ICYgQk1TUl9MU1RBVFVTKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIHRyeSBTSU9DRVRIVE9PTCBpb2N0bCwgc29tZSBkcml2ZXJzIGNhY2hlIEVUSFRPT0xfR0xJTksgKi8KKwkvKiBmb3IgYSBwZXJpb2Qgb2YgdGltZSBzbyB3ZSBhdHRlbXB0IHRvIGdldCBsaW5rIHN0YXR1cyAgICovCisJLyogZnJvbSBpdCBsYXN0IGlmIHRoZSBhYm92ZSBNSUkgaW9jdGxzIGZhaWwuLi4gICAgICAgICAgICAqLworCWlmIChzbGF2ZV9kZXYtPmV0aHRvb2xfb3BzKSB7CisJCWlmIChzbGF2ZV9kZXYtPmV0aHRvb2xfb3BzLT5nZXRfbGluaykgeworCQkJdTMyIGxpbms7CisKKwkJCWxpbmsgPSBzbGF2ZV9kZXYtPmV0aHRvb2xfb3BzLT5nZXRfbGluayhzbGF2ZV9kZXYpOworCisJCQlyZXR1cm4gbGluayA/IEJNU1JfTFNUQVRVUyA6IDA7CisJCX0KKwl9CisKKwlpZiAoaW9jdGwpIHsKKwkJc3RybmNweShpZnIuaWZyX25hbWUsIHNsYXZlX2Rldi0+bmFtZSwgSUZOQU1TSVopOworCQlldG9vbC5jbWQgPSBFVEhUT09MX0dMSU5LOworCQlpZnIuaWZyX2RhdGEgPSAoY2hhciopJmV0b29sOworCQlpZiAoSU9DVEwoc2xhdmVfZGV2LCAmaWZyLCBTSU9DRVRIVE9PTCkgPT0gMCkgeworCQkJaWYgKGV0b29sLmRhdGEgPT0gMSkgeworCQkJCXJldHVybiBCTVNSX0xTVEFUVVM7CisJCQl9IGVsc2UgeworCQkJCWRwcmludGsoIlNJT0NFVEhUT09MIHNob3dzIGxpbmsgZG93blxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHJlcG9ydGluZywgcmVwb3J0IHRoYXQgZWl0aGVyIHRoZXJlJ3Mgbm8gZGV2LT5kb19pb2N0bCwKKwkgKiBvciBib3RoIFNJT0NHTUlJUkVHIGFuZCBTSU9DRVRIVE9PTCBmYWlsZWQgKG1lYW5pbmcgdGhhdCB3ZQorCSAqIGNhbm5vdCByZXBvcnQgbGluayBzdGF0dXMpLiAgSWYgbm90IHJlcG9ydGluZywgcHJldGVuZAorCSAqIHdlJ3JlIG9rLgorCSAqLworCXJldHVybiAocmVwb3J0aW5nID8gLTEgOiBCTVNSX0xTVEFUVVMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE11bHRpY2FzdCBsaXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBSZXR1cm5zIDAgaWYgZG1pMSBhbmQgZG1pMiBhcmUgdGhlIHNhbWUsIG5vbi0wIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGludCBib25kX2lzX2RtaV9zYW1lKHN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pMSwgc3RydWN0IGRldl9tY19saXN0ICpkbWkyKQoreworCXJldHVybiBtZW1jbXAoZG1pMS0+ZG1pX2FkZHIsIGRtaTItPmRtaV9hZGRyLCBkbWkxLT5kbWlfYWRkcmxlbikgPT0gMCAmJgorCQkJZG1pMS0+ZG1pX2FkZHJsZW4gPT0gZG1pMi0+ZG1pX2FkZHJsZW47Cit9CisKKy8qCisgKiByZXR1cm5zIGRtaSBlbnRyeSBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UKKyAqLworc3RhdGljIHN0cnVjdCBkZXZfbWNfbGlzdCAqYm9uZF9tY19saXN0X2ZpbmRfZG1pKHN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pLCBzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jX2xpc3QpCit7CisJc3RydWN0IGRldl9tY19saXN0ICppZG1pOworCisJZm9yIChpZG1pID0gbWNfbGlzdDsgaWRtaTsgaWRtaSA9IGlkbWktPm5leHQpIHsKKwkJaWYgKGJvbmRfaXNfZG1pX3NhbWUoZG1pLCBpZG1pKSkgeworCQkJcmV0dXJuIGlkbWk7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFB1c2ggdGhlIHByb21pc2N1aXR5IGZsYWcgZG93biB0byBhcHByb3ByaWF0ZSBzbGF2ZXMKKyAqLworc3RhdGljIHZvaWQgYm9uZF9zZXRfcHJvbWlzY3VpdHkoc3RydWN0IGJvbmRpbmcgKmJvbmQsIGludCBpbmMpCit7CisJaWYgKFVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkpIHsKKwkJLyogd3JpdGUgbG9jayBhbHJlYWR5IGFjcXVpcmVkICovCisJCWlmIChib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeworCQkJZGV2X3NldF9wcm9taXNjdWl0eShib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZS0+ZGV2LCBpbmMpOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IHNsYXZlICpzbGF2ZTsKKwkJaW50IGk7CisJCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJCWRldl9zZXRfcHJvbWlzY3VpdHkoc2xhdmUtPmRldiwgaW5jKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFB1c2ggdGhlIGFsbG11bHRpIGZsYWcgZG93biB0byBhbGwgc2xhdmVzCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfc2V0X2FsbG11bHRpKHN0cnVjdCBib25kaW5nICpib25kLCBpbnQgaW5jKQoreworCWlmIChVU0VTX1BSSU1BUlkoYm9uZC0+cGFyYW1zLm1vZGUpKSB7CisJCS8qIHdyaXRlIGxvY2sgYWxyZWFkeSBhY3F1aXJlZCAqLworCQlpZiAoYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpIHsKKwkJCWRldl9zZXRfYWxsbXVsdGkoYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUtPmRldiwgaW5jKTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CisJCWludCBpOworCQlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCQlkZXZfc2V0X2FsbG11bHRpKHNsYXZlLT5kZXYsIGluYyk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBBZGQgYSBNdWx0aWNhc3QgYWRkcmVzcyB0byBzbGF2ZXMKKyAqIGFjY29yZGluZyB0byBtb2RlCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfbWNfYWRkKHN0cnVjdCBib25kaW5nICpib25kLCB2b2lkICphZGRyLCBpbnQgYWxlbikKK3sKKwlpZiAoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkgeworCQkvKiB3cml0ZSBsb2NrIGFscmVhZHkgYWNxdWlyZWQgKi8KKwkJaWYgKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSB7CisJCQlkZXZfbWNfYWRkKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlLT5kZXYsIGFkZHIsIGFsZW4sIDApOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IHNsYXZlICpzbGF2ZTsKKwkJaW50IGk7CisJCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJCWRldl9tY19hZGQoc2xhdmUtPmRldiwgYWRkciwgYWxlbiwgMCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBSZW1vdmUgYSBtdWx0aWNhc3QgYWRkcmVzcyBmcm9tIHNsYXZlCisgKiBhY2NvcmRpbmcgdG8gbW9kZQorICovCitzdGF0aWMgdm9pZCBib25kX21jX2RlbGV0ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgdm9pZCAqYWRkciwgaW50IGFsZW4pCit7CisJaWYgKFVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkpIHsKKwkJLyogd3JpdGUgbG9jayBhbHJlYWR5IGFjcXVpcmVkICovCisJCWlmIChib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeworCQkJZGV2X21jX2RlbGV0ZShib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZS0+ZGV2LCBhZGRyLCBhbGVuLCAwKTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CisJCWludCBpOworCQlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCQlkZXZfbWNfZGVsZXRlKHNsYXZlLT5kZXYsIGFkZHIsIGFsZW4sIDApOworCQl9CisJfQorfQorCisvKgorICogVG90YWxseSBkZXN0cm95cyB0aGUgbWNfbGlzdCBpbiBib25kCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfbWNfbGlzdF9kZXN0cm95KHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCisJZG1pID0gYm9uZC0+bWNfbGlzdDsKKwl3aGlsZSAoZG1pKSB7CisJCWJvbmQtPm1jX2xpc3QgPSBkbWktPm5leHQ7CisJCWtmcmVlKGRtaSk7CisJCWRtaSA9IGJvbmQtPm1jX2xpc3Q7CisJfQorfQorCisvKgorICogQ29weSBhbGwgdGhlIE11bHRpY2FzdCBhZGRyZXNzZXMgZnJvbSBzcmMgdG8gdGhlIGJvbmRpbmcgZGV2aWNlIGRzdAorICovCitzdGF0aWMgaW50IGJvbmRfbWNfbGlzdF9jb3B5KHN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfbGlzdCwgc3RydWN0IGJvbmRpbmcgKmJvbmQsIGludCBncGZfZmxhZykKK3sKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSwgKm5ld19kbWk7CisKKwlmb3IgKGRtaSA9IG1jX2xpc3Q7IGRtaTsgZG1pID0gZG1pLT5uZXh0KSB7CisJCW5ld19kbWkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2X21jX2xpc3QpLCBncGZfZmxhZyk7CisKKwkJaWYgKCFuZXdfZG1pKSB7CisJCQkvKiBGSVhNRTogUG90ZW50aWFsIG1lbW9yeSBsZWFrICEhISAqLworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQluZXdfZG1pLT5uZXh0ID0gYm9uZC0+bWNfbGlzdDsKKwkJYm9uZC0+bWNfbGlzdCA9IG5ld19kbWk7CisJCW5ld19kbWktPmRtaV9hZGRybGVuID0gZG1pLT5kbWlfYWRkcmxlbjsKKwkJbWVtY3B5KG5ld19kbWktPmRtaV9hZGRyLCBkbWktPmRtaV9hZGRyLCBkbWktPmRtaV9hZGRybGVuKTsKKwkJbmV3X2RtaS0+ZG1pX3VzZXJzID0gZG1pLT5kbWlfdXNlcnM7CisJCW5ld19kbWktPmRtaV9ndXNlcnMgPSBkbWktPmRtaV9ndXNlcnM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBmbHVzaCBhbGwgbWVtYmVycyBvZiBmbHVzaC0+bWNfbGlzdCBmcm9tIGRldmljZSBkZXYtPm1jX2xpc3QKKyAqLworc3RhdGljIHZvaWQgYm9uZF9tY19saXN0X2ZsdXNoKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2Rldiwgc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCisJZm9yIChkbWkgPSBib25kX2Rldi0+bWNfbGlzdDsgZG1pOyBkbWkgPSBkbWktPm5leHQpIHsKKwkJZGV2X21jX2RlbGV0ZShzbGF2ZV9kZXYsIGRtaS0+ZG1pX2FkZHIsIGRtaS0+ZG1pX2FkZHJsZW4sIDApOworCX0KKworCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJCS8qIGRlbCBsYWNwZHUgbWMgYWRkciBmcm9tIG1jIGxpc3QgKi8KKwkJdTggbGFjcGR1X211bHRpY2FzdFtFVEhfQUxFTl0gPSBNVUxUSUNBU1RfTEFDUERVX0FERFI7CisKKwkJZGV2X21jX2RlbGV0ZShzbGF2ZV9kZXYsIGxhY3BkdV9tdWx0aWNhc3QsIEVUSF9BTEVOLCAwKTsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFjdGl2ZSBzbGF2ZSBjaGFuZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFVwZGF0ZSB0aGUgbWMgbGlzdCBhbmQgbXVsdGljYXN0LXJlbGF0ZWQgZmxhZ3MgZm9yIHRoZSBuZXcgYW5kCisgKiBvbGQgYWN0aXZlIHNsYXZlcyAoaWYgYW55KSBhY2NvcmRpbmcgdG8gdGhlIG11bHRpY2FzdCBtb2RlLCBhbmQKKyAqIHByb21pc2N1b3VzIGZsYWdzIHVuY29uZGl0aW9uYWxseS4KKyAqLworc3RhdGljIHZvaWQgYm9uZF9tY19zd2FwKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKm5ld19hY3RpdmUsIHN0cnVjdCBzbGF2ZSAqb2xkX2FjdGl2ZSkKK3sKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaTsKKworCWlmICghVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkgeworCQkvKiBub3RoaW5nIHRvIGRvIC0gIG1jIGxpc3QgaXMgYWxyZWFkeSB1cC10by1kYXRlIG9uCisJCSAqIGFsbCBzbGF2ZXMKKwkJICovCisJCXJldHVybjsKKwl9CisKKwlpZiAob2xkX2FjdGl2ZSkgeworCQlpZiAoYm9uZC0+ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCQlkZXZfc2V0X3Byb21pc2N1aXR5KG9sZF9hY3RpdmUtPmRldiwgLTEpOworCQl9CisKKwkJaWYgKGJvbmQtPmRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJCWRldl9zZXRfYWxsbXVsdGkob2xkX2FjdGl2ZS0+ZGV2LCAtMSk7CisJCX0KKworCQlmb3IgKGRtaSA9IGJvbmQtPmRldi0+bWNfbGlzdDsgZG1pOyBkbWkgPSBkbWktPm5leHQpIHsKKwkJCWRldl9tY19kZWxldGUob2xkX2FjdGl2ZS0+ZGV2LCBkbWktPmRtaV9hZGRyLCBkbWktPmRtaV9hZGRybGVuLCAwKTsKKwkJfQorCX0KKworCWlmIChuZXdfYWN0aXZlKSB7CisJCWlmIChib25kLT5kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJCWRldl9zZXRfcHJvbWlzY3VpdHkobmV3X2FjdGl2ZS0+ZGV2LCAxKTsKKwkJfQorCisJCWlmIChib25kLT5kZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCQlkZXZfc2V0X2FsbG11bHRpKG5ld19hY3RpdmUtPmRldiwgMSk7CisJCX0KKworCQlmb3IgKGRtaSA9IGJvbmQtPmRldi0+bWNfbGlzdDsgZG1pOyBkbWkgPSBkbWktPm5leHQpIHsKKwkJCWRldl9tY19hZGQobmV3X2FjdGl2ZS0+ZGV2LCBkbWktPmRtaV9hZGRyLCBkbWktPmRtaV9hZGRybGVuLCAwKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBmaW5kX2Jlc3RfaW50ZXJmYWNlIC0gc2VsZWN0IHRoZSBiZXN0IGF2YWlsYWJsZSBzbGF2ZSB0byBiZSB0aGUgYWN0aXZlIG9uZQorICogQGJvbmQ6IG91ciBib25kaW5nIHN0cnVjdAorICoKKyAqIFdhcm5pbmc6IENhbGxlciBtdXN0IGhvbGQgY3Vycl9zbGF2ZV9sb2NrIGZvciB3cml0aW5nLgorICovCitzdGF0aWMgc3RydWN0IHNsYXZlICpib25kX2ZpbmRfYmVzdF9zbGF2ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzdHJ1Y3Qgc2xhdmUgKm5ld19hY3RpdmUsICpvbGRfYWN0aXZlOworCXN0cnVjdCBzbGF2ZSAqYmVzdHNsYXZlID0gTlVMTDsKKwlpbnQgbWludGltZSA9IGJvbmQtPnBhcmFtcy51cGRlbGF5OworCWludCBpOworCisJbmV3X2FjdGl2ZSA9IG9sZF9hY3RpdmUgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKKworCWlmICghbmV3X2FjdGl2ZSkgeyAvKiB0aGVyZSB3ZXJlIG5vIGFjdGl2ZSBzbGF2ZXMgbGVmdCAqLworCQlpZiAoYm9uZC0+c2xhdmVfY250ID4gMCkgeyAgLyogZm91bmQgb25lIHNsYXZlICovCisJCQluZXdfYWN0aXZlID0gYm9uZC0+Zmlyc3Rfc2xhdmU7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gTlVMTDsgLyogc3RpbGwgbm8gc2xhdmUsIHJldHVybiBOVUxMICovCisJCX0KKwl9CisKKwkvKiBmaXJzdCB0cnkgdGhlIHByaW1hcnkgbGluazsgaWYgYXJwaW5nLCBhIGxpbmsgbXVzdCB0eC9yeCB0cmFmZmljCisJICogYmVmb3JlIGl0IGNhbiBiZSBjb25zaWRlcmVkIHRoZSBjdXJyX2FjdGl2ZV9zbGF2ZSAtIGFsc28sIHdlIHdvdWxkIHNraXAKKwkgKiBzbGF2ZXMgYmV0d2VlbiB0aGUgY3Vycl9hY3RpdmVfc2xhdmUgYW5kIHByaW1hcnlfc2xhdmUgdGhhdCBtYXkgYmUgdXAKKwkgKiBhbmQgYWJsZSB0byBhcnAKKwkgKi8KKwlpZiAoKGJvbmQtPnByaW1hcnlfc2xhdmUpICYmCisJICAgICghYm9uZC0+cGFyYW1zLmFycF9pbnRlcnZhbCkgJiYKKwkgICAgKElTX1VQKGJvbmQtPnByaW1hcnlfc2xhdmUtPmRldikpKSB7CisJCW5ld19hY3RpdmUgPSBib25kLT5wcmltYXJ5X3NsYXZlOworCX0KKworCS8qIHJlbWVtYmVyIHdoZXJlIHRvIHN0b3AgaXRlcmF0aW5nIG92ZXIgdGhlIHNsYXZlcyAqLworCW9sZF9hY3RpdmUgPSBuZXdfYWN0aXZlOworCisJYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tKGJvbmQsIG5ld19hY3RpdmUsIGksIG9sZF9hY3RpdmUpIHsKKwkJaWYgKElTX1VQKG5ld19hY3RpdmUtPmRldikpIHsKKwkJCWlmIChuZXdfYWN0aXZlLT5saW5rID09IEJPTkRfTElOS19VUCkgeworCQkJCXJldHVybiBuZXdfYWN0aXZlOworCQkJfSBlbHNlIGlmIChuZXdfYWN0aXZlLT5saW5rID09IEJPTkRfTElOS19CQUNLKSB7CisJCQkJLyogbGluayB1cCwgYnV0IHdhaXRpbmcgZm9yIHN0YWJpbGl6YXRpb24gKi8KKwkJCQlpZiAobmV3X2FjdGl2ZS0+ZGVsYXkgPCBtaW50aW1lKSB7CisJCQkJCW1pbnRpbWUgPSBuZXdfYWN0aXZlLT5kZWxheTsKKwkJCQkJYmVzdHNsYXZlID0gbmV3X2FjdGl2ZTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gYmVzdHNsYXZlOworfQorCisvKioKKyAqIGNoYW5nZV9hY3RpdmVfaW50ZXJmYWNlIC0gY2hhbmdlIHRoZSBhY3RpdmUgc2xhdmUgaW50byB0aGUgc3BlY2lmaWVkIG9uZQorICogQGJvbmQ6IG91ciBib25kaW5nIHN0cnVjdAorICogQG5ldzogdGhlIG5ldyBzbGF2ZSB0byBtYWtlIHRoZSBhY3RpdmUgb25lCisgKgorICogU2V0IHRoZSBuZXcgc2xhdmUgdG8gdGhlIGJvbmQncyBzZXR0aW5ncyBhbmQgdW5zZXQgdGhlbSBvbiB0aGUgb2xkCisgKiBjdXJyX2FjdGl2ZV9zbGF2ZS4KKyAqIFNldHRpbmcgaW5jbHVkZSBmbGFncywgbWMtbGlzdCwgcHJvbWlzY3VpdHksIGFsbG11bHRpLCBldGMuCisgKgorICogSWYgQG5ldydzIGxpbmsgc3RhdGUgaXMgJUJPTkRfTElOS19CQUNLIHdlJ2xsIHNldCBpdCB0byAlQk9ORF9MSU5LX1VQLAorICogYmVjYXVzZSBpdCBpcyBhcHBhcmVudGx5IHRoZSBiZXN0IGF2YWlsYWJsZSBzbGF2ZSB3ZSBoYXZlLCBldmVuIHRob3VnaCBpdHMKKyAqIHVwZGVsYXkgaGFzbid0IHRpbWVkIG91dCB5ZXQuCisgKgorICogV2FybmluZzogQ2FsbGVyIG11c3QgaG9sZCBjdXJyX3NsYXZlX2xvY2sgZm9yIHdyaXRpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfY2hhbmdlX2FjdGl2ZV9zbGF2ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpuZXdfYWN0aXZlKQoreworCXN0cnVjdCBzbGF2ZSAqb2xkX2FjdGl2ZSA9IGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlOworCisJaWYgKG9sZF9hY3RpdmUgPT0gbmV3X2FjdGl2ZSkgeworCQlyZXR1cm47CisJfQorCisJaWYgKG5ld19hY3RpdmUpIHsKKwkJaWYgKG5ld19hY3RpdmUtPmxpbmsgPT0gQk9ORF9MSU5LX0JBQ0spIHsKKwkJCWlmIChVU0VTX1BSSU1BUlkoYm9uZC0+cGFyYW1zLm1vZGUpKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkJCSAgICAgICAiOiAlczogbWFraW5nIGludGVyZmFjZSAlcyB0aGUgbmV3ICIKKwkJCQkgICAgICAgImFjdGl2ZSBvbmUgJWQgbXMgZWFybGllci5cbiIsCisJCQkJICAgICAgIGJvbmQtPmRldi0+bmFtZSwgbmV3X2FjdGl2ZS0+ZGV2LT5uYW1lLAorCQkJCSAgICAgICAoYm9uZC0+cGFyYW1zLnVwZGVsYXkgLSBuZXdfYWN0aXZlLT5kZWxheSkgKiBib25kLT5wYXJhbXMubWlpbW9uKTsKKwkJCX0KKworCQkJbmV3X2FjdGl2ZS0+ZGVsYXkgPSAwOworCQkJbmV3X2FjdGl2ZS0+bGluayA9IEJPTkRfTElOS19VUDsKKwkJCW5ld19hY3RpdmUtPmppZmZpZXMgPSBqaWZmaWVzOworCisJCQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCQkJCWJvbmRfM2FkX2hhbmRsZV9saW5rX2NoYW5nZShuZXdfYWN0aXZlLCBCT05EX0xJTktfVVApOworCQkJfQorCisJCQlpZiAoKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9UTEIpIHx8CisJCQkgICAgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9BTEIpKSB7CisJCQkJYm9uZF9hbGJfaGFuZGxlX2xpbmtfY2hhbmdlKGJvbmQsIG5ld19hY3RpdmUsIEJPTkRfTElOS19VUCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCQkgICAgICAgIjogJXM6IG1ha2luZyBpbnRlcmZhY2UgJXMgdGhlIG5ldyAiCisJCQkJICAgICAgICJhY3RpdmUgb25lLlxuIiwKKwkJCQkgICAgICAgYm9uZC0+ZGV2LT5uYW1lLCBuZXdfYWN0aXZlLT5kZXYtPm5hbWUpOworCQkJfQorCQl9CisJfQorCisJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApIHsKKwkJaWYgKG9sZF9hY3RpdmUpIHsKKwkJCWJvbmRfc2V0X3NsYXZlX2luYWN0aXZlX2ZsYWdzKG9sZF9hY3RpdmUpOworCQl9CisKKwkJaWYgKG5ld19hY3RpdmUpIHsKKwkJCWJvbmRfc2V0X3NsYXZlX2FjdGl2ZV9mbGFncyhuZXdfYWN0aXZlKTsKKwkJfQorCX0KKworCWlmIChVU0VTX1BSSU1BUlkoYm9uZC0+cGFyYW1zLm1vZGUpKSB7CisJCWJvbmRfbWNfc3dhcChib25kLCBuZXdfYWN0aXZlLCBvbGRfYWN0aXZlKTsKKwl9CisKKwlpZiAoKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9UTEIpIHx8CisJICAgIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUxCKSkgeworCQlib25kX2FsYl9oYW5kbGVfYWN0aXZlX2NoYW5nZShib25kLCBuZXdfYWN0aXZlKTsKKwl9IGVsc2UgeworCQlib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSA9IG5ld19hY3RpdmU7CisJfQorfQorCisvKioKKyAqIGJvbmRfc2VsZWN0X2FjdGl2ZV9zbGF2ZSAtIHNlbGVjdCBhIG5ldyBhY3RpdmUgc2xhdmUsIGlmIG5lZWRlZAorICogQGJvbmQ6IG91ciBib25kaW5nIHN0cnVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb25zIHNob3VkIGJlIGNhbGxlZCB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9jY3VyczoKKyAqIC0gVGhlIG9sZCBjdXJyX2FjdGl2ZV9zbGF2ZSBoYXMgYmVlbiByZWxlYXNlZCBvciBsb3N0IGl0cyBsaW5rLgorICogLSBUaGUgcHJpbWFyeV9zbGF2ZSBoYXMgZ290IGl0cyBsaW5rIGJhY2suCisgKiAtIEEgc2xhdmUgaGFzIGdvdCBpdHMgbGluayBiYWNrIGFuZCB0aGVyZSdzIG5vIG9sZCBjdXJyX2FjdGl2ZV9zbGF2ZS4KKyAqCisgKiBXYXJuaW5nOiBDYWxsZXIgbXVzdCBob2xkIGN1cnJfc2xhdmVfbG9jayBmb3Igd3JpdGluZy4KKyAqLworc3RhdGljIHZvaWQgYm9uZF9zZWxlY3RfYWN0aXZlX3NsYXZlKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBzbGF2ZSAqYmVzdF9zbGF2ZTsKKworCWJlc3Rfc2xhdmUgPSBib25kX2ZpbmRfYmVzdF9zbGF2ZShib25kKTsKKwlpZiAoYmVzdF9zbGF2ZSAhPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeworCQlib25kX2NoYW5nZV9hY3RpdmVfc2xhdmUoYm9uZCwgYmVzdF9zbGF2ZSk7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzbGF2ZSBsaXN0IGhhbmRsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGF0dGFjaGVzIHRoZSBzbGF2ZSB0byB0aGUgZW5kIG9mIGxpc3QuCisgKgorICogYm9uZC0+bG9jayBoZWxkIGZvciB3cml0aW5nIGJ5IGNhbGxlci4KKyAqLworc3RhdGljIHZvaWQgYm9uZF9hdHRhY2hfc2xhdmUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBzbGF2ZSAqbmV3X3NsYXZlKQoreworCWlmIChib25kLT5maXJzdF9zbGF2ZSA9PSBOVUxMKSB7IC8qIGF0dGFjaGluZyB0aGUgZmlyc3Qgc2xhdmUgKi8KKwkJbmV3X3NsYXZlLT5uZXh0ID0gbmV3X3NsYXZlOworCQluZXdfc2xhdmUtPnByZXYgPSBuZXdfc2xhdmU7CisJCWJvbmQtPmZpcnN0X3NsYXZlID0gbmV3X3NsYXZlOworCX0gZWxzZSB7CisJCW5ld19zbGF2ZS0+bmV4dCA9IGJvbmQtPmZpcnN0X3NsYXZlOworCQluZXdfc2xhdmUtPnByZXYgPSBib25kLT5maXJzdF9zbGF2ZS0+cHJldjsKKwkJbmV3X3NsYXZlLT5uZXh0LT5wcmV2ID0gbmV3X3NsYXZlOworCQluZXdfc2xhdmUtPnByZXYtPm5leHQgPSBuZXdfc2xhdmU7CisJfQorCisJYm9uZC0+c2xhdmVfY250Kys7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGRldGFjaGVzIHRoZSBzbGF2ZSBmcm9tIHRoZSBsaXN0LgorICogV0FSTklORzogbm8gY2hlY2sgaXMgbWFkZSB0byB2ZXJpZnkgaWYgdGhlIHNsYXZlIGVmZmVjdGl2ZWx5CisgKiBiZWxvbmdzIHRvIDxib25kPi4KKyAqIE5vdGhpbmcgaXMgZnJlZWQgb24gcmV0dXJuLCBzdHJ1Y3R1cmVzIGFyZSBqdXN0IHVuY2hhaW5lZC4KKyAqIElmIGFueSBzbGF2ZSBwb2ludGVyIGluIGJvbmQgd2FzIHBvaW50aW5nIHRvIDxzbGF2ZT4sCisgKiBpdCBzaG91bGQgYmUgY2hhbmdlZCBieSB0aGUgY2FsbGluZyBmdW5jdGlvbi4KKyAqCisgKiBib25kLT5sb2NrIGhlbGQgZm9yIHdyaXRpbmcgYnkgY2FsbGVyLgorICovCitzdGF0aWMgdm9pZCBib25kX2RldGFjaF9zbGF2ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpzbGF2ZSkKK3sKKwlpZiAoc2xhdmUtPm5leHQpIHsKKwkJc2xhdmUtPm5leHQtPnByZXYgPSBzbGF2ZS0+cHJldjsKKwl9CisKKwlpZiAoc2xhdmUtPnByZXYpIHsKKwkJc2xhdmUtPnByZXYtPm5leHQgPSBzbGF2ZS0+bmV4dDsKKwl9CisKKwlpZiAoYm9uZC0+Zmlyc3Rfc2xhdmUgPT0gc2xhdmUpIHsgLyogc2xhdmUgaXMgdGhlIGZpcnN0IHNsYXZlICovCisJCWlmIChib25kLT5zbGF2ZV9jbnQgPiAxKSB7IC8qIHRoZXJlIGFyZSBtb3JlIHNsYXZlICovCisJCQlib25kLT5maXJzdF9zbGF2ZSA9IHNsYXZlLT5uZXh0OworCQl9IGVsc2UgeworCQkJYm9uZC0+Zmlyc3Rfc2xhdmUgPSBOVUxMOyAvKiBzbGF2ZSB3YXMgdGhlIGxhc3Qgb25lICovCisJCX0KKwl9CisKKwlzbGF2ZS0+bmV4dCA9IE5VTEw7CisJc2xhdmUtPnByZXYgPSBOVUxMOworCWJvbmQtPnNsYXZlX2NudC0tOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU9DVEwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgYm9uZF9zZXRod2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2KQoreworCWRwcmludGsoImJvbmRfZGV2PSVwXG4iLCBib25kX2Rldik7CisJZHByaW50aygic2xhdmVfZGV2PSVwXG4iLCBzbGF2ZV9kZXYpOworCWRwcmludGsoInNsYXZlX2Rldi0+YWRkcl9sZW49JWRcbiIsIHNsYXZlX2Rldi0+YWRkcl9sZW4pOworCW1lbWNweShib25kX2Rldi0+ZGV2X2FkZHIsIHNsYXZlX2Rldi0+ZGV2X2FkZHIsIHNsYXZlX2Rldi0+YWRkcl9sZW4pOworCXJldHVybiAwOworfQorCisvKiBlbnNsYXZlIGRldmljZSA8c2xhdmU+IHRvIGJvbmQgZGV2aWNlIDxtYXN0ZXI+ICovCitzdGF0aWMgaW50IGJvbmRfZW5zbGF2ZShzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlzdHJ1Y3Qgc2xhdmUgKm5ld19zbGF2ZSA9IE5VTEw7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWk7CisJc3RydWN0IHNvY2thZGRyIGFkZHI7CisJaW50IGxpbmtfcmVwb3J0aW5nOworCWludCBvbGRfZmVhdHVyZXMgPSBib25kX2Rldi0+ZmVhdHVyZXM7CisJaW50IHJlcyA9IDA7CisKKwlpZiAoc2xhdmVfZGV2LT5kb19pb2N0bCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICI6IFdhcm5pbmcgOiBubyBsaW5rIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgJXNcbiIsCisJCSAgICAgICBzbGF2ZV9kZXYtPm5hbWUpOworCX0KKworCS8qIGJvbmQgbXVzdCBiZSBpbml0aWFsaXplZCBieSBib25kX29wZW4oKSBiZWZvcmUgZW5zbGF2aW5nICovCisJaWYgKCEoYm9uZF9kZXYtPmZsYWdzICYgSUZGX1VQKSkgeworCQlkcHJpbnRrKCJFcnJvciwgbWFzdGVyX2RldiBpcyBub3QgdXBcbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCS8qIGFscmVhZHkgZW5zbGF2ZWQgKi8KKwlpZiAoc2xhdmVfZGV2LT5mbGFncyAmIElGRl9TTEFWRSkgeworCQlkcHJpbnRrKCJFcnJvciwgRGV2aWNlIHdhcyBhbHJlYWR5IGVuc2xhdmVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiB2bGFuIGNoYWxsZW5nZWQgbXV0dWFsIGV4Y2x1c2lvbiAqLworCS8qIG5vIG5lZWQgdG8gbG9jayBzaW5jZSB3ZSdyZSBwcm90ZWN0ZWQgYnkgcnRubF9sb2NrICovCisJaWYgKHNsYXZlX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRCkgeworCQlkcHJpbnRrKCIlczogTkVUSUZfRl9WTEFOX0NIQUxMRU5HRURcbiIsIHNsYXZlX2Rldi0+bmFtZSk7CisJCWlmICghbGlzdF9lbXB0eSgmYm9uZC0+dmxhbl9saXN0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkgICAgICAgIjogRXJyb3I6IGNhbm5vdCBlbnNsYXZlIFZMQU4gIgorCQkJICAgICAgICJjaGFsbGVuZ2VkIHNsYXZlICVzIG9uIFZMQU4gZW5hYmxlZCAiCisJCQkgICAgICAgImJvbmQgJXNcbiIsIHNsYXZlX2Rldi0+bmFtZSwKKwkJCSAgICAgICBib25kX2Rldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkJICAgICAgICI6IFdhcm5pbmc6IGVuc2xhdmVkIFZMQU4gY2hhbGxlbmdlZCAiCisJCQkgICAgICAgInNsYXZlICVzLiBBZGRpbmcgVkxBTnMgd2lsbCBiZSBibG9ja2VkIGFzICIKKwkJCSAgICAgICAibG9uZyBhcyAlcyBpcyBwYXJ0IG9mIGJvbmQgJXNcbiIsCisJCQkgICAgICAgc2xhdmVfZGV2LT5uYW1lLCBzbGF2ZV9kZXYtPm5hbWUsCisJCQkgICAgICAgYm9uZF9kZXYtPm5hbWUpOworCQkJYm9uZF9kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEOworCQl9CisJfSBlbHNlIHsKKwkJZHByaW50aygiJXM6ICEgTkVUSUZfRl9WTEFOX0NIQUxMRU5HRURcbiIsIHNsYXZlX2Rldi0+bmFtZSk7CisJCWlmIChib25kLT5zbGF2ZV9jbnQgPT0gMCkgeworCQkJLyogRmlyc3Qgc2xhdmUsIGFuZCBpdCBpcyBub3QgVkxBTiBjaGFsbGVuZ2VkLAorCQkJICogc28gcmVtb3ZlIHRoZSBibG9jayBvZiBhZGRpbmcgVkxBTnMgb3ZlciB0aGUgYm9uZC4KKwkJCSAqLworCQkJYm9uZF9kZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRDsKKwkJfQorCX0KKworCWlmIChhcHBfYWJpX3ZlciA+PSAxKSB7CisJCS8qIFRoZSBhcHBsaWNhdGlvbiBpcyB1c2luZyBhbiBBQkksIHdoaWNoIHJlcXVpcmVzIHRoZQorCQkgKiBzbGF2ZSBpbnRlcmZhY2UgdG8gYmUgY2xvc2VkLgorCQkgKi8KKwkJaWYgKChzbGF2ZV9kZXYtPmZsYWdzICYgSUZGX1VQKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkgICAgICAgIjogRXJyb3I6ICVzIGlzIHVwXG4iLAorCQkJICAgICAgIHNsYXZlX2Rldi0+bmFtZSk7CisJCQlyZXMgPSAtRVBFUk07CisJCQlnb3RvIGVycl91bmRvX2ZsYWdzOworCQl9CisKKwkJaWYgKHNsYXZlX2Rldi0+c2V0X21hY19hZGRyZXNzID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJICAgICAgICI6IEVycm9yOiBUaGUgc2xhdmUgZGV2aWNlIHlvdSBzcGVjaWZpZWQgZG9lcyAiCisJCQkgICAgICAgIm5vdCBzdXBwb3J0IHNldHRpbmcgdGhlIE1BQyBhZGRyZXNzLlxuIik7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiWW91ciBrZXJuZWwgbGlrZWx5IGRvZXMgbm90IHN1cHBvcnQgc2xhdmUgIgorCQkJICAgICAgICJkZXZpY2VzLlxuIik7CisKKwkJCXJlcyA9IC1FT1BOT1RTVVBQOworCQkJZ290byBlcnJfdW5kb19mbGFnczsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFRoZSBhcHBsaWNhdGlvbiBpcyBub3QgdXNpbmcgYW4gQUJJLCB3aGljaCByZXF1aXJlcyB0aGUKKwkJICogc2xhdmUgaW50ZXJmYWNlIHRvIGJlIG9wZW4uCisJCSAqLworCQlpZiAoIShzbGF2ZV9kZXYtPmZsYWdzICYgSUZGX1VQKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkgICAgICAgIjogRXJyb3I6ICVzIGlzIG5vdCBydW5uaW5nXG4iLAorCQkJICAgICAgIHNsYXZlX2Rldi0+bmFtZSk7CisJCQlyZXMgPSAtRUlOVkFMOworCQkJZ290byBlcnJfdW5kb19mbGFnczsKKwkJfQorCisJCWlmICgoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgfHwKKwkJICAgIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfVExCKSAgICB8fAorCQkgICAgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9BTEIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKKwkJCSAgICAgICAiOiBFcnJvcjogdG8gdXNlICVzIG1vZGUsIHlvdSBtdXN0IHVwZ3JhZGUgIgorCQkJICAgICAgICJpZmVuc2xhdmUuXG4iLAorCQkJICAgICAgIGJvbmRfbW9kZV9uYW1lKGJvbmQtPnBhcmFtcy5tb2RlKSk7CisJCQlyZXMgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gZXJyX3VuZG9fZmxhZ3M7CisJCX0KKwl9CisKKwluZXdfc2xhdmUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2xhdmUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld19zbGF2ZSkgeworCQlyZXMgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bmRvX2ZsYWdzOworCX0KKworCW1lbXNldChuZXdfc2xhdmUsIDAsIHNpemVvZihzdHJ1Y3Qgc2xhdmUpKTsKKworCS8qIHNhdmUgc2xhdmUncyBvcmlnaW5hbCBmbGFncyBiZWZvcmUgY2FsbGluZworCSAqIG5ldGRldl9zZXRfbWFzdGVyIGFuZCBkZXZfb3BlbgorCSAqLworCW5ld19zbGF2ZS0+b3JpZ2luYWxfZmxhZ3MgPSBzbGF2ZV9kZXYtPmZsYWdzOworCisJaWYgKGFwcF9hYmlfdmVyID49IDEpIHsKKwkJLyogc2F2ZSBzbGF2ZSdzIG9yaWdpbmFsICgicGVybWFuZW50IikgbWFjIGFkZHJlc3MgZm9yCisJCSAqIG1vZGVzIHRoYXQgbmVlZHMgaXQsIGFuZCBmb3IgcmVzdG9yaW5nIGl0IHVwb24gcmVsZWFzZSwKKwkJICogYW5kIHRoZW4gc2V0IGl0IHRvIHRoZSBtYXN0ZXIncyBhZGRyZXNzCisJCSAqLworCQltZW1jcHkobmV3X3NsYXZlLT5wZXJtX2h3YWRkciwgc2xhdmVfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisJCS8qIHNldCBzbGF2ZSB0byBtYXN0ZXIncyBtYWMgYWRkcmVzcworCQkgKiBUaGUgYXBwbGljYXRpb24gYWxyZWFkeSBzZXQgdGhlIG1hc3RlcidzCisJCSAqIG1hYyBhZGRyZXNzIHRvIHRoYXQgb2YgdGhlIGZpcnN0IHNsYXZlCisJCSAqLworCQltZW1jcHkoYWRkci5zYV9kYXRhLCBib25kX2Rldi0+ZGV2X2FkZHIsIGJvbmRfZGV2LT5hZGRyX2xlbik7CisJCWFkZHIuc2FfZmFtaWx5ID0gc2xhdmVfZGV2LT50eXBlOworCQlyZXMgPSBkZXZfc2V0X21hY19hZGRyZXNzKHNsYXZlX2RldiwgJmFkZHIpOworCQlpZiAocmVzKSB7CisJCQlkcHJpbnRrKCJFcnJvciAlZCBjYWxsaW5nIHNldF9tYWNfYWRkcmVzc1xuIiwgcmVzKTsKKwkJCWdvdG8gZXJyX2ZyZWU7CisJCX0KKworCQkvKiBvcGVuIHRoZSBzbGF2ZSBzaW5jZSB0aGUgYXBwbGljYXRpb24gY2xvc2VkIGl0ICovCisJCXJlcyA9IGRldl9vcGVuKHNsYXZlX2Rldik7CisJCWlmIChyZXMpIHsKKwkJCWRwcmludGsoIk9wZW5uaW5nIHNsYXZlICVzIGZhaWxlZFxuIiwgc2xhdmVfZGV2LT5uYW1lKTsKKwkJCWdvdG8gZXJyX3Jlc3RvcmVfbWFjOworCQl9CisJfQorCisJcmVzID0gbmV0ZGV2X3NldF9tYXN0ZXIoc2xhdmVfZGV2LCBib25kX2Rldik7CisJaWYgKHJlcykgeworCQlkcHJpbnRrKCJFcnJvciAlZCBjYWxsaW5nIG5ldGRldl9zZXRfbWFzdGVyXG4iLCByZXMpOworCQlpZiAoYXBwX2FiaV92ZXIgPCAxKSB7CisJCQlnb3RvIGVycl9mcmVlOworCQl9IGVsc2UgeworCQkJZ290byBlcnJfY2xvc2U7CisJCX0KKwl9CisKKwluZXdfc2xhdmUtPmRldiA9IHNsYXZlX2RldjsKKworCWlmICgoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX1RMQikgfHwKKwkgICAgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9BTEIpKSB7CisJCS8qIGJvbmRfYWxiX2luaXRfc2xhdmUoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYWxsIG90aGVyIHN0YWdlcyBzaW5jZQorCQkgKiBpdCBtaWdodCBmYWlsIGFuZCB3ZSBkbyBub3Qgd2FudCB0byBoYXZlIHRvIHVuZG8gZXZlcnl0aGluZworCQkgKi8KKwkJcmVzID0gYm9uZF9hbGJfaW5pdF9zbGF2ZShib25kLCBuZXdfc2xhdmUpOworCQlpZiAocmVzKSB7CisJCQlnb3RvIGVycl91bnNldF9tYXN0ZXI7CisJCX0KKwl9CisKKwkvKiBJZiB0aGUgbW9kZSBVU0VTX1BSSU1BUlksIHRoZW4gdGhlIG5ldyBzbGF2ZSBnZXRzIHRoZQorCSAqIG1hc3RlcidzIHByb21pc2MgKGFuZCBtYykgc2V0dGluZ3Mgb25seSBpZiBpdCBiZWNvbWVzIHRoZQorCSAqIGN1cnJfYWN0aXZlX3NsYXZlLCBhbmQgdGhhdCBpcyB0YWtlbiBjYXJlIG9mIGxhdGVyIHdoZW4gY2FsbGluZworCSAqIGJvbmRfY2hhbmdlX2FjdGl2ZSgpCisJICovCisJaWYgKCFVU0VTX1BSSU1BUlkoYm9uZC0+cGFyYW1zLm1vZGUpKSB7CisJCS8qIHNldCBwcm9taXNjdWl0eSBsZXZlbCB0byBuZXcgc2xhdmUgKi8KKwkJaWYgKGJvbmRfZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCQlkZXZfc2V0X3Byb21pc2N1aXR5KHNsYXZlX2RldiwgMSk7CisJCX0KKworCQkvKiBzZXQgYWxsbXVsdGkgbGV2ZWwgdG8gbmV3IHNsYXZlICovCisJCWlmIChib25kX2Rldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJCWRldl9zZXRfYWxsbXVsdGkoc2xhdmVfZGV2LCAxKTsKKwkJfQorCisJCS8qIHVwbG9hZCBtYXN0ZXIncyBtY19saXN0IHRvIG5ldyBzbGF2ZSAqLworCQlmb3IgKGRtaSA9IGJvbmRfZGV2LT5tY19saXN0OyBkbWk7IGRtaSA9IGRtaS0+bmV4dCkgeworCQkJZGV2X21jX2FkZCAoc2xhdmVfZGV2LCBkbWktPmRtaV9hZGRyLCBkbWktPmRtaV9hZGRybGVuLCAwKTsKKwkJfQorCX0KKworCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJCS8qIGFkZCBsYWNwZHUgbWMgYWRkciB0byBtYyBsaXN0ICovCisJCXU4IGxhY3BkdV9tdWx0aWNhc3RbRVRIX0FMRU5dID0gTVVMVElDQVNUX0xBQ1BEVV9BRERSOworCisJCWRldl9tY19hZGQoc2xhdmVfZGV2LCBsYWNwZHVfbXVsdGljYXN0LCBFVEhfQUxFTiwgMCk7CisJfQorCisJYm9uZF9hZGRfdmxhbnNfb25fc2xhdmUoYm9uZCwgc2xhdmVfZGV2KTsKKworCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmxvY2spOworCisJYm9uZF9hdHRhY2hfc2xhdmUoYm9uZCwgbmV3X3NsYXZlKTsKKworCW5ld19zbGF2ZS0+ZGVsYXkgPSAwOworCW5ld19zbGF2ZS0+bGlua19mYWlsdXJlX2NvdW50ID0gMDsKKworCWlmIChib25kLT5wYXJhbXMubWlpbW9uICYmICFib25kLT5wYXJhbXMudXNlX2NhcnJpZXIpIHsKKwkJbGlua19yZXBvcnRpbmcgPSBib25kX2NoZWNrX2Rldl9saW5rKGJvbmQsIHNsYXZlX2RldiwgMSk7CisKKwkJaWYgKChsaW5rX3JlcG9ydGluZyA9PSAtMSkgJiYgIWJvbmQtPnBhcmFtcy5hcnBfaW50ZXJ2YWwpIHsKKwkJCS8qCisJCQkgKiBtaWltb24gaXMgc2V0IGJ1dCBhIGJvbmRlZCBuZXR3b3JrIGRyaXZlcgorCQkJICogZG9lcyBub3Qgc3VwcG9ydCBFVEhUT09ML01JSSBhbmQKKwkJCSAqIGFycF9pbnRlcnZhbCBpcyBub3Qgc2V0LiAgTm90ZTogaWYKKwkJCSAqIHVzZV9jYXJyaWVyIGlzIGVuYWJsZWQsIHdlIHdpbGwgbmV2ZXIgZ28KKwkJCSAqIGhlcmUgKGJlY2F1c2UgbmV0aWZfY2FycmllciBpcyBhbHdheXMKKwkJCSAqIHN1cHBvcnRlZCk7IHRodXMsIHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlCisJCQkgKiB0aGUgbWVzc2FnZXMgZm9yIG5ldGlmX2NhcnJpZXIuCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJCSAgICAgICAiOiBXYXJuaW5nOiBNSUkgYW5kIEVUSFRPT0wgc3VwcG9ydCBub3QgIgorCQkJICAgICAgICJhdmFpbGFibGUgZm9yIGludGVyZmFjZSAlcywgYW5kICIKKwkJCSAgICAgICAiYXJwX2ludGVydmFsL2FycF9pcF90YXJnZXQgbW9kdWxlIHBhcmFtZXRlcnMgIgorCQkJICAgICAgICJub3Qgc3BlY2lmaWVkLCB0aHVzIGJvbmRpbmcgd2lsbCBub3QgZGV0ZWN0ICIKKwkJCSAgICAgICAibGluayBmYWlsdXJlcyEgc2VlIGJvbmRpbmcudHh0IGZvciBkZXRhaWxzLlxuIiwKKwkJCSAgICAgICBzbGF2ZV9kZXYtPm5hbWUpOworCQl9IGVsc2UgaWYgKGxpbmtfcmVwb3J0aW5nID09IC0xKSB7CisJCQkvKiB1bmFibGUgZ2V0IGxpbmsgc3RhdHVzIHVzaW5nIG1paS9ldGh0b29sICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCQkgICAgICAgIjogV2FybmluZzogY2FuJ3QgZ2V0IGxpbmsgc3RhdHVzIGZyb20gIgorCQkJICAgICAgICJpbnRlcmZhY2UgJXM7IHRoZSBuZXR3b3JrIGRyaXZlciBhc3NvY2lhdGVkICIKKwkJCSAgICAgICAid2l0aCB0aGlzIGludGVyZmFjZSBkb2VzIG5vdCBzdXBwb3J0IE1JSSBvciAiCisJCQkgICAgICAgIkVUSFRPT0wgbGluayBzdGF0dXMgcmVwb3J0aW5nLCB0aHVzIG1paW1vbiAiCisJCQkgICAgICAgImhhcyBubyBlZmZlY3Qgb24gdGhpcyBpbnRlcmZhY2UuXG4iLAorCQkJICAgICAgIHNsYXZlX2Rldi0+bmFtZSk7CisJCX0KKwl9CisKKwkvKiBjaGVjayBmb3IgaW5pdGlhbCBzdGF0ZSAqLworCWlmICghYm9uZC0+cGFyYW1zLm1paW1vbiB8fAorCSAgICAoYm9uZF9jaGVja19kZXZfbGluayhib25kLCBzbGF2ZV9kZXYsIDApID09IEJNU1JfTFNUQVRVUykpIHsKKwkJaWYgKGJvbmQtPnBhcmFtcy51cGRlbGF5KSB7CisJCQlkcHJpbnRrKCJJbml0aWFsIHN0YXRlIG9mIHNsYXZlX2RldiBpcyAiCisJCQkJIkJPTkRfTElOS19CQUNLXG4iKTsKKwkJCW5ld19zbGF2ZS0+bGluayAgPSBCT05EX0xJTktfQkFDSzsKKwkJCW5ld19zbGF2ZS0+ZGVsYXkgPSBib25kLT5wYXJhbXMudXBkZWxheTsKKwkJfSBlbHNlIHsKKwkJCWRwcmludGsoIkluaXRpYWwgc3RhdGUgb2Ygc2xhdmVfZGV2IGlzICIKKwkJCQkiQk9ORF9MSU5LX1VQXG4iKTsKKwkJCW5ld19zbGF2ZS0+bGluayAgPSBCT05EX0xJTktfVVA7CisJCX0KKwkJbmV3X3NsYXZlLT5qaWZmaWVzID0gamlmZmllczsKKwl9IGVsc2UgeworCQlkcHJpbnRrKCJJbml0aWFsIHN0YXRlIG9mIHNsYXZlX2RldiBpcyAiCisJCQkiQk9ORF9MSU5LX0RPV05cbiIpOworCQluZXdfc2xhdmUtPmxpbmsgID0gQk9ORF9MSU5LX0RPV047CisJfQorCisJaWYgKGJvbmRfdXBkYXRlX3NwZWVkX2R1cGxleChuZXdfc2xhdmUpICYmCisJICAgIChuZXdfc2xhdmUtPmxpbmsgIT0gQk9ORF9MSU5LX0RPV04pKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICI6IFdhcm5pbmc6IGZhaWxlZCB0byBnZXQgc3BlZWQgYW5kIGR1cGxleCBmcm9tICVzLCAiCisJCSAgICAgICAiYXNzdW1lZCB0byBiZSAxMDBNYi9zZWMgYW5kIEZ1bGwuXG4iLAorCQkgICAgICAgbmV3X3NsYXZlLT5kZXYtPm5hbWUpOworCisJCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIk9wZXJhdGlvbiBvZiA4MDIuM2FkIG1vZGUgcmVxdWlyZXMgRVRIVE9PTCAiCisJCQkgICAgICAgInN1cHBvcnQgaW4gYmFzZSBkcml2ZXIgZm9yIHByb3BlciBhZ2dyZWdhdG9yICIKKwkJCSAgICAgICAic2VsZWN0aW9uLlxuIik7CisJCX0KKwl9CisKKwlpZiAoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSAmJiBib25kLT5wYXJhbXMucHJpbWFyeVswXSkgeworCQkvKiBpZiB0aGVyZSBpcyBhIHByaW1hcnkgc2xhdmUsIHJlbWVtYmVyIGl0ICovCisJCWlmIChzdHJjbXAoYm9uZC0+cGFyYW1zLnByaW1hcnksIG5ld19zbGF2ZS0+ZGV2LT5uYW1lKSA9PSAwKSB7CisJCQlib25kLT5wcmltYXJ5X3NsYXZlID0gbmV3X3NsYXZlOworCQl9CisJfQorCisJc3dpdGNoIChib25kLT5wYXJhbXMubW9kZSkgeworCWNhc2UgQk9ORF9NT0RFX0FDVElWRUJBQ0tVUDoKKwkJLyogaWYgd2UncmUgaW4gYWN0aXZlLWJhY2t1cCBtb2RlLCB3ZSBuZWVkIG9uZSBhbmQgb25seSBvbmUgYWN0aXZlCisJCSAqIGludGVyZmFjZS4gVGhlIGJhY2t1cCBpbnRlcmZhY2VzIHdpbGwgaGF2ZSB0aGVpciBOT0FSUCBmbGFnIHNldAorCQkgKiBiZWNhdXNlIHdlIG5lZWQgdGhlbSB0byBiZSBjb21wbGV0ZWx5IGRlYWYgYW5kIG5vdCB0byByZXNwb25kIHRvCisJCSAqIGFueSBBUlAgcmVxdWVzdCBvbiB0aGUgbmV0d29yayB0byBhdm9pZCBmb29saW5nIGEgc3dpdGNoLiBUaHVzLAorCQkgKiBzaW5jZSB3ZSBndWFyYW50ZWUgdGhhdCBjdXJyX2FjdGl2ZV9zbGF2ZSBhbHdheXMgcG9pbnQgdG8gdGhlIGxhc3QKKwkJICogdXNhYmxlIGludGVyZmFjZSwgd2UganVzdCBoYXZlIHRvIHZlcmlmeSB0aGlzIGludGVyZmFjZSdzIGZsYWcuCisJCSAqLworCQlpZiAoKCghYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpIHx8CisJCSAgICAgKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlLT5kZXYtPmZsYWdzICYgSUZGX05PQVJQKSkgJiYKKwkJICAgIChuZXdfc2xhdmUtPmxpbmsgIT0gQk9ORF9MSU5LX0RPV04pKSB7CisJCQlkcHJpbnRrKCJUaGlzIGlzIHRoZSBmaXJzdCBhY3RpdmUgc2xhdmVcbiIpOworCQkJLyogZmlyc3Qgc2xhdmUgb3Igbm8gYWN0aXZlIHNsYXZlIHlldCwgYW5kIHRoaXMgbGluaworCQkJICAgaXMgT0ssIHNvIG1ha2UgdGhpcyBpbnRlcmZhY2UgdGhlIGFjdGl2ZSBvbmUgKi8KKwkJCWJvbmRfY2hhbmdlX2FjdGl2ZV9zbGF2ZShib25kLCBuZXdfc2xhdmUpOworCQl9IGVsc2UgeworCQkJZHByaW50aygiVGhpcyBpcyBqdXN0IGEgYmFja3VwIHNsYXZlXG4iKTsKKwkJCWJvbmRfc2V0X3NsYXZlX2luYWN0aXZlX2ZsYWdzKG5ld19zbGF2ZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCT05EX01PREVfODAyM0FEOgorCQkvKiBpbiA4MDIuM2FkIG1vZGUsIHRoZSBpbnRlcm5hbCBtZWNoYW5pc20KKwkJICogd2lsbCBhY3RpdmF0ZSB0aGUgc2xhdmVzIGluIHRoZSBzZWxlY3RlZAorCQkgKiBhZ2dyZWdhdG9yCisJCSAqLworCQlib25kX3NldF9zbGF2ZV9pbmFjdGl2ZV9mbGFncyhuZXdfc2xhdmUpOworCQkvKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBzbGF2ZSAqLworCQlpZiAoYm9uZC0+c2xhdmVfY250ID09IDEpIHsKKwkJCVNMQVZFX0FEX0lORk8obmV3X3NsYXZlKS5pZCA9IDE7CisJCQkvKiBJbml0aWFsaXplIEFEIHdpdGggdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBBRCB0aW1lciBpcyBjYWxsZWQgaW4gMSBzZWNvbmQKKwkJCSAqIGNhbiBiZSBjYWxsZWQgb25seSBhZnRlciB0aGUgbWFjIGFkZHJlc3Mgb2YgdGhlIGJvbmQgaXMgc2V0CisJCQkgKi8KKwkJCWJvbmRfM2FkX2luaXRpYWxpemUoYm9uZCwgMTAwMC9BRF9USU1FUl9JTlRFUlZBTCwKKwkJCQkJICAgIGJvbmQtPnBhcmFtcy5sYWNwX2Zhc3QpOworCQl9IGVsc2UgeworCQkJU0xBVkVfQURfSU5GTyhuZXdfc2xhdmUpLmlkID0KKwkJCQlTTEFWRV9BRF9JTkZPKG5ld19zbGF2ZS0+cHJldikuaWQgKyAxOworCQl9CisKKwkJYm9uZF8zYWRfYmluZF9zbGF2ZShuZXdfc2xhdmUpOworCQlicmVhazsKKwljYXNlIEJPTkRfTU9ERV9UTEI6CisJY2FzZSBCT05EX01PREVfQUxCOgorCQluZXdfc2xhdmUtPnN0YXRlID0gQk9ORF9TVEFURV9BQ1RJVkU7CisJCWlmICgoIWJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSAmJgorCQkgICAgKG5ld19zbGF2ZS0+bGluayAhPSBCT05EX0xJTktfRE9XTikpIHsKKwkJCS8qIGZpcnN0IHNsYXZlIG9yIG5vIGFjdGl2ZSBzbGF2ZSB5ZXQsIGFuZCB0aGlzIGxpbmsKKwkJCSAqIGlzIE9LLCBzbyBtYWtlIHRoaXMgaW50ZXJmYWNlIHRoZSBhY3RpdmUgb25lCisJCQkgKi8KKwkJCWJvbmRfY2hhbmdlX2FjdGl2ZV9zbGF2ZShib25kLCBuZXdfc2xhdmUpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRwcmludGsoIlRoaXMgc2xhdmUgaXMgYWx3YXlzIGFjdGl2ZSBpbiB0cnVuayBtb2RlXG4iKTsKKworCQkvKiBhbHdheXMgYWN0aXZlIGluIHRydW5rIG1vZGUgKi8KKwkJbmV3X3NsYXZlLT5zdGF0ZSA9IEJPTkRfU1RBVEVfQUNUSVZFOworCisJCS8qIEluIHRydW5raW5nIG1vZGUgdGhlcmUgaXMgbGl0dGxlIG1lYW5pbmcgdG8gY3Vycl9hY3RpdmVfc2xhdmUKKwkJICogYW55d2F5IChpdCBob2xkcyBubyBzcGVjaWFsIHByb3BlcnRpZXMgb2YgdGhlIGJvbmQgZGV2aWNlKSwKKwkJICogc28gd2UgY2FuIGNoYW5nZSBpdCB3aXRob3V0IGNhbGxpbmcgY2hhbmdlX2FjdGl2ZV9pbnRlcmZhY2UoKQorCQkgKi8KKwkJaWYgKCFib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeworCQkJYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUgPSBuZXdfc2xhdmU7CisJCX0KKwkJYnJlYWs7CisJfSAvKiBzd2l0Y2goYm9uZF9tb2RlKSAqLworCisJd3JpdGVfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCWlmIChhcHBfYWJpX3ZlciA8IDEpIHsKKwkJLyoKKwkJICogISEhIFRoaXMgaXMgdG8gc3VwcG9ydCBvbGQgdmVyc2lvbnMgb2YgaWZlbnNsYXZlLgorCQkgKiBXZSBjYW4gcmVtb3ZlIHRoaXMgaW4gMi41IGJlY2F1c2Ugb3VyIGlmZW5zbGF2ZSB0YWtlcworCQkgKiBjYXJlIG9mIHRoaXMgZm9yIHVzLgorCQkgKiBXZSBjaGVjayB0byBzZWUgaWYgdGhlIG1hc3RlciBoYXMgYSBtYWMgYWRkcmVzcyB5ZXQuCisJCSAqIElmIG5vdCwgd2UnbGwgZ2l2ZSBpdCB0aGUgbWFjIGFkZHJlc3Mgb2Ygb3VyIHNsYXZlIGRldmljZS4KKwkJICovCisJCWludCBuZHggPSAwOworCisJCWZvciAobmR4ID0gMDsgbmR4IDwgYm9uZF9kZXYtPmFkZHJfbGVuOyBuZHgrKykgeworCQkJZHByaW50aygiQ2hlY2tpbmcgbmR4PSVkIG9mIGJvbmRfZGV2LT5kZXZfYWRkclxuIiwKKwkJCQluZHgpOworCQkJaWYgKGJvbmRfZGV2LT5kZXZfYWRkcltuZHhdICE9IDApIHsKKwkJCQlkcHJpbnRrKCJGb3VuZCBub24temVybyBieXRlIGF0IG5keD0lZFxuIiwKKwkJCQkJbmR4KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChuZHggPT0gYm9uZF9kZXYtPmFkZHJfbGVuKSB7CisJCQkvKgorCQkJICogV2UgZ290IGFsbCB0aGUgd2F5IHRocm91Z2ggdGhlIGFkZHJlc3MgYW5kIGl0IHdhcworCQkJICogYWxsIDAncy4KKwkJCSAqLworCQkJZHByaW50aygiJXMgZG9lc24ndCBoYXZlIGEgTUFDIGFkZHJlc3MgeWV0LiAgXG4iLAorCQkJCWJvbmRfZGV2LT5uYW1lKTsKKwkJCWRwcmludGsoIkdvaW5nIHRvIGdpdmUgYXNzaWduIGl0IGZyb20gJXMuXG4iLAorCQkJCXNsYXZlX2Rldi0+bmFtZSk7CisJCQlib25kX3NldGh3YWRkcihib25kX2Rldiwgc2xhdmVfZGV2KTsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkgICAgICAgIjogJXM6IGVuc2xhdmluZyAlcyBhcyBhJXMgaW50ZXJmYWNlIHdpdGggYSVzIGxpbmsuXG4iLAorCSAgICAgICBib25kX2Rldi0+bmFtZSwgc2xhdmVfZGV2LT5uYW1lLAorCSAgICAgICBuZXdfc2xhdmUtPnN0YXRlID09IEJPTkRfU1RBVEVfQUNUSVZFID8gIm4gYWN0aXZlIiA6ICIgYmFja3VwIiwKKwkgICAgICAgbmV3X3NsYXZlLT5saW5rICE9IEJPTkRfTElOS19ET1dOID8gIm4gdXAiIDogIiBkb3duIik7CisKKwkvKiBlbnNsYXZlIGlzIHN1Y2Nlc3NmdWwgKi8KKwlyZXR1cm4gMDsKKworLyogVW5kbyBzdGFnZXMgb24gZXJyb3IgKi8KK2Vycl91bnNldF9tYXN0ZXI6CisJbmV0ZGV2X3NldF9tYXN0ZXIoc2xhdmVfZGV2LCBOVUxMKTsKKworZXJyX2Nsb3NlOgorCWRldl9jbG9zZShzbGF2ZV9kZXYpOworCitlcnJfcmVzdG9yZV9tYWM6CisJbWVtY3B5KGFkZHIuc2FfZGF0YSwgbmV3X3NsYXZlLT5wZXJtX2h3YWRkciwgRVRIX0FMRU4pOworCWFkZHIuc2FfZmFtaWx5ID0gc2xhdmVfZGV2LT50eXBlOworCWRldl9zZXRfbWFjX2FkZHJlc3Moc2xhdmVfZGV2LCAmYWRkcik7CisKK2Vycl9mcmVlOgorCWtmcmVlKG5ld19zbGF2ZSk7CisKK2Vycl91bmRvX2ZsYWdzOgorCWJvbmRfZGV2LT5mZWF0dXJlcyA9IG9sZF9mZWF0dXJlczsKKworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBUcnkgdG8gcmVsZWFzZSB0aGUgc2xhdmUgZGV2aWNlIDxzbGF2ZT4gZnJvbSB0aGUgYm9uZCBkZXZpY2UgPG1hc3Rlcj4KKyAqIEl0IGlzIGxlZ2FsIHRvIGFjY2VzcyBjdXJyX2FjdGl2ZV9zbGF2ZSB3aXRob3V0IGEgbG9jayBiZWNhdXNlIGFsbCB0aGUgZnVuY3Rpb24KKyAqIGlzIHdyaXRlLWxvY2tlZC4KKyAqCisgKiBUaGUgcnVsZXMgZm9yIHNsYXZlIHN0YXRlIHNob3VsZCBiZToKKyAqICAgZm9yIEFjdGl2ZS9CYWNrdXA6CisgKiAgICAgQWN0aXZlIHN0YXlzIG9uIGFsbCBiYWNrdXBzIGdvIGRvd24KKyAqICAgZm9yIEJvbmRlZCBjb25uZWN0aW9uczoKKyAqICAgICBUaGUgZmlyc3QgdXAgaW50ZXJmYWNlIHNob3VsZCBiZSBsZWZ0IG9uIGFuZCBhbGwgb3RoZXJzIGRvd25lZC4KKyAqLworc3RhdGljIGludCBib25kX3JlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IHNsYXZlICpzbGF2ZSwgKm9sZGN1cnJlbnQ7CisJc3RydWN0IHNvY2thZGRyIGFkZHI7CisJaW50IG1hY19hZGRyX2RpZmZlcjsKKworCS8qIHNsYXZlIGlzIG5vdCBhIHNsYXZlIG9yIG1hc3RlciBpcyBub3QgbWFzdGVyIG9mIHRoaXMgc2xhdmUgKi8KKwlpZiAoIShzbGF2ZV9kZXYtPmZsYWdzICYgSUZGX1NMQVZFKSB8fAorCSAgICAoc2xhdmVfZGV2LT5tYXN0ZXIgIT0gYm9uZF9kZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkgICAgICAgIjogRXJyb3I6ICVzOiBjYW5ub3QgcmVsZWFzZSAlcy5cbiIsCisJCSAgICAgICBib25kX2Rldi0+bmFtZSwgc2xhdmVfZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd3JpdGVfbG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwlzbGF2ZSA9IGJvbmRfZ2V0X3NsYXZlX2J5X2Rldihib25kLCBzbGF2ZV9kZXYpOworCWlmICghc2xhdmUpIHsKKwkJLyogbm90IGEgc2xhdmUgb2YgdGhpcyBib25kICovCisJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJICAgICAgICI6ICVzOiAlcyBub3QgZW5zbGF2ZWRcbiIsCisJCSAgICAgICBib25kX2Rldi0+bmFtZSwgc2xhdmVfZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWFjX2FkZHJfZGlmZmVyID0gbWVtY21wKGJvbmRfZGV2LT5kZXZfYWRkciwKKwkJCQkgc2xhdmUtPnBlcm1faHdhZGRyLAorCQkJCSBFVEhfQUxFTik7CisJaWYgKCFtYWNfYWRkcl9kaWZmZXIgJiYgKGJvbmQtPnNsYXZlX2NudCA+IDEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICI6IFdhcm5pbmc6IHRoZSBwZXJtYW5lbnQgSFdhZGRyIG9mICVzICIKKwkJICAgICAgICItICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIC0gaXMgIgorCQkgICAgICAgInN0aWxsIGluIHVzZSBieSAlcy4gU2V0IHRoZSBIV2FkZHIgb2YgIgorCQkgICAgICAgIiVzIHRvIGEgZGlmZmVyZW50IGFkZHJlc3MgdG8gYXZvaWQgIgorCQkgICAgICAgImNvbmZsaWN0cy5cbiIsCisJCSAgICAgICBzbGF2ZV9kZXYtPm5hbWUsCisJCSAgICAgICBzbGF2ZS0+cGVybV9od2FkZHJbMF0sCisJCSAgICAgICBzbGF2ZS0+cGVybV9od2FkZHJbMV0sCisJCSAgICAgICBzbGF2ZS0+cGVybV9od2FkZHJbMl0sCisJCSAgICAgICBzbGF2ZS0+cGVybV9od2FkZHJbM10sCisJCSAgICAgICBzbGF2ZS0+cGVybV9od2FkZHJbNF0sCisJCSAgICAgICBzbGF2ZS0+cGVybV9od2FkZHJbNV0sCisJCSAgICAgICBib25kX2Rldi0+bmFtZSwKKwkJICAgICAgIHNsYXZlX2Rldi0+bmFtZSk7CisJfQorCisJLyogSW5mb3JtIEFEIHBhY2thZ2Ugb2YgdW5iaW5kaW5nIG9mIHNsYXZlLiAqLworCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJCS8qIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgc2xhdmUgaXMKKwkJICogZGV0YWNoZWQgZnJvbSB0aGUgbGlzdAorCQkgKi8KKwkJYm9uZF8zYWRfdW5iaW5kX3NsYXZlKHNsYXZlKTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJICAgICAgICI6ICVzOiByZWxlYXNpbmcgJXMgaW50ZXJmYWNlICVzXG4iLAorCSAgICAgICBib25kX2Rldi0+bmFtZSwKKwkgICAgICAgKHNsYXZlLT5zdGF0ZSA9PSBCT05EX1NUQVRFX0FDVElWRSkKKwkgICAgICAgPyAiYWN0aXZlIiA6ICJiYWNrdXAiLAorCSAgICAgICBzbGF2ZV9kZXYtPm5hbWUpOworCisJb2xkY3VycmVudCA9IGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlOworCisJYm9uZC0+Y3VycmVudF9hcnBfc2xhdmUgPSBOVUxMOworCisJLyogcmVsZWFzZSB0aGUgc2xhdmUgZnJvbSBpdHMgYm9uZCAqLworCWJvbmRfZGV0YWNoX3NsYXZlKGJvbmQsIHNsYXZlKTsKKworCWlmIChib25kLT5wcmltYXJ5X3NsYXZlID09IHNsYXZlKSB7CisJCWJvbmQtPnByaW1hcnlfc2xhdmUgPSBOVUxMOworCX0KKworCWlmIChvbGRjdXJyZW50ID09IHNsYXZlKSB7CisJCWJvbmRfY2hhbmdlX2FjdGl2ZV9zbGF2ZShib25kLCBOVUxMKTsKKwl9CisKKwlpZiAoKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9UTEIpIHx8CisJICAgIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUxCKSkgeworCQkvKiBNdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIHRoZSBzbGF2ZSBoYXMgYmVlbgorCQkgKiBkZXRhY2hlZCBmcm9tIHRoZSBsaXN0IGFuZCB0aGUgY3Vycl9hY3RpdmVfc2xhdmUKKwkJICogaGFzIGJlZW4gY2xlYXJlZCAoaWYgb3VyX3NsYXZlID09IG9sZF9jdXJyZW50KSwKKwkJICogYnV0IGJlZm9yZSBhIG5ldyBhY3RpdmUgc2xhdmUgaXMgc2VsZWN0ZWQuCisJCSAqLworCQlib25kX2FsYl9kZWluaXRfc2xhdmUoYm9uZCwgc2xhdmUpOworCX0KKworCWlmIChvbGRjdXJyZW50ID09IHNsYXZlKSB7CisJCWJvbmRfc2VsZWN0X2FjdGl2ZV9zbGF2ZShib25kKTsKKworCQlpZiAoIWJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkgICAgICAgIjogJXM6IG5vdyBydW5uaW5nIHdpdGhvdXQgYW55IGFjdGl2ZSAiCisJCQkgICAgICAgImludGVyZmFjZSAhXG4iLAorCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lKTsKKwkJfQorCX0KKworCWlmIChib25kLT5zbGF2ZV9jbnQgPT0gMCkgeworCQkvKiBpZiB0aGUgbGFzdCBzbGF2ZSB3YXMgcmVtb3ZlZCwgemVybyB0aGUgbWFjIGFkZHJlc3MKKwkJICogb2YgdGhlIG1hc3RlciBzbyBpdCB3aWxsIGJlIHNldCBieSB0aGUgYXBwbGljYXRpb24KKwkJICogdG8gdGhlIG1hYyBhZGRyZXNzIG9mIHRoZSBmaXJzdCBzbGF2ZQorCQkgKi8KKwkJbWVtc2V0KGJvbmRfZGV2LT5kZXZfYWRkciwgMCwgYm9uZF9kZXYtPmFkZHJfbGVuKTsKKworCQlpZiAobGlzdF9lbXB0eSgmYm9uZC0+dmxhbl9saXN0KSkgeworCQkJYm9uZF9kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkJICAgICAgICI6IFdhcm5pbmc6IGNsZWFyaW5nIEhXIGFkZHJlc3Mgb2YgJXMgd2hpbGUgaXQgIgorCQkJICAgICAgICJzdGlsbCBoYXMgVkxBTnMuXG4iLAorCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJCSAgICAgICAiOiBXaGVuIHJlLWFkZGluZyBzbGF2ZXMsIG1ha2Ugc3VyZSB0aGUgYm9uZCdzICIKKwkJCSAgICAgICAiSFcgYWRkcmVzcyBtYXRjaGVzIGl0cyBWTEFOcycuXG4iKTsKKwkJfQorCX0gZWxzZSBpZiAoKGJvbmRfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEKSAmJgorCQkgICAhYm9uZF9oYXNfY2hhbGxlbmdlZF9zbGF2ZXMoYm9uZCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkgICAgICAgIjogbGFzdCBWTEFOIGNoYWxsZW5nZWQgc2xhdmUgJXMgIgorCQkgICAgICAgImxlZnQgYm9uZCAlcy4gVkxBTiBibG9ja2luZyBpcyByZW1vdmVkXG4iLAorCQkgICAgICAgc2xhdmVfZGV2LT5uYW1lLCBib25kX2Rldi0+bmFtZSk7CisJCWJvbmRfZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQ7CisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCWJvbmRfZGVsX3ZsYW5zX2Zyb21fc2xhdmUoYm9uZCwgc2xhdmVfZGV2KTsKKworCS8qIElmIHRoZSBtb2RlIFVTRVNfUFJJTUFSWSwgdGhlbiB3ZSBzaG91bGQgb25seSByZW1vdmUgaXRzCisJICogcHJvbWlzYyBhbmQgbWMgc2V0dGluZ3MgaWYgaXQgd2FzIHRoZSBjdXJyX2FjdGl2ZV9zbGF2ZSwgYnV0IHRoYXQgd2FzCisJICogYWxyZWFkeSB0YWtlbiBjYXJlIG9mIGFib3ZlIHdoZW4gd2UgZGV0YWNoZWQgdGhlIHNsYXZlCisJICovCisJaWYgKCFVU0VTX1BSSU1BUlkoYm9uZC0+cGFyYW1zLm1vZGUpKSB7CisJCS8qIHVuc2V0IHByb21pc2N1aXR5IGxldmVsIGZyb20gc2xhdmUgKi8KKwkJaWYgKGJvbmRfZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCQlkZXZfc2V0X3Byb21pc2N1aXR5KHNsYXZlX2RldiwgLTEpOworCQl9CisKKwkJLyogdW5zZXQgYWxsbXVsdGkgbGV2ZWwgZnJvbSBzbGF2ZSAqLworCQlpZiAoYm9uZF9kZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCQlkZXZfc2V0X2FsbG11bHRpKHNsYXZlX2RldiwgLTEpOworCQl9CisKKwkJLyogZmx1c2ggbWFzdGVyJ3MgbWNfbGlzdCBmcm9tIHNsYXZlICovCisJCWJvbmRfbWNfbGlzdF9mbHVzaChib25kX2Rldiwgc2xhdmVfZGV2KTsKKwl9CisKKwluZXRkZXZfc2V0X21hc3RlcihzbGF2ZV9kZXYsIE5VTEwpOworCisJLyogY2xvc2Ugc2xhdmUgYmVmb3JlIHJlc3RvcmluZyBpdHMgbWFjIGFkZHJlc3MgKi8KKwlkZXZfY2xvc2Uoc2xhdmVfZGV2KTsKKworCWlmIChhcHBfYWJpX3ZlciA+PSAxKSB7CisJCS8qIHJlc3RvcmUgb3JpZ2luYWwgKCJwZXJtYW5lbnQiKSBtYWMgYWRkcmVzcyAqLworCQltZW1jcHkoYWRkci5zYV9kYXRhLCBzbGF2ZS0+cGVybV9od2FkZHIsIEVUSF9BTEVOKTsKKwkJYWRkci5zYV9mYW1pbHkgPSBzbGF2ZV9kZXYtPnR5cGU7CisJCWRldl9zZXRfbWFjX2FkZHJlc3Moc2xhdmVfZGV2LCAmYWRkcik7CisJfQorCisJLyogcmVzdG9yZSB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlCisJICogSUZGX05PQVJQIGZsYWcgdGhhdCBtaWdodCBoYXZlIGJlZW4KKwkgKiBzZXQgYnkgYm9uZF9zZXRfc2xhdmVfaW5hY3RpdmVfZmxhZ3MoKQorCSAqLworCWlmICgoc2xhdmUtPm9yaWdpbmFsX2ZsYWdzICYgSUZGX05PQVJQKSA9PSAwKSB7CisJCXNsYXZlX2Rldi0+ZmxhZ3MgJj0gfklGRl9OT0FSUDsKKwl9CisKKwlrZnJlZShzbGF2ZSk7CisKKwlyZXR1cm4gMDsgIC8qIGRlbGV0aW9uIE9LICovCit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGFsbCBzbGF2ZXMuCisgKi8KK3N0YXRpYyBpbnQgYm9uZF9yZWxlYXNlX2FsbChzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOworCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXY7CisJc3RydWN0IHNvY2thZGRyIGFkZHI7CisKKwl3cml0ZV9sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCWlmIChib25kLT5zbGF2ZV9jbnQgPT0gMCkgeworCQlnb3RvIG91dDsKKwl9CisKKwlib25kLT5jdXJyZW50X2FycF9zbGF2ZSA9IE5VTEw7CisJYm9uZC0+cHJpbWFyeV9zbGF2ZSA9IE5VTEw7CisJYm9uZF9jaGFuZ2VfYWN0aXZlX3NsYXZlKGJvbmQsIE5VTEwpOworCisJd2hpbGUgKChzbGF2ZSA9IGJvbmQtPmZpcnN0X3NsYXZlKSAhPSBOVUxMKSB7CisJCS8qIEluZm9ybSBBRCBwYWNrYWdlIG9mIHVuYmluZGluZyBvZiBzbGF2ZQorCQkgKiBiZWZvcmUgc2xhdmUgaXMgZGV0YWNoZWQgZnJvbSB0aGUgbGlzdC4KKwkJICovCisJCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJCQlib25kXzNhZF91bmJpbmRfc2xhdmUoc2xhdmUpOworCQl9CisKKwkJc2xhdmVfZGV2ID0gc2xhdmUtPmRldjsKKwkJYm9uZF9kZXRhY2hfc2xhdmUoYm9uZCwgc2xhdmUpOworCisJCWlmICgoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX1RMQikgfHwKKwkJICAgIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUxCKSkgeworCQkJLyogbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciB0aGUgc2xhdmUKKwkJCSAqIGhhcyBiZWVuIGRldGFjaGVkIGZyb20gdGhlIGxpc3QKKwkJCSAqLworCQkJYm9uZF9hbGJfZGVpbml0X3NsYXZlKGJvbmQsIHNsYXZlKTsKKwkJfQorCisJCS8qIG5vdyB0aGF0IHRoZSBzbGF2ZSBpcyBkZXRhY2hlZCwgdW5sb2NrIGFuZCBwZXJmb3JtCisJCSAqIGFsbCB0aGUgdW5kbyBzdGVwcyB0aGF0IHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20KKwkJICogd2l0aGluIGEgbG9jay4KKwkJICovCisJCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwkJYm9uZF9kZWxfdmxhbnNfZnJvbV9zbGF2ZShib25kLCBzbGF2ZV9kZXYpOworCisJCS8qIElmIHRoZSBtb2RlIFVTRVNfUFJJTUFSWSwgdGhlbiB3ZSBzaG91bGQgb25seSByZW1vdmUgaXRzCisJCSAqIHByb21pc2MgYW5kIG1jIHNldHRpbmdzIGlmIGl0IHdhcyB0aGUgY3Vycl9hY3RpdmVfc2xhdmUsIGJ1dCB0aGF0IHdhcworCQkgKiBhbHJlYWR5IHRha2VuIGNhcmUgb2YgYWJvdmUgd2hlbiB3ZSBkZXRhY2hlZCB0aGUgc2xhdmUKKwkJICovCisJCWlmICghVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkgeworCQkJLyogdW5zZXQgcHJvbWlzY3VpdHkgbGV2ZWwgZnJvbSBzbGF2ZSAqLworCQkJaWYgKGJvbmRfZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCQkJZGV2X3NldF9wcm9taXNjdWl0eShzbGF2ZV9kZXYsIC0xKTsKKwkJCX0KKworCQkJLyogdW5zZXQgYWxsbXVsdGkgbGV2ZWwgZnJvbSBzbGF2ZSAqLworCQkJaWYgKGJvbmRfZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkJCWRldl9zZXRfYWxsbXVsdGkoc2xhdmVfZGV2LCAtMSk7CisJCQl9CisKKwkJCS8qIGZsdXNoIG1hc3RlcidzIG1jX2xpc3QgZnJvbSBzbGF2ZSAqLworCQkJYm9uZF9tY19saXN0X2ZsdXNoKGJvbmRfZGV2LCBzbGF2ZV9kZXYpOworCQl9CisKKwkJbmV0ZGV2X3NldF9tYXN0ZXIoc2xhdmVfZGV2LCBOVUxMKTsKKworCQkvKiBjbG9zZSBzbGF2ZSBiZWZvcmUgcmVzdG9yaW5nIGl0cyBtYWMgYWRkcmVzcyAqLworCQlkZXZfY2xvc2Uoc2xhdmVfZGV2KTsKKworCQlpZiAoYXBwX2FiaV92ZXIgPj0gMSkgeworCQkJLyogcmVzdG9yZSBvcmlnaW5hbCAoInBlcm1hbmVudCIpIG1hYyBhZGRyZXNzKi8KKwkJCW1lbWNweShhZGRyLnNhX2RhdGEsIHNsYXZlLT5wZXJtX2h3YWRkciwgRVRIX0FMRU4pOworCQkJYWRkci5zYV9mYW1pbHkgPSBzbGF2ZV9kZXYtPnR5cGU7CisJCQlkZXZfc2V0X21hY19hZGRyZXNzKHNsYXZlX2RldiwgJmFkZHIpOworCQl9CisKKwkJLyogcmVzdG9yZSB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIElGRl9OT0FSUCBmbGFnIHRoYXQgbWlnaHQgaGF2ZQorCQkgKiBiZWVuIHNldCBieSBib25kX3NldF9zbGF2ZV9pbmFjdGl2ZV9mbGFncygpCisJCSAqLworCQlpZiAoKHNsYXZlLT5vcmlnaW5hbF9mbGFncyAmIElGRl9OT0FSUCkgPT0gMCkgeworCQkJc2xhdmVfZGV2LT5mbGFncyAmPSB+SUZGX05PQVJQOworCQl9CisKKwkJa2ZyZWUoc2xhdmUpOworCisJCS8qIHJlLWFjcXVpcmUgdGhlIGxvY2sgYmVmb3JlIGdldHRpbmcgdGhlIG5leHQgc2xhdmUgKi8KKwkJd3JpdGVfbG9ja19iaCgmYm9uZC0+bG9jayk7CisJfQorCisJLyogemVybyB0aGUgbWFjIGFkZHJlc3Mgb2YgdGhlIG1hc3RlciBzbyBpdCB3aWxsIGJlCisJICogc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgbWFjIGFkZHJlc3Mgb2YgdGhlCisJICogZmlyc3Qgc2xhdmUKKwkgKi8KKwltZW1zZXQoYm9uZF9kZXYtPmRldl9hZGRyLCAwLCBib25kX2Rldi0+YWRkcl9sZW4pOworCisJaWYgKGxpc3RfZW1wdHkoJmJvbmQtPnZsYW5fbGlzdCkpIHsKKwkJYm9uZF9kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICI6IFdhcm5pbmc6IGNsZWFyaW5nIEhXIGFkZHJlc3Mgb2YgJXMgd2hpbGUgaXQgIgorCQkgICAgICAgInN0aWxsIGhhcyBWTEFOcy5cbiIsCisJCSAgICAgICBib25kX2Rldi0+bmFtZSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICI6IFdoZW4gcmUtYWRkaW5nIHNsYXZlcywgbWFrZSBzdXJlIHRoZSBib25kJ3MgIgorCQkgICAgICAgIkhXIGFkZHJlc3MgbWF0Y2hlcyBpdHMgVkxBTnMnLlxuIik7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCSAgICAgICAiOiAlczogcmVsZWFzZWQgYWxsIHNsYXZlc1xuIiwKKwkgICAgICAgYm9uZF9kZXYtPm5hbWUpOworCitvdXQ6CisJd3JpdGVfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBhY3RpdmUgc2xhdmUgdG8gc2xhdmUgPHNsYXZlX2Rldj4uCisgKiBJdCByZXR1cm5zIC1FSU5WQUwgaW4gdGhlIGZvbGxvd2luZyBjYXNlcy4KKyAqICAtIDxzbGF2ZV9kZXY+IGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdC4KKyAqICAtIFRoZXJlIGlzIG5vdCBhY3RpdmUgc2xhdmUgbm93LgorICogIC0gPHNsYXZlX2Rldj4gaXMgYWxyZWFkeSBhY3RpdmUuCisgKiAgLSBUaGUgbGluayBzdGF0ZSBvZiA8c2xhdmVfZGV2PiBpcyBub3QgQk9ORF9MSU5LX1VQLgorICogIC0gPHNsYXZlX2Rldj4gaXMgbm90IHJ1bm5pbmcuCisgKiBJbiB0aGVzZSBjYXNlcywgdGhpcyBmdWN0aW9uIGRvZXMgbm90aGluZy4KKyAqIEluIHRoZSBvdGhlciBjYXNlcywgY3Vycm50X3NsYXZlIHBvaW50ZXIgaXMgY2hhbmdlZCBhbmQgMCBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGludCBib25kX2lvY3RsX2NoYW5nZV9hY3RpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IHNsYXZlICpvbGRfYWN0aXZlID0gTlVMTDsKKwlzdHJ1Y3Qgc2xhdmUgKm5ld19hY3RpdmUgPSBOVUxMOworCWludCByZXMgPSAwOworCisJaWYgKCFVU0VTX1BSSU1BUlkoYm9uZC0+cGFyYW1zLm1vZGUpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFZlcmlmeSB0aGF0IG1hc3Rlcl9kZXYgaXMgaW5kZWVkIHRoZSBtYXN0ZXIgb2Ygc2xhdmVfZGV2ICovCisJaWYgKCEoc2xhdmVfZGV2LT5mbGFncyAmIElGRl9TTEFWRSkgfHwKKwkgICAgKHNsYXZlX2Rldi0+bWFzdGVyICE9IGJvbmRfZGV2KSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCW9sZF9hY3RpdmUgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKKwluZXdfYWN0aXZlID0gYm9uZF9nZXRfc2xhdmVfYnlfZGV2KGJvbmQsIHNsYXZlX2Rldik7CisKKwkvKgorCSAqIENoYW5naW5nIHRvIHRoZSBjdXJyZW50IGFjdGl2ZTogZG8gbm90aGluZzsgcmV0dXJuIHN1Y2Nlc3MuCisJICovCisJaWYgKG5ld19hY3RpdmUgJiYgKG5ld19hY3RpdmUgPT0gb2xkX2FjdGl2ZSkpIHsKKwkJd3JpdGVfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChuZXdfYWN0aXZlKSAmJgorCSAgICAob2xkX2FjdGl2ZSkgJiYKKwkgICAgKG5ld19hY3RpdmUtPmxpbmsgPT0gQk9ORF9MSU5LX1VQKSAmJgorCSAgICBJU19VUChuZXdfYWN0aXZlLT5kZXYpKSB7CisJCWJvbmRfY2hhbmdlX2FjdGl2ZV9zbGF2ZShib25kLCBuZXdfYWN0aXZlKTsKKwl9IGVsc2UgeworCQlyZXMgPSAtRUlOVkFMOworCX0KKworCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGJvbmRfZXRodG9vbF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCXN0cnVjdCBldGh0b29sX2RydmluZm8gaW5mbzsKKwl2b2lkIF9fdXNlciAqYWRkciA9IGlmci0+aWZyX2RhdGE7CisJdWludDMyX3QgY21kOworCisJaWYgKGdldF91c2VyKGNtZCwgKHVpbnQzMl90IF9fdXNlciAqKWFkZHIpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBFVEhUT09MX0dEUlZJTkZPOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFkZHIsIHNpemVvZihpbmZvKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJaWYgKHN0cmNtcChpbmZvLmRyaXZlciwgImlmZW5zbGF2ZSIpID09IDApIHsKKwkJCWludCBuZXdfYWJpX3ZlcjsKKwkJCWNoYXIgKmVuZHB0cjsKKworCQkJbmV3X2FiaV92ZXIgPSBzaW1wbGVfc3RydG91bChpbmZvLmZ3X3ZlcnNpb24sCisJCQkJCQkgICAgICZlbmRwdHIsIDApOworCQkJaWYgKCplbmRwdHIpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKKwkJCQkgICAgICAgIjogRXJyb3I6IGdvdCBpbnZhbGlkIEFCSSAiCisJCQkJICAgICAgICJ2ZXJzaW9uIGZyb20gYXBwbGljYXRpb25cbiIpOworCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlmIChvcmlnX2FwcF9hYmlfdmVyID09IC0xKSB7CisJCQkJb3JpZ19hcHBfYWJpX3ZlciAgPSBuZXdfYWJpX3ZlcjsKKwkJCX0KKworCQkJYXBwX2FiaV92ZXIgPSBuZXdfYWJpX3ZlcjsKKwkJfQorCisJCXN0cm5jcHkoaW5mby5kcml2ZXIsICBEUlZfTkFNRSwgMzIpOworCQlzdHJuY3B5KGluZm8udmVyc2lvbiwgRFJWX1ZFUlNJT04sIDMyKTsKKwkJc25wcmludGYoaW5mby5md192ZXJzaW9uLCAzMiwgIiVkIiwgQk9ORF9BQklfVkVSU0lPTik7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhZGRyLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgaW50IGJvbmRfaW5mb19xdWVyeShzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIHN0cnVjdCBpZmJvbmQgKmluZm8pCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKworCWluZm8tPmJvbmRfbW9kZSA9IGJvbmQtPnBhcmFtcy5tb2RlOworCWluZm8tPm1paW1vbiA9IGJvbmQtPnBhcmFtcy5taWltb247CisKKwlyZWFkX2xvY2tfYmgoJmJvbmQtPmxvY2spOworCWluZm8tPm51bV9zbGF2ZXMgPSBib25kLT5zbGF2ZV9jbnQ7CisJcmVhZF91bmxvY2tfYmgoJmJvbmQtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm9uZF9zbGF2ZV9pbmZvX3F1ZXJ5KHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2Rldiwgc3RydWN0IGlmc2xhdmUgKmluZm8pCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOworCWludCBpLCBmb3VuZCA9IDA7CisKKwlpZiAoaW5mby0+c2xhdmVfaWQgPCAwKSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlYWRfbG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCWlmIChpID09IChpbnQpaW5mby0+c2xhdmVfaWQpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmVhZF91bmxvY2tfYmgoJmJvbmQtPmxvY2spOworCisJaWYgKGZvdW5kKSB7CisJCXN0cmNweShpbmZvLT5zbGF2ZV9uYW1lLCBzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJaW5mby0+bGluayA9IHNsYXZlLT5saW5rOworCQlpbmZvLT5zdGF0ZSA9IHNsYXZlLT5zdGF0ZTsKKwkJaW5mby0+bGlua19mYWlsdXJlX2NvdW50ID0gc2xhdmUtPmxpbmtfZmFpbHVyZV9jb3VudDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb25pdG9yaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCByZWd1bGFybHkgdG8gbW9uaXRvciBlYWNoIHNsYXZlJ3MgbGluay4gKi8KK3N0YXRpYyB2b2lkIGJvbmRfbWlpX21vbml0b3Ioc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IHNsYXZlICpzbGF2ZSwgKm9sZGN1cnJlbnQ7CisJaW50IGRvX2ZhaWxvdmVyID0gMDsKKwlpbnQgZGVsdGFfaW5fdGlja3M7CisJaW50IGk7CisKKwlyZWFkX2xvY2soJmJvbmQtPmxvY2spOworCisJZGVsdGFfaW5fdGlja3MgPSAoYm9uZC0+cGFyYW1zLm1paW1vbiAqIEhaKSAvIDEwMDA7CisKKwlpZiAoYm9uZC0+a2lsbF90aW1lcnMpIHsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGJvbmQtPnNsYXZlX2NudCA9PSAwKSB7CisJCWdvdG8gcmVfYXJtOworCX0KKworCS8qIHdlIHdpbGwgdHJ5IHRvIHJlYWQgdGhlIGxpbmsgc3RhdHVzIG9mIGVhY2ggb2Ygb3VyIHNsYXZlcywgYW5kCisJICogc2V0IHRoZWlyIElGRl9SVU5OSU5HIGZsYWcgYXBwcm9wcmlhdGVseS4gRm9yIGVhY2ggc2xhdmUgbm90CisJICogc3VwcG9ydGluZyBNSUkgc3RhdHVzLCB3ZSB3b24ndCBkbyBhbnl0aGluZyBzbyB0aGF0IGEgdXNlci1zcGFjZQorCSAqIHByb2dyYW0gY291bGQgbW9uaXRvciB0aGUgbGluayBpdHNlbGYgaWYgbmVlZGVkLgorCSAqLworCisJcmVhZF9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCW9sZGN1cnJlbnQgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKKwlyZWFkX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldiA9IHNsYXZlLT5kZXY7CisJCWludCBsaW5rX3N0YXRlOworCQl1MTYgb2xkX3NwZWVkID0gc2xhdmUtPnNwZWVkOworCQl1OCBvbGRfZHVwbGV4ID0gc2xhdmUtPmR1cGxleDsKKworCQlsaW5rX3N0YXRlID0gYm9uZF9jaGVja19kZXZfbGluayhib25kLCBzbGF2ZV9kZXYsIDApOworCisJCXN3aXRjaCAoc2xhdmUtPmxpbmspIHsKKwkJY2FzZSBCT05EX0xJTktfVVA6CS8qIHRoZSBsaW5rIHdhcyB1cCAqLworCQkJaWYgKGxpbmtfc3RhdGUgPT0gQk1TUl9MU1RBVFVTKSB7CisJCQkJLyogbGluayBzdGF5cyB1cCwgbm90aGluZyBtb3JlIHRvIGRvICovCisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeyAvKiBsaW5rIGdvaW5nIGRvd24gKi8KKwkJCQlzbGF2ZS0+bGluayAgPSBCT05EX0xJTktfRkFJTDsKKwkJCQlzbGF2ZS0+ZGVsYXkgPSBib25kLT5wYXJhbXMuZG93bmRlbGF5OworCisJCQkJaWYgKHNsYXZlLT5saW5rX2ZhaWx1cmVfY291bnQgPCBVSU5UX01BWCkgeworCQkJCQlzbGF2ZS0+bGlua19mYWlsdXJlX2NvdW50Kys7CisJCQkJfQorCisJCQkJaWYgKGJvbmQtPnBhcmFtcy5kb3duZGVsYXkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkJCQkgICAgICAgIjogJXM6IGxpbmsgc3RhdHVzIGRvd24gZm9yICVzICIKKwkJCQkJICAgICAgICJpbnRlcmZhY2UgJXMsIGRpc2FibGluZyBpdCBpbiAiCisJCQkJCSAgICAgICAiJWQgbXMuXG4iLAorCQkJCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsCisJCQkJCSAgICAgICBJU19VUChzbGF2ZV9kZXYpCisJCQkJCSAgICAgICA/ICgoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FDVElWRUJBQ0tVUCkKKwkJCQkJCSAgPyAoKHNsYXZlID09IG9sZGN1cnJlbnQpCisJCQkJCQkgICAgID8gImFjdGl2ZSAiIDogImJhY2t1cCAiKQorCQkJCQkJICA6ICIiKQorCQkJCQkgICAgICAgOiAiaWRsZSAiLAorCQkJCQkgICAgICAgc2xhdmVfZGV2LT5uYW1lLAorCQkJCQkgICAgICAgYm9uZC0+cGFyYW1zLmRvd25kZWxheSAqIGJvbmQtPnBhcmFtcy5taWltb24pOworCQkJCX0KKwkJCX0KKwkJCS8qIG5vIGJyZWFrICEgZmFsbCB0aHJvdWdoIHRoZSBCT05EX0xJTktfRkFJTCB0ZXN0IHRvCisJCQkgICBlbnN1cmUgcHJvcGVyIGFjdGlvbiB0byBiZSB0YWtlbgorCQkJKi8KKwkJY2FzZSBCT05EX0xJTktfRkFJTDoJLyogdGhlIGxpbmsgaGFzIGp1c3QgZ29uZSBkb3duICovCisJCQlpZiAobGlua19zdGF0ZSAhPSBCTVNSX0xTVEFUVVMpIHsKKwkJCQkvKiBsaW5rIHN0YXlzIGRvd24gKi8KKwkJCQlpZiAoc2xhdmUtPmRlbGF5IDw9IDApIHsKKwkJCQkJLyogbGluayBkb3duIGZvciB0b28gbG9uZyB0aW1lICovCisJCQkJCXNsYXZlLT5saW5rID0gQk9ORF9MSU5LX0RPV047CisKKwkJCQkJLyogaW4gYWN0aXZlL2JhY2t1cCBtb2RlLCB3ZSBtdXN0CisJCQkJCSAqIGNvbXBsZXRlbHkgZGlzYWJsZSB0aGlzIGludGVyZmFjZQorCQkJCQkgKi8KKwkJCQkJaWYgKChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB8fAorCQkJCQkgICAgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpKSB7CisJCQkJCQlib25kX3NldF9zbGF2ZV9pbmFjdGl2ZV9mbGFncyhzbGF2ZSk7CisJCQkJCX0KKworCQkJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkJCSAgICAgICAiOiAlczogbGluayBzdGF0dXMgZGVmaW5pdGVseSAiCisJCQkJCSAgICAgICAiZG93biBmb3IgaW50ZXJmYWNlICVzLCAiCisJCQkJCSAgICAgICAiZGlzYWJsaW5nIGl0XG4iLAorCQkJCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsCisJCQkJCSAgICAgICBzbGF2ZV9kZXYtPm5hbWUpOworCisJCQkJCS8qIG5vdGlmeSBhZCB0aGF0IHRoZSBsaW5rIHN0YXR1cyBoYXMgY2hhbmdlZCAqLworCQkJCQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCQkJCQkJYm9uZF8zYWRfaGFuZGxlX2xpbmtfY2hhbmdlKHNsYXZlLCBCT05EX0xJTktfRE9XTik7CisJCQkJCX0KKworCQkJCQlpZiAoKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9UTEIpIHx8CisJCQkJCSAgICAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FMQikpIHsKKwkJCQkJCWJvbmRfYWxiX2hhbmRsZV9saW5rX2NoYW5nZShib25kLCBzbGF2ZSwgQk9ORF9MSU5LX0RPV04pOworCQkJCQl9CisKKwkJCQkJaWYgKHNsYXZlID09IG9sZGN1cnJlbnQpIHsKKwkJCQkJCWRvX2ZhaWxvdmVyID0gMTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXNsYXZlLT5kZWxheS0tOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogbGluayB1cCBhZ2FpbiAqLworCQkJCXNsYXZlLT5saW5rICA9IEJPTkRfTElOS19VUDsKKwkJCQlzbGF2ZS0+amlmZmllcyA9IGppZmZpZXM7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkJCSAgICAgICAiOiAlczogbGluayBzdGF0dXMgdXAgYWdhaW4gYWZ0ZXIgJWQgIgorCQkJCSAgICAgICAibXMgZm9yIGludGVyZmFjZSAlcy5cbiIsCisJCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lLAorCQkJCSAgICAgICAoYm9uZC0+cGFyYW1zLmRvd25kZWxheSAtIHNsYXZlLT5kZWxheSkgKiBib25kLT5wYXJhbXMubWlpbW9uLAorCQkJCSAgICAgICBzbGF2ZV9kZXYtPm5hbWUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQk9ORF9MSU5LX0RPV046CS8qIHRoZSBsaW5rIHdhcyBkb3duICovCisJCQlpZiAobGlua19zdGF0ZSAhPSBCTVNSX0xTVEFUVVMpIHsKKwkJCQkvKiB0aGUgbGluayBzdGF5cyBkb3duLCBub3RoaW5nIG1vcmUgdG8gZG8gKi8KKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CS8qIGxpbmsgZ29pbmcgdXAgKi8KKwkJCQlzbGF2ZS0+bGluayAgPSBCT05EX0xJTktfQkFDSzsKKwkJCQlzbGF2ZS0+ZGVsYXkgPSBib25kLT5wYXJhbXMudXBkZWxheTsKKworCQkJCWlmIChib25kLT5wYXJhbXMudXBkZWxheSkgeworCQkJCQkvKiBpZiB1cGRlbGF5ID09IDAsIG5vIG5lZWQgdG8KKwkJCQkJICAgYWR2ZXJ0aXNlIGFib3V0IGEgMCBtcyBkZWxheSAqLworCQkJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkJCSAgICAgICAiOiAlczogbGluayBzdGF0dXMgdXAgZm9yICIKKwkJCQkJICAgICAgICJpbnRlcmZhY2UgJXMsIGVuYWJsaW5nIGl0ICIKKwkJCQkJICAgICAgICJpbiAlZCBtcy5cbiIsCisJCQkJCSAgICAgICBib25kX2Rldi0+bmFtZSwKKwkJCQkJICAgICAgIHNsYXZlX2Rldi0+bmFtZSwKKwkJCQkJICAgICAgIGJvbmQtPnBhcmFtcy51cGRlbGF5ICogYm9uZC0+cGFyYW1zLm1paW1vbik7CisJCQkJfQorCQkJfQorCQkJLyogbm8gYnJlYWsgISBmYWxsIHRocm91Z2ggdGhlIEJPTkRfTElOS19CQUNLIHN0YXRlIGluCisJCQkgICBjYXNlIHRoZXJlJ3Mgc29tZXRoaW5nIHRvIGRvLgorCQkJKi8KKwkJY2FzZSBCT05EX0xJTktfQkFDSzoJLyogdGhlIGxpbmsgaGFzIGp1c3QgY29tZSBiYWNrICovCisJCQlpZiAobGlua19zdGF0ZSAhPSBCTVNSX0xTVEFUVVMpIHsKKwkJCQkvKiBsaW5rIGRvd24gYWdhaW4gKi8KKwkJCQlzbGF2ZS0+bGluayAgPSBCT05EX0xJTktfRE9XTjsKKworCQkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCQkgICAgICAgIjogJXM6IGxpbmsgc3RhdHVzIGRvd24gYWdhaW4gYWZ0ZXIgJWQgIgorCQkJCSAgICAgICAibXMgZm9yIGludGVyZmFjZSAlcy5cbiIsCisJCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lLAorCQkJCSAgICAgICAoYm9uZC0+cGFyYW1zLnVwZGVsYXkgLSBzbGF2ZS0+ZGVsYXkpICogYm9uZC0+cGFyYW1zLm1paW1vbiwKKwkJCQkgICAgICAgc2xhdmVfZGV2LT5uYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogbGluayBzdGF5cyB1cCAqLworCQkJCWlmIChzbGF2ZS0+ZGVsYXkgPT0gMCkgeworCQkJCQkvKiBub3cgdGhlIGxpbmsgaGFzIGJlZW4gdXAgZm9yIGxvbmcgdGltZSBlbm91Z2ggKi8KKwkJCQkJc2xhdmUtPmxpbmsgPSBCT05EX0xJTktfVVA7CisJCQkJCXNsYXZlLT5qaWZmaWVzID0gamlmZmllczsKKworCQkJCQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCQkJCQkJLyogcHJldmVudCBpdCBmcm9tIGJlaW5nIHRoZSBhY3RpdmUgb25lICovCisJCQkJCQlzbGF2ZS0+c3RhdGUgPSBCT05EX1NUQVRFX0JBQ0tVUDsKKwkJCQkJfSBlbHNlIGlmIChib25kLT5wYXJhbXMubW9kZSAhPSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB7CisJCQkJCQkvKiBtYWtlIGl0IGltbWVkaWF0ZWx5IGFjdGl2ZSAqLworCQkJCQkJc2xhdmUtPnN0YXRlID0gQk9ORF9TVEFURV9BQ1RJVkU7CisJCQkJCX0gZWxzZSBpZiAoc2xhdmUgIT0gYm9uZC0+cHJpbWFyeV9zbGF2ZSkgeworCQkJCQkJLyogcHJldmVudCBpdCBmcm9tIGJlaW5nIHRoZSBhY3RpdmUgb25lICovCisJCQkJCQlzbGF2ZS0+c3RhdGUgPSBCT05EX1NUQVRFX0JBQ0tVUDsKKwkJCQkJfQorCisJCQkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCQkJICAgICAgICI6ICVzOiBsaW5rIHN0YXR1cyBkZWZpbml0ZWx5ICIKKwkJCQkJICAgICAgICJ1cCBmb3IgaW50ZXJmYWNlICVzLlxuIiwKKwkJCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lLAorCQkJCQkgICAgICAgc2xhdmVfZGV2LT5uYW1lKTsKKworCQkJCQkvKiBub3RpZnkgYWQgdGhhdCB0aGUgbGluayBzdGF0dXMgaGFzIGNoYW5nZWQgKi8KKwkJCQkJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwkJCQkJCWJvbmRfM2FkX2hhbmRsZV9saW5rX2NoYW5nZShzbGF2ZSwgQk9ORF9MSU5LX1VQKTsKKwkJCQkJfQorCisJCQkJCWlmICgoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX1RMQikgfHwKKwkJCQkJICAgIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUxCKSkgeworCQkJCQkJYm9uZF9hbGJfaGFuZGxlX2xpbmtfY2hhbmdlKGJvbmQsIHNsYXZlLCBCT05EX0xJTktfVVApOworCQkJCQl9CisKKwkJCQkJaWYgKCghb2xkY3VycmVudCkgfHwKKwkJCQkJICAgIChzbGF2ZSA9PSBib25kLT5wcmltYXJ5X3NsYXZlKSkgeworCQkJCQkJZG9fZmFpbG92ZXIgPSAxOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJc2xhdmUtPmRlbGF5LS07CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBTaG91bGQgbm90IGhhcHBlbiAqLworCQkJcHJpbnRrKEtFUk5fRVJSICJib25kaW5nOiBFcnJvcjogJXMgIElsbGVnYWwgdmFsdWUgKGxpbms9JWQpXG4iLAorCQkJICAgICAgIHNsYXZlLT5kZXYtPm5hbWUsIHNsYXZlLT5saW5rKTsKKwkJCWdvdG8gb3V0OworCQl9IC8qIGVuZCBvZiBzd2l0Y2ggKHNsYXZlLT5saW5rKSAqLworCisJCWJvbmRfdXBkYXRlX3NwZWVkX2R1cGxleChzbGF2ZSk7CisKKwkJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwkJCWlmIChvbGRfc3BlZWQgIT0gc2xhdmUtPnNwZWVkKSB7CisJCQkJYm9uZF8zYWRfYWRhcHRlcl9zcGVlZF9jaGFuZ2VkKHNsYXZlKTsKKwkJCX0KKworCQkJaWYgKG9sZF9kdXBsZXggIT0gc2xhdmUtPmR1cGxleCkgeworCQkJCWJvbmRfM2FkX2FkYXB0ZXJfZHVwbGV4X2NoYW5nZWQoc2xhdmUpOworCQkJfQorCQl9CisKKwl9IC8qIGVuZCBvZiBmb3IgKi8KKworCWlmIChkb19mYWlsb3ZlcikgeworCQl3cml0ZV9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJCWJvbmRfc2VsZWN0X2FjdGl2ZV9zbGF2ZShib25kKTsKKworCQlpZiAob2xkY3VycmVudCAmJiAhYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCSAgICAgICAiOiAlczogbm93IHJ1bm5pbmcgd2l0aG91dCBhbnkgYWN0aXZlICIKKwkJCSAgICAgICAiaW50ZXJmYWNlICFcbiIsCisJCQkgICAgICAgYm9uZF9kZXYtPm5hbWUpOworCQl9CisKKwkJd3JpdGVfdW5sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCX0KKworcmVfYXJtOgorCWlmIChib25kLT5wYXJhbXMubWlpbW9uKSB7CisJCW1vZF90aW1lcigmYm9uZC0+bWlpX3RpbWVyLCBqaWZmaWVzICsgZGVsdGFfaW5fdGlja3MpOworCX0KK291dDoKKwlyZWFkX3VubG9jaygmYm9uZC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGJvbmRfYXJwX3NlbmRfYWxsKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCWludCBpOworCXUzMiAqdGFyZ2V0cyA9IGJvbmQtPnBhcmFtcy5hcnBfdGFyZ2V0czsKKworCWZvciAoaSA9IDA7IChpIDwgQk9ORF9NQVhfQVJQX1RBUkdFVFMpICYmIHRhcmdldHNbaV07IGkrKykgeworCQlhcnBfc2VuZChBUlBPUF9SRVFVRVNULCBFVEhfUF9BUlAsIHRhcmdldHNbaV0sIHNsYXZlLT5kZXYsCisJCQkgbXlfaXAsIE5VTEwsIHNsYXZlLT5kZXYtPmRldl9hZGRyLAorCQkJIE5VTEwpOworCX0KK30KKworLyoKKyAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHJlZ3VsYXJseSB0byBtb25pdG9yIGVhY2ggc2xhdmUncyBsaW5rCisgKiBlbnN1cmluZyB0aGF0IHRyYWZmaWMgaXMgYmVpbmcgc2VudCBhbmQgcmVjZWl2ZWQgd2hlbiBhcnAgbW9uaXRvcmluZworICogaXMgdXNlZCBpbiBsb2FkLWJhbGFuY2luZyBtb2RlLiBpZiB0aGUgYWRhcHRlciBoYXMgYmVlbiBkb3JtYW50LCB0aGVuIGFuCisgKiBhcnAgaXMgdHJhbnNtaXR0ZWQgdG8gZ2VuZXJhdGUgdHJhZmZpYy4gc2VlIGFjdGl2ZWJhY2t1cF9hcnBfbW9uaXRvciBmb3IKKyAqIGFycCBtb25pdG9yaW5nIGluIGFjdGl2ZSBiYWNrdXAgbW9kZS4KKyAqLworc3RhdGljIHZvaWQgYm9uZF9sb2FkYmFsYW5jZV9hcnBfbW9uKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCXN0cnVjdCBzbGF2ZSAqc2xhdmUsICpvbGRjdXJyZW50OworCWludCBkb19mYWlsb3ZlciA9IDA7CisJaW50IGRlbHRhX2luX3RpY2tzOworCWludCBpOworCisJcmVhZF9sb2NrKCZib25kLT5sb2NrKTsKKworCWRlbHRhX2luX3RpY2tzID0gKGJvbmQtPnBhcmFtcy5hcnBfaW50ZXJ2YWwgKiBIWikgLyAxMDAwOworCisJaWYgKGJvbmQtPmtpbGxfdGltZXJzKSB7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChib25kLT5zbGF2ZV9jbnQgPT0gMCkgeworCQlnb3RvIHJlX2FybTsKKwl9CisKKwlyZWFkX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisJb2xkY3VycmVudCA9IGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlOworCXJlYWRfdW5sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJLyogc2VlIGlmIGFueSBvZiB0aGUgcHJldmlvdXMgZGV2aWNlcyBhcmUgdXAgbm93IChpLmUuIHRoZXkgaGF2ZQorCSAqIHhtdCBhbmQgcmN2IHRyYWZmaWMpLiB0aGUgY3Vycl9hY3RpdmVfc2xhdmUgZG9lcyBub3QgY29tZSBpbnRvCisJICogdGhlIHBpY3R1cmUgdW5sZXNzIGl0IGlzIG51bGwuIGFsc28sIHNsYXZlLT5qaWZmaWVzIGlzIG5vdCBuZWVkZWQKKwkgKiBoZXJlIGJlY2F1c2Ugd2Ugc2VuZCBhbiBhcnAgb24gZWFjaCBzbGF2ZSBhbmQgZ2l2ZSBhIHNsYXZlIGFzCisJICogbG9uZyBhcyBpdCBuZWVkcyB0byBnZXQgdGhlIHR4L3J4IHdpdGhpbiB0aGUgZGVsdGEuCisJICogVE9ETzogd2hhdCBhYm91dCB1cC9kb3duIGRlbGF5IGluIGFycCBtb2RlPyBpdCB3YXNuJ3QgaGVyZSBiZWZvcmUKKwkgKiAgICAgICBzbyBpdCBjYW4gd2FpdAorCSAqLworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJaWYgKHNsYXZlLT5saW5rICE9IEJPTkRfTElOS19VUCkgeworCQkJaWYgKCgoamlmZmllcyAtIHNsYXZlLT5kZXYtPnRyYW5zX3N0YXJ0KSA8PSBkZWx0YV9pbl90aWNrcykgJiYKKwkJCSAgICAoKGppZmZpZXMgLSBzbGF2ZS0+ZGV2LT5sYXN0X3J4KSA8PSBkZWx0YV9pbl90aWNrcykpIHsKKworCQkJCXNsYXZlLT5saW5rICA9IEJPTkRfTElOS19VUDsKKwkJCQlzbGF2ZS0+c3RhdGUgPSBCT05EX1NUQVRFX0FDVElWRTsKKworCQkJCS8qIHByaW1hcnlfc2xhdmUgaGFzIG5vIG1lYW5pbmcgaW4gcm91bmQtcm9iaW4KKwkJCQkgKiBtb2RlLiB0aGUgd2luZG93IG9mIGEgc2xhdmUgYmVpbmcgdXAgYW5kCisJCQkJICogY3Vycl9hY3RpdmVfc2xhdmUgYmVpbmcgbnVsbCBhZnRlciBlbnNsYXZpbmcKKwkJCQkgKiBpcyBjbG9zZWQuCisJCQkJICovCisJCQkJaWYgKCFvbGRjdXJyZW50KSB7CisJCQkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCQkJICAgICAgICI6ICVzOiBsaW5rIHN0YXR1cyBkZWZpbml0ZWx5ICIKKwkJCQkJICAgICAgICJ1cCBmb3IgaW50ZXJmYWNlICVzLCAiLAorCQkJCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsCisJCQkJCSAgICAgICBzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJCQkJZG9fZmFpbG92ZXIgPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCQkJICAgICAgICI6ICVzOiBpbnRlcmZhY2UgJXMgaXMgbm93IHVwXG4iLAorCQkJCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsCisJCQkJCSAgICAgICBzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBzbGF2ZS0+bGluayA9PSBCT05EX0xJTktfVVAgKi8KKworCQkJLyogbm90IGFsbCBzd2l0Y2hlcyB3aWxsIHJlc3BvbmQgdG8gYW4gYXJwIHJlcXVlc3QKKwkJCSAqIHdoZW4gdGhlIHNvdXJjZSBpcCBpcyAwLCBzbyBkb24ndCB0YWtlIHRoZSBsaW5rIGRvd24KKwkJCSAqIGlmIHdlIGRvbid0IGtub3cgb3VyIGlwIHlldAorCQkJICovCisJCQlpZiAoKChqaWZmaWVzIC0gc2xhdmUtPmRldi0+dHJhbnNfc3RhcnQpID49ICgyKmRlbHRhX2luX3RpY2tzKSkgfHwKKwkJCSAgICAoKChqaWZmaWVzIC0gc2xhdmUtPmRldi0+bGFzdF9yeCkgPj0gKDIqZGVsdGFfaW5fdGlja3MpKSAmJgorCQkJICAgICBteV9pcCkpIHsKKworCQkJCXNsYXZlLT5saW5rICA9IEJPTkRfTElOS19ET1dOOworCQkJCXNsYXZlLT5zdGF0ZSA9IEJPTkRfU1RBVEVfQkFDS1VQOworCisJCQkJaWYgKHNsYXZlLT5saW5rX2ZhaWx1cmVfY291bnQgPCBVSU5UX01BWCkgeworCQkJCQlzbGF2ZS0+bGlua19mYWlsdXJlX2NvdW50Kys7CisJCQkJfQorCisJCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkJCSAgICAgICAiOiAlczogaW50ZXJmYWNlICVzIGlzIG5vdyBkb3duLlxuIiwKKwkJCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsCisJCQkJICAgICAgIHNsYXZlLT5kZXYtPm5hbWUpOworCisJCQkJaWYgKHNsYXZlID09IG9sZGN1cnJlbnQpIHsKKwkJCQkJZG9fZmFpbG92ZXIgPSAxOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIG5vdGU6IGlmIHN3aXRjaCBpcyBpbiByb3VuZC1yb2JpbiBtb2RlLCBhbGwgbGlua3MKKwkJICogbXVzdCB0eCBhcnAgdG8gZW5zdXJlIGFsbCBsaW5rcyByeCBhbiBhcnAgLSBvdGhlcndpc2UKKwkJICogbGlua3MgbWF5IG9zY2lsbGF0ZSBvciBub3QgY29tZSB1cCBhdCBhbGw7IGlmIHN3aXRjaCBpcworCQkgKiBpbiBzb21ldGhpbmcgbGlrZSB4b3IgbW9kZSwgdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4KKwkJICogZG8gLSBhbGwgcmVwbGllcyB3aWxsIGJlIHJ4J2VkIG9uIHNhbWUgbGluayBjYXVzaW5nIHNsYXZlcworCQkgKiB0byBiZSB1bnN0YWJsZSBkdXJpbmcgbG93L25vIHRyYWZmaWMgcGVyaW9kcworCQkgKi8KKwkJaWYgKElTX1VQKHNsYXZlLT5kZXYpKSB7CisJCQlib25kX2FycF9zZW5kX2FsbChib25kLCBzbGF2ZSk7CisJCX0KKwl9CisKKwlpZiAoZG9fZmFpbG92ZXIpIHsKKwkJd3JpdGVfbG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCQlib25kX3NlbGVjdF9hY3RpdmVfc2xhdmUoYm9uZCk7CisKKwkJaWYgKG9sZGN1cnJlbnQgJiYgIWJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkgICAgICAgIjogJXM6IG5vdyBydW5uaW5nIHdpdGhvdXQgYW55IGFjdGl2ZSAiCisJCQkgICAgICAgImludGVyZmFjZSAhXG4iLAorCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lKTsKKwkJfQorCisJCXdyaXRlX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKwl9CisKK3JlX2FybToKKwlpZiAoYm9uZC0+cGFyYW1zLmFycF9pbnRlcnZhbCkgeworCQltb2RfdGltZXIoJmJvbmQtPmFycF90aW1lciwgamlmZmllcyArIGRlbHRhX2luX3RpY2tzKTsKKwl9CitvdXQ6CisJcmVhZF91bmxvY2soJmJvbmQtPmxvY2spOworfQorCisvKgorICogV2hlbiB1c2luZyBhcnAgbW9uaXRvcmluZyBpbiBhY3RpdmUtYmFja3VwIG1vZGUsIHRoaXMgZnVuY3Rpb24gaXMKKyAqIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgYW55IGJhY2t1cCBzbGF2ZXMgaGF2ZSB3ZW50IGRvd24gb3IgYSBuZXcKKyAqIGN1cnJlbnQgc2xhdmUgbmVlZHMgdG8gYmUgZm91bmQuCisgKiBUaGUgYmFja3VwIHNsYXZlcyBuZXZlciBnZW5lcmF0ZSB0cmFmZmljLCB0aGV5IGFyZSBjb25zaWRlcmVkIHVwIGJ5IG1lcmVseQorICogcmVjZWl2aW5nIHRyYWZmaWMuIElmIHRoZSBjdXJyZW50IHNsYXZlIGdvZXMgZG93biwgZWFjaCBiYWNrdXAgc2xhdmUgd2lsbAorICogYmUgZ2l2ZW4gdGhlIG9wcG9ydHVuaXR5IHRvIHR4L3J4IGFuIGFycCBiZWZvcmUgYmVpbmcgdGFrZW4gZG93biAtIHRoaXMKKyAqIHByZXZlbnRzIGFsbCBzbGF2ZXMgZnJvbSBiZWluZyB0YWtlbiBkb3duIGR1ZSB0byB0aGUgY3VycmVudCBzbGF2ZSBub3QKKyAqIHNlbmRpbmcgYW55IHRyYWZmaWMgZm9yIHRoZSBiYWNrdXBzIHRvIHJlY2VpdmUuIFRoZSBhcnBzIGFyZSBub3QgbmVjZXNzYXJpbHkKKyAqIG5lY2Vzc2FyeSwgYW55IHR4IGFuZCByeCB0cmFmZmljIHdpbGwga2VlcCB0aGUgY3VycmVudCBzbGF2ZSB1cC4gV2hpbGUgYW55CisgKiByeCB0cmFmZmljIHdpbGwga2VlcCB0aGUgYmFja3VwIHNsYXZlcyB1cCwgdGhlIGN1cnJlbnQgc2xhdmUgaXMgcmVzcG9uc2libGUKKyAqIGZvciBnZW5lcmF0aW5nIHRyYWZmaWMgdG8ga2VlcCB0aGVtIHVwIHJlZ2FyZGxlc3Mgb2YgYW55IG90aGVyIHRyYWZmaWMgdGhleQorICogbWF5IGhhdmUgcmVjZWl2ZWQuCisgKiBzZWUgbG9hZGJhbGFuY2VfYXJwX21vbml0b3IgZm9yIGFycCBtb25pdG9yaW5nIGluIGxvYWQgYmFsYW5jaW5nIG1vZGUKKyAqLworc3RhdGljIHZvaWQgYm9uZF9hY3RpdmViYWNrdXBfYXJwX21vbihzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOworCWludCBkZWx0YV9pbl90aWNrczsKKwlpbnQgaTsKKworCXJlYWRfbG9jaygmYm9uZC0+bG9jayk7CisKKwlkZWx0YV9pbl90aWNrcyA9IChib25kLT5wYXJhbXMuYXJwX2ludGVydmFsICogSFopIC8gMTAwMDsKKworCWlmIChib25kLT5raWxsX3RpbWVycykgeworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYm9uZC0+c2xhdmVfY250ID09IDApIHsKKwkJZ290byByZV9hcm07CisJfQorCisJLyogZGV0ZXJtaW5lIGlmIGFueSBzbGF2ZSBoYXMgY29tZSB1cCBvciBhbnkgYmFja3VwIHNsYXZlIGhhcworCSAqIGdvbmUgZG93bgorCSAqIFRPRE86IHdoYXQgYWJvdXQgdXAvZG93biBkZWxheSBpbiBhcnAgbW9kZT8gaXQgd2Fzbid0IGhlcmUgYmVmb3JlCisJICogICAgICAgc28gaXQgY2FuIHdhaXQKKwkgKi8KKwlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCWlmIChzbGF2ZS0+bGluayAhPSBCT05EX0xJTktfVVApIHsKKwkJCWlmICgoamlmZmllcyAtIHNsYXZlLT5kZXYtPmxhc3RfcngpIDw9IGRlbHRhX2luX3RpY2tzKSB7CisKKwkJCQlzbGF2ZS0+bGluayA9IEJPTkRfTElOS19VUDsKKworCQkJCXdyaXRlX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwkJCQlpZiAoKCFib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgJiYKKwkJCQkgICAgKChqaWZmaWVzIC0gc2xhdmUtPmRldi0+dHJhbnNfc3RhcnQpIDw9IGRlbHRhX2luX3RpY2tzKSkgeworCQkJCQlib25kX2NoYW5nZV9hY3RpdmVfc2xhdmUoYm9uZCwgc2xhdmUpOworCQkJCQlib25kLT5jdXJyZW50X2FycF9zbGF2ZSA9IE5VTEw7CisJCQkJfSBlbHNlIGlmIChib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSAhPSBzbGF2ZSkgeworCQkJCQkvKiB0aGlzIHNsYXZlIGhhcyBqdXN0IGNvbWUgdXAgYnV0IHdlCisJCQkJCSAqIGFscmVhZHkgaGF2ZSBhIGN1cnJlbnQgc2xhdmU7IHRoaXMKKwkJCQkJICogY2FuIGFsc28gaGFwcGVuIGlmIGJvbmRfZW5zbGF2ZSBhZGRzCisJCQkJCSAqIGEgbmV3IHNsYXZlIHRoYXQgaXMgdXAgd2hpbGUgd2UgYXJlCisJCQkJCSAqIHNlYXJjaGluZyBmb3IgYSBuZXcgc2xhdmUKKwkJCQkJICovCisJCQkJCWJvbmRfc2V0X3NsYXZlX2luYWN0aXZlX2ZsYWdzKHNsYXZlKTsKKwkJCQkJYm9uZC0+Y3VycmVudF9hcnBfc2xhdmUgPSBOVUxMOworCQkJCX0KKworCQkJCWlmIChzbGF2ZSA9PSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeworCQkJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkJCSAgICAgICAiOiAlczogJXMgaXMgdXAgYW5kIG5vdyB0aGUgIgorCQkJCQkgICAgICAgImFjdGl2ZSBpbnRlcmZhY2VcbiIsCisJCQkJCSAgICAgICBib25kX2Rldi0+bmFtZSwKKwkJCQkJICAgICAgIHNsYXZlLT5kZXYtPm5hbWUpOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCQkJICAgICAgICI6ICVzOiBiYWNrdXAgaW50ZXJmYWNlICVzIGlzICIKKwkJCQkJICAgICAgICJub3cgdXBcbiIsCisJCQkJCSAgICAgICBib25kX2Rldi0+bmFtZSwKKwkJCQkJICAgICAgIHNsYXZlLT5kZXYtPm5hbWUpOworCQkJCX0KKworCQkJCXdyaXRlX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlYWRfbG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCQkJaWYgKChzbGF2ZSAhPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgJiYKKwkJCSAgICAoIWJvbmQtPmN1cnJlbnRfYXJwX3NsYXZlKSAmJgorCQkJICAgICgoKGppZmZpZXMgLSBzbGF2ZS0+ZGV2LT5sYXN0X3J4KSA+PSAzKmRlbHRhX2luX3RpY2tzKSAmJgorCQkJICAgICBteV9pcCkpIHsKKwkJCQkvKiBhIGJhY2t1cCBzbGF2ZSBoYXMgZ29uZSBkb3duOyB0aHJlZSB0aW1lcworCQkJCSAqIHRoZSBkZWx0YSBhbGxvd3MgdGhlIGN1cnJlbnQgc2xhdmUgdG8gYmUKKwkJCQkgKiB0YWtlbiBvdXQgYmVmb3JlIHRoZSBiYWNrdXAgc2xhdmUuCisJCQkJICogbm90ZTogYSBub24tbnVsbCBjdXJyZW50X2FycF9zbGF2ZSBpbmRpY2F0ZXMKKwkJCQkgKiB0aGUgY3Vycl9hY3RpdmVfc2xhdmUgd2VudCBkb3duIGFuZCB3ZSBhcmUKKwkJCQkgKiBzZWFyY2hpbmcgZm9yIGEgbmV3IG9uZTsgdW5kZXIgdGhpcworCQkJCSAqIGNvbmRpdGlvbiB3ZSBvbmx5IHRha2UgdGhlIGN1cnJfYWN0aXZlX3NsYXZlCisJCQkJICogZG93biAtIHRoaXMgZ2l2ZXMgZWFjaCBzbGF2ZSBhIGNoYW5jZSB0bworCQkJCSAqIHR4L3J4IHRyYWZmaWMgYmVmb3JlIGJlaW5nIHRha2VuIG91dAorCQkJCSAqLworCisJCQkJcmVhZF91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwkJCQlzbGF2ZS0+bGluayAgPSBCT05EX0xJTktfRE9XTjsKKworCQkJCWlmIChzbGF2ZS0+bGlua19mYWlsdXJlX2NvdW50IDwgVUlOVF9NQVgpIHsKKwkJCQkJc2xhdmUtPmxpbmtfZmFpbHVyZV9jb3VudCsrOworCQkJCX0KKworCQkJCWJvbmRfc2V0X3NsYXZlX2luYWN0aXZlX2ZsYWdzKHNsYXZlKTsKKworCQkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCQkgICAgICAgIjogJXM6IGJhY2t1cCBpbnRlcmZhY2UgJXMgaXMgbm93IGRvd25cbiIsCisJCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lLAorCQkJCSAgICAgICBzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVhZF91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisJCQl9CisJCX0KKwl9CisKKwlyZWFkX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisJc2xhdmUgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKKwlyZWFkX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCWlmIChzbGF2ZSkgeworCQkvKiBpZiB3ZSBoYXZlIHNlbnQgdHJhZmZpYyBpbiB0aGUgcGFzdCAyKmFycF9pbnRlcnZhbHMgYnV0CisJCSAqIGhhdmVuJ3QgeG1pdCBhbmQgcnggdHJhZmZpYyBpbiB0aGF0IHRpbWUgaW50ZXJ2YWwsIHNlbGVjdAorCQkgKiBhIGRpZmZlcmVudCBzbGF2ZS4gc2xhdmUtPmppZmZpZXMgaXMgb25seSB1cGRhdGVkIHdoZW4KKwkJICogYSBzbGF2ZSBmaXJzdCBiZWNvbWVzIHRoZSBjdXJyX2FjdGl2ZV9zbGF2ZSAtIG5vdCBuZWNlc3NhcmlseQorCQkgKiBhZnRlciBldmVyeSBhcnA7IHRoaXMgZW5zdXJlcyB0aGUgc2xhdmUgaGFzIGEgZnVsbCAyKmRlbHRhCisJCSAqIGJlZm9yZSBiZWluZyB0YWtlbiBvdXQuIGlmIGEgcHJpbWFyeSBpcyBiZWluZyB1c2VkLCBjaGVjaworCQkgKiBpZiBpdCBpcyB1cCBhbmQgbmVlZHMgdG8gdGFrZSBvdmVyIGFzIHRoZSBjdXJyX2FjdGl2ZV9zbGF2ZQorCQkgKi8KKwkJaWYgKCgoKGppZmZpZXMgLSBzbGF2ZS0+ZGV2LT50cmFuc19zdGFydCkgPj0gKDIqZGVsdGFfaW5fdGlja3MpKSB8fAorCQkgICAgICgoKGppZmZpZXMgLSBzbGF2ZS0+ZGV2LT5sYXN0X3J4KSA+PSAoMipkZWx0YV9pbl90aWNrcykpICYmCisJCSAgICAgIG15X2lwKSkgJiYKKwkJICAgICgoamlmZmllcyAtIHNsYXZlLT5qaWZmaWVzKSA+PSAyKmRlbHRhX2luX3RpY2tzKSkgeworCisJCQlzbGF2ZS0+bGluayAgPSBCT05EX0xJTktfRE9XTjsKKworCQkJaWYgKHNsYXZlLT5saW5rX2ZhaWx1cmVfY291bnQgPCBVSU5UX01BWCkgeworCQkJCXNsYXZlLT5saW5rX2ZhaWx1cmVfY291bnQrKzsKKwkJCX0KKworCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkJICAgICAgICI6ICVzOiBsaW5rIHN0YXR1cyBkb3duIGZvciBhY3RpdmUgaW50ZXJmYWNlICIKKwkJCSAgICAgICAiJXMsIGRpc2FibGluZyBpdFxuIiwKKwkJCSAgICAgICBib25kX2Rldi0+bmFtZSwKKwkJCSAgICAgICBzbGF2ZS0+ZGV2LT5uYW1lKTsKKworCQkJd3JpdGVfbG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCQkJYm9uZF9zZWxlY3RfYWN0aXZlX3NsYXZlKGJvbmQpOworCQkJc2xhdmUgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKKworCQkJd3JpdGVfdW5sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJCQlib25kLT5jdXJyZW50X2FycF9zbGF2ZSA9IHNsYXZlOworCisJCQlpZiAoc2xhdmUpIHsKKwkJCQlzbGF2ZS0+amlmZmllcyA9IGppZmZpZXM7CisJCQl9CisJCX0gZWxzZSBpZiAoKGJvbmQtPnByaW1hcnlfc2xhdmUpICYmCisJCQkgICAoYm9uZC0+cHJpbWFyeV9zbGF2ZSAhPSBzbGF2ZSkgJiYKKwkJCSAgIChib25kLT5wcmltYXJ5X3NsYXZlLT5saW5rID09IEJPTkRfTElOS19VUCkpIHsKKwkJCS8qIGF0IHRoaXMgcG9pbnQsIHNsYXZlIGlzIHRoZSBjdXJyX2FjdGl2ZV9zbGF2ZSAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkJICAgICAgICI6ICVzOiBjaGFuZ2luZyBmcm9tIGludGVyZmFjZSAlcyB0byBwcmltYXJ5ICIKKwkJCSAgICAgICAiaW50ZXJmYWNlICVzXG4iLAorCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lLAorCQkJICAgICAgIHNsYXZlLT5kZXYtPm5hbWUsCisJCQkgICAgICAgYm9uZC0+cHJpbWFyeV9zbGF2ZS0+ZGV2LT5uYW1lKTsKKworCQkJLyogcHJpbWFyeSBpcyB1cCBzbyBzd2l0Y2ggdG8gaXQgKi8KKwkJCXdyaXRlX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisJCQlib25kX2NoYW5nZV9hY3RpdmVfc2xhdmUoYm9uZCwgYm9uZC0+cHJpbWFyeV9zbGF2ZSk7CisJCQl3cml0ZV91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwkJCXNsYXZlID0gYm9uZC0+cHJpbWFyeV9zbGF2ZTsKKwkJCXNsYXZlLT5qaWZmaWVzID0gamlmZmllczsKKwkJfSBlbHNlIHsKKwkJCWJvbmQtPmN1cnJlbnRfYXJwX3NsYXZlID0gTlVMTDsKKwkJfQorCisJCS8qIHRoZSBjdXJyZW50IHNsYXZlIG11c3QgdHggYW4gYXJwIHRvIGVuc3VyZSBiYWNrdXAgc2xhdmVzCisJCSAqIHJ4IHRyYWZmaWMKKwkJICovCisJCWlmIChzbGF2ZSAmJiBteV9pcCkgeworCQkJYm9uZF9hcnBfc2VuZF9hbGwoYm9uZCwgc2xhdmUpOworCQl9CisJfQorCisJLyogaWYgd2UgZG9uJ3QgaGF2ZSBhIGN1cnJfYWN0aXZlX3NsYXZlLCBzZWFyY2ggZm9yIHRoZSBuZXh0IGF2YWlsYWJsZQorCSAqIGJhY2t1cCBzbGF2ZSBmcm9tIHRoZSBjdXJyZW50X2FycF9zbGF2ZSBhbmQgbWFrZSBpdCB0aGUgY2FuZGlkYXRlCisJICogZm9yIGJlY29taW5nIHRoZSBjdXJyX2FjdGl2ZV9zbGF2ZQorCSAqLworCWlmICghc2xhdmUpIHsKKwkJaWYgKCFib25kLT5jdXJyZW50X2FycF9zbGF2ZSkgeworCQkJYm9uZC0+Y3VycmVudF9hcnBfc2xhdmUgPSBib25kLT5maXJzdF9zbGF2ZTsKKwkJfQorCisJCWlmIChib25kLT5jdXJyZW50X2FycF9zbGF2ZSkgeworCQkJYm9uZF9zZXRfc2xhdmVfaW5hY3RpdmVfZmxhZ3MoYm9uZC0+Y3VycmVudF9hcnBfc2xhdmUpOworCisJCQkvKiBzZWFyY2ggZm9yIG5leHQgY2FuZGlkYXRlICovCisJCQlib25kX2Zvcl9lYWNoX3NsYXZlX2Zyb20oYm9uZCwgc2xhdmUsIGksIGJvbmQtPmN1cnJlbnRfYXJwX3NsYXZlKSB7CisJCQkJaWYgKElTX1VQKHNsYXZlLT5kZXYpKSB7CisJCQkJCXNsYXZlLT5saW5rID0gQk9ORF9MSU5LX0JBQ0s7CisJCQkJCWJvbmRfc2V0X3NsYXZlX2FjdGl2ZV9mbGFncyhzbGF2ZSk7CisJCQkJCWJvbmRfYXJwX3NlbmRfYWxsKGJvbmQsIHNsYXZlKTsKKwkJCQkJc2xhdmUtPmppZmZpZXMgPSBqaWZmaWVzOworCQkJCQlib25kLT5jdXJyZW50X2FycF9zbGF2ZSA9IHNsYXZlOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKiBpZiB0aGUgbGluayBzdGF0ZSBpcyB1cCBhdCB0aGlzIHBvaW50LCB3ZQorCQkJCSAqIG1hcmsgaXQgZG93biAtIHRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBoYXZlCisJCQkJICogc2ltdWx0YW5lb3VzIGxpbmsgZmFpbHVyZXMgYW5kCisJCQkJICogcmVzZWxlY3RfYWN0aXZlX2ludGVyZmFjZSBkb2Vzbid0IG1ha2UgdGhpcworCQkJCSAqIG9uZSB0aGUgY3VycmVudCBzbGF2ZSBzbyBpdCBpcyBzdGlsbCBtYXJrZWQKKwkJCQkgKiB1cCB3aGVuIGl0IGlzIGFjdHVhbGx5IGRvd24KKwkJCQkgKi8KKwkJCQlpZiAoc2xhdmUtPmxpbmsgPT0gQk9ORF9MSU5LX1VQKSB7CisJCQkJCXNsYXZlLT5saW5rICA9IEJPTkRfTElOS19ET1dOOworCQkJCQlpZiAoc2xhdmUtPmxpbmtfZmFpbHVyZV9jb3VudCA8IFVJTlRfTUFYKSB7CisJCQkJCQlzbGF2ZS0+bGlua19mYWlsdXJlX2NvdW50Kys7CisJCQkJCX0KKworCQkJCQlib25kX3NldF9zbGF2ZV9pbmFjdGl2ZV9mbGFncyhzbGF2ZSk7CisKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkJCQkgICAgICAgIjogJXM6IGJhY2t1cCBpbnRlcmZhY2UgJXMgaXMgIgorCQkJCQkgICAgICAgIm5vdyBkb3duLlxuIiwKKwkJCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lLAorCQkJCQkgICAgICAgc2xhdmUtPmRldi0+bmFtZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCityZV9hcm06CisJaWYgKGJvbmQtPnBhcmFtcy5hcnBfaW50ZXJ2YWwpIHsKKwkJbW9kX3RpbWVyKCZib25kLT5hcnBfdGltZXIsIGppZmZpZXMgKyBkZWx0YV9pbl90aWNrcyk7CisJfQorb3V0OgorCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJvYy9zZXFfZmlsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworI2RlZmluZSBTRVFfU1RBUlRfVE9LRU4gKCh2b2lkICopMSkKKworc3RhdGljIHZvaWQgKmJvbmRfaW5mb19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gc2VxLT5wcml2YXRlOworCWxvZmZfdCBvZmYgPSAwOworCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CisJaW50IGk7CisKKwkvKiBtYWtlIHN1cmUgdGhlIGJvbmQgd29uJ3QgYmUgdGFrZW4gYXdheSAqLworCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CisJcmVhZF9sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCWlmICgqcG9zID09IDApIHsKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKwl9CisKKwlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCWlmICgrK29mZiA9PSAqcG9zKSB7CisJCQlyZXR1cm4gc2xhdmU7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmJvbmRfaW5mb19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IHNsYXZlICpzbGF2ZSA9IHY7CisKKwkrKypwb3M7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXJldHVybiBib25kLT5maXJzdF9zbGF2ZTsKKwl9CisKKwlzbGF2ZSA9IHNsYXZlLT5uZXh0OworCisJcmV0dXJuIChzbGF2ZSA9PSBib25kLT5maXJzdF9zbGF2ZSkgPyBOVUxMIDogc2xhdmU7Cit9CisKK3N0YXRpYyB2b2lkIGJvbmRfaW5mb19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHNlcS0+cHJpdmF0ZTsKKworCXJlYWRfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKKwlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGJvbmRfaW5mb19zaG93X21hc3RlcihzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc2xhdmUgKmN1cnI7CisKKwlyZWFkX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisJY3VyciA9IGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlOworCXJlYWRfdW5sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJc2VxX3ByaW50ZihzZXEsICJCb25kaW5nIE1vZGU6ICVzXG4iLAorCQkgICBib25kX21vZGVfbmFtZShib25kLT5wYXJhbXMubW9kZSkpOworCisJaWYgKFVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkpIHsKKwkJc2VxX3ByaW50ZihzZXEsICJQcmltYXJ5IFNsYXZlOiAlc1xuIiwKKwkJCSAgIChib25kLT5wYXJhbXMucHJpbWFyeVswXSkgPworCQkJICAgCWJvbmQtPnBhcmFtcy5wcmltYXJ5IDogIk5vbmUiKTsKKworCQlzZXFfcHJpbnRmKHNlcSwgIkN1cnJlbnRseSBBY3RpdmUgU2xhdmU6ICVzXG4iLAorCQkJICAgKGN1cnIpID8gY3Vyci0+ZGV2LT5uYW1lIDogIk5vbmUiKTsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwgIk1JSSBTdGF0dXM6ICVzXG4iLCAoY3VycikgPyAidXAiIDogImRvd24iKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk1JSSBQb2xsaW5nIEludGVydmFsIChtcyk6ICVkXG4iLCBib25kLT5wYXJhbXMubWlpbW9uKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlVwIERlbGF5IChtcyk6ICVkXG4iLAorCQkgICBib25kLT5wYXJhbXMudXBkZWxheSAqIGJvbmQtPnBhcmFtcy5taWltb24pOworCXNlcV9wcmludGYoc2VxLCAiRG93biBEZWxheSAobXMpOiAlZFxuIiwKKwkJICAgYm9uZC0+cGFyYW1zLmRvd25kZWxheSAqIGJvbmQtPnBhcmFtcy5taWltb24pOworCisJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwkJc3RydWN0IGFkX2luZm8gYWRfaW5mbzsKKworCQlzZXFfcHV0cyhzZXEsICJcbjgwMi4zYWQgaW5mb1xuIik7CisJCXNlcV9wcmludGYoc2VxLCAiTEFDUCByYXRlOiAlc1xuIiwKKwkJCSAgIChib25kLT5wYXJhbXMubGFjcF9mYXN0KSA/ICJmYXN0IiA6ICJzbG93Iik7CisKKwkJaWYgKGJvbmRfM2FkX2dldF9hY3RpdmVfYWdnX2luZm8oYm9uZCwgJmFkX2luZm8pKSB7CisJCQlzZXFfcHJpbnRmKHNlcSwgImJvbmQgJXMgaGFzIG5vIGFjdGl2ZSBhZ2dyZWdhdG9yXG4iLAorCQkJCSAgIGJvbmQtPmRldi0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQlzZXFfcHJpbnRmKHNlcSwgIkFjdGl2ZSBBZ2dyZWdhdG9yIEluZm86XG4iKTsKKworCQkJc2VxX3ByaW50ZihzZXEsICJcdEFnZ3JlZ2F0b3IgSUQ6ICVkXG4iLAorCQkJCSAgIGFkX2luZm8uYWdncmVnYXRvcl9pZCk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlx0TnVtYmVyIG9mIHBvcnRzOiAlZFxuIiwKKwkJCQkgICBhZF9pbmZvLnBvcnRzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiXHRBY3RvciBLZXk6ICVkXG4iLAorCQkJCSAgIGFkX2luZm8uYWN0b3Jfa2V5KTsKKwkJCXNlcV9wcmludGYoc2VxLCAiXHRQYXJ0bmVyIEtleTogJWRcbiIsCisJCQkJICAgYWRfaW5mby5wYXJ0bmVyX2tleSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlx0UGFydG5lciBNYWMgQWRkcmVzczogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJICAgYWRfaW5mby5wYXJ0bmVyX3N5c3RlbVswXSwKKwkJCQkgICBhZF9pbmZvLnBhcnRuZXJfc3lzdGVtWzFdLAorCQkJCSAgIGFkX2luZm8ucGFydG5lcl9zeXN0ZW1bMl0sCisJCQkJICAgYWRfaW5mby5wYXJ0bmVyX3N5c3RlbVszXSwKKwkJCQkgICBhZF9pbmZvLnBhcnRuZXJfc3lzdGVtWzRdLAorCQkJCSAgIGFkX2luZm8ucGFydG5lcl9zeXN0ZW1bNV0pOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBib25kX2luZm9fc2hvd19zbGF2ZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgY29uc3Qgc3RydWN0IHNsYXZlICpzbGF2ZSkKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHNlcS0+cHJpdmF0ZTsKKworCXNlcV9wcmludGYoc2VxLCAiXG5TbGF2ZSBJbnRlcmZhY2U6ICVzXG4iLCBzbGF2ZS0+ZGV2LT5uYW1lKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk1JSSBTdGF0dXM6ICVzXG4iLAorCQkgICAoc2xhdmUtPmxpbmsgPT0gQk9ORF9MSU5LX1VQKSA/ICAidXAiIDogImRvd24iKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkxpbmsgRmFpbHVyZSBDb3VudDogJWRcbiIsCisJCSAgIHNsYXZlLT5saW5rX2ZhaWx1cmVfY291bnQpOworCisJaWYgKGFwcF9hYmlfdmVyID49IDEpIHsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAiUGVybWFuZW50IEhXIGFkZHI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICAgc2xhdmUtPnBlcm1faHdhZGRyWzBdLAorCQkJICAgc2xhdmUtPnBlcm1faHdhZGRyWzFdLAorCQkJICAgc2xhdmUtPnBlcm1faHdhZGRyWzJdLAorCQkJICAgc2xhdmUtPnBlcm1faHdhZGRyWzNdLAorCQkJICAgc2xhdmUtPnBlcm1faHdhZGRyWzRdLAorCQkJICAgc2xhdmUtPnBlcm1faHdhZGRyWzVdKTsKKwl9CisKKwlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCQljb25zdCBzdHJ1Y3QgYWdncmVnYXRvciAqYWdnCisJCQk9IFNMQVZFX0FEX0lORk8oc2xhdmUpLnBvcnQuYWdncmVnYXRvcjsKKworCQlpZiAoYWdnKSB7CisJCQlzZXFfcHJpbnRmKHNlcSwgIkFnZ3JlZ2F0b3IgSUQ6ICVkXG4iLAorCQkJCSAgIGFnZy0+YWdncmVnYXRvcl9pZGVudGlmaWVyKTsKKwkJfSBlbHNlIHsKKwkJCXNlcV9wdXRzKHNlcSwgIkFnZ3JlZ2F0b3IgSUQ6IE4vQVxuIik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYm9uZF9pbmZvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLCB2ZXJzaW9uKTsKKwkJYm9uZF9pbmZvX3Nob3dfbWFzdGVyKHNlcSk7CisJfSBlbHNlIHsKKwkJYm9uZF9pbmZvX3Nob3dfc2xhdmUoc2VxLCB2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBib25kX2luZm9fc2VxX29wcyA9IHsKKwkuc3RhcnQgPSBib25kX2luZm9fc2VxX3N0YXJ0LAorCS5uZXh0ICA9IGJvbmRfaW5mb19zZXFfbmV4dCwKKwkuc3RvcCAgPSBib25kX2luZm9fc2VxX3N0b3AsCisJLnNob3cgID0gYm9uZF9pbmZvX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBib25kX2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CisJaW50IHJlczsKKworCXJlcyA9IHNlcV9vcGVuKGZpbGUsICZib25kX2luZm9fc2VxX29wcyk7CisJaWYgKCFyZXMpIHsKKwkJLyogcmVjb3ZlciB0aGUgcG9pbnRlciBidXJpZWQgaW4gcHJvY19kaXJfZW50cnkgZGF0YSAqLworCQlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCXByb2MgPSBQREUoaW5vZGUpOworCQlzZXEtPnByaXZhdGUgPSBwcm9jLT5kYXRhOworCX0KKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJvbmRfaW5mb19mb3BzID0geworCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBib25kX2luZm9fb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IGJvbmRfY3JlYXRlX3Byb2NfZW50cnkoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2ID0gYm9uZC0+ZGV2OworCisJaWYgKGJvbmRfcHJvY19kaXIpIHsKKwkJYm9uZC0+cHJvY19lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGJvbmRfZGV2LT5uYW1lLAorCQkJCQkJICAgICBTX0lSVUdPLAorCQkJCQkJICAgICBib25kX3Byb2NfZGlyKTsKKwkJaWYgKGJvbmQtPnByb2NfZW50cnkgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkJICAgICAgICI6IFdhcm5pbmc6IENhbm5vdCBjcmVhdGUgL3Byb2MvbmV0LyVzLyVzXG4iLAorCQkJICAgICAgIERSVl9OQU1FLCBib25kX2Rldi0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQlib25kLT5wcm9jX2VudHJ5LT5kYXRhID0gYm9uZDsKKwkJCWJvbmQtPnByb2NfZW50cnktPnByb2NfZm9wcyA9ICZib25kX2luZm9fZm9wczsKKwkJCWJvbmQtPnByb2NfZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJCQltZW1jcHkoYm9uZC0+cHJvY19maWxlX25hbWUsIGJvbmRfZGV2LT5uYW1lLCBJRk5BTVNJWik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm9uZF9yZW1vdmVfcHJvY19lbnRyeShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlpZiAoYm9uZF9wcm9jX2RpciAmJiBib25kLT5wcm9jX2VudHJ5KSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KGJvbmQtPnByb2NfZmlsZV9uYW1lLCBib25kX3Byb2NfZGlyKTsKKwkJbWVtc2V0KGJvbmQtPnByb2NfZmlsZV9uYW1lLCAwLCBJRk5BTVNJWik7CisJCWJvbmQtPnByb2NfZW50cnkgPSBOVUxMOworCX0KK30KKworLyogQ3JlYXRlIHRoZSBib25kaW5nIGRpcmVjdG9yeSB1bmRlciAvcHJvYy9uZXQsIGlmIGRvZXNuJ3QgZXhpc3QgeWV0LgorICogQ2FsbGVyIG11c3QgaG9sZCBydG5sX2xvY2suCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfY3JlYXRlX3Byb2NfZGlyKHZvaWQpCit7CisJaW50IGxlbiA9IHN0cmxlbihEUlZfTkFNRSk7CisKKwlmb3IgKGJvbmRfcHJvY19kaXIgPSBwcm9jX25ldC0+c3ViZGlyOyBib25kX3Byb2NfZGlyOworCSAgICAgYm9uZF9wcm9jX2RpciA9IGJvbmRfcHJvY19kaXItPm5leHQpIHsKKwkJaWYgKChib25kX3Byb2NfZGlyLT5uYW1lbGVuID09IGxlbikgJiYKKwkJICAgICFtZW1jbXAoYm9uZF9wcm9jX2Rpci0+bmFtZSwgRFJWX05BTUUsIGxlbikpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFib25kX3Byb2NfZGlyKSB7CisJCWJvbmRfcHJvY19kaXIgPSBwcm9jX21rZGlyKERSVl9OQU1FLCBwcm9jX25ldCk7CisJCWlmIChib25kX3Byb2NfZGlyKSB7CisJCQlib25kX3Byb2NfZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkJCSI6IFdhcm5pbmc6IGNhbm5vdCBjcmVhdGUgL3Byb2MvbmV0LyVzXG4iLAorCQkJCURSVl9OQU1FKTsKKwkJfQorCX0KK30KKworLyogRGVzdHJveSB0aGUgYm9uZGluZyBkaXJlY3RvcnkgdW5kZXIgL3Byb2MvbmV0LCBpZiBlbXB0eS4KKyAqIENhbGxlciBtdXN0IGhvbGQgcnRubF9sb2NrLgorICovCitzdGF0aWMgdm9pZCBib25kX2Rlc3Ryb3lfcHJvY19kaXIodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlOworCisJaWYgKCFib25kX3Byb2NfZGlyKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgL3Byb2MgZGlyIGlzIGVtcHR5ICovCisJZm9yIChkZSA9IGJvbmRfcHJvY19kaXItPnN1YmRpcjsgZGU7IGRlID0gZGUtPm5leHQpIHsKKwkJLyogaWdub3JlIC4gYW5kIC4uICovCisJCWlmICgqKGRlLT5uYW1lKSAhPSAnLicpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGRlKSB7CisJCWlmIChib25kX3Byb2NfZGlyLT5vd25lciA9PSBUSElTX01PRFVMRSkgeworCQkJYm9uZF9wcm9jX2Rpci0+b3duZXIgPSBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoRFJWX05BTUUsIHByb2NfbmV0KTsKKwkJYm9uZF9wcm9jX2RpciA9IE5VTEw7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbmV0ZGV2IGV2ZW50IGhhbmRsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIENoYW5nZSBkZXZpY2UgbmFtZQorICovCitzdGF0aWMgaW50IGJvbmRfZXZlbnRfY2hhbmdlbmFtZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWJvbmRfcmVtb3ZlX3Byb2NfZW50cnkoYm9uZCk7CisJYm9uZF9jcmVhdGVfcHJvY19lbnRyeShib25kKTsKKyNlbmRpZgorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgaW50IGJvbmRfbWFzdGVyX25ldGRldl9ldmVudCh1bnNpZ25lZCBsb25nIGV2ZW50LCBzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmV2ZW50X2JvbmQgPSBib25kX2Rldi0+cHJpdjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5FVERFVl9DSEFOR0VOQU1FOgorCQlyZXR1cm4gYm9uZF9ldmVudF9jaGFuZ2VuYW1lKGV2ZW50X2JvbmQpOworCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CisJCS8qCisJCSAqIFRPRE86IHJlbW92ZSBhIGJvbmQgZnJvbSB0aGUgbGlzdD8KKwkJICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIGludCBib25kX3NsYXZlX25ldGRldl9ldmVudCh1bnNpZ25lZCBsb25nIGV2ZW50LCBzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiA9IHNsYXZlX2Rldi0+bWFzdGVyOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CisJCWlmIChib25kX2RldikgeworCQkJYm9uZF9yZWxlYXNlKGJvbmRfZGV2LCBzbGF2ZV9kZXYpOworCQl9CisJCWJyZWFrOworCWNhc2UgTkVUREVWX0NIQU5HRToKKwkJLyoKKwkJICogVE9ETzogaXMgdGhpcyB3aGF0IHdlIGdldCBpZiBzb21lYm9keQorCQkgKiBzZXRzIHVwIGEgaGllcmFyY2hpY2FsIGJvbmQsIHRoZW4gcm1tb2QncworCQkgKiBvbmUgb2YgdGhlIHNsYXZlIGJvbmRpbmcgZGV2aWNlcz8KKwkJICovCisJCWJyZWFrOworCWNhc2UgTkVUREVWX0RPV046CisJCS8qCisJCSAqIC4uLiBPciBpcyBpdCB0aGlzPworCQkgKi8KKwkJYnJlYWs7CisJY2FzZSBORVRERVZfQ0hBTkdFTVRVOgorCQkvKgorCQkgKiBUT0RPOiBTaG91bGQgc2xhdmVzIGJlIGFsbG93ZWQgdG8KKwkJICogaW5kZXBlbmRlbnRseSBhbHRlciB0aGVpciBNVFU/ICBGb3IKKwkJICogYW4gYWN0aXZlLWJhY2t1cCBib25kLCBzbGF2ZXMgbmVlZAorCQkgKiBub3QgYmUgdGhlIHNhbWUgdHlwZSBvZiBkZXZpY2UsIHNvCisJCSAqIE1UVXMgbWF5IHZhcnkuICBGb3Igb3RoZXIgbW9kZXMsCisJCSAqIHNsYXZlcyBhcmd1YWJseSBzaG91bGQgaGF2ZSB0aGUKKwkJICogc2FtZSBNVFVzLiBUbyBkbyB0aGlzLCB3ZSdkIG5lZWQgdG8KKwkJICogdGFrZSBvdmVyIHRoZSBzbGF2ZSdzIGNoYW5nZV9tdHUKKwkJICogZnVuY3Rpb24gZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGVpcgorCQkgKiBzZXJ2aXR1ZGUuCisJCSAqLworCQlicmVhazsKKwljYXNlIE5FVERFVl9DSEFOR0VOQU1FOgorCQkvKgorCQkgKiBUT0RPOiBoYW5kbGUgY2hhbmdpbmcgdGhlIHByaW1hcnkncyBuYW1lCisJCSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKiBib25kX25ldGRldl9ldmVudDogaGFuZGxlIG5ldGRldiBub3RpZmllciBjaGFpbiBldmVudHMuCisgKgorICogVGhpcyBmdW5jdGlvbiByZWNlaXZlcyBldmVudHMgZm9yIHRoZSBuZXRkZXYgY2hhaW4uICBUaGUgY2FsbGVyIChhbgorICogaW9jdGwgaGFuZGxlciBjYWxsaW5nIG5vdGlmaWVyX2NhbGxfY2hhaW4pIGhvbGRzIHRoZSBuZWNlc3NhcnkKKyAqIGxvY2tzIGZvciB1cyB0byBzYWZlbHkgbWFuaXB1bGF0ZSB0aGUgc2xhdmUgZGV2aWNlcyAoUlROTCBsb2NrLAorICogZGV2X3Byb2JlX2xvY2spLgorICovCitzdGF0aWMgaW50IGJvbmRfbmV0ZGV2X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpldmVudF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilwdHI7CisKKwlkcHJpbnRrKCJldmVudF9kZXY6ICVzLCBldmVudDogJWx4XG4iLAorCQkoZXZlbnRfZGV2ID8gZXZlbnRfZGV2LT5uYW1lIDogIk5vbmUiKSwKKwkJZXZlbnQpOworCisJaWYgKGV2ZW50X2Rldi0+ZmxhZ3MgJiBJRkZfTUFTVEVSKSB7CisJCWRwcmludGsoIklGRl9NQVNURVJcbiIpOworCQlyZXR1cm4gYm9uZF9tYXN0ZXJfbmV0ZGV2X2V2ZW50KGV2ZW50LCBldmVudF9kZXYpOworCX0KKworCWlmIChldmVudF9kZXYtPmZsYWdzICYgSUZGX1NMQVZFKSB7CisJCWRwcmludGsoIklGRl9TTEFWRVxuIik7CisJCXJldHVybiBib25kX3NsYXZlX25ldGRldl9ldmVudChldmVudCwgZXZlbnRfZGV2KTsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYm9uZF9uZXRkZXZfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBib25kX25ldGRldl9ldmVudCwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2V0IHR5cGUgaGFuZGxpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogcmVnaXN0ZXIgdG8gcmVjZWl2ZSBsYWNwZHVzIG9uIGEgYm9uZCAqLworc3RhdGljIHZvaWQgYm9uZF9yZWdpc3Rlcl9sYWNwZHUoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IHBhY2tldF90eXBlICpwa190eXBlID0gJihCT05EX0FEX0lORk8oYm9uZCkuYWRfcGt0X3R5cGUpOworCisJLyogaW5pdGlhbGl6ZSBwYWNrZXQgdHlwZSAqLworCXBrX3R5cGUtPnR5cGUgPSBQS1RfVFlQRV9MQUNQRFU7CisJcGtfdHlwZS0+ZGV2ID0gYm9uZC0+ZGV2OworCXBrX3R5cGUtPmZ1bmMgPSBib25kXzNhZF9sYWNwZHVfcmVjdjsKKworCWRldl9hZGRfcGFjayhwa190eXBlKTsKK30KKworLyogdW5yZWdpc3RlciB0byByZWNlaXZlIGxhY3BkdXMgb24gYSBib25kICovCitzdGF0aWMgdm9pZCBib25kX3VucmVnaXN0ZXJfbGFjcGR1KHN0cnVjdCBib25kaW5nICpib25kKQoreworCWRldl9yZW1vdmVfcGFjaygmKEJPTkRfQURfSU5GTyhib25kKS5hZF9wa3RfdHlwZSkpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERldmljZSBlbnRyeSBwb2ludHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgYm9uZF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCXN0cnVjdCB0aW1lcl9saXN0ICptaWlfdGltZXIgPSAmYm9uZC0+bWlpX3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0ICphcnBfdGltZXIgPSAmYm9uZC0+YXJwX3RpbWVyOworCisJYm9uZC0+a2lsbF90aW1lcnMgPSAwOworCisJaWYgKChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfVExCKSB8fAorCSAgICAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FMQikpIHsKKwkJc3RydWN0IHRpbWVyX2xpc3QgKmFsYl90aW1lciA9ICYoQk9ORF9BTEJfSU5GTyhib25kKS5hbGJfdGltZXIpOworCisJCS8qIGJvbmRfYWxiX2luaXRpYWxpemUgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSB0aW1lcgorCQkgKiBpcyBzdGFydGVkLgorCQkgKi8KKwkJaWYgKGJvbmRfYWxiX2luaXRpYWxpemUoYm9uZCwgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9BTEIpKSkgeworCQkJLyogc29tZXRoaW5nIHdlbnQgd3JvbmcgLSBmYWlsIHRoZSBvcGVuIG9wZXJhdGlvbiAqLworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaW5pdF90aW1lcihhbGJfdGltZXIpOworCQlhbGJfdGltZXItPmV4cGlyZXMgID0gamlmZmllcyArIDE7CisJCWFsYl90aW1lci0+ZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylib25kOworCQlhbGJfdGltZXItPmZ1bmN0aW9uID0gKHZvaWQgKikmYm9uZF9hbGJfbW9uaXRvcjsKKwkJYWRkX3RpbWVyKGFsYl90aW1lcik7CisJfQorCisJaWYgKGJvbmQtPnBhcmFtcy5taWltb24pIHsgIC8qIGxpbmsgY2hlY2sgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcy4gKi8KKwkJaW5pdF90aW1lcihtaWlfdGltZXIpOworCQltaWlfdGltZXItPmV4cGlyZXMgID0gamlmZmllcyArIDE7CisJCW1paV90aW1lci0+ZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylib25kX2RldjsKKwkJbWlpX3RpbWVyLT5mdW5jdGlvbiA9ICh2b2lkICopJmJvbmRfbWlpX21vbml0b3I7CisJCWFkZF90aW1lcihtaWlfdGltZXIpOworCX0KKworCWlmIChib25kLT5wYXJhbXMuYXJwX2ludGVydmFsKSB7ICAvKiBhcnAgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcy4gKi8KKwkJaW5pdF90aW1lcihhcnBfdGltZXIpOworCQlhcnBfdGltZXItPmV4cGlyZXMgID0gamlmZmllcyArIDE7CisJCWFycF90aW1lci0+ZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylib25kX2RldjsKKwkJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApIHsKKwkJCWFycF90aW1lci0+ZnVuY3Rpb24gPSAodm9pZCAqKSZib25kX2FjdGl2ZWJhY2t1cF9hcnBfbW9uOworCQl9IGVsc2UgeworCQkJYXJwX3RpbWVyLT5mdW5jdGlvbiA9ICh2b2lkICopJmJvbmRfbG9hZGJhbGFuY2VfYXJwX21vbjsKKwkJfQorCQlhZGRfdGltZXIoYXJwX3RpbWVyKTsKKwl9CisKKwlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCQlzdHJ1Y3QgdGltZXJfbGlzdCAqYWRfdGltZXIgPSAmKEJPTkRfQURfSU5GTyhib25kKS5hZF90aW1lcik7CisJCWluaXRfdGltZXIoYWRfdGltZXIpOworCQlhZF90aW1lci0+ZXhwaXJlcyAgPSBqaWZmaWVzICsgMTsKKwkJYWRfdGltZXItPmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpYm9uZDsKKwkJYWRfdGltZXItPmZ1bmN0aW9uID0gKHZvaWQgKikmYm9uZF8zYWRfc3RhdGVfbWFjaGluZV9oYW5kbGVyOworCQlhZGRfdGltZXIoYWRfdGltZXIpOworCisJCS8qIHJlZ2lzdGVyIHRvIHJlY2VpdmUgTEFDUERVcyAqLworCQlib25kX3JlZ2lzdGVyX2xhY3BkdShib25kKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBib25kX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCisJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwkJLyogVW5yZWdpc3RlciB0aGUgcmVjZWl2ZSBvZiBMQUNQRFVzICovCisJCWJvbmRfdW5yZWdpc3Rlcl9sYWNwZHUoYm9uZCk7CisJfQorCisJd3JpdGVfbG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwlib25kX21jX2xpc3RfZGVzdHJveShib25kKTsKKworCS8qIHNpZ25hbCB0aW1lcnMgbm90IHRvIHJlLWFybSAqLworCWJvbmQtPmtpbGxfdGltZXJzID0gMTsKKworCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwkvKiBkZWxfdGltZXJfc3luYyBtdXN0IHJ1biB3aXRob3V0IGhvbGRpbmcgdGhlIGJvbmQtPmxvY2sKKwkgKiBiZWNhdXNlIGEgcnVubmluZyB0aW1lciBtaWdodCBiZSB0cnlpbmcgdG8gaG9sZCBpdCB0b28KKwkgKi8KKworCWlmIChib25kLT5wYXJhbXMubWlpbW9uKSB7ICAvKiBsaW5rIGNoZWNrIGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuICovCisJCWRlbF90aW1lcl9zeW5jKCZib25kLT5taWlfdGltZXIpOworCX0KKworCWlmIChib25kLT5wYXJhbXMuYXJwX2ludGVydmFsKSB7ICAvKiBhcnAgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcy4gKi8KKwkJZGVsX3RpbWVyX3N5bmMoJmJvbmQtPmFycF90aW1lcik7CisJfQorCisJc3dpdGNoIChib25kLT5wYXJhbXMubW9kZSkgeworCWNhc2UgQk9ORF9NT0RFXzgwMjNBRDoKKwkJZGVsX3RpbWVyX3N5bmMoJihCT05EX0FEX0lORk8oYm9uZCkuYWRfdGltZXIpKTsKKwkJYnJlYWs7CisJY2FzZSBCT05EX01PREVfVExCOgorCWNhc2UgQk9ORF9NT0RFX0FMQjoKKwkJZGVsX3RpbWVyX3N5bmMoJihCT05EX0FMQl9JTkZPKGJvbmQpLmFsYl90aW1lcikpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBSZWxlYXNlIHRoZSBib25kZWQgc2xhdmVzICovCisJYm9uZF9yZWxlYXNlX2FsbChib25kX2Rldik7CisKKwlpZiAoKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9UTEIpIHx8CisJICAgIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUxCKSkgeworCQkvKiBNdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIGFsbAorCQkgKiBzbGF2ZXMgaGF2ZSBiZWVuIHJlbGVhc2VkCisJCSAqLworCQlib25kX2FsYl9kZWluaXRpYWxpemUoYm9uZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYm9uZF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJihib25kLT5zdGF0cyksICpzc3RhdHM7CisJc3RydWN0IHNsYXZlICpzbGF2ZTsKKwlpbnQgaTsKKworCW1lbXNldChzdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisKKwlyZWFkX2xvY2tfYmgoJmJvbmQtPmxvY2spOworCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQlzc3RhdHMgPSBzbGF2ZS0+ZGV2LT5nZXRfc3RhdHMoc2xhdmUtPmRldik7CisKKwkJc3RhdHMtPnJ4X3BhY2tldHMgKz0gc3N0YXRzLT5yeF9wYWNrZXRzOworCQlzdGF0cy0+cnhfYnl0ZXMgKz0gc3N0YXRzLT5yeF9ieXRlczsKKwkJc3RhdHMtPnJ4X2Vycm9ycyArPSBzc3RhdHMtPnJ4X2Vycm9yczsKKwkJc3RhdHMtPnJ4X2Ryb3BwZWQgKz0gc3N0YXRzLT5yeF9kcm9wcGVkOworCisJCXN0YXRzLT50eF9wYWNrZXRzICs9IHNzdGF0cy0+dHhfcGFja2V0czsKKwkJc3RhdHMtPnR4X2J5dGVzICs9IHNzdGF0cy0+dHhfYnl0ZXM7CisJCXN0YXRzLT50eF9lcnJvcnMgKz0gc3N0YXRzLT50eF9lcnJvcnM7CisJCXN0YXRzLT50eF9kcm9wcGVkICs9IHNzdGF0cy0+dHhfZHJvcHBlZDsKKworCQlzdGF0cy0+bXVsdGljYXN0ICs9IHNzdGF0cy0+bXVsdGljYXN0OworCQlzdGF0cy0+Y29sbGlzaW9ucyArPSBzc3RhdHMtPmNvbGxpc2lvbnM7CisKKwkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgKz0gc3N0YXRzLT5yeF9sZW5ndGhfZXJyb3JzOworCQlzdGF0cy0+cnhfb3Zlcl9lcnJvcnMgKz0gc3N0YXRzLT5yeF9vdmVyX2Vycm9yczsKKwkJc3RhdHMtPnJ4X2NyY19lcnJvcnMgKz0gc3N0YXRzLT5yeF9jcmNfZXJyb3JzOworCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzICs9IHNzdGF0cy0+cnhfZnJhbWVfZXJyb3JzOworCQlzdGF0cy0+cnhfZmlmb19lcnJvcnMgKz0gc3N0YXRzLT5yeF9maWZvX2Vycm9yczsKKwkJc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMgKz0gc3N0YXRzLT5yeF9taXNzZWRfZXJyb3JzOworCisJCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycyArPSBzc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzOworCQlzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMgKz0gc3N0YXRzLT50eF9jYXJyaWVyX2Vycm9yczsKKwkJc3RhdHMtPnR4X2ZpZm9fZXJyb3JzICs9IHNzdGF0cy0+dHhfZmlmb19lcnJvcnM7CisJCXN0YXRzLT50eF9oZWFydGJlYXRfZXJyb3JzICs9IHNzdGF0cy0+dHhfaGVhcnRiZWF0X2Vycm9yczsKKwkJc3RhdHMtPnR4X3dpbmRvd19lcnJvcnMgKz0gc3N0YXRzLT50eF93aW5kb3dfZXJyb3JzOworCX0KKworCXJlYWRfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCXJldHVybiBzdGF0czsKK30KKworc3RhdGljIGludCBib25kX2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2Rldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldiA9IE5VTEw7CisJc3RydWN0IGlmYm9uZCBrX2JpbmZvOworCXN0cnVjdCBpZmJvbmQgX191c2VyICp1X2JpbmZvID0gTlVMTDsKKwlzdHJ1Y3QgaWZzbGF2ZSBrX3NpbmZvOworCXN0cnVjdCBpZnNsYXZlIF9fdXNlciAqdV9zaW5mbyA9IE5VTEw7CisJc3RydWN0IG1paV9pb2N0bF9kYXRhICptaWkgPSBOVUxMOworCWludCBwcmV2X2FiaV92ZXIgPSBvcmlnX2FwcF9hYmlfdmVyOworCWludCByZXMgPSAwOworCisJZHByaW50aygiYm9uZF9pb2N0bDogbWFzdGVyPSVzLCBjbWQ9JWRcbiIsCisJCWJvbmRfZGV2LT5uYW1lLCBjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NFVEhUT09MOgorCQlyZXR1cm4gYm9uZF9ldGh0b29sX2lvY3RsKGJvbmRfZGV2LCBpZnIpOworCWNhc2UgU0lPQ0dNSUlQSFk6CisJCW1paSA9IGlmX21paShpZnIpOworCQlpZiAoIW1paSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbWlpLT5waHlfaWQgPSAwOworCQkvKiBGYWxsIFRocm91Z2ggKi8KKwljYXNlIFNJT0NHTUlJUkVHOgorCQkvKgorCQkgKiBXZSBkbyB0aGlzIGFnYWluIGp1c3QgaW4gY2FzZSB3ZSB3ZXJlIGNhbGxlZCBieSBTSU9DR01JSVJFRworCQkgKiBpbnN0ZWFkIG9mIFNJT0NHTUlJUEhZLgorCQkgKi8KKwkJbWlpID0gaWZfbWlpKGlmcik7CisJCWlmICghbWlpKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChtaWktPnJlZ19udW0gPT0gMSkgeworCQkJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwkJCW1paS0+dmFsX291dCA9IDA7CisJCQlyZWFkX2xvY2tfYmgoJmJvbmQtPmxvY2spOworCQkJcmVhZF9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCQkJaWYgKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSB7CisJCQkJbWlpLT52YWxfb3V0ID0gQk1TUl9MU1RBVFVTOworCQkJfQorCQkJcmVhZF91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisJCQlyZWFkX3VubG9ja19iaCgmYm9uZC0+bG9jayk7CisJCX0KKworCQlyZXR1cm4gMDsKKwljYXNlIEJPTkRfSU5GT19RVUVSWV9PTEQ6CisJY2FzZSBTSU9DQk9ORElORk9RVUVSWToKKwkJdV9iaW5mbyA9IChzdHJ1Y3QgaWZib25kIF9fdXNlciAqKWlmci0+aWZyX2RhdGE7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZrX2JpbmZvLCB1X2JpbmZvLCBzaXplb2YoaWZib25kKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcmVzID0gYm9uZF9pbmZvX3F1ZXJ5KGJvbmRfZGV2LCAma19iaW5mbyk7CisJCWlmIChyZXMgPT0gMCkgeworCQkJaWYgKGNvcHlfdG9fdXNlcih1X2JpbmZvLCAma19iaW5mbywgc2l6ZW9mKGlmYm9uZCkpKSB7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzOworCWNhc2UgQk9ORF9TTEFWRV9JTkZPX1FVRVJZX09MRDoKKwljYXNlIFNJT0NCT05EU0xBVkVJTkZPUVVFUlk6CisJCXVfc2luZm8gPSAoc3RydWN0IGlmc2xhdmUgX191c2VyICopaWZyLT5pZnJfZGF0YTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmtfc2luZm8sIHVfc2luZm8sIHNpemVvZihpZnNsYXZlKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcmVzID0gYm9uZF9zbGF2ZV9pbmZvX3F1ZXJ5KGJvbmRfZGV2LCAma19zaW5mbyk7CisJCWlmIChyZXMgPT0gMCkgeworCQkJaWYgKGNvcHlfdG9fdXNlcih1X3NpbmZvLCAma19zaW5mbywgc2l6ZW9mKGlmc2xhdmUpKSkgeworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlczsKKwlkZWZhdWx0OgorCQkvKiBHbyBvbiAqLworCQlicmVhazsKKwl9CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAob3JpZ19hcHBfYWJpX3ZlciA9PSAtMSkgeworCQkvKiBubyBvcmlnX2FwcF9hYmlfdmVyIHdhcyBwcm92aWRlZCB5ZXQsIHNvIHdlJ2xsIHVzZSB0aGUKKwkJICogY3VycmVudCBvbmUgZnJvbSBub3cgb24sIGV2ZW4gaWYgaXQncyAwCisJCSAqLworCQlvcmlnX2FwcF9hYmlfdmVyID0gYXBwX2FiaV92ZXI7CisKKwl9IGVsc2UgaWYgKG9yaWdfYXBwX2FiaV92ZXIgIT0gYXBwX2FiaV92ZXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCSAgICAgICAiOiBFcnJvcjogYWxyZWFkeSB1c2luZyBpZmVuc2xhdmUgQUJJIHZlcnNpb24gJWQ7IHRvICIKKwkJICAgICAgICJ1cGdyYWRlIGlmZW5zbGF2ZSB0byB2ZXJzaW9uICVkLCB5b3UgbXVzdCBmaXJzdCAiCisJCSAgICAgICAicmVsb2FkIGJvbmRpbmcuXG4iLAorCQkgICAgICAgb3JpZ19hcHBfYWJpX3ZlciwgYXBwX2FiaV92ZXIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbGF2ZV9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoaWZyLT5pZnJfc2xhdmUpOworCisJZHByaW50aygic2xhdmVfZGV2PSVwOiBcbiIsIHNsYXZlX2Rldik7CisKKwlpZiAoIXNsYXZlX2RldikgeworCQlyZXMgPSAtRU5PREVWOworCX0gZWxzZSB7CisJCWRwcmludGsoInNsYXZlX2Rldi0+bmFtZT0lczogXG4iLCBzbGF2ZV9kZXYtPm5hbWUpOworCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlIEJPTkRfRU5TTEFWRV9PTEQ6CisJCWNhc2UgU0lPQ0JPTkRFTlNMQVZFOgorCQkJcmVzID0gYm9uZF9lbnNsYXZlKGJvbmRfZGV2LCBzbGF2ZV9kZXYpOworCQkJYnJlYWs7CisJCWNhc2UgQk9ORF9SRUxFQVNFX09MRDoKKwkJY2FzZSBTSU9DQk9ORFJFTEVBU0U6CisJCQlyZXMgPSBib25kX3JlbGVhc2UoYm9uZF9kZXYsIHNsYXZlX2Rldik7CisJCQlicmVhazsKKwkJY2FzZSBCT05EX1NFVEhXQUREUl9PTEQ6CisJCWNhc2UgU0lPQ0JPTkRTRVRIV0FERFI6CisJCQlyZXMgPSBib25kX3NldGh3YWRkcihib25kX2Rldiwgc2xhdmVfZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIEJPTkRfQ0hBTkdFX0FDVElWRV9PTEQ6CisJCWNhc2UgU0lPQ0JPTkRDSEFOR0VBQ1RJVkU6CisJCQlyZXMgPSBib25kX2lvY3RsX2NoYW5nZV9hY3RpdmUoYm9uZF9kZXYsIHNsYXZlX2Rldik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlcyA9IC1FT1BOT1RTVVBQOworCQl9CisKKwkJZGV2X3B1dChzbGF2ZV9kZXYpOworCX0KKworCWlmIChyZXMgPCAwKSB7CisJCS8qIFRoZSBpb2N0bCBmYWlsZWQsIHNvIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gY2hhbmdpbmcgdGhlCisJCSAqIG9yaWdfYXBwX2FiaV92ZXIuIFdlJ2xsIHJlc3RvcmUgaXQncyB2YWx1ZSBqdXN0IGluIGNhc2UKKwkJICogd2UndmUgY2hhbmdlZCBpdCBlYXJsaWVyIGluIHRoaXMgZnVuY3Rpb24uCisJCSAqLworCQlvcmlnX2FwcF9hYmlfdmVyID0gcHJldl9hYmlfdmVyOworCX0KKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIGJvbmRfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCisJd3JpdGVfbG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwkvKgorCSAqIERvIHByb21pc2MgYmVmb3JlIGNoZWNraW5nIG11bHRpY2FzdF9tb2RlCisJICovCisJaWYgKChib25kX2Rldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgJiYgIShib25kLT5mbGFncyAmIElGRl9QUk9NSVNDKSkgeworCQlib25kX3NldF9wcm9taXNjdWl0eShib25kLCAxKTsKKwl9CisKKwlpZiAoIShib25kX2Rldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgJiYgKGJvbmQtPmZsYWdzICYgSUZGX1BST01JU0MpKSB7CisJCWJvbmRfc2V0X3Byb21pc2N1aXR5KGJvbmQsIC0xKTsKKwl9CisKKwkvKiBzZXQgYWxsbXVsdGkgZmxhZyB0byBzbGF2ZXMgKi8KKwlpZiAoKGJvbmRfZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgJiYgIShib25kLT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJYm9uZF9zZXRfYWxsbXVsdGkoYm9uZCwgMSk7CisJfQorCisJaWYgKCEoYm9uZF9kZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSAmJiAoYm9uZC0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCWJvbmRfc2V0X2FsbG11bHRpKGJvbmQsIC0xKTsKKwl9CisKKwlib25kLT5mbGFncyA9IGJvbmRfZGV2LT5mbGFnczsKKworCS8qIGxvb2tpbmcgZm9yIGFkZHJlc3NlcyB0byBhZGQgdG8gc2xhdmVzJyBtYyBsaXN0ICovCisJZm9yIChkbWkgPSBib25kX2Rldi0+bWNfbGlzdDsgZG1pOyBkbWkgPSBkbWktPm5leHQpIHsKKwkJaWYgKCFib25kX21jX2xpc3RfZmluZF9kbWkoZG1pLCBib25kLT5tY19saXN0KSkgeworCQkJYm9uZF9tY19hZGQoYm9uZCwgZG1pLT5kbWlfYWRkciwgZG1pLT5kbWlfYWRkcmxlbik7CisJCX0KKwl9CisKKwkvKiBsb29raW5nIGZvciBhZGRyZXNzZXMgdG8gZGVsZXRlIGZyb20gc2xhdmVzJyBsaXN0ICovCisJZm9yIChkbWkgPSBib25kLT5tY19saXN0OyBkbWk7IGRtaSA9IGRtaS0+bmV4dCkgeworCQlpZiAoIWJvbmRfbWNfbGlzdF9maW5kX2RtaShkbWksIGJvbmRfZGV2LT5tY19saXN0KSkgeworCQkJYm9uZF9tY19kZWxldGUoYm9uZCwgZG1pLT5kbWlfYWRkciwgZG1pLT5kbWlfYWRkcmxlbik7CisJCX0KKwl9CisKKwkvKiBzYXZlIG1hc3RlcidzIG11bHRpY2FzdCBsaXN0ICovCisJYm9uZF9tY19saXN0X2Rlc3Ryb3koYm9uZCk7CisJYm9uZF9tY19saXN0X2NvcHkoYm9uZF9kZXYtPm1jX2xpc3QsIGJvbmQsIEdGUF9BVE9NSUMpOworCisJd3JpdGVfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKK30KKworLyoKKyAqIENoYW5nZSB0aGUgTVRVIG9mIGFsbCBvZiBhIG1hc3RlcidzIHNsYXZlcyB0byBtYXRjaCB0aGUgbWFzdGVyCisgKi8KK3N0YXRpYyBpbnQgYm9uZF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCAqc3RvcF9hdDsKKwlpbnQgcmVzID0gMDsKKwlpbnQgaTsKKworCWRwcmludGsoImJvbmQ9JXAsIG5hbWU9JXMsIG5ld19tdHU9JWRcbiIsIGJvbmQsCisJCShib25kX2RldiA/IGJvbmRfZGV2LT5uYW1lIDogIk5vbmUiKSwgbmV3X210dSk7CisKKwkvKiBDYW4ndCBob2xkIGJvbmQtPmxvY2sgd2l0aCBiaCBkaXNhYmxlZCBoZXJlIHNpbmNlCisJICogc29tZSBiYXNlIGRyaXZlcnMgcGFuaWMuIE9uIHRoZSBvdGhlciBoYW5kIHdlIGNhbid0CisJICogaG9sZCBib25kLT5sb2NrIHdpdGhvdXQgYmggZGlzYWJsZWQgYmVjYXVzZSB3ZSdsbAorCSAqIGRlYWRsb2NrLiBUaGUgb25seSBzb2x1dGlvbiBpcyB0byByZWx5IG9uIHRoZSBmYWN0CisJICogdGhhdCB3ZSdyZSB1bmRlciBydG5sX2xvY2sgaGVyZSwgYW5kIHRoZSBzbGF2ZXMKKwkgKiBsaXN0IHdvbid0IGNoYW5nZS4gVGhpcyBkb2Vzbid0IHNvbHZlIHRoZSBwcm9ibGVtCisJICogb2Ygc2V0dGluZyB0aGUgc2xhdmUncyBNVFUgd2hpbGUgaXQgaXMKKwkgKiB0cmFuc21pdHRpbmcsIGJ1dCB0aGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSBiYXNlCisJICogZHJpdmVyIGNhbiBoYW5kbGUgdGhhdC4KKwkgKgorCSAqIFRPRE86IGZpZ3VyZSBvdXQgYSB3YXkgdG8gc2FmZWx5IGl0ZXJhdGUgdGhlIHNsYXZlcworCSAqIGxpc3QsIGJ1dCB3aXRob3V0IGhvbGRpbmcgYSBsb2NrIGFyb3VuZCB0aGUgYWN0dWFsCisJICogY2FsbCB0byB0aGUgYmFzZSBkcml2ZXIuCisJICovCisKKwlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCWRwcmludGsoInMgJXAgcy0+cCAlcCBjX20gJXBcbiIsIHNsYXZlLAorCQkJc2xhdmUtPnByZXYsIHNsYXZlLT5kZXYtPmNoYW5nZV9tdHUpOworCQlyZXMgPSBkZXZfc2V0X210dShzbGF2ZS0+ZGV2LCBuZXdfbXR1KTsKKworCQlpZiAocmVzKSB7CisJCQkvKiBJZiB3ZSBmYWlsZWQgdG8gc2V0IHRoZSBzbGF2ZSdzIG10dSB0byB0aGUgbmV3IHZhbHVlCisJCQkgKiB3ZSBtdXN0IGFib3J0IHRoZSBvcGVyYXRpb24gZXZlbiBpbiBBQ1RJVkVfQkFDS1VQCisJCQkgKiBtb2RlLCBiZWNhdXNlIGlmIHdlIGFsbG93IHRoZSBiYWNrdXAgc2xhdmVzIHRvIGhhdmUKKwkJCSAqIGRpZmZlcmVudCBtdHUgdmFsdWVzIHRoYW4gdGhlIGFjdGl2ZSBzbGF2ZSB3ZSdsbAorCQkJICogbmVlZCB0byBjaGFuZ2UgdGhlaXIgbXR1IHdoZW4gZG9pbmcgYSBmYWlsb3Zlci4gVGhhdAorCQkJICogbWVhbnMgY2hhbmdpbmcgdGhlaXIgbXR1IGZyb20gdGltZXIgY29udGV4dCwgd2hpY2gKKwkJCSAqIGlzIHByb2JhYmx5IG5vdCBhIGdvb2QgaWRlYS4KKwkJCSAqLworCQkJZHByaW50aygiZXJyICVkICVzXG4iLCByZXMsIHNsYXZlLT5kZXYtPm5hbWUpOworCQkJZ290byB1bndpbmQ7CisJCX0KKwl9CisKKwlib25kX2Rldi0+bXR1ID0gbmV3X210dTsKKworCXJldHVybiAwOworCit1bndpbmQ6CisJLyogdW53aW5kIGZyb20gaGVhZCB0byB0aGUgc2xhdmUgdGhhdCBmYWlsZWQgKi8KKwlzdG9wX2F0ID0gc2xhdmU7CisJYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tX3RvKGJvbmQsIHNsYXZlLCBpLCBib25kLT5maXJzdF9zbGF2ZSwgc3RvcF9hdCkgeworCQlpbnQgdG1wX3JlczsKKworCQl0bXBfcmVzID0gZGV2X3NldF9tdHUoc2xhdmUtPmRldiwgYm9uZF9kZXYtPm10dSk7CisJCWlmICh0bXBfcmVzKSB7CisJCQlkcHJpbnRrKCJ1bndpbmQgZXJyICVkIGRldiAlc1xuIiwgdG1wX3JlcywKKwkJCQlzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJfQorCX0KKworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBDaGFuZ2UgSFcgYWRkcmVzcworICoKKyAqIE5vdGUgdGhhdCBtYW55IGRldmljZXMgbXVzdCBiZSBkb3duIHRvIGNoYW5nZSB0aGUgSFcgYWRkcmVzcywgYW5kCisgKiBkb3duaW5nIHRoZSBtYXN0ZXIgcmVsZWFzZXMgYWxsIHNsYXZlcy4gIFdlIGNhbiBtYWtlIGJvbmRzIGZ1bGwgb2YKKyAqIGJvbmRpbmcgZGV2aWNlcyB0byB0ZXN0IHRoaXMsIGhvd2V2ZXIuCisgKi8KK3N0YXRpYyBpbnQgYm9uZF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IGFkZHIsIHRtcF9zYTsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCAqc3RvcF9hdDsKKwlpbnQgcmVzID0gMDsKKwlpbnQgaTsKKworCWRwcmludGsoImJvbmQ9JXAsIG5hbWU9JXNcbiIsIGJvbmQsIChib25kX2RldiA/IGJvbmRfZGV2LT5uYW1lIDogIk5vbmUiKSk7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoc2EtPnNhX2RhdGEpKSB7CisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKwl9CisKKwkvKiBDYW4ndCBob2xkIGJvbmQtPmxvY2sgd2l0aCBiaCBkaXNhYmxlZCBoZXJlIHNpbmNlCisJICogc29tZSBiYXNlIGRyaXZlcnMgcGFuaWMuIE9uIHRoZSBvdGhlciBoYW5kIHdlIGNhbid0CisJICogaG9sZCBib25kLT5sb2NrIHdpdGhvdXQgYmggZGlzYWJsZWQgYmVjYXVzZSB3ZSdsbAorCSAqIGRlYWRsb2NrLiBUaGUgb25seSBzb2x1dGlvbiBpcyB0byByZWx5IG9uIHRoZSBmYWN0CisJICogdGhhdCB3ZSdyZSB1bmRlciBydG5sX2xvY2sgaGVyZSwgYW5kIHRoZSBzbGF2ZXMKKwkgKiBsaXN0IHdvbid0IGNoYW5nZS4gVGhpcyBkb2Vzbid0IHNvbHZlIHRoZSBwcm9ibGVtCisJICogb2Ygc2V0dGluZyB0aGUgc2xhdmUncyBodyBhZGRyZXNzIHdoaWxlIGl0IGlzCisJICogdHJhbnNtaXR0aW5nLCBidXQgdGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUgYmFzZQorCSAqIGRyaXZlciBjYW4gaGFuZGxlIHRoYXQuCisJICoKKwkgKiBUT0RPOiBmaWd1cmUgb3V0IGEgd2F5IHRvIHNhZmVseSBpdGVyYXRlIHRoZSBzbGF2ZXMKKwkgKiBsaXN0LCBidXQgd2l0aG91dCBob2xkaW5nIGEgbG9jayBhcm91bmQgdGhlIGFjdHVhbAorCSAqIGNhbGwgdG8gdGhlIGJhc2UgZHJpdmVyLgorCSAqLworCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQlkcHJpbnRrKCJzbGF2ZSAlcCAlc1xuIiwgc2xhdmUsIHNsYXZlLT5kZXYtPm5hbWUpOworCisJCWlmIChzbGF2ZS0+ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPT0gTlVMTCkgeworCQkJcmVzID0gLUVPUE5PVFNVUFA7CisJCQlkcHJpbnRrKCJFT1BOT1RTVVBQICVzXG4iLCBzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJCWdvdG8gdW53aW5kOworCQl9CisKKwkJcmVzID0gZGV2X3NldF9tYWNfYWRkcmVzcyhzbGF2ZS0+ZGV2LCBhZGRyKTsKKwkJaWYgKHJlcykgeworCQkJLyogVE9ETzogY29uc2lkZXIgZG93bmluZyB0aGUgc2xhdmUKKwkJCSAqIGFuZCByZXRyeSA/CisJCQkgKiBVc2VyIHNob3VsZCBleHBlY3QgY29tbXVuaWNhdGlvbnMKKwkJCSAqIGJyZWFrYWdlIGFueXdheSB1bnRpbCBBUlAgZmluaXNoCisJCQkgKiB1cGRhdGluZywgc28uLi4KKwkJCSAqLworCQkJZHByaW50aygiZXJyICVkICVzXG4iLCByZXMsIHNsYXZlLT5kZXYtPm5hbWUpOworCQkJZ290byB1bndpbmQ7CisJCX0KKwl9CisKKwkvKiBzdWNjZXNzICovCisJbWVtY3B5KGJvbmRfZGV2LT5kZXZfYWRkciwgc2EtPnNhX2RhdGEsIGJvbmRfZGV2LT5hZGRyX2xlbik7CisJcmV0dXJuIDA7CisKK3Vud2luZDoKKwltZW1jcHkodG1wX3NhLnNhX2RhdGEsIGJvbmRfZGV2LT5kZXZfYWRkciwgYm9uZF9kZXYtPmFkZHJfbGVuKTsKKwl0bXBfc2Euc2FfZmFtaWx5ID0gYm9uZF9kZXYtPnR5cGU7CisKKwkvKiB1bndpbmQgZnJvbSBoZWFkIHRvIHRoZSBzbGF2ZSB0aGF0IGZhaWxlZCAqLworCXN0b3BfYXQgPSBzbGF2ZTsKKwlib25kX2Zvcl9lYWNoX3NsYXZlX2Zyb21fdG8oYm9uZCwgc2xhdmUsIGksIGJvbmQtPmZpcnN0X3NsYXZlLCBzdG9wX2F0KSB7CisJCWludCB0bXBfcmVzOworCisJCXRtcF9yZXMgPSBkZXZfc2V0X21hY19hZGRyZXNzKHNsYXZlLT5kZXYsICZ0bXBfc2EpOworCQlpZiAodG1wX3JlcykgeworCQkJZHByaW50aygidW53aW5kIGVyciAlZCBkZXYgJXNcbiIsIHRtcF9yZXMsCisJCQkJc2xhdmUtPmRldi0+bmFtZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGJvbmRfeG1pdF9yb3VuZHJvYmluKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCXN0cnVjdCBzbGF2ZSAqc2xhdmUsICpzdGFydF9hdDsKKwlpbnQgaTsKKwlpbnQgcmVzID0gMTsKKworCXJlYWRfbG9jaygmYm9uZC0+bG9jayk7CisKKwlpZiAoIUJPTkRfSVNfT0soYm9uZCkpIHsKKwkJZ290byBvdXQ7CisJfQorCisJcmVhZF9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCXNsYXZlID0gc3RhcnRfYXQgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKKwlyZWFkX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCWlmICghc2xhdmUpIHsKKwkJZ290byBvdXQ7CisJfQorCisJYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tKGJvbmQsIHNsYXZlLCBpLCBzdGFydF9hdCkgeworCQlpZiAoSVNfVVAoc2xhdmUtPmRldikgJiYKKwkJICAgIChzbGF2ZS0+bGluayA9PSBCT05EX0xJTktfVVApICYmCisJCSAgICAoc2xhdmUtPnN0YXRlID09IEJPTkRfU1RBVEVfQUNUSVZFKSkgeworCQkJcmVzID0gYm9uZF9kZXZfcXVldWVfeG1pdChib25kLCBza2IsIHNsYXZlLT5kZXYpOworCisJCQl3cml0ZV9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCQkJYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUgPSBzbGF2ZS0+bmV4dDsKKwkJCXdyaXRlX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCQkJYnJlYWs7CisJCX0KKwl9CisKKworb3V0OgorCWlmIChyZXMpIHsKKwkJLyogbm8gc3VpdGFibGUgaW50ZXJmYWNlLCBmcmFtZSBub3Qgc2VudCAqLworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGluIGFjdGl2ZS1iYWNrdXAgbW9kZSwgd2Uga25vdyB0aGF0IGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlIGlzIGFsd2F5cyB2YWxpZCBpZgorICogdGhlIGJvbmQgaGFzIGEgdXNhYmxlIGludGVyZmFjZS4KKyAqLworc3RhdGljIGludCBib25kX3htaXRfYWN0aXZlYmFja3VwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCWludCByZXMgPSAxOworCisJLyogaWYgd2UgYXJlIHNlbmRpbmcgYXJwIHBhY2tldHMsIHRyeSB0byBhdCBsZWFzdAorCSAgIGlkZW50aWZ5IG91ciBvd24gaXAgYWRkcmVzcyAqLworCWlmIChib25kLT5wYXJhbXMuYXJwX2ludGVydmFsICYmICFteV9pcCAmJgorCQkoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FSUCkpKSB7CisJCWNoYXIgKnRoZV9pcCA9IChjaGFyICopc2tiLT5kYXRhICsKKwkJCQlzaXplb2Yoc3RydWN0IGV0aGhkcikgKworCQkJCXNpemVvZihzdHJ1Y3QgYXJwaGRyKSArCisJCQkJRVRIX0FMRU47CisJCW1lbWNweSgmbXlfaXAsIHRoZV9pcCwgNCk7CisJfQorCisJcmVhZF9sb2NrKCZib25kLT5sb2NrKTsKKwlyZWFkX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwlpZiAoIUJPTkRfSVNfT0soYm9uZCkpIHsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSB7IC8qIG9uZSB1c2FibGUgaW50ZXJmYWNlICovCisJCXJlcyA9IGJvbmRfZGV2X3F1ZXVlX3htaXQoYm9uZCwgc2tiLCBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZS0+ZGV2KTsKKwl9CisKK291dDoKKwlpZiAocmVzKSB7CisJCS8qIG5vIHN1aXRhYmxlIGludGVyZmFjZSwgZnJhbWUgbm90IHNlbnQgKi8KKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKwlyZWFkX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKwlyZWFkX3VubG9jaygmYm9uZC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpbiBYT1IgbW9kZSwgd2UgZGV0ZXJtaW5lIHRoZSBvdXRwdXQgZGV2aWNlIGJ5IHBlcmZvcm1pbmcgeG9yIG9uCisgKiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBodyBhZHJlc3Nlcy4gIElmIHRoaXMgZGV2aWNlIGlzIG5vdAorICogZW5hYmxlZCwgZmluZCB0aGUgbmV4dCBzbGF2ZSBmb2xsb3dpbmcgdGhpcyB4b3Igc2xhdmUuCisgKi8KK3N0YXRpYyBpbnQgYm9uZF94bWl0X3hvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlzdHJ1Y3QgZXRoaGRyICpkYXRhID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CisJc3RydWN0IHNsYXZlICpzbGF2ZSwgKnN0YXJ0X2F0OworCWludCBzbGF2ZV9ubzsKKwlpbnQgaTsKKwlpbnQgcmVzID0gMTsKKworCXJlYWRfbG9jaygmYm9uZC0+bG9jayk7CisKKwlpZiAoIUJPTkRfSVNfT0soYm9uZCkpIHsKKwkJZ290byBvdXQ7CisJfQorCisJc2xhdmVfbm8gPSAoZGF0YS0+aF9kZXN0WzVdXmJvbmRfZGV2LT5kZXZfYWRkcls1XSkgJSBib25kLT5zbGF2ZV9jbnQ7CisKKwlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCXNsYXZlX25vLS07CisJCWlmIChzbGF2ZV9ubyA8IDApIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3RhcnRfYXQgPSBzbGF2ZTsKKworCWJvbmRfZm9yX2VhY2hfc2xhdmVfZnJvbShib25kLCBzbGF2ZSwgaSwgc3RhcnRfYXQpIHsKKwkJaWYgKElTX1VQKHNsYXZlLT5kZXYpICYmCisJCSAgICAoc2xhdmUtPmxpbmsgPT0gQk9ORF9MSU5LX1VQKSAmJgorCQkgICAgKHNsYXZlLT5zdGF0ZSA9PSBCT05EX1NUQVRFX0FDVElWRSkpIHsKKwkJCXJlcyA9IGJvbmRfZGV2X3F1ZXVlX3htaXQoYm9uZCwgc2tiLCBzbGF2ZS0+ZGV2KTsKKwkJCWJyZWFrOworCQl9CisJfQorCitvdXQ6CisJaWYgKHJlcykgeworCQkvKiBubyBzdWl0YWJsZSBpbnRlcmZhY2UsIGZyYW1lIG5vdCBzZW50ICovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CisJcmVhZF91bmxvY2soJmJvbmQtPmxvY2spOworCXJldHVybiAwOworfQorCisvKgorICogaW4gYnJvYWRjYXN0IG1vZGUsIHdlIHNlbmQgZXZlcnl0aGluZyB0byBhbGwgdXNhYmxlIGludGVyZmFjZXMuCisgKi8KK3N0YXRpYyBpbnQgYm9uZF94bWl0X2Jyb2FkY2FzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCAqc3RhcnRfYXQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKnR4X2RldiA9IE5VTEw7CisJaW50IGk7CisJaW50IHJlcyA9IDE7CisKKwlyZWFkX2xvY2soJmJvbmQtPmxvY2spOworCisJaWYgKCFCT05EX0lTX09LKGJvbmQpKSB7CisJCWdvdG8gb3V0OworCX0KKworCXJlYWRfbG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKwlzdGFydF9hdCA9IGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlOworCXJlYWRfdW5sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJaWYgKCFzdGFydF9hdCkgeworCQlnb3RvIG91dDsKKwl9CisKKwlib25kX2Zvcl9lYWNoX3NsYXZlX2Zyb20oYm9uZCwgc2xhdmUsIGksIHN0YXJ0X2F0KSB7CisJCWlmIChJU19VUChzbGF2ZS0+ZGV2KSAmJgorCQkgICAgKHNsYXZlLT5saW5rID09IEJPTkRfTElOS19VUCkgJiYKKwkJICAgIChzbGF2ZS0+c3RhdGUgPT0gQk9ORF9TVEFURV9BQ1RJVkUpKSB7CisJCQlpZiAodHhfZGV2KSB7CisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAoIXNrYjIpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkJCSAgICAgICAiOiBFcnJvcjogYm9uZF94bWl0X2Jyb2FkY2FzdCgpOiAiCisJCQkJCSAgICAgICAic2tiX2Nsb25lKCkgZmFpbGVkXG4iKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJcmVzID0gYm9uZF9kZXZfcXVldWVfeG1pdChib25kLCBza2IyLCB0eF9kZXYpOworCQkJCWlmIChyZXMpIHsKKwkJCQkJZGV2X2tmcmVlX3NrYihza2IyKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJdHhfZGV2ID0gc2xhdmUtPmRldjsKKwkJfQorCX0KKworCWlmICh0eF9kZXYpIHsKKwkJcmVzID0gYm9uZF9kZXZfcXVldWVfeG1pdChib25kLCBza2IsIHR4X2Rldik7CisJfQorCitvdXQ6CisJaWYgKHJlcykgeworCQkvKiBubyBzdWl0YWJsZSBpbnRlcmZhY2UsIGZyYW1lIG5vdCBzZW50ICovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CisJLyogZnJhbWUgc2VudCB0byBhbGwgc3VpdGFibGUgaW50ZXJmYWNlcyAqLworCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERldmljZSBpbml0aWFsaXphdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogc2V0IGJvbmQgbW9kZSBzcGVjaWZpYyBuZXQgZGV2aWNlIG9wZXJhdGlvbnMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJvbmRfc2V0X21vZGVfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiwgaW50IG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBCT05EX01PREVfUk9VTkRST0JJTjoKKwkJYm9uZF9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGJvbmRfeG1pdF9yb3VuZHJvYmluOworCQlicmVhazsKKwljYXNlIEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVA6CisJCWJvbmRfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBib25kX3htaXRfYWN0aXZlYmFja3VwOworCQlicmVhazsKKwljYXNlIEJPTkRfTU9ERV9YT1I6CisJCWJvbmRfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBib25kX3htaXRfeG9yOworCQlicmVhazsKKwljYXNlIEJPTkRfTU9ERV9CUk9BRENBU1Q6CisJCWJvbmRfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBib25kX3htaXRfYnJvYWRjYXN0OworCQlicmVhazsKKwljYXNlIEJPTkRfTU9ERV84MDIzQUQ6CisJCWJvbmRfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBib25kXzNhZF94bWl0X3hvcjsKKwkJYnJlYWs7CisJY2FzZSBCT05EX01PREVfVExCOgorCWNhc2UgQk9ORF9NT0RFX0FMQjoKKwkJYm9uZF9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGJvbmRfYWxiX3htaXQ7CisJCWJvbmRfZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBib25kX2FsYl9zZXRfbWFjX2FkZHJlc3M7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFNob3VsZCBuZXZlciBoYXBwZW4sIG1vZGUgYWxyZWFkeSBjaGVja2VkICovCisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkgICAgICAgIjogRXJyb3I6IFVua25vd24gYm9uZGluZyBtb2RlICVkXG4iLAorCQkgICAgICAgbW9kZSk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIERvZXMgbm90IGFsbG9jYXRlIGJ1dCBjcmVhdGVzIGEgL3Byb2MgZW50cnkuCisgKiBBbGxvd2VkIHRvIGZhaWwuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGJvbmRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIHN0cnVjdCBib25kX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisKKwlkcHJpbnRrKCJCZWdpbiBib25kX2luaXQgZm9yICVzXG4iLCBib25kX2Rldi0+bmFtZSk7CisKKwkvKiBpbml0aWFsaXplIHJ3bG9ja3MgKi8KKwlyd2xvY2tfaW5pdCgmYm9uZC0+bG9jayk7CisJcndsb2NrX2luaXQoJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwlib25kLT5wYXJhbXMgPSAqcGFyYW1zOyAvKiBjb3B5IHBhcmFtcyBzdHJ1Y3QgKi8KKworCS8qIEluaXRpYWxpemUgcG9pbnRlcnMgKi8KKwlib25kLT5maXJzdF9zbGF2ZSA9IE5VTEw7CisJYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUgPSBOVUxMOworCWJvbmQtPmN1cnJlbnRfYXJwX3NsYXZlID0gTlVMTDsKKwlib25kLT5wcmltYXJ5X3NsYXZlID0gTlVMTDsKKwlib25kLT5kZXYgPSBib25kX2RldjsKKwlJTklUX0xJU1RfSEVBRCgmYm9uZC0+dmxhbl9saXN0KTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBlbnRyeSBwb2ludHMgKi8KKwlib25kX2Rldi0+b3BlbiA9IGJvbmRfb3BlbjsKKwlib25kX2Rldi0+c3RvcCA9IGJvbmRfY2xvc2U7CisJYm9uZF9kZXYtPmdldF9zdGF0cyA9IGJvbmRfZ2V0X3N0YXRzOworCWJvbmRfZGV2LT5kb19pb2N0bCA9IGJvbmRfZG9faW9jdGw7CisJYm9uZF9kZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGJvbmRfc2V0X211bHRpY2FzdF9saXN0OworCWJvbmRfZGV2LT5jaGFuZ2VfbXR1ID0gYm9uZF9jaGFuZ2VfbXR1OworCWJvbmRfZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBib25kX3NldF9tYWNfYWRkcmVzczsKKworCWJvbmRfc2V0X21vZGVfb3BzKGJvbmRfZGV2LCBib25kLT5wYXJhbXMubW9kZSk7CisKKwlib25kX2Rldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIG9wdGlvbnMgKi8KKwlib25kX2Rldi0+dHhfcXVldWVfbGVuID0gMDsKKwlib25kX2Rldi0+ZmxhZ3MgfD0gSUZGX01BU1RFUnxJRkZfTVVMVElDQVNUOworCisJLyogQXQgZmlyc3QsIHdlIGJsb2NrIGFkZGluZyBWTEFOcy4gVGhhdCdzIHRoZSBvbmx5IHdheSB0bworCSAqIHByZXZlbnQgcHJvYmxlbXMgdGhhdCBvY2N1ciB3aGVuIGFkZGluZyBWTEFOcyBvdmVyIGFuCisJICogZW1wdHkgYm9uZC4gVGhlIGJsb2NrIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIG5vbi1jaGFsbGVuZ2VkCisJICogc2xhdmVzIGFyZSBlbnNsYXZlZC4KKwkgKi8KKwlib25kX2Rldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQ7CisKKwkvKiBkb24ndCBhY3F1aXJlIGJvbmQgZGV2aWNlJ3MgeG1pdF9sb2NrIHdoZW4gCisJICogdHJhbnNtaXR0aW5nICovCisJYm9uZF9kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsKKworCS8qIEJ5IGRlZmF1bHQsIHdlIGRlY2xhcmUgdGhlIGJvbmQgdG8gYmUgZnVsbHkKKwkgKiBWTEFOIGhhcmR3YXJlIGFjY2VsZXJhdGVkIGNhcGFibGUuIFNwZWNpYWwKKwkgKiBjYXJlIGlzIHRha2VuIGluIHRoZSB2YXJpb3VzIHhtaXQgZnVuY3Rpb25zCisJICogd2hlbiB0aGVyZSBhcmUgc2xhdmVzIHRoYXQgYXJlIG5vdCBodyBhY2NlbAorCSAqIGNhcGFibGUKKwkgKi8KKwlib25kX2Rldi0+dmxhbl9yeF9yZWdpc3RlciA9IGJvbmRfdmxhbl9yeF9yZWdpc3RlcjsKKwlib25kX2Rldi0+dmxhbl9yeF9hZGRfdmlkICA9IGJvbmRfdmxhbl9yeF9hZGRfdmlkOworCWJvbmRfZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gYm9uZF92bGFuX3J4X2tpbGxfdmlkOworCWJvbmRfZGV2LT5mZWF0dXJlcyB8PSAoTkVUSUZfRl9IV19WTEFOX1RYIHwKKwkJCSAgICAgICBORVRJRl9GX0hXX1ZMQU5fUlggfAorCQkJICAgICAgIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlib25kX2NyZWF0ZV9wcm9jX2VudHJ5KGJvbmQpOworI2VuZGlmCisKKwlsaXN0X2FkZF90YWlsKCZib25kLT5ib25kX2xpc3QsICZib25kX2Rldl9saXN0KTsKKworCXJldHVybiAwOworfQorCisvKiBEZS1pbml0aWFsaXplIGRldmljZSBzcGVjaWZpYyBkYXRhLgorICogQ2FsbGVyIG11c3QgaG9sZCBydG5sX2xvY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBib25kX2RlaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKworCWxpc3RfZGVsKCZib25kLT5ib25kX2xpc3QpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlib25kX3JlbW92ZV9wcm9jX2VudHJ5KGJvbmQpOworI2VuZGlmCit9CisKKy8qIFVucmVnaXN0ZXIgYW5kIGZyZWUgYWxsIGJvbmQgZGV2aWNlcy4KKyAqIENhbGxlciBtdXN0IGhvbGQgcnRubF9sb2NrLgorICovCitzdGF0aWMgdm9pZCBib25kX2ZyZWVfYWxsKHZvaWQpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQsICpueHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYm9uZCwgbnh0LCAmYm9uZF9kZXZfbGlzdCwgYm9uZF9saXN0KSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiA9IGJvbmQtPmRldjsKKworCQl1bnJlZ2lzdGVyX25ldGRldmljZShib25kX2Rldik7CisJCWJvbmRfZGVpbml0KGJvbmRfZGV2KTsKKwl9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWJvbmRfZGVzdHJveV9wcm9jX2RpcigpOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb2R1bGUgaW5pdGlhbGl6YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIENvbnZlcnQgc3RyaW5nIGlucHV0IG1vZHVsZSBwYXJtcy4gIEFjY2VwdCBlaXRoZXIgdGhlCisgKiBudW1iZXIgb2YgdGhlIG1vZGUgb3IgaXRzIHN0cmluZyBuYW1lLgorICovCitzdGF0aWMgaW5saW5lIGludCBib25kX3BhcnNlX3Bhcm0oY2hhciAqbW9kZV9hcmcsIHN0cnVjdCBib25kX3Bhcm1fdGJsICp0YmwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyB0YmxbaV0ubW9kZW5hbWU7IGkrKykgeworCQlpZiAoKGlzZGlnaXQoKm1vZGVfYXJnKSAmJgorCQkgICAgIHRibFtpXS5tb2RlID09IHNpbXBsZV9zdHJ0b2wobW9kZV9hcmcsIE5VTEwsIDApKSB8fAorCQkgICAgKHN0cm5jbXAobW9kZV9hcmcsIHRibFtpXS5tb2RlbmFtZSwKKwkJCSAgICAgc3RybGVuKHRibFtpXS5tb2RlbmFtZSkpID09IDApKSB7CisJCQlyZXR1cm4gdGJsW2ldLm1vZGU7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgYm9uZF9jaGVja19wYXJhbXMoc3RydWN0IGJvbmRfcGFyYW1zICpwYXJhbXMpCit7CisJLyoKKwkgKiBDb252ZXJ0IHN0cmluZyBwYXJhbWV0ZXJzLgorCSAqLworCWlmIChtb2RlKSB7CisJCWJvbmRfbW9kZSA9IGJvbmRfcGFyc2VfcGFybShtb2RlLCBib25kX21vZGVfdGJsKTsKKwkJaWYgKGJvbmRfbW9kZSA9PSAtMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkgICAgICAgIjogRXJyb3I6IEludmFsaWQgYm9uZGluZyBtb2RlIFwiJXNcIlxuIiwKKwkJCSAgICAgICBtb2RlID09IE5VTEwgPyAiTlVMTCIgOiBtb2RlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKGxhY3BfcmF0ZSkgeworCQlpZiAoYm9uZF9tb2RlICE9IEJPTkRfTU9ERV84MDIzQUQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCSAgICAgICAiOiBsYWNwX3JhdGUgcGFyYW0gaXMgaXJyZWxldmFudCBpbiBtb2RlICVzXG4iLAorCQkJICAgICAgIGJvbmRfbW9kZV9uYW1lKGJvbmRfbW9kZSkpOworCQl9IGVsc2UgeworCQkJbGFjcF9mYXN0ID0gYm9uZF9wYXJzZV9wYXJtKGxhY3BfcmF0ZSwgYm9uZF9sYWNwX3RibCk7CisJCQlpZiAobGFjcF9mYXN0ID09IC0xKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkJICAgICAgICI6IEVycm9yOiBJbnZhbGlkIGxhY3AgcmF0ZSBcIiVzXCJcbiIsCisJCQkJICAgICAgIGxhY3BfcmF0ZSA9PSBOVUxMID8gIk5VTEwiIDogbGFjcF9yYXRlKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChtYXhfYm9uZHMgPCAxIHx8IG1heF9ib25kcyA+IElOVF9NQVgpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkgICAgICAgIjogV2FybmluZzogbWF4X2JvbmRzICglZCkgbm90IGluIHJhbmdlICVkLSVkLCBzbyBpdCAiCisJCSAgICAgICAid2FzIHJlc2V0IHRvIEJPTkRfREVGQVVMVF9NQVhfQk9ORFMgKCVkKSIsCisJCSAgICAgICBtYXhfYm9uZHMsIDEsIElOVF9NQVgsIEJPTkRfREVGQVVMVF9NQVhfQk9ORFMpOworCQltYXhfYm9uZHMgPSBCT05EX0RFRkFVTFRfTUFYX0JPTkRTOworCX0KKworCWlmIChtaWltb24gPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICI6IFdhcm5pbmc6IG1paW1vbiBtb2R1bGUgcGFyYW1ldGVyICglZCksICIKKwkJICAgICAgICJub3QgaW4gcmFuZ2UgMC0lZCwgc28gaXQgd2FzIHJlc2V0IHRvICVkXG4iLAorCQkgICAgICAgbWlpbW9uLCBJTlRfTUFYLCBCT05EX0xJTktfTU9OX0lOVEVSVik7CisJCW1paW1vbiA9IEJPTkRfTElOS19NT05fSU5URVJWOworCX0KKworCWlmICh1cGRlbGF5IDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCSAgICAgICAiOiBXYXJuaW5nOiB1cGRlbGF5IG1vZHVsZSBwYXJhbWV0ZXIgKCVkKSwgIgorCQkgICAgICAgIm5vdCBpbiByYW5nZSAwLSVkLCBzbyBpdCB3YXMgcmVzZXQgdG8gMFxuIiwKKwkJICAgICAgIHVwZGVsYXksIElOVF9NQVgpOworCQl1cGRlbGF5ID0gMDsKKwl9CisKKwlpZiAoZG93bmRlbGF5IDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCSAgICAgICAiOiBXYXJuaW5nOiBkb3duZGVsYXkgbW9kdWxlIHBhcmFtZXRlciAoJWQpLCAiCisJCSAgICAgICAibm90IGluIHJhbmdlIDAtJWQsIHNvIGl0IHdhcyByZXNldCB0byAwXG4iLAorCQkgICAgICAgZG93bmRlbGF5LCBJTlRfTUFYKTsKKwkJZG93bmRlbGF5ID0gMDsKKwl9CisKKwlpZiAoKHVzZV9jYXJyaWVyICE9IDApICYmICh1c2VfY2FycmllciAhPSAxKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCSAgICAgICAiOiBXYXJuaW5nOiB1c2VfY2FycmllciBtb2R1bGUgcGFyYW1ldGVyICglZCksICIKKwkJICAgICAgICJub3Qgb2YgdmFsaWQgdmFsdWUgKDAvMSksIHNvIGl0IHdhcyBzZXQgdG8gMVxuIiwKKwkJICAgICAgIHVzZV9jYXJyaWVyKTsKKwkJdXNlX2NhcnJpZXIgPSAxOworCX0KKworCS8qIHJlc2V0IHZhbHVlcyBmb3IgODAyLjNhZCAqLworCWlmIChib25kX21vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCQlpZiAoIW1paW1vbikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkJICAgICAgICI6IFdhcm5pbmc6IG1paW1vbiBtdXN0IGJlIHNwZWNpZmllZCwgIgorCQkJICAgICAgICJvdGhlcndpc2UgYm9uZGluZyB3aWxsIG5vdCBkZXRlY3QgbGluayAiCisJCQkgICAgICAgImZhaWx1cmUsIHNwZWVkIGFuZCBkdXBsZXggd2hpY2ggYXJlICIKKwkJCSAgICAgICAiZXNzZW50aWFsIGZvciA4MDIuM2FkIG9wZXJhdGlvblxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJGb3JjaW5nIG1paW1vbiB0byAxMDBtc2VjXG4iKTsKKwkJCW1paW1vbiA9IDEwMDsKKwkJfQorCX0KKworCS8qIHJlc2V0IHZhbHVlcyBmb3IgVExCL0FMQiAqLworCWlmICgoYm9uZF9tb2RlID09IEJPTkRfTU9ERV9UTEIpIHx8CisJICAgIChib25kX21vZGUgPT0gQk9ORF9NT0RFX0FMQikpIHsKKwkJaWYgKCFtaWltb24pIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJCSAgICAgICAiOiBXYXJuaW5nOiBtaWltb24gbXVzdCBiZSBzcGVjaWZpZWQsICIKKwkJCSAgICAgICAib3RoZXJ3aXNlIGJvbmRpbmcgd2lsbCBub3QgZGV0ZWN0IGxpbmsgIgorCQkJICAgICAgICJmYWlsdXJlIGFuZCBsaW5rIHNwZWVkIHdoaWNoIGFyZSBlc3NlbnRpYWwgIgorCQkJICAgICAgICJmb3IgVExCL0FMQiBsb2FkIGJhbGFuY2luZ1xuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJGb3JjaW5nIG1paW1vbiB0byAxMDBtc2VjXG4iKTsKKwkJCW1paW1vbiA9IDEwMDsKKwkJfQorCX0KKworCWlmIChib25kX21vZGUgPT0gQk9ORF9NT0RFX0FMQikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgRFJWX05BTUUKKwkJICAgICAgICI6IEluIEFMQiBtb2RlIHlvdSBtaWdodCBleHBlcmllbmNlIGNsaWVudCAiCisJCSAgICAgICAiZGlzY29ubmVjdGlvbnMgdXBvbiByZWNvbm5lY3Rpb24gb2YgYSBsaW5rIGlmIHRoZSAiCisJCSAgICAgICAiYm9uZGluZyBtb2R1bGUgdXBkZWxheSBwYXJhbWV0ZXIgKCVkIG1zZWMpIGlzICIKKwkJICAgICAgICJpbmNvbXBhdGlibGUgd2l0aCB0aGUgZm9yd2FyZGluZyBkZWxheSB0aW1lIG9mIHRoZSAiCisJCSAgICAgICAic3dpdGNoXG4iLAorCQkgICAgICAgdXBkZWxheSk7CisJfQorCisJaWYgKCFtaWltb24pIHsKKwkJaWYgKHVwZGVsYXkgfHwgZG93bmRlbGF5KSB7CisJCQkvKiBqdXN0IHdhcm4gdGhlIHVzZXIgdGhlIHVwL2Rvd24gZGVsYXkgd2lsbCBoYXZlCisJCQkgKiBubyBlZmZlY3Qgc2luY2UgbWlpbW9uIGlzIHplcm8uLi4KKwkJCSAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkJICAgICAgICI6IFdhcm5pbmc6IG1paW1vbiBtb2R1bGUgcGFyYW1ldGVyIG5vdCBzZXQgIgorCQkJICAgICAgICJhbmQgdXBkZWxheSAoJWQpIG9yIGRvd25kZWxheSAoJWQpIG1vZHVsZSAiCisJCQkgICAgICAgInBhcmFtZXRlciBpcyBzZXQ7IHVwZGVsYXkgYW5kIGRvd25kZWxheSBoYXZlICIKKwkJCSAgICAgICAibm8gZWZmZWN0IHVubGVzcyBtaWltb24gaXMgc2V0XG4iLAorCQkJICAgICAgIHVwZGVsYXksIGRvd25kZWxheSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBkb24ndCBhbGxvdyBhcnAgbW9uaXRvcmluZyAqLworCQlpZiAoYXJwX2ludGVydmFsKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCQkgICAgICAgIjogV2FybmluZzogbWlpbW9uICglZCkgYW5kIGFycF9pbnRlcnZhbCAoJWQpICIKKwkJCSAgICAgICAiY2FuJ3QgYmUgdXNlZCBzaW11bHRhbmVvdXNseSwgZGlzYWJsaW5nIEFSUCAiCisJCQkgICAgICAgIm1vbml0b3JpbmdcbiIsCisJCQkgICAgICAgbWlpbW9uLCBhcnBfaW50ZXJ2YWwpOworCQkJYXJwX2ludGVydmFsID0gMDsKKwkJfQorCisJCWlmICgodXBkZWxheSAlIG1paW1vbikgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkJICAgICAgICI6IFdhcm5pbmc6IHVwZGVsYXkgKCVkKSBpcyBub3QgYSBtdWx0aXBsZSAiCisJCQkgICAgICAgIm9mIG1paW1vbiAoJWQpLCB1cGRlbGF5IHJvdW5kZWQgdG8gJWQgbXNcbiIsCisJCQkgICAgICAgdXBkZWxheSwgbWlpbW9uLCAodXBkZWxheSAvIG1paW1vbikgKiBtaWltb24pOworCQl9CisKKwkJdXBkZWxheSAvPSBtaWltb247CisKKwkJaWYgKChkb3duZGVsYXkgJSBtaWltb24pICE9IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJCSAgICAgICAiOiBXYXJuaW5nOiBkb3duZGVsYXkgKCVkKSBpcyBub3QgYSBtdWx0aXBsZSAiCisJCQkgICAgICAgIm9mIG1paW1vbiAoJWQpLCBkb3duZGVsYXkgcm91bmRlZCB0byAlZCBtc1xuIiwKKwkJCSAgICAgICBkb3duZGVsYXksIG1paW1vbiwKKwkJCSAgICAgICAoZG93bmRlbGF5IC8gbWlpbW9uKSAqIG1paW1vbik7CisJCX0KKworCQlkb3duZGVsYXkgLz0gbWlpbW9uOworCX0KKworCWlmIChhcnBfaW50ZXJ2YWwgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICI6IFdhcm5pbmc6IGFycF9pbnRlcnZhbCBtb2R1bGUgcGFyYW1ldGVyICglZCkgIgorCQkgICAgICAgIiwgbm90IGluIHJhbmdlIDAtJWQsIHNvIGl0IHdhcyByZXNldCB0byAlZFxuIiwKKwkJICAgICAgIGFycF9pbnRlcnZhbCwgSU5UX01BWCwgQk9ORF9MSU5LX0FSUF9JTlRFUlYpOworCQlhcnBfaW50ZXJ2YWwgPSBCT05EX0xJTktfQVJQX0lOVEVSVjsKKwl9CisKKwlmb3IgKGFycF9pcF9jb3VudCA9IDA7CisJICAgICAoYXJwX2lwX2NvdW50IDwgQk9ORF9NQVhfQVJQX1RBUkdFVFMpICYmIGFycF9pcF90YXJnZXRbYXJwX2lwX2NvdW50XTsKKwkgICAgIGFycF9pcF9jb3VudCsrKSB7CisJCS8qIG5vdCBjb21wbGV0ZSBjaGVjaywgYnV0IHNob3VsZCBiZSBnb29kIGVub3VnaCB0bworCQkgICBjYXRjaCBtaXN0YWtlcyAqLworCQlpZiAoIWlzZGlnaXQoYXJwX2lwX3RhcmdldFthcnBfaXBfY291bnRdWzBdKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkJICAgICAgICI6IFdhcm5pbmc6IGJhZCBhcnBfaXBfdGFyZ2V0IG1vZHVsZSBwYXJhbWV0ZXIgIgorCQkJICAgICAgICIoJXMpLCBBUlAgbW9uaXRvcmluZyB3aWxsIG5vdCBiZSBwZXJmb3JtZWRcbiIsCisJCQkgICAgICAgYXJwX2lwX3RhcmdldFthcnBfaXBfY291bnRdKTsKKwkJCWFycF9pbnRlcnZhbCA9IDA7CisJCX0gZWxzZSB7CisJCQl1MzIgaXAgPSBpbl9hdG9uKGFycF9pcF90YXJnZXRbYXJwX2lwX2NvdW50XSk7CisJCQlhcnBfdGFyZ2V0W2FycF9pcF9jb3VudF0gPSBpcDsKKwkJfQorCX0KKworCWlmIChhcnBfaW50ZXJ2YWwgJiYgIWFycF9pcF9jb3VudCkgeworCQkvKiBkb24ndCBhbGxvdyBhcnBpbmcgaWYgbm8gYXJwX2lwX3RhcmdldCBnaXZlbi4uLiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCSAgICAgICAiOiBXYXJuaW5nOiBhcnBfaW50ZXJ2YWwgbW9kdWxlIHBhcmFtZXRlciAoJWQpICIKKwkJICAgICAgICJzcGVjaWZpZWQgd2l0aG91dCBwcm92aWRpbmcgYW4gYXJwX2lwX3RhcmdldCAiCisJCSAgICAgICAicGFyYW1ldGVyLCBhcnBfaW50ZXJ2YWwgd2FzIHJlc2V0IHRvIDBcbiIsCisJCSAgICAgICBhcnBfaW50ZXJ2YWwpOworCQlhcnBfaW50ZXJ2YWwgPSAwOworCX0KKworCWlmIChtaWltb24pIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkgICAgICAgIjogTUlJIGxpbmsgbW9uaXRvcmluZyBzZXQgdG8gJWQgbXNcbiIsCisJCSAgICAgICBtaWltb24pOworCX0gZWxzZSBpZiAoYXJwX2ludGVydmFsKSB7CisJCWludCBpOworCisJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJICAgICAgICI6IEFSUCBtb25pdG9yaW5nIHNldCB0byAlZCBtcyB3aXRoICVkIHRhcmdldChzKToiLAorCQkgICAgICAgYXJwX2ludGVydmFsLCBhcnBfaXBfY291bnQpOworCisJCWZvciAoaSA9IDA7IGkgPCBhcnBfaXBfY291bnQ7IGkrKykKKwkJCXByaW50ayAoIiAlcyIsIGFycF9pcF90YXJnZXRbaV0pOworCisJCXByaW50aygiXG4iKTsKKworCX0gZWxzZSB7CisJCS8qIG1paW1vbiBhbmQgYXJwX2ludGVydmFsIG5vdCBzZXQsIHdlIG5lZWQgb25lIHNvIHRoaW5ncworCQkgKiB3b3JrIGFzIGV4cGVjdGVkLCBzZWUgYm9uZGluZy50eHQgZm9yIGRldGFpbHMKKwkJICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICI6IFdhcm5pbmc6IGVpdGhlciBtaWltb24gb3IgYXJwX2ludGVydmFsIGFuZCAiCisJCSAgICAgICAiYXJwX2lwX3RhcmdldCBtb2R1bGUgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCwgIgorCQkgICAgICAgIm90aGVyd2lzZSBib25kaW5nIHdpbGwgbm90IGRldGVjdCBsaW5rIGZhaWx1cmVzISBzZWUgIgorCQkgICAgICAgImJvbmRpbmcudHh0IGZvciBkZXRhaWxzLlxuIik7CisJfQorCisJaWYgKHByaW1hcnkgJiYgIVVTRVNfUFJJTUFSWShib25kX21vZGUpKSB7CisJCS8qIGN1cnJlbnRseSwgdXNpbmcgYSBwcmltYXJ5IG9ubHkgbWFrZXMgc2Vuc2UKKwkJICogaW4gYWN0aXZlIGJhY2t1cCwgVExCIG9yIEFMQiBtb2RlcworCQkgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkgICAgICAgIjogV2FybmluZzogJXMgcHJpbWFyeSBkZXZpY2Ugc3BlY2lmaWVkIGJ1dCBoYXMgbm8gIgorCQkgICAgICAgImVmZmVjdCBpbiAlcyBtb2RlXG4iLAorCQkgICAgICAgcHJpbWFyeSwgYm9uZF9tb2RlX25hbWUoYm9uZF9tb2RlKSk7CisJCXByaW1hcnkgPSBOVUxMOworCX0KKworCS8qIGZpbGwgcGFyYW1zIHN0cnVjdCB3aXRoIHRoZSBwcm9wZXIgdmFsdWVzICovCisJcGFyYW1zLT5tb2RlID0gYm9uZF9tb2RlOworCXBhcmFtcy0+bWlpbW9uID0gbWlpbW9uOworCXBhcmFtcy0+YXJwX2ludGVydmFsID0gYXJwX2ludGVydmFsOworCXBhcmFtcy0+dXBkZWxheSA9IHVwZGVsYXk7CisJcGFyYW1zLT5kb3duZGVsYXkgPSBkb3duZGVsYXk7CisJcGFyYW1zLT51c2VfY2FycmllciA9IHVzZV9jYXJyaWVyOworCXBhcmFtcy0+bGFjcF9mYXN0ID0gbGFjcF9mYXN0OworCXBhcmFtcy0+cHJpbWFyeVswXSA9IDA7CisKKwlpZiAocHJpbWFyeSkgeworCQlzdHJuY3B5KHBhcmFtcy0+cHJpbWFyeSwgcHJpbWFyeSwgSUZOQU1TSVopOworCQlwYXJhbXMtPnByaW1hcnlbSUZOQU1TSVogLSAxXSA9IDA7CisJfQorCisJbWVtY3B5KHBhcmFtcy0+YXJwX3RhcmdldHMsIGFycF90YXJnZXQsIHNpemVvZihhcnBfdGFyZ2V0KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgYm9uZGluZ19pbml0KHZvaWQpCit7CisJc3RydWN0IGJvbmRfcGFyYW1zIHBhcmFtczsKKwlpbnQgaTsKKwlpbnQgcmVzOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCXJlcyA9IGJvbmRfY2hlY2tfcGFyYW1zKCZwYXJhbXMpOworCWlmIChyZXMpIHsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlydG5sX2xvY2soKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJYm9uZF9jcmVhdGVfcHJvY19kaXIoKTsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IG1heF9ib25kczsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldjsKKworCQlib25kX2RldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGJvbmRpbmcpLCAiIiwgZXRoZXJfc2V0dXApOworCQlpZiAoIWJvbmRfZGV2KSB7CisJCQlyZXMgPSAtRU5PTUVNOworCQkJZ290byBvdXRfZXJyOworCQl9CisKKwkJcmVzID0gZGV2X2FsbG9jX25hbWUoYm9uZF9kZXYsICJib25kJWQiKTsKKwkJaWYgKHJlcyA8IDApIHsKKwkJCWZyZWVfbmV0ZGV2KGJvbmRfZGV2KTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCisJCS8qIGJvbmRfaW5pdCgpIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRldl9hbGxvY19uYW1lKCkgKGZvciB0aGUKKwkJICogL3Byb2MgZmlsZXMpLCBidXQgYmVmb3JlIHJlZ2lzdGVyX25ldGRldmljZSgpLCBiZWNhdXNlIHdlCisJCSAqIG5lZWQgdG8gc2V0IGZ1bmN0aW9uIHBvaW50ZXJzLgorCQkgKi8KKwkJcmVzID0gYm9uZF9pbml0KGJvbmRfZGV2LCAmcGFyYW1zKTsKKwkJaWYgKHJlcyA8IDApIHsKKwkJCWZyZWVfbmV0ZGV2KGJvbmRfZGV2KTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCisJCVNFVF9NT0RVTEVfT1dORVIoYm9uZF9kZXYpOworCisJCXJlcyA9IHJlZ2lzdGVyX25ldGRldmljZShib25kX2Rldik7CisJCWlmIChyZXMgPCAwKSB7CisJCQlib25kX2RlaW5pdChib25kX2Rldik7CisJCQlmcmVlX25ldGRldihib25kX2Rldik7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKwl9CisKKwlydG5sX3VubG9jaygpOworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmYm9uZF9uZXRkZXZfbm90aWZpZXIpOworCisJcmV0dXJuIDA7CisKK291dF9lcnI6CisJLyogZnJlZSBhbmQgdW5yZWdpc3RlciBhbGwgYm9uZHMgdGhhdCB3ZXJlIHN1Y2Nlc3NmdWxseSBhZGRlZCAqLworCWJvbmRfZnJlZV9hbGwoKTsKKworCXJ0bmxfdW5sb2NrKCk7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYm9uZGluZ19leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmJvbmRfbmV0ZGV2X25vdGlmaWVyKTsKKworCXJ0bmxfbG9jaygpOworCWJvbmRfZnJlZV9hbGwoKTsKKwlydG5sX3VubG9jaygpOworfQorCittb2R1bGVfaW5pdChib25kaW5nX2luaXQpOworbW9kdWxlX2V4aXQoYm9uZGluZ19leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQ1JJUFRJT04gIiwgdiIgRFJWX1ZFUlNJT04pOworTU9EVUxFX0FVVEhPUigiVGhvbWFzIERhdmlzLCB0YWRhdmlzQGxibC5nb3YgYW5kIG1hbnkgb3RoZXJzIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgibW9zdCBldGhlcm5ldCBkZXZpY2VzIik7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzMjUzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogQm9uZCBzZXZlcmFsIGV0aGVybmV0IGludGVyZmFjZXMgaW50byBhIENpc2NvLCBydW5uaW5nICdFdGhlcmNoYW5uZWwnLgorICoKKyAqIFBvcnRpb25zIGFyZSAoYykgQ29weXJpZ2h0IDE5OTUgU2ltb24gIkd1cnUgQWxlcGgtTnVsbCIgSmFuZXMKKyAqIE5DTTogTmV0d29yayBhbmQgQ29tbXVuaWNhdGlvbnMgTWFuYWdlbWVudCwgSW5jLgorICoKKyAqIEJVVCwgSSdtIHRoZSBvbmUgd2hvIG1vZGlmaWVkIGl0IGZvciBldGhlcm5ldCwgc286CisgKiAoYykgQ29weXJpZ2h0IDE5OTksIFRob21hcyBEYXZpcywgdGFkYXZpc0BsYmwuZ292CisgKgorICoJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICoJb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICoKKyAqIDIwMDMvMDMvMTggLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPiwKKyAqCQlUc2lwcHkgTWVuZGVsc29uIDx0c2lwcHkubWVuZGVsc29uIGF0IGludGVsIGRvdCBjb20+IGFuZAorICoJCVNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBBZGRlZCBzdXBwb3J0IGZvciBJRUVFIDgwMi4zYWQgRHluYW1pYyBsaW5rIGFnZ3JlZ2F0aW9uIG1vZGUuCisgKgorICogMjAwMy8wNS8wMSAtIFRzaXBweSBNZW5kZWxzb24gPHRzaXBweS5tZW5kZWxzb24gYXQgaW50ZWwgZG90IGNvbT4gYW5kCisgKgkJQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQ29kZSBiZWF1dGlmaWNhdGlvbiBhbmQgc3R5bGUgY2hhbmdlcyAobWFpbmx5IGluIGNvbW1lbnRzKS4KKyAqCisgKiAyMDAzLzA1LzAxIC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIEFkZGVkIHN1cHBvcnQgZm9yIFRyYW5zbWl0IGxvYWQgYmFsYW5jaW5nIG1vZGUuCisgKgorICogMjAwMy8xMi8wMSAtIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBDb2RlIGNsZWFudXAgYW5kIHN0eWxlIGNoYW5nZXMKKyAqLworCisjaWZuZGVmIF9MSU5VWF9CT05ESU5HX0gKKyNkZWZpbmUgX0xJTlVYX0JPTkRJTkdfSAorCisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYm9uZGluZy5oPgorI2luY2x1ZGUgImJvbmRfM2FkLmgiCisjaW5jbHVkZSAiYm9uZF9hbGIuaCIKKworI2RlZmluZSBEUlZfVkVSU0lPTgkiMi42LjEiCisjZGVmaW5lIERSVl9SRUxEQVRFCSJPY3RvYmVyIDI5LCAyMDA0IgorI2RlZmluZSBEUlZfTkFNRQkiYm9uZGluZyIKKyNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OCSJFdGhlcm5ldCBDaGFubmVsIEJvbmRpbmcgRHJpdmVyIgorCisjZGVmaW5lIEJPTkRfTUFYX0FSUF9UQVJHRVRTCTE2CisKKyNpZmRlZiBCT05ESU5HX0RFQlVHCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgICAgIFwKKwkgICAgICAgRFJWX05BTUUgIjogJXMoKSAlZDogIiBmbXQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18gLCAjIyBhcmdzICkKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKQorI2VuZGlmIC8qIEJPTkRJTkdfREVCVUcgKi8KKworI2RlZmluZSBJU19VUChkZXYpCQkJCQkgICBcCisJICAgICAgKCgoKGRldiktPmZsYWdzICYgSUZGX1VQKSA9PSBJRkZfVVApCSYmIFwKKwkgICAgICAgbmV0aWZfcnVubmluZyhkZXYpCQkJJiYgXAorCSAgICAgICBuZXRpZl9jYXJyaWVyX29rKGRldikpCisKKy8qCisgKiBDaGVja3Mgd2hldGhlciBib25kIGlzIHJlYWR5IGZvciB0cmFuc21pdC4KKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQtPmxvY2sKKyAqLworI2RlZmluZSBCT05EX0lTX09LKGJvbmQpCQkJICAgICBcCisJCSAgICgoKGJvbmQpLT5kZXYtPmZsYWdzICYgSUZGX1VQKSAmJiBcCisJCSAgICBuZXRpZl9ydW5uaW5nKChib25kKS0+ZGV2KQkgICYmIFwKKwkJICAgICgoYm9uZCktPnNsYXZlX2NudCA+IDApKQorCisvKgorICogQ2hlY2tzIHdoZXRoZXIgc2xhdmUgaXMgcmVhZHkgZm9yIHRyYW5zbWl0LgorICovCisjZGVmaW5lIFNMQVZFX0lTX09LKHNsYXZlKQkJCSAgICAgICAgXAorCQkgICAgKCgoc2xhdmUpLT5kZXYtPmZsYWdzICYgSUZGX1VQKSAgJiYgXAorCQkgICAgIG5ldGlmX3J1bm5pbmcoKHNsYXZlKS0+ZGV2KSAgICAgJiYgXAorCQkgICAgICgoc2xhdmUpLT5saW5rID09IEJPTkRfTElOS19VUCkgJiYgXAorCQkgICAgICgoc2xhdmUpLT5zdGF0ZSA9PSBCT05EX1NUQVRFX0FDVElWRSkpCisKKworI2RlZmluZSBVU0VTX1BSSU1BUlkobW9kZSkJCQkJXAorCQkoKChtb2RlKSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB8fAlcCisJCSAoKG1vZGUpID09IEJPTkRfTU9ERV9UTEIpICAgICAgICAgIHx8CVwKKwkJICgobW9kZSkgPT0gQk9ORF9NT0RFX0FMQikpCisKKy8qCisgKiBMZXNzIGJhZCB3YXkgdG8gY2FsbCBpb2N0bCBmcm9tIHdpdGhpbiB0aGUga2VybmVsOyB0aGlzIG5lZWRzIHRvIGJlCisgKiBkb25lIHNvbWUgb3RoZXIgd2F5IHRvIGdldCB0aGUgY2FsbCBvdXQgb2YgaW50ZXJydXB0IGNvbnRleHQuCisgKiBOZWVkcyAiaW9jdGwiIHZhcmlhYmxlIHRvIGJlIHN1cHBsaWVkIGJ5IGNhbGxpbmcgY29udGV4dC4KKyAqLworI2RlZmluZSBJT0NUTChkZXYsIGFyZywgY21kKSAoewkJXAorCWludCByZXMgPSAwOwkJCVwKKwltbV9zZWdtZW50X3QgZnMgPSBnZXRfZnMoKTsJXAorCXNldF9mcyhnZXRfZHMoKSk7CQlcCisJcmVzID0gaW9jdGwoZGV2LCBhcmcsIGNtZCk7CVwKKwlzZXRfZnMoZnMpOwkJCVwKKwlyZXM7IH0pCisKKy8qKgorICogYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tIC0gaXRlcmF0ZSB0aGUgc2xhdmVzIGxpc3QgZnJvbSBhIHN0YXJ0aW5nIHBvaW50CisgKiBAYm9uZDoJdGhlIGJvbmQgaG9sZGluZyB0aGlzIGxpc3QuCisgKiBAcG9zOgljdXJyZW50IHNsYXZlLgorICogQGNudDoJY291bnRlciBmb3IgbWF4IG51bWJlciBvZiBtb3ZlcworICogQHN0YXJ0OglzdGFydGluZyBwb2ludC4KKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQtPmxvY2sKKyAqLworI2RlZmluZSBib25kX2Zvcl9lYWNoX3NsYXZlX2Zyb20oYm9uZCwgcG9zLCBjbnQsIHN0YXJ0KQlcCisJZm9yIChjbnQgPSAwLCBwb3MgPSBzdGFydDsJCQkJXAorCSAgICAgY250IDwgKGJvbmQpLT5zbGF2ZV9jbnQ7CQkJCVwKKyAgICAgICAgICAgICBjbnQrKywgcG9zID0gKHBvcyktPm5leHQpCisKKy8qKgorICogYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tX3RvIC0gaXRlcmF0ZSB0aGUgc2xhdmVzIGxpc3QgZnJvbSBzdGFydCBwb2ludCB0byBzdG9wIHBvaW50CisgKiBAYm9uZDoJdGhlIGJvbmQgaG9sZGluZyB0aGlzIGxpc3QuCisgKiBAcG9zOgljdXJyZW50IHNsYXZlLgorICogQGNudDoJY291bnRlciBmb3IgbnVtYmVyIG1heCBvZiBtb3ZlcworICogQHN0YXJ0OglzdGFydCBwb2ludC4KKyAqIEBzdG9wOglzdG9wIHBvaW50LgorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgYm9uZC0+bG9jaworICovCisjZGVmaW5lIGJvbmRfZm9yX2VhY2hfc2xhdmVfZnJvbV90byhib25kLCBwb3MsIGNudCwgc3RhcnQsIHN0b3ApCVwKKwlmb3IgKGNudCA9IDAsIHBvcyA9IHN0YXJ0OwkJCQkJXAorCSAgICAgKChjbnQgPCAoYm9uZCktPnNsYXZlX2NudCkgJiYgKHBvcyAhPSAoc3RvcCktPm5leHQpKTsJXAorICAgICAgICAgICAgIGNudCsrLCBwb3MgPSAocG9zKS0+bmV4dCkKKworLyoqCisgKiBib25kX2Zvcl9lYWNoX3NsYXZlIC0gaXRlcmF0ZSB0aGUgc2xhdmVzIGxpc3QgZnJvbSBoZWFkCisgKiBAYm9uZDoJdGhlIGJvbmQgaG9sZGluZyB0aGlzIGxpc3QuCisgKiBAcG9zOgljdXJyZW50IHNsYXZlLgorICogQGNudDoJY291bnRlciBmb3IgbWF4IG51bWJlciBvZiBtb3ZlcworICoKKyAqIENhbGxlciBtdXN0IGhvbGQgYm9uZC0+bG9jaworICovCisjZGVmaW5lIGJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgcG9zLCBjbnQpCVwKKwkJYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tKGJvbmQsIHBvcywgY250LCAoYm9uZCktPmZpcnN0X3NsYXZlKQorCisKK3N0cnVjdCBib25kX3BhcmFtcyB7CisJaW50IG1vZGU7CisJaW50IG1paW1vbjsKKwlpbnQgYXJwX2ludGVydmFsOworCWludCB1c2VfY2FycmllcjsKKwlpbnQgdXBkZWxheTsKKwlpbnQgZG93bmRlbGF5OworCWludCBsYWNwX2Zhc3Q7CisJY2hhciBwcmltYXJ5W0lGTkFNU0laXTsKKwl1MzIgYXJwX3RhcmdldHNbQk9ORF9NQVhfQVJQX1RBUkdFVFNdOworfTsKKworc3RydWN0IHZsYW5fZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgdmxhbl9saXN0OworCXVuc2lnbmVkIHNob3J0IHZsYW5faWQ7Cit9OworCitzdHJ1Y3Qgc2xhdmUgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7IC8qIGZpcnN0IC0gdXNlZnVsbCBmb3IgcGFuaWMgZGVidWcgKi8KKwlzdHJ1Y3Qgc2xhdmUgKm5leHQ7CisJc3RydWN0IHNsYXZlICpwcmV2OworCXMxNiAgICBkZWxheTsKKwl1MzIgICAgamlmZmllczsKKwlzOCAgICAgbGluazsgICAgLyogb25lIG9mIEJPTkRfTElOS19YWFhYICovCisJczggICAgIHN0YXRlOyAgIC8qIG9uZSBvZiBCT05EX1NUQVRFX1hYWFggKi8KKwl1MzIgICAgb3JpZ2luYWxfZmxhZ3M7CisJdTMyICAgIGxpbmtfZmFpbHVyZV9jb3VudDsKKwl1MTYgICAgc3BlZWQ7CisJdTggICAgIGR1cGxleDsKKwl1OCAgICAgcGVybV9od2FkZHJbRVRIX0FMRU5dOworCXN0cnVjdCBhZF9zbGF2ZV9pbmZvIGFkX2luZm87IC8qIEhVR0UgLSBiZXR0ZXIgdG8gZHluYW1pY2FsbHkgYWxsb2MgKi8KKwlzdHJ1Y3QgdGxiX3NsYXZlX2luZm8gdGxiX2luZm87Cit9OworCisvKgorICogSGVyZSBhcmUgdGhlIGxvY2tpbmcgcG9saWNpZXMgZm9yIHRoZSB0d28gYm9uZGluZyBsb2NrczoKKyAqCisgKiAxKSBHZXQgYm9uZC0+bG9jayB3aGVuIHJlYWRpbmcvd3JpdGluZyBzbGF2ZSBsaXN0LgorICogMikgR2V0IGJvbmQtPmN1cnJfc2xhdmVfbG9jayB3aGVuIHJlYWRpbmcvd3JpdGluZyBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZS4KKyAqICAgIChJdCBpcyB1bm5lY2Vzc2FyeSB3aGVuIHRoZSB3cml0ZS1sb2NrIGlzIHB1dCB3aXRoIGJvbmQtPmxvY2suKQorICogMykgV2hlbiB3ZSBsb2NrIHdpdGggYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrLCB3ZSBtdXN0IGxvY2sgd2l0aCBib25kLT5sb2NrCisgKiAgICBiZWZvcmVoYW5kLgorICovCitzdHJ1Y3QgYm9uZGluZyB7CisJc3RydWN0ICAgbmV0X2RldmljZSAqZGV2OyAvKiBmaXJzdCAtIHVzZWZ1bGwgZm9yIHBhbmljIGRlYnVnICovCisJc3RydWN0ICAgc2xhdmUgKmZpcnN0X3NsYXZlOworCXN0cnVjdCAgIHNsYXZlICpjdXJyX2FjdGl2ZV9zbGF2ZTsKKwlzdHJ1Y3QgICBzbGF2ZSAqY3VycmVudF9hcnBfc2xhdmU7CisJc3RydWN0ICAgc2xhdmUgKnByaW1hcnlfc2xhdmU7CisJczMyICAgICAgc2xhdmVfY250OyAvKiBuZXZlciBjaGFuZ2UgdGhpcyB2YWx1ZSBvdXRzaWRlIHRoZSBhdHRhY2gvZGV0YWNoIHdyYXBwZXJzICovCisJcndsb2NrX3QgbG9jazsKKwlyd2xvY2tfdCBjdXJyX3NsYXZlX2xvY2s7CisJc3RydWN0ICAgdGltZXJfbGlzdCBtaWlfdGltZXI7CisJc3RydWN0ICAgdGltZXJfbGlzdCBhcnBfdGltZXI7CisJczggICAgICAga2lsbF90aW1lcnM7CisJc3RydWN0ICAgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXN0cnVjdCAgIHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudHJ5OworCWNoYXIgICAgIHByb2NfZmlsZV9uYW1lW0lGTkFNU0laXTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCXN0cnVjdCAgIGxpc3RfaGVhZCBib25kX2xpc3Q7CisJc3RydWN0ICAgZGV2X21jX2xpc3QgKm1jX2xpc3Q7CisJdTE2ICAgICAgZmxhZ3M7CisJc3RydWN0ICAgYWRfYm9uZF9pbmZvIGFkX2luZm87CisJc3RydWN0ICAgYWxiX2JvbmRfaW5mbyBhbGJfaW5mbzsKKwlzdHJ1Y3QgICBib25kX3BhcmFtcyBwYXJhbXM7CisJc3RydWN0ICAgbGlzdF9oZWFkIHZsYW5fbGlzdDsKKwlzdHJ1Y3QgICB2bGFuX2dyb3VwICp2bGdycDsKK307CisKKy8qKgorICogUmV0dXJucyBOVUxMIGlmIHRoZSBuZXRfZGV2aWNlIGRvZXMgbm90IGJlbG9uZyB0byBhbnkgb2YgdGhlIGJvbmQncyBzbGF2ZXMKKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQgbG9jayBmb3IgcmVhZAorICovCitleHRlcm4gaW5saW5lIHN0cnVjdCBzbGF2ZSAqYm9uZF9nZXRfc2xhdmVfYnlfZGV2KHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2KQoreworCXN0cnVjdCBzbGF2ZSAqc2xhdmUgPSBOVUxMOworCWludCBpOworCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQlpZiAoc2xhdmUtPmRldiA9PSBzbGF2ZV9kZXYpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHNsYXZlOworfQorCitleHRlcm4gaW5saW5lIHN0cnVjdCBib25kaW5nICpib25kX2dldF9ib25kX2J5X3NsYXZlKHN0cnVjdCBzbGF2ZSAqc2xhdmUpCit7CisJaWYgKCFzbGF2ZSB8fCAhc2xhdmUtPmRldi0+bWFzdGVyKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAoc3RydWN0IGJvbmRpbmcgKilzbGF2ZS0+ZGV2LT5tYXN0ZXItPnByaXY7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCBib25kX3NldF9zbGF2ZV9pbmFjdGl2ZV9mbGFncyhzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCXNsYXZlLT5zdGF0ZSA9IEJPTkRfU1RBVEVfQkFDS1VQOworCXNsYXZlLT5kZXYtPmZsYWdzIHw9IElGRl9OT0FSUDsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIGJvbmRfc2V0X3NsYXZlX2FjdGl2ZV9mbGFncyhzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCXNsYXZlLT5zdGF0ZSA9IEJPTkRfU1RBVEVfQUNUSVZFOworCXNsYXZlLT5kZXYtPmZsYWdzICY9IH5JRkZfTk9BUlA7Cit9CisKK3N0cnVjdCB2bGFuX2VudHJ5ICpib25kX25leHRfdmxhbihzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHZsYW5fZW50cnkgKmN1cnIpOworaW50IGJvbmRfZGV2X3F1ZXVlX3htaXQoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYpOworCisjZW5kaWYgLyogX0xJTlVYX0JPTkRJTkdfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ic2RfY29tcC5jIGIvZHJpdmVycy9uZXQvYnNkX2NvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDg4YWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYnNkX2NvbXAuYwpAQCAtMCwwICsxLDExNzkgQEAKKy8qCisgKiBVcGRhdGU6IFRoZSBCZXJrZWxleSBjb3B5cmlnaHQgd2FzIGNoYW5nZWQsIGFuZCB0aGUgY2hhbmdlIAorICogaXMgcmV0cm9hY3RpdmUgdG8gYWxsICJ0cnVlIiBCU0Qgc29mdHdhcmUgKGllIGV2ZXJ5dGhpbmcKKyAqIGZyb20gVUNCIGFzIG9wcG9zZWQgdG8gb3RoZXIgcGVvcGxlcyBjb2RlIHRoYXQganVzdCBjYXJyaWVkCisgKiB0aGUgc2FtZSBsaWNlbnNlKS4gVGhlIG5ldyBjb3B5cmlnaHQgZG9lc24ndCBjbGFzaCB3aXRoIHRoZQorICogR1BMLCBzbyB0aGUgbW9kdWxlLW9ubHkgcmVzdHJpY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZC4uCisgKi8KKworLyogQmVjYXVzZSB0aGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSA0LjNCU0QgY29tcHJlc3Mgc291cmNlOgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4NSwgMTk4NiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBKYW1lcyBBLiBXb29kcywgZGVyaXZlZCBmcm9tIG9yaWdpbmFsIHdvcmsgYnkgU3BlbmNlciBUaG9tYXMKKyAqIGFuZCBKb3NlcGggT3Jvc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogVGhpcyB2ZXJzaW9uIGlzIGZvciB1c2Ugd2l0aCBjb250aWd1b3VzIGJ1ZmZlcnMgb24gTGludXgtZGVyaXZlZCBzeXN0ZW1zLgorICoKKyAqICA9PUZJTEVWRVJTSU9OIDIwMDAwMjI2PT0KKyAqCisgKiAgTk9URSBUTyBNQUlOVEFJTkVSUzoKKyAqICAgICBJZiB5b3UgbW9kaWZ5IHRoaXMgZmlsZSBhdCBhbGwsIHBsZWFzZSBzZXQgdGhlIG51bWJlciBhYm92ZSB0byB0aGUKKyAqICAgICBkYXRlIG9mIHRoZSBtb2RpZmljYXRpb24gYXMgWVlNTUREICh5ZWFyIG1vbnRoIGRheSkuCisgKiAgICAgYnNkX2NvbXAuYyBpcyBzaGlwcGVkIHdpdGggYSBQUFAgZGlzdHJpYnV0aW9uIGFzIHdlbGwgYXMgd2l0aAorICogICAgIHRoZSBrZXJuZWw7IGlmIGV2ZXJ5b25lIGluY3JlYXNlcyB0aGUgRklMRVZFUlNJT04gbnVtYmVyIGFib3ZlLAorICogICAgIHRoZW4gc2NyaXB0cyBjYW4gZG8gdGhlIHJpZ2h0IHRoaW5nIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0bworICogICAgIGluc3RhbGwgYSBuZXcgYnNkX2NvbXAuYyBmaWxlLiBEb24ndCBjaGFuZ2UgdGhlIGZvcm1hdCBvZiB0aGF0CisgKiAgICAgbGluZSBvdGhlcndpc2UsIHNvIHRoZSBpbnN0YWxsYXRpb24gc2NyaXB0IGNhbiByZWNvZ25pemUgaXQuCisgKgorICogRnJvbTogYnNkX2NvbXAuYyx2IDEuMyAxOTk0LzEyLzA4IDAxOjU5OjU4IHBhdWx1cyBFeHAKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgorCisjdW5kZWYgICBQQUNLRVRQVFIKKyNkZWZpbmUgIFBBQ0tFVFBUUiAxCisjaW5jbHVkZSA8bGludXgvcHBwLWNvbXAuaD4KKyN1bmRlZiAgIFBBQ0tFVFBUUgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKgorICogUFBQICJCU0QgY29tcHJlc3MiIGNvbXByZXNzaW9uCisgKiAgVGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhpcyBjb21wcmVzc2lvbiBhbmQgdGhlIGNsYXNzaWMgQlNEIExaVworICogIHNvdXJjZSBhcmUgb2J2aW91cyBmcm9tIHRoZSByZXF1aXJlbWVudCB0aGF0IHRoZSBjbGFzc2ljIGNvZGUgd29ya2VkCisgKiAgd2l0aCBmaWxlcyB3aGlsZSB0aGlzIGhhbmRsZXMgYXJiaXRyYXJpbHkgbG9uZyBzdHJlYW1zIHRoYXQKKyAqICBhcmUgYnJva2VuIGludG8gcGFja2V0cy4gIFRoZXkgYXJlOgorICoKKyAqCVdoZW4gdGhlIGNvZGUgc2l6ZSBleHBhbmRzLCBhIGJsb2NrIG9mIGp1bmsgaXMgbm90IGVtaXR0ZWQgYnkKKyAqCSAgICB0aGUgY29tcHJlc3NvciBhbmQgbm90IGV4cGVjdGVkIGJ5IHRoZSBkZWNvbXByZXNzb3IuCisgKgorICoJTmV3IGNvZGVzIGFyZSBub3QgbmVjZXNzYXJpbHkgYXNzaWduZWQgZXZlcnkgdGltZSBhbiBvbGQKKyAqCSAgICBjb2RlIGlzIG91dHB1dCBieSB0aGUgY29tcHJlc3Nvci4gIFRoaXMgaXMgYmVjYXVzZSBhIHBhY2tldAorICoJICAgIGVuZCBmb3JjZXMgYSBjb2RlIHRvIGJlIGVtaXR0ZWQsIGJ1dCBkb2VzIG5vdCBpbXBseSB0aGF0IGEKKyAqCSAgICBuZXcgc2VxdWVuY2UgaGFzIGJlZW4gc2Vlbi4KKyAqCisgKglUaGUgY29tcHJlc3Npb24gcmF0aW8gaXMgY2hlY2tlZCBhdCB0aGUgZmlyc3QgZW5kIG9mIGEgcGFja2V0CisgKgkgICAgYWZ0ZXIgdGhlIGFwcHJvcHJpYXRlIGdhcC4JQmVzaWRlcyBzaW1wbGlmeWluZyBhbmQgc3BlZWRpbmcKKyAqCSAgICB0aGluZ3MgdXAsIHRoaXMgbWFrZXMgaXQgbW9yZSBsaWtlbHkgdGhhdCB0aGUgdHJhbnNtaXR0ZXIKKyAqCSAgICBhbmQgcmVjZWl2ZXIgd2lsbCBhZ3JlZSB3aGVuIHRoZSBkaWN0aW9uYXJ5IGlzIGNsZWFyZWQgd2hlbgorICoJICAgIGNvbXByZXNzaW9uIGlzIG5vdCBnb2luZyB3ZWxsLgorICovCisKKy8qCisgKiBNYWNyb3MgdG8gZXh0cmFjdCBwcm90b2NvbCB2ZXJzaW9uIGFuZCBudW1iZXIgb2YgYml0cworICogZnJvbSB0aGUgdGhpcmQgYnl0ZSBvZiB0aGUgQlNEIENvbXByZXNzIENDUCBjb25maWd1cmF0aW9uIG9wdGlvbi4KKyAqLworCisjZGVmaW5lIEJTRF9WRVJTSU9OKHgpCSgoeCkgPj4gNSkKKyNkZWZpbmUgQlNEX05CSVRTKHgpCSgoeCkgJiAweDFGKQorCisjZGVmaW5lIEJTRF9DVVJSRU5UX1ZFUlNJT04JMQorCisvKgorICogQSBkaWN0aW9uYXJ5IGZvciBkb2luZyBCU0QgY29tcHJlc3MuCisgKi8KKworc3RydWN0IGJzZF9kaWN0IHsKKyAgICB1bmlvbiB7CQkJCS8qIGhhc2ggdmFsdWUgKi8KKwl1bnNpZ25lZCBsb25nCWZjb2RlOworCXN0cnVjdCB7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCQkvKiBMaXR0bGUgZW5kaWFuIG9yZGVyICovCisJICAgIHVuc2lnbmVkIHNob3J0CXByZWZpeDsJLyogcHJlY2VkaW5nIGNvZGUgKi8KKwkgICAgdW5zaWduZWQgY2hhcglzdWZmaXg7IC8qIGxhc3QgY2hhcmFjdGVyIG9mIG5ldyBjb2RlICovCisJICAgIHVuc2lnbmVkIGNoYXIJcGFkOworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCQkvKiBCaWcgZW5kaWFuIG9yZGVyICovCisJICAgIHVuc2lnbmVkIGNoYXIJcGFkOworCSAgICB1bnNpZ25lZCBjaGFyCXN1ZmZpeDsgLyogbGFzdCBjaGFyYWN0ZXIgb2YgbmV3IGNvZGUgKi8KKwkgICAgdW5zaWduZWQgc2hvcnQJcHJlZml4OyAvKiBwcmVjZWRpbmcgY29kZSAqLworI2Vsc2UKKyNlcnJvciBFbmRpYW5uZXNzIG5vdCBkZWZpbmVkLi4uCisjZW5kaWYKKwl9IGhzOworICAgIH0gZjsKKyAgICB1bnNpZ25lZCBzaG9ydCBjb2RlbTE7CQkvKiBvdXRwdXQgb2YgaGFzaCB0YWJsZSAtMSAqLworICAgIHVuc2lnbmVkIHNob3J0IGNwdHI7CQkvKiBtYXAgY29kZSB0byBoYXNoIHRhYmxlIGVudHJ5ICovCit9OworCitzdHJ1Y3QgYnNkX2RiIHsKKyAgICBpbnQJICAgIHRvdGxlbjsJCQkvKiBsZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBoc2l6ZTsJCS8qIHNpemUgb2YgdGhlIGhhc2ggdGFibGUgKi8KKyAgICB1bnNpZ25lZCBjaGFyICBoc2hpZnQ7CQkvKiB1c2VkIGluIGhhc2ggZnVuY3Rpb24gKi8KKyAgICB1bnNpZ25lZCBjaGFyICBuX2JpdHM7CQkvKiBjdXJyZW50IGJpdHMvY29kZSAqLworICAgIHVuc2lnbmVkIGNoYXIgIG1heGJpdHM7CQkvKiBtYXhpbXVtIGJpdHMvY29kZSAqLworICAgIHVuc2lnbmVkIGNoYXIgIGRlYnVnOwkJLyogbm9uLXplcm8gaWYgZGVidWcgZGVzaXJlZCAqLworICAgIHVuc2lnbmVkIGNoYXIgIHVuaXQ7CQkvKiBwcHAgdW5pdCBudW1iZXIgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBzZXFubzsJCS8qIHNlcXVlbmNlICMgb2YgbmV4dCBwYWNrZXQgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBtcnU7CQkJLyogc2l6ZSBvZiByZWNlaXZlIChkZWNvbXByZXNzKSBidWZyICovCisgICAgdW5zaWduZWQgaW50ICAgbWF4bWF4Y29kZTsJCS8qIGxhcmdlc3QgdmFsaWQgY29kZSAqLworICAgIHVuc2lnbmVkIGludCAgIG1heF9lbnQ7CQkvKiBsYXJnZXN0IGNvZGUgaW4gdXNlICovCisgICAgdW5zaWduZWQgaW50ICAgaW5fY291bnQ7CQkvKiB1bmNvbXByZXNzZWQgYnl0ZXMsIGFnZWQgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBieXRlc19vdXQ7CQkvKiBjb21wcmVzc2VkIGJ5dGVzLCBhZ2VkICovCisgICAgdW5zaWduZWQgaW50ICAgcmF0aW87CQkvKiByZWNlbnQgY29tcHJlc3Npb24gcmF0aW8gKi8KKyAgICB1bnNpZ25lZCBpbnQgICBjaGVja3BvaW50OwkJLyogd2hlbiB0byBuZXh0IGNoZWNrIHRoZSByYXRpbyAqLworICAgIHVuc2lnbmVkIGludCAgIGNsZWFyX2NvdW50OwkJLyogdGltZXMgZGljdGlvbmFyeSBjbGVhcmVkICovCisgICAgdW5zaWduZWQgaW50ICAgaW5jb21wX2NvdW50OwkvKiBpbmNvbXByZXNzaWJsZSBwYWNrZXRzICovCisgICAgdW5zaWduZWQgaW50ICAgaW5jb21wX2J5dGVzOwkvKiBpbmNvbXByZXNzaWJsZSBieXRlcyAqLworICAgIHVuc2lnbmVkIGludCAgIHVuY29tcF9jb3VudDsJLyogdW5jb21wcmVzc2VkIHBhY2tldHMgKi8KKyAgICB1bnNpZ25lZCBpbnQgICB1bmNvbXBfYnl0ZXM7CS8qIHVuY29tcHJlc3NlZCBieXRlcyAqLworICAgIHVuc2lnbmVkIGludCAgIGNvbXBfY291bnQ7CQkvKiBjb21wcmVzc2VkIHBhY2tldHMgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBjb21wX2J5dGVzOwkJLyogY29tcHJlc3NlZCBieXRlcyAqLworICAgIHVuc2lnbmVkIHNob3J0ICAqbGVuczsJCS8qIGFycmF5IG9mIGxlbmd0aHMgb2YgY29kZXMgKi8KKyAgICBzdHJ1Y3QgYnNkX2RpY3QgKmRpY3Q7CQkvKiBkaWN0aW9uYXJ5ICovCit9OworCisjZGVmaW5lIEJTRF9PVkhECTIJCS8qIEJTRCBjb21wcmVzcyBvdmVyaGVhZC9wYWNrZXQgKi8KKyNkZWZpbmUgTUlOX0JTRF9CSVRTCTkKKyNkZWZpbmUgQlNEX0lOSVRfQklUUwlNSU5fQlNEX0JJVFMKKyNkZWZpbmUgTUFYX0JTRF9CSVRTCTE1CisKK3N0YXRpYyB2b2lkCWJzZF9mcmVlICh2b2lkICpzdGF0ZSk7CitzdGF0aWMgdm9pZAkqYnNkX2FsbG9jKHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsIGludCBvcHRfbGVuLCBpbnQgZGVjb21wKTsKK3N0YXRpYyB2b2lkCSpic2RfY29tcF9hbGxvYyAodW5zaWduZWQgY2hhciAqb3B0aW9ucywgaW50IG9wdF9sZW4pOworc3RhdGljIHZvaWQJKmJzZF9kZWNvbXBfYWxsb2MgKHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsIGludCBvcHRfbGVuKTsKKworc3RhdGljIGludAlic2RfaW5pdCAgICAgICAgKHZvaWQgKmRiLCB1bnNpZ25lZCBjaGFyICpvcHRpb25zLAorCQkJICAgICAgICAgaW50IG9wdF9sZW4sIGludCB1bml0LCBpbnQgZGVidWcsIGludCBkZWNvbXApOworc3RhdGljIGludAlic2RfY29tcF9pbml0ICAgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICpvcHRpb25zLAorCQkJICAgICAgICAgaW50IG9wdF9sZW4sIGludCB1bml0LCBpbnQgb3B0aGRyLCBpbnQgZGVidWcpOworc3RhdGljIGludAlic2RfZGVjb21wX2luaXQgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICpvcHRpb25zLAorCQkJCSBpbnQgb3B0X2xlbiwgaW50IHVuaXQsIGludCBvcHRoZHIsIGludCBtcnUsCisJCQkJIGludCBkZWJ1Zyk7CisKK3N0YXRpYyB2b2lkCWJzZF9yZXNldCAodm9pZCAqc3RhdGUpOworc3RhdGljIHZvaWQJYnNkX2NvbXBfc3RhdHMgKHZvaWQgKnN0YXRlLCBzdHJ1Y3QgY29tcHN0YXQgKnN0YXRzKTsKKworc3RhdGljIGludAlic2RfY29tcHJlc3MgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICpycHRyLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqb2J1ZiwgaW50IGlzaXplLCBpbnQgb3NpemUpOworc3RhdGljIHZvaWQJYnNkX2luY29tcCAodm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgKmlidWYsIGludCBpY250KTsKKworc3RhdGljIGludAlic2RfZGVjb21wcmVzcyAodm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgKmlidWYsIGludCBpc2l6ZSwKKwkJCQl1bnNpZ25lZCBjaGFyICpvYnVmLCBpbnQgb3NpemUpOworCisvKiBUaGVzZSBhcmUgaW4gcHBwX2dlbmVyaWMuYyAqLworZXh0ZXJuIGludCAgcHBwX3JlZ2lzdGVyX2NvbXByZXNzb3IgICAoc3RydWN0IGNvbXByZXNzb3IgKmNwKTsKK2V4dGVybiB2b2lkIHBwcF91bnJlZ2lzdGVyX2NvbXByZXNzb3IgKHN0cnVjdCBjb21wcmVzc29yICpjcCk7CisKKy8qCisgKiB0aGUgbmV4dCB0d28gY29kZXMgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGxpZ2h0bHksIGFzIHRoZXkgbXVzdCBub3QKKyAqIGxpZSB3aXRoaW4gdGhlIGNvbnRpZ3VvdXMgZ2VuZXJhbCBjb2RlIHNwYWNlLgorICovCisjZGVmaW5lIENMRUFSCTI1NgkJCS8qIHRhYmxlIGNsZWFyIG91dHB1dCBjb2RlICovCisjZGVmaW5lIEZJUlNUCTI1NwkJCS8qIGZpcnN0IGZyZWUgZW50cnkgKi8KKyNkZWZpbmUgTEFTVAkyNTUKKworI2RlZmluZSBNQVhDT0RFKGIpCSgoMSA8PCAoYikpIC0gMSkKKyNkZWZpbmUgQkFEQ09ERU0xCU1BWENPREUoTUFYX0JTRF9CSVRTKTsKKworI2RlZmluZSBCU0RfSEFTSChwcmVmaXgsc3VmZml4LGhzaGlmdCkgKCgoKHVuc2lnbmVkIGxvbmcpKHN1ZmZpeCkpPDwoaHNoaWZ0KSkgXAorCQkJCQkgXiAodW5zaWduZWQgbG9uZykocHJlZml4KSkKKyNkZWZpbmUgQlNEX0tFWShwcmVmaXgsc3VmZml4KQkJKCgoKHVuc2lnbmVkIGxvbmcpKHN1ZmZpeCkpIDw8IDE2KSBcCisJCQkJCSArICh1bnNpZ25lZCBsb25nKShwcmVmaXgpKQorCisjZGVmaW5lIENIRUNLX0dBUAkxMDAwMAkJLyogUmF0aW8gY2hlY2sgaW50ZXJ2YWwgKi8KKworI2RlZmluZSBSQVRJT19TQ0FMRV9MT0cJOAorI2RlZmluZSBSQVRJT19TQ0FMRQkoMTw8UkFUSU9fU0NBTEVfTE9HKQorI2RlZmluZSBSQVRJT19NQVgJKDB4N2ZmZmZmZmY+PlJBVElPX1NDQUxFX0xPRykKKworLyoKKyAqIGNsZWFyIHRoZSBkaWN0aW9uYXJ5CisgKi8KKworc3RhdGljIHZvaWQKK2JzZF9jbGVhcihzdHJ1Y3QgYnNkX2RiICpkYikKK3sKKyAgICBkYi0+Y2xlYXJfY291bnQrKzsKKyAgICBkYi0+bWF4X2VudCAgICAgID0gRklSU1QtMTsKKyAgICBkYi0+bl9iaXRzICAgICAgID0gQlNEX0lOSVRfQklUUzsKKyAgICBkYi0+Ynl0ZXNfb3V0ICAgID0gMDsKKyAgICBkYi0+aW5fY291bnQgICAgID0gMDsKKyAgICBkYi0+cmF0aW8JICAgICA9IDA7CisgICAgZGItPmNoZWNrcG9pbnQgICA9IENIRUNLX0dBUDsKK30KKworLyoKKyAqIElmIHRoZSBkaWN0aW9uYXJ5IGlzIGZ1bGwsIHRoZW4gc2VlIGlmIGl0IGlzIHRpbWUgdG8gcmVzZXQgaXQuCisgKgorICogQ29tcHV0ZSB0aGUgY29tcHJlc3Npb24gcmF0aW8gdXNpbmcgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYworICogd2l0aCA4IGZyYWN0aW9uYWwgYml0cy4KKyAqCisgKiBTaW5jZSB3ZSBoYXZlIGFuIGluZmluaXRlIHN0cmVhbSBpbnN0ZWFkIG9mIGEgc2luZ2xlIGZpbGUsCisgKiB3YXRjaCBvbmx5IHRoZSBsb2NhbCBjb21wcmVzc2lvbiByYXRpby4KKyAqCisgKiBTaW5jZSBib3RoIHBlZXJzIG11c3QgcmVzZXQgdGhlIGRpY3Rpb25hcnkgYXQgdGhlIHNhbWUgdGltZSBldmVuIGluCisgKiB0aGUgYWJzZW5jZSBvZiBDTEVBUiBjb2RlcyAod2hpbGUgcGFja2V0cyBhcmUgaW5jb21wcmVzc2libGUpLCB0aGV5CisgKiBtdXN0IGNvbXB1dGUgdGhlIHNhbWUgcmF0aW8uCisgKi8KKworc3RhdGljIGludCBic2RfY2hlY2sgKHN0cnVjdCBic2RfZGIgKmRiKQkvKiAxPW91dHB1dCBDTEVBUiAqLworICB7CisgICAgdW5zaWduZWQgaW50IG5ld19yYXRpbzsKKworICAgIGlmIChkYi0+aW5fY291bnQgPj0gZGItPmNoZWNrcG9pbnQpCisgICAgICB7CisJLyogYWdlIHRoZSByYXRpbyBieSBsaW1pdGluZyB0aGUgc2l6ZSBvZiB0aGUgY291bnRzICovCisJaWYgKGRiLT5pbl9jb3VudCA+PSBSQVRJT19NQVggfHwgZGItPmJ5dGVzX291dCA+PSBSQVRJT19NQVgpCisJICB7CisJICAgIGRiLT5pbl9jb3VudCAgLT0gKGRiLT5pbl9jb3VudCAgPj4gMik7CisJICAgIGRiLT5ieXRlc19vdXQgLT0gKGRiLT5ieXRlc19vdXQgPj4gMik7CisJICB9CisJCisJZGItPmNoZWNrcG9pbnQgPSBkYi0+aW5fY291bnQgKyBDSEVDS19HQVA7CisJCisJaWYgKGRiLT5tYXhfZW50ID49IGRiLT5tYXhtYXhjb2RlKQorCSAgeworCSAgICAvKiBSZXNldCB0aGUgZGljdGlvbmFyeSBvbmx5IGlmIHRoZSByYXRpbyBpcyB3b3JzZSwKKwkgICAgICogb3IgaWYgaXQgbG9va3MgYXMgaWYgaXQgaGFzIGJlZW4gcG9pc29uZWQKKwkgICAgICogYnkgaW5jb21wcmVzc2libGUgZGF0YS4KKwkgICAgICoKKwkgICAgICogVGhpcyBkb2VzIG5vdCBvdmVyZmxvdywgYmVjYXVzZQorCSAgICAgKglkYi0+aW5fY291bnQgPD0gUkFUSU9fTUFYLgorCSAgICAgKi8KKworCSAgICBuZXdfcmF0aW8gPSBkYi0+aW5fY291bnQgPDwgUkFUSU9fU0NBTEVfTE9HOworCSAgICBpZiAoZGItPmJ5dGVzX291dCAhPSAwKQorCSAgICAgIHsKKwkJbmV3X3JhdGlvIC89IGRiLT5ieXRlc19vdXQ7CisJICAgICAgfQorCSAgICAKKwkgICAgaWYgKG5ld19yYXRpbyA8IGRiLT5yYXRpbyB8fCBuZXdfcmF0aW8gPCAxICogUkFUSU9fU0NBTEUpCisJICAgICAgeworCQlic2RfY2xlYXIgKGRiKTsKKwkJcmV0dXJuIDE7CisJICAgICAgfQorCSAgICBkYi0+cmF0aW8gPSBuZXdfcmF0aW87CisJICB9CisgICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworLyoKKyAqIFJldHVybiBzdGF0aXN0aWNzLgorICovCisKK3N0YXRpYyB2b2lkIGJzZF9jb21wX3N0YXRzICh2b2lkICpzdGF0ZSwgc3RydWN0IGNvbXBzdGF0ICpzdGF0cykKKyAgeworICAgIHN0cnVjdCBic2RfZGIgKmRiID0gKHN0cnVjdCBic2RfZGIgKikgc3RhdGU7CisgICAgCisgICAgc3RhdHMtPnVuY19ieXRlcyAgICA9IGRiLT51bmNvbXBfYnl0ZXM7CisgICAgc3RhdHMtPnVuY19wYWNrZXRzICA9IGRiLT51bmNvbXBfY291bnQ7CisgICAgc3RhdHMtPmNvbXBfYnl0ZXMgICA9IGRiLT5jb21wX2J5dGVzOworICAgIHN0YXRzLT5jb21wX3BhY2tldHMgPSBkYi0+Y29tcF9jb3VudDsKKyAgICBzdGF0cy0+aW5jX2J5dGVzICAgID0gZGItPmluY29tcF9ieXRlczsKKyAgICBzdGF0cy0+aW5jX3BhY2tldHMgID0gZGItPmluY29tcF9jb3VudDsKKyAgICBzdGF0cy0+aW5fY291bnQgICAgID0gZGItPmluX2NvdW50OworICAgIHN0YXRzLT5ieXRlc19vdXQgICAgPSBkYi0+Ynl0ZXNfb3V0OworICB9CisKKy8qCisgKiBSZXNldCBzdGF0ZSwgYXMgb24gYSBDQ1AgUmVzZXRSZXEuCisgKi8KKworc3RhdGljIHZvaWQgYnNkX3Jlc2V0ICh2b2lkICpzdGF0ZSkKKyAgeworICAgIHN0cnVjdCBic2RfZGIgKmRiID0gKHN0cnVjdCBic2RfZGIgKikgc3RhdGU7CisKKyAgICBic2RfY2xlYXIoZGIpOworCisgICAgZGItPnNlcW5vICAgICAgID0gMDsKKyAgICBkYi0+Y2xlYXJfY291bnQgPSAwOworICB9CisKKy8qCisgKiBSZWxlYXNlIHRoZSBjb21wcmVzc2lvbiBzdHJ1Y3R1cmUKKyAqLworCitzdGF0aWMgdm9pZCBic2RfZnJlZSAodm9pZCAqc3RhdGUpCisgIHsKKyAgICBzdHJ1Y3QgYnNkX2RiICpkYiA9IChzdHJ1Y3QgYnNkX2RiICopIHN0YXRlOworICAgIAorICAgIGlmIChkYikKKyAgICAgIHsKKy8qCisgKiBSZWxlYXNlIHRoZSBkaWN0aW9uYXJ5CisgKi8KKwlpZiAoZGItPmRpY3QpCisJICB7CisJICAgIHZmcmVlIChkYi0+ZGljdCk7CisJICAgIGRiLT5kaWN0ID0gTlVMTDsKKwkgIH0KKy8qCisgKiBSZWxlYXNlIHRoZSBzdHJpbmcgYnVmZmVyCisgKi8KKwlpZiAoZGItPmxlbnMpCisJICB7CisJICAgIHZmcmVlIChkYi0+bGVucyk7CisJICAgIGRiLT5sZW5zID0gTlVMTDsKKwkgIH0KKy8qCisgKiBGaW5hbGx5IHJlbGVhc2UgdGhlIHN0cnVjdHVyZSBpdHNlbGYuCisgKi8KKwlrZnJlZSAoZGIpOworICAgICAgfQorICB9CisKKy8qCisgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSAoZGUpIGNvbXByZXNzb3IuCisgKi8KKworc3RhdGljIHZvaWQgKmJzZF9hbGxvYyAodW5zaWduZWQgY2hhciAqb3B0aW9ucywgaW50IG9wdF9sZW4sIGludCBkZWNvbXApCisgIHsKKyAgICBpbnQgYml0czsKKyAgICB1bnNpZ25lZCBpbnQgaHNpemUsIGhzaGlmdCwgbWF4bWF4Y29kZTsKKyAgICBzdHJ1Y3QgYnNkX2RiICpkYjsKKworICAgIGlmIChvcHRfbGVuICE9IDMgfHwgb3B0aW9uc1swXSAhPSBDSV9CU0RfQ09NUFJFU1MgfHwgb3B0aW9uc1sxXSAhPSAzCisJfHwgQlNEX1ZFUlNJT04ob3B0aW9uc1syXSkgIT0gQlNEX0NVUlJFTlRfVkVSU0lPTikKKyAgICAgIHsKKwlyZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgIGJpdHMgPSBCU0RfTkJJVFMob3B0aW9uc1syXSk7CisKKyAgICBzd2l0Y2ggKGJpdHMpCisgICAgICB7CisgICAgY2FzZSA5OgkJCS8qIG5lZWRzIDgyMTUyIGZvciBib3RoIGRpcmVjdGlvbnMgKi8KKyAgICBjYXNlIDEwOgkJCS8qIG5lZWRzIDg0MTQ0ICovCisgICAgY2FzZSAxMToJCQkvKiBuZWVkcyA4ODI0MCAqLworICAgIGNhc2UgMTI6CQkJLyogbmVlZHMgOTY0MzIgKi8KKwloc2l6ZSA9IDUwMDM7CisJaHNoaWZ0ID0gNDsKKwlicmVhazsKKyAgICBjYXNlIDEzOgkJCS8qIG5lZWRzIDE3Njc4NCAqLworCWhzaXplID0gOTAwMTsKKwloc2hpZnQgPSA1OworCWJyZWFrOworICAgIGNhc2UgMTQ6CQkJLyogbmVlZHMgMzUzNzQ0ICovCisJaHNpemUgPSAxODAxMzsKKwloc2hpZnQgPSA2OworCWJyZWFrOworICAgIGNhc2UgMTU6CQkJLyogbmVlZHMgNjkxNDQwICovCisJaHNpemUgPSAzNTAyMzsKKwloc2hpZnQgPSA3OworCWJyZWFrOworICAgIGNhc2UgMTY6CQkJLyogbmVlZHMgMTM2NjE2MC0tZmFyIHRvbyBtdWNoLCAqLworCS8qIGhzaXplID0gNjkwMDE7ICovCS8qIGFuZCA2OTAwMSBpcyB0b28gYmlnIGZvciBjcHRyICovCisJLyogaHNoaWZ0ID0gODsgKi8JLyogaW4gc3RydWN0IGJzZF9kYiAqLworCS8qIGJyZWFrOyAqLworICAgIGRlZmF1bHQ6CisJcmV0dXJuIE5VTEw7CisgICAgICB9CisvKgorICogQWxsb2NhdGUgdGhlIG1haW4gY29udHJvbCBzdHJ1Y3R1cmUgZm9yIHRoaXMgaW5zdGFuY2UuCisgKi8KKyAgICBtYXhtYXhjb2RlID0gTUFYQ09ERShiaXRzKTsKKyAgICBkYiAgICAgICAgID0gKHN0cnVjdCBic2RfZGIgKikga21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYnNkX2RiKSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworICAgIGlmICghZGIpCisgICAgICB7CisJcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICBtZW1zZXQgKGRiLCAwLCBzaXplb2Yoc3RydWN0IGJzZF9kYikpOworLyoKKyAqIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZGljdGlvbmFyeS4gVGhpcyBtYXkgYmUgbW9yZSB0aGFuIG9uZSBwYWdlIGluCisgKiBsZW5ndGguCisgKi8KKyAgICBkYi0+ZGljdCA9IChzdHJ1Y3QgYnNkX2RpY3QgKikgdm1hbGxvYyAoaHNpemUgKgorCQkJCQkgICAgc2l6ZW9mIChzdHJ1Y3QgYnNkX2RpY3QpKTsKKyAgICBpZiAoIWRiLT5kaWN0KQorICAgICAgeworCWJzZF9mcmVlIChkYik7CisJcmV0dXJuIE5VTEw7CisgICAgICB9CisKKy8qCisgKiBJZiB0aGlzIGlzIHRoZSBjb21wcmVzc2lvbiBidWZmZXIgdGhlbiB0aGVyZSBpcyBubyBsZW5ndGggZGF0YS4KKyAqLworICAgIGlmICghZGVjb21wKQorICAgICAgeworCWRiLT5sZW5zID0gTlVMTDsKKyAgICAgIH0KKy8qCisgKiBGb3IgZGVjb21wcmVzc2lvbiwgdGhlIGxlbmd0aCBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgYXMgd2VsbC4KKyAqLworICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZGItPmxlbnMgPSAodW5zaWduZWQgc2hvcnQgKikgdm1hbGxvYyAoKG1heG1heGNvZGUgKyAxKSAqCisJCQkJCSAgICAgICBzaXplb2YgKGRiLT5sZW5zWzBdKSk7CisJaWYgKCFkYi0+bGVucykKKwkgIHsKKwkgICAgYnNkX2ZyZWUgKGRiKTsKKwkgICAgcmV0dXJuIChOVUxMKTsKKwkgIH0KKyAgICAgIH0KKy8qCisgKiBJbml0aWFsaXplIHRoZSBkYXRhIGluZm9ybWF0aW9uIGZvciB0aGUgY29tcHJlc3Npb24gY29kZQorICovCisgICAgZGItPnRvdGxlbiAgICAgPSBzaXplb2YgKHN0cnVjdCBic2RfZGIpICAgKworICAgICAgCQkgICAgKHNpemVvZiAoc3RydWN0IGJzZF9kaWN0KSAqIGhzaXplKTsKKworICAgIGRiLT5oc2l6ZSAgICAgID0gaHNpemU7CisgICAgZGItPmhzaGlmdCAgICAgPSBoc2hpZnQ7CisgICAgZGItPm1heG1heGNvZGUgPSBtYXhtYXhjb2RlOworICAgIGRiLT5tYXhiaXRzICAgID0gYml0czsKKworICAgIHJldHVybiAodm9pZCAqKSBkYjsKKyAgfQorCitzdGF0aWMgdm9pZCAqYnNkX2NvbXBfYWxsb2MgKHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsIGludCBvcHRfbGVuKQorICB7CisgICAgcmV0dXJuIGJzZF9hbGxvYyAob3B0aW9ucywgb3B0X2xlbiwgMCk7CisgIH0KKworc3RhdGljIHZvaWQgKmJzZF9kZWNvbXBfYWxsb2MgKHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsIGludCBvcHRfbGVuKQorICB7CisgICAgcmV0dXJuIGJzZF9hbGxvYyAob3B0aW9ucywgb3B0X2xlbiwgMSk7CisgIH0KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGRhdGFiYXNlLgorICovCisKK3N0YXRpYyBpbnQgYnNkX2luaXQgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICpvcHRpb25zLAorCQkgICAgIGludCBvcHRfbGVuLCBpbnQgdW5pdCwgaW50IGRlYnVnLCBpbnQgZGVjb21wKQorICB7CisgICAgc3RydWN0IGJzZF9kYiAqZGIgPSBzdGF0ZTsKKyAgICBpbnQgaW5keDsKKyAgICAKKyAgICBpZiAoKG9wdF9sZW4gIT0gMykgfHwgKG9wdGlvbnNbMF0gIT0gQ0lfQlNEX0NPTVBSRVNTKSB8fCAob3B0aW9uc1sxXSAhPSAzKQorCXx8IChCU0RfVkVSU0lPTihvcHRpb25zWzJdKSAhPSBCU0RfQ1VSUkVOVF9WRVJTSU9OKQorCXx8IChCU0RfTkJJVFMob3B0aW9uc1syXSkgIT0gZGItPm1heGJpdHMpCisJfHwgKGRlY29tcCAmJiBkYi0+bGVucyA9PSBOVUxMKSkKKyAgICAgIHsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICAgIGlmIChkZWNvbXApCisgICAgICB7CisJaW5keCA9IExBU1Q7CisJZG8KKwkgIHsKKwkgICAgZGItPmxlbnNbaW5keF0gPSAxOworCSAgfQorCXdoaWxlIChpbmR4LS0gPiAwKTsKKyAgICAgIH0KKworICAgIGluZHggPSBkYi0+aHNpemU7CisgICAgd2hpbGUgKGluZHgtLSAhPSAwKQorICAgICAgeworCWRiLT5kaWN0W2luZHhdLmNvZGVtMSA9IEJBRENPREVNMTsKKwlkYi0+ZGljdFtpbmR4XS5jcHRyICAgPSAwOworICAgICAgfQorCisgICAgZGItPnVuaXQgPSB1bml0OworICAgIGRiLT5tcnUgID0gMDsKKyNpZm5kZWYgREVCVUcKKyAgICBpZiAoZGVidWcpCisjZW5kaWYKKyAgICAgIGRiLT5kZWJ1ZyA9IDE7CisgICAgCisgICAgYnNkX3Jlc2V0KGRiKTsKKyAgICAKKyAgICByZXR1cm4gMTsKKyAgfQorCitzdGF0aWMgaW50IGJzZF9jb21wX2luaXQgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICpvcHRpb25zLAorCQkJICBpbnQgb3B0X2xlbiwgaW50IHVuaXQsIGludCBvcHRoZHIsIGludCBkZWJ1ZykKKyAgeworICAgIHJldHVybiBic2RfaW5pdCAoc3RhdGUsIG9wdGlvbnMsIG9wdF9sZW4sIHVuaXQsIGRlYnVnLCAwKTsKKyAgfQorCitzdGF0aWMgaW50IGJzZF9kZWNvbXBfaW5pdCAodm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsCisJCQkgICAgaW50IG9wdF9sZW4sIGludCB1bml0LCBpbnQgb3B0aGRyLCBpbnQgbXJ1LAorCQkJICAgIGludCBkZWJ1ZykKKyAgeworICAgIHJldHVybiBic2RfaW5pdCAoc3RhdGUsIG9wdGlvbnMsIG9wdF9sZW4sIHVuaXQsIGRlYnVnLCAxKTsKKyAgfQorCisvKgorICogT2J0YWluIHBvaW50ZXJzIHRvIHRoZSB2YXJpb3VzIHN0cnVjdHVyZXMgaW4gdGhlIGNvbXByZXNzaW9uIHRhYmxlcworICovCisKKyNkZWZpbmUgZGljdF9wdHJ4KHAsaWR4KSAmKHAtPmRpY3RbaWR4XSkKKyNkZWZpbmUgbGVuc19wdHJ4KHAsaWR4KSAmKHAtPmxlbnNbaWR4XSkKKworI2lmZGVmIERFQlVHCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmxlbnNfcHRyKHN0cnVjdCBic2RfZGIgKmRiLCBpbnQgaWR4KQorICB7CisgICAgaWYgKCh1bnNpZ25lZCBpbnQpIGlkeCA+ICh1bnNpZ25lZCBpbnQpIGRiLT5tYXhtYXhjb2RlKQorICAgICAgeworCXByaW50ayAoIjw5PnBwcDogbGVuc19wdHIoJWQpID4gbWF4XG4iLCBpZHgpOworCWlkeCA9IDA7CisgICAgICB9CisgICAgcmV0dXJuIGxlbnNfcHRyeCAoZGIsIGlkeCk7CisgIH0KKworc3RhdGljIHN0cnVjdCBic2RfZGljdCAqZGljdF9wdHIoc3RydWN0IGJzZF9kYiAqZGIsIGludCBpZHgpCisgIHsKKyAgICBpZiAoKHVuc2lnbmVkIGludCkgaWR4ID49ICh1bnNpZ25lZCBpbnQpIGRiLT5oc2l6ZSkKKyAgICAgIHsKKwlwcmludGsgKCI8OT5wcHA6IGRpY3RfcHRyKCVkKSA+IG1heFxuIiwgaWR4KTsKKwlpZHggPSAwOworICAgICAgfQorICAgIHJldHVybiBkaWN0X3B0cnggKGRiLCBpZHgpOworICB9CisKKyNlbHNlCisjZGVmaW5lIGxlbnNfcHRyKGRiLGlkeCkgbGVuc19wdHJ4KGRiLGlkeCkKKyNkZWZpbmUgZGljdF9wdHIoZGIsaWR4KSBkaWN0X3B0cngoZGIsaWR4KQorI2VuZGlmCisKKy8qCisgKiBjb21wcmVzcyBhIHBhY2tldAorICoKKyAqCVRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBpcyB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZAorICoJcGFja2V0LiBBIHplcm8gaXMgcmV0dXJuZWQgaWYgdGhlIHBhY2tldCB3YXMgbm90IGNvbXByZXNzZWQKKyAqCWZvciBzb21lIHJlYXNvbiwgc3VjaCBhcyB0aGUgc2l6ZSBiZWluZyBsYXJnZXIgdGhhbiB1bmNvbXByZXNzZWQuCisgKgorICoJT25lIGNoYW5nZSBmcm9tIHRoZSBCU0QgY29tcHJlc3MgY29tbWFuZCBpcyB0aGF0IHdoZW4gdGhlCisgKgljb2RlIHNpemUgZXhwYW5kcywgd2UgZG8gbm90IG91dHB1dCBhIGJ1bmNoIG9mIHBhZGRpbmcuCisgKi8KKworc3RhdGljIGludCBic2RfY29tcHJlc3MgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICpycHRyLCB1bnNpZ25lZCBjaGFyICpvYnVmLAorCQkJIGludCBpc2l6ZSwgaW50IG9zaXplKQorICB7CisgICAgc3RydWN0IGJzZF9kYiAqZGI7CisgICAgaW50IGhzaGlmdDsKKyAgICB1bnNpZ25lZCBpbnQgbWF4X2VudDsKKyAgICB1bnNpZ25lZCBpbnQgbl9iaXRzOworICAgIHVuc2lnbmVkIGludCBiaXRubzsKKyAgICB1bnNpZ25lZCBsb25nIGFjY207CisgICAgaW50IGVudDsKKyAgICB1bnNpZ25lZCBsb25nIGZjb2RlOworICAgIHN0cnVjdCBic2RfZGljdCAqZGljdHA7CisgICAgdW5zaWduZWQgY2hhciBjOworICAgIGludCBodmFsOworICAgIGludCBkaXNwOworICAgIGludCBpbGVuOworICAgIGludCBteGNvZGU7CisgICAgdW5zaWduZWQgY2hhciAqd3B0cjsKKyAgICBpbnQgb2xlbjsKKworI2RlZmluZSBQVVRCWVRFKHYpCQkJXAorICB7CQkJCQlcCisgICAgKytvbGVuOwkJCQlcCisgICAgaWYgKHdwdHIpCQkJCVwKKyAgICAgIHsJCQkJCVwKKwkqd3B0cisrID0gKHVuc2lnbmVkIGNoYXIpICh2KTsJXAorCWlmIChvbGVuID49IG9zaXplKQkJXAorCSAgewkJCQlcCisJICAgIHdwdHIgPSBOVUxMOwkJXAorCSAgfQkJCQlcCisgICAgICB9CQkJCQlcCisgIH0KKworI2RlZmluZSBPVVRQVVQoZW50KQkJCVwKKyAgewkJCQkJXAorICAgIGJpdG5vIC09IG5fYml0czsJCQlcCisgICAgYWNjbSB8PSAoKGVudCkgPDwgYml0bm8pOwkJXAorICAgIGRvCQkJCQlcCisgICAgICB7CQkJCQlcCisJUFVUQllURShhY2NtID4+IDI0KTsJCVwKKwlhY2NtIDw8PSA4OwkJCVwKKwliaXRubyArPSA4OwkJCVwKKyAgICAgIH0JCQkJCVwKKyAgICB3aGlsZSAoYml0bm8gPD0gMjQpOwkJXAorICB9CisKKyAgLyoKKyAgICogSWYgdGhlIHByb3RvY29sIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugd2UncmUgaW50ZXJlc3RlZCBpbiwKKyAgICoganVzdCByZXR1cm4gd2l0aG91dCBjb21wcmVzc2luZyB0aGUgcGFja2V0LiAgSWYgaXQgaXMsCisgICAqIHRoZSBwcm90b2NvbCBiZWNvbWVzIHRoZSBmaXJzdCBieXRlIHRvIGNvbXByZXNzLgorICAgKi8KKworICAgIGVudCA9IFBQUF9QUk9UT0NPTChycHRyKTsKKyAgICBpZiAoZW50IDwgMHgyMSB8fCBlbnQgPiAweGY5KQorICAgICAgeworCXJldHVybiAwOworICAgICAgfQorCisgICAgZGIgICAgICA9IChzdHJ1Y3QgYnNkX2RiICopIHN0YXRlOworICAgIGhzaGlmdCAgPSBkYi0+aHNoaWZ0OworICAgIG1heF9lbnQgPSBkYi0+bWF4X2VudDsKKyAgICBuX2JpdHMgID0gZGItPm5fYml0czsKKyAgICBiaXRubyAgID0gMzI7CisgICAgYWNjbSAgICA9IDA7CisgICAgbXhjb2RlICA9IE1BWENPREUgKG5fYml0cyk7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBvdXRwdXQgcG9pbnRlcnMgKi8KKyAgICB3cHRyICA9IG9idWY7CisgICAgb2xlbiAgPSBQUFBfSERSTEVOICsgQlNEX09WSEQ7CisKKyAgICBpZiAob3NpemUgPiBpc2l6ZSkKKyAgICAgIHsKKwlvc2l6ZSA9IGlzaXplOworICAgICAgfQorCisgICAgLyogVGhpcyBpcyB0aGUgUFBQIGhlYWRlciBpbmZvcm1hdGlvbiAqLworICAgIGlmICh3cHRyKQorICAgICAgeworCSp3cHRyKysgPSBQUFBfQUREUkVTUyhycHRyKTsKKwkqd3B0cisrID0gUFBQX0NPTlRST0wocnB0cik7CisJKndwdHIrKyA9IDA7CisJKndwdHIrKyA9IFBQUF9DT01QOworCSp3cHRyKysgPSBkYi0+c2Vxbm8gPj4gODsKKwkqd3B0cisrID0gZGItPnNlcW5vOworICAgICAgfQorCisgICAgLyogU2tpcCB0aGUgaW5wdXQgaGVhZGVyICovCisgICAgcnB0ciAgKz0gUFBQX0hEUkxFTjsKKyAgICBpc2l6ZSAtPSBQUFBfSERSTEVOOworICAgIGlsZW4gICA9ICsraXNpemU7CS8qIExvdyBieXRlIG9mIHByb3RvY29sIGlzIGNvdW50ZWQgYXMgaW5wdXQgKi8KKworICAgIHdoaWxlICgtLWlsZW4gPiAwKQorICAgICAgeworCWMgICAgID0gKnJwdHIrKzsKKwlmY29kZSA9IEJTRF9LRVkgIChlbnQsIGMpOworCWh2YWwgID0gQlNEX0hBU0ggKGVudCwgYywgaHNoaWZ0KTsKKwlkaWN0cCA9IGRpY3RfcHRyIChkYiwgaHZhbCk7CisJCisJLyogVmFsaWRhdGUgYW5kIHRoZW4gY2hlY2sgdGhlIGVudHJ5LiAqLworCWlmIChkaWN0cC0+Y29kZW0xID49IG1heF9lbnQpCisJICB7CisJICAgIGdvdG8gbm9tYXRjaDsKKwkgIH0KKworCWlmIChkaWN0cC0+Zi5mY29kZSA9PSBmY29kZSkKKwkgIHsKKwkgICAgZW50ID0gZGljdHAtPmNvZGVtMSArIDE7CisJICAgIGNvbnRpbnVlOwkvKiBmb3VuZCAocHJlZml4LHN1ZmZpeCkgKi8KKwkgIH0KKwkKKwkvKiBjb250aW51ZSBwcm9iaW5nIHVudGlsIGEgbWF0Y2ggb3IgaW52YWxpZCBlbnRyeSAqLworCWRpc3AgPSAoaHZhbCA9PSAwKSA/IDEgOiBodmFsOworCisJZG8KKwkgIHsKKwkgICAgaHZhbCArPSBkaXNwOworCSAgICBpZiAoaHZhbCA+PSBkYi0+aHNpemUpCisJICAgICAgeworCQlodmFsIC09IGRiLT5oc2l6ZTsKKwkgICAgICB9CisJICAgIGRpY3RwID0gZGljdF9wdHIgKGRiLCBodmFsKTsKKwkgICAgaWYgKGRpY3RwLT5jb2RlbTEgPj0gbWF4X2VudCkKKwkgICAgICB7CisJCWdvdG8gbm9tYXRjaDsKKwkgICAgICB9CisJICB9CisJd2hpbGUgKGRpY3RwLT5mLmZjb2RlICE9IGZjb2RlKTsKKworCWVudCA9IGRpY3RwLT5jb2RlbTEgKyAxOwkvKiBmaW5hbGx5IGZvdW5kIChwcmVmaXgsc3VmZml4KSAqLworCWNvbnRpbnVlOworCQorbm9tYXRjaDoKKwlPVVRQVVQoZW50KTsJCS8qIG91dHB1dCB0aGUgcHJlZml4ICovCisJCisJLyogY29kZSAtPiBoYXNodGFibGUgKi8KKwlpZiAobWF4X2VudCA8IGRiLT5tYXhtYXhjb2RlKQorCSAgeworCSAgICBzdHJ1Y3QgYnNkX2RpY3QgKmRpY3RwMjsKKwkgICAgc3RydWN0IGJzZF9kaWN0ICpkaWN0cDM7CisJICAgIGludCAgICBpbmR4OworCisJICAgIC8qIGV4cGFuZCBjb2RlIHNpemUgaWYgbmVlZGVkICovCisJICAgIGlmIChtYXhfZW50ID49IG14Y29kZSkKKwkgICAgICB7CisJCWRiLT5uX2JpdHMgPSArK25fYml0czsKKwkJbXhjb2RlICAgICA9IE1BWENPREUgKG5fYml0cyk7CisJICAgICAgfQorCSAgICAKKwkgICAgLyogSW52YWxpZGF0ZSBvbGQgaGFzaCB0YWJsZSBlbnRyeSB1c2luZworCSAgICAgKiB0aGlzIGNvZGUsIGFuZCB0aGVuIHRha2UgaXQgb3Zlci4KKwkgICAgICovCisKKwkgICAgZGljdHAyID0gZGljdF9wdHIgKGRiLCBtYXhfZW50ICsgMSk7CisJICAgIGluZHggICA9IGRpY3RwMi0+Y3B0cjsKKwkgICAgZGljdHAzID0gZGljdF9wdHIgKGRiLCBpbmR4KTsKKworCSAgICBpZiAoZGljdHAzLT5jb2RlbTEgPT0gbWF4X2VudCkKKwkgICAgICB7CisJCWRpY3RwMy0+Y29kZW0xID0gQkFEQ09ERU0xOworCSAgICAgIH0KKworCSAgICBkaWN0cDItPmNwdHIgICA9IGh2YWw7CisJICAgIGRpY3RwLT5jb2RlbTEgID0gbWF4X2VudDsKKwkgICAgZGljdHAtPmYuZmNvZGUgPSBmY29kZTsKKwkgICAgZGItPm1heF9lbnQgICAgPSArK21heF9lbnQ7CisKKwkgICAgaWYgKGRiLT5sZW5zKQorCSAgICAgIHsKKwkJdW5zaWduZWQgc2hvcnQgKmxlbjEgPSBsZW5zX3B0ciAoZGIsIG1heF9lbnQpOworCQl1bnNpZ25lZCBzaG9ydCAqbGVuMiA9IGxlbnNfcHRyIChkYiwgZW50KTsKKwkJKmxlbjEgPSAqbGVuMiArIDE7CisJICAgICAgfQorCSAgfQorCWVudCA9IGM7CisgICAgICB9CisgICAgCisgICAgT1VUUFVUKGVudCk7CQkvKiBvdXRwdXQgdGhlIGxhc3QgY29kZSAqLworCisgICAgZGItPmJ5dGVzX291dCAgICArPSBvbGVuIC0gUFBQX0hEUkxFTiAtIEJTRF9PVkhEOworICAgIGRiLT51bmNvbXBfYnl0ZXMgKz0gaXNpemU7CisgICAgZGItPmluX2NvdW50ICAgICArPSBpc2l6ZTsKKyAgICArK2RiLT51bmNvbXBfY291bnQ7CisgICAgKytkYi0+c2Vxbm87CisKKyAgICBpZiAoYml0bm8gPCAzMikKKyAgICAgIHsKKwkrK2RiLT5ieXRlc19vdXQ7IC8qIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIGJzZF9jaGVjayAqLworICAgICAgfQorCisgICAgLyoKKyAgICAgKiBHZW5lcmF0ZSB0aGUgY2xlYXIgY29tbWFuZCBpZiBuZWVkZWQKKyAgICAgKi8KKworICAgIGlmIChic2RfY2hlY2soZGIpKQorICAgICAgeworCU9VVFBVVCAoQ0xFQVIpOworICAgICAgfQorICAgIAorICAgIC8qCisgICAgICogUGFkIGRyaWJibGUgYml0cyBvZiBsYXN0IGNvZGUgd2l0aCBvbmVzLgorICAgICAqIERvIG5vdCBlbWl0IGEgY29tcGxldGVseSB1c2VsZXNzIGJ5dGUgb2Ygb25lcy4KKyAgICAgKi8KKworICAgIGlmIChiaXRubyAhPSAzMikKKyAgICAgIHsKKwlQVVRCWVRFKChhY2NtIHwgKDB4ZmYgPDwgKGJpdG5vLTgpKSkgPj4gMjQpOworICAgICAgfQorICAgIAorICAgIC8qCisgICAgICogSW5jcmVhc2UgY29kZSBzaXplIGlmIHdlIHdvdWxkIGhhdmUgd2l0aG91dCB0aGUgcGFja2V0CisgICAgICogYm91bmRhcnkgYmVjYXVzZSB0aGUgZGVjb21wcmVzc29yIHdpbGwgZG8gc28uCisgICAgICovCisKKyAgICBpZiAobWF4X2VudCA+PSBteGNvZGUgJiYgbWF4X2VudCA8IGRiLT5tYXhtYXhjb2RlKQorICAgICAgeworCWRiLT5uX2JpdHMrKzsKKyAgICAgIH0KKworICAgIC8qIElmIG91dHB1dCBsZW5ndGggaXMgdG9vIGxhcmdlIHRoZW4gdGhpcyBpcyBhbiBpbmNvbXBsZXRlIGZyYW1lLiAqLworICAgIGlmICh3cHRyID09IE5VTEwpCisgICAgICB7CisJKytkYi0+aW5jb21wX2NvdW50OworCWRiLT5pbmNvbXBfYnl0ZXMgKz0gaXNpemU7CisJb2xlbiAgICAgICAgICAgICAgPSAwOworICAgICAgfQorICAgIGVsc2UgLyogQ291bnQgdGhlIG51bWJlciBvZiBjb21wcmVzc2VkIGZyYW1lcyAqLworICAgICAgeworCSsrZGItPmNvbXBfY291bnQ7CisJZGItPmNvbXBfYnl0ZXMgKz0gb2xlbjsKKyAgICAgIH0KKworICAgIC8qIFJldHVybiB0aGUgcmVzdWx0aW5nIG91dHB1dCBsZW5ndGggKi8KKyAgICByZXR1cm4gb2xlbjsKKyN1bmRlZiBPVVRQVVQKKyN1bmRlZiBQVVRCWVRFCisgIH0KKworLyoKKyAqIFVwZGF0ZSB0aGUgIkJTRCBDb21wcmVzcyIgZGljdGlvbmFyeSBvbiB0aGUgcmVjZWl2ZXIgZm9yCisgKiBpbmNvbXByZXNzaWJsZSBkYXRhIGJ5IHByZXRlbmRpbmcgdG8gY29tcHJlc3MgdGhlIGluY29taW5nIGRhdGEuCisgKi8KKworc3RhdGljIHZvaWQgYnNkX2luY29tcCAodm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgKmlidWYsIGludCBpY250KQorICB7CisgICAgKHZvaWQpIGJzZF9jb21wcmVzcyAoc3RhdGUsIGlidWYsIChjaGFyICopIDAsIGljbnQsIDApOworICB9CisKKy8qCisgKiBEZWNvbXByZXNzICJCU0QgQ29tcHJlc3MiLgorICoKKyAqIEJlY2F1c2Ugb2YgcGF0ZW50IHByb2JsZW1zLCB3ZSByZXR1cm4gREVDT01QX0VSUk9SIGZvciBlcnJvcnMKKyAqIGZvdW5kIGJ5IGluc3BlY3RpbmcgdGhlIGlucHV0IGRhdGEgYW5kIGZvciBzeXN0ZW0gcHJvYmxlbXMsIGJ1dAorICogREVDT01QX0ZBVEFMRVJST1IgZm9yIGFueSBlcnJvcnMgd2hpY2ggY291bGQgcG9zc2libHkgYmUgc2FpZCB0bworICogYmUgYmVpbmcgZGV0ZWN0ZWQgImFmdGVyIiBkZWNvbXByZXNzaW9uLiAgRm9yIERFQ09NUF9FUlJPUiwKKyAqIHdlIGNhbiBpc3N1ZSBhIENDUCByZXNldC1yZXF1ZXN0OyBmb3IgREVDT01QX0ZBVEFMRVJST1IsIHdlIG1heSBiZQorICogaW5mcmluZ2luZyBhIHBhdGVudCBvZiBNb3Rvcm9sYSdzIGlmIHdlIGRvLCBzbyB3ZSB0YWtlIENDUCBkb3duCisgKiBpbnN0ZWFkLgorICoKKyAqIEdpdmVuIHRoYXQgdGhlIGZyYW1lIGhhcyB0aGUgY29ycmVjdCBzZXF1ZW5jZSBudW1iZXIgYW5kIGEgZ29vZCBGQ1MsCisgKiBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIGNvZGVzIGluIHRoZSBpbnB1dCBtb3N0IGxpa2VseSBpbmRpY2F0ZSBhCisgKiBidWcsIHNvIHdlIHJldHVybiBERUNPTVBfRkFUQUxFUlJPUiBmb3IgdGhlbSBpbiBvcmRlciB0byB0dXJuIG9mZgorICogY29tcHJlc3Npb24sIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIGRldGVjdGVkIGJ5IGluc3BlY3RpbmcgdGhlIGlucHV0LgorICovCisKK3N0YXRpYyBpbnQgYnNkX2RlY29tcHJlc3MgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICppYnVmLCBpbnQgaXNpemUsCisJCQkgICB1bnNpZ25lZCBjaGFyICpvYnVmLCBpbnQgb3NpemUpCisgIHsKKyAgICBzdHJ1Y3QgYnNkX2RiICpkYjsKKyAgICB1bnNpZ25lZCBpbnQgbWF4X2VudDsKKyAgICB1bnNpZ25lZCBsb25nIGFjY207CisgICAgdW5zaWduZWQgaW50IGJpdG5vOwkJLyogMXN0IHZhbGlkIGJpdCBpbiBhY2NtICovCisgICAgdW5zaWduZWQgaW50IG5fYml0czsKKyAgICB1bnNpZ25lZCBpbnQgdGd0Yml0bm87CS8qIGJpdG5vIHdoZW4gd2UgaGF2ZSBhIGNvZGUgKi8KKyAgICBzdHJ1Y3QgYnNkX2RpY3QgKmRpY3RwOworICAgIGludCBleHBsZW47CisgICAgaW50IHNlcTsKKyAgICB1bnNpZ25lZCBpbnQgaW5jb2RlOworICAgIHVuc2lnbmVkIGludCBvbGRjb2RlOworICAgIHVuc2lnbmVkIGludCBmaW5jaGFyOworICAgIHVuc2lnbmVkIGNoYXIgKnA7CisgICAgdW5zaWduZWQgY2hhciAqd3B0cjsKKyAgICBpbnQgYWRyczsKKyAgICBpbnQgY3RybDsKKyAgICBpbnQgaWxlbjsKKyAgICBpbnQgY29kZWxlbjsKKyAgICBpbnQgZXh0cmE7CisKKyAgICBkYiAgICAgICA9IChzdHJ1Y3QgYnNkX2RiICopIHN0YXRlOworICAgIG1heF9lbnQgID0gZGItPm1heF9lbnQ7CisgICAgYWNjbSAgICAgPSAwOworICAgIGJpdG5vICAgID0gMzI7CQkvKiAxc3QgdmFsaWQgYml0IGluIGFjY20gKi8KKyAgICBuX2JpdHMgICA9IGRiLT5uX2JpdHM7CisgICAgdGd0Yml0bm8gPSAzMiAtIG5fYml0czsJLyogYml0bm8gd2hlbiB3ZSBoYXZlIGEgY29kZSAqLworICAgIAorICAgIC8qCisgICAgICogU2F2ZSB0aGUgYWRkcmVzcy9jb250cm9sIGZyb20gdGhlIFBQUCBoZWFkZXIKKyAgICAgKiBhbmQgdGhlbiBnZXQgdGhlIHNlcXVlbmNlIG51bWJlci4KKyAgICAgKi8KKworICAgIGFkcnMgID0gUFBQX0FERFJFU1MgKGlidWYpOworICAgIGN0cmwgID0gUFBQX0NPTlRST0wgKGlidWYpOworCisgICAgc2VxICAgPSAoaWJ1Zls0XSA8PCA4KSArIGlidWZbNV07CisKKyAgICBpYnVmICs9IChQUFBfSERSTEVOICsgMik7CisgICAgaWxlbiAgPSBpc2l6ZSAtIChQUFBfSERSTEVOICsgMik7CisgICAgCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgc2VxdWVuY2UgbnVtYmVyIGFuZCBnaXZlIHVwIGlmIGl0IGRpZmZlcnMgZnJvbQorICAgICAqIHRoZSB2YWx1ZSB3ZSdyZSBleHBlY3RpbmcuCisgICAgICovCisKKyAgICBpZiAoc2VxICE9IGRiLT5zZXFubykKKyAgICAgIHsKKwlpZiAoZGItPmRlYnVnKQorCSAgeworCSAgICBwcmludGsoImJzZF9kZWNvbXAlZDogYmFkIHNlcXVlbmNlICMgJWQsIGV4cGVjdGVkICVkXG4iLAorCQkgICBkYi0+dW5pdCwgc2VxLCBkYi0+c2Vxbm8gLSAxKTsKKwkgIH0KKwlyZXR1cm4gREVDT01QX0VSUk9SOworICAgICAgfQorCisgICAgKytkYi0+c2Vxbm87CisgICAgZGItPmJ5dGVzX291dCArPSBpbGVuOworCisgICAgLyoKKyAgICAgKiBGaWxsIGluIHRoZSBwcHAgaGVhZGVyLCBidXQgbm90IHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHByb3RvY29sCisgICAgICogKHRoYXQgY29tZXMgZnJvbSB0aGUgZGVjb21wcmVzc2VkIGRhdGEpLgorICAgICAqLworCisgICAgd3B0ciAgICA9IG9idWY7CisgICAgKndwdHIrKyA9IGFkcnM7CisgICAgKndwdHIrKyA9IGN0cmw7CisgICAgKndwdHIrKyA9IDA7CisgICAgCisgICAgb2xkY29kZSA9IENMRUFSOworICAgIGV4cGxlbiAgPSAzOworCisgICAgLyoKKyAgICAgKiBLZWVwIHRoZSBjaGVja3BvaW50IGNvcnJlY3RseSBzbyB0aGF0IGluY29tcHJlc3NpYmxlIHBhY2tldHMKKyAgICAgKiBjbGVhciB0aGUgZGljdGlvbmFyeSBhdCB0aGUgcHJvcGVyIHRpbWVzLgorICAgICAqLworCisgICAgZm9yICg7OykKKyAgICAgIHsKKwlpZiAoaWxlbi0tIDw9IDApCisJICB7CisJICAgIGRiLT5pbl9jb3VudCArPSAoZXhwbGVuIC0gMyk7IC8qIGRvbid0IGNvdW50IHRoZSBoZWFkZXIgKi8KKwkgICAgYnJlYWs7CisJICB9CisKKwkvKgorCSAqIEFjY3VtdWxhdGUgYnl0ZXMgdW50aWwgd2UgaGF2ZSBhIGNvbXBsZXRlIGNvZGUuCisJICogVGhlbiBnZXQgdGhlIG5leHQgY29kZSwgcmVseWluZyBvbiB0aGUgMzItYml0LAorCSAqIHVuc2lnbmVkIGFjY20gdG8gbWFzayB0aGUgcmVzdWx0LgorCSAqLworCisJYml0bm8gLT0gODsKKwlhY2NtICB8PSAqaWJ1ZisrIDw8IGJpdG5vOworCWlmICh0Z3RiaXRubyA8IGJpdG5vKQorCSAgeworCSAgICBjb250aW51ZTsKKwkgIH0KKworCWluY29kZSA9IGFjY20gPj4gdGd0Yml0bm87CisJYWNjbSA8PD0gbl9iaXRzOworCWJpdG5vICs9IG5fYml0czsKKworCS8qCisJICogVGhlIGRpY3Rpb25hcnkgbXVzdCBvbmx5IGJlIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHBhY2tldC4KKwkgKi8KKwkKKwlpZiAoaW5jb2RlID09IENMRUFSKQorCSAgeworCSAgICBpZiAoaWxlbiA+IDApCisJICAgICAgeworCQlpZiAoZGItPmRlYnVnKQorCQkgIHsKKwkJICAgIHByaW50aygiYnNkX2RlY29tcCVkOiBiYWQgQ0xFQVJcbiIsIGRiLT51bml0KTsKKwkJICB9CisJCXJldHVybiBERUNPTVBfRkFUQUxFUlJPUjsJLyogcHJvYmFibHkgYSBidWcgKi8KKwkgICAgICB9CisJICAgIAorCSAgICBic2RfY2xlYXIoZGIpOworCSAgICBicmVhazsKKwkgIH0KKworCWlmICgoaW5jb2RlID4gbWF4X2VudCArIDIpIHx8IChpbmNvZGUgPiBkYi0+bWF4bWF4Y29kZSkKKwkgICAgfHwgKGluY29kZSA+IG1heF9lbnQgJiYgb2xkY29kZSA9PSBDTEVBUikpCisJICB7CisJICAgIGlmIChkYi0+ZGVidWcpCisJICAgICAgeworCQlwcmludGsoImJzZF9kZWNvbXAlZDogYmFkIGNvZGUgMHgleCBvbGRjb2RlPTB4JXggIiwKKwkJICAgICAgIGRiLT51bml0LCBpbmNvZGUsIG9sZGNvZGUpOworCQlwcmludGsoIm1heF9lbnQ9MHgleCBleHBsZW49JWQgc2Vxbm89JWRcbiIsCisJCSAgICAgICBtYXhfZW50LCBleHBsZW4sIGRiLT5zZXFubyk7CisJICAgICAgfQorCSAgICByZXR1cm4gREVDT01QX0ZBVEFMRVJST1I7CS8qIHByb2JhYmx5IGEgYnVnICovCisJICB9CisJCisJLyogU3BlY2lhbCBjYXNlIGZvciBLd0t3SyBzdHJpbmcuICovCisJaWYgKGluY29kZSA+IG1heF9lbnQpCisJICB7CisJICAgIGZpbmNoYXIgPSBvbGRjb2RlOworCSAgICBleHRyYSAgID0gMTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGZpbmNoYXIgPSBpbmNvZGU7CisJICAgIGV4dHJhICAgPSAwOworCSAgfQorCQorCWNvZGVsZW4gPSAqKGxlbnNfcHRyIChkYiwgZmluY2hhcikpOworCWV4cGxlbiArPSBjb2RlbGVuICsgZXh0cmE7CisJaWYgKGV4cGxlbiA+IG9zaXplKQorCSAgeworCSAgICBpZiAoZGItPmRlYnVnKQorCSAgICAgIHsKKwkJcHJpbnRrKCJic2RfZGVjb21wJWQ6IHJhbiBvdXQgb2YgbXJ1XG4iLCBkYi0+dW5pdCk7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCIgIGxlbj0lZCwgZmluY2hhcj0weCV4LCBjb2RlbGVuPSVkLCBleHBsZW49JWRcbiIsCisJCSAgICAgICBpbGVuLCBmaW5jaGFyLCBjb2RlbGVuLCBleHBsZW4pOworI2VuZGlmCisJICAgICAgfQorCSAgICByZXR1cm4gREVDT01QX0ZBVEFMRVJST1I7CisJICB9CisJCisJLyoKKwkgKiBEZWNvZGUgdGhpcyBjb2RlIGFuZCBpbnN0YWxsIGl0IGluIHRoZSBkZWNvbXByZXNzZWQgYnVmZmVyLgorCSAqLworCisJd3B0ciArPSBjb2RlbGVuOworCXAgICAgID0gd3B0cjsKKwl3aGlsZSAoZmluY2hhciA+IExBU1QpCisJICB7CisJICAgIHN0cnVjdCBic2RfZGljdCAqZGljdHAyID0gZGljdF9wdHIgKGRiLCBmaW5jaGFyKTsKKwkgICAgCisJICAgIGRpY3RwID0gZGljdF9wdHIgKGRiLCBkaWN0cDItPmNwdHIpOworI2lmZGVmIERFQlVHCisJICAgIGlmICgtLWNvZGVsZW4gPD0gMCB8fCBkaWN0cC0+Y29kZW0xICE9IGZpbmNoYXItMSkKKwkgICAgICB7CisJCWlmIChjb2RlbGVuIDw9IDApCisJCSAgeworCQkgICAgcHJpbnRrKCJic2RfZGVjb21wJWQ6IGZlbGwgb2ZmIGVuZCBvZiBjaGFpbiAiLCBkYi0+dW5pdCk7CisJCSAgICBwcmludGsoIjB4JXggYXQgMHgleCBieSAweCV4LCBtYXhfZW50PTB4JXhcbiIsCisJCQkgICBpbmNvZGUsIGZpbmNoYXIsIGRpY3RwMi0+Y3B0ciwgbWF4X2VudCk7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgaWYgKGRpY3RwLT5jb2RlbTEgIT0gZmluY2hhci0xKQorCQkgICAgICB7CisJCQlwcmludGsoImJzZF9kZWNvbXAlZDogYmFkIGNvZGUgY2hhaW4gMHgleCAiCisJCQkgICAgICAgImZpbmNoYXI9MHgleCAiLAorCQkJICAgICAgIGRiLT51bml0LCBpbmNvZGUsIGZpbmNoYXIpOworCisJCQlwcmludGsoIm9sZGNvZGU9MHgleCBjcHRyPTB4JXggY29kZW0xPTB4JXhcbiIsCisJCQkgICAgICAgb2xkY29kZSwgZGljdHAyLT5jcHRyLCBkaWN0cC0+Y29kZW0xKTsKKwkJICAgICAgfQorCQkgIH0KKwkJcmV0dXJuIERFQ09NUF9GQVRBTEVSUk9SOworCSAgICAgIH0KKyNlbmRpZgorCSAgICAqLS1wICAgID0gZGljdHAtPmYuaHMuc3VmZml4OworCSAgICBmaW5jaGFyID0gZGljdHAtPmYuaHMucHJlZml4OworCSAgfQorCSotLXAgPSBmaW5jaGFyOworCQorI2lmZGVmIERFQlVHCisJaWYgKC0tY29kZWxlbiAhPSAwKQorCSAgeworCSAgICBwcmludGsoImJzZF9kZWNvbXAlZDogc2hvcnQgYnkgJWQgYWZ0ZXIgY29kZSAweCV4LCBtYXhfZW50PTB4JXhcbiIsCisJCSAgIGRiLT51bml0LCBjb2RlbGVuLCBpbmNvZGUsIG1heF9lbnQpOworCSAgfQorI2VuZGlmCisJCisJaWYgKGV4dHJhKQkJLyogdGhlIEt3S3dLIGNhc2UgYWdhaW4gKi8KKwkgIHsKKwkgICAgKndwdHIrKyA9IGZpbmNoYXI7CisJICB9CisJCisJLyoKKwkgKiBJZiBub3QgZmlyc3QgY29kZSBpbiBhIHBhY2tldCwgYW5kCisJICogaWYgbm90IG91dCBvZiBjb2RlIHNwYWNlLCB0aGVuIGFsbG9jYXRlIGEgbmV3IGNvZGUuCisJICoKKwkgKiBLZWVwIHRoZSBoYXNoIHRhYmxlIGNvcnJlY3Qgc28gaXQgY2FuIGJlIHVzZWQKKwkgKiB3aXRoIHVuY29tcHJlc3NlZCBwYWNrZXRzLgorCSAqLworCisJaWYgKG9sZGNvZGUgIT0gQ0xFQVIgJiYgbWF4X2VudCA8IGRiLT5tYXhtYXhjb2RlKQorCSAgeworCSAgICBzdHJ1Y3QgYnNkX2RpY3QgKmRpY3RwMiwgKmRpY3RwMzsKKwkgICAgdW5zaWduZWQgc2hvcnQgICpsZW5zMSwgICpsZW5zMjsKKwkgICAgdW5zaWduZWQgbG9uZyBmY29kZTsKKwkgICAgaW50IGh2YWwsIGRpc3AsIGluZHg7CisJICAgIAorCSAgICBmY29kZSA9IEJTRF9LRVkob2xkY29kZSxmaW5jaGFyKTsKKwkgICAgaHZhbCAgPSBCU0RfSEFTSChvbGRjb2RlLGZpbmNoYXIsZGItPmhzaGlmdCk7CisJICAgIGRpY3RwID0gZGljdF9wdHIgKGRiLCBodmFsKTsKKwkgICAgCisJICAgIC8qIGxvb2sgZm9yIGEgZnJlZSBoYXNoIHRhYmxlIGVudHJ5ICovCisJICAgIGlmIChkaWN0cC0+Y29kZW0xIDwgbWF4X2VudCkKKwkgICAgICB7CisJCWRpc3AgPSAoaHZhbCA9PSAwKSA/IDEgOiBodmFsOworCQlkbworCQkgIHsKKwkJICAgIGh2YWwgKz0gZGlzcDsKKwkJICAgIGlmIChodmFsID49IGRiLT5oc2l6ZSkKKwkJICAgICAgeworCQkJaHZhbCAtPSBkYi0+aHNpemU7CisJCSAgICAgIH0KKwkJICAgIGRpY3RwID0gZGljdF9wdHIgKGRiLCBodmFsKTsKKwkJICB9CisJCXdoaWxlIChkaWN0cC0+Y29kZW0xIDwgbWF4X2VudCk7CisJICAgICAgfQorCSAgICAKKwkgICAgLyoKKwkgICAgICogSW52YWxpZGF0ZSBwcmV2aW91cyBoYXNoIHRhYmxlIGVudHJ5CisJICAgICAqIGFzc2lnbmVkIHRoaXMgY29kZSwgYW5kIHRoZW4gdGFrZSBpdCBvdmVyCisJICAgICAqLworCisJICAgIGRpY3RwMiA9IGRpY3RfcHRyIChkYiwgbWF4X2VudCArIDEpOworCSAgICBpbmR4ICAgPSBkaWN0cDItPmNwdHI7CisJICAgIGRpY3RwMyA9IGRpY3RfcHRyIChkYiwgaW5keCk7CisKKwkgICAgaWYgKGRpY3RwMy0+Y29kZW0xID09IG1heF9lbnQpCisJICAgICAgeworCQlkaWN0cDMtPmNvZGVtMSA9IEJBRENPREVNMTsKKwkgICAgICB9CisKKwkgICAgZGljdHAyLT5jcHRyICAgPSBodmFsOworCSAgICBkaWN0cC0+Y29kZW0xICA9IG1heF9lbnQ7CisJICAgIGRpY3RwLT5mLmZjb2RlID0gZmNvZGU7CisJICAgIGRiLT5tYXhfZW50ICAgID0gKyttYXhfZW50OworCisJICAgIC8qIFVwZGF0ZSB0aGUgbGVuZ3RoIG9mIHRoaXMgc3RyaW5nLiAqLworCSAgICBsZW5zMSAgPSBsZW5zX3B0ciAoZGIsIG1heF9lbnQpOworCSAgICBsZW5zMiAgPSBsZW5zX3B0ciAoZGIsIG9sZGNvZGUpOworCSAgICAqbGVuczEgPSAqbGVuczIgKyAxOworCSAgICAKKwkgICAgLyogRXhwYW5kIGNvZGUgc2l6ZSBpZiBuZWVkZWQuICovCisJICAgIGlmIChtYXhfZW50ID49IE1BWENPREUobl9iaXRzKSAmJiBtYXhfZW50IDwgZGItPm1heG1heGNvZGUpCisJICAgICAgeworCQlkYi0+bl9iaXRzID0gKytuX2JpdHM7CisJCXRndGJpdG5vICAgPSAzMi1uX2JpdHM7CisJICAgICAgfQorCSAgfQorCW9sZGNvZGUgPSBpbmNvZGU7CisgICAgICB9CisKKyAgICArK2RiLT5jb21wX2NvdW50OworICAgICsrZGItPnVuY29tcF9jb3VudDsKKyAgICBkYi0+Y29tcF9ieXRlcyAgICs9IGlzaXplIC0gQlNEX09WSEQgLSBQUFBfSERSTEVOOworICAgIGRiLT51bmNvbXBfYnl0ZXMgKz0gZXhwbGVuOworCisgICAgaWYgKGJzZF9jaGVjayhkYikpCisgICAgICB7CisJaWYgKGRiLT5kZWJ1ZykKKwkgIHsKKwkgICAgcHJpbnRrKCJic2RfZGVjb21wJWQ6IHBlZXIgc2hvdWxkIGhhdmUgY2xlYXJlZCBkaWN0aW9uYXJ5IG9uICVkXG4iLAorCQkgICBkYi0+dW5pdCwgZGItPnNlcW5vIC0gMSk7CisJICB9CisgICAgICB9CisgICAgcmV0dXJuIGV4cGxlbjsKKyAgfQorICAgICAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUYWJsZSBvZiBhZGRyZXNzZXMgZm9yIHRoZSBCU0QgY29tcHJlc3Npb24gbW9kdWxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBjb21wcmVzc29yIHBwcF9ic2RfY29tcHJlc3MgPSB7CisJLmNvbXByZXNzX3Byb3RvID0JQ0lfQlNEX0NPTVBSRVNTLAorCS5jb21wX2FsbG9jID0JCWJzZF9jb21wX2FsbG9jLAorCS5jb21wX2ZyZWUgPQkJYnNkX2ZyZWUsCisJLmNvbXBfaW5pdCA9CQlic2RfY29tcF9pbml0LAorCS5jb21wX3Jlc2V0ID0JCWJzZF9yZXNldCwKKwkuY29tcHJlc3MgPQkJYnNkX2NvbXByZXNzLAorCS5jb21wX3N0YXQgPQkJYnNkX2NvbXBfc3RhdHMsCisJLmRlY29tcF9hbGxvYyA9CQlic2RfZGVjb21wX2FsbG9jLAorCS5kZWNvbXBfZnJlZSA9CQlic2RfZnJlZSwKKwkuZGVjb21wX2luaXQgPQkJYnNkX2RlY29tcF9pbml0LAorCS5kZWNvbXBfcmVzZXQgPQkJYnNkX3Jlc2V0LAorCS5kZWNvbXByZXNzID0JCWJzZF9kZWNvbXByZXNzLAorCS5pbmNvbXAgPQkJYnNkX2luY29tcCwKKwkuZGVjb21wX3N0YXQgPQkJYnNkX2NvbXBfc3RhdHMsCisJLm93bmVyID0JCVRISVNfTU9EVUxFCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTW9kdWxlIHN1cHBvcnQgcm91dGluZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdCBic2Rjb21wX2luaXQodm9pZCkKK3sKKwlpbnQgYW5zd2VyID0gcHBwX3JlZ2lzdGVyX2NvbXByZXNzb3IoJnBwcF9ic2RfY29tcHJlc3MpOworCWlmIChhbnN3ZXIgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUFBQIEJTRCBDb21wcmVzc2lvbiBtb2R1bGUgcmVnaXN0ZXJlZFxuIik7CisJcmV0dXJuIGFuc3dlcjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJzZGNvbXBfY2xlYW51cCh2b2lkKQoreworCXBwcF91bnJlZ2lzdGVyX2NvbXByZXNzb3IoJnBwcF9ic2RfY29tcHJlc3MpOworfQorCittb2R1bGVfaW5pdChic2Rjb21wX2luaXQpOworbW9kdWxlX2V4aXQoYnNkY29tcF9jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9BTElBUygicHBwLWNvbXByZXNzLSIgX19zdHJpbmdpZnkoQ0lfQlNEX0NPTVBSRVNTKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jcmlzL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvY3Jpcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGU4OTMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY3Jpcy9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfRVRSQVhfQVJDSF9WMTApICs9IGV0aF92MTAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3Jpcy9ldGhfdjEwLmMgYi9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDI2NzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY3Jpcy9ldGhfdjEwLmMKQEAgLTAsMCArMSwxODM2IEBACisvKiAkSWQ6IGV0aGVybmV0LmMsdiAxLjMxIDIwMDQvMTAvMTggMTQ6NDk6MDMgc3RhcnZpayBFeHAgJAorICoKKyAqIGUxMDBuZXQuYzogQSBuZXR3b3JrIGRyaXZlciBmb3IgdGhlIEVUUkFYIDEwMExYIG5ldHdvcmsgY29udHJvbGxlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiBBeGlzIENvbW11bmljYXRpb25zIEFCLgorICoKKyAqIFRoZSBvdXRsaW5lIG9mIHRoaXMgZHJpdmVyIGNvbWVzIGZyb20gc2tlbGV0b24uYy4KKyAqCisgKiAkTG9nOiBldGhlcm5ldC5jLHYgJAorICogUmV2aXNpb24gMS4zMSAgMjAwNC8xMC8xOCAxNDo0OTowMyAgc3RhcnZpaworICogVXNlIFJYIGludGVycnVwdCBhcyByYW5kb20gc291cmNlCisgKgorICogUmV2aXNpb24gMS4zMCAgMjAwNC8wOS8yOSAxMDo0NDowNCAgc3RhcnZpaworICogRW5hYmVkIE1BQy1hZGRyZXNzIG91dHB1dCBhZ2FpbgorICoKKyAqIFJldmlzaW9uIDEuMjkgIDIwMDQvMDgvMjQgMDc6MTQ6MDUgIHN0YXJ2aWsKKyAqIE1ha2UgdXNlIG9mIGdlbmVyaWMgTURJTyBpbnRlcmZhY2UgYW5kIGNvbnN0YW50cy4KKyAqCisgKiBSZXZpc2lvbiAxLjI4ICAyMDA0LzA4LzIwIDA5OjM3OjExICBzdGFydmlrCisgKiBBZGRlZCBzdXBwb3J0IGZvciBJbnRlbCBMWFQ5NzJBLiBDcmVkcyB0byBSYW5keSBTY2FyYm9yb3VnaC4KKyAqCisgKiBSZXZpc2lvbiAxLjI3ICAyMDA0LzA4LzE2IDEyOjM3OjIyICBzdGFydmlrCisgKiBNZXJnZSBvZiBMaW51eCAyLjYuOAorICoKKyAqIFJldmlzaW9uIDEuMjUgIDIwMDQvMDYvMjEgMTA6Mjk6NTcgIHN0YXJ2aWsKKyAqIE1lcmdlIG9mIExpbnV4IDIuNi43CisgKgorICogUmV2aXNpb24gMS4yMyAgMjAwNC8wNi8wOSAwNToyOToyMiAgc3RhcnZpaworICogQXZvaWQgYW55IHJhY2Ugd2hlcmUgUl9ETUFfQ0gxX0ZJUlNUIGlzIE5VTEwgKG1heSB0cmlnZ2VyIGNhY2hlIGJ1ZykuCisgKgorICogUmV2aXNpb24gMS4yMiAgMjAwNC8wNS8xNCAwNzo1ODowMyAgc3RhcnZpaworICogTWVyZ2Ugb2YgY2hhbmdlcyBmcm9tIDIuNAorICoKKyAqIFJldmlzaW9uIDEuMjAgIDIwMDQvMDMvMTEgMTE6Mzg6NDAgIHN0YXJ2aWsKKyAqIE1lcmdlIG9mIExpbnV4IDIuNi40CisgKgorICogUmV2aXNpb24gMS4xOCAgMjAwMy8xMi8wMyAxMzo0NTo0NiAgc3RhcnZpaworICogVXNlIGhhcmR3YXJlIHBhZCBmb3Igc2hvcnQgcGFja2V0cyB0byBwcmV2ZW50IGluZm9ybWF0aW9uIGxlYWthZ2UuCisgKgorICogUmV2aXNpb24gMS4xNyAgMjAwMy8wNy8wNCAwODoyNzozNyAgc3RhcnZpaworICogTWVyZ2Ugb2YgTGludXggMi41Ljc0CisgKgorICogUmV2aXNpb24gMS4xNiAgMjAwMy8wNC8yNCAwODoyODoyMiAgc3RhcnZpaworICogTmV3IExFRCBiZWhhdmlvdXI6IExFRCBvZmYgd2hlbiBubyBsaW5rCisgKgorICogUmV2aXNpb24gMS4xNSAgMjAwMy8wNC8wOSAwNToyMDo0NyAgc3RhcnZpaworICogTWVyZ2Ugb2YgTGludXggMi41LjY3CisgKgorICogUmV2aXNpb24gMS4xMyAgMjAwMy8wMy8wNiAxNjoxMTowMSAgaGVucmlrZW4KKyAqIE9mZiBieSBvbmUgZXJyb3IgaW4gZ3JvdXAgYWRkcmVzcyByZWdpc3RlciBzZXR0aW5nLgorICoKKyAqIFJldmlzaW9uIDEuMTIgIDIwMDMvMDIvMjcgMTc6MjQ6MTkgIHN0YXJ2aWsKKyAqIENvcnJlY3RlZCBSZXYgdG8gUmV2aXNpb24KKyAqCisgKiBSZXZpc2lvbiAxLjExICAyMDAzLzAxLzI0IDA5OjUzOjIxICBzdGFydmlrCisgKiBPb3BzLiBJbml0aWFsaXplIEdBIHRvIDAsIG5vdCB0byAxCisgKgorICogUmV2aXNpb24gMS4xMCAgMjAwMy8wMS8yNCAwOTo1MDo1NSAgc3RhcnZpaworICogSW5pdGlhbGl6ZSBHQV8wIGFuZCBHQV8xIHRvIDAgdG8gYXZvaWQgbWF0Y2hpbmcgb2YgdW53YW50ZWQgcGFja2V0cworICoKKyAqIFJldmlzaW9uIDEuOSAgMjAwMi8xMi8xMyAwNzo0MDo1OCAgc3RhcnZpaworICogQWRkZWQgYmFzaWMgZXRodG9vbCBpbnRlcmZhY2UKKyAqIEhhbmRsZWQgb3V0IG9mIG1lbW9yeSB3aGVuIGFsbG9jYXRpbmcgbmV3IGJ1ZmZlcnMKKyAqCisgKiBSZXZpc2lvbiAxLjggIDIwMDIvMTIvMTEgMTM6MTM6NTcgIHN0YXJ2aWsKKyAqIEFkZGVkIGFyY2gvIHRvIHYxMCBzcGVjaWZpYyBpbmNsdWRlcworICogQWRkZWQgZml4IGZyb20gTGludXggMi40IGluIHNlcmlhbC5jIChmbHVzaF90b19mbGlwX2J1ZmZlcikKKyAqCisgKiBSZXZpc2lvbiAxLjcgIDIwMDIvMTEvMjYgMDk6NDE6NDIgIHN0YXJ2aWsKKyAqIEFkZGVkIGUxMDBfc2V0X2NvbmZpZyAoc3RhbmRhcmQgaW50ZXJmYWNlIHRvIHNldCBtZWRpYSB0eXBlKQorICogQWRkZWQgcHJvdGVjdGlvbiBhZ2FpbnN0IHByZWVtcHRpdmUgc2NoZWR1bGluZworICogQWRkZWQgc3RhbmRhcmQgTUlJIGlvY3RscworICoKKyAqIFJldmlzaW9uIDEuNiAgMjAwMi8xMS8yMSAwNzoxODoxOCAgc3RhcnZpaworICogVGltZXJzIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gMi41LjQ4CisgKgorICogUmV2aXNpb24gMS41ICAyMDAyLzExLzIwIDExOjU2OjExICBzdGFydmlrCisgKiBNZXJnZSBvZiBMaW51eCAyLjUuNDgKKyAqCisgKiBSZXZpc2lvbiAxLjQgIDIwMDIvMTEvMTggMDc6MjY6NDYgIHN0YXJ2aWsKKyAqIExpbnV4IDIuNSBwb3J0IG9mIGxhdGVzdCBMaW51eCAyLjQgZXRoZXJuZXQgZHJpdmVyCisgKgorICogUmV2aXNpb24gMS4zMyAgMjAwMi8xMC8wMiAyMDoxNjoxNyAgaHAKKyAqIFNFVEYsIFNFVFM6IFVzZSB1bmRlcnNjb3JlZCBJT194XyBtYWNyb3MgcmF0aGVyIHRoYW4gaW5jb3JyZWN0IHRva2VuIGNvbmNhdGVuYXRpb24KKyAqCisgKiBSZXZpc2lvbiAxLjMyICAyMDAyLzA5LzE2IDA2OjA1OjU4ICBzdGFydmlrCisgKiBBbGlnbiBtZW1vcnkgcmV0dXJuZWQgYnkgZGV2X2FsbG9jX3NrYgorICogTW92ZWQgaGFuZGxpbmcgb2Ygc2VudCBwYWNrZXRzIHRvIGludGVycnVwdCB0byBhdm9pZCByZWZlcmVuY2UgY291bnRpbmcgcHJvYmxlbQorICoKKyAqIFJldmlzaW9uIDEuMzEgIDIwMDIvMDkvMTAgMTM6Mjg6MjMgIGxhcnN2CisgKiBSZXR1cm4gLUVJTlZBTCBmb3IgdW5rbm93biBpb2N0bHMgdG8gYXZvaWQgY29uZnVzaW5nIHRvb2xzIHRoYXQgdGVzdHMKKyAqIGZvciBzdXBwb3J0ZWQgZnVuY3Rpb25hbGl0eSBieSBpc3N1aW5nIHNwZWNpYWwgaW9jdGxzLCBpLmUuIHdpcmVsZXNzCisgKiBleHRlbnNpb25zLgorICoKKyAqIFJldmlzaW9uIDEuMzAgIDIwMDIvMDUvMDcgMTg6NTA6MDggIGpvaGFuYQorICogQ29ycmVjdCBzcGVsbGluZyBpbiBjb21tZW50cy4KKyAqCisgKiBSZXZpc2lvbiAxLjI5ICAyMDAyLzA1LzA2IDA1OjM4OjQ5ICBzdGFydmlrCisgKiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudHM6CisgKiAgICBMYXJnZSBwYWNrZXRzIGFyZSBub3QgY29waWVkIChicmVha3BvaW50IHNldCB0byAyNTYgYnl0ZXMpCisgKiAgICBUaGUgY2FjaGUgYnVnIHdvcmthcm91bmQgaXMgZGVsYXllZCB1bnRpbCBoYWxmIG9mIHRoZSByZWNlaXZlIGxpc3QKKyAqICAgICAgaGFzIGJlZW4gdXNlZAorICogICAgQWRkZWQgdHJhbnNtaXQgbGlzdAorICogICAgVHJhbnNtaXQgaW50ZXJydXB0cyBhcmUgb25seSBlbmFibGVkIHdoZW4gdHJhbnNtaXQgcXVldWUgaXMgZnVsbAorICoKKyAqIFJldmlzaW9uIDEuMjguMi4xICAyMDAyLzA0LzMwIDA4OjE1OjUxICBzdGFydmlrCisgKiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudHM6CisgKiAgIExhcmdlIHBhY2tldHMgYXJlIG5vdCBjb3BpZWQgKGJyZWFrcG9pbnQgc2V0IHRvIDI1NiBieXRlcykKKyAqICAgVGhlIGNhY2hlIGJ1ZyB3b3JrYXJvdW5kIGlzIGRlbGF5ZWQgdW50aWwgaGFsZiBvZiB0aGUgcmVjZWl2ZSBsaXN0CisgKiAgICAgaGFzIGJlZW4gdXNlZC4KKyAqICAgQWRkZWQgdHJhbnNtaXQgbGlzdAorICogICBUcmFuc21pdCBpbnRlcnJ1cHRzIGFyZSBvbmx5IGVuYWJsZWQgd2hlbiB0cmFuc21pdCBxdWV1ZSBpcyBmdWxsCisgKgorICogUmV2aXNpb24gMS4yOCAgMjAwMi8wNC8yMiAxMTo0NzoyMSAgam9oYW5hCisgKiBGaXggYWNjb3JkaW5nIHRvIDIuNC4xOS1wcmU3LiB0aW1lX2FmdGVyL3RpbWVfYmVmb3JlIGFuZAorICogbWlzc2luZyBlbmQgb2YgY29tbWVudC4KKyAqIFRoZSBwYXRjaCBoYXMgYSB0eXBvIGZvciBldGhlcm5ldC5jIGluIGUxMDBfY2xlYXJfbmV0d29ya19sZWRzKCksCisgKiAgdGhhdCBpcyBmaXhlZCBoZXJlLgorICoKKyAqIFJldmlzaW9uIDEuMjcgIDIwMDIvMDQvMTIgMTE6NTU6MTEgIGJqb3JudworICogQWRkZWQgVE9ETworICoKKyAqIFJldmlzaW9uIDEuMjYgIDIwMDIvMDMvMTUgMTc6MTE6MDIgIGJqb3JudworICogVXNlIHByZXBhcmVfcnhfZGVzY3JpcHRvciBhZnRlciB0aGUgQ1BVIGhhcyB0b3VjaGVkIHRoZSByZWNlaXZpbmcgZGVzY3MKKyAqCisgKiBSZXZpc2lvbiAxLjI1ICAyMDAyLzAzLzA4IDEzOjA3OjUzICBiam9ybncKKyAqIFVubmVjZXNzYXJ5IHNwaW5sb2NrIHJlbW92ZWQKKyAqCisgKiBSZXZpc2lvbiAxLjI0ICAyMDAyLzAyLzIwIDEyOjU3OjQzICBmcmVkcmlrcworICogUmVwbGFjZWQgTUlOKCkgd2l0aCBtaW4oKS4KKyAqCisgKiBSZXZpc2lvbiAxLjIzICAyMDAyLzAyLzIwIDEwOjU4OjE0ICBmcmVkcmlrcworICogU3RyaXAgdGhlIEV0aGVybmV0IGNoZWNrc3VtICg0IGJ5dGVzKSBiZWZvcmUgZm9yd2FyZGluZyBhIGZyYW1lIHRvIHVwcGVyIGxheWVycy4KKyAqCisgKiBSZXZpc2lvbiAxLjIyICAyMDAyLzAxLzMwIDA3OjQ4OjIyICBtYXRzZmcKKyAqIEluaXRpYXRlIFJfTkVUV09SS19UUl9DVFJMCisgKgorICogUmV2aXNpb24gMS4yMSAgMjAwMS8xMS8yMyAxMTo1NDo0OSAgc3RhcnZpaworICogQWRkZWQgSUZGX1BST01JU0MgYW5kIElGRl9BTExNVUxUSSBoYW5kbGluZyBpbiBzZXRfbXVsdGljYXN0X2xpc3QKKyAqIFJlbW92ZWQgY29tcGlsZXIgd2FybmluZ3MKKyAqCisgKiBSZXZpc2lvbiAxLjIwICAyMDAxLzExLzEyIDE5OjI2OjAwICBwa2oKKyAqICogQ29ycmVjdGVkIGUxMDBfbmVnb3RpYXRlKCkgdG8gbm90IGFzc2lnbiBoYWxmIHRvIGN1cnJlbnRfZHVwbGV4IHdoZW4KKyAqICAgaXQgd2FzIHN1cHBvc2VkIHRvIGNvbXBhcmUgdGhlbS4uLgorICogKiBDbGVhbmVkIHVwIGZhaWx1cmUgaGFuZGxpbmcgaW4gZTEwMF9vcGVuKCkuCisgKiAqIEZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzLgorICoKKyAqIFJldmlzaW9uIDEuMTkgIDIwMDEvMTEvMDkgMDc6NDM6MDkgIHN0YXJ2aWsKKyAqIEFkZGVkIGZ1bGwgZHVwbGV4IHN1cHBvcnQKKyAqIEFkZGVkIGlvY3RsIHRvIHNldCBzcGVlZCBhbmQgZHVwbGV4CisgKiBDbGVhciBMRUQgdGltZXIgb25seSBydW5zIHdoZW4gTEVEIGlzIGxpdAorICoKKyAqIFJldmlzaW9uIDEuMTggIDIwMDEvMTAvMDMgMTQ6NDA6NDMgIGpvbmFzaGcKKyAqIFVwZGF0ZSByeF9ieXRlcyBjb3VudGVyLgorICoKKyAqIFJldmlzaW9uIDEuMTcgIDIwMDEvMDYvMTEgMTI6NDM6NDYgIG9sb2YKKyAqIE1vZGlmaWVkIGRlZmluZXMgZm9yIG5ldHdvcmsgTEVEIGJlaGF2aW9yCisgKgorICogUmV2aXNpb24gMS4xNiAgMjAwMS8wNS8zMCAwNjoxMjo0NiAgbWFya3VzbAorICogVHhEZXNjLm5leHQgc2hvdWxkIG5vdCBiZSBzZXQgdG8gTlVMTAorICoKKyAqIFJldmlzaW9uIDEuMTUgIDIwMDEvMDUvMjkgMTA6Mjc6MDQgIG1hcmt1c2wKKyAqIFVwZGF0ZWQgYWZ0ZXIgcmV2aWV3IHJlbWFya3M6CisgKiArVXNlIElPX0VYVFJBQ1QKKyAqICtIYW5kbGUgdW5kZXJydW4KKyAqCisgKiBSZXZpc2lvbiAxLjE0ICAyMDAxLzA1LzI5IDA5OjIwOjE0ICBqb25hc2hnCisgKiBVc2UgZHJpdmVyIG5hbWUgb24gcHJpbnRrIG91dHB1dCBzbyBvbmUgY2FuIHRlbGwgd2hpY2ggZHJpdmVyIHRoYXQgY29tcGxhaW5zLgorICoKKyAqIFJldmlzaW9uIDEuMTMgIDIwMDEvMDUvMDkgMTI6MzU6NTkgIGpvaGFuYQorICogVXNlIERNQV9OQlIgYW5kIElSUV9OQlIgZGVmaW5lcyBmcm9tIGRtYS5oIGFuZCBpcnEuaAorICoKKyAqIFJldmlzaW9uIDEuMTIgIDIwMDEvMDQvMDUgMTE6NDM6MTEgIHRvYmlhc2EKKyAqIENoZWNrIGRldiBiZWZvcmUgcGFuaWMuCisgKgorICogUmV2aXNpb24gMS4xMSAgMjAwMS8wNC8wNCAxMToyMTowNSAgbWFya3VzbAorICogVXBkYXRlZCBhY2NvcmRpbmcgdG8gcmV2aWV3IHJlbWFya3MKKyAqCisgKiBSZXZpc2lvbiAxLjEwICAyMDAxLzAzLzI2IDE2OjAzOjA2ICBiam9ybncKKyAqIE5lZWRzIGxpbnV4L2NvbmZpZy5oCisgKgorICogUmV2aXNpb24gMS45ICAyMDAxLzAzLzE5IDE0OjQ3OjQ4ICBwa2oKKyAqICogTWFrZSBzdXJlIHRoZXJlIGlzIGFsd2F5cyBhIHBhdXNlIGFmdGVyIHRoZSBuZXR3b3JrIExFRHMgYXJlCisgKiAgIGNoYW5nZWQgc28gdGhleSB3aWxsIG5vdCBsb29rIGNvbnN0YW50bHkgbGl0IGR1cmluZyBoZWF2eSB0cmFmZmljLgorICogKiBBbHdheXMgdXNlIEhaIHdoZW4gc2V0dGluZyB0aW1lcyByZWxhdGl2ZSB0byBqaWZmaWVzLgorICogKiBVc2UgTEVEX05FVFdPUktfU0VUKCkgd2hlbiBzZXR0aW5nIHRoZSBuZXR3b3JrIExFRHMuCisgKgorICogUmV2aXNpb24gMS44ICAyMDAxLzAyLzI3IDEzOjUyOjQ4ICBiam9ybncKKyAqIG1hbGxvYy5oIC0+IHNsYWIuaAorICoKKyAqIFJldmlzaW9uIDEuNyAgMjAwMS8wMi8yMyAxMzo0NjozOCAgYmpvcm53CisgKiBTcGVsbGxpbmcgY2hlY2sKKyAqCisgKiBSZXZpc2lvbiAxLjYgIDIwMDEvMDEvMjYgMTU6MjE6MDQgIHN0YXJ2aWsKKyAqIERvbid0IGRpc2FibGUgaW50ZXJydXB0cyB3aGlsZSByZWFkaW5nIE1ESU8gcmVnaXN0ZXJzIChNRElPIGlzIHNsb3cpCisgKiBDb3JyZWN0ZWQgcHJvbWlzY3VvdXMgbW9kZQorICogSW1wcm92ZWQgZGVhbGxvY2F0aW9uIG9mIElSUXMgKCJpZmNvbmZpZyBldGgwIGRvd24iIG5vdyB3b3JrcykKKyAqCisgKiBSZXZpc2lvbiAxLjUgIDIwMDAvMTEvMjkgMTc6MjI6MjIgIGJqb3JudworICogR2V0IHJpZCBvZiB0aGUgdWR3b3JkIHR5cGVzIGxlZ2FjeSBzdHVmZgorICoKKyAqIFJldmlzaW9uIDEuNCAgMjAwMC8xMS8yMiAxNjozNjowOSAgYmpvcm53CisgKiBQbGVhc2UgbWFya2V0aW5nIGJ5IHVzaW5nIHRoZSBjb3JyZWN0IGNhc2Ugd2hlbiBzcGVsbGluZyBFdHJheC4KKyAqCisgKiBSZXZpc2lvbiAxLjMgIDIwMDAvMTEvMjEgMTY6NDM6MDQgIGJqb3JudworICogTWlub3Igc2hvcnQtPmludCBjaGFuZ2UKKyAqCisgKiBSZXZpc2lvbiAxLjIgIDIwMDAvMTEvMDggMTQ6Mjc6NTcgIGJqb3JudworICogMi40IHBvcnQKKyAqCisgKiBSZXZpc2lvbiAxLjEgIDIwMDAvMTEvMDYgMTM6NTY6MDAgIGJqb3JudworICogVmVyYmF0aW0gY29weSBvZiB0aGUgMS4yNCB2ZXJzaW9uIG9mIGUxMDBuZXQuYyBmcm9tIGVsaW51eAorICoKKyAqIFJldmlzaW9uIDEuMjQgIDIwMDAvMTAvMDQgMTU6NTU6MjMgIGJqb3JudworICogKiBVc2UgdmlydF90b19waHlzIGV0Yy4gZm9yIERNQSBhZGRyZXNzZXMKKyAqICogUmVtb3ZlZCBib2d1cyBDSEVDS1NVTV9VTk5FQ0VTU0FSWQorICoKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvc3ZpbnRvLmg+LyogRE1BIGFuZCByZWdpc3RlciBkZXNjcmlwdGlvbnMgKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4gICAgICAgICAvKiBMRURfKiBJL08gZnVuY3Rpb25zICovCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorCisvLyNkZWZpbmUgRVRIREVCVUcKKyNkZWZpbmUgRCh4KQorCisvKgorICogVGhlIG5hbWUgb2YgdGhlIGNhcmQuIElzIHVzZWQgZm9yIG1lc3NhZ2VzIGFuZCBpbiB0aGUgcmVxdWVzdHMgZm9yCisgKiBpbyByZWdpb25zLCBpcnFzIGFuZCBkbWEgY2hhbm5lbHMKKyAqLworCitzdGF0aWMgY29uc3QgY2hhciogY2FyZG5hbWUgPSAiRVRSQVggMTAwTFggYnVpbHQtaW4gZXRoZXJuZXQgY29udHJvbGxlciI7CisKKy8qIEEgZGVmYXVsdCBldGhlcm5ldCBhZGRyZXNzLiBIaWdobGV2ZWwgU1cgd2lsbCBzZXQgdGhlIHJlYWwgb25lIGxhdGVyICovCisKK3N0YXRpYyBzdHJ1Y3Qgc29ja2FkZHIgZGVmYXVsdF9tYWMgPSB7CisJMCwKKwl7IDB4MDAsIDB4NDAsIDB4OEMsIDB4Q0QsIDB4MDAsIDB4MDAgfQorfTsKKworLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuICovCitzdHJ1Y3QgbmV0X2xvY2FsIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpX2lmOworCisJLyogVHggY29udHJvbCBsb2NrLiAgVGhpcyBwcm90ZWN0cyB0aGUgdHJhbnNtaXQgYnVmZmVyIHJpbmcKKwkgKiBzdGF0ZSBhbG9uZyB3aXRoIHRoZSAidHggZnVsbCIgc3RhdGUgb2YgdGhlIGRyaXZlci4gIFRoaXMKKwkgKiBtZWFucyBhbGwgbmV0aWZfcXVldWUgZmxvdyBjb250cm9sIGFjdGlvbnMgYXJlIHByb3RlY3RlZAorCSAqIGJ5IHRoaXMgbG9jayBhcyB3ZWxsLgorCSAqLworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3R5cGVkZWYgc3RydWN0IGV0cmF4X2V0aF9kZXNjcgoreworCWV0cmF4X2RtYV9kZXNjciBkZXNjcjsKKwlzdHJ1Y3Qgc2tfYnVmZiogc2tiOworfSBldHJheF9ldGhfZGVzY3I7CisKKy8qIFNvbWUgdHJhbnNjZWl2ZXJzIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgKi8KK3N0cnVjdCB0cmFuc2NlaXZlcl9vcHMKK3sKKwl1bnNpZ25lZCBpbnQgb3VpOworCXZvaWQgKCpjaGVja19zcGVlZCkoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CisJdm9pZCAoKmNoZWNrX2R1cGxleCkoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7Cit9OworCitzdHJ1Y3QgdHJhbnNjZWl2ZXJfb3BzKiB0cmFuc2NlaXZlcjsKKworLyogRHVwbGV4IHNldHRpbmdzICovCitlbnVtIGR1cGxleAoreworCWhhbGYsCisJZnVsbCwKKwlhdXRvbmVnCit9OworCisvKiBEbWEgZGVzY3JpcHRvcnMgZXRjLiAqLworCisjZGVmaW5lIE1BWF9NRURJQV9EQVRBX1NJWkUgMTUxOAorCisjZGVmaW5lIE1JTl9QQUNLRVRfTEVOICAgICAgNDYKKyNkZWZpbmUgRVRIRVJfSEVBRF9MRU4gICAgICAxNAorCisvKgorKiogTURJTyBjb25zdGFudHMuCisqLworI2RlZmluZSBNRElPX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgTURJT19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIE1ESU9fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBNRElPX1BSRUFNQkxFICAgICAgICAgICAgICAweGZmZmZmZmZmdWwKKworLyogQnJvYWRjb20gc3BlY2lmaWMgKi8KKyNkZWZpbmUgTURJT19BVVhfQ1RSTF9TVEFUVVNfUkVHICAgICAgICAgICAweDE4CisjZGVmaW5lIE1ESU9fQkNfRlVMTF9EVVBMRVhfSU5EICAgICAgICAgICAgIDB4MQorI2RlZmluZSBNRElPX0JDX1NQRUVEICAgICAgICAgICAgICAgICAgICAgICAweDIKKworLyogVERLIHNwZWNpZmljICovCisjZGVmaW5lIE1ESU9fVERLX0RJQUdOT1NUSUNfUkVHICAgICAgICAgICAgICAxOAorI2RlZmluZSBNRElPX1RES19ESUFHTk9TVElDX1JBVEUgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgTURJT19UREtfRElBR05PU1RJQ19EUExYICAgICAgICAgIDB4ODAwCisKKy8qSW50ZWwgTFhUOTcyQSBzcGVjaWZpYyovCisjZGVmaW5lIE1ESU9fSU5UX1NUQVRVU19SRUdfMgkJCTB4MDAxMQorI2RlZmluZSBNRElPX0lOVF9GVUxMX0RVUExFWF9JTkQJCSggMSA8PCA5ICkKKyNkZWZpbmUgTURJT19JTlRfU1BFRUQJCQkJKCAxIDw8IDE0ICkKKworLyogTmV0d29yayBmbGFzaCBjb25zdGFudHMgKi8KKyNkZWZpbmUgTkVUX0ZMQVNIX1RJTUUgICAgICAgICAgICAgICAgICAoSFovNTApIC8qIDIwIG1zICovCisjZGVmaW5lIE5FVF9GTEFTSF9QQVVTRSAgICAgICAgICAgICAgICAoSFovMTAwKSAvKiAxMCBtcyAqLworI2RlZmluZSBORVRfTElOS19VUF9DSEVDS19JTlRFUlZBTCAgICAgICAoMipIWikgLyogMiBzICAgKi8KKyNkZWZpbmUgTkVUX0RVUExFWF9DSEVDS19JTlRFUlZBTCAgICAgICAgKDIqSFopIC8qIDIgcyAgICovCisKKyNkZWZpbmUgTk9fTkVUV09SS19BQ1RJVklUWSAwCisjZGVmaW5lIE5FVFdPUktfQUNUSVZJVFkgICAgMQorCisjZGVmaW5lIE5CUl9PRl9SWF9ERVNDICAgICA2NAorI2RlZmluZSBOQlJfT0ZfVFhfREVTQyAgICAgMjU2CisKKy8qIExhcmdlIHBhY2tldHMgYXJlIHNlbnQgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXJzIHdoaWxlIHNtYWxsIHBhY2tldHMgYXJlICovCisvKiBjb3BpZWQgKHRvIHJlZHVjZSBtZW1vcnkgd2FzdGUpLiBUaGUgZm9sbG93aW5nIGNvbnN0YW50IGRlY2lkZXMgdGhlIGJyZWFrcG9pbnQgKi8KKyNkZWZpbmUgUlhfQ09QWUJSRUFLIDI1NgorCisvKiBEdWUgdG8gYSBjaGlwIGJ1ZyB3ZSBuZWVkIHRvIGZsdXNoIHRoZSBjYWNoZSB3aGVuIGRlc2NyaXB0b3JzIGFyZSByZXR1cm5lZCAqLworLyogdG8gdGhlIERNQS4gVG8gZGVjcmVhc2UgcGVyZm9ybWFuY2UgaW1wYWN0IHdlIHJldHVybiBkZXNjcmlwdG9ycyBpbiBjaHVua3MuICovCisvKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50IGRldGVybWluZXMgdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyB0byByZXR1cm4uICovCisjZGVmaW5lIFJYX1FVRVVFX1RIUkVTSE9MRCAgTkJSX09GX1JYX0RFU0MvMgorCisjZGVmaW5lIEdFVF9CSVQoYml0LHZhbCkgICAoKCh2YWwpID4+IChiaXQpKSAmIDB4MDEpCisKKy8qIERlZmluZSBzb21lIG1hY3JvcyB0byBhY2Nlc3MgRVRSQVggMTAwIHJlZ2lzdGVycyAqLworI2RlZmluZSBTRVRGKHZhciwgcmVnLCBmaWVsZCwgdmFsKSB2YXIgPSAodmFyICYgfklPX01BU0tfKHJlZyMjXywgZmllbGQjI18pKSB8IFwKKwkJCQkJICBJT19GSUVMRF8ocmVnIyNfLCBmaWVsZCMjXywgdmFsKQorI2RlZmluZSBTRVRTKHZhciwgcmVnLCBmaWVsZCwgdmFsKSB2YXIgPSAodmFyICYgfklPX01BU0tfKHJlZyMjXywgZmllbGQjI18pKSB8IFwKKwkJCQkJICBJT19TVEFURV8ocmVnIyNfLCBmaWVsZCMjXywgXyMjdmFsKQorCitzdGF0aWMgZXRyYXhfZXRoX2Rlc2NyICpteU5leHRSeERlc2M7ICAvKiBQb2ludHMgdG8gdGhlIG5leHQgZGVzY3JpcHRvciB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvY2Vzc2VkICovCitzdGF0aWMgZXRyYXhfZXRoX2Rlc2NyICpteUxhc3RSeERlc2M7ICAvKiBUaGUgbGFzdCBwcm9jZXNzZWQgZGVzY3JpcHRvciAqLworc3RhdGljIGV0cmF4X2V0aF9kZXNjciAqbXlQcmV2UnhEZXNjOyAgLyogVGhlIGRlc2NyaXB0b3IgcmlnaHQgYmVmb3JlIG15TmV4dFJ4RGVzYyAqLworCitzdGF0aWMgZXRyYXhfZXRoX2Rlc2NyIFJ4RGVzY0xpc3RbTkJSX09GX1JYX0RFU0NdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOworCitzdGF0aWMgZXRyYXhfZXRoX2Rlc2NyKiBteUZpcnN0VHhEZXNjOyAvKiBGaXJzdCBwYWNrZXQgbm90IHlldCBzZW50ICovCitzdGF0aWMgZXRyYXhfZXRoX2Rlc2NyKiBteUxhc3RUeERlc2M7ICAvKiBFbmQgb2Ygc2VuZCBxdWV1ZSAqLworc3RhdGljIGV0cmF4X2V0aF9kZXNjciogbXlOZXh0VHhEZXNjOyAgLyogTmV4dCBkZXNjcmlwdG9yIHRvIHVzZSAqLworc3RhdGljIGV0cmF4X2V0aF9kZXNjciBUeERlc2NMaXN0W05CUl9PRl9UWF9ERVNDXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBuZXR3b3JrX3JlY19jb25maWdfc2hhZG93ID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWRpb19waHlfYWRkcjsgLyogVHJhbnNjaWV2ZXIgYWRkcmVzcyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldHdvcmtfdHJfY3RybF9zaGFkb3cgPSAwOworCisvKiBOZXR3b3JrIHNwZWVkIGluZGljYXRpb24uICovCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc3BlZWRfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKTsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBjbGVhcl9sZWRfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKTsKK3N0YXRpYyBpbnQgY3VycmVudF9zcGVlZDsgLyogU3BlZWQgcmVhZCBmcm9tIHRyYW5zY2VpdmVyICovCitzdGF0aWMgaW50IGN1cnJlbnRfc3BlZWRfc2VsZWN0aW9uOyAvKiBTcGVlZCBzZWxlY3RlZCBieSB1c2VyICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsZWRfbmV4dF90aW1lOworc3RhdGljIGludCBsZWRfYWN0aXZlOworc3RhdGljIGludCByeF9xdWV1ZV9sZW47CisKKy8qIER1cGxleCAqLworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGR1cGxleF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOworc3RhdGljIGludCBmdWxsX2R1cGxleDsKK3N0YXRpYyBlbnVtIGR1cGxleCBjdXJyZW50X2R1cGxleDsKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworCitzdGF0aWMgaW50IGV0cmF4X2V0aGVybmV0X2luaXQodm9pZCk7CisKK3N0YXRpYyBpbnQgZTEwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlMTAwX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKTsKK3N0YXRpYyBpbnQgZTEwMF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBlMTAwcnh0eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgZTEwMG53X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGUxMDBfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGUxMDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGUxMDBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworc3RhdGljIGludCBlMTAwX2V0aHRvb2xfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgc3RydWN0IGlmcmVxICppZnIpOworc3RhdGljIGludCBlMTAwX3NldF9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgc3RydWN0IGlmbWFwKiBtYXApOworc3RhdGljIHZvaWQgZTEwMF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplMTAwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGUxMDBfaGFyZHdhcmVfc2VuZF9wYWNrZXQoY2hhciAqYnVmLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9yeF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV90eF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKTsKK3N0YXRpYyBpbnQgZTEwMF9wcm9iZV90cmFuc2NlaXZlcihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKworc3RhdGljIHZvaWQgZTEwMF9jaGVja19zcGVlZCh1bnNpZ25lZCBsb25nIHByaXYpOworc3RhdGljIHZvaWQgZTEwMF9zZXRfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdW5zaWduZWQgbG9uZyBzcGVlZCk7CitzdGF0aWMgdm9pZCBlMTAwX2NoZWNrX2R1cGxleCh1bnNpZ25lZCBsb25nIHByaXYpOworc3RhdGljIHZvaWQgZTEwMF9zZXRfZHVwbGV4KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIGVudW0gZHVwbGV4KTsKK3N0YXRpYyB2b2lkIGUxMDBfbmVnb3RpYXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworCitzdGF0aWMgaW50IGUxMDBfZ2V0X21kaW9fcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCBlMTAwX3NldF9tZGlvX3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSk7CisKK3N0YXRpYyB2b2lkIGUxMDBfc2VuZF9tZGlvX2NtZCh1bnNpZ25lZCBzaG9ydCBjbWQsIGludCB3cml0ZV9jbWQpOworc3RhdGljIHZvaWQgZTEwMF9zZW5kX21kaW9fYml0KHVuc2lnbmVkIGNoYXIgYml0KTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGUxMDBfcmVjZWl2ZV9tZGlvX2JpdCh2b2lkKTsKK3N0YXRpYyB2b2lkIGUxMDBfcmVzZXRfdHJhbnNjZWl2ZXIoc3RydWN0IG5ldF9kZXZpY2UqIG5ldCk7CisKK3N0YXRpYyB2b2lkIGUxMDBfY2xlYXJfbmV0d29ya19sZWRzKHVuc2lnbmVkIGxvbmcgZHVtbXkpOworc3RhdGljIHZvaWQgZTEwMF9zZXRfbmV0d29ya19sZWRzKGludCBhY3RpdmUpOworCitzdGF0aWMgdm9pZCBicm9hZGNvbV9jaGVja19zcGVlZChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyB2b2lkIGJyb2FkY29tX2NoZWNrX2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyB2b2lkIHRka19jaGVja19zcGVlZChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyB2b2lkIHRka19jaGVja19kdXBsZXgoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgdm9pZCBpbnRlbF9jaGVja19zcGVlZChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyB2b2lkIGludGVsX2NoZWNrX2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyB2b2lkIGdlbmVyaWNfY2hlY2tfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgdm9pZCBnZW5lcmljX2NoZWNrX2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKworc3RydWN0IHRyYW5zY2VpdmVyX29wcyB0cmFuc2NlaXZlcnNbXSA9Cit7CisJezB4MTAxOCwgYnJvYWRjb21fY2hlY2tfc3BlZWQsIGJyb2FkY29tX2NoZWNrX2R1cGxleH0sICAvKiBCcm9hZGNvbSAqLworCXsweEMwMzksIHRka19jaGVja19zcGVlZCwgdGRrX2NoZWNrX2R1cGxleH0sICAgICAgICAgICAgLyogVERLIDIxMjAgKi8KKwl7MHgwMzlDLCB0ZGtfY2hlY2tfc3BlZWQsIHRka19jaGVja19kdXBsZXh9LCAgICAgICAgICAgIC8qIFRESyAyMTIwQyAqLworICAgICAgICB7MHgwNGRlLCBpbnRlbF9jaGVja19zcGVlZCwgaW50ZWxfY2hlY2tfZHVwbGV4fSwgICAgIAkvKiBJbnRlbCBMWFQ5NzJBKi8KKwl7MHgwMDAwLCBnZW5lcmljX2NoZWNrX3NwZWVkLCBnZW5lcmljX2NoZWNrX2R1cGxleH0gICAgIC8qIEdlbmVyaWMsIG11c3QgYmUgbGFzdCAqLworfTsKKworI2RlZmluZSB0eF9kb25lKGRldikgKCpSX0RNQV9DSDBfQ01EID09IDApCisKKy8qCisgKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0b3Igb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZiBvbmUgZXhpc3RzLgorICogSWYgZGV2LT5iYXNlX2FkZHIgPT0gMCwgcHJvYmUgYWxsIGxpa2VseSBsb2NhdGlvbnMuCisgKiBJZiBkZXYtPmJhc2VfYWRkciA9PSAxLCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCisgKiBJZiBkZXYtPmJhc2VfYWRkciA9PSAyLCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGRldmljZSBhbmQgcmV0dXJuIHN1Y2Nlc3MKKyAqIChkZXRhY2hhYmxlIGRldmljZXMgb25seSkuCisgKi8KKworc3RhdGljIGludCBfX2luaXQKK2V0cmF4X2V0aGVybmV0X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsKiBucDsKKwlpbnQgaSwgZXJyOworCisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiRVRSQVggMTAwTFggMTAvMTAwTUJpdCBldGhlcm5ldCB2Mi4wIChjKSAyMDAwLTIwMDMgQXhpcyBDb21tdW5pY2F0aW9ucyBBQlxuIik7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCW5wID0gZGV2LT5wcml2OworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgaW50KVJfTkVUV09SS19TQV8wOyAvKiBqdXN0IHRvIGhhdmUgc29tZXRoaW5nIHRvIHNob3cgKi8KKworCS8qIG5vdyBzZXR1cCBvdXIgZXRyYXggc3BlY2lmaWMgc3R1ZmYgKi8KKworCWRldi0+aXJxID0gTkVUV09SS19ETUFfUlhfSVJRX05CUjsgLyogd2UgcmVhbGx5IHVzZSBETUFUWCBhcyB3ZWxsLi4uICovCisJZGV2LT5kbWEgPSBORVRXT1JLX1JYX0RNQV9OQlI7CisKKwkvKiBmaWxsIGluIG91ciBoYW5kbGVycyBzbyB0aGUgbmV0d29yayBsYXllciBjYW4gdGFsayB0byB1cyBpbiB0aGUgZnV0dXJlICovCisKKwlkZXYtPm9wZW4gICAgICAgICAgICAgICA9IGUxMDBfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCAgICA9IGUxMDBfc2VuZF9wYWNrZXQ7CisJZGV2LT5zdG9wICAgICAgICAgICAgICAgPSBlMTAwX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzICAgICAgICAgID0gZTEwMF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgICAgPSBlMTAwX3NldF9tYWNfYWRkcmVzczsKKwlkZXYtPmRvX2lvY3RsICAgICAgICAgICA9IGUxMDBfaW9jdGw7CisJZGV2LT5zZXRfY29uZmlnCQk9IGUxMDBfc2V0X2NvbmZpZzsKKwlkZXYtPnR4X3RpbWVvdXQgICAgICAgICA9IGUxMDBfdHhfdGltZW91dDsKKworCS8qIEluaXRpYWxpc2UgdGhlIGxpc3Qgb2YgRXRyYXggRE1BLWRlc2NyaXB0b3JzICovCisKKwkvKiBJbml0aWFsaXNlIHJlY2VpdmUgZGVzY3JpcHRvcnMgKi8KKworCWZvciAoaSA9IDA7IGkgPCBOQlJfT0ZfUlhfREVTQzsgaSsrKSB7CisJCS8qIEFsbG9jYXRlIHR3byBleHRyYSBjYWNoZWxpbmVzIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciB1c2VkIGJ5IERNQQorCQkgKiBkb2VzIG5vdCBzaGFyZSBjYWNoZWxpbmUgd2l0aCBhbnkgb3RoZXIgZGF0YSAodG8gYXZvaWQgY2FjaGUgYnVnKQorCQkgKi8KKwkJUnhEZXNjTGlzdFtpXS5za2IgPSBkZXZfYWxsb2Nfc2tiKE1BWF9NRURJQV9EQVRBX1NJWkUgKyAyICogTDFfQ0FDSEVfQllURVMpOworCQlSeERlc2NMaXN0W2ldLmRlc2NyLmN0cmwgICA9IDA7CisJCVJ4RGVzY0xpc3RbaV0uZGVzY3Iuc3dfbGVuID0gTUFYX01FRElBX0RBVEFfU0laRTsKKwkJUnhEZXNjTGlzdFtpXS5kZXNjci5uZXh0ICAgPSB2aXJ0X3RvX3BoeXMoJlJ4RGVzY0xpc3RbaSArIDFdKTsKKwkJUnhEZXNjTGlzdFtpXS5kZXNjci5idWYgICAgPSBMMV9DQUNIRV9BTElHTih2aXJ0X3RvX3BoeXMoUnhEZXNjTGlzdFtpXS5za2ItPmRhdGEpKTsKKwkJUnhEZXNjTGlzdFtpXS5kZXNjci5zdGF0dXMgPSAwOworCQlSeERlc2NMaXN0W2ldLmRlc2NyLmh3X2xlbiA9IDA7CisJCXByZXBhcmVfcnhfZGVzY3JpcHRvcigmUnhEZXNjTGlzdFtpXS5kZXNjcik7CisJfQorCisJUnhEZXNjTGlzdFtOQlJfT0ZfUlhfREVTQyAtIDFdLmRlc2NyLmN0cmwgICA9IGRfZW9sOworCVJ4RGVzY0xpc3RbTkJSX09GX1JYX0RFU0MgLSAxXS5kZXNjci5uZXh0ICAgPSB2aXJ0X3RvX3BoeXMoJlJ4RGVzY0xpc3RbMF0pOworCXJ4X3F1ZXVlX2xlbiA9IDA7CisKKwkvKiBJbml0aWFsaXplIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCisJZm9yIChpID0gMDsgaSA8IE5CUl9PRl9UWF9ERVNDOyBpKyspIHsKKwkJVHhEZXNjTGlzdFtpXS5kZXNjci5jdHJsICAgPSAwOworCQlUeERlc2NMaXN0W2ldLmRlc2NyLnN3X2xlbiA9IDA7CisJCVR4RGVzY0xpc3RbaV0uZGVzY3IubmV4dCAgID0gdmlydF90b19waHlzKCZUeERlc2NMaXN0W2kgKyAxXS5kZXNjcik7CisJCVR4RGVzY0xpc3RbaV0uZGVzY3IuYnVmICAgID0gMDsKKwkJVHhEZXNjTGlzdFtpXS5kZXNjci5zdGF0dXMgPSAwOworCQlUeERlc2NMaXN0W2ldLmRlc2NyLmh3X2xlbiA9IDA7CisJCVR4RGVzY0xpc3RbaV0uc2tiID0gMDsKKwl9CisKKwlUeERlc2NMaXN0W05CUl9PRl9UWF9ERVNDIC0gMV0uZGVzY3IuY3RybCAgID0gZF9lb2w7CisJVHhEZXNjTGlzdFtOQlJfT0ZfVFhfREVTQyAtIDFdLmRlc2NyLm5leHQgICA9IHZpcnRfdG9fcGh5cygmVHhEZXNjTGlzdFswXS5kZXNjcik7CisKKwkvKiBJbml0aWFsaXNlIGluaXRpYWwgcG9pbnRlcnMgKi8KKworCW15TmV4dFJ4RGVzYyAgPSAmUnhEZXNjTGlzdFswXTsKKwlteUxhc3RSeERlc2MgID0gJlJ4RGVzY0xpc3RbTkJSX09GX1JYX0RFU0MgLSAxXTsKKwlteVByZXZSeERlc2MgID0gJlJ4RGVzY0xpc3RbTkJSX09GX1JYX0RFU0MgLSAxXTsKKwlteUZpcnN0VHhEZXNjID0gJlR4RGVzY0xpc3RbMF07CisJbXlOZXh0VHhEZXNjICA9ICZUeERlc2NMaXN0WzBdOworCW15TGFzdFR4RGVzYyAgPSAmVHhEZXNjTGlzdFtOQlJfT0ZfVFhfREVTQyAtIDFdOworCisJLyogUmVnaXN0ZXIgZGV2aWNlICovCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIHNldCB0aGUgZGVmYXVsdCBNQUMgYWRkcmVzcyAqLworCisJZTEwMF9zZXRfbWFjX2FkZHJlc3MoZGV2LCAmZGVmYXVsdF9tYWMpOworCisJLyogSW5pdGlhbGl6ZSBzcGVlZCBpbmRpY2F0b3Igc3R1ZmYuICovCisKKwljdXJyZW50X3NwZWVkID0gMTA7CisJY3VycmVudF9zcGVlZF9zZWxlY3Rpb24gPSAwOyAvKiBBdXRvICovCisJc3BlZWRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBORVRfTElOS19VUF9DSEVDS19JTlRFUlZBTDsKKyAgICAgICAgZHVwbGV4X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJc3BlZWRfdGltZXIuZnVuY3Rpb24gPSBlMTAwX2NoZWNrX3NwZWVkOworCisJY2xlYXJfbGVkX3RpbWVyLmZ1bmN0aW9uID0gZTEwMF9jbGVhcl9uZXR3b3JrX2xlZHM7CisKKwlmdWxsX2R1cGxleCA9IDA7CisJY3VycmVudF9kdXBsZXggPSBhdXRvbmVnOworCWR1cGxleF90aW1lci5leHBpcmVzID0gamlmZmllcyArIE5FVF9EVVBMRVhfQ0hFQ0tfSU5URVJWQUw7CisgICAgICAgIGR1cGxleF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWR1cGxleF90aW1lci5mdW5jdGlvbiA9IGUxMDBfY2hlY2tfZHVwbGV4OworCisgICAgICAgIC8qIEluaXRpYWxpemUgbWlpIGludGVyZmFjZSAqLworCW5wLT5taWlfaWYucGh5X2lkID0gbWRpb19waHlfYWRkcjsKKwlucC0+bWlpX2lmLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlucC0+bWlpX2lmLnJlZ19udW1fbWFzayA9IDB4MWY7CisJbnAtPm1paV9pZi5kZXYgPSBkZXY7CisJbnAtPm1paV9pZi5tZGlvX3JlYWQgPSBlMTAwX2dldF9tZGlvX3JlZzsKKwlucC0+bWlpX2lmLm1kaW9fd3JpdGUgPSBlMTAwX3NldF9tZGlvX3JlZzsKKworCS8qIEluaXRpYWxpemUgZ3JvdXAgYWRkcmVzcyByZWdpc3RlcnMgdG8gbWFrZSBzdXJlIHRoYXQgbm8gKi8KKwkvKiB1bndhbnRlZCBhZGRyZXNzZXMgYXJlIG1hdGNoZWQgKi8KKwkqUl9ORVRXT1JLX0dBXzAgPSAweDAwMDAwMDAwOworCSpSX05FVFdPUktfR0FfMSA9IDB4MDAwMDAwMDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIHNldCBNQUMgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlLiBjYWxsZWQgZnJvbSB0aGUgY29yZSBhZnRlciBhCisgKiBTSU9DU0lGQUREUiBpb2N0bCwgYW5kIGZyb20gdGhlIGJvb3R1cCBhYm92ZS4KKyAqLworCitzdGF0aWMgaW50CitlMTAwX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5wID0gKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXY7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKKwlpbnQgaTsKKworCXNwaW5fbG9jaygmbnAtPmxvY2spOyAvKiBwcmVlbXB0aW9uIHByb3RlY3Rpb24gKi8KKworCS8qIHJlbWVtYmVyIGl0ICovCisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisKKwkvKiBXcml0ZSBpdCB0byB0aGUgaGFyZHdhcmUuCisJICogTm90ZSB0aGUgd2F5IHRoZSBhZGRyZXNzIGlzIHdyYXBwZWQ6CisJICogKlJfTkVUV09SS19TQV8wID0gYTBfMCB8IChhMF8xIDw8IDgpIHwgKGEwXzIgPDwgMTYpIHwgKGEwXzMgPDwgMjQpOworCSAqICpSX05FVFdPUktfU0FfMSA9IGEwXzQgfCAoYTBfNSA8PCA4KTsKKwkgKi8KKworCSpSX05FVFdPUktfU0FfMCA9IGRldi0+ZGV2X2FkZHJbMF0gfCAoZGV2LT5kZXZfYWRkclsxXSA8PCA4KSB8CisJCShkZXYtPmRldl9hZGRyWzJdIDw8IDE2KSB8IChkZXYtPmRldl9hZGRyWzNdIDw8IDI0KTsKKwkqUl9ORVRXT1JLX1NBXzEgPSBkZXYtPmRldl9hZGRyWzRdIHwgKGRldi0+ZGV2X2FkZHJbNV0gPDwgOCk7CisJKlJfTkVUV09SS19TQV8yID0gMDsKKworCS8qIHNob3cgaXQgaW4gdGhlIGxvZyBhcyB3ZWxsICovCisKKwlwcmludGsoS0VSTl9JTkZPICIlczogY2hhbmdlZCBNQUMgdG8gIiwgZGV2LT5uYW1lKTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCXByaW50aygiJTAyWDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKworCXByaW50aygiJTAyWFxuIiwgZGV2LT5kZXZfYWRkcltpXSk7CisKKwlzcGluX3VubG9jaygmbnAtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICogc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCisKK3N0YXRpYyBpbnQKK2UxMDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBlbmFibGUgdGhlIE1ESU8gb3V0cHV0IHBpbiAqLworCisJKlJfTkVUV09SS19NR01fQ1RSTCA9IElPX1NUQVRFKFJfTkVUV09SS19NR01fQ1RSTCwgbWRvZSwgZW5hYmxlKTsKKworCSpSX0lSUV9NQVNLMF9DTFIgPQorCQlJT19TVEFURShSX0lSUV9NQVNLMF9DTFIsIG92ZXJydW4sIGNscikgfAorCQlJT19TVEFURShSX0lSUV9NQVNLMF9DTFIsIHVuZGVycnVuLCBjbHIpIHwKKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzBfQ0xSLCBleGNlc3NpdmVfY29sLCBjbHIpOworCisJLyogY2xlYXIgZG1hMCBhbmQgMSBlb3AgYW5kIGRlc2NyIGlycSBtYXNrcyAqLworCSpSX0lSUV9NQVNLMl9DTFIgPQorCQlJT19TVEFURShSX0lSUV9NQVNLMl9DTFIsIGRtYTBfZGVzY3IsIGNscikgfAorCQlJT19TVEFURShSX0lSUV9NQVNLMl9DTFIsIGRtYTBfZW9wLCBjbHIpIHwKKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfQ0xSLCBkbWExX2Rlc2NyLCBjbHIpIHwKKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfQ0xSLCBkbWExX2VvcCwgY2xyKTsKKworCS8qIFJlc2V0IGFuZCB3YWl0IGZvciB0aGUgRE1BIGNoYW5uZWxzICovCisKKwlSRVNFVF9ETUEoTkVUV09SS19UWF9ETUFfTkJSKTsKKwlSRVNFVF9ETUEoTkVUV09SS19SWF9ETUFfTkJSKTsKKwlXQUlUX0RNQShORVRXT1JLX1RYX0RNQV9OQlIpOworCVdBSVRfRE1BKE5FVFdPUktfUlhfRE1BX05CUik7CisKKwkvKiBJbml0aWFsaXNlIHRoZSBldHJheCBuZXR3b3JrIGNvbnRyb2xsZXIgKi8KKworCS8qIGFsbG9jYXRlIHRoZSBpcnEgY29ycmVzcG9uZGluZyB0byB0aGUgcmVjZWl2aW5nIERNQSAqLworCisJaWYgKHJlcXVlc3RfaXJxKE5FVFdPUktfRE1BX1JYX0lSUV9OQlIsIGUxMDByeHR4X2ludGVycnVwdCwKKwkJCVNBX1NBTVBMRV9SQU5ET00sIGNhcmRuYW1lLCAodm9pZCAqKWRldikpIHsKKwkJZ290byBncmFjZV9leGl0MDsKKwl9CisKKwkvKiBhbGxvY2F0ZSB0aGUgaXJxIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRyYW5zbWl0dGluZyBETUEgKi8KKworCWlmIChyZXF1ZXN0X2lycShORVRXT1JLX0RNQV9UWF9JUlFfTkJSLCBlMTAwcnh0eF9pbnRlcnJ1cHQsIDAsCisJCQljYXJkbmFtZSwgKHZvaWQgKilkZXYpKSB7CisJCWdvdG8gZ3JhY2VfZXhpdDE7CisJfQorCisJLyogYWxsb2NhdGUgdGhlIGlycSBjb3JyZXNwb25kaW5nIHRvIHRoZSBuZXR3b3JrIGVycm9ycyBldGMgKi8KKworCWlmIChyZXF1ZXN0X2lycShORVRXT1JLX1NUQVRVU19JUlFfTkJSLCBlMTAwbndfaW50ZXJydXB0LCAwLAorCQkJY2FyZG5hbWUsICh2b2lkICopZGV2KSkgeworCQlnb3RvIGdyYWNlX2V4aXQyOworCX0KKworCS8qIGdpdmUgdGhlIEhXIGFuIGlkZWEgb2Ygd2hhdCBNQUMgYWRkcmVzcyB3ZSB3YW50ICovCisKKwkqUl9ORVRXT1JLX1NBXzAgPSBkZXYtPmRldl9hZGRyWzBdIHwgKGRldi0+ZGV2X2FkZHJbMV0gPDwgOCkgfAorCQkoZGV2LT5kZXZfYWRkclsyXSA8PCAxNikgfCAoZGV2LT5kZXZfYWRkclszXSA8PCAyNCk7CisJKlJfTkVUV09SS19TQV8xID0gZGV2LT5kZXZfYWRkcls0XSB8IChkZXYtPmRldl9hZGRyWzVdIDw8IDgpOworCSpSX05FVFdPUktfU0FfMiA9IDA7CisKKyNpZiAwCisJLyogdXNlIHByb21pc2N1b3VzIG1vZGUgZm9yIHRlc3RpbmcgKi8KKwkqUl9ORVRXT1JLX0dBXzAgPSAweGZmZmZmZmZmOworCSpSX05FVFdPUktfR0FfMSA9IDB4ZmZmZmZmZmY7CisKKwkqUl9ORVRXT1JLX1JFQ19DT05GSUcgPSAweGQ7IC8qIGJyb2FkY2FzdCByZWMsIGluZGl2aWQuIHJlYywgbWEwIGVuYWJsZWQgKi8KKyNlbHNlCisJU0VUUyhuZXR3b3JrX3JlY19jb25maWdfc2hhZG93LCBSX05FVFdPUktfUkVDX0NPTkZJRywgYnJvYWRjYXN0LCByZWNlaXZlKTsKKwlTRVRTKG5ldHdvcmtfcmVjX2NvbmZpZ19zaGFkb3csIFJfTkVUV09SS19SRUNfQ09ORklHLCBtYTAsIGVuYWJsZSk7CisJU0VURihuZXR3b3JrX3JlY19jb25maWdfc2hhZG93LCBSX05FVFdPUktfUkVDX0NPTkZJRywgZHVwbGV4LCBmdWxsX2R1cGxleCk7CisJKlJfTkVUV09SS19SRUNfQ09ORklHID0gbmV0d29ya19yZWNfY29uZmlnX3NoYWRvdzsKKyNlbmRpZgorCisJKlJfTkVUV09SS19HRU5fQ09ORklHID0KKwkJSU9fU1RBVEUoUl9ORVRXT1JLX0dFTl9DT05GSUcsIHBoeSwgICAgbWlpX2NsaykgfAorCQlJT19TVEFURShSX05FVFdPUktfR0VOX0NPTkZJRywgZW5hYmxlLCBvbik7CisKKwlTRVRTKG5ldHdvcmtfdHJfY3RybF9zaGFkb3csIFJfTkVUV09SS19UUl9DVFJMLCBjbHJfZXJyb3IsIGNscik7CisJU0VUUyhuZXR3b3JrX3RyX2N0cmxfc2hhZG93LCBSX05FVFdPUktfVFJfQ1RSTCwgZGVsYXksIG5vbmUpOworCVNFVFMobmV0d29ya190cl9jdHJsX3NoYWRvdywgUl9ORVRXT1JLX1RSX0NUUkwsIGNhbmNlbCwgZG9udCk7CisJU0VUUyhuZXR3b3JrX3RyX2N0cmxfc2hhZG93LCBSX05FVFdPUktfVFJfQ1RSTCwgY2QsIGVuYWJsZSk7CisJU0VUUyhuZXR3b3JrX3RyX2N0cmxfc2hhZG93LCBSX05FVFdPUktfVFJfQ1RSTCwgcmV0cnksIGVuYWJsZSk7CisJU0VUUyhuZXR3b3JrX3RyX2N0cmxfc2hhZG93LCBSX05FVFdPUktfVFJfQ1RSTCwgcGFkLCBlbmFibGUpOworCVNFVFMobmV0d29ya190cl9jdHJsX3NoYWRvdywgUl9ORVRXT1JLX1RSX0NUUkwsIGNyYywgZW5hYmxlKTsKKwkqUl9ORVRXT1JLX1RSX0NUUkwgPSBuZXR3b3JrX3RyX2N0cmxfc2hhZG93OworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKwkvKiBlbmFibGUgdGhlIGlycSdzIGZvciBldGhlcm5ldCBETUEgKi8KKworCSpSX0lSUV9NQVNLMl9TRVQgPQorCQlJT19TVEFURShSX0lSUV9NQVNLMl9TRVQsIGRtYTBfZW9wLCBzZXQpIHwKKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfU0VULCBkbWExX2VvcCwgc2V0KTsKKworCSpSX0lSUV9NQVNLMF9TRVQgPQorCQlJT19TVEFURShSX0lSUV9NQVNLMF9TRVQsIG92ZXJydW4sICAgICAgIHNldCkgfAorCQlJT19TVEFURShSX0lSUV9NQVNLMF9TRVQsIHVuZGVycnVuLCAgICAgIHNldCkgfAorCQlJT19TVEFURShSX0lSUV9NQVNLMF9TRVQsIGV4Y2Vzc2l2ZV9jb2wsIHNldCk7CisKKwkvKiBtYWtlIHN1cmUgdGhlIGlycXMgYXJlIGNsZWFyZWQgKi8KKworCSpSX0RNQV9DSDBfQ0xSX0lOVFIgPSBJT19TVEFURShSX0RNQV9DSDBfQ0xSX0lOVFIsIGNscl9lb3AsIGRvKTsKKwkqUl9ETUFfQ0gxX0NMUl9JTlRSID0gSU9fU1RBVEUoUl9ETUFfQ0gxX0NMUl9JTlRSLCBjbHJfZW9wLCBkbyk7CisKKwkvKiBtYWtlIHN1cmUgdGhlIHJlYyBhbmQgdHJhbnNtaXQgZXJyb3IgY291bnRlcnMgYXJlIGNsZWFyZWQgKi8KKworCSh2b2lkKSpSX1JFQ19DT1VOVEVSUzsgIC8qIGR1bW15IHJlYWQgKi8KKwkodm9pZCkqUl9UUl9DT1VOVEVSUzsgICAvKiBkdW1teSByZWFkICovCisKKwkvKiBzdGFydCB0aGUgcmVjZWl2aW5nIERNQSBjaGFubmVsIHNvIHdlIGNhbiByZWNlaXZlIHBhY2tldHMgZnJvbSBub3cgb24gKi8KKworCSpSX0RNQV9DSDFfRklSU1QgPSB2aXJ0X3RvX3BoeXMobXlOZXh0UnhEZXNjKTsKKwkqUl9ETUFfQ0gxX0NNRCA9IElPX1NUQVRFKFJfRE1BX0NIMV9DTUQsIGNtZCwgc3RhcnQpOworCisJLyogU2V0IHVwIHRyYW5zbWl0IERNQSBjaGFubmVsIHNvIGl0IGNhbiBiZSByZXN0YXJ0ZWQgbGF0ZXIgKi8KKworCSpSX0RNQV9DSDBfRklSU1QgPSAwOworCSpSX0RNQV9DSDBfREVTQ1IgPSB2aXJ0X3RvX3BoeXMobXlMYXN0VHhEZXNjKTsKKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJLyogUHJvYmUgZm9yIHRyYW5zY2VpdmVyICovCisJaWYgKGUxMDBfcHJvYmVfdHJhbnNjZWl2ZXIoZGV2KSkKKwkJZ290byBncmFjZV9leGl0MzsKKworCS8qIFN0YXJ0IGR1cGxleC9zcGVlZCB0aW1lcnMgKi8KKwlhZGRfdGltZXIoJnNwZWVkX3RpbWVyKTsKKwlhZGRfdGltZXIoJmR1cGxleF90aW1lcik7CisKKwkvKiBXZSBhcmUgbm93IHJlYWR5IHRvIGFjY2VwdCB0cmFuc21pdCByZXF1ZXVzdHMgZnJvbQorCSAqIHRoZSBxdWV1ZWluZyBsYXllciBvZiB0aGUgbmV0d29ya2luZy4KKwkgKi8KKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7CisKK2dyYWNlX2V4aXQzOgorCWZyZWVfaXJxKE5FVFdPUktfU1RBVFVTX0lSUV9OQlIsICh2b2lkICopZGV2KTsKK2dyYWNlX2V4aXQyOgorCWZyZWVfaXJxKE5FVFdPUktfRE1BX1RYX0lSUV9OQlIsICh2b2lkICopZGV2KTsKK2dyYWNlX2V4aXQxOgorCWZyZWVfaXJxKE5FVFdPUktfRE1BX1JYX0lSUV9OQlIsICh2b2lkICopZGV2KTsKK2dyYWNlX2V4aXQwOgorCXJldHVybiAtRUFHQUlOOworfQorCisKK3N0YXRpYyB2b2lkCitnZW5lcmljX2NoZWNrX3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWRhdGEgPSBlMTAwX2dldF9tZGlvX3JlZyhkZXYsIG1kaW9fcGh5X2FkZHIsIE1JSV9BRFZFUlRJU0UpOworCWlmICgoZGF0YSAmIEFEVkVSVElTRV8xMDBGVUxMKSB8fAorCSAgICAoZGF0YSAmIEFEVkVSVElTRV8xMDBIQUxGKSkKKwkJY3VycmVudF9zcGVlZCA9IDEwMDsKKwllbHNlCisJCWN1cnJlbnRfc3BlZWQgPSAxMDsKK30KKworc3RhdGljIHZvaWQKK3Rka19jaGVja19zcGVlZChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlkYXRhID0gZTEwMF9nZXRfbWRpb19yZWcoZGV2LCBtZGlvX3BoeV9hZGRyLCBNRElPX1RES19ESUFHTk9TVElDX1JFRyk7CisJY3VycmVudF9zcGVlZCA9IChkYXRhICYgTURJT19UREtfRElBR05PU1RJQ19SQVRFID8gMTAwIDogMTApOworfQorCitzdGF0aWMgdm9pZAorYnJvYWRjb21fY2hlY2tfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJZGF0YSA9IGUxMDBfZ2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgTURJT19BVVhfQ1RSTF9TVEFUVVNfUkVHKTsKKwljdXJyZW50X3NwZWVkID0gKGRhdGEgJiBNRElPX0JDX1NQRUVEID8gMTAwIDogMTApOworfQorCitzdGF0aWMgdm9pZAoraW50ZWxfY2hlY2tfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJZGF0YSA9IGUxMDBfZ2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgTURJT19JTlRfU1RBVFVTX1JFR18yKTsKKwljdXJyZW50X3NwZWVkID0gKGRhdGEgJiBNRElPX0lOVF9TUEVFRCA/IDEwMCA6IDEwKTsKK30KKworc3RhdGljIHZvaWQKK2UxMDBfY2hlY2tfc3BlZWQodW5zaWduZWQgbG9uZyBwcml2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UqKXByaXY7CisJc3RhdGljIGludCBsZWRfaW5pdGlhdGVkID0gMDsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IG9sZF9zcGVlZCA9IGN1cnJlbnRfc3BlZWQ7CisKKwlkYXRhID0gZTEwMF9nZXRfbWRpb19yZWcoZGV2LCBtZGlvX3BoeV9hZGRyLCBNSUlfQk1TUik7CisJaWYgKCEoZGF0YSAmIEJNU1JfTFNUQVRVUykpIHsKKwkJY3VycmVudF9zcGVlZCA9IDA7CisJfSBlbHNlIHsKKwkJdHJhbnNjZWl2ZXItPmNoZWNrX3NwZWVkKGRldik7CisJfQorCisJaWYgKChvbGRfc3BlZWQgIT0gY3VycmVudF9zcGVlZCkgfHwgIWxlZF9pbml0aWF0ZWQpIHsKKwkJbGVkX2luaXRpYXRlZCA9IDE7CisJCWUxMDBfc2V0X25ldHdvcmtfbGVkcyhOT19ORVRXT1JLX0FDVElWSVRZKTsKKwl9CisKKwkvKiBSZWluaXRpYWxpemUgdGhlIHRpbWVyLiAqLworCXNwZWVkX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTkVUX0xJTktfVVBfQ0hFQ0tfSU5URVJWQUw7CisJYWRkX3RpbWVyKCZzcGVlZF90aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwX25lZ290aWF0ZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXVuc2lnbmVkIHNob3J0IGRhdGEgPSBlMTAwX2dldF9tZGlvX3JlZyhkZXYsIG1kaW9fcGh5X2FkZHIsIE1JSV9BRFZFUlRJU0UpOworCisJLyogRGlzY2FyZCBvbGQgc3BlZWQgYW5kIGR1cGxleCBzZXR0aW5ncyAqLworCWRhdGEgJj0gfihBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMIHwKKwkgICAgICAgICAgQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV8xMEZVTEwpOworCisJc3dpdGNoIChjdXJyZW50X3NwZWVkX3NlbGVjdGlvbikgeworCQljYXNlIDEwIDoKKwkJCWlmIChjdXJyZW50X2R1cGxleCA9PSBmdWxsKQorCQkJCWRhdGEgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwkJCWVsc2UgaWYgKGN1cnJlbnRfZHVwbGV4ID09IGhhbGYpCisJCQkJZGF0YSB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQkJZWxzZQorCQkJCWRhdGEgfD0gQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV8xMEZVTEw7CisJCQlicmVhazsKKworCQljYXNlIDEwMCA6CisJCQkgaWYgKGN1cnJlbnRfZHVwbGV4ID09IGZ1bGwpCisJCQkJZGF0YSB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwkJCWVsc2UgaWYgKGN1cnJlbnRfZHVwbGV4ID09IGhhbGYpCisJCQkJZGF0YSB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKKwkJCWVsc2UKKwkJCQlkYXRhIHw9IEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwMEZVTEw7CisJCQlicmVhazsKKworCQljYXNlIDAgOiAvKiBBdXRvICovCisJCQkgaWYgKGN1cnJlbnRfZHVwbGV4ID09IGZ1bGwpCisJCQkJZGF0YSB8PSBBRFZFUlRJU0VfMTAwRlVMTCB8IEFEVkVSVElTRV8xMEZVTEw7CisJCQllbHNlIGlmIChjdXJyZW50X2R1cGxleCA9PSBoYWxmKQorCQkJCWRhdGEgfD0gQURWRVJUSVNFXzEwMEhBTEYgfCBBRFZFUlRJU0VfMTBIQUxGOworCQkJZWxzZQorCQkJCWRhdGEgfD0gQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV8xMEZVTEwgfAorCQkJCSAgQURWRVJUSVNFXzEwMEhBTEYgfCBBRFZFUlRJU0VfMTAwRlVMTDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQgOiAvKiBhc3N1bWUgYXV0b25lZyBzcGVlZCBhbmQgZHVwbGV4ICovCisJCQlkYXRhIHw9IEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMIHwKKwkJCQkgIEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwMEZVTEw7CisJfQorCisJZTEwMF9zZXRfbWRpb19yZWcoZGV2LCBtZGlvX3BoeV9hZGRyLCBNSUlfQURWRVJUSVNFLCBkYXRhKTsKKworCS8qIFJlbmVnb3RpYXRlIHdpdGggbGluayBwYXJ0bmVyICovCisJZGF0YSA9IGUxMDBfZ2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgTUlJX0JNQ1IpOworCWRhdGEgfD0gQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUOworCisJZTEwMF9zZXRfbWRpb19yZWcoZGV2LCBtZGlvX3BoeV9hZGRyLCBNSUlfQk1DUiwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwX3NldF9zcGVlZChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1bnNpZ25lZCBsb25nIHNwZWVkKQoreworCWlmIChzcGVlZCAhPSBjdXJyZW50X3NwZWVkX3NlbGVjdGlvbikgeworCQljdXJyZW50X3NwZWVkX3NlbGVjdGlvbiA9IHNwZWVkOworCQllMTAwX25lZ290aWF0ZShkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQKK2UxMDBfY2hlY2tfZHVwbGV4KHVuc2lnbmVkIGxvbmcgcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcHJpdjsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopZGV2LT5wcml2OworCWludCBvbGRfZHVwbGV4ID0gZnVsbF9kdXBsZXg7CisJdHJhbnNjZWl2ZXItPmNoZWNrX2R1cGxleChkZXYpOworCWlmIChvbGRfZHVwbGV4ICE9IGZ1bGxfZHVwbGV4KSB7CisJCS8qIER1cGxleCBjaGFuZ2VkICovCisJCVNFVEYobmV0d29ya19yZWNfY29uZmlnX3NoYWRvdywgUl9ORVRXT1JLX1JFQ19DT05GSUcsIGR1cGxleCwgZnVsbF9kdXBsZXgpOworCQkqUl9ORVRXT1JLX1JFQ19DT05GSUcgPSBuZXR3b3JrX3JlY19jb25maWdfc2hhZG93OworCX0KKworCS8qIFJlaW5pdGlhbGl6ZSB0aGUgdGltZXIuICovCisJZHVwbGV4X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTkVUX0RVUExFWF9DSEVDS19JTlRFUlZBTDsKKwlhZGRfdGltZXIoJmR1cGxleF90aW1lcik7CisJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IGZ1bGxfZHVwbGV4OworfQorCitzdGF0aWMgdm9pZAorZ2VuZXJpY19jaGVja19kdXBsZXgoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJZGF0YSA9IGUxMDBfZ2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgTUlJX0FEVkVSVElTRSk7CisJaWYgKChkYXRhICYgQURWRVJUSVNFXzEwRlVMTCkgfHwKKwkgICAgKGRhdGEgJiBBRFZFUlRJU0VfMTAwRlVMTCkpCisJCWZ1bGxfZHVwbGV4ID0gMTsKKwllbHNlCisJCWZ1bGxfZHVwbGV4ID0gMDsKK30KKworc3RhdGljIHZvaWQKK3Rka19jaGVja19kdXBsZXgoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJZGF0YSA9IGUxMDBfZ2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgTURJT19UREtfRElBR05PU1RJQ19SRUcpOworCWZ1bGxfZHVwbGV4ID0gKGRhdGEgJiBNRElPX1RES19ESUFHTk9TVElDX0RQTFgpID8gMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkCiticm9hZGNvbV9jaGVja19kdXBsZXgoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJZGF0YSA9IGUxMDBfZ2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgTURJT19BVVhfQ1RSTF9TVEFUVVNfUkVHKTsKKwlmdWxsX2R1cGxleCA9IChkYXRhICYgTURJT19CQ19GVUxMX0RVUExFWF9JTkQpID8gMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkCitpbnRlbF9jaGVja19kdXBsZXgoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJZGF0YSA9IGUxMDBfZ2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgTURJT19JTlRfU1RBVFVTX1JFR18yKTsKKwlmdWxsX2R1cGxleCA9IChkYXRhICYgTURJT19JTlRfRlVMTF9EVVBMRVhfSU5EKSA/IDEgOiAwOworfQorCitzdGF0aWMgdm9pZAorZTEwMF9zZXRfZHVwbGV4KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIGVudW0gZHVwbGV4IG5ld19kdXBsZXgpCit7CisJaWYgKG5ld19kdXBsZXggIT0gY3VycmVudF9kdXBsZXgpIHsKKwkJY3VycmVudF9kdXBsZXggPSBuZXdfZHVwbGV4OworCQllMTAwX25lZ290aWF0ZShkZXYpOworCX0KK30KKworc3RhdGljIGludAorZTEwMF9wcm9iZV90cmFuc2NlaXZlcihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXVuc2lnbmVkIGludCBwaHlpZF9oaWdoOworCXVuc2lnbmVkIGludCBwaHlpZF9sb3c7CisJdW5zaWduZWQgaW50IG91aTsKKwlzdHJ1Y3QgdHJhbnNjZWl2ZXJfb3BzKiBvcHMgPSBOVUxMOworCisJLyogUHJvYmUgTURJTyBwaHlzaWNhbCBhZGRyZXNzICovCisJZm9yIChtZGlvX3BoeV9hZGRyID0gMDsgbWRpb19waHlfYWRkciA8PSAzMTsgbWRpb19waHlfYWRkcisrKSB7CisJCWlmIChlMTAwX2dldF9tZGlvX3JlZyhkZXYsIG1kaW9fcGh5X2FkZHIsIE1JSV9CTVNSKSAhPSAweGZmZmYpCisJCQlicmVhazsKKwl9CisJaWYgKG1kaW9fcGh5X2FkZHIgPT0gMzIpCisJCSByZXR1cm4gLUVOT0RFVjsKKworCS8qIEdldCBtYW51ZmFjdHVyZXIgKi8KKwlwaHlpZF9oaWdoID0gZTEwMF9nZXRfbWRpb19yZWcoZGV2LCBtZGlvX3BoeV9hZGRyLCBNSUlfUEhZU0lEMSk7CisJcGh5aWRfbG93ID0gZTEwMF9nZXRfbWRpb19yZWcoZGV2LCBtZGlvX3BoeV9hZGRyLCBNSUlfUEhZU0lEMik7CisJb3VpID0gKHBoeWlkX2hpZ2ggPDwgNikgfCAocGh5aWRfbG93ID4+IDEwKTsKKworCWZvciAob3BzID0gJnRyYW5zY2VpdmVyc1swXTsgb3BzLT5vdWk7IG9wcysrKSB7CisJCWlmIChvcHMtPm91aSA9PSBvdWkpCisJCQlicmVhazsKKwl9CisJdHJhbnNjZWl2ZXIgPSBvcHM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZTEwMF9nZXRfbWRpb19yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCXVuc2lnbmVkIHNob3J0IGNtZDsgICAgLyogRGF0YSB0byBiZSBzZW50IG9uIE1ESU8gcG9ydCAqLworCWludCBkYXRhOyAgIC8qIERhdGEgcmVhZCBmcm9tIE1ESU8gKi8KKwlpbnQgYml0Q291bnRlcjsKKworCS8qIFN0YXJ0IG9mIGZyYW1lLCBPUCBDb2RlLCBQaHlzaWNhbCBBZGRyZXNzLCBSZWdpc3RlciBBZGRyZXNzICovCisJY21kID0gKE1ESU9fU1RBUlQgPDwgMTQpIHwgKE1ESU9fUkVBRCA8PCAxMikgfCAocGh5X2lkIDw8IDcpIHwKKwkJKGxvY2F0aW9uIDw8IDIpOworCisJZTEwMF9zZW5kX21kaW9fY21kKGNtZCwgMCk7CisKKwlkYXRhID0gMDsKKworCS8qIERhdGEuLi4gKi8KKwlmb3IgKGJpdENvdW50ZXI9MTU7IGJpdENvdW50ZXI+PTAgOyBiaXRDb3VudGVyLS0pIHsKKwkJZGF0YSB8PSAoZTEwMF9yZWNlaXZlX21kaW9fYml0KCkgPDwgYml0Q291bnRlcik7CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwX3NldF9tZGlvX3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlpbnQgYml0Q291bnRlcjsKKwl1bnNpZ25lZCBzaG9ydCBjbWQ7CisKKwljbWQgPSAoTURJT19TVEFSVCA8PCAxNCkgfCAoTURJT19XUklURSA8PCAxMikgfCAocGh5X2lkIDw8IDcpIHwKKwkgICAgICAobG9jYXRpb24gPDwgMik7CisKKwllMTAwX3NlbmRfbWRpb19jbWQoY21kLCAxKTsKKworCS8qIERhdGEuLi4gKi8KKwlmb3IgKGJpdENvdW50ZXI9MTU7IGJpdENvdW50ZXI+PTAgOyBiaXRDb3VudGVyLS0pIHsKKwkJZTEwMF9zZW5kX21kaW9fYml0KEdFVF9CSVQoYml0Q291bnRlciwgdmFsdWUpKTsKKwl9CisKK30KKworc3RhdGljIHZvaWQKK2UxMDBfc2VuZF9tZGlvX2NtZCh1bnNpZ25lZCBzaG9ydCBjbWQsIGludCB3cml0ZV9jbWQpCit7CisJaW50IGJpdENvdW50ZXI7CisJdW5zaWduZWQgY2hhciBkYXRhID0gMHgyOworCisJLyogUHJlYW1ibGUgKi8KKwlmb3IgKGJpdENvdW50ZXIgPSAzMTsgYml0Q291bnRlcj49IDA7IGJpdENvdW50ZXItLSkKKwkJZTEwMF9zZW5kX21kaW9fYml0KEdFVF9CSVQoYml0Q291bnRlciwgTURJT19QUkVBTUJMRSkpOworCisJZm9yIChiaXRDb3VudGVyID0gMTU7IGJpdENvdW50ZXIgPj0gMjsgYml0Q291bnRlci0tKQorCQllMTAwX3NlbmRfbWRpb19iaXQoR0VUX0JJVChiaXRDb3VudGVyLCBjbWQpKTsKKworCS8qIFR1cm5hcm91bmQgKi8KKwlmb3IgKGJpdENvdW50ZXIgPSAxOyBiaXRDb3VudGVyID49IDAgOyBiaXRDb3VudGVyLS0pCisJCWlmICh3cml0ZV9jbWQpCisJCQllMTAwX3NlbmRfbWRpb19iaXQoR0VUX0JJVChiaXRDb3VudGVyLCBkYXRhKSk7CisJCWVsc2UKKwkJCWUxMDBfcmVjZWl2ZV9tZGlvX2JpdCgpOworfQorCitzdGF0aWMgdm9pZAorZTEwMF9zZW5kX21kaW9fYml0KHVuc2lnbmVkIGNoYXIgYml0KQoreworCSpSX05FVFdPUktfTUdNX0NUUkwgPQorCQlJT19TVEFURShSX05FVFdPUktfTUdNX0NUUkwsIG1kb2UsIGVuYWJsZSkgfAorCQlJT19GSUVMRChSX05FVFdPUktfTUdNX0NUUkwsIG1kaW8sIGJpdCk7CisJdWRlbGF5KDEpOworCSpSX05FVFdPUktfTUdNX0NUUkwgPQorCQlJT19TVEFURShSX05FVFdPUktfTUdNX0NUUkwsIG1kb2UsIGVuYWJsZSkgfAorCQlJT19NQVNLKFJfTkVUV09SS19NR01fQ1RSTCwgbWRjaykgfAorCQlJT19GSUVMRChSX05FVFdPUktfTUdNX0NUUkwsIG1kaW8sIGJpdCk7CisJdWRlbGF5KDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorZTEwMF9yZWNlaXZlX21kaW9fYml0KCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJpdDsKKwkqUl9ORVRXT1JLX01HTV9DVFJMID0gMDsKKwliaXQgPSBJT19FWFRSQUNUKFJfTkVUV09SS19TVEFULCBtZGlvLCAqUl9ORVRXT1JLX1NUQVQpOworCXVkZWxheSgxKTsKKwkqUl9ORVRXT1JLX01HTV9DVFJMID0gSU9fTUFTSyhSX05FVFdPUktfTUdNX0NUUkwsIG1kY2spOworCXVkZWxheSgxKTsKKwlyZXR1cm4gYml0OworfQorCitzdGF0aWMgdm9pZAorZTEwMF9yZXNldF90cmFuc2NlaXZlcihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXVuc2lnbmVkIHNob3J0IGNtZDsKKwl1bnNpZ25lZCBzaG9ydCBkYXRhOworCWludCBiaXRDb3VudGVyOworCisJZGF0YSA9IGUxMDBfZ2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgTUlJX0JNQ1IpOworCisJY21kID0gKE1ESU9fU1RBUlQgPDwgMTQpIHwgKE1ESU9fV1JJVEUgPDwgMTIpIHwgKG1kaW9fcGh5X2FkZHIgPDwgNykgfCAoTUlJX0JNQ1IgPDwgMik7CisKKwllMTAwX3NlbmRfbWRpb19jbWQoY21kLCAxKTsKKworCWRhdGEgfD0gMHg4MDAwOworCisJZm9yIChiaXRDb3VudGVyID0gMTU7IGJpdENvdW50ZXIgPj0gMCA7IGJpdENvdW50ZXItLSkgeworCQllMTAwX3NlbmRfbWRpb19iaXQoR0VUX0JJVChiaXRDb3VudGVyLCBkYXRhKSk7CisJfQorfQorCisvKiBDYWxsZWQgYnkgdXBwZXIgbGF5ZXJzIGlmIHRoZXkgZGVjaWRlIGl0IHRvb2sgdG9vIGxvbmcgdG8gY29tcGxldGUKKyAqIHNlbmRpbmcgYSBwYWNrZXQgLSB3ZSBuZWVkIHRvIHJlc2V0IGFuZCBzdHVmZi4KKyAqLworCitzdGF0aWMgdm9pZAorZTEwMF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbnAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5sb2NrLCBmbGFncyk7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCAlcz9cbiIsIGRldi0+bmFtZSwKKwkgICAgICAgdHhfZG9uZShkZXYpID8gIklSUSBwcm9ibGVtIiA6ICJuZXR3b3JrIGNhYmxlIHByb2JsZW0iKTsKKworCS8qIHJlbWVtYmVyIHdlIGdvdCBhbiBlcnJvciAqLworCisJbnAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJLyogcmVzZXQgdGhlIFRYIERNQSBpbiBjYXNlIGl0IGhhcyBodW5nIG9uIHNvbWV0aGluZyAqLworCisJUkVTRVRfRE1BKE5FVFdPUktfVFhfRE1BX05CUik7CisJV0FJVF9ETUEoTkVUV09SS19UWF9ETUFfTkJSKTsKKworCS8qIFJlc2V0IHRoZSB0cmFuc2NlaXZlci4gKi8KKworCWUxMDBfcmVzZXRfdHJhbnNjZWl2ZXIoZGV2KTsKKworCS8qIGFuZCBnZXQgcmlkIG9mIHRoZSBwYWNrZXRzIHRoYXQgbmV2ZXIgZ290IGFuIGludGVycnVwdCAqLworCXdoaWxlIChteUZpcnN0VHhEZXNjICE9IG15TmV4dFR4RGVzYykKKwl7CisJCWRldl9rZnJlZV9za2IobXlGaXJzdFR4RGVzYy0+c2tiKTsKKwkJbXlGaXJzdFR4RGVzYy0+c2tiID0gMDsKKwkJbXlGaXJzdFR4RGVzYyA9IHBoeXNfdG9fdmlydChteUZpcnN0VHhEZXNjLT5kZXNjci5uZXh0KTsKKwl9CisKKwkvKiBTZXQgdXAgdHJhbnNtaXQgRE1BIGNoYW5uZWwgc28gaXQgY2FuIGJlIHJlc3RhcnRlZCBsYXRlciAqLworCSpSX0RNQV9DSDBfRklSU1QgPSAwOworCSpSX0RNQV9DSDBfREVTQ1IgPSB2aXJ0X3RvX3BoeXMobXlMYXN0VHhEZXNjKTsKKworCS8qIHRlbGwgdGhlIHVwcGVyIGxheWVycyB3ZSdyZSBvayBhZ2FpbiAqLworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT5sb2NrLCBmbGFncyk7Cit9CisKKworLyogVGhpcyB3aWxsIG9ubHkgYmUgaW52b2tlZCBpZiB0aGUgZHJpdmVyIGlzIF9ub3RfIGluIFhPRkYgc3RhdGUuCisgKiBXaGF0IHRoaXMgbWVhbnMgaXMgdGhhdCB3ZSBuZWVkIG5vdCBjaGVjayBpdCwgYW5kIHRoYXQgdGhpcworICogaW52YXJpYW50IHdpbGwgaG9sZCBpZiB3ZSBtYWtlIHN1cmUgdGhhdCB0aGUgbmV0aWZfKl9xdWV1ZSgpCisgKiBjYWxscyBhcmUgZG9uZSBhdCB0aGUgcHJvcGVyIHRpbWVzLgorICovCisKK3N0YXRpYyBpbnQKK2UxMDBfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopZGV2LT5wcml2OworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgRVRIREVCVUcKKwlwcmludGsoInNlbmQgcGFja2V0IGxlbiAlZFxuIiwgbGVuZ3RoKTsKKyNlbmRpZgorCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOyAgLyogcHJvdGVjdCBmcm9tIHR4X2ludGVycnVwdCBhbmQgb3Vyc2VsZiAqLworCisJbXlOZXh0VHhEZXNjLT5za2IgPSBza2I7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWUxMDBfaGFyZHdhcmVfc2VuZF9wYWNrZXQoYnVmLCBza2ItPmxlbik7CisKKwlteU5leHRUeERlc2MgPSBwaHlzX3RvX3ZpcnQobXlOZXh0VHhEZXNjLT5kZXNjci5uZXh0KTsKKworCS8qIFN0b3AgcXVldWUgaWYgZnVsbCAqLworCWlmIChteU5leHRUeERlc2MgPT0gbXlGaXJzdFR4RGVzYykgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhlIHR5cGljYWwgd29ya2xvYWQgb2YgdGhlIGRyaXZlcjoKKyAqICAgSGFuZGxlIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpbnRlcnJ1cHRzLgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorZTEwMHJ4dHhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IG5ldF9sb2NhbCAqbnAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlycWJpdHMgPSAqUl9JUlFfTUFTSzJfUkQ7CisKKwkvKiBEaXNhYmxlIFJYL1RYIElSUXMgdG8gYXZvaWQgcmVlbnRyYW5jeSAqLworCSpSX0lSUV9NQVNLMl9DTFIgPQorCSAgSU9fU1RBVEUoUl9JUlFfTUFTSzJfQ0xSLCBkbWEwX2VvcCwgY2xyKSB8CisJICBJT19TVEFURShSX0lSUV9NQVNLMl9DTFIsIGRtYTFfZW9wLCBjbHIpOworCisJLyogSGFuZGxlIHJlY2VpdmVkIHBhY2tldHMgKi8KKwlpZiAoaXJxYml0cyAmIElPX1NUQVRFKFJfSVJRX01BU0syX1JELCBkbWExX2VvcCwgYWN0aXZlKSkgeworCQkvKiBhY2tub3dsZWRnZSB0aGUgZW9wIGludGVycnVwdCAqLworCisJCSpSX0RNQV9DSDFfQ0xSX0lOVFIgPSBJT19TVEFURShSX0RNQV9DSDFfQ0xSX0lOVFIsIGNscl9lb3AsIGRvKTsKKworCQkvKiBjaGVjayBpZiBvbmUgb3IgbW9yZSBjb21wbGV0ZSBwYWNrZXRzIHdlcmUgaW5kZWVkIHJlY2VpdmVkICovCisKKwkJd2hpbGUgKCgqUl9ETUFfQ0gxX0ZJUlNUICE9IHZpcnRfdG9fcGh5cyhteU5leHRSeERlc2MpKSAmJgorCQkgICAgICAgKG15TmV4dFJ4RGVzYyAhPSBteUxhc3RSeERlc2MpKSB7CisJCQkvKiBUYWtlIG91dCB0aGUgYnVmZmVyIGFuZCBnaXZlIGl0IHRvIHRoZSBPUywgdGhlbgorCQkJICogYWxsb2NhdGUgYSBuZXcgYnVmZmVyIHRvIHB1dCBhIHBhY2tldCBpbi4KKwkJCSAqLworCQkJZTEwMF9yeChkZXYpOworCQkJKChzdHJ1Y3QgbmV0X2xvY2FsICopZGV2LT5wcml2KS0+c3RhdHMucnhfcGFja2V0cysrOworCQkJLyogcmVzdGFydC9jb250aW51ZSBvbiB0aGUgY2hhbm5lbCwgZm9yIHNhZmV0eSAqLworCQkJKlJfRE1BX0NIMV9DTUQgPSBJT19TVEFURShSX0RNQV9DSDFfQ01ELCBjbWQsIHJlc3RhcnQpOworCQkJLyogY2xlYXIgZG1hIGNoYW5uZWwgMSBlb3AvZGVzY3IgaXJxIGJpdHMgKi8KKwkJCSpSX0RNQV9DSDFfQ0xSX0lOVFIgPQorCQkJCUlPX1NUQVRFKFJfRE1BX0NIMV9DTFJfSU5UUiwgY2xyX2VvcCwgZG8pIHwKKwkJCQlJT19TVEFURShSX0RNQV9DSDFfQ0xSX0lOVFIsIGNscl9kZXNjciwgZG8pOworCisJCQkvKiBub3csIHdlIG1pZ2h0IGhhdmUgZ290dGVuIGFub3RoZXIgcGFja2V0CisJCQkgICBzbyB3ZSBoYXZlIHRvIGxvb3AgYmFjayBhbmQgY2hlY2sgaWYgc28gKi8KKwkJfQorCX0KKworCS8qIFJlcG9ydCBhbnkgcGFja2V0cyB0aGF0IGhhdmUgYmVlbiBzZW50ICovCisJd2hpbGUgKG15Rmlyc3RUeERlc2MgIT0gcGh5c190b192aXJ0KCpSX0RNQV9DSDBfRklSU1QpICYmCisJICAgICAgIG15Rmlyc3RUeERlc2MgIT0gbXlOZXh0VHhEZXNjKQorCXsKKwkJbnAtPnN0YXRzLnR4X2J5dGVzICs9IG15Rmlyc3RUeERlc2MtPnNrYi0+bGVuOworCQlucC0+c3RhdHMudHhfcGFja2V0cysrOworCisJCS8qIGRtYSBpcyByZWFkeSB3aXRoIHRoZSB0cmFuc21pc3Npb24gb2YgdGhlIGRhdGEgaW4gdHhfc2tiLCBzbyBub3cKKwkJICAgd2UgY2FuIHJlbGVhc2UgdGhlIHNrYiBtZW1vcnkgKi8KKwkJZGV2X2tmcmVlX3NrYl9pcnEobXlGaXJzdFR4RGVzYy0+c2tiKTsKKwkJbXlGaXJzdFR4RGVzYy0+c2tiID0gMDsKKwkJbXlGaXJzdFR4RGVzYyA9IHBoeXNfdG9fdmlydChteUZpcnN0VHhEZXNjLT5kZXNjci5uZXh0KTsKKwl9CisKKwlpZiAoaXJxYml0cyAmIElPX1NUQVRFKFJfSVJRX01BU0syX1JELCBkbWEwX2VvcCwgYWN0aXZlKSkgeworCQkvKiBhY2tub3dsZWRnZSB0aGUgZW9wIGludGVycnVwdCBhbmQgd2FrZSB1cCBxdWV1ZSAqLworCQkqUl9ETUFfQ0gwX0NMUl9JTlRSID0gSU9fU1RBVEUoUl9ETUFfQ0gwX0NMUl9JTlRSLCBjbHJfZW9wLCBkbyk7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwkvKiBFbmFibGUgUlgvVFggSVJRcyBhZ2FpbiAqLworCSpSX0lSUV9NQVNLMl9TRVQgPQorCSAgSU9fU1RBVEUoUl9JUlFfTUFTSzJfU0VULCBkbWEwX2VvcCwgc2V0KSB8CisJICBJT19TVEFURShSX0lSUV9NQVNLMl9TRVQsIGRtYTFfZW9wLCBzZXQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK2UxMDBud19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgaXJxYml0cyA9ICpSX0lSUV9NQVNLMF9SRDsKKworCS8qIGNoZWNrIGZvciB1bmRlcnJ1biBpcnEgKi8KKwlpZiAoaXJxYml0cyAmIElPX1NUQVRFKFJfSVJRX01BU0swX1JELCB1bmRlcnJ1biwgYWN0aXZlKSkgeworCQlTRVRTKG5ldHdvcmtfdHJfY3RybF9zaGFkb3csIFJfTkVUV09SS19UUl9DVFJMLCBjbHJfZXJyb3IsIGNscik7CisJCSpSX05FVFdPUktfVFJfQ1RSTCA9IG5ldHdvcmtfdHJfY3RybF9zaGFkb3c7CisJCVNFVFMobmV0d29ya190cl9jdHJsX3NoYWRvdywgUl9ORVRXT1JLX1RSX0NUUkwsIGNscl9lcnJvciwgbm9wKTsKKwkJbnAtPnN0YXRzLnR4X2Vycm9ycysrOworCQlEKHByaW50aygiZXRoZXJuZXQgcmVjZWl2ZXIgdW5kZXJydW4hXG4iKSk7CisJfQorCisJLyogY2hlY2sgZm9yIG92ZXJydW4gaXJxICovCisJaWYgKGlycWJpdHMgJiBJT19TVEFURShSX0lSUV9NQVNLMF9SRCwgb3ZlcnJ1biwgYWN0aXZlKSkgeworCQl1cGRhdGVfcnhfc3RhdHMoJm5wLT5zdGF0cyk7IC8qIHRoaXMgd2lsbCBhY2sgdGhlIGlycSAqLworCQlEKHByaW50aygiZXRoZXJuZXQgcmVjZWl2ZXIgb3ZlcnJ1biFcbiIpKTsKKwl9CisJLyogY2hlY2sgZm9yIGV4Y2Vzc2l2ZSBjb2xsaXNpb24gaXJxICovCisJaWYgKGlycWJpdHMgJiBJT19TVEFURShSX0lSUV9NQVNLMF9SRCwgZXhjZXNzaXZlX2NvbCwgYWN0aXZlKSkgeworCQlTRVRTKG5ldHdvcmtfdHJfY3RybF9zaGFkb3csIFJfTkVUV09SS19UUl9DVFJMLCBjbHJfZXJyb3IsIGNscik7CisJCSpSX05FVFdPUktfVFJfQ1RSTCA9IG5ldHdvcmtfdHJfY3RybF9zaGFkb3c7CisJCVNFVFMobmV0d29ya190cl9jdHJsX3NoYWRvdywgUl9ORVRXT1JLX1RSX0NUUkwsIGNscl9lcnJvciwgbm9wKTsKKwkJKlJfTkVUV09SS19UUl9DVFJMID0gSU9fU1RBVEUoUl9ORVRXT1JLX1RSX0NUUkwsIGNscl9lcnJvciwgY2xyKTsKKwkJbnAtPnN0YXRzLnR4X2Vycm9ycysrOworCQlEKHByaW50aygiZXRoZXJuZXQgZXhjZXNzaXZlIGNvbGxpc2lvbnMhXG4iKSk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuICovCitzdGF0aWMgdm9pZAorZTEwMF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGxlbmd0aCA9IDA7CisJc3RydWN0IG5ldF9sb2NhbCAqbnAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdjsKKwl1bnNpZ25lZCBjaGFyICpza2JfZGF0YV9wdHI7CisjaWZkZWYgRVRIREVCVUcKKwlpbnQgaTsKKyNlbmRpZgorCisJaWYgKCFsZWRfYWN0aXZlICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgbGVkX25leHRfdGltZSkpIHsKKwkJLyogbGlnaHQgdGhlIG5ldHdvcmsgbGVkcyBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgc3BlZWQuICovCisJCWUxMDBfc2V0X25ldHdvcmtfbGVkcyhORVRXT1JLX0FDVElWSVRZKTsKKworCQkvKiBTZXQgdGhlIGVhcmxpZXN0IHRpbWUgd2UgbWF5IGNsZWFyIHRoZSBMRUQgKi8KKwkJbGVkX25leHRfdGltZSA9IGppZmZpZXMgKyBORVRfRkxBU0hfVElNRTsKKwkJbGVkX2FjdGl2ZSA9IDE7CisJCW1vZF90aW1lcigmY2xlYXJfbGVkX3RpbWVyLCBqaWZmaWVzICsgSFovMTApOworCX0KKworCWxlbmd0aCA9IG15TmV4dFJ4RGVzYy0+ZGVzY3IuaHdfbGVuIC0gNDsKKwkoKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXYpLT5zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7CisKKyNpZmRlZiBFVEhERUJVRworCXByaW50aygiR290IGEgcGFja2V0IG9mIGxlbmd0aCAlZDpcbiIsIGxlbmd0aCk7CisJLyogZHVtcCB0aGUgZmlyc3QgYnl0ZXMgaW4gdGhlIHBhY2tldCAqLworCXNrYl9kYXRhX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopcGh5c190b192aXJ0KG15TmV4dFJ4RGVzYy0+ZGVzY3IuYnVmKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXByaW50aygiJWQ6ICUuMnggJS4yeCAlLjJ4ICUuMnggJS4yeCAlLjJ4ICUuMnggJS4yeFxuIiwgaSAqIDgsCisJCSAgICAgICBza2JfZGF0YV9wdHJbMF0sc2tiX2RhdGFfcHRyWzFdLHNrYl9kYXRhX3B0clsyXSxza2JfZGF0YV9wdHJbM10sCisJCSAgICAgICBza2JfZGF0YV9wdHJbNF0sc2tiX2RhdGFfcHRyWzVdLHNrYl9kYXRhX3B0cls2XSxza2JfZGF0YV9wdHJbN10pOworCQlza2JfZGF0YV9wdHIgKz0gODsKKwl9CisjZW5kaWYKKworCWlmIChsZW5ndGggPCBSWF9DT1BZQlJFQUspIHsKKwkJLyogU21hbGwgcGFja2V0LCBjb3B5IGRhdGEgKi8KKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW5ndGggLSBFVEhFUl9IRUFEX0xFTik7CisJCWlmICghc2tiKSB7CisJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXNrYl9wdXQoc2tiLCBsZW5ndGggLSBFVEhFUl9IRUFEX0xFTik7ICAgICAgICAvKiBhbGxvY2F0ZSByb29tIGZvciB0aGUgcGFja2V0IGJvZHkgKi8KKwkJc2tiX2RhdGFfcHRyID0gc2tiX3B1c2goc2tiLCBFVEhFUl9IRUFEX0xFTik7IC8qIGFsbG9jYXRlIHJvb20gZm9yIHRoZSBoZWFkZXIgKi8KKworI2lmZGVmIEVUSERFQlVHCisJCXByaW50aygiaGVhZCA9IDB4JXgsIGRhdGEgPSAweCV4LCB0YWlsID0gMHgleCwgZW5kID0gMHgleFxuIiwKKwkJICBza2ItPmhlYWQsIHNrYi0+ZGF0YSwgc2tiLT50YWlsLCBza2ItPmVuZCk7CisJCXByaW50aygiY29weWluZyBwYWNrZXQgdG8gMHgleC5cbiIsIHNrYl9kYXRhX3B0cik7CisjZW5kaWYKKworCQltZW1jcHkoc2tiX2RhdGFfcHRyLCBwaHlzX3RvX3ZpcnQobXlOZXh0UnhEZXNjLT5kZXNjci5idWYpLCBsZW5ndGgpOworCX0KKwllbHNlIHsKKwkJLyogTGFyZ2UgcGFja2V0LCBzZW5kIGRpcmVjdGx5IHRvIHVwcGVyIGxheWVycyBhbmQgYWxsb2NhdGUgbmV3CisJCSAqIG1lbW9yeSAoYWxpZ25lZCB0byBjYWNoZSBsaW5lIGJvdW5kYXJ5IHRvIGF2b2lkIGJ1ZykuCisJCSAqIEJlZm9yZSBzZW5kaW5nIHRoZSBza2IgdG8gdXBwZXIgbGF5ZXJzIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQKKwkJICogc2tiLT5kYXRhIHBvaW50cyB0byB0aGUgYWxpZ25lZCBzdGFydCBvZiB0aGUgcGFja2V0LgorCQkgKi8KKwkJaW50IGFsaWduOworCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYiA9IGRldl9hbGxvY19za2IoTUFYX01FRElBX0RBVEFfU0laRSArIDIgKiBMMV9DQUNIRV9CWVRFUyk7CisJCWlmICghbmV3X3NrYikgeworCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwkJc2tiID0gbXlOZXh0UnhEZXNjLT5za2I7CisJCWFsaWduID0gKGludClwaHlzX3RvX3ZpcnQobXlOZXh0UnhEZXNjLT5kZXNjci5idWYpIC0gKGludClza2ItPmRhdGE7CisJCXNrYl9wdXQoc2tiLCBsZW5ndGggKyBhbGlnbik7CisJCXNrYl9wdWxsKHNrYiwgYWxpZ24pOyAvKiBSZW1vdmUgYWxpZ25tZW50IGJ5dGVzICovCisJCW15TmV4dFJ4RGVzYy0+c2tiID0gbmV3X3NrYjsKKwkJbXlOZXh0UnhEZXNjLT5kZXNjci5idWYgPSBMMV9DQUNIRV9BTElHTih2aXJ0X3RvX3BoeXMobXlOZXh0UnhEZXNjLT5za2ItPmRhdGEpKTsKKwl9CisKKwlza2ItPmRldiA9IGRldjsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCisJLyogU2VuZCB0aGUgcGFja2V0IHRvIHRoZSB1cHBlciBsYXllcnMgKi8KKwluZXRpZl9yeChza2IpOworCisJLyogUHJlcGFyZSBmb3IgbmV4dCBwYWNrZXQgKi8KKwlteU5leHRSeERlc2MtPmRlc2NyLnN0YXR1cyA9IDA7CisJbXlQcmV2UnhEZXNjID0gbXlOZXh0UnhEZXNjOworCW15TmV4dFJ4RGVzYyA9IHBoeXNfdG9fdmlydChteU5leHRSeERlc2MtPmRlc2NyLm5leHQpOworCisJcnhfcXVldWVfbGVuKys7CisKKwkvKiBDaGVjayBpZiBkZXNjcmlwdG9ycyBzaG91bGQgYmUgcmV0dXJuZWQgKi8KKwlpZiAocnhfcXVldWVfbGVuID09IFJYX1FVRVVFX1RIUkVTSE9MRCkgeworCQlmbHVzaF9ldHJheF9jYWNoZSgpOworCQlteVByZXZSeERlc2MtPmRlc2NyLmN0cmwgfD0gZF9lb2w7CisJCW15TGFzdFJ4RGVzYy0+ZGVzY3IuY3RybCAmPSB+ZF9lb2w7CisJCW15TGFzdFJ4RGVzYyA9IG15UHJldlJ4RGVzYzsKKwkJcnhfcXVldWVfbGVuID0gMDsKKwl9Cit9CisKKy8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gbmV0X29wZW4oKS4gKi8KK3N0YXRpYyBpbnQKK2UxMDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopZGV2LT5wcml2OworCisJcHJpbnRrKEtFUk5fSU5GTyAiQ2xvc2luZyAlcy5cbiIsIGRldi0+bmFtZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkqUl9JUlFfTUFTSzBfQ0xSID0KKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzBfQ0xSLCBvdmVycnVuLCBjbHIpIHwKKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzBfQ0xSLCB1bmRlcnJ1biwgY2xyKSB8CisJCUlPX1NUQVRFKFJfSVJRX01BU0swX0NMUiwgZXhjZXNzaXZlX2NvbCwgY2xyKTsKKworCSpSX0lSUV9NQVNLMl9DTFIgPQorCQlJT19TVEFURShSX0lSUV9NQVNLMl9DTFIsIGRtYTBfZGVzY3IsIGNscikgfAorCQlJT19TVEFURShSX0lSUV9NQVNLMl9DTFIsIGRtYTBfZW9wLCBjbHIpIHwKKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfQ0xSLCBkbWExX2Rlc2NyLCBjbHIpIHwKKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfQ0xSLCBkbWExX2VvcCwgY2xyKTsKKworCS8qIFN0b3AgdGhlIHJlY2VpdmVyIGFuZCB0aGUgdHJhbnNtaXR0ZXIgKi8KKworCVJFU0VUX0RNQShORVRXT1JLX1RYX0RNQV9OQlIpOworCVJFU0VUX0RNQShORVRXT1JLX1JYX0RNQV9OQlIpOworCisJLyogRmx1c2ggdGhlIFR4IGFuZCBkaXNhYmxlIFJ4IGhlcmUuICovCisKKwlmcmVlX2lycShORVRXT1JLX0RNQV9SWF9JUlFfTkJSLCAodm9pZCAqKWRldik7CisJZnJlZV9pcnEoTkVUV09SS19ETUFfVFhfSVJRX05CUiwgKHZvaWQgKilkZXYpOworCWZyZWVfaXJxKE5FVFdPUktfU1RBVFVTX0lSUV9OQlIsICh2b2lkICopZGV2KTsKKworCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBoZXJlLiAqLworCisJdXBkYXRlX3J4X3N0YXRzKCZucC0+c3RhdHMpOworCXVwZGF0ZV90eF9zdGF0cygmbnAtPnN0YXRzKTsKKworCS8qIFN0b3Agc3BlZWQvZHVwbGV4IHRpbWVycyAqLworCWRlbF90aW1lcigmc3BlZWRfdGltZXIpOworCWRlbF90aW1lcigmZHVwbGV4X3RpbWVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlMTAwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShpZnIpOworCXN0cnVjdCBuZXRfbG9jYWwgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9jaygmbnAtPmxvY2spOyAvKiBQcmVlbXB0IHByb3RlY3Rpb24gKi8KKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFNJT0NFVEhUT09MOgorCQkJcmV0dXJuIGUxMDBfZXRodG9vbF9pb2N0bChkZXYsaWZyKTsKKwkJY2FzZSBTSU9DR01JSVBIWTogLyogR2V0IFBIWSBhZGRyZXNzICovCisJCQlkYXRhLT5waHlfaWQgPSBtZGlvX3BoeV9hZGRyOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dNSUlSRUc6IC8qIFJlYWQgTUlJIHJlZ2lzdGVyICovCisJCQlkYXRhLT52YWxfb3V0ID0gZTEwMF9nZXRfbWRpb19yZWcoZGV2LCBtZGlvX3BoeV9hZGRyLCBkYXRhLT5yZWdfbnVtKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NTTUlJUkVHOiAvKiBXcml0ZSBNSUkgcmVnaXN0ZXIgKi8KKwkJCWUxMDBfc2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgZGF0YS0+cmVnX251bSwgZGF0YS0+dmFsX2luKTsKKwkJCWJyZWFrOworCQkvKiBUaGUgaW9jdGxzIGJlbG93IHNob3VsZCBiZSBjb25zaWRlcmVkIG9ic29sZXRlIGJ1dCBhcmUgKi8KKwkJLyogc3RpbGwgcHJlc2VudCBmb3IgY29tcGF0YWJpbGl0eSB3aXRoIG9sZCBzY3JpcHRzL2FwcHMgICovCisJCWNhc2UgU0VUX0VUSF9TUEVFRF8xMDogICAgICAgICAgICAgICAgICAvKiAxMCBNYnBzICovCisJCQllMTAwX3NldF9zcGVlZChkZXYsIDEwKTsKKwkJCWJyZWFrOworCQljYXNlIFNFVF9FVEhfU1BFRURfMTAwOiAgICAgICAgICAgICAgICAvKiAxMDAgTWJwcyAqLworCQkJZTEwMF9zZXRfc3BlZWQoZGV2LCAxMDApOworCQkJYnJlYWs7CisJCWNhc2UgU0VUX0VUSF9TUEVFRF9BVVRPOiAgICAgICAgICAgICAgLyogQXV0byBuZWdvdGlhdGUgc3BlZWQgKi8KKwkJCWUxMDBfc2V0X3NwZWVkKGRldiwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBTRVRfRVRIX0RVUExFWF9IQUxGOiAgICAgICAgICAgICAgLyogSGFsZiBkdXBsZXguICovCisJCQllMTAwX3NldF9kdXBsZXgoZGV2LCBoYWxmKTsKKwkJCWJyZWFrOworCQljYXNlIFNFVF9FVEhfRFVQTEVYX0ZVTEw6ICAgICAgICAgICAgICAvKiBGdWxsIGR1cGxleC4gKi8KKwkJCWUxMDBfc2V0X2R1cGxleChkZXYsIGZ1bGwpOworCQkJYnJlYWs7CisJCWNhc2UgU0VUX0VUSF9EVVBMRVhfQVVUTzogICAgICAgICAgICAgLyogQXV0b25lZ290aWF0ZSBkdXBsZXgqLworCQkJZTEwMF9zZXRfZHVwbGV4KGRldiwgYXV0b25lZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlzcGluX3VubG9jaygmbnAtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlMTAwX2V0aHRvb2xfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIpCit7CisJc3RydWN0IGV0aHRvb2xfY21kIGVjbWQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmVjbWQsIGlmci0+aWZyX2RhdGEsIHNpemVvZiAoZWNtZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoZWNtZC5jbWQpIHsKKwkJY2FzZSBFVEhUT09MX0dTRVQ6CisJCXsKKwkJCW1lbXNldCgodm9pZCAqKSAmZWNtZCwgMCwgc2l6ZW9mIChlY21kKSk7CisJCQllY21kLnN1cHBvcnRlZCA9CisJCQkgIFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX01JSSB8CisJCQkgIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCSAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbDsKKwkJCWVjbWQucG9ydCA9IFBPUlRfVFA7CisJCQllY21kLnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKwkJCWVjbWQucGh5X2FkZHJlc3MgPSBtZGlvX3BoeV9hZGRyOworCQkJZWNtZC5zcGVlZCA9IGN1cnJlbnRfc3BlZWQ7CisJCQllY21kLmR1cGxleCA9IGZ1bGxfZHVwbGV4ID8gRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKKwkJCWVjbWQuYWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEX1RQOworCQkJaWYgKGN1cnJlbnRfZHVwbGV4ID09IGF1dG9uZWcgJiYgY3VycmVudF9zcGVlZF9zZWxlY3Rpb24gPT0gMCkKKwkJCQllY21kLmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKKwkJCWVsc2UgeworCQkJCWVjbWQuYWR2ZXJ0aXNpbmcgfD0KKwkJCQkgIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCSAgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsOworCQkJCWlmIChjdXJyZW50X3NwZWVkX3NlbGVjdGlvbiA9PSAxMCkKKwkJCQkJZWNtZC5hZHZlcnRpc2luZyAmPSB+KEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCk7CisJCQkJZWxzZSBpZiAoY3VycmVudF9zcGVlZF9zZWxlY3Rpb24gPT0gMTAwKQorCQkJCQllY21kLmFkdmVydGlzaW5nICY9IH4oQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCk7CisJCQkJaWYgKGN1cnJlbnRfZHVwbGV4ID09IGhhbGYpCisJCQkJCWVjbWQuYWR2ZXJ0aXNpbmcgJj0gfihBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCk7CisJCQkJZWxzZSBpZiAoY3VycmVudF9kdXBsZXggPT0gZnVsbCkKKwkJCQkJZWNtZC5hZHZlcnRpc2luZyAmPSB+KEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmKTsKKwkJCX0KKwkJCWVjbWQuYXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCQkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmZWNtZCwgc2l6ZW9mIChlY21kKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJCWNhc2UgRVRIVE9PTF9TU0VUOgorCQl7CisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJfQorCQkJaWYgKGVjbWQuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkJCWUxMDBfc2V0X2R1cGxleChkZXYsIGF1dG9uZWcpOworCQkJCWUxMDBfc2V0X3NwZWVkKGRldiwgMCk7CisJCQl9IGVsc2UgeworCQkJCWUxMDBfc2V0X2R1cGxleChkZXYsIGVjbWQuZHVwbGV4ID09IERVUExFWF9IQUxGID8gaGFsZiA6IGZ1bGwpOworCQkJCWUxMDBfc2V0X3NwZWVkKGRldiwgZWNtZC5zcGVlZCA9PSBTUEVFRF8xMCA/IDEwOiAxMDApOworCQkJfQorCQl9CisJCWJyZWFrOworCQljYXNlIEVUSFRPT0xfR0RSVklORk86CisJCXsKKwkJCXN0cnVjdCBldGh0b29sX2RydmluZm8gaW5mbzsKKwkJCW1lbXNldCgodm9pZCAqKSAmaW5mbywgMCwgc2l6ZW9mIChpbmZvKSk7CisJCQlzdHJuY3B5KGluZm8uZHJpdmVyLCAiRVRSQVggMTAwTFgiLCBzaXplb2YoaW5mby5kcml2ZXIpIC0gMSk7CisJCQlzdHJuY3B5KGluZm8udmVyc2lvbiwgIiRSZXZpc2lvbjogMS4zMSAkIiwgc2l6ZW9mKGluZm8udmVyc2lvbikgLSAxKTsKKwkJCXN0cm5jcHkoaW5mby5md192ZXJzaW9uLCAiTi9BIiwgc2l6ZW9mKGluZm8uZndfdmVyc2lvbikgLSAxKTsKKwkJCXN0cm5jcHkoaW5mby5idXNfaW5mbywgIk4vQSIsIHNpemVvZihpbmZvLmJ1c19pbmZvKSAtIDEpOworCQkJaW5mby5yZWdkdW1wX2xlbiA9IDA7CisJCQlpbmZvLmVlZHVtcF9sZW4gPSAwOworCQkJaW5mby50ZXN0aW5mb19sZW4gPSAwOworCQkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmaW5mbywgc2l6ZW9mIChpbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJCWNhc2UgRVRIVE9PTF9OV0FZX1JTVDoKKwkJCWlmIChjdXJyZW50X2R1cGxleCA9PSBhdXRvbmVnICYmIGN1cnJlbnRfc3BlZWRfc2VsZWN0aW9uID09IDApCisJCQkJZTEwMF9uZWdvdGlhdGUoZGV2KTsKKwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZTEwMF9zZXRfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5wID0gKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXY7CisJc3Bpbl9sb2NrKCZucC0+bG9jayk7IC8qIFByZWVtcHQgcHJvdGVjdGlvbiAqLworCisJc3dpdGNoKG1hcC0+cG9ydCkgeworCQljYXNlIElGX1BPUlRfVU5LTk9XTjoKKwkJCS8qIFVzZSBhdXRvbmVnICovCisJCQllMTAwX3NldF9zcGVlZChkZXYsIDApOworCQkJZTEwMF9zZXRfZHVwbGV4KGRldiwgYXV0b25lZyk7CisJCQlicmVhazsKKwkJY2FzZSBJRl9QT1JUXzEwQkFTRVQ6CisJCQllMTAwX3NldF9zcGVlZChkZXYsIDEwKTsKKwkJCWUxMDBfc2V0X2R1cGxleChkZXYsIGF1dG9uZWcpOworCQkJYnJlYWs7CisJCWNhc2UgSUZfUE9SVF8xMDBCQVNFVDoKKwkJY2FzZSBJRl9QT1JUXzEwMEJBU0VUWDoKKwkJCWUxMDBfc2V0X3NwZWVkKGRldiwgMTAwKTsKKwkJCWUxMDBfc2V0X2R1cGxleChkZXYsIGF1dG9uZWcpOworCQkJYnJlYWs7CisJCWNhc2UgSUZfUE9SVF8xMDBCQVNFRlg6CisJCWNhc2UgSUZfUE9SVF8xMEJBU0UyOgorCQljYXNlIElGX1BPUlRfQVVJOgorCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBtZWRpYSBzZWxlY3RlZCIsIGRldi0+bmFtZSk7CisJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfcnhfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVzKQoreworCXVuc2lnbmVkIGxvbmcgciA9ICpSX1JFQ19DT1VOVEVSUzsKKwkvKiB1cGRhdGUgc3RhdHMgcmVsZXZhbnQgdG8gcmVjZXB0aW9uIGVycm9ycyAqLworCWVzLT5yeF9maWZvX2Vycm9ycyArPSBJT19FWFRSQUNUKFJfUkVDX0NPVU5URVJTLCBjb25nZXN0aW9uLCByKTsKKwllcy0+cnhfY3JjX2Vycm9ycyArPSBJT19FWFRSQUNUKFJfUkVDX0NPVU5URVJTLCBjcmNfZXJyb3IsIHIpOworCWVzLT5yeF9mcmFtZV9lcnJvcnMgKz0gSU9fRVhUUkFDVChSX1JFQ19DT1VOVEVSUywgYWxpZ25tZW50X2Vycm9yLCByKTsKKwllcy0+cnhfbGVuZ3RoX2Vycm9ycyArPSBJT19FWFRSQUNUKFJfUkVDX0NPVU5URVJTLCBvdmVyc2l6ZSwgcik7Cit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfdHhfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVzKQoreworCXVuc2lnbmVkIGxvbmcgciA9ICpSX1RSX0NPVU5URVJTOworCS8qIHVwZGF0ZSBzdGF0cyByZWxldmFudCB0byB0cmFuc21pc3Npb24gZXJyb3JzICovCisJZXMtPmNvbGxpc2lvbnMgKz0KKwkJSU9fRVhUUkFDVChSX1RSX0NPVU5URVJTLCBzaW5nbGVfY29sLCByKSArCisJCUlPX0VYVFJBQ1QoUl9UUl9DT1VOVEVSUywgbXVsdGlwbGVfY29sLCByKTsKKwllcy0+dHhfZXJyb3JzICs9IElPX0VYVFJBQ1QoUl9UUl9DT1VOVEVSUywgZGVmZXJyZWQsIHIpOworfQorCisvKgorICogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCisgKiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yIGNsb3NlZC4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK2UxMDBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJdXBkYXRlX3J4X3N0YXRzKCZscC0+c3RhdHMpOworCXVwZGF0ZV90eF9zdGF0cygmbHAtPnN0YXRzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qCisgKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgKiBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAqIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLAorICoJCQlhbmQgZG8gYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCitzdGF0aWMgdm9pZAorc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdjsKKwlpbnQgbnVtX2FkZHIgPSBkZXYtPm1jX2NvdW50OworCXVuc2lnbmVkIGxvbmcgaW50IGxvX2JpdHM7CisJdW5zaWduZWQgbG9uZyBpbnQgaGlfYml0czsKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCXsKKwkJLyogcHJvbWlzY3VvdXMgbW9kZSAqLworCQlsb19iaXRzID0gMHhmZmZmZmZmZnVsOworCQloaV9iaXRzID0gMHhmZmZmZmZmZnVsOworCisJCS8qIEVuYWJsZSBpbmRpdmlkdWFsIHJlY2VpdmUgKi8KKwkJU0VUUyhuZXR3b3JrX3JlY19jb25maWdfc2hhZG93LCBSX05FVFdPUktfUkVDX0NPTkZJRywgaW5kaXZpZHVhbCwgcmVjZWl2ZSk7CisJCSpSX05FVFdPUktfUkVDX0NPTkZJRyA9IG5ldHdvcmtfcmVjX2NvbmZpZ19zaGFkb3c7CisJfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCS8qIGVuYWJsZSBhbGwgbXVsdGljYXN0cyAqLworCQlsb19iaXRzID0gMHhmZmZmZmZmZnVsOworCQloaV9iaXRzID0gMHhmZmZmZmZmZnVsOworCisJCS8qIERpc2FibGUgaW5kaXZpZHVhbCByZWNlaXZlICovCisJCVNFVFMobmV0d29ya19yZWNfY29uZmlnX3NoYWRvdywgUl9ORVRXT1JLX1JFQ19DT05GSUcsIGluZGl2aWR1YWwsIGRpc2NhcmQpOworCQkqUl9ORVRXT1JLX1JFQ19DT05GSUcgPSAgbmV0d29ya19yZWNfY29uZmlnX3NoYWRvdzsKKwl9IGVsc2UgaWYgKG51bV9hZGRyID09IDApIHsKKwkJLyogTm9ybWFsLCBjbGVhciB0aGUgbWMgbGlzdCAqLworCQlsb19iaXRzID0gMHgwMDAwMDAwMHVsOworCQloaV9iaXRzID0gMHgwMDAwMDAwMHVsOworCisJCS8qIERpc2FibGUgaW5kaXZpZHVhbCByZWNlaXZlICovCisJCVNFVFMobmV0d29ya19yZWNfY29uZmlnX3NoYWRvdywgUl9ORVRXT1JLX1JFQ19DT05GSUcsIGluZGl2aWR1YWwsIGRpc2NhcmQpOworCQkqUl9ORVRXT1JLX1JFQ19DT05GSUcgPSAgbmV0d29ya19yZWNfY29uZmlnX3NoYWRvdzsKKwl9IGVsc2UgeworCQkvKiBNQyBtb2RlLCByZWNlaXZlIG5vcm1hbCBhbmQgTUMgcGFja2V0cyAqLworCQljaGFyIGhhc2hfaXg7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCQlpbnQgaTsKKwkJY2hhciAqYmFkZHI7CisJCWxvX2JpdHMgPSAweDAwMDAwMDAwdWw7CisJCWhpX2JpdHMgPSAweDAwMDAwMDAwdWw7CisJCWZvciAoaT0wOyBpPG51bV9hZGRyOyBpKyspIHsKKwkJCS8qIENhbGN1bGF0ZSB0aGUgaGFzaCBpbmRleCBmb3IgdGhlIEdBIHJlZ2lzdGVycyAqLworCisJCQloYXNoX2l4ID0gMDsKKwkJCWJhZGRyID0gZG1pLT5kbWlfYWRkcjsKKwkJCWhhc2hfaXggXj0gKCpiYWRkcikgJiAweDNmOworCQkJaGFzaF9peCBePSAoKCpiYWRkcikgPj4gNikgJiAweDAzOworCQkJKytiYWRkcjsKKwkJCWhhc2hfaXggXj0gKCgqYmFkZHIpIDw8IDIpICYgMHgwM2M7CisJCQloYXNoX2l4IF49ICgoKmJhZGRyKSA+PiA0KSAmIDB4ZjsKKwkJCSsrYmFkZHI7CisJCQloYXNoX2l4IF49ICgoKmJhZGRyKSA8PCA0KSAmIDB4MzA7CisJCQloYXNoX2l4IF49ICgoKmJhZGRyKSA+PiAyKSAmIDB4M2Y7CisJCQkrK2JhZGRyOworCQkJaGFzaF9peCBePSAoKmJhZGRyKSAmIDB4M2Y7CisJCQloYXNoX2l4IF49ICgoKmJhZGRyKSA+PiA2KSAmIDB4MDM7CisJCQkrK2JhZGRyOworCQkJaGFzaF9peCBePSAoKCpiYWRkcikgPDwgMikgJiAweDAzYzsKKwkJCWhhc2hfaXggXj0gKCgqYmFkZHIpID4+IDQpICYgMHhmOworCQkJKytiYWRkcjsKKwkJCWhhc2hfaXggXj0gKCgqYmFkZHIpIDw8IDQpICYgMHgzMDsKKwkJCWhhc2hfaXggXj0gKCgqYmFkZHIpID4+IDIpICYgMHgzZjsKKworCQkJaGFzaF9peCAmPSAweDNmOworCisJCQlpZiAoaGFzaF9peCA+PSAzMikgeworCQkJCWhpX2JpdHMgfD0gKDEgPDwgKGhhc2hfaXgtMzIpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWxvX2JpdHMgfD0gKDEgPDwgaGFzaF9peCk7CisJCQl9CisJCQlkbWkgPSBkbWktPm5leHQ7CisJCX0KKwkJLyogRGlzYWJsZSBpbmRpdmlkdWFsIHJlY2VpdmUgKi8KKwkJU0VUUyhuZXR3b3JrX3JlY19jb25maWdfc2hhZG93LCBSX05FVFdPUktfUkVDX0NPTkZJRywgaW5kaXZpZHVhbCwgZGlzY2FyZCk7CisJCSpSX05FVFdPUktfUkVDX0NPTkZJRyA9IG5ldHdvcmtfcmVjX2NvbmZpZ19zaGFkb3c7CisJfQorCSpSX05FVFdPUktfR0FfMCA9IGxvX2JpdHM7CisJKlJfTkVUV09SS19HQV8xID0gaGlfYml0czsKKwlzcGluX3VubG9jaygmbHAtPmxvY2spOworfQorCit2b2lkCitlMTAwX2hhcmR3YXJlX3NlbmRfcGFja2V0KGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkKK3sKKwlEKHByaW50aygiZTEwMCBzZW5kIHBhY2ssIGJ1ZiAweCV4IGxlbiAlZFxuIiwgYnVmLCBsZW5ndGgpKTsKKworCWlmICghbGVkX2FjdGl2ZSAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIGxlZF9uZXh0X3RpbWUpKSB7CisJCS8qIGxpZ2h0IHRoZSBuZXR3b3JrIGxlZHMgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHNwZWVkLiAqLworCQllMTAwX3NldF9uZXR3b3JrX2xlZHMoTkVUV09SS19BQ1RJVklUWSk7CisKKwkJLyogU2V0IHRoZSBlYXJsaWVzdCB0aW1lIHdlIG1heSBjbGVhciB0aGUgTEVEICovCisJCWxlZF9uZXh0X3RpbWUgPSBqaWZmaWVzICsgTkVUX0ZMQVNIX1RJTUU7CisJCWxlZF9hY3RpdmUgPSAxOworCQltb2RfdGltZXIoJmNsZWFyX2xlZF90aW1lciwgamlmZmllcyArIEhaLzEwKTsKKwl9CisKKwkvKiBjb25maWd1cmUgdGhlIHR4IGRtYSBkZXNjcmlwdG9yICovCisJbXlOZXh0VHhEZXNjLT5kZXNjci5zd19sZW4gPSBsZW5ndGg7CisJbXlOZXh0VHhEZXNjLT5kZXNjci5jdHJsID0gZF9lb3AgfCBkX2VvbCB8IGRfd2FpdDsKKwlteU5leHRUeERlc2MtPmRlc2NyLmJ1ZiA9IHZpcnRfdG9fcGh5cyhidWYpOworCisgICAgICAgIC8qIE1vdmUgZW5kIG9mIGxpc3QgKi8KKyAgICAgICAgbXlMYXN0VHhEZXNjLT5kZXNjci5jdHJsICY9IH5kX2VvbDsKKyAgICAgICAgbXlMYXN0VHhEZXNjID0gbXlOZXh0VHhEZXNjOworCisJLyogUmVzdGFydCBETUEgY2hhbm5lbCAqLworCSpSX0RNQV9DSDBfQ01EID0gSU9fU1RBVEUoUl9ETUFfQ0gwX0NNRCwgY21kLCByZXN0YXJ0KTsKK30KKworc3RhdGljIHZvaWQKK2UxMDBfY2xlYXJfbmV0d29ya19sZWRzKHVuc2lnbmVkIGxvbmcgZHVtbXkpCit7CisJaWYgKGxlZF9hY3RpdmUgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBsZWRfbmV4dF90aW1lKSkgeworCQllMTAwX3NldF9uZXR3b3JrX2xlZHMoTk9fTkVUV09SS19BQ1RJVklUWSk7CisKKwkJLyogU2V0IHRoZSBlYXJsaWVzdCB0aW1lIHdlIG1heSBzZXQgdGhlIExFRCAqLworCQlsZWRfbmV4dF90aW1lID0gamlmZmllcyArIE5FVF9GTEFTSF9QQVVTRTsKKwkJbGVkX2FjdGl2ZSA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZAorZTEwMF9zZXRfbmV0d29ya19sZWRzKGludCBhY3RpdmUpCit7CisjaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfTkVUV09SS19MRURfT05fV0hFTl9MSU5LKQorCWludCBsaWdodF9sZWRzID0gKGFjdGl2ZSA9PSBOT19ORVRXT1JLX0FDVElWSVRZKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0VUUkFYX05FVFdPUktfTEVEX09OX1dIRU5fQUNUSVZJVFkpCisJaW50IGxpZ2h0X2xlZHMgPSAoYWN0aXZlID09IE5FVFdPUktfQUNUSVZJVFkpOworI2Vsc2UKKyNlcnJvciAiRGVmaW5lIGVpdGhlciBDT05GSUdfRVRSQVhfTkVUV09SS19MRURfT05fV0hFTl9MSU5LIG9yIENPTkZJR19FVFJBWF9ORVRXT1JLX0xFRF9PTl9XSEVOX0FDVElWSVRZIgorI2VuZGlmCisKKwlpZiAoIWN1cnJlbnRfc3BlZWQpIHsKKwkJLyogTWFrZSBMRUQgcmVkLCBsaW5rIGlzIGRvd24gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9ORVRXT1JLX1JFRF9PTl9OT19DT05ORUNUSU9OKQorCQlMRURfTkVUV09SS19TRVQoTEVEX1JFRCk7CisjZWxzZQorCQlMRURfTkVUV09SS19TRVQoTEVEX09GRik7CisjZW5kaWYKKwl9CisJZWxzZSBpZiAobGlnaHRfbGVkcykgeworCQlpZiAoY3VycmVudF9zcGVlZCA9PSAxMCkgeworCQkJTEVEX05FVFdPUktfU0VUKExFRF9PUkFOR0UpOworCQl9IGVsc2UgeworCQkJTEVEX05FVFdPUktfU0VUKExFRF9HUkVFTik7CisJCX0KKwl9CisJZWxzZSB7CisJCUxFRF9ORVRXT1JLX1NFVChMRURfT0ZGKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2V0cmF4X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGV0cmF4X2V0aGVybmV0X2luaXQoKTsKK30KKworc3RhdGljIGludCBfX2luaXQKK2UxMDBfYm9vdF9zZXR1cChjaGFyKiBzdHIpCit7CisJc3RydWN0IHNvY2thZGRyIHNhID0gezB9OworCWludCBpOworCisJLyogUGFyc2UgdGhlIGNvbG9uIHNlcGFyYXRlZCBFdGhlcm5ldCBzdGF0aW9uIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgIEVUSF9BTEVOOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHRtcDsKKwkJaWYgKHNzY2FuZihzdHIgKyAzKmksICIlMngiLCAmdG1wKSAhPSAxKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJNYWxmb3JtZWQgc3RhdGlvbiBhZGRyZXNzIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzYS5zYV9kYXRhW2ldID0gKGNoYXIpdG1wOworCX0KKworCWRlZmF1bHRfbWFjID0gc2E7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImV0cmF4MTAwX2V0aD0iLCBlMTAwX2Jvb3Rfc2V0dXApOworCittb2R1bGVfaW5pdChldHJheF9pbml0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jczg5eDAuYyBiL2RyaXZlcnMvbmV0L2NzODl4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNWY1NDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jczg5eDAuYwpAQCAtMCwwICsxLDE4NjYgQEAKKy8qIGNzODl4MC5jOiBBIENyeXN0YWwgU2VtaWNvbmR1Y3RvciAoTm93IENpcnJ1cyBMb2dpYykgQ1M4OVswMl0wCisgKiAgZHJpdmVyIGZvciBsaW51eC4KKyAqLworCisvKgorCVdyaXR0ZW4gMTk5NiBieSBSdXNzZWxsIE5lbHNvbiwgd2l0aCByZWZlcmVuY2UgdG8gc2tlbGV0b24uYworCXdyaXR0ZW4gMTk5My0xOTk0IGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworICAgICAgICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGF0IG5lbHNvbkBjcnlud3IuY29tLCBDcnlud3IKKyAgICAgICAgU29mdHdhcmUsIDUyMSBQbGVhc2FudCBWYWxsZXkgUmQuLCBQb3RzZGFtLCBOWSAxMzY3NgorCisgIENoYW5nZWxvZzoKKworICBNaWtlIENydXNlICAgICAgICA6IG1jcnVzZUBjdGktbHRkLmNvbQorICAgICAgICAgICAgICAgICAgICA6IENoYW5nZXMgZm9yIExpbnV4IDIuMCBjb21wYXRpYmlsaXR5LiAKKyAgICAgICAgICAgICAgICAgICAgOiBBZGRlZCBkZXZfaWQgcGFyYW1ldGVyIGluIG5ldF9pbnRlcnJ1cHQoKSwKKyAgICAgICAgICAgICAgICAgICAgOiByZXF1ZXN0X2lycSgpIGFuZCBmcmVlX2lycSgpLiBKdXN0IE5VTEwgZm9yIG5vdy4KKworICBNaWtlIENydXNlICAgICAgICA6IEFkZGVkIE1PRF9JTkNfVVNFX0NPVU5UIGFuZCBNT0RfREVDX1VTRV9DT1VOVCBtYWNyb3MKKyAgICAgICAgICAgICAgICAgICAgOiBpbiBuZXRfb3BlbigpIGFuZCBuZXRfY2xvc2UoKSBzbyBrZXJuZWxkIHdvdWxkIGtub3cKKyAgICAgICAgICAgICAgICAgICAgOiB0aGF0IHRoZSBtb2R1bGUgaXMgaW4gdXNlIGFuZCB3b3VsZG4ndCBlamVjdCB0aGUgCisgICAgICAgICAgICAgICAgICAgIDogZHJpdmVyIHByZW1hdHVyZWx5LgorCisgIE1pa2UgQ3J1c2UgICAgICAgIDogUmV3cm90ZSBpbml0X21vZHVsZSgpIGFuZCBjbGVhbnVwX21vZHVsZSB1c2luZyA4MzkwLmMKKyAgICAgICAgICAgICAgICAgICAgOiBhcyBhbiBleGFtcGxlLiBEaXNhYmxlZCBhdXRvcHJvYmluZyBpbiBpbml0X21vZHVsZSgpLAorICAgICAgICAgICAgICAgICAgICA6IG5vdCBhIGdvb2QgdGhpbmcgdG8gZG8gdG8gb3RoZXIgZGV2aWNlcyB3aGlsZSBMaW51eAorICAgICAgICAgICAgICAgICAgICA6IGlzIHJ1bm5pbmcgZnJvbSBhbGwgYWNjb3VudHMuCisKKyAgUnVzcyBOZWxzb24gICAgICAgOiBKdWwgMTMgMTk5OC4gIEFkZGVkIFJ4T25seSBETUEgc3VwcG9ydC4KKworICBNZWxvZHkgTGVlICAgICAgICA6IEF1ZyAxMCAxOTk5LiAgQ2hhbmdlcyBmb3IgTGludXggMi4yLjUgY29tcGF0aWJpbGl0eS4gCisgICAgICAgICAgICAgICAgICAgIDogZW1haWw6IGV0aGVybmV0QGNyeXN0YWwuY2lycnVzLmNvbQorCisgIEFsYW4gQ294ICAgICAgICAgIDogUmVtb3ZlZCAxLjIgc3VwcG9ydCwgYWRkZWQgMi4xIGV4dHJhIGNvdW50ZXJzLgorCisgIEFuZHJldyBNb3J0b24gICAgIDogYW5kcmV3bUB1b3cuZWR1LmF1CisgICAgICAgICAgICAgICAgICAgIDogS2VybmVsIDIuMy40OAorICAgICAgICAgICAgICAgICAgICA6IEhhbmRsZSBrbWFsbG9jKCkgZmFpbHVyZXMKKyAgICAgICAgICAgICAgICAgICAgOiBPdGhlciByZXNvdXJjZSBhbGxvY2F0aW9uIGZpeGVzCisgICAgICAgICAgICAgICAgICAgIDogQWRkIFNNUCBsb2NrcworICAgICAgICAgICAgICAgICAgICA6IEludGVncmF0ZSBSdXNzIE5lbHNvbidzIEFMTE9XX0RNQSBmdW5jdGlvbmFsaXR5IGJhY2sgaW4uCisgICAgICAgICAgICAgICAgICAgIDogSWYgQUxMT1dfRE1BIGlzIHRydWUsIG1ha2UgRE1BIHJ1bnRpbWUgc2VsZWN0YWJsZQorICAgICAgICAgICAgICAgICAgICA6IEZvbGRlZCBpbiBjaGFuZ2VzIGZyb20gQ2lycnVzIChNZWxvZHkgTGVlCisgICAgICAgICAgICAgICAgICAgIDogPGtsZWVAY3J5c3RhbC5jaXJydXMuY29tPikKKyAgICAgICAgICAgICAgICAgICAgOiBEb24ndCBjYWxsIG5ldGlmX3dha2VfcXVldWUoKSBpbiBuZXRfc2VuZF9wYWNrZXQoKQorICAgICAgICAgICAgICAgICAgICA6IEZpeGVkIGFuIG91dC1vZi1tZW0gYnVnIGluIGRtYV9yeCgpCisgICAgICAgICAgICAgICAgICAgIDogVXBkYXRlZCBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3M4OXgwLnR4dAorCisgIEFuZHJldyBNb3J0b24gICAgIDogYW5kcmV3bUB1b3cuZWR1LmF1IC8gS2VybmVsIDIuMy45OS1wcmUxCisgICAgICAgICAgICAgICAgICAgIDogVXNlIHNrYl9yZXNlcnZlIHRvIGxvbmd3b3JkIGFsaWduIElQIGhlYWRlciAodHdvIHBsYWNlcykKKyAgICAgICAgICAgICAgICAgICAgOiBSZW1vdmUgYSBkZWxheSBsb29wIGZyb20gZG1hX3J4KCkKKyAgICAgICAgICAgICAgICAgICAgOiBSZXBsYWNlICcxMDAnIHdpdGggSFoKKyAgICAgICAgICAgICAgICAgICAgOiBDbGVhbiB1cCBhIGNvdXBsZSBvZiBza2IgQVBJIGFidXNlcworICAgICAgICAgICAgICAgICAgICA6IEFkZGVkICdjczg5eDBfZG1hPU4nIGtlcm5lbCBib290IG9wdGlvbgorICAgICAgICAgICAgICAgICAgICA6IENvcnJlY3RseSBpbml0aWFsaXNlIGxwLT5sb2NrIGluIG5vbi1tb2R1bGUgY29tcGlsZQorCisgIEFuZHJldyBNb3J0b24gICAgIDogYW5kcmV3bUB1b3cuZWR1LmF1IC8gS2VybmVsIDIuMy45OS1wcmU0LTEKKyAgICAgICAgICAgICAgICAgICAgOiBNT0RfSU5DL0RFQyByYWNlIGZpeCAoc2VlCisgICAgICAgICAgICAgICAgICAgIDogaHR0cDovL3d3dy51d3NnLmluZGlhbmEuZWR1L2h5cGVybWFpbC9saW51eC9rZXJuZWwvMDAwMy4zLzE1MzIuaHRtbCkKKworICBBbmRyZXcgTW9ydG9uICAgICA6IGFuZHJld21AdW93LmVkdS5hdSAvIEtlcm5lbCAyLjQuMC10ZXN0Ny1wcmUyCisgICAgICAgICAgICAgICAgICAgIDogRW5oYW5jZWQgRUVQUk9NIHN1cHBvcnQgdG8gY292ZXIgbW9yZSBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICA6ICAgYWJzdHJhY3RlZCBJUlEgbWFwcGluZyB0byBzdXBwb3J0IENPTkZJR19BUkNIX0NMUFM3NTAwIGFyY2gKKyAgICAgICAgICAgICAgICAgICAgOiAgIChKYXNvbiBHdW50aG9ycGUgPGpnZ0B1YWxiZXJ0YS5jYT4pCisKKyAgQW5kcmV3IE1vcnRvbiAgICAgOiBLZXJuZWwgMi40LjAtdGVzdDExLXByZTQKKyAgICAgICAgICAgICAgICAgICAgOiBVc2UgZGV2LT5uYW1lIGluIHJlcXVlc3RfKigpIChBbmRyZXkgUGFuaW4pCisgICAgICAgICAgICAgICAgICAgIDogRml4IGFuIGVycm9yLXBhdGggbWVtbGVhayBpbiBpbml0X21vZHVsZSgpCisgICAgICAgICAgICAgICAgICAgIDogUHJlc2VydmUgcmV0dXJuIHZhbHVlIGZyb20gcmVxdWVzdF9pcnEoKQorICAgICAgICAgICAgICAgICAgICA6IEZpeCB0eXBlIG9mIGBtZWRpYScgbW9kdWxlIHBhcm0gKEtlaXRoIE93ZW5zKQorICAgICAgICAgICAgICAgICAgICA6IFVzZSBTRVRfTU9EVUxFX09XTkVSKCkKKyAgICAgICAgICAgICAgICAgICAgOiBUaWRpZWQgdXAgc3RyYW5nZSByZXF1ZXN0X2lycSgpIGFidXNlIGluIG5ldF9vcGVuKCkuCisKKyAgQW5kcmV3IE1vcnRvbiAgICAgOiBLZXJuZWwgMi40LjMtcHJlMQorICAgICAgICAgICAgICAgICAgICA6IFJlcXVlc3QgY29ycmVjdCBudW1iZXIgb2YgcGFnZXMgZm9yIERNQSAoSHVnaCBEaWNrZW5zKQorICAgICAgICAgICAgICAgICAgICA6IFNlbGVjdCBQUF9DaGlwSUQgX2FmdGVyXyB1bnJlZ2lzdGVyX25ldGRldiBpbiBjbGVhbnVwX21vZHVsZSgpCisgICAgICAgICAgICAgICAgICAgIDogIGJlY2F1c2UgdW5yZWdpc3Rlcl9uZXRkZXYoKSBjYWxscyBnZXRfc3RhdHMuCisgICAgICAgICAgICAgICAgICAgIDogTWFrZSBgdmVyc2lvbltdJyBfX2luaXRkYXRhCisgICAgICAgICAgICAgICAgICAgIDogVW5pbmxpbmVkIHRoZSByZWFkL3dyaXRlIHJlZy93b3JkIGZ1bmN0aW9ucy4KKworICBPc2thciBTY2hpcm1lciAgICA6IG9za2FyQHNjYXJhLmNvbQorICAgICAgICAgICAgICAgICAgICA6IEhpQ08uU0g0IChzdXBlcmgpIHN1cHBvcnQgYWRkZWQgKGlycSMxLCBjczg5eDBfbWVkaWE9KQorCisgIERlZXBhayBTYXhlbmEgICAgIDogZHNheGVuYUBwbGV4aXR5Lm5ldAorICAgICAgICAgICAgICAgICAgICA6IEludGVsIElYRFAyeDAxIChYU2NhbGUgaXhwMngwMCBOUFUpIHBsYXRmb3JtIHN1cHBvcnQKKworKi8KKworLyogQWx3YXlzIGluY2x1ZGUgJ2NvbmZpZy5oJyBmaXJzdCBpbiBjYXNlIHRoZSB1c2VyIHdhbnRzIHRvIHR1cm4gb24KKyAgIG9yIG92ZXJyaWRlIHNvbWV0aGluZy4gKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyoKKyAqIFNldCB0aGlzIHRvIHplcm8gdG8gZGlzYWJsZSBETUEgY29kZQorICoKKyAqIE5vdGUgdGhhdCBldmVuIGlmIERNQSBpcyB0dXJuZWQgb2ZmIHdlIHN0aWxsIHN1cHBvcnQgdGhlICdkbWEnIGFuZCAgJ3VzZV9kbWEnCisgKiBtb2R1bGUgb3B0aW9ucyBzbyB3ZSBkb24ndCBicmVhayBhbnkgc3RhcnR1cCBzY3JpcHRzLgorICovCisjaWZuZGVmIENPTkZJR19BUkNIX0lYRFAyWDAxCisjZGVmaW5lIEFMTE9XX0RNQQkwCisjZWxzZQorI2RlZmluZSBBTExPV19ETUEJMQorI2VuZGlmCisKKy8qCisgKiBTZXQgdGhpcyB0byB6ZXJvIHRvIHJlbW92ZSBhbGwgdGhlIGRlYnVnIHN0YXRlbWVudHMgdmlhCisgKiBkZWFkIGNvZGUgZWxpbWluYXRpb24KKyAqLworI2RlZmluZSBERUJVR0dJTkcJMQorCisvKgorICBTb3VyY2VzOgorCisJQ3J5bndyIHBhY2tldCBkcml2ZXIgZXBrdGlzYS4KKworCUNyeXN0YWwgU2VtaWNvbmR1Y3RvciBkYXRhIHNoZWV0cy4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpZiBBTExPV19ETUEKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImNzODl4MC5oIgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9CisiY3M4OXgwLmM6IHYyLjQuMy1wcmUxIFJ1c3NlbGwgTmVsc29uIDxuZWxzb25AY3J5bndyLmNvbT4sIEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT5cbiI7CisKKyNkZWZpbmUgRFJWX05BTUUgImNzODl4MCIKKworLyogRmlyc3QsIGEgZmV3IGRlZmluaXRpb25zIHRoYXQgdGhlIGJyYXZlIG1pZ2h0IGNoYW5nZS4KKyAgIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSS9PIGFkZHJlc3NlcyB0byBiZSBwcm9iZWQuIFNvbWUgc3BlY2lhbCBmbGFncy4uCisgICAgICBBZGRyICYgMSA9IFJlYWQgYmFjayB0aGUgYWRkcmVzcyBwb3J0LCBsb29rIGZvciBzaWduYXR1cmUgYW5kIHJlc2V0CisgICAgICAgICAgICAgICAgIHRoZSBwYWdlIHdpbmRvdyBiZWZvcmUgcHJvYmluZyAKKyAgICAgIEFkZHIgJiAzID0gUmVzZXQgdGhlIHBhZ2Ugd2luZG93IGFuZCBwcm9iZSAKKyAgIFRoZSBDTFBTIGV2YWwgYm9hcmQgaGFzIHRoZSBDaXJydXMgY2hpcCBhdCAweDgwMDkwMzAwLCBpbiBBUk0gSU8gc3BhY2UsCisgICBidXQgaXQgaXMgcG9zc2libGUgdGhhdCBhIENpcnJ1cyBib2FyZCBjb3VsZCBiZSBwbHVnZ2VkIGludG8gdGhlIElTQQorICAgc2xvdHMuICovCisvKiBUaGUgY3M4OTAwIGhhcyA0IElSUSBwaW5zLCBzb2Z0d2FyZSBzZWxlY3RhYmxlLiBjczg5MDBfaXJxX21hcCBtYXBzIAorICAgdGhlbSB0byBzeXN0ZW0gSVJRIG51bWJlcnMuIFRoaXMgbWFwcGluZyBpcyBjYXJkIHNwZWNpZmljIGFuZCBpcyBzZXQgdG8KKyAgIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBDaXJydXMgRXZhbCBib2FyZCBmb3IgdGhpcyBjaGlwLiAqLworI2lmZGVmIENPTkZJR19BUkNIX0NMUFM3NTAwCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0KKyAgIHsgMHg4MDA5MDMwMywgMHgzMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDB4MjAwLCAweDIyMCwgMHgyNDAsIDB4MjYwLCAweDI4MCwgMHgyYTAsIDB4MmMwLCAweDJlMCwgMH07CitzdGF0aWMgdW5zaWduZWQgaW50IGNzODkwMF9pcnFfbWFwW10gPSB7MTIsMCwwLDB9OworI2VsaWYgZGVmaW5lZChDT05GSUdfU0hfSElDT1NINCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV0Y2FyZF9wb3J0bGlzdFtdIF9faW5pdGRhdGEgPQorICAgeyAweDAzMDAsIDB9Oworc3RhdGljIHVuc2lnbmVkIGludCBjczg5MDBfaXJxX21hcFtdID0gezEsMCwwLDB9OworI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9JWERQMlgwMSkKKyNpbmNsdWRlIDxhc20vaXJxLmg+CitzdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0ge0lYRFAyWDAxX0NTODkwMF9WSVJUX0JBU0UsIDB9Oworc3RhdGljIHVuc2lnbmVkIGludCBjczg5MDBfaXJxX21hcFtdID0ge0lSUV9JWERQMlgwMV9DUzg5MDAsIDAsIDAsIDB9OworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV0Y2FyZF9wb3J0bGlzdFtdIF9faW5pdGRhdGEgPQorICAgeyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMHgyMDAsIDB4MjIwLCAweDI0MCwgMHgyNjAsIDB4MjgwLCAweDJhMCwgMHgyYzAsIDB4MmUwLCAwfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3M4OTAwX2lycV9tYXBbXSA9IHsxMCwxMSwxMiw1fTsKKyNlbmRpZgorCisjaWYgREVCVUdHSU5HCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldF9kZWJ1ZyA9IERFQlVHR0lORzsKKyNlbHNlCisjZGVmaW5lIG5ldF9kZWJ1ZyAwCS8qIGdjYyB3aWxsIHJlbW92ZSBhbGwgdGhlIGRlYnVnIGNvZGUgZm9yIHVzICovCisjZW5kaWYKKworLyogVGhlIG51bWJlciBvZiBsb3cgSS9PIHBvcnRzIHVzZWQgYnkgdGhlIGV0aGVyY2FyZC4gKi8KKyNkZWZpbmUgTkVUQ0FSRF9JT19FWFRFTlQJMTYKKworLyogd2UgYWxsb3cgdGhlIHVzZXIgdG8gb3ZlcnJpZGUgdmFyaW91cyB2YWx1ZXMgbm9ybWFsbHkgc2V0IGluIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgRk9SQ0VfUko0NQkweDAwMDEgICAgLyogcGljayBvbmUgb2YgdGhlc2UgdGhyZWUgKi8KKyNkZWZpbmUgRk9SQ0VfQVVJCTB4MDAwMgorI2RlZmluZSBGT1JDRV9CTkMJMHgwMDA0CisKKyNkZWZpbmUgRk9SQ0VfQVVUTwkweDAwMTAgICAgLyogcGljayBvbmUgb2YgdGhlc2UgdGhyZWUgKi8KKyNkZWZpbmUgRk9SQ0VfSEFMRgkweDAwMjAKKyNkZWZpbmUgRk9SQ0VfRlVMTAkweDAwMzAKKworLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuICovCitzdHJ1Y3QgbmV0X2xvY2FsIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlpbnQgY2hpcF90eXBlOwkJLyogb25lIG9mOiBDUzg5MDAsIENTODkyMCwgQ1M4OTIwTSAqLworCWNoYXIgY2hpcF9yZXZpc2lvbjsJLyogcmV2aXNpb24gbGV0dGVyIG9mIHRoZSBjaGlwICgnQScuLi4pICovCisJaW50IHNlbmRfY21kOwkJLyogdGhlIHByb3BlciBzZW5kIGNvbW1hbmQ6IFRYX05PVywgVFhfQUZURVJfMzgxLCBvciBUWF9BRlRFUl9BTEwgKi8KKwlpbnQgYXV0b19uZWdfY25mOwkvKiBhdXRvLW5lZ290aWF0aW9uIHdvcmQgZnJvbSBFRVBST00gKi8KKwlpbnQgYWRhcHRlcl9jbmY7CS8qIGFkYXB0ZXIgY29uZmlndXJhdGlvbiBmcm9tIEVFUFJPTSAqLworCWludCBpc2FfY29uZmlnOwkJLyogSVNBIGNvbmZpZ3VyYXRpb24gZnJvbSBFRVBST00gKi8KKwlpbnQgaXJxX21hcDsJCS8qIElSUSBtYXAgZnJvbSBFRVBST00gKi8KKwlpbnQgcnhfbW9kZTsJCS8qIHdoYXQgbW9kZSBhcmUgd2UgaW4/IDAsIFJYX01VTFRDQVNUX0FDQ0VQVCwgb3IgUlhfQUxMX0FDQ0VQVCAqLworCWludCBjdXJyX3J4X2NmZzsJLyogYSBjb3B5IG9mIFBQX1J4Q0ZHICovCisJaW50IGxpbmVjdGw7CQkvKiBlaXRoZXIgMCBvciBMT1dfUlhfU1FVRUxDSCwgZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24uICovCisJaW50IHNlbmRfdW5kZXJydW47CS8qIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgdW5kZXJydW5zIGluIGEgcm93IHdlIGdldCAqLworCWludCBmb3JjZTsJCS8qIGZvcmNlIHZhcmlvdXMgdmFsdWVzOyBzZWUgRk9SQ0UqIGFib3ZlLiAqLworCXNwaW5sb2NrX3QgbG9jazsKKyNpZiBBTExPV19ETUEKKwlpbnQgdXNlX2RtYTsJCS8qIEZsYWc6IHdlJ3JlIHVzaW5nIGRtYSAqLworCWludCBkbWE7CQkvKiBETUEgY2hhbm5lbCAqLworCWludCBkbWFzaXplOwkJLyogMTYgb3IgNjQgKi8KKwl1bnNpZ25lZCBjaGFyICpkbWFfYnVmZjsJLyogcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKmVuZF9kbWFfYnVmZjsJLyogcG9pbnRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKnJ4X2RtYV9wdHI7CS8qIHBvaW50cyB0byB0aGUgbmV4dCBwYWNrZXQgICovCisjZW5kaWYKK307CisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KKworc3RhdGljIGludCBjczg5eDBfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIsIGludCBtb2R1bGFyKTsKK3N0YXRpYyBpbnQgbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBuZXRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmV0X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBuZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJlc2V0X2NoaXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGdldF9lZXByb21fZGF0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgb2ZmLCBpbnQgbGVuLCBpbnQgKmJ1ZmZlcik7CitzdGF0aWMgaW50IGdldF9lZXByb21fY2tzdW0oaW50IG9mZiwgaW50IGxlbiwgaW50ICpidWZmZXIpOworc3RhdGljIGludCBzZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CitzdGF0aWMgdm9pZCBjb3VudF9yeF9lcnJvcnMoaW50IHN0YXR1cywgc3RydWN0IG5ldF9sb2NhbCAqbHApOworI2lmIEFMTE9XX0RNQQorc3RhdGljIHZvaWQgZ2V0X2RtYV9jaGFubmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcmVsZWFzZV9kbWFfYnVmZihzdHJ1Y3QgbmV0X2xvY2FsICpscCk7CisjZW5kaWYKKworLyogRXhhbXBsZSByb3V0aW5lcyB5b3UgbXVzdCB3cml0ZSA7LT4uICovCisjZGVmaW5lIHR4X2RvbmUoZGV2KSAxCisKKy8qCisgKiBQZXJtaXQgJ2NzODl4MF9kbWE9TicgaW4gdGhlIGtlcm5lbCBib290IGVudmlyb25tZW50CisgKi8KKyNpZiAhZGVmaW5lZChNT0RVTEUpICYmIChBTExPV19ETUEgIT0gMCkKK3N0YXRpYyBpbnQgZ19jczg5eDBfZG1hOworCitzdGF0aWMgaW50IF9faW5pdCBkbWFfZm4oY2hhciAqc3RyKQoreworCWdfY3M4OXgwX2RtYSA9IHNpbXBsZV9zdHJ0b2woc3RyLE5VTEwsMCk7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImNzODl4MF9kbWE9IiwgZG1hX2ZuKTsKKyNlbmRpZgkvKiAhZGVmaW5lZChNT0RVTEUpICYmIChBTExPV19ETUEgIT0gMCkgKi8KKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgZ19jczg5eDBfbWVkaWFfX2ZvcmNlOworCitzdGF0aWMgaW50IF9faW5pdCBtZWRpYV9mbihjaGFyICpzdHIpCit7CisJaWYgKCFzdHJjbXAoc3RyLCAicmo0NSIpKSBnX2NzODl4MF9tZWRpYV9fZm9yY2UgPSBGT1JDRV9SSjQ1OworCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiYXVpIikpIGdfY3M4OXgwX21lZGlhX19mb3JjZSA9IEZPUkNFX0FVSTsKKwllbHNlIGlmICghc3RyY21wKHN0ciwgImJuYyIpKSBnX2NzODl4MF9tZWRpYV9fZm9yY2UgPSBGT1JDRV9CTkM7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImNzODl4MF9tZWRpYT0iLCBtZWRpYV9mbik7CisKKwwKKy8qIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUsIGFuZCByZXR1cm4gJzAnIGlmZiBvbmUgZXhpc3RzLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMCwgcHJvYmUgYWxsIGxpa2VseSBsb2NhdGlvbnMuCisgICBJZiBkZXYtPmJhc2VfYWRkciA9PSAxLCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCisgICBJZiBkZXYtPmJhc2VfYWRkciA9PSAyLCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGRldmljZSBhbmQgcmV0dXJuIHN1Y2Nlc3MKKyAgIChkZXRhY2hhYmxlIGRldmljZXMgb25seSkuCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLgorICAgKi8KKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgY3M4OXgwX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCXVuc2lnbmVkICpwb3J0OworCWludCBlcnIgPSAwOworCWludCBpcnE7CisJaW50IGlvOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJaW8gPSBkZXYtPmJhc2VfYWRkcjsKKwlpcnEgPSBkZXYtPmlycTsKKworCWlmIChuZXRfZGVidWcpCisJCXByaW50aygiY3M4OXgwOmNzODl4MF9wcm9iZSgweCV4KVxuIiwgaW8pOworCisJaWYgKGlvID4gMHgxZmYpCXsJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQllcnIgPSBjczg5eDBfcHJvYmUxKGRldiwgaW8sIDApOworCX0gZWxzZSBpZiAoaW8gIT0gMCkgewkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCWVyciA9IC1FTlhJTzsKKwl9IGVsc2UgeworCQlmb3IgKHBvcnQgPSBuZXRjYXJkX3BvcnRsaXN0OyAqcG9ydDsgcG9ydCsrKSB7CisJCQlpZiAoY3M4OXgwX3Byb2JlMShkZXYsICpwb3J0LCAwKSA9PSAwKQorCQkJCWJyZWFrOworCQkJZGV2LT5pcnEgPSBpcnE7CisJCX0KKwkJaWYgKCEqcG9ydCkKKwkJCWVyciA9IC1FTk9ERVY7CisJfQorCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwlvdXR3KFBQX0NoaXBJRCwgZGV2LT5iYXNlX2FkZHIgKyBBRERfUE9SVCk7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIE5FVENBUkRfSU9fRVhURU5UKTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXByaW50ayhLRVJOX1dBUk5JTkcgImNzODl4MDogbm8gY3M4OTAwIG9yIGNzODkyMCBkZXRlY3RlZC4gIEJlIHN1cmUgdG8gZGlzYWJsZSBQblAgd2l0aCBTRVRVUFxuIik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CityZWFkcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0bm8pCit7CisJb3V0dyhwb3J0bm8sIGRldi0+YmFzZV9hZGRyICsgQUREX1BPUlQpOworCXJldHVybiBpbncoZGV2LT5iYXNlX2FkZHIgKyBEQVRBX1BPUlQpOworfQorCitzdGF0aWMgdm9pZAord3JpdGVyZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBvcnRubywgaW50IHZhbHVlKQoreworCW91dHcocG9ydG5vLCBkZXYtPmJhc2VfYWRkciArIEFERF9QT1JUKTsKKwlvdXR3KHZhbHVlLCBkZXYtPmJhc2VfYWRkciArIERBVEFfUE9SVCk7Cit9CisKK3N0YXRpYyBpbnQKK3JlYWR3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0bm8pCit7CisJcmV0dXJuIGludyhkZXYtPmJhc2VfYWRkciArIHBvcnRubyk7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZXdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBvcnRubywgaW50IHZhbHVlKQoreworCW91dHcodmFsdWUsIGRldi0+YmFzZV9hZGRyICsgcG9ydG5vKTsKK30KKworc3RhdGljIGludCBfX2luaXQKK3dhaXRfZWVwcm9tX3JlYWR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHRpbWVvdXQgPSBqaWZmaWVzOworCS8qIGNoZWNrIHRvIHNlZSBpZiB0aGUgRUVQUk9NIGlzIHJlYWR5LCBhIHRpbWVvdXQgaXMgdXNlZCAtCisJICAganVzdCBpbiBjYXNlIEVFUFJPTSBpcyByZWFkeSB3aGVuIFNJX0JVU1kgaW4gdGhlCisJICAgUFBfU2VsZlNUIGlzIGNsZWFyICovCisJd2hpbGUocmVhZHJlZyhkZXYsIFBQX1NlbGZTVCkgJiBTSV9CVVNZKQorCQlpZiAoamlmZmllcyAtIHRpbWVvdXQgPj0gNDApCisJCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0CitnZXRfZWVwcm9tX2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9mZiwgaW50IGxlbiwgaW50ICpidWZmZXIpCit7CisJaW50IGk7CisKKwlpZiAobmV0X2RlYnVnID4gMykgcHJpbnRrKCJFRVBST00gZGF0YSBmcm9tICV4IGZvciAleDpcbiIsb2ZmLGxlbik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmICh3YWl0X2VlcHJvbV9yZWFkeShkZXYpIDwgMCkgcmV0dXJuIC0xOworCQkvKiBOb3cgc2VuZCB0aGUgRUVQUk9NIHJlYWQgY29tbWFuZCBhbmQgRUVQUk9NIGxvY2F0aW9uIHRvIHJlYWQgKi8KKwkJd3JpdGVyZWcoZGV2LCBQUF9FRUNNRCwgKG9mZiArIGkpIHwgRUVQUk9NX1JFQURfQ01EKTsKKwkJaWYgKHdhaXRfZWVwcm9tX3JlYWR5KGRldikgPCAwKSByZXR1cm4gLTE7CisJCWJ1ZmZlcltpXSA9IHJlYWRyZWcoZGV2LCBQUF9FRURhdGEpOworCQlpZiAobmV0X2RlYnVnID4gMykgcHJpbnRrKCIlMDR4ICIsIGJ1ZmZlcltpXSk7CisJfQorCWlmIChuZXRfZGVidWcgPiAzKSBwcmludGsoIlxuIik7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50ICBfX2luaXQKK2dldF9lZXByb21fY2tzdW0oaW50IG9mZiwgaW50IGxlbiwgaW50ICpidWZmZXIpCit7CisJaW50IGksIGNrc3VtOworCisJY2tzdW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJY2tzdW0gKz0gYnVmZmVyW2ldOworCWNrc3VtICY9IDB4ZmZmZjsKKwlpZiAoY2tzdW0gPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC0xOworfQorCisvKiBUaGlzIGlzIHRoZSByZWFsIHByb2JlIHJvdXRpbmUuICBMaW51eCBoYXMgYSBoaXN0b3J5IG9mIGZyaWVuZGx5IGRldmljZQorICAgcHJvYmVzIG9uIHRoZSBJU0EgYnVzLiAgQSBnb29kIGRldmljZSBwcm9iZXMgYXZvaWRzIGRvaW5nIHdyaXRlcywgYW5kCisgICB2ZXJpZmllcyB0aGF0IHRoZSBjb3JyZWN0IGRldmljZSBleGlzdHMgYW5kIGZ1bmN0aW9ucy4KKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KKworc3RhdGljIGludCBfX2luaXQKK2NzODl4MF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkciwgaW50IG1vZHVsYXIpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisJaW50IGk7CisJdW5zaWduZWQgcmV2X3R5cGUgPSAwOworCWludCBlZXByb21fYnVmZltDSEtTVU1fTEVOXTsKKwlpbnQgcmV0dmFsOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJaWYgKCFtb2R1bGFyKSB7CisJCW1lbXNldChscCwgMCwgc2l6ZW9mKCpscCkpOworCQlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworI2lmbmRlZiBNT0RVTEUKKyNpZiBBTExPV19ETUEKKwkJaWYgKGdfY3M4OXgwX2RtYSkgeworCQkJbHAtPnVzZV9kbWEgPSAxOworCQkJbHAtPmRtYSA9IGdfY3M4OXgwX2RtYTsKKwkJCWxwLT5kbWFzaXplID0gMTY7CS8qIENvdWxkIG1ha2UgdGhpcyBhbiBvcHRpb24uLi4gKi8KKwkJfQorI2VuZGlmCisJCWxwLT5mb3JjZSA9IGdfY3M4OXgwX21lZGlhX19mb3JjZTsKKyNlbmRpZgorICAgICAgICB9CisKKwkvKiBHcmFiIHRoZSByZWdpb24gc28gd2UgY2FuIGZpbmQgYW5vdGhlciBib2FyZCBpZiBhdXRvSVJRIGZhaWxzLiAqLworCS8qIFdURiBpcyBnb2luZyBvbiBoZXJlPyAqLworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyICYgfjMsIE5FVENBUkRfSU9fRVhURU5ULCBEUlZfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVxdWVzdF9yZWdpb24oMHgleCwgMHgleCkgZmFpbGVkXG4iLAorCQkJCURSVl9OQU1FLCBpb2FkZHIsIE5FVENBUkRfSU9fRVhURU5UKTsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIG91dDE7CisJfQorCisjaWZkZWYgQ09ORklHX1NIX0hJQ09TSDQKKwkvKiB0cnVlbHkgcmVzZXQgdGhlIGNoaXAgKi8KKwlvdXR3KDB4MDExNCwgaW9hZGRyICsgQUREX1BPUlQpOworCW91dHcoMHgwMDQwLCBpb2FkZHIgKyBEQVRBX1BPUlQpOworI2VuZGlmCisKKwkvKiBpZiB0aGV5IGdpdmUgdXMgYW4gb2RkIEkvTyBhZGRyZXNzLCB0aGVuIGRvIE9ORSB3cml0ZSB0bworICAgICAgICAgICB0aGUgYWRkcmVzcyBwb3J0LCB0byBnZXQgaXQgYmFjayB0byBhZGRyZXNzIHplcm8sIHdoZXJlIHdlCisgICAgICAgICAgIGV4cGVjdCB0byBmaW5kIHRoZSBFSVNBIHNpZ25hdHVyZSB3b3JkLiBBbiBJTyB3aXRoIGEgYmFzZSBvZiAweDMKKwkgICB3aWxsIHNraXAgdGhlIHRlc3QgZm9yIHRoZSBBRERfUE9SVC4gKi8KKwlpZiAoaW9hZGRyICYgMSkgeworCQlpZiAobmV0X2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBvZGQgaW9hZGRyIDB4JXhcbiIsIGRldi0+bmFtZSwgaW9hZGRyKTsKKwkgICAgICAgIGlmICgoaW9hZGRyICYgMikgIT0gMikKKwkgICAgICAgIAlpZiAoKGludygoaW9hZGRyICYgfjMpKyBBRERfUE9SVCkgJiBBRERfTUFTSykgIT0gQUREX1NJRykgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJhZCBzaWduYXR1cmUgMHgleFxuIiwKKwkJCQkJZGV2LT5uYW1lLCBpbncoKGlvYWRkciAmIH4zKSsgQUREX1BPUlQpKTsKKwkJICAgICAgICAJcmV0dmFsID0gLUVOT0RFVjsKKwkJCQlnb3RvIG91dDI7CisJCQl9CisJfQorcHJpbnRrKCJQUF9hZGRyPTB4JXhcbiIsIGludyhpb2FkZHIgKyBBRERfUE9SVCkpOworCisJaW9hZGRyICY9IH4zOworCW91dHcoUFBfQ2hpcElELCBpb2FkZHIgKyBBRERfUE9SVCk7CisKKwlpZiAoaW53KGlvYWRkciArIERBVEFfUE9SVCkgIT0gQ0hJUF9FSVNBX0lEX1NJRykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbmNvcnJlY3Qgc2lnbmF0dXJlIDB4JXhcbiIsCisJCQlkZXYtPm5hbWUsIGludyhpb2FkZHIgKyBEQVRBX1BPUlQpKTsKKyAgCQlyZXR2YWwgPSAtRU5PREVWOworICAJCWdvdG8gb3V0MjsKKwl9CisKKwkvKiBGaWxsIGluIHRoZSAnZGV2JyBmaWVsZHMuICovCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKwkvKiBnZXQgdGhlIGNoaXAgdHlwZSAqLworCXJldl90eXBlID0gcmVhZHJlZyhkZXYsIFBST0RVQ1RfSURfQUREKTsKKwlscC0+Y2hpcF90eXBlID0gcmV2X3R5cGUgJn4gUkVWSVNPTl9CSVRTOworCWxwLT5jaGlwX3JldmlzaW9uID0gKChyZXZfdHlwZSAmIFJFVklTT05fQklUUykgPj4gOCkgKyAnQSc7CisKKwkvKiBDaGVjayB0aGUgY2hpcCB0eXBlIGFuZCByZXZpc2lvbiBpbiBvcmRlciB0byBzZXQgdGhlIGNvcnJlY3Qgc2VuZCBjb21tYW5kCisJQ1M4OTIwIHJldmlzaW9uIEMgYW5kIENTODkwMCByZXZpc2lvbiBGIGNhbiB1c2UgdGhlIGZhc3RlciBzZW5kLiAqLworCWxwLT5zZW5kX2NtZCA9IFRYX0FGVEVSXzM4MTsKKwlpZiAobHAtPmNoaXBfdHlwZSA9PSBDUzg5MDAgJiYgbHAtPmNoaXBfcmV2aXNpb24gPj0gJ0YnKQorCQlscC0+c2VuZF9jbWQgPSBUWF9OT1c7CisJaWYgKGxwLT5jaGlwX3R5cGUgIT0gQ1M4OTAwICYmIGxwLT5jaGlwX3JldmlzaW9uID49ICdDJykKKwkJbHAtPnNlbmRfY21kID0gVFhfTk9XOworCisJaWYgKG5ldF9kZWJ1ZyAgJiYgIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayh2ZXJzaW9uKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBjczg5JWMwJXMgcmV2ICVjIGZvdW5kIGF0ICUjM2x4ICIsCisJICAgICAgIGRldi0+bmFtZSwKKwkgICAgICAgbHAtPmNoaXBfdHlwZT09Q1M4OTAwPycwJzonMicsCisJICAgICAgIGxwLT5jaGlwX3R5cGU9PUNTODkyME0/Ik0iOiIiLAorCSAgICAgICBscC0+Y2hpcF9yZXZpc2lvbiwKKwkgICAgICAgZGV2LT5iYXNlX2FkZHIpOworCisJcmVzZXRfY2hpcChkZXYpOworICAgCisgICAgICAgIC8qIEhlcmUgd2UgcmVhZCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBjaGlwLiBJZiB0aGVyZQorCSAgIGlzIG5vIEV4dGVuZGVkIEVFUFJPTSB0aGVuIHRoZSBpZGVhIGlzIHRvIG5vdCBkaXN0dXJiIHRoZSBjaGlwCisJICAgY29uZmlndXJhdGlvbiwgaXQgc2hvdWxkIGhhdmUgYmVlbiBjb3JyZWN0bHkgc2V0dXAgYnkgYXV0b21hdGljCisJICAgRUVQUk9NIHJlYWQgb24gcmVzZXQuIFNvLCBpZiB0aGUgY2hpcCBzYXlzIGl0IHJlYWQgdGhlIEVFUFJPTQorCSAgIHRoZSBkcml2ZXIgd2lsbCBhbHdheXMgZG8gKnNvbWV0aGluZyogaW5zdGVhZCBvZiBjb21wbGFpbiB0aGF0CisJICAgYWRhcHRlcl9jbmYgaXMgMC4gKi8KKworI2lmZGVmIENPTkZJR19TSF9ISUNPU0g0CisJaWYgKDEpIHsKKwkJLyogRm9yIHRoZSBIaUNPLlNINCBib2FyZCwgdGhpbmdzIGFyZSBkaWZmZXJlbnQ6IHdlIGRvbid0CisJCSAgIGhhdmUgRUVQUk9NLCBidXQgdGhlcmUgaXMgc29tZSBkYXRhIGluIGZsYXNoLCBzbyB3ZSBnbworCQkgICBnZXQgaXQgdGhlcmUgZGlyZWN0bHkgKE1BQykuICovCisJCV9fdTE2ICpjb25mZDsKKwkJc2hvcnQgY250OworCQlpZiAoKCgqICh2b2xhdGlsZSBfX3UzMiAqKSAweGEwMDEzZmYwKSAmIDB4MDBmZmZmZmYpCisJCQk9PSAweDAwNmMzMDAwKSB7CisJCQljb25mZCA9IChfX3UxNiopIDB4YTAwMTNmYzA7CisJCX0gZWxzZSB7CisJCQljb25mZCA9IChfX3UxNiopIDB4YTAwMWZmYzA7CisJCX0KKwkJY250ID0gKCpjb25mZCsrICYgMHgwMGZmKSA+PiAxOworCQl3aGlsZSAoLS1jbnQgPiAwKSB7CisJCQlfX3UxNiBqID0gKmNvbmZkKys7CisJCQkKKwkJCXN3aXRjaCAoaiAmIDB4MGZmZikgeworCQkJY2FzZSBQUF9JQToKKwkJCQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU4vMjsgaSsrKSB7CisJCQkJCWRldi0+ZGV2X2FkZHJbaSoyXSA9IGNvbmZkW2ldICYgMHhGRjsKKwkJCQkJZGV2LT5kZXZfYWRkcltpKjIrMV0gPSBjb25mZFtpXSA+PiA4OworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWogPSAoaiA+PiAxMikgKyAxOworCQkJY29uZmQgKz0gajsKKwkJCWNudCAtPSBqOworCQl9CisJfSBlbHNlCisjZW5kaWYKKworICAgICAgICBpZiAoKHJlYWRyZWcoZGV2LCBQUF9TZWxmU1QpICYgKEVFUFJPTV9PSyB8IEVFUFJPTV9QUkVTRU5UKSkgPT0gCisJICAgICAgKEVFUFJPTV9PS3xFRVBST01fUFJFU0VOVCkpIHsKKwkgICAgICAgIC8qIExvYWQgdGhlIE1BQy4gKi8KKwkJZm9yIChpPTA7IGkgPCBFVEhfQUxFTi8yOyBpKyspIHsKKwkgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEFkZHI7CisJCQlBZGRyID0gcmVhZHJlZyhkZXYsIFBQX0lBK2kqMik7CisJCSAgICAgICAgZGV2LT5kZXZfYWRkcltpKjJdID0gQWRkciAmIDB4RkY7CisJCSAgICAgICAgZGV2LT5kZXZfYWRkcltpKjIrMV0gPSBBZGRyID4+IDg7CisJCX0KKyAgIAorCSAgIAkvKiBMb2FkIHRoZSBBZGFwdGVyIENvbmZpZ3VyYXRpb24uIAorCQkgICBOb3RlOiAgQmFycmluZyBhbnkgbW9yZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmcm9tIHNvbWUgCisJCSAgIG90aGVyIHNvdXJjZSAoaWUgRUVQUk9NK1NjaGVtYXRpY3MpLCB3ZSB3b3VsZCBub3Qga25vdyAKKwkJICAgaG93IHRvIG9wZXJhdGUgYSAxMEJhc2UyIGludGVyZmFjZSBvbiB0aGUgQVVJIHBvcnQuIAorCQkgICBIb3dldmVyLCBzaW5jZSB3ZSAgZG8gcmVhZCB0aGUgc3RhdHVzIG9mIEhDQjEgYW5kIHVzZSAKKwkJICAgc2V0dGluZ3MgdGhhdCBhbHdheXMgcmVzdWx0IGluIGNhbGxzIHRvIGNvbnRyb2xfZGNfZGMoZGV2LDApIAorCQkgICBhIEJOQyBpbnRlcmZhY2Ugc2hvdWxkIHdvcmsgaWYgdGhlIGVuYWJsZSBwaW4gCisJCSAgIChkYy9kYyBjb252ZXJ0ZXIpIGlzIG9uIEhDQjEuIEl0IHdpbGwgYmUgY2FsbGVkIEFVSSAKKwkJICAgaG93ZXZlci4gKi8KKwkgICAKKwkJbHAtPmFkYXB0ZXJfY25mID0gMDsKKwkJaSA9IHJlYWRyZWcoZGV2LCBQUF9MaW5lQ1RMKTsKKwkJLyogUHJlc2VydmUgdGhlIHNldHRpbmcgb2YgdGhlIEhDQjEgcGluLiAqLworCQlpZiAoKGkgJiAoSENCMSB8IEhDQjFfRU5CTCkpID09ICAoSENCMSB8IEhDQjFfRU5CTCkpCisJCQlscC0+YWRhcHRlcl9jbmYgfD0gQV9DTkZfRENfRENfUE9MQVJJVFk7CisJCS8qIFNhdmUgdGhlIHNxZWxjaCBiaXQgKi8KKwkJaWYgKChpICYgTE9XX1JYX1NRVUVMQ0gpID09IExPV19SWF9TUVVFTENIKQorCQkJbHAtPmFkYXB0ZXJfY25mIHw9IEFfQ05GX0VYVE5EXzEwQl8yIHwgQV9DTkZfTE9XX1JYX1NRVUVMQ0g7CisJCS8qIENoZWNrIGlmIHRoZSBjYXJkIGlzIGluIDEwQmFzZS10IG9ubHkgbW9kZSAqLworCQlpZiAoKGkgJiAoQVVJX09OTFkgfCBBVVRPX0FVSV8xMEJBU0VUKSkgPT0gMCkKKwkJCWxwLT5hZGFwdGVyX2NuZiB8PSAgQV9DTkZfMTBCX1QgfCBBX0NORl9NRURJQV8xMEJfVDsKKwkJLyogQ2hlY2sgaWYgdGhlIGNhcmQgaXMgaW4gQVVJIG9ubHkgbW9kZSAqLworCQlpZiAoKGkgJiAoQVVJX09OTFkgfCBBVVRPX0FVSV8xMEJBU0VUKSkgPT0gQVVJX09OTFkpCisJCQlscC0+YWRhcHRlcl9jbmYgfD0gIEFfQ05GX0FVSSB8IEFfQ05GX01FRElBX0FVSTsKKwkJLyogQ2hlY2sgaWYgdGhlIGNhcmQgaXMgaW4gQXV0byBtb2RlLiAqLworCQlpZiAoKGkgJiAoQVVJX09OTFkgfCBBVVRPX0FVSV8xMEJBU0VUKSkgPT0gQVVUT19BVUlfMTBCQVNFVCkKKwkJCWxwLT5hZGFwdGVyX2NuZiB8PSAgQV9DTkZfQVVJIHwgQV9DTkZfMTBCX1QgfCAKKwkJCUFfQ05GX01FRElBX0FVSSB8IEFfQ05GX01FRElBXzEwQl9UIHwgQV9DTkZfTUVESUFfQVVUTzsKKwkJCisJCWlmIChuZXRfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBQX0xpbmVDVEw9MHgleCwgYWRhcHRlcl9jbmY9MHgleFxuIiwKKwkJCQkJZGV2LT5uYW1lLCBpLCBscC0+YWRhcHRlcl9jbmYpOworCisJCS8qIElSUS4gT3RoZXIgY2hpcHMgYWxyZWFkeSBwcm9iZSwgc2VlIGJlbG93LiAqLworCQlpZiAobHAtPmNoaXBfdHlwZSA9PSBDUzg5MDApIAorCQkJbHAtPmlzYV9jb25maWcgPSByZWFkcmVnKGRldiwgUFBfQ1M4OTAwX0lTQUlOVCkgJiBJTlRfTk9fTUFTSzsKKwkgICAKKwkJcHJpbnRrKCAiW0NpcnJ1cyBFRVBST01dICIpOworCX0KKworICAgICAgICBwcmludGsoIlxuIik7CisgICAKKwkvKiBGaXJzdCBjaGVjayB0byBzZWUgaWYgYW4gRUVQUk9NIGlzIGF0dGFjaGVkLiAqLworI2lmZGVmIENPTkZJR19TSF9ISUNPU0g0IC8qIG5vIEVFUFJPTSBvbiBIaUNPLCBkb24ndCBoYXp6bGUgd2l0aCBpdCBoZXJlICovCisJaWYgKDEpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJjczg5eDA6IE5vIEVFUFJPTSBvbiBIaUNPLlNINFxuIik7CisJfSBlbHNlCisjZW5kaWYKKwlpZiAoKHJlYWRyZWcoZGV2LCBQUF9TZWxmU1QpICYgRUVQUk9NX1BSRVNFTlQpID09IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNzODl4MDogTm8gRUVQUk9NLCByZWx5aW5nIG9uIGNvbW1hbmQgbGluZS4uLi5cbiIpOworCWVsc2UgaWYgKGdldF9lZXByb21fZGF0YShkZXYsIFNUQVJUX0VFUFJPTV9EQVRBLENIS1NVTV9MRU4sZWVwcm9tX2J1ZmYpIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJcbmNzODl4MDogRUVQUk9NIHJlYWQgZmFpbGVkLCByZWx5aW5nIG9uIGNvbW1hbmQgbGluZS5cbiIpOworICAgICAgICB9IGVsc2UgaWYgKGdldF9lZXByb21fY2tzdW0oU1RBUlRfRUVQUk9NX0RBVEEsQ0hLU1VNX0xFTixlZXByb21fYnVmZikgPCAwKSB7CisJCS8qIENoZWNrIGlmIHRoZSBjaGlwIHdhcyBhYmxlIHRvIHJlYWQgaXRzIG93biBjb25maWd1cmF0aW9uIHN0YXJ0aW5nCisJCSAgIGF0IDAgaW4gdGhlIEVFUFJPTSovCisJCWlmICgocmVhZHJlZyhkZXYsIFBQX1NlbGZTVCkgJiAoRUVQUk9NX09LIHwgRUVQUk9NX1BSRVNFTlQpKSAhPQorCQkgICAgKEVFUFJPTV9PS3xFRVBST01fUFJFU0VOVCkpIAorICAgICAgICAgICAgICAgIAlwcmludGsoS0VSTl9XQVJOSU5HICJjczg5eDA6IEV4dGVuZGVkIEVFUFJPTSBjaGVja3N1bSBiYWQgYW5kIG5vIENpcnJ1cyBFRVBST00sIHJlbHlpbmcgb24gY29tbWFuZCBsaW5lXG4iKTsKKwkJICAgCisgICAgICAgIH0gZWxzZSB7CisJCS8qIFRoaXMgcmVhZHMgYW4gZXh0ZW5kZWQgRUVQUk9NIHRoYXQgaXMgbm90IGRvY3VtZW50ZWQKKwkJICAgaW4gdGhlIENTODkwMCBkYXRhc2hlZXQuICovCisJCQorICAgICAgICAgICAgICAgIC8qIGdldCB0cmFuc21pc3Npb24gY29udHJvbCB3b3JkICBidXQga2VlcCB0aGUgYXV0b25lZ290aWF0aW9uIGJpdHMgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWxwLT5hdXRvX25lZ19jbmYpIGxwLT5hdXRvX25lZ19jbmYgPSBlZXByb21fYnVmZltBVVRPX05FR19DTkZfT0ZGU0VULzJdOworICAgICAgICAgICAgICAgIC8qIFN0b3JlIGFkYXB0ZXIgY29uZmlndXJhdGlvbiAqLworICAgICAgICAgICAgICAgIGlmICghbHAtPmFkYXB0ZXJfY25mKSBscC0+YWRhcHRlcl9jbmYgPSBlZXByb21fYnVmZltBREFQVEVSX0NORl9PRkZTRVQvMl07CisgICAgICAgICAgICAgICAgLyogU3RvcmUgSVNBIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgICAgICAgICBscC0+aXNhX2NvbmZpZyA9IGVlcHJvbV9idWZmW0lTQV9DTkZfT0ZGU0VULzJdOworICAgICAgICAgICAgICAgIGRldi0+bWVtX3N0YXJ0ID0gZWVwcm9tX2J1ZmZbUEFDS0VUX1BBR0VfT0ZGU0VULzJdIDw8IDg7CisKKyAgICAgICAgICAgICAgICAvKiBlZXByb21fYnVmZiBoYXMgMzItYml0IGludHMsIHNvIHdlIGNhbid0IGp1c3QgbWVtY3B5IGl0ICovCisgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGluaXRpYWwgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTi8yOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+ZGV2X2FkZHJbaSoyXSA9IGVlcHJvbV9idWZmW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5kZXZfYWRkcltpKjIrMV0gPSBlZXByb21fYnVmZltpXSA+PiA4OworICAgICAgICAgICAgICAgIH0KKwkJaWYgKG5ldF9kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5ldyBhZGFwdGVyX2NuZjogMHgleFxuIiwKKwkJCQlkZXYtPm5hbWUsIGxwLT5hZGFwdGVyX2NuZik7CisgICAgICAgIH0KKworICAgICAgICAvKiBhbGxvdyB0aGVtIHRvIGZvcmNlIG11bHRpcGxlIHRyYW5zY2VpdmVycy4gIElmIHRoZXkgZm9yY2UgbXVsdGlwbGUsIGF1dG9zZW5zZSAqLworICAgICAgICB7CisJCWludCBjb3VudCA9IDA7CisJCWlmIChscC0+Zm9yY2UgJiBGT1JDRV9SSjQ1KQl7bHAtPmFkYXB0ZXJfY25mIHw9IEFfQ05GXzEwQl9UOyBjb3VudCsrOyB9CisJCWlmIChscC0+Zm9yY2UgJiBGT1JDRV9BVUkpIAl7bHAtPmFkYXB0ZXJfY25mIHw9IEFfQ05GX0FVSTsgY291bnQrKzsgfQorCQlpZiAobHAtPmZvcmNlICYgRk9SQ0VfQk5DKQl7bHAtPmFkYXB0ZXJfY25mIHw9IEFfQ05GXzEwQl8yOyBjb3VudCsrOyB9CisJCWlmIChjb3VudCA+IDEpCQkJe2xwLT5hZGFwdGVyX2NuZiB8PSBBX0NORl9NRURJQV9BVVRPOyB9CisJCWVsc2UgaWYgKGxwLT5mb3JjZSAmIEZPUkNFX1JKNDUpe2xwLT5hZGFwdGVyX2NuZiB8PSBBX0NORl9NRURJQV8xMEJfVDsgfQorCQllbHNlIGlmIChscC0+Zm9yY2UgJiBGT1JDRV9BVUkpCXtscC0+YWRhcHRlcl9jbmYgfD0gQV9DTkZfTUVESUFfQVVJOyB9CisJCWVsc2UgaWYgKGxwLT5mb3JjZSAmIEZPUkNFX0JOQykJe2xwLT5hZGFwdGVyX2NuZiB8PSBBX0NORl9NRURJQV8xMEJfMjsgfQorICAgICAgICB9CisKKwlpZiAobmV0X2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBhZnRlciBmb3JjZSAweCV4LCBhZGFwdGVyX2NuZj0weCV4XG4iLAorCQkJZGV2LT5uYW1lLCBscC0+Zm9yY2UsIGxwLT5hZGFwdGVyX2NuZik7CisKKyAgICAgICAgLyogRklYTUU6IFdlIGRvbid0IGxldCB5b3Ugc2V0IGRjLWRjIHBvbGFyaXR5IG9yIGxvdyBSWCBzcXVlbGNoIGZyb20gdGhlIGNvbW1hbmQgbGluZTogYWRkIGl0IGhlcmUgKi8KKworICAgICAgICAvKiBGSVhNRTogV2UgZG9uJ3QgbGV0IHlvdSBzZXQgdGhlIElNTSBiaXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lOiBhZGQgaXQgdG8gbHAtPmF1dG9fbmVnX2NuZiBoZXJlICovCisKKyAgICAgICAgLyogRklYTUU6IHdlIGRvbid0IHNldCB0aGUgRXRoZXJuZXQgYWRkcmVzcyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgVXNlCisgICAgICAgICAgIGlmY29uZmlnIElGQUNFIGh3IGV0aGVyIEFBQkJDQ0RERUVGRiAqLworCisJcHJpbnRrKEtFUk5fSU5GTyAiY3M4OXgwIG1lZGlhICVzJXMlcyIsCisJICAgICAgIChscC0+YWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfVCk/IlJKLTQ1LCI6IiIsCisJICAgICAgIChscC0+YWRhcHRlcl9jbmYgJiBBX0NORl9BVUkpPyJBVUksIjoiIiwKKwkgICAgICAgKGxwLT5hZGFwdGVyX2NuZiAmIEFfQ05GXzEwQl8yKT8iQk5DLCI6IiIpOworCisJbHAtPmlycV9tYXAgPSAweGZmZmY7CisKKwkvKiBJZiB0aGlzIGlzIGEgQ1M4OTAwIHRoZW4gbm8gcG5wIHNvZnQgKi8KKwlpZiAobHAtPmNoaXBfdHlwZSAhPSBDUzg5MDAgJiYKKwkgICAgLyogQ2hlY2sgaWYgdGhlIElTQSBJUlEgaGFzIGJlZW4gc2V0ICAqLworCQkoaSA9IHJlYWRyZWcoZGV2LCBQUF9DUzg5MjBfSVNBSU5UKSAmIDB4ZmYsCisJCSAoaSAhPSAwICYmIGkgPCBDUzg5MjBfTk9fSU5UUykpKSB7CisJCWlmICghZGV2LT5pcnEpCisJCQlkZXYtPmlycSA9IGk7CisJfSBlbHNlIHsKKwkJaSA9IGxwLT5pc2FfY29uZmlnICYgSU5UX05PX01BU0s7CisJCWlmIChscC0+Y2hpcF90eXBlID09IENTODkwMCkgeworI2lmZGVmIENPTkZJR19BUkNIX0lYRFAyWDAxCisJCSAgICAgICAgaSA9IGNzODkwMF9pcnFfbWFwWzBdOworI2Vsc2UKKwkJCS8qIFRyYW5zbGF0ZSB0aGUgSVJRIHVzaW5nIHRoZSBJUlEgbWFwcGluZyB0YWJsZS4gKi8KKwkJCWlmIChpID49IHNpemVvZihjczg5MDBfaXJxX21hcCkvc2l6ZW9mKGNzODkwMF9pcnFfbWFwWzBdKSkKKwkJCQlwcmludGsoIlxuY3M4OXgwOiBpbnZhbGlkIElTQSBpbnRlcnJ1cHQgbnVtYmVyICVkXG4iLCBpKTsKKwkJCWVsc2UKKwkJCQlpID0gY3M4OTAwX2lycV9tYXBbaV07CisJCQkKKwkJCWxwLT5pcnFfbWFwID0gQ1M4OTAwX0lSUV9NQVA7IC8qIGZpeGVkIElSUSBtYXAgZm9yIENTODkwMCAqLworCQl9IGVsc2UgeworCQkJaW50IGlycV9tYXBfYnVmZltJUlFfTUFQX0xFTi8yXTsKKworCQkJaWYgKGdldF9lZXByb21fZGF0YShkZXYsIElSUV9NQVBfRUVQUk9NX0RBVEEsCisJCQkJCSAgICBJUlFfTUFQX0xFTi8yLAorCQkJCQkgICAgaXJxX21hcF9idWZmKSA+PSAwKSB7CisJCQkJaWYgKChpcnFfbWFwX2J1ZmZbMF0gJiAweGZmKSA9PSBQTlBfSVJRX0ZSTVQpCisJCQkJCWxwLT5pcnFfbWFwID0gKGlycV9tYXBfYnVmZlswXT4+OCkgfCAoaXJxX21hcF9idWZmWzFdIDw8IDgpOworCQkJfQorI2VuZGlmCisJCX0KKwkJaWYgKCFkZXYtPmlycSkKKwkJCWRldi0+aXJxID0gaTsKKwl9CisKKwlwcmludGsoIiBJUlEgJWQiLCBkZXYtPmlycSk7CisKKyNpZiBBTExPV19ETUEKKwlpZiAobHAtPnVzZV9kbWEpIHsKKwkJZ2V0X2RtYV9jaGFubmVsKGRldik7CisJCXByaW50aygiLCBETUEgJWQiLCBkZXYtPmRtYSk7CisJfQorCWVsc2UKKyNlbmRpZgorCXsKKwkJcHJpbnRrKCIsIHByb2dyYW1tZWQgSS9PIik7CisJfQorCisJLyogcHJpbnQgdGhlIGV0aGVybmV0IGFkZHJlc3MuICovCisJcHJpbnRrKCIsIE1BQyIpOworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCXsKKwkJcHJpbnRrKCIlYyUwMngiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisKKwlkZXYtPm9wZW4JCT0gbmV0X29wZW47CisJZGV2LT5zdG9wCQk9IG5ldF9jbG9zZTsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gbmV0X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IEhaOworCWRldi0+aGFyZF9zdGFydF94bWl0IAk9IG5ldF9zZW5kX3BhY2tldDsKKwlkZXYtPmdldF9zdGF0cwkJPSBuZXRfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzIAk9IHNldF9tYWNfYWRkcmVzczsKKworCXByaW50aygiXG4iKTsKKwlpZiAobmV0X2RlYnVnKQorCQlwcmludGsoImNzODl4MF9wcm9iZTEoKSBzdWNjZXNzZnVsXG4iKTsKKwlyZXR1cm4gMDsKK291dDI6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyICYgfjMsIE5FVENBUkRfSU9fRVhURU5UKTsKK291dDE6CisJcmV0dXJuIHJldHZhbDsKK30KKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBwYWdlIGNvbnRhaW5zIERNQSByb3V0aW5lcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIEFMTE9XX0RNQQorCisjZGVmaW5lIGRtYV9wYWdlX2VxKHB0cjEsIHB0cjIpICgobG9uZykocHRyMSk+PjE3ID09IChsb25nKShwdHIyKT4+MTcpCisKK3N0YXRpYyB2b2lkCitnZXRfZG1hX2NoYW5uZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobHAtPmRtYSkgeworCQlkZXYtPmRtYSA9IGxwLT5kbWE7CisJCWxwLT5pc2FfY29uZmlnIHw9IElTQV9SeERNQTsKKwl9IGVsc2UgeworCQlpZiAoKGxwLT5pc2FfY29uZmlnICYgQU5ZX0lTQV9ETUEpID09IDApCisJCQlyZXR1cm47CisJCWRldi0+ZG1hID0gbHAtPmlzYV9jb25maWcgJiBETUFfTk9fTUFTSzsKKwkJaWYgKGxwLT5jaGlwX3R5cGUgPT0gQ1M4OTAwKQorCQkJZGV2LT5kbWEgKz0gNTsKKwkJaWYgKGRldi0+ZG1hIDwgNSB8fCBkZXYtPmRtYSA+IDcpIHsKKwkJCWxwLT5pc2FfY29uZmlnICY9IH5BTllfSVNBX0RNQTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV9kbWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNoaXBfdHlwZSwgaW50IGRtYSkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaWYgKChscC0+aXNhX2NvbmZpZyAmIEFOWV9JU0FfRE1BKSA9PSAwKQorCQlyZXR1cm47CisJaWYgKGNoaXBfdHlwZSA9PSBDUzg5MDApIHsKKwkJd3JpdGVyZWcoZGV2LCBQUF9DUzg5MDBfSVNBRE1BLCBkbWEtNSk7CisJfSBlbHNlIHsKKwkJd3JpdGVyZWcoZGV2LCBQUF9DUzg5MjBfSVNBRE1BLCBkbWEpOworCX0KK30KKworc3RhdGljIHZvaWQKK3NldF9kbWFfY2ZnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGxwLT51c2VfZG1hKSB7CisJCWlmICgobHAtPmlzYV9jb25maWcgJiBBTllfSVNBX0RNQSkgPT0gMCkgeworCQkJaWYgKG5ldF9kZWJ1ZyA+IDMpCisJCQkJcHJpbnRrKCJzZXRfZG1hX2NmZygpOiBubyBETUFcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChscC0+aXNhX2NvbmZpZyAmIElTQV9SeERNQSkgeworCQkJbHAtPmN1cnJfcnhfY2ZnIHw9IFJYX0RNQV9PTkxZOworCQkJaWYgKG5ldF9kZWJ1ZyA+IDMpCisJCQkJcHJpbnRrKCJzZXRfZG1hX2NmZygpOiBSWF9ETUFfT05MWVxuIik7CisJCX0gZWxzZSB7CisJCQlscC0+Y3Vycl9yeF9jZmcgfD0gQVVUT19SWF9ETUE7CS8qIG5vdCB0aGF0IHdlIHN1cHBvcnQgaXQuLi4gKi8KKwkJCWlmIChuZXRfZGVidWcgPiAzKQorCQkJCXByaW50aygic2V0X2RtYV9jZmcoKTogQVVUT19SWF9ETUFcbiIpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50CitkbWFfYnVmY2ZnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWlmIChscC0+dXNlX2RtYSkKKwkJcmV0dXJuIChscC0+aXNhX2NvbmZpZyAmIEFOWV9JU0FfRE1BKT8gUlhfRE1BX0VOQkwgOiAwOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RtYV9idXNjdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaWYgKGxwLT51c2VfZG1hKSB7CisJCWlmIChscC0+aXNhX2NvbmZpZyAmIEFOWV9JU0FfRE1BKQorCQkJcmV0dmFsIHw9IFJFU0VUX1JYX0RNQTsgLyogUmVzZXQgdGhlIERNQSBwb2ludGVyICovCisJCWlmIChscC0+aXNhX2NvbmZpZyAmIERNQV9CVVJTVCkKKwkJCXJldHZhbCB8PSBETUFfQlVSU1RfTU9ERTsgLyogRG9lcyBJU0EgY29uZmlnIHNwZWNpZnkgRE1BIGJ1cnN0ID8gKi8KKwkJaWYgKGxwLT5kbWFzaXplID09IDY0KQorCQkJcmV0dmFsIHw9IFJYX0RNQV9TSVpFXzY0SzsgLyogZGlkIHRoZXkgYXNrIGZvciA2NEs/ICovCisJCXJldHZhbCB8PSBNRU1PUllfT047CS8qIHdlIG5lZWQgbWVtb3J5IGVuYWJsZWQgdG8gdXNlIERNQS4gKi8KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQKK2RtYV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBzdGF0dXMsIGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyICpicCA9IGxwLT5yeF9kbWFfcHRyOworCisJc3RhdHVzID0gYnBbMF0gKyAoYnBbMV08PDgpOworCWxlbmd0aCA9IGJwWzJdICsgKGJwWzNdPDw4KTsKKwlicCArPSA0OworCWlmIChuZXRfZGVidWcgPiA1KSB7CisJCXByaW50aygJIiVzOiByZWNlaXZpbmcgRE1BIHBhY2tldCBhdCAlbHgsIHN0YXR1cyAleCwgbGVuZ3RoICV4XG4iLAorCQkJZGV2LT5uYW1lLCAodW5zaWduZWQgbG9uZylicCwgc3RhdHVzLCBsZW5ndGgpOworCX0KKwlpZiAoKHN0YXR1cyAmIFJYX09LKSA9PSAwKSB7CisJCWNvdW50X3J4X2Vycm9ycyhzdGF0dXMsIGxwKTsKKwkJZ290byBza2lwX3RoaXNfZnJhbWU7CisJfQorCisJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW5ndGggKyAyKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJaWYgKG5ldF9kZWJ1ZykJLyogSSBkb24ndCB0aGluayB3ZSB3YW50IHRvIGRvIHRoaXMgdG8gYSBzdHJlc3NlZCBzeXN0ZW0gKi8KKwkJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCisJCS8qIEFLUE06IGFkdmFuY2UgYnAgdG8gdGhlIG5leHQgZnJhbWUgKi8KK3NraXBfdGhpc19mcmFtZToKKwkJYnAgKz0gKGxlbmd0aCArIDMpICYgfjM7CisJCWlmIChicCA+PSBscC0+ZW5kX2RtYV9idWZmKSBicCAtPSBscC0+ZG1hc2l6ZSoxMDI0OworCQlscC0+cnhfZG1hX3B0ciA9IGJwOworCQlyZXR1cm47CisJfQorCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIGxvbmd3b3JkIGFsaWduIEwzIGhlYWRlciAqLworCXNrYi0+ZGV2ID0gZGV2OworCisJaWYgKGJwICsgbGVuZ3RoID4gbHAtPmVuZF9kbWFfYnVmZikgeworCQlpbnQgc2VtaV9jbnQgPSBscC0+ZW5kX2RtYV9idWZmIC0gYnA7CisJCW1lbWNweShza2JfcHV0KHNrYixzZW1pX2NudCksIGJwLCBzZW1pX2NudCk7CisJCW1lbWNweShza2JfcHV0KHNrYixsZW5ndGggLSBzZW1pX2NudCksIGxwLT5kbWFfYnVmZiwKKwkJICAgICAgIGxlbmd0aCAtIHNlbWlfY250KTsKKwl9IGVsc2UgeworCQltZW1jcHkoc2tiX3B1dChza2IsbGVuZ3RoKSwgYnAsIGxlbmd0aCk7CisJfQorCWJwICs9IChsZW5ndGggKyAzKSAmIH4zOworCWlmIChicCA+PSBscC0+ZW5kX2RtYV9idWZmKSBicCAtPSBscC0+ZG1hc2l6ZSoxMDI0OworCWxwLT5yeF9kbWFfcHRyID0gYnA7CisKKwlpZiAobmV0X2RlYnVnID4gMykgeworCQlwcmludGsoCSIlczogcmVjZWl2ZWQgJWQgYnl0ZSBETUEgcGFja2V0IG9mIHR5cGUgJXhcbiIsCisJCQlkZXYtPm5hbWUsIGxlbmd0aCwKKwkJCShza2ItPmRhdGFbRVRIX0FMRU4rRVRIX0FMRU5dIDw8IDgpIHwgc2tiLT5kYXRhW0VUSF9BTEVOK0VUSF9BTEVOKzFdKTsKKwl9CisgICAgICAgIHNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbmd0aDsKK30KKworI2VuZGlmCS8qIEFMTE9XX0RNQSAqLworCit2b2lkICBfX2luaXQgcmVzZXRfY2hpcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworI2lmbmRlZiBDT05GSUdfQVJDSF9JWERQMlgwMQorCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisjZW5kaWYKKwlpbnQgcmVzZXRfc3RhcnRfdGltZTsKKworCXdyaXRlcmVnKGRldiwgUFBfU2VsZkNUTCwgcmVhZHJlZyhkZXYsIFBQX1NlbGZDVEwpIHwgUE9XRVJfT05fUkVTRVQpOworCisJLyogd2FpdCAzMCBtcyAqLworCW1zbGVlcCgzMCk7CisKKyNpZm5kZWYgQ09ORklHX0FSQ0hfSVhEUDJYMDEKKwlpZiAobHAtPmNoaXBfdHlwZSAhPSBDUzg5MDApIHsKKwkJLyogSGFyZHdhcmUgcHJvYmxlbSByZXF1aXJlcyBQTlAgcmVnaXN0ZXJzIHRvIGJlIHJlY29uZmlndXJlZCBhZnRlciBhIHJlc2V0ICovCisJCW91dHcoUFBfQ1M4OTIwX0lTQUlOVCwgaW9hZGRyICsgQUREX1BPUlQpOworCQlvdXRiKGRldi0+aXJxLCBpb2FkZHIgKyBEQVRBX1BPUlQpOworCQlvdXRiKDAsICAgICAgaW9hZGRyICsgREFUQV9QT1JUICsgMSk7CisKKwkJb3V0dyhQUF9DUzg5MjBfSVNBTWVtQiwgaW9hZGRyICsgQUREX1BPUlQpOworCQlvdXRiKChkZXYtPm1lbV9zdGFydCA+PiAxNikgJiAweGZmLCBpb2FkZHIgKyBEQVRBX1BPUlQpOworCQlvdXRiKChkZXYtPm1lbV9zdGFydCA+PiA4KSAmIDB4ZmYsICAgaW9hZGRyICsgREFUQV9QT1JUICsgMSk7CisJfQorI2VuZGlmCS8qIElYRFAyeDAxICovCisKKwkvKiBXYWl0IHVudGlsIHRoZSBjaGlwIGlzIHJlc2V0ICovCisJcmVzZXRfc3RhcnRfdGltZSA9IGppZmZpZXM7CisJd2hpbGUoIChyZWFkcmVnKGRldiwgUFBfU2VsZlNUKSAmIElOSVRfRE9ORSkgPT0gMCAmJiBqaWZmaWVzIC0gcmVzZXRfc3RhcnRfdGltZSA8IDIpCisJCTsKK30KKworDAorc3RhdGljIHZvaWQKK2NvbnRyb2xfZGNfZGMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9uX25vdF9vZmYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBzZWxmY29udHJvbDsKKwlpbnQgdGltZW5vdyA9IGppZmZpZXM7CisJLyogY29udHJvbCB0aGUgREMgdG8gREMgY29udmVydG9yIGluIHRoZSBTZWxmQ29udHJvbCByZWdpc3Rlci4gIAorCSAgIE5vdGU6IFRoaXMgaXMgaG9va2VkIHVwIHRvIGEgZ2VuZXJhbCBwdXJwb3NlIHBpbiwgbWlnaHQgbm90CisJICAgYWx3YXlzIGJlIGEgREMgdG8gREMgY29udmVydG9yLiAqLworCisJc2VsZmNvbnRyb2wgPSBIQ0IxX0VOQkw7IC8qIEVuYWJsZSB0aGUgSENCMSBiaXQgYXMgYW4gb3V0cHV0ICovCisJaWYgKCgobHAtPmFkYXB0ZXJfY25mICYgQV9DTkZfRENfRENfUE9MQVJJVFkpICE9IDApIF4gb25fbm90X29mZikKKwkJc2VsZmNvbnRyb2wgfD0gSENCMTsKKwllbHNlCisJCXNlbGZjb250cm9sICY9IH5IQ0IxOworCXdyaXRlcmVnKGRldiwgUFBfU2VsZkNUTCwgc2VsZmNvbnRyb2wpOworCisJLyogV2FpdCBmb3IgdGhlIERDL0RDIGNvbnZlcnRlciB0byBwb3dlciB1cCAtIDUwMG1zICovCisJd2hpbGUgKGppZmZpZXMgLSB0aW1lbm93IDwgSFopCisJCTsKK30KKworI2RlZmluZSBERVRFQ1RFRF9OT05FICAwCisjZGVmaW5lIERFVEVDVEVEX1JKNDVIIDEKKyNkZWZpbmUgREVURUNURURfUko0NUYgMgorI2RlZmluZSBERVRFQ1RFRF9BVUkgICAzCisjZGVmaW5lIERFVEVDVEVEX0JOQyAgIDQKKworc3RhdGljIGludAorZGV0ZWN0X3RwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB0aW1lbm93ID0gamlmZmllczsKKwlpbnQgZmR4OworCisJaWYgKG5ldF9kZWJ1ZyA+IDEpIHByaW50aygiJXM6IEF0dGVtcHRpbmcgVFBcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgLyogSWYgY29ubmVjdGVkIHRvIGFub3RoZXIgZnVsbCBkdXBsZXggY2FwYWJsZSAxMC1CYXNlLVQgY2FyZCB0aGUgbGluayBwdWxzZXMKKyAgICAgICAgICAgc2VlbSB0byBiZSBsb3N0IHdoZW4gdGhlIGF1dG8gZGV0ZWN0IGJpdCBpbiB0aGUgTGluZUNUTCBpcyBzZXQuCisgICAgICAgICAgIFRvIG92ZXJjb21lIHRoaXMgdGhlIGF1dG8gZGV0ZWN0IGJpdCB3aWxsIGJlIGNsZWFyZWQgd2hpbHN0IHRlc3RpbmcgdGhlCisgICAgICAgICAgIDEwLUJhc2UtVCBpbnRlcmZhY2UuICBUaGlzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkgZm9yIHRoZSBzcGFycm93IGNoaXAgYnV0CisgICAgICAgICAgIGlzIHNpbXBsZXIgdG8gZG8gaXQgYW55d2F5LiAqLworCXdyaXRlcmVnKGRldiwgUFBfTGluZUNUTCwgbHAtPmxpbmVjdGwgJn4gQVVJX09OTFkpOworCWNvbnRyb2xfZGNfZGMoZGV2LCAwKTsKKworICAgICAgICAvKiBEZWxheSBmb3IgdGhlIGhhcmR3YXJlIHRvIHdvcmsgb3V0IGlmIHRoZSBUUCBjYWJsZSBpcyBwcmVzZW50IC0gMTUwbXMgKi8KKwlmb3IgKHRpbWVub3cgPSBqaWZmaWVzOyBqaWZmaWVzIC0gdGltZW5vdyA8IDE1OyApCisgICAgICAgICAgICAgICAgOworCWlmICgocmVhZHJlZyhkZXYsIFBQX0xpbmVTVCkgJiBMSU5LX09LKSA9PSAwKQorCQlyZXR1cm4gREVURUNURURfTk9ORTsKKworCWlmIChscC0+Y2hpcF90eXBlID09IENTODkwMCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobHAtPmZvcmNlICYgMHhmMCkgeworI2lmIDAKKyAgICAgICAgICAgICAgICBjYXNlIEZPUkNFX0FVVE86CisJCQlwcmludGsoIiVzOiBjczg5MDAgZG9lc24ndCBhdXRvbmVnb3RpYXRlXG4iLGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVURUNURURfTk9ORTsKKyNlbmRpZgorCQkvKiBDUzg5MDAgZG9lc24ndCBzdXBwb3J0IEFVVE8sIGNoYW5nZSB0byBIQUxGKi8KKyAgICAgICAgICAgICAgICBjYXNlIEZPUkNFX0FVVE86CisJCQlscC0+Zm9yY2UgJj0gfkZPUkNFX0FVVE87CisgICAgICAgICAgICAgICAgICAgICAgICBscC0+Zm9yY2UgfD0gRk9SQ0VfSEFMRjsKKwkJCWJyZWFrOworCQljYXNlIEZPUkNFX0hBTEY6CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZPUkNFX0ZVTEw6CisJCQl3cml0ZXJlZyhkZXYsIFBQX1Rlc3RDVEwsIHJlYWRyZWcoZGV2LCBQUF9UZXN0Q1RMKSB8IEZEWF84OTAwKTsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgIH0KKwkJZmR4ID0gcmVhZHJlZyhkZXYsIFBQX1Rlc3RDVEwpICYgRkRYXzg5MDA7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChscC0+Zm9yY2UgJiAweGYwKSB7CisJCWNhc2UgRk9SQ0VfQVVUTzoKKwkJCWxwLT5hdXRvX25lZ19jbmYgPSBBVVRPX05FR19FTkFCTEU7CisJCQlicmVhazsKKwkJY2FzZSBGT1JDRV9IQUxGOgorCQkJbHAtPmF1dG9fbmVnX2NuZiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBGT1JDRV9GVUxMOgorCQkJbHAtPmF1dG9fbmVnX2NuZiA9IFJFX05FR19OT1cgfCBBTExPV19GRFg7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKwkJd3JpdGVyZWcoZGV2LCBQUF9BdXRvTmVnQ1RMLCBscC0+YXV0b19uZWdfY25mICYgQVVUT19ORUdfTUFTSyk7CisKKwkJaWYgKChscC0+YXV0b19uZWdfY25mICYgQVVUT19ORUdfQklUUykgPT0gQVVUT19ORUdfRU5BQkxFKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogbmVnb3RpYXRpbmcgZHVwbGV4Li4uXG4iLGRldi0+bmFtZSk7CisJCQl3aGlsZSAocmVhZHJlZyhkZXYsIFBQX0F1dG9OZWdTVCkgJiBBVVRPX05FR19CVVNZKSB7CisJCQkJaWYgKGppZmZpZXMgLSB0aW1lbm93ID4gNDAwMCkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIioqKiogRnVsbCAvIGhhbGYgZHVwbGV4IGF1dG8tbmVnb3RpYXRpb24gdGltZWQgb3V0ICoqKipcbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJZmR4ID0gcmVhZHJlZyhkZXYsIFBQX0F1dG9OZWdTVCkgJiBGRFhfQUNUSVZFOworCX0KKwlpZiAoZmR4KQorCQlyZXR1cm4gREVURUNURURfUko0NUY7CisJZWxzZQorCQlyZXR1cm4gREVURUNURURfUko0NUg7Cit9CisKKy8qIHNlbmQgYSB0ZXN0IHBhY2tldCAtIHJldHVybiB0cnVlIGlmIGNhcnJpZXIgYml0cyBhcmUgb2sgKi8KK3N0YXRpYyBpbnQKK3NlbmRfdGVzdF9wa3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwljaGFyIHRlc3RfcGFja2V0W10gPSB7IDAsMCwwLDAsMCwwLCAwLDAsMCwwLDAsMCwKKwkJCQkgMCwgNDYsIC8qIEEgNDYgaW4gbmV0d29yayBvcmRlciAqLworCQkJCSAwLCAwLCAvKiBEU0FQPTAgJiBTU0FQPTAgZmllbGRzICovCisJCQkJIDB4ZjMsIDAgLyogQ29udHJvbCAoVGVzdCBSZXEgKyBQIGJpdCBzZXQpICovIH07CisJbG9uZyB0aW1lbm93ID0gamlmZmllczsKKworCXdyaXRlcmVnKGRldiwgUFBfTGluZUNUTCwgcmVhZHJlZyhkZXYsIFBQX0xpbmVDVEwpIHwgU0VSSUFMX1RYX09OKTsKKworCW1lbWNweSh0ZXN0X3BhY2tldCwgICAgICAgICAgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweSh0ZXN0X3BhY2tldCtFVEhfQUxFTiwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisgICAgICAgIHdyaXRld29yZChkZXYsIFRYX0NNRF9QT1JULCBUWF9BRlRFUl9BTEwpOworICAgICAgICB3cml0ZXdvcmQoZGV2LCBUWF9MRU5fUE9SVCwgRVRIX1pMRU4pOworCisJLyogVGVzdCB0byBzZWUgaWYgdGhlIGNoaXAgaGFzIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHRoZSBwYWNrZXQgKi8KKwl3aGlsZSAoamlmZmllcyAtIHRpbWVub3cgPCA1KQorCQlpZiAocmVhZHJlZyhkZXYsIFBQX0J1c1NUKSAmIFJFQURZX0ZPUl9UWF9OT1cpCisJCQlicmVhazsKKwlpZiAoamlmZmllcyAtIHRpbWVub3cgPj0gNSkKKwkJcmV0dXJuIDA7CS8qIHRoaXMgc2hvdWxkbid0IGhhcHBlbiAqLworCisJLyogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZXQgKi8KKwlvdXRzdyhkZXYtPmJhc2VfYWRkciArIFRYX0ZSQU1FX1BPUlQsdGVzdF9wYWNrZXQsKEVUSF9aTEVOKzEpID4+MSk7CisKKwlpZiAobmV0X2RlYnVnID4gMSkgcHJpbnRrKCJTZW5kaW5nIHRlc3QgcGFja2V0ICIpOworCS8qIHdhaXQgYSBjb3VwbGUgb2YgamlmZmllcyBmb3IgcGFja2V0IHRvIGJlIHJlY2VpdmVkICovCisJZm9yICh0aW1lbm93ID0gamlmZmllczsgamlmZmllcyAtIHRpbWVub3cgPCAzOyApCisgICAgICAgICAgICAgICAgOworICAgICAgICBpZiAoKHJlYWRyZWcoZGV2LCBQUF9UeEV2ZW50KSAmIFRYX1NFTkRfT0tfQklUUykgPT0gVFhfT0spIHsKKyAgICAgICAgICAgICAgICBpZiAobmV0X2RlYnVnID4gMSkgcHJpbnRrKCJzdWNjZWVkZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisJaWYgKG5ldF9kZWJ1ZyA+IDEpIHByaW50aygiZmFpbGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitkZXRlY3RfYXVpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ldF9kZWJ1ZyA+IDEpIHByaW50aygiJXM6IEF0dGVtcHRpbmcgQVVJXG4iLCBkZXYtPm5hbWUpOworCWNvbnRyb2xfZGNfZGMoZGV2LCAwKTsKKworCXdyaXRlcmVnKGRldiwgUFBfTGluZUNUTCwgKGxwLT5saW5lY3RsICZ+IEFVVE9fQVVJXzEwQkFTRVQpIHwgQVVJX09OTFkpOworCisJaWYgKHNlbmRfdGVzdF9wa3QoZGV2KSkKKwkJcmV0dXJuIERFVEVDVEVEX0FVSTsKKwllbHNlCisJCXJldHVybiBERVRFQ1RFRF9OT05FOworfQorCitzdGF0aWMgaW50CitkZXRlY3RfYm5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ldF9kZWJ1ZyA+IDEpIHByaW50aygiJXM6IEF0dGVtcHRpbmcgQk5DXG4iLCBkZXYtPm5hbWUpOworCWNvbnRyb2xfZGNfZGMoZGV2LCAxKTsKKworCXdyaXRlcmVnKGRldiwgUFBfTGluZUNUTCwgKGxwLT5saW5lY3RsICZ+IEFVVE9fQVVJXzEwQkFTRVQpIHwgQVVJX09OTFkpOworCisJaWYgKHNlbmRfdGVzdF9wa3QoZGV2KSkKKwkJcmV0dXJuIERFVEVDVEVEX0JOQzsKKwllbHNlCisJCXJldHVybiBERVRFQ1RFRF9OT05FOworfQorCisMCitzdGF0aWMgdm9pZAord3JpdGVfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjaGlwX3R5cGUsIGludCBpcnEpCit7CisJaW50IGk7CisKKwlpZiAoY2hpcF90eXBlID09IENTODkwMCkgeworCQkvKiBTZWFyY2ggdGhlIG1hcHBpbmcgdGFibGUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIElSUSBwaW4uICovCisJCWZvciAoaSA9IDA7IGkgIT0gc2l6ZW9mKGNzODkwMF9pcnFfbWFwKS9zaXplb2YoY3M4OTAwX2lycV9tYXBbMF0pOyBpKyspCisJCQlpZiAoY3M4OTAwX2lycV9tYXBbaV0gPT0gaXJxKQorCQkJCWJyZWFrOworCQkvKiBOb3QgZm91bmQgKi8KKwkJaWYgKGkgPT0gc2l6ZW9mKGNzODkwMF9pcnFfbWFwKS9zaXplb2YoY3M4OTAwX2lycV9tYXBbMF0pKQorCQkJaSA9IDM7CisJCXdyaXRlcmVnKGRldiwgUFBfQ1M4OTAwX0lTQUlOVCwgaSk7CisJfSBlbHNlIHsKKwkJd3JpdGVyZWcoZGV2LCBQUF9DUzg5MjBfSVNBSU5ULCBpcnEpOworCX0KK30KKworLyogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpCisgICBzb21ldGltZSBhZnRlciBib290aW5nIHdoZW4gdGhlICdpZmNvbmZpZycgcHJvZ3JhbSBpcyBydW4uCisKKyAgIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAgIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgICB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICAgKi8KKworLyogQUtQTTogZG8gd2UgbmVlZCB0byBkbyBhbnkgbG9ja2luZyBoZXJlPyAqLworCitzdGF0aWMgaW50CituZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgaTsKKwlpbnQgcmV0OworCisjaWZuZGVmIENPTkZJR19TSF9ISUNPU0g0IC8qIHVzZXMgaXJxIzEsIHNvIHRoaXMgd29uJ3Qgd29yayAqLworCWlmIChkZXYtPmlycSA8IDIpIHsKKwkJLyogQWxsb3cgaW50ZXJydXB0cyB0byBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNoaXAgKi8KKy8qIENpcnJ1cycgcmVsZWFzZSBoYWQgdGhpczogKi8KKyNpZiAwCisJCXdyaXRlcmVnKGRldiwgUFBfQnVzQ1RMLCByZWFkcmVnKGRldiwgUFBfQnVzQ1RMKXxFTkFCTEVfSVJRICk7CisjZW5kaWYKKy8qIEFuZCAyLjMuNDcgaGFkIHRoaXM6ICovCisJCXdyaXRlcmVnKGRldiwgUFBfQnVzQ1RMLCBFTkFCTEVfSVJRIHwgTUVNT1JZX09OKTsKKworCQlmb3IgKGkgPSAyOyBpIDwgQ1M4OTIwX05PX0lOVFM7IGkrKykgeworCQkJaWYgKCgxIDw8IGkpICYgbHAtPmlycV9tYXApIHsKKwkJCQlpZiAocmVxdWVzdF9pcnEoaSwgbmV0X2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpID09IDApIHsKKwkJCQkJZGV2LT5pcnEgPSBpOworCQkJCQl3cml0ZV9pcnEoZGV2LCBscC0+Y2hpcF90eXBlLCBpKTsKKwkJCQkJLyogd3JpdGVyZWcoZGV2LCBQUF9CdWZDRkcsIEdFTkVSQVRFX1NXX0lOVEVSUlVQVCk7ICovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChpID49IENTODkyMF9OT19JTlRTKSB7CisJCQl3cml0ZXJlZyhkZXYsIFBQX0J1c0NUTCwgMCk7CS8qIGRpc2FibGUgaW50ZXJydXB0cy4gKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiY3M4OXgwOiBjYW4ndCBnZXQgYW4gaW50ZXJydXB0XG4iKTsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlnb3RvIGJhZF9vdXQ7CisJCX0KKwl9CisJZWxzZQorI2VuZGlmCisJeworI2lmbmRlZiBDT05GSUdfQVJDSF9JWERQMlgwMQorCQlpZiAoKCgxIDw8IGRldi0+aXJxKSAmIGxwLT5pcnFfbWFwKSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJUlEgJWQgaXMgbm90IGluIG91ciBtYXAgb2YgYWxsb3dhYmxlIElSUXMsIHdoaWNoIGlzICV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEsIGxwLT5pcnFfbWFwKTsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlnb3RvIGJhZF9vdXQ7CisJCX0KKyNlbmRpZgorLyogRklYTUU6IENpcnJ1cycgcmVsZWFzZSBoYWQgdGhpczogKi8KKwkJd3JpdGVyZWcoZGV2LCBQUF9CdXNDVEwsIHJlYWRyZWcoZGV2LCBQUF9CdXNDVEwpfEVOQUJMRV9JUlEgKTsKKy8qIEFuZCAyLjMuNDcgaGFkIHRoaXM6ICovCisjaWYgMAorCQl3cml0ZXJlZyhkZXYsIFBQX0J1c0NUTCwgRU5BQkxFX0lSUSB8IE1FTU9SWV9PTik7CisjZW5kaWYKKwkJd3JpdGVfaXJxKGRldiwgbHAtPmNoaXBfdHlwZSwgZGV2LT5pcnEpOworCQlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJm5ldF9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KTsKKwkJaWYgKHJldCkgeworCQkJaWYgKG5ldF9kZWJ1ZykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiY3M4OXgwOiByZXF1ZXN0X2lycSglZCkgZmFpbGVkXG4iLCBkZXYtPmlycSk7CisJCQlnb3RvIGJhZF9vdXQ7CisJCX0KKwl9CisKKyNpZiBBTExPV19ETUEKKwlpZiAobHAtPnVzZV9kbWEpIHsKKwkJaWYgKGxwLT5pc2FfY29uZmlnICYgQU5ZX0lTQV9ETUEpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQlscC0+ZG1hX2J1ZmYgPSAodW5zaWduZWQgY2hhciAqKV9fZ2V0X2RtYV9wYWdlcyhHRlBfS0VSTkVMLAorCQkJCQkJCWdldF9vcmRlcihscC0+ZG1hc2l6ZSAqIDEwMjQpKTsKKworCQkJaWYgKCFscC0+ZG1hX2J1ZmYpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgZ2V0ICVkSyBtZW1vcnkgZm9yIERNQVxuIiwgZGV2LT5uYW1lLCBscC0+ZG1hc2l6ZSk7CisJCQkJZ290byByZWxlYXNlX2lycTsKKwkJCX0KKwkJCWlmIChuZXRfZGVidWcgPiAxKSB7CisJCQkJcHJpbnRrKAkiJXM6IGRtYSAlbHggJWx4XG4iLAorCQkJCQlkZXYtPm5hbWUsCisJCQkJCSh1bnNpZ25lZCBsb25nKWxwLT5kbWFfYnVmZiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpaXNhX3ZpcnRfdG9fYnVzKGxwLT5kbWFfYnVmZikpOworCQkJfQorCQkJaWYgKCh1bnNpZ25lZCBsb25nKSBscC0+ZG1hX2J1ZmYgPj0gTUFYX0RNQV9BRERSRVNTIHx8CisJCQkgICAgIWRtYV9wYWdlX2VxKGxwLT5kbWFfYnVmZiwgbHAtPmRtYV9idWZmK2xwLT5kbWFzaXplKjEwMjQtMSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBub3QgdXNhYmxlIGFzIERNQSBidWZmZXJcbiIsIGRldi0+bmFtZSk7CisJCQkJZ290byByZWxlYXNlX2lycTsKKwkJCX0KKwkJCW1lbXNldChscC0+ZG1hX2J1ZmYsIDAsIGxwLT5kbWFzaXplICogMTAyNCk7CS8qIFdoeT8gKi8KKwkJCWlmIChyZXF1ZXN0X2RtYShkZXYtPmRtYSwgZGV2LT5uYW1lKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBnZXQgZG1hIGNoYW5uZWwgJWRcbiIsIGRldi0+bmFtZSwgZGV2LT5kbWEpOworCQkJCWdvdG8gcmVsZWFzZV9pcnE7CisJCQl9CisJCQl3cml0ZV9kbWEoZGV2LCBscC0+Y2hpcF90eXBlLCBkZXYtPmRtYSk7CisJCQlscC0+cnhfZG1hX3B0ciA9IGxwLT5kbWFfYnVmZjsKKwkJCWxwLT5lbmRfZG1hX2J1ZmYgPSBscC0+ZG1hX2J1ZmYgKyBscC0+ZG1hc2l6ZSoxMDI0OworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJCQlkaXNhYmxlX2RtYShkZXYtPmRtYSk7CisJCQljbGVhcl9kbWFfZmYoZGV2LT5kbWEpOworCQkJc2V0X2RtYV9tb2RlKGRldi0+ZG1hLCAweDE0KTsgLyogYXV0b19pbml0IGFzIHdlbGwgKi8KKwkJCXNldF9kbWFfYWRkcihkZXYtPmRtYSwgaXNhX3ZpcnRfdG9fYnVzKGxwLT5kbWFfYnVmZikpOworCQkJc2V0X2RtYV9jb3VudChkZXYtPmRtYSwgbHAtPmRtYXNpemUqMTAyNCk7CisJCQllbmFibGVfZG1hKGRldi0+ZG1hKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJCX0KKwl9CisjZW5kaWYJLyogQUxMT1dfRE1BICovCisKKwkvKiBzZXQgdGhlIEV0aGVybmV0IGFkZHJlc3MgKi8KKwlmb3IgKGk9MDsgaSA8IEVUSF9BTEVOLzI7IGkrKykKKwkJd3JpdGVyZWcoZGV2LCBQUF9JQStpKjIsIGRldi0+ZGV2X2FkZHJbaSoyXSB8IChkZXYtPmRldl9hZGRyW2kqMisxXSA8PCA4KSk7CisKKwkvKiB3aGlsZSB3ZSdyZSB0ZXN0aW5nIHRoZSBpbnRlcmZhY2UsIGxlYXZlIGludGVycnVwdHMgZGlzYWJsZWQgKi8KKwl3cml0ZXJlZyhkZXYsIFBQX0J1c0NUTCwgTUVNT1JZX09OKTsKKworCS8qIFNldCB0aGUgTGluZUNUTCBxdWludHVwbGV0IGJhc2VkIG9uIGFkYXB0ZXIgY29uZmlndXJhdGlvbiByZWFkIGZyb20gRUVQUk9NICovCisJaWYgKChscC0+YWRhcHRlcl9jbmYgJiBBX0NORl9FWFRORF8xMEJfMikgJiYgKGxwLT5hZGFwdGVyX2NuZiAmIEFfQ05GX0xPV19SWF9TUVVFTENIKSkKKyAgICAgICAgICAgICAgICBscC0+bGluZWN0bCA9IExPV19SWF9TUVVFTENIOworCWVsc2UKKyAgICAgICAgICAgICAgICBscC0+bGluZWN0bCA9IDA7CisKKyAgICAgICAgLyogY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhleSBoYXZlIHRoZSAicmlnaHQiIGhhcmR3YXJlIGF2YWlsYWJsZSAqLworCXN3aXRjaChscC0+YWRhcHRlcl9jbmYgJiBBX0NORl9NRURJQV9UWVBFKSB7CisJY2FzZSBBX0NORl9NRURJQV8xMEJfVDogcmVzdWx0ID0gbHAtPmFkYXB0ZXJfY25mICYgQV9DTkZfMTBCX1Q7IGJyZWFrOworCWNhc2UgQV9DTkZfTUVESUFfQVVJOiAgIHJlc3VsdCA9IGxwLT5hZGFwdGVyX2NuZiAmIEFfQ05GX0FVSTsgYnJlYWs7CisJY2FzZSBBX0NORl9NRURJQV8xMEJfMjogcmVzdWx0ID0gbHAtPmFkYXB0ZXJfY25mICYgQV9DTkZfMTBCXzI7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiByZXN1bHQgPSBscC0+YWRhcHRlcl9jbmYgJiAoQV9DTkZfMTBCX1QgfCBBX0NORl9BVUkgfCBBX0NORl8xMEJfMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBFRVBST00gaXMgY29uZmlndXJlZCBmb3IgdW5hdmFpbGFibGUgbWVkaWFcbiIsIGRldi0+bmFtZSk7CisgICAgICAgIHJlbGVhc2VfaXJxOgorI2lmIEFMTE9XX0RNQQorCQlyZWxlYXNlX2RtYV9idWZmKGxwKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHdyaXRlcmVnKGRldiwgUFBfTGluZUNUTCwgcmVhZHJlZyhkZXYsIFBQX0xpbmVDVEwpICYgfihTRVJJQUxfVFhfT04gfCBTRVJJQUxfUlhfT04pKTsKKyAgICAgICAgICAgICAgICBmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBiYWRfb3V0OworCX0KKworICAgICAgICAvKiBzZXQgdGhlIGhhcmR3YXJlIHRvIHRoZSBjb25maWd1cmVkIGNob2ljZSAqLworCXN3aXRjaChscC0+YWRhcHRlcl9jbmYgJiBBX0NORl9NRURJQV9UWVBFKSB7CisJY2FzZSBBX0NORl9NRURJQV8xMEJfVDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBkZXRlY3RfdHAoZGV2KTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0PT1ERVRFQ1RFRF9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogMTBCYXNlLVQgKFJKLTQ1KSBoYXMgbm8gY2FibGVcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobHAtPmF1dG9fbmVnX2NuZiAmIElNTV9CSVQpIC8qIGNoZWNrICJpZ25vcmUgbWlzc2luZyBtZWRpYSIgYml0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IERFVEVDVEVEX1JKNDVIOyAvKiBZZXMhIEkgZG9uJ3QgY2FyZSBpZiBJIHNlZSBhIGxpbmsgcHVsc2UgKi8KKyAgICAgICAgICAgICAgICB9CisJCWJyZWFrOworCWNhc2UgQV9DTkZfTUVESUFfQVVJOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRldGVjdF9hdWkoZGV2KTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0PT1ERVRFQ1RFRF9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogMTBCYXNlLTUgKEFVSSkgaGFzIG5vIGNhYmxlXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxwLT5hdXRvX25lZ19jbmYgJiBJTU1fQklUKSAvKiBjaGVjayAiaWdub3JlIG1pc3NpbmcgbWVkaWEiIGJpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBERVRFQ1RFRF9BVUk7IC8qIFllcyEgSSBkb24ndCBjYXJlIGlmIEkgc2VlIGEgY2FycnJpZXIgKi8KKyAgICAgICAgICAgICAgICB9CisJCWJyZWFrOworCWNhc2UgQV9DTkZfTUVESUFfMTBCXzI6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGV0ZWN0X2JuYyhkZXYpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQ9PURFVEVDVEVEX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAxMEJhc2UtMiAoQk5DKSBoYXMgbm8gY2FibGVcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobHAtPmF1dG9fbmVnX2NuZiAmIElNTV9CSVQpIC8qIGNoZWNrICJpZ25vcmUgbWlzc2luZyBtZWRpYSIgYml0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IERFVEVDVEVEX0JOQzsgLyogWWVzISBJIGRvbid0IGNhcmUgaWYgSSBjYW4geG1pdCBhIHBhY2tldCAqLworICAgICAgICAgICAgICAgIH0KKwkJYnJlYWs7CisJY2FzZSBBX0NORl9NRURJQV9BVVRPOgorCQl3cml0ZXJlZyhkZXYsIFBQX0xpbmVDVEwsIGxwLT5saW5lY3RsIHwgQVVUT19BVUlfMTBCQVNFVCk7CisJCWlmIChscC0+YWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfVCkKKwkJCWlmICgocmVzdWx0ID0gZGV0ZWN0X3RwKGRldikpICE9IERFVEVDVEVEX05PTkUpCisJCQkJYnJlYWs7CisJCWlmIChscC0+YWRhcHRlcl9jbmYgJiBBX0NORl9BVUkpCisJCQlpZiAoKHJlc3VsdCA9IGRldGVjdF9hdWkoZGV2KSkgIT0gREVURUNURURfTk9ORSkKKwkJCQlicmVhazsKKwkJaWYgKGxwLT5hZGFwdGVyX2NuZiAmIEFfQ05GXzEwQl8yKQorCQkJaWYgKChyZXN1bHQgPSBkZXRlY3RfYm5jKGRldikpICE9IERFVEVDVEVEX05PTkUpCisJCQkJYnJlYWs7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIG1lZGlhIGRldGVjdGVkXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIGdvdG8gcmVsZWFzZV9pcnE7CisJfQorCXN3aXRjaChyZXN1bHQpIHsKKwljYXNlIERFVEVDVEVEX05PTkU6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIG5ldHdvcmsgY2FibGUgYXR0YWNoZWQgdG8gY29uZmlndXJlZCBtZWRpYVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICBnb3RvIHJlbGVhc2VfaXJxOworCWNhc2UgREVURUNURURfUko0NUg6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB1c2luZyBoYWxmLWR1cGxleCAxMEJhc2UtVCAoUkotNDUpXG4iLCBkZXYtPm5hbWUpOworCQlicmVhazsKKwljYXNlIERFVEVDVEVEX1JKNDVGOgorCQlwcmludGsoS0VSTl9JTkZPICIlczogdXNpbmcgZnVsbC1kdXBsZXggMTBCYXNlLVQgKFJKLTQ1KVxuIiwgZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBERVRFQ1RFRF9BVUk6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB1c2luZyAxMEJhc2UtNSAoQVVJKVxuIiwgZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBERVRFQ1RFRF9CTkM6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB1c2luZyAxMEJhc2UtMiAoQk5DKVxuIiwgZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisJfQorCisJLyogVHVybiBvbiBib3RoIHJlY2VpdmUgYW5kIHRyYW5zbWl0IG9wZXJhdGlvbnMgKi8KKwl3cml0ZXJlZyhkZXYsIFBQX0xpbmVDVEwsIHJlYWRyZWcoZGV2LCBQUF9MaW5lQ1RMKSB8IFNFUklBTF9SWF9PTiB8IFNFUklBTF9UWF9PTik7CisKKwkvKiBSZWNlaXZlIG9ubHkgZXJyb3IgZnJlZSBwYWNrZXRzIGFkZHJlc3NlZCB0byB0aGlzIGNhcmQgKi8KKwlscC0+cnhfbW9kZSA9IDA7CisJd3JpdGVyZWcoZGV2LCBQUF9SeENUTCwgREVGX1JYX0FDQ0VQVCk7CisKKwlscC0+Y3Vycl9yeF9jZmcgPSBSWF9PS19FTkJMIHwgUlhfQ1JDX0VSUk9SX0VOQkw7CisKKwlpZiAobHAtPmlzYV9jb25maWcgJiBTVFJFQU1fVFJBTlNGRVIpCisJCWxwLT5jdXJyX3J4X2NmZyB8PSBSWF9TVFJFQU1fRU5CTDsKKyNpZiBBTExPV19ETUEKKwlzZXRfZG1hX2NmZyhkZXYpOworI2VuZGlmCisJd3JpdGVyZWcoZGV2LCBQUF9SeENGRywgbHAtPmN1cnJfcnhfY2ZnKTsKKworCXdyaXRlcmVnKGRldiwgUFBfVHhDRkcsIFRYX0xPU1RfQ1JTX0VOQkwgfCBUWF9TUUVfRVJST1JfRU5CTCB8IFRYX09LX0VOQkwgfAorCQlUWF9MQVRFX0NPTF9FTkJMIHwgVFhfSkJSX0VOQkwgfCBUWF9BTllfQ09MX0VOQkwgfCBUWF8xNl9DT0xfRU5CTCk7CisKKwl3cml0ZXJlZyhkZXYsIFBQX0J1ZkNGRywgUkVBRFlfRk9SX1RYX0VOQkwgfCBSWF9NSVNTX0NPVU5UX09WUkZMT1dfRU5CTCB8CisjaWYgQUxMT1dfRE1BCisJCWRtYV9idWZjZmcoZGV2KSB8CisjZW5kaWYKKwkJVFhfQ09MX0NPVU5UX09WUkZMT1dfRU5CTCB8IFRYX1VOREVSUlVOX0VOQkwpOworCisJLyogbm93IHRoYXQgd2UndmUgZ290IG91ciBhY3QgdG9nZXRoZXIsIGVuYWJsZSBldmVyeXRoaW5nICovCisJd3JpdGVyZWcoZGV2LCBQUF9CdXNDVEwsIEVOQUJMRV9JUlEKKwkJIHwgKGRldi0+bWVtX3N0YXJ0P01FTU9SWV9PTiA6IDApIC8qIHR1cm4gbWVtb3J5IG9uICovCisjaWYgQUxMT1dfRE1BCisJCSB8IGRtYV9idXNjdGwoZGV2KQorI2VuZGlmCisgICAgICAgICAgICAgICAgICk7CisgICAgICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJaWYgKG5ldF9kZWJ1ZyA+IDEpCisJCXByaW50aygiY3M4OXgwOiBuZXRfb3BlbigpIHN1Y2NlZWRlZFxuIik7CisJcmV0dXJuIDA7CitiYWRfb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG5ldF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogSWYgd2UgZ2V0IGhlcmUsIHNvbWUgaGlnaGVyIGxldmVsIGhhcyBkZWNpZGVkIHdlIGFyZSBicm9rZW4uCisJICAgVGhlcmUgc2hvdWxkIHJlYWxseSBiZSBhICJraWNrIG1lIiBmdW5jdGlvbiBjYWxsIGluc3RlYWQuICovCisJaWYgKG5ldF9kZWJ1ZyA+IDApIHByaW50aygiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/XG4iLCBkZXYtPm5hbWUsCisJCSAgIHR4X2RvbmUoZGV2KSA/ICJJUlEgY29uZmxpY3QgPyIgOiAibmV0d29yayBjYWJsZSBwcm9ibGVtIik7CisJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuICovCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IG5ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChuZXRfZGVidWcgPiAzKSB7CisJCXByaW50aygiJXM6IHNlbnQgJWQgYnl0ZSBwYWNrZXQgb2YgdHlwZSAleFxuIiwKKwkJCWRldi0+bmFtZSwgc2tiLT5sZW4sCisJCQkoc2tiLT5kYXRhW0VUSF9BTEVOK0VUSF9BTEVOXSA8PCA4KSB8IHNrYi0+ZGF0YVtFVEhfQUxFTitFVEhfQUxFTisxXSk7CisJfQorCisJLyoga2VlcCB0aGUgdXBsb2FkIGZyb20gYmVpbmcgaW50ZXJydXB0ZWQsIHNpbmNlIHdlCisgICAgICAgICAgICAgICAgICBhc2sgdGhlIGNoaXAgdG8gc3RhcnQgdHJhbnNtaXR0aW5nIGJlZm9yZSB0aGUKKyAgICAgICAgICAgICAgICAgIHdob2xlIHBhY2tldCBoYXMgYmVlbiBjb21wbGV0ZWx5IHVwbG9hZGVkLiAqLworCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIGluaXRpYXRlIGEgdHJhbnNtaXQgc2VxdWVuY2UgKi8KKwl3cml0ZXdvcmQoZGV2LCBUWF9DTURfUE9SVCwgbHAtPnNlbmRfY21kKTsKKwl3cml0ZXdvcmQoZGV2LCBUWF9MRU5fUE9SVCwgc2tiLT5sZW4pOworCisJLyogVGVzdCB0byBzZWUgaWYgdGhlIGNoaXAgaGFzIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHRoZSBwYWNrZXQgKi8KKwlpZiAoKHJlYWRyZWcoZGV2LCBQUF9CdXNTVCkgJiBSRUFEWV9GT1JfVFhfTk9XKSA9PSAwKSB7CisJCS8qCisJCSAqIEdhc3AhICBJdCBoYXNuJ3QuICBCdXQgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHNpbmNlCisJCSAqIHdlJ3JlIHdhaXRpbmcgZm9yIFR4T2ssIHNvIHJldHVybiAxIGFuZCByZXF1ZXVlIHRoaXMgcGFja2V0LgorCQkgKi8KKwkJCisJCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCQlpZiAobmV0X2RlYnVnKSBwcmludGsoImNzODl4MDogVHggYnVmZmVyIG5vdCBmcmVlIVxuIik7CisJCXJldHVybiAxOworCX0KKwkvKiBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIHBhY2tldCAqLworCW91dHN3KGRldi0+YmFzZV9hZGRyICsgVFhfRlJBTUVfUE9SVCxza2ItPmRhdGEsKHNrYi0+bGVuKzEpID4+MSk7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKworCS8qCisJICogV2UgRE8gTk9UIGNhbGwgbmV0aWZfd2FrZV9xdWV1ZSgpIGhlcmUuCisJICogV2UgYWxzbyBETyBOT1QgY2FsbCBuZXRpZl9zdGFydF9xdWV1ZSgpLgorCSAqCisJICogRWl0aGVyIG9mIHRoZXNlIHdvdWxkIGNhdXNlIGFub3RoZXIgYm90dG9tIGhhbGYgcnVuIHRocm91Z2gKKwkgKiBuZXRfc2VuZF9wYWNrZXQoKSBiZWZvcmUgdGhpcyBwYWNrZXQgaGFzIGZ1bGx5IGdvbmUgb3V0LiAgVGhhdCBjYXVzZXMKKwkgKiB1cyB0byBoaXQgdGhlICJHYXNwISIgYWJvdmUgYW5kIHRoZSBzZW5kIGlzIHJlc2NoZWR1bGVkLiAgaXQgcnVucyBsaWtlCisJICogYSBkb2cuICBXZSBqdXN0IHJldHVybiBhbmQgd2FpdCBmb3IgdGhlIFR4IGNvbXBsZXRpb24gaW50ZXJydXB0IGhhbmRsZXIKKwkgKiB0byByZXN0YXJ0IHRoZSBuZXRkZXZpY2UgbGF5ZXIKKwkgKi8KKworCXJldHVybiAwOworfQorDAorLyogVGhlIHR5cGljYWwgd29ya2xvYWQgb2YgdGhlIGRyaXZlcjoKKyAgIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4gKi8KKyAgIAorc3RhdGljIGlycXJldHVybl90IG5ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKwlpbnQgaW9hZGRyLCBzdGF0dXM7CisgCWludCBoYW5kbGVkID0gMDsKKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIHdlIE1VU1QgcmVhZCBhbGwgdGhlIGV2ZW50cyBvdXQgb2YgdGhlIElTUSwgb3RoZXJ3aXNlIHdlJ2xsIG5ldmVyCisgICAgICAgICAgIGdldCBpbnRlcnJ1cHRlZCBhZ2Fpbi4gIEFzIGEgY29uc2VxdWVuY2UsIHdlIGNhbid0IGhhdmUgYW55IGxpbWl0CisgICAgICAgICAgIG9uIHRoZSBudW1iZXIgb2YgdGltZXMgd2UgbG9vcCBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIuICBUaGUKKyAgICAgICAgICAgaGFyZHdhcmUgZ3VhcmFudGVlcyB0aGF0IGV2ZW50dWFsbHkgd2UnbGwgcnVuIG91dCBvZiBldmVudHMuICBPZgorICAgICAgICAgICBjb3Vyc2UsIGlmIHlvdSdyZSBvbiBhIHNsb3cgbWFjaGluZSwgYW5kIHBhY2tldHMgYXJlIGFycml2aW5nCisgICAgICAgICAgIGZhc3RlciB0aGFuIHlvdSBjYW4gcmVhZCB0aGVtIG9mZiwgeW91J3JlIHNjcmV3ZWQuICBIYXN0YSBsYQorICAgICAgICAgICB2aXN0YSwgYmFieSEgICovCisJd2hpbGUgKChzdGF0dXMgPSByZWFkd29yZChkZXYsIElTUV9QT1JUKSkpIHsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDQpcHJpbnRrKCIlczogZXZlbnQ9JTA0eFxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCQloYW5kbGVkID0gMTsKKwkJc3dpdGNoKHN0YXR1cyAmIElTUV9FVkVOVF9NQVNLKSB7CisJCWNhc2UgSVNRX1JFQ0VJVkVSX0VWRU5UOgorCQkJLyogR290IGEgcGFja2V0KHMpLiAqLworCQkJbmV0X3J4KGRldik7CisJCQlicmVhazsKKwkJY2FzZSBJU1FfVFJBTlNNSVRURVJfRVZFTlQ6CisJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwkvKiBJbmZvcm0gdXBwZXIgbGF5ZXJzLiAqLworCQkJaWYgKChzdGF0dXMgJiAoCVRYX09LIHwKKwkJCQkJVFhfTE9TVF9DUlMgfAorCQkJCQlUWF9TUUVfRVJST1IgfAorCQkJCQlUWF9MQVRFX0NPTCB8CisJCQkJCVRYXzE2X0NPTCkpICE9IFRYX09LKSB7CisJCQkJaWYgKChzdGF0dXMgJiBUWF9PSykgPT0gMCkgbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBUWF9MT1NUX0NSUykgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFRYX1NRRV9FUlJPUikgbHAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgVFhfTEFURV9DT0wpIGxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFRYXzE2X0NPTCkgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBJU1FfQlVGRkVSX0VWRU5UOgorCQkJaWYgKHN0YXR1cyAmIFJFQURZX0ZPUl9UWCkgeworCQkJCS8qIHdlIHRyaWVkIHRvIHRyYW5zbWl0IGEgcGFja2V0IGVhcmxpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpbmV4cGxpY2FibHkgcmFuIG91dCBvZiBidWZmZXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGF0IHNob3VsZG4ndCBoYXBwZW4gc2luY2Ugd2Ugb25seSBldmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQgb25lIHBhY2tldC4gIFNocnVnLiAgRG8gdGhlIHJpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nIGFueXdheS4gKi8KKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CS8qIEluZm9ybSB1cHBlciBsYXllcnMuICovCisJCQl9CisJCQlpZiAoc3RhdHVzICYgVFhfVU5ERVJSVU4pIHsKKwkJCQlpZiAobmV0X2RlYnVnID4gMCkgcHJpbnRrKCIlczogdHJhbnNtaXQgdW5kZXJydW5cbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zZW5kX3VuZGVycnVuKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChscC0+c2VuZF91bmRlcnJ1biA9PSAzKSBscC0+c2VuZF9jbWQgPSBUWF9BRlRFUl8zODE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxwLT5zZW5kX3VuZGVycnVuID09IDYpIGxwLT5zZW5kX2NtZCA9IFRYX0FGVEVSX0FMTDsKKwkJCQkvKiB0cmFuc21pdCBjeWNsZSBpcyBkb25lLCBhbHRob3VnaAorCQkJCSAgIGZyYW1lIHdhc24ndCB0cmFuc21pdHRlZCAtIHRoaXMKKwkJCQkgICBhdm9pZHMgaGF2aW5nIHRvIHdhaXQgZm9yIHRoZSB1cHBlcgorCQkJCSAgIGxheWVycyB0byB0aW1lb3V0IG9uIHVzLCBpbiB0aGUKKwkJCQkgICBldmVudCBvZiBhIHR4IHVuZGVycnVuICovCisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwkvKiBJbmZvcm0gdXBwZXIgbGF5ZXJzLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2lmIEFMTE9XX0RNQQorCQkJaWYgKGxwLT51c2VfZG1hICYmIChzdGF0dXMgJiBSWF9ETUEpKSB7CisJCQkJaW50IGNvdW50ID0gcmVhZHJlZyhkZXYsIFBQX0RtYUZyYW1lQ250KTsKKwkJCQl3aGlsZShjb3VudCkgeworCQkJCQlpZiAobmV0X2RlYnVnID4gNSkKKwkJCQkJCXByaW50aygiJXM6IHJlY2VpdmluZyAlZCBETUEgZnJhbWVzXG4iLCBkZXYtPm5hbWUsIGNvdW50KTsKKwkJCQkJaWYgKG5ldF9kZWJ1ZyA+IDIgJiYgY291bnQgPjEpCisJCQkJCQlwcmludGsoIiVzOiByZWNlaXZpbmcgJWQgRE1BIGZyYW1lc1xuIiwgZGV2LT5uYW1lLCBjb3VudCk7CisJCQkJCWRtYV9yeChkZXYpOworCQkJCQlpZiAoLS1jb3VudCA9PSAwKQorCQkJCQkJY291bnQgPSByZWFkcmVnKGRldiwgUFBfRG1hRnJhbWVDbnQpOworCQkJCQlpZiAobmV0X2RlYnVnID4gMiAmJiBjb3VudCA+IDApCisJCQkJCQlwcmludGsoIiVzOiBjb250aW51aW5nIHdpdGggJWQgRE1BIGZyYW1lc1xuIiwgZGV2LT5uYW1lLCBjb3VudCk7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJY2FzZSBJU1FfUlhfTUlTU19FVkVOVDoKKwkJCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IChzdGF0dXMgPj42KTsKKwkJCWJyZWFrOworCQljYXNlIElTUV9UWF9DT0xfRVZFTlQ6CisJCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSAoc3RhdHVzID4+Nik7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIHZvaWQKK2NvdW50X3J4X2Vycm9ycyhpbnQgc3RhdHVzLCBzdHJ1Y3QgbmV0X2xvY2FsICpscCkKK3sKKwlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFJYX1JVTlQpIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFJYX0VYVFJBX0RBVEEpIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFJYX0NSQ19FUlJPUikgaWYgKCEoc3RhdHVzICYgKFJYX0VYVFJBX0RBVEF8UlhfUlVOVCkpKQorCQkvKiBwZXIgc3RyIDE3MiAqLworCQlscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBSWF9EUklCQkxFKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJcmV0dXJuOworfQorCisvKiBXZSBoYXZlIGEgZ29vZCBwYWNrZXQocyksIGdldCBpdC90aGVtIG91dCBvZiB0aGUgYnVmZmVycy4gKi8KK3N0YXRpYyB2b2lkCituZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgc3RhdHVzLCBsZW5ndGg7CisKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RhdHVzID0gaW53KGlvYWRkciArIFJYX0ZSQU1FX1BPUlQpOworCWxlbmd0aCA9IGludyhpb2FkZHIgKyBSWF9GUkFNRV9QT1JUKTsKKworCWlmICgoc3RhdHVzICYgUlhfT0spID09IDApIHsKKwkJY291bnRfcnhfZXJyb3JzKHN0YXR1cywgbHApOworCQlyZXR1cm47CisJfQorCisJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW5ndGggKyAyKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKyNpZiAwCQkvKiBBZ2FpbiwgdGhpcyBzZWVtcyBhIGNydWVsIHRoaW5nIHRvIGRvICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIGxvbmd3b3JkIGFsaWduIEwzIGhlYWRlciAqLworCXNrYi0+ZGV2ID0gZGV2OworCisJaW5zdyhpb2FkZHIgKyBSWF9GUkFNRV9QT1JULCBza2JfcHV0KHNrYiwgbGVuZ3RoKSwgbGVuZ3RoID4+IDEpOworCWlmIChsZW5ndGggJiAxKQorCQlza2ItPmRhdGFbbGVuZ3RoLTFdID0gaW53KGlvYWRkciArIFJYX0ZSQU1FX1BPUlQpOworCisJaWYgKG5ldF9kZWJ1ZyA+IDMpIHsKKwkJcHJpbnRrKAkiJXM6IHJlY2VpdmVkICVkIGJ5dGUgcGFja2V0IG9mIHR5cGUgJXhcbiIsCisJCQlkZXYtPm5hbWUsIGxlbmd0aCwKKwkJCShza2ItPmRhdGFbRVRIX0FMRU4rRVRIX0FMRU5dIDw8IDgpIHwgc2tiLT5kYXRhW0VUSF9BTEVOK0VUSF9BTEVOKzFdKTsKKwl9CisKKyAgICAgICAgc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuZ3RoOworfQorCisjaWYgQUxMT1dfRE1BCitzdGF0aWMgdm9pZCByZWxlYXNlX2RtYV9idWZmKHN0cnVjdCBuZXRfbG9jYWwgKmxwKQoreworCWlmIChscC0+ZG1hX2J1ZmYpIHsKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykobHAtPmRtYV9idWZmKSwgZ2V0X29yZGVyKGxwLT5kbWFzaXplICogMTAyNCkpOworCQlscC0+ZG1hX2J1ZmYgPSBOVUxMOworCX0KK30KKyNlbmRpZgorCisvKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIG5ldF9vcGVuKCkuICovCitzdGF0aWMgaW50CituZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZiBBTExPV19ETUEKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisjZW5kaWYKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwl3cml0ZXJlZyhkZXYsIFBQX1J4Q0ZHLCAwKTsKKwl3cml0ZXJlZyhkZXYsIFBQX1R4Q0ZHLCAwKTsKKwl3cml0ZXJlZyhkZXYsIFBQX0J1ZkNGRywgMCk7CisJd3JpdGVyZWcoZGV2LCBQUF9CdXNDVEwsIDApOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKyNpZiBBTExPV19ETUEKKwlpZiAobHAtPnVzZV9kbWEgJiYgbHAtPmRtYSkgeworCQlmcmVlX2RtYShkZXYtPmRtYSk7CisJCXJlbGVhc2VfZG1hX2J1ZmYobHApOworCX0KKyNlbmRpZgorCisJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGhlcmUuICovCisJcmV0dXJuIDA7Cit9CisKKy8qIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLglUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yCisgICBjbG9zZWQuICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGZyb20gdGhlIGRldmljZSByZWdpc3RlcnMuICovCisJbHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gKHJlYWRyZWcoZGV2LCBQUF9SeE1pc3MpID4+IDYpOworCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IChyZWFkcmVnKGRldiwgUFBfVHhDb2wpID4+IDYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlpZihkZXYtPmZsYWdzJklGRl9QUk9NSVNDKQorCXsKKwkJbHAtPnJ4X21vZGUgPSBSWF9BTExfQUNDRVBUOworCX0KKwllbHNlIGlmKChkZXYtPmZsYWdzJklGRl9BTExNVUxUSSl8fGRldi0+bWNfbGlzdCkKKwl7CisJCS8qIFRoZSBtdWx0aWNhc3QtYWNjZXB0IGxpc3QgaXMgaW5pdGlhbGl6ZWQgdG8gYWNjZXB0LWFsbCwgYW5kIHdlCisJCSAgIHJlbHkgb24gaGlnaGVyLWxldmVsIGZpbHRlcmluZyBmb3Igbm93LiAqLworCQlscC0+cnhfbW9kZSA9IFJYX01VTFRDQVNUX0FDQ0VQVDsKKwl9IAorCWVsc2UKKwkJbHAtPnJ4X21vZGUgPSAwOworCisJd3JpdGVyZWcoZGV2LCBQUF9SeENUTCwgREVGX1JYX0FDQ0VQVCB8IGxwLT5yeF9tb2RlKTsKKworCS8qIGluIHByb21pc2N1b3VzIG1vZGUsIHdlIGFjY2VwdCBlcnJvcmVkIHBhY2tldHMsIHNvIHdlIGhhdmUgdG8gZW5hYmxlIGludGVycnVwdHMgb24gdGhlbSBhbHNvICovCisJd3JpdGVyZWcoZGV2LCBQUF9SeENGRywgbHAtPmN1cnJfcnhfY2ZnIHwKKwkgICAgIChscC0+cnhfbW9kZSA9PSBSWF9BTExfQUNDRVBUPyAoUlhfQ1JDX0VSUk9SX0VOQkx8UlhfUlVOVF9FTkJMfFJYX0VYVFJBX0RBVEFfRU5CTCkgOiAwKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgaW50IHNldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQoreworCWludCBpOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUJVU1k7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisKKwlpZiAobmV0X2RlYnVnKSB7CisJCXByaW50aygiJXM6IFNldHRpbmcgTUFDIGFkZHJlc3MgdG8gIiwgZGV2LT5uYW1lKTsKKwkJZm9yIChpID0gMDsgaSA8IGRldi0+YWRkcl9sZW47IGkrKykKKwkJCXByaW50aygiICUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJCXByaW50aygiLlxuIik7CisJfQorCS8qIHNldCB0aGUgRXRoZXJuZXQgYWRkcmVzcyAqLworCWZvciAoaT0wOyBpIDwgRVRIX0FMRU4vMjsgaSsrKQorCQl3cml0ZXJlZyhkZXYsIFBQX0lBK2kqMiwgZGV2LT5kZXZfYWRkcltpKjJdIHwgKGRldi0+ZGV2X2FkZHJbaSoyKzFdIDw8IDgpKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2NzODl4MDsKKworLyoKKyAqIFN1cHBvcnQgdGhlICdkZWJ1ZycgbW9kdWxlIHBhcm0gZXZlbiBpZiB3ZSdyZSBjb21waWxlZCBmb3Igbm9uLWRlYnVnIHRvIAorICogYXZvaWQgYnJlYWtpbmcgc29tZW9uZSdzIHN0YXJ0dXAgc2NyaXB0cyAKKyAqLworCitzdGF0aWMgaW50IGlvOworc3RhdGljIGludCBpcnE7CitzdGF0aWMgaW50IGRlYnVnOworc3RhdGljIGNoYXIgbWVkaWFbOF07CitzdGF0aWMgaW50IGR1cGxleD0tMTsKKworc3RhdGljIGludCB1c2VfZG1hOwkJCS8qIFRoZXNlIGdlbmVyYXRlIHVudXNlZCB2YXIgd2FybmluZ3MgaWYgQUxMT1dfRE1BID0gMCAqLworc3RhdGljIGludCBkbWE7CitzdGF0aWMgaW50IGRtYXNpemU9MTY7CQkJLyogb3IgNjQgKi8KKworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9zdHJpbmcobWVkaWEsIG1lZGlhLCBzaXplb2YobWVkaWEpLCAwKTsKK21vZHVsZV9wYXJhbShkdXBsZXgsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZG1hICwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkbWFzaXplICwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh1c2VfZG1hICwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJjczg5eDAgSS9PIGJhc2UgYWRkcmVzcyIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJjczg5eDAgSVJRIG51bWJlciIpOworI2lmIERFQlVHR0lORworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImNzODl4MCBkZWJ1ZyBsZXZlbCAoMC02KSIpOworI2Vsc2UKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICIoaWdub3JlZCkiKTsKKyNlbmRpZgorTU9EVUxFX1BBUk1fREVTQyhtZWRpYSwgIlNldCBjczg5eDAgYWRhcHRlcihzKSBtZWRpYSB0eXBlKHMpIChyajQ1LGJuYyxhdWkpIik7CisvKiBObyBvdGhlciB2YWx1ZSB0aGFuIC0xIGZvciBkdXBsZXggc2VlbXMgdG8gYmUgY3VycmVudGx5IGludGVycHJldGVkICovCitNT0RVTEVfUEFSTV9ERVNDKGR1cGxleCwgIihpZ25vcmVkKSIpOworI2lmIEFMTE9XX0RNQQorTU9EVUxFX1BBUk1fREVTQyhkbWEgLCAiY3M4OXgwIElTQSBETUEgY2hhbm5lbDsgaWdub3JlZCBpZiB1c2VfZG1hPTAiKTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hc2l6ZSAsICJjczg5eDAgRE1BIHNpemUgaW4ga0IgKDE2LDY0KTsgaWdub3JlZCBpZiB1c2VfZG1hPTAiKTsKK01PRFVMRV9QQVJNX0RFU0ModXNlX2RtYSAsICJjczg5eDAgdXNpbmcgRE1BICgwLTEpIik7CisjZWxzZQorTU9EVUxFX1BBUk1fREVTQyhkbWEgLCAiKGlnbm9yZWQpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRtYXNpemUgLCAiKGlnbm9yZWQpIik7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9kbWEgLCAiKGlnbm9yZWQpIik7CisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiTWlrZSBDcnVzZSwgUnVzc3dsbCBOZWxzb24gPG5lbHNvbkBjcnlud3IuY29tPiwgQW5kcmV3IE1vcnRvbiA8YW5kcmV3bUB1b3cuZWR1LmF1PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKy8qCisqIG1lZGlhPXQgICAgICAgICAgICAgLSBzcGVjaWZ5IG1lZGlhIHR5cGUKKyAgIG9yIG1lZGlhPTIKKyAgIG9yIG1lZGlhPWF1aQorICAgb3IgbWVkYWk9YXV0bworKiBkdXBsZXg9MCAgICAgICAgICAgIC0gc3BlY2lmeSBmb3JjZWQgaGFsZi9mdWxsL2F1dG9uZWdvdGlhdGUgZHVwbGV4CisqIGRlYnVnPSMgICAgICAgICAgICAgLSBkZWJ1ZyBsZXZlbAorCisKKyogRGVmYXVsdCBDaGlwIENvbmZpZ3VyYXRpb246CisgICogRE1BIEJ1cnN0ID0gZW5hYmxlZAorICAqIElPQ0hSRFkgRW5hYmxlZCA9IGVuYWJsZWQKKyAgICAqIFVzZVNBID0gZW5hYmxlZAorICAgICogQ1M4OTAwIGRlZmF1bHRzIHRvIGhhbGYtZHVwbGV4IGlmIG5vdCBzcGVjaWZpZWQgb24gY29tbWFuZC1saW5lCisgICAgKiBDUzg5MjAgZGVmYXVsdHMgdG8gYXV0b25lZyBpZiBub3Qgc3BlY2lmaWVkIG9uIGNvbW1hbmQtbGluZQorICAgICogVXNlIHJlc2V0IGRlZmF1bHRzIGZvciBvdGhlciBjb25maWcgcGFyYW1ldGVycworCisqIEFzc3VtcHRpb25zOgorICAqIG1lZGlhIHR5cGUgc3BlY2lmaWVkIGlzIHN1cHBvcnRlZCAoY2lyY3VpdHJ5IGlzIHByZXNlbnQpCisgICogaWYgbWVtb3J5IGFkZHJlc3MgaXMgPiAxTUIsIHRoZW4gcmVxdWlyZWQgbWVtIGRlY29kZSBodyBpcyBwcmVzZW50CisgICogaWYgMTBCLTIsIHRoZW4gYWdlbnQgb3RoZXIgdGhhbiBkcml2ZXIgd2lsbCBlbmFibGUgREMvREMgY29udmVydGVyCisgICAgKGh3IG9yIHNvZnR3YXJlIHV0aWwpCisKKworKi8KKworaW50Citpbml0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwOworCWludCByZXQgPSAwOworCisjaWYgREVCVUdHSU5HCisJbmV0X2RlYnVnID0gZGVidWc7CisjZWxzZQorCWRlYnVnID0gMDsKKyNlbmRpZgorCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldi0+aXJxID0gaXJxOworCWRldi0+YmFzZV9hZGRyID0gaW87CisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWYgQUxMT1dfRE1BCisJaWYgKHVzZV9kbWEpIHsKKwkJbHAtPnVzZV9kbWEgPSB1c2VfZG1hOworCQlscC0+ZG1hID0gZG1hOworCQlscC0+ZG1hc2l6ZSA9IGRtYXNpemU7CisJfQorI2VuZGlmCisKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisgICAgICAgIC8qIGJveSwgdGhleSdkIGJldHRlciBnZXQgdGhlc2UgcmlnaHQgKi8KKyAgICAgICAgaWYgKCFzdHJjbXAobWVkaWEsICJyajQ1IikpCisJCWxwLT5hZGFwdGVyX2NuZiA9IEFfQ05GX01FRElBXzEwQl9UIHwgQV9DTkZfMTBCX1Q7CisJZWxzZSBpZiAoIXN0cmNtcChtZWRpYSwgImF1aSIpKQorCQlscC0+YWRhcHRlcl9jbmYgPSBBX0NORl9NRURJQV9BVUkgICB8IEFfQ05GX0FVSTsKKwllbHNlIGlmICghc3RyY21wKG1lZGlhLCAiYm5jIikpCisJCWxwLT5hZGFwdGVyX2NuZiA9IEFfQ05GX01FRElBXzEwQl8yIHwgQV9DTkZfMTBCXzI7CisJZWxzZQorCQlscC0+YWRhcHRlcl9jbmYgPSBBX0NORl9NRURJQV8xMEJfVCB8IEFfQ05GXzEwQl9UOworCisgICAgICAgIGlmIChkdXBsZXg9PS0xKQorCQlscC0+YXV0b19uZWdfY25mID0gQVVUT19ORUdfRU5BQkxFOworCisgICAgICAgIGlmIChpbyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczg5eDAuYzogTW9kdWxlIGF1dG9wcm9iaW5nIG5vdCBhbGxvd2VkLlxuIik7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczg5eDAuYzogQXBwZW5kIGlvPTB4Tk5OXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtRVBFUk07CisJCWdvdG8gb3V0OworICAgICAgICB9IGVsc2UgaWYgKGlvIDw9IDB4MWZmKSB7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CisJfQorCisjaWYgQUxMT1dfRE1BCisJaWYgKHVzZV9kbWEgJiYgZG1hc2l6ZSAhPSAxNiAmJiBkbWFzaXplICE9IDY0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3M4OXgwLmM6IGRtYSBzaXplIG11c3QgYmUgZWl0aGVyIDE2SyBvciA2NEssIG5vdCAlZEtcbiIsIGRtYXNpemUpOworCQlyZXQgPSAtRVBFUk07CisJCWdvdG8gb3V0OworCX0KKyNlbmRpZgorCXJldCA9IGNzODl4MF9wcm9iZTEoZGV2LCBpbywgMSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKyAgICAgICAgaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzODl4MC5jOiBObyBjYXJkIGZvdW5kIGF0IDB4JXhcbiIsIGlvKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtRU5YSU87CisJCW91dHcoUFBfQ2hpcElELCBkZXYtPmJhc2VfYWRkciArIEFERF9QT1JUKTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIE5FVENBUkRfSU9fRVhURU5UKTsKKwkJZ290byBvdXQ7CisgICAgICAgIH0KKwlkZXZfY3M4OXgwID0gZGV2OworCXJldHVybiAwOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIHJldDsKK30KKwordm9pZAorY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfY3M4OXgwKTsKKwlvdXR3KFBQX0NoaXBJRCwgZGV2X2NzODl4MC0+YmFzZV9hZGRyICsgQUREX1BPUlQpOworCXJlbGVhc2VfcmVnaW9uKGRldl9jczg5eDAtPmJhc2VfYWRkciwgTkVUQ0FSRF9JT19FWFRFTlQpOworCWZyZWVfbmV0ZGV2KGRldl9jczg5eDApOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICB2ZXJzaW9uLWNvbnRyb2w6IHQKKyAqICBrZXB0LW5ldy12ZXJzaW9uczogNQorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jczg5eDAuaCBiL2RyaXZlcnMvbmV0L2NzODl4MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZWY3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jczg5eDAuaApAQCAtMCwwICsxLDQ3NiBAQAorLyogIENvcHlyaWdodCwgMTk4OC0xOTkyLCBSdXNzZWxsIE5lbHNvbiwgQ3J5bndyIFNvZnR3YXJlCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAxLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICAgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaWZkZWYgQ09ORklHX0FSQ0hfSVhEUDJYMDEKKy8qIElYRFAyNDAxL0lYRFAyODAxIHVzZXMgZHdvcmQtYWxpZ25lZCByZWdpc3RlciBhZGRyZXNzaW5nICovCisjZGVmaW5lIENTODl4MF9QT1JUKHJlZykgKChyZWcpICogMikKKyNlbHNlCisjZGVmaW5lIENTODl4MF9QT1JUKHJlZykgKHJlZykKKyNlbmRpZgorCisjZGVmaW5lIFBQX0NoaXBJRCAweDAwMDAJLyogb2Zmc2V0ICAgMGggLT4gQ29ycCAtSUQgICAgICAgICAgICAgICovCisJCQkJLyogb2Zmc2V0ICAgMmggLT4gTW9kZWwvUHJvZHVjdCBOdW1iZXIgICovCisJCQkJLyogb2Zmc2V0ICAgM2ggLT4gQ2hpcCBSZXZpc2lvbiBOdW1iZXIgICovCisKKyNkZWZpbmUgUFBfSVNBSU9CIDB4MDAyMAkvKiAgSU8gYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFBQX0NTODkwMF9JU0FJTlQgMHgwMDIyCS8qICBJU0EgaW50ZXJydXB0IHNlbGVjdCAqLworI2RlZmluZSBQUF9DUzg5MjBfSVNBSU5UIDB4MDM3MAkvKiAgSVNBIGludGVycnVwdCBzZWxlY3QgKi8KKyNkZWZpbmUgUFBfQ1M4OTAwX0lTQURNQSAweDAwMjQJLyogIElTQSBSZWMgRE1BIGNoYW5uZWwgKi8KKyNkZWZpbmUgUFBfQ1M4OTIwX0lTQURNQSAweDAzNzQJLyogIElTQSBSZWMgRE1BIGNoYW5uZWwgKi8KKyNkZWZpbmUgUFBfSVNBU09GIDB4MDAyNgkvKiAgSVNBIERNQSBvZmZzZXQgKi8KKyNkZWZpbmUgUFBfRG1hRnJhbWVDbnQgMHgwMDI4CS8qICBJU0EgRE1BIEZyYW1lIGNvdW50ICovCisjZGVmaW5lIFBQX0RtYUJ5dGVDbnQgMHgwMDJBCS8qICBJU0EgRE1BIEJ5dGUgY291bnQgKi8KKyNkZWZpbmUgUFBfQ1M4OTAwX0lTQU1lbUIgMHgwMDJDCS8qICBNZW1vcnkgYmFzZSAqLworI2RlZmluZSBQUF9DUzg5MjBfSVNBTWVtQiAweDAzNDggLyogICovCisKKyNkZWZpbmUgUFBfSVNBQm9vdEJhc2UgMHgwMDMwCS8qICBCb290IFByb20gYmFzZSAgKi8KKyNkZWZpbmUgUFBfSVNBQm9vdE1hc2sgMHgwMDM0CS8qICBCb290IFByb20gTWFzayAqLworCisvKiBFRVBST00gZGF0YSBhbmQgY29tbWFuZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUFBfRUVDTUQgMHgwMDQwCQkvKiAgTlZSIEludGVyZmFjZSBDb21tYW5kIHJlZ2lzdGVyICovCisjZGVmaW5lIFBQX0VFRGF0YSAweDAwNDIJLyogIE5WUiBJbnRlcmZhY2UgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBQUF9EZWJ1Z1JlZyAweDAwNDQJLyogIERlYnVnIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUFBfUnhDRkcgMHgwMTAyCQkvKiAgUnggQnVzIGNvbmZpZyAqLworI2RlZmluZSBQUF9SeENUTCAweDAxMDQJCS8qICBSZWNlaXZlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfVHhDRkcgMHgwMTA2CQkvKiAgVHJhbnNtaXQgQ29uZmlnIFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX1R4Q01EIDB4MDEwOAkJLyogIFRyYW5zbWl0IENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfQnVmQ0ZHIDB4MDEwQQkvKiAgQnVzIGNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfTGluZUNUTCAweDAxMTIJLyogIExpbmUgQ29uZmlnIFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX1NlbGZDVEwgMHgwMTE0CS8qICBTZWxmIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfQnVzQ1RMIDB4MDExNgkvKiAgSVNBIGJ1cyBjb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX1Rlc3RDVEwgMHgwMTE4CS8qICBUZXN0IFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX0F1dG9OZWdDVEwgMHgwMTFDCS8qICBBdXRvIE5lZ290aWF0aW9uIEN0cmwgKi8KKworI2RlZmluZSBQUF9JU1EgMHgwMTIwCQkvKiAgSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSBQUF9SeEV2ZW50IDB4MDEyNAkvKiAgUnggRXZlbnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfVHhFdmVudCAweDAxMjgJLyogIFR4IEV2ZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX0J1ZkV2ZW50IDB4MDEyQwkvKiAgQnVzIEV2ZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX1J4TWlzcyAweDAxMzAJLyogIFJlY2VpdmUgTWlzcyBDb3VudCAqLworI2RlZmluZSBQUF9UeENvbCAweDAxMzIJCS8qICBUcmFuc21pdCBDb2xsaXNpb24gQ291bnQgKi8KKyNkZWZpbmUgUFBfTGluZVNUIDB4MDEzNAkvKiAgTGluZSBTdGF0ZSBSZWdpc3RlciAqLworI2RlZmluZSBQUF9TZWxmU1QgMHgwMTM2CS8qICBTZWxmIFN0YXRlIHJlZ2lzdGVyICovCisjZGVmaW5lIFBQX0J1c1NUIDB4MDEzOAkJLyogIEJ1cyBTdGF0dXMgKi8KKyNkZWZpbmUgUFBfVERSIDB4MDEzQwkJLyogIFRpbWUgRG9tYWluIFJlZmxlY3RvbWV0cnkgKi8KKyNkZWZpbmUgUFBfQXV0b05lZ1NUIDB4MDEzRQkvKiAgQXV0byBOZWcgU3RhdHVzICovCisjZGVmaW5lIFBQX1R4Q29tbWFuZCAweDAxNDQJLyogIFR4IENvbW1hbmQgKi8KKyNkZWZpbmUgUFBfVHhMZW5ndGggMHgwMTQ2CS8qICBUeCBMZW5ndGggKi8KKyNkZWZpbmUgUFBfTEFGIDB4MDE1MAkJLyogIEhhc2ggVGFibGUgKi8KKyNkZWZpbmUgUFBfSUEgMHgwMTU4CQkvKiAgUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciAqLworCisjZGVmaW5lIFBQX1J4U3RhdHVzIDB4MDQwMAkvKiAgUmVjZWl2ZSBzdGFydCBvZiBmcmFtZSAqLworI2RlZmluZSBQUF9SeExlbmd0aCAweDA0MDIJLyogIFJlY2VpdmUgTGVuZ3RoIG9mIGZyYW1lICovCisjZGVmaW5lIFBQX1J4RnJhbWUgMHgwNDA0CS8qICBSZWNlaXZlIGZyYW1lIHBvaW50ZXIgKi8KKyNkZWZpbmUgUFBfVHhGcmFtZSAweDBBMDAJLyogIFRyYW5zbWl0IGZyYW1lIHBvaW50ZXIgKi8KKworLyogIFByaW1hcnkgSS9PIEJhc2UgQWRkcmVzcy4gSWYgbm8gSS9PIGJhc2UgaXMgc3VwcGxpZWQgYnkgdGhlIHVzZXIsIHRoZW4gdGhpcyAqLworLyogIGNhbiBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IEkvTyBiYXNlIHRvIGFjY2VzcyB0aGUgUGFja2V0UGFnZSBBcmVhLiAqLworI2RlZmluZSBERUZBVUxUSU9CQVNFIDB4MDMwMAorI2RlZmluZSBGSVJTVF9JTyAweDAyMEMJCS8qICBGaXJzdCBJL08gcG9ydCB0byBjaGVjayAqLworI2RlZmluZSBMQVNUX0lPIDB4MDM3QwkJLyogIExhc3QgSS9PIHBvcnQgdG8gY2hlY2sgKCsxMGgpICovCisjZGVmaW5lIEFERF9NQVNLIDB4MzAwMAkJLyogIE1hc2sgaXQgdXNlIG9mIHRoZSBBRERfUE9SVCByZWdpc3RlciAqLworI2RlZmluZSBBRERfU0lHIDB4MzAwMAkJLyogIEV4cGVjdGVkIElEIHNpZ25hdHVyZSAqLworCisvKiBPbiBNYWNzLCB3ZSBvbmx5IG5lZWQgdXNlIHRoZSBJU0EgSS9PIHN0dWZmIHVudGlsIHdlIGRvIE1FTU9SWV9PTiAqLworI2lmZGVmIENPTkZJR19NQUMKKyNkZWZpbmUgTENTTE9UQkFTRSAweGZlZTAwMDAwCisjZGVmaW5lIE1NSU9CQVNFIDB4NDAwMDAKKyNlbmRpZgorCisjZGVmaW5lIENISVBfRUlTQV9JRF9TSUcgMHg2MzBFICAgLyogIFByb2R1Y3QgSUQgQ29kZSBmb3IgQ3J5c3RhbCBDaGlwIChDUzg5MDAgc3BlYyA0LjMpICovCisKKyNpZmRlZiBJQk1FSVBLVAorI2RlZmluZSBFSVNBX0lEX1NJRyAweDREMjQJLyogIElCTSAqLworI2RlZmluZSBQQVJUX05PX1NJRyAweDEwMTAJLyogIElCTSAqLworI2RlZmluZSBNT05HT09TRV9CSVQgMHgwMDAwCS8qICBJQk0gKi8KKyNlbHNlCisjZGVmaW5lIEVJU0FfSURfU0lHIDB4NjMwRQkvKiAgUG5QIFZlbmRvciBJRCAoc2FtZSBhcyBjaGlwIGlkIGZvciBDcnlzdGFsIGJvYXJkKSAqLworI2RlZmluZSBQQVJUX05PX1NJRyAweDQwMDAJLyogIElEIGNvZGUgQ1M4OTIwIGJvYXJkIChQblAgVmVuZG9yIFByb2R1Y3QgY29kZSkgKi8KKyNkZWZpbmUgTU9OR09PU0VfQklUIDB4MjAwMAkvKiAgUEFSVF9OT19TSUcgKyBNT05HT09TRV9CVVQgPT4gSUQgb2YgbW9uZ29vc2UgKi8KKyNlbmRpZgorCisjZGVmaW5lIFBST0RVQ1RfSURfQUREIDB4MDAwMiAgIC8qICBBZGRyZXNzIG9mIHByb2R1Y3QgSUQgKi8KKworLyogIE1hc2sgdG8gZmluZCBvdXQgdGhlIHR5cGVzIG9mICByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkVHX1RZUEVfTUFTSyAweDAwMUYKKworLyogIEVlcHJvbSBDb21tYW5kcyAqLworI2RlZmluZSBFUlNFX1dSX0VOQkwgMHgwMEYwCisjZGVmaW5lIEVSU0VfV1JfRElTQUJMRSAweDAwMDAKKworLyogIERlZmluZXMgQ29udHJvbC9Db25maWcgcmVnaXN0ZXIgcXVpbnR1cGxldCBudW1iZXJzICovCisjZGVmaW5lIFJYX0JVRl9DRkcgMHgwMDAzCisjZGVmaW5lIFJYX0NPTlRST0wgMHgwMDA1CisjZGVmaW5lIFRYX0NGRyAweDAwMDcKKyNkZWZpbmUgVFhfQ09NTUFORCAweDAwMDkKKyNkZWZpbmUgQlVGX0NGRyAweDAwMEIKKyNkZWZpbmUgTElORV9DT05UUk9MIDB4MDAxMworI2RlZmluZSBTRUxGX0NPTlRST0wgMHgwMDE1CisjZGVmaW5lIEJVU19DT05UUk9MIDB4MDAxNworI2RlZmluZSBURVNUX0NPTlRST0wgMHgwMDE5CisKKy8qICBEZWZpbmVzIFN0YXR1cy9Db3VudCByZWdpc3RlcnMgcXVpbnR1cGxldCBudW1iZXJzICovCisjZGVmaW5lIFJYX0VWRU5UIDB4MDAwNAorI2RlZmluZSBUWF9FVkVOVCAweDAwMDgKKyNkZWZpbmUgQlVGX0VWRU5UIDB4MDAwQworI2RlZmluZSBSWF9NSVNTX0NPVU5UIDB4MDAxMAorI2RlZmluZSBUWF9DT0xfQ09VTlQgMHgwMDEyCisjZGVmaW5lIExJTkVfU1RBVFVTIDB4MDAxNAorI2RlZmluZSBTRUxGX1NUQVRVUyAweDAwMTYKKyNkZWZpbmUgQlVTX1NUQVRVUyAweDAwMTgKKyNkZWZpbmUgVERSIDB4MDAxQworCisvKiBQUF9SeENGRyAtIFJlY2VpdmUgIENvbmZpZ3VyYXRpb24gYW5kIEludGVycnVwdCBNYXNrIGJpdCBkZWZpbml0aW9uIC0gIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgU0tJUF8xIDB4MDA0MAorI2RlZmluZSBSWF9TVFJFQU1fRU5CTCAweDAwODAKKyNkZWZpbmUgUlhfT0tfRU5CTCAweDAxMDAKKyNkZWZpbmUgUlhfRE1BX09OTFkgMHgwMjAwCisjZGVmaW5lIEFVVE9fUlhfRE1BIDB4MDQwMAorI2RlZmluZSBCVUZGRVJfQ1JDIDB4MDgwMAorI2RlZmluZSBSWF9DUkNfRVJST1JfRU5CTCAweDEwMDAKKyNkZWZpbmUgUlhfUlVOVF9FTkJMIDB4MjAwMAorI2RlZmluZSBSWF9FWFRSQV9EQVRBX0VOQkwgMHg0MDAwCisKKy8qIFBQX1J4Q1RMIC0gUmVjZWl2ZSBDb250cm9sIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLworI2RlZmluZSBSWF9JQV9IQVNIX0FDQ0VQVCAweDAwNDAKKyNkZWZpbmUgUlhfUFJPTV9BQ0NFUFQgMHgwMDgwCisjZGVmaW5lIFJYX09LX0FDQ0VQVCAweDAxMDAKKyNkZWZpbmUgUlhfTVVMVENBU1RfQUNDRVBUIDB4MDIwMAorI2RlZmluZSBSWF9JQV9BQ0NFUFQgMHgwNDAwCisjZGVmaW5lIFJYX0JST0FEQ0FTVF9BQ0NFUFQgMHgwODAwCisjZGVmaW5lIFJYX0JBRF9DUkNfQUNDRVBUIDB4MTAwMAorI2RlZmluZSBSWF9SVU5UX0FDQ0VQVCAweDIwMDAKKyNkZWZpbmUgUlhfRVhUUkFfREFUQV9BQ0NFUFQgMHg0MDAwCisjZGVmaW5lIFJYX0FMTF9BQ0NFUFQgKFJYX1BST01fQUNDRVBUfFJYX0JBRF9DUkNfQUNDRVBUfFJYX1JVTlRfQUNDRVBUfFJYX0VYVFJBX0RBVEFfQUNDRVBUKQorLyogIERlZmF1bHQgcmVjZWl2ZSBtb2RlIC0gaW5kaXZpZHVhbGx5IGFkZHJlc3NlZCwgYnJvYWRjYXN0LCBhbmQgZXJyb3IgZnJlZSAqLworI2RlZmluZSBERUZfUlhfQUNDRVBUIChSWF9JQV9BQ0NFUFQgfCBSWF9CUk9BRENBU1RfQUNDRVBUIHwgUlhfT0tfQUNDRVBUKQorCisvKiBQUF9UeENGRyAtIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gSW50ZXJydXB0IE1hc2sgYml0IGRlZmluaXRpb24gLSBSZWFkL3dyaXRlICovCisjZGVmaW5lIFRYX0xPU1RfQ1JTX0VOQkwgMHgwMDQwCisjZGVmaW5lIFRYX1NRRV9FUlJPUl9FTkJMIDB4MDA4MAorI2RlZmluZSBUWF9PS19FTkJMIDB4MDEwMAorI2RlZmluZSBUWF9MQVRFX0NPTF9FTkJMIDB4MDIwMAorI2RlZmluZSBUWF9KQlJfRU5CTCAweDA0MDAKKyNkZWZpbmUgVFhfQU5ZX0NPTF9FTkJMIDB4MDgwMAorI2RlZmluZSBUWF8xNl9DT0xfRU5CTCAweDgwMDAKKworLyogUFBfVHhDTUQgLSBUcmFuc21pdCBDb21tYW5kIGJpdCBkZWZpbml0aW9uIC0gUmVhZC1vbmx5ICovCisjZGVmaW5lIFRYX1NUQVJUXzRfQllURVMgMHgwMDAwCisjZGVmaW5lIFRYX1NUQVJUXzY0X0JZVEVTIDB4MDA0MAorI2RlZmluZSBUWF9TVEFSVF8xMjhfQllURVMgMHgwMDgwCisjZGVmaW5lIFRYX1NUQVJUX0FMTF9CWVRFUyAweDAwQzAKKyNkZWZpbmUgVFhfRk9SQ0UgMHgwMTAwCisjZGVmaW5lIFRYX09ORV9DT0wgMHgwMjAwCisjZGVmaW5lIFRYX1RXT19QQVJUX0RFRkZfRElTQUJMRSAweDA0MDAKKyNkZWZpbmUgVFhfTk9fQ1JDIDB4MTAwMAorI2RlZmluZSBUWF9SVU5UIDB4MjAwMAorCisvKiBQUF9CdWZDRkcgLSBCdWZmZXIgQ29uZmlndXJhdGlvbiBJbnRlcnJ1cHQgTWFzayBiaXQgZGVmaW5pdGlvbiAtIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgR0VORVJBVEVfU1dfSU5URVJSVVBUIDB4MDA0MAorI2RlZmluZSBSWF9ETUFfRU5CTCAweDAwODAKKyNkZWZpbmUgUkVBRFlfRk9SX1RYX0VOQkwgMHgwMTAwCisjZGVmaW5lIFRYX1VOREVSUlVOX0VOQkwgMHgwMjAwCisjZGVmaW5lIFJYX01JU1NfRU5CTCAweDA0MDAKKyNkZWZpbmUgUlhfMTI4X0JZVEVfRU5CTCAweDA4MDAKKyNkZWZpbmUgVFhfQ09MX0NPVU5UX09WUkZMT1dfRU5CTCAweDEwMDAKKyNkZWZpbmUgUlhfTUlTU19DT1VOVF9PVlJGTE9XX0VOQkwgMHgyMDAwCisjZGVmaW5lIFJYX0RFU1RfTUFUQ0hfRU5CTCAweDgwMDAKKworLyogUFBfTGluZUNUTCAtIExpbmUgQ29udHJvbCBiaXQgZGVmaW5pdGlvbiAtIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgU0VSSUFMX1JYX09OIDB4MDA0MAorI2RlZmluZSBTRVJJQUxfVFhfT04gMHgwMDgwCisjZGVmaW5lIEFVSV9PTkxZIDB4MDEwMAorI2RlZmluZSBBVVRPX0FVSV8xMEJBU0VUIDB4MDIwMAorI2RlZmluZSBNT0RJRklFRF9CQUNLT0ZGIDB4MDgwMAorI2RlZmluZSBOT19BVVRPX1BPTEFSSVRZIDB4MTAwMAorI2RlZmluZSBUV09fUEFSVF9ERUZESVMgMHgyMDAwCisjZGVmaW5lIExPV19SWF9TUVVFTENIIDB4NDAwMAorCisvKiBQUF9TZWxmQ1RMIC0gU29mdHdhcmUgU2VsZiBDb250cm9sIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLworI2RlZmluZSBQT1dFUl9PTl9SRVNFVCAweDAwNDAKKyNkZWZpbmUgU1dfU1RPUCAweDAxMDAKKyNkZWZpbmUgU0xFRVBfT04gMHgwMjAwCisjZGVmaW5lIEFVVE9fV0FLRVVQIDB4MDQwMAorI2RlZmluZSBIQ0IwX0VOQkwgMHgxMDAwCisjZGVmaW5lIEhDQjFfRU5CTCAweDIwMDAKKyNkZWZpbmUgSENCMCAweDQwMDAKKyNkZWZpbmUgSENCMSAweDgwMDAKKworLyogUFBfQnVzQ1RMIC0gSVNBIEJ1cyBDb250cm9sIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLworI2RlZmluZSBSRVNFVF9SWF9ETUEgMHgwMDQwCisjZGVmaW5lIE1FTU9SWV9PTiAweDA0MDAKKyNkZWZpbmUgRE1BX0JVUlNUX01PREUgMHgwODAwCisjZGVmaW5lIElPX0NIQU5ORUxfUkVBRFlfT04gMHgxMDAwCisjZGVmaW5lIFJYX0RNQV9TSVpFXzY0SyAweDIwMDAKKyNkZWZpbmUgRU5BQkxFX0lSUSAweDgwMDAKKworLyogUFBfVGVzdENUTCAtIFRlc3QgQ29udHJvbCBiaXQgZGVmaW5pdGlvbiAtIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgTElOS19PRkYgMHgwMDgwCisjZGVmaW5lIEVOREVDX0xPT1BCQUNLIDB4MDIwMAorI2RlZmluZSBBVUlfTE9PUEJBQ0sgMHgwNDAwCisjZGVmaW5lIEJBQ0tPRkZfT0ZGIDB4MDgwMAorI2RlZmluZSBGRFhfODkwMCAweDQwMDAKKyNkZWZpbmUgRkFTVF9URVNUIDB4ODAwMAorCisvKiBQUF9SeEV2ZW50IC0gUmVjZWl2ZSBFdmVudCBCaXQgZGVmaW5pdGlvbiAtIFJlYWQtb25seSAqLworI2RlZmluZSBSWF9JQV9IQVNIRUQgMHgwMDQwCisjZGVmaW5lIFJYX0RSSUJCTEUgMHgwMDgwCisjZGVmaW5lIFJYX09LIDB4MDEwMAorI2RlZmluZSBSWF9IQVNIRUQgMHgwMjAwCisjZGVmaW5lIFJYX0lBIDB4MDQwMAorI2RlZmluZSBSWF9CUk9BRENBU1QgMHgwODAwCisjZGVmaW5lIFJYX0NSQ19FUlJPUiAweDEwMDAKKyNkZWZpbmUgUlhfUlVOVCAweDIwMDAKKyNkZWZpbmUgUlhfRVhUUkFfREFUQSAweDQwMDAKKworI2RlZmluZSBIQVNIX0lOREVYX01BU0sgMHgwRkMwMAorCisvKiBQUF9UeEV2ZW50IC0gVHJhbnNtaXQgRXZlbnQgQml0IGRlZmluaXRpb24gLSBSZWFkLW9ubHkgKi8KKyNkZWZpbmUgVFhfTE9TVF9DUlMgMHgwMDQwCisjZGVmaW5lIFRYX1NRRV9FUlJPUiAweDAwODAKKyNkZWZpbmUgVFhfT0sgMHgwMTAwCisjZGVmaW5lIFRYX0xBVEVfQ09MIDB4MDIwMAorI2RlZmluZSBUWF9KQlIgMHgwNDAwCisjZGVmaW5lIFRYXzE2X0NPTCAweDgwMDAKKyNkZWZpbmUgVFhfU0VORF9PS19CSVRTIChUWF9PS3xUWF9MT1NUX0NSUykKKyNkZWZpbmUgVFhfQ09MX0NPVU5UX01BU0sgMHg3ODAwCisKKy8qIFBQX0J1ZkV2ZW50IC0gQnVmZmVyIEV2ZW50IEJpdCBkZWZpbml0aW9uIC0gUmVhZC1vbmx5ICovCisjZGVmaW5lIFNXX0lOVEVSUlVQVCAweDAwNDAKKyNkZWZpbmUgUlhfRE1BIDB4MDA4MAorI2RlZmluZSBSRUFEWV9GT1JfVFggMHgwMTAwCisjZGVmaW5lIFRYX1VOREVSUlVOIDB4MDIwMAorI2RlZmluZSBSWF9NSVNTIDB4MDQwMAorI2RlZmluZSBSWF8xMjhfQllURSAweDA4MDAKKyNkZWZpbmUgVFhfQ09MX09WUkZMVyAweDEwMDAKKyNkZWZpbmUgUlhfTUlTU19PVlJGTFcgMHgyMDAwCisjZGVmaW5lIFJYX0RFU1RfTUFUQ0ggMHg4MDAwCisKKy8qIFBQX0xpbmVTVCAtIEV0aGVybmV0IExpbmUgU3RhdHVzIGJpdCBkZWZpbml0aW9uIC0gUmVhZC1vbmx5ICovCisjZGVmaW5lIExJTktfT0sgMHgwMDgwCisjZGVmaW5lIEFVSV9PTiAweDAxMDAKKyNkZWZpbmUgVEVOQkFTRVRfT04gMHgwMjAwCisjZGVmaW5lIFBPTEFSSVRZX09LIDB4MTAwMAorI2RlZmluZSBDUlNfT0sgMHg0MDAwCisKKy8qIFBQX1NlbGZTVCAtIENoaXAgU29mdHdhcmUgU3RhdHVzIGJpdCBkZWZpbml0aW9uICovCisjZGVmaW5lIEFDVElWRV8zM1YgMHgwMDQwCisjZGVmaW5lIElOSVRfRE9ORSAweDAwODAKKyNkZWZpbmUgU0lfQlVTWSAweDAxMDAKKyNkZWZpbmUgRUVQUk9NX1BSRVNFTlQgMHgwMjAwCisjZGVmaW5lIEVFUFJPTV9PSyAweDA0MDAKKyNkZWZpbmUgRUxfUFJFU0VOVCAweDA4MDAKKyNkZWZpbmUgRUVfU0laRV82NCAweDEwMDAKKworLyogUFBfQnVzU1QgLSBJU0EgQnVzIFN0YXR1cyBiaXQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBUWF9CSURfRVJST1IgMHgwMDgwCisjZGVmaW5lIFJFQURZX0ZPUl9UWF9OT1cgMHgwMTAwCisKKy8qIFBQX0F1dG9OZWdDVEwgLSBBdXRvIE5lZ290aWF0aW9uIENvbnRyb2wgYml0IGRlZmluaXRpb24gKi8KKyNkZWZpbmUgUkVfTkVHX05PVyAweDAwNDAKKyNkZWZpbmUgQUxMT1dfRkRYIDB4MDA4MAorI2RlZmluZSBBVVRPX05FR19FTkFCTEUgMHgwMTAwCisjZGVmaW5lIE5MUF9FTkFCTEUgMHgwMjAwCisjZGVmaW5lIEZPUkNFX0ZEWCAweDgwMDAKKyNkZWZpbmUgQVVUT19ORUdfQklUUyAoRk9SQ0VfRkRYfE5MUF9FTkFCTEV8QVVUT19ORUdfRU5BQkxFKQorI2RlZmluZSBBVVRPX05FR19NQVNLIChGT1JDRV9GRFh8TkxQX0VOQUJMRXxBVVRPX05FR19FTkFCTEV8QUxMT1dfRkRYfFJFX05FR19OT1cpCisKKy8qIFBQX0F1dG9OZWdTVCAtIEF1dG8gTmVnb3RpYXRpb24gU3RhdHVzIGJpdCBkZWZpbml0aW9uICovCisjZGVmaW5lIEFVVE9fTkVHX0JVU1kgMHgwMDgwCisjZGVmaW5lIEZMUF9MSU5LIDB4MDEwMAorI2RlZmluZSBGTFBfTElOS19HT09EIDB4MDgwMAorI2RlZmluZSBMSU5LX0ZBVUxUIDB4MTAwMAorI2RlZmluZSBIRFhfQUNUSVZFIDB4NDAwMAorI2RlZmluZSBGRFhfQUNUSVZFIDB4ODAwMAorCisvKiAgVGhlIGZvbGxvd2luZyBibG9jayBkZWZpbmVzIHRoZSBJU1EgZXZlbnQgdHlwZXMgKi8KKyNkZWZpbmUgSVNRX1JFQ0VJVkVSX0VWRU5UIDB4MDQKKyNkZWZpbmUgSVNRX1RSQU5TTUlUVEVSX0VWRU5UIDB4MDgKKyNkZWZpbmUgSVNRX0JVRkZFUl9FVkVOVCAweDBjCisjZGVmaW5lIElTUV9SWF9NSVNTX0VWRU5UIDB4MTAKKyNkZWZpbmUgSVNRX1RYX0NPTF9FVkVOVCAweDEyCisKKyNkZWZpbmUgSVNRX0VWRU5UX01BU0sgMHgwMDNGICAgLyogIElTUSBtYXNrIHRvIGZpbmQgb3V0IHR5cGUgb2YgZXZlbnQgKi8KKyNkZWZpbmUgSVNRX0hJU1QgMTYJCS8qICBzbWFsbCBoaXN0b3J5IGJ1ZmZlciAqLworI2RlZmluZSBBVVRPSU5DUkVNRU5UIDB4ODAwMAkvKiAgQml0IG1hc2sgdG8gc2V0IGJpdC0xNSBmb3IgYXV0b2luY3JlbWVudCAqLworCisjZGVmaW5lIFRYUlhCVUZTSVpFIDB4MDYwMAorI2RlZmluZSBSWERNQUJVRlNJWkUgMHg4MDAwCisjZGVmaW5lIFJYRE1BU0laRSAweDQwMDAKKyNkZWZpbmUgVFhSWF9MRU5HVEhfTUFTSyAweDA3RkYKKworLyogIHJ4IG9wdGlvbnMgYml0cyAqLworI2RlZmluZSBSQ1ZfV0lUSF9SWE9OCTEgICAgICAgLyogIFNldCBTZXJSeCBPTiAqLworI2RlZmluZSBSQ1ZfQ09VTlRTCTIgICAgICAgLyogIFVzZSBGcmFtZWNudDEgKi8KKyNkZWZpbmUgUkNWX1BPTkcJNCAgICAgICAvKiAgUG9uZyByZXNwb25kZW50ICovCisjZGVmaW5lIFJDVl9ET05HCTggICAgICAgLyogIERvbmcgb3BlcmF0aW9uICovCisjZGVmaW5lIFJDVl9QT0xMSU5HCTB4MTAJLyogIFBvbGwgUnhFdmVudCAqLworI2RlZmluZSBSQ1ZfSVNRCQkweDIwCS8qICBVc2UgSVNRLCBpbnQgKi8KKyNkZWZpbmUgUkNWX0FVVE9fRE1BCTB4MTAwCS8qICBTZXQgQXV0b1J4RE1BRSAqLworI2RlZmluZSBSQ1ZfRE1BCQkweDIwMAkvKiAgU2V0IFJ4RE1BIG9ubHkgKi8KKyNkZWZpbmUgUkNWX0RNQV9BTEwJMHg0MDAJLyogIENvcHkgYWxsIERNQSdlZCAqLworI2RlZmluZSBSQ1ZfRklYRURfREFUQQkweDgwMAkvKiAgRXZlcnkgZnJhbWUgc2FtZSAqLworI2RlZmluZSBSQ1ZfSU8JCTB4MTAwMAkvKiAgVXNlIElTQSBJTyBvbmx5ICovCisjZGVmaW5lIFJDVl9NRU1PUlkJMHgyMDAwCS8qICBVc2UgSVNBIE1lbW9yeSAqLworCisjZGVmaW5lIFJBTV9TSVpFCTB4MTAwMCAgICAgICAvKiAgVGhlIGNhcmQgaGFzIDRrIGJ5dGVzIG9yIFJBTSAqLworI2RlZmluZSBQS1RfU1RBUlQgUFBfVHhGcmFtZSAgLyogIFN0YXJ0IG9mIHBhY2tldCBSQU0gKi8KKworI2RlZmluZSBSWF9GUkFNRV9QT1JUCUNTODl4MF9QT1JUKDB4MDAwMCkKKyNkZWZpbmUgVFhfRlJBTUVfUE9SVCBSWF9GUkFNRV9QT1JUCisjZGVmaW5lIFRYX0NNRF9QT1JUCUNTODl4MF9QT1JUKDB4MDAwNCkKKyNkZWZpbmUgVFhfTk9XCQkweDAwMDAgICAgICAgLyogIFR4IHBhY2tldCBhZnRlciAgIDUgYnl0ZXMgY29waWVkICovCisjZGVmaW5lIFRYX0FGVEVSXzM4MQkweDAwNDAgICAgICAgLyogIFR4IHBhY2tldCBhZnRlciAzODEgYnl0ZXMgY29waWVkICovCisjZGVmaW5lIFRYX0FGVEVSX0FMTAkweDAwYzAgICAgICAgLyogIFR4IHBhY2tldCBhZnRlciBhbGwgYnl0ZXMgY29waWVkICovCisjZGVmaW5lIFRYX0xFTl9QT1JUCUNTODl4MF9QT1JUKDB4MDAwNikKKyNkZWZpbmUgSVNRX1BPUlQJQ1M4OXgwX1BPUlQoMHgwMDA4KQorI2RlZmluZSBBRERfUE9SVAlDUzg5eDBfUE9SVCgweDAwMEEpCisjZGVmaW5lIERBVEFfUE9SVAlDUzg5eDBfUE9SVCgweDAwMEMpCisKKyNkZWZpbmUgRUVQUk9NX1dSSVRFX0VOCQkweDAwRjAKKyNkZWZpbmUgRUVQUk9NX1dSSVRFX0RJUwkweDAwMDAKKyNkZWZpbmUgRUVQUk9NX1dSSVRFX0NNRAkweDAxMDAKKyNkZWZpbmUgRUVQUk9NX1JFQURfQ01ECQkweDAyMDAKKworLyogIFJlY2VpdmUgSGVhZGVyICovCisvKiAgRGVzY3JpcHRpb24gb2YgaGVhZGVyIG9mIGVhY2ggcGFja2V0IGluIHJlY2VpdmUgYXJlYSBvZiBtZW1vcnkgKi8KKyNkZWZpbmUgUkJVRl9FVkVOVF9MT1cJMCAgIC8qICBMb3cgYnl0ZSBvZiBSeEV2ZW50IC0gc3RhdHVzIG9mIHJlY2VpdmVkIGZyYW1lICovCisjZGVmaW5lIFJCVUZfRVZFTlRfSElHSAkxICAgLyogIEhpZ2ggYnl0ZSBvZiBSeEV2ZW50IC0gc3RhdHVzIG9mIHJlY2VpdmVkIGZyYW1lICovCisjZGVmaW5lIFJCVUZfTEVOX0xPVwkyICAgLyogIExlbmd0aCBvZiByZWNlaXZlZCBkYXRhIC0gbG93IGJ5dGUgKi8KKyNkZWZpbmUgUkJVRl9MRU5fSEkJMyAgIC8qICBMZW5ndGggb2YgcmVjZWl2ZWQgZGF0YSAtIGhpZ2ggYnl0ZSAqLworI2RlZmluZSBSQlVGX0hFQURfTEVOCTQgICAvKiAgTGVuZ3RoIG9mIHRoaXMgaGVhZGVyICovCisKKyNkZWZpbmUgQ0hJUF9SRUFEIDB4MSAgIC8qICBVc2VkIHRvIG1hcmsgc3RhdGUgb2YgdGhlIHJlcGlucyBjb2RlIChjaGlwIG9yIGRtYSkgKi8KKyNkZWZpbmUgRE1BX1JFQUQgMHgyICAgLyogIFVzZWQgdG8gbWFyayBzdGF0ZSBvZiB0aGUgcmVwaW5zIGNvZGUgKGNoaXAgb3IgZG1hKSAqLworCisvKiAgZm9yIGJpb3Mgc2NhbiAqLworLyogICovCisjaWZkZWYgQ1NERUJVRworLyogIHVzZSB0aGVzZSB2YWx1ZXMgZm9yIGRlYnVnZ2luZyBiaW9zIHNjYW4gKi8KKyNkZWZpbmUgQklPU19TVEFSVF9TRUcgMHgwMDAwMAorI2RlZmluZSBCSU9TX09GRlNFVF9JTkMgMHgwMDEwCisjZWxzZQorI2RlZmluZSBCSU9TX1NUQVJUX1NFRyAweDBjMDAwCisjZGVmaW5lIEJJT1NfT0ZGU0VUX0lOQyAweDAyMDAKKyNlbmRpZgorCisjZGVmaW5lIEJJT1NfTEFTVF9PRkZTRVQgMHgwZmMwMAorCisvKiAgQnl0ZSBvZmZzZXRzIGludG8gdGhlIEVFUFJPTSBjb25maWd1cmF0aW9uIGJ1ZmZlciAqLworI2RlZmluZSBJU0FfQ05GX09GRlNFVCAweDYKKyNkZWZpbmUgVFhfQ1RMX09GRlNFVCAoSVNBX0NORl9PRkZTRVQgKyA4KQkJCS8qICA4OTAwIGVlcHJvbSAqLworI2RlZmluZSBBVVRPX05FR19DTkZfT0ZGU0VUIChJU0FfQ05GX09GRlNFVCArIDgpCQkvKiAgODkyMCBlZXByb20gKi8KKworICAvKiAgdGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IHRoZSBiaXRzIGluIHRoZSBlZXByb20gYXJlIGdlbmVyYWxseSAgKi8KKyAgLyogIGluIHRoZSBzYW1lIHBvc2l0aW9uIGFzIHRob3NlIGluIHRoZSBhdXRvbmVnY3RsIHJlZ2lzdGVyLiAqLworICAvKiAgT2YgY291cnNlIHRoZSBJTU0gYml0IGlzIG5vdCBpbiB0aGF0IHJlZ2lzdGVyIHNvIGl0IG11c3QgYmUgICovCisgIC8qICBtYXNrZWQgb3V0ICovCisjZGVmaW5lIEVFX0ZPUkNFX0ZEWCAgMHg4MDAwCisjZGVmaW5lIEVFX05MUF9FTkFCTEUgMHgwMjAwCisjZGVmaW5lIEVFX0FVVE9fTkVHX0VOQUJMRSAweDAxMDAKKyNkZWZpbmUgRUVfQUxMT1dfRkRYIDB4MDA4MAorI2RlZmluZSBFRV9BVVRPX05FR19DTkZfTUFTSyAoRUVfRk9SQ0VfRkRYfEVFX05MUF9FTkFCTEV8RUVfQVVUT19ORUdfRU5BQkxFfEVFX0FMTE9XX0ZEWCkKKworI2RlZmluZSBJTU1fQklUIDB4MDA0MAkJLyogIGlnbm9yZSBtaXNzaW5nIG1lZGlhCSAqLworCisjZGVmaW5lIEFEQVBURVJfQ05GX09GRlNFVCAoQVVUT19ORUdfQ05GX09GRlNFVCArIDIpCisjZGVmaW5lIEFfQ05GXzEwQl9UIDB4MDAwMQorI2RlZmluZSBBX0NORl9BVUkgMHgwMDAyCisjZGVmaW5lIEFfQ05GXzEwQl8yIDB4MDAwNAorI2RlZmluZSBBX0NORl9NRURJQV9UWVBFIDB4MDA3MAorI2RlZmluZSBBX0NORl9NRURJQV9BVVRPIDB4MDA3MAorI2RlZmluZSBBX0NORl9NRURJQV8xMEJfVCAweDAwMjAKKyNkZWZpbmUgQV9DTkZfTUVESUFfQVVJIDB4MDA0MAorI2RlZmluZSBBX0NORl9NRURJQV8xMEJfMiAweDAwMTAKKyNkZWZpbmUgQV9DTkZfRENfRENfUE9MQVJJVFkgMHgwMDgwCisjZGVmaW5lIEFfQ05GX05PX0FVVE9fUE9MQVJJVFkgMHgyMDAwCisjZGVmaW5lIEFfQ05GX0xPV19SWF9TUVVFTENIIDB4NDAwMAorI2RlZmluZSBBX0NORl9FWFRORF8xMEJfMiAweDgwMDAKKworI2RlZmluZSBQQUNLRVRfUEFHRV9PRkZTRVQgMHg4CisKKy8qICBCaXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBJU0EgY29uZmlndXJhdGlvbiB3b3JkIGZyb20gdGhlIEVFUFJPTSAqLworI2RlZmluZSBJTlRfTk9fTUFTSyAweDAwMEYKKyNkZWZpbmUgRE1BX05PX01BU0sgMHgwMDcwCisjZGVmaW5lIElTQV9ETUFfU0laRSAweDAyMDAKKyNkZWZpbmUgSVNBX0FVVE9fUnhETUEgMHgwNDAwCisjZGVmaW5lIElTQV9SeERNQSAweDA4MDAKKyNkZWZpbmUgRE1BX0JVUlNUIDB4MTAwMAorI2RlZmluZSBTVFJFQU1fVFJBTlNGRVIgMHgyMDAwCisjZGVmaW5lIEFOWV9JU0FfRE1BIChJU0FfQVVUT19SeERNQSB8IElTQV9SeERNQSkKKworLyogIERNQSBjb250cm9sbGVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBETUFfQkFTRSAweDAwICAgICAvKiAgRE1BIGNvbnRyb2xsZXIgYmFzZSAqLworI2RlZmluZSBETUFfQkFTRV8yIDB4MEMwICAgIC8qICBETUEgY29udHJvbGxlciBiYXNlICovCisKKyNkZWZpbmUgRE1BX1NUQVQgMHgwRDAgICAgLyogIERNQSBjb250cm9sbGVyIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBETUFfTUFTSyAweDBENCAgICAvKiAgRE1BIGNvbnRyb2xsZXIgbWFzayByZWdpc3RlciAqLworI2RlZmluZSBETUFfTU9ERSAweDBENiAgICAvKiAgRE1BIGNvbnRyb2xsZXIgbW9kZSByZWdpc3RlciAqLworI2RlZmluZSBETUFfUkVTRVRGRiAweDBEOCAgICAvKiAgRE1BIGNvbnRyb2xsZXIgZmlyc3QvbGFzdCBmbGlwIGZsb3AgKi8KKworLyogIERNQSBkYXRhICovCisjZGVmaW5lIERNQV9ESVNBQkxFIDB4MDQgICAgIC8qICBEaXNhYmxlIGNoYW5uZWwgbiAqLworI2RlZmluZSBETUFfRU5BQkxFIDB4MDAgICAgIC8qICBFbmFibGUgY2hhbm5lbCBuICovCisvKiAgRGVtYW5kIHRyYW5zZmVycywgaW5jci4gYWRkcmVzcywgYXV0byBpbml0LCB3cml0ZXMsIGNoLiBuICovCisjZGVmaW5lIERNQV9SWF9NT0RFIDB4MTQKKy8qICBEZW1hbmQgdHJhbnNmZXJzLCBpbmNyLiBhZGRyZXNzLCBhdXRvIGluaXQsIHJlYWRzLCBjaC4gbiAqLworI2RlZmluZSBETUFfVFhfTU9ERSAweDE4CisKKyNkZWZpbmUgRE1BX1NJWkUgKDE2KjEwMjQpIC8qICBTaXplIG9mIGRtYSBidWZmZXIgLSAxNmsgKi8KKworI2RlZmluZSBDUzg5MDAgMHgwMDAwCisjZGVmaW5lIENTODkyMCAweDQwMDAgICAKKyNkZWZpbmUgQ1M4OTIwTSAweDYwMDAgICAKKyNkZWZpbmUgUkVWSVNPTl9CSVRTIDB4MUYwMAorI2RlZmluZSBFRVZFUl9OVU1CRVIgMHgxMgorI2RlZmluZSBDSEtTVU1fTEVOIDB4MTQKKyNkZWZpbmUgQ0hLU1VNX1ZBTCAweDAwMDAKKyNkZWZpbmUgU1RBUlRfRUVQUk9NX0RBVEEgMHgwMDFjIC8qICBPZmZzZXQgaW50byBlZXByb20gZm9yIHN0YXJ0IG9mIGRhdGEgKi8KKyNkZWZpbmUgSVJRX01BUF9FRVBST01fREFUQSAweDAwNDYgLyogIE9mZnNldCBpbnRvIGVlcHJvbSBmb3IgdGhlIElSUSBtYXAgKi8KKyNkZWZpbmUgSVJRX01BUF9MRU4gMHgwMDA0IC8qICBObyBvZiBieXRlcyB0byByZWFkIGZvciB0aGUgSVJRIG1hcCAqLworI2RlZmluZSBQTlBfSVJRX0ZSTVQgMHgwMDIyIC8qICBQTlAgc21hbGwgaXRlbSBJUlEgZm9ybWF0ICovCisjaWZkZWYgQ09ORklHX1NIX0hJQ09TSDQKKyNkZWZpbmUgQ1M4OTAwX0lSUV9NQVAgMHgwMDAyIC8qIEhpQ08tU0g0IGJvYXJkIGhhcyBpdHMgSVJRIG9uICMxICovCisjZWxzZQorI2RlZmluZSBDUzg5MDBfSVJRX01BUCAweDFjMjAgLyogIFRoaXMgSVJRIG1hcCBpcyBmaXhlZCAqLworI2VuZGlmCisKKyNkZWZpbmUgQ1M4OTIwX05PX0lOVFMgMHgwRiAgIC8qICBNYXggQ1M4OTIwIGludGVycnVwdCBzZWxlY3QgIyAqLworCisjZGVmaW5lIFBOUF9BRERfUE9SVCAweDAyNzkKKyNkZWZpbmUgUE5QX1dSSVRFX1BPUlQgMHgwQTc5CisKKyNkZWZpbmUgR0VUX1BOUF9JU0FfU1RSVUNUIDB4NDAKKyNkZWZpbmUgUE5QX0lTQV9TVFJVQ1RfTEVOIDB4MDYKKyNkZWZpbmUgUE5QX0NTTl9DTlRfT0ZGIDB4MDEKKyNkZWZpbmUgUE5QX1JEX1BPUlRfT0ZGIDB4MDIKKyNkZWZpbmUgUE5QX0ZVTkNUSU9OX09LIDB4MDAKKyNkZWZpbmUgUE5QX1dBS0UgMHgwMworI2RlZmluZSBQTlBfUlNSQ19EQVRBIDB4MDQKKyNkZWZpbmUgUE5QX1JTUkNfUkVBRFkgMHgwMQorI2RlZmluZSBQTlBfU1RBVFVTIDB4MDUKKyNkZWZpbmUgUE5QX0FDVElWQVRFIDB4MzAKKyNkZWZpbmUgUE5QX0NORl9JT19IIDB4NjAKKyNkZWZpbmUgUE5QX0NORl9JT19MIDB4NjEKKyNkZWZpbmUgUE5QX0NORl9JTlQgMHg3MAorI2RlZmluZSBQTlBfQ05GX0RNQSAweDc0CisjZGVmaW5lIFBOUF9DTkZfTUVNIDB4NDgKKworI2RlZmluZSBCSVQwIDEKKyNkZWZpbmUgQklUMTUgMHg4MDAwCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlNjAwLmMgYi9kcml2ZXJzL25ldC9kZTYwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YTEwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kZTYwMC5jCkBAIC0wLDAgKzEsNTYxIEBACitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPSAiZGU2MDAuYzogJFJldmlzaW9uOiAxLjQxLTIuNSAkLCAgQmpvcm4gRWt3YWxsIChiajBybkBibG94LnNlKVxuIjsKKy8qCisgKglkZTYwMC5jCisgKgorICoJTGludXggZHJpdmVyIGZvciB0aGUgRC1MaW5rIERFLTYwMCBFdGhlcm5ldCBwb2NrZXQgYWRhcHRlci4KKyAqCisgKglQb3J0aW9ucyAoQykgQ29weXJpZ2h0IDE5OTMsIDE5OTQgYnkgQmpvcm4gRWt3YWxsCisgKglUaGUgQXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJqMHJuQGJsb3guc2UKKyAqCisgKglCYXNlZCBvbiBhZGFwdGVyIGluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gREU2MDAuQVNNIGJ5IEQtTGluayBJbmMuLAorICoJYXMgaW5jbHVkZWQgb24gZGlzayBDIGluIHRoZSB2LjIuMTEgb2YgUEMvVENQIGZyb20gRlRQIFNvZnR3YXJlLgorICoJRm9yIERFNjAwLmFzbToKKyAqCQlQb3J0aW9ucyAoQykgQ29weXJpZ2h0IDE5OTAgRC1MaW5rLCBJbmMuCisgKgkJQ29weXJpZ2h0LCAxOTg4LTE5OTIsIFJ1c3NlbGwgTmVsc29uLCBDcnlud3IgU29mdHdhcmUKKyAqCisgKglBZGFwdGVkIHRvIHRoZSBzYW1wbGUgbmV0d29yayBkcml2ZXIgY29yZSBmb3IgbGludXgsCisgKgl3cml0dGVuIGJ5OiBEb25hbGQgQmVja2VyIDxiZWNrZXJAc3VwZXIub3JnPgorICoJCShOb3cgYXQgPGJlY2tlckBzY3lsZC5jb20+KQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqCWFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFkZCBtb3JlIHRpbWUgaGVyZSBpZiB5b3VyIGFkYXB0ZXIgd29uJ3Qgd29yayBPSzogKi8KKyNkZWZpbmUgREU2MDBfU0xPV19ET1dOCXVkZWxheShkZWxheV90aW1lKQorCisgLyoKKyAqIElmIHlvdSBzdGlsbCBoYXZlIHRyb3VibGUgcmVhZGluZy93cml0aW5nIHRvIHRoZSBhZGFwdGVyLAorICogbW9kaWZ5IHRoZSBmb2xsb3dpbmcgIiNkZWZpbmUiOiAoc2VlIDxhc20vaW8uaD4gZm9yIG1vcmUgaW5mbykKKyNkZWZpbmUgUkVBTExZX1NMT1dfSU8KKyAqLworI2RlZmluZSBTTE9XX0lPX0JZX0pVTVBJTkcgLyogTG9va3MgImJldHRlciIgdGhhbiBkdW1teSB3cml0ZSB0byBwb3J0IDB4ODAgOi0pICovCisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLworI2lmZGVmIERFNjAwX0RFQlVHCisjZGVmaW5lIFBSSU5USyh4KSBpZiAoZGU2MDBfZGVidWcgPj0gMikgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIERFNjAwX0RFQlVHIDAKKyNkZWZpbmUgUFJJTlRLKHgpIC8qKi8KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgImRlNjAwLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGU2MDBfZGVidWcgPSBERTYwMF9ERUJVRzsKK21vZHVsZV9wYXJhbShkZTYwMF9kZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGU2MDBfZGVidWcsICJERS02MDAgZGVidWcgbGV2ZWwgKDAtMikiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBjaGVja19sb3N0ID0gMTsKK21vZHVsZV9wYXJhbShjaGVja19sb3N0LCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY2hlY2tfbG9zdCwgIklmIHNldCB0aGVuIGNoZWNrIGZvciB1bnBsdWdnZWQgZGU2MDAiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBkZWxheV90aW1lID0gMTA7Cittb2R1bGVfcGFyYW0oZGVsYXlfdGltZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVsYXlfdGltZSwgIkRFLTYwMCBkZWxleSBvbiBJL08gaW4gbWljcm9zZWNvbmRzIik7CisKKworLyoKKyAqIEQtTGluayBkcml2ZXIgdmFyaWFibGVzOgorICovCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQJCXJ4X3BhZ2U7CisKKyNkZWZpbmUgVFhfUEFHRVMgMgorc3RhdGljIHZvbGF0aWxlIGludAkJdHhfZmlmb1tUWF9QQUdFU107CitzdGF0aWMgdm9sYXRpbGUgaW50CQl0eF9maWZvX2luOworc3RhdGljIHZvbGF0aWxlIGludAkJdHhfZmlmb19vdXQ7CitzdGF0aWMgdm9sYXRpbGUgaW50CQlmcmVlX3R4X3BhZ2VzID0gVFhfUEFHRVM7CitzdGF0aWMgaW50CQkJd2FzX2Rvd247CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRlNjAwX2xvY2spOworCitzdGF0aWMgaW5saW5lIHU4IGRlNjAwX3JlYWRfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggc3RhdHVzOworCisJb3V0Yl9wKFNUQVRVUywgREFUQV9QT1JUKTsKKwlzdGF0dXMgPSBpbmIoU1RBVFVTX1BPUlQpOworCW91dGJfcChOVUxMX0NPTU1BTkQgfCBISV9OSUJCTEUsIERBVEFfUE9SVCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW5saW5lIHU4IGRlNjAwX3JlYWRfYnl0ZSh1bnNpZ25lZCBjaGFyIHR5cGUsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogZGV2IHVzZWQgYnkgbWFjcm9zICovCisJdTggbG87CisJb3V0Yl9wKCh0eXBlKSwgREFUQV9QT1JUKTsKKwlsbyA9ICgodW5zaWduZWQgY2hhcilpbmIoU1RBVFVTX1BPUlQpKSA+PiA0OworCW91dGJfcCgodHlwZSkgfCBISV9OSUJCTEUsIERBVEFfUE9SVCk7CisJcmV0dXJuICgodW5zaWduZWQgY2hhcilpbmIoU1RBVFVTX1BPUlQpICYgKHVuc2lnbmVkIGNoYXIpMHhmMCkgfCBsbzsKK30KKworLyoKKyAqIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuICBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICogYWZ0ZXIgYm9vdGluZyB3aGVuICdpZmNvbmZpZyA8ZGV2LT5uYW1lPiAkSVBfQUREUicgaXMgcnVuIChpbiByYy5pbmV0MSkuCisgKgorICogVGhpcyByb3V0aW5lIHNob3VsZCBzZXQgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgorICogcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKKyAqIHRoZXJlIGlzIGEgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworCitzdGF0aWMgaW50IGRlNjAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSByZXF1ZXN0X2lycShERTYwMF9JUlEsIGRlNjAwX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBJUlEgJWRcbiIsIGRldi0+bmFtZSwgREU2MDBfSVJRKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlNjAwX2xvY2ssIGZsYWdzKTsKKwlyZXQgPSBhZGFwdGVyX2luaXQoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZTYwMF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gZGU2MDBfb3BlbigpLgorICovCisKK3N0YXRpYyBpbnQgZGU2MDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzZWxlY3RfbmljKCk7CisJcnhfcGFnZSA9IDA7CisJZGU2MDBfcHV0X2NvbW1hbmQoUkVTRVQpOworCWRlNjAwX3B1dF9jb21tYW5kKFNUT1BfUkVTRVQpOworCWRlNjAwX3B1dF9jb21tYW5kKDApOworCXNlbGVjdF9wcm4oKTsKKwlmcmVlX2lycShERTYwMF9JUlEsIGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKShkZXYtPnByaXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHJpZ2dlcl9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkZTYwMF9wdXRfY29tbWFuZChGTElQX0lSUSk7CisJc2VsZWN0X3BybigpOworCURFNjAwX1NMT1dfRE9XTjsKKwlzZWxlY3RfbmljKCk7CisJZGU2MDBfcHV0X2NvbW1hbmQoMCk7Cit9CisKKy8qCisgKiBDb3B5IGEgYnVmZmVyIHRvIHRoZSBhZGFwdGVyIHRyYW5zbWl0IHBhZ2UgbWVtb3J5LgorICogU3RhcnQgc2VuZGluZy4KKyAqLworIAorc3RhdGljIGludCBkZTYwMF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQJdHJhbnNtaXRfZnJvbTsKKwlpbnQJbGVuOworCWludAl0aWNrc3NvZmFyOworCXU4CSpidWZmZXIgPSBza2ItPmRhdGE7CisJaW50CWk7CisKKwlpZiAoZnJlZV90eF9wYWdlcyA8PSAwKSB7CS8qIERvIHRpbWVvdXRzLCB0byBhdm9pZCBoYW5ncy4gKi8KKwkJdGlja3Nzb2ZhciA9IGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0OworCQlpZiAodGlja3Nzb2ZhciA8IDUpCisJCQlyZXR1cm4gMTsKKwkJLyogZWxzZSAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0ICglZCksICVzP1xuIiwgZGV2LT5uYW1lLCB0aWNrc3NvZmFyLCAibmV0d29yayBjYWJsZSBwcm9ibGVtIik7CisJCS8qIFJlc3RhcnQgdGhlIGFkYXB0ZXIuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZTYwMF9sb2NrLCBmbGFncyk7CisJCWlmIChhZGFwdGVyX2luaXQoZGV2KSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGU2MDBfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGU2MDBfbG9jaywgZmxhZ3MpOworCX0KKworCS8qIFN0YXJ0IHJlYWwgb3V0cHV0ICovCisJUFJJTlRLKCgiZGU2MDBfc3RhcnRfeG1pdDpsZW49JWQsIHBhZ2UgJWQvJWRcbiIsIHNrYi0+bGVuLCB0eF9maWZvX2luLCBmcmVlX3R4X3BhZ2VzKSk7CisKKwlpZiAoKGxlbiA9IHNrYi0+bGVuKSA8IFJVTlQpCisJCWxlbiA9IFJVTlQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGU2MDBfbG9jaywgZmxhZ3MpOworCXNlbGVjdF9uaWMoKTsKKwl0eF9maWZvW3R4X2ZpZm9faW5dID0gdHJhbnNtaXRfZnJvbSA9IHR4X3BhZ2VfYWRyKHR4X2ZpZm9faW4pIC0gbGVuOworCXR4X2ZpZm9faW4gPSAodHhfZmlmb19pbiArIDEpICUgVFhfUEFHRVM7IC8qIE5leHQgZnJlZSB0eCBwYWdlICovCisKKwlpZihjaGVja19sb3N0KQorCXsKKwkJLyogVGhpcyBjb3N0cyBhYm91dCA0MCBpbnN0cnVjdGlvbnMgcGVyIHBhY2tldC4uLiAqLworCQlkZTYwMF9zZXR1cF9hZGRyZXNzKE5PREVfQUREUkVTUywgUldfQUREUik7CisJCWRlNjAwX3JlYWRfYnl0ZShSRUFEX0RBVEEsIGRldik7CisJCWlmICh3YXNfZG93biB8fCAoZGU2MDBfcmVhZF9ieXRlKFJFQURfREFUQSwgZGV2KSAhPSAweGRlKSkgeworCQkJaWYgKGFkYXB0ZXJfaW5pdChkZXYpKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGU2MDBfbG9jaywgZmxhZ3MpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCisJZGU2MDBfc2V0dXBfYWRkcmVzcyh0cmFuc21pdF9mcm9tLCBSV19BRERSKTsKKwlmb3IgKGkgPSAwOyAgaSA8IHNrYi0+bGVuIDsgKytpLCArK2J1ZmZlcikKKwkJZGU2MDBfcHV0X2J5dGUoKmJ1ZmZlcik7CisJZm9yICg7IGkgPCBsZW47ICsraSkKKwkJZGU2MDBfcHV0X2J5dGUoMCk7CisKKwlpZiAoZnJlZV90eF9wYWdlcy0tID09IFRYX1BBR0VTKSB7IC8qIE5vIHRyYW5zbWlzc2lvbiBnb2luZyBvbiAqLworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsgLyogYWxsb3cgbW9yZSBwYWNrZXRzIGludG8gYWRhcHRlciAqLworCQkvKiBTZW5kIHBhZ2UgYW5kIGdlbmVyYXRlIGEgZmFrZWQgaW50ZXJydXB0ICovCisJCWRlNjAwX3NldHVwX2FkZHJlc3ModHJhbnNtaXRfZnJvbSwgVFhfQUREUik7CisJCWRlNjAwX3B1dF9jb21tYW5kKFRYX0VOQUJMRSk7CisJfQorCWVsc2UgeworCQlpZiAoZnJlZV90eF9wYWdlcykKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCWVsc2UKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc2VsZWN0X3BybigpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZTYwMF9sb2NrLCBmbGFncyk7CisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisvKgorICogVGhlIHR5cGljYWwgd29ya2xvYWQgb2YgdGhlIGRyaXZlcjoKKyAqIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgZGU2MDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXYgPSBkZXZfaWQ7CisJdTgJCWlycV9zdGF0dXM7CisJaW50CQlyZXRyaWcgPSAwOworCWludAkJYm9ndXNjb3VudCA9IDA7CisKKwkvKiBUaGlzIG1pZ2h0IGp1c3QgYXMgd2VsbCBiZSBkZWxldGVkIG5vdywgbm8gY3J1bW15IGRyaXZlcnMgcHJlc2VudCA6LSkgKi8KKwlpZiAoKGRldiA9PSBOVUxMKSB8fCAoREU2MDBfSVJRICE9IGlycSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYm9ndXMgaW50ZXJydXB0ICVkXG4iLCBkZXY/ZGV2LT5uYW1lOiJERS02MDAiLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJc3Bpbl9sb2NrKCZkZTYwMF9sb2NrKTsKKwkKKwlzZWxlY3RfbmljKCk7CisJaXJxX3N0YXR1cyA9IGRlNjAwX3JlYWRfc3RhdHVzKGRldik7CisKKwlkbyB7CisJCVBSSU5USygoImRlNjAwX2ludGVycnVwdCAoJTAyWClcbiIsIGlycV9zdGF0dXMpKTsKKworCQlpZiAoaXJxX3N0YXR1cyAmIFJYX0dPT0QpCisJCQlkZTYwMF9yeF9pbnRyKGRldik7CisJCWVsc2UgaWYgKCEoaXJxX3N0YXR1cyAmIFJYX0JVU1kpKQorCQkJZGU2MDBfcHV0X2NvbW1hbmQoUlhfRU5BQkxFKTsKKworCQkvKiBBbnkgdHJhbnNtaXNzaW9uIGluIHByb2dyZXNzPyAqLworCQlpZiAoZnJlZV90eF9wYWdlcyA8IFRYX1BBR0VTKQorCQkJcmV0cmlnID0gZGU2MDBfdHhfaW50cihkZXYsIGlycV9zdGF0dXMpOworCQllbHNlCisJCQlyZXRyaWcgPSAwOworCisJCWlycV9zdGF0dXMgPSBkZTYwMF9yZWFkX3N0YXR1cyhkZXYpOworCX0gd2hpbGUgKCAoaXJxX3N0YXR1cyAmIFJYX0dPT0QpIHx8ICgoKytib2d1c2NvdW50IDwgMTAwKSAmJiByZXRyaWcpICk7CisJLyoKKwkgKiBZZWFoLCBpdCBfbG9va3NfIGxpa2UgYnVzeSB3YWl0aW5nLCBzbWVsbHMgbGlrZSBidXN5IHdhaXRpbmcKKwkgKiBhbmQgSSBrbm93IGl0J3Mgbm90IFBDLCBidXQgcGxlYXNlLCBpdCB3aWxsIG9ubHkgb2NjdXIgb25jZQorCSAqIGluIGEgd2hpbGUgYW5kIHRoZW4gb25seSBmb3IgYSBsb29wIG9yIHNvICg8IDFtcyBmb3Igc3VyZSEpCisJICovCisKKwkvKiBFbmFibGUgYWRhcHRlciBpbnRlcnJ1cHRzICovCisJc2VsZWN0X3BybigpOworCWlmIChyZXRyaWcpCisJCXRyaWdnZXJfaW50ZXJydXB0KGRldik7CisJc3Bpbl91bmxvY2soJmRlNjAwX2xvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBkZTYwMF90eF9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpcnFfc3RhdHVzKQoreworCS8qCisJICogUmV0dXJucyAxIGlmIHR4IHN0aWxsIG5vdCBkb25lCisJICovCisKKwkvKiBDaGVjayBpZiBjdXJyZW50IHRyYW5zbWlzc2lvbiBpcyBkb25lIHlldCAqLworCWlmIChpcnFfc3RhdHVzICYgVFhfQlVTWSkKKwkJcmV0dXJuIDE7IC8qIHR4IG5vdCBkb25lLCB0cnkgYWdhaW4gKi8KKworCS8qIGVsc2UgKi8KKwkvKiBJZiBsYXN0IHRyYW5zbWlzc2lvbiBPSyB0aGVuIGJ1bXAgZmlmbyBpbmRleCAqLworCWlmICghKGlycV9zdGF0dXMgJiBUWF9GQUlMRUQxNikpIHsKKwkJdHhfZmlmb19vdXQgPSAodHhfZmlmb19vdXQgKyAxKSAlIFRYX1BBR0VTOworCQkrK2ZyZWVfdHhfcGFnZXM7CisJCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikoZGV2LT5wcml2KSktPnR4X3BhY2tldHMrKzsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworCS8qIE1vcmUgdG8gc2VuZCwgb3IgcmVzZW5kIGxhc3QgcGFja2V0PyAqLworCWlmICgoZnJlZV90eF9wYWdlcyA8IFRYX1BBR0VTKSB8fCAoaXJxX3N0YXR1cyAmIFRYX0ZBSUxFRDE2KSkgeworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJZGU2MDBfc2V0dXBfYWRkcmVzcyh0eF9maWZvW3R4X2ZpZm9fb3V0XSwgVFhfQUREUik7CisJCWRlNjAwX3B1dF9jb21tYW5kKFRYX0VOQUJMRSk7CisJCXJldHVybiAxOworCX0KKwkvKiBlbHNlICovCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlIGhhdmUgYSBnb29kIHBhY2tldCwgZ2V0IGl0IG91dCBvZiB0aGUgYWRhcHRlci4KKyAqLworc3RhdGljIHZvaWQgZGU2MDBfcnhfaW50cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBza19idWZmCSpza2I7CisJaW50CQlpOworCWludAkJcmVhZF9mcm9tOworCWludAkJc2l6ZTsKKwl1bnNpZ25lZCBjaGFyCSpidWZmZXI7CisKKwkvKiBHZXQgc2l6ZSBvZiByZWNlaXZlZCBwYWNrZXQgKi8KKwlzaXplID0gZGU2MDBfcmVhZF9ieXRlKFJYX0xFTiwgZGV2KTsJLyogbG93IGJ5dGUgKi8KKwlzaXplICs9IChkZTYwMF9yZWFkX2J5dGUoUlhfTEVOLCBkZXYpIDw8IDgpOwkvKiBoaWdoIGJ5dGUgKi8KKwlzaXplIC09IDQ7CS8qIElnbm9yZSB0cmFpbGluZyA0IENSQy1ieXRlcyAqLworCisJLyogVGVsbCBhZGFwdGVyIHdoZXJlIHRvIHN0b3JlIG5leHQgaW5jb21pbmcgcGFja2V0LCBlbmFibGUgcmVjZWl2ZXIgKi8KKwlyZWFkX2Zyb20gPSByeF9wYWdlX2FkcigpOworCW5leHRfcnhfcGFnZSgpOworCWRlNjAwX3B1dF9jb21tYW5kKFJYX0VOQUJMRSk7CisKKwlpZiAoKHNpemUgPCAzMikgIHx8ICAoc2l6ZSA+IDE1MzUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCb2d1cyBwYWNrZXQgc2l6ZSAlZC5cbiIsIGRldi0+bmFtZSwgc2l6ZSk7CisJCWlmIChzaXplID4gMTAwMDApCisJCQlhZGFwdGVyX2luaXQoZGV2KTsKKwkJcmV0dXJuOworCX0KKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSsyKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlczogQ291bGRuJ3QgYWxsb2NhdGUgYSBza19idWZmIG9mIHNpemUgJWQuXG4iLCBkZXYtPm5hbWUsIHNpemUpOworCQlyZXR1cm47CisJfQorCS8qIGVsc2UgKi8KKworCXNrYi0+ZGV2ID0gZGV2OworCXNrYl9yZXNlcnZlKHNrYiwyKTsJLyogQWxpZ24gKi8KKworCS8qICdza2ItPmRhdGEnIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEuICovCisJYnVmZmVyID0gc2tiX3B1dChza2Isc2l6ZSk7CisKKwkvKiBjb3B5IHRoZSBwYWNrZXQgaW50byB0aGUgYnVmZmVyICovCisJZGU2MDBfc2V0dXBfYWRkcmVzcyhyZWFkX2Zyb20sIFJXX0FERFIpOworCWZvciAoaSA9IHNpemU7IGkgPiAwOyAtLWksICsrYnVmZmVyKQorCQkqYnVmZmVyID0gZGU2MDBfcmVhZF9ieXRlKFJFQURfREFUQSwgZGV2KTsKKworCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisKKwluZXRpZl9yeChza2IpOworCisJLyogdXBkYXRlIHN0YXRzICovCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopKGRldi0+cHJpdikpLT5yeF9wYWNrZXRzKys7IC8qIGNvdW50IGFsbCByZWNlaXZlcyAqLworCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikoZGV2LT5wcml2KSktPnJ4X2J5dGVzICs9IHNpemU7IC8qIGNvdW50IGFsbCByZWNlaXZlZCBieXRlcyAqLworCisJLyoKKwkgKiBJZiBhbnkgd29ydGgtd2hpbGUgcGFja2V0cyBoYXZlIGJlZW4gcmVjZWl2ZWQsIG5ldGlmX3J4KCkKKwkgKiB3aWxsIHdvcmsgb24gdGhlbSB3aGVuIHdlIGdldCB0byB0aGUgdGFza2xldHMuCisJICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBkZTYwMF9wcm9iZSh2b2lkKQoreworCWludAlpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVycjsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oREU2MDBfSU8sIDMsICJkZTYwMCIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRFNjAwOiBwb3J0IDB4JXggYnVzeVxuIiwgREU2MDBfSU8pOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBELUxpbmsgREUtNjAwIHBvY2tldCBhZGFwdGVyIiwgZGV2LT5uYW1lKTsKKwkvKiBBbHBoYSB0ZXN0ZXJzIG11c3QgaGF2ZSB0aGUgdmVyc2lvbiBudW1iZXIgdG8gcmVwb3J0IGJ1Z3MuICovCisJaWYgKGRlNjAwX2RlYnVnID4gMSkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJLyogcHJvYmUgZm9yIGFkYXB0ZXIgKi8KKwllcnIgPSAtRU5PREVWOworCXJ4X3BhZ2UgPSAwOworCXNlbGVjdF9uaWMoKTsKKwkodm9pZClkZTYwMF9yZWFkX3N0YXR1cyhkZXYpOworCWRlNjAwX3B1dF9jb21tYW5kKFJFU0VUKTsKKwlkZTYwMF9wdXRfY29tbWFuZChTVE9QX1JFU0VUKTsKKwlpZiAoZGU2MDBfcmVhZF9zdGF0dXMoZGV2KSAmIDB4ZjApIHsKKwkJcHJpbnRrKCI6IG5vdCBhdCBJL08gJSMzeC5cbiIsIERBVEFfUE9SVCk7CisJCWdvdG8gb3V0MTsKKwl9CisKKwkvKgorCSAqIE1heWJlIHdlIGZvdW5kIG9uZSwKKwkgKiBoYXZlIHRvIGNoZWNrIGlmIGl0IGlzIGEgRC1MaW5rIERFLTYwMCBhZGFwdGVyLi4uCisJICovCisKKwkvKiBHZXQgdGhlIGFkYXB0ZXIgZXRoZXJuZXQgYWRkcmVzcyBmcm9tIHRoZSBST00gKi8KKwlkZTYwMF9zZXR1cF9hZGRyZXNzKE5PREVfQUREUkVTUywgUldfQUREUik7CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGRlNjAwX3JlYWRfYnl0ZShSRUFEX0RBVEEsIGRldik7CisJCWRldi0+YnJvYWRjYXN0W2ldID0gMHhmZjsKKwl9CisKKwkvKiBDaGVjayBtYWdpYyBjb2RlICovCisJaWYgKChkZXYtPmRldl9hZGRyWzFdID09IDB4ZGUpICYmIChkZXYtPmRldl9hZGRyWzJdID09IDB4MTUpKSB7CisJCS8qIE9LLCBpbnN0YWxsIHJlYWwgYWRkcmVzcyAqLworCQlkZXYtPmRldl9hZGRyWzBdID0gMHgwMDsKKwkJZGV2LT5kZXZfYWRkclsxXSA9IDB4ODA7CisJCWRldi0+ZGV2X2FkZHJbMl0gPSAweGM4OworCQlkZXYtPmRldl9hZGRyWzNdICY9IDB4MGY7CisJCWRldi0+ZGV2X2FkZHJbM10gfD0gMHg3MDsKKwl9IGVsc2UgeworCQlwcmludGsoIiBub3QgaWRlbnRpZmllZCBpbiB0aGUgcHJpbnRlciBwb3J0XG4iKTsKKwkJZ290byBvdXQxOworCX0KKworCXByaW50aygiLCBFdGhlcm5ldCBBZGRyZXNzOiAlMDJYIiwgZGV2LT5kZXZfYWRkclswXSk7CisJZm9yIChpID0gMTsgaSA8IEVUSF9BTEVOOyBpKyspCisJCXByaW50aygiOiUwMlgiLGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiXG4iKTsKKworCWRldi0+Z2V0X3N0YXRzID0gZ2V0X3N0YXRzOworCisJZGV2LT5vcGVuID0gZGU2MDBfb3BlbjsKKwlkZXYtPnN0b3AgPSBkZTYwMF9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZkZTYwMF9zdGFydF94bWl0OworCisJZGV2LT5mbGFncyY9fklGRl9NVUxUSUNBU1Q7CisKKwlzZWxlY3RfcHJuKCk7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisKKwlyZXR1cm4gZGV2OworCitvdXQxOgorCXJlbGVhc2VfcmVnaW9uKERFNjAwX0lPLCAzKTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbnQgYWRhcHRlcl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50CWk7CisKKwlzZWxlY3RfbmljKCk7CisJcnhfcGFnZSA9IDA7IC8qIHVzZWQgYnkgUkVTRVQgKi8KKwlkZTYwMF9wdXRfY29tbWFuZChSRVNFVCk7CisJZGU2MDBfcHV0X2NvbW1hbmQoU1RPUF9SRVNFVCk7CisKKwkvKiBDaGVjayBpZiBpdCBpcyBzdGlsbCB0aGVyZS4uLiAqLworCS8qIEdldCB0aGUgc29tZSBieXRlcyBvZiB0aGUgYWRhcHRlciBldGhlcm5ldCBhZGRyZXNzIGZyb20gdGhlIFJPTSAqLworCWRlNjAwX3NldHVwX2FkZHJlc3MoTk9ERV9BRERSRVNTLCBSV19BRERSKTsKKwlkZTYwMF9yZWFkX2J5dGUoUkVBRF9EQVRBLCBkZXYpOworCWlmICgoZGU2MDBfcmVhZF9ieXRlKFJFQURfREFUQSwgZGV2KSAhPSAweGRlKSB8fAorCSAgICAoZGU2MDBfcmVhZF9ieXRlKFJFQURfREFUQSwgZGV2KSAhPSAweDE1KSkgeworCS8qIHdhczogaWYgKGRlNjAwX3JlYWRfc3RhdHVzKGRldikgJiAweGYwKSB7ICovCisJCXByaW50aygiU29tZXRoaW5nIGhhcyBoYXBwZW5lZCB0byB0aGUgREUtNjAwISAgUGxlYXNlIGNoZWNrIGl0IGFuZCBkbyBhIG5ldyBpZmNvbmZpZyFcbiIpOworCQkvKiBHb29kYnllLCBjcnVlbCB3b3JsZC4uLiAqLworCQlkZXYtPmZsYWdzICY9IH5JRkZfVVA7CisJCWRlNjAwX2Nsb3NlKGRldik7CisJCXdhc19kb3duID0gMTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOyAvKiBUcmFuc21pdCBidXN5Li4uICAqLworCQlyZXR1cm4gMTsgLyogZmFpbGVkICovCisJfQorCisJaWYgKHdhc19kb3duKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUaGFua3MsIEkgZmVlbCBtdWNoIGJldHRlciBub3chXG4iLCBkZXYtPm5hbWUpOworCQl3YXNfZG93biA9IDA7CisJfQorCisJdHhfZmlmb19pbiA9IDA7CisJdHhfZmlmb19vdXQgPSAwOworCWZyZWVfdHhfcGFnZXMgPSBUWF9QQUdFUzsKKworCisJLyogc2V0IHRoZSBldGhlciBhZGRyZXNzLiAqLworCWRlNjAwX3NldHVwX2FkZHJlc3MoTk9ERV9BRERSRVNTLCBSV19BRERSKTsKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJZGU2MDBfcHV0X2J5dGUoZGV2LT5kZXZfYWRkcltpXSk7CisKKwkvKiB3aGVyZSB0byBzdGFydCBzYXZpbmcgaW5jb21pbmcgcGFja2V0cyAqLworCXJ4X3BhZ2UgPSBSWF9CUCB8IFJYX0JBU0VfUEFHRTsKKwlkZTYwMF9zZXR1cF9hZGRyZXNzKE1FTV80SywgUldfQUREUik7CisJLyogRW5hYmxlIHJlY2VpdmVyICovCisJZGU2MDBfcHV0X2NvbW1hbmQoUlhfRU5BQkxFKTsKKwlzZWxlY3RfcHJuKCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7IC8qIE9LICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGU2MDBfZGV2OworCitzdGF0aWMgaW50IF9faW5pdCBkZTYwMF9pbml0KHZvaWQpCit7CisJZGU2MDBfZGV2ID0gZGU2MDBfcHJvYmUoKTsKKwlpZiAoSVNfRVJSKGRlNjAwX2RldikpCisJCXJldHVybiBQVFJfRVJSKGRlNjAwX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZTYwMF9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGU2MDBfZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihERTYwMF9JTywgMyk7CisJZnJlZV9uZXRkZXYoZGU2MDBfZGV2KTsKK30KKworbW9kdWxlX2luaXQoZGU2MDBfaW5pdCk7Cittb2R1bGVfZXhpdChkZTYwMF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGU2MDAuaCBiL2RyaXZlcnMvbmV0L2RlNjAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwNzMwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RlNjAwLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEZWZpbml0aW9uIG9mIEQtTGluayBFdGhlcm5ldCBQb2NrZXQgYWRhcHRlciAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEQtTGluayBFdGhlcm5ldCBwb2NrZXQgYWRhcHRlciBwb3J0cworICovCisvKgorICogT0ssIHNvIEknbSBjaGVhdGluZywgYnV0IHRoZXJlIGFyZSBhbiBhd2Z1bCBsb3Qgb2YKKyAqIHJlYWRzIGFuZCB3cml0ZXMgaW4gb3JkZXIgdG8gZ2V0IGFueXRoaW5nIGluIGFuZCBvdXQKKyAqIG9mIHRoZSBERS02MDAgd2l0aCA0IGJpdHMgYXQgYSB0aW1lIGluIHRoZSBwYXJhbGxlbCBwb3J0LAorICogc28gZXZlcnkgc2F2ZWQgaW5zdHJ1Y3Rpb24gcmVhbGx5IGhlbHBzIDotKQorICovCisKKyNpZm5kZWYgREU2MDBfSU8KKyNkZWZpbmUgREU2MDBfSU8JMHgzNzgKKyNlbmRpZgorCisjZGVmaW5lIERBVEFfUE9SVAkoREU2MDBfSU8pCisjZGVmaW5lIFNUQVRVU19QT1JUCShERTYwMF9JTyArIDEpCisjZGVmaW5lIENPTU1BTkRfUE9SVAkoREU2MDBfSU8gKyAyKQorCisjaWZuZGVmIERFNjAwX0lSUQorI2RlZmluZSBERTYwMF9JUlEJNworI2VuZGlmCisvKgorICogSXQgcmVhbGx5IHNob3VsZCBsb29rIGxpa2UgdGhpcywgYW5kIGF1dG9wcm9iaW5nIGFzIHdlbGwuLi4KKyAqCisjZGVmaW5lIERBVEFfUE9SVAkoZGV2LT5iYXNlX2FkZHIgKyAwKQorI2RlZmluZSBTVEFUVVNfUE9SVAkoZGV2LT5iYXNlX2FkZHIgKyAxKQorI2RlZmluZSBDT01NQU5EX1BPUlQJKGRldi0+YmFzZV9hZGRyICsgMikKKyNkZWZpbmUgREU2MDBfSVJRCWRldi0+aXJxCisgKi8KKworLyoKKyAqIEQtTGluayBDT01NQU5EX1BPUlQgY29tbWFuZHMKKyAqLworI2RlZmluZSBTRUxFQ1RfTklDCTB4MDQgLyogc2VsZWN0IE5ldHdvcmsgSW50ZXJmYWNlIENhcmQgKi8KKyNkZWZpbmUgU0VMRUNUX1BSTgkweDFjIC8qIHNlbGVjdCBQcmludGVyICovCisjZGVmaW5lIE5NTF9QUk4JCTB4ZWMgLyogbm9ybWFsIFByaW50ZXIgc2l0dWF0aW9uICovCisjZGVmaW5lIElSUUVOCQkweDEwIC8qIGVuYWJsZSBJUlEgbGluZSAqLworCisvKgorICogRC1MaW5rIFNUQVRVU19QT1JUCisgKi8KKyNkZWZpbmUgUlhfQlVTWQkJMHg4MAorI2RlZmluZSBSWF9HT09ECQkweDQwCisjZGVmaW5lIFRYX0ZBSUxFRDE2CTB4MTAKKyNkZWZpbmUgVFhfQlVTWQkJMHgwOAorCisvKgorICogRC1MaW5rIERBVEFfUE9SVCBjb21tYW5kcworICogY29tbWFuZCBpbiBsb3cgNCBiaXRzCisgKiBkYXRhIGluIGhpZ2ggNCBiaXRzCisgKiBzZWxlY3QgY3VycmVudCBkYXRhIG5pYmJsZSB3aXRoIEhJX05JQkJMRSBiaXQKKyAqLworI2RlZmluZSBXUklURV9EQVRBCTB4MDAgLyogd3JpdGUgbWVtb3J5ICovCisjZGVmaW5lIFJFQURfREFUQQkweDAxIC8qIHJlYWQgbWVtb3J5ICovCisjZGVmaW5lIFNUQVRVUwkJMHgwMiAvKiByZWFkICBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ09NTUFORAkJMHgwMyAvKiB3cml0ZSBjb21tYW5kIHJlZ2lzdGVyIChzZWUgQ09NTUFORCBiZWxvdykgKi8KKyNkZWZpbmUgTlVMTF9DT01NQU5ECTB4MDQgLyogbnVsbCBjb21tYW5kICovCisjZGVmaW5lIFJYX0xFTgkJMHgwNSAvKiByZWFkICByZWNlaXZlZCBwYWNrZXQgbGVuZ3RoICovCisjZGVmaW5lIFRYX0FERFIJCTB4MDYgLyogc2V0IGFkYXB0ZXIgdHJhbnNtaXQgbWVtb3J5IGFkZHJlc3MgKi8KKyNkZWZpbmUgUldfQUREUgkJMHgwNyAvKiBzZXQgYWRhcHRlciByZWFkL3dyaXRlIG1lbW9yeSBhZGRyZXNzICovCisjZGVmaW5lIEhJX05JQkJMRQkweDA4IC8qIHJlYWQvd3JpdGUgdGhlIGhpZ2ggbmliYmxlIG9mIGRhdGEsCisJCQkJb3ItZWQgd2l0aCByZXN0IG9mIGNvbW1hbmQgKi8KKworLyoKKyAqIGNvbW1hbmQgcmVnaXN0ZXIsIGFjY2Vzc2VkIHRocm91Z2ggREFUQV9QT1JUIHdpdGggbG93IGJpdHMgPSBDT01NQU5ECisgKi8KKyNkZWZpbmUgUlhfQUxMCQkweDAxIC8qIFBST01JU0NVT1VTICovCisjZGVmaW5lIFJYX0JQCQkweDAyIC8qIGRlZmF1bHQ6IEJST0FEQ0FTVCAmIFBIWVNJQ0FMIEFERFJFU1MgKi8KKyNkZWZpbmUgUlhfTUJQCQkweDAzIC8qIE1VTFRJQ0FTVCwgQlJPQURDQVNUICYgUEhZU0lDQUwgQUREUkVTUyAqLworCisjZGVmaW5lIFRYX0VOQUJMRQkweDA0IC8qIGJpdCAyICovCisjZGVmaW5lIFJYX0VOQUJMRQkweDA4IC8qIGJpdCAzICovCisKKyNkZWZpbmUgUkVTRVQJCTB4ODAgLyogc2V0IGJpdCA3IGhpZ2ggKi8KKyNkZWZpbmUgU1RPUF9SRVNFVAkweDAwIC8qIHNldCBiaXQgNyBsb3cgKi8KKworLyoKKyAqIGRhdGEgdG8gY29tbWFuZCByZWdpc3RlcgorICogKGhpZ2ggNCBiaXRzIGluIHdyaXRlIHRvIERBVEFfUE9SVCkKKyAqLworI2RlZmluZSBSWF9QQUdFMl9TRUxFQ1QJMHgxMCAvKiBiaXQgNCwgb25seSAyIHBhZ2VzIHRvIHNlbGVjdCAqLworI2RlZmluZSBSWF9CQVNFX1BBR0UJMHgyMCAvKiBiaXQgNSwgYWx3YXlzIHNldCB3aGVuIHNwZWNpZnlpbmcgUlhfQUREUiAqLworI2RlZmluZSBGTElQX0lSUQkweDQwIC8qIGJpdCA2ICovCisKKy8qCisgKiBELUxpbmsgYWRhcHRlciBpbnRlcm5hbCBtZW1vcnk6CisgKgorICogMC0ySyAxOnN0IHRyYW5zbWl0IHBhZ2UgKHNlbmQgZnJvbSBwb2ludGVyIHVwIHRvIDJLKQorICogMi00SwkyOm5kIHRyYW5zbWl0IHBhZ2UgKHNlbmQgZnJvbSBwb2ludGVyIHVwIHRvIDRLKQorICoKKyAqIDQtNksgMTpzdCByZWNlaXZlIHBhZ2UgKGRhdGEgZnJvbSA0SyB1cHdhcmRzKQorICogNi04SyAyOm5kIHJlY2VpdmUgcGFnZSAoZGF0YSBmcm9tIDZLIHVwd2FyZHMpCisgKgorICogOEsrCUFkYXB0ZXIgUk9NIChjb250YWlucyBtYWdpYyBjb2RlIGFuZCBsYXN0IDMgYnl0ZXMgb2YgRXRoZXJuZXQgYWRkcmVzcykKKyAqLworI2RlZmluZSBNRU1fMksJCTB4MDgwMCAvKiAyMDQ4ICovCisjZGVmaW5lIE1FTV80SwkJMHgxMDAwIC8qIDQwOTYgKi8KKyNkZWZpbmUgTUVNXzZLCQkweDE4MDAgLyogNjE0NCAqLworI2RlZmluZSBOT0RFX0FERFJFU1MJMHgyMDAwIC8qIDgxOTIgKi8KKworI2RlZmluZSBSVU5UIDYwCQkvKiBUb28gc21hbGwgRXRoZXJuZXQgcGFja2V0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICBFbmQgb2YgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLgorICovCisvKiBSb3V0aW5lcyB1c2VkIGludGVybmFsbHkuIChTZWUgImNvbnZlbmllbmNlIG1hY3JvcyIpICovCitzdGF0aWMgdTgJZGU2MDBfcmVhZF9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdTgJZGU2MDBfcmVhZF9ieXRlKHVuc2lnbmVkIGNoYXIgdHlwZSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIFB1dCBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KK3N0YXRpYyBpbnQJZGU2MDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJZGU2MDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJZGU2MDBfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogRGlzcGF0Y2ggZnJvbSBpbnRlcnJ1cHRzLiAqLworc3RhdGljIGlycXJldHVybl90IGRlNjAwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQJZGU2MDBfdHhfaW50cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaXJxX3N0YXR1cyk7CitzdGF0aWMgdm9pZAlkZTYwMF9yeF9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBJbml0aWFsaXphdGlvbiAqLworc3RhdGljIHZvaWQJdHJpZ2dlcl9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CWFkYXB0ZXJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoKKyAqIENvbnZlbmllbmNlIG1hY3Jvcy9mdW5jdGlvbnMgZm9yIEQtTGluayBhZGFwdGVyCisgKi8KKworI2RlZmluZSBzZWxlY3RfcHJuKCkgb3V0Yl9wKFNFTEVDVF9QUk4sIENPTU1BTkRfUE9SVCk7IERFNjAwX1NMT1dfRE9XTgorI2RlZmluZSBzZWxlY3RfbmljKCkgb3V0Yl9wKFNFTEVDVF9OSUMsIENPTU1BTkRfUE9SVCk7IERFNjAwX1NMT1dfRE9XTgorCisvKiBUaGFua3MgZm9yIGhpbnRzIGZyb20gTWFyayBCdXJ0b24gPG1hcmtiQG9yZGVybi5kZW1vbi5jby51az4gKi8KKyNkZWZpbmUgZGU2MDBfcHV0X2J5dGUoZGF0YSkgKCBcCisJb3V0Yl9wKCgoZGF0YSkgPDwgNCkgICB8IFdSSVRFX0RBVEEgICAgICAgICAgICAsIERBVEFfUE9SVCksIFwKKwlvdXRiX3AoKChkYXRhKSAmIDB4ZjApIHwgV1JJVEVfREFUQSB8IEhJX05JQkJMRSwgREFUQV9QT1JUKSkKKworLyoKKyAqIFRoZSBmaXJzdCB0d28gb3V0Yl9wKCkncyBiZWxvdyBjb3VsZCBwZXJoYXBzIGJlIGRlbGV0ZWQgaWYgdGhlcmUKKyAqIHdvdWxkIGJlIG1vcmUgZGVsYXkgaW4gdGhlIGxhc3QgdHdvLiBOb3QgY2VydGFpbiBhYm91dCBpdCB5ZXQuLi4KKyAqLworI2RlZmluZSBkZTYwMF9wdXRfY29tbWFuZChjbWQpICggXAorCW91dGJfcCgoIHJ4X3BhZ2UgICAgICAgIDw8IDQpICAgfCBDT01NQU5EICAgICAgICAgICAgLCBEQVRBX1BPUlQpLCBcCisJb3V0Yl9wKCggcnhfcGFnZSAgICAgICAgJiAweGYwKSB8IENPTU1BTkQgfCBISV9OSUJCTEUsIERBVEFfUE9SVCksIFwKKwlvdXRiX3AoKChyeF9wYWdlIHwgY21kKSA8PCA0KSAgIHwgQ09NTUFORCAgICAgICAgICAgICwgREFUQV9QT1JUKSwgXAorCW91dGJfcCgoKHJ4X3BhZ2UgfCBjbWQpICYgMHhmMCkgfCBDT01NQU5EIHwgSElfTklCQkxFLCBEQVRBX1BPUlQpKQorCisjZGVmaW5lIGRlNjAwX3NldHVwX2FkZHJlc3MoYWRkcix0eXBlKSAoIFwKKwlvdXRiX3AoKCgoYWRkcikgPDwgNCkgJiAweGYwKSB8IHR5cGUgICAgICAgICAgICAsIERBVEFfUE9SVCksIFwKKwlvdXRiX3AoKCAoYWRkcikgICAgICAgJiAweGYwKSB8IHR5cGUgfCBISV9OSUJCTEUsIERBVEFfUE9SVCksIFwKKwlvdXRiX3AoKCgoYWRkcikgPj4gNCkgJiAweGYwKSB8IHR5cGUgICAgICAgICAgICAsIERBVEFfUE9SVCksIFwKKwlvdXRiX3AoKCgoYWRkcikgPj4gOCkgJiAweGYwKSB8IHR5cGUgfCBISV9OSUJCTEUsIERBVEFfUE9SVCkpCisKKyNkZWZpbmUgcnhfcGFnZV9hZHIoKSAoKHJ4X3BhZ2UgJiBSWF9QQUdFMl9TRUxFQ1QpPyhNRU1fNkspOihNRU1fNEspKQorCisvKiBGbGlwIGJpdCwgb25seSAyIHBhZ2VzICovCisjZGVmaW5lIG5leHRfcnhfcGFnZSgpIChyeF9wYWdlIF49IFJYX1BBR0UyX1NFTEVDVCkKKworI2RlZmluZSB0eF9wYWdlX2FkcihhKSAoKChhKSArIDEpICogTUVNXzJLKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGU2MjAuYyBiL2RyaXZlcnMvbmV0L2RlNjIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2OWY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RlNjIwLmMKQEAgLTAsMCArMSwxMDQ3IEBACisvKgorICoJZGU2MjAuYyAkUmV2aXNpb246IDEuNDAgJCBCRVRBCisgKgorICoKKyAqCUxpbnV4IGRyaXZlciBmb3IgdGhlIEQtTGluayBERS02MjAgRXRoZXJuZXQgcG9ja2V0IGFkYXB0ZXIuCisgKgorICoJUG9ydGlvbnMgKEMpIENvcHlyaWdodCAxOTkzLCAxOTk0IGJ5IEJqb3JuIEVrd2FsbCA8Ymowcm5AYmxveC5zZT4KKyAqCisgKglCYXNlZCBvbiBhZGFwdGVyIGluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gRE9TIHBhY2tldGRyaXZlcgorICoJc291cmNlcyBmcm9tIEQtTGluayBJbmM6ICAoU3BlY2lhbCB0aGFua3MgdG8gSGVucnkgTmdhaSBvZiBELUxpbmsuKQorICoJCVBvcnRpb25zIChDKSBDb3B5cmlnaHQgRC1MaW5rIFNZU1RFTSBJbmMuIDE5OTEsIDE5OTIKKyAqCQlDb3B5cmlnaHQsIDE5ODgsIFJ1c3NlbGwgTmVsc29uLCBDcnlud3IgU29mdHdhcmUKKyAqCisgKglBZGFwdGVkIHRvIHRoZSBzYW1wbGUgbmV0d29yayBkcml2ZXIgY29yZSBmb3IgbGludXgsCisgKgl3cml0dGVuIGJ5OiBEb25hbGQgQmVja2VyIDxiZWNrZXJAc3VwZXIub3JnPgorICoJCShOb3cgYXQgPGJlY2tlckBzY3lsZC5jb20+KQorICoKKyAqCVZhbHVhYmxlIGFzc2lzdGFuY2UgZnJvbToKKyAqCQlKLiBKb3NodWEgS29wcGVyIDxrb3BwZXJAcnRzZy5tb3QuY29tPgorICoJCU9sYXYgS3ZpdHRlbSA8T2xhdi5Ldml0dGVtQHVuaW5ldHQubm8+CisgKgkJR2VybWFubyBDYXJvbm5pIDxjYXJvbm5pQG5lc3NpZS5jcy5pZC5ldGh6LmNoPgorICoJCUplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUBzdWl0ZS5zdy5vei5hdT4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKglhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKwkiZGU2MjAuYzogJFJldmlzaW9uOiAxLjQwICQsICBCam9ybiBFa3dhbGwgPGJqMHJuQGJsb3guc2U+XG4iOworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIlR1bmluZyIgc2VjdGlvbi4KKyAqCisgKiBDb21waWxlLXRpbWUgb3B0aW9uczogKHNlZSBiZWxvdyBmb3IgZGVzY3JpcHRpb25zKQorICogLURERTYyMF9JTz0weDM3OAkobHB0MSkKKyAqIC1EREU2MjBfSVJRPTcJKGxwdDEpCisgKiAtRERFNjAyX0RFQlVHPS4uLgorICogLURTSFVURE9XTl9XSEVOX0xPU1QKKyAqIC1EQ09VTlRfTE9PUFMKKyAqIC1ETE9XU1BFRUQKKyAqIC1EUkVBRF9ERUxBWQorICogLURXUklURV9ERUxBWQorICovCisKKy8qCisgKiBUaGlzIGRyaXZlciBhc3N1bWVzIHRoYXQgdGhlIHByaW50ZXIgcG9ydCBpcyBhICJub3JtYWwiLAorICogZHVtYiwgdW5pLWRpcmVjdGlvbmFsIHBvcnQhCisgKiBJZiB5b3VyIHBvcnQgaXMgImZhbmN5IiBpbiBhbnkgd2F5LCBwbGVhc2UgdHJ5IHRvIHNldCBpdCB0byAibm9ybWFsIgorICogd2l0aCB5b3VyIEJJT1Mgc2V0dXAuICBJIGhhdmUgbm8gYWNjZXNzIHRvIG1hY2hpbmVzIHdpdGggYmktZGlyZWN0aW9uYWwKKyAqIHBvcnRzLCBzbyBJIGNhbid0IHRlc3Qgc3VjaCBhIGRyaXZlciA6LSgKKyAqIChZZXMsIEkgX2tub3dfIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBERTYyMCB3aXRoIGJpZGlyZWN0aW9uYWwgcG9ydHMuLi4pCisgKgorICogVGhlcmUgYXJlIHNvbWUgY2xvbmVzIG9mIERFNjIwIG91dCB0aGVyZSwgd2l0aCBkaWZmZXJlbnQgbmFtZXMuCisgKiBJZiB0aGUgY3VycmVudCBkcml2ZXIgZG9lcyBub3QgcmVjb2duaXplIGEgY2xvbmUsIHRyeSB0byBjaGFuZ2UKKyAqIHRoZSBmb2xsb3dpbmcgI2RlZmluZSB0bzoKKyAqCisgKiAjZGVmaW5lIERFNjIwX0NMT05FIDEKKyAqLworI2RlZmluZSBERTYyMF9DTE9ORSAwCisKKy8qCisgKiBJZiB0aGUgYWRhcHRlciBoYXMgcHJvYmxlbXMgd2l0aCBoaWdoIHNwZWVkcywgZW5hYmxlIHRoaXMgI2RlZmluZQorICogb3RoZXJ3aXNlIGZ1bGwgcHJpbnRlcnBvcnQgc3BlZWQgd2lsbCBiZSBhdHRlbXB0ZWQuCisgKgorICogWW91IGNhbiB0dW5lIHRoZSBSRUFEX0RFTEFZL1dSSVRFX0RFTEFZIGJlbG93IGlmIHlvdSBlbmFibGUgTE9XU1BFRUQKKyAqCisjZGVmaW5lIExPV1NQRUVECisgKi8KKworI2lmbmRlZiBSRUFEX0RFTEFZCisjZGVmaW5lIFJFQURfREVMQVkgMTAwCS8qIGFkYXB0ZXIgaW50ZXJuYWwgcmVhZCBkZWxheSBpbiAxMDBucyB1bml0cyAqLworI2VuZGlmCisKKyNpZm5kZWYgV1JJVEVfREVMQVkKKyNkZWZpbmUgV1JJVEVfREVMQVkgMTAwCS8qIGFkYXB0ZXIgaW50ZXJuYWwgd3JpdGUgZGVsYXkgaW4gMTAwbnMgdW5pdHMgKi8KKyNlbmRpZgorCisvKgorICogRW5hYmxlIHRoaXMgI2RlZmluZSBpZiB5b3Ugd2FudCB0aGUgYWRhcHRlciB0byBkbyBhICJpZmNvbmZpZyBkb3duIiBvbgorICogaXRzZWxmIHdoZW4gd2UgaGF2ZSBkZXRlY3RlZCB0aGF0IHNvbWV0aGluZyBpcyBwb3NzaWJseSB3cm9uZyB3aXRoIGl0LgorICogVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIHJldHJ5IHdpdGggImFkYXB0ZXJfaW5pdCgpIiB1bnRpbCBzdWNjZXNzLgorICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCisgKgorI2RlZmluZSBTSFVURE9XTl9XSEVOX0xPU1QKKyAqLworCisvKgorICogRW5hYmxlIGRlYnVnZ2luZyBieSAiLURERTYyMF9ERUJVRz0zIiB3aGVuIGNvbXBpbGluZywKKyAqIE9SIGJ5IGVuYWJsaW5nIHRoZSBmb2xsb3dpbmcgI2RlZmluZQorICoKKyAqIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZworICoKKyNkZWZpbmUgREU2MjBfREVCVUcgMworICovCisKKyNpZmRlZiBMT1dTUEVFRAorLyoKKyAqIEVuYWJsZSB0aGlzICNkZWZpbmUgaWYgeW91IHdhbnQgdG8gc2VlIGRlYnVnZ2luZyBvdXRwdXQgdGhhdCBzaG93IGhvdyBsb25nCisgKiB3ZSBoYXZlIHRvIHdhaXQgYmVmb3JlIHRoZSBERS02MjAgaXMgcmVhZHkgZm9yIHRoZSBuZXh0IHJlYWQvd3JpdGUvY29tbWFuZC4KKyAqCisjZGVmaW5lIENPVU5UX0xPT1BTCisgKi8KKyNlbmRpZgorDAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKiBDb25zdGFudCBkZWZpbml0aW9ucyBmb3IgdGhlIERFLTYyMCByZWdpc3RlcnMsIGNvbW1hbmRzIGFuZCBiaXRzICovCisjaW5jbHVkZSAiZGU2MjAuaCIKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJ5dGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRGVmaW5pdGlvbiBvZiBELUxpbmsgREUtNjIwIEV0aGVybmV0IFBvY2tldCBhZGFwdGVyICoKKyAqIFNlZSBhbHNvICJkZTYyMC5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIERFNjIwX0lPIC8qIENvbXBpbGUtdGltZSBjb25maWd1cmFibGUgKi8KKyNkZWZpbmUgREU2MjBfSU8gMHgzNzgKKyNlbmRpZgorCisjaWZuZGVmIERFNjIwX0lSUSAvKiBDb21waWxlLXRpbWUgY29uZmlndXJhYmxlICovCisjZGVmaW5lIERFNjIwX0lSUQk3CisjZW5kaWYKKworI2RlZmluZSBEQVRBX1BPUlQJKGRldi0+YmFzZV9hZGRyKQorI2RlZmluZSBTVEFUVVNfUE9SVAkoZGV2LT5iYXNlX2FkZHIgKyAxKQorI2RlZmluZSBDT01NQU5EX1BPUlQJKGRldi0+YmFzZV9hZGRyICsgMikKKworI2RlZmluZSBSVU5UIDYwCQkvKiBUb28gc21hbGwgRXRoZXJuZXQgcGFja2V0ICovCisjZGVmaW5lIEdJQU5UIDE1MTQJLyogbGFyZ2VzdCBsZWdhbCBzaXplIHBhY2tldCwgbm8gZmNzICovCisKKyNpZmRlZiBERTYyMF9ERUJVRyAvKiBDb21waWxlLXRpbWUgY29uZmlndXJhYmxlICovCisjZGVmaW5lIFBSSU5USyh4KSBpZiAoZGU2MjBfZGVidWcgPj0gMikgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIERFNjIwX0RFQlVHIDAKKyNkZWZpbmUgUFJJTlRLKHgpIC8qKi8KKyNlbmRpZgorCisKKy8qCisgKiBGb3JjZSBtZWRpYSB3aXRoIGluc21vZDoKKyAqCWluc21vZCBkZTYyMC5vIGJuYz0xCisgKiBvcgorICoJaW5zbW9kIGRlNjIwLm8gdXRwPTEKKyAqCisgKiBGb3JjZSBpbyBhbmQvb3IgaXJxIHdpdGggaW5zbW9kOgorICoJaW5zbW9kIGRlNjIwLm8gaW89MHgzNzggaXJxPTcKKyAqCisgKiBNYWtlIGEgY2xvbmUgc2tpcCB0aGUgRXRoZXJuZXQtYWRkcmVzcyByYW5nZSBjaGVjazoKKyAqCWluc21vZCBkZTYyMC5vIGNsb25lPTEKKyAqLworc3RhdGljIGludCBibmM7CitzdGF0aWMgaW50IHV0cDsKK3N0YXRpYyBpbnQgaW8gID0gREU2MjBfSU87CitzdGF0aWMgaW50IGlycSA9IERFNjIwX0lSUTsKK3N0YXRpYyBpbnQgY2xvbmUgPSBERTYyMF9DTE9ORTsKKworc3RhdGljIHVuc2lnbmVkIGludCBkZTYyMF9kZWJ1ZyA9IERFNjIwX0RFQlVHOworCitzdGF0aWMgc3BpbmxvY2tfdCBkZTYyMF9sb2NrOworCittb2R1bGVfcGFyYW0oYm5jLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHV0cCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY2xvbmUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZGU2MjBfZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJuYywgIkRFLTYyMCBzZXQgQk5DIG1lZGl1bSAoMC0xKSIpOworTU9EVUxFX1BBUk1fREVTQyh1dHAsICJERS02MjAgc2V0IFVUUCBtZWRpdW0gKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJERS02MjAgSS9PIGJhc2UgYWRkcmVzcyxyZXF1aXJlZCIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJERS02MjAgSVJRIG51bWJlcixyZXF1aXJlZCIpOworTU9EVUxFX1BBUk1fREVTQyhjbG9uZSwgIkNoZWNrIGFsc28gZm9yIG5vbi1ELUxpbmsgREUtNjIwIGNsb25lcyAoMC0xKSIpOworTU9EVUxFX1BBUk1fREVTQyhkZTYyMF9kZWJ1ZywgIkRFLTYyMCBkZWJ1ZyBsZXZlbCAoMC0yKSIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFJvdXRpbmVzIHVzZWQgaW50ZXJuYWxseS4gKFNlZSBhbHNvICJjb252ZW5pZW5jZSBtYWNyb3MuLiBiZWxvdyIpCisgKi8KKworLyogUHV0IGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworc3RhdGljIGludAlkZTYyMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludAlkZTYyMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBzdHJ1Y3QJbmV0X2RldmljZV9zdGF0cyAqZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQJZGU2MjBfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludAlkZTYyMF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICopOworCisvKiBEaXNwYXRjaCBmcm9tIGludGVycnVwdHMuICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZGU2MjBfaW50ZXJydXB0KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyBpbnQJZGU2MjBfcnhfaW50cihzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworLyogSW5pdGlhbGl6YXRpb24gKi8KK3N0YXRpYyBpbnQJYWRhcHRlcl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludAlyZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworCisvKgorICogRC1MaW5rIGRyaXZlciB2YXJpYWJsZXM6CisgKi8KKyNkZWZpbmUgU0NSX0RFRiBOSUJCTEVNT0RFIHxJTlRPTiB8IFNMRUVQIHwgQVVUT1RYCisjZGVmaW5lCVRDUl9ERUYgUlhQQgkJCS8qIG5vdCB1c2VkOiB8IFRYU1VDSU5UIHwgVDE2SU5UICovCisjZGVmaW5lIERFNjIwX1JYX1NUQVJUX1BBR0UgMTIJCS8qIDEyIHBhZ2VzICg9M2spIHJlc2VydmVkIGZvciB0eCAqLworI2RlZmluZSBERUZfTklDX0NNRCBJUlFFTiB8IElDRU4gfCBEUzEKKworc3RhdGljIHZvbGF0aWxlIGJ5dGUJTklDX0NtZDsKK3N0YXRpYyB2b2xhdGlsZSBieXRlCW5leHRfcnhfcGFnZTsKK3N0YXRpYyBieXRlCQlmaXJzdF9yeF9wYWdlOworc3RhdGljIGJ5dGUJCWxhc3RfcnhfcGFnZTsKK3N0YXRpYyBieXRlCQlFSVBSZWdpc3RlcjsKKworc3RhdGljIHN0cnVjdCBuaWMgeworCWJ5dGUJTm9kZUlEWzZdOworCWJ5dGUJUkFNX1NpemU7CisJYnl0ZQlNb2RlbDsKKwlieXRlCU1lZGlhOworCWJ5dGUJU0NSOworfSBuaWNfZGF0YTsKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29udmVuaWVuY2UgbWFjcm9zL2Z1bmN0aW9ucyBmb3IgRC1MaW5rIERFLTYyMCBhZGFwdGVyICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgZGU2MjBfdHhfYnVmZnMoZGQpIChpbmIoU1RBVFVTX1BPUlQpICYgKFRYQkYwIHwgVFhCRjEpKQorI2RlZmluZSBkZTYyMF9mbGlwX2RzKGRkKSBOSUNfQ21kIF49IERTMCB8IERTMTsgb3V0YihOSUNfQ21kLCBDT01NQU5EX1BPUlQpOworCisvKiBDaGVjayBmb3IgcmVhZHktc3RhdHVzLCBhbmQgcmV0dXJuIGEgbmliYmxlIChoaWdoIDQgYml0cykgZm9yIGRhdGEgaW5wdXQgKi8KKyNpZmRlZiBDT1VOVF9MT09QUworc3RhdGljIGludCB0b3RfY250OworI2VuZGlmCitzdGF0aWMgaW5saW5lIGJ5dGUKK2RlNjIwX3JlYWR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJYnl0ZSB2YWx1ZTsKKwlyZWdpc3RlciBzaG9ydCBpbnQgY250ID0gMDsKKworCXdoaWxlICgoKCh2YWx1ZSA9IGluYihTVEFUVVNfUE9SVCkpICYgUkVBRFkpID09IDApICYmIChjbnQgPD0gMTAwMCkpCisJCSsrY250OworCisjaWZkZWYgQ09VTlRfTE9PUFMKKwl0b3RfY250ICs9IGNudDsKKyNlbmRpZgorCXJldHVybiB2YWx1ZSAmIDB4ZjA7IC8qIG5pYmJsZSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlNjIwX3NlbmRfY29tbWFuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBieXRlIGNtZCkKK3sKKwlkZTYyMF9yZWFkeShkZXYpOworCWlmIChjbWQgPT0gV19EVU1NWSkKKwkJb3V0YihOSUNfQ21kLCBDT01NQU5EX1BPUlQpOworCisJb3V0YihjbWQsIERBVEFfUE9SVCk7CisKKwlvdXRiKE5JQ19DbWQgXiBDUzAsIENPTU1BTkRfUE9SVCk7CisJZGU2MjBfcmVhZHkoZGV2KTsKKwlvdXRiKE5JQ19DbWQsIENPTU1BTkRfUE9SVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZGU2MjBfcHV0X2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYnl0ZSB2YWx1ZSkKK3sKKwkvKiBUaGUgZGU2MjBfcmVhZHkoKSBtYWtlcyA3IGxvb3BzLCBvbiB0aGUgYXZlcmFnZSwgb24gYSBEWDIvNjYgKi8KKwlkZTYyMF9yZWFkeShkZXYpOworCW91dGIodmFsdWUsIERBVEFfUE9SVCk7CisJZGU2MjBfZmxpcF9kcyhkZXYpOworfQorCitzdGF0aWMgaW5saW5lIGJ5dGUKK2RlNjIwX3JlYWRfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWJ5dGUgdmFsdWU7CisKKwkvKiBUaGUgZGU2MjBfcmVhZHkoKSBtYWtlcyA3IGxvb3BzLCBvbiB0aGUgYXZlcmFnZSwgb24gYSBEWDIvNjYgKi8KKwl2YWx1ZSA9IGRlNjIwX3JlYWR5KGRldik7IC8qIEhpZ2ggbmliYmxlICovCisJZGU2MjBfZmxpcF9kcyhkZXYpOworCXZhbHVlIHw9IGRlNjIwX3JlYWR5KGRldikgPj4gNDsgLyogTG93IG5pYmJsZSAqLworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitkZTYyMF93cml0ZV9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBieXRlICpidWZmZXIsIGludCBjb3VudCwgaW50IHBhZCkKK3sKKyNpZm5kZWYgTE9XU1BFRUQKKwlieXRlIHVmbGlwID0gTklDX0NtZCBeIChEUzAgfCBEUzEpOworCWJ5dGUgZGZsaXAgPSBOSUNfQ21kOworI2Vsc2UgLyogTE9XU1BFRUQgKi8KKyNpZmRlZiBDT1VOVF9MT09QUworCWludCBieXRlcyA9IGNvdW50OworI2VuZGlmIC8qIENPVU5UX0xPT1BTICovCisjZW5kaWYgLyogTE9XU1BFRUQgKi8KKworI2lmZGVmIExPV1NQRUVECisjaWZkZWYgQ09VTlRfTE9PUFMKKwl0b3RfY250ID0gMDsKKyNlbmRpZiAvKiBDT1VOVF9MT09QUyAqLworCS8qIE5vIGZ1cnRoZXIgb3B0aW1pemF0aW9uIHVzZWZ1bCwgdGhlIGxpbWl0IGlzIGluIHRoZSBhZGFwdGVyLiAqLworCWZvciAoIDsgY291bnQgPiAwOyAtLWNvdW50LCArK2J1ZmZlcikgeworCQlkZTYyMF9wdXRfYnl0ZShkZXYsKmJ1ZmZlcik7CisJfQorCWZvciAoIGNvdW50ID0gcGFkIDsgY291bnQgPiAwOyAtLWNvdW50LCArK2J1ZmZlcikgeworCQlkZTYyMF9wdXRfYnl0ZShkZXYsIDApOworCX0KKwlkZTYyMF9zZW5kX2NvbW1hbmQoZGV2LFdfRFVNTVkpOworI2lmZGVmIENPVU5UX0xPT1BTCisJLyogdHJpYWwgZGVidWcgb3V0cHV0OiBsb29wcyBwZXIgYnl0ZSBpbiBkZTYyMF9yZWFkeSgpICovCisJcHJpbnRrKCJXUklURSglZClcbiIsIHRvdF9jbnQvKChieXRlcz9ieXRlczoxKSkpOworI2VuZGlmIC8qIENPVU5UX0xPT1BTICovCisjZWxzZSAvKiBub3QgTE9XU1BFRUQgKi8KKwlmb3IgKCA7IGNvdW50ID4gMDsgY291bnQgLT0yKSB7CisJCW91dGIoKmJ1ZmZlcisrLCBEQVRBX1BPUlQpOworCQlvdXRiKHVmbGlwLCBDT01NQU5EX1BPUlQpOworCQlvdXRiKCpidWZmZXIrKywgREFUQV9QT1JUKTsKKwkJb3V0YihkZmxpcCwgQ09NTUFORF9QT1JUKTsKKwl9CisJZGU2MjBfc2VuZF9jb21tYW5kKGRldixXX0RVTU1ZKTsKKyNlbmRpZiAvKiBMT1dTUEVFRCAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlNjIwX3JlYWRfYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYnl0ZSAqZGF0YSwgaW50IGNvdW50KQoreworI2lmbmRlZiBMT1dTUEVFRAorCWJ5dGUgdmFsdWU7CisJYnl0ZSB1ZmxpcCA9IE5JQ19DbWQgXiAoRFMwIHwgRFMxKTsKKwlieXRlIGRmbGlwID0gTklDX0NtZDsKKyNlbHNlIC8qIExPV1NQRUVEICovCisjaWZkZWYgQ09VTlRfTE9PUFMKKwlpbnQgYnl0ZXMgPSBjb3VudDsKKworCXRvdF9jbnQgPSAwOworI2VuZGlmIC8qIENPVU5UX0xPT1BTICovCisjZW5kaWYgLyogTE9XU1BFRUQgKi8KKworI2lmZGVmIExPV1NQRUVECisJLyogTm8gZnVydGhlciBvcHRpbWl6YXRpb24gdXNlZnVsLCB0aGUgbGltaXQgaXMgaW4gdGhlIGFkYXB0ZXIuICovCisJd2hpbGUgKGNvdW50LS0gPiAwKSB7CisJCSpkYXRhKysgPSBkZTYyMF9yZWFkX2J5dGUoZGV2KTsKKwkJZGU2MjBfZmxpcF9kcyhkZXYpOworCX0KKyNpZmRlZiBDT1VOVF9MT09QUworCS8qIHRyaWFsIGRlYnVnIG91dHB1dDogbG9vcHMgcGVyIGJ5dGUgaW4gZGU2MjBfcmVhZHkoKSAqLworCXByaW50aygiUkVBRCglZClcbiIsIHRvdF9jbnQvKDIqKGJ5dGVzP2J5dGVzOjEpKSk7CisjZW5kaWYgLyogQ09VTlRfTE9PUFMgKi8KKyNlbHNlIC8qIG5vdCBMT1dTUEVFRCAqLworCXdoaWxlIChjb3VudC0tID4gMCkgeworCQl2YWx1ZSA9IGluYihTVEFUVVNfUE9SVCkgJiAweGYwOyAvKiBIaWdoIG5pYmJsZSAqLworCQlvdXRiKHVmbGlwLCBDT01NQU5EX1BPUlQpOworCQkqZGF0YSsrID0gdmFsdWUgfCBpbmIoU1RBVFVTX1BPUlQpID4+IDQ7IC8qIExvdyBuaWJibGUgKi8KKwkJb3V0YihkZmxpcCAsIENPTU1BTkRfUE9SVCk7CisJfQorI2VuZGlmIC8qIExPV1NQRUVEICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZGU2MjBfc2V0X2RlbGF5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGU2MjBfcmVhZHkoZGV2KTsKKwlvdXRiKFdfREZSLCBEQVRBX1BPUlQpOworCW91dGIoTklDX0NtZCBeIENTMCwgQ09NTUFORF9QT1JUKTsKKworCWRlNjIwX3JlYWR5KGRldik7CisjaWZkZWYgTE9XU1BFRUQKKwlvdXRiKFdSSVRFX0RFTEFZLCBEQVRBX1BPUlQpOworI2Vsc2UKKwlvdXRiKDAsIERBVEFfUE9SVCk7CisjZW5kaWYKKwlkZTYyMF9mbGlwX2RzKGRldik7CisKKwlkZTYyMF9yZWFkeShkZXYpOworI2lmZGVmIExPV1NQRUVECisJb3V0YihSRUFEX0RFTEFZLCBEQVRBX1BPUlQpOworI2Vsc2UKKwlvdXRiKDAsIERBVEFfUE9SVCk7CisjZW5kaWYKKwlkZTYyMF9mbGlwX2RzKGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZGU2MjBfc2V0X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJ5dGUgcmVnLCBieXRlIHZhbHVlKQoreworCWRlNjIwX3JlYWR5KGRldik7CisJb3V0YihyZWcsIERBVEFfUE9SVCk7CisJb3V0YihOSUNfQ21kIF4gQ1MwLCBDT01NQU5EX1BPUlQpOworCisJZGU2MjBfcHV0X2J5dGUoZGV2LCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYnl0ZQorZGU2MjBfZ2V0X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJ5dGUgcmVnKQoreworCWJ5dGUgdmFsdWU7CisKKwlkZTYyMF9zZW5kX2NvbW1hbmQoZGV2LHJlZyk7CisJdmFsdWUgPSBkZTYyMF9yZWFkX2J5dGUoZGV2KTsKKwlkZTYyMF9zZW5kX2NvbW1hbmQoZGV2LFdfRFVNTVkpOworCisJcmV0dXJuIHZhbHVlOworfQorDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuCisgKgorICogVGhpcyByb3V0aW5lIHNob3VsZCBzZXQgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgorICogcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKKyAqIHRoZXJlIGlzIGEgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqCisgKi8KK3N0YXRpYyBpbnQgZGU2MjBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZGU2MjBfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldCkgeworCQlwcmludGsgKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBJUlEgJWRcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChhZGFwdGVyX2luaXQoZGV2KSkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF9mcmVlX2lycTsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworCitvdXRfZnJlZV9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gZGU2MjBfb3BlbigpLgorICoKKyAqLworCitzdGF0aWMgaW50IGRlNjIwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCS8qIGRpc2FibGUgcmVjdiAqLworCWRlNjIwX3NldF9yZWdpc3RlcihkZXYsIFdfVENSLCBSWE9GRik7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZXR1cm4gY3VycmVudCBzdGF0aXN0aWNzCisgKgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikoZGV2LT5wcml2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICogKG5vIHJlYWwgbXVsdGljYXN0IGltcGxlbWVudGVkIGZvciB0aGUgREUtNjIwLCBidXQgc2hlIGNhbiBiZSBwcm9taXNjdW91cy4uLikKKyAqCisgKi8KKworc3RhdGljIHZvaWQgZGU2MjBfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+bWNfY291bnQgfHwgZGV2LT5mbGFncyYoSUZGX0FMTE1VTFRJfElGRl9QUk9NSVNDKSkKKwl7IC8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCS8qCisJCSAqCVdlIG11c3QgbWFrZSB0aGUga2VybmVsIHJlYWxpc2Ugd2UgaGFkIHRvIG1vdmUKKwkJICoJaW50byBwcm9taXNjIG1vZGUgb3Igd2Ugc3RhcnQgYWxsIG91dCB3YXIgb24KKwkJICoJdGhlIGNhYmxlLiAtIEFDCisJCSAqLworCQlkZXYtPmZsYWdzfD1JRkZfUFJPTUlTQzsKKworCQlkZTYyMF9zZXRfcmVnaXN0ZXIoZGV2LCBXX1RDUiwgKFRDUl9ERUYgJiB+UlhQQk0pIHwgUlhBTEwpOworCX0KKwllbHNlCisJeyAvKiBEaXNhYmxlIHByb21pc2N1b3VzIG1vZGUsIHVzZSBub3JtYWwgbW9kZSAqLworCQlkZTYyMF9zZXRfcmVnaXN0ZXIoZGV2LCBXX1RDUiwgVENSX0RFRik7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCisgKiBIYW5kbGUgdGltZW91dHMgb24gdHJhbnNtaXQKKyAqLworIAorc3RhdGljIHZvaWQgZGU2MjBfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsICVzP1xuIiwgZGV2LT5uYW1lLCAibmV0d29yayBjYWJsZSBwcm9ibGVtIik7CisJLyogUmVzdGFydCB0aGUgYWRhcHRlci4gKi8KKwlpZiAoIWFkYXB0ZXJfaW5pdChkZXYpKSAvKiBtYXliZSBjbG9zZSBpdCAqLworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weSBhIGJ1ZmZlciB0byB0aGUgYWRhcHRlciB0cmFuc21pdCBwYWdlIG1lbW9yeS4KKyAqIFN0YXJ0IHNlbmRpbmcuCisgKi8KK3N0YXRpYyBpbnQgZGU2MjBfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGxlbjsKKwlieXRlICpidWZmZXIgPSBza2ItPmRhdGE7CisJYnl0ZSB1c2luZ190eGJ1ZjsKKworCXVzaW5nX3R4YnVmID0gZGU2MjBfdHhfYnVmZnMoZGV2KTsgLyogUGVlayBhdCB0aGUgYWRhcHRlciAqLworCQorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKworCWlmICgobGVuID0gc2tiLT5sZW4pIDwgUlVOVCkKKwkJbGVuID0gUlVOVDsKKwlpZiAobGVuICYgMSkgLyogc2VuZCBhbiBldmVuIG51bWJlciBvZiBieXRlcyAqLworCQkrK2xlbjsKKworCS8qIFN0YXJ0IHJlYWwgb3V0cHV0ICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGU2MjBfbG9jaywgZmxhZ3MpCisJUFJJTlRLKCgiZGU2MjBfc3RhcnRfeG1pdDogbGVuPSVkLCBidWZzIDB4JTAyeFxuIiwKKwkJKGludClza2ItPmxlbiwgdXNpbmdfdHhidWYpKTsKKworCS8qIHNlbGVjdCBhIGZyZWUgdHggYnVmZmVyLiBpZiB0aGVyZSBpcyBvbmUuLi4gKi8KKwlzd2l0Y2ggKHVzaW5nX3R4YnVmKSB7CisJZGVmYXVsdDogLyogYm90aCBhcmUgZnJlZTogdXNlIFRYQkYwICovCisJY2FzZSBUWEJGMTogLyogdXNlIFRYQkYwICovCisJCWRlNjIwX3NlbmRfY29tbWFuZChkZXYsV19DUiB8IFJXMCk7CisJCXVzaW5nX3R4YnVmIHw9IFRYQkYwOworCQlicmVhazsKKworCWNhc2UgVFhCRjA6IC8qIHVzZSBUWEJGMSAqLworCQlkZTYyMF9zZW5kX2NvbW1hbmQoZGV2LFdfQ1IgfCBSVzEpOworCQl1c2luZ190eGJ1ZiB8PSBUWEJGMTsKKwkJYnJlYWs7CisKKwljYXNlIChUWEJGMCB8IFRYQkYxKTogLyogTk9ORSEhISAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gdHgtYnVmZmVyIGF2YWlsYWJsZSFcbiIsIGRldi0+bmFtZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlNjIwX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCWRlNjIwX3dyaXRlX2Jsb2NrKGRldiwgYnVmZmVyLCBza2ItPmxlbiwgbGVuLXNrYi0+bGVuKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWlmKCEodXNpbmdfdHhidWYgPT0gKFRYQkYwIHwgVFhCRjEpKSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKShkZXYtPnByaXYpKS0+dHhfcGFja2V0cysrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlNjIwX2xvY2ssIGZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiIChza2IpOworCXJldHVybiAwOworfQorDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSGFuZGxlIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpbnRlcnJ1cHRzLgorICoKKyAqLworc3RhdGljIGlycXJldHVybl90CitkZTYyMF9pbnRlcnJ1cHQoaW50IGlycV9pbiwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCWJ5dGUgaXJxX3N0YXR1czsKKwlpbnQgYm9ndXNfY291bnQgPSAwOworCWludCBhZ2FpbiA9IDA7CisKKwlzcGluX2xvY2soJmRlNjIwX2xvY2spOworCQorCS8qIFJlYWQgdGhlIHN0YXR1cyByZWdpc3RlciAoX25vdF8gdGhlIHN0YXR1cyBwb3J0KSAqLworCWlycV9zdGF0dXMgPSBkZTYyMF9nZXRfcmVnaXN0ZXIoZGV2LCBSX1NUUyk7CisKKwlQUklOVEsoKCJkZTYyMF9pbnRlcnJ1cHQgKCUyLjJYKVxuIiwgaXJxX3N0YXR1cykpOworCisJaWYgKGlycV9zdGF0dXMgJiBSWEdPT0QpIHsKKwkJZG8geworCQkJYWdhaW4gPSBkZTYyMF9yeF9pbnRyKGRldik7CisJCQlQUklOVEsoKCJhZ2Fpbj0lZFxuIiwgYWdhaW4pKTsKKwkJfQorCQl3aGlsZSAoYWdhaW4gJiYgKCsrYm9ndXNfY291bnQgPCAxMDApKTsKKwl9CisKKwlpZihkZTYyMF90eF9idWZmcyhkZXYpICE9IChUWEJGMCB8IFRYQkYxKSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkKKwlzcGluX3VubG9jaygmZGU2MjBfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXQgYSBwYWNrZXQgZnJvbSB0aGUgYWRhcHRlcgorICoKKyAqIFNlbmQgaXQgInVwc3RhaXJzIgorICoKKyAqLworc3RhdGljIGludCBkZTYyMF9yeF9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhlYWRlcl9idWYgeworCQlieXRlCQlzdGF0dXM7CisJCWJ5dGUJCVJ4X05leHRQYWdlOworCQl1bnNpZ25lZCBzaG9ydAlSeF9CeXRlQ291bnQ7CisJfSBoZWFkZXJfYnVmOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHNpemU7CisJYnl0ZSAqYnVmZmVyOworCWJ5dGUgcGFnZWxpbms7CisJYnl0ZSBjdXJyX3BhZ2U7CisKKwlQUklOVEsoKCJkZTYyMF9yeF9pbnRyOiBuZXh0X3J4X3BhZ2UgPSAlZFxuIiwgbmV4dF9yeF9wYWdlKSk7CisKKwkvKiBUZWxsIHRoZSBhZGFwdGVyIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHJlYWQgZGF0YSwgYW5kIGZyb20gd2hlcmUgKi8KKwlkZTYyMF9zZW5kX2NvbW1hbmQoZGV2LCBXX0NSIHwgUlJOKTsKKwlkZTYyMF9zZXRfcmVnaXN0ZXIoZGV2LCBXX1JTQTEsIG5leHRfcnhfcGFnZSk7CisJZGU2MjBfc2V0X3JlZ2lzdGVyKGRldiwgV19SU0EwLCAwKTsKKworCS8qIERlZXAgYnJlYXRoLCBhbmQgYXdheSB3ZSBnb29vb29vICovCisJZGU2MjBfcmVhZF9ibG9jayhkZXYsIChieXRlICopJmhlYWRlcl9idWYsIHNpemVvZihzdHJ1Y3QgaGVhZGVyX2J1ZikpOworCVBSSU5USygoInBhZ2Ugc3RhdHVzPTB4JTAyeCwgbmV4dHBhZ2U9JWQsIHBhY2tldHNpemU9JWRcbiIsCisJaGVhZGVyX2J1Zi5zdGF0dXMsIGhlYWRlcl9idWYuUnhfTmV4dFBhZ2UsIGhlYWRlcl9idWYuUnhfQnl0ZUNvdW50KSk7CisKKwkvKiBQbGF1c2libGUgcGFnZSBoZWFkZXI/ICovCisJcGFnZWxpbmsgPSBoZWFkZXJfYnVmLlJ4X05leHRQYWdlOworCWlmICgocGFnZWxpbmsgPCBmaXJzdF9yeF9wYWdlKSB8fCAobGFzdF9yeF9wYWdlIDwgcGFnZWxpbmspKSB7CisJCS8qIE91Y2guLi4gRm9yZ2V0IGl0ISBTa2lwIGFsbCBhbmQgc3RhcnQgYWZyZXNoLi4uICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSaW5nIG92ZXJydW4/IFJlc3RvcmluZy4uLlxuIiwgZGV2LT5uYW1lKTsKKwkJLyogWW91IHdpbiBzb21lLCB5b3UgbG9zZSBzb21lLiBBbmQgc29tZXRpbWVzIHBsZW50eS4uLiAqLworCQlhZGFwdGVyX2luaXQoZGV2KTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopKGRldi0+cHJpdikpLT5yeF9vdmVyX2Vycm9ycysrOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBPSywgdGhpcyBsb29rIGdvb2QsIHNvIGZhci4gTGV0J3Mgc2VlIGlmIGl0J3MgY29uc2lzdGVudC4uLiAqLworCS8qIExldCdzIGNvbXB1dGUgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHBhY2tldCwgYmFzZWQgb24gd2hlcmUgd2UgYXJlICovCisJcGFnZWxpbmsgPSBuZXh0X3J4X3BhZ2UgKworCQkoKGhlYWRlcl9idWYuUnhfQnl0ZUNvdW50ICsgKDQgLSAxICsgMHgxMDApKSA+PiA4KTsKKworCS8qIEFyZSB3ZSBnb2luZyB0byB3cmFwIGFyb3VuZCB0aGUgcGFnZSBjb3VudGVyPyAqLworCWlmIChwYWdlbGluayA+IGxhc3RfcnhfcGFnZSkKKwkJcGFnZWxpbmsgLT0gKGxhc3RfcnhfcGFnZSAtIGZpcnN0X3J4X3BhZ2UgKyAxKTsKKworCS8qIElzIHRoZSBfY29tcHV0ZWRfIG5leHQgcGFnZSBudW1iZXIgZXF1YWwgdG8gd2hhdCB0aGUgYWRhcHRlciBzYXlzPyAqLworCWlmIChwYWdlbGluayAhPSBoZWFkZXJfYnVmLlJ4X05leHRQYWdlKSB7CisJCS8qIE5hYWgsIHdlJ2xsIHNraXAgdGhpcyBwYWNrZXQuIFByb2JhYmx5IGJvZ3VzIGRhdGEgYXMgd2VsbCAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUGFnZSBsaW5rIG91dCBvZiBzeW5jISBSZXN0b3JpbmcuLi5cbiIsIGRldi0+bmFtZSk7CisJCW5leHRfcnhfcGFnZSA9IGhlYWRlcl9idWYuUnhfTmV4dFBhZ2U7IC8qIGF0IGxlYXN0IGEgdHJ5Li4uICovCisJCWRlNjIwX3NlbmRfY29tbWFuZChkZXYsIFdfRFVNTVkpOworCQlkZTYyMF9zZXRfcmVnaXN0ZXIoZGV2LCBXX05QUkYsIG5leHRfcnhfcGFnZSk7CisJCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikoZGV2LT5wcml2KSktPnJ4X292ZXJfZXJyb3JzKys7CisJCXJldHVybiAwOworCX0KKwluZXh0X3J4X3BhZ2UgPSBwYWdlbGluazsKKworCXNpemUgPSBoZWFkZXJfYnVmLlJ4X0J5dGVDb3VudCAtIDQ7CisJaWYgKChzaXplIDwgUlVOVCkgfHwgKEdJQU5UIDwgc2l6ZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IElsbGVnYWwgcGFja2V0IHNpemU6ICVkIVxuIiwgZGV2LT5uYW1lLCBzaXplKTsKKwl9CisJZWxzZSB7IC8qIEdvb2QgcGFja2V0PyAqLworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUrMik7CisJCWlmIChza2IgPT0gTlVMTCkgeyAvKiBZZWFoLCBidXQgbm8gcGxhY2UgdG8gcHV0IGl0Li4uICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGRuJ3QgYWxsb2NhdGUgYSBza19idWZmIG9mIHNpemUgJWQuXG4iLCBkZXYtPm5hbWUsIHNpemUpOworCQkJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKShkZXYtPnByaXYpKS0+cnhfZHJvcHBlZCsrOworCQl9CisJCWVsc2UgeyAvKiBZZXAhIEdvIGdldCBpdCEgKi8KKwkJCXNrYl9yZXNlcnZlKHNrYiwyKTsJLyogQWxpZ24gKi8KKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJLyogc2tiLT5kYXRhIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEgKi8KKwkJCWJ1ZmZlciA9IHNrYl9wdXQoc2tiLHNpemUpOworCQkJLyogY29weSB0aGUgcGFja2V0IGludG8gdGhlIGJ1ZmZlciAqLworCQkJZGU2MjBfcmVhZF9ibG9jayhkZXYsIGJ1ZmZlciwgc2l6ZSk7CisJCQlQUklOVEsoKCJSZWFkICVkIGJ5dGVzXG4iLCBzaXplKSk7CisJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkJbmV0aWZfcngoc2tiKTsgLyogZGVsaXZlciBpdCAidXBzdGFpcnMiICovCisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJLyogY291bnQgYWxsIHJlY2VpdmVzICovCisJCQkoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopKGRldi0+cHJpdikpLT5yeF9wYWNrZXRzKys7CisJCQkoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopKGRldi0+cHJpdikpLT5yeF9ieXRlcyArPSBzaXplOworCQl9CisJfQorCisJLyogTGV0J3MgcGVlayBhaGVhZCB0byBzZWUgaWYgd2UgaGF2ZSByZWFkIHRoZSBsYXN0IGN1cnJlbnQgcGFja2V0ICovCisJLyogTk9URSEgV2UncmUgX25vdF8gY2hlY2tpbmcgdGhlICdFTVBUWSctZmxhZyEgVGhpcyBzZWVtcyBiZXR0ZXIuLi4gKi8KKwljdXJyX3BhZ2UgPSBkZTYyMF9nZXRfcmVnaXN0ZXIoZGV2LCBSX0NQUik7CisJZGU2MjBfc2V0X3JlZ2lzdGVyKGRldiwgV19OUFJGLCBuZXh0X3J4X3BhZ2UpOworCVBSSU5USygoIm5leHRfcnhfcGFnZT0lZCBDUFI9JWRcbiIsIG5leHRfcnhfcGFnZSwgY3Vycl9wYWdlKSk7CisKKwlyZXR1cm4gKG5leHRfcnhfcGFnZSAhPSBjdXJyX3BhZ2UpOyAvKiBUaGF0IHdhcyBzbGlnaHRseSB0cmlja3kuLi4gKi8KK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZXNldCB0aGUgYWRhcHRlciB0byBhIGtub3duIHN0YXRlCisgKgorICovCitzdGF0aWMgaW50IGFkYXB0ZXJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXN0YXRpYyBpbnQgd2FzX2Rvd247CisKKwlpZiAoKG5pY19kYXRhLk1vZGVsID09IDMpIHx8IChuaWNfZGF0YS5Nb2RlbCA9PSAwKSkgeyAvKiBDVCAqLworCQlFSVBSZWdpc3RlciA9IE5DVEwwOworCQlpZiAobmljX2RhdGEuTWVkaWEgIT0gMSkKKwkJCUVJUFJlZ2lzdGVyIHw9IE5JUzA7CS8qIG5vdCBCTkMgKi8KKwl9CisJZWxzZSBpZiAobmljX2RhdGEuTW9kZWwgPT0gMikgeyAvKiBVVFAgKi8KKwkJRUlQUmVnaXN0ZXIgPSBOQ1RMMCB8IE5JUzA7CisJfQorCisJaWYgKHV0cCkKKwkJRUlQUmVnaXN0ZXIgPSBOQ1RMMCB8IE5JUzA7CisJaWYgKGJuYykKKwkJRUlQUmVnaXN0ZXIgPSBOQ1RMMDsKKworCWRlNjIwX3NlbmRfY29tbWFuZChkZXYsIFdfQ1IgfCBSTk9QIHwgQ0xFQVIpOworCWRlNjIwX3NlbmRfY29tbWFuZChkZXYsIFdfQ1IgfCBSTk9QKTsKKworCWRlNjIwX3NldF9yZWdpc3RlcihkZXYsIFdfU0NSLCBTQ1JfREVGKTsKKwkvKiBkaXNhYmxlIHJlY3YgdG8gd2FpdCBpbml0ICovCisJZGU2MjBfc2V0X3JlZ2lzdGVyKGRldiwgV19UQ1IsIFJYT0ZGKTsKKworCS8qIFNldCB0aGUgbm9kZSBJRCBpbiB0aGUgYWRhcHRlciAqLworCWZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHsgLyogV19QQVJuID0gMHhhYSArIG4gKi8KKwkJZGU2MjBfc2V0X3JlZ2lzdGVyKGRldiwgV19QQVIwICsgaSwgZGV2LT5kZXZfYWRkcltpXSk7CisJfQorCisJZGU2MjBfc2V0X3JlZ2lzdGVyKGRldiwgV19FSVAsIEVJUFJlZ2lzdGVyKTsKKworCW5leHRfcnhfcGFnZSA9IGZpcnN0X3J4X3BhZ2UgPSBERTYyMF9SWF9TVEFSVF9QQUdFOworCWlmIChuaWNfZGF0YS5SQU1fU2l6ZSkKKwkJbGFzdF9yeF9wYWdlID0gbmljX2RhdGEuUkFNX1NpemUgLSAxOworCWVsc2UgLyogNjRrIFJBTSAqLworCQlsYXN0X3J4X3BhZ2UgPSAyNTU7CisKKwlkZTYyMF9zZXRfcmVnaXN0ZXIoZGV2LCBXX1NQUiwgZmlyc3RfcnhfcGFnZSk7IC8qIFN0YXJ0IFBhZ2UgUmVnaXN0ZXIqLworCWRlNjIwX3NldF9yZWdpc3RlcihkZXYsIFdfRVBSLCBsYXN0X3J4X3BhZ2UpOyAgLyogRW5kIFBhZ2UgUmVnaXN0ZXIgKi8KKwlkZTYyMF9zZXRfcmVnaXN0ZXIoZGV2LCBXX0NQUiwgZmlyc3RfcnhfcGFnZSk7LypDdXJyZW50IFBhZ2UgUmVnaXN0ZXIqLworCWRlNjIwX3NlbmRfY29tbWFuZChkZXYsIFdfTlBSIHwgZmlyc3RfcnhfcGFnZSk7IC8qIE5leHQgUGFnZSBSZWdpc3RlciovCisJZGU2MjBfc2VuZF9jb21tYW5kKGRldiwgV19EVU1NWSk7CisJZGU2MjBfc2V0X2RlbGF5KGRldik7CisKKwkvKiBGaW5hbCBzYW5pdHkgY2hlY2s6IEFueWJvZHkgb3V0IHRoZXJlPyAqLworCS8qIExldCdzIGhvcGUgc29tZSBiaXRzIGZyb20gdGhlIHN0YXR1c3JlZ2lzdGVyIG1ha2UgYSBnb29kIGNoZWNrICovCisjZGVmaW5lIENIRUNLX01BU0sgKCAgMCB8IFRYU1VDIHwgIFQxNiAgfCAgMCAgfCBSWENSQyB8IFJYU0hPUlQgfCAgMCAgfCAgMCAgKQorI2RlZmluZSBDSEVDS19PSyAgICggIDAgfCAgIDAgICB8ICAwICAgIHwgIDAgIHwgICAwICAgfCAgIDAgICAgIHwgIDAgIHwgIDAgICkKKyAgICAgICAgLyogc3VjY2VzczogICBYICAgICAwICAgICAgMCAgICAgICBYICAgICAgMCAgICAgICAwICAgICAgICBYICAgICBYICAqLworICAgICAgICAvKiBpZ25vcmU6ICAgRUVESSAgICAgICAgICAgICAgICBSWEdPT0QgICAgICAgICAgICAgICAgICAgQ09MUyAgTE5LUyovCisKKwlpZiAoKChpID0gZGU2MjBfZ2V0X3JlZ2lzdGVyKGRldiwgUl9TVFMpKSAmIENIRUNLX01BU0spICE9IENIRUNLX09LKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFNvbWV0aGluZyBoYXMgaGFwcGVuZWQgdG8gdGhlIERFLTYyMCEgIFBsZWFzZSBjaGVjayBpdCIKKyNpZmRlZiBTSFVURE9XTl9XSEVOX0xPU1QKKwkJCSIgYW5kIGRvIGEgbmV3IGlmY29uZmlnIgorI2VuZGlmCisJCQkiISAoJTAyeClcbiIsIGRldi0+bmFtZSwgaSk7CisjaWZkZWYgU0hVVERPV05fV0hFTl9MT1NUCisJCS8qIEdvb2RieWUsIGNydWVsIHdvcmxkLi4uICovCisJCWRldi0+ZmxhZ3MgJj0gfklGRl9VUDsKKwkJZGU2MjBfY2xvc2UoZGV2KTsKKyNlbmRpZgorCQl3YXNfZG93biA9IDE7CisJCXJldHVybiAxOyAvKiBmYWlsZWQgKi8KKwl9CisJaWYgKHdhc19kb3duKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUaGFua3MsIEkgZmVlbCBtdWNoIGJldHRlciBub3chXG4iLCBkZXYtPm5hbWUpOworCQl3YXNfZG93biA9IDA7CisJfQorCisJLyogQWxsIE9LLCBnbyBhaGVhZC4uLiAqLworCWRlNjIwX3NldF9yZWdpc3RlcihkZXYsIFdfVENSLCBUQ1JfREVGKTsKKworCXJldHVybiAwOyAvKiBhbGwgb2sgKi8KK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBPbmx5IHN0YXJ0LXVwIGNvZGUgYmVsb3cKKyAqCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBERS02MjAgY29ubmVjdGVkCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGRlNjIwX3Byb2JlKGludCB1bml0KQoreworCWJ5dGUgY2hlY2tieXRlID0gMHhhNTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBlcnIgPSAtRU5PTUVNOworCWludCBpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0OworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJc3Bpbl9sb2NrX2luaXQoJmRlNjIwX2xvY2spOworCQorCS8qCisJICogVGhpcyBpcyB3aGVyZSB0aGUgYmFzZV9hZGRyIGFuZCBpcnEgZ2V0cyBzZXQuCisJICogVHVuYWJsZSBhdCBjb21waWxlLXRpbWUgYW5kIGluc21vZC10aW1lCisJICovCisJZGV2LT5iYXNlX2FkZHIgPSBpbzsKKwlkZXYtPmlycSAgICAgICA9IGlycTsKKworCS8qIGFsbG93IG92ZXJyaWRpbmcgcGFyYW1ldGVycyBvbiBjb21tYW5kIGxpbmUgKi8KKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwl9CisJCisJaWYgKGRlNjIwX2RlYnVnKQorCQlwcmludGsodmVyc2lvbik7CisKKwlwcmludGsoS0VSTl9JTkZPICJELUxpbmsgREUtNjIwIHBvY2tldCBhZGFwdGVyIik7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCAzLCAiZGU2MjAiKSkgeworCQlwcmludGsoIiBpbyAweCUzbFgsIHdoaWNoIGlzIGJ1c3kuXG4iLCBkZXYtPmJhc2VfYWRkcik7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQxOworCX0KKworCS8qIEluaXRpYWxseSwgY29uZmlndXJlIGJhc2ljIG5pYmJsZSBtb2RlLCBzbyB3ZSBjYW4gcmVhZCB0aGUgRUVQUk9NICovCisJTklDX0NtZCA9IERFRl9OSUNfQ01EOworCWRlNjIwX3NldF9yZWdpc3RlcihkZXYsIFdfRUlQLCBFSVBSZWdpc3Rlcik7CisKKwkvKiBBbnlib2R5IG91dCB0aGVyZT8gKi8KKwlkZTYyMF9zZXRfcmVnaXN0ZXIoZGV2LCBXX0NQUiwgY2hlY2tieXRlKTsKKwljaGVja2J5dGUgPSBkZTYyMF9nZXRfcmVnaXN0ZXIoZGV2LCBSX0NQUik7CisKKwlpZiAoKGNoZWNrYnl0ZSAhPSAweGE1KSB8fCAocmVhZF9lZXByb20oZGV2KSAhPSAwKSkgeworCQlwcmludGsoIiBub3QgaWRlbnRpZmllZCBpbiB0aGUgcHJpbnRlciBwb3J0XG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXQyOworCX0KKworCS8qIGVsc2UsIGdvdCBpdCEgKi8KKwlwcmludGsoIiwgRXRoZXJuZXQgQWRkcmVzczogJTIuMlgiLAorCQlkZXYtPmRldl9hZGRyWzBdID0gbmljX2RhdGEuTm9kZUlEWzBdKTsKKwlmb3IgKGkgPSAxOyBpIDwgRVRIX0FMRU47IGkrKykgeworCQlwcmludGsoIjolMi4yWCIsIGRldi0+ZGV2X2FkZHJbaV0gPSBuaWNfZGF0YS5Ob2RlSURbaV0pOworCQlkZXYtPmJyb2FkY2FzdFtpXSA9IDB4ZmY7CisJfQorCisJcHJpbnRrKCIgKCVkayBSQU0sIiwKKwkJKG5pY19kYXRhLlJBTV9TaXplKSA/IChuaWNfZGF0YS5SQU1fU2l6ZSA+PiAyKSA6IDY0KTsKKworCWlmIChuaWNfZGF0YS5NZWRpYSA9PSAxKQorCQlwcmludGsoIiBCTkMpXG4iKTsKKwllbHNlCisJCXByaW50aygiIFVUUClcbiIpOworCisJZGV2LT5nZXRfc3RhdHMgCQk9IGdldF9zdGF0czsKKwlkZXYtPm9wZW4gCQk9IGRlNjIwX29wZW47CisJZGV2LT5zdG9wIAkJPSBkZTYyMF9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCAJPSBkZTYyMF9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dCAJPSBkZTYyMF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBIWioyOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gZGU2MjBfc2V0X211bHRpY2FzdF9saXN0OworCQorCS8qIGJhc2VfYWRkciBhbmQgaXJxIGFyZSBhbHJlYWR5IHNldCwgc2VlIGFib3ZlISAqLworCisJLyogZHVtcCBlZXByb20gKi8KKwlpZiAoZGU2MjBfZGVidWcpIHsKKwkJcHJpbnRrKCJcbkVFUFJPTSBjb250ZW50czpcbiIpOworCQlwcmludGsoIlJBTV9TaXplID0gMHglMDJYXG4iLCBuaWNfZGF0YS5SQU1fU2l6ZSk7CisJCXByaW50aygiTm9kZUlEID0gJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJCQluaWNfZGF0YS5Ob2RlSURbMF0sIG5pY19kYXRhLk5vZGVJRFsxXSwKKwkJCW5pY19kYXRhLk5vZGVJRFsyXSwgbmljX2RhdGEuTm9kZUlEWzNdLAorCQkJbmljX2RhdGEuTm9kZUlEWzRdLCBuaWNfZGF0YS5Ob2RlSURbNV0pOworCQlwcmludGsoIk1vZGVsID0gJWRcbiIsIG5pY19kYXRhLk1vZGVsKTsKKwkJcHJpbnRrKCJNZWRpYSA9ICVkXG4iLCBuaWNfZGF0YS5NZWRpYSk7CisJCXByaW50aygiU0NSID0gMHglMDJ4XG4iLCBuaWNfZGF0YS5TQ1IpOworCX0KKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MjsKKwlyZXR1cm4gZGV2OworCitvdXQyOgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCAzKTsKK291dDE6CisJZnJlZV9uZXRkZXYoZGV2KTsKK291dDoKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZWFkIGluZm8gZnJvbSBvbi1ib2FyZCBFRVBST00KKyAqCisgKiBOb3RlOiBCaXR3aXNlIHNlcmlhbCBJL08gdG8vZnJvbSB0aGUgRUVQUk9NIHZpIHRoZSBzdGF0dXMgX3JlZ2lzdGVyXyEKKyAqLworI2RlZmluZSBzZW5kaXQoZGV2LGRhdGEpIGRlNjIwX3NldF9yZWdpc3RlcihkZXYsIFdfRUlQLCBkYXRhIHwgRUlQUmVnaXN0ZXIpOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgX19pbml0IFJlYWRBV29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZnJvbSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBkYXRhOworCWludCBuYml0czsKKworCS8qIGNzICAgW19ffn5dIFNFVCBTRU5EIFNUQVRFICovCisJLyogZGkgICBbX19fX10gICAgICAgICAgICAgICAgKi8KKwkvKiBzY2sgIFtffn5fXSAgICAgICAgICAgICAgICAqLworCXNlbmRpdChkZXYsIDApOyBzZW5kaXQoZGV2LCAxKTsgc2VuZGl0KGRldiwgNSk7IHNlbmRpdChkZXYsIDQpOworCisJLyogU2VuZCB0aGUgOS1iaXQgYWRkcmVzcyBmcm9tIHdoZXJlIHdlIHdhbnQgdG8gcmVhZCB0aGUgMTYtYml0IHdvcmQgKi8KKwlmb3IgKG5iaXRzID0gOTsgbmJpdHMgPiAwOyAtLW5iaXRzLCBmcm9tIDw8PSAxKSB7CisJCWlmIChmcm9tICYgMHgwMTAwKSB7IC8qIGJpdCBzZXQ/ICovCisJCQkvKiBjcyAgICBbfn5+fl0gU0VORCAxICovCisJCQkvKiBkaSAgICBbfn5+fl0gICAgICAgICovCisJCQkvKiBzY2sgICBbX35+X10gICAgICAgICovCisJCQlzZW5kaXQoZGV2LCA2KTsgc2VuZGl0KGRldiwgNyk7IHNlbmRpdChkZXYsIDcpOyBzZW5kaXQoZGV2LCA2KTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIGNzICAgIFt+fn5+XSBTRU5EIDAgKi8KKwkJCS8qIGRpICAgIFtfX19fXSAgICAgICAgKi8KKwkJCS8qIHNjayAgIFtffn5fXSAgICAgICAgKi8KKwkJCXNlbmRpdChkZXYsIDQpOyBzZW5kaXQoZGV2LCA1KTsgc2VuZGl0KGRldiwgNSk7IHNlbmRpdChkZXYsIDQpOworCQl9CisJfQorCisJLyogU2hpZnQgaW4gdGhlIDE2LWJpdCB3b3JkLiBUaGUgYml0cyBhcHBlYXIgc2VyaWFsbHkgaW4gRUVESSAoPTB4ODApICovCisJZm9yIChkYXRhID0gMCwgbmJpdHMgPSAxNjsgbmJpdHMgPiAwOyAtLW5iaXRzKSB7CisJCS8qIGNzICAgIFt+fn5+XSBTRU5EIDAgKi8KKwkJLyogZGkgICAgW19fX19dICAgICAgICAqLworCQkvKiBzY2sgICBbX35+X10gICAgICAgICovCisJCXNlbmRpdChkZXYsIDQpOyBzZW5kaXQoZGV2LCA1KTsgc2VuZGl0KGRldiwgNSk7IHNlbmRpdChkZXYsIDQpOworCQlkYXRhID0gKGRhdGEgPDwgMSkgfCAoKGRlNjIwX2dldF9yZWdpc3RlcihkZXYsIFJfU1RTKSAmIEVFREkpID4+IDcpOworCX0KKwkvKiBjcyAgICBbX19fX10gUkVTRVQgU0VORCBTVEFURSAqLworCS8qIGRpICAgIFtfX19fXSAgICAgICAgICAgICAgICAgICovCisJLyogc2NrICAgW19+fl9dICAgICAgICAgICAgICAgICAgKi8KKwlzZW5kaXQoZGV2LCAwKTsgc2VuZGl0KGRldiwgMSk7IHNlbmRpdChkZXYsIDEpOyBzZW5kaXQoZGV2LCAwKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IF9faW5pdCByZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IHdyZDsKKworCS8qIEQtTGluayBFdGhlcm5ldCBhZGRyZXNzZXMgYXJlIGluIHRoZSBzZXJpZXMgIDAwOjgwOmM4OjdYOlhYOlhYOlhYICovCisJd3JkID0gUmVhZEFXb3JkKGRldiwgMHgxYWEpOwkvKiBieXRlcyAwICsgMSBvZiBOb2RlSUQgKi8KKwlpZiAoIWNsb25lICYmICh3cmQgIT0gaHRvbnMoMHgwMDgwKSkpIC8qIFZhbGlkIEQtTGluayBldGhlciBzZXF1ZW5jZT8gKi8KKwkJcmV0dXJuIC0xOyAvKiBOb3BlLCBub3QgYSBERS02MjAgKi8KKwluaWNfZGF0YS5Ob2RlSURbMF0gPSB3cmQgJiAweGZmOworCW5pY19kYXRhLk5vZGVJRFsxXSA9IHdyZCA+PiA4OworCisJd3JkID0gUmVhZEFXb3JkKGRldiwgMHgxYWIpOwkvKiBieXRlcyAyICsgMyBvZiBOb2RlSUQgKi8KKwlpZiAoIWNsb25lICYmICgod3JkICYgMHhmZikgIT0gMHhjOCkpIC8qIFZhbGlkIEQtTGluayBldGhlciBzZXF1ZW5jZT8gKi8KKwkJcmV0dXJuIC0xOyAvKiBOb3BlLCBub3QgYSBERS02MjAgKi8KKwluaWNfZGF0YS5Ob2RlSURbMl0gPSB3cmQgJiAweGZmOworCW5pY19kYXRhLk5vZGVJRFszXSA9IHdyZCA+PiA4OworCisJd3JkID0gUmVhZEFXb3JkKGRldiwgMHgxYWMpOwkvKiBieXRlcyA0ICsgNSBvZiBOb2RlSUQgKi8KKwluaWNfZGF0YS5Ob2RlSURbNF0gPSB3cmQgJiAweGZmOworCW5pY19kYXRhLk5vZGVJRFs1XSA9IHdyZCA+PiA4OworCisJd3JkID0gUmVhZEFXb3JkKGRldiwgMHgxYWQpOwkvKiBSQU0gc2l6ZSBpbiBwYWdlcyAoMjU2IGJ5dGVzKS4gMCA9IDY0ayAqLworCW5pY19kYXRhLlJBTV9TaXplID0gKHdyZCA+PiA4KTsKKworCXdyZCA9IFJlYWRBV29yZChkZXYsIDB4MWFlKTsJLyogaGFyZHdhcmUgbW9kZWwgKENUID0gMykgKi8KKwluaWNfZGF0YS5Nb2RlbCA9ICh3cmQgJiAweGZmKTsKKworCXdyZCA9IFJlYWRBV29yZChkZXYsIDB4MWFmKTsgLyogbWVkaWEgKGluZGljYXRlcyBCTkMvVVRQKSAqLworCW5pY19kYXRhLk1lZGlhID0gKHdyZCAmIDB4ZmYpOworCisJd3JkID0gUmVhZEFXb3JkKGRldiwgMHgxYTgpOyAvKiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCW5pY19kYXRhLlNDUiA9ICh3cmQgPj4gOCk7CisKKwlyZXR1cm4gMDsgLyogbm8gZXJyb3JzICovCit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTG9hZGFibGUgbW9kdWxlIHNrZWxldG9uCisgKgorICovCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRlNjIwX2RldjsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJZGU2MjBfZGV2ID0gZGU2MjBfcHJvYmUoLTEpOworCWlmIChJU19FUlIoZGU2MjBfZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIoZGU2MjBfZGV2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KGRlNjIwX2Rldik7CisJcmVsZWFzZV9yZWdpb24oZGU2MjBfZGV2LT5iYXNlX2FkZHIsIDMpOworCWZyZWVfbmV0ZGV2KGRlNjIwX2Rldik7Cit9CisjZW5kaWYgLyogTU9EVUxFICovCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKwwKKy8qCisgKiAoYWRkICctRE1PRFVMRScgd2hlbiBjb21waWxpbmcgYXMgbG9hZGFibGUgbW9kdWxlKQorICoKKyAqIGNvbXBpbGUtY29tbWFuZDoKKyAqCWdjYyAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgXAorICoJIC1mb21pdC1mcmFtZS1wb2ludGVyIC1tNDg2IFwKKyAqCS1JL3Vzci9zcmMvbGludXgvaW5jbHVkZSAtSS4uLy4uL25ldC9pbmV0IC1jIGRlNjIwLmMKKyovCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGtlcm5lbC1jb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX0tFUk5FTF9fIC1JbGludXgvaW5jbHVkZSAtSS4uLy4uL25ldC9pbmV0IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1tNDg2IC1jIGRlNjIwLmMiCisgKiAgbW9kdWxlLWNvbXBpbGUtY29tbWFuZDogImdjYyAtRF9fS0VSTkVMX18gLURNT0RVTEUgLUlsaW51eC9pbmNsdWRlIC1JLi4vLi4vbmV0L2luZXQgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgLW00ODYgLWMgZGU2MjAuYyIKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX0tFUk5FTF9fIC1ETU9EVUxFIC1JbGludXgvaW5jbHVkZSAtSS4uLy4uL25ldC9pbmV0IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1tNDg2IC1jIGRlNjIwLmMiCisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlNjIwLmggYi9kcml2ZXJzL25ldC9kZTYyMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDlhODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kZTYyMC5oCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEZWZpbml0aW9uIG9mIEQtTGluayBERS02MjAgRXRoZXJuZXQgUG9ja2V0IGFkYXB0ZXIgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBERS02MjAncyBDTUQgcG9ydCBDb21tYW5kICovCisjZGVmaW5lIENTMAkJMHgwOAkvKiAxLT4wIGNvbW1hbmQgc3Ryb2JlICovCisjZGVmaW5lIElDRU4JCTB4MDQJLyogMD1lbmFibGUgREwzNTIwIGhvc3QgaW50ZXJmYWNlICovCisjZGVmaW5lIERTMAkJMHgwMgkvKiAxLT4wIGRhdGEgc3Ryb2JlIDAgKi8KKyNkZWZpbmUgRFMxCQkweDAxCS8qIDEtPjAgZGF0YSBzdHJvYmUgMSAqLworCisjZGVmaW5lIFdESVIJCTB4MjAJLyogZ2VuZXJhbCAwPXJlYWQgIDE9d3JpdGUgKi8KKyNkZWZpbmUgUkRJUgkJMHgwMAkvKiAgKG5vdCAxMDAlIGNvbmZpcm0gKSAqLworI2RlZmluZSBQUzJXRElSCQkweDAwCS8qIHBzLzIgbW9kZSAxPXJlYWQsIDA9d3JpdGUgKi8KKyNkZWZpbmUgUFMyUkRJUgkJMHgyMAorCisjZGVmaW5lIElSUUVOCQkweDEwCS8qIDEgPSBlbmFibGUgcHJpbnRlciBJUlEgbGluZSAqLworI2RlZmluZSBTRUxFQ1RJTgkweDA4CS8qIDEgPSBzZWxlY3QgcHJpbnRlciAqLworI2RlZmluZSBJTklUUAkJMHgwNAkvKiAwID0gaW5pdGlhbCBwcmludGVyICovCisjZGVmaW5lIEFVVE9GRUVECTB4MDIJLyogMSA9IHByaW50ZXIgYXV0byBmb3JtIGZlZWQgKi8KKyNkZWZpbmUgU1RST0JFCQkweDAxCS8qIDAtPjEgZGF0YSBzdHJvYmUgKi8KKworI2RlZmluZSBSRVNFVAkJMHgwOAorI2RlZmluZSBOSVMwCQkweDIwCS8qIDAgPSBCTkMsIDEgPSBVVFAgKi8KKyNkZWZpbmUgTkNUTDAJCTB4MTAKKworLyogREUtNjIwIERJQyBDb21tYW5kICovCisjZGVmaW5lIFdfRFVNTVkJCTB4MDAJLyogRElDIHJlc2VydmVkIGNvbW1hbmQgKi8KKyNkZWZpbmUgV19DUgkJMHgyMAkvKiBESUMgd3JpdGUgY29tbWFuZCByZWdpc3RlciAqLworI2RlZmluZSBXX05QUgkJMHg0MAkvKiBESUMgd3JpdGUgTmV4dCBQYWdlIFJlZ2lzdGVyICovCisjZGVmaW5lIFdfVEJSCQkweDYwCS8qIERJQyB3cml0ZSBUeCBCeXRlIENvdW50IDEgcmVnICovCisjZGVmaW5lIFdfUlNBCQkweDgwCS8qIERJQyB3cml0ZSBSZW1vdGUgU3RhcnQgQWRkciAxICovCisKKy8qIERFLTYyMCdzIFNUQVQgcG9ydCBiaXRzIDctNCAqLworI2RlZmluZSBFTVBUWQkJMHg4MAkvKiAxID0gcmVjZWl2ZSBidWZmZXIgZW1wdHkgKi8KKyNkZWZpbmUgSU5UTEVWRUwJMHg0MAkvKiAxID0gaW50ZXJydXB0IGxldmVsIGlzIGhpZ2ggKi8KKyNkZWZpbmUgVFhCRjEJCTB4MjAJLyogMSA9IHRyYW5zbWl0IGJ1ZmZlciAxIGlzIGluIHVzZSAqLworI2RlZmluZSBUWEJGMAkJMHgxMAkvKiAxID0gdHJhbnNtaXQgYnVmZmVyIDAgaXMgaW4gdXNlICovCisjZGVmaW5lIFJFQURZCQkweDA4CS8qIDEgPSBoL3cgcmVhZHkgdG8gYWNjZXB0IGNtZC9kYXRhICovCisKKy8qIElEQyAxIENvbW1hbmQgKi8KKyNkZWZpbmUJV19SU0ExCQkweGEwCS8qIHdyaXRlIHJlbW90ZSBzdGFydCBhZGRyZXNzIDEgKi8KKyNkZWZpbmUJV19SU0EwCQkweGExCS8qIHdyaXRlIHJlbW90ZSBzdGFydCBhZGRyZXNzIDAgKi8KKyNkZWZpbmUJV19OUFJGCQkweGEyCS8qIHdyaXRlIG5leHQgcGFnZSByZWdpc3RlciBOUFIxNS1OUFI4ICovCisjZGVmaW5lCVdfREZSCQkweGEzCS8qIHdyaXRlIGRlbGF5IGZhY3RvciByZWdpc3RlciAqLworI2RlZmluZQlXX0NQUgkJMHhhNAkvKiB3cml0ZSBjdXJyZW50IHBhZ2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJV19TUFIJCTB4YTUJLyogd3JpdGUgc3RhcnQgcGFnZSByZWdpc3RlciAqLworI2RlZmluZQlXX0VQUgkJMHhhNgkvKiB3cml0ZSBlbmQgcGFnZSByZWdpc3RlciAqLworI2RlZmluZQlXX1NDUgkJMHhhNwkvKiB3cml0ZSBzeXN0ZW0gY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZQlXX1RDUgkJMHhhOAkvKiB3cml0ZSBUcmFuc2NlaXZlciBDb25maWd1cmF0aW9uIHJlZyAqLworI2RlZmluZQlXX0VJUAkJMHhhOQkvKiB3cml0ZSBFRVBNIEludGVyZmFjZSBwb3J0ICovCisjZGVmaW5lCVdfUEFSMAkJMHhhYQkvKiB3cml0ZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJV19QQVIxCQkweGFiCS8qIHdyaXRlIHBoeXNpY2FsIGFkZHJlc3MgcmVnaXN0ZXIgMSAqLworI2RlZmluZQlXX1BBUjIJCTB4YWMJLyogd3JpdGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpc3RlciAyICovCisjZGVmaW5lCVdfUEFSMwkJMHhhZAkvKiB3cml0ZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUJV19QQVI0CQkweGFlCS8qIHdyaXRlIHBoeXNpY2FsIGFkZHJlc3MgcmVnaXN0ZXIgNCAqLworI2RlZmluZQlXX1BBUjUJCTB4YWYJLyogd3JpdGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpc3RlciA1ICovCisKKy8qIElEQyAyIENvbW1hbmQgKi8KKyNkZWZpbmUJUl9TVFMJCTB4YzAJLyogcmVhZCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUl9DUFIJCTB4YzEJLyogcmVhZCBjdXJyZW50IHBhZ2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUl9CUFIJCTB4YzIJLyogcmVhZCBib3VuZGFyeSBwYWdlIHJlZ2lzdGVyICovCisjZGVmaW5lCVJfVERSCQkweGMzCS8qIHJlYWQgdGltZSBkb21haW4gcmVmbGVjdG9tZXRyeSByZWcgKi8KKworLyogU1RBVFVTIFJlZ2lzdGVyICovCisjZGVmaW5lIEVFREkJCTB4ODAJLyogRUVQTSBETyBwaW4gKi8KKyNkZWZpbmUgVFhTVUMJCTB4NDAJLyogdHggc3VjY2VzcyAqLworI2RlZmluZSBUMTYJCTB4MjAJLyogdHggZmFpbCAxNiB0aW1lcyAqLworI2RlZmluZSBUUzEJCTB4NDAJLyogMD1UeCBzdWNjZXNzLCAxPVQxNiAqLworI2RlZmluZSBUUzAJCTB4MjAJLyogMD1UeCBzdWNjZXNzLCAxPVQxNiAqLworI2RlZmluZSBSWEdPT0QJCTB4MTAJLyogcnggYSBnb29kIHBhY2tldCAqLworI2RlZmluZSBSWENSQwkJMHgwOAkvKiByeCBhIENSQyBlcnJvciBwYWNrZXQgKi8KKyNkZWZpbmUgUlhTSE9SVAkJMHgwNAkvKiByeCBhIHNob3J0IHBhY2tldCAqLworI2RlZmluZSBDT0xTCQkweDAyCS8qIGNvYXhpYWwgY29sbGlzaW9uIHN0YXR1cyAqLworI2RlZmluZSBMTktTCQkweDAxCS8qIFVUUCBsaW5rIHN0YXR1cyAqLworCisvKiBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIENMRUFSCQkweDEwCS8qIHJlc2V0IHBhcnQgb2YgaGFyZHdhcmUgKi8KKyNkZWZpbmUgTk9QRVIJCTB4MDgJLyogTm8gT3BlcmF0aW9uICovCisjZGVmaW5lIFJOT1AJCTB4MDgKKyNkZWZpbmUgUlJBCQkweDA2CS8qIEFmdGVyIFJSIHRoZW4gYXV0by1hZHZhbmNlIE5QUiAmIEJQUig9TlBSLTEpICovCisjZGVmaW5lIFJSTgkJMHgwNAkvKiBOb3JtYWwgUmVtb3RlIFJlYWQgbW9kZSAqLworI2RlZmluZSBSVzEJCTB4MDIJLyogUmVtb3RlIFdyaXRlIHR4IGJ1ZmZlciAxICAoIHBhZ2UgNiAtIDExICkgKi8KKyNkZWZpbmUgUlcwCQkweDAwCS8qIFJlbW90ZSBXcml0ZSB0eCBidWZmZXIgMCAgKCBwYWdlIDAgLSA1ICkgKi8KKyNkZWZpbmUgVFhFTgkJMHgwMQkvKiAwLT4xIHR4IGVuYWJsZSAqLworCisvKiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBURVNUT04JCTB4ODAJLyogdGVzdCBob3N0IGRhdGEgdHJhbnNmZXIgcmVsaWFiaWxpdHkgKi8KKyNkZWZpbmUgU0xFRVAJCTB4NDAJLyogc2xlZXAgbW9kZSAqLworI2lmIDAKKyNkZWZpbmUgRkFTVE1PREUJMHgwNAkvKiBmYXN0IG1vZGUgZm9yIGludGVsIDgyMzYwU0wgZmFzdCBtb2RlICovCisjZGVmaW5lIEJZVEVNT0RFCTB4MDIJLyogYnl0ZSBtb2RlICovCisjZWxzZQorI2RlZmluZSBGQVNUTU9ERQkweDIwCS8qIGZhc3QgbW9kZSBmb3IgaW50ZWwgODIzNjBTTCBmYXN0IG1vZGUgKi8KKyNkZWZpbmUgQllURU1PREUJMHgxMAkvKiBieXRlIG1vZGUgKi8KKyNlbmRpZgorI2RlZmluZSBOSUJCTEVNT0RFCTB4MDAJLyogbmliYmxlIG1vZGUgKi8KKyNkZWZpbmUgSVJRSU5WCQkweDA4CS8qIHR1cm4gb2ZmIElSUSBsaW5lIGludmVydGVyICovCisjZGVmaW5lIElSUU5NTAkJMHgwMAkvKiB0dXJuIG9uIElSUSBsaW5lIGludmVydGVyICovCisjZGVmaW5lIElOVE9OCQkweDA0CisjZGVmaW5lIEFVVE9GRlNFVAkweDAyCS8qIGF1dG8gc2hpZnQgYWRkcmVzcyB0byBUUFIrMTIgKi8KKyNkZWZpbmUgQVVUT1RYCQkweDAxCS8qIGF1dG8gdHggd2hlbiBsZWF2ZSBSVyBtb2RlICovCisKKy8qIFRyYW5zY2VpdmVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSkFCQkVSCQkweDgwCS8qIGdlbmVyYXRlIGphYmJlciBjb25kaXRpb24gKi8KKyNkZWZpbmUgVFhTVUNJTlQJMHg0MAkvKiBlbmFibGUgdHggc3VjY2VzcyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVDE2SU5UCQkweDIwCS8qIGVuYWJsZSBUMTYgaW50ZXJydXB0ICovCisjZGVmaW5lIFJYRVJSUEtUCTB4MTAJLyogYWNjZXB0IENSQyBlcnJvciBvciBzaG9ydCBwYWNrZXQgKi8KKyNkZWZpbmUgRVhURVJOQUxCMgkweDBDCS8qIGV4dGVybmFsIGxvb3BiYWNrIDIgKi8KKyNkZWZpbmUgRVhURVJOQUxCMQkweDA4CS8qIGV4dGVybmFsIGxvb3BiYWNrIDEgKi8KKyNkZWZpbmUgSU5URVJOQUxCCTB4MDQJLyogaW50ZXJuYWwgbG9vcGJhY2sgKi8KKyNkZWZpbmUgTk1MT1BFUkFURQkweDAwCS8qIG5vcm1hbCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgUlhQQk0JCTB4MDMJLyogcnggcGh5c2ljYWwsIGJyb2FkY2FzdCwgbXVsdGljYXN0ICovCisjZGVmaW5lIFJYUEIJCTB4MDIJLyogcnggcGh5c2ljYWwsIGJyb2FkY2FzdCAqLworI2RlZmluZSBSWEFMTAkJMHgwMQkvKiByeCBhbGwgcGFja2V0ICovCisjZGVmaW5lIFJYT0ZGCQkweDAwCS8qIHJ4IGRpc2FibGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlY2xhbmNlLmMgYi9kcml2ZXJzL25ldC9kZWNsYW5jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMWM4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kZWNsYW5jZS5jCkBAIC0wLDAgKzEsMTMyMCBAQAorLyogICAgIAorICogICAgTGFuY2UgZXRoZXJuZXQgZHJpdmVyIGZvciB0aGUgTUlQUyBwcm9jZXNzb3IgYmFzZWQKKyAqICAgICAgREVDc3RhdGlvbiBmYW1pbHkKKyAqCisgKgorICogICAgICBhZG9wdGVkIGZyb20gc3VubGFuY2UuYyBieSBSaWNoYXJkIHZhbiBkZW4gQmVyZworICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBNYWNpZWogVy4gUm96eWNraQorICoKKyAqICAgICAgYWRkaXRpb25hbCBzb3VyY2VzOgorICogICAgICAtIFBNQUQtQUEgVFVSQk9jaGFubmVsIEV0aGVybmV0IE1vZHVsZSBGdW5jdGlvbmFsIFNwZWNpZmljYXRpb24sCisgKiAgICAgICAgUmV2aXNpb24gMS4yCisgKgorICogICAgICBIaXN0b3J5OgorICoKKyAqICAgICAgdjAuMDAxOiBUaGUga2VybmVsIGFjY2VwdHMgdGhlIGNvZGUgYW5kIGl0IHNob3dzIHRoZSBoYXJkd2FyZSBhZGRyZXNzLgorICoKKyAqICAgICAgdjAuMDAyOiBSZW1vdmVkIG1vc3Qgc3BhcmMgc3R1ZmYsIGxlZnQgb25seSBzb21lIG1vZHVsZSBhbmQgZG1hIHN0dWZmLgorICoKKyAqICAgICAgdjAuMDAzOiBFbmhhbmNlZCBiYXNlIGFkZHJlc3MgY2FsY3VsYXRpb24gZnJvbSBwcm9wb3NhbHMgYnkKKyAqICAgICAgICAgICAgICBIYXJhbGQgS29lcmZnZW4gYW5kIFRob21hcyBSaWVtZXIuCisgKgorICogICAgICB2MC4wMDQ6IGxhbmNlLXJlZ3MgaXMgcG9pbnRpbmcgYXQgdGhlIHJpZ2h0IGFkZHJlc3NlcywgYWRkZWQgcHJvbQorICogICAgICAgICAgICAgIGNoZWNrLiBGaXJzdCBzdGFydCBvZiBhZGRyZXNzIG1hcHBpbmcgYW5kIERNQS4KKyAqCisgKiAgICAgIHYwLjAwNTogc3RhcnRlZCB0byBwbGF5IGFyb3VuZCB3aXRoIExBTkNFLURNQS4gVGhpcyBkcml2ZXIgd2lsbCBub3QKKyAqICAgICAgICAgICAgICB3b3JrIGZvciBub24gSU9BU0lDIGxhbmNlcy4gSEsKKyAqCisgKiAgICAgIHYwLjAwNjogYWRkZWQgcG9pbnRlciBhcnJheXMgdG8gbGFuY2VfcHJpdmF0ZSBhbmQgc2V0dXAgcm91dGluZSBmb3IKKyAqICAgICAgICAgICAgICB0aGVtIGluIGRlY19sYW5jZV9pbml0LiBISworICoKKyAqICAgICAgdjAuMDA3OiBCaWcgc2hpdC4gVGhlIExBTkNFIHNlZW1zIHRvIHVzZSBhIGRpZmZlcmVudCBETUEgbWVjaGFuaXNtIHRvCisgKiAgICAgICAgICAgICAgYWNjZXNzIHRoZSBpbml0IGJsb2NrLiBUaGlzIGxvb2tzIGxpa2Ugb25lIChzaG9ydCkgd29yZCBhdCBhCisgKiAgICAgICAgICAgICAgdGltZSwgYnV0IHRoZSBzbWFsbGVzdCBhbW91bnQgdGhlIElPQVNJQyBjYW4gdHJhbnNmZXIgaXMgYQorICogICAgICAgICAgICAgIChsb25nKSB3b3JkLiBTbyB3ZSBoYXZlIGEgMi0yIHBhZGRpbmcgaGVyZS4gQ2hhbmdlZAorICogICAgICAgICAgICAgIGxhbmNlX2luaXRfYmxvY2sgYWNjb3JkaW5nbHkuIFRoZSAxNi0xNiBwYWRkaW5nIGZvciB0aGUgYnVmZmVycworICogICAgICAgICAgICAgIHNlZW1zIHRvIGJlIGNvcnJlY3QuIEhLCisgKgorICogICAgICB2MC4wMDg6IG1vZHMgdG8gbWFrZSBQTUFYX0xBTkNFIHdvcmsuIDAxLzA5LzE5OTkgdHJpZW1lcgorICoKKyAqICAgICAgdjAuMDA5OiBNb2R1bGUgc3VwcG9ydCBmaXhlcywgbXVsdGlwbGUgaW50ZXJmYWNlcyBzdXBwb3J0LCB2YXJpb3VzCisgKiAgICAgICAgICAgICAgYml0cy4gbWFjcm8KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgorI2luY2x1ZGUgPGFzbS9kZWMvaW50ZXJydXB0cy5oPgorI2luY2x1ZGUgPGFzbS9kZWMvaW9hc2ljLmg+CisjaW5jbHVkZSA8YXNtL2RlYy9pb2FzaWNfYWRkcnMuaD4KKyNpbmNsdWRlIDxhc20vZGVjL2tuMDEuaD4KKyNpbmNsdWRlIDxhc20vZGVjL21hY2h0eXBlLmg+CisjaW5jbHVkZSA8YXNtL2RlYy90Yy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorImRlY2xhbmNlLmM6IHYwLjAwOSBieSBMaW51eCBNSVBTIERFQ3N0YXRpb24gdGFzayBmb3JjZVxuIjsKKworTU9EVUxFX0FVVEhPUigiTGludXggTUlQUyBERUNzdGF0aW9uIHRhc2sgZm9yY2UiKTsKK01PRFVMRV9ERVNDUklQVElPTigiREVDIExBTkNFIChERUNzdGF0aW9uIG9uYm9hcmQsIFBNQUQteHgpIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogY2FyZCB0eXBlcworICovCisjZGVmaW5lIEFTSUNfTEFOQ0UgMQorI2RlZmluZSBQTUFEX0xBTkNFIDIKKyNkZWZpbmUgUE1BWF9MQU5DRSAzCisKKyNpZm5kZWYgQ09ORklHX1RDCit1bnNpZ25lZCBsb25nIHN5c3RlbV9iYXNlOwordW5zaWduZWQgbG9uZyBkbWFwdHI7CisjZW5kaWYKKworI2RlZmluZSBMRV9DU1IwIDAKKyNkZWZpbmUgTEVfQ1NSMSAxCisjZGVmaW5lIExFX0NTUjIgMgorI2RlZmluZSBMRV9DU1IzIDMKKworI2RlZmluZSBMRV9NT19QUk9NICAgICAgMHg4MDAwCS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisKKyNkZWZpbmUJTEVfQzBfRVJSCTB4ODAwMAkvKiBFcnJvcjogc2V0IGlmIEJBQiwgU1FFLCBNSVNTIG9yIE1FIGlzIHNldCAqLworI2RlZmluZQlMRV9DMF9CQUJMCTB4NDAwMAkvKiBCQUI6ICBCYWJibGU6IHR4IHRpbWVvdXQuICovCisjZGVmaW5lCUxFX0MwX0NFUlIJMHgyMDAwCS8qIFNRRTogIFNpZ25hbCBxdWFsaXR5IGVycm9yICovCisjZGVmaW5lCUxFX0MwX01JU1MJMHgxMDAwCS8qIE1JU1M6IE1pc3NlZCBhIHBhY2tldCAqLworI2RlZmluZQlMRV9DMF9NRVJSCTB4MDgwMAkvKiBNRTogICBNZW1vcnkgZXJyb3IgKi8KKyNkZWZpbmUJTEVfQzBfUklOVAkweDA0MDAJLyogUmVjZWl2ZWQgaW50ZXJydXB0ICovCisjZGVmaW5lCUxFX0MwX1RJTlQJMHgwMjAwCS8qIFRyYW5zbWl0dGVyIEludGVycnVwdCAqLworI2RlZmluZQlMRV9DMF9JRE9OCTB4MDEwMAkvKiBJRklOOiBJbml0IGZpbmlzaGVkLiAqLworI2RlZmluZQlMRV9DMF9JTlRSCTB4MDA4MAkvKiBJbnRlcnJ1cHQgb3IgZXJyb3IgKi8KKyNkZWZpbmUJTEVfQzBfSU5FQQkweDAwNDAJLyogSW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZQlMRV9DMF9SWE9OCTB4MDAyMAkvKiBSZWNlaXZlciBvbiAqLworI2RlZmluZQlMRV9DMF9UWE9OCTB4MDAxMAkvKiBUcmFuc21pdHRlciBvbiAqLworI2RlZmluZQlMRV9DMF9URE1ECTB4MDAwOAkvKiBUcmFuc21pdHRlciBkZW1hbmQgKi8KKyNkZWZpbmUJTEVfQzBfU1RPUAkweDAwMDQJLyogU3RvcCB0aGUgY2FyZCAqLworI2RlZmluZQlMRV9DMF9TVFJUCTB4MDAwMgkvKiBTdGFydCB0aGUgY2FyZCAqLworI2RlZmluZQlMRV9DMF9JTklUCTB4MDAwMQkvKiBJbml0IHRoZSBjYXJkICovCisKKyNkZWZpbmUJTEVfQzNfQlNXUAkweDQJLyogU1dBUCAqLworI2RlZmluZQlMRV9DM19BQ09OCTB4MgkvKiBBTEUgQ29udHJvbCAqLworI2RlZmluZQlMRV9DM19CQ09OCTB4MQkvKiBCeXRlIGNvbnRyb2wgKi8KKworLyogUmVjZWl2ZSBtZXNzYWdlIGRlc2NyaXB0b3IgMSAqLworI2RlZmluZSBMRV9SMV9PV04gICAgICAgMHg4MAkvKiBXaG8gb3ducyB0aGUgZW50cnkgKi8KKyNkZWZpbmUgTEVfUjFfRVJSICAgICAgIDB4NDAJLyogRXJyb3I6IGlmIEZSQSwgT0ZMLCBDUkMgb3IgQlVGIGlzIHNldCAqLworI2RlZmluZSBMRV9SMV9GUkEgICAgICAgMHgyMAkvKiBGUkE6IEZyYW1lIGVycm9yICovCisjZGVmaW5lIExFX1IxX09GTCAgICAgICAweDEwCS8qIE9GTDogRnJhbWUgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgTEVfUjFfQ1JDICAgICAgIDB4MDgJLyogQ1JDIGVycm9yICovCisjZGVmaW5lIExFX1IxX0JVRiAgICAgICAweDA0CS8qIEJVRjogQnVmZmVyIGVycm9yICovCisjZGVmaW5lIExFX1IxX1NPUCAgICAgICAweDAyCS8qIFN0YXJ0IG9mIHBhY2tldCAqLworI2RlZmluZSBMRV9SMV9FT1AgICAgICAgMHgwMQkvKiBFbmQgb2YgcGFja2V0ICovCisjZGVmaW5lIExFX1IxX1BPSyAgICAgICAweDAzCS8qIFBhY2tldCBpcyBjb21wbGV0ZTogU09QICsgRU9QICovCisKKyNkZWZpbmUgTEVfVDFfT1dOICAgICAgIDB4ODAJLyogTGFuY2Ugb3ducyB0aGUgcGFja2V0ICovCisjZGVmaW5lIExFX1QxX0VSUiAgICAgICAweDQwCS8qIEVycm9yIHN1bW1hcnkgKi8KKyNkZWZpbmUgTEVfVDFfRU1PUkUgICAgIDB4MTAJLyogRXJyb3I6IG1vcmUgdGhhbiBvbmUgcmV0cnkgbmVlZGVkICovCisjZGVmaW5lIExFX1QxX0VPTkUgICAgICAweDA4CS8qIEVycm9yOiBvbmUgcmV0cnkgbmVlZGVkICovCisjZGVmaW5lIExFX1QxX0VERUYgICAgICAweDA0CS8qIEVycm9yOiBkZWZlcnJlZCAqLworI2RlZmluZSBMRV9UMV9TT1AgICAgICAgMHgwMgkvKiBTdGFydCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgTEVfVDFfRU9QICAgICAgIDB4MDEJLyogRW5kIG9mIHBhY2tldCAqLworI2RlZmluZSBMRV9UMV9QT0sJMHgwMwkvKiBQYWNrZXQgaXMgY29tcGxldGU6IFNPUCArIEVPUCAqLworCisjZGVmaW5lIExFX1QzX0JVRiAgICAgICAweDgwMDAJLyogQnVmZmVyIGVycm9yICovCisjZGVmaW5lIExFX1QzX1VGTCAgICAgICAweDQwMDAJLyogRXJyb3IgdW5kZXJmbG93ICovCisjZGVmaW5lIExFX1QzX0xDT0wgICAgICAweDEwMDAJLyogRXJyb3IgbGF0ZSBjb2xsaXNpb24gKi8KKyNkZWZpbmUgTEVfVDNfQ0xPUyAgICAgIDB4MDgwMAkvKiBFcnJvciBjYXJyaWVyIGxvc3MgKi8KKyNkZWZpbmUgTEVfVDNfUlRZICAgICAgIDB4MDQwMAkvKiBFcnJvciByZXRyeSAqLworI2RlZmluZSBMRV9UM19URFIgICAgICAgMHgwM2ZmCS8qIFRpbWUgRG9tYWluIFJlZmxlY3RvbWV0cnkgY291bnRlciAqLworCisvKiBEZWZpbmU6IDJeNCBUeCBidWZmZXJzIGFuZCAyXjQgUnggYnVmZmVycyAqLworCisjaWZuZGVmIExBTkNFX0xPR19UWF9CVUZGRVJTCisjZGVmaW5lIExBTkNFX0xPR19UWF9CVUZGRVJTIDQKKyNkZWZpbmUgTEFOQ0VfTE9HX1JYX0JVRkZFUlMgNAorI2VuZGlmCisKKyNkZWZpbmUgVFhfUklOR19TSVpFCQkJKDEgPDwgKExBTkNFX0xPR19UWF9CVUZGRVJTKSkKKyNkZWZpbmUgVFhfUklOR19NT0RfTUFTSwkJKFRYX1JJTkdfU0laRSAtIDEpCisKKyNkZWZpbmUgUlhfUklOR19TSVpFCQkJKDEgPDwgKExBTkNFX0xPR19SWF9CVUZGRVJTKSkKKyNkZWZpbmUgUlhfUklOR19NT0RfTUFTSwkJKFJYX1JJTkdfU0laRSAtIDEpCisKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTUzNgorI2RlZmluZSBSWF9CVUZGX1NJWkUgICAgICAgICAgICBQS1RfQlVGX1NaCisjZGVmaW5lIFRYX0JVRkZfU0laRSAgICAgICAgICAgIFBLVF9CVUZfU1oKKworI3VuZGVmIFRFU1RfSElUUworI2RlZmluZSBaRVJPIDAKKworLyogVGhlIERTMjAwMC8zMDAwIGhhdmUgYSBsaW5lYXIgNjQgS0IgYnVmZmVyLgorCisgKiBUaGUgUE1BRC1BQSBoYXMgMTI4IGtiIGJ1ZmZlciBvbi1ib2FyZC4gCisgKgorICogVGhlIElPQVNJQyBMQU5DRSBkZXZpY2VzIHVzZSBhIHNoYXJlZCBtZW1vcnkgcmVnaW9uLiBUaGlzIHJlZ2lvbiBhcyBzZWVuIAorICogZnJvbSB0aGUgQ1BVIGlzIChtYXgpIDEyOCBLQiBsb25nIGFuZCBoYXMgdG8gYmUgb24gYW4gMTI4IEtCIGJvdW5kYXJ5LgorICogVGhlIExBTkNFIHNlZXMgdGhpcyBhcyBhIDY0IEtCIGxvbmcgY29udGludW91cyBtZW1vcnkgcmVnaW9uLgorICoKKyAqIFRoZSBMQU5DRSdzIERNQSBhZGRyZXNzIGlzIHVzZWQgYXMgYW4gaW5kZXggaW4gdGhpcyBidWZmZXIgYW5kIERNQSB0YWtlcworICogcGxhY2UgaW4gYnVyc3RzIG9mIGVpZ2h0IDE2LUJpdCB3b3JkcyB3aGljaCBhcmUgcGFja2VkIGludG8gZm91ciAzMi1CaXQgd29yZHMKKyAqIGJ5IHRoZSBJT0FTSUMuIFRoaXMgbGVhZHMgdG8gYSBzdHJhbmdlIHBhZGRpbmc6IDE2IGJ5dGVzIG9mIHZhbGlkIGRhdGEgZm9sbG93ZWQKKyAqIGJ5IGEgMTYgYnl0ZSBnYXAgOi0oLgorICovCisKK3N0cnVjdCBsYW5jZV9yeF9kZXNjIHsKKwl1bnNpZ25lZCBzaG9ydCBybWQwOwkJLyogbG93IGFkZHJlc3Mgb2YgcGFja2V0ICovCisJc2hvcnQgZ2FwMDsKKwl1bnNpZ25lZCBjaGFyIHJtZDFfaGFkcjsJLyogaGlnaCBhZGRyZXNzIG9mIHBhY2tldCAqLworCXVuc2lnbmVkIGNoYXIgcm1kMV9iaXRzOwkvKiBkZXNjcmlwdG9yIGJpdHMgKi8KKwlzaG9ydCBnYXAxOworCXNob3J0IGxlbmd0aDsJCQkvKiAycyBjb21wbGVtZW50IChuZWdhdGl2ZSEpCisJCQkJCSAgIG9mIGJ1ZmZlciBsZW5ndGggKi8KKwlzaG9ydCBnYXAyOworCXVuc2lnbmVkIHNob3J0IG1ibGVuZ3RoOwkvKiBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkICovCisJc2hvcnQgZ2FwMzsKK307CisKK3N0cnVjdCBsYW5jZV90eF9kZXNjIHsKKwl1bnNpZ25lZCBzaG9ydCB0bWQwOwkJLyogbG93IGFkZHJlc3Mgb2YgcGFja2V0ICovCisJc2hvcnQgZ2FwMDsKKwl1bnNpZ25lZCBjaGFyIHRtZDFfaGFkcjsJLyogaGlnaCBhZGRyZXNzIG9mIHBhY2tldCAqLworCXVuc2lnbmVkIGNoYXIgdG1kMV9iaXRzOwkvKiBkZXNjcmlwdG9yIGJpdHMgKi8KKwlzaG9ydCBnYXAxOworCXNob3J0IGxlbmd0aDsJCQkvKiAycyBjb21wbGVtZW50IChuZWdhdGl2ZSEpCisJCQkJCSAgIG9mIGJ1ZmZlciBsZW5ndGggKi8KKwlzaG9ydCBnYXAyOworCXVuc2lnbmVkIHNob3J0IG1pc2M7CisJc2hvcnQgZ2FwMzsKK307CisKKworLyogRmlyc3QgcGFydCBvZiB0aGUgTEFOQ0UgaW5pdGlhbGl6YXRpb24gYmxvY2ssIGRlc2NyaWJlZCBpbiBkYXRhYm9vay4gKi8KK3N0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIHsKKwl1bnNpZ25lZCBzaG9ydCBtb2RlOwkJLyogcHJlLXNldCBtb2RlIChyZWcuIDE1KSAqLworCXNob3J0IGdhcDA7CisKKwl1bnNpZ25lZCBjaGFyIHBoeXNfYWRkclsxMl07CS8qIHBoeXNpY2FsIGV0aGVybmV0IGFkZHJlc3MKKwkJCQkJICAgb25seSAwLCAxLCA0LCA1LCA4LCA5IGFyZSB2YWxpZAorCQkJCQkgICAyLCAzLCA2LCA3LCAxMCwgMTEgYXJlIGdhcHMgKi8KKwl1bnNpZ25lZCBzaG9ydCBmaWx0ZXJbOF07CS8qIG11bHRpY2FzdCBmaWx0ZXIKKwkJCQkJICAgb25seSAwLCAyLCA0LCA2IGFyZSB2YWxpZAorCQkJCQkgICAxLCAzLCA1LCA3IGFyZSBnYXBzICovCisKKwkvKiBSZWNlaXZlIGFuZCB0cmFuc21pdCByaW5nIGJhc2UsIGFsb25nIHdpdGggZXh0cmEgYml0cy4gKi8KKwl1bnNpZ25lZCBzaG9ydCByeF9wdHI7CQkvKiByZWNlaXZlIGRlc2NyaXB0b3IgYWRkciAqLworCXNob3J0IGdhcDE7CisJdW5zaWduZWQgc2hvcnQgcnhfbGVuOwkJLyogcmVjZWl2ZSBsZW4gYW5kIGhpZ2ggYWRkciAqLworCXNob3J0IGdhcDI7CisJdW5zaWduZWQgc2hvcnQgdHhfcHRyOwkJLyogdHJhbnNtaXQgZGVzY3JpcHRvciBhZGRyICovCisJc2hvcnQgZ2FwMzsKKwl1bnNpZ25lZCBzaG9ydCB0eF9sZW47CQkvKiB0cmFuc21pdCBsZW4gYW5kIGhpZ2ggYWRkciAqLworCXNob3J0IGdhcDQ7CisJc2hvcnQgZ2FwNVs4XTsKKworCS8qIFRoZSBidWZmZXIgZGVzY3JpcHRvcnMgKi8KKwlzdHJ1Y3QgbGFuY2VfcnhfZGVzYyBicnhfcmluZ1tSWF9SSU5HX1NJWkVdOworCXN0cnVjdCBsYW5jZV90eF9kZXNjIGJ0eF9yaW5nW1RYX1JJTkdfU0laRV07Cit9OworCisjZGVmaW5lIEJVRl9PRkZTRVRfQ1BVIHNpemVvZihzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jaykKKyNkZWZpbmUgQlVGX09GRlNFVF9MTkMgKHNpemVvZihzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayk+PjEpCisKKyNkZWZpbmUgbGliZGVzY19vZmZzZXQocnQsIGVsZW0pIFwKKygoX191MzIpKCgodW5zaWduZWQgbG9uZykoJigoKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopMCktPnJ0W2VsZW1dKSkpKSkKKworLyoKKyAqIFRoaXMgd29ya3MgKm9ubHkqIGZvciB0aGUgcmluZyBkZXNjcmlwdG9ycworICovCisjZGVmaW5lIExBTkNFX0FERFIoeCkgKFBIWVNBRERSKHgpID4+IDEpCisKK3N0cnVjdCBsYW5jZV9wcml2YXRlIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dDsKKwlpbnQgdHlwZTsKKwlpbnQgc2xvdDsKKwlpbnQgZG1hX2lycTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGw7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmluaXRfYmxvY2s7CisKKwlzcGlubG9ja190CWxvY2s7CisKKwlpbnQgcnhfbmV3LCB0eF9uZXc7CisJaW50IHJ4X29sZCwgdHhfb2xkOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKwl1bnNpZ25lZCBzaG9ydCBidXNtYXN0ZXJfcmVndmFsOworCisJc3RydWN0IHRpbWVyX2xpc3QgICAgICAgbXVsdGljYXN0X3RpbWVyOworCisJLyogUG9pbnRlcnMgdG8gdGhlIHJpbmcgYnVmZmVycyBhcyBzZWVuIGZyb20gdGhlIENQVSAqLworCWNoYXIgKnJ4X2J1Zl9wdHJfY3B1W1JYX1JJTkdfU0laRV07CisJY2hhciAqdHhfYnVmX3B0cl9jcHVbVFhfUklOR19TSVpFXTsKKworCS8qIFBvaW50ZXJzIHRvIHRoZSByaW5nIGJ1ZmZlcnMgYXMgc2VlbiBmcm9tIHRoZSBMQU5DRSAqLworCWNoYXIgKnJ4X2J1Zl9wdHJfbG5jW1JYX1JJTkdfU0laRV07CisJY2hhciAqdHhfYnVmX3B0cl9sbmNbVFhfUklOR19TSVpFXTsKK307CisKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwgKChscC0+dHhfb2xkPD1scC0+dHhfbmV3KT9cCisJCQlscC0+dHhfb2xkK1RYX1JJTkdfTU9EX01BU0stbHAtPnR4X25ldzpcCisJCQlscC0+dHhfb2xkIC0gbHAtPnR4X25ldy0xKQorCisvKiBUaGUgbGFuY2UgY29udHJvbCBwb3J0cyBhcmUgYXQgYW4gYWJzb2x1dGUgYWRkcmVzcywgbWFjaGluZSBhbmQgdGMtc2xvdAorICogZGVwZW5kZW50LgorICogREVDc3RhdGlvbnMgZG8gb25seSAzMi1iaXQgYWNjZXNzIGFuZCB0aGUgTEFOQ0UgdXNlcyAxNiBiaXQgYWRkcmVzc2VzLAorICogc28gd2UgaGF2ZSB0byBnaXZlIHRoZSBzdHJ1Y3R1cmUgYW4gZXh0cmEgbWVtYmVyIG1ha2luZyByYXAgcG9pbnRpbmcKKyAqIGF0IHRoZSByaWdodCBhZGRyZXNzCisgKi8KK3N0cnVjdCBsYW5jZV9yZWdzIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCByZHA7CS8qIHJlZ2lzdGVyIGRhdGEgcG9ydCAqLworCXVuc2lnbmVkIHNob3J0IHBhZDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCByYXA7CS8qIHJlZ2lzdGVyIGFkZHJlc3MgcG9ydCAqLworfTsKKworaW50IGRlY19sYW5jZV9kZWJ1ZyA9IDI7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcm9vdF9sYW5jZV9kZXY7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXJlZyh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqcmVncHRyLCBzaG9ydCB2YWx1ZSkKK3sKKwkqcmVncHRyID0gdmFsdWU7CisJaW9iKCk7Cit9CisKKy8qIExvYWQgdGhlIENTUiByZWdpc3RlcnMgKi8KK3N0YXRpYyB2b2lkIGxvYWRfY3NycyhzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApCit7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOworCWludCBsZXB0cjsKKworCS8qIFRoZSBhZGRyZXNzIHNwYWNlIGFzIHNlZW4gZnJvbSB0aGUgTEFOQ0UKKwkgKiBiZWdpbnMgYXQgYWRkcmVzcyAwLiBISworCSAqLworCWxlcHRyID0gMDsKKworCXdyaXRlcmVnKCZsbC0+cmFwLCBMRV9DU1IxKTsKKwl3cml0ZXJlZygmbGwtPnJkcCwgKGxlcHRyICYgMHhGRkZGKSk7CisJd3JpdGVyZWcoJmxsLT5yYXAsIExFX0NTUjIpOworCXdyaXRlcmVnKCZsbC0+cmRwLCBsZXB0ciA+PiAxNik7CisJd3JpdGVyZWcoJmxsLT5yYXAsIExFX0NTUjMpOworCXdyaXRlcmVnKCZsbC0+cmRwLCBscC0+YnVzbWFzdGVyX3JlZ3ZhbCk7CisKKwkvKiBQb2ludCBiYWNrIHRvIGNzcjAgKi8KKwl3cml0ZXJlZygmbGwtPnJhcCwgTEVfQ1NSMCk7Cit9CisKKy8qCisgKiBPdXIgc3BlY2lhbGl6ZWQgY29weSByb3V0aW5lcworICoKKyAqLwordm9pZCBjcF90b19idWYoY29uc3QgaW50IHR5cGUsIHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIHNob3J0ICp0cCwgKmZwLCBjbGVuOworCXVuc2lnbmVkIGNoYXIgKnJ0cCwgKnJmcDsKKworCWlmICh0eXBlID09IFBNQVhfTEFOQ0UpIHsKKwkJY2xlbiA9IGxlbiA+PiAxOworCQl0cCA9ICh1bnNpZ25lZCBzaG9ydCAqKSB0bzsKKwkJZnAgPSAodW5zaWduZWQgc2hvcnQgKikgZnJvbTsKKworCQl3aGlsZSAoY2xlbi0tKSB7CisJCQkqdHArKyA9ICpmcCsrOworCQkJdHArKzsKKwkJfQorCisJCWNsZW4gPSBsZW4gJiAxOworCQlydHAgPSAodW5zaWduZWQgY2hhciAqKSB0cDsKKwkJcmZwID0gKHVuc2lnbmVkIGNoYXIgKikgZnA7CisJCXdoaWxlIChjbGVuLS0pIHsKKwkJCSpydHArKyA9ICpyZnArKzsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIGNvcHkgMTYgQnl0ZSBjaHVua3MKKwkJICovCisJCWNsZW4gPSBsZW4gPj4gNDsKKwkJdHAgPSAodW5zaWduZWQgc2hvcnQgKikgdG87CisJCWZwID0gKHVuc2lnbmVkIHNob3J0ICopIGZyb207CisJCXdoaWxlIChjbGVuLS0pIHsKKwkJCSp0cCsrID0gKmZwKys7CisJCQkqdHArKyA9ICpmcCsrOworCQkJKnRwKysgPSAqZnArKzsKKwkJCSp0cCsrID0gKmZwKys7CisJCQkqdHArKyA9ICpmcCsrOworCQkJKnRwKysgPSAqZnArKzsKKwkJCSp0cCsrID0gKmZwKys7CisJCQkqdHArKyA9ICpmcCsrOworCQkJdHAgKz0gODsKKwkJfQorCisJCS8qCisJCSAqIGRvIHRoZSByZXN0LCBpZiBhbnkuCisJCSAqLworCQljbGVuID0gbGVuICYgMTU7CisJCXJ0cCA9ICh1bnNpZ25lZCBjaGFyICopIHRwOworCQlyZnAgPSAodW5zaWduZWQgY2hhciAqKSBmcDsKKwkJd2hpbGUgKGNsZW4tLSkgeworCQkJKnJ0cCsrID0gKnJmcCsrOworCQl9CisJfQorCisJaW9iKCk7Cit9CisKK3ZvaWQgY3BfZnJvbV9idWYoY29uc3QgaW50IHR5cGUsIHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIHNob3J0ICp0cCwgKmZwLCBjbGVuOworCXVuc2lnbmVkIGNoYXIgKnJ0cCwgKnJmcDsKKworCWlmICh0eXBlID09IFBNQVhfTEFOQ0UpIHsKKwkJY2xlbiA9IGxlbiA+PiAxOworCQl0cCA9ICh1bnNpZ25lZCBzaG9ydCAqKSB0bzsKKwkJZnAgPSAodW5zaWduZWQgc2hvcnQgKikgZnJvbTsKKwkJd2hpbGUgKGNsZW4tLSkgeworCQkJKnRwKysgPSAqZnArKzsKKwkJCWZwKys7CisJCX0KKworCQljbGVuID0gbGVuICYgMTsKKworCQlydHAgPSAodW5zaWduZWQgY2hhciAqKSB0cDsKKwkJcmZwID0gKHVuc2lnbmVkIGNoYXIgKikgZnA7CisKKwkJd2hpbGUgKGNsZW4tLSkgeworCQkJKnJ0cCsrID0gKnJmcCsrOworCQl9CisJfSBlbHNlIHsKKworCQkvKgorCQkgKiBjb3B5IDE2IEJ5dGUgY2h1bmtzCisJCSAqLworCQljbGVuID0gbGVuID4+IDQ7CisJCXRwID0gKHVuc2lnbmVkIHNob3J0ICopIHRvOworCQlmcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBmcm9tOworCQl3aGlsZSAoY2xlbi0tKSB7CisJCQkqdHArKyA9ICpmcCsrOworCQkJKnRwKysgPSAqZnArKzsKKwkJCSp0cCsrID0gKmZwKys7CisJCQkqdHArKyA9ICpmcCsrOworCQkJKnRwKysgPSAqZnArKzsKKwkJCSp0cCsrID0gKmZwKys7CisJCQkqdHArKyA9ICpmcCsrOworCQkJKnRwKysgPSAqZnArKzsKKwkJCWZwICs9IDg7CisJCX0KKworCQkvKgorCQkgKiBkbyB0aGUgcmVzdCwgaWYgYW55LgorCQkgKi8KKwkJY2xlbiA9IGxlbiAmIDE1OworCQlydHAgPSAodW5zaWduZWQgY2hhciAqKSB0cDsKKwkJcmZwID0gKHVuc2lnbmVkIGNoYXIgKikgZnA7CisJCXdoaWxlIChjbGVuLS0pIHsKKwkJCSpydHArKyA9ICpyZnArKzsKKwkJfQorCisKKwl9CisKK30KKworLyogU2V0dXAgdGhlIExhbmNlIFJ4IGFuZCBUeCByaW5ncyAqLworc3RhdGljIHZvaWQgbGFuY2VfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWI7CisJaW50IGxlcHRyOworCWludCBpOworCisJaWIgPSAoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKikgKGRldi0+bWVtX3N0YXJ0KTsKKworCS8qIExvY2sgb3V0IG90aGVyIHByb2Nlc3NlcyB3aGlsZSBzZXR0aW5nIHVwIGhhcmR3YXJlICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWxwLT5yeF9uZXcgPSBscC0+dHhfbmV3ID0gMDsKKwlscC0+cnhfb2xkID0gbHAtPnR4X29sZCA9IDA7CisKKwkvKiBDb3B5IHRoZSBldGhlcm5ldCBhZGRyZXNzIHRvIHRoZSBsYW5jZSBpbml0IGJsb2NrLgorCSAqIFhYWCBiaXQgMCBvZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpc3RlcnMgaGFzIHRvIGJlIHplcm8KKwkgKi8KKwlpYi0+cGh5c19hZGRyWzBdID0gZGV2LT5kZXZfYWRkclswXTsKKwlpYi0+cGh5c19hZGRyWzFdID0gZGV2LT5kZXZfYWRkclsxXTsKKwlpYi0+cGh5c19hZGRyWzRdID0gZGV2LT5kZXZfYWRkclsyXTsKKwlpYi0+cGh5c19hZGRyWzVdID0gZGV2LT5kZXZfYWRkclszXTsKKwlpYi0+cGh5c19hZGRyWzhdID0gZGV2LT5kZXZfYWRkcls0XTsKKwlpYi0+cGh5c19hZGRyWzldID0gZGV2LT5kZXZfYWRkcls1XTsKKwkvKiBTZXR1cCB0aGUgaW5pdGlhbGl6YXRpb24gYmxvY2sgKi8KKworCS8qIFNldHVwIHJ4IGRlc2NyaXB0b3IgcG9pbnRlciAqLworCWxlcHRyID0gTEFOQ0VfQUREUihsaWJkZXNjX29mZnNldChicnhfcmluZywgMCkpOworCWliLT5yeF9sZW4gPSAoTEFOQ0VfTE9HX1JYX0JVRkZFUlMgPDwgMTMpIHwgKGxlcHRyID4+IDE2KTsKKwlpYi0+cnhfcHRyID0gbGVwdHI7CisJaWYgKFpFUk8pCisJCXByaW50aygiUlggcHRyOiAlOC44eCglOC44eClcbiIsIGxlcHRyLCBsaWJkZXNjX29mZnNldChicnhfcmluZywgMCkpOworCisJLyogU2V0dXAgdHggZGVzY3JpcHRvciBwb2ludGVyICovCisJbGVwdHIgPSBMQU5DRV9BRERSKGxpYmRlc2Nfb2Zmc2V0KGJ0eF9yaW5nLCAwKSk7CisJaWItPnR4X2xlbiA9IChMQU5DRV9MT0dfVFhfQlVGRkVSUyA8PCAxMykgfCAobGVwdHIgPj4gMTYpOworCWliLT50eF9wdHIgPSBsZXB0cjsKKwlpZiAoWkVSTykKKwkJcHJpbnRrKCJUWCBwdHI6ICU4Ljh4KCU4Ljh4KVxuIiwgbGVwdHIsIGxpYmRlc2Nfb2Zmc2V0KGJ0eF9yaW5nLCAwKSk7CisKKwlpZiAoWkVSTykKKwkJcHJpbnRrKCJUWCByaW5nczpcbiIpOworCisJLyogU2V0dXAgdGhlIFR4IHJpbmcgZW50cmllcyAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlsZXB0ciA9IChpbnQpIGxwLT50eF9idWZfcHRyX2xuY1tpXTsKKwkJaWItPmJ0eF9yaW5nW2ldLnRtZDAgPSBsZXB0cjsKKwkJaWItPmJ0eF9yaW5nW2ldLnRtZDFfaGFkciA9IGxlcHRyID4+IDE2OworCQlpYi0+YnR4X3JpbmdbaV0udG1kMV9iaXRzID0gMDsKKwkJaWItPmJ0eF9yaW5nW2ldLmxlbmd0aCA9IDB4ZjAwMDsJLyogVGhlIG9uZXMgcmVxdWlyZWQgYnkgdG1kMiAqLworCQlpYi0+YnR4X3JpbmdbaV0ubWlzYyA9IDA7CisJCWlmIChpIDwgMyAmJiBaRVJPKQorCQkJcHJpbnRrKCIlZDogMHglOC44eCgweCU4Ljh4KVxuIiwgaSwgbGVwdHIsIChpbnQpIGxwLT50eF9idWZfcHRyX2NwdVtpXSk7CisJfQorCisJLyogU2V0dXAgdGhlIFJ4IHJpbmcgZW50cmllcyAqLworCWlmIChaRVJPKQorCQlwcmludGsoIlJYIHJpbmdzOlxuIik7CisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCWxlcHRyID0gKGludCkgbHAtPnJ4X2J1Zl9wdHJfbG5jW2ldOworCQlpYi0+YnJ4X3JpbmdbaV0ucm1kMCA9IGxlcHRyOworCQlpYi0+YnJ4X3JpbmdbaV0ucm1kMV9oYWRyID0gbGVwdHIgPj4gMTY7CisJCWliLT5icnhfcmluZ1tpXS5ybWQxX2JpdHMgPSBMRV9SMV9PV047CisJCWliLT5icnhfcmluZ1tpXS5sZW5ndGggPSAtUlhfQlVGRl9TSVpFIHwgMHhmMDAwOworCQlpYi0+YnJ4X3JpbmdbaV0ubWJsZW5ndGggPSAwOworCQlpZiAoaSA8IDMgJiYgWkVSTykKKwkJCXByaW50aygiJWQ6IDB4JTguOHgoMHglOC44eClcbiIsIGksIGxlcHRyLCAoaW50KSBscC0+cnhfYnVmX3B0cl9jcHVbaV0pOworCX0KKwlpb2IoKTsKK30KKworc3RhdGljIGludCBpbml0X3Jlc3RhcnRfbGFuY2Uoc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwKQoreworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKwlpbnQgaTsKKworCXdyaXRlcmVnKCZsbC0+cmFwLCBMRV9DU1IwKTsKKwl3cml0ZXJlZygmbGwtPnJkcCwgTEVfQzBfSU5JVCk7CisKKwkvKiBXYWl0IGZvciB0aGUgbGFuY2UgdG8gY29tcGxldGUgaW5pdGlhbGl6YXRpb24gKi8KKwlmb3IgKGkgPSAwOyAoaSA8IDEwMCkgJiYgIShsbC0+cmRwICYgTEVfQzBfSURPTik7IGkrKykgeworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoKGkgPT0gMTAwKSB8fCAobGwtPnJkcCAmIExFX0MwX0VSUikpIHsKKwkJcHJpbnRrKCJMQU5DRSB1bm9wZW5lZCBhZnRlciAlZCB0aWNrcywgY3NyMD0lNC40eC5cbiIsIGksIGxsLT5yZHApOworCQlyZXR1cm4gLTE7CisJfQorCWlmICgobGwtPnJkcCAmIExFX0MwX0VSUikpIHsKKwkJcHJpbnRrKCJMQU5DRSB1bm9wZW5lZCBhZnRlciAlZCB0aWNrcywgY3NyMD0lNC40eC5cbiIsIGksIGxsLT5yZHApOworCQlyZXR1cm4gLTE7CisJfQorCXdyaXRlcmVnKCZsbC0+cmRwLCBMRV9DMF9JRE9OKTsKKwl3cml0ZXJlZygmbGwtPnJkcCwgTEVfQzBfU1RSVCk7CisJd3JpdGVyZWcoJmxsLT5yZHAsIExFX0MwX0lORUEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuY2Vfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYjsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcnhfZGVzYyAqcmQgPSAwOworCXVuc2lnbmVkIGNoYXIgYml0czsKKwlpbnQgbGVuID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gMDsKKwlpYiA9IChzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqKSAoZGV2LT5tZW1fc3RhcnQpOworCisjaWZkZWYgVEVTVF9ISVRTCisJeworCQlpbnQgaTsKKworCQlwcmludGsoIlsiKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlpZiAoaSA9PSBscC0+cnhfbmV3KQorCQkJCXByaW50aygiJXMiLCBpYi0+YnJ4X3JpbmdbaV0ucm1kMV9iaXRzICYKKwkJCQkJICAgICBMRV9SMV9PV04gPyAiXyIgOiAiWCIpOworCQkJZWxzZQorCQkJCXByaW50aygiJXMiLCBpYi0+YnJ4X3JpbmdbaV0ucm1kMV9iaXRzICYKKwkJCQkJICAgICBMRV9SMV9PV04gPyAiLiIgOiAiMSIpOworCQl9CisJCXByaW50aygiXSIpOworCX0KKyNlbmRpZgorCisJZm9yIChyZCA9ICZpYi0+YnJ4X3JpbmdbbHAtPnJ4X25ld107CisJICAgICAhKChiaXRzID0gcmQtPnJtZDFfYml0cykgJiBMRV9SMV9PV04pOworCSAgICAgcmQgPSAmaWItPmJyeF9yaW5nW2xwLT5yeF9uZXddKSB7CisKKwkJLyogV2UgZ290IGFuIGluY29tcGxldGUgZnJhbWU/ICovCisJCWlmICgoYml0cyAmIExFX1IxX1BPSykgIT0gTEVfUjFfUE9LKSB7CisJCQlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJfSBlbHNlIGlmIChiaXRzICYgTEVfUjFfRVJSKSB7CisJCQkvKiBDb3VudCBvbmx5IHRoZSBlbmQgZnJhbWUgYXMgYSByeCBlcnJvciwKKwkJCSAqIG5vdCB0aGUgYmVnaW5uaW5nCisJCQkgKi8KKwkJCWlmIChiaXRzICYgTEVfUjFfQlVGKQorCQkJCWxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9DUkMpCisJCQkJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfT0ZMKQorCQkJCWxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9GUkEpCisJCQkJbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9FT1ApCisJCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJbGVuID0gKHJkLT5tYmxlbmd0aCAmIDB4ZmZmKSAtIDQ7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOworCisJCQlpZiAoc2tiID09IDApIHsKKwkJCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlyZC0+bWJsZW5ndGggPSAwOworCQkJCXJkLT5ybWQxX2JpdHMgPSBMRV9SMV9PV047CisJCQkJbHAtPnJ4X25ldyA9IChscC0+cnhfbmV3ICsgMSkgJiBSWF9SSU5HX01PRF9NQVNLOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduICovCisJCQlza2JfcHV0KHNrYiwgbGVuKTsJLyogbWFrZSByb29tICovCisKKwkJCWNwX2Zyb21fYnVmKGxwLT50eXBlLCBza2ItPmRhdGEsCisJCQkJICAgIChjaGFyICopbHAtPnJ4X2J1Zl9wdHJfY3B1W2xwLT5yeF9uZXddLAorCQkJCSAgICBsZW4pOworCisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQl9CisKKwkJLyogUmV0dXJuIHRoZSBwYWNrZXQgdG8gdGhlIHBvb2wgKi8KKwkJcmQtPm1ibGVuZ3RoID0gMDsKKwkJcmQtPmxlbmd0aCA9IC1SWF9CVUZGX1NJWkUgfCAweGYwMDA7CisJCXJkLT5ybWQxX2JpdHMgPSBMRV9SMV9PV047CisJCWxwLT5yeF9uZXcgPSAobHAtPnJ4X25ldyArIDEpICYgUlhfUklOR19NT0RfTUFTSzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWI7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV90eF9kZXNjICp0ZDsKKwlpbnQgaSwgajsKKwlpbnQgc3RhdHVzOworCWliID0gKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopIChkZXYtPm1lbV9zdGFydCk7CisJaiA9IGxwLT50eF9vbGQ7CisKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKworCWZvciAoaSA9IGo7IGkgIT0gbHAtPnR4X25ldzsgaSA9IGopIHsKKwkJdGQgPSAmaWItPmJ0eF9yaW5nW2ldOworCQkvKiBJZiB3ZSBoaXQgYSBwYWNrZXQgbm90IG93bmVkIGJ5IHVzLCBzdG9wICovCisJCWlmICh0ZC0+dG1kMV9iaXRzICYgTEVfVDFfT1dOKQorCQkJYnJlYWs7CisKKwkJaWYgKHRkLT50bWQxX2JpdHMgJiBMRV9UMV9FUlIpIHsKKwkJCXN0YXR1cyA9IHRkLT5taXNjOworCisJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgTEVfVDNfUlRZKQorCQkJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIExFX1QzX0xDT0wpCisJCQkJbHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKworCQkJaWYgKHN0YXR1cyAmIExFX1QzX0NMT1MpIHsKKwkJCQlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQlwcmludGsoIiVzOiBDYXJyaWVyIExvc3RcbiIsIGRldi0+bmFtZSk7CisJCQkJLyogU3RvcCB0aGUgbGFuY2UgKi8KKwkJCQl3cml0ZXJlZygmbGwtPnJhcCwgTEVfQ1NSMCk7CisJCQkJd3JpdGVyZWcoJmxsLT5yZHAsIExFX0MwX1NUT1ApOworCQkJCWxhbmNlX2luaXRfcmluZyhkZXYpOworCQkJCWxvYWRfY3NycyhscCk7CisJCQkJaW5pdF9yZXN0YXJ0X2xhbmNlKGxwKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCS8qIEJ1ZmZlciBlcnJvcnMgYW5kIHVuZGVyZmxvd3MgdHVybiBvZmYgdGhlCisJCQkgKiB0cmFuc21pdHRlciwgcmVzdGFydCB0aGUgYWRhcHRlci4KKwkJCSAqLworCQkJaWYgKHN0YXR1cyAmIChMRV9UM19CVUYgfCBMRV9UM19VRkwpKSB7CisJCQkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisKKwkJCQlwcmludGsoIiVzOiBUeDogRVJSX0JVRnxFUlJfVUZMLCByZXN0YXJ0aW5nXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCS8qIFN0b3AgdGhlIGxhbmNlICovCisJCQkJd3JpdGVyZWcoJmxsLT5yYXAsIExFX0NTUjApOworCQkJCXdyaXRlcmVnKCZsbC0+cmRwLCBMRV9DMF9TVE9QKTsKKwkJCQlsYW5jZV9pbml0X3JpbmcoZGV2KTsKKwkJCQlsb2FkX2NzcnMobHApOworCQkJCWluaXRfcmVzdGFydF9sYW5jZShscCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSBpZiAoKHRkLT50bWQxX2JpdHMgJiBMRV9UMV9QT0spID09IExFX1QxX1BPSykgeworCQkJLyoKKwkJCSAqIFNvIHdlIGRvbid0IGNvdW50IHRoZSBwYWNrZXQgbW9yZSB0aGFuIG9uY2UuCisJCQkgKi8KKwkJCXRkLT50bWQxX2JpdHMgJj0gfihMRV9UMV9QT0spOworCisJCQkvKiBPbmUgY29sbGlzaW9uIGJlZm9yZSBwYWNrZXQgd2FzIHNlbnQuICovCisJCQlpZiAodGQtPnRtZDFfYml0cyAmIExFX1QxX0VPTkUpCisJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKworCQkJLyogTW9yZSB0aGFuIG9uZSBjb2xsaXNpb24sIGJlIG9wdGltaXN0aWMuICovCisJCQlpZiAodGQtPnRtZDFfYml0cyAmIExFX1QxX0VNT1JFKQorCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IDI7CisKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCX0KKwkJaiA9IChqICsgMSkgJiBUWF9SSU5HX01PRF9NQVNLOworCX0KKwlscC0+dHhfb2xkID0gajsKK291dDoKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJICAgIFRYX0JVRkZTX0FWQUlMID4gMCkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbGFuY2VfZG1hX21lcnJfaW50KGNvbnN0IGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKworCXByaW50aygiJXM6IERNQSBlcnJvclxuIiwgZGV2LT5uYW1lKTsKK30KKworc3RhdGljIGlycXJldHVybl90CitsYW5jZV9pbnRlcnJ1cHQoY29uc3QgaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKwlpbnQgY3NyMDsKKworCXdyaXRlcmVnKCZsbC0+cmFwLCBMRV9DU1IwKTsKKwljc3IwID0gbGwtPnJkcDsKKworCS8qIEFja25vd2xlZGdlIGFsbCB0aGUgaW50ZXJydXB0IHNvdXJjZXMgQVNBUCAqLworCXdyaXRlcmVnKCZsbC0+cmRwLCBjc3IwICYgKExFX0MwX0lOVFIgfCBMRV9DMF9USU5UIHwgTEVfQzBfUklOVCkpOworCisJaWYgKChjc3IwICYgTEVfQzBfRVJSKSkgeworCQkvKiBDbGVhciB0aGUgZXJyb3IgY29uZGl0aW9uICovCisJCXdyaXRlcmVnKCZsbC0+cmRwLCBMRV9DMF9CQUJMIHwgTEVfQzBfRVJSIHwgTEVfQzBfTUlTUyB8CisJCQkgTEVfQzBfQ0VSUiB8IExFX0MwX01FUlIpOworCX0KKwlpZiAoY3NyMCAmIExFX0MwX1JJTlQpCisJCWxhbmNlX3J4KGRldik7CisKKwlpZiAoY3NyMCAmIExFX0MwX1RJTlQpCisJCWxhbmNlX3R4KGRldik7CisKKwlpZiAoY3NyMCAmIExFX0MwX0JBQkwpCisJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKworCWlmIChjc3IwICYgTEVfQzBfTUlTUykKKwkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCisJaWYgKGNzcjAgJiBMRV9DMF9NRVJSKSB7CisJCXByaW50aygiJXM6IE1lbW9yeSBlcnJvciwgc3RhdHVzICUwNHhcbiIsIGRldi0+bmFtZSwgY3NyMCk7CisKKwkJd3JpdGVyZWcoJmxsLT5yZHAsIExFX0MwX1NUT1ApOworCisJCWxhbmNlX2luaXRfcmluZyhkZXYpOworCQlsb2FkX2NzcnMobHApOworCQlpbml0X3Jlc3RhcnRfbGFuY2UobHApOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCisJd3JpdGVyZWcoJmxsLT5yZHAsIExFX0MwX0lORUEpOworCXdyaXRlcmVnKCZsbC0+cmRwLCBMRV9DMF9JTkVBKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICpsYXN0X2RldiA9IDA7CisKK3N0YXRpYyBpbnQgbGFuY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IChzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqKSAoZGV2LT5tZW1fc3RhcnQpOworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOworCWludCBzdGF0dXMgPSAwOworCisJbGFzdF9kZXYgPSBkZXY7CisKKwkvKiBTdG9wIHRoZSBMYW5jZSAqLworCXdyaXRlcmVnKCZsbC0+cmFwLCBMRV9DU1IwKTsKKwl3cml0ZXJlZygmbGwtPnJkcCwgTEVfQzBfU1RPUCk7CisKKwkvKiBTZXQgbW9kZSBhbmQgY2xlYXIgbXVsdGljYXN0IGZpbHRlciBvbmx5IGF0IGRldmljZSBvcGVuLAorCSAqIHNvIHRoYXQgbGFuY2VfaW5pdF9yaW5nKCkgY2FsbGVkIGF0IGFueSBlcnJvciB3aWxsIG5vdAorCSAqIGZvcmdldCBtdWx0aWNhc3QgZmlsdGVycy4KKwkgKgorCSAqIEJUVyBpdCBpcyBjb21tb24gYnVnIGluIGFsbCBsYW5jZSBkcml2ZXJzISAtLUFOSworCSAqLworCWliLT5tb2RlID0gMDsKKwlpYi0+ZmlsdGVyIFswXSA9IDA7CisJaWItPmZpbHRlciBbMl0gPSAwOworCWliLT5maWx0ZXIgWzRdID0gMDsKKwlpYi0+ZmlsdGVyIFs2XSA9IDA7CisKKwlsYW5jZV9pbml0X3JpbmcoZGV2KTsKKwlsb2FkX2NzcnMobHApOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCS8qIEFzc29jaWF0ZSBJUlEgd2l0aCBsYW5jZV9pbnRlcnJ1cHQgKi8KKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZsYW5jZV9pbnRlcnJ1cHQsIDAsICJsYW5jZSIsIGRldikpIHsKKwkJcHJpbnRrKCIlczogQ2FuJ3QgZ2V0IElSUSAlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlpZiAobHAtPmRtYV9pcnEgPj0gMCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWlmIChyZXF1ZXN0X2lycShscC0+ZG1hX2lycSwgJmxhbmNlX2RtYV9tZXJyX2ludCwgMCwKKwkJCQkibGFuY2UgZXJyb3IiLCBkZXYpKSB7CisJCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJCXByaW50aygiJXM6IENhbid0IGdldCBETUEgSVJRICVkXG4iLCBkZXYtPm5hbWUsCisJCQkJbHAtPmRtYV9pcnEpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hc2ljX3Nzcl9sb2NrLCBmbGFncyk7CisKKwkJZmFzdF9tYigpOworCQkvKiBFbmFibGUgSS9PIEFTSUMgTEFOQ0UgRE1BLiAgKi8KKwkJaW9hc2ljX3dyaXRlKElPX1JFR19TU1IsCisJCQkgICAgIGlvYXNpY19yZWFkKElPX1JFR19TU1IpIHwgSU9fU1NSX0xBTkNFX0RNQV9FTik7CisKKwkJZmFzdF9tYigpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FzaWNfc3NyX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlzdGF0dXMgPSBpbml0X3Jlc3RhcnRfbGFuY2UobHApOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbGFuY2VfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlkZWxfdGltZXJfc3luYygmbHAtPm11bHRpY2FzdF90aW1lcik7CisKKwkvKiBTdG9wIHRoZSBjYXJkICovCisJd3JpdGVyZWcoJmxsLT5yYXAsIExFX0NTUjApOworCXdyaXRlcmVnKCZsbC0+cmRwLCBMRV9DMF9TVE9QKTsKKworCWlmIChscC0+ZG1hX2lycSA+PSAwKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXNpY19zc3JfbG9jaywgZmxhZ3MpOworCisJCWZhc3RfbWIoKTsKKwkJLyogRGlzYWJsZSBJL08gQVNJQyBMQU5DRSBETUEuICAqLworCQlpb2FzaWNfd3JpdGUoSU9fUkVHX1NTUiwKKwkJCSAgICAgaW9hc2ljX3JlYWQoSU9fUkVHX1NTUikgJiB+SU9fU1NSX0xBTkNFX0RNQV9FTik7CisKKwkJZmFzdF9pb2IoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hc2ljX3Nzcl9sb2NrLCBmbGFncyk7CisKKwkJZnJlZV9pcnEobHAtPmRtYV9pcnEsIGRldik7CisJfQorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsYW5jZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOworCWludCBzdGF0dXM7CisKKwkvKiBTdG9wIHRoZSBsYW5jZSAqLworCXdyaXRlcmVnKCZsbC0+cmFwLCBMRV9DU1IwKTsKKwl3cml0ZXJlZygmbGwtPnJkcCwgTEVfQzBfU1RPUCk7CisKKwlsYW5jZV9pbml0X3JpbmcoZGV2KTsKKwlsb2FkX2NzcnMobHApOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXN0YXR1cyA9IGluaXRfcmVzdGFydF9sYW5jZShscCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgbGFuY2VfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOworCisJcHJpbnRrKEtFUk5fRVJSICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTA0eCwgcmVzZXRcbiIsCisJCWRldi0+bmFtZSwgbGwtPnJkcCk7CisJbGFuY2VfcmVzZXQoZGV2KTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQgbGFuY2Vfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IChzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqKSAoZGV2LT5tZW1fc3RhcnQpOworCWludCBlbnRyeSwgc2tibGVuLCBsZW47CisKKwlza2JsZW4gPSBza2ItPmxlbjsKKworCWxlbiA9IHNrYmxlbjsKKwkKKwlpZiAobGVuIDwgRVRIX1pMRU4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJbGVuID0gRVRIX1pMRU47CisJfQorCisJbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKworCWVudHJ5ID0gbHAtPnR4X25ldyAmIFRYX1JJTkdfTU9EX01BU0s7CisJaWItPmJ0eF9yaW5nW2VudHJ5XS5sZW5ndGggPSAoLWxlbik7CisJaWItPmJ0eF9yaW5nW2VudHJ5XS5taXNjID0gMDsKKworCWNwX3RvX2J1ZihscC0+dHlwZSwgKGNoYXIgKilscC0+dHhfYnVmX3B0cl9jcHVbZW50cnldLCBza2ItPmRhdGEsCisJCSAgc2tibGVuKTsKKworCS8qIENsZWFyIHRoZSBzbGFjayBvZiB0aGUgcGFja2V0LCBkbyBJIG5lZWQgdGhpcz8gKi8KKwkvKiBGb3IgYSBmaXJld2FsbCBpdCdzIGEgZ29vZCBpZGVhIC0gQUMgKi8KKy8qCisgICBpZiAobGVuICE9IHNrYmxlbikKKyAgIG1lbXNldCAoKGNoYXIgKikgJmliLT50eF9idWYgW2VudHJ5XVtza2JsZW5dLCAwLCAobGVuIC0gc2tibGVuKSA8PCAxKTsKKyAqLworCisJLyogTm93LCBnaXZlIHRoZSBwYWNrZXQgdG8gdGhlIGxhbmNlICovCisJaWItPmJ0eF9yaW5nW2VudHJ5XS50bWQxX2JpdHMgPSAoTEVfVDFfUE9LIHwgTEVfVDFfT1dOKTsKKwlscC0+dHhfbmV3ID0gKGxwLT50eF9uZXcgKyAxKSAmIFRYX1JJTkdfTU9EX01BU0s7CisKKwlpZiAoVFhfQlVGRlNfQVZBSUwgPD0gMCkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogS2ljayB0aGUgbGFuY2U6IHRyYW5zbWl0IG5vdyAqLworCXdyaXRlcmVnKCZsbC0+cmRwLCBMRV9DMF9JTkVBIHwgTEVfQzBfVERNRCk7CisKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworIAlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsYW5jZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX2xvYWRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopIChkZXYtPm1lbV9zdGFydCk7CisJdm9sYXRpbGUgdTE2ICptY2FzdF90YWJsZSA9ICh1MTYgKikgJiBpYi0+ZmlsdGVyOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCWNoYXIgKmFkZHJzOworCWludCBpOworCXUzMiBjcmM7CisKKwkvKiBzZXQgYWxsIG11bHRpY2FzdCBiaXRzICovCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJaWItPmZpbHRlclswXSA9IDB4ZmZmZjsKKwkJaWItPmZpbHRlclsyXSA9IDB4ZmZmZjsKKwkJaWItPmZpbHRlcls0XSA9IDB4ZmZmZjsKKwkJaWItPmZpbHRlcls2XSA9IDB4ZmZmZjsKKwkJcmV0dXJuOworCX0KKwkvKiBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciAqLworCWliLT5maWx0ZXJbMF0gPSAwOworCWliLT5maWx0ZXJbMl0gPSAwOworCWliLT5maWx0ZXJbNF0gPSAwOworCWliLT5maWx0ZXJbNl0gPSAwOworCisJLyogQWRkIGFkZHJlc3NlcyAqLworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJYWRkcnMgPSBkbWktPmRtaV9hZGRyOworCQlkbWkgPSBkbWktPm5leHQ7CisKKwkJLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCisJCWlmICghKCphZGRycyAmIDEpKQorCQkJY29udGludWU7CisKKwkJY3JjID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBhZGRycyk7CisJCWNyYyA9IGNyYyA+PiAyNjsKKwkJbWNhc3RfdGFibGVbMiAqIChjcmMgPj4gNCldIHw9IDEgPDwgKGNyYyAmIDB4Zik7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgbGFuY2Vfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKworCWliID0gKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopIChkZXYtPm1lbV9zdGFydCk7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuOworCisJaWYgKGxwLT50eF9vbGQgIT0gbHAtPnR4X25ldykgeworCQltb2RfdGltZXIoJmxwLT5tdWx0aWNhc3RfdGltZXIsIGppZmZpZXMgKyA0ICogSFovMTAwKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlyZXR1cm47CisJfQorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJd3JpdGVyZWcoJmxsLT5yYXAsIExFX0NTUjApOworCXdyaXRlcmVnKCZsbC0+cmRwLCBMRV9DMF9TVE9QKTsKKworCWxhbmNlX2luaXRfcmluZyhkZXYpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlpYi0+bW9kZSB8PSBMRV9NT19QUk9NOworCX0gZWxzZSB7CisJCWliLT5tb2RlICY9IH5MRV9NT19QUk9NOworCQlsYW5jZV9sb2FkX211bHRpY2FzdChkZXYpOworCX0KKwlsb2FkX2NzcnMobHApOworCWluaXRfcmVzdGFydF9sYW5jZShscCk7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBsYW5jZV9zZXRfbXVsdGljYXN0X3JldHJ5KHVuc2lnbmVkIGxvbmcgX29wYXF1ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIF9vcGFxdWU7CisKKwlsYW5jZV9zZXRfbXVsdGljYXN0KGRldik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRlY19sYW5jZV9pbml0KGNvbnN0IGludCB0eXBlLCBjb25zdCBpbnQgc2xvdCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCXN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gImRlY2xhbmNlJWQiOworCWNoYXIgbmFtZVsxMF07CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHA7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsOworCWludCBpLCByZXQ7CisJdW5zaWduZWQgbG9uZyBlc2FyX2Jhc2U7CisJdW5zaWduZWQgY2hhciAqZXNhcjsKKworI2lmbmRlZiBDT05GSUdfVEMKKwlzeXN0ZW1fYmFzZSA9IEtOMDFfTEFOQ0VfQkFTRTsKKyNlbmRpZgorCisJaWYgKGRlY19sYW5jZV9kZWJ1ZyAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwlpID0gMDsKKwlkZXYgPSByb290X2xhbmNlX2RldjsKKwl3aGlsZSAoZGV2KSB7CisJCWkrKzsKKwkJbHAgPSAoc3RydWN0IGxhbmNlX3ByaXZhdGUgKilkZXYtPnByaXY7CisJCWRldiA9IGxwLT5uZXh0OworCX0KKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIGZtdCwgaSk7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGxhbmNlX3ByaXZhdGUpKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgZXRoZXJkZXYsIGFib3J0aW5nLlxuIiwKKwkJCW5hbWUpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyoKKwkgKiBhbGxvY19ldGhlcmRldiBlbnN1cmVzIHRoZSBkYXRhIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgTEFOQ0UKKwkgKiBhcmUgYWxpZ25lZC4KKwkgKi8KKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworCWxwLT50eXBlID0gdHlwZTsKKwlscC0+c2xvdCA9IHNsb3Q7CisJc3dpdGNoICh0eXBlKSB7CisjaWZkZWYgQ09ORklHX1RDCisJY2FzZSBBU0lDX0xBTkNFOgorCQlkZXYtPmJhc2VfYWRkciA9IHN5c3RlbV9iYXNlICsgSU9BU0lDX0xBTkNFOworCisJCS8qIGJ1ZmZlciBzcGFjZSBmb3IgdGhlIG9uLWJvYXJkIExBTkNFIHNoYXJlZCBtZW1vcnkgKi8KKwkJLyoKKwkJICogRklYTUU6IHVnbHkgaGFjayEKKwkJICovCisJCWRldi0+bWVtX3N0YXJ0ID0gS1NFRzFBRERSKDB4MDAwMjAwMDApOworCQlkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIDB4MDAwMjAwMDA7CisJCWRldi0+aXJxID0gZGVjX2ludGVycnVwdFtERUNfSVJRX0xBTkNFXTsKKwkJZXNhcl9iYXNlID0gc3lzdGVtX2Jhc2UgKyBJT0FTSUNfRVNBUjsKKworCQkvKiBXb3JrYXJvdW5kIGNyYXNoIHdpdGggYm9vdGluZyBLTjA0IDIuMWsgZnJvbSBEaXNrICovCisJCW1lbXNldCgodm9pZCAqKWRldi0+bWVtX3N0YXJ0LCAwLAorCQkgICAgICAgZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQpOworCisJCS8qCisJCSAqIHNldHVwIHRoZSBwb2ludGVyIGFycmF5cywgdGhpcyBzdWNrcyBbdG1dIDotKAorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlscC0+cnhfYnVmX3B0cl9jcHVbaV0gPQorCQkJCShjaGFyICopKGRldi0+bWVtX3N0YXJ0ICsgQlVGX09GRlNFVF9DUFUgKworCQkJCQkgMiAqIGkgKiBSWF9CVUZGX1NJWkUpOworCQkJbHAtPnJ4X2J1Zl9wdHJfbG5jW2ldID0KKwkJCQkoY2hhciAqKShCVUZfT0ZGU0VUX0xOQyArIGkgKiBSWF9CVUZGX1NJWkUpOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQkJbHAtPnR4X2J1Zl9wdHJfY3B1W2ldID0KKwkJCQkoY2hhciAqKShkZXYtPm1lbV9zdGFydCArIEJVRl9PRkZTRVRfQ1BVICsKKwkJCQkJIDIgKiBSWF9SSU5HX1NJWkUgKiBSWF9CVUZGX1NJWkUgKworCQkJCQkgMiAqIGkgKiBUWF9CVUZGX1NJWkUpOworCQkJbHAtPnR4X2J1Zl9wdHJfbG5jW2ldID0KKwkJCQkoY2hhciAqKShCVUZfT0ZGU0VUX0xOQyArCisJCQkJCSBSWF9SSU5HX1NJWkUgKiBSWF9CVUZGX1NJWkUgKworCQkJCQkgaSAqIFRYX0JVRkZfU0laRSk7CisJCX0KKworCQkvKiBTZXR1cCBJL08gQVNJQyBMQU5DRSBETUEuICAqLworCQlscC0+ZG1hX2lycSA9IGRlY19pbnRlcnJ1cHRbREVDX0lSUV9MQU5DRV9NRVJSXTsKKwkJaW9hc2ljX3dyaXRlKElPX1JFR19MQU5DRV9ETUFfUCwKKwkJCSAgICAgUEhZU0FERFIoZGV2LT5tZW1fc3RhcnQpIDw8IDMpOworCisJCWJyZWFrOworCisJY2FzZSBQTUFEX0xBTkNFOgorCQljbGFpbV90Y19jYXJkKHNsb3QpOworCisJCWRldi0+bWVtX3N0YXJ0ID0gZ2V0X3RjX2Jhc2VfYWRkcihzbG90KTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBkZXYtPm1lbV9zdGFydCArIDB4MTAwMDAwOworCQlkZXYtPmlycSA9IGdldF90Y19pcnFfbnIoc2xvdCk7CisJCWVzYXJfYmFzZSA9IGRldi0+bWVtX3N0YXJ0ICsgMHgxYzAwMDI7CisJCWxwLT5kbWFfaXJxID0gLTE7CisKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlscC0+cnhfYnVmX3B0cl9jcHVbaV0gPQorCQkJCShjaGFyICopKGRldi0+bWVtX3N0YXJ0ICsgQlVGX09GRlNFVF9DUFUgKworCQkJCQkgaSAqIFJYX0JVRkZfU0laRSk7CisJCQlscC0+cnhfYnVmX3B0cl9sbmNbaV0gPQorCQkJCShjaGFyICopKEJVRl9PRkZTRVRfTE5DICsgaSAqIFJYX0JVRkZfU0laRSk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlscC0+dHhfYnVmX3B0cl9jcHVbaV0gPQorCQkJCShjaGFyICopKGRldi0+bWVtX3N0YXJ0ICsgQlVGX09GRlNFVF9DUFUgKworCQkJCQkgUlhfUklOR19TSVpFICogUlhfQlVGRl9TSVpFICsKKwkJCQkJIGkgKiBUWF9CVUZGX1NJWkUpOworCQkJbHAtPnR4X2J1Zl9wdHJfbG5jW2ldID0KKwkJCQkoY2hhciAqKShCVUZfT0ZGU0VUX0xOQyArCisJCQkJCSBSWF9SSU5HX1NJWkUgKiBSWF9CVUZGX1NJWkUgKworCQkJCQkgaSAqIFRYX0JVRkZfU0laRSk7CisJCX0KKworCQlicmVhazsKKyNlbmRpZgorCisJY2FzZSBQTUFYX0xBTkNFOgorCQlkZXYtPmlycSA9IGRlY19pbnRlcnJ1cHRbREVDX0lSUV9MQU5DRV07CisJCWRldi0+YmFzZV9hZGRyID0gS04wMV9MQU5DRV9CQVNFOworCQlkZXYtPm1lbV9zdGFydCA9IEtOMDFfTEFOQ0VfQkFTRSArIDB4MDEwMDAwMDA7CisJCWVzYXJfYmFzZSA9IEtOMDFfUlRDX0JBU0UgKyAxOworCQlscC0+ZG1hX2lycSA9IC0xOworCisJCS8qCisJCSAqIHNldHVwIHRoZSBwb2ludGVyIGFycmF5cywgdGhpcyBzdWNrcyBbdG1dIDotKAorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlscC0+cnhfYnVmX3B0cl9jcHVbaV0gPQorCQkJCShjaGFyICopKGRldi0+bWVtX3N0YXJ0ICsgQlVGX09GRlNFVF9DUFUgKworCQkJCQkgMiAqIGkgKiBSWF9CVUZGX1NJWkUpOworCQkJbHAtPnJ4X2J1Zl9wdHJfbG5jW2ldID0KKwkJCQkoY2hhciAqKShCVUZfT0ZGU0VUX0xOQyArIGkgKiBSWF9CVUZGX1NJWkUpOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQkJbHAtPnR4X2J1Zl9wdHJfY3B1W2ldID0KKwkJCQkoY2hhciAqKShkZXYtPm1lbV9zdGFydCArIEJVRl9PRkZTRVRfQ1BVICsKKwkJCQkJIDIgKiBSWF9SSU5HX1NJWkUgKiBSWF9CVUZGX1NJWkUgKworCQkJCQkgMiAqIGkgKiBUWF9CVUZGX1NJWkUpOworCQkJbHAtPnR4X2J1Zl9wdHJfbG5jW2ldID0KKwkJCQkoY2hhciAqKShCVUZfT0ZGU0VUX0xOQyArCisJCQkJCSBSWF9SSU5HX1NJWkUgKiBSWF9CVUZGX1NJWkUgKworCQkJCQkgaSAqIFRYX0JVRkZfU0laRSk7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGRlY2xhbmNlX2luaXQgY2FsbGVkIHdpdGggdW5rbm93biB0eXBlXG4iLAorCQkJbmFtZSk7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwl9CisKKwlsbCA9IChzdHJ1Y3QgbGFuY2VfcmVncyAqKSBkZXYtPmJhc2VfYWRkcjsKKwllc2FyID0gKHVuc2lnbmVkIGNoYXIgKikgZXNhcl9iYXNlOworCisJLyogcHJvbSBjaGVja3MgKi8KKwkvKiBGaXJzdCwgY2hlY2sgZm9yIHRlc3QgcGF0dGVybiAqLworCWlmIChlc2FyWzB4NjBdICE9IDB4ZmYgJiYgZXNhclsweDY0XSAhPSAweDAwICYmCisJICAgIGVzYXJbMHg2OF0gIT0gMHg1NSAmJiBlc2FyWzB4NmNdICE9IDB4YWEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiJXM6IEV0aGVybmV0IHN0YXRpb24gYWRkcmVzcyBwcm9tIG5vdCBmb3VuZCFcbiIsCisJCQluYW1lKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCX0KKwkvKiBDaGVjayB0aGUgcHJvbSBjb250ZW50cyAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKGVzYXJbaSAqIDRdICE9IGVzYXJbMHgzYyAtIGkgKiA0XSAmJgorCQkgICAgZXNhcltpICogNF0gIT0gZXNhclsweDQwICsgaSAqIDRdICYmCisJCSAgICBlc2FyWzB4M2MgLSBpICogNF0gIT0gZXNhclsweDQwICsgaSAqIDRdKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgIgorCQkJCSJldGhlcm5ldCBzdGF0aW9uIGFkZHJlc3MgcHJvbSFcbiIsIG5hbWUpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwkJfQorCX0KKworCS8qIENvcHkgdGhlIGV0aGVybmV0IGFkZHJlc3MgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUsIGxhdGVyIHRvIHRoZQorCSAqIGxhbmNlIGluaXRpYWxpemF0aW9uIGJsb2NrIHNvIHRoZSBsYW5jZSBnZXRzIGl0IGV2ZXJ5IHRpbWUgaXQncworCSAqIChyZSlpbml0aWFsaXplZC4KKwkgKi8KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFTSUNfTEFOQ0U6CisJCXByaW50aygiJXM6IElPQVNJQyBvbmJvYXJkIExBTkNFLCBhZGRyID0gIiwgbmFtZSk7CisJCWJyZWFrOworCWNhc2UgUE1BRF9MQU5DRToKKwkJcHJpbnRrKCIlczogUE1BRC1BQSwgYWRkciA9ICIsIG5hbWUpOworCQlicmVhazsKKwljYXNlIFBNQVhfTEFOQ0U6CisJCXByaW50aygiJXM6IFBNQVggb25ib2FyZCBMQU5DRSwgYWRkciA9ICIsIG5hbWUpOworCQlicmVhazsKKwl9CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlkZXYtPmRldl9hZGRyW2ldID0gZXNhcltpICogNF07CisJCXByaW50aygiJTIuMnglYyIsIGRldi0+ZGV2X2FkZHJbaV0sIGkgPT0gNSA/ICcsJyA6ICc6Jyk7CisJfQorCisJcHJpbnRrKCIgaXJxID0gJWRcbiIsIGRldi0+aXJxKTsKKworCWRldi0+b3BlbiA9ICZsYW5jZV9vcGVuOworCWRldi0+c3RvcCA9ICZsYW5jZV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZsYW5jZV9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dCA9ICZsYW5jZV90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOworCWRldi0+Z2V0X3N0YXRzID0gJmxhbmNlX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZsYW5jZV9zZXRfbXVsdGljYXN0OworCisJLyogbHAtPmxsIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVnaXN0ZXJzIGZvciBsYW5jZSBjYXJkICovCisJbHAtPmxsID0gbGw7CisKKwkvKiBidXNtYXN0ZXJfcmVndmFsIChDU1IzKSBzaG91bGQgYmUgemVybyBhY2NvcmRpbmcgdG8gdGhlIFBNQUQtQUEKKwkgKiBzcGVjaWZpY2F0aW9uLgorCSAqLworCWxwLT5idXNtYXN0ZXJfcmVndmFsID0gMDsKKworCWRldi0+ZG1hID0gMDsKKworCS8qIFdlIGNhbm5vdCBzbGVlcCBpZiB0aGUgY2hpcCBpcyBidXN5IGR1cmluZyBhCisJICogbXVsdGljYXN0IGxpc3QgdXBkYXRlIGV2ZW50LCBiZWNhdXNlIHN1Y2ggZXZlbnRzCisJICogY2FuIG9jY3VyIGZyb20gaW50ZXJydXB0cyAoZXguIElQdjYpLiAgU28gd2UKKwkgKiB1c2UgYSB0aW1lciB0byB0cnkgYWdhaW4gbGF0ZXIgd2hlbiBuZWNlc3NhcnkuIC1EYXZlTQorCSAqLworCWluaXRfdGltZXIoJmxwLT5tdWx0aWNhc3RfdGltZXIpOworCWxwLT5tdWx0aWNhc3RfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJbHAtPm11bHRpY2FzdF90aW1lci5mdW5jdGlvbiA9ICZsYW5jZV9zZXRfbXVsdGljYXN0X3JldHJ5OworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIG5ldGRldiwgYWJvcnRpbmcuXG4iLCBuYW1lKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCX0KKworCWxwLT5uZXh0ID0gcm9vdF9sYW5jZV9kZXY7CisJcm9vdF9sYW5jZV9kZXYgPSBkZXY7CisKKwlwcmludGsoIiVzOiByZWdpc3RlcmVkIGFzICVzLlxuIiwgbmFtZSwgZGV2LT5uYW1lKTsKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX2RldjoKKwlrZnJlZShkZXYpOworCitlcnJfb3V0OgorCXJldHVybiByZXQ7Cit9CisKKworLyogRmluZCBhbGwgdGhlIGxhbmNlIGNhcmRzIG9uIHRoZSBzeXN0ZW0gYW5kIGluaXRpYWxpemUgdGhlbSAqLworc3RhdGljIGludCBfX2luaXQgZGVjX2xhbmNlX3Byb2JlKHZvaWQpCit7CisJaW50IGNvdW50ID0gMDsKKworCS8qIFNjYW4gc2xvdHMgZm9yIFBNQUQtQUEgY2FyZHMgZmlyc3QuICovCisjaWZkZWYgQ09ORklHX1RDCisJaWYgKFRVUkJPQ0hBTk5FTCkgeworCQlpbnQgc2xvdDsKKworCQl3aGlsZSAoKHNsb3QgPSBzZWFyY2hfdGNfY2FyZCgiUE1BRC1BQSIpKSA+PSAwKSB7CisJCQlpZiAoZGVjX2xhbmNlX2luaXQoUE1BRF9MQU5DRSwgc2xvdCkgPCAwKQorCQkJCWJyZWFrOworCQkJY291bnQrKzsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogVGhlbiBoYW5kbGUgb25ib2FyZCBkZXZpY2VzLiAqLworCWlmIChkZWNfaW50ZXJydXB0W0RFQ19JUlFfTEFOQ0VdID49IDApIHsKKwkJaWYgKGRlY19pbnRlcnJ1cHRbREVDX0lSUV9MQU5DRV9NRVJSXSA+PSAwKSB7CisjaWZkZWYgQ09ORklHX1RDCisJCQlpZiAoZGVjX2xhbmNlX2luaXQoQVNJQ19MQU5DRSwgLTEpID49IDApCisJCQkJY291bnQrKzsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKCFUVVJCT0NIQU5ORUwpIHsKKwkJCWlmIChkZWNfbGFuY2VfaW5pdChQTUFYX0xBTkNFLCAtMSkgPj0gMCkKKwkJCQljb3VudCsrOworCQl9CisJfQorCisJcmV0dXJuIChjb3VudCA+IDApID8gMCA6IC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZWNfbGFuY2VfY2xlYW51cCh2b2lkKQoreworCXdoaWxlIChyb290X2xhbmNlX2RldikgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcm9vdF9sYW5jZV9kZXY7CisJCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisjaWZkZWYgQ09ORklHX1RDCisJCWlmIChscC0+c2xvdCA+PSAwKQorCQkJcmVsZWFzZV90Y19jYXJkKGxwLT5zbG90KTsKKyNlbmRpZgorCQlyb290X2xhbmNlX2RldiA9IGxwLT5uZXh0OworCQlmcmVlX25ldGRldihkZXYpOworCX0KK30KKworbW9kdWxlX2luaXQoZGVjX2xhbmNlX3Byb2JlKTsKK21vZHVsZV9leGl0KGRlY19sYW5jZV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlZnh4LmMgYi9kcml2ZXJzL25ldC9kZWZ4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YWE1NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kZWZ4eC5jCkBAIC0wLDAgKzEsMzQ2MyBAQAorLyoKKyAqIEZpbGUgTmFtZToKKyAqICAgZGVmeHguYworICoKKyAqIENvcHlyaWdodCBJbmZvcm1hdGlvbjoKKyAqICAgQ29weXJpZ2h0IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIDE5OTYuCisgKgorICogICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogQWJzdHJhY3Q6CisgKiAgIEEgTGludXggZGV2aWNlIGRyaXZlciBzdXBwb3J0aW5nIHRoZSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbgorICogICBGRERJIEVJU0EgYW5kIFBDSSBjb250cm9sbGVyIGZhbWlsaWVzLiAgU3VwcG9ydGVkIGFkYXB0ZXJzIGluY2x1ZGU6CisgKgorICoJCURFQyBGRERJY29udHJvbGxlci9FSVNBIChERUZFQSkKKyAqCQlERUMgRkRESWNvbnRyb2xsZXIvUENJICAoREVGUEEpCisgKgorICogVGhlIG9yaWdpbmFsIGF1dGhvcjoKKyAqICAgTFZTCUxhd3JlbmNlIFYuIFN0ZWZhbmkgPGxzdGVmYW5pQHlhaG9vLmNvbT4KKyAqCisgKiBNYWludGFpbmVyczoKKyAqICAgbWFjcm8JTWFjaWVqIFcuIFJvenlja2kgPG1hY3JvQGxpbnV4LW1pcHMub3JnPgorICoKKyAqIENyZWRpdHM6CisgKiAgIEknZCBsaWtlIHRvIHRoYW5rIFBhdHJpY2lhIENyb3NzIGZvciBoZWxwaW5nIG1lIGdldCBzdGFydGVkIHdpdGgKKyAqICAgTGludXgsIERhdmlkIERhdmllcyBmb3IgYSBsb3Qgb2YgaGVscCB1cGdyYWRpbmcgYW5kIGNvbmZpZ3VyaW5nCisgKiAgIG15IGRldmVsb3BtZW50IHN5c3RlbSBhbmQgZm9yIGFuc3dlcmluZyBtYW55IE9TIGFuZCBkcml2ZXIKKyAqICAgZGV2ZWxvcG1lbnQgcXVlc3Rpb25zLCBhbmQgQWxhbiBDb3ggZm9yIHJlY29tbWVuZGF0aW9ucyBhbmQKKyAqICAgaW50ZWdyYXRpb24gaGVscCBvbiBnZXR0aW5nIEZEREkgc3VwcG9ydCBpbnRvIExpbnV4LiAgTFZTCisgKgorICogRHJpdmVyIEFyY2hpdGVjdHVyZToKKyAqICAgVGhlIGRyaXZlciBhcmNoaXRlY3R1cmUgaXMgbGFyZ2VseSBiYXNlZCBvbiBwcmV2aW91cyBkcml2ZXIgd29yaworICogICBmb3Igb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuICBUaGUgdXBwZXIgZWRnZSBpbnRlcmZhY2UgYW5kCisgKiAgIGZ1bmN0aW9ucyB3ZXJlIGxhcmdlbHkgdGFrZW4gZnJvbSBleGlzdGluZyBMaW51eCBkZXZpY2UgZHJpdmVycworICogICBzdWNoIGFzIERhdmlkIERhdmllcycgREU0WDUuQyBkcml2ZXIgYW5kIERvbmFsZCBCZWNrZXIncyBUVUxJUC5DCisgKiAgIGRyaXZlci4KKyAqCisgKiAgIEFkYXB0ZXIgUHJvYmUgLQorICoJCVRoZSBkcml2ZXIgc2NhbnMgZm9yIHN1cHBvcnRlZCBFSVNBIGFkYXB0ZXJzIGJ5IHJlYWRpbmcgdGhlCisgKgkJU0xPVCBJRCByZWdpc3RlciBmb3IgZWFjaCBFSVNBIHNsb3QgYW5kIG1ha2luZyBhIG1hdGNoCisgKgkJYWdhaW5zdCB0aGUgZXhwZWN0ZWQgdmFsdWUuCisgKgorICogICBCdXMtU3BlY2lmaWMgSW5pdGlhbGl6YXRpb24gLQorICoJCVRoaXMgZHJpdmVyIGN1cnJlbnRseSBzdXBwb3J0cyBib3RoIEVJU0EgYW5kIFBDSSBjb250cm9sbGVyCisgKgkJZmFtaWxpZXMuICBXaGlsZSB0aGUgY3VzdG9tIERNQSBjaGlwIGFuZCBGRERJIGxvZ2ljIGlzIHNpbWlsYXIKKyAqCQlvciBpZGVudGljYWwsIHRoZSBidXMgbG9naWMgaXMgdmVyeSBkaWZmZXJlbnQuICBBZnRlcgorICoJCWluaXRpYWxpemF0aW9uLCB0aGUJb25seSBidXMtc3BlY2lmaWMgZGlmZmVyZW5jZXMgaXMgaW4gaG93IHRoZQorICoJCWRyaXZlciBlbmFibGVzIGFuZCBkaXNhYmxlcyBpbnRlcnJ1cHRzLiAgT3RoZXIgdGhhbiB0aGF0LCB0aGUKKyAqCQlydW4tdGltZSBjcml0aWNhbCBjb2RlIGJlaGF2ZXMgdGhlIHNhbWUgb24gYm90aCBmYW1pbGllcy4KKyAqCQlJdCdzIGltcG9ydGFudCB0byBub3RlIHRoYXQgYm90aCBhZGFwdGVyIGZhbWlsaWVzIGFyZSBjb25maWd1cmVkCisgKgkJdG8gSS9PIG1hcCwgcmF0aGVyIHRoYW4gbWVtb3J5IG1hcCwgdGhlIGFkYXB0ZXIgcmVnaXN0ZXJzLgorICoKKyAqICAgRHJpdmVyIE9wZW4vQ2xvc2UgLQorICoJCUluIHRoZSBkcml2ZXIgb3BlbiByb3V0aW5lLCB0aGUgZHJpdmVyIElTUiAoaW50ZXJydXB0IHNlcnZpY2UKKyAqCQlyb3V0aW5lKSBpcyByZWdpc3RlcmVkIGFuZCB0aGUgYWRhcHRlciBpcyBicm91Z2h0IHRvIGFuCisgKgkJb3BlcmF0aW9uYWwgc3RhdGUuICBJbiB0aGUgZHJpdmVyIGNsb3NlIHJvdXRpbmUsIHRoZSBvcHBvc2l0ZQorICoJCW9jY3VyczsgdGhlIGRyaXZlciBJU1IgaXMgZGVyZWdpc3RlcmVkIGFuZCB0aGUgYWRhcHRlciBpcworICoJCWJyb3VnaHQgdG8gYSBzYWZlLCBidXQgY2xvc2VkIHN0YXRlLiAgVXNlcnMgbWF5IHVzZSBjb25zZWN1dGl2ZQorICoJCWNvbW1hbmRzIHRvIGJyaW5nIHRoZSBhZGFwdGVyIHVwIGFuZCBkb3duIGFzIGluIHRoZSBmb2xsb3dpbmcKKyAqCQlleGFtcGxlOgorICoJCQkJCWlmY29uZmlnIGZkZGkwIHVwCisgKgkJCQkJaWZjb25maWcgZmRkaTAgZG93bgorICoJCQkJCWlmY29uZmlnIGZkZGkwIHVwCisgKgorICogICBEcml2ZXIgU2h1dGRvd24gLQorICoJCUFwcGFyZW50bHksIHRoZXJlIGlzIG5vIHNodXRkb3duIG9yIGhhbHQgcm91dGluZSBzdXBwb3J0IHVuZGVyCisgKgkJTGludXguICBUaGlzIHJvdXRpbmUgd291bGQgYmUgY2FsbGVkIGR1cmluZyAicmVib290IiBvcgorICoJCSJzaHV0ZG93biIgdG8gYWxsb3cgdGhlIGRyaXZlciB0byBwbGFjZSB0aGUgYWRhcHRlciBpbiBhIHNhZmUKKyAqCQlzdGF0ZSBiZWZvcmUgYSB3YXJtIHJlYm9vdCBvY2N1cnMuICBUbyBiZSByZWFsbHkgc2FmZSwgdGhlIHVzZXIKKyAqCQlzaG91bGQgY2xvc2UgdGhlIGFkYXB0ZXIgYmVmb3JlIHNodXRkb3duIChlZy4gaWZjb25maWcgZmRkaTAgZG93bikKKyAqCQl0byBlbnN1cmUgdGhhdCB0aGUgYWRhcHRlciBETUEgZW5naW5lIGlzIHRha2VuIG9mZi1saW5lLiAgSG93ZXZlciwKKyAqCQl0aGUgY3VycmVudCBkcml2ZXIgY29kZSBhbnRpY2lwYXRlcyB0aGlzIHByb2JsZW0gYW5kIGFsd2F5cyBpc3N1ZXMKKyAqCQlhIHNvZnQgcmVzZXQgb2YgdGhlIGFkYXB0ZXIJYXQgdGhlIGJlZ2lubmluZyBvZiBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCisgKgkJQSBmdXR1cmUgZHJpdmVyIGVuaGFuY2VtZW50IGluIHRoaXMgYXJlYSBtYXkgb2NjdXIgaW4gMi4xLlggd2hlcmUKKyAqCQlBbGFuIGluZGljYXRlZCB0aGF0IGEgc2h1dGRvd24gaGFuZGxlciBtYXkgYmUgaW1wbGVtZW50ZWQuCisgKgorICogICBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lIC0KKyAqCQlUaGUgZHJpdmVyIHN1cHBvcnRzIHNoYXJlZCBpbnRlcnJ1cHRzLCBzbyB0aGUgSVNSIGlzIHJlZ2lzdGVyZWQgZm9yCisgKgkJZWFjaCBib2FyZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBmbGFnIGFuZCB0aGUgcG9pbnRlciB0byB0aGF0IGJvYXJkJ3MKKyAqCQlkZXZpY2Ugc3RydWN0dXJlLiAgVGhpcyBwcm92aWRlcyB0aGUgY29udGV4dCBkdXJpbmcgaW50ZXJydXB0CisgKgkJcHJvY2Vzc2luZyB0byBzdXBwb3J0IHNoYXJlZCBpbnRlcnJ1cHRzIGFuZCBtdWx0aXBsZSBib2FyZHMuCisgKgorICoJCUludGVycnVwdCBlbmFibGluZy9kaXNhYmxpbmcgY2FuIG9jY3VyIGF0IG1hbnkgbGV2ZWxzLiAgQXQgdGhlIGhvc3QKKyAqCQllbmQsIHlvdSBjYW4gZGlzYWJsZSBzeXN0ZW0gaW50ZXJydXB0cywgb3IgZGlzYWJsZSBpbnRlcnJ1cHRzIGF0IHRoZQorICoJCVBJQyAob24gSW50ZWwgc3lzdGVtcykuICBBY3Jvc3MgdGhlIGJ1cywgYm90aCBFSVNBIGFuZCBQQ0kgYWRhcHRlcnMKKyAqCQloYXZlIGEgYnVzLWxvZ2ljIGNoaXAgaW50ZXJydXB0IGVuYWJsZS9kaXNhYmxlIGFzIHdlbGwgYXMgYSBETUEKKyAqCQljb250cm9sbGVyIGludGVycnVwdCBlbmFibGUvZGlzYWJsZS4KKyAqCisgKgkJVGhlIGRyaXZlciBjdXJyZW50bHkgZW5hYmxlcyBhbmQgZGlzYWJsZXMgYWRhcHRlciBpbnRlcnJ1cHRzIGF0IHRoZQorICoJCWJ1cy1sb2dpYyBjaGlwIGFuZCBhc3N1bWVzIHRoYXQgTGludXggd2lsbCB0YWtlIGNhcmUgb2YgY2xlYXJpbmcgb3IKKyAqCQlhY2tub3dsZWRnaW5nIGFueSBob3N0LWJhc2VkIGludGVycnVwdCBjaGlwcy4KKyAqCisgKiAgIENvbnRyb2wgRnVuY3Rpb25zIC0KKyAqCQlDb250cm9sIGZ1bmN0aW9ucyBhcmUgdGhvc2UgdXNlZCB0byBzdXBwb3J0IGZ1bmN0aW9ucyBzdWNoIGFzIGFkZGluZworICoJCW9yIGRlbGV0aW5nIG11bHRpY2FzdCBhZGRyZXNzZXMsIGVuYWJsaW5nIG9yIGRpc2FibGluZyBwYWNrZXQKKyAqCQlyZWNlcHRpb24gZmlsdGVycywgb3Igb3RoZXIgY3VzdG9tL3Byb3ByaWV0YXJ5IGNvbW1hbmRzLiAgUHJlc2VudGx5LAorICoJCXRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlICJnZXQgc3RhdGlzdGljcyIsICJzZXQgbXVsdGljYXN0IGxpc3QiLCBhbmQKKyAqCQkic2V0IG1hYyBhZGRyZXNzIiBmdW5jdGlvbnMgZGVmaW5lZCBieSBMaW51eC4gIEEgbGlzdCBvZiBwb3NzaWJsZQorICoJCWVuaGFuY2VtZW50cyBpbmNsdWRlOgorICoKKyAqCQkJCS0gQ3VzdG9tIGlvY3RsIGludGVyZmFjZSBmb3IgZXhlY3V0aW5nIHBvcnQgaW50ZXJmYWNlIGNvbW1hbmRzCisgKgkJCQktIEN1c3RvbSBpb2N0bCBpbnRlcmZhY2UgZm9yIGFkZGluZyB1bmljYXN0IGFkZHJlc3NlcyB0bworICoJCQkJICBhZGFwdGVyIENBTSAodG8gc3VwcG9ydCBicmlkZ2UgZnVuY3Rpb25zKS4KKyAqCQkJCS0gQ3VzdG9tIGlvY3RsIGludGVyZmFjZSBmb3Igc3VwcG9ydGluZyBmaXJtd2FyZSB1cGdyYWRlcy4KKyAqCisgKiAgIEhhcmR3YXJlIChwb3J0IGludGVyZmFjZSkgU3VwcG9ydCBSb3V0aW5lcyAtCisgKgkJVGhlIGRyaXZlciBmdW5jdGlvbiBuYW1lcyB0aGF0IHN0YXJ0IHdpdGggImRmeF9od18iIHJlcHJlc2VudAorICoJCWxvdy1sZXZlbCBwb3J0IGludGVyZmFjZSByb3V0aW5lcyB0aGF0IGFyZSBjYWxsZWQgZnJlcXVlbnRseS4gIFRoZXkKKyAqCQlpbmNsdWRlIGlzc3VpbmcgYSBETUEgb3IgcG9ydCBjb250cm9sIGNvbW1hbmQgdG8gdGhlIGFkYXB0ZXIsCisgKgkJcmVzZXR0aW5nIHRoZSBhZGFwdGVyLCBvciByZWFkaW5nIHRoZSBhZGFwdGVyIHN0YXRlLiAgU2luY2UgdGhlCisgKgkJZHJpdmVyIGluaXRpYWxpemF0aW9uIGFuZCBydW4tdGltZSBjb2RlIG11c3QgbWFrZSBjYWxscyBpbnRvIHRoZQorICoJCXBvcnQgaW50ZXJmYWNlLCB0aGVzZSByb3V0aW5lcyB3ZXJlIHdyaXR0ZW4gdG8gYmUgYXMgZ2VuZXJpYyBhbmQKKyAqCQl1c2FibGUgYXMgcG9zc2libGUuCisgKgorICogICBSZWNlaXZlIFBhdGggLQorICoJCVRoZSBhZGFwdGVyIERNQSBlbmdpbmUgc3VwcG9ydHMgYSAyNTYgZW50cnkgcmVjZWl2ZSBkZXNjcmlwdG9yIGJsb2NrCisgKgkJb2Ygd2hpY2ggdXAgdG8gMjU1IGVudHJpZXMgY2FuIGJlIHVzZWQgYXQgYW55IGdpdmVuIHRpbWUuICBUaGUKKyAqCQlhcmNoaXRlY3R1cmUgaXMgYSBzdGFuZGFyZCBwcm9kdWNlciwgY29uc3VtZXIsIGNvbXBsZXRpb24gbW9kZWwgaW4KKyAqCQl3aGljaCB0aGUgZHJpdmVyICJwcm9kdWNlcyIgcmVjZWl2ZSBidWZmZXJzIHRvIHRoZSBhZGFwdGVyLCB0aGUKKyAqCQlhZGFwdGVyICJjb25zdW1lcyIgdGhlIHJlY2VpdmUgYnVmZmVycyBieSBETUFpbmcgaW5jb21pbmcgcGFja2V0IGRhdGEsCisgKgkJYW5kIHRoZSBkcml2ZXIgImNvbXBsZXRlcyIgdGhlIHJlY2VpdmUgYnVmZmVycyBieSBzZXJ2aWNpbmcgdGhlCisgKgkJaW5jb21pbmcgcGFja2V0LCB0aGVuICJwcm9kdWNlcyIgYSBuZXcgYnVmZmVyIGFuZCBzdGFydHMgdGhlIGN5Y2xlCisgKgkJYWdhaW4uICBSZWNlaXZlIGJ1ZmZlcnMgY2FuIGJlIGZyYWdtZW50ZWQgaW4gdXAgdG8gMTYgZnJhZ21lbnRzCisgKgkJKGRlc2NyaXB0b3IJZW50cmllcykuICBGb3Igc2ltcGxpY2l0eSwgdGhpcyBkcml2ZXIgcG9zdHMKKyAqCQlzaW5nbGUtZnJhZ21lbnQgcmVjZWl2ZSBidWZmZXJzIG9mIDQ2MDggYnl0ZXMsIHRoZW4gYWxsb2NhdGVzIGEKKyAqCQlza19idWZmLCBjb3BpZXMgdGhlIGRhdGEsIHRoZW4gcmVwb3N0cyB0aGUgYnVmZmVyLiAgVG8gcmVkdWNlIENQVQorICoJCXV0aWxpemF0aW9uLCBhIGJldHRlciBhcHByb2FjaCB3b3VsZCBiZSB0byBwYXNzIHVwIHRoZSByZWNlaXZlCisgKgkJYnVmZmVyIChubyBleHRyYSBjb3B5KSB0aGVuIGFsbG9jYXRlIGFuZCBwb3N0IGEgcmVwbGFjZW1lbnQgYnVmZmVyLgorICoJCVRoaXMgaXMgYSBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudCB0aGF0IHNob3VsZCBiZSBsb29rZWQgaW50byBhdAorICoJCXNvbWUgcG9pbnQuCisgKgorICogICBUcmFuc21pdCBQYXRoIC0KKyAqCQlMaWtlIHRoZSByZWNlaXZlIHBhdGgsIHRoZSBhZGFwdGVyIERNQSBlbmdpbmUgc3VwcG9ydHMgYSAyNTYgZW50cnkKKyAqCQl0cmFuc21pdCBkZXNjcmlwdG9yIGJsb2NrIG9mIHdoaWNoIHVwIHRvIDI1NSBlbnRyaWVzIGNhbiBiZSB1c2VkIGF0CisgKgkJYW55CWdpdmVuIHRpbWUuICBUcmFuc21pdCBidWZmZXJzIGNhbiBiZSBmcmFnbWVudGVkCWluIHVwIHRvIDI1NQorICoJCWZyYWdtZW50cyAoZGVzY3JpcHRvciBlbnRyaWVzKS4gIFRoaXMgZHJpdmVyIGFsd2F5cyBwb3N0cyBvbmUKKyAqCQlmcmFnbWVudCBwZXIgdHJhbnNtaXQgcGFja2V0IHJlcXVlc3QuCisgKgorICoJCVRoZSBmcmFnbWVudCBjb250YWlucyB0aGUgZW50aXJlIHBhY2tldCBmcm9tIEZDIHRvIGVuZCBvZiBkYXRhLgorICoJCUJlZm9yZSBwb3N0aW5nIHRoZSBidWZmZXIgdG8gdGhlIGFkYXB0ZXIsIHRoZSBkcml2ZXIgc2V0cyBhIHRocmVlLWJ5dGUKKyAqCQlwYWNrZXQgcmVxdWVzdCBoZWFkZXIgKFBSSCkgd2hpY2ggaXMgcmVxdWlyZWQgYnkgdGhlIE1vdG9yb2xhIE1BQyBjaGlwCisgKgkJdXNlZCBvbiB0aGUgYWRhcHRlcnMuICBUaGUgUFJIIHRlbGxzIHRoZSBNQUMgdGhlIHR5cGUgb2YgdG9rZW4gdG8KKyAqCQlyZWNlaXZlL3NlbmQsIHdoZXRoZXIgb3Igbm90IHRvIGdlbmVyYXRlIGFuZCBhcHBlbmQgdGhlIENSQywgd2hldGhlcgorICoJCXN5bmNocm9ub3VzIG9yIGFzeW5jaHJvbm91cyBmcmFtaW5nIGlzIHVzZWQsIGV0Yy4gIFNpbmNlIHRoZSBQUkgKKyAqCQlkZWZpbml0aW9uIGlzIG5vdCBuZWNlc3NhcmlseSBjb25zaXN0ZW50IGFjcm9zcyBhbGwgRkRESSBjaGlwc2V0cywKKyAqCQl0aGUgZHJpdmVyLCByYXRoZXIgdGhhbiB0aGUgY29tbW9uIEZEREkgcGFja2V0IGhhbmRsZXIgcm91dGluZXMsCisgKgkJc2V0cyB0aGVzZSBieXRlcy4KKyAqCisgKgkJVG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgZGVzY3JpcHRvciBmZXRjaGVzIG5lZWRlZCBwZXIgdHJhbnNtaXQgcmVxdWVzdCwKKyAqCQl0aGUgZHJpdmVyIHRha2VzIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCB0aHJlZQorICoJCWJ5dGVzIGF2YWlsYWJsZSBiZWZvcmUgdGhlIHNrYi0+ZGF0YSBmaWVsZCBvbiB0aGUgb3V0Z29pbmcgdHJhbnNtaXQKKyAqCQlyZXF1ZXN0LiAgVGhpcyBpcyBndWFyYW50ZWVkIGJ5IGhhdmluZyBmZGRpX3NldHVwKCkgaW4gbmV0X2luaXQuYyBzZXQKKyAqCQlkZXYtPmhhcmRfaGVhZGVyX2xlbiB0byAyNCBieXRlcy4gIDIxIGJ5dGVzIGFjY291bnRzIGZvciB0aGUgbGFyZ2VzdAorICoJCWhlYWRlciBpbiBhbiA4MDIuMiBTTkFQIGZyYW1lLiAgVGhlIG90aGVyIDMgYnl0ZXMgYXJlIHRoZSBleHRyYSAicGFkIgorICoJCWJ5dGVzIHdoaWNoIHdlJ2xsIHVzZSB0byBzdG9yZSB0aGUgUFJILgorICoKKyAqCQlUaGVyZSdzIGEgc3VidGxlIGFkdmFudGFnZSB0byBhZGRpbmcgdGhlc2UgcGFkIGJ5dGVzIHRvIHRoZQorICoJCWhhcmRfaGVhZGVyX2xlbiwgaXQgZW5zdXJlcyB0aGF0IHRoZSBkYXRhIHBvcnRpb24gb2YgdGhlIHBhY2tldCBmb3IKKyAqCQlhbiA4MDIuMiBTTkFQIGZyYW1lIGlzIGxvbmd3b3JkIGFsaWduZWQuICBPdGhlciBGRERJIGRyaXZlcgorICoJCWltcGxlbWVudGF0aW9ucyBtYXkgbm90IG5lZWQgdGhlIGV4dHJhIHBhZGRpbmcgYW5kIGNhbiBzdGFydCBjb3B5aW5nCisgKgkJb3IgRE1BaW5nIGRpcmVjdGx5IGZyb20gdGhlIEZDIGJ5dGUgd2hpY2ggc3RhcnRzIGF0IHNrYi0+ZGF0YS4gIFNob3VsZAorICoJCWFub3RoZXIgZHJpdmVyIGltcGxlbWVudGF0aW9uIG5lZWQgQURESVRJT05BTCBwYWRkaW5nLCB0aGUgbmV0X2luaXQuYworICoJCW1vZHVsZSBzaG91bGQgYmUgdXBkYXRlZCBhbmQgZGV2LT5oYXJkX2hlYWRlcl9sZW4gc2hvdWxkIGJlIGluY3JlYXNlZC4KKyAqCQlOT1RFOiBUbyBtYWludGFpbiB0aGUgYWxpZ25tZW50IG9uIHRoZSBkYXRhIHBvcnRpb24gb2YgdGhlIHBhY2tldCwKKyAqCQlkZXYtPmhhcmRfaGVhZGVyX2xlbiBzaG91bGQgYWx3YXlzIGJlIGV2ZW5seSBkaXZpc2libGUgYnkgNCBhbmQgYXQKKyAqCQlsZWFzdCAyNCBieXRlcyBpbiBzaXplLgorICoKKyAqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorICoJCURhdGUJCU5hbWUJRGVzY3JpcHRpb24KKyAqCQkxNi1BdWctOTYJTFZTCQlDcmVhdGVkLgorICoJCTIwLUF1Zy05NglMVlMJCVVwZGF0ZWQgZGZ4X3Byb2JlIHNvIHRoYXQgdmVyc2lvbiBpbmZvcm1hdGlvbgorICoJCQkJCQkJc3RyaW5nIGlzIG9ubHkgZGlzcGxheWVkIGlmIDEgb3IgbW9yZSBjYXJkcyBhcmUKKyAqCQkJCQkJCWZvdW5kLiAgQ2hhbmdlZCBkZnhfcmN2X3F1ZXVlX3Byb2Nlc3MgdG8gY29weQorICoJCQkJCQkJMyBOVUxMIGJ5dGVzIGJlZm9yZSBGQyB0byBlbnN1cmUgdGhhdCBkYXRhIGlzCisgKgkJCQkJCQlsb25nd29yZCBhbGlnbmVkIGluIHJlY2VpdmUgYnVmZmVyLgorICoJCTA5LVNlcC05NglMVlMJCVVwZGF0ZWQgZGZ4X2N0bF9zZXRfbXVsdGljYXN0X2xpc3QgdG8gZW5hYmxlCisgKgkJCQkJCQlMTEMgZ3JvdXAgcHJvbWlzY3VvdXMgbW9kZSBpZiBtdWx0aWNhc3QgbGlzdAorICoJCQkJCQkJaXMgdG9vIGxhcmdlLiAgTExDIGluZGl2aWR1YWwvZ3JvdXAgcHJvbWlzY3VvdXMKKyAqCQkJCQkJCW1vZGUgaXMgbm93IGRpc2FibGVkIGlmIElGRl9QUk9NSVNDIGZsYWcgbm90IHNldC4KKyAqCQkJCQkJCWRmeF94bXRfcXVldWVfcGt0IG5vIGxvbmdlciBjaGVja3MgZm9yIE5VTEwgc2tiCisgKgkJCQkJCQlvbiBBbGFuIENveCByZWNvbW1lbmRhdGlvbi4gIEFkZGVkIG5vZGUgYWRkcmVzcworICoJCQkJCQkJb3ZlcnJpZGUgc3VwcG9ydC4KKyAqCQkxMi1TZXAtOTYJTFZTCQlSZXNldCBjdXJyZW50IGFkZHJlc3MgdG8gZmFjdG9yeSBhZGRyZXNzIGR1cmluZworICoJCQkJCQkJZGV2aWNlIG9wZW4uICBVcGRhdGVkIHRyYW5zbWl0IHBhdGggdG8gcG9zdCBhCisgKgkJCQkJCQlzaW5nbGUgZnJhZ21lbnQgd2hpY2ggaW5jbHVkZXMgUFJILT5lbmQgb2YgZGF0YS4KKyAqCQlNYXIgMjAwMAlBQwkJRGlkIHZhcmlvdXMgY2xlYW51cHMgZm9yIDIuMy54CisgKgkJSnVuIDIwMDAJamdhcnppawkJUENJIGFuZCByZXNvdXJjZSBhbGxvYyBjbGVhbnVwcworICoJCUp1bCAyMDAwCXRqZWVyZAkJTXVjaCBjbGVhbnVwIGFuZCBzb21lIGJ1ZyBmaXhlcworICoJCVNlcCAyMDAwCXRqZWVyZAkJRml4IGxlYWsgb24gdW5sb2FkLCBjb3NtZXRpYyBjb2RlIGNsZWFudXAKKyAqCQlGZWIgMjAwMQkJCVNrYiBhbGxvY2F0aW9uIGZpeGVzCisgKgkJRmViIDIwMDEJZGF2ZWoJCVBDSSBlbmFibGUgY2xlYW51cHMuCisgKgkJMDQgQXVnIDIwMDMJbWFjcm8JCUNvbnZlcnRlZCB0byB0aGUgRE1BIEFQSS4KKyAqCQkxNCBBdWcgMjAwNAltYWNybwkJRml4IGRldmljZSBuYW1lcyByZXBvcnRlZC4KKyAqLworCisvKiBJbmNsdWRlIGZpbGVzICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mZGRpZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJkZWZ4eC5oIgorCisvKiBWZXJzaW9uIGluZm9ybWF0aW9uIHN0cmluZyBzaG91bGQgYmUgdXBkYXRlZCBwcmlvciB0byBlYWNoIG5ldyByZWxlYXNlISAgKi8KKyNkZWZpbmUgRFJWX05BTUUgImRlZnh4IgorI2RlZmluZSBEUlZfVkVSU0lPTiAidjEuMDciCisjZGVmaW5lIERSVl9SRUxEQVRFICIyMDA0LzA4LzE0IgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJRFJWX05BTUUgIjogIiBEUlZfVkVSU0lPTiAiICIgRFJWX1JFTERBVEUKKwkiICBMYXdyZW5jZSBWLiBTdGVmYW5pIGFuZCBvdGhlcnNcbiI7CisKKyNkZWZpbmUgRFlOQU1JQ19CVUZGRVJTIDEKKworI2RlZmluZSBTS0JVRkZfUlhfQ09QWUJSRUFLIDIwMAorLyoKKyAqIE5FV19TS0JfU0laRSA9IFBJX1JDVl9EQVRBX0tfU0laRV9NQVgrMTI4IHRvIGFsbG93IDEyOCBieXRlCisgKiBhbGlnbm1lbnQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgRUlTQSBib2FyZHMuCisgKi8KKyNkZWZpbmUgTkVXX1NLQl9TSVpFIChQSV9SQ1ZfREFUQV9LX1NJWkVfTUFYKzEyOCkKKworLyogRGVmaW5lIG1vZHVsZS13aWRlIChzdGF0aWMpIHJvdXRpbmVzICovCisKK3N0YXRpYyB2b2lkCQlkZnhfYnVzX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAkJZGZ4X2J1c19jb25maWdfY2hlY2soREZYX2JvYXJkX3QgKmJwKTsKKworc3RhdGljIGludAkJZGZ4X2RyaXZlcl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnByaW50X25hbWUpOworc3RhdGljIGludAkJZGZ4X2FkYXBfaW5pdChERlhfYm9hcmRfdCAqYnAsIGludCBnZXRfYnVmZmVycyk7CisKK3N0YXRpYyBpbnQJCWRmeF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAkJZGZ4X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZAkJZGZ4X2ludF9wcl9oYWx0X2lkKERGWF9ib2FyZF90ICpicCk7CitzdGF0aWMgdm9pZAkJZGZ4X2ludF90eXBlXzBfcHJvY2VzcyhERlhfYm9hcmRfdCAqYnApOworc3RhdGljIHZvaWQJCWRmeF9pbnRfY29tbW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJCWRmeF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK3N0YXRpYyBzdHJ1Y3QJCW5ldF9kZXZpY2Vfc3RhdHMgKmRmeF9jdGxfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJCWRmeF9jdGxfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAkJZGZ4X2N0bF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CitzdGF0aWMgaW50CQlkZnhfY3RsX3VwZGF0ZV9jYW0oREZYX2JvYXJkX3QgKmJwKTsKK3N0YXRpYyBpbnQJCWRmeF9jdGxfdXBkYXRlX2ZpbHRlcnMoREZYX2JvYXJkX3QgKmJwKTsKKworc3RhdGljIGludAkJZGZ4X2h3X2RtYV9jbWRfcmVxKERGWF9ib2FyZF90ICpicCk7CitzdGF0aWMgaW50CQlkZnhfaHdfcG9ydF9jdHJsX3JlcShERlhfYm9hcmRfdCAqYnAsIFBJX1VJTlQzMgljb21tYW5kLCBQSV9VSU5UMzIgZGF0YV9hLCBQSV9VSU5UMzIgZGF0YV9iLCBQSV9VSU5UMzIgKmhvc3RfZGF0YSk7CitzdGF0aWMgdm9pZAkJZGZ4X2h3X2FkYXBfcmVzZXQoREZYX2JvYXJkX3QgKmJwLCBQSV9VSU5UMzIgdHlwZSk7CitzdGF0aWMgaW50CQlkZnhfaHdfYWRhcF9zdGF0ZV9yZChERlhfYm9hcmRfdCAqYnApOworc3RhdGljIGludAkJZGZ4X2h3X2RtYV91bmluaXQoREZYX2JvYXJkX3QgKmJwLCBQSV9VSU5UMzIgdHlwZSk7CisKK3N0YXRpYyBpbnQJCWRmeF9yY3ZfaW5pdChERlhfYm9hcmRfdCAqYnAsIGludCBnZXRfYnVmZmVycyk7CitzdGF0aWMgdm9pZAkJZGZ4X3Jjdl9xdWV1ZV9wcm9jZXNzKERGWF9ib2FyZF90ICpicCk7CitzdGF0aWMgdm9pZAkJZGZ4X3Jjdl9mbHVzaChERlhfYm9hcmRfdCAqYnApOworCitzdGF0aWMgaW50CQlkZnhfeG10X3F1ZXVlX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJCWRmeF94bXRfZG9uZShERlhfYm9hcmRfdCAqYnApOworc3RhdGljIHZvaWQJCWRmeF94bXRfZmx1c2goREZYX2JvYXJkX3QgKmJwKTsKKworLyogRGVmaW5lIG1vZHVsZS13aWRlIChzdGF0aWMpIHZhcmlhYmxlcyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnJvb3RfZGZ4X2Vpc2FfZGV2OworCisMCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X3BvcnRfd3JpdGVfYnl0ZSA9CisgKiA9IGRmeF9wb3J0X3JlYWRfYnl0ZQkgPQorICogPSBkZnhfcG9ydF93cml0ZV9sb25nID0KKyAqID0gZGZ4X3BvcnRfcmVhZF9sb25nICA9CisgKiA9PT09PT09PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBSb3V0aW5lcyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB2YWx1ZXMgZnJvbS90byBhZGFwdGVyCisgKiAgCisgKiBSZXR1cm5zOgorICogICBOb25lCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgYnAgICAgIC0gcG9pbnRlciB0byBib2FyZCBpbmZvcm1hdGlvbgorICogICBvZmZzZXQgLSByZWdpc3RlciBvZmZzZXQgZnJvbSBiYXNlIEkvTyBhZGRyZXNzCisgKiAgIGRhdGEgICAtIGZvciBkZnhfcG9ydF93cml0ZV9ieXRlIGFuZCBkZnhfcG9ydF93cml0ZV9sb25nLCB0aGlzCisgKgkJCSAgaXMgYSB2YWx1ZSB0byB3cml0ZS4KKyAqCQkJICBmb3IgZGZ4X3BvcnRfcmVhZF9ieXRlIGFuZCBkZnhfcG9ydF9yZWFkX2J5dGUsIHRoaXMKKyAqCQkJICBpcyBhIHBvaW50ZXIgdG8gc3RvcmUgdGhlIHJlYWQgdmFsdWUuCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVGhlc2Ugcm91dGluZXMgcGVyZm9ybSB0aGUgY29ycmVjdCBvcGVyYXRpb24gdG8gcmVhZCBvciB3cml0ZQorICogICB0aGUgYWRhcHRlciByZWdpc3Rlci4KKyAqICAgCisgKiAgIEVJU0EgcG9ydCBibG9jayBiYXNlIGFkZHJlc3NlcyBhcmUgYmFzZWQgb24gdGhlIHNsb3QgbnVtYmVyIGluIHdoaWNoIHRoZQorICogICBjb250cm9sbGVyIGlzIGluc3RhbGxlZC4gIEZvciBleGFtcGxlLCBpZiB0aGUgRUlTQSBjb250cm9sbGVyIGlzIGluc3RhbGxlZAorICogICBpbiBzbG90IDQsIHRoZSBwb3J0IGJsb2NrIGJhc2UgYWRkcmVzcyBpcyAweDQwMDAuICBJZiB0aGUgY29udHJvbGxlciBpcworICogICBpbnN0YWxsZWQgaW4gc2xvdCAyLCB0aGUgcG9ydCBibG9jayBiYXNlIGFkZHJlc3MgaXMgMHgyMDAwLCBhbmQgc28gb24uCisgKiAgIFRoaXMgcG9ydCBibG9jayBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgUERRLCBFU0lDLCBhbmQgREVGRUEgb24tYm9hcmQKKyAqICAgcmVnaXN0ZXJzIHVzaW5nIHRoZSByZWdpc3RlciBvZmZzZXRzIGRlZmluZWQgaW4gREVGWFguSC4KKyAqCisgKiAgIFBDSSBwb3J0IGJsb2NrIGJhc2UgYWRkcmVzc2VzIGFyZSBhc3NpZ25lZCBieSB0aGUgUENJIEJJT1Mgb3Igc3lzdGVtCisgKgkgZmlybXdhcmUuICBUaGVyZSBpcyBvbmUgMTI4IGJ5dGUgcG9ydCBibG9jayB3aGljaCBjYW4gYmUgYWNjZXNzZWQuICBJdAorICogICBhbGxvd3MgZm9yIEkvTyBtYXBwaW5nIG9mIGJvdGggUERRIGFuZCBQRkkgcmVnaXN0ZXJzIHVzaW5nIHRoZSByZWdpc3RlcgorICogICBvZmZzZXRzIGRlZmluZWQgaW4gREVGWFguSC4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIE5vbmUKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgYnAtPmJhc2VfYWRkciBpcyBhIHZhbGlkIGJhc2UgSS9PIGFkZHJlc3MgZm9yIHRoaXMgYWRhcHRlci4KKyAqICAgb2Zmc2V0IGlzIGEgdmFsaWQgcmVnaXN0ZXIgb2Zmc2V0IGZvciB0aGlzIGFkYXB0ZXIuCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBSYXRoZXIgdGhhbiBwcm9kdWNlIG1hY3JvcyBmb3IgdGhlc2UgZnVuY3Rpb25zLCB0aGVzZSByb3V0aW5lcworICogICBhcmUgZGVmaW5lZCB1c2luZyAiaW5saW5lIiB0byBlbnN1cmUgdGhhdCB0aGUgY29tcGlsZXIgd2lsbAorICogICBnZW5lcmF0ZSBpbmxpbmUgY29kZSBhbmQgbm90IHdhc3RlIGEgcHJvY2VkdXJlIGNhbGwgYW5kIHJldHVybi4KKyAqICAgVGhpcyBwcm92aWRlcyBhbGwgdGhlIGJlbmVmaXRzIG9mIG1hY3JvcywgYnV0IHdpdGggdGhlCisgKiAgIGFkdmFudGFnZSBvZiBzdHJpY3QgZGF0YSB0eXBlIGNoZWNraW5nLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZnhfcG9ydF93cml0ZV9ieXRlKAorCURGWF9ib2FyZF90CSpicCwKKwlpbnQJCQlvZmZzZXQsCisJdTgJCQlkYXRhCisJKQorCisJeworCXUxNiBwb3J0ID0gYnAtPmJhc2VfYWRkciArIG9mZnNldDsKKworCW91dGIoZGF0YSwgcG9ydCk7CisJfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGZ4X3BvcnRfcmVhZF9ieXRlKAorCURGWF9ib2FyZF90CSpicCwKKwlpbnQJCQlvZmZzZXQsCisJdTgJCQkqZGF0YQorCSkKKworCXsKKwl1MTYgcG9ydCA9IGJwLT5iYXNlX2FkZHIgKyBvZmZzZXQ7CisKKwkqZGF0YSA9IGluYihwb3J0KTsKKwl9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZnhfcG9ydF93cml0ZV9sb25nKAorCURGWF9ib2FyZF90CSpicCwKKwlpbnQJCQlvZmZzZXQsCisJdTMyCQkJZGF0YQorCSkKKworCXsKKwl1MTYgcG9ydCA9IGJwLT5iYXNlX2FkZHIgKyBvZmZzZXQ7CisKKwlvdXRsKGRhdGEsIHBvcnQpOworCX0KKworc3RhdGljIGlubGluZSB2b2lkIGRmeF9wb3J0X3JlYWRfbG9uZygKKwlERlhfYm9hcmRfdAkqYnAsCisJaW50CQkJb2Zmc2V0LAorCXUzMgkJCSpkYXRhCisJKQorCisJeworCXUxNiBwb3J0ID0gYnAtPmJhc2VfYWRkciArIG9mZnNldDsKKworCSpkYXRhID0gaW5sKHBvcnQpOworCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT0KKyAqID0gZGZ4X2luaXRfb25lX3BjaV9vcl9laXNhID0KKyAqID09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgSW5pdGlhbGl6ZXMgYSBzdXBwb3J0ZWQgRkRESSBFSVNBIG9yIFBDSSBjb250cm9sbGVyCisgKiAgCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIHBkZXYgLSBwb2ludGVyIHRvIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gKE5VTEwgZm9yIEVJU0EpCisgKiAgIGlvYWRkciAtIHBvaW50ZXIgdG8gcG9ydCAoTlVMTCBmb3IgUENJKQorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKgorICogUmV0dXJuIENvZGVzOgorICogICAwCQkgLSBUaGlzIGRldmljZSAoZmRkaTAsIGZkZGkxLCBldGMpIGNvbmZpZ3VyZWQgc3VjY2Vzc2Z1bGx5CisgKiAgIC1FQlVTWSAgICAgIC0gRmFpbGVkIHRvIGdldCByZXNvdXJjZXMsIG9yIGRmeF9kcml2ZXJfaW5pdCBmYWlsZWQuCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIEl0IGNvbXBpbGVzIHNvIGl0IHNob3VsZCB3b3JrIDotKCAoUENJIGNhcmRzIGRvIDotKQorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgRGV2aWNlIHN0cnVjdHVyZXMgZm9yIEZEREkgYWRhcHRlcnMgKGZkZGkwLCBmZGRpMSwgZXRjKSBhcmUKKyAqICAgaW5pdGlhbGl6ZWQgYW5kIHRoZSBib2FyZCByZXNvdXJjZXMgYXJlIHJlYWQgYW5kIHN0b3JlZCBpbgorICogICB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgZGZ4X2luaXRfb25lX3BjaV9vcl9laXNhKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBsb25nIGlvYWRkcikKK3sKKwlzdGF0aWMgaW50IHZlcnNpb25fZGlzcDsKKwljaGFyICpwcmludF9uYW1lID0gRFJWX05BTUU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlERlhfYm9hcmRfdAkgICpicDsJCQkvKiBib2FyZCBwb2ludGVyICovCisJaW50IGFsbG9jX3NpemU7CQkJCS8qIHRvdGFsIGJ1ZmZlciBzaXplIHVzZWQgKi8KKwlpbnQgZXJyOworCisJaWYgKCF2ZXJzaW9uX2Rpc3ApIHsJLyogZGlzcGxheSB2ZXJzaW9uIGluZm8gaWYgYWRhcHRlciBpcyBmb3VuZCAqLworCQl2ZXJzaW9uX2Rpc3AgPSAxOwkvKiBzZXQgZGlzcGxheSBmbGFnIHRvIFRSVUUgc28gdGhhdCAqLworCQlwcmludGsodmVyc2lvbik7CS8qIHdlIG9ubHkgZGlzcGxheSB0aGlzIHN0cmluZyBPTkNFICovCisJfQorCisJaWYgKHBkZXYgIT0gTlVMTCkKKwkJcHJpbnRfbmFtZSA9IHBjaV9uYW1lKHBkZXYpOworCisJZGV2ID0gYWxsb2NfZmRkaWRldihzaXplb2YoKmJwKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGFsbG9jYXRlIGZkZGlkZXYsIGFib3J0aW5nXG4iLAorCQkgICAgICAgcHJpbnRfbmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIEVuYWJsZSBQQ0kgZGV2aWNlLiAqLworCWlmIChwZGV2ICE9IE5VTEwpIHsKKwkJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UgKHBkZXYpOworCQlpZiAoZXJyKSBnb3RvIGVycl9vdXQ7CisJCWlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMSk7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlicCA9IGRldi0+cHJpdjsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLAorCQkJICAgIHBkZXYgPyBQRklfS19DU1JfSU9fTEVOIDogUElfRVNJQ19LX0NTUl9JT19MRU4sCisJCQkgICAgcHJpbnRfbmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IHJlc2VydmUgSS9PIHJlc291cmNlICIKKwkJICAgICAgICIweCV4IEAgMHglbHgsIGFib3J0aW5nXG4iLCBwcmludF9uYW1lLAorCQkgICAgICAgcGRldiA/IFBGSV9LX0NTUl9JT19MRU4gOiBQSV9FU0lDX0tfQ1NSX0lPX0xFTiwgaW9hZGRyKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSBuZXcgZGV2aWNlIHN0cnVjdHVyZSAqLworCisJZGV2LT5iYXNlX2FkZHIJCQk9IGlvYWRkcjsgLyogc2F2ZSBwb3J0IChJL08pIGJhc2UgYWRkcmVzcyAqLworCisJZGV2LT5nZXRfc3RhdHMJCQk9IGRmeF9jdGxfZ2V0X3N0YXRzOworCWRldi0+b3BlbgkJCT0gZGZ4X29wZW47CisJZGV2LT5zdG9wCQkJPSBkZnhfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJCT0gZGZ4X3htdF9xdWV1ZV9wa3Q7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QJCT0gZGZ4X2N0bF9zZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MJCT0gZGZ4X2N0bF9zZXRfbWFjX2FkZHJlc3M7CisKKwlpZiAocGRldiA9PSBOVUxMKSB7CisJCS8qIEVJU0EgYm9hcmQgKi8KKwkJYnAtPmJ1c190eXBlID0gREZYX0JVU19UWVBFX0VJU0E7CisJCWJwLT5uZXh0ID0gcm9vdF9kZnhfZWlzYV9kZXY7CisJCXJvb3RfZGZ4X2Vpc2FfZGV2ID0gZGV2OworCX0gZWxzZSB7CisJCS8qIFBDSSBib2FyZCAqLworCQlicC0+YnVzX3R5cGUgPSBERlhfQlVTX1RZUEVfUENJOworCQlicC0+cGNpX2RldiA9IHBkZXY7CisJCXBjaV9zZXRfZHJ2ZGF0YSAocGRldiwgZGV2KTsKKwkJcGNpX3NldF9tYXN0ZXIgKHBkZXYpOworCX0KKworCWlmIChkZnhfZHJpdmVyX2luaXQoZGV2LCBwcmludF9uYW1lKSAhPSBERlhfS19TVUNDRVNTKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9yZWdpb247CisJfQorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2tmcmVlOworCisJcHJpbnRrKCIlczogcmVnaXN0ZXJlZCBhcyAlc1xuIiwgcHJpbnRfbmFtZSwgZGV2LT5uYW1lKTsKKwlyZXR1cm4gMDsKKworZXJyX291dF9rZnJlZToKKwlhbGxvY19zaXplID0gc2l6ZW9mKFBJX0RFU0NSX0JMT0NLKSArCisJCSAgICAgUElfQ01EX1JFUV9LX1NJWkVfTUFYICsgUElfQ01EX1JTUF9LX1NJWkVfTUFYICsKKyNpZm5kZWYgRFlOQU1JQ19CVUZGRVJTCisJCSAgICAgKGJwLT5yY3ZfYnVmc190b19wb3N0ICogUElfUkNWX0RBVEFfS19TSVpFX01BWCkgKworI2VuZGlmCisJCSAgICAgc2l6ZW9mKFBJX0NPTlNVTUVSX0JMT0NLKSArCisJCSAgICAgKFBJX0FMSUdOX0tfREVTQ19CTEsgLSAxKTsKKwlpZiAoYnAtPmttYWxsb2NlZCkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBhbGxvY19zaXplLAorCQkJCSAgICBicC0+a21hbGxvY2VkLCBicC0+a21hbGxvY2VkX2RtYSk7CitlcnJfb3V0X3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIHBkZXYgPyBQRklfS19DU1JfSU9fTEVOIDogUElfRVNJQ19LX0NTUl9JT19MRU4pOworZXJyX291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRmeF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gZGZ4X2luaXRfb25lX3BjaV9vcl9laXNhKHBkZXYsIDApOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkZnhfZWlzYV9pbml0KHZvaWQpCit7CisJaW50IHJjID0gLUVOT0RFVjsKKwlpbnQgaTsJCQkvKiB1c2VkIGluIGZvciBsb29wcyAqLworCXUxNiBwb3J0OwkJLyogdGVtcG9yYXJ5IEkvTyAocG9ydCkgYWRkcmVzcyAqLworCXUzMiBzbG90X2lkOwkJLyogRUlTQSBoYXJkd2FyZSAoc2xvdCkgSUQgcmVhZCBmcm9tIGFkYXB0ZXIgKi8KKworCURCR19wcmludGsoIkluIGRmeF9laXNhX2luaXQuLi5cbiIpOworCisJLyogU2NhbiBmb3IgRkRESSBFSVNBIGNvbnRyb2xsZXJzICovCisKKwlmb3IgKGk9MDsgaSA8IERGWF9NQVhfRUlTQV9TTE9UUzsgaSsrKQkJLyogb25seSBzY2FuIGZvciB1cCB0byAxNiBFSVNBIHNsb3RzICovCisJeworCQlwb3J0ID0gKGkgPDwgMTIpICsgUElfRVNJQ19LX1NMT1RfSUQ7CS8qIHBvcnQgPSBJL08gYWRkcmVzcyBmb3IgcmVhZGluZyBzbG90IElEICovCisJCXNsb3RfaWQgPSBpbmwocG9ydCk7CQkJCQkvKiByZWFkIEVJU0EgSFcgKHNsb3QpIElEICovCisJCWlmICgoc2xvdF9pZCAmIDB4RjBGRkZGRkYpID09IERFRkVBX1BST0RVQ1RfSUQpCisJCXsKKwkJCXBvcnQgPSAoaSA8PCAxMik7CQkJCQkvKiByZWNhbGMgYmFzZSBhZGRyICovCisKKwkJCWlmIChkZnhfaW5pdF9vbmVfcGNpX29yX2Vpc2EoTlVMTCwgcG9ydCkgPT0gMCkgcmMgPSAwOworCQl9CisJfQorCXJldHVybiByYzsKK30KKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09CisgKiA9IGRmeF9idXNfaW5pdCA9CisgKiA9PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIEluaXRpYWxpemVzIEVJU0EgYW5kIFBDSSBjb250cm9sbGVyIGJ1cy1zcGVjaWZpYyBsb2dpYy4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBkZXYgLSBwb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIERldGVybWluZSBhbmQgc2F2ZSBhZGFwdGVyIElSUSBpbiBkZXZpY2UgdGFibGUsCisgKiAgIHRoZW4gcGVyZm9ybSBidXMtc3BlY2lmaWMgbG9naWMgaW5pdGlhbGl6YXRpb24uCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBOb25lCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIGRldi0+YmFzZV9hZGRyIGhhcyBhbHJlYWR5IGJlZW4gc2V0IHdpdGggdGhlIHByb3BlcgorICoJIGJhc2UgSS9PIGFkZHJlc3MgZm9yIHRoaXMgZGV2aWNlLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgSW50ZXJydXB0cyBhcmUgZW5hYmxlZCBhdCB0aGUgYWRhcHRlciBidXMtc3BlY2lmaWMgbG9naWMuCisgKiAgIE5vdGU6ICBJbnRlcnJ1cHRzIGF0IHRoZSBETUEgZW5naW5lIChQRFEgY2hpcCkgYXJlIG5vdAorICogICBlbmFibGVkIHlldC4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZGZ4X2J1c19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJREZYX2JvYXJkX3QgKmJwID0gZGV2LT5wcml2OworCXU4CQkJdmFsOwkvKiB1c2VkIGZvciBJL08gcmVhZC93cml0ZXMgKi8KKworCURCR19wcmludGsoIkluIGRmeF9idXNfaW5pdC4uLlxuIik7CisKKwkvKgorCSAqIEluaXRpYWxpemUgYmFzZSBJL08gYWRkcmVzcyBmaWVsZCBpbiBicCBzdHJ1Y3R1cmUKKwkgKgorCSAqIE5vdGU6IGJwLT5iYXNlX2FkZHIgaXMgdGhlIHNhbWUgYXMgZGV2LT5iYXNlX2FkZHIuCisJICoJCSBJdCdzIHVzZWZ1bCBiZWNhdXNlIG9mdGVuIHdlJ2xsIG5lZWQgdG8gcmVhZAorCSAqCQkgb3Igd3JpdGUgcmVnaXN0ZXJzIHdoZXJlIHdlIGFscmVhZHkgaGF2ZSB0aGUKKwkgKgkJIGJwIHBvaW50ZXIgaW5zdGVhZCBvZiB0aGUgZGV2IHBvaW50ZXIuICBIYXZpbmcKKwkgKgkJIHRoZSBiYXNlIGFkZHJlc3MgaW4gdGhlIGJwIHN0cnVjdHVyZSB3aWxsCisJICoJCSBzYXZlIGEgcG9pbnRlciBkZXJlZmVyZW5jZS4KKwkgKgorCSAqCQkgSU1QT1JUQU5UISEgVGhpcyBmaWVsZCBtdXN0IGJlIGRlZmluZWQgYmVmb3JlCisJICoJCSBhbnkgb2YgdGhlIGRmeF9wb3J0XyogaW5saW5lIGZ1bmN0aW9ucyBhcmUKKwkgKgkJIGNhbGxlZC4KKwkgKi8KKworCWJwLT5iYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8qIEFuZCBhIHBvaW50ZXIgYmFjayB0byB0aGUgbmV0X2RldmljZSBzdHJ1Y3QgKi8KKwlicC0+ZGV2ID0gZGV2OworCisJLyogSW5pdGlhbGl6ZSBhZGFwdGVyIGJhc2VkIG9uIGJ1cyB0eXBlICovCisKKwlpZiAoYnAtPmJ1c190eXBlID09IERGWF9CVVNfVFlQRV9FSVNBKQorCQl7CisJCS8qIEdldCB0aGUgaW50ZXJydXB0IGxldmVsIGZyb20gdGhlIEVTSUMgY2hpcCAqLworCisJCWRmeF9wb3J0X3JlYWRfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsICZ2YWwpOworCQlzd2l0Y2ggKCh2YWwgJiBQSV9DT05GSUdfU1RBVF8wX01fSVJRKSA+PiBQSV9DT05GSUdfU1RBVF8wX1ZfSVJRKQorCQkJeworCQkJY2FzZSBQSV9DT05GSUdfU1RBVF8wX0lSUV9LXzk6CisJCQkJZGV2LT5pcnEgPSA5OworCQkJCWJyZWFrOworCisJCQljYXNlIFBJX0NPTkZJR19TVEFUXzBfSVJRX0tfMTA6CisJCQkJZGV2LT5pcnEgPSAxMDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQSV9DT05GSUdfU1RBVF8wX0lSUV9LXzExOgorCQkJCWRldi0+aXJxID0gMTE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUElfQ09ORklHX1NUQVRfMF9JUlFfS18xNToKKwkJCQlkZXYtPmlycSA9IDE1OworCQkJCWJyZWFrOworCQkJfQorCisJCS8qIEVuYWJsZSBhY2Nlc3MgdG8gSS9PIG9uIHRoZSBib2FyZCBieSB3cml0aW5nIDB4MDMgdG8gRnVuY3Rpb24gQ29udHJvbCBSZWdpc3RlciAqLworCisJCWRmeF9wb3J0X3dyaXRlX2J5dGUoYnAsIFBJX0VTSUNfS19GVU5DVElPTl9DTlRSTCwgUElfRVNJQ19LX0ZVTkNUSU9OX0NOVFJMX0lPX0VOQik7CisKKwkJLyogU2V0IHRoZSBJL08gZGVjb2RlIHJhbmdlIG9mIHRoZSBib2FyZCAqLworCisJCXZhbCA9ICgoZGV2LT5iYXNlX2FkZHIgPj4gMTIpIDw8IFBJX0lPX0NNUF9WX1NMT1QpOworCQlkZnhfcG9ydF93cml0ZV9ieXRlKGJwLCBQSV9FU0lDX0tfSU9fQ01QXzBfMSwgdmFsKTsKKwkJZGZ4X3BvcnRfd3JpdGVfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NNUF8xXzEsIHZhbCk7CisKKwkJLyogRW5hYmxlIGFjY2VzcyB0byByZXN0IG9mIG1vZHVsZSAoaW5jbHVkaW5nIFBEUSBhbmQgcGFja2V0IG1lbW9yeSkgKi8KKworCQlkZnhfcG9ydF93cml0ZV9ieXRlKGJwLCBQSV9FU0lDX0tfU0xPVF9DTlRSTCwgUElfU0xPVF9DTlRSTF9NX0VOQik7CisKKwkJLyoKKwkJICogTWFwIFBEUSByZWdpc3RlcnMgaW50byBJL08gc3BhY2UuICBUaGlzIGlzIGRvbmUgYnkgY2xlYXJpbmcgYSBiaXQKKwkJICogaW4gQnVyc3QgSG9sZG9mZiByZWdpc3Rlci4KKwkJICovCisKKwkJZGZ4X3BvcnRfcmVhZF9ieXRlKGJwLCBQSV9FU0lDX0tfQlVSU1RfSE9MRE9GRiwgJnZhbCk7CisJCWRmeF9wb3J0X3dyaXRlX2J5dGUoYnAsIFBJX0VTSUNfS19CVVJTVF9IT0xET0ZGLCAodmFsICYgflBJX0JVUlNUX0hPTERPRkZfTV9NRU1fTUFQKSk7CisKKwkJLyogRW5hYmxlIGludGVycnVwdHMgYXQgRUlTQSBidXMgaW50ZXJmYWNlIGNoaXAgKEVTSUMpICovCisKKwkJZGZ4X3BvcnRfcmVhZF9ieXRlKGJwLCBQSV9FU0lDX0tfSU9fQ09ORklHX1NUQVRfMCwgJnZhbCk7CisJCWRmeF9wb3J0X3dyaXRlX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCAodmFsIHwgUElfQ09ORklHX1NUQVRfMF9NX0lOVF9FTkIpKTsKKwkJfQorCWVsc2UKKwkJeworCQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGJwLT5wY2lfZGV2OworCisJCS8qIEdldCB0aGUgaW50ZXJydXB0IGxldmVsIGZyb20gdGhlIFBDSSBDb25maWd1cmF0aW9uIFRhYmxlICovCisKKwkJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisKKwkJLyogQ2hlY2sgTGF0ZW5jeSBUaW1lciBhbmQgc2V0IGlmIGxlc3MgdGhhbiBtaW5pbWFsICovCisKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsICZ2YWwpOworCQlpZiAodmFsIDwgUEZJX0tfTEFUX1RJTUVSX01JTikJLyogaWYgbGVzcyB0aGFuIG1pbiwgb3ZlcnJpZGUgd2l0aCBkZWZhdWx0ICovCisJCQl7CisJCQl2YWwgPSBQRklfS19MQVRfVElNRVJfREVGOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCB2YWwpOworCQkJfQorCisJCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGF0IFBDSSBidXMgaW50ZXJmYWNlIGNoaXAgKFBGSSkgKi8KKworCQlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQRklfS19SRUdfTU9ERV9DVFJMLCAoUEZJX01PREVfTV9QRFFfSU5UX0VOQiB8IFBGSV9NT0RFX01fRE1BX0VOQikpOworCQl9CisJfQorCisMCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9idXNfY29uZmlnX2NoZWNrID0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBDaGVja3MgdGhlIGNvbmZpZ3VyYXRpb24gKGJ1cnN0IHNpemUsIGZ1bGwtZHVwbGV4LCBldGMuKSAgSWYgYW55IHBhcmFtZXRlcnMKKyAqICAgYXJlIGlsbGVnYWwsIHRoZW4gdGhpcyByb3V0aW5lIHdpbGwgc2V0IG5ldyBkZWZhdWx0cy4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBicCAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBGb3IgUmV2aXNpb24gMSBGRERJIEVJU0EsIFJldmlzaW9uIDIgb3IgbGF0ZXIgRkRESSBFSVNBIHdpdGggcmV2IEUgb3IgbGF0ZXIKKyAqICAgUERRLCBhbmQgYWxsIEZEREkgUENJIGNvbnRyb2xsZXJzLCBhbGwgdmFsdWVzIGFyZSBsZWdhbC4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIE5vbmUKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgZGZ4X2FkYXBfaW5pdCBoYXMgTk9UIGJlZW4gY2FsbGVkIHlldCBzbyBidXJzdCBzaXplIGFuZCBvdGhlciBpdGVtcyBoYXZlCisgKiAgIG5vdCBiZWVuIHNldC4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZGZ4X2J1c19jb25maWdfY2hlY2soREZYX2JvYXJkX3QgKmJwKQoreworCWludAlzdGF0dXM7CQkJCS8qIHJldHVybiBjb2RlIGZyb20gYWRhcHRlciBwb3J0IGNvbnRyb2wgY2FsbCAqLworCXUzMglzbG90X2lkOwkJCS8qIEVJU0EtYnVzIGhhcmR3YXJlIGlkIChERUMzMDAxLCBERUMzMDAyLC4uLikgKi8KKwl1MzIJaG9zdF9kYXRhOwkJCS8qIExXIGRhdGEgcmV0dXJuZWQgZnJvbSBwb3J0IGNvbnRyb2wgY2FsbCAqLworCisJREJHX3ByaW50aygiSW4gZGZ4X2J1c19jb25maWdfY2hlY2suLi5cbiIpOworCisJLyogQ29uZmlndXJhdGlvbiBjaGVjayBvbmx5IHZhbGlkIGZvciBFSVNBIGFkYXB0ZXIgKi8KKworCWlmIChicC0+YnVzX3R5cGUgPT0gREZYX0JVU19UWVBFX0VJU0EpCisJCXsKKwkJZGZ4X3BvcnRfcmVhZF9sb25nKGJwLCBQSV9FU0lDX0tfU0xPVF9JRCwgJnNsb3RfaWQpOworCisJCS8qCisJCSAqIEZpcnN0IGNoZWNrIGlmIHJldmlzaW9uIDIgRUlTQSBjb250cm9sbGVyLiAgUmV2LiAxIGNhcmRzIHVzZWQKKwkJICogUERRIHJldmlzaW9uIEIsIHNvIG5vIHdvcmthcm91bmQgbmVlZGVkIGluIHRoaXMgY2FzZS4gIFJldi4gMworCQkgKiBjYXJkcyB1c2VkIFBEUSByZXZpc2lvbiBFLCBzbyBubyB3b3JrYXJvdW5kIG5lZWRlZCBpbiB0aGlzCisJCSAqIGNhc2UsIGVpdGhlci4gIE9ubHkgUmV2LiAyIGNhcmRzIHVzZWQgZWl0aGVyIFJldi4gRCBvciBFCisJCSAqIGNoaXBzLCBzbyB3ZSBtdXN0IHZlcmlmeSB0aGUgY2hpcCByZXZpc2lvbiBvbiBSZXYuIDIgY2FyZHMuCisJCSAqLworCisJCWlmIChzbG90X2lkID09IERFRkVBX1BST0RfSURfMikKKwkJCXsKKwkJCS8qCisJCQkgKiBSZXZpc2lvbiAyIEZEREkgRUlTQSBjb250cm9sbGVyIGZvdW5kLCBzbyBsZXQncyBjaGVjayBQRFEKKwkJCSAqIHJldmlzaW9uIG9mIGFkYXB0ZXIuCisJCQkgKi8KKworCQkJc3RhdHVzID0gZGZ4X2h3X3BvcnRfY3RybF9yZXEoYnAsCisJCQkJCQkJCQkJCVBJX1BDVFJMX01fU1VCX0NNRCwKKwkJCQkJCQkJCQkJUElfU1VCX0NNRF9LX1BEUV9SRVZfR0VULAorCQkJCQkJCQkJCQkwLAorCQkJCQkJCQkJCQkmaG9zdF9kYXRhKTsKKwkJCWlmICgoc3RhdHVzICE9IERGWF9LX1NVQ0NFU1MpIHx8IChob3N0X2RhdGEgPT0gMikpCisJCQkJeworCQkJCS8qCisJCQkJICogRWl0aGVyIHdlIGNvdWxkbid0IGRldGVybWluZSB0aGUgUERRIHJldmlzaW9uLCBvcgorCQkJCSAqIHdlIGRldGVybWluZWQgdGhhdCBpdCBpcyBhdCByZXZpc2lvbiBELiAgSW4gZWl0aGVyIGNhc2UsCisJCQkJICogd2UgbmVlZCB0byBpbXBsZW1lbnQgdGhlIHdvcmthcm91bmQuCisJCQkJICovCisKKwkJCQkvKiBFbnN1cmUgdGhhdCB0aGUgYnVyc3Qgc2l6ZSBpcyBzZXQgdG8gOCBsb25nd29yZHMgb3IgbGVzcyAqLworCisJCQkJc3dpdGNoIChicC0+YnVyc3Rfc2l6ZSkKKwkJCQkJeworCQkJCQljYXNlIFBJX1BEQVRBX0JfRE1BX0JVUlNUX1NJWkVfMzI6CisJCQkJCWNhc2UgUElfUERBVEFfQl9ETUFfQlVSU1RfU0laRV8xNjoKKwkJCQkJCWJwLT5idXJzdF9zaXplID0gUElfUERBVEFfQl9ETUFfQlVSU1RfU0laRV84OworCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkvKiBFbnN1cmUgdGhhdCBmdWxsLWR1cGxleCBtb2RlIGlzIG5vdCBlbmFibGVkICovCisKKwkJCQlicC0+ZnVsbF9kdXBsZXhfZW5iID0gUElfU05NUF9LX0ZBTFNFOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X2RyaXZlcl9pbml0ID0KKyAqID09PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgSW5pdGlhbGl6ZXMgcmVtYWluaW5nIGFkYXB0ZXIgYm9hcmQgc3RydWN0dXJlIGluZm9ybWF0aW9uCisgKiAgIGFuZCBtYWtlcyBzdXJlIGFkYXB0ZXIgaXMgaW4gYSBzYWZlIHN0YXRlIHByaW9yIHRvIGRmeF9vcGVuKCkuCisgKiAgCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGRldiAtIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisgKiAgIHByaW50X25hbWUgLSBwcmludGFibGUgZGV2aWNlIG5hbWUKKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhZGRpdGlvbmFsIHJlc291cmNlcyBzdWNoIGFzIHRoZSBob3N0IG1lbW9yeQorICogICBibG9ja3MgbmVlZGVkIGJ5IHRoZSBhZGFwdGVyIChlZy4gZGVzY3JpcHRvciBhbmQgY29uc3VtZXIgYmxvY2tzKS4KKyAqCSBSZW1haW5pbmcgYnVzIGluaXRpYWxpemF0aW9uIHN0ZXBzIGFyZSBhbHNvIGNvbXBsZXRlZC4gIFRoZSBhZGFwdGVyCisgKiAgIGlzIGFsc28gcmVzZXQgc28gdGhhdCBpdCBpcyBpbiB0aGUgRE1BX1VOQVZBSUxBQkxFIHN0YXRlLiAgVGhlIE9TCisgKiAgIG11c3QgY2FsbCBkZnhfb3BlbigpIHRvIG9wZW4gdGhlIGFkYXB0ZXIgYW5kIGJyaW5nIGl0IG9uLWxpbmUuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBERlhfS19TVUNDRVNTCS0gaW5pdGlhbGl6YXRpb24gc3VjY2VlZGVkCisgKiAgIERGWF9LX0ZBSUxVUkUJLSBpbml0aWFsaXphdGlvbiBmYWlsZWQgLSBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5CisgKgkJCQkJCW9yIHJlYWQgYWRhcHRlciBNQUMgYWRkcmVzcworICoKKyAqIEFzc3VtcHRpb25zOgorICogICBNZW1vcnkgYWxsb2NhdGVkIGZyb20gcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSBjYWxsIGlzIHBoeXNpY2FsbHkKKyAqICAgY29udGlndW91cywgbG9ja2VkIG1lbW9yeS4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIEFkYXB0ZXIgaXMgcmVzZXQgYW5kIHNob3VsZCBiZSBpbiBETUFfVU5BVkFJTEFCTEUgc3RhdGUgYmVmb3JlCisgKiAgIHJldHVybmluZyBmcm9tIHRoaXMgcm91dGluZS4KKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkZnhfZHJpdmVyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnByaW50X25hbWUpCit7CisJREZYX2JvYXJkX3QgKmJwID0gZGV2LT5wcml2OworCWludAkJCWFsbG9jX3NpemU7CQkJLyogdG90YWwgYnVmZmVyIHNpemUgbmVlZGVkICovCisJY2hhcgkJKnRvcF92LCAqY3Vycl92OwkvKiB2aXJ0dWFsIGFkZHJzIGludG8gbWVtb3J5IGJsb2NrICovCisJZG1hX2FkZHJfdAkJdG9wX3AsIGN1cnJfcDsJCS8qIHBoeXNpY2FsIGFkZHJzIGludG8gbWVtb3J5IGJsb2NrICovCisJdTMyCQkJZGF0YTsJCQkJLyogaG9zdCBkYXRhIHJlZ2lzdGVyIHZhbHVlICovCisKKwlEQkdfcHJpbnRrKCJJbiBkZnhfZHJpdmVyX2luaXQuLi5cbiIpOworCisJLyogSW5pdGlhbGl6ZSBidXMtc3BlY2lmaWMgaGFyZHdhcmUgcmVnaXN0ZXJzICovCisKKwlkZnhfYnVzX2luaXQoZGV2KTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBkZWZhdWx0IHZhbHVlcyBmb3IgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMKKwkgKgorCSAqIE5vdGU6IEFsbCBvZiB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBvbmVzIHRoYXQgYSB1c2VyIG1heQorCSAqICAgICAgIHdhbnQgdG8gY3VzdG9taXplLiAgSXQnZCBiZSBuaWNlIHRvIGJyZWFrIHRoZXNlCisJICoJCSBvdXQgaW50byBTcGFjZS5jIG9yIHNvbWVwbGFjZSBlbHNlIHRoYXQncyBtb3JlCisJICoJCSBhY2Nlc3NpYmxlL3VuZGVyc3RhbmRhYmxlIHRoYW4gdGhpcyBmaWxlLgorCSAqLworCisJYnAtPmZ1bGxfZHVwbGV4X2VuYgkJPSBQSV9TTk1QX0tfRkFMU0U7CisJYnAtPnJlcV90dHJ0CQkJPSA4ICogMTI1MDA7CQkvKiA4bXMgaW4gODAgbmFub3NlYyB1bml0cyAqLworCWJwLT5idXJzdF9zaXplCQkJPSBQSV9QREFUQV9CX0RNQV9CVVJTVF9TSVpFX0RFRjsKKwlicC0+cmN2X2J1ZnNfdG9fcG9zdAk9IFJDVl9CVUZTX0RFRjsKKworCS8qCisJICogRW5zdXJlIHRoYXQgSFcgY29uZmlndXJhdGlvbiBpcyBPSworCSAqCisJICogTm90ZTogRGVwZW5kaW5nIG9uIHRoZSBoYXJkd2FyZSByZXZpc2lvbiwgd2UgbWF5IG5lZWQgdG8gbW9kaWZ5CisJICogICAgICAgc29tZSBvZiB0aGUgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMgdG8gd29ya2Fyb3VuZCBoYXJkd2FyZQorCSAqICAgICAgIGxpbWl0YXRpb25zLiAgV2UnbGwgcGVyZm9ybSB0aGlzIGNvbmZpZ3VyYXRpb24gY2hlY2sgQUZURVIKKwkgKiAgICAgICBzZXR0aW5nIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorCSAqLworCisJZGZ4X2J1c19jb25maWdfY2hlY2soYnApOworCisJLyogRGlzYWJsZSBQRFEgaW50ZXJydXB0cyBmaXJzdCAqLworCisJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUElfUERRX0tfUkVHX0hPU1RfSU5UX0VOQiwgUElfSE9TVF9JTlRfS19ESVNBQkxFX0FMTF9JTlRTKTsKKworCS8qIFBsYWNlIGFkYXB0ZXIgaW4gRE1BX1VOQVZBSUxBQkxFIHN0YXRlIGJ5IHJlc2V0dGluZyBhZGFwdGVyICovCisKKwkodm9pZCkgZGZ4X2h3X2RtYV91bmluaXQoYnAsIFBJX1BEQVRBX0FfUkVTRVRfTV9TS0lQX1NUKTsKKworCS8qICBSZWFkIHRoZSBmYWN0b3J5IE1BQyBhZGRyZXNzIGZyb20gdGhlIGFkYXB0ZXIgdGhlbiBzYXZlIGl0ICovCisKKwlpZiAoZGZ4X2h3X3BvcnRfY3RybF9yZXEoYnAsIFBJX1BDVFJMX01fTUxBLCBQSV9QREFUQV9BX01MQV9LX0xPLCAwLAorCQkJCSAmZGF0YSkgIT0gREZYX0tfU1VDQ0VTUykgeworCQlwcmludGsoIiVzOiBDb3VsZCBub3QgcmVhZCBhZGFwdGVyIGZhY3RvcnkgTUFDIGFkZHJlc3MhXG4iLAorCQkgICAgICAgcHJpbnRfbmFtZSk7CisJCXJldHVybihERlhfS19GQUlMVVJFKTsKKwl9CisJbWVtY3B5KCZicC0+ZmFjdG9yeV9tYWNfYWRkclswXSwgJmRhdGEsIHNpemVvZih1MzIpKTsKKworCWlmIChkZnhfaHdfcG9ydF9jdHJsX3JlcShicCwgUElfUENUUkxfTV9NTEEsIFBJX1BEQVRBX0FfTUxBX0tfSEksIDAsCisJCQkJICZkYXRhKSAhPSBERlhfS19TVUNDRVNTKSB7CisJCXByaW50aygiJXM6IENvdWxkIG5vdCByZWFkIGFkYXB0ZXIgZmFjdG9yeSBNQUMgYWRkcmVzcyFcbiIsCisJCSAgICAgICBwcmludF9uYW1lKTsKKwkJcmV0dXJuKERGWF9LX0ZBSUxVUkUpOworCX0KKwltZW1jcHkoJmJwLT5mYWN0b3J5X21hY19hZGRyWzRdLCAmZGF0YSwgc2l6ZW9mKHUxNikpOworCisJLyoKKwkgKiBTZXQgY3VycmVudCBhZGRyZXNzIHRvIGZhY3RvcnkgYWRkcmVzcworCSAqCisJICogTm90ZTogTm9kZSBhZGRyZXNzIG92ZXJyaWRlIHN1cHBvcnQgaXMgaGFuZGxlZCB0aHJvdWdoCisJICogICAgICAgZGZ4X2N0bF9zZXRfbWFjX2FkZHJlc3MuCisJICovCisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYnAtPmZhY3RvcnlfbWFjX2FkZHIsIEZERElfS19BTEVOKTsKKwlpZiAoYnAtPmJ1c190eXBlID09IERGWF9CVVNfVFlQRV9FSVNBKQorCQlwcmludGsoIiVzOiBERUZFQSBhdCBJL08gYWRkciA9IDB4JWxYLCBJUlEgPSAlZCwgIgorCQkgICAgICAgIkhhcmR3YXJlIGFkZHIgPSAlMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWFxuIiwKKwkJICAgICAgIHByaW50X25hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwKKwkJICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sCisJCSAgICAgICBkZXYtPmRldl9hZGRyWzJdLCBkZXYtPmRldl9hZGRyWzNdLAorCQkgICAgICAgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisJZWxzZQorCQlwcmludGsoIiVzOiBERUZQQSBhdCBJL08gYWRkciA9IDB4JWxYLCBJUlEgPSAlZCwgIgorCQkgICAgICAgIkhhcmR3YXJlIGFkZHIgPSAlMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlgtJTAyWFxuIiwKKwkJICAgICAgIHByaW50X25hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwKKwkJICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sCisJCSAgICAgICBkZXYtPmRldl9hZGRyWzJdLCBkZXYtPmRldl9hZGRyWzNdLAorCQkgICAgICAgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisKKwkvKgorCSAqIEdldCBtZW1vcnkgZm9yIGRlc2NyaXB0b3IgYmxvY2ssIGNvbnN1bWVyIGJsb2NrLCBhbmQgb3RoZXIgYnVmZmVycworCSAqIHRoYXQgbmVlZCB0byBiZSBETUEgcmVhZCBvciB3cml0dGVuIHRvIGJ5IHRoZSBhZGFwdGVyLgorCSAqLworCisJYWxsb2Nfc2l6ZSA9IHNpemVvZihQSV9ERVNDUl9CTE9DSykgKworCQkJCQlQSV9DTURfUkVRX0tfU0laRV9NQVggKworCQkJCQlQSV9DTURfUlNQX0tfU0laRV9NQVggKworI2lmbmRlZiBEWU5BTUlDX0JVRkZFUlMKKwkJCQkJKGJwLT5yY3ZfYnVmc190b19wb3N0ICogUElfUkNWX0RBVEFfS19TSVpFX01BWCkgKworI2VuZGlmCisJCQkJCXNpemVvZihQSV9DT05TVU1FUl9CTE9DSykgKworCQkJCQkoUElfQUxJR05fS19ERVNDX0JMSyAtIDEpOworCWJwLT5rbWFsbG9jZWQgPSB0b3BfdiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGJwLT5wY2lfZGV2LCBhbGxvY19zaXplLAorCQkJCQkJICAgICAmYnAtPmttYWxsb2NlZF9kbWEpOworCWlmICh0b3BfdiA9PSBOVUxMKSB7CisJCXByaW50aygiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGhvc3QgYnVmZmVycyAiCisJCSAgICAgICAiYW5kIHN0cnVjdHVyZXMhXG4iLCBwcmludF9uYW1lKTsKKwkJcmV0dXJuKERGWF9LX0ZBSUxVUkUpOworCX0KKwltZW1zZXQodG9wX3YsIDAsIGFsbG9jX3NpemUpOwkvKiB6ZXJvIG91dCBtZW1vcnkgYmVmb3JlIGNvbnRpbnVpbmcgKi8KKwl0b3BfcCA9IGJwLT5rbWFsbG9jZWRfZG1hOwkvKiBnZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBidWZmZXIgKi8KKworCS8qCisJICogIFRvIGd1YXJhbnRlZSB0aGUgOEsgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGUgZGVzY3JpcHRvciBibG9jaywgOEsgLSAxCisJICogIHBsdXMgdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIHdhcyBhbGxvY2F0ZWQuICBUaGUgcGh5c2ljYWwgYWRkcmVzcworCSAqCWlzIG5vdyA4SyBhbGlnbmVkLiAgQnkgY2FydmluZyB1cCB0aGUgbWVtb3J5IGluIGEgc3BlY2lmaWMgb3JkZXIsCisJICogIHdlJ2xsIGd1YXJhbnRlZSB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBmb3IgYWxsIG90aGVyIHN0cnVjdHVyZXMuCisJICoKKwkgKiAgTm90ZTogSWYgdGhlIGFzc3VtcHRpb25zIGNoYW5nZSByZWdhcmRpbmcgdGhlIG5vbi1wYWdlZCwgbm9uLWNhY2hlZCwKKwkgKgkJICBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgbmF0dXJlIG9mIHRoZSBtZW1vcnkgYmxvY2sgb3IgdGhlIGFkZHJlc3MKKwkgKgkJICBhbGlnbm1lbnRzLCB0aGVuIHdlJ2xsIG5lZWQgdG8gaW1wbGVtZW50IGEgZGlmZmVyZW50IGFsZ29yaXRobQorCSAqCQkgIGZvciBhbGxvY2F0aW5nIHRoZSBuZWVkZWQgbWVtb3J5LgorCSAqLworCisJY3Vycl9wID0gQUxJR04odG9wX3AsIFBJX0FMSUdOX0tfREVTQ19CTEspOworCWN1cnJfdiA9IHRvcF92ICsgKGN1cnJfcCAtIHRvcF9wKTsKKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIGRlc2NyaXB0b3IgYmxvY2sgKi8KKworCWJwLT5kZXNjcl9ibG9ja192aXJ0ID0gKFBJX0RFU0NSX0JMT0NLICopIGN1cnJfdjsKKwlicC0+ZGVzY3JfYmxvY2tfcGh5cyA9IGN1cnJfcDsKKwljdXJyX3YgKz0gc2l6ZW9mKFBJX0RFU0NSX0JMT0NLKTsKKwljdXJyX3AgKz0gc2l6ZW9mKFBJX0RFU0NSX0JMT0NLKTsKKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIGNvbW1hbmQgcmVxdWVzdCBidWZmZXIgKi8KKworCWJwLT5jbWRfcmVxX3ZpcnQgPSAoUElfRE1BX0NNRF9SRVEgKikgY3Vycl92OworCWJwLT5jbWRfcmVxX3BoeXMgPSBjdXJyX3A7CisJY3Vycl92ICs9IFBJX0NNRF9SRVFfS19TSVpFX01BWDsKKwljdXJyX3AgKz0gUElfQ01EX1JFUV9LX1NJWkVfTUFYOworCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgY29tbWFuZCByZXNwb25zZSBidWZmZXIgKi8KKworCWJwLT5jbWRfcnNwX3ZpcnQgPSAoUElfRE1BX0NNRF9SU1AgKikgY3Vycl92OworCWJwLT5jbWRfcnNwX3BoeXMgPSBjdXJyX3A7CisJY3Vycl92ICs9IFBJX0NNRF9SU1BfS19TSVpFX01BWDsKKwljdXJyX3AgKz0gUElfQ01EX1JTUF9LX1NJWkVfTUFYOworCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIExMQyBob3N0IHJlY2VpdmUgcXVldWUgYnVmZmVycyAqLworCisJYnAtPnJjdl9ibG9ja192aXJ0ID0gY3Vycl92OworCWJwLT5yY3ZfYmxvY2tfcGh5cyA9IGN1cnJfcDsKKworI2lmbmRlZiBEWU5BTUlDX0JVRkZFUlMKKwljdXJyX3YgKz0gKGJwLT5yY3ZfYnVmc190b19wb3N0ICogUElfUkNWX0RBVEFfS19TSVpFX01BWCk7CisJY3Vycl9wICs9IChicC0+cmN2X2J1ZnNfdG9fcG9zdCAqIFBJX1JDVl9EQVRBX0tfU0laRV9NQVgpOworI2VuZGlmCisKKwkvKiBSZXNlcnZlIHNwYWNlIGZvciB0aGUgY29uc3VtZXIgYmxvY2sgKi8KKworCWJwLT5jb25zX2Jsb2NrX3ZpcnQgPSAoUElfQ09OU1VNRVJfQkxPQ0sgKikgY3Vycl92OworCWJwLT5jb25zX2Jsb2NrX3BoeXMgPSBjdXJyX3A7CisKKwkvKiBEaXNwbGF5IHZpcnR1YWwgYW5kIHBoeXNpY2FsIGFkZHJlc3NlcyBpZiBkZWJ1ZyBkcml2ZXIgKi8KKworCURCR19wcmludGsoIiVzOiBEZXNjcmlwdG9yIGJsb2NrIHZpcnQgPSAlMGxYLCBwaHlzID0gJTBYXG4iLAorCQkgICBwcmludF9uYW1lLAorCQkgICAobG9uZylicC0+ZGVzY3JfYmxvY2tfdmlydCwgYnAtPmRlc2NyX2Jsb2NrX3BoeXMpOworCURCR19wcmludGsoIiVzOiBDb21tYW5kIFJlcXVlc3QgYnVmZmVyIHZpcnQgPSAlMGxYLCBwaHlzID0gJTBYXG4iLAorCQkgICBwcmludF9uYW1lLCAobG9uZylicC0+Y21kX3JlcV92aXJ0LCBicC0+Y21kX3JlcV9waHlzKTsKKwlEQkdfcHJpbnRrKCIlczogQ29tbWFuZCBSZXNwb25zZSBidWZmZXIgdmlydCA9ICUwbFgsIHBoeXMgPSAlMFhcbiIsCisJCSAgIHByaW50X25hbWUsIChsb25nKWJwLT5jbWRfcnNwX3ZpcnQsIGJwLT5jbWRfcnNwX3BoeXMpOworCURCR19wcmludGsoIiVzOiBSZWNlaXZlIGJ1ZmZlciBibG9jayB2aXJ0ID0gJTBsWCwgcGh5cyA9ICUwWFxuIiwKKwkJICAgcHJpbnRfbmFtZSwgKGxvbmcpYnAtPnJjdl9ibG9ja192aXJ0LCBicC0+cmN2X2Jsb2NrX3BoeXMpOworCURCR19wcmludGsoIiVzOiBDb25zdW1lciBibG9jayB2aXJ0ID0gJTBsWCwgcGh5cyA9ICUwWFxuIiwKKwkJICAgcHJpbnRfbmFtZSwgKGxvbmcpYnAtPmNvbnNfYmxvY2tfdmlydCwgYnAtPmNvbnNfYmxvY2tfcGh5cyk7CisKKwlyZXR1cm4oREZYX0tfU1VDQ0VTUyk7Cit9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09PQorICogPSBkZnhfYWRhcF9pbml0ID0KKyAqID09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIEJyaW5ncyB0aGUgYWRhcHRlciB0byB0aGUgbGluayBhdmFpbC9saW5rIHVuYXZhaWxhYmxlIHN0YXRlLgorICogIAorICogUmV0dXJuczoKKyAqICAgQ29uZGl0aW9uIGNvZGUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBicCAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqICAgZ2V0X2J1ZmZlcnMgLSBub24temVybyBpZiBidWZmZXJzIHRvIGJlIGFsbG9jYXRlZAorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIElzc3VlcyB0aGUgbG93LWxldmVsIGZpcm13YXJlL2hhcmR3YXJlIGNhbGxzIG5lY2Vzc2FyeSB0byBicmluZworICogICB0aGUgYWRhcHRlciB1cCwgb3IgdG8gcHJvcGVybHkgcmVzZXQgYW5kIHJlc3RvcmUgYWRhcHRlciBkdXJpbmcKKyAqICAgcnVuLXRpbWUuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBERlhfS19TVUNDRVNTIC0gQWRhcHRlciBicm91Z2h0IHVwIHN1Y2Nlc3NmdWxseQorICogICBERlhfS19GQUlMVVJFIC0gQWRhcHRlciBpbml0aWFsaXphdGlvbiBmYWlsZWQKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgYnAtPnJlc2V0X3R5cGUgc2hvdWxkIGJlIHNldCB0byBhIHZhbGlkIHJlc2V0IHR5cGUgdmFsdWUgYmVmb3JlCisgKiAgIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgQWRhcHRlciBzaG91bGQgYmUgaW4gTElOS19BVkFJTEFCTEUgb3IgTElOS19VTkFWQUlMQUJMRSBzdGF0ZQorICogICB1cG9uIGEgc3VjY2Vzc2Z1bCByZXR1cm4gb2YgdGhpcyByb3V0aW5lLgorICovCisKK3N0YXRpYyBpbnQgZGZ4X2FkYXBfaW5pdChERlhfYm9hcmRfdCAqYnAsIGludCBnZXRfYnVmZmVycykKKwl7CisJREJHX3ByaW50aygiSW4gZGZ4X2FkYXBfaW5pdC4uLlxuIik7CisKKwkvKiBEaXNhYmxlIFBEUSBpbnRlcnJ1cHRzIGZpcnN0ICovCisKKwlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQSV9QRFFfS19SRUdfSE9TVF9JTlRfRU5CLCBQSV9IT1NUX0lOVF9LX0RJU0FCTEVfQUxMX0lOVFMpOworCisJLyogUGxhY2UgYWRhcHRlciBpbiBETUFfVU5BVkFJTEFCTEUgc3RhdGUgYnkgcmVzZXR0aW5nIGFkYXB0ZXIgKi8KKworCWlmIChkZnhfaHdfZG1hX3VuaW5pdChicCwgYnAtPnJlc2V0X3R5cGUpICE9IERGWF9LX1NVQ0NFU1MpCisJCXsKKwkJcHJpbnRrKCIlczogQ291bGQgbm90IHVuaW5pdGlhbGl6ZS9yZXNldCBhZGFwdGVyIVxuIiwgYnAtPmRldi0+bmFtZSk7CisJCXJldHVybihERlhfS19GQUlMVVJFKTsKKwkJfQorCisJLyoKKwkgKiBXaGVuIHRoZSBQRFEgaXMgcmVzZXQsIHNvbWUgZmFsc2UgVHlwZSAwIGludGVycnVwdHMgbWF5IGJlIHBlbmRpbmcsCisJICogc28gd2UnbGwgYWNrbm93bGVkZ2UgYWxsIFR5cGUgMCBpbnRlcnJ1cHRzIG5vdyBiZWZvcmUgY29udGludWluZy4KKwkgKi8KKworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19UWVBFXzBfU1RBVFVTLCBQSV9IT1NUX0lOVF9LX0FDS19BTExfVFlQRV8wKTsKKworCS8qCisJICogQ2xlYXIgVHlwZSAxIGFuZCBUeXBlIDIgcmVnaXN0ZXJzIGJlZm9yZSBnb2luZyB0byBETUFfQVZBSUxBQkxFIHN0YXRlCisJICoKKwkgKiBOb3RlOiBXZSBvbmx5IG5lZWQgdG8gY2xlYXIgaG9zdCBjb3BpZXMgb2YgdGhlc2UgcmVnaXN0ZXJzLiAgVGhlIFBEUSByZXNldAorCSAqICAgICAgIHRha2VzIGNhcmUgb2YgdGhlIG9uLWJvYXJkIHJlZ2lzdGVyIHZhbHVlcy4KKwkgKi8KKworCWJwLT5jbWRfcmVxX3JlZy5sd29yZAk9IDA7CisJYnAtPmNtZF9yc3BfcmVnLmx3b3JkCT0gMDsKKwlicC0+cmN2X3htdF9yZWcubHdvcmQJPSAwOworCisJLyogQ2xlYXIgY29uc3VtZXIgYmxvY2sgYmVmb3JlIGdvaW5nIHRvIERNQV9BVkFJTEFCTEUgc3RhdGUgKi8KKworCW1lbXNldChicC0+Y29uc19ibG9ja192aXJ0LCAwLCBzaXplb2YoUElfQ09OU1VNRVJfQkxPQ0spKTsKKworCS8qIEluaXRpYWxpemUgdGhlIERNQSBCdXJzdCBTaXplICovCisKKwlpZiAoZGZ4X2h3X3BvcnRfY3RybF9yZXEoYnAsCisJCQkJCQkJUElfUENUUkxfTV9TVUJfQ01ELAorCQkJCQkJCVBJX1NVQl9DTURfS19CVVJTVF9TSVpFX1NFVCwKKwkJCQkJCQlicC0+YnVyc3Rfc2l6ZSwKKwkJCQkJCQlOVUxMKSAhPSBERlhfS19TVUNDRVNTKQorCQl7CisJCXByaW50aygiJXM6IENvdWxkIG5vdCBzZXQgYWRhcHRlciBidXJzdCBzaXplIVxuIiwgYnAtPmRldi0+bmFtZSk7CisJCXJldHVybihERlhfS19GQUlMVVJFKTsKKwkJfQorCisJLyoKKwkgKiBTZXQgYmFzZSBhZGRyZXNzIG9mIENvbnN1bWVyIEJsb2NrCisJICoKKwkgKiBBc3N1bXB0aW9uOiAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBjb25zdW1lciBibG9jayBpcyA2NCBieXRlCisJICoJCQkgICBhbGlnbmVkLiAgVGhhdCBpcywgYml0cyAwLTUgb2YgdGhlIGFkZHJlc3MgbXVzdCBiZSB6ZXJvLgorCSAqLworCisJaWYgKGRmeF9od19wb3J0X2N0cmxfcmVxKGJwLAorCQkJCQkJCVBJX1BDVFJMX01fQ09OU19CTE9DSywKKwkJCQkJCQlicC0+Y29uc19ibG9ja19waHlzLAorCQkJCQkJCTAsCisJCQkJCQkJTlVMTCkgIT0gREZYX0tfU1VDQ0VTUykKKwkJeworCQlwcmludGsoIiVzOiBDb3VsZCBub3Qgc2V0IGNvbnN1bWVyIGJsb2NrIGFkZHJlc3MhXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuKERGWF9LX0ZBSUxVUkUpOworCQl9CisKKwkvKgorCSAqIFNldCBiYXNlIGFkZHJlc3Mgb2YgRGVzY3JpcHRvciBCbG9jayBhbmQgYnJpbmcgYWRhcHRlciB0byBETUFfQVZBSUxBQkxFIHN0YXRlCisJICoKKwkgKiBOb3RlOiBXZSBhbHNvIHNldCB0aGUgbGl0ZXJhbCBhbmQgZGF0YSBzd2FwcGluZyByZXF1aXJlbWVudHMgaW4gdGhpcworCSAqCSAgICAgY29tbWFuZC4gIFNpbmNlIHRoaXMgZHJpdmVyIHByZXNlbnRseSBydW5zIG9uIEludGVsIHBsYXRmb3JtcworCSAqCQkgd2hpY2ggYXJlIExpdHRsZSBFbmRpYW4sIHdlJ2xsIHRlbGwgdGhlIGFkYXB0ZXIgdG8gYnl0ZSBzd2FwCisJICoJCSBkYXRhIG9ubHkuICBUaGlzIGNvZGUgd2lsbCBuZWVkIHRvIGNoYW5nZSB3aGVuIHdlIHN1cHBvcnQKKwkgKgkJIEJpZyBFbmRpYW4gc3lzdGVtcyAoZWcuIFBvd2VyUEMpLgorCSAqCisJICogQXNzdW1wdGlvbjogMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgZGVzY3JpcHRvciBibG9jayBpcyA4S2J5dGUKKwkgKiAgICAgICAgICAgICBhbGlnbmVkLiAgVGhhdCBpcywgYml0cyAwLTEyIG9mIHRoZSBhZGRyZXNzIG11c3QgYmUgemVyby4KKwkgKi8KKworCWlmIChkZnhfaHdfcG9ydF9jdHJsX3JlcShicCwKKwkJCQkJCQlQSV9QQ1RSTF9NX0lOSVQsCisJCQkJCQkJKHUzMikgKGJwLT5kZXNjcl9ibG9ja19waHlzIHwgUElfUERBVEFfQV9JTklUX01fQlNXQVBfREFUQSksCisJCQkJCQkJMCwKKwkJCQkJCQlOVUxMKSAhPSBERlhfS19TVUNDRVNTKQorCQl7CisJCXByaW50aygiJXM6IENvdWxkIG5vdCBzZXQgZGVzY3JpcHRvciBibG9jayBhZGRyZXNzIVxuIiwgYnAtPmRldi0+bmFtZSk7CisJCXJldHVybihERlhfS19GQUlMVVJFKTsKKwkJfQorCisJLyogU2V0IHRyYW5zbWl0IGZsdXNoIHRpbWVvdXQgdmFsdWUgKi8KKworCWJwLT5jbWRfcmVxX3ZpcnQtPmNtZF90eXBlID0gUElfQ01EX0tfQ0hBUlNfU0VUOworCWJwLT5jbWRfcmVxX3ZpcnQtPmNoYXJfc2V0Lml0ZW1bMF0uaXRlbV9jb2RlCT0gUElfSVRFTV9LX0ZMVVNIX1RJTUU7CisJYnAtPmNtZF9yZXFfdmlydC0+Y2hhcl9zZXQuaXRlbVswXS52YWx1ZQkJPSAzOwkvKiAzIHNlY29uZHMgKi8KKwlicC0+Y21kX3JlcV92aXJ0LT5jaGFyX3NldC5pdGVtWzBdLml0ZW1faW5kZXgJPSAwOworCWJwLT5jbWRfcmVxX3ZpcnQtPmNoYXJfc2V0Lml0ZW1bMV0uaXRlbV9jb2RlCT0gUElfSVRFTV9LX0VPTDsKKwlpZiAoZGZ4X2h3X2RtYV9jbWRfcmVxKGJwKSAhPSBERlhfS19TVUNDRVNTKQorCQl7CisJCXByaW50aygiJXM6IERNQSBjb21tYW5kIHJlcXVlc3QgZmFpbGVkIVxuIiwgYnAtPmRldi0+bmFtZSk7CisJCXJldHVybihERlhfS19GQUlMVVJFKTsKKwkJfQorCisJLyogU2V0IHRoZSBpbml0aWFsIHZhbHVlcyBmb3IgZUZEWEVuYWJsZSBhbmQgTUFDVFJlcSBNSUIgb2JqZWN0cyAqLworCisJYnAtPmNtZF9yZXFfdmlydC0+Y21kX3R5cGUgPSBQSV9DTURfS19TTk1QX1NFVDsKKwlicC0+Y21kX3JlcV92aXJ0LT5zbm1wX3NldC5pdGVtWzBdLml0ZW1fY29kZQk9IFBJX0lURU1fS19GRFhfRU5CX0RJUzsKKwlicC0+Y21kX3JlcV92aXJ0LT5zbm1wX3NldC5pdGVtWzBdLnZhbHVlCQk9IGJwLT5mdWxsX2R1cGxleF9lbmI7CisJYnAtPmNtZF9yZXFfdmlydC0+c25tcF9zZXQuaXRlbVswXS5pdGVtX2luZGV4CT0gMDsKKwlicC0+Y21kX3JlcV92aXJ0LT5zbm1wX3NldC5pdGVtWzFdLml0ZW1fY29kZQk9IFBJX0lURU1fS19NQUNfVF9SRVE7CisJYnAtPmNtZF9yZXFfdmlydC0+c25tcF9zZXQuaXRlbVsxXS52YWx1ZQkJPSBicC0+cmVxX3R0cnQ7CisJYnAtPmNtZF9yZXFfdmlydC0+c25tcF9zZXQuaXRlbVsxXS5pdGVtX2luZGV4CT0gMDsKKwlicC0+Y21kX3JlcV92aXJ0LT5zbm1wX3NldC5pdGVtWzJdLml0ZW1fY29kZQk9IFBJX0lURU1fS19FT0w7CisJaWYgKGRmeF9od19kbWFfY21kX3JlcShicCkgIT0gREZYX0tfU1VDQ0VTUykKKwkJeworCQlwcmludGsoIiVzOiBETUEgY29tbWFuZCByZXF1ZXN0IGZhaWxlZCFcbiIsIGJwLT5kZXYtPm5hbWUpOworCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CisJCX0KKworCS8qIEluaXRpYWxpemUgYWRhcHRlciBDQU0gKi8KKworCWlmIChkZnhfY3RsX3VwZGF0ZV9jYW0oYnApICE9IERGWF9LX1NVQ0NFU1MpCisJCXsKKwkJcHJpbnRrKCIlczogQWRhcHRlciBDQU0gdXBkYXRlIGZhaWxlZCFcbiIsIGJwLT5kZXYtPm5hbWUpOworCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CisJCX0KKworCS8qIEluaXRpYWxpemUgYWRhcHRlciBmaWx0ZXJzICovCisKKwlpZiAoZGZ4X2N0bF91cGRhdGVfZmlsdGVycyhicCkgIT0gREZYX0tfU1VDQ0VTUykKKwkJeworCQlwcmludGsoIiVzOiBBZGFwdGVyIGZpbHRlcnMgdXBkYXRlIGZhaWxlZCFcbiIsIGJwLT5kZXYtPm5hbWUpOworCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CisJCX0KKworCS8qCisJICogUmVtb3ZlIGFueSBleGlzdGluZyBkeW5hbWljIGJ1ZmZlcnMgKGkuZS4gaWYgdGhlIGFkYXB0ZXIgaXMgYmVpbmcKKwkgKiByZWluaXRpYWxpemVkKQorCSAqLworCisJaWYgKGdldF9idWZmZXJzKQorCQlkZnhfcmN2X2ZsdXNoKGJwKTsKKworCS8qIEluaXRpYWxpemUgcmVjZWl2ZSBkZXNjcmlwdG9yIGJsb2NrIGFuZCBwcm9kdWNlIGJ1ZmZlcnMgKi8KKworCWlmIChkZnhfcmN2X2luaXQoYnAsIGdldF9idWZmZXJzKSkKKwkgICAgICAgIHsKKwkJcHJpbnRrKCIlczogUmVjZWl2ZSBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIsIGJwLT5kZXYtPm5hbWUpOworCQlpZiAoZ2V0X2J1ZmZlcnMpCisJCQlkZnhfcmN2X2ZsdXNoKGJwKTsKKwkJcmV0dXJuKERGWF9LX0ZBSUxVUkUpOworCQl9CisKKwkvKiBJc3N1ZSBTVEFSVCBjb21tYW5kIGFuZCBicmluZyBhZGFwdGVyIHRvIExJTktfKFVOKUFWQUlMQUJMRSBzdGF0ZSAqLworCisJYnAtPmNtZF9yZXFfdmlydC0+Y21kX3R5cGUgPSBQSV9DTURfS19TVEFSVDsKKwlpZiAoZGZ4X2h3X2RtYV9jbWRfcmVxKGJwKSAhPSBERlhfS19TVUNDRVNTKQorCQl7CisJCXByaW50aygiJXM6IFN0YXJ0IGNvbW1hbmQgZmFpbGVkXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJaWYgKGdldF9idWZmZXJzKQorCQkJZGZ4X3Jjdl9mbHVzaChicCk7CisJCXJldHVybihERlhfS19GQUlMVVJFKTsKKwkJfQorCisJLyogSW5pdGlhbGl6YXRpb24gc3VjY2VlZGVkLCByZWVuYWJsZSBQRFEgaW50ZXJydXB0cyAqLworCisJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUElfUERRX0tfUkVHX0hPU1RfSU5UX0VOQiwgUElfSE9TVF9JTlRfS19FTkFCTEVfREVGX0lOVFMpOworCXJldHVybihERlhfS19TVUNDRVNTKTsKKwl9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT0KKyAqID0gZGZ4X29wZW4gPQorICogPT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIE9wZW5zIHRoZSBhZGFwdGVyCisgKiAgCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGRldiAtIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyBmdW5jdGlvbiBicmluZ3MgdGhlIGFkYXB0ZXIgdG8gYW4gb3BlcmF0aW9uYWwgc3RhdGUuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICAwCQkgLSBBZGFwdGVyIHdhcyBzdWNjZXNzZnVsbHkgb3BlbmVkCisgKiAgIC1FQUdBSU4gLSBDb3VsZCBub3QgcmVnaXN0ZXIgSVJRIG9yIGFkYXB0ZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIFRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIGEgZGV2aWNlIHRoYXQgd2FzCisgKiAgIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIEFkYXB0ZXIgc2hvdWxkIGJlIGluIExJTktfQVZBSUxBQkxFIG9yIExJTktfVU5BVkFJTEFCTEUgc3RhdGUKKyAqICAgaWYgdGhlIG9wZW4gaXMgc3VjY2Vzc2Z1bC4KKyAqLworCitzdGF0aWMgaW50IGRmeF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlERlhfYm9hcmRfdAkqYnAgPSBkZXYtPnByaXY7CisKKwlEQkdfcHJpbnRrKCJJbiBkZnhfb3Blbi4uLlxuIik7CisJCisJLyogUmVnaXN0ZXIgSVJRIC0gc3VwcG9ydCBzaGFyZWQgaW50ZXJydXB0cyBieSBwYXNzaW5nIGRldmljZSBwdHIgKi8KKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAodm9pZCAqKWRmeF9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZXF1ZXN0ZWQgSVJRICVkIGlzIGJ1c3lcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogU2V0IGN1cnJlbnQgYWRkcmVzcyB0byBmYWN0b3J5IE1BQyBhZGRyZXNzCisJICoKKwkgKiBOb3RlOiBXZSd2ZSBhbHJlYWR5IGRvbmUgdGhpcyBzdGVwIGluIGRmeF9kcml2ZXJfaW5pdC4KKwkgKiAgICAgICBIb3dldmVyLCBpdCdzIHBvc3NpYmxlIHRoYXQgYSB1c2VyIGhhcyBzZXQgYSBub2RlCisJICoJCSBhZGRyZXNzIG92ZXJyaWRlLCB0aGVuIGNsb3NlZCBhbmQgcmVvcGVuZWQgdGhlCisJICoJCSBhZGFwdGVyLiAgVW5sZXNzIHdlIHJlc2V0IHRoZSBkZXZpY2UgYWRkcmVzcyBmaWVsZAorCSAqCQkgbm93LCB3ZSdsbCBjb250aW51ZSB0byB1c2UgdGhlIGV4aXN0aW5nIG1vZGlmaWVkCisJICoJCSBhZGRyZXNzLgorCSAqLworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGJwLT5mYWN0b3J5X21hY19hZGRyLCBGRERJX0tfQUxFTik7CisKKwkvKiBDbGVhciBsb2NhbCB1bmljYXN0L211bHRpY2FzdCBhZGRyZXNzIHRhYmxlcyBhbmQgY291bnRzICovCisKKwltZW1zZXQoYnAtPnVjX3RhYmxlLCAwLCBzaXplb2YoYnAtPnVjX3RhYmxlKSk7CisJbWVtc2V0KGJwLT5tY190YWJsZSwgMCwgc2l6ZW9mKGJwLT5tY190YWJsZSkpOworCWJwLT51Y19jb3VudCA9IDA7CisJYnAtPm1jX2NvdW50ID0gMDsKKworCS8qIERpc2FibGUgcHJvbWlzY3VvdXMgZmlsdGVyIHNldHRpbmdzICovCisKKwlicC0+aW5kX2dyb3VwX3Byb20JPSBQSV9GU1RBVEVfS19CTE9DSzsKKwlicC0+Z3JvdXBfcHJvbQkJPSBQSV9GU1RBVEVfS19CTE9DSzsKKworCXNwaW5fbG9ja19pbml0KCZicC0+bG9jayk7CisKKwkvKiBSZXNldCBhbmQgaW5pdGlhbGl6ZSBhZGFwdGVyICovCisKKwlicC0+cmVzZXRfdHlwZSA9IFBJX1BEQVRBX0FfUkVTRVRfTV9TS0lQX1NUOwkvKiBza2lwIHNlbGYtdGVzdCAqLworCWlmIChkZnhfYWRhcF9pbml0KGJwLCAxKSAhPSBERlhfS19TVUNDRVNTKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQWRhcHRlciBvcGVuIGZhaWxlZCFcbiIsIGRldi0+bmFtZSk7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBTZXQgZGV2aWNlIHN0cnVjdHVyZSBpbmZvICovCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4oMCk7Cit9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09CisgKiA9IGRmeF9jbG9zZSA9CisgKiA9PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIENsb3NlcyB0aGUgZGV2aWNlL21vZHVsZS4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIENvbmRpdGlvbiBjb2RlCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgZGV2IC0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBUaGlzIHJvdXRpbmUgY2xvc2VzIHRoZSBhZGFwdGVyIGFuZCBicmluZ3MgaXQgdG8gYSBzYWZlIHN0YXRlLgorICogICBUaGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBpcyBkZXJlZ2lzdGVyZWQgd2l0aCB0aGUgT1MuCisgKiAgIFRoZSBhZGFwdGVyIGNhbiBiZSBvcGVuZWQgYWdhaW4gd2l0aCBhbm90aGVyIGNhbGwgdG8gZGZ4X29wZW4oKS4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIEFsd2F5cyByZXR1cm4gMC4KKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgTm8gZnVydGhlciByZXF1ZXN0cyBmb3IgdGhpcyBhZGFwdGVyIGFyZSBtYWRlIGFmdGVyIHRoaXMgcm91dGluZSBpcworICogICBjYWxsZWQuICBkZnhfb3BlbigpIGNhbiBiZSBjYWxsZWQgdG8gcmVzZXQgYW5kIHJlaW5pdGlhbGl6ZSB0aGUKKyAqICAgYWRhcHRlci4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIEFkYXB0ZXIgc2hvdWxkIGJlIGluIERNQV9VTkFWQUlMQUJMRSBzdGF0ZSB1cG9uIGNvbXBsZXRpb24gb2YgdGhpcworICogICByb3V0aW5lLgorICovCisKK3N0YXRpYyBpbnQgZGZ4X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJREZYX2JvYXJkX3QJKmJwID0gZGV2LT5wcml2OworCisJREJHX3ByaW50aygiSW4gZGZ4X2Nsb3NlLi4uXG4iKTsKKworCS8qIERpc2FibGUgUERRIGludGVycnVwdHMgZmlyc3QgKi8KKworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19IT1NUX0lOVF9FTkIsIFBJX0hPU1RfSU5UX0tfRElTQUJMRV9BTExfSU5UUyk7CisKKwkvKiBQbGFjZSBhZGFwdGVyIGluIERNQV9VTkFWQUlMQUJMRSBzdGF0ZSBieSByZXNldHRpbmcgYWRhcHRlciAqLworCisJKHZvaWQpIGRmeF9od19kbWFfdW5pbml0KGJwLCBQSV9QREFUQV9BX1JFU0VUX01fU0tJUF9TVCk7CisKKwkvKgorCSAqIEZsdXNoIGFueSBwZW5kaW5nIHRyYW5zbWl0IGJ1ZmZlcnMKKwkgKgorCSAqIE5vdGU6IEl0J3MgaW1wb3J0YW50IHRoYXQgd2UgZmx1c2ggdGhlIHRyYW5zbWl0IGJ1ZmZlcnMKKwkgKgkJIEJFRk9SRSB3ZSBjbGVhciBvdXIgY29weSBvZiB0aGUgVHlwZSAyIHJlZ2lzdGVyLgorCSAqCQkgT3RoZXJ3aXNlLCB3ZSdsbCBoYXZlIG5vIGlkZWEgaG93IG1hbnkgYnVmZmVycworCSAqCQkgd2UgbmVlZCB0byBmcmVlLgorCSAqLworCisJZGZ4X3htdF9mbHVzaChicCk7CisKKwkvKgorCSAqIENsZWFyIFR5cGUgMSBhbmQgVHlwZSAyIHJlZ2lzdGVycyBhZnRlciBhZGFwdGVyIHJlc2V0CisJICoKKwkgKiBOb3RlOiBFdmVuIHRob3VnaCB3ZSdyZSBjbG9zaW5nIHRoZSBhZGFwdGVyLCBpdCdzCisJICogICAgICAgcG9zc2libGUgdGhhdCBhbiBpbnRlcnJ1cHQgd2lsbCBvY2N1ciBhZnRlcgorCSAqCQkgZGZ4X2Nsb3NlIGlzIGNhbGxlZC4gIFdpdGhvdXQgc29tZSBhc3N1cmFuY2UgdG8KKwkgKgkJIHRoZSBjb250cmFyeSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0CisJICoJCSBwcm9jZXNzIHJlY2VpdmUgYW5kIHRyYW5zbWl0IExMQyBmcmFtZXMgYW5kIHVwZGF0ZQorCSAqCQkgdGhlIFR5cGUgMiByZWdpc3RlciB3aXRoIGJhZCBpbmZvcm1hdGlvbi4KKwkgKi8KKworCWJwLT5jbWRfcmVxX3JlZy5sd29yZAk9IDA7CisJYnAtPmNtZF9yc3BfcmVnLmx3b3JkCT0gMDsKKwlicC0+cmN2X3htdF9yZWcubHdvcmQJPSAwOworCisJLyogQ2xlYXIgY29uc3VtZXIgYmxvY2sgZm9yIHRoZSBzYW1lIHJlYXNvbiBnaXZlbiBhYm92ZSAqLworCisJbWVtc2V0KGJwLT5jb25zX2Jsb2NrX3ZpcnQsIDAsIHNpemVvZihQSV9DT05TVU1FUl9CTE9DSykpOworCisJLyogUmVsZWFzZSBhbGwgZHluYW1pY2FsbHkgYWxsb2NhdGUgc2tiIGluIHRoZSByZWNlaXZlIHJpbmcuICovCisKKwlkZnhfcmN2X2ZsdXNoKGJwKTsKKworCS8qIENsZWFyIGRldmljZSBzdHJ1Y3R1cmUgZmxhZ3MgKi8KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKiBEZXJlZ2lzdGVyIChmcmVlKSBJUlEgKi8KKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQorCXJldHVybigwKTsKK30KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X2ludF9wcl9oYWx0X2lkID0KKyAqID09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgRGlzcGxheXMgaGFsdCBpZCdzIGluIHN0cmluZyBmb3JtLgorICogIAorICogUmV0dXJuczoKKyAqICAgTm9uZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGJwIC0gcG9pbnRlciB0byBib2FyZCBpbmZvcm1hdGlvbgorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIERldGVybWluZSBjdXJyZW50IGhhbHQgaWQgYW5kIGRpc3BsYXkgYXBwcm9wcmlhdGUgc3RyaW5nLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgTm9uZQorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBOb25lCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBOb25lCisgKi8KKworc3RhdGljIHZvaWQgZGZ4X2ludF9wcl9oYWx0X2lkKERGWF9ib2FyZF90CSpicCkKKwl7CisJUElfVUlOVDMyCXBvcnRfc3RhdHVzOwkJCS8qIFBEUSBwb3J0IHN0YXR1cyByZWdpc3RlciB2YWx1ZSAqLworCVBJX1VJTlQzMgloYWx0X2lkOwkJCQkvKiBQRFEgcG9ydCBzdGF0dXMgaGFsdCBJRCAqLworCisJLyogUmVhZCB0aGUgbGF0ZXN0IHBvcnQgc3RhdHVzICovCisKKwlkZnhfcG9ydF9yZWFkX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19QT1JUX1NUQVRVUywgJnBvcnRfc3RhdHVzKTsKKworCS8qIERpc3BsYXkgaGFsdCBzdGF0ZSB0cmFuc2l0aW9uIGluZm9ybWF0aW9uICovCisKKwloYWx0X2lkID0gKHBvcnRfc3RhdHVzICYgUElfUFNUQVRVU19NX0hBTFRfSUQpID4+IFBJX1BTVEFUVVNfVl9IQUxUX0lEOworCXN3aXRjaCAoaGFsdF9pZCkKKwkJeworCQljYXNlIFBJX0hBTFRfSURfS19TRUxGVEVTVF9USU1FT1VUOgorCQkJcHJpbnRrKCIlczogSGFsdCBJRDogU2VsZnRlc3QgVGltZW91dFxuIiwgYnAtPmRldi0+bmFtZSk7CisJCQlicmVhazsKKworCQljYXNlIFBJX0hBTFRfSURfS19QQVJJVFlfRVJST1I6CisJCQlwcmludGsoIiVzOiBIYWx0IElEOiBIb3N0IEJ1cyBQYXJpdHkgRXJyb3JcbiIsIGJwLT5kZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQSV9IQUxUX0lEX0tfSE9TVF9ESVJfSEFMVDoKKwkJCXByaW50aygiJXM6IEhhbHQgSUQ6IEhvc3QtRGlyZWN0ZWQgSGFsdFxuIiwgYnAtPmRldi0+bmFtZSk7CisJCQlicmVhazsKKworCQljYXNlIFBJX0hBTFRfSURfS19TV19GQVVMVDoKKwkJCXByaW50aygiJXM6IEhhbHQgSUQ6IEFkYXB0ZXIgU29mdHdhcmUgRmF1bHRcbiIsIGJwLT5kZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQSV9IQUxUX0lEX0tfSFdfRkFVTFQ6CisJCQlwcmludGsoIiVzOiBIYWx0IElEOiBBZGFwdGVyIEhhcmR3YXJlIEZhdWx0XG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUElfSEFMVF9JRF9LX1BDX1RSQUNFOgorCQkJcHJpbnRrKCIlczogSGFsdCBJRDogRkRESSBOZXR3b3JrIFBDIFRyYWNlIFBhdGggVGVzdFxuIiwgYnAtPmRldi0+bmFtZSk7CisJCQlicmVhazsKKworCQljYXNlIFBJX0hBTFRfSURfS19ETUFfRVJST1I6CisJCQlwcmludGsoIiVzOiBIYWx0IElEOiBBZGFwdGVyIERNQSBFcnJvclxuIiwgYnAtPmRldi0+bmFtZSk7CisJCQlicmVhazsKKworCQljYXNlIFBJX0hBTFRfSURfS19JTUFHRV9DUkNfRVJST1I6CisJCQlwcmludGsoIiVzOiBIYWx0IElEOiBGaXJtd2FyZSBJbWFnZSBDUkMgRXJyb3JcbiIsIGJwLT5kZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQSV9IQUxUX0lEX0tfQlVTX0VYQ0VQVElPTjoKKwkJCXByaW50aygiJXM6IEhhbHQgSUQ6IDY4MDAwIEJ1cyBFeGNlcHRpb25cbiIsIGJwLT5kZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiJXM6IEhhbHQgSUQ6IFVua25vd24gKGNvZGUgPSAlWClcbiIsIGJwLT5kZXYtPm5hbWUsIGhhbHRfaWQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PQorICogPSBkZnhfaW50X3R5cGVfMF9wcm9jZXNzID0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIFByb2Nlc3NlcyBUeXBlIDAgaW50ZXJydXB0cy4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBicCAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBQcm9jZXNzZXMgYWxsIGVuYWJsZWQgVHlwZSAwIGludGVycnVwdHMuICBJZiB0aGUgcmVhc29uIGZvciB0aGUgaW50ZXJydXB0CisgKiAgIGlzIGEgc2VyaW91cyBmYXVsdCBvbiB0aGUgYWRhcHRlciwgdGhlbiBhbiBlcnJvciBtZXNzYWdlIGlzIGRpc3BsYXllZAorICogICBhbmQgdGhlIGFkYXB0ZXIgaXMgcmVzZXQuCisgKgorICogICBPbmUgdHJpY2t5IHBvdGVudGlhbCB0aW1pbmcgd2luZG93IGlzIHRoZSByYXBpZCBzdWNjZXNzaW9uIG9mICJsaW5rIGF2YWlsIgorICogICAibGluayB1bmF2YWlsIiBzdGF0ZSBjaGFuZ2UgaW50ZXJydXB0cy4gIFRoZSBhY2tub3dsZWRnZW1lbnQgb2YgdGhlIFR5cGUgMAorICogICBpbnRlcnJ1cHQgbXVzdCBiZSBkb25lIGJlZm9yZSByZWFkaW5nIHRoZSBzdGF0ZSBmcm9tIHRoZSBQb3J0IFN0YXR1cworICogICByZWdpc3Rlci4gIFRoaXMgaXMgdHJ1ZSBiZWNhdXNlIGEgc3RhdGUgY2hhbmdlIGNvdWxkIG9jY3VyIGFmdGVyIHJlYWRpbmcKKyAqICAgdGhlIGRhdGEsIGJ1dCBiZWZvcmUgYWNrbm93bGVkZ2luZyB0aGUgaW50ZXJydXB0LiAgSWYgdGhpcyBzdGF0ZSBjaGFuZ2UKKyAqICAgZG9lcyBoYXBwZW4sIGl0IHdvdWxkIGJlIGxvc3QgYmVjYXVzZSB0aGUgZHJpdmVyIGlzIHVzaW5nIHRoZSBvbGQgc3RhdGUsCisgKiAgIGFuZCBpdCB3aWxsIG5ldmVyIGtub3cgYWJvdXQgdGhlIG5ldyBzdGF0ZSBiZWNhdXNlIGl0IHN1YnNlcXVlbnRseQorICogICBhY2tub3dsZWRnZXMgdGhlIHN0YXRlIGNoYW5nZSBpbnRlcnJ1cHQuCisgKgorICogICAgICAgICAgSU5DT1JSRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1JSRUNUCisgKiAgICAgIHJlYWQgdHlwZSAwIGludCByZWFzb25zICAgICAgICAgICAgICAgICAgIHJlYWQgdHlwZSAwIGludCByZWFzb25zCisgKiAgICAgIHJlYWQgYWRhcHRlciBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgIGFjayB0eXBlIDAgaW50ZXJydXB0cworICogICAgICBhY2sgdHlwZSAwIGludGVycnVwdHMgICAgICAgICAgICAgICAgICAgICByZWFkIGFkYXB0ZXIgc3RhdGUKKyAqICAgICAgLi4uIHByb2Nlc3MgaW50ZXJydXB0IC4uLiAgICAgICAgICAgICAgICAgLi4uIHByb2Nlc3MgaW50ZXJydXB0IC4uLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgTm9uZQorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBOb25lCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBBbiBhZGFwdGVyIHJlc2V0IG1heSBvY2N1ciBpZiB0aGUgYWRhcHRlciBoYXMgYW55IFR5cGUgMCBlcnJvciBpbnRlcnJ1cHRzCisgKiAgIG9yIGlmIHRoZSBwb3J0IHN0YXR1cyBpbmRpY2F0ZXMgdGhhdCB0aGUgYWRhcHRlciBpcyBoYWx0ZWQuICBUaGUgZHJpdmVyCisgKiAgIGlzIHJlc3BvbnNpYmxlIGZvciByZWluaXRpYWxpemluZyB0aGUgYWRhcHRlciB3aXRoIHRoZSBjdXJyZW50IENBTQorICogICBjb250ZW50cyBhbmQgYWRhcHRlciBmaWx0ZXIgc2V0dGluZ3MuCisgKi8KKworc3RhdGljIHZvaWQgZGZ4X2ludF90eXBlXzBfcHJvY2VzcyhERlhfYm9hcmRfdAkqYnApCisKKwl7CisJUElfVUlOVDMyCXR5cGVfMF9zdGF0dXM7CQkvKiBIb3N0IEludGVycnVwdCBUeXBlIDAgcmVnaXN0ZXIgKi8KKwlQSV9VSU5UMzIJc3RhdGU7CQkJCS8qIGN1cnJlbnQgYWRhcCBzdGF0ZSAoZnJvbSBwb3J0IHN0YXR1cykgKi8KKworCS8qCisJICogUmVhZCBob3N0IGludGVycnVwdCBUeXBlIDAgcmVnaXN0ZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIFR5cGUgMAorCSAqIGludGVycnVwdHMgYXJlIHBlbmRpbmcuICBJbW1lZGlhdGVseSB3cml0ZSBpdCBiYWNrIG91dCB0byBjbGVhcgorCSAqIHRob3NlIGludGVycnVwdHMuCisJICovCisKKwlkZnhfcG9ydF9yZWFkX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19UWVBFXzBfU1RBVFVTLCAmdHlwZV8wX3N0YXR1cyk7CisJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUElfUERRX0tfUkVHX1RZUEVfMF9TVEFUVVMsIHR5cGVfMF9zdGF0dXMpOworCisJLyogQ2hlY2sgZm9yIFR5cGUgMCBlcnJvciBpbnRlcnJ1cHRzICovCisKKwlpZiAodHlwZV8wX3N0YXR1cyAmIChQSV9UWVBFXzBfU1RBVF9NX05YTSB8CisJCQkJCQkJUElfVFlQRV8wX1NUQVRfTV9QTV9QQVJfRVJSIHwKKwkJCQkJCQlQSV9UWVBFXzBfU1RBVF9NX0JVU19QQVJfRVJSKSkKKwkJeworCQkvKiBDaGVjayBmb3IgTm9uLUV4aXN0ZW50IE1lbW9yeSBlcnJvciAqLworCisJCWlmICh0eXBlXzBfc3RhdHVzICYgUElfVFlQRV8wX1NUQVRfTV9OWE0pCisJCQlwcmludGsoIiVzOiBOb24tRXhpc3RlbnQgTWVtb3J5IEFjY2VzcyBFcnJvclxuIiwgYnAtPmRldi0+bmFtZSk7CisKKwkJLyogQ2hlY2sgZm9yIFBhY2tldCBNZW1vcnkgUGFyaXR5IGVycm9yICovCisKKwkJaWYgKHR5cGVfMF9zdGF0dXMgJiBQSV9UWVBFXzBfU1RBVF9NX1BNX1BBUl9FUlIpCisJCQlwcmludGsoIiVzOiBQYWNrZXQgTWVtb3J5IFBhcml0eSBFcnJvclxuIiwgYnAtPmRldi0+bmFtZSk7CisKKwkJLyogQ2hlY2sgZm9yIEhvc3QgQnVzIFBhcml0eSBlcnJvciAqLworCisJCWlmICh0eXBlXzBfc3RhdHVzICYgUElfVFlQRV8wX1NUQVRfTV9CVVNfUEFSX0VSUikKKwkJCXByaW50aygiJXM6IEhvc3QgQnVzIFBhcml0eSBFcnJvclxuIiwgYnAtPmRldi0+bmFtZSk7CisKKwkJLyogUmVzZXQgYWRhcHRlciBhbmQgYnJpbmcgaXQgYmFjayBvbi1saW5lICovCisKKwkJYnAtPmxpbmtfYXZhaWxhYmxlID0gUElfS19GQUxTRTsJLyogbGluayBpcyBubyBsb25nZXIgYXZhaWxhYmxlICovCisJCWJwLT5yZXNldF90eXBlID0gMDsJCQkJCS8qIHJlcnVuIG9uLWJvYXJkIGRpYWdub3N0aWNzICovCisJCXByaW50aygiJXM6IFJlc2V0dGluZyBhZGFwdGVyLi4uXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJaWYgKGRmeF9hZGFwX2luaXQoYnAsIDApICE9IERGWF9LX1NVQ0NFU1MpCisJCQl7CisJCQlwcmludGsoIiVzOiBBZGFwdGVyIHJlc2V0IGZhaWxlZCEgIERpc2FibGluZyBhZGFwdGVyIGludGVycnVwdHMuXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19IT1NUX0lOVF9FTkIsIFBJX0hPU1RfSU5UX0tfRElTQUJMRV9BTExfSU5UUyk7CisJCQlyZXR1cm47CisJCQl9CisJCXByaW50aygiJXM6IEFkYXB0ZXIgcmVzZXQgc3VjY2Vzc2Z1bCFcbiIsIGJwLT5kZXYtPm5hbWUpOworCQlyZXR1cm47CisJCX0KKworCS8qIENoZWNrIGZvciB0cmFuc21pdCBmbHVzaCBpbnRlcnJ1cHQgKi8KKworCWlmICh0eXBlXzBfc3RhdHVzICYgUElfVFlQRV8wX1NUQVRfTV9YTVRfRkxVU0gpCisJCXsKKwkJLyogRmx1c2ggYW55IHBlbmRpbmcgeG10J3MgYW5kIGFja25vd2xlZGdlIHRoZSBmbHVzaCBpbnRlcnJ1cHQgKi8KKworCQlicC0+bGlua19hdmFpbGFibGUgPSBQSV9LX0ZBTFNFOwkJLyogbGluayBpcyBubyBsb25nZXIgYXZhaWxhYmxlICovCisJCWRmeF94bXRfZmx1c2goYnApOwkJCQkJCS8qIGZsdXNoIGFueSBvdXRzdGFuZGluZyBwYWNrZXRzICovCisJCSh2b2lkKSBkZnhfaHdfcG9ydF9jdHJsX3JlcShicCwKKwkJCQkJCQkJCVBJX1BDVFJMX01fWE1UX0RBVEFfRkxVU0hfRE9ORSwKKwkJCQkJCQkJCTAsCisJCQkJCQkJCQkwLAorCQkJCQkJCQkJTlVMTCk7CisJCX0KKworCS8qIENoZWNrIGZvciBhZGFwdGVyIHN0YXRlIGNoYW5nZSAqLworCisJaWYgKHR5cGVfMF9zdGF0dXMgJiBQSV9UWVBFXzBfU1RBVF9NX1NUQVRFX0NIQU5HRSkKKwkJeyAgICAgICAgICAgICAgICAgICAgIAorCQkvKiBHZXQgbGF0ZXN0IGFkYXB0ZXIgc3RhdGUgKi8KKworCQlzdGF0ZSA9IGRmeF9od19hZGFwX3N0YXRlX3JkKGJwKTsJLyogZ2V0IGFkYXB0ZXIgc3RhdGUgKi8KKwkJaWYgKHN0YXRlID09IFBJX1NUQVRFX0tfSEFMVEVEKQorCQkJeworCQkJLyoKKwkJCSAqIEFkYXB0ZXIgaGFzIHRyYW5zaXRpb25lZCB0byBIQUxURUQgc3RhdGUsIHRyeSB0byByZXNldAorCQkJICogYWRhcHRlciB0byBicmluZyBpdCBiYWNrIG9uLWxpbmUuICBJZiByZXNldCBmYWlscywKKwkJCSAqIGxlYXZlIHRoZSBhZGFwdGVyIGluIHRoZSBicm9rZW4gc3RhdGUuCisJCQkgKi8KKworCQkJcHJpbnRrKCIlczogQ29udHJvbGxlciBoYXMgdHJhbnNpdGlvbmVkIHRvIEhBTFRFRCBzdGF0ZSFcbiIsIGJwLT5kZXYtPm5hbWUpOworCQkJZGZ4X2ludF9wcl9oYWx0X2lkKGJwKTsJCQkvKiBkaXNwbGF5IGhhbHQgaWQgYXMgc3RyaW5nICovCisKKwkJCS8qIFJlc2V0IGFkYXB0ZXIgYW5kIGJyaW5nIGl0IGJhY2sgb24tbGluZSAqLworCisJCQlicC0+bGlua19hdmFpbGFibGUgPSBQSV9LX0ZBTFNFOwkvKiBsaW5rIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgKi8KKwkJCWJwLT5yZXNldF90eXBlID0gMDsJCQkJCS8qIHJlcnVuIG9uLWJvYXJkIGRpYWdub3N0aWNzICovCisJCQlwcmludGsoIiVzOiBSZXNldHRpbmcgYWRhcHRlci4uLlxuIiwgYnAtPmRldi0+bmFtZSk7CisJCQlpZiAoZGZ4X2FkYXBfaW5pdChicCwgMCkgIT0gREZYX0tfU1VDQ0VTUykKKwkJCQl7CisJCQkJcHJpbnRrKCIlczogQWRhcHRlciByZXNldCBmYWlsZWQhICBEaXNhYmxpbmcgYWRhcHRlciBpbnRlcnJ1cHRzLlxuIiwgYnAtPmRldi0+bmFtZSk7CisJCQkJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUElfUERRX0tfUkVHX0hPU1RfSU5UX0VOQiwgUElfSE9TVF9JTlRfS19ESVNBQkxFX0FMTF9JTlRTKTsKKwkJCQlyZXR1cm47CisJCQkJfQorCQkJcHJpbnRrKCIlczogQWRhcHRlciByZXNldCBzdWNjZXNzZnVsIVxuIiwgYnAtPmRldi0+bmFtZSk7CisJCQl9CisJCWVsc2UgaWYgKHN0YXRlID09IFBJX1NUQVRFX0tfTElOS19BVkFJTCkKKwkJCXsKKwkJCWJwLT5saW5rX2F2YWlsYWJsZSA9IFBJX0tfVFJVRTsJCS8qIHNldCBsaW5rIGF2YWlsYWJsZSBmbGFnICovCisJCQl9CisJCX0KKwl9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X2ludF9jb21tb24gPQorICogPT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIEludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKElTUikKKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBicCAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBUaGlzIGlzIHRoZSBJU1Igd2hpY2ggcHJvY2Vzc2VzIGluY29taW5nIGFkYXB0ZXIgaW50ZXJydXB0cy4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIE5vbmUKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgVGhpcyByb3V0aW5lIGFzc3VtZXMgUERRIGludGVycnVwdHMgaGF2ZSBub3QgYmVlbiBkaXNhYmxlZC4KKyAqICAgV2hlbiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBhdCB0aGUgUERRLCB0aGUgUG9ydCBTdGF0dXMgcmVnaXN0ZXIKKyAqICAgaXMgYXV0b21hdGljYWxseSBjbGVhcmVkLiAgVGhpcyByb3V0aW5lIHVzZXMgdGhlIFBvcnQgU3RhdHVzCisgKiAgIHJlZ2lzdGVyIHZhbHVlIHRvIGRldGVybWluZSB3aGV0aGVyIGEgVHlwZSAwIGludGVycnVwdCBvY2N1cnJlZCwKKyAqICAgc28gaXQncyBpbXBvcnRhbnQgdGhhdCBhZGFwdGVyIGludGVycnVwdHMgYXJlIG5vdCBub3JtYWxseQorICogICBlbmFibGVkL2Rpc2FibGVkIGF0IHRoZSBQRFEuCisgKgorICogICBJdCdzIHZpdGFsIHRoYXQgdGhpcyByb3V0aW5lIGlzIE5PVCByZWVudGVyZWQgZm9yIHRoZQorICogICBzYW1lIGJvYXJkIGFuZCB0aGF0IHRoZSBPUyBpcyBub3QgaW4gYW5vdGhlciBzZWN0aW9uIG9mCisgKiAgIGNvZGUgKGVnLiBkZnhfeG10X3F1ZXVlX3BrdCkgZm9yIHRoZSBzYW1lIGJvYXJkIG9uIGEKKyAqICAgZGlmZmVyZW50IHRocmVhZC4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIFBlbmRpbmcgaW50ZXJydXB0cyBhcmUgc2VydmljZWQuICBEZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YKKyAqICAgaW50ZXJydXB0LCBhY2tub3dsZWRnaW5nIGFuZCBjbGVhcmluZyB0aGUgaW50ZXJydXB0IGF0IHRoZQorICogICBQRFEgaW52b2x2ZXMgd3JpdGluZyBhIHJlZ2lzdGVyIHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQgYml0CisgKiAgIG9yIHVwZGF0aW5nIGNvbXBsZXRpb24gaW5kaWNlcy4KKyAqLworCitzdGF0aWMgdm9pZCBkZnhfaW50X2NvbW1vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCURGWF9ib2FyZF90IAkqYnAgPSBkZXYtPnByaXY7CisJUElfVUlOVDMyCXBvcnRfc3RhdHVzOwkJLyogUG9ydCBTdGF0dXMgcmVnaXN0ZXIgKi8KKworCS8qIFByb2Nlc3MgeG10IGludGVycnVwdHMgLSBmcmVxdWVudCBjYXNlLCBzbyBhbHdheXMgY2FsbCB0aGlzIHJvdXRpbmUgKi8KKworCWlmKGRmeF94bXRfZG9uZShicCkpCQkJCS8qIGZyZWUgY29uc3VtZWQgeG10IHBhY2tldHMgKi8KKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJLyogUHJvY2VzcyByY3YgaW50ZXJydXB0cyAtIGZyZXF1ZW50IGNhc2UsIHNvIGFsd2F5cyBjYWxsIHRoaXMgcm91dGluZSAqLworCisJZGZ4X3Jjdl9xdWV1ZV9wcm9jZXNzKGJwKTsJCS8qIHNlcnZpY2UgcmVjZWl2ZWQgTExDIGZyYW1lcyAqLworCisJLyoKKwkgKiBUcmFuc21pdCBhbmQgcmVjZWl2ZSBwcm9kdWNlciBhbmQgY29tcGxldGlvbiBpbmRpY2VzIGFyZSB1cGRhdGVkIG9uIHRoZQorCSAqIGFkYXB0ZXIgYnkgd3JpdGluZyB0byB0aGUgVHlwZSAyIFByb2R1Y2VyIHJlZ2lzdGVyLiAgU2luY2UgdGhlIGZyZXF1ZW50CisJICogY2FzZSBpcyB0aGF0IHdlJ2xsIGJlIHByb2Nlc3NpbmcgZWl0aGVyIExMQyB0cmFuc21pdCBvciByZWNlaXZlIGJ1ZmZlcnMsCisJICogd2UnbGwgb3B0aW1pemUgSS9PIHdyaXRlcyBieSBkb2luZyBhIHNpbmdsZSByZWdpc3RlciB3cml0ZSBoZXJlLgorCSAqLworCisJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUElfUERRX0tfUkVHX1RZUEVfMl9QUk9ELCBicC0+cmN2X3htdF9yZWcubHdvcmQpOworCisJLyogUmVhZCBQRFEgUG9ydCBTdGF0dXMgcmVnaXN0ZXIgdG8gZmluZCBvdXQgd2hpY2ggaW50ZXJydXB0cyBuZWVkIHByb2Nlc3NpbmcgKi8KKworCWRmeF9wb3J0X3JlYWRfbG9uZyhicCwgUElfUERRX0tfUkVHX1BPUlRfU1RBVFVTLCAmcG9ydF9zdGF0dXMpOworCisJLyogUHJvY2VzcyBUeXBlIDAgaW50ZXJydXB0cyAoaWYgYW55KSAtIGluZnJlcXVlbnQsIHNvIG9ubHkgY2FsbCB3aGVuIG5lZWRlZCAqLworCisJaWYgKHBvcnRfc3RhdHVzICYgUElfUFNUQVRVU19NX1RZUEVfMF9QRU5ESU5HKQorCQlkZnhfaW50X3R5cGVfMF9wcm9jZXNzKGJwKTsJLyogcHJvY2VzcyBUeXBlIDAgaW50ZXJydXB0cyAqLworCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9pbnRlcnJ1cHQgPQorICogPT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgSW50ZXJydXB0IHByb2Nlc3Npbmcgcm91dGluZQorICogIAorICogUmV0dXJuczoKKyAqICAgTm9uZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGlycQktIGludGVycnVwdCB2ZWN0b3IKKyAqICAgZGV2X2lkCS0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKyAqCSByZWdzCS0gcG9pbnRlciB0byByZWdpc3RlcnMgc3RydWN0dXJlCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyByb3V0aW5lIGNhbGxzIHRoZSBpbnRlcnJ1cHQgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGlzIGFkYXB0ZXIuICBJdAorICogICBkaXNhYmxlcyBhbmQgcmVlbmFibGVzIGFkYXB0ZXIgaW50ZXJydXB0cywgYXMgYXBwcm9wcmlhdGUuICBXZSBjYW4gc3VwcG9ydAorICogICBzaGFyZWQgaW50ZXJydXB0cyBzaW5jZSB0aGUgaW5jb21pbmcgZGV2X2lkIHBvaW50ZXIgcHJvdmlkZXMgb3VyIGRldmljZQorICogICBzdHJ1Y3R1cmUgY29udGV4dC4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIE5vbmUKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgVGhlIGludGVycnVwdCBhY2tub3dsZWRnZW1lbnQgYXQgdGhlIGhhcmR3YXJlIGxldmVsIChlZy4gQUNLaW5nIHRoZSBQSUMKKyAqICAgb24gSW50ZWwtYmFzZWQgc3lzdGVtcykgaXMgZG9uZSBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvdXRzaWRlIHRoaXMKKyAqICAgcm91dGluZS4KKyAqCisgKgkgU3lzdGVtIGludGVycnVwdHMgYXJlIGVuYWJsZWQgdGhyb3VnaCB0aGlzIGNhbGwuCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwgdGhlbiByZWVuYWJsZWQgYXQgdGhlIGFkYXB0ZXIuCisgKi8KKworc3RhdGljIHZvaWQgZGZ4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzCSpyZWdzKQorCXsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2ID0gZGV2X2lkOworCURGWF9ib2FyZF90CQkqYnA7CS8qIHByaXZhdGUgYm9hcmQgc3RydWN0dXJlIHBvaW50ZXIgKi8KKwl1OAkJCQl0bXA7CS8qIHVzZWQgZm9yIGRpc2FibGluZy9lbmFibGluZyBpbnRzICovCisKKwkvKiBHZXQgYm9hcmQgcG9pbnRlciBvbmx5IGlmIGRldmljZSBzdHJ1Y3R1cmUgaXMgdmFsaWQgKi8KKworCWJwID0gZGV2LT5wcml2OworCisJc3Bpbl9sb2NrKCZicC0+bG9jayk7CisJCisJLyogU2VlIGlmIHdlJ3JlIGFscmVhZHkgc2VydmljaW5nIGFuIGludGVycnVwdCAqLworCisJLyogU2VydmljZSBhZGFwdGVyIGludGVycnVwdHMgKi8KKworCWlmIChicC0+YnVzX3R5cGUgPT0gREZYX0JVU19UWVBFX1BDSSkKKwkJeworCQkvKiBEaXNhYmxlIFBEUS1QRkkgaW50ZXJydXB0cyBhdCBQRkkgKi8KKworCQlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQRklfS19SRUdfTU9ERV9DVFJMLCBQRklfTU9ERV9NX0RNQV9FTkIpOworCisJCS8qIENhbGwgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgdGhpcyBhZGFwdGVyICovCisKKwkJZGZ4X2ludF9jb21tb24oZGV2KTsKKworCQkvKiBDbGVhciBQRFEgaW50ZXJydXB0IHN0YXR1cyBiaXQgYW5kIHJlZW5hYmxlIGludGVycnVwdHMgKi8KKworCQlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQRklfS19SRUdfU1RBVFVTLCBQRklfU1RBVFVTX01fUERRX0lOVCk7CisJCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBGSV9LX1JFR19NT0RFX0NUUkwsCisJCQkJCShQRklfTU9ERV9NX1BEUV9JTlRfRU5CICsgUEZJX01PREVfTV9ETUFfRU5CKSk7CisJCX0KKwllbHNlCisJCXsKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGF0IHRoZSBFU0lDICovCisKKwkJZGZ4X3BvcnRfcmVhZF9ieXRlKGJwLCBQSV9FU0lDX0tfSU9fQ09ORklHX1NUQVRfMCwgJnRtcCk7CisJCXRtcCAmPSB+UElfQ09ORklHX1NUQVRfMF9NX0lOVF9FTkI7CisJCWRmeF9wb3J0X3dyaXRlX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCB0bXApOworCisJCS8qIENhbGwgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgdGhpcyBhZGFwdGVyICovCisKKwkJZGZ4X2ludF9jb21tb24oZGV2KTsKKworCQkvKiBSZWVuYWJsZSBpbnRlcnJ1cHRzIGF0IHRoZSBFU0lDICovCisKKwkJZGZ4X3BvcnRfcmVhZF9ieXRlKGJwLCBQSV9FU0lDX0tfSU9fQ09ORklHX1NUQVRfMCwgJnRtcCk7CisJCXRtcCB8PSBQSV9DT05GSUdfU1RBVF8wX01fSU5UX0VOQjsKKwkJZGZ4X3BvcnRfd3JpdGVfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsIHRtcCk7CisJCX0KKworCXNwaW5fdW5sb2NrKCZicC0+bG9jayk7CisJfQorCisMCisvKgorICogPT09PT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9jdGxfZ2V0X3N0YXRzID0KKyAqID09PT09PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBHZXQgc3RhdGlzdGljcyBmb3IgRkRESSBhZGFwdGVyCisgKiAgCisgKiBSZXR1cm5zOgorICogICBQb2ludGVyIHRvIEZEREkgc3RhdGlzdGljcyBzdHJ1Y3R1cmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBkZXYgLSBwb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIEdldHMgY3VycmVudCBNSUIgb2JqZWN0cyBmcm9tIGFkYXB0ZXIsIHRoZW4KKyAqICAgcmV0dXJucyBGRERJIHN0YXRpc3RpY3Mgc3RydWN0dXJlIGFzIGRlZmluZWQKKyAqICAgaW4gaWZfZmRkaS5oLgorICoKKyAqICAgTm90ZTogU2luY2UgdGhlIEZEREkgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgaXMKKyAqICAgc3RpbGwgbmV3IGFuZCB0aGUgZGV2aWNlIHN0cnVjdHVyZSBkb2Vzbid0CisgKiAgIGhhdmUgYW4gRkRESS1zcGVjaWZpYyBnZXQgc3RhdGlzdGljcyBoYW5kbGVyLAorICogICB3ZSdsbCByZXR1cm4gdGhlIEZEREkgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgYXMKKyAqICAgYSBwb2ludGVyIHRvIGFuIEV0aGVybmV0IHN0YXRpc3RpY3Mgc3RydWN0dXJlLgorICogICBUaGF0IHdheSwgYXQgbGVhc3QgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHN0YXRpc3RpY3MKKyAqICAgc3RydWN0dXJlIGNhbiBiZSBkZWNvZGVkIHByb3Blcmx5LCBhbmQgaXQgYWxsb3dzCisgKiAgICJzbWFydCIgYXBwbGljYXRpb25zIHRvIHBlcmZvcm0gYSBzZWNvbmQgY2FzdCB0bworICogICBkZWNvZGUgdGhlIEZEREktc3BlY2lmaWMgc3RhdGlzdGljcy4KKyAqCisgKiAgIFdlJ2xsIGhhdmUgdG8gcGF5IGF0dGVudGlvbiB0byB0aGlzIHJvdXRpbmUgYXMgdGhlCisgKiAgIGRldmljZSBzdHJ1Y3R1cmUgYmVjb21lcyBtb3JlIG1hdHVyZSBhbmQgTEFOIG1lZGlhCisgKiAgIGluZGVwZW5kZW50LgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgTm9uZQorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBOb25lCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBOb25lCisgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpkZnhfY3RsX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorCXsKKwlERlhfYm9hcmRfdAkqYnAgPSBkZXYtPnByaXY7CisKKwkvKiBGaWxsIHRoZSBicC0+c3RhdHMgc3RydWN0dXJlIHdpdGggZHJpdmVyLW1haW50YWluZWQgY291bnRlcnMgKi8KKworCWJwLT5zdGF0cy5nZW4ucnhfcGFja2V0cyA9IGJwLT5yY3ZfdG90YWxfZnJhbWVzOworCWJwLT5zdGF0cy5nZW4udHhfcGFja2V0cyA9IGJwLT54bXRfdG90YWxfZnJhbWVzOworCWJwLT5zdGF0cy5nZW4ucnhfYnl0ZXMgICA9IGJwLT5yY3ZfdG90YWxfYnl0ZXM7CisJYnAtPnN0YXRzLmdlbi50eF9ieXRlcyAgID0gYnAtPnhtdF90b3RhbF9ieXRlczsKKwlicC0+c3RhdHMuZ2VuLnJ4X2Vycm9ycyAgPSBicC0+cmN2X2NyY19lcnJvcnMgKworCQkJCSAgIGJwLT5yY3ZfZnJhbWVfc3RhdHVzX2Vycm9ycyArCisJCQkJICAgYnAtPnJjdl9sZW5ndGhfZXJyb3JzOworCWJwLT5zdGF0cy5nZW4udHhfZXJyb3JzICA9IGJwLT54bXRfbGVuZ3RoX2Vycm9yczsKKwlicC0+c3RhdHMuZ2VuLnJ4X2Ryb3BwZWQgPSBicC0+cmN2X2Rpc2NhcmRzOworCWJwLT5zdGF0cy5nZW4udHhfZHJvcHBlZCA9IGJwLT54bXRfZGlzY2FyZHM7CisJYnAtPnN0YXRzLmdlbi5tdWx0aWNhc3QgID0gYnAtPnJjdl9tdWx0aWNhc3RfZnJhbWVzOworCWJwLT5zdGF0cy5nZW4uY29sbGlzaW9ucyA9IDA7CQkvKiBhbHdheXMgemVybyAoMCkgZm9yIEZEREkgKi8KKworCS8qIEdldCBGRERJIFNNVCBNSUIgb2JqZWN0cyAqLworCisJYnAtPmNtZF9yZXFfdmlydC0+Y21kX3R5cGUgPSBQSV9DTURfS19TTVRfTUlCX0dFVDsKKwlpZiAoZGZ4X2h3X2RtYV9jbWRfcmVxKGJwKSAhPSBERlhfS19TVUNDRVNTKQorCQlyZXR1cm4oKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopICZicC0+c3RhdHMpOworCisJLyogRmlsbCB0aGUgYnAtPnN0YXRzIHN0cnVjdHVyZSB3aXRoIHRoZSBTTVQgTUlCIG9iamVjdCB2YWx1ZXMgKi8KKworCW1lbWNweShicC0+c3RhdHMuc210X3N0YXRpb25faWQsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfc3RhdGlvbl9pZCwgc2l6ZW9mKGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9zdGF0aW9uX2lkKSk7CisJYnAtPnN0YXRzLnNtdF9vcF92ZXJzaW9uX2lkCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9vcF92ZXJzaW9uX2lkOworCWJwLT5zdGF0cy5zbXRfaGlfdmVyc2lvbl9pZAkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfaGlfdmVyc2lvbl9pZDsKKwlicC0+c3RhdHMuc210X2xvX3ZlcnNpb25faWQJCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2xvX3ZlcnNpb25faWQ7CisJbWVtY3B5KGJwLT5zdGF0cy5zbXRfdXNlcl9kYXRhLCAmYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X3VzZXJfZGF0YSwgc2l6ZW9mKGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF91c2VyX2RhdGEpKTsKKwlicC0+c3RhdHMuc210X21pYl92ZXJzaW9uX2lkCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X21pYl92ZXJzaW9uX2lkOworCWJwLT5zdGF0cy5zbXRfbWFjX2N0cwkJCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X21hY19jdDsKKwlicC0+c3RhdHMuc210X25vbl9tYXN0ZXJfY3RzCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X25vbl9tYXN0ZXJfY3Q7CisJYnAtPnN0YXRzLnNtdF9tYXN0ZXJfY3RzCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9tYXN0ZXJfY3Q7CisJYnAtPnN0YXRzLnNtdF9hdmFpbGFibGVfcGF0aHMJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfYXZhaWxhYmxlX3BhdGhzOworCWJwLT5zdGF0cy5zbXRfY29uZmlnX2NhcGFiaWxpdGllcwkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2NvbmZpZ19jYXBhYmlsaXRpZXM7CisJYnAtPnN0YXRzLnNtdF9jb25maWdfcG9saWN5CQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9jb25maWdfcG9saWN5OworCWJwLT5zdGF0cy5zbXRfY29ubmVjdGlvbl9wb2xpY3kJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfY29ubmVjdGlvbl9wb2xpY3k7CisJYnAtPnN0YXRzLnNtdF90X25vdGlmeQkJCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X3Rfbm90aWZ5OworCWJwLT5zdGF0cy5zbXRfc3RhdF9ycHRfcG9saWN5CQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X3N0YXRfcnB0X3BvbGljeTsKKwlicC0+c3RhdHMuc210X3RyYWNlX21heF9leHBpcmF0aW9uCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfdHJhY2VfbWF4X2V4cGlyYXRpb247CisJYnAtPnN0YXRzLnNtdF9ieXBhc3NfcHJlc2VudAkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9ieXBhc3NfcHJlc2VudDsKKwlicC0+c3RhdHMuc210X2VjbV9zdGF0ZQkJCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2VjbV9zdGF0ZTsKKwlicC0+c3RhdHMuc210X2NmX3N0YXRlCQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfY2Zfc3RhdGU7CisJYnAtPnN0YXRzLnNtdF9yZW1vdGVfZGlzY29ubmVjdF9mbGFnCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9yZW1vdGVfZGlzY29ubmVjdF9mbGFnOworCWJwLT5zdGF0cy5zbXRfc3RhdGlvbl9zdGF0dXMJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfc3RhdGlvbl9zdGF0dXM7CisJYnAtPnN0YXRzLnNtdF9wZWVyX3dyYXBfZmxhZwkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9wZWVyX3dyYXBfZmxhZzsKKwlicC0+c3RhdHMuc210X3RpbWVfc3RhbXAJCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X21zZ190aW1lX3N0YW1wLmxzOworCWJwLT5zdGF0cy5zbXRfdHJhbnNpdGlvbl90aW1lX3N0YW1wCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfdHJhbnNpdGlvbl90aW1lX3N0YW1wLmxzOworCWJwLT5zdGF0cy5tYWNfZnJhbWVfc3RhdHVzX2Z1bmN0aW9ucwkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZnJhbWVfc3RhdHVzX2Z1bmN0aW9uczsKKwlicC0+c3RhdHMubWFjX3RfbWF4X2NhcGFiaWxpdHkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfdF9tYXhfY2FwYWJpbGl0eTsKKwlicC0+c3RhdHMubWFjX3R2eF9jYXBhYmlsaXR5CQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX3R2eF9jYXBhYmlsaXR5OworCWJwLT5zdGF0cy5tYWNfYXZhaWxhYmxlX3BhdGhzCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX2F2YWlsYWJsZV9wYXRoczsKKwlicC0+c3RhdHMubWFjX2N1cnJlbnRfcGF0aAkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfY3VycmVudF9wYXRoOworCW1lbWNweShicC0+c3RhdHMubWFjX3Vwc3RyZWFtX25iciwgJmJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY191cHN0cmVhbV9uYnIsIEZERElfS19BTEVOKTsKKwltZW1jcHkoYnAtPnN0YXRzLm1hY19kb3duc3RyZWFtX25iciwgJmJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19kb3duc3RyZWFtX25iciwgRkRESV9LX0FMRU4pOworCW1lbWNweShicC0+c3RhdHMubWFjX29sZF91cHN0cmVhbV9uYnIsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfb2xkX3Vwc3RyZWFtX25iciwgRkRESV9LX0FMRU4pOworCW1lbWNweShicC0+c3RhdHMubWFjX29sZF9kb3duc3RyZWFtX25iciwgJmJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19vbGRfZG93bnN0cmVhbV9uYnIsIEZERElfS19BTEVOKTsKKwlicC0+c3RhdHMubWFjX2R1cF9hZGRyZXNzX3Rlc3QJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZHVwX2FkZHJlc3NfdGVzdDsKKwlicC0+c3RhdHMubWFjX3JlcXVlc3RlZF9wYXRocwkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19yZXF1ZXN0ZWRfcGF0aHM7CisJYnAtPnN0YXRzLm1hY19kb3duc3RyZWFtX3BvcnRfdHlwZQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX2Rvd25zdHJlYW1fcG9ydF90eXBlOworCW1lbWNweShicC0+c3RhdHMubWFjX3NtdF9hZGRyZXNzLCAmYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX3NtdF9hZGRyZXNzLCBGRERJX0tfQUxFTik7CisJYnAtPnN0YXRzLm1hY190X3JlcQkJCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY190X3JlcTsKKwlicC0+c3RhdHMubWFjX3RfbmVnCQkJCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX3RfbmVnOworCWJwLT5zdGF0cy5tYWNfdF9tYXgJCQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfdF9tYXg7CisJYnAtPnN0YXRzLm1hY190dnhfdmFsdWUJCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY190dnhfdmFsdWU7CisJYnAtPnN0YXRzLm1hY19mcmFtZV9lcnJvcl90aHJlc2hvbGQJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19mcmFtZV9lcnJvcl90aHJlc2hvbGQ7CisJYnAtPnN0YXRzLm1hY19mcmFtZV9lcnJvcl9yYXRpbwkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19mcmFtZV9lcnJvcl9yYXRpbzsKKwlicC0+c3RhdHMubWFjX3JtdF9zdGF0ZQkJCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX3JtdF9zdGF0ZTsKKwlicC0+c3RhdHMubWFjX2RhX2ZsYWcJCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19kYV9mbGFnOworCWJwLT5zdGF0cy5tYWNfdW5hX2RhX2ZsYWcJCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX3VuZGFfZmxhZzsKKwlicC0+c3RhdHMubWFjX2ZyYW1lX2Vycm9yX2ZsYWcJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZnJhbWVfZXJyb3JfZmxhZzsKKwlicC0+c3RhdHMubWFjX21hX3VuaXRkYXRhX2F2YWlsYWJsZQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX21hX3VuaXRkYXRhX2F2YWlsYWJsZTsKKwlicC0+c3RhdHMubWFjX2hhcmR3YXJlX3ByZXNlbnQJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfaGFyZHdhcmVfcHJlc2VudDsKKwlicC0+c3RhdHMubWFjX21hX3VuaXRkYXRhX2VuYWJsZQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX21hX3VuaXRkYXRhX2VuYWJsZTsKKwlicC0+c3RhdHMucGF0aF90dnhfbG93ZXJfYm91bmQJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wYXRoX3R2eF9sb3dlcl9ib3VuZDsKKwlicC0+c3RhdHMucGF0aF90X21heF9sb3dlcl9ib3VuZAkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucGF0aF90X21heF9sb3dlcl9ib3VuZDsKKwlicC0+c3RhdHMucGF0aF9tYXhfdF9yZXEJCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucGF0aF9tYXhfdF9yZXE7CisJbWVtY3B5KGJwLT5zdGF0cy5wYXRoX2NvbmZpZ3VyYXRpb24sICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wYXRoX2NvbmZpZ3VyYXRpb24sIHNpemVvZihicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wYXRoX2NvbmZpZ3VyYXRpb24pKTsKKwlicC0+c3RhdHMucG9ydF9teV90eXBlWzBdCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbXlfdHlwZVswXTsKKwlicC0+c3RhdHMucG9ydF9teV90eXBlWzFdCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbXlfdHlwZVsxXTsKKwlicC0+c3RhdHMucG9ydF9uZWlnaGJvcl90eXBlWzBdCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9uZWlnaGJvcl90eXBlWzBdOworCWJwLT5zdGF0cy5wb3J0X25laWdoYm9yX3R5cGVbMV0JCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X25laWdoYm9yX3R5cGVbMV07CisJYnAtPnN0YXRzLnBvcnRfY29ubmVjdGlvbl9wb2xpY2llc1swXQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2Nvbm5lY3Rpb25fcG9saWNpZXNbMF07CisJYnAtPnN0YXRzLnBvcnRfY29ubmVjdGlvbl9wb2xpY2llc1sxXQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2Nvbm5lY3Rpb25fcG9saWNpZXNbMV07CisJYnAtPnN0YXRzLnBvcnRfbWFjX2luZGljYXRlZFswXQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbWFjX2luZGljYXRlZFswXTsKKwlicC0+c3RhdHMucG9ydF9tYWNfaW5kaWNhdGVkWzFdCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9tYWNfaW5kaWNhdGVkWzFdOworCWJwLT5zdGF0cy5wb3J0X2N1cnJlbnRfcGF0aFswXQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfY3VycmVudF9wYXRoWzBdOworCWJwLT5zdGF0cy5wb3J0X2N1cnJlbnRfcGF0aFsxXQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfY3VycmVudF9wYXRoWzFdOworCW1lbWNweSgmYnAtPnN0YXRzLnBvcnRfcmVxdWVzdGVkX3BhdGhzWzAqM10sICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X3JlcXVlc3RlZF9wYXRoc1swXSwgMyk7CisJbWVtY3B5KCZicC0+c3RhdHMucG9ydF9yZXF1ZXN0ZWRfcGF0aHNbMSozXSwgJmJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfcmVxdWVzdGVkX3BhdGhzWzFdLCAzKTsKKwlicC0+c3RhdHMucG9ydF9tYWNfcGxhY2VtZW50WzBdCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9tYWNfcGxhY2VtZW50WzBdOworCWJwLT5zdGF0cy5wb3J0X21hY19wbGFjZW1lbnRbMV0JCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X21hY19wbGFjZW1lbnRbMV07CisJYnAtPnN0YXRzLnBvcnRfYXZhaWxhYmxlX3BhdGhzWzBdCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2F2YWlsYWJsZV9wYXRoc1swXTsKKwlicC0+c3RhdHMucG9ydF9hdmFpbGFibGVfcGF0aHNbMV0JCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfYXZhaWxhYmxlX3BhdGhzWzFdOworCWJwLT5zdGF0cy5wb3J0X3BtZF9jbGFzc1swXQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X3BtZF9jbGFzc1swXTsKKwlicC0+c3RhdHMucG9ydF9wbWRfY2xhc3NbMV0JCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9wbWRfY2xhc3NbMV07CisJYnAtPnN0YXRzLnBvcnRfY29ubmVjdGlvbl9jYXBhYmlsaXRpZXNbMF0JPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2Nvbm5lY3Rpb25fY2FwYWJpbGl0aWVzWzBdOworCWJwLT5zdGF0cy5wb3J0X2Nvbm5lY3Rpb25fY2FwYWJpbGl0aWVzWzFdCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9jb25uZWN0aW9uX2NhcGFiaWxpdGllc1sxXTsKKwlicC0+c3RhdHMucG9ydF9ic19mbGFnWzBdCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfYnNfZmxhZ1swXTsKKwlicC0+c3RhdHMucG9ydF9ic19mbGFnWzFdCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfYnNfZmxhZ1sxXTsKKwlicC0+c3RhdHMucG9ydF9sZXJfZXN0aW1hdGVbMF0JCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2xlcl9lc3RpbWF0ZVswXTsKKwlicC0+c3RhdHMucG9ydF9sZXJfZXN0aW1hdGVbMV0JCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2xlcl9lc3RpbWF0ZVsxXTsKKwlicC0+c3RhdHMucG9ydF9sZXJfY3V0b2ZmWzBdCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9sZXJfY3V0b2ZmWzBdOworCWJwLT5zdGF0cy5wb3J0X2xlcl9jdXRvZmZbMV0JCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2xlcl9jdXRvZmZbMV07CisJYnAtPnN0YXRzLnBvcnRfbGVyX2FsYXJtWzBdCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbGVyX2FsYXJtWzBdOworCWJwLT5zdGF0cy5wb3J0X2xlcl9hbGFybVsxXQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2xlcl9hbGFybVsxXTsKKwlicC0+c3RhdHMucG9ydF9jb25uZWN0X3N0YXRlWzBdCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9jb25uZWN0X3N0YXRlWzBdOworCWJwLT5zdGF0cy5wb3J0X2Nvbm5lY3Rfc3RhdGVbMV0JCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2Nvbm5lY3Rfc3RhdGVbMV07CisJYnAtPnN0YXRzLnBvcnRfcGNtX3N0YXRlWzBdCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfcGNtX3N0YXRlWzBdOworCWJwLT5zdGF0cy5wb3J0X3BjbV9zdGF0ZVsxXQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X3BjbV9zdGF0ZVsxXTsKKwlicC0+c3RhdHMucG9ydF9wY193aXRoaG9sZFswXQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfcGNfd2l0aGhvbGRbMF07CisJYnAtPnN0YXRzLnBvcnRfcGNfd2l0aGhvbGRbMV0JCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X3BjX3dpdGhob2xkWzFdOworCWJwLT5zdGF0cy5wb3J0X2xlcl9mbGFnWzBdCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbGVyX2ZsYWdbMF07CisJYnAtPnN0YXRzLnBvcnRfbGVyX2ZsYWdbMV0JCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9sZXJfZmxhZ1sxXTsKKwlicC0+c3RhdHMucG9ydF9oYXJkd2FyZV9wcmVzZW50WzBdCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2hhcmR3YXJlX3ByZXNlbnRbMF07CisJYnAtPnN0YXRzLnBvcnRfaGFyZHdhcmVfcHJlc2VudFsxXQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9oYXJkd2FyZV9wcmVzZW50WzFdOworCisJLyogR2V0IEZEREkgY291bnRlcnMgKi8KKworCWJwLT5jbWRfcmVxX3ZpcnQtPmNtZF90eXBlID0gUElfQ01EX0tfQ05UUlNfR0VUOworCWlmIChkZnhfaHdfZG1hX2NtZF9yZXEoYnApICE9IERGWF9LX1NVQ0NFU1MpCisJCXJldHVybigoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgJmJwLT5zdGF0cyk7CisKKwkvKiBGaWxsIHRoZSBicC0+c3RhdHMgc3RydWN0dXJlIHdpdGggdGhlIEZEREkgY291bnRlciB2YWx1ZXMgKi8KKworCWJwLT5zdGF0cy5tYWNfZnJhbWVfY3RzCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLmZyYW1lX2NudC5sczsKKwlicC0+c3RhdHMubWFjX2NvcGllZF9jdHMJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPmNudHJzX2dldC5jbnRycy5jb3BpZWRfY250LmxzOworCWJwLT5zdGF0cy5tYWNfdHJhbnNtaXRfY3RzCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMudHJhbnNtaXRfY250LmxzOworCWJwLT5zdGF0cy5tYWNfZXJyb3JfY3RzCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLmVycm9yX2NudC5sczsKKwlicC0+c3RhdHMubWFjX2xvc3RfY3RzCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLmxvc3RfY250LmxzOworCWJwLT5zdGF0cy5wb3J0X2xjdF9mYWlsX2N0c1swXQkJPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMubGN0X3JlamVjdHNbMF0ubHM7CisJYnAtPnN0YXRzLnBvcnRfbGN0X2ZhaWxfY3RzWzFdCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPmNudHJzX2dldC5jbnRycy5sY3RfcmVqZWN0c1sxXS5sczsKKwlicC0+c3RhdHMucG9ydF9sZW1fcmVqZWN0X2N0c1swXQk9IGJwLT5jbWRfcnNwX3ZpcnQtPmNudHJzX2dldC5jbnRycy5sZW1fcmVqZWN0c1swXS5sczsKKwlicC0+c3RhdHMucG9ydF9sZW1fcmVqZWN0X2N0c1sxXQk9IGJwLT5jbWRfcnNwX3ZpcnQtPmNudHJzX2dldC5jbnRycy5sZW1fcmVqZWN0c1sxXS5sczsKKwlicC0+c3RhdHMucG9ydF9sZW1fY3RzWzBdCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMubGlua19lcnJvcnNbMF0ubHM7CisJYnAtPnN0YXRzLnBvcnRfbGVtX2N0c1sxXQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLmxpbmtfZXJyb3JzWzFdLmxzOworCisJcmV0dXJuKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSAmYnAtPnN0YXRzKTsKKwl9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X2N0bF9zZXRfbXVsdGljYXN0X2xpc3QgPQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIEVuYWJsZS9EaXNhYmxlIExMQyBmcmFtZSBwcm9taXNjdW91cyBtb2RlIHJlY2VwdGlvbgorICogICBvbiB0aGUgYWRhcHRlciBhbmQvb3IgdXBkYXRlIG11bHRpY2FzdCBhZGRyZXNzIHRhYmxlLgorICogIAorICogUmV0dXJuczoKKyAqICAgTm9uZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGRldiAtIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyByb3V0aW5lIGZvbGxvd3MgYSBmYWlybHkgc2ltcGxlIGFsZ29yaXRobSBmb3Igc2V0dGluZyB0aGUKKyAqICAgYWRhcHRlciBmaWx0ZXJzIGFuZCBDQU06CisgKgorICoJCWlmIElGRl9QUk9NSVNDIGZsYWcgaXMgc2V0CisgKgkJCWVuYWJsZSBMTEMgaW5kaXZpZHVhbC9ncm91cCBwcm9taXNjdW91cyBtb2RlCisgKgkJZWxzZQorICoJCQlkaXNhYmxlIExMQyBpbmRpdmlkdWFsL2dyb3VwIHByb21pc2N1b3VzIG1vZGUKKyAqCQkJaWYgbnVtYmVyIG9mIGluY29taW5nIG11bHRpY2FzdCBhZGRyZXNzZXMgPgorICoJCQkJCShDQU0gbWF4IHNpemUgLSBudW1iZXIgb2YgdW5pY2FzdCBhZGRyZXNzZXMgaW4gQ0FNKQorICoJCQkJZW5hYmxlIExMQyBncm91cCBwcm9taXNjdW91cyBtb2RlCisgKgkJCQlzZXQgZHJpdmVyLW1haW50YWluZWQgbXVsdGljYXN0IGFkZHJlc3MgY291bnQgdG8gemVybworICoJCQllbHNlCisgKgkJCQlkaXNhYmxlIExMQyBncm91cCBwcm9taXNjdW91cyBtb2RlCisgKgkJCQlzZXQgZHJpdmVyLW1haW50YWluZWQgbXVsdGljYXN0IGFkZHJlc3MgY291bnQgdG8gaW5jb21pbmcgY291bnQKKyAqCQkJdXBkYXRlIGFkYXB0ZXIgQ0FNCisgKgkJdXBkYXRlIGFkYXB0ZXIgZmlsdGVycworICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgTm9uZQorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBNdWx0aWNhc3QgYWRkcmVzc2VzIGFyZSBwcmVzZW50ZWQgaW4gY2Fub25pY2FsIChMU0IpIGZvcm1hdC4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIE9uLWJvYXJkIGFkYXB0ZXIgQ0FNIGFuZCBmaWx0ZXJzIGFyZSB1cGRhdGVkLgorICovCisKK3N0YXRpYyB2b2lkIGRmeF9jdGxfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCisJeworCURGWF9ib2FyZF90CQkJKmJwID0gZGV2LT5wcml2OworCWludAkJCQkJaTsJCQkvKiB1c2VkIGFzIGluZGV4IGluIGZvciBsb29wICovCisJc3RydWN0IGRldl9tY19saXN0CSpkbWk7CQkvKiBwdHIgdG8gbXVsdGljYXN0IGFkZHIgZW50cnkgKi8KKworCS8qIEVuYWJsZSBMTEMgZnJhbWUgcHJvbWlzY3VvdXMgbW9kZSwgaWYgbmVjZXNzYXJ5ICovCisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQlicC0+aW5kX2dyb3VwX3Byb20gPSBQSV9GU1RBVEVfS19QQVNTOwkJLyogRW5hYmxlIExMQyBpbmQvZ3JvdXAgcHJvbSBtb2RlICovCisKKwkvKiBFbHNlLCB1cGRhdGUgbXVsdGljYXN0IGFkZHJlc3MgdGFibGUgKi8KKworCWVsc2UKKwkJeworCQlicC0+aW5kX2dyb3VwX3Byb20gPSBQSV9GU1RBVEVfS19CTE9DSzsJCS8qIERpc2FibGUgTExDIGluZC9ncm91cCBwcm9tIG1vZGUgKi8KKwkJLyoKKwkJICogQ2hlY2sgd2hldGhlciBpbmNvbWluZyBtdWx0aWNhc3QgYWRkcmVzcyBjb3VudCBleGNlZWRzIHRhYmxlIHNpemUKKwkJICoKKwkJICogTm90ZTogVGhlIGFkYXB0ZXJzIHV0aWxpemUgYW4gb24tYm9hcmQgNjQgZW50cnkgQ0FNIGZvcgorCQkgKiAgICAgICBzdXBwb3J0aW5nIHBlcmZlY3QgZmlsdGVyaW5nIG9mIG11bHRpY2FzdCBwYWNrZXRzCisJCSAqCQkgYW5kIGJyaWRnZSBmdW5jdGlvbnMgd2hlbiBhZGRpbmcgdW5pY2FzdCBhZGRyZXNzZXMuCisJCSAqCQkgVGhlcmUgaXMgbm8gaGFzaCBmdW5jdGlvbiBhdmFpbGFibGUuICBUbyBzdXBwb3J0CisJCSAqCQkgYWRkaXRpb25hbCBtdWx0aWNhc3QgYWRkcmVzc2VzLCB0aGUgYWxsIG11bHRpY2FzdAorCQkgKgkJIGZpbHRlciAoTExDIGdyb3VwIHByb21pc2N1b3VzIG1vZGUpIG11c3QgYmUgZW5hYmxlZC4KKwkJICoKKwkJICoJCSBUaGUgZmlybXdhcmUgcmVzZXJ2ZXMgdHdvIENBTSBlbnRyaWVzIGZvciBTTVQtcmVsYXRlZAorCQkgKgkJIG11bHRpY2FzdCBhZGRyZXNzZXMsIHdoaWNoIGxlYXZlcyA2MiBlbnRyaWVzIGF2YWlsYWJsZS4KKwkJICoJCSBUaGUgZm9sbG93aW5nIGNvZGUgZW5zdXJlcyB0aGF0IHdlJ3JlIG5vdCBiZWluZyBhc2tlZAorCQkgKgkJIHRvIGFkZCBtb3JlIHRoYW4gNjIgYWRkcmVzc2VzIHRvIHRoZSBDQU0uICBJZiB3ZSBhcmUsCisJCSAqCQkgdGhlIGRyaXZlciB3aWxsIGVuYWJsZSB0aGUgYWxsIG11bHRpY2FzdCBmaWx0ZXIuCisJCSAqCQkgU2hvdWxkIHRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyBkcm9wIGJlbG93CisJCSAqCQkgdGhlIGhpZ2ggd2F0ZXIgbWFyaywgdGhlIGZpbHRlciB3aWxsIGJlIGRpc2FibGVkIGFuZAorCQkgKgkJIHBlcmZlY3QgZmlsdGVyaW5nIHdpbGwgYmUgdXNlZC4KKwkJICovCisKKwkJaWYgKGRldi0+bWNfY291bnQgPiAoUElfQ01EX0FERFJfRklMVEVSX0tfU0laRSAtIGJwLT51Y19jb3VudCkpCisJCQl7CisJCQlicC0+Z3JvdXBfcHJvbQk9IFBJX0ZTVEFURV9LX1BBU1M7CQkvKiBFbmFibGUgTExDIGdyb3VwIHByb20gbW9kZSAqLworCQkJYnAtPm1jX2NvdW50CT0gMDsJCQkJCS8qIERvbid0IGFkZCBtYyBhZGRycyB0byBDQU0gKi8KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJYnAtPmdyb3VwX3Byb20JPSBQSV9GU1RBVEVfS19CTE9DSzsJLyogRGlzYWJsZSBMTEMgZ3JvdXAgcHJvbSBtb2RlICovCisJCQlicC0+bWNfY291bnQJPSBkZXYtPm1jX2NvdW50OwkJLyogQWRkIG1jIGFkZHJzIHRvIENBTSAqLworCQkJfQorCisJCS8qIENvcHkgYWRkcmVzc2VzIHRvIG11bHRpY2FzdCBhZGRyZXNzIHRhYmxlLCB0aGVuIHVwZGF0ZSBhZGFwdGVyIENBTSAqLworCisJCWRtaSA9IGRldi0+bWNfbGlzdDsJCQkJLyogcG9pbnQgdG8gZmlyc3QgbXVsdGljYXN0IGFkZHIgKi8KKwkJZm9yIChpPTA7IGkgPCBicC0+bWNfY291bnQ7IGkrKykKKwkJCXsKKwkJCW1lbWNweSgmYnAtPm1jX3RhYmxlW2kqRkRESV9LX0FMRU5dLCBkbWktPmRtaV9hZGRyLCBGRERJX0tfQUxFTik7CisJCQlkbWkgPSBkbWktPm5leHQ7CQkJLyogcG9pbnQgdG8gbmV4dCBtdWx0aWNhc3QgYWRkciAqLworCQkJfQorCQlpZiAoZGZ4X2N0bF91cGRhdGVfY2FtKGJwKSAhPSBERlhfS19TVUNDRVNTKQorCQkJeworCQkJREJHX3ByaW50aygiJXM6IENvdWxkIG5vdCB1cGRhdGUgbXVsdGljYXN0IGFkZHJlc3MgdGFibGUhXG4iLCBkZXYtPm5hbWUpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlEQkdfcHJpbnRrKCIlczogTXVsdGljYXN0IGFkZHJlc3MgdGFibGUgdXBkYXRlZCEgIEFkZGVkICVkIGFkZHJlc3Nlcy5cbiIsIGRldi0+bmFtZSwgYnAtPm1jX2NvdW50KTsKKwkJCX0KKwkJfQorCisJLyogVXBkYXRlIGFkYXB0ZXIgZmlsdGVycyAqLworCisJaWYgKGRmeF9jdGxfdXBkYXRlX2ZpbHRlcnMoYnApICE9IERGWF9LX1NVQ0NFU1MpCisJCXsKKwkJREJHX3ByaW50aygiJXM6IENvdWxkIG5vdCB1cGRhdGUgYWRhcHRlciBmaWx0ZXJzIVxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCWVsc2UKKwkJeworCQlEQkdfcHJpbnRrKCIlczogQWRhcHRlciBmaWx0ZXJzIHVwZGF0ZWQhXG4iLCBkZXYtPm5hbWUpOworCQl9CisJfQorCisMCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9jdGxfc2V0X21hY19hZGRyZXNzID0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBBZGQgbm9kZSBhZGRyZXNzIG92ZXJyaWRlICh1bmljYXN0IGFkZHJlc3MpIHRvIGFkYXB0ZXIKKyAqICAgQ0FNIGFuZCB1cGRhdGUgZGV2X2FkZHIgZmllbGQgaW4gZGV2aWNlIHRhYmxlLgorICogIAorICogUmV0dXJuczoKKyAqICAgTm9uZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGRldiAgLSBwb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgorICogICBhZGRyIC0gcG9pbnRlciB0byBzb2NrYWRkciBzdHJ1Y3R1cmUgY29udGFpbmluZyB1bmljYXN0IGFkZHJlc3MgdG8gYWRkCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVGhlIGFkYXB0ZXIgc3VwcG9ydHMgbm9kZSBhZGRyZXNzIG92ZXJyaWRlcyBieSBhZGRpbmcgb25lIG9yIG1vcmUKKyAqICAgdW5pY2FzdCBhZGRyZXNzZXMgdG8gdGhlIGFkYXB0ZXIgQ0FNLiAgVGhpcyBpcyBzaW1pbGFyIHRvIGFkZGluZworICogICBtdWx0aWNhc3QgYWRkcmVzc2VzLiAgSW4gdGhpcyByb3V0aW5lIHdlJ2xsIHVwZGF0ZSB0aGUgZHJpdmVyIGFuZAorICogICBkZXZpY2Ugc3RydWN0dXJlcyB3aXRoIHRoZSBuZXcgYWRkcmVzcywgdGhlbiB1cGRhdGUgdGhlIGFkYXB0ZXIgQ0FNCisgKiAgIHRvIGVuc3VyZSB0aGF0IHRoZSBhZGFwdGVyIHdpbGwgY29weSBhbmQgc3RyaXAgZnJhbWVzIGRlc3RpbmVkIGFuZAorICogICBzb3VyY2VkIGJ5IHRoYXQgYWRkcmVzcy4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIEFsd2F5cyByZXR1cm5zIHplcm8uCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIFRoZSBhZGRyZXNzIHBvaW50ZWQgdG8gYnkgYWRkci0+c2FfZGF0YSBpcyBhIHZhbGlkIHVuaWNhc3QKKyAqICAgYWRkcmVzcyBhbmQgaXMgcHJlc2VudGVkIGluIGNhbm9uaWNhbCAoTFNCKSBmb3JtYXQuCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBPbi1ib2FyZCBhZGFwdGVyIENBTSBpcyB1cGRhdGVkLiAgT24tYm9hcmQgYWRhcHRlciBmaWx0ZXJzCisgKiAgIG1heSBiZSB1cGRhdGVkLgorICovCisKK3N0YXRpYyBpbnQgZGZ4X2N0bF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKKwl7CisJREZYX2JvYXJkX3QJCSpicCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc29ja2FkZHIJKnBfc29ja2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopYWRkcjsKKworCS8qIENvcHkgdW5pY2FzdCBhZGRyZXNzIHRvIGRyaXZlci1tYWludGFpbmVkIHN0cnVjdHMgYW5kIHVwZGF0ZSBjb3VudCAqLworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHBfc29ja2FkZHItPnNhX2RhdGEsIEZERElfS19BTEVOKTsJLyogdXBkYXRlIGRldmljZSBzdHJ1Y3QgKi8KKwltZW1jcHkoJmJwLT51Y190YWJsZVswXSwgcF9zb2NrYWRkci0+c2FfZGF0YSwgRkRESV9LX0FMRU4pOwkvKiB1cGRhdGUgZHJpdmVyIHN0cnVjdCAqLworCWJwLT51Y19jb3VudCA9IDE7CisKKwkvKgorCSAqIFZlcmlmeSB3ZSdyZSBub3QgZXhjZWVkaW5nIHRoZSBDQU0gc2l6ZSBieSBhZGRpbmcgdW5pY2FzdCBhZGRyZXNzCisJICoKKwkgKiBOb3RlOiBJdCdzIHBvc3NpYmxlIHRoYXQgYmVmb3JlIGVudGVyaW5nIHRoaXMgcm91dGluZSB3ZSd2ZQorCSAqICAgICAgIGFscmVhZHkgZmlsbGVkIHRoZSBDQU0gd2l0aCA2MiBtdWx0aWNhc3QgYWRkcmVzc2VzLgorCSAqCQkgU2luY2Ugd2UgbmVlZCB0byBwbGFjZSB0aGUgbm9kZSBhZGRyZXNzIG92ZXJyaWRlIGludG8KKwkgKgkJIHRoZSBDQU0sIHdlIGhhdmUgdG8gY2hlY2sgdG8gc2VlIHRoYXQgd2UncmUgbm90CisJICoJCSBleGNlZWRpbmcgdGhlIENBTSBzaXplLiAgSWYgd2UgYXJlLCB3ZSBoYXZlIHRvIGVuYWJsZQorCSAqCQkgdGhlIExMQyBncm91cCAobXVsdGljYXN0KSBwcm9taXNjdW91cyBtb2RlIGZpbHRlciBhcworCSAqCQkgaW4gZGZ4X2N0bF9zZXRfbXVsdGljYXN0X2xpc3QuCisJICovCisKKwlpZiAoKGJwLT51Y19jb3VudCArIGJwLT5tY19jb3VudCkgPiBQSV9DTURfQUREUl9GSUxURVJfS19TSVpFKQorCQl7CisJCWJwLT5ncm91cF9wcm9tCT0gUElfRlNUQVRFX0tfUEFTUzsJCS8qIEVuYWJsZSBMTEMgZ3JvdXAgcHJvbSBtb2RlICovCisJCWJwLT5tY19jb3VudAk9IDA7CQkJCQkvKiBEb24ndCBhZGQgbWMgYWRkcnMgdG8gQ0FNICovCisKKwkJLyogVXBkYXRlIGFkYXB0ZXIgZmlsdGVycyAqLworCisJCWlmIChkZnhfY3RsX3VwZGF0ZV9maWx0ZXJzKGJwKSAhPSBERlhfS19TVUNDRVNTKQorCQkJeworCQkJREJHX3ByaW50aygiJXM6IENvdWxkIG5vdCB1cGRhdGUgYWRhcHRlciBmaWx0ZXJzIVxuIiwgZGV2LT5uYW1lKTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJREJHX3ByaW50aygiJXM6IEFkYXB0ZXIgZmlsdGVycyB1cGRhdGVkIVxuIiwgZGV2LT5uYW1lKTsKKwkJCX0KKwkJfQorCisJLyogVXBkYXRlIGFkYXB0ZXIgQ0FNIHdpdGggbmV3IHVuaWNhc3QgYWRkcmVzcyAqLworCisJaWYgKGRmeF9jdGxfdXBkYXRlX2NhbShicCkgIT0gREZYX0tfU1VDQ0VTUykKKwkJeworCQlEQkdfcHJpbnRrKCIlczogQ291bGQgbm90IHNldCBuZXcgTUFDIGFkZHJlc3MhXG4iLCBkZXYtPm5hbWUpOworCQl9CisJZWxzZQorCQl7CisJCURCR19wcmludGsoIiVzOiBBZGFwdGVyIENBTSB1cGRhdGVkIHdpdGggbmV3IE1BQyBhZGRyZXNzXG4iLCBkZXYtPm5hbWUpOworCQl9CisJcmV0dXJuKDApOwkJCS8qIGFsd2F5cyByZXR1cm4gemVybyAqLworCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X2N0bF91cGRhdGVfY2FtID0KKyAqID09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBPdmVydmlldzoKKyAqICAgUHJvY2VkdXJlIHRvIHVwZGF0ZSBhZGFwdGVyIENBTSAoQ29udGVudCBBZGRyZXNzYWJsZSBNZW1vcnkpCisgKiAgIHdpdGggZGVzaXJlZCB1bmljYXN0IGFuZCBtdWx0aWNhc3QgYWRkcmVzcyBlbnRyaWVzLgorICoKKyAqIFJldHVybnM6CisgKiAgIENvbmRpdGlvbiBjb2RlCisgKgorICogQXJndW1lbnRzOgorICogICBicCAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBVcGRhdGVzIGFkYXB0ZXIgQ0FNIHdpdGggY3VycmVudCBjb250ZW50cyBvZiBib2FyZCBzdHJ1Y3R1cmUKKyAqICAgdW5pY2FzdCBhbmQgbXVsdGljYXN0IGFkZHJlc3MgdGFibGVzLiAgU2luY2UgdGhlcmUgYXJlIG9ubHkgNjIKKyAqICAgZnJlZSBlbnRyaWVzIGluIENBTSwgdGhpcyByb3V0aW5lIGVuc3VyZXMgdGhhdCB0aGUgY29tbWFuZAorICogICByZXF1ZXN0IGJ1ZmZlciBpcyBub3Qgb3ZlcnJ1bi4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIERGWF9LX1NVQ0NFU1MgLSBSZXF1ZXN0IHN1Y2NlZWRlZAorICogICBERlhfS19GQUlMVVJFIC0gUmVxdWVzdCBmYWlsZWQKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgQWxsIGFkZHJlc3NlcyBiZWluZyBhZGRlZCAodW5pY2FzdCBhbmQgbXVsdGljYXN0KSBhcmUgaW4gY2Fub25pY2FsCisgKiAgIG9yZGVyLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgT24tYm9hcmQgYWRhcHRlciBDQU0gaXMgdXBkYXRlZC4KKyAqLworCitzdGF0aWMgaW50IGRmeF9jdGxfdXBkYXRlX2NhbShERlhfYm9hcmRfdCAqYnApCisJeworCWludAkJCWk7CQkJCS8qIHVzZWQgYXMgaW5kZXggKi8KKwlQSV9MQU5fQUREUgkqcF9hZGRyOwkJLyogcG9pbnRlciB0byBDQU0gZW50cnkgKi8KKworCS8qCisJICogRmlsbCBpbiBjb21tYW5kIHJlcXVlc3QgaW5mb3JtYXRpb24KKwkgKgorCSAqIE5vdGU6IEV2ZW4gdGhvdWdoIGJvdGggdGhlIHVuaWNhc3QgYW5kIG11bHRpY2FzdCBhZGRyZXNzCisJICogICAgICAgdGFibGUgZW50cmllcyBhcmUgc3RvcmVkIGFzIGNvbnRpZ3VvdXMgNiBieXRlIGVudHJpZXMsCisJICoJCSB0aGUgZmlybXdhcmUgYWRkcmVzcyBmaWx0ZXIgc2V0IGNvbW1hbmQgZXhwZWN0cyBlYWNoCisJICoJCSBlbnRyeSB0byBiZSB0d28gbG9uZ3dvcmRzICg4IGJ5dGVzIHRvdGFsKS4gIFdlIG11c3QgYmUKKwkgKgkJIGNhcmVmdWwgdG8gb25seSBjb3B5IHRoZSBzaXggYnl0ZXMgb2YgZWFjaCB1bmljYXN0IGFuZAorCSAqCQkgbXVsdGljYXN0IHRhYmxlIGVudHJ5IGludG8gZWFjaCBjb21tYW5kIGVudHJ5LiAgVGhpcworCSAqCQkgaXMgYWxzbyB3aHkgd2UgbXVzdCBmaXJzdCBjbGVhciB0aGUgZW50aXJlIGNvbW1hbmQKKwkgKgkJIHJlcXVlc3QgYnVmZmVyLgorCSAqLworCisJbWVtc2V0KGJwLT5jbWRfcmVxX3ZpcnQsIDAsIFBJX0NNRF9SRVFfS19TSVpFX01BWCk7CS8qIGZpcnN0IGNsZWFyIGJ1ZmZlciAqLworCWJwLT5jbWRfcmVxX3ZpcnQtPmNtZF90eXBlID0gUElfQ01EX0tfQUREUl9GSUxURVJfU0VUOworCXBfYWRkciA9ICZicC0+Y21kX3JlcV92aXJ0LT5hZGRyX2ZpbHRlcl9zZXQuZW50cnlbMF07CisKKwkvKiBOb3cgYWRkIHVuaWNhc3QgYWRkcmVzc2VzIHRvIGNvbW1hbmQgcmVxdWVzdCBidWZmZXIsIGlmIGFueSAqLworCisJZm9yIChpPTA7IGkgPCAoaW50KWJwLT51Y19jb3VudDsgaSsrKQorCQl7CisJCWlmIChpIDwgUElfQ01EX0FERFJfRklMVEVSX0tfU0laRSkKKwkJCXsKKwkJCW1lbWNweShwX2FkZHIsICZicC0+dWNfdGFibGVbaSpGRERJX0tfQUxFTl0sIEZERElfS19BTEVOKTsKKwkJCXBfYWRkcisrOwkJCS8qIHBvaW50IHRvIG5leHQgY29tbWFuZCBlbnRyeSAqLworCQkJfQorCQl9CisKKwkvKiBOb3cgYWRkIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gY29tbWFuZCByZXF1ZXN0IGJ1ZmZlciwgaWYgYW55ICovCisKKwlmb3IgKGk9MDsgaSA8IChpbnQpYnAtPm1jX2NvdW50OyBpKyspCisJCXsKKwkJaWYgKChpICsgYnAtPnVjX2NvdW50KSA8IFBJX0NNRF9BRERSX0ZJTFRFUl9LX1NJWkUpCisJCQl7CisJCQltZW1jcHkocF9hZGRyLCAmYnAtPm1jX3RhYmxlW2kqRkRESV9LX0FMRU5dLCBGRERJX0tfQUxFTik7CisJCQlwX2FkZHIrKzsJCQkvKiBwb2ludCB0byBuZXh0IGNvbW1hbmQgZW50cnkgKi8KKwkJCX0KKwkJfQorCisJLyogSXNzdWUgY29tbWFuZCB0byB1cGRhdGUgYWRhcHRlciBDQU0sIHRoZW4gcmV0dXJuICovCisKKwlpZiAoZGZ4X2h3X2RtYV9jbWRfcmVxKGJwKSAhPSBERlhfS19TVUNDRVNTKQorCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CisJcmV0dXJuKERGWF9LX1NVQ0NFU1MpOworCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9jdGxfdXBkYXRlX2ZpbHRlcnMgPQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBPdmVydmlldzoKKyAqICAgUHJvY2VkdXJlIHRvIHVwZGF0ZSBhZGFwdGVyIGZpbHRlcnMgd2l0aCBkZXNpcmVkCisgKiAgIGZpbHRlciBzZXR0aW5ncy4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIENvbmRpdGlvbiBjb2RlCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgYnAgLSBwb2ludGVyIHRvIGJvYXJkIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgRW5hYmxlcyBvciBkaXNhYmxlcyBmaWx0ZXIgdXNpbmcgY3VycmVudCBmaWx0ZXIgc2V0dGluZ3MuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBERlhfS19TVUNDRVNTIC0gUmVxdWVzdCBzdWNjZWVkZWQuCisgKiAgIERGWF9LX0ZBSUxVUkUgLSBSZXF1ZXN0IGZhaWxlZC4KKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgV2UgbXVzdCBhbHdheXMgcGFzcyB1cCBwYWNrZXRzIGRlc3RpbmVkIHRvIHRoZSBicm9hZGNhc3QKKyAqICAgYWRkcmVzcyAoRkYtRkYtRkYtRkYtRkYtRkYpLCBzbyB3ZSdsbCBhbHdheXMga2VlcCB0aGUKKyAqICAgYnJvYWRjYXN0IGZpbHRlciBlbmFibGVkLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgT24tYm9hcmQgYWRhcHRlciBmaWx0ZXJzIGFyZSB1cGRhdGVkLgorICovCisKK3N0YXRpYyBpbnQgZGZ4X2N0bF91cGRhdGVfZmlsdGVycyhERlhfYm9hcmRfdCAqYnApCisJeworCWludAlpID0gMDsJCQkJCS8qIHVzZWQgYXMgaW5kZXggKi8KKworCS8qIEZpbGwgaW4gY29tbWFuZCByZXF1ZXN0IGluZm9ybWF0aW9uICovCisKKwlicC0+Y21kX3JlcV92aXJ0LT5jbWRfdHlwZSA9IFBJX0NNRF9LX0ZJTFRFUlNfU0VUOworCisJLyogSW5pdGlhbGl6ZSBCcm9hZGNhc3QgZmlsdGVyIC0gKiBBTFdBWVMgRU5BQkxFRCAqICovCisKKwlicC0+Y21kX3JlcV92aXJ0LT5maWx0ZXJfc2V0Lml0ZW1baV0uaXRlbV9jb2RlCT0gUElfSVRFTV9LX0JST0FEQ0FTVDsKKwlicC0+Y21kX3JlcV92aXJ0LT5maWx0ZXJfc2V0Lml0ZW1baSsrXS52YWx1ZQk9IFBJX0ZTVEFURV9LX1BBU1M7CisKKwkvKiBJbml0aWFsaXplIExMQyBJbmRpdmlkdWFsL0dyb3VwIFByb21pc2N1b3VzIGZpbHRlciAqLworCisJYnAtPmNtZF9yZXFfdmlydC0+ZmlsdGVyX3NldC5pdGVtW2ldLml0ZW1fY29kZQk9IFBJX0lURU1fS19JTkRfR1JPVVBfUFJPTTsKKwlicC0+Y21kX3JlcV92aXJ0LT5maWx0ZXJfc2V0Lml0ZW1baSsrXS52YWx1ZQk9IGJwLT5pbmRfZ3JvdXBfcHJvbTsKKworCS8qIEluaXRpYWxpemUgTExDIEdyb3VwIFByb21pc2N1b3VzIGZpbHRlciAqLworCisJYnAtPmNtZF9yZXFfdmlydC0+ZmlsdGVyX3NldC5pdGVtW2ldLml0ZW1fY29kZQk9IFBJX0lURU1fS19HUk9VUF9QUk9NOworCWJwLT5jbWRfcmVxX3ZpcnQtPmZpbHRlcl9zZXQuaXRlbVtpKytdLnZhbHVlCT0gYnAtPmdyb3VwX3Byb207CisKKwkvKiBUZXJtaW5hdGUgdGhlIGl0ZW0gY29kZSBsaXN0ICovCisKKwlicC0+Y21kX3JlcV92aXJ0LT5maWx0ZXJfc2V0Lml0ZW1baV0uaXRlbV9jb2RlCT0gUElfSVRFTV9LX0VPTDsKKworCS8qIElzc3VlIGNvbW1hbmQgdG8gdXBkYXRlIGFkYXB0ZXIgZmlsdGVycywgdGhlbiByZXR1cm4gKi8KKworCWlmIChkZnhfaHdfZG1hX2NtZF9yZXEoYnApICE9IERGWF9LX1NVQ0NFU1MpCisJCXJldHVybihERlhfS19GQUlMVVJFKTsKKwlyZXR1cm4oREZYX0tfU1VDQ0VTUyk7CisJfQorCisMCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PQorICogPSBkZnhfaHdfZG1hX2NtZF9yZXEgPQorICogPT09PT09PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBTZW5kcyBQRFEgRE1BIGNvbW1hbmQgdG8gYWRhcHRlciBmaXJtd2FyZQorICogIAorICogUmV0dXJuczoKKyAqICAgQ29uZGl0aW9uIGNvZGUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBicCAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBUaGUgY29tbWFuZCByZXF1ZXN0IGFuZCByZXNwb25zZSBidWZmZXJzIGFyZSBwb3N0ZWQgdG8gdGhlIGFkYXB0ZXIgaW4gdGhlIG1hbm5lcgorICogICBkZXNjcmliZWQgaW4gdGhlIFBEUSBQb3J0IFNwZWNpZmljYXRpb246CisgKgorICoJCTEuIENvbW1hbmQgUmVzcG9uc2UgQnVmZmVyIGlzIHBvc3RlZCB0byBhZGFwdGVyLgorICoJCTIuIENvbW1hbmQgUmVxdWVzdCBCdWZmZXIgaXMgcG9zdGVkIHRvIGFkYXB0ZXIuCisgKgkJMy4gQ29tbWFuZCBSZXF1ZXN0IGNvbnN1bWVyIGluZGV4IGlzIHBvbGxlZCB1bnRpbCBpdCBpbmRpY2F0ZXMgdGhhdCByZXF1ZXN0CisgKiAgICAgICAgIGJ1ZmZlciBoYXMgYmVlbiBETUEnZCB0byBhZGFwdGVyLgorICoJCTQuIENvbW1hbmQgUmVzcG9uc2UgY29uc3VtZXIgaW5kZXggaXMgcG9sbGVkIHVudGlsIGl0IGluZGljYXRlcyB0aGF0IHJlc3BvbnNlCisgKiAgICAgICAgIGJ1ZmZlciBoYXMgYmVlbiBETUEnZCBmcm9tIGFkYXB0ZXIuCisgKgorICogICBUaGlzIG9yZGVyaW5nIGVuc3VyZXMgdGhhdCBhIHJlc3BvbnNlIGJ1ZmZlciBpcyBhbHJlYWR5IGF2YWlsYWJsZSBmb3IgdGhlIGZpcm13YXJlCisgKiAgIHRvIHVzZSBvbmNlIGl0J3MgZG9uZSBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0IGJ1ZmZlci4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIERGWF9LX1NVQ0NFU1MJICAtIERNQSBjb21tYW5kIHN1Y2NlZWRlZAorICogCSBERlhfS19PVVRTVEFURSAgIC0gQWRhcHRlciBpcyBOT1QgaW4gcHJvcGVyIHN0YXRlCisgKiAgIERGWF9LX0hXX1RJTUVPVVQgLSBETUEgY29tbWFuZCB0aW1lZCBvdXQKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgQ29tbWFuZCByZXF1ZXN0IGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIGZpbGxlZCB3aXRoIGRlc2lyZWQgRE1BIGNvbW1hbmQuCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBOb25lCisgKi8KKworc3RhdGljIGludCBkZnhfaHdfZG1hX2NtZF9yZXEoREZYX2JvYXJkX3QgKmJwKQorCXsKKwlpbnQgc3RhdHVzOwkJCS8qIGFkYXB0ZXIgc3RhdHVzICovCisJaW50IHRpbWVvdXRfY250OwkvKiB1c2VkIGluIGZvciBsb29wcyAqLworCQorCS8qIE1ha2Ugc3VyZSB0aGUgYWRhcHRlciBpcyBpbiBhIHN0YXRlIHRoYXQgd2UgY2FuIGlzc3VlIHRoZSBETUEgY29tbWFuZCBpbiAqLworCQorCXN0YXR1cyA9IGRmeF9od19hZGFwX3N0YXRlX3JkKGJwKTsKKwlpZiAoKHN0YXR1cyA9PSBQSV9TVEFURV9LX1JFU0VUKQkJfHwKKwkJKHN0YXR1cyA9PSBQSV9TVEFURV9LX0hBTFRFRCkJCXx8CisJCShzdGF0dXMgPT0gUElfU1RBVEVfS19ETUFfVU5BVkFJTCkJfHwKKwkJKHN0YXR1cyA9PSBQSV9TVEFURV9LX1VQR1JBREUpKQorCQlyZXR1cm4oREZYX0tfT1VUU1RBVEUpOworCisJLyogUHV0IHJlc3BvbnNlIGJ1ZmZlciBvbiB0aGUgY29tbWFuZCByZXNwb25zZSBxdWV1ZSAqLworCisJYnAtPmRlc2NyX2Jsb2NrX3ZpcnQtPmNtZF9yc3BbYnAtPmNtZF9yc3BfcmVnLmluZGV4LnByb2RdLmxvbmdfMCA9ICh1MzIpIChQSV9SQ1ZfREVTQ1JfTV9TT1AgfAorCQkJKChQSV9DTURfUlNQX0tfU0laRV9NQVggLyBQSV9BTElHTl9LX0NNRF9SU1BfQlVGRikgPDwgUElfUkNWX0RFU0NSX1ZfU0VHX0xFTikpOworCWJwLT5kZXNjcl9ibG9ja192aXJ0LT5jbWRfcnNwW2JwLT5jbWRfcnNwX3JlZy5pbmRleC5wcm9kXS5sb25nXzEgPSBicC0+Y21kX3JzcF9waHlzOworCisJLyogQnVtcCAoYW5kIHdyYXApIHRoZSBwcm9kdWNlciBpbmRleCBhbmQgd3JpdGUgb3V0IHRvIHJlZ2lzdGVyICovCisKKwlicC0+Y21kX3JzcF9yZWcuaW5kZXgucHJvZCArPSAxOworCWJwLT5jbWRfcnNwX3JlZy5pbmRleC5wcm9kICY9IFBJX0NNRF9SU1BfS19OVU1fRU5UUklFUy0xOworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19DTURfUlNQX1BST0QsIGJwLT5jbWRfcnNwX3JlZy5sd29yZCk7CisKKwkvKiBQdXQgcmVxdWVzdCBidWZmZXIgb24gdGhlIGNvbW1hbmQgcmVxdWVzdCBxdWV1ZSAqLworCQorCWJwLT5kZXNjcl9ibG9ja192aXJ0LT5jbWRfcmVxW2JwLT5jbWRfcmVxX3JlZy5pbmRleC5wcm9kXS5sb25nXzAgPSAodTMyKSAoUElfWE1UX0RFU0NSX01fU09QIHwKKwkJCVBJX1hNVF9ERVNDUl9NX0VPUCB8IChQSV9DTURfUkVRX0tfU0laRV9NQVggPDwgUElfWE1UX0RFU0NSX1ZfU0VHX0xFTikpOworCWJwLT5kZXNjcl9ibG9ja192aXJ0LT5jbWRfcmVxW2JwLT5jbWRfcmVxX3JlZy5pbmRleC5wcm9kXS5sb25nXzEgPSBicC0+Y21kX3JlcV9waHlzOworCisJLyogQnVtcCAoYW5kIHdyYXApIHRoZSBwcm9kdWNlciBpbmRleCBhbmQgd3JpdGUgb3V0IHRvIHJlZ2lzdGVyICovCisKKwlicC0+Y21kX3JlcV9yZWcuaW5kZXgucHJvZCArPSAxOworCWJwLT5jbWRfcmVxX3JlZy5pbmRleC5wcm9kICY9IFBJX0NNRF9SRVFfS19OVU1fRU5UUklFUy0xOworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19DTURfUkVRX1BST0QsIGJwLT5jbWRfcmVxX3JlZy5sd29yZCk7CisKKwkvKgorCSAqIEhlcmUgd2Ugd2FpdCBmb3IgdGhlIGNvbW1hbmQgcmVxdWVzdCBjb25zdW1lciBpbmRleCB0byBiZSBlcXVhbAorCSAqIHRvIHRoZSBwcm9kdWNlciwgaW5kaWNhdGluZyB0aGF0IHRoZSBhZGFwdGVyIGhhcyBETUFlZCB0aGUgcmVxdWVzdC4KKwkgKi8KKworCWZvciAodGltZW91dF9jbnQgPSAyMDAwMDsgdGltZW91dF9jbnQgPiAwOyB0aW1lb3V0X2NudC0tKQorCQl7CisJCWlmIChicC0+Y21kX3JlcV9yZWcuaW5kZXgucHJvZCA9PSAodTgpKGJwLT5jb25zX2Jsb2NrX3ZpcnQtPmNtZF9yZXEpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOwkJCS8qIHdhaXQgZm9yIDEwMCBtaWNyb3NlY29uZHMgKi8KKwkJfQorCWlmICh0aW1lb3V0X2NudCA9PSAwKSAKKwkJcmV0dXJuKERGWF9LX0hXX1RJTUVPVVQpOworCisJLyogQnVtcCAoYW5kIHdyYXApIHRoZSBjb21wbGV0aW9uIGluZGV4IGFuZCB3cml0ZSBvdXQgdG8gcmVnaXN0ZXIgKi8KKworCWJwLT5jbWRfcmVxX3JlZy5pbmRleC5jb21wICs9IDE7CisJYnAtPmNtZF9yZXFfcmVnLmluZGV4LmNvbXAgJj0gUElfQ01EX1JFUV9LX05VTV9FTlRSSUVTLTE7CisJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUElfUERRX0tfUkVHX0NNRF9SRVFfUFJPRCwgYnAtPmNtZF9yZXFfcmVnLmx3b3JkKTsKKworCS8qCisJICogSGVyZSB3ZSB3YWl0IGZvciB0aGUgY29tbWFuZCByZXNwb25zZSBjb25zdW1lciBpbmRleCB0byBiZSBlcXVhbAorCSAqIHRvIHRoZSBwcm9kdWNlciwgaW5kaWNhdGluZyB0aGF0IHRoZSBhZGFwdGVyIGhhcyBETUFlZCB0aGUgcmVzcG9uc2UuCisJICovCisKKwlmb3IgKHRpbWVvdXRfY250ID0gMjAwMDA7IHRpbWVvdXRfY250ID4gMDsgdGltZW91dF9jbnQtLSkKKwkJeworCQlpZiAoYnAtPmNtZF9yc3BfcmVnLmluZGV4LnByb2QgPT0gKHU4KShicC0+Y29uc19ibG9ja192aXJ0LT5jbWRfcnNwKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTAwKTsJCQkvKiB3YWl0IGZvciAxMDAgbWljcm9zZWNvbmRzICovCisJCX0KKwlpZiAodGltZW91dF9jbnQgPT0gMCkgCisJCXJldHVybihERlhfS19IV19USU1FT1VUKTsKKworCS8qIEJ1bXAgKGFuZCB3cmFwKSB0aGUgY29tcGxldGlvbiBpbmRleCBhbmQgd3JpdGUgb3V0IHRvIHJlZ2lzdGVyICovCisKKwlicC0+Y21kX3JzcF9yZWcuaW5kZXguY29tcCArPSAxOworCWJwLT5jbWRfcnNwX3JlZy5pbmRleC5jb21wICY9IFBJX0NNRF9SU1BfS19OVU1fRU5UUklFUy0xOworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19DTURfUlNQX1BST0QsIGJwLT5jbWRfcnNwX3JlZy5sd29yZCk7CisJcmV0dXJuKERGWF9LX1NVQ0NFU1MpOworCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PQorICogPSBkZnhfaHdfcG9ydF9jdHJsX3JlcSA9CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgU2VuZHMgUERRIHBvcnQgY29udHJvbCBjb21tYW5kIHRvIGFkYXB0ZXIgZmlybXdhcmUKKyAqICAKKyAqIFJldHVybnM6CisgKiAgIEhvc3QgZGF0YSByZWdpc3RlciB2YWx1ZSBpbiBob3N0X2RhdGEgaWYgcHRyIGlzIG5vdCBOVUxMCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgYnAJCQktIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqCSBjb21tYW5kCS0gcG9ydCBjb250cm9sIGNvbW1hbmQKKyAqCSBkYXRhX2EJCS0gcG9ydCBkYXRhIEEgcmVnaXN0ZXIgdmFsdWUKKyAqCSBkYXRhX2IJCS0gcG9ydCBkYXRhIEIgcmVnaXN0ZXIgdmFsdWUKKyAqCSBob3N0X2RhdGEJLSBwdHIgdG8gaG9zdCBkYXRhIHJlZ2lzdGVyIHZhbHVlCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgU2VuZCBnZW5lcmljIHBvcnQgY29udHJvbCBjb21tYW5kIHRvIGFkYXB0ZXIgYnkgd3JpdGluZworICogICB0byB2YXJpb3VzIFBEUSBwb3J0IHJlZ2lzdGVycywgdGhlbiBwb2xsaW5nIGZvciBjb21wbGV0aW9uLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgREZYX0tfU1VDQ0VTUwkgIC0gcG9ydCBjb250cm9sIGNvbW1hbmQgc3VjY2VlZGVkCisgKiAgIERGWF9LX0hXX1RJTUVPVVQgLSBwb3J0IGNvbnRyb2wgY29tbWFuZCB0aW1lZCBvdXQKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgTm9uZQorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgTm9uZQorICovCisKK3N0YXRpYyBpbnQgZGZ4X2h3X3BvcnRfY3RybF9yZXEoCisJREZYX2JvYXJkX3QJKmJwLAorCVBJX1VJTlQzMgljb21tYW5kLAorCVBJX1VJTlQzMglkYXRhX2EsCisJUElfVUlOVDMyCWRhdGFfYiwKKwlQSV9VSU5UMzIJKmhvc3RfZGF0YQorCSkKKworCXsKKwlQSV9VSU5UMzIJcG9ydF9jbWQ7CQkvKiBQb3J0IENvbnRyb2wgY29tbWFuZCByZWdpc3RlciB2YWx1ZSAqLworCWludAkJCXRpbWVvdXRfY250OwkvKiB1c2VkIGluIGZvciBsb29wcyAqLworCisJLyogU2V0IENvbW1hbmQgRXJyb3IgYml0IGluIGNvbW1hbmQgbG9uZ3dvcmQgKi8KKwkKKwlwb3J0X2NtZCA9IChQSV9VSU5UMzIpIChjb21tYW5kIHwgUElfUENUUkxfTV9DTURfRVJST1IpOworCisJLyogSXNzdWUgcG9ydCBjb21tYW5kIHRvIHRoZSBhZGFwdGVyICovCisKKwlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQSV9QRFFfS19SRUdfUE9SVF9EQVRBX0EsIGRhdGFfYSk7CisJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUElfUERRX0tfUkVHX1BPUlRfREFUQV9CLCBkYXRhX2IpOworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19QT1JUX0NUUkwsIHBvcnRfY21kKTsKKworCS8qIE5vdyB3YWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlICovCisKKwlpZiAoY29tbWFuZCA9PSBQSV9QQ1RSTF9NX0JMQVNUX0ZMQVNIKQorCQl0aW1lb3V0X2NudCA9IDYwMDAwMDsJLyogc2V0IGNvbW1hbmQgdGltZW91dCBjb3VudCB0byA2MCBzZWNvbmRzICovCisJZWxzZQorCQl0aW1lb3V0X2NudCA9IDIwMDAwOwkvKiBzZXQgY29tbWFuZCB0aW1lb3V0IGNvdW50IHRvIDIgc2Vjb25kcyAqLworCisJZm9yICg7IHRpbWVvdXRfY250ID4gMDsgdGltZW91dF9jbnQtLSkKKwkJeworCQlkZnhfcG9ydF9yZWFkX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19QT1JUX0NUUkwsICZwb3J0X2NtZCk7CisJCWlmICghKHBvcnRfY21kICYgUElfUENUUkxfTV9DTURfRVJST1IpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOwkJCS8qIHdhaXQgZm9yIDEwMCBtaWNyb3NlY29uZHMgKi8KKwkJfQorCWlmICh0aW1lb3V0X2NudCA9PSAwKSAKKwkJcmV0dXJuKERGWF9LX0hXX1RJTUVPVVQpOworCisJLyoKKwkgKiBJZiB0aGUgYWRkcmVzcyBvZiBob3N0X2RhdGEgaXMgbm9uLXplcm8sIGFzc3VtZSBjYWxsZXIgaGFzIHN1cHBsaWVkIGEgIAorCSAqIG5vbiBOVUxMIHBvaW50ZXIsIGFuZCByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0RBVEEgcmVnaXN0ZXIgaW4gCisJICogaXQuCisJICovCisKKwlpZiAoaG9zdF9kYXRhICE9IE5VTEwpCisJCWRmeF9wb3J0X3JlYWRfbG9uZyhicCwgUElfUERRX0tfUkVHX0hPU1RfREFUQSwgaG9zdF9kYXRhKTsKKwlyZXR1cm4oREZYX0tfU1VDQ0VTUyk7CisJfQorCisMCisvKgorICogPT09PT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9od19hZGFwX3Jlc2V0ID0KKyAqID09PT09PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBSZXNldHMgYWRhcHRlcgorICogIAorICogUmV0dXJuczoKKyAqICAgTm9uZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGJwICAgLSBwb2ludGVyIHRvIGJvYXJkIGluZm9ybWF0aW9uCisgKiAgIHR5cGUgLSB0eXBlIG9mIHJlc2V0IHRvIHBlcmZvcm0KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBJc3N1ZSBzb2Z0IHJlc2V0IHRvIGFkYXB0ZXIgYnkgd3JpdGluZyB0byBQRFEgUG9ydCBSZXNldAorICogICByZWdpc3Rlci4gIFVzZSBpbmNvbWluZyByZXNldCB0eXBlIHRvIHRlbGwgYWRhcHRlciB3aGF0CisgKiAgIGtpbmQgb2YgcmVzZXQgb3BlcmF0aW9uIHRvIHBlcmZvcm0uCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBOb25lCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIFRoaXMgcm91dGluZSBtZXJlbHkgaXNzdWVzIGEgc29mdCByZXNldCB0byB0aGUgYWRhcHRlci4KKyAqICAgSXQgaXMgZXhwZWN0ZWQgdGhhdCBhZnRlciB0aGlzIHJvdXRpbmUgcmV0dXJucywgdGhlIGNhbGxlcgorICogICB3aWxsIGFwcHJvcHJpYXRlbHkgcG9sbCB0aGUgUG9ydCBTdGF0dXMgcmVnaXN0ZXIgZm9yIHRoZQorICogICBhZGFwdGVyIHRvIGVudGVyIHRoZSBwcm9wZXIgc3RhdGUuCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBJbnRlcm5hbCBhZGFwdGVyIHJlZ2lzdGVycyBhcmUgY2xlYXJlZC4KKyAqLworCitzdGF0aWMgdm9pZCBkZnhfaHdfYWRhcF9yZXNldCgKKwlERlhfYm9hcmRfdAkqYnAsCisJUElfVUlOVDMyCXR5cGUKKwkpCisKKwl7CisJLyogU2V0IFJlc2V0IHR5cGUgYW5kIGFzc2VydCByZXNldCAqLworCisJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUElfUERRX0tfUkVHX1BPUlRfREFUQV9BLCB0eXBlKTsJLyogdGVsbCBhZGFwdGVyIHR5cGUgb2YgcmVzZXQgKi8KKwlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQSV9QRFFfS19SRUdfUE9SVF9SRVNFVCwgUElfUkVTRVRfTV9BU1NFUlRfUkVTRVQpOworCisJLyogV2FpdCBmb3IgYXQgbGVhc3QgMSBNaWNyb3NlY29uZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWMuIFdlIHdhaXQgMjAganVzdCB0byBiZSBzYWZlICovCisKKwl1ZGVsYXkoMjApOworCisJLyogRGVhc3NlcnQgcmVzZXQgKi8KKworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19QT1JUX1JFU0VULCAwKTsKKwl9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X2h3X2FkYXBfc3RhdGVfcmQgPQorICogPT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIFJldHVybnMgY3VycmVudCBhZGFwdGVyIHN0YXRlCisgKiAgCisgKiBSZXR1cm5zOgorICogICBBZGFwdGVyIHN0YXRlIHBlciBQRFEgUG9ydCBTcGVjaWZpY2F0aW9uCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgYnAgLSBwb2ludGVyIHRvIGJvYXJkIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgUmVhZHMgUERRIFBvcnQgU3RhdHVzIHJlZ2lzdGVyIGFuZCByZXR1cm5zIGFkYXB0ZXIgc3RhdGUuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBOb25lCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIE5vbmUKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIE5vbmUKKyAqLworCitzdGF0aWMgaW50IGRmeF9od19hZGFwX3N0YXRlX3JkKERGWF9ib2FyZF90ICpicCkKKwl7CisJUElfVUlOVDMyIHBvcnRfc3RhdHVzOwkJLyogUG9ydCBTdGF0dXMgcmVnaXN0ZXIgdmFsdWUgKi8KKworCWRmeF9wb3J0X3JlYWRfbG9uZyhicCwgUElfUERRX0tfUkVHX1BPUlRfU1RBVFVTLCAmcG9ydF9zdGF0dXMpOworCXJldHVybigocG9ydF9zdGF0dXMgJiBQSV9QU1RBVFVTX01fU1RBVEUpID4+IFBJX1BTVEFUVVNfVl9TVEFURSk7CisJfQorCisMCisvKgorICogPT09PT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9od19kbWFfdW5pbml0ID0KKyAqID09PT09PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBCcmluZ3MgYWRhcHRlciB0byBETUFfVU5BVkFJTEFCTEUgc3RhdGUKKyAqICAKKyAqIFJldHVybnM6CisgKiAgIENvbmRpdGlvbiBjb2RlCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgYnAgICAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqICAgdHlwZSAtIHR5cGUgb2YgcmVzZXQgdG8gcGVyZm9ybQorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIEJyaW5nIGFkYXB0ZXIgdG8gRE1BX1VOQVZBSUxBQkxFIHN0YXRlIGJ5IHBlcmZvcm1pbmcgdGhlIGZvbGxvd2luZzoKKyAqCQkxLiBTZXQgcmVzZXQgdHlwZSBiaXQgaW4gUG9ydCBEYXRhIEEgUmVnaXN0ZXIgdGhlbiByZXNldCBhZGFwdGVyLgorICoJCTIuIENoZWNrIHRoYXQgYWRhcHRlciBpcyBpbiBETUFfVU5BVkFJTEFCTEUgc3RhdGUuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBERlhfS19TVUNDRVNTCSAgLSBhZGFwdGVyIGlzIGluIERNQV9VTkFWQUlMQUJMRSBzdGF0ZQorICogICBERlhfS19IV19USU1FT1VUIC0gYWRhcHRlciBkaWQgbm90IHJlc2V0IHByb3Blcmx5CisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIE5vbmUKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIEludGVybmFsIGFkYXB0ZXIgcmVnaXN0ZXJzIGFyZSBjbGVhcmVkLgorICovCisKK3N0YXRpYyBpbnQgZGZ4X2h3X2RtYV91bmluaXQoREZYX2JvYXJkX3QgKmJwLCBQSV9VSU5UMzIgdHlwZSkKKwl7CisJaW50IHRpbWVvdXRfY250OwkvKiB1c2VkIGluIGZvciBsb29wcyAqLworCisJLyogU2V0IHJlc2V0IHR5cGUgYml0IGFuZCByZXNldCBhZGFwdGVyICovCisKKwlkZnhfaHdfYWRhcF9yZXNldChicCwgdHlwZSk7CisKKwkvKiBOb3cgd2FpdCBmb3IgYWRhcHRlciB0byBlbnRlciBETUFfVU5BVkFJTEFCTEUgc3RhdGUgKi8KKworCWZvciAodGltZW91dF9jbnQgPSAxMDAwMDA7IHRpbWVvdXRfY250ID4gMDsgdGltZW91dF9jbnQtLSkKKwkJeworCQlpZiAoZGZ4X2h3X2FkYXBfc3RhdGVfcmQoYnApID09IFBJX1NUQVRFX0tfRE1BX1VOQVZBSUwpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwMCk7CQkJCQkvKiB3YWl0IGZvciAxMDAgbWljcm9zZWNvbmRzICovCisJCX0KKwlpZiAodGltZW91dF9jbnQgPT0gMCkgCisJCXJldHVybihERlhfS19IV19USU1FT1VUKTsKKwlyZXR1cm4oREZYX0tfU1VDQ0VTUyk7CisJfQorDAorLyoKKyAqCUFsaWduIGFuIHNrX2J1ZmYgdG8gYSBib3VuZGFyeSBwb3dlciBvZiAyCisgKgorICovCisgCitzdGF0aWMgdm9pZCBteV9za2JfYWxpZ24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG4pCit7CisJdW5zaWduZWQgbG9uZyB4ID0gKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhOworCXVuc2lnbmVkIGxvbmcgdjsKKwkKKwl2ID0gQUxJR04oeCwgbik7CS8qIFdoZXJlIHdlIHdhbnQgdG8gYmUgKi8KKwkKKwlza2JfcmVzZXJ2ZShza2IsIHYgLSB4KTsKK30KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X3Jjdl9pbml0ID0KKyAqID09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgUHJvZHVjZXMgYnVmZmVycyB0byBhZGFwdGVyIExMQyBIb3N0IHJlY2VpdmUgZGVzY3JpcHRvciBibG9jaworICogIAorICogUmV0dXJuczoKKyAqICAgTm9uZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGJwIC0gcG9pbnRlciB0byBib2FyZCBpbmZvcm1hdGlvbgorICogICBnZXRfYnVmZmVycyAtIG5vbi16ZXJvIGlmIGJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgZHVyaW5nIGRmeF9hZGFwX2luaXQoKSBvciBkdXJpbmcgYW4gYWRhcHRlcgorICoJIHJlc2V0LiAgSXQgaW5pdGlhbGl6ZXMgdGhlIGRlc2NyaXB0b3IgYmxvY2sgYW5kIHByb2R1Y2VzIGFsbCBhbGxvY2F0ZWQKKyAqICAgTExDIEhvc3QgcXVldWUgcmVjZWl2ZSBidWZmZXJzLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgUmV0dXJuIDAgb24gc3VjY2VzcyBvciAtRU5PTUVNIGlmIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCAod2hlbiB1c2luZworICogICBkeW5hbWljIGJ1ZmZlciBhbGxvY2F0aW9uKS4gSWYgdGhlIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCwgdGhlCisgKiAgIGFscmVhZHkgYWxsb2NhdGVkIGJ1ZmZlcnMgd2lsbCBub3QgYmUgcmVsZWFzZWQgYW5kIHRoZSBjYWxsZXIgc2hvdWxkIGRvCisgKiAgIHRoaXMuCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIFRoZSBQRFEgaGFzIGJlZW4gcmVzZXQgYW5kIHRoZSBhZGFwdGVyIGFuZCBkcml2ZXIgbWFpbnRhaW5lZCBUeXBlIDIKKyAqICAgcmVnaXN0ZXIgaW5kaWNlcyBhcmUgY2xlYXJlZC4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIFJlY2VpdmUgYnVmZmVycyBhcmUgcG9zdGVkIHRvIHRoZSBhZGFwdGVyIExMQyBxdWV1ZSBhbmQgdGhlIGFkYXB0ZXIKKyAqICAgaXMgbm90aWZpZWQuCisgKi8KKworc3RhdGljIGludCBkZnhfcmN2X2luaXQoREZYX2JvYXJkX3QgKmJwLCBpbnQgZ2V0X2J1ZmZlcnMpCisJeworCWludAlpLCBqOwkJCQkJLyogdXNlZCBpbiBmb3IgbG9vcCAqLworCisJLyoKKwkgKiAgU2luY2UgZWFjaCByZWNlaXZlIGJ1ZmZlciBpcyBhIHNpbmdsZSBmcmFnbWVudCBvZiBzYW1lIGxlbmd0aCwgaW5pdGlhbGl6ZQorCSAqICBmaXJzdCBsb25nd29yZCBpbiBlYWNoIHJlY2VpdmUgZGVzY3JpcHRvciBmb3IgZW50aXJlIExMQyBIb3N0IGRlc2NyaXB0b3IKKwkgKiAgYmxvY2suICBBbHNvIGluaXRpYWxpemUgc2Vjb25kIGxvbmd3b3JkIGluIGVhY2ggcmVjZWl2ZSBkZXNjcmlwdG9yIHdpdGgKKwkgKiAgcGh5c2ljYWwgYWRkcmVzcyBvZiByZWNlaXZlIGJ1ZmZlci4gIFdlJ2xsIGFsd2F5cyBhbGxvY2F0ZSByZWNlaXZlCisJICogIGJ1ZmZlcnMgaW4gcG93ZXJzIG9mIDIgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGZpbGwgdGhlIDI1NiBlbnRyeSBkZXNjcmlwdG9yCisJICogIGJsb2NrIGFuZCBwcm9kdWNlIG5ldyByZWNlaXZlIGJ1ZmZlcnMgYnkgc2ltcGx5IHVwZGF0aW5nIHRoZSByZWNlaXZlCisJICogIHByb2R1Y2VyIGluZGV4LgorCSAqCisJICogCUFzc3VtcHRpb25zOgorCSAqCQlUbyBzdXBwb3J0IGFsbCBzaGlwcGluZyB2ZXJzaW9ucyBvZiBQRFEsIHRoZSByZWNlaXZlIGJ1ZmZlciBzaXplCisJICoJCW11c3QgYmUgbW9kIDEyOCBpbiBsZW5ndGggYW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG11c3QgYmUgMTI4IGJ5dGUKKwkgKgkJYWxpZ25lZC4gIEluIG90aGVyIHdvcmRzLCBiaXRzIDAtNiBvZiB0aGUgbGVuZ3RoIGFuZCBhZGRyZXNzIG11c3QKKwkgKgkJYmUgemVybyBmb3IgdGhlIGZvbGxvd2luZyBkZXNjcmlwdG9yIGZpZWxkIGVudHJpZXMgdG8gYmUgY29ycmVjdCBvbgorCSAqCQlhbGwgUERRLWJhc2VkIGJvYXJkcy4gIFdlIGd1YXJhbnRlZWQgYm90aCByZXF1aXJlbWVudHMgZHVyaW5nCisJICoJCWRyaXZlciBpbml0aWFsaXphdGlvbiB3aGVuIHdlIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHRoZSByZWNlaXZlIGJ1ZmZlcnMuCisJICovCisKKwlpZiAoZ2V0X2J1ZmZlcnMpIHsKKyNpZmRlZiBEWU5BTUlDX0JVRkZFUlMKKwlmb3IgKGkgPSAwOyBpIDwgKGludCkoYnAtPnJjdl9idWZzX3RvX3Bvc3QpOyBpKyspCisJCWZvciAoaiA9IDA7IChpICsgaikgPCAoaW50KVBJX1JDVl9EQVRBX0tfTlVNX0VOVFJJRVM7IGogKz0gYnAtPnJjdl9idWZzX3RvX3Bvc3QpCisJCXsKKwkJCXN0cnVjdCBza19idWZmICpuZXdza2IgPSBfX2Rldl9hbGxvY19za2IoTkVXX1NLQl9TSVpFLCBHRlBfTk9JTyk7CisJCQlpZiAoIW5ld3NrYikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWJwLT5kZXNjcl9ibG9ja192aXJ0LT5yY3ZfZGF0YVtpK2pdLmxvbmdfMCA9ICh1MzIpIChQSV9SQ1ZfREVTQ1JfTV9TT1AgfAorCQkJCSgoUElfUkNWX0RBVEFfS19TSVpFX01BWCAvIFBJX0FMSUdOX0tfUkNWX0RBVEFfQlVGRikgPDwgUElfUkNWX0RFU0NSX1ZfU0VHX0xFTikpOworCQkJLyoKKwkJCSAqIGFsaWduIHRvIDEyOCBieXRlcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCisJCQkgKiB0aGUgb2xkIEVJU0EgYm9hcmRzLgorCQkJICovCisJCQkgCisJCQlteV9za2JfYWxpZ24obmV3c2tiLCAxMjgpOworCQkJYnAtPmRlc2NyX2Jsb2NrX3ZpcnQtPnJjdl9kYXRhW2kgKyBqXS5sb25nXzEgPQorCQkJCSh1MzIpcGNpX21hcF9zaW5nbGUoYnAtPnBjaV9kZXYsIG5ld3NrYi0+ZGF0YSwKKwkJCQkJCSAgICBORVdfU0tCX1NJWkUsCisJCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCS8qCisJCQkgKiBwX3Jjdl9idWZmX3ZhIGlzIG9ubHkgdXNlZCBpbnNpZGUgdGhlCisJCQkgKiBrZXJuZWwgc28gd2UgcHV0IHRoZSBza2IgcG9pbnRlciBoZXJlLgorCQkJICovCisJCQlicC0+cF9yY3ZfYnVmZl92YVtpK2pdID0gKGNoYXIgKikgbmV3c2tiOworCQl9CisjZWxzZQorCWZvciAoaT0wOyBpIDwgKGludCkoYnAtPnJjdl9idWZzX3RvX3Bvc3QpOyBpKyspCisJCWZvciAoaj0wOyAoaSArIGopIDwgKGludClQSV9SQ1ZfREFUQV9LX05VTV9FTlRSSUVTOyBqICs9IGJwLT5yY3ZfYnVmc190b19wb3N0KQorCQkJeworCQkJYnAtPmRlc2NyX2Jsb2NrX3ZpcnQtPnJjdl9kYXRhW2kral0ubG9uZ18wID0gKHUzMikgKFBJX1JDVl9ERVNDUl9NX1NPUCB8CisJCQkJKChQSV9SQ1ZfREFUQV9LX1NJWkVfTUFYIC8gUElfQUxJR05fS19SQ1ZfREFUQV9CVUZGKSA8PCBQSV9SQ1ZfREVTQ1JfVl9TRUdfTEVOKSk7CisJCQlicC0+ZGVzY3JfYmxvY2tfdmlydC0+cmN2X2RhdGFbaStqXS5sb25nXzEgPSAodTMyKSAoYnAtPnJjdl9ibG9ja19waHlzICsgKGkgKiBQSV9SQ1ZfREFUQV9LX1NJWkVfTUFYKSk7CisJCQlicC0+cF9yY3ZfYnVmZl92YVtpK2pdID0gKGNoYXIgKikgKGJwLT5yY3ZfYmxvY2tfdmlydCArIChpICogUElfUkNWX0RBVEFfS19TSVpFX01BWCkpOworCQkJfQorI2VuZGlmCisJfQorCisJLyogVXBkYXRlIHJlY2VpdmUgcHJvZHVjZXIgYW5kIFR5cGUgMiByZWdpc3RlciAqLworCisJYnAtPnJjdl94bXRfcmVnLmluZGV4LnJjdl9wcm9kID0gYnAtPnJjdl9idWZzX3RvX3Bvc3Q7CisJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUElfUERRX0tfUkVHX1RZUEVfMl9QUk9ELCBicC0+cmN2X3htdF9yZWcubHdvcmQpOworCXJldHVybiAwOworCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X3Jjdl9xdWV1ZV9wcm9jZXNzID0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgUHJvY2VzcyByZWNlaXZlZCBMTEMgZnJhbWVzLgorICogIAorICogUmV0dXJuczoKKyAqICAgTm9uZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGJwIC0gcG9pbnRlciB0byBib2FyZCBpbmZvcm1hdGlvbgorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIFJlY2VpdmVkIExMQyBmcmFtZXMgYXJlIHByb2Nlc3NlZCB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZSBjb25zdW1lZCBmcmFtZXMuCisgKiAgIE9uY2UgYWxsIGZyYW1lcyBhcmUgcHJvY2Vzc2VkLCB0aGUgcmVjZWl2ZSBidWZmZXJzIGFyZSByZXR1cm5lZCB0byB0aGUKKyAqICAgYWRhcHRlci4gIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBmaXhlcyB0aGUgbGVuZ3RoIG9mIHRpbWUgdGhhdCBjYW4gYmUgc3BlbnQKKyAqICAgaW4gdGhpcyByb3V0aW5lLCBiZWNhdXNlIHRoZXJlIGFyZSBhIGZpeGVkIG51bWJlciBvZiByZWNlaXZlIGJ1ZmZlcnMgdG8KKyAqICAgcHJvY2VzcyBhbmQgYnVmZmVycyBhcmUgbm90IHByb2R1Y2VkIHVudGlsIHRoaXMgcm91dGluZSBleGl0cyBhbmQgcmV0dXJucworICogICB0byB0aGUgSVNSLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgTm9uZQorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBOb25lCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBOb25lCisgKi8KKworc3RhdGljIHZvaWQgZGZ4X3Jjdl9xdWV1ZV9wcm9jZXNzKAorCURGWF9ib2FyZF90ICpicAorCSkKKworCXsKKwlQSV9UWVBFXzJfQ09OU1VNRVIJKnBfdHlwZV8yX2NvbnM7CQkvKiBwdHIgdG8gcmN2L3htdCBjb25zdW1lciBibG9jayByZWdpc3RlciAqLworCWNoYXIJCQkJKnBfYnVmZjsJCQkvKiBwdHIgdG8gc3RhcnQgb2YgcGFja2V0IHJlY2VpdmUgYnVmZmVyIChGTUMgZGVzY3JpcHRvcikgKi8KKwl1MzIJCQkJCWRlc2NyLCBwa3RfbGVuOwkJLyogRk1DIGRlc2NyaXB0b3IgZmllbGQgYW5kIHBhY2tldCBsZW5ndGggKi8KKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsJCQkJLyogcG9pbnRlciB0byBhIHNrX2J1ZmYgdG8gaG9sZCBpbmNvbWluZyBwYWNrZXQgZGF0YSAqLworCisJLyogU2VydmljZSBhbGwgY29uc3VtZWQgTExDIHJlY2VpdmUgZnJhbWVzICovCisKKwlwX3R5cGVfMl9jb25zID0gKFBJX1RZUEVfMl9DT05TVU1FUiAqKSgmYnAtPmNvbnNfYmxvY2tfdmlydC0+eG10X3Jjdl9kYXRhKTsKKwl3aGlsZSAoYnAtPnJjdl94bXRfcmVnLmluZGV4LnJjdl9jb21wICE9IHBfdHlwZV8yX2NvbnMtPmluZGV4LnJjdl9jb25zKQorCQl7CisJCS8qIFByb2Nlc3MgYW55IGVycm9ycyAqLworCisJCWludCBlbnRyeTsKKworCQllbnRyeSA9IGJwLT5yY3ZfeG10X3JlZy5pbmRleC5yY3ZfY29tcDsKKyNpZmRlZiBEWU5BTUlDX0JVRkZFUlMKKwkJcF9idWZmID0gKGNoYXIgKikgKCgoc3RydWN0IHNrX2J1ZmYgKilicC0+cF9yY3ZfYnVmZl92YVtlbnRyeV0pLT5kYXRhKTsKKyNlbHNlCisJCXBfYnVmZiA9IChjaGFyICopIGJwLT5wX3Jjdl9idWZmX3ZhW2VudHJ5XTsKKyNlbmRpZgorCQltZW1jcHkoJmRlc2NyLCBwX2J1ZmYgKyBSQ1ZfQlVGRl9LX0RFU0NSLCBzaXplb2YodTMyKSk7CisKKwkJaWYgKGRlc2NyICYgUElfRk1DX0RFU0NSX01fUkNDX0ZMVVNIKQorCQkJeworCQkJaWYgKGRlc2NyICYgUElfRk1DX0RFU0NSX01fUkNDX0NSQykKKwkJCQlicC0+cmN2X2NyY19lcnJvcnMrKzsKKwkJCWVsc2UKKwkJCQlicC0+cmN2X2ZyYW1lX3N0YXR1c19lcnJvcnMrKzsKKwkJCX0KKwkJZWxzZQorCQl7CisJCQlpbnQgcnhfaW5fcGxhY2UgPSAwOworCisJCQkvKiBUaGUgZnJhbWUgd2FzIHJlY2VpdmVkIHdpdGhvdXQgZXJyb3JzIC0gdmVyaWZ5IHBhY2tldCBsZW5ndGggKi8KKworCQkJcGt0X2xlbiA9ICh1MzIpKChkZXNjciAmIFBJX0ZNQ19ERVNDUl9NX0xFTikgPj4gUElfRk1DX0RFU0NSX1ZfTEVOKTsKKwkJCXBrdF9sZW4gLT0gNDsJCQkJLyogc3VidHJhY3QgNCBieXRlIENSQyAqLworCQkJaWYgKCFJTl9SQU5HRShwa3RfbGVuLCBGRERJX0tfTExDX1pMRU4sIEZERElfS19MTENfTEVOKSkKKwkJCQlicC0+cmN2X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWVsc2V7CisjaWZkZWYgRFlOQU1JQ19CVUZGRVJTCisJCQkJaWYgKHBrdF9sZW4gPiBTS0JVRkZfUlhfQ09QWUJSRUFLKSB7CisJCQkJCXN0cnVjdCBza19idWZmICpuZXdza2I7CisKKwkJCQkJbmV3c2tiID0gZGV2X2FsbG9jX3NrYihORVdfU0tCX1NJWkUpOworCQkJCQlpZiAobmV3c2tiKXsKKwkJCQkJCXJ4X2luX3BsYWNlID0gMTsKKwkJCQkJCQorCQkJCQkJbXlfc2tiX2FsaWduKG5ld3NrYiwgMTI4KTsKKwkJCQkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKWJwLT5wX3Jjdl9idWZmX3ZhW2VudHJ5XTsKKwkJCQkJCXBjaV91bm1hcF9zaW5nbGUoYnAtPnBjaV9kZXYsCisJCQkJCQkJYnAtPmRlc2NyX2Jsb2NrX3ZpcnQtPnJjdl9kYXRhW2VudHJ5XS5sb25nXzEsCisJCQkJCQkJTkVXX1NLQl9TSVpFLAorCQkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJCQlza2JfcmVzZXJ2ZShza2IsIFJDVl9CVUZGX0tfUEFERElORyk7CisJCQkJCQlicC0+cF9yY3ZfYnVmZl92YVtlbnRyeV0gPSAoY2hhciAqKW5ld3NrYjsKKwkJCQkJCWJwLT5kZXNjcl9ibG9ja192aXJ0LT5yY3ZfZGF0YVtlbnRyeV0ubG9uZ18xID0KKwkJCQkJCQkodTMyKXBjaV9tYXBfc2luZ2xlKGJwLT5wY2lfZGV2LAorCQkJCQkJCQluZXdza2ItPmRhdGEsCisJCQkJCQkJCU5FV19TS0JfU0laRSwKKwkJCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQkJfSBlbHNlCisJCQkJCQlza2IgPSBOVUxMOworCQkJCX0gZWxzZQorI2VuZGlmCisJCQkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiszKTsJLyogYWxsb2MgbmV3IGJ1ZmZlciB0byBwYXNzIHVwLCBhZGQgcm9vbSBmb3IgUFJIICovCisJCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCQl7CisJCQkJCXByaW50aygiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSByZWNlaXZlIGJ1ZmZlci4gIERyb3BwaW5nIHBhY2tldC5cbiIsIGJwLT5kZXYtPm5hbWUpOworCQkJCQlicC0+cmN2X2Rpc2NhcmRzKys7CisJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJZWxzZSB7CisjaWZuZGVmIERZTkFNSUNfQlVGRkVSUworCQkJCQlpZiAoISByeF9pbl9wbGFjZSkKKyNlbmRpZgorCQkJCQl7CisJCQkJCQkvKiBSZWNlaXZlIGJ1ZmZlciBhbGxvY2F0ZWQsIHBhc3MgcmVjZWl2ZSBwYWNrZXQgdXAgKi8KKworCQkJCQkJbWVtY3B5KHNrYi0+ZGF0YSwgcF9idWZmICsgUkNWX0JVRkZfS19QQURESU5HLCBwa3RfbGVuKzMpOworCQkJCQl9CisJCQkJCQorCQkJCQlza2JfcmVzZXJ2ZShza2IsMyk7CQkvKiBhZGp1c3QgZGF0YSBmaWVsZCBzbyB0aGF0IGl0IHBvaW50cyB0byBGQyBieXRlICovCisJCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsJCS8qIHBhc3MgdXAgcGFja2V0IGxlbmd0aCwgTk9UIGluY2x1ZGluZyBDUkMgKi8KKwkJCQkJc2tiLT5kZXYgPSBicC0+ZGV2OwkJLyogcGFzcyB1cCBkZXZpY2UgcG9pbnRlciAqLworCisJCQkJCXNrYi0+cHJvdG9jb2wgPSBmZGRpX3R5cGVfdHJhbnMoc2tiLCBicC0+ZGV2KTsKKwkJCQkJYnAtPnJjdl90b3RhbF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCQkJbmV0aWZfcngoc2tiKTsKKworCQkJCQkvKiBVcGRhdGUgdGhlIHJjdiBjb3VudGVycyAqLworCQkJCQlicC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQkJYnAtPnJjdl90b3RhbF9mcmFtZXMrKzsKKwkJCQkJaWYgKCoocF9idWZmICsgUkNWX0JVRkZfS19EQSkgJiAweDAxKQorCQkJCQkJYnAtPnJjdl9tdWx0aWNhc3RfZnJhbWVzKys7CisJCQkJfQorCQkJfQorCQkJfQorCisJCS8qCisJCSAqIEFkdmFuY2UgdGhlIHByb2R1Y2VyIChmb3IgcmVjeWNsaW5nKSBhbmQgYWR2YW5jZSB0aGUgY29tcGxldGlvbgorCQkgKiAoZm9yIHNlcnZpY2luZyByZWNlaXZlZCBmcmFtZXMpLiAgTm90ZSB0aGF0IGl0IGlzIG9rYXkgdG8KKwkJICogYWR2YW5jZSB0aGUgcHJvZHVjZXIgd2l0aG91dCBjaGVja2luZyB0aGF0IGl0IHBhc3NlcyB0aGUKKwkJICogY29tcGxldGlvbiBpbmRleCBiZWNhdXNlIHRoZXkgYXJlIGJvdGggYWR2YW5jZWQgYXQgdGhlIHNhbWUKKwkJICogcmF0ZS4KKwkJICovCisKKwkJYnAtPnJjdl94bXRfcmVnLmluZGV4LnJjdl9wcm9kICs9IDE7CisJCWJwLT5yY3ZfeG10X3JlZy5pbmRleC5yY3ZfY29tcCArPSAxOworCQl9CisJfQorCisMCisvKgorICogPT09PT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF94bXRfcXVldWVfcGt0ID0KKyAqID09PT09PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBRdWV1ZXMgcGFja2V0cyBmb3IgdHJhbnNtaXNzaW9uCisgKiAgCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIHNrYiAtIHBvaW50ZXIgdG8gc2tfYnVmZiB0byBxdWV1ZSBmb3IgdHJhbnNtaXNzaW9uCisgKiAgIGRldiAtIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgSGVyZSB3ZSBhc3N1bWUgdGhhdCBhbiBpbmNvbWluZyBza2IgdHJhbnNtaXQgcmVxdWVzdAorICogICBpcyBjb250YWluZWQgaW4gYSBzaW5nbGUgcGh5c2ljYWxseSBjb250aWd1b3VzIGJ1ZmZlcgorICogICBpbiB3aGljaCB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiBwYWNrZXQKKyAqICAgKHNrYi0+ZGF0YSkgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHBoeXNpY2FsIGFkZHJlc3MKKyAqICAgYnkgdXNpbmcgcGNpX21hcF9zaW5nbGUoKS4KKyAqCisgKiAgIFNpbmNlIHRoZSBhZGFwdGVyIGFyY2hpdGVjdHVyZSByZXF1aXJlcyBhIHRocmVlIGJ5dGUKKyAqICAgcGFja2V0IHJlcXVlc3QgaGVhZGVyIHRvIHByZXBlbmQgdGhlIHN0YXJ0IG9mIHBhY2tldCwKKyAqICAgd2UnbGwgd3JpdGUgdGhlIHRocmVlIGJ5dGUgZmllbGQgaW1tZWRpYXRlbHkgcHJpb3IgdG8KKyAqICAgdGhlIEZDIGJ5dGUuICBUaGlzIGFzc3VtcHRpb24gaXMgdmFsaWQgYmVjYXVzZSB3ZSd2ZQorICogICBlbnN1cmVkIHRoYXQgZGV2LT5oYXJkX2hlYWRlcl9sZW4gaW5jbHVkZXMgdGhyZWUgcGFkCisgKiAgIGJ5dGVzLiAgQnkgcG9zdGluZyBhIHNpbmdsZSBmcmFnbWVudCB0byB0aGUgYWRhcHRlciwKKyAqICAgd2UnbGwgcmVkdWNlIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvciBmZXRjaGVzIGFuZAorICogICBidXMgdHJhZmZpYyBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdC4KKyAqCisgKiAgIEFsc28sIHdlIGNhbid0IGZyZWUgdGhlIHNrYiB1bnRpbCBhZnRlciBpdCdzIGJlZW4gRE1BJ2QKKyAqICAgb3V0IGJ5IHRoZSBhZGFwdGVyLCBzbyB3ZSdsbCBxdWV1ZSBpdCBpbiB0aGUgZHJpdmVyIGFuZAorICogICByZXR1cm4gaXQgaW4gZGZ4X3htdF9kb25lLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgMCAtIGRyaXZlciBxdWV1ZWQgcGFja2V0LCBsaW5rIGlzIHVuYXZhaWxhYmxlLCBvciBza2J1ZmYgd2FzIGJhZAorICoJIDEgLSBjYWxsZXIgc2hvdWxkIHJlcXVldWUgdGhlIHNrX2J1ZmYgZm9yIGxhdGVyIHRyYW5zbWlzc2lvbgorICoKKyAqIEFzc3VtcHRpb25zOgorICoJIEZpcnN0IGFuZCBmb3JlbW9zdCwgd2UgYXNzdW1lIHRoZSBpbmNvbWluZyBza2IgcG9pbnRlcgorICogICBpcyBOT1QgTlVMTCBhbmQgaXMgcG9pbnRpbmcgdG8gYSB2YWxpZCBza19idWZmIHN0cnVjdHVyZS4KKyAqCisgKiAgIFRoZSBvdXRnb2luZyBwYWNrZXQgaXMgY29tcGxldGUsIHN0YXJ0aW5nIHdpdGggdGhlCisgKiAgIGZyYW1lIGNvbnRyb2wgYnl0ZSBpbmNsdWRpbmcgdGhlIGxhc3QgYnl0ZSBvZiBkYXRhLAorICogICBidXQgTk9UIGluY2x1ZGluZyB0aGUgNCBieXRlIENSQy4gIFdlJ2xsIGxldCB0aGUKKyAqICAgYWRhcHRlciBoYXJkd2FyZSBnZW5lcmF0ZSBhbmQgYXBwZW5kIHRoZSBDUkMuCisgKgorICogICBUaGUgZW50aXJlIHBhY2tldCBpcyBzdG9yZWQgaW4gb25lIHBoeXNpY2FsbHkKKyAqICAgY29udGlndW91cyBidWZmZXIgd2hpY2ggaXMgbm90IGNhY2hlZCBhbmQgd2hvc2UKKyAqICAgMzItYml0IHBoeXNpY2FsIGFkZHJlc3MgY2FuIGJlIGRldGVybWluZWQuCisgKgorICogICBJdCdzIHZpdGFsIHRoYXQgdGhpcyByb3V0aW5lIGlzIE5PVCByZWVudGVyZWQgZm9yIHRoZQorICogICBzYW1lIGJvYXJkIGFuZCB0aGF0IHRoZSBPUyBpcyBub3QgaW4gYW5vdGhlciBzZWN0aW9uIG9mCisgKiAgIGNvZGUgKGVnLiBkZnhfaW50X2NvbW1vbikgZm9yIHRoZSBzYW1lIGJvYXJkIG9uIGEKKyAqICAgZGlmZmVyZW50IHRocmVhZC4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIE5vbmUKKyAqLworCitzdGF0aWMgaW50IGRmeF94bXRfcXVldWVfcGt0KAorCXN0cnVjdCBza19idWZmCSpza2IsCisJc3RydWN0IG5ldF9kZXZpY2UJKmRldgorCSkKKworCXsKKwlERlhfYm9hcmRfdAkJKmJwID0gZGV2LT5wcml2OworCXU4CQkJcHJvZDsJCQkJLyogbG9jYWwgdHJhbnNtaXQgcHJvZHVjZXIgaW5kZXggKi8KKwlQSV9YTVRfREVTQ1IJCSpwX3htdF9kZXNjcjsJCS8qIHB0ciB0byB0cmFuc21pdCBkZXNjcmlwdG9yIGJsb2NrIGVudHJ5ICovCisJWE1UX0RSSVZFUl9ERVNDUgkqcF94bXRfZHJ2X2Rlc2NyOwkvKiBwdHIgdG8gdHJhbnNtaXQgZHJpdmVyIGRlc2NyaXB0b3IgKi8KKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKgorCSAqIFZlcmlmeSB0aGF0IGluY29taW5nIHRyYW5zbWl0IHJlcXVlc3QgaXMgT0sKKwkgKgorCSAqIE5vdGU6IFRoZSBwYWNrZXQgc2l6ZSBjaGVjayBpcyBjb25zaXN0ZW50IHdpdGggb3RoZXIKKwkgKgkJIExpbnV4IGRldmljZSBkcml2ZXJzLCBhbHRob3VnaCB0aGUgY29ycmVjdCBwYWNrZXQKKwkgKgkJIHNpemUgc2hvdWxkIGJlIHZlcmlmaWVkIGJlZm9yZSBjYWxsaW5nIHRoZQorCSAqCQkgdHJhbnNtaXQgcm91dGluZS4KKwkgKi8KKworCWlmICghSU5fUkFOR0Uoc2tiLT5sZW4sIEZERElfS19MTENfWkxFTiwgRkRESV9LX0xMQ19MRU4pKQorCXsKKwkJcHJpbnRrKCIlczogSW52YWxpZCBwYWNrZXQgbGVuZ3RoIC0gJXUgYnl0ZXNcbiIsIAorCQkJZGV2LT5uYW1lLCBza2ItPmxlbik7CisJCWJwLT54bXRfbGVuZ3RoX2Vycm9ycysrOwkJLyogYnVtcCBlcnJvciBjb3VudGVyICovCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4oMCk7CQkJCS8qIHJldHVybiAic3VjY2VzcyIgKi8KKwl9CisJLyoKKwkgKiBTZWUgaWYgYWRhcHRlciBsaW5rIGlzIGF2YWlsYWJsZSwgaWYgbm90LCBmcmVlIGJ1ZmZlcgorCSAqCisJICogTm90ZTogSWYgdGhlIGxpbmsgaXNuJ3QgYXZhaWxhYmxlLCBmcmVlIGJ1ZmZlciBhbmQgcmV0dXJuIDAKKwkgKgkJIHJhdGhlciB0aGFuIHRlbGwgdGhlIHVwcGVyIGxheWVyIHRvIHJlcXVldWUgdGhlIHBhY2tldC4KKwkgKgkJIFRoZSBtZXRob2RvbG9neSBoZXJlIGlzIHRoYXQgYnkgdGhlIHRpbWUgdGhlIGxpbmsKKwkgKgkJIGJlY29tZXMgYXZhaWxhYmxlLCB0aGUgcGFja2V0IHRvIGJlIHNlbnQgd2lsbCBiZQorCSAqCQkgZmFpcmx5IHN0YWxlLiAgQnkgc2ltcGx5IGRyb3BwaW5nIHRoZSBwYWNrZXQsIHRoZQorCSAqCQkgaGlnaGVyIGxheWVyIHByb3RvY29scyB3aWxsIGV2ZW50dWFsbHkgdGltZSBvdXQKKwkgKgkJIHdhaXRpbmcgZm9yIHJlc3BvbnNlIHBhY2tldHMgd2hpY2ggaXQgd29uJ3QgcmVjZWl2ZS4KKwkgKi8KKworCWlmIChicC0+bGlua19hdmFpbGFibGUgPT0gUElfS19GQUxTRSkKKwkJeworCQlpZiAoZGZ4X2h3X2FkYXBfc3RhdGVfcmQoYnApID09IFBJX1NUQVRFX0tfTElOS19BVkFJTCkJLyogaXMgbGluayByZWFsbHkgYXZhaWxhYmxlPyAqLworCQkJYnAtPmxpbmtfYXZhaWxhYmxlID0gUElfS19UUlVFOwkJLyogaWYgc28sIHNldCBmbGFnIGFuZCBjb250aW51ZSAqLworCQllbHNlCisJCQl7CisJCQlicC0+eG10X2Rpc2NhcmRzKys7CQkJCQkvKiBidW1wIGVycm9yIGNvdW50ZXIgKi8KKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsJCS8qIGZyZWUgc2tfYnVmZiBub3cgKi8KKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCXJldHVybigwKTsJCQkJCQkJLyogcmV0dXJuICJzdWNjZXNzIiAqLworCQkJfQorCQl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBHZXQgdGhlIGN1cnJlbnQgcHJvZHVjZXIgYW5kIHRoZSBuZXh0IGZyZWUgeG10IGRhdGEgZGVzY3JpcHRvciAqLworCisJcHJvZAkJPSBicC0+cmN2X3htdF9yZWcuaW5kZXgueG10X3Byb2Q7CisJcF94bXRfZGVzY3IgPSAmKGJwLT5kZXNjcl9ibG9ja192aXJ0LT54bXRfZGF0YVtwcm9kXSk7CisKKwkvKgorCSAqIEdldCBwb2ludGVyIHRvIGF1eGlsaWFyeSBxdWV1ZSBlbnRyeSB0byBjb250YWluIGluZm9ybWF0aW9uCisJICogZm9yIHRoaXMgcGFja2V0LgorCSAqCisJICogTm90ZTogVGhlIGN1cnJlbnQgeG10IHByb2R1Y2VyIGluZGV4IHdpbGwgYmVjb21lIHRoZQorCSAqCSBjdXJyZW50IHhtdCBjb21wbGV0aW9uIGluZGV4IHdoZW4gd2UgY29tcGxldGUgdGhpcworCSAqCSBwYWNrZXQgbGF0ZXIgb24uICBTbywgd2UnbGwgZ2V0IHRoZSBwb2ludGVyIHRvIHRoZQorCSAqCSBuZXh0IGF1eGlsaWFyeSBxdWV1ZSBlbnRyeSBub3cgYmVmb3JlIHdlIGJ1bXAgdGhlCisJICoJIHByb2R1Y2VyIGluZGV4LgorCSAqLworCisJcF94bXRfZHJ2X2Rlc2NyID0gJihicC0+eG10X2Rydl9kZXNjcl9ibGtbcHJvZCsrXSk7CS8qIGFsc28gYnVtcCBwcm9kdWNlciBpbmRleCAqLworCisJLyogV3JpdGUgdGhlIHRocmVlIFBSSCBieXRlcyBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIEZDIGJ5dGUgKi8KKworCXNrYl9wdXNoKHNrYiwzKTsKKwlza2ItPmRhdGFbMF0gPSBERlhfUFJIMF9CWVRFOwkvKiB0aGVzZSBieXRlIHZhbHVlcyBhcmUgZGVmaW5lZCAqLworCXNrYi0+ZGF0YVsxXSA9IERGWF9QUkgxX0JZVEU7CS8qIGluIHRoZSBNb3Rvcm9sYSBGRERJIE1BQyBjaGlwICovCisJc2tiLT5kYXRhWzJdID0gREZYX1BSSDJfQllURTsJLyogc3BlY2lmaWNhdGlvbiAqLworCisJLyoKKwkgKiBXcml0ZSB0aGUgZGVzY3JpcHRvciB3aXRoIGJ1ZmZlciBpbmZvIGFuZCBidW1wIHByb2R1Y2VyCisJICoKKwkgKiBOb3RlOiBTaW5jZSB3ZSBuZWVkIHRvIHN0YXJ0IERNQSBmcm9tIHRoZSBwYWNrZXQgcmVxdWVzdAorCSAqCQkgaGVhZGVyLCB3ZSdsbCBhZGQgMyBieXRlcyB0byB0aGUgRE1BIGJ1ZmZlciBsZW5ndGgsCisJICoJCSBhbmQgd2UnbGwgZGV0ZXJtaW5lIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZQorCSAqCQkgYnVmZmVyIGZyb20gdGhlIFBSSCwgbm90IHNrYi0+ZGF0YS4KKwkgKgorCSAqIEFzc3VtcHRpb25zOgorCSAqCQkgMS4gUGFja2V0IHN0YXJ0cyB3aXRoIHRoZSBmcmFtZSBjb250cm9sIChGQykgYnl0ZQorCSAqCQkgICAgYXQgc2tiLT5kYXRhLgorCSAqCQkgMi4gVGhlIDQtYnl0ZSBDUkMgaXMgbm90IGFwcGVuZGVkIHRvIHRoZSBidWZmZXIgb3IKKwkgKgkJCWluY2x1ZGVkIGluIHRoZSBsZW5ndGguCisJICoJCSAzLiBQYWNrZXQgbGVuZ3RoIChza2ItPmxlbikgaXMgZnJvbSBGQyB0byBlbmQgb2YKKwkgKgkJCWRhdGEsIGluY2x1c2l2ZS4KKwkgKgkJIDQuIFRoZSBwYWNrZXQgbGVuZ3RoIGRvZXMgbm90IGV4Y2VlZCB0aGUgbWF4aW11bQorCSAqCQkJRkRESSBMTEMgZnJhbWUgbGVuZ3RoIG9mIDQ0OTEgYnl0ZXMuCisJICoJCSA1LiBUaGUgZW50aXJlIHBhY2tldCBpcyBjb250YWluZWQgaW4gYSBwaHlzaWNhbGx5CisJICoJCQljb250aWd1b3VzLCBub24tY2FjaGVkLCBsb2NrZWQgbWVtb3J5IHNwYWNlCisJICoJCQljb21wcmlzZWQgb2YgYSBzaW5nbGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkKKwkgKgkJCXNrYi0+ZGF0YS4KKwkgKgkJIDYuIFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiBwYWNrZXQKKwkgKgkJCWNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIHZpcnR1YWwgYWRkcmVzcworCSAqCQkJYnkgdXNpbmcgcGNpX21hcF9zaW5nbGUoKSBhbmQgaXMgb25seSAzMi1iaXRzCisJICoJCQl3aWRlLgorCSAqLworCisJcF94bXRfZGVzY3ItPmxvbmdfMAk9ICh1MzIpIChQSV9YTVRfREVTQ1JfTV9TT1AgfCBQSV9YTVRfREVTQ1JfTV9FT1AgfCAoKHNrYi0+bGVuKSA8PCBQSV9YTVRfREVTQ1JfVl9TRUdfTEVOKSk7CisJcF94bXRfZGVzY3ItPmxvbmdfMSA9ICh1MzIpcGNpX21hcF9zaW5nbGUoYnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKKwkJCQkJCSAgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJLyoKKwkgKiBWZXJpZnkgdGhhdCBkZXNjcmlwdG9yIGlzIGFjdHVhbGx5IGF2YWlsYWJsZQorCSAqCisJICogTm90ZTogSWYgZGVzY3JpcHRvciBpc24ndCBhdmFpbGFibGUsIHJldHVybiAxIHdoaWNoIHRlbGxzCisJICoJIHRoZSB1cHBlciBsYXllciB0byByZXF1ZXVlIHRoZSBwYWNrZXQgZm9yIGxhdGVyCisJICoJIHRyYW5zbWlzc2lvbi4KKwkgKgorCSAqICAgICAgIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIHByb2R1Y2VyIG5ldmVyIHJlYWNoZXMgdGhlCisJICoJIGNvbXBsZXRpb24sIGV4Y2VwdCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBxdWV1ZSBpcyBlbXB0eS4KKwkgKi8KKworCWlmIChwcm9kID09IGJwLT5yY3ZfeG10X3JlZy5pbmRleC54bXRfY29tcCkKKwl7CisJCXNrYl9wdWxsKHNrYiwzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuKDEpOwkJCS8qIHJlcXVldWUgcGFja2V0IGZvciBsYXRlciAqLworCX0KKworCS8qCisJICogU2F2ZSBpbmZvIGZvciB0aGlzIHBhY2tldCBmb3IgeG10IGRvbmUgaW5kaWNhdGlvbiByb3V0aW5lCisJICoKKwkgKiBOb3JtYWxseSwgd2UnZCBzYXZlIHRoZSBwcm9kdWNlciBpbmRleCBpbiB0aGUgcF94bXRfZHJ2X2Rlc2NyCisJICogc3RydWN0dXJlIHNvIHRoYXQgd2UnZCBoYXZlIGl0IGhhbmR5IHdoZW4gd2UgY29tcGxldGUgdGhpcworCSAqIHBhY2tldCBsYXRlciAoaW4gZGZ4X3htdF9kb25lKS4gIEhvd2V2ZXIsIHNpbmNlIHRoZSBjdXJyZW50CisJICogdHJhbnNtaXQgYXJjaGl0ZWN0dXJlIGd1YXJhbnRlZXMgYSBzaW5nbGUgZnJhZ21lbnQgZm9yIHRoZQorCSAqIGVudGlyZSBwYWNrZXQsIHdlIGNhbiBzaW1wbHkgYnVtcCB0aGUgY29tcGxldGlvbiBpbmRleCBieQorCSAqIG9uZSAoMSkgZm9yIGVhY2ggY29tcGxldGVkIHBhY2tldC4KKwkgKgorCSAqIE5vdGU6IElmIHRoaXMgYXNzdW1wdGlvbiBjaGFuZ2VzIGFuZCB3ZSdyZSBwcmVzZW50ZWQgd2l0aAorCSAqCSBhbiBpbmNvbnNpc3RlbnQgbnVtYmVyIG9mIHRyYW5zbWl0IGZyYWdtZW50cyBmb3IgcGFja2V0CisJICoJIGRhdGEsIHdlJ2xsIG5lZWQgdG8gbW9kaWZ5IHRoaXMgY29kZSB0byBzYXZlIHRoZSBjdXJyZW50CisJICoJIHRyYW5zbWl0IHByb2R1Y2VyIGluZGV4LgorCSAqLworCisJcF94bXRfZHJ2X2Rlc2NyLT5wX3NrYiA9IHNrYjsKKworCS8qIFVwZGF0ZSBUeXBlIDIgcmVnaXN0ZXIgKi8KKworCWJwLT5yY3ZfeG10X3JlZy5pbmRleC54bXRfcHJvZCA9IHByb2Q7CisJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUElfUERRX0tfUkVHX1RZUEVfMl9QUk9ELCBicC0+cmN2X3htdF9yZWcubHdvcmQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybigwKTsJCQkJCQkJLyogcGFja2V0IHF1ZXVlZCB0byBhZGFwdGVyICovCisJfQorCisMCisvKgorICogPT09PT09PT09PT09PT09PQorICogPSBkZnhfeG10X2RvbmUgPQorICogPT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBQcm9jZXNzZXMgYWxsIGZyYW1lcyB0aGF0IGhhdmUgYmVlbiB0cmFuc21pdHRlZC4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBicCAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBGb3IgYWxsIGNvbnN1bWVkIHRyYW5zbWl0IGRlc2NyaXB0b3JzIHRoYXQgaGF2ZSBub3QKKyAqICAgeWV0IGJlZW4gY29tcGxldGVkLCB3ZSdsbCBmcmVlIHRoZSBza2Igd2Ugd2VyZSBob2xkaW5nCisgKiAgIG9udG8gdXNpbmcgZGV2X2tmcmVlX3NrYiBhbmQgYnVtcCB0aGUgYXBwcm9wcmlhdGUKKyAqICAgY291bnRlcnMuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBOb25lCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIFRoZSBUeXBlIDIgcmVnaXN0ZXIgaXMgbm90IHVwZGF0ZWQgaW4gdGhpcyByb3V0aW5lLiAgSXQgaXMKKyAqICAgYXNzdW1lZCB0aGF0IGl0IHdpbGwgYmUgdXBkYXRlZCBpbiB0aGUgSVNSIHdoZW4gZGZ4X3htdF9kb25lCisgKiAgIHJldHVybnMuCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBOb25lCisgKi8KKworc3RhdGljIGludCBkZnhfeG10X2RvbmUoREZYX2JvYXJkX3QgKmJwKQorCXsKKwlYTVRfRFJJVkVSX0RFU0NSCSpwX3htdF9kcnZfZGVzY3I7CS8qIHB0ciB0byB0cmFuc21pdCBkcml2ZXIgZGVzY3JpcHRvciAqLworCVBJX1RZUEVfMl9DT05TVU1FUgkqcF90eXBlXzJfY29uczsJCS8qIHB0ciB0byByY3YveG10IGNvbnN1bWVyIGJsb2NrIHJlZ2lzdGVyICovCisJdTgJCQljb21wOwkJCS8qIGxvY2FsIHRyYW5zbWl0IGNvbXBsZXRpb24gaW5kZXggKi8KKwlpbnQgCQkJZnJlZWQgPSAwOwkJLyogYnVmZmVycyBmcmVlZCAqLworCisJLyogU2VydmljZSBhbGwgY29uc3VtZWQgdHJhbnNtaXQgZnJhbWVzICovCisKKwlwX3R5cGVfMl9jb25zID0gKFBJX1RZUEVfMl9DT05TVU1FUiAqKSgmYnAtPmNvbnNfYmxvY2tfdmlydC0+eG10X3Jjdl9kYXRhKTsKKwl3aGlsZSAoYnAtPnJjdl94bXRfcmVnLmluZGV4LnhtdF9jb21wICE9IHBfdHlwZV8yX2NvbnMtPmluZGV4LnhtdF9jb25zKQorCQl7CisJCS8qIEdldCBwb2ludGVyIHRvIHRoZSB0cmFuc21pdCBkcml2ZXIgZGVzY3JpcHRvciBibG9jayBpbmZvcm1hdGlvbiAqLworCisJCXBfeG10X2Rydl9kZXNjciA9ICYoYnAtPnhtdF9kcnZfZGVzY3JfYmxrW2JwLT5yY3ZfeG10X3JlZy5pbmRleC54bXRfY29tcF0pOworCisJCS8qIEluY3JlbWVudCB0cmFuc21pdCBjb3VudGVycyAqLworCisJCWJwLT54bXRfdG90YWxfZnJhbWVzKys7CisJCWJwLT54bXRfdG90YWxfYnl0ZXMgKz0gcF94bXRfZHJ2X2Rlc2NyLT5wX3NrYi0+bGVuOworCisJCS8qIFJldHVybiBza2IgdG8gb3BlcmF0aW5nIHN5c3RlbSAqLworCQljb21wID0gYnAtPnJjdl94bXRfcmVnLmluZGV4LnhtdF9jb21wOworCQlwY2lfdW5tYXBfc2luZ2xlKGJwLT5wY2lfZGV2LAorCQkJCSBicC0+ZGVzY3JfYmxvY2tfdmlydC0+eG10X2RhdGFbY29tcF0ubG9uZ18xLAorCQkJCSBwX3htdF9kcnZfZGVzY3ItPnBfc2tiLT5sZW4sCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiX2lycShwX3htdF9kcnZfZGVzY3ItPnBfc2tiKTsKKworCQkvKgorCQkgKiBNb3ZlIHRvIHN0YXJ0IG9mIG5leHQgcGFja2V0IGJ5IHVwZGF0aW5nIGNvbXBsZXRpb24gaW5kZXgKKwkJICoKKwkJICogSGVyZSB3ZSBhc3N1bWUgdGhhdCBhIHRyYW5zbWl0IHBhY2tldCByZXF1ZXN0IGlzIGFsd2F5cworCQkgKiBzZXJ2aWNlZCBieSBwb3N0aW5nIG9uZSBmcmFnbWVudC4gIFdlIGNhbiB0aGVyZWZvcmUKKwkJICogc2ltcGxpZnkgdGhlIGNvbXBsZXRpb24gY29kZSBieSBpbmNyZW1lbnRpbmcgdGhlCisJCSAqIGNvbXBsZXRpb24gaW5kZXggYnkgb25lLiAgVGhpcyBjb2RlIHdpbGwgbmVlZCB0byBiZQorCQkgKiBtb2RpZmllZCBpZiB0aGlzIGFzc3VtcHRpb24gY2hhbmdlcy4gIFNlZSBjb21tZW50cworCQkgKiBpbiBkZnhfeG10X3F1ZXVlX3BrdCBmb3IgbW9yZSBkZXRhaWxzLgorCQkgKi8KKworCQlicC0+cmN2X3htdF9yZWcuaW5kZXgueG10X2NvbXAgKz0gMTsKKwkJZnJlZWQrKzsKKwkJfQorCXJldHVybiBmcmVlZDsKKwl9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09PQorICogPSBkZnhfcmN2X2ZsdXNoID0KKyAqID09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIFJlbW92ZSBhbGwgc2tiJ3MgaW4gdGhlIHJlY2VpdmUgcmluZy4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBicCAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBGcmVlJ3MgYWxsIHRoZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc2tiJ3MgdGhhdCBhcmUKKyAqICAgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoZSBkZXZpY2UgcmVjZWl2ZSByaW5nLiBUaGlzCisgKiAgIGZ1bmN0aW9uIGlzIHR5cGljYWxseSBvbmx5IHVzZWQgd2hlbiB0aGUgZGV2aWNlIGlzCisgKiAgIGluaXRpYWxpemVkIG9yIHJlaW5pdGlhbGl6ZWQuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBOb25lCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBOb25lCisgKi8KKyNpZmRlZiBEWU5BTUlDX0JVRkZFUlMKK3N0YXRpYyB2b2lkIGRmeF9yY3ZfZmx1c2goIERGWF9ib2FyZF90ICpicCApCisJeworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IChpbnQpKGJwLT5yY3ZfYnVmc190b19wb3N0KTsgaSsrKQorCQlmb3IgKGogPSAwOyAoaSArIGopIDwgKGludClQSV9SQ1ZfREFUQV9LX05VTV9FTlRSSUVTOyBqICs9IGJwLT5yY3ZfYnVmc190b19wb3N0KQorCQl7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopYnAtPnBfcmN2X2J1ZmZfdmFbaStqXTsKKwkJCWlmIChza2IpCisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJYnAtPnBfcmN2X2J1ZmZfdmFbaStqXSA9IE5VTEw7CisJCX0KKworCX0KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZGZ4X3Jjdl9mbHVzaCggREZYX2JvYXJkX3QgKmJwICkKK3sKK30KKyNlbmRpZiAvKiBEWU5BTUlDX0JVRkZFUlMgKi8KKworLyoKKyAqID09PT09PT09PT09PT09PT09CisgKiA9IGRmeF94bXRfZmx1c2ggPQorICogPT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgUHJvY2Vzc2VzIGFsbCBmcmFtZXMgd2hldGhlciB0aGV5J3ZlIGJlZW4gdHJhbnNtaXR0ZWQKKyAqICAgb3Igbm90LgorICogIAorICogUmV0dXJuczoKKyAqICAgTm9uZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGJwIC0gcG9pbnRlciB0byBib2FyZCBpbmZvcm1hdGlvbgorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIEZvciBhbGwgcHJvZHVjZWQgdHJhbnNtaXQgZGVzY3JpcHRvcnMgdGhhdCBoYXZlIG5vdAorICogICB5ZXQgYmVlbiBjb21wbGV0ZWQsIHdlJ2xsIGZyZWUgdGhlIHNrYiB3ZSB3ZXJlIGhvbGRpbmcKKyAqICAgb250byB1c2luZyBkZXZfa2ZyZWVfc2tiIGFuZCBidW1wIHRoZSBhcHByb3ByaWF0ZQorICogICBjb3VudGVycy4gIE9mIGNvdXJzZSwgaXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgb2YKKyAqICAgdGhlc2UgdHJhbnNtaXQgcmVxdWVzdHMgYWN0dWFsbHkgZGlkIGdvIG91dCwgYnV0IHdlCisgKiAgIHdvbid0IG1ha2UgdGhhdCBkaXN0aW5jdGlvbiBoZXJlLiAgRmluYWxseSwgd2UnbGwKKyAqICAgdXBkYXRlIHRoZSBjb25zdW1lciBpbmRleCB0byBtYXRjaCB0aGUgcHJvZHVjZXIuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBOb25lCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIFRoaXMgcm91dGluZSBkb2VzIE5PVCB1cGRhdGUgdGhlIFR5cGUgMiByZWdpc3Rlci4gIEl0CisgKiAgIGlzIGFzc3VtZWQgdGhhdCB0aGlzIHJvdXRpbmUgaXMgYmVpbmcgY2FsbGVkIGR1cmluZyBhCisgKiAgIHRyYW5zbWl0IGZsdXNoIGludGVycnVwdCwgb3IgYSBzaHV0ZG93biBvciBjbG9zZSByb3V0aW5lLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgTm9uZQorICovCisKK3N0YXRpYyB2b2lkIGRmeF94bXRfZmx1c2goIERGWF9ib2FyZF90ICpicCApCisJeworCXUzMgkJCXByb2RfY29uczsJCS8qIHJjdi94bXQgY29uc3VtZXIgYmxvY2sgbG9uZ3dvcmQgKi8KKwlYTVRfRFJJVkVSX0RFU0NSCSpwX3htdF9kcnZfZGVzY3I7CS8qIHB0ciB0byB0cmFuc21pdCBkcml2ZXIgZGVzY3JpcHRvciAqLworCXU4CQkJY29tcDsJCQkvKiBsb2NhbCB0cmFuc21pdCBjb21wbGV0aW9uIGluZGV4ICovCisKKwkvKiBGbHVzaCBhbGwgb3V0c3RhbmRpbmcgdHJhbnNtaXQgZnJhbWVzICovCisKKwl3aGlsZSAoYnAtPnJjdl94bXRfcmVnLmluZGV4LnhtdF9jb21wICE9IGJwLT5yY3ZfeG10X3JlZy5pbmRleC54bXRfcHJvZCkKKwkJeworCQkvKiBHZXQgcG9pbnRlciB0byB0aGUgdHJhbnNtaXQgZHJpdmVyIGRlc2NyaXB0b3IgYmxvY2sgaW5mb3JtYXRpb24gKi8KKworCQlwX3htdF9kcnZfZGVzY3IgPSAmKGJwLT54bXRfZHJ2X2Rlc2NyX2Jsa1ticC0+cmN2X3htdF9yZWcuaW5kZXgueG10X2NvbXBdKTsKKworCQkvKiBSZXR1cm4gc2tiIHRvIG9wZXJhdGluZyBzeXN0ZW0gKi8KKwkJY29tcCA9IGJwLT5yY3ZfeG10X3JlZy5pbmRleC54bXRfY29tcDsKKwkJcGNpX3VubWFwX3NpbmdsZShicC0+cGNpX2RldiwKKwkJCQkgYnAtPmRlc2NyX2Jsb2NrX3ZpcnQtPnhtdF9kYXRhW2NvbXBdLmxvbmdfMSwKKwkJCQkgcF94bXRfZHJ2X2Rlc2NyLT5wX3NrYi0+bGVuLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYihwX3htdF9kcnZfZGVzY3ItPnBfc2tiKTsKKworCQkvKiBJbmNyZW1lbnQgdHJhbnNtaXQgZXJyb3IgY291bnRlciAqLworCisJCWJwLT54bXRfZGlzY2FyZHMrKzsKKworCQkvKgorCQkgKiBNb3ZlIHRvIHN0YXJ0IG9mIG5leHQgcGFja2V0IGJ5IHVwZGF0aW5nIGNvbXBsZXRpb24gaW5kZXgKKwkJICoKKwkJICogSGVyZSB3ZSBhc3N1bWUgdGhhdCBhIHRyYW5zbWl0IHBhY2tldCByZXF1ZXN0IGlzIGFsd2F5cworCQkgKiBzZXJ2aWNlZCBieSBwb3N0aW5nIG9uZSBmcmFnbWVudC4gIFdlIGNhbiB0aGVyZWZvcmUKKwkJICogc2ltcGxpZnkgdGhlIGNvbXBsZXRpb24gY29kZSBieSBpbmNyZW1lbnRpbmcgdGhlCisJCSAqIGNvbXBsZXRpb24gaW5kZXggYnkgb25lLiAgVGhpcyBjb2RlIHdpbGwgbmVlZCB0byBiZQorCQkgKiBtb2RpZmllZCBpZiB0aGlzIGFzc3VtcHRpb24gY2hhbmdlcy4gIFNlZSBjb21tZW50cworCQkgKiBpbiBkZnhfeG10X3F1ZXVlX3BrdCBmb3IgbW9yZSBkZXRhaWxzLgorCQkgKi8KKworCQlicC0+cmN2X3htdF9yZWcuaW5kZXgueG10X2NvbXAgKz0gMTsKKwkJfQorCisJLyogVXBkYXRlIHRoZSB0cmFuc21pdCBjb25zdW1lciBpbmRleCBpbiB0aGUgY29uc3VtZXIgYmxvY2sgKi8KKworCXByb2RfY29ucyA9ICh1MzIpKGJwLT5jb25zX2Jsb2NrX3ZpcnQtPnhtdF9yY3ZfZGF0YSAmIH5QSV9DT05TX01fWE1UX0lOREVYKTsKKwlwcm9kX2NvbnMgfD0gKHUzMikoYnAtPnJjdl94bXRfcmVnLmluZGV4LnhtdF9wcm9kIDw8IFBJX0NPTlNfVl9YTVRfSU5ERVgpOworCWJwLT5jb25zX2Jsb2NrX3ZpcnQtPnhtdF9yY3ZfZGF0YSA9IHByb2RfY29uczsKKwl9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkZnhfcmVtb3ZlX29uZV9wY2lfb3JfZWlzYShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlERlhfYm9hcmRfdAkqYnAgPSBkZXYtPnByaXY7CisJaW50CQlhbGxvY19zaXplOwkJLyogdG90YWwgYnVmZmVyIHNpemUgdXNlZCAqLworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgIHBkZXYgPyBQRklfS19DU1JfSU9fTEVOIDogUElfRVNJQ19LX0NTUl9JT19MRU4gKTsKKworCWFsbG9jX3NpemUgPSBzaXplb2YoUElfREVTQ1JfQkxPQ0spICsKKwkJICAgICBQSV9DTURfUkVRX0tfU0laRV9NQVggKyBQSV9DTURfUlNQX0tfU0laRV9NQVggKworI2lmbmRlZiBEWU5BTUlDX0JVRkZFUlMKKwkJICAgICAoYnAtPnJjdl9idWZzX3RvX3Bvc3QgKiBQSV9SQ1ZfREFUQV9LX1NJWkVfTUFYKSArCisjZW5kaWYKKwkJICAgICBzaXplb2YoUElfQ09OU1VNRVJfQkxPQ0spICsKKwkJICAgICAoUElfQUxJR05fS19ERVNDX0JMSyAtIDEpOworCWlmIChicC0+a21hbGxvY2VkKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIGFsbG9jX3NpemUsIGJwLT5rbWFsbG9jZWQsCisJCQkJICAgIGJwLT5rbWFsbG9jZWRfZG1hKTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZGZ4X3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlkZnhfcmVtb3ZlX29uZV9wY2lfb3JfZWlzYShwZGV2LCBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGRmeF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0RFQywgUENJX0RFVklDRV9JRF9ERUNfRkRESSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZGZ4X3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZGZ4X2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZGVmeHgiLAorCS5wcm9iZQkJPSBkZnhfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkZnhfcmVtb3ZlX29uZSksCisJLmlkX3RhYmxlCT0gZGZ4X3BjaV90YmwsCit9OworCitzdGF0aWMgaW50IGRmeF9oYXZlX3BjaTsKK3N0YXRpYyBpbnQgZGZ4X2hhdmVfZWlzYTsKKworCitzdGF0aWMgdm9pZCBfX2V4aXQgZGZ4X2Vpc2FfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSByb290X2RmeF9laXNhX2RldjsKKworCXdoaWxlIChkZXYpCisJeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqdG1wOworCQlERlhfYm9hcmRfdCAqYnA7CisKKwkJYnAgPSAoREZYX2JvYXJkX3QqKWRldi0+cHJpdjsKKwkJdG1wID0gYnAtPm5leHQ7CisJCWRmeF9yZW1vdmVfb25lX3BjaV9vcl9laXNhKE5VTEwsIGRldik7CisJCWRldiA9IHRtcDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRmeF9pbml0KHZvaWQpCit7CisJaW50IHJjX3BjaSwgcmNfZWlzYTsKKworCXJjX3BjaSA9IHBjaV9tb2R1bGVfaW5pdCgmZGZ4X2RyaXZlcik7CisJaWYgKHJjX3BjaSA+PSAwKSBkZnhfaGF2ZV9wY2kgPSAxOworCQorCXJjX2Vpc2EgPSBkZnhfZWlzYV9pbml0KCk7CisJaWYgKHJjX2Vpc2EgPj0gMCkgZGZ4X2hhdmVfZWlzYSA9IDE7CisKKwlyZXR1cm4gKChyY19laXNhIDwgMCkgPyAwIDogcmNfZWlzYSkgICsgKChyY19wY2kgPCAwKSA/IDAgOiByY19wY2kpOyAKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRmeF9jbGVhbnVwKHZvaWQpCit7CisJaWYgKGRmeF9oYXZlX3BjaSkKKwkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkZnhfZHJpdmVyKTsKKwlpZiAoZGZ4X2hhdmVfZWlzYSkKKwkJZGZ4X2Vpc2FfY2xlYW51cCgpOworCQkKK30JCisKK21vZHVsZV9pbml0KGRmeF9pbml0KTsKK21vZHVsZV9leGl0KGRmeF9jbGVhbnVwKTsKK01PRFVMRV9BVVRIT1IoIkxhd3JlbmNlIFYuIFN0ZWZhbmkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiREVDIEZEREljb250cm9sbGVyIEVJU0EvUENJIChERUZFQS9ERUZQQSkgZHJpdmVyICIKKwkJICAgRFJWX1ZFUlNJT04gIiAiIERSVl9SRUxEQVRFKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGtlcm5lbC1jb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX0tFUk5FTF9fIC1JL3Jvb3QvbGludXgvaW5jbHVkZSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMiAtcGlwZSAtZm9taXQtZnJhbWUtcG9pbnRlciAtZm5vLXN0cmVuZ3RoLXJlZHVjZSAtbTQ4NiAtbWFsaWduLWxvb3BzPTIgLW1hbGlnbi1qdW1wcz0yIC1tYWxpZ24tZnVuY3Rpb25zPTIgLWMgZGVmeHguYyIKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGVmeHguaCBiL2RyaXZlcnMvbmV0L2RlZnh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4MGI4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RlZnh4LmgKQEAgLTAsMCArMSwxNzc4IEBACisvKgorICogRmlsZSBOYW1lOgorICogICBkZWZ4eC5oCisgKgorICogQ29weXJpZ2h0IEluZm9ybWF0aW9uOgorICogICBDb3B5cmlnaHQgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24gMTk5Ni4KKyAqCisgKiAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiBBYnN0cmFjdDoKKyAqICAgQ29udGFpbnMgYWxsIGRlZmluaXRpb25zIHNwZWNpZmllZCBieSBwb3J0IHNwZWNpZmljYXRpb24gYW5kIHJlcXVpcmVkCisgKiAgIGJ5IHRoZSBkZWZ4eC5jIGRyaXZlci4KKyAqCisgKiBUaGUgb3JpZ2luYWwgYXV0aG9yOgorICogICBMVlMJTGF3cmVuY2UgVi4gU3RlZmFuaSA8bHN0ZWZhbmlAeWFob28uY29tPgorICoKKyAqIE1haW50YWluZXJzOgorICogICBtYWNybwlNYWNpZWogVy4gUm96eWNraSA8bWFjcm9AbGludXgtbWlwcy5vcmc+CisgKgorICogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisgKgkJRGF0ZQkJTmFtZQlEZXNjcmlwdGlvbgorICoJCTE2LUF1Zy05NglMVlMJCUNyZWF0ZWQuCisgKgkJMDktU2VwLTk2CUxWUwkJQWRkZWQgZ3JvdXBfcHJvbSBmaWVsZC4gIE1vdmVkIHJlYWQvd3JpdGUgSS9PCisgKgkJCQkJCQltYWNyb3MgdG8gREVGWFguQy4KKyAqCQkxMi1TZXAtOTYJTFZTCQlSZW1vdmVkIHBhY2tldCByZXF1ZXN0IGhlYWRlciBwb2ludGVycy4KKyAqCQkwNCBBdWcgMjAwMwltYWNybwkJQ29udmVydGVkIHRvIHRoZSBETUEgQVBJLgorICovCisKKyNpZm5kZWYgX0RFRlhYX0hfCisjZGVmaW5lIF9ERUZYWF9IXworCisvKiBEZWZpbmUgYmFzaWMgdHlwZXMgZm9yIHVuc2lnbmVkIGNoYXJzLCBzaG9ydHMsIGxvbmdzICovCisKK3R5cGVkZWYgdTgJUElfVUlOVDg7Cit0eXBlZGVmIHUxNglQSV9VSU5UMTY7Cit0eXBlZGVmIHUzMglQSV9VSU5UMzI7CisKKy8qIERlZmluZSBnZW5lcmFsIHN0cnVjdHVyZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QJCQkJCQkJLyogNjQtYml0IGNvdW50ZXIgKi8KKwl7CisJUElfVUlOVDMyICBtczsKKwlQSV9VSU5UMzIgIGxzOworCX0gUElfQ05UUjsKKwordHlwZWRlZiBzdHJ1Y3QJCQkJCQkJLyogTEFOIGFkZHJlc3MgKi8KKwl7CQkJCQkJCQkJCQorCVBJX1VJTlQzMiAgbHdyZF8wOworCVBJX1VJTlQzMiAgbHdyZF8xOworCX0gUElfTEFOX0FERFI7CisKK3R5cGVkZWYgc3RydWN0CQkJCQkJCS8qIFN0YXRpb24gSUQgYWRkcmVzcyAqLworCXsKKwlQSV9VSU5UMzIgIG9jdGV0XzdfNDsKKwlQSV9VSU5UMzIgIG9jdGV0XzNfMDsKKwl9IFBJX1NUQVRJT05fSUQ7CisKKworLyogRGVmaW5lIGdlbmVyYWwgY29uc3RhbnRzICovCisKKyNkZWZpbmUgUElfQUxJR05fS19ERVNDX0JMSwkgIAkJCTgxOTIJLyogRGVzY3JpcHRvciBibG9jayBib3VuZGFyeQkJKi8KKyNkZWZpbmUgUElfQUxJR05fS19DT05TX0JMSwkgIAkgCQk2NAkJLyogQ29uc3VtZXIgYmxvY2sgYm91bmRhcnkJCSAgCSovCisjZGVmaW5lIFBJX0FMSUdOX0tfQ01EX1JFUV9CVUZGICAJCTEyOAkgCS8qIFhtdCBDb21tYW5kIHF1ZSBidWZmZXIgYWxpZ25tZW50ICovCisjZGVmaW5lIFBJX0FMSUdOX0tfQ01EX1JTUF9CVUZGCSAJCTEyOAkgCS8qIFJjdiBDb21tYW5kIHF1ZSBidWZmZXIgYWxpZ25tZW50ICovCisjZGVmaW5lIFBJX0FMSUdOX0tfVU5TT0xfQlVGRgkgCQkxMjgJIAkvKiBVbnNvbCBxdWUgYnVmZmVyIGFsaWdubWVudAkgICAJKi8KKyNkZWZpbmUgUElfQUxJR05fS19YTVRfREFUQV9CVUZGIAkJMAkgICAJLyogWG10IGRhdGEgcXVlIGJ1ZmZlciBhbGlnbm1lbnQJKi8KKyNkZWZpbmUgUElfQUxJR05fS19SQ1ZfREFUQV9CVUZGIAkJMTI4CSAJLyogUmN2IHF1ZSBidWZmZXIgYWxpZ25tZW50CQkJKi8KKworLyogRGVmaW5lIFBIWSBpbmRleCB2YWx1ZXMgKi8KKworI2RlZmluZSBQSV9QSFlfS19TCQkJCQkJMAkJLyogSW5kZXggdG8gUyBwaHkgKi8KKyNkZWZpbmUgUElfUEhZX0tfQQkJCQkJCTAJCS8qIEluZGV4IHRvIEEgcGh5ICovCisjZGVmaW5lIFBJX1BIWV9LX0IJCQkJCQkxCQkvKiBJbmRleCB0byBCIHBoeSAqLworI2RlZmluZSBQSV9QSFlfS19NQVgJCQkJCTIJCS8qIE1heCBudW1iZXIgb2YgcGh5cyAqLworCisvKiBEZWZpbmUgRk1DIGRlc2NyaXB0b3IgZmllbGRzICovCisKKyNkZWZpbmUgUElfRk1DX0RFU0NSX1ZfU09QCQkJCTMxCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9WX0VPUAkJCQkzMAorI2RlZmluZSBQSV9GTUNfREVTQ1JfVl9GU0MJCQkJMjcKKyNkZWZpbmUgUElfRk1DX0RFU0NSX1ZfRlNCX0VSUk9SCQkyNgorI2RlZmluZSBQSV9GTUNfREVTQ1JfVl9GU0JfQUREUl9SRUNPRwkyNQorI2RlZmluZSBQSV9GTUNfREVTQ1JfVl9GU0JfQUREUl9DT1BJRUQJMjQKKyNkZWZpbmUgUElfRk1DX0RFU0NSX1ZfRlNCCQkJCTIyCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9WX1JDQ19GTFVTSAkJMjEKKyNkZWZpbmUgUElfRk1DX0RFU0NSX1ZfUkNDX0NSQwkJCTIwCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9WX1JDQ19SUlIJCQkxNworI2RlZmluZSBQSV9GTUNfREVTQ1JfVl9SQ0NfREQJCQkxNQorI2RlZmluZSBQSV9GTUNfREVTQ1JfVl9SQ0NfU1MJCQkxMworI2RlZmluZSBQSV9GTUNfREVTQ1JfVl9SQ0MJCQkJMTMKKyNkZWZpbmUgUElfRk1DX0RFU0NSX1ZfTEVOCQkJCTAKKworI2RlZmluZSBQSV9GTUNfREVTQ1JfTV9TT1AJCQkJMHg4MDAwMDAwMAorI2RlZmluZSBQSV9GTUNfREVTQ1JfTV9FT1AJCQkJMHg0MDAwMDAwMAorI2RlZmluZSBQSV9GTUNfREVTQ1JfTV9GU0MJCQkJMHgzODAwMDAwMAorI2RlZmluZSBQSV9GTUNfREVTQ1JfTV9GU0JfRVJST1IJCTB4MDQwMDAwMDAKKyNkZWZpbmUgUElfRk1DX0RFU0NSX01fRlNCX0FERFJfUkVDT0cJMHgwMjAwMDAwMAorI2RlZmluZSBQSV9GTUNfREVTQ1JfTV9GU0JfQUREUl9DT1BJRUQJMHgwMTAwMDAwMAorI2RlZmluZSBQSV9GTUNfREVTQ1JfTV9GU0IJCQkJMHgwN0MwMDAwMAorI2RlZmluZSBQSV9GTUNfREVTQ1JfTV9SQ0NfRkxVU0gJCTB4MDAyMDAwMDAKKyNkZWZpbmUgUElfRk1DX0RFU0NSX01fUkNDX0NSQwkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgUElfRk1DX0RFU0NSX01fUkNDX1JSUgkJCTB4MDAwRTAwMDAKKyNkZWZpbmUgUElfRk1DX0RFU0NSX01fUkNDX0RECQkJMHgwMDAxODAwMAorI2RlZmluZSBQSV9GTUNfREVTQ1JfTV9SQ0NfU1MJCQkweDAwMDA2MDAwCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9NX1JDQwkJCQkweDAwM0ZFMDAwCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9NX0xFTgkJCQkweDAwMDAxRkZGCisKKyNkZWZpbmUgUElfRk1DX0RFU0NSX0tfUkNDX0ZNQ19JTlRfRVJSCTB4MDFBQQorCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9LX1JSUl9TVUNDRVNTCQkweDAwCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9LX1JSUl9TQV9NQVRDSAkJMHgwMQorI2RlZmluZSBQSV9GTUNfREVTQ1JfS19SUlJfREFfTUFUQ0gJCTB4MDIKKyNkZWZpbmUgUElfRk1DX0RFU0NSX0tfUlJSX0ZNQ19BQk9SVAkweDAzCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9LX1JSUl9MRU5HVEhfQkFECTB4MDQKKyNkZWZpbmUgUElfRk1DX0RFU0NSX0tfUlJSX0ZSQUdNRU5UCQkweDA1CisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9LX1JSUl9GT1JNQVRfRVJSCTB4MDYKKyNkZWZpbmUgUElfRk1DX0RFU0NSX0tfUlJSX01BQ19SRVNFVAkweDA3CisKKyNkZWZpbmUgUElfRk1DX0RFU0NSX0tfRERfTk9fTUFUQ0gJCTB4MAorI2RlZmluZSBQSV9GTUNfREVTQ1JfS19ERF9QUk9NSVNDVU9VUwkweDEKKyNkZWZpbmUgUElfRk1DX0RFU0NSX0tfRERfQ0FNX01BVENICQkweDIKKyNkZWZpbmUgUElfRk1DX0RFU0NSX0tfRERfTE9DQUxfTUFUQ0gJMHgzCisKKyNkZWZpbmUgUElfRk1DX0RFU0NSX0tfU1NfTk9fTUFUQ0gJCTB4MAorI2RlZmluZSBQSV9GTUNfREVTQ1JfS19TU19CUklER0VfTUFUQ0gJMHgxCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9LX1NTX05PVF9QT1NTSUJMRQkweDIKKyNkZWZpbmUgUElfRk1DX0RFU0NSX0tfU1NfTE9DQUxfTUFUQ0gJMHgzCisKKy8qIERlZmluZSBzb21lIG1heCBidWZmZXIgc2l6ZXMgKi8KKworI2RlZmluZSBQSV9DTURfUkVRX0tfU0laRV9NQVgJCQk1MTIKKyNkZWZpbmUgUElfQ01EX1JTUF9LX1NJWkVfTUFYCQkJNTEyCisjZGVmaW5lIFBJX1VOU09MX0tfU0laRV9NQVgJCQkJNTEyCisjZGVmaW5lIFBJX1NNVF9IT1NUX0tfU0laRV9NQVgJCQk0NjA4CQkvKiA0IDEvMiBLICovCisjZGVmaW5lIFBJX1JDVl9EQVRBX0tfU0laRV9NQVgJCQk0NjA4CQkvKiA0IDEvMiBLICovCisjZGVmaW5lIFBJX1hNVF9EQVRBX0tfU0laRV9NQVgJCQk0NjA4CQkvKiA0IDEvMiBLICovCisKKy8qIERlZmluZSBhZGFwdGVyIHN0YXRlcyAqLworCisjZGVmaW5lIFBJX1NUQVRFX0tfUkVTRVQJCQkJMAorI2RlZmluZSBQSV9TVEFURV9LX1VQR1JBREUJCSAgCQkxCisjZGVmaW5lIFBJX1NUQVRFX0tfRE1BX1VOQVZBSUwJCQkyCisjZGVmaW5lIFBJX1NUQVRFX0tfRE1BX0FWQUlMCQkJMworI2RlZmluZSBQSV9TVEFURV9LX0xJTktfQVZBSUwJCQk0CisjZGVmaW5lIFBJX1NUQVRFX0tfTElOS19VTkFWQUlMCSAJCTUKKyNkZWZpbmUgUElfU1RBVEVfS19IQUxURUQJCSAgIAkJNgorI2RlZmluZSBQSV9TVEFURV9LX1JJTkdfTUVNQkVSCQkJNworI2RlZmluZSBQSV9TVEFURV9LX05VTUJFUgkJCQk4IAorCisvKiBEZWZpbmUgY29kZXMgZm9yIGNvbW1hbmQgdHlwZSAqLworCisjZGVmaW5lIFBJX0NNRF9LX1NUQVJUCQkJCQkweDAwCisjZGVmaW5lIFBJX0NNRF9LX0ZJTFRFUlNfU0VUCQkJMHgwMQorI2RlZmluZSBQSV9DTURfS19GSUxURVJTX0dFVAkJCTB4MDIKKyNkZWZpbmUgUElfQ01EX0tfQ0hBUlNfU0VUCQkJCTB4MDMKKyNkZWZpbmUgUElfQ01EX0tfU1RBVFVTX0NIQVJTX0dFVAkJMHgwNAorI2RlZmluZSBQSV9DTURfS19DTlRSU19HRVQJCQkJMHgwNQorI2RlZmluZSBQSV9DTURfS19DTlRSU19TRVQJCQkJMHgwNgorI2RlZmluZSBQSV9DTURfS19BRERSX0ZJTFRFUl9TRVQJCTB4MDcKKyNkZWZpbmUgUElfQ01EX0tfQUREUl9GSUxURVJfR0VUCQkweDA4CisjZGVmaW5lIFBJX0NNRF9LX0VSUk9SX0xPR19DTEVBUgkJMHgwOQorI2RlZmluZSBQSV9DTURfS19FUlJPUl9MT0dfR0VUCQkJMHgwQQorI2RlZmluZSBQSV9DTURfS19GRERJX01JQl9HRVQJCQkweDBCCisjZGVmaW5lIFBJX0NNRF9LX0RFQ19FWFRfTUlCX0dFVAkJMHgwQworI2RlZmluZSBQSV9DTURfS19ERVZJQ0VfU1BFQ0lGSUNfR0VUCTB4MEQKKyNkZWZpbmUgUElfQ01EX0tfU05NUF9TRVQJCQkJMHgwRQorI2RlZmluZSBQSV9DTURfS19VTlNPTF9URVNUCQkJCTB4MEYKKyNkZWZpbmUgUElfQ01EX0tfU01UX01JQl9HRVQJCQkweDEwCisjZGVmaW5lIFBJX0NNRF9LX1NNVF9NSUJfU0VUCQkJMHgxMQorI2RlZmluZSBQSV9DTURfS19NQVgJCQkJCTB4MTEJLyogTXVzdCBtYXRjaCBsYXN0ICovCisKKy8qIERlZmluZSBpdGVtIGNvZGVzIGZvciBDaGFyc19TZXQgYW5kIEZpbHRlcnNfU2V0IGNvbW1hbmRzICovCisKKyNkZWZpbmUgUElfSVRFTV9LX0VPTAkJCQkJMHgwMCAJLyogRW5kLW9mLUl0ZW0gbGlzdCAJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX1RfUkVRCQkJCQkweDAxIAkvKiBERUNuZXQgVF9SRVEgCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfVFZYCQkJCQkweDAyIAkvKiBERUNuZXQgVFZYIAkJCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19SRVNUUklDVEVEX1RPS0VOCQkweDAzIAkvKiBERUNuZXQgUmVzdHJpY3RlZCBUb2tlbiAJICAqLwkgCisjZGVmaW5lIFBJX0lURU1fS19MRU1fVEhSRVNIT0xECQkJMHgwNCAJLyogREVDbmV0IExFTSBUaHJlc2hvbGQgCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX1JJTkdfUFVSR0VSCQkJMHgwNSAJLyogREVDbmV0IFJpbmcgUHVyZ2VyIEVuYWJsZSAgKi8JCisjZGVmaW5lIFBJX0lURU1fS19DTlRSX0lOVEVSVkFMCQkJMHgwNiAJLyogQ2hhcnNfU2V0IAkJCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19JTkRfR1JPVVBfUFJPTQkJMHgwNyAJLyogRmlsdGVyc19TZXQgCQkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX0dST1VQX1BST00JCQkweDA4IAkvKiBGaWx0ZXJzX1NldCAJCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfQlJPQURDQVNUCQkJCTB4MDkgCS8qIEZpbHRlcnNfU2V0IAkJCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19TTVRfUFJPTQkJCQkweDBBIAkvKiBGaWx0ZXJzX1NldAkJCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19TTVRfVVNFUgkJCQkweDBCIAkvKiBGaWx0ZXJzX1NldCAJCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfUkVTRVJWRUQJCQkJMHgwQyAJLyogRmlsdGVyc19TZXQgCQkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX0lNUExFTUVOVE9SCQkJMHgwRCAJLyogRmlsdGVyc19TZXQgCQkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX0xPT1BCQUNLX01PREUJCQkweDBFIAkvKiBDaGFyc19TZXQgCQkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX0NPTkZJR19QT0xJQ1kJCQkweDEwIAkvKiBTTVRDb25maWdQb2xpY3kgCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfQ09OX1BPTElDWQkJCTB4MTEgCS8qIFNNVENvbm5lY3Rpb25Qb2xpY3kgCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19UX05PVElGWQkJCQkweDEyIAkvKiBTTVRUTm90aWZ5IAkJCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19TVEFUSU9OX0FDVElPTgkJMHgxMyAJLyogU01UU3RhdGlvbkFjdGlvbgkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX01BQ19QQVRIU19SRVEJICAgCQkweDE1IAkvKiBNQUNQYXRoc1JlcXVlc3RlZCAJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX01BQ19BQ1RJT04JCQkweDE3IAkvKiBNQUNBY3Rpb24gCQkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX0NPTl9QT0xJQ0lFUwkJCTB4MTggCS8qIFBPUlRDb25uZWN0aW9uUG9saWNpZXMJICAqLworI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9QQVRIU19SRVEJCTB4MTkgCS8qIFBPUlRQYXRoc1JlcXVlc3RlZCAJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX01BQ19MT09QX1RJTUUJCQkweDFBIAkvKiBQT1JUTUFDTG9vcFRpbWUgCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfVEJfTUFYCQkJCTB4MUIgCS8qIFBPUlRUQk1heCAJCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfTEVSX0NVVE9GRgkJCTB4MUMgCS8qIFBPUlRMZXJDdXRvZmYgCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfTEVSX0FMQVJNCQkJCTB4MUQgCS8qIFBPUlRMZXJBbGFybSAJCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19QT1JUX0FDVElPTgkJCTB4MUUgCS8qIFBPUlRBY3Rpb24gCQkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX0ZMVVNIX1RJTUUJCQkweDIwIAkvKiBDaGFyc19TZXQgCQkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX01BQ19UX1JFUQkJCQkweDI5IAkvKiBNQUNUUmVxIAkJCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfRU1BQ19SSU5HX1BVUkdFUgkJMHgyQSAJLyogZU1BQ1JpbmdQdXJnZXJFbmFibGUJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX0VNQUNfUlRPS0VOX1RJTUVPVVQJMHgyQiAJLyogZU1BQ1Jlc3RyaWN0ZWRUb2tlblRpbWVvdXQgKi8KKyNkZWZpbmUgUElfSVRFTV9LX0ZEWF9FTkJfRElTCQkJMHgyQyAJLyogZUZEWEVuYWJsZQkJCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19NQVgJCQkJCTB4MkMgCS8qIE11c3QgZXF1YWwgaGlnaCBpdGVtCQkgICovCisKKy8qIFZhbHVlcyBmb3Igc29tZSBvZiB0aGUgaXRlbXMgKi8KKworI2RlZmluZSBQSV9LX0ZBTFNFCQkJCQkJMAkgICAvKiBHZW5lcmljIGZhbHNlICovCisjZGVmaW5lIFBJX0tfVFJVRQkJCQkJCTEJICAgLyogR2VuZXJpYyB0cnVlICAqLworCisjZGVmaW5lIFBJX1NOTVBfS19UUlVFCQkJCQkxCSAgIC8qIFNOTVAgdHJ1ZS9mYWxzZSB2YWx1ZXMgKi8KKyNkZWZpbmUgUElfU05NUF9LX0ZBTFNFCQkJCQkyCisKKyNkZWZpbmUgUElfRlNUQVRFX0tfQkxPQ0sJCQkJMAkgICAvKiBGaWx0ZXIgU3RhdGUgKi8KKyNkZWZpbmUgUElfRlNUQVRFX0tfUEFTUwkJCQkxCisKKy8qIERlZmluZSBjb21tYW5kIHJldHVybiBjb2RlcyAqLworCisjZGVmaW5lIFBJX1JTUF9LX1NVQ0NFU1MJCQkJMHgwMAorI2RlZmluZSBQSV9SU1BfS19GQUlMVVJFCQkJCTB4MDEKKyNkZWZpbmUgUElfUlNQX0tfV0FSTklORwkJCQkweDAyCisjZGVmaW5lIFBJX1JTUF9LX0xPT1BfTU9ERV9CQUQJCQkweDAzCisjZGVmaW5lIFBJX1JTUF9LX0lURU1fQ09ERV9CQUQJCQkweDA0CisjZGVmaW5lIFBJX1JTUF9LX1RWWF9CQUQJCQkJMHgwNQorI2RlZmluZSBQSV9SU1BfS19UUkVRX0JBRAkJCQkweDA2CisjZGVmaW5lIFBJX1JTUF9LX1RPS0VOX0JBRAkJCQkweDA3CisjZGVmaW5lIFBJX1JTUF9LX05PX0VPTAkJCQkJMHgwQworI2RlZmluZSBQSV9SU1BfS19GSUxURVJfU1RBVEVfQkFECQkweDBECisjZGVmaW5lIFBJX1JTUF9LX0NNRF9UWVBFX0JBRAkJCTB4MEUKKyNkZWZpbmUgUElfUlNQX0tfQURBUFRFUl9TVEFURV9CQUQJCTB4MEYKKyNkZWZpbmUgUElfUlNQX0tfUklOR19QVVJHRVJfQkFECQkweDEwCisjZGVmaW5lIFBJX1JTUF9LX0xFTV9USFJFU0hPTERfQkFECQkweDExCisjZGVmaW5lIFBJX1JTUF9LX0xPT1BfTk9UX1NVUFBPUlRFRAkJMHgxMgorI2RlZmluZSBQSV9SU1BfS19GTFVTSF9USU1FX0JBRAkJCTB4MTMKKyNkZWZpbmUgUElfUlNQX0tfTk9UX0lNUExFTUVOVEVECQkweDE0CisjZGVmaW5lIFBJX1JTUF9LX0NPTkZJR19QT0xJQ1lfQkFECQkweDE1CisjZGVmaW5lIFBJX1JTUF9LX1NUQVRJT05fQUNUSU9OX0JBRAkJMHgxNgorI2RlZmluZSBQSV9SU1BfS19NQUNfQUNUSU9OX0JBRAkJCTB4MTcKKyNkZWZpbmUgUElfUlNQX0tfQ09OX1BPTElDSUVTX0JBRAkJMHgxOAorI2RlZmluZSBQSV9SU1BfS19NQUNfTE9PUF9USU1FX0JBRAkJMHgxOQorI2RlZmluZSBQSV9SU1BfS19UQl9NQVhfQkFECQkJCTB4MUEKKyNkZWZpbmUgUElfUlNQX0tfTEVSX0NVVE9GRl9CQUQJCQkweDFCCisjZGVmaW5lIFBJX1JTUF9LX0xFUl9BTEFSTV9CQUQJCQkweDFDCisjZGVmaW5lIFBJX1JTUF9LX01BQ19QQVRIU19SRVFfQkFECQkweDFECisjZGVmaW5lIFBJX1JTUF9LX01BQ19UX1JFUV9CQUQJCQkweDFFCisjZGVmaW5lIFBJX1JTUF9LX0VNQUNfUklOR19QVVJHRVJfQkFECTB4MUYKKyNkZWZpbmUgUElfUlNQX0tfRU1BQ19SVE9LRU5fVElNRV9CQUQJMHgyMAorI2RlZmluZSBQSV9SU1BfS19OT19TVUNIX0VOVFJZCQkJMHgyMQorI2RlZmluZSBQSV9SU1BfS19UX05PVElGWV9CQUQJCQkweDIyCisjZGVmaW5lIFBJX1JTUF9LX1RSX01BWF9FWFBfQkFECQkJMHgyMworI2RlZmluZSBQSV9SU1BfS19NQUNfRlJNX0VSUl9USFJfQkFECTB4MjQKKyNkZWZpbmUgUElfUlNQX0tfTUFYX1RfUkVRX0JBRAkJCTB4MjUKKyNkZWZpbmUgUElfUlNQX0tfRkRYX0VOQl9ESVNfQkFECQkweDI2CisjZGVmaW5lIFBJX1JTUF9LX0lURU1fSU5ERVhfQkFECQkJMHgyNworI2RlZmluZSBQSV9SU1BfS19QT1JUX0FDVElPTl9CQUQJCTB4MjgKKworLyogQ29tbW9ubHkgdXNlZCBzdHJ1Y3R1cmVzICovCisKK3R5cGVkZWYgc3RydWN0CQkJCQkJCQkJLyogSXRlbSBsaXN0ICovCisJeworCVBJX1VJTlQzMiAgaXRlbV9jb2RlOworCVBJX1VJTlQzMiAgdmFsdWU7CisJfSBQSV9JVEVNX0xJU1Q7CisKK3R5cGVkZWYgc3RydWN0CQkJCQkJCQkJLyogUmVzcG9uc2UgaGVhZGVyICovCisJeworCVBJX1VJTlQzMiAgcmVzZXJ2ZWQ7CisJUElfVUlOVDMyICBjbWRfdHlwZTsKKwlQSV9VSU5UMzIgIHN0YXR1czsKKwl9IFBJX1JTUF9IRUFERVI7CisKKworLyogU3RhcnQgQ29tbWFuZCAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9VSU5UMzIgIGNtZF90eXBlOworCX0gUElfQ01EX1NUQVJUX1JFUTsKKworLyogU3RhcnQgUmVzcG9uc2UgKi8KKwordHlwZWRlZiBzdHJ1Y3QgCisJeworCVBJX1JTUF9IRUFERVIgICBoZWFkZXI7CQorCX0gUElfQ01EX1NUQVJUX1JTUDsKKworLyogRmlsdGVyc19TZXQgUmVxdWVzdCAqLworCisjZGVmaW5lIFBJX0NNRF9GSUxURVJTX1NFVF9LX0lURU1TX01BWCAgNjMJCS8qIEZpdHMgaW4gYSA1MTIgYnl0ZSBidWZmZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgCisJeworCVBJX1VJTlQzMgkJY21kX3R5cGU7CisJUElfSVRFTV9MSVNUCWl0ZW1bUElfQ01EX0ZJTFRFUlNfU0VUX0tfSVRFTVNfTUFYXTsKKwl9IFBJX0NNRF9GSUxURVJTX1NFVF9SRVE7CisKKy8qIEZpbHRlcnNfU2V0IFJlc3BvbnNlICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1JTUF9IRUFERVIgICBoZWFkZXI7CQorCX0gUElfQ01EX0ZJTFRFUlNfU0VUX1JTUDsKKworLyogRmlsdGVyc19HZXQgUmVxdWVzdCAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9VSU5UMzIJCWNtZF90eXBlOyAgIAorCX0gUElfQ01EX0ZJTFRFUlNfR0VUX1JFUTsKKworLyogRmlsdGVyc19HZXQgUmVzcG9uc2UgKi8KKwordHlwZWRlZiBzdHJ1Y3QgCisJeworCVBJX1JTUF9IRUFERVIgICBoZWFkZXI7CQorCVBJX1VJTlQzMgkJaW5kX2dyb3VwX3Byb207CisJUElfVUlOVDMyCQlncm91cF9wcm9tOworCVBJX1VJTlQzMgkJYnJvYWRjYXN0X2FsbDsKKwlQSV9VSU5UMzIJCXNtdF9hbGw7CisJUElfVUlOVDMyCQlzbXRfdXNlcjsKKwlQSV9VSU5UMzIJCXJlc2VydmVkX2FsbDsKKwlQSV9VSU5UMzIJCWltcGxlbWVudG9yX2FsbDsKKwl9IFBJX0NNRF9GSUxURVJTX0dFVF9SU1A7CisKKworLyogQ2hhcnNfU2V0IFJlcXVlc3QgKi8KKworI2RlZmluZSBQSV9DTURfQ0hBUlNfU0VUX0tfSVRFTVNfTUFYIDQyCQkvKiBGaXRzIGluIGEgNTEyIGJ5dGUgYnVmZmVyICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1VJTlQzMgkJY21kX3R5cGU7CisJc3RydWN0CQkJCQkJCSAgCQkvKiBJdGVtIGxpc3QgKi8KKwkJeworCQlQSV9VSU5UMzIJaXRlbV9jb2RlOworCQlQSV9VSU5UMzIJdmFsdWU7CisJCVBJX1VJTlQzMglpdGVtX2luZGV4OworCQl9IGl0ZW1bUElfQ01EX0NIQVJTX1NFVF9LX0lURU1TX01BWF07CQorCX0gUElfQ01EX0NIQVJTX1NFVF9SRVE7CisKKy8qIENoYXJzX1NldCBSZXNwb25zZSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9SU1BfSEVBREVSICAgaGVhZGVyOwkKKwl9IFBJX0NNRF9DSEFSU19TRVRfUlNQOworCisKKy8qIFNOTVBfU2V0IFJlcXVlc3QgKi8KKworI2RlZmluZSBQSV9DTURfU05NUF9TRVRfS19JVEVNU19NQVggNDIJICAgCS8qIEZpdHMgaW4gYSA1MTIgYnl0ZSBidWZmZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfVUlOVDMyCQljbWRfdHlwZTsKKwlzdHJ1Y3QJCQkJCQkJICAgCQkvKiBJdGVtIGxpc3QgKi8KKwkJeworCQlQSV9VSU5UMzIJaXRlbV9jb2RlOworCQlQSV9VSU5UMzIJdmFsdWU7CisJCVBJX1VJTlQzMglpdGVtX2luZGV4OworCQl9IGl0ZW1bUElfQ01EX1NOTVBfU0VUX0tfSVRFTVNfTUFYXTsJCisJfSBQSV9DTURfU05NUF9TRVRfUkVROworCisvKiBTTk1QX1NldCBSZXNwb25zZSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9SU1BfSEVBREVSICAgaGVhZGVyOwkKKwl9IFBJX0NNRF9TTk1QX1NFVF9SU1A7CisKKworLyogU01UX01JQl9TZXQgUmVxdWVzdCAqLworCisjZGVmaW5lIFBJX0NNRF9TTVRfTUlCX1NFVF9LX0lURU1TX01BWCA0MgkvKiBNYXggbnVtYmVyIG9mIGl0ZW1zICovIAorCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9VSU5UMzIJY21kX3R5cGU7CisJc3RydWN0CisJCXsKKwkJUElfVUlOVDMyCWl0ZW1fY29kZTsKKwkJUElfVUlOVDMyCXZhbHVlOworCQlQSV9VSU5UMzIJaXRlbV9pbmRleDsKKwkJfSBpdGVtW1BJX0NNRF9TTVRfTUlCX1NFVF9LX0lURU1TX01BWF07CisJfSBQSV9DTURfU01UX01JQl9TRVRfUkVROworCisvKiBTTVRfTUlCX1NldCBSZXNwb25zZSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9SU1BfSEVBREVSICAgaGVhZGVyOwkKKwl9IFBJX0NNRF9TTVRfTUlCX1NFVF9SU1A7CisKKy8qIFNNVF9NSUJfR2V0IFJlcXVlc3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfVUlOVDMyICBjbWRfdHlwZTsKKwl9IFBJX0NNRF9TTVRfTUlCX0dFVF9SRVE7CisKKy8qIFNNVF9NSUJfR2V0IFJlc3BvbnNlICovCisKK3R5cGVkZWYgc3RydWN0CQkJCQkJICAvKiBSZWZlciB0byBBTlNJIEZEREkgU01UIFJldi4gNy4zICovCisJeworCVBJX1JTUF9IRUFERVIgIGhlYWRlcjsKKwkKKwkvKiBTTVQgR1JPVVAgKi8JCQkJCQkJCQkJCQkJCSAgCisKKwlQSV9TVEFUSU9OX0lEICAJc210X3N0YXRpb25faWQ7CisJUElfVUlOVDMyIAkJc210X29wX3ZlcnNpb25faWQ7CisJUElfVUlOVDMyCSAgIAlzbXRfaGlfdmVyc2lvbl9pZDsKKwlQSV9VSU5UMzIJICAgCXNtdF9sb192ZXJzaW9uX2lkOworCVBJX1VJTlQzMgkgICAJc210X3VzZXJfZGF0YVs4XTsKKwlQSV9VSU5UMzIJICAgCXNtdF9taWJfdmVyc2lvbl9pZDsKKwlQSV9VSU5UMzIJICAgCXNtdF9tYWNfY3Q7CisJUElfVUlOVDMyCSAgIAlzbXRfbm9uX21hc3Rlcl9jdDsKKwlQSV9VSU5UMzIJICAgCXNtdF9tYXN0ZXJfY3Q7CisJUElfVUlOVDMyCSAgIAlzbXRfYXZhaWxhYmxlX3BhdGhzOworCVBJX1VJTlQzMgkgICAJc210X2NvbmZpZ19jYXBhYmlsaXRpZXM7CisJUElfVUlOVDMyCSAgIAlzbXRfY29uZmlnX3BvbGljeTsKKwlQSV9VSU5UMzIJICAgCXNtdF9jb25uZWN0aW9uX3BvbGljeTsKKwlQSV9VSU5UMzIJICAgCXNtdF90X25vdGlmeTsKKwlQSV9VSU5UMzIJICAgCXNtdF9zdGF0X3JwdF9wb2xpY3k7CisJUElfVUlOVDMyCSAgIAlzbXRfdHJhY2VfbWF4X2V4cGlyYXRpb247CisJUElfVUlOVDMyCSAgIAlzbXRfYnlwYXNzX3ByZXNlbnQ7CisJUElfVUlOVDMyCSAgCXNtdF9lY21fc3RhdGU7CisJUElfVUlOVDMyCSAgIAlzbXRfY2Zfc3RhdGU7CisJUElfVUlOVDMyCSAgIAlzbXRfcmVtb3RlX2Rpc2Nvbm5lY3RfZmxhZzsKKwlQSV9VSU5UMzIJICAgCXNtdF9zdGF0aW9uX3N0YXR1czsKKwlQSV9VSU5UMzIJICAgCXNtdF9wZWVyX3dyYXBfZmxhZzsKKwlQSV9DTlRSCSAgIAkJc210X21zZ190aW1lX3N0YW1wOworCVBJX0NOVFIJICAJCXNtdF90cmFuc2l0aW9uX3RpbWVfc3RhbXA7CisKKwkvKiBNQUMgR1JPVVAgKi8KKworCVBJX1VJTlQzMgkJbWFjX2ZyYW1lX3N0YXR1c19mdW5jdGlvbnM7CisJUElfVUlOVDMyCQltYWNfdF9tYXhfY2FwYWJpbGl0eTsKKwlQSV9VSU5UMzIJCW1hY190dnhfY2FwYWJpbGl0eTsKKwlQSV9VSU5UMzIJCW1hY19hdmFpbGFibGVfcGF0aHM7CisJUElfVUlOVDMyCQltYWNfY3VycmVudF9wYXRoOworCVBJX0xBTl9BRERSCQltYWNfdXBzdHJlYW1fbmJyOworCVBJX0xBTl9BRERSCQltYWNfZG93bnN0cmVhbV9uYnI7CisJUElfTEFOX0FERFIJCW1hY19vbGRfdXBzdHJlYW1fbmJyOworCVBJX0xBTl9BRERSCQltYWNfb2xkX2Rvd25zdHJlYW1fbmJyOworCVBJX1VJTlQzMgkgICAJbWFjX2R1cF9hZGRyZXNzX3Rlc3Q7CisJUElfVUlOVDMyCSAgIAltYWNfcmVxdWVzdGVkX3BhdGhzOworCVBJX1VJTlQzMgkgICAJbWFjX2Rvd25zdHJlYW1fcG9ydF90eXBlOworCVBJX0xBTl9BRERSCQltYWNfc210X2FkZHJlc3M7CisJUElfVUlOVDMyCQltYWNfdF9yZXE7CisJUElfVUlOVDMyCQltYWNfdF9uZWc7CisJUElfVUlOVDMyCQltYWNfdF9tYXg7CisJUElfVUlOVDMyCQltYWNfdHZ4X3ZhbHVlOworCVBJX1VJTlQzMgkJbWFjX2ZyYW1lX2Vycm9yX3RocmVzaG9sZDsKKwlQSV9VSU5UMzIJCW1hY19mcmFtZV9lcnJvcl9yYXRpbzsKKwlQSV9VSU5UMzIJCW1hY19ybXRfc3RhdGU7CisJUElfVUlOVDMyCQltYWNfZGFfZmxhZzsKKwlQSV9VSU5UMzIJCW1hY191bmRhX2ZsYWc7CisJUElfVUlOVDMyCQltYWNfZnJhbWVfZXJyb3JfZmxhZzsKKwlQSV9VSU5UMzIJCW1hY19tYV91bml0ZGF0YV9hdmFpbGFibGU7CisJUElfVUlOVDMyCQltYWNfaGFyZHdhcmVfcHJlc2VudDsKKwlQSV9VSU5UMzIJCW1hY19tYV91bml0ZGF0YV9lbmFibGU7CisKKwkvKiBQQVRIIEdST1VQICovCisKKwlQSV9VSU5UMzIJCXBhdGhfY29uZmlndXJhdGlvbls4XTsKKwlQSV9VSU5UMzIJCXBhdGhfdHZ4X2xvd2VyX2JvdW5kOworCVBJX1VJTlQzMgkJcGF0aF90X21heF9sb3dlcl9ib3VuZDsKKwlQSV9VSU5UMzIJCXBhdGhfbWF4X3RfcmVxOworCisJLyogUE9SVCBHUk9VUCAqLworCisJUElfVUlOVDMyCQlwb3J0X215X3R5cGVbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfbmVpZ2hib3JfdHlwZVtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9jb25uZWN0aW9uX3BvbGljaWVzW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X21hY19pbmRpY2F0ZWRbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfY3VycmVudF9wYXRoW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X3JlcXVlc3RlZF9wYXRoc1tQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9tYWNfcGxhY2VtZW50W1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X2F2YWlsYWJsZV9wYXRoc1tQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9wbWRfY2xhc3NbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfY29ubmVjdGlvbl9jYXBhYmlsaXRpZXNbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfYnNfZmxhZ1tQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9sZXJfZXN0aW1hdGVbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfbGVyX2N1dG9mZltQSV9QSFlfS19NQVhdOwkKKwlQSV9VSU5UMzIJCXBvcnRfbGVyX2FsYXJtW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X2Nvbm5lY3Rfc3RhdGVbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfcGNtX3N0YXRlW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X3BjX3dpdGhob2xkW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X2xlcl9mbGFnW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X2hhcmR3YXJlX3ByZXNlbnRbUElfUEhZX0tfTUFYXTsKKworCS8qIEdST1VQIGZvciB0aGluZ3MgdGhhdCB3ZXJlIGFkZGVkIGxhdGVyLCBzbyBtdXN0IGJlIGF0IHRoZSBlbmQuICovCisKKwlQSV9DTlRSCSAgIAkJcGF0aF9yaW5nX2xhdGVuY3k7CisKKwl9IFBJX0NNRF9TTVRfTUlCX0dFVF9SU1A7IAorCisKKy8qCisgKiAgSXRlbSBhbmQgZ3JvdXAgY29kZSBkZWZpbml0aW9ucyBmb3IgU01UIDcuMyBtYW5kYXRvcnkgb2JqZWN0cy4gIFRoZXNlCisgKiAgZGVmaW5pdGlvbnMgYXJlIHRvIGJlIHVzZWQgYXMgYXBwcm9wcmlhdGUgaW4gU01UX01JQl9TRVQgY29tbWFuZHMgYW5kCisgKiAgY2VydGFpbiBob3N0LXNlbnQgU01UIGZyYW1lcyBzdWNoIGFzIFBNRiBHZXQgYW5kIFNldCByZXF1ZXN0cy4gIFRoZQorICogIGNvZGVzIGhhdmUgYmVlbiB0YWtlbiBmcm9tIHRoZSBNSUIgc3VtbWFyeSBzZWN0aW9uIG9mIEFOU0kgU01UIDcuMy4KKyAqLworCQorI2RlZmluZSBQSV9HUlBfS19TTVRfU1RBVElPTl9JRAkJCTB4MTAwQQorI2RlZmluZSBQSV9JVEVNX0tfU01UX1NUQVRJT05fSUQJCTB4MTAwQgorI2RlZmluZSBQSV9JVEVNX0tfU01UX09QX1ZFUlNfSUQJCTB4MTAwRAorI2RlZmluZSBQSV9JVEVNX0tfU01UX0hJX1ZFUlNfSUQJCTB4MTAwRQorI2RlZmluZSBQSV9JVEVNX0tfU01UX0xPX1ZFUlNfSUQJCTB4MTAwRgorI2RlZmluZSBQSV9JVEVNX0tfU01UX1VTRVJfREFUQQkJCTB4MTAxMQorI2RlZmluZSBQSV9JVEVNX0tfU01UX01JQl9WRVJTX0lECSAgCTB4MTAxMgorCisjZGVmaW5lIFBJX0dSUF9LX1NNVF9TVEFUSU9OX0NPTkZJRwkJMHgxMDE0CisjZGVmaW5lIFBJX0lURU1fS19TTVRfTUFDX0NUCQkJMHgxMDE1CisjZGVmaW5lIFBJX0lURU1fS19TTVRfTk9OX01BU1RFUl9DVAkJMHgxMDE2CisjZGVmaW5lIFBJX0lURU1fS19TTVRfTUFTVEVSX0NUCQkJMHgxMDE3CisjZGVmaW5lIFBJX0lURU1fS19TTVRfQVZBSUxfUEFUSFMJCTB4MTAxOAorI2RlZmluZSBQSV9JVEVNX0tfU01UX0NPTkZJR19DQVBTCQkweDEwMTkKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9DT05GSUdfUE9MCQkweDEwMUEKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9DT05OX1BPTAkJCTB4MTAxQgorI2RlZmluZSBQSV9JVEVNX0tfU01UX1RfTk9USUZZCQkJMHgxMDFECisjZGVmaW5lIFBJX0lURU1fS19TTVRfU1RBVF9QT0wJCQkweDEwMUUKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9UUl9NQVhfRVhQCQkweDEwMUYKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9QT1JUX0lOREVYRVMJCTB4MTAyMAorI2RlZmluZSBQSV9JVEVNX0tfU01UX01BQ19JTkRFWEVTCQkweDEwMjEKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9CWVBBU1NfUFJFU0VOVAkweDEwMjIKKworI2RlZmluZSBQSV9HUlBfS19TTVRfU1RBVFVTCQkJCTB4MTAyOAorI2RlZmluZSBQSV9JVEVNX0tfU01UX0VDTV9TVEFURQkJCTB4MTAyOQorI2RlZmluZSBQSV9JVEVNX0tfU01UX0NGX1NUQVRFCQkgCTB4MTAyQQorI2RlZmluZSBQSV9JVEVNX0tfU01UX1JFTV9ESVNDX0ZMQUcJCTB4MTAyQworI2RlZmluZSBQSV9JVEVNX0tfU01UX1NUQVRJT05fU1RBVFVTCTB4MTAyRAorI2RlZmluZSBQSV9JVEVNX0tfU01UX1BFRVJfV1JBUF9GTEFHCTB4MTAyRQorCQorI2RlZmluZSBQSV9HUlBfS19TTVRfTUlCX09QRVJBVElPTgkgCTB4MTAzMgorI2RlZmluZSBQSV9JVEVNX0tfU01UX01TR19USU1FX1NUQU1QIAkweDEwMzMKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9UUk5fVElNRV9TVEFNUCAJMHgxMDM0CisKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9TVEFUSU9OX0FDVAkJMHgxMDNDCisKKyNkZWZpbmUgUElfR1JQX0tfTUFDX0NBUEFCSUxJVElFUwkgIAkweDIwMEEKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19GUk1fU1RBVF9GVU5DCQkweDIwMEIKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19UX01BWF9DQVAJCQkweDIwMEQKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19UVlhfQ0FQCQkgIAkweDIwMEUKKworI2RlZmluZSBQSV9HUlBfS19NQUNfQ09ORklHCQkJCTB4MjAxNAorI2RlZmluZSBQSV9JVEVNX0tfTUFDX0FWQUlMX1BBVEhTCSAgCTB4MjAxNgorI2RlZmluZSBQSV9JVEVNX0tfTUFDX0NVUlJFTlRfUEFUSAkgCTB4MjAxNworI2RlZmluZSBQSV9JVEVNX0tfTUFDX1VQX05CUgkJCTB4MjAxOAorI2RlZmluZSBQSV9JVEVNX0tfTUFDX0RPV05fTkJSCQkJMHgyMDE5CisjZGVmaW5lIFBJX0lURU1fS19NQUNfT0xEX1VQX05CUgkgCTB4MjAxQQorI2RlZmluZSBQSV9JVEVNX0tfTUFDX09MRF9ET1dOX05CUgkgCTB4MjAxQgorI2RlZmluZSBQSV9JVEVNX0tfTUFDX0RVUF9BRERSX1RFU1QJCTB4MjAxRAorI2RlZmluZSBQSV9JVEVNX0tfTUFDX1JFUV9QQVRIUwkJCTB4MjAyMAorI2RlZmluZSBQSV9JVEVNX0tfTUFDX0RPV05fUE9SVF9UWVBFICAgCTB4MjAyMQorI2RlZmluZSBQSV9JVEVNX0tfTUFDX0lOREVYCQkJCTB4MjAyMgorCisjZGVmaW5lIFBJX0dSUF9LX01BQ19BRERSRVNTCQkJMHgyMDI4CisjZGVmaW5lIFBJX0lURU1fS19NQUNfU01UX0FERFJFU1MJCTB4MjAyOQorCisjZGVmaW5lIFBJX0dSUF9LX01BQ19PUEVSQVRJT04JCQkweDIwMzIKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19UUkVRCQkJCTB4MjAzMworI2RlZmluZSBQSV9JVEVNX0tfTUFDX1RORUcJCQkJMHgyMDM0CisjZGVmaW5lIFBJX0lURU1fS19NQUNfVE1BWAkJCQkweDIwMzUKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19UVlhfVkFMVUUJCQkweDIwMzYKKworI2RlZmluZSBQSV9HUlBfS19NQUNfQ09VTlRFUlMJCQkweDIwNDYKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19GUkFNRV9DVAkJCTB4MjA0NworI2RlZmluZSBQSV9JVEVNX0tfTUFDX0NPUElFRF9DVAkJCTB4MjA0OAorI2RlZmluZSBQSV9JVEVNX0tfTUFDX1RSQU5TTUlUX0NUCQkweDIwNDkKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19FUlJPUl9DVAkJCTB4MjA1MQorI2RlZmluZSBQSV9JVEVNX0tfTUFDX0xPU1RfQ1QJCQkweDIwNTIKKworI2RlZmluZSBQSV9HUlBfS19NQUNfRlJNX0VSUl9DT05ECQkweDIwNUEKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19GUk1fRVJSX1RIUgkJMHgyMDVGCisjZGVmaW5lIFBJX0lURU1fS19NQUNfRlJNX0VSUl9SQVQJCTB4MjA2MAorCisjZGVmaW5lIFBJX0dSUF9LX01BQ19TVEFUVVMJCQkJMHgyMDZFCisjZGVmaW5lIFBJX0lURU1fS19NQUNfUk1UX1NUQVRFCQkJMHgyMDZGCisjZGVmaW5lIFBJX0lURU1fS19NQUNfREFfRkxBRwkJCTB4MjA3MAorI2RlZmluZSBQSV9JVEVNX0tfTUFDX1VOREFfRkxBRwkJCTB4MjA3MQorI2RlZmluZSBQSV9JVEVNX0tfTUFDX0ZSTV9FUlJfRkxBRwkJMHgyMDcyCisjZGVmaW5lIFBJX0lURU1fS19NQUNfTUFfVU5JVF9BVkFJTAkJMHgyMDc0CisjZGVmaW5lIFBJX0lURU1fS19NQUNfSFdfUFJFU0VOVAkJMHgyMDc1CisjZGVmaW5lIFBJX0lURU1fS19NQUNfTUFfVU5JVF9FTkFCCQkweDIwNzYKKworI2RlZmluZSBQSV9HUlBfS19QQVRIX0NPTkZJRwkJCTB4MzIwQQorI2RlZmluZSBQSV9JVEVNX0tfUEFUSF9JTkRFWAkJCTB4MzIwQgorI2RlZmluZSBQSV9JVEVNX0tfUEFUSF9DT05GSUdVUkFUSU9OIAkweDMyMTIKKyNkZWZpbmUgUElfSVRFTV9LX1BBVEhfVFZYX0xCCQkJMHgzMjE1CisjZGVmaW5lIFBJX0lURU1fS19QQVRIX1RfTUFYX0xCCQkJMHgzMjE2CisjZGVmaW5lIFBJX0lURU1fS19QQVRIX01BWF9UX1JFUQkJMHgzMjE3CisKKyNkZWZpbmUgUElfR1JQX0tfUE9SVF9DT05GSUcJCQkweDQwMEEKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfTVlfVFlQRQkJCTB4NDAwQworI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9OQlJfVFlQRQkJCTB4NDAwRAorI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9DT05OX1BPTFMJCTB4NDAwRQorI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9NQUNfSU5ESUNBVEVEICAJMHg0MDBGCisjZGVmaW5lIFBJX0lURU1fS19QT1JUX0NVUlJFTlRfUEFUSAkJMHg0MDEwCisjZGVmaW5lIFBJX0lURU1fS19QT1JUX1JFUV9QQVRIUwkJMHg0MDExCisjZGVmaW5lIFBJX0lURU1fS19QT1JUX01BQ19QTEFDRU1FTlQgCTB4NDAxMgorI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9BVkFJTF9QQVRIUwkJMHg0MDEzCisjZGVmaW5lIFBJX0lURU1fS19QT1JUX1BNRF9DTEFTUwkJMHg0MDE2CisjZGVmaW5lIFBJX0lURU1fS19QT1JUX0NPTk5fQ0FQUwkJMHg0MDE3CisjZGVmaW5lIFBJX0lURU1fS19QT1JUX0lOREVYCQkJMHg0MDFECisKKyNkZWZpbmUgUElfR1JQX0tfUE9SVF9PUEVSQVRJT04JCQkweDQwMUUKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfQlNfRkxBRwkJIAkweDQwMjEKKworI2RlZmluZSBQSV9HUlBfS19QT1JUX0VSUl9DTlRSUwkJCTB4NDAyOAorI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9MQ1RfRkFJTF9DVAkgCTB4NDAyQQorCisjZGVmaW5lIFBJX0dSUF9LX1BPUlRfTEVSCQkJICAJMHg0MDMyCisjZGVmaW5lIFBJX0lURU1fS19QT1JUX0xFUl9FU1RJTUFURQkJMHg0MDMzCisjZGVmaW5lIFBJX0lURU1fS19QT1JUX0xFTV9SRUpfQ1QJCTB4NDAzNAorI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9MRU1fQ1QJCQkweDQwMzUKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfTEVSX0NVVE9GRgkJMHg0MDNBCisjZGVmaW5lIFBJX0lURU1fS19QT1JUX0xFUl9BTEFSTQkJMHg0MDNCCisKKyNkZWZpbmUgUElfR1JQX0tfUE9SVF9TVEFUVVMJCQkweDQwM0MKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfQ09OTkVDVF9TVEFURQkweDQwM0QKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfUENNX1NUQVRFCQkweDQwM0UKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfUENfV0lUSEhPTEQJCTB4NDAzRgorI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9MRVJfRkxBRwkJCTB4NDA0MAorI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9IV19QUkVTRU5UCQkweDQwNDEKKworI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9BQ1QJCQkJMHg0MDQ2CisKKy8qIEFkZHJfRmlsdGVyX1NldCBSZXF1ZXN0ICovCisKKyNkZWZpbmUgUElfQ01EX0FERFJfRklMVEVSX0tfU0laRSAgIDYyCisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1VJTlQzMgljbWRfdHlwZTsKKwlQSV9MQU5fQUREUgllbnRyeVtQSV9DTURfQUREUl9GSUxURVJfS19TSVpFXTsKKwl9IFBJX0NNRF9BRERSX0ZJTFRFUl9TRVRfUkVROworCisvKiBBZGRyX0ZpbHRlcl9TZXQgUmVzcG9uc2UgKi8KKwordHlwZWRlZiBzdHJ1Y3QgCisJeworCVBJX1JTUF9IRUFERVIgICBoZWFkZXI7CQorCX0gUElfQ01EX0FERFJfRklMVEVSX1NFVF9SU1A7CisKKy8qIEFkZHJfRmlsdGVyX0dldCBSZXF1ZXN0ICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1VJTlQzMgljbWRfdHlwZTsKKwl9IFBJX0NNRF9BRERSX0ZJTFRFUl9HRVRfUkVROworCisvKiBBZGRyX0ZpbHRlcl9HZXQgUmVzcG9uc2UgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfUlNQX0hFQURFUiAgIGhlYWRlcjsJCisJUElfTEFOX0FERFIJCWVudHJ5W1BJX0NNRF9BRERSX0ZJTFRFUl9LX1NJWkVdOworCX0gUElfQ01EX0FERFJfRklMVEVSX0dFVF9SU1A7CisKKy8qIFN0YXR1c19DaGFyc19HZXQgUmVxdWVzdCAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9VSU5UMzIgIGNtZF90eXBlOworCX0gUElfQ01EX1NUQVRVU19DSEFSU19HRVRfUkVROworCisvKiBTdGF0dXNfQ2hhcnNfR2V0IFJlc3BvbnNlICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1JTUF9IRUFERVIgICBoZWFkZXI7CQorCVBJX1NUQVRJT05fSUQgICBzdGF0aW9uX2lkOwkJCQkJCS8qIFN0YXRpb24gKi8KKwlQSV9VSU5UMzIJCXN0YXRpb25fdHlwZTsKKwlQSV9VSU5UMzIJCXNtdF92ZXJfaWQ7CisJUElfVUlOVDMyCQlzbXRfdmVyX2lkX21heDsKKwlQSV9VSU5UMzIJCXNtdF92ZXJfaWRfbWluOworCVBJX1VJTlQzMgkJc3RhdGlvbl9zdGF0ZTsKKwlQSV9MQU5fQUREUgkJbGlua19hZGRyOwkJCQkJCS8qIExpbmsgKi8KKwlQSV9VSU5UMzIJCXRfcmVxOworCVBJX1VJTlQzMgkJdHZ4OworCVBJX1VJTlQzMgkJdG9rZW5fdGltZW91dDsKKwlQSV9VSU5UMzIJCXB1cmdlcl9lbmI7CisJUElfVUlOVDMyCQlsaW5rX3N0YXRlOworCVBJX1VJTlQzMgkJdG5lZzsKKwlQSV9VSU5UMzIJCWR1cF9hZGRyX2ZsYWc7CisJUElfTEFOX0FERFIJCXVuYTsKKwlQSV9MQU5fQUREUgkJdW5hX29sZDsKKwlQSV9VSU5UMzIJCXVuX2R1cF9hZGRyX2ZsYWc7CisJUElfTEFOX0FERFIJCWRuYTsKKwlQSV9MQU5fQUREUgkJZG5hX29sZDsKKwlQSV9VSU5UMzIJCXB1cmdlcl9zdGF0ZTsKKwlQSV9VSU5UMzIJCWZjaV9tb2RlOworCVBJX1VJTlQzMgkJZXJyb3JfcmVhc29uOworCVBJX1VJTlQzMgkJbG9vcGJhY2s7CisJUElfVUlOVDMyCQlyaW5nX2xhdGVuY3k7CisJUElfTEFOX0FERFIJCWxhc3RfZGlyX2JlYWNvbl9zYTsKKwlQSV9MQU5fQUREUgkJbGFzdF9kaXJfYmVhY29uX3VuYTsKKwlQSV9VSU5UMzIJCXBoeV90eXBlW1BJX1BIWV9LX01BWF07CQkJLyogUGh5ICovCisJUElfVUlOVDMyCQlwbWRfdHlwZVtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJbGVtX3RocmVzaG9sZFtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcGh5X3N0YXRlW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQluYm9yX3BoeV90eXBlW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlsaW5rX2Vycm9yX2VzdFtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJYnJva2VuX3JlYXNvbltQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcmVqZWN0X3JlYXNvbltQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJY250cl9pbnRlcnZhbDsJCQkJCS8qIE1pc2NlbGxhbmVvdXMgKi8KKwlQSV9VSU5UMzIJCW1vZHVsZV9yZXY7CisJUElfVUlOVDMyCQlmaXJtd2FyZV9yZXY7CisJUElfVUlOVDMyCQltb3BfZGV2aWNlX3R5cGU7CisJUElfVUlOVDMyCQlwaHlfbGVkW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlmbHVzaF90aW1lOworCX0gUElfQ01EX1NUQVRVU19DSEFSU19HRVRfUlNQOworCisvKiBGRERJX01JQl9HZXQgUmVxdWVzdCAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9VSU5UMzIgIGNtZF90eXBlOworCX0gUElfQ01EX0ZERElfTUlCX0dFVF9SRVE7CisKKy8qIEZERElfTUlCX0dldCBSZXNwb25zZSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9SU1BfSEVBREVSICAgaGVhZGVyOwkJCisKKwkvKiBTTVQgR1JPVVAgKi8KKworCVBJX1NUQVRJT05fSUQgICBzbXRfc3RhdGlvbl9pZDsJCQkKKwlQSV9VSU5UMzIJCXNtdF9vcF92ZXJzaW9uX2lkOworCVBJX1VJTlQzMgkJc210X2hpX3ZlcnNpb25faWQ7CisJUElfVUlOVDMyCQlzbXRfbG9fdmVyc2lvbl9pZDsKKwlQSV9VSU5UMzIJCXNtdF9tYWNfY3Q7CQkJCQorCVBJX1VJTlQzMgkJc210X25vbl9tYXN0ZXJfY3Q7CQkJCisJUElfVUlOVDMyCQlzbXRfbWFzdGVyX2N0OwkJCQkKKwlQSV9VSU5UMzIJCXNtdF9wYXRoc19hdmFpbGFibGU7CQkJCisJUElfVUlOVDMyCQlzbXRfY29uZmlnX2NhcGFiaWxpdGllczsJCQorCVBJX1VJTlQzMgkJc210X2NvbmZpZ19wb2xpY3k7CQkKKwlQSV9VSU5UMzIJCXNtdF9jb25uZWN0aW9uX3BvbGljeTsJCQorCVBJX1VJTlQzMgkJc210X3Rfbm90aWZ5OwkKKwlQSV9VSU5UMzIJCXNtdF9zdGF0dXNfcmVwb3J0aW5nOworCVBJX1VJTlQzMgkJc210X2VjbV9zdGF0ZTsJCisJUElfVUlOVDMyCQlzbXRfY2Zfc3RhdGU7CQorCVBJX1VJTlQzMgkJc210X2hvbGRfc3RhdGU7CQkKKwlQSV9VSU5UMzIJCXNtdF9yZW1vdGVfZGlzY29ubmVjdF9mbGFnOworCVBJX1VJTlQzMgkJc210X3N0YXRpb25fYWN0aW9uOwkJCQorCisJLyogTUFDIEdST1VQICovCisKKwlQSV9VSU5UMzIJCW1hY19mcmFtZV9zdGF0dXNfY2FwYWJpbGl0aWVzOwkKKwlQSV9VSU5UMzIJCW1hY190X21heF9ncmVhdGVzdF9sb3dlcl9ib3VuZDsKKwlQSV9VSU5UMzIJCW1hY190dnhfZ3JlYXRlc3RfbG93ZXJfYm91bmQ7CisJUElfVUlOVDMyCQltYWNfcGF0aHNfYXZhaWxhYmxlOworCVBJX1VJTlQzMgkJbWFjX2N1cnJlbnRfcGF0aDsKKwlQSV9MQU5fQUREUgkJbWFjX3Vwc3RyZWFtX25icjsJCQkKKwlQSV9MQU5fQUREUgkJbWFjX29sZF91cHN0cmVhbV9uYnI7CQkKKwlQSV9VSU5UMzIJCW1hY19kdXBfYWRkcl90ZXN0OwkJCQorCVBJX1VJTlQzMgkJbWFjX3BhdGhzX3JlcXVlc3RlZDsKKwlQSV9VSU5UMzIJCW1hY19kb3duc3RyZWFtX3BvcnRfdHlwZTsKKwlQSV9MQU5fQUREUgkJbWFjX3NtdF9hZGRyZXNzOwkJCQorCVBJX1VJTlQzMgkJbWFjX3RfcmVxOwkJCQkKKwlQSV9VSU5UMzIJCW1hY190X25lZzsKKwlQSV9VSU5UMzIJCW1hY190X21heDsJCQkJCisJUElfVUlOVDMyCQltYWNfdHZ4X3ZhbHVlOwkJCQorCVBJX1VJTlQzMgkJbWFjX3RfbWluOwkJCQkKKwlQSV9VSU5UMzIJCW1hY19jdXJyZW50X2ZyYW1lX3N0YXR1czsKKwkvKgkJCSAgCW1hY19mcmFtZV9jdHMgCQkJKi8KKwkvKiAJCQkJbWFjX2Vycm9yX2N0cyAJCQkqLworCS8qIAkJICAgCQltYWNfbG9zdF9jdHMgCQkJKi8KKwlQSV9VSU5UMzIJCW1hY19mcmFtZV9lcnJvcl90aHJlc2hvbGQ7CQkKKwlQSV9VSU5UMzIJCW1hY19mcmFtZV9lcnJvcl9yYXRpbzsJCQorCVBJX1VJTlQzMgkJbWFjX3JtdF9zdGF0ZTsKKwlQSV9VSU5UMzIJCW1hY19kYV9mbGFnOworCVBJX1VJTlQzMgkJbWFjX3VuYV9kYV9mbGFnOwkJCQorCVBJX1VJTlQzMgkJbWFjX2ZyYW1lX2NvbmRpdGlvbjsKKwlQSV9VSU5UMzIJCW1hY19jaGlwX3NldDsJCQkKKwlQSV9VSU5UMzIJCW1hY19hY3Rpb247CQkJCQorCisJLyogUEFUSCBHUk9VUCA9PiBEb2VzIG5vdCBuZWVkIHRvIGJlIGltcGxlbWVudGVkICovCisKKwkvKiBQT1JUIEdST1VQICovCisKKwlQSV9VSU5UMzIJCXBvcnRfcGNfdHlwZVtQSV9QSFlfS19NQVhdOwkJCQorCVBJX1VJTlQzMgkJcG9ydF9wY19uZWlnaGJvcltQSV9QSFlfS19NQVhdOwkJCQorCVBJX1VJTlQzMgkJcG9ydF9jb25uZWN0aW9uX3BvbGljaWVzW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X3JlbW90ZV9tYWNfaW5kaWNhdGVkW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X2NlX3N0YXRlW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X3BhdGhzX3JlcXVlc3RlZFtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9tYWNfcGxhY2VtZW50W1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X2F2YWlsYWJsZV9wYXRoc1tQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9tYWNfbG9vcF90aW1lW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X3RiX21heFtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9ic19mbGFnW1BJX1BIWV9LX01BWF07CisJLyoJCQkJcG9ydF9sY3RfZmFpbF9jdHNbUElfUEhZX0tfTUFYXTsJKi8KKwlQSV9VSU5UMzIJCXBvcnRfbGVyX2VzdGltYXRlW1BJX1BIWV9LX01BWF07CQkJCQorCS8qCQkJCXBvcnRfbGVtX3JlamVjdF9jdHNbUElfUEhZX0tfTUFYXTsJKi8KKwkvKgkJCQlwb3J0X2xlbV9jdHNbUElfUEhZX0tfTUFYXTsJCSovCisJUElfVUlOVDMyCQlwb3J0X2xlcl9jdXRvZmZbUElfUEhZX0tfTUFYXTsJCQkJCisJUElfVUlOVDMyCQlwb3J0X2xlcl9hbGFybVtQSV9QSFlfS19NQVhdOwkJCQkKKwlQSV9VSU5UMzIJCXBvcnRfY29ubmVjdF9zdGF0ZVtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9wY21fc3RhdGVbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfcGNfd2l0aGhvbGRbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfbGVyX2NvbmRpdGlvbltQSV9QSFlfS19NQVhdOwkJCQkKKwlQSV9VSU5UMzIJCXBvcnRfY2hpcF9zZXRbUElfUEhZX0tfTUFYXTsJCQkJCisJUElfVUlOVDMyCQlwb3J0X2FjdGlvbltQSV9QSFlfS19NQVhdOwkJCQkKKworCS8qIEFUVEFDSE1FTlQgR1JPVVAgKi8KKworCVBJX1VJTlQzMgkJYXR0YWNobWVudF9jbGFzczsKKwlQSV9VSU5UMzIJCWF0dGFjaG1lbnRfb2JfcHJlc2VudDsKKwlQSV9VSU5UMzIJCWF0dGFjaG1lbnRfaW1heF9leHBpcmF0aW9uOworCVBJX1VJTlQzMgkJYXR0YWNobWVudF9pbnNlcnRlZF9zdGF0dXM7CisJUElfVUlOVDMyCQlhdHRhY2htZW50X2luc2VydF9wb2xpY3k7CisKKwkvKiBDSElQIFNFVCBHUk9VUCA9PiBEb2VzIG5vdCBuZWVkIHRvIGJlIGltcGxlbWVudGVkICovCisKKwl9IFBJX0NNRF9GRERJX01JQl9HRVRfUlNQOworCisvKiBERUNfRXh0X01JQl9HZXQgUmVxdWVzdCAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9VSU5UMzIgIGNtZF90eXBlOworCX0gUElfQ01EX0RFQ19FWFRfTUlCX0dFVF9SRVE7CisKKy8qIERFQ19FeHRfTUlCX0dldCAoZWZkZGkgYW5kIGVmZHggZ3JvdXBzIG9ubHkpIFJlc3BvbnNlICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1JTUF9IRUFERVIgICBoZWFkZXI7CQkKKworCS8qIFNNVCBHUk9VUCAqLworCisJUElfVUlOVDMyCQllc210X3N0YXRpb25fdHlwZTsKKworCS8qIE1BQyBHUk9VUCAqLworCisJUElfVUlOVDMyCQllbWFjX2xpbmtfc3RhdGU7CQkJCisJUElfVUlOVDMyCQllbWFjX3JpbmdfcHVyZ2VyX3N0YXRlOworCVBJX1VJTlQzMgkJZW1hY19yaW5nX3B1cmdlcl9lbmFibGU7CisJUElfVUlOVDMyCQllbWFjX2ZyYW1lX3N0cmlwX21vZGU7CisJUElfVUlOVDMyCQllbWFjX3JpbmdfZXJyb3JfcmVhc29uOworCVBJX1VJTlQzMgkJZW1hY191cF9uYnJfZHVwX2FkZHJfZmxhZzsKKwlQSV9VSU5UMzIJCWVtYWNfcmVzdHJpY3RlZF90b2tlbl90aW1lb3V0OworCisJLyogUE9SVCBHUk9VUCAqLworCisJUElfVUlOVDMyCQllcG9ydF9wbWRfdHlwZVtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJZXBvcnRfcGh5X3N0YXRlW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQllcG9ydF9yZWplY3RfcmVhc29uW1BJX1BIWV9LX01BWF07CisKKwkvKiBGRFggKEZ1bGwtRHVwbGV4KSBHUk9VUCAqLworCisJUElfVUlOVDMyCQllZmR4X2VuYWJsZTsJCQkJLyogVmFsaWQgb25seSBpbiBTTVQgNy4zICovCisJUElfVUlOVDMyCQllZmR4X29wOwkJCQkJLyogVmFsaWQgb25seSBpbiBTTVQgNy4zICovCisJUElfVUlOVDMyCQllZmR4X3N0YXRlOwkJCQkJLyogVmFsaWQgb25seSBpbiBTTVQgNy4zICovCisKKwl9IFBJX0NNRF9ERUNfRVhUX01JQl9HRVRfUlNQOworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9DTlRSCQl0cmFjZXNfcmN2ZDsJCQkJCS8qIFN0YXRpb24gKi8KKwlQSV9DTlRSCQlmcmFtZV9jbnQ7CQkJCQkJLyogTGluayAqLworCVBJX0NOVFIJCWVycm9yX2NudDsKKwlQSV9DTlRSCQlsb3N0X2NudDsKKwlQSV9DTlRSCQlvY3RldHNfcmN2ZDsKKwlQSV9DTlRSCQlvY3RldHNfc2VudDsKKwlQSV9DTlRSCQlwZHVzX3JjdmQ7CisJUElfQ05UUgkJcGR1c19zZW50OworCVBJX0NOVFIJCW1jYXN0X29jdGV0c19yY3ZkOworCVBJX0NOVFIJCW1jYXN0X29jdGV0c19zZW50OworCVBJX0NOVFIJCW1jYXN0X3BkdXNfcmN2ZDsKKwlQSV9DTlRSCQltY2FzdF9wZHVzX3NlbnQ7CisJUElfQ05UUgkJeG10X3VuZGVycnVuczsKKwlQSV9DTlRSCQl4bXRfZmFpbHVyZXM7CisJUElfQ05UUgkJYmxvY2tfY2hlY2tfZXJyb3JzOworCVBJX0NOVFIJCWZyYW1lX3N0YXR1c19lcnJvcnM7CisJUElfQ05UUgkJcGR1X2xlbmd0aF9lcnJvcnM7CisJUElfQ05UUgkJcmN2X292ZXJydW5zOworCVBJX0NOVFIJCXVzZXJfYnVmZl91bmF2YWlsYWJsZTsKKwlQSV9DTlRSCQlpbml0c19pbml0aWF0ZWQ7CisJUElfQ05UUgkJaW5pdHNfcmN2ZDsKKwlQSV9DTlRSCQliZWFjb25zX2luaXRpYXRlZDsKKwlQSV9DTlRSCQlkdXBfYWRkcnM7CisJUElfQ05UUgkJZHVwX3Rva2VuczsKKwlQSV9DTlRSCQlwdXJnZV9lcnJvcnM7CisJUElfQ05UUgkJZmNpX3N0cmlwX2Vycm9yczsKKwlQSV9DTlRSCQl0cmFjZXNfaW5pdGlhdGVkOworCVBJX0NOVFIJCWRpcmVjdGVkX2JlYWNvbnNfcmN2ZDsKKwlQSV9DTlRSCQllbWFjX2ZyYW1lX2FsaWdubWVudF9lcnJvcnM7CisJUElfQ05UUgkJZWJ1ZmZfZXJyb3JzW1BJX1BIWV9LX01BWF07CQkvKiBQaHkgKi8KKwlQSV9DTlRSCQlsY3RfcmVqZWN0c1tQSV9QSFlfS19NQVhdOworCVBJX0NOVFIJCWxlbV9yZWplY3RzW1BJX1BIWV9LX01BWF07CisJUElfQ05UUgkJbGlua19lcnJvcnNbUElfUEhZX0tfTUFYXTsKKwlQSV9DTlRSCQljb25uZWN0aW9uc1tQSV9QSFlfS19NQVhdOworCVBJX0NOVFIJCWNvcGllZF9jbnQ7CQkJIAkJCS8qIFZhbGlkIG9ubHkgaWYgdXNpbmcgU01UIDcuMyAqLworCVBJX0NOVFIJCXRyYW5zbWl0X2NudDsJCQkJCS8qIFZhbGlkIG9ubHkgaWYgdXNpbmcgU01UIDcuMyAqLworCVBJX0NOVFIJCXRva2VuczsKKwl9IFBJX0NOVFJfQkxLOworCisvKiBDb3VudGVyc19HZXQgUmVxdWVzdCAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9VSU5UMzIgIGNtZF90eXBlOworCX0gUElfQ01EX0NOVFJTX0dFVF9SRVE7CisKKy8qIENvdW50ZXJzX0dldCBSZXNwb25zZSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9SU1BfSEVBREVSICAgaGVhZGVyOwkKKwlQSV9DTlRSCQl0aW1lX3NpbmNlX3Jlc2V0OwkJCQorCVBJX0NOVFJfQkxLCQljbnRyczsJCQkJCisJfSBQSV9DTURfQ05UUlNfR0VUX1JTUDsKKworLyogQ291bnRlcnNfU2V0IFJlcXVlc3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfVUlOVDMyCWNtZF90eXBlOworCVBJX0NOVFJfQkxLCWNudHJzOwkJCQkKKwl9IFBJX0NNRF9DTlRSU19TRVRfUkVROworCisvKiBDb3VudGVyc19TZXQgUmVzcG9uc2UgKi8KKwordHlwZWRlZiBzdHJ1Y3QgCisJeworCVBJX1JTUF9IRUFERVIgICBoZWFkZXI7CQorCX0gUElfQ01EX0NOVFJTX1NFVF9SU1A7CisKKy8qIEVycm9yX0xvZ19DbGVhciBSZXF1ZXN0ICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1VJTlQzMiAgY21kX3R5cGU7CisJfSBQSV9DTURfRVJST1JfTE9HX0NMRUFSX1JFUTsKKworLyogRXJyb3JfTG9nX0NsZWFyIFJlc3BvbnNlICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1JTUF9IRUFERVIgICBoZWFkZXI7CQorCX0gUElfQ01EX0VSUk9SX0xPR19DTEVBUl9SU1A7CisKKy8qIEVycm9yX0xvZ19HZXQgUmVxdWVzdCAqLworCisjZGVmaW5lIFBJX0xPR19FTlRSWV9LX0lOREVYX01JTgkwCQkvKiBNaW5pbXVtIGluZGV4IGZvciBlbnRyeSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9VSU5UMzIgIGNtZF90eXBlOworCVBJX1VJTlQzMiAgZW50cnlfaW5kZXg7CisJfSBQSV9DTURfRVJST1JfTE9HX0dFVF9SRVE7CisKKy8qIEVycm9yX0xvZ19HZXQgUmVzcG9uc2UgKi8KKworI2RlZmluZSBQSV9LX0xPR19GV19TSVpFCQkJMTExCQkvKiBNYXggbnVtYmVyIG9mIGZ3IGxvbmd3b3JkcyAqLworI2RlZmluZSBQSV9LX0xPR19ESUFHX1NJWkUJIAkJNgkJLyogTWF4IG51bWJlciBvZiBkaWFnIGxvbmd3b3JkcyAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlzdHJ1Y3QgCisJCXsKKwkJUElfVUlOVDMyCWZydV9pbXBfbWFzazsKKwkJUElfVUlOVDMyCXRlc3RfaWQ7CisJCVBJX1VJTlQzMglyZXNlcnZlZFtQSV9LX0xPR19ESUFHX1NJWkVdOworCQl9IGRpYWc7CisJUElfVUlOVDMyCQlmd1tQSV9LX0xPR19GV19TSVpFXTsKKwl9IFBJX0xPR19FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfUlNQX0hFQURFUiAgIGhlYWRlcjsJCisJUElfVUlOVDMyCQlldmVudF9zdGF0dXM7CisJUElfVUlOVDMyCQljYWxsZXJfaWQ7CisJUElfVUlOVDMyCQl0aW1lc3RhbXBfbDsKKwlQSV9VSU5UMzIJCXRpbWVzdGFtcF9oOworCVBJX1VJTlQzMgkJd3JpdGVfY291bnQ7CisJUElfTE9HX0VOVFJZCWVudHJ5X2luZm87CisJfSBQSV9DTURfRVJST1JfTE9HX0dFVF9SU1A7CisKKy8qIERlZmluZSBlcnJvciBsb2cgcmVsYXRlZCBjb25zdGFudHMgYW5kIHR5cGVzLgkJCQkJKi8KKy8qICAgTm90IGFsbCBvZiB0aGUgY2FsbGVyIGlkJ3MgY2FuIG9jY3VyLiAgVGhlIG9ubHkgb25lcyBjdXJyZW50bHkgKi8KKy8qICAgaW1wbGVtZW50ZWQgYXJlOiBub25lLCBzZWxmdGVzdCwgbWZnLCBmdywgY29uc29sZQkJCQkqLworCisjZGVmaW5lIFBJX0xPR19FVkVOVF9TVEFUVVNfS19WQUxJRAkJMAkvKiBWYWxpZCBFdmVudCBTdGF0dXMgCQkqLworI2RlZmluZSBQSV9MT0dfRVZFTlRfU1RBVFVTX0tfSU5WQUxJRAkxCS8qIEludmFsaWQgRXZlbnQgU3RhdHVzIAkqLworI2RlZmluZSBQSV9MT0dfQ0FMTEVSX0lEX0tfTk9ORQkJIAkwCS8qIE5vIGNhbGxlciAJCQkJKi8KKyNkZWZpbmUgUElfTE9HX0NBTExFUl9JRF9LX1NFTEZURVNUCSAJMQkvKiBOb3JtYWwgcG93ZXItdXAgc2VsZnRlc3QgKi8JCQkKKyNkZWZpbmUgUElfTE9HX0NBTExFUl9JRF9LX01GRwkJIAkyCS8qIE1mZyBwb3dlci11cCBzZWxmdGVzdCAJKi8KKyNkZWZpbmUgUElfTE9HX0NBTExFUl9JRF9LX09OTElORQkJMwkvKiBPbi1saW5lIGRpYWdub3N0aWNzIAkJKi8KKyNkZWZpbmUgUElfTE9HX0NBTExFUl9JRF9LX0hXCQkJNAkvKiBIYXJkd2FyZSAJCQkJKi8KKyNkZWZpbmUgUElfTE9HX0NBTExFUl9JRF9LX0ZXCQkJNQkvKiBGaXJtd2FyZSAJCQkJKi8KKyNkZWZpbmUgUElfTE9HX0NBTExFUl9JRF9LX0NOU19IVwkJNgkvKiBDTlMgZmlybXdhcmUgCQkJKi8KKyNkZWZpbmUgUElfTE9HX0NBTExFUl9JRF9LX0NOU19GVwkJNwkvKiBDTlMgaGFyZHdhcmUgCQkJKi8KKyNkZWZpbmUgUElfTE9HX0NBTExFUl9JRF9LX0NPTlNPTEUJIAk4ICAgLyogQ29uc29sZSBDYWxsZXIgSWQgCQkqLworCisvKgorICogIFBsYWNlIGFsbCBETUEgY29tbWFuZHMgaW4gdGhlIGZvbGxvd2luZyByZXF1ZXN0IGFuZCByZXNwb25zZSBzdHJ1Y3R1cmVzCisgKiAgdG8gc2ltcGxpZnkgY29kZS4KKyAqLworCit0eXBlZGVmIHVuaW9uCisJeworCVBJX1VJTlQzMgkJCQkJY21kX3R5cGU7CisJUElfQ01EX1NUQVJUX1JFUQkJCXN0YXJ0OworCVBJX0NNRF9GSUxURVJTX1NFVF9SRVEJCWZpbHRlcl9zZXQ7CisJUElfQ01EX0ZJTFRFUlNfR0VUX1JFUQkJZmlsdGVyX2dldDsKKwlQSV9DTURfQ0hBUlNfU0VUX1JFUQkJY2hhcl9zZXQ7CisJUElfQ01EX0FERFJfRklMVEVSX1NFVF9SRVEJYWRkcl9maWx0ZXJfc2V0OworCVBJX0NNRF9BRERSX0ZJTFRFUl9HRVRfUkVRCWFkZHJfZmlsdGVyX2dldDsKKwlQSV9DTURfU1RBVFVTX0NIQVJTX0dFVF9SRVEJc3RhdF9jaGFyX2dldDsKKwlQSV9DTURfQ05UUlNfR0VUX1JFUQkJY250cnNfZ2V0OworCVBJX0NNRF9DTlRSU19TRVRfUkVRCQljbnRyc19zZXQ7CisJUElfQ01EX0VSUk9SX0xPR19DTEVBUl9SRVEJZXJyb3JfbG9nX2NsZWFyOworCVBJX0NNRF9FUlJPUl9MT0dfR0VUX1JFUQllcnJvcl9sb2dfcmVhZDsKKwlQSV9DTURfU05NUF9TRVRfUkVRCQkJc25tcF9zZXQ7CisJUElfQ01EX0ZERElfTUlCX0dFVF9SRVEJCWZkZGlfbWliX2dldDsKKwlQSV9DTURfREVDX0VYVF9NSUJfR0VUX1JFUQlkZWNfbWliX2dldDsKKwlQSV9DTURfU01UX01JQl9TRVRfUkVRCQlzbXRfbWliX3NldDsKKwlQSV9DTURfU01UX01JQl9HRVRfUkVRCQlzbXRfbWliX2dldDsKKwljaGFyCQkJCQkJcGFkW1BJX0NNRF9SRVFfS19TSVpFX01BWF07IAorCX0gUElfRE1BX0NNRF9SRVE7CisKK3R5cGVkZWYgdW5pb24KKwl7CisJUElfUlNQX0hFQURFUgkJCQloZWFkZXI7CisJUElfQ01EX1NUQVJUX1JTUAkJCXN0YXJ0OworCVBJX0NNRF9GSUxURVJTX1NFVF9SU1AJCWZpbHRlcl9zZXQ7CisJUElfQ01EX0ZJTFRFUlNfR0VUX1JTUAkJZmlsdGVyX2dldDsKKwlQSV9DTURfQ0hBUlNfU0VUX1JTUAkJY2hhcl9zZXQ7CisJUElfQ01EX0FERFJfRklMVEVSX1NFVF9SU1AJYWRkcl9maWx0ZXJfc2V0OworCVBJX0NNRF9BRERSX0ZJTFRFUl9HRVRfUlNQCWFkZHJfZmlsdGVyX2dldDsKKwlQSV9DTURfU1RBVFVTX0NIQVJTX0dFVF9SU1AJc3RhdF9jaGFyX2dldDsKKwlQSV9DTURfQ05UUlNfR0VUX1JTUAkJY250cnNfZ2V0OworCVBJX0NNRF9DTlRSU19TRVRfUlNQCQljbnRyc19zZXQ7CisJUElfQ01EX0VSUk9SX0xPR19DTEVBUl9SU1AJZXJyb3JfbG9nX2NsZWFyOworCVBJX0NNRF9FUlJPUl9MT0dfR0VUX1JTUAllcnJvcl9sb2dfZ2V0OworCVBJX0NNRF9TTk1QX1NFVF9SU1AJCQlzbm1wX3NldDsKKwlQSV9DTURfRkRESV9NSUJfR0VUX1JTUAkJZmRkaV9taWJfZ2V0OworCVBJX0NNRF9ERUNfRVhUX01JQl9HRVRfUlNQCWRlY19taWJfZ2V0OworCVBJX0NNRF9TTVRfTUlCX1NFVF9SU1AJCXNtdF9taWJfc2V0OworCVBJX0NNRF9TTVRfTUlCX0dFVF9SU1AJCXNtdF9taWJfZ2V0OworCWNoYXIJCQkJCQlwYWRbUElfQ01EX1JTUF9LX1NJWkVfTUFYXTsgCisJfSBQSV9ETUFfQ01EX1JTUDsKKwordHlwZWRlZiB1bmlvbgorCXsKKwlQSV9ETUFfQ01EX1JFUQlyZXF1ZXN0OworCVBJX0RNQV9DTURfUlNQCXJlc3BvbnNlOworCX0gUElfRE1BX0NNRF9CVUZGRVI7CisKKworLyogRGVmaW5lIGZvcm1hdCBvZiBDb25zdW1lciBCbG9jayAocmVzaWRlbnQgaW4gaG9zdCBtZW1vcnkpICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCXZvbGF0aWxlIFBJX1VJTlQzMgl4bXRfcmN2X2RhdGE7CisJdm9sYXRpbGUgUElfVUlOVDMyCXJlc2VydmVkXzE7CisJdm9sYXRpbGUgUElfVUlOVDMyCXNtdF9ob3N0OworCXZvbGF0aWxlIFBJX1VJTlQzMglyZXNlcnZlZF8yOworCXZvbGF0aWxlIFBJX1VJTlQzMgl1bnNvbDsKKwl2b2xhdGlsZSBQSV9VSU5UMzIJcmVzZXJ2ZWRfMzsKKwl2b2xhdGlsZSBQSV9VSU5UMzIJY21kX3JzcDsKKwl2b2xhdGlsZSBQSV9VSU5UMzIJcmVzZXJ2ZWRfNDsKKwl2b2xhdGlsZSBQSV9VSU5UMzIJY21kX3JlcTsKKwl2b2xhdGlsZSBQSV9VSU5UMzIJcmVzZXJ2ZWRfNTsKKwl9IFBJX0NPTlNVTUVSX0JMT0NLOworCisjZGVmaW5lIFBJX0NPTlNfTV9SQ1ZfSU5ERVgJCQkweDAwMDAwMEZGCisjZGVmaW5lIFBJX0NPTlNfTV9YTVRfSU5ERVgJCQkweDAwRkYwMDAwCisjZGVmaW5lIFBJX0NPTlNfVl9SQ1ZfSU5ERVgJCQkwCisjZGVmaW5lIFBJX0NPTlNfVl9YTVRfSU5ERVgJCQkxNgorCisvKiBPZmZzZXRzIGludG8gY29uc3VtZXIgYmxvY2sgKi8KKworI2RlZmluZSBQSV9DT05TX0JMS19LX1hNVF9SQ1YJCTB4MDAKKyNkZWZpbmUgUElfQ09OU19CTEtfS19TTVRfSE9TVAkJMHgwOAorI2RlZmluZSBQSV9DT05TX0JMS19LX1VOU09MCQkJMHgxMAorI2RlZmluZSBQSV9DT05TX0JMS19LX0NNRF9SU1AJCTB4MTgKKyNkZWZpbmUgUElfQ09OU19CTEtfS19DTURfUkVRCQkweDIwCisKKy8qIE9mZnNldHMgaW50byBkZXNjcmlwdG9yIGJsb2NrICovCisKKyNkZWZpbmUgUElfREVTQ1JfQkxLX0tfUkNWX0RBVEEJCTB4MDAwMAorI2RlZmluZSBQSV9ERVNDUl9CTEtfS19YTVRfREFUQQkJMHgwODAwCisjZGVmaW5lIFBJX0RFU0NSX0JMS19LX1NNVF9IT1NUIAkweDEwMDAKKyNkZWZpbmUgUElfREVTQ1JfQkxLX0tfVU5TT0wJCTB4MTIwMAorI2RlZmluZSBQSV9ERVNDUl9CTEtfS19DTURfUlNQCQkweDEyODAKKyNkZWZpbmUgUElfREVTQ1JfQkxLX0tfQ01EX1JFUQkJMHgxMzAwCQorCisvKiBEZWZpbmUgZm9ybWF0IG9mIGEgcmN2IGRlc2NyIChSY3YgRGF0YSwgQ21kIFJzcCwgVW5zb2xpY2l0ZWQsIFNNVCBIb3N0KSAgICovCisvKiAgIE5vdGUgYSBmaWVsZCBoYXMgYmVlbiBhZGRlZCBmb3IgbGF0ZXIgdmVyc2lvbnMgb2YgdGhlIFBEUSB0byBhbGxvdyBmb3IgICovCisvKiAgIGZpbmVyIGdyYW51bGFyaXR5IG9mIHRoZSByY3YgYnVmZmVyIGFsaWdubWVudC4gIEZvciBiYWNrd2FyZHMJCSAJICovCisvKiAgIGNvbXBhdGliaWxpdHksIHRoZSB0d28gYml0cyAod2hpY2ggYWxsb3cgdGhlIHJjdiBidWZmZXIgdG8gYmUgbG9uZ3dvcmQgICovCisvKiAgIGFsaWduZWQpIGhhdmUgYmVlbiBhZGRlZCBhdCB0aGUgTUJaIGJpdHMuICBUbyBzdXBwb3J0IHByZXZpb3VzIGRyaXZlcnMsICovCisvKiAgIHRoZSBNQlogZGVmaW5pdGlvbiBpcyBsZWZ0IGludGFjdC4JCQkJCQkJCQkgIAkgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfVUlOVDMyCWxvbmdfMDsKKwlQSV9VSU5UMzIJbG9uZ18xOworCX0gUElfUkNWX0RFU0NSOworCisjZGVmaW5lCVBJX1JDVl9ERVNDUl9NX1NPUAkgIAkJMHg4MDAwMDAwMAorI2RlZmluZSBQSV9SQ1ZfREVTQ1JfTV9TRUdfTEVOX0xPIAkweDYwMDAwMDAwIAorI2RlZmluZSBQSV9SQ1ZfREVTQ1JfTV9NQloJICAJCTB4NjAwMDAwMDAgCisjZGVmaW5lIFBJX1JDVl9ERVNDUl9NX1NFR19MRU4JCTB4MUY4MDAwMDAKKyNkZWZpbmUgUElfUkNWX0RFU0NSX01fU0VHX0xFTl9ISQkweDFGRjAwMDAwCSAgCisjZGVmaW5lIFBJX1JDVl9ERVNDUl9NX1NFR19DTlQJICAJMHgwMDBGMDAwMAorI2RlZmluZSBQSV9SQ1ZfREVTQ1JfTV9CVUZGX0hJCSAgCTB4MDAwMEZGRkYKKworI2RlZmluZQlQSV9SQ1ZfREVTQ1JfVl9TT1AJICAJCTMxCisjZGVmaW5lIFBJX1JDVl9ERVNDUl9WX1NFR19MRU5fTE8gCTI5CisjZGVmaW5lIFBJX1JDVl9ERVNDUl9WX01CWgkgIAkJMjkKKyNkZWZpbmUgUElfUkNWX0RFU0NSX1ZfU0VHX0xFTgkgIAkyMworI2RlZmluZSBQSV9SQ1ZfREVTQ1JfVl9TRUdfTEVOX0hJIAkyMAkgIAorI2RlZmluZSBQSV9SQ1ZfREVTQ1JfVl9TRUdfQ05UCSAgCTE2CisjZGVmaW5lIFBJX1JDVl9ERVNDUl9WX0JVRkZfSEkJIAkwCisKKy8qIERlZmluZSB0aGUgZm9ybWF0IG9mIGEgdHJhbnNtaXQgZGVzY3JpcHRvciAoWG10IERhdGEsIENtZCBSZXEpICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1VJTlQzMglsb25nXzA7CisJUElfVUlOVDMyCWxvbmdfMTsKKwl9IFBJX1hNVF9ERVNDUjsKKworI2RlZmluZQlQSV9YTVRfREVTQ1JfTV9TT1AJCQkweDgwMDAwMDAwCisjZGVmaW5lIFBJX1hNVF9ERVNDUl9NX0VPUAkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgUElfWE1UX0RFU0NSX01fTUJaCQkJMHgyMDAwMDAwMCAKKyNkZWZpbmUgUElfWE1UX0RFU0NSX01fU0VHX0xFTgkJMHgxRkZGMDAwMAorI2RlZmluZSBQSV9YTVRfREVTQ1JfTV9CVUZGX0hJCQkweDAwMDBGRkZGCisKKyNkZWZpbmUJUElfWE1UX0RFU0NSX1ZfU09QCQkJMzEKKyNkZWZpbmUJUElfWE1UX0RFU0NSX1ZfRU9QCQkJMzAKKyNkZWZpbmUgUElfWE1UX0RFU0NSX1ZfTUJaCQkJMjkKKyNkZWZpbmUgUElfWE1UX0RFU0NSX1ZfU0VHX0xFTgkJMTYKKyNkZWZpbmUgUElfWE1UX0RFU0NSX1ZfQlVGRl9ISQkJMAorCisvKiBEZWZpbmUgZm9ybWF0IG9mIHRoZSBEZXNjcmlwdG9yIEJsb2NrIChyZXNpZGVudCBpbiBob3N0IG1lbW9yeSkgKi8KKworI2RlZmluZSBQSV9SQ1ZfREFUQV9LX05VTV9FTlRSSUVTCQkJMjU2CisjZGVmaW5lIFBJX1hNVF9EQVRBX0tfTlVNX0VOVFJJRVMJCQkyNTYKKyNkZWZpbmUgUElfU01UX0hPU1RfS19OVU1fRU5UUklFUwkJCTY0CisjZGVmaW5lIFBJX1VOU09MX0tfTlVNX0VOVFJJRVMJCQkJMTYKKyNkZWZpbmUgUElfQ01EX1JTUF9LX05VTV9FTlRSSUVTCQkJMTYKKyNkZWZpbmUgUElfQ01EX1JFUV9LX05VTV9FTlRSSUVTCQkJMTYKKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfUkNWX0RFU0NSICByY3ZfZGF0YVtQSV9SQ1ZfREFUQV9LX05VTV9FTlRSSUVTXTsKKwlQSV9YTVRfREVTQ1IgIHhtdF9kYXRhW1BJX1hNVF9EQVRBX0tfTlVNX0VOVFJJRVNdOworCVBJX1JDVl9ERVNDUiAgc210X2hvc3RbUElfU01UX0hPU1RfS19OVU1fRU5UUklFU107CisJUElfUkNWX0RFU0NSICB1bnNvbFtQSV9VTlNPTF9LX05VTV9FTlRSSUVTXTsKKwlQSV9SQ1ZfREVTQ1IgIGNtZF9yc3BbUElfQ01EX1JTUF9LX05VTV9FTlRSSUVTXTsKKwlQSV9YTVRfREVTQ1IgIGNtZF9yZXFbUElfQ01EX1JFUV9LX05VTV9FTlRSSUVTXTsKKwl9IFBJX0RFU0NSX0JMT0NLOworCisvKiBEZWZpbmUgUG9ydCBSZWdpc3RlcnMgLSBvZmZzZXRzIGZyb20gUERRIEJhc2UgYWRkcmVzcyAqLworCisjZGVmaW5lIFBJX1BEUV9LX1JFR19QT1JUX1JFU0VUCQkJMHgwMDAwMDAwMAorI2RlZmluZSBQSV9QRFFfS19SRUdfSE9TVF9EQVRBCQkJMHgwMDAwMDAwNAorI2RlZmluZSBQSV9QRFFfS19SRUdfUE9SVF9DVFJMCQkJMHgwMDAwMDAwOAorI2RlZmluZSBQSV9QRFFfS19SRUdfUE9SVF9EQVRBX0EJCTB4MDAwMDAwMEMKKyNkZWZpbmUgUElfUERRX0tfUkVHX1BPUlRfREFUQV9CCQkweDAwMDAwMDEwCisjZGVmaW5lIFBJX1BEUV9LX1JFR19QT1JUX1NUQVRVUwkJMHgwMDAwMDAxNAorI2RlZmluZSBQSV9QRFFfS19SRUdfVFlQRV8wX1NUQVRVUyAJCTB4MDAwMDAwMTgKKyNkZWZpbmUgUElfUERRX0tfUkVHX0hPU1RfSU5UX0VOQgkgIAkweDAwMDAwMDFDCisjZGVmaW5lIFBJX1BEUV9LX1JFR19UWVBFXzJfUFJPRF9OT0lOVCAJMHgwMDAwMDAyMAorI2RlZmluZSBQSV9QRFFfS19SRUdfVFlQRV8yX1BST0QJCTB4MDAwMDAwMjQKKyNkZWZpbmUgUElfUERRX0tfUkVHX0NNRF9SU1BfUFJPRAkJMHgwMDAwMDAyOAorI2RlZmluZSBQSV9QRFFfS19SRUdfQ01EX1JFUV9QUk9ECQkweDAwMDAwMDJDCisjZGVmaW5lIFBJX1BEUV9LX1JFR19TTVRfSE9TVF9QUk9EICAgCTB4MDAwMDAwMzAKKyNkZWZpbmUgUElfUERRX0tfUkVHX1VOU09MX1BST0QJCQkweDAwMDAwMDM0CisKKy8qIFBvcnQgQ29udHJvbCBSZWdpc3RlciAtIENvbW1hbmQgY29kZXMgZm9yIHByaW1hcnkgY29tbWFuZHMgKi8KKworI2RlZmluZSBQSV9QQ1RSTF9NX0NNRF9FUlJPUgkJCTB4ODAwMAorI2RlZmluZSBQSV9QQ1RSTF9NX0JMQVNUX0ZMQVNICQkJMHg0MDAwCisjZGVmaW5lIFBJX1BDVFJMX01fSEFMVAkJCQkJMHgyMDAwCisjZGVmaW5lIFBJX1BDVFJMX01fQ09QWV9EQVRBCQkJMHgxMDAwCisjZGVmaW5lIFBJX1BDVFJMX01fRVJST1JfTE9HX1NUQVJUCQkweDA4MDAKKyNkZWZpbmUgUElfUENUUkxfTV9FUlJPUl9MT0dfUkVBRAkJMHgwNDAwCisjZGVmaW5lIFBJX1BDVFJMX01fWE1UX0RBVEFfRkxVU0hfRE9ORQkweDAyMDAKKyNkZWZpbmUgUElfUENUUkxfTV9JTklUCQkJCQkweDAxMDAKKyNkZWZpbmUgUElfUENUUkxfTV9JTklUX1NUQVJUCQkgICAgMHgwMDgwCisjZGVmaW5lIFBJX1BDVFJMX01fQ09OU19CTE9DSwkJCTB4MDA0MAorI2RlZmluZSBQSV9QQ1RSTF9NX1VOSU5JVAkJCQkweDAwMjAKKyNkZWZpbmUgUElfUENUUkxfTV9SSU5HX01FTUJFUgkJCTB4MDAxMAorI2RlZmluZSBQSV9QQ1RSTF9NX01MQQkJCQkJMHgwMDA4CQkKKyNkZWZpbmUgUElfUENUUkxfTV9GV19SRVZfUkVBRAkJCTB4MDAwNAorI2RlZmluZSBQSV9QQ1RSTF9NX0RFVl9TUEVDSUZJQwkJCTB4MDAwMgorI2RlZmluZSBQSV9QQ1RSTF9NX1NVQl9DTUQJCQkJMHgwMDAxCisKKy8qIERlZmluZSBzdWItY29tbWFuZHMgYWNjZXNzZWQgdmlhIHRoZSBQSV9QQ1RSTF9NX1NVQl9DTUQgY29tbWFuZCAqLworCisjZGVmaW5lIFBJX1NVQl9DTURfS19MSU5LX1VOSU5JVAkJMHgwMDAxCisjZGVmaW5lIFBJX1NVQl9DTURfS19CVVJTVF9TSVpFX1NFVAkJMHgwMDAyCisjZGVmaW5lIFBJX1NVQl9DTURfS19QRFFfUkVWX0dFVAkJMHgwMDA0CisjZGVmaW5lIFBJX1NVQl9DTURfS19IV19SRVZfR0VUCQkJMHgwMDA4CisKKy8qIERlZmluZSBzb21lIFBvcnQgRGF0YSBCIHZhbHVlcyAqLworCisjZGVmaW5lIFBJX1BEQVRBX0JfRE1BX0JVUlNUX1NJWkVfNAkgCTAJCS8qIHZhbGlkIHZhbHVlcyBmb3IgY29tbWFuZCAqLworI2RlZmluZSBQSV9QREFUQV9CX0RNQV9CVVJTVF9TSVpFXzgJIAkxCisjZGVmaW5lIFBJX1BEQVRBX0JfRE1BX0JVUlNUX1NJWkVfMTYJMgorI2RlZmluZSBQSV9QREFUQV9CX0RNQV9CVVJTVF9TSVpFXzMyCTMJCS8qIG5vdCBzdXBwb3J0ZWQgb24gUENJICovCisjZGVmaW5lIFBJX1BEQVRBX0JfRE1BX0JVUlNUX1NJWkVfREVGCVBJX1BEQVRBX0JfRE1BX0JVUlNUX1NJWkVfMTYKKworLyogUG9ydCBEYXRhIEEgUmVzZXQgc3RhdGUgKi8KKworI2RlZmluZSBQSV9QREFUQV9BX1JFU0VUX01fVVBHUkFERQkJMHgwMDAwMDAwMQorI2RlZmluZSBQSV9QREFUQV9BX1JFU0VUX01fU09GVF9SRVNFVAkweDAwMDAwMDAyCisjZGVmaW5lIFBJX1BEQVRBX0FfUkVTRVRfTV9TS0lQX1NUCQkweDAwMDAwMDA0CisKKy8qIFJlYWQgYWRhcHRlciBNTEEgYWRkcmVzcyBwb3J0IGNvbnRyb2wgY29tbWFuZCBjb25zdGFudHMgKi8KKworI2RlZmluZSBQSV9QREFUQV9BX01MQV9LX0xPCQkJCTAKKyNkZWZpbmUgUElfUERBVEFfQV9NTEFfS19ISQkJCQkxCisKKy8qIEJ5dGUgU3dhcCB2YWx1ZXMgZm9yIGluaXQgY29tbWFuZCAqLworCisjZGVmaW5lIFBJX1BEQVRBX0FfSU5JVF9NX0RFU0NfQkxLX0FERFIJCQkweDBGRkZGRTAwMAorI2RlZmluZSBQSV9QREFUQV9BX0lOSVRfTV9SRVNFUlZFRAkJCQkweDAwMDAwMUZGQworI2RlZmluZSBQSV9QREFUQV9BX0lOSVRfTV9CU1dBUF9EQVRBCQkJMHgwMDAwMDAwMDIgCisjZGVmaW5lIFBJX1BEQVRBX0FfSU5JVF9NX0JTV0FQX0xJVEVSQUwJCQkweDAwMDAwMDAwMQorCisjZGVmaW5lIFBJX1BEQVRBX0FfSU5JVF9WX0RFU0NfQkxLX0FERFIJCQkxMworI2RlZmluZSBQSV9QREFUQV9BX0lOSVRfVl9SRVNFUlZFRAkJCQkzCisjZGVmaW5lIFBJX1BEQVRBX0FfSU5JVF9WX0JTV0FQX0RBVEEJCQkxIAorI2RlZmluZSBQSV9QREFUQV9BX0lOSVRfVl9CU1dBUF9MSVRFUkFMCQkJMAorCisvKiBQb3J0IFJlc2V0IFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUElfUkVTRVRfTV9BU1NFUlRfUkVTRVQJCQkxCisKKy8qIFBvcnQgU3RhdHVzIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgUElfUFNUQVRVU19WX1JDVl9EQVRBX1BFTkRJTkcJMzEKKyNkZWZpbmUgUElfUFNUQVRVU19WX1hNVF9EQVRBX1BFTkRJTkcJMzAKKyNkZWZpbmUgUElfUFNUQVRVU19WX1NNVF9IT1NUX1BFTkRJTkcJMjkKKyNkZWZpbmUgUElfUFNUQVRVU19WX1VOU09MX1BFTkRJTkcJCTI4CisjZGVmaW5lIFBJX1BTVEFUVVNfVl9DTURfUlNQX1BFTkRJTkcJMjcKKyNkZWZpbmUgUElfUFNUQVRVU19WX0NNRF9SRVFfUEVORElORwkyNgorI2RlZmluZSBQSV9QU1RBVFVTX1ZfVFlQRV8wX1BFTkRJTkcJCTI1CisjZGVmaW5lIFBJX1BTVEFUVVNfVl9SRVNFUlZFRF8xCQkJMTYKKyNkZWZpbmUgUElfUFNUQVRVU19WX1JFU0VSVkVEXzIJCQkxMQorI2RlZmluZSBQSV9QU1RBVFVTX1ZfU1RBVEUJCQkJOAorI2RlZmluZSBQSV9QU1RBVFVTX1ZfSEFMVF9JRAkJCTAKKworI2RlZmluZSBQSV9QU1RBVFVTX01fUkNWX0RBVEFfUEVORElORwkweDgwMDAwMDAwCisjZGVmaW5lIFBJX1BTVEFUVVNfTV9YTVRfREFUQV9QRU5ESU5HCTB4NDAwMDAwMDAKKyNkZWZpbmUgUElfUFNUQVRVU19NX1NNVF9IT1NUX1BFTkRJTkcJMHgyMDAwMDAwMAorI2RlZmluZSBQSV9QU1RBVFVTX01fVU5TT0xfUEVORElORwkJMHgxMDAwMDAwMAorI2RlZmluZSBQSV9QU1RBVFVTX01fQ01EX1JTUF9QRU5ESU5HCTB4MDgwMDAwMDAKKyNkZWZpbmUgUElfUFNUQVRVU19NX0NNRF9SRVFfUEVORElORwkweDA0MDAwMDAwCisjZGVmaW5lIFBJX1BTVEFUVVNfTV9UWVBFXzBfUEVORElORwkJMHgwMjAwMDAwMAorI2RlZmluZSBQSV9QU1RBVFVTX01fUkVTRVJWRURfMQkJCTB4MDFGRjAwMDAKKyNkZWZpbmUgUElfUFNUQVRVU19NX1JFU0VSVkVEXzIJCQkweDAwMDBGODAwCisjZGVmaW5lIFBJX1BTVEFUVVNfTV9TVEFURQkJCQkweDAwMDAwNzAwCisjZGVmaW5lIFBJX1BTVEFUVVNfTV9IQUxUX0lECQkJMHgwMDAwMDBGRgorCisvKiBEZWZpbmUgSGFsdCBJZCdzCQkJIAkJCQkJKi8KKy8qICAgRG8gbm90IGluc2VydCBpbnRvIHRoaXMgbGlzdCwgb25seSBhcHBlbmQuICovCisKKyNkZWZpbmUgUElfSEFMVF9JRF9LX1NFTEZURVNUX1RJTUVPVVQJMAorI2RlZmluZSBQSV9IQUxUX0lEX0tfUEFSSVRZX0VSUk9SCQkxCisjZGVmaW5lIFBJX0hBTFRfSURfS19IT1NUX0RJUl9IQUxUCQkyCisjZGVmaW5lIFBJX0hBTFRfSURfS19TV19GQVVMVAkJCTMKKyNkZWZpbmUgUElfSEFMVF9JRF9LX0hXX0ZBVUxUCQkJNAorI2RlZmluZSBQSV9IQUxUX0lEX0tfUENfVFJBQ0UJCQk1CisjZGVmaW5lIFBJX0hBTFRfSURfS19ETUFfRVJST1IJCQk2CQkJLyogSG9zdCBEYXRhIGhhcyBlcnJvciByZWcgKi8KKyNkZWZpbmUgUElfSEFMVF9JRF9LX0lNQUdFX0NSQ19FUlJPUgk3ICAgCQkvKiBJbWFnZSBpcyBiYWQsIHVwZGF0ZSBpdCAqLworI2RlZmluZSBQSV9IQUxUX0lEX0tfQlVTX0VYQ0VQVElPTgkgCTggICAJCS8qIDY4SyBidXMgZXhjZXB0aW9uCSAgICovCisKKy8qIEhvc3QgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciBhcyBzZWVuIGJ5IGhvc3QgKi8gCisKKyNkZWZpbmUgUElfSE9TVF9JTlRfTV9YTVRfREFUQV9FTkIJCTB4ODAwMDAwMDAJLyogVHlwZSAyIEVuYWJsZXMgKi8KKyNkZWZpbmUgUElfSE9TVF9JTlRfTV9SQ1ZfREFUQV9FTkIJCTB4NDAwMDAwMDAgIAorI2RlZmluZSBQSV9IT1NUX0lOVF9NX1NNVF9IT1NUX0VOQgkJMHgxMDAwMDAwMAkvKiBUeXBlIDEgRW5hYmxlcyAqLyAKKyNkZWZpbmUgUElfSE9TVF9JTlRfTV9VTlNPTF9FTkIJCQkweDIwMDAwMDAwCisjZGVmaW5lIFBJX0hPU1RfSU5UX01fQ01EX1JTUF9FTkIJCTB4MDgwMDAwMDAKKyNkZWZpbmUgUElfSE9TVF9JTlRfTV9DTURfUkVRX0VOQgkJMHgwNDAwMDAwMAorI2RlZmluZQlQSV9IT1NUX0lOVF9NX1RZUEVfMV9SRVNFUlZFRAkweDAwRkYwMDAwCisjZGVmaW5lCVBJX0hPU1RfSU5UX01fVFlQRV8wX1JFU0VSVkVECTB4MDAwMEZGMDAJLyogVHlwZSAwIEVuYWJsZXMgKi8KKyNkZWZpbmUgUElfSE9TVF9JTlRfTV8xTVMJCQkJMHgwMDAwMDA4MAorI2RlZmluZSBQSV9IT1NUX0lOVF9NXzIwTVMJCQkJMHgwMDAwMDA0MAorI2RlZmluZSBQSV9IT1NUX0lOVF9NX0NTUl9DTURfRE9ORQkJMHgwMDAwMDAyMAorI2RlZmluZSBQSV9IT1NUX0lOVF9NX1NUQVRFX0NIQU5HRQkJMHgwMDAwMDAxMAorI2RlZmluZSBQSV9IT1NUX0lOVF9NX1hNVF9GTFVTSAkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgUElfSE9TVF9JTlRfTV9OWE0JCQkJMHgwMDAwMDAwNAorI2RlZmluZSBQSV9IT1NUX0lOVF9NX1BNX1BBUl9FUlIJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUElfSE9TVF9JTlRfTV9CVVNfUEFSX0VSUgkJMHgwMDAwMDAwMQorCisjZGVmaW5lIFBJX0hPU1RfSU5UX1ZfWE1UX0RBVEFfRU5CCQkzMQkJCS8qIFR5cGUgMiBFbmFibGVzICovCisjZGVmaW5lIFBJX0hPU1RfSU5UX1ZfUkNWX0RBVEFfRU5CCQkzMCAgCisjZGVmaW5lIFBJX0hPU1RfSU5UX1ZfU01UX0hPU1RfRU5CCQkyOQkJCS8qIFR5cGUgMSBFbmFibGVzICovIAorI2RlZmluZSBQSV9IT1NUX0lOVF9WX1VOU09MX0VOQgkJCTI4CisjZGVmaW5lIFBJX0hPU1RfSU5UX1ZfQ01EX1JTUF9FTkIJCTI3CisjZGVmaW5lIFBJX0hPU1RfSU5UX1ZfQ01EX1JFUV9FTkIJCTI2CisjZGVmaW5lCVBJX0hPU1RfSU5UX1ZfVFlQRV8xX1JFU0VSVkVECTE2CisjZGVmaW5lCVBJX0hPU1RfSU5UX1ZfVFlQRV8wX1JFU0VSVkVEICAgOAkJCS8qIFR5cGUgMCBFbmFibGVzICovCisjZGVmaW5lIFBJX0hPU1RfSU5UX1ZfMU1TX0VOQgkJCTcKKyNkZWZpbmUgUElfSE9TVF9JTlRfVl8yME1TX0VOQgkJCTYKKyNkZWZpbmUgUElfSE9TVF9JTlRfVl9DU1JfQ01EX0RPTkVfRU5CCTUKKyNkZWZpbmUgUElfSE9TVF9JTlRfVl9TVEFURV9DSEFOR0VfRU5CCTQKKyNkZWZpbmUgUElfSE9TVF9JTlRfVl9YTVRfRkxVU0hfRU5CIAkzCisjZGVmaW5lIFBJX0hPU1RfSU5UX1ZfTlhNX0VOQgkJCTIKKyNkZWZpbmUgUElfSE9TVF9JTlRfVl9QTV9QQVJfRVJSX0VOQgkxCisjZGVmaW5lIFBJX0hPU1RfSU5UX1ZfQlVTX1BBUl9FUlJfRU5CCTAKKworI2RlZmluZSBQSV9IT1NUX0lOVF9LX0FDS19BTExfVFlQRV8wCTB4MDAwMDAwRkYKKyNkZWZpbmUgUElfSE9TVF9JTlRfS19ESVNBQkxFX0FMTF9JTlRTCTB4MDAwMDAwMDAKKyNkZWZpbmUgUElfSE9TVF9JTlRfS19FTkFCTEVfQUxMX0lOVFMJMHhGRkZGRkZGRgorI2RlZmluZSBQSV9IT1NUX0lOVF9LX0VOQUJMRV9ERUZfSU5UUwkweEMwMDAwMDFGCisKKy8qIFR5cGUgMCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUElfVFlQRV8wX1NUQVRfTV8xTVMJCQkweDAwMDAwMDgwCisjZGVmaW5lIFBJX1RZUEVfMF9TVEFUX01fMjBNUwkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgUElfVFlQRV8wX1NUQVRfTV9DU1JfQ01EX0RPTkUJMHgwMDAwMDAyMAorI2RlZmluZSBQSV9UWVBFXzBfU1RBVF9NX1NUQVRFX0NIQU5HRQkweDAwMDAwMDEwCisjZGVmaW5lIFBJX1RZUEVfMF9TVEFUX01fWE1UX0ZMVVNICQkweDAwMDAwMDA4CisjZGVmaW5lIFBJX1RZUEVfMF9TVEFUX01fTlhNCQkJMHgwMDAwMDAwNAorI2RlZmluZSBQSV9UWVBFXzBfU1RBVF9NX1BNX1BBUl9FUlIJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUElfVFlQRV8wX1NUQVRfTV9CVVNfUEFSX0VSUgkweDAwMDAwMDAxCisKKyNkZWZpbmUgUElfVFlQRV8wX1NUQVRfVl8xTVMJCQk3CQkJCisjZGVmaW5lIFBJX1RZUEVfMF9TVEFUX1ZfMjBNUwkJCTYJCisjZGVmaW5lIFBJX1RZUEVfMF9TVEFUX1ZfQ1NSX0NNRF9ET05FCTUKKyNkZWZpbmUgUElfVFlQRV8wX1NUQVRfVl9TVEFURV9DSEFOR0UJNAorI2RlZmluZSBQSV9UWVBFXzBfU1RBVF9WX1hNVF9GTFVTSAkJMworI2RlZmluZSBQSV9UWVBFXzBfU1RBVF9WX05YTQkJCTIKKyNkZWZpbmUgUElfVFlQRV8wX1NUQVRfVl9QTV9QQVJfRVJSCQkxCisjZGVmaW5lIFBJX1RZUEVfMF9TVEFUX1ZfQlVTX1BBUl9FUlIJMAorCisvKiBSZWdpc3RlciBkZWZpbml0aW9uIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgZm9yIGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuIHN5c3RlbXMgKi8KKworI2lmbmRlZiAgQklHX0VORElBTgorCisvKiBMaXR0bGUgZW5kaWFuIGZvcm1hdCBvZiBUeXBlIDEgUHJvZHVjZXIgcmVnaXN0ZXIgKi8KKwordHlwZWRlZiB1bmlvbgorCXsKKwlQSV9VSU5UMzIJbHdvcmQ7CisJc3RydWN0CisJCXsKKwkJUElfVUlOVDgJcHJvZDsKKwkJUElfVUlOVDgJY29tcDsKKwkJUElfVUlOVDgJbWJ6XzE7CisJCVBJX1VJTlQ4CW1iel8yOworCQl9IGluZGV4OworCX0gUElfVFlQRV8xX1BST0RfUkVHOworCisvKiBMaXR0bGUgZW5kaWFuIGZvcm1hdCBvZiBUeXBlIDIgUHJvZHVjZXIgcmVnaXN0ZXIgKi8KKwordHlwZWRlZiB1bmlvbgorCXsKKwlQSV9VSU5UMzIJbHdvcmQ7CisJc3RydWN0CisJCXsKKwkJUElfVUlOVDgJcmN2X3Byb2Q7CisJCVBJX1VJTlQ4CXhtdF9wcm9kOworCQlQSV9VSU5UOAlyY3ZfY29tcDsKKwkJUElfVUlOVDgJeG10X2NvbXA7CisJCX0gaW5kZXg7CisJfSBQSV9UWVBFXzJfUFJPRF9SRUc7CisKKy8qIExpdHRsZSBlbmRpYW4gZm9ybWF0IG9mIFR5cGUgMSBDb25zdW1lciBCbG9jayBsb25nd29yZCAqLworCit0eXBlZGVmIHVuaW9uCisJeworCVBJX1VJTlQzMglsd29yZDsKKwlzdHJ1Y3QKKwkJeworCQlQSV9VSU5UOAljb25zOworCQlQSV9VSU5UOAlyZXMwOworCQlQSV9VSU5UOAlyZXMxOworCQlQSV9VSU5UOAlyZXMyOworCQl9IGluZGV4OworCX0gUElfVFlQRV8xX0NPTlNVTUVSOworCisvKiBMaXR0bGUgZW5kaWFuIGZvcm1hdCBvZiBUeXBlIDIgQ29uc3VtZXIgQmxvY2sgbG9uZ3dvcmQgKi8KKwordHlwZWRlZiB1bmlvbgorCXsKKwlQSV9VSU5UMzIJbHdvcmQ7CisJc3RydWN0CisJCXsKKwkJUElfVUlOVDgJcmN2X2NvbnM7CisJCVBJX1VJTlQ4CXJlczA7CisJCVBJX1VJTlQ4CXhtdF9jb25zOworCQlQSV9VSU5UOAlyZXMxOworCQl9IGluZGV4OworCX0gUElfVFlQRV8yX0NPTlNVTUVSOworCisjZWxzZQorCisvKiBCaWcgZW5kaWFuIGZvcm1hdCBvZiBUeXBlIDEgUHJvZHVjZXIgcmVnaXN0ZXIgKi8KKwordHlwZWRlZiB1bmlvbgorCXsKKwlQSV9VSU5UMzIJbHdvcmQ7CisJc3RydWN0CisJCXsKKwkJUElfVUlOVDgJbWJ6XzI7CisJCVBJX1VJTlQ4CW1iel8xOworCQlQSV9VSU5UOAljb21wOworCQlQSV9VSU5UOAlwcm9kOworCQl9IGluZGV4OworCX0gUElfVFlQRV8xX1BST0RfUkVHOworCisvKiBCaWcgZW5kaWFuIGZvcm1hdCBvZiBUeXBlIDIgUHJvZHVjZXIgcmVnaXN0ZXIgKi8KKwordHlwZWRlZiB1bmlvbgorCXsKKwlQSV9VSU5UMzIJbHdvcmQ7CisJc3RydWN0CisJCXsKKwkJUElfVUlOVDgJeG10X2NvbXA7CisJCVBJX1VJTlQ4CXJjdl9jb21wOworCQlQSV9VSU5UOAl4bXRfcHJvZDsKKwkJUElfVUlOVDgJcmN2X3Byb2Q7CisJCX0gaW5kZXg7CisJfSBQSV9UWVBFXzJfUFJPRF9SRUc7CisKKy8qIEJpZyBlbmRpYW4gZm9ybWF0IG9mIFR5cGUgMSBDb25zdW1lciBCbG9jayBsb25nd29yZCAqLworCit0eXBlZGVmIHVuaW9uCisJeworCVBJX1VJTlQzMglsd29yZDsKKwlzdHJ1Y3QKKwkJeworCQlQSV9VSU5UOAlyZXMyOworCQlQSV9VSU5UOAlyZXMxOworCQlQSV9VSU5UOAlyZXMwOworCQlQSV9VSU5UOAljb25zOworCQl9IGluZGV4OworCX0gUElfVFlQRV8xX0NPTlNVTUVSOworCisvKiBCaWcgZW5kaWFuIGZvcm1hdCBvZiBUeXBlIDIgQ29uc3VtZXIgQmxvY2sgbG9uZ3dvcmQgKi8KKwordHlwZWRlZiB1bmlvbgorCXsKKwlQSV9VSU5UMzIJbHdvcmQ7CisJc3RydWN0CisJCXsKKwkJUElfVUlOVDgJcmVzMTsKKwkJUElfVUlOVDgJeG10X2NvbnM7CisJCVBJX1VJTlQ4CXJlczA7CisJCVBJX1VJTlQ4CXJjdl9jb25zOworCQl9IGluZGV4OworCX0gUElfVFlQRV8yX0NPTlNVTUVSOworCisjZW5kaWYJLyogI2lmbmRlZiBCSUdfRU5ESUFOICovCisKKy8qIERlZmluZSBFSVNBIGNvbnRyb2xsZXIgcmVnaXN0ZXIgb2Zmc2V0cyAqLworCisjZGVmaW5lIFBJX0VTSUNfS19CVVJTVF9IT0xET0ZGCQkweDA0MAorI2RlZmluZSBQSV9FU0lDX0tfU0xPVF9JRCAgICAgICAgICAgIAkweEM4MAorI2RlZmluZSBQSV9FU0lDX0tfU0xPVF9DTlRSTAkJMHhDODQKKyNkZWZpbmUgUElfRVNJQ19LX01FTV9BRERfQ01QXzAgICAgIAkweEM4NQorI2RlZmluZSBQSV9FU0lDX0tfTUVNX0FERF9DTVBfMSAgICAgCTB4Qzg2CisjZGVmaW5lIFBJX0VTSUNfS19NRU1fQUREX0NNUF8yICAgICAJMHhDODcKKyNkZWZpbmUgUElfRVNJQ19LX01FTV9BRERfSElfQ01QXzAgIAkweEM4OAorI2RlZmluZSBQSV9FU0lDX0tfTUVNX0FERF9ISV9DTVBfMSAgCTB4Qzg5CisjZGVmaW5lIFBJX0VTSUNfS19NRU1fQUREX0hJX0NNUF8yICAJMHhDOEEKKyNkZWZpbmUgUElfRVNJQ19LX01FTV9BRERfTUFTS18wICAgICAJMHhDOEIKKyNkZWZpbmUgUElfRVNJQ19LX01FTV9BRERfTUFTS18xICAgICAJMHhDOEMKKyNkZWZpbmUgUElfRVNJQ19LX01FTV9BRERfTUFTS18yICAgICAJMHhDOEQKKyNkZWZpbmUgUElfRVNJQ19LX01FTV9BRERfTE9fQ01QXzAgIAkweEM4RQorI2RlZmluZSBQSV9FU0lDX0tfTUVNX0FERF9MT19DTVBfMSAgCTB4QzhGCisjZGVmaW5lIFBJX0VTSUNfS19NRU1fQUREX0xPX0NNUF8yICAJMHhDOTAKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0NNUF8wXzAJCTB4QzkxCisjZGVmaW5lIFBJX0VTSUNfS19JT19DTVBfMF8xCQkweEM5MgorI2RlZmluZSBQSV9FU0lDX0tfSU9fQ01QXzFfMAkJMHhDOTMKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0NNUF8xXzEJCTB4Qzk0CisjZGVmaW5lIFBJX0VTSUNfS19JT19DTVBfMl8wCQkweEM5NQorI2RlZmluZSBQSV9FU0lDX0tfSU9fQ01QXzJfMQkJMHhDOTYKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0NNUF8zXzAJCTB4Qzk3CisjZGVmaW5lIFBJX0VTSUNfS19JT19DTVBfM18xCQkweEM5OAorI2RlZmluZSBQSV9FU0lDX0tfSU9fQUREX01BU0tfMF8wICAgIAkweEM5OQorI2RlZmluZSBQSV9FU0lDX0tfSU9fQUREX01BU0tfMF8xICAgIAkweEM5QQorI2RlZmluZSBQSV9FU0lDX0tfSU9fQUREX01BU0tfMV8wICAgIAkweEM5QgorI2RlZmluZSBQSV9FU0lDX0tfSU9fQUREX01BU0tfMV8xICAgIAkweEM5QworI2RlZmluZSBQSV9FU0lDX0tfSU9fQUREX01BU0tfMl8wICAgIAkweEM5RAorI2RlZmluZSBQSV9FU0lDX0tfSU9fQUREX01BU0tfMl8xICAgIAkweEM5RQorI2RlZmluZSBQSV9FU0lDX0tfSU9fQUREX01BU0tfM18wICAgIAkweEM5RgorI2RlZmluZSBQSV9FU0lDX0tfSU9fQUREX01BU0tfM18xICAgIAkweENBMAorI2RlZmluZSBQSV9FU0lDX0tfTU9EX0NPTkZJR18xCQkweENBMQorI2RlZmluZSBQSV9FU0lDX0tfTU9EX0NPTkZJR18yCQkweENBMgorI2RlZmluZSBQSV9FU0lDX0tfTU9EX0NPTkZJR18zCQkweENBMworI2RlZmluZSBQSV9FU0lDX0tfTU9EX0NPTkZJR180CQkweENBNAorI2RlZmluZSBQSV9FU0lDX0tfTU9EX0NPTkZJR181ICAgIAkweENBNQorI2RlZmluZSBQSV9FU0lDX0tfTU9EX0NPTkZJR182CQkweENBNgorI2RlZmluZSBQSV9FU0lDX0tfTU9EX0NPTkZJR183CQkweENBNworI2RlZmluZSBQSV9FU0lDX0tfRElQX1NXSVRDSCAgICAgICAgIAkweENBOAorI2RlZmluZSBQSV9FU0lDX0tfSU9fQ09ORklHX1NUQVRfMCAgIAkweENBOQorI2RlZmluZSBQSV9FU0lDX0tfSU9fQ09ORklHX1NUQVRfMSAgIAkweENBQQorI2RlZmluZSBQSV9FU0lDX0tfRE1BX0NPTkZJRyAgICAgICAgIAkweENBQgorI2RlZmluZSBQSV9FU0lDX0tfSU5QVVRfUE9SVCAgICAgICAgIAkweENBQworI2RlZmluZSBQSV9FU0lDX0tfT1VUUFVUX1BPUlQgICAgICAgIAkweENBRAorI2RlZmluZSBQSV9FU0lDX0tfRlVOQ1RJT05fQ05UUkwJMHhDQUUKKyNkZWZpbmUgUElfRVNJQ19LX0NTUl9JT19MRU4JCVBJX0VTSUNfS19GVU5DVElPTl9DTlRSTCsxCS8qIGFsd2F5cyBsYXN0IHJlZyArIDEgKi8KKworLyogRGVmaW5lIHRoZSB2YWx1ZSBhbGwgZHJpdmVycyBtdXN0IHdyaXRlIHRvIHRoZSBmdW5jdGlvbiBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIFBJX0VTSUNfS19GVU5DVElPTl9DTlRSTF9JT19FTkIJMHgwMworCisvKiBEZWZpbmUgdGhlIGJpdHMgaW4gdGhlIHNsb3QgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBQSV9TTE9UX0NOVFJMX01fUkVTRVQJCTB4MDQJLyogRG9uJ3QgdXNlLiAgICAgICAqLworI2RlZmluZSBQSV9TTE9UX0NOVFJMX01fRVJST1IJCTB4MDIJLyogTm90IGltcGxlbWVudGVkLiAqLworI2RlZmluZSBQSV9TTE9UX0NOVFJMX01fRU5CCQkweDAxCS8qIE11c3QgYmUgc2V0LiAgICAgKi8KKworLyogRGVmaW5lIHRoZSBiaXRzIGluIHRoZSBidXJzdCBob2xkb2ZmIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIFBJX0JVUlNUX0hPTERPRkZfTV9IT0xET0ZGCTB4RkMKKyNkZWZpbmUgUElfQlVSU1RfSE9MRE9GRl9NX1JFU0VSVkVECTB4MDIKKyNkZWZpbmUgUElfQlVSU1RfSE9MRE9GRl9NX01FTV9NQVAJMHgwMQorCisjZGVmaW5lIFBJX0JVUlNUX0hPTERPRkZfVl9IT0xET0ZGCTIKKyNkZWZpbmUgUElfQlVSU1RfSE9MRE9GRl9WX1JFU0VSVkVECTEKKyNkZWZpbmUgUElfQlVSU1RfSE9MRE9GRl9WX01FTV9NQVAJMAorCisvKgorICogRGVmaW5lIHRoZSBmaWVsZHMgaW4gdGhlIElPIENvbXBhcmUgcmVnaXN0ZXJzLgorICogVGhlIGRyaXZlciBtdXN0IGluaXRpYWxpemUgdGhlIHNsb3QgZmllbGQgd2l0aCB0aGUgc2xvdCBJRCBzaGlmdGVkIGJ5IHRoZQorICogYW1vdW50IHNob3duIGJlbG93LgorICovCisKKyNkZWZpbmUgUElfSU9fQ01QX1ZfU0xPVAkJNAorCisvKiBEZWZpbmUgdGhlIGZpZWxkcyBpbiB0aGUgSW50ZXJydXB0IENoYW5uZWwgQ29uZmlndXJhdGlvbiBhbmQgU3RhdHVzIHJlZyAqLworCisjZGVmaW5lIFBJX0NPTkZJR19TVEFUXzBfTV9QRU5ECQkJMHg4MAorI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX01fUkVTXzEJCTB4NDAKKyNkZWZpbmUgUElfQ09ORklHX1NUQVRfMF9NX0lSRVFfT1VUCQkweDIwCisjZGVmaW5lIFBJX0NPTkZJR19TVEFUXzBfTV9JUkVRX0lOCQkweDEwCisjZGVmaW5lIFBJX0NPTkZJR19TVEFUXzBfTV9JTlRfRU5CCQkweDA4CisjZGVmaW5lIFBJX0NPTkZJR19TVEFUXzBfTV9SRVNfMAkJMHgwNAorI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX01fSVJRCQkJMHgwMworCisjZGVmaW5lIFBJX0NPTkZJR19TVEFUXzBfVl9QRU5ECQkJNworI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX1ZfUkVTXzEJCTYKKyNkZWZpbmUgUElfQ09ORklHX1NUQVRfMF9WX0lSRVFfT1VUCQk1CisjZGVmaW5lIFBJX0NPTkZJR19TVEFUXzBfVl9JUkVRX0lOCQk0CisjZGVmaW5lIFBJX0NPTkZJR19TVEFUXzBfVl9JTlRfRU5CCQkzCisjZGVmaW5lIFBJX0NPTkZJR19TVEFUXzBfVl9SRVNfMAkJMgorI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX1ZfSVJRCQkJMAorCisjZGVmaW5lIFBJX0NPTkZJR19TVEFUXzBfSVJRX0tfOQkJMAorI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX0lSUV9LXzEwCQkxCisjZGVmaW5lIFBJX0NPTkZJR19TVEFUXzBfSVJRX0tfMTEJCTIKKyNkZWZpbmUgUElfQ09ORklHX1NUQVRfMF9JUlFfS18xNQkJMworCisvKiBEZWZpbmUgREVDIEZEREljb250cm9sbGVyL0VJU0EgKERFRkVBKSBFSVNBIGhhcmR3YXJlIElEJ3MgKi8KKworI2RlZmluZSBERUZFQV9QUk9EVUNUX0lECTB4MDAzMEEzMTAJCS8qIERFQyBwcm9kdWN0IDMwMCAobm8gcmV2KQkqLworI2RlZmluZSBERUZFQV9QUk9EX0lEXzEJCTB4MDEzMEEzMTAJCS8qIERFQyBwcm9kdWN0IDMwMCwgcmV2IDEJKi8KKyNkZWZpbmUgREVGRUFfUFJPRF9JRF8yCQkweDAyMzBBMzEwCQkvKiBERUMgcHJvZHVjdCAzMDAsIHJldiAyCSovCisjZGVmaW5lIERFRkVBX1BST0RfSURfMwkJMHgwMzMwQTMxMAkJLyogREVDIHByb2R1Y3QgMzAwLCByZXYgMwkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERpZ2l0YWwgUEZJIFNwZWNpZmljYXRpb24gdjEuMCBEZWZpbml0aW9ucyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFBDSSBDb25maWd1cmF0aW9uIFNwYWNlIENvbnN0YW50cyAqLworCisjZGVmaW5lIFBGSV9LX0xBVF9USU1FUl9ERUYJCQkweDg4CS8qIGRlZiBtYXggbWFzdGVyIGxhdGVuY3kgdGltZXIgKi8KKyNkZWZpbmUgUEZJX0tfTEFUX1RJTUVSX01JTgkJCTB4MjAJLyogbWluIG1heCBtYXN0ZXIgbGF0ZW5jeSB0aW1lciAqLworI2RlZmluZSBQRklfS19DU1JfTUVNX0xFTgkJCTB4ODAJLyogMTI4IGJ5dGVzICovCisjZGVmaW5lIFBGSV9LX0NTUl9JT19MRU4JCQkweDgwCS8qIDEyOCBieXRlcyAqLworI2RlZmluZSBQRklfS19QS1RfTUVNX0xFTgkJCTB4MTAwMDAJLyogNjRLIGJ5dGVzICovCisKKy8qIFBGSSBSZWdpc3RlciBPZmZzZXRzIChzdGFydGluZyBhdCBQRFEgUmVnaXN0ZXIgQmFzZSBBZGRyZXNzKSAqLworCisjZGVmaW5lIFBGSV9LX1JFR19SRVNFUlZFRF8wCQkgMFgwMDAwMDAzOAorI2RlZmluZSBQRklfS19SRUdfUkVTRVJWRURfMQkJIDBYMDAwMDAwM0MKKyNkZWZpbmUgUEZJX0tfUkVHX01PREVfQ1RSTAkJIDBYMDAwMDAwNDAKKyNkZWZpbmUgUEZJX0tfUkVHX1NUQVRVUwkJIDBYMDAwMDAwNDQKKyNkZWZpbmUgUEZJX0tfUkVHX0ZJRk9fV1JJVEUJCSAwWDAwMDAwMDQ4CisjZGVmaW5lIFBGSV9LX1JFR19GSUZPX1JFQUQJCSAwWDAwMDAwMDRDCisKKy8qIFBGSSBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgQ29uc3RhbnRzICovCisKKyNkZWZpbmUgUEZJX01PREVfTV9SRVNFUlZFRAkJIDBYRkZGRkZGRjAKKyNkZWZpbmUgUEZJX01PREVfTV9UR1RfQUJPUlRfRU5CCSAwWDAwMDAwMDA4CisjZGVmaW5lIFBGSV9NT0RFX01fUERRX0lOVF9FTkIJCSAwWDAwMDAwMDA0CisjZGVmaW5lIFBGSV9NT0RFX01fUEZJX0lOVF9FTkIJCSAwWDAwMDAwMDAyCisjZGVmaW5lIFBGSV9NT0RFX01fRE1BX0VOQgkJIDBYMDAwMDAwMDEKKworI2RlZmluZSBQRklfTU9ERV9WX1JFU0VSVkVECQkgNAorI2RlZmluZSBQRklfTU9ERV9WX1RHVF9BQk9SVF9FTkIJIDMKKyNkZWZpbmUgUEZJX01PREVfVl9QRFFfSU5UX0VOQgkJIDIKKyNkZWZpbmUgUEZJX01PREVfVl9QRklfSU5UX0VOQgkJIDEKKyNkZWZpbmUgUEZJX01PREVfVl9ETUFfRU5CCQkgMAorCisjZGVmaW5lIFBGSV9NT0RFX0tfQUxMX0RJU0FCTEUJCSAwWDAwMDAwMDAwCisKKy8qIFBGSSBTdGF0dXMgUmVnaXN0ZXIgQ29uc3RhbnRzICovCisKKyNkZWZpbmUgUEZJX1NUQVRVU19NX1JFU0VSVkVECQkgMFhGRkZGRkZDMAorI2RlZmluZSBQRklfU1RBVFVTX01fUEZJX0VSUk9SCQkgMFgwMDAwMDAyMAkJLyogb25seSB2YWxpZCBpbiByZXYgMSBvciBsYXRlciBQRkkgKi8KKyNkZWZpbmUgUEZJX1NUQVRVU19NX1BEUV9JTlQJCSAwWDAwMDAwMDEwCisjZGVmaW5lIFBGSV9TVEFUVVNfTV9QRFFfRE1BX0FCT1JUCSAwWDAwMDAwMDA4CisjZGVmaW5lIFBGSV9TVEFUVVNfTV9GSUZPX0ZVTEwJCSAwWDAwMDAwMDA0CisjZGVmaW5lIFBGSV9TVEFUVVNfTV9GSUZPX0VNUFRZCQkgMFgwMDAwMDAwMgorI2RlZmluZSBQRklfU1RBVFVTX01fRE1BX0lOX1BST0dSRVNTCSAwWDAwMDAwMDAxCisKKyNkZWZpbmUgUEZJX1NUQVRVU19WX1JFU0VSVkVECQkgNgorI2RlZmluZSBQRklfU1RBVFVTX1ZfUEZJX0VSUk9SCQkgNQkJCS8qIG9ubHkgdmFsaWQgaW4gcmV2IDEgb3IgbGF0ZXIgUEZJICovCisjZGVmaW5lIFBGSV9TVEFUVVNfVl9QRFFfSU5UCQkgNAorI2RlZmluZSBQRklfU1RBVFVTX1ZfUERRX0RNQV9BQk9SVAkgMworI2RlZmluZSBQRklfU1RBVFVTX1ZfRklGT19GVUxMCQkgMgorI2RlZmluZSBQRklfU1RBVFVTX1ZfRklGT19FTVBUWQkJIDEKKyNkZWZpbmUgUEZJX1NUQVRVU19WX0RNQV9JTl9QUk9HUkVTUyAwCisKKyNkZWZpbmUgREZYX01BWF9FSVNBX1NMT1RTCQkxNgkJCS8qIG1heGltdW0gbnVtYmVyIG9mIEVJU0Egc2xvdHMgdG8gc2NhbiAqLworI2RlZmluZSBERlhfTUFYX05VTV9CT0FSRFMJCTgJCQkvKiBtYXhpbXVtIG51bWJlciBvZiBhZGFwdGVycyBzdXBwb3J0ZWQgKi8KKworI2RlZmluZSBERlhfQlVTX1RZUEVfUENJCQkwCQkJLyogdHlwZSBjb2RlIGZvciBERUMgRkRESWNvbnRyb2xsZXIvUENJICovCisjZGVmaW5lIERGWF9CVVNfVFlQRV9FSVNBCQkxCQkJLyogdHlwZSBjb2RlIGZvciBERUMgRkRESWNvbnRyb2xsZXIvRUlTQSAqLworCisjZGVmaW5lIERGWF9GQ19QUkgyX1BSSDFfUFJIMAkJMHg1NDAwMzgyMAkvKiBQYWNrZXQgUmVxdWVzdCBIZWFkZXIgYnl0ZXMgKyBGQyAqLworI2RlZmluZSBERlhfUFJIMF9CWVRFCQkJMHgyMAkJLyogUGFja2V0IFJlcXVlc3QgSGVhZGVyIGJ5dGUgMCAqLworI2RlZmluZSBERlhfUFJIMV9CWVRFCQkJMHgzOAkJLyogUGFja2V0IFJlcXVlc3QgSGVhZGVyIGJ5dGUgMSAqLworI2RlZmluZSBERlhfUFJIMl9CWVRFCQkJMHgwMAkJLyogUGFja2V0IFJlcXVlc3QgSGVhZGVyIGJ5dGUgMiAqLworCisvKiBEcml2ZXIgcm91dGluZSBzdGF0dXMgKHJldHVybikgY29kZXMgKi8KKworI2RlZmluZSBERlhfS19TVUNDRVNTCQkJMAkJCS8qIHJvdXRpbmUgc3VjY2VlZGVkICovCisjZGVmaW5lIERGWF9LX0ZBSUxVUkUJCQkxCQkJLyogcm91dGluZSBmYWlsZWQgKi8KKyNkZWZpbmUgREZYX0tfT1VUU1RBVEUJCQkyCQkJLyogYmFkIHN0YXRlIGZvciBjb21tYW5kICovCisjZGVmaW5lIERGWF9LX0hXX1RJTUVPVVQJCTMJCQkvKiBjb21tYW5kIHRpbWVkIG91dCAqLworCisvKiBEZWZpbmUgTExDIGhvc3QgcmVjZWl2ZSBidWZmZXIgbWluL21heC9kZWZhdWx0IHZhbHVlcyAqLworCisjZGVmaW5lIFJDVl9CVUZTX01JTgkyCQkJCQkvKiBtaW5pbXVtIHByZS1hbGxvY2F0ZWQgcmVjZWl2ZSBidWZmZXJzICovCisjZGVmaW5lIFJDVl9CVUZTX01BWAkzMgkJCQkJLyogbWF4aW11bSBwcmUtYWxsb2NhdGVkIHJlY2VpdmUgYnVmZmVycyAqLworI2RlZmluZSBSQ1ZfQlVGU19ERUYJOAkJCQkJLyogZGVmYXVsdCBwcmUtYWxsb2NhdGVkIHJlY2VpdmUgYnVmZmVycyAqLworCisvKiBEZWZpbmUgb2Zmc2V0cyBpbnRvIEZEREkgTExDIG9yIFNNVCByZWNlaXZlIGZyYW1lIGJ1ZmZlcnMgLSB1c2VkIHdoZW4gaW5kaWNhdGluZyBmcmFtZXMgKi8KKworI2RlZmluZSBSQ1ZfQlVGRl9LX0RFU0NSCTAJCQkJLyogZm91ciBieXRlIEZNQyBkZXNjcmlwdG9yICovCisjZGVmaW5lIFJDVl9CVUZGX0tfUEFERElORwk0CQkJCS8qIHRocmVlIG51bGwgYnl0ZXMgKi8KKyNkZWZpbmUgUkNWX0JVRkZfS19GQwkJNwkJCQkvKiBvbmUgYnl0ZSBmcmFtZSBjb250cm9sICovCisjZGVmaW5lIFJDVl9CVUZGX0tfREEJCTgJCQkJLyogc2l4IGJ5dGUgZGVzdGluYXRpb24gYWRkcmVzcyAqLworI2RlZmluZSBSQ1ZfQlVGRl9LX1NBCQkxNAkJCQkvKiBzaXggYnl0ZSBzb3VyY2UgYWRkcmVzcyAqLworI2RlZmluZSBSQ1ZfQlVGRl9LX0RBVEEJCTIwCQkJCS8qIG9mZnNldCB0byBzdGFydCBvZiBwYWNrZXQgZGF0YSAqLworCisvKiBEZWZpbmUgb2Zmc2V0cyBpbnRvIEZEREkgTExDIHRyYW5zbWl0IGZyYW1lIGJ1ZmZlcnMgLSB1c2VkIHdoZW4gc2VuZGluZyBmcmFtZXMgKi8KKworI2RlZmluZSBYTVRfQlVGRl9LX0ZDCQkwCQkJCS8qIG9uZSBieXRlIGZyYW1lIGNvbnRyb2wgKi8KKyNkZWZpbmUgWE1UX0JVRkZfS19EQQkJMQkJCQkvKiBzaXggYnl0ZSBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisjZGVmaW5lIFhNVF9CVUZGX0tfU0EJCTcJCQkJLyogc2l4IGJ5dGUgc291cmNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgWE1UX0JVRkZfS19EQVRBCQkxMwkJCQkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgcGFja2V0IGRhdGEgKi8KKworLyogTWFjcm8gZm9yIGNoZWNraW5nIGEgInZhbHVlIiBpcyB3aXRoaW4gYSBzcGVjaWZpYyByYW5nZSAqLworCisjZGVmaW5lIElOX1JBTkdFKHZhbHVlLGxvdyxoaWdoKSAoKHZhbHVlID49IGxvdykgJiYgKHZhbHVlIDw9IGhpZ2gpKQorCisvKiBPbmx5IGV4ZWN1dGUgc3BlY2lhbCBwcmludCBjYWxsIHdoZW4gZGVidWcgZHJpdmVyIHdhcyBidWlsdCAqLworCisjaWZkZWYgREVGWFhfREVCVUcKKyNkZWZpbmUgREJHX3ByaW50ayhhcmdzLi4uKSBwcmludGsoIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIERCR19wcmludGsoYXJncy4uLikKKyNlbmRpZgorCisvKiBEZWZpbmUgY29uc3RhbnRzIGZvciBtYXNraW5nL3VubWFza2luZyBpbnRlcnJ1cHRzICovCisKKyNkZWZpbmUgREZYX01BU0tfSU5URVJSVVBUUwkJMQorI2RlZmluZSBERlhfVU5NQVNLX0lOVEVSUlVQVFMJCTAKKworLyogRGVmaW5lIHN0cnVjdHVyZSBmb3IgZHJpdmVyIHRyYW5zbWl0IGRlc2NyaXB0b3IgYmxvY2sgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJc3RydWN0IHNrX2J1ZmYJKnBfc2tiOwkJCQkJLyogcHRyIHRvIHNrYiAqLworCX0gWE1UX0RSSVZFUl9ERVNDUjsKKwordHlwZWRlZiBzdHJ1Y3QgREZYX2JvYXJkX3RhZworCXsKKwkvKiBLZWVwIHZpcnR1YWwgYW5kIHBoeXNpY2FsIHBvaW50ZXJzIHRvIGxvY2tlZCwgcGh5c2ljYWxseSBjb250aWd1b3VzIG1lbW9yeSAqLworCisJY2hhcgkJCQkqa21hbGxvY2VkOwkJCQkJLyogcGNpX2ZyZWVfY29uc2lzdGVudCB0aGlzIG9uIHVubG9hZCAqLyAKKwlkbWFfYWRkcl90CQkJa21hbGxvY2VkX2RtYTsKKwkvKiBETUEgaGFuZGxlIGZvciB0aGUgYWJvdmUgKi8KKwlQSV9ERVNDUl9CTE9DSwkJCSpkZXNjcl9ibG9ja192aXJ0OwkJCQkvKiBQRFEgZGVzY3JpcHRvciBibG9jayB2aXJ0IGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90CQkJZGVzY3JfYmxvY2tfcGh5czsJCQkJLyogUERRIGRlc2NyaXB0b3IgYmxvY2sgcGh5cyBhZGRyZXNzICovCisJUElfRE1BX0NNRF9SRVEJCQkqY21kX3JlcV92aXJ0OwkJCQkJLyogQ29tbWFuZCByZXF1ZXN0IGJ1ZmZlciB2aXJ0IGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90CQkJY21kX3JlcV9waHlzOwkJCQkJLyogQ29tbWFuZCByZXF1ZXN0IGJ1ZmZlciBwaHlzIGFkZHJlc3MgKi8KKwlQSV9ETUFfQ01EX1JTUAkJCSpjbWRfcnNwX3ZpcnQ7CQkJCQkvKiBDb21tYW5kIHJlc3BvbnNlIGJ1ZmZlciB2aXJ0IGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90CQkJY21kX3JzcF9waHlzOwkJCQkJLyogQ29tbWFuZCByZXNwb25zZSBidWZmZXIgcGh5cyBhZGRyZXNzICovCisJY2hhcgkJCQkqcmN2X2Jsb2NrX3ZpcnQ7CQkJCS8qIExMQyBob3N0IHJlY2VpdmUgcXVldWUgYnVmIGJsayB2aXJ0ICovCisJZG1hX2FkZHJfdAkJCXJjdl9ibG9ja19waHlzOwkJCQkJLyogTExDIGhvc3QgcmVjZWl2ZSBxdWV1ZSBidWYgYmxrIHBoeXMgKi8KKwlQSV9DT05TVU1FUl9CTE9DSwkJKmNvbnNfYmxvY2tfdmlydDsJCQkJLyogUERRIGNvbnN1bWVyIGJsb2NrIHZpcnQgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QJCQljb25zX2Jsb2NrX3BoeXM7CQkJCS8qIFBEUSBjb25zdW1lciBibG9jayBwaHlzIGFkZHJlc3MgKi8KKworCS8qIEtlZXAgbG9jYWwgY29waWVzIG9mIFR5cGUgMSBhbmQgVHlwZSAyIHJlZ2lzdGVyIGRhdGEgKi8KKworCVBJX1RZUEVfMV9QUk9EX1JFRwkJY21kX3JlcV9yZWc7CQkJCQkvKiBDb21tYW5kIFJlcXVlc3QgcmVnaXN0ZXIgKi8KKwlQSV9UWVBFXzFfUFJPRF9SRUcJCWNtZF9yc3BfcmVnOwkJCQkJLyogQ29tbWFuZCBSZXNwb25zZSByZWdpc3RlciAqLworCVBJX1RZUEVfMl9QUk9EX1JFRwkJcmN2X3htdF9yZWc7CQkJCQkvKiBUeXBlIDIgKFJDVi9YTVQpIHJlZ2lzdGVyICovCisKKwkvKiBTdG9yYWdlIGZvciB1bmljYXN0IGFuZCBtdWx0aWNhc3QgYWRkcmVzcyBlbnRyaWVzIGluIGFkYXB0ZXIgQ0FNICovCisKKwl1OAkJCQl1Y190YWJsZVsxKkZERElfS19BTEVOXTsKKwl1MzIJCQkJdWNfY291bnQ7CQkJCQkJLyogbnVtYmVyIG9mIHVuaWNhc3QgYWRkcmVzc2VzICovCisJdTgJCQkJbWNfdGFibGVbUElfQ01EX0FERFJfRklMVEVSX0tfU0laRSpGRERJX0tfQUxFTl07CisJdTMyCQkJCW1jX2NvdW50OwkJCQkJCS8qIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisKKwkvKiBDdXJyZW50IHBhY2tldCBmaWx0ZXIgc2V0dGluZ3MgKi8KKworCXUzMgkJCQlpbmRfZ3JvdXBfcHJvbTsJCQkJCS8qIExMQyBpbmRpdmlkdWFsICYgZ3JvdXAgZnJhbWUgcHJvbSBtb2RlICovCisJdTMyCQkJCWdyb3VwX3Byb207CQkJCQkvKiBMTEMgZ3JvdXAgKG11bHRpY2FzdCkgZnJhbWUgcHJvbSBtb2RlICovCisKKwkvKiBMaW5rIGF2YWlsYWJsZSBmbGFnIG5lZWRlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBkcm9wIG91dGdvaW5nIHBhY2tldCByZXF1ZXN0cyAqLworCisJdTMyCQkJCWxpbmtfYXZhaWxhYmxlOwkJCQkJLyogaXMgbGluayBhdmFpbGFibGU/ICovCisKKwkvKiBSZXNvdXJjZXMgdG8gaW5kaWNhdGUgcmVzZXQgdHlwZSB3aGVuIHJlc2V0dGluZyBhZGFwdGVyICovCisKKwl1MzIJCQkJcmVzZXRfdHlwZTsJCQkJCS8qIHNraXAgb3IgcmVydW4gZGlhZ25vc3RpY3MgKi8KKworCS8qIFN0b3JlIHBvaW50ZXJzIHRvIHJlY2VpdmUgYnVmZmVycyBmb3IgcXVldWUgcHJvY2Vzc2luZyBjb2RlICovCisKKwljaGFyCQkJCSpwX3Jjdl9idWZmX3ZhW1BJX1JDVl9EQVRBX0tfTlVNX0VOVFJJRVNdOworCisJLyogU3RvcmUgcG9pbnRlcnMgdG8gdHJhbnNtaXQgYnVmZmVycyBmb3IgdHJhbnNtaXQgY29tcGxldGlvbiBjb2RlICovCisKKwlYTVRfRFJJVkVSX0RFU0NSCQl4bXRfZHJ2X2Rlc2NyX2Jsa1tQSV9YTVRfREFUQV9LX05VTV9FTlRSSUVTXTsKKwkKKwkvKiBUcmFuc21pdCBzcGlubG9ja3MgKi8KKwkKKwlzcGlubG9ja190CQkJbG9jazsKKworCS8qIFN0b3JlIGRldmljZSwgYnVzLXNwZWNpZmljLCBhbmQgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGZvciB0aGlzIGFkYXB0ZXIgKi8KKworCXN0cnVjdCBuZXRfZGV2aWNlCQkqZGV2OwkJCQkJCS8qIHBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlCQkqbmV4dDsKKwl1MzIJCQkJYnVzX3R5cGU7CQkJCQkvKiBidXMgdHlwZSAoMCA9PSBQQ0ksIDEgPT0gRUlTQSkgKi8KKwl1MTYJCQkJYmFzZV9hZGRyOwkJCQkJLyogYmFzZSBJL08gYWRkcmVzcyAoc2FtZSBhcyBkZXYtPmJhc2VfYWRkcikgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqCQlwY2lfZGV2OworCXUzMgkJCQlmdWxsX2R1cGxleF9lbmI7CQkJCS8qIEZEREkgRnVsbCBEdXBsZXggZW5hYmxlICgxID09IG9uLCAyID09IG9mZikgKi8KKwl1MzIJCQkJcmVxX3R0cnQ7CQkJCQkvKiByZXF1ZXN0ZWQgVFRSVCB2YWx1ZSAoaW4gODBucyB1bml0cykgKi8KKwl1MzIJCQkJYnVyc3Rfc2l6ZTsJCQkJCS8qIGFkYXB0ZXIgYnVyc3Qgc2l6ZSAoZW51bWVyYXRlZCkgKi8KKwl1MzIJCQkJcmN2X2J1ZnNfdG9fcG9zdDsJCQkJLyogcmVjZWl2ZSBidWZmZXJzIHRvIHBvc3QgZm9yIExMQyBob3N0IHF1ZXVlICovCisJdTgJCQkJZmFjdG9yeV9tYWNfYWRkcltGRERJX0tfQUxFTl07CQkJLyogZmFjdG9yeSAob24tYm9hcmQpIE1BQyBhZGRyZXNzICovCisKKwkvKiBDb21tb24gRkRESSBzdGF0aXN0aWNzIHN0cnVjdHVyZSBhbmQgcHJpdmF0ZSBjb3VudGVycyAqLworCisJc3RydWN0IGZkZGlfc3RhdGlzdGljcwlzdGF0czsKKworCXUzMgkJCQlyY3ZfZGlzY2FyZHM7CisJdTMyCQkJCXJjdl9jcmNfZXJyb3JzOworCXUzMgkJCQlyY3ZfZnJhbWVfc3RhdHVzX2Vycm9yczsKKwl1MzIJCQkJcmN2X2xlbmd0aF9lcnJvcnM7CisJdTMyCQkJCXJjdl90b3RhbF9mcmFtZXM7CisJdTMyCQkJCXJjdl9tdWx0aWNhc3RfZnJhbWVzOworCXUzMgkJCQlyY3ZfdG90YWxfYnl0ZXM7CisKKwl1MzIJCQkJeG10X2Rpc2NhcmRzOworCXUzMgkJCQl4bXRfbGVuZ3RoX2Vycm9yczsKKwl1MzIJCQkJeG10X3RvdGFsX2ZyYW1lczsKKwl1MzIJCQkJeG10X3RvdGFsX2J5dGVzOworCX0gREZYX2JvYXJkX3Q7CisKKyNlbmRpZgkvKiAjaWZuZGVmIF9ERUZYWF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGVwY2EuYyBiL2RyaXZlcnMvbmV0L2RlcGNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhYTVmZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RlcGNhLmMKQEAgLTAsMCArMSwyMTIyIEBACisvKiAgZGVwY2EuYzogQSBESUdJVEFMIERFUENBICYgRXRoZXJXT1JLUyBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LgorCisgICAgV3JpdHRlbiAxOTk0LCAxOTk1IGJ5IERhdmlkIEMuIERhdmllcy4KKworCisgICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IDE5OTQgRGF2aWQgQy4gRGF2aWVzCisJCSAgICAgICAgICAgICAgICAgICBhbmQgCisJCQkgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50CisJIChhcyByZXByZXNlbnRlZCBieSB0aGUgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeSkuICAKKworICAgICAgICAgICAgICAgQ29weXJpZ2h0IDE5OTUgIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLgorCisKKyAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworICAgIFRoaXMgZHJpdmVyIGlzIHdyaXR0ZW4gZm9yIHRoZSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiBzZXJpZXMKKyAgICBvZiBERVBDQSBhbmQgRXRoZXJXT1JLUyBldGhlcm5ldCBjYXJkczoKKworICAgICAgICBERVBDQSAgICAgICAodGhlIG9yaWdpbmFsKQorICAgIAlERTEwMAorICAgIAlERTEwMQorCURFMjAwIFR1cmJvCisJREUyMDEgVHVyYm8KKwlERTIwMiBUdXJibyAoVFAgQk5DKQorCURFMjEwCisJREU0MjIgICAgICAgKEVJU0EpCisKKyAgICBUaGUgIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgb24gREUxMDAsIERFMjAwIGFuZCBERTIwMiBjYXJkcyAgaW4gIGEKKyAgICByZWxhdGl2ZWx5IGJ1c3kgbmV0d29yay4gVGhlIERFNDIyIGhhcyBiZWVuIHRlc3RlZCBhIGxpdHRsZS4KKworICAgIFRoaXMgIGRyaXZlciB3aWxsIE5PVCB3b3JrICAgZm9yIHRoZSBERTIwMywgIERFMjA0ICBhbmQgREUyMDUgc2VyaWVzICBvZgorICAgIGNhcmRzLCAgc2luY2UgdGhleSBoYXZlICBhICBuZXcgY3VzdG9tIEFTSUMgaW4gICBwbGFjZSBvZiB0aGUgQU1EICBMQU5DRQorICAgIGNoaXAuICBTZWUgdGhlICdld3JrMy5jJyAgIGRyaXZlciBpbiB0aGUgIExpbnV4ICBzb3VyY2UgdHJlZSBmb3IgcnVubmluZworICAgIHRob3NlIGNhcmRzLgorCisgICAgSSBoYXZlIGJlbmNobWFya2VkIHRoZSBkcml2ZXIgd2l0aCBhICBERTEwMCBhdCA1OTVrQi9zIHRvICg1NDJrQi9zIGZyb20pCisgICAgYSBERUNzdGF0aW9uIDUwMDAvMjAwLgorCisgICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhdCBkYXZpZXNAbWFuaWFjLnVsdHJhbmV0LmNvbQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhlICBkcml2ZXIgd2FzIG9yaWdpbmFsbHkgYmFzZWQgIG9uICAgdGhlICdsYW5jZS5jJyBkcml2ZXIgZnJvbSAgRG9uYWxkCisgICAgQmVja2VyICAgd2hpY2ggIGlzIGluY2x1ZGVkIHdpdGggIHRoZSAgc3RhbmRhcmQgIGRyaXZlciBkaXN0cmlidXRpb24gZm9yCisgICAgbGludXguICBWMC40ICBpcyAgYSBjb21wbGV0ZSAgcmUtd3JpdGUgIHdpdGggb25seSAgdGhlIGtlcm5lbCAgaW50ZXJmYWNlCisgICAgcmVtYWluaW5nIGZyb20gdGhlIG9yaWdpbmFsIGNvZGUuCisKKyAgICAxKSBMYW5jZS5jIGNvZGUgaW4gL2xpbnV4L2RyaXZlcnMvbmV0LworICAgIDIpICJFdGhlcm5ldC9JRUVFIDgwMi4zIEZhbWlseS4gMTk5MiBXb3JsZCBOZXR3b3JrIERhdGEgQm9vay9IYW5kYm9vayIsCisgICAgICAgQU1ELCAxOTkyIFsoODAwKSAyMjItOTMyM10uCisgICAgMykgIkFtNzlDOTAgQ01PUyBMb2NhbCBBcmVhIE5ldHdvcmsgQ29udHJvbGxlciBmb3IgRXRoZXJuZXQgKEMtTEFOQ0UpIiwKKyAgICAgICBBTUQsIFB1Yi4gIzE3ODgxLCBNYXkgMTk5My4KKyAgICA0KSAiQW03OUM5NjAgUENuZXQtSVNBKHRtKSwgU2luZ2xlLUNoaXAgRXRoZXJuZXQgQ29udHJvbGxlciBmb3IgSVNBIiwKKyAgICAgICBBTUQsIFB1Yi4gIzE2OTA3LCBNYXkgMTk5MgorICAgIDUpICJERUMgRXRoZXJXT1JLUyBMQyBFdGhlcm5ldCBDb250cm9sbGVyIE93bmVycyBNYW51YWwiLAorICAgICAgIERpZ2l0YWwgRXF1aXBtZW50IGNvcnBvcmF0aW9uLCAxOTkwLCBQdWIuICNFSy1ERTEwMC1PTS4wMDMKKyAgICA2KSAiREVDIEV0aGVyV09SS1MgVHVyYm8gRXRoZXJuZXQgQ29udHJvbGxlciBPd25lcnMgTWFudWFsIiwKKyAgICAgICBEaWdpdGFsIEVxdWlwbWVudCBjb3Jwb3JhdGlvbiwgMTk5MCwgUHViLiAjRUstREUyMDAtT00uMDAzCisgICAgNykgIkRFUENBIEhhcmR3YXJlIFJlZmVyZW5jZSBNYW51YWwiLCBQdWIuICNFSy1ERVBDQS1QUgorICAgICAgIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCAxOTg5CisgICAgOCkgIkRFQyBFdGhlcldPUktTIFR1cmJvXyhUUCBCTkMpIEV0aGVybmV0IENvbnRyb2xsZXIgT3duZXJzIE1hbnVhbCIsCisgICAgICAgRGlnaXRhbCBFcXVpcG1lbnQgY29ycG9yYXRpb24sIDE5OTEsIFB1Yi4gI0VLLURFMjAyLU9NLjAwMQorICAgIAorCisgICAgUGV0ZXIgQmF1ZXIncyBkZXBjYS5jIChWMC41KSB3YXMgcmVmZXJyZWQgdG8gd2hlbiBkZWJ1Z2dpbmcgVjAuMSBvZiB0aGlzCisgICAgZHJpdmVyLgorCisgICAgVGhlIG9yaWdpbmFsIERFUENBICBjYXJkIHJlcXVpcmVzIHRoYXQgdGhlICBldGhlcm5ldCBST00gYWRkcmVzcyBjb3VudGVyCisgICAgYmUgZW5hYmxlZCB0byBjb3VudCBhbmQgaGFzIGFuIDggYml0IE5JQ1NSLiAgVGhlIFJPTSBjb3VudGVyIGVuYWJsaW5nIGlzCisgICAgb25seSAgZG9uZSB3aGVuIGEgIDB4MDggaXMgcmVhZCBhcyB0aGUgIGZpcnN0IGFkZHJlc3Mgb2N0ZXQgKHRvIG1pbmltaXNlCisgICAgdGhlIGNoYW5jZXMgIG9mIHdyaXRpbmcgb3ZlciBzb21lICBvdGhlciBoYXJkd2FyZSdzICBJL08gcmVnaXN0ZXIpLiAgVGhlCisgICAgTklDU1IgYWNjZXNzZXMgICBoYXZlIGJlZW4gY2hhbmdlZCAgdG8gIGJ5dGUgYWNjZXNzZXMgIGZvciBhbGwgdGhlIGNhcmRzCisgICAgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLCBzaW5jZSB0aGVyZSBpcyBvbmx5IG9uZSAgdXNlZnVsIGJpdCBpbiB0aGUgTVNCCisgICAgKHJlbW90ZSBib290IHRpbWVvdXQpIGFuZCBpdCAgaXMgbm90IHVzZWQuICBBbHNvLCB0aGVyZSAgaXMgYSBtYXhpbXVtIG9mCisgICAgb25seSA0OGtCIG5ldHdvcmsgIFJBTSBmb3IgdGhpcyAgY2FyZC4gIE15IHRoYW5rcyAgdG8gVG9yYmpvcm4gTGluZGggZm9yCisgICAgaGVscCBkZWJ1Z2dpbmcgYWxsIHRoaXMgKGFuZCBob2xkaW5nIG15IGZlZXQgdG8gIHRoZSBmaXJlIHVudGlsIEkgZ290IGl0CisgICAgcmlnaHQpLgorCisgICAgVGhlIERFMjAwICBzZXJpZXMgIGJvYXJkcyBoYXZlICBvbi1ib2FyZCA2NGtCICBSQU0gZm9yICB1c2UgIGFzIGEgc2hhcmVkCisgICAgbWVtb3J5IG5ldHdvcmsgIGJ1ZmZlci4gT25seSB0aGUgREUxMDAgIGNhcmRzIG1ha2UgdXNlICBvZiBhICAya0IgYnVmZmVyCisgICAgbW9kZSB3aGljaCBoYXMgbm90ICBiZWVuIGltcGxlbWVudGVkIGluICB0aGlzIGRyaXZlciAob25seSB0aGUgMzJrQiAgYW5kCisgICAgNjRrQiBtb2RlcyBhcmUgc3VwcG9ydGVkIFsxNmtCLzQ4a0IgZm9yIHRoZSBvcmlnaW5hbCBERVBDQV0pLgorCisgICAgQXQgdGhlIG1vc3Qgb25seSAyIERFUENBIGNhcmRzIGNhbiAgYmUgc3VwcG9ydGVkIG9uICB0aGUgSVNBIGJ1cyBiZWNhdXNlCisgICAgdGhlcmUgaXMgb25seSBwcm92aXNpb24gIGZvciB0d28gSS9PIGJhc2UgYWRkcmVzc2VzICBvbiBlYWNoIGNhcmQgKDB4MzAwCisgICAgYW5kIDB4MjAwKS4gVGhlIEkvTyBhZGRyZXNzIGlzIGRldGVjdGVkIGJ5IHNlYXJjaGluZyBmb3IgYSBieXRlIHNlcXVlbmNlCisgICAgaW4gdGhlIEV0aGVybmV0IHN0YXRpb24gYWRkcmVzcyBQUk9NIGF0IHRoZSBleHBlY3RlZCBJL08gYWRkcmVzcyBmb3IgdGhlCisgICAgRXRoZXJuZXQgIFBST00uICAgVGhlIHNoYXJlZCBtZW1vcnkgIGJhc2UgICBhZGRyZXNzICBpcyAnYXV0b3Byb2JlZCcgIGJ5CisgICAgbG9va2luZyAgZm9yIHRoZSBzZWxmICB0ZXN0IFBST00gIGFuZCBkZXRlY3RpbmcgdGhlICBjYXJkIG5hbWUuICAgV2hlbiBhCisgICAgc2Vjb25kICBERVBDQSBpcyAgZGV0ZWN0ZWQsICBpbmZvcm1hdGlvbiAgaXMgICBwbGFjZWQgaW4gdGhlICAgYmFzZV9hZGRyCisgICAgdmFyaWFibGUgb2YgdGhlICBuZXh0IGRldmljZSBzdHJ1Y3R1cmUgKHdoaWNoICBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeSksCisgICAgdGh1cyAgZW5hYmxpbmcgZXRoaWZfcHJvYmUgIGluaXRpYWxpemF0aW9uICBmb3IgdGhlIGRldmljZS4gIE1vcmUgdGhhbiAyCisgICAgRUlTQSBjYXJkcyBjYW4gIGJlICBzdXBwb3J0ZWQsIGJ1dCAgY2FyZSB3aWxsICBiZSAgbmVlZGVkIGFzc2lnbmluZyAgdGhlCisgICAgc2hhcmVkIG1lbW9yeSB0byBlbnN1cmUgdGhhdCBlYWNoIHNsb3QgaGFzIHRoZSAgY29ycmVjdCBJUlEsIEkvTyBhZGRyZXNzCisgICAgYW5kIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyBhc3NpZ25lZC4KKworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTk9URTogSWYgeW91IGFyZSB1c2luZyB0d28gIElTQSBERVBDQXMsIGl0IGlzICBpbXBvcnRhbnQgdGhhdCB5b3UgYXNzaWduCisgICAgdGhlIGJhc2UgbWVtb3J5IGFkZHJlc3NlcyBjb3JyZWN0bHkuICAgVGhlICBkcml2ZXIgYXV0b3Byb2JlcyBJL08gIDB4MzAwCisgICAgdGhlbiAweDIwMC4gIFRoZSAgYmFzZSBtZW1vcnkgYWRkcmVzcyBmb3IgIHRoZSBmaXJzdCBkZXZpY2UgbXVzdCBiZSBsZXNzCisgICAgdGhhbiB0aGF0IG9mIHRoZSBzZWNvbmQgc28gdGhhdCB0aGUgYXV0byBwcm9iZSB3aWxsIGNvcnJlY3RseSBhc3NpZ24gdGhlCisgICAgSS9PIGFuZCBtZW1vcnkgYWRkcmVzc2VzIG9uIHRoZSBzYW1lIGNhcmQuICBJIGNhbid0IHRoaW5rIG9mIGEgd2F5IHRvIGRvCisgICAgdGhpcyB1bmFtYmlndW91c2x5IGF0IHRoZSBtb21lbnQsIHNpbmNlIHRoZXJlIGlzIG5vdGhpbmcgb24gdGhlIGNhcmRzIHRvCisgICAgdGllIEkvTyBhbmQgbWVtb3J5IGluZm9ybWF0aW9uIHRvZ2V0aGVyLgorCisgICAgSSBhbSB1bmFibGUgIHRvICB0ZXN0ICAyIGNhcmRzICAgdG9nZXRoZXIgZm9yIG5vdywgICAgc28gdGhpcyAgY29kZSAgIGlzCisgICAgdW5jaGVja2VkLiBBbGwgcmVwb3J0cywgZ29vZCBvciBiYWQsIGFyZSB3ZWxjb21lLgorCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBUaGUgYm9hcmQgSVJRICAgc2V0dGluZyBtdXN0IGJlICBhdCBhbiAgdW51c2VkIElSUSB3aGljaCAgaXMgYXV0by1wcm9iZWQKKyAgICB1c2luZyBEb25hbGQgQmVja2VyJ3MgYXV0b3Byb2JlIHJvdXRpbmVzLiBERVBDQSBhbmQgREUxMDAgYm9hcmQgSVJRcyBhcmUKKyAgICB7MiwzLDQsNSw3fSwgd2hlcmVhcyB0aGUgIERFMjAwIGlzIGF0IHs1LDksMTAsMTEsMTV9LiAgTm90ZSB0aGF0IElSUTIgaXMKKyAgICByZWFsbHkgSVJROSBpbiBtYWNoaW5lcyB3aXRoIDE2IElSUSBsaW5lcy4KKworICAgIE5vIDE2TUIgbWVtb3J5ICBsaW1pdGF0aW9uIHNob3VsZCBleGlzdCB3aXRoIHRoaXMgIGRyaXZlciBhcyBETUEgaXMgIG5vdAorICAgIHVzZWQgYW5kIHRoZSBjb21tb24gbWVtb3J5IGFyZWEgaXMgaW4gbG93IG1lbW9yeSBvbiB0aGUgbmV0d29yayBjYXJkIChteQorICAgIGN1cnJlbnQgc3lzdGVtIGhhcyAyME1CIGFuZCBJJ3ZlIG5vdCBoYWQgcHJvYmxlbXMgeWV0KS4KKworICAgIFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyBkcml2ZXIgYXMgYSBsb2FkYWJsZSBtb2R1bGUgaGFzIGJlZW4gYWRkZWQuIFRvCisgICAgdXRpbGlzZSB0aGlzIGFiaWxpdHksIHlvdSBoYXZlIHRvIGRvIDw4IHRoaW5nczoKKworICAgIDApIGhhdmUgYSBjb3B5IG9mIHRoZSBsb2FkYWJsZSBtb2R1bGVzIGNvZGUgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLgorICAgIDEpIGNvcHkgZGVwY2EuYyBmcm9tIHRoZSAgL2xpbnV4L2RyaXZlcnMvbmV0IGRpcmVjdG9yeSB0byB5b3VyIGZhdm91cml0ZQorICAgIHRlbXBvcmFyeSBkaXJlY3RvcnkuCisgICAgMikgaWYgeW91IHdpc2gsIGVkaXQgdGhlICBzb3VyY2UgY29kZSBuZWFyICBsaW5lIDE1MzAgdG8gcmVmbGVjdCB0aGUgSS9PCisgICAgYWRkcmVzcyBhbmQgSVJRIHlvdSdyZSB1c2luZyAoc2VlIGFsc28gNSkuCisgICAgMykgY29tcGlsZSAgZGVwY2EuYywgYnV0IGluY2x1ZGUgLURNT0RVTEUgaW4gIHRoZSBjb21tYW5kIGxpbmUgdG8gZW5zdXJlCisgICAgdGhhdCB0aGUgY29ycmVjdCBiaXRzIGFyZSBjb21waWxlZCAoc2VlIGVuZCBvZiBzb3VyY2UgY29kZSkuCisgICAgNCkgaWYgeW91IGFyZSB3YW50aW5nIHRvIGFkZCBhIG5ldyAgY2FyZCwgZ290byA1LiBPdGhlcndpc2UsIHJlY29tcGlsZSBhCisgICAga2VybmVsIHdpdGggdGhlIGRlcGNhIGNvbmZpZ3VyYXRpb24gdHVybmVkIG9mZiBhbmQgcmVib290LgorICAgIDUpIGluc21vZCBkZXBjYS5vIFtpcnE9N10gW2lvPTB4MjAwXSBbbWVtPTB4ZDAwMDBdIFthZGFwdGVyX25hbWU9REUxMDBdCisgICAgICAgW0FsYW4gQ294OiBDaGFuZ2VkIHRoZSBjb2RlIHRvIGFsbG93IGNvbW1hbmQgbGluZSBpcnEvaW8gYXNzaWdubWVudHNdCisgICAgICAgW0RhdmUgRGF2aWVzOiBDaGFuZ2VkIHRoZSBjb2RlIHRvIGFsbG93IGNvbW1hbmQgbGluZSBtZW0vbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRzXQorICAgIDYpIHJ1biB0aGUgbmV0IHN0YXJ0dXAgYml0cyBmb3IgeW91ciBldGg/PyBpbnRlcmZhY2UgbWFudWFsbHkgCisgICAgKHVzdWFsbHkgL2V0Yy9yYy5pbmV0WzEyXSBhdCBib290IHRpbWUpLiAKKyAgICA3KSBlbmpveSEKKworICAgIE5vdGUgdGhhdCBhdXRvcHJvYmluZyBpcyBub3QgYWxsb3dlZCBpbiBsb2FkYWJsZSBtb2R1bGVzIC0gdGhlIHN5c3RlbSBpcworICAgIGFscmVhZHkgdXAgYW5kIHJ1bm5pbmcgYW5kIHlvdSdyZSBtZXNzaW5nIHdpdGggaW50ZXJydXB0cy4KKworICAgIFRvIHVubG9hZCBhIG1vZHVsZSwgdHVybiBvZmYgdGhlIGFzc29jaWF0ZWQgaW50ZXJmYWNlIAorICAgICdpZmNvbmZpZyBldGg/PyBkb3duJyB0aGVuICdybW1vZCBkZXBjYScuCisKKyAgICBUbyBhc3NpZ24gYSBiYXNlIG1lbW9yeSBhZGRyZXNzIGZvciB0aGUgc2hhcmVkIG1lbW9yeSAgd2hlbiBydW5uaW5nIGFzIGEKKyAgICBsb2FkYWJsZSBtb2R1bGUsIHNlZSA1IGFib3ZlLiAgVG8gaW5jbHVkZSB0aGUgYWRhcHRlciAgbmFtZSAoaWYgeW91IGhhdmUKKyAgICBubyBQUk9NICBidXQga25vdyB0aGUgY2FyZCBuYW1lKSAgYWxzbyBzZWUgNSAgYWJvdmUuIE5vdGUgdGhhdCB0aGlzIGxhc3QKKyAgICBvcHRpb24gIHdpbGwgbm90IHdvcmsgIHdpdGgga2VybmVsICBidWlsdC1pbiAgZGVwY2Ency4gCisKKyAgICBUaGUgc2hhcmVkIG1lbW9yeSBhc3NpZ25tZW50IGZvciBhIGxvYWRhYmxlIG1vZHVsZSAgbWFrZXMgc2Vuc2UgdG8gYXZvaWQKKyAgICB0aGUgJ21lbW9yeSBhdXRvcHJvYmUnIHBpY2tpbmcgdGhlIHdyb25nIHNoYXJlZCBtZW1vcnkgIChmb3IgdGhlIGNhc2Ugb2YKKyAgICAyIGRlcGNhJ3MgaW4gYSBQQykuCisKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBTdXBwb3J0IGZvciBNQ0EgRXRoZXJXT1JLUyBjYXJkcyBhZGRlZCAxMS0zLTk4LgorICAgIFZlcmlmaWVkIHRvIHdvcmsgd2l0aCB1cCB0byAyIERFMjEyIGNhcmRzIGluIGEgc3lzdGVtIChhbHRob3VnaCBub3QKKyAgICAgIGZ1bGx5IHN0cmVzcy10ZXN0ZWQpLiAgCisKKyAgICBDdXJyZW50bHkga25vd24gYnVncy9saW1pdGF0aW9uczoKKworICAgIE5vdGU6ICB3aXRoIHRoZSBNQ0Egc3R1ZmYgYXMgYSBtb2R1bGUsIGl0IHRydXN0cyB0aGUgTUNBIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgIG5vdCB0aGUgY29tbWFuZCBsaW5lIGZvciBJUlEgYW5kIG1lbW9yeSBhZGRyZXNzLiAgWW91IGNhbgorICAgICAgICAgICBzcGVjaWZ5IHRoZW0gaWYgeW91IHdhbnQsIGJ1dCBpdCB3aWxsIHRocm93IHlvdXIgdmFsdWVzIG91dC4KKyAgICAgICAgICAgWW91IHN0aWxsIGhhdmUgdG8gcGFzcyB0aGUgSU8gYWRkcmVzcyBpdCB3YXMgY29uZmlndXJlZCBhcworICAgICAgICAgICB0aG91Z2guCisKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBUTyBETzoKKyAgICAtLS0tLS0KKworCisgICAgUmV2aXNpb24gSGlzdG9yeQorICAgIC0tLS0tLS0tLS0tLS0tLS0KKworICAgIFZlcnNpb24gICBEYXRlICAgICAgICBEZXNjcmlwdGlvbgorICAKKyAgICAgIDAuMSAgICAgMjUtamFuLTk0ICAgSW5pdGlhbCB3cml0aW5nLgorICAgICAgMC4yICAgICAyNy1qYW4tOTQgICBBZGRlZCBMQU5DRSBUWCBoYXJkd2FyZSBidWZmZXIgY2hhaW5pbmcuCisgICAgICAwLjMgICAgICAxLWZlYi05NCAgIEFkZGVkIG11bHRpcGxlIERFUENBIHN1cHBvcnQuCisgICAgICAwLjMxICAgICA0LWZlYi05NCAgIEFkZGVkIERFMjAyIHJlY29nbml0aW9uLgorICAgICAgMC4zMiAgICAxOS1mZWItOTQgICBUaWR5IHVwLiBJbXByb3ZlIG11bHRpLURFUENBIHN1cHBvcnQuCisgICAgICAwLjMzICAgIDI1LWZlYi05NCAgIEZpeCBERVBDQSBldGhlcm5ldCBST00gY291bnRlciBlbmFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBqYWJiZXIgcGFja2V0IGZpeCBmcm9tIG11cmZAcGVyZnRlY2guY29tCisJCQkgIGFuZCBiZWNrZXJAc3VwZXIub3JnCisgICAgICAwLjM0ICAgICA3LW1hci05NCAgIEZpeCBERVBDQSBtYXggbmV0d29yayBtZW1vcnkgUkFNICYgTklDU1IgYWNjZXNzLgorICAgICAgMC4zNSAgICAgOC1tYXItOTQgICBBZGRlZCBERTIwMSByZWNvZ25pdGlvbi4gVGlkaWVkIHVwLgorICAgICAgMC4zNTEgICAzMC1hcHItOTQgICBBZGRlZCBFSVNBIHN1cHBvcnQuIEFkZGVkIERFNDIyIHJlY29nbml0aW9uLgorICAgICAgMC4zNiAgICAxNi1tYXktOTQgICBERTQyMiBmaXggcmVsZWFzZWQuCisgICAgICAwLjM3ICAgIDIyLWp1bC05NCAgIEFkZGVkIE1PRFVMRSBzdXBwb3J0CisgICAgICAwLjM4ICAgIDE1LWF1Zy05NCAgIEFkZGVkIERCUiBST00gc3dpdGNoIGluIGRlcGNhX2Nsb3NlKCkuIAorICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aSBERVBDQSBidWcgZml4LgorICAgICAgMC4zOGF4cCAxNS1zZXAtOTQgICBTcGVjaWFsIHZlcnNpb24gZm9yIEFscGhhIEFYUCBMaW51eCBWMS4wLgorICAgICAgMC4zODEgICAxMi1kZWMtOTQgICBBZGRlZCBERTEwMSByZWNvZ25pdGlvbiwgZml4IG11bHRpY2FzdCBidWcuCisgICAgICAwLjM4MiAgICA5LWZlYi05NSAgIEZpeCByZWNvZ25pdGlvbiBidWcgcmVwb3J0ZWQgYnkgPGJrbUBzdGFyLnJsLmFjLnVrPi4KKyAgICAgIDAuMzgzICAgMjItZmViLTk1ICAgRml4IGZvciBjb25mbGljdCB3aXRoIFZFU0EgU0NTSSByZXBvcnRlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb21haW5AYWxmLmRlYy5jb20+CisgICAgICAwLjM4NCAgIDE3LW1hci05NSAgIEZpeCBhIHJpbmcgZnVsbCBidWcgcmVwb3J0ZWQgYnkgPGJrbUBzdGFyLnJsLmFjLnVrPgorICAgICAgMC4zODUgICAgMy1hcHItOTUgICBGaXggYSByZWNvZ25pdGlvbiBidWcgcmVwb3J0ZWQgYnkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cnlhbi5uaWVtaUBsYXN0ZnJvbnRpZXIuY29tPgorICAgICAgMC4zODYgICAyMS1hcHItOTUgICBGaXggdGhlIGxhc3QgZml4Li4uc29ycnksIG11c3QgYmUgZ2FsbG9waW5nIHNlbmlsaXR5CisgICAgICAwLjQwICAgIDI1LU1heS05NSAgIFJld3JpdGUgZm9yIHBvcnRhYmlsaXR5ICYgdXBkYXRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEEgc3VwcG9ydCBmcm9tIDxqZXN0YWJyb0BhbXQudGF5MS5kZWMuY29tPgorICAgICAgMC40MSAgICAyNi1KdW4tOTUgICBBZGRlZCB2ZXJpZnlfYXJlYSgpIGNhbGxzIGluIGRlcGNhX2lvY3RsKCkgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uIGJ5IDxoZWlrb0Bjb2xvc3N1cy5lc2NhcGUuZGU+CisgICAgICAwLjQyICAgIDI3LURlYy05NSAgIEFkZCAnbWVtJyBzaGFyZWQgbWVtb3J5IGFzc2lnbm1lbnQgZm9yIGxvYWRhYmxlIAorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgJ2FkYXB0ZXJfbmFtZScgZm9yIGxvYWRhYmxlIG1vZHVsZXMgd2hlbiBubyBQUk9NLgorCQkJICBCb3RoIGFib3ZlIGZyb20gYSBzdWdnZXN0aW9uIGJ5IAorCQkJICA8cGNoZW5Ad29vZHJ1ZmZzMTIxLnJlc2lkZW5jZS5nYXRlY2guZWR1Pi4KKwkJCSAgQWRkIG5ldyBtdWx0aWNhc3RpbmcgY29kZS4KKyAgICAgIDAuNDIxICAgMjItQXByLTk2CSAgRml4IGFsbG9jX2RldmljZSgpIGJ1ZyA8amFyaUBtYXJra3VzMi5maW1yLmZpPgorICAgICAgMC40MjIgICAyOS1BcHItOTYJICBGaXggZGVwY2FfaHdfaW5pdCgpIGJ1ZyA8amFyaUBtYXJra3VzMi5maW1yLmZpPgorICAgICAgMC40MjMgICAgNy1KdW4tOTYgICBGaXggbW9kdWxlIGxvYWQgYnVnIDxrbWdAYmFyY28uYmU+CisgICAgICAwLjQzICAgIDE2LUF1Zy05NiAgIFVwZGF0ZSBhbGxvY19kZXZpY2UoKSB0byBjb25mb3JtIHRvIGRlNHg1LmMKKyAgICAgIDAuNDQgICAgIDEtU2VwLTk3ICAgRml4ICpfcHJvYmUoKSB0byB0ZXN0IGNoZWNrX3JlZ2lvbigpIGZpcnN0IC0gYnVnCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZCBieSA8bW1vZ2lsdmlAZWxiZXJ0LnVjY3MuZWR1PgorICAgICAgMC40NSAgICAgMy1Ob3YtOTggICBBZGRlZCBzdXBwb3J0IGZvciBNQ0EgRXRoZXJXT1JLUyAoREUyMTAvREUyMTIpIGNhcmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA8dHltbUBjb21wdXRlci5vcmc+IAorICAgICAgMC40NTEgICAgNS1Ob3YtOTggICBGaXhlZCBtY2Egc3R1ZmYgY3V6IEknbSBhIGR1bW15LiA8dHltbUBjb21wdXRlci5vcmc+CisgICAgICAwLjUgICAgIDE0LU5vdi05OCAgIFJlLXNwaW4gZm9yIDIuMS54IGtlcm5lbHMuCisgICAgICAwLjUxICAgIDI3LUp1bi05OSAgIENvcnJlY3QgcmVjZWl2ZWQgcGFja2V0IGxlbmd0aCBmb3IgQ1JDIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydCBieSA8d29ybUBka2lrLmRrPgorICAgICAgMC41MiAgICAxNi1PY3QtMDAgICBGaXhlcyBmb3IgMi4zIGlvIG1lbW9yeSBhY2Nlc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICBGaXggc2hvdy1zdG9wcGVyIChpbnRzIGxlZnQgbWFza2VkKSBpbiBkZXBjYV9pbnRlcnJ1cHQKKwkJCSAgIGJ5IDxwZXRlcmRAcG5kLXBjLmRlbW9uLmNvLnVrPgorICAgICAgMC41MyAgICAxMi1KYW4tMDEJICBSZWxlYXNlIHJlc291cmNlcyBvbiBmYWlsdXJlLCBic3MgdGlkYml0cworICAgICAgCQkJICAgYnkgYWNtZUBjb25lY3RpdmEuY29tLmJyCisgICAgICAwLjU0ICAgIDA4LU5vdi0wMQkgIHVzZSBsaWJyYXJ5IGNyYzMyIGZ1bmN0aW9ucworICAgICAgCQkJICAgYnkgTWF0dF9Eb21zY2hAZGVsbC5jb20KKyAgICAgIDAuNTUgICAgMDEtTWFyLTAzICAgVXNlIEVJU0Evc3lzZnMgZnJhbWV3b3JrIDxtYXpAd2lsZC13aW5kLmZyLmV1Lm9yZz4KKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpZmRlZiBDT05GSUdfTUNBCisjaW5jbHVkZSA8bGludXgvbWNhLmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19FSVNBCisjaW5jbHVkZSA8bGludXgvZWlzYS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJkZXBjYS5oIgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9ICJkZXBjYS5jOnYwLjUzIDIwMDEvMS8xMiBkYXZpZXNAbWFuaWFjLnVsdHJhbmV0LmNvbVxuIjsKKworI2lmZGVmIERFUENBX0RFQlVHCitzdGF0aWMgaW50IGRlcGNhX2RlYnVnID0gREVQQ0FfREVCVUc7CisjZWxzZQorc3RhdGljIGludCBkZXBjYV9kZWJ1ZyA9IDE7CisjZW5kaWYKKworI2RlZmluZSBERVBDQV9OREEgMHhmZmUwCS8qIE5vIERldmljZSBBZGRyZXNzICovCisKKyNkZWZpbmUgVFhfVElNRU9VVCAoMSpIWikKKworLyoKKyoqIEV0aGVybmV0IFBST00gZGVmaW5lcworKi8KKyNkZWZpbmUgUFJPQkVfTEVOR1RIICAgIDMyCisjZGVmaW5lIEVUSF9QUk9NX1NJRyAgICAweEFBNTUwMEZGVUwKKworLyoKKyoqIFNldCB0aGUgbnVtYmVyIG9mIFR4IGFuZCBSeCBidWZmZXJzLiBFbnN1cmUgdGhhdCB0aGUgbWVtb3J5IHJlcXVlc3RlZAorKiogaGVyZSBpcyA8PSB0byB0aGUgYW1vdW50IG9mIHNoYXJlZCBtZW1vcnkgc2V0IHVwIGJ5IHRoZSBib2FyZCBzd2l0Y2hlcy4KKyoqIFRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgTVVTVCBCRSBBIFBPV0VSIE9GIDIuCisqKgorKiogdG90YWxfbWVtb3J5ID0gTlVNX1JYX0RFU0MqKDgrUlhfQlVGRl9TWikgKyBOVU1fVFhfREVTQyooOCtUWF9CVUZGX1NaKQorKi8KKyNkZWZpbmUgTlVNX1JYX0RFU0MgICAgIDgJLyogTnVtYmVyIG9mIFJYIGRlc2NyaXB0b3JzICovCisjZGVmaW5lIE5VTV9UWF9ERVNDICAgICA4CS8qIE51bWJlciBvZiBUWCBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBSWF9CVUZGX1NaCTE1MzYJLyogQnVmZmVyIHNpemUgZm9yIGVhY2ggUnggYnVmZmVyICovCisjZGVmaW5lIFRYX0JVRkZfU1oJMTUzNgkvKiBCdWZmZXIgc2l6ZSBmb3IgZWFjaCBUeCBidWZmZXIgKi8KKworLyoKKyoqIEVJU0EgYnVzIGRlZmluZXMKKyovCisjZGVmaW5lIERFUENBX0VJU0FfSU9fUE9SVFMgMHgwYzAwCS8qIEkvTyBwb3J0IGJhc2UgYWRkcmVzcywgc2xvdCAwICovCisKKy8qCisqKiBJU0EgQnVzIGRlZmluZXMKKyovCisjZGVmaW5lIERFUENBX1JBTV9CQVNFX0FERFJFU1NFUyB7MHhjMDAwMCwweGQwMDAwLDB4ZTAwMDAsMHgwMDAwMH0KKyNkZWZpbmUgREVQQ0FfVE9UQUxfU0laRSAweDEwCisKK3N0YXRpYyBzdHJ1Y3QgeworCXVfbG9uZyBpb2Jhc2U7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlOworfSBkZXBjYV9pb19wb3J0c1tdID0geworCXsgMHgzMDAsIE5VTEwgfSwKKwl7IDB4MjAwLCBOVUxMIH0sCisJeyAwICAgICwgTlVMTCB9LAorfTsKKworLyoKKyoqIE5hbWUgPC0+IEFkYXB0ZXIgbWFwcGluZworKi8KKyNkZWZpbmUgREVQQ0FfU0lHTkFUVVJFIHsiREVQQ0EiLFwKKwkJCSAiREUxMDAiLCJERTEwMSIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICJERTIwMCIsIkRFMjAxIiwiREUyMDIiLFwKKwkJCSAiREUyMTAiLCJERTIxMiIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICJERTQyMiIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICIifQorCitzdGF0aWMgY2hhciogX19pbml0ZGF0YSBkZXBjYV9zaWduYXR1cmVbXSA9IERFUENBX1NJR05BVFVSRTsKKworZW51bSBkZXBjYV90eXBlIHsKKwlERVBDQSwgZGUxMDAsIGRlMTAxLCBkZTIwMCwgZGUyMDEsIGRlMjAyLCBkZTIxMCwgZGUyMTIsIGRlNDIyLCB1bmtub3duCit9OworCitzdGF0aWMgY2hhciBkZXBjYV9zdHJpbmdbXSA9ICJkZXBjYSI7CisKK3N0YXRpYyBpbnQgZGVwY2FfZGV2aWNlX3JlbW92ZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKTsKKworI2lmZGVmIENPTkZJR19FSVNBCitzdGF0aWMgc3RydWN0IGVpc2FfZGV2aWNlX2lkIGRlcGNhX2Vpc2FfaWRzW10gPSB7CisJeyAiREVDNDIyMCIsIGRlNDIyIH0sCisJeyAiIiB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShlaXNhLCBkZXBjYV9laXNhX2lkcyk7CisKK3N0YXRpYyBpbnQgZGVwY2FfZWlzYV9wcm9iZSAgKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZWlzYV9kcml2ZXIgZGVwY2FfZWlzYV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gZGVwY2FfZWlzYV9pZHMsCisJLmRyaXZlciAgID0geworCQkubmFtZSAgICA9IGRlcGNhX3N0cmluZywKKwkJLnByb2JlICAgPSBkZXBjYV9laXNhX3Byb2JlLAorCQkucmVtb3ZlICA9IF9fZGV2ZXhpdF9wIChkZXBjYV9kZXZpY2VfcmVtb3ZlKQorCX0KK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQ0EKKy8qCisqKiBBZGFwdGVyIElEIGZvciB0aGUgTUNBIEV0aGVyV09SS1MgREUyMTAvMjEyIGFkYXB0ZXIKKyovCisjZGVmaW5lIERFMjEwX0lEIDB4NjI4ZAorI2RlZmluZSBERTIxMl9JRCAweDZkZWYKKworc3RhdGljIHNob3J0IGRlcGNhX21jYV9hZGFwdGVyX2lkc1tdID0geworCURFMjEwX0lELAorCURFMjEyX0lELAorCTB4MDAwMAorfTsKKworc3RhdGljIGNoYXIgKmRlcGNhX21jYV9hZGFwdGVyX25hbWVbXSA9IHsKKwkiREVDIEV0aGVyV09SS1MgTUMgQWRhcHRlciAoREUyMTApIiwKKwkiREVDIEV0aGVyV09SS1MgTUMgQWRhcHRlciAoREUyMTIpIiwKKwlOVUxMCit9OworCitzdGF0aWMgZW51bSBkZXBjYV90eXBlIGRlcGNhX21jYV9hZGFwdGVyX3R5cGVbXSA9IHsKKwlkZTIxMCwKKwlkZTIxMiwKKwkwCit9OworCitzdGF0aWMgaW50IGRlcGNhX21jYV9wcm9iZSAoc3RydWN0IGRldmljZSAqKTsKKworc3RhdGljIHN0cnVjdCBtY2FfZHJpdmVyIGRlcGNhX21jYV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gZGVwY2FfbWNhX2FkYXB0ZXJfaWRzLAorCS5kcml2ZXIgICA9IHsKKwkJLm5hbWUgICA9IGRlcGNhX3N0cmluZywKKwkJLmJ1cyAgICA9ICZtY2FfYnVzX3R5cGUsCisJCS5wcm9iZSAgPSBkZXBjYV9tY2FfcHJvYmUsCisJCS5yZW1vdmUgPSBfX2RldmV4aXRfcChkZXBjYV9kZXZpY2VfcmVtb3ZlKSwKKwl9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGRlcGNhX2lzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGRlcGNhX2lzYV9kcml2ZXIgPSB7CisJLm5hbWUgICA9IGRlcGNhX3N0cmluZywKKwkuYnVzICAgID0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZSAgPSBkZXBjYV9pc2FfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGRlcGNhX2RldmljZV9yZW1vdmUpLAorfTsKKwkKKy8qCisqKiBNaXNjZWxsYW5lb3VzIGluZm8uLi4KKyovCisjZGVmaW5lIERFUENBX1NUUkxFTiAxNgorCisvKgorKiogTWVtb3J5IEFsaWdubWVudC4gRWFjaCBkZXNjcmlwdG9yIGlzIDQgbG9uZ3dvcmRzIGxvbmcuIFRvIGZvcmNlIGEKKyoqIHBhcnRpY3VsYXIgYWxpZ25tZW50IG9uIHRoZSBUWCBkZXNjcmlwdG9yLCBhZGp1c3QgREVTQ19TS0lQX0xFTiBhbmQKKyoqIERFU0NfQUxJR04uIERFUENBX0FMSUdOIGFsaWducyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgcHJpdmF0ZSBtZW1vcnkgYXJlYQorKiogYW5kIGhlbmNlIHRoZSBSWCBkZXNjcmlwdG9yIHJpbmcncyBmaXJzdCBlbnRyeS4gCisqLworI2RlZmluZSBERVBDQV9BTElHTjQgICAgICAoKHVfbG9uZyk0IC0gMSkJLyogMSBsb25nd29yZCBhbGlnbiAqLworI2RlZmluZSBERVBDQV9BTElHTjggICAgICAoKHVfbG9uZyk4IC0gMSkJLyogMiBsb25nd29yZCAocXVhZHdvcmQpIGFsaWduICovCisjZGVmaW5lIERFUENBX0FMSUdOICAgICAgICAgREVQQ0FfQUxJR044CS8qIEtlZXAgdGhlIExBTkNFIGhhcHB5Li4uICovCisKKy8qCisqKiBUaGUgREVQQ0EgUnggYW5kIFR4IHJpbmcgZGVzY3JpcHRvcnMuIAorKi8KK3N0cnVjdCBkZXBjYV9yeF9kZXNjIHsKKwl2b2xhdGlsZSBzMzIgYmFzZTsKKwlzMTYgYnVmX2xlbmd0aDsJCS8qIFRoaXMgbGVuZ3RoIGlzIG5lZ2F0aXZlIDIncyBjb21wbGVtZW50ISAqLworCXMxNiBtc2dfbGVuZ3RoOwkJLyogVGhpcyBsZW5ndGggaXMgIm5vcm1hbCIuICovCit9OworCitzdHJ1Y3QgZGVwY2FfdHhfZGVzYyB7CisJdm9sYXRpbGUgczMyIGJhc2U7CisJczE2IGxlbmd0aDsJCS8qIFRoaXMgbGVuZ3RoIGlzIG5lZ2F0aXZlIDIncyBjb21wbGVtZW50ISAqLworCXMxNiBtaXNjOwkJLyogRXJyb3JzIGFuZCBURFIgaW5mbyAqLworfTsKKworI2RlZmluZSBMQV9NQVNLIDB4MDAwMGZmZmYJLyogTEFOQ0UgYWRkcmVzcyBtYXNrIGZvciBtYXBwaW5nIG5ldHdvcmsgUkFNCisJCQkJICAgdG8gTEFOQ0UgbWVtb3J5IGFkZHJlc3Mgc3BhY2UgKi8KKworLyoKKyoqIFRoZSBMYW5jZSBpbml0aWFsaXphdGlvbiBibG9jaywgZGVzY3JpYmVkIGluIGRhdGFib29rLCBpbiBjb21tb24gbWVtb3J5LgorKi8KK3N0cnVjdCBkZXBjYV9pbml0IHsKKwl1MTYgbW9kZTsJCS8qIE1vZGUgcmVnaXN0ZXIgKi8KKwl1OCBwaHlzX2FkZHJbRVRIX0FMRU5dOwkvKiBQaHlzaWNhbCBldGhlcm5ldCBhZGRyZXNzICovCisJdTggbWNhc3RfdGFibGVbOF07CS8qIE11bHRpY2FzdCBIYXNoIFRhYmxlLiAqLworCXUzMiByeF9yaW5nOwkJLyogUnggcmluZyBiYXNlIHBvaW50ZXIgJiByaW5nIGxlbmd0aCAqLworCXUzMiB0eF9yaW5nOwkJLyogVHggcmluZyBiYXNlIHBvaW50ZXIgJiByaW5nIGxlbmd0aCAqLworfTsKKworI2RlZmluZSBERVBDQV9QS1RfU1RBVF9TWiAxNgorI2RlZmluZSBERVBDQV9QS1RfQklOX1NaICAxMjgJLyogU2hvdWxkIGJlID49MTAwIHVubGVzcyB5b3UKKwkJCQkgICBpbmNyZWFzZSBERVBDQV9QS1RfU1RBVF9TWiAqLworc3RydWN0IGRlcGNhX3ByaXZhdGUgeworCWNoYXIgYWRhcHRlcl9uYW1lW0RFUENBX1NUUkxFTl07CS8qIC9wcm9jL2lvcG9ydHMgc3RyaW5nICAgICAgICAgICAgICAgICAgKi8KKwllbnVtIGRlcGNhX3R5cGUgYWRhcHRlcjsJCS8qIEFkYXB0ZXIgdHlwZSAqLworCWVudW0geworICAgICAgICAgICAgICAgIERFUENBX0JVU19NQ0EgPSAxLAorICAgICAgICAgICAgICAgIERFUENBX0JVU19JU0EsCisgICAgICAgICAgICAgICAgREVQQ0FfQlVTX0VJU0EsCisgICAgICAgIH0gZGVwY2FfYnVzOwkgICAgICAgIC8qIHR5cGUgb2YgYnVzICovCisJc3RydWN0IGRlcGNhX2luaXQgaW5pdF9ibG9jazsJLyogU2hhZG93IEluaXRpYWxpemF0aW9uIGJsb2NrICAgICAgICAgICAgKi8KKy8qIENQVSBhZGRyZXNzIHNwYWNlIGZpZWxkcyAqLworCXN0cnVjdCBkZXBjYV9yeF9kZXNjIF9faW9tZW0gKnJ4X3Jpbmc7CS8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgUlggZGVzY3JpcHRvciByaW5nICovCisJc3RydWN0IGRlcGNhX3R4X2Rlc2MgX19pb21lbSAqdHhfcmluZzsJLyogUG9pbnRlciB0byBzdGFydCBvZiBUWCBkZXNjcmlwdG9yIHJpbmcgKi8KKwl2b2lkIF9faW9tZW0gKnJ4X2J1ZmZbTlVNX1JYX0RFU0NdOwkvKiBDUFUgdmlydCBhZGRyZXNzIG9mIHNoJ2QgbWVtb3J5IGJ1ZmZzICAqLworCXZvaWQgX19pb21lbSAqdHhfYnVmZltOVU1fVFhfREVTQ107CS8qIENQVSB2aXJ0IGFkZHJlc3Mgb2Ygc2gnZCBtZW1vcnkgYnVmZnMgICovCisJdm9pZCBfX2lvbWVtICpzaF9tZW07CS8qIENQVSBtYXBwZWQgdmlydCBhZGRyZXNzIG9mIGRldmljZSBSQU0gICovCisJdV9sb25nIG1lbV9zdGFydDsJLyogQnVzIGFkZHJlc3Mgb2YgZGV2aWNlIFJBTSAoYmVmb3JlIHJlbWFwKSAqLworCXVfbG9uZyBtZW1fbGVuOwkJLyogZGV2aWNlIG1lbW9yeSBzaXplICovCisvKiBEZXZpY2UgYWRkcmVzcyBzcGFjZSBmaWVsZHMgKi8KKwl1X2xvbmcgZGV2aWNlX3JhbV9zdGFydDsJLyogU3RhcnQgb2YgUkFNIGluIGRldmljZSBhZGRyIHNwYWNlICAgICAgKi8KKy8qIE9mZnNldHMgdXNlZCBpbiBib3RoIGFkZHJlc3Mgc3BhY2VzICovCisJdV9sb25nIHJ4X3Jpbmdfb2Zmc2V0OwkvKiBPZmZzZXQgZnJvbSBzdGFydCBvZiBSQU0gdG8gcnhfcmluZyAgICAqLworCXVfbG9uZyB0eF9yaW5nX29mZnNldDsJLyogT2Zmc2V0IGZyb20gc3RhcnQgb2YgUkFNIHRvIHR4X3JpbmcgICAgKi8KKwl1X2xvbmcgYnVmZnNfb2Zmc2V0OwkvKiBMQU5DRSBSeCBhbmQgVHggYnVmZmVycyBzdGFydCBhZGRyZXNzLiAqLworLyogS2VybmVsLW9ubHkgKG5vdCBkZXZpY2UpIGZpZWxkcyAqLworCWludCByeF9uZXcsIHR4X25ldzsJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICAgICAgICAgICAgICAgKi8KKwlpbnQgcnhfb2xkLCB0eF9vbGQ7CS8qIFRoZSByaW5nIGVudHJpZXMgdG8gYmUgZnJlZSgpZWQuICAgICAgICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCB7CQkvKiBQcml2YXRlIHN0YXRzIGNvdW50ZXJzICAgICAgICAgICAgICAgICAqLworCQl1MzIgYmluc1tERVBDQV9QS1RfU1RBVF9TWl07CisJCXUzMiB1bmljYXN0OworCQl1MzIgbXVsdGljYXN0OworCQl1MzIgYnJvYWRjYXN0OworCQl1MzIgZXhjZXNzaXZlX2NvbGxpc2lvbnM7CisJCXUzMiB0eF91bmRlcnJ1bnM7CisJCXUzMiBleGNlc3NpdmVfdW5kZXJydW5zOworCX0gcGt0U3RhdHM7CisJaW50IHR4UmluZ01hc2s7CQkvKiBUWCByaW5nIG1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWludCByeFJpbmdNYXNrOwkJLyogUlggcmluZyBtYXNrICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlzMzIgcnhfcmxlbjsJCS8qIGxvZzIocnhSaW5nTWFzaysxKSBmb3IgdGhlIGRlc2NyaXB0b3JzICovCisJczMyIHR4X3JsZW47CQkvKiBsb2cyKHR4UmluZ01hc2srMSkgZm9yIHRoZSBkZXNjcmlwdG9ycyAqLworfTsKKworLyoKKyoqIFRoZSB0cmFuc21pdCByaW5nIGZ1bGwgY29uZGl0aW9uIGlzIGRlc2NyaWJlZCBieSB0aGUgdHhfb2xkIGFuZCB0eF9uZXcKKyoqIHBvaW50ZXJzIGJ5OgorKiogICAgdHhfb2xkICAgICAgICAgICAgPSB0eF9uZXcgICAgRW1wdHkgcmluZworKiogICAgdHhfb2xkICAgICAgICAgICAgPSB0eF9uZXcrMSAgRnVsbCByaW5nCisqKiAgICB0eF9vbGQrdHhSaW5nTWFzayA9IHR4X25ldyAgICBGdWxsIHJpbmcgICh3cmFwcGVkIGNvbmRpdGlvbikKKyovCisjZGVmaW5lIFRYX0JVRkZTX0FWQUlMICgobHAtPnR4X29sZDw9bHAtPnR4X25ldyk/XAorCQkJIGxwLT50eF9vbGQrbHAtPnR4UmluZ01hc2stbHAtPnR4X25ldzpcCisgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnR4X29sZCAgICAgICAgICAgICAgIC1scC0+dHhfbmV3LTEpCisKKy8qCisqKiBQdWJsaWMgRnVuY3Rpb25zCisqLworc3RhdGljIGludCBkZXBjYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBkZXBjYV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGRlcGNhX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgZGVwY2FfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGRlcGNhX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHZvaWQgZGVwY2FfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZGVwY2FfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKgorKiogUHJpdmF0ZSBmdW5jdGlvbnMKKyovCitzdGF0aWMgdm9pZCBkZXBjYV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGRlcGNhX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBkZXBjYV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgTG9hZENTUnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IEluaXRSZXN0YXJ0RGVwY2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IERlcGNhU2lnbmF0dXJlKGNoYXIgKm5hbWUsIHVfbG9uZyBwYWRkcik7CitzdGF0aWMgaW50IERldmljZVByZXNlbnQodV9sb25nIGlvYWRkcik7CitzdGF0aWMgaW50IGdldF9od19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgU2V0TXVsdGljYXN0RmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBsb2FkX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIGRlcGNhX2RiZ19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdV9jaGFyIGRlMXh4X2lycVtdIF9faW5pdGRhdGEgPSB7IDIsIDMsIDQsIDUsIDcsIDksIDAgfTsKK3N0YXRpYyB1X2NoYXIgZGUyeHhfaXJxW10gX19pbml0ZGF0YSA9IHsgNSwgOSwgMTAsIDExLCAxNSwgMCB9Oworc3RhdGljIHVfY2hhciBkZTQyMl9pcnFbXSBfX2luaXRkYXRhID0geyA1LCA5LCAxMCwgMTEsIDAgfTsKK3N0YXRpYyB1X2NoYXIgKmRlcGNhX2lycTsKKworc3RhdGljIGludCBpcnE7CitzdGF0aWMgaW50IGlvOworc3RhdGljIGNoYXIgKmFkYXB0ZXJfbmFtZTsKK3N0YXRpYyBpbnQgbWVtOwkJCS8qIEZvciBsb2FkYWJsZSBtb2R1bGUgYXNzaWdubWVudAorCQkJCSAgIHVzZSBpbnNtb2QgbWVtPTB4Pz8/Pz8gLi4uLiAqLworbW9kdWxlX3BhcmFtIChpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0gKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtIChhZGFwdGVyX25hbWUsIGNoYXJwLCAwKTsKK21vZHVsZV9wYXJhbSAobWVtLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJERVBDQSBJUlEgbnVtYmVyIik7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiREVQQ0EgSS9PIGJhc2UgYWRkcmVzcyIpOworTU9EVUxFX1BBUk1fREVTQyhhZGFwdGVyX25hbWUsICJERVBDQSBhZGFwdGVyIG5hbWUiKTsKK01PRFVMRV9QQVJNX0RFU0MobWVtLCAiREVQQ0Egc2hhcmVkIG1lbW9yeSBhZGRyZXNzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisqKiBNaXNjZWxsYW5lb3VzIGRlZmluZXMuLi4KKyovCisjZGVmaW5lIFNUT1BfREVQQ0EgXAorICAgIG91dHcoQ1NSMCwgREVQQ0FfQUREUik7XAorICAgIG91dHcoU1RPUCwgREVQQ0FfREFUQSkKKworc3RhdGljIGludCBfX2luaXQgZGVwY2FfaHdfaW5pdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBkZXBjYV9wcml2YXRlICpscDsKKwlpbnQgaSwgaiwgb2Zmc2V0LCBuZXRSQU0sIG1lbV9sZW4sIHN0YXR1cyA9IDA7CisJczE2IG5pY3NyOworCXVfbG9uZyBpb2FkZHI7CisJdV9sb25nIG1lbV9zdGFydDsKKworCS8qCisJICogV2UgYXJlIG5vdyBzdXBwb3NlZCB0byBlbnRlciB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlCisJICogZm9sbG93aW5nIGZpZWxkcyBmaWxsZWQgd2l0aCBwcm9wZXIgdmFsdWVzIDoKKwkgKgorCSAqIGRldi0+YmFzZV9hZGRyCisJICogbHAtPm1lbV9zdGFydAorCSAqIGxwLT5kZXBjYV9idXMKKwkgKiBscC0+YWRhcHRlcgorCSAqCisJICogZGV2LT5pcnEgY2FuIGJlIHNldCBpZiBrbm93biBmcm9tIGRldmljZSBjb25maWd1cmF0aW9uIChvbgorCSAqIE1DQSBvciBFSVNBKSBvciBtb2R1bGUgb3B0aW9uLiBPdGhlcndpc2UsIGl0IHdpbGwgYmUgYXV0bworCSAqIGRldGVjdGVkLgorCSAqLworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJCisJU1RPUF9ERVBDQTsKKworCW5pY3NyID0gaW5iKERFUENBX05JQ1NSKTsKKwluaWNzciA9ICgobmljc3IgJiB+U0hFICYgflJCRSAmIH5JRU4pIHwgSU0pOworCW91dGIobmljc3IsIERFUENBX05JQ1NSKTsKKworCWlmIChpbncoREVQQ0FfREFUQSkgIT0gU1RPUCkgeworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWxwID0gKHN0cnVjdCBkZXBjYV9wcml2YXRlICopIGRldi0+cHJpdjsKKwltZW1fc3RhcnQgPSBscC0+bWVtX3N0YXJ0OworCisJaWYgKCFtZW1fc3RhcnQgfHwgbHAtPmFkYXB0ZXIgPCBERVBDQSB8fCBscC0+YWRhcHRlciA+PXVua25vd24pCisJCXJldHVybiAtRU5YSU87CisKKwlwcmludGsgKCIlczogJXMgYXQgMHglMDRseCIsCisJICAgICAgICBkZXZpY2UtPmJ1c19pZCwgZGVwY2Ffc2lnbmF0dXJlW2xwLT5hZGFwdGVyXSwgaW9hZGRyKTsKKwkKKwlzd2l0Y2ggKGxwLT5kZXBjYV9idXMpIHsKKyNpZmRlZiBDT05GSUdfTUNBCisJY2FzZSBERVBDQV9CVVNfTUNBOgorCQlwcmludGsoIiAoTUNBIHNsb3QgJWQpIiwgdG9fbWNhX2RldmljZShkZXZpY2UpLT5zbG90ICsgMSk7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRUlTQQorCWNhc2UgREVQQ0FfQlVTX0VJU0E6CisJCXByaW50aygiIChFSVNBIHNsb3QgJWQpIiwgdG9fZWlzYV9kZXZpY2UoZGV2aWNlKS0+c2xvdCk7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIERFUENBX0JVU19JU0E6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJVbmtub3duIERFUENBIGJ1cyAlZFxuIiwgbHAtPmRlcGNhX2J1cyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJcHJpbnRrKCIsIGgvdyBhZGRyZXNzICIpOworCXN0YXR1cyA9IGdldF9od19hZGRyKGRldik7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCXByaW50aygiICAgICAgd2hpY2ggaGFzIGFuIEV0aGVybmV0IFBST00gQ1JDIGVycm9yLlxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTiAtIDE7IGkrKykgewkvKiBnZXQgdGhlIGV0aGVybmV0IGFkZHJlc3MgKi8KKwkJcHJpbnRrKCIlMi4yeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisJcHJpbnRrKCIlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCisJLyogU2V0IHVwIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBuZXR3b3JrIFJBTShrQikgKi8KKwluZXRSQU0gPSAoKGxwLT5hZGFwdGVyICE9IERFUENBKSA/IDY0IDogNDgpOworCWlmICgobmljc3IgJiBfMTI4S0IpICYmIChscC0+YWRhcHRlciA9PSBkZTQyMikpCisJCW5ldFJBTSA9IDEyODsKKworCS8qIFNoYXJlZCBNZW1vcnkgQmFzZSBBZGRyZXNzICovCisJaWYgKG5pY3NyICYgQlVGKSB7CisJCW5pY3NyICY9IH5CUzsJLyogREVQQ0EgUkFNIGluIHRvcCAzMmsgKi8KKwkJbmV0UkFNIC09IDMyOworCisJCS8qIE9ubHkgRUlTQS9JU0EgbmVlZHMgc3RhcnQgYWRkcmVzcyB0byBiZSByZS1jb21wdXRlZCAqLworCQlpZiAobHAtPmRlcGNhX2J1cyAhPSBERVBDQV9CVVNfTUNBKQorCQkJbWVtX3N0YXJ0ICs9IDB4ODAwMDsKKwl9CisJCisJaWYgKChtZW1fbGVuID0gKE5VTV9SWF9ERVNDICogKHNpemVvZihzdHJ1Y3QgZGVwY2FfcnhfZGVzYykgKyBSWF9CVUZGX1NaKSArIE5VTV9UWF9ERVNDICogKHNpemVvZihzdHJ1Y3QgZGVwY2FfdHhfZGVzYykgKyBUWF9CVUZGX1NaKSArIHNpemVvZihzdHJ1Y3QgZGVwY2FfaW5pdCkpKQorCSAgICA+IChuZXRSQU0gPDwgMTApKSB7CisJCXByaW50aygiLFxuICAgICAgIHJlcXVlc3RzICVka0IgUkFNOiBvbmx5ICVka0IgaXMgYXZhaWxhYmxlIVxuIiwgKG1lbV9sZW4gPj4gMTApLCBuZXRSQU0pOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXByaW50aygiLFxuICAgICAgaGFzICVka0IgUkFNIGF0IDB4JS41bHgiLCBuZXRSQU0sIG1lbV9zdGFydCk7CisKKwkvKiBFbmFibGUgdGhlIHNoYWRvdyBSQU0uICovCisJaWYgKGxwLT5hZGFwdGVyICE9IERFUENBKSB7CisJCW5pY3NyIHw9IFNIRTsKKwkJb3V0YihuaWNzciwgREVQQ0FfTklDU1IpOworCX0KKworCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisJc3ByaW50ZihscC0+YWRhcHRlcl9uYW1lLCAiJXMgKCVzKSIsCisJCWRlcGNhX3NpZ25hdHVyZVtscC0+YWRhcHRlcl0sIGRldmljZS0+YnVzX2lkKTsKKwlzdGF0dXMgPSAtRUJVU1k7CisKKwkvKiBJbml0aWFsaXNhdGlvbiBCbG9jayAqLworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uIChtZW1fc3RhcnQsIG1lbV9sZW4sIGxwLT5hZGFwdGVyX25hbWUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZGVwY2E6IGNhbm5vdCByZXF1ZXN0IElTQSBtZW1vcnksIGFib3J0aW5nXG4iKTsKKwkJZ290byBvdXRfcHJpdjsKKwl9CisJCQorCXN0YXR1cyA9IC1FSU87CisJbHAtPnNoX21lbSA9IGlvcmVtYXAobWVtX3N0YXJ0LCBtZW1fbGVuKTsKKwlpZiAobHAtPnNoX21lbSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZGVwY2E6IGNhbm5vdCByZW1hcCBJU0EgbWVtb3J5LCBhYm9ydGluZ1xuIik7CisJCWdvdG8gb3V0MTsKKwl9CisKKwlscC0+bWVtX3N0YXJ0ID0gbWVtX3N0YXJ0OworCWxwLT5tZW1fbGVuICAgPSBtZW1fbGVuOworCWxwLT5kZXZpY2VfcmFtX3N0YXJ0ID0gbWVtX3N0YXJ0ICYgTEFfTUFTSzsKKworCW9mZnNldCA9IDA7CisJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZGVwY2FfaW5pdCk7CisKKwkvKiBUeCAmIFJ4IGRlc2NyaXB0b3JzIChhbGlnbmVkIHRvIGEgcXVhZHdvcmQgYm91bmRhcnkpICovCisJb2Zmc2V0ID0gKG9mZnNldCArIERFUENBX0FMSUdOKSAmIH5ERVBDQV9BTElHTjsKKwlscC0+cnhfcmluZyA9IChzdHJ1Y3QgZGVwY2FfcnhfZGVzYyBfX2lvbWVtICopIChscC0+c2hfbWVtICsgb2Zmc2V0KTsKKwlscC0+cnhfcmluZ19vZmZzZXQgPSBvZmZzZXQ7CisKKwlvZmZzZXQgKz0gKHNpemVvZihzdHJ1Y3QgZGVwY2FfcnhfZGVzYykgKiBOVU1fUlhfREVTQyk7CisJbHAtPnR4X3JpbmcgPSAoc3RydWN0IGRlcGNhX3R4X2Rlc2MgX19pb21lbSAqKSAobHAtPnNoX21lbSArIG9mZnNldCk7CisJbHAtPnR4X3Jpbmdfb2Zmc2V0ID0gb2Zmc2V0OworCisJb2Zmc2V0ICs9IChzaXplb2Yoc3RydWN0IGRlcGNhX3R4X2Rlc2MpICogTlVNX1RYX0RFU0MpOworCisJbHAtPmJ1ZmZzX29mZnNldCA9IG9mZnNldDsKKworCS8qIEZpbmlzaCBpbml0aWFsaXNpbmcgdGhlIHJpbmcgaW5mb3JtYXRpb24uICovCisJbHAtPnJ4UmluZ01hc2sgPSBOVU1fUlhfREVTQyAtIDE7CisJbHAtPnR4UmluZ01hc2sgPSBOVU1fVFhfREVTQyAtIDE7CisKKwkvKiBDYWxjdWxhdGUgVHgvUnggUkxFTiBzaXplIGZvciB0aGUgZGVzY3JpcHRvcnMuICovCisJZm9yIChpID0gMCwgaiA9IGxwLT5yeFJpbmdNYXNrOyBqID4gMDsgaSsrKSB7CisJCWogPj49IDE7CisJfQorCWxwLT5yeF9ybGVuID0gKHMzMikgKGkgPDwgMjkpOworCWZvciAoaSA9IDAsIGogPSBscC0+dHhSaW5nTWFzazsgaiA+IDA7IGkrKykgeworCQlqID4+PSAxOworCX0KKwlscC0+dHhfcmxlbiA9IChzMzIpIChpIDw8IDI5KTsKKworCS8qIExvYWQgdGhlIGluaXRpYWxpc2F0aW9uIGJsb2NrICovCisJZGVwY2FfaW5pdF9yaW5nKGRldik7CisKKwkvKiBJbml0aWFsaXNlIHRoZSBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXJzICovCisJTG9hZENTUnMoZGV2KTsKKworCS8qIEVuYWJsZSBERVBDQSBib2FyZCBpbnRlcnJ1cHRzIGZvciBhdXRvcHJvYmluZyAqLworCW5pY3NyID0gKChuaWNzciAmIH5JTSkgfCBJRU4pOworCW91dGIobmljc3IsIERFUENBX05JQ1NSKTsKKworCS8qIFRvIGF1dG8tSVJRIHdlIGVuYWJsZSB0aGUgaW5pdGlhbGl6YXRpb24tZG9uZSBhbmQgRE1BIGVyciwKKwkgICBpbnRlcnJ1cHRzLiBGb3Igbm93IHdlIHdpbGwgYWx3YXlzIGdldCBhIERNQSBlcnJvci4gKi8KKwlpZiAoZGV2LT5pcnEgPCAyKSB7CisJCXVuc2lnbmVkIGNoYXIgaXJxbnVtOworCQl1bnNpZ25lZCBsb25nIGlycV9tYXNrLCBkZWxheTsKKworCQlpcnFfbWFzayA9IHByb2JlX2lycV9vbigpOworCisJCS8qIEFzc2lnbiB0aGUgY29ycmVjdCBpcnEgbGlzdCAqLworCQlzd2l0Y2ggKGxwLT5hZGFwdGVyKSB7CisJCWNhc2UgREVQQ0E6CisJCWNhc2UgZGUxMDA6CisJCWNhc2UgZGUxMDE6CisJCQlkZXBjYV9pcnEgPSBkZTF4eF9pcnE7CisJCQlicmVhazsKKwkJY2FzZSBkZTIwMDoKKwkJY2FzZSBkZTIwMToKKwkJY2FzZSBkZTIwMjoKKwkJY2FzZSBkZTIxMDoKKwkJY2FzZSBkZTIxMjoKKwkJCWRlcGNhX2lycSA9IGRlMnh4X2lycTsKKwkJCWJyZWFrOworCQljYXNlIGRlNDIyOgorCQkJZGVwY2FfaXJxID0gZGU0MjJfaXJxOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOwkvKiBOb3QgcmVhY2hlZCAqLworCQl9CisKKwkJLyogVHJpZ2dlciBhbiBpbml0aWFsaXphdGlvbiBqdXN0IGZvciB0aGUgaW50ZXJydXB0LiAqLworCQlvdXR3KElORUEgfCBJTklULCBERVBDQV9EQVRBKTsKKworCQlkZWxheSA9IGppZmZpZXMgKyBIWi81MDsKKwkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGRlbGF5KSkKKwkJCXlpZWxkKCk7CisKKwkJaXJxbnVtID0gcHJvYmVfaXJxX29mZihpcnFfbWFzayk7CisKKwkJc3RhdHVzID0gLUVOWElPOworCQlpZiAoIWlycW51bSkgeworCQkJcHJpbnRrKCIgYW5kIGZhaWxlZCB0byBkZXRlY3QgSVJRIGxpbmUuXG4iKTsKKwkJCWdvdG8gb3V0MjsKKwkJfSBlbHNlIHsKKwkJCWZvciAoZGV2LT5pcnEgPSAwLCBpID0gMDsgKGRlcGNhX2lycVtpXSkgJiYgKCFkZXYtPmlycSk7IGkrKykKKwkJCQlpZiAoaXJxbnVtID09IGRlcGNhX2lycVtpXSkgeworCQkJCQlkZXYtPmlycSA9IGlycW51bTsKKwkJCQkJcHJpbnRrKCIgYW5kIHVzZXMgSVJRJWQuXG4iLCBkZXYtPmlycSk7CisJCQkJfQorCisJCQlpZiAoIWRldi0+aXJxKSB7CisJCQkJcHJpbnRrKCIgYnV0IGluY29ycmVjdCBJUlEgbGluZSBkZXRlY3RlZC5cbiIpOworCQkJCWdvdG8gb3V0MjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXByaW50aygiIGFuZCBhc3NpZ25lZCBJUlElZC5cbiIsIGRldi0+aXJxKTsKKwl9CisKKwlpZiAoZGVwY2FfZGVidWcgPiAxKSB7CisJCXByaW50ayh2ZXJzaW9uKTsKKwl9CisKKwkvKiBUaGUgREVQQ0Etc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSAmZGVwY2Ffb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZkZXBjYV9zdGFydF94bWl0OworCWRldi0+c3RvcCA9ICZkZXBjYV9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZkZXBjYV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+ZG9faW9jdGwgPSAmZGVwY2FfaW9jdGw7CisJZGV2LT50eF90aW1lb3V0ID0gZGVwY2FfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKworCWRldi0+bWVtX3N0YXJ0ID0gMDsKKworCWRldmljZS0+ZHJpdmVyX2RhdGEgPSBkZXY7CisJU0VUX05FVERFVl9ERVYgKGRldiwgZGV2aWNlKTsKKwkKKwlzdGF0dXMgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoc3RhdHVzID09IDApCisJCXJldHVybiAwOworb3V0MjoKKwlpb3VubWFwKGxwLT5zaF9tZW0pOworb3V0MToKKwlyZWxlYXNlX21lbV9yZWdpb24gKG1lbV9zdGFydCwgbWVtX2xlbik7CitvdXRfcHJpdjoKKwlyZXR1cm4gc3RhdHVzOworfQorDAorCitzdGF0aWMgaW50IGRlcGNhX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGRlcGNhX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXVfbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzMTYgbmljc3I7CisJaW50IHN0YXR1cyA9IDA7CisKKwlTVE9QX0RFUENBOworCW5pY3NyID0gaW5iKERFUENBX05JQ1NSKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgc2hhZG93IFJBTSBpcyBlbmFibGVkICovCisJaWYgKGxwLT5hZGFwdGVyICE9IERFUENBKSB7CisJCW5pY3NyIHw9IFNIRTsKKwkJb3V0YihuaWNzciwgREVQQ0FfTklDU1IpOworCX0KKworCS8qIFJlLWluaXRpYWxpemUgdGhlIERFUENBLi4uICovCisJZGVwY2FfaW5pdF9yaW5nKGRldik7CisJTG9hZENTUnMoZGV2KTsKKworCWRlcGNhX2RiZ19vcGVuKGRldik7CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZkZXBjYV9pbnRlcnJ1cHQsIDAsIGxwLT5hZGFwdGVyX25hbWUsIGRldikpIHsKKwkJcHJpbnRrKCJkZXBjYV9vcGVuKCk6IFJlcXVlc3RlZCBJUlElZCBpcyBidXN5XG4iLCBkZXYtPmlycSk7CisJCXN0YXR1cyA9IC1FQUdBSU47CisJfSBlbHNlIHsKKworCQkvKiBFbmFibGUgREVQQ0EgYm9hcmQgaW50ZXJydXB0cyBhbmQgdHVybiBvZmYgTEVEICovCisJCW5pY3NyID0gKChuaWNzciAmIH5JTSAmIH5MRUQpIHwgSUVOKTsKKwkJb3V0YihuaWNzciwgREVQQ0FfTklDU1IpOworCQlvdXR3KENTUjAsIERFUENBX0FERFIpOworCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkJc3RhdHVzID0gSW5pdFJlc3RhcnREZXBjYShkZXYpOworCisJCWlmIChkZXBjYV9kZWJ1ZyA+IDEpIHsKKwkJCXByaW50aygiQ1NSMDogMHglNC40eFxuIiwgaW53KERFUENBX0RBVEEpKTsKKwkJCXByaW50aygibmljc3I6IDB4JTAyeFxuIiwgaW5iKERFUENBX05JQ1NSKSk7CisJCX0KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgbGFuY2UgUnggYW5kIFR4IGRlc2NyaXB0b3IgcmluZ3MuICovCitzdGF0aWMgdm9pZCBkZXBjYV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGRlcGNhX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXVfaW50IGk7CisJdV9sb25nIG9mZnNldDsKKworCS8qIExvY2sgb3V0IG90aGVyIHByb2Nlc3NlcyB3aGlsc3Qgc2V0dGluZyB1cCB0aGUgaGFyZHdhcmUgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlscC0+cnhfbmV3ID0gbHAtPnR4X25ldyA9IDA7CisJbHAtPnJ4X29sZCA9IGxwLT50eF9vbGQgPSAwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgZWFjaCBidWZmZXIgaW4gdGhlIHJpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IGxwLT5yeFJpbmdNYXNrOyBpKyspIHsKKwkJb2Zmc2V0ID0gbHAtPmJ1ZmZzX29mZnNldCArIGkgKiBSWF9CVUZGX1NaOworCQl3cml0ZWwoKGxwLT5kZXZpY2VfcmFtX3N0YXJ0ICsgb2Zmc2V0KSB8IFJfT1dOLCAmbHAtPnJ4X3JpbmdbaV0uYmFzZSk7CisJCXdyaXRldygtUlhfQlVGRl9TWiwgJmxwLT5yeF9yaW5nW2ldLmJ1Zl9sZW5ndGgpOworCQlscC0+cnhfYnVmZltpXSA9IGxwLT5zaF9tZW0gKyBvZmZzZXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8PSBscC0+dHhSaW5nTWFzazsgaSsrKSB7CisJCW9mZnNldCA9IGxwLT5idWZmc19vZmZzZXQgKyAoaSArIGxwLT5yeFJpbmdNYXNrICsgMSkgKiBUWF9CVUZGX1NaOworCQl3cml0ZWwoKGxwLT5kZXZpY2VfcmFtX3N0YXJ0ICsgb2Zmc2V0KSAmIDB4MDBmZmZmZmYsICZscC0+dHhfcmluZ1tpXS5iYXNlKTsKKwkJbHAtPnR4X2J1ZmZbaV0gPSBscC0+c2hfbWVtICsgb2Zmc2V0OworCX0KKworCS8qIFNldCB1cCB0aGUgaW5pdGlhbGl6YXRpb24gYmxvY2sgKi8KKwlscC0+aW5pdF9ibG9jay5yeF9yaW5nID0gKGxwLT5kZXZpY2VfcmFtX3N0YXJ0ICsgbHAtPnJ4X3Jpbmdfb2Zmc2V0KSB8IGxwLT5yeF9ybGVuOworCWxwLT5pbml0X2Jsb2NrLnR4X3JpbmcgPSAobHAtPmRldmljZV9yYW1fc3RhcnQgKyBscC0+dHhfcmluZ19vZmZzZXQpIHwgbHAtPnR4X3JsZW47CisKKwlTZXRNdWx0aWNhc3RGaWx0ZXIoZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisJCWxwLT5pbml0X2Jsb2NrLnBoeXNfYWRkcltpXSA9IGRldi0+ZGV2X2FkZHJbaV07CisJfQorCisJbHAtPmluaXRfYmxvY2subW9kZSA9IDB4MDAwMDsJLyogRW5hYmxlIHRoZSBUeCBhbmQgUnggKi8KK30KKworCitzdGF0aWMgdm9pZCBkZXBjYV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdV9sb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJcHJpbnRrKCIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTA0eCwgcmVzZXR0aW5nLlxuIiwgZGV2LT5uYW1lLCBpbncoREVQQ0FfREFUQSkpOworCisJU1RPUF9ERVBDQTsKKwlkZXBjYV9pbml0X3JpbmcoZGV2KTsKKwlMb2FkQ1NScyhkZXYpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlJbml0UmVzdGFydERlcGNhKGRldik7Cit9CisKKworLyogCisqKiBXcml0ZXMgYSBzb2NrZXQgYnVmZmVyIHRvIFRYIGRlc2NyaXB0b3IgcmluZyBhbmQgc3RhcnRzIHRyYW5zbWlzc2lvbiAKKyovCitzdGF0aWMgaW50IGRlcGNhX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGRlcGNhX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXVfbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgc3RhdHVzID0gMDsKKworCS8qIFRyYW5zbWl0dGVyIHRpbWVvdXQsIHNlcmlvdXMgcHJvYmxlbXMuICovCisJaWYgKHNrYi0+bGVuIDwgMSkKKwkJZ290byBvdXQ7CisKKwlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCX0KKwkKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoVFhfQlVGRlNfQVZBSUwpIHsJLyogRmlsbCBpbiBhIFR4IHJpbmcgZW50cnkgKi8KKwkJc3RhdHVzID0gbG9hZF9wYWNrZXQoZGV2LCBza2IpOworCisJCWlmICghc3RhdHVzKSB7CisJCQkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSBzZW5kIGRlbWFuZC4gKi8KKwkJCW91dHcoQ1NSMCwgREVQQ0FfQUREUik7CisJCQlvdXR3KElORUEgfCBURE1ELCBERVBDQV9EQVRBKTsKKworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCX0KKwkJaWYgKFRYX0JVRkZTX0FWQUlMKQorCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwl9IGVsc2UKKwkJc3RhdHVzID0gLTE7CisKKyAgICAgIG91dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorKiogVGhlIERFUENBIGludGVycnVwdCBoYW5kbGVyLiAKKyovCitzdGF0aWMgaXJxcmV0dXJuX3QgZGVwY2FfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHA7CisJczE2IGNzcjAsIG5pY3NyOworCXVfbG9uZyBpb2FkZHI7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKCJkZXBjYV9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlscCA9IChzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKworCS8qIG1hc2sgdGhlIERFUENBIGJvYXJkIGludGVycnVwdHMgYW5kIHR1cm4gb24gdGhlIExFRCAqLworCW5pY3NyID0gaW5iKERFUENBX05JQ1NSKTsKKwluaWNzciB8PSAoSU0gfCBMRUQpOworCW91dGIobmljc3IsIERFUENBX05JQ1NSKTsKKworCW91dHcoQ1NSMCwgREVQQ0FfQUREUik7CisJY3NyMCA9IGludyhERVBDQV9EQVRBKTsKKworCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworCW91dHcoY3NyMCAmIElOVEUsIERFUENBX0RBVEEpOworCisJaWYgKGNzcjAgJiBSSU5UKQkvKiBSeCBpbnRlcnJ1cHQgKHBhY2tldCBhcnJpdmVkKSAqLworCQlkZXBjYV9yeChkZXYpOworCisJaWYgKGNzcjAgJiBUSU5UKQkvKiBUeCBpbnRlcnJ1cHQgKHBhY2tldCBzZW50KSAqLworCQlkZXBjYV90eChkZXYpOworCisJLyogQW55IHJlc291cmNlcyBhdmFpbGFibGU/ICovCisJaWYgKChUWF9CVUZGU19BVkFJTCA+PSAwKSAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworCS8qIFVubWFzayB0aGUgREVQQ0EgYm9hcmQgaW50ZXJydXB0cyBhbmQgdHVybiBvZmYgdGhlIExFRCAqLworCW5pY3NyID0gKG5pY3NyICYgfklNICYgfkxFRCk7CisJb3V0YihuaWNzciwgREVQQ0FfTklDU1IpOworCisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIENhbGxlZCB3aXRoIGxwLT5sb2NrIGhlbGQgKi8KK3N0YXRpYyBpbnQgZGVwY2Ffcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGRlcGNhX3ByaXZhdGUgKikgZGV2LT5wcml2OworCWludCBpLCBlbnRyeTsKKwlzMzIgc3RhdHVzOworCisJZm9yIChlbnRyeSA9IGxwLT5yeF9uZXc7ICEocmVhZGwoJmxwLT5yeF9yaW5nW2VudHJ5XS5iYXNlKSAmIFJfT1dOKTsgZW50cnkgPSBscC0+cnhfbmV3KSB7CisJCXN0YXR1cyA9IHJlYWRsKCZscC0+cnhfcmluZ1tlbnRyeV0uYmFzZSkgPj4gMTY7CisJCWlmIChzdGF0dXMgJiBSX1NUUCkgewkvKiBSZW1lbWJlciBzdGFydCBvZiBmcmFtZSAqLworCQkJbHAtPnJ4X29sZCA9IGVudHJ5OworCQl9CisJCWlmIChzdGF0dXMgJiBSX0VOUCkgewkvKiBWYWxpZCBmcmFtZSBzdGF0dXMgKi8KKwkJCWlmIChzdGF0dXMgJiBSX0VSUikgewkvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCisJCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOwkvKiBVcGRhdGUgdGhlIGVycm9yIHN0YXRzLiAqLworCQkJCWlmIChzdGF0dXMgJiBSX0ZSQU0pCisJCQkJCWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgUl9PRkxPKQorCQkJCQlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgUl9DUkMpCisJCQkJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFJfQlVGRikKKwkJCQkJbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQl9IGVsc2UgeworCQkJCXNob3J0IGxlbiwgcGt0X2xlbiA9IHJlYWR3KCZscC0+cnhfcmluZ1tlbnRyeV0ubXNnX2xlbmd0aCkgLSA0OworCQkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKTsKKwkJCQlpZiAoc2tiICE9IE5VTEwpIHsKKwkJCQkJdW5zaWduZWQgY2hhciAqYnVmOworCQkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KKwkJCQkJYnVmID0gc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCQlza2ItPmRldiA9IGRldjsKKwkJCQkJaWYgKGVudHJ5IDwgbHAtPnJ4X29sZCkgewkvKiBXcmFwcGVkIGJ1ZmZlciAqLworCQkJCQkJbGVuID0gKGxwLT5yeFJpbmdNYXNrIC0gbHAtPnJ4X29sZCArIDEpICogUlhfQlVGRl9TWjsKKwkJCQkJCW1lbWNweV9mcm9taW8oYnVmLCBscC0+cnhfYnVmZltscC0+cnhfb2xkXSwgbGVuKTsKKwkJCQkJCW1lbWNweV9mcm9taW8oYnVmICsgbGVuLCBscC0+cnhfYnVmZlswXSwgcGt0X2xlbiAtIGxlbik7CisJCQkJCX0gZWxzZSB7CS8qIExpbmVhciBidWZmZXIgKi8KKwkJCQkJCW1lbWNweV9mcm9taW8oYnVmLCBscC0+cnhfYnVmZltscC0+cnhfb2xkXSwgcGt0X2xlbik7CisJCQkJCX0KKworCQkJCQkvKiAKKwkJCQkJICAgKiogTm90aWZ5IHRoZSB1cHBlciBwcm90b2NvbCBsYXllcnMgdGhhdCB0aGVyZSBpcyBhbm90aGVyIAorCQkJCQkgICAqKiBwYWNrZXQgdG8gaGFuZGxlCisJCQkJCSAqLworCQkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJCQluZXRpZl9yeChza2IpOworCisJCQkJCS8qCisJCQkJCSAgICoqIFVwZGF0ZSBzdGF0cworCQkJCQkgKi8KKwkJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQkJCWZvciAoaSA9IDE7IGkgPCBERVBDQV9QS1RfU1RBVF9TWiAtIDE7IGkrKykgeworCQkJCQkJaWYgKHBrdF9sZW4gPCAoaSAqIERFUENBX1BLVF9CSU5fU1opKSB7CisJCQkJCQkJbHAtPnBrdFN0YXRzLmJpbnNbaV0rKzsKKwkJCQkJCQlpID0gREVQQ0FfUEtUX1NUQVRfU1o7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKGJ1ZlswXSAmIDB4MDEpIHsJLyogTXVsdGljYXN0L0Jyb2FkY2FzdCAqLworCQkJCQkJaWYgKCgqKHMxNiAqKSAmIGJ1ZlswXSA9PSAtMSkgJiYgKCooczE2ICopICYgYnVmWzJdID09IC0xKSAmJiAoKihzMTYgKikgJiBidWZbNF0gPT0gLTEpKSB7CisJCQkJCQkJbHAtPnBrdFN0YXRzLmJyb2FkY2FzdCsrOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlscC0+cGt0U3RhdHMubXVsdGljYXN0Kys7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoKCooczE2ICopICYgYnVmWzBdID09ICooczE2ICopICYgZGV2LT5kZXZfYWRkclswXSkgJiYgKCooczE2ICopICYgYnVmWzJdID09ICooczE2ICopICYgZGV2LT5kZXZfYWRkclsyXSkgJiYgKCooczE2ICopICYgYnVmWzRdID09ICooczE2ICopICYgZGV2LT5kZXZfYWRkcls0XSkpIHsKKwkJCQkJCWxwLT5wa3RTdGF0cy51bmljYXN0Kys7CisJCQkJCX0KKworCQkJCQlscC0+cGt0U3RhdHMuYmluc1swXSsrOwkvKiBEdXBsaWNhdGVzIHN0YXRzLnJ4X3BhY2tldHMgKi8KKwkJCQkJaWYgKGxwLT5wa3RTdGF0cy5iaW5zWzBdID09IDApIHsJLyogUmVzZXQgY291bnRlcnMgKi8KKwkJCQkJCW1lbXNldCgoY2hhciAqKSAmbHAtPnBrdFN0YXRzLCAwLCBzaXplb2YobHAtPnBrdFN0YXRzKSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7CisJCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CS8qIFJlYWxseSwgZGVmZXJyZWQuICovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8qIENoYW5nZSBidWZmZXIgb3duZXJzaGlwIGZvciB0aGlzIGxhc3QgZnJhbWUsIGJhY2sgdG8gdGhlIGFkYXB0ZXIgKi8KKwkJCWZvciAoOyBscC0+cnhfb2xkICE9IGVudHJ5OyBscC0+cnhfb2xkID0gKCsrbHAtPnJ4X29sZCkgJiBscC0+cnhSaW5nTWFzaykgeworCQkJCXdyaXRlbChyZWFkbCgmbHAtPnJ4X3JpbmdbbHAtPnJ4X29sZF0uYmFzZSkgfCBSX09XTiwgJmxwLT5yeF9yaW5nW2xwLT5yeF9vbGRdLmJhc2UpOworCQkJfQorCQkJd3JpdGVsKHJlYWRsKCZscC0+cnhfcmluZ1tlbnRyeV0uYmFzZSkgfCBSX09XTiwgJmxwLT5yeF9yaW5nW2VudHJ5XS5iYXNlKTsKKwkJfQorCisJCS8qCisJCSAgICoqIFVwZGF0ZSBlbnRyeSBpbmZvcm1hdGlvbgorCQkgKi8KKwkJbHAtPnJ4X25ldyA9ICgrK2xwLT5yeF9uZXcpICYgbHAtPnJ4UmluZ01hc2s7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisqKiBCdWZmZXIgc2VudCAtIGNoZWNrIGZvciBidWZmZXIgZXJyb3JzLgorKiogQ2FsbGVkIHdpdGggbHAtPmxvY2sgaGVsZAorKi8KK3N0YXRpYyBpbnQgZGVwY2FfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGRlcGNhX3ByaXZhdGUgKikgZGV2LT5wcml2OworCWludCBlbnRyeTsKKwlzMzIgc3RhdHVzOworCXVfbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWZvciAoZW50cnkgPSBscC0+dHhfb2xkOyBlbnRyeSAhPSBscC0+dHhfbmV3OyBlbnRyeSA9IGxwLT50eF9vbGQpIHsKKwkJc3RhdHVzID0gcmVhZGwoJmxwLT50eF9yaW5nW2VudHJ5XS5iYXNlKSA+PiAxNjsKKworCQlpZiAoc3RhdHVzIDwgMCkgewkvKiBQYWNrZXQgbm90IHlldCBzZW50ISAqLworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgVF9FUlIpIHsJLyogQW4gZXJyb3Igb2NjdXJyZWQuICovCisJCQlzdGF0dXMgPSByZWFkbCgmbHAtPnR4X3JpbmdbZW50cnldLm1pc2MpOworCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFRNRDNfUlRSWSkKKwkJCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBUTUQzX0xDQVIpCisJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgVE1EM19MQ09MKQorCQkJCWxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgVE1EM19VRkxPKQorCQkJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIChUTUQzX0JVRkYgfCBUTUQzX1VGTE8pKSB7CisJCQkJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgc2VuZCBkZW1hbmQuICovCisJCQkJb3V0dyhDU1IwLCBERVBDQV9BRERSKTsKKwkJCQlvdXR3KElORUEgfCBURE1ELCBERVBDQV9EQVRBKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdGF0dXMgJiAoVF9NT1JFIHwgVF9PTkUpKSB7CisJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOworCQl9IGVsc2UgeworCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCisJCS8qIFVwZGF0ZSBhbGwgdGhlIHBvaW50ZXJzICovCisJCWxwLT50eF9vbGQgPSAoKytscC0+dHhfb2xkKSAmIGxwLT50eFJpbmdNYXNrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlcGNhX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBkZXBjYV9wcml2YXRlICopIGRldi0+cHJpdjsKKwlzMTYgbmljc3I7CisJdV9sb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJb3V0dyhDU1IwLCBERVBDQV9BRERSKTsKKworCWlmIChkZXBjYV9kZWJ1ZyA+IDEpIHsKKwkJcHJpbnRrKCIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgJTIuMnguXG4iLCBkZXYtPm5hbWUsIGludyhERVBDQV9EQVRBKSk7CisJfQorCisJLyogCisJICAgKiogV2Ugc3RvcCB0aGUgREVQQ0EgaGVyZSAtLSBpdCBvY2Nhc2lvbmFsbHkgcG9sbHMKKwkgICAqKiBtZW1vcnkgaWYgd2UgZG9uJ3QuIAorCSAqLworCW91dHcoU1RPUCwgREVQQ0FfREFUQSk7CisKKwkvKgorCSAgICoqIEdpdmUgYmFjayB0aGUgUk9NIGluIGNhc2UgdGhlIHVzZXIgd2FudHMgdG8gZ28gdG8gRE9TCisJICovCisJaWYgKGxwLT5hZGFwdGVyICE9IERFUENBKSB7CisJCW5pY3NyID0gaW5iKERFUENBX05JQ1NSKTsKKwkJbmljc3IgJj0gflNIRTsKKwkJb3V0YihuaWNzciwgREVQQ0FfTklDU1IpOworCX0KKworCS8qCisJICAgKiogRnJlZSB0aGUgYXNzb2NpYXRlZCBpcnEKKwkgKi8KKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgTG9hZENTUnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGRlcGNhX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXVfbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW91dHcoQ1NSMSwgREVQQ0FfQUREUik7CS8qIGluaXRpYWxpc2F0aW9uIGJsb2NrIGFkZHJlc3MgTFNXICovCisJb3V0dygodTE2KSBscC0+ZGV2aWNlX3JhbV9zdGFydCwgREVQQ0FfREFUQSk7CisJb3V0dyhDU1IyLCBERVBDQV9BRERSKTsJLyogaW5pdGlhbGlzYXRpb24gYmxvY2sgYWRkcmVzcyBNU1cgKi8KKwlvdXR3KCh1MTYpIChscC0+ZGV2aWNlX3JhbV9zdGFydCA+PiAxNiksIERFUENBX0RBVEEpOworCW91dHcoQ1NSMywgREVQQ0FfQUREUik7CS8qIEFMRSBjb250cm9sICovCisJb3V0dyhBQ09OLCBERVBDQV9EQVRBKTsKKworCW91dHcoQ1NSMCwgREVQQ0FfQUREUik7CS8qIFBvaW50IGJhY2sgdG8gQ1NSMCAqLworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IEluaXRSZXN0YXJ0RGVwY2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGRlcGNhX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXVfbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaSwgc3RhdHVzID0gMDsKKworCS8qIENvcHkgdGhlIHNoYWRvdyBpbml0X2Jsb2NrIHRvIHNoYXJlZCBtZW1vcnkgKi8KKwltZW1jcHlfdG9pbyhscC0+c2hfbWVtLCAmbHAtPmluaXRfYmxvY2ssIHNpemVvZihzdHJ1Y3QgZGVwY2FfaW5pdCkpOworCisJb3V0dyhDU1IwLCBERVBDQV9BRERSKTsJLyogcG9pbnQgYmFjayB0byBDU1IwICovCisJb3V0dyhJTklULCBERVBDQV9EQVRBKTsJLyogaW5pdGlhbGl6ZSBERVBDQSAqLworCisJLyogd2FpdCBmb3IgbGFuY2UgdG8gY29tcGxldGUgaW5pdGlhbGlzYXRpb24gKi8KKwlmb3IgKGkgPSAwOyAoaSA8IDEwMCkgJiYgIShpbncoREVQQ0FfREFUQSkgJiBJRE9OKTsgaSsrKTsKKworCWlmIChpICE9IDEwMCkgeworCQkvKiBjbGVhciBJRE9OIGJ5IHdyaXRpbmcgYSAiMSIsIGVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBzdGFydCBsYW5jZSAqLworCQlvdXR3KElET04gfCBJTkVBIHwgU1RSVCwgREVQQ0FfREFUQSk7CisJCWlmIChkZXBjYV9kZWJ1ZyA+IDIpIHsKKwkJCXByaW50aygiJXM6IERFUENBIG9wZW4gYWZ0ZXIgJWQgdGlja3MsIGluaXQgYmxvY2sgMHglMDhseCBjc3IwICU0LjR4LlxuIiwgZGV2LT5uYW1lLCBpLCBscC0+bWVtX3N0YXJ0LCBpbncoREVQQ0FfREFUQSkpOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIlczogREVQQ0EgdW5vcGVuIGFmdGVyICVkIHRpY2tzLCBpbml0IGJsb2NrIDB4JTA4bHggY3NyMCAlNC40eC5cbiIsIGRldi0+bmFtZSwgaSwgbHAtPm1lbV9zdGFydCwgaW53KERFUENBX0RBVEEpKTsKKwkJc3RhdHVzID0gLTE7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpkZXBjYV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGRlcGNhX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJLyogTnVsbCBib2R5IHNpbmNlIHRoZXJlIGlzIG5vIGZyYW1pbmcgZXJyb3IgY291bnRlciAqLworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qCisqKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyovCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGRlcGNhX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXVfbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmIChkZXYpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQl3aGlsZSAobHAtPnR4X29sZCAhPSBscC0+dHhfbmV3KTsJLyogV2FpdCBmb3IgdGhlIHJpbmcgdG8gZW1wdHkgKi8KKworCQlTVE9QX0RFUENBOwkvKiBUZW1wb3JhcmlseSBzdG9wIHRoZSBkZXBjYS4gICovCisJCWRlcGNhX2luaXRfcmluZyhkZXYpOwkvKiBJbml0aWFsaXplIHRoZSBkZXNjcmlwdG9yIHJpbmdzICovCisKKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkvKiBTZXQgcHJvbWlzY3VvdXMgbW9kZSAqLworCQkJbHAtPmluaXRfYmxvY2subW9kZSB8PSBQUk9NOworCQl9IGVsc2UgeworCQkJU2V0TXVsdGljYXN0RmlsdGVyKGRldik7CisJCQlscC0+aW5pdF9ibG9jay5tb2RlICY9IH5QUk9NOwkvKiBVbnNldCBwcm9taXNjdW91cyBtb2RlICovCisJCX0KKworCQlMb2FkQ1NScyhkZXYpOwkvKiBSZWxvYWQgQ1NSMyAqLworCQlJbml0UmVzdGFydERlcGNhKGRldik7CS8qIFJlc3VtZSBub3JtYWwgb3BlcmF0aW9uLiAqLworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwkvKiBVbmxvY2sgdGhlIFRYIHJpbmcgKi8KKwl9Cit9CisKKy8qCisqKiBDYWxjdWxhdGUgdGhlIGhhc2ggY29kZSBhbmQgdXBkYXRlIHRoZSBsb2dpY2FsIGFkZHJlc3MgZmlsdGVyCisqKiBmcm9tIGEgbGlzdCBvZiBldGhlcm5ldCBtdWx0aWNhc3QgYWRkcmVzc2VzLgorKiogQmlnIGVuZGlhbiBjcmMgb25lIGxpbmVyIGlzIG1pbmUsIGFsbCBtaW5lLCBoYSBoYSBoYSBoYSEKKyoqIExBTkNFIGNhbGN1bGF0ZXMgaXRzIGhhc2ggY29kZXMgYmlnIGVuZGlhbi4KKyovCitzdGF0aWMgdm9pZCBTZXRNdWx0aWNhc3RGaWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGRlcGNhX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCWNoYXIgKmFkZHJzOworCWludCBpLCBqLCBiaXQsIGJ5dGU7CisJdTE2IGhhc2hjb2RlOworCXUzMiBjcmM7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgewkvKiBTZXQgYWxsIG11bHRpY2FzdCBiaXRzICovCisJCWZvciAoaSA9IDA7IGkgPCAoSEFTSF9UQUJMRV9MRU4gPj4gMyk7IGkrKykgeworCQkJbHAtPmluaXRfYmxvY2subWNhc3RfdGFibGVbaV0gPSAoY2hhcikgMHhmZjsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAoSEFTSF9UQUJMRV9MRU4gPj4gMyk7IGkrKykgewkvKiBDbGVhciB0aGUgbXVsdGljYXN0IHRhYmxlICovCisJCQlscC0+aW5pdF9ibG9jay5tY2FzdF90YWJsZVtpXSA9IDA7CisJCX0KKwkJLyogQWRkIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgewkvKiBmb3IgZWFjaCBhZGRyZXNzIGluIHRoZSBsaXN0ICovCisJCQlhZGRycyA9IGRtaS0+ZG1pX2FkZHI7CisJCQlkbWkgPSBkbWktPm5leHQ7CisJCQlpZiAoKCphZGRycyAmIDB4MDEpID09IDEpIHsJLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCisJCQkJY3JjID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBhZGRycyk7CisJCQkJaGFzaGNvZGUgPSAoY3JjICYgMSk7CS8qIGhhc2hjb2RlIGlzIDYgTFNiIG9mIENSQyAuLi4gKi8KKwkJCQlmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7CS8qIC4uLiBpbiByZXZlcnNlIG9yZGVyLiAqLworCQkJCQloYXNoY29kZSA9IChoYXNoY29kZSA8PCAxKSB8ICgoY3JjID4+PSAxKSAmIDEpOworCQkJCX0KKworCisJCQkJYnl0ZSA9IGhhc2hjb2RlID4+IDM7CS8qIGJpdFszLTVdIC0+IGJ5dGUgaW4gZmlsdGVyICovCisJCQkJYml0ID0gMSA8PCAoaGFzaGNvZGUgJiAweDA3KTsJLyogYml0WzAtMl0gLT4gYml0IGluIGJ5dGUgKi8KKwkJCQlscC0+aW5pdF9ibG9jay5tY2FzdF90YWJsZVtieXRlXSB8PSBiaXQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRlcGNhX2NvbW1vbl9pbml0ICh1X2xvbmcgaW9hZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqKmRldnApCit7CisJaW50IHN0YXR1cyA9IDA7CisJCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbiAoaW9hZGRyLCBERVBDQV9UT1RBTF9TSVpFLCBkZXBjYV9zdHJpbmcpKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCQorCWlmIChEZXZpY2VQcmVzZW50KGlvYWRkcikpIHsKKwkJc3RhdHVzID0gLUVOT0RFVjsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisKKwlpZiAoISgqZGV2cCA9IGFsbG9jX2V0aGVyZGV2IChzaXplb2YgKHN0cnVjdCBkZXBjYV9wcml2YXRlKSkpKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCisJcmV0dXJuIDA7CisJCisgb3V0X3JlbGVhc2U6CisJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgREVQQ0FfVE9UQUxfU0laRSk7Cisgb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBDT05GSUdfTUNBCisvKgorKiogTWljcm9jaGFubmVsIGJ1cyBJL08gZGV2aWNlIHByb2JlCisqLworc3RhdGljIGludCBfX2luaXQgZGVwY2FfbWNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHBvc1syXTsKKwl1bnNpZ25lZCBjaGFyIHdoZXJlOworCXVuc2lnbmVkIGxvbmcgaW9iYXNlLCBtZW1fc3RhcnQ7CisJaW50IGlycSwgZXJyOworCXN0cnVjdCBtY2FfZGV2aWNlICptZGV2ID0gdG9fbWNhX2RldmljZSAoZGV2aWNlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZXBjYV9wcml2YXRlICpscDsKKworCS8qCisJKiogU2VhcmNoIGZvciB0aGUgYWRhcHRlci4gIElmIGFuIGFkZHJlc3MgaGFzIGJlZW4gZ2l2ZW4sIHNlYXJjaCAKKwkqKiBzcGVjaWZpY2FsbHkgZm9yIHRoZSBjYXJkIGF0IHRoYXQgYWRkcmVzcy4gIE90aGVyd2lzZSBmaW5kIHRoZQorCSoqIGZpcnN0IGNhcmQgaW4gdGhlIHN5c3RlbS4KKwkqLworCQorCXBvc1swXSA9IG1jYV9kZXZpY2VfcmVhZF9zdG9yZWRfcG9zKG1kZXYsIDIpOworCXBvc1sxXSA9IG1jYV9kZXZpY2VfcmVhZF9zdG9yZWRfcG9zKG1kZXYsIDMpOworCisJLyoKKwkqKiBJTyBvZiBjYXJkIGlzIGhhbmRsZWQgYnkgYml0cyAxIGFuZCAyIG9mIHBvczAuICAgIAorCSoqCisJKiogICAgYml0MiBiaXQxICAgIElPCisJKiogICAgICAgMCAgICAwICAgIDB4MmMwMAorCSoqICAgICAgIDAgICAgMSAgICAweDJjMTAKKwkqKiAgICAgICAxICAgIDAgICAgMHgyYzIwCisJKiogICAgICAgMSAgICAxICAgIDB4MmMzMAorCSovCisJd2hlcmUgPSAocG9zWzBdICYgNikgPj4gMTsKKwlpb2Jhc2UgPSAweDJjMDAgKyAoMHgxMCAqIHdoZXJlKTsKKworCS8qCisJKiogRm91bmQgdGhlIGFkYXB0ZXIgd2Ugd2VyZSBsb29raW5nIGZvci4gTm93IHN0YXJ0IHNldHRpbmcgaXQgdXAuCisJKiogCisJKiogRmlyc3Qgd29yayBvbiBkZWNvZGluZyB0aGUgSVJRLiAgSXQncyBzdG9yZWQgaW4gdGhlIGxvd2VyIDQgYml0cworCSoqIG9mIHBvczEuICBCaXRzIGFyZSBhcyBmb2xsb3dzIChmcm9tIHRoZSBBREYgZmlsZSk6CisJKioKKwkqKiAgICAgIEJpdHMgICAgICAgICAgIAorCSoqICAgMyAgIDIgICAxICAgMCAgICBJUlEgCisJKiogICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCSoqICAgMCAgIDAgICAxICAgMCAgICAgNQorCSoqICAgMCAgIDAgICAwICAgMSAgICAgOQorCSoqICAgMCAgIDEgICAwICAgMCAgICAxMAorCSoqICAgMSAgIDAgICAwICAgMCAgICAxMQorCSovCisJd2hlcmUgPSBwb3NbMV0gJiAweDBmOworCXN3aXRjaCAod2hlcmUpIHsKKwljYXNlIDE6CisJCWlycSA9IDk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaXJxID0gNTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpcnEgPSAxMDsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlpcnEgPSAxMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCIlczogbWNhX3Byb2JlIElSUSBlcnJvci4gIFlvdSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKCVkKS5cbiIsIGRldi0+bmFtZSwgd2hlcmUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSoqIFNoYXJlZCBtZW1vcnkgYWRkcmVzcyBvZiBhZGFwdGVyIGlzIHN0b3JlZCBpbiBiaXRzIDMtNSBvZiBwb3MwLgorCSoqIFRoZXkgYXJlIG1hcHBlZCBhcyBmb2xsb3dzOgorCSoqCisJKiogICAgQml0CisJKiogICA1ICA0ICAzICAgICAgIE1lbW9yeSBBZGRyZXNzZXMKKwkqKiAgIDAgIDAgIDAgICAgICAgQzAwMDAtQ0ZGRkYgKDY0SykKKwkqKiAgIDEgIDAgIDAgICAgICAgQzgwMDAtQ0ZGRkYgKDMySykKKwkqKiAgIDAgIDAgIDEgICAgICAgRDAwMDAtREZGRkYgKDY0SykKKwkqKiAgIDEgIDAgIDEgICAgICAgRDgwMDAtREZGRkYgKDMySykKKwkqKiAgIDAgIDEgIDAgICAgICAgRTAwMDAtRUZGRkYgKDY0SykKKwkqKiAgIDEgIDEgIDAgICAgICAgRTgwMDAtRUZGRkYgKDMySykKKwkqLworCXdoZXJlID0gKHBvc1swXSAmIDB4MTgpID4+IDM7CisJbWVtX3N0YXJ0ID0gMHhjMDAwMCArICh3aGVyZSAqIDB4MTAwMDApOworCWlmIChwb3NbMF0gJiAweDIwKSB7CisJCW1lbV9zdGFydCArPSAweDgwMDA7CisJfQorCisJLyogY2xhaW0gdGhlIHNsb3QgKi8KKwlzdHJuY3B5KG1kZXYtPm5hbWUsIGRlcGNhX21jYV9hZGFwdGVyX25hbWVbbWRldi0+aW5kZXhdLAorCQlzaXplb2YobWRldi0+bmFtZSkpOworCW1jYV9kZXZpY2Vfc2V0X2NsYWltKG1kZXYsIDEpOworCQorICAgICAgICAvKgorCSoqIEdldCBldmVyeXRoaW5nIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQuLi4gIChhbG1vc3QganVzdAorCSoqIGxpa2UgdGhlIElTQSBhbmQgRUlTQSBwcm9iZXMpCisJKi8KKwlpcnEgPSBtY2FfZGV2aWNlX3RyYW5zZm9ybV9pcnEobWRldiwgaXJxKTsKKwlpb2Jhc2UgPSBtY2FfZGV2aWNlX3RyYW5zZm9ybV9pb3BvcnQobWRldiwgaW9iYXNlKTsKKworCWlmICgoZXJyID0gZGVwY2FfY29tbW9uX2luaXQgKGlvYmFzZSwgJmRldikpKQorCQlnb3RvIG91dF91bmNsYWltOworCisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5iYXNlX2FkZHIgPSBpb2Jhc2U7CisJbHAgPSBkZXYtPnByaXY7CisJbHAtPmRlcGNhX2J1cyA9IERFUENBX0JVU19NQ0E7CisJbHAtPmFkYXB0ZXIgPSBkZXBjYV9tY2FfYWRhcHRlcl90eXBlW21kZXYtPmluZGV4XTsKKwlscC0+bWVtX3N0YXJ0ID0gbWVtX3N0YXJ0OworCQorCWlmICgoZXJyID0gZGVwY2FfaHdfaW5pdChkZXYsIGRldmljZSkpKQorCQlnb3RvIG91dF9mcmVlOworCQkJCisJcmV0dXJuIDA7CisKKyBvdXRfZnJlZToKKwlmcmVlX25ldGRldiAoZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbiAoaW9iYXNlLCBERVBDQV9UT1RBTF9TSVpFKTsKKyBvdXRfdW5jbGFpbToKKwltY2FfZGV2aWNlX3NldF9jbGFpbShtZGV2LCAwKTsKKworCXJldHVybiBlcnI7Cit9CisjZW5kaWYKKworLyoKKyoqIElTQSBidXMgSS9PIGRldmljZSBwcm9iZQorKi8KKworc3RhdGljIHZvaWQgZGVwY2FfcGxhdGZvcm1fcmVsZWFzZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsZGV2OworCisJLyogZnJlZSBkZXZpY2UgKi8KKwlwbGRldiA9IHRvX3BsYXRmb3JtX2RldmljZSAoZGV2aWNlKTsKKwlrZnJlZSAocGxkZXYpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZGVwY2FfcGxhdGZvcm1fcHJvYmUgKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxkZXY7CisKKwlmb3IgKGkgPSAwOyBkZXBjYV9pb19wb3J0c1tpXS5pb2Jhc2U7IGkrKykgeworCQlkZXBjYV9pb19wb3J0c1tpXS5kZXZpY2UgPSBOVUxMOworCQkKKwkJLyogaWYgYW4gYWRkcmVzcyBoYXMgYmVlbiBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQKKwkJICogbGluZSwgdXNlIGl0IChpZiB2YWxpZCkgKi8KKwkJaWYgKGlvICYmIGlvICE9IGRlcGNhX2lvX3BvcnRzW2ldLmlvYmFzZSkKKwkJCWNvbnRpbnVlOworCQkKKwkJaWYgKCEocGxkZXYgPSBrbWFsbG9jIChzaXplb2YgKCpwbGRldiksIEdGUF9LRVJORUwpKSkKKwkJCWNvbnRpbnVlOworCisJCW1lbXNldCAocGxkZXYsIDAsIHNpemVvZiAoKnBsZGV2KSk7CisJCXBsZGV2LT5uYW1lID0gZGVwY2Ffc3RyaW5nOworCQlwbGRldi0+aWQgICA9IGk7CisJCXBsZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9ICh2b2lkICopIGRlcGNhX2lvX3BvcnRzW2ldLmlvYmFzZTsKKwkJcGxkZXYtPmRldi5yZWxlYXNlICAgICAgID0gZGVwY2FfcGxhdGZvcm1fcmVsZWFzZTsKKwkJZGVwY2FfaW9fcG9ydHNbaV0uZGV2aWNlID0gcGxkZXY7CisKKwkJaWYgKHBsYXRmb3JtX2RldmljZV9yZWdpc3RlciAocGxkZXYpKSB7CisJCQlrZnJlZSAocGxkZXYpOworCQkJZGVwY2FfaW9fcG9ydHNbaV0uZGV2aWNlID0gTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFwbGRldi0+ZGV2LmRyaXZlcikgeworCQkvKiBUaGUgZHJpdmVyIHdhcyBub3QgYm91bmQgdG8gdGhpcyBkZXZpY2UsIHRoZXJlIHdhcworCQkgKiBubyBoYXJkd2FyZSBhdCB0aGlzIGFkZHJlc3MuIFVucmVnaXN0ZXIgaXQsIGFzIHRoZQorCQkgKiByZWxlYXNlIGZ1Y3Rpb24gd2lsbCB0YWtlIGNhcmUgb2YgZnJlZWluZyB0aGUKKwkJICogYWxsb2NhdGVkIHN0cnVjdHVyZSAqLworCQkJCisJCQlkZXBjYV9pb19wb3J0c1tpXS5kZXZpY2UgPSBOVUxMOworCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIgKHBsZGV2KTsKKwkJfQorCX0KK30KKworc3RhdGljIGVudW0gZGVwY2FfdHlwZSBfX2luaXQgZGVwY2Ffc2htZW1fcHJvYmUgKHVsb25nICptZW1fc3RhcnQpCit7CisJdV9sb25nIG1lbV9iYXNlW10gPSBERVBDQV9SQU1fQkFTRV9BRERSRVNTRVM7CisJZW51bSBkZXBjYV90eXBlIGFkYXB0ZXIgPSB1bmtub3duOworCWludCBpOworCisJZm9yIChpID0gMDsgbWVtX2Jhc2VbaV07IGkrKykgeworCQkqbWVtX3N0YXJ0ID0gbWVtID8gbWVtIDogbWVtX2Jhc2VbaV07CisJCWFkYXB0ZXIgPSBEZXBjYVNpZ25hdHVyZSAoYWRhcHRlcl9uYW1lLCAqbWVtX3N0YXJ0KTsKKwkJaWYgKGFkYXB0ZXIgIT0gdW5rbm93bikKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBhZGFwdGVyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkZXBjYV9pc2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZXBjYV9wcml2YXRlICpscDsKKwl1X2xvbmcgaW9hZGRyLCBtZW1fc3RhcnQgPSAwOworCWVudW0gZGVwY2FfdHlwZSBhZGFwdGVyID0gdW5rbm93bjsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlvYWRkciA9ICh1X2xvbmcpIGRldmljZS0+cGxhdGZvcm1fZGF0YTsKKworCWlmICgoc3RhdHVzID0gZGVwY2FfY29tbW9uX2luaXQgKGlvYWRkciwgJmRldikpKQorCQlnb3RvIG91dDsKKworCWFkYXB0ZXIgPSBkZXBjYV9zaG1lbV9wcm9iZSAoJm1lbV9zdGFydCk7CisJCisJaWYgKGFkYXB0ZXIgPT0gdW5rbm93bikgeworCQlzdGF0dXMgPSAtRU5PREVWOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCWRldi0+aXJxID0gaXJxOwkJLyogVXNlIHdoYXRldmVyIHZhbHVlIHRoZSB1c2VyIGdhdmUKKwkJCQkgKiB1cywgYW5kIDAgaWYgaGUgZGlkbid0LiAqLworCWxwID0gZGV2LT5wcml2OworCWxwLT5kZXBjYV9idXMgPSBERVBDQV9CVVNfSVNBOworCWxwLT5hZGFwdGVyID0gYWRhcHRlcjsKKwlscC0+bWVtX3N0YXJ0ID0gbWVtX3N0YXJ0OworCQorCWlmICgoc3RhdHVzID0gZGVwY2FfaHdfaW5pdChkZXYsIGRldmljZSkpKQorCQlnb3RvIG91dF9mcmVlOworCQorCXJldHVybiAwOworCisgb3V0X2ZyZWU6CisJZnJlZV9uZXRkZXYgKGRldik7CisJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgREVQQ0FfVE9UQUxfU0laRSk7Cisgb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisqKiBFSVNBIGNhbGxiYWNrcyBmcm9tIHN5c2ZzLgorKi8KKworI2lmZGVmIENPTkZJR19FSVNBCitzdGF0aWMgaW50IF9faW5pdCBkZXBjYV9laXNhX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGVpc2FfZGV2aWNlICplZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwOworCXVfbG9uZyBpb2FkZHIsIG1lbV9zdGFydDsKKwlpbnQgc3RhdHVzID0gMDsKKworCWVkZXYgPSB0b19laXNhX2RldmljZSAoZGV2aWNlKTsKKwlpb2FkZHIgPSBlZGV2LT5iYXNlX2FkZHIgKyBERVBDQV9FSVNBX0lPX1BPUlRTOworCisJaWYgKChzdGF0dXMgPSBkZXBjYV9jb21tb25faW5pdCAoaW9hZGRyLCAmZGV2KSkpCisJCWdvdG8gb3V0OworCisJLyogSXQgd291bGQgaGF2ZSBiZWVuIG5pY2UgdG8gZ2V0IGNhcmQgY29uZmlndXJhdGlvbiBmcm9tIHRoZQorCSAqIGNhcmQuIFVuZm9ydHVuYXRlbHksIHRoaXMgcmVnaXN0ZXIgaXMgd3JpdGUtb25seSAoc2hhcmVzCisJICogaXQncyBhZGRyZXNzIHdpdGggdGhlIGV0aGVybmV0IHByb20pLi4uIEFzIHdlIGRvbid0IHBhcnNlCisJICogdGhlIEVJU0EgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzICh5ZXQuLi4gOi0pLCBqdXN0IHJlbHkgb24KKwkgKiB0aGUgSVNBIHByb2JpbmcgdG8gc29ydCBpdCBvdXQuLi4gKi8KKwkKKwlkZXBjYV9zaG1lbV9wcm9iZSAoJm1lbV9zdGFydCk7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKwlscCA9IGRldi0+cHJpdjsKKwlscC0+ZGVwY2FfYnVzID0gREVQQ0FfQlVTX0VJU0E7CisJbHAtPmFkYXB0ZXIgPSBlZGV2LT5pZC5kcml2ZXJfZGF0YTsKKwlscC0+bWVtX3N0YXJ0ID0gbWVtX3N0YXJ0OworCQorCWlmICgoc3RhdHVzID0gZGVwY2FfaHdfaW5pdChkZXYsIGRldmljZSkpKQorCQlnb3RvIG91dF9mcmVlOworCQorCXJldHVybiAwOworCisgb3V0X2ZyZWU6CisJZnJlZV9uZXRkZXYgKGRldik7CisJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgREVQQ0FfVE9UQUxfU0laRSk7Cisgb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmV4aXQgZGVwY2FfZGV2aWNlX3JlbW92ZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwOworCWludCBidXM7CisKKwlkZXYgID0gZGV2aWNlLT5kcml2ZXJfZGF0YTsKKwlscCAgID0gZGV2LT5wcml2OworCisJdW5yZWdpc3Rlcl9uZXRkZXYgKGRldik7CisJaW91bm1hcCAobHAtPnNoX21lbSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uIChscC0+bWVtX3N0YXJ0LCBscC0+bWVtX2xlbik7CisJcmVsZWFzZV9yZWdpb24gKGRldi0+YmFzZV9hZGRyLCBERVBDQV9UT1RBTF9TSVpFKTsKKwlidXMgPSBscC0+ZGVwY2FfYnVzOworCWZyZWVfbmV0ZGV2IChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisqKiBMb29rIGZvciBhIHBhcnRpY3VsYXIgYm9hcmQgbmFtZSBpbiB0aGUgb24tYm9hcmQgUmVtb3RlIERpYWdub3N0aWNzCisqKiBhbmQgQm9vdCAocmVhZGIpIFJPTS4gVGhpcyB3aWxsIGFsc28gZ2l2ZSB1cyBhIGNsdWUgdG8gdGhlIG5ldHdvcmsgUkFNCisqKiBiYXNlIGFkZHJlc3MuCisqLworc3RhdGljIGludCBfX2luaXQgRGVwY2FTaWduYXR1cmUoY2hhciAqbmFtZSwgdV9sb25nIGJhc2VfYWRkcikKK3sKKwl1X2ludCBpLCBqLCBrOworCXZvaWQgX19pb21lbSAqcHRyOworCWNoYXIgdG1wc3RyWzE2XTsKKwl1X2xvbmcgcHJvbV9hZGRyID0gYmFzZV9hZGRyICsgMHhjMDAwOworCXVfbG9uZyBtZW1fYWRkciA9IGJhc2VfYWRkciArIDB4ODAwMDsgLyogMzJLQiAqLworCisJLyogQ2FuJ3QgcmVzZXJ2ZSB0aGUgcHJvbSByZWdpb24sIGl0IGlzIGFscmVhZHkgbWFya2VkIGFzCisJICogdXNlZCwgYXQgbGVhc3Qgb24geDg2LiBJbnN0ZWFkLCByZXNlcnZlIGEgbWVtb3J5IHJlZ2lvbiBhCisJICogYm9hcmQgd291bGQgY2VydGFpbmx5IHVzZS4gSWYgaXQgd29ya3MsIGdvIGFoZWFkLiBJZiBub3QsCisJICogcnVuIGxpa2UgaGVsbC4uLiAqLworCQorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uIChtZW1fYWRkciwgMTYsIGRlcGNhX3N0cmluZykpCisJCXJldHVybiB1bmtub3duOworCisJLyogQ29weSB0aGUgZmlyc3QgMTYgYnl0ZXMgb2YgUk9NICovCisKKwlwdHIgPSBpb3JlbWFwKHByb21fYWRkciwgMTYpOworCWlmIChwdHIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImRlcGNhOiBJL08gcmVtYXAgZmFpbGVkIGF0ICVseFxuIiwgcHJvbV9hZGRyKTsKKwkJcmV0dXJuIHVua25vd247CisJfQorCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXRtcHN0cltpXSA9IHJlYWRiKHB0ciArIGkpOworCX0KKwlpb3VubWFwKHB0cik7CisKKwlyZWxlYXNlX21lbV9yZWdpb24gKG1lbV9hZGRyLCAxNik7CisKKwkvKiBDaGVjayBpZiBQUk9NIGNvbnRhaW5zIGEgdmFsaWQgc3RyaW5nICovCisJZm9yIChpID0gMDsgKmRlcGNhX3NpZ25hdHVyZVtpXSAhPSAnXDAnOyBpKyspIHsKKwkJZm9yIChqID0gMCwgayA9IDA7IGogPCAxNiAmJiBrIDwgc3RybGVuKGRlcGNhX3NpZ25hdHVyZVtpXSk7IGorKykgeworCQkJaWYgKGRlcGNhX3NpZ25hdHVyZVtpXVtrXSA9PSB0bXBzdHJbal0pIHsJLyogdHJhY2sgc2lnbmF0dXJlICovCisJCQkJaysrOworCQkJfSBlbHNlIHsJLyogbG9zdCBzaWduYXR1cmU7IGJlZ2luIHNlYXJjaCBhZ2FpbiAqLworCQkJCWsgPSAwOworCQkJfQorCQl9CisJCWlmIChrID09IHN0cmxlbihkZXBjYV9zaWduYXR1cmVbaV0pKQorCQkJYnJlYWs7CisJfQorCisJLyogQ2hlY2sgaWYgbmFtZSBzdHJpbmcgaXMgdmFsaWQsIHByb3ZpZGVkIHRoZXJlJ3Mgbm8gUFJPTSAqLworCWlmIChuYW1lICYmICpuYW1lICYmIChpID09IHVua25vd24pKSB7CisJCWZvciAoaSA9IDA7ICpkZXBjYV9zaWduYXR1cmVbaV0gIT0gJ1wwJzsgaSsrKSB7CisJCQlpZiAoc3RyY21wKG5hbWUsIGRlcGNhX3NpZ25hdHVyZVtpXSkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBpOworfQorCisvKgorKiogTG9vayBmb3IgYSBzcGVjaWFsIHNlcXVlbmNlIGluIHRoZSBFdGhlcm5ldCBzdGF0aW9uIGFkZHJlc3MgUFJPTSB0aGF0CisqKiBpcyBjb21tb24gYWNyb3NzIGFsbCBERVBDQSBwcm9kdWN0cy4gTm90ZSB0aGF0IHRoZSBvcmlnaW5hbCBERVBDQSBuZWVkcworKiogaXRzIFJPTSBhZGRyZXNzIGNvdW50ZXIgdG8gYmUgaW5pdGlhbGl6ZWQgYW5kIGVuYWJsZWQuIE9ubHkgZW5hYmxlCisqKiBpZiB0aGUgZmlyc3QgYWRkcmVzcyBvY3RldCBpcyBhIDB4MDggLSB0aGlzIG1pbmltaXNlcyB0aGUgY2hhbmNlcyBvZgorKiogbWVzc2luZyBhcm91bmQgd2l0aCBzb21lIG90aGVyIGhhcmR3YXJlLCBidXQgaXQgYXNzdW1lcyB0aGF0IHRoaXMgREVQQ0EKKyoqIGNhcmQgaW5pdGlhbGl6ZWQgaXRzZWxmIGNvcnJlY3RseS4KKyoqIAorKiogU2VhcmNoIHRoZSBFdGhlcm5ldCBhZGRyZXNzIFJPTSBmb3IgdGhlIHNpZ25hdHVyZS4gU2luY2UgdGhlIFJPTSBhZGRyZXNzCisqKiBjb3VudGVyIGNhbiBzdGFydCBhdCBhbiBhcmJpdHJhcnkgcG9pbnQsIHRoZSBzZWFyY2ggbXVzdCBpbmNsdWRlIHRoZSBlbnRpcmUKKyoqIHByb2JlIHNlcXVlbmNlIGxlbmd0aCBwbHVzIHRoZSAobGVuZ3RoX29mX3RoZV9zaWduYXR1cmUgLSAxKS4KKyoqIFN0b3AgdGhlIHNlYXJjaCBJTU1FRElBVEVMWSBhZnRlciB0aGUgc2lnbmF0dXJlIGlzIGZvdW5kIHNvIHRoYXQgdGhlCisqKiBQUk9NIGFkZHJlc3MgY291bnRlciBpcyBjb3JyZWN0bHkgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlCisqKiBldGhlcm5ldCBhZGRyZXNzIGZvciBsYXRlciByZWFkIG91dC4KKyovCitzdGF0aWMgaW50IF9faW5pdCBEZXZpY2VQcmVzZW50KHVfbG9uZyBpb2FkZHIpCit7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTMyIGE7CisJCQl1MzIgYjsKKwkJfSBsbHNpZzsKKwkJY2hhciBTaWdbc2l6ZW9mKHUzMikgPDwgMV07CisJfQorCWRldjsKKwlzaG9ydCBzaWdMZW5ndGggPSAwOworCXM4IGRhdGE7CisJczE2IG5pY3NyOworCWludCBpLCBqLCBzdGF0dXMgPSAwOworCisJZGF0YSA9IGluYihERVBDQV9QUk9NKTsJLyogY2xlYXIgY291bnRlciBvbiBERVBDQSAqLworCWRhdGEgPSBpbmIoREVQQ0FfUFJPTSk7CS8qIHJlYWQgZGF0YSAqLworCisJaWYgKGRhdGEgPT0gMHgwOCkgewkvKiBFbmFibGUgY291bnRlciBvbiBERVBDQSAqLworCQluaWNzciA9IGluYihERVBDQV9OSUNTUik7CisJCW5pY3NyIHw9IEFBQzsKKwkJb3V0YihuaWNzciwgREVQQ0FfTklDU1IpOworCX0KKworCWRldi5sbHNpZy5hID0gRVRIX1BST01fU0lHOworCWRldi5sbHNpZy5iID0gRVRIX1BST01fU0lHOworCXNpZ0xlbmd0aCA9IHNpemVvZih1MzIpIDw8IDE7CisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaiA8IHNpZ0xlbmd0aCAmJiBpIDwgUFJPQkVfTEVOR1RIICsgc2lnTGVuZ3RoIC0gMTsgaSsrKSB7CisJCWRhdGEgPSBpbmIoREVQQ0FfUFJPTSk7CisJCWlmIChkZXYuU2lnW2pdID09IGRhdGEpIHsJLyogdHJhY2sgc2lnbmF0dXJlICovCisJCQlqKys7CisJCX0gZWxzZSB7CS8qIGxvc3Qgc2lnbmF0dXJlOyBiZWdpbiBzZWFyY2ggYWdhaW4gKi8KKwkJCWlmIChkYXRhID09IGRldi5TaWdbMF0pIHsJLyogcmFyZSBjYXNlLi4uLiAqLworCQkJCWogPSAxOworCQkJfSBlbHNlIHsKKwkJCQlqID0gMDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChqICE9IHNpZ0xlbmd0aCkgeworCQlzdGF0dXMgPSAtRU5PREVWOwkvKiBzZWFyY2ggZmFpbGVkICovCisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyoqIFRoZSBERTEwMCBhbmQgREUxMDEgUFJPTSBhY2Nlc3NlcyB3ZXJlIG1hZGUgbm9uLXN0YW5kYXJkIGZvciBzb21lIGJpemFycmUKKyoqIHJlYXNvbjogYWNjZXNzIHRoZSB1cHBlciBoYWxmIG9mIHRoZSBQUk9NIHdpdGggeD0wOyBhY2Nlc3MgdGhlIGxvd2VyIGhhbGYKKyoqIHdpdGggeD0xLgorKi8KK3N0YXRpYyBpbnQgX19pbml0IGdldF9od19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdV9sb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBkZXBjYV9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaSwgaywgdG1wLCBzdGF0dXMgPSAwOworCXVfc2hvcnQgaiwgeCwgY2hrc3VtOworCisJeCA9ICgoKGxwLT5hZGFwdGVyID09IGRlMTAwKSB8fCAobHAtPmFkYXB0ZXIgPT0gZGUxMDEpKSA/IDEgOiAwKTsKKworCWZvciAoaSA9IDAsIGsgPSAwLCBqID0gMDsgaiA8IDM7IGorKykgeworCQlrIDw8PSAxOworCQlpZiAoayA+IDB4ZmZmZikKKwkJCWsgLT0gMHhmZmZmOworCisJCWsgKz0gKHVfY2hhcikgKHRtcCA9IGluYihERVBDQV9QUk9NICsgeCkpOworCQlkZXYtPmRldl9hZGRyW2krK10gPSAodV9jaGFyKSB0bXA7CisJCWsgKz0gKHVfc2hvcnQpICgodG1wID0gaW5iKERFUENBX1BST00gKyB4KSkgPDwgOCk7CisJCWRldi0+ZGV2X2FkZHJbaSsrXSA9ICh1X2NoYXIpIHRtcDsKKworCQlpZiAoayA+IDB4ZmZmZikKKwkJCWsgLT0gMHhmZmZmOworCX0KKwlpZiAoayA9PSAweGZmZmYpCisJCWsgPSAwOworCisJY2hrc3VtID0gKHVfY2hhcikgaW5iKERFUENBX1BST00gKyB4KTsKKwljaGtzdW0gfD0gKHVfc2hvcnQpIChpbmIoREVQQ0FfUFJPTSArIHgpIDw8IDgpOworCWlmIChrICE9IGNoa3N1bSkKKwkJc3RhdHVzID0gLTE7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorKiogTG9hZCBhIHBhY2tldCBpbnRvIHRoZSBzaGFyZWQgbWVtb3J5CisqLworc3RhdGljIGludCBsb2FkX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBkZXBjYV9wcml2YXRlICpscCA9IChzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJaW50IGksIGVudHJ5LCBlbmQsIGxlbiwgc3RhdHVzID0gMDsKKworCWVudHJ5ID0gbHAtPnR4X25ldzsJLyogUmluZyBhcm91bmQgYnVmZmVyIG51bWJlci4gKi8KKwllbmQgPSAoZW50cnkgKyAoc2tiLT5sZW4gLSAxKSAvIFRYX0JVRkZfU1opICYgbHAtPnR4UmluZ01hc2s7CisJaWYgKCEocmVhZGwoJmxwLT50eF9yaW5nW2VuZF0uYmFzZSkgJiBUX09XTikpIHsJLyogRW5vdWdoIHJvb20/ICovCisJCS8qIAorCQkgICAqKiBDYXV0aW9uOiB0aGUgd3JpdGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUuLi4gZG9uJ3Qgc2V0IHVwIHRoZQorCQkgICAqKiBvd25lcnNoaXAgcmlnaHRzIHVudGlsIGFsbCB0aGUgb3RoZXIgaW5mb3JtYXRpb24gaXMgaW4gcGxhY2UuCisJCSAqLworCQlpZiAoZW5kIDwgZW50cnkpIHsJLyogd3JhcHBlZCBidWZmZXIgKi8KKwkJCWxlbiA9IChscC0+dHhSaW5nTWFzayAtIGVudHJ5ICsgMSkgKiBUWF9CVUZGX1NaOworCQkJbWVtY3B5X3RvaW8obHAtPnR4X2J1ZmZbZW50cnldLCBza2ItPmRhdGEsIGxlbik7CisJCQltZW1jcHlfdG9pbyhscC0+dHhfYnVmZlswXSwgc2tiLT5kYXRhICsgbGVuLCBza2ItPmxlbiAtIGxlbik7CisJCX0gZWxzZSB7CS8qIGxpbmVhciBidWZmZXIgKi8KKwkJCW1lbWNweV90b2lvKGxwLT50eF9idWZmW2VudHJ5XSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCX0KKworCQkvKiBzZXQgdXAgdGhlIGJ1ZmZlciBkZXNjcmlwdG9ycyAqLworCQlsZW4gPSAoc2tiLT5sZW4gPCBFVEhfWkxFTikgPyBFVEhfWkxFTiA6IHNrYi0+bGVuOworCQlmb3IgKGkgPSBlbnRyeTsgaSAhPSBlbmQ7IGkgPSAoaSsxKSAmIGxwLT50eFJpbmdNYXNrKSB7CisJCQkvKiBjbGVhbiBvdXQgZmxhZ3MgKi8KKwkJCXdyaXRlbChyZWFkbCgmbHAtPnR4X3JpbmdbaV0uYmFzZSkgJiB+VF9GTEFHUywgJmxwLT50eF9yaW5nW2ldLmJhc2UpOworCQkJd3JpdGV3KDB4MDAwMCwgJmxwLT50eF9yaW5nW2ldLm1pc2MpOwkvKiBjbGVhcnMgb3RoZXIgZXJyb3IgZmxhZ3MgKi8KKwkJCXdyaXRldygtVFhfQlVGRl9TWiwgJmxwLT50eF9yaW5nW2ldLmxlbmd0aCk7CS8qIHBhY2tldCBsZW5ndGggaW4gYnVmZmVyICovCisJCQlsZW4gLT0gVFhfQlVGRl9TWjsKKwkJfQorCQkvKiBjbGVhbiBvdXQgZmxhZ3MgKi8KKwkJd3JpdGVsKHJlYWRsKCZscC0+dHhfcmluZ1tlbmRdLmJhc2UpICYgflRfRkxBR1MsICZscC0+dHhfcmluZ1tlbmRdLmJhc2UpOworCQl3cml0ZXcoMHgwMDAwLCAmbHAtPnR4X3JpbmdbZW5kXS5taXNjKTsJLyogY2xlYXJzIG90aGVyIGVycm9yIGZsYWdzICovCisJCXdyaXRldygtbGVuLCAmbHAtPnR4X3JpbmdbZW5kXS5sZW5ndGgpOwkvKiBwYWNrZXQgbGVuZ3RoIGluIGxhc3QgYnVmZiAqLworCisJCS8qIHN0YXJ0IG9mIHBhY2tldCAqLworCQl3cml0ZWwocmVhZGwoJmxwLT50eF9yaW5nW2VudHJ5XS5iYXNlKSB8IFRfU1RQLCAmbHAtPnR4X3JpbmdbZW50cnldLmJhc2UpOworCQkvKiBlbmQgb2YgcGFja2V0ICovCisJCXdyaXRlbChyZWFkbCgmbHAtPnR4X3JpbmdbZW5kXS5iYXNlKSB8IFRfRU5QLCAmbHAtPnR4X3JpbmdbZW5kXS5iYXNlKTsKKworCQlmb3IgKGkgPSBlbmQ7IGkgIT0gZW50cnk7IC0taSkgeworCQkJLyogb3duZXJzaGlwIG9mIHBhY2tldCAqLworCQkJd3JpdGVsKHJlYWRsKCZscC0+dHhfcmluZ1tpXS5iYXNlKSB8IFRfT1dOLCAmbHAtPnR4X3JpbmdbaV0uYmFzZSk7CisJCQlpZiAoaSA9PSAwKQorCQkJCWkgPSBscC0+dHhSaW5nTWFzayArIDE7CisJCX0KKwkJd3JpdGVsKHJlYWRsKCZscC0+dHhfcmluZ1tlbnRyeV0uYmFzZSkgfCBUX09XTiwgJmxwLT50eF9yaW5nW2VudHJ5XS5iYXNlKTsKKworCQlscC0+dHhfbmV3ID0gKCsrZW5kKSAmIGxwLT50eFJpbmdNYXNrOwkvKiB1cGRhdGUgY3VycmVudCBwb2ludGVycyAqLworCX0gZWxzZSB7CisJCXN0YXR1cyA9IC0xOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGRlcGNhX2RiZ19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBkZXBjYV9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1X2xvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGRlcGNhX2luaXQgKnAgPSAmbHAtPmluaXRfYmxvY2s7CisJaW50IGk7CisKKwlpZiAoZGVwY2FfZGVidWcgPiAxKSB7CisJCS8qIERvIG5vdCBjb3B5IHRoZSBzaGFkb3cgaW5pdCBibG9jayBpbnRvIHNoYXJlZCBtZW1vcnkgKi8KKwkJLyogRGVidWdnaW5nIHNob3VsZCBub3QgYWZmZWN0IG5vcm1hbCBvcGVyYXRpb24hICovCisJCS8qIFRoZSBzaGFkb3cgaW5pdCBibG9jayB3aWxsIGdldCBjb3BpZWQgYWNyb3NzIGR1cmluZyBJbml0UmVzdGFydERlcGNhICovCisJCXByaW50aygiJXM6IGRlcGNhIG9wZW4gd2l0aCBpcnEgJWRcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlwcmludGsoIkRlc2NyaXB0b3IgaGVhZCBhZGRyZXNzZXMgKENQVSk6XG4iKTsKKwkJcHJpbnRrKCIgICAgICAgIDB4JWx4ICAweCVseFxuIiwgKHVfbG9uZykgbHAtPnJ4X3JpbmcsICh1X2xvbmcpIGxwLT50eF9yaW5nKTsKKwkJcHJpbnRrKCJEZXNjcmlwdG9yIGFkZHJlc3NlcyAoQ1BVKTpcblJYOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IGxwLT5yeFJpbmdNYXNrOyBpKyspIHsKKwkJCWlmIChpIDwgMykgeworCQkJCXByaW50aygiJXAgIiwgJmxwLT5yeF9yaW5nW2ldLmJhc2UpOworCQkJfQorCQl9CisJCXByaW50aygiLi4uJXBcbiIsICZscC0+cnhfcmluZ1tpXS5iYXNlKTsKKwkJcHJpbnRrKCJUWDogIik7CisJCWZvciAoaSA9IDA7IGkgPCBscC0+dHhSaW5nTWFzazsgaSsrKSB7CisJCQlpZiAoaSA8IDMpIHsKKwkJCQlwcmludGsoIiVwICIsICZscC0+dHhfcmluZ1tpXS5iYXNlKTsKKwkJCX0KKwkJfQorCQlwcmludGsoIi4uLiVwXG4iLCAmbHAtPnR4X3JpbmdbaV0uYmFzZSk7CisJCXByaW50aygiXG5EZXNjcmlwdG9yIGJ1ZmZlcnMgKERldmljZSk6XG5SWDogIik7CisJCWZvciAoaSA9IDA7IGkgPCBscC0+cnhSaW5nTWFzazsgaSsrKSB7CisJCQlpZiAoaSA8IDMpIHsKKwkJCQlwcmludGsoIjB4JTguOHggICIsIHJlYWRsKCZscC0+cnhfcmluZ1tpXS5iYXNlKSk7CisJCQl9CisJCX0KKwkJcHJpbnRrKCIuLi4weCU4Ljh4XG4iLCByZWFkbCgmbHAtPnJ4X3JpbmdbaV0uYmFzZSkpOworCQlwcmludGsoIlRYOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IGxwLT50eFJpbmdNYXNrOyBpKyspIHsKKwkJCWlmIChpIDwgMykgeworCQkJCXByaW50aygiMHglOC44eCAgIiwgcmVhZGwoJmxwLT50eF9yaW5nW2ldLmJhc2UpKTsKKwkJCX0KKwkJfQorCQlwcmludGsoIi4uLjB4JTguOHhcbiIsIHJlYWRsKCZscC0+dHhfcmluZ1tpXS5iYXNlKSk7CisJCXByaW50aygiSW5pdGlhbGlzYXRpb24gYmxvY2sgYXQgMHglOC44bHgoUGh5cylcbiIsIGxwLT5tZW1fc3RhcnQpOworCQlwcmludGsoIiAgICAgICAgbW9kZTogMHglNC40eFxuIiwgcC0+bW9kZSk7CisJCXByaW50aygiICAgICAgICBwaHlzaWNhbCBhZGRyZXNzOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOIC0gMTsgaSsrKSB7CisJCQlwcmludGsoIiUyLjJ4OiIsIHAtPnBoeXNfYWRkcltpXSk7CisJCX0KKwkJcHJpbnRrKCIlMi4yeFxuIiwgcC0+cGh5c19hZGRyW2ldKTsKKwkJcHJpbnRrKCIgICAgICAgIG11bHRpY2FzdCBoYXNoIHRhYmxlOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IChIQVNIX1RBQkxFX0xFTiA+PiAzKSAtIDE7IGkrKykgeworCQkJcHJpbnRrKCIlMi4yeDoiLCBwLT5tY2FzdF90YWJsZVtpXSk7CisJCX0KKwkJcHJpbnRrKCIlMi4yeFxuIiwgcC0+bWNhc3RfdGFibGVbaV0pOworCQlwcmludGsoIiAgICAgICAgcnhfcmluZyBhdDogMHglOC44eFxuIiwgcC0+cnhfcmluZyk7CisJCXByaW50aygiICAgICAgICB0eF9yaW5nIGF0OiAweCU4Ljh4XG4iLCBwLT50eF9yaW5nKTsKKwkJcHJpbnRrKCJidWZmZXJzIChQaHlzKTogMHglOC44bHhcbiIsIGxwLT5tZW1fc3RhcnQgKyBscC0+YnVmZnNfb2Zmc2V0KTsKKwkJcHJpbnRrKCJSaW5nIHNpemU6XG5SWDogJWQgIExvZzIocnhSaW5nTWFzayk6IDB4JTguOHhcbiIsIChpbnQpIGxwLT5yeFJpbmdNYXNrICsgMSwgbHAtPnJ4X3JsZW4pOworCQlwcmludGsoIlRYOiAlZCAgTG9nMih0eFJpbmdNYXNrKTogMHglOC44eFxuIiwgKGludCkgbHAtPnR4UmluZ01hc2sgKyAxLCBscC0+dHhfcmxlbik7CisJCW91dHcoQ1NSMiwgREVQQ0FfQUREUik7CisJCXByaW50aygiQ1NSMiYxOiAweCU0LjR4IiwgaW53KERFUENBX0RBVEEpKTsKKwkJb3V0dyhDU1IxLCBERVBDQV9BRERSKTsKKwkJcHJpbnRrKCIlNC40eFxuIiwgaW53KERFUENBX0RBVEEpKTsKKwkJb3V0dyhDU1IzLCBERVBDQV9BRERSKTsKKwkJcHJpbnRrKCJDU1IzOiAweCU0LjR4XG4iLCBpbncoREVQQ0FfREFUQSkpOworCX0KKworCXJldHVybjsKK30KKworLyoKKyoqIFBlcmZvcm0gSU9DVEwgY2FsbCBmdW5jdGlvbnMgaGVyZS4gU29tZSBhcmUgcHJpdmlsZWdlZCBvcGVyYXRpb25zIGFuZCB0aGUKKyoqIGVmZmVjdGl2ZSB1aWQgaXMgY2hlY2tlZCBpbiB0aG9zZSBjYXNlcy4KKyoqIEFsbCBtdWx0aWNhc3QgSU9DVExzIHdpbGwgbm90IHdvcmsgaGVyZSBhbmQgYXJlIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuCisqLworc3RhdGljIGludCBkZXBjYV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBkZXBjYV9wcml2YXRlICpscCA9IChzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJc3RydWN0IGRlcGNhX2lvY3RsICppb2MgPSAoc3RydWN0IGRlcGNhX2lvY3RsICopICZycS0+aWZyX2lmcnU7CisJaW50IGksIHN0YXR1cyA9IDA7CisJdV9sb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuaW9uIHsKKwkJdTggYWRkclsoSEFTSF9UQUJMRV9MRU4gKiBFVEhfQUxFTildOworCQl1MTYgc3ZhbFsoSEFTSF9UQUJMRV9MRU4gKiBFVEhfQUxFTikgPj4gMV07CisJCXUzMiBsdmFsWyhIQVNIX1RBQkxFX0xFTiAqIEVUSF9BTEVOKSA+PiAyXTsKKwl9IHRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgKmJ1ZjsKKworCXN3aXRjaCAoaW9jLT5jbWQpIHsKKwljYXNlIERFUENBX0dFVF9IV0FERFI6CS8qIEdldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgeworCQkJdG1wLmFkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworCQl9CisJCWlvYy0+bGVuID0gRVRIX0FMRU47CisJCWlmIChjb3B5X3RvX3VzZXIoaW9jLT5kYXRhLCB0bXAuYWRkciwgaW9jLT5sZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBERVBDQV9TRVRfSFdBRERSOgkvKiBTZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHRtcC5hZGRyLCBpb2MtPmRhdGEsIEVUSF9BTEVOKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgeworCQkJZGV2LT5kZXZfYWRkcltpXSA9IHRtcC5hZGRyW2ldOworCQl9CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJd2hpbGUgKGxwLT50eF9vbGQgIT0gbHAtPnR4X25ldykKKwkJCWNwdV9yZWxheCgpOwkvKiBXYWl0IGZvciB0aGUgcmluZyB0byBlbXB0eSAqLworCisJCVNUT1BfREVQQ0E7CS8qIFRlbXBvcmFyaWx5IHN0b3AgdGhlIGRlcGNhLiAgKi8KKwkJZGVwY2FfaW5pdF9yaW5nKGRldik7CS8qIEluaXRpYWxpemUgdGhlIGRlc2NyaXB0b3IgcmluZ3MgKi8KKwkJTG9hZENTUnMoZGV2KTsJLyogUmVsb2FkIENTUjMgKi8KKwkJSW5pdFJlc3RhcnREZXBjYShkZXYpOwkvKiBSZXN1bWUgbm9ybWFsIG9wZXJhdGlvbi4gKi8KKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsJLyogVW5sb2NrIHRoZSBUWCByaW5nICovCisJCWJyZWFrOworCisJY2FzZSBERVBDQV9TRVRfUFJPTToJLyogU2V0IFByb21pc2N1b3VzIE1vZGUgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQl3aGlsZSAobHAtPnR4X29sZCAhPSBscC0+dHhfbmV3KQorCQkJY3B1X3JlbGF4KCk7CS8qIFdhaXQgZm9yIHRoZSByaW5nIHRvIGVtcHR5ICovCisKKwkJU1RPUF9ERVBDQTsJLyogVGVtcG9yYXJpbHkgc3RvcCB0aGUgZGVwY2EuICAqLworCQlkZXBjYV9pbml0X3JpbmcoZGV2KTsJLyogSW5pdGlhbGl6ZSB0aGUgZGVzY3JpcHRvciByaW5ncyAqLworCQlscC0+aW5pdF9ibG9jay5tb2RlIHw9IFBST007CS8qIFNldCBwcm9taXNjdW91cyBtb2RlICovCisKKwkJTG9hZENTUnMoZGV2KTsJLyogUmVsb2FkIENTUjMgKi8KKwkJSW5pdFJlc3RhcnREZXBjYShkZXYpOwkvKiBSZXN1bWUgbm9ybWFsIG9wZXJhdGlvbi4gKi8KKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsJLyogVW5sb2NrIHRoZSBUWCByaW5nICovCisJCWJyZWFrOworCisJY2FzZSBERVBDQV9DTFJfUFJPTToJLyogQ2xlYXIgUHJvbWlzY3VvdXMgTW9kZSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXdoaWxlIChscC0+dHhfb2xkICE9IGxwLT50eF9uZXcpCisJCQljcHVfcmVsYXgoKTsJLyogV2FpdCBmb3IgdGhlIHJpbmcgdG8gZW1wdHkgKi8KKworCQlTVE9QX0RFUENBOwkvKiBUZW1wb3JhcmlseSBzdG9wIHRoZSBkZXBjYS4gICovCisJCWRlcGNhX2luaXRfcmluZyhkZXYpOwkvKiBJbml0aWFsaXplIHRoZSBkZXNjcmlwdG9yIHJpbmdzICovCisJCWxwLT5pbml0X2Jsb2NrLm1vZGUgJj0gflBST007CS8qIENsZWFyIHByb21pc2N1b3VzIG1vZGUgKi8KKworCQlMb2FkQ1NScyhkZXYpOwkvKiBSZWxvYWQgQ1NSMyAqLworCQlJbml0UmVzdGFydERlcGNhKGRldik7CS8qIFJlc3VtZSBub3JtYWwgb3BlcmF0aW9uLiAqLworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwkvKiBVbmxvY2sgdGhlIFRYIHJpbmcgKi8KKwkJYnJlYWs7CisKKwljYXNlIERFUENBX1NBWV9CT086CS8qIFNheSAiQm9vISIgdG8gdGhlIGtlcm5lbCBsb2cgZmlsZSAqLworCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCXByaW50aygiJXM6IEJvbyFcbiIsIGRldi0+bmFtZSk7CisJCWJyZWFrOworCisJY2FzZSBERVBDQV9HRVRfTUNBOgkvKiBHZXQgdGhlIG11bHRpY2FzdCBhZGRyZXNzIHRhYmxlICovCisJCWlvYy0+bGVuID0gKEhBU0hfVEFCTEVfTEVOID4+IDMpOworCQlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgbHAtPmluaXRfYmxvY2subWNhc3RfdGFibGUsIGlvYy0+bGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgREVQQ0FfU0VUX01DQToJLyogU2V0IGEgbXVsdGljYXN0IGFkZHJlc3MgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGlvYy0+bGVuID49IEhBU0hfVEFCTEVfTEVOKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X2Zyb21fdXNlcih0bXAuYWRkciwgaW9jLT5kYXRhLCBFVEhfQUxFTiAqIGlvYy0+bGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIERFUENBX0NMUl9NQ0E6CS8qIENsZWFyIGFsbCBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCXNldF9tdWx0aWNhc3RfbGlzdChkZXYpOworCQlicmVhazsKKworCWNhc2UgREVQQ0FfTUNBX0VOOgkvKiBFbmFibGUgcGFzcyBhbGwgbXVsdGljYXN0IGFkZHJlc3NpbmcgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJc2V0X211bHRpY2FzdF9saXN0KGRldik7CisJCWJyZWFrOworCisJY2FzZSBERVBDQV9HRVRfU1RBVFM6CS8qIEdldCB0aGUgZHJpdmVyIHN0YXRpc3RpY3MgKi8KKwkJaW9jLT5sZW4gPSBzaXplb2YobHAtPnBrdFN0YXRzKTsKKwkJYnVmID0ga21hbGxvYyhpb2MtPmxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmKCFidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJCW1lbWNweShidWYsICZscC0+cGt0U3RhdHMsIGlvYy0+bGVuKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihpb2MtPmRhdGEsIGJ1ZiwgaW9jLT5sZW4pKQorCQkJc3RhdHVzID0gLUVGQVVMVDsKKwkJa2ZyZWUoYnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIERFUENBX0NMUl9TVEFUUzoJLyogWmVybyBvdXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCQltZW1zZXQoJmxwLT5wa3RTdGF0cywgMCwgc2l6ZW9mKGxwLT5wa3RTdGF0cykpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgREVQQ0FfR0VUX1JFRzoJLyogR2V0IHRoZSBERVBDQSBSZWdpc3RlcnMgKi8KKwkJaSA9IDA7CisJCXRtcC5zdmFsW2krK10gPSBpbncoREVQQ0FfTklDU1IpOworCQlvdXR3KENTUjAsIERFUENBX0FERFIpOwkvKiBzdGF0dXMgcmVnaXN0ZXIgKi8KKwkJdG1wLnN2YWxbaSsrXSA9IGludyhERVBDQV9EQVRBKTsKKwkJbWVtY3B5KCZ0bXAuc3ZhbFtpXSwgJmxwLT5pbml0X2Jsb2NrLCBzaXplb2Yoc3RydWN0IGRlcGNhX2luaXQpKTsKKwkJaW9jLT5sZW4gPSBpICsgc2l6ZW9mKHN0cnVjdCBkZXBjYV9pbml0KTsKKwkJaWYgKGNvcHlfdG9fdXNlcihpb2MtPmRhdGEsIHRtcC5hZGRyLCBpb2MtPmxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2luaXQgZGVwY2FfbW9kdWxlX2luaXQgKHZvaWQpCit7CisgICAgICAgIGludCBlcnIgPSAwOworCisjaWZkZWYgQ09ORklHX01DQQorICAgICAgICBlcnIgPSBtY2FfcmVnaXN0ZXJfZHJpdmVyICgmZGVwY2FfbWNhX2RyaXZlcik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRUlTQQorICAgICAgICBlcnIgfD0gZWlzYV9kcml2ZXJfcmVnaXN0ZXIgKCZkZXBjYV9laXNhX2RyaXZlcik7CisjZW5kaWYKKwllcnIgfD0gZHJpdmVyX3JlZ2lzdGVyICgmZGVwY2FfaXNhX2RyaXZlcik7CisJZGVwY2FfcGxhdGZvcm1fcHJvYmUgKCk7CisJCisgICAgICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZXBjYV9tb2R1bGVfZXhpdCAodm9pZCkKK3sKKwlpbnQgaTsKKyNpZmRlZiBDT05GSUdfTUNBCisgICAgICAgIG1jYV91bnJlZ2lzdGVyX2RyaXZlciAoJmRlcGNhX21jYV9kcml2ZXIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0VJU0EKKyAgICAgICAgZWlzYV9kcml2ZXJfdW5yZWdpc3RlciAoJmRlcGNhX2Vpc2FfZHJpdmVyKTsKKyNlbmRpZgorCWRyaXZlcl91bnJlZ2lzdGVyICgmZGVwY2FfaXNhX2RyaXZlcik7CisKKwlmb3IgKGkgPSAwOyBkZXBjYV9pb19wb3J0c1tpXS5pb2Jhc2U7IGkrKykgeworCQlpZiAoZGVwY2FfaW9fcG9ydHNbaV0uZGV2aWNlKSB7CisJCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlciAoZGVwY2FfaW9fcG9ydHNbaV0uZGV2aWNlKTsKKwkJCWRlcGNhX2lvX3BvcnRzW2ldLmRldmljZSA9IE5VTEw7CisJCX0KKwl9Cit9CisKK21vZHVsZV9pbml0IChkZXBjYV9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdCAoZGVwY2FfbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGVwY2EuaCBiL2RyaXZlcnMvbmV0L2RlcGNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3ODUyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RlcGNhLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgICAgV3JpdHRlbiAxOTk0IGJ5IERhdmlkIEMuIERhdmllcy4KKworICAgIENvcHlyaWdodCAxOTk0IERhdmlkIEMuIERhdmllcy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQKKyAgICBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieQorICAgIHJlZmVyZW5jZS4KKyovCisKKy8qCisqKiBJL08gYWRkcmVzc2VzLiBOb3RlIHRoYXQgdGhlIDJrIGJ1ZmZlciBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBpbgorKiogdGhpcyBkcml2ZXIuCisqLworI2RlZmluZSBERVBDQV9OSUNTUiBpb2FkZHIrMHgwMCAgIC8qIE5ldHdvcmsgaW50ZXJmYWNlIENTUiAqLworI2RlZmluZSBERVBDQV9SQkkgICBpb2FkZHIrMHgwMiAgIC8qIFJBTSBidWZmZXIgaW5kZXggKDJrIGJ1ZmZlciBtb2RlKSAqLworI2RlZmluZSBERVBDQV9EQVRBICBpb2FkZHIrMHgwNCAgIC8qIExBTkNFIHJlZ2lzdGVycycgZGF0YSBwb3J0ICovCisjZGVmaW5lIERFUENBX0FERFIgIGlvYWRkcisweDA2ICAgLyogTEFOQ0UgcmVnaXN0ZXJzJyBhZGRyZXNzIHBvcnQgKi8KKyNkZWZpbmUgREVQQ0FfSEJBU0UgaW9hZGRyKzB4MDggICAvKiBFSVNBIGhpZ2ggbWVtb3J5IGJhc2UgYWRkcmVzcyByZWcuICovCisjZGVmaW5lIERFUENBX1BST00gIGlvYWRkcisweDBjICAgLyogRXRoZXJuZXQgYWRkcmVzcyBST00gZGF0YSBwb3J0ICovCisjZGVmaW5lIERFUENBX0NORkcgIGlvYWRkcisweDBjICAgLyogRUlTQSBDb25maWd1cmF0aW9uIHBvcnQgKi8KKyNkZWZpbmUgREVQQ0FfUkJTQSAgaW9hZGRyKzB4MGUgICAvKiBSQU0gYnVmZmVyIHN0YXJ0aW5nIGFkZHJlc3MgKDJrIGJ1ZmYuKSAqLworCisvKgorKiogVGhlc2UgYXJlIExBTkNFIHJlZ2lzdGVycyBhZGRyZXNzYWJsZSB0aHJvdWdoIERFUENBX0FERFIgCisqLworI2RlZmluZSBDU1IwICAgICAgIDAKKyNkZWZpbmUgQ1NSMSAgICAgICAxCisjZGVmaW5lIENTUjIgICAgICAgMgorI2RlZmluZSBDU1IzICAgICAgIDMKKworLyogCisqKiBORVRXT1JLIElOVEVSRkFDRSBDU1IgKE5JX0NTUikgYml0IGRlZmluaXRpb25zIAorKi8KKyAKKyNkZWZpbmUgVE8gICAgICAgCTB4MDEwMAkvKiBUaW1lIE91dCBmb3IgcmVtb3RlIGJvb3QgKi8KKyNkZWZpbmUgU0hFICAgICAgCTB4MDA4MCAgLyogU0hhZG93IG1lbW9yeSBFbmFibGUgKi8KKyNkZWZpbmUgQlMgICAgICAgCTB4MDA0MCAgLyogQmFuayBTZWxlY3QgKi8KKyNkZWZpbmUgQlVGICAgICAgCTB4MDAyMAkvKiBCVUZmZXIgc2l6ZSAoMS0+MzJrLCAwLT42NGspICovCisjZGVmaW5lIFJCRSAgICAgIAkweDAwMTAJLyogUmVtb3RlIEJvb3QgRW5hYmxlICgxLT5uZXQgYm9vdCkgKi8KKyNkZWZpbmUgQUFDICAgICAgCTB4MDAwOCAgLyogQWRkcmVzcyBST00gQWRkcmVzcyBDb3VudGVyICgxLT5lbmFibGUpICovCisjZGVmaW5lIF8xMjhLQiAgICAgIAkweDAwMDggIC8qIDEyOGtCIE5ldHdvcmsgUkFNICgxLT5lbmFibGUpICovCisjZGVmaW5lIElNICAgICAgIAkweDAwMDQJLyogSW50ZXJydXB0IE1hc2sgKDEtPm1hc2spICovCisjZGVmaW5lIElFTiAgICAgIAkweDAwMDIJLyogSW50ZXJydXB0IHRyaXN0YXRlIEVOYWJsZSAoMS0+ZW5hYmxlKSAqLworI2RlZmluZSBMRUQgICAgICAJMHgwMDAxCS8qIExFRCBjb250cm9sICovCisKKy8qIAorKiogQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyIDAgKENTUjApIGJpdCBkZWZpbml0aW9ucyAKKyovCisKKyNkZWZpbmUgRVJSICAgICAJMHg4MDAwIAkvKiBFcnJvciBzdW1tYXJ5ICovCisjZGVmaW5lIEJBQkwgICAgCTB4NDAwMCAJLyogQmFiYmxlIHRyYW5zbWl0dGVyIHRpbWVvdXQgZXJyb3IgICovCisjZGVmaW5lIENFUlIgICAgCTB4MjAwMCAJLyogQ29sbGlzaW9uIEVycm9yICovCisjZGVmaW5lIE1JU1MgICAgCTB4MTAwMCAJLyogTWlzc2VkIHBhY2tldCAqLworI2RlZmluZSBNRVJSICAgIAkweDA4MDAgCS8qIE1lbW9yeSBFcnJvciAqLworI2RlZmluZSBSSU5UICAgIAkweDA0MDAgCS8qIFJlY2VpdmVyIEludGVycnVwdCAqLworI2RlZmluZSBUSU5UICAgIAkweDAyMDAgCS8qIFRyYW5zbWl0IEludGVycnVwdCAqLworI2RlZmluZSBJRE9OICAgIAkweDAxMDAgCS8qIEluaXRpYWxpemF0aW9uIERvbmUgKi8KKyNkZWZpbmUgSU5UUiAgICAJMHgwMDgwIAkvKiBJbnRlcnJ1cHQgRmxhZyAqLworI2RlZmluZSBJTkVBICAgIAkweDAwNDAgCS8qIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgUlhPTiAgICAJMHgwMDIwIAkvKiBSZWNlaXZlciBvbiAqLworI2RlZmluZSBUWE9OICAgIAkweDAwMTAgCS8qIFRyYW5zbWl0dGVyIG9uICovCisjZGVmaW5lIFRETUQgICAgCTB4MDAwOCAJLyogVHJhbnNtaXQgRGVtYW5kICovCisjZGVmaW5lIFNUT1AgICAgCTB4MDAwNCAJLyogU3RvcCAqLworI2RlZmluZSBTVFJUICAgIAkweDAwMDIgCS8qIFN0YXJ0ICovCisjZGVmaW5lIElOSVQgICAgCTB4MDAwMSAJLyogSW5pdGlhbGl6ZSAqLworI2RlZmluZSBJTlRNICAgICAgICAgICAgMHhmZjAwICAvKiBJbnRlcnJ1cHQgTWFzayAqLworI2RlZmluZSBJTlRFICAgICAgICAgICAgMHhmZmYwICAvKiBJbnRlcnJ1cHQgRW5hYmxlICovCisKKy8qCisqKiBDT05UUk9MIEFORCBTVEFUVVMgUkVHSVNURVIgMyAoQ1NSMykKKyovCisKKyNkZWZpbmUgQlNXUCAgICAJMHgwMDA0CS8qIEJ5dGUgU1dhUCAqLworI2RlZmluZSBBQ09OICAgIAkweDAwMDIJLyogQUxFIGNvbnRyb2wgKi8KKyNkZWZpbmUgQkNPTiAgICAJMHgwMDAxCS8qIEJ5dGUgQ09OdHJvbCAqLworCisvKgorKiogSW5pdGlhbGl6YXRpb24gQmxvY2sgTW9kZSBSZWdpc3RlciAKKyovCisKKyNkZWZpbmUgUFJPTSAgICAgICAJMHg4MDAwIAkvKiBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIEVNQkEgICAgICAgCTB4MDA4MAkvKiBFbmFibGUgTW9kaWZpZWQgQmFjay1vZmYgQWxnb3JpdGhtICovCisjZGVmaW5lIElOVEwgICAgICAgCTB4MDA0MCAJLyogSW50ZXJuYWwgTG9vcGJhY2sgKi8KKyNkZWZpbmUgRFJUWSAgICAgICAJMHgwMDIwIAkvKiBEaXNhYmxlIFJldHJ5ICovCisjZGVmaW5lIENPTEwgICAgICAgCTB4MDAxMCAJLyogRm9yY2UgQ29sbGlzaW9uICovCisjZGVmaW5lIERUQ1IgICAgICAgCTB4MDAwOCAJLyogRGlzYWJsZSBUcmFuc21pdCBDUkMgKi8KKyNkZWZpbmUgTE9PUCAgICAgICAJMHgwMDA0IAkvKiBMb29wYmFjayAqLworI2RlZmluZSBEVFggICAgICAgIAkweDAwMDIgCS8qIERpc2FibGUgdGhlIFRyYW5zbWl0dGVyICovCisjZGVmaW5lIERSWCAgICAgICAgCTB4MDAwMSAJLyogRGlzYWJsZSB0aGUgUmVjZWl2ZXIgKi8KKworLyoKKyoqIFJlY2VpdmUgTWVzc2FnZSBEZXNjcmlwdG9yIDEgKFJNRDEpIGJpdCBkZWZpbml0aW9ucy4gCisqLworCisjZGVmaW5lIFJfT1dOICAgICAgIDB4ODAwMDAwMDAgCS8qIE93bmVyIGJpdCAwID0gaG9zdCwgMSA9IGxhbmNlICovCisjZGVmaW5lIFJfRVJSICAgICAJMHg0MDAwIAkvKiBFcnJvciBTdW1tYXJ5ICovCisjZGVmaW5lIFJfRlJBTSAgICAJMHgyMDAwIAkvKiBGcmFtaW5nIEVycm9yICovCisjZGVmaW5lIFJfT0ZMTyAgICAJMHgxMDAwIAkvKiBPdmVyZmxvdyBFcnJvciAqLworI2RlZmluZSBSX0NSQyAgICAgCTB4MDgwMCAJLyogQ1JDIEVycm9yICovCisjZGVmaW5lIFJfQlVGRiAgICAJMHgwNDAwIAkvKiBCdWZmZXIgRXJyb3IgKi8KKyNkZWZpbmUgUl9TVFAgICAgIAkweDAyMDAgCS8qIFN0YXJ0IG9mIFBhY2tldCAqLworI2RlZmluZSBSX0VOUCAgICAgCTB4MDEwMCAJLyogRW5kIG9mIFBhY2tldCAqLworCisvKgorKiogVHJhbnNtaXQgTWVzc2FnZSBEZXNjcmlwdG9yIDEgKFRNRDEpIGJpdCBkZWZpbml0aW9ucy4gCisqLworCisjZGVmaW5lIFRfT1dOICAgICAgIDB4ODAwMDAwMDAgCS8qIE93bmVyIGJpdCAwID0gaG9zdCwgMSA9IGxhbmNlICovCisjZGVmaW5lIFRfRVJSICAgICAJMHg0MDAwIAkvKiBFcnJvciBTdW1tYXJ5ICovCisjZGVmaW5lIFRfQUREX0ZDUyAJMHgyMDAwIAkvKiBNb3JlIHRoZSAxIHJldHJ5IG5lZWRlZCB0byBYbWl0ICovCisjZGVmaW5lIFRfTU9SRSAgICAJMHgxMDAwCS8qID4xIHJldHJ5IHRvIHRyYW5zbWl0IHBhY2tldCAqLworI2RlZmluZSBUX09ORSAgICAgCTB4MDgwMCAJLyogMSB0cnkgbmVlZGVkIHRvIHRyYW5zbWl0IHRoZSBwYWNrZXQgKi8KKyNkZWZpbmUgVF9ERUYgICAgIAkweDA0MDAgCS8qIERlZmVycmVkICovCisjZGVmaW5lIFRfU1RQICAgICAgIDB4MDIwMDAwMDAgCS8qIFN0YXJ0IG9mIFBhY2tldCAqLworI2RlZmluZSBUX0VOUCAgICAgICAweDAxMDAwMDAwCS8qIEVuZCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgVF9GTEFHUyAgICAgMHhmZjAwMDAwMCAgLyogVFggRmxhZ3MgRmllbGQgKi8KKworLyoKKyoqIFRyYW5zbWl0IE1lc3NhZ2UgRGVzY3JpcHRvciAzIChUTUQzKSBiaXQgZGVmaW5pdGlvbnMuCisqLworCisjZGVmaW5lIFRNRDNfQlVGRiAgICAweDgwMDAJLyogQlVGRmVyIGVycm9yICovCisjZGVmaW5lIFRNRDNfVUZMTyAgICAweDQwMDAJLyogVW5kZXJGTE93IGVycm9yICovCisjZGVmaW5lIFRNRDNfUkVTICAgICAweDIwMDAJLyogUkVTZXJ2ZWQgKi8KKyNkZWZpbmUgVE1EM19MQ09MICAgIDB4MTAwMAkvKiBMYXRlIENPTGxpc2lvbiAqLworI2RlZmluZSBUTUQzX0xDQVIgICAgMHgwODAwCS8qIExvc3Mgb2YgQ0FScmllciAqLworI2RlZmluZSBUTUQzX1JUUlkgICAgMHgwNDAwCS8qIFJlVFJZIGVycm9yICovCisKKy8qIAorKiogRUlTQSBjb25maWd1cmF0aW9uIFJlZ2lzdGVyIChDTkZHKSBiaXQgZGVmaW5pdGlvbnMgCisqLworIAorI2RlZmluZSBUSU1FT1VUICAgICAgIAkweDAxMDAJLyogMDoyLjUgbWlucywgMTogMzAgc2VjcyAqLworI2RlZmluZSBSRU1PVEUgICAgICAJMHgwMDgwICAvKiBSZW1vdGUgQm9vdCBFbmFibGUgLT4gMSAqLworI2RlZmluZSBJUlExMSAgICAgICAJMHgwMDQwICAvKiBFbmFibGUgLT4gMSAqLworI2RlZmluZSBJUlExMCAgICAJMHgwMDIwCS8qIEVuYWJsZSAtPiAxICovCisjZGVmaW5lIElSUTkgICAgCTB4MDAxMAkvKiBFbmFibGUgLT4gMSAqLworI2RlZmluZSBJUlE1ICAgICAgCTB4MDAwOCAgLyogRW5hYmxlIC0+IDEgKi8KKyNkZWZpbmUgQlVGRiAgICAgCTB4MDAwNAkvKiAwOiA2NGtCIG9yIDEyOGtCLCAxOiAzMmtCICovCisjZGVmaW5lIFBBRFIxNiAgIAkweDAwMDIJLyogUkFNIG9uIDY0a0IgYm91bmRhcnkgKi8KKyNkZWZpbmUgUEFEUjE3ICAgIAkweDAwMDEJLyogUkFNIG9uIDEyOGtCIGJvdW5kYXJ5ICovCisKKy8qCisqKiBNaXNjZWxsYW5lb3VzCisqLworI2RlZmluZSBIQVNIX1RBQkxFX0xFTiAgIDY0ICAgICAgICAgICAvKiBCaXRzICovCisjZGVmaW5lIEhBU0hfQklUUyAgICAgICAgMHgwMDNmICAgICAgIC8qIDYgTFMgYml0cyAqLworCisjZGVmaW5lIE1BU0tfSU5URVJSVVBUUyAgIDEKKyNkZWZpbmUgVU5NQVNLX0lOVEVSUlVQVFMgMAorCisjZGVmaW5lIEVJU0FfRU4gICAgICAgICAweDAwMDEgICAgICAgIC8qIEVuYWJsZSBFSVNBIGJ1cyBidWZmZXJzICovCisjZGVmaW5lIEVJU0FfSUQgICAgICAgICBpb2Jhc2UrMHgwMDgwIC8qIElEIGxvbmcgd29yZCBmb3IgRUlTQSBjYXJkICovCisjZGVmaW5lIEVJU0FfQ1RSTCAgICAgICBpb2Jhc2UrMHgwMDg0IC8qIENvbnRyb2wgd29yZCBmb3IgRUlTQSBjYXJkICovCisKKy8qCisqKiBJbmNsdWRlIHRoZSBJT0NUTCBzdHVmZgorKi8KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisKKyNkZWZpbmUJREVQQ0FJT0NUTAlTSU9DREVWUFJJVkFURQorCitzdHJ1Y3QgZGVwY2FfaW9jdGwgeworCXVuc2lnbmVkIHNob3J0IGNtZDsgICAgICAgICAgICAgICAgLyogQ29tbWFuZCB0byBydW4gKi8KKwl1bnNpZ25lZCBzaG9ydCBsZW47ICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyICBfX3VzZXIgKmRhdGE7ICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyICovCit9OworCisvKiAKKyoqIFJlY29nbmlzZWQgY29tbWFuZHMgZm9yIHRoZSBkcml2ZXIgCisqLworI2RlZmluZSBERVBDQV9HRVRfSFdBRERSCTB4MDEgLyogR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzICovCisjZGVmaW5lIERFUENBX1NFVF9IV0FERFIJMHgwMiAvKiBHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgKi8KKyNkZWZpbmUgREVQQ0FfU0VUX1BST00gIAkweDAzIC8qIFNldCBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIERFUENBX0NMUl9QUk9NICAJMHgwNCAvKiBDbGVhciBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIERFUENBX1NBWV9CT08JICAgICAgICAweDA1IC8qIFNheSAiQm9vISIgdG8gdGhlIGtlcm5lbCBsb2cgZmlsZSAqLworI2RlZmluZSBERVBDQV9HRVRfTUNBICAgCTB4MDYgLyogR2V0IGEgbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgREVQQ0FfU0VUX01DQSAgIAkweDA3IC8qIFNldCBhIG11bHRpY2FzdCBhZGRyZXNzICovCisjZGVmaW5lIERFUENBX0NMUl9NQ0EgICAgCTB4MDggLyogQ2xlYXIgYSBtdWx0aWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBERVBDQV9NQ0FfRU4gICAgCTB4MDkgLyogRW5hYmxlIGEgbXVsdGljYXN0IGFkZHJlc3MgZ3JvdXAgKi8KKyNkZWZpbmUgREVQQ0FfR0VUX1NUQVRTICAJMHgwYSAvKiBHZXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisjZGVmaW5lIERFUENBX0NMUl9TVEFUUyAJMHgwYiAvKiBaZXJvIG91dCB0aGUgZHJpdmVyIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgREVQQ0FfR0VUX1JFRyAgIAkweDBjIC8qIEdldCB0aGUgUmVnaXN0ZXIgY29udGVudHMgKi8KKyNkZWZpbmUgREVQQ0FfU0VUX1JFRyAgIAkweDBkIC8qIFNldCB0aGUgUmVnaXN0ZXIgY29udGVudHMgKi8KKyNkZWZpbmUgREVQQ0FfRFVNUCAgICAgICAgICAgICAgMHgwZiAvKiBEdW1wIHRoZSBERVBDQSBTdGF0dXMgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGdycy5jIGIvZHJpdmVycy9uZXQvZGdycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDk4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kZ3JzLmMKQEAgLTAsMCArMSwxNjE3IEBACisvKgorICoJRGlnaSBSaWdodFN3aXRjaCBTRS1YIGxvYWRhYmxlIGRldmljZSBkcml2ZXIgZm9yIExpbnV4CisgKgorICoJVGhlIFJpZ2h0U3dpdGNoIGlzIGEgNCAoRUlTQSkgb3IgNiAoUENJKSBwb3J0IGV0aGVyc3dpdGNoIGFuZAorICoJYSBOSUMgb24gYW4gaW50ZXJuYWwgYm9hcmQuCisgKgorICoJQXV0aG9yOiBSaWNrIFJpY2hhcmRzb24sIHJpY2tAcmVtb3RlcG9pbnQuY29tCisgKglEZXJpdmVkIGZyb20gdGhlIFNWUjQuMiAoVW5peFdhcmUpIGRyaXZlciBmb3IgdGhlIHNhbWUgY2FyZC4KKyAqCisgKglDb3B5cmlnaHQgMTk5NS0xOTk2IERpZ2kgSW50ZXJuYXRpb25hbCBJbmMuCisgKgorICoJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICoJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKglGb3IgaW5mb3JtYXRpb24gb24gcHVyY2hhc2luZyBhIFJpZ2h0U3dpdGNoIFNFLTQgb3IgU0UtNgorICoJYm9hcmQsIHBsZWFzZSBjb250YWN0IERpZ2kncyBzYWxlcyBkZXBhcnRtZW50IGF0IDEtNjEyLTkxMi0zNDQ0CisgKglvciAxLTgwMC1ESUdJQlJELiAgT3V0c2lkZSB0aGUgVS5TLiwgcGxlYXNlIGNoZWNrIG91ciBXZWIgcGFnZQorICoJYXQgaHR0cDovL3d3dy5kZ2lpLmNvbSBmb3Igc2FsZXMgb2ZmaWNlcyB3b3JsZHdpZGUuCisgKgorICoJT1BFUkFUSU9OOgorICoJV2hlbiBjb21waWxlZCBhcyBhIGxvYWRhYmxlIG1vZHVsZSwgdGhpcyBkcml2ZXIgY2FuIG9wZXJhdGUKKyAqCXRoZSBib2FyZCBhcyBlaXRoZXIgYSA0LzYgcG9ydCBzd2l0Y2ggd2l0aCBhIDV0aCBvciA3dGggcG9ydAorICoJdGhhdCBpcyBhIGNvbnZlbnRpb25hbCBOSUMgaW50ZXJmYWNlIGFzIGZhciBhcyB0aGUgaG9zdCBpcworICoJY29uY2VybmVkLCBPUiBhcyA0LzYgaW5kZXBlbmRlbnQgTklDcy4gIFRvIHNlbGVjdCBtdWx0aS1OSUMKKyAqCW1vZGUsIGFkZCAibmljbW9kZT0xIiBvbiB0aGUgaW5zbW9kIGxvYWQgbGluZSBmb3IgdGhlIGRyaXZlci4KKyAqCisgKglUaGlzIGRyaXZlciB1c2VzIHRoZSAiZGV2IiBjb21tb24gZXRoZXJuZXQgZGV2aWNlIHN0cnVjdHVyZQorICoJYW5kIGEgcHJpdmF0ZSAicHJpdiIgKGRldi0+cHJpdikgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAqCW1vc3RseSBER1JTLXNwZWNpZmljIGluZm9ybWF0aW9uIGFuZCBzdGF0aXN0aWNzLiAgVG8ga2VlcAorICoJdGhlIGNvZGUgZm9yIGJvdGggdGhlIHN3aXRjaCBtb2RlIGFuZCB0aGUgbXVsdGktTklDIG1vZGUKKyAqCWFzIHNpbWlsYXIgYXMgcG9zc2libGUsIEkgaGF2ZSBpbnRyb2R1Y2VkIHRoZSBjb25jZXB0IG9mCisgKgkiZGV2MCIvInByaXYwIiBhbmQgImRldk4iLyJwcml2TiIgIHBvaW50ZXIgcGFpcnMgaW4gc3Vicm91dGluZXMKKyAqCXdoZXJlIG5lZWRlZC4gIFRoZSBmaXJzdCBwYWlyIG9mIHBvaW50ZXJzIHBvaW50cyB0byB0aGUKKyAqCSJkZXYiIGFuZCAicHJpdiIgc3RydWN0dXJlcyBvZiB0aGUgemVyb3RoICgwdGgpIGRldmljZQorICoJaW50ZXJmYWNlIGFzc29jaWF0ZWQgd2l0aCBhIGJvYXJkLiAgVGhlIHNlY29uZCBwYWlyIG9mCisgKglwb2ludGVycyBwb2ludHMgdG8gdGhlIGN1cnJlbnQgKE50aCkgZGV2aWNlIGludGVyZmFjZQorICoJZm9yIHRoZSBib2FyZDogdGhlIG9uZSBmb3Igd2hpY2ggd2UgYXJlIHByb2Nlc3NpbmcgZGF0YS4KKyAqCisgKglJbiBzd2l0Y2ggbW9kZSwgdGhlIHBhaXJzIG9mIHBvaW50ZXJzIGFyZSBhbHdheXMgdGhlIHNhbWUsCisgKgl0aGF0IGlzLCBkZXYwID09IGRldk4gYW5kIHByaXYwID09IHByaXZOLiAgVGhpcyBpcyBqdXN0CisgKglsaWtlIHByZXZpb3VzIHJlbGVhc2VzIG9mIHRoaXMgZHJpdmVyIHdoaWNoIGRpZCBub3Qgc3VwcG9ydAorICoJTklDIG1vZGUuCisgKgorICoJSW4gbXVsdGktTklDIG1vZGUsIHRoZSBwYWlycyBvZiBwb2ludGVycyBtYXkgYmUgZGlmZmVyZW50LgorICoJV2UgdXNlIHRoZSBkZXZOIGFuZCBwcml2TiBwb2ludGVycyB0byByZWZlcmVuY2UganVzdCB0aGUKKyAqCW5hbWUsIHBvcnQgbnVtYmVyLCBhbmQgc3RhdGlzdGljcyBmb3IgdGhlIGN1cnJlbnQgaW50ZXJmYWNlLgorICoJV2UgdXNlIHRoZSBkZXYwIGFuZCBwcml2MCBwb2ludGVycyB0byBhY2Nlc3MgdGhlIHZhcmlhYmxlcworICoJdGhhdCBjb250cm9sIGFjY2VzcyB0byB0aGUgYm9hcmQsIHN1Y2ggYXMgYm9hcmQgYWRkcmVzcworICoJYW5kIHNpbXVsYXRlZCA4MjU5NiB2YXJpYWJsZXMuICBUaGlzIGlzIGJlY2F1c2UgdGhlcmUgaXMKKyAqCW9ubHkgb25lICJmYWtlIiA4MjU5NiB0aGF0IHNlcnZlcyBhcyB0aGUgaW50ZXJmYWNlIHRvCisgKgl0aGUgYm9hcmQuICBXZSBkbyBub3Qgd2FudCB0byB0cnkgdG8ga2VlcCB0aGUgdmFyaWFibGVzCisgKglhc3NvY2lhdGVkIHdpdGggdGhpcyA4MjU5NiBpbiBzeW5jIGFjcm9zcyBhbGwgZGV2aWNlcy4KKyAqCisgKglUaGlzIHNjaGVtZSB3b3JrcyB3ZWxsLiAgQXMgeW91IHdpbGwgc2VlLCBleGNlcHQgZm9yCisgKglpbml0aWFsaXphdGlvbiwgdGhlcmUgaXMgdmVyeSBsaXR0bGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgKgl0aGUgdHdvIG1vZGVzIGFzIGZhciBhcyB0aGlzIGRyaXZlciBpcyBjb25jZXJuZWQuICBPbiB0aGUKKyAqCXJlY2VpdmUgc2lkZSBpbiBOSUMgbW9kZSwgdGhlIGludGVycnVwdCAqYWx3YXlzKiBjb21lcyBpbiBvbgorICoJdGhlIDB0aCBpbnRlcmZhY2UgKGRldjAvcHJpdjApLiAgV2UgdGhlbiBmaWd1cmUgb3V0IHdoaWNoCisgKglyZWFsIDgyNTk2IHBvcnQgaXQgY2FtZSBpbiBvbiBmcm9tIGxvb2tpbmcgYXQgdGhlICJjaGFuIgorICoJbWVtYmVyIHRoYXQgdGhlIGJvYXJkIGZpcm13YXJlIGFkZHMgYXQgdGhlIGVuZCBvZiBlYWNoCisgKglSQkQgKGEuay5hLiBUQkQpLiBXZSBnZXQgdGhlIGNoYW5uZWwgbnVtYmVyIGxpa2UgdGhpczoKKyAqCQlpbnQgY2hhbiA9ICgoSTU5Nl9SQkQgKikgUzJIKGNicC0+eG1pdC50YmRwKSktPmNoYW47CisgKgorICoJT24gdGhlIHRyYW5zbWl0IHNpZGUgaW4gbXVsdGktTklDIG1vZGUsIHdlIHNwZWNpZnkgdGhlCisgKglvdXRwdXQgODI1OTYgcG9ydCBieSBzZXR0aW5nIHRoZSBuZXcgImRzdGNoYW4iIHN0cnVjdHVyZQorICoJbWVtYmVyIHRoYXQgaXMgYXQgdGhlIGVuZCBvZiB0aGUgUkZELCBsaWtlIHRoaXM6CisgKgkJcHJpdjAtPnJmZHAtPmRzdGNoYW4gPSBwcml2Ti0+Y2hhbjsKKyAqCisgKglUT0RPOgorICoJLSBNdWx0aS1OSUMgbW9kZSBpcyBub3QgeWV0IHN1cHBvcnRlZCB3aGVuIHRoZSBkcml2ZXIgaXMgbGlua2VkCisgKgkgIGludG8gdGhlIGtlcm5lbC4KKyAqCS0gQmV0dGVyIGhhbmRsaW5nIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMuCisgKgorICoJRml4ZXM6CisgKglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gLSAxMS8wMS8yMDAxCisgKgktIGZpeCBkZ3JzX2ZvdW5kX2RldmljZSB3cnQgY2hlY2tpbmcga21hbGxvYyByZXR1cm4gYW5kCisgKglyb2xsYmFja2luZyB0aGUgcGFydGlhbCBzdGVwcyBvZiB0aGUgd2hvbGUgcHJvY2VzcyB3aGVuCisgKglvbmUgb2YgdGhlIGRldmljZXMgY2FuJ3QgYmUgYWxsb2NhdGVkLiBGaXggU0VUX01PRFVMRV9PV05FUgorICoJb24gdGhlIGxvb3AgdG8gdXNlIGRldk4gaW5zdGVhZCBvZiByZXBlYXRlZCBjYWxscyB0byBkZXYuCisgKgorICoJZGF2ZWogPGRhdmVqQHN1c2UuZGU+IC0gOS8yLzIwMDEKKyAqCS0gRW5hYmxlIFBDSSBkZXZpY2UgYmVmb3JlIHJlYWRpbmcgaW9hZGRyL2lycQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZWlzYS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPQorCSIkSWQ6IGRncnMuYyx2IDEuMTMgMjAwMC8wNi8wNiAwNDowNzowMCByaWNrIEV4cCAkIjsKKworLyoKKyAqCURHUlMgaW5jbHVkZSBmaWxlcworICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBib29sOworI2RlZmluZSB2b2wgdm9sYXRpbGUKKworI2luY2x1ZGUgImRncnMuaCIKKyNpbmNsdWRlICJkZ3JzX2VzNGguaCIKKyNpbmNsdWRlICJkZ3JzX3BseDkwNjAuaCIKKyNpbmNsdWRlICJkZ3JzX2k4MjU5Ni5oIgorI2luY2x1ZGUgImRncnNfZXRoZXIuaCIKKyNpbmNsdWRlICJkZ3JzX2Fzc3RydWN0LmgiCisjaW5jbHVkZSAiZGdyc19iY29tbS5oIgorCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGRncnNfcGNpX3RibFtdID0geworCXsgU0U2X1BDSV9WRU5ET1JfSUQsIFNFNl9QQ0lfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgfQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGRncnNfcGNpX3RibCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19FSVNBCitzdGF0aWMgc3RydWN0IGVpc2FfZGV2aWNlX2lkIGRncnNfZWlzYV90YmxbXSA9IHsKKwl7ICJEQkkwQTAxIiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZWlzYSwgZGdyc19laXNhX3RibCk7CisjZW5kaWYKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKy8qCisgKglGaXJtd2FyZS4gIENvbXBpbGVkIHNlcGFyYXRlbHkgZm9yIGxvY2FsIGNvbXBpbGF0aW9uLAorICoJYnV0ICNpbmNsdWRlZCBmb3IgTGludXggZGlzdHJpYnV0aW9uLgorICovCisjaWZuZGVmIE5PRlcKKwkjaW5jbHVkZSAiZGdyc19maXJtd2FyZS5jIgorI2Vsc2UKKwlleHRlcm4gaW50CWRncnNfZmlybW51bTsKKwlleHRlcm4gY2hhcglkZ3JzX2Zpcm12ZXJbXTsKKwlleHRlcm4gY2hhcglkZ3JzX2Zpcm1kYXRlW107CisJZXh0ZXJuIHVjaGFyCWRncnNfY29kZVtdOworCWV4dGVybiBpbnQJZGdyc19uY29kZTsKKyNlbmRpZgorCisvKgorICoJTGludXggb3V0KigpIGlzIGJhY2t3YXJkcyBmcm9tIGFsbCBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcworICovCisjZGVmaW5lCU9VVEIoQUREUiwgVkFMKQlvdXRiKFZBTCwgQUREUikKKyNkZWZpbmUJT1VUVyhBRERSLCBWQUwpCW91dHcoVkFMLCBBRERSKQorI2RlZmluZQlPVVRMKEFERFIsIFZBTCkJb3V0bChWQUwsIEFERFIpCisKKy8qCisgKglNYWNyb3MgdG8gY29udmVydCBzd2l0Y2ggdG8gaG9zdCBhbmQgaG9zdCB0byBzd2l0Y2ggYWRkcmVzc2VzCisgKgkoYXNzdW1lcyBhIGxvY2FsIHZhcmlhYmxlIHByaXYgcG9pbnRzIHRvIGJvYXJkIGRlcGVuZGVudCBzdHJ1Y3QpCisgKi8KKyNkZWZpbmUJUzJIKEEpCSggKCh1bnNpZ25lZCBsb25nKShBKSYweDAwZmZmZmZmKSArIHByaXYwLT52bWVtICkKKyNkZWZpbmUJUzJITihBKQkoICgodW5zaWduZWQgbG9uZykoQSkmMHgwMGZmZmZmZikgKyBwcml2Ti0+dm1lbSApCisjZGVmaW5lCUgyUyhBKQkoICgoY2hhciAqKSAoQSkgLSBwcml2MC0+dm1lbSkgKyAweEEzMDAwMDAwICkKKworLyoKKyAqCUNvbnZlcnQgYSBzd2l0Y2ggYWRkcmVzcyB0byBhICJzYWZlIiBhZGRyZXNzIGZvciB1c2Ugd2l0aCB0aGUKKyAqCVBMWCA5MDYwIERNQSByZWdpc3RlcnMgYW5kIHRoZSBhc3NvY2lhdGVkIEhXIGtsdWRnZSB0aGF0IGFsbG93cworICoJZm9yIGhvc3QgYWNjZXNzIG9mIHRoZSBETUEgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lCVMyRE1BKEEpCSggKHVuc2lnbmVkIGxvbmcpKEEpICYgMHgwMGZmZmZmZikKKworLyoKKyAqCSJTcGFjZS5jIiB2YXJpYWJsZXMsIG5vdyBzZXR0YWJsZSBmcm9tIG1vZHVsZSBpbnRlcmZhY2UKKyAqCVVzZSB0aGUgbmFtZSBiZWxvdywgbWludXMgdGhlICJkZ3JzXyIgcHJlZml4LiAgU2VlIGluaXRfbW9kdWxlKCkuCisgKi8KK3N0YXRpYyBpbnQJZGdyc19kZWJ1ZyA9IDE7CitzdGF0aWMgaW50CWRncnNfZG1hID0gMTsKK3N0YXRpYyBpbnQJZGdyc19zcGFudHJlZSA9IC0xOworc3RhdGljIGludAlkZ3JzX2hhc2hleHBpcmUgPSAtMTsKK3N0YXRpYyB1Y2hhcglkZ3JzX2lwYWRkcls0XSA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CitzdGF0aWMgdWNoYXIJZGdyc19pcHRyYXBbNF0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9Oworc3RhdGljIF9fdTMyCWRncnNfaXB4bmV0ID0gLTE7CitzdGF0aWMgaW50CWRncnNfbmljbW9kZTsKKworLyoKKyAqCVByaXZhdGUgcGVyLWJvYXJkIGRhdGEgc3RydWN0dXJlIChkZXYtPnByaXYpCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisJLyoKKwkgKglTdHVmZiBmb3IgZ2VuZXJpYyBldGhlcmNhcmQgSS9GCisJICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisKKwkvKgorCSAqCURHUlMgc3BlY2lmaWMgZGF0YQorCSAqLworCWNoYXIJCSp2bWVtOworCisgICAgICAgIHN0cnVjdCBiaW9zX2NvbW0gKmJjb21tOyAgICAgICAgLyogRmlybXdhcmUgQklPUyBjb21tIHN0cnVjdHVyZSAqLworICAgICAgICBQT1JUICAgICAgICAgICAgKnBvcnQ7ICAgICAgICAgIC8qIFB0ciB0byBQT1JUWzBdIHN0cnVjdCBpbiBWTSAqLworICAgICAgICBJNTk2X1NDQiAgICAgICAgKnNjYnA7ICAgICAgICAgIC8qIFB0ciB0byBTQ0Igc3RydWN0IGluIFZNICovCisgICAgICAgIEk1OTZfUkZEICAgICAgICAqcmZkcDsgICAgICAgICAgLyogQ3VycmVudCBSRkQgbGlzdCAqLworICAgICAgICBJNTk2X1JCRCAgICAgICAgKnJiZHA7ICAgICAgICAgIC8qIEN1cnJlbnQgUkJEIGxpc3QgKi8KKworICAgICAgICB2b2xhdGlsZSBpbnQgICAgaW50cmNudDsgICAgICAgIC8qIENvdW50IG9mIGludGVycnVwdHMgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiAgICAgIFNFLTQgKEVJU0EpIGJvYXJkIHZhcmlhYmxlcworICAgICAgICAgKi8KKyAgICAgICAgdWNoYXIJCWlzX3JlZzsJCS8qIEVJU0E6IFZhbHVlIGZvciBFUzRIX0lTIHJlZyAqLworCisgICAgICAgIC8qCisgICAgICAgICAqICAgICAgU0UtNiAoUENJKSBib2FyZCB2YXJpYWJsZXMKKyAgICAgICAgICoKKyAgICAgICAgICogICAgICBUaGUgUExYICJleHBhbnNpb24gcm9tIiBzcGFjZSBpcyB1c2VkIGZvciBETUEgcmVnaXN0ZXIKKyAgICAgICAgICogICAgICBhY2Nlc3MgZnJvbSB0aGUgaG9zdCBvbiB0aGUgU0UtNi4gIFRoZXNlIGFyZSB0aGUgcGh5c2ljYWwKKyAgICAgICAgICogICAgICBhbmQgdmlydHVhbCBhZGRyZXNzZXMgb2YgdGhhdCBzcGFjZS4KKyAgICAgICAgICovCisgICAgICAgIHVsb25nCQlwbHhyZWc7CQkvKiBQaHlzIGFkZHJlc3Mgb2YgUExYIGNoaXAgKi8KKyAgICAgICAgY2hhciAgICAgICAgICAgICp2cGx4cmVnOwkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgUExYIGNoaXAgKi8KKyAgICAgICAgdWxvbmcJCXBseGRtYTsJCS8qIFBoeXMgYWRkciBvZiBQTFggImV4cGFuc2lvbiByb20iICovCisgICAgICAgIHVsb25nIHZvbGF0aWxlICAqdnBseGRtYTsJLyogVmlydHVhbCBhZGRyIG9mICJleHBhbnNpb24gcm9tIiAqLworICAgICAgICBpbnQgICAgICAgICAgICAgdXNlX2RtYTsgICAgICAgIC8qIEZsYWc6IHVzZSBETUEgKi8KKwlETUFDSEFJTgkqZG1hZGVzY19zOwkvKiBhcmVhIGZvciBETUEgY2hhaW5zIChTVyBhZGRyLikgKi8KKwlETUFDSEFJTgkqZG1hZGVzY19oOwkvKiBhcmVhIGZvciBETUEgY2hhaW5zIChIb3N0IFZpcnR1YWwpICovCisKKwkvKgorCSAqCU11bHRpLU5JQyBtb2RlIHZhcmlhYmxlcworCSAqCisJICoJQWxsIGVudHJpZXMgb2YgdGhlIGRldnRibFtdIGFycmF5IGFyZSB2YWxpZCBmb3IgdGhlIDB0aAorCSAqCWRldmljZSAoaS5lLiBldGgwLCBidXQgbm90IGV0aDEuLi5ldGg1KS4gIGRldnRibFswXSBpcworCSAqCXZhbGlkIGZvciBhbGwgZGV2aWNlcyAoaS5lLiBldGgwLCBldGgxLCAuLi4sIGV0aDUpLgorCSAqLworCWludAkJbnBvcnRzOwkJLyogTnVtYmVyIG9mIHBoeXNpY2FsIHBvcnRzICg0IG9yIDYpICovCisJaW50CQljaGFuOwkJLyogQ2hhbm5lbCAjICgxLTYpIGZvciB0aGlzIGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXZ0YmxbNl07CS8qIFB0cnMgdG8gTiBkZXZpY2Ugc3RydWN0cyAqLworCit9IERHUlNfUFJJVjsKKworCisvKgorICoJcmVzZXQgb3IgdW4tcmVzZXQgdGhlIElEVCBwcm9jZXNzb3IKKyAqLworc3RhdGljIHZvaWQKK3Byb2NfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldjAsIGludCByZXNldCkKK3sKKwlER1JTX1BSSVYJKnByaXYwID0gKERHUlNfUFJJViAqKSBkZXYwLT5wcml2OworCisJaWYgKHByaXYwLT5wbHhyZWcpCisJeworCQl1bG9uZwkJdmFsOworCQl2YWwgPSBpbmwoZGV2MC0+YmFzZV9hZGRyICsgUExYX01JU0NfQ1NSKTsKKwkJaWYgKHJlc2V0KQorCQkJdmFsIHw9IFNFNl9SRVNFVDsKKwkJZWxzZQorCQkJdmFsICY9IH5TRTZfUkVTRVQ7CisJCU9VVEwoZGV2MC0+YmFzZV9hZGRyICsgUExYX01JU0NfQ1NSLCB2YWwpOworCX0KKwllbHNlCisJeworCQlPVVRCKGRldjAtPmJhc2VfYWRkciArIEVTNEhfUEMsIHJlc2V0ID8gRVM0SF9QQ19SRVNFVCA6IDApOworCX0KK30KKworLyoKKyAqCVNlZSBpZiB0aGUgYm9hcmQgc3VwcG9ydHMgYnVzIG1hc3RlciBETUEKKyAqLworc3RhdGljIGludAorY2hlY2tfYm9hcmRfZG1hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYwKQoreworCURHUlNfUFJJVgkqcHJpdjAgPSAoREdSU19QUklWICopIGRldjAtPnByaXY7CisJdWxvbmcJeDsKKworCS8qCisJICoJSWYgU3BhY2UuYyBzYXlzIG5vdCB0byB1c2UgRE1BLCBvciBpZiBpdCdzIG5vdCBhIFBMWCBiYXNlZAorCSAqCVBDSSBib2FyZCwgb3IgaWYgdGhlIGV4cGFuc2lvbiBST00gc3BhY2UgaXMgbm90IFBDSQorCSAqCWNvbmZpZ3VyZWQsIHRoZW4gcmV0dXJuIGZhbHNlLgorCSAqLworCWlmICghZGdyc19kbWEgfHwgIXByaXYwLT5wbHhyZWcgfHwgIXByaXYwLT5wbHhkbWEpCisJCXJldHVybiAoMCk7CisKKwkvKgorCSAqCVNldCB0aGUgbG9jYWwgYWRkcmVzcyByZW1hcCByZWdpc3RlciBvZiB0aGUgImV4cGFuc2lvbiByb20iCisJICoJYXJlYSB0byAweDgwMDAwMDAwIHNvIHRoYXQgd2UgY2FuIHVzZSBpdCB0byBhY2Nlc3MgdGhlIERNQQorCSAqCXJlZ2lzdGVycyBmcm9tIHRoZSBob3N0IHNpZGUuCisJICovCisJT1VUTChkZXYwLT5iYXNlX2FkZHIgKyBQTFhfUk9NX0JBU0VfQUREUiwgMHg4MDAwMDAwMCk7CisKKwkvKgorCSAqIFNldCB0aGUgUENJIHJlZ2lvbiBkZXNjcmlwdG9yIHRvOgorCSAqICAgICAgU3BhY2UgMDoKKwkgKiAgICAgICAgICAgICAgZGlzYWJsZSByZWFkLXByZWZldGNoCisJICogICAgICAgICAgICAgIGVuYWJsZSBSRUFEWQorCSAqICAgICAgICAgICAgICBlbmFibGUgQlVSU1QKKwkgKiAgICAgICAgICAgICAgMCBpbnRlcm5hbCB3YWl0IHN0YXRlcworCSAqICAgICAgRXhwYW5zaW9uIFJPTTogKHVzZWQgZm9yIGhvc3QgRE1BIHJlZ2lzdGVyIGFjY2VzcykKKwkgKiAgICAgICAgICAgICAgZGlzYWJsZSByZWFkLXByZWZldGNoCisJICogICAgICAgICAgICAgIGVuYWJsZSBSRUFEWQorCSAqICAgICAgICAgICAgICBkaXNhYmxlIEJVUlNUCisJICogICAgICAgICAgICAgIDAgaW50ZXJuYWwgd2FpdCBzdGF0ZXMKKwkgKi8KKwlPVVRMKGRldjAtPmJhc2VfYWRkciArIFBMWF9CVVNfUkVHSU9OLCAweDQ5NDMwMzQzKTsKKworCS8qCisJICoJTm93IG1hcCB0aGUgRE1BIHJlZ2lzdGVycyBpbnRvIG91ciB2aXJ0dWFsIHNwYWNlCisJICovCisJcHJpdjAtPnZwbHhkbWEgPSAodWxvbmcgKikgaW9yZW1hcCAocHJpdjAtPnBseGRtYSwgMjU2KTsKKwlpZiAoIXByaXYwLT52cGx4ZG1hKQorCXsKKwkJcHJpbnRrKCIlczogY2FuJ3QgKnJlbWFwKCkgdGhlIERNQSByZWdzXG4iLCBkZXYwLT5uYW1lKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKgorCSAqCU5vdyB0ZXN0IHRvIHNlZSBpZiB3ZSBjYW4gYWNjZXNzIHRoZSBETUEgcmVnaXN0ZXJzCisJICoJSWYgd2Ugd3JpdGUgLTEgYW5kIGdldCBiYWNrIDFGRkYsIHRoZW4gd2UgYWNjZXNzZWQgdGhlCisJICoJRE1BIHJlZ2lzdGVyLiAgT3RoZXJ3aXNlLCB3ZSBwcm9iYWJseSBoYXZlIGFuIG9sZCBib2FyZAorCSAqCWFuZCB3cm90ZSBpbnRvIHJlZ3VsYXIgUkFNLgorCSAqLworCXByaXYwLT52cGx4ZG1hW1BMWF9ETUEwX01PREUvNF0gPSAweEZGRkZGRkZGOworCXggPSBwcml2MC0+dnBseGRtYVtQTFhfRE1BMF9NT0RFLzRdOworCWlmICh4ICE9IDB4MDAwMDFGRkYpIHsKKwkJaW91bm1hcCgodm9pZCAqKXByaXYwLT52cGx4ZG1hKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlyZXR1cm4gKDEpOworfQorCisvKgorICoJSW5pdGlhdGUgRE1BIHVzaW5nIFBMWCBwYXJ0IG9uIFBDSSBib2FyZC4gIFNwaW4gdGhlCisgKglwcm9jZXNzb3IgdW50aWwgY29tcGxldGVkLiAgQWxsIGFkZHJlc3NlcyBhcmUgcGh5c2ljYWwhCisgKgorICoJSWYgcGNpYWRkciBpcyBOVUxMLCB0aGVuIGl0J3MgYSBjaGFpbmluZyBETUEsIGFuZCBsY2xhZGRyIGlzCisgKgl0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgRE1BIGRlc2NyaXB0b3IgaW4gdGhlIGNoYWluLgorICoKKyAqCUlmIHBjaWFkZHIgaXMgbm90IE5VTEwsIHRoZW4gaXQncyBhIHNpbmdsZSBETUEuCisgKgorICoJSW4gZWl0aGVyIGNhc2UsICJsY2xhZGRyIiBtdXN0IGhhdmUgYmVlbiBmaXhlZCB1cCB0byBtYWtlCisgKglzdXJlIHRoZSBNU0IgaXNuJ3Qgc2V0IHVzaW5nIHRoZSBTMkRNQSBtYWNybyBiZWZvcmUgcGFzc2luZworICoJdGhlIGFkZHJlc3MgdG8gdGhpcyByb3V0aW5lLgorICovCitzdGF0aWMgaW50Citkb19wbHhfZG1hKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdWxvbmcgcGNpYWRkciwKKwl1bG9uZyBsY2xhZGRyLAorCWludCBsZW4sCisJaW50IHRvX2hvc3QKKykKK3sKKyAgICAgICAgaW50ICAgICAJaTsKKyAgICAgICAgdWxvbmcgICAJY3NyID0gMDsKKwlER1JTX1BSSVYJKnByaXYgPSAoREdSU19QUklWICopIGRldi0+cHJpdjsKKworCWlmIChwY2lhZGRyKQorCXsKKwkJLyoKKwkJICoJRG8gYSBzaW5nbGUsIG5vbi1jaGFpbiBETUEKKwkJICovCisJCXByaXYtPnZwbHhkbWFbUExYX0RNQTBfUENJX0FERFIvNF0gPSBwY2lhZGRyOworCQlwcml2LT52cGx4ZG1hW1BMWF9ETUEwX0xDTF9BRERSLzRdID0gbGNsYWRkcjsKKwkJcHJpdi0+dnBseGRtYVtQTFhfRE1BMF9TSVpFLzRdID0gbGVuOworCQlwcml2LT52cGx4ZG1hW1BMWF9ETUEwX0RFU0NSSVBUT1IvNF0gPSB0b19ob3N0CisJCQkJCT8gUExYX0RNQV9ERVNDX1RPX0hPU1QKKwkJCQkJOiBQTFhfRE1BX0RFU0NfVE9fQk9BUkQ7CisJCXByaXYtPnZwbHhkbWFbUExYX0RNQTBfTU9ERS80XSA9CisJCQkJCSAgUExYX0RNQV9NT0RFX1dJRFRIMzIKKwkJCQkJfCBQTFhfRE1BX01PREVfV0FJVFNUQVRFUygwKQorCQkJCQl8IFBMWF9ETUFfTU9ERV9SRUFEWQorCQkJCQl8IFBMWF9ETUFfTU9ERV9OT0JURVJNCisJCQkJCXwgUExYX0RNQV9NT0RFX0JVUlNUCisJCQkJCXwgUExYX0RNQV9NT0RFX05PQ0hBSU47CisJfQorCWVsc2UKKwl7CisJCS8qCisJCSAqCURvIGEgY2hhaW5pbmcgRE1BCisJCSAqLworCQlwcml2LT52cGx4ZG1hW1BMWF9ETUEwX01PREUvNF0gPQorCQkJCQkgIFBMWF9ETUFfTU9ERV9XSURUSDMyCisJCQkJCXwgUExYX0RNQV9NT0RFX1dBSVRTVEFURVMoMCkKKwkJCQkJfCBQTFhfRE1BX01PREVfUkVBRFkKKwkJCQkJfCBQTFhfRE1BX01PREVfTk9CVEVSTQorCQkJCQl8IFBMWF9ETUFfTU9ERV9CVVJTVAorCQkJCQl8IFBMWF9ETUFfTU9ERV9DSEFJTjsKKwkJcHJpdi0+dnBseGRtYVtQTFhfRE1BMF9ERVNDUklQVE9SLzRdID0gbGNsYWRkcjsKKwl9CisKKwlwcml2LT52cGx4ZG1hW1BMWF9ETUFfQ1NSLzRdID0KKwkJCQlQTFhfRE1BX0NTUl8wX0VOQUJMRSB8IFBMWF9ETUFfQ1NSXzBfU1RBUlQ7CisKKyAgICAgICAgLyoKKwkgKglXYWl0IGZvciBETUEgdG8gY29tcGxldGUKKwkgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMDAwMDA7ICsraSkKKyAgICAgICAgeworCQkvKgorCQkgKglTcGluIHRoZSBob3N0IENQVSBmb3IgMSB1c2VjLCBzbyB3ZSBkb24ndCB0aHJhc2gKKwkJICoJdGhlIFBDSSBidXMgd2hpbGUgdGhlIFBMWCA5MDYwIGlzIGRvaW5nIERNQS4KKwkJICovCisJCXVkZWxheSgxKTsKKworCQljc3IgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZykgcHJpdi0+dnBseGRtYVtQTFhfRE1BX0NTUi80XTsKKworICAgICAgICAgICAgICAgIGlmIChjc3IgJiBQTFhfRE1BX0NTUl8wX0RPTkUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggISAoY3NyICYgUExYX0RNQV9DU1JfMF9ET05FKSApCisgICAgICAgIHsKKwkJcHJpbnRrKCIlczogRE1BIGRvbmUgbmV2ZXIgb2NjdXJyZWQuIERNQSBkaXNhYmxlZC5cbiIsCisJCQlkZXYtPm5hbWUpOworCQlwcml2LT51c2VfZG1hID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKK30KKworLyoKKyAqCWRncnNfcmN2X2ZyYW1lKCkKKyAqCisgKglQcm9jZXNzIGEgcmVjZWl2ZWQgZnJhbWUuICBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBpbnRlcnJ1cHQKKyAqCXJvdXRpbmUsIGFuZCB3b3JrcyBmb3IgYm90aCBzd2l0Y2ggbW9kZSBhbmQgbXVsdGktTklDIG1vZGUuCisgKgorICoJTm90ZSB0aGF0IHdoZW4gaW4gbXVsdGktTklDIG1vZGUsIHdlIHdhbnQgdG8gYWx3YXlzIGFjY2VzcyB0aGUKKyAqCWhhcmR3YXJlIHVzaW5nIHRoZSBkZXYgYW5kIHByaXYgc3RydWN0dXJlcyBvZiB0aGUgZmlyc3QgcG9ydCwKKyAqCXNvIHRoYXQgd2UgYXJlIHVzaW5nIG9ubHkgb25lIHNldCBvZiB2YXJpYWJsZXMgdG8gbWFpbnRhaW4KKyAqCXRoZSBib2FyZCBpbnRlcmZhY2Ugc3RhdHVzLCBidXQgd2Ugd2FudCB0byB1c2UgdGhlIE50aCBwb3J0CisgKglkZXYgYW5kIHByaXYgc3RydWN0dXJlcyB0byBtYWludGFpbiBzdGF0aXN0aWNzIGFuZCB0byBwYXNzCisgKgl0aGUgcGFja2V0IHVwLgorICoKKyAqCU9ubHkgdGhlIGZpcnN0IGRldmljZSBzdHJ1Y3R1cmUgaXMgYXR0YWNoZWQgdG8gdGhlIGludGVycnVwdC4KKyAqCVdlIHVzZSB0aGUgc3BlY2lhbCAiY2hhbiIgdmFyaWFibGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlyc3QgUkJECisgKgl0byBzZWxlY3QgdGhlIE50aCBkZXZpY2UgaW4gbXVsdGktTklDIG1vZGUuCisgKgorICoJV2UgY3VycmVudGx5IGRvIGNoYWluZWQgRE1BIG9uIGEgcGVyLXBhY2tldCBiYXNpcyB3aGVuIHRoZQorICoJcGFja2V0IGlzICJsb25nIiwgYW5kIHdlIHNwaW4gdGhlIENQVSBhIHNob3J0IHRpbWUgcG9sbGluZworICoJZm9yIERNQSBjb21wbGV0aW9uLiAgVGhpcyBhdm9pZHMgYSBzZWNvbmQgaW50ZXJydXB0IG92ZXJoZWFkLAorICoJYW5kIGdpdmVzIHRoZSBiZXN0IHBlcmZvcm1hbmNlIGZvciBsaWdodCB0cmFmZmljIHRvIHRoZSBob3N0LgorICoKKyAqCUhvd2V2ZXIsIGEgYmV0dGVyIHNjaGVtZSB0aGF0IGNvdWxkIGJlIGltcGxlbWVudGVkIHdvdWxkIGJlCisgKgl0byBzZWUgaG93IG1hbnkgcGFja2V0cyBhcmUgb3V0c3RhbmRpbmcgZm9yIHRoZSBob3N0LCBhbmQgaWYKKyAqCXRoZSBudW1iZXIgaXMgImxhcmdlIiwgY3JlYXRlIGEgbG9uZyBjaGFpbiB0byBETUEgc2V2ZXJhbAorICoJcGFja2V0cyBpbnRvIHRoZSBob3N0IGluIG9uZSBnby4gIEluIHRoaXMgY2FzZSwgd2Ugd291bGQgc2V0CisgKgl1cCBzb21lIHN0YXRlIHZhcmlhYmxlcyB0byBsZXQgdGhlIGhvc3QgQ1BVIGNvbnRpbnVlIGRvaW5nCisgKglvdGhlciB0aGluZ3MgdW50aWwgYSBETUEgY29tcGxldGlvbiBpbnRlcnJ1cHQgY29tZXMgYWxvbmcuCisgKi8KK3N0YXRpYyB2b2lkCitkZ3JzX3Jjdl9mcmFtZSgKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2MCwKKwlER1JTX1BSSVYJKnByaXYwLAorCUk1OTZfQ0IJCSpjYnAKKykKK3sKKwlpbnQJCWxlbjsKKwlJNTk2X1RCRAkqdGJkcDsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCXVjaGFyCQkqcHV0cDsKKwl1Y2hhcgkJKnA7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldk47CisJREdSU19QUklWCSpwcml2TjsKKworCS8qCisJICoJRGV0ZXJtaW5lIE50aCBwcml2IGFuZCBkZXYgc3RydWN0dXJlIHBvaW50ZXJzCisJICovCisJaWYgKGRncnNfbmljbW9kZSkKKwl7CS8qIE11bHRpLU5JQyBtb2RlICovCisJCWludCBjaGFuID0gKChJNTk2X1JCRCAqKSBTMkgoY2JwLT54bWl0LnRiZHApKS0+Y2hhbjsKKworCQlkZXZOID0gcHJpdjAtPmRldnRibFtjaGFuLTFdOworCQkvKgorCQkgKiBJZiBkZXZOIGlzIG51bGwsIHdlIGdvdCBhbiBpbnRlcnJ1cHQgYmVmb3JlIHRoZSBJL0YKKwkJICogaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICBQaXRjaCB0aGUgcGFja2V0LgorCQkgKi8KKwkJaWYgKGRldk4gPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCQlwcml2TiA9IChER1JTX1BSSVYgKikgZGV2Ti0+cHJpdjsKKwl9CisJZWxzZQorCXsJLyogU3dpdGNoIG1vZGUgKi8KKwkJZGV2TiA9IGRldjA7CisJCXByaXZOID0gcHJpdjA7CisJfQorCisJaWYgKDApIHByaW50aygiJXM6IHJjdiBsZW49JWxkXG4iLCBkZXZOLT5uYW1lLCBjYnAtPnhtaXQuY291bnQpOworCisJLyoKKwkgKglBbGxvY2F0ZSBhIG1lc3NhZ2UgYmxvY2sgYmlnIGVub3VnaCB0byBob2xkIHRoZSB3aG9sZSBmcmFtZQorCSAqLworCWxlbiA9IGNicC0+eG1pdC5jb3VudDsKKwlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IobGVuKzUpKSA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKCIlczogZGV2X2FsbG9jX3NrYiBmYWlsZWQgZm9yIHJjdiBidWZmZXJcbiIsIGRldk4tPm5hbWUpOworCQkrK3ByaXZOLT5zdGF0cy5yeF9kcm9wcGVkOworCQkvKiBkaXNjYXJkaW5nIHRoZSBmcmFtZSAqLworCQlnb3RvIG91dDsKKwl9CisJc2tiLT5kZXYgPSBkZXZOOworCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIGhlYWRlciAqLworCithZ2FpbjoKKwlwdXRwID0gcCA9IHNrYl9wdXQoc2tiLCBsZW4pOworCisJLyoKKwkgKglUaGVyZSBhcmUgdGhyZWUgbW9kZXMgaGVyZSBmb3IgZG9pbmcgdGhlIHBhY2tldCBjb3B5LgorCSAqCUlmIHdlIGhhdmUgRE1BLCBhbmQgdGhlIHBhY2tldCBpcyAibG9uZyIsIHdlIHVzZSB0aGUKKwkgKgljaGFpbmluZyBtb2RlIG9mIERNQS4gIElmIGl0J3Mgc2hvcnRlciwgd2UgdXNlIHNpbmdsZQorCSAqCURNQSdzLiAgT3RoZXJ3aXNlLCB3ZSB1c2UgbWVtY3B5KCkuCisJICovCisJaWYgKHByaXYwLT51c2VfZG1hICYmIHByaXYwLT5kbWFkZXNjX2ggJiYgbGVuID4gNjQpCisJeworCQkvKgorCQkgKglJZiB3ZSBjYW4gdXNlIERNQSBhbmQgaXQncyBhIGxvbmcgZnJhbWUsIGNvcHkgaXQgdXNpbmcKKwkJICoJRE1BIGNoYWluaW5nLgorCQkgKi8KKwkJRE1BQ0hBSU4JKmRkcF9oOwkvKiBIb3N0IHZpcnR1YWwgRE1BIGRlc2MuIHBvaW50ZXIgKi8KKwkJRE1BQ0hBSU4JKmRkcF9zOwkvKiBTd2l0Y2ggcGh5c2ljYWwgRE1BIGRlc2MuIHBvaW50ZXIgKi8KKwkJdWNoYXIJCSpwaHlzX3A7CisKKwkJLyoKKwkJICoJR2V0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBTVFJFQU1TIGJ1ZmZlci4KKwkJICoJTk9URTogYWxsb2NiKCkgZ3VhcmFudGVlcyB0aGF0IHRoZSB3aG9sZSBidWZmZXIKKwkJICoJaXMgaW4gYSBzaW5nbGUgcGFnZSBpZiB0aGUgbGVuZ3RoIDwgNDA5Ni4KKwkJICovCisJCXBoeXNfcCA9ICh1Y2hhciAqKSB2aXJ0X3RvX3BoeXMocHV0cCk7CisKKwkJZGRwX2ggPSBwcml2MC0+ZG1hZGVzY19oOworCQlkZHBfcyA9IHByaXYwLT5kbWFkZXNjX3M7CisJCXRiZHAgPSAoSTU5Nl9UQkQgKikgUzJIKGNicC0+eG1pdC50YmRwKTsKKwkJZm9yICg7OykKKwkJeworCQkJaW50CWNvdW50OworCQkJaW50CWFtdDsKKworCQkJY291bnQgPSB0YmRwLT5jb3VudDsKKwkJCWFtdCA9IGNvdW50ICYgMHgzZmZmOworCQkJaWYgKGFtdCA9PSAwKQorCQkJCWJyZWFrOyAvKiBGb3Igc2FmZXR5ICovCisJCQlpZiAoIChwLXB1dHApID49IGxlbikKKwkJCXsKKwkJCQlwcmludGsoIiVzOiBjYnAgPSAlbHhcbiIsIGRldk4tPm5hbWUsIChsb25nKSBIMlMoY2JwKSk7CisJCQkJcHJvY19yZXNldChkZXYwLCAxKTsJLyogRnJlZXplIElEVCAqLworCQkJCWJyZWFrOyAvKiBGb3IgU2FmZXR5ICovCisJCQl9CisKKwkJCWRkcF9oLT5wY2lhZGRyID0gKHVsb25nKSBwaHlzX3A7CisJCQlkZHBfaC0+bGNsYWRkciA9IFMyRE1BKHRiZHAtPmJ1Zik7CisJCQlkZHBfaC0+bGVuID0gYW10OworCisJCQlwaHlzX3AgKz0gYW10OworCQkJcCArPSBhbXQ7CisKKwkJCWlmIChjb3VudCAmIEk1OTZfVEJEX0VPRikKKwkJCXsKKwkJCQlkZHBfaC0+bmV4dCA9IFBMWF9ETUFfREVTQ19UT19IT1NUCisJCQkJCQl8IFBMWF9ETUFfREVTQ19FT0M7CisJCQkJKytkZHBfaDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkrK2RkcF9zOworCQkJCWRkcF9oLT5uZXh0ID0gUExYX0RNQV9ERVNDX1RPX0hPU1QKKwkJCQkJCXwgKHVsb25nKSBkZHBfczsKKwkJCQl0YmRwID0gKEk1OTZfVEJEICopIFMySCh0YmRwLT5uZXh0KTsKKwkJCQkrK2RkcF9oOworCQkJfQorCQl9CisJCWlmIChkZHBfaCAtIHByaXYwLT5kbWFkZXNjX2gpCisJCXsKKwkJCWludAlyYzsKKworCQkJcmMgPSBkb19wbHhfZG1hKGRldjAsCisJCQkJMCwgKHVsb25nKSBwcml2MC0+ZG1hZGVzY19zLCBsZW4sIDApOworCQkJaWYgKHJjKQorCQkJeworCQkJCXByaW50aygiJXM6IENoYWluZWQgRE1BIGZhaWx1cmVcbiIsIGRldk4tPm5hbWUpOworCQkJCWdvdG8gYWdhaW47CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAocHJpdjAtPnVzZV9kbWEpCisJeworCQkvKgorCQkgKglJZiB3ZSBjYW4gdXNlIERNQSBhbmQgaXQncyBhIHNob3J0ZXIgZnJhbWUsIGNvcHkgaXQKKwkJICoJdXNpbmcgc2luZ2xlIERNQSB0cmFuc2ZlcnMuCisJCSAqLworCQl1Y2hhcgkJKnBoeXNfcDsKKworCQkvKgorCQkgKglHZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFNUUkVBTVMgYnVmZmVyLgorCQkgKglOT1RFOiBhbGxvY2IoKSBndWFyYW50ZWVzIHRoYXQgdGhlIHdob2xlIGJ1ZmZlcgorCQkgKglpcyBpbiBhIHNpbmdsZSBwYWdlIGlmIHRoZSBsZW5ndGggPCA0MDk2LgorCQkgKi8KKwkJcGh5c19wID0gKHVjaGFyICopIHZpcnRfdG9fcGh5cyhwdXRwKTsKKworCQl0YmRwID0gKEk1OTZfVEJEICopIFMySChjYnAtPnhtaXQudGJkcCk7CisJCWZvciAoOzspCisJCXsKKwkJCWludAljb3VudDsKKwkJCWludAlhbXQ7CisJCQlpbnQJcmM7CisKKwkJCWNvdW50ID0gdGJkcC0+Y291bnQ7CisJCQlhbXQgPSBjb3VudCAmIDB4M2ZmZjsKKwkJCWlmIChhbXQgPT0gMCkKKwkJCQlicmVhazsgLyogRm9yIHNhZmV0eSAqLworCQkJaWYgKCAocC1wdXRwKSA+PSBsZW4pCisJCQl7CisJCQkJcHJpbnRrKCIlczogY2JwID0gJWx4XG4iLCBkZXZOLT5uYW1lLCAobG9uZykgSDJTKGNicCkpOworCQkJCXByb2NfcmVzZXQoZGV2MCwgMSk7CS8qIEZyZWV6ZSBJRFQgKi8KKwkJCQlicmVhazsgLyogRm9yIFNhZmV0eSAqLworCQkJfQorCQkJcmMgPSBkb19wbHhfZG1hKGRldjAsICh1bG9uZykgcGh5c19wLAorCQkJCQkJUzJETUEodGJkcC0+YnVmKSwgYW10LCAxKTsKKwkJCWlmIChyYykKKwkJCXsKKwkJCQltZW1jcHkocCwgUzJIKHRiZHAtPmJ1ZiksIGFtdCk7CisJCQkJcHJpbnRrKCIlczogU2luZ2xlIERNQSBmYWlsZWRcbiIsIGRldk4tPm5hbWUpOworCQkJfQorCQkJcGh5c19wICs9IGFtdDsKKwkJCXAgKz0gYW10OworCQkJaWYgKGNvdW50ICYgSTU5Nl9UQkRfRU9GKQorCQkJCWJyZWFrOworCQkJdGJkcCA9IChJNTk2X1RCRCAqKSBTMkgodGJkcC0+bmV4dCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLyoKKwkJICoJT3RoZXJ3aXNlLCBjb3B5IGl0IHBpZWNlIGJ5IHBpZWNlIHVzaW5nIG1lbWNweSgpCisJCSAqLworCQl0YmRwID0gKEk1OTZfVEJEICopIFMySChjYnAtPnhtaXQudGJkcCk7CisJCWZvciAoOzspCisJCXsKKwkJCWludAljb3VudDsKKwkJCWludAlhbXQ7CisKKwkJCWNvdW50ID0gdGJkcC0+Y291bnQ7CisJCQlhbXQgPSBjb3VudCAmIDB4M2ZmZjsKKwkJCWlmIChhbXQgPT0gMCkKKwkJCQlicmVhazsgLyogRm9yIHNhZmV0eSAqLworCQkJaWYgKCAocC1wdXRwKSA+PSBsZW4pCisJCQl7CisJCQkJcHJpbnRrKCIlczogY2JwID0gJWx4XG4iLCBkZXZOLT5uYW1lLCAobG9uZykgSDJTKGNicCkpOworCQkJCXByb2NfcmVzZXQoZGV2MCwgMSk7CS8qIEZyZWV6ZSBJRFQgKi8KKwkJCQlicmVhazsgLyogRm9yIFNhZmV0eSAqLworCQkJfQorCQkJbWVtY3B5KHAsIFMySCh0YmRwLT5idWYpLCBhbXQpOworCQkJcCArPSBhbXQ7CisJCQlpZiAoY291bnQgJiBJNTk2X1RCRF9FT0YpCisJCQkJYnJlYWs7CisJCQl0YmRwID0gKEk1OTZfVEJEICopIFMySCh0YmRwLT5uZXh0KTsKKwkJfQorCX0KKworCS8qCisJICoJUGFzcyB0aGUgZnJhbWUgdG8gdXBwZXIgaGFsZgorCSAqLworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldk4pOworCW5ldGlmX3J4KHNrYik7CisJZGV2Ti0+bGFzdF9yeCA9IGppZmZpZXM7CisJKytwcml2Ti0+c3RhdHMucnhfcGFja2V0czsKKwlwcml2Ti0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCitvdXQ6CisJY2JwLT54bWl0LnN0YXR1cyA9IEk1OTZfQ0JfU1RBVFVTX0MgfCBJNTk2X0NCX1NUQVRVU19PSzsKK30KKworLyoKKyAqCVN0YXJ0IHRyYW5zbWlzc2lvbiBvZiBhIGZyYW1lCisgKgorICoJVGhlIGludGVyZmFjZSB0byB0aGUgYm9hcmQgaXMgc2ltcGxlOiB3ZSBwcmV0ZW5kIHRoYXQgd2UgYXJlCisgKglhIGZpZnRoIDgyNTk2IGV0aGVybmV0IGNvbnRyb2xsZXIgJ3JlY2VpdmluZycgZGF0YSwgYW5kIGNvcHkgdGhlCisgKglkYXRhIGludG8gdGhlIHNhbWUgc3RydWN0dXJlcyB0aGF0IGEgcmVhbCA4MjU5NiB3b3VsZC4gIFRoaXMgd2F5LAorICoJdGhlIGJvYXJkIGZpcm13YXJlIGhhbmRsZXMgdGhlIGhvc3QgJ3BvcnQnIHRoZSBzYW1lIGFzIGFueSBvdGhlci4KKyAqCisgKglOT1RFOiB3ZSBkbyBub3QgdXNlIEJ1cyBtYXN0ZXIgRE1BIGZvciB0aGlzIHJvdXRpbmUuICBUdXJucyBvdXQKKyAqCXRoYXQgaXQgaXMgbm90IG5lZWRlZC4gIFNsYXZlIHdyaXRlcyBvdmVyIHRoZSBQQ0kgYnVzIGFyZSBhYm91dAorICoJYXMgZmFzdCBhcyBETUEsIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBQTFggcGFydCBjYW4gZG8gYnVyc3QKKyAqCXdyaXRlcy4gIFRoZSBzYW1lIGlzIG5vdCB0cnVlIGZvciBkYXRhIGJlaW5nIHJlYWQgZnJvbSB0aGUgYm9hcmQuCisgKgorICoJRm9yIG11bHRpLU5JQyBtb2RlLCB3ZSB0ZWxsIHRoZSBmaXJtd2FyZSB0aGUgZGVzaXJlZCA4MjU5NgorICoJb3V0cHV0IHBvcnQgYnkgc2V0dGluZyB0aGUgc3BlY2lhbCAiZHN0Y2hhbiIgbWVtYmVyIGF0IHRoZQorICoJZW5kIG9mIHRoZSB0cmFkaXRpb25hbCA4MjU5NiBSRkQgc3RydWN0dXJlLgorICovCisKK3N0YXRpYyBpbnQgZGdyc19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZOKQoreworCURHUlNfUFJJVgkqcHJpdk4gPSAoREdSU19QUklWICopIGRldk4tPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjA7CisJREdSU19QUklWCSpwcml2MDsKKwlJNTk2X1JCRAkqcmJkcDsKKwlpbnQJCWNvdW50OworCWludAkJaSwgbGVuLCBhbXQ7CisKKwkvKgorCSAqCURldGVybWluZSAwdGggcHJpdiBhbmQgZGV2IHN0cnVjdHVyZSBwb2ludGVycworCSAqLworCWlmIChkZ3JzX25pY21vZGUpCisJeworCQlkZXYwID0gcHJpdk4tPmRldnRibFswXTsKKwkJcHJpdjAgPSAoREdSU19QUklWICopIGRldjAtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCWRldjAgPSBkZXZOOworCQlwcml2MCA9IHByaXZOOworCX0KKworCWlmIChkZ3JzX2RlYnVnID4gMSkKKwkJcHJpbnRrKCIlczogeG1pdCBsZW49JWRcbiIsIGRldk4tPm5hbWUsIChpbnQpIHNrYi0+bGVuKTsKKworCWRldk4tPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXZOKTsKKworCWlmIChwcml2MC0+cmZkcC0+Y21kICYgSTU5Nl9SRkRfRUwpCisJewkvKiBPdXQgb2YgUkZEJ3MgKi8KKwkJaWYgKDApIHByaW50aygiJXM6IE5PIFJGRCdzXG4iLCBkZXZOLT5uYW1lKTsKKwkJZ290byBub19yZXNvdXJjZXM7CisJfQorCisJcmJkcCA9IHByaXYwLT5yYmRwOworCWNvdW50ID0gMDsKKwlwcml2MC0+cmZkcC0+cmJkcCA9IChJNTk2X1JCRCAqKSBIMlMocmJkcCk7CisKKwlpID0gMDsgbGVuID0gc2tiLT5sZW47CisJZm9yICg7OykKKwl7CisJCWlmIChyYmRwLT5zaXplICYgSTU5Nl9SQkRfRUwpCisJCXsJLyogT3V0IG9mIFJCRCdzICovCisJCQlpZiAoMCkgcHJpbnRrKCIlczogTk8gUkJEJ3NcbiIsIGRldk4tPm5hbWUpOworCQkJZ290byBub19yZXNvdXJjZXM7CisJCX0KKworCQlhbXQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgcmJkcC0+c2l6ZSAtIGNvdW50KTsKKwkJbWVtY3B5KCAoY2hhciAqKSBTMkgocmJkcC0+YnVmKSArIGNvdW50LCBza2ItPmRhdGEgKyBpLCBhbXQpOworCQlpICs9IGFtdDsKKwkJY291bnQgKz0gYW10OworCQlsZW4gLT0gYW10OworCQlpZiAobGVuID09IDApCisJCXsKKwkJCWlmIChza2ItPmxlbiA8IDYwKQorCQkJCXJiZHAtPmNvdW50ID0gNjAgfCBJNTk2X1JCRF9FT0Y7CisJCQllbHNlCisJCQkJcmJkcC0+Y291bnQgPSBjb3VudCB8IEk1OTZfUkJEX0VPRjsKKwkJCXJiZHAgPSAoSTU5Nl9SQkQgKikgUzJIKHJiZHAtPm5leHQpOworCQkJZ290byBmcmFtZV9kb25lOworCQl9CisJCWVsc2UgaWYgKGNvdW50IDwgMzIpCisJCXsKKwkJCS8qIE1vcmUgZGF0YSB0byBjb21lLCBidXQgd2UgdXNlZCBsZXNzIHRoYW4gMzIKKwkJCSAqIGJ5dGVzIG9mIHRoaXMgUkJELiAgS2VlcCBmaWxsaW5nIHRoaXMgUkJELgorCQkJICovCisJCQl7fQkvKiBZZXMsIHdlIGRvIG5vdGhpbmcgaGVyZSAqLworCQl9CisJCWVsc2UKKwkJeworCQkJcmJkcC0+Y291bnQgPSBjb3VudDsKKwkJCXJiZHAgPSAoSTU5Nl9SQkQgKikgUzJIKHJiZHAtPm5leHQpOworCQkJY291bnQgPSAwOworCQl9CisJfQorCitmcmFtZV9kb25lOgorCXByaXYwLT5yYmRwID0gcmJkcDsKKwlpZiAoZGdyc19uaWNtb2RlKQorCQlwcml2MC0+cmZkcC0+ZHN0Y2hhbiA9IHByaXZOLT5jaGFuOworCXByaXYwLT5yZmRwLT5zdGF0dXMgPSBJNTk2X1JGRF9DIHwgSTU5Nl9SRkRfT0s7CisJcHJpdjAtPnJmZHAgPSAoSTU5Nl9SRkQgKikgUzJIKHByaXYwLT5yZmRwLT5uZXh0KTsKKworCSsrcHJpdk4tPnN0YXRzLnR4X3BhY2tldHM7CisKKwlkZXZfa2ZyZWVfc2tiIChza2IpOworCXJldHVybiAoMCk7CisKK25vX3Jlc291cmNlczoKKwlwcml2MC0+c2NicC0+c3RhdHVzIHw9IEk1OTZfU0NCX1JOUjsJLyogc2ltdWxhdGUgSTgyNTk2ICovCisJcmV0dXJuICgtRUFHQUlOKTsKK30KKworLyoKKyAqCU9wZW4gdGhlIGludGVyZmFjZQorICovCitzdGF0aWMgaW50CitkZ3JzX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqCUNsb3NlIHRoZSBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBkZ3JzX2Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqCUdldCBzdGF0aXN0aWNzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZGdyc19nZXRfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCURHUlNfUFJJVgkqcHJpdiA9IChER1JTX1BSSVYgKikgZGV2LT5wcml2OworCisJcmV0dXJuICgmcHJpdi0+c3RhdHMpOworfQorCisvKgorICoJU2V0IG11bHRpY2FzdCBsaXN0IGFuZC9vciBwcm9taXNjdW91cyBtb2RlCisgKi8KKworc3RhdGljIHZvaWQgZGdyc19zZXRfbXVsdGljYXN0X2xpc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJREdSU19QUklWCSpwcml2ID0gKERHUlNfUFJJViAqKSBkZXYtPnByaXY7CisKKwlwcml2LT5wb3J0LT5pc19wcm9taXNjID0gKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyAxIDogMDsKK30KKworLyoKKyAqCVVuaXF1ZSBpb2N0bCdzCisgKi8KK3N0YXRpYyBpbnQgZGdyc19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2Tiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJREdSU19QUklWCSpwcml2TiA9IChER1JTX1BSSVYgKikgZGV2Ti0+cHJpdjsKKwlER1JTX0lPQ1RMCWlvYzsKKwlpbnQJCWk7CisKKwlpZiAoY21kICE9IERHUlNJT0NUTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZihjb3B5X2Zyb21fdXNlcigmaW9jLCBpZnItPmlmcl9kYXRhLCBzaXplb2YoREdSU19JT0NUTCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoaW9jLmNtZCkKKwl7CisJCWNhc2UgREdSU19HRVRNRU06CisJCQlpZiAoaW9jLmxlbiAhPSBzaXplb2YodWxvbmcpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYoY29weV90b191c2VyKGlvYy5kYXRhLCAmZGV2Ti0+bWVtX3N0YXJ0LCBpb2MubGVuKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAoMCk7CisJCWNhc2UgREdSU19TRVRGSUxURVI6CisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCWlmIChpb2MucG9ydCA+IHByaXZOLT5iY29tbS0+YmNfbnBvcnRzKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGlvYy5maWx0ZXIgPj0gTkZJTFRFUlMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoaW9jLmxlbiA+IHByaXZOLT5iY29tbS0+YmNfZmlsdGVyX2FyZWFfbGVuKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkvKiBXYWl0IGZvciBvbGQgY29tbWFuZCB0byBmaW5pc2ggKi8KKwkJCWZvciAoaSA9IDA7IGkgPCAxMDAwOyArK2kpCisJCQl7CisJCQkJaWYgKCAodm9sYXRpbGUgbG9uZykgcHJpdk4tPmJjb21tLT5iY19maWx0ZXJfY21kIDw9IDAgKQorCQkJCQlicmVhazsKKwkJCQl1ZGVsYXkoMSk7CisJCQl9CisJCQlpZiAoaSA+PSAxMDAwKQorCQkJCXJldHVybiAtRUlPOworCisJCQlwcml2Ti0+YmNvbW0tPmJjX2ZpbHRlcl9wb3J0ID0gaW9jLnBvcnQ7CisJCQlwcml2Ti0+YmNvbW0tPmJjX2ZpbHRlcl9udW0gPSBpb2MuZmlsdGVyOworCQkJcHJpdk4tPmJjb21tLT5iY19maWx0ZXJfbGVuID0gaW9jLmxlbjsKKwkKKwkJCWlmIChpb2MubGVuKQorCQkJeworCQkJCWlmKGNvcHlfZnJvbV91c2VyKFMySE4ocHJpdk4tPmJjb21tLT5iY19maWx0ZXJfYXJlYSksCisJCQkJCWlvYy5kYXRhLCBpb2MubGVuKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcHJpdk4tPmJjb21tLT5iY19maWx0ZXJfY21kID0gQkNfRklMVEVSX1NFVDsKKwkJCX0KKwkJCWVsc2UKKwkJCQlwcml2Ti0+YmNvbW0tPmJjX2ZpbHRlcl9jbWQgPSBCQ19GSUxURVJfQ0xSOworCQkJcmV0dXJuKDApOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworLyoKKyAqCVByb2Nlc3MgaW50ZXJydXB0cworICoKKyAqCWRldiwgcHJpdiB3aWxsIGFsd2F5cyByZWZlciB0byB0aGUgMHRoIGRldmljZSBpbiBNdWx0aS1OSUMgbW9kZS4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgZGdyc19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjAgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCURHUlNfUFJJVgkqcHJpdjAgPSAoREdSU19QUklWICopIGRldjAtPnByaXY7CisJSTU5Nl9DQgkJKmNicDsKKwlpbnQJCWNtZDsKKwlpbnQJCWk7CisKKwkrK3ByaXYwLT5pbnRyY250OworCWlmICgxKSArK3ByaXYwLT5iY29tbS0+YmNfY250WzRdOworCWlmICgwKQorCXsKKwkJc3RhdGljIGludCBjbnQgPSAxMDA7CisJCWlmICgtLWNudCA+IDApCisJCXByaW50aygiJXM6IGludGVycnVwdDogaXJxICVkXG4iLCBkZXYwLT5uYW1lLCBpcnEpOworCX0KKworCS8qCisJICoJR2V0IDU5NiBjb21tYW5kCisJICovCisJY21kID0gcHJpdjAtPnNjYnAtPmNtZDsKKworCS8qCisJICoJU2VlIGlmIFJVIGhhcyBiZWVuIHJlc3RhcnRlZAorCSAqLworCWlmICggKGNtZCAmIEk1OTZfU0NCX1JVQykgPT0gSTU5Nl9TQ0JfUlVDX1NUQVJUKQorCXsKKwkJaWYgKDApIHByaW50aygiJXM6IFJVQyBzdGFydFxuIiwgZGV2MC0+bmFtZSk7CisJCXByaXYwLT5yZmRwID0gKEk1OTZfUkZEICopIFMySChwcml2MC0+c2NicC0+cmZkcCk7CisJCXByaXYwLT5yYmRwID0gKEk1OTZfUkJEICopIFMySChwcml2MC0+cmZkcC0+cmJkcCk7CisJCXByaXYwLT5zY2JwLT5zdGF0dXMgJj0gfihJNTk2X1NDQl9STlJ8STU5Nl9TQ0JfUlVTKTsKKwkJLyoKKwkJICogVGVsbCB1cHBlciBoYWxmIChoYWx2ZXMpCisJCSAqLworCQlpZiAoZGdyc19uaWNtb2RlKQorCQl7CisJCQlmb3IgKGkgPSAwOyBpIDwgcHJpdjAtPm5wb3J0czsgKytpKQorCQkJCW5ldGlmX3dha2VfcXVldWUgKHByaXYwLT5kZXZ0YmxbaV0pOworCQl9CisJCWVsc2UKKwkJCW5ldGlmX3dha2VfcXVldWUgKGRldjApOworCQkvKiBpZiAoYmQtPmZsYWdzICYgVFhfUVVFVUVEKQorCQkJRExfc2NoZWQoYmQsIGJkZCk7ICovCisJfQorCisJLyoKKwkgKglTZWUgaWYgYW55IENVIGNvbW1hbmRzIHRvIHByb2Nlc3MKKwkgKi8KKwlpZiAoIChjbWQgJiBJNTk2X1NDQl9DVUMpICE9IEk1OTZfU0NCX0NVQ19TVEFSVCkKKwl7CisJCXByaXYwLT5zY2JwLT5jbWQgPSAwOwkvKiBJZ25vcmUgYWxsIG90aGVyIGNvbW1hbmRzICovCisJCWdvdG8gYWNrX2ludHI7CisJfQorCXByaXYwLT5zY2JwLT5zdGF0dXMgJj0gfihJNTk2X1NDQl9DTkF8STU5Nl9TQ0JfQ1VTKTsKKworCS8qCisJICoJUHJvY2VzcyBhIGNvbW1hbmQKKwkgKi8KKwljYnAgPSAoSTU5Nl9DQiAqKSBTMkgocHJpdjAtPnNjYnAtPmNicCk7CisJcHJpdjAtPnNjYnAtPmNtZCA9IDA7CS8qIFNhZmUgdG8gY2xlYXIgdGhlIGNvbW1hbmQgKi8KKwlmb3IgKDs7KQorCXsKKwkJc3dpdGNoIChjYnAtPm5vcC5jbWQgJiBJNTk2X0NCX0NNRCkKKwkJeworCQljYXNlIEk1OTZfQ0JfQ01EX1hNSVQ6CisJCQlkZ3JzX3Jjdl9mcmFtZShkZXYwLCBwcml2MCwgY2JwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY2JwLT5ub3Auc3RhdHVzID0gSTU5Nl9DQl9TVEFUVVNfQyB8IEk1OTZfQ0JfU1RBVFVTX09LOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNicC0+bm9wLmNtZCAmIEk1OTZfQ0JfQ01EX0VMKQorCQkJYnJlYWs7CisJCWNicCA9IChJNTk2X0NCICopIFMySChjYnAtPm5vcC5uZXh0KTsKKwl9CisJcHJpdjAtPnNjYnAtPnN0YXR1cyB8PSBJNTk2X1NDQl9DTkE7CisKKwkvKgorCSAqIEFjayB0aGUgaW50ZXJydXB0CisJICovCithY2tfaW50cjoKKwlpZiAocHJpdjAtPnBseHJlZykKKwkJT1VUTChkZXYwLT5iYXNlX2FkZHIgKyBQTFhfTENMMlBDSV9ET09SQkVMTCwgMSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKglEb3dubG9hZCB0aGUgYm9hcmQgZmlybXdhcmUKKyAqLworc3RhdGljIGludCBfX2luaXQgCitkZ3JzX2Rvd25sb2FkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYwKQoreworCURHUlNfUFJJVgkqcHJpdjAgPSAoREdSU19QUklWICopIGRldjAtPnByaXY7CisJaW50CQlpczsKKwl1bnNpZ25lZCBsb25nCWk7CisKKwlzdGF0aWMgaW50CWl2MmlzWzE2XSA9IHsKKwkJCQkwLCAwLCAwLCBFUzRIX0lTX0lOVDMsCisJCQkJMCwgRVM0SF9JU19JTlQ1LCAwLCBFUzRIX0lTX0lOVDcsCisJCQkJMCwgMCwgRVM0SF9JU19JTlQxMCwgRVM0SF9JU19JTlQxMSwKKwkJCQlFUzRIX0lTX0lOVDEyLCAwLCAwLCBFUzRIX0lTX0lOVDE1IH07CisKKwkvKgorCSAqIE1hcCBpbiB0aGUgZHVhbCBwb3J0IG1lbW9yeQorCSAqLworCXByaXYwLT52bWVtID0gaW9yZW1hcChkZXYwLT5tZW1fc3RhcnQsIDIwNDgqMTAyNCk7CisJaWYgKCFwcml2MC0+dm1lbSkKKwl7CisJCXByaW50aygiJXM6IGNhbm5vdCBtYXAgaW4gYm9hcmQgbWVtb3J5XG4iLCBkZXYwLT5uYW1lKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKgorCSAqCUhvbGQgdGhlIHByb2Nlc3NvciBhbmQgY29uZmlndXJlIHRoZSBib2FyZCBhZGRyZXNzZXMKKwkgKi8KKwlpZiAocHJpdjAtPnBseHJlZykKKwl7CS8qIFBDSSBidXMgKi8KKwkJcHJvY19yZXNldChkZXYwLCAxKTsKKwl9CisJZWxzZQorCXsJLyogRUlTQSBidXMgKi8KKwkJaXMgPSBpdjJpc1tkZXYwLT5pcnEgJiAweDBmXTsKKwkJaWYgKCFpcykKKwkJeworCQkJcHJpbnRrKCIlczogSWxsZWdhbCBJUlEgJWRcbiIsIGRldjAtPm5hbWUsIGRldjAtPmlycSk7CisJCQlpb3VubWFwKHByaXYwLT52bWVtKTsKKwkJCXByaXYwLT52bWVtID0gTlVMTDsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKwkJT1VUQihkZXYwLT5iYXNlX2FkZHIgKyBFUzRIX0FTXzMxXzI0LAorCQkJKHVjaGFyKSAoZGV2MC0+bWVtX3N0YXJ0ID4+IDI0KSApOworCQlPVVRCKGRldjAtPmJhc2VfYWRkciArIEVTNEhfQVNfMjNfMTYsCisJCQkodWNoYXIpIChkZXYwLT5tZW1fc3RhcnQgPj4gMTYpICk7CisJCXByaXYwLT5pc19yZWcgPSBFUzRIX0lTX0xJTkVBUiB8IGlzIHwKKwkJCSgodWNoYXIpIChkZXYwLT5tZW1fc3RhcnQgPj4gOCkgJiBFUzRIX0lTX0FTMTUpOworCQlPVVRCKGRldjAtPmJhc2VfYWRkciArIEVTNEhfSVMsIHByaXYwLT5pc19yZWcpOworCQlPVVRCKGRldjAtPmJhc2VfYWRkciArIEVTNEhfRUMsIEVTNEhfRUNfRU5BQkxFKTsKKwkJT1VUQihkZXYwLT5iYXNlX2FkZHIgKyBFUzRIX1BDLCBFUzRIX1BDX1JFU0VUKTsKKwkJT1VUQihkZXYwLT5iYXNlX2FkZHIgKyBFUzRIX01XLCBFUzRIX01XX0VOQUJMRSB8IDB4MDApOworCX0KKworCS8qCisJICoJU2VlIGlmIHdlIGNhbiBkbyBETUEgb24gdGhlIFNFLTYKKwkgKi8KKwlwcml2MC0+dXNlX2RtYSA9IGNoZWNrX2JvYXJkX2RtYShkZXYwKTsKKwlpZiAocHJpdjAtPnVzZV9kbWEpCisJCXByaW50aygiJXM6IEJ1cyBNYXN0ZXIgRE1BIGlzIGVuYWJsZWQuXG4iLCBkZXYwLT5uYW1lKTsKKworCS8qCisJICogTG9hZCBhbmQgdmVyaWZ5IHRoZSBjb2RlIGF0IHRoZSBkZXNpcmVkIGFkZHJlc3MKKwkgKi8KKwltZW1jcHkocHJpdjAtPnZtZW0sIGRncnNfY29kZSwgZGdyc19uY29kZSk7CS8qIExvYWQgY29kZSAqLworCWlmIChtZW1jbXAocHJpdjAtPnZtZW0sIGRncnNfY29kZSwgZGdyc19uY29kZSkpCisJeworCQlpb3VubWFwKHByaXYwLT52bWVtKTsKKwkJcHJpdjAtPnZtZW0gPSBOVUxMOworCQlwcmludGsoIiVzOiBkb3dubG9hZCBjb21wYXJlIGZhaWxlZFxuIiwgZGV2MC0+bmFtZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyoKKwkgKiBDb25maWd1cmFibGVzCisJICovCisJcHJpdjAtPmJjb21tID0gKHN0cnVjdCBiaW9zX2NvbW0gKikgKHByaXYwLT52bWVtICsgMHgwMTAwKTsKKwlwcml2MC0+YmNvbW0tPmJjX25vd2FpdCA9IDE7CS8qIFRlbGwgYm9hcmQgdG8gbWFrZSBwcmludGYgbm90IHdhaXQgKi8KKwlwcml2MC0+YmNvbW0tPmJjX3NxdWVsY2ggPSAwOwkvKiBGbGFnIGZyb20gU3BhY2UuYyAqLworCXByaXYwLT5iY29tbS0+YmNfMTUwb2htID0gMDsJLyogRmxhZyBmcm9tIFNwYWNlLmMgKi8KKworCXByaXYwLT5iY29tbS0+YmNfc3BldyA9IDA7CS8qIERlYnVnIGZsYWcgZnJvbSBTcGFjZS5jICovCisJcHJpdjAtPmJjb21tLT5iY19tYXhyZmQgPSAwOwkvKiBEZWJ1ZyBmbGFnIGZyb20gU3BhY2UuYyAqLworCXByaXYwLT5iY29tbS0+YmNfbWF4cmJkID0gMDsJLyogRGVidWcgZmxhZyBmcm9tIFNwYWNlLmMgKi8KKworCS8qCisJICogVGVsbCBib2FyZCB3ZSBhcmUgb3BlcmF0aW5nIGluIHN3aXRjaCBtb2RlICgxKSBvciBpbgorCSAqIG11bHRpLU5JQyBtb2RlICgyKS4KKwkgKi8KKwlwcml2MC0+YmNvbW0tPmJjX2hvc3QgPSBkZ3JzX25pY21vZGUgPyBCQ19NVUxUSU5JQyA6IEJDX1NXSVRDSDsKKworCS8qCisJICogUmVxdWVzdCBtZW1vcnkgc3BhY2Ugb24gYm9hcmQgZm9yIERNQSBjaGFpbnMKKwkgKi8KKwlpZiAocHJpdjAtPnVzZV9kbWEpCisJCXByaXYwLT5iY29tbS0+YmNfaG9zdGFyZWFfbGVuID0gKDIwNDgvNjQpICogMTY7CisKKwkvKgorCSAqIE5WUkFNIGNvbmZpZ3VyYWJsZXMgZnJvbSBTcGFjZS5jCisJICovCisJcHJpdjAtPmJjb21tLT5iY19zcGFudHJlZSA9IGRncnNfc3BhbnRyZWU7CisJcHJpdjAtPmJjb21tLT5iY19oYXNoZXhwaXJlID0gZGdyc19oYXNoZXhwaXJlOworCW1lbWNweShwcml2MC0+YmNvbW0tPmJjX2lwYWRkciwgZGdyc19pcGFkZHIsIDQpOworCW1lbWNweShwcml2MC0+YmNvbW0tPmJjX2lwdHJhcCwgZGdyc19pcHRyYXAsIDQpOworCW1lbWNweShwcml2MC0+YmNvbW0tPmJjX2lweG5ldCwgJmRncnNfaXB4bmV0LCA0KTsKKworCS8qCisJICogUmVsZWFzZSBwcm9jZXNzb3IsIHdhaXQgOCBzZWNvbmRzIGZvciBib2FyZCB0byBpbml0aWFsaXplCisJICovCisJcHJvY19yZXNldChkZXYwLCAwKTsKKworCWZvciAoaSA9IGppZmZpZXMgKyA4ICogSFo7IHRpbWVfYWZ0ZXIoaSwgamlmZmllcyk7ICkKKwl7CisJCWJhcnJpZXIoKTsJCS8qIEdjYyAyLjk1IG5lZWRzIHRoaXMgKi8KKwkJaWYgKHByaXYwLT5iY29tbS0+YmNfc3RhdHVzID49IEJDX1JVTikKKwkJCWJyZWFrOworCX0KKworCWlmIChwcml2MC0+YmNvbW0tPmJjX3N0YXR1cyA8IEJDX1JVTikKKwl7CisJCXByaW50aygiJXM6IGJvYXJkIG5vdCBvcGVyYXRpbmdcbiIsIGRldjAtPm5hbWUpOworCQlpb3VubWFwKHByaXYwLT52bWVtKTsKKwkJcHJpdjAtPnZtZW0gPSBOVUxMOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXByaXYwLT5wb3J0ID0gKFBPUlQgKikgUzJIKHByaXYwLT5iY29tbS0+YmNfcG9ydCk7CisJcHJpdjAtPnNjYnAgPSAoSTU5Nl9TQ0IgKikgUzJIKHByaXYwLT5wb3J0LT5zY2JwKTsKKwlwcml2MC0+cmZkcCA9IChJNTk2X1JGRCAqKSBTMkgocHJpdjAtPnNjYnAtPnJmZHApOworCXByaXYwLT5yYmRwID0gKEk1OTZfUkJEICopIFMySChwcml2MC0+cmZkcC0+cmJkcCk7CisKKwlwcml2MC0+c2NicC0+c3RhdHVzID0gSTU5Nl9TQ0JfQ05BOwkvKiBDVSBpcyBpZGxlICovCisKKwkvKgorCSAqCUdldCBzd2l0Y2ggcGh5c2ljYWwgYW5kIGhvc3QgdmlydHVhbCBwb2ludGVycyB0byBETUEKKwkgKgljaGFpbmluZyBhcmVhLiAgTk9URTogdGhlIE1TQiBvZiB0aGUgc3dpdGNoIHBoeXNpY2FsCisJICoJYWRkcmVzcyAqbXVzdCogYmUgdHVybmVkIG9mZi4gIE90aGVyd2lzZSwgdGhlIEhXIGtsdWRnZQorCSAqCXRoYXQgYWxsb3dzIGhvc3QgYWNjZXNzIG9mIHRoZSBQTFggRE1BIHJlZ2lzdGVycyB3aWxsCisJICoJZXJyb25lb3VzbHkgc2VsZWN0IHRoZSBQTFggcmVnaXN0ZXJzLgorCSAqLworCXByaXYwLT5kbWFkZXNjX3MgPSAoRE1BQ0hBSU4gKikgUzJETUEocHJpdjAtPmJjb21tLT5iY19ob3N0YXJlYSk7CisJaWYgKHByaXYwLT5kbWFkZXNjX3MpCisJCXByaXYwLT5kbWFkZXNjX2ggPSAoRE1BQ0hBSU4gKikgUzJIKHByaXYwLT5kbWFkZXNjX3MpOworCWVsc2UKKwkJcHJpdjAtPmRtYWRlc2NfaCA9IE5VTEw7CisKKwkvKgorCSAqCUVuYWJsZSBib2FyZCBpbnRlcnJ1cHRzCisJICovCisJaWYgKHByaXYwLT5wbHhyZWcpCisJewkvKiBQQ0kgYnVzICovCisJCU9VVEwoZGV2MC0+YmFzZV9hZGRyICsgUExYX0lOVF9DU1IsCisJCQlpbmwoZGV2MC0+YmFzZV9hZGRyICsgUExYX0lOVF9DU1IpCisJCQl8IFBMWF9QQ0lfRE9PUkJFTExfSUUpOwkvKiBFbmFibGUgaW50ciB0byBob3N0ICovCisJCU9VVEwoZGV2MC0+YmFzZV9hZGRyICsgUExYX0xDTDJQQ0lfRE9PUkJFTEwsIDEpOworCX0KKwllbHNlCisJewkvKiBFSVNBIGJ1cyAqLworCX0KKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKglQcm9iZSAoaW5pdCkgYSBib2FyZAorICovCitzdGF0aWMgaW50IF9faW5pdCAKK2RncnNfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJREdSU19QUklWCSpwcml2ID0gKERHUlNfUFJJViAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZwlpOworCWludAkJcmM7CisKKwlwcmludGsoIiVzOiBEaWdpIFJpZ2h0U3dpdGNoIGlvPSVseCBtZW09JWx4IGlycT0lZCBwbHg9JWx4IGRtYT0lbHhcbiIsCisJCWRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+bWVtX3N0YXJ0LCBkZXYtPmlycSwKKwkJcHJpdi0+cGx4cmVnLCBwcml2LT5wbHhkbWEpOworCisJLyoKKwkgKglEb3dubG9hZCB0aGUgZmlybXdhcmUgYW5kIGxpZ2h0IHRoZSBwcm9jZXNzb3IKKwkgKi8KKwlyYyA9IGRncnNfZG93bmxvYWQoZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKworCS8qCisJICogR2V0IGV0aGVyIGFkZHJlc3Mgb2YgYm9hcmQKKwkgKi8KKwlwcmludGsoIiVzOiBFdGhlcm5ldCBhZGRyZXNzIiwgZGV2LT5uYW1lKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgcHJpdi0+cG9ydC0+ZXRoYWRkciwgNik7CisJZm9yIChpID0gMDsgaSA8IDY7ICsraSkKKwkJcHJpbnRrKCIlYyUyLjJ4IiwgaSA/ICc6JyA6ICcgJywgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCJcbiIpOworCisJaWYgKGRldi0+ZGV2X2FkZHJbMF0gJiAxKQorCXsKKwkJcHJpbnRrKCIlczogSWxsZWdhbCBFdGhlcm5ldCBBZGRyZXNzXG4iLCBkZXYtPm5hbWUpOworCQlyYyA9IC1FTlhJTzsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qCisJICoJQUNLIG91dHN0YW5kaW5nIGludGVycnVwdHMsIGhvb2sgdGhlIGludGVycnVwdCwKKwkgKglhbmQgdmVyaWZ5IHRoYXQgd2UgYXJlIGdldHRpbmcgaW50ZXJydXB0cyBmcm9tIHRoZSBib2FyZC4KKwkgKi8KKwlpZiAocHJpdi0+cGx4cmVnKQorCQlPVVRMKGRldi0+YmFzZV9hZGRyICsgUExYX0xDTDJQQ0lfRE9PUkJFTEwsIDEpOworCQorCXJjID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZkZ3JzX2ludHIsIFNBX1NISVJRLCAiUmlnaHRTd2l0Y2giLCBkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJcHJpdi0+aW50cmNudCA9IDA7CisJZm9yIChpID0gamlmZmllcyArIDIqSFogKyBIWi8yOyB0aW1lX2FmdGVyKGksIGppZmZpZXMpOyApCisJeworCQljcHVfcmVsYXgoKTsKKwkJaWYgKHByaXYtPmludHJjbnQgPj0gMikKKwkJCWJyZWFrOworCX0KKwlpZiAocHJpdi0+aW50cmNudCA8IDIpCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBOb3QgaW50ZXJydXB0aW5nIG9uIElSUSAlZCAoJWQpXG4iLAorCQkJCWRldi0+bmFtZSwgZGV2LT5pcnEsIHByaXYtPmludHJjbnQpOworCQlyYyA9IC1FTlhJTzsKKwkJZ290byBlcnJfZnJlZV9pcnE7CisJfQorCisJLyoKKwkgKglFbnRyeSBwb2ludHMuLi4KKwkgKi8KKwlkZXYtPm9wZW4gPSAmZGdyc19vcGVuOworCWRldi0+c3RvcCA9ICZkZ3JzX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJmRncnNfZ2V0X3N0YXRzOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmRncnNfc3RhcnRfeG1pdDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZkZ3JzX3NldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPmRvX2lvY3RsID0gJmRncnNfaW9jdGw7CisKKwlyZXR1cm4gcmM7CisKK2Vycl9mcmVlX2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK2Vycl9vdXQ6CisgICAgICAgCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2luaXQgCitkZ3JzX2luaXRjbG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCURHUlNfUFJJVgkqcHJpdiA9IChER1JTX1BSSVYgKikgZGV2LT5wcml2OworCWludAkJaTsKKworCXByaW50aygiJXM6IERpZ2kgUmlnaHRTd2l0Y2ggcG9ydCAlZCAiLAorCQlkZXYtPm5hbWUsIHByaXYtPmNoYW4pOworCWZvciAoaSA9IDA7IGkgPCA2OyArK2kpCisJCXByaW50aygiJWMlMi4yeCIsIGkgPyAnOicgOiAnICcsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiXG4iKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCAKK2RncnNfZm91bmRfZGV2aWNlKAorCWludAkJaW8sCisJdWxvbmcJCW1lbSwKKwlpbnQJCWlycSwKKwl1bG9uZwkJcGx4cmVnLAorCXVsb25nCQlwbHhkbWEsCisJc3RydWN0IGRldmljZSAgICpwZGV2CispCit7CisJREdSU19QUklWICpwcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGksIHJldCA9IC1FTk9NRU07CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoREdSU19QUklWKSk7CisJaWYgKCFkZXYpCisJCWdvdG8gZXJyMDsKKworCXByaXYgPSAoREdSU19QUklWICopZGV2LT5wcml2OworCisJZGV2LT5iYXNlX2FkZHIgPSBpbzsKKwlkZXYtPm1lbV9zdGFydCA9IG1lbTsKKwlkZXYtPm1lbV9lbmQgPSBtZW0gKyAyMDQ4ICogMTAyNCAtIDE7CisJZGV2LT5pcnEgPSBpcnE7CisJcHJpdi0+cGx4cmVnID0gcGx4cmVnOworCXByaXYtPnBseGRtYSA9IHBseGRtYTsKKwlwcml2LT52cGx4ZG1hID0gTlVMTDsKKworCXByaXYtPmNoYW4gPSAxOworCXByaXYtPmRldnRibFswXSA9IGRldjsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsIHBkZXYpOworCQorCXJldCA9IGRncnNfcHJvYmUxKGRldik7CisJaWYgKHJldCkgCisJCWdvdG8gZXJyMTsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMjsKKworCWlmICggIWRncnNfbmljbW9kZSApCisJCXJldHVybiBkZXY7CS8qIFN3aXRjaCBtb2RlLCB3ZSBhcmUgZG9uZSAqLworCisJLyoKKwkgKiBPcGVyYXRpbmcgY2FyZCBhcyBOIHNlcGFyYXRlIE5JQ3MKKwkgKi8KKworCXByaXYtPm5wb3J0cyA9IHByaXYtPmJjb21tLT5iY19ucG9ydHM7CisKKwlmb3IgKGkgPSAxOyBpIDwgcHJpdi0+bnBvcnRzOyArK2kpCisJeworCQlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2TjsKKwkJREdSU19QUklWCSpwcml2TjsKKwkJCS8qIEFsbG9jYXRlIG5ldyBkZXYgYW5kIHByaXYgc3RydWN0dXJlcyAqLworCQlkZXZOID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKERHUlNfUFJJVikpOworCQlyZXQgPSAtRU5PTUVNOworCQlpZiAoIWRldk4pIAorCQkJZ290byBmYWlsOworCisJCS8qIERvbid0IGNvcHkgdGhlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZSEgKi8KKworCQkvKiBjb3B5IHRoZSBwcml2IHN0cnVjdHVyZSBvZiBkZXZbMF0gKi8KKwkJcHJpdk4gPSAoREdSU19QUklWICopZGV2Ti0+cHJpdjsKKwkJKnByaXZOID0gKnByaXY7CisKKwkJCS8qIC4uLiBhbmQgemVybyBvdXQgVk0gYXJlYXMgKi8KKwkJcHJpdk4tPnZtZW0gPSBOVUxMOworCQlwcml2Ti0+dnBseGRtYSA9IE5VTEw7CisJCQkvKiAuLi4gYW5kIHplcm8gb3V0IElSUSAqLworCQlkZXZOLT5pcnEgPSAwOworCQkJLyogLi4uIGFuZCBiYXNlIE1BQyBhZGRyZXNzIG9mZiBhZGRyZXNzIG9mIDFzdCBwb3J0ICovCisJCWRldk4tPmRldl9hZGRyWzVdICs9IGk7CisKKwkJcmV0ID0gZGdyc19pbml0Y2xvbmUoZGV2Tik7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWw7CisKKwkJU0VUX01PRFVMRV9PV05FUihkZXZOKTsKKwkJU0VUX05FVERFVl9ERVYoZGV2LCBwZGV2KTsKKworCQlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2Tik7CisJCWlmIChyZXQpIHsKKwkJCWZyZWVfbmV0ZGV2KGRldk4pOworCQkJZ290byBmYWlsOworCQl9CisJCXByaXZOLT5jaGFuID0gaSsxOworCQlwcml2LT5kZXZ0YmxbaV0gPSBkZXZOOworCX0KKwlyZXR1cm4gZGV2OworCisgZmFpbDoJCisJd2hpbGUgKGkgPj0gMCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZCA9IHByaXYtPmRldnRibFtpLS1dOworCQl1bnJlZ2lzdGVyX25ldGRldihkKTsKKwkJZnJlZV9uZXRkZXYoZCk7CisJfQorCisgZXJyMjoKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKyBlcnIxOgorCWZyZWVfbmV0ZGV2KGRldik7CisgZXJyMDoKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZGdyc19yZW1vdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlER1JTX1BSSVYgKnByaXYgPSBkZXYtPnByaXY7CisJaW50IGk7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJZm9yIChpID0gMTsgaSA8IHByaXYtPm5wb3J0czsgKytpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkID0gcHJpdi0+ZGV2dGJsW2ldOworCQlpZiAoZCkgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZCk7CisJCQlmcmVlX25ldGRldihkKTsKKwkJfQorCX0KKworCXByb2NfcmVzZXQocHJpdi0+ZGV2dGJsWzBdLCAxKTsKKworCWlmIChwcml2LT52bWVtKQorCQlpb3VubWFwKHByaXYtPnZtZW0pOworCWlmIChwcml2LT52cGx4ZG1hKQorCQlpb3VubWFwKCh1Y2hhciAqKSBwcml2LT52cGx4ZG1hKTsKKworCWlmIChkZXYtPmlycSkKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlmb3IgKGkgPSAxOyBpIDwgcHJpdi0+bnBvcnRzOyArK2kpIHsKKwkJaWYgKHByaXYtPmRldnRibFtpXSkKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KHByaXYtPmRldnRibFtpXSk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGludCBfX2luaXQgZGdyc19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyOworCXVpbnQJaW87CisJdWludAltZW07CisJdWludAlpcnE7CisJdWludAlwbHhyZWc7CisJdWludAlwbHhkbWE7CisKKwkvKgorCSAqIEdldCBhbmQgY2hlY2sgdGhlIGJ1cy1tYXN0ZXIgYW5kIGxhdGVuY3kgdmFsdWVzLgorCSAqIFNvbWUgUENJIEJJT1NlcyBmYWlsIHRvIHNldCB0aGUgbWFzdGVyLWVuYWJsZSBiaXQsCisJICogYW5kIHRoZSBsYXRlbmN5IHRpbWVyIG11c3QgYmUgc2V0IHRvIHRoZSBtYXhpbXVtCisJICogdmFsdWUgdG8gYXZvaWQgZGF0YSBjb3JydXB0aW9uIHRoYXQgb2NjdXJzIHdoZW4gdGhlCisJICogdGltZXIgZXhwaXJlcyBkdXJpbmcgYSB0cmFuc2Zlci4gIFllcywgaXQncyBhIGJ1Zy4KKwkgKi8KKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgIlJpZ2h0U3dpdGNoIik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcGx4cmVnID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKKwlpbyA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMSk7CisJbWVtID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAyKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHgzMCwgJnBseGRtYSk7CisJaXJxID0gcGRldi0+aXJxOworCXBseGRtYSAmPSB+MTU7CisKKwkvKgorCSAqIE9uIHNvbWUgQklPU0VTLCB0aGUgUExYICJleHBhbnNpb24gcm9tIiAodXNlZCBmb3IgRE1BKQorCSAqIGFkZHJlc3MgY29tZXMgdXAgYXMgIjAiLiAgVGhpcyBpcyBwcm9iYWJseSBiZWNhdXNlCisJICogdGhlIEJJT1MgZG9lc24ndCBzZWUgYSB2YWxpZCA1NSBBQSBST00gc2lnbmF0dXJlIGF0CisJICogdGhlICJST00iIHN0YXJ0IGFuZCB6ZXJvZXMgdGhlIGFkZHJlc3MuICBUbyBnZXQKKwkgKiBhcm91bmQgdGhpcyBwcm9ibGVtIHRoZSBTRS02IGlzIGNvbmZpZ3VyZWQgdG8gYXNrCisJICogZm9yIDQgTUIgb2Ygc3BhY2UgZm9yIHRoZSBkdWFsIHBvcnQgbWVtb3J5LiAgV2UgdGhlbgorCSAqIG11c3Qgc2V0IGl0cyByYW5nZSBiYWNrIHRvIDIgTUIsIGFuZCB1c2UgdGhlIHVwcGVyCisJICogaGFsZiBmb3IgRE1BIHJlZ2lzdGVyIGFjY2VzcworCSAqLworCU9VVEwoaW8gKyBQTFhfU1BBQ0UwX1JBTkdFLCAweEZGRTAwMDAwTCk7CisJaWYgKHBseGRtYSA9PSAwKQorCQlwbHhkbWEgPSBtZW0gKyAoMjA0OEwgKiAxMDI0TCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDMwLCBwbHhkbWEgKyAxKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHgzMCwgJnBseGRtYSk7CisJcGx4ZG1hICY9IH4xNTsKKworCWRldiA9IGRncnNfZm91bmRfZGV2aWNlKGlvLCBtZW0sIGlycSwgcGx4cmVnLCBwbHhkbWEsICZwZGV2LT5kZXYpOworCWlmIChJU19FUlIoZGV2KSkgeworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlyZXR1cm4gUFRSX0VSUihkZXYpOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZGdyc19wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlkZ3JzX3JlbW92ZShkZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRncnNfcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9ICJkZ3JzIiwKKwkuaWRfdGFibGUgPSBkZ3JzX3BjaV90YmwsCisJLnByb2JlID0gZGdyc19wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGRncnNfcGNpX3JlbW92ZSksCit9OworI2VuZGlmCisKKworI2lmZGVmIENPTkZJR19FSVNBCitzdGF0aWMgaW50IGlzMml2WzhdIF9faW5pdGRhdGEgPSB7IDAsIDMsIDUsIDcsIDEwLCAxMSwgMTIsIDE1IH07CisKK3N0YXRpYyBpbnQgX19pbml0IGRncnNfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZ2VuZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGVpc2FfZGV2aWNlICplZGV2ID0gdG9fZWlzYV9kZXZpY2UoZ2VuZGV2KTsKKwl1aW50CWlvID0gZWRldi0+YmFzZV9hZGRyOworCXVpbnQJbWVtOworCXVpbnQJaXJxOworCWludCAJcmMgPSAtRU5PREVWOyAvKiBOb3QgRUlTQSBjb25maWd1cmVkICovCisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCAyNTYsICJSaWdodFN3aXRjaCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZGdyczogZWlzYSBpbyAweCV4LCB3aGljaCBpcyBidXN5LlxuIiwgaW8pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICggISAoaW5iKGlvK0VTNEhfRUMpICYgRVM0SF9FQ19FTkFCTEUpICkgCisJCWdvdG8gZXJyX291dDsKKworCW1lbSA9IChpbmIoaW8rRVM0SF9BU18zMV8yNCkgPDwgMjQpCisJCSsgKGluYihpbytFUzRIX0FTXzIzXzE2KSA8PCAxNik7CisKKwlpcnEgPSBpczJpdlsgaW5iKGlvK0VTNEhfSVMpICYgRVM0SF9JU19JTlRNQVNLIF07CisKKwlkZXYgPSBkZ3JzX2ZvdW5kX2RldmljZShpbywgbWVtLCBpcnEsIDBMLCAwTCwgZ2VuZGV2KTsKKwlpZiAoSVNfRVJSKGRldikpIHsKKwkJcmMgPSBQVFJfRVJSKGRldik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlnZW5kZXYtPmRyaXZlcl9kYXRhID0gZGV2OworCXJldHVybiAwOworIGVycl9vdXQ6CisJcmVsZWFzZV9yZWdpb24oaW8sIDI1Nik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkZ3JzX2Vpc2FfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmdlbmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZ2VuZGV2LT5kcml2ZXJfZGF0YTsKKwkKKwlkZ3JzX3JlbW92ZShkZXYpOworCisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIDI1Nik7CisJCQorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBlaXNhX2RyaXZlciBkZ3JzX2Vpc2FfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGRncnNfZWlzYV90YmwsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiZGdycyIsCisJCS5wcm9iZSA9IGRncnNfZWlzYV9wcm9iZSwKKwkJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGRncnNfZWlzYV9yZW1vdmUpLAorCX0KK307CisjZW5kaWYKKworLyoKKyAqCVZhcmlhYmxlcyB0aGF0IGNhbiBiZSBvdmVycmlkZW4gZnJvbSBtb2R1bGUgY29tbWFuZCBsaW5lCisgKi8KK3N0YXRpYyBpbnQJZGVidWcgPSAtMTsKK3N0YXRpYyBpbnQJZG1hID0gLTE7CitzdGF0aWMgaW50CWhhc2hleHBpcmUgPSAtMTsKK3N0YXRpYyBpbnQJc3BhbnRyZWUgPSAtMTsKK3N0YXRpYyBpbnQJaXBhZGRyWzRdID0geyAtMSB9Oworc3RhdGljIGludAlpcHRyYXBbNF0gPSB7IC0xIH07CitzdGF0aWMgX191MzIJaXB4bmV0ID0gLTE7CitzdGF0aWMgaW50CW5pY21vZGUgPSAtMTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShoYXNoZXhwaXJlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNwYW50cmVlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlwYWRkciwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcHRyYXAsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0oaXB4bmV0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG5pY21vZGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGlnaSBSaWdodFN3aXRjaCBlbmFibGUgZGVidWdnaW5nICgwLTEpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRtYSwgIkRpZ2kgUmlnaHRTd2l0Y2ggZW5hYmxlIEJNIERNQSAoMC0xKSIpOworTU9EVUxFX1BBUk1fREVTQyhuaWNtb2RlLCAiRGlnaSBSaWdodFN3aXRjaCBvcGVyYXRpbmcgbW9kZSAoMTogc3dpdGNoLCAyOiBtdWx0aS1OSUMpIik7CisKK3N0YXRpYyBpbnQgX19pbml0IGRncnNfaW5pdF9tb2R1bGUgKHZvaWQpCit7CisJaW50CWk7CisJaW50IGVpc2Fjb3VudCA9IDAsIHBjaWNvdW50ID0gMDsKKworCS8qCisJICoJQ29tbWFuZCBsaW5lIHZhcmlhYmxlIG92ZXJyaWRlcworCSAqCQlkZWJ1Zz1OTk4KKwkgKgkJZG1hPTAvMQorCSAqCQlzcGFudHJlZT0wLzEKKwkgKgkJaGFzaGV4cGlyZT1OTk4KKwkgKgkJaXBhZGRyPUEsQixDLEQKKwkgKgkJaXB0cmFwPUEsQixDLEQKKwkgKgkJaXB4bmV0PU5OTgorCSAqCQluaWNtb2RlPU5OTgorCSAqLworCWlmIChkZWJ1ZyA+PSAwKQorCQlkZ3JzX2RlYnVnID0gZGVidWc7CisJaWYgKGRtYSA+PSAwKQorCQlkZ3JzX2RtYSA9IGRtYTsKKwlpZiAobmljbW9kZSA+PSAwKQorCQlkZ3JzX25pY21vZGUgPSBuaWNtb2RlOworCWlmIChoYXNoZXhwaXJlID49IDApCisJCWRncnNfaGFzaGV4cGlyZSA9IGhhc2hleHBpcmU7CisJaWYgKHNwYW50cmVlID49IDApCisJCWRncnNfc3BhbnRyZWUgPSBzcGFudHJlZTsKKwlpZiAoaXBhZGRyWzBdICE9IC0xKQorCQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQorCQkJZGdyc19pcGFkZHJbaV0gPSBpcGFkZHJbaV07CisJaWYgKGlwdHJhcFswXSAhPSAtMSkKKwkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKwkJCWRncnNfaXB0cmFwW2ldID0gaXB0cmFwW2ldOworCWlmIChpcHhuZXQgIT0gLTEpCisJCWRncnNfaXB4bmV0ID0gaHRvbmwoIGlweG5ldCApOworCisJaWYgKGRncnNfZGVidWcpCisJeworCQlwcmludGsoS0VSTl9JTkZPICJkZ3JzOiBTVz0lcyBGVz1CdWlsZCAlZCAlc1xuRlcgVmVyc2lvbj0lc1xuIiwKKwkJICAgICAgIHZlcnNpb24sIGRncnNfZmlybW51bSwgZGdyc19maXJtZGF0ZSwgZGdyc19maXJtdmVyKTsKKwl9CisKKwkvKgorCSAqCUZpbmQgYW5kIGNvbmZpZ3VyZSBhbGwgdGhlIGNhcmRzCisJICovCisjaWZkZWYgQ09ORklHX0VJU0EKKwllaXNhY291bnQgPSBlaXNhX2RyaXZlcl9yZWdpc3RlcigmZGdyc19laXNhX2RyaXZlcik7CisJaWYgKGVpc2Fjb3VudCA8IDApCisJCXJldHVybiBlaXNhY291bnQ7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUENJCisJcGNpY291bnQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkZ3JzX3BjaV9kcml2ZXIpOworCWlmIChwY2ljb3VudCkKKwkJcmV0dXJuIHBjaWNvdW50OworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZ3JzX2NsZWFudXBfbW9kdWxlICh2b2lkKQoreworI2lmZGVmIENPTkZJR19FSVNBCisJZWlzYV9kcml2ZXJfdW5yZWdpc3RlciAoJmRncnNfZWlzYV9kcml2ZXIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BDSQorCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJmRncnNfcGNpX2RyaXZlcik7CisjZW5kaWYKK30KKworbW9kdWxlX2luaXQoZGdyc19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkZ3JzX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RncnMuaCBiL2RyaXZlcnMvbmV0L2RncnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQ3Y2QxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZGdycy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKglpb2N0bCdzIGZvciB0aGUgRGlnaSBJbnRsLiBSaWdodFN3aXRjaAorICoKKyAqCVRoZXNlIG5ldHdvcmsgZHJpdmVyIGlvY3RsJ3MgYXJlIGEgYml0IG9idHVzZSBjb21wYXJlZCB0byB0aGUgdXN1YWwKKyAqCWlvY3RsJ3MgZm9yIGEgIm5vcm1hbCIgZGV2aWNlIGRyaXZlci4gIEhleSwgSSBkaWRuJ3QgaW52ZW50IGl0LgorICoKKyAqCVR5cGljYWwgdXNlOgorICoKKyAqCXN0cnVjdCBpZnJlcQlpZnI7CisgKglER1JTX0lPQ1RMCWlvYzsKKyAqCWludAkJeDsKKyAqCisgKglzdHJjcHkoaWZyLmlmcl9uYW1lLCAiZXRoMSIpOworICoJaWZyLmlmcl9kYXRhID0gKGNhZGRyX3QpICZpb2M7CisgKglpb2MuY21kID0gREdSU19HRVRNRU07CisgKglpb2MubGVuID0gc2l6ZW9mKHgpOworICoJaW9jLmRhdGEgPSAoY2FkZHJfdCkgJng7CisgKglyYyA9IGlvY3RsKGZkLCBER1JTSU9DVEwsICZpZnIpOworICoJcHJpbnRmKCJyYz0lZCBtZW09JXhcbiIsIHJjLCB4KTsKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisKKyNkZWZpbmUgREdSU0lPQ1RMICAgICAgU0lPQ0RFVlBSSVZBVEUKKwordHlwZWRlZiBzdHJ1Y3QgZGdyc19pb2N0bCB7CisJdW5zaWduZWQgc2hvcnQgY21kOwkvKiBDb21tYW5kIHRvIHJ1biAqLworCXVuc2lnbmVkIHNob3J0IGxlbjsJLyogTGVuZ3RoIG9mIHRoZSBkYXRhIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgIF9fdXNlciAqZGF0YTsJLyogUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBzaG9ydAlwb3J0OwkvKiBwb3J0IG51bWJlciBmb3IgY29tbWFuZCwgaWYgbmVlZGVkICovCisJdW5zaWduZWQgc2hvcnQJZmlsdGVyOwkvKiBmaWx0ZXIgbnVtYmVyIGZvciBjb21tYW5kLCBpZiBuZWVkZWQgKi8KK30gREdSU19JT0NUTDsKKworLyogCisgKglDb21tYW5kcyBmb3IgdGhlIGRyaXZlciAKKyAqLworI2RlZmluZQlER1JTX0dFVE1FTQkJMHgwMQkvKiBHZXQgdGhlIGR1YWwgcG9ydCBtZW1vcnkgYWRkcmVzcyAqLworI2RlZmluZQlER1JTX1NFVEZJTFRFUgkJMHgwMgkvKiBTZXQgYSBmaWx0ZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RncnNfYXNzdHJ1Y3QuaCBiL2RyaXZlcnMvbmV0L2RncnNfYXNzdHJ1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU1YmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZGdyc19hc3N0cnVjdC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKglGb3IgZGVjbGFyaW5nIHN0cnVjdHVyZXMgc2hhcmVkIHdpdGggYXNzZW1ibHkgcm91dGluZXMKKyAqCisgKgkkSWQ6IGFzc3RydWN0LmgsdiAxLjEuMS4xIDE5OTQvMTAvMjMgMDU6MDg6MzIgcmljayBFeHAgJAorICovCisKKyNpZmRlZiBBU1NFTUJMRVIKKworIwlkZWZpbmUgTU8odCxhKQkJKGEpCisjCWRlZmluZSBWTU8odCxhKQkJKGEpCisKKyMJZGVmaW5lCUJFR0lOX1NUUlVDVCh4KQlfT2ZmPTAKKyMJZGVmaW5lCVMxQSh0LHgsbikJX09mZj0oX09mZiswKSZ+MDsgeD1fT2ZmOyBfT2ZmPV9PZmYrKDEqbikKKyMJZGVmaW5lCVMyQSh0LHgsbikJX09mZj0oX09mZisxKSZ+MTsgeD1fT2ZmOyBfT2ZmPV9PZmYrKDIqbikKKyMJZGVmaW5lCVM0QSh0LHgsbikJX09mZj0oX09mZiszKSZ+MzsgeD1fT2ZmOyBfT2ZmPV9PZmYrKDQqbikKKyMJZGVmaW5lCVdPUkQoeCkJCV9PZmY9KF9PZmYrMykmfjM7IHg9X09mZjsgX09mZj1fT2ZmKzQKKyMJZGVmaW5lCVdPUkRBKHgsbikJX09mZj0oX09mZiszKSZ+MzsgeD1fT2ZmOyBfT2ZmPV9PZmYrKDQqbikKKyMJZGVmaW5lCVZXT1JEKHgpCV9PZmY9KF9PZmYrMykmfjM7IHg9X09mZjsgX09mZj1fT2ZmKzQKKyMJZGVmaW5lCVMxKHQseCkJCV9PZmY9KF9PZmYrMCkmfjA7IHg9X09mZjsgX09mZj1fT2ZmKzEKKyMJZGVmaW5lCVMyKHQseCkJCV9PZmY9KF9PZmYrMSkmfjE7IHg9X09mZjsgX09mZj1fT2ZmKzIKKyMJZGVmaW5lCVM0KHQseCkJCV9PZmY9KF9PZmYrMykmfjM7IHg9X09mZjsgX09mZj1fT2ZmKzQKKyMJZGVmaW5lCUVORF9TVFJVQ1QoeCkJX09mZj0oX09mZiszKSZ+MzsgeD1fT2ZmIAorCisjZWxzZQkvKiBDICovCisKKyNkZWZpbmUgVk1PKHQsYSkgICAgICAgICgqKHZvbGF0aWxlIHQgKikoYSkpCisKKyMJZGVmaW5lIEJFR0lOX1NUUlVDVCh4KSBzdHJ1Y3QgeCB7CisjCWRlZmluZSBTMSh0LHgpICAgICAgICAgdCB4IDsKKyMJZGVmaW5lIFMxQSh0LHgsbikgICAgICB0IHhbbl0gOworIwlkZWZpbmUgUzIodCx4KSAgICAgICAgIHQgeCA7CisjCWRlZmluZSBTMkEodCx4LG4pICAgICAgdCB4W25dIDsKKyMJZGVmaW5lIFM0KHQseCkgICAgICAgICB0IHggOworIwlkZWZpbmUgUzRBKHQseCxuKSAgICAgIHQgeFtuXSA7CisjCWRlZmluZSBFTkRfU1RSVUNUKHgpICAgfSA7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGdyc19iY29tbS5oIGIvZHJpdmVycy9uZXQvZGdyc19iY29tbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NDY2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kZ3JzX2Jjb21tLmgKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBUaGUgYmlvcyBsb3ctbWVtb3J5IHN0cnVjdHVyZQorICoKKyAqIFNvbWUgb2YgdGhlIHZhcmlhYmxlcyBpbiBoZXJlIGNhbiBiZSB1c2VkIHRvIHNldCBwYXJhbWV0ZXJzIHRoYXQKKyAqIGFyZSBzdG9yZWQgaW4gTlZSQU0gYW5kIHdpbGwgcmV0YWluIHRoZWlyIG9sZCB2YWx1ZXMgdGhlIG5leHQgdGltZQorICogdGhlIGNhcmQgaXMgYnJvdWdodCB1cC4gIFRvIHVzZSB0aGUgdmFsdWVzIHN0b3JlZCBpbiBOVlJBTSwgdGhlCisgKiBwYXJhbWV0ZXIgc2hvdWxkIGJlIHNldCB0byAiYWxsIG9uZXMiLiAgVGhpcyB0ZWxscyB0aGUgZmlybXdhcmUgdG8KKyAqIHVzZSB0aGUgTlZSQU0gdmFsdWUgb3IgYSBzdWl0YWJsZSBkZWZhdWx0LiAgVGhlIHZhbHVlIHRoYXQgaXMgdXNlZAorICogd2lsbCBiZSBzdG9yZWQgYmFjayBpbnRvIHRoaXMgc3RydWN0dXJlIGJ5IHRoZSBmaXJtd2FyZS4gIElmIHRoZQorICogdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGlzIG5vdCAiYWxsIG9uZXMiLCB0aGVuIHRoYXQgdmFsdWUgd2lsbCBiZQorICogdXNlZCBhbmQgd2lsbCBiZSBzdG9yZWQgaW50byBOVlJBTSBpZiBpdCBpc24ndCBhbHJlYWR5IHRoZXJlLgorICogVGhlIHZhcmlhYmxlcyB0aGlzIGFwcGxpZXMgdG8gYXJlIHRoZSBmb2xsb3dpbmc6CisgKglWYXJpYWJsZQlTZXQgdG86CQlHZXRzIGRlZmF1bHQgb2Y6CisgKgliY19oYXNoZXhwaXJlCS0xCQkzMDAJKDUgbWludXRlcykKKyAqCWJjX3NwYW50cmVlCS0xCQkxCShzcGFubmluZyB0cmVlIG9uKQorICoJYmNfaXBhZGRyCUZGOkZGOkZGOkZGCTAJKG5vIFNOTVAgSVAgYWRkcmVzcykKKyAqCWJjX2lweG5ldAlGRjpGRjpGRjpGRgkwCShubyBTTk1QIElQWCBuZXQpCisgKgliY19pcHRyYXAJRkY6RkY6RkY6RkYJMAkobm8gU05NUCBJUCB0cmFwIGFkZHJlc3MpCisgKgorICogU29tZSB2YXJpYWJsZXMgTVVTVCBoYXZlIHRoZWlyIHZhbHVlIHNldCBhZnRlciB0aGUgZmlybXdhcmUKKyAqIGlzIGxvYWRlZCBvbnRvIHRoZSBib2FyZCwgYnV0IGJlZm9yZSB0aGUgcHJvY2Vzc29yIGlzIHJlbGVhc2VkLgorICogVGhlc2UgYXJlOgorICoJYmNfaG9zdAkJMCBtZWFucyBubyBob3N0ICJwb3J0IiwgcnVuIGFzIHN0YW5kYWxvbmUgc3dpdGNoLgorICoJCQkxIG1lYW5zIHJ1biBhcyBhIHN3aXRjaCwgd2l0aCBhIGhvc3QgcG9ydC4gKG5vcm1hbCkKKyAqCQkJMiBtZWFucyBydW4gYXMgbXVsdGlwbGUgTklDcywgbm90IGFzIGEgc3dpdGNoLgorICoJCQktMSBtZWFucyBydW4gaW4gZGlhZ25vc3RpY3MgbW9kZS4KKyAqCWJjX25vd2FpdAorICoJYmNfaG9zdGFyZWFfbGVuCisgKgliY19maWx0ZXJfbGVuCisgKgkJCQorICovCitCRUdJTl9TVFJVQ1QoYmlvc19jb21tKQorCVM0KHVsb25nLCBiY19pbnRmbGFnKQkvKiBDb3VudCBvZiBhbGwgaW50ZXJydXB0cyAqLworCVM0KHVsb25nLCBiY19sYm9sdCkJLyogQ291bnQgb2YgdGltZXIgaW50ZXJydXB0cyAqLworCVM0KHVsb25nLCBiY19tYWluY250KQkvKiBDb3VudCBvZiBtYWluIGxvb3BzICovCisJUzQodWxvbmcsIGJjX2hhc2hjbnQpCS8qIENvdW50IG9mIGVudHJpZXMgaW4gaGFzaCB0YWJsZSAqLworCVM0QSh1bG9uZywgYmNfY250LCA4KQkvKiBNaXNjIGNvdW50ZXJzLCBmb3IgZGVidWdnaW5nICovCisJUzRBKHVsb25nLCBiY19mbGFnLCA4KQkvKiBNaXNjIGZsYWdzLCBmb3IgZGVidWdnaW5nICovCisJUzQodWxvbmcsIGJjX21lbXNpemUpCS8qIFNpemUgb2YgbWVtb3J5ICovCisJUzQodWxvbmcsIGJjX2RjYWNoZSkJLyogU2l6ZSBvZiB3b3JraW5nIGRjYWNoZSAqLworCVM0KHVsb25nLCBiY19pY2FjaGUpCS8qIFNpemUgb2Ygd29ya2luZyBpY2FjaGUgKi8KKwlTNChsb25nLCBiY19zdGF0dXMpCS8qIEZpcm13YXJlIHN0YXR1cyAqLworCVMxQShjaGFyLCBiY19maWxlLCA4KQkvKiBGaWxlIG5hbWUgb2YgYXNzZXJ0aW9uIGZhaWx1cmUgKi8KKwlTNCh1bG9uZywgYmNfbGluZSkJLyogTGluZSAjIG9mIGFzc2VydGlvbiBmYWlsdXJlICovCisJUzQodWNoYXIgKiwgYmNfcmFtc3RhcnQpCisJUzQodWNoYXIgKiwgYmNfcmFtZW5kKQorCVM0KHVjaGFyICosIGJjX2hlYXBzdGFydCkgLyogU3RhcnQgb2YgaGVhcCAoZW5kIG9mIGxvYWRlZCBtZW1vcnkpICovCisJUzQodWNoYXIgKiwgYmNfaGVhcGVuZCkJLyogRW5kIG9mIGhlYXAgKi8KKworCS8qIENvbmZpZ3VyYWJsZSBQYXJhbWV0ZXJzICovCisJUzQobG9uZywgYmNfaG9zdCkJLyogMT1Ib3N0IFBvcnQsIDA9Tm8gSG9zdCBQb3J0LCAtMT1UZXN0IE1vZGUgKi8KKwlTNChsb25nLCBiY19ub3dhaXQpCS8qIERvbid0IHdhaXQgZm9yIDJob3N0IGNpcmMgYnVmZmVyIHRvIGVtcHR5Ki8KKwlTNChsb25nLCBiY18xNTBvaG0pCS8qIDAgPT0gMTAwIG9obSBVVFAsIDEgPT0gMTUwIG9obSBTVFAgKi8KKwlTNChsb25nLCBiY19zcXVlbGNoKQkvKiAwID09IG5vcm1hbCBzcXVlbGNoLCAxID09IHJlZHVjZWQgc3F1ZWxjaCAqLworCVM0KHVsb25nLCBiY19oYXNoZXhwaXJlKSAvKiBFeHBpcnkgdGltZSBpbiBzZWNvbmRzIGZvciBoYXNoIHRhYmxlICovCisJUzQobG9uZywgYmNfc3BhbnRyZWUpCS8qIDEgPT0gZW5hYmxlIElFRUUgc3Bhbm5pbmcgdHJlZSAqLworCisJUzJBKHVzaG9ydCwgYmNfZWFkZHIsIDMpIC8qIE5ldyBldGhlciBhZGRyZXNzICovCisJUzIodXNob3J0LCBiY19kdW1teTEpCS8qIHBhZGRpbmcgZm9yIERPUyBjb21waWxlcnMgKi8KKworCS8qIFZhcmlvdXMgZGVidWdnaW5nIGFpZHMgKi8KKwlTNChsb25nLCBiY19kZWJ1ZykJLyogRGVidWdnaW5nIGlzIHR1cm5lZCBvbiAqLworCVM0KGxvbmcsIGJjX3NwZXcpCS8qIFNwZXcgZGF0YSBvbiBwb3J0IDQgZm9yIGJzX3NwZXcgc2Vjb25kcyAqLworCVM0KGxvbmcsIGJjX3NwZXdsZW4pCS8qIExlbmd0aCBvZiBzcGV3ZWQgZGF0YSBwYWNrZXRzICovCisJUzQobG9uZywgYmNfbWF4cmZkKQkvKiBJZiAhPSAwLCBtYXggbnVtYmVyIG9mIFJGRCdzIHRvIGFsbG9jYXRlICovCisJUzQobG9uZywgYmNfbWF4cmJkKQkvKiBJZiAhPSAwLCBtYXggbnVtYmVyIG9mIFJCRCdzIHRvIGFsbG9jYXRlICovCisKKwkvKiBDaXJjdWxhciBidWZmZXJzIGZvciBtZXNzYWdlcyB0by9mcm9tIGhvc3QgKi8KKwlTNCh1bG9uZywgYmNfMmhvc3RfaGVhZCkKKwlTNCh1bG9uZywgYmNfMmhvc3RfdGFpbCkKKwlTNCh1bG9uZywgYmNfMmhvc3RfbWFzaykKKwlTMUEoY2hhciwgYmNfMmhvc3QsIDB4MjAwKQkvKiBDaXJjIGJ1ZmYgdG8gaG9zdCAqLworCisJUzQodWxvbmcsIGJjXzJpZHRfaGVhZCkKKwlTNCh1bG9uZywgYmNfMmlkdF90YWlsKQorCVM0KHVsb25nLCBiY18yaWR0X21hc2spCisJUzFBKGNoYXIsIGJjXzJpZHQsIDB4MjAwKQkvKiBDaXJjIGJ1ZmYgdG8gaWR0ICovCisKKwkvKiBQb2ludGVycyB0byBzdHJ1Y3R1cmVzIGZvciBkcml2ZXIgYWNjZXNzICovCisJUzQodWNoYXIgKiwgYmNfcG9ydCkJLyogcG9pbnRlciB0byBQb3J0W10gc3RydWN0dXJlcyAqLworCVM0KGxvbmcsIGJjX25wb3J0cykJLyogTnVtYmVyIG9mIHBvcnRzICovCisJUzQobG9uZywgYmNfcG9ydGxlbikJLyogc2l6ZW9mKFBPUlQpICovCisJUzQodWNoYXIgKiwgYmNfaGFzaCkJLyogUG9pbnRlciB0byBoYXNoIHRhYmxlICovCisJUzQobG9uZywgYmNfaGFzaGxlbikJLyogc2l6ZW9mKFRhYmxlKSAqLworCisJLyogU05NUCBhZ2VudCBhZGRyZXNzZXMgKi8KKwlTMUEodWNoYXIsIGJjX2lwYWRkciwgNCkgLyogSVAgYWRkcmVzcyBmb3IgU05NUCAqLworCVMxQSh1Y2hhciwgYmNfaXB4bmV0LCA0KSAvKiBJUFggbmV0IGFkZHJlc3MgZm9yIFNOTVAgKi8KKworCVM0KGxvbmcsIGJjX25vaG9zdGludHIpIC8qIERvIG5vdCBjYXVzZSBwZXJpb2RpYyBob3N0IGludGVycnVwdHMgKi8KKworCVM0KHVjaGFyICosIGJjX2RtYWFkZHIpIC8qIFBoeXNpY2FsIGFkZHIgb2YgaG9zdCBETUEgYnVmIGZvciBkaWFncyAqLworCVM0KHVsb25nLCBiY19kbWFsZW4pCS8qIExlbmd0aCBvZiBETUEgYnVmZmVyIDAuLjIwNDggKi8KKworCS8qCisJICoJQm9hcmQgbWVtb3J5IGFsbG9jYXRlZCBvbiBzdGFydHVwIGZvciB1c2UgYnkgaG9zdCwgdXN1YWxseQorCSAqCWZvciB0aGUgcHVycG9zZXMgb2YgY3JlYXRpbmcgRE1BIGNoYWluIGRlc2NyaXB0b3JzLiAgVGhlCisJICoJImxlbiIgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBwcm9jZXNzb3IgaXMgcmVsZWFzZWQuICBUaGUKKwkgKglhZGRyZXNzIG9mIHRoZSBhcmVhIGlzIHJldHVybmVkIGluIGJjX2hvc3RhcmVhLiAgVGhlIGFyZWEKKwkgKglpcyBndWFyYW50ZWVkIHRvIGJlIGFsaWduZWQgb24gYSAxNiBieXRlIGJvdW5kYXJ5LgorCSAqLworCVM0KHVsb25nLCBiY19ob3N0YXJlYV9sZW4pCS8qIFJXOiBOdW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUgKi8KKwlTNCh1Y2hhciAqLCBiY19ob3N0YXJlYSkJLyogUk86IEFkZHJlc3Mgb2YgYWxsb2NhdGVkIG1lbW9yeSAqLworCisJLyoKKwkgKglWYXJpYWJsZXMgZm9yIGNvbW11bmljYXRpbmcgZmlsdGVycyBpbnRvIHRoZSBib2FyZAorCSAqLworCVM0KHVsb25nICosIGJjX2ZpbHRlcl9hcmVhKQkvKiBSTzogU3BhY2UgdG8gcHV0IGZpbHRlciBpbnRvICovCisJUzQodWxvbmcsIGJjX2ZpbHRlcl9hcmVhX2xlbikJLyogUk86IExlbmd0aCBvZiBhcmVhLCBpbiBieXRlcyAqLworCVM0KGxvbmcsIGJjX2ZpbHRlcl9jbWQpCQkvKiBSVzogRmlsdGVyIGNvbW1hbmQsIHNlZSBiZWxvdyAqLworCVM0KHVsb25nLCBiY19maWx0ZXJfbGVuKQkvKiBSVzogQWN0dWFsIGxlbmd0aCBvZiBmaWx0ZXIgKi8KKwlTNCh1bG9uZywgYmNfZmlsdGVyX3BvcnQpCS8qIFJXOiBQb3J0ICMgZm9yIGZpbHRlciAwLi42ICovCisJUzQodWxvbmcsIGJjX2ZpbHRlcl9udW0pCS8qIFJXOiBGaWx0ZXIgIywgMD1pbnB1dCwgMT1vdXRwdXQgKi8KKworCS8qIG1vcmUgU05NUCBhZ2VudCBhZGRyZXNzZXMgKi8KKwlTMUEodWNoYXIsIGJjX2lwdHJhcCwgNCkgLyogSVAgYWRkcmVzcyBmb3IgU05NUCAqLworCisJUzRBKGxvbmcsIGJjX3NwYXJlLCAyKQkvKiBzcGFyZXMgKi8KK0VORF9TVFJVQ1QoYmlvc19jb21tKQorCisjZGVmaW5lCWJjCVZNTyhzdHJ1Y3QgYmlvc19jb21tLCAweGEzMDAwMTAwKQorCisvKgorICoJYmNfc3RhdHVzIHZhbHVlcworICovCisjZGVmaW5lCUJDX0lOSVQJMAorI2RlZmluZQlCQ19SVU4JMTAwCisKKy8qCisgKgliY19ob3N0IHZhbHVlcworICovCisjZGVmaW5lCUJDX0RJQUdTCS0xCisjZGVmaW5lIEJDX1NBU1dJVENICTAKKyNkZWZpbmUJQkNfU1dJVENICTEKKyNkZWZpbmUJQkNfTVVMVElOSUMJMgorCisvKgorICoJVmFsdWVzIGZvciBzcGV3IChkZWJ1Z2dpbmcpCisgKi8KKyNkZWZpbmUJQkNfU1BFV19FTkFCTEUJMHg4MDAwMDAwMAorCisvKgorICoJZmlsdGVyIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUJQkNfRklMVEVSX0VSUgktMQorI2RlZmluZQlCQ19GSUxURVJfT0sJMAorI2RlZmluZQlCQ19GSUxURVJfU0VUCTEKKyNkZWZpbmUJQkNfRklMVEVSX0NMUgkyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZ3JzX2VzNGguaCBiL2RyaXZlcnMvbmV0L2RncnNfZXM0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MThmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kZ3JzX2VzNGguaApAQCAtMCwwICsxLDE4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCWVzNGguaDoJSGFyZHdhcmUgZGVmaW5pdGlvbiBvZiB0aGUgRVMvNGggRXRoZXJuZXQgU3dpdGNoLCBmcm9tCSovCisvKgkJYm90aCB0aGUgaG9zdCBhbmQgdGhlIDMwNTEncyBwb2ludCBvZiB2aWV3LgkJKi8KKy8qCQlOT1RFOiB0aGlzIG5hbWUgaXMgYSBtaXNub21lciBub3cgdGhhdCB0aGVyZSBpcyBhIFBDSQkqLworLyoJCWJvYXJkLiAgRXZlcnl0aGluZyB0aGF0IHNheXMgImVzNGgiIHNob3VsZCByZWFsbHkgYmUJKi8KKy8qCQkic2U0Ii4gIEJ1dCB3ZSdsbCBrZWVwIHRoZSBvbGQgbmFtZSBmb3Igbm93LgkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCSRJZDogZXM0aC5oLHYgMS4xMCAxOTk2LzA4LzIyIDE3OjE2OjUzIHJpY2sgRXhwICQJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJRUlTQSBJL08gUmVnaXN0ZXJzLiAgVGhlc2UgYXJlIGxvY2F0ZWQgYXQgMHgxMDAwICogc2xvdC1udW1iZXIJKi8KKy8qCXBsdXMgdGhlIGluZGljYXRlZCBhZGRyZXNzLiAgSS5FLiAweDQwMDAtMHg0MDA5IGZvciBzbG90IDQuCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lCUVTNEhfTUFOVUZtc2IJMHgwMAkJLyogUmVhZC1vbmx5ICovCisjZGVmaW5lCUVTNEhfTUFOVUZsc2IJMHgwMQkJLyogUmVhZC1vbmx5ICovCisjCWRlZmluZSBFUzRIX01BTlVGX0NPREUJCTB4MTA0OQkvKiA9ICJEQkkiICovCisKKyNkZWZpbmUJRVM0SF9QUk9EVUNUCTB4MDIJCS8qIFJlYWQtb25seSAqLworIwlkZWZpbmUgRVM0SF9QUk9EVUNUX0NPREUJMHgwQQorIwlkZWZpbmUgRVBDX1BST0RVQ1RfQ09ERQkJMHgwMworCisjZGVmaW5lCUVTNEhfUkVWSVNJT04JMHgwMwkJLyogUmVhZC1vbmx5ICovCisjCWRlZmluZSBFUzRIX1JFVklTSU9OX0NPREUJMHgwMQorCisjZGVmaW5lCUVTNEhfRUMJCTB4MDQJCS8qIEVJU0EgQ29udHJvbCAqLworIwlkZWZpbmUgRVM0SF9FQ19SRVNFVAkJMHgwNAkvKiBXTywgRUlTQSByZXNldCAqLworIwlkZWZpbmUgRVM0SF9FQ19FTkFCTEUJCTB4MDEJLyogUlcsIEVJU0EgZW5hYmxlIC0gc2V0IHRvICovCisJCQkJCQkvKiAxIGJlZm9yZSBtZW1vcnkgZW5hYmxlICovCisjZGVmaW5lCUVTNEhfUEMJCTB4MDUJCS8qIFByb2Nlc3NvciBDb250cm9sICovCisjCWRlZmluZSBFUzRIX1BDX1JFU0VUCQkweDA0CS8qIFJXLCAzMDUxIHJlc2V0ICovCisjCWRlZmluZSBFUzRIX1BDX0lOVAkJMHgwOAkvKiBXTywgYXNzZXJ0IDMwNTEgaW50ci4gMyAqLworCisjZGVmaW5lCUVTNEhfTVcJCTB4MDYJCS8qIE1lbW9yeSBXaW5kb3cgc2VsZWN0IGFuZCBlbmFibGUgKi8KKyMJZGVmaW5lIEVTNEhfTVdfRU5BQkxFCQkweDgwCS8qIFdPLCBlbmFibGUgbWVtb3J5ICovCisjCWRlZmluZSBFUzRIX01XX1NFTEVDVF9NQVNLCTB4MWYJLyogV08sIDMyayB3aW5kb3cgc2VsZWN0ZWQgKi8KKworI2RlZmluZQlFUzRIX0lTCQkweDA3CQkvKiBJbnRlcnJ1cHQsIGFkZHIgc2VsZWN0ICovCisjCWRlZmluZSBFUzRIX0lTX0lOVE1BU0sJCTB4MDcJLyogV08sIGludGVycnVwdCBzZWxlY3QgKi8KKyMJZGVmaW5lIEVTNEhfSVNfSU5UT0ZGCQkweDAwCQkvKiBObyBJUlEgKi8KKyMJZGVmaW5lIEVTNEhfSVNfSU5UMwkJMHgwMwkJLyogSVJRIDMgKi8KKyMJZGVmaW5lIEVTNEhfSVNfSU5UNQkJMHgwMgkJLyogSVJRIDUgKi8KKyMJZGVmaW5lIEVTNEhfSVNfSU5UNwkJMHgwMQkJLyogSVJRIDcgKi8KKyMJZGVmaW5lIEVTNEhfSVNfSU5UMTAJCTB4MDQJCS8qIElSUSAxMCAqLworIwlkZWZpbmUgRVM0SF9JU19JTlQxMQkJMHgwNQkJLyogSVJRIDExICovCisjCWRlZmluZSBFUzRIX0lTX0lOVDEyCQkweDA2CQkvKiBJUlEgMTIgKi8KKyMJZGVmaW5lIEVTNEhfSVNfSU5UMTUJCTB4MDcJCS8qIElSUSAxNSAqLworIwlkZWZpbmUgRVM0SF9JU19JTlRBQ0sJCTB4MTAJLyogV08sIGludGVycnVwdCBhY2sgKi8KKyMJZGVmaW5lIEVTNEhfSVNfSU5UUEVORAkJMHgxMAkvKiBSTywgaW50ZXJydXB0IHBlbmRpbmcgKi8KKyMJZGVmaW5lIEVTNEhfSVNfTElORUFSCQkweDQwCS8qIFdPLCBubyBtZW1vcnkgd2luZG93aW5nICovCisjCWRlZmluZSBFUzRIX0lTX0FTMTUJCTB4ODAJLyogUlcsIGFkZHJlc3Mgc2VsZWN0IGJpdCAxNSAqLworCisjZGVmaW5lCUVTNEhfQVNfMjNfMTYJMHgwOAkJLyogQWRkcmVzcyBzZWxlY3QgYml0cyAyMy0xNiAqLworI2RlZmluZQlFUzRIX0FTXzMxXzI0CTB4MDkJCS8qIEFkZHJlc3Mgc2VsZWN0IGJpdHMgMzEtMjQgKi8KKworI2RlZmluZSBFUzRIX0lPX01BWAkJMHgwOQkJLyogU2l6ZSBvZiBJL08gc3BhY2UgKi8KKworLyoKKyAqIFBDSQorICovCisjZGVmaW5lIFNFNl9SRVNFVAkJUExYX1VTRVJPVVQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCTMwNTEgTWVtb3J5IE1hcAkJCQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoJTm90ZTogMzA1MSBoYXMgNEsgSS1jYWNoZSwgMksgRC1jYWNoZS4gIDEgY3ljbGUgaXMgNTAgbnNlYy4JKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCVNFNF9OUE9SVFMJCTQJCS8qICMgb2YgZXRoZXJuZXQgcG9ydHMgKi8KKyNkZWZpbmUJU0U2X05QT1JUUwkJNgkJLyogIyBvZiBldGhlcm5ldCBwb3J0cyAqLworI2RlZmluZQlTRV9OUE9SVFMJCTYJCS8qIE1heCAjIG9mIGV0aGVybmV0IHBvcnRzICovCisKKyNkZWZpbmUJRVM0SF9SQU1fQkFTRQkJMHg4MzAwMDAwMAkvKiBCYXNlIGFkZHJlc3Mgb2YgUkFNICovCisjZGVmaW5lCUVTNEhfUkFNX1NJWkUJCTB4MDAyMDAwMDAJLyogU2l6ZSBvZiBSQU0gKDJNQikgKi8KKyNkZWZpbmUJRVM0SF9SQU1fSU5UQkFTRQkweDgzODAwMDAwCS8qIEJhc2Ugb2YgaW50LW9uLXdyaXRlIFJBTSAqLworCQkJCQkJLyogYS5rLmEuIFBLVCBSQU0gKi8KKworCQkJCQkJLyogRXRoZXJuZXQgY29udHJvbGxlcnMgKi8KKwkJCQkJCS8qIFNlZTogaTgyNTk2LmggKi8KKyNkZWZpbmUJRVM0SF9FVEhFUjBfUE9SVAkweEEyMDAwMDAwCisjZGVmaW5lCUVTNEhfRVRIRVIwX0NNRAkJMHhBMjAwMDEwMAorI2RlZmluZQlFUzRIX0VUSEVSMV9QT1JUCTB4QTIwMDAyMDAKKyNkZWZpbmUJRVM0SF9FVEhFUjFfQ01ECQkweEEyMDAwMzAwCisjZGVmaW5lCUVTNEhfRVRIRVIyX1BPUlQJMHhBMjAwMDQwMAorI2RlZmluZQlFUzRIX0VUSEVSMl9DTUQJCTB4QTIwMDA1MDAKKyNkZWZpbmUJRVM0SF9FVEhFUjNfUE9SVAkweEEyMDAwNjAwCisjZGVmaW5lCUVTNEhfRVRIRVIzX0NNRAkJMHhBMjAwMDcwMAorI2RlZmluZQlFUzRIX0VUSEVSNF9QT1JUCTB4QTIwMDA4MDAJLyogUlMgU0UtNiBvbmx5ICovCisjZGVmaW5lCUVTNEhfRVRIRVI0X0NNRAkJMHhBMjAwMDkwMAkvKiBSUyBTRS02IG9ubHkgKi8KKyNkZWZpbmUJRVM0SF9FVEhFUjVfUE9SVAkweEEyMDAwQTAwCS8qIFJTIFNFLTYgb25seSAqLworI2RlZmluZQlFUzRIX0VUSEVSNV9DTUQJCTB4QTIwMDBCMDAJLyogUlMgU0UtNiBvbmx5ICovCisKKyNkZWZpbmUJRVM0SF9JODI1NAkJMHhBMjA0MDAwMAkvKiA4MkM1NCB0aW1lcnMgKi8KKwkJCQkJCS8qIFNlZTogaTgyNTQuaCAqLworCisjZGVmaW5lCVNFNF9JODI1NF9IWgkJKDIzMDAwMDAwLzQpCS8qIEVJU0EgY2xvY2sgaW5wdXQgZnJlcS4gKi8KKyNkZWZpbmUJU0U0X0lEVF9IWgkJKDQ2MDAwMDAwKQkvKiBFSVNBIENQVSBmcmVxLiAqLworI2RlZmluZQlTRTZfSTgyNTRfSFoJCSgyMDAwMDAwMC80KQkvKiBQQ0kgY2xvY2sgaW5wdXQgZnJlcS4gKi8KKyNkZWZpbmUJU0U2X0lEVF9IWgkJKDUwMDAwMDAwKQkvKiBQQ0kgQ1BVIGZyZXEuICovCisjZGVmaW5lCUVTNEhfSTgyNTRfSFoJCSgyMzAwMDAwMC80KQkvKiBFSVNBIGNsb2NrIGlucHV0IGZyZXEuICovCisKKyNkZWZpbmUJRVM0SF9HUFAJCTB4QTIwNTAwMDAJLyogR2VuZXJhbCBwdXJwb3NlIHBvcnQgKi8KKwkvKgorCSAqIFNFLTQgKEVJU0EpIEdQUCBiaXRzCisJICovCisjCWRlZmluZSBFUzRIX0dQUF9DMF8xMDAJCTB4MDAwMQkvKiBXTywgQ2hhbiAwOiAxMDAgb2htIFRQICovCisjCWRlZmluZSBFUzRIX0dQUF9DMF9TUUUJCTB4MDAwMgkvKiBXTywgQ2hhbiAwOiBub3JtYWwgc3F1ZWxjaCAqLworIwlkZWZpbmUgRVM0SF9HUFBfQzFfMTAwCQkweDAwMDQJLyogV08sIENoYW4gMTogMTAwIG9obSBUUCAqLworIwlkZWZpbmUgRVM0SF9HUFBfQzFfU1FFCQkweDAwMDgJLyogV08sIENoYW4gMTogbm9ybWFsIHNxdWVsY2ggKi8KKyMJZGVmaW5lIEVTNEhfR1BQX0MyXzEwMAkJMHgwMDEwCS8qIFdPLCBDaGFuIDI6IDEwMCBvaG0gVFAgKi8KKyMJZGVmaW5lIEVTNEhfR1BQX0MyX1NRRQkJMHgwMDIwCS8qIFdPLCBDaGFuIDI6IG5vcm1hbCBzcXVlbGNoICovCisjCWRlZmluZSBFUzRIX0dQUF9DM18xMDAJCTB4MDA0MAkvKiBXTywgQ2hhbiAzOiAxMDAgb2htIFRQICovCisjCWRlZmluZSBFUzRIX0dQUF9DM19TUUUJCTB4MDA4MAkvKiBXTywgQ2hhbiAzOiBub3JtYWwgc3F1ZWxjaCAqLworIwlkZWZpbmUgRVM0SF9HUFBfU1FFCQkweDAwQUEJLyogV08sIEFsbDogbm9ybWFsIHNxdWVsY2ggKi8KKyMJZGVmaW5lIEVTNEhfR1BQXzEwMAkJMHgwMDU1CS8qIFdPLCBBbGw6IDEwMCBvaG0gVFAgKi8KKyMJZGVmaW5lIEVTNEhfR1BQX0hPU1RJTlQJCTB4MDEwMAkvKiBSTywgY2F1c2UgaW50ci4gdG8gaG9zdCAqLworCQkJCQkJLyogSG9sZCBoaWdoID4gMjUwIG5zZWMgKi8KKyMJZGVmaW5lIFNFNF9HUFBfRUVECQkweDAyMDAJLyogUlcsIEVFUFJPTSBkYXRhIGJpdCAqLworIwlkZWZpbmUgU0U0X0dQUF9FRUNTCQkweDA0MDAJLyogUlcsIEVFUFJPTSBjaGlwIHNlbGVjdCAqLworIwlkZWZpbmUgU0U0X0dQUF9FRUNLCQkweDA4MDAJLyogUlcsIEVFUFJPTSBjbG9jayAqLworCisJLyoKKwkgKiBTRS02IChQQ0kpIEdQUCBiaXRzCisJICovCisjCWRlZmluZSBTRTZfR1BQX0VFRAkJMHgwMDAxCS8qIFJXLCBFRVBST00gZGF0YSBiaXQgKi8KKyMJZGVmaW5lIFNFNl9HUFBfRUVDUwkJMHgwMDAyCS8qIFJXLCBFRVBST00gY2hpcCBzZWxlY3QgKi8KKyMJZGVmaW5lIFNFNl9HUFBfRUVDSwkJMHgwMDA0CS8qIFJXLCBFRVBST00gY2xvY2sgKi8KKyMJZGVmaW5lIFNFNl9HUFBfTElOSwkJMHgwMGZjCS8qIFIsIExpbmsgc3RhdHVzIExFRHMgKi8KKworI2RlZmluZQlFUzRIX0lOVFZFQwkJMHhBMjA2MDAwMAkvKiBSTzogSW50ZXJydXB0IFZlY3RvciAqLworIwlkZWZpbmUgRVM0SF9JVl9ETUEwCQkweDAxCS8qIENoYW4gMCBETUEgaW50ZXJydXB0ICovCisjCWRlZmluZSBFUzRIX0lWX1BLVDAJCTB4MDIJLyogQ2hhbiAwIFBLVCBpbnRlcnJ1cHQgKi8KKyMJZGVmaW5lIEVTNEhfSVZfRE1BMQkJMHgwNAkvKiBDaGFuIDEgRE1BIGludGVycnVwdCAqLworIwlkZWZpbmUgRVM0SF9JVl9QS1QxCQkweDA4CS8qIENoYW4gMSBQS1QgaW50ZXJydXB0ICovCisjCWRlZmluZSBFUzRIX0lWX0RNQTIJCTB4MTAJLyogQ2hhbiAyIERNQSBpbnRlcnJ1cHQgKi8KKyMJZGVmaW5lIEVTNEhfSVZfUEtUMgkJMHgyMAkvKiBDaGFuIDIgUEtUIGludGVycnVwdCAqLworIwlkZWZpbmUgRVM0SF9JVl9ETUEzCQkweDQwCS8qIENoYW4gMyBETUEgaW50ZXJydXB0ICovCisjCWRlZmluZSBFUzRIX0lWX1BLVDMJCTB4ODAJLyogQ2hhbiAzIFBLVCBpbnRlcnJ1cHQgKi8KKworI2RlZmluZQlFUzRIX0lOVEFDSwkJMHhBMjA2MDAwMAkvKiBXTzogSW50ZXJydXB0IEFjayAqLworIwlkZWZpbmUgRVM0SF9JTlRBQ0tfODI1NAkJMHgwMQkvKiBSZWFsIFRpbWUgQ2xvY2sgKGludCAwKSAqLworIwlkZWZpbmUgRVM0SF9JTlRBQ0tfSE9TVAkJMHgwMgkvKiBIb3N0IChpbnQgMSkgKi8KKyMJZGVmaW5lIEVTNEhfSU5UQUNLX1BLVDAJCTB4MDQJLyogQ2hhbiAwIFBrdCAoaW50IDIpICovCisjCWRlZmluZSBFUzRIX0lOVEFDS19QS1QxCQkweDA4CS8qIENoYW4gMSBQa3QgKGludCAzKSAqLworIwlkZWZpbmUgRVM0SF9JTlRBQ0tfUEtUMgkJMHgxMAkvKiBDaGFuIDIgUGt0IChpbnQgNCkgKi8KKyMJZGVmaW5lIEVTNEhfSU5UQUNLX1BLVDMJCTB4MjAJLyogQ2hhbiAzIFBrdCAoaW50IDUpICovCisKKyNkZWZpbmUJU0U2X1BMWAkJCTB4QTIwNzAwMDAJLyogUExYIDkwNjAsIFNFLTYgKFBDSSkgb25seSAqLworCQkJCQkJLyogc2VlIHBseDkwNjAuaCAqLworCisjZGVmaW5lCVNFNl9QQ0lfVkVORE9SX0lECTB4MTE0RgkJLyogRGlnaSBQQ0kgdmVuZG9yIElEICovCisjZGVmaW5lCVNFNl9QQ0lfREVWSUNFX0lECTB4MDAwMwkJLyogUlMgU0UtNiBkZXZpY2UgSUQgKi8KKyNkZWZpbmUJU0U2X1BDSV9JRAkJKChTRTZfUENJX0RFVklDRV9JRDw8MTYpIHwgU0U2X1BDSV9WRU5ET1JfSUQpCisKKy8qCisgKglJRFQgSW50ZXJydXB0cworICovCisjZGVmaW5lCUVTNEhfSU5UXzgyNTQJCUlEVF9JTlQwCisjZGVmaW5lCUVTNEhfSU5UX0hPU1QJCUlEVF9JTlQxCisjZGVmaW5lCUVTNEhfSU5UX0VUSEVSMAkJSURUX0lOVDIKKyNkZWZpbmUJRVM0SF9JTlRfRVRIRVIxCQlJRFRfSU5UMworI2RlZmluZQlFUzRIX0lOVF9FVEhFUjIJCUlEVF9JTlQ0CisjZGVmaW5lCUVTNEhfSU5UX0VUSEVSMwkJSURUX0lOVDUKKworLyoKKyAqCUJlY2F1c2UgdGhlcmUgYXJlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIFNFLTQgYW5kIHRoZSBTRS02LAorICoJd2UgYXNzdW1lIHRoYXQgdGhlIGZvbGxvd2luZyBnbG9iYWxzIHdpbGwgYmUgc2V0IHVwIGF0IGluaXQKKyAqCXRpbWUgaW4gbWFpbi5jIHRvIGNvbnRhaW50IHRoZSBhcHByb3ByaWF0ZSBjb25zdGFudHMgZnJvbSBhYm92ZQorICovCitleHRlcm4gdXNob3J0CUdwcDsJCS8qIFNvZnRjb3B5IG9mIEdQUCByZWdpc3RlciAqLworZXh0ZXJuIHVzaG9ydAlFRWNrOwkJLyogQ2xvY2sgYml0ICovCitleHRlcm4gdXNob3J0CUVFY3M7CQkvKiBDUyBiaXQgKi8KK2V4dGVybiB1c2hvcnQJRUVkOwkJLyogRGF0YSBiaXQgKi8KK2V4dGVybiB1bG9uZwlJODI1NF9IejsJLyogaTgyNTQgaW5wdXQgZnJlcXVlbmN5ICovCitleHRlcm4gdWxvbmcJSURUX0h6OwkJLyogSURUIENQVSBmcmVxdWVuY3kgKi8KK2V4dGVybiBpbnQJTnBvcnRzOwkJLyogTnVtYmVyIG9mIGV0aGVybmV0IGNvbnRyb2xsZXJzICovCitleHRlcm4gaW50CU5jaGFuOwkJLyogTnBvcnRzKzEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RncnNfZXRoZXIuaCBiL2RyaXZlcnMvbmV0L2RncnNfZXRoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTU5NmNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZGdyc19ldGhlci5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICoJQSBmaWx0ZXJpbmcgZnVuY3Rpb24uICBUaGVyZSBhcmUgdHdvIGZpbHRlcnMvcG9ydC4gIEZpbHRlciAiMCIKKyAqCWlzIHRoZSBpbnB1dCBmaWx0ZXIsIGFuZCBmaWx0ZXIgIjEiIGlzIHRoZSBvdXRwdXQgZmlsdGVyLgorICovCit0eXBlZGVmIGludCAoRklMVEVSX0ZVTkMpKHVjaGFyICpwa3RwLCBpbnQgcGt0bGVuLCB1bG9uZyAqc2NyYXRjaCwgaW50IHBvcnQpOworI2RlZmluZQlORklMVEVSUwkyCisKKy8qCisgKglUaGUgcGVyIHBvcnQgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisJaW50CQljaGFuOwkJLyogQ2hhbm5lbCBudW1iZXIgKDAtMykgKi8KKwl1bG9uZwkJcG9ydGFkZHI7CS8qIGFkZHJlc3Mgb2YgNTk2IHBvcnQgcmVnaXN0ZXIgKi8KKwl2b2xhdGlsZSB1bG9uZwkqY2E7CQkvKiBhZGRyZXNzIG9mIDU5NiBjaGFuIGF0dGVudGlvbiAqLworCXVsb25nCQlpbnRtYXNrOwkvKiBJbnRlcnJ1cHQgbWFzayBmb3IgdGhpcyBwb3J0ICovCisJdWxvbmcJCWludGFjazsJCS8qIEFjayBiaXQgZm9yIHRoaXMgcG9ydCAqLworCisJdWNoYXIJCWV0aGFkZHJbNl07CS8qIEV0aGVybmV0IGFkZHJlc3Mgb2YgdGhpcyBwb3J0ICovCisJaW50CQlpc19wcm9taXNjOwkvKiBQb3J0IGlzIHByb21pc2N1b3VzICovCisKKwlpbnQJCWRlYnVnOwkJLyogRGVidWdnaW5nIHR1cm5lZCBvbiAqLworCisJSTU5Nl9JU0NQCSppc2NwcDsJCS8qIFVuY2FjaGVkIElTQ1AgcG9pbnRlciAqLworCUk1OTZfU0NQCSpzY3BwOwkJLyogVW5jYWNoZWQgU0NQIHBvaW50ZXIgKi8KKwlJNTk2X1NDQgkqc2NicDsJCS8qIFVuY2FjaGVkIFNDQiBwb2ludGVyICovCisKKwlJNTk2X0lTQ1AJaXNjcDsKKwlJNTk2X1NDQglzY2I7CisKKwkvKiBDb21tYW5kIFF1ZXVlICovCisJSTU5Nl9DQgkJKmNiMDsKKwlJNTk2X0NCCQkqY2JOOworCUk1OTZfQ0IJCSpjYl9oZWFkOworCUk1OTZfQ0IJCSpjYl90YWlsOworCisJLyogUmVjZWl2ZSBRdWV1ZSAqLworCUk1OTZfUkZECSpyZmQwOworCUk1OTZfUkZECSpyZmROOworCUk1OTZfUkZECSpyZmRfaGVhZDsKKwlJNTk2X1JGRAkqcmZkX3RhaWw7CisKKwkvKiBSZWNlaXZlIEJ1ZmZlcnMgKi8KKwlJNTk2X1JCRAkqcmJkMDsKKwlJNTk2X1JCRAkqcmJkTjsKKwlJNTk2X1JCRAkqcmJkX2hlYWQ7CisJSTU5Nl9SQkQJKnJiZF90YWlsOworCWludAkJYnVmX3NpemU7CS8qIFNpemUgb2YgYW4gUkJEIGJ1ZmZlciAqLworCWludAkJYnVmX2NudDsJLyogVG90YWwgUkJEJ3MgYWxsb2NhdGVkICovCisKKwkvKiBSeCBTdGF0aXN0aWNzICovCisJdWxvbmcJCWNudF9yeF9jbnQ7CS8qIFRvdGFsIHBhY2tldHMgcmN2ZCwgZ29vZCBhbmQgYmFkICovIAorCXVsb25nCQljbnRfcnhfZ29vZDsJLyogVG90YWwgZ29vZCBwYWNrZXRzIHJjdmQgKi8KKwl1bG9uZwkJY250X3J4X2JhZDsJLyogVG90YWwgb2YgYWxsIGJhZCBwYWNrZXRzIHJjdmQgKi8KKwkJCQkJLyogU3VidG90YWxzIGNhbiBiZSBnb3R0ZW4gZnJvbSBTQ0IgKi8KKwl1bG9uZwkJY250X3J4X25vcmVzOwkvKiBObyByZXNvdXJjZXMgKi8KKwl1bG9uZwkJY250X3J4X2J5dGVzOwkvKiBUb3RhbCBieXRlcyByY3ZkICovCisKKwkvKiBUeCBTdGF0aXN0aWNzICovCisJdWxvbmcJCWNudF90eF9xdWV1ZWQ7CisJdWxvbmcJCWNudF90eF9kb25lOworCXVsb25nCQljbnRfdHhfZnJlZWQ7CisJdWxvbmcJCWNudF90eF9ub3JlczsJLyogTm8gcmVzb3VyY2VzICovCisKKwl1bG9uZwkJY250X3R4X2JhZDsKKwl1bG9uZwkJY250X3R4X2Vycl9sYXRlOworCXVsb25nCQljbnRfdHhfZXJyX25vY3JzOworCXVsb25nCQljbnRfdHhfZXJyX25vY3RzOworCXVsb25nCQljbnRfdHhfZXJyX3VuZGVyOworCXVsb25nCQljbnRfdHhfZXJyX21heGNvbDsKKwl1bG9uZwkJY250X3R4X2NvbGxpc2lvbnM7CisKKwkvKiBTcGVjaWFsIHN0dWZmIGZvciBob3N0ICovCisjCWRlZmluZQkJcmZkX2ZyZWVkCWNudF9yeF9jbnQKKwl1bG9uZwkJcmJkX2ZyZWVkOworCWludAkJaG9zdF90aW1lcjsKKworCS8qIEFkZGVkIGFmdGVyIGZpcnN0IGJldGEgKi8KKwl1bG9uZwkJY250X3R4X3JhY2VzOwkvKiBDb3VudHMgcmFjZSBjb25kaXRpb25zICovCisJaW50CQlzcGFuc3RhdGU7CisJdWxvbmcJCWNudF9zdF90eDsJLyogc2VuZCBzcGFuIHRyZWUgcGt0cyAqLworCXVsb25nCQljbnRfc3RfZmFpbF90eDsJLyogRmFpbHVyZXMgdG8gc2VuZCBzcGFuIHRyZWUgcGt0cyAqLworCXVsb25nCQljbnRfc3RfZmFpbF9yYmQ7LyogRmFpbHVyZXMgdG8gc2VuZCBzcGFuIHRyZWUgcGt0cyAqLworCXVsb25nCQljbnRfc3Rfcng7CS8qIHJjdiBzcGFuIHRyZWUgcGt0cyAqLworCXVsb25nCQljbnRfc3RfcnhfYmFkOwkvKiBib2d1cyBzdCBwYWNrZXRzIHJjdmQgKi8KKwl1bG9uZwkJY250X3J4X2Z3ZDsJLyogUmN2ZCBwYWNrZXRzIHRoYXQgd2VyZSBmb3J3YXJkZWQgKi8KKworCXVsb25nCQljbnRfcnhfbWNhc3Q7CS8qIE11bHRpY2FzdCBwa3RzIHJlY2VpdmVkICovCisJdWxvbmcJCWNudF90eF9tY2FzdDsJLyogTXVsdGljYXN0IHBrdHMgdHJhbnNtaXR0ZWQgKi8KKwl1bG9uZwkJY250X3R4X2J5dGVzOwkvKiBCeXRlcyB0cmFuc21pdHRlZCAqLworCisJLyoKKwkgKglQYWNrZXQgZmlsdGVyaW5nCisJICoJRmlsdGVyIDA6IGlucHV0IGZpbHRlcgorCSAqCUZpbHRlciAxOiBvdXRwdXQgZmlsdGVyCisJICovCisJCisJdWxvbmcJCSpmaWx0ZXJfc3BhY2VbTkZJTFRFUlNdOworCUZJTFRFUl9GVU5DCSpmaWx0ZXJfZnVuY1tORklMVEVSU107CisJdWxvbmcJCWZpbHRlcl9jbnRbTkZJTFRFUlNdOworCXVsb25nCQlmaWx0ZXJfbGVuW05GSUxURVJTXTsKKworCXVsb25nCQlwYWRbICg1MTItMzAwKSAvIDRdOworfSBQT1JUOworCisvKgorICoJUG9ydFswXQkJCWlzIGhvc3QgaW50ZXJmYWNlCisgKglQb3J0WzEuLlNFX05QT1JUU10JYXJlIGV4dGVybmFsIDEwIEJhc2UgVCBwb3J0cy4gIEZld2VyIG1heSBiZSBpbgorICoJCQkJdXNlLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGlzIGlzIGFuIFNFLTQgb3IKKyAqCQkJCWFuIFNFLTYuCisgKglQb3J0W1NFX05QT1JUU10JCVBzZXVkby1wb3J0IGZvciBTcGFubmluZyB0cmVlIGFuZCBTTk1QCisgKi8KK2V4dGVybiBQT1JUCVBvcnRbMStTRV9OUE9SVFMrMV07CisKK2V4dGVybiBpbnQJTnBvcnRzOwkJLyogTnVtYmVyIG9mIGdlbnVpbmUgZXRoZXJuZXQgY29udHJvbGxlcnMgKi8KK2V4dGVybiBpbnQJTmNoYW47CQkvKiAuLi4gcGx1cyBvbmUgZm9yIGhvc3QgaW50ZXJmYWNlICovCisKK2V4dGVybiBpbnQJRmlyc3RDaGFuOwkvKiAwIG9yIDEsIGRlcGVkbmluZyBvbiB3aGV0aGVyIGhvc3QgaXMgdXNlZCAqLworZXh0ZXJuIGludAlOdW1DaGFuOwkvKiA0IG9yIDUgKi8KKworLyoKKyAqCUEgZmV3IGdsb2JhbHMKKyAqLworZXh0ZXJuIGludAlJc1Byb21pc2M7CitleHRlcm4gaW50CU11bHRpTmljTW9kZTsKKworLyoKKyAqCUZ1bmN0aW9ucworICovCitleHRlcm4gdm9pZAlldGhfeG1pdF9zcGV3X29uKFBPUlQgKnAsIGludCBjbnQpOworZXh0ZXJuIHZvaWQJZXRoX3htaXRfc3Bld19vZmYoUE9SVCAqcCk7CisKK2V4dGVybiBJNTk2X1JCRAkqYWxsb2NfcmJkcyhQT1JUICpwLCBpbnQgbnVtKTsKKworZXh0ZXJuIEk1OTZfQ0IgKiBldGhfY2JfYWxsb2MoUE9SVCAqcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZ3JzX2Zpcm13YXJlLmMgYi9kcml2ZXJzL25ldC9kZ3JzX2Zpcm13YXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0OWUxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RncnNfZmlybXdhcmUuYwpAQCAtMCwwICsxLDk5NjYgQEAKK3N0YXRpYyBpbnQgZGdyc19maXJtbnVtID0gNTUwOworc3RhdGljIGNoYXIgZGdyc19maXJtdmVyW10gPSAiJFZlcnNpb24kIjsKK3N0YXRpYyBjaGFyIGRncnNfZmlybWRhdGVbXSA9ICIxMS8xNi85NiAwMzo0NToxNSI7CitzdGF0aWMgdW5zaWduZWQgY2hhciBkZ3JzX2NvZGVbXSBfX2luaXRkYXRhID0geworCTIxMyw1LDE5Miw4LDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsNjQsNDAsMzUsNDEsCisJMTAxLDExNSw1MiwxMDQsNDYsOTgsMTA1LDExMCwzMiwzMiwzMiwzMiwKKwkzMiwzMiw0OSw0Niw0OCwzMiw0OCw0OCw0Nyw0OCw0OCw0NywKKwk1Nyw1MiwwLDY0LDQwLDM1LDQxLDY3LDExMSwxMTIsMTIxLDExNCwKKwkxMDUsMTAzLDEwNCwxMTYsMzIsNDksNTcsNTcsNTMsNDQsMzIsNjgsCisJMTA1LDEwMywxMDUsMzIsNzMsMTEwLDExNiwxMDEsMTE0LDExMCw5NywxMTYsCisJMTA1LDExMSwxMTAsOTcsMTA4LDQ2LDMyLDMyLDY1LDEwOCwxMDgsMzIsCisJODIsMTA1LDEwMywxMDQsMTE2LDExNSwzMiw4MiwxMDEsMTE1LDEwMSwxMTQsCisJMTE4LDEwMSwxMDAsNDYsMCwwLDAsMCw5Nyw1LDE5Miw4LAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDI1NSwwLDE2LDAsMCwwLDAsCisJMCwwLDAsMCw4LDAsMjI0LDMsMCwwLDAsMCwKKwkxNDgsMjU1LDE4OSwzOSwxNiwwLDE2MSwxNzUsMjAsMCwxNjIsMTc1LAorCTI0LDAsMTYzLDE3NSwyOCwwLDE2NCwxNzUsMzIsMCwxNjUsMTc1LAorCTM2LDAsMTY2LDE3NSw0MCwwLDE2NywxNzUsNDQsMCwxNjgsMTc1LAorCTQ4LDAsMTY5LDE3NSw1MiwwLDE3MCwxNzUsNTYsMCwxNzEsMTc1LAorCTYwLDAsMTcyLDE3NSw2NCwwLDE3MywxNzUsNjgsMCwxNzQsMTc1LAorCTcyLDAsMTc1LDE3NSw3NiwwLDE4NCwxNzUsODAsMCwxODUsMTc1LAorCTg4LDAsMTkwLDE3NSw5MiwwLDE5MSwxNzUsMCwxMTIsOCw2NCwKKwkxOCw3MiwwLDAsMTYsODAsMCwwLDAsOTYsMTEsNjQsCisJODQsMCwxNjgsMTc1LDk2LDAsMTY5LDE3NSwxMDAsMCwxNzAsMTc1LAorCTEwNCwwLDE3MSwxNzUsMzMsNTYsMCwxLDAsMTMxLDI0LDYwLAorCTAsMSwyNCwzOSwwLDAsOCwxNDMsMCwwLDAsMCwKKwkxLDAsOCwzMywwLDAsOCwxNzUsMCwxMDQsNSw2NCwKKwkwLDk2LDYsNjQsMTI0LDAsMTY4LDQ4LDIxMiwyNTUsMCwyMSwKKwkwLDAsMCwwLDM2LDY0LDE2NiwwLDAsMjU1LDgsNDksCisJMjcsMCwwLDE3LDAsMCwwLDAsMTMwLDY1LDgsMCwKKwkyLDEzMSw5LDYwLDMzLDcyLDQwLDEsMCwyMjAsNDEsMTQxLAorCTY2LDY0LDgsMCwyLDEzMSwxMCw2MCwzMyw4MCw3MiwxLAorCTAsMjI0LDc0LDE0MSwwLDAsMCwwLDM4LDgwLDcwLDEsCisJMSwyNTUsNzQsNDksMzMsNDAsMTkyLDAsMzgsNDgsMjAyLDAsCisJMCw5NiwxMzQsNjQsNjYsNjQsOCwwLDIsMTMxLDQsNjAsCisJMzMsMzIsMTM2LDAsMCwyMjYsMTMyLDE0NCw5LDI0OCwzMiwxLAorCTAsMCwwLDAsMTA0LDAsMTY2LDE0MywwLDAsMCwwLAorCTAsOTYsMTM0LDY0LDAsMTA0LDUsNjQsMjI3LDI1NSwwLDE2LAorCTAsMCwwLDAsMTA0LDAsMTY4LDE0Myw5NiwwLDE2OSwxNDMsCisJMTAwLDAsMTcwLDE0MywwLDAsMCwwLDAsOTYsMTM2LDY0LAorCTE5LDAsMzIsMSwxNywwLDY0LDEsMjAsMCwxNjIsMTQzLAorCTI0LDAsMTYzLDE0MywyOCwwLDE2NCwxNDMsMzIsMCwxNjUsMTQzLAorCTM2LDAsMTY2LDE0Myw0MCwwLDE2NywxNDMsNDQsMCwxNjgsMTQzLAorCTQ4LDAsMTY5LDE0Myw1MiwwLDE3MCwxNDMsNTYsMCwxNzEsMTQzLAorCTYwLDAsMTcyLDE0Myw2NCwwLDE3MywxNDMsNjgsMCwxNzQsMTQzLAorCTcyLDAsMTc1LDE0Myw3NiwwLDE4NCwxNDMsODAsMCwxODUsMTQzLAorCTg4LDAsMTkwLDE0Myw5MiwwLDE5MSwxNDMsMCwwLDAsMCwKKwk4NCwwLDE4NiwxNDMsMTYsMCwxNjEsMTQzLDEwOCwwLDE4OSwzOSwKKwk4LDAsNjQsMywxNiwwLDAsNjYsMCw5NiwyNiw2NCwKKwkwLDAsMCwwLDI1NSwyNTUsMjcsNjAsMjU0LDAsMTIzLDU1LAorCTAsMCwwLDAsMzYsMjA4LDkxLDMsMCwwLDAsMCwKKwkwLDk2LDE1NCw2NCwwLDAsMCwwLDAsMTEyLDI2LDY0LAorCTAsMCwwLDAsMTYsMCwwLDY2LDAsMCwwLDAsCisJOCwwLDY0LDMsMCwwLDAsMCwyNTUsMjU1LDgsMzYsCisJMTMzLDI1NSwwLDE3LDAsMCwwLDAsMSwwLDgsMzcsCisJMTMwLDI1NSwwLDIxLDAsMCwwLDAsMjU1LDI1NSw4LDM2LAorCTMzLDgsMCwxLDEyNiwyNTUsNDAsMjAsMCwwLDAsMCwKKwkxLDAsMzMsMzYsMTIzLDI1NSwzMiwyMCwwLDAsMCwwLAorCTI1NSwyNTUsMiwzNiwxMjAsMjU1LDcyLDIwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDExNywyNTUsNjQsMjAsMCwwLDAsMCwKKwkyNTUsMjU1LDMsMzYsMTE0LDI1NSwxMDQsMjAsMCwwLDAsMCwKKwkxLDAsOTksMzYsMTExLDI1NSw5NiwyMCwwLDAsMCwwLAorCTI1NSwyNTUsNCwzNiwxMDgsMjU1LDEzNiwyMCwwLDAsMCwwLAorCTEsMCwxMzIsMzYsMTA1LDI1NSwxMjgsMjAsMCwwLDAsMCwKKwkyNTUsMjU1LDUsMzYsMTAyLDI1NSwxNjgsMjAsMCwwLDAsMCwKKwkxLDAsMTY1LDM2LDk5LDI1NSwxNjAsMjAsMCwwLDAsMCwKKwkyNTUsMjU1LDYsMzYsOTYsMjU1LDIwMCwyMCwwLDAsMCwwLAorCTEsMCwxOTgsMzYsOTMsMjU1LDE5MiwyMCwwLDAsMCwwLAorCTI1NSwyNTUsNywzNiw5MCwyNTUsMjMyLDIwLDAsMCwwLDAsCisJMSwwLDIzMSwzNiw4NywyNTUsMjI0LDIwLDAsMCwwLDAsCisJMjU1LDI1NSw5LDM2LDg0LDI1NSw0MCwyMSwwLDAsMCwwLAorCTEsMCw0MSwzNyw4MSwyNTUsMzIsMjEsMCwwLDAsMCwKKwkyNTUsMjU1LDEwLDM2LDc4LDI1NSw3MiwyMSwwLDAsMCwwLAorCTEsMCw3NCwzNyw3NSwyNTUsNjQsMjEsMCwwLDAsMCwKKwkyNTUsMjU1LDExLDM2LDcyLDI1NSwxMDQsMjEsMCwwLDAsMCwKKwkxLDAsMTA3LDM3LDY5LDI1NSw5NiwyMSwwLDAsMCwwLAorCTI1NSwyNTUsMTIsMzYsNjYsMjU1LDEzNiwyMSwwLDAsMCwwLAorCTEsMCwxNDAsMzcsNjMsMjU1LDEyOCwyMSwwLDAsMCwwLAorCTI1NSwyNTUsMTMsMzYsNjAsMjU1LDE2OCwyMSwwLDAsMCwwLAorCTEsMCwxNzMsMzcsNTcsMjU1LDE2MCwyMSwwLDAsMCwwLAorCTI1NSwyNTUsMTQsMzYsNTQsMjU1LDIwMCwyMSwwLDAsMCwwLAorCTEsMCwyMDYsMzcsNTEsMjU1LDE5MiwyMSwwLDAsMCwwLAorCTI1NSwyNTUsMTUsMzYsNDgsMjU1LDIzMiwyMSwwLDAsMCwwLAorCTEsMCwyMzksMzcsNDUsMjU1LDIyNCwyMSwwLDAsMCwwLAorCTI1NSwyNTUsMjQsMzYsNDIsMjU1LDgsMjMsMCwwLDAsMCwKKwkxLDAsMjQsMzksMzksMjU1LDAsMjMsMCwwLDAsMCwKKwkyNTUsMjU1LDE2LDM2LDM2LDI1NSw4LDIyLDAsMCwwLDAsCisJMSwwLDE2LDM4LDMzLDI1NSwwLDIyLDAsMCwwLDAsCisJMjU1LDI1NSwxNywzNiwzMCwyNTUsNDAsMjIsMCwwLDAsMCwKKwkxLDAsNDksMzgsMjcsMjU1LDMyLDIyLDAsMCwwLDAsCisJMjU1LDI1NSwxOCwzNiwyNCwyNTUsNzIsMjIsMCwwLDAsMCwKKwkxLDAsODIsMzgsMjEsMjU1LDY0LDIyLDAsMCwwLDAsCisJMjU1LDI1NSwxOSwzNiwxOCwyNTUsMTA0LDIyLDAsMCwwLDAsCisJMSwwLDExNSwzOCwxNSwyNTUsOTYsMjIsMCwwLDAsMCwKKwkyNTUsMjU1LDIwLDM2LDEyLDI1NSwxMzYsMjIsMCwwLDAsMCwKKwkxLDAsMTQ4LDM4LDksMjU1LDEyOCwyMiwwLDAsMCwwLAorCTI1NSwyNTUsMjEsMzYsNiwyNTUsMTY4LDIyLDAsMCwwLDAsCisJMSwwLDE4MSwzOCwzLDI1NSwxNjAsMjIsMCwwLDAsMCwKKwkyNTUsMjU1LDIyLDM2LDAsMjU1LDIwMCwyMiwwLDAsMCwwLAorCTEsMCwyMTQsMzgsMjUzLDI1NCwxOTIsMjIsMCwwLDAsMCwKKwkyNTUsMjU1LDIzLDM2LDI1MCwyNTQsMjMyLDIyLDAsMCwwLDAsCisJMSwwLDI0NywzOCwyNDcsMjU0LDIyNCwyMiwwLDAsMCwwLAorCTI1NSwyNTUsMjYsMzYsMjQ0LDI1NCw3MiwyMywwLDAsMCwwLAorCTEsMCw5MCwzOSwyNDEsMjU0LDY0LDIzLDAsMCwwLDAsCisJMjU1LDI1NSwyNywzNiwyMzgsMjU0LDEwNCwyMywwLDAsMCwwLAorCTEsMCwxMjMsMzksMjM1LDI1NCw5NiwyMywwLDAsMCwwLAorCTI1NSwyNTUsMjgsMzYsMjMyLDI1NCwxMzYsMjMsMCwwLDAsMCwKKwkxLDAsMTU2LDM5LDIyOSwyNTQsMTI4LDIzLDAsMCwwLDAsCisJMjU1LDI1NSwyOSwzNiwyMjYsMjU0LDE2OCwyMywwLDAsMCwwLAorCTEsMCwxODksMzksMjIzLDI1NCwxNjAsMjMsMCwwLDAsMCwKKwkyNTUsMjU1LDMwLDM2LDIyMCwyNTQsMjAwLDIzLDAsMCwwLDAsCisJMSwwLDIyMiwzOSwyMTcsMjU0LDE5MiwyMywwLDAsMCwwLAorCTI1NSwyNTUsMzEsMzYsMjE0LDI1NCwyMzIsMjMsMCwwLDAsMCwKKwkxLDAsMjU1LDM5LDIxMSwyNTQsMjI0LDIzLDAsMCwwLDAsCisJMCwxMzEsMjQsNjAsMCwxLDI0LDM5LDAsMzIsMSw2MCwKKwkzNywxOTIsMSwzLDAsOTYsOCw2NCwwLDAsMCwwLAorCTEsMCwxLDYwLDM3LDY0LDEsMSwwLDk2LDEzNiw2NCwKKwkzMywxNiwwLDAsMTY1LDE2NSwzLDYwLDE2NSwxNjUsOTksNTIsCisJMCwxMjgsMSw2MCwwLDAsMzUsMTcyLDAsMTI4LDksNjAsCisJMCwwLDQxLDE0MSwwLDAsMCwwLDAsOTYsMTAsNjQsCisJMCwwLDAsMCw4LDAsMSw2MCwzNiw4MCw2NSwxLAorCTI5LDAsNjQsMjEsMCwwLDAsMCwyNywwLDEwNSwyMCwKKwkwLDAsMCwwLDAsMSwyLDM2LDAsMTI4LDEsNjAsCisJMzMsOCwzNCwwLDAsMCwzMiwxNzIsNjQsMTYsMiwwLAorCTEsMCwxLDYwLDEsMCwzMyw1Miw0Myw4LDY1LDAsCisJMjQ4LDI1NSwzMiwyMCwwLDAsMCwwLDI1NSwyNTUsMywzNiwKKwkwLDEyOCwxLDYwLDAsMCwzNSwxNzIsMCwxLDIsMzYsCisJMCwxMjgsMyw2MCwzMywyNCw5OCwwLDAsMCw5OSwxNDAsCisJMCwwLDAsMCw3LDAsOTYsMjAsMCwwLDAsMCwKKwk2NCwxNiwyLDAsMSwwLDEsNjAsMSwwLDMzLDUyLAorCTQzLDgsNjUsMCwyNDUsMjU1LDMyLDIwLDAsMCwwLDAsCisJMCw5NiwxMjgsNjQsMCwwLDAsMCw4NCwwLDIsMTc1LAorCTAsOTYsOCw2NCwwLDAsMCwwLDMsMCwxLDYwLAorCTM3LDY0LDEsMSwwLDk2LDEzNiw2NCwzMywxNiwwLDAsCisJMTY1LDE2NSwzLDYwLDE2NSwxNjUsOTksNTIsMCwxMjgsMSw2MCwKKwkwLDAsMzUsMTcyLDAsMTI4LDksNjAsMCwwLDQxLDE0MSwKKwkwLDAsMCwwLDAsOTYsMTAsNjQsMCwwLDAsMCwKKwk4LDAsMSw2MCwzNiw4MCw2NSwxLDI5LDAsNjQsMjEsCisJMCwwLDAsMCwyNywwLDEwNSwyMCwwLDAsMCwwLAorCTAsMSwyLDM2LDAsMTI4LDEsNjAsMzMsOCwzNCwwLAorCTAsMCwzMiwxNzIsNjQsMTYsMiwwLDEsMCwxLDYwLAorCTEsMCwzMyw1Miw0Myw4LDY1LDAsMjQ4LDI1NSwzMiwyMCwKKwkwLDAsMCwwLDI1NSwyNTUsMywzNiwwLDEyOCwxLDYwLAorCTAsMCwzNSwxNzIsMCwxLDIsMzYsMCwxMjgsMyw2MCwKKwkzMywyNCw5OCwwLDAsMCw5OSwxNDAsMCwwLDAsMCwKKwk3LDAsOTYsMjAsMCwwLDAsMCw2NCwxNiwyLDAsCisJMSwwLDEsNjAsMSwwLDMzLDUyLDQzLDgsNjUsMCwKKwkyNDUsMjU1LDMyLDIwLDAsMCwwLDAsMCw5NiwxMjgsNjQsCisJMCwwLDAsMCw4OCwwLDIsMTc1LDg4LDAsOSwxNDMsCisJMCwwLDAsMCwxNywwLDMyLDE3LDAsMCwwLDAsCisJMCwwLDAsMCwzLDAsMiw2MCwwLDAsMCwwLAorCTAsOTYsMTMwLDY0LDAsMTI4LDgsNjAsMzcsNzIsNDAsMSwKKwkwLDAsMCwxNjEsNCwwLDAsMTYxLDgsMCwwLDE2MSwKKwkxMiwwLDAsMTYxLDE2LDAsMCwxNjEsMjAsMCwwLDE2MSwKKwkyNCwwLDAsMTYxLDMyLDAsOCwzNywyNDcsMjU1LDksMjEsCisJMjUyLDI1NSwwLDE2MSw4NCwwLDksMTQzLDAsMCwwLDAsCisJMTcsMCwzMiwxNywwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDIsNjAsMCwwLDAsMCwwLDk2LDEzMCw2NCwKKwkwLDEyOCw4LDYwLDM3LDcyLDQwLDEsMCwwLDAsMTYxLAorCTQsMCwwLDE2MSw4LDAsMCwxNjEsMTIsMCwwLDE2MSwKKwkxNiwwLDAsMTYxLDIwLDAsMCwxNjEsMjQsMCwwLDE2MSwKKwkzMiwwLDgsMzcsMjQ3LDI1NSw5LDIxLDI1MiwyNTUsMCwxNjEsCisJMzIsMCw4LDYwLDAsOTYsMTM2LDY0LDAsMTA0LDEyOCw2NCwKKwkwLDEzMSwyLDYwLDE1MiwyOCw2NiwzNiwyNTUsMzEsOSw2MCwKKwkyNTUsMjU1LDQxLDUzLDM2LDE2LDczLDAsMCwxMjgsOSw2MCwKKwkzNywxNiw3MywwLDgsMCw2NCwwLDAsMCwwLDAsCisJMiwxMzEsOCw2MCwyMjQsMjEwLDgsMzcsMjUyLDI1NSwxLDM2LAorCTM2LDY0LDEsMSwzLDEzMSw5LDYwLDEyNCwxOCw0MSwzNywKKwkyNTIsMjU1LDEsMzYsMzYsNzIsMzMsMSwwLDAsMTAsMzYsCisJMCwwLDEwLDE3MywyNTQsMjU1LDksMjEsNCwwLDgsMzcsCisJMywxMzEsOCw2MCwxMjgsMTgsOCwzNywyNTIsMjU1LDEsMzYsCisJMzYsNjQsMSwxLDMxLDEzMSw5LDYwLDI1MiwyNTUsNDEsNTMsCisJMjUyLDI1NSwxLDM2LDM2LDcyLDMzLDEsMjM3LDI1NCwxMCw2MCwKKwkxNzUsMjIyLDc0LDUzLDAsMCwxMCwxNzMsMjU0LDI1NSw5LDIxLAorCTQsMCw4LDM3LDIsMTMxLDgsNjAsMCwyMTIsOCwzNywKKwkyNTIsMjU1LDEsMzYsMzYsNjQsMSwxLDIsMTMxLDksNjAsCisJMjUyLDIxOSw0MSwzNywyNTIsMjU1LDEsMzYsMzYsNzIsMzMsMSwKKwkxNzMsMjIyLDEwLDYwLDIzOSwxOTAsNzQsNTMsMCwwLDEwLDE3MywKKwkyNTQsMjU1LDksMjEsNCwwLDgsMzcsMCw0LDgsNjAsCisJMCwwLDAsMCwwLDI0LDEzNiw2NCwwLDAsMCwwLAorCTIsMTMxLDI5LDYwLDAsMjIwLDE4OSwzOSwwLDAsMzAsMzYsCisJMiwxMzEsMjgsNjAsNTEsOCwxOTIsMTIsMTYsNzgsMTU2LDM5LAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTIzMiwyNTUsMTg5LDM5LDE2LDAsMTkxLDE3NSw4LDEyOCwxMzIsMzksCisJMTUsNjMsMTkyLDEyLDAsMCwwLDAsMTYsMCwxOTEsMTQzLAorCTI0LDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTIzMiwyNTUsMTg5LDM5LDE2LDAsMTkxLDE3NSwxMiwxMjgsMTMyLDM5LAorCTE1LDYzLDE5MiwxMiwwLDAsMCwwLDE2LDAsMTkxLDE0MywKKwkyNCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkyMzIsMjU1LDE4OSwzOSwxNiwwLDE5MSwxNzUsMTYsMTI4LDEzMiwzOSwKKwkxNSw2MywxOTIsMTIsMCwwLDAsMCwxNiwwLDE5MSwxNDMsCisJMjQsMCwxODksMzksOCwwLDIyNCwzLDAsMCwwLDAsCisJMjMyLDI1NSwxODksMzksMTYsMCwxOTEsMTc1LDIwLDEyOCwxMzIsMzksCisJMTUsNjMsMTkyLDEyLDAsMCwwLDAsMTYsMCwxOTEsMTQzLAorCTI0LDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTIzMiwyNTUsMTg5LDM5LDI0LDEzMywxMzEsMTQzLDYsMCwyLDM2LAorCTIwLDAsMTkxLDE3NSw2LDAsOTgsMjAsMTYsMCwxNzYsMTc1LAorCTcsMTYyLDMsNjAsMjI4LDAsOTksNTIsMSwwLDIsMzYsCisJMTg0LDcsMTkyLDgsMCwwLDk4LDE3MiwwLDEyOCwxMzAsMTUxLAorCTUsMTYyLDE2LDYwLDAsMSw2Niw1MiwxMjAsNjMsMTkyLDEyLAorCTAsMCwyLDE2NiwwLDEyOCwxMzAsMTUxLDAsMCwwLDAsCisJMjU1LDI1NCw2Niw0OCwwLDAsMiwxNjYsMjAsMCwxOTEsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMjQsMCwxODksMzksCisJMjMyLDI1NSwxODksMzksMzMsMTYsMTI4LDAsMywwLDY0LDQsCisJMTYsMCwxOTEsMTc1LDI1NCwyNTUsMiw2MCwxOTIsMjksNjYsNTIsCisJMCwxNjMsNCw2MCw5NiwxLDEzMiw1MiwwLDE2MywxLDYwLAorCTkyLDEsMzQsMTcyLDAsMTYzLDEsNjAsMTA0LDEsMzgsMTcyLAorCTIwNCw2MywxOTIsMTIsOCwwLDYsMzYsMjI4LDYzLDE5MiwxMiwKKwkyNTUsMjU1LDQsMzYsMjA0LDcsMTkyLDgsMCwwLDAsMCwKKwkxNiwwLDE5MSwxNDMsMjQsMCwxODksMzksOCwwLDIyNCwzLAorCTAsMCwwLDAsMjE2LDI1NSwxODksMzksMSwwLDYsMzYsCisJMywxMzEsMiw2MCwxNDMsMTgsNjYsMzYsMjQwLDI1NSwzLDM2LAorCTM2LDE2LDY3LDAsMCwxNjMsMSw2MCwxMjAsMSwzNCwxNzIsCisJMCwxNjMsMiw2MCwxMjAsMSw2NiwxNDAsMzMsNTYsMCwwLAorCTMyLDAsMTkxLDE3NSwyOCwwLDE3NywxNzUsMjQsMCwxNzYsMTc1LAorCTE2LDAsMTYwLDE3NSwwLDE2MywxLDYwLDExNiwxLDM0LDE3MiwKKwkwLDE2MywzLDYwLDExMiwxLDk5LDE0MCwwLDE2MywyLDYwLAorCTExNiwxLDY2LDE0MCwwLDE2Myw0LDYwLDExNiwxLDEzMiwxNDAsCisJMzUsMTM2LDk4LDAsODQsNjQsMTkyLDEyLDMzLDQwLDMyLDIsCisJMTMsMCw2NCwxNiwwLDAsMCwwLDEsMTMxLDQsNjAsCisJOTYsMTI3LDEzMiwzNiwyNCwxMjgsMTQ0LDM5LDMzLDQwLDAsMiwKKwkxLDEzMSw3LDYwLDEyOCwxMjcsMjMxLDM2LDE1LDYzLDE5MiwxMiwKKwkxNDgsMCw2LDM2LDEsMCw0LDM2LDMzLDQwLDAsMiwKKwkxODgsNywxOTIsMTIsMTQ4LDAsNiwzNiwyLDAsMzMsNiwKKwkzMywxNiwzMiwyLDMsMCwzNCwzOCwxMzEsMTM2LDIsMCwKKwkwLDE2MywyLDYwLDExNiwxLDY2LDE0MCwwLDAsMCwwLAorCTYsMCwzMiwxOCwyMzcsMjU0LDMsNjAsMTc1LDIyMiw5OSw1MiwKKwkwLDAsNjcsMTcyLDI1NSwyNTUsNDksMzgsMjUzLDI1NSwzMiwyMiwKKwk0LDAsNjYsMzYsMzIsMCwxOTEsMTQzLDI4LDAsMTc3LDE0MywKKwkyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLDQwLDAsMTg5LDM5LAorCTIyNCwyNTUsMTg5LDM5LDE1LDAsMTMyLDM2LDI0MCwyNTUsMywzNiwKKwkyMCwwLDE3NywxNzUsMCwxNjMsMTcsNjAsMTIwLDEsNDksMTQyLAorCTAsMTYzLDIsNjAsMTIwLDEsNjYsMTQwLDM2LDMyLDEzMSwwLAorCTMzLDE2LDY4LDAsMCwxNjMsMSw2MCwxMjAsMSwzNCwxNzIsCisJMCwxNjMsMyw2MCwxMjAsMSw5OSwxNDAsMCwxNjMsMiw2MCwKKwkxMTIsMSw2NiwxNDAsMjQsMCwxOTEsMTc1LDQzLDE2LDY3LDAsCisJMTMsMCw2NCwxNiwxNiwwLDE3NiwxNzUsMSwxMzEsNCw2MCwKKwk5NiwxMjcsMTMyLDM2LDI0LDEyOCwxNDQsMzksMzMsNDAsMCwyLAorCTEsMTMxLDcsNjAsMTc2LDEyNywyMzEsMzYsMTUsNjMsMTkyLDEyLAorCTE3MSwwLDYsMzYsMSwwLDQsMzYsMzMsNDAsMCwyLAorCTE4OCw3LDE5MiwxMiwxNzEsMCw2LDM2LDMzLDE2LDMyLDIsCisJMjQsMCwxOTEsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDMyLDAsMTg5LDM5LDIxNiwyNTUsMTg5LDM5LAorCTMsMCwyLDYwLDcsMTYyLDMsNjAsMzYsMCwxOTEsMTc1LAorCTMyLDAsMTc2LDE3NSwwLDE2MywxLDYwLDkyLDEsMzIsMTcyLAorCTAsMCw5OSwxNDAsNzksMTcsNjYsNTIsMzIsMCw5OCwyMCwKKwk4NywwLDQsNjAsNzYsMCw4LDYwLDY0LDc1LDgsNTMsCisJMjUwLDIsNyw2MCwxMjgsMjQwLDIzMSw1Miw3LDE2Miw2LDYwLAorCTE1MiwwLDE5OCw1Miw2Nyw3MywzLDYwLDY3LDMsOTksNTIsCisJNywxNjIsNCw2MCw0OCwxLDEzMiw1Miw3LDE2Miw1LDYwLAorCTAsMSwxNjUsNTIsNiwwLDIsMzYsMjQsMTMzLDEzMCwxNzUsCisJMCwxNjMsMSw2MCwyMDQsNSwzNCwxNzIsNCwwLDIsMzYsCisJNTAsMTMzLDEzMCwxNjcsMiwwLDIsMzYsNDgsMTMzLDEzMCwxNjcsCisJMSwwLDIsMzYsMjAsMTMzLDEzMCwxNjcsMTE5LDExOSwyLDM2LAorCTI4LDEzMywxMzYsMTc1LDE2LDEzMywxMzUsMTc1LDAsMCwxOTUsMTcyLAorCTAsMCwxMzAsMTcyLDY3LDEsMiwzNiwwLDAsMTYyLDE3MiwKKwkxMDksOCwxOTIsOCwzMSwxMzEsNCw2MCwyNDAsMTg4LDEzMiw1MiwKKwkxODksMiwzLDYwLDEyOCwyMzEsOTksNTIsNCwwLDIsMzYsCisJMjQsMTMzLDEzMCwxNzUsMCwxNjMsMSw2MCwyMDQsNSwzNCwxNzIsCisJMCw4LDIsMzYsNTAsMTMzLDEzMCwxNjcsMCw0LDIsMzYsCisJNDgsMTMzLDEzMCwxNjcsMCwyLDIsMzYsMjAsMTMzLDEzMCwxNjcsCisJMjgsMTMzLDEzMiwxNzUsMTYsMTMzLDEzMSwxNzUsMzEsMTMxLDQsNjAsCisJMCwyNDAsMTMyLDUyLDI0LDEzMywxMzEsMTQzLDAsMTMxLDIsNjAsCisJMCwxNjMsMSw2MCwxMDgsMSwzNCwxNzIsMCwxNjMsMSw2MCwKKwkxMTIsMSwzNiwxNzIsMSwwLDk5LDM2LDMyLDEzMywxMzEsMTc1LAorCTIxMCw3LDE5MiwxMiwwLDAsMCwwLDAsMTYzLDIsNjAsCisJMTMyLDEsNjYsMTQwLDAsMTI4LDEyOCwxNjcsMiwwLDY0LDIwLAorCTg1LDAsMiwzNiwwLDEyOCwxMzAsMTY3LDAsMTYzLDIsNjAsCisJMTM2LDEsNjYsMTQwLDAsMCwwLDAsNSwwLDY0LDIwLAorCTAsMCwwLDAsMCwxMjgsMTMwLDE1MSwwLDAsMCwwLAorCTE3MCwwLDY2LDUyLDAsMTI4LDEzMCwxNjcsMCwxMjgsMTMxLDE1MSwKKwk1LDE2MiwyLDYwLDAsMCw2NywxNjQsMTg4LDY0LDE5MiwxMiwKKwkxLDAsMTYsMzYsMiwxMzEsNCw2MCwwLDIyMCwxMzIsMzYsCisJMiwxMzEsNSw2MCwwLDIyNCwxNjUsMzYsMiwxMzEsNiw2MCwKKwkwLDIyNiwxOTgsMzYsOCwwLDcsMzYsMiwxMzEsMiw2MCwKKwkxMTIsMTU0LDY2LDM2LDE2LDAsMTYyLDE3NSwyLDEzMSwyLDYwLAorCTE0NCwxNTQsNjYsMzYsMjAsMCwxNjIsMTc1LDIsMTMxLDIsNjAsCisJMTc2LDE1NCw2NiwzNiwyNCwwLDE2MiwxNzUsMCwxMzEsMiw2MCwKKwkzNiwzMCw2NiwzNiwwLDE2MywxLDYwLDkyLDEsNDgsMTcyLAorCTI0MCw2NCwxOTIsMTIsMjgsMCwxNjIsMTc1LDAsMTYzLDMsNjAsCisJMTI0LDEsOTksMTQwLDQwLDEzMywxMjgsMTc1LDIsMCw5OCw0MCwKKwk3LDAsNjQsMTYsMiwwLDIsMzYsMTgsMCw5Nyw0LAorCTI1NSwyNTUsMiwzNiw3LDAsOTgsMTYsMCwwLDAsMCwKKwkxOTYsOCwxOTIsOCwwLDAsMCwwLDE2LDAsOTgsMTYsCisJMCwwLDAsMCwxOTYsOCwxOTIsOCwwLDAsMCwwLAorCTI0LDEzMywxMzMsMTQzLDEsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLAorCTIwOCwxMjcsMTMyLDM2LDAsMTYzLDEsNjAsMTEyLDI1LDE5MiwxMiwKKwkxMjQsMSwzMiwxNzIsMjA3LDgsMTkyLDgsMCwwLDAsMCwKKwkyMTEsOCwxOTIsMTIsMCwwLDAsMCwyMDcsOCwxOTIsOCwKKwkwLDAsMCwwLDQwLDEzMywxNDQsMTc1LDMxLDEwLDE5MiwxMiwKKwkwLDAsMCwwLDIwNyw4LDE5Miw4LDAsMCwwLDAsCisJMSwxMzEsNCw2MCw5NiwxMjcsMTMyLDM2LDI0LDEyOCwxNDQsMzksCisJMzMsNDAsMCwyLDMyLDEyOCwxMzUsMzksMTUsNjMsMTkyLDEyLAorCTU4LDEsNiwzNiwxLDAsNCwzNiwzMyw0MCwwLDIsCisJMTg4LDcsMTkyLDEyLDU4LDEsNiwzNiwzNiwwLDE5MSwxNDMsCisJMzIsMCwxNzYsMTQzLDgsMCwyMjQsMyw0MCwwLDE4OSwzOSwKKwkxOTIsMjU1LDE4OSwzOSw1NiwwLDE5MSwxNzUsNTIsMCwxODEsMTc1LAorCTQ4LDAsMTgwLDE3NSw0NCwwLDE3OSwxNzUsNDAsMCwxNzgsMTc1LAorCTM2LDAsMTc3LDE3NSwxODAsMTAsMTkyLDEyLDMyLDAsMTc2LDE3NSwKKwkzMywzMiwwLDAsMiwwLDIsMzYsMCwxNjMsMSw2MCwKKwkyNDQsNTcsMTkyLDEyLDkyLDEsMzQsMTcyLDMsMCwyLDM2LAorCTAsMTYzLDEsNjAsMCwxMiwxOTIsMTIsOTIsMSwzNCwxNzIsCisJMSwwLDQsMzYsNCwwLDIsMzYsMCwxNjMsMSw2MCwKKwkzNCwxMSwxOTIsMTIsOTIsMSwzNCwxNzIsNSwwLDIsMzYsCisJMCwxNjMsMSw2MCw5MiwxLDM0LDE3MiwwLDE2MywxOSw2MCwKKwkxMjQsMSwxMTUsMTQyLDAsMTYzLDMsNjAsMTYwLDEsOTksMTQwLAorCTEsMCw5OCw0Niw4MCwxMzMsMTMwLDE3NSwwLDEyOCwyLDYwLAorCTUsMCw5OCwyMCwwLDAsMCwwLDMyLDEzMywxMzAsMTQzLAorCTAsMCwwLDAsMjUyLDgsMTkyLDgsMjU1LDI1NSw2NiwzNiwKKwkzMiwxMzMsMTMwLDE0MywwLDAsMCwwLDg0LDEzMywxMzAsMTc1LAorCTEzMCwxMSwxOTIsMTIsMCwwLDAsMCwzMywzMiw2NCwwLAorCTIsMCw1LDM2LDIzMiwzLDYsMzYsMCwxMzEsNyw2MCwKKwkxOTYsMzcsMjMxLDM2LDE1NiwxMSwxOTIsMTIsMTYsMCwxNjAsMTc1LAorCTM1LDM1LDE5MiwxMiwwLDAsMCwwLDYsMCwyLDM2LAorCTAsMTYzLDEsNjAsODQsMzUsMTkyLDEyLDkyLDEsMzQsMTcyLAorCTcsMCwyLDM2LDAsMTYzLDEsNjAsMTQxLDQ3LDE5MiwxMiwKKwk5MiwxLDM0LDE3Miw4LDAsMiwzNiwwLDE2MywxLDYwLAorCTEyMCw1MCwxOTIsMTIsOTIsMSwzNCwxNzIsOSwwLDIsMzYsCisJMCwxNjMsMSw2MCw5MiwxLDM0LDE3MiwwLDE2MywyLDYwLAorCTI0MCw1LDY2LDE0MCwwLDAsMCwwLDgsMCw2NCwxNiwKKwkxMCwwLDIsMzYsMCwxNjMsNCw2MCwyNDAsNSwxMzIsMTQwLAorCTEzLDgsMTkyLDEyLDAsMCwwLDAsMCwxNjMsMSw2MCwKKwkyNDQsNSwzNCwxNzIsMTAsMCwyLDM2LDAsMTYzLDEsNjAsCisJOTIsMSwzNCwxNzIsMTU3LDE1LDE5MiwxMiwxLDAsMjEsMzYsCisJMiwxMzEsMiw2MCwxOTIsMjQ2LDY2LDM2LDMzLDE2MCw2NCwwLAorCTgwLDEzMywxMzEsMTQzLDExLDAsMiwzNiwwLDE2MywxLDYwLAorCTkyLDEsMzQsMTcyLDEwMCwwLDIsMzYsMCwxNjMsMSw2MCwKKwk5MiwxLDM0LDE3Miw4NCwxMzMsMTMwLDE0Myw2NCwyNiwzLDAsCisJMzMsMTM2LDExNiwwLDY0LDE4LDIsMCwzMywxNDQsODQsMCwKKwkwLDE2MywyLDYwLDgsMSw2NiwxNDAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMCwxNjMsMSw2MCw4LDEsMzQsMTcyLAorCTAsMTYzLDIsNjAsOCwxLDY2LDE0MCwwLDE2MywyLDYwLAorCTEyNCwxLDY2LDE0MCwwLDAsMCwwLDE0LDAsODMsMTYsCisJMCwwLDAsMCw0LDAsNjQsMTYsMzMsMTUyLDY0LDAsCisJODAsMTMzLDEyOCwxNzUsNzYsOSwxOTIsOCwwLDAsMCwwLAorCTgwLDEzMywxNDksMTc1LDIsMTMxLDQsNjAsMTYzLDIzLDE5MiwxMiwKKwkxOTIsMjQ2LDEzMiwzNiw4MCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTY0LDE4LDIsMCwzMywxMzYsODQsMCwwLDE2MywyLDYwLAorCTAsNiw2NiwxNDAsMCwwLDAsMCwzLDAsNjQsMjQsCisJMzMsMTI4LDMyLDIsMjM5LDE1LDE5MiwxMiwwLDAsMCwwLAorCTQzLDE2LDE4LDIsMTEsMCw2NCwxNiwzMywzMiwwLDIsCisJMTUxLDE4LDE5MiwxMiwxMCwwLDUsMzYsMjcsMjIsMTkyLDEyLAorCTMzLDMyLDAsMiwxNDIsMjIsMTkyLDEyLDMzLDMyLDAsMiwKKwkwLDIsMTYsMzgsNDMsMTYsMTgsMiwyNDcsMjU1LDY0LDIwLAorCTMzLDMyLDAsMiwxODQsMTEsMTkyLDEyLDAsMCwwLDAsCisJNTQsOSwxOTIsOCwwLDAsMCwwLDU2LDAsMTkxLDE0MywKKwk1MiwwLDE4MSwxNDMsNDgsMCwxODAsMTQzLDQ0LDAsMTc5LDE0MywKKwk0MCwwLDE3OCwxNDMsMzYsMCwxNzcsMTQzLDMyLDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNjQsMCwxODksMzksNCwxMjgsMTMwLDE0MywKKwkyMzIsMjU1LDE4OSwzOSwyMCwwLDE5MSwxNzUsMTYsMCwxNzYsMTc1LAorCTEsMCw2NywzNiw0LDEyOCwxMzEsMTc1LDI1NSwyNTUsMywzNiwKKwk0LDAsNjcsMjAsMjU1LDMxLDQsNjAsMCwxNjMsMSw2MCwKKwk4LDEsMzIsMTcyLDI1NSwzMSw0LDYwLDI1NSwyNTUsMTMyLDUyLAorCTAsMTYzLDE2LDYwLDAsMTYzLDIsNjAsOCwxLDY2LDE0MCwKKwkyMDgsMTMyLDEzMSwxNDMsMjIwLDUsMTYsNTQsMzUsMTYsNjcsMCwKKwkwLDE2MywxLDYwLDE2LDEsMzQsMTcyLDIsMTMxLDIsNjAsCisJMTkyLDI0Niw2NiwzNiwzNiwxNiw2OCwwLDAsMTYwLDMsNjAsCisJMzcsMTYsNjcsMCwwLDE2MywzLDYwLDgsMSw5OSwxNDAsCisJMjgsMCw2OCwxNDAsMCwwLDUsMTQyLDMsMTMxLDIsNjAsCisJMjAsMTgsNjYsMTQwLDIwOCwxMzIsMTMxLDE3NSwzNiwxMzMsMTMyLDE3NSwKKwkxOCwwLDE2MiwxNiwwLDE2Myw0LDYwLDk5LDU5LDE5MiwxMiwKKwkyMjAsNSwxMzIsNTIsMjU1LDAsNSw2MCwyNTUsMCwxNjUsNTIsCisJMCwyNTUsNiw2MCwwLDAsNCwxNDIsMCwyNTUsMTk4LDUyLAorCTAsMjAsNCwwLDIsMjgsNCwwLDM3LDE2LDY3LDAsCisJMiwyNiwyLDAsMzYsMjQsMTAxLDAsMCwxOCwyLDAsCisJMzYsMTYsNzAsMCwzNywyNCw5OCwwLDE3NiwxMzMsMTMyLDE3NSwKKwkxODQsMTMzLDEzMSwxNzUsMCwxNjMsMTYsNjAsMTYsNiwxNiw1NCwKKwkwLDAsMywxNDIsMywxMzEsMiw2MCw2OCwxOCw2NiwxNDAsCisJMCwwLDAsMCwxOCwwLDk4LDE2LDAsMTYzLDQsNjAsCisJMTE5LDU5LDE5MiwxMiwxNiw2LDEzMiw1MiwyNTUsMCw1LDYwLAorCTI1NSwwLDE2NSw1MiwwLDI1NSw2LDYwLDAsMCw0LDE0MiwKKwkwLDI1NSwxOTgsNTIsMCwyMCw0LDAsMiwyOCw0LDAsCisJMzcsMTYsNjcsMCwyLDI2LDIsMCwzNiwyNCwxMDEsMCwKKwkwLDE4LDIsMCwzNiwxNiw3MCwwLDM3LDI0LDk4LDAsCisJMTk2LDEzMywxMzIsMTc1LDE5MiwxMzMsMTMxLDE3NSwwLDE2MywxNiw2MCwKKwkyMjQsNSwxNiw1NCwwLDAsMywxNDIsMywxMzEsMiw2MCwKKwkyNCwxOCw2NiwxNDAsMCwwLDAsMCwxOCwwLDk4LDE2LAorCTAsMTYzLDQsNjAsMTM5LDU5LDE5MiwxMiwyMjQsNSwxMzIsNTIsCisJMjU1LDAsNSw2MCwyNTUsMCwxNjUsNTIsMCwyNTUsNiw2MCwKKwkwLDAsNCwxNDIsMCwyNTUsMTk4LDUyLDAsMjAsNCwwLAorCTIsMjgsNCwwLDM3LDE2LDY3LDAsMiwyNiwyLDAsCisJMzYsMjQsMTAxLDAsMCwxOCwyLDAsMzYsMTYsNzAsMCwKKwkzNywyNCw5OCwwLDE4OCwxMzMsMTMyLDE3NSwxODAsMTMzLDEzMSwxNzUsCisJNDQsMTMzLDEzMSwxNDMsMCwxNjMsMiw2MCwxNDQsMSw2NiwxNDAsCisJMCwwLDAsMCw1LDAsOTgsMTYsMCwwLDAsMCwKKwkwLDE2Myw0LDYwLDE0NCwxLDEzMiwxNDAsMTU5LDU5LDE5MiwxMiwKKwkwLDAsMCwwLDAsMTYzLDMsNjAsMTQwLDEsOTksMTQwLAorCTMsMTMxLDIsNjAsNjQsMTgsNjYsMTQwLDAsMCwwLDAsCisJNSwwLDk4LDE2LDAsMCwwLDAsMCwxNjMsNCw2MCwKKwkxNDAsMSwxMzIsMTQwLDUxLDYwLDE5MiwxMiwwLDAsMCwwLAorCTQ0LDEzMywxMzAsMTQzLDAsMCwwLDAsMywwLDY0LDE2LAorCTAsMCwwLDAsMTE2LDM4LDE5MiwxMiwwLDAsMCwwLAorCTE2NCw3LDE5MiwxMiwwLDAsMCwwLDM2LDEyOCwxMzAsMTQzLAorCTAsMCwwLDAsMSwwLDY2LDM2LDM2LDEyOCwxMzAsMTc1LAorCTYwLDAsNjYsNDAsOCwwLDY0LDIwLDAsMCwwLDAsCisJMywxMzEsMiw2MCwyNCwxOCw2NiwxNDAsMzYsMTI4LDEyOCwxNzUsCisJMywwLDY0LDE2LDAsMCwwLDAsMjIyLDQ4LDE5MiwxMiwKKwkwLDAsMCwwLDAsMTYzLDIsNjAsNDgsMSw2NiwxNDAsCisJMCwwLDAsMCwyMCwwLDY0LDE2LDAsMCwwLDAsCisJMCwxNjMsMSw2MCw0OCwxLDMyLDE3MiwwLDE2MywxLDYwLAorCTE2LDEsMzIsMTcyLDAsMTYzLDEsNjAsMjAsMSwzMiwxNzIsCisJMCwxNjMsMSw2MCwyNCwxLDMyLDE3MiwwLDE2MywxLDYwLAorCTI4LDEsMzIsMTcyLDAsMTYzLDEsNjAsMzIsMSwzMiwxNzIsCisJMCwxNjMsMSw2MCwzNiwxLDMyLDE3MiwwLDE2MywxLDYwLAorCTQwLDEsMzIsMTcyLDAsMTYzLDEsNjAsMjAxLDEzLDE5MiwxMiwKKwk0NCwxLDMyLDE3MiwyMCwwLDE5MSwxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywyNCwwLDE4OSwzOSwyMTYsMjU1LDE4OSwzOSwKKwkzNiwwLDE5MSwxNzUsMzIsMCwxNzgsMTc1LDI4LDAsMTc3LDE3NSwKKwkxODAsMTAsMTkyLDEyLDI0LDAsMTc2LDE3NSwzMywzMiwwLDAsCisJMiwwLDIsMzYsMCwxNjMsMSw2MCwyNDQsNTcsMTkyLDEyLAorCTkyLDEsMzQsMTcyLDMsMCwyLDM2LDAsMTYzLDEsNjAsCisJMCwxMiwxOTIsMTIsOTIsMSwzNCwxNzIsMSwwLDQsMzYsCisJNCwwLDIsMzYsMCwxNjMsMSw2MCwzNCwxMSwxOTIsMTIsCisJOTIsMSwzNCwxNzIsMzIsMTMzLDEzMSwxNDMsNSwwLDIsMzYsCisJMCwxNjMsMSw2MCw5MiwxLDM0LDE3Miw4MCwxMzMsMTI4LDE3NSwKKwk4NCwxMzMsMTMxLDE3NSwxMzAsMTEsMTkyLDEyLDAsMCwwLDAsCisJMzMsMzIsNjQsMCwyLDAsNSwzNiwyMzIsMyw2LDM2LAorCTAsMTMxLDcsNjAsMTk2LDM3LDIzMSwzNiwxNTYsMTEsMTkyLDEyLAorCTE2LDAsMTYwLDE3NSwwLDE2MywyLDYwLDI0MCw1LDY2LDE0MCwKKwkwLDAsMCwwLDgsMCw2NCwxNiwxMCwwLDIsMzYsCisJMCwxNjMsNCw2MCwyNDAsNSwxMzIsMTQwLDEzLDgsMTkyLDEyLAorCTAsMCwwLDAsMCwxNjMsMSw2MCwyNDQsNSwzNCwxNzIsCisJMTAsMCwyLDM2LDAsMTYzLDEsNjAsOTIsMSwzNCwxNzIsCisJMTAwLDAsMiwzNiw4MCwxMzMsMTMxLDE0MywyLDEzMSw0LDYwLAorCTE5MiwyNDYsMTMyLDM2LDAsMTYzLDEsNjAsOTIsMSwzNCwxNzIsCisJODQsMTMzLDEzMCwxNDMsNjQsMjYsMywwLDMzLDE0NCwxMDAsMCwKKwk2NCwxOCwyLDAsMzMsMTM2LDY4LDAsMCwxNjMsMiw2MCwKKwk4LDEsNjYsMTQwLDMzLDEyOCw2NCwyLDEsMCw2NiwzNiwKKwkwLDE2MywxLDYwLDgsMSwzNCwxNzIsMCwxNjMsMiw2MCwKKwk4LDEsNjYsMTQwLDQzLDE2LDE3LDIsMTEsMCw2NCwxNiwKKwkzMywzMiwwLDIsMTUxLDE4LDE5MiwxMiwxMCwwLDUsMzYsCisJMjcsMjIsMTkyLDEyLDMzLDMyLDAsMiwxNDIsMjIsMTkyLDEyLAorCTMzLDMyLDAsMiwwLDIsMTYsMzgsNDMsMTYsMTcsMiwKKwkyNDcsMjU1LDY0LDIwLDMzLDMyLDAsMiwxODQsMTEsMTkyLDEyLAorCTAsMCwwLDAsOTEsMTAsMTkyLDgsMCwwLDAsMCwKKwkzNiwwLDE5MSwxNDMsMzIsMCwxNzgsMTQzLDI4LDAsMTc3LDE0MywKKwkyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLDQwLDAsMTg5LDM5LAorCTQsMTI4LDEzMCwxNDMsMjMyLDI1NSwxODksMzksMTYsMCwxOTEsMTc1LAorCTEsMCw2NywzNiw0LDEyOCwxMzEsMTc1LDI1NSwyNTUsMywzNiwKKwk0LDAsNjcsMjAsMjU1LDMxLDQsNjAsMCwxNjMsMSw2MCwKKwk4LDEsMzIsMTcyLDI1NSwzMSw0LDYwLDAsMTYzLDIsNjAsCisJOCwxLDY2LDE0MCwyMTIsMTMyLDEzMSwxNDMsMjU1LDI1NSwxMzIsNTIsCisJMzUsMTYsNjcsMCwwLDE2MywxLDYwLDE2LDEsMzQsMTcyLAorCTIsMTMxLDIsNjAsMTkyLDI0Niw2NiwzNiwzNiwxNiw2OCwwLAorCTAsMTYwLDMsNjAsMzcsMTYsNjcsMCwwLDE2MywzLDYwLAorCTgsMSw5OSwxNDAsMjgsMCw2NiwxNDAsMjEyLDEzMiwxMzEsMTc1LAorCTM2LDEzMywxMzAsMTc1LDE2NCw3LDE5MiwxMiwwLDAsMCwwLAorCTAsMTYzLDIsNjAsNDgsMSw2NiwxNDAsMCwwLDAsMCwKKwkyMCwwLDY0LDE2LDAsMCwwLDAsMCwxNjMsMSw2MCwKKwk0OCwxLDMyLDE3MiwwLDE2MywxLDYwLDE2LDEsMzIsMTcyLAorCTAsMTYzLDEsNjAsMjAsMSwzMiwxNzIsMCwxNjMsMSw2MCwKKwkyNCwxLDMyLDE3MiwwLDE2MywxLDYwLDI4LDEsMzIsMTcyLAorCTAsMTYzLDEsNjAsMzIsMSwzMiwxNzIsMCwxNjMsMSw2MCwKKwkzNiwxLDMyLDE3MiwwLDE2MywxLDYwLDQwLDEsMzIsMTcyLAorCTAsMTYzLDEsNjAsMjAxLDEzLDE5MiwxMiw0NCwxLDMyLDE3MiwKKwkxNiwwLDE5MSwxNDMsMjQsMCwxODksMzksOCwwLDIyNCwzLAorCTAsMCwwLDAsMjI0LDI1NSwxODksMzksMjQsMCwxOTEsMTc1LAorCTIwLDAsMTc3LDE3NSwxMjAsNjMsMTkyLDEyLDE2LDAsMTc2LDE3NSwKKwk1MiwwLDIsMzYsNCwxNjIsMSw2MCwxMiwwLDM0LDE2MCwKKwkxMjAsNjMsMTkyLDEyLDIzMiwzLDE2LDM2LDI4LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsMjcsMCw4MCwwLDIsMCwwLDIyLAorCTAsMCwwLDAsMTMsMCw3LDAsMTgsMTYsMCwwLAorCTQsMTYyLDE3LDYwLDEyMCw2MywxOTIsMTIsMCwwLDM0LDE2MiwKKwkyOCwxMzMsMTMwLDE0MywwLDAsMCwwLDI3LDAsODAsMCwKKwkyLDAsMCwyMiwwLDAsMCwwLDEzLDAsNywwLAorCTE4LDE2LDAsMCwzMyw0MCwwLDAsMzMsMzIsMCwwLAorCTYsMTYyLDMsNjAsMiwxOCwyLDAsMCwwLDM0LDE2MiwKKwkxLDAsMiwzNiwwLDE2MywxLDYwLDQsMSwzMiwxNzIsCisJMCwwLDk4LDE3MiwyLDEzMSwxLDYwLDMzLDgsMzYsMCwKKwk4LDI0NSwzMiwxNzIsMSwwLDE2NSwzNiwyMiwwLDE2Miw0NCwKKwkyNTAsMjU1LDY0LDIwLDIwLDAsMTMyLDM2LDMxLDEzMSw0LDYwLAorCTAsMjQwLDEzMiw1Miw1MiwxMjgsMTMxLDE0MywxLDAsMiwzNiwKKwk2OCwxMzMsMTI4LDE3NSw0OCwxMjgsMTMwLDE3NSw2NCwxMzMsMTI4LDE3NSwKKwkzMiwxMzEsMSw2MCwyNTIsMjM5LDM2LDE3Miw4LDAsOTYsMTYsCisJMzEsMTMxLDUsNjAsMjUyLDIzOSwxNjUsNTIsMzEsMTMxLDYsNjAsCisJMSwxMzEsNCw2MCwyMjQsMTI3LDEzMiwzNiwxNSw2MywxOTIsMTIsCisJMCwyNDAsMTk4LDUyLDUyLDEyOCwxMjgsMTc1LDI0LDAsMTkxLDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwxNiwwLDE3NiwxNzUsCisJMTE2LDAsMiwzNiwyMCwwLDE5MSwxNzUsNCwxNjIsMSw2MCwKKwkxMiwwLDM0LDE2MCwxMzAsNjMsMTkyLDEyLDMzLDEyOCwxMjgsMCwKKwk0LDE2MiwxLDYwLDQsMCw0OCwxNjAsMTMwLDYzLDE5MiwxMiwKKwkzLDEzMCwxNiwwLDQsMTYyLDEsNjAsMTMwLDYzLDE5MiwxMiwKKwk0LDAsNDgsMTYwLDIwLDAsMTkxLDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDI0LDAsMTg5LDM5LDIyNCwyNTUsMTg5LDM5LAorCTY0LDAsMiwzNiwyNCwwLDE5MSwxNzUsMjAsMCwxNzcsMTc1LAorCTE2LDAsMTc2LDE3NSw0LDE2MiwxLDYwLDEzMCw2MywxOTIsMTIsCisJMTIsMCwzNCwxNjAsNCwxNjIsMTcsNjAsNCwwLDQ5LDE0NiwKKwkwLDAsMCwwLDEzMCw2MywxOTIsMTIsMjU1LDAsNDksNTAsCisJNCwxNjIsMTYsNjAsNCwwLDE2LDE0NiwwLDAsMCwwLAorCTEzMCw2MywxOTIsMTIsMjU1LDAsMTYsNTAsMCwxMzAsMTYsMCwKKwkzNywxNiwxNywyLDI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywzMiwwLDE4OSwzOSwKKwk0OCwxMjgsMTMwLDE0MywyMzIsMjU1LDE4OSwzOSwxNiwwLDE3NiwxNzUsCisJMzMsMTI4LDEyOCwwLDMsMCw2NCwyMCwyMCwwLDE5MSwxNzUsCisJMTgwLDEwLDE5MiwxMiwwLDAsMCwwLDUsMCwwLDE4LAorCTAsMCwwLDAsMjM2LDYzLDE5MiwxMiwxLDQsNCwzNiwKKwk1MCwxMSwxOTIsOCwwLDAsMCwwLDIyOCw2MywxOTIsMTIsCisJMCw0LDQsMzYsMjAsMCwxOTEsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMjQsMCwxODksMzksMjE2LDI1NSwxODksMzksCisJNiwxNjIsMyw2MCwxLDAsMiwzNiwzMiwwLDE5MSwxNzUsCisJMjgsMCwxNzcsMTc1LDI0LDAsMTc2LDE3NSwwLDAsOTgsMTcyLAorCTAsMTYzLDIsNjAsNCwxLDY2LDE0MCwzMywxMzYsMjI0LDAsCisJMSwwLDY2LDM2LDAsMTYzLDEsNjAsNCwxLDM0LDE3MiwKKwk1NiwxMjgsMTMwLDE0MywwLDE2MywzLDYwLDQsMSw5OSwxNDAsCisJMSwwLDY2LDM2LDU2LDEyOCwxMzAsMTc1LDIzMiwzLDY2LDQwLAorCTIxLDAsNjQsMjAsMjU1LDEyNywzLDYwLDY4LDEzMywxMzAsMTQzLAorCTI1NCwyNTUsOTksNTIsNTYsMTI4LDEyOCwxNzUsMSwwLDY2LDM2LAorCTQzLDI0LDk4LDAsNjgsMTMzLDEzMCwxNzUsMTMsMCw5NiwxNiwKKwkwLDAsMCwwLDIsMTMxLDQsNjAsMjgsMTI4LDEzMiwzNiwKKwk2MCwxMjgsMTQ0LDM5LDMzLDQwLDAsMiwyLDEzMSw3LDYwLAorCTYwLDEyOCwyMzEsMzYsMTUsNjMsMTkyLDEyLDE0NCwwLDYsMzYsCisJMSwwLDQsMzYsMzMsNDAsMCwyLDE4OCw3LDE5MiwxMiwKKwkxNDQsMCw2LDM2LDY0LDEzMywxMzQsMTQzLDAsMCwwLDAsCisJMTQsMCwxOTIsMjQsMzMsMjQsMCwwLDIsMTMxLDUsNjAsCisJMCwyNDUsMTY1LDM2LDMzLDMyLDAsMCwyLDEzMSwyLDYwLAorCTMzLDE2LDY4LDAsMCwyNDUsNjYsMTQwLDIwLDAsMTMyLDM2LAorCTEsMCw5OSwzNiwyNTUsMjU1LDY2LDM2LDAsMCwxNjIsMTcyLAorCTQyLDE2LDEwMiwwLDI0NywyNTUsNjQsMjAsMjAsMCwxNjUsMzYsCisJMzEsMTMxLDQsNjAsMjUyLDIzOSwxMzIsNTIsMzEsMTMxLDIsNjAsCisJMCwwLDEzMSwxNDAsMjU1LDI1NSw2Niw1MiwwLDAsMTEzLDE3MiwKKwk0LDAsOTksMzYsNDMsMTYsNjcsMCwzLDAsNjQsMTYsCisJMCwwLDAsMCwzMSwxMzEsMyw2MCwwLDI0MCw5OSw1MiwKKwkwLDAsMTMxLDE3MiwzMiwwLDE5MSwxNDMsMjgsMCwxNzcsMTQzLAorCTI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsNDAsMCwxODksMzksCisJNjQsMTMzLDEzMCwxNDMsMjMyLDI1NSwxODksMzksMjAsMCwxOTEsMTc1LAorCTIyLDAsNjYsNDAsMTMsMCw2NCwyMCwxNiwwLDE3NiwxNzUsCisJMiwxMzEsNCw2MCwyOCwxMjgsMTMyLDM2LDYwLDEyOCwxNDQsMzksCisJMzMsNDAsMCwyLDIsMTMxLDcsNjAsODQsMTI4LDIzMSwzNiwKKwkxNSw2MywxOTIsMTIsMTczLDAsNiwzNiwxLDAsNCwzNiwKKwkzMyw0MCwwLDIsMTg4LDcsMTkyLDEyLDE3MywwLDYsMzYsCisJNjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwxLDAsNjcsMzYsCisJNjQsMTMzLDEzMSwxNzUsMjAsMCwxOTEsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMjQsMCwxODksMzksMTI4LDE2LDQsMCwKKwkzMywxNiw2OCwwLDE2LDAsMTYzLDE0MywxMjgsMTYsMiwwLAorCTIsMTMxLDEsNjAsMzMsOCwzNCwwLDQsMjQ1LDM4LDE3MiwKKwkyLDEzMSwxLDYwLDMzLDgsMzQsMCwxMiwyNDUsMzksMTcyLAorCTIsMTMxLDEsNjAsMzMsOCwzNCwwLDAsMjQ1LDM4LDE3MiwKKwkyLDEzMSwxLDYwLDMzLDgsMzQsMCw4LDI0NSwzNywxNzIsCisJMiwxMzEsMSw2MCwzMyw4LDM0LDAsMTYsMjQ1LDM1LDE3MiwKKwk4LDAsMjI0LDMsMzMsMTYsMCwxLDEyOCwxNiw0LDAsCisJMzMsMTYsNjgsMCwxMjgsMTYsMiwwLDIsMTMxLDEsNjAsCisJMzMsOCwzNCwwLDgsMCwyMjQsMyw4LDI0NSwzMiwxNzIsCisJNjQsMTMzLDEzMCwxNDMsMTkyLDI1NSwxODksMzksNDAsMCwxODAsMTc1LAorCTMzLDE2MCwwLDAsNTYsMCwxOTEsMTc1LDUyLDAsMTgzLDE3NSwKKwk0OCwwLDE4MiwxNzUsNDQsMCwxODEsMTc1LDM2LDAsMTc5LDE3NSwKKwkzMiwwLDE3OCwxNzUsMjgsMCwxNzcsMTc1LDQ4LDAsNjQsMjQsCisJMjQsMCwxNzYsMTc1LDEsMCwyMywzNiwyLDAsMjIsMzYsCisJMiwxMzEsMTYsNjAsMTIsMjQ1LDE2LDM4LDQsMCwxOSwzOCwKKwkyNDQsMjU1LDE3LDM4LDI1MiwyNTUsMTgsMzgsMzMsMTY4LDAsMCwKKwkwLDAsNjcsMTQyLDAsMCwwLDAsNywwLDExOSwxNiwKKwkyLDAsOTgsNDAsMjUsMCw2NCwyMCwwLDAsMCwwLAorCTksMCwxMTgsMTYsMCwwLDAsMCwyMzYsMTEsMTkyLDgsCisJMjAsMCwxNiwzOCwwLDAsMzQsMTQyLDAsMCwwLDAsCisJMTcsMCw2NCwyOCwwLDAsMCwwLDIzMCwxMSwxOTIsOCwKKwkwLDAsNjQsMTc0LDAsMCwzNCwxNDIsMCwwLDAsMCwKKwkxMSwwLDY0LDI4LDAsMCwwLDAsMiwxMzEsMiw2MCwKKwkzMywxNiw4NSwwLDQsMjQ1LDY2LDE0MCwwLDAsMCwwLAorCTAsMCwzNCwxNzQsMCwwLDEwMCwxNDIsMCwwLDIsMTQyLAorCTAsMCwwLDAsOSwyNDgsNjQsMCwwLDAsMCwwLAorCTIwLDAsMTYsMzgsMjAsMCwxMTUsMzgsMjAsMCw0OSwzOCwKKwkyMCwwLDgyLDM4LDY0LDEzMywxMzAsMTQzLDEsMCwxNDgsMzgsCisJNDIsMTYsMTMwLDIsMjE4LDI1NSw2NCwyMCwyMCwwLDE4MSwzOCwKKwk1NiwwLDE5MSwxNDMsNTIsMCwxODMsMTQzLDQ4LDAsMTgyLDE0MywKKwk0NCwwLDE4MSwxNDMsNDAsMCwxODAsMTQzLDM2LDAsMTc5LDE0MywKKwkzMiwwLDE3OCwxNDMsMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNjQsMCwxODksMzksMCwwLDAsMCwKKwkyLDEzMSwzLDYwLDE5MiwyNDYsOTksMzYsMCwyLDIsMzYsCisJMCwxNjMsMSw2MCwyMDAsNSwzNSwxNzIsMCwxNjMsMSw2MCwKKwkyMDgsNSwzNCwxNzIsMCwxNjMsMiw2MCwxMjQsMSw2NiwxNDAsCisJMjE2LDI1NSwxODksMzksMTYsMCwxNzYsMTc1LDMzLDEyOCwwLDAsCisJMjgsMCwxNzksMTc1LDI1NSwyNTUsMTksMzYsMjQsMCwxNzgsMTc1LAorCTIxLDAsMTE0LDM2LDIwLDAsMTc3LDE3NSwzMiwwLDE5MSwxNzUsCisJMSwwLDY2LDQ0LDgwLDEzMywxMzAsMTc1LDEzOSwxNCwxOTIsMTIsCisJMjAsMCwxMTMsMzYsMTg0LDI0LDE5MiwxMiwwLDAsMCwwLAorCTI3LDY3LDE5MiwxMiwzMywzMiwwLDIsNiwwLDgzLDIwLAorCTEsMCwxNiwzOCwyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwKKwkxMTIsMTI4LDEzMiwzNiwxMjYsMTIsMTkyLDgsMSwwLDIsMzYsCisJMCwwLDM0LDE2MiwzLDE4LDIsMCwwLDAsNjYsMTYyLAorCTIsMCw4MiwzOCwzLDAsMiw0MiwyNDEsMjU1LDY0LDIwLAorCTIsMCw0OSwzOCwyLDEzMSwxNyw2MCwyMTIsMjQ2LDQ5LDM4LAorCTMzLDMyLDMyLDIsMzMsNDAsMCwwLDI1NSwxMjcsNiw2MCwKKwkyNDcsMjQsMTkyLDEyLDI1NSwyNTUsMTk4LDUyLDI1NSwzMSwzLDYwLAorCTI1NSwyNTUsOTksNTIsMjM2LDI1NSw0OCwzOCwzNiwwLDM0LDM4LAorCTM2LDE2LDY3LDAsMCwxNjAsMyw2MCwzNywxNiw2NywwLAorCTAsMzIsMywzNiwyMzYsMjU1LDMyLDE3NCwyLDEzMSwxLDYwLAorCTIyMCwyNDYsMzIsMTcyLDIsMTMxLDEsNjAsMjA0LDI0NiwzMiwxNzIsCisJMiwxMzEsMSw2MCwyMzYsMjQ2LDM0LDE3MiwwLDAsNjcsMTY0LAorCTIyMiwyMSwxOTIsMTIsMzMsMzIsMCwyLDEyMiwxNSwxOTIsMTIsCisJMzMsMzIsMCwyLDI0MiwyMSwxOTIsMTIsMzMsMzIsMCwyLAorCTMyLDEzMywxMzAsMTQzLDEsMCwxNiwzNiw0MiwxNiwyLDIsCisJMTIsMCw2NCwxNiwyNTUsMzEsMyw2MCwyMzYsMSw0OSwzOCwKKwkxMzMsMTIsMTkyLDEyLDMzLDMyLDAsMiwyNDIsMjEsMTkyLDEyLAorCTMzLDMyLDMyLDIsMzIsMTMzLDEzMCwxNDMsMSwwLDE2LDM4LAorCTQyLDE2LDIsMiwyNDgsMjU1LDY0LDIwLDAsMiw0OSwzOCwKKwkyNTUsMzEsMyw2MCwyNTUsMjU1LDk5LDUyLDIsMTMxLDE2LDYwLAorCTE5Miw0LDE2LDM4LDcsMCwyLDM2LDAsMCwyLDE3NCwKKwk1NiwwLDIsMzgsMzYsMTYsNjcsMCwwLDE2MCwzLDYwLAorCTM3LDE2LDY3LDAsMCwzMiwzLDM2LDIsMTMxLDEsNjAsCisJMjIwLDQsMzIsMTcyLDIsMTMxLDEsNjAsMjA0LDQsMzIsMTcyLAorCTIsMTMxLDEsNjAsMjM2LDQsMzQsMTcyLDAsMCw2NywxNjQsCisJMiwxMzEsMiw2MCwyMTIsMjQ2LDY2LDE0MCwyLDEzMSwzLDYwLAorCTIxNiwyNDYsOTksMTMyLDIwLDAsMiwxNzQsMjQsMCwzLDE2NiwKKwkyLDEzMSwyLDYwLDIxNyw0LDY2LDE0NCwwLDAsMCwwLAorCTcsMCw2NiwzNiwyLDEzMSwxLDYwLDIxNyw0LDM0LDE2MCwKKwkxMTIsMTUsMTkyLDEyLDMzLDMyLDAsMiwzMywzMiwwLDIsCisJMTksMTUsMTkyLDEyLDMyLDAsNSwzNiwyMCwwLDE2LDM4LAorCTMzLDMyLDAsMiw3LDAsNSwzNiwyNTUsMTI3LDYsNjAsCisJMjQ3LDI0LDE5MiwxMiwyNTUsMjU1LDE5OCw1MiwzMywxNiwwLDAsCisJMzIsMCwxOTEsMTQzLDI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDAsMCwxODksMzksMjAwLDI1NSwxODksMzksNDgsMCwxODAsMTc1LAorCTMzLDE2MCwxMjgsMCwyNTUsMzEsNiw2MCwyNTUsMjU1LDE5OCw1MiwKKwk2NCwyNiwyMCwwLDIsMTMxLDIsNjAsMTkyLDI0Niw2NiwzNiwKKwk0MCwwLDE3OCwxNzUsMzMsMTQ0LDk4LDAsMjU1LDI1NSwxMzIsMzgsCisJNjQsMTgsNCwwLDAsMTYyLDMsNjAsMzMsMTYsNjcsMCwKKwk1MiwwLDE5MSwxNzUsNDQsMCwxNzksMTc1LDM2LDAsMTc3LDE3NSwKKwkzMiwwLDE3NiwxNzUsNCwwLDY2LDE3NCwwLDEsNjYsMzYsCisJOCwwLDY2LDE3NCwwLDE2LDIsMzYsNCwxNiwxMzAsMCwKKwkxMiwwLDY2LDE3NCw0LDAsMiwzNiw0LDE2LDEzMCwwLAorCTAsMTYwLDUsNjAsMTYsMCw2NiwxNzQsNDgsMCw2NiwzOCwKKwkzNiwxNiw3MCwwLDM3LDE2LDY5LDAsMzYsMCw2NiwxNzQsCisJNjQsMTYsNCwwLDMzLDE2LDY4LDAsMTI4LDE2LDIsMCwKKwkyLDEzMSwzLDYwLDI0MCwyMzEsOTksMzYsMzMsMTYsNjcsMCwKKwkzNiwxNiw3MCwwLDM3LDE2LDY5LDAsNDAsMCw2NiwxNzQsCisJNTYsMCw2NiwzOCwzNiwxNiw3MCwwLDM3LDE2LDY5LDAsCisJMCwwLDg0LDE3NCw0NCwwLDY2LDE3NCwzMiwwLDY0LDE3NCwKKwkyLDEzMSwyLDYwLDIxMiwyNDYsNjYsMTQwLDIsMTMxLDMsNjAsCisJMjE2LDI0Niw5OSwxMzIsMjAsMCw2NiwxNzQsMjQsMCw2NywxNjYsCisJMjUsMCw2NiwxNDYsMCwwLDAsMCwzMywzMiw4NCwwLAorCTIsMTMxLDIsNjAsMCwyMjcsNjYsMzYsMzYsMTYsNzAsMCwKKwkzNywxMjgsNjksMCwyLDEzMSwyLDYwLDMyLDIyNyw2NiwzNiwKKwkzNiwxNiw3MCwwLDI1LDAsNjgsMTYyLDQwLDEzMywxMzEsMTQzLAorCTAsMCwwLDAsMywwLDk2LDE2LDM3LDEzNiw2OSwwLAorCTI1NSwyNTUsMTMwLDM2LDI1LDAsNjYsMTYyLDEyLDAsNjgsMTQyLAorCTI4LDAsNjQsMTc0LDIyOCw2MywxOTIsMTIsMSwwLDEzMiw1MiwKKwk0LDAsNjgsMTQyLDAsMCwwLDAsNzYsNjcsMTkyLDEyLAorCTMzLDQwLDAsMCw3Niw2MywxOTIsMTIsMCwwLDAsMCwKKwk3Niw2MywxOTIsMTIsMCwwLDAsMCwyNTUsMjU1LDIsMzYsCisJNCwwLDIsMTc0LDQsMCwyLDE0MiwwLDAsMCwwLAorCTAsMCwyLDE3NCw0LDAsNjgsMTQyLDAsMCwwLDAsCisJNzYsNjcsMTkyLDEyLDEsMCw1LDU0LDQsMCw0LDM4LAorCTMzLDQwLDAsMCwyNTUsMjU1LDYsMzYsMjExLDY3LDE5MiwxMiwKKwkyMDgsNyw3LDM2LDgsMCw2NCwyMCwyNTUsMjU1LDIsNTIsCisJMiwxMzEsNCw2MCwxODQsMTI4LDEzMiwzNiw0LDAsNiwxNDIsCisJMCwwLDAsMCwxNSw2MywxOTIsMTIsMzMsNDAsMTI4LDIsCisJMjU1LDI1NSwyLDUyLDQ4LDEsMzQsMTc0LDQsMCw2OCwxNDIsCisJMCwwLDAsMCw3Niw2NywxOTIsMTIsMywwLDM3LDU0LAorCTQ4LDEsMzYsMzgsMzMsNDAsMCwwLDI1NSwyNTUsNiw1MiwKKwkyMTEsNjcsMTkyLDEyLDIwOCw3LDcsMzYsNywwLDY0LDIwLAorCTAsMCwwLDAsMiwxMzEsNCw2MCw4LDEyOSwxMzIsMzYsCisJNDgsMSwzOCwxNDIsMCwwLDAsMCwxNSw2MywxOTIsMTIsCisJMzMsNDAsMTI4LDIsMTQzLDYzLDE5MiwxMiwwLDAsMCwwLAorCTQwLDAsNjksMTQyLDQsMCw2OCwxNDIsMCwwLDAsMCwKKwk3Niw2NywxOTIsMTIsMiwwLDE2NSw1Miw0NCwwLDgxLDE0MiwKKwk4NCwxMjgsMTMxLDE0Myw4MCwxMjgsMTMyLDE0MywxMDAsMCwyLDM2LAorCTAsMCwzMiwxNjYsMiwwLDMyLDE2Niw0LDAsMzIsMTc0LAorCTgsMCwzMiwxNzQsMTIsMCwzMiwxNzQsMTYsMCwzMiwxNzQsCisJMjQsMCwzMiwxNzQsMjAsMCwzMiwxNzQsMjgsMCwzMiwxNzQsCisJMzIsMCwzMiwxNzQsMzYsMCwzNCwxNjYsMzgsMCwzNCwxNjYsCisJMzYsMCwzNSwxNjYsMzgsMCwzNiwxNjYsMzYsMCw4MywxNDIsCisJMSwwLDIsMzYsMCwwLDk4LDE3NCw0NCwwLDY2LDE0MiwKKwkwLDAsMCwwLDQsMCw5OCwxNzQsNDAsMCw2NywxNDIsCisJMTE2LDAsMiw2MCwwLDAsOTgsMTcyLDQwLDAsNjcsMTQyLAorCTM2LDAsNjYsMTQyLDAsMCwwLDAsOCwwLDk4LDE3MiwKKwk4LDAsNjYsMTQyLDAsMCwwLDAsMCwwLDY0LDE3MiwKKwkwLDAsOTgsMTQyLDAsMCwwLDAsMTAsMCw2NCwxNiwKKwkzMywxMjgsMCwwLDIwOCw3LDIsNDIsNywwLDY0LDE2LAorCTAsMCwwLDAsMTQzLDYzLDE5MiwxMiwwLDAsMCwwLAorCTAsMCw5OCwxNDIsMCwwLDAsMCwyNDgsMjU1LDY0LDIwLAorCTEsMCwxNiwzOCwwLDAsOTgsMTQyLDAsMCwwLDAsCisJNiwwLDY0LDE2LDMzLDMyLDMyLDIsMiwxMzEsNCw2MCwKKwk3NiwxMjksMTMyLDM2LDE1LDYzLDE5MiwxMiwzMyw0MCwxMjgsMiwKKwkzMywzMiwzMiwyLDgsMCw1LDM2LDAsMCwzNCwxNTAsCisJOCwwLDYsMzYsMCwyNDAsNjYsNDgsMCw2LDY2LDUyLAorCTIsMCwzNCwxNjYsOCwwLDY2LDE0MiwyMDgsNyw3LDM2LAorCTEyOSw2NywxOTIsMTIsMCwwLDY0LDE3Miw2LDAsNjQsMjAsCisJMiwwLDM2LDM4LDIsMTMxLDQsNjAsMTYwLDEyOSwxMzIsMzYsCisJMTUsNjMsMTkyLDEyLDMzLDQwLDEyOCwyLDIsMCwzNiwzOCwKKwkzMyw0MCwwLDAsMCwwLDM0LDE1MCwzMyw0OCwwLDAsCisJMCwyNDAsNjYsNDgsMiwwLDM0LDE2Niw4LDAsNjYsMTQyLAorCTIwOCw3LDcsMzYsMTI5LDY3LDE5MiwxMiwwLDAsNjQsMTcyLAorCTQsMCw2NCwyMCwwLDAsMCwwLDIsMTMxLDQsNjAsCisJMTUsNjMsMTkyLDEyLDI0OCwxMjksMTMyLDM2LDE0Myw2MywxOTIsMTIsCisJMCwwLDAsMCwxMDgsMCw4MCwxNDIsMCwxMjgsMiw1MiwKKwkwLDAsMCwxNjYsMiwwLDIsMTY2LDQ0LDAsNjYsMTQyLAorCTAsMzIsNSwzNiw0LDAsODAsMTcyLDQ0LDAsNjcsMTQyLAorCTAsMjQxLDIsNTIsMiwwLDk4LDE2NCw4LDAsNjYsMTQyLAorCTAsMzIsNiwzNiwwLDAsNjQsMTcyLDQ0LDAsNjgsMTQyLAorCTAsMCwwLDAsMTI5LDY3LDE5MiwxMiwyMDgsNyw3LDM2LAorCTEyLDAsNjQsMjAsMCwwLDAsMCw0NCwwLDY2LDE0MiwKKwkwLDAsMCwwLDAsMCw2OSwxNDgsMiwxMzEsNCw2MCwKKwkxNSw2MywxOTIsMTIsMTYsMTMwLDEzMiwzNiwyNTQsMjU1LDQsMzYsCisJMiwxMzEsNSw2MCw0NCwxMzAsMTY1LDM2LDE4OCw3LDE5MiwxMiwKKwkxLDEsNiwzNiwxMDgsMCw4MCwxNDIsMiwxMjgsMiw1MiwKKwkwLDAsMCwxNjYsMiwwLDIsMTY2LDE0LDAsMiwzNiwKKwk4LDAsMiwxNjIsMjAwLDAsMiwzNiw5LDAsMiwxNjIsCisJNjUsMCwyLDM2LDEwLDAsMiwxNjIsNDYsMCwyLDM2LAorCTExLDAsMiwxNjIsODcsMCwyLDM2LDEyLDAsMCwxNjIsCisJMTMsMCwyLDE2MiwyNDIsMCwyLDM2LDE0LDAsMCwxNjIsCisJMTUsMCwyLDE2MiwxLDAsMiwzNiwxNiwwLDIsMTYyLAorCTgsMCwyLDM2LDE3LDAsMiwxNjIsODgsMTI4LDEzMCwxNDMsCisJMCwwLDAsMCw2LDAsNjQsMTYsNjQsMCwyLDM2LAorCTIsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLDU2LDEzMCwxMzIsMzYsCisJODgsMTI4LDEyOCwxNzUsNjQsMCwyLDM2LDE4LDAsMiwxNjIsCisJMjU1LDAsMiwzNiwxOSwwLDIsMTYyLDYzLDAsMiwzNiwKKwkyMCwwLDAsMTYyLDIxLDAsMiwxNjIsNDQsMCw2NiwxNDIsCisJMCwzMiw1LDM2LDQsMCw4MCwxNzIsNDQsMCw2NywxNDIsCisJMCwzMywyLDM2LDIsMCw5OCwxNjQsOCwwLDY2LDE0MiwKKwkwLDMyLDYsMzYsMCwwLDY0LDE3Miw0NCwwLDY4LDE0MiwKKwkwLDAsMCwwLDEyOSw2NywxOTIsMTIsMjA4LDcsNywzNiwKKwkxMiwwLDY0LDIwLDAsMCwwLDAsNDQsMCw2NiwxNDIsCisJMCwwLDAsMCwwLDAsNjksMTQ4LDIsMTMxLDQsNjAsCisJMTUsNjMsMTkyLDEyLDE2LDEzMCwxMzIsMzYsMjUzLDI1NSw0LDM2LAorCTIsMTMxLDUsNjAsNDQsMTMwLDE2NSwzNiwxODgsNywxOTIsMTIsCisJODUsMSw2LDM2LDIyMiwyMSwxOTIsMTIsMzMsMzIsNjQsMiwKKwkxMjIsMTUsMTkyLDEyLDMzLDMyLDY0LDIsNTIsMCwxOTEsMTQzLAorCTQ4LDAsMTgwLDE0Myw0NCwwLDE3OSwxNDMsNDAsMCwxNzgsMTQzLAorCTM2LDAsMTc3LDE0MywzMiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTU2LDAsMTg5LDM5LDI0OCwyNTUsMTg5LDM5LDMyLDEzMywxMzMsMTQzLAorCTAsMCwwLDAsNTAsMCwxNjAsMjQsMzMsMzIsMCwwLAorCTIsMTMxLDMsNjAsMTkyLDI0Niw5OSwzNiw0NCwwLDk4LDE0MCwKKwkxNTIsMCw5NiwxNzIsMTU2LDAsOTYsMTcyLDE2MCwwLDk2LDE3MiwKKwkxNjQsMCw5NiwxNzIsMTY4LDAsOTYsMTcyLDE3MiwwLDk2LDE3MiwKKwkxNzYsMCw5NiwxNzIsMTgwLDAsOTYsMTcyLDE4NCwwLDk2LDE3MiwKKwkxODgsMCw5NiwxNzIsMTkyLDAsOTYsMTcyLDE5NiwwLDk2LDE3MiwKKwkyMDAsMCw5NiwxNzIsMjA0LDAsOTYsMTcyLDIwOCwwLDk2LDE3MiwKKwkyMTIsMCw5NiwxNzIsMjE2LDAsOTYsMTcyLDIyNCwwLDk2LDE3MiwKKwkyMzIsMCw5NiwxNzIsMjM2LDAsOTYsMTcyLDI0MCwwLDk2LDE3MiwKKwkyNDQsMCw5NiwxNzIsMjQ4LDAsOTYsMTcyLDI1MiwwLDk2LDE3MiwKKwkwLDEsOTYsMTcyLDQsMSw5NiwxNzIsOCwxLDk2LDE3MiwKKwkxMiwwLDY0LDE3Miw0NCwwLDk4LDE0MCwwLDAsMCwwLAorCTE2LDAsNjQsMTcyLDQ0LDAsOTgsMTQwLDAsMCwwLDAsCisJMjQsMCw2NCwxNzIsNDQsMCw5OCwxNDAsMCwwLDAsMCwKKwkyMCwwLDY0LDE3Miw0NCwwLDk4LDE0MCwxLDAsMTMyLDM2LAorCTI4LDAsNjQsMTcyLDQ0LDAsOTgsMTQwLDAsMiw5OSwzNiwKKwkzMiwwLDY0LDE3Miw0MiwxNiwxMzMsMCwyMTAsMjU1LDY0LDIwLAorCTAsMCwwLDAsMzMsMzIsMCwwLDAsMTYzLDMsNjAsCisJMCwxLDk5LDUyLDMyLDAsNSwzNiwzMywxNiwxMzEsMCwKKwkxODgsMCw2OSwxNjAsMSwwLDEzMiwzNiwwLDIsMTMwLDQ0LAorCTI1MSwyNTUsNjQsMjAsMCwwLDAsMCw4LDAsMjI0LDMsCisJOCwwLDE4OSwzOSwwLDAsMCwwLDEyNCwxMzMsMTMwLDE0MywKKwkyMzIsMjU1LDE4OSwzOSwyMCwwLDE5MSwxNzUsMTcsMCw2NCwyMCwKKwkxNiwwLDE3NiwxNzUsMjA4LDcsMTYsMzYsNywwLDAsMjYsCisJMCwwLDAsMCwxNDMsNjMsMTkyLDEyLDI1NSwyNTUsMTYsMzgsCisJMTI0LDEzMywxMzAsMTQzLDAsMCwwLDAsMjQ5LDI1NSw2NCwxNiwKKwkwLDAsMCwwLDYsMCwwLDIyLDAsMCwwLDAsCisJMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsODAsMTMwLDEzMiwzNiwKKwk0NSwxNCwxOTIsOCwzMywxNiwwLDAsMjIwLDYzLDE5MiwxMiwKKwkzMywzMiwwLDAsMzMsMzIsNjQsMCwxMjQsMTMzLDE0NCwxNDMsCisJMTI4LDEzMywxMzAsMTQzLDQsMCwzLDE0MiwyNTUsMjU1LDY2LDM2LAorCTEyOCwxMzMsMTMwLDE3NSwxMjQsMTMzLDEzMSwxNzUsMjIwLDYzLDE5MiwxMiwKKwkwLDAsMCwwLDMzLDE2LDAsMiwyMCwwLDE5MSwxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywyNCwwLDE4OSwzOSwKKwkyMzIsMjU1LDE4OSwzOSw5NiwxMzMsMTMwLDE0MywzMyw0MCwxMjgsMCwKKwk0MywxNiwxNjIsMCw2LDAsNjQsMjAsMTYsMCwxOTEsMTc1LAorCTEwMCwxMzMsMTMwLDE0MywwLDAsMCwwLDQzLDE2LDE2MiwwLAorCTYsMCw2NCwyMCwwLDAsMCwwLDIsMTMxLDQsNjAsCisJMTUsNjMsMTkyLDEyLDExNiwxMzAsMTMyLDM2LDcxLDE0LDE5Miw4LAorCTAsMCwwLDAsMTI0LDEzMywxMzEsMTQzLDEyOCwxMzMsMTMwLDE0MywKKwkxMjQsMTMzLDEzMywxNzUsMSwwLDY2LDM2LDQsMCwxNjMsMTcyLAorCTEyOCwxMzMsMTMwLDE3NSwxNiwwLDE5MSwxNDMsMjQsMCwxODksMzksCisJOCwwLDIyNCwzLDAsMCwwLDAsMTA4LDEzMywxMzAsMTQzLAorCTIzMiwyNTUsMTg5LDM5LDIwLDAsMTkxLDE3NSwxNywwLDY0LDIwLAorCTE2LDAsMTc2LDE3NSwyMDgsNywxNiwzNiw3LDAsMCwyNiwKKwkwLDAsMCwwLDE0Myw2MywxOTIsMTIsMjU1LDI1NSwxNiwzOCwKKwkxMDgsMTMzLDEzMCwxNDMsMCwwLDAsMCwyNDksMjU1LDY0LDE2LAorCTAsMCwwLDAsNiwwLDAsMjIsMCwwLDAsMCwKKwkyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwxNDgsMTMwLDEzMiwzNiwKKwkxMDgsMTQsMTkyLDgsMzMsMTYsMCwwLDIyMCw2MywxOTIsMTIsCisJMzMsMzIsMCwwLDMzLDMyLDY0LDAsMTA4LDEzMywxNDQsMTQzLAorCTEyMCwxMzMsMTMwLDE0MywwLDAsMywxNDIsMjU1LDI1NSw2NiwzNiwKKwkxMjAsMTMzLDEzMCwxNzUsMTA4LDEzMywxMzEsMTc1LDIyMCw2MywxOTIsMTIsCisJMCwwLDAsMCwzMywxNiwwLDIsMjAsMCwxOTEsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMjQsMCwxODksMzksCisJMjMyLDI1NSwxODksMzksMTA0LDEzMywxMzAsMTQzLDMzLDQwLDEyOCwwLAorCTQzLDE2LDE2MiwwLDYsMCw2NCwyMCwxNiwwLDE5MSwxNzUsCisJMTEyLDEzMywxMzAsMTQzLDAsMCwwLDAsNDMsMTYsMTYyLDAsCisJNiwwLDY0LDIwLDAsMCwwLDAsMiwxMzEsNCw2MCwKKwkxNSw2MywxOTIsMTIsMTg0LDEzMCwxMzIsMzYsMTM1LDE0LDE5Miw4LAorCTAsMCwwLDAsMTA4LDEzMywxMzAsMTQzLDAsMCwwLDAsCisJMCwwLDE2MiwxNzIsMTIwLDEzMywxMzAsMTQzLDEwOCwxMzMsMTMzLDE3NSwKKwkxLDAsNjYsMzYsMTIwLDEzMywxMzAsMTc1LDE2LDAsMTkxLDE0MywKKwkyNCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkyMzIsMjU1LDE4OSwzOSwyMCwwLDE5MSwxNzUsMTYsMCwxNzYsMTc1LAorCTEyNCwxMzMsMTI4LDE3NSwxMyw4LDE5MiwxMiwwLDMyLDQsMzYsCisJMjU1LDMxLDMsNjAsMjU1LDI1NSw5OSw1MiwyNTUsMSwxNiwzNiwKKwkzNiwxNiw2NywwLDAsMTYwLDMsNjAsMzcsMTYsNjcsMCwKKwk5NiwxMzMsMTMwLDE3NSwwLDMyLDY2LDM2LDEwMCwxMzMsMTMwLDE3NSwKKwkwLDE3LDE2LDAsOTYsMTMzLDEzMiwxNDMsMjU1LDI1NSwxNiwzOCwKKwk0OSwxNCwxOTIsMTIsMzMsMzIsMTMwLDAsMjUxLDI1NSwxLDYsCisJMCwxNywxNiwwLDAsMiwyLDM2LDEzMiwxMzMsMTMwLDE3NSwKKwkxMDgsMTMzLDEyOCwxNzUsMTMsOCwxOTIsMTIsMTgsMCw0LDYwLAorCTI1NSwzMSwzLDYwLDI1NSwyNTUsOTksNTIsMjU1LDE3LDE2LDM2LAorCTM2LDE2LDY3LDAsMCwxNjAsMyw2MCwzNywxNiw2NywwLAorCTE4LDAsMyw2MCwxMDQsMTMzLDEzMCwxNzUsMzMsMTYsNjcsMCwKKwkxMTIsMTMzLDEzMCwxNzUsMCwxOCwxNiwwLDEwNCwxMzMsMTMyLDE0MywKKwkyNTUsMjU1LDE2LDM4LDExMiwxNCwxOTIsMTIsMzMsMzIsMTMwLDAsCisJMjUxLDI1NSwxLDYsMCwxOCwxNiwwLDAsMTgsMiwzNiwKKwkxMTYsMTMzLDEzMCwxNzUsMjAsMCwxOTEsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMjQsMCwxODksMzksMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwxNjMsMiw2MCwKKwkxNjgsMSw2NiwxNDAsMjE2LDI1NSwxODksMzksMjgsMCwxNzcsMTc1LAorCTMzLDEzNiwxMjgsMCwzMiwwLDE3OCwxNzUsMzMsMTQ0LDE2MCwwLAorCTM2LDAsMTkxLDE3NSwxNywwLDY0LDE2LDI0LDAsMTc2LDE3NSwKKwkwLDE2MywyLDYwLDE2OCwxLDY2LDE0MCwwLDAsMCwwLAorCTQyLDE2LDgyLDAsMTIsMCw2NCwxNiwxMjgsMTI4LDE4LDAsCisJMCwwLDM0LDE0MiwwLDE2MywxOCw2MCwxNjgsMSw4MiwxNDIsCisJMCwwLDAsMCw2LDAsNjQsMjAsMTI4LDEyOCwxOCwwLAorCTIsMTMxLDQsNjAsMjI0LDEzMCwxMzIsMzYsMTUsNjMsMTkyLDEyLAorCTMzLDQwLDY0LDIsMTI4LDEyOCwxOCwwLDMzLDEyOCwxOCwyLAorCTEyOCwxMjgsMTYsMCwxMyw4LDE5MiwxMiwzMywzMiwwLDIsCisJMjU1LDMxLDMsNjAsMjU1LDI1NSw5OSw1MiwzMywzMiwwLDAsCisJMzYsMTYsNjcsMCwwLDE2MCwzLDYwLDM3LDE2LDY3LDAsCisJMTEyLDAsMzQsMTc0LDExMiwwLDM1LDE0MiwzMywxNiw4MCwwLAorCTE1LDAsNjQsMjYsMTE2LDAsMzQsMTc0LDgsMCw1LDM2LAorCTEsMCwxMzIsMzYsMjAsMCw5OCwzNiw0LDAsOTgsMTcyLAorCTIsMCwxMDEsMTY0LDAsMCw5NiwxNjQsOCwwLDk2LDE3MiwKKwkxNCwwLDk2LDE2NCwxMiwwLDk2LDE2NCwzMywyNCw2NCwwLAorCTQyLDE2LDE0NiwwLDI0NiwyNTUsNjQsMjAsMSwwLDEzMiwzNiwKKwkyNTUsMjU1LDEzMiwzNiwxMTYsMCwzNSwxNDIsMTEyLDAsMzQsMTQyLAorCTAsMCwwLDAsMjQwLDI1NSw5OCwxNzIsMTE2LDAsMzUsMTQyLAorCTAsMCwwLDAsMjE4LDI1NSw5OCwxNDgsMCwwLDAsMCwKKwkwLDEyOCw2Niw1MiwyMTgsMjU1LDk4LDE2NCwxMTYsMCwzNSwxNDIsCisJMCwwLDAsMCwyMzgsMjU1LDk4LDE0OCwwLDAsMCwwLAorCTAsMTI4LDY2LDUyLDIzOCwyNTUsOTgsMTY0LDExNiwwLDM0LDE0MiwKKwkxMTIsMCwzNSwxNDIsMjE2LDI1NSw2NiwzNiwxMjAsMCwzNSwxNzQsCisJMTI0LDAsMzQsMTc0LDM2LDAsMTkxLDE0MywzMiwwLDE3OCwxNDMsCisJMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDAsMCwxODksMzksMjAwLDI1NSwxODksMzksMzIsMCwxNzgsMTc1LAorCTMzLDE0NCwxMjgsMCwwLDEsMiwzNiw0OCwwLDE5MSwxNzUsCisJNDQsMCwxODEsMTc1LDQwLDAsMTgwLDE3NSwzNiwwLDE3OSwxNzUsCisJMjgsMCwxNzcsMTc1LDI0LDAsMTc2LDE3NSwxNDQsMCw2NiwxNzQsCisJMCwxNjMsMiw2MCwxNzIsMSw2NiwxNDAsMCwwLDAsMCwKKwkxNywwLDY0LDE2LDMzLDE2MCwxNjAsMCwwLDE2MywyLDYwLAorCTE3MiwxLDY2LDE0MCwwLDAsMCwwLDQyLDE2LDg0LDAsCisJMTIsMCw2NCwxNiwxMjgsMTI4LDIwLDAsMCwwLDY2LDE0MiwKKwkwLDE2MywyMCw2MCwxNzIsMSwxNDgsMTQyLDAsMCwwLDAsCisJNiwwLDY0LDIwLDEyOCwxMjgsMjAsMCwyLDEzMSw0LDYwLAorCTIzNiwxMzAsMTMyLDM2LDE1LDYzLDE5MiwxMiwzMyw0MCwxMjgsMiwKKwkxMjgsMTI4LDIwLDAsMzMsMTI4LDIwLDIsMTI4LDEyOCwxNiwwLAorCTMzLDMyLDAsMiwxMyw4LDE5MiwxMiwxNDgsMCw4NCwxNzQsCisJMjU1LDMxLDMsNjAsMjU1LDI1NSw5OSw1MiwzMywxNTIsMCwwLAorCTM2LDE2LDY3LDAsMCwxNjAsMyw2MCwzNywxNiw2NywwLAorCTEyOCwwLDY2LDE3NCwxMjgsMCw4MSwxNDIsMzMsMTYsODAsMCwKKwkxNSwwLDEyOCwyNiwxMzIsMCw2NiwxNzQsMCwxLDIxLDM2LAorCTIwLDAsNDgsMzgsNCwwLDQ4LDE3NCw3NSwxNCwxOTIsMTIsCisJMCwwLDMyLDE3NCw4LDAsMzQsMTc0LDEyLDAsNTMsMTc0LAorCTAsMCw2NiwxNDIsMSwwLDExNSwzOCwxNiwwLDM0LDE2MiwKKwkxNywwLDMyLDE2Miw0MiwxNiwxMTYsMiwyNDQsMjU1LDY0LDIwLAorCTMzLDEzNiwwLDIsMTMyLDAsNjcsMTQyLDEyOCwwLDY2LDE0MiwKKwkwLDAsMCwwLDI0MCwyNTUsOTgsMTcyLDEzMiwwLDY3LDE0MiwKKwkwLDAsMCwwLDIyOCwyNTUsOTgsMTQwLDAsMCwwLDAsCisJMCwxMjgsNjYsNTIsMjI4LDI1NSw5OCwxNzIsMTMyLDAsNjcsMTQyLAorCTAsMCwwLDAsMjQ4LDI1NSw5OCwxNDAsMCwwLDAsMCwKKwkwLDEyOCw2Niw1MiwyNDgsMjU1LDk4LDE3MiwxMzIsMCw2NiwxNDIsCisJMTI4LDAsNjcsMTQyLDIxNiwyNTUsNjYsMzYsMTM2LDAsNjcsMTc0LAorCTE0MCwwLDY2LDE3NCw0OCwwLDE5MSwxNDMsNDQsMCwxODEsMTQzLAorCTQwLDAsMTgwLDE0MywzNiwwLDE3OSwxNDMsMzIsMCwxNzgsMTQzLAorCTI4LDAsMTc3LDE0MywyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTU2LDAsMTg5LDM5LDE1MiwwLDEyOCwxNzIsMTU2LDAsMTI4LDE3MiwKKwkxNjAsMCwxMjgsMTcyLDE2NCwwLDEyOCwxNzIsMTY4LDAsMTI4LDE3MiwKKwkyNTIsMCwxMjgsMTcyLDAsMSwxMjgsMTcyLDE1MiwwLDEyOCwxNzIsCisJOCwwLDIyNCwzLDIxNiwwLDEyOCwxNzIsMjMyLDI1NSwxODksMzksCisJMTYsMCwxNzYsMTc1LDIwLDAsMTkxLDE3NSwxMTIsMTUsMTkyLDEyLAorCTMzLDEyOCwxMjgsMCwzMywzMiwwLDIsMTkyLDE0LDE5MiwxMiwKKwkwLDQsNSwzNiwzMywzMiwwLDIsMTksMTUsMTkyLDEyLAorCTEyOCwyLDUsMzYsMTIwLDAsMywxNDIsMTM2LDAsMiwxNDIsCisJMCwwLDAsMCw4LDAsOTgsMTcyLDQ0LDAsMywxNDIsCisJMTIwLDAsMiwxNDIsMCwwLDAsMCw4LDAsOTgsMTcyLAorCTAsMCwyLDE0MiwwLDAsMCwwLDI1NSwyNTUsNjYsMzYsCisJNiwwLDY2LDQ0LDcsMCw2NCwxNiwxNiwwLDMsMzYsCisJNDQsMCwyLDE0MiwwLDAsMCwwLDIsMCw2NywxNjQsCisJOCwwLDIsMTQyLDAsMCwwLDAsMCwwLDY0LDE3MiwKKwkyMCwwLDE5MSwxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkyNCwwLDE4OSwzOSwxODQsMjU1LDE4OSwzOSwwLDMyLDYsMzYsCisJNjgsMCwxOTEsMTc1LDY0LDAsMTkwLDE3NSw2MCwwLDE4MywxNzUsCisJNTYsMCwxODIsMTc1LDUyLDAsMTgxLDE3NSw0OCwwLDE4MCwxNzUsCisJNDQsMCwxNzksMTc1LDQwLDAsMTc4LDE3NSwzNiwwLDE3NywxNzUsCisJMzIsMCwxNzYsMTc1LDAsMTYzLDEsNjAsMjUyLDUsMzgsMTcyLAorCTEzLDgsMTkyLDEyLDAsMzIsNCwzNiwyNTUsMzEsNCw2MCwKKwkyNTUsMjU1LDEzMiw1MiwzMywxNjgsMCwwLDI1NSwzMSw2LDYwLAorCTI1NSwyNTUsMTk4LDUyLDIsMTMxLDMsNjAsMjEyLDI0Nyw5OSwzNiwKKwkxNiwwLDEwMSwzNiw4LDAsMTI2LDM2LDI0OCwyNTUsMTE5LDM2LAorCTMzLDE3Niw5NiwwLDM2LDE2LDY4LDAsMCwxNjAsMyw2MCwKKwkzNywxNiw2NywwLDE2LDAsMTY2LDE3NSwwLDE2MywxLDYwLAorCTI0OCw1LDM0LDE3MiwwLDE2MywxLDYwLDAsNiwzMiwxNzIsCisJMzMsMTYwLDAsMCwzMywxMjgsMjI0LDIsMzMsMTUyLDE2MCwwLAorCTMzLDE0NCwxOTIsMywzMywxMzYsMTkyLDIsMzIsMTMzLDEzMCwxNDMsCisJMCwwLDMyLDE3NCwwLDAsMCwxNzQsMCwwLDY0LDE3NCwKKwk0MiwxNiwxNjIsMiwxMCwwLDY0LDE2LDAsMCw5NiwxNzQsCisJMCwzMiw0LDM2LDEzLDgsMTkyLDEyLDI0LDAsMTY1LDE3NSwKKwkxNiwwLDE2NiwxNDMsMCwxMjgsMyw2MCwzNiwxNiw3MCwwLAorCTM3LDE2LDY3LDAsMCwwLDIsMTc0LDI0LDAsMTY1LDE0MywKKwk0LDAsMTYsMzgsNCwwLDExNSwzOCw0LDAsODIsMzgsCisJMSwwLDE0OCwzOCwyLDAsMTMwLDQyLDIzNCwyNTUsNjQsMjAsCisJNCwwLDQ5LDM4LDAsMiwxNjUsMzYsMCwyLDIyMiwzOSwKKwkwLDIsMjQ3LDM4LDEsMCwxODEsMzgsNywwLDE2Miw0MiwKKwkyMjIsMjU1LDY0LDIwLDAsMiwyMTQsMzgsNjgsMCwxOTEsMTQzLAorCTY0LDAsMTkwLDE0Myw2MCwwLDE4MywxNDMsNTYsMCwxODIsMTQzLAorCTUyLDAsMTgxLDE0Myw0OCwwLDE4MCwxNDMsNDQsMCwxNzksMTQzLAorCTQwLDAsMTc4LDE0MywzNiwwLDE3NywxNDMsMzIsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw3MiwwLDE4OSwzOSwwLDE2Myw0LDYwLAorCTAsNiwxMzIsMTQwLDAsMTYzLDMsNjAsOCw2LDk5LDE0MCwKKwkzMiwxMzMsMTMwLDE0MywyMjQsMjU1LDE4OSwzOSwxNiwwLDE3NiwxNzUsCisJMCwxNjMsMTYsNjAsMTIsNiwxNiwxNDIsMjAsMCwxNzcsMTc1LAorCTAsMTYzLDE3LDYwLDQsNiw0OSwxNDIsNDMsMTYsOTgsMCwKKwk0MiwwLDY0LDE2LDI0LDAsMTkxLDE3NSwyLDAsMiw0NiwKKwk0MCwwLDY0LDE2LDI1NSwyNTUsMiwzNiwwLDE2MywyLDYwLAorCTI1Miw1LDY2LDE0MCwwLDAsMCwwLDQzLDE2LDgxLDAsCisJMzQsMCw2NCwyMCwyNTUsMjU1LDIsMzYsNjQsMTgsMywwLAorCTIsMTMxLDMsNjAsMTkyLDI0Niw5OSwzNiwzMywyNCw2NywwLAorCTEsMCwyLDM2LDUsMCwxMzAsMTYsMiwwLDIsMzYsCisJMTgsMCwxMzAsMTYsMTI4LDE2LDE2LDAsMzYsMTYsMTkyLDgsCisJMCwwLDAsMCwxMjgsMTI4LDE2LDAsMzMsMTI4LDMsMiwKKwkxMiwxLDQsMTQyLDAsMTYzLDUsNjAsMjQ4LDUsMTY1LDE0MCwKKwkzMyw0OCwzMiwyLDgwLDY4LDE5MiwxMiwzNiwxLDE3LDE3NCwKKwkxMiwxLDQsMTQyLDEyLDEsMiwxNDIsMzMsNDAsMzIsMiwKKwkxMTQsNjgsMTkyLDEyLDIwLDEsMiwxNzQsMzYsMTYsMTkyLDgsCisJMCwwLDAsMCwzMywxNiw2NywwLDIwLDEsNjQsMTcyLAorCTM2LDEsNjQsMTcyLDAsMTYzLDEsNjAsNDIsMTYsMTkyLDgsCisJMCw2LDMyLDE3MiwyNTUsMjU1LDIsMzYsMCwxNjMsMSw2MCwKKwkwLDYsMzQsMTcyLDI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywzMiwwLDE4OSwzOSwKKwkxNzYsMTMzLDEzNiwxNDMsMTg4LDEzMywxMzcsMTQzLDIzMiwyNTUsMTg5LDM5LAorCTMsMCwwLDIxLDE2LDAsMTkxLDE3NSwxMjQsMCwzMiwxNywKKwkwLDAsMCwwLDEyLDAsMTk0LDE0OCwwLDAsMCwwLAorCTAsMjYsMiwwLDIsMTgsMiwwLDM3LDU2LDk4LDAsCisJMjU1LDI1NSwyMjcsNDgsMjIxLDUsOTgsNDQsMzYsMCw2NCwyMCwKKwkxNzAsMTcwLDIsNTIsMCw4LDIsMzYsMjMsMCw5OCwyMCwKKwk2LDgsMiwzNiwyMSwwLDAsMTcsMCwwLDAsMCwKKwkzMiwwLDE5NCwxNDgsMzAsMCwxOTUsMTQ4LDAsMjAsMiwwLAorCTM3LDU2LDY3LDAsMzYsMCwxOTUsMTQ4LDAsMTYxLDIsNTIsCisJNSwwLDk4LDE2LDgsMCwyLDM2LDM0LDAsMTk1LDE0OCwKKwkwLDAsMCwwLDk4LDAsOTgsMjAsMCwwLDAsMCwKKwkzLDAsMjMyLDE2LDI1NSwyNTUsMiwzNiw5NCwwLDIyNiwyMCwKKwkwLDAsMCwwLDIyNiw0NiwxOTIsMTIsMTQsMCw2LDM2LAorCTE3NywxNiwxOTIsOCwwLDAsMCwwLDcsMCw5OCwyMCwKKwkyNTUsMjU1LDIyNyw0OCw3MSwwLDAsMTcsNTUsMTI5LDIsNTIsCisJMTA4LDQzLDE5MiwxMiwxNCwwLDYsMzYsMTc3LDE2LDE5Miw4LAorCTAsMCwwLDAsMTYyLDE2LDE5Miw4LDU1LDEyOSwyLDUyLAorCTE0LDAsMTk1LDE0OCwwLDAsMCwwLDYxLDAsOTgsMjAsCisJMjU1LDI1NSwyLDUyLDE2LDAsMTk1LDE0NCwzLDAsMiwzNiwKKwk1NSwwLDk4LDIwLDI1NSwyNTUsMiw1MiwyMCwwLDE5NCwxNDgsCisJMCwwLDAsMCwwLDI2LDIsMCwyLDE4LDIsMCwKKwkzNyw1Niw5OCwwLDI1NSwyNTUsMjI3LDQ4LDAsOCwyLDM2LAorCTIzLDAsOTgsMjAsNiw4LDIsMzYsMjEsMCwwLDE3LAorCTAsMCwwLDAsNDAsMCwxOTQsMTQ4LDM4LDAsMTk1LDE0OCwKKwkwLDIwLDIsMCwzNyw1Niw2NywwLDQ0LDAsMTk1LDE0OCwKKwkwLDE2MSwyLDUyLDUsMCw5OCwxNiw4LDAsMiwzNiwKKwk0MiwwLDE5NSwxNDgsMCwwLDAsMCw0OSwwLDk4LDIwLAorCTAsMCwwLDAsMywwLDIzMiwxNiwyNTUsMjU1LDIsMzYsCisJNDUsMCwyMjYsMjAsMCwwLDAsMCwyMjYsNDYsMTkyLDEyLAorCTIyLDAsNiwzNiwxNzcsMTYsMTkyLDgsMCwwLDAsMCwKKwk3LDAsOTgsMjAsMjU1LDI1NSwyMjcsNDgsNiwwLDAsMTcsCisJNTUsMTI5LDIsNTIsMTA4LDQzLDE5MiwxMiwyMiwwLDYsMzYsCisJMTc3LDE2LDE5Miw4LDAsMCwwLDAsNTUsMTI5LDIsNTIsCisJMzAsMCw5OCwyMCwwLDAsMCwwLDI4LDAsMzIsMTcsCisJMTQ0LDE1LDMsMzYsMzgsMCwxOTQsMTQ4LDI4LDAsMTk4LDE0MCwKKwkyNCwwLDY3LDIwLDAsMCwwLDAsMywwLDIwMSwxNiwKKwkwLDAsMCwwLDIwLDAsMTkyLDIwLDAsMCwwLDAsCisJMTc1LDE2LDE5Miw4LDIyLDAsNiwzNiwxNCwwLDE5NSwxNDgsCisJMCwwLDAsMCwxNCwwLDk4LDIwLDAsMCwwLDAsCisJMTIsMCwzMiwxNywxNDQsMTUsMywzNiwzMCwwLDE5NCwxNDgsCisJMjAsMCwxOTgsMTQwLDgsMCw2NywyMCwwLDAsMCwwLAorCTMsMCwyMDEsMTYsMCwwLDAsMCw0LDAsMTkyLDIwLAorCTAsMCwwLDAsMTQsMCw2LDM2LDEyNiw0OSwxOTIsMTIsCisJMCwwLDAsMCwxNiwwLDE5MSwxNDMsMjQsMCwxODksMzksCisJOCwwLDIyNCwzLDAsMCwwLDAsMTI4LDI1NSwxODksMzksCisJMTE2LDAsMTgzLDE3NSwzMywxODQsMTI4LDAsMywwLDMsMzYsCisJMTI0LDAsMTkxLDE3NSwxMjAsMCwxOTAsMTc1LDExMiwwLDE4MiwxNzUsCisJMTA4LDAsMTgxLDE3NSwxMDQsMCwxODAsMTc1LDEwMCwwLDE3OSwxNzUsCisJOTYsMCwxNzgsMTc1LDkyLDAsMTc3LDE3NSw4OCwwLDE3NiwxNzUsCisJMCwwLDI0NSwxNDIsOCwwLDE3OCwxNDAsMTkyLDE3LDIxLDAsCisJMywxMzEsNCw2MCwzMywzMiwxMzAsMCwyMCwxMywxMzIsMTQwLAorCTgsMCw4NCwxNDIsMCwwLDAsMCw1OSwwLDEzMSwxNiwKKwk1LDAsMTMwLDQ0LDU3LDAsNjQsMTYsMTI4LDE2LDQsMCwKKwkyLDEzMSwxLDYwLDMzLDgsMzQsMCwxMDQsMTMxLDM0LDE0MCwKKwkwLDAsMCwwLDgsMCw2NCwwLDAsMCwwLDAsCisJNDQsMTMzLDEzMCwxNDMsMCwwLDAsMCw0OCwwLDY0LDE2LAorCTYsMCwxMzIsMzgsNCwwLDEzMSwxNTAsMiwxMzEsMiw2MCwKKwk2OCwyMDcsNjYsMTQ4LDAsMCwwLDAsNiwwLDk4LDIwLAorCTMzLDMyLDAsMCwwLDAsMTMwLDE0Miw0OCwxMjksMTMxLDE0MywKKwkwLDAsMCwwLDM4LDE2LDY3LDAsMSwwLDY4LDQ0LAorCTcyLDEsMTI4LDE2LDMzLDMyLDE2MCwyLDExNCw0MiwxOTIsMTIsCisJMzMsNDAsMTI4LDIsNDUsMTgsMTkyLDgsMzMsMzIsNjQsMiwKKwk0NCwxMzMsMTMwLDE0MywwLDAsMCwwLDI3LDAsNjQsMTYsCisJNiwwLDEzMiwzOCw0LDAsMTMxLDE1MCwyLDEzMSwyLDYwLAorCTY4LDIwNyw2NiwxNDgsMCwwLDAsMCw2LDAsOTgsMjAsCisJMzMsMzIsMCwwLDAsMCwxMzAsMTQyLDQ4LDEyOSwxMzEsMTQzLAorCTAsMCwwLDAsMzgsMTYsNjcsMCwxLDAsNjgsNDQsCisJNSwwLDEyOCwxNiwzMywzMiwxNjAsMiwxMTQsNDIsMTkyLDEyLAorCTMzLDQwLDEyOCwyLDQ1LDE4LDE5Miw4LDMzLDMyLDY0LDIsCisJNiwwLDEzMiwzOCwwLDE2Myw2LDYwLDE0MCwxLDE5OCwxNDAsCisJMCwwLDAsMCwyNDcsMjQsMTkyLDEyLDMzLDQwLDE2MCwyLAorCTQ1LDE4LDE5Miw4LDMzLDMyLDY0LDIsNiwwLDEzMiwzOCwKKwkwLDE2Myw2LDYwLDE0MCwxLDE5OCwxNDAsMCwwLDAsMCwKKwkyNDcsMjQsMTkyLDEyLDMzLDQwLDE2MCwyLDIwMywyNCwxOTIsMTIsCisJMzMsMzIsMTI4LDIsMjAsMSwyMjcsMTQyLDAsMCwwLDAsCisJMTQsMCw5NiwxNiwzMywyNDAsNjQsMCwzMywzMiwxMjgsMiwKKwkxNiwwLDE2NiwzOSwxOCwwLDY5LDE1MCwwLDAsMCwwLAorCTksMjQ4LDk2LDAsMzMsNTYsMTkyLDMsNiwwLDY0LDE2LAorCTMzLDMyLDY0LDIsMjgsMSwyMjYsMTQyLDAsMCwwLDAsCisJMSwwLDY2LDM2LDQ1LDE4LDE5Miw4LDI4LDEsMjI2LDE3NCwKKwkxMzIsMCwxOTMsNyw3LDAsMiwzNiw0LDAsMTMxLDE1MCwKKwkyLDEzMSwyLDYwLDY4LDIwNyw2NiwxNDgsMCwwLDAsMCwKKwk2LDAsOTgsMjAsMzMsMzIsMCwwLDAsMCwxMzAsMTQyLAorCTQ4LDEyOSwxMzEsMTQzLDAsMCwwLDAsMzgsMTYsNjcsMCwKKwkxLDAsNjgsNDQsOSwwLDEyOCwxNiwyNTUsMjU1LDIsMzYsCisJNDQsMTMzLDEzMCwxNDMsMCwwLDAsMCwyNTEsMCw2NCwxNiwKKwkzMywzMiwxNjAsMiwxMTQsNDIsMTkyLDEyLDMzLDQwLDEyOCwyLAorCTQ1LDE4LDE5Miw4LDMzLDMyLDY0LDIsMTAsMCwxOTQsMjMsCisJMCwwLDAsMCw4LDAsMTYwLDE4LDAsMCwwLDAsCisJMzYsMTMzLDEzMCwxNDMsMCwwLDAsMCw4LDAsNjQsMTYsCisJMSwwLDE5LDM2LDgwLDEzMywxNDcsMTQzLDY5LDE3LDE5Miw4LAorCTAsMCwwLDAsMCwxLDIyNiwxNDIsODAsMTMzLDE0NywxNDMsCisJMSwwLDY2LDM2LDAsMSwyMjYsMTc0LDg0LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsMzUsMTYsODMsMCwyNTUsMjU1LDY2LDM2LAorCTE3LDAsNjYsMTYyLDg0LDEzMywxMzAsMTQzLDMzLDEyOCw5NiwyLAorCTQyLDE2LDIsMiwxNSwwLDY0LDE2LDY0LDE4LDE2LDAsCisJMiwxMzEsMyw2MCwxOTIsMjQ2LDk5LDM2LDMzLDEzNiw2NywwLAorCTUsMCwyMSwxOCwwLDAsMCwwLDI0NywyMiwxOTIsMTIsCisJMzMsMzIsMzIsMiwyMTcsMCw2NCwxNiwzMywxNiwwLDAsCisJODQsMTMzLDEzMCwxNDMsMSwwLDE2LDM4LDQyLDE2LDIsMiwKKwkyNDYsMjU1LDY0LDIwLDAsMiw0OSwzOCw4NCwxMzMsMTMwLDE0MywKKwkzMywxMjgsOTYsMiw0MiwxNiwyLDIsNTUsMCw2NCwxNiwKKwk2NCwxOCwxNiwwLDIsMTMxLDMsNjAsMTkyLDI0Niw5OSwzNiwKKwkzMywxNTIsNjcsMCwzMywxMzYsNjQsMCwxOTIsMTc3LDE2LDAsCisJNDEsMCwyMSwxOCwwLDAsMCwwLDIsMTMxLDIsNjAsCisJMzMsMTYsODEsMCwyMTYsMjQ3LDY2LDE0MCwwLDAsMCwwLAorCTE1LDAsNjQsMTYsMzMsMzIsMTI4LDIsMTYsMCwxNjYsMzksCisJMTgsMCw2OSwxNTAsMCwwLDAsMCw5LDI0OCw2NCwwLAorCTMzLDU2LDE2MCwyLDgsMCw2NCwxNiwwLDAsMCwwLAorCTIsMTMxLDIsNjAsMzMsMTYsODEsMCwyMjQsMjQ3LDY2LDE0MCwKKwkwLDAsMCwwLDEsMCw2NiwzNiwxNDAsMTcsMTkyLDgsCisJMzIsMSw5OCwxNzQsNDQsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwk3LDAsNjQsMTYsMywwLDgsMzYsMywxMzEsMiw2MCwKKwkzMywxNiw4NiwwLDIwLDEzLDY2LDE0MCwwLDAsMCwwLAorCTYsMCw3MiwyMCwwLDAsMCwwLDMzLDMyLDk2LDIsCisJNiwyMywxOTIsMTIsMzMsNDAsNjQsMiwxNDYsMTcsMTkyLDgsCisJMCwyLDExNSwzOCwxNywwLDY2LDE0NiwwLDAsMCwwLAorCTI1NSwyNTUsNjYsMzYsMTcsMCw2NiwxNjIsMTcsMCw2NiwxNDYsCisJMCwyLDExNSwzOCwwLDIsNDksMzgsODQsMTMzLDEzMCwxNDMsCisJMSwwLDE2LDM4LDQyLDE2LDIsMiwyMDgsMjU1LDY0LDIwLAorCTEyOCwwLDIxNCwzOCwyNTQsMjU1LDIsMzYsNCwwLDE5NCwyMywKKwkzMywzMiwyMjQsMiwzMyw0MCw2NCwyLDQ3LDE2LDE5MiwxMiwKKwkzMyw0OCwxMjgsMiwxNywwLDY2LDE0NiwwLDAsMCwwLAorCTE0MCwwLDY0LDE2LDMzLDMyLDY0LDIsMzYsMTgsMTkyLDgsCisJMCwwLDAsMCwyNiwwLDE5NCwyMywwLDAsMCwwLAorCTM2LDEzMywxMzAsMTQzLDAsMCwwLDAsMTEsMCw2NCwxNiwKKwkzMywzMiwyMjQsMiw5LDAsMTYwLDE4LDEsMCwyLDM2LAorCTE3LDAsNjYsMTYyLDIsMTMxLDQsNjAsMTkyLDI0NiwxMzIsMzYsCisJNiwyMywxOTIsMTIsMzMsNDAsNjQsMiwxMjYsMCw2NCwxNiwKKwkzMywxNiwwLDAsMzMsMzIsMjI0LDIsMzMsNDAsNjQsMiwKKwk0NywxNiwxOTIsMTIsMzMsNDgsMTI4LDIsMzYsMTMzLDEzMCwxNDMsCisJMCwwLDAsMCwxMTUsMCw2NCwxNiwzMywzMiw2NCwyLAorCTExNiwwLDE2MCwyMiwxLDAsMiwzNiw0NSwxOCwxOTIsOCwKKwkwLDAsMCwwLDg3LDAsMjEzLDE5LDY0LDEzMCwzMCwwLAorCTIsMTMxLDIsNjAsMzMsMTYsODAsMCwyMTYsMjQ3LDY2LDE0MCwKKwkwLDAsMCwwLDE4LDAsNjQsMTYsMzMsMzIsMTI4LDIsCisJMTYsMCwxNjYsMzksMTgsMCw2OSwxNTAsMCwwLDAsMCwKKwk5LDI0OCw2NCwwLDMzLDU2LDE2MCwyLDExLDAsNjQsMTYsCisJMzMsMzIsNjQsMiwyLDEzMSwyLDYwLDMzLDE2LDgwLDAsCisJMjI0LDI0Nyw2NiwxNDAsMCwwLDAsMCwxLDAsNjYsMzYsCisJMiwxMzEsMSw2MCwzMyw4LDQ4LDAsMjI0LDI0NywzNCwxNzIsCisJNDUsMTgsMTkyLDgsMTcsMCwxMjgsMTYwLDM2LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsNDMsMCw2NCwxNiwwLDAsMCwwLAorCTQxLDAsMTkyLDE5LDAsMCwwLDAsMzksMCwxNjAsMTgsCisJNjQsMTgsMzAsMCwyLDEzMSwxNiw2MCwxOTIsMjQ2LDE2LDM4LAorCTMzLDEzNiw4MCwwLDI0NywyMiwxOTIsMTIsMzMsMzIsMzIsMiwKKwk3NCwwLDY0LDE2LDMzLDE2LDAsMCwyNDcsMjIsMTkyLDEyLAorCTMzLDMyLDAsMiw2MywwLDY0LDE2LDIsMCwyLDM2LAorCTE3LDAsNjYsMTYyLDQ0LDEzMywxMzAsMTQzLDAsMCwwLDAsCisJNywwLDY0LDE2LDE5MiwxNywzMCwwLDMsMTMxLDMsNjAsCisJMzMsMjQsOTgsMCwyMCwxMyw5OSwxNDAsMywwLDIsMzYsCisJNiwwLDk4LDIwLDAsMCwwLDAsMzMsMzIsMzIsMiwKKwk2LDIzLDE5MiwxMiwzMyw0MCw2NCwyLDAsMTgsMTkyLDgsCisJMCwwLDAsMCwxNywwLDY2LDE0NiwwLDAsMCwwLAorCTI1NSwyNTUsNjYsMzYsMTcsMCw2NiwxNjIsMTcsMCw2NiwxNDYsCisJMiwxMzEsNCw2MCwxOTIsMjQ2LDEzMiwzNiw2LDIzLDE5MiwxMiwKKwkzMyw0MCw2NCwyLDM2LDE4LDE5Miw4LDAsMCwwLDAsCisJNDQsMTMzLDEzMCwxNDMsMCwwLDAsMCw3LDAsNjQsMTYsCisJMTkyLDE3LDMwLDAsMywxMzEsMyw2MCwzMywyNCw5OCwwLAorCTIwLDEzLDk5LDE0MCwzLDAsMiwzNiwyOCwwLDk4LDIwLAorCTAsMCwwLDAsMSwwLDIsMzYsMTcsMCw2NiwxNjIsCisJNjQsMTgsMzAsMCwyLDEzMSw0LDYwLDE5MiwyNDYsMTMyLDM2LAorCTMyLDE4LDE5Miw4LDMzLDMyLDY4LDAsMzYsMTMzLDEzMCwxNDMsCisJMCwwLDAsMCwxNywwLDY0LDE2LDAsMCwwLDAsCisJMTUsMCwxOTIsMTksMSwwLDIsMzYsMTcsMCw2NiwxNjIsCisJMiwxMzEsNCw2MCwxOTIsMjQ2LDEzMiwzNiw2LDIzLDE5MiwxMiwKKwkzMyw0MCw2NCwyLDEzLDAsNjQsMTYsMzMsMTYsMCwwLAorCTI1MiwwLDIyNiwxNDIsMCwwLDAsMCwxLDAsNjYsMzYsCisJNDcsMTgsMTkyLDgsMjUyLDAsMjI2LDE3NCw0OCwxOCwxOTIsOCwKKwkzMywxNiwwLDAsMTcsMCw2NCwxNjIsMzMsMzIsNjQsMiwKKwkxNTIsMjEsMTkyLDEyLDAsMCwwLDAsMSwwLDIsMzYsCisJMTI0LDAsMTkxLDE0MywxMjAsMCwxOTAsMTQzLDExNiwwLDE4MywxNDMsCisJMTEyLDAsMTgyLDE0MywxMDgsMCwxODEsMTQzLDEwNCwwLDE4MCwxNDMsCisJMTAwLDAsMTc5LDE0Myw5NiwwLDE3OCwxNDMsOTIsMCwxNzcsMTQzLAorCTg4LDAsMTc2LDE0Myw4LDAsMjI0LDMsMTI4LDAsMTg5LDM5LAorCTIxNiwyNTUsMTg5LDM5LDI0LDAsMTc4LDE3NSwzMywxNDQsMTI4LDAsCisJMzIsMCwxOTEsMTc1LDI4LDAsMTc5LDE3NSwyMCwwLDE3NywxNzUsCisJMTYsMCwxNzYsMTc1LDgsMCwxNzcsMTQwLDAsMCw2NiwxNDIsCisJOCwwLDM4LDE0MiwzNiwwLDY0LDE2LDAsMCwwLDAsCisJMjgsMCw2NiwxNDIsMCwwLDAsMCwxOCwwLDY0LDIwLAorCTEsMCwyLDM2LDAsMCwxOTQsMTQ0LDAsMCwwLDAsCisJMSwwLDY2LDQ4LDEzLDAsNjQsMjAsMSwwLDIsMzYsCisJNCwwLDE5NSwxNDgsMjQsMCw2NiwxNTAsMCwwLDAsMCwKKwk2LDAsOTgsMjAsMzMsMzIsMCwwLDAsMCwxOTQsMTQwLAorCTIwLDAsNjcsMTQyLDAsMCwwLDAsMzgsMTYsNjcsMCwKKwkxLDAsNjgsNDQsMTAsMCwxMjgsMTYsMSwwLDIsMzYsCisJMTcsMCwzNCwxNjIsMiwxMzEsNCw2MCwxOTIsMjQ2LDEzMiwzNiwKKwk2LDIzLDE5MiwxMiwzMyw0MCwzMiwyLDQ1LDAsNjQsMTYsCisJMzMsMTYsMCwwLDEzOSwxOCwxOTIsOCwwLDAsMCwwLAorCTE3LDAsMzIsMTYyLDE1MiwyMSwxOTIsMTIsMzMsMzIsMzIsMiwKKwkxNDQsMTgsMTkyLDgsMSwwLDIsMzYsMTYsMCwxNzksMTQwLAorCTAsMCwwLDAsNiwwLDk2LDI2LDAsMCwwLDAsCisJMzIsMTMzLDEzMCwxNDMsMCwwLDAsMCw0MiwxNiw5OCwyLAorCTE1LDAsNjQsMjAsMSwwLDIsMzYsMiwxMzEsNCw2MCwKKwkyNDgsMTMwLDEzMiwzNiwyLDEzMSwxNiw2MCwyNCwxMzEsMTYsMzgsCisJMzMsNDAsMCwyLDIsMTMxLDcsNjAsMzYsMTMxLDIzMSwzNiwKKwkxNSw2MywxOTIsMTIsMTg4LDIsNiwzNiwxLDAsNCwzNiwKKwkzMyw0MCwwLDIsMTg4LDcsMTkyLDEyLDE4OCwyLDYsMzYsCisJMSwwLDIsMzYsMTcsMCwzNCwxNjIsNjQsMTgsMTksMCwKKwkyLDEzMSw0LDYwLDE5MiwyNDYsMTMyLDM2LDMzLDMyLDY4LDAsCisJNiwyMywxOTIsMTIsMzMsNDAsMzIsMiw2LDAsNjQsMTYsCisJMzMsMTYsMCwwLDI1MiwwLDY2LDE0MiwwLDAsMCwwLAorCTEsMCw2NiwzNiwyNTIsMCw2NiwxNzQsMSwwLDIsMzYsCisJMzIsMCwxOTEsMTQzLDI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDAsMCwxODksMzksNzIsMjU1LDE4OSwzOSwxNjQsMCwxODEsMTc1LAorCTMzLDE2OCwxMjgsMCwxODAsMCwxOTEsMTc1LDE3NiwwLDE5MCwxNzUsCisJMTcyLDAsMTgzLDE3NSwxNjgsMCwxODIsMTc1LDE2MCwwLDE4MCwxNzUsCisJMTU2LDAsMTc5LDE3NSwxNTIsMCwxNzgsMTc1LDE0OCwwLDE3NywxNzUsCisJMTQ0LDAsMTc2LDE3NSw4OCwwLDE2NSwxNzUsMTIwLDAsMTYwLDE3NSwKKwkxMjAsMCwxNjgsMTQyLDAsMCwwLDAsOTYsMCwxNjgsMTc1LAorCTEyNCwwLDE2OSwxNDIsMCwwLDAsMCwxNSwyLDE2MCwyNCwKKwkxMDQsMCwxNjksMTc1LDk2LDAsMTY4LDE0MywwLDAsMCwwLAorCTAsMCw0LDE0OSwwLDAsMCwwLDAsMTI4LDEzMCw0OCwKKwk5LDIsNjQsMTYsMCwwLDAsMCwxMjgsMCwxNjAsMTc1LAorCTgsMCwyLDE0MSwxMzYsMCwxNjksMTQyLDI1NSwyNTUsOCwzNiwKKwkxOCwwLDcyLDE2LDExMiwwLDE2OSwxNzUsMTEyLDAsMTY5LDE0MywKKwkwLDAsMCwwLDAsMCwzNSwxNDEsNCwwLDQwLDE0MSwKKwkxMjgsMCwxNjksMTQzLDI1NSw2Myw5OCw0OCwzMyw3MiwzNCwxLAorCTAsMTI4LDk5LDQ4LDExMiwwLDE2OCwxNzUsMjQ2LDI1NSw5NiwxNiwKKwkxMjgsMCwxNjksMTc1LDk2LDAsMTY4LDE0MywwLDAsMCwwLAorCTgsMCwyLDE0MSwxMjgsMCwxNjksMTUxLDAsMCwwLDAsCisJMTgsMCw3MywxNjQsMCwzMiwxMzAsNDgsMjAwLDEsNjQsMTYsCisJMCwwLDAsMCw0MCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTc1LDAsNjQsMTYsMywwLDgsMzYsOTYsMCwxNjgsMTQzLAorCTAsMCwwLDAsOCwwLDE2LDE0MSwwLDAsMTYyLDE0MiwKKwk4LDAsNSwxNDIsMzAsMCw2NCwxNiwwLDAsMCwwLAorCTI4LDAsMTYyLDE0MiwwLDAsMCwwLDE4LDAsNjQsMjAsCisJMSwwLDksMzYsMCwwLDE2MiwxNDQsMCwwLDAsMCwKKwkxLDAsNjYsNDgsMTMsMCw2NCwyMCwwLDAsMCwwLAorCTQsMCwxNjMsMTQ4LDI0LDAsMTYyLDE1MCwwLDAsMCwwLAorCTYsMCw5OCwyMCwzMywzMiwwLDAsMCwwLDE2MiwxNDAsCisJMjAsMCwxNjMsMTQyLDAsMCwwLDAsMzgsMTYsNjcsMCwKKwkxLDAsNjgsNDQsNiwwLDEyOCwxNiwxLDAsOSwzNiwKKwkxNywwLDksMTYyLDIsMTMxLDQsNjAsMTkyLDI0NiwxMzIsMzYsCisJMTgsMTksMTkyLDgsMzMsNDAsMCwyLDE3LDAsMCwxNjIsCisJMTMwLDIwLDE5Miw4LDMzLDMyLDAsMiwxNiwwLDE3LDE0MSwKKwkwLDAsMCwwLDYsMCwzMiwyNiwwLDAsMCwwLAorCTMyLDEzMywxMzAsMTQzLDAsMCwwLDAsNDIsMTYsMzQsMiwKKwkxNSwwLDY0LDIwLDEsMCw5LDM2LDIsMTMxLDQsNjAsCisJMjQ4LDEzMCwxMzIsMzYsMiwxMzEsNSw2MCwyNCwxMzEsMTY1LDM2LAorCTIsMTMxLDcsNjAsMzYsMTMxLDIzMSwzNiwxNSw2MywxOTIsMTIsCisJMTg4LDIsNiwzNiwxLDAsNCwzNiwyLDEzMSw1LDYwLAorCTI0LDEzMSwxNjUsMzYsMTg4LDcsMTkyLDEyLDE4OCwyLDYsMzYsCisJMSwwLDksMzYsMTcsMCw5LDE2Miw2NCwzNCwxNywwLAorCTIsMTMxLDgsNjAsMTkyLDI0Niw4LDM3LDMzLDMyLDEzNiwwLAorCTMzLDQwLDAsMiw2LDIzLDE5MiwxMiwwLDAsMCwwLAorCTExMiwxLDY0LDE2LDMzLDE2LDAsMCwyNTIsMCwxNjIsMTQyLAorCTAsMCwwLDAsMSwwLDY2LDM2LDEzMiwyMCwxOTIsOCwKKwkyNTIsMCwxNjIsMTc0LDAsMCwxODIsMTQyLDk2LDAsMTY5LDE0MywKKwkxOTIsMTcsMjIsMCw4LDAsNTAsMTQxLDMsMTMxLDMsNjAsCisJMzMsMjQsOTgsMCwyMCwxMyw5OSwxNDAsOCwwLDg0LDE0MiwKKwkwLDAsMCwwLDU5LDAsMTA0LDE2LDUsMCw5OCw0NCwKKwk1NywwLDY0LDE2LDEyOCwxNiwzLDAsMiwxMzEsMSw2MCwKKwkzMyw4LDM0LDAsMTI4LDEzMSwzNCwxNDAsMCwwLDAsMCwKKwk4LDAsNjQsMCwwLDAsMCwwLDQ0LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsNDgsMCw2NCwxNiw2LDAsMTMyLDM4LAorCTQsMCwxMzEsMTUwLDIsMTMxLDIsNjAsNjgsMjA3LDY2LDE0OCwKKwkwLDAsMCwwLDYsMCw5OCwyMCwzMywzMiwwLDAsCisJMCwwLDEzMCwxNDIsNDgsMTI5LDEzMSwxNDMsMCwwLDAsMCwKKwkzOCwxNiw2NywwLDEsMCw2OCw0NCw2NywxLDEyOCwxNiwKKwkzMywzMiwxOTIsMiwxMTQsNDIsMTkyLDEyLDMzLDQwLDEyOCwyLAorCTEzMCwyMCwxOTIsOCwzMywzMiw2NCwyLDQ0LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsMjcsMCw2NCwxNiw2LDAsMTMyLDM4LAorCTQsMCwxMzEsMTUwLDIsMTMxLDIsNjAsNjgsMjA3LDY2LDE0OCwKKwkwLDAsMCwwLDYsMCw5OCwyMCwzMywzMiwwLDAsCisJMCwwLDEzMCwxNDIsNDgsMTI5LDEzMSwxNDMsMCwwLDAsMCwKKwkzOCwxNiw2NywwLDEsMCw2OCw0NCw1LDAsMTI4LDE2LAorCTMzLDMyLDE5MiwyLDExNCw0MiwxOTIsMTIsMzMsNDAsMTI4LDIsCisJMTMwLDIwLDE5Miw4LDMzLDMyLDY0LDIsNiwwLDEzMiwzOCwKKwkwLDE2Myw2LDYwLDE0MCwxLDE5OCwxNDAsMCwwLDAsMCwKKwkyNDcsMjQsMTkyLDEyLDMzLDQwLDE5MiwyLDEzMCwyMCwxOTIsOCwKKwkzMywzMiw2NCwyLDYsMCwxMzIsMzgsMCwxNjMsNiw2MCwKKwkxNDAsMSwxOTgsMTQwLDAsMCwwLDAsMjQ3LDI0LDE5MiwxMiwKKwkzMyw0MCwxOTIsMiwyMDMsMjQsMTkyLDEyLDMzLDMyLDEyOCwyLAorCTIwLDEsMTYzLDE0MiwwLDAsMCwwLDE0LDAsOTYsMTYsCisJMzMsMjQwLDY0LDAsMzMsMzIsMTI4LDIsMTYsMCwxNjYsMzksCisJMTgsMCw2OSwxNTAsMCwwLDAsMCw5LDI0OCw5NiwwLAorCTMzLDU2LDE5MiwzLDYsMCw2NCwxNiwzMywzMiw2NCwyLAorCTI4LDEsMTYyLDE0MiwwLDAsMCwwLDEsMCw2NiwzNiwKKwkxMzAsMjAsMTkyLDgsMjgsMSwxNjIsMTc0LDEzMiwwLDE5Myw3LAorCTcsMCwyLDM2LDQsMCwxMzEsMTUwLDIsMTMxLDIsNjAsCisJNjgsMjA3LDY2LDE0OCwwLDAsMCwwLDYsMCw5OCwyMCwKKwkzMywzMiwwLDAsMCwwLDEzMCwxNDIsNDgsMTI5LDEzMSwxNDMsCisJMCwwLDAsMCwzOCwxNiw2NywwLDEsMCw2OCw0NCwKKwk5LDAsMTI4LDE2LDI1NSwyNTUsOSwzNiw0NCwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDI0NiwwLDY0LDE2LDMzLDMyLDE5MiwyLAorCTExNCw0MiwxOTIsMTIsMzMsNDAsMTI4LDIsMTMwLDIwLDE5Miw4LAorCTMzLDMyLDY0LDIsMTAsMCwyMDEsMjMsMCwwLDAsMCwKKwk4LDAsMTkyLDE4LDAsMCwwLDAsMzYsMTMzLDEzMCwxNDMsCisJMCwwLDAsMCw4LDAsNjQsMTYsMSwwLDE5LDM2LAorCTgwLDEzMywxNDcsMTQzLDE1OSwxOSwxOTIsOCwwLDAsMCwwLAorCTAsMSwxNjIsMTQyLDgwLDEzMywxNDcsMTQzLDEsMCw2NiwzNiwKKwkwLDEsMTYyLDE3NCw4NCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTM1LDE2LDgzLDAsMjU1LDI1NSw2NiwzNiwxNywwLDY2LDE2MiwKKwk4NCwxMzMsMTMwLDE0MywzMywxMzYsOTYsMiw0MiwxNiwzNCwyLAorCTE1LDAsNjQsMTYsNjQsMTgsMTcsMCwyLDEzMSw4LDYwLAorCTE5MiwyNDYsOCwzNywzMywxMjgsNzIsMCw1LDAsNTQsMTgsCisJMCwwLDAsMCwyNDcsMjIsMTkyLDEyLDMzLDMyLDAsMiwKKwkyMTIsMCw2NCwxNiwzMywxNiwwLDAsODQsMTMzLDEzMCwxNDMsCisJMSwwLDQ5LDM4LDQyLDE2LDM0LDIsMjQ2LDI1NSw2NCwyMCwKKwkwLDIsMTYsMzgsODQsMTMzLDEzMCwxNDMsMzMsMTM2LDk2LDIsCisJNDIsMTYsMzQsMiw1NSwwLDY0LDE2LDY0LDE4LDE3LDAsCisJMiwxMzEsOSw2MCwxOTIsMjQ2LDQxLDM3LDMzLDE1Miw3MywwLAorCTMzLDEyOCw2NCwwLDE5MiwxODUsMTcsMCw0MSwwLDU0LDE4LAorCTAsMCwwLDAsMiwxMzEsMiw2MCwzMywxNiw4MCwwLAorCTIxNiwyNDcsNjYsMTQwLDAsMCwwLDAsMTUsMCw2NCwxNiwKKwkzMywzMiwxMjgsMiwxNiwwLDE2NiwzOSwxOCwwLDY5LDE1MCwKKwkwLDAsMCwwLDksMjQ4LDY0LDAsMzMsNTYsMTkyLDIsCisJOCwwLDY0LDE2LDAsMCwwLDAsMiwxMzEsMiw2MCwKKwkzMywxNiw4MCwwLDIyNCwyNDcsNjYsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDIzMCwxOSwxOTIsOCwzMiwxLDk4LDE3NCwKKwk0NCwxMzMsMTMwLDE0MywwLDAsMCwwLDcsMCw2NCwxNiwKKwkzLDAsOCwzNiwzLDEzMSwyLDYwLDMzLDE2LDg3LDAsCisJMjAsMTMsNjYsMTQwLDAsMCwwLDAsNiwwLDcyLDIwLAorCTAsMCwwLDAsMzMsMzIsOTYsMiw2LDIzLDE5MiwxMiwKKwkzMyw0MCw2NCwyLDIzNiwxOSwxOTIsOCwwLDIsMTE1LDM4LAorCTE3LDAsNjYsMTQ2LDAsMCwwLDAsMjU1LDI1NSw2NiwzNiwKKwkxNywwLDY2LDE2MiwxNywwLDY2LDE0NiwwLDIsMTE1LDM4LAorCTAsMiwxNiwzOCw4NCwxMzMsMTMwLDE0MywxLDAsNDksMzgsCisJNDIsMTYsMzQsMiwyMDgsMjU1LDY0LDIwLDEyOCwwLDI0NywzOCwKKwkyNTQsMjU1LDIsMzYsNCwwLDE5NCwyMywzMywzMiwxNjAsMiwKKwkzMyw0MCw2NCwyLDQ3LDE2LDE5MiwxMiwzMyw0OCwxMjgsMiwKKwkxNywwLDY2LDE0NiwwLDAsMCwwLDEzNSwwLDY0LDE2LAorCTMzLDMyLDY0LDIsMjIsMTksMTkyLDgsMCwwLDAsMCwKKwkyNiwwLDE5NCwyMywwLDAsMCwwLDM2LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsMTEsMCw2NCwxNiwzMywzMiwxNjAsMiwKKwk5LDAsMTkyLDE4LDEsMCw5LDM2LDE3LDAsNzMsMTYyLAorCTIsMTMxLDQsNjAsMTkyLDI0NiwxMzIsMzYsNiwyMywxOTIsMTIsCisJMzMsNDAsNjQsMiwxMjEsMCw2NCwxNiwzMywxNiwwLDAsCisJMzMsMzIsMTYwLDIsMzMsNDAsNjQsMiw0NywxNiwxOTIsMTIsCisJMzMsNDgsMTI4LDIsMzYsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwkxMTAsMCw2NCwxNiwzMywzMiw2NCwyLDExMSwwLDE5MiwyMiwKKwkxLDAsMiwzNiwxMzAsMjAsMTkyLDgsMCwwLDAsMCwKKwk4OSwwLDIxNCwxOSw2NCwxMzAsMzAsMCwyLDEzMSwyLDYwLAorCTMzLDE2LDgwLDAsMjE2LDI0Nyw2NiwxNDAsMCwwLDAsMCwKKwkxOCwwLDY0LDE2LDMzLDMyLDEyOCwyLDE2LDAsMTY2LDM5LAorCTE4LDAsNjksMTUwLDAsMCwwLDAsOSwyNDgsNjQsMCwKKwkzMyw1NiwxOTIsMiwxMSwwLDY0LDE2LDMzLDMyLDY0LDIsCisJMiwxMzEsOCw2MCwxOTIsMjQ2LDgsMzcsMiwxMzEsMiw2MCwKKwkzMywxNiw4MCwwLDIyNCwyNDcsNjYsMTQwLDMzLDI0LDgsMiwKKwkxLDAsNjYsMzYsMzIsMSw5OCwxNzIsMTMwLDIwLDE5Miw4LAorCTE3LDAsMTI4LDE2MCwzNiwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTQ0LDAsNjQsMTYsMCwwLDAsMCw0MiwwLDE5MiwxOSwKKwkwLDAsMCwwLDQwLDAsMTkyLDE4LDY0LDE4LDMwLDAsCisJMiwxMzEsOSw2MCwxOTIsMjQ2LDQxLDM3LDMzLDEyOCw3MywwLAorCTI0NywyMiwxOTIsMTIsMzMsMzIsMCwyLDY5LDAsNjQsMTYsCisJMzMsMTYsMCwwLDIsMTMxLDQsNjAsMjQ3LDIyLDE5MiwxMiwKKwkxOTIsMjQ2LDEzMiwzNiw1NywwLDY0LDE2LDIsMCwyLDM2LAorCTE3LDAsNjYsMTYyLDQ0LDEzMywxMzAsMTQzLDAsMCwwLDAsCisJNywwLDY0LDE2LDE5MiwxNywzMCwwLDMsMTMxLDEsNjAsCisJMzMsOCwzNCwwLDIwLDEzLDM0LDE0MCwzLDAsOCwzNiwKKwk2LDAsNzIsMjAsMCwwLDAsMCwzMywzMiwwLDIsCisJNiwyMywxOTIsMTIsMzMsNDAsNjQsMiw5MSwyMCwxOTIsOCwKKwkwLDAsMCwwLDE3LDAsNjYsMTQ2LDAsMCwwLDAsCisJMjU1LDI1NSw2NiwzNiwxNywwLDY2LDE2MiwxNywwLDY2LDE0NiwKKwkyLDEzMSw0LDYwLDE5MiwyNDYsMTMyLDM2LDYsMjMsMTkyLDEyLAorCTMzLDQwLDY0LDIsMjIsMTksMTkyLDgsMCwwLDAsMCwKKwk0NCwxMzMsMTMwLDE0MywwLDAsMCwwLDcsMCw2NCwxNiwKKwkxOTIsMTcsMzAsMCwzLDEzMSwxLDYwLDMzLDgsMzQsMCwKKwkyMCwxMywzNCwxNDAsMywwLDksMzYsMjIsMCw3MywyMCwKKwkwLDAsMCwwLDEsMCw4LDM2LDE3LDAsNzIsMTYyLAorCTY0LDM0LDMwLDAsMiwxMzEsOSw2MCwxOTIsMjQ2LDQxLDM3LAorCTMzLDMyLDEzNywwLDE4LDE5LDE5Miw4LDMzLDQwLDY0LDIsCisJMzYsMTMzLDEzMCwxNDMsMCwwLDAsMCwxMCwwLDY0LDE2LAorCTAsMCwwLDAsOCwwLDE5MiwxOSwxLDAsOCwzNiwKKwkxNywwLDcyLDE2MiwyLDEzMSw0LDYwLDE5MiwyNDYsMTMyLDM2LAorCTE4LDE5LDE5Miw4LDMzLDQwLDY0LDIsMTMzLDIwLDE5Miw4LAorCTMzLDE2LDAsMCwxNywwLDY0LDE2MiwzMywzMiw2NCwyLAorCTE1MiwyMSwxOTIsMTIsMCwwLDAsMCwxLDAsMiwzNiwKKwk1MiwwLDY0LDE2LDAsMCwwLDAsMTUyLDAsMTYyLDE0MiwKKwkwLDAsMCwwLDEsMCw2NiwzNiwxNTIsMCwxNjIsMTc0LAorCTE1NiwwLDE2MiwxNDIsMTY4LDAsMTYzLDE0MiwxLDAsNjYsMzYsCisJMTU2LDAsMTYyLDE3NCwxMjgsMCwxNjksMTQzLDAsMCwwLDAsCisJMzMsMjQsMTA1LDAsMTYzLDIwLDE5Miw4LDE2OCwwLDE2MywxNzQsCisJMTUyLDAsMTYyLDE0MiwxNjAsMCwxNjMsMTQyLDEsMCw2NiwzNiwKKwkxLDAsOTksMzYsMTUyLDAsMTYyLDE3NCwxNjAsMCwxNjMsMTc0LAorCTk2LDAsMTY4LDE0MywwLDAsMCwwLDgsMCwyLDE0MSwKKwkyNTUsMjU1LDksMzYsNCwwLDczLDE2LDAsMCwwLDAsCisJOCwwLDQsMTQxLDE1MiwyMSwxOTIsMTIsMCwwLDAsMCwKKwkxMjAsMCwxNjgsMTQzLDExMiwwLDE2OSwxNDMsMSwwLDgsMzcsCisJMTIwLDAsMTY4LDE3NSwxMzYsMCwxNjksMTc0LDk2LDAsMTY4LDE0MywKKwk4LDEyOCwyLDUyLDAsMCwwLDE2NSwyLDAsMiwxNjUsCisJMTA0LDAsMTY5LDE0Myw4LDAsMiwzNiwyLDAsMzQsMTY1LAorCTQsMCw0MCwxNDEsOTYsMCwxNjksMTQzLDEwNCwwLDE2OCwxNzUsCisJNCwwLDQxLDE0MSwxMjAsMCwxNjgsMTQzLDk2LDAsMTY5LDE3NSwKKwk4OCwwLDE2OSwxNDMsMCwwLDAsMCw0MiwxNiw5LDEsCisJMjQzLDI1Myw2NCwyMCwwLDAsMCwwLDk2LDAsMTY4LDE0MywKKwk0NCwwLDE2MywxNDIsMTIwLDAsMTY4LDE3NCwxMDQsMCwxNjksMTQzLAorCTAsMCwwLDAsMTI0LDAsMTY5LDE3NCwwLDAsOTgsMTQ4LAorCTAsMCwwLDAsMCwxNiw2Niw0OCw0MywwLDY0LDE2LAorCTAsMCwwLDAsMiwwLDk4LDE0OCwwLDAsMCwwLAorCTM5LDAsNjQsMjAsMCwwLDAsMCwwLDAsMiwxNDksCisJMCwwLDAsMCwzNSwwLDY0LDIwLDAsMCwwLDAsCisJMiwwLDIsMTQ5LDgsMCwzLDM2LDI1NSwyNTUsNjYsNDgsCisJMzAsMCw2NywyMCwwLDAsMCwwLDEzNiwwLDE2MiwxNDIsCisJMCwwLDAsMCwxMiwwLDY2LDE0MCwwLDAsMCwwLAorCTAsMTI4LDY2LDQ4LDIzLDAsNjQsMjAsMCwwLDAsMCwKKwkxNjQsMCwxNjIsMTQyLDQ0LDAsMTYzLDE0MiwxLDAsNjYsMzYsCisJMTY0LDAsMTYyLDE3NCw4LDAsMTA0LDE3MiwxMzYsMCwxNjIsMTQyLAorCTAsMCwwLDAsOCwwLDIsMTczLDQ0LDAsMTYzLDE0MiwKKwkxNiwxNiwyLDM2LDIsMCw5OCwxNjQsMCwwLDE2MiwxNDIsCisJMCwwLDAsMCw1LDAsNjQsMjAsMCwwLDAsMCwKKwkxNjQsNywxOTIsMTIsMCwwLDAsMCwyMzksMjAsMTkyLDgsCisJMCwwLDAsMCw4LDAsMTYyLDE0MiwwLDAsMCwwLAorCTAsMCw2NCwxNzIsMTgwLDAsMTkxLDE0MywxNzYsMCwxOTAsMTQzLAorCTE3MiwwLDE4MywxNDMsMTY4LDAsMTgyLDE0MywxNjQsMCwxODEsMTQzLAorCTE2MCwwLDE4MCwxNDMsMTU2LDAsMTc5LDE0MywxNTIsMCwxNzgsMTQzLAorCTE0OCwwLDE3NywxNDMsMTQ0LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMTg0LDAsMTg5LDM5LDIxNiwyNTUsMTg5LDM5LDI4LDAsMTc3LDE3NSwKKwkzMywxMzYsMTI4LDAsMzIsMCwxNzgsMTc1LDMzLDE0NCwxNjAsMCwKKwk5NiwxMjgsMTMyLDM5LDYsMCwzNywzOCwyNCwwLDE3NiwxNzUsCisJMTA0LDEyOCwxNDQsMzksMzYsMCwxOTEsMTc1LDMxLDIxLDE5MiwxMiwKKwkzMyw0OCwwLDIsMTA4LDEyOCwxMzIsMzksMzMsNDAsMzIsMiwKKwkzMSwyMSwxOTIsMTIsMzMsNDgsMCwyLDEwLDAsNjQsMjYsCisJMzMsMTI4LDAsMCwxMTYsMTI4LDEzMiwzOSwzMywxNiwxNywyLAorCTEyLDAsNjksMTQ0LDAsMCwwLDAsMTUsNjMsMTkyLDEyLAorCTEsMCwxNiwzOCw0MiwxNiwxOCwyLDI0OCwyNTUsNjQsMjAsCisJMCwwLDAsMCwxMjQsMTI4LDEzMiwzOSwxNSw2MywxOTIsMTIsCisJMCwwLDAsMCwzNiwwLDE5MSwxNDMsMzIsMCwxNzgsMTQzLAorCTI4LDAsMTc3LDE0MywyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQwLDAsMTg5LDM5LDIwOCwyNTUsMTg5LDM5LDQwLDAsMTkxLDE3NSwKKwkyLDAsMTYyLDE0NCwwLDAsMTYzLDE0NCwxLDAsMTY3LDE0NCwKKwkxNiwwLDE2MiwxNzUsMywwLDE2MiwxNDQsMzMsNjQsMTI4LDAsCisJMjAsMCwxNjIsMTc1LDQsMCwxNjIsMTQ0LDIsMTMxLDQsNjAsCisJNjgsMTMxLDEzMiwzNiwyNCwwLDE2MiwxNzUsNSwwLDE2MiwxNDQsCisJMzMsNDAsMCwxLDMyLDAsMTY2LDE3NSwzMyw0OCw5NiwwLAorCTE1LDYzLDE5MiwxMiwyOCwwLDE2MiwxNzUsNDAsMCwxOTEsMTQzLAorCTQ4LDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTI0OCwyNTUsMTg5LDM5LDEzNiwwLDEzNSwxNDAsMjU1LDI1NSwxNjMsMzYsCisJMTIsMCwxNjAsMTYsMzMsNDgsMjI0LDAsMjU1LDI1NSw1LDM2LAorCTEyLDAsMTk0LDE0MCwwLDAsMCwwLDAsMTI4LDY2LDQ4LAorCTgsMCw2NCwyMCwzMywxNiwwLDAsMjU1LDI1NSw5OSwzNiwKKwkwLDAsMTkyLDE3Miw0LDAsMTk4LDE0MCwyNDcsMjU1LDEwMSwyMCwKKwkwLDAsMCwwLDEzNiwwLDEzNCwxNzIsMzMsMTYsMjI0LDAsCisJOCwwLDIyNCwzLDgsMCwxODksMzksMjI0LDI1NSwxODksMzksCisJMTYsMCwxNzYsMTc1LDMzLDEyOCwxNjAsMCwyOCwwLDE5MSwxNzUsCisJMjQsMCwxNzgsMTc1LDMzLDAsMTI4LDIwLDIwLDAsMTc3LDE3NSwKKwk4NCwxMzMsMTMwLDE0Myw4MCwxMzMsMTMxLDE0MywwLDAsMCwwLAorCTM1LDE2LDY3LDAsMTcsMCwyLDE2Miw4MCwxMzMsMTQ1LDE0MywKKwk4NCwxMzMsMTMwLDE0MywwLDAsMCwwLDQyLDE2LDM0LDIsCisJMTksMCw2NCwxNiw2NCwxOCwxNywwLDIsMTMxLDMsNjAsCisJMTkyLDI0Niw5OSwzNiwzMywxNDQsNjcsMCwzMywzMiw2NCwyLAorCTYsMjMsMTkyLDEyLDMzLDQwLDAsMiw2LDAsNjQsMjAsCisJMCwwLDAsMCwxNywwLDIsMTQ2LDAsMCwwLDAsCisJMjU1LDI1NSw2NiwzNiwxNywwLDIsMTYyLDE3LDAsMiwxNDYsCisJODQsMTMzLDEzMCwxNDMsMSwwLDQ5LDM4LDQyLDE2LDM0LDIsCisJMjQyLDI1NSw2NCwyMCwwLDIsODIsMzgsMTcsMCwyLDE0NiwKKwkxNDQsMjEsMTkyLDgsMCwwLDAsMCwzNiwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDI1LDAsNjQsMTYsMSwwLDIsMzYsCisJMCwwLDEzMCwxNDAsMCwwLDAsMCwyMCwwLDY0LDE2LAorCTIsMCwyLDM2LDE3LDAsMiwxNjIsNiwyMywxOTIsMTIsCisJMzMsNDAsMCwyLDE5LDAsNjQsMTYsMzMsMTYsMCwwLAorCTIsMTMxLDQsNjAsMTkyLDI0NiwxMzIsMzYsNiwyMywxOTIsMTIsCisJMzMsNDAsMCwyLDcsMCw2NCwyMCwwLDAsMCwwLAorCTE3LDAsMiwxNDYsMCwwLDAsMCwyNTUsMjU1LDY2LDM2LAorCTE3LDAsMiwxNjIsMTcsMCwyLDE0NiwwLDAsMCwwLAorCTE0NCwyMSwxOTIsOCwxLDAsMiwzNiwxLDAsMiwzNiwKKwkxNywwLDIsMTYyLDYsMjMsMTkyLDEyLDMzLDQwLDAsMiwKKwkyOCwwLDE5MSwxNDMsMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDMyLDAsMTg5LDM5LAorCTAsMCwwLDAsMCwwLDAsMCwwLDEyOSw5LDUyLAorCTE2LDAsMTMwLDE0NCwyLDEzMSwzLDYwLDE5MiwyNDYsOTksMzYsCisJNjQsMTgsMiwwLDMzLDU2LDY3LDAsMTQwLDAsMjMwLDE0MCwKKwkwLDEsOCwzNiw0LDAsMTk3LDE0MCwwLDAsMTMxLDE0MCwKKwkwLDAsMTI4LDE3MiwxMiwwLDEzNywxNzIsNCwwLDE2NCwxNzIsCisJMTIsMCwyMDAsMTcyLDMzLDQ4LDE2MCwwLDIxNiwwLDIyNiwxNDAsCisJMzMsNDAsMTI4LDAsMSwwLDY2LDM2LDAsMTI4LDk5LDQ4LAorCTQsMCw5NiwyMCwyMTYsMCwyMjYsMTcyLDQsMCwxMzIsMTQwLAorCTE2MSwyMSwxOTIsOCwwLDAsMCwwLDgsMCwyMjQsMywKKwkxNDAsMCwyMzAsMTcyLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDgsMCwyMjQsMywwLDAsMCwwLAorCTE3MiwwLDEyOCwxNzIsMTc2LDAsMTI4LDE3MiwxODAsMCwxMjgsMTcyLAorCTE4NCwwLDEyOCwxNzIsMTg4LDAsMTI4LDE3MiwxOTIsMCwxMjgsMTcyLAorCTE5NiwwLDEyOCwxNzIsMjAwLDAsMTI4LDE3MiwyMDQsMCwxMjgsMTcyLAorCTIwOCwwLDEyOCwxNzIsMjEyLDAsMTI4LDE3MiwyMjQsMCwxMjgsMTcyLAorCTgsMSwxMjgsMTcyLDQsMSwxMjgsMTcyLDIzNiwwLDEyOCwxNzIsCisJMjQwLDAsMTI4LDE3MiwyMzIsMCwxMjgsMTcyLDI0NCwwLDEyOCwxNzIsCisJOCwwLDIyNCwzLDI0OCwwLDEyOCwxNzIsMjI0LDI1NSwxODksMzksCisJMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwyMCwwLDE3NywxNzUsCisJMCwyLDE3LDM2LDI0LDAsMTkxLDE3NSwxMyw4LDE5MiwxMiwKKwkwLDQ4LDQsMzYsMjU1LDMxLDMsNjAsMjU1LDI1NSw5OSw1MiwKKwkzMywzMiwwLDAsMzYsMTYsNjcsMCwwLDEyOCwzLDYwLAorCTM3LDQwLDY3LDAsMzMsMjQsMTYwLDAsMCwxMjgsNiw1MiwKKwkxLDAsMTMyLDM2LDI0LDAsOTgsMzYsMCwwLDk2LDE2NCwKKwkyLDAsMTAyLDE2NCw0LDAsOTgsMTcyLDMzLDI0LDY0LDAsCisJNDIsMTYsMTQ1LDAsMjQ5LDI1NSw2NCwyMCwxLDAsMTMyLDM2LAorCTI1NSwyNTUsMTMyLDM2LDY0LDE2LDE3LDAsMzMsMTYsODEsMCwKKwkxOTIsMTYsMiwwLDMzLDE2LDY5LDAsNDgsMCwxNjMsMzYsCisJMjM2LDI1NSw2OSwxNzIsMTA4LDAsMywxNzQsMTA0LDAsMywxNzQsCisJOTYsMCw1LDE3NCwxMDAsMCwyLDE3NCwyNCwwLDE5MSwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMzIsMCwxODksMzksMjQ4LDI1NSwxODksMzksMCwzMiwxNCw2MCwKKwk0LDAsMTc3LDE3NSw3LDAsMTcsNjAsMCwwLDE3NiwxNzUsCisJNCwwLDE2LDYwLDIsMTMxLDI1LDYwLDE5MiwyNDYsNTcsMzksCisJMCwxLDE1LDM2LDEwOCwwLDE1MiwxNDAsMTA0LDAsMTM3LDE0MCwKKwkxNzYsMCwxNDAsMTQwLDE4MCwwLDE0MSwxNDAsOTQsMCw1NiwxNywKKwkwLDAsMCwwLDQsMCw0MywxNDEsMCwwLDAsMCwKKwkzNywxNiwxMTAsMSwwLDAsNjYsMTQ4LDAsMCwwLDAsCisJMCwxMjgsNjYsNDgsODYsMCw2NCwxNiwzNywxNiw0NiwxLAorCTAsMCw2NywxNDAsMCwwLDAsMCwzNiwxNiwxMTMsMCwKKwk3NiwwLDgwLDIwLDAsMzIsOTgsNDgsNDEsMCw2NCwyMCwKKwkxNSwwLDk4LDQ4LDE4OCwwLDEzMCwxNDAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMTg4LDAsMTMwLDE3MiwwLDgsOTgsNDgsCisJNiwwLDY0LDE2LDAsNCw5OCw0OCwxOTIsMCwxMzAsMTQwLAorCTAsMCwwLDAsMSwwLDY2LDM2LDE5MiwwLDEzMCwxNzIsCisJMCw0LDk4LDQ4LDYsMCw2NCwxNiwwLDIsOTgsNDgsCisJMTk2LDAsMTMwLDE0MCwwLDAsMCwwLDEsMCw2NiwzNiwKKwkxOTYsMCwxMzAsMTcyLDAsMiw5OCw0OCw2LDAsNjQsMTYsCisJMCwxLDk4LDQ4LDIwMCwwLDEzMCwxNDAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMjAwLDAsMTMwLDE3MiwwLDEsOTgsNDgsCisJNiwwLDY0LDE2LDMyLDAsOTgsNDgsMjA0LDAsMTMwLDE0MCwKKwkwLDAsMCwwLDEsMCw2NiwzNiwyMDQsMCwxMzAsMTcyLAorCTMyLDAsOTgsNDgsNiwwLDY0LDE2LDE1LDAsOTgsNDgsCisJMjA4LDAsMTMwLDE0MCwwLDAsMCwwLDEsMCw2NiwzNiwKKwkyMDgsMCwxMzAsMTcyLDE1LDAsOTgsNDgsMjEyLDAsMTMxLDE0MCwKKwk4LDAsMzcsMTQxLDMzLDI0LDk4LDAsMjEyLDAsMTMxLDE3MiwKKwkxNywwLDE2MiwxNDQsMSwwLDE0MCwzNywyNTUsMjU1LDY2LDM2LAorCTE3LDAsMTYyLDE2MCwyNSwwLDY0LDIwLDM3LDI0LDQ2LDEsCisJMTYsMCwxNjIsMTQ0LDEsMCwxNzMsMzcsNjQsMTgsMiwwLAorCTMzLDY0LDg5LDAsMTQwLDAsNywxNDEsMCwxMjksMTAsNTIsCisJNCwwLDIzMCwxNDAsMCwwLDE2MywxNDAsMCwwLDE2MCwxNzIsCisJMTIsMCwxNzAsMTcyLDQsMCwxOTcsMTcyLDEyLDAsMjM5LDE3MiwKKwkzMyw1NiwxOTIsMCwyMTYsMCwyLDE0MSwzMyw0OCwxNjAsMCwKKwkxLDAsNjYsMzYsMCwxMjgsOTksNDgsNCwwLDk2LDIwLAorCTIxNiwwLDIsMTczLDQsMCwxNjUsMTQwLDExNCwyMiwxOTIsOCwKKwkwLDAsMCwwLDE0MCwwLDcsMTczLDM3LDI0LDQ2LDEsCisJMCwxMjgsMiw2MCwwLDAsOTgsMTcyLDQwLDIyLDE5Miw4LAorCTMzLDcyLDk2LDEsMTA0LDAsMTM3LDE3MiwxNzYsMCwxNDAsMTcyLAorCTE4MCwwLDE0MSwxNzIsNCwwLDE3NywxNDMsMCwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDgsMCwxODksMzksMjI0LDI1NSwxODksMzksCisJMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwyNCwwLDE5MSwxNzUsCisJMjAsMCwxNzcsMTc1LDQ0LDAsMTcsMTQyLDAsMCwwLDAsCisJMCwwLDM0LDE1MCwwLDAsMCwwLDAsMzIsNjYsNDgsCisJODksMCw2NCwxNiwwLDAsMCwwLDIsMCwzNCwxNTAsCisJMCwwLDAsMCwwLDEsNjYsNDgsODQsMCw2NCwyMCwKKwkwLDAsMCwwLDI3LDIyLDE5MiwxMiwwLDAsMCwwLAorCTEwNCwwLDQsMTQyLDAsMCwwLDAsMiwwLDEzMCwxNDgsCisJMCwxMjgsMyw1MiwyNTUsMjU1LDY2LDQ4LDc1LDAsNjcsMTYsCisJMCwwLDAsMCwyMjQsMCwyLDE0MiwwLDAsMCwwLAorCTEsMCw2NiwzNiwyMjQsMCwyLDE3NCw0LDAsMzYsMTc0LAorCTAsMCwxMjgsMTY0LDQsMCwxMzAsMTQwLDAsMCwwLDAsCisJMCwwLDY0LDE2NCwwLDAsMiwxNDIsMCwwLDAsMCwKKwk1MSwwLDY0LDE2LDAsMzMsMiwzNiwyLDAsMzQsMTUwLAorCTAsMCwwLDAsNDcsMCw2NCwxNiwwLDMzLDIsMzYsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMiwwLDM0LDE1MCwwLDAsMCwwLDIxMSwyNTUsNjQsMjAsCisJMCwzMywyLDM2LDIsMCwzNCwxNjYsMCwwLDIsMTQyLAorCTAsMCwwLDAsNSwwLDY0LDE2LDAsMCwwLDAsCisJOCwwLDIsMTQyLDAsMCwwLDAsMjQyLDIyLDE5Miw4LAorCTAsMCw2NCwxNzIsMTY0LDcsMTkyLDEyLDAsMCwwLDAsCisJMjQsMCwxOTEsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDMyLDAsMTg5LDM5LDEwOCwwLDEzMywxNDAsCisJMCwwLDAsMCw0LDAsMTYyLDE0MCwwLDAsMCwwLAorCTQsMCw2NywxNDAsMTA0LDAsMTMwLDE0MCwwLDAsMCwwLAorCTUsMCw5OCwyMCwzMywxNiwxNjAsMCwxODQsMCwxMzEsMTQwLAorCTMzLDE2LDAsMCwxLDAsOTksMzYsMTg0LDAsMTMxLDE3MiwKKwk4LDAsMjI0LDMsMCwwLDAsMCwyMjQsMjU1LDE4OSwzOSwKKwkxNiwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLDI4LDAsMTkxLDE3NSwKKwkyNCwwLDE3OCwxNzUsMjAsMCwxNzcsMTc1LDEwOCwwLDE4LDE0MiwKKwk4LDEsNiwxNDIsNDQsMCwxNywxNDIsNCwwLDY2LDE0MiwKKwkxMDQsMCw3LDE0Miw0LDAsNjYsMTQwLDE4LDAsMTYzLDE0OCwKKwkxNzIsMCw0LDE0MiwwLDAsMCwwLDYsMCw3MSwyMCwKKwkyNTUsMjU1LDk5LDQ4LDE4NCwwLDMsMTQyLDMzLDE2LDAsMCwKKwkxLDAsOTksMzYsMTU3LDIzLDE5Miw4LDE4NCwwLDMsMTc0LAorCTMzLDQ4LDE5NSwwLDEsMCwxMzAsMzYsMTcyLDAsMiwxNzQsCisJOCwxLDYsMTc0LDgsMCwxNjIsMTQwLDQsMSwzLDE0MiwKKwkwLDAsNzAsMTQ0LDMzLDMyLDY0LDIsOCwwLDY5LDE3NCwKKwkxMiwwLDY0LDE3NCwxLDAsMTk0LDQ4LDIsMCw2NCwxNiwKKwkxLDAsOTgsMzYsNCwxLDIsMTc0LDAsMCwyLDE0MiwKKwkwLDAsMCwwLDM1LDAsNjQsMjAsMCwwLDAsMCwKKwkxOCwwLDE2MiwxNDgsMCwwLDAsMCwyNTUsMjU1LDY2LDQ4LAorCTEyLDAsNjYsMTc0LDAsMCwzNCwxNTAsMCwwLDAsMCwKKwkwLDMyLDY2LDQ4LDI0LDAsNjQsMTYsMTIsMCwyLDM2LAorCTIsMCwzNCwxNTAsMCwwLDAsMCwwLDEsNjYsNDgsCisJMTksMCw2NCwyMCwxMiwwLDIsMzYsNCwwLDI0MiwxNiwKKwkwLDAsMCwwLDI3LDIyLDE5MiwxMiwzMywzMiwwLDIsCisJMTIsMCwyLDM2LDIsMCw2NiwxNjYsMTA0LDAsNCwxNDIsCisJMCwwLDAsMCwwLDAsMTI4LDE2NCw0LDAsMTMwLDE0MCwKKwkwLDAsMCwwLDAsMCw2NCwxNjQsMCwzMywyLDM2LAorCTQsMCwzNiwxNzQsMTY0LDcsMTkyLDEyLDIsMCwzNCwxNjYsCisJMTU0LDIzLDE5Miw4LDAsMCwwLDAsMTU0LDIzLDE5Miw4LAorCTIsMCwxMzAsMTY0LDAsMCwzNCwxNTAsMCwwLDAsMCwKKwkwLDMyLDY2LDQ4LDY5LDAsNjQsMTYsMTIsMCwyLDM2LAorCTQsMCwyNDIsMTYsMCwwLDAsMCwyNywyMiwxOTIsMTIsCisJMzMsMzIsMCwyLDEyLDAsMiwzNiwyLDAsNjYsMTY2LAorCTEwNCwwLDQsMTQyLDAsMCwwLDAsMCwwLDEyOCwxNjQsCisJNCwwLDEzMCwxNDAsMCwwLDAsMCwwLDAsNjQsMTY0LAorCTQsMCwzNiwxNzQsMiwwLDM0LDE1MCwwLDAsMCwwLAorCTQ3LDAsNjQsMTYsMCwzMywyLDM2LDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDIsMCwzNCwxNTAsCisJMCwwLDAsMCwyMTEsMjU1LDY0LDIwLDAsMzMsMiwzNiwKKwkyLDAsMzQsMTY2LDgsMCwyLDE0MiwwLDAsMCwwLAorCTE1NCwyMywxOTIsOCwwLDAsNjQsMTcyLDIsMCw2NiwxNjYsCisJNCwwLDY3LDE0MiwxLDAsMiwzNiwxMDgsMCwzLDE3NCwKKwkyOCwwLDE5MSwxNDMsMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDMyLDAsMTg5LDM5LAorCTIxNiwyNTUsMTg5LDM5LDIwLDAsMTc3LDE3NSwzMywxMzYsMTI4LDAsCisJMjQsMCwxNzgsMTc1LDIsMTMxLDE4LDYwLDE5MiwxMzEsODIsMzgsCisJMjgsMCwxNzksMTc1LDAsMSwxOSwzNiwzMiwwLDE5MSwxNzUsCisJMTYsMCwxNzYsMTc1LDEwNCwwLDQ4LDE0MiwxMDgsMCwzNCwxNDIsCisJMCwwLDAsMCw0LDAsMiwyMiwwLDAsMCwwLAorCTIsMCwyLDE1MCwyNDUsMjMsMTkyLDgsMCwwLDAsMCwKKwkyLDAsMiwxNTAsMCwwLDAsMCw3LDAsNjYsNDgsCisJMTEsMCw2NCwyMCwzMyw0MCw2NCwyLDIsMTMxLDQsNjAsCisJMTYwLDEzMSwxMzIsMzYsMiwxMzEsNyw2MCwyNTIsMTMxLDIzMSwzNiwKKwkxNSw2MywxOTIsMTIsMCwyLDYsMzYsMSwwLDQsMzYsCisJMzMsNDAsNjQsMiwxODgsNywxOTIsMTIsMCwyLDYsMzYsCisJMiwwLDIsMTUwLDQsMCwzLDM2LDcsMCw2Niw0OCwKKwk0MCwwLDY3LDIwLDAsMTI4LDIsNTIsOCwwLDMsMTQyLAorCTAsMCwwLDAsMTcsMCw5OCwxNDQsMCwwLDAsMCwKKwkyNTUsMjU1LDY2LDM2LDE3LDAsOTgsMTYwLDE3LDAsOTgsMTQ0LAorCTAsMCwwLDAsMzAsMCw2NCwyMCwwLDEyOCwyLDUyLAorCTE4MCwwLDM0LDE0MiwzMywzMiw5NiwwLDEsMCw2NiwzNiwKKwkxODAsMCwzNCwxNzQsMTYsMCwxMzAsMTQ0LDIsMTMxLDMsNjAsCisJMTkyLDI0Niw5OSwzNiw2NCwxOCwyLDAsMzMsNTYsNjcsMCwKKwkxNDAsMCwyMzAsMTQwLDAsMTI5LDgsNTIsNCwwLDE5NywxNDAsCisJMCwwLDEzMSwxNDAsMCwwLDEyOCwxNzIsMTIsMCwxMzYsMTcyLAorCTQsMCwxNjQsMTcyLDEyLDAsMjExLDE3MiwzMyw0OCwxNjAsMCwKKwkyMTYsMCwyMjYsMTQwLDMzLDQwLDEyOCwwLDEsMCw2NiwzNiwKKwkwLDEyOCw5OSw0OCw0LDAsOTYsMjAsMjE2LDAsMjI2LDE3MiwKKwk0LDAsMTMyLDE0MCwyMjMsMjMsMTkyLDgsMCwwLDAsMCwKKwkxNDAsMCwyMzAsMTcyLDAsMTI4LDIsNTIsMiwwLDIsMTY2LAorCTAsMCwwLDE2Niw0LDAsMTYsMTQyLDE3NCwyMywxOTIsOCwKKwkwLDAsMCwwLDQ0LDAsMzUsMTQyLDEwNCwwLDQ4LDE3NCwKKwkwLDAsOTgsMTQ4LDAsMCwwLDAsMCwzMiw2Niw1MiwKKwkwLDAsOTgsMTY0LDMyLDAsMTkxLDE0MywyOCwwLDE3OSwxNDMsCisJMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDQwLDAsMTg5LDM5LDAsMTYzLDIsNjAsCisJMCwxLDY2LDUyLDAsMCw2NiwxNDAsMiwxMzEsMyw2MCwKKwkxOTIsNiw5OSwzNiwyNTUsMyw2Niw0OCw2MCwwLDY2LDM2LAorCTAsMTI4LDY2LDUyLDgsMCwyMjQsMywwLDAsOTgsMTcyLAorCTIwOCwyNTUsMTg5LDM5LDI4LDAsMTc3LDE3NSwzMywxMzYsMTI4LDAsCisJMzIsMCwxNzgsMTc1LDMzLDE0NCwxNjAsMCwyNCwwLDE3NiwxNzUsCisJMCwxNjMsMTYsNjAsMCwxNjMsMiw2MCwxNjQsMSw2NiwxNDAsCisJMCwxLDE2LDU0LDQ0LDAsMTkxLDE3NSw0MCwwLDE4MCwxNzUsCisJNCwwLDY0LDIwLDM2LDAsMTc5LDE3NSw2MCwwLDIsMzYsCisJMCwxNjMsMSw2MCwxNjQsMSwzNCwxNzIsMCwxNjMsMiw2MCwKKwkxNjQsMSw2NiwxNDAsMCwwLDAsMCwyMjEsNSw2Niw0MCwKKwkzLDAsNjQsMjAsMjIwLDUsMiwzNiwwLDE2MywxLDYwLAorCTE2NCwxLDM0LDE3MiwwLDE2MywzLDYwLDE2NCwxLDk5LDE0MCwKKwkyNTUsMjU1LDIsMzYsMjEsMCw5OCwyMCwwLDAsMCwwLAorCTEyOCwxMjgsMTMwLDE0MywwLDAsMCwwLDUsMCw2NywyMCwKKwkyLDAsNSwzNiwxMzAsMTEsMTkyLDEyLDAsMCwwLDAsCisJMTI4LDEyOCwxMzAsMTc1LDIsMCw1LDM2LDEwLDAsNiwzNiwKKwkxMjgsMTI4LDEzMiwxNDMsMCwxMzEsNyw2MCw4LDk2LDIzMSwzNiwKKwkxNTYsMTEsMTkyLDEyLDE2LDAsMTYwLDE3NSwwLDAsMiwxNDIsCisJMiwxMzEsMyw2MCwxOTIsNiw5OSwzNiwyNTUsMyw2Niw0OCwKKwk2NiwyNCwxOTIsOCw2NCwwLDY2LDM2LDAsMTYzLDIsNjAsCisJMTY0LDEsNjYsMTQwLDIsMTMxLDMsNjAsMTkyLDYsOTksMzYsCisJMCwxMjgsNjYsNTIsMCwwLDk4LDE3MiwyNTUsMzEsNCw2MCwKKwkyNTUsMjU1LDEzMiw1MiwyLDEzMSwyLDYwLDIwOCw2LDY2LDM2LAorCTM2LDE2LDY4LDAsMCwxNjAsNSw2MCwzNywxNiw2OSwwLAorCTIsMTMxLDMsNjAsMTc2LDEyLDk5LDM2LDIsMTMxLDEsNjAsCisJMTk2LDYsMzIsMTcyLDIsMTMxLDEsNjAsMjAwLDYsMzQsMTcyLAorCTEyLDAsMiwzNiwwLDAsOTYsMTY0LDIsMTMxLDEsNjAsCisJMTc4LDEyLDM0LDE2NCw2LDAsNjUsNiwzNiwxNiwxMDAsMCwKKwkzNywxNiw2OSwwLDIsMTMxLDEsNjAsMTgwLDEyLDM0LDE3MiwKKwk5OSwyNCwxOTIsOCwyNTUsMzEsMTgsNjAsMiwxMzEsMiw2MCwKKwkxNzgsMTIsNjYsMTQ4LDAsMCwwLDAsMCwxMjgsNjYsNTIsCisJMiwxMzEsMSw2MCwxNzgsMTIsMzQsMTY0LDI1NSwzMSwxOCw2MCwKKwkyNTUsMjU1LDgyLDU0LDIsMTMxLDIsNjAsMTkyLDYsNjYsMzYsCisJMzYsMTYsODIsMCwwLDE2MCwyMCw2MCwzNywxNiw4NCwwLAorCTIsMTMxLDEsNjAsMTg0LDEyLDM0LDE3MiwyLDEzMSwxLDYwLAorCTE4OCwxMiwzMiwxNzIsNDQsMCwzNCwxNDIsMCwwLDAsMCwKKwkwLDAsNjYsMTQ4LDIsMTMxLDE5LDYwLDE3NiwxMiwxMTUsMzgsCisJMCwzMiw2Niw0OCwxNSwwLDY0LDIwLDMzLDQwLDAsMCwKKwkyLDEzMSw0LDYwLDE2MCwxMzEsMTMyLDM2LDIsMTMxLDE2LDYwLAorCTE5MiwxMzEsMTYsMzgsMzMsNDAsMCwyLDIsMTMxLDcsNjAsCisJMjQsMTMyLDIzMSwzNiwxNSw2MywxOTIsMTIsNzEsMiw2LDM2LAorCTEsMCw0LDM2LDMzLDQwLDAsMiwxODgsNywxOTIsMTIsCisJNzEsMiw2LDM2LDMzLDQwLDAsMCwzMyw0OCwwLDAsCisJMzYsMTYsMTE0LDIsNDQsMCwzNSwxNDIsMzcsMTYsODQsMCwKKwk0LDAsOTgsMTcyLDQ0LDAsMzYsMTQyLDIwOCw3LDcsMzYsCisJMTI5LDY3LDE5MiwxMiwyLDAsMTMyLDM2LDEyLDAsNjQsMjAsCisJMCwwLDAsMCw0NCwwLDM0LDE0MiwwLDAsMCwwLAorCTIsMCw2OSwxNDgsMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsCisJNTYsMTMyLDEzMiwzNiwyNTUsMjU1LDQsMzYsMiwxMzEsNSw2MCwKKwkxOTIsMTMxLDE2NSwzNiwxODgsNywxOTIsMTIsNzksMiw2LDM2LAorCTQ0LDAsMzQsMTQyLDAsMzMsMywzNiwyLDAsNjcsMTY0LAorCTgsMCwzNCwxNDIsMCwwLDAsMCwwLDAsNjQsMTcyLAorCTQ0LDAsMTkxLDE0Myw0MCwwLDE4MCwxNDMsMzYsMCwxNzksMTQzLAorCTMyLDAsMTc4LDE0MywyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0OCwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwKKwkxMjgsMTI4LDEzMiwxNDMsMCwxMjgsMiw1MiwxNiwwLDE5MSwxNzUsCisJMiwxMzEsMSw2MCwzLDAsMTI4LDQsMTc4LDEyLDM0LDE2NCwKKwkxNzcsMTEsMTkyLDEyLDAsMCwwLDAsMTYsMCwxOTEsMTQzLAorCTI0LDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTgsMCwyMjQsMywwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwyNDAsMjU1LDIsNTIsMiwxMzEsMSw2MCwKKwkzMyw4LDM0LDAsMjA4LDEyLDMyLDE3MiwyNDAsMjU1LDY2LDM2LAorCTI1MSwyNTUsNjUsNCwwLDAsMCwwLDIsMTMxLDIsNjAsCisJMjA4LDEyLDY2LDM2LDAsMTYzLDEsNjAsMTIsMSwzMiwxNzIsCisJMCwxNjMsMSw2MCwyMTIsNSwzNCwxNzIsMSwwLDIsNjAsCisJMTQ4LDEzMywxMjgsMTc1LDE0NCwxMzMsMTI4LDE3NSwwLDE2MywxLDYwLAorCTgsMCwyMjQsMywyMTYsNSwzNCwxNzIsMCwwLDEzNiwxNDgsCisJNCwwLDEzOCwxNDgsMSwwLDIsNDksMzQsMCw2NCwyMCwKKwkyLDAsMTM3LDE0OCwwLDI1LDEwLDAsMzgsMjQsMTA2LDAsCisJMzgsMjQsMTA1LDAsMjQwLDI1NSw5OSw0OCwyLDEzMSwxNSw2MCwKKwkyMDgsMTIsMjM5LDM3LDMzLDQwLDExMSwwLDY4LDEzMywxNDIsMTQzLAorCTEyOCwwLDMsMzYsMCwwLDE2MiwxNDAsNCwwLDE3MSwxNDgsCisJMjMsMCw2NCwxNiw0MywxNiwxOTQsMSw5LDAsNjQsMTYsCisJNiwwLDE3MiwxNDgsNywwLDExLDIxLDgsMCwxNzMsMTQ4LAorCTUsMCw0NCwyMSwwLDAsMCwwLDMsMCw3NywyMSwKKwkxMCwwLDE2MiwxNDgsOCwwLDIyNCwzLDAsMCwwLDAsCisJMjU1LDI1NSw5OSwzNiwxMCwwLDk2LDE2LDI0MCwyNTUsMTY1LDM2LAorCTQzLDE2LDE3NSwwLDIzOCwyNTUsNjQsMTYsMCwwLDE2MiwxNDAsCisJMjQ4LDEyNywyMjksMzcsMjQ4LDEyNywxNjUsMzYsMjE4LDI0LDE5Miw4LAorCTAsMCwxNjIsMTQwLDgsMCwyMjQsMywyNTQsMjU1LDIsMzYsCisJOCwwLDIyNCwzLDI1NSwyNTUsMiwzNiw4LDAsMjI0LDMsCisJMCwwLDAsMCwwLDAsMTM2LDE0OCw2OCwxMzMsMTQyLDE0MywKKwkxLDAsMiw0OSw1MywwLDY0LDIwLDIsMCwxMzcsMTQ4LAorCTAsMTMxLDIsNjAsNCwwLDEzOCwxNDgsMTIsMSw4OSwxNDAsCisJMCwyNSwxMCwwLDM4LDI0LDEwNiwwLDM4LDI0LDEwNSwwLAorCTI0MCwyNTUsOTksNDgsMiwxMzEsMTUsNjAsMjA4LDEyLDIzOSwzNywKKwkzMyw1NiwxMTEsMCwxMjgsMCwzLDM2LDAsMCwyNDgsMTQwLAorCTQsMCwyMzUsMTQ4LDQzLDE2LDIxNiwxLDE0LDAsNjQsMTYsCisJNiwwLDIzNiwxNDgsMjQsMCwxMSwyMSw4LDAsMjM3LDE0OCwKKwkyMiwwLDQ0LDIxLDI1NSwxMjcsMiw2MCwyMCwwLDc3LDIxLAorCTI1NSwyNTUsNjYsNTIsNDMsMTYsMiwzLDIsMCw2NCwxNiwKKwkzMywxNiwxOTgsMSwwLDAsMjI2LDE3MiwxMCwwLDIyOSwxNjQsCisJOCwwLDIyNCwzLDAsMCwyLDM2LDMsMCwwLDIzLAorCTEsMCw1NywzNSwwLDEzMSwyLDYwLDEyLDEsODksMTcyLAorCTMzLDE2LDE5OCwxLDAsMCwyMjYsMTcyLDEwLDAsMjI5LDE2NCwKKwk0LDAsMjMyLDE2NCw2LDAsMjMzLDE2NCw4LDAsMjM0LDE2NCwKKwk4LDAsMjI0LDMsMSwwLDIsMzYsMjU1LDI1NSw5OSwzNiwKKwkxMSwwLDk2LDE2LDAsMCwwLDAsMjQwLDI1NSwyMzEsMzYsCisJNDMsMTYsMjM5LDAsMjIxLDI1NSw2NCwxNiwwLDAsMjQ4LDE0MCwKKwkyNDgsMTI3LDIzMSwzNywyNDgsMTI3LDIzMSwzNiw4LDI1LDE5Miw4LAorCTAsMCwyNDgsMTQwLDgsMCwyMjQsMywwLDAsMiwzNiwKKwkxNDQsMTMzLDEzMCwxNDMsMCwwLDAsMCwxLDAsNjYsMzIsCisJMTQ0LDEzMywxMzAsMTc1LDgsMCwyMjQsMywyNTUsMjU1LDIsMzYsCisJOCwwLDIyNCwzLDAsMCwwLDAsMTY0LDEyOCwxMzAsMTQzLAorCTAsMCwwLDAsNywwLDEzMCwyMCwyMzIsMjU1LDE4OSwzOSwKKwkxNjAsMTI4LDEzMCwxNDMsMiwxMzEsMyw2MCwyMDgsMTIsOTksMzYsCisJMCwxNywyLDAsMTA4LDI1LDE5Miw4LDMzLDE2LDY3LDAsCisJNDIsMTYsMTMwLDAsMywwLDY0LDE2LDI1NSwyNTUsMiwzNiwKKwkxNjQsMTI4LDEyOCwxNzUsMTYwLDEyOCwxMzAsMTc1LDE2NCwxMjgsMTMwLDE0MywKKwkxNjAsMTI4LDEzMSwxNDMsMzUsNDgsMTMwLDAsMSwwLDEwMSwzNiwKKwkwLDE2LDE2Miw0MCwyNSwwLDY0LDE2LDAsMjUsNSwwLAorCTY4LDEzMywxMzUsMTQzLDIsMTMxLDIsNjAsMzMsMTYsNjcsMCwKKwkyMDgsMTIsNjYsMTQwLDAsMCwwLDAsNDMsMTYsMjI2LDAsCisJNCwwLDY0LDE2LDAsMCwwLDAsMjU1LDI1NSwxOTgsMzYsCisJNiwwLDE5MiwxNiwwLDE2LDE2Miw0MCwxLDAsMTY1LDM2LAorCTAsMTYsMTYyLDQwLDI0MywyNTUsNjQsMjAsMTYsMCw5OSwzNiwKKwkwLDE2LDE2Miw0MCw3LDAsNjQsMTYsMCwyNSw1LDAsCisJMiwxMzEsMiw2MCwyMDgsMTIsNjYsMzYsMTYwLDEyOCwxMzMsMTc1LAorCTE2NCwxMjgsMTMyLDE3NSwxMDgsMjUsMTkyLDgsMzMsMTYsOTgsMCwKKwkzMywxNiwwLDAsMjU1LDI1NSwzLDM2LDE2NCwxMjgsMTI4LDE3NSwKKwkxNjAsMTI4LDEzMSwxNzUsOCwwLDIyNCwzLDI0LDAsMTg5LDM5LAorCTAsMCwwLDAsMCwwLDAsMCwyNCwyNTUsMTg5LDM5LAorCTIyOCwwLDE5MSwxNzUsMjI0LDAsMTkwLDE3NSwyMjAsMCwxODMsMTc1LAorCTIxNiwwLDE4MiwxNzUsMjEyLDAsMTgxLDE3NSwyMDgsMCwxODAsMTc1LAorCTIwNCwwLDE3OSwxNzUsMjAwLDAsMTc4LDE3NSwxOTYsMCwxNzcsMTc1LAorCTE5MiwwLDE3NiwxNzUsNDQsMjgsMTkyLDEyLDAsMCwwLDAsCisJMTc2LDEyOCwxMzIsMzksMTUsNjMsMTkyLDEyLDEsMCwxNywzNiwKKwkyNCwwLDE3NiwzOSwxNjQsNjgsMTkyLDEyLDMzLDMyLDAsMiwKKwkyNCwwLDE2MiwxMzEsMCwwLDAsMCwxMzcsMjUsMTkyLDgsCisJMzIsMCw4LDM2LDAsMCwyLDEzMCwzMiwwLDgsMzYsCisJMjUzLDI1NSw3MiwxNiwxLDAsMTYsMzgsMjU1LDI1NSwxNiwzOCwKKwk5LDAsOCwzNiwyNDksMjU1LDcyLDE2LDEsMCwxNiwzOCwKKwkyNTUsMjU1LDE2LDM4LDAsMCwyLDE0NiwwLDAsMCwwLAorCTIwOCwyNTUsNjYsMzYsMTAsMCw2Niw0NCwyNywwLDY0LDE2LAorCTMzLDMyLDAsMiwzMyw0MCwwLDAsMjEyLDY4LDE5MiwxMiwKKwkzMyw0OCwwLDAsMCwwLDMsMTQ2LDAsMCwwLDAsCisJMjA4LDI1NSw5OSwzNiwxMCwwLDk5LDQ0LDksMCw5NiwxNiwKKwkzMywxMzYsNjQsMCwxLDAsMTYsMzgsMCwwLDIsMTQ2LAorCTAsMCwwLDAsMjA4LDI1NSw2NiwzNiwxMCwwLDY2LDQ0LAorCTI1MSwyNTUsNjQsMjAsMSwwLDE2LDM4LDI1NSwyNTUsMTYsMzgsCisJMCwwLDIsMTMwLDMyLDAsOCwzNiwyNTMsMjU1LDcyLDE2LAorCTEsMCwxNiwzOCwyNTUsMjU1LDE2LDM4LDksMCw4LDM2LAorCTI0OSwyNTUsNzIsMTYsMSwwLDE2LDM4LDI1NSwyNTUsMTYsMzgsCisJMCwwLDIsMTMwLDAsMCwzLDE0NiwwLDAsMCwwLAorCTIyLDAsNjQsMTYsMTA0LDAsMTgwLDM5LDMyLDAsOCwzNiwKKwkxOSwwLDcyLDE2LDksMCw4LDM2LDE3LDAsNzIsMTYsCisJMzIsMCw1LDM2LDksMCw0LDM2LDIwOCwyNTUsOTgsMzYsCisJMTAsMCw2Niw0NCwxMiwwLDY0LDIwLDAsMCwwLDAsCisJMSwwLDE2LDM4LDAsMCwxMzEsMTYyLDAsMCwyLDEzMCwKKwkwLDAsMywxNDYsMCwwLDAsMCw1LDAsNjQsMTYsCisJMSwwLDE0OCwzOCwzLDAsNjksMTYsMCwwLDAsMCwKKwkyNDMsMjU1LDY4LDIwLDIwOCwyNTUsOTgsMzYsMCwwLDEyOCwxNjIsCisJMTA0LDAsMTgwLDM5LDAsMCwyLDEzMCwzMiwwLDgsMzYsCisJMjUzLDI1NSw3MiwxNiwxLDAsMTYsMzgsMjU1LDI1NSwxNiwzOCwKKwk5LDAsOCwzNiwyNDksMjU1LDcyLDE2LDEsMCwxNiwzOCwKKwkyNTUsMjU1LDE2LDM4LDMzLDI0MCwwLDIsMCwwLDE5NiwxMzEsCisJMCwwLDAsMCwzMiw2OSwxOTIsMTIsMTQ0LDAsMTkwLDE3NSwKKwkxMSwwLDY0LDE2LDMzLDMyLDE5MiwzLDMzLDQwLDAsMCwKKwkyMTIsNjgsMTkyLDEyLDMzLDQ4LDAsMCwzMywxNTIsNjQsMCwKKwkzMywzMiwxOTIsMywzMyw0MCwwLDAsNDQsNjksMTkyLDEyLAorCTE2LDAsNiwzNiwyMzIsMjUsMTkyLDgsMzMsMTQ0LDY0LDAsCisJMjU1LDI1NSwxOCwzNiwyNTUsMjU1LDE5LDM2LDAsMCwzLDEzMCwKKwkwLDAsMiwxNDYsMCwwLDAsMCwxNywwLDk2LDE2LAorCTMyLDAsOCwzNiwxNSwwLDEwNCwxNiwxLDAsMTYsMzgsCisJMjU1LDI1NSwxNiwzOCwzMiwwLDQsMzYsMCwyMiwyLDAsCisJMywyMiwyLDAsOSwwLDgsMzYsOCwwLDcyLDE2LAorCTAsMCwwLDAsMSwwLDE2LDM4LDAsMCwzLDEzMCwKKwkwLDAsMiwxNDYsMywwLDk2LDE2LDAsMCwwLDAsCisJMjQ2LDI1NSwxMDAsMjAsMCwyMiwyLDAsMCwwLDIsMTMwLAorCTMyLDAsOCwzNiwyNTMsMjU1LDcyLDE2LDEsMCwxNiwzOCwKKwkyNTUsMjU1LDE2LDM4LDksMCw4LDM2LDI0OSwyNTUsNzIsMTYsCisJMSwwLDE2LDM4LDI1NSwyNTUsMTYsMzgsMzMsMTg0LDAsMiwKKwkzMywzMiwyMjQsMiwzMyw0MCwwLDAsMjEyLDY4LDE5MiwxMiwKKwkzMyw0OCwwLDAsMzMsMzIsMjI0LDIsMzMsNDAsMCwwLAorCTE2LDAsNiwzNiw0NCw2OSwxOTIsMTIsMzMsMTc2LDY0LDAsCisJMCwwLDIyNywxMzAsMCwwLDAsMCwxNSwwLDk2LDE2LAorCTMzLDE2OCw2NCwwLDMyLDAsOCwzNiwxMiwwLDEwNCwxNiwKKwkzMiwwLDMsMzYsMCwwLDIsMTMwLDksMCw4LDM2LAorCTgsMCw3MiwxNiwwLDAsMCwwLDEsMCwxNiwzOCwKKwkwLDAsMiwxMzAsMCwwLDAsMCwzLDAsNjQsMTYsCisJMCwwLDAsMCwyNDgsMjU1LDY3LDIwLDAsMCwwLDAsCisJMCwwLDEzMSwxMzAsMCwwLDAsMCwxMjEsMCw5OCw0NCwKKwkyNDQsMSw2NCwxNiwxMjgsMTYsMywwLDIsMTMxLDEsNjAsCisJMzMsOCwzNCwwLDE2MCwxMzgsMzQsMTQwLDAsMCwwLDAsCisJOCwwLDY0LDAsMCwwLDAsMCwxLDAsMTMxLDEzMCwKKwkxMDQsMCwyLDM2LDI2LDAsOTgsMTYsMTA1LDAsOTgsNDAsCisJNywwLDY0LDE2LDExNiwwLDIsMzYsMzQsMCw5NiwxNiwKKwk5OCwwLDIsMzYsMTEsMCw5OCwxNiwwLDAsMCwwLAorCTI2LDI4LDE5Miw4LDAsMCwwLDAsNSwwLDk4LDE2LAorCTExOSwwLDgsMzYsMjcsMCwxMDQsMTYsMzMsMTYsMzIsMiwKKwkyNiwyOCwxOTIsOCwwLDAsMCwwLDQsMTYyLDIsNjAsCisJMzMsMTQ0LDY2LDIsMiwwLDEzMCwxMzAsMCwwLDAsMCwKKwkyMTQsMSw2NCwyMCwwLDAsMCwwLDIsMTMxLDQsNjAsCisJMTA4LDEzMiwxMzIsMzYsMCwwLDcwLDE0Niw4MiwyNiwxOTIsOCwKKwkwLDAsMCwwLDIsMCwxMzAsMTMwLDAsMCwwLDAsCisJMjA1LDEsNjQsMjAsMCwwLDAsMCwyLDEzMSw0LDYwLAorCTEyMCwxMzIsMTMyLDM2LDAsMCw3MCwxNTAsMCwwLDAsMCwKKwkxNSw2MywxOTIsMTIsMzMsNDAsNjQsMiwxMjUsMjUsMTkyLDgsCisJMCwwLDAsMCwzMywxNiwzMiwyLDM3LDI1NSw2NCwxNiwKKwkyNTUsMjU1LDQ5LDM4LDAsMCw4MCwxNDIsMiwxMzEsNCw2MCwKKwkxMzIsMTMyLDEzMiwzNiwzMyw0MCw2NCwyLDQsMCw4MiwzOCwKKwkxNSw2MywxOTIsMTIsMzMsNDgsMCwyLDMzLDE2LDMyLDIsCisJMjQ3LDI1NSw2NCwyMCwyNTUsMjU1LDQ5LDM4LDEyNSwyNSwxOTIsOCwKKwkwLDAsMCwwLDEsMCwxMzEsMTMwLDEwNCwwLDIsMzYsCisJMjMsMCw5OCwxNiwxMDUsMCw5OCw0MCw3LDAsNjQsMTYsCisJMTE2LDAsMiwzNiwyNSwwLDk2LDE2LDk4LDAsMiwzNiwKKwkxMSwwLDk4LDE2LDAsMCwwLDAsMjYsMjgsMTkyLDgsCisJMCwwLDAsMCw1LDAsOTgsMTYsMTE5LDAsOCwzNiwKKwkxNywwLDEwNCwxNiwwLDAsMCwwLDI2LDI4LDE5Miw4LAorCTAsMCwwLDAsNCwxNjIsMiw2MCwzMywxNDQsNjYsMiwKKwkyLDAsMTMwLDEzMCwwLDAsMCwwLDE1OCwxLDY0LDIwLAorCTAsMCwwLDAsMTI1LDI1LDE5Miw4LDAsMCw4NSwxNjIsCisJMiwwLDEzMCwxMzAsMCwwLDAsMCwxNTIsMSw2NCwyMCwKKwkwLDAsMCwwLDEyNSwyNSwxOTIsOCwwLDAsODUsMTY2LAorCTEyNSwyNSwxOTIsOCwwLDAsODUsMTc0LDAsMTYzLDE2LDYwLAorCTMxLDE2MywxNyw2MCwyNTUsMjU1LDQ5LDU0LDAsMCwyLDE0MiwKKwkwLDAsMCwwLDQsMCw4MiwyMCwwLDAsMCwwLAorCTE4MCwxMjgsMTMyLDM5LDE1LDYzLDE5MiwxMiwzMyw0MCwwLDIsCisJNCwwLDE2LDM4LDQzLDE2LDQ4LDIsMjQ2LDI1NSw2NCwxNiwKKwkwLDAsMCwwLDEyNSwyNSwxOTIsOCwwLDAsMCwwLAorCTMzLDE2LDMyLDIsMjI4LDI1NCw2NCwxNiwyNTUsMjU1LDQ5LDM4LAorCTMzLDMyLDk2LDIsMTY0LDMyLDE5MiwxMiwzMyw0MCwxOTIsMiwKKwkzMywxNiwzMiwyLDI1MSwyNTUsNjQsMjAsMjU1LDI1NSw0OSwzOCwKKwkxMjUsMjUsMTkyLDgsMCwwLDAsMCwxLDAsMTMwLDEzMCwKKwkwLDAsMCwwLDExNywxLDY0LDIwLDMzLDMyLDMyLDIsCisJMTMzLDI5LDE5MiwxMiwzMyw0MCw5NiwyLDEyNSwyNSwxOTIsOCwKKwkwLDAsMCwwLDMzLDMyLDk2LDIsMzMsNDAsMzIsMiwKKwkyMzQsMzEsMTkyLDEyLDMzLDQ4LDE5MiwyLDEyNSwyNSwxOTIsOCwKKwkwLDAsMCwwLDEsMCwxMzAsMTMwLDAsMCwwLDAsCisJMTAzLDEsNjQsMjAsMzMsMTYsMzIsMiwyMDAsMjU0LDY0LDE2LAorCTI1NSwyNTUsNDksMzgsMzMsMzIsOTYsMiwzMyw0MCwxOTIsMiwKKwkxODIsMjksMTkyLDEyLDMzLDQ4LDAsMiwzMywxNiwzMiwyLAorCTI1MCwyNTUsNjQsMjAsMjU1LDI1NSw0OSwzOCwxMjUsMjUsMTkyLDgsCisJMCwwLDAsMCwzMywzMiwzMiwyLDMzLDQwLDk2LDIsCisJMzMsNDgsMTkyLDIsMzgsMzAsMTkyLDEyLDMzLDU2LDAsMiwKKwkxMjUsMjUsMTkyLDgsMCwwLDAsMCw1LDE2MiwyLDYwLAorCTAsMCw2OSwxNDQsMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsCisJMTQ0LDEzMiwxMzIsMzYsMTI1LDI1LDE5Miw4LDAsMCwwLDAsCisJMCwxNjMsMSw2MCwyMCwxLDMyLDE3MiwxNCwwLDMyLDE4LAorCTMzLDEyOCwwLDAsMTY0LDcsMTkyLDEyLDEsMCwxNiwzOCwKKwkxNDMsNjMsMTkyLDEyLDAsMCwwLDAsMTQzLDYzLDE5MiwxMiwKKwkwLDAsMCwwLDE0Myw2MywxOTIsMTIsMCwwLDAsMCwKKwkxNDMsNjMsMTkyLDEyLDAsMCwwLDAsNDMsMTYsMTcsMiwKKwkyNDQsMjU1LDY0LDIwLDAsMCwwLDAsMTg0LDYzLDE5MiwxMiwKKwkwLDAsMCwwLDAsMTYzLDE2LDYwLDIwLDEsMTYsMTQyLAorCTAsMCwwLDAsNywwLDE3LDIyLDMzLDQwLDMyLDIsCisJMiwxMzEsNCw2MCwxNjQsMTMyLDEzMiwzNiwxNSw2MywxOTIsMTIsCisJMzMsNDAsMzIsMiwxMjUsMjUsMTkyLDgsMCwwLDAsMCwKKwkyLDEzMSw0LDYwLDE4OCwxMzIsMTMyLDM2LDE1LDYzLDE5MiwxMiwKKwkzMyw0OCwwLDIsMTI1LDI1LDE5Miw4LDAsMCwwLDAsCisJMCwwLDIyNiwxMzAsNywxNjIsOCw2MCwxNiwwLDY0LDE2LAorCTMzLDE0NCw3MiwyLDMzLDE2LDMyLDIsMTM0LDI1NCw2NCwxNiwKKwkyNTUsMjU1LDQ5LDM4LDAsMCw4NSwxNzQsMiwxMzEsNCw2MCwKKwkxMzIsMTMyLDEzMiwzNiwzMyw0MCw2NCwyLDE1LDYzLDE5MiwxMiwKKwkzMyw0OCwxNjAsMiw0LDAsODIsMzgsMzMsMTYsMzIsMiwKKwkyNDcsMjU1LDY0LDIwLDI1NSwyNTUsNDksMzgsMTI1LDI1LDE5Miw4LAorCTAsMCwwLDAsMzMsMTYsMzIsMiwxMTksMjU0LDY0LDE2LAorCTI1NSwyNTUsNDksMzgsMCwwLDgwLDE0MiwyLDEzMSw0LDYwLAorCTEzMiwxMzIsMTMyLDM2LDMzLDQwLDY0LDIsNCwwLDgyLDM4LAorCTE1LDYzLDE5MiwxMiwzMyw0OCwwLDIsMzMsMTYsMzIsMiwKKwkyNDcsMjU1LDY0LDIwLDI1NSwyNTUsNDksMzgsMTI1LDI1LDE5Miw4LAorCTAsMCwwLDAsNywxNjIsMTYsNjAsNjQsMCwxNywzOCwKKwkyLDEzMSw0LDYwLDIyOCwxMzIsMTMyLDM2LDMzLDQwLDAsMiwKKwkwLDAsNiwxNDIsMCwwLDAsMCwxNSw2MywxOTIsMTIsCisJNCwwLDE2LDM4LDQyLDE2LDE3LDIsMjQ3LDI1NSw2NCwyMCwKKwk3LDE2Miw4LDYwLDEyOCwwLDE2LDM3LDE3NiwwLDE3LDM3LAorCTIsMTMxLDQsNjAsMjI4LDEzMiwxMzIsMzYsMzMsNDAsMCwyLAorCTAsMCw2LDE0MiwwLDAsMCwwLDE1LDYzLDE5MiwxMiwKKwk0LDAsMTYsMzgsNDIsMTYsMTcsMiwyNDcsMjU1LDY0LDIwLAorCTcsMTYyLDgsNjAsMTkyLDAsMTYsMzcsMjQwLDAsMTcsMzcsCisJMiwxMzEsNCw2MCwyMjgsMTMyLDEzMiwzNiwzMyw0MCwwLDIsCisJMCwwLDYsMTQyLDAsMCwwLDAsMTUsNjMsMTkyLDEyLAorCTQsMCwxNiwzOCw0MiwxNiwxNywyLDI0NywyNTUsNjQsMjAsCisJMCwwLDAsMCwxMjUsMjUsMTkyLDgsMCwwLDAsMCwKKwkxLDAsMTMwLDEzMCwwLDAsMCwwLDIyMiwwLDY0LDIwLAorCTMzLDE2LDMyLDIsNjMsMjU0LDY0LDE2LDI1NSwyNTUsNDksMzgsCisJMzMsMzIsOTYsMiwyMTMsMjksMTkyLDEyLDMzLDQwLDE2MCwyLAorCTMzLDE2LDMyLDIsMjUxLDI1NSw2NCwyMCwyNTUsMjU1LDQ5LDM4LAorCTEyNSwyNSwxOTIsOCwwLDAsMCwwLDEsMCwxMzAsMTMwLAorCTAsMCwwLDAsMjA4LDAsNjQsMjAsMzMsMTYsMzIsMiwKKwk0OSwyNTQsNjQsMTYsMjU1LDI1NSw0OSwzOCwzMywzMiw5NiwyLAorCTE2MSwzMSwxOTIsMTIsMzMsNDAsMTkyLDIsMzMsMTYsMzIsMiwKKwkyNTEsMjU1LDY0LDIwLDI1NSwyNTUsNDksMzgsMTI1LDI1LDE5Miw4LAorCTAsMCwwLDAsMzMsMTYsMzIsMiwzOCwyNTQsNjQsMTYsCisJMjU1LDI1NSw0OSwzOCwyMDgsMzIsMTkyLDEyLDMzLDMyLDAsMCwKKwkzMywzMiwwLDAsMTY0LDMyLDE5MiwxMiwzMyw0MCwwLDAsCisJNDAsMjksMTkyLDEyLDAsMCwwLDAsMTMzLDI5LDE5MiwxMiwKKwkyNTUsMjU1LDQsMzYsMzMsMTYsMzIsMiwyNDUsMjU1LDY0LDIwLAorCTI1NSwyNTUsNDksMzgsMTI1LDI1LDE5Miw4LDAsMCwwLDAsCisJMSwwLDEzMSwxMzAsODcsMCwyLDM2LDI3LDAsOTgsMTYsCisJODgsMCw5OCw0MCw3LDAsNjQsMTYsMTE0LDAsMiwzNiwKKwkzNywwLDk2LDE2LDgyLDAsMiwzNiw5LDAsOTgsMTYsCisJMCwwLDAsMCwxMjUsMjUsMTkyLDgsMCwwLDAsMCwKKwk1LDAsOTgsMTYsMTE5LDAsOCwzNiwxNSwwLDEwNCwxNiwKKwkwLDAsMCwwLDEyNSwyNSwxOTIsOCwwLDAsMCwwLAorCTIsMCwxMzAsMTMwLDAsMCwwLDAsMTU5LDAsNjQsMjAsCisJMCwwLDAsMCw2MCw2NSwxOTIsMTIsMzMsMzIsOTYsMiwKKwkxODQsMTI4LDEzMiwzOSwzMyw0MCw5NiwyLDE1LDYzLDE5MiwxMiwKKwkzMyw0OCw2NCwwLDEyNSwyNSwxOTIsOCwwLDAsMCwwLAorCTIsMCwxMzAsMTMwLDAsMCwwLDAsMTQ3LDAsNjQsMjAsCisJMzMsMzIsOTYsMiwxNjIsNjUsMTkyLDEyLDMzLDQwLDE2MCwyLAorCTI0MiwyNTMsNjQsMjAsMzMsNDAsMTYwLDIsMiwxMzEsNCw2MCwKKwk4LDEzMywxMzIsMzYsMTUsNjMsMTkyLDEyLDMzLDQ4LDk2LDIsCisJMTI1LDI1LDE5Miw4LDAsMCwwLDAsMzMsMTYsMzIsMiwKKwkyMzMsMjUzLDY0LDE2LDI1NSwyNTUsNDksMzgsNDAsMjksMTkyLDEyLAorCTAsMCwwLDAsMzMsMTYsMzIsMiwyNTIsMjU1LDY0LDIwLAorCTI1NSwyNTUsNDksMzgsMTI1LDI1LDE5Miw4LDAsMCwwLDAsCisJMSwwLDEzMywxMzAsODcsMCwyLDM2LDI5LDAsMTYyLDE2LAorCTg4LDAsMTYyLDQwLDUsMCw2NCwxNiw4MiwwLDIsMzYsCisJMTEsMCwxNjIsMTYsMzMsMTYsMzIsMiwxMjUsMjUsMTkyLDgsCisJMCwwLDAsMCwxMTQsMCwyLDM2LDUsMCwxNjIsMTYsCisJMTE5LDAsOCwzNiwxOSwwLDE2OCwxNiwzMywzMiw2NCwyLAorCTEyNSwyNSwxOTIsOCwwLDAsMCwwLDMzLDE2LDMyLDIsCisJMjA2LDI1Myw2NCwxNiwyNTUsMjU1LDQ5LDM4LDE2OCw2OSwxOTIsMTIsCisJMzMsMzIsNjQsMiwxODQsMTI4LDEzMiwzOSwzMyw0MCw2NCwyLAorCTE1LDYzLDE5MiwxMiwzMyw0OCw2NCwwLDEsMCw4MiwzOCwKKwkzMywxNiwzMiwyLDI0NywyNTUsNjQsMjAsMjU1LDI1NSw0OSwzOCwKKwkxMjUsMjUsMTkyLDgsMCwwLDAsMCwzMywzMiw2NCwyLAorCTI5LDcwLDE5MiwxMiwzMyw0MCwxNjAsMiwxODksMjUzLDY0LDIwLAorCTMzLDQwLDE2MCwyLDIsMTMxLDQsNjAsNDAsMTMzLDEzMiwzNiwKKwkxNSw2MywxOTIsMTIsMzMsNDgsNjQsMiwxMjUsMjUsMTkyLDgsCisJMCwwLDAsMCwxNDQsMCwxNjQsMTQzLDEyMiwyOCwxOTIsMTIsCisJMCwwLDAsMCwxMjUsMjUsMTkyLDgsMCwwLDAsMCwKKwkzMywxNiw5NiwyLDE3NSwyNTMsNjQsMTYsMjU1LDI1NSwxMTUsMzgsCisJMTQzLDYzLDE5MiwxMiwwLDAsMCwwLDMzLDE2LDk2LDIsCisJMjUyLDI1NSw2NCwyMCwyNTUsMjU1LDExNSwzOCwxMjUsMjUsMTkyLDgsCisJMCwwLDAsMCwzMywxNiwzMiwyLDE2NSwyNTMsNjQsMTYsCisJMjU1LDI1NSw0OSwzOCwzMywzMiw5NiwyLDIwOCwzMiwxOTIsMTIsCisJMzMsNDAsMTkyLDIsMzMsMTYsMzIsMiwyNTEsMjU1LDY0LDIwLAorCTI1NSwyNTUsNDksMzgsMTI1LDI1LDE5Miw4LDAsMCwwLDAsCisJMSwwLDEzMCwxNDYsMCwwLDAsMCwxNTksMjU1LDY2LDM2LAorCTAsMjIsMiwwLDMsMzAsMiwwLDI0LDAsOTgsNDQsCisJMjcsMCw2NCwxNiwxMjgsMTYsMywwLDIsMTMxLDEsNjAsCisJMzMsOCwzNCwwLDEzNiwxNDAsMzQsMTQwLDAsMCwwLDAsCisJOCwwLDY0LDAsMCwwLDAsMCwxMiwzMywxOTIsMTIsCisJMzMsMzIsNjQsMiwxMjUsMjUsMTkyLDgsMCwwLDAsMCwKKwkxNSwzMywxOTIsMTIsMzMsMzIsOTYsMiwxMjUsMjUsMTkyLDgsCisJMCwwLDAsMCwxOCwzMywxOTIsMTIsMzMsMzIsOTYsMiwKKwkxMjUsMjUsMTkyLDgsMCwwLDAsMCwyMiwzMywxOTIsMTIsCisJMzMsMzIsOTYsMiwxMjUsMjUsMTkyLDgsMCwwLDAsMCwKKwkyNSwzMywxOTIsMTIsMzMsMzIsNjQsMiwxMjUsMjUsMTkyLDgsCisJMCwwLDAsMCwzMywzMiw2NCwyLDcsMzMsMTkyLDEyLAorCTMzLDQwLDE5MiwyLDEyNSwyNSwxOTIsOCwwLDAsMCwwLAorCTE2LDAsMTgyLDE3NSwzMywzMiwzMiwyLDMzLDQwLDE5MiwzLAorCTMzLDQ4LDIyNCwyLDE2MSwzMywxOTIsMTIsMzMsNTYsMTYwLDIsCisJMTI1LDI1LDE5Miw4LDAsMCwwLDAsMzMsMTM2LDAsMCwKKwkyLDEzMSw0LDYwLDcyLDEzMywxMzIsMzYsMTUsNjMsMTkyLDEyLAorCTEsMCw0OSwzOCwzMiwwLDM0LDQ2LDI1MCwyNTUsNjQsMjAsCisJMCwwLDAsMCwxMjUsMjUsMTkyLDgsMCwwLDAsMCwKKwkyLDEzMSw0LDYwLDkyLDEzMywxMzIsMzYsMTUsNjMsMTkyLDEyLAorCTMzLDQwLDEyOCwyLDEyMywyNSwxOTIsOCwwLDAsMCwwLAorCTIyOCwwLDE5MSwxNDMsMjI0LDAsMTkwLDE0MywyMjAsMCwxODMsMTQzLAorCTIxNiwwLDE4MiwxNDMsMjEyLDAsMTgxLDE0MywyMDgsMCwxODAsMTQzLAorCTIwNCwwLDE3OSwxNDMsMjAwLDAsMTc4LDE0MywxOTYsMCwxNzcsMTQzLAorCTE5MiwwLDE3NiwxNDMsOCwwLDIyNCwzLDIzMiwwLDE4OSwzOSwKKwkyMzIsMjU1LDE4OSwzOSwyLDEzMSw1LDYwLDE5MiwxNTQsMTY1LDM2LAorCTIwLDAsMTkxLDE3NSwxNiwwLDE3NiwxNzUsMCwwLDE2MiwxNDAsCisJMCwwLDAsMCw5LDAsNjQsMTYsMzMsMTI4LDE2MCwwLAorCTAsMCw1LDE0MiwxOTIsMTI4LDEzMiwzOSwxNSw2MywxOTIsMTIsCisJNCwwLDE2LDM4LDAsMCwyLDE0MiwwLDAsMCwwLAorCTI0OSwyNTUsNjQsMjAsMCwwLDAsMCwyMCwwLDE5MSwxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywyNCwwLDE4OSwzOSwKKwkwLDAsMTMyLDE0NCwwLDAsMCwwLDIwOCwyNTUsMTMwLDM2LAorCTEwLDAsNjYsNDQsNCwwLDY0LDE2LDAsMjIsNCwwLAorCTMsMjIsMiwwLDg5LDI4LDE5Miw4LDIwOCwyNTUsNjYsMzYsCisJMTU5LDI1NSwxMzAsMzYsNiwwLDY2LDQ0LDQsMCw2NCwxNiwKKwkwLDIyLDQsMCwzLDIyLDIsMCw4OSwyOCwxOTIsOCwKKwkxNjksMjU1LDY2LDM2LDE5MSwyNTUsMTMwLDM2LDYsMCw2Niw0NCwKKwkzLDAsNjQsMjAsMCwyMiw0LDAsODksMjgsMTkyLDgsCisJMjU1LDI1NSwyLDM2LDMsMjIsMiwwLDIwMSwyNTUsNjYsMzYsCisJOCwwLDIyNCwzLDAsMCwwLDAsMjE2LDI1NSwxODksMzksCisJMjQsMCwxNzgsMTc1LDMzLDE0NCwxMjgsMCwzMiwwLDE5MSwxNzUsCisJMjgsMCwxNzksMTc1LDIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsCisJMCwwLDgxLDE0MiwwLDAsMCwwLDY1LDI4LDE5MiwxMiwKKwkzMywzMiwzMiwyLDMzLDI0LDY0LDAsMjU1LDI1NSwxOSwzNiwKKwk5LDAsMTE1LDE2LDAsMTI5LDMsMCw2NSwyOCwxOTIsMTIsCisJMSwwLDM2LDM4LDMzLDI0LDY0LDAsNCwwLDExNSwxNiwKKwkyLDAsMzQsMzgsMCwwLDY2LDE3NCwxMTUsMjgsMTkyLDgsCisJMzcsMTYsMywyLDI1NSwyNTUsMiwzNiwzMiwwLDE5MSwxNDMsCisJMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMyw0MCwwLDE4OSwzOSwKKwkxNzYsMjU1LDE4OSwzOSw2NCwwLDE4MCwxNzUsMzMsMTYwLDEyOCwwLAorCTcyLDAsMTkxLDE3NSw2OCwwLDE4MSwxNzUsNjAsMCwxNzksMTc1LAorCTU2LDAsMTc4LDE3NSw1MiwwLDE3NywxNzUsNDgsMCwxNzYsMTc1LAorCTAsMCwxMzAsMTMwLDAsMCwwLDAsNTMsMCw2NCwyMCwKKwkzMywxMjgsMCwwLDI3LDY3LDE5MiwxMiwzMywzMiwwLDAsCisJMSwwLDQsMzYsMjcsNjcsMTkyLDEyLDMzLDEyOCw2NCwwLAorCTIsMCw0LDM2LDI3LDY3LDE5MiwxMiwzMywxMzYsNjQsMCwKKwkzMywyNCw2NCwwLDI1NSwyNTUsMiwzNiw1LDAsMiwxOCwKKwkwLDAsMCwwLDMsMCwzNCwxOCwwLDAsMCwwLAorCTYsMCw5OCwyMCwyNTUsMjU1LDIsNTIsMiwxMzEsNCw2MCwKKwkxNSw2MywxOTIsMTIsNjAsMTM3LDEzMiwzNiwyOSwyOSwxOTIsOCwKKwkwLDAsMCwwLDUsMCwyLDE4LDAsMCwwLDAsCisJMywwLDM0LDE4LDAsMCwwLDAsNiwwLDk4LDIwLAorCTEsMCwyLDUwLDIsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLAorCTEwNCwxMzcsMTMyLDM2LDI5LDI5LDE5Miw4LDAsMCwwLDAsCisJNiwwLDY0LDE2LDI1NSwwLDUsNTAsMiwxMzEsNCw2MCwKKwkxNSw2MywxOTIsMTIsMTMyLDEzNywxMzIsMzYsMjksMjksMTkyLDgsCisJMCwwLDAsMCwyLDEzMSw0LDYwLDE3NiwxMzcsMTMyLDM2LAorCTMsNTAsMTYsMCwzLDE4LDE3LDAsMTYsMCwxNjIsMTc1LAorCTI1NSwwLDk4LDQ4LDIwLDAsMTYyLDE3NSwzLDE4LDMsMCwKKwkyNTUsMCwzOSw1MCwxNSw2MywxOTIsMTIsMjQsMCwxNjIsMTc1LAorCTI5LDI5LDE5Miw4LDAsMCwwLDAsNDAsMCwxODAsMTc1LAorCTU4LDAsMjEsMzYsMzIsMCwxOSwzNiwyNTUsMjU1LDE4LDM2LAorCTMyLDAsMTc3LDM5LDQwLDAsMTYyLDE0MywwLDAsMCwwLAorCTAsMCw2NywxMjgsMCwwLDAsMCwzLDAsMTE3LDE2LAorCTAsMCwwLDAsMywwLDExNSwyMCwwLDAsMCwwLAorCTEsMCw2NiwzNiw0MCwwLDE2MiwxNzUsOTEsMjgsMTkyLDEyLAorCTQwLDAsMTY0LDM5LDMzLDI0LDY0LDAsNzUsMCwxMTQsMTYsCisJMCwwLDAsMCw0MCwwLDE2MiwxNDMsMCwwLDM1LDE2NiwKKwkwLDAsNjcsMTI4LDAsMCwwLDAsMywwLDExNywxNiwKKwkwLDAsMCwwLDMsMCwxMTUsMjAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsNDAsMCwxNjIsMTc1LDkxLDI4LDE5MiwxMiwKKwk0MCwwLDE2NCwzOSwzMywyNCw2NCwwLDYwLDAsMTE0LDE2LAorCTEsMCwxNiwzOCwwLDAsMzQsMTUwLDAsMjYsMywwLAorCTM3LDE2LDY3LDAsMCwwLDM0LDE2NiwzLDAsMiw0MiwKKwkyMjAsMjU1LDY0LDIwLDIsMCw0OSwzOCwzMiwwLDE2NSwxNTEsCisJMCwwLDAsMCwxLDAsMTYyLDQ4LDcsMCw2NCwxNiwKKwkwLDAsMCwwLDIsMTMxLDQsNjAsMjA4LDEzNywxMzIsMzYsCisJMTUsNjMsMTkyLDEyLDI1NSwwLDE2NSw0OCwyNSwyOSwxOTIsOCwKKwkwLDAsMCwwLDM2LDAsMTYyLDE1MSwwLDAsMCwwLAorCTAsNyw2Niw0OCw2LDAsNjQsMTYsMCwwLDAsMCwKKwkyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwwLDEzOCwxMzIsMzYsCisJMjUsMjksMTkyLDgsMCwwLDAsMCwyNTUsNjYsMTkyLDEyLAorCTMzLDMyLDAsMCwxLDAsNCwzNiwzNCwwLDE2NSwxNTEsCisJMCwwLDAsMCwyNTUsNjYsMTkyLDEyLDMzLDEyOCwwLDAsCisJMzYsMCwxNjUsMTUxLDAsMCwwLDAsMjU1LDY2LDE5MiwxMiwKKwkyLDAsNCwzNiwyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwKKwkzMiwxMzgsMTMyLDM2LDIsMTMxLDQsNjAsODAsMTM4LDEzMiwzNiwKKwkxNSw2MywxOTIsMTIsMzMsNDAsMCwyLDE5NiwxMjgsMTMyLDM5LAorCTIwMCwxMjgsMTM0LDM5LDMxLDIxLDE5MiwxMiwzMiwwLDE2NSwzOSwKKwkzNiwwLDE2MiwxNTEsMSwwLDE2LDM4LDAsMSw2NiwzNiwKKwkzNiwwLDE2MiwxNjcsOCwwLDIsNDIsNywwLDY0LDE2LAorCTAsMCwwLDAsOCwyOSwxOTIsOCwwLDAsMCwwLAorCTIsMTMxLDQsNjAsMTE2LDEzOCwxMzIsMzYsMTUsNjMsMTkyLDEyLAorCTMzLDQwLDEyOCwyLDcyLDAsMTkxLDE0Myw2OCwwLDE4MSwxNDMsCisJNjQsMCwxODAsMTQzLDYwLDAsMTc5LDE0Myw1NiwwLDE3OCwxNDMsCisJNTIsMCwxNzcsMTQzLDQ4LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJODAsMCwxODksMzksMCwwLDAsMCwwLDAsMCwwLAorCTIyNCwyNTUsMTg5LDM5LDE2LDAsMTc2LDE3NSwzMywxMjgsMCwwLAorCTIwLDAsMTc3LDE3NSwzMywxMzYsMCwwLDI0LDAsMTkxLDE3NSwKKwkzMywzMiwwLDIsMTYyLDY1LDE5MiwxMiwzMyw0MCwwLDAsCisJNDMsMCw2NCwxNiwwLDAsMCwwLDEsMCwxNiwzOCwKKwk2NCwwLDIsNDIsMjQ5LDI1NSw2NCwyMCwzMywzMiwwLDIsCisJMzMsMTI4LDAsMCw4NSw4NSwxNywzNiwzMywzMiwwLDIsCisJMTYyLDY1LDE5MiwxMiw4NSw4NSw1LDM2LDMyLDAsNjQsMTYsCisJMCwwLDAsMCwxLDAsMTYsMzgsNjQsMCwyLDQyLAorCTI0OSwyNTUsNjQsMjAsMzMsMzIsMCwyLDMzLDEyOCwwLDAsCisJMTcwLDE3MCwxNyw1MiwzMywzMiwwLDIsMTYyLDY1LDE5MiwxMiwKKwkxNzAsMTcwLDUsNTIsMjEsMCw2NCwxNiwwLDAsMCwwLAorCTEsMCwxNiwzOCw2NCwwLDIsNDIsMjQ5LDI1NSw2NCwyMCwKKwkzMywzMiwwLDIsMzMsMTI4LDAsMCwyNTUsMjU1LDE3LDUyLAorCTMzLDMyLDAsMiwxNjIsNjUsMTkyLDEyLDI1NSwyNTUsNSw1MiwKKwkxMCwwLDY0LDE2LDAsMCwwLDAsMSwwLDE2LDM4LAorCTY0LDAsMiw0MiwyNDksMjU1LDY0LDIwLDMzLDMyLDAsMiwKKwkyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwyNDAsMTQwLDEzMiwzNiwKKwkxMDEsMjksMTkyLDgsMCwwLDAsMCw2MCw2NSwxOTIsMTIsCisJMzMsMzIsMCwyLDIsMTMxLDQsNjAsNCwxNDEsMTMyLDM2LAorCTMzLDQwLDMyLDIsMzMsNDgsMCwyLDE1LDYzLDE5MiwxMiwKKwkzMyw1Niw2NCwwLDI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywzMiwwLDE4OSwzOSwKKwkwLDAsMCwwLDAsMCwwLDAsMjMyLDI1NSwxODksMzksCisJMTYsMCwxOTEsMTc1LDIxMCw3LDE5MiwxMiwwLDAsMCwwLAorCTEzOSwxNCwxOTIsMTIsMCwwLDAsMCwxODAsMTAsMTkyLDEyLAorCTAsMCwwLDAsMzIsMTMzLDEzMiwxNDMsMSwwLDIsMzYsCisJNDIsMTYsNjgsMCw5LDAsNjQsMTYsMCwyLDMsMzYsCisJNjQsMzQsNCwwLDIsMTMxLDEsNjAsMzMsOCwzNSwwLAorCTE5NiwyNDYsMzIsMTcyLDAsMiw5OSwzNiw0MiwxNiwxMDAsMCwKKwkyNTAsMjU1LDY0LDIwLDAsMCwwLDAsMTYsMCwxOTEsMTQzLAorCTI0LDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTIwOCwyNTUsMTg5LDM5LDI0LDAsMTc4LDE3NSwzMywxNDQsMTI4LDAsCisJMzIsMCwxODAsMTc1LDMzLDE2MCwxNjAsMCw0NCwwLDE5MSwxNzUsCisJNDAsMCwxODIsMTc1LDM2LDAsMTgxLDE3NSwyOCwwLDE3OSwxNzUsCisJMjAsMCwxNzcsMTc1LDMsMCwxMjgsMjYsMTYsMCwxNzYsMTc1LAorCTE0OSwyOSwxOTIsOCwxLDAsMTQ3LDM4LDEsMCwyMCwzNiwKKwkzMiwxMzMsMTQ3LDE0MywyNTUsMjU1LDgyLDM4LDI1NSwyNTUsMiwzNiwKKwkyMCwwLDY2LDE4LDI1NSwyNTUsMjEsMzYsMiwxMzEsMjIsNjAsCisJMTkyLDI0NiwyMTQsMzgsMTA4LDI5LDE5MiwxMiwzMywxMjgsMTI4LDIsCisJNDIsMTYsMTksMiwxMCwwLDY0LDE2LDY0LDE4LDE2LDAsCisJMzMsMTM2LDg2LDAsMjQyLDIxLDE5MiwxMiwzMywzMiwzMiwyLAorCTEzMywxMiwxOTIsMTIsMzMsMzIsMCwyLDEsMCwxNiwzOCwKKwk0MiwxNiwxOSwyLDI0OSwyNTUsNjQsMjAsMCwyLDQ5LDM4LAorCTI1NSwyNTUsODIsMzgsMjQwLDI1NSw4NSwyMiwwLDAsMCwwLAorCTQ0LDAsMTkxLDE0Myw0MCwwLDE4MiwxNDMsMzYsMCwxODEsMTQzLAorCTMyLDAsMTgwLDE0MywyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQ4LDAsMTg5LDM5LDIxNiwyNTUsMTg5LDM5LDI0LDAsMTc4LDE3NSwKKwkzMywxNDQsMTYwLDAsMjgsMCwxNzksMTc1LDMzLDE1MiwxOTIsMCwKKwkzMiwwLDE5MSwxNzUsMjAsMCwxNzcsMTc1LDMsMCwxMjgsMjQsCisJMTYsMCwxNzYsMTc1LDE5NSwyOSwxOTIsOCwxLDAsMTQ1LDM2LAorCTEsMCw0LDM2LDMyLDEzMywxNDUsMTQzLDMzLDEyOCwxMjgsMCwKKwk0MiwxNiwxNywyLDgsMCw2NCwxNiwzMywzMiwwLDIsCisJMzMsNDAsNjQsMiwyNTAsMjksMTkyLDEyLDMzLDQ4LDk2LDIsCisJMSwwLDE2LDM4LDQyLDE2LDE3LDIsMjUwLDI1NSw2NCwyMCwKKwkzMywzMiwwLDIsMzIsMCwxOTEsMTQzLDI4LDAsMTc5LDE0MywKKwkyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNDAsMCwxODksMzksMjI0LDI1NSwxODksMzksCisJMjQsMCwxOTEsMTc1LDIwLDAsMTc3LDE3NSwzLDAsMTI4LDI0LAorCTE2LDAsMTc2LDE3NSwyMjIsMjksMTkyLDgsMSwwLDE0NSwzNiwKKwkxLDAsNCwzNiwzMiwxMzMsMTQ1LDE0MywzMywxMjgsMTI4LDAsCisJNDIsMTYsMTcsMiw3LDAsNjQsMTYsMCwwLDAsMCwKKwkyMzcsMjksMTkyLDEyLDMzLDMyLDAsMiwxLDAsMTYsMzgsCisJNDIsMTYsMTcsMiwyNTEsMjU1LDY0LDIwLDAsMCwwLDAsCisJMjQsMCwxOTEsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDMyLDAsMTg5LDM5LDY0LDM0LDQsMCwKKwkyLDEzMSwyLDYwLDE5MiwyNDYsNjYsMzYsMzMsMzIsMTMwLDAsCisJNDQsMCwxMzEsMTQwLDEsMCwyLDM2LDMyLDAsMTMwLDE3MiwKKwkxNiwwLDIsMzYsMiwwLDk4LDE2NCw4LDAsMTMwLDE0MCwKKwkwLDAsMCwwLDgsMCwyMjQsMywwLDAsNjQsMTcyLAorCTIwOCwyNTUsMTg5LDM5LDMzLDQ4LDEyOCwwLDY0LDE4LDYsMCwKKwkyLDEzMSwzLDYwLDE5MiwyNDYsOTksMzYsMzYsMCwxNzcsMTc1LAorCTMzLDEzNiw2NywwLDQwLDAsMTkxLDE3NSwzMiwwLDE3NiwxNzUsCisJNCwwLDM0LDE0MiwwLDAsMCwwLDQsMCw2NCwyMCwKKwkzMywxMjgsMTYwLDAsMSwwLDQsMzYsMTMzLDI5LDE5MiwxMiwKKwkzMyw0MCwxOTIsMCwzLDAsMCwzMCwyMjEsNSwyLDQyLAorCTE3LDMwLDE5Miw4LDEsMCwxNiwzNiwzLDAsNjQsMjAsCisJMzMsMzIsMzIsMiwyMjAsNSwxNiwzNiwzMywzMiwzMiwyLAorCTIwOCw3LDUsMzYsMTA4LDAsMTMxLDE0MCwxMiwwLDIsMzYsCisJMiwwLDk4LDE2NCwxNiwwLDE2MiwzOSw4LDAsOTgsMTcyLAorCTAsMTI4LDIsNTQsMTIsMCw5NiwxNzIsMTYsMCwxNjIsMTc1LAorCTI1NSwyNTUsMiwzNiwyMCwwLDE2MiwxNzUsMiwxMzEsMiw2MCwKKwkwLDE1NSw2NiwzNiw5OCwzMSwxOTIsMTIsMjQsMCwxNjIsMTc1LAorCTQwLDAsMTkxLDE0MywzNiwwLDE3NywxNDMsMzIsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0OCwwLDE4OSwzOSw1NiwyNTQsMTg5LDM5LAorCTE2MCwxLDE3NiwxNzUsMzMsMTI4LDE5MiwwLDQ4LDEsMTY0LDE3NSwKKwkzMywzMiwyMjQsMCw2NCwxOCw1LDAsMiwxMzEsMyw2MCwKKwkxOTIsMjQ2LDk5LDM2LDMzLDE2LDY3LDAsNTYsMSwxNjIsMTc1LAorCTY0LDE4LDE2LDAsMzMsMTYsNjcsMCw0MCwwLDE2OCwzOSwKKwkxOTYsMSwxOTEsMTc1LDE5MiwxLDE5MCwxNzUsMTg4LDEsMTgzLDE3NSwKKwkxODQsMSwxODIsMTc1LDE4MCwxLDE4MSwxNzUsMTc2LDEsMTgwLDE3NSwKKwkxNzIsMSwxNzksMTc1LDE2OCwxLDE3OCwxNzUsMTY0LDEsMTc3LDE3NSwKKwk2NCwxLDE2MiwxNzUsMTIsMCwxNjAsMjQsOTYsMSwxNjgsMTc1LAorCTMyLDEzMywxMzEsMTQzLDAsMCwwLDAsNDIsMTYsMTYzLDAsCisJMTksMSw2NCwxNiwxLDAsMiwzNiw1LDAsMCwyNiwKKwk0MiwxNiwzLDIsMTUsMSw2NCwxNiwxLDAsMiwzNiwKKwkzLDAsMTc2LDIwLDMzLDQwLDAsMCw4NiwzMSwxOTIsOCwKKwkxLDAsMiwzNiwyMTIsNjgsMTkyLDEyLDMzLDQ4LDAsMCwKKwk2LDAsNjUsNCwxMDQsMSwxNjIsMTc1LDMzLDcyLDY0LDAsCisJMzUsNzIsOSwwLDEwNCwxLDE2OSwxNzUsODcsMzAsMTkyLDgsCisJMTEyLDEsMTYwLDE3NSwxLDAsOCwzNiwxMTIsMSwxNjgsMTc1LAorCTEsMCw0LDM2LDEzMywyOSwxOTIsMTIsMzMsNDAsMCwwLAorCTIzNywyOSwxOTIsMTIsMzMsMzIsMCwyLDI0LDAsMTY5LDM5LAorCTU2LDEsMTY4LDE0MywyNTUsMCwyLDM2LDgwLDEsMTY5LDE3NSwKKwkxMDgsMCw4LDE0MSw0MywxLDE2MywzOSw3MiwxLDE2OCwxNzUsCisJMCwwLDk4LDE2MCwyNTUsMjU1LDY2LDM2LDI1MywyNTUsNjUsNCwKKwkyNTUsMjU1LDk5LDM2LDY0LDEsMTY5LDE0MywwLDAsMCwwLAorCTEyMCwwLDQxLDE0MSw2NCwxLDE2OCwxNDMsMTI4LDEsMTY5LDE3NSwKKwkxMjQsMCw4LDE0MSw2NCwxLDE2OSwxNDMsMTM2LDEsMTY4LDE3NSwKKwk0NCwwLDM0LDE0MSwwLDAsMCwwLDEyLDAsNjQsMTcyLAorCTQ0LDAsMzQsMTQxLDAsMCwwLDAsMTYsMCw2NCwxNzIsCisJNDQsMCwzNCwxNDEsMTIwLDEsMTYwLDE3NSwzMiwwLDY0LDE3MiwKKwk0NCwwLDM0LDE0MSw4OCwxLDE2MCwxNzUsMjQsMCw2NCwxNzIsCisJNDgsMSwxNjgsMTQzLDAsMCwwLDAsMTY4LDAsMCwyNSwKKwk0MCwwLDE2OSwzOSwxNDQsMSwxNjksMTc1LDg4LDEsMTY4LDE0MywKKwkwLDAsMCwwLDI1NSwwLDIsNDksNCwwLDg2LDM2LAorCTYwLDAsMTk0LDQyLDIsMCw2NCwxNiwwLDAsMCwwLAorCTYwLDAsMjIsMzYsMTA0LDEsMTY5LDE0MywwLDAsMCwwLAorCTIsMCwzMiwxNywwLDAsMCwwLDEwNCwxLDE4MiwxNDMsCisJNTYsMSwxNjQsMTQzLDcyLDEsMTY4LDE0MywxMiwwLDIsMzYsCisJMiwwLDIsMTY1LDgwLDEsMTY5LDE0MywwLDEyOCwxOTQsNTQsCisJOCwwLDksMTczLDEyLDAsMCwxNzMsMCwwLDM0LDE3MywKKwkyNTUsMjU1LDgsMzYsNCwwLDQwLDE3MywxNDQsMSwxNjgsMTQzLAorCTAsMCwwLDAsOCwwLDQwLDE3Myw4OCwxLDE2OCwxNDMsCisJOTYsMSwxNjksMTQzLDIwOCw3LDUsMzYsOTgsMzEsMTkyLDEyLAorCTAsMCw0MCwxNzMsMCwxMjgsNSw1MiwwLDEyOCw2LDUyLAorCTEyOCwxLDE2NCwxNDMsMCwwLDAsMCwxMjksNjcsMTkyLDEyLAorCTIsMCw3LDM2LDEzLDAsNjQsMjAsMCwwLDAsMCwKKwk4OCwxLDE2NSwxNDMsMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsCisJNjQsMTQxLDEzMiwzNiwxMjAsMSwxNjksMTQzLDAsMCwwLDAsCisJMSwwLDQxLDM3LDIwLDAsMzQsNDEsMTE3LDAsNjQsMTYsCisJMTIwLDEsMTY5LDE3NSwzMiwzMSwxOTIsOCwwLDAsMCwwLAorCTEyOCwxLDE2OCwxNDMsNjQsMSwxNjksMTQzLDgsMCwyLDE0MSwKKwkyNTUsMjU1LDgsMzYsMTM2LDAsNTMsMTQxLDAsMCwwLDAsCisJNTAsMCw3MiwxNiwzMywxODQsMCwwLDEsMCw0LDM2LAorCTQsMCwxOCwzNiw0LDAsMywzNiwwLDAsMTkwLDE0MiwKKwk4LDAsMTY2LDE0MiwxMTIsMSwxNjksMTQzLDI1NSw2MywyMTIsNTEsCisJMzAsMCwzMiwxNywzMywxODQsMjQ0LDIsNDIsMTYsMTE2LDAsCisJMjcsMCw2NCwxNiwzMywxNTIsOTYsMCwxNDQsMSwxNjgsMTQzLAorCTAsMCwwLDAsMzMsMTM2LDcyLDIsMzMsMTI4LDEwMiwwLAorCTE1LDAsMTI4LDE2LDAsMCwwLDAsMCwwLDIsMTQ2LAorCTAsMCwzNSwxNDYsMCwwLDAsMCwxMCwwLDY3LDE2LAorCTMzLDQ4LDE5MiwyLDIsMTMxLDQsNjAsOTIsMTQxLDEzMiwzNiwKKwk4OCwxLDE2NSwxNDMsMTYsMCwxNjMsMTc1LDAsMCwyLDE0NiwKKwkzMyw1Niw2NCwyLDE1LDYzLDE5MiwxMiwyMCwwLDE2MiwxNzUsCisJMzMsMzIsMCwwLDEsMCwxMTUsMzgsMSwwLDE2LDM4LAorCTEsMCw0OSwzOCw0MiwxNiwxMTYsMiwyMzUsMjU1LDY0LDIwLAorCTEsMCw4MiwzOCwzMywyNCwwLDAsNCwwLDE4MSwxNDIsCisJMCwxMjgsMTk0LDUxLDIxNywyNTUsNjQsMTYsMCwwLDAsMCwKKwkxMjgsMSwxNjksMTQzLDAsMCwwLDAsOCwwLDM0LDE0MSwKKwkwLDAsMCwwLDI1LDAsMTI4LDE2LDE4LDAsODcsMTY0LAorCTksMCwyNDYsMTgsMzMsNDgsMTkyLDIsMiwxMzEsNCw2MCwKKwkxNDAsMTQxLDEzMiwzNiw4OCwxLDE2NSwxNDMsMCwwLDAsMCwKKwkxNSw2MywxOTIsMTIsMzMsNTYsMjI0LDIsNSwzMSwxOTIsOCwKKwkwLDAsMCwwLDY0LDEsMTY4LDE0MywwLDAsMCwwLAorCTEzNiwwLDIsMTQxLDk2LDEsMTY5LDE0Myw4LDAsNzAsMTQwLAorCTAsMCwzNCwxNDEsMCwwLDE5OCwxNDAsMCwwLDAsMCwKKwk3LDAsMTk0LDE2LDAsMCwwLDAsODgsMSwxNjUsMTQzLAorCTIsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLDE4NCwxNDEsMTMyLDM2LAorCTY0LDEsMTY4LDE0MywwLDAsMCwwLDEzNiwwLDQsMTQxLAorCTE1MiwyMSwxOTIsMTIsMCwwLDAsMCw2NCwxLDE2OSwxNDMsCisJMCwwLDAsMCwxMzYsMCw1MywxNzMsMTI4LDEsMTY4LDE0MywKKwk4LDEyOCwyLDUyLDAsMCwwLDE2NSwyLDAsMiwxNjUsCisJOCwwLDAsMTczLDEyLDAsMCwxNjUsMTM2LDEsMTY5LDE0MywKKwk4LDAsMiwzNiwyLDAsMzQsMTY1LDQsMCw0MCwxNDEsCisJMTI4LDEsMTY5LDE0MywxMzYsMSwxNjgsMTc1LDQsMCw0MSwxNDEsCisJNjQsMSwxNjgsMTQzLDEyOCwxLDE2OSwxNzUsMTIwLDAsOSwxNzMsCisJMTM2LDEsMTY5LDE0MywwLDAsMCwwLDEyNCwwLDksMTczLAorCTg4LDEsMTY4LDE0Myw0OCwxLDE2OSwxNDMsMSwwLDgsMzcsCisJNDIsMTYsOSwxLDkxLDI1NSw2NCwyMCw4OCwxLDE2OCwxNzUsCisJNjQsMSwxNjgsMTQzLDAsMCwwLDAsNDQsMCwzLDE0MSwKKwkwLDAsMCwwLDEyLDAsOTgsMTQwLDAsMCwwLDAsCisJNSwwLDY0LDE2LDAsMCwwLDAsMTIsMCwxMDEsMTQwLAorCTIsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLDIxMiwxNDEsMTMyLDM2LAorCTY0LDEsMTY5LDE0MywwLDAsMCwwLDQ0LDAsMzUsMTQxLAorCTAsMCwwLDAsMTYsMCw5OCwxNDAsMCwwLDAsMCwKKwk1LDAsNjQsMTYsMCwwLDAsMCwxNiwwLDEwMSwxNDAsCisJMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsMjQwLDE0MSwxMzIsMzYsCisJNjQsMSwxNjgsMTQzLDAsMCwwLDAsNDQsMCwzLDE0MSwKKwkwLDAsMCwwLDMyLDAsOTgsMTQwLDAsMCwwLDAsCisJNSwwLDY0LDE2LDAsMCwwLDAsMzIsMCwxMDEsMTQwLAorCTIsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLDE2LDE0MiwxMzIsMzYsCisJNjQsMSwxNjksMTQzLDAsMCwwLDAsNDQsMCwzNSwxNDEsCisJMCwwLDAsMCwyNCwwLDk4LDE0MCwwLDAsMCwwLAorCTUsMCw2NCwxNiwwLDAsMCwwLDI0LDAsMTAxLDE0MCwKKwkyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiw0OCwxNDIsMTMyLDM2LAorCTE5NiwxLDE5MSwxNDMsMTkyLDEsMTkwLDE0MywxODgsMSwxODMsMTQzLAorCTE4NCwxLDE4MiwxNDMsMTgwLDEsMTgxLDE0MywxNzYsMSwxODAsMTQzLAorCTE3MiwxLDE3OSwxNDMsMTY4LDEsMTc4LDE0MywxNjQsMSwxNzcsMTQzLAorCTE2MCwxLDE3NiwxNDMsOCwwLDIyNCwzLDIwMCwxLDE4OSwzOSwKKwkyMjQsMjU1LDE4OSwzOSwxNiwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLAorCTI0LDAsMTkxLDE3NSwyMCwwLDE3NywxNzUsNDQsMCw0LDE0MiwKKwkwLDAsMCwwLDAsMCwxMzAsMTQ4LDAsMCwwLDAsCisJMCwzMiw2Niw0OCw3LDAsNjQsMjAsMzMsMTM2LDE2MCwwLAorCTAsMCwxMzMsMTQ4LDIsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLAorCTgwLDE0MiwxMzIsMzYsMTU2LDMxLDE5Miw4LDMsMCwyLDM2LAorCTIsMCwxMzIsMzYsMzMsNDAsMCwwLDMzLDQ4LDAsMCwKKwkxMjksNjcsMTkyLDEyLDMzLDU2LDMyLDIsMTMsMCw2NCwxNiwKKwkzMyw0MCwwLDAsNDQsMCwzLDE0MiwwLDMzLDIsMzYsCisJMiwwLDk4LDE2NCw4LDAsMiwxNDIsMzMsNDgsMCwwLAorCTAsMCw2NCwxNzIsNDQsMCw0LDE0MiwzMyw1NiwzMiwyLAorCTEyOSw2NywxOTIsMTIsMiwwLDEzMiwzNiw5LDAsNjQsMjAsCisJMCwzMiw1LDM2LDQ0LDAsMiwxNDIsMCwwLDAsMCwKKwkyLDAsNjksMTQ4LDIsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLAorCTEwOCwxNDIsMTMyLDM2LDE1NiwzMSwxOTIsOCwxLDAsMiwzNiwKKwk0NCwwLDQsMTQyLDAsMzIsNiwzNiwxMjksNjcsMTkyLDEyLAorCTMzLDU2LDMyLDIsOCwwLDY0LDIwLDMzLDE2LDAsMCwKKwk0NCwwLDIsMTQyLDAsMCwwLDAsMCwwLDY5LDE0OCwKKwkyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwxMzIsMTQyLDEzMiwzNiwKKwkyLDAsMiwzNiwyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMzIsMCwxODksMzksCisJMjI0LDI1NSwxODksMzksMjQsMCwxNzgsMTc1LDMzLDE0NCwxNjAsMCwKKwkyOCwwLDE5MSwxNzUsMjAsMCwxNzcsMTc1LDcsMCwxMjgsNCwKKwkxNiwwLDE3NiwxNzUsMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwkyNTUsMjU1LDY2LDM2LDQyLDE2LDY4LDAsNCwwLDY0LDE2LAorCTMzLDEzNiwxMjgsMCwyNCwxMzMsMTMwLDE0MywzMywzMiwwLDAsCisJMjU1LDI1NSw4MSwzNiwzMywxMjgsMTI4LDAsNDIsMTYsNDgsMiwKKwk3LDAsNjQsMjAsMzMsMzIsMCwyLDE5MywzMSwxOTIsMTIsCisJMzMsNDAsNjQsMiwxLDAsMTYsMzgsNDIsMTYsNDgsMiwKKwkyNTEsMjU1LDY0LDE2LDMzLDMyLDAsMiwyOCwwLDE5MSwxNDMsCisJMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDMyLDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDIzMiwyNTUsMTg5LDM5LDE2LDAsMTkxLDE3NSwKKwkyMzYsNjMsMTkyLDEyLDEsMTYsNCwzNiw4NSwwLDIsMzYsCisJMTMxLDEzMSwxLDYwLDEyOCwxOCwzNCwxNjAsMTYsMCwxOTEsMTQzLAorCTI0LDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTIxNiwyNTUsMTg5LDM5LDI4LDAsMTc3LDE3NSwzMywxMzYsMTI4LDAsCisJMzIsMCwxNzgsMTc1LDMzLDE0NCwxNjAsMCwyMTIsMTI4LDEzMiwzOSwKKwkzNiwwLDE5MSwxNzUsMTUsNjMsMTkyLDEyLDI0LDAsMTc2LDE3NSwKKwk5LDAsNjQsMjYsMzMsMTI4LDAsMCwwLDAsMzcsMTQ2LAorCTEsMCw0OSwzOCwyMjAsMTI4LDEzMiwzOSwxNSw2MywxOTIsMTIsCisJMSwwLDE2LDM4LDQyLDE2LDE4LDIsMjQ5LDI1NSw2NCwyMCwKKwkwLDAsMCwwLDIyOCwxMjgsMTMyLDM5LDE1LDYzLDE5MiwxMiwKKwkwLDAsMCwwLDM2LDAsMTkxLDE0MywzMiwwLDE3OCwxNDMsCisJMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDAsMCwxODksMzksNDgsMjU1LDE4OSwzOSwzMyw1NiwxMjgsMCwKKwkxOTIsMCwxNzgsMTc1LDMzLDE0NCwxNjAsMCwyMDAsMCwxODAsMTc1LAorCTMzLDE2MCwxOTIsMCwyNTUsMjU1LDIyNiwzNiw2LDAsNjYsNDQsCisJMjA0LDAsMTkxLDE3NSwxOTYsMCwxNzksMTc1LDE4OCwwLDE3NywxNzUsCisJMiwwLDY0LDIwLDE4NCwwLDE3NiwxNzUsMSwwLDcsMzYsCisJMiwwLDY0LDMwLDAsMCwwLDAsMSwwLDE4LDM2LAorCTIsMCwxMjgsMzAsNjQsMTgsNywwLDYwLDAsMjAsMzYsCisJMiwxMzEsMyw2MCwxOTIsMjQ2LDk5LDM2LDMzLDEzNiw2NywwLAorCTQsMCwzNCwxNDIsMCwwLDAsMCw0LDAsNjQsMjAsCisJMzMsMTUyLDY0LDIsMSwwLDQsMzYsMTMzLDI5LDE5MiwxMiwKKwkzMyw0MCwyMjQsMCwyNTUsMzEsNCw2MCwyNTUsMjU1LDEzMiw1MiwKKwkwLDEyOCwxMzMsNTQsMTIwLDAsMTYyLDM5LDM2LDE2LDY4LDAsCisJMCwxNjAsMyw2MCwzNywxNiw2NywwLDEwNCwwLDE2NSwxNzUsCisJMTA4LDAsMTYwLDE3NSwxMTIsMCwxNjIsMTc1LDEyLDAsMiwzNiwKKwk4MCwwLDE2MCwxNjcsODIsMCwxNjIsMTY3LDgwLDAsMTYyLDM5LAorCTM2LDE2LDY4LDAsMzcsMTI4LDY3LDAsMTA0LDAsMTYyLDM5LAorCTM2LDE2LDY4LDAsMjMyLDEyOCwxMzIsMTQzLDM3LDE2LDY3LDAsCisJODQsMCwxNzYsMTc1LDg4LDAsMTYyLDE3NSw5MiwwLDE2MCwxNzUsCisJNSwwLDEyOCwxNiw0LDAsMiwzNiw4MiwwLDE2MiwxNjcsCisJMjU1LDI1NSwyLDM2LDkyLDAsMTY1LDE3NSw4OCwwLDE2MiwxNzUsCisJNDQsMCwzNCwxNDIsMCwwLDAsMCwwLDAsNjYsMTQ4LAorCTAsMCwwLDAsMCwzMiw2Niw0OCw3LDAsNjQsMjAsCisJMzMsNDAsMCwwLDI1NSwyNTUsNCwzNiwyLDEzMSw1LDYwLAorCTE4NCwxNDIsMTY1LDM2LDE4OCw3LDE5MiwxMiwyMDgsMSw2LDM2LAorCTMzLDQwLDAsMCw0NCwwLDM0LDE0MiwzMyw0OCwwLDAsCisJNCwwLDgwLDE3Miw0NCwwLDM2LDE0MiwyMDgsNyw3LDM2LAorCTEyOSw2NywxOTIsMTIsMiwwLDEzMiwzNiwxMiwwLDY0LDIwLAorCTAsMCwwLDAsNDQsMCwzNCwxNDIsMCwwLDAsMCwKKwkyLDAsNjksMTQ4LDIsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLAorCTEwOCwxNDIsMTMyLDM2LDI1NSwyNTUsNCwzNiwyLDEzMSw1LDYwLAorCTE4NCwxNDIsMTY1LDM2LDE4OCw3LDE5MiwxMiwyMTYsMSw2LDM2LAorCTM0LDExLDE5MiwxMiwxLDAsNCwzNiwwLDE2MywxNiw2MCwKKwk0LDEsMTYsMTQyLDAsMTYzLDIsNjAsNCwxLDY2LDE0MCwKKwkwLDAsMCwwLDI1MiwyNTUsMiwxOCwwLDMzLDMsMzYsCisJNDQsMCwzNCwxNDIsMCwwLDAsMCwyLDAsNjcsMTY0LAorCTgsMCwzNCwxNDIsMCwwLDAsMCwwLDAsNjQsMTcyLAorCTAsMTYzLDE2LDYwLDQsMSwxNiwxNDIsNDQsMCwzNiwxNDIsCisJMCwwLDAsMCw0LDAsMTMwLDE0MCwwLDAsMCwwLAorCTAsMCw2NiwxNDgsMCwwLDAsMCwwLDEyOCw2Niw0OCwKKwkxMCwwLDY0LDIwLDAsMCwwLDAsNDQsMCwzNSwxNDIsCisJMCwwLDAsMCw0LDAsOTgsMTQwLDAsMCwwLDAsCisJMCwwLDY2LDE0OCwwLDAsMCwwLDAsMTI4LDY2LDQ4LAorCTI1MCwyNTUsNjQsMTYsMCwwLDAsMCwyNTUsMjU1LDExNSwzOCwKKwkxOSwwLDk2LDE4LDMzLDQwLDY0LDIsNDQsMCwzNSwxNDIsCisJMCwwLDAsMCw0LDAsOTgsMTQwLDAsMCwwLDAsCisJMCwwLDY2LDE0OCwwLDAsMCwwLDAsMTI4LDY2LDQ4LAorCTIyOSwyNTUsNjQsMTYsMCwwLDAsMCw0LDAsOTgsMTQwLAorCTAsMCwwLDAsMCwwLDY2LDE0OCwwLDAsMCwwLAorCTAsMTI4LDY2LDQ4LDI1MCwyNTUsNjQsMjAsMCwwLDAsMCwKKwk4OSwzMiwxOTIsOCwwLDAsMCwwLDIsMTMxLDQsNjAsCisJMjAwLDE0MiwxMzIsMzYsMzMsNDgsMTI4LDIsMCwxNjMsMyw2MCwKKwk0LDEsOTksMTQwLDAsMTI4LDIsNTIsODIsMCwxNjIsMTY3LAorCTM1LDEyOCwxMTIsMCwxNSw2MywxOTIsMTIsMzMsNTYsMCwyLAorCTE5LDAsMCwxOCw2NCw0MSwxOCwwLDM1LDQwLDE3OCwwLAorCTEyOCw0MCw1LDAsMzMsNDAsMTc4LDAsMTkyLDQwLDUsMCwKKwkyNiwwLDE3NiwwLDIsMCwwLDIyLDAsMCwwLDAsCisJMTMsMCw3LDAsMjU1LDI1NSwxLDM2LDQsMCwxLDIyLAorCTAsMTI4LDEsNjAsMiwwLDE2MSwyMCwwLDAsMCwwLAorCTEzLDAsNiwwLDE4LDQwLDAsMCwyMzYsMTI4LDEzMiwzOSwKKwkxNSw2MywxOTIsMTIsMCwwLDAsMCwyMDQsMCwxOTEsMTQzLAorCTIwMCwwLDE4MCwxNDMsMTk2LDAsMTc5LDE0MywxOTIsMCwxNzgsMTQzLAorCTE4OCwwLDE3NywxNDMsMTg0LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMjA4LDAsMTg5LDM5LDIyNCwyNTUsMTg5LDM5LDIwLDAsMTc3LDE3NSwKKwkzMywxMzYsMTI4LDAsMjQsMCwxOTEsMTc1LDE4MCwxMCwxOTIsMTIsCisJMTYsMCwxNzYsMTc1LDM0LDExLDE5MiwxMiwxLDAsNCwzNiwKKwkxNiwxMzMsMTMyLDE0MywwLDE2MywxNiw2MCw0LDEsMTYsMTQyLAorCTE5Myw2MywxOTIsMTIsMCwwLDAsMCwwLDE2MywyLDYwLAorCTQsMSw2NiwxNDAsMCwwLDAsMCwzNSw0MCw4MCwwLAorCTczLDI1MiwxNjIsMzYsOTksMCw2Niw0NCw0LDAsNjQsMTYsCisJMCwwLDAsMCwyLDEzMSw0LDYwLDE5NiwzMiwxOTIsOCwKKwkwLDE0MywxMzIsMzYsNSwwLDE2MCwyMCwwLDAsMCwwLAorCTIsMTMxLDQsNjAsMzYsMTQzLDEzMiwzNiwxOTYsMzIsMTkyLDgsCisJMzMsNDAsMCwwLDIsMTMxLDQsNjAsNzYsMTQzLDEzMiwzNiwKKwkxNSw2MywxOTIsMTIsMSwwLDE2LDM2LDMsMCw0OCwxOCwKKwkwLDAsMCwwLDM0LDExLDE5MiwxMiwzMywzMiwwLDAsCisJMCwxMjksMTQ0LDE3NSwyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMzIsMCwxODksMzksCisJMjAwLDI1NSwxODksMzksMzIsMCwxNzgsMTc1LDMzLDE0NCwxMjgsMCwKKwkzMyw0OCw2NCwyLDQ0LDAsMTgxLDE3NSwxLDEzMSwyMSw2MCwKKwk2MCwyNTIsMTgxLDM4LDMzLDU2LDE2MCwyLDQwLDAsMTgwLDE3NSwKKwkyLDEzMSwyMCw2MCwxNDQsMTQzLDE0OCwzOCwzNiwwLDE3OSwxNzUsCisJMCwxNjMsMTksNjAsMTIwLDEsMTE1LDE0MiwwLDE2MywzLDYwLAorCTEyMCwxLDk5LDE0MCwzMiwxMzEsMiw2MCw0OCwwLDE5MSwxNzUsCisJMjgsMCwxNzcsMTc1LDI0LDAsMTc2LDE3NSwxNiwwLDE4MCwxNzUsCisJMzMsMzIsOTYsMiwzNSwxMzYsNjcsMCw4NCw2NCwxOTIsMTIsCisJMzMsNDAsMzIsMiwzLDAsNjQsMTgsMzMsMTI4LDY0LDAsCisJMTAsMCwwLDIyLDAsMCwwLDAsMTYsMCwxODAsMTc1LAorCTMzLDMyLDk2LDIsMzMsNDAsMzIsMiwzMyw0OCw2NCwyLAorCTI0NCw2MywxOTIsMTIsMzMsNTYsMTYwLDIsMzMsMTI4LDIsMiwKKwk1LDAsMCwxOCwzMyw0MCw5NiwyLDIsMTMxLDQsNjAsCisJMTY4LDE0MywxMzIsMzYsMjUyLDMyLDE5Miw4LDMzLDQwLDk2LDIsCisJMiwxMzEsNCw2MCwyMDQsMTQzLDEzMiwzNiwxNSw2MywxOTIsMTIsCisJMzMsNDgsMTc3LDAsNDgsMCwxOTEsMTQzLDQ0LDAsMTgxLDE0MywKKwk0MCwwLDE4MCwxNDMsMzYsMCwxNzksMTQzLDMyLDAsMTc4LDE0MywKKwkyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk1NiwwLDE4OSwzOSwwLDE2MywxLDYwLDIzMiw1LDM2LDE3MiwKKwkwLDE2MywxLDYwLDgsMCwyMjQsMywyMzYsNSwzNywxNzIsCisJMjgsMTI5LDEzMiwxNzUsOCwwLDIyNCwzLDAsMCwwLDAsCisJMTYsMTI5LDEzMiwxNzUsOCwwLDIyNCwzLDAsMCwwLDAsCisJMTUsMCwxMzIsNDgsMjAsMTI5LDEzMiwxNzUsOCwwLDIyNCwzLAorCTAsMCwwLDAsMjQsMTI5LDEzMiwxNzUsOCwwLDIyNCwzLAorCTAsMCwwLDAsMzIsMTI5LDEzMiwxNzUsOCwwLDIyNCwzLAorCTAsMCwwLDAsMzMsNzIsMTI4LDAsMzMsODAsMTYwLDAsCisJMzMsODgsMTkyLDAsNywxNjIsNCw2MCw0OCwxLDEzMiw1MiwKKwk3LDE2Miw4LDYwLDAsMSw4LDUzLDIwLDEyOSwxMzAsMTQzLAorCTI0LDEyOSwxMzEsMTQzLDEyOCw0OCwyLDAsMjgsMTI5LDEzMCwxNDMsCisJMywwLDE5Nyw1MiwyLDAsOTYsMTYsMCwwLDEzMCwxNzIsCisJNjcsMCwxOTcsNTIsMTYsMTI5LDEzMCwxNDMsMCwwLDAsMCwKKwkyLDAsNjQsMTYsMzMsMjQsMTYwLDAsMCwxLDk5LDUyLAorCTM2LDEyOSwxMzAsMTQzLDAsMCwwLDAsMiwwLDY0LDE2LAorCTAsMCwwLDAsMCw0LDk5LDUyLDMyLDEyOSwxMzAsMTQzLAorCTAsMCwzLDE3MywzLDAsNjQsMTYsNywxNjIsNSw2MCwKKwkwLDAsMiwxNzMsNywxNjIsNSw2MCw0LDEsMTY1LDUyLAorCTcsMTYyLDYsNjAsOCwxLDE5OCw1MiwyNTUsMCwyLDYwLAorCTI1NSwyNTUsNjYsNTIsNywxNjIsMyw2MCwxMiwxLDk5LDUyLAorCTcsMTYyLDQsNjAsMTYsMSwxMzIsNTIsMzYsMTYsNjYsMSwKKwkwLDAsMTY5LDE3MiwwLDAsMTk0LDE3Miw0MywxNiw3LDAsCisJMTkyLDE2LDIsMCwwLDAsMTA3LDE3Miw4LDAsMjI0LDMsCisJMCwwLDEzMCwxNzIsNywxNjIsMyw2MCw0MCwxLDk5LDUyLAorCTMsMCwyLDM2LDAsMTYzLDEsNjAsMjAsMSwzMiwxNzIsCisJOCwwLDIyNCwzLDAsMCw5OCwxNzIsMjMyLDI1NSwxODksMzksCisJMTYsMCwxOTEsMTc1LDMzLDI0LDAsMCw3LDE2Miw2LDYwLAorCTQwLDEsMTk4LDUyLDE1LDAsNCw2MCw2Myw2NiwxMzIsNTIsCisJMCwwLDE5NywxNDAsMCwwLDAsMCwxNiwwLDE2Miw0OCwKKwk3LDAsNjQsMjAsMSwwLDk5LDM2LDQyLDE2LDEzMSwwLAorCTI0OSwyNTUsNjQsMTYsMCwwLDAsMCwyLDEzMSw0LDYwLAorCTEyMiwzMywxOTIsOCwyNDAsMTQzLDEzMiwzNiwzNiwxMjksMTMwLDE0MywKKwkwLDAsMCwwLDMsMCw2NCwyMCwzMywyNCwwLDAsCisJMTI1LDMzLDE5Miw4LDMzLDE2LDAsMCwxLDAsNSwzNiwKKwkxNSwwLDQsNjAsNjMsNjYsMTMyLDUyLDAsMTYzLDIsNjAsCisJMjAsMSw2NiwxNDAsMCwwLDAsMCwyNDcsMjU1LDY5LDE2LAorCTEsMCw5OSwzNiw0MiwxNiwxMzEsMCwyNDksMjU1LDY0LDE2LAorCTAsMCwwLDAsMCwxNjMsNSw2MCwyMCwxLDE2NSwxNDAsCisJMiwxMzEsNCw2MCwyNCwxNDQsMTMyLDM2LDE1LDYzLDE5MiwxMiwKKwkwLDAsMCwwLDEsMCwyLDM2LDE2LDAsMTkxLDE0MywKKwkyNCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkyMjQsMjU1LDE4OSwzOSwyNCwwLDE5MSwxNzUsMzMsNzIsMTkyLDAsCisJMjU1LDMxLDMsNjAsMjU1LDI1NSw5OSw1MiwzMyw2NCwwLDAsCisJMzYsMzIsMTMxLDAsMCwxNjAsMiw2MCwzNywzMiwxMzAsMCwKKwkzNiw0MCwxNjMsMCwxNiwwLDMyLDI1LDM3LDQwLDE2MiwwLAorCTAsMCwxMzQsMTQ0LDAsMCwxNjcsMTQ0LDAsMCwwLDAsCisJNywwLDE5OSwxNiwxLDAsMTY1LDM2LDIsMTMxLDQsNjAsCisJNzIsMTQ0LDEzMiwzNiwxNSw2MywxOTIsMTIsMzMsNDAsMCwxLAorCTE1NywzMywxOTIsOCwxLDAsMiwzNiwxLDAsOCwzNywKKwk0MiwxNiw5LDEsMjQyLDI1NSw2NCwyMCwxLDAsMTMyLDM2LAorCTMzLDE2LDAsMCwyNCwwLDE5MSwxNDMsMzIsMCwxODksMzksCisJOCwwLDIyNCwzLDAsMCwwLDAsMCwxNjMsMiw2MCwKKwkyMzIsNSw2NiwxNDAsMTUyLDI1NSwxODksMzksODAsMCwxODAsMTc1LAorCTEyMCwwLDE4MCwxNDMsNjQsMCwxNzYsMTc1LDMzLDEyOCwxNjAsMCwKKwk2OCwwLDE3NywxNzUsMzMsMTM2LDE5MiwwLDcyLDAsMTc4LDE3NSwKKwkzMywxNDQsMjI0LDAsMTAwLDAsMTkxLDE3NSw5NiwwLDE5MCwxNzUsCisJOTIsMCwxODMsMTc1LDg4LDAsMTgyLDE3NSw4NCwwLDE4MSwxNzUsCisJNzYsMCwxNzksMTc1LDEyLDAsNjQsMTYsMTYsMCwxNjQsMTc1LAorCTAsMTYzLDIsNjAsMjM2LDUsNjYsMTQwLDAsMCwwLDAsCisJNywwLDY0LDE2LDAsMCwwLDAsMCwxNjMsMiw2MCwKKwkyMzYsNSw2NiwxNDAsMCwwLDAsMCwxLDgsNjYsNDQsCisJMTAsMCw2NCwyMCwxNiwwLDIsNjAsMCwxNjMsNSw2MCwKKwkyMzIsNSwxNjUsMTQwLDAsMTYzLDYsNjAsMjM2LDUsMTk4LDE0MCwKKwkyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwxMjQsMTQ0LDEzMiwzNiwKKwk3LDM1LDE5Miw4LDAsMCwwLDAsMTYsMCwxNjgsMTQzLAorCTAsMCwwLDAsNDMsMTYsNzIsMCw2LDAsNjQsMTYsCisJMCwwLDAsMCwyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwKKwkxNzIsMTQ0LDEzMiwzNiw3LDM1LDE5Miw4LDAsMCwwLDAsCisJMjI0LDEzMiwxMzAsMTQzLDAsMCwwLDAsMTEsMCw2NCwyMCwKKwkwLDAsMCwwLDAsMTYzLDQsNjAsMjM2LDUsMTMyLDE0MCwKKwkxMyw4LDE5MiwxMiwwLDAsMCwwLDI1NSwzMSwzLDYwLAorCTI1NSwyNTUsOTksNTIsMzYsMTYsNjcsMCwwLDE2MCwzLDYwLAorCTM3LDE2LDY3LDAsMjI0LDEzMiwxMzAsMTc1LDIyOCwxMzIsMTMwLDE0MywKKwkwLDAsMCwwLDExLDAsNjQsMjAsMCwwLDAsMCwKKwkwLDE2Myw0LDYwLDIzNiw1LDEzMiwxNDAsMTMsOCwxOTIsMTIsCisJMCwwLDAsMCwyNTUsMzEsMyw2MCwyNTUsMjU1LDk5LDUyLAorCTM2LDE2LDY3LDAsMCwxNjAsMyw2MCwzNywxNiw2NywwLAorCTIyOCwxMzIsMTMwLDE3NSwyMjQsMTMyLDEzMywxNDMsMCwxNjMsNiw2MCwKKwkyMzIsNSwxOTgsMTQwLDIyOCwxMzIsMTM1LDE0MywyLDEzMSw0LDYwLAorCTE1LDYzLDE5MiwxMiwyMDgsMTQ0LDEzMiwzNiwxNiwxMjksMTMzLDE0MywKKwkyMCwxMjksMTM0LDE0MywyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwKKwk4LDE0NSwxMzIsMzYsNywxNjIsMiw2MCwyMzIsMCw2Niw1MiwKKwkwLDAsODMsMTQwLDEsMCwzLDEzMCwxMDUsMCwyLDM2LAorCTcsMCw5OCwyMCwyNTEsMjU1LDIsNjAsMSwwLDIsMzYsCisJMzYsMTI5LDEzMCwxNzUsNCwwLDIsNjAsMCw4LDY2LDUyLAorCTEwLDM0LDE5Miw4LDM3LDE1Miw5OCwyLDM2LDEyOSwxMjgsMTc1LAorCTI1NSwyNDcsNjYsNTIsMzYsMTUyLDk4LDIsNywxNjIsMiw2MCwKKwkyMzIsMCw2Niw1MiwwLDAsODMsMTcyLDAsMCw1LDEzMCwKKwkxMTQsMCwyLDM2LDMsMCwxNjIsMTYsODIsMCwyLDM2LAorCTMsMCwxNjIsMjAsMTE5LDAsMiwzNiw0MiwzNCwxOTIsOCwKKwkzMywxNzYsMCwwLDMsMCwxNjIsMTYsODcsMCwyLDM2LAorCTMsMCwxNjIsMjAsMTA4LDAsMiwzNiw0MiwzNCwxOTIsOCwKKwkxLDAsMjIsMzYsMywwLDE2MiwxNiw3NiwwLDIsMzYsCisJMywwLDE2MiwyMCwxMTYsMCwyLDM2LDQyLDM0LDE5Miw4LAorCTIsMCwyMiwzNiwxMTgsMCwxNjIsMTYsODQsMCwyLDM2LAorCTExNiwwLDE2MiwxNiwwLDAsMCwwLDIsMTMxLDQsNjAsCisJMTUsNjMsMTkyLDEyLDUyLDE0NSwxMzIsMzYsNywzNSwxOTIsOCwKKwkwLDAsMCwwLDAsMCwzOCwxMzAsMCwwLDAsMCwKKwkxMiwwLDE5MiwxNiw5OSwwLDIsMzYsMywwLDE5NCwxNiwKKwk2NywwLDIsMzYsNCwwLDE5NCwyMCwzMywxNTIsMCwwLAorCTUsMCwxOSwzNiw2MSwzNCwxOTIsOCw1LDAsMjEsMzYsCisJMiwxMzEsMSw2MCw4MCwxNTUsNTAsMTYwLDYxLDM0LDE5Miw4LAorCTMzLDE2OCwwLDAsMzMsMTY4LDAsMCw1LDAsMTksMzYsCisJMiwxMzEsMSw2MCw4MCwxNTUsMzIsMTYwLDE2LDAsMTY4LDE0MywKKwkwLDE2MywxOCw2MCwyMzYsNSw4MiwxNDIsMCwwLDAsMCwKKwkxOTcsMCwwLDE3LDI1NSwyNTUsMjAsMzcsMjU1LDI1NSwxOTQsMzgsCisJMiwwLDg3LDQ0LDIsMCwzMCwzNiwzMywxMjgsMTYwLDIsCisJNDIsMTYsMTEyLDIsNzMsMCw2NCwyMCwwLDAsMCwwLAorCTQyLDAsMjI0LDE4LDUsMCwyLDM2LDEzLDAsMiwyMiwKKwkwLDAsMCwwLDI1LDAsNjQsMjYsMzMsMTM2LDAsMCwKKwkyMjQsMTMyLDEzMCwxNDMsMCwwLDAsMCwzMywxNiw4MSwwLAorCTAsMCw4MSwxNjAsMSwwLDQ5LDM4LDQyLDE2LDUwLDIsCisJMjQ5LDI1NSw2NCwyMCwzMyw0OCw2NCwyLDEwNSwzNCwxOTIsOCwKKwkwLDAsMCwwLDIsMTMxLDMsNjAsMzMsMjQsMTEyLDAsCisJODAsMTU1LDk5LDE0NCwwLDAsMCwwLDksMCw2NCwyNiwKKwkzMywxMzYsMCwwLDIyNCwxMzIsMTMwLDE0MywwLDAsMCwwLAorCTMzLDE2LDgxLDAsMSwwLDQ5LDM4LDAsMCw2NywxNjAsCisJNDIsMTYsNTAsMiwyNDksMjU1LDY0LDIwLDAsMCwwLDAsCisJMzMsNDgsNjQsMiwwLDE2Myw0LDYwLDIzMiw1LDEzMiwxNDAsCisJMjI0LDEzMiwxMzMsMTQzLDAsMCwwLDAsMjgsMzMsMTkyLDEyLAorCTEsMCw3LDM2LDc2LDMzLDE5MiwxMiwwLDAsMCwwLAorCTgzLDMzLDE5MiwxMiwwLDAsMCwwLDE0NywwLDY0LDIwLAorCTAsMCwwLDAsMywwLDE5MiwxOCwzMyw0OCw2NCwyLAorCTIyLDAsMjIyLDIyLDAsMCwwLDAsMCwxNjMsNCw2MCwKKwkyMzIsNSwxMzIsMTQwLDIyOCwxMzIsMTMzLDE0MywwLDAsMCwwLAorCTI4LDMzLDE5MiwxMiwzMyw1NiwwLDAsNzYsMzMsMTkyLDEyLAorCTAsMCwwLDAsODMsMzMsMTkyLDEyLDAsMCwwLDAsCisJMTMxLDAsNjQsMjAsMCwwLDAsMCw4LDAsMjIyLDIyLAorCTAsMCwwLDAsMjI0LDEzMiwxMzIsMTQzLDIyOCwxMzIsMTMzLDE0MywKKwkwLDAsMCwwLDEyOSwzMywxOTIsMTIsMzMsNDgsNjQsMiwKKwkxMjIsMCw2NCwyMCwwLDAsMCwwLDEsMCwxNiwzOCwKKwk0MiwxNiwxMTIsMiwxODUsMjU1LDY0LDE2LDAsMCwwLDAsCisJMjU1LDI1NSwxNDgsMzgsMjU1LDI1NSwyLDM2LDE3OCwyNTUsMTMwLDIyLAorCTMzLDEyOCwxNjAsMiw3LDM1LDE5Miw4LDAsMCwwLDAsCisJMTgwLDEwLDE5MiwxMiwwLDAsMCwwLDM0LDExLDE5MiwxMiwKKwkxLDAsNCwzNiwwLDAsMzQsMTMwLDAsMCwwLDAsCisJNiwwLDY0LDE2LDMzLDE4NCwwLDAsMjQsMCwxNjAsMTc1LAorCTIsMTMxLDEsNjAsODgsMTU1LDUyLDE2NCwxNzEsMzQsMTkyLDgsCisJMzMsMTc2LDAsMCw2LDAsMjMsMzYsNCwwLDIsMzYsCisJMjQsMCwxNjAsMTc1LDIsMTMxLDEsNjAsODgsMTU1LDM0LDE2NCwKKwkzMywxNzYsMCwwLDAsOCwzMCwzNiwyNCwwLDE3NywxNDMsCisJMCwwLDAsMCw0MiwxNiwyNDEsMiw4MywwLDY0LDIwLAorCTY0LDE2LDE3LDAsMiwxMzEsOCw2MCw4OCwxNTUsOCwzNywKKwkzMywxNjgsNzIsMCwwLDAsMTc4LDE1MCwwLDAsMCwwLAorCTI2LDAsMjEwLDMsMiwwLDY0LDIyLDAsMCwwLDAsCisJMTMsMCw3LDAsMjU1LDI1NSwxLDM2LDQsMCw2NSwyMiwKKwkwLDEyOCwxLDYwLDIsMCwxOTMsMjMsMCwwLDAsMCwKKwkxMywwLDYsMCwxOCwxNiwwLDAsMTYsMCwxNjgsMTQzLAorCTAsMCwwLDAsMjQsMCw3MiwwLDMzLDU2LDE5MiwyLAorCTMzLDEyOCwwLDAsMCwxNjMsMTksNjAsNCwxLDExNSwxNDIsCisJMCwxNjMsNCw2MCwyMzIsNSwxMzIsMTQwLDIyNCwxMzIsMTMzLDE0MywKKwkxOCwxNjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkyOCwzMywxOTIsMTIsMzMsNDgsNjQsMiwxMCwwLDEyOCwyNiwKKwkwLDAsMCwwLDc2LDMzLDE5MiwxMiwwLDAsMCwwLAorCTgzLDMzLDE5MiwxMiwwLDAsMCwwLDQ4LDAsNjQsMjAsCisJMSwwLDE2LDM4LDQyLDE2LDIwLDIsMjQ4LDI1NSw2NCwyMCwKKwkwLDAsMCwwLDIsMTMxLDUsNjAsMTQwLDE0NSwxNjUsMzYsCisJMCwxNjMsMTYsNjAsNCwxLDE2LDE0MiwzLDAsMTkyLDE4LAorCTAsMCwwLDAsMiwxMzEsNSw2MCwxMjgsMTQ1LDE2NSwzNiwKKwkyLDEzMSw0LDYwLDk2LDE0NSwxMzIsMzYsMTUsNjMsMTkyLDEyLAorCTMzLDQ4LDY0LDIsMTksMCwxOSwxOCwyNCwwLDE0NiwyLAorCTE4LDI0LDAsMCwzNSwxNiwxOSwyLDAsMCwwLDAsCisJMjcsMCw5OCwwLDIsMCw2NCwyMCwwLDAsMCwwLAorCTEzLDAsNywwLDE4LDE2LDAsMCwyLDEzMSw0LDYwLAorCTE1MiwxNDUsMTMyLDM2LDY0LDQxLDIsMCwzNSw0MCwxNjIsMCwKKwkxMjgsNDAsNSwwLDMzLDQwLDE2MiwwLDE1LDYzLDE5MiwxMiwKKwkxOTIsNDAsNSwwLDI1NSwzNCwxOTIsOCwyLDAsMTgxLDM4LAorCTIsMTMxLDQsNjAsMTY4LDE0NSwxMzIsMzYsMTUsNjMsMTkyLDEyLAorCTIsMCwxODEsMzgsMSwwLDQ5LDM4LDQyLDE2LDI0MSwyLAorCTE3OCwyNTUsNjQsMTYsMCwwLDAsMCwxLDAsMjE0LDM4LAorCTIsMCwxOTQsNDIsMTY2LDI1NSw2NCwyMCwwLDAsMCwwLAorCTEwMCwwLDE5MSwxNDMsOTYsMCwxOTAsMTQzLDkyLDAsMTgzLDE0MywKKwk4OCwwLDE4MiwxNDMsODQsMCwxODEsMTQzLDgwLDAsMTgwLDE0MywKKwk3NiwwLDE3OSwxNDMsNzIsMCwxNzgsMTQzLDY4LDAsMTc3LDE0MywKKwk2NCwwLDE3NiwxNDMsOCwwLDIyNCwzLDEwNCwwLDE4OSwzOSwKKwkwLDAsMCwwLDQzLDE2LDEzNCwwLDAsMCwxNjQsMTc1LAorCTQsMCwxNjUsMTc1LDgsMCwxNjYsMTc1LDcsMCw2NCwyMCwKKwkxMiwwLDE2NywxNzUsNDMsMTYsMTk2LDAsNSwwLDY0LDIwLAorCTEsMCwyLDM2LDQzLDE2LDE2NywwLDIsMCw2NCwxNiwKKwk0MywxNiwyMjksMCwyNTUsMjU1LDIsMzYsOCwwLDIyNCwzLAorCTAsMCwwLDAsMjMyLDI1NSwxODksMzksMywxMzEsNCw2MCwKKwkyMDgsMTIsMTMyLDM2LDE3MCwwLDUsMzYsMTYsMCwxOTEsMTc1LAorCTE0NCw3MSwxOTIsMTIsNjAsMCw2LDM2LDIsMTMxLDYsNjAsCisJMTEyLDE1NSwxOTgsMzYsMiwxMzEsMiw2MCwyMTIsMjQ2LDY2LDE0MCwKKwkyLDEzMSwzLDYwLDIxNiwyNDYsOTksMTMyLDAsMCwxOTQsMTcyLAorCTQsMCwxOTUsMTY0LDIsMTMxLDIsNjAsMTM4LDE1NSw2NiwxNDgsCisJMiwxMzEsMyw2MCwxMzIsMTU1LDk5LDE0OCwyLDEzMSw0LDYwLAorCTEzNCwxNTUsMTMyLDE0OCwyLDEzMSw1LDYwLDEzNiwxNTUsMTY1LDE0OCwKKwkzLDEzMSwxLDYwLDIxNiwxMiwzNCwxNjQsMiwxMzEsMiw2MCwKKwkxMzAsMTU1LDY2LDE0OCwzLDEzMSwxMCw2MCwyMTgsMTIsNzQsMzcsCisJMywwLDE5OSwxMzYsMCwwLDE5OSwxNTIsNCwwLDIwMCwxMjgsCisJNSwwLDIwMSwxMjgsMywwLDcxLDE2OSwwLDAsNzEsMTg1LAorCTQsMCw3MiwxNjEsNSwwLDczLDE2MSwzLDEzMSwxLDYwLAorCTIzOCwxMiwzNSwxNjQsMywxMzEsMSw2MCwyNDIsMTIsMzYsMTY0LAorCTMsMTMxLDEsNjAsMjQ2LDEyLDM3LDE2NCwzLDEzMSwxLDYwLAorCTI0MCwxMiwzNCwxNjQsMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDMsMTMxLDIsNjAsCisJMjE2LDEyLDY2LDE0MCwzLDEzMSwzLDYwLDIyMCwxMiw5OSwxNDAsCisJMywxMzEsMSw2MCwyMDgsMTIsMzQsMTcyLDMsMTMxLDEsNjAsCisJMjEyLDEyLDM1LDE3MiwzLDEzMSwyLDYwLDIzOCwxMiw2NiwxNDgsCisJMywxMzEsMyw2MCwyNDAsMTIsOTksMTQ4LDMsMTMxLDQsNjAsCisJMjQyLDEyLDEzMiwxNDgsMjMyLDI1NSwxODksMzksMTYsMCwxNzYsMTc1LAorCTMsMTMxLDEsNjAsMjM0LDEyLDM1LDE2NCwyNCwxMzMsMTMxLDE0MywKKwkyMCwwLDE5MSwxNzUsMywxMzEsMSw2MCwyMjQsMTIsMzIsMTcyLAorCTMsMTMxLDEsNjAsMjI4LDEyLDMyLDE3MiwzLDEzMSwxLDYwLAorCTI0OCwxMiwzMiwxNzIsMywxMzEsMSw2MCwyNTIsMTIsMzIsMTcyLAorCTMsMTMxLDEsNjAsOCwxMywzMiwxNjQsMywxMzEsMSw2MCwKKwk0LDEzLDMyLDE2NCwzLDEzMSwxLDYwLDIzMiwxMiwzNCwxNjQsCisJMzMsMTYsNjgsMCwzLDEzMSwxLDYwLDIzNiwxMiwzNiwxNjQsCisJMywxMzEsMSw2MCwyNDQsMTIsMzQsMTY0LDgsMCw5NiwyNCwKKwkxLDAsMTYsMzYsMTUwLDM1LDE5MiwxMiwzMywzMiwwLDIsCisJMjQsMTMzLDEzMCwxNDMsMSwwLDE2LDM4LDQyLDE2LDgwLDAsCisJMjUwLDI1NSw2NCwxNiwwLDAsMCwwLDIwNiwzNSwxOTIsMTIsCisJMCwwLDAsMCw1MiwzNiwxOTIsMTIsMCwwLDAsMCwKKwkxLDAsMiwzNiwzLDEzMSwxLDYwLDAsMTMsMzQsMTY0LAorCTMsMCwyLDM2LDMsMTMxLDEsNjAsMiwxMywzMiwxNjQsCisJMywxMzEsMSw2MCwyMCwxMywzNCwxNzIsMiwxMzEsMSw2MCwKKwkxNjQsMjQ3LDM0LDE3MiwyMCwwLDE5MSwxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywyNCwwLDE4OSwzOSwyMjQsMjU1LDE4OSwzOSwKKwkyMCwwLDE3NywxNzUsMzMsMTM2LDEyOCwwLDE2LDAsMTc2LDE3NSwKKwkxOTIsMTI5LDE3LDAsMywxMzEsNCw2MCwxNiwxMywxMzIsMzYsCisJMzMsMzIsNCwyLDE4NywwLDUsMzYsMjQsMCwxOTEsMTc1LAorCTE0NCw3MSwxOTIsMTIsMTI4LDAsNiwzNiwyLDEzMSwyLDYwLAorCTE0MCwxNTUsNjYsMTQ4LDEwMCwwLDMsMzYsMywxMzEsMSw2MCwKKwkzMyw4LDQ4LDAsMjQsMTMsMzUsMTcyLDAsMTgsMiwwLAorCTM3LDE2LDM0LDIsMywxMzEsMSw2MCwzMyw4LDQ4LDAsCisJMTYsMTMsMzQsMTY0LDIyLDM2LDE5MiwxMiwzMywzMiwzMiwyLAorCTQsMCwyLDM2LDY0LDEzOCwxNywwLDMsMTMxLDEsNjAsCisJMzMsOCw0OCwwLDIwLDEzLDM0LDE3MiwyLDEzMSwxLDYwLAorCTMzLDgsNDksMCwxNjQsMjQ3LDM0LDE3MiwzLDEzMSwxLDYwLAorCTMzLDgsNDgsMCw1MiwxMywzMiwxNzIsMywxMzEsMSw2MCwKKwkzMyw4LDQ4LDAsNTYsMTMsMzIsMTcyLDMsMTMxLDEsNjAsCisJMzMsOCw0OCwwLDEwNiwxMywzMiwxNjQsMywxMzEsMSw2MCwKKwkzMyw4LDQ4LDAsMTEwLDEzLDMyLDE2NCwzLDEzMSwxLDYwLAorCTMzLDgsNDgsMCwxMTQsMTMsMzIsMTY0LDMsMTMxLDEsNjAsCisJMzMsOCw0OCwwLDEyMCwxMywzMiwxNzIsMjQsMCwxOTEsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTMyLDAsMTg5LDM5LDI0LDEzMywxMzAsMTQzLDIxNiwyNTUsMTg5LDM5LAorCTIwLDAsMTc3LDE3NSwxLDAsMTcsMzYsMzYsMCwxOTEsMTc1LAorCTMyLDAsMTgwLDE3NSwyOCwwLDE3OSwxNzUsMjQsMCwxNzgsMTc1LAorCTU1LDAsNjQsMjQsMTYsMCwxNzYsMTc1LDMsMTMxLDIwLDYwLAorCTIyOCwxMiwxNDgsMzgsMywxMzEsMiw2MCw1NiwxMyw2NiwzNiwKKwkxMjgsMCw4MywzNiwxMjQsMCw4MiwzNiwxMjgsMCwxNiwzNiwKKwkwLDAsMTMwLDE0MiwwLDAsMCwwLDYsMCwzNCwyMiwKKwkzMywzMiwzMiwyLDAsMCw2NCwxNzQsMTAxLDM2LDE5MiwxMiwKKwkwLDAsOTYsMTc0LDgsMzYsMTkyLDgsMTI4LDAsMTE1LDM4LAorCTMsMTMxLDQsNjAsMzMsMzIsMTQ0LDAsNDAsMTMsMTMyLDE0MCwKKwkzLDEzMSw1LDYwLDMzLDQwLDE3NiwwLDQ0LDEzLDE2NSwxNDAsCisJMjQ0LDI1NSwxMzQsMTQyLDI0OCwyNTUsMTM1LDE0MiwyMCwzNSwxOTIsMTIsCisJMCwwLDAsMCwxNywwLDY0LDIwLDMzLDMyLDMyLDIsCisJMywxMzEsMyw2MCwzMywyNCwxMTIsMCw0OCwxMyw5OSwxNDgsCisJMywxMzEsMiw2MCwzMywxNiw4MCwwLDE2LDEzLDY2LDE0OCwKKwkwLDAsMCwwLDgsMCw5OCwyMCwwLDAsMCwwLAorCTMsMTMxLDEsNjAsMzMsOCw0OCwwLDEwNiwxMywzMiwxNjQsCisJMTAxLDM2LDE5MiwxMiwzMywzMiwzMiwyLDgsMzYsMTkyLDgsCisJMTI4LDAsMTE1LDM4LDAsMCw2NCwxNzQsMTI1LDM2LDE5MiwxMiwKKwkwLDAsOTYsMTc0LDEyOCwwLDExNSwzOCwxMjgsMCw4MiwzOCwKKwkyNCwxMzMsMTMwLDE0MywxLDAsNDksMzgsNDIsMTYsODEsMCwKKwkyMTAsMjU1LDY0LDE2LDEyOCwwLDE2LDM4LDM2LDAsMTkxLDE0MywKKwkzMiwwLDE4MCwxNDMsMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk0MCwwLDE4OSwzOSwxOTIsMzMsNCwwLDMsMTMxLDIsNjAsCisJMjgsMTMsNjYsMzYsMzMsMjQsMTMwLDAsMywxMzEsNSw2MCwKKwkyMDgsMTIsMTY1LDE0MCwzLDEzMSw2LDYwLDIxMiwxMiwxOTgsMTQwLAorCTAsMCwxMDEsMTcyLDQsMCwxMDIsMTcyLDEyLDAsNjYsMzYsCisJMywxMzEsMyw2MCwyMjQsMTIsOTksMTQwLDMzLDE2LDEzMCwwLAorCTMsMTMxLDEsNjAsMzMsOCwzNiwwLDM2LDEzLDM1LDE3MiwKKwkzLDEzMSwzLDYwLDIxNiwxMiw5OSwxNDAsMywxMzEsNSw2MCwKKwkyMjAsMTIsMTY1LDE0MCwwLDAsNjcsMTcyLDQsMCw2OSwxNzIsCisJMywxMzEsMiw2MCwzMywxNiw2OCwwLDE2LDEzLDY2LDE0OCwKKwkzLDEzMSwxLDYwLDMzLDgsMzYsMCw4LDAsMjI0LDMsCisJNDgsMTMsMzQsMTY0LDI0LDEzMywxMzAsMTQzLDIyNCwyNTUsMTg5LDM5LAorCTIwLDAsMTc3LDE3NSwxLDAsMTcsMzYsMjQsMCwxOTEsMTc1LAorCTM4LDAsNjQsMjQsMTYsMCwxNzYsMTc1LDEyOCwwLDE2LDM2LAorCTMsMTMxLDQsNjAsMzMsMzIsMTQ0LDAsNDAsMTMsMTMyLDE0MCwKKwkzLDEzMSw1LDYwLDMzLDQwLDE3NiwwLDQ0LDEzLDE2NSwxNDAsCisJMywxMzEsNiw2MCwyMTYsMTIsMTk4LDE0MCwzLDEzMSw3LDYwLAorCTIyMCwxMiwyMzEsMTQwLDIwLDM1LDE5MiwxMiwwLDAsMCwwLAorCTE4LDAsNjQsMjAsMCwwLDAsMCwzLDEzMSwzLDYwLAorCTMzLDI0LDExMiwwLDQ4LDEzLDk5LDE0OCwzLDEzMSwyLDYwLAorCTMzLDE2LDgwLDAsMTYsMTMsNjYsMTQ4LDAsMCwwLDAsCisJOSwwLDk4LDIwLDAsMCwwLDAsMywxMzEsMiw2MCwKKwkzMywxNiw4MCwwLDIwLDEzLDY2LDE0MCwwLDAsMCwwLAorCTMsMCw2NCwxNiwwLDAsMCwwLDIwMywzNiwxOTIsMTIsCisJMzMsMzIsMzIsMiwyNCwxMzMsMTMwLDE0MywxLDAsNDksMzgsCisJNDIsMTYsODEsMCwyMjEsMjU1LDY0LDE2LDEyOCwwLDE2LDM4LAorCTI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywzMiwwLDE4OSwzOSwxOTIsNDEsNCwwLAorCTMsMTMxLDMsNjAsMzMsMjQsMTAxLDAsMjAsMTMsOTksMTQwLAorCTQsMCwyLDM2LDE2LDAsOTgsMjAsMjQwLDI1NSwxODksMzksCisJMSwwLDIsMzYsNjQsMjYsNCwwLDMsMTMxLDEsNjAsCisJMzMsOCwzNywwLDIwLDEzLDM0LDE3MiwyLDEzMSwxLDYwLAorCTMzLDgsMzUsMCwxNjQsMjQ3LDM0LDE3MiwxLDAsMiwzNiwKKwkzLDEzMSwxLDYwLDMzLDgsMzcsMCwxMTAsMTMsMzQsMTY0LAorCTMsMTMxLDEsNjAsMzMsOCwzNywwLDExMiwxMywzMiwxNjQsCisJOCwwLDIyNCwzLDE2LDAsMTg5LDM5LDIyNCwyNTUsMTg5LDM5LAorCTI0LDAsMTc4LDE3NSwzMywxNDQsMTI4LDAsMTYsMCwxNzYsMTc1LAorCTE5MiwxMjksMTgsMCwyOCwwLDE5MSwxNzUsMjAsMCwxNzcsMTc1LAorCTMsMTMxLDIsNjAsMzMsMTYsODAsMCwyMCwxMyw2NiwxNDAsCisJMCwwLDAsMCwxOCwwLDY0LDE2LDQsMCwxNywzNiwKKwkxNiwwLDgxLDE2LDI1NCwyNTUsNjYsMzYsMiwwLDY2LDQ0LAorCTQsMCw2NCwxNiw2NCwxOCwxOCwwLDE2MSwzNiwxOTIsMTIsCisJMCwwLDAsMCw2NCwxOCwxOCwwLDMsMTMxLDEsNjAsCisJMzMsOCw0OCwwLDIwLDEzLDQ5LDE3MiwyLDEzMSwxLDYwLAorCTMzLDgsMzQsMCwxNjQsMjQ3LDQ5LDE3MiwzLDEzMSwxLDYwLAorCTMzLDgsNDgsMCwxMTAsMTMsMzIsMTY0LDI4LDAsMTkxLDE0MywKKwkyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMzIsMCwxODksMzksMywxMzEsNCw2MCwKKwkyMDgsMTIsMTMyLDE0MCwzLDEzMSw1LDYwLDIxMiwxMiwxNjUsMTQwLAorCTMsMTMxLDYsNjAsMjE2LDEyLDE5OCwxNDAsMywxMzEsNyw2MCwKKwkyMjAsMTIsMjMxLDE0MCwyMzIsMjU1LDE4OSwzOSwxNiwwLDE5MSwxNzUsCisJMjAsMzUsMTkyLDEyLDAsMCwwLDAsMTAsMCw2NCwyMCwKKwkxLDAsMiwzNiwzLDEzMSwxLDYwLDI1MiwxMiwzNCwxNzIsCisJMSwwLDIsMzYsMywxMzEsMSw2MCw0LDEzLDM0LDE2NCwKKwkzLDEzMSwxLDYwLDYsMTMsMzIsMTY0LDE5NywzNiwxOTIsOCwKKwkxLDAsMiwzNiwzLDEzMSwyLDYwLDI0OCwxMiw2NiwxNDAsCisJMCwwLDAsMCw5LDAsNjQsMjAsMSwwLDIsMzYsCisJNzIsMzcsMTkyLDEyLDAsMCwwLDAsMSwwLDIsMzYsCisJMywxMzEsMSw2MCw4LDEzLDM0LDE2NCwzLDEzMSwxLDYwLAorCTEwLDEzLDMyLDE2NCwxLDAsMiwzNiwzLDEzMSwxLDYwLAorCTI0OCwxMiwzNCwxNzIsMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDIyNCwyNTUsMTg5LDM5LAorCTIwLDAsMTc3LDE3NSwzMywxMzYsMTI4LDAsMTYsMCwxNzYsMTc1LAorCTE5MiwxMjksMTcsMCwyNCwwLDE5MSwxNzUsMywxMzEsMiw2MCwKKwkzMywxNiw4MCwwLDExNCwxMyw2NiwxMzIsMCwwLDAsMCwKKwk1LDAsNjQsMTYsMSwwLDIsMzYsMywxMzEsMSw2MCwKKwkzMyw4LDQ4LDAsNjcsMzcsMTkyLDgsNTYsMTMsMzQsMTcyLAorCTMsMTMxLDQsNjAsMjA4LDEyLDEzMiwzNiwzLDEzMSwyLDYwLAorCTY0LDEzLDY2LDM2LDMzLDI0LDIsMiwzLDEzMSwxLDYwLAorCTMzLDgsNDgsMCw2MCwxMywzMiwxNjQsMCwwLDEzMywxNDAsCisJNCwwLDEzNCwxNDAsMCwwLDEwMSwxNzIsNCwwLDEwMiwxNzIsCisJMTIsMCw2NiwzNiwzLDEzMSwzLDYwLDIyNCwxMiw5OSwxNDAsCisJMzMsMTYsMiwyLDMsMTMxLDEsNjAsMzMsOCw0OCwwLAorCTcyLDEzLDM1LDE3MiwzLDEzMSwzLDYwLDIxNiwxMiw5OSwxNDAsCisJMywxMzEsNSw2MCwyMjAsMTIsMTY1LDE0MCwwLDAsNjcsMTcyLAorCTQsMCw2OSwxNzIsMywxMzEsMiw2MCwzMywxNiw4MCwwLAorCTE2LDEzLDY2LDE0OCwzLDEzMSwxLDYwLDMzLDgsNDgsMCwKKwk4NCwxMywzNCwxNjQsMCwwLDEzMiwxNDAsMywxMzEsNSw2MCwKKwkyMTIsMTIsMTY1LDE0MCwzLDEzMSw2LDYwLDIxNiwxMiwxOTgsMTQwLAorCTMsMTMxLDcsNjAsMjIwLDEyLDIzMSwxNDAsMjAsMzUsMTkyLDEyLAorCTAsMCwwLDAsNSwwLDY0LDIwLDAsMCwwLDAsCisJMywxMzEsMSw2MCwzMyw4LDQ4LDAsMjIsMzcsMTkyLDgsCisJODYsMTMsMzIsMTY0LDMsMTMxLDIsNjAsMjI4LDEyLDY2LDE0MCwKKwkyLDEzMSwzLDYwLDEyOCwxNTUsOTksMTQ4LDE5MiwxNywyLDAsCisJMywxMzEsMSw2MCwzMyw4LDM0LDAsMTA4LDEzLDM0LDE0OCwKKwkwLDAsMCwwLDMzLDE2LDY3LDAsMywxMzEsMSw2MCwKKwkzMyw4LDQ4LDAsODYsMTMsMzQsMTY0LDMsMTMxLDIsNjAsCisJMjMyLDEyLDY2LDE0OCwxOTIsMTI5LDE3LDAsMywxMzEsMSw2MCwKKwkzMyw4LDQ4LDAsODgsMTMsMzQsMTY0LDMsMTMxLDIsNjAsCisJMjM0LDEyLDY2LDE0OCwzMywzMiwzMiwyLDMsMTMxLDEsNjAsCisJMzMsOCw0OCwwLDkwLDEzLDM0LDE2NCwzLDEzMSwzLDYwLAorCTIzNiwxMiw5OSwxNDgsMywxMzEsMiw2MCwzMywxNiw4MCwwLAorCTUyLDEzLDY2LDE0MCwzLDEzMSw1LDYwLDYwLDEzLDE2NSwzNiwKKwkzLDEzMSwxLDYwLDMzLDgsNDgsMCw1MiwxMywzMiwxNzIsCisJMywxMzEsMSw2MCwzMyw4LDQ4LDAsOTYsMTMsMzQsMTcyLAorCTMsMTMxLDEsNjAsMzMsOCw0OCwwLDkyLDEzLDM1LDE2NCwKKwkzLDEzMSwyLDYwLDI1MiwxMiw2NiwxNDAsMywxMzEsMSw2MCwKKwkzMyw4LDQ4LDAsMTAwLDEzLDM0LDE3Miw4MCw0MCwxOTIsMTIsCisJMzMsNDAsNSwyLDEsMCwyLDM2LDMsMTMxLDEsNjAsCisJMzMsOCw0OCwwLDU2LDEzLDMyLDE3MiwzLDEzMSwxLDYwLAorCTMzLDgsNDgsMCwxMTQsMTMsMzQsMTY0LDMsMTMxLDEsNjAsCisJMzMsOCw0OCwwLDExNiwxMywzMiwxNjQsMjQsMCwxOTEsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTMyLDAsMTg5LDM5LDIzMiwyNTUsMTg5LDM5LDEyOCwwLDIsMzYsCisJMywxMzEsNCw2MCwyMjgsMTIsMTMyLDE0MCwzLDEzMSw1LDYwLAorCTEwNCwxMywxNjUsMzYsMTYsMCwxOTEsMTc1LDE5MiwyNSw0LDAsCisJMywxMzEsMSw2MCwzMyw4LDM1LDAsMTA0LDEzLDM0LDE2NCwKKwkxNTEsNDAsMTkyLDEyLDMzLDQwLDEwMSwwLDIsMTMxLDQsNjAsCisJMTUsNjMsMTkyLDEyLDEyLDE0NiwxMzIsMzYsMTYsMCwxOTEsMTQzLAorCTI0LDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTIzMiwyNTUsMTg5LDM5LDE2LDAsMTkxLDE3NSwxMDIsMzcsMTkyLDEyLAorCTAsMCwwLDAsMTMsMzgsMTkyLDEyLDAsMCwwLDAsCisJMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDI0LDEzMywxMzAsMTQzLDIwOCwyNTUsMTg5LDM5LAorCTI0LDAsMTc4LDE3NSwzMywxNDQsMCwwLDI4LDAsMTc5LDE3NSwKKwkxLDAsMTksMzYsNDQsMCwxOTEsMTc1LDQwLDAsMTgyLDE3NSwKKwkzNiwwLDE4MSwxNzUsMzIsMCwxODAsMTc1LDIwLDAsMTc3LDE3NSwKKwkxMTAsMCw2NCwyNCwxNiwwLDE3NiwxNzUsMywxMzEsMjEsNjAsCisJMjE2LDEyLDE4MSwzOCwzLDEzMSwyMiw2MCwxNiwxMywyMTQsMzgsCisJMTI4LDAsMjA4LDM4LDEyOCwwLDIwLDM2LDE5MiwxNywxOCwwLAorCTMsMTMxLDQsNjAsMzMsMzIsMTQ4LDAsNDAsMTMsMTMyLDE0MCwKKwkzLDEzMSw1LDYwLDMzLDQwLDE4MCwwLDQ0LDEzLDE2NSwxNDAsCisJMCwwLDE2NiwxNDIsMywxMzEsNyw2MCwyMjAsMTIsMjMxLDE0MCwKKwkwLDAsMCwwLDIwLDM1LDE5MiwxMiwzMywxMzYsODYsMCwKKwkxMCwwLDY0LDIwLDAsMCwwLDAsMywxMzEsMyw2MCwKKwkzMywyNCwxMTYsMCw0OCwxMyw5OSwxNDgsMywxMzEsMiw2MCwKKwkzMywxNiw4NCwwLDE2LDEzLDY2LDE0OCwwLDAsMCwwLAorCTc0LDAsOTgsMTYsMCwwLDAsMCw0LDAsMiwxNDIsCisJMCwwLDAsMCw3MCwwLDY0LDE2LDAsMCwwLDAsCisJMTIsMCw0LDE0MiwxNiwwLDUsMTQyLDAsMCwxNjYsMTQyLAorCTMsMTMxLDcsNjAsMjIwLDEyLDIzMSwxNDAsMjAsMzUsMTkyLDEyLAorCTAsMCwwLDAsNjEsMCw2NSw0LDAsMCwwLDAsCisJNTgsMCw2NCwxOCwwLDAsMCwwLDEyLDAsNCwxNDIsCisJMTYsMCw1LDE0MiwxMiwwLDM4LDE0MiwxNiwwLDM5LDE0MiwKKwkyMCwzNSwxOTIsMTIsMCwwLDAsMCw1MCwwLDY0LDQsCisJMCwwLDAsMCwxMiwwLDQsMTQyLDE2LDAsNSwxNDIsCisJMTIsMCwzOCwxNDIsMTYsMCwzOSwxNDIsMjAsMzUsMTkyLDEyLAorCTAsMCwwLDAsNDMsMCw2NCwyMCwwLDAsMCwwLAorCTIwLDAsNSwxNDIsOCwwLDMsMTQyLDIwLDAsMzYsMTQyLAorCTgsMCwzNCwxNDIsMzMsNDAsMTYzLDAsMzMsMzIsMTMwLDAsCisJNDMsMTYsMTY0LDAsMzMsMCw2NCwyMCwwLDAsMCwwLAorCTMyLDAsMTY0LDIwLDAsMCwwLDAsMjQsMCw0LDE0MiwKKwkyOCwwLDUsMTQyLDI0LDAsMzgsMTQyLDI4LDAsMzksMTQyLAorCTIwLDM1LDE5MiwxMiwwLDAsMCwwLDIzLDAsNjQsNCwKKwkwLDAsMCwwLDI0LDAsNCwxNDIsMjgsMCw1LDE0MiwKKwkyNCwwLDM4LDE0MiwyOCwwLDM5LDE0MiwyMCwzNSwxOTIsMTIsCisJMCwwLDAsMCwxNiwwLDY0LDIwLDAsMCwwLDAsCisJMzIsMCw0LDE1MCwzMiwwLDM1LDE1MCwwLDAsMCwwLAorCTQzLDE2LDEzMSwwLDksMCw2NCwyMCwwLDAsMCwwLAorCTgsMCwxMzEsMjAsMCwwLDAsMCwwLDAsMiwxNTAsCisJMCwwLDM1LDE1MCwwLDAsMCwwLDQzLDE2LDY3LDAsCisJMiwwLDY0LDE2LDAsMCwwLDAsMzMsMTQ0LDk2LDIsCisJMTI4LDAsMTYsMzgsMjQsMTMzLDEzMCwxNDMsMSwwLDExNSwzOCwKKwk0MiwxNiw4MywwLDE1NCwyNTUsNjQsMTYsMTI4LDAsMTQ4LDM4LAorCTMsMTMxLDEsNjAsMjI4LDEyLDUwLDE3MiwxMiwwLDY0LDIyLAorCTE5MiwxNywxOCwwLDMsMTMxLDIsNjAsMjE2LDEyLDY2LDE0MCwKKwkzLDEzMSwzLDYwLDIyMCwxMiw5OSwxNDAsMywxMzEsMSw2MCwKKwkyMDgsMTIsMzQsMTcyLDMsMTMxLDEsNjAsMjEyLDEyLDM1LDE3MiwKKwkzLDEzMSwxLDYwLDMsMzgsMTkyLDgsMjI0LDEyLDMyLDE3MiwKKwkzLDEzMSwzLDYwLDMzLDI0LDk4LDAsMjgsMTMsOTksMTQwLAorCTMsMTMxLDQsNjAsMzMsMzIsMTMwLDAsMzIsMTMsMTMyLDE0MCwKKwkzLDEzMSwxLDYwLDIwOCwxMiwzNSwxNzIsMywxMzEsMSw2MCwKKwkyMTIsMTIsMzYsMTcyLDMsMTMxLDMsNjAsMzMsMjQsOTgsMCwKKwkzNiwxMyw5OSwxNDAsMywxMzEsMSw2MCwzMyw4LDM0LDAsCisJMjQsMTMsMzQsMTQwLDAsMCwwLDAsMzMsMjQsOTgsMCwKKwkzLDEzMSwxLDYwLDIyNCwxMiwzNSwxNzIsNDQsMCwxOTEsMTQzLAorCTQwLDAsMTgyLDE0MywzNiwwLDE4MSwxNDMsMzIsMCwxODAsMTQzLAorCTI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsNDgsMCwxODksMzksCisJMjQsMTMzLDEzMCwxNDMsMjA4LDI1NSwxODksMzksMzYsMCwxODEsMTc1LAorCTEsMCwyMSwzNiw0NCwwLDE5MSwxNzUsNDAsMCwxODIsMTc1LAorCTMyLDAsMTgwLDE3NSwyOCwwLDE3OSwxNzUsMjQsMCwxNzgsMTc1LAorCTIwLDAsMTc3LDE3NSw4MiwwLDY0LDI0LDE2LDAsMTc2LDE3NSwKKwkzLDEzMSwyMiw2MCwyMTYsMTIsMjE0LDM4LDMsMTMxLDIsNjAsCisJNDgsMTMsNjYsMzYsMTI4LDAsODQsMzYsOTYsMCw4MywzNiwKKwkxMjQsMCw4MiwzNiwxMjAsMCw4MSwzNiwxMjgsMCwxNiwzNiwKKwkwLDAsMzYsMTQyLDAsMCw2OSwxNDIsMCwwLDE5OCwxNDIsCisJMywxMzEsNyw2MCwyMjAsMTIsMjMxLDE0MCwyMCwzNSwxOTIsMTIsCisJMCwwLDAsMCw1NSwwLDY0LDIwLDAsMCwwLDAsCisJMCwwLDEzMSwxNTAsMCwwLDk4LDE1MCwwLDAsMCwwLAorCTUwLDAsOTgsMjAsMCwwLDAsMCwzLDEzMSw0LDYwLAorCTMzLDMyLDE0NCwwLDI4LDEzLDEzMiwxNDAsMywxMzEsNSw2MCwKKwkzMyw0MCwxNzYsMCwzMiwxMywxNjUsMTQwLDI0OCwyNTUsMTk4LDE0MiwKKwkzLDEzMSw3LDYwLDIxMiwxMiwyMzEsMTQwLDIwLDM1LDE5MiwxMiwKKwkwLDAsMCwwLDM3LDAsNjQsMTYsMCwwLDAsMCwKKwk4LDAsMTk2LDE0MiwzLDEzMSwzLDYwLDMzLDI0LDExMiwwLAorCTM2LDEzLDk5LDE0MCwwLDAsMCwwLDQzLDE2LDEzMSwwLAorCTI5LDAsNjQsMjAsMCwwLDAsMCwyNywwLDEzMSwyMCwKKwkwLDAsMCwwLDAsMCwxOTYsMTQyLDMsMTMxLDUsNjAsCisJMjIwLDEyLDE2NSwxNDAsMCwwLDM4LDE0MiwwLDAsNzEsMTQyLAorCTIwLDM1LDE5MiwxMiwwLDAsMCwwLDE2LDAsNjQsNCwKKwkwLDAsMCwwLDAsMCwxOTYsMTQyLDMsMTMxLDUsNjAsCisJMjIwLDEyLDE2NSwxNDAsMCwwLDM4LDE0MiwwLDAsNzEsMTQyLAorCTIwLDM1LDE5MiwxMiwwLDAsMCwwLDksMCw2NCwyMCwKKwkwLDAsMCwwLDAsMCw5OSwxNTAsMCwwLDEzMCwxNTAsCisJMCwwLDAsMCw0MywxNiw2NywwLDMsMCw2NCwyMCwKKwkwLDAsMCwwLDIyLDM2LDE5MiwxMiwzMywzMiwxNjAsMiwKKwkxMjgsMCwxNDgsMzgsMTI4LDAsMTE1LDM4LDEyOCwwLDgyLDM4LAorCTEyOCwwLDQ5LDM4LDI0LDEzMywxMzAsMTQzLDEsMCwxODEsMzgsCisJNDIsMTYsODUsMCwxODUsMjU1LDY0LDE2LDEyOCwwLDE2LDM4LAorCTQ0LDAsMTkxLDE0Myw0MCwwLDE4MiwxNDMsMzYsMCwxODEsMTQzLAorCTMyLDAsMTgwLDE0MywyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQ4LDAsMTg5LDM5LDIxNiwyNTUsMTg5LDM5LDMsMTMxLDQsNjAsCisJMCwxMywxMzIsMzYsMzIsMCwxOTEsMTc1LDI4LDAsMTc5LDE3NSwKKwkyNCwwLDE3OCwxNzUsMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwKKwkwLDAsMTMwLDEzMiwwLDAsMCwwLDE0LDAsNjQsMTYsCisJMCwwLDAsMCwzLDEzMSwyLDYwLDIsMTMsNjYsMTQ4LAorCTMsMTMxLDMsNjAsMjM0LDEyLDk5LDE0OCwxLDAsNjYsMzYsCisJMywxMzEsMSw2MCwyLDEzLDM0LDE2NCwyNTUsMjU1LDY2LDQ4LAorCTQzLDE2LDY3LDAsMywwLDY0LDIwLDAsMCwwLDAsCisJMTEsMzksMTkyLDEyLDAsMCwxMjgsMTY0LDMsMTMxLDQsNjAsCisJOCwxMywxMzIsMzYsMCwwLDEzMCwxMzIsMCwwLDAsMCwKKwkxNCwwLDY0LDE2LDAsMCwwLDAsMywxMzEsMiw2MCwKKwkxMCwxMyw2NiwxNDgsMywxMzEsMyw2MCwyMzQsMTIsOTksMTQ4LAorCTEsMCw2NiwzNiwzLDEzMSwxLDYwLDEwLDEzLDM0LDE2NCwKKwkyNTUsMjU1LDY2LDQ4LDQzLDE2LDY3LDAsMywwLDY0LDIwLAorCTAsMCwwLDAsMjQsMzksMTkyLDEyLDAsMCwxMjgsMTY0LAorCTMsMTMxLDQsNjAsNCwxMywxMzIsMzYsMCwwLDEzMCwxMzIsCisJMCwwLDAsMCwxNCwwLDY0LDE2LDAsMCwwLDAsCisJMywxMzEsMiw2MCw2LDEzLDY2LDE0OCwzLDEzMSwzLDYwLAorCTI0NCwxMiw5OSwxNDgsMSwwLDY2LDM2LDMsMTMxLDEsNjAsCisJNiwxMywzNCwxNjQsMjU1LDI1NSw2Niw0OCw0MywxNiw2NywwLAorCTMsMCw2NCwyMCwwLDAsMCwwLDM3LDM5LDE5MiwxMiwKKwkwLDAsMTI4LDE2NCwyNCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTc4LDAsNjQsMjQsMSwwLDE3LDM2LDMsMTMxLDIsNjAsCisJMTYsMTMsNjYsMzYsMjI2LDAsODMsMzYsMTI4LDAsODIsMzYsCisJMTI4LDAsMTYsMzYsMywxMzEsMiw2MCwzMywxNiw4MCwwLAorCTExMCwxMyw2NiwxMzIsMCwwLDAsMCwxOCwwLDY0LDE2LAorCTAsMCwwLDAsMywxMzEsMiw2MCwzMywxNiw4MCwwLAorCTExMiwxMyw2NiwxNDgsMCwwLDAsMCwxLDAsNjYsMzYsCisJOTYsMCw2NiwxNjYsMywxMzEsMyw2MCwyMzYsMTIsOTksMTQ4LAorCTI1NSwyNTUsNjYsNDgsNDMsMTYsNjcsMCw2LDAsNjQsMjAsCisJMCwwLDAsMCwzLDEzMSwxLDYwLDMzLDgsNDgsMCwKKwkxMTAsMTMsMzIsMTY0LDc5LDM5LDE5MiwxMiwzMywzMiwzMiwyLAorCTMsMTMxLDIsNjAsMzMsMTYsODAsMCwxMDYsMTMsNjYsMTMyLAorCTAsMCwwLDAsMTgsMCw2NCwxNiwwLDAsMCwwLAorCTMsMTMxLDIsNjAsMzMsMTYsODAsMCwxMDgsMTMsNjYsMTQ4LAorCTAsMCwwLDAsMSwwLDY2LDM2LDkyLDAsNjYsMTY2LAorCTMsMTMxLDMsNjAsMjMyLDEyLDk5LDE0OCwyNTUsMjU1LDY2LDQ4LAorCTQzLDE2LDY3LDAsNiwwLDY0LDIwLDAsMCwwLDAsCisJMywxMzEsMSw2MCwzMyw4LDQ4LDAsMTA2LDEzLDMyLDE2NCwKKwkxMjksMzksMTkyLDEyLDMzLDMyLDMyLDIsMCwwLDk4LDEzNCwKKwkwLDAsMCwwLDE2LDAsNjQsMTYsMCwwLDAsMCwKKwkzLDEzMSwyLDYwLDMzLDE2LDgwLDAsMTE2LDEzLDY2LDE0OCwKKwkwLDAsMCwwLDEsMCw2NiwzNiwxMDAsMCw2NiwxNjYsCisJMywxMzEsMyw2MCwyNDYsMTIsOTksMTQ4LDI1NSwyNTUsNjYsNDgsCisJNDMsMTYsNjcsMCw0LDAsNjQsMjAsMCwwLDAsMCwKKwkwLDAsOTYsMTY2LDE5MSwzOSwxOTIsMTIsMzMsMzIsMzIsMiwKKwkxMjgsMCwxMTUsMzgsMTI4LDAsODIsMzgsMjQsMTMzLDEzMCwxNDMsCisJMSwwLDQ5LDM4LDQyLDE2LDgxLDAsMTg1LDI1NSw2NCwxNiwKKwkxMjgsMCwxNiwzOCwzMiwwLDE5MSwxNDMsMjgsMCwxNzksMTQzLAorCTI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0MCwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwKKwkxNiwwLDE5MSwxNzUsNTIsMzYsMTkyLDEyLDAsMCwwLDAsCisJMSwwLDIsMzYsMywxMzEsMSw2MCwwLDEzLDM0LDE2NCwKKwkzLDEzMSwxLDYwLDIsMTMsMzIsMTY0LDE2LDAsMTkxLDE0MywKKwkyNCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkyMzIsMjU1LDE4OSwzOSwxNiwwLDE5MSwxNzUsNzIsMzcsMTkyLDEyLAorCTAsMCwwLDAsMSwwLDIsMzYsMywxMzEsMSw2MCwKKwk4LDEzLDM0LDE2NCwzLDEzMSwxLDYwLDEwLDEzLDMyLDE2NCwKKwkxNiwwLDE5MSwxNDMsMjQsMCwxODksMzksOCwwLDIyNCwzLAorCTAsMCwwLDAsMjQwLDI1NSwxODksMzksMywxMzEsMSw2MCwKKwkyNDgsMTIsMzIsMTcyLDMsMTMxLDEsNjAsMjUyLDEyLDMyLDE3MiwKKwk4LDAsMjI0LDMsMTYsMCwxODksMzksMjQsMTMzLDEzMCwxNDMsCisJMjI0LDI1NSwxODksMzksMjAsMCwxNzcsMTc1LDEsMCwxNywzNiwKKwkyNCwwLDE5MSwxNzUsMjMsMCw2NCwyNCwxNiwwLDE3NiwxNzUsCisJMTI4LDAsMTYsMzYsMywxMzEsNCw2MCwzMywzMiwxNDQsMCwKKwk0MCwxMywxMzIsMTQwLDMsMTMxLDUsNjAsMzMsNDAsMTc2LDAsCisJNDQsMTMsMTY1LDE0MCwzLDEzMSw2LDYwLDIxNiwxMiwxOTgsMTQwLAorCTMsMTMxLDcsNjAsMjIwLDEyLDIzMSwxNDAsMjAsMzUsMTkyLDEyLAorCTAsMCwwLDAsMywwLDY0LDIwLDEsMCw0OSwzOCwKKwk3NCwzOSwxOTIsOCwxLDAsMiwzNiwyNCwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDQyLDE2LDgxLDAsMjM2LDI1NSw2NCwxNiwKKwkxMjgsMCwxNiwzOCwzMywxNiwwLDAsMjQsMCwxOTEsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTMyLDAsMTg5LDM5LDIzMiwyNTUsMTg5LDM5LDE5Miw0MSw0LDAsCisJMTYsMCwxOTEsMTc1LDMsMTMxLDMsNjAsMzMsMjQsMTAxLDAsCisJMjAsMTMsOTksMTQwLDEsMCwyLDM2LDE2LDAsOTgsMjAsCisJMiwwLDIsMzYsNjQsMjYsNCwwLDMsMTMxLDEsNjAsCisJMzMsOCwzNywwLDIwLDEzLDM0LDE3MiwyLDEzMSwxLDYwLAorCTMzLDgsMzUsMCwxNjQsMjQ3LDM0LDE3MiwxLDAsMiwzNiwKKwkzLDEzMSwxLDYwLDMzLDgsMzcsMCwxMTAsMTMsMzQsMTY0LAorCTMsMTMxLDEsNjAsMzMsOCwzNywwLDEyNSwzOSwxOTIsOCwKKwkxMTIsMTMsMzIsMTY0LDIxLDAsOTgsMjAsMywwLDMsMzYsCisJNjQsMTgsNCwwLDMsMTMxLDEsNjAsMzMsOCwzNywwLAorCTIwLDEzLDM1LDE3MiwyLDEzMSwxLDYwLDMzLDgsMzQsMCwKKwkxNjQsMjQ3LDM1LDE3MiwzLDEzMSwyLDYwLDMzLDE2LDY5LDAsCisJMTIwLDEzLDY2LDE0MCwwLDAsMCwwLDEsMCw2NiwzNiwKKwkzLDEzMSwxLDYwLDMzLDgsMzcsMCw0NCwzOSwxOTIsMTIsCisJMTIwLDEzLDM0LDE3MiwzLDAsNjQsMTYsMCwwLDAsMCwKKwkxNjEsMzYsMTkyLDEyLDAsMCwwLDAsMTYsMCwxOTEsMTQzLAorCTI0LDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTIyNCwyNTUsMTg5LDM5LDE2LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsCisJMjAsMCwxNzcsMTc1LDMsMTMxLDE3LDYwLDIwOCwxMiw0OSwzOCwKKwkyNCwwLDE5MSwxNzUsMCwwLDM2LDE0MiwzLDEzMSw1LDYwLAorCTIxMiwxMiwxNjUsMTQwLDMsMTMxLDYsNjAsMjE2LDEyLDE5OCwxNDAsCisJMywxMzEsNyw2MCwyMjAsMTIsMjMxLDE0MCwyMCwzNSwxOTIsMTIsCisJMCwwLDAsMCwzMywzMiwwLDIsMjIsMzYsMTkyLDEyLAorCTEsMCw4MCw0NCw5MiwzNywxOTIsMTIsMCwwLDAsMCwKKwkyMDYsMzUsMTkyLDEyLDAsMCwwLDAsMzMsMCwwLDIyLAorCTAsMCwwLDAsMCwwLDM2LDE0MiwzLDEzMSw1LDYwLAorCTIxMiwxMiwxNjUsMTQwLDMsMTMxLDYsNjAsMjE2LDEyLDE5OCwxNDAsCisJMywxMzEsNyw2MCwyMjAsMTIsMjMxLDE0MCwyMCwzNSwxOTIsMTIsCisJMCwwLDAsMCwyMiwwLDY0LDIwLDAsMCwwLDAsCisJMywxMzEsMiw2MCwyMzgsMTIsNjYsMTQ4LDMsMTMxLDMsNjAsCisJMjQwLDEyLDk5LDE0OCwzLDEzMSw0LDYwLDI0MiwxMiwxMzIsMTQ4LAorCTMsMTMxLDEsNjAsMjMyLDEyLDM0LDE2NCwzLDEzMSwxLDYwLAorCTIzNCwxMiwzNSwxNjQsMywxMzEsMSw2MCwxNjEsMzYsMTkyLDEyLAorCTIzNiwxMiwzNiwxNjQsMywxMzEsMSw2MCw1MiwzNiwxOTIsMTIsCisJOCwxMywzMiwxNjQsMSwwLDIsMzYsMywxMzEsMSw2MCwKKwkwLDEzLDM0LDE2NCwzLDEzMSwxLDYwLDIsMTMsMzIsMTY0LAorCTI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywzMiwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwKKwkxOTIsMTcsNCwwLDE2LDAsMTkxLDE3NSwzLDEzMSwxLDYwLAorCTMzLDgsMzQsMCw1NiwxMywzNCwxNDAsMCwwLDAsMCwKKwkzLDAsNjQsMTYsMCwwLDAsMCwyMDMsMzYsMTkyLDEyLAorCTAsMCwwLDAsMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDMsMTMxLDEsNjAsCisJMjQ4LDEyLDMyLDE3MiwzLDEzMSwxLDYwLDgsMCwyMjQsMywKKwk4LDEzLDMyLDE2NCwyMzIsMjU1LDE4OSwzOSwxOTIsMjUsNCwwLAorCTEsMCwyLDM2LDE2LDAsMTkxLDE3NSwzLDEzMSwxLDYwLAorCTMzLDgsMzUsMCwyMDMsMzYsMTkyLDEyLDUyLDEzLDM0LDE3MiwKKwkxNiwwLDE5MSwxNDMsMjQsMCwxODksMzksOCwwLDIyNCwzLAorCTAsMCwwLDAsMTkyLDMzLDQsMCwzLDEzMSwyLDYwLAorCTI4LDEzLDY2LDM2LDMzLDI0LDEzMCwwLDQsMCwxNjYsMTQwLAorCTgsMCwxNjcsMTQwLDAsMCwxMDIsMTcyLDQsMCwxMDMsMTcyLAorCTEyLDAsNjYsMzYsMTIsMCwxNjMsMTQwLDMzLDE2LDEzMCwwLAorCTMsMTMxLDEsNjAsMzMsOCwzNiwwLDM2LDEzLDM1LDE3MiwKKwkxNiwwLDE2MywxNDAsMjAsMCwxNjYsMTQwLDAsMCw2NywxNzIsCisJNCwwLDcwLDE3MiwyNCwwLDE2MywxNDgsMSwwLDIsMzYsCisJMywxMzEsMSw2MCwzMyw4LDM2LDAsMTA2LDEzLDM0LDE2NCwKKwkzLDEzMSwxLDYwLDMzLDgsMzYsMCw0OCwxMywzNSwxNjQsCisJMjYsMCwxNjIsMTQ4LDMsMTMxLDEsNjAsMzMsOCwzNiwwLAorCTgsMCwyMjQsMywxMDgsMTMsMzQsMTY0LDI4LDAsMTMwLDE0OCwKKwkzLDEzMSwxLDYwLDIzMiwxMiwzNCwxNjQsMzAsMCwxMzAsMTQ4LAorCTMsMTMxLDEsNjAsMjM0LDEyLDM0LDE2NCwzMiwwLDEzMCwxNDgsCisJMywxMzEsMSw2MCwyMzYsMTIsMzQsMTY0LDQwLDAsMTMwLDE0MCwKKwkzLDEzMSwxLDYwLDgsMCwyMjQsMywyNTIsMTIsMzQsMTcyLAorCTIyNCwyNTUsMTg5LDM5LDE2LDAsMTc2LDE3NSwzMywxMjgsMTYwLDAsCisJMTkyLDI1LDQsMCwzLDEzMSwyLDYwLDE2LDEzLDY2LDM2LAorCTIwLDAsMTc3LDE3NSwzMywxMzYsOTgsMCwyNCwwLDE5MSwxNzUsCisJNCwwLDQsMTQyLDgsMCw1LDE0MiwxMiwwLDM4LDE0MiwKKwkxNiwwLDM5LDE0MiwyMCwzNSwxOTIsMTIsMCwwLDAsMCwKKwk0OCwwLDY0LDQsMSwwLDIsMzYsNCwwLDQsMTQyLAorCTgsMCw1LDE0MiwxMiwwLDM4LDE0MiwxNiwwLDM5LDE0MiwKKwkyMCwzNSwxOTIsMTIsMCwwLDAsMCw0MCwwLDY0LDIwLAorCTMzLDE2LDAsMCwxMiwwLDQsMTQyLDIwLDAsMzUsMTQyLAorCTAsMCwwLDAsNDMsMTYsMTMxLDAsMzQsMCw2NCwyMCwKKwkxLDAsMiwzNiwzMiwwLDEzMSwyMCwzMywxNiwwLDAsCisJMTYsMCw0LDE0MiwyMCwwLDUsMTQyLDI0LDAsMzgsMTQyLAorCTI4LDAsMzksMTQyLDIwLDM1LDE5MiwxMiwwLDAsMCwwLAorCTI0LDAsNjQsNCwxLDAsMiwzNiwxNiwwLDQsMTQyLAorCTIwLDAsNSwxNDIsMjQsMCwzOCwxNDIsMjgsMCwzOSwxNDIsCisJMjAsMzUsMTkyLDEyLDAsMCwwLDAsMTYsMCw2NCwyMCwKKwkzMywxNiwwLDAsMTYsMCw0LDE0MiwyMCwwLDUsMTQyLAorCTMsMTMxLDYsNjAsMjE2LDEyLDE5OCwxNDAsMywxMzEsNyw2MCwKKwkyMjAsMTIsMjMxLDE0MCwyMCwzNSwxOTIsMTIsMCwwLDAsMCwKKwk2LDAsNjQsMjAsMSwwLDIsMzYsMjQsMCwzLDE1MCwKKwkzMiwwLDM0LDE1MCwwLDAsMCwwLDQzLDE2LDY3LDAsCisJMSwwLDY2LDU2LDI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywzMiwwLDE4OSwzOSwKKwk0NCwxMzMsMTMwLDE0MywyMTYsMjU1LDE4OSwzOSwyMCwwLDE3NywxNzUsCisJMzMsMTM2LDEyOCwwLDMyLDAsMTgwLDE3NSwzMywxNjAsMTYwLDAsCisJMzYsMCwxOTEsMTc1LDI4LDAsMTc5LDE3NSwyNCwwLDE3OCwxNzUsCisJNTMsMCw2NCwxNiwxNiwwLDE3NiwxNzUsMiwxMzEsMTksNjAsCisJMTkyLDQsMTE1LDM4LDMzLDMyLDk2LDIsNTQsMjEsMTkyLDEyLAorCTEsMCw1LDM2LDMzLDEyOCw2NCwwLDgsMCwwLDIyLAorCTY0LDI2LDE3LDAsMiwxMzEsMiw2MCwzMywxNiw2NywwLAorCTE3NiwyNDcsNjYsMTQwLDMzLDI0LDk5LDIsMSwwLDY2LDM2LAorCTE0Myw0MCwxOTIsOCwyNDAsMjQyLDk4LDE3Miw4LDAsNCwxNDIsCisJNjQsMTQ2LDE3LDAsMjAsMjQyLDEwMSwzOCwzMyw0MCw2OSwyLAorCTE3Miw0MSwxOTIsMTIsMzMsNDgsMTI4LDIsMzMsMjQsNjQsMCwKKwk2MCwwLDk4LDQwLDIsMCw2NCwxNiwwLDI0Miw5OCwzOCwKKwk2MCwwLDMsMzYsMzMsMTM2LDY2LDIsMzMsMzIsMzIsMiwKKwkzMyw0MCwwLDIsMSwwLDIsMzYsMTcsMCwyLDE2MiwKKwkwLDEyOCw5OCw1MiwwLDAsMiwxNzQsNiwyMywxOTIsMTIsCisJMTgsMCwzLDE2NiwxMCwwLDY0LDIwLDMzLDMyLDAsMiwKKwkyLDEzMSwyLDYwLDMzLDE2LDgyLDAsMTcyLDI0Nyw2NiwxNDAsCisJMCwwLDAsMCwxLDAsNjYsMzYsMTUyLDIxLDE5MiwxMiwKKwkyMzYsMCwzNCwxNzQsMTQzLDQwLDE5Miw4LDAsMCwwLDAsCisJMiwxMzEsMiw2MCwzMywxNiw4MiwwLDE2OCwyNDcsNjYsMTQwLAorCTAsMCwwLDAsMSwwLDY2LDM2LDIzMiwwLDM0LDE3NCwKKwkzNiwwLDE5MSwxNDMsMzIsMCwxODAsMTQzLDI4LDAsMTc5LDE0MywKKwkyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNDAsMCwxODksMzksNDQsMTMzLDEzMCwxNDMsCisJMjE2LDI1NSwxODksMzksMjAsMCwxNzcsMTc1LDMzLDEzNiwxMjgsMCwKKwkzMiwwLDE4MCwxNzUsMzMsMTYwLDE2MCwwLDM2LDAsMTkxLDE3NSwKKwkyOCwwLDE3OSwxNzUsMjQsMCwxNzgsMTc1LDUzLDAsNjQsMTYsCisJMTYsMCwxNzYsMTc1LDIsMTMxLDE5LDYwLDE5Miw0LDExNSwzOCwKKwkzMywzMiw5NiwyLDU0LDIxLDE5MiwxMiwxLDAsNSwzNiwKKwkzMywxMjgsNjQsMCw4LDAsMCwyMiw2NCwyNiwxNywwLAorCTIsMTMxLDIsNjAsMzMsMTYsNjcsMCwxNzYsMjQ3LDY2LDE0MCwKKwkzMywyNCw5OSwyLDEsMCw2NiwzNiwyMTQsNDAsMTkyLDgsCisJMjQwLDI0Miw5OCwxNzIsOCwwLDQsMTQyLDY0LDE0NiwxNywwLAorCTIwLDI0MiwxMDEsMzgsMzMsNDAsNjksMiw3NCw0MiwxOTIsMTIsCisJMzMsNDgsMTI4LDIsMzMsMjQsNjQsMCw2MCwwLDk4LDQwLAorCTIsMCw2NCwxNiwwLDI0Miw5OCwzOCw2MCwwLDMsMzYsCisJMzMsMTM2LDY2LDIsMzMsMzIsMzIsMiwzMyw0MCwwLDIsCisJMSwwLDIsMzYsMTcsMCwyLDE2MiwwLDEyOCw5OCw1MiwKKwkwLDAsMiwxNzQsNiwyMywxOTIsMTIsMTgsMCwzLDE2NiwKKwkxMCwwLDY0LDIwLDMzLDMyLDAsMiwyLDEzMSwyLDYwLAorCTMzLDE2LDgyLDAsMTcyLDI0Nyw2NiwxNDAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMTUyLDIxLDE5MiwxMiwyMzYsMCwzNCwxNzQsCisJMjE0LDQwLDE5Miw4LDAsMCwwLDAsMiwxMzEsMiw2MCwKKwkzMywxNiw4MiwwLDE2OCwyNDcsNjYsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDIzMiwwLDM0LDE3NCwzNiwwLDE5MSwxNDMsCisJMzIsMCwxODAsMTQzLDI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDAsMCwxODksMzksMjE2LDI1NSwxODksMzksMjQsMCwxNzgsMTc1LAorCTMzLDE0NCwxMjgsMCwyMCwwLDE3NywxNzUsMzMsMTM2LDE2MCwwLAorCTE2LDAsMTc2LDE3NSwzMywxMjgsMTkyLDAsMzYsMCwxOTEsMTc1LAorCTMyLDAsMTgwLDE3NSwyOCwwLDE3OSwxNzUsNCwwLDM2LDE0MiwKKwk4LDAsMzcsMTQyLDE2MCwxMzMsMTM0LDE0MywyLDEzMSw3LDYwLAorCTE4MCwyMTEsMjMxLDE0MCwyMCwzNSwxOTIsMTIsMCwwLDAsMCwKKwkxMSwwLDY0LDIwLDAsMCwwLDAsMiwxMzEsNCw2MCwKKwkxNDQsMTQ2LDEzMiwzNiwxNSw2MywxOTIsMTIsMzMsNDAsMCwyLAorCTEwMCwxMjksMTMyLDM5LDEwOCwxMjksMTM0LDM5LDMxLDIxLDE5MiwxMiwKKwk2LDAsNSwzOCw5Miw0MSwxOTIsOCwwLDAsMCwwLAorCTMsMTMxLDIwLDYwLDIwOCwxMiwxNDgsMzgsMCwwLDEzMiwxNDIsCisJMywxMzEsNSw2MCwyMTIsMTIsMTY1LDE0MCwzLDEzMSw2LDYwLAorCTIxNiwxMiwxOTgsMTQwLDMsMTMxLDcsNjAsMjIwLDEyLDIzMSwxNDAsCisJMCwwLDAsMCwyMCwzNSwxOTIsMTIsMTkyLDEyOSwxOCwwLAorCTMsMTMxLDMsNjAsMzMsMjQsMTEyLDAsMjAsMTMsOTksMTQwLAorCTAsMCwwLDAsODAsMCw5NiwxNiwxLDAsODMsNDQsCisJMzMsMzIsNjQsMiwxMSw0MCwxOTIsMTIsMzMsNDAsMzIsMiwKKwk1MCwwLDY0LDE2LDMzLDMyLDY0LDIsMjIzLDM5LDE5MiwxMiwKKwkzMyw0MCwzMiwyLDkyLDM3LDE5MiwxMiwwLDAsMCwwLAorCTIwNiwzNSwxOTIsMTIsMCwwLDAsMCwwLDAsMTMyLDE0MiwKKwkzLDEzMSw1LDYwLDIxMiwxMiwxNjUsMTQwLDMsMTMxLDYsNjAsCisJMjE2LDEyLDE5OCwxNDAsMywxMzEsNyw2MCwyMjAsMTIsMjMxLDE0MCwKKwkyMCwzNSwxOTIsMTIsMCwwLDAsMCwxNiwwLDY0LDE2LAorCTAsMCwwLDAsMTQsMCw5NiwxOCwwLDAsMCwwLAorCTMsMTMxLDIsNjAsMjQ4LDEyLDY2LDE0MCwzLDEzMSwxLDYwLAorCTksMCw2NCwxNiwwLDEzLDMyLDE2NCwzLDEzMSwxLDYwLAorCTcyLDM3LDE5MiwxMiw0LDEzLDMyLDE2NCwxLDAsMiwzNiwKKwkzLDEzMSwxLDYwLDgsMTMsMzQsMTY0LDMsMTMxLDEsNjAsCisJMTAsMTMsMzIsMTY0LDMsMTMxLDIsNjAsMjI4LDEyLDY2LDE0MCwKKwkwLDAsMCwwLDM4LDAsNjYsMjIsMCwwLDAsMCwKKwkyNTQsMzksMTkyLDEyLDMzLDMyLDMyLDIsNTIsMzYsMTkyLDEyLAorCTAsMCwwLDAsMzYsMCwzNCwxNDIsMCwwLDAsMCwKKwkzMCwwLDY0LDE2LDAsMCwwLDAsMjA2LDM5LDE5MiwxMiwKKwkwLDAsMCwwLDkyLDQxLDE5Miw4LDAsMCwwLDAsCisJMywxMzEsNCw2MCwzMywzMiwxNDQsMCw0MCwxMywxMzIsMTQwLAorCTMsMTMxLDUsNjAsMzMsNDAsMTc2LDAsNDQsMTMsMTY1LDE0MCwKKwkzLDEzMSw2LDYwLDIxNiwxMiwxOTgsMTQwLDMsMTMxLDcsNjAsCisJMjIwLDEyLDIzMSwxNDAsMjAsMzUsMTkyLDEyLDAsMCwwLDAsCisJMTIsMCw2NCwyMCwwLDAsMCwwLDMsMTMxLDMsNjAsCisJMzMsMjQsMTEyLDAsNDgsMTMsOTksMTQ4LDMsMTMxLDIsNjAsCisJMzMsMTYsODAsMCwxNiwxMyw2NiwxNDgsMCwwLDAsMCwKKwkzLDAsOTgsMjAsMCwwLDAsMCwyMDMsMzYsMTkyLDEyLAorCTMzLDMyLDY0LDIsMzYsMCwxOTEsMTQzLDMyLDAsMTgwLDE0MywKKwkyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDQwLDAsMTg5LDM5LAorCTIyNCwyNTUsMTg5LDM5LDIwLDAsMTc3LDE3NSwzMywxMzYsMTI4LDAsCisJMTYsMCwxNzYsMTc1LDE5MiwxMjksMTcsMCwyNCwwLDE5MSwxNzUsCisJMywxMzEsMiw2MCwzMywxNiw4MCwwLDIwLDEzLDY2LDE0MCwKKwkwLDAsMCwwLDI4LDAsNjQsMTYsMCwwLDAsMCwKKwkzLDEzMSw0LDYwLDMzLDMyLDE0NCwwLDQwLDEzLDEzMiwxNDAsCisJMywxMzEsNSw2MCwzMyw0MCwxNzYsMCw0NCwxMywxNjUsMTQwLAorCTMsMTMxLDYsNjAsMjE2LDEyLDE5OCwxNDAsMywxMzEsNyw2MCwKKwkyMjAsMTIsMjMxLDE0MCwyMCwzNSwxOTIsMTIsMCwwLDAsMCwKKwkxNCwwLDY0LDIwLDAsMCwwLDAsMywxMzEsMyw2MCwKKwkzMywyNCwxMTIsMCw0OCwxMyw5OSwxNDgsMywxMzEsMiw2MCwKKwkzMywxNiw4MCwwLDE2LDEzLDY2LDE0OCwwLDAsMCwwLAorCTUsMCw5OCwyMCwwLDAsMCwwLDE2MSwzNiwxOTIsMTIsCisJMCwwLDAsMCwyMTEsMzksMTkyLDEyLDMzLDMyLDMyLDIsCisJMjQsMCwxOTEsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDMyLDAsMTg5LDM5LDIsMTgsNSwwLAorCTAsMCwxMzAsMTYwLDgsMCwyMjQsMywxLDAsMTMzLDE2MCwKKwkyLDIyLDUsMCwwLDAsMTMwLDE2MCwyLDIwLDUsMCwKKwkxLDAsMTMwLDE2MCwyLDE4LDUsMCwyLDAsMTMwLDE2MCwKKwk4LDAsMjI0LDMsMywwLDEzMywxNjAsMCwwLDEzMCwxNDQsCisJMSwwLDEzMSwxNDQsMCwxOCwyLDAsOCwwLDIyNCwzLAorCTM3LDE2LDk4LDAsMCwwLDEzMCwxNDQsMSwwLDEzMSwxNDQsCisJMiwwLDEzMywxNDQsMCwyMiwyLDAsMCwyOCwzLDAsCisJMzMsMTYsNjcsMCwwLDQyLDUsMCwzLDAsMTMxLDE0NCwKKwkzMywxNiw2OSwwLDgsMCwyMjQsMywzNywxNiw2NywwLAorCTIyNCwyNTUsMTg5LDM5LDE2LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsCisJMjQsMCwxOTEsMTc1LDIwLDAsMTc3LDE3NSw0OCwxMjksMTM1LDM5LAorCTMsMCwyMjYsMTM2LDAsMCwyMjYsMTUyLDQsMCwyMjcsMTI4LAorCTUsMCwyMjgsMTI4LDMsMCwyLDE3MCwwLDAsMiwxODYsCisJNCwwLDMsMTYyLDUsMCw0LDE2MiwzLDAsMTYyLDEzNiwKKwkwLDAsMTYyLDE1Miw0LDAsMTYzLDEyOCw1LDAsMTY0LDEyOCwKKwk5LDAsMiwxNzAsNiwwLDIsMTg2LDEwLDAsMywxNjIsCisJMTEsMCw0LDE2MiwxMiwwLDQsMzgsMzgsMCw1LDM2LAorCTE0NCw0MSwxOTIsMTIsMzMsMTM2LDE5MiwwLDE0LDAsNCwzOCwKKwkxNDQsNDEsMTkyLDEyLDY2LDY2LDUsMzYsMTcsMCw0LDM4LAorCTMzLDQwLDAsMCwzLDAsMiwzNiwxNDQsNDEsMTkyLDEyLAorCTE2LDAsMiwxNjIsMTksMCwwLDE2MiwyMCwwLDAsMTYyLAorCTQwLDAsMzQsMTQyLDAsMCwwLDAsNDMsMzIsMiwwLAorCTM2LDAsMzQsMTQyLDAsMCwwLDAsMywwLDY0LDE2LAorCTMzLDI0LDEyOCwwLDIxOCw0MSwxOTIsOCwxMjgsMCwxMzAsNTIsCisJMzMsMTYsOTYsMCwyMSwwLDIsMTYyLDQsMCwzNywxNTAsCisJMCwwLDAsMCwxNDQsNDEsMTkyLDEyLDIyLDAsNCwzOCwKKwk5LDAsMzQsMTM4LDYsMCwzNCwxNTQsMTAsMCwzNSwxMzAsCisJMTEsMCwzNiwxMzAsMjcsMCwyLDE3MCwyNCwwLDIsMTg2LAorCTI4LDAsMywxNjIsMjksMCw0LDE2MiwxMiwwLDM3LDE0MiwKKwkwLDAsMCwwLDE0OCw0MSwxOTIsMTIsMzAsMCw0LDM4LAorCTE2LDAsMzcsMTUwLDAsMCwwLDAsMTQ0LDQxLDE5MiwxMiwKKwkzNCwwLDQsMzgsMjEsMCwzNCwxMzgsMTgsMCwzNCwxNTQsCisJMjIsMCwzNSwxMzAsMjMsMCwzNiwxMzAsMzksMCwyLDE3MCwKKwkzNiwwLDIsMTg2LDQwLDAsMywxNjIsNDEsMCw0LDE2MiwKKwkyNCwwLDM3LDE1MCwwLDAsMCwwLDE0NCw0MSwxOTIsMTIsCisJNDIsMCw0LDM4LDI2LDAsMzcsMTUwLDAsMCwwLDAsCisJMTQ0LDQxLDE5MiwxMiw0NCwwLDQsMzgsMjgsMCwzNywxNTAsCisJMCwwLDAsMCwxNDQsNDEsMTkyLDEyLDQ2LDAsNCwzOCwKKwkzMCwwLDM3LDE1MCwwLDAsMCwwLDE0NCw0MSwxOTIsMTIsCisJNDgsMCw0LDM4LDMyLDAsMzcsMTUwLDAsMCwwLDAsCisJMTQ0LDQxLDE5MiwxMiw1MCwwLDQsMzgsNTIsMCwyLDM2LAorCTI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywzMiwwLDE4OSwzOSwyMjQsMjU1LDE4OSwzOSwKKwkxNiwwLDE3NiwxNzUsMzMsMTI4LDE2MCwwLDI0LDAsMTkxLDE3NSwKKwkyMCwwLDE3NywxNzUsMjEsMCwyLDE0NiwzMywxMzYsMTI4LDAsCisJMSwwLDY2LDQ4LDQwLDAsMzQsMTc0LDIyLDAsMiwxNDYsCisJMjIsMCw0LDM4LDEyOCwwLDY2LDQ4LDE1Niw0MSwxOTIsMTIsCisJMzYsMCwzNCwxNzQsNCwwLDM0LDE2NiwyNywwLDIsMTM4LAorCTI0LDAsMiwxNTQsMjgsMCwzLDEzMCwyOSwwLDQsMTMwLAorCTksMCwzNCwxNzAsNiwwLDM0LDE4NiwxMCwwLDM1LDE2MiwKKwkxMSwwLDM2LDE2MiwxNjEsNDEsMTkyLDEyLDMwLDAsNCwzOCwKKwkzNCwwLDQsMzgsMTU2LDQxLDE5MiwxMiwxMiwwLDM0LDE3NCwKKwkxNiwwLDM0LDE2NiwzOSwwLDIsMTM4LDM2LDAsMiwxNTQsCisJNDAsMCwzLDEzMCw0MSwwLDQsMTMwLDIxLDAsMzQsMTcwLAorCTE4LDAsMzQsMTg2LDIyLDAsMzUsMTYyLDIzLDAsMzYsMTYyLAorCTE1Niw0MSwxOTIsMTIsNDIsMCw0LDM4LDQ0LDAsNCwzOCwKKwkxNTYsNDEsMTkyLDEyLDI0LDAsMzQsMTY2LDQ2LDAsNCwzOCwKKwkxNTYsNDEsMTkyLDEyLDI2LDAsMzQsMTY2LDQ4LDAsNCwzOCwKKwkxNTYsNDEsMTkyLDEyLDI4LDAsMzQsMTY2LDUwLDAsNCwzOCwKKwkxNTYsNDEsMTkyLDEyLDMwLDAsMzQsMTY2LDMyLDAsMzQsMTY2LAorCTI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywzMiwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwKKwkxNiwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLDIwLDAsMTkxLDE3NSwKKwk0OCwxMjksMTM0LDM5LDMsMCwxOTQsMTM2LDAsMCwxOTQsMTUyLAorCTQsMCwxOTUsMTI4LDUsMCwxOTYsMTI4LDMsMCwyLDE3MCwKKwkwLDAsMiwxODYsNCwwLDMsMTYyLDUsMCw0LDE2MiwKKwkzLDAsMTYyLDEzNiwwLDAsMTYyLDE1Miw0LDAsMTYzLDEyOCwKKwk1LDAsMTY0LDEyOCw5LDAsMiwxNzAsNiwwLDIsMTg2LAorCTEwLDAsMywxNjIsMTEsMCw0LDE2MiwxMiwwLDQsMzgsCisJMTQ0LDQxLDE5MiwxMiw3LDAsNSwzNiwxNCwwLDQsMzgsCisJMTQ0LDQxLDE5MiwxMiw2Niw2Niw1LDM2LDE3LDAsNCwzOCwKKwkzMyw0MCwwLDAsMywwLDIsMzYsMTQ0LDQxLDE5MiwxMiwKKwkxNiwwLDIsMTYyLDIxLDAsMiwzNiwxMjgsMCwzLDM2LAorCTE5LDAsMCwxNjIsMjAsMCwzLDE2MiwyMCwwLDE5MSwxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywyNCwwLDE4OSwzOSwKKwkxNzYsMjU1LDE4OSwzOSw2OCwwLDE3NywxNzUsNjQsMCwxNzYsMTc1LAorCTMzLDEyOCwxNjAsMCw3MiwwLDE5MSwxNzUsMTQsMCwzLDE0NiwKKwk2NiwwLDIsMzYsOSwwLDk4LDIwLDMzLDEzNiwxMjgsMCwKKwkxNSwwLDIsMTQ2LDAsMCwwLDAsNiwwLDY3LDIwLAorCTY0LDI2LDE3LDAsMTYsMCwzLDE0NiwzLDAsMiwzNiwKKwkxMSwwLDk4LDE2LDAsMCwwLDAsNjQsMjYsMTcsMCwKKwkyLDEzMSwyLDYwLDMzLDE2LDY3LDAsMTg0LDI0Nyw2NiwxNDAsCisJMCwwLDAsMCwxLDAsNjYsMzYsMiwxMzEsMSw2MCwKKwkzMyw4LDM1LDAsMTgyLDQyLDE5Miw4LDE4NCwyNDcsMzQsMTcyLAorCTIwLDAsMywxNDYsMCwwLDAsMCw1LDAsOTYsMTYsCisJMTI4LDAsMiwzNiwyMSwwLDk4LDE2LDY0LDI2LDE3LDAsCisJMTc5LDQyLDE5Miw4LDAsMCwwLDAsMTYsMCwxNjQsMzksCisJNjQsMjYsMTcsMCwyLDEzMSwyLDYwLDMzLDE2LDY3LDAsCisJMTgwLDI0Nyw2NiwxNDAsMCwwLDAsMCwxLDAsNjYsMzYsCisJMiwxMzEsMSw2MCwzMyw4LDM1LDAsMTgwLDI0NywzNCwxNzIsCisJMTcsNDIsMTkyLDEyLDMzLDQwLDAsMiwzMywzMiwzMiwyLAorCTE2LDAsMTY1LDM5LDIyMiw0MCwxOTIsMTIsMzMsNDgsMCwyLAorCTE4Miw0MiwxOTIsOCwwLDAsMCwwLDIsMTMxLDIsNjAsCisJMzMsMTYsNjcsMCwxODAsMjQ3LDY2LDE0MCwwLDAsMCwwLAorCTEsMCw2NiwzNiwyLDEzMSwxLDYwLDMzLDgsMzUsMCwKKwkxODAsMjQ3LDM0LDE3MiwxMDAsNDEsMTkyLDEyLDMzLDMyLDMyLDIsCisJMTgyLDQyLDE5Miw4LDAsMCwwLDAsMTEyLDEyOSwxMzIsMzksCisJMTUsNjMsMTkyLDEyLDAsMCwwLDAsNzIsMCwxOTEsMTQzLAorCTY4LDAsMTc3LDE0Myw2NCwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTgwLDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTEsMCwxNjIsNDgsOCwwLDY0LDE2LDI1NSwyNTUsMTk4LDQ4LAorCTY3LDQwLDUsMCw2NCwxNiw1LDAsMzMsMTYsNjgsMCwKKwkwLDAsNjYsMTQ0LDAsMCwwLDAsMjAzLDQyLDE5Miw4LAorCTMzLDQ4LDE5NCwwLDY3LDQwLDUsMCwyNTUsMjU1LDE2NSwzNiwKKwkyNTUsMjU1LDIsMzYsNiwwLDE2MiwxNiwyNTUsMjU1LDMsMzYsCisJMCwwLDEzMCwxNDgsMiwwLDEzMiwzNiwyNTUsMjU1LDE2NSwzNiwKKwkyNTIsMjU1LDE2MywyMCwzMyw0OCwxOTQsMCwyNTUsMjU1LDE5NSw0OCwKKwkyLDIwLDYsMCwzMyw0OCw5OCwwLDI1NSwyNTUsMTk1LDQ4LAorCTIsMjAsNiwwLDMzLDQ4LDk4LDAsOCwwLDIyNCwzLAorCTI1NSwyNTUsMTk0LDQ4LDIwOCwyNTUsMTg5LDM5LDE2LDAsMTc2LDE3NSwKKwkzMywxMjgsMTI4LDAsMjgsMCwxNzksMTc1LDMzLDE1MiwxNjAsMCwKKwkyNCwwLDE3OCwxNzUsMzMsMTQ0LDE5MiwwLDM2LDAsMTgxLDE3NSwKKwkzMywxNjgsMCwyLDMyLDAsMTgwLDE3NSwzMywxNjAsMCwwLAorCTQwLDAsMTkxLDE3NSwyMCwwLDE3NywxNzUsMTIsMCwzLDE0MiwKKwkwLDAsMiwxNDIsMCwwLDAsMCwzNSwyNCw5OCwwLAorCTQyLDE2LDExNCwwLDIsMCw2NCwxNiwzMywxMzYsNjQsMiwKKwkzMywxMzYsOTYsMCwxMywwLDMyLDE4LDMzLDQwLDk2LDIsCisJMzUsMTQ0LDgxLDIsOCwwLDIsMTQyLDAsMCw0LDE0MiwKKwkzMyw0OCwzMiwyLDgwLDY4LDE5MiwxMiwzMywzMiw2OCwwLAorCTgsMCwyLDE0MiwwLDAsMiwxNDIsMCwwLDIsMTQyLAorCTMzLDE1MiwxMTMsMiwzMywxNiw4MSwwLDAsMCwyLDE3NCwKKwkwLDAsMiwxNDIsMCwwLDAsMCw0LDAsNjQsMTgsCisJMzMsMTYwLDEzMCwyLDQsMCwxNiwxNDIsMjMzLDQyLDE5Miw4LAorCTAsMCwwLDAsMTgsMCwxODAsMTY2LDMzLDE2LDAsMiwKKwk0MCwwLDE5MSwxNDMsMzYsMCwxODEsMTQzLDMyLDAsMTgwLDE0MywKKwkyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDQ4LDAsMTg5LDM5LAorCTIyNCwyNTUsMTg5LDM5LDI0LDAsMTc4LDE3NSwzMywxNDQsMTI4LDAsCisJMiwxMzEsNCw2MCwxOTIsNCwxMzIsMzYsMzYsMCwxNjUsMTc1LAorCTEsMCw1LDM2LDI4LDAsMTkxLDE3NSwyMCwwLDE3NywxNzUsCisJNTQsMjEsMTkyLDEyLDE2LDAsMTc2LDE3NSwzMywxMzYsNjQsMCwKKwk4LDAsMzIsMjIsMzMsNDAsMCwwLDIsMTMxLDIsNjAsCisJMTc2LDUsNjYsMTQwLDAsMCwwLDAsMSwwLDY2LDM2LAorCTIsMTMxLDEsNjAsMTAyLDQzLDE5Miw4LDE3Niw1LDM0LDE3MiwKKwkwLDEsMywzNiw4LDAsNDgsMTQyLDgsMCwyLDM2LAorCTE2LDAsMiwxNjYsNiwwLDIsMzYsMTgsMCwyLDE2MiwKKwk0LDAsMiwzNiwxNCwwLDMsMTY2LDE5LDAsMiwxNjIsCisJMjAsMCwzLDE2NiwyLDEzMSw2LDYwLDIxMiw0LDE5OCwzNiwKKwkzLDAsMTk0LDEzNiwwLDAsMTk0LDE1Miw0LDAsMTk1LDEzMiwKKwkyNSwwLDIsMTcwLDIyLDAsMiwxODYsMjYsMCwzLDE2NiwKKwkyLDEzMSwxLDYwLDE5NSwyMTEsMzQsMTM2LDE3NiwxMzMsMTMwLDE1NSwKKwkwLDAsMCwwLDMxLDAsMiwxNzAsMjgsMCwyLDE4NiwKKwkzMiwwLDQsMzgsMTQ0LDcxLDE5MiwxMiw2LDAsNiwzNiwKKwkzOSwwLDE2MiwxMzksMzYsMCwxNjIsMTU1LDAsMCwwLDAsCisJNDEsMCwyLDE3MCwzOCwwLDIsMTg2LDEzMiwxMjksMTMzLDM5LAorCTMsMCwxNjIsMTM2LDAsMCwxNjIsMTUyLDQsMCwxNjMsMTI4LAorCTUsMCwxNjQsMTI4LDMsMCwyLDE3MCwwLDAsMiwxODYsCisJNCwwLDMsMTYyLDUsMCw0LDE2MiwyLDEzMSw1LDYwLAorCTIxMiw0LDE2NSwzNiwzLDAsMTYyLDEzNiwwLDAsMTYyLDE1MiwKKwk0LDAsMTYzLDEyOCw1LDAsMTY0LDEyOCw5LDAsMiwxNzAsCisJNiwwLDIsMTg2LDEwLDAsMywxNjIsMTEsMCw0LDE2MiwKKwkzMywzMiw2NCwyLDgsNiwyLDM2LDEyLDAsMiwxNjYsCisJNjAsMTI4LDIsNTIsMCwwLDM0LDE3NCw2MCwwLDIsMzYsCisJMTgsMCwzNCwxNjYsNzQsMjEsMTkyLDEyLDMzLDQwLDMyLDIsCisJMywwLDY0LDIwLDAsMCwwLDAsMTUyLDIxLDE5MiwxMiwKKwkzMywzMiwzMiwyLDI4LDAsMTkxLDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMzIsMCwxODksMzksMjE2LDI1NSwxODksMzksMzIsMCwxODAsMTc1LAorCTMzLDE2MCwxMjgsMCwxNiwwLDE3NiwxNzUsMzMsMTI4LDE2MCwwLAorCTM2LDAsMTkxLDE3NSwyOCwwLDE3OSwxNzUsMjQsMCwxNzgsMTc1LAorCTIwLDAsMTc3LDE3NSw4LDAsMiwxNDIsMzMsMTUyLDE5MiwwLAorCTMzLDEzNiw4MywwLDYsMCwzNSwxNTAsMCwxLDQsMzYsCisJNSwwLDEwMCwxNiwwLDIsMiwzNiwxMTMsMCw5OCwxNiwKKwkwLDAsMCwwLDE1LDQ0LDE5Miw4LDAsMCwwLDAsCisJMjQsMCwzNSwxNTAsMTc2LDEzMywxMzAsMTUxLDAsMCwwLDAsCisJMTM5LDAsOTgsMjAsMCwwLDAsMCwyNiwwLDM1LDE1MCwKKwkyLDEzMSwyLDYwLDE5NCwyMTEsNjYsMTQ4LDAsMCwwLDAsCisJMTMzLDAsOTgsMjAsMCwwLDAsMCwwLDAsMzQsMTUwLAorCTAsMCwwLDAsMTI5LDAsNjgsMjAsOCwwLDIsMzYsCisJMiwwLDM1LDE1MCwwLDAsMCwwLDEyNSwwLDk4LDIwLAorCTYsNCwyLDM2LDQsMCwzNSwxNTAsMCwwLDAsMCwKKwkxMjEsMCw5OCwyMCwwLDAsMCwwLDIsMTMxLDQsNjAsCisJMTkyLDQsMTMyLDM2LDU0LDIxLDE5MiwxMiwxLDAsNSwzNiwKKwkzMywxNDQsNjQsMCw4LDAsNjQsMjIsMCwwLDAsMCwKKwkyLDEzMSwyLDYwLDE3Niw1LDY2LDE0MCwwLDAsMCwwLAorCTEsMCw2NiwzNiwyLDEzMSwxLDYwLDE1LDQ0LDE5Miw4LAorCTE3Niw1LDM0LDE3Miw4LDAsNSwxNDIsOCwwLDgwLDE0MiwKKwk5LDAsMTYyLDEzNiw2LDAsMTYyLDE1MiwxMCwwLDE2MywxMjgsCisJMTEsMCwxNjQsMTI4LDMsMCwyLDE3MCwwLDAsMiwxODYsCisJNCwwLDMsMTYyLDUsMCw0LDE2MiwyLDEzMSw2LDYwLAorCTIxMiw0LDE5OCwzNiwzLDAsMTk0LDEzNiwwLDAsMTk0LDE1MiwKKwk0LDAsMTk1LDEyOCw1LDAsMTk2LDEyOCw5LDAsMiwxNzAsCisJNiwwLDIsMTg2LDEwLDAsMywxNjIsMTEsMCw0LDE2MiwKKwkxMiwwLDQsMzgsMTIsMCwxNjUsMzYsMzMsMTI4LDE5LDIsCisJODAsNjgsMTkyLDEyLDI0NCwyNTUsMTAyLDM4LDAsMSwyLDM2LAorCTAsMCwyLDE2Niw4LDAsMiwzNiwyLDAsMiwxNjYsCisJNiwwLDIsMzYsNCwwLDIsMTYyLDQsMCwyLDM2LAorCTUsMCwyLDE2MiwwLDIsMiwzNiw2LDAsMiwxNjYsCisJMiwxMzEsNSw2MCwyMTIsNCwxNjUsMzYsMywwLDE2MiwxMzYsCisJMCwwLDE2MiwxNTIsNCwwLDE2MywxMzIsMTEsMCwyLDE3MCwKKwk4LDAsMiwxODYsMTIsMCwzLDE2NiwyLDEzMSwxLDYwLAorCTE5NSwyMTEsMzQsMTM2LDE3NiwxMzMsMTMwLDE1NSwwLDAsMCwwLAorCTE3LDAsMiwxNzAsMTQsMCwyLDE4NiwxMSwwLDM0LDEzOCwKKwk4LDAsMzQsMTU0LDEyLDAsMzUsMTM0LDIxLDAsMiwxNzAsCisJMTgsMCwyLDE4NiwyMiwwLDMsMTY2LDE3LDAsMzQsMTM4LAorCTE0LDAsMzQsMTU0LDAsMCwwLDAsMjcsMCwyLDE3MCwKKwkyNCwwLDIsMTg2LDMzLDMyLDEyOCwyLDMzLDQwLDY0LDIsCisJNjAsMTI4LDIsNTIsMCwwLDY2LDE3NCw2MCwwLDIsMzYsCisJNzQsMjEsMTkyLDEyLDE4LDAsNjYsMTY2LDM4LDAsNjQsMjAsCisJMCwwLDAsMCwxNTIsMjEsMTkyLDEyLDMzLDMyLDY0LDIsCisJMTUsNDQsMTkyLDgsMCwwLDAsMCwxNCwwLDM1LDE1MCwKKwkxOTYsMTMzLDEzMCwxNTEsMCwwLDAsMCwyOSwwLDk4LDIwLAorCTAsMCwwLDAsMTYsMCwzNSwxNTAsMiwxMzEsMiw2MCwKKwkyMTQsMjExLDY2LDE0OCwwLDAsMCwwLDIzLDAsOTgsMjAsCisJMCwwLDAsMCwwLDAsMzQsMTUwLDAsMCwwLDAsCisJMTksMCw2OCwyMCw4LDAsMiwzNiwyLDAsMzUsMTUwLAorCTAsMCwwLDAsMTUsMCw5OCwyMCw2LDQsMiwzNiwKKwk0LDAsMzUsMTUwLDAsMCwwLDAsMTEsMCw5OCwyMCwKKwkwLDAsMCwwLDY4LDEzMywxMzAsMTQzLDE0MCwxMjksMTM0LDM5LAorCTExLDAsMzUsMTM4LDgsMCwzNSwxNTQsMTIsMCwzNiwxMzQsCisJMywwLDE5NSwxNjgsMCwwLDE5NSwxODQsNCwwLDE5NiwxNjQsCisJMjAsMCw2NiwzNiwxNTIsMTI5LDEzMCwxNzUsMzYsMCwxOTEsMTQzLAorCTMyLDAsMTgwLDE0MywyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQwLDAsMTg5LDM5LDE5MiwyNTUsMTg5LDM5LDgwLDAsMTY5LDE0MywKKwk4NCwwLDE2OCwxNDMsNTYsMCwxODAsMTc1LDMzLDE2MCwxMjgsMCwKKwk0NCwwLDE3NywxNzUsODgsMCwxNzcsMTQzLDE2LDAsMTY0LDM5LAorCTUyLDAsMTc5LDE3NSw5MiwwLDE3OSwxNDMsMywxMzEsMyw2MCwKKwkzMiwxNyw5OSwzNiw0MCwwLDE3NiwxNzUsMzMsMTI4LDE5MiwwLAorCTYwLDAsMTkxLDE3NSw0OCwwLDE3OCwxNzUsMCwwLDk4LDE0MCwKKwk4LDAsNTAsMTQyLDEsMCw2NiwzNiwwLDAsOTgsMTcyLAorCTMsMCwxNjIsMTM2LDAsMCwxNjIsMTUyLDQsMCwxNjMsMTI4LAorCTUsMCwxNzAsMTI4LDMsMCw2NiwxNzAsMCwwLDY2LDE4NiwKKwk0LDAsNjcsMTYyLDUsMCw3NCwxNjIsMiwxMzEsMTAsNjAsCisJMjEyLDQsNzQsMzcsMywwLDY2LDEzNywwLDAsNjYsMTUzLAorCTQsMCw2NywxMjksNSwwLDY5LDEyOSw5LDAsNjYsMTcwLAorCTYsMCw2NiwxODYsMTAsMCw2NywxNjIsMTEsMCw2OSwxNjIsCisJNjksMCwyLDM2LDE2LDAsMTYyLDE2MywxNywwLDE2OCwxNjMsCisJMTgsMCwzNCwxNTAsMjQwLDEzMiwxMzEsMTQzLDMzLDQ4LDAsMCwKKwkyNSwwLDE2OSwxNjMsMjAsMCw2NiwzNiwwLDY2LDIsMCwKKwkyNTUsMjU1LDY2LDQ4LDIsMTgsMiwwLDM3LDY0LDIsMSwKKwkwLDc0LDMsMCwyNTUsMjU1LDk4LDQ4LDIsMTgsMiwwLAorCTM3LDcyLDM0LDEsMywxMzEsMiw2MCwwLDE3LDY2LDE0MCwKKwkyMiwwLDE2MCwxNjcsMjYsMCwxNjAsMTY3LDE4LDAsMTY4LDE2NywKKwkxNzYsMTMzLDEzNiwxNDMsMSwwLDk5LDM2LDI0MCwxMzIsMTMxLDE3NSwKKwkyMCwwLDE2OSwxNjcsMjQsMCwxNjIsMTYzLDI4LDAsMTY4LDE3NSwKKwkzLDAsMjI2LDEzNiwwLDAsMjI2LDE1MiwwLDAsMCwwLAorCTM1LDAsMTYyLDE3MSwzMiwwLDE2MiwxODcsMTkyLDQyLDE5MiwxMiwKKwkyMCwwLDUsMzYsMzksMTYsMiwwLDI2LDAsMTYyLDE2NywKKwkxNCwwLDIsMzYsNDQsMCwyLDIyLDgsMCwyLDM2LAorCTEyLDAsNjYsMTY2LDE5LDAsMTYyLDEzOSwxNiwwLDE2MiwxNTUsCisJMjMsMCwxNjMsMTM5LDIwLDAsMTYzLDE1NSwyNywwLDE2NCwxMzksCisJMjQsMCwxNjQsMTU1LDMxLDAsMTY1LDEzOSwyOCwwLDE2NSwxNTUsCisJMTcsMCw2NiwxNzAsMTQsMCw2NiwxODYsMjEsMCw2NywxNzAsCisJMTgsMCw2NywxODYsMjUsMCw2OCwxNzAsMjIsMCw2OCwxODYsCisJMjksMCw2OSwxNzAsMjYsMCw2OSwxODYsMzUsMCwxNjIsMTM5LAorCTMyLDAsMTYyLDE1NSwwLDAsMCwwLDMzLDAsNjYsMTcwLAorCTMwLDAsNjYsMTg2LDM0LDAsMiwzNiwwLDAsMzQsMTc0LAorCTAsMCwzNSwxNDIsMTgsMCwzNCwxNTAsMCwwLDAsMCwKKwkzMywxNiw2NywwLDE4LDAsMzQsMTY2LDE4LDAsMzQsMTUwLAorCTAsMCwwLDAsNjAsMCw2Niw0NCw2OCwwLDY0LDE2LAorCTMzLDMyLDEyOCwyLDAsMCw5OCwxNDIsMTgsMCwzNSwxNTAsCisJNjAsMCw2NiwzNiwzNSwxNiw2NywwLDAsMCw5OCwxNzQsCisJNjAsMCwyLDM2LDE4LDAsMzQsMTY2LDIwMSw0NCwxOTIsOCwKKwkzMywzMiwxMjgsMiwxNjQsMTI5LDEzMywzOSwzLDAsMTYyLDEzNiwKKwkwLDAsMTYyLDE1Miw0LDAsMTYzLDEyOCw1LDAsMTY0LDEyOCwKKwkxNywwLDY2LDE3MCwxNCwwLDY2LDE4NiwxOCwwLDY3LDE2MiwKKwkxOSwwLDY4LDE2Miw4LDAsMiwzNiwyMCwwLDY2LDE2NiwKKwkxOSwwLDE2MiwxMzksMTYsMCwxNjIsMTU1LDIzLDAsMTYzLDEzOSwKKwkyMCwwLDE2MywxNTUsMjcsMCwxNjQsMTM5LDI0LDAsMTY0LDE1NSwKKwkzMSwwLDE2NSwxMzksMjgsMCwxNjUsMTU1LDI1LDAsNjYsMTcwLAorCTIyLDAsNjYsMTg2LDI5LDAsNjcsMTcwLDI2LDAsNjcsMTg2LAorCTMzLDAsNjgsMTcwLDMwLDAsNjgsMTg2LDM3LDAsNjksMTcwLAorCTM0LDAsNjksMTg2LDM1LDAsMTYyLDEzOSwzMiwwLDE2MiwxNTUsCisJMCwwLDAsMCw0MSwwLDY2LDE3MCwzOCwwLDY2LDE4NiwKKwk0MiwwLDIsMzYsMCwwLDM0LDE3NCwwLDAsMzUsMTQyLAorCTE4LDAsMzQsMTUwLDAsMCwwLDAsMzMsMTYsNjcsMCwKKwkxOCwwLDM0LDE2NiwxOCwwLDM0LDE1MCwwLDAsMCwwLAorCTYwLDAsNjYsNDQsOCwwLDY0LDE2LDAsMCwwLDAsCisJMCwwLDk4LDE0MiwxOCwwLDM1LDE1MCw2MCwwLDY2LDM2LAorCTM1LDE2LDY3LDAsMCwwLDk4LDE3NCw2MCwwLDIsMzYsCisJMTgsMCwzNCwxNjYsMTgsMCwzNCwxNTAsMCwwLDAsMCwKKwkwLDI2LDIsMCwyLDE4LDIsMCwzNywyNCw5OCwwLAorCTEyLDAsNjcsMTY2LDMzLDMyLDEyOCwyLDc0LDIxLDE5MiwxMiwKKwkzMyw0MCwzMiwyLDgsMCw2NCwyMCwzMywzMiwzMiwyLAorCTMsMTMxLDMsNjAsMzYsMTcsOTksMzYsMCwwLDk4LDE0MCwKKwkwLDAsMCwwLDEsMCw2NiwzNiwxNTIsMjEsMTkyLDEyLAorCTAsMCw5OCwxNzIsNjAsMCwxOTEsMTQzLDU2LDAsMTgwLDE0MywKKwk1MiwwLDE3OSwxNDMsNDgsMCwxNzgsMTQzLDQ0LDAsMTc3LDE0MywKKwk0MCwwLDE3NiwxNDMsOCwwLDIyNCwzLDY0LDAsMTg5LDM5LAorCTE3NiwyNTUsMTg5LDM5LDU2LDAsMTgwLDE3NSwxMTIsMCwxODAsMTQzLAorCTQ4LDAsMTc4LDE3NSwxMDAsMCwxNzgsMTQzLDUyLDAsMTc5LDE3NSwKKwkxMDQsMCwxNzksMTQzLDY0LDAsMTgyLDE3NSwzMywxNzYsMTI4LDAsCisJNzIsMCwxOTAsMTc1LDMzLDI0MCwxNjAsMCw2MCwwLDE4MSwxNzUsCisJMzMsMTY4LDIyNCwwLDY4LDAsMTgzLDE3NSwxMDgsMCwxODMsMTQzLAorCTIsMTMxLDQsNjAsMTkyLDQsMTMyLDM2LDc2LDAsMTkxLDE3NSwKKwk0NCwwLDE3NywxNzUsNDAsMCwxNzYsMTc1LDMyLDAsMTY2LDE3NSwKKwk3LDIsMTMwLDM4LDIsMTMwLDIsMCw1NCwyMSwxOTIsMTIsCisJMzMsNDAsMCwyLDMzLDEzNiw2NCwwLDgsMCwzMiwyMiwKKwkwLDc0LDE4LDAsMiwxMzEsNCw2MCwyMzIsMTQ2LDEzMiwzNiwKKwkzMyw0MCwxMjgsMiwxNSw2MywxOTIsMTIsMzMsNDgsMCwyLAorCTc0LDQ1LDE5Miw4LDAsMCwwLDAsMjU1LDI1NSw2Niw1MCwKKwkyLDE4LDIsMCwzNyw3MiwzNCwxLDAsNjYsMTksMCwKKwkyNTUsMjU1LDk4LDUwLDIsMTgsMiwwLDM3LDY0LDIsMSwKKwk4LDAsMTMwLDM4LDAsNTgsMiwwLDI1NSwyNTUsNjYsNDgsCisJMiwxOCwyLDAsMzcsNTYsMjI2LDAsMCwxNjMsNCw2MCwKKwkyMjAsNSwxMzIsNTIsNCwwLDUsMzYsNCwwLDM0LDE0MiwKKwkwLDE3LDYsMzYsOCwwLDgwLDE0MCw0LDAsMzUsMTQyLAorCTgsMCwyLDM2LDAsMCw5OCwxNzIsMCwwLDksMTY2LAorCTIsMCw4LDE2Niw2LDAsMCwxNjYsMTkyLDQyLDE5MiwxMiwKKwk0LDAsNywxNjYsMzMsMzIsMTYwLDIsNCwwLDUsMzYsCisJMTkyLDQyLDE5MiwxMiwyNTUsMjU1LDcwLDQ4LDQsMCw0LDM4LAorCTIsMCw1LDM2LDE5Miw0MiwxOTIsMTIsMjU1LDI1NSw3MCw0OCwKKwkzMywzMiwwLDIsOCwwLDUsMzYsMTkyLDQyLDE5MiwxMiwKKwkyNTUsMjU1LDcwLDQ4LDMzLDMyLDIyNCwyLDMzLDQwLDEyOCwyLAorCTE5Miw0MiwxOTIsMTIsMjU1LDI1NSw3MCw0OCwzOSwyNCwyLDAsCisJMjU1LDI1NSw5OCw0OCwyLDAsNjQsMjAsMzMsNDAsMjI0LDIsCisJMjU1LDI1NSwzLDUyLDYsMCwzLDE2Niw0LDAsMzYsMTQyLAorCTAsMCwwLDAsMjIwLDQyLDE5MiwxMiwzMyw0OCwxMjgsMiwKKwkzMywzMiwxOTIsMiwwLDAsNjcsMTQwLDMzLDQwLDE5MiwzLAorCTAsMTI4LDk5LDUyLDAsMCw2NywxNzIsNCwwLDM1LDE0MiwKKwkzMiwwLDE2NiwxNDMsMTgsMCw5OSwxNDgsMzMsNTYsMTYwLDIsCisJMTgsMCwzNSwxNjYsOTYsMCwxNzAsMTQzLDE3LDAsMywzNiwKKwkxNiwwLDE2MywxNzUsMjQsMCwxNzcsMTc1LDI4LDAsMTYyLDE3NSwKKwkyMyw0NCwxOTIsMTIsMjAsMCwxNzAsMTc1LDMsMTMxLDMsNjAsCisJMTI0LDE3LDk5LDM2LDAsMCw5OCwxNDAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMCwwLDk4LDE3Miw3NiwwLDE5MSwxNDMsCisJNzIsMCwxOTAsMTQzLDY4LDAsMTgzLDE0Myw2NCwwLDE4MiwxNDMsCisJNjAsMCwxODEsMTQzLDU2LDAsMTgwLDE0Myw1MiwwLDE3OSwxNDMsCisJNDgsMCwxNzgsMTQzLDQ0LDAsMTc3LDE0Myw0MCwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDgwLDAsMTg5LDM5LDEyOCwyNTUsMTg5LDM5LAorCTExNiwwLDE4MywxNzUsMzMsMTg0LDEyOCwwLDExMiwwLDE4MiwxNzUsCisJMzMsMTc2LDE2MCwwLDEwNCwwLDE4MCwxNzUsMzMsMTYwLDE5MiwwLAorCTEwOCwwLDE4MSwxNzUsMzMsMTY4LDIyNCwwLDQwLDAsMTY0LDM5LAorCTk2LDAsMTc4LDE3NSwxNDQsMCwxNzgsMTQzLDMzLDQwLDAsMCwKKwkxMDAsMCwxNzksMTc1LDE0OCwwLDE3OSwxNDMsMTYsMCw2LDM2LAorCTEyMCwwLDE5MSwxNzUsOTIsMCwxNzcsMTc1LDE0NCw3MSwxOTIsMTIsCisJODgsMCwxNzYsMTc1LDU2LDAsMTc3LDM5LDMzLDMyLDMyLDIsCisJMzMsNDAsMCwwLDIsMCwxNiwzNiw0MCwwLDE3NiwxNjcsCisJMiwwLDE2MiwxNTAsMCwwLDAsMCw0MiwwLDE2MiwxNjcsCisJMTksMCwxMzAsMTM4LDE2LDAsMTMwLDE1NCwwLDAsMCwwLAorCTQ3LDAsMTYyLDE3MSw0NCwwLDE2MiwxODcsMTQ0LDcxLDE5MiwxMiwKKwkxNiwwLDYsMzYsMzMsMzIsNjQsMiwzMyw0MCw5NiwyLAorCTQwLDAsMTY2LDM5LDMzLDU2LDMyLDIsNTYsMCwxNzYsMTY3LAorCTAsMCwxNjIsMTUwLDIsMTMxLDE2LDYwLDgsMjM5LDE2LDM4LAorCTU4LDAsMTYyLDE2NywxNSwwLDEzMCwxMzgsMTIsMCwxMzAsMTU0LAorCTAsMCwwLDAsNjMsMCwxNjIsMTcxLDYwLDAsMTYyLDE4NywKKwkyNDIsNSwyLDM2LDg0LDAsMTYyLDE2Nyw3MiwwLDE2MiwzOSwKKwk3MiwwLDE2MCwxNjcsNzYsMCwxNzYsMTc1LDgwLDAsMTc2LDE3NSwKKwkyNDcsNzEsMTkyLDEyLDE2LDAsMTYyLDE3NSwyNTUsMjU1LDMsMzYsCisJMjIsMCw2NywxNiwxMiwwLDE0NSwzOCwzMywzMiwyMjQsMiwKKwk2LDAsMTk3LDM4LDM1LDQ4LDE1MCwyLDAsMCwxNjMsMTUwLAorCTQsMCwyLDM2LDE2LDAsMTYyLDE3NSwxNjEsMCwyLDM2LAorCTIwLDAsMTYyLDE3NSwyOCwwLDE3NiwxNzUsMCwxOCwzLDAsCisJMiwyNiwzLDAsMzcsMTYsNjcsMCwyNTUsMjU1LDY2LDQ4LAorCTI0LDAsMTYyLDE3NSw4MCwwLDE2MiwxNDMsNzYsMCwxNjMsMTQzLAorCTMzLDU2LDMyLDIsMzUsMTYsNjcsMCwyNTUsMjU1LDY2LDQ4LAorCTIyMCw0NCwxOTIsMTIsMzIsMCwxNjIsMTc1LDEyMCwwLDE5MSwxNDMsCisJMTE2LDAsMTgzLDE0MywxMTIsMCwxODIsMTQzLDEwOCwwLDE4MSwxNDMsCisJMTA0LDAsMTgwLDE0MywxMDAsMCwxNzksMTQzLDk2LDAsMTc4LDE0MywKKwk5MiwwLDE3NywxNDMsODgsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkxMjgsMCwxODksMzksMTk2LDEzMywxMzAsMTQzLDE4NCwyNTUsMTg5LDM5LAorCTY0LDAsMTkxLDE3NSw2MCwwLDE3NywxNzUsMTA5LDAsNjQsMTYsCisJNTYsMCwxNzYsMTc1LDI1NSwyNTUsMywzNiwxMDYsMCw2NywxNiwKKwkwLDAsMCwwLDE3NiwxMzMsMTMwLDE0MywxNzYsMTMzLDE0NSwzOSwKKwkxMDIsMCw2NCwxNiwwLDAsMCwwLDEwMCwwLDY3LDE2LAorCTAsMCwwLDAsMiwxMzEsMiw2MCw4LDIzOSw2NiwzNiwKKwk0NCwwLDE2MiwxNzUsNDgsMCwxNjIsMTc1LDI0Miw1LDIsMzYsCisJNDAsMCwxNjAsMTY3LDYsMCwxMjgsMTYsNTIsMCwxNjIsMTY3LAorCTEsMCwyLDM2LDIzLDAsMTMwLDE2LDAsMCwwLDAsCisJMzYsNDYsMTkyLDgsMCwwLDAsMCwyLDEzMSwxNiw2MCwKKwkxNjAsMjA0LDE2LDM4LDE1Niw3MSwxOTIsMTIsMzMsMzIsMCwyLAorCTAsMTYzLDQsNjAsNCwxLDEzMiwxNDAsMjA0LDIwNCwzLDYwLAorCTIwNSwyMDQsOTksNTIsMjUsMCwxMzEsMCwzMyw0MCwzMiwyLAorCTMzLDQ4LDAsMiwzMyw1Niw2NCwwLDQwLDAsMTY0LDM5LAorCTE2LDY0LDAsMCwxOTQsMTYsOCwwLDAsMCwwLDAsCisJMTA0LDU2LDE5MiwxMiwxNiwwLDE2MiwxNzUsMjUxLDQ1LDE5Miw4LAorCTMzLDI0LDY0LDAsMywxMzEsMiw2MCwyOCwxOCw2NiwxNDgsCisJMCwwLDAsMCwyLDAsNjYsNDgsNjEsMCw2NCwxNiwKKwkwLDAsMCwwLDIsMTMxLDE2LDYwLDE2MCwyMDQsMTYsMzgsCisJMTU2LDcxLDE5MiwxMiwzMywzMiwwLDIsMCwxNjMsNCw2MCwKKwk0LDEsMTMyLDE0MCwyMDQsMjA0LDMsNjAsMjA1LDIwNCw5OSw1MiwKKwkyNSwwLDEzMSwwLDMzLDQwLDMyLDIsMzMsNDgsMCwyLAorCTMzLDU2LDY0LDAsNDAsMCwxNjQsMzksMTYsNjQsMCwwLAorCTE5NCwxNiw4LDAsMCwwLDAsMCwxMDUsNTcsMTkyLDEyLAorCTE2LDAsMTYyLDE3NSwzMywyNCw2NCwwLDI1NSwyNTUsMiwzNiwKKwkzOSwwLDk4LDE2LDAsMCwwLDAsMTQwLDEyOSwxMzAsMTQ3LAorCTAsMCwwLDAsMSwwLDY2LDQ4LDcsMCw2NCwyMCwKKwkwLDAsMCwwLDY4LDEzMywxMzEsMTQzLDE1MiwxMjksMTMwLDE0MywKKwkwLDAsMCwwLDQzLDE2LDY3LDAsMTEsMCw2NCwxNiwKKwkzMywzMiwwLDAsNjgsMTMzLDEzMSwxNDMsMTQ4LDEyOSwxMzAsMTQzLAorCTAsMCwwLDAsNiwwLDk4LDE2LDMzLDMyLDAsMCwKKwkxOTYsMTMzLDEzMywxNDMsMTQ4LDEyOSwxMzEsMTc1LDE3LDQzLDE5MiwxMiwKKwkzMywzMiwwLDAsMzMsMzIsMCwwLDE0MCwxMjksMTMzLDM5LAorCTE0LDAsNiwzNiw0LDAsMiwzNiwxNiwwLDE2MiwxNzUsCisJMTYyLDAsMiwzNiwyMCwwLDE2MiwxNzUsMjQsMCwxNjIsMTc1LAorCTIsMTMxLDIsNjAsOCwyMzksNjYsMzYsMjgsMCwxNjIsMTc1LAorCTQ4LDAsMTYyLDE0Myw0NCwwLDE2MywxNDMsMTk2LDEzMywxMzUsMzksCisJMzUsMTYsNjcsMCwyNTUsMjU1LDY2LDQ4LDIyMCw0NCwxOTIsMTIsCisJMzIsMCwxNjIsMTc1LDY0LDAsMTkxLDE0Myw2MCwwLDE3NywxNDMsCisJNTYsMCwxNzYsMTQzLDgsMCwyMjQsMyw3MiwwLDE4OSwzOSwKKwkyMDgsMjU1LDE4OSwzOSwzNiwwLDE3OSwxNzUsMzMsMTUyLDEyOCwwLAorCTQwLDAsMTgwLDE3NSwzMywxNjAsMTYwLDAsMzIsMCwxNzgsMTc1LAorCTI0LDAsMTc2LDE3NSwzMywxMjgsMjI0LDAsNDQsMCwxOTEsMTc1LAorCTI4LDAsMTc3LDE3NSw2LDAsMiwxNTAsNjQsMCwxNzcsMTQzLAorCTAsMCwwLDAsMjAsMCw2NCwxNiwzMywxNDQsMTkyLDAsCisJMTIsMCw2OCwzOCw4LDAsNSwzNiwxOTIsNDIsMTkyLDEyLAorCTAsMTcsNiwzNiw0LDAsNCwzOCwyLDAsNSwzNiwKKwkxOTIsNDIsMTkyLDEyLDI1NSwyNTUsNzAsNDgsMzMsMzIsMCwyLAorCTMzLDQwLDMyLDIsMTkyLDQyLDE5MiwxMiwyNTUsMjU1LDcwLDQ4LAorCTI1NSwyNTUsNjYsNDgsMjU1LDI1NSwzLDUyLDQsMCw2NywxNiwKKwkwLDAsMCwwLDMsMTMxLDMsNjAsMTExLDQ2LDE5Miw4LAorCTEyMCwxNyw5OSwzNiw0LDAsMiwxNTAsMCwwLDAsMCwKKwkwLDI2LDIsMCwyLDE4LDIsMCwzNywyNCw5OCwwLAorCTI1NSwyNTUsOTksNDgsNCwwLDExMywxNiw4LDAsNywzOCwKKwkzLDEzMSwzLDYwLDExMSw0NiwxOTIsOCwxMjAsMTcsOTksMzYsCisJMiwwLDIsMTUwLDAsMCwwLDAsMCwyNiwyLDAsCisJMiwxOCwyLDAsMzcsMjQsOTgsMCwyNTUsMjU1LDk5LDQ4LAorCTE2MSwwLDIsMzYsMTUsMCw5OCwyMCwyNDgsMjU1LDQwLDM4LAorCTMzLDMyLDk2LDIsMzMsNDAsMTI4LDIsMywxMzEsMyw2MCwKKwkxMTIsMTcsOTksMzYsMCwwLDk4LDE0MCwzMyw0OCw2NCwyLAorCTE2LDAsMTY3LDE3NSwzMyw1NiwwLDIsMjAsMCwxNjgsMTc1LAorCTEsMCw2NiwzNiw4Niw0NSwxOTIsMTIsMCwwLDk4LDE3MiwKKwkxMTUsNDYsMTkyLDgsMCwwLDAsMCwzLDEzMSwzLDYwLAorCTExNiwxNyw5OSwzNiwwLDAsOTgsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDAsMCw5OCwxNzIsNDQsMCwxOTEsMTQzLAorCTQwLDAsMTgwLDE0MywzNiwwLDE3OSwxNDMsMzIsMCwxNzgsMTQzLAorCTI4LDAsMTc3LDE0MywyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQ4LDAsMTg5LDM5LDE5MiwyNTUsMTg5LDM5LDUyLDAsMTgxLDE3NSwKKwkzMywxNjgsMTI4LDAsNDQsMCwxNzksMTc1LDMzLDE1MiwxNjAsMCwKKwk0OCwwLDE4MCwxNzUsMzMsMTYwLDE5MiwwLDMyLDAsMTc2LDE3NSwKKwkzMywxMjgsMjI0LDAsMzMsMzIsMCwyLDMzLDQ4LDAsMCwKKwk0MCwwLDE3OCwxNzUsODAsMCwxNzgsMTQzLDMsMTMxLDMsNjAsCisJMTQ0LDE2LDk5LDM2LDU2LDAsMTkxLDE3NSwzNiwwLDE3NywxNzUsCisJMCwwLDk4LDE0MCwzMyw0MCw2NCwyLDEsMCw2NiwzNiwKKwkxOTIsNDIsMTkyLDEyLDAsMCw5OCwxNzIsMjU1LDI1NSw2Niw0OCwKKwkyNTUsMjU1LDMsNTIsOCwwLDY3LDE2LDgsMCwyLDM2LAorCTMsMTMxLDIsNjAsMTQ4LDE2LDY2LDE0MCwwLDAsMCwwLAorCTEsMCw2NiwzNiwzLDEzMSwxLDYwLDIxNyw0NiwxOTIsOCwKKwkxNDgsMTYsMzQsMTcyLDAsMCwzLDE1MCwwLDAsMCwwLAorCTU4LDAsOTgsMjAsMjU1LDEsNjksMzgsMiwxMzEsNCw2MCwKKwkxOTIsNCwxMzIsMzYsMywxMzEsMiw2MCwxNzIsMTYsNjYsMTQwLAorCTMsMTMxLDMsNjAsMTk2LDE2LDk5LDE0MCwxLDAsNjYsMzYsCisJMSwwLDk5LDM2LDMsMTMxLDEsNjAsMTcyLDE2LDM0LDE3MiwKKwkzLDEzMSwxLDYwLDE5NiwxNiwzNSwxNzIsNTQsMjEsMTkyLDEyLAorCTIsNDIsNSwwLDMzLDEzNiw2NCwwLDgsMCwzMiwyMiwKKwkzMywzMiwwLDIsMywxMzEsMiw2MCwyMDAsMTYsNjYsMTQwLAorCTAsMCwwLDAsMSwwLDY2LDM2LDMsMTMxLDEsNjAsCisJMjE3LDQ2LDE5Miw4LDIwMCwxNiwzNCwxNzIsMzMsNDAsNjQsMiwKKwkzMyw0OCwwLDAsMCwwLDAsMTYyLDE5Miw0MiwxOTIsMTIsCisJMiwwLDAsMTY2LDMzLDQwLDAsMiwzOSwxNiwyLDAsCisJMiwwLDE2MiwxNjQsNCwwLDM2LDE0MiwwLDAsMCwwLAorCTIyMCw0MiwxOTIsMTIsMzMsNDgsNjQsMiwzMywzMiwxNjAsMiwKKwk2LDAsMTAxLDM4LDM1LDQ4LDE0NywyLDAsMCw2NywxNDAsCisJMTIsMCwxMzUsMzgsMCwxMjgsOTksNTIsMCwwLDY3LDE3MiwKKwkxLDAsMywzNiwxOCwwLDUwLDE2NiwxNiwwLDE2MywxNzUsCisJNCwwLDMsMzYsMjAsMCwxNjMsMTc1LDI0LDAsMTc3LDE3NSwKKwkyMyw0NCwxOTIsMTIsMjgsMCwxNjIsMTc1LDMsMTMxLDIsNjAsCisJMjI4LDE2LDY2LDE0MCwwLDAsMCwwLDEsMCw2NiwzNiwKKwkzLDEzMSwxLDYwLDIyOCwxNiwzNCwxNzIsNTYsMCwxOTEsMTQzLAorCTUyLDAsMTgxLDE0Myw0OCwwLDE4MCwxNDMsNDQsMCwxNzksMTQzLAorCTQwLDAsMTc4LDE0MywzNiwwLDE3NywxNDMsMzIsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw2NCwwLDE4OSwzOSwyMDAsMjU1LDE4OSwzOSwKKwk0NCwwLDE4MSwxNzUsMzMsMTY4LDEyOCwwLDMsMTMxLDMsNjAsCisJNCwxNyw5OSwzNiw0OCwwLDE5MSwxNzUsNDAsMCwxODAsMTc1LAorCTM2LDAsMTc5LDE3NSwzMiwwLDE3OCwxNzUsMjgsMCwxNzcsMTc1LAorCTI0LDAsMTc2LDE3NSwwLDAsOTgsMTQwLDMzLDEzNiwxNjAsMCwKKwkxLDAsNjYsMzYsMCwwLDk4LDE3MiwxOCwwLDM0LDE1MCwKKwkwLDAsMCwwLDI1NSwyNTUsODQsNDgsMjQzLDUsMTMwLDQ2LAorCTgsMCw2NCwyMCwzMywxNTIsMTkyLDAsMywxMzEsMiw2MCwKKwk4LDE3LDY2LDE0MCwwLDAsMCwwLDEsMCw2NiwzNiwKKwkzLDEzMSwxLDYwLDEzMiw0NywxOTIsOCw4LDE3LDM0LDE3MiwKKwkyLDEzMSwxOCw2MCwxOCwyMzMsODIsMzgsMzMsMzIsNjQsMiwKKwkwLDAsNDgsMTQyLDgsMCwzNywxNDIsMjU1LDYzLDE2LDUwLAorCTgwLDY4LDE5MiwxMiwzMyw0OCwwLDIsMCwwLDM0LDE0MiwKKwkwLDAsMCwwLDAsMTI4LDY2LDQ4LDUsMCw2NCwyMCwKKwkzMywxNDQsODAsMiw0LDAsNDksMTQyLDAsMCwwLDAsCisJMSw0NywxOTIsOCwzMywzMiw2NCwyLDIsMTMxLDE4LDYwLAorCTE4LDIzMyw4MiwzOCwzMywxMjgsMTE0LDIsMTYsMCwxNywzOCwKKwkzMywzMiwzMiwyLDE3NiwxMzMsMTMzLDM5LDE2OCw3MSwxOTIsMTIsCisJNCwwLDYsMzYsOSwwLDY0LDE2LDMzLDMyLDMyLDIsCisJMTI4LDEyOSwxMzMsMzksMTY4LDcxLDE5MiwxMiw0LDAsNiwzNiwKKwk0LDAsNjQsMTYsMCwwLDAsMCwzLDEzMSwzLDYwLAorCTEyOCw0NywxOTIsOCwxMiwxNyw5OSwzNiwwLDAsNCwxNDYsCisJNjQsMCwyLDM2LDI0MCwwLDEzMSw0OCw0LDAsOTgsMTYsCisJMTUsMCwxMzAsNDgsMywxMzEsMyw2MCwxMjgsNDcsMTkyLDgsCisJOCwxNyw5OSwzNiwxMjgsMTM2LDIsMCwyMCwwLDM0LDQyLAorCTQsMCw2NCwxNiwzMywzMiwwLDIsMywxMzEsMyw2MCwKKwkxMjgsNDcsMTkyLDgsOCwxNyw5OSwzNiwzMyw0MCwzMiwyLAorCTE5Miw0MiwxOTIsMTIsMzMsNDgsMCwwLDI1NSwyNTUsNjYsNDgsCisJMjU1LDI1NSwzLDUyLDQsMCw2NywxNiwwLDAsMCwwLAorCTMsMTMxLDMsNjAsMTI4LDQ3LDE5Miw4LDgsMTcsOTksMzYsCisJNiwwLDIsMTUwLDAsMCwwLDAsNjMsMjU1LDY2LDQ4LAorCTE4LDAsNjQsMTYsMzMsNTYsMTcsMiwzLDEzMSwzLDYwLAorCTQ4LDE3LDk5LDM2LDAsMCw5OCwxNDAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMCwwLDk4LDE3MiwzLDEzMSwyLDYwLAorCTU2LDE3LDY2LDE0MCwzLDEzMSwzLDYwLDI0LDE3LDk5LDE0MCwKKwkxLDAsNjYsMzYsMSwwLDk5LDM2LDMsMTMxLDEsNjAsCisJNTYsMTcsMzQsMTcyLDMsMTMxLDEsNjAsMTMyLDQ3LDE5Miw4LAorCTI0LDE3LDM1LDE3MiwyLDAsMiwxNTAsMCwwLDAsMCwKKwkwLDI2LDIsMCwyLDE4LDIsMCwzNywyNCw5OCwwLAorCTI1NSwyNTUsOTksNDgsMzUsNjQsMTEzLDAsMzUsMTYsMjQyLDAsCisJMzUsMTYsMTMwLDIsNDIsMTYsNzIsMCw0LDAsNjQsMTYsCisJMSwwLDIsMzYsMywxMzEsMyw2MCwxMjgsNDcsMTkyLDgsCisJMjQsMTcsOTksMzYsOSwwLDMsMTQ2LDAsMCwwLDAsCisJNSwwLDk4LDE2LDE3LDAsMiwzNiwxNSwwLDk4LDE2LAorCTMzLDMyLDE2MCwyLDEyNiw0NywxOTIsOCwwLDAsMCwwLAorCTMzLDMyLDE2MCwyLDMzLDQwLDY0LDIsMywxMzEsMyw2MCwKKwkyOCwxNyw5OSwzNiwwLDAsOTgsMTQwLDMzLDQ4LDAsMiwKKwkxNiwwLDE2OCwxNzUsMSwwLDY2LDM2LDEyMyw0NiwxOTIsMTIsCisJMCwwLDk4LDE3MiwxMzIsNDcsMTkyLDgsMCwwLDAsMCwKKwkzMyw0MCw2NCwyLDMsMTMxLDMsNjAsMjgsMTcsOTksMzYsCisJMCwwLDk4LDE0MCwzMyw0OCwwLDIsMTYsMCwxNjgsMTc1LAorCTEsMCw2NiwzNiw0MSw0NiwxOTIsMTIsMCwwLDk4LDE3MiwKKwkxMzIsNDcsMTkyLDgsMCwwLDAsMCwzLDEzMSwzLDYwLAorCTIwLDE3LDk5LDM2LDAsMCw5OCwxNDAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMCwwLDk4LDE3Miw0OCwwLDE5MSwxNDMsCisJNDQsMCwxODEsMTQzLDQwLDAsMTgwLDE0MywzNiwwLDE3OSwxNDMsCisJMzIsMCwxNzgsMTQzLDI4LDAsMTc3LDE0MywyNCwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDU2LDAsMTg5LDM5LDIzMiwyNTUsMTg5LDM5LAorCTI1NSwwLDEyLDYwLDI1NSwwLDE0MCw1MywwLDI1NSwxMyw2MCwKKwkwLDI1NSwxNzMsNTMsMTYsMCwxNzYsMTc1LDMsMTMxLDE2LDYwLAorCTAsMTcsMTYsMzgsMzMsMzIsMCwyLDMzLDQwLDAsMCwKKwkwLDE2Myw5LDYwLDIyMCw1LDQxLDE0MSwwLDE2MywxMCw2MCwKKwkxNiw2LDc0LDE0MSwwLDE2MywxMSw2MCwyMjQsNSwxMDcsMTQxLAorCTIwLDAsMTkxLDE3NSwwLDI4LDksMCwyLDIwLDksMCwKKwkzNywyNCw5OCwwLDAsNjAsMTAsMCwyLDIwLDEwLDAsCisJMzcsNTYsMjI2LDAsMCw2OCwxMSwwLDIsMjAsMTEsMCwKKwkzNyw2NCwyLDEsMiwxOCwzLDAsMzYsMTYsNzYsMCwKKwkwLDI2LDMsMCwzNiwyNCwxMDksMCwzNywxNiw2NywwLAorCTE4NCwxMzMsMTMwLDE3NSwyLDE4LDcsMCwzNiwxNiw3NiwwLAorCTAsNTgsNywwLDM2LDU2LDIzNywwLDM3LDE2LDcxLDAsCisJMTkyLDEzMywxMzAsMTc1LDIsMTgsOCwwLDM2LDE2LDc2LDAsCisJMCw2Niw4LDAsMzYsNjQsMTMsMSwzNywxNiw3MiwwLAorCTE3NiwxMzMsMTM3LDE3NSwxOTYsMTMzLDEzOCwxNzUsMTg4LDEzMywxMzksMTc1LAorCTE4MCwxMzMsMTMwLDE3NSwxNDQsNzEsMTkyLDEyLDc2LDAsNiwzNiwKKwkzLDEzMSw0LDYwLDE0NCwxNiwxMzIsMzYsMzMsNDAsMCwwLAorCTMyLDAsMiwzNiwwLDAsMiwxNzQsMTAsMCwyLDM2LAorCTMsMTMxLDEsNjAsNDQsMTcsMzQsMTcyLDE0NCw3MSwxOTIsMTIsCisJMTA0LDAsNiwzNiwzLDEzMSw0LDYwLDExMiwxNywxMzIsMzYsCisJMzMsNDAsMCwwLDE0NCw3MSwxOTIsMTIsMTYsMCw2LDM2LAorCTMsMTMxLDQsNjAsODAsMTcsMTMyLDM2LDMzLDQwLDAsMCwKKwkxNDQsNzEsMTkyLDEyLDMyLDAsNiwzNiwyMCwwLDE5MSwxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywyNCwwLDE4OSwzOSwKKwkxNzYsMjU1LDE4OSwzOSwxMDAsMCwxNjIsMTQzLDk2LDAsMTY5LDE0MywKKwk3MiwwLDE4MiwxNzUsMzMsMTc2LDEyOCwwLDQ4LDAsMTc2LDE3NSwKKwkxMDQsMCwxNzYsMTQzLDM0LDAsMTY0LDM5LDYwLDAsMTc5LDE3NSwKKwkxMDgsMCwxNzksMTQzLDMsMTMxLDMsNjAsMTA0LDE3LDk5LDM2LAorCTU2LDAsMTc4LDE3NSwyLDEzMSwxOCw2MCwyMTIsNCw4MiwzOCwKKwk1MiwwLDE3NywxNzUsMzMsMTM2LDE5MiwwLDY4LDAsMTgxLDE3NSwKKwkxMTIsMCwxODEsMTQzLDQsMCw2LDM2LDc2LDAsMTkxLDE3NSwKKwk2NCwwLDE4MCwxNzUsMCw2NiwyLDAsMjU1LDI1NSw2Niw0OCwKKwkyLDE4LDIsMCwzNyw2NCwyLDEsMCwwLDk4LDE0MCwKKwk4LDAsMTE2LDE0MiwxLDAsNjYsMzYsMCwwLDk4LDE3MiwKKwkzLDAsMTYyLDEzNiwwLDAsMTYyLDE1Miw0LDAsMTYzLDEyOCwKKwk1LDAsMTcwLDEyOCwzLDAsMTMwLDE3MCwwLDAsMTMwLDE4NiwKKwk0LDAsMTMxLDE2Miw1LDAsMTM4LDE2MiwzLDAsNjYsMTM4LAorCTAsMCw2NiwxNTQsNCwwLDY3LDEzMCw1LDAsNjksMTMwLAorCTksMCwxMzAsMTcwLDYsMCwxMzAsMTg2LDEwLDAsMTMxLDE2MiwKKwkxMSwwLDEzMywxNjIsMjU1LDI1NSwyLDUyLDE2LDAsMTYyLDE2NywKKwkxOCwwLDk4LDE1MCwzMyw0MCwwLDAsMjAsMCwxNjAsMTYzLAorCTIxLDAsMTYwLDE2MywzMCwwLDY2LDM2LDAsMjYsMiwwLAorCTI1NSwyNTUsNjYsNDgsMiwxOCwyLDAsMzcsMjQsOTgsMCwKKwkxOCwwLDE2MywxNjcsMywwLDIyNiwxMzYsMCwwLDIyNiwxNTIsCisJMCwwLDAsMCwyNSwwLDE2MiwxNzEsMjIsMCwxNjIsMTg3LAorCTMsMCwzNCwxMzcsMCwwLDM0LDE1Myw0LDAsMzUsMTI5LAorCTUsMCwzOSwxMjksMjksMCwxNjIsMTcxLDI2LDAsMTYyLDE4NywKKwkzMCwwLDE2MywxNjMsMzEsMCwxNjcsMTYzLDE0NCw3MSwxOTIsMTIsCisJMzIsMCwxNjgsMTY3LDMsMCw2NiwxMzgsMCwwLDY2LDE1NCwKKwk0LDAsNjcsMTM0LDQxLDAsMTYyLDE3MSwzOCwwLDE2MiwxODcsCisJNDIsMCwxNjMsMTY3LDMzLDE2LDAsMiwwLDEzMCwxNiwwLAorCTI1NSwyNTUsNjYsNDgsMiwxOCwyLDAsMzcsMTI4LDIsMiwKKwkxNCwwLDIsMzYsNTgsMCwzNCwyMiw0NCwwLDE3NiwxNjcsCisJMTgsMCwxNjIsMTUxLDAsMCwwLDAsMTIsMCwxMzAsMTY2LAorCTE5LDAsMTYyLDEzOSwxNiwwLDE2MiwxNTUsMjMsMCwxNjMsMTM5LAorCTIwLDAsMTYzLDE1NSwyNywwLDE2NCwxMzksMjQsMCwxNjQsMTU1LAorCTMxLDAsMTY1LDEzOSwyOCwwLDE2NSwxNTUsMTcsMCwxMzAsMTcwLAorCTE0LDAsMTMwLDE4NiwyMSwwLDEzMSwxNzAsMTgsMCwxMzEsMTg2LAorCTI1LDAsMTMyLDE3MCwyMiwwLDEzMiwxODYsMjksMCwxMzMsMTcwLAorCTI2LDAsMTMzLDE4NiwzNSwwLDE2MiwxMzksMzIsMCwxNjIsMTU1LAorCTM5LDAsMTYzLDEzOSwzNiwwLDE2MywxNTUsNDMsMCwxNjQsMTM5LAorCTQwLDAsMTY0LDE1NSw0NCwwLDE2NSwxMzEsMzMsMCwxMzAsMTcwLAorCTMwLDAsMTMwLDE4NiwzNywwLDEzMSwxNzAsMzQsMCwxMzEsMTg2LAorCTQxLDAsMTMyLDE3MCwzOCwwLDEzMiwxODYsNDIsMCwxMzMsMTYyLAorCTQ1LDAsMTYyLDEzMSwwLDAsMCwwLDQzLDAsMTMwLDE2MiwKKwk0NCwwLDIsMzYsMCwwLDk4LDE3NCwwLDAsOTksMTQyLAorCTE4LDAsOTgsMTUwLDAsMCwwLDAsMzMsMTYsNjcsMCwKKwkxOCwwLDk4LDE2NiwxOCwwLDk4LDE1MCwwLDAsMCwwLAorCTYwLDAsNjYsNDQsODAsMCw2NCwxNiwzMywzMiwxOTIsMiwKKwkwLDAsMTYyLDE0MiwxOCwwLDk5LDE1MCw2MCwwLDY2LDM2LAorCTM1LDE2LDY3LDAsMCwwLDE2MiwxNzQsNjAsMCwyLDM2LAorCTE4LDAsOTgsMTY2LDE3Miw0OCwxOTIsOCwzMywzMiwxOTIsMiwKKwkyMDgsMTI5LDEzMywzOSwzLDAsMTYyLDEzNiwwLDAsMTYyLDE1MiwKKwk0LDAsMTYzLDEyOCw1LDAsMTY0LDEyOCwxNywwLDEzMCwxNzAsCisJMTQsMCwxMzAsMTg2LDE4LDAsMTMxLDE2MiwxOSwwLDEzMiwxNjIsCisJMTI5LDU1LDIsMzYsMjAsMCwxMzAsMTY2LDE5LDAsMTYyLDEzOSwKKwkxNiwwLDE2MiwxNTUsMjMsMCwxNjMsMTM5LDIwLDAsMTYzLDE1NSwKKwkyNywwLDE2NCwxMzksMjQsMCwxNjQsMTU1LDMxLDAsMTY1LDEzOSwKKwkyOCwwLDE2NSwxNTUsMjUsMCwxMzAsMTcwLDIyLDAsMTMwLDE4NiwKKwkyOSwwLDEzMSwxNzAsMjYsMCwxMzEsMTg2LDMzLDAsMTMyLDE3MCwKKwkzMCwwLDEzMiwxODYsMzcsMCwxMzMsMTcwLDM0LDAsMTMzLDE4NiwKKwkzNSwwLDE2MiwxMzksMzIsMCwxNjIsMTU1LDM5LDAsMTYzLDEzOSwKKwkzNiwwLDE2MywxNTUsNDMsMCwxNjQsMTM5LDQwLDAsMTY0LDE1NSwKKwk0NCwwLDE2NSwxMzEsNDEsMCwxMzAsMTcwLDM4LDAsMTMwLDE4NiwKKwk0NSwwLDEzMSwxNzAsNDIsMCwxMzEsMTg2LDQ5LDAsMTMyLDE3MCwKKwk0NiwwLDEzMiwxODYsNTAsMCwxMzMsMTYyLDQ1LDAsMTYyLDEzMSwKKwkwLDAsMCwwLDUxLDAsMTMwLDE2Miw1MiwwLDIsMzYsCisJMCwwLDk4LDE3NCwwLDAsOTksMTQyLDE4LDAsOTgsMTUwLAorCTAsMCwwLDAsMzMsMTYsNjcsMCwxOCwwLDk4LDE2NiwKKwkxOCwwLDk4LDE1MCwwLDAsMCwwLDYwLDAsNjYsNDQsCisJOCwwLDY0LDE2LDAsMCwwLDAsMCwwLDE2MiwxNDIsCisJMTgsMCw5OSwxNTAsNjAsMCw2NiwzNiwzNSwxNiw2NywwLAorCTAsMCwxNjIsMTc0LDYwLDAsMiwzNiwxOCwwLDk4LDE2NiwKKwkxOCwwLDk4LDE1MCwwLDAsMCwwLDAsMjYsMiwwLAorCTIsMTgsMiwwLDM3LDI0LDk4LDAsMTIsMCwxMzEsMTY2LAorCTMzLDMyLDE5MiwyLDc0LDIxLDE5MiwxMiwzMyw0MCw5NiwyLAorCTgsMCw2NCwyMCwzMywzMiw5NiwyLDMsMTMxLDMsNjAsCisJMTA4LDE3LDk5LDM2LDAsMCw5OCwxNDAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMTUyLDIxLDE5MiwxMiwwLDAsOTgsMTcyLAorCTc2LDAsMTkxLDE0Myw3MiwwLDE4MiwxNDMsNjgsMCwxODEsMTQzLAorCTY0LDAsMTgwLDE0Myw2MCwwLDE3OSwxNDMsNTYsMCwxNzgsMTQzLAorCTUyLDAsMTc3LDE0Myw0OCwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTgwLDAsMTg5LDM5LDMzLDI0LDAsMCw1LDAsNywzNiwKKwk1OCwwLDYsMzYsMCwwLDE2MiwxNDQsMCwwLDAsMCwKKwkyLDE3LDIsMCwyLDEzMSwxLDYwLDMzLDgsMzQsMCwKKwkxNzYsMTU1LDM0LDE0NCwwLDAsMCwwLDAsMCwxMzAsMTYwLAorCTAsMCwxNjIsMTQ0LDEsMCwxMzIsMzYsMTUsMCw2Niw0OCwKKwkyLDEzMSwxLDYwLDMzLDgsMzQsMCwxNzYsMTU1LDM0LDE0NCwKKwkxLDAsMTY1LDM2LDAsMCwxMzAsMTYwLDMsMCwxMDMsMTYsCisJMSwwLDEzMiwzNiwwLDAsMTM0LDE2MCwxLDAsMTMyLDM2LAorCTEsMCw5OSwzNiw2LDAsOTgsNDAsMjMzLDI1NSw2NCwyMCwKKwkwLDAsMCwwLDgsMCwyMjQsMywwLDAsMCwwLAorCTEyOCwyNTUsMTg5LDM5LDIsMTAxLDIsMzYsMCwyLDMsMzYsCisJMTEyLDAsMTc2LDE3NSw0NCwwLDE3NiwzOSwzMywzMiwwLDIsCisJMzMsNDAsMCwwLDQ4LDAsNiwzNiwxMjAsMCwxOTEsMTc1LAorCTExNiwwLDE3NywxNzUsNDAsMCwxNjIsMTY3LDE0NCw3MSwxOTIsMTIsCisJNDIsMCwxNjMsMTY3LDMsMTMxLDE3LDYwLDk2LDE4LDQ5LDM4LAorCTIsMTMxLDUsNjAsMjI0LDE0NywxNjUsMzYsMTg4LDcxLDE5MiwxMiwKKwkzMywzMiwzMiwyLDE4LDAsNjQsMjAsMzMsMzIsMCwyLAorCTIsMTMxLDUsNjAsMjM2LDE0NywxNjUsMzYsMCwwLDE2MiwxNDAsCisJNCwwLDE2MywxNDAsOCwwLDE2NCwxNDAsNDQsMCwxNjIsMTc1LAorCTQ4LDAsMTYzLDE3NSw1MiwwLDE2NCwxNzUsMTIsMCwxNjIsMTI4LAorCTAsMCwwLDAsNTYsMCwxNjIsMTYzLDIsMTMxLDUsNjAsCisJMjEyLDQsMTY1LDM2LDE5Myw0OCwxOTIsMTIsNTYsMCwxNjQsMzksCisJOCw0OSwxOTIsOCw5MiwwLDE3NywzOSwzMyw0MCwzMiwyLAorCTIwNCw2MywxOTIsMTIsNDgsMCw2LDM2LDkyLDAsMTc3LDM5LAorCTMzLDMyLDMyLDIsMzMsNDAsMCwwLDE0NCw3MSwxOTIsMTIsCisJNCwwLDYsMzYsMiwxMzEsNCw2MCwyMTIsNCwxMzIsMzYsCisJMCwwLDEzMCwxNDAsNCwwLDEzMSwxMzIsOTYsMCwxNjIsMTc1LAorCTEwMCwwLDE2MywxNjcsNCw4MiwyLDM2LDAsMSwzLDM2LAorCTIzNiwyNTUsMTMyLDM2LDIsMCw1LDM2LDEwMiwwLDE2MiwxNjcsCisJNTQsMjEsMTkyLDEyLDEwNCwwLDE2MywxNjcsMzMsMTI4LDY0LDAsCisJMjIsMCwwLDE4LDQwLDAsMTY1LDM5LDQsMCw0LDE0MiwKKwkwLDAsMCwwLDIyMCw0MiwxOTIsMTIsNjYsMCw2LDM2LAorCTMzLDMyLDAsMCwwLDAsNjcsMTQwLDEzMiwxMjksMTMzLDM5LAorCTAsMTI4LDk5LDUyLDAsMCw2NywxNzIsNCwwLDMsMTQyLAorCTE0LDAsNiwzNiwxOCwwLDk5LDE0OCwzMyw1NiwzMiwyLAorCTE4LDAsMywxNjYsODIsNCwzLDM2LDE2LDAsMTY1LDE3NSwKKwkyMCwwLDE2MywxNzUsMjQsMCwxNjMsMTc1LDI4LDAsMTc2LDE3NSwKKwkyMTQsNDcsMTkyLDEyLDMyLDAsMTYyLDE3NSwxMjAsMCwxOTEsMTQzLAorCTExNiwwLDE3NywxNDMsMTEyLDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMTI4LDAsMTg5LDM5LDE0NCwyNTUsMTg5LDM5LDEwNCwwLDE4MCwxNzUsCisJMzMsMTYwLDEyOCwwLDEwMCwwLDE3OSwxNzUsMzMsMTUyLDE2MCwwLAorCTkyLDAsMTc3LDE3NSwzMywxMzYsMTkyLDAsMzMsMzIsMjI0LDAsCisJNDAsMCwxNjYsMzksNTYsMCwxNjcsMzksOTYsMCwxNzgsMTc1LAorCTIsMTMxLDE4LDYwLDgsMjM5LDgyLDM4LDg4LDAsMTc2LDE3NSwKKwkxMjgsMCwxNzYsMTQzLDI0Miw1LDIsMzYsODQsMCwxNjIsMTY3LAorCTcyLDAsMTYyLDM5LDEwOCwwLDE5MSwxNzUsNzIsMCwxNjAsMTY3LAorCTc2LDAsMTc4LDE3NSw4MCwwLDE3OCwxNzUsMTYsMCwxNjIsMTc1LAorCTI0Nyw3MSwxOTIsMTIsMzMsNDAsMCwyLDI1NSwyNTUsMywzNiwKKwkzNywwLDY3LDE2LDI1NSwxLDUsMzgsMiwxMzEsNCw2MCwKKwkxOTIsNCwxMzIsMzYsNTQsMjEsMTkyLDEyLDIsNDIsNSwwLAorCTMzLDEyOCw2NCwwLDMwLDAsMCwxOCwzMyw0MCw2NCwyLAorCTgwLDAsMTY2LDE0Myw3NiwwLDE2MiwxNDMsNCwwLDQsMTQyLAorCTM1LDQ4LDE5NCwwLDIyMCw0MiwxOTIsMTIsMjU1LDI1NSwxOTgsNDgsCisJMzMsMzIsMTI4LDIsMCwwLDY3LDE0MCw2LDAsMTAxLDM4LAorCTAsMTI4LDk5LDUyLDAsMCw2NywxNzIsNCwwLDMsMTQyLAorCTM1LDQ4LDUxLDIsMTgsMCw5OSwxNDgsMTgsMCwzOSwzOCwKKwkxOCwwLDMsMTY2LDI4LDAsNDAsMTUwLDIyLDAsMzUsMzgsCisJMTYsMCwxNjMsMTc1LDE1LDE0NCwzLDUyLDI0LDAsMTYzLDE3NSwKKwkyOCwwLDE3NiwxNzUsMzIsMCwxNjIsMTc1LDAsMTgsOCwwLAorCTIsNjYsOCwwLDM3LDE2LDcyLDAsMjU1LDI1NSw2Niw0OCwKKwkyMTQsNDcsMTkyLDEyLDIwLDAsMTYyLDE3NSwxMDgsMCwxOTEsMTQzLAorCTEwNCwwLDE4MCwxNDMsMTAwLDAsMTc5LDE0Myw5NiwwLDE3OCwxNDMsCisJOTIsMCwxNzcsMTQzLDg4LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMTEyLDAsMTg5LDM5LDIwMCwyNTUsMTg5LDM5LDQ0LDAsMTgxLDE3NSwKKwkzMywxNjgsMTI4LDAsMjgsMCwxNzcsMTc1LDMzLDEzNiwxNjAsMCwKKwk0OCwwLDE5MSwxNzUsNDAsMCwxODAsMTc1LDM2LDAsMTc5LDE3NSwKKwkzMiwwLDE3OCwxNzUsMjQsMCwxNzYsMTc1LDE4LDAsMzQsMTUwLAorCTAsMCwwLDAsMjU1LDI1NSw4NCw0OCwyNDMsNSwxMzAsNDYsCisJNCwwLDY0LDIwLDMzLDE1MiwxOTIsMCwzLDEzMSwzLDYwLAorCTI0MSw0OSwxOTIsOCw4NCwxNyw5OSwzNiwyLDEzMSwxOCw2MCwKKwkxNiwyMzMsODIsMzgsMzMsMzIsNjQsMiwwLDAsNDgsMTQyLAorCTgsMCwzNywxNDIsMjU1LDYzLDE2LDUwLDgwLDY4LDE5MiwxMiwKKwkzMyw0OCwwLDIsMCwwLDM0LDE0MiwwLDAsMCwwLAorCTAsMTI4LDY2LDQ4LDUsMCw2NCwyMCwzMywxNDQsODAsMiwKKwk0LDAsNDksMTQyLDAsMCwwLDAsMTQ4LDQ5LDE5Miw4LAorCTMzLDMyLDY0LDIsMiwxMzEsMiw2MCwxNiwyMzMsNjYsMzYsCisJMzMsMTI4LDk4LDIsNiwwLDE3LDM4LDMzLDMyLDMyLDIsCisJMCwxNjMsNSw2MCwyMjQsNSwxNjUsNTIsMTY4LDcxLDE5MiwxMiwKKwk0LDAsNiwzNiw5LDAsNjQsMTYsMzMsMzIsMzIsMiwKKwkyMjQsMTI5LDEzMywzOSwxNjgsNzEsMTkyLDEyLDQsMCw2LDM2LAorCTUsMCw2NCwxNiwxMCwwLDE3LDM4LDMsMTMxLDMsNjAsCisJMjQxLDQ5LDE5Miw4LDg4LDE3LDk5LDM2LDEwLDAsMTcsMzgsCisJMzMsMzIsMzIsMiwyLDEzMSw1LDYwLDIxMiw0LDE2NSwzNiwKKwkxNjgsNzEsMTkyLDEyLDYsMCw2LDM2LDksMCw2NCwxNiwKKwkzMywzMiwzMiwyLDIyOCwxMjksMTMzLDM5LDE2OCw3MSwxOTIsMTIsCisJNiwwLDYsMzYsNCwwLDY0LDE2LDAsMCwwLDAsCisJMywxMzEsMyw2MCwyNDEsNDksMTkyLDgsODgsMTcsOTksMzYsCisJMCwwLDMsMTUwLDI1NSwyNTUsMiw1Miw0LDAsOTgsMTYsCisJMzAsMCw3LDM4LDMsMTMxLDMsNjAsMjQxLDQ5LDE5Miw4LAorCTg4LDE3LDk5LDM2LDIsMCwyLDE1MCwyLDEzMSw1LDYwLAorCTE2LDIzMywxNjUsMzYsMCwyNiwyLDAsMiwxOCwyLDAsCisJMzcsMjQsOTgsMCwyNTUsMjU1LDk5LDQ4LDIyNiwyNTUsMTA0LDM2LAorCTM1LDE2LDIyOSwwLDM1LDE2LDEzMCwyLDQyLDE2LDcyLDAsCisJNCwwLDY0LDE2LDAsMCwwLDAsMywxMzEsMyw2MCwKKwkyNDEsNDksMTkyLDgsOTYsMTcsOTksMzYsMTYsMCwyLDE1MCwKKwkwLDAsMCwwLDAsMjYsMiwwLDIsMTgsMiwwLAorCTM3LDI0LDk4LDAsMjU1LDI1NSw5OSw0OCwxNSwxNDQsMiw1MiwKKwkxMSwwLDk4LDIwLDMzLDMyLDE2MCwyLDMsMTMxLDMsNjAsCisJMTAwLDE3LDk5LDM2LDAsMCw5OCwxNDAsMzMsNDgsMCwyLAorCTE2LDAsMTY4LDE3NSwxLDAsNjYsMzYsNTQsNDksMTkyLDEyLAorCTAsMCw5OCwxNzIsMjQ1LDQ5LDE5Miw4LDAsMCwwLDAsCisJMywxMzEsMyw2MCw5MiwxNyw5OSwzNiwwLDAsOTgsMTQwLAorCTAsMCwwLDAsMSwwLDY2LDM2LDAsMCw5OCwxNzIsCisJNDgsMCwxOTEsMTQzLDQ0LDAsMTgxLDE0Myw0MCwwLDE4MCwxNDMsCisJMzYsMCwxNzksMTQzLDMyLDAsMTc4LDE0MywyOCwwLDE3NywxNDMsCisJMjQsMCwxNzYsMTQzLDgsMCwyMjQsMyw1NiwwLDE4OSwzOSwKKwkwLDAsMCwwLDAsMCwwLDAsMjMyLDI1NSwxODksMzksCisJMTYsMCwxOTEsMTc1LDEzLDgsMTkyLDEyLDAsOCw0LDM2LAorCTgsMTMzLDEzMCwxNzUsMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDIzMiwyNTUsMTg5LDM5LAorCTQ1LDAsMTI4LDE2LDE2LDAsMTkxLDE3NSwyNDAsMTI5LDEzMywxNDMsCisJNywwLDEzMCwzNiwxOTQsMTYsMiwwLDEwLDAsMTYwLDIwLAorCTEsMCw3MCwzNiw4LDEzMywxMzMsMTQzLDAsMTMzLDEzMCwzOSwKKwkwLDEzMywxMzMsMTc1LDAsMCwxNjIsMTcyLDAsOCwyLDM2LAorCTI0MCwxMjksMTMzLDE3NSwyLDEzMSwxLDYwLDIwLDIxMSwzMiwxNzIsCisJNCwwLDE2MiwxNzIsMCwwLDE2NCwxNDAsMCwwLDAsMCwKKwk0LDAsMTMxLDE0MCwwLDAsMCwwLDQzLDE2LDEwMiwwLAorCTE0LDAsNjQsMjAsMCwwLDAsMCw1LDAsMTAyLDIwLAorCTM1LDE2LDEwMiwwLDAsMCwxMzAsMTQwLDAsMCwwLDAsCisJNDMsNTAsMTkyLDgsMCwwLDE2MiwxNzIsNCwwLDEzMCwxNzIsCisJMTkyLDE2LDIsMCwzMywzMiwxMzAsMCw0LDAsMTM0LDE3MiwKKwkyNDAsMTI5LDEzMywxNzUsNTcsNTAsMTkyLDgsOCwwLDEzMCwzNiwKKwkyNDAsMTI5LDEzMCwxNDMsMCwwLDAsMCw0LDAsMTMwLDE2LAorCTMzLDQwLDEyOCwwLDAsMCwxMzIsMTQwLDI4LDUwLDE5Miw4LAorCTAsMCwwLDAsMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsCisJNjQsMTQ4LDEzMiwzNiwzMywxNiwwLDAsMTYsMCwxOTEsMTQzLAorCTI0LDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTU2LDAsMTI4LDE2LDI0OCwyNTUsMTMyLDM2LDI0MCwxMjksMTMzLDE0MywKKwkwLDAsMCwwLDc4LDUwLDE5Miw4LDQzLDE2LDE2NCwwLAorCTAsMCwxNjMsMTQwLDAsMCwwLDAsNDMsMTYsMTYzLDAsCisJNSwwLDY0LDIwLDQzLDE2LDE2NCwwLDEyLDAsNjQsMjAsCisJNDMsMTYsMTMxLDAsMTAsMCw2NCwyMCwwLDAsMCwwLAorCTMzLDQwLDk2LDAsNDMsMTYsMTY0LDAsMjQ0LDI1NSw2NCwxNiwKKwkwLDAsMCwwLDAsMCwxNjIsMTQwLDAsMCwwLDAsCisJNDMsMTYsMTMwLDAsMjM5LDI1NSw2NCwxNiwwLDAsMCwwLAorCTQsMCwxMzQsMTQwLDAsMCwxNjMsMTQwLDE5MiwxNiw2LDAsCisJMzMsMTYsMTMwLDAsMTEsMCw2NywyMCwwLDAsMCwwLAorCTQsMCw5OCwxNDAsMCwwLDAsMCwzMywxNiwxOTQsMCwKKwk0LDAsMTMwLDE3MiwwLDAsMTYyLDE0MCwwLDAsMCwwLAorCTAsMCw2NiwxNDAsMCwwLDAsMCwxMDIsNTAsMTkyLDgsCisJMCwwLDEzMCwxNzIsMCwwLDEzMSwxNzIsNCwwLDE2MywxNDAsCisJMCwwLDAsMCwxOTIsMTYsMywwLDMzLDE2LDE2MiwwLAorCTksMCw2OCwyMCwwLDAsMCwwLDQsMCwxMzAsMTQwLAorCTAsMCwwLDAsMzMsMTYsOTgsMCw0LDAsMTYyLDE3MiwKKwkwLDAsMTMwLDE0MCwwLDAsMCwwLDExNyw1MCwxOTIsOCwKKwkwLDAsMTYyLDE3MiwwLDAsMTY0LDE3MiwyNDAsMTI5LDEzMywxNzUsCisJOCwwLDIyNCwzLDAsMCwwLDAsMjMyLDI1NSwxODksMzksCisJMTYsMCwxOTEsMTc1LDAsNTAsMTkyLDEyLDAsMCwwLDAsCisJMTc4LDQ1LDE5MiwxMiwzMywzMiwwLDAsMTYsMCwxOTEsMTQzLAorCTI0LDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTEsMCwzLDM2LDUsMCwxOTUsMjAsMjU1LDI1NSwyLDM2LAorCTAsMCwyMjYsMTQwLDAsMCwwLDAsNDMsMTYsMiwwLAorCTM1LDE2LDIsMCw4LDAsMjI0LDMsMCwwLDAsMCwKKwkyMjQsMjU1LDE4OSwzOSwxNiwwLDE3NiwxNzUsMzMsMTI4LDIyNCwwLAorCTIwLDAsMTc3LDE3NSw0OCwwLDE3NywxNDMsMSwwLDIsMzYsCisJNSwwLDE2MiwyMCwyNCwwLDE5MSwxNzUsMCwwLDE5NCwxNDAsCisJMCwwLDAsMCw4LDAsNjQsMTYsMCwwLDAsMCwKKwkxMSwwLDIsMzYsMzMsMzIsMCwyLDMzLDQwLDMyLDIsCisJNDgsNzIsMTkyLDEyLDk2LDAsMiwxNzQsMSwwLDY2LDM2LAorCTEwMCwwLDIsMTc0LDE3LDAsMzQsMTQ2LDAsMCwwLDAsCisJMSwwLDY2LDUyLDE3LDAsMzQsMTYyLDI0LDAsMTkxLDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkxNiwwLDE2MywxNDMsMCwwLDAsMCwxNywwLDk4LDE0NCwKKwkwLDAsMCwwLDIsMCw2Niw1Miw4LDAsMjI0LDMsCisJMTcsMCw5OCwxNjAsOCwwLDIyNCwzLDAsMCwwLDAsCisJMjI0LDI1NSwxODksMzksMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwKKwkyNDQsMTI5LDEzMSwxNTEsMjU1LDAsMiwzNiwyOCwwLDE5MSwxNzUsCisJMjQsMCwxNzgsMTc1LDIwLDAsMTc3LDE3NSw0LDAsMiwxNzQsCisJNjAsMCwwLDE3NCwxLDAsOTgsMzYsMjQ0LDEyOSwxMzAsMTY3LAorCTEwLDAsMywxNjYsMywwLDE2MiwxMzYsMCwwLDE2MiwxNTIsCisJNywwLDE2MywxMzYsNCwwLDE2MywxNTIsMTEsMCwxNjQsMTM2LAorCTgsMCwxNjQsMTUyLDE1LDAsMTY3LDEzNiwxMiwwLDE2NywxNTIsCisJMTUsMCwyLDE3MCwxMiwwLDIsMTg2LDE5LDAsMywxNzAsCisJMTYsMCwzLDE4NiwyMywwLDQsMTcwLDIwLDAsNCwxODYsCisJMjcsMCw3LDE3MCwyNCwwLDcsMTg2LDMsMCwxOTQsMTM2LAorCTAsMCwxOTQsMTUyLDcsMCwxOTUsMTM2LDQsMCwxOTUsMTUyLAorCTExLDAsMTk2LDEzNiw4LDAsMTk2LDE1MiwxNSwwLDE5NywxMzYsCisJMTIsMCwxOTcsMTUyLDMxLDAsMiwxNzAsMjgsMCwyLDE4NiwKKwkzNSwwLDMsMTcwLDMyLDAsMywxODYsMzksMCw0LDE3MCwKKwkzNiwwLDQsMTg2LDQzLDAsNSwxNzAsNDAsMCw1LDE4NiwKKwk4MCwwLDIsMTQyLDc2LDAsMywxNDIsMCwwLDAsMCwKKwkzNSwxNiw2NywwLDI1NSwyNTUsODEsNDgsODgsMCwzLDE1MCwKKwkzLDAsMiwzNiwxMywwLDk4LDE2LDAsMCwwLDAsCisJMiwxMzEsMTgsNjAsMTYwLDIwNCw4MiwzOCwxNTYsNzEsMTkyLDEyLAorCTMzLDMyLDY0LDIsNywwLDgxLDIwLDMzLDMyLDY0LDIsCisJNzYsMCw1LDE0MiwwLDAsMCwwLDE2OCw3MSwxOTIsMTIsCisJMzMsNDgsMzIsMiwyMSwwLDY0LDE2LDMzLDE2LDAsMCwKKwkyLDEzMSwxOCw2MCwxOTIsMjA0LDgyLDM4LDE1Niw3MSwxOTIsMTIsCisJMzMsMzIsNjQsMiw3LDAsODEsMjAsMzMsMzIsNjQsMiwKKwk3NiwwLDUsMTQyLDAsMCwwLDAsMTY4LDcxLDE5MiwxMiwKKwkzMyw0OCwzMiwyLDksMCw2NCwxNiwzMywxNiwwLDAsCisJMywxMzEsMyw2MCwxMzIsMTcsOTksMzYsMCwwLDk4LDE0MCwKKwkxLDAsNCwzNiwxLDAsNjYsMzYsMTc4LDQ1LDE5MiwxMiwKKwkwLDAsOTgsMTcyLDEsMCwyLDM2LDI4LDAsMTkxLDE0MywKKwkyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMzIsMCwxODksMzksMCwwLDAsMCwKKwkwLDAsMCwwLDIyNCwyNTUsMTg5LDM5LDIwLDAsMTc3LDE3NSwKKwkzMywxMzYsMjI0LDAsMTYsMCwxNzYsMTc1LDQ4LDAsMTc2LDE0MywKKwkyNCwwLDE5MSwxNzUsMTU2LDcxLDE5MiwxMiwzMywzMiwzMiwyLAorCTAsMCwyLDE3NCwzMywxNiwzMiwyLDI0LDAsMTkxLDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSw4LDAsMjI0LDMsMzMsMTYsMjI0LDAsCisJMCwwLDIyNywxNDAsMjA0LDIwNCwyLDYwLDIwNSwyMDQsNjYsNTIsCisJMjUsMCw5OCwwLDE2LDMyLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsOCwwLDIyNCwzLDE5NCwxNiw0LDAsCisJMjI0LDI1NSwxODksMzksMTYsMCwxNzYsMTc1LDMzLDEyOCwyMjQsMCwKKwkzMywzMiwwLDIsMzMsNDAsMCwwLDIwLDAsMTc3LDE3NSwKKwk0OCwwLDE3NywxNDMsMjQsMCwxOTEsMTc1LDIwOCw3MSwxOTIsMTIsCisJMTYsMCw2LDM2LDIsMCw2NCwyMCwzNSwxNiw4MCwwLAorCTE2LDAsMiwzNiwwLDAsMzQsMTc0LDMzLDE2LDAsMiwKKwkyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMzIsMCwxODksMzksMjMyLDI1NSwxODksMzksCisJNDAsMCwxNjQsMTQzLDQ0LDAsMTY1LDE0MywxNiwwLDE5MSwxNzUsCisJMjA1LDU5LDE5MiwxMiwwLDAsMCwwLDE2LDAsMTkxLDE0MywKKwkyNCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkyMzIsMjU1LDE4OSwzOSw0MCwwLDE2NCwxNDMsNDQsMCwxNjUsMTQzLAorCTE2LDAsMTkxLDE3NSwyMzksNTksMTkyLDEyLDAsMCwwLDAsCisJMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDIzMiwyNTUsMTg5LDM5LDQwLDAsMTY0LDE0MywKKwk0NCwwLDE2NSwxNDMsMTYsMCwxOTEsMTc1LDE3LDYwLDE5MiwxMiwKKwkwLDAsMCwwLDE2LDAsMTkxLDE0MywyNCwwLDE4OSwzOSwKKwk4LDAsMjI0LDMsMCwwLDAsMCw4LDAsMjI0LDMsCisJMzMsMTYsMjI0LDAsMCwwLDIyNiwxNDAsOCwwLDIyNCwzLAorCTAsMCwwLDAsMjE2LDI1NSwxODksMzksMjQsMCwxNzYsMTc1LAorCTU2LDAsMTc2LDE0MywzMiwwLDE5MSwxNzUsMjgsMCwxNzcsMTc1LAorCTM2LDAsMiwxNDIsMSwwLDMsMzYsMjAsMCw4MSwxNDAsCisJMTg3LDAsMTYzLDIwLDAsMCwwLDAsMCwwLDE5NSwxNDAsCisJMCwwLDAsMCwxODMsMCw5NiwxNiwwLDAsMCwwLAorCTMyLDEzMywxMzAsMTQzLDAsMCwwLDAsNDMsMTYsNjcsMCwKKwkxNzgsMCw2NCwyMCwyNTUsMjU1LDEwNCwzNiw2NCwxOCw4LDAsCisJMiwxMzEsMyw2MCwxOTIsMjQ2LDk5LDM2LDMzLDQwLDY3LDAsCisJMjU1LDI1NSwxMzIsMzYsMjIsMCwxMzAsNDQsMTcwLDAsNjQsMTYsCisJMTI4LDE2LDQsMCwyLDEzMSwxLDYwLDMzLDgsMzQsMCwKKwkxNDQsMTQ4LDM0LDE0MCwwLDAsMCwwLDgsMCw2NCwwLAorCTAsMCwwLDAsMiwwLDIsMzYsMTYsMCwyLDE2MiwKKwkxNywwLDIsMTQ2LDAsMCwxOTUsMTQwLDAsMCwwLDAsCisJMTUsNTIsMTkyLDgsMiwwLDY2LDUyLDMzLDMyLDMyLDIsCisJMTcsMCwzLDE0Niw0LDAsMiwzNiwxNiwwLDIsMTYyLAorCTQwLDAsMCwxNjYsNDQsMCwxNywxNzQsMiwwLDk5LDUyLAorCTE1Niw3MSwxOTIsMTIsMTcsMCwzLDE2MiwyNTUsMjU1LDY2LDQ4LAorCTMzLDE2LDM0LDIsNDgsMCwyLDE3NCw0MCw1MiwxOTIsOCwKKwk1MiwwLDAsMTY2LDE3LDAsMywxNDYsMiwwLDIsMzYsCisJMTYsMCwyLDE2MiwyNDMsNTEsMTkyLDgsNDAsMCwxNywxNzQsCisJMTcsMCwzLDE0NiwyLDAsMiwzNiwxNiwwLDIsMTYyLAorCTI0Myw1MSwxOTIsOCw0MCwwLDE3LDE3NCw2NiwwLDIsMzYsCisJMTMsMCwwLDIxLDE2LDAsMiwxNjIsMjQsMTMzLDEzMiwxNDMsCisJMCwwLDAsMCw2NCwyNSw0LDAsMzUsMjQsMTAwLDAsCisJMTI4LDE3LDMsMCwzNSwxNiw2NywwLDE5MiwxNiwyLDAsCisJMzMsMTYsNjgsMCwxMjgsMjQsMiwwLDMzLDE2LDY3LDAsCisJMTc4LDUxLDE5Miw4LDE5MiwxNywyLDAsMTUyLDAsMiw2MCwKKwkxMjgsMTUwLDY2LDUyLDQwLDAsMiwxNzQsMTcsMCwyLDE0NiwKKwkwLDAsMCwwLDE5OSw1MSwxOTIsOCwyLDAsNjYsNTIsCisJMTcsMCwzLDE0Niw0LDAsMiwzNiwxNiwwLDIsMTYyLAorCTIwLDAsMTYyLDM2LDQ0LDAsMiwxNzQsMjYsMCwxNjIsMzYsCisJNDAsMCwwLDE2Niw0OCwwLDIsMTc0LDI0Myw1MSwxOTIsOCwKKwk1MiwwLDAsMTY2LDIsMCwyLDM2LDE2LDAsMiwxNjIsCisJMTcsMCwyLDE0NiwxLDAsMywzNiw0MCwwLDMsMTc0LAorCTIsMCw2Niw1Miw0MCw1MiwxOTIsOCwxNywwLDIsMTYyLAorCTE3LDAsMywxNDYsMCwwLDAsMCwyNDEsNTEsMTkyLDgsCisJNjcsMCwyLDM2LDY1LDAsMiwzNiwxNiwwLDIsMTYyLAorCTE3LDAsMiwxNDYsMTY4LDAsMTYzLDE0MCwwLDAsMCwwLAorCTE1LDUyLDE5Miw4LDIsMCw2Niw1Miw2NSwwLDIsMzYsCisJMTYsMCwyLDE2MiwxNTYsMCwxNjIsMTQwLDAsMSwxNjQsMTQwLAorCTIyLDUyLDE5Miw4LDAsMCwwLDAsNjUsMCwyLDM2LAorCTE2LDAsMiwxNjIsMTcsMCwyLDE0NiwwLDEsMTYzLDE0MCwKKwkwLDAsMCwwLDE1LDUyLDE5Miw4LDIsMCw2Niw1MiwKKwk2NSwwLDIsMzYsMTYsMCwyLDE2MiwxNywwLDIsMTQ2LAorCTE2NCwwLDE2MywxNDAsMCwwLDAsMCwxNSw1MiwxOTIsOCwKKwkyLDAsNjYsNTIsNjUsMCwyLDM2LDE2LDAsMiwxNjIsCisJMTcsMCwyLDE0NiwxNjAsMCwxNjMsMTQwLDAsMCwwLDAsCisJMTUsNTIsMTkyLDgsMiwwLDY2LDUyLDE3LDAsMywxNDYsCisJNjUsMCwyLDM2LDE2LDAsMiwxNjIsNDAsMCwwLDE3NCwKKwkyLDAsOTksNTIsNDAsNTIsMTkyLDgsMTcsMCwzLDE2MiwKKwk2NSwwLDIsMzYsMTYsMCwyLDE2MiwxNzIsMCwxNjIsMTQwLAorCTQsMSwxNjQsMTQwLDIyLDUyLDE5Miw4LDAsMCwwLDAsCisJNjUsMCwyLDM2LDE2LDAsMiwxNjIsMTcsMCwyLDE0NiwKKwk0LDEsMTYzLDE0MCwwLDAsMCwwLDE1LDUyLDE5Miw4LAorCTIsMCw2Niw1Miw2NSwwLDIsMzYsMTYsMCwyLDE2MiwKKwkxNywwLDIsMTQ2LDE4NCwwLDE2MywxNDAsMCwwLDAsMCwKKwkxNSw1MiwxOTIsOCwyLDAsNjYsNTIsNjUsMCwyLDM2LAorCTE2LDAsMiwxNjIsMTcsMCwyLDE0NiwxODgsMCwxNjMsMTQwLAorCTIsMCw2Niw1Miw0MCwwLDMsMTc0LDQwLDUyLDE5Miw4LAorCTE3LDAsMiwxNjIsNjYsMCwyLDM2LDE2LDAsMiwxNjIsCisJMTcyLDAsMTYyLDE0MCwxNzYsMCwxNjQsMTQwLDE3LDAsMywxNDYsCisJMzUsMTYsNjgsMCwyLDAsOTksNTIsNDAsMCwyLDE3NCwKKwk0MCw1MiwxOTIsOCwxNywwLDMsMTYyLDE2LDAsMTYwLDE3NSwKKwkzMywzMiwyMjQsMCwzMyw0MCwwLDIsMiwxMzEsNyw2MCwKKwk5NiwyMDQsMjMxLDM2LDIyNiw3NiwxOTIsMTIsMiwwLDYsMzYsCisJNDAsNTIsMTkyLDgsMCwwLDAsMCwzMywzMiwyMjQsMCwKKwkyMDAsNzYsMTkyLDEyLDMzLDQwLDAsMiwzMiwwLDE5MSwxNDMsCisJMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDAsMCwxODksMzksMjI0LDI1NSwxODksMzksMTYsMCwxNzYsMTc1LAorCTMzLDEyOCwyMjQsMCwyMCwwLDE3NywxNzUsNDgsMCwxNzcsMTQzLAorCTEsMCwyLDM2LDEwLDAsMTYyLDIwLDI0LDAsMTkxLDE3NSwKKwkwLDAsMTk4LDE0MCwwLDAsMCwwLDYsMCwxOTIsMTYsCisJMCwwLDAsMCwzMiwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTQzLDE2LDcwLDAsNSwwLDY0LDE2LDcsMCwyLDM2LAorCTMzLDMyLDAsMiwzMyw0MCwzMiwyLDcwLDUyLDE5Miw4LAorCTExLDAsMiwzNiw3LDAsMTMwLDE2LDMzLDMyLDAsMiwKKwkzMyw0MCwzMiwyLDE3LDAsMiwzNiw0OCw3MiwxOTIsMTIsCisJOTYsMCwyLDE3NCwxLDAsNjYsMzYsMTAwLDAsMiwxNzQsCisJMTcsMCwzNCwxNDYsMCwwLDAsMCwxLDAsNjYsNTIsCisJMTcsMCwzNCwxNjIsMjQsMCwxOTEsMTQzLDIwLDAsMTc3LDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDMyLDAsMTg5LDM5LAorCTIwOCwyNTUsMTg5LDM5LDMyLDAsMTc2LDE3NSw2NCwwLDE3NiwxNDMsCisJMzYsMCwxNzcsMTc1LDMzLDEzNiwyMjQsMCw0LDAsMTYwLDIwLAorCTQwLDAsMTkxLDE3NSwxLDAsMiwzNiwxMDYsNTIsMTkyLDgsCisJMjQsMCwxNjIsMTc1LDAsMCwxOTgsMTQwLDMyLDEzMywxMzAsMTQzLAorCTAsMCwwLDAsNDMsMTYsMTk0LDAsMywwLDY0LDE2LAorCTEsMCwxOTQsMzYsMTA2LDUyLDE5Miw4LDI0LDAsMTYyLDE3NSwKKwkxNywwLDIsMTQ2LDAsMCwwLDAsMTgsMCw2Niw1MiwKKwkxMTYsNTIsMTkyLDgsMTcsMCwyLDE2MiwxNiwwLDE3NiwxNzUsCisJMSwwLDUsMzYsMjQsMCwxNjYsMzksOTcsNTEsMTkyLDEyLAorCTMzLDU2LDMyLDIsMzMsMzIsMzIsMiwzMyw0MCwwLDIsCisJMSwwLDYsMzYsMjUzLDc2LDE5MiwxMiwyNCwwLDE2NywzOSwKKwk0MCwwLDE5MSwxNDMsMzYsMCwxNzcsMTQzLDMyLDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNDgsMCwxODksMzksMTYsMCwxNjMsMTQzLAorCTEsMCwyLDM2LDEzLDAsMTYyLDIwLDE0LDAsMiwzNiwKKwkwLDAsMTk4LDE0MCwwLDAsMCwwLDksMCwxOTIsMTYsCisJMCwwLDAsMCwzMiwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTQzLDE2LDcwLDAsNCwwLDY0LDIwLDE0LDAsMiwzNiwKKwk3LDAsMiwzNiwyLDAsMTMwLDE2LDE0LDAsMiwzNiwKKwk5NiwwLDIyNiwxNzIsMTcsMCw5OCwxNDQsMCwwLDAsMCwKKwkyLDAsNjYsNTIsOCwwLDIyNCwzLDE3LDAsOTgsMTYwLAorCTE2LDAsMTYyLDE0MywwLDAsMCwwLDgsMCwyMjQsMywKKwkwLDAsMjI2LDE3MiwwLDAsMjI2LDE0MCw4LDAsMjI0LDMsCisJMCwwLDAsMCwyMzIsMjU1LDE4OSwzOSw0MCwwLDE2OCwxNDMsCisJMSwwLDIsMzYsNjEsMCwxNjIsMjAsMTYsMCwxOTEsMTc1LAorCTAsMCwxOTcsMTQwLDAsMCwwLDAsNTcsMCwxNjAsMTYsCisJMCwwLDAsMCwzMiwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTQzLDE2LDY5LDAsNTIsMCw2NCwyMCwyNTUsMjU1LDEzMiwzNiwKKwk1LDAsMTMwLDQ0LDQ5LDAsNjQsMTYsMTI4LDE2LDQsMCwKKwkyLDEzMSwxLDYwLDMzLDgsMzQsMCwyMzIsMTQ4LDM0LDE0MCwKKwkwLDAsMCwwLDgsMCw2NCwwLDAsMCwwLDAsCisJNjQsMCwyLDM2LDE2LDAsMiwxNjEsMCwxNjMsNSw2MCwKKwkyMjAsNSwxNjUsNTIsMywwLDE2MiwxMzYsMCwwLDE2MiwxNTIsCisJMCwwLDAsMCw0MywwLDIsMTY5LDQwLDAsMiwxODUsCisJMTcsMCwyLDE0NSwwLDAsMCwwLDIxMyw1MiwxOTIsOCwKKwkyLDAsNjYsNTIsMiwwLDIsMzYsMTYsMCwyLDE2MSwKKwkxNywwLDIsMTQ1LDAsMCwxOTUsMTQwLDAsMCwwLDAsCisJMTk4LDUyLDE5Miw4LDIsMCw2Niw1Miw2NCwwLDIsMzYsCisJMTYsMCwyLDE2MSwxNywwLDIsMTQ1LDEyOCwxMzIsMTMxLDE0MywKKwkyLDAsNjYsNTIsNDAsMCwzLDE3MywyMTgsNTIsMTkyLDgsCisJMTcsMCwyLDE2MSwyLDAsMiwzNiwxNiwwLDIsMTYxLAorCTE3LDAsMiwxNDUsMCwwLDAsMCwyMTEsNTIsMTkyLDgsCisJMSwwLDMsMzYsMiwwLDIsMzYsMTYsMCwyLDE2MSwKKwkxNywwLDIsMTQ1LDIyMCw1LDMsMzYsNDAsMCwzLDE3MywKKwkyLDAsNjYsNTIsMjE4LDUyLDE5Miw4LDE3LDAsMiwxNjEsCisJMzMsMzIsMjI0LDAsMjAwLDc2LDE5MiwxMiwzMyw0MCwwLDEsCisJMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDIwOCwyNTUsMTg5LDM5LDMyLDAsMTc2LDE3NSwKKwk2NCwwLDE3NiwxNDMsMzYsMCwxNzcsMTc1LDMzLDEzNiwyMjQsMCwKKwk0LDAsMTYwLDIwLDQwLDAsMTkxLDE3NSwxLDAsMiwzNiwKKwkyNDUsNTIsMTkyLDgsMjQsMCwxNjIsMTc1LDAsMCwxOTgsMTQwLAorCTMyLDEzMywxMzAsMTQzLDAsMCwwLDAsNDMsMTYsMTk0LDAsCisJMywwLDY0LDE2LDEsMCwxOTQsMzYsMjQ1LDUyLDE5Miw4LAorCTI0LDAsMTYyLDE3NSwxNywwLDIsMTQ2LDAsMCwwLDAsCisJMTgsMCw2Niw1MiwyNTUsNTIsMTkyLDgsMTcsMCwyLDE2MiwKKwkxNiwwLDE3NiwxNzUsMSwwLDUsMzYsMjQsMCwxNjYsMzksCisJMTUwLDUyLDE5MiwxMiwzMyw1NiwzMiwyLDMzLDMyLDMyLDIsCisJMzMsNDAsMCwyLDEsMCw2LDM2LDI1Myw3NiwxOTIsMTIsCisJMjQsMCwxNjcsMzksNDAsMCwxOTEsMTQzLDM2LDAsMTc3LDE0MywKKwkzMiwwLDE3NiwxNDMsOCwwLDIyNCwzLDQ4LDAsMTg5LDM5LAorCTIzMiwyNTUsMTg5LDM5LDQwLDAsMTY1LDE0MywxNiwwLDE5MSwxNzUsCisJMjAwLDc2LDE5MiwxMiwzMywzMiwyMjQsMCwxNiwwLDE5MSwxNDMsCisJMjQsMCwxODksMzksOCwwLDIyNCwzLDAsMCwwLDAsCisJMTYsMCwxNjMsMTQzLDE0LDAsMiwzNiw5NiwwLDIyNiwxNzIsCisJMTcsMCw5OCwxNDQsMCwwLDAsMCwyLDAsNjYsNTIsCisJOCwwLDIyNCwzLDE3LDAsOTgsMTYwLDIyNCwyNTUsMTg5LDM5LAorCTE2LDAsMTc2LDE3NSwzMywxMjgsMjI0LDAsMTcsMCwyLDM2LAorCTI0LDAsMTkxLDE3NSwyMCwwLDE3NywxNzUsOTYsMCwyLDE3NCwKKwk0OCwwLDE3NywxNDMsMzMsMzIsMCwyLDQ4LDcyLDE5MiwxMiwKKwkzMyw0MCwzMiwyLDEsMCw2NiwzNiwxMDAsMCwyLDE3NCwKKwkxNywwLDM0LDE0NiwwLDAsMCwwLDEsMCw2Niw1MiwKKwkxNywwLDM0LDE2MiwyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMzIsMCwxODksMzksCisJMTYsMCwxNjMsMTQzLDAsMCwwLDAsMTcsMCw5OCwxNDQsCisJMCwwLDAsMCwxOCwwLDY2LDUyLDgsMCwyMjQsMywKKwkxNywwLDk4LDE2MCw4LDAsMjI0LDMsMzMsMTYsMjI0LDAsCisJMjI0LDI1NSwxODksMzksNDgsMCwxNjgsMTQzLDEsMCwyLDM2LAorCTExNCwwLDE2MiwyMCwyNCwwLDE5MSwxNzUsMCwwLDE5NSwxNDAsCisJMCwwLDAsMCwxMTAsMCw5NiwxNiwwLDAsMCwwLAorCTMyLDEzMywxMzAsMTQzLDAsMCwwLDAsNDMsMTYsNjcsMCwKKwkxMDUsMCw2NCwyMCwyNTUsMjU1LDk4LDM2LDY0LDE4LDIsMCwKKwkyLDEzMSwzLDYwLDE5MiwyNDYsOTksMzYsMzMsMjQsNjcsMCwKKwkyNTUsMjU1LDEzMiwzNiwxNywwLDEzMCw0NCw5NywwLDY0LDE2LAorCTEyOCwxNiw0LDAsMiwxMzEsMSw2MCwzMyw4LDM0LDAsCisJMCwxNDksMzQsMTQwLDAsMCwwLDAsOCwwLDY0LDAsCisJMCwwLDAsMCwyLDAsMiwzNiwxNiwwLDIsMTYxLAorCTE3LDAsMiwxNDUsMCwwLDE5NSwxNDAsMCwwLDAsMCwKKwkxNDAsNTMsMTkyLDgsMiwwLDY2LDUyLDIsMCwyLDM2LAorCTE2LDAsMiwxNjEsNDQsMCw5OSwxNDAsMTcsMCwyLDE0NSwKKwkxNiwwLDk5LDE0MCwwLDAsMCwwLDEwMSw1MywxOTIsOCwKKwkyLDAsNjYsNTIsMiwwLDIsMzYsMTYsMCwyLDE2MSwKKwk0NCwwLDk5LDE0MCwxNywwLDIsMTQ1LDEyLDAsOTksMTQwLAorCTIsMCw2Niw1MiwxNywwLDIsMTYxLDE3Myw1MywxOTIsOCwKKwk0MCwwLDMsMTczLDIsMCwyLDM2LDE2LDAsMiwxNjEsCisJMTcsMCwyLDE0NSwyMTIsMCw5OSwxNDAsMCwwLDAsMCwKKwkxNDAsNTMsMTkyLDgsMiwwLDY2LDUyLDIsMCwyLDM2LAorCTE2LDAsMiwxNjEsMTcsMCwyLDE0NSwxOTIsMCw5OSwxNDAsCisJMCwwLDAsMCwxNDAsNTMsMTkyLDgsMiwwLDY2LDUyLAorCTIsMCwyLDM2LDE2LDAsMiwxNjEsMTcsMCwyLDE0NSwKKwkyMDgsMCw5OSwxNDAsMCwwLDAsMCwxNDAsNTMsMTkyLDgsCisJMiwwLDY2LDUyLDIsMCwyLDM2LDE2LDAsMiwxNjEsCisJMjA0LDAsOTgsMTQwLDE4NCwwLDEwMCwxNDAsMTcsMCwzLDE0NSwKKwkzMywxNiw2OCwwLDIsMCw5OSw1Miw0MCwwLDIsMTczLAorCTE3Myw1MywxOTIsOCwxNywwLDMsMTYxLDIsMCwyLDM2LAorCTE2LDAsMiwxNjEsMTcsMCwyLDE0NSwxOTYsMCw5OSwxNDAsCisJMiwwLDY2LDUyLDQwLDAsMywxNzMsMTczLDUzLDE5Miw4LAorCTE3LDAsMiwxNjEsMTcsMCwzLDE0NSwyLDAsMiwzNiwKKwkxNiwwLDIsMTYxLDQwLDAsMCwxNzMsMiwwLDk5LDUyLAorCTE3Myw1MywxOTIsOCwxNywwLDMsMTYxLDIsMCwyLDM2LAorCTE2LDAsMiwxNjEsNDQsMCwxMDAsMTQwLDE3LDAsMiwxNDUsCisJMjAsMCwxMzEsMTQwLDI0LDAsMTMyLDE0MCwyLDAsNjYsNTIsCisJMTcsMCwyLDE2MSwzMywyNCwxMDAsMCwxNzMsNTMsMTkyLDgsCisJNDAsMCwzLDE3MywxNiwwLDE2MCwxNzUsMzMsMzIsMjI0LDAsCisJMzMsNDAsMCwxLDIsMTMxLDcsNjAsMTA0LDIwNCwyMzEsMzYsCisJMjI2LDc2LDE5MiwxMiwxMSwwLDYsMzYsMTczLDUzLDE5Miw4LAorCTAsMCwwLDAsMzMsMzIsMjI0LDAsMjAwLDc2LDE5MiwxMiwKKwkzMyw0MCwwLDEsMjQsMCwxOTEsMTQzLDMyLDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDIwOCwyNTUsMTg5LDM5LAorCTMyLDAsMTc2LDE3NSw2NCwwLDE3NiwxNDMsMzYsMCwxNzcsMTc1LAorCTMzLDEzNiwyMjQsMCw0LDAsMTYwLDIwLDQwLDAsMTkxLDE3NSwKKwkxLDAsMiwzNiwyMDAsNTMsMTkyLDgsMjQsMCwxNjIsMTc1LAorCTAsMCwxOTgsMTQwLDMyLDEzMywxMzAsMTQzLDAsMCwwLDAsCisJNDMsMTYsMTk0LDAsMywwLDY0LDE2LDEsMCwxOTQsMzYsCisJMjAwLDUzLDE5Miw4LDI0LDAsMTYyLDE3NSwxNywwLDIsMTQ2LAorCTAsMCwwLDAsMTgsMCw2Niw1MiwyMTAsNTMsMTkyLDgsCisJMTcsMCwyLDE2MiwxNiwwLDE3NiwxNzUsMSwwLDUsMzYsCisJMjQsMCwxNjYsMzksNTIsNTMsMTkyLDEyLDMzLDU2LDMyLDIsCisJMzMsMzIsMzIsMiwzMyw0MCwwLDIsMSwwLDYsMzYsCisJMjUzLDc2LDE5MiwxMiwyNCwwLDE2NywzOSw0MCwwLDE5MSwxNDMsCisJMzYsMCwxNzcsMTQzLDMyLDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDgsMCwxODksMzksMCwwLDIyNiwxNDAsOCwwLDIyNCwzLAorCTAsMCwwLDAsMywxMzEsMiw2MCwyOCwxOCw2NiwxNDgsCisJMCwwLDAsMCwyLDAsNjYsNDgsMiwwLDY0LDE2LAorCTIsMCwzLDM2LDEsMCwzLDM2LDgsMCwyMjQsMywKKwkzMywxNiw5NiwwLDIzMiwyNTUsMTg5LDM5LDQwLDAsMTY0LDE0MywKKwkxNiwwLDE5MSwxNzUsMSwwLDEzMiw1NiwxODYsNTksMTkyLDEyLAorCTEsMCwxMzIsNDQsMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDE2LDAsMTYzLDE0MywKKwk2LDAsMiwzNiwwLDAsOTgsMTcyLDgsMCwyMjQsMywKKwkzMywxNiwyMjQsMCwyMjQsMjU1LDE4OSwzOSw0OCwwLDE2OCwxNDMsCisJMSwwLDIsMzYsNTIsMCwxNjIsMjAsMjQsMCwxOTEsMTc1LAorCTAsMCwxOTcsMTQwLDAsMCwwLDAsNDgsMCwxNjAsMTYsCisJMCwwLDAsMCwyNCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTQzLDE2LDY5LDAsNDMsMCw2NCwyMCwyNTUsMjU1LDEzMiwzNiwKKwk1LDAsMTMwLDQ0LDQwLDAsNjQsMTYsMTI4LDE2LDQsMCwKKwkyLDEzMSwxLDYwLDMzLDgsMzQsMCw3MiwxNDksMzQsMTQwLAorCTAsMCwwLDAsOCwwLDY0LDAsMCwwLDAsMCwKKwkyLDAsMiwzNiwxNiwwLDIsMTYxLDE3LDAsMiwxNDUsCisJMCwwLDE5NSwxNDAsMiwwLDY2LDUyLDQwLDAsMywxNzMsCisJNDUsNTQsMTkyLDgsMTcsMCwyLDE2MSwyLDAsMiwzNiwKKwkxNiwwLDIsMTYxLDAsMCwxOTQsMTQwLDE3LDAsMywxNDUsCisJMSwwLDY2LDM2LDIsMCw5OSw1Miw0MCwwLDIsMTczLAorCTQ1LDU0LDE5Miw4LDE3LDAsMywxNjEsMTYsMCwxNjAsMTc1LAorCTMzLDMyLDIyNCwwLDMzLDQwLDAsMSwyLDEzMSw3LDYwLAorCTE0OCwyMDQsMjMxLDM2LDIyNiw3NiwxOTIsMTIsMiwwLDYsMzYsCisJNDUsNTQsMTkyLDgsMCwwLDAsMCwxNywwLDMsMTQ1LAorCTIsMCwyLDM2LDE2LDAsMiwxNjEsNDAsMCwwLDE3MywKKwkyLDAsOTksNTIsNDUsNTQsMTkyLDgsMTcsMCwzLDE2MSwKKwkzMywzMiwyMjQsMCwyMDAsNzYsMTkyLDEyLDMzLDQwLDAsMSwKKwkyNCwwLDE5MSwxNDMsMzIsMCwxODksMzksOCwwLDIyNCwzLAorCTAsMCwwLDAsMjA4LDI1NSwxODksMzksMzIsMCwxNzYsMTc1LAorCTY0LDAsMTc2LDE0MywzNiwwLDE3NywxNzUsMzMsMTM2LDIyNCwwLAorCTQsMCwxNjAsMjAsNDAsMCwxOTEsMTc1LDEsMCwyLDM2LAorCTcyLDU0LDE5Miw4LDI0LDAsMTYyLDE3NSwwLDAsMTk4LDE0MCwKKwkyNCwxMzMsMTMwLDE0MywwLDAsMCwwLDQzLDE2LDE5NCwwLAorCTMsMCw2NCwxNiwxLDAsMTk0LDM2LDcyLDU0LDE5Miw4LAorCTI0LDAsMTYyLDE3NSwxNywwLDIsMTQ2LDAsMCwwLDAsCisJMTgsMCw2Niw1Miw4Miw1NCwxOTIsOCwxNywwLDIsMTYyLAorCTE2LDAsMTc2LDE3NSwxLDAsNSwzNiwyNCwwLDE2NiwzOSwKKwkyNDIsNTMsMTkyLDEyLDMzLDU2LDMyLDIsMzMsMzIsMzIsMiwKKwkzMyw0MCwwLDIsMSwwLDYsMzYsMjUzLDc2LDE5MiwxMiwKKwkyNCwwLDE2NywzOSw0MCwwLDE5MSwxNDMsMzYsMCwxNzcsMTQzLAorCTMyLDAsMTc2LDE0Myw4LDAsMjI0LDMsNDgsMCwxODksMzksCisJMCwwLDIyNiwxNDgsOCwwLDIyNCwzLDAsMCwwLDAsCisJOCwwLDIyNCwzLDMzLDE2LDIyNCwwLDE2LDAsMTYzLDE0MywKKwk4LDAsMiwzNiwwLDAsOTgsMTcyLDgsMCwyMjQsMywKKwkzMywxNiwyMjQsMCwyMjQsMjU1LDE4OSwzOSwxNiwwLDE3NiwxNzUsCisJNDgsMCwxNzYsMTQzLDEsMCwyLDM2LDI0LDAsMTkxLDE3NSwKKwkxMjYsMCwxNjIsMjAsMjAsMCwxNzcsMTc1LDAsMCwxOTgsMTQwLAorCTAsMCwwLDAsMTIyLDAsMTkyLDE2LDAsMCwwLDAsCisJMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCw0MywxNiw3MCwwLAorCTExNywwLDY0LDIwLDE5MiwxNyw2LDAsMywxMzEsMyw2MCwKKwkxNiwxMyw5OSwzNiwzMywxMzYsNjcsMCwyNTUsMjU1LDEzMiwzNiwKKwkxMCwwLDEzMCw0NCwxMTAsMCw2NCwxNiwxMjgsMTYsNCwwLAorCTIsMTMxLDEsNjAsMzMsOCwzNCwwLDk2LDE0OSwzNCwxNDAsCisJMCwwLDAsMCw4LDAsNjQsMCwwLDAsMCwwLAorCTE3LDAsMywxNDYsMiwwLDIsMzYsMTYsMCwyLDE2MiwKKwkyMTEsNTQsMTkyLDgsNDAsMCw2LDE3NCwyLDAsMiwzNiwKKwkxNiwwLDIsMTYyLDAsMCwzNCwxNTAsMTcsMCwzLDE0NiwKKwkwLDAsMCwwLDE0Myw1NCwxOTIsOCwyLDE4LDIsMCwKKwkyLDAsMiwzNiwxNiwwLDIsMTYyLDQsMCwzNCwxNDIsCisJMTcsMCwzLDE0NiwxLDAsNjYsMzYsMiwwLDk5LDUyLAorCTQwLDAsMiwxNzQsMjMyLDU0LDE5Miw4LDE3LDAsMywxNjIsCisJMiwwLDIsMzYsMTYsMCwyLDE2Miw0LDAsMzQsMTQyLAorCTAsMCwwLDAsMiwwLDY0LDE2LDIsMCwzLDM2LAorCTEsMCwzLDM2LDE3LDAsMiwxNDYsNDAsMCwzLDE3NCwKKwkyLDAsNjYsNTIsMjMyLDU0LDE5Miw4LDE3LDAsMiwxNjIsCisJMiwwLDIsMzYsMTYsMCwyLDE2MiwxNywwLDIsMTQ2LAorCTgsMCwzNSwxNDIsMCwwLDAsMCwyMjYsNTQsMTkyLDgsCisJMiwwLDY2LDUyLDksNTAsMTkyLDEyLDgsMCw0LDM2LAorCTMzLDQ4LDY0LDAsMTUsMCwzNCwxMzgsMTIsMCwzNCwxNTQsCisJMTksMCwzNSwxMzgsMTYsMCwzNSwxNTQsMywwLDE5NCwxNjgsCisJMCwwLDE5NCwxODQsNywwLDE5NSwxNjgsMTk2LDU0LDE5Miw4LAorCTQsMCwxOTUsMTg0LDIsMCwyLDM2LDE2LDAsMiwxNjIsCisJMTcsMCwyLDE0NiwyMCwwLDM1LDE0MiwwLDAsMCwwLAorCTIyNiw1NCwxOTIsOCwyLDAsNjYsNTIsOSw1MCwxOTIsMTIsCisJOCwwLDQsMzYsMzMsNDgsNjQsMCwyNywwLDM0LDEzOCwKKwkyNCwwLDM0LDE1NCwzMSwwLDM1LDEzOCwyOCwwLDM1LDE1NCwKKwkzLDAsMTk0LDE2OCwwLDAsMTk0LDE4NCw3LDAsMTk1LDE2OCwKKwk0LDAsMTk1LDE4NCwwLDAsMTk0LDE0OCwwLDAsMCwwLAorCTAsMjYsMiwwLDIsMTgsMiwwLDM3LDI0LDk4LDAsCisJMCwwLDE5NSwxNjQsMTcsMCwzLDE0Niw0LDAsMiwzNiwKKwkxNiwwLDIsMTYyLDEsMCwyLDM2LDQwLDAsMiwxNjYsCisJOCwwLDE5NCwzNiw0NCwwLDYsMTc0LDQ4LDAsMiwxNzQsCisJNTIsMCwwLDE2NiwyLDAsOTksNTIsMjMyLDU0LDE5Miw4LAorCTE3LDAsMywxNjIsMiwwLDIsMzYsMTYsMCwyLDE2MiwKKwkxNywwLDIsMTQ2LDMyLDAsMzUsMTUwLDAsMCwwLDAsCisJMjI2LDU0LDE5Miw4LDIsMCw2Niw1MiwyLDAsMiwzNiwKKwkxNiwwLDIsMTYyLDE3LDAsMiwxNDYsMTA0LDAsMzUsMTQyLAorCTIsMCw2Niw1Miw0MCwwLDMsMTc0LDIzMiw1NCwxOTIsOCwKKwkxNywwLDIsMTYyLDMzLDMyLDIyNCwwLDIwMCw3NiwxOTIsMTIsCisJMzMsNDAsMCwyLDI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywzMiwwLDE4OSwzOSwKKwkyMjQsMjU1LDE4OSwzOSwxNiwwLDE3NiwxNzUsMzMsMTI4LDIyNCwwLAorCTIwLDAsMTc3LDE3NSw0OCwwLDE3NywxNDMsMSwwLDIsMzYsCisJMTAsMCwxNjIsMjAsMjQsMCwxOTEsMTc1LDAsMCwxOTgsMTQwLAorCTAsMCwwLDAsNiwwLDE5MiwxNiwwLDAsMCwwLAorCTI0LDEzMywxMzAsMTQzLDAsMCwwLDAsNDMsMTYsNzAsMCwKKwk1LDAsNjQsMTYsMiwwLDIsMzYsMzMsMzIsMCwyLAorCTMzLDQwLDMyLDIsMTMsNTUsMTkyLDgsMTEsMCwyLDM2LAorCTE0LDAsMTMwLDE2LDIsMCwxMzAsNDQsNSwwLDY0LDIwLAorCTYsMCwxMzAsNDQsMywwLDY0LDE2LDQsMCwxMzAsNDQsCisJOCwwLDY0LDE2LDAsMCwwLDAsMzMsMzIsMCwyLAorCTMzLDQwLDMyLDIsMTcsMCwyLDM2LDQ4LDcyLDE5MiwxMiwKKwk5NiwwLDIsMTc0LDEsMCw2NiwzNiwxMDAsMCwyLDE3NCwKKwkxNywwLDM0LDE0NiwwLDAsMCwwLDEsMCw2Niw1MiwKKwkxNywwLDM0LDE2MiwyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMzIsMCwxODksMzksCisJMjA4LDI1NSwxODksMzksMzIsMCwxNzYsMTc1LDY0LDAsMTc2LDE0MywKKwkzNiwwLDE3NywxNzUsMzMsMTM2LDIyNCwwLDQsMCwxNjAsMjAsCisJNDAsMCwxOTEsMTc1LDEsMCwyLDM2LDQ5LDU1LDE5Miw4LAorCTI0LDAsMTYyLDE3NSwwLDAsMTk4LDE0MCwyNCwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDQzLDE2LDE5NCwwLDMsMCw2NCwxNiwKKwkxLDAsMTk0LDM2LDQ5LDU1LDE5Miw4LDI0LDAsMTYyLDE3NSwKKwkxNywwLDIsMTQ2LDAsMCwwLDAsMTgsMCw2Niw1MiwKKwk1OSw1NSwxOTIsOCwxNywwLDIsMTYyLDE2LDAsMTc2LDE3NSwKKwkxLDAsNSwzNiwyNCwwLDE2NiwzOSw5Nyw1NCwxOTIsMTIsCisJMzMsNTYsMzIsMiwzMywzMiwzMiwyLDMzLDQwLDAsMiwKKwkxLDAsNiwzNiwyNTMsNzYsMTkyLDEyLDI0LDAsMTY3LDM5LAorCTQwLDAsMTkxLDE0MywzNiwwLDE3NywxNDMsMzIsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0OCwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwKKwkzMyw2NCwxMjgsMCwxNiwwLDE3NiwxNzUsNDAsMCwxNzYsMTQzLAorCTEsMCwyLDM2LDU3LDAsMTYyLDIwLDIwLDAsMTkxLDE3NSwKKwkwLDAsMTk2LDE0MCwwLDAsMCwwLDU0LDAsMTI4LDE2LAorCTE0LDAsMiwzNiwyNCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTQzLDE2LDY4LDAsNDksMCw2NCwyMCwxNCwwLDIsMzYsCisJMTkyLDE3LDQsMCwzLDEzMSwzLDYwLDE2LDEzLDk5LDM2LAorCTMzLDQ4LDY3LDAsNCwwLDIsMzYsMjEsMCwyLDE3LAorCTUsMCwyLDQ1LDUsMCw2NCwxNiwyLDAsMiwzNiwKKwk4LDAsMiwxNywxNCwwLDIsMzYsMTI5LDU1LDE5Miw4LAorCTk2LDAsMjI2LDE3Miw1LDAsMiwzNiwyOCwwLDIsMTcsCisJMTQsMCwyLDM2LDEyOSw1NSwxOTIsOCw5NiwwLDIyNiwxNzIsCisJMCwwLDE5NSwxNDQsMCwwLDAsMCwwLDAsMTk1LDE2NCwKKwk0MCwwLDIsMTQyLDAsMCwwLDAsMCwxOCwyLDAsCisJMzcsMjQsOTgsMCwxMjksNTUsMTkyLDgsMCwwLDE5NSwxNjQsCisJNDAsMCwzLDE0MiwwLDAsMCwwLDUsMCwxMDEsMTYsCisJMiwwLDIsMzYsNywwLDk4LDE2LDE0LDAsMiwzNiwKKwkxMjksNTUsMTkyLDgsOTYsMCwyMjYsMTcyLDE4Nyw0MiwxOTIsMTIsCisJMSwwLDUsMzYsMTI5LDU1LDE5Miw4LDAsMCwwLDAsCisJMTg3LDQyLDE5MiwxMiwzMyw0MCwwLDAsMTI5LDU1LDE5Miw4LAorCTAsMCwwLDAsNDAsMCwyLDE0MiwwLDAsMCwwLAorCTEyOSw1NSwxOTIsOCw4LDAsMTk0LDE3MiwxNCwwLDIsMzYsCisJOTYsMCwyMjYsMTcyLDE3LDAsMiwxNDYsMCwwLDAsMCwKKwkyLDAsNjYsNTIsMTcsMCwyLDE2MiwyMCwwLDE5MSwxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywyNCwwLDE4OSwzOSwKKwkyMTYsMjU1LDE4OSwzOSwyMCwwLDE3NywxNzUsMzMsMTM2LDEyOCwwLAorCTI4LDAsMTc5LDE3NSwzMywxNTIsMTYwLDAsMjQsMCwxNzgsMTc1LAorCTMzLDE0NCwyMjQsMCwxNiwwLDE3NiwxNzUsNTYsMCwxNzYsMTQzLAorCTEsMCwyLDM2LDQ2LDAsOTgsMjIsMzIsMCwxOTEsMTc1LAorCTAsMCwxOTYsMTQwLDAsMCwwLDAsNDIsMCwxMjgsMTYsCisJMCwwLDAsMCw1OCwyNSwxOTIsMTIsMCwwLDAsMCwKKwkzMywzMiw2NCwwLDM3LDAsMTI4LDE2LDIsMCwyLDM2LAorCTExLDAsMzQsMTgsMywwLDM0LDQ2LDUsMCw2NCwxNiwKKwkzLDAsMiwzNiwxNSwwLDUxLDE4LDQsMCwyLDM2LAorCTE5NSw1NSwxOTIsOCwzMywzMiw2NCwyLDIwLDAsMzQsMTgsCisJMzMsMzIsNjQsMiwxOTUsNTUsMTkyLDgsMCwwLDAsMCwKKwkyLDAsMiwzNiwxNiwwLDIsMTYyLDE3LDAsMiwxNDYsCisJMTAsMCwxMzEsMTMyLDIsMCw2Niw1Miw0MCwwLDMsMTc0LAorCTE5Nyw1NSwxOTIsOCwxNywwLDIsMTYyLDE3LDAsMywxNDYsCisJMTYsMCwyLDE2Miw0LDAsMTMwLDM2LDQ0LDAsMiwxNzQsCisJMTAsMCwxMzAsMzYsNDAsMCwwLDE2Niw0OCwwLDIsMTc0LAorCTE5MSw1NSwxOTIsOCw1MiwwLDAsMTY2LDE3LDAsMywxNDYsCisJMiwwLDIsMzYsMTYsMCwyLDE2Miw0MCwwLDE3LDE3NCwKKwkyLDAsOTksNTIsMTk3LDU1LDE5Miw4LDE3LDAsMywxNjIsCisJMzMsMzIsNjQsMiwyMDAsNzYsMTkyLDEyLDMzLDQwLDAsMiwKKwkzMiwwLDE5MSwxNDMsMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk0MCwwLDE4OSwzOSwyMDgsMjU1LDE4OSwzOSwzMiwwLDE3NiwxNzUsCisJNjQsMCwxNzYsMTQzLDQwLDAsMTc4LDE3NSwzMywxNDQsMTI4LDAsCisJMzYsMCwxNzcsMTc1LDMzLDEzNiwyMjQsMCwzLDAsMTYwLDIwLAorCTQ0LDAsMTkxLDE3NSwyMTgsNTUsMTkyLDgsMSwwLDIsMzYsCisJMCwwLDE5NCwxNDAsMCwwLDAsMCwxLDAsNjYsMzYsCisJMjQsMCwxNjIsMTc1LDI0LDAsMTY0LDE0Myw1OCwyNSwxOTIsMTIsCisJMCwwLDAsMCw2LDAsNjQsMjAsMzMsMzIsNjQsMiwKKwkxNywwLDIsMTQ2LDAsMCwwLDAsMTgsMCw2Niw1MiwKKwkyMzksNTUsMTkyLDgsMTcsMCwyLDE2MiwxNiwwLDE3NiwxNzUsCisJMSwwLDUsMzYsMjQsMCwxNjYsMzksMTM3LDU1LDE5MiwxMiwKKwkzMyw1NiwzMiwyLDMzLDMyLDMyLDIsMzMsNDAsMCwyLAorCTEsMCw2LDM2LDI1Myw3NiwxOTIsMTIsMjQsMCwxNjcsMzksCisJNDQsMCwxOTEsMTQzLDQwLDAsMTc4LDE0MywzNiwwLDE3NywxNDMsCisJMzIsMCwxNzYsMTQzLDgsMCwyMjQsMyw0OCwwLDE4OSwzOSwKKwkyMzIsMjU1LDE4OSwzOSw0MCwwLDE2OCwxNDMsMSwwLDIsMzYsCisJNjMsMCwxNjIsMjAsMTYsMCwxOTEsMTc1LDAsMCwxOTUsMTQwLAorCTAsMCwwLDAsNTksMCw5NiwxNiwwLDAsMCwwLAorCTI0LDEzMywxMzAsMTQzLDAsMCwwLDAsNDMsMTYsNjcsMCwKKwk1NCwwLDY0LDIwLDY0LDE4LDMsMCwyLDEzMSwzLDYwLAorCTE5MiwyNDYsOTksMzYsMzMsMjQsNjcsMCwyNTUsMjU1LDEzMiwzNiwKKwk1LDAsMTMwLDQ0LDQ3LDAsNjQsMTYsMTI4LDE2LDQsMCwKKwkyLDEzMSwxLDYwLDMzLDgsMzQsMCwxMzYsMTQ5LDM0LDE0MCwKKwkwLDAsMCwwLDgsMCw2NCwwLDAsMCwwLDAsCisJMiwwLDIsMzYsMTYsMCwyLDE2MSwxNywwLDIsMTQ1LAorCTAsMCwxOTUsMTQwLDAsMCwwLDAsNDMsNTYsMTkyLDgsCisJMiwwLDY2LDUyLDIsMCwyLDM2LDE2LDAsMiwxNjEsCisJMTcsMCwyLDE0NSwyMjAsNSwzLDM2LDQwLDAsMywxNzMsCisJMiwwLDY2LDUyLDU5LDU2LDE5Miw4LDE3LDAsMiwxNjEsCisJNjUsMCwyLDM2LDE2LDAsMiwxNjEsMTcsMCwyLDE0NSwKKwkxNTYsMCw5OSwxNDAsMCwwLDAsMCw0Myw1NiwxOTIsOCwKKwkyLDAsNjYsNTIsNjUsMCwyLDM2LDE2LDAsMiwxNjEsCisJMTcsMCwyLDE0NSwxNzIsMCw5OSwxNDAsMiwwLDY2LDUyLAorCTQwLDAsMywxNzMsNTksNTYsMTkyLDgsMTcsMCwyLDE2MSwKKwk2NSwwLDIsMzYsMTYsMCwyLDE2MSwxNTYsMCw5OCwxNDAsCisJMjUyLDAsMTAwLDE0MCwxNywwLDMsMTQ1LDM1LDE2LDY4LDAsCisJMiwwLDk5LDUyLDQwLDAsMiwxNzMsNTksNTYsMTkyLDgsCisJMTcsMCwzLDE2MSwzMywzMiwyMjQsMCwyMDAsNzYsMTkyLDEyLAorCTMzLDQwLDAsMSwxNiwwLDE5MSwxNDMsMjQsMCwxODksMzksCisJOCwwLDIyNCwzLDAsMCwwLDAsMjA4LDI1NSwxODksMzksCisJMzIsMCwxNzYsMTc1LDY0LDAsMTc2LDE0MywzNiwwLDE3NywxNzUsCisJMzMsMTM2LDIyNCwwLDQsMCwxNjAsMjAsNDAsMCwxOTEsMTc1LAorCTEsMCwyLDM2LDg2LDU2LDE5Miw4LDI0LDAsMTYyLDE3NSwKKwkwLDAsMTk4LDE0MCwyNCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTQzLDE2LDE5NCwwLDMsMCw2NCwxNiwxLDAsMTk0LDM2LAorCTg2LDU2LDE5Miw4LDI0LDAsMTYyLDE3NSwxNywwLDIsMTQ2LAorCTAsMCwwLDAsMTgsMCw2Niw1Miw5Niw1NiwxOTIsOCwKKwkxNywwLDIsMTYyLDE2LDAsMTc2LDE3NSwxLDAsNSwzNiwKKwkyNCwwLDE2NiwzOSwyNDUsNTUsMTkyLDEyLDMzLDU2LDMyLDIsCisJMzMsMzIsMzIsMiwzMyw0MCwwLDIsMSwwLDYsMzYsCisJMjUzLDc2LDE5MiwxMiwyNCwwLDE2NywzOSw0MCwwLDE5MSwxNDMsCisJMzYsMCwxNzcsMTQzLDMyLDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDgsMCwxODksMzksMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMjAwLDI1NSwxODksMzksNzIsMCwxNjMsMTQzLAorCTQ0LDAsMTc3LDE3NSwzMywxMzYsMTI4LDAsMjAsMCwxNjUsMTc1LAorCTMzLDQwLDIyNCwwLDIsMTMxLDIsNjAsMTcyLDIxMCw2NiwxNDAsCisJMTUyLDEzMiwxMzUsMTQzLDMzLDMyLDAsMCw0OCwwLDE5MSwxNzUsCisJNDAsMCwxNzYsMTc1LDI0LDAsMTYwLDE3NSwyOCwwLDE2MCwxNzUsCisJMzYsMCwxNjAsMTc1LDE2LDAsMTYyLDE3NSwxMDQsNzcsMTkyLDEyLAorCTMyLDAsMTYzLDE3NSwzMywxMjgsNjQsMCwzLDAsMCwyMiwKKwkzMywzMiwwLDIsMTQzLDU2LDE5Miw4LDMzLDE2LDAsMCwKKwkxOTcsODAsMTkyLDEyLDMzLDQwLDMyLDIsMjU1LDI1NSwzLDM2LAorCTUsMCw2NywyMCwwLDAsMCwwLDE2Nyw4MywxOTIsMTIsCisJMzMsMzIsMCwyLDE0Myw1NiwxOTIsOCwzMywxNiwwLDAsCisJMTY3LDgzLDE5MiwxMiwzMywzMiwwLDIsOCwwLDM0LDE0MiwKKwk0LDAsMzUsMTQyLDAsMCwwLDAsMzUsMTYsNjcsMCwKKwkyNTUsMjU1LDY2LDQ4LDQ4LDAsMTkxLDE0Myw0NCwwLDE3NywxNDMsCisJNDAsMCwxNzYsMTQzLDgsMCwyMjQsMyw1NiwwLDE4OSwzOSwKKwkyMDAsMjU1LDE4OSwzOSw0NCwwLDE3NywxNzUsMzMsMTM2LDEyOCwwLAorCTcyLDAsMTY4LDE0MywzMywzMiwwLDAsMjAsMCwxNjUsMTc1LAorCTMzLDQwLDIyNCwwLDIsMTMxLDMsNjAsMTcyLDIxMCw5OSwxNDAsCisJMTUyLDEzMiwxMzUsMTQzLDEsMCwyLDM2LDQ4LDAsMTkxLDE3NSwKKwk0MCwwLDE3NiwxNzUsMjQsMCwxNjIsMTc1LDI4LDAsMTYwLDE3NSwKKwkzNiwwLDE2MCwxNzUsMTYsMCwxNjMsMTc1LDEwNCw3NywxOTIsMTIsCisJMzIsMCwxNjgsMTc1LDMzLDEyOCw2NCwwLDMsMCwwLDIyLAorCTMzLDMyLDAsMiwxODgsNTYsMTkyLDgsMzMsMTYsMCwwLAorCTE5Nyw4MCwxOTIsMTIsMzMsNDAsMzIsMiwyNTUsMjU1LDMsMzYsCisJNSwwLDY3LDIwLDAsMCwwLDAsMTY3LDgzLDE5MiwxMiwKKwkzMywzMiwwLDIsMTg4LDU2LDE5Miw4LDMzLDE2LDAsMCwKKwkxNjcsODMsMTkyLDEyLDMzLDMyLDAsMiw4LDAsMzQsMTQyLAorCTQsMCwzNSwxNDIsMCwwLDAsMCwzNSwxNiw2NywwLAorCTI1NSwyNTUsNjYsNDgsNDgsMCwxOTEsMTQzLDQ0LDAsMTc3LDE0MywKKwk0MCwwLDE3NiwxNDMsOCwwLDIyNCwzLDU2LDAsMTg5LDM5LAorCTE3NiwyNTUsMTg5LDM5LDQ0LDAsMTc3LDE3NSwxMDgsMCwxNzcsMTQzLAorCTY4LDAsMTgzLDE3NSw5NiwwLDE4MywxNDMsNzIsMCwxOTAsMTc1LAorCTEwMCwwLDE5MCwxNDMsNDgsMCwxNzgsMTc1LDMzLDE0NCwxMjgsMCwKKwk1NiwwLDE4MCwxNzUsMzMsMTYwLDE2MCwwLDUyLDAsMTc5LDE3NSwKKwkzMywxNTIsMTkyLDAsNDAsMCwxNzYsMTc1LDMzLDEyOCwyMjQsMCwKKwk2MCwwLDE4MSwxNzUsMSwwLDIxLDM2LDc2LDAsMTkxLDE3NSwKKwkzLDAsNTMsMTgsNjQsMCwxODIsMTc1LDksNTcsMTkyLDgsCisJMjU1LDI1NSwyLDM2LDQsMCw2LDM2LDIsMTMxLDIyLDYwLAorCTQ4LDIwNSwyMTQsMzgsMTYwLDEzMiwxMzIsMTQzLDEwNCwwLDE2NSwxNDMsCisJMTI4LDMyLDQsMCw4MCw2OCwxOTIsMTIsMzMsMzIsMTUwLDAsCisJMzMsMzIsMCwwLDMzLDQwLDAsMiwxNTIsMTMyLDEzNSwxNDMsCisJMiwwLDIsMzYsMjQsMCwxNjIsMTc1LDE2MCwxMzIsMTMwLDE0MywKKwkyLDEzMSwzLDYwLDE3MiwyMTAsOTksMTQwLDMzLDQ4LDk2LDIsCisJMjAsMCwxODAsMTc1LDI4LDAsMTYwLDE3NSwzMiwwLDE4MywxNzUsCisJMzYsMCwxODEsMTc1LDEsMCw4MSwzNiwxMDQsNzcsMTkyLDEyLAorCTE2LDAsMTYzLDE3NSwzMywxMjgsNjQsMCwyMywwLDAsMTgsCisJMzMsNDAsMCwwLDE2LDAsMTkwLDE3NSwzMywzMiwwLDIsCisJMzMsNDgsMzIsMiwxMDgsODQsMTkyLDEyLDMzLDU2LDE5MiwyLAorCTI1NSwyNTUsMTcsMzYsMTMsMCw4MSwxNiwzMywzMiwwLDIsCisJMTk3LDgwLDE5MiwxMiwzMyw0MCw2NCwyLDksMCw4MSwxNiwKKwkwLDAsMCwwLDE2Nyw4MywxOTIsMTIsMzMsMzIsMCwyLAorCTgsMCw2NiwxNDIsNCwwLDY3LDE0MiwwLDAsMCwwLAorCTM1LDE2LDY3LDAsOSw1NywxOTIsOCwyNTUsMjU1LDY2LDQ4LAorCTE2Nyw4MywxOTIsMTIsMzMsMzIsMCwyLDMzLDE2LDAsMCwKKwk3NiwwLDE5MSwxNDMsNzIsMCwxOTAsMTQzLDY4LDAsMTgzLDE0MywKKwk2NCwwLDE4MiwxNDMsNjAsMCwxODEsMTQzLDU2LDAsMTgwLDE0MywKKwk1MiwwLDE3OSwxNDMsNDgsMCwxNzgsMTQzLDQ0LDAsMTc3LDE0MywKKwk0MCwwLDE3NiwxNDMsOCwwLDIyNCwzLDgwLDAsMTg5LDM5LAorCTE3NiwyNTUsMTg5LDM5LDQ0LDAsMTc3LDE3NSwxMDgsMCwxNzcsMTQzLAorCTY4LDAsMTgzLDE3NSw5NiwwLDE4MywxNDMsNzIsMCwxOTAsMTc1LAorCTEwMCwwLDE5MCwxNDMsNDgsMCwxNzgsMTc1LDMzLDE0NCwxMjgsMCwKKwk1NiwwLDE4MCwxNzUsMzMsMTYwLDE2MCwwLDUyLDAsMTc5LDE3NSwKKwkzMywxNTIsMTkyLDAsNDAsMCwxNzYsMTc1LDMzLDEyOCwyMjQsMCwKKwk2MCwwLDE4MSwxNzUsMSwwLDIxLDM2LDc2LDAsMTkxLDE3NSwKKwkzLDAsNTMsMTgsNjQsMCwxODIsMTc1LDkzLDU3LDE5Miw4LAorCTI1NSwyNTUsMiwzNiw0LDAsNiwzNiwyLDEzMSwyMiw2MCwKKwk0OCwyMDUsMjE0LDM4LDE2MCwxMzIsMTMyLDE0MywxMDQsMCwxNjUsMTQzLAorCTEyOCwzMiw0LDAsODAsNjgsMTkyLDEyLDMzLDMyLDE1MCwwLAorCTMzLDMyLDAsMCwzMyw0MCwwLDIsMTUyLDEzMiwxMzUsMTQzLAorCTMsMCwyLDM2LDI0LDAsMTYyLDE3NSwxNjAsMTMyLDEzMCwxNDMsCisJMiwxMzEsMyw2MCwxNzIsMjEwLDk5LDE0MCwzMyw0OCw5NiwyLAorCTIwLDAsMTgwLDE3NSwyOCwwLDE2MCwxNzUsMzIsMCwxODMsMTc1LAorCTM2LDAsMTgxLDE3NSwxLDAsODEsMzYsMTA0LDc3LDE5MiwxMiwKKwkxNiwwLDE2MywxNzUsMzMsMTI4LDY0LDAsMjMsMCwwLDE4LAorCTMzLDQwLDAsMCwxNiwwLDE5MCwxNzUsMzMsMzIsMCwyLAorCTMzLDQ4LDMyLDIsMTA4LDg0LDE5MiwxMiwzMyw1NiwxOTIsMiwKKwkyNTUsMjU1LDE3LDM2LDEzLDAsODEsMTYsMzMsMzIsMCwyLAorCTE5Nyw4MCwxOTIsMTIsMzMsNDAsNjQsMiw5LDAsODEsMTYsCisJMCwwLDAsMCwxNjcsODMsMTkyLDEyLDMzLDMyLDAsMiwKKwk4LDAsNjYsMTQyLDQsMCw2NywxNDIsMCwwLDAsMCwKKwkzNSwxNiw2NywwLDkzLDU3LDE5Miw4LDI1NSwyNTUsNjYsNDgsCisJMTY3LDgzLDE5MiwxMiwzMywzMiwwLDIsMzMsMTYsMCwwLAorCTc2LDAsMTkxLDE0Myw3MiwwLDE5MCwxNDMsNjgsMCwxODMsMTQzLAorCTY0LDAsMTgyLDE0Myw2MCwwLDE4MSwxNDMsNTYsMCwxODAsMTQzLAorCTUyLDAsMTc5LDE0Myw0OCwwLDE3OCwxNDMsNDQsMCwxNzcsMTQzLAorCTQwLDAsMTc2LDE0Myw4LDAsMjI0LDMsODAsMCwxODksMzksCisJMjAwLDI1NSwxODksMzksNDQsMCwxNzcsMTc1LDMzLDEzNiwxMjgsMCwKKwk3MiwwLDE2OCwxNDMsMzMsMzIsMCwwLDIwLDAsMTY1LDE3NSwKKwkzMyw0MCwyMjQsMCwyLDEzMSwzLDYwLDE3MiwyMTAsOTksMTQwLAorCTE1MiwxMzIsMTM1LDE0Myw0LDAsMiwzNiw0OCwwLDE5MSwxNzUsCisJNDAsMCwxNzYsMTc1LDI0LDAsMTYyLDE3NSwyOCwwLDE2MCwxNzUsCisJMzYsMCwxNjAsMTc1LDE2LDAsMTYzLDE3NSwxMDQsNzcsMTkyLDEyLAorCTMyLDAsMTY4LDE3NSwzMywxMjgsNjQsMCwzLDAsMCwyMiwKKwkzMywzMiwwLDIsMTQ1LDU3LDE5Miw4LDMzLDE2LDAsMCwKKwkxOTcsODAsMTkyLDEyLDMzLDQwLDMyLDIsMjU1LDI1NSwzLDM2LAorCTUsMCw2NywyMCwwLDAsMCwwLDE2Nyw4MywxOTIsMTIsCisJMzMsMzIsMCwyLDE0NSw1NywxOTIsOCwzMywxNiwwLDAsCisJMTY3LDgzLDE5MiwxMiwzMywzMiwwLDIsOCwwLDM0LDE0MiwKKwk0LDAsMzUsMTQyLDAsMCwwLDAsMzUsMTYsNjcsMCwKKwkyNTUsMjU1LDY2LDQ4LDQ4LDAsMTkxLDE0Myw0NCwwLDE3NywxNDMsCisJNDAsMCwxNzYsMTQzLDgsMCwyMjQsMyw1NiwwLDE4OSwzOSwKKwkyMDAsMjU1LDE4OSwzOSw0NCwwLDE3NywxNzUsMzMsMTM2LDEyOCwwLAorCTcyLDAsMTYzLDE0MywzMywzMiwwLDAsMjAsMCwxNjUsMTc1LAorCTMzLDQwLDIyNCwwLDE2NCwxMzIsMTM1LDE0MywyLDEzMSwyLDYwLAorCTkyLDIwNSw2NiwzNiwxNiwwLDE2MiwxNzUsNiwwLDIsMzYsCisJMjQsMCwxNjIsMTc1LDEsMCwyLDM2LDQ4LDAsMTkxLDE3NSwKKwk0MCwwLDE3NiwxNzUsMjgsMCwxNjIsMTc1LDM2LDAsMTYwLDE3NSwKKwkxMDQsNzcsMTkyLDEyLDMyLDAsMTYzLDE3NSwzMywxMjgsNjQsMCwKKwkzLDAsMCwyMiwzMywzMiwwLDIsMTkxLDU3LDE5Miw4LAorCTMzLDE2LDAsMCwxOTcsODAsMTkyLDEyLDMzLDQwLDMyLDIsCisJMjU1LDI1NSwzLDM2LDUsMCw2NywyMCwwLDAsMCwwLAorCTE2Nyw4MywxOTIsMTIsMzMsMzIsMCwyLDE5MSw1NywxOTIsOCwKKwkzMywxNiwwLDAsMTY3LDgzLDE5MiwxMiwzMywzMiwwLDIsCisJOCwwLDM0LDE0Miw0LDAsMzUsMTQyLDAsMCwwLDAsCisJMzUsMTYsNjcsMCwyNTUsMjU1LDY2LDQ4LDQ4LDAsMTkxLDE0MywKKwk0NCwwLDE3NywxNDMsNDAsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk1NiwwLDE4OSwzOSwyMDAsMjU1LDE4OSwzOSw0NCwwLDE3NywxNzUsCisJMzMsMTM2LDEyOCwwLDcyLDAsMTYzLDE0MywzMywzMiwwLDAsCisJMjAsMCwxNjUsMTc1LDMzLDQwLDIyNCwwLDE2NCwxMzIsMTM1LDE0MywKKwkyLDEzMSwyLDYwLDkyLDIwNSw2NiwzNiwxNiwwLDE2MiwxNzUsCisJNiwwLDIsMzYsMjQsMCwxNjIsMTc1LDIsMCwyLDM2LAorCTQ4LDAsMTkxLDE3NSw0MCwwLDE3NiwxNzUsMjgsMCwxNjIsMTc1LAorCTM2LDAsMTYwLDE3NSwxMDQsNzcsMTkyLDEyLDMyLDAsMTYzLDE3NSwKKwkzMywxMjgsNjQsMCwzLDAsMCwyMiwzMywzMiwwLDIsCisJMjM3LDU3LDE5Miw4LDMzLDE2LDAsMCwxOTcsODAsMTkyLDEyLAorCTMzLDQwLDMyLDIsMjU1LDI1NSwzLDM2LDUsMCw2NywyMCwKKwkwLDAsMCwwLDE2Nyw4MywxOTIsMTIsMzMsMzIsMCwyLAorCTIzNyw1NywxOTIsOCwzMywxNiwwLDAsMTY3LDgzLDE5MiwxMiwKKwkzMywzMiwwLDIsOCwwLDM0LDE0Miw0LDAsMzUsMTQyLAorCTAsMCwwLDAsMzUsMTYsNjcsMCwyNTUsMjU1LDY2LDQ4LAorCTQ4LDAsMTkxLDE0Myw0NCwwLDE3NywxNDMsNDAsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw1NiwwLDE4OSwzOSwwLDAsMCwwLAorCTAsMCwwLDAsMjI0LDI1NSwxODksMzksMjQsMCwxNzgsMTc1LAorCTMzLDE0NCwxMjgsMCwyMCwwLDE3NywxNzUsMywxMzEsMTcsNjAsCisJMCwxOCw0OSwzOCwxNiwwLDE3NiwxNzUsMzMsMTI4LDAsMCwKKwkyOCwwLDE5MSwxNzUsMjA4LDEzMywxMjgsMTc1LDYwLDY1LDE5MiwxMiwKKwkzMywzMiwwLDIsMCwwLDM0LDE2NiwxLDAsMTYsMzgsCisJNjQsMCwyLDQyLDI1MCwyNTUsNjQsMjAsMiwwLDQ5LDM4LAorCTMsMTMxLDMsNjAsMTgsMTgsOTksMTQ0LDI1NSwwLDIsMzYsCisJMywwLDk4LDE2LDAsMCwwLDAsNiwwLDY0LDE4LAorCTAsMTYzLDQsNjAsNzUsNTksMTkyLDEyLDMyLDAsNCwzNiwKKwk4Nyw1OSwxOTIsMTIsMjU1LDAsNCwzNiwwLDE2Myw0LDYwLAorCTIyMCw1LDEzMiw1MiwxNzYsMTMyLDEzMywzOSwxNjgsNzEsMTkyLDEyLAorCTQsMCw2LDM2LDI1LDAsNjQsMjAsMCwxNjMsNCw2MCwKKwkzLDEzMSwxNiw2MCwyMCwxOCwxNiwzOCwzMywzMiwwLDIsCisJMTc2LDEzMiwxMzMsMzksMTY4LDcxLDE5MiwxMiw0LDAsNiwzNiwKKwkzLDAsNjQsMTYsMCwxNjMsNCw2MCw3LDAsNjQsMTgsCisJMCwwLDAsMCwyMjAsNSwxMzIsNTIsMzMsNDAsMCwwLAorCTE0NCw3MSwxOTIsMTIsNCwwLDYsMzYsNDcsNTgsMTkyLDgsCisJMCwxNjMsNCw2MCwwLDE2Myw1LDYwLDIyMCw1LDE2NSw1MiwKKwkzLDAsMiwxMzgsMCwwLDIsMTU0LDAsMCwwLDAsCisJMywwLDE2MiwxNjgsMCwwLDE2MiwxODQsMCwxNjMsNCw2MCwKKwk5OSw1OSwxOTIsMTIsMjIwLDUsMTMyLDUyLDAsMTYzLDQsNjAsCisJMTYsNiwxMzIsNTIsMTc2LDEzMiwxMzMsMzksMTY4LDcxLDE5MiwxMiwKKwk0LDAsNiwzNiwyNSwwLDY0LDIwLDAsMTYzLDQsNjAsCisJMywxMzEsMTYsNjAsNjgsMTgsMTYsMzgsMzMsMzIsMCwyLAorCTE3NiwxMzIsMTMzLDM5LDE2OCw3MSwxOTIsMTIsNCwwLDYsMzYsCisJMywwLDY0LDE2LDAsMTYzLDQsNjAsNywwLDY0LDE4LAorCTAsMCwwLDAsMTYsNiwxMzIsNTIsMzMsNDAsMCwwLAorCTE0NCw3MSwxOTIsMTIsNCwwLDYsMzYsODAsNTgsMTkyLDgsCisJMCwxNjMsNCw2MCwwLDE2Myw1LDYwLDE2LDYsMTY1LDUyLAorCTMsMCwyLDEzOCwwLDAsMiwxNTQsMCwwLDAsMCwKKwkzLDAsMTYyLDE2OCwwLDAsMTYyLDE4NCwwLDE2Myw0LDYwLAorCTExOSw1OSwxOTIsMTIsMTYsNiwxMzIsNTIsMCwxNjMsNCw2MCwKKwkyMjQsNSwxMzIsNTIsMTc2LDEzMiwxMzMsMzksMTY4LDcxLDE5MiwxMiwKKwk0LDAsNiwzNiwyNSwwLDY0LDIwLDAsMTYzLDQsNjAsCisJMywxMzEsMTYsNjAsMjQsMTgsMTYsMzgsMzMsMzIsMCwyLAorCTE3NiwxMzIsMTMzLDM5LDE2OCw3MSwxOTIsMTIsNCwwLDYsMzYsCisJMywwLDY0LDE2LDAsMTYzLDQsNjAsNywwLDY0LDE4LAorCTAsMCwwLDAsMjI0LDUsMTMyLDUyLDMzLDQwLDAsMCwKKwkxNDQsNzEsMTkyLDEyLDQsMCw2LDM2LDExMyw1OCwxOTIsOCwKKwkwLDE2Myw0LDYwLDAsMTYzLDUsNjAsMjI0LDUsMTY1LDUyLAorCTMsMCwyLDEzOCwwLDAsMiwxNTQsMCwwLDAsMCwKKwkzLDAsMTYyLDE2OCwwLDAsMTYyLDE4NCwwLDE2Myw0LDYwLAorCTEzOSw1OSwxOTIsMTIsMjI0LDUsMTMyLDUyLDMsMTMxLDMsNjAsCisJMjgsMTgsOTksMzYsMCwwLDk4LDE0OCwwLDAsMCwwLAorCTAsMTI4LDY2LDQ4LDMsMCw2NCwyMCwxLDAsMiwzNiwKKwkyLDAsNjQsMTgsMCwwLDAsMCwwLDAsOTgsMTY0LAorCTAsMTYzLDIsNjAsMTQ0LDEsNjYsMTQwLDAsMCwwLDAsCisJNywwLDY0LDIwLDAsMCwwLDAsMywxMzEsMyw2MCwKKwkyOCwxOCw5OSwzNiwwLDAsOTgsMTQ4LDAsMCwwLDAsCisJMTQ2LDU4LDE5Miw4LDI1NCwyNTUsNjYsNDgsMCwxNjMsMiw2MCwKKwkxNDQsMSw2NiwxNDAsMCwwLDAsMCw3LDAsNjQsMjQsCisJMCwwLDAsMCwzLDEzMSwzLDYwLDI4LDE4LDk5LDM2LAorCTAsMCw5OCwxNDgsMCwwLDAsMCwxLDAsNjYsNTIsCisJMCwwLDk4LDE2NCwzLDEzMSw0LDYwLDI4LDE4LDEzMiwxNDgsCisJMCwwLDAsMCwxNTksNTksMTkyLDEyLDEsMCwxMzIsNDgsCisJMywxMzEsMyw2MCw4MCwxOCw5OSwxNDQsMjU1LDAsMiwzNiwKKwkzLDAsOTgsMTYsMCwwLDAsMCw1LDAsNjQsMTgsCisJMCwwLDAsMCwyLDEzMSw0LDYwLDE2MCwxNDksMTMyLDM2LAorCTIwNSw1OSwxOTIsMTIsMTQsMCw1LDM2LDMsMTMxLDMsNjAsCisJOTYsMTgsOTksMTQ0LDI1NSwwLDIsMzYsMywwLDk4LDE2LAorCTAsMCwwLDAsNSwwLDY0LDE4LDAsMCwwLDAsCisJMiwxMzEsNCw2MCwxNzYsMTQ5LDEzMiwzNiwyMzksNTksMTkyLDEyLAorCTExLDAsNSwzNiwzLDEzMSwzLDYwLDExMiwxOCw5OSwxNDQsCisJMjU1LDAsMiwzNiwzLDAsOTgsMTYsMCwwLDAsMCwKKwk1LDAsNjQsMTgsMCwwLDAsMCwyLDEzMSw0LDYwLAorCTE4OCwxNDksMTMyLDM2LDE3LDYwLDE5MiwxMiwxNSwwLDUsMzYsCisJMCwxNjMsMiw2MCwxNDAsMSw2NiwxNDAsMCwwLDAsMCwKKwk3LDAsNjQsMTYsMTUsMCwyLDYwLDAsMTYzLDMsNjAsCisJMTQwLDEsOTksMTQwLDY0LDY2LDY2LDUyLDQzLDE2LDY3LDAsCisJMjYsMCw2NCwxNiwwLDAsMCwwLDMsMTMxLDMsNjAsCisJNjQsMTgsOTksMTQwLDI1NSwyNTUsMiwzNiwzLDAsOTgsMTYsCisJNDQsMSwyLDM2LDQsMCw2NCwxOCwwLDAsMCwwLAorCTAsMTYzLDEsNjAsMjIxLDU4LDE5Miw4LDE0MCwxLDM0LDE3MiwKKwk1LDAsOTYsMjAsMTUsMCw0LDYwLDEsMCwyLDM2LAorCTAsMTYzLDEsNjAsMjIxLDU4LDE5Miw4LDE0MCwxLDM0LDE3MiwKKwk2NCw2NiwxMzIsNTIsNDMsMTYsMTMxLDAsNCwwLDY0LDE2LAorCTAsMCwwLDAsMCwxNjMsMSw2MCwyMjEsNTgsMTkyLDgsCisJMTQwLDEsMzYsMTcyLDAsMTYzLDEsNjAsMTQwLDEsMzUsMTcyLAorCTAsMTYzLDQsNjAsMTQwLDEsMTMyLDE0MCw1MSw2MCwxOTIsMTIsCisJMCwwLDAsMCwyOCwwLDE5MSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTMyLDAsMTg5LDM5LDIwOCwyNTUsMTg5LDM5LDIwLDAsMTc3LDE3NSwKKwkzMywxMzYsMTI4LDAsMzYsMCwxODEsMTc1LDMzLDE2OCwxNjAsMCwKKwkyOCwwLDE3OSwxNzUsMzMsMTUyLDE5MiwwLDQ0LDAsMTkxLDE3NSwKKwk0MCwwLDE4MiwxNzUsMzIsMCwxODAsMTc1LDI0LDAsMTc4LDE3NSwKKwkxNjgsNzEsMTkyLDEyLDE2LDAsMTc2LDE3NSw3NiwwLDY0LDE2LAorCTAsMCwwLDAsMywxMzEsMjIsNjAsMCwxOCwyMTQsMzgsCisJMzUsMTYsNTQsMiwxOTQsMzEsMiwwLDMzLDE2LDY3LDAsCisJNjcsMTQ0LDIsMCwxLDAsOTgsMzgsMTk0LDMxLDIsMCwKKwkzMywxNiw2NywwLDY3LDEyOCwyLDAsMjU1LDI1NSwyMCwzOCwKKwk2NCwwLDEzMCw0NiwxNCwwLDY0LDIwLDY0LDAsNjYsNDYsCisJMiwxMzEsNCw2MCwyMDQsMTQ5LDEzMiwzNiwxODAsMTMyLDE0NCwzOSwKKwkzMyw0MCwwLDIsMiwxMzEsNyw2MCwyMzYsMTQ5LDIzMSwzNiwKKwkxNSw2MywxOTIsMTIsMTQzLDAsNiwzNiwxLDAsNCwzNiwKKwkzMyw0MCwwLDIsMTg4LDcsMTkyLDEyLDE0MywwLDYsMzYsCisJNjQsMCw2Niw0NiwxNCwwLDY0LDIwLDMzLDMyLDMyLDIsCisJMiwxMzEsNCw2MCwyMDQsMTQ5LDEzMiwzNiwxODAsMTMyLDE0NCwzOSwKKwkzMyw0MCwwLDIsMiwxMzEsNyw2MCwyMCwxNTAsMjMxLDM2LAorCTE1LDYzLDE5MiwxMiwxNDQsMCw2LDM2LDEsMCw0LDM2LAorCTMzLDQwLDAsMiwxODgsNywxOTIsMTIsMTQ0LDAsNiwzNiwKKwkzMywzMiwzMiwyLDMzLDQwLDE2MCwyLDgwLDY4LDE5MiwxMiwKKwkzMyw0OCw5NiwyLDY0LDE2LDE4LDAsMzMsMTM2LDg2LDAsCisJMzMsMTI4LDEyOCwyLDI1NSwyNTUsMiwzNiwyNSwwLDIsMTgsCisJMjU1LDI1NSwyMCwzNiwxODAsMTMyLDE0NywzOSwzMywzMiw2NCwyLAorCTIwOCwxMzMsMTMwLDE0MywxLDAsODIsMzgsMSwwLDY2LDM2LAorCTIwOCwxMzMsMTMwLDE3NSwwLDAsMzcsMTUwLDAsMCwwLDAsCisJMTYyLDY1LDE5MiwxMiwyLDAsNDksMzgsMTAsMCw2NCwyMCwKKwkzMyw0MCw5NiwyLDIsMTMxLDQsNjAsMjA0LDE0OSwxMzIsMzYsCisJMTg4LDEzMiwxMzUsMzksMTUsNjMsMTkyLDEyLDE1OSwwLDYsMzYsCisJMSwwLDQsMzYsMzMsNDAsOTYsMiwxODgsNywxOTIsMTIsCisJMTU5LDAsNiwzNiwyNTUsMjU1LDE2LDM4LDIzNSwyNTUsMjAsMjIsCisJMzMsMzIsNjQsMiw0NCwwLDE5MSwxNDMsNDAsMCwxODIsMTQzLAorCTM2LDAsMTgxLDE0MywzMiwwLDE4MCwxNDMsMjgsMCwxNzksMTQzLAorCTI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0OCwwLDE4OSwzOSwyMjQsMjU1LDE4OSwzOSwKKwkxNiwwLDE2NCwxNjMsMywxMzEsNCw2MCwxOCwxOCwxMzIsMzYsCisJMTYsMCwxNjUsMzksMjQsMCwxOTEsMTc1LDIzMSw1OCwxOTIsMTIsCisJMSwwLDYsMzYsMjQsMCwxOTEsMTQzLDMyLDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDIyNCwyNTUsMTg5LDM5LAorCTE2LDAsMTY0LDE2MywzLDEzMSw0LDYwLDE5LDE4LDEzMiwzNiwKKwkxNiwwLDE2NSwzOSwyNCwwLDE5MSwxNzUsMjMxLDU4LDE5MiwxMiwKKwkxLDAsNiwzNiwyNCwwLDE5MSwxNDMsMzIsMCwxODksMzksCisJOCwwLDIyNCwzLDAsMCwwLDAsMjMyLDI1NSwxODksMzksCisJMzMsNDAsMTI4LDAsMTYsMCwxNzYsMTc1LDMsMTMxLDE2LDYwLAorCTIwLDE4LDE2LDM4LDMzLDMyLDAsMiwyMCwwLDE5MSwxNzUsCisJMjMxLDU4LDE5MiwxMiw0LDAsNiwzNiwwLDE2Myw1LDYwLAorCTIyMCw1LDE2NSw1MiwzLDAsMiwxMzgsMCwwLDIsMTU0LAorCTAsMCwwLDAsMywwLDE2MiwxNjgsMCwwLDE2MiwxODQsCisJMjAsMCwxOTEsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMjQsMCwxODksMzksMjMyLDI1NSwxODksMzksMzMsNDAsMTI4LDAsCisJMTYsMCwxNzYsMTc1LDMsMTMxLDE2LDYwLDY4LDE4LDE2LDM4LAorCTMzLDMyLDAsMiwyMCwwLDE5MSwxNzUsMjMxLDU4LDE5MiwxMiwKKwk0LDAsNiwzNiwwLDE2Myw1LDYwLDE2LDYsMTY1LDUyLAorCTMsMCwyLDEzOCwwLDAsMiwxNTQsMCwwLDAsMCwKKwkzLDAsMTYyLDE2OCwwLDAsMTYyLDE4NCwyMCwwLDE5MSwxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywyNCwwLDE4OSwzOSwKKwkyMzIsMjU1LDE4OSwzOSwzMyw0MCwxMjgsMCwxNiwwLDE3NiwxNzUsCisJMywxMzEsMTYsNjAsMjQsMTgsMTYsMzgsMzMsMzIsMCwyLAorCTIwLDAsMTkxLDE3NSwyMzEsNTgsMTkyLDEyLDQsMCw2LDM2LAorCTAsMTYzLDUsNjAsMjI0LDUsMTY1LDUyLDMsMCwyLDEzOCwKKwkwLDAsMiwxNTQsMCwwLDAsMCwzLDAsMTYyLDE2OCwKKwkwLDAsMTYyLDE4NCwyMCwwLDE5MSwxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywyNCwwLDE4OSwzOSwzLDEzMSwyLDYwLAorCTI4LDE4LDY2LDE0OCwyMjQsMjU1LDE4OSwzOSwyNCwwLDE5MSwxNzUsCisJOCwwLDEyOCwxNiwxNiwwLDE2MiwxNjcsMSwwLDY2LDUyLAorCTE2LDAsMTYyLDE2NywxLDAsMiwzNiw0NCwxMzMsMTMwLDE3NSwKKwkwLDE2MywxLDYwLDE3Nyw1OSwxOTIsOCwxNDQsMSwzNCwxNzIsCisJMjU0LDI1NSw2Niw0OCwxNiwwLDE2MiwxNjcsNDQsMTMzLDEyOCwxNzUsCisJMCwxNjMsMSw2MCwxNDQsMSwzMiwxNzIsMywxMzEsNCw2MCwKKwkyOCwxOCwxMzIsMzYsMTYsMCwxNjUsMzksMjMxLDU4LDE5MiwxMiwKKwkyLDAsNiwzNiwyNCwwLDE5MSwxNDMsMzIsMCwxODksMzksCisJOCwwLDIyNCwzLDAsMCwwLDAsMywxMzEsMiw2MCwKKwkyOCwxOCw2NiwxNDgsMjI0LDI1NSwxODksMzksMjQsMCwxOTEsMTc1LAorCTMsMCwxMjgsMTYsMTYsMCwxNjIsMTY3LDE5NSw1OSwxOTIsOCwKKwkyLDAsNjYsNTIsMjUzLDI1NSw2Niw0OCwxNiwwLDE2MiwxNjcsCisJMywxMzEsNCw2MCwyOCwxOCwxMzIsMzYsMTYsMCwxNjUsMzksCisJMjMxLDU4LDE5MiwxMiwyLDAsNiwzNiwyNCwwLDE5MSwxNDMsCisJMzIsMCwxODksMzksOCwwLDIyNCwzLDAsMCwwLDAsCisJMjE2LDI1NSwxODksMzksMzIsMCwxOTEsMTc1LDMzLDU2LDEyOCwwLAorCTMzLDQ4LDE2MCwwLDMsMCwyMjYsMTM2LDAsMCwyMjYsMTUyLAorCTcsMCwyMjcsMTM2LDQsMCwyMjcsMTUyLDExLDAsMjI4LDEzNiwKKwk4LDAsMjI4LDE1MiwxNSwwLDIyOSwxMzYsMTIsMCwyMjksMTUyLAorCTE5LDAsMTYyLDE3MSwxNiwwLDE2MiwxODcsMjMsMCwxNjMsMTcxLAorCTIwLDAsMTYzLDE4NywyNywwLDE2NCwxNzEsMjQsMCwxNjQsMTg3LAorCTMxLDAsMTY1LDE3MSwyOCwwLDE2NSwxODcsMTYsMCwxOTQsNDQsCisJMywwLDY0LDE2LDE2LDAsMTYzLDM5LDMzLDE2LDEwMiwwLAorCTAsMCw2NCwxNjAsMywxMzEsNCw2MCw4MCwxOCwxMzIsMzYsCisJMzMsNDAsMjI0LDAsMjMxLDU4LDE5MiwxMiwxNiwwLDYsMzYsCisJMzIsMCwxOTEsMTQzLDQwLDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDIxNiwyNTUsMTg5LDM5LDMyLDAsMTkxLDE3NSwKKwkzMyw1NiwxMjgsMCwzMyw0OCwxNjAsMCwzLDAsMjI2LDEzNiwKKwkwLDAsMjI2LDE1Miw3LDAsMjI3LDEzNiw0LDAsMjI3LDE1MiwKKwkxMSwwLDIyOCwxMzYsOCwwLDIyOCwxNTIsMTUsMCwyMjksMTM2LAorCTEyLDAsMjI5LDE1MiwxOSwwLDE2MiwxNzEsMTYsMCwxNjIsMTg3LAorCTIzLDAsMTYzLDE3MSwyMCwwLDE2MywxODcsMjcsMCwxNjQsMTcxLAorCTI0LDAsMTY0LDE4NywzMSwwLDE2NSwxNzEsMjgsMCwxNjUsMTg3LAorCTE2LDAsMTk0LDQ0LDMsMCw2NCwxNiwxNiwwLDE2MywzOSwKKwkzMywxNiwxMDIsMCwwLDAsNjQsMTYwLDMsMTMxLDQsNjAsCisJOTYsMTgsMTMyLDM2LDMzLDQwLDIyNCwwLDIzMSw1OCwxOTIsMTIsCisJMTYsMCw2LDM2LDMyLDAsMTkxLDE0Myw0MCwwLDE4OSwzOSwKKwk4LDAsMjI0LDMsMCwwLDAsMCwyMTYsMjU1LDE4OSwzOSwKKwkzMiwwLDE5MSwxNzUsMzMsNTYsMTI4LDAsMzMsNDgsMTYwLDAsCisJMywwLDIyNiwxMzYsMCwwLDIyNiwxNTIsNywwLDIyNywxMzYsCisJNCwwLDIyNywxNTIsMTEsMCwyMjgsMTM2LDgsMCwyMjgsMTUyLAorCTE1LDAsMjI5LDEzNiwxMiwwLDIyOSwxNTIsMTksMCwxNjIsMTcxLAorCTE2LDAsMTYyLDE4NywyMywwLDE2MywxNzEsMjAsMCwxNjMsMTg3LAorCTI3LDAsMTY0LDE3MSwyNCwwLDE2NCwxODcsMzEsMCwxNjUsMTcxLAorCTI4LDAsMTY1LDE4NywxNiwwLDE5NCw0NCwzLDAsNjQsMTYsCisJMTYsMCwxNjMsMzksMzMsMTYsMTAyLDAsMCwwLDY0LDE2MCwKKwkzLDEzMSw0LDYwLDExMiwxOCwxMzIsMzYsMzMsNDAsMjI0LDAsCisJMjMxLDU4LDE5MiwxMiwxNiwwLDYsMzYsMzIsMCwxOTEsMTQzLAorCTQwLDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTIzMiwyNTUsMTg5LDM5LDE1LDAsMiw2MCw1NCw2Niw2Niw1MiwKKwkyNCwwLDE2NCwxNzUsMjQ2LDI1NSwxMzIsMzYsNDMsMTYsNjgsMCwKKwkzLDAsNjQsMTYsMTYsMCwxOTEsMTc1LDQ0LDEsMiwzNiwKKwkyNCwwLDE2MiwxNzUsMywxMzEsNCw2MCw2NCwxOCwxMzIsMzYsCisJMjQsMCwxNjUsMzksMjMxLDU4LDE5MiwxMiw0LDAsNiwzNiwKKwkyNCwwLDE2MiwxNDMsMCwxNjMsMSw2MCwxNDAsMSwzNCwxNzIsCisJMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDIzMiwyNTUsMTg5LDM5LDE2LDAsMTkxLDE3NSwKKwkwLDM4LDQsMCwxOTYsNjQsMTkyLDEyLDMsMzgsNCwwLAorCTE2LDAsMTkxLDE0MywyNCwwLDE4OSwzOSw4LDAsMjI0LDMsCisJMCwwLDAsMCwyMzIsMjU1LDE4OSwzOSwxNiwwLDE5MSwxNzUsCisJMCwzOCw0LDAsMTk2LDY0LDE5MiwxMiwzLDM4LDQsMCwKKwkxNiwwLDE5MSwxNDMsMjQsMCwxODksMzksOCwwLDIyNCwzLAorCTAsMCwwLDAsMTYwLDI1NSwxODksMzksMTEyLDAsMTYyLDE0MywKKwk3MiwwLDE3NiwxNzUsMzMsMTI4LDIyNCwwLDg4LDAsMTgwLDE3NSwKKwkzMywxNjAsMCwwLDg0LDAsMTc5LDE3NSwzMywxNTIsMTkyLDAsCisJOTIsMCwxOTEsMTc1LDgwLDAsMTc4LDE3NSw3LDAsMTYwLDE2LAorCTc2LDAsMTc3LDE3NSw2LDAsNjUsNCw1MSwwLDE3NywzOSwKKwk0NSwwLDIwLDM2LDMsMCwwLDE4LDM1LDE2LDIsMCwKKwkyNTUsMjU1LDE2LDM4LDUxLDAsMTc3LDM5LDUxLDAsMTYwLDE2MywKKwkyNywwLDY4LDAsMiwwLDEyOCwyMCwwLDAsMCwwLAorCTEzLDAsNywwLDE4LDI0LDAsMCwxNiwxNiwwLDAsCisJMiwxMzEsMSw2MCwzMyw4LDM0LDAsMTI4LDIwNSwzNCwxNDQsCisJMjU1LDI1NSw0OSwzOCwyLDAsMCwxOCwwLDAsMzQsMTYyLAorCTI1NSwyNTUsMTYsMzgsMzMsMTYsOTYsMCwyNDEsMjU1LDY0LDIwLAorCTEsMCwzLDM2LDAsMjIsMTksMCwzLDIyLDIsMCwKKwkxMSwwLDY3LDIwLDMzLDMyLDEyOCwyLDI1NSwyNTUsMTYsMzgsCisJMjU1LDI1NSwyLDM2LDcsMCwyLDE4LDAsMCwwLDAsCisJMjU1LDI1NSwxOCwzNiwxOTYsNjQsMTkyLDEyLDMyLDAsNCwzNiwKKwkyNTUsMjU1LDE2LDM4LDI1MiwyNTUsMTgsMjIsMzMsMzIsMTI4LDIsCisJNCwwLDEyOCwxNiwwLDIyLDE5LDAsMTk2LDY0LDE5MiwxMiwKKwkwLDAsMCwwLDAsMjIsMTksMCwzLDIyLDIsMCwKKwkyLDAsMywzNiwxNCwwLDY3LDIwLDI1NSwyNTUsMiwzNiwKKwkyNTUsMjU1LDE2LDM4LDExLDAsMiwxOCwyNTUsMjU1LDE4LDM2LAorCTE5Niw2NCwxOTIsMTIsNDgsMCw0LDM2LDI1NSwyNTUsMTYsMzgsCisJNiwwLDE4LDE4LDAsMCwwLDAsMTU2LDYwLDE5Miw4LAorCTAsMCwwLDAsMCwzOCw0LDAsMTk2LDY0LDE5MiwxMiwKKwkzLDM4LDQsMCwwLDAsMzQsMTMwLDAsMCwzNiwxNDYsCisJMCwwLDAsMCwyNDksMjU1LDY0LDIwLDEsMCw0OSwzOCwKKwkyNTUsMjU1LDQ5LDM4LDAsMjIsMTksMCwzLDIyLDIsMCwKKwkzLDAsMywzNiw5LDAsNjcsMjAsMjU1LDI1NSwxNiwzOCwKKwkyNTUsMjU1LDIsMzYsNiwwLDIsMTgsMjU1LDI1NSwxNywzNiwKKwkxOTYsNjQsMTkyLDEyLDMyLDAsNCwzNiwyNTUsMjU1LDE2LDM4LAorCTI1MiwyNTUsMTcsMjIsMCwwLDAsMCw5MiwwLDE5MSwxNDMsCisJODgsMCwxODAsMTQzLDg0LDAsMTc5LDE0Myw4MCwwLDE3OCwxNDMsCisJNzYsMCwxNzcsMTQzLDcyLDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJOTYsMCwxODksMzksMjAwLDI1NSwxODksMzksNDAsMCwxNzgsMTc1LAorCTMzLDE0NCwxMjgsMCwzMiwwLDE3NiwxNzUsMzMsMTI4LDE2MCwwLAorCTM2LDAsMTc3LDE3NSwzMywxMzYsMTkyLDAsMzMsMzIsMzIsMiwKKwk0OCwwLDE5MSwxNzUsMTU2LDcxLDE5MiwxMiw0NCwwLDE3OSwxNzUsCisJMzMsMzIsMCwwLDMzLDI0LDY0LDAsNDIsMTYsMTEyLDAsCisJMiwwLDY0LDE2LDMzLDE1Miw2NCwyLDM1LDMyLDMsMiwKKwkwLDIyLDE4LDAsMywyMiwyLDAsMSwwLDMsMzYsCisJMTEsMCw2NywyMCwzMywxMjgsMTI4LDAsMjU1LDI1NSwxNiwzOCwKKwkyNTUsMjU1LDIsMzYsOCwwLDIsMTgsMCwyMiwxOSwwLAorCTI1NSwyNTUsMTgsMzYsMTk2LDY0LDE5MiwxMiwzMiwwLDQsMzYsCisJMjU1LDI1NSwxNiwzOCwyNTIsMjU1LDE4LDIyLDAsMCwwLDAsCisJMCwyMiwxOSwwLDMsMjIsMiwwLDIsMCwzLDM2LAorCTE0LDAsNjcsMjAsMjU1LDI1NSwyLDM2LDI1NSwyNTUsMTYsMzgsCisJMTEsMCwyLDE4LDI1NSwyNTUsMTgsMzYsMTk2LDY0LDE5MiwxMiwKKwk0OCwwLDQsMzYsMjU1LDI1NSwxNiwzOCw2LDAsMTgsMTgsCisJMCwwLDAsMCwyMzMsNjAsMTkyLDgsMCwwLDAsMCwKKwkwLDM4LDQsMCwxOTYsNjQsMTkyLDEyLDMsMzgsNCwwLAorCTAsMCwzNCwxMzAsMCwwLDM2LDE0NiwwLDAsMCwwLAorCTI0OSwyNTUsNjQsMjAsMSwwLDQ5LDM4LDI1NSwyNTUsNDksMzgsCisJMCwyMiwxOSwwLDMsMjIsMiwwLDMsMCwzLDM2LAorCTksMCw2NywyMCwyNTUsMjU1LDE2LDM4LDI1NSwyNTUsMiwzNiwKKwk2LDAsMiwxOCwyNTUsMjU1LDE3LDM2LDE5Niw2NCwxOTIsMTIsCisJMzIsMCw0LDM2LDI1NSwyNTUsMTYsMzgsMjUyLDI1NSwxNywyMiwKKwkwLDAsMCwwLDQ4LDAsMTkxLDE0Myw0NCwwLDE3OSwxNDMsCisJNDAsMCwxNzgsMTQzLDM2LDAsMTc3LDE0MywzMiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDU2LDAsMTg5LDM5LDMyLDI1NSwxODksMzksCisJMTkyLDAsMTc4LDE3NSwzMywxNDQsMTYwLDAsMTk2LDAsMTc5LDE3NSwKKwkzMywxNTIsMCwwLDIyMCwwLDE5MSwxNzUsMjE2LDAsMTkwLDE3NSwKKwkyMTIsMCwxODMsMTc1LDIwOCwwLDE4MiwxNzUsMjA0LDAsMTgxLDE3NSwKKwkyMDAsMCwxODAsMTc1LDE4OCwwLDE3NywxNzUsMTg0LDAsMTc2LDE3NSwKKwkxLDAsMTMwLDEyOCwwLDAsMCwwLDIyOSwxLDY0LDE2LAorCTMzLDEzNiwwLDAsMjU1LDI1NSwyMiwzNiwxLDAsMjMsMzYsCisJMiwwLDMwLDM2LDEsMCwxNDksMzYsMCwwLDE2MiwxNDYsCisJMCwwLDAsMCwyMTksMjU1LDY2LDM2LDAsMjIsMiwwLAorCTMsMzAsMiwwLDg0LDAsOTgsNDQsMjE3LDEsNjQsMTYsCisJMTI4LDE2LDMsMCwyLDEzMSwxLDYwLDMzLDgsMzQsMCwKKwk4MCwxNTAsMzQsMTQwLDAsMCwwLDAsOCwwLDY0LDAsCisJMCwwLDAsMCwyMDksNjEsMTkyLDgsMzcsMCw0LDM2LAorCTIsMTMxLDE2LDYwLDY0LDE1MCwxNiwzOCwxNTYsNzEsMTkyLDEyLAorCTMzLDMyLDAsMiw1OSw2MSwxOTIsOCwwLDAsMCwwLAorCTAsMzgsNCwwLDE5Niw2NCwxOTIsMTIsMywzOCw0LDAsCisJMCwwLDIsMTMwLDAsMCw0LDE0NiwwLDAsMCwwLAorCTI0OSwyNTUsNjQsMjAsMSwwLDE2LDM4LDMsNjMsMTkyLDgsCisJMSwwLDE2MiwzOCwwLDM4LDE4LDAsMjA5LDYxLDE5Miw4LAorCTMsMzgsNCwwLDIsMCwzLDM2LDMzLDEyOCwzMiwyLAorCTMzLDQwLDY0LDIsMzMsMTYwLDAsMCw1MSwwLDE3NywzOSwKKwk1MSwwLDE2MCwxNjMsMjcsMCwxNjMsMCwyLDAsOTYsMjAsCisJMCwwLDAsMCwxMywwLDcsMCwxOCw0MCwwLDAsCisJMTYsMTYsMCwwLDIsMTMxLDEsNjAsMzMsOCwzNCwwLAorCTEyOCwyMDUsMzQsMTQ0LDI1NSwyNTUsNDksMzgsMiwwLDAsMTgsCisJMCwwLDM0LDE2MiwyNTUsMjU1LDE2LDM4LDI0MiwyNTUsMTYwLDIwLAorCTAsMCwwLDAsMTAsMCwxMTksMjIsMCwyMiwyMCwwLAorCTI1NSwyNTUsMTYsMzgsOCwwLDIyLDE4LDMsMzgsMiwwLAorCTI1NSwyNTUsMTgsMzYsMTk2LDY0LDE5MiwxMiwzMiwwLDQsMzYsCisJMjU1LDI1NSwxNiwzOCwyNTIsMjU1LDE4LDIyLDAsMjIsMjAsMCwKKwkzLDM4LDIsMCwzLDAsMTI4LDE2LDAsMCwwLDAsCisJMTk2LDY0LDE5MiwxMiwwLDAsMCwwLDE0LDAsMTI2LDIyLAorCTAsMCwwLDAsMjU1LDI1NSwxNiwzOCwxMSwwLDIyLDE4LAorCTI1NSwyNTUsMTgsMzYsMTk2LDY0LDE5MiwxMiw0OCwwLDQsMzYsCisJMjU1LDI1NSwxNiwzOCw2LDAsMTgsMTgsMCwwLDAsMCwKKwkxMTEsNjEsMTkyLDgsMCwwLDAsMCwwLDM4LDQsMCwKKwkxOTYsNjQsMTkyLDEyLDMsMzgsNCwwLDAsMCwzNCwxMzAsCisJMCwwLDM2LDE0NiwwLDAsMCwwLDI0OSwyNTUsNjQsMjAsCisJMSwwLDQ5LDM4LDI1NSwyNTUsNDksMzgsMywwLDYsMzYsCisJODAsMCwxMDIsMjIsNjYsMCw0LDM2LDI1NSwyNTUsMTYsMzgsCisJNzcsMCwyMiwxOCwyNTUsMjU1LDE3LDM2LDE5Niw2NCwxOTIsMTIsCisJMzIsMCw0LDM2LDI1NSwyNTUsMTYsMzgsMjUyLDI1NSwxNywyMiwKKwk2NiwwLDQsMzYsMjA5LDYxLDE5Miw4LDAsMCwwLDAsCisJOCwwLDMsMzYsMzMsMTI4LDMyLDIsMzMsNDAsNjQsMiwKKwkzMywxNjAsMCwwLDUxLDAsMTc3LDM5LDUxLDAsMTYwLDE2MywKKwkyNywwLDE2MywwLDIsMCw5NiwyMCwwLDAsMCwwLAorCTEzLDAsNywwLDE4LDQwLDAsMCwxNiwxNiwwLDAsCisJMiwxMzEsMSw2MCwzMyw4LDM0LDAsMTI4LDIwNSwzNCwxNDQsCisJMjU1LDI1NSw0OSwzOCwyLDAsMCwxOCwwLDAsMzQsMTYyLAorCTI1NSwyNTUsMTYsMzgsMjQyLDI1NSwxNjAsMjAsMCwwLDAsMCwKKwkxMCwwLDExOSwyMiwwLDIyLDIwLDAsMjU1LDI1NSwxNiwzOCwKKwk4LDAsMjIsMTgsMywzOCwyLDAsMjU1LDI1NSwxOCwzNiwKKwkxOTYsNjQsMTkyLDEyLDMyLDAsNCwzNiwyNTUsMjU1LDE2LDM4LAorCTI1MiwyNTUsMTgsMjIsMCwyMiwyMCwwLDMsMzgsMiwwLAorCTMsMCwxMjgsMTYsMCwwLDAsMCwxOTYsNjQsMTkyLDEyLAorCTAsMCwwLDAsMTQsMCwxMjYsMjIsMCwwLDAsMCwKKwkyNTUsMjU1LDE2LDM4LDExLDAsMjIsMTgsMjU1LDI1NSwxOCwzNiwKKwkxOTYsNjQsMTkyLDEyLDQ4LDAsNCwzNiwyNTUsMjU1LDE2LDM4LAorCTYsMCwxOCwxOCwwLDAsMCwwLDE4Miw2MSwxOTIsOCwKKwkwLDAsMCwwLDAsMzgsNCwwLDE5Niw2NCwxOTIsMTIsCisJMywzOCw0LDAsMCwwLDM0LDEzMCwwLDAsMzYsMTQ2LAorCTAsMCwwLDAsMjQ5LDI1NSw2NCwyMCwxLDAsNDksMzgsCisJMjU1LDI1NSw0OSwzOCwzLDAsNiwzNiw5LDAsMTAyLDIyLAorCTgxLDAsNCwzNiwyNTUsMjU1LDE2LDM4LDYsMCwyMiwxOCwKKwkyNTUsMjU1LDE3LDM2LDE5Niw2NCwxOTIsMTIsMzIsMCw0LDM2LAorCTI1NSwyNTUsMTYsMzgsMjUyLDI1NSwxNywyMiw4MSwwLDQsMzYsCisJMTk2LDY0LDE5MiwxMiwwLDAsMCwwLDMsNjMsMTkyLDgsCisJMSwwLDE2MiwzOCwzMywxMjgsMzIsMiwzMywxNiw2NCwyLAorCTMzLDE2MCwwLDAsNSwwLDY1LDYsMTAsMCw0LDM2LAorCTQ1LDAsMjAsMzYsMiwwLDMyLDE4LDM1LDE2LDE4LDAsCisJMjU1LDI1NSw0OCwzOCw1MSwwLDE3NywzOSw1MSwwLDE2MCwxNjMsCisJMjcsMCw2OCwwLDIsMCwxMjgsMjAsMCwwLDAsMCwKKwkxMywwLDcsMCwxOCwyNCwwLDAsMTYsMTYsMCwwLAorCTIsMTMxLDEsNjAsMzMsOCwzNCwwLDEyOCwyMDUsMzQsMTQ0LAorCTI1NSwyNTUsNDksMzgsMiwwLDAsMTgsMCwwLDM0LDE2MiwKKwkyNTUsMjU1LDE2LDM4LDMzLDE2LDk2LDAsMjQxLDI1NSw2NCwyMCwKKwkwLDAsMCwwLDEwLDAsMTE5LDIyLDMzLDMyLDEyOCwyLAorCTI1NSwyNTUsMTYsMzgsNywwLDIyLDE4LDAsMCwwLDAsCisJMjU1LDI1NSwxOCwzNiwxOTYsNjQsMTkyLDEyLDMyLDAsNCwzNiwKKwkyNTUsMjU1LDE2LDM4LDI1MiwyNTUsMTgsMjIsMzMsMzIsMTI4LDIsCisJMywwLDEyOCwxNiwwLDAsMCwwLDE5Niw2NCwxOTIsMTIsCisJMCwwLDAsMCwxNCwwLDEyNiwyMiwwLDAsMCwwLAorCTI1NSwyNTUsMTYsMzgsMTEsMCwyMiwxOCwyNTUsMjU1LDE4LDM2LAorCTE5Niw2NCwxOTIsMTIsNDgsMCw0LDM2LDI1NSwyNTUsMTYsMzgsCisJNiwwLDE4LDE4LDAsMCwwLDAsNCw2MiwxOTIsOCwKKwkwLDAsMCwwLDAsMzgsNCwwLDE5Niw2NCwxOTIsMTIsCisJMywzOCw0LDAsMCwwLDM0LDEzMCwwLDAsMzYsMTQ2LAorCTAsMCwwLDAsMjQ5LDI1NSw2NCwyMCwxLDAsNDksMzgsCisJMjU1LDI1NSw0OSwzOCwzLDAsNiwzNiwyMzcsMCwxMDIsMjIsCisJMSwwLDE2MiwzOCwyNTUsMjU1LDE2LDM4LDIzNCwwLDIyLDE4LAorCTI1NSwyNTUsMTcsMzYsMTk2LDY0LDE5MiwxMiwzMiwwLDQsMzYsCisJMjU1LDI1NSwxNiwzOCwyNTIsMjU1LDE3LDIyLDEsMCwxNjIsMzgsCisJMyw2MywxOTIsOCwwLDAsMCwwLDEwLDAsMywzNiwKKwkzMywxMjgsMzIsMiwzMyw0MCw2NCwyLDMzLDE2MCwwLDAsCisJNTEsMCwxNzcsMzksNTEsMCwxNjAsMTYzLDI3LDAsMTYzLDAsCisJMiwwLDk2LDIwLDAsMCwwLDAsMTMsMCw3LDAsCisJMTgsNDAsMCwwLDE2LDE2LDAsMCwyLDEzMSwxLDYwLAorCTMzLDgsMzQsMCwxMjgsMjA1LDM0LDE0NCwyNTUsMjU1LDQ5LDM4LAorCTIsMCwwLDE4LDAsMCwzNCwxNjIsMjU1LDI1NSwxNiwzOCwKKwkyNDIsMjU1LDE2MCwyMCwwLDAsMCwwLDEwLDAsMTE5LDIyLAorCTAsMjIsMjAsMCwyNTUsMjU1LDE2LDM4LDgsMCwyMiwxOCwKKwkzLDM4LDIsMCwyNTUsMjU1LDE4LDM2LDE5Niw2NCwxOTIsMTIsCisJMzIsMCw0LDM2LDI1NSwyNTUsMTYsMzgsMjUyLDI1NSwxOCwyMiwKKwkwLDIyLDIwLDAsMywzOCwyLDAsMywwLDEyOCwxNiwKKwkwLDAsMCwwLDE5Niw2NCwxOTIsMTIsMCwwLDAsMCwKKwkxNCwwLDEyNiwyMiwwLDAsMCwwLDI1NSwyNTUsMTYsMzgsCisJMTEsMCwyMiwxOCwyNTUsMjU1LDE4LDM2LDE5Niw2NCwxOTIsMTIsCisJNDgsMCw0LDM2LDI1NSwyNTUsMTYsMzgsNiwwLDE4LDE4LAorCTAsMCwwLDAsNzUsNjIsMTkyLDgsMCwwLDAsMCwKKwkwLDM4LDQsMCwxOTYsNjQsMTkyLDEyLDMsMzgsNCwwLAorCTAsMCwzNCwxMzAsMCwwLDM2LDE0NiwwLDAsMCwwLAorCTI0OSwyNTUsNjQsMjAsMSwwLDQ5LDM4LDI1NSwyNTUsNDksMzgsCisJMywwLDYsMzYsMTY2LDAsMTAyLDIyLDEsMCwxNjIsMzgsCisJMjU1LDI1NSwxNiwzOCwxNjMsMCwyMiwxOCwyNTUsMjU1LDE3LDM2LAorCTE5Niw2NCwxOTIsMTIsMzIsMCw0LDM2LDI1NSwyNTUsMTYsMzgsCisJMjUyLDI1NSwxNywyMiwxLDAsMTYyLDM4LDMsNjMsMTkyLDgsCisJMCwwLDAsMCwxOTIsMTMyLDE0NCwzOSwxNTYsNzEsMTkyLDEyLAorCTMzLDMyLDAsMiwxMTIsNjIsMTkyLDgsMCwwLDAsMCwKKwkwLDM4LDQsMCwxOTYsNjQsMTkyLDEyLDMsMzgsNCwwLAorCTAsMCwyLDEzMCwwLDAsNCwxNDYsMCwwLDAsMCwKKwkyNDksMjU1LDY0LDIwLDEsMCwxNiwzOCwxNiwwLDMsMzYsCisJMzMsMTI4LDMyLDIsMzMsNDAsNjQsMiwzMywxNjAsMCwwLAorCTUxLDAsMTc3LDM5LDUxLDAsMTYwLDE2MywyNywwLDE2MywwLAorCTIsMCw5NiwyMCwwLDAsMCwwLDEzLDAsNywwLAorCTE4LDQwLDAsMCwxNiwxNiwwLDAsMiwxMzEsMSw2MCwKKwkzMyw4LDM0LDAsMTI4LDIwNSwzNCwxNDQsMjU1LDI1NSw0OSwzOCwKKwkyLDAsMCwxOCwwLDAsMzQsMTYyLDI1NSwyNTUsMTYsMzgsCisJMjQyLDI1NSwxNjAsMjAsMCwwLDAsMCwxMCwwLDExOSwyMiwKKwkwLDIyLDIwLDAsMjU1LDI1NSwxNiwzOCw4LDAsMjIsMTgsCisJMywzOCwyLDAsMjU1LDI1NSwxOCwzNiwxOTYsNjQsMTkyLDEyLAorCTMyLDAsNCwzNiwyNTUsMjU1LDE2LDM4LDI1MiwyNTUsMTgsMjIsCisJMCwyMiwyMCwwLDMsMzgsMiwwLDMsMCwxMjgsMTYsCisJMCwwLDAsMCwxOTYsNjQsMTkyLDEyLDAsMCwwLDAsCisJMTQsMCwxMjYsMjIsMCwwLDAsMCwyNTUsMjU1LDE2LDM4LAorCTExLDAsMjIsMTgsMjU1LDI1NSwxOCwzNiwxOTYsNjQsMTkyLDEyLAorCTQ4LDAsNCwzNiwyNTUsMjU1LDE2LDM4LDYsMCwxOCwxOCwKKwkwLDAsMCwwLDE1OSw2MiwxOTIsOCwwLDAsMCwwLAorCTAsMzgsNCwwLDE5Niw2NCwxOTIsMTIsMywzOCw0LDAsCisJMCwwLDM0LDEzMCwwLDAsMzYsMTQ2LDAsMCwwLDAsCisJMjQ5LDI1NSw2NCwyMCwxLDAsNDksMzgsMjU1LDI1NSw0OSwzOCwKKwkzLDAsNiwzNiw4MiwwLDEwMiwyMiwxLDAsMTYyLDM4LAorCTI1NSwyNTUsMTYsMzgsNzksMCwyMiwxOCwyNTUsMjU1LDE3LDM2LAorCTE5Niw2NCwxOTIsMTIsMzIsMCw0LDM2LDI1NSwyNTUsMTYsMzgsCisJMjUyLDI1NSwxNywyMiwxLDAsMTYyLDM4LDMsNjMsMTkyLDgsCisJMCwwLDAsMCwxNTYsNzEsMTkyLDEyLDMzLDMyLDY0LDIsCisJMzMsMjQsNjQsMCw0MiwxNiwxMTMsMCwyLDAsNjQsMTYsCisJMzMsMzIsMCwwLDM1LDMyLDM1LDIsMTAsMCwxMTksMjIsCisJMzMsMTI4LDEyOCwwLDI1NSwyNTUsMTYsMzgsNywwLDIyLDE4LAorCTAsMCwwLDAsMjU1LDI1NSwxNywzNiwxOTYsNjQsMTkyLDEyLAorCTMyLDAsNCwzNiwyNTUsMjU1LDE2LDM4LDI1MiwyNTUsMTcsMjIsCisJMCwwLDAsMCwxNCwwLDEyNiwyMiwwLDAsMCwwLAorCTI1NSwyNTUsMTYsMzgsMTEsMCwyMiwxOCwyNTUsMjU1LDE3LDM2LAorCTE5Niw2NCwxOTIsMTIsNDgsMCw0LDM2LDI1NSwyNTUsMTYsMzgsCisJNiwwLDE3LDE4LDAsMCwwLDAsMjExLDYyLDE5Miw4LAorCTAsMCwwLDAsMCwzOCw0LDAsMTk2LDY0LDE5MiwxMiwKKwkzLDM4LDQsMCwwLDAsNjYsMTMwLDAsMCw2OCwxNDYsCisJMCwwLDAsMCwyNDksMjU1LDY0LDIwLDEsMCw4MiwzOCwKKwkyNTUsMjU1LDgyLDM4LDMsMCw2LDM2LDMwLDAsMTAyLDIyLAorCTEsMCwxNjIsMzgsMjU1LDI1NSwxNiwzOCwyNywwLDIyLDE4LAorCTI1NSwyNTUsMTcsMzYsMTk2LDY0LDE5MiwxMiwzMiwwLDQsMzYsCisJMjU1LDI1NSwxNiwzOCwyNTIsMjU1LDE3LDIyLDEsMCwxNjIsMzgsCisJMyw2MywxOTIsOCwwLDAsMCwwLDI1Myw2MiwxOTIsOCwKKwkzLDAsMTksMzYsMywwLDk2LDIyLDEyOCwxNiwxNywwLAorCTIsMCwxOSwzNiwxMjgsMTYsMTcsMCwzMywxNiw4MSwwLAorCTY0LDE2LDIsMCwwLDAsMTYzLDEzMCwyMDgsMjU1LDY2LDM2LAorCTIsMCw5NiwyMiwzMywxMzYsNjcsMCwxLDAsMTksMzYsCisJMSwwLDE4MSwzOCwwLDAsMTYyLDEzMCwwLDAsMCwwLAorCTMzLDI1NCw2NCwyMCwwLDAsMCwwLDEsMCwxMzAsMzYsCisJMjIwLDAsMTkxLDE0MywyMTYsMCwxOTAsMTQzLDIxMiwwLDE4MywxNDMsCisJMjA4LDAsMTgyLDE0MywyMDQsMCwxODEsMTQzLDIwMCwwLDE4MCwxNDMsCisJMTk2LDAsMTc5LDE0MywxOTIsMCwxNzgsMTQzLDE4OCwwLDE3NywxNDMsCisJMTg0LDAsMTc2LDE0Myw4LDAsMjI0LDMsMjI0LDAsMTg5LDM5LAorCTAsMCwxNjQsMTc1LDQsMCwxNjUsMTc1LDgsMCwxNjYsMTc1LAorCTEyLDAsMTY3LDE3NSwyMDAsMjU1LDE4OSwzOSw1OSwwLDE2MiwzOSwKKwkyNTIsMjU1LDMsMzYsMzYsMTYsNjcsMCw1MiwwLDE5MSwxNzUsCisJNDgsMCwxODAsMTc1LDQ0LDAsMTc5LDE3NSw0MCwwLDE3OCwxNzUsCisJMzYsMCwxNzcsMTc1LDMyLDAsMTc2LDE3NSw1NiwwLDE2NCwxNzUsCisJMCwwLDgwLDE0MCw0LDAsODEsMzYsMCwwLDIsMTMwLAorCTAsMCwzLDE0NiwwLDAsMCwwLDMxLDAsNjQsMTYsCisJMzcsMCwyMCwzNiw2OSwwLDE5LDM2LDI1MiwyNTUsMTgsMzYsCisJMCwyMiwzLDAsMywzOCwyLDAsMTgsMCwxNDgsMjAsCisJMCwwLDAsMCwxLDAsMywxMzAsMCwwLDAsMCwKKwk0LDAsMTAwLDE2LDMzLDMyLDAsMiw0LDAsMTE1LDIwLAorCTMsMCwzNCwzOCwzMywzMiwwLDIsNTYsNjMsMTkyLDgsCisJMzMsNDAsMCwwLDM2LDE2LDgyLDAsNCwwLDgxLDM2LAorCTAsMCw2OSwxNDAsMzMsMzIsMCwyLDEzLDYxLDE5MiwxMiwKKwkwLDAsMCwwLDYyLDYzLDE5Miw4LDMzLDEyOCw2NCwwLAorCTE5Niw2NCwxOTIsMTIsMSwwLDE2LDM4LDAsMCwyLDEzMCwKKwkwLDAsMywxNDYsMCwwLDAsMCwyMzAsMjU1LDY0LDIwLAorCTAsMjIsMywwLDUyLDAsMTkxLDE0Myw0OCwwLDE4MCwxNDMsCisJNDQsMCwxNzksMTQzLDQwLDAsMTc4LDE0MywzNiwwLDE3NywxNDMsCisJMzIsMCwxNzYsMTQzLDgsMCwyMjQsMyw1NiwwLDE4OSwzOSwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDgsMCwyMjQsMywwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCw4LDAsMjI0LDMsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJOCwwLDIyNCwzLDAsMCwwLDAsMzMsNzIsMjI0LDMsCisJMTcwLDMsOCwzNiw3Niw2MywxOTIsMTIsMCwwLDAsMCwKKwkyNTUsMjU1LDgsMzMsMjUyLDI1NSwwLDIxLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDgsMCwzMiwxLAorCTAsMCwwLDAsMzMsODgsMjI0LDMsMjMyLDMsMTAsMzYsCisJMTQzLDYzLDE5MiwxMiwwLDAsMCwwLDI1NSwyNTUsNzQsMzMsCisJMjUyLDI1NSw2NCwyMSwwLDAsMCwwLDgsMCw5NiwxLAorCTAsMCwwLDAsMjUwLDI1NSwxMzIsMzIsMTMwLDMyLDQsMCwKKwkyNTUsMjU1LDEzMiwzMiwwLDAsMCwwLDI1MywyNTUsMTI4LDIwLAorCTAsMCwwLDAsOCwwLDIyNCwzLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMjQ4LDI1NSwxODksMzksMjU1LDI1NSwxOTUsMzYsMTAsMCwxOTIsMTYsCisJMzMsNTYsMTYwLDAsMjU1LDI1NSw2LDM2LDAsMCwxNjIsMTQ0LAorCTEsMCwxNjUsMzYsMCwwLDEzMCwxNjAsNCwwLDY0LDE2LAorCTEsMCwxMzIsMzYsMjU1LDI1NSw5OSwzNiwyNDksMjU1LDEwMiwyMCwKKwkwLDAsMCwwLDMzLDE2LDIyNCwwLDgsMCwyMjQsMywKKwk4LDAsMTg5LDM5LDAsOTYsMiw2NCwwLDAsMCwwLAorCTM4LDY0LDY4LDAsMSwyNTUsOCw0OSwzOCw2NCwyLDEsCisJMCw5NiwxMzYsNjQsOCwwLDIyNCwzLDEsMjU1LDY2LDQ4LAorCTAsOTYsMiw2NCwwLDAsMCwwLDEsMjU1LDEzMiw0OCwKKwkzOSwzMiwxMjgsMCwzNiw2NCw2OCwwLDAsOTYsMTM2LDY0LAorCTgsMCwyMjQsMywxLDI1NSw2Niw0OCwwLDk2LDIsNjQsCisJMCwwLDAsMCwwLDI1NSwxMzIsNDgsMzcsNjQsNjgsMCwKKwkxLDAsOCw1MywwLDk2LDEzNiw2NCw4LDAsMjI0LDMsCisJMSwyNTUsNjYsNDgsMTc2LDI1NSwxODksMzksNjQsMCwxODIsMTc1LAorCTMzLDE3NiwxMjgsMCw1MiwwLDE3OSwxNzUsMzMsMTUyLDE2MCwwLAorCTcyLDAsMTkwLDE3NSwzMywyNDAsMTkyLDAsNjgsMCwxODMsMTc1LAorCTMzLDE4NCwyMjQsMCw2MCwwLDE4MSwxNzUsMzMsMTY4LDAsMCwKKwk1NiwwLDE4MCwxNzUsMzMsMTYwLDAsMCw3NiwwLDE5MSwxNzUsCisJNDgsMCwxNzgsMTc1LDQ0LDAsMTc3LDE3NSw0MCwwLDE3NiwxNzUsCisJMiwxMzEsNiw2MCwzMyw0OCwyMTIsMCwxNjAsMjA1LDE5OCwxNDQsCisJMCwwLDAsMCwyOCwwLDk2LDI2LDMzLDEyOCwwLDAsCisJMzMsMjQsMTkyLDIsMzMsMzIsMTE4LDIsMCwwLDEwMiwxNjAsCisJMSwwLDk5LDM2LDQyLDE2LDEwMCwwLDI1MiwyNTUsNjQsMjAsCisJMCwwLDAsMCwxOSwwLDk2LDI2LDMzLDEyOCwwLDAsCisJMjU1LDAsMjEwLDQ4LDMzLDEzNiwxOTIsMiwwLDAsMzksMTQ2LAorCTAsMCwwLDAsOSwwLDI0MiwxNiwwLDAsMCwwLAorCTUsMCwyMjQsMTgsMzMsNDAsMCwyLDk2LDAsMTY0LDE0MywKKwkwLDAsMCwwLDksMjQ4LDIyNCwyLDMzLDQ4LDY0LDIsCisJMzIsMCwxOTIsMjMsMSwwLDE4MSwzOCwxLDAsMTYsMzgsCisJNDIsMTYsMTksMiwyNDEsMjU1LDY0LDIwLDEsMCw0OSwzOCwKKwkxLDAsMTQ4LDM4LDQsMCwxMzAsNDYsMjIwLDI1NSw2NCwyMCwKKwkwLDAsMCwwLDcsMCw5NiwyNiwzMywxMjgsMCwwLAorCTMzLDI0LDE5MiwyLDAsMCwxMTIsMTYwLDEsMCwxNiwzOCwKKwk0MiwxNiwxOSwyLDI1MiwyNTUsNjQsMjAsMSwwLDk5LDM2LAorCTIwLDAsOTYsMjYsMzMsMTI4LDAsMCwzMywxMzYsMTkyLDIsCisJMCwwLDM5LDE0NiwyNTUsMCw2LDUwLDExLDAsMjMwLDE2LAorCTAsMCwwLDAsNSwwLDIyNCwxOCwwLDAsMCwwLAorCTk2LDAsMTY0LDE0MywwLDAsMCwwLDksMjQ4LDIyNCwyLAorCTMzLDQwLDAsMiwzLDAsMTkyLDE5LDEsMCwxODEsMzgsCisJNzIsNjQsMTkyLDgsMSwwLDIsMzYsMSwwLDE2LDM4LAorCTQyLDE2LDE5LDIsMjM5LDI1NSw2NCwyMCwxLDAsNDksMzgsCisJMzMsMTYsMTYwLDIsNzYsMCwxOTEsMTQzLDcyLDAsMTkwLDE0MywKKwk2OCwwLDE4MywxNDMsNjQsMCwxODIsMTQzLDYwLDAsMTgxLDE0MywKKwk1NiwwLDE4MCwxNDMsNTIsMCwxNzksMTQzLDQ4LDAsMTc4LDE0MywKKwk0NCwwLDE3NywxNDMsNDAsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk4MCwwLDE4OSwzOSwxNjAsMjU1LDE4OSwzOSw4OCwwLDE5MCwxNzUsCisJMzMsMjQwLDEyOCwwLDY4LDAsMTc5LDE3NSwzMywxNTIsMTYwLDAsCisJNzYsMCwxODEsMTc1LDMzLDE2OCwyMjQsMCw3MiwwLDE4MCwxNzUsCisJMzMsMTYwLDAsMCwzMywxNiw5NiwyLDkyLDAsMTkxLDE3NSwKKwk4NCwwLDE4MywxNzUsODAsMCwxODIsMTc1LDY0LDAsMTc4LDE3NSwKKwk2MCwwLDE3NywxNzUsNTYsMCwxNzYsMTc1LDIsMCw5Nyw2LAorCTE2LDAsMTY2LDE3NSwzLDAsOTgsMzgsMTMxLDE1MiwyLDAsCisJMzMsMTg0LDAsMCwyLDEzMSwyMiw2MCwxNjQsMjA1LDIxNCwzOCwKKwkwLDAsMjEwLDE0MiwwLDAsMCwwLDcsMCw5NiwxOCwKKwkzMywxMjgsMCwwLDMzLDI0LDE5MiwzLDAsMCwxMTQsMTcyLAorCTEsMCwxNiwzOCw0MywxNiwxOSwyLDI1MiwyNTUsNjQsMjAsCisJNCwwLDk5LDM2LDIwLDAsOTYsMTgsMzMsMTI4LDAsMCwKKwkzMywxMzYsMTkyLDMsMCwwLDM5LDE0MiwwLDAsMCwwLAorCTExLDAsMjQyLDE2LDEyOCw0MCwxNiwwLDUsMCwxNjAsMTgsCisJMCwwLDAsMCwxMTIsMCwxNjQsMTQzLDAsMCwwLDAsCisJOSwyNDgsMTYwLDIsMzMsNDgsNjQsMiwxNiwwLDE2OCwxNDMsCisJMCwwLDAsMCwzNCwwLDAsMjEsMSwwLDE0OCwzOCwKKwkxLDAsMTYsMzgsNDMsMTYsMTksMiwyMzksMjU1LDY0LDIwLAorCTQsMCw0OSwzOCwxLDAsMjQ3LDM4LDQsMCwyMjYsNDYsCisJMjIyLDI1NSw2NCwyMCw0LDAsMjE0LDM4LDcsMCw5NiwxOCwKKwkzMywxMjgsMCwwLDMzLDI0LDE5MiwzLDAsMCwxMTIsMTcyLAorCTEsMCwxNiwzOCw0MywxNiwxOSwyLDI1MiwyNTUsNjQsMjAsCisJNCwwLDk5LDM2LDIyLDAsOTYsMTgsMzMsMTI4LDAsMCwKKwkzMywxMzYsMTkyLDMsMCwwLDM5LDE0MiwwLDAsMCwwLAorCTEzLDAsMjQwLDE2LDEyOCw0MCwxNiwwLDUsMCwxNjAsMTgsCisJMCwwLDAsMCwxMTIsMCwxNjQsMTQzLDAsMCwwLDAsCisJOSwyNDgsMTYwLDIsMzMsNDgsMCwyLDE2LDAsMTY4LDE0MywKKwkwLDAsMCwwLDMsMCwwLDE3LDEsMCwxNDgsMzgsCisJMTc0LDY0LDE5Miw4LDEsMCwyLDM2LDEsMCwxNiwzOCwKKwk0MywxNiwxOSwyLDIzNywyNTUsNjQsMjAsNCwwLDQ5LDM4LAorCTMzLDE2LDEyOCwyLDkyLDAsMTkxLDE0Myw4OCwwLDE5MCwxNDMsCisJODQsMCwxODMsMTQzLDgwLDAsMTgyLDE0Myw3NiwwLDE4MSwxNDMsCisJNzIsMCwxODAsMTQzLDY4LDAsMTc5LDE0Myw2NCwwLDE3OCwxNDMsCisJNjAsMCwxNzcsMTQzLDU2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJOTYsMCwxODksMzksMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwxLDIsMzYsMCwxNjMsMSw2MCwxNzYsMSwzMiwxNzIsCisJMCwxNjMsMSw2MCwxODAsMSwzMiwxNzIsMCwxNjMsMSw2MCwKKwk4LDAsMjI0LDMsMTg0LDEsMzQsMTcyLDIzMiwyNTUsMTg5LDM5LAorCTE2LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsMjAsMCwxOTEsMTc1LAorCTIyMCw2MywxOTIsMTIsMzMsMzIsMCwwLDMzLDQwLDY0LDAsCisJMCwxNjMsMyw2MCwxODAsMSw5OSwxNDAsMCwxNjMsMiw2MCwKKwkxODQsMSw2NiwxNDAsMCwxNjMsNCw2MCwxMjgsMSwxMzIsMTQwLAorCTEsMCw5OSwzNiwxMSwwLDEyOCwyMCwzNiwyNCw5OCwwLAorCTAsMTYzLDIsNjAsMTc2LDEsNjYsMTQwLDAsMCwwLDAsCisJNiwwLDk4LDIwLDAsMCwwLDAsMCwxNjMsMiw2MCwKKwkxMjgsMSw2NiwxNDAsMCwwLDAsMCwyNDcsMjU1LDY0LDE2LAorCTAsMCwwLDAsMCwxNjMsMiw2MCwxODAsMSw2NiwxNDAsCisJMzMsMzIsMTYwLDAsMCwxNjMsMSw2MCwzMyw4LDM0LDAsCisJMTg4LDEsNDgsMTYwLDAsMTYzLDEsNjAsMjIwLDYzLDE5MiwxMiwKKwkxODAsMSwzNSwxNzIsMjAsMCwxOTEsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMjQsMCwxODksMzksOCwwLDIyNCwzLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMTkyLDI1NSwxODksMzksMzMsODAsMCwwLAorCTgwLDAsMTg1LDE0Myw4NCwwLDE4NCwxNDMsODgsMCwxNzUsMTQzLAorCTEsMCwyLDM2LDYwLDAsMTc3LDE3NSw5MiwwLDE3NywxNDMsCisJNCwxMTIsMjI2LDAsMTIsMCwyMjQsMjQsNTYsMCwxNzYsMTc1LAorCTEsMCw5LDM2LDMzLDY0LDE2MCwzLDMzLDI0LDMyLDMsCisJMCwwLDk4LDE0MCw0LDAsOTksMzYsMSwwLDc0LDM3LAorCTQsMTYsNzMsMCwwLDAsMiwxNzMsNDIsMTYsNzEsMSwKKwkyNDksMjU1LDY0LDIwLDQsMCw4LDM3LDQ2LDAsMTkyLDI1LAorCTMzLDgwLDAsMCwyNTUsMCwxNiwzNiwzMyw3MiwwLDAsCisJMCwwLDE0NSwxNzIsMCwwLDE2MCwxNjQsMzQsMCwyMjQsMjQsCisJMCwwLDIwOCwxNjAsMzMsODgsMTI4LDAsMzMsOTYsMTYwLDAsCisJMzMsMTA0LDE5MiwwLDMzLDY0LDMyLDMsMzMsMjQsMTYwLDMsCisJMCwwLDk4LDE0MCwwLDAsMCwwLDM2LDE2LDY2LDEsCisJMTksMCw2NCwxNiwwLDAsMCwwLDAsMCwyLDE0MSwKKwkwLDAsMCwwLDEyOCwxNiwyLDAsMzMsMTYsODgsMCwKKwkwLDAsNjYsMTQwLDAsMCwwLDAsMCwwLDk4LDE3MywKKwkwLDAsMiwxNDEsMCwwLDAsMCw2NCwxNiwyLDAsCisJMzMsMTYsNzksMCwwLDAsNjYsMTQ4LDAsMCwwLDAsCisJMCwwLDEzMCwxNjUsMCwwLDIsMTQxLDAsMCwwLDAsCisJNDcsNjUsMTkyLDgsMCwwLDE2MiwxNjEsNCwwLDgsMzcsCisJMSwwLDQxLDM3LDQyLDE2LDM5LDEsMjI5LDI1NSw2NCwyMCwKKwk0LDAsOTksMzYsMSwwLDE5OCwzNiwyLDAsMTY1LDM2LAorCTEsMCw3NCwzNyw0MiwxNiw3OCwxLDIxMywyNTUsNjQsMjAsCisJNCwwLDEzMiwzNiw2MCwwLDE3NywxNDMsNTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw2NCwwLDE4OSwzOSwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwyMTYsMjU1LDE4OSwzOSwKKwk2MywwLDEzMiw0OCwyOCwwLDE3OSwxNzUsMTI4LDEsMTQ3LDUyLAorCTUwLDEzMywxMzAsMTUxLDQ4LDEzMywxMzIsMTUxLDAsMTI4LDEzMSwxNTEsCisJMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSw1LDE2MiwxNiw2MCwKKwkzMiwwLDE5MSwxNzUsMjQsMCwxNzgsMTc1LDM5LDE2LDY4LDAsCisJMzYsMjQsOTgsMCwwLDEyOCwxMzEsMTY3LDAsMCwzLDE2NiwKKwk3Niw2MywxOTIsMTIsMCwxLDE3LDM2LDAsMTI4LDEzMCwxNTEsCisJNDgsMTMzLDEzMSwxNTEsNSwxNjIsMTgsNjAsMzcsMTYsNjcsMCwKKwkwLDEyOCwxMzAsMTY3LDAsMCwyLDE2NiwzNiwxNiw1MSwyLAorCTYsMCw2NCwxNiwwLDAsMCwwLDAsMTI4LDEzMSwxNTEsCisJMjAsMTMzLDEzMCwxNTEsMCwwLDAsMCw5Niw2NSwxOTIsOCwKKwkzNywyNCw5OCwwLDIwLDEzMywxMzAsMTUxLDAsMTI4LDEzMSwxNTEsCisJMzksMTYsMiwwLDM2LDI0LDk4LDAsMCwxMjgsMTMxLDE2NywKKwkwLDAsNjcsMTY2LDc2LDYzLDE5MiwxMiw2NiwxMzYsMTcsMCwKKwkwLDEyOCwxMzAsMTUxLDUwLDEzMywxMzEsMTUxLDAsMCwwLDAsCisJMzcsMTYsNjcsMCwwLDEyOCwxMzAsMTY3LDc2LDYzLDE5MiwxMiwKKwkwLDAsNjYsMTY2LDUwLDEzMywxMzAsMTUxLDAsMTI4LDEzMSwxNTEsCisJMzksMTYsMiwwLDM2LDI0LDk4LDAsMjU1LDI1NSwzNCw1MCwKKwkwLDEyOCwxMzEsMTY3LDAsMCw2NywxNjYsMjI2LDI1NSw2NCwyMCwKKwkzNiwxNiw1MSwyLDMzLDEzNiwwLDAsMTYsMCwxNiwzNiwKKwk1LDE2MiwxOCw2MCwyNTUsMjU1LDE5LDM2LDc2LDYzLDE5MiwxMiwKKwkwLDAsMCwwLDAsMTI4LDEzMSwxNTEsNTAsMTMzLDEzMCwxNTEsCisJMCwwLDAsMCwzNywyNCw5OCwwLDAsMTI4LDEzMSwxNjcsCisJNzYsNjMsMTkyLDEyLDAsMCw2NywxNjYsOCwwLDAsMTgsCisJMCwwLDAsMCwwLDAsNjcsMTUwLDIwLDEzMywxMzAsMTUxLAorCTAsMCwwLDAsMzYsMTYsNjcsMCwyLDAsNjQsMTYsCisJNjQsMTM2LDE3LDAsMSwwLDQ5LDU0LDc2LDYzLDE5MiwxMiwKKwkyNTUsMjU1LDE2LDM4LDUwLDEzMywxMzAsMTUxLDAsMTI4LDEzMSwxNTEsCisJMzksMTYsMiwwLDM2LDI0LDk4LDAsMCwxMjgsMTMxLDE2NywKKwkyMzAsMjU1LDE5LDIyLDAsMCw2NywxNjYsNDgsMTMzLDEzMCwxNTEsCisJMCwxMjgsMTMxLDE1MSwzOSwxNiwyLDAsMzYsMjQsOTgsMCwKKwk1LDE2MiwyLDYwLDAsMTI4LDEzMSwxNjcsMCwwLDY3LDE2NCwKKwkyNTUsMjU1LDM0LDUwLDMyLDAsMTkxLDE0MywyOCwwLDE3OSwxNDMsCisJMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDQwLDAsMTg5LDM5LDIwOCwyNTUsMTg5LDM5LAorCTM2LDAsMTgxLDE3NSwzMywxNjgsMTYwLDAsMzIsMCwxODAsMTc1LAorCTYzLDAsMTQ4LDQ4LDMzLDMyLDEyOCwyLDQ0LDAsMTkxLDE3NSwKKwk0MCwwLDE4MiwxNzUsMjgsMCwxNzksMTc1LDI0LDAsMTc4LDE3NSwKKwkyMCwwLDE3NywxNzUsNjAsNjUsMTkyLDEyLDE2LDAsMTc2LDE3NSwKKwkzMywxNTIsNjQsMCwyNTUsMjU1LDE2Myw1MCwyNTUsMjU1LDk4LDUwLAorCTMsMCw5OCwyMCw0OCwxLDIyLDM2LDI0NSw2NiwxOTIsOCwKKwkxLDAsMiwzNiw1LDE2MiwxNiw2MCw1MCwxMzMsMTMwLDE1MSwKKwk0OCwxMzMsMTMyLDE1MSwwLDEyOCwxMzEsMTUxLDM5LDE2LDY4LDAsCisJMzYsMjQsOTgsMCwwLDEyOCwxMzEsMTY3LDAsMCwzLDE2NiwKKwk3Niw2MywxOTIsMTIsMCwxLDE3LDM2LDAsMTI4LDEzMCwxNTEsCisJNDgsMTMzLDEzMSwxNTEsNSwxNjIsMTgsNjAsMzcsMTYsNjcsMCwKKwkwLDEyOCwxMzAsMTY3LDAsMCwyLDE2NiwzNiwxNiw1NCwyLAorCTYsMCw2NCwxNiwwLDAsMCwwLDAsMTI4LDEzMSwxNTEsCisJMjAsMTMzLDEzMCwxNTEsMCwwLDAsMCwyMTAsNjUsMTkyLDgsCisJMzcsMjQsOTgsMCwyMCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTUxLAorCTM5LDE2LDIsMCwzNiwyNCw5OCwwLDAsMTI4LDEzMSwxNjcsCisJMCwwLDY3LDE2Niw3Niw2MywxOTIsMTIsNjYsMTM2LDE3LDAsCisJMCwxMjgsMTMwLDE1MSw1MCwxMzMsMTMxLDE1MSwwLDAsMCwwLAorCTM3LDE2LDY3LDAsMCwxMjgsMTMwLDE2Nyw3Niw2MywxOTIsMTIsCisJMCwwLDY2LDE2Niw1MCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTUxLAorCTM5LDE2LDIsMCwzNiwyNCw5OCwwLDI1NSwyNTUsMzQsNTAsCisJMCwxMjgsMTMxLDE2NywwLDAsNjcsMTY2LDIyNiwyNTUsNjQsMjAsCisJMzYsMTYsNTQsMiwyNTUsMjU1LDE2Myw1MCwyNTUsMjU1LDk4LDUwLAorCTM5LDE2LDIsMCwzNiwyNCw5OCwwLDg0LDAsOTYsMTYsCisJMTkyLDEsMTQ3LDU0LDUsMTYyLDE2LDYwLDUwLDEzMywxMzAsMTUxLAorCTQ4LDEzMywxMzIsMTUxLDAsMTI4LDEzMSwxNTEsMzksMTYsNjgsMCwKKwkzNiwyNCw5OCwwLDAsMTI4LDEzMSwxNjcsMCwwLDMsMTY2LAorCTc2LDYzLDE5MiwxMiwwLDEsMTcsMzYsMCwxMjgsMTMwLDE1MSwKKwk0OCwxMzMsMTMxLDE1MSw1LDE2MiwxOCw2MCwzNywxNiw2NywwLAorCTAsMTI4LDEzMCwxNjcsMCwwLDIsMTY2LDM2LDE2LDUxLDIsCisJNiwwLDY0LDE2LDAsMCwwLDAsMCwxMjgsMTMxLDE1MSwKKwkyMCwxMzMsMTMwLDE1MSwwLDAsMCwwLDgsNjYsMTkyLDgsCisJMzcsMjQsOTgsMCwyMCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTUxLAorCTM5LDE2LDIsMCwzNiwyNCw5OCwwLDAsMTI4LDEzMSwxNjcsCisJMCwwLDY3LDE2Niw3Niw2MywxOTIsMTIsNjYsMTM2LDE3LDAsCisJMCwxMjgsMTMwLDE1MSw1MCwxMzMsMTMxLDE1MSwwLDAsMCwwLAorCTM3LDE2LDY3LDAsMCwxMjgsMTMwLDE2Nyw3Niw2MywxOTIsMTIsCisJMCwwLDY2LDE2Niw1MCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTUxLAorCTM5LDE2LDIsMCwzNiwyNCw5OCwwLDI1NSwyNTUsMzQsNTAsCisJMCwxMjgsMTMxLDE2NywwLDAsNjcsMTY2LDIyNiwyNTUsNjQsMjAsCisJMzYsMTYsNTEsMiw1LDE2MiwxNiw2MCw1MCwxMzMsMTMwLDE1MSwKKwk0OCwxMzMsMTMyLDE1MSwwLDEyOCwxMzEsMTUxLDM5LDE2LDY4LDAsCisJMzYsMjQsOTgsMCwwLDEyOCwxMzEsMTY3LDc2LDYzLDE5MiwxMiwKKwkwLDAsMywxNjYsMCwxMjgsMTMxLDE1MSw0OCwxMzMsMTMwLDE1MSwKKwkwLDAsMCwwLDM3LDI0LDk4LDAsMCwwLDMsMTY2LAorCTAsMCw0LDE1MCwyMCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTY3LAorCTM2LDE2LDY4LDAsOSwwLDY0LDIwLDAsMCwwLDAsCisJNzYsNjMsMTkyLDEyLDAsMCwwLDAsMCwwLDMsMTUwLAorCTIwLDEzMywxMzAsMTUxLDAsMCwwLDAsMzYsMTYsNjcsMCwKKwkyNDksMjU1LDY0LDE2LDAsMCwwLDAsNDgsMTMzLDEzMCwxNTEsCisJMCwxMjgsMTMxLDE1MSwzOSwxNiwyLDAsMzYsMjQsOTgsMCwKKwk1LDE2MiwyLDYwLDAsMTI4LDEzMSwxNjcsMCwwLDY3LDE2NCwKKwkyNTUsMjU1LDE2Myw1MCwyNTUsMjU1LDIsNTIsMTI1LDAsOTgsMTYsCisJNjQsMSwxNDcsNTQsNSwxNjIsMTYsNjAsNTAsMTMzLDEzMCwxNTEsCisJNDgsMTMzLDEzMiwxNTEsMCwxMjgsMTMxLDE1MSwzOSwxNiw2OCwwLAorCTM2LDI0LDk4LDAsMCwxMjgsMTMxLDE2NywwLDAsMywxNjYsCisJNzYsNjMsMTkyLDEyLDAsMSwxNywzNiwwLDEyOCwxMzAsMTUxLAorCTQ4LDEzMywxMzEsMTUxLDUsMTYyLDE4LDYwLDM3LDE2LDY3LDAsCisJMCwxMjgsMTMwLDE2NywwLDAsMiwxNjYsMzYsMTYsNTEsMiwKKwk2LDAsNjQsMTYsMCwwLDAsMCwwLDEyOCwxMzEsMTUxLAorCTIwLDEzMywxMzAsMTUxLDAsMCwwLDAsOTUsNjYsMTkyLDgsCisJMzcsMjQsOTgsMCwyMCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTUxLAorCTM5LDE2LDIsMCwzNiwyNCw5OCwwLDAsMTI4LDEzMSwxNjcsCisJMCwwLDY3LDE2Niw3Niw2MywxOTIsMTIsNjYsMTM2LDE3LDAsCisJMCwxMjgsMTMwLDE1MSw1MCwxMzMsMTMxLDE1MSwwLDAsMCwwLAorCTM3LDE2LDY3LDAsMCwxMjgsMTMwLDE2Nyw3Niw2MywxOTIsMTIsCisJMCwwLDY2LDE2Niw1MCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTUxLAorCTM5LDE2LDIsMCwzNiwyNCw5OCwwLDI1NSwyNTUsMzQsNTAsCisJMCwxMjgsMTMxLDE2NywwLDAsNjcsMTY2LDIyNiwyNTUsNjQsMjAsCisJMzYsMTYsNTEsMiwzMywxNDQsMTYwLDIsMCwxMjgsMTYsNTIsCisJMCwxMjgsMTMwLDE1MSw0OCwxMzMsMTMxLDE1MSw1LDE2MiwxNyw2MCwKKwkzNywxNiw2NywwLDUsMTYyLDMsNjAsMCwxMjgsMTMwLDE2NywKKwkwLDAsOTgsMTY0LDM2LDE2LDE4LDIsNiwwLDY0LDE2LAorCTAsMCwwLDAsMCwxMjgsMTMxLDE1MSwyMCwxMzMsMTMwLDE1MSwKKwkwLDAsMCwwLDEzNiw2NiwxOTIsOCwzNywyNCw5OCwwLAorCTIwLDEzMywxMzAsMTUxLDAsMTI4LDEzMSwxNTEsMzksMTYsMiwwLAorCTM2LDI0LDk4LDAsMCwxMjgsMTMxLDE2NywwLDAsMzUsMTY2LAorCTc2LDYzLDE5MiwxMiw2NiwxMjgsMTYsMCwwLDEyOCwxMzAsMTUxLAorCTUwLDEzMywxMzEsMTUxLDAsMCwwLDAsMzcsMTYsNjcsMCwKKwkwLDEyOCwxMzAsMTY3LDc2LDYzLDE5MiwxMiwwLDAsMzQsMTY2LAorCTUwLDEzMywxMzAsMTUxLDAsMTI4LDEzMSwxNTEsMzksMTYsMiwwLAorCTM2LDI0LDk4LDAsMjU1LDI1NSwyLDUwLDAsMTI4LDEzMSwxNjcsCisJMCwwLDM1LDE2NiwyMjYsMjU1LDY0LDIwLDM2LDE2LDE4LDIsCisJNSwxNjIsMTYsNjAsNTAsMTMzLDEzMCwxNTEsNDgsMTMzLDEzMiwxNTEsCisJMCwxMjgsMTMxLDE1MSwzOSwxNiw2OCwwLDM2LDI0LDk4LDAsCisJMCwxMjgsMTMxLDE2Nyw3Niw2MywxOTIsMTIsMCwwLDMsMTY2LAorCTAsMTI4LDEzMSwxNTEsNDgsMTMzLDEzMCwxNTEsMCwwLDAsMCwKKwkzNywyNCw5OCwwLDAsMCwzLDE2NiwwLDAsNCwxNTAsCisJMjAsMTMzLDEzMCwxNTEsMCwxMjgsMTMxLDE2NywzNiwxNiw2OCwwLAorCTksMCw2NCwyMCwwLDAsMCwwLDc2LDYzLDE5MiwxMiwKKwkwLDAsMCwwLDAsMCwzLDE1MCwyMCwxMzMsMTMwLDE1MSwKKwkwLDAsMCwwLDM2LDE2LDY3LDAsMjQ5LDI1NSw2NCwxNiwKKwkwLDAsMCwwLDQ4LDEzMywxMzAsMTUxLDAsMTI4LDEzMSwxNTEsCisJMzksMTYsMiwwLDM2LDI0LDk4LDAsNSwxNjIsMiw2MCwKKwkwLDEyOCwxMzEsMTY3LDAsMCw2NywxNjQsMCwxLDE5LDM2LAorCTUsMTYyLDE2LDYwLDUwLDEzMywxMzAsMTUxLDQ4LDEzMywxMzIsMTUxLAorCTAsMTI4LDEzMSwxNTEsMzksMTYsNjgsMCwzNiwyNCw5OCwwLAorCTAsMTI4LDEzMSwxNjcsMCwwLDMsMTY2LDc2LDYzLDE5MiwxMiwKKwkwLDEsMTcsMzYsMCwxMjgsMTMwLDE1MSw0OCwxMzMsMTMxLDE1MSwKKwk1LDE2MiwxOCw2MCwzNywxNiw2NywwLDAsMTI4LDEzMCwxNjcsCisJMCwwLDIsMTY2LDM2LDE2LDExMywyLDYsMCw2NCwxNiwKKwkwLDAsMCwwLDAsMTI4LDEzMSwxNTEsMjAsMTMzLDEzMCwxNTEsCisJMCwwLDAsMCwyMjAsNjYsMTkyLDgsMzcsMjQsOTgsMCwKKwkyMCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTUxLDM5LDE2LDIsMCwKKwkzNiwyNCw5OCwwLDAsMTI4LDEzMSwxNjcsMCwwLDY3LDE2NiwKKwk3Niw2MywxOTIsMTIsNjYsMTM2LDE3LDAsMCwxMjgsMTMwLDE1MSwKKwk1MCwxMzMsMTMxLDE1MSwwLDAsMCwwLDM3LDE2LDY3LDAsCisJMCwxMjgsMTMwLDE2Nyw3Niw2MywxOTIsMTIsMCwwLDY2LDE2NiwKKwk1MCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTUxLDM5LDE2LDIsMCwKKwkzNiwyNCw5OCwwLDI1NSwyNTUsMzQsNTAsMCwxMjgsMTMxLDE2NywKKwkwLDAsNjcsMTY2LDIyNiwyNTUsNjQsMjAsMzYsMTYsMTEzLDIsCisJNjAsNjUsMTkyLDEyLDMzLDMyLDEyOCwyLDM4LDE2LDE2MiwyLAorCTI1NSwyNTUsNjYsNDgsMSwwLDY2LDQ0LDQ0LDAsMTkxLDE0MywKKwk0MCwwLDE4MiwxNDMsMzYsMCwxODEsMTQzLDMyLDAsMTgwLDE0MywKKwkyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDQ4LDAsMTg5LDM5LAorCTIyNCwyNTUsMTg5LDM5LDI0LDAsMTc4LDE3NSwzMywxNDQsMCwwLAorCTY0LDE2LDQsMCwxNiwwLDE3NiwxNzUsMzMsMTI4LDY4LDAsCisJMzMsMzIsMCwyLDIwLDAsMTc3LDE3NSwyNTUsMjU1LDE3Nyw0OCwKKwkyOCwwLDE5MSwxNzUsMTYyLDY1LDE5MiwxMiwzMyw0MCwzMiwyLAorCTgsMCw2NCwxNiwxLDAsNCwzOCwxNjIsNjUsMTkyLDEyLAorCTMzLDQwLDMyLDIsNCwwLDY0LDE2LDIsMCw0LDM4LAorCTE2Miw2NSwxOTIsMTIsMzMsNDAsMzIsMiw0MywxNDQsMiwwLAorCTMzLDE2LDY0LDIsMjgsMCwxOTEsMTQzLDI0LDAsMTc4LDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyMTYsMjU1LDE4OSwzOSw2NCwxNiw0LDAsCisJMjQsMCwxNzgsMTc1LDMzLDE0NCw2OCwwLDMzLDMyLDY0LDIsCisJMzYsMCwxOTEsMTc1LDMyLDAsMTgwLDE3NSwyOCwwLDE3OSwxNzUsCisJMjAsMCwxNzcsMTc1LDYwLDY1LDE5MiwxMiwxNiwwLDE3NiwxNzUsCisJMSwwLDg0LDM4LDMzLDMyLDEyOCwyLDYwLDY1LDE5MiwxMiwKKwkzMywxMzYsNjQsMCwyLDAsODMsMzgsMzMsMzIsOTYsMiwKKwk2MCw2NSwxOTIsMTIsMzMsMTI4LDY0LDAsMjU1LDI1NSwzNSw1MCwKKwkyNTUsMjU1LDE3LDUwLDgsMCwxMTMsMjAsMCwwLDAsMCwKKwkyNTUsMjU1LDY2LDQ4LDMsMCwzNCwxOCwzMywzMiw5NiwyLAorCTE2Miw2NSwxOTIsMTIsMzMsNDAsMzIsMiw2Niw2NywxOTIsOCwKKwkzMywxNiwzMiwyLDI1NSwyNTUsODAsNDgsNCwwLDExMiwxNiwKKwkzMywzMiwxMjgsMiw1LDAsNDgsMjIsMjU1LDI1NSwyLDM2LAorCTMzLDMyLDY0LDIsMTYyLDY1LDE5MiwxMiwzMyw0MCwwLDIsCisJMzMsMTYsMCwyLDM2LDAsMTkxLDE0MywzMiwwLDE4MCwxNDMsCisJMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMyw0MCwwLDE4OSwzOSwKKwkwLDAsMCwwLDAsMCwwLDAsMCw5Niw4LDY0LAorCTAsMCwwLDAsMjU0LDI1NSwxLDM2LDM2LDcyLDEsMSwKKwkwLDk2LDEzNyw2NCwwLDAsMTMzLDE2NCwyLDAsMTMyLDMyLAorCTIsNDQsNSwwLDAsMCwxMzMsMTY0LDAsOTYsMTM2LDY0LAorCTgsMCwyMjQsMywwLDAsMCwwLDIwOCwyNTUsMTg5LDM5LAorCTMyLDAsMTc4LDE3NSwzMywxNDQsMTI4LDAsMjgsMCwxNzcsMTc1LAorCTMzLDEzNiwxNjAsMCwzNiwwLDE3OSwxNzUsMzMsMTUyLDE5MiwwLAorCTQwLDAsMTgwLDE3NSwzMywxNjAsMjI0LDAsNDQsMCwxOTEsMTc1LAorCTIsMCwzMiwyMiwyNCwwLDE3NiwxNzUsMjU1LDI1NSwxNywzNiwKKwkwLDAsNjYsMTQyLDAsMCwwLDAsMzYsMTYsODEsMCwKKwkzLDAsODMsMjAsMCwwLDAsMCwxMjEsNjcsMTkyLDgsCisJMSwwLDIsMzYsMTEsMCwxMjgsMjYsMzMsMTI4LDAsMCwKKwkxNDMsNjMsMTkyLDEyLDAsMCwwLDAsMCwwLDY2LDE0MiwKKwkwLDAsMCwwLDM2LDE2LDgxLDAsMjQ2LDI1NSw4MywxNiwKKwkxLDAsMTYsMzgsNDIsMTYsMjAsMiwyNDcsMjU1LDY0LDIwLAorCTAsMCwwLDAsMzMsMTYsMCwwLDQ0LDAsMTkxLDE0MywKKwk0MCwwLDE4MCwxNDMsMzYsMCwxNzksMTQzLDMyLDAsMTc4LDE0MywKKwkyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk0OCwwLDE4OSwzOSwyMDgsMjU1LDE4OSwzOSwzMiwwLDE3OCwxNzUsCisJMzMsMTQ0LDEyOCwwLDI4LDAsMTc3LDE3NSwzMywxMzYsMTYwLDAsCisJMzYsMCwxNzksMTc1LDMzLDE1MiwxOTIsMCw0MCwwLDE4MCwxNzUsCisJMzMsMTYwLDIyNCwwLDQ0LDAsMTkxLDE3NSwyLDAsMzIsMjIsCisJMjQsMCwxNzYsMTc1LDI1NSwyNTUsMTcsNTIsMCwwLDY2LDE1MCwKKwkwLDAsMCwwLDM2LDE2LDgxLDAsMywwLDgzLDIwLAorCTAsMCwwLDAsMTYyLDY3LDE5Miw4LDEsMCwyLDM2LAorCTExLDAsMTI4LDI2LDMzLDEyOCwwLDAsMTQzLDYzLDE5MiwxMiwKKwkwLDAsMCwwLDAsMCw2NiwxNTAsMCwwLDAsMCwKKwkzNiwxNiw4MSwwLDI0NiwyNTUsODMsMTYsMSwwLDE2LDM4LAorCTQyLDE2LDIwLDIsMjQ3LDI1NSw2NCwyMCwwLDAsMCwwLAorCTMzLDE2LDAsMCw0NCwwLDE5MSwxNDMsNDAsMCwxODAsMTQzLAorCTM2LDAsMTc5LDE0MywzMiwwLDE3OCwxNDMsMjgsMCwxNzcsMTQzLAorCTI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsNDgsMCwxODksMzksCisJMjA4LDI1NSwxODksMzksMzIsMCwxNzgsMTc1LDMzLDE0NCwxMjgsMCwKKwkyOCwwLDE3NywxNzUsMzMsMTM2LDE2MCwwLDM2LDAsMTc5LDE3NSwKKwkzMywxNTIsMTkyLDAsNDAsMCwxODAsMTc1LDMzLDE2MCwyMjQsMCwKKwk0NCwwLDE5MSwxNzUsMiwwLDMyLDIyLDI0LDAsMTc2LDE3NSwKKwkyNTUsMCwxNywzNiwwLDAsNjYsMTQ2LDAsMCwwLDAsCisJMzYsMTYsODEsMCwzLDAsODMsMjAsMCwwLDAsMCwKKwkyMDMsNjcsMTkyLDgsMSwwLDIsMzYsMTEsMCwxMjgsMjYsCisJMzMsMTI4LDAsMCwxNDMsNjMsMTkyLDEyLDAsMCwwLDAsCisJMCwwLDY2LDE0NiwwLDAsMCwwLDM2LDE2LDgxLDAsCisJMjQ2LDI1NSw4MywxNiwxLDAsMTYsMzgsNDIsMTYsMjAsMiwKKwkyNDcsMjU1LDY0LDIwLDAsMCwwLDAsMzMsMTYsMCwwLAorCTQ0LDAsMTkxLDE0Myw0MCwwLDE4MCwxNDMsMzYsMCwxNzksMTQzLAorCTMyLDAsMTc4LDE0MywyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0OCwwLDE4OSwzOSwyMDgsMjU1LDE4OSwzOSwKKwkzMiwwLDE3OCwxNzUsMzMsMTQ0LDEyOCwwLDI4LDAsMTc3LDE3NSwKKwkzMywxMzYsMTYwLDAsMzYsMCwxNzksMTc1LDMzLDE1MiwxOTIsMCwKKwk0MCwwLDE4MCwxNzUsMzMsMTYwLDIyNCwwLDQ0LDAsMTkxLDE3NSwKKwkyLDAsMzIsMjIsMjQsMCwxNzYsMTc1LDI1NSwyNTUsMTcsMzYsCisJMCwwLDY2LDE0MiwwLDAsMCwwLDM2LDE2LDgxLDAsCisJMywwLDgzLDIwLDAsMCwwLDAsMjQ0LDY3LDE5Miw4LAorCTEsMCwyLDM2LDExLDAsMTI4LDI2LDMzLDEyOCwwLDAsCisJMTQzLDYzLDE5MiwxMiwwLDAsMCwwLDAsMCw2NiwxNDIsCisJMCwwLDAsMCwzNiwxNiw4MSwwLDI0NiwyNTUsODMsMjAsCisJMSwwLDE2LDM4LDQyLDE2LDIwLDIsMjQ3LDI1NSw2NCwyMCwKKwkwLDAsMCwwLDMzLDE2LDAsMCw0NCwwLDE5MSwxNDMsCisJNDAsMCwxODAsMTQzLDM2LDAsMTc5LDE0MywzMiwwLDE3OCwxNDMsCisJMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDgsMCwxODksMzksMjA4LDI1NSwxODksMzksMzIsMCwxNzgsMTc1LAorCTMzLDE0NCwxMjgsMCwyOCwwLDE3NywxNzUsMzMsMTM2LDE2MCwwLAorCTM2LDAsMTc5LDE3NSwzMywxNTIsMTkyLDAsNDAsMCwxODAsMTc1LAorCTMzLDE2MCwyMjQsMCw0NCwwLDE5MSwxNzUsMiwwLDMyLDIyLAorCTI0LDAsMTc2LDE3NSwyNTUsMjU1LDE3LDUyLDAsMCw2NiwxNTAsCisJMCwwLDAsMCwzNiwxNiw4MSwwLDMsMCw4MywyMCwKKwkwLDAsMCwwLDI5LDY4LDE5Miw4LDEsMCwyLDM2LAorCTExLDAsMTI4LDI2LDMzLDEyOCwwLDAsMTQzLDYzLDE5MiwxMiwKKwkwLDAsMCwwLDAsMCw2NiwxNTAsMCwwLDAsMCwKKwkzNiwxNiw4MSwwLDI0NiwyNTUsODMsMjAsMSwwLDE2LDM4LAorCTQyLDE2LDIwLDIsMjQ3LDI1NSw2NCwyMCwwLDAsMCwwLAorCTMzLDE2LDAsMCw0NCwwLDE5MSwxNDMsNDAsMCwxODAsMTQzLAorCTM2LDAsMTc5LDE0MywzMiwwLDE3OCwxNDMsMjgsMCwxNzcsMTQzLAorCTI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsNDgsMCwxODksMzksCisJMjA4LDI1NSwxODksMzksMzIsMCwxNzgsMTc1LDMzLDE0NCwxMjgsMCwKKwkyOCwwLDE3NywxNzUsMzMsMTM2LDE2MCwwLDM2LDAsMTc5LDE3NSwKKwkzMywxNTIsMTkyLDAsNDAsMCwxODAsMTc1LDMzLDE2MCwyMjQsMCwKKwk0NCwwLDE5MSwxNzUsMiwwLDMyLDIyLDI0LDAsMTc2LDE3NSwKKwkyNTUsMCwxNywzNiwwLDAsNjYsMTQ2LDAsMCwwLDAsCisJMzYsMTYsODEsMCwzLDAsODMsMjAsMCwwLDAsMCwKKwk3MCw2OCwxOTIsOCwxLDAsMiwzNiwxMSwwLDEyOCwyNiwKKwkzMywxMjgsMCwwLDE0Myw2MywxOTIsMTIsMCwwLDAsMCwKKwkwLDAsNjYsMTQ2LDAsMCwwLDAsMzYsMTYsODEsMCwKKwkyNDYsMjU1LDgzLDIwLDEsMCwxNiwzOCw0MiwxNiwyMCwyLAorCTI0NywyNTUsNjQsMjAsMCwwLDAsMCwzMywxNiwwLDAsCisJNDQsMCwxOTEsMTQzLDQwLDAsMTgwLDE0MywzNiwwLDE3OSwxNDMsCisJMzIsMCwxNzgsMTQzLDI4LDAsMTc3LDE0MywyNCwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDQ4LDAsMTg5LDM5LDAsMCwwLDAsCisJMCwwLDAsMCwyNDgsMjU1LDE4OSwzOSwyNTUsMjU1LDE5NSwzNiwKKwk4LDAsMTkyLDE2LDMzLDU2LDEyOCwwLDI1NSwyNTUsNiwzNiwKKwkwLDAsMTYyLDE0NCwxLDAsMTY1LDM2LDI1NSwyNTUsOTksMzYsCisJMCwwLDEzMCwxNjAsMjUxLDI1NSwxMDIsMjAsMSwwLDEzMiwzNiwKKwkzMywxNiwyMjQsMCw4LDAsMjI0LDMsOCwwLDE4OSwzOSwKKwkwLDAsMCwwLDAsMCwwLDAsMCw5Niw4LDY0LAorCTEsMCw5LDYwLDAsOTYsMTM3LDY0LDE1LDAsMTM4LDQ4LAorCTMzLDQwLDE3MCwwLDE5MiwyNTUsMTY1LDM2LDAsMCwxMjgsMTYwLAorCTE2LDAsMTI4LDE2MCwzMiwwLDEyOCwxNjAsMjUxLDI1NSwxNjAsMjgsCisJNDgsMCwxMjgsMTYwLDY0LDAsMTMyLDM2LDAsOTYsMTM2LDY0LAorCTAsMCwwLDAsMCwwLDAsMCw4LDAsMjI0LDMsCisJMCwwLDAsMCwwLDAsMCwwLDEsMTMxLDIsNjAsCisJMjI0LDE3LDY2LDM2LDAsMzIsOSw2MCwzNywxNiw3MywwLAorCTgsMCw2NCwwLDAsMCwwLDAsMCw5Niw4LDY0LAorCTMsMCw5LDYwLDAsOTYsMTM3LDY0LDE1LDAsMTM4LDQ4LAorCTMzLDQwLDE3MCwwLDE5MiwyNTUsMTY1LDM2LDAsMCwxMjgsMTYwLAorCTE2LDAsMTI4LDE2MCwzMiwwLDEyOCwxNjAsMjUxLDI1NSwxNjAsMjgsCisJNDgsMCwxMjgsMTYwLDY0LDAsMTMyLDM2LDAsOTYsMTM2LDY0LAorCTAsMCwwLDAsMCwwLDAsMCw4LDAsMjI0LDMsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDE2MywzLDYwLDE5MiwzLDk5LDE0MCwKKwkwLDE2MywyLDYwLDE4OCwzLDY2LDE0MCwwLDAsMCwwLAorCTE2LDAsOTgsMTYsMjU1LDI1NSwyLDM2LDAsMTYzLDIsNjAsCisJMTg4LDMsNjYsMTQwLDAsMTYzLDEsNjAsMzMsOCwzNCwwLAorCTIwMCwzLDM0LDE0NCwwLDE2MywzLDYwLDE4OCwzLDk5LDE0MCwKKwkwLDE2Myw0LDYwLDE5NiwzLDEzMiwxNDAsMCwyMiwyLDAsCisJMywyMiwyLDAsMSwwLDk5LDM2LDM2LDI0LDEwMCwwLAorCTAsMTYzLDEsNjAsMTg4LDMsMzUsMTcyLDgsMCwyMjQsMywKKwkwLDAsMCwwLDAsMTYzLDYsNjAsMCwxLDE5OCw1MiwKKwkxMCwwLDksMzYsMjU1LDI1NSw4LDM2LDEzLDAsNywzNiwKKwkwLDE2MywzLDYwLDE5MiwzLDk5LDE0MCwwLDE2MywyLDYwLAorCTE4OCwzLDY2LDE0MCwwLDAsMCwwLDE3LDAsOTgsMTYsCisJMjU1LDI1NSw1LDM2LDAsMTYzLDIsNjAsMTg4LDMsNjYsMTQwLAorCTAsMCwwLDAsMzMsMTYsNzAsMCwyMDAsMiw2NiwxNDQsCisJMCwwLDAsMCwwLDIyLDIsMCwzLDQ2LDIsMCwKKwkwLDE2MywyLDYwLDE4OCwzLDY2LDE0MCwwLDE2MywzLDYwLAorCTE5NiwzLDk5LDE0MCwxLDAsNjYsMzYsMzYsMTYsNjcsMCwKKwkwLDE2MywxLDYwLDE4OCwzLDM0LDE3MiwxMSwwLDE2OSwxNiwKKwkxMSwwLDE2Miw0MCw1LDAsNjQsMTYsMCwwLDAsMCwKKwkyMjgsMjU1LDE2OCwxNiwwLDAsMCwwLDIwNiw2OCwxOTIsOCwKKwkwLDAsMTMzLDE2MCwyMjQsMjU1LDE2NywxNiwwLDAsMCwwLAorCTIwNiw2OCwxOTIsOCwwLDAsMTMzLDE2MCwyMDgsNjgsMTkyLDgsCisJMCwwLDEyOCwxNjAsMTY5LDY4LDE5Miw4LDEsMCwxMzIsMzYsCisJOCwwLDIyNCwzLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDIwOCwyNTUsMTg5LDM5LDI0LDAsMTc2LDE3NSwKKwkzMywxMjgsMTI4LDAsMzYsMCwxNzksMTc1LDMzLDE1MiwxNjAsMCwKKwkyOCwwLDE3NywxNzUsMzMsMTM2LDAsMCwzMiwwLDE3OCwxNzUsCisJMzMsMTQ0LDAsMiw1LDAsNjQsMjIsNDAsMCwxOTEsMTc1LAorCTU0LDAsOTYsMjIsMzMsMTYsMCwwLDIyLDY5LDE5Miw4LAorCTAsMCwzMiwxNzQsMCwwLDY3LDEzMCwwLDAsMCwwLAorCTIzMyw2OCwxOTIsOCwzMiwwLDIsMzYsMCwwLDMsMTMwLAorCTMyLDAsMiwzNiwyNTMsMjU1LDk4LDE2LDEsMCwxNiwzOCwKKwkyNTUsMjU1LDE2LDM4LDksMCwyLDM2LDI0OSwyNTUsOTgsMTYsCisJMSwwLDE2LDM4LDI1NSwyNTUsMTYsMzgsMCwwLDMsMTMwLAorCTQ1LDAsMiwzNiw0LDAsOTgsMjAsNDMsMCwyLDM2LAorCTEsMCwxNiwzOCwyNTAsNjgsMTkyLDgsMSwwLDE3LDM2LAorCTMsMCw5OCwyMCwzMywzMiwwLDIsMSwwLDE2LDM4LAorCTMzLDMyLDAsMiw0NCw2OSwxOTIsMTIsMTYsMCwxNjUsMzksCisJNywwLDk2LDE4LDMzLDI0LDY0LDAsMTYsMCwxNjIsMTQzLAorCTAsMCwwLDAsMiwwLDgwLDIwLDAsMCwwLDAsCisJMzMsMTYsNjQsMiwwLDAsOTgsMTc0LDYsMCwzMiwxOCwKKwkwLDEyOCwyLDYwLDQzLDE2LDY3LDAsNSwwLDY0LDIwLAorCTI1NSwxMjcsMiw2MCwxOSw2OSwxOTIsOCwzMywxNiw5NiwwLAorCTUsMCw5Nyw0LDI1NSwxMjcsMiw2MCw3LDAsMzIsMTgsCisJMjU1LDI1NSw2Niw1MiwyMiw2OSwxOTIsOCwwLDEyOCwyLDYwLAorCTMzLDE2LDk2LDAsMiwwLDMyLDE4LDAsMCwwLDAsCisJMzUsMTYsMiwwLDQwLDAsMTkxLDE0MywzNiwwLDE3OSwxNDMsCisJMzIsMCwxNzgsMTQzLDI4LDAsMTc3LDE0MywyNCwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDQ4LDAsMTg5LDM5LDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDIwOCwyNTUsMTMwLDM2LAorCTEwLDAsNjYsNDQsNywwLDY0LDIwLDEsMCwyLDM2LAorCTE5MSwyNTUsMTMwLDM2LDYsMCw2Niw0NCwzLDAsNjQsMjAsCisJMSwwLDIsMzYsMTU5LDI1NSwxMzAsMzYsNiwwLDY2LDQ0LAorCTgsMCwyMjQsMywwLDAsMCwwLDI0OCwyNTUsMTg5LDM5LAorCTAsMCwxNzYsMTc1LDMzLDU2LDAsMCwzMyw3MiwwLDAsCisJMzMsODAsMCwwLDMzLDExMiwwLDAsNSwwLDEyOCwyMCwKKwkzMywyMDAsMTI4LDAsMTEwLDAsMTYwLDIwLDMzLDE2LDAsMCwKKwkxNjMsNjksMTkyLDgsMCwwLDE5MiwxNzMsMCwwLDEzMSwxMjgsCisJMzIsMCwyLDM2LDI1MywyNTUsOTgsMTYsMSwwLDEzMiwzNiwKKwkyNTUsMjU1LDEzMiwzNiw5LDAsMiwzNiwyNDksMjU1LDk4LDE2LAorCTEsMCwxMzIsMzYsMjU1LDI1NSwxMzIsMzYsMCwwLDEzMSwxMjgsCisJNDMsMCwyLDM2LDMsMCw5OCwyMCw0NSwwLDIsMzYsCisJNzUsNjksMTkyLDgsMSwwLDEzMiwzNiwzLDAsOTgsMjAsCisJMCwwLDAsMCwxLDAsMTMyLDM2LDEsMCwxNCwzNiwKKwkzLDAsMTkyLDE2LDE2LDAsMiwzNiwxNiwwLDE5NCwyMCwKKwkwLDAsMCwwLDAsMCwxMzEsMTI4LDQ4LDAsMiwzNiwKKwk5LDAsOTgsMjAsMTAsMCwyLDM2LDEsMCwxMzEsMTI4LAorCTg4LDAsMiwzNiwzLDAsOTgsMTYsMTIwLDAsMiwzNiwKKwkzLDAsOTgsMjAsOCwwLDIsMzYsMTYsMCwyLDM2LAorCTIsMCwxMzIsMzYsMiwwLDE5MiwyMCwwLDAsMCwwLAorCTMzLDQ4LDY0LDAsMCwwLDEzMSwxMjgsMjU1LDI1NSwyLDM2LAorCTI3LDAsNzAsMCwyLDAsMTkyLDIwLDAsMCwwLDAsCisJMTMsMCw3LDAsMTgsNjQsMCwwLDE2LDE5MiwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDQyLDAsOTYsMTYsCisJNDgsMCw5OCw0NCw0OCwwLDIwNywzNiwxMSwwLDIwNSw0MCwKKwk4NywwLDIwNCwzNiw1NSwwLDIwMywzNiw1LDAsNjQsMjAsCisJNDMsMTYsMTExLDAsMywwLDY0LDE2LDAsMCwwLDAsCisJMTMwLDY5LDE5Miw4LDIwOCwyNTUsOTksMzYsMzAsMCwxNjAsMjEsCisJOTcsMCw5OCw0NCw2LDAsNjQsMjAsNjUsMCw5OCw0NCwKKwk0MywxNiwxMDgsMCwzLDAsNjQsMTYsNjUsMCw5OCw0NCwKKwkxMzAsNjksMTkyLDgsMTY5LDI1NSw5OSwzNiwyMSwwLDY0LDIwLAorCTQzLDE2LDEwNywwLDE5LDAsNjQsMTYsMCwwLDAsMCwKKwkyMDEsMjU1LDk5LDM2LDQzLDE2LDcsMSw2LDAsNjQsMjAsCisJMSwwLDksMzYsNiwwLDIzMiwyMCwyNCwwLDIzMCwwLAorCTQzLDE2LDMsMywzLDAsNjQsMTYsMCwwLDAsMCwKKwkxLDAsMTAsMzYsMjQsMCwyMzAsMCwxLDAsMTMyLDM2LAorCTE4LDEyOCwwLDAsMzMsNTYsMywyLDAsMCwxMzEsMTI4LAorCTAsMCwwLDAsMjIwLDI1NSw5NiwyMCw0OCwwLDk4LDQ0LAorCTUsMCw2NCwxNywwLDAsMCwwLDEzLDAsMTYwLDE2LAorCTI1NSwyNTUsMiwzNiwxNjMsNjksMTkyLDgsMCwwLDE2NCwxNzIsCisJNiwwLDE2MCwxNiwwLDAsMCwwLDMsMCwzMiwyMSwKKwkwLDAsMCwwLDE2MCw2OSwxOTIsOCwwLDAsMTg1LDE3MiwKKwkwLDAsMTY0LDE3MiwyLDAsMTkyLDE3LDMzLDE2LDIyNCwwLAorCTM1LDE2LDIsMCwwLDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJOCwwLDE4OSwzOSwwLDAsMCwwLDAsMCwwLDAsCisJMjAwLDI1NSwxODksMzksMTYsMCwxNzYsMTc1LDcsMTYyLDE2LDYwLAorCTIzNiwwLDE2LDU0LDI1NSwyNDAsMyw2MCwyNTUsMjU1LDk5LDUyLAorCTYzLDAsMTMyLDQ4LDM2LDAsMTgxLDE3NSwxMjgsMSwxNDksNTIsCisJMjQsMCwxNzgsMTc1LDAsMSwxOCwzNiwyMCwwLDE3NywxNzUsCisJNywxNjIsMTcsNjAsMjM2LDAsNDksNTQsNDQsMCwxODMsMTc1LAorCTAsNCwyMyw2MCwzMiwwLDE4MCwxNzUsMjU1LDI1MSwyMCw2MCwKKwkyNTUsMjU1LDE0OCw1NCw0MCwwLDE4MiwxNzUsMCwxLDIyLDYwLAorCTI4LDAsMTc5LDE3NSwyNTUsMjU0LDE5LDYwLDQ4LDAsMTkxLDE3NSwKKwkwLDAsMiwxNDIsMCwwLDAsMCwzNiwxNiw2NywwLAorCTIyNCwxMzMsMTMwLDE3NSwwLDAsMiwxNzQsNzYsNjMsMTkyLDEyLAorCTI1NSwyNTUsMTE1LDU0LDIyNCwxMzMsMTMwLDE0MywwLDIsMyw2MCwKKwkzNywxNiw2NywwLDIyNCwxMzMsMTMwLDE3NSwwLDAsMiwxNzQsCisJMzYsMTYsODUsMiw1LDAsNjQsMTYsMCwwLDAsMCwKKwkyMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwyMTQsNjksMTkyLDgsCisJMzcsMTYsODcsMCwyMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwkzNiwxNiw4NCwwLDIyNCwxMzMsMTMwLDE3NSw3Niw2MywxOTIsMTIsCisJMCwwLDM0LDE3NCwyMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwkzNywxNiw4NiwwLDIyNCwxMzMsMTMwLDE3NSwwLDAsMzQsMTc0LAorCTc2LDYzLDE5MiwxMiw2NiwxNDQsMTgsMCwyMjQsMTMzLDEzMCwxNDMsCisJMCwwLDAsMCwzNiwxNiw4MywwLDIyNCwxMzMsMTMwLDE3NSwKKwkwLDAsMzQsMTc0LDI1NSwyNTUsNjYsNTAsMjMwLDI1NSw2NCwyMCwKKwkzNiwxNiw4NSwyLDMzLDEzNiwwLDAsMTYsMCwxNiwzNiwKKwk3LDE2MiwxOCw2MCwyMzYsMCw4Miw1NCwwLDEsMjIsNjAsCisJMCw4LDIxLDYwLDI1NSwyNTQsMTksNjAsMjU1LDI1NSwxMTUsNTQsCisJMjU1LDI1NSwyMCwzNiw3Niw2MywxOTIsMTIsMCwwLDAsMCwKKwkyMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwzNywxNiw4NiwwLAorCTIyNCwxMzMsMTMwLDE3NSw3Niw2MywxOTIsMTIsMCwwLDY2LDE3NCwKKwk3LDAsMCwxOCwwLDAsMCwwLDAsMCw2NiwxNDIsCisJMCwwLDAsMCwzNiwxNiw4NSwwLDIsMCw2NCwxNiwKKwk2NCwxMzYsMTcsMCwxLDAsNDksNTQsNzYsNjMsMTkyLDEyLAorCTI1NSwyNTUsMTYsMzgsMjI0LDEzMywxMzAsMTQzLDAsMCwwLDAsCisJMzYsMTYsODMsMCwyMjQsMTMzLDEzMCwxNzUsMCwwLDY2LDE3NCwKKwkyMzIsMjU1LDIwLDIyLDcsMTYyLDQsNjAsMjM2LDAsMTMyLDUyLAorCTI1NSwyNTMsMyw2MCwyMjQsMTMzLDEzMCwxNDMsMjU1LDI1NSw5OSw1MiwKKwkzNiwxNiw2NywwLDIyNCwxMzMsMTMwLDE3NSwwLDAsMTMwLDE3MiwKKwkyNTUsMjU1LDM0LDUwLDQ4LDAsMTkxLDE0Myw0NCwwLDE4MywxNDMsCisJNDAsMCwxODIsMTQzLDM2LDAsMTgxLDE0MywzMiwwLDE4MCwxNDMsCisJMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMyw1NiwwLDE4OSwzOSwKKwkyMDAsMjU1LDE4OSwzOSw0OCwwLDE5MCwxNzUsMzMsMjQwLDE2MCwwLAorCTQwLDAsMTgyLDE3NSw2MywwLDE1MCw0OCwzMywzMiwxOTIsMiwKKwk1MiwwLDE5MSwxNzUsNDQsMCwxODMsMTc1LDM2LDAsMTgxLDE3NSwKKwkzMiwwLDE4MCwxNzUsMjgsMCwxNzksMTc1LDI0LDAsMTc4LDE3NSwKKwkyMCwwLDE3NywxNzUsMTY4LDY5LDE5MiwxMiwxNiwwLDE3NiwxNzUsCisJMzMsMTUyLDY0LDAsMjU1LDI1NSwxOTUsNTEsMjU1LDI1NSw5OCw1MCwKKwkzLDAsOTgsMjAsNywxNjIsMTYsNjAsMTMxLDcxLDE5Miw4LAorCTEsMCwyLDM2LDIzNiwwLDE2LDU0LDI1NSwyNTIsMyw2MCwKKwkyNTUsMjU1LDk5LDUyLDAsMSwxOCwzNiw3LDE2MiwxNyw2MCwKKwkyMzYsMCw0OSw1NCwyNTUsMjUxLDIxLDYwLDI1NSwyNTUsMTgxLDU0LAorCTAsMSwyMyw2MCwyNTUsMjU0LDIwLDYwLDIyNCwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDM2LDE2LDY3LDAsMjI0LDEzMywxMzAsMTc1LAorCTAsMCwyLDE3NCw3Niw2MywxOTIsMTIsMjU1LDI1NSwxNDgsNTQsCisJMjI0LDEzMywxMzAsMTQzLDAsMiwzLDYwLDM3LDE2LDY3LDAsCisJMjI0LDEzMywxMzAsMTc1LDAsMCwyLDE3NCw0OCwxLDY2LDUwLAorCTUsMCw2NCwxNiwwLDQsNiw2MCwyMjQsMTMzLDEzMCwxNDMsCisJMCwwLDAsMCw4Myw3MCwxOTIsOCwzNywxNiw3MCwwLAorCTIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLDM2LDE2LDg1LDAsCisJMjI0LDEzMywxMzAsMTc1LDc2LDYzLDE5MiwxMiwwLDAsMzQsMTc0LAorCTIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLDM3LDE2LDg3LDAsCisJMjI0LDEzMywxMzAsMTc1LDAsMCwzNCwxNzQsNzYsNjMsMTkyLDEyLAorCTY2LDE0NCwxOCwwLDIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTM2LDE2LDg0LDAsMjI0LDEzMywxMzAsMTc1LDAsMCwzNCwxNzQsCisJMjU1LDI1NSw2Niw1MCwyMzAsMjU1LDY0LDIwLDQ4LDEsNjYsNTAsCisJMjU1LDI1NSwxOTUsNTEsMjU1LDI1NSw5OCw1MCwzOSwxNiwyLDAsCisJMzYsMjQsOTgsMCw4OCwwLDk2LDE2LDE5MiwxLDIxMyw1NCwKKwk3LDE2MiwxNiw2MCwyMzYsMCwxNiw1NCwyNTUsMjUyLDMsNjAsCisJMjU1LDI1NSw5OSw1MiwwLDEsMTgsMzYsNywxNjIsMTcsNjAsCisJMjM2LDAsNDksNTQsMjU1LDI1MSwyMCw2MCwyNTUsMjU1LDE0OCw1NCwKKwkwLDEsMjMsNjAsMjU1LDI1NCwxOSw2MCwyMjQsMTMzLDEzMCwxNDMsCisJMCwwLDAsMCwzNiwxNiw2NywwLDIyNCwxMzMsMTMwLDE3NSwKKwkwLDAsMiwxNzQsNzYsNjMsMTkyLDEyLDI1NSwyNTUsMTE1LDU0LAorCTIyNCwxMzMsMTMwLDE0MywwLDIsMyw2MCwzNywxNiw2NywwLAorCTIyNCwxMzMsMTMwLDE3NSwwLDAsMiwxNzQsMzYsMTYsODUsMiwKKwk1LDAsNjQsMTYsMCw0LDYsNjAsMjI0LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsMTQwLDcwLDE5Miw4LDM3LDE2LDcwLDAsCisJMjI0LDEzMywxMzAsMTQzLDAsMCwwLDAsMzYsMTYsODQsMCwKKwkyMjQsMTMzLDEzMCwxNzUsNzYsNjMsMTkyLDEyLDAsMCwzNCwxNzQsCisJMjI0LDEzMywxMzAsMTQzLDAsMCwwLDAsMzcsMTYsODcsMCwKKwkyMjQsMTMzLDEzMCwxNzUsMCwwLDM0LDE3NCw3Niw2MywxOTIsMTIsCisJNjYsMTQ0LDE4LDAsMjI0LDEzMywxMzAsMTQzLDAsMCwwLDAsCisJMzYsMTYsODMsMCwyMjQsMTMzLDEzMCwxNzUsMCwwLDM0LDE3NCwKKwkyNTUsMjU1LDY2LDUwLDIzMCwyNTUsNjQsMjAsMzYsMTYsODUsMiwKKwk3LDE2MiwxNiw2MCwyMzYsMCwxNiw1NCwyNTUsMjUyLDMsNjAsCisJMjI0LDEzMywxMzAsMTQzLDI1NSwyNTUsOTksNTIsMzYsMTYsNjcsMCwKKwkyMjQsMTMzLDEzMCwxNzUsNzYsNjMsMTkyLDEyLDAsMCwyLDE3NCwKKwkyMjQsMTMzLDEzMCwxNDMsMCwyLDMsNjAsMzcsMTYsNjcsMCwKKwkyMjQsMTMzLDEzMCwxNzUsMCwwLDIsMTc0LDAsMCwyLDE0MiwKKwkwLDgsMyw2MCwzNiwxNiw2NywwLDExLDAsNjQsMjAsCisJNywxNjIsNCw2MCw3LDE2MiwxNiw2MCwyMzYsMCwxNiw1NCwKKwkwLDgsMTcsNjAsNzYsNjMsMTkyLDEyLDAsMCwwLDAsCisJMCwwLDIsMTQyLDAsMCwwLDAsMzYsMTYsODEsMCwKKwkyNTAsMjU1LDY0LDE2LDcsMTYyLDQsNjAsMjM2LDAsMTMyLDUyLAorCTI1NSwyNTMsMyw2MCwyMjQsMTMzLDEzMCwxNDMsMjU1LDI1NSw5OSw1MiwKKwkzNiwxNiw2NywwLDIyNCwxMzMsMTMwLDE3NSwwLDAsMTMwLDE3MiwKKwkyNTUsMjU1LDE5NSw1MSwyNTUsMjU1LDIsNTIsMTMzLDAsOTgsMTYsCisJNjQsMSwyMTMsNTQsNywxNjIsMTYsNjAsMjM2LDAsMTYsNTQsCisJMjU1LDI1MiwzLDYwLDI1NSwyNTUsOTksNTIsMCwxLDE4LDM2LAorCTcsMTYyLDE3LDYwLDIzNiwwLDQ5LDU0LDI1NSwyNTEsMjAsNjAsCisJMjU1LDI1NSwxNDgsNTQsMCwxLDIzLDYwLDI1NSwyNTQsMTksNjAsCisJMjI0LDEzMywxMzAsMTQzLDAsMCwwLDAsMzYsMTYsNjcsMCwKKwkyMjQsMTMzLDEzMCwxNzUsMCwwLDIsMTc0LDc2LDYzLDE5MiwxMiwKKwkyNTUsMjU1LDExNSw1NCwyMjQsMTMzLDEzMCwxNDMsMCwyLDMsNjAsCisJMzcsMTYsNjcsMCwyMjQsMTMzLDEzMCwxNzUsMCwwLDIsMTc0LAorCTM2LDE2LDg1LDIsNSwwLDY0LDE2LDAsNCw2LDYwLAorCTIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLDIzMSw3MCwxOTIsOCwKKwkzNywxNiw3MCwwLDIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTM2LDE2LDg0LDAsMjI0LDEzMywxMzAsMTc1LDc2LDYzLDE5MiwxMiwKKwkwLDAsMzQsMTc0LDIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTM3LDE2LDg3LDAsMjI0LDEzMywxMzAsMTc1LDAsMCwzNCwxNzQsCisJNzYsNjMsMTkyLDEyLDY2LDE0NCwxOCwwLDIyNCwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDM2LDE2LDgzLDAsMjI0LDEzMywxMzAsMTc1LAorCTAsMCwzNCwxNzQsMjU1LDI1NSw2Niw1MCwyMzAsMjU1LDY0LDIwLAorCTM2LDE2LDg1LDIsMzMsMTYwLDE5MiwzLDcsMTYyLDIsNjAsCisJMjM2LDAsNjYsNTIsMCwxMjgsMTcsNTIsNywxNjIsMTYsNjAsCisJMjM2LDAsMTYsNTQsMCw0LDIzLDYwLDI1NSwyNTEsMTksNjAsCisJMjU1LDI1NSwxMTUsNTQsMCwxLDIxLDYwLDI1NSwyNTQsMTgsNjAsCisJMjU1LDI1NSw4Miw1NCwyMjQsMTMzLDEzMSwxNDMsMCwyLDQsNjAsCisJMzcsMjQsMTAwLDAsMjI0LDEzMywxMzEsMTc1LDAsMCw2NywxNzIsCisJMzYsMTYsNTIsMiw1LDAsNjQsMTYsMCwwLDAsMCwKKwkyMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwyMCw3MSwxOTIsOCwKKwkzNywxNiw4NywwLDIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTM2LDE2LDgzLDAsMjI0LDEzMywxMzAsMTc1LDc2LDYzLDE5MiwxMiwKKwkwLDAsMiwxNzQsMjI0LDEzMywxMzAsMTQzLDAsMCwwLDAsCisJMzcsMTYsODUsMCwyMjQsMTMzLDEzMCwxNzUsMCwwLDIsMTc0LAorCTc2LDYzLDE5MiwxMiw2NiwxMzYsMTcsMCwyMjQsMTMzLDEzMCwxNDMsCisJMCwwLDAsMCwzNiwxNiw4MiwwLDIyNCwxMzMsMTMwLDE3NSwKKwkwLDAsMiwxNzQsMjU1LDI1NSwzNCw1MCwyMzAsMjU1LDY0LDIwLAorCTM2LDE2LDUyLDIsNywxNjIsMTYsNjAsMjM2LDAsMTYsNTQsCisJMjU1LDI1MiwzLDYwLDIyNCwxMzMsMTMwLDE0MywyNTUsMjU1LDk5LDUyLAorCTM2LDE2LDY3LDAsMjI0LDEzMywxMzAsMTc1LDc2LDYzLDE5MiwxMiwKKwkwLDAsMiwxNzQsMjI0LDEzMywxMzAsMTQzLDAsMiwzLDYwLAorCTM3LDE2LDY3LDAsMjI0LDEzMywxMzAsMTc1LDAsMCwyLDE3NCwKKwkwLDAsMiwxNDIsMCw4LDMsNjAsMzYsMTYsNjcsMCwKKwkxMSwwLDY0LDIwLDcsMTYyLDQsNjAsNywxNjIsMTYsNjAsCisJMjM2LDAsMTYsNTQsMCw4LDE3LDYwLDc2LDYzLDE5MiwxMiwKKwkwLDAsMCwwLDAsMCwyLDE0MiwwLDAsMCwwLAorCTM2LDE2LDgxLDAsMjUwLDI1NSw2NCwxNiw3LDE2Miw0LDYwLAorCTIzNiwwLDEzMiw1MiwyNTUsMjUzLDMsNjAsMjI0LDEzMywxMzAsMTQzLAorCTI1NSwyNTUsOTksNTIsMzYsMTYsNjcsMCwyMjQsMTMzLDEzMCwxNzUsCisJMCwwLDEzMCwxNzIsNywxNjIsMTYsNjAsMjM2LDAsMTYsNTQsCisJMjU1LDI1MiwzLDYwLDI1NSwyNTUsOTksNTIsMCwxLDE4LDM2LAorCTcsMTYyLDE3LDYwLDIzNiwwLDQ5LDU0LDAsNCwyMyw2MCwKKwkyNTUsMjUxLDIwLDYwLDI1NSwyNTUsMTQ4LDU0LDAsMSwyMSw2MCwKKwkyNTUsMjU0LDE5LDYwLDIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTM2LDE2LDY3LDAsMjI0LDEzMywxMzAsMTc1LDAsMCwyLDE3NCwKKwk3Niw2MywxOTIsMTIsMjU1LDI1NSwxMTUsNTQsMjI0LDEzMywxMzAsMTQzLAorCTAsMiwzLDYwLDM3LDE2LDY3LDAsMjI0LDEzMywxMzAsMTc1LAorCTAsMCwyLDE3NCwwLDEsNjYsNTAsNSwwLDY0LDE2LAorCTAsMCwwLDAsMjI0LDEzMywxMzAsMTQzLDAsMCwwLDAsCisJMTA4LDcxLDE5Miw4LDM3LDE2LDg3LDAsMjI0LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsMzYsMTYsODQsMCwyMjQsMTMzLDEzMCwxNzUsCisJNzYsNjMsMTkyLDEyLDAsMCwzNCwxNzQsMjI0LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsMzcsMTYsODUsMCwyMjQsMTMzLDEzMCwxNzUsCisJMCwwLDM0LDE3NCw3Niw2MywxOTIsMTIsNjYsMTQ0LDE4LDAsCisJMjI0LDEzMywxMzAsMTQzLDAsMCwwLDAsMzYsMTYsODMsMCwKKwkyMjQsMTMzLDEzMCwxNzUsMCwwLDM0LDE3NCwyNTUsMjU1LDY2LDUwLAorCTIzMCwyNTUsNjQsMjAsMCwxLDY2LDUwLDE2OCw2OSwxOTIsMTIsCisJMzMsMzIsMTkyLDIsMzgsMTYsMTk0LDMsMjU1LDI1NSw2Niw0OCwKKwkxLDAsNjYsNDQsNTIsMCwxOTEsMTQzLDQ4LDAsMTkwLDE0MywKKwk0NCwwLDE4MywxNDMsNDAsMCwxODIsMTQzLDM2LDAsMTgxLDE0MywKKwkzMiwwLDE4MCwxNDMsMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk1NiwwLDE4OSwzOSwwLDAsMCwwLDI0OCwyNTUsMTg5LDM5LAorCTI1NSwyNTUsMTk1LDM2LDYsMCwxOTIsMTYsMzMsMTYsMTI4LDAsCisJMjU1LDI1NSw2LDM2LDAsMCwxMzMsMTYwLDI1NSwyNTUsOTksMzYsCisJMjUzLDI1NSwxMDIsMjAsMSwwLDEzMiwzNiw4LDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDE1OSw3MSwxOTIsOCwKKwkzMywyNCwwLDAsMSwwLDk5LDM2LDAsMCwxMzAsMTI4LAorCTAsMCwwLDAsMjUyLDI1NSw2NCwyMCwxLDAsMTMyLDM2LAorCTgsMCwyMjQsMywzMywxNiw5NiwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwyNTUsMTk4LDM2LAorCTEwLDAsMTkyLDE2LDAsMCwwLDAsMCwwLDEzMSwxMjgsCisJMCwwLDE2MiwxMjgsMCwwLDAsMCw1LDAsOTgsMjAsCisJMCwwLDAsMCwxLDAsMTMyLDM2LDI1NSwyNTUsMTk4LDM2LAorCTI0OCwyNTUsMTkyLDIwLDEsMCwxNjUsMzYsMCwwLDEzMSwxNDQsCisJMCwwLDE2MiwxNDQsMCwwLDAsMCw4LDAsMjI0LDMsCisJMzUsMTYsOTgsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwxOTYsNzEsMTkyLDgsMjQwLDI1NSwxODksMzksCisJMCwwLDE2MywxMjgsMywyMiwyLDAsOCwwLDY3LDIwLAorCTAsMCwwLDAsMSwwLDEzMiwzNiwxLDAsMTY1LDM2LAorCTAsMCwxMzAsMTI4LDAsMCwxMzEsMTQ0LDAsMCwwLDAsCisJMjQ2LDI1NSw2NCwyMCwwLDIyLDMsMCwwLDAsMTMxLDE0NCwKKwkwLDAsMTYyLDE0NCwwLDAsMCwwLDM1LDE2LDk4LDAsCisJOCwwLDIyNCwzLDE2LDAsMTg5LDM5LDAsMCwwLDAsCisJMjU1LDI1NSwxOTgsMzYsOSwwLDE5Miw0LDMzLDE2LDAsMCwKKwkwLDAsMTMwLDE0NCwwLDAsMCwwLDUsMCw2OSwxNiwKKwkzMywxNiwxMjgsMCwyNTUsMjU1LDE5OCwzNiwyNTAsMjU1LDE5Myw0LAorCTEsMCwxMzIsMzYsMzMsMTYsMCwwLDgsMCwyMjQsMywKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDIsMCwxOTIsMjAsMjU1LDI1NSwyLDM2LAorCTEsMCwyLDM2LDgsMCwyMjQsMywwLDAsMjI2LDE3MiwKKwkyMzIsMjU1LDE4OSwzOSwyMCwwLDE5MSwxNzUsMTYsMCwxNzYsMTc1LAorCTQwLDAsMTc2LDE0MywzMywzMiwxOTIsMCw0LDAsNSwxNDIsCisJMCwwLDAsMCwxNSw4NiwxOTIsMTIsMjU1LDI1NSwyMzAsNDgsCisJMywwLDY0LDE2LDI1NSwyNTUsMiwzNiwyNDMsNzEsMTkyLDgsCisJMCwwLDIsMTc0LDAsMCwwLDE3NCwyMCwwLDE5MSwxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywyNCwwLDE4OSwzOSwKKwkyMDgsMjU1LDE4OSwzOSw0MCwwLDE5MSwxNzUsMzMsMjQsMTI4LDAsCisJNjQsMCwxNjIsMTQzLDMyLDAsMTYwLDE3NSwzNiwwLDE2MiwxNzUsCisJMTIsMCw2NiwxNDgsMCwwLDAsMCwyLDAsNjQsMjAsCisJMzMsMzIsMTYwLDAsMTIwLDUsMiwzNiwyNTUsMjU1LDY2LDQ4LAorCTE2LDAsMTYyLDE3NSwxLDEzMSwyLDYwLDE0OCwzMSw2NiwzNiwKKwkyMCwwLDE2MiwxNzUsMSwxMzEsMiw2MCwxMjgsMzEsNjYsMzYsCisJMjQsMCwxNjIsMTc1LDMyLDAsMTYyLDM5LDI4LDAsMTYyLDE3NSwKKwkxNjYsODUsMTkyLDEyLDMzLDQwLDk2LDAsMzIsMCwxNjIsMTQzLAorCTQwLDAsMTkxLDE0Myw0OCwwLDE4OSwzOSw4LDAsMjI0LDMsCisJMCwwLDAsMCwwLDAsMCwwLDg4LDAsMTMxLDE0OCwKKwk0LDAsMiwzNiw5LDAsOTgsMjAsMCwwLDAsMCwKKwkzMyw3MiwxOTIsOCwxMTYsMCwxMzIsMzYsMzMsMTYsNjksMCwKKwkxMjgsMTYsMiwwLDgsMCwxMzEsMTQwLDAsMCwwLDAsCisJNDYsNzIsMTkyLDgsMzMsMTYsNjcsMCwxMDQsMCwxMzIsMzYsCisJMTIsMCwxMjgsMTYsMzMsMTYsMCwwLDQsMCwxMzAsMTQwLAorCTAsMCwwLDAsNDIsMTYsMTYyLDAsMjQzLDI1NSw2NCwyMCwKKwkwLDE3LDUsMCw0LDAsMTMwLDE0MCwxMiwwLDEzMiwxNDAsCisJMCwwLDAsMCwyNDcsMjU1LDEyOCwyMCwzNSw0MCwxNjIsMCwKKwkzMywxNiwwLDAsOCwwLDIyNCwzLDAsMCwwLDAsCisJODgsMCwxMzEsMTQ4LDQsMCwyLDM2LDMsMCw5OCwyMCwKKwkzMyw0OCwwLDAsNTUsNzIsMTkyLDgsMTE2LDAsMTMyLDM2LAorCTEwNCwwLDEzMiwzNiw4LDAsMTMwLDE0MCwwLDAsMCwwLAorCTQzLDE2LDE2MiwwLDE0LDAsNjQsMTYsMjU1LDI1NSwyLDM2LAorCTkyLDcyLDE5Miw4LDAsMCwwLDAsMzUsMjQsMTYzLDAsCisJMCwxNywzLDAsMzUsMTYsNjcsMCwwLDI2LDIsMCwKKwkzMywxNiw2NywwLDAsMjgsMiwwLDMzLDE2LDY3LDAsCisJMzUsMTYsMiwwLDEzMSwxNiwyLDAsOTIsNzIsMTkyLDgsCisJMzMsMTYsMTk0LDAsMTgsMCwxMjgsMTYsMCwwLDAsMCwKKwk0LDAsMTMxLDE0MCwwLDAsMCwwLDAsMTcsMywwLAorCTMzLDE2LDY3LDAsMTI4LDE2LDIsMCw4LDAsMTMxLDE0MCwKKwkwLDAsMCwwLDMzLDE2LDY3LDAsNDMsMTYsMTYyLDAsCisJMjMzLDI1NSw2NCwyMCwwLDAsMCwwLDQsMCwxMzAsMTQwLAorCTEyLDAsMTMyLDE0MCwwLDAsMCwwLDI0MSwyNTUsMTI4LDIwLAorCTMzLDQ4LDE5NCwwLDI1NSwyNTUsMiwzNiw4LDAsMjI0LDMsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJOCwwLDEzMCwzNiwxNDQsMCwxNjMsMTQwLDEyMCwxMzIsMTM1LDM5LAorCTIsMCw5NiwxNiwyMCwwLDEzNywzNiwzMyw1Niw5NiwwLAorCTAsMCw3MiwxNDAsNCwwLDY4LDE0MCwxMzIsNzIsMTkyLDgsCisJMCwwLDAsMCwzMCwwLDAsMjUsMCwwLDAsMCwKKwk0LDAsMjI3LDE0MCwwLDAsMCwwLDQsMCw5OCwxNDAsCisJMCwwLDAsMCw1NSwwLDY0LDE2LDI1NSwyNTUsMiwzNiwKKwkwLDAsMTM1LDE0MCwwLDAsOTgsMTQwLDAsMCwwLDAsCisJOCwwLDcxLDE2LDAsMCwwLDAsOCwwLDk5LDM2LAorCTQsMCw5OCwxNDAsMCwwLDAsMCwyNDgsMjU1LDY0LDIwLAorCTI1NSwyNTUsMiwzNiwxNjgsNzIsMTkyLDgsMCwwLDAsMCwKKwkwLDAsMTMwLDE0MCwwLDAsMCwwLDQsMCwzNCwxNzMsCisJNCwwLDEwMywxNDAsMjU1LDI1NSw4LDM3LDQsMCwxMzIsMzYsCisJMCwwLDIyNiwxNDgsMCwwLDAsMCwxLDAsNjYsNDgsCisJMjI2LDI1NSw2NCwxNiwwLDAsMCwwLDAsMCwyMjYsMTQ4LAorCTAsMCwwLDAsNjQsMCw2Niw0OCwyNywwLDY0LDIwLAorCTI1NSwyNTUsMiwzNiwwLDAsMjI2LDE0OCwwLDAsMCwwLAorCTEsMCw2Niw0OCwxNywwLDY0LDE2LDAsMCwwLDAsCisJMTMsMCwxOTIsMTYsMSwwLDIsMzYsNjQsMCwxNjIsMTQwLAorCTAsMCwwLDAsOSwwLDY0LDIwLDEsMCwyLDM2LAorCTI4LDAsMjI2LDE0MCw0LDAsMTYzLDE0MCwwLDAsMCwwLAorCTM2LDE2LDY3LDAsMywwLDY0LDIwLDEsMCwyLDM2LAorCTE2OCw3MiwxOTIsOCwyNTUsMjU1LDIsMzYsMTY0LDcyLDE5Miw4LAorCTAsMCwzNCwxNjUsMCwwLDMyLDE2NSw4LDAsNDAsMTczLAorCTEyLDAsMzYsMTczLDE2LDAsMzksMTczLDMzLDE2LDAsMCwKKwk4LDAsMjI0LDMsMCwwLDAsMCwyMDAsMjU1LDE4OSwzOSwKKwk0OCwwLDE5MSwxNzUsNDQsMCwxNzksMTc1LDQwLDAsMTc4LDE3NSwKKwkzNiwwLDE3NywxNzUsMzIsMCwxNzYsMTc1LDMzLDE1MiwxMjgsMCwKKwkzMywxMjgsMTYwLDAsMzMsMTQ0LDE5MiwwLDAsMCw0LDE0MiwKKwkwLDAsMCwwLDQ4LDAsMTMwLDQwLDIsMCw2NCwxNiwKKwk4LDAsMTEzLDM4LDQ4LDAsNCwzNiwwLDAsMzYsMTc0LAorCTksNTAsMTkyLDEyLDEyOCwzMiw0LDAsMywwLDY0LDIwLAorCTQsMCwzNCwxNzQsMjE0LDcyLDE5Miw4LDI1NSwyNTUsMiwzNiwKKwkxNDQsMCw2NiwxNDIsMTIwLDEzMiwxMzIsMzksMiwwLDY0LDE2LAorCTAsMCwwLDAsMzMsMzIsNjQsMCwxNiwwLDE2MCwxNzUsCisJMjAsMCwxNzksMTc1LDI0LDAsMTc4LDE3NSwwLDAsNSwxNDIsCisJNCwwLDYsMTQyLDAsMCwwLDAsMjIxLDcyLDE5MiwxMiwKKwkzMyw1NiwzMiwyLDMzLDEyOCw2NCwwLDQsMCwwLDI2LAorCTAsMCwwLDAsMCwwLDM0LDE0MiwyMTQsNzIsMTkyLDgsCisJMCwwLDAsMCwxMTAsODYsMTkyLDEyLDMzLDMyLDMyLDIsCisJMzMsMTYsMCwyLDQ4LDAsMTkxLDE0Myw0NCwwLDE3OSwxNDMsCisJNDAsMCwxNzgsMTQzLDM2LDAsMTc3LDE0MywzMiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDU2LDAsMTg5LDM5LDE4NCwyNTUsMTg5LDM5LAorCTY4LDAsMTkxLDE3NSw2NCwwLDE5MCwxNzUsNjAsMCwxODMsMTc1LAorCTU2LDAsMTgyLDE3NSw1MiwwLDE4MSwxNzUsNDgsMCwxODAsMTc1LAorCTQ0LDAsMTc5LDE3NSw0MCwwLDE3OCwxNzUsMzYsMCwxNzcsMTc1LAorCTMyLDAsMTc2LDE3NSwzMywxNDQsMTI4LDAsMzMsMTc2LDE2MCwwLAorCTMzLDEzNiwyMjQsMCw4OCwwLDE4MywxNDMsOTIsMCwxNzksMTQzLAorCTk2LDAsMTkwLDE0MywzMiwwLDIyNiwzOCwwLDAsMzYsMTQyLAorCTAsMCwwLDAsNDIsMTYsMTMwLDAsMjIsMCw2NCwxNiwKKwkzMywxNjAsMTkyLDAsNCwwLDEzMiwzNiw5LDUwLDE5MiwxMiwKKwkxMjgsMzIsNCwwLDMzLDEyOCw2NCwwLDMsMCwwLDIyLAorCTMzLDMyLDAsMiwxNTMsNzMsMTkyLDgsMjU1LDI1NSwyLDM2LAorCTAsMCwzOCwxNDIsNCwwLDM3LDE0MiwwLDAsMCwwLAorCTgwLDY4LDE5MiwxMiwxMjgsNDgsNiwwLDQsMCwzNiwxNDIsCisJNjEsNTAsMTkyLDEyLDAsMCwwLDAsNCwwLDQ4LDE3NCwKKwkwLDAsMzQsMTQyLDAsMCwwLDAsNCwwLDY2LDM2LAorCTAsMCwzNCwxNzQsMCwwLDY2LDE1MCwwLDAsMCwwLAorCTEsMCw2Niw0OCw5NiwwLDY0LDIwLDAsMCwwLDAsCisJMzMsMCwxOTIsMzAsMCwwLDAsMCw0LDAsODAsMTQyLAorCTAsMCwwLDAsNCwwLDIsMTQyLDAsMCwwLDAsCisJMTA4LDAsNjQsMTYsMTI4LDE2MCwyMywwLDEsMCwyNDIsMzgsCisJNCwwLDM0LDE0MiwwLDAsMCwwLDMzLDE2LDEzMCwyLAorCTAsMCwzLDE0MiwwLDAsMCwwLDAsMCw2NywxNzIsCisJMCwwLDIsMTQyLDAsMCwwLDAsMjQsMCw5OCwxNzQsCisJMTYsMCwxNzgsMTc1LDIwLDAsMTc5LDE3NSwyNCwwLDE5MCwxNzUsCisJNCwwLDQsMTQyLDMzLDQwLDAsMCwzMyw0OCwwLDAsCisJMjIxLDcyLDE5MiwxMiwzMyw1NiwzMiwyLDExMiwwLDY0LDIwLAorCTgsMCwxNiwzOCw0LDAsMiwxNDIsMCwwLDAsMCwKKwkyMzQsMjU1LDY0LDIwLDMzLDE2LDAsMCwxNTMsNzMsMTkyLDgsCisJMCwwLDAsMCw0LDAsODAsMTQyLDAsMCwwLDAsCisJNCwwLDIsMTQyLDAsMCwwLDAsNzYsMCw2NCwxNiwKKwkxMjgsMTY4LDIzLDAsMSwwLDI0MiwzOCwwLDAsMywxNDIsCisJMCwwLDEzMiwxNDIsMCwwLDAsMCw0MywxNiwxMDAsMCwKKwk0MiwwLDY0LDIwLDAsMCwwLDAsMTksMCwxMDAsMjAsCisJMjU1LDI1NSwxOTcsMzgsNCwwLDM0LDE0MiwwLDAsMCwwLAorCTMzLDE2LDE2MiwyLDAsMCw2NywxNzIsMCwwLDIsMTQyLAorCTAsMCwwLDAsMjQsMCw5OCwxNzQsMTYsMCwxNzgsMTc1LAorCTIwLDAsMTc5LDE3NSwyNCwwLDE5MCwxNzUsNCwwLDQsMTQyLAorCTQsMCwxMzQsMzgsMjIxLDcyLDE5MiwxMiwzMyw1NiwzMiwyLAorCTI1LDAsNjQsMTYsOCwwLDE2LDM4LDE1Myw3MywxOTIsOCwKKwkwLDAsMCwwLDAsMCwxMzAsMTQyLDAsMCwwLDAsCisJNDMsMTYsNjcsMCwxNywwLDY0LDE2LDMzLDQwLDAsMCwKKwk0LDAsMzQsMTQyLDAsMCwwLDAsMzMsMTYsMTYyLDIsCisJMCwwLDY3LDE3MiwwLDAsMiwxNDIsMCwwLDAsMCwKKwkyNCwwLDk4LDE3NCwxNiwwLDE3OCwxNzUsMjAsMCwxNzksMTc1LAorCTI0LDAsMTkwLDE3NSw0LDAsNCwxNDIsMzMsNDgsMCwwLAorCTIyMSw3MiwxOTIsMTIsMzMsNTYsMzIsMiw1MiwwLDY0LDIwLAorCTAsMCwwLDAsOCwwLDE2LDM4LDQsMCwyLDE0MiwKKwkwLDAsMCwwLDIwNSwyNTUsNjQsMjAsMzMsMTYsMCwwLAorCTE1Myw3MywxOTIsOCwwLDAsMCwwLDAsMCw2NiwxNTAsCisJMCwwLDAsMCw2NCwwLDY2LDQ4LDQwLDAsNjQsMjAsCisJMzMsMTYsMCwwLDMsMCw2NiwxNDYsMCwwLDAsMCwKKwkxLDAsNjYsNDgsMTEsMCw2NCwxNiwzMywyNCw2NCwyLAorCTY0LDAsMTk0LDE0MywwLDAsMCwwLDksMCw2NCwyMCwKKwkwLDAsMCwwLDI4LDAsOTgsMTQwLDQsMCwxOTUsMTQzLAorCTAsMCwwLDAsMzYsMTYsNjcsMCwzLDAsNjQsMjAsCisJMCwwLDAsMCwxNTMsNzMsMTkyLDgsMzMsMTYsMCwwLAorCTE0LDAsMTkyLDI2LDMzLDE2LDI0NiwyLDAsMCwzNCwxNzQsCisJNCwwLDM2LDE0MiwxMjgsMTI4LDIzLDAsMzMsMzIsNCwyLAorCTMzLDQwLDEyOCwyLDgwLDY4LDE5MiwxMiwxMjgsNDgsMjIsMCwKKwkyOCwwLDExOCwxNzQsNCwwLDM0LDE0MiwwLDAsMCwwLAorCTMzLDEyOCwyLDIsMTQ5LDczLDE5Miw4LDMyLDAsMTEyLDE3NCwKKwkwLDAsNTUsMTc0LDI4LDAsOTYsMTc0LDMyLDAsOTYsMTc0LAorCTM2LDAsMTE0LDE3NCwxLDAsMiwzNiwyMCwwLDk4LDE2NiwKKwkxLDAsMiwzNiw2OCwwLDE5MSwxNDMsNjQsMCwxOTAsMTQzLAorCTYwLDAsMTgzLDE0Myw1NiwwLDE4MiwxNDMsNTIsMCwxODEsMTQzLAorCTQ4LDAsMTgwLDE0Myw0NCwwLDE3OSwxNDMsNDAsMCwxNzgsMTQzLAorCTM2LDAsMTc3LDE0MywzMiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTcyLDAsMTg5LDM5LDMsMCwxNjAsMjgsMzMsMTYsMCwwLAorCTAsMCwyMjQsMTcyLDEsMCwyLDM2LDgsMCwyMjQsMywKKwkwLDAsMCwwLDIwOCwyNTUsMTg5LDM5LDQ0LDAsMTkxLDE3NSwKKwk0MCwwLDE3OCwxNzUsMzYsMCwxNzcsMTc1LDMyLDAsMTc2LDE3NSwKKwkzMywxNDQsMTI4LDAsMzMsMTM2LDIyNCwwLDY0LDAsMTc2LDE0MywKKwkwLDAsMCwwLDYsMCwxNjAsMjQsMjQsMCwxNjAsMTc1LAorCTE3LDAsMiwxNDYsMCwwLDAsMCwxOCwwLDY2LDUyLAorCTIwMCw3MywxOTIsOCwxNywwLDIsMTYyLDMzLDMyLDMyLDIsCisJMzMsNDAsMCwyLDEsMCw2LDM2LDI1Myw3NiwxOTIsMTIsCisJMjQsMCwxNjcsMzksMzYsMCwyLDE0MiwxNiwwLDE3NiwxNzUsCisJOCwwLDY2LDE0MCwzMywzMiw2NCwyLDEsMCw1LDM2LAorCTI0LDAsMTY2LDM5LDksMjQ4LDY0LDAsMzMsNTYsMzIsMiwKKwk0NCwwLDE5MSwxNDMsNDAsMCwxNzgsMTQzLDM2LDAsMTc3LDE0MywKKwkzMiwwLDE3NiwxNDMsOCwwLDIyNCwzLDQ4LDAsMTg5LDM5LAorCTIyNCwyNTUsMTg5LDM5LDI4LDAsMTkxLDE3NSwyNCwwLDE3OCwxNzUsCisJMjAsMCwxNzcsMTc1LDMzLDE0NCwxMjgsMCwzMywxMzYsMTYwLDAsCisJMzEsMCw4MSwxOCwxNiwwLDE3NiwxNzUsNCwwLDgwLDE0MiwKKwkwLDAsMCwwLDQsMCwyLDE0MiwwLDAsMCwwLAorCTEwLDAsNjQsMTYsMCwwLDAsMCw0LDAsNCwxNDIsCisJMCwwLDAsMCwyMDYsNzMsMTkyLDEyLDMzLDQwLDMyLDIsCisJOCwwLDE2LDM4LDQsMCwyLDE0MiwwLDAsMCwwLAorCTI0OCwyNTUsNjQsMjAsMCwwLDAsMCwwLDAsNjYsMTUwLAorCTAsMCwwLDAsMzIsMCw2Niw0OCw0LDAsNjQsMTYsCisJMCwwLDAsMCw0LDAsNjgsMTQyLDYxLDUwLDE5MiwxMiwKKwkwLDAsMCwwLDAsMCw2NiwxNTAsMCwwLDAsMCwKKwkxNiwwLDY2LDQ4LDMsMCw2NCwxNiwwLDAsMCwwLAorCTYxLDUwLDE5MiwxMiwzMywzMiw2NCwyLDI4LDAsMTkxLDE0MywKKwkyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMzIsMCwxODksMzksMTIwLDEzMiwxMzEsMzksCisJMiwwLDEyOCwxNiwwLDAsMCwwLDMzLDI0LDEyOCwwLAorCTAsMCwxNjcsMTQwLDQsMCwxNjUsMTQwLDI2LDc0LDE5Miw4LAorCTAsMCwwLDAsMjgsMCwyMjQsMjQsMCwwLDAsMCwKKwk0LDAsOTksMTQwLDAsMCwwLDAsNCwwLDk4LDE0MCwKKwkwLDAsMCwwLDExLDAsNjQsMTYsMCwwLDAsMCwKKwkwLDAsMTY0LDE0MCwwLDAsOTgsMTQwLDAsMCwwLDAsCisJOSwwLDY4LDE2LDAsMCwwLDAsOCwwLDk5LDM2LAorCTQsMCw5OCwxNDAsMCwwLDAsMCwyNDgsMjU1LDY0LDIwLAorCTAsMCwwLDAsMCwwLDE5MiwxNzIsMzMsNzQsMTkyLDgsCisJMiwwLDIsMzYsNCwwLDk5LDE0MCwyNTUsMjU1LDIzMSwzNiwKKwk0LDAsMTY1LDM2LDAsMCw5OCwxNDgsMCwwLDAsMCwKKwkxLDAsNjYsNDgsMjI4LDI1NSw2NCwxNiwwLDAsMCwwLAorCTAsMCwxOTUsMTcyLDQyLDE2LDcsMCw4LDAsMjI0LDMsCisJMCwwLDAsMCwyMDgsMjU1LDE4OSwzOSw0NCwwLDE5MSwxNzUsCisJNDAsMCwxODIsMTc1LDM2LDAsMTgxLDE3NSwzMiwwLDE4MCwxNzUsCisJMjgsMCwxNzksMTc1LDI0LDAsMTc4LDE3NSwyMCwwLDE3NywxNzUsCisJMTYsMCwxNzYsMTc1LDMzLDE2OCwxOTIsMCwwLDAsMTYyLDE0MCwKKwkwLDAsMCwwLDMsMCw2NCwyOCwzMyw0OCwwLDAsCisJMjIwLDc0LDE5Miw4LDUsMCwyLDM2LDEyMCwxMzIsMTQ3LDM5LAorCTIsMCwxMjgsMTYsMCwwLDIyNCwxNzIsMzMsMTUyLDEyOCwwLAorCTAsMCwxNzcsMTQwLDQsMCwxODAsMTQwLDg0LDc0LDE5Miw4LAorCTAsMCwwLDAsMjksMCwzMiwyNiwwLDAsMCwwLAorCTQsMCwxMDIsMTQyLDAsMCwwLDAsNCwwLDE5NCwxNDAsCisJMCwwLDAsMCwyMywwLDY0LDE2LDAsMCwwLDAsCisJMCwwLDEzMSwxNDIsMCwwLDE5NCwxNDAsMCwwLDAsMCwKKwk2LDAsNjcsMTYsMCwwLDAsMCw4LDAsMTk4LDM2LAorCTQsMCwxOTQsMTQwLDAsMCwwLDAsMjQ4LDI1NSw2NCwyMCwKKwkwLDAsMCwwLDQsMCwxOTQsMTQwLDAsMCwwLDAsCisJOSwwLDY0LDE2LDAsMCwwLDAsMjU1LDI1NSw0OSwzOCwKKwk0LDAsMTQ4LDM4LDMzLDE1Miw2NCwwLDAsMCw5OCwxNTAsCisJMCwwLDAsMCwxLDAsNjYsNDgsMjI3LDI1NSw2NCwxNiwKKwkwLDAsMCwwLDI5LDAsMzIsMjIsMCwwLDAsMCwKKwkwLDAsOTksMTUwLDAsMCwwLDAsMSwwLDk4LDQ4LAorCTExLDAsNjQsMTYsNCwwLDk4LDQ4LDEyMywwLDY0LDE2LAorCTMsMCwyLDM2LDAsMCwxNjIsMTUwLDAsMCwwLDAsCisJMSwwLDY2LDQ4LDExOCwwLDY0LDE2LDQsMCwyLDM2LAorCTAsMCwyNDMsMTcyLDIxOSw3NCwxOTIsOCw0LDAsMjEzLDE3MiwKKwkwLDAsOTgsMTUwLDAsMCwwLDAsNCwwLDY2LDQ4LAorCTExMCwwLDY0LDE2LDMsMCwyLDM2LDAsMCwxNjIsMTUwLAorCTAsMCwwLDAsMSwwLDY2LDQ4LDEwNSwwLDY0LDIwLAorCTQsMCwyLDM2LDAsMCwyNDMsMTcyLDIxOSw3NCwxOTIsOCwKKwk0LDAsMjEzLDE3MiwwLDAsOTgsMTUwLDAsMCwwLDAsCisJMSwwLDY2LDQ4LDk3LDAsNjQsMjAsMiwwLDIsMzYsCisJMiwwLDM0LDQyLDIzLDAsNjQsMjAsMzMsMTQ0LDE2MCwyLAorCTU2LDAsMjIsMzYsOSw1MCwxOTIsMTIsMTYsMCw0LDM2LAorCTMzLDEyOCw2NCwwLDQwLDAsMCwxOCwxMjgsMTYsMTcsMCwKKwkzMywxNiw4NCwwLDI1MiwyNTUsNjYsMTQwLDAsMCwwLDAsCisJMCwwLDIsMTc0LDQsMCwxOCwxNzQsOCwwLDAsMTc0LAorCTEyLDAsMCwxNzQsOSw1MCwxOTIsMTIsOCwwLDQsMzYsCisJMzMsMTQ0LDY0LDAsMjQsMCw2NCwxOCwyNTUsMjU1LDQ5LDM4LAorCTAsMCw4NiwxNjYsMiwwLDM0LDQyLDIzNiwyNTUsNjQsMTYsCisJNCwwLDgwLDE3NCw0LDAsMTAyLDE0MiwwLDAsMCwwLAorCTQsMCwxOTQsMTQwLDAsMCwwLDAsNiwwLDY0LDE2LAorCTEsMCwxNywzNiw4LDAsMTk4LDM2LDQsMCwxOTQsMTQwLAorCTAsMCwwLDAsMjUyLDI1NSw2NCwyMCwxLDAsNDksMzgsCisJMSwwLDM2LDM4LDksNTAsMTkyLDEyLDE5MiwzMiw0LDAsCisJMzMsMTI4LDY0LDAsMTIsMCwwLDIyLDMzLDMyLDY0LDIsCisJMTczLDc0LDE5Miw4LDAsMCwwLDAsMCwwLDE4LDE0MiwKKwkwLDAsMCwwLDYxLDUwLDE5MiwxMiwzMywzMiwwLDIsCisJMzMsMzIsNjQsMiwyMDYsNzMsMTkyLDEyLDMzLDQwLDE2MCwyLAorCTIyMCw3NCwxOTIsOCwxLDAsMiwzNiw0LDAsMTAyLDE0MiwKKwkwLDAsMCwwLDE5Miw3NCwxOTIsOCwzMywxNjgsMCwyLAorCTQsMCwxOTQsMTQwLDAsMCwwLDAsMTQsMCw2NCwxNiwKKwkwLDAsMCwwLDAsMCwxOTQsMTQwLDQsMCwxOTUsMTQwLAorCTAsMCwyLDE3NCw0LDAsMywxNzQsOCwwLDE5OCwzNiwKKwk4LDAsMTYsMzgsMjU1LDI1NSw0OSwzOCwwLDAsMTk0LDE0MCwKKwkwLDAsMTMxLDE0MiwwLDAsMCwwLDQzLDE2LDY3LDAsCisJMjQwLDI1NSw2NCwyMCwwLDAsMCwwLDAsMCwxMzAsMTQyLAorCTAsMCwwLDAsMCwwLDIsMTc0LDQsMCwxOCwxNzQsCisJOCwwLDQsMzgsMzMsNDAsMTkyLDAsODAsNjgsMTkyLDEyLAorCTE5Miw0OCwxNywwLDQsMCwxMDIsMTQyLDQsMCwxMTcsMTc0LAorCTAsMCw5OCwxNTAsMCwwLDAsMCwzMiwwLDY2LDQ4LAorCTMsMCw2NCwxNiwwLDAsMCwwLDYxLDUwLDE5MiwxMiwKKwkzMywzMiwxOTIsMCwwLDAsOTgsMTUwLDAsMCwwLDAsCisJMzIsMCw2Niw1MiwwLDAsOTgsMTY2LDMzLDE2LDAsMCwKKwk0NCwwLDE5MSwxNDMsNDAsMCwxODIsMTQzLDM2LDAsMTgxLDE0MywKKwkzMiwwLDE4MCwxNDMsMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk0OCwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwyMCwwLDE5MSwxNzUsCisJMTYsMCwxNzYsMTc1LDAsMCwxNjIsMTQwLDAsMCwwLDAsCisJODUsMCw2NCwyNCwzMywxNiwwLDAsMTIwLDEzMiwxNDQsMzksCisJMiwwLDEyOCwxNiwwLDAsMCwwLDMzLDEyOCwxMjgsMCwKKwkwLDAsMTY0LDE0MCw0LDAsMTY1LDE0MCwwLDAsMCwwLAorCTAsMCwxNjgsMTQwLDAsMCwyLDE1MCwwLDAsMCwwLAorCTMzLDI0LDY0LDAsMSwwLDY2LDQ4LDM0LDAsNjQsMjAsCisJMzMsNTYsMCwyLDMyLDAsMTI4LDI0LDgsMCw5OCw0OCwKKwk0LDAsNiwxNDIsNSwwLDY0LDE2LDAsMCwwLDAsCisJMTIsMCwxOTQsMTQwLDAsMCwwLDAsMywwLDY0LDE2LAorCTAsMCwwLDAsMzMsNTYsMCwyLDAsMCwxNjgsMTQwLAorCTAsMCwxOTUsMTQwLDAsMCwxNjIsMTQwLDAsMCwwLDAsCisJMTAsMCw5OCwxNiwwLDAsMCwwLDAsMCwxNjMsMTQwLAorCTQsMCwxOTQsMTQwLDAsMCwwLDAsMjAsMCw2NCwxNiwKKwk4LDAsMTk4LDM2LDAsMCwxOTQsMTQwLDAsMCwwLDAsCisJMjQ5LDI1NSw2NywyMCwwLDAsMCwwLDI1NSwyNTUsMTMyLDM2LAorCTQsMCwyMDgsMTQwLDAsMCwwLDAsMCwwLDMsMTUwLAorCTAsMCwwLDAsMSwwLDk4LDQ4LDIyNCwyNTUsNjQsMTYsCisJNCwwLDE2NSwzNiwzNiwwLDEyOCwyMCwzMywxNiwwLDAsCisJMCwwLDIsMTUwLDAsMCwwLDAsMiwwLDY2LDQ4LAorCTMsMCw2NCwyMCwwLDAsMCwwLDY1LDc1LDE5Miw4LAorCTMzLDE2LDAsMCw0LDAsMjMwLDE0MCwwLDAsMCwwLAorCTAsMCwxOTQsMTQwLDAsMCwwLDAsNywwLDcyLDE2LAorCTAsMCwwLDAsOCwwLDE5OCwzNiwwLDAsMTk0LDE0MCwKKwkwLDAsMCwwLDI1MywyNTUsNzIsMjAsOCwwLDE5OCwzNiwKKwkyNDgsMjU1LDE5OCwzNiw0LDAsMTk5LDE0MCwwLDAsMCwwLAorCTEwLDAsMjI0LDE2LDMzLDMyLDIyNCwwLDgsMCwxOTQsMTQwLAorCTEyLDAsMTk1LDE0MCwwLDAsMTk0LDE3Miw0LDAsMTk1LDE3MiwKKwk4LDAsMTk4LDM2LDQsMCwxOTQsMTQwLDAsMCwwLDAsCisJMjQ4LDI1NSw2NCwyMCwzMywzMiwyMjQsMCwyMDYsNzMsMTkyLDEyLAorCTMzLDQwLDAsMiwzMywxNiwwLDIsMjAsMCwxOTEsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMjQsMCwxODksMzksCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMTkyLDI1NSwxODksMzksNTYsMCwxOTEsMTc1LDUyLDAsMTgxLDE3NSwKKwk0OCwwLDE4MCwxNzUsNDQsMCwxNzksMTc1LDQwLDAsMTc4LDE3NSwKKwkzNiwwLDE3NywxNzUsMzIsMCwxNzYsMTc1LDMzLDEzNiwxMjgsMCwKKwkzMywxNDQsMTYwLDAsMzMsMTUyLDE5MiwwLDMzLDE2MCwyMjQsMCwKKwk4MCwwLDE4MSwxNDMsMCwwLDAsMCwzNiwwLDE2MiwxNDIsCisJMCwwLDAsMCwyMCwwLDgwLDE0MCwzMywzMiwxMjgsMiwKKwk0OCw3MiwxOTIsMTIsMzMsNDAsMTYwLDIsMTYsMCwzLDE0MiwKKwkwLDAsMCwwLDE2LDAsMTYzLDE3NSwyMCwwLDE4MCwxNzUsCisJMjQsMCwxNjIsMTc1LDAsMCwyLDE0MiwxLDAsNCwzNiwKKwkzMyw0MCwzMiwyLDMzLDQ4LDY0LDIsOSwyNDgsNjQsMCwKKwkzMyw1Niw5NiwyLDYsMCw2NCwyMCwzMywzMiwxMjgsMiwKKwkxNywwLDE2MiwxNDYsMCwwLDAsMCwxLDAsNjYsNTIsCisJMTEzLDc1LDE5Miw4LDE3LDAsMTYyLDE2MiwzMyw0MCwxNjAsMiwKKwk1OSw3NywxOTIsMTIsMzMsNDgsNjQsMCw1NiwwLDE5MSwxNDMsCisJNTIsMCwxODEsMTQzLDQ4LDAsMTgwLDE0Myw0NCwwLDE3OSwxNDMsCisJNDAsMCwxNzgsMTQzLDM2LDAsMTc3LDE0MywzMiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDY0LDAsMTg5LDM5LDE5MiwyNTUsMTg5LDM5LAorCTYwLDAsMTkxLDE3NSw1NiwwLDE3OCwxNzUsNTIsMCwxNzcsMTc1LAorCTQ4LDAsMTc2LDE3NSwzMywxMzYsMjI0LDAsODAsMCwxNzgsMTQzLAorCTM2LDAsMTYwLDE3NSwzNiwwLDY2LDE0MiwwLDAsMCwwLAorCTIwLDAsNjcsMTQwLDIsMCw4MCwxNDQsMCwwLDAsMCwKKwkyNTUsMCwyLDUwLDI1NCwyNTUsNzEsMzYsNzAsMCwyMjYsNDQsCisJMTEwLDAsNjQsMTYsMTI4LDE2LDcsMCwyLDEzMSwxLDYwLAorCTMzLDgsMzQsMCwxNjAsMTUxLDM0LDE0MCwwLDAsMCwwLAorCTgsMCw2NCwwLDAsMCwwLDAsMTYsMCwxNzcsMTc1LAorCTgsMCw5OCwxNDAsMTYsMCwxMDMsMTQwLDksMjQ4LDY0LDAsCisJMCwwLDAsMCwyLDAsMywzNiwxNiwwLDY3LDE2MiwKKwkyNTEsNzUsMTkyLDgsNDAsMCw2NiwxNzQsMTYsMCwxNzcsMTc1LAorCTgsMCw5OCwxNDAsMTYsMCwxMDMsMTQwLDksMjQ4LDY0LDAsCisJMCwwLDAsMCw0MCwwLDE2MiwxNzUsMTYsMCw4MCwxNjIsCisJNDAsMCwxNjIsMTQzLDAsMCwwLDAsMjUxLDc1LDE5Miw4LAorCTQwLDAsNjYsMTc0LDMyLDAsMTYyLDM5LDE2LDAsMTYyLDE3NSwKKwkyMCwwLDE3NywxNzUsMzYsMCwxNjIsMzksMjQsMCwxNjIsMTc1LAorCTgsMCw5OCwxNDAsMTYsMCwxMDMsMTQwLDksMjQ4LDY0LDAsCisJMCwwLDAsMCwzMyw0OCw2NCwwLDE2LDAsODAsMTYyLAorCTE3LDAsNjYsMTQ2LDAsMCwwLDAsMiwwLDY2LDUyLAorCTE3LDAsNjYsMTYyLDM2LDAsMTYyLDE0MywwLDAsMCwwLAorCTQzLDE2LDIsMCw0MCwwLDY2LDE2Niw0NCwwLDcwLDE3NCwKKwkzMiwwLDE2MiwxNTEsMCwwLDAsMCwzMywxNiwxOTQsMCwKKwk0OCwwLDY2LDE3NCwyNTUsNzUsMTkyLDgsNTIsMCw2NCwxNjYsCisJMTYsMCwxNzcsMTc1LDM2LDAsMTYyLDM5LDIwLDAsMTYyLDE3NSwKKwk4LDAsOTgsMTQwLDE2LDAsMTAzLDE0MCw5LDI0OCw2NCwwLAorCTAsMCwwLDAsMzMsMTI4LDY0LDAsOCwwLDAsMjIsCisJMzMsMzIsMzIsMiwxNiwwLDE2MCwxNzUsMzMsNDAsNjQsMiwKKwkzMyw0OCwwLDAsMjI2LDc2LDE5MiwxMiwzMyw1NiwwLDAsCisJMjU1LDc1LDE5Miw4LDAsMCwwLDAsMzYsMCwxNjIsMTQzLAorCTAsMCwwLDAsMTYsMCwxNjIsMTc1LDAsMCw2LDE0MiwKKwk0LDAsNywxNDIsMCwwLDAsMCwyMjYsNzYsMTkyLDEyLAorCTMzLDQwLDY0LDIsMzYsMCwxNjIsMTQzLDAsMCwwLDAsCisJMzUsMCw2NCwxNiwwLDAsMCwwLDYxLDUwLDE5MiwxMiwKKwkzMywzMiwwLDIsMjU1LDc1LDE5Miw4LDAsMCwwLDAsCisJNSwwLDIsMzYsMjUxLDc1LDE5Miw4LDE2LDAsNjYsMTYyLAorCTE2LDAsMTc3LDE3NSw0MCwwLDE2MiwzOSwyMCwwLDE2MiwxNzUsCisJOCwwLDk4LDE0MCwxNiwwLDEwMywxNDAsOSwyNDgsNjQsMCwKKwkwLDAsMCwwLDMzLDQ4LDY0LDAsNywwLDE5MiwxNiwKKwk2NCwwLDIsMzYsMywwLDE5NCwxMzYsMCwwLDE5NCwxNTIsCisJMCwwLDAsMCw0MywwLDE2MiwxNzEsNDAsMCwxNjIsMTg3LAorCTY0LDAsMiwzNiwxNiwwLDY2LDE2Miw0MCwwLDE2MiwxNDMsCisJMCwwLDAsMCwyNTEsNzUsMTkyLDgsNDAsMCw2NiwxNzQsCisJNSwwLDIsMzYsOTYsMCwzNCwxNzQsMTcsMCw2NiwxNDYsCisJMCwwLDAsMCwyLDAsNjYsNTIsMTcsMCw2NiwxNjIsCisJNjAsMCwxOTEsMTQzLDU2LDAsMTc4LDE0Myw1MiwwLDE3NywxNDMsCisJNDgsMCwxNzYsMTQzLDgsMCwyMjQsMyw2NCwwLDE4OSwzOSwKKwk4MCwyNTUsMTg5LDM5LDE2OCwwLDE5MSwxNzUsMTY0LDAsMTc5LDE3NSwKKwkxNjAsMCwxNzgsMTc1LDE1NiwwLDE3NywxNzUsMTUyLDAsMTc2LDE3NSwKKwkzMywxNTIsMTI4LDAsMzMsMTM2LDIyNCwwLDE5MiwwLDE3OCwxNDMsCisJMCwwLDAsMCwzNiwwLDY2LDE0MiwwLDAsMCwwLAorCTIwLDAsNjcsMTQwLDAsMCwwLDAsMTYsMCw5OCwxNDAsCisJMCwwLDAsMCwxNiwwLDE2MiwxNzUsMjAsMCwxNzcsMTc1LAorCTQsMCw5OCwxNDAsMCwwLDAsMCw5LDI0OCw2NCwwLAorCTI0LDAsMTY3LDM5LDMzLDEyOCw2NCwwLDYsMCwwLDIyLAorCTMzLDMyLDMyLDIsMTcsMCw2NiwxNDYsMCwwLDAsMCwKKwkxOCwwLDY2LDUyLDQ1LDc2LDE5Miw4LDE3LDAsNjYsMTYyLAorCTMzLDQwLDY0LDIsMzMsNDgsMCwyLDI1Myw3NiwxOTIsMTIsCisJMjQsMCwxNjcsMzksMTYsMCwxNzgsMTc1LDMzLDMyLDk2LDIsCisJMzMsNDAsMCwyLDI0LDAsMTY2LDM5LDEyMiw3NSwxOTIsMTIsCisJMzMsNTYsMzIsMiwxNjgsMCwxOTEsMTQzLDE2NCwwLDE3OSwxNDMsCisJMTYwLDAsMTc4LDE0MywxNTYsMCwxNzcsMTQzLDE1MiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDE3NiwwLDE4OSwzOSwxOTIsMjU1LDE4OSwzOSwKKwk1NiwwLDE5MSwxNzUsNTIsMCwxODEsMTc1LDQ4LDAsMTgwLDE3NSwKKwk0NCwwLDE3OSwxNzUsNDAsMCwxNzgsMTc1LDM2LDAsMTc3LDE3NSwKKwkzMiwwLDE3NiwxNzUsMzMsMTUyLDEyOCwwLDMzLDE2MCwxNjAsMCwKKwkzMywxNjgsMTkyLDAsMzMsMTM2LDIyNCwwLDgwLDAsMTc4LDE0MywKKwkwLDAsMCwwLDM2LDAsNjYsMTQyLDAsMCwwLDAsCisJMjAsMCw4MCwxNDAsMzMsMzIsMzIsMiw0OCw3MiwxOTIsMTIsCisJMzMsNDAsNjQsMiwxNiwwLDMsMTQyLDAsMCwwLDAsCisJMTYsMCwxNjMsMTc1LDIwLDAsMTc3LDE3NSwyNCwwLDE2MiwxNzUsCisJMCwwLDIsMTQyLDMzLDMyLDAsMCwzMyw0MCw5NiwyLAorCTMzLDQ4LDEyOCwyLDksMjQ4LDY0LDAsMzMsNTYsMTYwLDIsCisJNSwwLDY0LDE2LDMzLDMyLDMyLDIsMjAwLDc2LDE5MiwxMiwKKwkzMyw0MCw2NCwyLDk1LDc2LDE5Miw4LDAsMCwwLDAsCisJMTYsMCwxNzgsMTc1LDMzLDMyLDk2LDIsMzMsNDAsMTI4LDIsCisJMzMsNDgsMTYwLDIsMTIyLDc1LDE5MiwxMiwzMyw1NiwzMiwyLAorCTU2LDAsMTkxLDE0Myw1MiwwLDE4MSwxNDMsNDgsMCwxODAsMTQzLAorCTQ0LDAsMTc5LDE0Myw0MCwwLDE3OCwxNDMsMzYsMCwxNzcsMTQzLAorCTMyLDAsMTc2LDE0Myw4LDAsMjI0LDMsNjQsMCwxODksMzksCisJMTkyLDI1NSwxODksMzksNTYsMCwxOTEsMTc1LDUyLDAsMTgxLDE3NSwKKwk0OCwwLDE4MCwxNzUsNDQsMCwxNzksMTc1LDQwLDAsMTc4LDE3NSwKKwkzNiwwLDE3NywxNzUsMzIsMCwxNzYsMTc1LDMzLDE1MiwxMjgsMCwKKwkzMywxNjAsMTYwLDAsMzMsMTY4LDE5MiwwLDgwLDAsMTc3LDE0MywKKwkwLDAsMCwwLDM2LDAsMzQsMTQyLDAsMCwwLDAsCisJMjAsMCw4MiwxNDAsMiwwLDY2LDE0NCwwLDAsMCwwLAorCTI1NCwyNTUsNjcsMzYsNzAsMCw5OCw0NCw1NywwLDY0LDE2LAorCTMzLDEyOCwyMjQsMCwxMjgsMTYsMywwLDIsMTMxLDEsNjAsCisJMzMsOCwzNCwwLDE4NCwxNTIsMzQsMTQwLDAsMCwwLDAsCisJOCwwLDY0LDAsMCwwLDAsMCwzMywzMiwwLDIsCisJNDgsNzIsMTkyLDEyLDMzLDQwLDMyLDIsNDAsMCwzNSwxNDIsCisJMCwwLDAsMCwxNiwwLDE2MywxNzUsMjAsMCwxNzYsMTc1LAorCTE3Myw3NiwxOTIsOCwyNCwwLDE2MiwxNzUsMzMsMzIsMCwyLAorCTQ4LDcyLDE5MiwxMiwzMyw0MCwzMiwyLDQ0LDAsMzUsMTQyLAorCTAsMCwwLDAsMTYsMCwxNjMsMTc1LDQ4LDAsMzUsMTQyLAorCTQ0LDAsMzYsMTQyLDAsMCwwLDAsMzUsMjQsMTAwLDAsCisJMTcwLDc2LDE5Miw4LDI1NSwyNTUsOTksNDgsMzMsMzIsMCwyLAorCTQ4LDcyLDE5MiwxMiwzMyw0MCwzMiwyLDQwLDAsMzUsMTQyLAorCTAsMCwwLDAsMTYsMCwxNjMsMTc1LDQ0LDAsMzUsMTQyLAorCTAsMCwwLDAsMTcxLDc2LDE5Miw4LDIwLDAsMTYzLDE3NSwKKwkzMywzMiwwLDIsNDgsNzIsMTkyLDEyLDMzLDQwLDMyLDIsCisJNDAsMCwzNSwzOCwxNiwwLDE2MywxNzUsNCwwLDMsMzYsCisJMjAsMCwxNjMsMTc1LDI0LDAsMTc2LDE3NSwyOCwwLDE2MiwxNzUsCisJMTIsMCw2NiwxNDIsMzMsMzIsOTYsMiwzMyw0MCwxMjgsMiwKKwkxNiwwLDcxLDE0MiwwLDAsMCwwLDksMjQ4LDY0LDAsCisJMzMsNDgsMTYwLDIsMTg0LDc2LDE5Miw4LDAsMCwwLDAsCisJNSwwLDIsMzYsOTYsMCwyLDE3NCwxNywwLDM0LDE0NiwKKwkwLDAsMCwwLDIsMCw2Niw1MiwxNywwLDM0LDE2MiwKKwk1NiwwLDE5MSwxNDMsNTIsMCwxODEsMTQzLDQ4LDAsMTgwLDE0MywKKwk0NCwwLDE3OSwxNDMsNDAsMCwxNzgsMTQzLDM2LDAsMTc3LDE0MywKKwkzMiwwLDE3NiwxNDMsOCwwLDIyNCwzLDY0LDAsMTg5LDM5LAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTIyNCwyNTUsMTg5LDM5LDI0LDAsMTkxLDE3NSwyMCwwLDE3NywxNzUsCisJMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCw2NCwwLDIsMTQyLAorCTAsMCwwLDAsNywwLDY0LDIwLDMzLDEzNiwxNjAsMCwKKwkyLDAsMiwzNiw0OCw3MiwxOTIsMTIsOTYsMCwyLDE3NCwKKwkxLDAsNjYsMzYsMjE3LDc2LDE5Miw4LDEwMCwwLDIsMTc0LAorCTEyOSwwLDIsMzYsMTYsMCwzNCwxNjIsMTcsMCwzNCwxNDYsCisJMCwwLDAsMCwyLDAsNjYsNTIsMTcsMCwzNCwxNjIsCisJMjQsMCwxOTEsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDMyLDAsMTg5LDM5LDIzMiwyNTUsMTg5LDM5LAorCTIwLDAsMTkxLDE3NSwxNiwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLAorCTMzLDY0LDE2MCwwLDMzLDMyLDE5MiwwLDMzLDQwLDIyNCwwLAorCTQwLDAsMTYyLDE0MywxNywwLDMsMTQ1LDAsMCwwLDAsCisJMiwwLDk5LDUyLDE3LDAsMywxNjEsNiwwLDMsMzYsCisJNCwwLDY0LDE2LDE2LDAsMywxNjEsNDAsMCw0LDE3MywKKwkyNDksNzYsMTkyLDgsNDQsMCw1LDE3Myw4MCw4NiwxOTIsMTIsCisJNDAsMCw2LDM3LDIsMCw2NCwxNiw1LDAsMiwzNiwKKwk5NiwwLDIsMTc0LDIwLDAsMTkxLDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDI0LDAsMTg5LDM5LDIwMCwyNTUsMTg5LDM5LAorCTQ4LDAsMTkxLDE3NSw0NCwwLDE4MywxNzUsNDAsMCwxODIsMTc1LAorCTM2LDAsMTgxLDE3NSwzMiwwLDE4MCwxNzUsMjgsMCwxNzksMTc1LAorCTI0LDAsMTc4LDE3NSwyMCwwLDE3NywxNzUsMTYsMCwxNzYsMTc1LAorCTMzLDE3NiwxMjgsMCwzMywxNDQsMTYwLDAsMzMsMTUyLDE5MiwwLAorCTM3LDAsOTYsMTgsMzMsMTg0LDIyNCwwLDI4LDAsODQsMzgsCisJOCwwLDY3LDE0MiwyOCwwLDY2LDE0MiwwLDAsMCwwLAorCTM1LDEyOCw5OCwwLDQyLDE2LDgzLDAsMjMsMCw2NCwxNiwKKwkzMywxNjgsMTksMiw5LDUwLDE5MiwxMiwxMjgsMzIsMjEsMCwKKwkzMywxMzYsNjQsMCw4LDAsMzIsMjIsMTI4LDEyOCwxNiwwLAorCTUsMCwyLDM2LDk2LDAsMTk0LDE3NCwxNywwLDY2LDE0NiwKKwkwLDAsMCwwLDIsMCw2Niw1Miw0OCw3NywxOTIsOCwKKwkxNywwLDY2LDE2MiwzMywzMiwzMiwyLDEyLDAsNjksMTQyLAorCTAsMCwwLDAsODAsNjgsMTkyLDEyLDMzLDQ4LDAsMiwKKwkxMTAsODYsMTkyLDEyLDgsMCw2OCwzOCwxMiwwLDgxLDE3NCwKKwkzMywxMjgsNDgsMiw0LDAsMTQ0LDE3NCw0LDAsMTMyLDE0MiwKKwkzMyw0MCwyMjQsMiw4MCw2OCwxOTIsMTIsMTI4LDQ4LDE5LDAsCisJMCwwLDE0NywxNzQsOCwwLDg1LDE3NCw0OCwwLDE5MSwxNDMsCisJNDQsMCwxODMsMTQzLDQwLDAsMTgyLDE0MywzNiwwLDE4MSwxNDMsCisJMzIsMCwxODAsMTQzLDI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNTYsMCwxODksMzksMjI0LDI1NSwxODksMzksMjQsMCwxOTEsMTc1LAorCTIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsMzMsMTM2LDEyOCwwLAorCTUsMCwxOTIsMjQsMzMsMTI4LDE2MCwwLDMsMCwyLDM2LAorCTk2LDAsMzQsMTc0LDk1LDc3LDE5Miw4LDEwMCwwLDM4LDE3NCwKKwkxOSwwLDE5NSwzNiwxOSwwLDk4LDQ0LDksMCw2NCwxNiwKKwkxMjgsMTYsMywwLDIsMTMxLDEsNjAsMzMsOCwzNCwwLAorCTIwOCwxNTMsMzQsMTQwLDAsMCwwLDAsOCwwLDY0LDAsCisJMCwwLDAsMCw4OSw3NywxOTIsOCwyLDAsNiwzNiwKKwk4OSw3NywxOTIsOCw1LDAsNiwzNiw4OSw3NywxOTIsOCwKKwkzLDAsNiwzNiw4OSw3NywxOTIsOCwxLDAsNiwzNiwKKwkzNSw0OCw2LDAsOTYsMCwzOCwxNzQsMzMsMzIsMzIsMiwKKwk0OCw3MiwxOTIsMTIsMzMsNDAsMCwyLDEsMCw2NiwzNiwKKwkxMDAsMCwzNCwxNzQsMTcsMCwyLDE0NiwwLDAsMCwwLAorCTEsMCw2Niw1MiwxNywwLDIsMTYyLDI0LDAsMTkxLDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyMDAsMjU1LDE4OSwzOSw1MiwwLDE5MSwxNzUsCisJNDgsMCwxOTAsMTc1LDQ0LDAsMTgzLDE3NSw0MCwwLDE4MiwxNzUsCisJMzYsMCwxODEsMTc1LDMyLDAsMTgwLDE3NSwyOCwwLDE3OSwxNzUsCisJMjQsMCwxNzgsMTc1LDIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsCisJMzMsMTUyLDEyOCwwLDMzLDE2OCwxNjAsMCwzMywxNjAsMTkyLDAsCisJNzYsMCwxODIsMTQzLDgwLDAsMTgzLDE0Myw4NCwwLDE5MCwxNDMsCisJOTIsMCwxNzcsMTQzLDAsMCwwLDAsMjA5LDgzLDE5MiwxMiwKKwkzMywxNDQsMjI0LDAsMzMsMTI4LDY0LDAsMywwLDAsMjIsCisJNCwwLDIsMzYsMTY4LDc3LDE5Miw4LDMzLDE2LDAsMCwKKwk4OCwwLDIsMTY2LDY0LDAsMTksMTc0LDMzLDMyLDY0LDIsCisJNzIsMCwxNjUsMTQzLDAsMCwwLDAsODAsODYsMTkyLDEyLAorCTkyLDAsNiwzOCwyNTUsMjU1LDMsMzYsMjMsMCw2NywxNiwKKwkwLDAsMCwwLDMsMCwxOTQsMTM4LDAsMCwxOTQsMTU0LAorCTAsMCwwLDAsMTAzLDAsMiwxNzAsMTAwLDAsMiwxODYsCisJMTA0LDAsMjMsMTc0LDEwOCwwLDMwLDE3NCw4OCwwLDE2OCwxNDMsCisJMCwwLDAsMCwxMTIsMCw4LDE3NCw3MiwwLDAsMTY2LAorCTc2LDAsMjAsMTc0LDI1NSwyNTUsMTYyLDUwLDMzLDE2LDEzMCwyLAorCTgwLDAsMiwxNzQsODQsMCwwLDE2Niw5LDAsMzIsMTgsCisJMTIwLDAsMTcsMTc0LDIyNCw4MywxOTIsMTIsMzMsMzIsMzIsMiwKKwk2LDAsNjQsMjAsMTI0LDAsMiwxNzQsMTY3LDgzLDE5MiwxMiwKKwkzMywzMiwwLDIsMTY4LDc3LDE5Miw4LDMzLDE2LDAsMCwKKwkxMjQsMCwwLDE3NCwzMywxNiwwLDIsNTIsMCwxOTEsMTQzLAorCTQ4LDAsMTkwLDE0Myw0NCwwLDE4MywxNDMsNDAsMCwxODIsMTQzLAorCTM2LDAsMTgxLDE0MywzMiwwLDE4MCwxNDMsMjgsMCwxNzksMTQzLAorCTI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw1NiwwLDE4OSwzOSwyMjQsMjU1LDE4OSwzOSwKKwkyOCwwLDE5MSwxNzUsMjQsMCwxNzgsMTc1LDIwLDAsMTc3LDE3NSwKKwkxNiwwLDE3NiwxNzUsMzMsMTQ0LDEyOCwwLDkyLDAsNjgsMTQyLAorCTEyOCw4NiwxOTIsMTIsMCwwLDAsMCw5NiwwLDY4LDE0MiwKKwkwLDAsMCwwLDEyOCw4NiwxOTIsMTIsMzMsMTI4LDY0LDAsCisJMTAwLDAsNjgsMTQyLDAsMCwwLDAsMTI4LDg2LDE5MiwxMiwKKwkzMywxMzYsNjQsMCwzMywxMjgsMTcsMiw2LDAsMTYsMzgsCisJMzMsMTYsODAsMCw5MCwwLDY2LDE2NiwxOTEsNzksMTkyLDEyLAorCTEwNCwwLDY4LDM4LDI1NSwyNTUsNjcsNDgsOTAsMCw2OCwxNTAsCisJMTI4LDAsOTgsNDQsNSwwLDY0LDIwLDIsMCwxMzAsMzYsCisJMCwxLDk4LDQ0LDIsMCw2NCwyMCwzLDAsMTMwLDM2LAorCTQsMCwxMzAsMzYsMzMsMTYsNjcsMCw5MCwwLDY2LDE2NiwKKwk4MCwwLDY2LDE0Miw3NiwwLDY3LDE0Miw5MCwwLDgwLDE1MCwKKwk2NCwwLDY4LDE0MiwwLDAsMCwwLDEyOCw4NiwxOTIsMTIsCisJMzUsMTM2LDY3LDAsMjU1LDI1NSw2Nyw0OCw5MCwwLDY4LDE1MCwKKwkwLDAsMCwwLDEyOCwwLDEzMCw0NCw5LDAsNjQsMjAsCisJMCwxLDEzMCw0NCw0LDAsNjQsMTYsMCwwLDAsMCwKKwkzMywyNCwxMTIsMCwyMzcsNzcsMTkyLDgsNiwwLDk5LDM2LAorCTMzLDI0LDExMiwwLDIzNyw3NywxOTIsOCw3LDAsOTksMzYsCisJMzMsMjQsMTEyLDAsNSwwLDk5LDM2LDI1NSwyNTUsMzYsNTAsCisJMTI4LDAsMTMwLDQ0LDUsMCw2NCwyMCwxLDAsMTMwLDM2LAorCTAsMSwxMzAsNDQsMiwwLDY0LDIwLDIsMCwxMzAsMzYsCisJMywwLDEzMCwzNiwzMywxNiw5OCwwLDIsMCw2NiwxNjYsCisJMiwwLDY3LDE1MCwyLDAsNjgsMTUwLDAsMCwwLDAsCisJMTI4LDAsMTMwLDQ0LDYsMCw2NCwyMCwxLDAsOTksMzYsCisJMCwxLDEzMCw0NCw0LDAsNjQsMjAsMiwwLDk4LDM2LAorCTMsNzgsMTkyLDgsMywwLDk4LDM2LDEsMCw5OCwzNiwKKwkwLDAsNjYsMTY2LDAsMCw2NiwxNTAsMjgsMCwxOTEsMTQzLAorCTI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywzMiwwLDE4OSwzOSwyMTYsMjU1LDE4OSwzOSwKKwkzMiwwLDE5MSwxNzUsMjgsMCwxNzksMTc1LDI0LDAsMTc4LDE3NSwKKwkyMCwwLDE3NywxNzUsMTYsMCwxNzYsMTc1LDMzLDE1MiwxMjgsMCwKKwkxNzEsODYsMTkyLDEyLDkyLDAsMTAwLDM4LDEwNCwwLDEwMCwxNDIsCisJMCwwLDAsMCwxMjgsODYsMTkyLDEyLDMzLDE0NCw2NCwwLAorCTEwOCwwLDEwMCwxNDIsMCwwLDAsMCwxMjgsODYsMTkyLDEyLAorCTMzLDEzNiw2NCwwLDExMiwwLDEwMCwxNDIsMCwwLDAsMCwKKwkxNTMsODYsMTkyLDEyLDMzLDEyOCw2NCwwLDEwLDAsODIsMzgsCisJMzMsMTM2LDUwLDIsMzMsMTI4LDE3LDIsNCwwLDE2LDM4LAorCTMzLDE2LDgwLDAsOTAsMCw5OCwxNjYsMTkxLDc5LDE5MiwxMiwKKwkxMTYsMCwxMDAsMzgsMjU1LDI1NSw2Nyw0OCw5MCwwLDEwMCwxNTAsCisJMTI4LDAsOTgsNDQsNSwwLDY0LDIwLDIsMCwxMzAsMzYsCisJMCwxLDk4LDQ0LDIsMCw2NCwyMCwzLDAsMTMwLDM2LAorCTQsMCwxMzAsMzYsMzMsMTYsNjcsMCw5MCwwLDk4LDE2NiwKKwk4MCwwLDk4LDE0Miw3NiwwLDk5LDE0Miw5MCwwLDExMywxNTAsCisJNjQsMCwxMDAsMTQyLDAsMCwwLDAsMTI4LDg2LDE5MiwxMiwKKwkzNSwxMjgsNjcsMCwyNTUsMjU1LDY3LDQ4LDkwLDAsMTAwLDE1MCwKKwkwLDAsMCwwLDEyOCwwLDEzMCw0NCw5LDAsNjQsMjAsCisJMCwxLDEzMCw0NCw0LDAsNjQsMTYsMCwwLDAsMCwKKwkzMywyNCwxMTMsMCw3NCw3OCwxOTIsOCw2LDAsOTksMzYsCisJMzMsMjQsMTEzLDAsNzQsNzgsMTkyLDgsNywwLDk5LDM2LAorCTMzLDI0LDExMywwLDUsMCw5OSwzNiwyNTUsMjU1LDQsNTAsCisJMTI4LDAsMTMwLDQ0LDUsMCw2NCwyMCwxLDAsMTMwLDM2LAorCTAsMSwxMzAsNDQsMiwwLDY0LDIwLDIsMCwxMzAsMzYsCisJMywwLDEzMCwzNiwzMywxNiw5OCwwLDIsMCw5OCwxNjYsCisJMiwwLDk5LDE1MCwyLDAsMTAwLDE1MCwwLDAsMCwwLAorCTEyOCwwLDEzMCw0NCw2LDAsNjQsMjAsMSwwLDk5LDM2LAorCTAsMSwxMzAsNDQsNCwwLDY0LDIwLDIsMCwxMTIsMzYsCisJOTYsNzgsMTkyLDgsMywwLDExMiwzNiwxLDAsMTEyLDM2LAorCTI1NSwyNTUsMiw1MCwzMiwwLDE5MSwxNDMsMjgsMCwxNzksMTQzLAorCTI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0MCwwLDE4OSwzOSwyMDgsMjU1LDE4OSwzOSwKKwk0MCwwLDE5MSwxNzUsMzYsMCwxNzksMTc1LDMyLDAsMTc4LDE3NSwKKwkyOCwwLDE3NywxNzUsMjQsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwKKwkzMywxNTIsMTkyLDAsMzMsMTQ0LDIyNCwwLDMzLDEzNiwxNjAsMCwKKwkxNiwwLDQsMzYsMzIsMCw1LDM2LDEsMTMxLDYsNjAsCisJNTYsOTcsMTk4LDM2LDI0Miw4NiwxOTIsMTIsMzMsNTYsMCwyLAorCTI1NSwyNTUsMzYsNTAsMSwxMzEsNSw2MCw1Niw5NywxNjUsMzYsCisJNDQsODcsMTkyLDEyLDMzLDQ4LDAsMiwxNiwwLDE3NiwxNzUsCisJMiwwLDQsMzYsMzMsNDAsMCwwLDEsMTMxLDcsNjAsCisJNTYsOTcsMjMxLDM2LDk0LDg3LDE5MiwxMiwzMyw0OCw5NiwyLAorCTgsMCw3MSwxNDIsNCwwLDY2LDE0MiwwLDAsMCwwLAorCTM1LDU2LDIyNiwwLDEsMTMxLDIsNjAsNTYsOTcsNjYsMzYsCisJMTYsMCwxNjIsMTc1LDIwLDAsMTc2LDE3NSw0LDAsNCwzNiwKKwkzMyw0MCwwLDAsNCwwLDcwLDE0MiwwLDAsMCwwLAorCTE5NCw4NywxOTIsMTIsMjU1LDI1NSwyMzEsNDgsNDAsMCwxOTEsMTQzLAorCTM2LDAsMTc5LDE0MywzMiwwLDE3OCwxNDMsMjgsMCwxNzcsMTQzLAorCTI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsNDgsMCwxODksMzksCisJMjE2LDI1NSwxODksMzksMzYsMCwxOTEsMTc1LDMyLDAsMTc4LDE3NSwKKwkyOCwwLDE3NywxNzUsMjQsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwKKwkzMywxMzYsMTYwLDAsODgsMCw0LDE1MCwxNjAsMCw1LDM2LAorCTEsMTMxLDYsNjAsNTYsOTcsMTk4LDM2LDI0Miw4NiwxOTIsMTIsCisJMzMsNTYsMzIsMiw5MCwwLDQsMTUwLDEsMTMxLDUsNjAsCisJNTYsOTcsMTY1LDM2LDQ0LDg3LDE5MiwxMiwzMyw0OCwzMiwyLAorCTE2LDAsMTc3LDE3NSw2LDAsNCwzNiwzMyw0MCwwLDAsCisJMSwxMzEsNyw2MCw1Niw5NywyMzEsMzYsMTUsODgsMTkyLDEyLAorCTkyLDAsNiwzOCwxLDEzMSwxOCw2MCw1Niw5Nyw4MiwzOCwKKwkxNiwwLDE3OCwxNzUsMjAsMCwxNzcsMTc1LDMzLDMyLDAsMCwKKwk2NCwwLDUsMzYsMTAwLDAsNiwzOCwxOTQsODcsMTkyLDEyLAorCTQsMCw3LDM2LDE2LDAsMTc3LDE3NSwyLDAsNCwzNiwKKwkzMyw0MCwwLDAsMTA0LDAsNiwxNDIsMCwwLDAsMCwKKwk5NCw4NywxOTIsMTIsMzMsNTYsNjQsMiwxNiwwLDE3NywxNzUsCisJMiwwLDQsMzYsMzMsNDAsMCwwLDEwOCwwLDYsMTQyLAorCTAsMCwwLDAsOTQsODcsMTkyLDEyLDMzLDU2LDY0LDIsCisJMTYsMCwxNzcsMTc1LDMsMCw0LDM2LDY0LDAsNSwzNiwKKwkxMTIsMCw2LDE0MiwwLDAsMCwwLDE0Myw4NywxOTIsMTIsCisJMzMsNTYsNjQsMiwxMTYsMCw0LDM4LDcsNzksMTkyLDEyLAorCTMzLDQwLDMyLDIsMzYsMCwxOTEsMTQzLDMyLDAsMTc4LDE0MywKKwkyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk0MCwwLDE4OSwzOSwyMTYsMjU1LDE4OSwzOSwzMiwwLDE5MSwxNzUsCisJMjgsMCwxNzcsMTc1LDI0LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsCisJMzMsMTM2LDE2MCwwLDg4LDAsNCwxNTAsMTYwLDAsNSwzNiwKKwkxLDEzMSw2LDYwLDU2LDk3LDE5OCwzNiwyNDIsODYsMTkyLDEyLAorCTMzLDU2LDMyLDIsOTAsMCw0LDE1MCwxLDEzMSw1LDYwLAorCTU2LDk3LDE2NSwzNiw0NCw4NywxOTIsMTIsMzMsNDgsMzIsMiwKKwkxNiwwLDE3NywxNzUsMiwwLDQsMzYsOTIsMCw2LDE0MiwKKwkxLDEzMSw3LDYwLDU2LDk3LDIzMSwzNiw5NCw4NywxOTIsMTIsCisJMzMsNDAsMCwwLDE2LDAsMTc3LDE3NSwyLDAsNCwzNiwKKwk5NiwwLDYsMTQyLDEsMTMxLDcsNjAsNTYsOTcsMjMxLDM2LAorCTk0LDg3LDE5MiwxMiwzMyw0MCwwLDAsMTYsMCwxNzcsMTc1LAorCTIsMCw0LDM2LDEwMCwwLDYsMTQyLDEsMTMxLDcsNjAsCisJNTYsOTcsMjMxLDM2LDk0LDg3LDE5MiwxMiwzMyw0MCwwLDAsCisJMTA0LDAsNCwzOCw3LDc5LDE5MiwxMiwzMyw0MCwzMiwyLAorCTMyLDAsMTkxLDE0MywyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0MCwwLDE4OSwzOSwyMDAsMjU1LDE4OSwzOSwKKwk1MiwwLDE5MSwxNzUsNDgsMCwxODAsMTc1LDQ0LDAsMTc5LDE3NSwKKwk0MCwwLDE3OCwxNzUsMzYsMCwxNzcsMTc1LDMyLDAsMTc2LDE3NSwKKwkzMywxNDQsMTI4LDAsMzMsMTM2LDE2MCwwLDE2LDAsNCwzNiwKKwkzMiwwLDUsMzYsMSwxMzEsNiw2MCw1Niw5NywxOTgsMzYsCisJMjQyLDg2LDE5MiwxMiwzMyw1NiwzMiwyLDAsMCw2OCwxNTAsCisJMSwxMzEsNSw2MCw1Niw5NywxNjUsMzYsNDQsODcsMTkyLDEyLAorCTMzLDQ4LDMyLDIsMTU1LDAsNjQsMTgsMCwwLDAsMCwKKwkxLDEzMSwyMCw2MCw1Niw5NywxNDgsMzgsOCwwLDgwLDE0MiwKKwkwLDAsMCwwLDE0NSwwLDAsMTgsMCwwLDAsMCwKKwk0LDAsNjYsMTQyLDAsMCwwLDAsMTQxLDAsNjQsMjQsCisJMzMsMTUyLDAsMCwxNiwwLDQsMzYsMzIsMCw1LDM2LAorCTMzLDQ4LDEyOCwyLDI0Miw4NiwxOTIsMTIsMzMsNTYsMzIsMiwKKwk0LDAsNCwxNTAsMzMsNDAsMTI4LDIsNDQsODcsMTkyLDEyLAorCTMzLDQ4LDMyLDIsMTYsMCwxNzcsMTc1LDYsMCw0LDM2LAorCTMzLDQwLDAsMCw4LDAsNiwzOCwxNSw4OCwxOTIsMTIsCisJMzMsNTYsMTI4LDIsMTYsMCwzLDE0Niw2NSwwLDIsMzYsCisJNDcsMCw5OCwxNiw2NiwwLDk4LDQwLDE4LDAsNjQsMTYsCisJNSwwLDIsMzYsODgsMCw5OCwxNiw2LDAsOTgsNDAsCisJNywwLDY0LDE2LDIsMCwyLDM2LDMwLDAsOTgsMTYsCisJNCwwLDIsMzYsNTEsMCw5OCwxNiw0LDAsNCwzNiwKKwkxNzQsNzksMTkyLDgsMSwwLDExNSwzOCw2LDAsMiwzNiwKKwk2OCwwLDk4LDE2LDY0LDAsMiwzNiw3OCwwLDk4LDE2LAorCTMzLDMyLDAsMCwxNzQsNzksMTkyLDgsMSwwLDExNSwzOCwKKwk2OCwwLDIsMzYsNDcsMCw5OCwxNiw2OSwwLDk4LDQwLAorCTcsMCw2NCwxNiw2NiwwLDIsMzYsMjQsMCw5OCwxNiwKKwk2NywwLDIsMzYsMjUsMCw5OCwxNiwzLDAsNCwzNiwKKwkxNzQsNzksMTkyLDgsMSwwLDExNSwzOCwxMzEsMCw5OCw0MCwKKwk4MywwLDY0LDE2LDEyOCwwLDk4LDQwLDY4LDAsNjQsMTYsCisJMCwwLDAsMCwxNzQsNzksMTkyLDgsMSwwLDExNSwzOCwKKwkxNiwwLDE3NywxNzUsMiwwLDQsMzYsNDAsMCw2LDE0MiwKKwkxLDEzMSw3LDYwLDU2LDk3LDIzMSwzNiw5NCw4NywxOTIsMTIsCisJMzMsNDAsMCwwLDE3NCw3OSwxOTIsOCwxLDAsMTE1LDM4LAorCTE2LDAsMTc3LDE3NSwxMTEsNzksMTkyLDgsMSwwLDQsMzYsCisJMTYsMCwxNzcsMTc1LDExMSw3OSwxOTIsOCwyLDAsNCwzNiwKKwkxNiwwLDE3NywxNzUsNDAsMCw2LDE0MiwxLDEzMSw3LDYwLAorCTU2LDk3LDIzMSwzNiwxNDMsODcsMTkyLDEyLDY0LDAsNSwzNiwKKwkxNzQsNzksMTkyLDgsMSwwLDExNSwzOCw0OCwwLDcsMTQyLAorCTQ0LDAsMiwxNDIsMCwwLDAsMCwzNSw1NiwyMjYsMCwKKwkxNiwwLDE4MCwxNzUsMjAsMCwxNzcsMTc1LDEzNCw3OSwxOTIsOCwKKwkzMyw0MCwwLDAsNDgsMCw3LDE0Miw0NCwwLDIsMTQyLAorCTAsMCwwLDAsMzUsNTYsMjI2LDAsMTYsMCwxODAsMTc1LAorCTIwLDAsMTc3LDE3NSw0LDAsNCwzNiw2NCwwLDUsMzYsCisJNDQsMCw2LDE0MiwwLDAsMCwwLDE5NCw4NywxOTIsMTIsCisJMjU1LDI1NSwyMzEsNDgsMTc0LDc5LDE5Miw4LDEsMCwxMTUsMzgsCisJMTYsMCwxNzcsMTc1LDYsMCw0LDM2LDMzLDQwLDAsMCwKKwkxLDEzMSw3LDYwLDU2LDk3LDIzMSwzNiwxNSw4OCwxOTIsMTIsCisJNDAsMCw2LDM4LDE3NCw3OSwxOTIsOCwxLDAsMTE1LDM4LAorCTUsMCw0LDM2LDE2NCw3OSwxOTIsOCwzMyw0MCwwLDAsCisJMTYsMCwxODAsMTc1LDIwLDAsMTc3LDE3NSw2NCwwLDUsMzYsCisJNDAsMCw2LDM4LDE5NCw4NywxOTIsMTIsNCwwLDcsMzYsCisJMTc0LDc5LDE5Miw4LDEsMCwxMTUsMzgsMTYsMCw0LDE0NiwKKwkxNiwwLDUsMTQ2LDMxLDAsMTMyLDQ4LDIyNCwwLDE2NSw0OCwKKwkxLDEzMSw2LDYwLDU2LDk3LDE5OCwzNiwyNDIsODYsMTkyLDEyLAorCTMzLDU2LDMyLDIsMzMsMzIsMCwwLDEsMTMxLDUsNjAsCisJNTYsOTcsMTY1LDM2LDQ0LDg3LDE5MiwxMiwzMyw0OCwzMiwyLAorCTEsMCwxMTUsMzgsNCwwLDY2LDE0MiwwLDAsMCwwLAorCTQyLDE2LDk4LDIsMTE3LDI1NSw2NCwyMCw2OCwwLDE2LDM4LAorCTEyLDAsODIsMTQyLDAsMCwwLDAsMTA1LDI1NSw2NCwyMiwKKwkwLDAsMCwwLDUyLDAsMTkxLDE0Myw0OCwwLDE4MCwxNDMsCisJNDQsMCwxNzksMTQzLDQwLDAsMTc4LDE0MywzNiwwLDE3NywxNDMsCisJMzIsMCwxNzYsMTQzLDgsMCwyMjQsMyw1NiwwLDE4OSwzOSwKKwkyMDAsMjU1LDE4OSwzOSw1MiwwLDE5MSwxNzUsNDgsMCwxODIsMTc1LAorCTQ0LDAsMTgxLDE3NSw0MCwwLDE4MCwxNzUsMzYsMCwxNzksMTc1LAorCTMyLDAsMTc4LDE3NSwyOCwwLDE3NywxNzUsMjQsMCwxNzYsMTc1LAorCTMzLDE2OCwxMjgsMCwzMywxNTIsMTYwLDIsMTEzLDAsMTYwLDE4LAorCTMzLDE0NCwwLDAsNCwwLDIyLDM2LDgsMCwxMTIsMTQyLAorCTAsMCwwLDAsMTA0LDAsMCwxOCwwLDAsMCwwLAorCTQsMCw5OCwxNDIsMCwwLDAsMCwxMDAsMCw2NCwyNCwKKwkzMywxNjAsMCwwLDE3MSw4NiwxOTIsMTIsOCwwLDQsMzgsCisJMjU1LDI1NSw2Nyw0OCwxMjgsMCw5OCw0NCw1LDAsNjQsMjAsCisJMiwwLDExMywzNiwwLDEsOTgsNDQsMiwwLDY0LDIwLAorCTMsMCwxMTMsMzYsNCwwLDExMywzNiwxNiwwLDMsMTQ2LAorCTY0LDAsMiwzNiw1MCwwLDk4LDE2LDY1LDAsOTgsNDAsCisJMTYsMCw2NCwxNiw2OCwwLDIsMzYsMzQsMCwxMTgsMTYsCisJNSwwLDk4LDQwLDUsMCw2NCwxNiwyLDAsMiwzNiwKKwkyMCwwLDk4LDE2LDI1NSwyNTUsMzYsNTAsMjIsODAsMTkyLDgsCisJMCwwLDAsMCw1LDAsMiwzNiwzNSwwLDk4LDE2LAorCTYsMCwyLDM2LDI5LDAsOTgsMTYsMjU1LDI1NSwzNiw1MCwKKwkyMiw4MCwxOTIsOCwwLDAsMCwwLDE5LDAsOTgsMTYsCisJNjgsMCw5OCw0MCwxMiwwLDY0LDIwLDEzMSwwLDk4LDQwLAorCTI4LDAsNjQsMTYsMTI4LDAsOTgsNDAsMjcsMCw2NCwyMCwKKwkyNTUsMjU1LDM2LDUwLDIyLDgwLDE5Miw4LDE4LDAsMCwxNjYsCisJNDAsMCw0LDE0MiwxMjgsODYsMTkyLDEyLDAsMCwwLDAsCisJMjEsODAsMTkyLDgsMTgsMCwyLDE2Niw0MCwwLDQsMTQyLAorCTE1Myw4NiwxOTIsMTIsMCwwLDAsMCwyMSw4MCwxOTIsOCwKKwkxOCwwLDIsMTY2LDQ4LDAsMiwxNDIsNDQsMCwzLDE0MiwKKwkwLDAsMCwwLDM1LDE2LDY3LDAsMjEsODAsMTkyLDgsCisJMTgsMCwyLDE2NiwxNzEsODYsMTkyLDEyLDQwLDAsNCwzOCwKKwkyMSw4MCwxOTIsOCwxOCwwLDIsMTY2LDIxLDgwLDE5Miw4LAorCTE4LDAsMCwxNjYsMTgsMCwyMiwxNjYsMjU1LDI1NSwzNiw1MCwKKwkxOCwwLDMsMTUwLDAsMCwwLDAsMTI4LDAsOTgsNDQsCisJNiwwLDY0LDIwLDEsMCwxMzIsMzYsMCwxLDk4LDQ0LAorCTQsMCw2NCwyMCwyLDAsOTgsMzYsMzMsODAsMTkyLDgsCisJMywwLDk4LDM2LDEsMCw5OCwzNiwzMywxNiwxMzAsMCwKKwk0LDAsMiwxNjYsNCwwLDQsMTUwLDAsMCwwLDAsCisJMSwwLDEzMiwzNiw0LDAsMywxNTAsMCwwLDAsMCwKKwkxMjgsMCw5OCw0NCw2LDAsNjQsMjAsMjU1LDI1NSw2OSw1MCwKKwkwLDEsOTgsNDQsNCwwLDY0LDIwLDIsMCwxNjIsMzYsCisJNDksODAsMTkyLDgsMywwLDE2MiwzNiwxLDAsMTYyLDM2LAorCTMzLDE0NCw2OCwwLDEsMCwxNDgsMzgsNCwwLDk4LDE0MiwKKwkwLDAsMCwwLDQyLDE2LDEzMCwyLDE1OCwyNTUsNjQsMjAsCisJNjgsMCwxNiwzOCwxMiwwLDExNSwxNDIsMCwwLDAsMCwKKwkxNDYsMjU1LDk2LDIyLDAsMCwwLDAsMCwwLDE3OCwxNjYsCisJMjU1LDI1NSw2Niw1MCw1MiwwLDE5MSwxNDMsNDgsMCwxODIsMTQzLAorCTQ0LDAsMTgxLDE0Myw0MCwwLDE4MCwxNDMsMzYsMCwxNzksMTQzLAorCTMyLDAsMTc4LDE0MywyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw1NiwwLDE4OSwzOSwyMjQsMjU1LDE4OSwzOSwKKwkyNCwwLDE5MSwxNzUsMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwKKwkzMywxMjgsMTI4LDAsMTcxLDg2LDE5MiwxMiw4LDAsNCwzOCwKKwkyNTUsMjU1LDY3LDQ4LDEyOCwwLDk4LDQ0LDUsMCw2NCwyMCwKKwkyLDAsMTEzLDM2LDAsMSw5OCw0NCwyLDAsNjQsMjAsCisJMywwLDExMywzNiw0LDAsMTEzLDM2LDE2LDAsMywxNDYsCisJNjQsMCwyLDM2LDUyLDAsOTgsMTYsNjUsMCw5OCw0MCwKKwkxNywwLDY0LDE2LDQsMCwyLDM2LDM3LDAsOTgsMTYsCisJMCwwLDAsMCw1LDAsOTgsNDAsNSwwLDY0LDE2LAorCTIsMCwyLDM2LDIyLDAsOTgsMTYsMjU1LDI1NSwzNiw1MCwKKwkxNDUsODAsMTkyLDgsMCwwLDAsMCw1LDAsMiwzNiwKKwkzNiwwLDk4LDE2LDYsMCwyLDM2LDMwLDAsOTgsMTYsCisJMjU1LDI1NSwzNiw1MCwxNDUsODAsMTkyLDgsMCwwLDAsMCwKKwk2OCwwLDIsMzYsMjAsMCw5OCwxNiwwLDAsMCwwLAorCTY4LDAsOTgsNDAsMTIsMCw2NCwyMCwxMzEsMCw5OCw0MCwKKwkyOCwwLDY0LDE2LDEyOCwwLDk4LDQwLDI3LDAsNjQsMjAsCisJMjU1LDI1NSwzNiw1MCwxNDUsODAsMTkyLDgsMTgsMCwwLDE2NiwKKwk0MCwwLDQsMTQyLDEyOCw4NiwxOTIsMTIsMCwwLDAsMCwKKwkxNDQsODAsMTkyLDgsMTgsMCwyLDE2Niw0MCwwLDQsMTQyLAorCTE1Myw4NiwxOTIsMTIsMCwwLDAsMCwxNDQsODAsMTkyLDgsCisJMTgsMCwyLDE2Niw0OCwwLDIsMTQyLDQ0LDAsMywxNDIsCisJMCwwLDAsMCwxNDMsODAsMTkyLDgsMzUsMTYsNjcsMCwKKwkxNzEsODYsMTkyLDEyLDQwLDAsNCwzOCwxNDQsODAsMTkyLDgsCisJMTgsMCwyLDE2NiwxNDQsODAsMTkyLDgsMTgsMCwwLDE2NiwKKwk0LDAsMiwzNiwxOCwwLDIsMTY2LDI1NSwyNTUsMzYsNTAsCisJMTgsMCwzLDE1MCwwLDAsMCwwLDEyOCwwLDk4LDQ0LAorCTYsMCw2NCwyMCwxLDAsMTMyLDM2LDAsMSw5OCw0NCwKKwk0LDAsNjQsMjAsMiwwLDk4LDM2LDE1Niw4MCwxOTIsOCwKKwkzLDAsOTgsMzYsMSwwLDk4LDM2LDMzLDE2LDEzMCwwLAorCTQsMCwyLDE2Niw0LDAsMywxNTAsNCwwLDQsMTUwLAorCTAsMCwwLDAsMTI4LDAsMTMwLDQ0LDYsMCw2NCwyMCwKKwkxLDAsOTksMzYsMCwxLDEzMCw0NCw0LDAsNjQsMjAsCisJMiwwLDk4LDM2LDE3MCw4MCwxOTIsOCwzLDAsOTgsMzYsCisJMSwwLDk4LDM2LDI1NSwyNTUsNjYsNDgsMjQsMCwxOTEsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTMyLDAsMTg5LDM5LDIzMiwyNTUsMTg5LDM5LDE2LDAsMTkxLDE3NSwKKwk2NCwwLDEzMCwxNDAsMCwwLDAsMCwxMiwwLDY0LDIwLAorCTMzLDE2LDAsMCw4OCwwLDEzMSwxNDgsNCwwLDIsMzYsCisJNSwwLDk4LDE2LDAsMCwwLDAsMTgwLDc3LDE5MiwxMiwKKwkwLDAsMCwwLDE5Myw4MCwxOTIsOCwyNTUsMjU1LDY2LDQ4LAorCTExLDc4LDE5MiwxMiwwLDAsMCwwLDI1NSwyNTUsNjYsNDgsCisJMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDIyNCwyNTUsMTg5LDM5LDI0LDAsMTkxLDE3NSwKKwkyMCwwLDE3NywxNzUsMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwKKwkxNzYsODAsMTkyLDEyLDMzLDEzNiwxNjAsMCwzMywzMiwwLDIsCisJMzMsNDAsMzIsMiwyMTMsODAsMTkyLDEyLDI1NSwyNTUsNzAsNDgsCisJMjQsMCwxOTEsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDMyLDAsMTg5LDM5LDIyNCwyNTUsMTg5LDM5LAorCTI4LDAsMTkxLDE3NSwyNCwwLDE3OCwxNzUsMjAsMCwxNzcsMTc1LAorCTE2LDAsMTc2LDE3NSwzMywxNDQsMTI4LDAsMzMsMTM2LDE5MiwwLAorCTI1NSwyNTUsMzQsNTAsNDEsMCw2NCwxNiwzMywxMjgsMTYwLDAsCisJNCwwLDIsMTQyLDAsMCwwLDAsMTEsMCw2NCwyMCwKKwkyNTUsMjU1LDM1LDUwLDksNTAsMTkyLDEyLDI1NSwyNTUsMzYsNTAsCisJMzMsMjQsNjQsMCwzMiwwLDk2LDE2LDEsMCwyLDM2LAorCTAsMCwyLDE2Niw0LDAsMywxNzQsOCwwLDMsMTc0LAorCTI0Miw4MCwxOTIsOCwxMiwwLDE3LDE2NiwxMiwwLDIsMTUwLAorCTAsMCwwLDAsNDMsMTYsNjcsMCwyMywwLDY0LDIwLAorCTI1NSwyNTUsMiwzNiw2NCwwLDY2LDE0MiwwLDAsMCwwLAorCTE5LDAsNjQsMjAsMjU1LDI1NSwyLDM2LDMzLDMyLDAsMiwKKwkyLDAsNjksMTUwLDMzLDQ4LDAsMCwxMDQsNzgsMTkyLDEyLAorCTcyLDAsNzEsMzgsODgsMCw2NywxNTAsNCwwLDIsMzYsCisJNSwwLDk4LDE2LDMzLDMyLDY0LDIsMjE3LDc4LDE5MiwxMiwKKwkzMyw0MCwwLDIsOCw4MSwxOTIsOCwzMywxNiwwLDAsCisJMTUzLDc4LDE5MiwxMiwzMyw0MCwwLDIsOCw4MSwxOTIsOCwKKwkzMywxNiwwLDAsMjU1LDI1NSwyLDM2LDI4LDAsMTkxLDE0MywKKwkyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMzIsMCwxODksMzksMCwwLDAsMCwKKwkwLDAsMCwwLDE2OCwyNTUsMTg5LDM5LDgwLDAsMTkxLDE3NSwKKwk3NiwwLDE4MywxNzUsNzIsMCwxODIsMTc1LDY4LDAsMTgxLDE3NSwKKwk2NCwwLDE4MCwxNzUsNjAsMCwxNzksMTc1LDU2LDAsMTc4LDE3NSwKKwk1MiwwLDE3NywxNzUsNDgsMCwxNzYsMTc1LDMzLDI0LDEyOCwwLAorCTMzLDE1MiwxNjAsMCwzMywxNzYsMTkyLDAsMzMsMTg0LDIyNCwwLAorCTEwNCwwLDE2MiwxNDMsMCwwLDAsMCwyLDAsNjQsMjAsCisJNDQsMCwxNjAsMTc1LDQwLDAsMTYyLDM5LDAsMCw2NCwxNzIsCisJMjQsMCwxNjQsMzksMzMsNDAsOTYsMCwxNTYsODgsMTkyLDEyLAorCTMzLDQ4LDk2LDIsMzMsMTM2LDY0LDAsODIsMCwzMiwxOCwKKwkzMywxNiwwLDAsMjA5LDgzLDE5MiwxMiwwLDAsMCwwLAorCTMzLDE0NCw2NCwwLDUsMCw2NCwyMiwxLDAsMiwzNiwKKwkxODMsODgsMTkyLDEyLDMzLDMyLDMyLDIsMTI0LDgxLDE5Miw4LAorCTMzLDE2LDAsMCwxNDgsMCw2NiwxNjIsMTk2LDg4LDE5MiwxMiwKKwkzMywzMiwzMiwyLDIyNCwwLDg1LDQ4LDQ0LDAsMTc2LDM5LAorCTMzLDMyLDMyLDIsMTI0LDg5LDE5MiwxMiwzMyw0MCwwLDIsCisJMzMsMTYwLDY0LDAsMzMsMzIsMzIsMiwxOTgsODksMTkyLDEyLAorCTMzLDQwLDAsMiwyLDAsNjYsMTY2LDQ0LDAsMTYyLDE0MywKKwkwLDAsMCwwLDE0LDAsNjQsMjAsMCwwLDAsMCwKKwk4LDAsMzUsMTQyLDQsMCwzNCwxNDIsMCwwLDAsMCwKKwkzNSwxMjgsOTgsMCwyLDAsNjYsMTUwLDAsMCwwLDAsCisJMzMsMTI4LDIsMiw0MiwxNiwxOSwyLDE2LDAsNjQsMjAsCisJMzMsMzIsMzIsMiw0MiwxNiwxMTIsMiwxNiwwLDY0LDE2LAorCTAsMCwwLDAsMTY3LDgzLDE5MiwxMiwzMywzMiw2NCwyLAorCTE4Myw4OCwxOTIsMTIsMzMsMzIsMzIsMiwzLDEzMSwzLDYwLAorCTE0MCwxNyw5OSwzNiwwLDAsOTgsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDAsMCw5OCwxNzIsMTI0LDgxLDE5Miw4LAorCTMzLDE2LDAsMCwzMyw0MCwwLDIsNDIsODksMTkyLDEyLAorCTMzLDQ4LDAsMCwyNTUsMCwxNjIsNTAsMjU1LDI1NSwxMzEsNTAsCisJMzcsMTYsNjcsMCw0OCwwLDMsMzYsOCwwLDY3LDIwLAorCTMzLDMyLDY0LDIsMTYsMCwxNzYsMTc1LDMzLDQwLDMyLDIsCisJMzMsNDgsMTkyLDIsMTM1LDgxLDE5MiwxMiwzMyw1NiwyMjQsMiwKKwkxMTcsODEsMTkyLDgsMzMsMTI4LDY0LDAsMywxMzEsMyw2MCwKKwkxNDAsMTcsOTksMzYsMCwwLDk4LDE0MCwwLDAsMCwwLAorCTEsMCw2NiwzNiwwLDAsOTgsMTcyLDMzLDEyOCwwLDAsCisJMywwLDAsMjIsMCwwLDAsMCwxNjcsODMsMTkyLDEyLAorCTMzLDMyLDY0LDIsMTgzLDg4LDE5MiwxMiwzMywzMiwzMiwyLAorCTMzLDE2LDAsMiw4MCwwLDE5MSwxNDMsNzYsMCwxODMsMTQzLAorCTcyLDAsMTgyLDE0Myw2OCwwLDE4MSwxNDMsNjQsMCwxODAsMTQzLAorCTYwLDAsMTc5LDE0Myw1NiwwLDE3OCwxNDMsNTIsMCwxNzcsMTQzLAorCTQ4LDAsMTc2LDE0Myw4LDAsMjI0LDMsODgsMCwxODksMzksCisJMTc2LDI1NSwxODksMzksNzYsMCwxOTEsMTc1LDcyLDAsMTgyLDE3NSwKKwk2OCwwLDE4MSwxNzUsNjQsMCwxODAsMTc1LDYwLDAsMTc5LDE3NSwKKwk1NiwwLDE3OCwxNzUsNTIsMCwxNzcsMTc1LDQ4LDAsMTc2LDE3NSwKKwkzMywxMjgsMTI4LDAsMzMsMTM2LDE2MCwwLDMzLDE2MCwxOTIsMCwKKwkzMywxNjgsMjI0LDAsOTYsMCwxODIsMTQzLDI0LDAsMTYwLDE3NSwKKwkzMywzMiwzMiwyLDI0LDAsMTY1LDM5LDIsMCw2LDM2LAorCTIzOSw5MCwxOTIsMTIsMzMsNTYsMCwwLDY0LDAsMiwxNzQsCisJMjQsMCwxNjIsMTQzLDAsMCwwLDAsMTU1LDAsNjQsMjAsCisJMCwwLDAsMCw2NCwwLDIsMTQyLDAsMCwwLDAsCisJNCwwLDY0LDE2LDMzLDMyLDMyLDIsMywxMzEsMyw2MCwKKwk2MCw4MiwxOTIsOCwxNDgsMTcsOTksMzYsMTYsMCwxNjAsMTc1LAorCTcyLDAsNSwzOCwyNCwwLDE2NiwzOSwxMTAsOTAsMTkyLDEyLAorCTQsMCw3LDM2LDI0LDAsMTYyLDE0MywwLDAsMCwwLAorCTEzOSwwLDY0LDIwLDAsMCwwLDAsMTk2LDg4LDE5MiwxMiwKKwkzMywzMiwzMiwyLDIyNCwwLDY2LDQ4LDE2MCwwLDMsMzYsCisJMTMzLDAsNjcsMjAsMzMsMzIsMzIsMiwxMjQsODksMTkyLDEyLAorCTI0LDAsMTY1LDM5LDMzLDE0NCw2NCwwLDMzLDMyLDMyLDIsCisJMTk4LDg5LDE5MiwxMiwyNCwwLDE2NSwzOSwzMywxNTIsNjQsMCwKKwkyNCwwLDE2MiwxNDMsMCwwLDAsMCwxMjIsMCw2NCwyMCwKKwkwLDAsMCwwLDI1NSwyNTUsNjYsNTAsNSwwLDY2LDQ0LAorCTExOCwwLDY0LDE2LDAsMCwwLDAsOCwwLDM0LDE0MiwKKwk0LDAsMzUsMTQyLDAsMCwwLDAsMzUsMTYsNjcsMCwKKwkyNTUsMjU1LDk5LDUwLDMzLDE2LDY3LDAsMTEwLDAsMTk0LDIyLAorCTMzLDMyLDAsMiw4OCwwLDE4LDE2Niw5MCwwLDE5LDE2NiwKKwkzMyw0MCwxMjgsMiwxNzgsNTAsMTkyLDEyLDMzLDQ4LDE2MCwyLAorCTExOCwwLDY0LDIwLDMzLDE2LDAsMCwyNTUsMjU1LDY3LDUwLAorCTQsMCwyLDM2LDI0LDAsOTgsMTYsMzMsMzIsMzIsMiwKKwkyNCwwLDE2NSwzOSwyLDAsNiwzNiwyMzksOTAsMTkyLDEyLAorCTMzLDU2LDAsMCw5MiwwLDIsMTc0LDMzLDMyLDMyLDIsCisJMjQsMCwxNjUsMzksMiwwLDYsMzYsMjM5LDkwLDE5MiwxMiwKKwkzMyw1NiwwLDAsOTYsMCwyLDE3NCwzMywzMiwzMiwyLAorCTI0LDAsMTY1LDM5LDIsMCw2LDM2LDIzOSw5MCwxOTIsMTIsCisJMzMsNTYsMCwwLDEwMCwwLDIsMTc0LDI0LDAsMTYyLDE0MywKKwkwLDAsMCwwLDc4LDAsNjQsMjAsMzMsMzIsMzIsMiwKKwk2Nyw4MiwxOTIsOCwxMDQsMCw1LDM4LDQsMCwyLDM2LAorCTg4LDAsMiwxNjYsOTAsMCwxOSwxNjYsMTI0LDAsMCwxNzQsCisJMTYsMCwxNjAsMTc1LDkyLDAsNSwzOCwyNCwwLDE2NiwzOSwKKwkxODYsOTEsMTkyLDEyLDYsMCw3LDM2LDI0LDAsMTYyLDE0MywKKwkwLDAsMCwwLDYzLDAsNjQsMjAsMTAwLDAsNCwzOCwKKwkzMyw0MCwwLDAsMTQ0LDcxLDE5MiwxMiw0LDAsNiwzNiwKKwkzMiwwLDE2MCwxNjcsNDAsMCwxNjAsMTc1LDM2LDAsMTYwLDE3NSwKKwk0NCwwLDE2MCwxNjcsMzIsMCwxNzgsMzksNjQsMCwyLDM2LAorCTE2LDAsMTYyLDE3NSwzMywzMiwzMiwyLDMzLDQwLDY0LDIsCisJMjQsMCwxNjYsMzksMTEwLDkwLDE5MiwxMiwzMyw1NiwwLDAsCisJMjQsMCwxNjIsMTQzLDAsMCwwLDAsNSwwLDY0LDE2LAorCTAsMCwwLDAsMjQsOTIsMTkyLDEyLDMzLDMyLDY0LDIsCisJNTgsODIsMTkyLDgsMCwwLDAsMCw0MCwwLDE2MiwxNDMsCisJMzYsMCwxNjMsMTQzLDAsMCwwLDAsMzUsMTYsNjcsMCwKKwkyNTUsMjU1LDcwLDQ4LDUsMCwxOTQsNDQsMiwwLDY0LDIwLAorCTAsMCwwLDAsNCwwLDYsMzYsOCwwLDE5MiwxNiwKKwkzMywzMiwzMiwyLDM2LDAsMTY1LDE0MywwLDAsMCwwLAorCTgwLDY4LDE5MiwxMiwxMDAsMCw0LDM4LDI0LDkyLDE5MiwxMiwKKwkzMiwwLDE2NCwzOSwzMywzMiwzMiwyLDI0LDAsMTY1LDM5LAorCTIsMCw2LDM2LDIzOSw5MCwxOTIsMTIsMzMsNTYsMCwwLAorCTEwNCwwLDIsMTc0LDMzLDMyLDMyLDIsMjQsMCwxNjUsMzksCisJMiwwLDYsMzYsMjM5LDkwLDE5MiwxMiwzMyw1NiwwLDAsCisJMTA4LDAsMiwxNzQsMzMsMzIsMzIsMiwyNCwwLDE2NSwzOSwKKwkzLDAsNiwzNiwyMzksOTAsMTkyLDEyLDY0LDAsNywzNiwKKwkxMTIsMCwyLDE3NCwyNCwwLDE2MiwxNDMsMCwwLDAsMCwKKwk5LDAsNjQsMTYsMzMsMzIsMzIsMiwzLDEzMSwzLDYwLAorCTE0MCwxNyw5OSwzNiwwLDAsOTgsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDAsMCw5OCwxNzIsNzMsODIsMTkyLDgsCisJMzMsMTYsMCwwLDExNiwwLDUsMzgsMzMsNDgsMTkyLDIsCisJMTYzLDgyLDE5MiwxMiwzMyw1NiwwLDIsMjU1LDI1NSwzLDM2LAorCTI0OCwyNTUsNjcsMTYsMzMsMTYsMCwyLDc2LDAsMTkxLDE0MywKKwk3MiwwLDE4MiwxNDMsNjgsMCwxODEsMTQzLDY0LDAsMTgwLDE0MywKKwk2MCwwLDE3OSwxNDMsNTYsMCwxNzgsMTQzLDUyLDAsMTc3LDE0MywKKwk0OCwwLDE3NiwxNDMsOCwwLDIyNCwzLDgwLDAsMTg5LDM5LAorCTE4NCwyNTUsMTg5LDM5LDY0LDAsMTkxLDE3NSw2MCwwLDE4MywxNzUsCisJNTYsMCwxODIsMTc1LDUyLDAsMTgxLDE3NSw0OCwwLDE4MCwxNzUsCisJNDQsMCwxNzksMTc1LDQwLDAsMTc4LDE3NSwzNiwwLDE3NywxNzUsCisJMzIsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwxNiwwLDE2MCwxNzUsCisJOCwwLDIsMTQyLDQsMCwzLDE0MiwwLDAsMCwwLAorCTM1LDE4NCw2NywwLDMzLDE0NCwwLDAsMjU1LDI1NSwxNjIsNDgsCisJNDUsMCw2NCwxNiwzMywxMzYsMCwwLDMsMTMxLDE5LDYwLAorCTE0MCwxNywxMTUsMzgsMjU1LDI1NSwyMiwzNiwyNTUsMjU1LDE4MSw0OCwKKwk4LDAsMywxNDIsNCwwLDIsMTQyLDAsMCwwLDAsCisJMzUsMTYwLDk4LDAsMCwwLDIsMTQ2LDAsMCwwLDAsCisJMTI4LDAsNjYsNDgsMzIsMCw2NCwyMCwzMywzMiwwLDIsCisJMTI0LDg5LDE5MiwxMiwxNiwwLDE2NSwzOSwzMywzMiwwLDIsCisJMTk4LDg5LDE5MiwxMiwxNiwwLDE2NSwzOSwzMyw0MCw2NCwwLAorCTE2LDAsMTYyLDE0MywwLDAsMCwwLDYsMCw2NCwyMCwKKwkzMywzMiwwLDIsMjU1LDI1NSwxNjUsNDgsMjUxLDg4LDE5MiwxMiwKKwkxLDAsNiwzNiw3LDAsODYsMjAsMCwwLDAsMCwKKwkwLDAsOTgsMTQyLDAsMCwwLDAsMSwwLDY2LDM2LAorCTAsMCw5OCwxNzQsMTQ3LDgyLDE5Miw4LDI1NSwyNTUsMTcsMzYsCisJOCwwLDIsMTQyLDQsMCwzLDE0MiwwLDAsMCwwLAorCTM1LDE2LDY3LDAsMzMsMTYsNjYsMiwzNSwxNDQsODQsMCwKKwkyNTUsMjU1LDY2LDUwLDQzLDE2LDg1LDAsMjE3LDI1NSw2NCwyMCwKKwkxLDAsNDksMzgsMzMsMzIsMCwyLDMzLDQwLDIyNCwyLAorCTI1MSw4OCwxOTIsMTIsMzMsNDgsMCwwLDMzLDE2LDMyLDIsCisJNjQsMCwxOTEsMTQzLDYwLDAsMTgzLDE0Myw1NiwwLDE4MiwxNDMsCisJNTIsMCwxODEsMTQzLDQ4LDAsMTgwLDE0Myw0NCwwLDE3OSwxNDMsCisJNDAsMCwxNzgsMTQzLDM2LDAsMTc3LDE0MywzMiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDcyLDAsMTg5LDM5LDE5MiwyNTUsMTg5LDM5LAorCTU2LDAsMTkxLDE3NSw1MiwwLDE4MSwxNzUsNDgsMCwxODAsMTc1LAorCTQ0LDAsMTc5LDE3NSw0MCwwLDE3OCwxNzUsMzYsMCwxNzcsMTc1LAorCTMyLDAsMTc2LDE3NSwzMywxNDQsMTI4LDAsMzMsMTUyLDE2MCwwLAorCTMzLDE2OCwyMjQsMCwxNiwwLDE2MCwxNzUsMTI0LDg5LDE5MiwxMiwKKwkxNiwwLDE2NSwzOSwzMywzMiw2NCwyLDE5OCw4OSwxOTIsMTIsCisJMTYsMCwxNjUsMzksMCwwLDk4LDE2NiwxNiwwLDE2MiwxNDMsCisJMCwwLDAsMCwyOCwwLDY0LDIwLDAsMCwwLDAsCisJMTIsMCw2NiwxNDIsOCwwLDY3LDE0MiwwLDAsMCwwLAorCTM1LDE2LDY3LDAsMCwwLDk5LDE1MCwyNTUsMjU1LDY2LDQ4LAorCTIwLDAsOTgsMjAsMCwwLDAsMCw0LDAsOTYsMTc0LAorCTAsMCwxMDEsMTUwLDAsMCwwLDAsODMsODIsMTkyLDEyLAorCTMzLDMyLDY0LDIsMzMsMzIsNjQsMCwyNTUsMjU1LDIsMzYsCisJNDYsMCwxMzAsMTYsMCwwLDAsMCwzLDAsMTI4LDIwLAorCTAsMCwwLDAsMjQ2LDgyLDE5Miw4LDgsMCw5NiwxNzQsCisJMjI0LDgzLDE5MiwxMiw0LDAsMTAwLDE3NCwxMCwwLDY0LDIwLAorCTgsMCw5OCwxNzQsMjQ3LDgyLDE5Miw4LDI1NSwyNTUsMiwzNiwKKwkzLDEzMSwzLDYwLDE0MCwxNyw5OSwzNiwwLDAsOTgsMTQwLAorCTAsMCwwLDAsMSwwLDY2LDM2LDIxMCw4MiwxOTIsOCwKKwkwLDAsOTgsMTcyLDgsMCwxMTIsMTQyLDQsMCw5OCwxNDIsCisJMCwwLDAsMCwyMywwLDY0LDI0LDMzLDEzNiwwLDAsCisJMjU1LDI1NSwyMCwzNiwzMywzMiw2NCwyLDEyNCw4OSwxOTIsMTIsCisJMTYsMCwxNjUsMzksMzMsMzIsNjQsMiwxOTgsODksMTkyLDEyLAorCTE2LDAsMTY1LDM5LDQsMCwyLDE2NiwxNiwwLDE2MiwxNDMsCisJMCwwLDAsMCwyMzMsMjU1LDY0LDIwLDMzLDMyLDY0LDIsCisJMzMsNDAsMCwyLDAsODMsMTkyLDEyLDMzLDQ4LDE2MCwyLAorCTIyNiwyNTUsODQsMTYsMSwwLDQ5LDM4LDQsMCw5OCwxNDIsCisJMCwwLDAsMCw0MiwxNiwzNCwyLDIzNiwyNTUsNjQsMjAsCisJNjgsMCwxNiwzOCwzMywxNiwwLDAsNTYsMCwxOTEsMTQzLAorCTUyLDAsMTgxLDE0Myw0OCwwLDE4MCwxNDMsNDQsMCwxNzksMTQzLAorCTQwLDAsMTc4LDE0MywzNiwwLDE3NywxNDMsMzIsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw2NCwwLDE4OSwzOSwxODQsMjU1LDE4OSwzOSwKKwk2OCwwLDE5MSwxNzUsNjQsMCwxODAsMTc1LDYwLDAsMTc5LDE3NSwKKwk1NiwwLDE3OCwxNzUsNTIsMCwxNzcsMTc1LDQ4LDAsMTc2LDE3NSwKKwkzMywxMjgsMTI4LDAsMzMsMTQ0LDE2MCwwLDI0LDAsMTYwLDE3NSwKKwkxNiwwLDE2MCwxNzUsOCwwLDY5LDM4LDI0LDAsMTY2LDM5LAorCTE4Niw5MSwxOTIsMTIsNiwwLDcsMzYsMjQsMCwxNjIsMTQzLAorCTAsMCwwLDAsMTAzLDAsNjQsMjAsMCwwLDAsMCwKKwkxOTYsODgsMTkyLDEyLDMzLDMyLDAsMiwyMjQsMCw4NCw0OCwKKwkzMywzMiwwLDIsMTI0LDg5LDE5MiwxMiwyNCwwLDE2NSwzOSwKKwkzMywxNTIsNjQsMCwzMywzMiwwLDIsMTk4LDg5LDE5MiwxMiwKKwkyNCwwLDE2NSwzOSwzMywxMzYsNjQsMCwyNCwwLDE2MiwxNDMsCisJMCwwLDAsMCw4OCwwLDY0LDIwLDM3LDE2LDExNiwyLAorCTE4LDAsODEsMTY2LDE2LDAsNjYsMTYyLDE2LDAsNjcsMTQ2LAorCTY0LDAsMiwzNiw0OCwwLDk4LDE2LDY1LDAsOTgsNDAsCisJMTYsMCw2NCwxNiw0LDAsMiwzNiwzMSwwLDk4LDE2LAorCTUsMCw5OCw0MCw1LDAsNjQsMTYsMiwwLDIsMzYsCisJMjIsMCw5OCwxNiwzMywzMiwwLDIsMTIxLDgzLDE5Miw4LAorCTAsMCwwLDAsNSwwLDIsMzYsNjUsMCw5OCwxNiwKKwk2LDAsMiwzNiwyNywwLDk4LDE2LDMzLDMyLDAsMiwKKwkxMjEsODMsMTkyLDgsMCwwLDAsMCw2OCwwLDIsMzYsCisJMTUsMCw5OCwxNiw2OCwwLDk4LDQwLDgsMCw2NCwyMCwKKwkzMywzMiwwLDIsMTMxLDAsOTgsNDAsNTcsMCw2NCwxNiwKKwkxMjgsMCw5OCw0MCw1MSwwLDY0LDE2LDAsMCwwLDAsCisJMTIxLDgzLDE5Miw4LDAsMCwwLDAsMjU1LDI1NSwzNyw1MCwKKwkxNjQsOTAsMTkyLDEyLDI0LDAsMTY2LDM5LDExNyw4MywxOTIsOCwKKwk0MCwwLDY2LDE3NCwzMywzMiwwLDIsMjU1LDI1NSwzNyw1MCwKKwk0MCwwLDcwLDM4LDE5LDkwLDE5MiwxMiwyNCwwLDE2NywzOSwKKwkxMTcsODMsMTkyLDgsMCwwLDAsMCwyNTUsMjU1LDM3LDUwLAorCTQwLDAsNzAsMzgsMjQsOTEsMTkyLDEyLDI0LDAsMTY3LDM5LAorCTExNyw4MywxOTIsOCwwLDAsMCwwLDQwLDAsNjgsMzgsCisJMzMsNDAsMCwwLDE0NCw3MSwxOTIsMTIsNCwwLDYsMzYsCisJMzIsMCwxNjAsMTY3LDQwLDAsMTYwLDE3NSwzNiwwLDE2MCwxNzUsCisJNDQsMCwxNjAsMTY3LDMzLDMyLDAsMiwyNTUsMjU1LDM3LDUwLAorCTMyLDAsMTY2LDM5LDE5LDkwLDE5MiwxMiwyNCwwLDE2NywzOSwKKwk0MCwwLDE2MiwxNDMsMzYsMCwxNjMsMTQzLDAsMCwwLDAsCisJMzUsMTYsNjcsMCwyNTUsMjU1LDcwLDQ4LDUsMCwxOTQsNDQsCisJMiwwLDY0LDIwLDAsMCwwLDAsNCwwLDYsMzYsCisJNywwLDE5MiwxNiwwLDAsMCwwLDM2LDAsMTY1LDE0MywKKwkwLDAsMCwwLDgwLDY4LDE5MiwxMiw0MCwwLDY4LDM4LAorCTI0LDkyLDE5MiwxMiwzMiwwLDE2NCwzOSwyNCwwLDE2MiwxNDMsCisJMCwwLDAsMCw4LDAsNjQsMTYsMzMsMTYsMCwwLAorCTMsMTMxLDMsNjAsMTQwLDE3LDk5LDM2LDAsMCw5OCwxNDAsCisJMCwwLDAsMCwxLDAsNjYsMzYsMCwwLDk4LDE3MiwKKwkyNTUsMjU1LDIsMzYsNjgsMCwxOTEsMTQzLDY0LDAsMTgwLDE0MywKKwk2MCwwLDE3OSwxNDMsNTYsMCwxNzgsMTQzLDUyLDAsMTc3LDE0MywKKwk0OCwwLDE3NiwxNDMsOCwwLDIyNCwzLDcyLDAsMTg5LDM5LAorCTIzMiwyNTUsMTg5LDM5LDIwLDAsMTkxLDE3NSwxNiwwLDE3NiwxNzUsCisJMzMsMTI4LDEyOCwwLDc2LDAsMiwxNDIsMCwwLDAsMCwKKwkzLDAsNjQsMTYsMCwwLDAsMCwyNCw5MiwxOTIsMTIsCisJNzIsMCw0LDM4LDg4LDAsMywxNTAsNCwwLDIsMzYsCisJNSwwLDk4LDIwLDAsMCwwLDAsMTEwLDg2LDE5MiwxMiwKKwk5MiwwLDQsMzgsMTU3LDgzLDE5Miw4LDExNiwwLDQsMzgsCisJMTMsODQsMTkyLDEyLDEwNCwwLDQsMzgsMTIwLDAsNCwzOCwKKwkxMyw4NCwxOTIsMTIsMCwwLDAsMCwxNDgsMCwzLDE0NiwKKwkwLDAsMCwwLDI0OCw4MywxOTIsMTIsMzMsMzIsMCwyLAorCTIwLDAsMTkxLDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTI0LDAsMTg5LDM5LDIzMiwyNTUsMTg5LDM5LDIwLDAsMTkxLDE3NSwKKwkxNiwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLDUsMCwwLDE4LAorCTAsMCwwLDAsMTM2LDgzLDE5MiwxMiwwLDAsMCwwLAorCTYxLDUwLDE5MiwxMiwzMywzMiwwLDIsMjAsMCwxOTEsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMjQsMCwxODksMzksCisJMjI0LDI1NSwxODksMzksMjQsMCwxOTEsMTc1LDIwLDAsMTc3LDE3NSwKKwkxNiwwLDE3NiwxNzUsMzMsMTM2LDEyOCwwLDksNTAsMTkyLDEyLAorCTE2LDAsNCwzNiwzMywxMjgsNjQsMCwxMSwwLDAsMTgsCisJMzMsMzIsMCwyLDMzLDQwLDAsMCwxNDQsNzEsMTkyLDEyLAorCTE2LDAsNiwzNiwyMjQsODMsMTkyLDEyLDMzLDMyLDMyLDIsCisJNCwwLDY0LDE2LDgsMCwyLDE3NCw0LDAsMTcsMTc0LAorCTIwNCw4MywxOTIsOCwzMywxNiwwLDIsNjEsNTAsMTkyLDEyLAorCTMzLDMyLDAsMiwzMywxNiwwLDAsMjQsMCwxOTEsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTMyLDAsMTg5LDM5LDIzMiwyNTUsMTg5LDM5LDIwLDAsMTkxLDE3NSwKKwkxNiwwLDE3NiwxNzUsOSw1MCwxOTIsMTIsMTUyLDAsNCwzNiwKKwkzMywxMjgsNjQsMCw0LDAsMCwxOCwzMywxNiwwLDAsCisJMjQ4LDgzLDE5MiwxMiwzMywzMiwwLDIsMzMsMTYsMCwyLAorCTIwLDAsMTkxLDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTI0LDAsMTg5LDM5LDIyNCwyNTUsMTg5LDM5LDI0LDAsMTkxLDE3NSwKKwkyMCwwLDE3NywxNzUsMCwxNyw0LDAsMzMsMTYsNjgsMCwKKwkxMjgsMTM2LDIsMCwxMSwwLDMyLDE4LDE2LDAsMTc2LDE3NSwKKwk5LDUwLDE5MiwxMiwzMywzMiwzMiwyLDMzLDEyOCw2NCwwLAorCTQsMCwwLDE4LDMzLDMyLDAsMiwzMyw0MCwwLDAsCisJMTQ0LDcxLDE5MiwxMiwzMyw0OCwzMiwyLDI0Myw4MywxOTIsOCwKKwkzMywxNiwwLDIsMzMsMTYsMCwwLDI0LDAsMTkxLDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwyMCwwLDE5MSwxNzUsCisJMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwzMyw0MCwwLDAsCisJMTQ0LDcxLDE5MiwxMiwxNTIsMCw2LDM2LDI1NSwwLDIsMzYsCisJODgsMCwyLDE2NiwxMjAsNSwyLDM2LDU4LDAsMiwxNjYsCisJNzIsMCwwLDE2Niw4MCwwLDAsMTc0LDc2LDAsMCwxNzQsCisJODQsMCwwLDE2NiwxNDgsMCwwLDE2MiwxNDksMCwwLDE2MiwKKwkyMCwwLDE5MSwxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkyNCwwLDE4OSwzOSwyMDgsMjU1LDE4OSwzOSw0MCwwLDE5MSwxNzUsCisJMzYsMCwxNzksMTc1LDMyLDAsMTc4LDE3NSwyOCwwLDE3NywxNzUsCisJMjQsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwzMSwwLDAsMTgsCisJMSwwLDE5LDM2LDgsMCwxOCwxNDIsMCwwLDAsMCwKKwkxNiwwLDY0LDE4LDAsMCwwLDAsNCwwLDIsMTQyLAorCTAsMCwwLDAsOSwwLDY0LDI0LDMzLDEzNiwwLDAsCisJNTksODQsMTkyLDEyLDMzLDMyLDY0LDIsMSwwLDQ5LDM4LAorCTQsMCwyLDE0MiwwLDAsMCwwLDQyLDE2LDM0LDIsCisJMjQ5LDI1NSw2NCwyMCw2OCwwLDgyLDM4LDgsMCw0LDE0MiwKKwk2MSw1MCwxOTIsMTIsMCwwLDAsMCwxMiwwLDE3LDE0MiwKKwk0LDAsOTYsMTgsMCwwLDAsMCwzMywxNTIsMCwwLAorCTQ5LDg0LDE5Miw4LDQsMCwwLDE3NCw2MSw1MCwxOTIsMTIsCisJMzMsMzIsMCwyLDMzLDEyOCwzMiwyLDIyNywyNTUsMCwyMiwKKwkwLDAsMCwwLDQwLDAsMTkxLDE0MywzNiwwLDE3OSwxNDMsCisJMzIsMCwxNzgsMTQzLDI4LDAsMTc3LDE0MywyNCwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDQ4LDAsMTg5LDM5LDIzMiwyNTUsMTg5LDM5LAorCTIwLDAsMTkxLDE3NSwxNiwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLAorCTYwLDAsMiwxNDIsMCwwLDAsMCw0LDAsNjQsMTYsCisJMCwwLDAsMCw5LDI0OCw2NCwwLDAsMCwwLDAsCisJNjAsMCwwLDE3NCwxMTAsODYsMTkyLDEyLDgsMCw0LDM4LAorCTc4LDg0LDE5MiwxMiwzMywzMiwwLDIsMjAsMCwxOTEsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMjQsMCwxODksMzksCisJMjMyLDI1NSwxODksMzksMTYsMCwxOTEsMTc1LDE2LDAsMTMxLDE0NCwKKwk2LDAsMiwzNiwxOCwwLDk4LDE2LDcsMCw5OCw0MCwKKwk1LDAsNjQsMTYsNCwwLDIsMzYsNiwwLDk4LDE2LAorCTAsMCwwLDAsMTAzLDg0LDE5Miw4LDAsMCwwLDAsCisJNjgsMCwyLDM2LDExLDAsOTgsMjAsMCwwLDAsMCwKKwk0NCwwLDEzMCwxNDAsMCwwLDAsMCw3LDAsNjQsMTYsCisJMCwwLDAsMCwyNCw5MiwxOTIsMTIsNDAsMCwxMzIsMzYsCisJMTAzLDg0LDE5Miw4LDAsMCwwLDAsMTEwLDg2LDE5MiwxMiwKKwk0MCwwLDEzMiwzNiwxNiwwLDE5MSwxNDMsMjQsMCwxODksMzksCisJOCwwLDIyNCwzLDAsMCwwLDAsMCwwLDAsMCwKKwkyMTYsMjU1LDE4OSwzOSwzMiwwLDE5MSwxNzUsMjgsMCwxNzksMTc1LAorCTI0LDAsMTc4LDE3NSwyMCwwLDE3NywxNzUsMTYsMCwxNzYsMTc1LAorCTMzLDEzNiwxOTIsMCw1NiwwLDE3OSwxNDMsMCwwLDAsMCwKKwkyMCw3MiwxOTIsMTIsMzMsMTQ0LDIyNCwwLDMzLDEyOCw2NCwwLAorCTExLDAsMCwxOCwzMywzMiwzMiwyLDMzLDQwLDY0LDIsCisJODAsODYsMTkyLDEyLDgsMCw2LDM4LDI1NSwyNTUsMywzNiwKKwk1LDAsNjcsMTYsMiwwLDIsMzYsMTYsMCwyLDE2MiwKKwk0MCwwLDE5LDE3NCwxMzMsODQsMTkyLDgsMzMsMTYsMCwwLAorCTI1NSwyNTUsMiwzNiwzMiwwLDE5MSwxNDMsMjgsMCwxNzksMTQzLAorCTI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0MCwwLDE4OSwzOSwyMTYsMjU1LDE4OSwzOSwKKwkzMiwwLDE5MSwxNzUsMjgsMCwxNzcsMTc1LDI0LDAsMTc2LDE3NSwKKwkzMywxMjgsMTI4LDAsOTYsMCw1LDE3NCwxMDAsMCw2LDE3NCwKKwkxMjgsMCwyLDE0MiwwLDAsMCwwLDExLDAsNjQsMTYsCisJMCwwLDAsMCwxMyw4NCwxOTIsMTIsMTA0LDAsNCwzOCwKKwkxMjQsMCwyLDE0MiwwLDAsMCwwLDEwOCwwLDIsMTc0LAorCTEyOCwwLDIsMTQyLDAsMCwwLDAsMTEyLDAsMiwxNzQsCisJMTI4LDAsMCwxNzQsMTI0LDAsMCwxNzQsODgsMCwxNywxNTAsCisJMiwwLDIsMzYsODgsMCwyLDE2NiwxNzYsODAsMTkyLDEyLAorCTMzLDMyLDAsMiwzMyw1Niw2NCwwLDY0LDAsMiwxNDIsCisJMCwwLDAsMCwzNSwwLDY0LDIwLDI1NSwyNTUsMzUsNTAsCisJMywwLDIsMzYsMTQsMCw5OCwxNiwyNTUsMjU1LDIyNyw0OCwKKwk1OCwwLDIsMTUwLDAsMCwwLDAsNDMsMTYsNjcsMCwKKwk5LDAsNjQsMTYsMTIsMCw0LDM4LDQ4LDAsMiwxNDIsCisJMjgsMCw1LDM4LDUyLDAsNywxNDIsMCwwLDAsMCwKKwk5LDI0OCw2NCwwLDEsMCw2LDM2LDIxNCw4NCwxOTIsOCwKKwkwLDAsMCwwLDk2LDAsMiwxNDIsMCwwLDAsMCwKKwkyNTAsMjU1LDY3LDM2LDEzLDAsOTgsNDQsMTMsMCw2NCwxNiwKKwkxMjgsMTYsMywwLDIsMTMxLDEsNjAsMzMsOCwzNCwwLAorCTMyLDE1NCwzNCwxNDAsMCwwLDAsMCw4LDAsNjQsMCwKKwkwLDAsMCwwLDIwNCw4NCwxOTIsOCwyLDAsMiwzNiwKKwkyMDQsODQsMTkyLDgsMywwLDIsMzYsNSwwLDIsMzYsCisJOTYsMCwyLDE3NCw1MiwwLDIsMTQyLDAsMCwwLDAsCisJMTYsMCwxNjIsMTc1LDQ0LDAsMiwxNDIsMTIsMCw0LDM4LAorCTI4LDAsNSwzOCwzMyw0OCwwLDIsOSwyNDgsNjQsMCwKKwkyNTUsMjU1LDIzMSw0OCwzMiwwLDE5MSwxNDMsMjgsMCwxNzcsMTQzLAorCTI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsNDAsMCwxODksMzksCisJMjI0LDI1NSwxODksMzksMjgsMCwxOTEsMTc1LDI0LDAsMTc2LDE3NSwKKwkzMywxMjgsMTI4LDAsOTYsMCw1LDE0MiwwLDAsMCwwLAorCTYsMCwxNjAsMTYsMCwwLDAsMCwxMDAsMCw2LDE0MiwKKwkxNDAsODQsMTkyLDEyLDAsMCwwLDAsNTYsODUsMTkyLDgsCisJMCwwLDAsMCwxNzYsODAsMTkyLDEyLDMzLDMyLDAsMiwKKwkzMyw1Niw2NCwwLDg4LDAsMiwxNTAsMCwwLDAsMCwKKwkyLDAsNjYsNDQsMTEsMCw2NCwxNiwyNTUsMjU1LDIyNyw0OCwKKwk1OCwwLDIsMTUwLDAsMCwwLDAsNDMsMTYsNjcsMCwKKwk2LDAsNjQsMTYsMzMsMzIsMCwyLDEsMCw1LDM2LAorCTE0MCw4NCwxOTIsMTIsMzMsNDgsMCwwLDU2LDg1LDE5Miw4LAorCTAsMCwwLDAsOTYsMCwyLDE0MiwwLDAsMCwwLAorCTQ5LDAsNjQsMjAsMiwwLDIsMzYsODgsMCwzLDE1MCwKKwkzLDAsMiwzNiwzMywwLDk4LDE2LDQsMCw5OCw0MCwKKwk3LDAsNjQsMTYsMiwwLDk4LDQwLDQxLDAsNjQsMTYsCisJMiwwLDIsMzYsMzksMCw5Niw0LDAsMCwwLDAsCisJMTMsODUsMTkyLDgsMCwwLDAsMCw1LDAsMiwzNiwKKwkzNCwwLDk4LDIwLDIsMCwyLDM2LDMsMTMxLDMsNjAsCisJMjM2LDE3LDk5LDM2LDAsMCw5OCwxNDAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMTA0LDAsNCwzOCwyNSwwLDEyOCwxNiwKKwkwLDAsOTgsMTcyLDMsMTMxLDUsNjAsMTc2LDE3LDE2NSwzNiwKKwkwLDAsMTYyLDE0MCwxMDgsMCwzLDE0MiwwLDAsMCwwLAorCTMzLDE2LDY3LDAsMCwwLDE2MiwxNzIsMTIsMCwxMzIsMTQwLAorCTAsMCwwLDAsMjQ4LDI1NSwxMjgsMjAsMiwwLDIsMzYsCisJNDcsODUsMTkyLDgsODgsMCwyLDE2NiwzLDEzMSw0LDYwLAorCTIzNiwxNywxMzIsMzYsMCwwLDEzMCwxNDAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMCwwLDEzMCwxNzIsMjAwLDI1NSwxMzAsMTQwLAorCTEwOCwwLDMsMTQyLDAsMCwwLDAsMzMsMTYsNjcsMCwKKwkyMDAsMjU1LDEzMCwxNzIsMiwwLDIsMzYsODgsMCwyLDE2NiwKKwk1MiwwLDIsMTQyLDAsMCwwLDAsMTYsMCwxNjIsMTc1LAorCTQ0LDAsMiwxNDIsMTIsMCw0LDM4LDI4LDAsNSwzOCwKKwkzMyw0OCwwLDIsOSwyNDgsNjQsMCwyNTUsMjU1LDIzMSw0OCwKKwkyOCwwLDE5MSwxNDMsMjQsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwyMCwwLDE5MSwxNzUsCisJMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCw4OCwwLDMsMTUwLAorCTEsMCwyLDM2LDI1LDAsOTgsMTYsMiwwLDk4LDQwLAorCTUsMCw2NCwxNiwzLDAsMiwzNiw3LDAsOTYsMTYsCisJMCwwLDAsMCwxMTYsODUsMTkyLDgsMCwwLDAsMCwKKwkzNywwLDk4LDE2LDAsMCwwLDAsMTE2LDg1LDE5Miw4LAorCTAsMCwwLDAsMTEyLDAsNCwxNDIsMTA4LDAsMywxNDIsCisJMCwwLDAsMCwzNCwwLDk2LDE2LDAsMCwwLDAsCisJMTcsMCwxMzAsMTQ0LDAsMCwwLDAsMiwwLDY2LDQ4LAorCTMzLDAsNjQsMTYsMjU1LDI1NSw5OSwzNiwyNTAsMjU1LDk2LDIwLAorCTY4LDAsMTMyLDM2LDExNiw4NSwxOTIsOCwwLDAsMCwwLAorCTExMiwwLDQsMTQyLDEwOCwwLDMsMTQyLDAsMCwwLDAsCisJOCwwLDk2LDE2LDAsMCwwLDAsMTcsMCwxMzAsMTQ0LAorCTAsMCwwLDAsMiwwLDY2LDQ4LDE5LDAsNjQsMTYsCisJMjU1LDI1NSw5OSwzNiwyNTAsMjU1LDk2LDIwLDY4LDAsMTMyLDM2LAorCTExOCw5MywxOTIsMTIsMzMsMzIsMCwyLDI0MSwyNTUsNjQsMjgsCisJMjU1LDI1NSw2Niw0MCw3LDAsNjQsMTYsMCwwLDAsMCwKKwk5Miw4NSwxOTIsOCwwLDAsMCwwLDEyMCw5NCwxOTIsMTIsCisJMzMsMzIsMCwyLDUsMCw2NCwyMCwwLDAsMCwwLAorCTIxOSw4NCwxOTIsMTIsMzMsMzIsMCwyLDE2Nyw4MywxOTIsMTIsCisJMzMsMzIsMCwyLDIwLDAsMTkxLDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDI0LDAsMTg5LDM5LDIzMiwyNTUsMTg5LDM5LAorCTIwLDAsMTkxLDE3NSwxNiwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLAorCTg4LDAsMywxNTAsMSwwLDIsMzYsMTcsMCw5OCwxNiwKKwkyLDAsOTgsNDAsNSwwLDY0LDE2LDMsMCwyLDM2LAorCTksMCw5NiwxNiwwLDAsMCwwLDE1Niw4NSwxOTIsOCwKKwkwLDAsMCwwLDEzLDAsOTgsMTYsNSwwLDIsMzYsCisJNywwLDk4LDE2LDAsMCwwLDAsMTU2LDg1LDE5Miw4LAorCTAsMCwwLDAsNjAsOTUsMTkyLDEyLDMzLDMyLDAsMiwKKwkxNTQsODUsMTkyLDgsMCwwLDAsMCwwLDkzLDE5MiwxMiwKKwkzMywzMiwwLDIsMTU0LDg1LDE5Miw4LDAsMCwwLDAsCisJMjUyLDkzLDE5MiwxMiwzMywzMiwwLDIsNSwwLDY0LDIwLAorCTAsMCwwLDAsNjAsODUsMTkyLDEyLDMzLDMyLDAsMiwKKwkxNjIsODUsMTkyLDgsMCwwLDAsMCwxNjcsODMsMTkyLDEyLAorCTMzLDMyLDAsMiwyMCwwLDE5MSwxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywyNCwwLDE4OSwzOSwxOTIsMjU1LDE4OSwzOSwKKwk2MCwwLDE5MSwxNzUsNTYsMCwxODIsMTc1LDUyLDAsMTgxLDE3NSwKKwk0OCwwLDE4MCwxNzUsNDQsMCwxNzksMTc1LDQwLDAsMTc4LDE3NSwKKwkzNiwwLDE3NywxNzUsMzIsMCwxNzYsMTc1LDMzLDY0LDEyOCwwLAorCTMzLDEzNiwxOTIsMCwzMywxNTIsMjI0LDAsODQsMCwxODIsMTQzLAorCTg4LDAsMTgxLDE0Myw5MiwwLDE4MCwxNDMsODAsMCwxNzgsMTUxLAorCTMsMTMxLDMsNjAsMTI4LDE3LDk5LDM2LDAsMCw5OCwxNDAsCisJMCwwLDAsMCwxLDAsNjYsMzYsMCwwLDk4LDE3MiwKKwkyNCwwLDE2MiwzOSwxNiwwLDE2MiwxNzUsMzMsMzIsMTYwLDAsCisJMTYsODEsMTkyLDEyLDMzLDQwLDAsMSwzMywxMjgsNjQsMCwKKwk1NywwLDAsMTgsMjU1LDI1NSw2Niw1MCw1OCwwLDMsMTUwLAorCTAsMCwwLDAsNDMsMTYsNjcsMCwyLDAsNjQsMTYsCisJMCwwLDAsMCw1OCwwLDE4LDE2Niw0NCwwLDIyLDE3NCwKKwk0OCwwLDIxLDE3NCw1MiwwLDIwLDE3NCwyNCwwLDE2MiwxNDMsCisJMCwwLDAsMCw3LDAsNjQsMTYsMSwwLDIsMzYsCisJMjE5LDg0LDE5MiwxMiwzMywzMiwwLDIsMTY3LDgzLDE5MiwxMiwKKwkzMywzMiwwLDIsNSw4NiwxOTIsOCwwLDAsMCwwLAorCTg4LDAsMywxNTAsMCwwLDAsMCwxNiwwLDk4LDE2LAorCTIsMCw5OCw0MCw1LDAsNjQsMTYsMywwLDIsMzYsCisJOSwwLDk2LDE2LDAsMCwwLDAsMjQ0LDg1LDE5Miw4LAorCTAsMCwwLDAsMTEsMCw5OCwxNiw1LDAsMiwzNiwKKwkzMSwwLDk4LDE2LDAsMCwwLDAsMjQ0LDg1LDE5Miw4LAorCTAsMCwwLDAsMywxMzEsMyw2MCwyMzksODUsMTkyLDgsCisJMTg0LDE3LDk5LDM2LDMsMTMxLDMsNjAsMjM5LDg1LDE5Miw4LAorCTE4OCwxNyw5OSwzNiwzLDEzMSwzLDYwLDE5MiwxNyw5OSwzNiwKKwkwLDAsOTgsMTQwLDAsMCwwLDAsMSwwLDY2LDM2LAorCTMsODYsMTkyLDgsMCwwLDk4LDE3MiwzLDEzMSwzLDYwLAorCTE0MCwxNyw5OSwzNiwwLDAsOTgsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDAsMCw5OCwxNzIsMTY3LDgzLDE5MiwxMiwKKwkzMywzMiwwLDIsMzMsMzIsMzIsMiwzMyw0MCw5NiwyLAorCTEsMCw2LDM2LDksMjQ4LDE2MCwyLDMzLDU2LDEyOCwyLAorCTUsODYsMTkyLDgsMCwwLDAsMCwxMjQsODUsMTkyLDEyLAorCTMzLDMyLDAsMiw2MCwwLDE5MSwxNDMsNTYsMCwxODIsMTQzLAorCTUyLDAsMTgxLDE0Myw0OCwwLDE4MCwxNDMsNDQsMCwxNzksMTQzLAorCTQwLDAsMTc4LDE0MywzNiwwLDE3NywxNDMsMzIsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw2NCwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwKKwkyMCwwLDE5MSwxNzUsMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwKKwkyMTMsODAsMTkyLDEyLDI1NSwyNTUsMTk4LDQ4LDUzLDAsNjQsMjAsCisJMjU1LDI1NSwyLDM2LDMsMTMxLDMsNjAsMTQ0LDE3LDk5LDM2LAorCTAsMCw5OCwxNDAsMCwwLDAsMCwxLDAsNjYsMzYsCisJMCwwLDk4LDE3Miw5NiwwLDIsMTQyLDAsMCwwLDAsCisJMzIsMCw2NCwxNiw0LDAsMiwzNiw5MiwwLDk4LDE0MCwKKwkwLDAsMCwwLDEsMCw2NiwzNiw5MiwwLDk4LDE3MiwKKwk5NiwwLDIsMTQyLDAsMCwwLDAsMjU1LDI1NSw2NywzNiwKKwk1LDAsOTgsNDQsMzIsMCw2NCwxNiwxMjgsMTYsMywwLAorCTIsMTMxLDEsNjAsMzMsOCwzNCwwLDg4LDE1NCwzNCwxNDAsCisJMCwwLDAsMCw4LDAsNjQsMCwwLDAsMCwwLAorCTMsMTMxLDMsNjAsNzAsODYsMTkyLDgsMjA0LDE3LDk5LDM2LAorCTMsMTMxLDMsNjAsNzAsODYsMTkyLDgsMjEyLDE3LDk5LDM2LAorCTMsMTMxLDMsNjAsNzAsODYsMTkyLDgsMjE2LDE3LDk5LDM2LAorCTMsMTMxLDMsNjAsNzAsODYsMTkyLDgsMjA4LDE3LDk5LDM2LAorCTMsMTMxLDMsNjAsNzAsODYsMTkyLDgsMjIwLDE3LDk5LDM2LAorCTg4LDAsMywxNTAsMCwwLDAsMCw4LDAsOTgsMjAsCisJMzMsMTYsMCwwLDMsMTMxLDMsNjAsMjQwLDE3LDk5LDM2LAorCTAsMCw5OCwxNDAsMCwwLDAsMCwxLDAsNjYsMzYsCisJMCwwLDk4LDE3MiwzMywxNiwwLDAsMjAsMCwxOTEsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMjQsMCwxODksMzksCisJMCwwLDAsMCwyMjQsMjU1LDE4OSwzOSwyOCwwLDE5MSwxNzUsCisJMjQsMCwxNzgsMTc1LDIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsCisJMzMsMTQ0LDE2MCwwLDMzLDEyOCwxOTIsMCw0LDAsMCwxNzQsCisJMTQsMCwxMjgsMTYsMCwwLDQsMTc0LDEyOCwxMzYsNCwwLAorCTksNTAsMTkyLDEyLDMzLDMyLDMyLDIsMywwLDY0LDIwLAorCTQsMCwyLDE3NCwxMDQsODYsMTkyLDgsMjU1LDI1NSwyLDM2LAorCTUsMCwzMiwxOCwzMyw0MCw2NCwyLDQsMCw0LDE0MiwKKwkwLDAsMCwwLDgwLDY4LDE5MiwxMiwzMyw0OCwzMiwyLAorCTMzLDE2LDAsMCwyOCwwLDE5MSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTMyLDAsMTg5LDM5LDIzMiwyNTUsMTg5LDM5LDIwLDAsMTkxLDE3NSwKKwkxNiwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLDQsMCw0LDE0MiwKKwkwLDAsMCwwLDQsMCwxMjgsMTYsMCwwLDAsMCwKKwk2MSw1MCwxOTIsMTIsMCwwLDAsMCw0LDAsMCwxNzQsCisJMCwwLDAsMTc0LDIwLDAsMTkxLDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDI0LDAsMTg5LDM5LDAsMCwwLDAsCisJMCwwLDAsMCwxMSwwLDEyOCw0LDEyOCwwLDEzMCw0MCwKKwkyMCwwLDY0LDIwLDEsMCwzLDM2LDI1NSwxMjcsMiwzNiwKKwk0MiwxNiw2OCwwLDE2LDAsNjQsMTYsMiwwLDMsMzYsCisJMTI3LDAsMiw2MCwyNTUsMjU1LDY2LDUyLDE0OCw4NiwxOTIsOCwKKwk0MiwxNiw2OCwwLDEyOCwyNTUsMTMwLDQwLDksMCw2NCwxNiwKKwkxLDAsMywzNiwwLDEyOCwxMzAsNDAsNiwwLDY0LDE2LAorCTIsMCwzLDM2LDEyOCwyNTUsMiw2MCw0MiwxNiwxMzAsMCwKKwkyLDAsNjQsMjAsNCwwLDMsMzYsMywwLDMsMzYsCisJOCwwLDIyNCwzLDMzLDE2LDk2LDAsMTI4LDAsMTMwLDQ0LAorCTE0LDAsNjQsMjAsMSwwLDIsMzYsMjU1LDEyNywyLDM2LAorCTQzLDE2LDY4LDAsOSwwLDY0LDE2LDEyNywwLDIsNjAsCisJMjU1LDI1NSw2Niw1Miw0MywxNiw2OCwwLDYsMCw2NCwxNiwKKwkzLDAsMiwzNiw0LDAsMTI4LDQsNSwwLDIsMzYsCisJMTY5LDg2LDE5Miw4LDQsMCwyLDM2LDIsMCwyLDM2LAorCTgsMCwyMjQsMywwLDAsMCwwLDQsMCwxMzUsMTQwLAorCTAsMCwxMzAsMTQwLDAsMCwwLDAsNjUsMCw2NCwxNiwKKwkzMywxNiwwLDAsMCwwLDIyNywxNDAsNCwwLDIzMSwzNiwKKwkxMjgsMTYsMywwLDMzLDE2LDY3LDAsMTkyLDE2LDIsMCwKKwkwLDAsMjI3LDE0MCwwLDAsMCwwLDMzLDI0LDY3LDAsCisJMTI4LDAsOTgsNDQsMTcsMCw2NCwyMCw0LDAsMjMxLDM2LAorCTAsNjQsOTgsNDQsMTUsMCw2NCwyMCwyLDAsNSwzNiwKKwkzMSwwLDIsNjAsMjU1LDI1NSw2Niw1Miw0MywxNiw2NywwLAorCTcsMCw2NCwxNiwyNTUsMTUsMiw2MCwyNTUsMjU1LDY2LDUyLAorCTQzLDE2LDY3LDAsNiwwLDY0LDIwLDUsMCw1LDM2LAorCTIwNCw4NiwxOTIsOCw0LDAsNSwzNiwyMDQsODYsMTkyLDgsCisJMywwLDUsMzYsMSwwLDUsMzYsMiwwLDYsMzYsCisJMCwwLDEzMCwxNDAsMCwwLDAsMCw0MiwxNiwxOTQsMCwKKwkzMSwwLDY0LDE2LDI1NSwyNTUsMTYyLDQ4LDMxLDAsOSw2MCwKKwkyNTUsMjU1LDQxLDUzLDI1NSwxNSw4LDYwLDI1NSwyNTUsOCw1MywKKwkwLDAsMTMyLDE0MCwwLDAsMjI3LDE0MCw0LDAsMjMxLDM2LAorCTEyOCwwLDk4LDQ0LDE2LDAsNjQsMjAsMjU1LDI1NSwxNjUsNDgsCisJMCw2NCw5OCw0NCwxMSwwLDY0LDIwLDQzLDE2LDM1LDEsCisJNywwLDY0LDE2LDQzLDE2LDMsMSwzLDAsNjQsMjAsCisJMCwwLDAsMCwyMzYsODYsMTkyLDgsNCwwLDE2NSwzNiwKKwkyMzYsODYsMTkyLDgsNSwwLDE2NSwzNiwyMzYsODYsMTkyLDgsCisJMywwLDE2NSwzNiwyMzYsODYsMTkyLDgsMiwwLDE2NSwzNiwKKwkxLDAsMTY1LDM2LDEsMCwxOTgsMzYsNDIsMTYsMTk2LDAsCisJMjMyLDI1NSw2NCwyMCwyNTUsMjU1LDE2Miw0OCw4LDAsMjI0LDMsCisJMCwwLDAsMCwyMDgsMjU1LDE4OSwzOSw0MCwwLDE5MSwxNzUsCisJMzMsNzIsMTkyLDAsMjI0LDAsMTY1LDQ4LDI1NSwyNTUsMTMwLDQ4LAorCTMxLDAsNjYsNDQsNywwLDY0LDE2LDMzLDQ4LDE2MCwwLAorCTM3LDE2LDEzMywwLDE2LDAsMTYyLDE2MywzMywzMiwyMjQsMCwKKwkxNiwwLDE2NSwzOSwzOCw4NywxOTIsOCwxLDAsNiwzNiwKKwkzMiwwLDE2MywzOSwzMyw0MCwwLDAsMzEsMCwxOTQsNTIsCisJMjQsMCwxNjIsMTYzLDI1NSwyNTUsMTMwLDQ4LDgsMCw2NCwxNiwKKwkyNSwwLDE2OCwzOSwxMjcsMCwxMzAsNDgsMCwwLDk4LDE2MCwKKwkxLDAsOTksMzYsMjU1LDI1NSwxMzAsNDgsMTk0LDMzLDIsMCwKKwkyNTAsMjU1LDEyOCwyMCwxLDAsMTY1LDM2LDEsMCwxNjYsMzYsCisJMzMsMTYsMTYwLDAsMjU1LDI1NSw2Niw0OCwyLDAsNjYsNDQsCisJMTMsMCw2NCwyMCwyNTUsMjU1LDE2NSwzNiwyNTUsMjU1LDQsNTIsCisJMjU1LDI1NSw5OSwzNiwwLDAsOTgsMTQ0LDAsMCwwLDAsCisJMTI4LDAsNjYsNTIsMCwwLDIsMTYxLDEsMCw4LDM3LAorCTMzLDE2LDE2MCwwLDI1NSwyNTUsNjYsNDgsMiwwLDY2LDQ0LAorCTI0NiwyNTUsNjQsMTYsMzMsNDAsMTY0LDAsMjU1LDI1NSw5OCwxNDQsCisJMCwwLDAsMCwwLDAsMiwxNjEsMzMsMzIsMjI0LDAsCisJMjQsMCwxNjUsMzksMjU1LDI1NSwxOTgsNDgsOSwyNDgsMzIsMSwKKwkwLDAsMCwwLDQwLDAsMTkxLDE0Myw0OCwwLDE4OSwzOSwKKwk4LDAsMjI0LDMsMCwwLDAsMCwyMDgsMjU1LDE4OSwzOSwKKwk0MCwwLDE5MSwxNzUsMzMsNzIsMTYwLDAsMjU1LDI1NSwxMzAsNDgsCisJMTI4LDAsNjYsNDQsNiwwLDY0LDE2LDMzLDY0LDE5MiwwLAorCTE2LDAsMTY0LDE2MywzMywzMiwwLDEsMTYsMCwxNjUsMzksCisJODgsODcsMTkyLDgsMSwwLDYsMzYsMjQsMCwxNjcsMzksCisJMzIsMCwxNjUsMzksMjU1LDI1NSwxMzAsNDgsNywwLDY0LDE2LAorCTMzLDI0LDAsMCwwLDAsMTY0LDE2MCwxLDAsMTY1LDM2LAorCTI1NSwyNTUsMTMwLDQ4LDIsMzQsMiwwLDI1MSwyNTUsMTI4LDIwLAorCTEsMCw5OSwzNiwxMjgsMCw5OCw1MiwwLDAsMjI2LDE2MCwKKwkxLDAsMjMxLDM2LDEsMCwxMDIsMzYsMzMsMTYsOTYsMCwKKwkyNTUsMjU1LDY2LDQ4LDExLDAsNjQsMTYsMjU1LDI1NSw5OSwzNiwKKwkyNTUsMjU1LDQsNTIsMjU1LDI1NSwxNjUsMzYsMCwwLDE2MiwxNDQsCisJMCwwLDAsMCwwLDAsMjI2LDE2MCwxLDAsMjMxLDM2LAorCTMzLDE2LDk2LDAsMjU1LDI1NSw2Niw0OCwyNDgsMjU1LDY0LDIwLAorCTMzLDI0LDEwMCwwLDMzLDMyLDAsMSwyNCwwLDE2NSwzOSwKKwkyNTUsMjU1LDE5OCw0OCw5LDI0OCwzMiwxLDAsMCwwLDAsCisJNDAsMCwxOTEsMTQzLDQ4LDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDIwMCwyNTUsMTg5LDM5LDQ4LDAsMTkxLDE3NSwKKwk0NCwwLDE4MSwxNzUsNDAsMCwxODAsMTc1LDM2LDAsMTc5LDE3NSwKKwkzMiwwLDE3OCwxNzUsMjgsMCwxNzcsMTc1LDI0LDAsMTc2LDE3NSwKKwkzMywxMzYsMTYwLDAsMzMsMTQ0LDE5MiwwLDMzLDE1MiwyMjQsMCwKKwk3MiwwLDE4MCwxNDMsMzMsMTI4LDEyOCwwLDEyOCw4NiwxOTIsMTIsCisJMzMsMzIsNjQsMiwzMywxNjgsNjQsMCwyNTUsMjU1LDQsNTAsCisJMTkyLDAsMzcsNTAsMzMsNDgsOTYsMiwyNDIsODYsMTkyLDEyLAorCTMzLDU2LDEyOCwyLDI1NSwyNTUsMTc2LDUwLDMzLDMyLDAsMiwKKwkzMyw0MCw5NiwyLDQ0LDg3LDE5MiwxMiwzMyw0OCwxMjgsMiwKKwkxNiwwLDE2MiwzOSwzMywyNCw4MCwwLDI1NSwyNTUsOTksMzYsCisJNiwwLDk4LDE2LDAsMCwxMTQsMTYwLDE2LDAsMTYyLDM5LAorCTMsMTQ2LDE4LDAsMjU1LDI1NSw5OSwzNiwyNTMsMjU1LDk4LDIwLAorCTAsMCwxMTQsMTYwLDMzLDMyLDEyOCwyLDE2LDAsMTY1LDM5LAorCTksMjQ4LDk2LDIsMjU1LDI1NSwxNjYsNTAsNDgsMCwxOTEsMTQzLAorCTQ0LDAsMTgxLDE0Myw0MCwwLDE4MCwxNDMsMzYsMCwxNzksMTQzLAorCTMyLDAsMTc4LDE0MywyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw1NiwwLDE4OSwzOSwyMDAsMjU1LDE4OSwzOSwKKwk0OCwwLDE5MSwxNzUsNDQsMCwxODEsMTc1LDQwLDAsMTgwLDE3NSwKKwkzNiwwLDE3OSwxNzUsMzIsMCwxNzgsMTc1LDI4LDAsMTc3LDE3NSwKKwkyNCwwLDE3NiwxNzUsMzMsMTM2LDE2MCwwLDMzLDE0NCwxOTIsMCwKKwkzMywxNjAsMjI0LDAsNzIsMCwxODEsMTQzLDMzLDEyOCwxMjgsMCwKKwkxNTMsODYsMTkyLDEyLDMzLDMyLDY0LDIsMzMsMTUyLDY0LDAsCisJMjU1LDI1NSw0LDUwLDE5MiwwLDM3LDUwLDMzLDQ4LDEyOCwyLAorCTI0Miw4NiwxOTIsMTIsMzMsNTYsMTYwLDIsMjU1LDI1NSwxMTIsNTAsCisJMzMsMzIsMCwyLDMzLDQwLDEyOCwyLDQ0LDg3LDE5MiwxMiwKKwkzMyw0OCwxNjAsMiwxNiwwLDE2MiwzOSwzMywzMiw4MCwwLAorCTksMCwwLDE4LDI1NSwyNTUsOTksMzgsMjU1LDI1NSw1LDUyLAorCTI1NSwyNTUsMTMyLDM2LDAsMCwxNDYsMTYwLDIsMTQ2LDE4LDAsCisJMzMsMTYsOTYsMCwyNTUsMjU1LDY2LDQ4LDI1MCwyNTUsNjQsMjAsCisJMzMsMjQsMTAxLDAsMzMsMzIsMTYwLDIsMTYsMCwxNjUsMzksCisJOSwyNDgsMTI4LDIsMjU1LDI1NSwxMDIsNTAsNDgsMCwxOTEsMTQzLAorCTQ0LDAsMTgxLDE0Myw0MCwwLDE4MCwxNDMsMzYsMCwxNzksMTQzLAorCTMyLDAsMTc4LDE0MywyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw1NiwwLDE4OSwzOSwyMTYsMjU1LDE4OSwzOSwKKwkzMiwwLDE5MSwxNzUsMjgsMCwxNzksMTc1LDI0LDAsMTc4LDE3NSwKKwkyMCwwLDE3NywxNzUsMTYsMCwxNzYsMTc1LDMzLDE1MiwxOTIsMCwKKwk1NiwwLDE3OCwxNDMsNjAsMCwxNzcsMTQzLDMzLDEyOCwyMjQsMCwKKwkyNTUsMjU1LDEzMiw0OCwxOTIsMCwxNjUsNDgsMzMsNDgsNjQsMiwKKwkyNDIsODYsMTkyLDEyLDMzLDU2LDMyLDIsMjU1LDI1NSwxNiw1MCwKKwkzMywzMiwwLDIsMzMsNDAsNjQsMiw0NCw4NywxOTIsMTIsCisJMzMsNDgsMzIsMiw0LDAsMCwxOCwzMywzMiwzMiwyLAorCTMzLDQwLDk2LDIsOSwyNDgsNjQsMiwzMyw0OCwwLDIsCisJMzIsMCwxOTEsMTQzLDI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDAsMCwxODksMzksMjI0LDI1NSwxODksMzksMjQsMCwxOTEsMTc1LAorCTMzLDcyLDE2MCwwLDEyOCwwLDEzMCw0NCwxOCwwLDY0LDIwLAorCTMzLDY0LDE5MiwwLDAsNjQsMTMwLDQ0LDEzLDAsNjQsMjAsCisJMzEsMCwyLDYwLDI1NSwyNTUsNjYsNTIsNDMsMTYsNjgsMCwKKwk3LDAsNjQsMTYsMjU1LDE1LDIsNjAsMjU1LDI1NSw2Niw1MiwKKwk0MywxNiw2OCwwLDgsMCw2NCwyMCw1LDAsNiwzNiwKKwkyNTAsODcsMTkyLDgsNCwwLDYsMzYsMjUwLDg3LDE5Miw4LAorCTMsMCw2LDM2LDI1MCw4NywxOTIsOCwyLDAsNiwzNiwKKwkxLDAsNiwzNiwyNTUsMjU1LDE5NCw0OCwxNiwwLDE2MywzOSwKKwkzMyw0MCw5OCwwLDksMCwxNjMsMTYsMzMsNTYsMCwwLAorCTE2LDAsMTYzLDM5LDI1NSwyNTUsMTY1LDM2LDEyNywwLDEzMCw0OCwKKwkzNywxNiwyMjYsMCwwLDAsMTYyLDE2MCwxOTQsMzMsNCwwLAorCTI1MCwyNTUsMTYzLDIwLDEyOCwwLDcsMzYsMzMsMzIsMCwxLAorCTE2LDAsMTY1LDM5LDksMjQ4LDMyLDEsMjU1LDI1NSwxOTgsNDgsCisJMjQsMCwxOTEsMTQzLDMyLDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDIwOCwyNTUsMTg5LDM5LDQ0LDAsMTkxLDE3NSwKKwk0MCwwLDE4MiwxNzUsMzYsMCwxODEsMTc1LDMyLDAsMTgwLDE3NSwKKwkyOCwwLDE3OSwxNzUsMjQsMCwxNzgsMTc1LDIwLDAsMTc3LDE3NSwKKwkxNiwwLDE3NiwxNzUsMzMsMTQ0LDE2MCwwLDMzLDE2OCwxOTIsMCwKKwkzMywxNjAsMjI0LDAsNjQsMCwxODIsMTQzLDMzLDEzNiwxMjgsMCwKKwk0LDAsMTc5LDE0MiwwLDAsMCwwLDE3MSw4NiwxOTIsMTIsCisJMzMsMzIsMTYwLDIsMzMsMTI4LDY0LDAsMjU1LDI1NSwzNiw1MCwKKwkxOTIsMCw2OSw1MCwzMyw0OCwxMjgsMiwyNDIsODYsMTkyLDEyLAorCTMzLDU2LDE5MiwyLDI1NSwyNTUsMTYsNTAsMzMsMzIsMCwyLAorCTMzLDQwLDEyOCwyLDQ0LDg3LDE5MiwxMiwzMyw0OCwxOTIsMiwKKwkyMywwLDAsMTgsMzMsNDAsMTI4LDIsMCwwLDk4LDE0MiwKKwk0LDAsMTE1LDM4LDEyOCwzMiwyLDAsMzMsMzIsMTMwLDAsCisJMTkyLDMyLDQsMCwwLDAsOTgsMTQyLDQsMCwxMTUsMzgsCisJMzMsMzIsMTMwLDAsMjI2LDg3LDE5MiwxMiwzMyw0OCwxOTIsMiwKKwk2Myw4OCwxOTIsOCwyLDAsMTYsMzYsMCwwLDEwMCwxNDIsCisJNCwwLDExNSwzOCwyMjYsODcsMTkyLDEyLDMzLDQ4LDE5MiwyLAorCTEsMCwxNiwzOCwwLDAsMTYyLDE0MiwwLDAsMCwwLAorCTQyLDE2LDIsMiwyNDcsMjU1LDY0LDIwLDMzLDQwLDEyOCwyLAorCTQ0LDAsMTkxLDE0Myw0MCwwLDE4MiwxNDMsMzYsMCwxODEsMTQzLAorCTMyLDAsMTgwLDE0MywyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQ4LDAsMTg5LDM5LDIyNCwyNTUsMTg5LDM5LDI4LDAsMTkxLDE3NSwKKwkyNCwwLDE3OCwxNzUsMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwKKwkzMywxMzYsMTI4LDAsMzMsMTQ0LDE5MiwwLDI1NSwyNTUsNjcsNTAsCisJMTIsMCwzNCwxNTAsMCwwLDAsMCw0MywxNiw2NywwLAorCTQsMCw2NCwxNiwxLDAsMiwzNiwxMiwwLDUwLDE1MCwKKwkwLDAsMCwwLDI1NSwyNTUsNjcsNTAsMTEsMCw5OCwxNiwKKwkyLDAsOTgsNDAsNSwwLDY0LDE2LDIsMCwyLDM2LAorCTUwLDAsOTYsMTYsMjU1LDI1NSw4MCw1MCwxMzcsODgsMTkyLDgsCisJMCwwLDAsMCwxNSwwLDk4LDE2LDI1NSwyNTUsODAsNTAsCisJMTM3LDg4LDE5Miw4LDAsMCwwLDAsOCwwLDM1LDE0MiwKKwkwLDAsMCwwLDEsMCw5OCwzNiw4LDAsMzQsMTc0LAorCTAsMCwxNjIsMTQ0LDAsMCwwLDAsMCwwLDk4LDE2MCwKKwkxMiwwLDM0LDE1MCwwLDAsMCwwLDI1NSwyNTUsNjYsMzYsCisJMTQ5LDg4LDE5Miw4LDEyLDAsMzQsMTY2LDgsMCwzNSwxNDIsCisJMCwwLDAsMCwxLDAsOTgsMzYsOCwwLDM0LDE3NCwKKwkwLDAsMTYyLDE0NCwwLDAsMCwwLDAsMCw5OCwxNjAsCisJOCwwLDM1LDE0MiwwLDAsMCwwLDEsMCw5OCwzNiwKKwk4LDAsMzQsMTc0LDEsMCwxNjIsMTQ0LDAsMCwwLDAsCisJMCwwLDk4LDE2MCwxMiwwLDM0LDE1MCwwLDAsMCwwLAorCTI1NCwyNTUsNjYsMzYsMTQ5LDg4LDE5Miw4LDEyLDAsMzQsMTY2LAorCTgsMCwzNiwxNDIsMCwwLDAsMCw4MCw2OCwxOTIsMTIsCisJMzMsNDgsMCwyLDEyLDAsMzQsMTUwLDAsMCwwLDAsCisJMzUsMTYsODIsMCwxMiwwLDM0LDE2Niw4LDAsMzQsMTQyLAorCTAsMCwwLDAsMzMsMTI4LDIsMiw4LDAsNDgsMTc0LAorCTI1NSwyNTUsNjYsNTAsMjgsMCwxOTEsMTQzLDI0LDAsMTc4LDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyMjQsMjU1LDE4OSwzOSwyNCwwLDE5MSwxNzUsCisJMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwzMywxMjgsMTYwLDAsCisJMTAsMCwxMjgsMjAsMzMsMTM2LDE5MiwwLDksNTAsMTkyLDEyLAorCTE2LDAsNCwzNiwzMywzMiw2NCwwLDMsMCwxMjgsMjAsCisJMSwwLDIsMzYsMTc4LDg4LDE5Miw4LDMzLDE2LDAsMCwKKwkxNzMsODgsMTkyLDgsMCwwLDEzMCwxNjAsMCwwLDEyOCwxNjAsCisJNCwwLDE0NCwxNzIsOCwwLDE0NCwxNzIsMzMsMTYsMTcsMiwKKwkxMiwwLDEzMCwxNzIsMzMsMTYsMTI4LDAsMjQsMCwxOTEsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTMyLDAsMTg5LDM5LDIzMiwyNTUsMTg5LDM5LDE2LDAsMTkxLDE3NSwKKwkwLDAsMTMwLDE0NCwwLDAsMCwwLDEsMCw2Niw0OCwKKwkzLDAsNjQsMTYsMCwwLDAsMCw2MSw1MCwxOTIsMTIsCisJMCwwLDAsMCwxNiwwLDE5MSwxNDMsMjQsMCwxODksMzksCisJOCwwLDIyNCwzLDAsMCwwLDAsMCwwLDEzMCwxNDQsCisJMCwwLDAsMCwxMjgsMCw2Niw0OCwxNiwwLDY0LDIwLAorCTI1NSwyNTUsMiwzNiw4LDAsMTMwLDE0MCwxMiwwLDEzMSwxNDAsCisJMCwwLDAsMCw0MywxNiw2NywwLDcsMCw2NCwyMCwKKwkwLDAsMCwwLDAsMCwxMzAsMTQ0LDAsMCwwLDAsCisJMTI4LDAsNjYsNTIsMCwwLDEzMCwxNjAsMjE2LDg4LDE5Miw4LAorCTI1NSwyNTUsMiwzNiw4LDAsMTMwLDE0MCwwLDAsMCwwLAorCTAsMCw2NiwxNDQsOCwwLDIyNCwzLDAsMCwwLDAsCisJMzAsMCwxOTIsMjQsMzMsNTYsMTkyLDAsMCwwLDEzMCwxNDQsCisJMCwwLDAsMCwxMjgsMCw2Niw0OCwxNiwwLDY0LDIwLAorCTI1NSwwLDMsMzYsOCwwLDEzMSwxNDAsMTIsMCwxMzAsMTQwLAorCTAsMCwwLDAsNDMsMTYsOTgsMCw1LDAsNjQsMTYsCisJMSwwLDk4LDM2LDgsMCwxMzAsMTcyLDAsMCw5OSwxNDQsCisJMjQwLDg4LDE5Miw4LDAsMCwwLDAsMCwwLDEzMCwxNDQsCisJMCwwLDAsMCwxMjgsMCw2Niw1MiwwLDAsMTMwLDE2MCwKKwkyNTUsMCwzLDM2LDAsMCwxMzAsMTQ0LDAsMCwwLDAsCisJMTI4LDAsNjYsNDgsNSwwLDY0LDIwLDAsMCwwLDAsCisJMCwwLDE2MywxNjAsMjU1LDI1NSwxOTgsMzYsMjI4LDI1NSwxOTIsMjgsCisJMSwwLDE2NSwzNiw4LDAsMjI0LDMsMzUsMTYsMjMwLDAsCisJMSwwLDIsMzYsMTUsMCwxOTQsMTYsMiwwLDE5NCw0MCwKKwk1LDAsNjQsMTYsMiwwLDIsMzYsNywwLDE5MiwxNiwKKwkyNTUsMjU1LDIsMzYsNDAsODksMTkyLDgsMCwwLDAsMCwKKwkxMSwwLDE5NCwxNiwyNTUsMjU1LDIsMzYsNDAsODksMTkyLDgsCisJMCwwLDAsMCw0LDAsMTMwLDE0MCwwLDAsMCwwLAorCTIxLDg5LDE5Miw4LDMzLDQwLDE2MiwwLDgsMCwxMzAsMTQwLAorCTAsMCwwLDAsMTksODksMTkyLDgsMzMsNDAsMTYyLDAsCisJMTIsMCwxMzAsMTQwLDAsMCwwLDAsMzUsNDAsNjksMCwKKwk0LDAsMTMwLDE0MCwwLDAsMCwwLDQzLDE2LDE2MiwwLAorCTE3LDAsNjQsMjAsMjU1LDI1NSwyLDM2LDEyLDAsMTMwLDE0MCwKKwkwLDAsMCwwLDQzLDE2LDY5LDAsMTIsMCw2NCwyMCwKKwkyNTUsMjU1LDIsMzYsMTIsMCwxMzAsMTQwLDAsMCwwLDAsCisJNDMsMTYsMTYyLDAsNSwwLDY0LDE2LDAsMCwwLDAsCisJMCwwLDEzMCwxNDQsMCwwLDAsMCwxMjcsMCw2Niw0OCwKKwkwLDAsMTMwLDE2MCw4LDAsMTMzLDE3MiwzMywxNiwwLDAsCisJOCwwLDIyNCwzLDAsMCwwLDAsMTIsMCwxMzAsMTQwLAorCTQsMCwxMzEsMTQwLDAsMCwwLDAsMzUsNTYsNjcsMCwKKwkxLDAsMiwzNiwxNSwwLDE5NCwxNiwyLDAsMTk0LDQwLAorCTUsMCw2NCwxNiwyLDAsMiwzNiw3LDAsMTkyLDE2LAorCTI1NSwyNTUsMiwzNiw4Nyw4OSwxOTIsOCwwLDAsMCwwLAorCTEyLDAsMTk0LDE2LDI1NSwyNTUsMiwzNiw4Nyw4OSwxOTIsOCwKKwkwLDAsMCwwLDQsMCwxMzAsMTQwLDAsMCwwLDAsCisJNjYsODksMTkyLDgsMzMsMTYsMTYyLDAsOCwwLDEzMCwxNDAsCisJMCwwLDAsMCwzMywxNiwxNjIsMCw3Miw4OSwxOTIsOCwKKwkxMiwwLDEzMCwxNzIsMTIsMCwxMzAsMTQwLDAsMCwwLDAsCisJMzUsMTYsNjksMCwxMiwwLDEzMCwxNzIsOCwwLDEzMCwxNDAsCisJMTIsMCwxMzEsMTQwLDAsMCwwLDAsNDMsMTYsNjcsMCwKKwk1LDAsNjQsMTYsMCwwLDAsMCwwLDAsMTMwLDE0NCwKKwkwLDAsMCwwLDg1LDg5LDE5Miw4LDEyNywwLDY2LDQ4LAorCTAsMCwxMzAsMTQ0LDAsMCwwLDAsMTI4LDAsNjYsNTIsCisJMCwwLDEzMCwxNjAsMzMsMTYsMjI0LDAsOCwwLDIyNCwzLAorCTAsMCwwLDAsMjMyLDI1NSwxODksMzksMjAsMCwxOTEsMTc1LAorCTE2LDAsMTc2LDE3NSwxMiwwLDEyOCwyMCwzMywxMjgsMTYwLDAsCisJOSw1MCwxOTIsMTIsMTYsMCw0LDM2LDMzLDMyLDY0LDAsCisJMywwLDEyOCwyMCwwLDAsMCwwLDExOSw4OSwxOTIsOCwKKwkzMywxNiwwLDAsMCwwLDIsMTQ2LDAsMCwwLDAsCisJMTA4LDg5LDE5Miw4LDEsMCw2Niw1MiwwLDAsMiwxNDYsCisJMCwwLDAsMCwyNTQsMCw2Niw0OCwwLDAsMTMwLDE2MCwKKwk0LDAsMiwxNDIsMCwwLDAsMCw0LDAsMTMwLDE3MiwKKwk4LDAsMiwxNDIsMCwwLDAsMCw4LDAsMTMwLDE3MiwKKwkxMiwwLDIsMTQyLDAsMCwwLDAsMTIsMCwxMzAsMTcyLAorCTMzLDE2LDEyOCwwLDIwLDAsMTkxLDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDI0LDAsMTg5LDM5LDAsMCwwLDAsCisJMCwwLDEzMCwxNDQsMCwwLDAsMCwxMjgsMCw2Niw0OCwKKwkxNywwLDY0LDIwLDMxLDAsMywzNiw4LDAsMTMxLDE0MCwKKwkxMiwwLDEzMCwxNDAsMCwwLDAsMCw0MywxNiw5OCwwLAorCTYsMCw2NCwxNiwxLDAsOTgsMzYsOCwwLDEzMCwxNzIsCisJMCwwLDk4LDE0NCwwLDAsMCwwLDE0NSw4OSwxOTIsOCwKKwkzMSwwLDY3LDQ4LDAsMCwxMzAsMTQ0LDAsMCwwLDAsCisJMTI4LDAsNjYsNTIsMCwwLDEzMCwxNjAsMzEsMCwzLDM2LAorCTAsMCwxMzAsMTQ0LDAsMCwwLDAsMTI4LDAsNjYsNDgsCisJNCwwLDY0LDE2LDEsMCwyLDM2LDAsMCwxNjIsMTcyLAorCTE5Niw4OSwxOTIsOCwzMywxNiwwLDAsMjU1LDAsOTksNDgsCisJMzEsMCwyLDM2LDYsMCw5OCwxNiwzMywxNiw5NiwwLAorCTE5Niw4OSwxOTIsOCwwLDAsMCwwLDEsMCwyLDM2LAorCTE5NSw4OSwxOTIsOCwwLDAsMTYyLDE3MiwzMyw0OCwwLDAsCisJMCwwLDEzMCwxNDQsMCwwLDAsMCwxMjgsMCw2Niw0OCwKKwkxNiwwLDY0LDIwLDI1NSwwLDMsMzYsOCwwLDEzMSwxNDAsCisJMTIsMCwxMzAsMTQwLDAsMCwwLDAsNDMsMTYsOTgsMCwKKwk1LDAsNjQsMTYsMSwwLDk4LDM2LDgsMCwxMzAsMTcyLAorCTAsMCw5OSwxNDQsMTgzLDg5LDE5Miw4LDAsMCwwLDAsCisJMCwwLDEzMCwxNDQsMCwwLDAsMCwxMjgsMCw2Niw1MiwKKwkwLDAsMTMwLDE2MCwyNTUsMCwzLDM2LDAsMCwxMzAsMTQ0LAorCTAsMCwwLDAsMTI4LDAsNjYsNDgsMjI4LDI1NSw2NCwyMCwKKwkxMjgsMCw5OCw0OCw0LDAsNjQsMTYsMTI3LDAsOTgsNDgsCisJMzcsMTYsMTk0LDAsMTYzLDg5LDE5Miw4LDE5Miw0OSwyLDAsCisJMjU1LDAsOTgsNDgsMzcsNDgsNzAsMCwyNTUsMjU1LDE5NCw0OCwKKwk4LDAsMjI0LDMsMCwwLDAsMCwwLDAsMTMwLDE0NCwKKwkwLDAsMCwwLDEyOCwwLDY2LDQ4LDE2LDAsNjQsMjAsCisJMjU1LDAsNiwzNiw4LDAsMTMxLDE0MCwxMiwwLDEzMCwxNDAsCisJMCwwLDAsMCw0MywxNiw5OCwwLDUsMCw2NCwxNiwKKwkxLDAsOTgsMzYsOCwwLDEzMCwxNzIsMCwwLDEwMiwxNDQsCisJMjE4LDg5LDE5Miw4LDAsMCwwLDAsMCwwLDEzMCwxNDQsCisJMCwwLDAsMCwxMjgsMCw2Niw1MiwwLDAsMTMwLDE2MCwKKwkyNTUsMCw2LDM2LDAsMCwxMzAsMTQ0LDAsMCwwLDAsCisJMTI4LDAsNjYsNDgsMTMsMCw2NCwyMCwxLDAsMiwzNiwKKwkyNTUsMCwxOTUsNDgsMTI4LDAsMiwzNiw0LDAsOTgsMjAsCisJMiwwLDIsMzYsMCwwLDE2MiwxNzIsMTcsOTAsMTkyLDgsCisJMjU1LDI1NSwyLDUyLDEyOCwwLDE5NCw0OCw2LDAsNjQsMjAsCisJMzMsMjQsMCwwLDE3LDkwLDE5Miw4LDI1NSwwLDE5NCw0OCwKKwkwLDAsMTYyLDE3MiwxNyw5MCwxOTIsOCwzMywxNiwwLDAsCisJMTI3LDAsMTk0LDQ4LDMyLDAsNjQsMTYsMjU1LDI1NSw3MSwzNiwKKwkwLDI2LDMsMCwwLDAsMTMwLDE0NCwwLDAsMCwwLAorCTEyOCwwLDY2LDQ4LDE2LDAsNjQsMjAsMjU1LDI1NSwxMDIsNDgsCisJOCwwLDEzMSwxNDAsMTIsMCwxMzAsMTQwLDAsMCwwLDAsCisJNDMsMTYsOTgsMCw2LDAsNjQsMTYsMSwwLDk4LDM2LAorCTgsMCwxMzAsMTcyLDAsMCw5OCwxNDQsMCwwLDAsMCwKKwk3LDkwLDE5Miw4LDM3LDI0LDE5NCwwLDAsMCwxMzAsMTQ0LAorCTAsMCwwLDAsMTI4LDAsNjYsNTIsMCwwLDEzMCwxNjAsCisJMjU1LDAsMTk1LDUyLDAsMCwxMzAsMTQ0LDAsMCwwLDAsCisJMTI4LDAsNjYsNDgsMjI0LDI1NSw2NCwyMCwxLDAsMiwzNiwKKwkzMywxNiwyMjQsMCwyNTUsMCw2Niw0OCwyMjYsMjU1LDY0LDIwLAorCTI1NSwyNTUsMjMxLDM2LDI1NSwyNTUsOTgsNDgsOCwwLDIyNCwzLAorCTAsMCwwLDAsMjE2LDI1NSwxODksMzksMzYsMCwxOTEsMTc1LAorCTMyLDAsMTgwLDE3NSwyOCwwLDE3OSwxNzUsMjQsMCwxNzgsMTc1LAorCTIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsMzMsMTUyLDEyOCwwLAorCTMzLDEyOCwxOTIsMCwzMywxNDQsMTYwLDAsMjU1LDI1NSw4MSw1MCwKKwkzMywwLDMyLDE4LDMzLDE2MCwyMjQsMCwyNTUsMjU1LDIsNTIsCisJMzAsMCwzNCwxOCwwLDAsMCwwLDksNTAsMTkyLDEyLAorCTMzLDMyLDMyLDIsMzMsMjQsNjQsMCwyOSwwLDk2LDE2LAorCTEsMCwyLDM2LDAsMCwyLDE2Niw0LDAsMywxNzQsCisJOCwwLDMsMTc0LDEyLDAsMTgsMTY2LDMzLDMyLDk2LDIsCisJOCwwLDUsMTQyLDAsMCwwLDAsMjE4LDg4LDE5MiwxMiwKKwkzMyw0OCwzMiwyLDMzLDI0LDY0LDAsMjU1LDI1NSwxMDAsNDgsCisJMTAsMCwxNDUsMjAsMSwwLDIsMzYsMTIsMCwyLDE1MCwKKwkwLDAsMCwwLDM1LDE2LDY3LDAsMTIsMCwyLDE2NiwKKwk4LDAsMiwxNDIsMCwwLDAsMCwzMywxNiwxMzAsMCwKKwk2OCw5MCwxOTIsOCw4LDAsMiwxNzQsNjgsOTAsMTkyLDgsCisJMCwwLDEzMCwxNzQsMCwwLDAsMTY2LDQsMCwwLDE3NCwKKwk4LDAsMCwxNzQsMTIsMCwwLDE2NiwzNiwwLDE5MSwxNDMsCisJMzIsMCwxODAsMTQzLDI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDAsMCwxODksMzksMjI0LDI1NSwxODksMzksMjgsMCwxOTEsMTc1LAorCTI0LDAsMTc4LDE3NSwyMCwwLDE3NywxNzUsMTYsMCwxNzYsMTc1LAorCTMzLDE0NCwxMjgsMCwzMywxMzYsMTYwLDAsMzMsMTI4LDE5MiwwLAorCTEyNCw4OSwxOTIsMTIsMzMsNDAsMCwyLDMzLDMyLDY0LDIsCisJMTk4LDg5LDE5MiwxMiwzMyw0MCwwLDIsMzMsNDAsNjQsMCwKKwkwLDAsMiwxNDIsMCwwLDAsMCw3LDAsNjQsMjAsCisJMzMsMzIsNjQsMiwyNTUsMjU1LDE2NSw0OCwzMyw0OCwzMiwyLAorCTE5LDkwLDE5MiwxMiwzMyw1NiwwLDIsMTA0LDkwLDE5Miw4LAorCTAsMCwwLDAsMCwwLDMyLDE2Niw0LDAsMzIsMTc0LAorCTgsMCwzMiwxNzQsMTIsMCwzMiwxNjYsMjgsMCwxOTEsMTQzLAorCTI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywzMiwwLDE4OSwzOSwyMTYsMjU1LDE4OSwzOSwKKwkzNiwwLDE5MSwxNzUsMzIsMCwxODAsMTc1LDI4LDAsMTc5LDE3NSwKKwkyNCwwLDE3OCwxNzUsMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwKKwkzMywxNTIsMTI4LDAsMzMsMTM2LDE2MCwwLDMzLDE0NCwxOTIsMCwKKwk1NiwwLDE3NiwxNDcsMCwwLDAsMCwxOTYsODgsMTkyLDEyLAorCTMzLDE2MCwyMjQsMCwyMjQsMCw2Niw0OCw3LDAsODAsMjAsCisJMzMsMzIsOTYsMiwxMjQsODksMTkyLDEyLDMzLDQwLDY0LDIsCisJMjU1LDI1NSw2Niw0OCwyNTUsMjU1LDEzMSw1MCw3LDAsNjcsMTYsCisJMzMsMzIsOTYsMiwwLDAsNjYsMTQyLDAsMCwwLDAsCisJMTYsMCw2NCwyMCw0LDAsMiwzNiwxNTIsOTAsMTkyLDgsCisJMCwwLDY2LDE3NCwxOTgsODksMTkyLDEyLDMzLDQwLDY0LDIsCisJMzMsNDAsNjQsMCwwLDAsNjYsMTQyLDAsMCwwLDAsCisJNywwLDY0LDIwLDMzLDMyLDk2LDIsMjU1LDI1NSwxNjUsNDgsCisJMzMsNDgsMzIsMiwxOSw5MCwxOTIsMTIsMzMsNTYsNjQsMiwKKwkxNTYsOTAsMTkyLDgsMCwwLDAsMCwwLDAsMzIsMTY2LAorCTQsMCwzMiwxNzQsOCwwLDMyLDE3NCwxMiwwLDMyLDE2NiwKKwkzNiwwLDE5MSwxNDMsMzIsMCwxODAsMTQzLDI4LDAsMTc5LDE0MywKKwkyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNDAsMCwxODksMzksMzMsNTYsMCwwLAorCTI1NSwyNTUsMTY4LDM2LDI1NSwyNTUsMTY1LDQ4LDUwLDAsMTYwLDE2LAorCTEsMCw5LDM2LDEsMCwxMiwzNiw0LDAsMTAsMzYsCisJMywwLDExLDM2LDI1NSwyNTUsNSw1MiwwLDAsMTMwLDE0NCwKKwkwLDAsMCwwLDEyOCwwLDY2LDQ4LDE2LDAsNjQsMjAsCisJMjU1LDAsMywzNiw4LDAsMTMxLDE0MCwxMiwwLDEzMCwxNDAsCisJMCwwLDAsMCw0MywxNiw5OCwwLDUsMCw2NCwxNiwKKwkxLDAsOTgsMzYsOCwwLDEzMCwxNzIsMCwwLDk5LDE0NCwKKwkxOTMsOTAsMTkyLDgsMCwwLDAsMCwwLDAsMTMwLDE0NCwKKwkwLDAsMCwwLDEyOCwwLDY2LDUyLDAsMCwxMzAsMTYwLAorCTI1NSwwLDMsMzYsMCwwLDEzMCwxNDQsMCwwLDAsMCwKKwkxMjgsMCw2Niw0OCwzLDAsNjQsMTYsMCwwLDAsMCwKKwkyMTgsOTAsMTkyLDgsMCwwLDIwNCwxNzIsMTEsMCwzMiwxNywKKwkyNTUsMjU1LDIsNDksNSwwLDc0LDIwLDMzLDcyLDAsMCwKKwkzLDAsOTYsMTYsMCwwLDAsMCwyMTgsOTAsMTkyLDgsCisJMCwwLDIwMywxNzIsMTI4LDAsOTgsNDgsMywwLDY0LDE2LAorCTAsMTgsNywwLDI1NSwyNTUsNywzNiwwLDE4LDcsMCwKKwkzNyw1Niw2NywwLDMzLDE2LDAsMSwyNTUsMjU1LDY2LDQ4LAorCTIxMiwyNTUsNjQsMjAsMzMsNjQsNSwxLDgsMCwyMjQsMywKKwkzMywxNiwyMjQsMCwyMjQsMjU1LDE4OSwzOSwyNCwwLDE5MSwxNzUsCisJMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsCisJMTI0LDg5LDE5MiwxMiwzMywxMzYsMTYwLDAsMzMsMzIsMCwyLAorCTE5OCw4OSwxOTIsMTIsMzMsNDAsMzIsMiwzMywzMiwwLDIsCisJMjU1LDI1NSw2OSw0OCwxNjQsOTAsMTkyLDEyLDMzLDQ4LDMyLDIsCisJMjQsMCwxOTEsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDMyLDAsMTg5LDM5LDIxNiwyNTUsMTg5LDM5LAorCTMyLDAsMTkxLDE3NSwyOCwwLDE3OSwxNzUsMjQsMCwxNzgsMTc1LAorCTIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsMzMsMTQ0LDEyOCwwLAorCTMzLDEzNiwxNjAsMCwzMywxNTIsMTkyLDAsMTk2LDg4LDE5MiwxMiwKKwkzMywxMjgsMjI0LDAsMjI0LDAsNjYsNDgsMjU1LDAsMTYsNTAsCisJNywwLDgwLDIwLDMzLDMyLDY0LDIsMTI0LDg5LDE5MiwxMiwKKwkzMyw0MCwzMiwyLDI1NSwyNTUsNjYsNDgsMjU1LDI1NSw5OSw1MCwKKwk4LDAsNjcsMTYsMzMsMzIsNjQsMiwwLDAsMzQsMTQyLAorCTAsMCwwLDAsMiwwLDY0LDIwLDQsMCwyLDM2LAorCTAsMCwzNCwxNzQsMTcsOTEsMTkyLDgsMzMsMTYsMCwwLAorCTE5OCw4OSwxOTIsMTIsMzMsNDAsMzIsMiwzMywzMiw2NCwyLAorCTI1NSwyNTUsNjksNDgsMTY0LDkwLDE5MiwxMiwzMyw0OCwzMiwyLAorCTMyLDAsMTkxLDE0MywyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQwLDAsMTg5LDM5LDIwOCwyNTUsMTg5LDM5LDQ0LDAsMTkxLDE3NSwKKwk0MCwwLDE4MCwxNzUsMzYsMCwxNzksMTc1LDMyLDAsMTc4LDE3NSwKKwkyOCwwLDE3NywxNzUsMjQsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwKKwkzMywxNTIsMTkyLDAsMzMsMTYwLDIyNCwwLDAsMCw5NiwxNzQsCisJNCwwLDk2LDE3NCw4LDAsMywxNDIsNCwwLDIsMTQyLAorCTAsMCwwLDAsMzUsMjQsOTgsMCwyNTUsMjU1LDE2NSw0OCwKKwkzNSwwLDE2MCwyNCwzMywxNDQsMCwwLDEsMCw2LDM2LAorCTAsMCwyLDE0NiwwLDAsMCwwLDEyOCwwLDY2LDQ4LAorCTE2LDAsNjQsMjAsMjU1LDAsNCwzNiw4LDAsNCwxNDIsCisJMTIsMCwyLDE0MiwwLDAsMCwwLDQzLDE2LDEzMCwwLAorCTUsMCw2NCwxNiwxLDAsMTMwLDM2LDgsMCwyLDE3NCwKKwkwLDAsMTMyLDE0NCw2NCw5MSwxOTIsOCwwLDAsMCwwLAorCTAsMCwyLDE0NiwwLDAsMCwwLDEyOCwwLDY2LDUyLAorCTAsMCwyLDE2MiwyNTUsMCw0LDM2LDAsMCwyLDE0NiwKKwkwLDAsMCwwLDEyOCwwLDY2LDQ4LDMsMCw2NCwxNiwKKwkxMjgsMCwxMzAsNDgsMTUwLDkxLDE5Miw4LDAsMCwxMzQsMTc0LAorCTIsMCw2NCwyMCwwLDAsMCwwLDEsMCw4MiwzOCwKKwkyNTUsMjU1LDE2NSwzNiwyMjQsMjU1LDE2MCwyOCwwLDAsMCwwLAorCTMzLDMyLDAsMiwzMyw0MCw5NiwwLDI1MSw4OCwxOTIsMTIsCisJMzMsNDgsMCwwLDY4LDAsNjQsMTgsMSwwLDgxLDM4LAorCTksNTAsMTkyLDEyLDEyOCwzMiwxNywwLDMzLDQwLDY0LDAsCisJNjMsMCwxNjAsMTYsMCwwLDAsMCwwLDAsMTEzLDE3NCwKKwk0LDAsMTAxLDE3NCw1OSwwLDY0LDI2LDMzLDU2LDAsMCwKKwkxLDAsOCwzNiwzMyw0OCwwLDAsMCwwLDIsMTQ2LAorCTAsMCwwLDAsMTI4LDAsNjYsNDgsMTYsMCw2NCwyMCwKKwkyNTUsMCw0LDM2LDgsMCwzLDE0MiwxMiwwLDIsMTQyLAorCTAsMCwwLDAsNDMsMTYsOTgsMCw1LDAsNjQsMTYsCisJMSwwLDk4LDM2LDgsMCwyLDE3NCwwLDAsMTAwLDE0NCwKKwkxMTQsOTEsMTkyLDgsMCwwLDAsMCwwLDAsMiwxNDYsCisJMCwwLDAsMCwxMjgsMCw2Niw1MiwwLDAsMiwxNjIsCisJMjU1LDAsNCwzNiwwLDAsMiwxNDYsMCwwLDAsMCwKKwkxMjgsMCw2Niw0OCwzLDAsNjQsMTYsMTkyLDQ5LDYsMCwKKwkxNTAsOTEsMTkyLDgsMCwwLDEzNiwxNzQsMTI3LDAsMTMwLDQ4LAorCTM3LDQ4LDE5NCwwLDEyOCwwLDEzMCw0OCwyMjUsMjU1LDY0LDIwLAorCTAsMCwwLDAsMTgsMCwyMjQsMjAsNDAsMCwxOTQsNDQsCisJNCwwLDY0LDE2LDgwLDAsMTk0LDQ0LDAsMCwxNjAsMTcyLAorCTE0NSw5MSwxOTIsOCw0LDAsMTY1LDM2LDUsMCw2NCwxNiwKKwkyMTYsMjU1LDE5NCwzNiwwLDAsMTY4LDE3Miw0LDAsMTY1LDM2LAorCTE0Niw5MSwxOTIsOCwwLDAsMTYyLDE3MiwyLDAsMiwzNiwKKwkwLDAsMTYyLDE3Miw0LDAsMTY1LDM2LDE3NiwyNTUsMTk0LDM2LAorCTE0Niw5MSwxOTIsOCwwLDAsMTYyLDE3MiwwLDAsMTY2LDE3MiwKKwkxLDAsMjMxLDM2LDQyLDE2LDI0MiwwLDIwMCwyNTUsNjQsMjAsCisJNCwwLDE2NSwzNiw0NCwwLDE5MSwxNDMsNDAsMCwxODAsMTQzLAorCTM2LDAsMTc5LDE0MywzMiwwLDE3OCwxNDMsMjgsMCwxNzcsMTQzLAorCTI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsNDgsMCwxODksMzksCisJMjI0LDI1NSwxODksMzksMjgsMCwxOTEsMTc1LDI0LDAsMTc4LDE3NSwKKwkyMCwwLDE3NywxNzUsMTYsMCwxNzYsMTc1LDMzLDEzNiwxMjgsMCwKKwkzMywxNDQsMTYwLDAsMzMsMTI4LDE5MiwwLDEyNCw4OSwxOTIsMTIsCisJMzMsNDAsMCwyLDMzLDMyLDMyLDIsMTk4LDg5LDE5MiwxMiwKKwkzMyw0MCwwLDIsMzMsNDAsNjQsMCwwLDAsMiwxNDIsCisJMCwwLDAsMCw1LDAsNjQsMjAsMzMsMzIsMzIsMiwKKwkyNTUsMjU1LDE2NSw0OCwzMyw0OCw2NCwyLDI0LDkxLDE5MiwxMiwKKwkzMyw1NiwwLDIsMjgsMCwxOTEsMTQzLDI0LDAsMTc4LDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyMTYsMjU1LDE4OSwzOSwzNiwwLDE5MSwxNzUsCisJMzIsMCwxODAsMTc1LDI4LDAsMTc5LDE3NSwyNCwwLDE3OCwxNzUsCisJMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwzMywxNDQsMTI4LDAsCisJMzMsMTYwLDE2MCwwLDMzLDEzNiwxOTIsMCw1NiwwLDE3NiwxNDcsCisJMCwwLDAsMCwxOTYsODgsMTkyLDEyLDMzLDE1MiwyMjQsMCwKKwkyMjQsMCw2Niw0OCw3LDAsODAsMjAsMzMsMzIsNjQsMiwKKwkxMjQsODksMTkyLDEyLDMzLDQwLDMyLDIsMjU1LDI1NSw2Niw0OCwKKwkyNTUsMjU1LDk5LDUwLDcsMCw2NywxNiwzMywzMiw2NCwyLAorCTAsMCwzNCwxNDIsMCwwLDAsMCwxNCwwLDY0LDIwLAorCTQsMCwyLDM2LDIyNiw5MSwxOTIsOCwwLDAsMzQsMTc0LAorCTE5OCw4OSwxOTIsMTIsMzMsNDAsMzIsMiwzMyw0MCw2NCwwLAorCTAsMCwzNCwxNDIsMCwwLDAsMCw1LDAsNjQsMjAsCisJMzMsMzIsNjQsMiwyNTUsMjU1LDE2NSw0OCwzMyw0OCwxMjgsMiwKKwkyNCw5MSwxOTIsMTIsMzMsNTYsMzIsMiwzNiwwLDE5MSwxNDMsCisJMzIsMCwxODAsMTQzLDI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDAsMCwxODksMzksMCwwLDAsMCwwLDAsMCwwLAorCTIxNiwyNTUsMTg5LDM5LDMyLDAsMTkxLDE3NSwyOCwwLDE3OSwxNzUsCisJMjQsMCwxNzgsMTc1LDIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsCisJMzMsMTUyLDEyOCwwLDgsMCw5OSwxNDIsNCwwLDk4LDE0MiwKKwkwLDAsMCwwLDM1LDEyOCw5OCwwLDI1NSwyNTUsNCw1MCwKKwkxOSwwLDEyOCwxNiwzMywxMzYsMTYwLDAsOSw1MCwxOTIsMTIsCisJMCwwLDAsMCwzMywxNDQsNjQsMCwzLDAsNjQsMjIsCisJMjU1LDI1NSwxNiw1MCwxNyw5MiwxOTIsOCwyNTUsMjU1LDIsMzYsCisJMzMsMzIsNjQsMiw0LDAsMTAxLDE0MiwwLDAsMCwwLAorCTgwLDY4LDE5MiwxMiwzMyw0OCwwLDIsMSwwLDIsMzYsCisJMCwwLDM0LDE2Niw0LDAsNTAsMTc0LDMzLDEyOCw4MCwyLAorCTE1LDkyLDE5Miw4LDgsMCw0OCwxNzQsMCwwLDMyLDE2NiwKKwk0LDAsMzIsMTc0LDgsMCwzMiwxNzQsMTIsMCwzMiwxNjYsCisJMzMsMTYsMCwwLDMyLDAsMTkxLDE0MywyOCwwLDE3OSwxNDMsCisJMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDQwLDAsMTg5LDM5LDIzMiwyNTUsMTg5LDM5LAorCTIwLDAsMTkxLDE3NSwxNiwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLAorCTAsMCwyLDE1MCwwLDAsMCwwLDEsMCw2Niw0OCwKKwk3LDAsNjQsMTYsMCwwLDAsMCw0LDAsNCwxNDIsCisJMCwwLDAsMCwzLDAsMTI4LDE2LDAsMCwwLDAsCisJNjEsNTAsMTkyLDEyLDAsMCwwLDAsMCwwLDAsMTY2LAorCTgsMCwwLDE3NCw0LDAsMCwxNzQsMTIsMCwwLDE2NiwKKwkyMCwwLDE5MSwxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkyNCwwLDE4OSwzOSwyMjQsMjU1LDE4OSwzOSwyNCwwLDE5MSwxNzUsCisJMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsCisJOCwwLDE2MywxNDAsNCwwLDE2MiwxNDAsMCwwLDAsMCwKKwkzNSwxMzYsOTgsMCwyNTUsMjU1LDM1LDUwLDEyLDAsMiwxNTAsCisJMCwwLDAsMCw0MywxNiw2NywwLDQsMCw2NCwxNiwKKwkyNTUsMjU1LDM4LDUwLDEyLDAsMTcsMTUwLDAsMCwwLDAsCisJMjU1LDI1NSwzOCw1MCw2LDAsMTkyLDE2LDI1NSwyNTUsMzQsNTAsCisJOCwwLDQsMTQyLDQsMCwxNjUsMTQwLDgwLDY4LDE5MiwxMiwKKwkwLDAsMCwwLDI1NSwyNTUsMzQsNTAsOCwwLDMsMTQyLAorCTAsMCwwLDAsMzMsMTYsNjcsMCw4LDAsMiwxNzQsCisJMTIsMCwyLDE1MCwwLDAsMCwwLDM1LDE2LDgxLDAsCisJMTIsMCwyLDE2NiwyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMzIsMCwxODksMzksCisJMSwwLDIsMzYsMjMsMCwxOTQsMTYsMiwwLDE5NCw0MCwKKwk1LDAsNjQsMTYsMiwwLDIsMzYsNywwLDE5MiwxNiwKKwkyNTUsMjU1LDIsMzYsMTMyLDkyLDE5Miw4LDAsMCwwLDAsCisJMjMsMCwxOTQsMTYsMjU1LDI1NSwyLDM2LDEzMiw5MiwxOTIsOCwKKwkwLDAsMCwwLDI1NSwyNTUsMTYyLDQ4LDQsMCwxMzEsMTQwLAorCTAsMCwwLDAsMzMsNDgsNjcsMCw4LDAsMTMwLDE0MCwKKwkwLDAsMCwwLDM1LDE2LDY3LDAsMTIsMCwxMzEsMTQ4LAorCTAsMCwwLDAsMzMsMTYsNjcsMCwxMjQsOTIsMTkyLDgsCisJMzUsNDAsNjksMCwyNTUsMjU1LDE2Miw0OCw4LDAsMTMxLDE0MCwKKwkwLDAsMCwwLDMzLDQ4LDY3LDAsMTIsMCwxMzAsMTQ4LAorCTAsMCwwLDAsMTI0LDkyLDE5Miw4LDM1LDQwLDY5LDAsCisJMTIsMCwxMzAsMTQ4LDgsMCwxMzEsMTQwLDAsMCwwLDAsCisJMzMsNDgsNjcsMCwyNTUsMjU1LDE2Miw0OCwzNSw0OCwxOTQsMCwKKwk0LDAsMTMwLDE0MCwwLDAsMCwwLDQzLDE2LDE5NCwwLAorCTQsMCw2NCwyMCwyNTUsMjU1LDIsMzYsOCwwLDEzNCwxNzIsCisJMTIsMCwxMzMsMTY0LDMzLDE2LDAsMCw4LDAsMjI0LDMsCisJMCwwLDAsMCwyMTYsMjU1LDE4OSwzOSwzMiwwLDE5MSwxNzUsCisJMjgsMCwxNzksMTc1LDI0LDAsMTc4LDE3NSwyMCwwLDE3NywxNzUsCisJMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwzMywxNTIsMTYwLDAsCisJOCwwLDMsMTQyLDQsMCwyLDE0MiwwLDAsMCwwLAorCTM1LDE0NCw5OCwwLDI1NSwyNTUsNjYsNTAsMTIsMCwzLDE1MCwKKwkwLDAsMCwwLDMzLDE2LDY3LDAsMjU1LDI1NSw5OSw1MCwKKwk0MiwxNiw2NywwLDM1LDAsNjQsMTYsMSwwLDIsMzYsCisJMCwwLDMsMTUwLDAsMCwwLDAsMzIsMCw5OCwyMCwKKwkyNTUsMjU1LDIsMzYsOSw1MCwxOTIsMTIsMjU1LDI1NSwxMDAsNTAsCisJMzMsMTM2LDY0LDAsMywwLDMyLDIyLDI1NSwyNTUsNzAsNTAsCisJMTg5LDkyLDE5Miw4LDI1NSwyNTUsMiwzNiw1LDAsMTkyLDE2LAorCTAsMCwwLDAsNCwwLDUsMTQyLDAsMCwwLDAsCisJODAsNjgsMTkyLDEyLDMzLDMyLDMyLDIsMCwwLDIsMTUwLAorCTAsMCwwLDAsMSwwLDY2LDQ4LDcsMCw2NCwxNiwKKwkwLDAsMCwwLDQsMCw0LDE0MiwwLDAsMCwwLAorCTMsMCwxMjgsMTYsMCwwLDAsMCw2MSw1MCwxOTIsMTIsCisJMCwwLDAsMCw0LDAsMTcsMTc0LDI1NSwyNTUsNjYsNTAsCisJMzMsMTYsMzQsMiw4LDAsMiwxNzQsMzUsMTYsMTE0LDIsCisJMTIsMCwyLDE2NiwzMywxNiwwLDAsMzIsMCwxOTEsMTQzLAorCTI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsNDAsMCwxODksMzksCisJMjE2LDI1NSwxODksMzksMzIsMCwxOTEsMTc1LDI4LDAsMTc5LDE3NSwKKwkyNCwwLDE3OCwxNzUsMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwKKwkzMywxMjgsMTI4LDAsMzMsMTM2LDE5MiwwLDI1NSwyNTUsMzYsNTAsCisJMzUsMCwxMjgsMTYsMzMsMTUyLDE2MCwwLDgsMCwyLDE0MiwKKwk0LDAsMywxNDIsMCwwLDAsMCwzNSwxNiw2NywwLAorCTI1NSwyNTUsNjYsNDgsMTIsMCwzLDE1MCwwLDAsMCwwLAorCTMzLDE2LDY3LDAsNDIsMTYsNjgsMCwyMCwwLDY0LDE2LAorCTAsMCwwLDAsOSw1MCwxOTIsMTIsMCwwLDAsMCwKKwkzMywxNDQsNjQsMCwyNCwwLDY0LDE4LDI1NSwyNTUsMiwzNiwKKwkwLDAsMiwxNTAsMCwwLDAsMCwxLDAsNjYsNDgsCisJOCwwLDY0LDE2LDEsMCwyLDM2LDQsMCw0LDE0MiwKKwkwLDAsMCwwLDQsMCwxMjgsMTYsMCwwLDAsMCwKKwk2MSw1MCwxOTIsMTIsMCwwLDAsMCwxLDAsMiwzNiwKKwkwLDAsMiwxNjYsNCwwLDE4LDE3NCw0LDAsNCwxNDIsCisJMzMsNDAsOTYsMiw4MCw2OCwxOTIsMTIsMjU1LDI1NSwzOCw1MCwKKwkzMywzMiwwLDIsMjU1LDI1NSwzNyw1MCw4NSw5MiwxOTIsMTIsCisJMzMsNDgsMCwwLDMzLDE2LDAsMCwzMiwwLDE5MSwxNDMsCisJMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMyw0MCwwLDE4OSwzOSwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkxODQsMjU1LDE4OSwzOSw2NCwwLDE5MSwxNzUsNjAsMCwxODMsMTc1LAorCTU2LDAsMTgyLDE3NSw1MiwwLDE4MSwxNzUsNDgsMCwxODAsMTc1LAorCTQ0LDAsMTc5LDE3NSw0MCwwLDE3OCwxNzUsMzYsMCwxNzcsMTc1LAorCTMyLDAsMTc2LDE3NSwzMywxNDQsMTI4LDAsMTEyLDAsODQsMTQyLAorCTAsMCwwLDAsOTIsMCwxMjgsMTgsMSwwLDIsMzYsCisJMTA4LDAsODEsMTQyLDAsMCwwLDAsODgsMCwzMiwxOCwKKwkwLDAsMCwwLDk2LDAsODcsMzgsMTM2LDAsNjYsMTc0LAorCTE0MCwwLDY0LDE3NCw5NiwwLDY0LDE3NCwxMDAsMCw2NCwxNzQsCisJMjI0LDgzLDE5MiwxMiwzMywzMiwzMiwyLDMzLDE2OCw2NCwwLAorCTI1LDAsMTYwLDE4LDMzLDEyOCwxNjAsMiwxMDgsMCw2NiwxNDIsCisJMCwwLDAsMCwxMjQsMCw2NiwxNzQsMTI4LDAsODQsMTc0LAorCTEwOCwwLDgxLDE3NCwxMTIsMCw4NSwxNzQsMjksMCwzMiwyNiwKKwkzMywxNTIsMCwwLDI1NSwyNTUsMjIsMzYsMzMsMzIsMCwyLAorCTgsMCwxMzMsMzgsMzMsNDgsNjQsMiwxNzAsNzIsMTkyLDEyLAorCTEsMCw3LDM2LDEwLDAsODYsMTYsMzMsMzIsNjQsMiwKKwkxNCwwLDY0LDIwLDAsMCwwLDAsNjQsMCw2NiwxNDIsCisJMCwwLDAsMCwxMCwwLDY0LDIwLDIsMCw1LDM2LAorCTU2LDkzLDE5Miw4LDEsMCwxMDIsMzgsMzMsMzIsNjQsMiwKKwk1LDAsNSwzNiwzMyw0OCwwLDAsMTQwLDg0LDE5MiwxMiwKKwkwLDAsMCwwLDEwNyw5MywxOTIsOCwxLDAsMiwzNiwKKwkxLDAsMTE1LDM4LDY4LDAsMTYsMzgsNDIsMTYsMTEzLDIsCisJMjMwLDI1NSw2NCwyMCw2OCwwLDE0OCwzOCw0MCwwLDMyLDE4LAorCTMzLDEyOCwxNjAsMiwxNywwLDIsMTQ2LDAsMCwwLDAsCisJMzQsMCw2Niw0OCwzMiwwLDY0LDIwLDAsMCwwLDAsCisJMzYsMCwyLDE0MiwxNiwwLDE3NiwxNzUsMTYsMCw2NiwxNDAsCisJMjQsMCw0LDE0MiwyOCwwLDUsMTQyLDMyLDAsNiwxNDIsCisJMCwwLDAsMCw5LDI0OCw2NCwwLDMzLDU2LDY0LDIsCisJMTcsMCwyLDE0NiwwLDAsMCwwLDMyLDAsNjYsNTIsCisJMTcsMCwyLDE2MiwwLDAsMjI2LDE0MiwwLDAsMCwwLAorCTE1LDAsNjQsMTYsMCwwLDAsMCwyNTUsMjU1LDQ5LDM4LAorCTE1LDAsMzIsMTgsNjgsMCwxNiwzOCwxNywwLDMsMTQ2LAorCTAsMCwwLDAsMzIsMCw5OCw0OCwyLDAsNjQsMjAsCisJMzQsMCw5OCw1MiwxNywwLDIsMTYyLDI1NSwyNTUsNDksMzgsCisJMjQ4LDI1NSwzMiwyMiw2OCwwLDE2LDM4LDEwNyw5MywxOTIsOCwKKwkzMywxNiwwLDAsMjU1LDI1NSw0OSwzOCwyMTgsMjU1LDMyLDIyLAorCTY4LDAsMTYsMzgsMzMsMTYsMCwwLDY0LDAsMTkxLDE0MywKKwk2MCwwLDE4MywxNDMsNTYsMCwxODIsMTQzLDUyLDAsMTgxLDE0MywKKwk0OCwwLDE4MCwxNDMsNDQsMCwxNzksMTQzLDQwLDAsMTc4LDE0MywKKwkzNiwwLDE3NywxNDMsMzIsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk3MiwwLDE4OSwzOSwxNjgsMjU1LDE4OSwzOSw4MCwwLDE5MSwxNzUsCisJNzYsMCwxODMsMTc1LDcyLDAsMTgyLDE3NSw2OCwwLDE4MSwxNzUsCisJNjQsMCwxODAsMTc1LDYwLDAsMTc5LDE3NSw1NiwwLDE3OCwxNzUsCisJNTIsMCwxNzcsMTc1LDQ4LDAsMTc2LDE3NSwzMywxNDQsMTI4LDAsCisJOTYsMCw2NiwxNDIsMCwwLDAsMCwzLDAsNjQsMTYsCisJMzMsMzIsMCwwLDI0MCw5MywxOTIsOCwyNTUsMjU1LDIsMzYsCisJMTE2LDAsNjYsMTQyLDAsMCwwLDAsNywwLDY0LDE2LAorCTEwNCwwLDY3LDM4LDEyLDAsOTksMTQwLDAsMCwwLDAsCisJMTIsMCw5OCwxNDAsMCwwLDAsMCwyNTEsMjU1LDY0LDIwLAorCTAsMCwwLDAsOCwwLDExNiwxNDAsMCwwLDAsMCwKKwk5MiwwLDEyOCwxOCwzMywxNiwwLDAsNCwwLDExNSwxNDAsCisJMCwwLDAsMCw4OCwwLDk2LDE4LDAsMCwwLDAsCisJNjQsMCw2NiwxNDIsMCwwLDAsMCw1NSwwLDY0LDIwLAorCTAsMCwwLDAsMzMsMTI4LDEyOCwyLDUyLDAsOTYsMjYsCisJMzMsMTM2LDAsMCwyNTUsMjU1LDIzLDM2LDIsMCwyMiwzNiwKKwk1LDAsMjEsMzYsMTcsMCwyLDE0NiwwLDAsMCwwLAorCTE2LDAsNjYsNDgsNDAsMCw2NCwxNiwyNCwwLDE2NSwzOSwKKwk4LDAsMywxNDIsMjgsMCwyLDE0MiwwLDAsMCwwLAorCTM1LDI0LDk4LDAsMjQsMCwxNjMsMTc1LDEyLDAsMiwxNDIsCisJMCwwLDAsMCwyOCwwLDE2MiwxNzUsMTI4LDI0LDMsMCwKKwkzMywyNCw5OCwwLDI1MiwyNTUsOTgsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDI1MiwyNTUsOTgsMTcyLDEyLDAsMCwxNzQsCisJOCwwLDAsMTc0LDMzLDMyLDAsMiwzMyw0OCw2NCwyLAorCTE3MCw3MiwxOTIsMTIsMSwwLDcsMzYsNiwwLDg3LDE2LAorCTAsMCwwLDAsOSwwLDY0LDIwLDEsMCwzNCwzOCwKKwk5NiwwLDg2LDE3NCwxOTYsOTMsMTkyLDgsMTAwLDAsNjYsMTc0LAorCTk2LDAsODUsMTc0LDExMCw4NiwxOTIsMTIsMjQsMCwxNjQsMzksCisJMjQwLDkzLDE5Miw4LDI1NSwyNTUsMiwzNiwxMTAsODYsMTkyLDEyLAorCTI0LDAsMTY0LDM5LDE3LDAsMiwxNDYsMCwwLDAsMCwKKwkxMiwwLDY2LDQ4LDE3LDAsMiwxNjIsMSwwLDQsMzYsCisJMSwwLDQ5LDM4LDQyLDE2LDUxLDIsMjA5LDI1NSw2NCwyMCwKKwk2OCwwLDE2LDM4LDI3LDAsMTI4LDE2LDMzLDEyOCwxMjgsMiwKKwkyMywwLDk2LDI2LDMzLDEzNiwwLDAsMTcsMCwyLDE0NiwKKwkwLDAsMCwwLDM0LDAsNjYsNDgsMTQsMCw2NCwyMCwKKwkwLDAsMCwwLDM2LDAsMiwxNDIsMTYsMCwxNzYsMTc1LAorCTE2LDAsNjYsMTQwLDI0LDAsNCwxNDIsMjgsMCw1LDE0MiwKKwkzMiwwLDYsMTQyLDAsMCwwLDAsOSwyNDgsNjQsMCwKKwkzMyw1Niw2NCwyLDE3LDAsMiwxNDYsMCwwLDAsMCwKKwkzMiwwLDY2LDUyLDE3LDAsMiwxNjIsMSwwLDQ5LDM4LAorCTQyLDE2LDUxLDIsMjM1LDI1NSw2NCwyMCw2OCwwLDE2LDM4LAorCTI0MCw5MywxOTIsOCwxLDAsMiwzNiwzMywxNiwwLDAsCisJODAsMCwxOTEsMTQzLDc2LDAsMTgzLDE0Myw3MiwwLDE4MiwxNDMsCisJNjgsMCwxODEsMTQzLDY0LDAsMTgwLDE0Myw2MCwwLDE3OSwxNDMsCisJNTYsMCwxNzgsMTQzLDUyLDAsMTc3LDE0Myw0OCwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDg4LDAsMTg5LDM5LDAsMCwwLDAsCisJMjAwLDI1NSwxODksMzksNDgsMCwxOTEsMTc1LDQ0LDAsMTc5LDE3NSwKKwk0MCwwLDE3OCwxNzUsMzYsMCwxNzcsMTc1LDMyLDAsMTc2LDE3NSwKKwkzMywxNDQsMTI4LDAsOTYsMCw2NCwxNzQsMTAwLDAsNjQsMTc0LAorCTExMiwwLDgwLDE0MiwwLDAsMCwwLDEwNSwwLDAsMTgsCisJMzMsMTYsMCwwLDEwOCwwLDgxLDE0MiwwLDAsMCwwLAorCTEwMSwwLDMyLDE4LDAsMCwwLDAsNjQsMCw2NiwxNDIsCisJMCwwLDAsMCw0MywwLDY0LDIwLDMzLDMyLDY0LDIsCisJNTAsMCwzMiwyNiwzMywxNTIsMCwwLDMzLDMyLDAsMiwKKwkzMyw0MCw2NCwyLDk2LDcyLDE5MiwxMiwxLDAsNiwzNiwKKwkxMywwLDY0LDIwLDMzLDMyLDY0LDIsMjAsMCwyLDE1MCwKKwkwLDAsMCwwLDEsMCw2Niw0OCwzNCwwLDY0LDE2LAorCTIsMCw1LDM2LDM2LDAsMiwxNDIsMCwwLDAsMCwKKwkzLDAsNjYsMTQ0LDAsMCwwLDAsMiwwLDY2LDQ4LAorCTMsMCw2NCwyMCwwLDAsMCwwLDYzLDk0LDE5Miw4LAorCTIsMCw1LDM2LDM2LDAsMiwxNDIsMCwwLDAsMCwKKwkzMiwwLDY2LDE0MCw0LDAsNjcsMTQyLDAsMCwwLDAsCisJMzYsMTYsNjcsMCwxNiwwLDY0LDE2LDMzLDMyLDY0LDIsCisJMzYsMCwyLDE0MiwxNiwwLDMsMTQ2LDIsMCw2NiwxNDQsCisJMCwwLDAsMCwxMSwwLDk4LDIwLDMsMCw1LDM2LAorCTEsMCwxMTUsMzgsNDIsMTYsMTEzLDIsMjE5LDI1NSw2NCwyMCwKKwk2OCwwLDE2LDM4LDY5LDk0LDE5Miw4LDk2LDAsODMsMzgsCisJNSwwLDUsMzYsNjQsOTQsMTkyLDgsMzMsNDgsMCwwLAorCTIsMCw1LDM2LDEsMCwxMDIsMzgsMTQwLDg0LDE5MiwxMiwKKwkwLDAsMCwwLDExMyw5NCwxOTIsOCwxLDAsMiwzNiwKKwk5NiwwLDgzLDM4LDExMiwwLDgwLDE0MiwwLDAsMCwwLAorCTQxLDAsMzIsMTgsMzMsMTYsMCwwLDE3LDAsMiwxNDYsCisJMCwwLDAsMCwxNywwLDY2LDQ4LDMyLDAsNjQsMjAsCisJMCwwLDAsMCwzNiwwLDIsMTQyLDE2LDAsMTc2LDE3NSwKKwk0LDAsNjYsMTQwLDI0LDAsNCwxNDIsMjgsMCw1LDE0MiwKKwkzMiwwLDYsMTQyLDAsMCwwLDAsOSwyNDgsNjQsMCwKKwkzMyw1Niw2NCwyLDE3LDAsMiwxNDYsMCwwLDAsMCwKKwkxNiwwLDY2LDUyLDE3LDAsMiwxNjIsMCwwLDk4LDE0MiwKKwkwLDAsMCwwLDE1LDAsNjQsMTYsMCwwLDAsMCwKKwkyNTUsMjU1LDQ5LDM4LDE1LDAsMzIsMTgsNjgsMCwxNiwzOCwKKwkxNywwLDMsMTQ2LDAsMCwwLDAsMTYsMCw5OCw0OCwKKwkyLDAsNjQsMjAsMTcsMCw5OCw1MiwxNywwLDIsMTYyLAorCTI1NSwyNTUsNDksMzgsMjQ4LDI1NSwzMiwyMiw2OCwwLDE2LDM4LAorCTExMyw5NCwxOTIsOCwzMywxNiwwLDAsMjU1LDI1NSw0OSwzOCwKKwkyMTgsMjU1LDMyLDIyLDY4LDAsMTYsMzgsMzMsMTYsMCwwLAorCTQ4LDAsMTkxLDE0Myw0NCwwLDE3OSwxNDMsNDAsMCwxNzgsMTQzLAorCTM2LDAsMTc3LDE0MywzMiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTU2LDAsMTg5LDM5LDE5MiwyNTUsMTg5LDM5LDU2LDAsMTkxLDE3NSwKKwk1MiwwLDE4MywxNzUsNDgsMCwxODIsMTc1LDQ0LDAsMTgxLDE3NSwKKwk0MCwwLDE4MCwxNzUsMzYsMCwxNzksMTc1LDMyLDAsMTc4LDE3NSwKKwkyOCwwLDE3NywxNzUsMjQsMCwxNzYsMTc1LDMzLDE0NCwxMjgsMCwKKwkxMTIsMCw4NCwxNDIsMCwwLDAsMCwxNzEsMCwxMjgsMTgsCisJMzMsMTYsMCwwLDEwOCwwLDg1LDE0MiwwLDAsMCwwLAorCTE2NiwwLDE2MCwxOCwzMiwwLDIsMzYsNTYsMCw2NywxNDYsCisJMCwwLDAsMCw3NSwwLDk4LDE2LDk2LDAsODMsMzgsCisJMzMsMCw5OCw0MCw1LDAsNjQsMTYsNjQsMCwyLDM2LAorCTksMCw5NiwxNiwzMywxNiwwLDAsNDksOTUsMTkyLDgsCisJMCwwLDAsMCw4NSwwLDk4LDE2LDEyOCwwLDIsMzYsCisJMTM3LDAsOTgsMTYsMzMsMTYsMCwwLDQ5LDk1LDE5Miw4LAorCTAsMCwwLDAsMzMsMTM2LDE2MCwyLDgsMCwzMiwxOCwKKwkzMywxMjgsMTI4LDIsMTcsMCwyLDE0NiwwLDAsMCwwLAorCTEsMCw2Niw0OCwxMzksMCw2NCwxNiwyNTUsMjU1LDQ5LDM4LAorCTI1MCwyNTUsMzIsMjIsNjgsMCwxNiwzOCwwLDAsOTgsMTQyLAorCTAsMCwwLDAsMTM2LDAsNjQsMjAsMzMsMTYsMCwwLAorCTMzLDEzNiwxNjAsMiw0MywwLDMyLDE4LDMzLDEyOCwxMjgsMiwKKwkxNCwwLDIyLDM2LDY0LDAsMjMsMzYsMTcsMCwyLDE0NiwKKwkwLDAsMCwwLDM0LDAsNjYsNDgsMzMsMCw2NCwyMCwKKwkwLDAsMCwwLDM2LDAsMiwxNDIsMTYsMCwxNzYsMTc1LAorCTEyLDAsNjYsMTQwLDI0LDAsNCwxNDIsMjgsMCw1LDE0MiwKKwkzMiwwLDYsMTQyLDAsMCwwLDAsOSwyNDgsNjQsMCwKKwkzMyw1Niw2NCwyLDE3LDAsMiwxNDYsMCwwLDAsMCwKKwkzMiwwLDY2LDUyLDE3LDAsMiwxNjIsMCwwLDk4LDE0MiwKKwkwLDAsMCwwLDE2LDAsNjQsMTYsMCwwLDAsMCwKKwkyNTUsMjU1LDQ5LDM4LDEwLDAsMzIsMTgsNjgsMCwxNiwzOCwKKwkxNywwLDMsMTQ2LDAsMCwwLDAsMzIsMCw5OCw0OCwKKwkyLDAsNjQsMjAsMTkyLDAsOTgsNTIsMTcsMCwyLDE2MiwKKwkyNTUsMjU1LDQ5LDM4LDI0OCwyNTUsMzIsMjIsNjgsMCwxNiwzOCwKKwkwLDAsMTE4LDE3NCwyMzYsOTQsMTkyLDgsNTYsMCw4NywxNjIsCisJMjU1LDI1NSw0OSwzOCwyMTcsMjU1LDMyLDIyLDY4LDAsMTYsMzgsCisJMzIsMCwyLDM2LDU2LDAsNjYsMTYyLDAsMCw5OCwxNDIsCisJMCwwLDAsMCwxMywwLDY0LDIwLDY0LDAsMiwzNiwKKwkzMywxMzYsMTYwLDIsODEsMCwzMiwxOCwzMywxMjgsMTI4LDIsCisJMTcsMCwyLDE0NiwwLDAsMCwwLDIsMCw2Niw0OCwKKwk3NCwwLDY0LDE2LDI1NSwyNTUsNDksMzgsMjUwLDI1NSwzMiwyMiwKKwk2OCwwLDE2LDM4LDQ5LDk1LDE5Miw4LDMzLDE2LDAsMCwKKwk1NiwwLDY2LDE2MiwxNCwwLDIsMzYsMCwwLDk4LDE3NCwKKwkzMywxMzYsMTYwLDIsNTMsMCwzMiwxOCwzMywxMjgsMTI4LDIsCisJMiwwLDIzLDM2LDE1LDAsMjIsMzYsMTcsMCwyLDE0NiwKKwkwLDAsMCwwLDE5NCwwLDY2LDQ4LDUsMCw2NCwxNiwKKwkwLDAsMCwwLDE5LDAsODcsMTYsMCwwLDAsMCwKKwkzMiw5NSwxOTIsOCwyNTUsMjU1LDQ5LDM4LDY0LDAsMiwxNDIsCisJMCwwLDAsMCwzNCwwLDY0LDE2LDAsMCwwLDAsCisJMTYsMCwxNzYsMTc1LDY0LDAsMiwxNDIsMjQsMCw0LDE0MiwKKwkyOCwwLDUsMTQyLDMyLDAsNiwxNDIsMCwwLDAsMCwKKwk5LDI0OCw2NCwwLDMzLDU2LDY0LDIsMTcsMCwyLDE0NiwKKwkwLDAsMCwwLDMwLDk1LDE5Miw4LDY0LDAsNjYsNTIsCisJNjQsMCwyLDE0MiwwLDAsMCwwLDEzLDAsNjQsMTYsCisJMCwwLDAsMCwxNiwwLDE3NiwxNzUsNjQsMCwyLDE0MiwKKwkyNCwwLDQsMTQyLDI4LDAsNSwxNDIsMzIsMCw2LDE0MiwKKwkwLDAsMCwwLDksMjQ4LDY0LDAsMzMsNTYsNjQsMiwKKwkxNywwLDIsMTQ2LDAsMCwwLDAsMzAsOTUsMTkyLDgsCisJNjQsMCw2Niw1MiwwLDAsMTE4LDE3NCwxNywwLDIsMTQ2LAorCTAsMCwwLDAsMTI4LDAsNjYsNTIsMTcsMCwyLDE2MiwKKwkyNTUsMjU1LDQ5LDM4LDIwOCwyNTUsMzIsMjIsNjgsMCwxNiwzOCwKKwkzMywxMzYsMTYwLDIsMTIsMCwzMiwxOCwzMywxMjgsMTI4LDIsCisJMTcsMCwyLDE0NiwwLDAsMCwwLDEyOCwwLDY2LDQ4LAorCTUsMCw2NCwxNiwyNTUsMjU1LDQ5LDM4LDI1MCwyNTUsMzIsMjIsCisJNjgsMCwxNiwzOCw0OSw5NSwxOTIsOCwzMywxNiwwLDAsCisJNDksOTUsMTkyLDgsMSwwLDIsMzYsMzMsMTYsMCwwLAorCTU2LDAsMTkxLDE0Myw1MiwwLDE4MywxNDMsNDgsMCwxODIsMTQzLAorCTQ0LDAsMTgxLDE0Myw0MCwwLDE4MCwxNDMsMzYsMCwxNzksMTQzLAorCTMyLDAsMTc4LDE0MywyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw2NCwwLDE4OSwzOSwxODQsMjU1LDE4OSwzOSwKKwk2NCwwLDE5MSwxNzUsNjAsMCwxODMsMTc1LDU2LDAsMTgyLDE3NSwKKwk1MiwwLDE4MSwxNzUsNDgsMCwxODAsMTc1LDQ0LDAsMTc5LDE3NSwKKwk0MCwwLDE3OCwxNzUsMzYsMCwxNzcsMTc1LDMyLDAsMTc2LDE3NSwKKwkzMywxNjAsMTI4LDAsMTEyLDAsMTQ3LDE0MiwwLDAsMCwwLAorCTEyOSwwLDk2LDE4LDMzLDE2LDAsMCwxMDgsMCwxNDYsMTQyLAorCTAsMCwwLDAsMTI1LDAsNjQsMTgsOTYsMCwxNTEsMzgsCisJOTYsMCwxMjgsMTc0LDEwMCwwLDEyOCwxNzQsMjI0LDgzLDE5MiwxMiwKKwkzMywzMiw2NCwyLDMzLDE2OCw2NCwwLDUsMCwxNjAsMjIsCisJMzMsMTM2LDY0LDIsMzMsMzIsMTI4LDIsNSwwLDUsMzYsCisJMTIzLDk1LDE5Miw4LDMzLDQ4LDAsMCwzNiwwLDY0LDE4LAorCTMzLDEyOCwxNjAsMiw1LDAsMjIsMzYsMTYsMCwyMiwxNjIsCisJOCwwLDEwMCwxNDIsMTIsMCwxMDEsMTQyLDAsMCwwLDAsCisJODAsODYsMTkyLDEyLDgsMCw2LDM4LDUsMCw2NCwyMCwKKwkwLDAsMCwwLDI1NSwyNTUsNDksMzgsNjgsMCwxMTUsMzgsCisJMjQ1LDI1NSwzMiwyMiw2OCwwLDE2LDM4LDIxLDAsMzIsMTgsCisJNDIsMTYsNTAsMiw3LDAsNjQsMTYsMzMsMTI4LDE2MCwyLAorCTU5LDg0LDE5MiwxMiwzMywzMiwwLDIsMSwwLDQ5LDM4LAorCTQyLDE2LDUwLDIsMjUxLDI1NSw2NCwyMCw2OCwwLDE2LDM4LAorCTYxLDUwLDE5MiwxMiwzMywzMiwxNjAsMiwzMywzMiwxMjgsMiwKKwk1LDAsNSwzNiwxMjMsOTUsMTkyLDgsMzMsNDgsMCwwLAorCTIsMCw1LDM2LDEsMCwzOCwzOCwxNDAsODQsMTkyLDEyLAorCTAsMCwwLDAsMjAzLDk1LDE5Miw4LDEsMCwyLDM2LAorCTEyNCwwLDE0NiwxNzQsMTEyLDAsMTMwLDE0MiwwLDAsMCwwLAorCTEyOCwwLDEzMCwxNzQsMTEyLDAsMTQ5LDE3NCwzMywxMjgsMTYwLDIsCisJMjcsMCw2NCwyNiwzMywxMzYsMCwwLDMzLDMyLDAsMiwKKwkzMyw0MCwxMjgsMiw5Niw3MiwxOTIsMTIsMSwwLDYsMzYsCisJMTMsMCw2NCwyMCwwLDAsMCwwLDIwLDAsMiwxNTAsCisJMCwwLDAsMCwxLDAsNjYsNDgsOCwwLDY0LDE2LAorCTAsMCwwLDAsMzYsMCwyLDE0MiwwLDAsMCwwLAorCTMsMCw2NiwxNDQsMCwwLDAsMCwxLDAsNjYsNDgsCisJNSwwLDY0LDIwLDAsMCwwLDAsNjQsMCwxMzAsMTQyLAorCTAsMCwwLDAsMjIxLDI1NSw2NCwxNiwzMywzMiwxMjgsMiwKKwkxLDAsNDksMzgsNDIsMTYsNTAsMiwyMzEsMjU1LDY0LDIwLAorCTY4LDAsMTYsMzgsNDAsMCw2NCwxOCwzMywxMjgsMTYwLDIsCisJMTcsMCwyLDE0NiwwLDAsMCwwLDM0LDAsNjYsNDgsCisJMzIsMCw2NCwyMCwwLDAsMCwwLDM2LDAsMiwxNDIsCisJMTYsMCwxNzYsMTc1LDgsMCw2NiwxNDAsMjQsMCw0LDE0MiwKKwkyOCwwLDUsMTQyLDMyLDAsNiwxNDIsMCwwLDAsMCwKKwk5LDI0OCw2NCwwLDMzLDU2LDEyOCwyLDE3LDAsMiwxNDYsCisJMCwwLDAsMCwzMiwwLDY2LDUyLDE3LDAsMiwxNjIsCisJMCwwLDIyNiwxNDIsMCwwLDAsMCwxNSwwLDY0LDE2LAorCTAsMCwwLDAsMjU1LDI1NSw4MiwzOCwxNSwwLDY0LDE4LAorCTY4LDAsMTYsMzgsMTcsMCwzLDE0NiwwLDAsMCwwLAorCTMyLDAsOTgsNDgsMiwwLDY0LDIwLDM0LDAsOTgsNTIsCisJMTcsMCwyLDE2MiwyNTUsMjU1LDgyLDM4LDI0OCwyNTUsNjQsMjIsCisJNjgsMCwxNiwzOCwyMDMsOTUsMTkyLDgsMzMsMTYsMCwwLAorCTI1NSwyNTUsODIsMzgsMjE4LDI1NSw2NCwyMiw2OCwwLDE2LDM4LAorCTMzLDE2LDAsMCw2NCwwLDE5MSwxNDMsNjAsMCwxODMsMTQzLAorCTU2LDAsMTgyLDE0Myw1MiwwLDE4MSwxNDMsNDgsMCwxODAsMTQzLAorCTQ0LDAsMTc5LDE0Myw0MCwwLDE3OCwxNDMsMzYsMCwxNzcsMTQzLAorCTMyLDAsMTc2LDE0Myw4LDAsMjI0LDMsNzIsMCwxODksMzksCisJMCwwLDAsMCwwLDAsMCwwLDM3LDExNSw1OCwzNywKKwkxMDAsNTgsMzIsMTAyLDk3LDEwNSwxMDgsMTAxLDEwMCwzMiw5NywxMTUsCisJMTE1LDEwMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDMyLDk2LDM3LDExNSwzOSwKKwkxMCwwLDAsMCwxMTQsOTcsMTA5LDExNiwxMDEsMTE1LDExNiwxMDAsCisJMTE5LDQwLDk4LDk5LDQ2LDk4LDk5LDk1LDEwNCwxMDEsOTcsMTEyLAorCTExNSwxMTYsOTcsMTE0LDExNiw0NCwzMiwxMDgsMTAxLDExMCw0NCwzMiwKKwk0OSw0NCwzMiw0OCw0NCwzMiw0OCw0MSwzMiw2MSw2MSwzMiwKKwk0OCwwLDAsMCw5OCw5OSw0Niw5OCw5OSw5NSwxMDQsMTAxLAorCTk3LDExMiwxMDEsMTEwLDEwMCwzMiw2MCw2MSwzMiw5OCw5OSw0NiwKKwk5OCw5OSw5NSwxMTQsOTcsMTA5LDEwMSwxMTAsMTAwLDAsMCwwLAorCTM1LDMyLDExMiwxMTEsMTE0LDExNiwxMTUsNTgsMzIsMzcsMTAwLDEwLAorCTAsMCwwLDAsNDIsNDIsNDIsODAsMTE0LDExMSwxMDIsMTA1LAorCTEwOCwxMDUsMTEwLDEwMywzMiw2NCwzMiwzNywxMjAsNDQsMzIsMzcsCisJMTIwLDEwLDAsMCwxMDMsMTExLDExNiwzMiwxMDQsMTAxLDExNCwxMDEsCisJMzIsOTksOTcsMTE3LDExNSwxMDEsNjEsMzcsMTIwLDMyLDExNSwxMTYsCisJOTcsMTE2LDExNywxMTUsNjEsMzcsMTIwLDMyLDExOCwxMDEsOTksNjEsCisJMzcsMTIwLDEwLDAsMzcsMTE1LDU4LDM3LDEwMCw1OCwzMiwxMDIsCisJOTcsMTA1LDEwOCwxMDEsMTAwLDMyLDk3LDExNSwxMTUsMTAxLDExNCwxMTYsCisJMTA1LDExMSwxMTAsMzIsOTYsMzcsMTE1LDM5LDEwLDAsMCwwLAorCTgzLDEwMSw5OSwxMTEsMTEwLDEwMCwxMTUsMzIsNjAsMzIsNDgsMTIwLAorCTU1LDcwLDcwLDcwLDEwMiwxMDIsMTAyLDEwMiwwLDAsMCwwLAorCTg0LDEwNSwxMDksMTAxLDExNCwxMTUsODUsMTE1LDEwMSwxMDAsMzIsNjAsCisJMzIsNzgsODQsNzMsNzcsNjksODIsODMsMCwwLDAsMCwKKwkwLDAsMCwwLDY5LDY5LDgwLDgyLDc5LDc3LDMyLDEwNSwKKwkxMTUsMzIsOTgsOTcsMTAwLDEwLDAsMCw4MCwxMTEsMTE0LDExNiwKKwkzMiwzNywxMDAsMzIsMTAxLDExNiwxMDQsMTAxLDExNCwzMiw5NywxMDAsCisJMTAwLDExNCwxMDEsMTE1LDExNSw1OCwzMiwzNyw0OCw1MCw4OCw1OCwKKwkzNyw0OCw1MCw4OCw1OCwzNyw0OCw1MCw4OCw1OCwzNyw0OCwKKwk1MCw4OCw1OCwzNyw0OCw1MCw4OCw1OCwzNyw0OCw1MCw4OCwKKwkxMCwwLDAsMCwzNSwzNSwzNSwzMiw1Niw1MCw1Myw1NywKKwk1NCwzMiw2NywxMDQsOTcsMTEwLDMyLDM3LDEwMCw1OCwzMiwxMTUsCisJMTAxLDEwOCwxMDIsMTE2LDEwMSwxMTUsMTE2LDMyLDEwMiw5NywxMDUsMTA4LAorCTEwMSwxMDAsMzIsNDAsMzcsMTIwLDQxLDEwLDAsMCwwLDAsCisJNDIsNDIsNDIsMzIsNTYsNTAsNTMsNTcsNTQsMzIsODAsMTExLAorCTExNCwxMTYsMzIsMzcsMTAwLDU4LDMyLDExNSwxMDEsMTA4LDEwMiwxMTYsCisJMTAxLDExNSwxMTYsMzIsMTEyLDk3LDExNSwxMTUsMTAxLDEwMCwxMCwwLAorCTU2LDUwLDUzLDU3LDU0LDMyLDgwLDExMSwxMTQsMTE2LDMyLDM3LAorCTEwMCw1OCwzMiwxMDAsMTE3LDEwOSwxMTIsMzIsMTAyLDk3LDEwNSwxMDgsCisJMTAxLDEwMCwzMiw0MCwzNywxMjAsNDEsMTAsMCwwLDAsMCwKKwk0Miw0Miw0MiwzMiw1Niw1MCw1Myw1Nyw1NCwzMiw4MCwxMTEsCisJMTE0LDExNiwzMiwzNywxMDAsNTgsMzIsMTAwLDExNywxMDksMTEyLDMyLAorCTExMiw5NywxMTUsMTE1LDEwMSwxMDAsMTAsMCwzNSwzNSwzNSwzMiwKKwk1Niw1MCw1Myw1Nyw1NCwzMiw4MCwxMTEsMTE0LDExNiwzMiwzNywKKwkxMDAsNTgsMzIsODMsNjcsODAsMzIsMTAyLDEwMSwxMTYsOTksMTA0LAorCTMyLDEwMiw5NywxMDUsMTA4LDEwMSwxMDAsMTAsMCwwLDAsMCwKKwk0Miw0Miw0MiwzMiw1Niw1MCw1Myw1Nyw1NCwzMiw4MCwxMTEsCisJMTE0LDExNiwzMiwzNywxMDAsNTgsMzIsODMsNjcsODAsMzIsMTAyLAorCTEwMSwxMTYsOTksMTA0LDMyLDExMiw5NywxMTUsMTE1LDEwMSwxMDAsMzIsCisJMzcsMTIwLDMyLDEwLDAsMCwwLDAsMzUsMzUsMzUsMzIsCisJNTYsNTAsNTMsNTcsNTQsMzIsODAsMTExLDExNCwxMTYsMzIsMzcsCisJMTAwLDU4LDMyLDY2LDg1LDgzLDg0LDczLDc3LDY5LDgyLDgzLAorCTMyLDEwOCwxMTEsOTcsMTAwLDMyLDEwMiw5NywxMDUsMTA4LDEwMSwxMDAsCisJMTAsMCwwLDAsNDIsNDIsNDIsMzIsNTYsNTAsNTMsNTcsCisJNTQsMzIsODAsMTExLDExNCwxMTYsMzIsMzcsMTAwLDU4LDMyLDY2LAorCTg1LDgzLDg0LDczLDc3LDY5LDgyLDgzLDMyLDEwOCwxMTEsOTcsCisJMTAwLDMyLDExMiw5NywxMTUsMTE1LDEwMSwxMDAsMTAsMCwwLDAsCisJMzUsMzUsMzUsMzIsNjUsNjcsNzUsMzIsMTAwLDEwNSwxMDAsMzIsCisJMTEwLDExMSwxMTYsMzIsMTExLDk5LDk5LDExNywxMTQsMTAsMCwwLAorCTM1LDM1LDM1LDMyLDExNSwxMTYsOTcsMTE2LDExNywxMTUsMzIsMTE1LAorCTExNiwxMDUsMTA4LDEwOCwzMiw5OCwxMTcsMTE1LDEyMSw1OCwzMiwzNywKKwkxMjAsMTAsMCwwLDEwMSwxMTYsMTA0LDk1LDEwNSwxMTAsMTA1LDExNiwKKwk0Niw5OSwwLDAsNDIsNDIsNDIsNzYsNDksODcsNjUsMTAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwzNSwzNSwzNSwzMiw4NCw2Niw2OCwzMiwKKwk5OCwxMDgsMTExLDk5LDEwNywxMTUsMzIsOTcsMTE0LDEwMSwxMTAsMzksCisJMTE2LDMyLDk4LDEwMSwxMDUsMTEwLDEwMywzMiwxMDIsMTE0LDEwMSwxMDEsCisJMTAwLDEwLDAsMCw2NSwxMTYsMTE2LDEwMSwxMDksMTEyLDExNiwzMiwKKwkxMTYsMTExLDMyLDEwMiwxMTQsMTAxLDEwMSwzMiw5OCwxMTEsMTAzLDExNywKKwkxMTUsMzIsODQsNjYsNjgsMzIsMzcsMTIwLDEwLDAsMCwwLAorCTM1LDM1LDM1LDMyLDY2LDg1LDcwLDMyLDk4LDEwOCwxMTEsOTksCisJMTA3LDExNSwzMiw5NywxMTQsMTAxLDExMCwzOSwxMTYsMzIsOTgsMTAxLAorCTEwNSwxMTAsMTAzLDMyLDEwMiwxMTQsMTAxLDEwMSwxMDAsMTAsMCwwLAorCTY1LDExNiwxMTYsMTAxLDEwOSwxMTIsMTE2LDMyLDExNiwxMTEsMzIsMTAyLAorCTExNCwxMDEsMTAxLDMyLDk4LDExMSwxMDMsMTE3LDExNSwzMiw2Niw4NSwKKwk3MCwzMiwzNywxMjAsMTAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDgyLDcwLDY4LDExNSwzMiwzNywxMDAsMzIsCisJMTAsMCwwLDAsODIsNjYsNjgsMTE1LDMyLDM3LDEwMCwzMiwKKwkxMCwwLDAsMCwzNywxMTUsNTgsMzcsMTAwLDU4LDMyLDEwMiwKKwk5NywxMDUsMTA4LDEwMSwxMDAsMzIsOTcsMTE1LDExNSwxMDEsMTE0LDExNiwKKwkxMDUsMTExLDExMCwzMiw5NiwzNywxMTUsMzksMTAsMCwwLDAsCisJMTAxLDExNiwxMDQsOTUsMTE0LDk5LDExOCw0Niw5OSwwLDAsMCwKKwkxMDAsMTE1LDExNiw5OSwxMDQsOTcsMTEwLDMyLDYyLDYxLDMyLDQ5LAorCTMyLDM4LDM4LDMyLDEwMCwxMTUsMTE2LDk5LDEwNCw5NywxMTAsMzIsCisJNjAsMzIsNzgsOTksMTA0LDk3LDExMCwwLDM3LDExNSwzNyw0OCwKKwk1MCw4OCw1OCwzNyw0OCw1MCw4OCw1OCwzNyw0OCw1MCw4OCwKKwk1OCwzNyw0OCw1MCw4OCw1OCwzNyw0OCw1MCw4OCw1OCwzNywKKwk0OCw1MCw4OCwzNywxMTUsMCwwLDAsMTc2LDcyLDAsMTMxLAorCTgwLDY3LDAsMTMxLDE2NCw2NywwLDEzMSwyNCw2OCwwLDEzMSwKKwk4MCw2NywwLDEzMSwwLDAsMCwwLDQsODIsMCwxMzEsCisJMTg0LDc2LDAsMTMxLDEyLDc3LDAsMTMxLDEyOCw3NywwLDEzMSwKKwkxODQsNzYsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMzcsMTE1LDU4LDM3LDEwMCw1OCwzMiwxMDIsCisJOTcsMTA1LDEwOCwxMDEsMTAwLDMyLDk3LDExNSwxMTUsMTAxLDExNCwxMTYsCisJMTA1LDExMSwxMTAsMzIsOTYsMzcsMTE1LDM5LDEwLDAsMCwwLAorCTEwMSwxMTYsMTA0LDk1LDEyMCwxMDksMTA1LDExNiw0Niw5OSwwLDAsCisJOTksOTgsMTEyLDQ1LDYyLDExMCwxMTEsMTEyLDQ2LDk5LDEwOSwxMDAsCisJMzIsNjEsNjEsMzIsNzMsNTMsNTcsNTQsOTUsNjcsNjYsOTUsCisJNjcsNzcsNjgsOTUsNzgsNzksODAsMTI0LDczLDUzLDU3LDU0LAorCTk1LDY3LDY2LDk1LDY3LDc3LDY4LDk1LDY5LDc2LDAsMCwKKwk5OSw5OCwxMTIsNDUsNjIsMTEwLDExMSwxMTIsNDYsOTksMTA5LDEwMCwKKwkzMiwzOCwzMiw3Myw1Myw1Nyw1NCw5NSw2Nyw2Niw5NSw2NywKKwk3Nyw2OCwwLDAsMTEyLDQ1LDYyLDExNSw5OSw5OCwxMTIsNDUsCisJNjIsMTE1LDExNiw5NywxMTYsMTE3LDExNSwzMiwzOCwzMiw3Myw1MywKKwk1Nyw1NCw5NSw4Myw2Nyw2Niw5NSw2Nyw3OCw2NSwwLDAsCisJMzUsMzUsMzUsMzIsOTksMTA5LDEwMCwzMiwxMTUsMTE2LDEwNSwxMDgsCisJMTA4LDMyLDk4LDExNywxMTUsMTIxLDU4LDMyLDM3LDEyMCwxMCwwLAorCTM3LDEwMCw2MSwzNywxMDAsNDQsMzcsMTIwLDQ0LDM3LDEwMCwxMCwKKwkwLDAsMCwwLDM5LDM3LDExNSwzOSwzMiwzNywxMjAsMzIsCisJMzcsMTIwLDEwLDAsMzcsNDgsNTYsMTIwLDU4LDMyLDM3LDQ4LAorCTUwLDEyMCwxMCwwLDM3LDQ4LDU2LDEyMCw1OCwzMiwzNyw0OCwKKwk1MiwxMjAsMTAsMCwzNyw0OCw1NiwxMjAsNTgsMzIsMzcsNDgsCisJNTYsMTIwLDEwLDAsMTA4LDEwNSwxMTAsMTA3LDMyLDExNSwxMTYsOTcsCisJMTE2LDEwMSwzMiwzNyw0OCw1MCwxMjAsMTAsMCwwLDAsMCwKKwk0Miw0Miw0MiwzMiwxMDMsMTExLDExNiwzMiwzNywxMDAsMzIsMTA1LAorCTExMCwxMTYsMTAxLDExNCwxMTQsMTE3LDExMiwxMTYsMTE1LDEwLDAsMCwKKwkzNSwzNSwzNSwzMiw2OSwxMjAsMTEyLDEwMSw5OSwxMTYsMTAxLDEwMCwKKwkzMiwzNywxMDAsMzIsOTgsMTE3LDExNiwzMiwxMDMsMTExLDExNiwzMiwKKwkzNywxMDAsMzIsMTA1LDExMCwxMTYsMTAxLDExNCwxMTQsMTE3LDExMiwxMTYsCisJMTE1LDEwLDAsMCw4MCw3Niw4OCw1Nyw0OCw1NCw0OCwzMiwKKwk2NSwxMDAsMTAwLDExNCwxMDEsMTE1LDExNSwzMiw2MSwzMiwzNyw4OCwKKwkzMiw2OCw2NSw4NCw2NSwzMiw2MSwzMiwzNyw4OCwzMiwxMCwKKwkwLDAsMCwwLDQyLDQyLDQyLDMyLDg3LDExNCwxMDUsMTE2LAorCTEwMSwzMiwxMTEsMTAyLDMyLDM3LDEyMCwzMiwxMTYsMTExLDMyLDM3LAorCTEwMCwzMiwxMDIsOTcsMTA1LDEwOCwxMDEsMTAwLDEwLDAsMCwwLAorCTQyLDQyLDQyLDMyLDg3LDExNCwxMDUsMTE2LDEwMSwzMiwxMTEsMTAyLAorCTMyLDM3LDEyMCwzMiwxMTYsMTExLDMyLDM3LDEyMCwzMiwxMDIsOTcsCisJMTA1LDEwOCwxMDEsMTAwLDEwLDAsMCwwLDQyLDQyLDQyLDQyLAorCTQyLDQyLDQyLDQyLDQyLDQyLDQyLDQyLDQyLDQyLDQyLDQyLAorCTAsMCwwLDAsNDIsNDIsNDIsMzIsNzMsMTA4LDEwOCwxMDEsCisJMTAzLDk3LDEwOCwzMiw5OSwxMTEsMTA5LDEwOSw5NywxMTAsMTAwLDMyLAorCTM5LDM3LDExNSwzOSwxMCwwLDAsMCw0NSw0NSw0NSwzMiwKKwk5OSwxMTEsMTA5LDEwOSw5NywxMTAsMTAwLDExNSwzMiwxMDksNDQsMTE2LAorCTQ0LDEwMSw0NCw2OSw0NCw5Nyw0NCwxMjAsNDQsMTA4LDQ0LDExNSwKKwk0NCwxMTIsMzIsOTksOTcsMTEwLDMyLDk4LDEwMSwzMiwxMTIsMTE0LAorCTEwMSwxMDIsMTA1LDEyMCwxMDEsMTAwLDMyLDExOSwxMDUsMTE2LDEwNCwzMiwKKwk5NywzMiwxMTQsMTAxLDExMiwxMDEsOTcsMTE2LDMyLDk5LDExMSwxMTcsCisJMTEwLDExNiwwLDAsMTA4LDMyLDEyMCwxMTIsMTExLDExNCwxMTYsMzIsCisJMTE0LDExMiwxMTEsMTE0LDExNiwzMiw5MSwxMDgsMTAxLDExMCw5MywzMiwKKwkzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3NiwxMTEsMTExLAorCTExMiw5OCw5Nyw5OSwxMDcsMzIsMTE2LDEwMSwxMTUsMTE2LDMyLDEwMiwKKwkxMTQsMTExLDEwOSwzMiwxMjAsMTEyLDExMSwxMTQsMTE2LDMyLDQwLDQ5LAorCTQ1LDU0LDQxLDMyLDExNiwxMTEsMzIsMTE0LDExMiwxMTEsMTE0LDExNiwKKwkzMiw0MCw0OSw0NSw1NCw0MSwwLDAsMTA1LDMyLDMyLDMyLAorCTMyLDMyLDMyLDMyLDMyLDMyLDczLDExMCwxMTYsMTAxLDExNCwxMTQsCisJMTE3LDExMiwxMTYsMzIsNzIsMTExLDExNSwxMTYsMzIsMzIsMTI0LDMyLAorCTMyLDExNSwzMiw5MSwxMTIsMTExLDExNCwxMTYsOTMsMzIsOTEsMTA4LAorCTEwMSwxMTAsOTMsMzIsNjYsOTcsOTksMTA3LDUwLDk4LDk3LDk5LAorCTEwNywzMiwxMjAsMTA5LDEwNSwxMTYsMzIsOTksMTEwLDExNiwzMiwxMTIsCisJOTcsOTksMTA3LDEwMSwxMTYsMTE1LDAsMCw4MCwzMiwzMiwzMiwKKwkzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDEsMTE1LDExNiwzMiw4MCwKKwk3Niw4OCwzMiw1Nyw0OCw1NCw0OCwzMiwzMiwzMiwxMjQsMzIsCisJMzIsMTAwLDMyLDkxLDExNCwxMjQsMTE5LDEyNCwxMDgsMTI0LDExNiw5MywKKwkzMiw5MSwxMTgsOTcsMTA4LDEyNCwzOSw5OSwzOSw5MywzMiwzMiwKKwk4MiwxMDEsOTcsMTAwLDQ3LDg3LDExNCwxMDUsMTE2LDEwMSw0Nyw3NiwKKwkxMTEsMTExLDExMiw0Nyw4NCwxMDUsMTA5LDEwMSwzMiw2OCw3Nyw2NSwKKwkwLDAsMCwwLDc2LDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorCTMyLDMyLDgyLDEwMSw5NywxMDAsMzIsNzYsMTA1LDExMCwxMDcsMzIsCisJNzYsNjksNjgsMTE1LDMyLDMyLDEyNCwzMiwzMiwxMTIsMzIsMTE0LAorCTEwMSwxMDMsMTEwLDExMSwzMiw5MSwxMTgsOTcsMTA4LDkzLDMyLDMyLAorCTgyLDEwMSw5NywxMDAsNDcsOTEsMTE5LDExNCwxMDUsMTE2LDEwMSw5MywKKwkzMiw4MCw3Niw4OCwzMiwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMDEsCisJMTE0LDAsMCwwLDY1LDMyLDk3LDEwMCwxMDAsMTE0LDMyLDMyLAorCTMyLDMyLDgzLDEwMSwxMTYsMzIsMTAxLDExNiwxMDQsMTAxLDExNCwzMiwKKwk5NywxMDAsMTAwLDExNCwzMiwzMiwxMjQsMzIsMzIsMzYsMzIsMTE1LAorCTk5LDExNCwxMDUsMTEyLDExNiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKwk4MiwxMDEsOTcsMTAwLDMyLDk5LDEwOSwxMDAsMTE1LDMyLDEwMiwxMTQsCisJMTExLDEwOSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMzksMTE1LDk5LDExNCwKKwkxMDUsMTEyLDExNiwzOSwwLDAsMCwwLDEyMCwzMiw5MSwxMTIsCisJMTExLDExNCwxMTYsOTMsMzIsMzIsODQsMTIwLDMyLDEwMSwxMTYsMTA0LAorCTEwMSwxMTQsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTI0LDMyLAorCTMyLDgyLDMyLDkxLDExMiwxMTEsMTE0LDExNiw5MywzMiwzMiwzMiwKKwkzMiwzMiwzMiwzMiw4MiwxMjAsMzIsMTAxLDExNiwxMDQsMTAxLDExNCwKKwkzMiw5MSwxMTEsMTEwLDMyLDExMiwxMTEsMTE0LDExNiwzMiw0OSw0NSwKKwk1NCw5MywwLDAsNzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCisJMzIsMzIsODQsMTExLDEwMywxMDMsMTA4LDEwMSwzMiw3MCw2Nyw2NywKKwkzMiwxMTYsMTAxLDExNSwxMTYsMzIsMTI0LDMyLDMyLDExMyw0NCw5NCwKKwk2OCw0NCw5NCw5MCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKwk4MSwxMTcsMTA1LDExNiwwLDAsMCwwLDk3LDMyLDMyLDMyLAorCTMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwMSwxMTUsMTE2LDMyLDk3LAorCTEwOCwxMDgsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTI0LDMyLAorCTMyLDkwLDMyLDEwOSwxMTUsMTAxLDk5LDExNSwzMiwzMiwzMiwzMiwKKwkzMiwzMiwzMiwzMiw4MCw5NywxMTcsMTE1LDEwMSwzMiwxMDIsMTExLAorCTExNCwzMiw5NywzMiwxMTksMTA0LDEwNSwxMDgsMTAxLDAsMCwwLAorCTY5LDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwMSwKKwkxMTUsMTE2LDMyLDY5LDY5LDgwLDgyLDc5LDc3LDMyLDMyLDMyLAorCTMyLDMyLDEyNCwzMiwzMiw4MywxMTQsMzIsOTcsMTAwLDEwMCwxMTQsCisJNTksMzIsODMsMTE5LDMyLDk3LDEwMCwxMDAsMTE0LDMyLDExOCw5NywKKwkxMDgsNTksMzIsMzIsODIsMTAxLDk3LDEwMCw0Nyw4NywxMTQsMTA1LAorCTExNiwxMDEsMzIsODAsNzYsODgsMzIsNjksNTAsMzIsMTE0LDEwMSwKKwkxMDMsMCwwLDAsMTAxLDMyLDkxLDExMiwxMTEsMTE0LDExNiw5MywKKwkzMiwzMiw4NCwxMDEsMTE1LDExNiwzMiwxMDEsMTE2LDEwNCwxMDEsMTE0LAorCTExMCwxMDEsMTE2LDMyLDMyLDMyLDEyNCwzMiwzMiw2OSwxMTQsMzIsCisJOTcsMTAwLDEwMCwxMTQsNTksMzIsNjksMTE5LDMyLDk3LDEwMCwxMDAsCisJMTE0LDMyLDExOCw5NywxMDgsNTksMzIsMzIsODIsMTAxLDk3LDEwMCwKKwk0Nyw4NywxMTQsMTA1LDExNiwxMDEsMzIsNjksNjksODAsODIsNzksCisJNzcsMzIsMTE0LDEwMSwxMDMsMCwwLDAsMTE2LDMyLDMyLDMyLAorCTMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwMSwxMTUsMTE2LDMyLDExNiwKKwkxMDUsMTA5LDEwMSwxMTQsMTE1LDMyLDMyLDMyLDMyLDMyLDEyNCwzMiwKKwkzMiwxMTksOTEsNDIsOTMsMzIsOTcsMTAwLDEwMCwxMTQsMzIsMTE4LAorCTk3LDEwOCwzMiwzMiw4NywxMTQsMTA1LDExNiwxMDEsMzIsMTA5LDEwMSwKKwkxMDksMTExLDExNCwxMjEsNTgsMzIsMTE5LDk4LDMyLDExOSwxMDQsNDQsCisJMzIsMTE5LDExOSw0NCwzMiwxMTksMTE2LDAsMTA5LDMyLDMyLDMyLAorCTMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwMSwxMTUsMTE2LDMyLDEwOSwKKwkxMDEsMTA5LDExMSwxMTQsMTIxLDMyLDMyLDMyLDMyLDMyLDEyNCwzMiwKKwkzMiwxMTQsOTEsNDIsOTMsMzIsOTcsMTAwLDEwMCwxMTQsMzIsMzIsCisJMzIsMzIsMzIsMzIsODIsMTAxLDk3LDEwMCwzMiwxMDksMTAxLDEwOSwKKwkxMTEsMTE0LDEyMSw1OCwzMiwxMTQsOTgsMzIsMTE0LDEwNCw0NCwzMiwKKwkxMTQsMTE5LDQ0LDMyLDExNCwxMTYsMCwwLDQyLDQyLDQyLDMyLAorCTgyLDEwNSwxMDMsMTA0LDExNiw4MywxMTksMTA1LDExNiw5OSwxMDQsMzIsCisJNjgsMTA1LDk3LDEwMywxMTAsMTExLDExNSwxMTYsMTA1LDk5LDExNSwzMiwKKwkxMDksMTAxLDExMCwxMTcsMzIsNDIsNDIsNDIsMCwwLDAsMCwKKwk0NSw0NSw0NSwzMiw4NCwxMDQsMTE0LDEwMSwxMDEsMzIsOTksMTExLAorCTExMiwxMDUsMTAxLDExNSwzMiwxMTEsMTAyLDMyLDk3LDEwMCwxMDAsMTE0LAorCTEwMSwxMTUsMTE1LDMyLDEwMCwxMTEsMzIsMTEwLDExMSwxMTYsMzIsOTcsCisJMTAzLDExNCwxMDEsMTAxLDMzLDEwLDAsMCw0NSw0NSw0NSwzMiwKKwk2OSwxMTYsMTA0LDEwMSwxMTQsMzIsNjUsMTAwLDEwMCwxMTQsMTAxLDExNSwKKwkxMTUsMzIsNzgsMTExLDExNiwzMiw4MywxMDEsMTE2LDMzLDEwLDAsCisJNDUsNDUsNDUsMzIsNjksMTE2LDEwNCwxMDEsMTE0LDMyLDY1LDEwMCwKKwkxMDAsMTE0LDEwMSwxMTUsMTE1LDMyLDEwNSwxMTUsMzIsOTcsMzIsMTA5LAorCTExNywxMDgsMTE2LDEwNSw5OSw5NywxMTUsMTE2LDMyLDk3LDEwMCwxMDAsCisJMTE0LDEwMSwxMTUsMTE1LDMzLDEwLDAsMCw0Miw0Miw0MiwzMiwKKwkzNyw0OCw1MCw4OCwzNyw0OCw1MCw4OCwzNyw0OCw1MCw4OCwKKwk1OCwzNyw0OCw1MCw4OCw1OCwzNyw0OCw1MCw4OCwzNyw0OCwKKwk1MCw4OCwxMCwwLDQ1LDQ1LDQ1LDMyLDcwLDEwNSwxMTQsMTE1LAorCTExNiwzMiw5OCwxMjEsMTE2LDEwMSwzMiw0MCwzNyw0OCw1MCw4OCwKKwk0MSwzMiwxMDUsMTE1LDMyLDk3LDMyLDk4LDExNCwxMTEsOTcsMTAwLAorCTk5LDk3LDExNSwxMTYsMzIsOTcsMTAwLDEwMCwxMTQsMTAxLDExNSwxMTUsCisJMTAsMCwwLDAsNDUsNDUsNDUsMzIsNzYsOTcsMTE1LDExNiwKKwkzMiwxMDAsMTA1LDEwMywxMDUsMTE2LDMyLDEwOSwxMTcsMTE1LDExNiwzMiwKKwk5OCwxMDEsMzIsNDgsMzIsMTExLDExNCwzMiw1NiwxMCwwLDAsCisJNDIsNDIsNDIsMzIsNjksMTA1LDEwMywxMDQsMTE2LDMyLDEwMSwxMTYsCisJMTA0LDEwMSwxMTQsMTEwLDEwMSwxMTYsMzIsOTcsMTAwLDEwMCwxMTQsMTAxLAorCTExNSwxMTUsMTAxLDExNSwzMiwxMDQsOTcsMTE4LDEwMSwzMiw5OCwxMDEsCisJMTAxLDExMCwzMiwxMTcsMTE1LDEwMSwxMDAsNTgsMTAsMCwwLDAsCisJNDIsNDIsNDIsMzIsODAsMTExLDExNCwxMTYsMzIsMzcsMTAwLDMyLAorCTEwMSwxMTYsMTA0LDEwMSwxMTQsMTEwLDEwMSwxMTYsMzIsOTcsMTAwLDEwMCwKKwkxMTQsMTAxLDExNSwxMTUsMzIsMTA1LDExNSwzMiwwLDAsMCwwLAorCTQ1LDQ1LDQ1LDMyLDY2LDk3LDEwMCwzMiwxMDEsMTE2LDEwNCwxMDEsCisJMTE0LDMyLDk3LDEwMCwxMDAsMTE0LDEwMSwxMTUsMTE1LDMyLDM5LDM3LAorCTExNSwzOSwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLAorCTEwLDAsMCwwLDAsMCwwLDAsMjQ0LDEwMSwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDI0NCwxMDEsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsNjQsMTEyLDAsMTMxLAorCTEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLAorCTEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLAorCTEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLAorCTEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLAorCTEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLAorCTEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLAorCTEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLAorCTEwNCwxMTIsMCwxMzEsMjgsMTExLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMzIsMTExLDAsMTMxLDE1MiwxMDksMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDI0NCwxMDEsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMjQsMTA3LDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDc2LDEwOCwwLDEzMSwxMDQsMTEyLDAsMTMxLAorCTIyOCwxMDgsMCwxMzEsMTEyLDExMCwwLDEzMSwxMDQsMTEyLDAsMTMxLAorCTEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLAorCTI4LDEwOSwwLDEzMSwxMDQsMTEyLDAsMTMxLDQ4LDExMSwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwk4NCwxMDksMCwxMzEsMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLAorCTMyLDExMiwwLDEzMSwxMzYsMTA2LDAsMTMxLDI4LDEwNiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsNTIsMTA3LDAsMTMxLAorCTEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwyNTIsMTA2LDAsMTMxLAorCTg4LDExMSwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTk2LDEwNywwLDEzMSwxMDQsMTEyLDAsMTMxLDE4MCwxMDQsMCwxMzEsCisJMTY4LDEwNiwwLDEzMSw5MiwxMDYsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDE0OCwxMDUsMCwxMzEsMTkyLDEwNiwwLDEzMSwKKwkwLDAsMCwwLDE4OCwxMTEsMCwxMzEsMjA0LDExMSwwLDEzMSwKKwkxMiwxMTIsMCwxMzEsMTIsMTEyLDAsMTMxLDEyLDExMiwwLDEzMSwKKwkxMiwxMTIsMCwxMzEsMTIsMTEyLDAsMTMxLDEyLDExMiwwLDEzMSwKKwkxMiwxMTIsMCwxMzEsMTIsMTEyLDAsMTMxLDEyLDExMiwwLDEzMSwKKwkxMiwxMTIsMCwxMzEsMjUyLDExMSwwLDEzMSwxMiwxMTIsMCwxMzEsCisJMTIsMTEyLDAsMTMxLDEyLDExMiwwLDEzMSwxMiwxMTIsMCwxMzEsCisJMjM2LDExMSwwLDEzMSwxMiwxMTIsMCwxMzEsMTIsMTEyLDAsMTMxLAorCTEyLDExMiwwLDEzMSwxMiwxMTIsMCwxMzEsMjIwLDExMSwwLDEzMSwKKwkyNTIsMTExLDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwk0Miw0Miw0MiwzMiw2OSw2OSw4MCw4Miw3OSw3NywzMiw4MCwKKwk5NywxMTUsMTE1LDEwMSwxMDAsMTAsMCwwLDMzLDMzLDMzLDMyLAorCTY5LDY5LDgwLDgyLDc5LDc3LDMyLDcwLDk3LDEwNSwxMDgsMTE3LAorCTExNCwxMDEsNTgsMzIsODcsMTE0LDExMSwxMTYsMTAxLDMyLDM3LDQ4LAorCTUyLDEyMCwzMiw5NywxMTYsMzIsMzcsMTAwLDQ0LDMyLDEwMywxMTEsCisJMTE2LDMyLDM3LDQ4LDUyLDEyMCwxMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDM1LDM1LDM1LDcwLAorCTExNCw5NywxMDksMTAxLDMyLDM3LDEwMCwzMiwxMDAsMTA1LDEwMCwzMiwKKwkxMTAsMTExLDExNiwzMiw5NywxMTQsMTE0LDEwNSwxMTgsMTAxLDEwLDAsCisJMzUsMzUsMzUsMzIsNzAsMTE0LDk3LDEwOSwxMDEsMzIsMzcsMTAwLAorCTQ0LDMyLDEwOCwxMDEsMTEwLDMyLDM3LDEwMCw0NCwzMiw5OCwxMjEsCisJMTE2LDEwMSwzMiwzNywxMDAsNDQsMzIsMTE5LDk3LDExMCwxMTYsMzIsCisJMzcsMTIwLDMyLDEwMywxMTEsMTE2LDMyLDM3LDEyMCwxMCwwLDAsCisJMzUsMzUsMzUsNzAsMTE0LDk3LDEwOSwxMDEsMzIsMzcsMTAwLDMyLAorCTExOSwxMTQsMTExLDExMCwxMDMsMzIsMTA4LDEwMSwxMTAsMTAzLDExNiwxMDQsCisJMzIsNDAsMTE5LDk3LDExMCwxMTYsMzIsMzcsMTAwLDMyLDEwMywxMTEsCisJMTE2LDMyLDM3LDEwMCw0MSwxMCwwLDAsMzUsMzUsMzUsNzAsCisJMTE0LDk3LDEwOSwxMDEsMzIsMzcsMTAwLDU4LDMyLDEwMywxMTEsMTE2LAorCTMyLDExNSwxMDEsMTEzLDMyLDM3LDEwMCwxMCwwLDAsMCwwLAorCTM1LDM1LDM1LDMyLDM3LDEwMCwzMiw2Nyw4Miw2NywzMiwxMDEsCisJMTE0LDExNCwxMTEsMTE0LDExNSwzMiwxMTEsOTksOTksMTE3LDExNCwxMDEsCisJMTAwLDEwLDAsMCwzNSwzNSwzNSwzMiwzNywxMDAsMzIsNjUsCisJMTA4LDEwNSwxMDMsMTEwLDMyLDEwMSwxMTQsMTE0LDExMSwxMTQsMTE1LDMyLAorCTExMSw5OSw5OSwxMTcsMTE0LDEwMSwxMDAsMTAsMCwwLDAsMCwKKwkzNSwzNSwzNSwzMiwzNywxMDAsMzIsODMsMTA0LDExMSwxMTQsMTE2LAorCTMyLDEwMSwxMTQsMTE0LDExMSwxMTQsMTE1LDMyLDExMSw5OSw5OSwxMTcsCisJMTE0LDEwMSwxMDAsMTAsMCwwLDAsMCwzNSwzNSwzNSwzMiwKKwkzNywxMDAsMzIsNzksMTE4LDEwMSwxMTQsMTE0LDExNywxMTAsMzIsMTAxLAorCTExNCwxMTQsMTExLDExNCwxMTUsMzIsMTExLDk5LDk5LDExNywxMTQsMTAxLAorCTEwMCwxMCwwLDAsMzUsMzUsMzUsMzIsNjcsODUsMzIsMTE1LAorCTExNiwxMDUsMTA4LDEwOCwzMiwxMTQsMTE3LDExMCwxMTAsMTA1LDExMCwxMDMsCisJNTgsMzIsMzcsMTIwLDEwLDAsMCwwLDM1LDM1LDM1LDMyLAorCTk5LDEwOSwxMDAsMzIsMTE1LDExNiwxMDUsMTA4LDEwOCwzMiw5OCwxMTcsCisJMTE1LDEyMSw1OCwzMiwzNywxMjAsMTAsMCwzNSwzNSwzNSwzMiwKKwkxMTUsMTE2LDk3LDExNiwxMTcsMTE1LDMyLDExNSwxMTYsMTA1LDEwOCwxMDgsCisJMzIsOTgsMTE3LDExNSwxMjEsNTgsMzIsMzcsMTIwLDEwLDAsMCwKKwk2Nyw2Niw2MSwzNywxMjAsNDQsMzIsODQsNjYsNjgsNjEsMzcsCisJMTIwLDQ0LDMyLDY2LDg1LDcwLDYxLDM3LDEyMCwxMCwwLDAsCisJMTE2LDEwMSwxMTUsMTE2LDk1LDEwMSwxMTYsMTA0LDEwMSwxMTQsNDYsOTksCisJMCwwLDAsMCwzNywxMDAsMzIsMTAyLDExNCw5NywxMDksMTAxLAorCTExNSwzMiwxMTEsMTAyLDMyLDEwOCwxMDEsMTEwLDEwMywxMTYsMTA0LDMyLAorCTM3LDEwMCwzMiwxMTUsMTAxLDExMCwxMTYsMzIsMTA1LDExMCwzMiwzNywKKwkxMDAsMzIsMTA5LDExNSwxMDEsOTksMTE1LDEwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJNDIsNDIsNDIsMzIsNTYsNTAsNTMsNTIsMzIsODQsMTA1LDEwOSwKKwkxMDEsMTE0LDMyLDQ4LDMyLDc5LDc1LDQ0LDMyLDk5LDExMSwxMTcsCisJMTEwLDExNiwzMiwxMTksOTcsMTE1LDMyLDM3LDEwMCwxMCwwLDAsCisJNDIsNDIsNDIsMzIsNTYsNTAsNTMsNTIsMzIsODQsMTA1LDEwOSwKKwkxMDEsMTE0LDMyLDQ4LDMyLDExMCwxMTEsMTE2LDMyLDEwNSwxMTAsMTE2LAorCTEwMSwxMTQsMTE0LDExNywxMTIsMTE2LDEwNSwxMTAsMTAzLDMyLDM3LDEwMCwKKwkxMCwwLDAsMCw0Miw0Miw0MiwzMiw1Niw1MCw1Myw1MiwKKwkzMiw4NCwxMDUsMTA5LDEwMSwxMTQsMzIsNDgsMzIsMTE1LDExMiwxMDEsCisJMTAxLDEwMCwzMiwxMTksMTE0LDExMSwxMTAsMTAzLDQ0LDMyLDEwMywxMTEsCisJMTE2LDMyLDM3LDEwMCwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwKKwk5OCwxMDEsMzIsNDksNDgsNDgsNDgsMTAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwk5LDM3LDEyMCw1OCwzMiwxMTksOTcsMTEwLDExNiwzMiwzNywxMjAsCisJMzIsMTAzLDExMSwxMTYsMzIsMzcsMTIwLDEwLDAsMCwwLDAsCisJNDUsNDUsNDUsMzIsODIsNjUsNzcsMzIsODQsMTAxLDExNSwxMTYsCisJMzIsMTExLDEwMiwzMiwzNywxMjAsMzIsMTE2LDExMSwzMiwzNywxMjAsCisJMzIsMTAyLDk3LDEwNSwxMDgsMTAxLDEwMCwxMCwwLDAsMCwwLAorCTQyLDQyLDQyLDMyLDgyLDY1LDc3LDMyLDg0LDEwMSwxMTUsMTE2LAorCTMyLDExMSwxMDIsMzIsMzcsMTIwLDMyLDExNiwxMTEsMzIsMzcsMTIwLAorCTMyLDExMiw5NywxMTUsMTE1LDEwMSwxMDAsMTAsMCwwLDAsMCwKKwkzNSwzNSwzNSwzMiw2OCw3Nyw2NSwzMiw2OCw3OSw3OCw2OSwKKwkzMiwxMTAsMTAxLDExOCwxMDEsMTE0LDMyLDExMSw5OSw5OSwxMTcsMTE0LAorCTExNCwxMDEsMTAwLDQ2LDMyLDMyLDk5LDExNSwxMTQsMzIsNjEsMzIsCisJMzcsMTIwLDEwLDAsMzUsMzUsMzUsMzIsNzIsMTExLDExNSwxMTYsCisJMzIsMTEwLDEwMSwxMTgsMTAxLDExNCwzMiwxMDMsMTExLDExNiwzMiw2OCwKKwk3Nyw2NSwzMiwxMDUsMTEwLDExNiwxMDEsMTE0LDExNCwxMTcsMTEyLDExNiwKKwk0NiwzMiw5OCw5OSw5NSw5OSwxMTAsMTE2LDMyLDYxLDMyLDM3LAorCTEwMCwxMCwwLDAsMzUsMzUsMzUsMzIsNjgsNzcsNjUsMzIsCisJMTAxLDExNCwxMTQsMTExLDExNCwzMiw5NywxMTYsMzIsMTA1LDExMCwxMDAsCisJMTAxLDEyMCwzMiwzNywxMDAsNTgsMzIsMTE5LDk3LDExMCwxMTYsMTAxLAorCTEwMCwzMiwzNyw0OCw1MCwxMjAsMzIsMTAzLDExMSwxMTYsMzIsMzcsCisJNDgsNTAsMTIwLDEwLDAsMCwwLDAsMzUsMzUsMzUsMzIsCisJNzMsMTA4LDEwOCwxMDEsMTAzLDk3LDEwOCwzMiw3MiwxMTEsMTE1LDExNiwKKwkzMiw5NywxMDAsMTAwLDExNCwzMiw0MCw2MSwzNywxMjAsNDEsMzIsCisJMTExLDExNCwzMiwxMDgsMTAxLDExMCwxMDMsMTE2LDEwNCwzMiw0MCw2MSwKKwkzNywxMDAsNDEsMTAsMCwwLDAsMCwzNSwzNSwzNSwzMiwKKwk2NywxMTEsMTE3LDExMCwxMTYsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LAorCTMyLDk4LDEwMSwzMiw2MiwzMiw0OSw0OCw1MCw1Miw0Miw0OSwKKwk0OCw1MCw1MiwxMCwwLDAsMCwwLDQyLDQyLDQyLDMyLAorCTEwOCw5OSwxMDgsNDYsNjYsMTE3LDEwMiw0OSwzMiw2MSwzMiwzNywKKwkxMjAsMzIsNDUsNDUsNjIsMzIsMTA0LDExMSwxMTUsMTE2LDQ2LDY2LAorCTExNywxMDIsMzIsNjEsMzIsMzcsMTIwLDMyLDQ1LDQ1LDYyLDMyLAorCTEwOCw5OSwxMDgsNDYsNjYsMTE3LDEwMiw1MCwzMiw2MSwzMiwzNywKKwkxMjAsMTAsMCwwLDQyLDQyLDQyLDMyLDYyLDMyLDY4LDk4LAorCTMyLDM3LDEwMCwzMiw0MCw5OCwxMTcsMTE0LDExNSwxMTYsNDEsNTksCisJMzIsNjIsMzIsNjgsMTE5LDMyLDM3LDEwMCwzMiw0MCwxMTksOTcsCisJMTA1LDExNiwxMTUsMTE2LDk3LDExNiwxMDEsMTE1LDQxLDEwLDAsMCwKKwkzNSwzNSwzNSwzMiw4MywxMDEsOTksMTExLDExMCwxMDAsMzIsOTcsCisJMTE0LDEwMywzMiwxMDksMTE3LDExNSwxMTYsMzIsOTgsMTAxLDMyLDM5LAorCTExNCwzOSwzMiwxMTEsMTE0LDMyLDM5LDExOSwzOSwzMiwxMTEsMTE0LAorCTMyLDM5LDEwOCwzOSwxMCwwLDAsMCw0Miw0Miw0MiwzMiwKKwk2OCw3Nyw2NSwzMiwzNywxMTUsMzIsMTA1LDExMCwzMiwzNyw1MiwKKwkxMDAsMzIsOTgsMTIxLDExNiwxMDEsMzIsOTksMTA0LDExNywxMTAsMTA3LAorCTExNSw1OCwzMiwwLDMyLDMyLDExNiwxMTEsMzIsMTA0LDExMSwxMTUsCisJMTE2LDAsMCwwLDEwMiwxMTQsMTExLDEwOSwzMiwxMDQsMTExLDExNSwKKwkxMTYsMCwwLDAsMzcsNTYsMTAwLDMyLDk4LDEyMSwxMTYsMTAxLAorCTExNSw0NywxMTUsMTAxLDk5LDQ2LDEwLDAsMTE2LDEwNSwxMDksMTAxLAorCTMyLDExNiwxMTEsMTExLDMyLDExNSwxMDQsMTExLDExNCwxMTYsMzIsMTE2LAorCTExMSwzMiwxMDksMTAxLDk3LDExNSwxMTcsMTE0LDEwMSwxMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJODAsMzcsMTAwLDQ1LDYyLDM3LDExNSwzMiwxMCwwLDAsMCwKKwkxMTYsMTE0LDk3LDExMCwxMTUsMTA5LDEwNSwxMTYsMzIsMTEyLDEwMSwxMTAsCisJMTAwLDEwNSwxMTAsMTAzLDMyLDExMSwxMTAsMzIsMzcsMTAwLDEwLDAsCisJMTE2LDExNCw5NywxMTAsMTE1LDEwOSwxMDUsMTE2LDMyLDk5LDExMSwxMTAsCisJMTAyLDEwNSwxMDMsMzIsMTExLDExMCwzMiwzNywxMDAsMTAsMCwwLAorCTExNiwxMTQsOTcsMTEwLDExNSwxMDksMTA1LDExNiwzMiwxMTYsOTksMTEwLAorCTEwLDAsMCwwLDExNiw5OSwxMTAsMzIsMTAxLDEyMCwxMTIsMTAsCisJMCwwLDAsMCwxMDIsMTExLDExNCwxMTksOTcsMTE0LDEwMCw5NSwKKwkxMDAsMTAxLDEwOCw5NywxMjEsMzIsMTAxLDEyMCwxMTIsMzIsMzcsMTAwLAorCTEwLDAsMCwwLDEwOSwxMDEsMTE1LDExNSw5NywxMDMsMTAxLDk1LAorCTk3LDEwMywxMDEsMzIsMTAxLDEyMCwxMTIsMzIsMzcsMTAwLDEwLDAsCisJMTA0LDExMSwxMDgsMTAwLDMyLDEwMSwxMjAsMTEyLDMyLDM3LDEwMCwxMCwKKwkwLDAsMCwwLDg0LDEyMCw2Nyw3OSw3OCw3MCw3Myw3MSwKKwkzNywxMDAsMTAsMCw4NCwxMjAsODQsNjcsNzgsMzcsMTAwLDEwLAorCTAsMCwwLDAsMTE0LDk5LDExOCwzMiw5OSwxMTEsMTEwLDEwMiwKKwkxMDUsMTAzLDMyLDExMSwxMTAsMzIsMzcsMTAwLDEwLDAsMCwwLAorCTkwLDY5LDgyLDc5LDMyLDExNCwxMTEsMTExLDExNiwzMywzMiw5NywKKwkxMTYsMzIsMzcsMTIwLDMyLDAsMCwwLDExNSwxMTcsMTEyLDEwMSwKKwkxMTQsOTksMTAxLDEwMCwxMDEsMTE1LDMyLDM3LDEwMCwxMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJNjUsODIsODAsODIsNjksODEsMzIsMzcsMTIwLDMzLDEwLDAsCisJNjUsODIsODAsODIsNjksODAsMzIsMzcsMTIwLDMzLDEwLDAsCisJODMsMTAxLDExMCwxMDAsMzIsODUsNjgsODAsMzIsMzcsMTAwLDEwLAorCTAsMCwwLDAsNzgsMTExLDMyLDgyLDY2LDY4LDM5LDExNSwKKwkzMiwxMDUsMTEwLDMyLDg1LDY4LDgwLDMyLDQwLDM3LDEwMCwzMiwKKwkzNywxMDAsNDEsMTAsMCwwLDAsMCw4MywxMDEsMTEwLDExNiwKKwkzMiw4NSw2OCw4MCwzMiwzNywxMDAsMTAsMCwwLDAsMCwKKwk4Myw3OCw3Nyw4MCwzMiwzOSwzNyw5OSwzOSwzMiwxMDgsMTAxLAorCTExMCwzMiwzNywxMDAsMTAsMCwwLDAsNjksMTEwLDExOCwxMTEsCisJMTIxLDMyLDExNCw5OSw2MSwzNywxMDAsMTAsMCwwLDAsMCwKKwk3MSwxMDEsMTEwLDMyLDExNiwxMTQsOTcsMTEyLDMyLDM3LDEwMCwzMiwKKwkxMTQsOTksNjEsMzcsMTAwLDEwLDAsMCw2Niw5NywxMDAsMzIsCisJODUsNjgsODAsMzIsOTksMTA0LDEwMSw5OSwxMDcsMTE1LDExNywxMDksCisJMzIsMzcsMTIwLDMyLDEwOCwxMDEsMTEwLDMyLDM3LDEwMCwxMCwwLAorCTY2LDk3LDEwMCwzMiw4NSw2OCw4MCwzMiwxMDgsMTAxLDExMCwxMDMsCisJMTE2LDEwNCwzMiwxMTksOTcsMTEwLDExNiwzMiwzNywxMDAsMzIsMTAzLAorCTExMSwxMTYsMzIsMzcsMTAwLDEwLDAsMCw2Niw5NywxMDAsMzIsCisJNzMsNjcsNzcsODAsMzIsOTksMTA0LDEwMSw5OSwxMDcsMTE1LDExNywKKwkxMDksMTAsMCwwLDc4LDExMSwzMiw4Miw2Niw2OCwzOSwxMTUsCisJMzIsMTA1LDExMCwzMiw3Myw2Nyw3Nyw4MCwxMCwwLDAsMCwKKwk2Niw5NywxMDAsMzIsNzMsODAsMzIsOTksMTA0LDEwMSw5OSwxMDcsCisJMTE1LDExNywxMDksMTAsMCwwLDAsMCw4NCwxMTQsMTE3LDExMCwKKwk5OSw5NywxMTYsMTAxLDEwMCwzMiw3Myw4MCwxMCwwLDAsMCwKKwk4Myw2OSw3OCw4NCwzMiw3Myw4MCw4OCwzMywxMCwwLDAsCisJMTEwLDExMSwzMiwxMTUsMTIxLDExNSw3OCw5NywxMDksMTAxLDAsMCwKKwkxMTQsMTA1LDEwMywxMDQsMTE2LDExNSwxMTksMTA1LDExNiw5OSwxMDQsNDUsCisJMCwwLDAsMCw3OCwxMTEsMzIsODIsNjYsNjgsMzksMTE1LAorCTMyLDEwNSwxMTAsMzIsMTE1LDEwMSwxMTAsMTAwLDk1LDExNSw5NywxMTIsCisJMTAsMCwwLDAsNzgsMTExLDMyLDgyLDY2LDY4LDM5LDExNSwKKwkzMiwxMDUsMTEwLDMyLDczLDgwLDg4LDEwLDAsMCwwLDAsCisJODQsMTE0LDExNywxMTAsOTksOTcsMTE2LDEwMSwxMDAsMzIsNzMsODAsCisJODgsMTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwk3Nyw5NywxMDgsMTA4LDExMSw5OSwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LAorCTExMCwxMTUsMzIsNzgsODUsNzYsNzYsMzMsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsNjgsMTA1LDEwMywxMDUsCisJMzIsNzMsMTEwLDExNiwxMDgsNDYsMzIsODIsMTA1LDEwMywxMDQsMTE2LAorCTgzLDExOSwxMDUsMTE2LDk5LDEwNCwzMiw4Myw2OSw0NSw4OCwwLAorCTczLDExMCwxMTYsMTAxLDEwOCwzMiw1Niw1MCw1Myw1Nyw1NCwwLAorCTAsMCwwLDAsMCwwLDAsMCw4LDIwNiwwLDEzMSwKKwkzNiwyMDYsMCwxMzEsOTIsMjA2LDAsMTMxLDExMiwyMDYsMCwxMzEsCisJMTMyLDIwNiwwLDEzMSwyMjAsMjA2LDAsMTMxLDQsMjA3LDAsMTMxLAorCTQsMjA3LDAsMTMxLDM2LDIwNywwLDEzMSw1MiwyMDcsMCwxMzEsCisJODAsMjA3LDAsMTMxLDEwNCwyMDcsMCwxMzEsMTMyLDIwNywwLDEzMSwKKwkxNjAsMjA3LDAsMTMxLDE4OCwyMDcsMCwxMzEsMTg4LDIwNywwLDEzMSwKKwkyMTYsMjA3LDAsMTMxLDI0MCwyMDcsMCwxMzEsMTIsMjA4LDAsMTMxLAorCTQwLDIwOCwwLDEzMSw3MiwyMDgsMCwxMzEsMTEyLDIwOCwwLDEzMSwKKwkxODAsMjEwLDAsMTMxLDIzMiwyMTAsMCwxMzEsNCwyMTEsMCwxMzEsCisJMzYsMjExLDAsMTMxLDYwLDIxMSwwLDEzMSwwLDAsMCwwLAorCTY0LDIxMywwLDEzMSw5MiwyMTMsMCwxMzEsMTI0LDIxMywwLDEzMSwKKwkxNjAsMjEzLDAsMTMxLDYwLDIxNCwwLDEzMSw2MCwyMTQsMCwxMzEsCisJNjAsMjE0LDAsMTMxLDE4OCwyMTMsMCwxMzEsMjE2LDIxMywwLDEzMSwKKwkyNDQsMjEzLDAsMTMxLDI4LDIxNCwwLDEzMSwxNjgsMjE0LDAsMTMxLAorCTYwLDIxNCwwLDEzMSwxNjgsMjE0LDAsMTMxLDE2OCwyMTQsMCwxMzEsCisJODgsMjE0LDAsMTMxLDEzMiwyMTQsMCwxMzEsMCwwLDAsMCwKKwkzNiwyMTYsMCwxMzEsNjgsMjE2LDAsMTMxLDEwNCwyMTYsMCwxMzEsCisJMTQwLDIxNiwwLDEzMSwxNDAsMjE2LDAsMTMxLDAsMCwwLDAsCisJMjQ4LDIxNywwLDEzMSwxMiwyMTgsMCwxMzEsNDAsMjE4LDAsMTMxLAorCTc2LDIxOCwwLDEzMSwxMjQsMjE4LDAsMTMxLDE1MiwyMTgsMCwxMzEsCisJMjAwLDIxOCwwLDEzMSwyMjgsMjE4LDAsMTMxLDg4LDIxOSwwLDEzMSwKKwkxMTYsMjE5LDAsMTMxLDY0LDIyNCwwLDEzMSw5MiwyMjQsMCwxMzEsCisJMTI0LDIyNCwwLDEzMSwxNTIsMjI0LDAsMTMxLDE4NCwyMjQsMCwxMzEsCisJMCwwLDAsMCwxMTAsMTExLDMyLDExNSwxMjEsMTE1LDY3LDExMSwKKwkxMTAsMTE2LDk3LDk5LDExNiwwLDAsMCwxMTAsMTExLDMyLDExNSwKKwkxMjEsMTE1LDc4LDk3LDEwOSwxMDEsMCwwLDExMCwxMTEsMzIsMTE1LAorCTEyMSwxMTUsNzYsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwwLDAsCisJMzcsMTE1LDU4LDM3LDEwMCw1OCwzMiwxMDIsOTcsMTA1LDEwOCwxMDEsCisJMTAwLDMyLDk3LDExNSwxMTUsMTAxLDExNCwxMTYsMTA1LDExMSwxMTAsMzIsCisJOTYsMzcsMTE1LDM5LDEwLDAsMCwwLDExMCwxMTcsMTA5LDExNCwKKwkxMDEsMTAzLDExNSwzMiw2MCw2MSwzMiw3OCw4Niw4Miw2NSw3NywKKwk5NSw3OCw4Miw2OSw3MSw4MywzMiwzOCwzOCwzMiwxMTAsMTE3LAorCTEwOSwxMTQsMTAxLDEwMywxMTUsMzIsNjIsMzIsNDgsMCwwLDAsCisJMTAyLDEwNSwxMTQsMTE1LDExNiwxMTQsMTAxLDEwMywzMiw2MCwzMiw3OCwKKwk4Niw4Miw2NSw3Nyw5NSw3OCw4Miw2OSw3MSw4MywzMiwzOCwKKwkzOCwzMiwxMDIsMTA1LDExNCwxMTUsMTE2LDExNCwxMDEsMTAzLDMyLDYyLAorCTYxLDMyLDQ4LDAsMCwwLDAsMCwxMCwxMyw2OSw4MiwKKwk4Miw3OSw4MiwzMiw0NSwwLDAsMCwwLDAsMCwwLAorCTE5MiwyNDQsMCwxMzEsOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsCisJOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsCisJOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsMTkyLDI1MSwwLDEzMSwKKwk4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSwyMDAsMjUxLDAsMTMxLAorCTIxMiwyNTEsMCwxMzEsMjEyLDI1MSwwLDEzMSwyMTIsMjUxLDAsMTMxLAorCTIxMiwyNTEsMCwxMzEsMjEyLDI1MSwwLDEzMSwyMTIsMjUxLDAsMTMxLAorCTIxMiwyNTEsMCwxMzEsMjEyLDI1MSwwLDEzMSwyMTIsMjUxLDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDIwMCwyNDQsMCwxMzEsCisJOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsCisJOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsCisJOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsCisJOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsCisJOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsCisJOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsCisJMjEyLDI0OSwwLDEzMSw4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSwKKwk4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSwKKwk4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSwKKwk4LDI1MiwwLDEzMSwyMCwyNDUsMCwxMzEsOCwyNDUsMCwxMzEsCisJODQsMjQ3LDAsMTMxLDgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDI0NCwyNTEsMCwxMzEsCisJOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsNDgsMjQ2LDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLAorCTI0MCwyNTAsMCwxMzEsOCwyNTIsMCwxMzEsMTMyLDI0OCwwLDEzMSwKKwk4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSwxNjAsMjQ5LDAsMTMxLAorCTcyLDQ2LDEsMTMxLDIyOCw0NywxLDEzMSwxNTIsNDYsMSwxMzEsCisJMTMyLDQ3LDEsMTMxLDAsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTIyOCw0NywxLDEzMSwyMjgsNDcsMSwxMzEsMTQ0LDQ3LDEsMTMxLAorCTEwOCw0NiwxLDEzMSwxMDgsNDYsMSwxMzEsMTA4LDQ2LDEsMTMxLAorCTE1Miw0NiwxLDEzMSwxNTIsNDYsMSwxMzEsMjI4LDQ3LDEsMTMxLAorCTEwOCw0NiwxLDEzMSwyMCw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJNTYsNTAsMSwxMzEsMjI0LDUwLDEsMTMxLDEwNCw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkyMTYsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwKKwkxNDQsNTAsMSwxMzEsMjAsNTAsMSwxMzEsMjAsNTAsMSwxMzEsCisJMjAsNTAsMSwxMzEsNTYsNTAsMSwxMzEsNTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIwLDUwLDEsMTMxLDEyNCw1MywxLDEzMSwKKwk5Niw1MywxLDEzMSw5Niw1MywxLDEzMSw5Niw1MywxLDEzMSwKKwk5Niw1MywxLDEzMSw5Niw1MywxLDEzMSw5Niw1MywxLDEzMSwKKwk5Niw1MywxLDEzMSw5Niw1MywxLDEzMSw5Niw1MywxLDEzMSwKKwk5Niw1MywxLDEzMSw5Niw1MywxLDEzMSw5Niw1MywxLDEzMSwKKwk5Niw1MywxLDEzMSw4OCw1MywxLDEzMSw2NCw1MywxLDEzMSwKKwk4MCw1MywxLDEzMSw3Miw1MywxLDEzMSw2NCw1MywxLDEzMSwKKwkwLDAsMCwwLDI4LDgzLDEsMTMxLDM2LDgzLDEsMTMxLAorCTM2LDgzLDEsMTMxLDM2LDgzLDEsMTMxLDM2LDgzLDEsMTMxLAorCTI4LDgzLDEsMTMxLDQ0LDgzLDEsMTMxLDQ0LDgzLDEsMTMxLAorCTQ0LDgzLDEsMTMxLDQ0LDgzLDEsMTMxLDQ0LDgzLDEsMTMxLAorCTI4LDgzLDEsMTMxLDQ0LDgzLDEsMTMxLDAsMCwwLDAsCisJMTk2LDg4LDEsMTMxLDIzMiw4OCwxLDEzMSwyMDgsODgsMSwxMzEsCisJMjIwLDg4LDEsMTMxLDI0NCw4OCwxLDEzMSwwLDAsMCwwLAorCTQsMCwwLDAsNSwwLDAsMCw2LDAsMCwwLAorCTcsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLAorCTAsMCwwLDAsMSwwLDAsMCw3MiwzMCwwLDEzMSwKKwk3MiwzMCwwLDEzMSwyMTYsNDQsMCwxMzEsMCwzMCwwLDEzMSwKKwkxMDgsMzAsMCwxMzEsMTA4LDMwLDAsMTMxLDEwOCwzMCwwLDEzMSwKKwkxMDgsMzAsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwyMCwxMzcsMSwxMzEsCisJMjA0LDEzNiwxLDEzMSwxMzIsMTM2LDEsMTMxLDU2LDEzNiwxLDEzMSwKKwkyMzYsMTM1LDEsMTMxLDE3MiwxMzUsMSwxMzEsMTIwLDEzNSwxLDEzMSwKKwk1MiwxMzUsMSwxMzEsMjMyLDEzNCwxLDEzMSwxNjAsMTM0LDEsMTMxLAorCTgwLDEzNCwxLDEzMSw4LDEzNCwxLDEzMSwxODgsMTMzLDEsMTMxLAorCTEyMCwxMzMsMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAorCTcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAorCTcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAorCTcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAorCTcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAorCTcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAorCTcyLDcyLDcyLDcyLDcyLDAsMCwwLDAsMjU1LDg1LDE3MCwKKwkwLDAsMCwwLDQsMCw4LDAsMTYsMCwzMiwwLAorCTY0LDAsMCwxLDAsOCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsNCwzLDIsMSwwLDAsMCwKKwk3LDAsMCwwLDEsMCwxLDAsMSwwLDIsMCwKKwkyMCwwLDE1LDAsMSwwLDAsMTI4LDEyOCwwLDAsMCwKKwkxMDAsMCwwLDAsOTYsMjA3LDEsMTMxLDkyLDIwNywxLDEzMSwKKwk4OCwyMDcsMSwxMzEsODQsMjA3LDEsMTMxLDgwLDIwNywxLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsNDgsNDksNTAsNTEsCisJNTIsNTMsNTQsNTUsNTYsNTcsNjUsNjYsNjcsNjgsNjksNzAsCisJMCwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw2NCwyMDQsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwk5NiwxNDgsMSwxMzEsMSwwLDQsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTIwMCwxNTUsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDEyNCwyMDQsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkxNjgsMjEwLDEsMTMxLDEsMCw2LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwk0LDE1NiwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsMTMyLDIwNCwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTQsMSwwLDE2MywxLDAsNjcsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTY0LDE1NiwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsMTY4LDIwNCwwLDEzMSwyNDgsMjA0LDAsMTMxLAorCTgwLDE4LDMsMTMxLDEsMCw0LDMsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkxMjQsMTU2LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSwxNjgsMjA0LDAsMTMxLDMyLDIwNSwwLDEzMSwKKwk5NiwxOCwzLDEzMSwxLDAsNCwzLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMTg0LDE1NiwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsMTY4LDIwNCwwLDEzMSw3MiwyMDUsMCwxMzEsCisJMTEyLDE4LDMsMTMxLDEsMCw0LDMsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkyNDQsMTU2LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSwxMTIsMjA1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMiwwLDAsMCwxLDAsMiwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJNDgsMTU3LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJMjIwLDE1NSwxLDEzMSwyLDAsMCwwLDI0LDE1NiwxLDEzMSwKKwkzLDAsMCwwLDg0LDE1NiwxLDEzMSw0LDAsMCwwLAorCTE0NCwxNTYsMSwxMzEsNSwwLDAsMCwyMDQsMTU2LDEsMTMxLAorCTYsMCwwLDAsOCwxNTcsMSwxMzEsNywwLDAsMCwKKwk2OCwxNTcsMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwxMjAsMjA1LDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsNDgsMjExLDEsMTMxLDEsMCwyLDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxNzIsMTU3LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTEsMCwyLDEsMTgwLDIwOCwwLDEzMSwxMzIsMjA1LDAsMTMxLAorCTE2NCwyMDIsMCwxMzEsNzYsMjA5LDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDQsMSwxODAsMjA4LDAsMTMxLAorCTEzMiwyMDUsMCwxMzEsMTY0LDIwMiwwLDEzMSw3NiwyMDksMCwxMzEsCisJMTI0LDE0OCwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsMiwxLAorCTE4MCwyMDgsMCwxMzEsMTMyLDIwNSwwLDEzMSwxNjQsMjAyLDAsMTMxLAorCTc2LDIwOSwwLDEzMSw2LDAsMCwwLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTEsMCwyLDEsMTgwLDIwOCwwLDEzMSwxMzIsMjA1LDAsMTMxLAorCTE2NCwyMDIsMCwxMzEsNzYsMjA5LDAsMTMxLDIyMCw1LDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsNjYsMSwxODAsMjA4LDAsMTMxLAorCTEzMiwyMDUsMCwxMzEsMTY0LDIwMiwwLDEzMSw3NiwyMDksMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNCwxLAorCTE4MCwyMDgsMCwxMzEsMTMyLDIwNSwwLDEzMSwxNjQsMjAyLDAsMTMxLAorCTc2LDIwOSwwLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTEsMCwyLDMsMTgwLDIwOCwwLDEzMSwxMzIsMjA1LDAsMTMxLAorCTIyOCwyMDksMCwxMzEsNzYsMjA5LDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDIsMSwxODAsMjA4LDAsMTMxLAorCTEzMiwyMDUsMCwxMzEsMTY0LDIwMiwwLDEzMSw3NiwyMDksMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNjcsMSwKKwkxODAsMjA4LDAsMTMxLDEzMiwyMDUsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwk3NiwyMDksMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNjUsMSwxODAsMjA4LDAsMTMxLDEzMiwyMDUsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSw3NiwyMDksMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsNjUsMSwxODAsMjA4LDAsMTMxLAorCTEzMiwyMDUsMCwxMzEsMTY0LDIwMiwwLDEzMSw3NiwyMDksMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNjUsMSwKKwkxODAsMjA4LDAsMTMxLDEzMiwyMDUsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwk3NiwyMDksMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNjUsMSwxODAsMjA4LDAsMTMxLDEzMiwyMDUsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSw3NiwyMDksMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsNjUsMSwxODAsMjA4LDAsMTMxLAorCTEzMiwyMDUsMCwxMzEsMTY0LDIwMiwwLDEzMSw3NiwyMDksMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNjUsMSwKKwkxODAsMjA4LDAsMTMxLDEzMiwyMDUsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwk3NiwyMDksMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNjUsMSwxODAsMjA4LDAsMTMxLDEzMiwyMDUsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSw3NiwyMDksMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsNjUsMSwxODAsMjA4LDAsMTMxLAorCTEzMiwyMDUsMCwxMzEsMTY0LDIwMiwwLDEzMSw3NiwyMDksMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNjUsMSwKKwkxODAsMjA4LDAsMTMxLDEzMiwyMDUsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwk3NiwyMDksMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNjUsMSwxODAsMjA4LDAsMTMxLDEzMiwyMDUsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSw3NiwyMDksMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsNjUsMSwxODAsMjA4LDAsMTMxLAorCTEzMiwyMDUsMCwxMzEsMTY0LDIwMiwwLDEzMSw3NiwyMDksMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNjYsMSwKKwkxODAsMjA4LDAsMTMxLDEzMiwyMDUsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwk3NiwyMDksMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNiwxLDE4MCwyMDgsMCwxMzEsMTMyLDIwNSwwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDc2LDIwOSwwLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDEsMCwwLDAsMjMyLDE1NywxLDEzMSwKKwkyLDAsMCwwLDE2LDE1OCwxLDEzMSwzLDAsMCwwLAorCTU2LDE1OCwxLDEzMSw0LDAsMCwwLDk2LDE1OCwxLDEzMSwKKwk1LDAsMCwwLDEzNiwxNTgsMSwxMzEsNiwwLDAsMCwKKwkxNzYsMTU4LDEsMTMxLDcsMCwwLDAsMjE2LDE1OCwxLDEzMSwKKwk4LDAsMCwwLDAsMTU5LDEsMTMxLDksMCwwLDAsCisJNDAsMTU5LDEsMTMxLDEwLDAsMCwwLDgwLDE1OSwxLDEzMSwKKwkxMSwwLDAsMCwxMjAsMTU5LDEsMTMxLDEyLDAsMCwwLAorCTE2MCwxNTksMSwxMzEsMTMsMCwwLDAsMjAwLDE1OSwxLDEzMSwKKwkxNCwwLDAsMCwyNDAsMTU5LDEsMTMxLDE1LDAsMCwwLAorCTI0LDE2MCwxLDEzMSwxNiwwLDAsMCw2NCwxNjAsMSwxMzEsCisJMTcsMCwwLDAsMTA0LDE2MCwxLDEzMSwxOCwwLDAsMCwKKwkxNDQsMTYwLDEsMTMxLDE5LDAsMCwwLDE4NCwxNjAsMSwxMzEsCisJMjAsMCwwLDAsMjI0LDE2MCwxLDEzMSwyMSwwLDAsMCwKKwk4LDE2MSwxLDEzMSwyMiwwLDAsMCw0OCwxNjEsMSwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJMzIsMjA4LDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMCwwLDE5MiwxNTcsMSwxMzEsMiwwLDAsMCwKKwk0MCwyMDgsMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwxMTIsMjA1LDAsMTMxLAorCTYwLDIxMCwwLDEzMSwyLDAsMCwwLDEsMCwyLDMsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSw1NiwxNjIsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDEyMCwyMDUsMCwxMzEsCisJNjAsMjEwLDAsMTMxLDAsMTcsMywxMzEsMSwwLDIsMywKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDExNiwxNjIsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDQsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxNzYsMTYyLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSw4LDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMjM2LDE2MiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTIsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSw0MCwxNjMsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDE2LDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTAwLDE2MywxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjAsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxNjAsMTYzLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwyNCwxNywzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDIyMCwxNjMsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDI4LDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMjQsMTY0LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwzMiwxNywzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDg0LDE2NCwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMzYsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxNDQsMTY0LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSw0MCwxNywzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDIwNCwxNjQsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDEyMCwyMDUsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSw0NCwxNywzLDEzMSwxLDAsMiwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsOCwxNjUsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDQ4LDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsNjgsMTY1LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSw1MiwxNywzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDEyOCwxNjUsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDU2LDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTg4LDE2NSwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsNjAsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwyNDgsMTY1LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSw2NCwxNywzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDUyLDE2NiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsNjgsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxMTIsMTY2LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTEsMCw2NCwxLDQ0LDIwMiwwLDEzMSw4OCwyMTAsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSwxMjAsMjExLDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDIsMSw0NCwyMDIsMCwxMzEsCisJODgsMjEwLDAsMTMxLDE2NCwyMDIsMCwxMzEsMTIwLDIxMSwwLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDEsMCw2NCwxLAorCTQ0LDIwMiwwLDEzMSw4OCwyMTAsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwkxMjAsMjExLDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDIsMSw0NCwyMDIsMCwxMzEsODgsMjEwLDAsMTMxLAorCTE2NCwyMDIsMCwxMzEsMTIwLDIxMSwwLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDEsMCwyLDEsNDQsMjAyLDAsMTMxLAorCTg4LDIxMCwwLDEzMSwxNjQsMjAyLDAsMTMxLDEyMCwyMTEsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorCTE3MiwxNjYsMSwxMzEsMiwwLDAsMCwyMTIsMTY2LDEsMTMxLAorCTMsMCwwLDAsMjUyLDE2NiwxLDEzMSw0LDAsMCwwLAorCTM2LDE2NywxLDEzMSw1LDAsMCwwLDc2LDE2NywxLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwk1NiwyMDgsMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTEsMCw2NCwzLDg0LDIxMiwwLDEzMSwxNiwyMTIsMCwxMzEsCisJNTIsMjEyLDAsMTMxLDE3MiwyMTIsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsMiwzLDg0LDIxMiwwLDEzMSwKKwkxNiwyMTIsMCwxMzEsNTIsMjEyLDAsMTMxLDE3MiwyMTIsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsMiwzLAorCTg0LDIxMiwwLDEzMSwxNiwyMTIsMCwxMzEsNTIsMjEyLDAsMTMxLAorCTE3MiwyMTIsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMiwzLDg0LDIxMiwwLDEzMSwxNiwyMTIsMCwxMzEsCisJNTIsMjEyLDAsMTMxLDE3MiwyMTIsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsMiwzLDg0LDIxMiwwLDEzMSwKKwkxNiwyMTIsMCwxMzEsNTIsMjEyLDAsMTMxLDE3MiwyMTIsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsMiwzLAorCTg0LDIxMiwwLDEzMSwxNiwyMTIsMCwxMzEsNTIsMjEyLDAsMTMxLAorCTE3MiwyMTIsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNjQsMyw4NCwyMTIsMCwxMzEsMTYsMjEyLDAsMTMxLAorCTUyLDIxMiwwLDEzMSwxNzIsMjEyLDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDIsMyw4NCwyMTIsMCwxMzEsCisJMTYsMjEyLDAsMTMxLDUyLDIxMiwwLDEzMSwxNzIsMjEyLDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDIsMSwKKwk4NCwyMTIsMCwxMzEsMTYsMjEyLDAsMTMxLDE2NCwyMDIsMCwxMzEsCisJMTcyLDIxMiwwLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTEsMCwyLDMsODQsMjEyLDAsMTMxLDE2LDIxMiwwLDEzMSwKKwk1MiwyMTIsMCwxMzEsMTcyLDIxMiwwLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDEsMCw2NCwzLDg0LDIxMiwwLDEzMSwKKwkxNiwyMTIsMCwxMzEsNTIsMjEyLDAsMTMxLDE3MiwyMTIsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsMiwzLAorCTg0LDIxMiwwLDEzMSwxNiwyMTIsMCwxMzEsNTIsMjEyLDAsMTMxLAorCTE3MiwyMTIsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNiwxLDg0LDIxMiwwLDEzMSwxNiwyMTIsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSwxNzIsMjEyLDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDAsMCwxODAsMTY3LDEsMTMxLAorCTIsMCwwLDAsMjIwLDE2NywxLDEzMSwzLDAsMCwwLAorCTQsMTY4LDEsMTMxLDQsMCwwLDAsNDQsMTY4LDEsMTMxLAorCTUsMCwwLDAsODQsMTY4LDEsMTMxLDYsMCwwLDAsCisJMTI0LDE2OCwxLDEzMSw3LDAsMCwwLDE2NCwxNjgsMSwxMzEsCisJOCwwLDAsMCwyMDQsMTY4LDEsMTMxLDksMCwwLDAsCisJMjQ0LDE2OCwxLDEzMSwxMCwwLDAsMCwyOCwxNjksMSwxMzEsCisJMTEsMCwwLDAsNjgsMTY5LDEsMTMxLDEyLDAsMCwwLAorCTEwOCwxNjksMSwxMzEsMTMsMCwwLDAsMTQ4LDE2OSwxLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwk3MiwyMDgsMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTEsMCwyLDMsODQsMjEyLDAsMTMxLDE2LDIxMiwwLDEzMSwKKwk1MiwyMTIsMCwxMzEsMTcyLDIxMiwwLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDEsMCw0LDMsODQsMjEyLDAsMTMxLAorCTE2LDIxMiwwLDEzMSw1MiwyMTIsMCwxMzEsMTcyLDIxMiwwLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDEsMCw2NCwzLAorCTg0LDIxMiwwLDEzMSwxNiwyMTIsMCwxMzEsNTIsMjEyLDAsMTMxLAorCTE3MiwyMTIsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMiwzLDg0LDIxMiwwLDEzMSwxNiwyMTIsMCwxMzEsCisJNTIsMjEyLDAsMTMxLDE3MiwyMTIsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsMCwwLDYwLDE3MCwxLDEzMSwKKwkyLDAsMCwwLDEwMCwxNzAsMSwxMzEsMywwLDAsMCwKKwkxNDAsMTcwLDEsMTMxLDQsMCwwLDAsMTgwLDE3MCwxLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwk4OCwyMDgsMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSw3MiwxNywzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDIwLDE3MSwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMCwwLDc2LDE2MiwxLDEzMSwyLDAsMCwwLAorCTEzNiwxNjIsMSwxMzEsMywwLDAsMCwxOTYsMTYyLDEsMTMxLAorCTQsMCwwLDAsMCwxNjMsMSwxMzEsNSwwLDAsMCwKKwk2MCwxNjMsMSwxMzEsNiwwLDAsMCwxMjAsMTYzLDEsMTMxLAorCTcsMCwwLDAsMTgwLDE2MywxLDEzMSw4LDAsMCwwLAorCTI0MCwxNjMsMSwxMzEsOSwwLDAsMCw0NCwxNjQsMSwxMzEsCisJMTAsMCwwLDAsMTA0LDE2NCwxLDEzMSwxMSwwLDAsMCwKKwkxNjQsMTY0LDEsMTMxLDEyLDAsMCwwLDIyNCwxNjQsMSwxMzEsCisJMTMsMCwwLDAsMjgsMTY1LDEsMTMxLDE0LDAsMCwwLAorCTg4LDE2NSwxLDEzMSwxNSwwLDAsMCwxNDgsMTY1LDEsMTMxLAorCTE2LDAsMCwwLDIwOCwxNjUsMSwxMzEsMTcsMCwwLDAsCisJMTIsMTY2LDEsMTMxLDE4LDAsMCwwLDcyLDE2NiwxLDEzMSwKKwkxOSwwLDAsMCwxMzIsMTY2LDEsMTMxLDIwLDAsMCwwLAorCTY0LDIwOCwxLDEzMSwyMSwwLDAsMCw4MCwyMDgsMSwxMzEsCisJMjIsMCwwLDAsOTYsMjA4LDEsMTMxLDIzLDAsMCwwLAorCTQwLDE3MSwxLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDE0NCwxNiwzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDE2LDE3MiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTQ4LDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsNzYsMTcyLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxNTIsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxMzYsMTcyLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxNTYsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxOTYsMTcyLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxNjAsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwwLDE3MywxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTY0LDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsNjAsMTczLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxNjgsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxMjAsMTczLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxNzIsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxODAsMTczLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxNzYsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwyNDAsMTczLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxODAsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSw0NCwxNzQsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDE4NCwxNiwzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDEwNCwxNzQsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDE4OCwxNiwzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDE2NCwxNzQsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDE5MiwxNiwzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDIyNCwxNzQsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDE5NiwxNiwzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDI4LDE3NSwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjAwLDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsODgsMTc1LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwyMDQsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxNDgsMTc1LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwyMDgsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwyMDgsMTc1LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwyMTIsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxMiwxNzYsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDIxNiwxNiwzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDcyLDE3NiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjIwLDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTMyLDE3NiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjI0LDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTkyLDE3NiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjI4LDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMjUyLDE3NiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjMyLDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsNTYsMTc3LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwyMzYsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxMTYsMTc3LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwyNDAsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxNzYsMTc3LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwyNDQsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwyMzYsMTc3LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTEsMCwwLDAsMzYsMTcyLDEsMTMxLDIsMCwwLDAsCisJOTYsMTcyLDEsMTMxLDMsMCwwLDAsMTU2LDE3MiwxLDEzMSwKKwk0LDAsMCwwLDIxNiwxNzIsMSwxMzEsNSwwLDAsMCwKKwkyMCwxNzMsMSwxMzEsNiwwLDAsMCw4MCwxNzMsMSwxMzEsCisJNywwLDAsMCwxNDAsMTczLDEsMTMxLDgsMCwwLDAsCisJMjAwLDE3MywxLDEzMSw5LDAsMCwwLDQsMTc0LDEsMTMxLAorCTEwLDAsMCwwLDY0LDE3NCwxLDEzMSwxMSwwLDAsMCwKKwkxMjQsMTc0LDEsMTMxLDEyLDAsMCwwLDE4NCwxNzQsMSwxMzEsCisJMTMsMCwwLDAsMjQ0LDE3NCwxLDEzMSwxNCwwLDAsMCwKKwk0OCwxNzUsMSwxMzEsMTUsMCwwLDAsMTA4LDE3NSwxLDEzMSwKKwkxNiwwLDAsMCwxNjgsMTc1LDEsMTMxLDE3LDAsMCwwLAorCTIyOCwxNzUsMSwxMzEsMTgsMCwwLDAsMzIsMTc2LDEsMTMxLAorCTE5LDAsMCwwLDkyLDE3NiwxLDEzMSwyMCwwLDAsMCwKKwkxNTIsMTc2LDEsMTMxLDIxLDAsMCwwLDIxMiwxNzYsMSwxMzEsCisJMjIsMCwwLDAsMTYsMTc3LDEsMTMxLDIzLDAsMCwwLAorCTc2LDE3NywxLDEzMSwyNCwwLDAsMCwxMzYsMTc3LDEsMTMxLAorCTI1LDAsMCwwLDE5NiwxNzcsMSwxMzEsMjYsMCwwLDAsCisJMCwxNzgsMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxMTIsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwwLDE3OSwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTE2LDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsNjAsMTc5LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxMjAsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxMjAsMTc5LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxMjQsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxODAsMTc5LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwyMDAsMjEyLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjIwLDUsMCwxNjMsMSwwLDY0LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwyNDAsMTc5LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwxMTIsMjA1LDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTYxLDAsMCwwLDEsMCwyLDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSw0NCwxODAsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCw0LDE4MCwxLDEzMSwyLDAsMCwwLAorCTY0LDE4MCwxLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCwxMjAsMjA4LDEsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwxLDAsMCwwLDIwLDE3OSwxLDEzMSwKKwkyLDAsMCwwLDgwLDE3OSwxLDEzMSwzLDAsMCwwLAorCTE0MCwxNzksMSwxMzEsNCwwLDAsMCwyMDAsMTc5LDEsMTMxLAorCTUsMCwwLDAsMTI4LDIwOCwxLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMSwwLDIsMSw0NCwyMDIsMCwxMzEsCisJMjA4LDIxMiwwLDEzMSwxNjQsMjAyLDAsMTMxLDE5NiwyMTQsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNjUsMSwKKwk0NCwyMDIsMCwxMzEsMjA4LDIxMiwwLDEzMSwxNjQsMjAyLDAsMTMxLAorCTE5NiwyMTQsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNjUsMSw0NCwyMDIsMCwxMzEsMjA4LDIxMiwwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDE5NiwyMTQsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsNjUsMSw0NCwyMDIsMCwxMzEsCisJMjA4LDIxMiwwLDEzMSwxNjQsMjAyLDAsMTMxLDE5NiwyMTQsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNjUsMSwKKwk0NCwyMDIsMCwxMzEsMjA4LDIxMiwwLDEzMSwxNjQsMjAyLDAsMTMxLAorCTE5NiwyMTQsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNjUsMSw0NCwyMDIsMCwxMzEsMjA4LDIxMiwwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDE5NiwyMTQsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsNjUsMSw0NCwyMDIsMCwxMzEsCisJMjA4LDIxMiwwLDEzMSwxNjQsMjAyLDAsMTMxLDE5NiwyMTQsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNjUsMSwKKwk0NCwyMDIsMCwxMzEsMjA4LDIxMiwwLDEzMSwxNjQsMjAyLDAsMTMxLAorCTE5NiwyMTQsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNjUsMSw0NCwyMDIsMCwxMzEsMjA4LDIxMiwwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDE5NiwyMTQsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsNjUsMSw0NCwyMDIsMCwxMzEsCisJMjA4LDIxMiwwLDEzMSwxNjQsMjAyLDAsMTMxLDE5NiwyMTQsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNjUsMSwKKwk0NCwyMDIsMCwxMzEsMjA4LDIxMiwwLDEzMSwxNjQsMjAyLDAsMTMxLAorCTE5NiwyMTQsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNjUsMSw0NCwyMDIsMCwxMzEsMjA4LDIxMiwwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDE5NiwyMTQsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsNjUsMSw0NCwyMDIsMCwxMzEsCisJMjA4LDIxMiwwLDEzMSwxNjQsMjAyLDAsMTMxLDE5NiwyMTQsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNiwxLAorCTQ0LDIwMiwwLDEzMSwyMDgsMjEyLDAsMTMxLDE2NCwyMDIsMCwxMzEsCisJMTk2LDIxNCwwLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTEsMCwwLDAsMTkyLDE4MCwxLDEzMSwyLDAsMCwwLAorCTIzMiwxODAsMSwxMzEsMywwLDAsMCwxNiwxODEsMSwxMzEsCisJNCwwLDAsMCw1NiwxODEsMSwxMzEsNSwwLDAsMCwKKwk5NiwxODEsMSwxMzEsNiwwLDAsMCwxMzYsMTgxLDEsMTMxLAorCTcsMCwwLDAsMTc2LDE4MSwxLDEzMSw4LDAsMCwwLAorCTIxNiwxODEsMSwxMzEsOSwwLDAsMCwwLDE4MiwxLDEzMSwKKwkxMCwwLDAsMCw0MCwxODIsMSwxMzEsMTEsMCwwLDAsCisJODAsMTgyLDEsMTMxLDEzLDAsMCwwLDEyMCwxODIsMSwxMzEsCisJMTYsMCwwLDAsMTYwLDE4MiwxLDEzMSwxNywwLDAsMCwKKwkyMDAsMTgyLDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMCwwLDE0NCwyMDgsMSwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwkxNjAsMjA4LDEsMTMxLDIsMCwwLDAsMTY4LDIwOCwxLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMCwwLDE4NCwyMDgsMSwxMzEsMiwwLDAsMCwKKwkxOTIsMjA4LDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMCwwLDIwOCwyMDgsMSwxMzEsMiwwLDAsMCwKKwkyMTYsMjA4LDEsMTMxLDMsMCwwLDAsMjI0LDIwOCwxLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMCwwLDI0MCwyMDgsMSwxMzEsMiwwLDAsMCwKKwkyNDgsMjA4LDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwk4LDIwOSwxLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwxLDAsMCwwLDI0LDIwOSwxLDEzMSwKKwkyLDAsMCwwLDMyLDIwOSwxLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTEsMCwwLDAsNDgsMjA5LDEsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCw2NCwyMDksMSwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDEsMCwwLDAsMjMyLDIwOCwxLDEzMSwKKwkyLDAsMCwwLDAsMjA5LDEsMTMxLDMsMCwwLDAsCisJMTYsMjA5LDEsMTMxLDQsMCwwLDAsNDAsMjA5LDEsMTMxLAorCTUsMCwwLDAsNTYsMjA5LDEsMTMxLDYsMCwwLDAsCisJNzIsMjA5LDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyLDAsMCwwLDE1MiwyMDgsMSwxMzEsNiwwLDAsMCwKKwkxNzYsMjA4LDEsMTMxLDcsMCwwLDAsMjAwLDIwOCwxLDEzMSwKKwk4LDAsMCwwLDgwLDIwOSwxLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsNywwLDAsMCw4OCwyMDksMSwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkxMjgsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwk4LDE4NSwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMTQ0LDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJNjgsMTg1LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkxNDgsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkxMjgsMTg1LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkxMzIsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkxODgsMTg1LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkxMzYsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkyNDgsMTg1LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkxNDAsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwk1MiwxODYsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTE1NiwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTExMiwxODYsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTE2MCwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTE3MiwxODYsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTE2NCwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTIzMiwxODYsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTE2OCwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTM2LDE4NywxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMTcyLDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJOTYsMTg3LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkxNzYsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkxNTYsMTg3LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkxODAsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkyMTYsMTg3LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkxODQsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkyMCwxODgsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTE4OCwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTgwLDE4OCwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMTkyLDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMTQwLDE4OCwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMTk2LDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMjAwLDE4OCwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMjAwLDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJNCwxODksMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTIwNCwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTY0LDE4OSwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMjA4LDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMTI0LDE4OSwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMjEyLDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMTg0LDE4OSwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMjIwLDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMjQ0LDE4OSwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMjI0LDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJNDgsMTkwLDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkyMjgsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkxMDgsMTkwLDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkyMzIsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkxNjgsMTkwLDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkyMzYsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkyMjgsMTkwLDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkyNDAsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkzMiwxOTEsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDEwNCwyMTUsMCwxMzEsMTQwLDIxNSwwLDEzMSwKKwkwLDAsMCwwLDEsMCwyLDMsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwk5MiwxOTEsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwkyOCwxODUsMSwxMzEsMiwwLDAsMCw4OCwxODUsMSwxMzEsCisJMywwLDAsMCwxNDgsMTg1LDEsMTMxLDQsMCwwLDAsCisJMjA4LDE4NSwxLDEzMSw1LDAsMCwwLDEyLDE4NiwxLDEzMSwKKwk2LDAsMCwwLDcyLDE4NiwxLDEzMSw4LDAsMCwwLAorCTEzMiwxODYsMSwxMzEsOSwwLDAsMCwxOTIsMTg2LDEsMTMxLAorCTEwLDAsMCwwLDI1MiwxODYsMSwxMzEsMTEsMCwwLDAsCisJNTYsMTg3LDEsMTMxLDEyLDAsMCwwLDExNiwxODcsMSwxMzEsCisJMTMsMCwwLDAsMTc2LDE4NywxLDEzMSwxNCwwLDAsMCwKKwkyMzYsMTg3LDEsMTMxLDE1LDAsMCwwLDQwLDE4OCwxLDEzMSwKKwkxNiwwLDAsMCwxMDAsMTg4LDEsMTMxLDE3LDAsMCwwLAorCTE2MCwxODgsMSwxMzEsMTgsMCwwLDAsMjIwLDE4OCwxLDEzMSwKKwkxOSwwLDAsMCwyNCwxODksMSwxMzEsMjAsMCwwLDAsCisJODQsMTg5LDEsMTMxLDIxLDAsMCwwLDE0NCwxODksMSwxMzEsCisJMjIsMCwwLDAsMjA0LDE4OSwxLDEzMSwyNCwwLDAsMCwKKwk4LDE5MCwxLDEzMSwyNSwwLDAsMCw2OCwxOTAsMSwxMzEsCisJMjYsMCwwLDAsMTI4LDE5MCwxLDEzMSwyNywwLDAsMCwKKwkxODgsMTkwLDEsMTMxLDI4LDAsMCwwLDI0OCwxOTAsMSwxMzEsCisJMjksMCwwLDAsNTIsMTkxLDEsMTMxLDMwLDAsMCwwLAorCTExMiwxOTEsMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwxODAsMjE1LDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjE4LDEyLDMsMTMxLDEsMCw0LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxMjgsMTkyLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwxMjAsMjA1LDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsNDAsMjExLDEsMTMxLDEsMCwyLDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxODgsMTkyLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwxMTIsMjA1LDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMiwwLDAsMCwxLDAsMiwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMjQ4LDE5MiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMiwxLDQ0LDIwMiwwLDEzMSwyMDAsMjE1LDAsMTMxLAorCTE2NCwyMDIsMCwxMzEsMTk2LDIxNiwwLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDEsMCwyLDEsNDQsMjAyLDAsMTMxLAorCTIwMCwyMTUsMCwxMzEsMTY0LDIwMiwwLDEzMSwxOTYsMjE2LDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDYsMSwKKwk0NCwyMDIsMCwxMzEsMjAwLDIxNSwwLDEzMSwxNjQsMjAyLDAsMTMxLAorCTE5NiwyMTYsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNjUsMSw0NCwyMDIsMCwxMzEsMjAwLDIxNSwwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDE5NiwyMTYsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsNjUsMSw0NCwyMDIsMCwxMzEsCisJMjAwLDIxNSwwLDEzMSwxNjQsMjAyLDAsMTMxLDE5NiwyMTYsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorCTUyLDE5MywxLDEzMSwyLDAsMCwwLDkyLDE5MywxLDEzMSwKKwkzLDAsMCwwLDEzMiwxOTMsMSwxMzEsNCwwLDAsMCwKKwkxNzIsMTkzLDEsMTMxLDUsMCwwLDAsMjEyLDE5MywxLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwkxMTIsMjA5LDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMCwwLDE0OCwxOTIsMSwxMzEsMiwwLDAsMCwKKwkyMDgsMTkyLDEsMTMxLDMsMCwwLDAsMTIsMTkzLDEsMTMxLAorCTQsMCwwLDAsMTIwLDIwOSwxLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLAorCTExMiwyMDUsMCwxMzEsMTU2LDIwMiwwLDEzMSwzLDAsMCwwLAorCTEsMCwyLDEsMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLAorCTE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwxMDAsMTk0LDEsMTMxLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwKKwk5MiwyMTcsMCwxMzEsNjAsMjEwLDAsMTMxLDIxNiwxMiwzLDEzMSwKKwkxLDAsMiwzLDMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwKKwkxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsMTYwLDE5NCwxLDEzMSwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCw4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsCisJMTA0LDIxNywwLDEzMSwxNTYsMjAyLDAsMTMxLDAsMCwwLDAsCisJMSwwLDY3LDEsMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLAorCTE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwyMjAsMTk0LDEsMTMxLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwKKwkxMDQsMjE3LDAsMTMxLDE1NiwyMDIsMCwxMzEsMCwwLDAsMCwKKwkxLDAsNjUsMSwzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsCisJMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLDI0LDE5NSwxLDEzMSwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCw4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsCisJMTEyLDIxNywwLDEzMSwxNTYsMjAyLDAsMTMxLDIxNiwxMiwzLDEzMSwKKwkxLDAsNCwxLDMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwKKwkxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsODQsMTk1LDEsMTMxLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwKKwkxMjAsMjA1LDAsMTMxLDE1NiwyMDIsMCwxMzEsMjI0LDEyLDMsMTMxLAorCTEsMCwyLDEsMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLAorCTE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwxNDQsMTk1LDEsMTMxLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwKKwkxMjAsMjA1LDAsMTMxLDE1NiwyMDIsMCwxMzEsMjI4LDEyLDMsMTMxLAorCTEsMCwyLDEsMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLAorCTE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwyMDQsMTk1LDEsMTMxLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwKKwk5MiwyMTcsMCwxMzEsMTU2LDIwMiwwLDEzMSwyMzIsMTIsMywxMzEsCisJMSwwLDIsMSwzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsCisJMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLDgsMTk2LDEsMTMxLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwKKwk5MiwyMTcsMCwxMzEsMTU2LDIwMiwwLDEzMSwyMzQsMTIsMywxMzEsCisJMSwwLDIsMSwzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsCisJMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLDY4LDE5NiwxLDEzMSwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCw4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsCisJOTIsMjE3LDAsMTMxLDE1NiwyMDIsMCwxMzEsMjQ2LDEyLDMsMTMxLAorCTEsMCwyLDEsMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLAorCTE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwxMjgsMTk2LDEsMTMxLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwKKwk5MiwyMTcsMCwxMzEsMTU2LDIwMiwwLDEzMSwyMzYsMTIsMywxMzEsCisJMSwwLDIsMSwzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsCisJMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLDE4OCwxOTYsMSwxMzEsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLAorCTkyLDIxNywwLDEzMSw2MCwyMTAsMCwxMzEsMjM4LDEyLDMsMTMxLAorCTEsMCwyLDMsMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLAorCTE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwyNDgsMTk2LDEsMTMxLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwKKwk5MiwyMTcsMCwxMzEsNjAsMjEwLDAsMTMxLDI0MCwxMiwzLDEzMSwKKwkxLDAsMiwzLDMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwKKwkxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsNTIsMTk3LDEsMTMxLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwKKwk5MiwyMTcsMCwxMzEsNjAsMjEwLDAsMTMxLDI0MiwxMiwzLDEzMSwKKwkxLDAsMiwzLDMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwKKwkxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsMTEyLDE5NywxLDEzMSwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsMiwxLDE4MCwyMTksMCwxMzEsCisJMTMyLDIxNywwLDEzMSwxNjQsMjAyLDAsMTMxLDEwNCwyMjAsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsMiwzLAorCTE4MCwyMTksMCwxMzEsMTMyLDIxNywwLDEzMSwwLDIyMSwwLDEzMSwKKwkxMDQsMjIwLDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDIsMSwxODAsMjE5LDAsMTMxLDEzMiwyMTcsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSwxMDQsMjIwLDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDIsMywxODAsMjE5LDAsMTMxLAorCTEzMiwyMTcsMCwxMzEsMCwyMjEsMCwxMzEsMTA0LDIyMCwwLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDEsMCwyLDMsCisJMTgwLDIxOSwwLDEzMSwxMzIsMjE3LDAsMTMxLDAsMjIxLDAsMTMxLAorCTEwNCwyMjAsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNCwxLDE4MCwyMTksMCwxMzEsMTMyLDIxNywwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDEwNCwyMjAsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsMiwxLDE4MCwyMTksMCwxMzEsCisJMTMyLDIxNywwLDEzMSwxNjQsMjAyLDAsMTMxLDEwNCwyMjAsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNCwxLAorCTE4MCwyMTksMCwxMzEsMTMyLDIxNywwLDEzMSwxNjQsMjAyLDAsMTMxLAorCTEwNCwyMjAsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNCwxLDE4MCwyMTksMCwxMzEsMTMyLDIxNywwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDEwNCwyMjAsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsNjUsMSwxODAsMjE5LDAsMTMxLAorCTEzMiwyMTcsMCwxMzEsMTY0LDIwMiwwLDEzMSwxMDQsMjIwLDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwkxNzIsMTk3LDEsMTMxLDIsMCwwLDAsMjEyLDE5NywxLDEzMSwKKwkzLDAsMCwwLDI1MiwxOTcsMSwxMzEsNCwwLDAsMCwKKwkzNiwxOTgsMSwxMzEsNSwwLDAsMCw3NiwxOTgsMSwxMzEsCisJNiwwLDAsMCwxMTYsMTk4LDEsMTMxLDcsMCwwLDAsCisJMTU2LDE5OCwxLDEzMSw4LDAsMCwwLDE5NiwxOTgsMSwxMzEsCisJOSwwLDAsMCwyMzYsMTk4LDEsMTMxLDEwLDAsMCwwLAorCTIwLDE5OSwxLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCwxMzYsMjA5LDEsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwxLDAsMCwwLDEyMCwxOTQsMSwxMzEsCisJMiwwLDAsMCwxODAsMTk0LDEsMTMxLDMsMCwwLDAsCisJMjQwLDE5NCwxLDEzMSw0LDAsMCwwLDQ0LDE5NSwxLDEzMSwKKwk1LDAsMCwwLDEwNCwxOTUsMSwxMzEsNiwwLDAsMCwKKwkxNjQsMTk1LDEsMTMxLDcsMCwwLDAsMjI0LDE5NSwxLDEzMSwKKwk4LDAsMCwwLDI4LDE5NiwxLDEzMSw5LDAsMCwwLAorCTg4LDE5NiwxLDEzMSwxMCwwLDAsMCwxNDgsMTk2LDEsMTMxLAorCTExLDAsMCwwLDIwOCwxOTYsMSwxMzEsMTIsMCwwLDAsCisJMTIsMTk3LDEsMTMxLDEzLDAsMCwwLDcyLDE5NywxLDEzMSwKKwkxNCwwLDAsMCwxMzIsMTk3LDEsMTMxLDE1LDAsMCwwLAorCTE0NCwyMDksMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMTYwLDIxMSwxLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTQ0LDIwMCwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsMTIwLDIwNSwwLDEzMSw2MCwyMTAsMCwxMzEsCisJMTQwLDEsMCwxNjMsMSwwLDIsMywzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTEwNCwyMDAsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDQsMSwKKwk0NCwyMDIsMCwxMzEsMzYsMjIyLDAsMTMxLDE2NCwyMDIsMCwxMzEsCisJNDgsMjIzLDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDIsMSw0NCwyMDIsMCwxMzEsMzYsMjIyLDAsMTMxLAorCTE2NCwyMDIsMCwxMzEsNDgsMjIzLDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDIsMSw0NCwyMDIsMCwxMzEsCisJMzYsMjIyLDAsMTMxLDE2NCwyMDIsMCwxMzEsNDgsMjIzLDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwkxNjQsMjAwLDEsMTMxLDIsMCwwLDAsMjA0LDIwMCwxLDEzMSwKKwkzLDAsMCwwLDI0NCwyMDAsMSwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDEsMCwwLDAsMTY4LDIwOSwxLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMSwwLDIsMSwKKwk0NCwyMDIsMCwxMzEsMjEyLDIyMywwLDEzMSwxNjQsMjAyLDAsMTMxLAorCTI1MiwyMjQsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMiwxLDQ0LDIwMiwwLDEzMSwyMTIsMjIzLDAsMTMxLAorCTE2NCwyMDIsMCwxMzEsMjUyLDIyNCwwLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDEsMCw2NSwxLDQ0LDIwMiwwLDEzMSwKKwkyMTIsMjIzLDAsMTMxLDE2NCwyMDIsMCwxMzEsMjUyLDIyNCwwLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDEsMCw2NSwxLAorCTQ0LDIwMiwwLDEzMSwyMTIsMjIzLDAsMTMxLDE2NCwyMDIsMCwxMzEsCisJMjUyLDIyNCwwLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTEsMCw2NSwxLDQ0LDIwMiwwLDEzMSwyMTIsMjIzLDAsMTMxLAorCTE2NCwyMDIsMCwxMzEsMjUyLDIyNCwwLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDEsMCwwLDAsNzYsMjAxLDEsMTMxLAorCTIsMCwwLDAsMTE2LDIwMSwxLDEzMSwzLDAsMCwwLAorCTE1NiwyMDEsMSwxMzEsNCwwLDAsMCwxOTYsMjAxLDEsMTMxLAorCTUsMCwwLDAsMjM2LDIwMSwxLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMSwwLDAsMCwxODQsMjA5LDEsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorCTY0LDIwMCwxLDEzMSwyLDAsMCwwLDEyNCwyMDAsMSwxMzEsCisJMywwLDAsMCwxNzYsMjA5LDEsMTMxLDQsMCwwLDAsCisJMTkyLDIwOSwxLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCwxMjgsMjA5LDEsMTMxLDIsMCwwLDAsCisJMTUyLDIwOSwxLDEzMSwzLDAsMCwwLDE2MCwyMDksMSwxMzEsCisJNCwwLDAsMCwyMDAsMjA5LDEsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwxLDAsMCwwLDI0LDIwOCwxLDEzMSwKKwkyLDAsMCwwLDQ4LDIwOCwxLDEzMSw0LDAsMCwwLAorCTEwNCwyMDgsMSwxMzEsNSwwLDAsMCwxMTIsMjA4LDEsMTMxLAorCTcsMCwwLDAsMTM2LDIwOCwxLDEzMSwxMCwwLDAsMCwKKwk5NiwyMDksMSwxMzEsMTEsMCwwLDAsMTA0LDIwOSwxLDEzMSwKKwkxNywwLDAsMCwyMDgsMjA5LDEsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwxLDAsMCwwLDIxNiwyMDksMSwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCwyNDAsMjA5LDEsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwxLDAsMCwwLDgsMjEwLDEsMTMxLAorCTIsMCwwLDAsMTYsMjEwLDEsMTMxLDMsMCwwLDAsCisJMjQsMjEwLDEsMTMxLDQsMCwwLDAsMzIsMjEwLDEsMTMxLAorCTUsMCwwLDAsNDAsMjEwLDEsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJNTYsMjEwLDEsMTMxLDIsMCwwLDAsNjQsMjEwLDEsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorCTcyLDIxMCwxLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJNDgsMjEwLDEsMTMxLDIsMCwwLDAsODAsMjEwLDEsMTMxLAorCTMsMCwwLDAsODgsMjEwLDEsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwxLDAsMCwwLDE2LDIwOCwxLDEzMSwKKwkyLDAsMCwwLDIyNCwyMDksMSwxMzEsMywwLDAsMCwKKwkyMzIsMjA5LDEsMTMxLDQsMCwwLDAsMjQ4LDIwOSwxLDEzMSwKKwk1LDAsMCwwLDAsMjEwLDEsMTMxLDYsMCwwLDAsCisJOTYsMjEwLDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMCwwLDEwNCwyMTAsMSwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDYsMCwwLDAsMTEyLDIxMCwxLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwKKwkxMjAsMjEwLDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMCwwLDEyOCwyMTAsMSwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMCwwLDMsMCwwLDAsNiwwLDAsMCwKKwkxLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCwKKwkxMCwwLDAsMCw3LDAsMCwwLDgsMCwwLDAsCisJMiwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDExMiwxMTcsOTgsMTA4LAorCTEwNSw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMTEyLDExNCwxMDUsMTE4LDk3LDExNiwxMDEsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwk4Myw3OCw3Nyw4MCw5NSwxMTYsMTE0LDk3LDExMiwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwkzLDAsMCwwLDYsMCwwLDAsMSwwLDAsMCwKKwk0LDAsMCwwLDEsMCwwLDAsNzYsMSwwLDAsCisJNSwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJMywwLDAsMCw2LDAsMCwwLDEsMCwwLDAsCisJMiwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsCisJMiwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsCisJMCwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsCisJNiwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsCisJMSwwLDAsMCwxNywwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsCisJNTYsNTcsNjUsNjYsNjcsNjgsNjksNzAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsODUsMTcwLDAsMjU1LDI1NSwyNTUsMjU1LDg1LDg1LDg1LDg1LAorCTE3MCwxNzAsMTcwLDE3MCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDY0LDQwLDM1LDQxLAorCTMyLDY3LDExMSwxMTIsMTIxLDExNCwxMDUsMTAzLDEwNCwxMTYsMzIsNDAsCisJOTksNDEsMzIsNDksNTcsNTYsNTQsMzIsNDUsMzIsNDksNTcsCisJNTcsNTMsMzIsMzIsNjksMTEyLDEwNSwxMDgsMTExLDEwMywxMTcsMTAxLAorCTMyLDg0LDEwMSw5OSwxMDQsMTEwLDExMSwxMDgsMTExLDEwMywxMjEsMzIsCisJNjcsMTExLDExNCwxMTIsMTExLDExNCw5NywxMTYsMTA1LDExMSwxMTAsMTAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwyNTUsMjU1LDI1NSwKKwk3MiwxMCwwLDAsNzgsMTAsMCwwLDgzLDEwLDAsMCwKKwk2OSwxMCwwLDAsMTA5LDk3LDEwNSwxMTAsNDYsOTksMCwwLAorCTQ4LDAsMCwwLDU1LDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJMCwwLDAsMCwxMTYsMTA1LDEwOSwxMDEsMTE0LDQ2LDk5LDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMTAwLDAsMCwwLDEwMCwwLDAsMCwxLDAsMCwwLAorCTAsMCwwLDAsMTE1LDExNCw5OSwzMiwwLDAsMCwwLAorCTMyLDAsMCwwLDEwMCwxMTUsMTE2LDMyLDAsMCwwLDAsCisJMzIsMzcsNDgsNTAsODgsMCwwLDAsMTAsMCwwLDAsCisJMjU1LDI1NSwyNTUsMjU1LDQ4LDQ4LDQ4LDQ4LDQ4LDQ4LDAsMCwKKwk0OCw0OCw0OCw0OCw0OCw0OSwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMjU1LDI1NSwyNTUsMjU1LAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTYyLDMyLDAsMCwzNywxMjAsMTAsMCwzNywxMjAsNTgsOSwKKwkzNywxMjAsMTAsMCwzNywxMTUsMTAsMCwwLDAsMCwwLAorCTEwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwk2OCw4NSw3Nyw4MCwxMCwwLDAsMCwzNyw0OCw1MCwxMjAsCisJMzIsMCwwLDAsMTAsMCwwLDAsMCwwLDAsMCwKKwkzNywxMDAsMzIsMTEyLDExMiwxMTUsMTAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorCTExOSwxMTksMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMSwxMjgsMTk0LDAsCisJMCwwLDAsMCwxLDEyOCwxOTQsMCwwLDE2LDAsMCwKKwk2Niw3Niw3NSwwLDcwLDg3LDY4LDAsNzYsODIsNzgsMCwKKwk3Niw3Myw4MywwLDY4LDczLDgzLDAsNzIsNjksNzYsNzYsCisJNzksMTAsMCwwLDExNiw5OSwzMiwxMDEsMTIwLDExMiwxMCwwLAorCTEwMiwxMTQsMTExLDEwOSwzMiwwLDAsMCwxMCwwLDAsMCwKKwk4NywxMDEsMTA1LDExNCwxMDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisJMjU1LDI1NSwwLDAsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCw4MCw2NSw2OCwzNywKKwkxMDAsMTAsMCwwLDE3MCwxNzAsMywwLDAsMCwwLDAsCisJODMsNjksNzgsODQsMzMsMTAsMCwwLDg1LDY4LDgwLDEwLAorCTAsMCwwLDAsNzMsNjcsNzcsODAsMTAsMCwwLDAsCisJNjksNjcsNzIsNzksMTAsMCwwLDAsNzMsODAsMTAsMCwKKwkxNzAsMTcwLDMsMCwwLDAsMCwwLDczLDgwLDg4LDMzLAorCTEwLDAsMCwwLDAsMCwwLDAsMjU1LDI1NSwyNTUsMjU1LAorCTI1NSwyNTUsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDE5MiwxNTUsMSwxMzEsMCwwLDAsMCwKKwkxMDgsMTU3LDEsMTMxLDAsMCwwLDAsODgsMTYxLDEsMTMxLAorCTAsMCwwLDAsMTYsMTYyLDEsMTMxLDAsMCwwLDAsCisJMzIsMTYyLDEsMTMxLDAsMCwwLDAsMTE2LDE2NywxLDEzMSwKKwkwLDAsMCwwLDE2NCwxNjcsMSwxMzEsMCwwLDAsMCwKKwkxODgsMTY5LDEsMTMxLDAsMCwwLDAsNDQsMTcwLDEsMTMxLAorCTAsMCwwLDAsMjIwLDE3MCwxLDEzMSwwLDAsMCwwLAorCTQsMTcxLDEsMTMxLDAsMCwwLDAsODAsMTcxLDEsMTMxLAorCTAsMCwwLDAsNDAsMTc4LDEsMTMxLDAsMCwwLDAsCisJMTA0LDE4MCwxLDEzMSwwLDAsMCwwLDEyOCwxODAsMSwxMzEsCisJMCwwLDAsMCwxNDQsMTgwLDEsMTMxLDAsMCwwLDAsCisJMjQwLDE4MiwxLDEzMSwwLDAsMCwwLDEwNCwxODMsMSwxMzEsCisJMCwwLDAsMCwxMjAsMTgzLDEsMTMxLDAsMCwwLDAsCisJMTI4LDE4MywxLDEzMSwwLDAsMCwwLDEzNiwxODMsMSwxMzEsCisJMCwwLDAsMCwxNjAsMTgzLDEsMTMxLDAsMCwwLDAsCisJMTY4LDE4MywxLDEzMSwwLDAsMCwwLDE3NiwxODMsMSwxMzEsCisJMCwwLDAsMCwyMDAsMTgzLDEsMTMxLDAsMCwwLDAsCisJMjA4LDE4MywxLDEzMSwwLDAsMCwwLDIxNiwxODMsMSwxMzEsCisJMCwwLDAsMCwyMjQsMTgzLDEsMTMxLDAsMCwwLDAsCisJMCwxODQsMSwxMzEsMCwwLDAsMCw4LDE4NCwxLDEzMSwKKwkwLDAsMCwwLDE2LDE4NCwxLDEzMSwwLDAsMCwwLAorCTQwLDE4NCwxLDEzMSwwLDAsMCwwLDQ4LDE4NCwxLDEzMSwKKwkwLDAsMCwwLDY0LDE4NCwxLDEzMSwwLDAsMCwwLAorCTcyLDE4NCwxLDEzMSwwLDAsMCwwLDgwLDE4NCwxLDEzMSwKKwkwLDAsMCwwLDEwNCwxODQsMSwxMzEsMCwwLDAsMCwKKwkxMTIsMTg0LDEsMTMxLDAsMCwwLDAsMTI4LDE4NCwxLDEzMSwKKwkwLDAsMCwwLDEzNiwxODQsMSwxMzEsMCwwLDAsMCwKKwkxNTIsMTg0LDEsMTMxLDAsMCwwLDAsMjA4LDE4NCwxLDEzMSwKKwkwLDAsMCwwLDI0OCwxODQsMSwxMzEsMCwwLDAsMCwKKwkxNTIsMTkxLDEsMTMxLDAsMCwwLDAsMjUyLDE5MywxLDEzMSwKKwkwLDAsMCwwLDQ0LDE5NCwxLDEzMSwwLDAsMCwwLAorCTYwLDE5NCwxLDEzMSwwLDAsMCwwLDYwLDE5OSwxLDEzMSwKKwkwLDAsMCwwLDE0OCwxOTksMSwxMzEsMCwwLDAsMCwKKwkxNjQsMTk5LDEsMTMxLDAsMCwwLDAsMzYsMjAwLDEsMTMxLAorCTAsMCwwLDAsMjgsMjAxLDEsMTMxLDAsMCwwLDAsCisJNjAsMjAxLDEsMTMxLDAsMCwwLDAsMjAsMjAyLDEsMTMxLAorCTAsMCwwLDAsNjgsMjAyLDEsMTMxLDAsMCwwLDAsCisJODQsMjAyLDEsMTMxLDAsMCwwLDAsMTI0LDIwMiwxLDEzMSwKKwkwLDAsMCwwLDE2NCwyMDIsMSwxMzEsMCwwLDAsMCwKKwkyMzYsMjAyLDEsMTMxLDAsMCwwLDAsMjUyLDIwMiwxLDEzMSwKKwkwLDAsMCwwLDQsMjAzLDEsMTMxLDAsMCwwLDAsCisJMTIsMjAzLDEsMTMxLDAsMCwwLDAsMjgsMjAzLDEsMTMxLAorCTAsMCwwLDAsMzYsMjAzLDEsMTMxLDAsMCwwLDAsCisJNDQsMjAzLDEsMTMxLDAsMCwwLDAsNTIsMjAzLDEsMTMxLAorCTAsMCwwLDAsNjAsMjAzLDEsMTMxLDAsMCwwLDAsCisJNjgsMjAzLDEsMTMxLDAsMCwwLDAsNzYsMjAzLDEsMTMxLAorCTAsMCwwLDAsMTI0LDIwMywxLDEzMSwwLDAsMCwwLAorCTEzMiwyMDMsMSwxMzEsMCwwLDAsMCwxNDAsMjAzLDEsMTMxLAorCTAsMCwwLDAsMTY0LDIwMywxLDEzMSwwLDAsMCwwLAorCTE4MCwyMDMsMSwxMzEsMCwwLDAsMCwxODgsMjAzLDEsMTMxLAorCTAsMCwwLDAsMjIwLDIwMywxLDEzMSwwLDAsMCwwLAorCTIwLDIwNCwxLDEzMSwwLDAsMCwwLDM2LDIwNCwxLDEzMSwKKwkwLDAsMCwwLDUyLDIwNCwxLDEzMSwwLDAsMCwwLAorCTY4LDIwNCwxLDEzMSwyNTUsMjU1LDI1NSwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJMTAsMCwwLDAsMTAsMCwwLDAsMCwyMDUsMSwxMzEsCisJMTAsMCwwLDAsNywwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDI1NSwyNTUsMjU1LDExMCwxMTgsMTE0LDk3LAorCTEwOSw0Niw5OSwwLDExNCw5OSwwLDAsNDgsMTIwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMAorCX0gOworc3RhdGljIGludCBkZ3JzX25jb2RlID0gMTE5NTIwIDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RncnNfaTgyNTk2LmggYi9kcml2ZXJzL25ldC9kZ3JzX2k4MjU5Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YTM4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kZ3JzX2k4MjU5Ni5oCkBAIC0wLDAgKzEsNDczIEBACisvKgorICoJaTgyNTk2IGV0aGVybmV0IGNvbnRyb2xsZXIgYml0cyBhbmQgc3RydWN0dXJlcyAobGl0dGxlIGVuZGlhbikKKyAqCisgKgkkSWQ6IGk4MjU5Ni5oLHYgMS44IDE5OTYvMDkvMDMgMTE6MTk6MDMgcmljayBFeHAgJAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglQT1JUIGNvbW1hbmRzIChwLiA0LTIwKS4gIFRoZSBsZWFzdCBzaWduaWZpY2FudCBuaWJibGUgaXMgb25lCSovCisvKglvZiB0aGVzZSBjb21tYW5kcywgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgaXMgYSBtZW1vcnkgYWRkcmVzcwkqLworLyoJYWxpZ25lZCBvbiBhIDE2IGJ5dGUgYm91bmRhcnkuICBOb3RlIHRoYXQgcG9ydCBjb21tYW5kcyBtdXN0CSovCisvKgliZSB3cml0dGVuIHRvIHRoZSBQT1JUIGFkZHJlc3MgYW5kIHRoZSBQT1JUIGFkZHJlc3MrMiB3aXRoIHR3bwkqLworLyoJaGFsZndvcmQgd3JpdGVzLiAgV3JpdGUgdGhlIExTSCBmaXJzdCB0byBQT1JULCB0aGVuIHRoZSBNU0ggdG8JKi8KKy8qCVBPUlQrMi4gIEJsYW1lIEludGVsLgkJCQkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlJNTk2X1BPUlRfUkVTRVQJCTB4MAkvKiBSZXNldC4gV2FpdCA1IFN5c0Nsa3MgJiAxMCBUeENsa3MgKi8KKyNkZWZpbmUJSTU5Nl9QT1JUX1NFTEZURVNUCTB4MQkvKiBEbyBhIHNlbGZ0ZXN0ICovCisjZGVmaW5lCUk1OTZfUE9SVF9TQ1BfQUREUgkweDIJLyogU2V0IG5ldyBTQ1AgYWRkcmVzcyAqLworI2RlZmluZQlJNTk2X1BPUlRfRFVNUAkJMHgzCS8qIER1bXAgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCisKKy8qCisgKglJNTk2X1NUOglTZWxmdGVzdCByZXN1bHRzIChwLiA0LTIxKQorICovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdAoreworCXVsb25nCXNpZ25hdHVyZTsJLyogUk9NIGNoZWNrc3VtICovCisJdWxvbmcJcmVzdWx0OwkJLyogU2VsZnRlc3QgcmVzdWx0czogbm9uLXplcm8gaXMgYSBmYWlsdXJlICovCit9IEk1OTZfU1Q7CisKKyNkZWZpbmUJSTU5Nl9TVF9TRUxGVEVTVF9GQUlMCTB4MTAwMAkvKiBTZWxmdGVzdCBGYWlsZWQgKi8KKyNkZWZpbmUJSTU5Nl9TVF9ESUFHTk9TRV9GQUlMCTB4MDAyMAkvKiBEaWFnbm9zZSBGYWlsZWQgKi8KKyNkZWZpbmUJSTU5Nl9TVF9CVVNUSU1FUl9GQUlMCTB4MDAxMAkvKiBCdXMgVGltZXIgRmFpbGVkICovCisjZGVmaW5lCUk1OTZfU1RfUkVHSVNURVJfRkFJTAkweDAwMDgJLyogUmVnaXN0ZXIgRmFpbGVkICovCisjZGVmaW5lCUk1OTZfU1RfUk9NX0ZBSUwJMHgwMDA0CS8qIFJPTSBGYWlsZWQgKi8KKworLyoKKyAqCUk1OTZfRFVNUDoJRHVtcCByZXN1bHRzCisgKi8KK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0Cit7CisJdWxvbmcJZHVtcFs3N107Cit9IEk1OTZfRFVNUDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUk1OTZfVEJEOglUcmFuc21pdCBCdWZmZXIgRGVzY3JpcHRvciAocC4gNC01OSkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgX0k1OTZfVEJECit7CisJdWxvbmcJCQljb3VudDsKKwl2b2wgc3RydWN0IF9JNTk2X1RCRAkqbmV4dDsKKwl1Y2hhcgkJCSpidWY7CisJdXNob3J0CQkJdW51c2VkMTsKKwl1c2hvcnQJCQl1bnVzZWQyOworfSBJNTk2X1RCRDsKKworI2RlZmluZQlJNTk2X1RCRF9OT0xJTksJCSgoSTU5Nl9UQkQgKikgMHhmZmZmZmZmZikKKyNkZWZpbmUJSTU5Nl9UQkRfRU9GCQkweDgwMDAKKyNkZWZpbmUgSTU5Nl9UQkRfQ09VTlRfTUFTSwkweDNmZmYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUk1OTZfVEZEOglUcmFuc21pdCBGcmFtZSBEZXNjcmlwdG9yIChwLiA0LTU2KQkJKi8KKy8qCQkJYS5rLmEuIEk1OTZfQ0JfWE1JVAkJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0Cit7CisJdXNob3J0CQkJc3RhdHVzOworCXVzaG9ydAkJCWNtZDsKKwl1bmlvbiBfSTU5Nl9DQgkJKm5leHQ7CisJSTU5Nl9UQkQJCSp0YmRwOworCXVsb25nCQkJY291bnQ7CS8qIGZvciBzcGVlZCAqLworCisJLyogQXBwbGljYXRpb24gZGVmaW5lZCBkYXRhIGZvbGxvd3Mgc3RydWN0dXJlLi4uICovCisKKyNpZiAwCS8qIFdlIGRvbid0IHVzZSB0aGVzZSBpbnRlbCBkZWZpbmVkIG9uZXMgKi8KKwkJdWNoYXIJCQlhZGRyWzZdOworCQl1c2hvcnQJCQlsZW47CisJCXVjaGFyCQkJZGF0YVsxXTsKKyNlbHNlCisJCXVsb25nCQlkc3RjaGFuOy8qIFVzZWQgYnkgbXVsdGktTklDIG1vZGUgKi8KKyNlbmRpZgorfSBJNTk2X1RGRDsKKworI2RlZmluZQlJNTk2X1RGRF9OT0NSQwkweDAwMTAJLyogY21kOiBObyBDUkMgaW5zZXJ0aW9uICovCisjZGVmaW5lCUk1OTZfVEZEX0ZMRVgJMHgwMDA4CS8qIGNtZDogRmxleGlibGUgbW9kZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJSTU5Nl9SQkQ6CVJlY2VpdmUgQnVmZmVyIERlc2NyaXB0b3IgKHAuIDQtODQpCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0IF9JNTk2X1JCRAoreworI2lmZGVmIElOVEVMX1JFVEVOVElWRQorCXVzaG9ydAkJCWNvdW50OwkvKiBMZW5ndGggb2YgZGF0YSBpbiBidWYgKi8KKwl1c2hvcnQJCQlvZmZzZXQ7CisjZWxzZQorCXVsb25nCQkJY291bnQ7CS8qIExlbmd0aCBvZiBkYXRhIGluIGJ1ZiAqLworI2VuZGlmCisJdm9sIHN0cnVjdCBfSTU5Nl9SQkQJKm5leHQ7CS8qIE5leHQgYnVmZmVyIGRlc2NyaXB0b3IgaW4gbGlzdCAqLworCXVjaGFyCQkJKmJ1ZjsJLyogRGF0YSBidWZmZXIgKi8KKyNpZmRlZiBJTlRFTF9SRVRFTlRJVkUKKwl1c2hvcnQJCQlzaXplOwkvKiBTaXplIG9mIGJ1ZiAoY29uc3RhbnQpICovCisJdXNob3J0CQkJemVybzsKKyNlbHNlCisJdWxvbmcJCQlzaXplOwkvKiBTaXplIG9mIGJ1ZiAoY29uc3RhbnQpICovCisjZW5kaWYKKworCS8qIEFwcGxpY2F0aW9uIGRlZmluZWQgZGF0YSBmb2xsb3dzIHN0cnVjdHVyZS4uLiAqLworCisJdWNoYXIJCQljaGFuOworCXVjaGFyCQkJcmVmY250OworCXVzaG9ydAkJCWxlbjsKK30gSTU5Nl9SQkQ7CisKKyNkZWZpbmUJSTU5Nl9SQkRfTk9MSU5LCQkoKEk1OTZfUkJEICopIDB4ZmZmZmZmZmYpCisjZGVmaW5lCUk1OTZfUkJEX0VPRgkJMHg4MDAwCS8qIFRoaXMgaXMgbGFzdCBidWZmZXIgaW4gYSBmcmFtZSAqLworI2RlZmluZQlJNTk2X1JCRF9GCQkweDQwMDAJLyogVGhlIGFjdHVhbCBjb3VudCBpcyB2YWxpZCAqLworCisjZGVmaW5lCUk1OTZfUkJEX0VMCQkweDgwMDAJLyogTGFzdCBidWZmZXIgaW4gbGlzdCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJSTU5Nl9SRkQ6CVJlY2VpdmUgRnJhbWUgRGVzY3JpcHRvciAocC4gNC03OSkJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgX0k1OTZfUkZECit7CisJdXNob3J0CQkJc3RhdHVzOworCXVzaG9ydAkJCWNtZDsKKwl2b2wgc3RydWN0IF9JNTk2X1JGRAkqbmV4dDsKKwl2b2wgc3RydWN0IF9JNTk2X1JCRAkqcmJkcDsKKwl1c2hvcnQJCQljb3VudDsJLyogTGVuIG9mIGRhdGEgaW4gUkZEOiBhbHdheXMgMCAqLworCXVzaG9ydAkJCXNpemU7CS8qIFNpemUgb2YgUkZEIGJ1ZmZlcjogYWx3YXlzIDAgKi8KKworCS8qIEFwcGxpY2F0aW9uIGRlZmluZWQgZGF0YSBmb2xsb3dzIHN0cnVjdHVyZS4uLiAqLworCisjCWlmIDAJLyogV2UgZG9uJ3QgdXNlIHRoZXNlIGludGVsIGRlZmluZWQgb25lcyAqLworCQl1Y2hhcgkJYWRkcls2XTsKKwkJdXNob3J0CQlsZW47CisJCXVjaGFyCQlkYXRhWzFdOworIwllbHNlCisJCXVsb25nCQlkc3RjaGFuOy8qIFVzZWQgYnkgbXVsdGktbmljIG1vZGUgKi8KKyMJZW5kaWYKK30gSTU5Nl9SRkQ7CisKKyNkZWZpbmUJSTU5Nl9SRkRfQwkJMHg4MDAwCS8qIHN0YXR1czogZnJhbWUgY29tcGxldGUgKi8KKyNkZWZpbmUJSTU5Nl9SRkRfQgkJMHg0MDAwCS8qIHN0YXR1czogZnJhbWUgYnVzeSBvciB3YWl0aW5nICovCisjZGVmaW5lCUk1OTZfUkZEX09LCQkweDIwMDAJLyogc3RhdHVzOiBmcmFtZSBPSyAqLworI2RlZmluZQlJNTk2X1JGRF9FUlJfTEVOR1RICTB4MTAwMAkvKiBzdGF0dXM6IGxlbmd0aCBlcnJvciAqLworI2RlZmluZQlJNTk2X1JGRF9FUlJfQ1JDCTB4MDgwMAkvKiBzdGF0dXM6IENSQyBlcnJvciAqLworI2RlZmluZQlJNTk2X1JGRF9FUlJfQUxJR04JMHgwNDAwCS8qIHN0YXR1czogYWxpZ25tZW50IGVycm9yICovCisjZGVmaW5lCUk1OTZfUkZEX0VSUl9OT0JVRlMJMHgwMjAwCS8qIHN0YXR1czogcmVzb3VyY2UgZXJyb3IgKi8KKyNkZWZpbmUJSTU5Nl9SRkRfRVJSX0RNQQkweDAxMDAJLyogc3RhdHVzOiBETUEgZXJyb3IgKi8KKyNkZWZpbmUJSTU5Nl9SRkRfRVJSX1NIT1JUCTB4MDA4MAkvKiBzdGF0dXM6IHRvbyBzaG9ydCBlcnJvciAqLworI2RlZmluZQlJNTk2X1JGRF9OT01BVENICTB4MDAwMgkvKiBzdGF0dXM6IElBIHdhcyBub3QgbWF0Y2hlZCAqLworI2RlZmluZQlJNTk2X1JGRF9DT0xMSVNJT04JMHgwMDAxCS8qIHN0YXR1czogY29sbGlzaW9uIGR1cmluZyByZWNlaXZlICovCisKKyNkZWZpbmUJSTU5Nl9SRkRfRUwJCTB4ODAwMAkvKiBjbWQ6IGVuZCBvZiBSRkQgbGlzdCAqLworI2RlZmluZQlJNTk2X1JGRF9GTEVYCQkweDAwMDgJLyogY21kOiBGbGV4aWJsZSBtb2RlICovCisjZGVmaW5lCUk1OTZfUkZEX0VPRgkJMHg4MDAwCS8qIGNvdW50OiBsYXN0IGJ1ZmZlciBpbiB0aGUgZnJhbWUgKi8KKyNkZWZpbmUJSTU5Nl9SRkRfRgkJMHg0MDAwCS8qIGNvdW50OiBUaGUgYWN0dWFsIGNvdW50IGlzIHZhbGlkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglDb21tYW5kcwkJCQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIHZhbHVlcyBmb3IgY21kIGhhbGZ3b3JkIGluIGFsbCB0aGUgc3RydWN0cyBiZWxvdyAqLworI2RlZmluZSBJNTk2X0NCX0NNRAkJMHgwNwkvKiBDQiBDT01NQU5EUyAqLworI2RlZmluZSBJNTk2X0NCX0NNRF9OT1AJCTAKKyNkZWZpbmUgSTU5Nl9DQl9DTURfSUEJCTEKKyNkZWZpbmUgSTU5Nl9DQl9DTURfQ09ORgkyCisjZGVmaW5lIEk1OTZfQ0JfQ01EX01DQVNUCTMKKyNkZWZpbmUgSTU5Nl9DQl9DTURfWE1JVAk0CisjZGVmaW5lIEk1OTZfQ0JfQ01EX1REUgkJNQorI2RlZmluZSBJNTk2X0NCX0NNRF9EVU1QCTYKKyNkZWZpbmUgSTU5Nl9DQl9DTURfRElBRwk3CisKKyNkZWZpbmUJSTU5Nl9DQl9DTURfRUwJCTB4ODAwMAkvKiBDQiBpcyBsYXN0IGluIGxpbmtlZCBsaXN0ICovCisjZGVmaW5lCUk1OTZfQ0JfQ01EX1MJCTB4NDAwMAkvKiBTdXNwZW5kIGFmdGVyIGV4ZWN1dGlvbiAqLworI2RlZmluZQlJNTk2X0NCX0NNRF9JCQkweDIwMDAJLyogY2F1c2UgaW50ZXJydXB0ICovCisKKwkvKiB2YWx1ZXMgZm9yIHRoZSBzdGF0dXMgaGFsZndvcmQgaW4gYWxsIHRoZSBzdHJ1Y3QgYmVsb3cgKi8KKyNkZWZpbmUJSTU5Nl9DQl9TVEFUVVMJCTB4RjAwMAkvKiBBbGwgZm91ciBzdGF0dXMgYml0cyAqLworI2RlZmluZQlJNTk2X0NCX1NUQVRVU19DCTB4ODAwMAkvKiBDb21tYW5kIGNvbXBsZXRlICovCisjZGVmaW5lCUk1OTZfQ0JfU1RBVFVTX0IJMHg0MDAwCS8qIENvbW1hbmQgYnVzeSBleGVjdXRpbmcgKi8KKyNkZWZpbmUJSTU5Nl9DQl9TVEFUVVNfQ19PUl9CCTB4QzAwMAkvKiBDb21tYW5kIGNvbXBsZXRlIG9yIGJ1c3kgKi8KKyNkZWZpbmUJSTU5Nl9DQl9TVEFUVVNfT0sJMHgyMDAwCS8qIENvbW1hbmQgY29tcGxldGUsIG5vIGVycm9ycyAqLworI2RlZmluZQlJNTk2X0NCX1NUQVRVU19BCTB4MTAwMAkvKiBDb21tYW5kIGJ1c3kgZXhlY3V0aW5nICovCisKKyNkZWZpbmUJSTU5Nl9DQl9OT0xJTksJCSgoSTU5Nl9DQiAqKSAweGZmZmZmZmZmKQorCisvKgorICoJSTU5Nl9DQl9OT1A6CU5PUCBDb21tYW5kIChwLiA0LTM0KQorICovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdAoreworCXVzaG9ydAkJCXN0YXR1czsKKwl1c2hvcnQJCQljbWQ7CisJdW5pb24gX0k1OTZfQ0IJCSpuZXh0OworfSBJNTk2X0NCX05PUDsKKworLyoKKyAqCVNhbWUgYXMgYWJvdmUsIGJ1dCBjb21tYW5kIGFuZCBzdGF0dXMgaW4gb25lIHVsb25nIGZvciBzcGVlZAorICovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdAoreworCXVsb25nCQkJY3NyOworCXVuaW9uIF9JNTk2X0NCCQkqbmV4dDsKK30gSTU5Nl9DQl9GQVNUOworI2RlZmluZQlGQVNUcyhYKQkoWCkKKyNkZWZpbmUJRkFTVGMoWCkJKChYKTw8MTYpCisKKy8qCisgKglJNTk2X0NCX0lBOglJbmRpdmlkdWFsIChNQUMpIEFkZHJlc3MgQ29tbWFuZCAocC4gNC0zNSkKKyAqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QKK3sKKwl1c2hvcnQJCQlzdGF0dXM7CisJdXNob3J0CQkJY21kOworCXVuaW9uIF9JNTk2X0NCCQkqbmV4dDsKKwl1Y2hhcgkJCWFkZHJbNl07Cit9IEk1OTZfQ0JfSUE7CisKKy8qCisgKglJNTk2X0NCX0NPTkY6CUNvbmZpZ3VyZSBDb21tYW5kIChwLiA0LTM3KQorICovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdAoreworCXVzaG9ydAkJCXN0YXR1czsKKwl1c2hvcnQJCQljbWQ7CisJdW5pb24gX0k1OTZfQ0IJCSpuZXh0OworCXVjaGFyCQkJY29uZlsxNF07Cit9IEk1OTZfQ0JfQ09ORjsKKworI2RlZmluZQlJNTk2X0NPTkYwX1AJCTB4ODAJLyogRW5hYmxlIFJCRCBQcmVmZXRjaCBCaXQgKi8KKyNkZWZpbmUJSTU5Nl9DT05GMF9DT1VOVAkxNAkvKiBDb3VudCBvZiBjb25maWd1cmF0aW9uIGJ5dGVzICovCisKKyNkZWZpbmUJSTU5Nl9DT05GMV9NT05fT0ZGCTB4QzAJLyogTW9uaXRvciBtb2RlOiBNb25pdG9yIG9mZiAqLworI2RlZmluZQlJNTk2X0NPTkYxX01PTl9PTgkweDgwCS8qIE1vbml0b3IgbW9kZTogTW9uaXRvciBvbiAqLworI2RlZmluZQlJNTk2X0NPTkYxX1R4RklGTyhXKQkoVykJLyogVHhGSUZPIHRyaWdnZXIsIGluIHdvcmRzICovCisKKyNkZWZpbmUJSTU5Nl9DT05GMl9TQVZFQkYJMHg4MAkvKiBTYXZlIGJhZCBmcmFtZXMgKi8KKworI2RlZmluZQlJNTk2X0NPTkYzX0FERFJMRU4oQikJKEIpCS8qIEFkZHJlc3MgbGVuZ3RoICovCisjZGVmaW5lCUk1OTZfQ09ORjNfTk9TUkNJTlNFUlQJMHgwOAkvKiBEbyBub3QgaW5zZXJ0IHNvdXJjZSBhZGRyZXNzICovCisjZGVmaW5lCUk1OTZfQ09ORjNfUFJFQU1CTEU4CTB4MjAJLyogOCBieXRlIHByZWFtYmxlICovCisjZGVmaW5lCUk1OTZfQ09ORjNfTE9PUE9GRgkweDAwCS8qIExvb3BiYWNrOiBPZmYgKi8KKyNkZWZpbmUJSTU5Nl9DT05GM19MT09QSU5UCTB4NDAJLyogTG9vcGJhY2s6IGludGVybmFsICovCisjZGVmaW5lCUk1OTZfQ09ORjNfTE9PUEVYVAkweEMwCS8qIExvb3BiYWNrOiBleHRlcm5hbCAqLworCisjZGVmaW5lCUk1OTZfQ09ORjRfTElOUFJJKFNUKQkoU1QpCS8qIExpbmVhciBwcmlvcml0eTogc2xvdCB0aW1lcyAqLworI2RlZmluZQlJNTk2X0NPTkY0X0VYUFBSSShTVCkJKFNUKQkvKiBFeHBvbmVudGlhbCBwcmlvcml0eTogc2xvdCB0aW1lcyAqLworI2RlZmluZQlJNTk2X0NPTkY0X0lFRUVfQk9NCTAJLyogSUVFRSA4MDIuMyBiYWNrb2ZmIG1ldGhvZCAqLworCisjZGVmaW5lCUk1OTZfQ09ORjVfSUZTKFgpCShYKQkvKiBJbnRlcmZyYW1lIHNwYWNpbmcgaW4gY2xvY2tzICovCisKKyNkZWZpbmUJSTU5Nl9DT05GNl9TVF9MT1coWCkJKFgmMjU1KQkvKiBTbG90IHRpbWUsIGxvdyBieXRlICovCisKKyNkZWZpbmUJSTU5Nl9DT05GN19TVF9ISShYKQkoWD4+OCkJLyogU2xvdCB0aW1lLCBoaWdoIGJpdHMgKi8KKyNkZWZpbmUJSTU5Nl9DT05GN19SRVRSWShYKQkoWDw8NCkJLyogTWF4IHJldHJ5IG51bWJlciAqLworCisjZGVmaW5lCUk1OTZfQ09ORjhfUFJPTUlTQwkweDAxCS8qIFJjdiBhbGwgZnJhbWVzICovCisjZGVmaW5lCUk1OTZfQ09ORjhfTk9CUk9BRAkweDAyCisjZGVmaW5lCUk1OTZfQ09ORjhfTUFOQ0hFU1RFUgkweDA0CisjZGVmaW5lCUk1OTZfQ09ORjhfVHhOT0NSUwkweDA4CisjZGVmaW5lCUk1OTZfQ09ORjhfTk9DUkMJMHgxMAorI2RlZmluZQlJNTk2X0NPTkY4X0NSQ19DQ0lUVAkweDIwCisjZGVmaW5lCUk1OTZfQ09ORjhfQklUU1RVRkZJTkcJMHg0MAorI2RlZmluZQlJNTk2X0NPTkY4X1BBRERJTkcJMHg4MAorCisjZGVmaW5lCUk1OTZfQ09ORjlfQ1NGSUxURVIoWCkJKFgpCisjZGVmaW5lCUk1OTZfQ09ORjlfQ1NJTlQoWCkJMHgwOAorI2RlZmluZQlJNTk2X0NPTkY5X0NERklMVEVSKFgpCShYPDw0KQorI2RlZmluZQlJNTk2X0NPTkY5X0NESU5UKFgpCTB4ODAKKworI2RlZmluZQlJNTk2X0NPTkYxMF9NSU5MRU4oWCkJKFgpCS8qIE1pbmltdW0gZnJhbWUgbGVuZ3RoICovCisKKyNkZWZpbmUJSTU5Nl9DT05GMTFfUFJFQ1JTXwkweDAxCS8qIFByZWFtYmxlIGJlZm9yZSBjYXJyaWVyIHNlbnNlICovCisjZGVmaW5lCUk1OTZfQ09ORjExX0xOR0ZMRF8JMHgwMgkvKiBQYWRkaW5nIGluIEVuZCBvZiBDYXJyaWVyICovCisjZGVmaW5lCUk1OTZfQ09ORjExX0NSQ0lOTV8JMHgwNAkvKiBDUkMgaW4gbWVtb3J5ICovCisjZGVmaW5lCUk1OTZfQ09ORjExX0FVVE9UWAkweDA4CS8qIEF1dG8gcmV0cmFuc21pdCAqLworI2RlZmluZQlJNTk2X0NPTkYxMV9DU0JTQUNfCTB4MTAJLyogQ29sbGlzaW9uIGRldGVjdCBieSBzcmMgYWRkciBjbXAuICovCisjZGVmaW5lCUk1OTZfQ09ORjExX01DQUxMXwkweDIwCS8qIE11bHRpY2FzdCBhbGwgKi8KKworI2RlZmluZSBJNTk2X0NPTkYxM19SRVNFUlZFRAkweDNmCS8qIFJlc2VydmVkOiBtdXN0IGJlIG9uZXMgKi8KKyNkZWZpbmUgSTU5Nl9DT05GMTNfTVVMVElBCTB4NDAJLyogRW5hYmxlIG11bHRpcGxlIGFkZHIuIHJlY2VwdGlvbiAqLworI2RlZmluZSBJNTk2X0NPTkYxM19ESVNCT0YJMHg4MAkvKiBEaXNhYmxlIGJhY2tvZmYgYWxnb3JpdGhtICovCisvKgorICoJSTU5Nl9DQl9NQ0FTVDoJTXVsdGljYXN0LVNldHVwIENvbW1hbmQgKHAuIDQtNTQpCisgKi8KK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0Cit7CisJdXNob3J0CQkJc3RhdHVzOworCXVzaG9ydAkJCWNtZDsKKwl1bmlvbiBfSTU5Nl9DQgkJKm5leHQ7CisJdXNob3J0CQkJY291bnQ7CQkvKiBOdW1iZXIgb2YgNi1ieXRlIGFkZHJzIHRoYXQgZm9sbG93ICovCisJdWNoYXIJCQlhZGRyWzZdWzFdOworfSBJNTk2X0NCX01DQVNUOworCisvKgorICoJSTU5Nl9DQl9YTUlUOglUcmFuc21pdCBDb21tYW5kIChwLiA0LTU2KQorICovCit0eXBlZGVmCUk1OTZfVEZECUk1OTZfQ0JfWE1JVDsKKworI2RlZmluZQlJNTk2X0NCX1hNSVRfTk9DUkMJMHgwMDEwCS8qIGNtZDogTm8gQ1JDIGluc2VydGlvbiAqLworI2RlZmluZQlJNTk2X0NCX1hNSVRfRkxFWAkweDAwMDgJLyogY21kOiBGbGV4aWJsZSBtZW1vcnkgbW9kZSAqLworCisjZGVmaW5lCUk1OTZfQ0JfWE1JVF9FUlJfTEFURQkweDA4MDAJLyogc3RhdHVzOiBlcnJvcjogbGF0ZSBjb2xsaXNpb24gKi8KKyNkZWZpbmUJSTU5Nl9DQl9YTUlUX0VSUl9OT0NSUwkweDA0MDAJLyogc3RhdHVzOiBlcnJvcjogbm8gY2FycmllcnMgc2Vuc2UgKi8KKyNkZWZpbmUJSTU5Nl9DQl9YTUlUX0VSUl9OT0NUUwkweDAyMDAJLyogc3RhdHVzOiBlcnJvcjogbG9zcyBvZiBDVFMgKi8KKyNkZWZpbmUJSTU5Nl9DQl9YTUlUX0VSUl9VTkRFUgkweDAxMDAJLyogc3RhdHVzOiBlcnJvcjogRE1BIHVuZGVycnVuICovCisjZGVmaW5lCUk1OTZfQ0JfWE1JVF9FUlJfTUFYQ09MCTB4MDAyMAkvKiBzdGF0dXM6IGVycm9yOiBtYXhpbXVtIGNvbGxpc2lvbnMgKi8KKyNkZWZpbmUJSTU5Nl9DQl9YTUlUX0NPTExJU0lPTlMJMHgwMDBmCS8qIHN0YXR1czogbnVtYmVyIG9mIGNvbGxpc2lvbnMgKi8KKworLyoKKyAqCUk1OTZfQ0JfVERSOglUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5IENvbW1hbmQgKHAuIDQtNjMpCisgKi8KK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0Cit7CisJdXNob3J0CQkJc3RhdHVzOworCXVzaG9ydAkJCWNtZDsKKwl1bmlvbiBfSTU5Nl9DQgkJKm5leHQ7CisJdXNob3J0CQkJdGltZTsKK30gSTU5Nl9DQl9URFI7CisKKy8qCisgKglJNTk2X0NCX0RVTVA6CUR1bXAgQ29tbWFuZCAocC4gNC02NSkKKyAqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QKK3sKKwl1c2hvcnQJCQlzdGF0dXM7CisJdXNob3J0CQkJY21kOworCXVuaW9uIF9JNTk2X0NCCQkqbmV4dDsKKwl1Y2hhcgkJCSpidWY7Cit9IEk1OTZfQ0JfRFVNUDsKKworLyoKKyAqCUk1OTZfQ0JfRElBRzoJRGlhZ25vc2UgQ29tbWFuZCAocC4gNC03NykKKyAqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QKK3sKKwl1c2hvcnQJCQlzdGF0dXM7CisJdXNob3J0CQkJY21kOworCXVuaW9uIF9JNTk2X0NCCQkqbmV4dDsKK30gSTU5Nl9DQl9ESUFHOworCisvKgorICoJSTU5Nl9DQjoJQ29tbWFuZCBCbG9jaworICovCit0eXBlZGVmIHVuaW9uIF9JNTk2X0NCCit7CisJSTU5Nl9DQl9OT1AJCW5vcDsKKwlJNTk2X0NCX0lBCQlpYTsKKwlJNTk2X0NCX0NPTkYJCWNvbmY7CisJSTU5Nl9DQl9NQ0FTVAkJbWNhc3Q7CisJSTU5Nl9DQl9YTUlUCQl4bWl0OworCUk1OTZfQ0JfVERSCQl0ZHI7CisJSTU5Nl9DQl9EVU1QCQlkdW1wOworCUk1OTZfQ0JfRElBRwkJZGlhZzsKKworCS8qIGNvbW1hbmQgYW5kIHN0YXR1cyBpbiBvbmUgdWxvbmcgZm9yIHNwZWVkLi4uICovCisJSTU5Nl9DQl9GQVNUCQlmYXN0OworfSBJNTk2X0NCOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJSTU5Nl9TQ0I6CVN5c3RlbSBDb25maWd1cmF0aW9uIEJsb2NrIChwLiA0LTI2KQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdAoreworCXZvbGF0aWxlIHVzaG9ydAkJc3RhdHVzOwkJLyogU3RhdHVzIHdvcmQgKi8KKwl2b2xhdGlsZSB1c2hvcnQJCWNtZDsJCS8qIENvbW1hbmQgd29yZCAqLworCUk1OTZfQ0IJCSpjYnA7CisJSTU5Nl9SRkQJKnJmZHA7CisJdWxvbmcJCWNyY19lcnJzOworCXVsb25nCQlhbGlnbl9lcnJzOworCXVsb25nCQlyZXNvdXJjZV9lcnJzOworCXVsb25nCQlvdmVycnVuX2VycnM7CisJdWxvbmcJCXJjdmNkdF9lcnJzOworCXVsb25nCQlzaG9ydF9lcnJzOworCXVzaG9ydAkJdG9mZjsKKwl1c2hvcnQJCXRvbjsKK30gSTU5Nl9TQ0I7CisKKwkvKiBjbWQgaGFsZndvcmQgdmFsdWVzICovCisjZGVmaW5lCUk1OTZfU0NCX0FDSwkJMHhGMDAwCS8qIEFDS05PV0xFREdNRU5UUyAqLworI2RlZmluZQlJNTk2X1NDQl9BQ0tfQ1gJCTB4ODAwMAkvKiBBY2sgY29tbWFuZCBjb21wbGV0aW9uICovCisjZGVmaW5lCUk1OTZfU0NCX0FDS19GUgkJMHg0MDAwCS8qIEFjayByZWNlaXZlZCBmcmFtZSAqLworI2RlZmluZQlJNTk2X1NDQl9BQ0tfQ05BCTB4MjAwMAkvKiBBY2sgY29tbWFuZCB1bml0IG5vdCBhY3RpdmUgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfQUNLX1JOUgkweDEwMDAJLyogQWNrIHJjdiB1bml0IG5vdCByZWFkeSAqLworI2RlZmluZQlJNTk2X1NDQl9BQ0tfQUxMCTB4RjAwMAkvKiBBY2sgZXZlcnl0aGluZyAqLworCisjZGVmaW5lCUk1OTZfU0NCX0NVQwkJMHgwNzAwCS8qIENPTU1BTkQgVU5JVCBDT01NQU5EUyAqLworI2RlZmluZQlJNTk2X1NDQl9DVUNfTk9QCTB4MDAwMAkvKiBObyBvcGVyYXRpb24gKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfQ1VDX1NUQVJUCTB4MDEwMAkvKiBTdGFydCBleGVjdXRpb24gb2YgZmlyc3QgQ0IgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfQ1VDX1JFU1VNRQkweDAyMDAJLyogUmVzdW1lIGV4ZWN1dGlvbiAqLworI2RlZmluZQlJNTk2X1NDQl9DVUNfU1VTUEVORAkweDAzMDAJLyogU3VzcGVuZCBhZnRlciBjdXJyZW50IENCICovCisjZGVmaW5lCUk1OTZfU0NCX0NVQ19BQk9SVAkweDA0MDAJLyogQWJvcnQgY3VycmVudCBDQiBpbW1lZGlhdGVseSAqLworI2RlZmluZQlJNTk2X1NDQl9DVUNfTE9BRAkweDA1MDAJLyogTG9hZCBCdXMgdGhyb3R0bGUgdGltZXJzICovCisjZGVmaW5lCUk1OTZfU0NCX0NVQ19MT0FESU1NCTB4MDYwMAkvKiBMb2FkIEJ1cyB0aHJvdHRsZSB0aW1lcnMsIG5vdyAqLworCisjZGVmaW5lCUk1OTZfU0NCX1JVQwkJMHgwMDcwCS8qIFJFQ0VJVkUgVU5JVCBDT01NQU5EUyAqLworI2RlZmluZQlJNTk2X1NDQl9SVUNfTk9QCTB4MDAwMAkvKiBObyBvcGVyYXRpb24gKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfUlVDX1NUQVJUCTB4MDAxMAkvKiBTdGFydCByZWNlcHRpb24gKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfUlVDX1JFU1VNRQkweDAwMjAJLyogUmVzdW1lIHJlY2VwdGlvbiAqLworI2RlZmluZQlJNTk2X1NDQl9SVUNfU1VTUEVORAkweDAwMzAJLyogU3VzcGVuZCByZWNlcHRpb24gKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfUlVDX0FCT1JUCTB4MDA0MAkvKiBBYm9ydCByZWNlcHRpb24gKi8KKworI2RlZmluZQlJNTk2X1NDQl9SRVNFVAkJMHgwMDgwCS8qIEhhcmQgcmVzZXQgY2hpcCAqLworCisJLyogc3RhdHVzIGhhbGZ3b3JkIHZhbHVlcyAqLworI2RlZmluZQlJNTk2X1NDQl9TVEFUCQkweEYwMDAJLyogU1RBVFVTICovCisjZGVmaW5lCUk1OTZfU0NCX0NYCQkweDgwMDAJLyogY29tbWFuZCBjb21wbGV0aW9uICovCisjZGVmaW5lCUk1OTZfU0NCX0ZSCQkweDQwMDAJLyogcmVjZWl2ZWQgZnJhbWUgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfQ05BCQkweDIwMDAJLyogY29tbWFuZCB1bml0IG5vdCBhY3RpdmUgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfUk5SCQkweDEwMDAJLyogcmN2IHVuaXQgbm90IHJlYWR5ICovCisKKyNkZWZpbmUJSTU5Nl9TQ0JfQ1VTCQkweDA3MDAJLyogQ09NTUFORCBVTklUIFNUQVRVUyAqLworI2RlZmluZQlJNTk2X1NDQl9DVVNfSURMRQkweDAwMDAJLyogSWRsZSAqLworI2RlZmluZQlJNTk2X1NDQl9DVVNfU1VTUEVOREVECTB4MDEwMAkvKiBTdXNwZW5kZWQgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfQ1VTX0FDVElWRQkweDAyMDAJLyogQWN0aXZlICovCisKKyNkZWZpbmUJSTU5Nl9TQ0JfUlVTCQkweDAwRjAJLyogUkVDRUlWRSBVTklUIFNUQVRVUyAqLworI2RlZmluZQlJNTk2X1NDQl9SVVNfSURMRQkweDAwMDAJLyogSWRsZSAqLworI2RlZmluZQlJNTk2X1NDQl9SVVNfU1VTUEVOREVECTB4MDAxMAkvKiBTdXNwZW5kZWQgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfUlVTX05PUkVTCTB4MDAyMAkvKiBObyBSZXNvdXJjZXMgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfUlVTX1JFQURZCTB4MDA0MAkvKiBSZWFkeSAqLworI2RlZmluZQlJNTk2X1NDQl9SVVNfTk9SQkRTCTB4MDA4MAkvKiBObyBtb3JlIFJCRHMgbW9kaWZpZXIgKi8KKworI2RlZmluZQlJNTk2X1NDQl9MT0FERUQJCTB4MDAwOAkvKiBCdXMgdGltZXJzIGxvYWRlZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJSTU5Nl9JU0NQOglJbnRlcm1lZGlhdGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUHRyIChwIDQtMjYpCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QKK3sKKwl1bG9uZwkJYnVzeTsJLyogU2V0IHRvIDE7IEk1OTYgY2xlYXJzIGl0IHdoZW4gc2NicCBpcyByZWFkICovCisJSTU5Nl9TQ0IJKnNjYnA7Cit9IEk1OTZfSVNDUDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUk1OTZfU0NQOglTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChwLiA0LTIzKQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdAoreworCXVsb25nCQlzeXNidXM7CQorCXVsb25nCQlkdW1teTsKKwlJNTk2X0lTQ1AJKmlzY3BwOworfSBJNTk2X1NDUDsKKworCS8qIC5zeXNidXMgdmFsdWVzICovCisjZGVmaW5lIEk1OTZfU0NQX1JFU0VSVkVECTB4NDAwMDAwCS8qIFJlc2VydmVkIGJpdHMgbXVzdCBiZSBzZXQgKi8KKyNkZWZpbmUgSTU5Nl9TQ1BfSU5UTE9XCQkweDIwMDAwMAkvKiBJbnRyLiBQb2xhcml0eSBhY3RpdmUgbG93ICovCisjZGVmaW5lIEk1OTZfU0NQX0lOVEhJR0gJMAkJLyogSW50ci4gUG9sYXJpdHkgYWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgSTU5Nl9TQ1BfTE9DS0RJUwkweDEwMDAwMAkvKiBMb2NrIEZ1bmN0aW9uIGRpc2FibGVkICovCisjZGVmaW5lIEk1OTZfU0NQX0xPQ0tFTgkJMAkJLyogTG9jayBGdW5jdGlvbiBlbmFibGVkICovCisjZGVmaW5lIEk1OTZfU0NQX0VUSFJPVFRMRQkweDA4MDAwMAkvKiBFeHRlcm5hbCBCdXMgVGhyb3R0bGUgKi8KKyNkZWZpbmUgSTU5Nl9TQ1BfSVRIUk9UVExFCTAJCS8qIEludGVybmFsIEJ1cyBUaHJvdHRsZSAqLworI2RlZmluZSBJNTk2X1NDUF9MSU5FQVIJCTB4MDQwMDAwCS8qIExpbmVhciBNb2RlICovCisjZGVmaW5lIEk1OTZfU0NQX1NFR01FTlRFRAkweDAyMDAwMAkvKiBTZWdtZW50ZWQgTW9kZSAqLworI2RlZmluZSBJNTk2X1NDUF84MjU4NgkJMHgwMDAwMDAJLyogODI1ODYgTW9kZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGdyc19wbHg5MDYwLmggYi9kcml2ZXJzL25ldC9kZ3JzX3BseDkwNjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODg4YWUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZGdyc19wbHg5MDYwLmgKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKglQTFggOTA2MCBQQ0kgSW50ZXJmYWNlIGNoaXAKKyAqLworCisvKgorICoJUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLCBzYW1lIG9mZnNldCBvbiBsb2NhbCBhbmQgUENJIHNpZGVzLAorICoJYnV0IG9uIFBDSSBzaWRlLCBtdXN0IHVzZSBQQ0kgQklPUyBjYWxscyB0byByZWFkL3dyaXRlLgorICovCisjZGVmaW5lCVBDSV9QTFhSRUdTX0JBU0VfQUREUgkweDEwCisKKyNkZWZpbmUJUENJX1BMWFJFR1NfSU9fQUREUgkweDE0CisKKyNkZWZpbmUJUENJX1NQQUNFMF9CQVNFX0FERFIJMHgxOAorCisjZGVmaW5lCVBDSV9ST01fQkFTRV9BRERSCTB4MzAKKyMJZGVmaW5lIFBDSV9ST01fRU5BQkxFRAkJMHgwMDAwMDAwMQorCisjZGVmaW5lCVBDSV9JTlRfTElORQkJMHgzQworCisvKgorICoJUmVnaXN0ZXJzIGFjY2Vzc2libGUgZGlyZWN0bHkgZnJvbSBQQ0kgYW5kIGxvY2FsIHNpZGUuCisgKglPZmZzZXQgaXMgZnJvbSBQQ0kgc2lkZS4gIEFkZCBQTFhfTENMX09GRlNFVCBmb3IgbG9jYWwgYWRkcmVzcy4KKyAqLworI2RlZmluZQlQTFhfTENMX09GRlNFVAkweDgwCS8qIE9mZnNldCBvZiByZWdzIGZyb20gbG9jYWwgc2lkZSAqLworCisvKgorICoJTG9jYWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMKKyAqLworI2RlZmluZQlQTFhfU1BBQ0UwX1JBTkdFCTB4MDAJLyogUmFuZ2UgZm9yIFBDSSB0byBMY2wgQWRkciBTcGFjZSAwICovCisjZGVmaW5lCVBMWF9TUEFDRTBfQkFTRV9BRERSCTB4MDQJLyogTGNsIEJhc2UgYWRkcmVzcyByZW1hcCAqLworCisjZGVmaW5lCVBMWF9ST01fUkFOR0UJCTB4MTAJLyogUmFuZ2UgZm9yIGV4cGFuc2lvbiBST00gKERNQSkgKi8KKyNkZWZpbmUJUExYX1JPTV9CQVNFX0FERFIJMHgxNAkvKiBMY2wgYmFzZSBhZGRyZXNzIHJlbWFwIGZvciBST00gKi8KKworI2RlZmluZQlQTFhfQlVTX1JFR0lPTgkJMHgxOAkvKiBCdXMgUmVnaW9uIERlc2NyaXB0b3JzICovCisKKy8qCisgKglTaGFyZWQgUnVuIFRpbWUgUmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUJUExYX01CT1gwCQkweDQwCisjZGVmaW5lCVBMWF9NQk9YMQkJMHg0NAorI2RlZmluZQlQTFhfTUJPWDIJCTB4NDgKKyNkZWZpbmUJUExYX01CT1gzCQkweDRDCisjZGVmaW5lCVBMWF9NQk9YNAkJMHg1MAorI2RlZmluZQlQTFhfTUJPWDUJCTB4NTQKKyNkZWZpbmUJUExYX01CT1g2CQkweDU4CisjZGVmaW5lCVBMWF9NQk9YNwkJMHg1QworCisjZGVmaW5lCVBMWF9QQ0kyTENMX0RPT1JCRUxMCTB4NjAKKworI2RlZmluZQlQTFhfTENMMlBDSV9ET09SQkVMTAkweDY0CisKKyNkZWZpbmUJUExYX0lOVF9DU1IJCTB4NjgJLyogSW50ZXJydXB0IENvbnRyb2wvU3RhdHVzICovCisjCWRlZmluZQlQTFhfTFNFUlJfRU5BQkxFCTB4MDAwMDAwMDEKKyMJZGVmaW5lCVBMWF9MU0VSUl9QRQkJMHgwMDAwMDAwMgorIwlkZWZpbmUJUExYX1NFUlIJCTB4MDAwMDAwMDQKKyMJdW5kZWYgIFBMWF9VTlVTRUQgLyoJCTB4MDAwMDAwMDgJCQkqLworIwl1bmRlZiAgUExYX1VOVVNFRCAvKgkJMHgwMDAwMDAxMAkJCSovCisjCXVuZGVmICBQTFhfVU5VU0VEIC8qCQkweDAwMDAwMDIwCQkJKi8KKyMJdW5kZWYgIFBMWF9VTlVTRUQgLyoJCTB4MDAwMDAwNDAJCQkqLworIwl1bmRlZiAgUExYX1VOVVNFRCAvKgkJMHgwMDAwMDA4MAkJCSovCisjCWRlZmluZSBQTFhfUENJX0lFCQkweDAwMDAwMTAwCisjCWRlZmluZQlQTFhfUENJX0RPT1JCRUxMX0lFCTB4MDAwMDAyMDAKKyMJZGVmaW5lCVBMWF9QQ0lfQUJPUlRfSUUJMHgwMDAwMDQwMAorIwlkZWZpbmUJUExYX1BDSV9MT0NBTF9JRQkweDAwMDAwODAwCisjCWRlZmluZQlQTFhfUkVUUllfQUJPUlRfRU5BQkxFCTB4MDAwMDEwMDAKKyMJZGVmaW5lCVBMWF9QQ0lfRE9PUkJFTExfSU5UCTB4MDAwMDIwMDAKKyMJZGVmaW5lCVBMWF9QQ0lfQUJPUlRfSU5UCTB4MDAwMDQwMDAKKyMJZGVmaW5lCVBMWF9QQ0lfTE9DQUxfSU5UCTB4MDAwMDgwMDAKKyMJZGVmaW5lCVBMWF9MQ0xfSUUJCTB4MDAwMTAwMDAKKyMJZGVmaW5lCVBMWF9MQ0xfRE9PUkJFTExfSUUJMHgwMDAyMDAwMAorIwlkZWZpbmUJUExYX0xDTF9ETUEwX0lFCQkweDAwMDQwMDAwCisjCWRlZmluZQlQTFhfTENMX0RNQTFfSUUJCTB4MDAwODAwMDAKKyMJZGVmaW5lCVBMWF9MQ0xfRE9PUkJFTExfSU5UCTB4MDAxMDAwMDAKKyMJZGVmaW5lCVBMWF9MQ0xfRE1BMF9JTlQJMHgwMDIwMDAwMAorIwlkZWZpbmUJUExYX0xDTF9ETUExX0lOVAkweDAwNDAwMDAwCisjCWRlZmluZQlQTFhfTENMX0JJU1RfSU5UCTB4MDA4MDAwMDAKKyMJZGVmaW5lCVBMWF9CTV9ESVJFQ1RfCQkweDAxMDAwMDAwCisjCWRlZmluZQlQTFhfQk1fRE1BMF8JCTB4MDIwMDAwMDAKKyMJZGVmaW5lCVBMWF9CTV9ETUExXwkJMHgwNDAwMDAwMAorIwlkZWZpbmUJUExYX0JNX0FCT1JUXwkJMHgwODAwMDAwMAorIwl1bmRlZiAgUExYX1VOVVNFRCAvKgkJMHgxMDAwMDAwMAkJCSovCisjCXVuZGVmICBQTFhfVU5VU0VEIC8qCQkweDIwMDAwMDAwCQkJKi8KKyMJdW5kZWYgIFBMWF9VTlVTRUQgLyoJCTB4NDAwMDAwMDAJCQkqLworIwl1bmRlZiAgUExYX1VOVVNFRCAvKgkJMHg4MDAwMDAwMAkJCSovCisKKyNkZWZpbmUJUExYX01JU0NfQ1NSCQkweDZjCS8qIEVFUFJPTSxQQ0ksVXNlcixJbml0IENvbnRyb2wvU3RhdHVzKi8KKyMJZGVmaW5lIFBMWF9VU0VST1VUCQkweDAwMDEwMDAwCisjCWRlZmluZSBQTFhfVVNFUklOCQkweDAwMDIwMDAwCisjCWRlZmluZSBQTFhfRUVDSwkJCTB4MDEwMDAwMDAKKyMJZGVmaW5lIFBMWF9FRUNTCQkJMHgwMjAwMDAwMAorIwlkZWZpbmUgUExYX0VFV0QJCQkweDA0MDAwMDAwCisjCWRlZmluZSBQTFhfRUVSRAkJCTB4MDgwMDAwMDAKKworLyoKKyAqCURNQSByZWdpc3RlcnMuICBPZmZzZXQgaXMgZnJvbSBsb2NhbCBzaWRlCisgKi8KKyNkZWZpbmUJUExYX0RNQTBfTU9ERQkJMHgxMDAKKyMJZGVmaW5lIFBMWF9ETUFfTU9ERV9XSURUSDMyCTB4MDAwMDAwMDMKKyMJZGVmaW5lIFBMWF9ETUFfTU9ERV9XQUlUU1RBVEVTKFgpCSgoWCk8PDIpCisjCWRlZmluZSBQTFhfRE1BX01PREVfTk9SRUFEWQkweDAwMDAwMDAwCisjCWRlZmluZSBQTFhfRE1BX01PREVfUkVBRFkJMHgwMDAwMDA0MAorIwlkZWZpbmUgUExYX0RNQV9NT0RFX05PQlRFUk0JMHgwMDAwMDAwMAorIwlkZWZpbmUgUExYX0RNQV9NT0RFX0JURVJNCTB4MDAwMDAwODAKKyMJZGVmaW5lIFBMWF9ETUFfTU9ERV9OT0JVUlNUCTB4MDAwMDAwMDAKKyMJZGVmaW5lIFBMWF9ETUFfTU9ERV9CVVJTVAkweDAwMDAwMTAwCisjCWRlZmluZSBQTFhfRE1BX01PREVfTk9DSEFJTgkweDAwMDAwMDAwCisjCWRlZmluZSBQTFhfRE1BX01PREVfQ0hBSU4JMHgwMDAwMDIwMAorIwlkZWZpbmUgUExYX0RNQV9NT0RFX0RPTkVfSUUJMHgwMDAwMDQwMAorIwlkZWZpbmUgUExYX0RNQV9NT0RFX0FERFJfSE9MRAkweDAwMDAwODAwCisKKyNkZWZpbmUJUExYX0RNQTBfUENJX0FERFIJMHgxMDQKKwkJCQkJLyogbm9uLWNoYWluaW5nIG1vZGUgUENJIGFkZHJlc3MgKi8KKworI2RlZmluZQlQTFhfRE1BMF9MQ0xfQUREUgkweDEwOAorCQkJCQkvKiBub24tY2hhaW5pbmcgbW9kZSBsb2NhbCBhZGRyZXNzICovCisKKyNkZWZpbmUJUExYX0RNQTBfU0laRQkJMHgxMEMKKwkJCQkJLyogbm9uLWNoYWluaW5nIG1vZGUgbGVuZ3RoICovCisKKyNkZWZpbmUJUExYX0RNQTBfREVTQ1JJUFRPUgkweDExMAorIwlkZWZpbmUJUExYX0RNQV9ERVNDX0VPQwkweDAwMDAwMDAyCisjCWRlZmluZQlQTFhfRE1BX0RFU0NfVENfSUUJMHgwMDAwMDAwNAorIwlkZWZpbmUJUExYX0RNQV9ERVNDX1RPX0hPU1QJMHgwMDAwMDAwOAorIwlkZWZpbmUJUExYX0RNQV9ERVNDX1RPX0JPQVJECTB4MDAwMDAwMDAKKyMJZGVmaW5lCVBMWF9ETUFfREVTQ19ORVhUQUREUgkweEZGRkZmZmYwCisKKyNkZWZpbmUJUExYX0RNQTFfTU9ERQkJMHgxMTQKKyNkZWZpbmUJUExYX0RNQTFfUENJX0FERFIJMHgxMTgKKyNkZWZpbmUJUExYX0RNQTFfTENMX0FERFIJMHgxMUMKKyNkZWZpbmUJUExYX0RNQTFfU0laRQkJMHgxMTAKKyNkZWZpbmUJUExYX0RNQTFfREVTQ1JJUFRPUgkweDEyNAorCisjZGVmaW5lCVBMWF9ETUFfQ1NSCQkweDEyOAorIwlkZWZpbmUgUExYX0RNQV9DU1JfMF9FTkFCTEUJMHgwMDAwMDAwMQorIwlkZWZpbmUgUExYX0RNQV9DU1JfMF9TVEFSVAkweDAwMDAwMDAyCisjCWRlZmluZSBQTFhfRE1BX0NTUl8wX0FCT1JUCTB4MDAwMDAwMDQKKyMJZGVmaW5lIFBMWF9ETUFfQ1NSXzBfQ0xSX0lOVFIJMHgwMDAwMDAwOAorIwlkZWZpbmUgUExYX0RNQV9DU1JfMF9ET05FCTB4MDAwMDAwMTAKKyMJZGVmaW5lIFBMWF9ETUFfQ1NSXzFfRU5BQkxFCTB4MDAwMDAxMDAKKyMJZGVmaW5lIFBMWF9ETUFfQ1NSXzFfU1RBUlQJMHgwMDAwMDIwMAorIwlkZWZpbmUgUExYX0RNQV9DU1JfMV9BQk9SVAkweDAwMDAwNDAwCisjCWRlZmluZSBQTFhfRE1BX0NTUl8xX0NMUl9JTlRSCTB4MDAwMDA4MDAKKyMJZGVmaW5lIFBMWF9ETUFfQ1NSXzFfRE9ORQkweDAwMDAxMDAwCisKKyNkZWZpbmUJUExYX0RNQV9BUkIwCQkweDEyQworIwlkZWZpbmUgUExYX0RNQV9BUkIwX0xBVEVOQ1lfVAkweDAwMDAwMEZGCisjCWRlZmluZSBQTFhfRE1BX0FSQjBfUEFVU0VfVAkweDAwMDBGRjAwCisjCWRlZmluZSBQTFhfRE1BX0FSQjBfTEFURU5DWV9FTgkweDAwMDEwMDAwCisjCWRlZmluZSBQTFhfRE1BX0FSQjBfUEFVU0VfRU4JMHgwMDAyMDAwMAorIwlkZWZpbmUgUExYX0RNQV9BUkIwX0JSRVFfRU4JMHgwMDA0MDAwMAorIwlkZWZpbmUgUExYX0RNQV9BUkIwX1BSSQkJMHgwMDE4MDAwMAorIwlkZWZpbmUgUExYX0RNQV9BUkIwX1BSSV9ST1VORAkweDAwMDAwMDAwCisjCWRlZmluZSBQTFhfRE1BX0FSQjBfUFJJXzAJMHgwMDA4MDAwMAorIwlkZWZpbmUgUExYX0RNQV9BUkIwX1BSSV8xCTB4MDAxMDAwMDAKKworI2RlZmluZQlQTFhfRE1BX0FSQjEJCTB4MTMwCisJCQkJCQkvKiBDaGFuIDA6IEZJRk8gREVQVEg9MTYgKi8KKyMJZGVmaW5lIFBMWF9ETUFfQVJCMV8wX1AyTF9MV19UUklHKFgpCSggKChYKSYxNSkgPDwgIDAgKQorIwlkZWZpbmUgUExYX0RNQV9BUkIxXzBfTDJQX0xSX1RSSUcoWCkJKCAoKFgpJjE1KSA8PCAgNCApCisjCWRlZmluZSBQTFhfRE1BX0FSQjFfMF9MMlBfUFdfVFJJRyhYKQkoICgoWCkmMTUpIDw8ICA4ICkKKyMJZGVmaW5lIFBMWF9ETUFfQVJCMV8wX1AyTF9QUl9UUklHKFgpCSggKChYKSYxNSkgPDwgMTIgKQorCQkJCQkJLyogQ2hhbiAxOiBGSUZPIERFUFRIPTggKi8KKyMJZGVmaW5lIFBMWF9ETUFfQVJCMV8xX1AyTF9MV19UUklHKFgpCSggKChYKSYgNykgPDwgMTYgKQorIwlkZWZpbmUgUExYX0RNQV9BUkIxXzFfTDJQX0xSX1RSSUcoWCkJKCAoKFgpJiA3KSA8PCAyMCApCisjCWRlZmluZSBQTFhfRE1BX0FSQjFfMV9MMlBfUFdfVFJJRyhYKQkoICgoWCkmIDcpIDw8IDI0ICkKKyMJZGVmaW5lIFBMWF9ETUFfQVJCMV8xX1AyTF9QUl9UUklHKFgpCSggKChYKSYgNykgPDwgMjggKQorCit0eXBlZGVmIHN0cnVjdCBfZG1hY2hhaW4KK3sKKwl1bG9uZwkJcGNpYWRkcjsKKwl1bG9uZwkJbGNsYWRkcjsKKwl1bG9uZwkJbGVuOworCXVsb25nCQluZXh0OworfSBETUFDSEFJTjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RsMmsuYyBiL2RyaXZlcnMvbmV0L2RsMmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTQyYjdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZGwyay5jCkBAIC0wLDAgKzEsMTg3MiBAQAorLyogIEQtTGluayBETDIwMDAtYmFzZWQgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyIExpbnV4IGRyaXZlciAqLworLyoKKyAgICBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgYnkgRC1MaW5rIENvcnBvcmF0aW9uCisgICAgV3JpdHRlbiBieSBFZHdhcmQgUGVuZy48ZWR3YXJkX3BlbmdAZGxpbmsuY29tLnR3PgorICAgIENyZWF0ZWQgMDMtTWF5LTIwMDEsIGJhc2Ugb24gTGludXgnIHN1bmRhbmNlLmMuCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKi8KKy8qCisgICAgUmV2CQlEYXRlCQlEZXNjcmlwdGlvbgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgMC4wMQkyMDAxLzA1LzAzCUNyZWF0ZWQgREwyMDAwLWJhc2VkIGxpbnV4IGRyaXZlcgorICAgIDAuMDIJMjAwMS8wNS8yMQlBZGRlZCBWTEFOIGFuZCBoYXJkd2FyZSBjaGVja3N1bSBzdXBwb3J0LgorICAgIDEuMDAJMjAwMS8wNi8yNglBZGRlZCBqdW1ibyBmcmFtZSBzdXBwb3J0LgorICAgIDEuMDEJMjAwMS8wOC8yMQlBZGRlZCB0d28gcGFyYW1ldGVycywgcnhfY29hbGVzY2UgYW5kIHJ4X3RpbWVvdXQuCisgICAgMS4wMgkyMDAxLzEwLzA4CVN1cHBvcnRlZCBmaWJlciBtZWRpYS4KKyAgICAJCQkJQWRkZWQgZmxvdyBjb250cm9sIHBhcmFtZXRlcnMuCisgICAgMS4wMwkyMDAxLzEwLzEyCUNoYW5nZWQgdGhlIGRlZmF1bHQgbWVkaWEgdG8gMTAwMG1icHNfZmQgZm9yIAorICAgIAkJCQl0aGUgZmliZXIgZGV2aWNlcy4KKyAgICAxLjA0CTIwMDEvMTEvMDgJRml4ZWQgVHggc3RvcHBlZCB3aGVuIHR4IHZlcnkgYnVzeS4KKyAgICAxLjA1CTIwMDEvMTEvMjIJRml4ZWQgVHggc3RvcHBlZCB3aGVuIHVuaWRpcmVjdGlvbmFsIHR4IGJ1c3kuCisgICAgMS4wNgkyMDAxLzEyLzEzCUZpeGVkIGRpc2Nvbm5lY3QgYnVnIGF0IDEwTWJwcyBtb2RlLgorICAgIAkJCQlGaXhlZCB0eF9mdWxsIGZsYWcgaW5jb3JyZWN0LgorCQkJCUFkZGVkIHR4X2NvYWxlc2NlIHBhcmFtdGVyLgorICAgIDEuMDcJMjAwMi8wMS8wMwlGaXhlZCBtaXNjb3VudCBvZiBSWCBmcmFtZSBlcnJvci4KKyAgICAxLjA4CTIwMDIvMDEvMTcJRml4ZWQgdGhlIG11bHRpY2FzdCBidWcuCisgICAgMS4wOQkyMDAyLzAzLzA3CU1vdmUgcngtcG9sbC1ub3cgdG8gcmUtZmlsbCBsb29wLgkKKyAgICAJCQkJQWRkZWQgcmlvX3RpbWVyKCkgdG8gd2F0Y2ggcnggYnVmZmVycy4gCisgICAgMS4xMAkyMDAyLzA0LzE2CUZpeGVkIG1pc2NvdW50IG9mIGNhcnJpZXIgZXJyb3IuCisgICAgMS4xMQkyMDAyLzA1LzIzCUFkZGVkIElTUiBzY2hlZHVsZSBzY2hlbWUKKyAgICAJCQkJRml4ZWQgbWlzY291bnQgb2YgcnggZnJhbWUgZXJyb3IgZm9yIERHRS01NTBTWC4KKyAgICAJCQkJRml4ZWQgVkxBTiBidWcuCisgICAgMS4xMgkyMDAyLzA2LzEzCUxvY2sgdHhfY29hbGVzY2U9MSBvbiAxMC8xMDBNYnBzIG1vZGUuCisgICAgMS4xMwkyMDAyLzA4LzEzCTEuIEZpeCBkaXNjb25uZWN0aW9uIChtYW55IHR4OmNhcnJpZXIvcng6ZnJhbWUKKyAgICAJCQkJICAgZXJycykgd2l0aCBzb21lIG1haW5ib2FyZHMuCisgICAgCQkJCTIuIFVzZSBkZWZpbml0aW9uICJEUlZfTkFNRSIgIkRSVl9WRVJTSU9OIiAKKwkJCQkgICAiRFJWX1JFTERBVEUiIGZvciBmbGV4aWJpbGl0eS4JCisgICAgMS4xNAkyMDAyLzA4LzE0CVN1cHBvcnQgZXRodG9vbC4JCisgICAgMS4xNQkyMDAyLzA4LzI3CUNoYW5nZWQgdGhlIGRlZmF1bHQgbWVkaWEgdG8gQXV0by1OZWdvdGlhdGlvbgorCQkJCWZvciB0aGUgZmliZXIgZGV2aWNlcy4gICAgCisgICAgMS4xNgkyMDAyLzA5LzA0ICAgICAgTW9yZSBwb3dlciBkb3duIHRpbWUgZm9yIGZpYmVyIGRldmljZXMgYXV0by0KKyAgICAJCQkJbmVnb3RpYXRpb24uCisJCQkJRml4IGRpc2Nvbm5lY3QgYnVnIGFmdGVyIGlmdXAgYW5kIGlmZG93bi4KKyAgICAxLjE3CTIwMDIvMTAvMDMJRml4IFJNT04gc3RhdGlzdGljcyBvdmVyZmxvdy4gCisJCQkgICAgIAlBbHdheXMgdXNlIEkvTyBtYXBwaW5nIHRvIGFjY2VzcyBlZXByb20sIAorCQkJCWF2b2lkIHN5c3RlbSBmcmVlemluZyB3aXRoIHNvbWUgY2hpcHNldHMuCisKKyovCisjZGVmaW5lIERSVl9OQU1FCSJELUxpbmsgREwyMDAwLWJhc2VkIGxpbnV4IGRyaXZlciIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JInYxLjE3YSIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIjIwMDIvMTAvMDQiCisjaW5jbHVkZSAiZGwyay5oIgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisgICAgICBLRVJOX0lORk8gRFJWX05BTUUgIiAiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiXG4iOwkKKyNkZWZpbmUgTUFYX1VOSVRTIDgKK3N0YXRpYyBpbnQgbXR1W01BWF9VTklUU107CitzdGF0aWMgaW50IHZsYW5bTUFYX1VOSVRTXTsKK3N0YXRpYyBpbnQganVtYm9bTUFYX1VOSVRTXTsKK3N0YXRpYyBjaGFyICptZWRpYVtNQVhfVU5JVFNdOworc3RhdGljIGludCB0eF9mbG93PS0xOworc3RhdGljIGludCByeF9mbG93PS0xOworc3RhdGljIGludCBjb3B5X3RocmVzaDsKK3N0YXRpYyBpbnQgcnhfY29hbGVzY2U9MTA7CS8qIFJ4IGZyYW1lIGNvdW50IGVhY2ggaW50ZXJydXB0ICovCitzdGF0aWMgaW50IHJ4X3RpbWVvdXQ9MjAwOwkvKiBSeCBETUEgd2FpdCB0aW1lIGluIDY0MG5zIGluY3JlbWVudHMgKi8KK3N0YXRpYyBpbnQgdHhfY29hbGVzY2U9MTY7CS8qIEhXIHhtaXQgY291bnQgZWFjaCBUeERNQUNvbXBsZXRlICovCisKKworTU9EVUxFX0FVVEhPUiAoIkVkd2FyZCBQZW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJELUxpbmsgREwyMDAwLWJhc2VkIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtX2FycmF5KG10dSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShtZWRpYSwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHZsYW4sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoanVtYm8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0odHhfZmxvdywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9mbG93LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNvcHlfdGhyZXNoLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJ4X2NvYWxlc2NlLCBpbnQsIDApOwkvKiBSeCBmcmFtZSBjb3VudCBlYWNoIGludGVycnVwdCAqLworbW9kdWxlX3BhcmFtKHJ4X3RpbWVvdXQsIGludCwgMCk7CS8qIFJ4IERNQSB3YWl0IHRpbWUgaW4gNjRucyBpbmNyZW1lbnRzICovCittb2R1bGVfcGFyYW0odHhfY29hbGVzY2UsIGludCwgMCk7IC8qIEhXIHhtaXQgY291bnQgZWFjaCBUeERNQUNvbXBsZXRlICovCisKKworLyogRW5hYmxlIHRoZSBkZWZhdWx0IGludGVycnVwdHMgKi8KKyNkZWZpbmUgREVGQVVMVF9JTlRSIChSeERNQUNvbXBsZXRlIHwgSG9zdEVycm9yIHwgSW50UmVxdWVzdGVkIHwgVHhETUFDb21wbGV0ZXwgXAorICAgICAgIFVwZGF0ZVN0YXRzIHwgTGlua0V2ZW50KQorI2RlZmluZSBFbmFibGVJbnQoKSBcCit3cml0ZXcoREVGQVVMVF9JTlRSLCBpb2FkZHIgKyBJbnRFbmFibGUpCisKK3N0YXRpYyBpbnQgbWF4X2ludHJsb29wID0gNTA7CitzdGF0aWMgaW50IG11bHRpY2FzdF9maWx0ZXJfbGltaXQgPSAweDQwOworCitzdGF0aWMgaW50IHJpb19vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJpb190aW1lciAodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJpb190eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGFsbG9jX2xpc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzdGFydF94bWl0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCByaW9faW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHJpb19mcmVlX3R4IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIHR4X2Vycm9yIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdHhfc3RhdHVzKTsKK3N0YXRpYyBpbnQgcmVjZWl2ZV9wYWNrZXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcmlvX2Vycm9yIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50X3N0YXR1cyk7CitzdGF0aWMgaW50IGNoYW5nZV9tdHUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBjbGVhcl9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJpb19pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgaW50IHJpb19jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGZpbmRfbWlpcGh5IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcGFyc2VfZWVwcm9tIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcmVhZF9lZXByb20gKGxvbmcgaW9hZGRyLCBpbnQgZWVwX2FkZHIpOworc3RhdGljIGludCBtaWlfd2FpdF9saW5rIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgd2FpdCk7CitzdGF0aWMgaW50IG1paV9zZXRfbWVkaWEgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtaWlfZ2V0X21lZGlhIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWlpX3NldF9tZWRpYV9wY3MgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtaWlfZ2V0X21lZGlhX3BjcyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1paV9yZWFkIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIGludCByZWdfbnVtKTsKK3N0YXRpYyBpbnQgbWlpX3dyaXRlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIGludCByZWdfbnVtLAorCQkgICAgICB1MTYgZGF0YSk7CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHM7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CityaW9fcHJvYmUxIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnA7CisJc3RhdGljIGludCBjYXJkX2lkeDsKKwlpbnQgY2hpcF9pZHggPSBlbnQtPmRyaXZlcl9kYXRhOworCWludCBlcnIsIGlycTsKKwlsb25nIGlvYWRkcjsKKwlzdGF0aWMgaW50IHZlcnNpb25fcHJpbnRlZDsKKwl2b2lkICpyaW5nX3NwYWNlOworCWRtYV9hZGRyX3QgcmluZ19kbWE7CisKKwlpZiAoIXZlcnNpb25fcHJpbnRlZCsrKQorCQlwcmludGsgKCIlcyIsIHZlcnNpb24pOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UgKHBkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpcnEgPSBwZGV2LT5pcnE7CisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyAocGRldiwgImRsMmsiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKworCXBjaV9zZXRfbWFzdGVyIChwZGV2KTsKKwlkZXYgPSBhbGxvY19ldGhlcmRldiAoc2l6ZW9mICgqbnApKTsKKwlpZiAoIWRldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfcmVzOworCX0KKwlTRVRfTU9EVUxFX09XTkVSIChkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKyNpZmRlZiBNRU1fTUFQUElORworCWlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMSk7CisJaW9hZGRyID0gKGxvbmcpIGlvcmVtYXAgKGlvYWRkciwgUklPX0lPX1NJWkUpOworCWlmICghaW9hZGRyKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9kZXY7CisJfQorI2Vsc2UKKwlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDApOworI2VuZGlmCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCW5wLT5jaGlwX2lkID0gY2hpcF9pZHg7CisJbnAtPnBkZXYgPSBwZGV2OworCXNwaW5fbG9ja19pbml0ICgmbnAtPnR4X2xvY2spOworCXNwaW5fbG9ja19pbml0ICgmbnAtPnJ4X2xvY2spOworCisJLyogUGFyc2UgbWFudWFsIGNvbmZpZ3VyYXRpb24gKi8KKwlucC0+YW5fZW5hYmxlID0gMTsKKwlucC0+dHhfY29hbGVzY2UgPSAxOworCWlmIChjYXJkX2lkeCA8IE1BWF9VTklUUykgeworCQlpZiAobWVkaWFbY2FyZF9pZHhdICE9IE5VTEwpIHsKKwkJCW5wLT5hbl9lbmFibGUgPSAwOworCQkJaWYgKHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiYXV0byIpID09IDAgfHwKKwkJCSAgICBzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgImF1dG9zZW5zZSIpID09IDAgfHwgCisJCQkgICAgc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICIwIikgPT0gMCApIHsKKwkJCQlucC0+YW5fZW5hYmxlID0gMjsgCisJCQl9IGVsc2UgaWYgKHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiMTAwbWJwc19mZCIpID09IDAgfHwKKwkJCSAgICBzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjQiKSA9PSAwKSB7CisJCQkJbnAtPnNwZWVkID0gMTAwOworCQkJCW5wLT5mdWxsX2R1cGxleCA9IDE7CisJCQl9IGVsc2UgaWYgKHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiMTAwbWJwc19oZCIpID09IDAKKwkJCQkgICB8fCBzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjMiKSA9PSAwKSB7CisJCQkJbnAtPnNwZWVkID0gMTAwOworCQkJCW5wLT5mdWxsX2R1cGxleCA9IDA7CisJCQl9IGVsc2UgaWYgKHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiMTBtYnBzX2ZkIikgPT0gMCB8fAorCQkJCSAgIHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiMiIpID09IDApIHsKKwkJCQlucC0+c3BlZWQgPSAxMDsKKwkJCQlucC0+ZnVsbF9kdXBsZXggPSAxOworCQkJfSBlbHNlIGlmIChzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjEwbWJwc19oZCIpID09IDAgfHwKKwkJCQkgICBzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjEiKSA9PSAwKSB7CisJCQkJbnAtPnNwZWVkID0gMTA7CisJCQkJbnAtPmZ1bGxfZHVwbGV4ID0gMDsKKwkJCX0gZWxzZSBpZiAoc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICIxMDAwbWJwc19mZCIpID09IDAgfHwKKwkJCQkgc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICI2IikgPT0gMCkgeworCQkJCW5wLT5zcGVlZD0xMDAwOworCQkJCW5wLT5mdWxsX2R1cGxleD0xOworCQkJfSBlbHNlIGlmIChzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjEwMDBtYnBzX2hkIikgPT0gMCB8fAorCQkJCSBzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjUiKSA9PSAwKSB7CisJCQkJbnAtPnNwZWVkID0gMTAwMDsKKwkJCQlucC0+ZnVsbF9kdXBsZXggPSAwOworCQkJfSBlbHNlIHsKKwkJCQlucC0+YW5fZW5hYmxlID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoanVtYm9bY2FyZF9pZHhdICE9IDApIHsKKwkJCW5wLT5qdW1ibyA9IDE7CisJCQlkZXYtPm10dSA9IE1BWF9KVU1CTzsKKwkJfSBlbHNlIHsKKwkJCW5wLT5qdW1ibyA9IDA7CisJCQlpZiAobXR1W2NhcmRfaWR4XSA+IDAgJiYgbXR1W2NhcmRfaWR4XSA8IFBBQ0tFVF9TSVpFKQorCQkJCWRldi0+bXR1ID0gbXR1W2NhcmRfaWR4XTsKKwkJfQorCQlucC0+dmxhbiA9ICh2bGFuW2NhcmRfaWR4XSA+IDAgJiYgdmxhbltjYXJkX2lkeF0gPCA0MDk2KSA/CisJCSAgICB2bGFuW2NhcmRfaWR4XSA6IDA7CisJCWlmIChyeF9jb2FsZXNjZSA+IDAgJiYgcnhfdGltZW91dCA+IDApIHsKKwkJCW5wLT5yeF9jb2FsZXNjZSA9IHJ4X2NvYWxlc2NlOworCQkJbnAtPnJ4X3RpbWVvdXQgPSByeF90aW1lb3V0OworCQkJbnAtPmNvYWxlc2NlID0gMTsKKwkJfQorCQlucC0+dHhfZmxvdyA9ICh0eF9mbG93ID09IDApID8gMCA6IDE7CisJCW5wLT5yeF9mbG93ID0gKHJ4X2Zsb3cgPT0gMCkgPyAwIDogMTsKKworCQlpZiAodHhfY29hbGVzY2UgPCAxKQorCQkJdHhfY29hbGVzY2UgPSAxOworCQllbHNlIGlmICh0eF9jb2FsZXNjZSA+IFRYX1JJTkdfU0laRS0xKQorCQkJdHhfY29hbGVzY2UgPSBUWF9SSU5HX1NJWkUgLSAxOworCX0KKwlkZXYtPm9wZW4gPSAmcmlvX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc3RhcnRfeG1pdDsKKwlkZXYtPnN0b3AgPSAmcmlvX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJmdldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0OworCWRldi0+ZG9faW9jdGwgPSAmcmlvX2lvY3RsOworCWRldi0+dHhfdGltZW91dCA9ICZyaW9fdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKwlkZXYtPmNoYW5nZV9tdHUgPSAmY2hhbmdlX210dTsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOworI2lmIDAKKwlkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9JUF9DU1VNOworI2VuZGlmCisJcGNpX3NldF9kcnZkYXRhIChwZGV2LCBkZXYpOworCisJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50IChwZGV2LCBUWF9UT1RBTF9TSVpFLCAmcmluZ19kbWEpOworCWlmICghcmluZ19zcGFjZSkKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJbnAtPnR4X3JpbmcgPSAoc3RydWN0IG5ldGRldl9kZXNjICopIHJpbmdfc3BhY2U7CisJbnAtPnR4X3JpbmdfZG1hID0gcmluZ19kbWE7CisKKwlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQgKHBkZXYsIFJYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CisJaWYgKCFyaW5nX3NwYWNlKQorCQlnb3RvIGVycl9vdXRfdW5tYXBfdHg7CisJbnAtPnJ4X3JpbmcgPSAoc3RydWN0IG5ldGRldl9kZXNjICopIHJpbmdfc3BhY2U7CisJbnAtPnJ4X3JpbmdfZG1hID0gcmluZ19kbWE7CisKKwkvKiBQYXJzZSBlZXByb20gZGF0YSAqLworCXBhcnNlX2VlcHJvbSAoZGV2KTsKKworCS8qIEZpbmQgUEhZIGFkZHJlc3MgKi8KKwllcnIgPSBmaW5kX21paXBoeSAoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfdW5tYXBfcng7CisJCisJLyogRmliZXIgZGV2aWNlPyAqLworCW5wLT5waHlfbWVkaWEgPSAocmVhZHcoaW9hZGRyICsgQVNJQ0N0cmwpICYgUGh5TWVkaWEpID8gMSA6IDA7CisJbnAtPmxpbmtfc3RhdHVzID0gMDsKKwkvKiBTZXQgbWVkaWEgYW5kIHJlc2V0IFBIWSAqLworCWlmIChucC0+cGh5X21lZGlhKSB7CisJCS8qIGRlZmF1bHQgQXV0by1OZWdvdGlhdGlvbiBmb3IgZmliZXIgZGVpdmljZXMgKi8KKwkgCWlmIChucC0+YW5fZW5hYmxlID09IDIpIHsKKwkJCW5wLT5hbl9lbmFibGUgPSAxOworCQl9CisJCW1paV9zZXRfbWVkaWFfcGNzIChkZXYpOworCX0gZWxzZSB7CisJCS8qIEF1dG8tTmVnb3RpYXRpb24gaXMgbWFuZGF0b3J5IGZvciAxMDAwQkFTRS1ULAorCQkgICBJRUVFIDgwMi4zYWIgQW5uZXggMjhEIHBhZ2UgMTQgKi8KKwkJaWYgKG5wLT5zcGVlZCA9PSAxMDAwKQorCQkJbnAtPmFuX2VuYWJsZSA9IDE7CisJCW1paV9zZXRfbWVkaWEgKGRldik7CisJfQorCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJm5wLT5wY2lfcmV2X2lkKTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldiAoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfdW5tYXBfcng7CisKKwljYXJkX2lkeCsrOworCisJcHJpbnRrIChLRVJOX0lORk8gIiVzOiAlcywgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngsIElSUSAlZFxuIiwKKwkJZGV2LT5uYW1lLCBucC0+bmFtZSwKKwkJZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkJZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSwgaXJxKTsKKwlpZiAodHhfY29hbGVzY2UgPiAxKQorCQlwcmludGsoS0VSTl9JTkZPICJ0eF9jb2FsZXNjZTpcdCVkIHBhY2tldHNcbiIsIAorCQkJCXR4X2NvYWxlc2NlKTsKKwlpZiAobnAtPmNvYWxlc2NlKQorCQlwcmludGsoS0VSTl9JTkZPICJyeF9jb2FsZXNjZTpcdCVkIHBhY2tldHNcbiIKKwkJICAgICAgIEtFUk5fSU5GTyAicnhfdGltZW91dDogXHQlZCBuc1xuIiwgCisJCQkJbnAtPnJ4X2NvYWxlc2NlLCBucC0+cnhfdGltZW91dCo2NDApOworCWlmIChucC0+dmxhbikKKwkJcHJpbnRrKEtFUk5fSU5GTyAidmxhbihpZCk6XHQlZFxuIiwgbnAtPnZsYW4pOworCXJldHVybiAwOworCisgICAgICBlcnJfb3V0X3VubWFwX3J4OgorCXBjaV9mcmVlX2NvbnNpc3RlbnQgKHBkZXYsIFJYX1RPVEFMX1NJWkUsIG5wLT5yeF9yaW5nLCBucC0+cnhfcmluZ19kbWEpOworICAgICAgZXJyX291dF91bm1hcF90eDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50IChwZGV2LCBUWF9UT1RBTF9TSVpFLCBucC0+dHhfcmluZywgbnAtPnR4X3JpbmdfZG1hKTsKKyAgICAgIGVycl9vdXRfaW91bm1hcDoKKyNpZmRlZiBNRU1fTUFQUElORworCWlvdW5tYXAgKCh2b2lkICopIGlvYWRkcik7CisKKyAgICAgIGVycl9vdXRfZGV2OgorI2VuZGlmCisJZnJlZV9uZXRkZXYgKGRldik7CisKKyAgICAgIGVycl9vdXRfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMgKHBkZXYpOworCisgICAgICBlcnJfb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlIChwZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQKK2ZpbmRfbWlpcGh5IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpLCBwaHlfZm91bmQgPSAwOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnA7CisJbG9uZyBpb2FkZHI7CisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5wLT5waHlfYWRkciA9IDE7CisKKwlmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IG1paV9zdGF0dXMgPSBtaWlfcmVhZCAoZGV2LCBpLCAxKTsKKwkJaWYgKG1paV9zdGF0dXMgIT0gMHhmZmZmICYmIG1paV9zdGF0dXMgIT0gMHgwMDAwKSB7CisJCQlucC0+cGh5X2FkZHIgPSBpOworCQkJcGh5X2ZvdW5kKys7CisJCX0KKwl9CisJaWYgKCFwaHlfZm91bmQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IE5vIE1JSSBQSFkgZm91bmQhXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludAorcGFyc2VfZWVwcm9tIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpLCBqOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTggc3JvbWRhdGFbMjU2XTsKKwl1OCAqcHNpYjsKKwl1MzIgY3JjOworCVBTUk9NX3QgcHNyb20gPSAoUFNST01fdCkgc3JvbWRhdGE7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpbnQgY2lkLCBuZXh0OworCisjaWZkZWYJTUVNX01BUFBJTkcKKwlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKG5wLT5wZGV2LCAwKTsKKyNlbmRpZgorCS8qIFJlYWQgZWVwcm9tICovCisJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisJCSgodTE2ICopIHNyb21kYXRhKVtpXSA9IGxlMTZfdG9fY3B1IChyZWFkX2VlcHJvbSAoaW9hZGRyLCBpKSk7CisJfQorI2lmZGVmCU1FTV9NQVBQSU5HCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisjZW5kaWYJCisJLyogQ2hlY2sgQ1JDICovCisJY3JjID0gfmV0aGVyX2NyY19sZSAoMjU2IC0gNCwgc3JvbWRhdGEpOworCWlmIChwc3JvbS0+Y3JjICE9IGNyYykgeworCQlwcmludGsgKEtFUk5fRVJSICIlczogRUVQUk9NIGRhdGEgQ1JDIGVycm9yLlxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFNldCBNQUMgYWRkcmVzcyAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBwc3JvbS0+bWFjX2FkZHJbaV07CisKKwkvKiBQYXJzZSBTb2Z0d2FyZSBJbmZvbWF0aW9uIEJsb2NrICovCisJaSA9IDB4MzA7CisJcHNpYiA9ICh1OCAqKSBzcm9tZGF0YTsKKwlkbyB7CisJCWNpZCA9IHBzaWJbaSsrXTsKKwkJbmV4dCA9IHBzaWJbaSsrXTsKKwkJaWYgKChjaWQgPT0gMCAmJiBuZXh0ID09IDApIHx8IChjaWQgPT0gMHhmZiAmJiBuZXh0ID09IDB4ZmYpKSB7CisJCQlwcmludGsgKEtFUk5fRVJSICJDZWxsIGRhdGEgZXJyb3JcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXN3aXRjaCAoY2lkKSB7CisJCWNhc2UgMDoJLyogRm9ybWF0IHZlcnNpb24gKi8KKwkJCWJyZWFrOworCQljYXNlIDE6CS8qIEVuZCBvZiBjZWxsICovCisJCQlyZXR1cm4gMDsKKwkJY2FzZSAyOgkvKiBEdXBsZXggUG9sYXJpdHkgKi8KKwkJCW5wLT5kdXBsZXhfcG9sYXJpdHkgPSBwc2liW2ldOworCQkJd3JpdGViIChyZWFkYiAoaW9hZGRyICsgUGh5Q3RybCkgfCBwc2liW2ldLAorCQkJCWlvYWRkciArIFBoeUN0cmwpOworCQkJYnJlYWs7CisJCWNhc2UgMzoJLyogV2FrZSBQb2xhcml0eSAqLworCQkJbnAtPndha2VfcG9sYXJpdHkgPSBwc2liW2ldOworCQkJYnJlYWs7CisJCWNhc2UgOToJLyogQWRhcHRlciBkZXNjcmlwdGlvbiAqLworCQkJaiA9IChuZXh0IC0gaSA+IDI1NSkgPyAyNTUgOiBuZXh0IC0gaTsKKwkJCW1lbWNweSAobnAtPm5hbWUsICYocHNpYltpXSksIGopOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJY2FzZSA1OgorCQljYXNlIDY6CisJCWNhc2UgNzoKKwkJY2FzZSA4OgkvKiBSZXZlcnNlZCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CS8qIFVua25vd24gY2VsbCAqLworCQkJcmV0dXJuIC0xOworCQl9CisJCWkgPSBuZXh0OworCX0gd2hpbGUgKDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Jpb19vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisJdTE2IG1hY2N0cmw7CisJCisJaSA9IHJlcXVlc3RfaXJxIChkZXYtPmlycSwgJnJpb19pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCQorCS8qIFJlc2V0IGFsbCBsb2dpYyBmdW5jdGlvbnMgKi8KKwl3cml0ZXcgKEdsb2JhbFJlc2V0IHwgRE1BUmVzZXQgfCBGSUZPUmVzZXQgfCBOZXR3b3JrUmVzZXQgfCBIb3N0UmVzZXQsCisJCWlvYWRkciArIEFTSUNDdHJsICsgMik7CisJbWRlbGF5KDEwKTsKKwkKKwkvKiBEZWJ1Z0N0cmwgYml0IDQsIDUsIDkgbXVzdCBzZXQgKi8KKwl3cml0ZWwgKHJlYWRsIChpb2FkZHIgKyBEZWJ1Z0N0cmwpIHwgMHgwMjMwLCBpb2FkZHIgKyBEZWJ1Z0N0cmwpOworCisJLyogSnVtYm8gZnJhbWUgKi8KKwlpZiAobnAtPmp1bWJvICE9IDApCisJCXdyaXRldyAoTUFYX0pVTUJPKzE0LCBpb2FkZHIgKyBNYXhGcmFtZVNpemUpOworCisJYWxsb2NfbGlzdCAoZGV2KTsKKworCS8qIEdldCBzdGF0aW9uIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQl3cml0ZWIgKGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIFN0YXRpb25BZGRyMCArIGkpOworCisJc2V0X211bHRpY2FzdCAoZGV2KTsKKwlpZiAobnAtPmNvYWxlc2NlKSB7CisJCXdyaXRlbCAobnAtPnJ4X2NvYWxlc2NlIHwgbnAtPnJ4X3RpbWVvdXQgPDwgMTYsCisJCQlpb2FkZHIgKyBSeERNQUludEN0cmwpOworCX0KKwkvKiBTZXQgUklPIHRvIHBvbGwgZXZlcnkgTiozMjBuc2VjLiAqLworCXdyaXRlYiAoMHgyMCwgaW9hZGRyICsgUnhETUFQb2xsUGVyaW9kKTsKKwl3cml0ZWIgKDB4ZmYsIGlvYWRkciArIFR4RE1BUG9sbFBlcmlvZCk7CisJd3JpdGViICgweDMwLCBpb2FkZHIgKyBSeERNQUJ1cnN0VGhyZXNoKTsKKwl3cml0ZWIgKDB4MzAsIGlvYWRkciArIFJ4RE1BVXJnZW50VGhyZXNoKTsKKwl3cml0ZWwgKDB4MDAwN2ZmZmYsIGlvYWRkciArIFJtb25TdGF0TWFzayk7CisJLyogY2xlYXIgc3RhdGlzdGljcyAqLworCWNsZWFyX3N0YXRzIChkZXYpOworCisJLyogVkxBTiBzdXBwb3J0ZWQgKi8KKwlpZiAobnAtPnZsYW4pIHsKKwkJLyogcHJpb3JpdHkgZmllbGQgaW4gUnhETUFJbnRDdHJsICAqLworCQl3cml0ZWwgKHJlYWRsKGlvYWRkciArIFJ4RE1BSW50Q3RybCkgfCAweDcgPDwgMTAsIAorCQkJaW9hZGRyICsgUnhETUFJbnRDdHJsKTsKKwkJLyogVkxBTklkICovCisJCXdyaXRldyAobnAtPnZsYW4sIGlvYWRkciArIFZMQU5JZCk7CisJCS8qIExlbmd0aC9UeXBlIHNob3VsZCBiZSAweDgxMDAgKi8KKwkJd3JpdGVsICgweDgxMDAgPDwgMTYgfCBucC0+dmxhbiwgaW9hZGRyICsgVkxBTlRhZyk7CisJCS8qIEVuYWJsZSBBdXRvVkxBTnVudGFnZ2luZywgYnV0IGRpc2FibGUgQXV0b1ZMQU50YWdnaW5nLgorCQkgICBWTEFOIGluZm9ybWF0aW9uIHRhZ2dlZCBieSBURkMnIFZJRCwgQ0ZJIGZpZWxkcy4gKi8KKwkJd3JpdGVsIChyZWFkbCAoaW9hZGRyICsgTUFDQ3RybCkgfCBBdXRvVkxBTnVudGFnZ2luZywKKwkJCWlvYWRkciArIE1BQ0N0cmwpOworCX0KKworCWluaXRfdGltZXIgKCZucC0+dGltZXIpOworCW5wLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIDEqSFo7CisJbnAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCW5wLT50aW1lci5mdW5jdGlvbiA9ICZyaW9fdGltZXI7CisJYWRkX3RpbWVyICgmbnAtPnRpbWVyKTsKKworCS8qIFN0YXJ0IFR4L1J4ICovCisJd3JpdGVsIChyZWFkbCAoaW9hZGRyICsgTUFDQ3RybCkgfCBTdGF0c0VuYWJsZSB8IFJ4RW5hYmxlIHwgVHhFbmFibGUsIAorCQkJaW9hZGRyICsgTUFDQ3RybCk7CisJCisJbWFjY3RybCA9IDA7CisJbWFjY3RybCB8PSAobnAtPnZsYW4pID8gQXV0b1ZMQU51bnRhZ2dpbmcgOiAwOworCW1hY2N0cmwgfD0gKG5wLT5mdWxsX2R1cGxleCkgPyBEdXBsZXhTZWxlY3QgOiAwOworCW1hY2N0cmwgfD0gKG5wLT50eF9mbG93KSA/IFR4Rmxvd0NvbnRyb2xFbmFibGUgOiAwOworCW1hY2N0cmwgfD0gKG5wLT5yeF9mbG93KSA/IFJ4Rmxvd0NvbnRyb2xFbmFibGUgOiAwOworCXdyaXRldyhtYWNjdHJsLAlpb2FkZHIgKyBNQUNDdHJsKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCQorCS8qIEVuYWJsZSBkZWZhdWx0IGludGVycnVwdHMgKi8KKwlFbmFibGVJbnQgKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIAorcmlvX3RpbWVyICh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IGVudHJ5OworCWludCBuZXh0X3RpY2sgPSAxKkhaOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPnJ4X2xvY2ssIGZsYWdzKTsKKwkvKiBSZWNvdmVyIHJ4IHJpbmcgZXhoYXVzdGVkIGVycm9yICovCisJaWYgKG5wLT5jdXJfcnggLSBucC0+b2xkX3J4ID49IFJYX1JJTkdfU0laRSkgeworCQlwcmludGsoS0VSTl9JTkZPICJUcnkgdG8gcmVjb3ZlciByeCByaW5nIGV4aGF1c3RlZC4uLlxuIik7CisJCS8qIFJlLWFsbG9jYXRlIHNrYnVmZnMgdG8gZmlsbCB0aGUgZGVzY3JpcHRvciByaW5nICovCisJCWZvciAoOyBucC0+Y3VyX3J4IC0gbnAtPm9sZF9yeCA+IDA7IG5wLT5vbGRfcngrKykgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCWVudHJ5ID0gbnAtPm9sZF9yeCAlIFJYX1JJTkdfU0laRTsKKwkJCS8qIERyb3BwZWQgcGFja2V0cyBkb24ndCBuZWVkIHRvIHJlLWFsbG9jYXRlICovCisJCQlpZiAobnAtPnJ4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkgeworCQkJCXNrYiA9IGRldl9hbGxvY19za2IgKG5wLT5yeF9idWZfc3opOworCQkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCQlucC0+cnhfcmluZ1tlbnRyeV0uZnJhZ2luZm8gPSAwOworCQkJCQlwcmludGsgKEtFUk5fSU5GTworCQkJCQkJIiVzOiBTdGlsbCB1bmFibGUgdG8gcmUtYWxsb2NhdGUgUnggc2tidWZmLiMlZFxuIiwKKwkJCQkJCWRldi0+bmFtZSwgZW50cnkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbnAtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisJCQkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CisJCQkJbnAtPnJ4X3JpbmdbZW50cnldLmZyYWdpbmZvID0KKwkJCQkgICAgY3B1X3RvX2xlNjQgKHBjaV9tYXBfc2luZ2xlCisJCQkJCSAobnAtPnBkZXYsIHNrYi0+dGFpbCwgbnAtPnJ4X2J1Zl9zeiwKKwkJCQkJICBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJCX0KKwkJCW5wLT5yeF9yaW5nW2VudHJ5XS5mcmFnaW5mbyB8PQorCQkJICAgIGNwdV90b19sZTY0IChucC0+cnhfYnVmX3N6KSA8PCA0ODsKKwkJCW5wLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMgPSAwOworCQl9IC8qIGVuZCBmb3IgKi8KKwl9IC8qIGVuZCBpZiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZucC0+cnhfbG9jaywgZmxhZ3MpOworCW5wLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG5leHRfdGljazsKKwlhZGRfdGltZXIoJm5wLT50aW1lcik7Cit9CisJCitzdGF0aWMgdm9pZAorcmlvX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXByaW50ayAoS0VSTl9JTkZPICIlczogVHggdGltZWQgb3V0ICglNC40eCksIGlzIGJ1ZmZlciBmdWxsP1xuIiwKKwkJZGV2LT5uYW1lLCByZWFkbCAoaW9hZGRyICsgVHhTdGF0dXMpKTsKKwlyaW9fZnJlZV90eChkZXYsIDApOworCWRldi0+aWZfcG9ydCA9IDA7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Cit9CisKKyAvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBUeCBhbmQgUnggZGVzY3JpcHRvcnMgKi8KK3N0YXRpYyB2b2lkCithbGxvY19saXN0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJbnAtPmN1cl9yeCA9IG5wLT5jdXJfdHggPSAwOworCW5wLT5vbGRfcnggPSBucC0+b2xkX3R4ID0gMDsKKwlucC0+cnhfYnVmX3N6ID0gKGRldi0+bXR1IDw9IDE1MDAgPyBQQUNLRVRfU0laRSA6IGRldi0+bXR1ICsgMzIpOworCisJLyogSW5pdGlhbGl6ZSBUeCBkZXNjcmlwdG9ycywgVEZETGlzdFB0ciBsZWF2ZXMgaW4gc3RhcnRfeG1pdCgpLiAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlucC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJbnAtPnR4X3JpbmdbaV0uc3RhdHVzID0gY3B1X3RvX2xlNjQgKFRGRERvbmUpOworCQlucC0+dHhfcmluZ1tpXS5uZXh0X2Rlc2MgPSBjcHVfdG9fbGU2NCAobnAtPnR4X3JpbmdfZG1hICsKKwkJCQkJICAgICAgKChpKzEpJVRYX1JJTkdfU0laRSkgKgorCQkJCQkgICAgICBzaXplb2YgKHN0cnVjdCBuZXRkZXZfZGVzYykpOworCX0KKworCS8qIEluaXRpYWxpemUgUnggZGVzY3JpcHRvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJbnAtPnJ4X3JpbmdbaV0ubmV4dF9kZXNjID0gY3B1X3RvX2xlNjQgKG5wLT5yeF9yaW5nX2RtYSArCisJCQkJCQkoKGkgKyAxKSAlIFJYX1JJTkdfU0laRSkgKgorCQkJCQkJc2l6ZW9mIChzdHJ1Y3QgbmV0ZGV2X2Rlc2MpKTsKKwkJbnAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwkJbnAtPnJ4X3JpbmdbaV0uZnJhZ2luZm8gPSAwOworCQlucC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgcnggYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQkvKiBBbGxvY2F0ZWQgZml4ZWQgc2l6ZSBvZiBza2J1ZmYgKi8KKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IgKG5wLT5yeF9idWZfc3opOworCQlucC0+cnhfc2tidWZmW2ldID0gc2tiOworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIKKwkJCQkiJXM6IGFsbG9jX2xpc3Q6IGFsbG9jYXRlIFJ4IGJ1ZmZlciBlcnJvciEgIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJc2tiLT5kZXYgPSBkZXY7CS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlci4gKi8KKwkJLyogUnViaWNvbiBub3cgc3VwcG9ydHMgNDAgYml0cyBvZiBhZGRyZXNzaW5nIHNwYWNlLiAqLworCQlucC0+cnhfcmluZ1tpXS5mcmFnaW5mbyA9CisJCSAgICBjcHVfdG9fbGU2NCAoIHBjaV9tYXBfc2luZ2xlICgKKwkJCSAJICBucC0+cGRldiwgc2tiLT50YWlsLCBucC0+cnhfYnVmX3N6LAorCQkJCSAgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCW5wLT5yeF9yaW5nW2ldLmZyYWdpbmZvIHw9IGNwdV90b19sZTY0IChucC0+cnhfYnVmX3N6KSA8PCA0ODsKKwl9CisKKwkvKiBTZXQgUkZETGlzdFB0ciAqLworCXdyaXRlbCAoY3B1X3RvX2xlMzIgKG5wLT5yeF9yaW5nX2RtYSksIGRldi0+YmFzZV9hZGRyICsgUkZETGlzdFB0cjApOworCXdyaXRlbCAoMCwgZGV2LT5iYXNlX2FkZHIgKyBSRkRMaXN0UHRyMSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK3N0YXJ0X3htaXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldGRldl9kZXNjICp0eGRlc2M7CisJdW5zaWduZWQgZW50cnk7CisJdTMyIGlvYWRkcjsKKwl1NjQgdGZjX3ZsYW5fdGFnID0gMDsKKworCWlmIChucC0+bGlua19zdGF0dXMgPT0gMCkgewkvKiBMaW5rIERvd24gKi8KKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJZW50cnkgPSBucC0+Y3VyX3R4ICUgVFhfUklOR19TSVpFOworCW5wLT50eF9za2J1ZmZbZW50cnldID0gc2tiOworCXR4ZGVzYyA9ICZucC0+dHhfcmluZ1tlbnRyeV07CisKKyNpZiAwCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCXR4ZGVzYy0+c3RhdHVzIHw9CisJCSAgICBjcHVfdG9fbGU2NCAoVENQQ2hlY2tzdW1FbmFibGUgfCBVRFBDaGVja3N1bUVuYWJsZSB8CisJCQkJIElQQ2hlY2tzdW1FbmFibGUpOworCX0KKyNlbmRpZgorCWlmIChucC0+dmxhbikgeworCQl0ZmNfdmxhbl90YWcgPQorCQkgICAgY3B1X3RvX2xlNjQgKFZMQU5UYWdJbnNlcnQpIHwKKwkJICAgIChjcHVfdG9fbGU2NCAobnAtPnZsYW4pIDw8IDMyKSB8CisJCSAgICAoY3B1X3RvX2xlNjQgKHNrYi0+cHJpb3JpdHkpIDw8IDQ1KTsKKwl9CisJdHhkZXNjLT5mcmFnaW5mbyA9IGNwdV90b19sZTY0IChwY2lfbWFwX3NpbmdsZSAobnAtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJCQlza2ItPmxlbiwKKwkJCQkJCQlQQ0lfRE1BX1RPREVWSUNFKSk7CisJdHhkZXNjLT5mcmFnaW5mbyB8PSBjcHVfdG9fbGU2NCAoc2tiLT5sZW4pIDw8IDQ4OworCisJLyogREwySyBidWc6IERNQSBmYWlscyB0byBnZXQgbmV4dCBkZXNjcmlwdG9yIHB0ciBpbiAxME1icHMgbW9kZQorCSAqIFdvcmsgYXJvdW5kOiBBbHdheXMgdXNlIDEgZGVzY3JpcHRvciBpbiAxME1icHMgbW9kZSAqLworCWlmIChlbnRyeSAlIG5wLT50eF9jb2FsZXNjZSA9PSAwIHx8IG5wLT5zcGVlZCA9PSAxMCkKKwkJdHhkZXNjLT5zdGF0dXMgPSBjcHVfdG9fbGU2NCAoZW50cnkgfCB0ZmNfdmxhbl90YWcgfAorCQkJCQkgICAgICBXb3JkQWxpZ25EaXNhYmxlIHwgCisJCQkJCSAgICAgIFR4RE1BSW5kaWNhdGUgfAorCQkJCQkgICAgICAoMSA8PCBGcmFnQ291bnRTaGlmdCkpOworCWVsc2UKKwkJdHhkZXNjLT5zdGF0dXMgPSBjcHVfdG9fbGU2NCAoZW50cnkgfCB0ZmNfdmxhbl90YWcgfAorCQkJCQkgICAgICBXb3JkQWxpZ25EaXNhYmxlIHwgCisJCQkJCSAgICAgICgxIDw8IEZyYWdDb3VudFNoaWZ0KSk7CisKKwkvKiBUeERNQVBvbGxOb3cgKi8KKwl3cml0ZWwgKHJlYWRsIChpb2FkZHIgKyBETUFDdHJsKSB8IDB4MDAwMDEwMDAsIGlvYWRkciArIERNQUN0cmwpOworCS8qIFNjaGVkdWxlIElTUiAqLworCXdyaXRlbCgxMDAwMCwgaW9hZGRyICsgQ291bnREb3duKTsKKwlucC0+Y3VyX3R4ID0gKG5wLT5jdXJfdHggKyAxKSAlIFRYX1JJTkdfU0laRTsKKwlpZiAoKG5wLT5jdXJfdHggLSBucC0+b2xkX3R4ICsgVFhfUklOR19TSVpFKSAlIFRYX1JJTkdfU0laRQorCQkJPCBUWF9RVUVVRV9MRU4gLSAxICYmIG5wLT5zcGVlZCAhPSAxMCkgeworCQkvKiBkbyBub3RoaW5nICovCisJfSBlbHNlIGlmICghbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJfQorCisJLyogVGhlIGZpcnN0IFRGRExpc3RQdHIgKi8KKwlpZiAocmVhZGwgKGRldi0+YmFzZV9hZGRyICsgVEZETGlzdFB0cjApID09IDApIHsKKwkJd3JpdGVsIChucC0+dHhfcmluZ19kbWEgKyBlbnRyeSAqIHNpemVvZiAoc3RydWN0IG5ldGRldl9kZXNjKSwKKwkJCWRldi0+YmFzZV9hZGRyICsgVEZETGlzdFB0cjApOworCQl3cml0ZWwgKDAsIGRldi0+YmFzZV9hZGRyICsgVEZETGlzdFB0cjEpOworCX0KKwkKKwkvKiBORVRERVYgV0FUQ0hET0cgdGltZXIgKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90CityaW9faW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wOworCXVuc2lnbmVkIGludF9zdGF0dXM7CisJbG9uZyBpb2FkZHI7CisJaW50IGNudCA9IG1heF9pbnRybG9vcDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlucCA9IG5ldGRldl9wcml2KGRldik7CisJd2hpbGUgKDEpIHsKKwkJaW50X3N0YXR1cyA9IHJlYWR3IChpb2FkZHIgKyBJbnRTdGF0dXMpOyAKKwkJd3JpdGV3IChpbnRfc3RhdHVzLCBpb2FkZHIgKyBJbnRTdGF0dXMpOworCQlpbnRfc3RhdHVzICY9IERFRkFVTFRfSU5UUjsKKwkJaWYgKGludF9zdGF0dXMgPT0gMCB8fCAtLWNudCA8IDApCisJCQlicmVhazsKKwkJaGFuZGxlZCA9IDE7CisJCS8qIFByb2Nlc3NpbmcgcmVjZWl2ZWQgcGFja2V0cyAqLworCQlpZiAoaW50X3N0YXR1cyAmIFJ4RE1BQ29tcGxldGUpCisJCQlyZWNlaXZlX3BhY2tldCAoZGV2KTsKKwkJLyogVHhETUFDb21wbGV0ZSBpbnRlcnJ1cHQgKi8KKwkJaWYgKChpbnRfc3RhdHVzICYgKFR4RE1BQ29tcGxldGV8SW50UmVxdWVzdGVkKSkpIHsKKwkJCWludCB0eF9zdGF0dXM7CisJCQl0eF9zdGF0dXMgPSByZWFkbCAoaW9hZGRyICsgVHhTdGF0dXMpOworCQkJaWYgKHR4X3N0YXR1cyAmIDB4MDEpCisJCQkJdHhfZXJyb3IgKGRldiwgdHhfc3RhdHVzKTsKKwkJCS8qIEZyZWUgdXNlZCB0eCBza2J1ZmZzICovCisJCQlyaW9fZnJlZV90eCAoZGV2LCAxKTsJCQorCQl9CisKKwkJLyogSGFuZGxlIHVuY29tbW9uIGV2ZW50cyAqLworCQlpZiAoaW50X3N0YXR1cyAmCisJCSAgICAoSG9zdEVycm9yIHwgTGlua0V2ZW50IHwgVXBkYXRlU3RhdHMpKQorCQkJcmlvX2Vycm9yIChkZXYsIGludF9zdGF0dXMpOworCX0KKwlpZiAobnAtPmN1cl90eCAhPSBucC0+b2xkX3R4KQorCQl3cml0ZWwgKDEwMCwgaW9hZGRyICsgQ291bnREb3duKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIHZvaWQgCityaW9fZnJlZV90eCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlycSkgCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5ID0gbnAtPm9sZF90eCAlIFRYX1JJTkdfU0laRTsKKwlpbnQgdHhfdXNlID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWcgPSAwOworCQorCWlmIChpcnEpCisJCXNwaW5fbG9jaygmbnAtPnR4X2xvY2spOworCWVsc2UKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT50eF9sb2NrLCBmbGFnKTsKKwkJCQorCS8qIEZyZWUgdXNlZCB0eCBza2J1ZmZzICovCisJd2hpbGUgKGVudHJ5ICE9IG5wLT5jdXJfdHgpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlpZiAoIShucC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzICYgVEZERG9uZSkpCisJCQlicmVhazsKKwkJc2tiID0gbnAtPnR4X3NrYnVmZltlbnRyeV07CisJCXBjaV91bm1hcF9zaW5nbGUgKG5wLT5wZGV2LAorCQkJCSAgbnAtPnR4X3JpbmdbZW50cnldLmZyYWdpbmZvLAorCQkJCSAgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlpZiAoaXJxKQorCQkJZGV2X2tmcmVlX3NrYl9pcnEgKHNrYik7CisJCWVsc2UKKwkJCWRldl9rZnJlZV9za2IgKHNrYik7CisKKwkJbnAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQllbnRyeSA9IChlbnRyeSArIDEpICUgVFhfUklOR19TSVpFOworCQl0eF91c2UrKzsKKwl9CisJaWYgKGlycSkKKwkJc3Bpbl91bmxvY2soJm5wLT50eF9sb2NrKTsKKwllbHNlCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT50eF9sb2NrLCBmbGFnKTsKKwlucC0+b2xkX3R4ID0gZW50cnk7CisKKwkvKiBJZiB0aGUgcmluZyBpcyBubyBsb25nZXIgZnVsbCwgY2xlYXIgdHhfZnVsbCBhbmQgCisJICAgY2FsbCBuZXRpZl93YWtlX3F1ZXVlKCkgKi8KKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkgICAgKChucC0+Y3VyX3R4IC0gbnAtPm9sZF90eCArIFRYX1JJTkdfU0laRSkgJSBUWF9SSU5HX1NJWkUgCisJICAgIDwgVFhfUVVFVUVfTEVOIC0gMSB8fCBucC0+c3BlZWQgPT0gMTApKSB7CisJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJfQorfQorCitzdGF0aWMgdm9pZAordHhfZXJyb3IgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB0eF9zdGF0dXMpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucDsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBmcmFtZV9pZDsKKwlpbnQgaTsKKworCW5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWZyYW1lX2lkID0gKHR4X3N0YXR1cyAmIDB4ZmZmZjAwMDApOworCXByaW50ayAoS0VSTl9FUlIgIiVzOiBUcmFuc21pdCBlcnJvciwgVHhTdGF0dXMgJTQuNHgsIEZyYW1lSWQgJWQuXG4iLAorCQlkZXYtPm5hbWUsIHR4X3N0YXR1cywgZnJhbWVfaWQpOworCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkvKiBUdHJhbnNtaXQgVW5kZXJydW4gKi8KKwlpZiAodHhfc3RhdHVzICYgMHgxMCkgeworCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJd3JpdGV3IChyZWFkdyAoaW9hZGRyICsgVHhTdGFydFRocmVzaCkgKyAweDEwLAorCQkJaW9hZGRyICsgVHhTdGFydFRocmVzaCk7CisJCS8qIFRyYW5zbWl0IFVuZGVycnVuIG5lZWQgdG8gc2V0IFR4UmVzZXQsIERNQVJlc3QsIEZJRk9SZXNldCAqLworCQl3cml0ZXcgKFR4UmVzZXQgfCBETUFSZXNldCB8IEZJRk9SZXNldCB8IE5ldHdvcmtSZXNldCwKKwkJCWlvYWRkciArIEFTSUNDdHJsICsgMik7CisJCS8qIFdhaXQgZm9yIFJlc2V0QnVzeSBiaXQgY2xlYXIgKi8KKwkJZm9yIChpID0gNTA7IGkgPiAwOyBpLS0pIHsKKwkJCWlmICgocmVhZHcgKGlvYWRkciArIEFTSUNDdHJsICsgMikgJiBSZXNldEJ1c3kpID09IDApCisJCQkJYnJlYWs7CisJCQltZGVsYXkgKDEpOworCQl9CisJCXJpb19mcmVlX3R4IChkZXYsIDEpOworCQkvKiBSZXNldCBURkRMaXN0UHRyICovCisJCXdyaXRlbCAobnAtPnR4X3JpbmdfZG1hICsKKwkJCW5wLT5vbGRfdHggKiBzaXplb2YgKHN0cnVjdCBuZXRkZXZfZGVzYyksCisJCQlkZXYtPmJhc2VfYWRkciArIFRGRExpc3RQdHIwKTsKKwkJd3JpdGVsICgwLCBkZXYtPmJhc2VfYWRkciArIFRGRExpc3RQdHIxKTsKKworCQkvKiBMZXQgVHhTdGFydFRocmVzaCBzdGF5IGRlZmF1bHQgdmFsdWUgKi8KKwl9CisJLyogTGF0ZSBDb2xsaXNpb24gKi8KKwlpZiAodHhfc3RhdHVzICYgMHgwNCkgeworCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJLyogVHhSZXNldCBhbmQgY2xlYXIgRklGTyAqLworCQl3cml0ZXcgKFR4UmVzZXQgfCBGSUZPUmVzZXQsIGlvYWRkciArIEFTSUNDdHJsICsgMik7CisJCS8qIFdhaXQgcmVzZXQgZG9uZSAqLworCQlmb3IgKGkgPSA1MDsgaSA+IDA7IGktLSkgeworCQkJaWYgKChyZWFkdyAoaW9hZGRyICsgQVNJQ0N0cmwgKyAyKSAmIFJlc2V0QnVzeSkgPT0gMCkKKwkJCQlicmVhazsKKwkJCW1kZWxheSAoMSk7CisJCX0KKwkJLyogTGV0IFR4U3RhcnRUaHJlc2ggc3RheSBkZWZhdWx0IHZhbHVlICovCisJfQorCS8qIE1heGltdW0gQ29sbGlzaW9ucyAqLworI2lmZGVmIEVUSEVSX1NUQVRTCQorCWlmICh0eF9zdGF0dXMgJiAweDA4KSAKKwkJbnAtPnN0YXRzLmNvbGxpc2lvbnMxNisrOworI2Vsc2UKKwlpZiAodHhfc3RhdHVzICYgMHgwOCkgCisJCW5wLT5zdGF0cy5jb2xsaXNpb25zKys7CisjZW5kaWYKKwkvKiBSZXN0YXJ0IHRoZSBUeCAqLworCXdyaXRlbCAocmVhZHcgKGRldi0+YmFzZV9hZGRyICsgTUFDQ3RybCkgfCBUeEVuYWJsZSwgaW9hZGRyICsgTUFDQ3RybCk7Cit9CisKK3N0YXRpYyBpbnQKK3JlY2VpdmVfcGFja2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeSA9IG5wLT5jdXJfcnggJSBSWF9SSU5HX1NJWkU7CisJaW50IGNudCA9IDMwOworCisJLyogSWYgUkZERG9uZSwgRnJhbWVTdGFydCBhbmQgRnJhbWVFbmQgc2V0LCB0aGVyZSBpcyBhIG5ldyBwYWNrZXQgaW4uICovCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IG5ldGRldl9kZXNjICpkZXNjID0gJm5wLT5yeF9yaW5nW2VudHJ5XTsKKwkJaW50IHBrdF9sZW47CisJCXU2NCBmcmFtZV9zdGF0dXM7CisKKwkJaWYgKCEoZGVzYy0+c3RhdHVzICYgUkZERG9uZSkgfHwKKwkJICAgICEoZGVzYy0+c3RhdHVzICYgRnJhbWVTdGFydCkgfHwgIShkZXNjLT5zdGF0dXMgJiBGcmFtZUVuZCkpCisJCQlicmVhazsKKworCQkvKiBDaGlwIG9taXRzIHRoZSBDUkMuICovCisJCXBrdF9sZW4gPSBsZTY0X3RvX2NwdSAoZGVzYy0+c3RhdHVzICYgMHhmZmZmKTsKKwkJZnJhbWVfc3RhdHVzID0gbGU2NF90b19jcHUgKGRlc2MtPnN0YXR1cyk7CisJCWlmICgtLWNudCA8IDApCisJCQlicmVhazsKKwkJLyogVXBkYXRlIHJ4IGVycm9yIHN0YXRpc3RpY3MsIGRyb3AgcGFja2V0LiAqLworCQlpZiAoZnJhbWVfc3RhdHVzICYgUkZTX0Vycm9ycykgeworCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIChSeFJ1bnRGcmFtZSB8IFJ4TGVuZ3RoRXJyb3IpKQorCQkJCW5wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzICYgUnhGQ1NFcnJvcikKKwkJCQlucC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIFJ4QWxpZ25tZW50RXJyb3IgJiYgbnAtPnNwZWVkICE9IDEwMDApCisJCQkJbnAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIFJ4RklGT092ZXJydW4pCisJIAkJCW5wLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJLyogU21hbGwgc2tidWZmcyBmb3Igc2hvcnQgcGFja2V0cyAqLworCQkJaWYgKHBrdF9sZW4gPiBjb3B5X3RocmVzaCkgeworCQkJCXBjaV91bm1hcF9zaW5nbGUgKG5wLT5wZGV2LCBkZXNjLT5mcmFnaW5mbywKKwkJCQkJCSAgbnAtPnJ4X2J1Zl9zeiwKKwkJCQkJCSAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlza2JfcHV0IChza2IgPSBucC0+cnhfc2tidWZmW2VudHJ5XSwgcGt0X2xlbik7CisJCQkJbnAtPnJ4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJfSBlbHNlIGlmICgoc2tiID0gZGV2X2FsbG9jX3NrYiAocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7CisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KG5wLT5wZGV2LAorCQkJCQkJCSAgICBkZXNjLT5mcmFnaW5mbywKKwkJCQkJCQkgICAgbnAtPnJ4X2J1Zl9zeiwKKwkJCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KKwkJCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsKKwkJCQlldGhfY29weV9hbmRfc3VtIChza2IsCisJCQkJCQkgIG5wLT5yeF9za2J1ZmZbZW50cnldLT50YWlsLAorCQkJCQkJICBwa3RfbGVuLCAwKTsKKwkJCQlza2JfcHV0IChza2IsIHBrdF9sZW4pOworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShucC0+cGRldiwKKwkJCQkJCQkgICAgICAgZGVzYy0+ZnJhZ2luZm8sCisJCQkJCQkJICAgICAgIG5wLT5yeF9idWZfc3osCisJCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQl9CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMgKHNrYiwgZGV2KTsKKyNpZiAwCQkJCisJCQkvKiBDaGVja3N1bSBkb25lIGJ5IGh3LCBidXQgY3N1bSB2YWx1ZSB1bmF2YWlsYWJsZS4gKi8KKwkJCWlmIChucC0+cGNpX3Jldl9pZCA+PSAweDBjICYmIAorCQkJCSEoZnJhbWVfc3RhdHVzICYgKFRDUEVycm9yIHwgVURQRXJyb3IgfCBJUEVycm9yKSkpIHsKKwkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQkJfSAKKyNlbmRpZgorCQkJbmV0aWZfcnggKHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQl9CisJCWVudHJ5ID0gKGVudHJ5ICsgMSkgJSBSWF9SSU5HX1NJWkU7CisJfQorCXNwaW5fbG9jaygmbnAtPnJ4X2xvY2spOworCW5wLT5jdXJfcnggPSBlbnRyeTsKKwkvKiBSZS1hbGxvY2F0ZSBza2J1ZmZzIHRvIGZpbGwgdGhlIGRlc2NyaXB0b3IgcmluZyAqLworCWVudHJ5ID0gbnAtPm9sZF9yeDsKKwl3aGlsZSAoZW50cnkgIT0gbnAtPmN1cl9yeCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkvKiBEcm9wcGVkIHBhY2tldHMgZG9uJ3QgbmVlZCB0byByZS1hbGxvY2F0ZSAqLworCQlpZiAobnAtPnJ4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkgeworCQkJc2tiID0gZGV2X2FsbG9jX3NrYiAobnAtPnJ4X2J1Zl9zeik7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlucC0+cnhfcmluZ1tlbnRyeV0uZnJhZ2luZm8gPSAwOworCQkJCXByaW50ayAoS0VSTl9JTkZPCisJCQkJCSIlczogcmVjZWl2ZV9wYWNrZXQ6ICIKKwkJCQkJIlVuYWJsZSB0byByZS1hbGxvY2F0ZSBSeCBza2J1ZmYuIyVkXG4iLAorCQkJCQlkZXYtPm5hbWUsIGVudHJ5KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KKwkJCXNrYl9yZXNlcnZlIChza2IsIDIpOworCQkJbnAtPnJ4X3JpbmdbZW50cnldLmZyYWdpbmZvID0KKwkJCSAgICBjcHVfdG9fbGU2NCAocGNpX21hcF9zaW5nbGUKKwkJCQkJIChucC0+cGRldiwgc2tiLT50YWlsLCBucC0+cnhfYnVmX3N6LAorCQkJCQkgIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQl9CisJCW5wLT5yeF9yaW5nW2VudHJ5XS5mcmFnaW5mbyB8PQorCQkgICAgY3B1X3RvX2xlNjQgKG5wLT5yeF9idWZfc3opIDw8IDQ4OworCQlucC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gMDsKKwkJZW50cnkgPSAoZW50cnkgKyAxKSAlIFJYX1JJTkdfU0laRTsKKwl9CisJbnAtPm9sZF9yeCA9IGVudHJ5OworCXNwaW5fdW5sb2NrKCZucC0+cnhfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCityaW9fZXJyb3IgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbnRfc3RhdHVzKQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdTE2IG1hY2N0cmw7CisKKwkvKiBMaW5rIGNoYW5nZSBldmVudCAqLworCWlmIChpbnRfc3RhdHVzICYgTGlua0V2ZW50KSB7CisJCWlmIChtaWlfd2FpdF9saW5rIChkZXYsIDEwKSA9PSAwKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IExpbmsgdXBcbiIsIGRldi0+bmFtZSk7CisJCQlpZiAobnAtPnBoeV9tZWRpYSkKKwkJCQltaWlfZ2V0X21lZGlhX3BjcyAoZGV2KTsKKwkJCWVsc2UKKwkJCQltaWlfZ2V0X21lZGlhIChkZXYpOworCQkJaWYgKG5wLT5zcGVlZCA9PSAxMDAwKQorCQkJCW5wLT50eF9jb2FsZXNjZSA9IHR4X2NvYWxlc2NlOworCQkJZWxzZSAKKwkJCQlucC0+dHhfY29hbGVzY2UgPSAxOworCQkJbWFjY3RybCA9IDA7CisJCQltYWNjdHJsIHw9IChucC0+dmxhbikgPyBBdXRvVkxBTnVudGFnZ2luZyA6IDA7CisJCQltYWNjdHJsIHw9IChucC0+ZnVsbF9kdXBsZXgpID8gRHVwbGV4U2VsZWN0IDogMDsKKwkJCW1hY2N0cmwgfD0gKG5wLT50eF9mbG93KSA/IAorCQkJCVR4Rmxvd0NvbnRyb2xFbmFibGUgOiAwOworCQkJbWFjY3RybCB8PSAobnAtPnJ4X2Zsb3cpID8gCisJCQkJUnhGbG93Q29udHJvbEVuYWJsZSA6IDA7CisJCQl3cml0ZXcobWFjY3RybCwJaW9hZGRyICsgTUFDQ3RybCk7CisJCQlucC0+bGlua19zdGF0dXMgPSAxOworCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQl9IGVsc2UgeworCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBMaW5rIG9mZlxuIiwgZGV2LT5uYW1lKTsKKwkJCW5wLT5saW5rX3N0YXR1cyA9IDA7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQl9CisJfQorCisJLyogVXBkYXRlU3RhdHMgc3RhdGlzdGljcyByZWdpc3RlcnMgKi8KKwlpZiAoaW50X3N0YXR1cyAmIFVwZGF0ZVN0YXRzKSB7CisJCWdldF9zdGF0cyAoZGV2KTsKKwl9CisKKwkvKiBQQ0kgRXJyb3IsIGEgY2F0YXN0cm9ucGhpYyBlcnJvciByZWxhdGVkIHRvIHRoZSBidXMgaW50ZXJmYWNlIAorCSAgIG9jY3Vycywgc2V0IEdsb2JhbFJlc2V0IGFuZCBIb3N0UmVzZXQgdG8gcmVzZXQuICovCisJaWYgKGludF9zdGF0dXMgJiBIb3N0RXJyb3IpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IEhvc3RFcnJvciEgSW50U3RhdHVzICU0LjR4LlxuIiwKKwkJCWRldi0+bmFtZSwgaW50X3N0YXR1cyk7CisJCXdyaXRldyAoR2xvYmFsUmVzZXQgfCBIb3N0UmVzZXQsIGlvYWRkciArIEFTSUNDdHJsICsgMik7CisJCW1kZWxheSAoNTAwKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitnZXRfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyNpZmRlZiBNRU1fTUFQUElORworCWludCBpOworI2VuZGlmCisJdW5zaWduZWQgaW50IHN0YXRfcmVnOworCisJLyogQWxsIHN0YXRpc3RpY3MgcmVnaXN0ZXJzIG5lZWQgdG8gYmUgYWNrbm93bGVkZ2VkLAorCSAgIGVsc2Ugc3RhdGlzdGljIG92ZXJmbG93IGNvdWxkIGNhdXNlIHByb2JsZW1zICovCisJCisJbnAtPnN0YXRzLnJ4X3BhY2tldHMgKz0gcmVhZGwgKGlvYWRkciArIEZyYW1lc1Jjdk9rKTsKKwlucC0+c3RhdHMudHhfcGFja2V0cyArPSByZWFkbCAoaW9hZGRyICsgRnJhbWVzWG10T2spOworCW5wLT5zdGF0cy5yeF9ieXRlcyArPSByZWFkbCAoaW9hZGRyICsgT2N0ZXRSY3ZPayk7CisJbnAtPnN0YXRzLnR4X2J5dGVzICs9IHJlYWRsIChpb2FkZHIgKyBPY3RldFhtdE9rKTsKKworCW5wLT5zdGF0cy5tdWx0aWNhc3QgPSByZWFkbCAoaW9hZGRyICsgTWNzdEZyYW1lc1JjdmRPayk7CisJbnAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gcmVhZGwgKGlvYWRkciArIFNpbmdsZUNvbEZyYW1lcykgCisJCQkgICAgICsgIHJlYWRsIChpb2FkZHIgKyBNdWx0aUNvbEZyYW1lcyk7IAorCQorCS8qIGRldGFpbGVkIHR4IGVycm9ycyAqLworCXN0YXRfcmVnID0gcmVhZHcgKGlvYWRkciArIEZyYW1lc0Fib3J0WFNDb2xscyk7CisJbnAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IHN0YXRfcmVnOworCW5wLT5zdGF0cy50eF9lcnJvcnMgKz0gc3RhdF9yZWc7CisKKwlzdGF0X3JlZyA9IHJlYWR3IChpb2FkZHIgKyBDYXJyaWVyU2Vuc2VFcnJvcnMpOworCW5wLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyArPSBzdGF0X3JlZzsKKwlucC0+c3RhdHMudHhfZXJyb3JzICs9IHN0YXRfcmVnOworCisJLyogQ2xlYXIgYWxsIG90aGVyIHN0YXRpc3RpYyByZWdpc3Rlci4gKi8KKwlyZWFkbCAoaW9hZGRyICsgTWNzdE9jdGV0WG10T2spOworCXJlYWR3IChpb2FkZHIgKyBCY3N0RnJhbWVzWG10ZE9rKTsKKwlyZWFkbCAoaW9hZGRyICsgTWNzdEZyYW1lc1htdGRPayk7CisJcmVhZHcgKGlvYWRkciArIEJjc3RGcmFtZXNSY3ZkT2spOworCXJlYWR3IChpb2FkZHIgKyBNYWNDb250cm9sRnJhbWVzUmN2ZCk7CisJcmVhZHcgKGlvYWRkciArIEZyYW1lVG9vTG9uZ0Vycm9ycyk7CisJcmVhZHcgKGlvYWRkciArIEluUmFuZ2VMZW5ndGhFcnJvcnMpOworCXJlYWR3IChpb2FkZHIgKyBGcmFtZXNDaGVja1NlcUVycm9ycyk7CisJcmVhZHcgKGlvYWRkciArIEZyYW1lc0xvc3RSeEVycm9ycyk7CisJcmVhZGwgKGlvYWRkciArIE1jc3RPY3RldFhtdE9rKTsKKwlyZWFkbCAoaW9hZGRyICsgQmNzdE9jdGV0WG10T2spOworCXJlYWRsIChpb2FkZHIgKyBNY3N0RnJhbWVzWG10ZE9rKTsKKwlyZWFkbCAoaW9hZGRyICsgRnJhbWVzV0RlZmVycmVkWG10KTsKKwlyZWFkbCAoaW9hZGRyICsgTGF0ZUNvbGxpc2lvbnMpOworCXJlYWR3IChpb2FkZHIgKyBCY3N0RnJhbWVzWG10ZE9rKTsKKwlyZWFkdyAoaW9hZGRyICsgTWFjQ29udHJvbEZyYW1lc1htdGQpOworCXJlYWR3IChpb2FkZHIgKyBGcmFtZXNXRVhEZWZlcmFsKTsKKworI2lmZGVmIE1FTV9NQVBQSU5HCisJZm9yIChpID0gMHgxMDA7IGkgPD0gMHgxNTA7IGkgKz0gNCkKKwkJcmVhZGwgKGlvYWRkciArIGkpOworI2VuZGlmCisJcmVhZHcgKGlvYWRkciArIFR4SnVtYm9GcmFtZXMpOworCXJlYWR3IChpb2FkZHIgKyBSeEp1bWJvRnJhbWVzKTsKKwlyZWFkdyAoaW9hZGRyICsgVENQQ2hlY2tTdW1FcnJvcnMpOworCXJlYWR3IChpb2FkZHIgKyBVRFBDaGVja1N1bUVycm9ycyk7CisJcmVhZHcgKGlvYWRkciArIElQQ2hlY2tTdW1FcnJvcnMpOworCXJldHVybiAmbnAtPnN0YXRzOworfQorCitzdGF0aWMgaW50CitjbGVhcl9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworI2lmZGVmIE1FTV9NQVBQSU5HCisJaW50IGk7CisjZW5kaWYgCisKKwkvKiBBbGwgc3RhdGlzdGljcyByZWdpc3RlcnMgbmVlZCB0byBiZSBhY2tub3dsZWRnZWQsCisJICAgZWxzZSBzdGF0aXN0aWMgb3ZlcmZsb3cgY291bGQgY2F1c2UgcHJvYmxlbXMgKi8KKwlyZWFkbCAoaW9hZGRyICsgRnJhbWVzUmN2T2spOworCXJlYWRsIChpb2FkZHIgKyBGcmFtZXNYbXRPayk7CisJcmVhZGwgKGlvYWRkciArIE9jdGV0UmN2T2spOworCXJlYWRsIChpb2FkZHIgKyBPY3RldFhtdE9rKTsKKworCXJlYWRsIChpb2FkZHIgKyBNY3N0RnJhbWVzUmN2ZE9rKTsKKwlyZWFkbCAoaW9hZGRyICsgU2luZ2xlQ29sRnJhbWVzKTsKKwlyZWFkbCAoaW9hZGRyICsgTXVsdGlDb2xGcmFtZXMpOworCXJlYWRsIChpb2FkZHIgKyBMYXRlQ29sbGlzaW9ucyk7CisJLyogZGV0YWlsZWQgcnggZXJyb3JzICovCQkKKwlyZWFkdyAoaW9hZGRyICsgRnJhbWVUb29Mb25nRXJyb3JzKTsKKwlyZWFkdyAoaW9hZGRyICsgSW5SYW5nZUxlbmd0aEVycm9ycyk7CisJcmVhZHcgKGlvYWRkciArIEZyYW1lc0NoZWNrU2VxRXJyb3JzKTsKKwlyZWFkdyAoaW9hZGRyICsgRnJhbWVzTG9zdFJ4RXJyb3JzKTsKKworCS8qIGRldGFpbGVkIHR4IGVycm9ycyAqLworCXJlYWR3IChpb2FkZHIgKyBGcmFtZXNBYm9ydFhTQ29sbHMpOworCXJlYWR3IChpb2FkZHIgKyBDYXJyaWVyU2Vuc2VFcnJvcnMpOworCisJLyogQ2xlYXIgYWxsIG90aGVyIHN0YXRpc3RpYyByZWdpc3Rlci4gKi8KKwlyZWFkbCAoaW9hZGRyICsgTWNzdE9jdGV0WG10T2spOworCXJlYWR3IChpb2FkZHIgKyBCY3N0RnJhbWVzWG10ZE9rKTsKKwlyZWFkbCAoaW9hZGRyICsgTWNzdEZyYW1lc1htdGRPayk7CisJcmVhZHcgKGlvYWRkciArIEJjc3RGcmFtZXNSY3ZkT2spOworCXJlYWR3IChpb2FkZHIgKyBNYWNDb250cm9sRnJhbWVzUmN2ZCk7CisJcmVhZGwgKGlvYWRkciArIE1jc3RPY3RldFhtdE9rKTsKKwlyZWFkbCAoaW9hZGRyICsgQmNzdE9jdGV0WG10T2spOworCXJlYWRsIChpb2FkZHIgKyBNY3N0RnJhbWVzWG10ZE9rKTsKKwlyZWFkbCAoaW9hZGRyICsgRnJhbWVzV0RlZmVycmVkWG10KTsKKwlyZWFkdyAoaW9hZGRyICsgQmNzdEZyYW1lc1htdGRPayk7CisJcmVhZHcgKGlvYWRkciArIE1hY0NvbnRyb2xGcmFtZXNYbXRkKTsKKwlyZWFkdyAoaW9hZGRyICsgRnJhbWVzV0VYRGVmZXJhbCk7CisjaWZkZWYgTUVNX01BUFBJTkcKKwlmb3IgKGkgPSAweDEwMDsgaSA8PSAweDE1MDsgaSArPSA0KQorCQlyZWFkbCAoaW9hZGRyICsgaSk7CisjZW5kaWYgCisJcmVhZHcgKGlvYWRkciArIFR4SnVtYm9GcmFtZXMpOworCXJlYWR3IChpb2FkZHIgKyBSeEp1bWJvRnJhbWVzKTsKKwlyZWFkdyAoaW9hZGRyICsgVENQQ2hlY2tTdW1FcnJvcnMpOworCXJlYWR3IChpb2FkZHIgKyBVRFBDaGVja1N1bUVycm9ycyk7CisJcmVhZHcgKGlvYWRkciArIElQQ2hlY2tTdW1FcnJvcnMpOworCXJldHVybiAwOworfQorCisKK2ludAorY2hhbmdlX210dSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IG1heCA9IChucC0+anVtYm8pID8gTUFYX0pVTUJPIDogMTUzNjsKKworCWlmICgobmV3X210dSA8IDY4KSB8fCAobmV3X210dSA+IG1heCkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfbXVsdGljYXN0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTMyIGhhc2hfdGFibGVbMl07CisJdTE2IHJ4X21vZGUgPSAwOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCWhhc2hfdGFibGVbMF0gPSBoYXNoX3RhYmxlWzFdID0gMDsKKwkvKiBSeEZsb3djb250cm9sIERBOiAwMS04MC1DMi0wMC0wMC0wMS4gSGFzaCBpbmRleD0weDM5ICovCisJaGFzaF90YWJsZVsxXSB8PSBjcHVfdG9fbGUzMigweDAyMDAwMDAwKTsKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIFJlY2VpdmUgYWxsIGZyYW1lcyBwcm9taXNjdW91c2x5LiAqLworCQlyeF9tb2RlID0gUmVjZWl2ZUFsbEZyYW1lczsKKwl9IGVsc2UgaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCAKKwkJCShkZXYtPm1jX2NvdW50ID4gbXVsdGljYXN0X2ZpbHRlcl9saW1pdCkpIHsKKwkJLyogUmVjZWl2ZSBicm9hZGNhc3QgYW5kIG11bHRpY2FzdCBmcmFtZXMgKi8KKwkJcnhfbW9kZSA9IFJlY2VpdmVCcm9hZGNhc3QgfCBSZWNlaXZlTXVsdGljYXN0IHwgUmVjZWl2ZVVuaWNhc3Q7CisJfSBlbHNlIGlmIChkZXYtPm1jX2NvdW50ID4gMCkgeworCQlpbnQgaTsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCS8qIFJlY2VpdmUgYnJvYWRjYXN0IGZyYW1lcyBhbmQgbXVsdGljYXN0IGZyYW1lcyBmaWx0ZXJpbmcgCisJCSAgIGJ5IEhhc2h0YWJsZSAqLworCQlyeF9tb2RlID0KKwkJICAgIFJlY2VpdmVCcm9hZGNhc3QgfCBSZWNlaXZlTXVsdGljYXN0SGFzaCB8IFJlY2VpdmVVbmljYXN0OworCQlmb3IgKGk9MCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7IAorCQkJCWkrKywgbWNsaXN0PW1jbGlzdC0+bmV4dCkgCisJCXsKKwkJCWludCBiaXQsIGluZGV4ID0gMDsKKwkJCWludCBjcmMgPSBldGhlcl9jcmNfbGUgKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKTsKKwkJCS8qIFRoZSBpbnZlcnRlZCBoaWdoIHNpZ25pZmljYW50IDYgYml0cyBvZiBDUkMgYXJlCisJCQkgICB1c2VkIGFzIGFuIGluZGV4IHRvIGhhc2h0YWJsZSAqLworCQkJZm9yIChiaXQgPSAwOyBiaXQgPCA2OyBiaXQrKykKKwkJCQlpZiAoY3JjICYgKDEgPDwgKDMxIC0gYml0KSkpCisJCQkJCWluZGV4IHw9ICgxIDw8IGJpdCk7CisJCQloYXNoX3RhYmxlW2luZGV4IC8gMzJdIHw9ICgxIDw8IChpbmRleCAlIDMyKSk7CisJCX0KKwl9IGVsc2UgeworCQlyeF9tb2RlID0gUmVjZWl2ZUJyb2FkY2FzdCB8IFJlY2VpdmVVbmljYXN0OworCX0KKwlpZiAobnAtPnZsYW4pIHsKKwkJLyogUmVjZWl2ZVZMQU5NYXRjaCBmaWVsZCBpbiBSZWNlaXZlTW9kZSAqLworCQlyeF9tb2RlIHw9IFJlY2VpdmVWTEFOTWF0Y2g7CisJfQorCisJd3JpdGVsIChoYXNoX3RhYmxlWzBdLCBpb2FkZHIgKyBIYXNoVGFibGUwKTsKKwl3cml0ZWwgKGhhc2hfdGFibGVbMV0sIGlvYWRkciArIEhhc2hUYWJsZTEpOworCXdyaXRldyAocnhfbW9kZSwgaW9hZGRyICsgUmVjZWl2ZU1vZGUpOworfQorCitzdGF0aWMgdm9pZCByaW9fZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAiZGwyayIpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGRldikpOworfQkKKworc3RhdGljIGludCByaW9fZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWlmIChucC0+cGh5X21lZGlhKSB7CisJCS8qIGZpYmVyIGRldmljZSAqLworCQljbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX0ZJQlJFOworCQljbWQtPmFkdmVydGlzaW5nPSBBRFZFUlRJU0VEX0F1dG9uZWcgfCBBRFZFUlRJU0VEX0ZJQlJFOworCQljbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCQljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsJCisJfSBlbHNlIHsKKwkJLyogY29wcGVyIGRldmljZSAqLworCQljbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCAKKwkJCVNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfMTAwYmFzZVRfSGFsZgorCQkJfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQlTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9NSUk7CisJCWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CisJCQlBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8CisJCQlBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfCBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsfAorCQkJQURWRVJUSVNFRF9BdXRvbmVnIHwgQURWRVJUSVNFRF9NSUk7CisJCWNtZC0+cG9ydCA9IFBPUlRfTUlJOworCQljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKwl9CisJaWYgKCBucC0+bGlua19zdGF0dXMgKSB7IAorCQljbWQtPnNwZWVkID0gbnAtPnNwZWVkOworCQljbWQtPmR1cGxleCA9IG5wLT5mdWxsX2R1cGxleCA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJfSBlbHNlIHsKKwkJY21kLT5zcGVlZCA9IC0xOworCQljbWQtPmR1cGxleCA9IC0xOworCX0KKwlpZiAoIG5wLT5hbl9lbmFibGUpCisJCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCWVsc2UKKwkJY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCQorCWNtZC0+cGh5X2FkZHJlc3MgPSBucC0+cGh5X2FkZHI7CisJcmV0dXJuIDA7CQkJCSAgIAorfQorCitzdGF0aWMgaW50IHJpb19zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCWlmIChucC0+YW5fZW5hYmxlKQorCQkJcmV0dXJuIDA7CisJCWVsc2UgeworCQkJbnAtPmFuX2VuYWJsZSA9IDE7CisJCQltaWlfc2V0X21lZGlhKGRldik7CisJCQlyZXR1cm4gMDsJCisJCX0JCisJfSBlbHNlIHsKKwkJbnAtPmFuX2VuYWJsZSA9IDA7CisJCWlmIChucC0+c3BlZWQgPT0gMTAwMCkgeworCQkJY21kLT5zcGVlZCA9IFNQRUVEXzEwMDsJCQkKKwkJCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCQlwcmludGsoIldhcm5pbmchISBDYW4ndCBkaXNhYmxlIEF1dG8gbmVnb3RpYXRpb24gaW4gMTAwME1icHMsIGNoYW5nZSB0byBNYW51YWwgMTAwTWJwcywgRnVsbCBkdXBsZXguXG4iKTsKKwkJfQorCQlzd2l0Y2goY21kLT5zcGVlZCArIGNtZC0+ZHVwbGV4KSB7CisJCQorCQljYXNlIFNQRUVEXzEwICsgRFVQTEVYX0hBTEY6CisJCQlucC0+c3BlZWQgPSAxMDsKKwkJCW5wLT5mdWxsX2R1cGxleCA9IDA7CisJCQlicmVhazsKKwkJCisJCWNhc2UgU1BFRURfMTAgKyBEVVBMRVhfRlVMTDoKKwkJCW5wLT5zcGVlZCA9IDEwOworCQkJbnAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMCArIERVUExFWF9IQUxGOgorCQkJbnAtPnNwZWVkID0gMTAwOworCQkJbnAtPmZ1bGxfZHVwbGV4ID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMCArIERVUExFWF9GVUxMOgorCQkJbnAtPnNwZWVkID0gMTAwOworCQkJbnAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMDAgKyBEVVBMRVhfSEFMRjovKiBub3Qgc3VwcG9ydGVkICovCisJCWNhc2UgU1BFRURfMTAwMCArIERVUExFWF9GVUxMOi8qIG5vdCBzdXBwb3J0ZWQgKi8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOwkKKwkJfQorCQltaWlfc2V0X21lZGlhKGRldik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIHJpb19nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBucC0+bGlua19zdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvID0gcmlvX2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MgPSByaW9fZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSByaW9fc2V0X3NldHRpbmdzLAorCS5nZXRfbGluayA9IHJpb19nZXRfbGluaywKK307CisKK3N0YXRpYyBpbnQKK3Jpb19pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlpbnQgcGh5X2FkZHI7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1paV9kYXRhICptaWlkYXRhID0gKHN0cnVjdCBtaWlfZGF0YSAqKSAmcnEtPmlmcl9pZnJ1OworCQorCXN0cnVjdCBuZXRkZXZfZGVzYyAqZGVzYzsKKwlpbnQgaTsKKworCXBoeV9hZGRyID0gbnAtPnBoeV9hZGRyOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DREVWUFJJVkFURToKKwkJYnJlYWs7CisJCisJY2FzZSBTSU9DREVWUFJJVkFURSArIDE6CisJCW1paWRhdGEtPm91dF92YWx1ZSA9IG1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBtaWlkYXRhLT5yZWdfbnVtKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DREVWUFJJVkFURSArIDI6CisJCW1paV93cml0ZSAoZGV2LCBwaHlfYWRkciwgbWlpZGF0YS0+cmVnX251bSwgbWlpZGF0YS0+aW5fdmFsdWUpOworCQlicmVhazsKKwljYXNlIFNJT0NERVZQUklWQVRFICsgMzoKKwkJYnJlYWs7CisJY2FzZSBTSU9DREVWUFJJVkFURSArIDQ6CisJCWJyZWFrOworCWNhc2UgU0lPQ0RFVlBSSVZBVEUgKyA1OgorCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCQlicmVhazsKKwljYXNlIFNJT0NERVZQUklWQVRFICsgNjoKKwkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DREVWUFJJVkFURSArIDc6CisJCXByaW50aworCQkgICAgKCJ0eF9mdWxsPSV4IGN1cl90eD0lbHggb2xkX3R4PSVseCBjdXJfcng9JWx4IG9sZF9yeD0lbHhcbiIsCisJCSAgICAgbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpLCBucC0+Y3VyX3R4LCBucC0+b2xkX3R4LCBucC0+Y3VyX3J4LAorCQkgICAgIG5wLT5vbGRfcngpOworCQlicmVhazsKKwljYXNlIFNJT0NERVZQUklWQVRFICsgODoKKwkJcHJpbnRrKCJUWCByaW5nOlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQkJZGVzYyA9ICZucC0+dHhfcmluZ1tpXTsKKwkJCXByaW50aworCQkJICAgICgiJTAyeDpjdXI6JTA4eCBuZXh0OiUwOHggc3RhdHVzOiUwOHggZnJhZzE6JTA4eCBmcmFnMDolMDh4IiwKKwkJCSAgICAgaSwKKwkJCSAgICAgKHUzMikgKG5wLT50eF9yaW5nX2RtYSArIGkgKiBzaXplb2YgKCpkZXNjKSksCisJCQkgICAgICh1MzIpIGRlc2MtPm5leHRfZGVzYywKKwkJCSAgICAgKHUzMikgZGVzYy0+c3RhdHVzLCAodTMyKSAoZGVzYy0+ZnJhZ2luZm8gPj4gMzIpLAorCQkJICAgICAodTMyKSBkZXNjLT5mcmFnaW5mbyk7CisJCQlwcmludGsgKCJcbiIpOworCQl9CisJCXByaW50ayAoIlxuIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBFRVBfUkVBRCAweDAyMDAKKyNkZWZpbmUgRUVQX0JVU1kgMHg4MDAwCisvKiBSZWFkIHRoZSBFRVBST00gd29yZCAqLworLyogV2UgdXNlIEkvTyBpbnN0cnVjdGlvbiB0byByZWFkL3dyaXRlIGVlcHJvbSB0byBhdm9pZCBmYWlsIG9uIHNvbWUgbWFjaGluZXMgKi8KK2ludAorcmVhZF9lZXByb20gKGxvbmcgaW9hZGRyLCBpbnQgZWVwX2FkZHIpCit7CisJaW50IGkgPSAxMDAwOworCW91dHcgKEVFUF9SRUFEIHwgKGVlcF9hZGRyICYgMHhmZiksIGlvYWRkciArIEVlcHJvbUN0cmwpOworCXdoaWxlIChpLS0gPiAwKSB7CisJCWlmICghKGludyAoaW9hZGRyICsgRWVwcm9tQ3RybCkgJiBFRVBfQlVTWSkpIHsKKwkJCXJldHVybiBpbncgKGlvYWRkciArIEVlcHJvbURhdGEpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitlbnVtIHBoeV9jdHJsX2JpdHMgeworCU1JSV9SRUFEID0gMHgwMCwgTUlJX0NMSyA9IDB4MDEsIE1JSV9EQVRBMSA9IDB4MDIsIE1JSV9XUklURSA9IDB4MDQsCisJTUlJX0RVUExFWCA9IDB4MDgsCit9OworCisjZGVmaW5lIG1paV9kZWxheSgpIHJlYWRiKGlvYWRkcikKK3N0YXRpYyB2b2lkCittaWlfc2VuZGJpdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciArIFBoeUN0cmw7CisJZGF0YSA9IChkYXRhKSA/IE1JSV9EQVRBMSA6IDA7CisJZGF0YSB8PSBNSUlfV1JJVEU7CisJZGF0YSB8PSAocmVhZGIgKGlvYWRkcikgJiAweGY4KSB8IE1JSV9XUklURTsKKwl3cml0ZWIgKGRhdGEsIGlvYWRkcik7CisJbWlpX2RlbGF5ICgpOworCXdyaXRlYiAoZGF0YSB8IE1JSV9DTEssIGlvYWRkcik7CisJbWlpX2RlbGF5ICgpOworfQorCitzdGF0aWMgaW50CittaWlfZ2V0Yml0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgKyBQaHlDdHJsOworCXU4IGRhdGE7CisKKwlkYXRhID0gKHJlYWRiIChpb2FkZHIpICYgMHhmOCkgfCBNSUlfUkVBRDsKKwl3cml0ZWIgKGRhdGEsIGlvYWRkcik7CisJbWlpX2RlbGF5ICgpOworCXdyaXRlYiAoZGF0YSB8IE1JSV9DTEssIGlvYWRkcik7CisJbWlpX2RlbGF5ICgpOworCXJldHVybiAoKHJlYWRiIChpb2FkZHIpID4+IDEpICYgMSk7Cit9CisKK3N0YXRpYyB2b2lkCittaWlfc2VuZF9iaXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkgeworCQltaWlfc2VuZGJpdCAoZGV2LCBkYXRhICYgKDEgPDwgaSkpOworCX0KK30KKworc3RhdGljIGludAorbWlpX3JlYWQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkciwgaW50IHJlZ19udW0pCit7CisJdTMyIGNtZDsKKwlpbnQgaTsKKwl1MzIgcmV0dmFsID0gMDsKKworCS8qIFByZWFtYmxlICovCisJbWlpX3NlbmRfYml0cyAoZGV2LCAweGZmZmZmZmZmLCAzMik7CisJLyogU1QoMiksIE9QKDIpLCBBRERSKDUpLCBSRUcjKDUpLCBUQSgyKSwgRGF0YSgxNikgdG90YWwgMzIgYml0cyAqLworCS8qIFNULE9QID0gMDExMCdiIGZvciByZWFkIG9wZXJhdGlvbiAqLworCWNtZCA9ICgweDA2IDw8IDEwIHwgcGh5X2FkZHIgPDwgNSB8IHJlZ19udW0pOworCW1paV9zZW5kX2JpdHMgKGRldiwgY21kLCAxNCk7CisJLyogVHVybmFyb3VuZCAqLworCWlmIChtaWlfZ2V0Yml0IChkZXYpKQorCQlnb3RvIGVycl9vdXQ7CisJLyogUmVhZCBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJcmV0dmFsIHw9IG1paV9nZXRiaXQgKGRldik7CisJCXJldHZhbCA8PD0gMTsKKwl9CisJLyogRW5kIGN5Y2xlICovCisJbWlpX2dldGJpdCAoZGV2KTsKKwlyZXR1cm4gKHJldHZhbCA+PiAxKSAmIDB4ZmZmZjsKKworICAgICAgZXJyX291dDoKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQKK21paV93cml0ZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyLCBpbnQgcmVnX251bSwgdTE2IGRhdGEpCit7CisJdTMyIGNtZDsKKworCS8qIFByZWFtYmxlICovCisJbWlpX3NlbmRfYml0cyAoZGV2LCAweGZmZmZmZmZmLCAzMik7CisJLyogU1QoMiksIE9QKDIpLCBBRERSKDUpLCBSRUcjKDUpLCBUQSgyKSwgRGF0YSgxNikgdG90YWwgMzIgYml0cyAqLworCS8qIFNULE9QLEFBQUFBLFJSUlJSLFRBID0gMDEwMXh4eHh4eHh4eHgxMCdiID0gMHg1MDAyIGZvciB3cml0ZSAqLworCWNtZCA9ICgweDUwMDIgPDwgMTYpIHwgKHBoeV9hZGRyIDw8IDIzKSB8IChyZWdfbnVtIDw8IDE4KSB8IGRhdGE7CisJbWlpX3NlbmRfYml0cyAoZGV2LCBjbWQsIDMyKTsKKwkvKiBFbmQgY3ljbGUgKi8KKwltaWlfZ2V0Yml0IChkZXYpOworCXJldHVybiAwOworfQorc3RhdGljIGludAorbWlpX3dhaXRfbGluayAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHdhaXQpCit7CisJQk1TUl90IGJtc3I7CisJaW50IHBoeV9hZGRyOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnA7CisKKwlucCA9IG5ldGRldl9wcml2KGRldik7CisJcGh5X2FkZHIgPSBucC0+cGh5X2FkZHI7CisKKwlkbyB7CisJCWJtc3IuaW1hZ2UgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgTUlJX0JNU1IpOworCQlpZiAoYm1zci5iaXRzLmxpbmtfc3RhdHVzKQorCQkJcmV0dXJuIDA7CisJCW1kZWxheSAoMSk7CisJfSB3aGlsZSAoLS13YWl0ID4gMCk7CisJcmV0dXJuIC0xOworfQorc3RhdGljIGludAorbWlpX2dldF9tZWRpYSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlBTkFSX3QgbmVnb3RpYXRlOworCUJNU1JfdCBibXNyOworCUJNQ1JfdCBibWNyOworCU1TQ1JfdCBtc2NyOworCU1TU1JfdCBtc3NyOworCWludCBwaHlfYWRkcjsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wOworCisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXBoeV9hZGRyID0gbnAtPnBoeV9hZGRyOworCisJYm1zci5pbWFnZSA9IG1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBNSUlfQk1TUik7CisJaWYgKG5wLT5hbl9lbmFibGUpIHsKKwkJaWYgKCFibXNyLmJpdHMuYW5fY29tcGxldGUpIHsKKwkJCS8qIEF1dG8tTmVnb3RpYXRpb24gbm90IGNvbXBsZXRlZCAqLworCQkJcmV0dXJuIC0xOworCQl9CisJCW5lZ290aWF0ZS5pbWFnZSA9IG1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBNSUlfQU5BUikgJiAKKwkJCW1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBNSUlfQU5MUEFSKTsKKwkJbXNjci5pbWFnZSA9IG1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBNSUlfTVNDUik7CisJCW1zc3IuaW1hZ2UgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgTUlJX01TU1IpOworCQlpZiAobXNjci5iaXRzLm1lZGlhXzEwMDBCVF9GRCAmIG1zc3IuYml0cy5scF8xMDAwQlRfRkQpIHsKKwkJCW5wLT5zcGVlZCA9IDEwMDA7CisJCQlucC0+ZnVsbF9kdXBsZXggPSAxOworCQkJcHJpbnRrIChLRVJOX0lORk8gIkF1dG8gMTAwMCBNYnBzLCBGdWxsIGR1cGxleFxuIik7CisJCX0gZWxzZSBpZiAobXNjci5iaXRzLm1lZGlhXzEwMDBCVF9IRCAmIG1zc3IuYml0cy5scF8xMDAwQlRfSEQpIHsKKwkJCW5wLT5zcGVlZCA9IDEwMDA7CisJCQlucC0+ZnVsbF9kdXBsZXggPSAwOworCQkJcHJpbnRrIChLRVJOX0lORk8gIkF1dG8gMTAwMCBNYnBzLCBIYWxmIGR1cGxleFxuIik7CisJCX0gZWxzZSBpZiAobmVnb3RpYXRlLmJpdHMubWVkaWFfMTAwQlhfRkQpIHsKKwkJCW5wLT5zcGVlZCA9IDEwMDsKKwkJCW5wLT5mdWxsX2R1cGxleCA9IDE7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiQXV0byAxMDAgTWJwcywgRnVsbCBkdXBsZXhcbiIpOworCQl9IGVsc2UgaWYgKG5lZ290aWF0ZS5iaXRzLm1lZGlhXzEwMEJYX0hEKSB7CisJCQlucC0+c3BlZWQgPSAxMDA7CisJCQlucC0+ZnVsbF9kdXBsZXggPSAwOworCQkJcHJpbnRrIChLRVJOX0lORk8gIkF1dG8gMTAwIE1icHMsIEhhbGYgZHVwbGV4XG4iKTsKKwkJfSBlbHNlIGlmIChuZWdvdGlhdGUuYml0cy5tZWRpYV8xMEJUX0ZEKSB7CisJCQlucC0+c3BlZWQgPSAxMDsKKwkJCW5wLT5mdWxsX2R1cGxleCA9IDE7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiQXV0byAxMCBNYnBzLCBGdWxsIGR1cGxleFxuIik7CisJCX0gZWxzZSBpZiAobmVnb3RpYXRlLmJpdHMubWVkaWFfMTBCVF9IRCkgeworCQkJbnAtPnNwZWVkID0gMTA7CisJCQlucC0+ZnVsbF9kdXBsZXggPSAwOworCQkJcHJpbnRrIChLRVJOX0lORk8gIkF1dG8gMTAgTWJwcywgSGFsZiBkdXBsZXhcbiIpOworCQl9CisJCWlmIChuZWdvdGlhdGUuYml0cy5wYXVzZSkgeworCQkJbnAtPnR4X2Zsb3cgJj0gMTsKKwkJCW5wLT5yeF9mbG93ICY9IDE7CisJCX0gZWxzZSBpZiAobmVnb3RpYXRlLmJpdHMuYXN5bW1ldHJpYykgeworCQkJbnAtPnR4X2Zsb3cgPSAwOworCQkJbnAtPnJ4X2Zsb3cgJj0gMTsKKwkJfQorCQkvKiBlbHNlIHR4X2Zsb3csIHJ4X2Zsb3cgPSB1c2VyIHNlbGVjdCAgKi8KKwl9IGVsc2UgeworCQlibWNyLmltYWdlID0gbWlpX3JlYWQgKGRldiwgcGh5X2FkZHIsIE1JSV9CTUNSKTsKKwkJaWYgKGJtY3IuYml0cy5zcGVlZDEwMCA9PSAxICYmIGJtY3IuYml0cy5zcGVlZDEwMDAgPT0gMCkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gIk9wZXJhdGluZyBhdCAxMDAgTWJwcywgIik7CisJCX0gZWxzZSBpZiAoYm1jci5iaXRzLnNwZWVkMTAwID09IDAgJiYgYm1jci5iaXRzLnNwZWVkMTAwMCA9PSAwKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiT3BlcmF0aW5nIGF0IDEwIE1icHMsICIpOworCQl9IGVsc2UgaWYgKGJtY3IuYml0cy5zcGVlZDEwMCA9PSAwICYmIGJtY3IuYml0cy5zcGVlZDEwMDAgPT0gMSkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gIk9wZXJhdGluZyBhdCAxMDAwIE1icHMsICIpOworCQl9CisJCWlmIChibWNyLmJpdHMuZHVwbGV4X21vZGUpIHsKKwkJCXByaW50ayAoIkZ1bGwgZHVwbGV4XG4iKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayAoIkhhbGYgZHVwbGV4XG4iKTsKKwkJfQorCX0KKwlpZiAobnAtPnR4X2Zsb3cpIAorCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGUgVHggRmxvdyBDb250cm9sXG4iKTsKKwllbHNlCQorCQlwcmludGsoS0VSTl9JTkZPICJEaXNhYmxlIFR4IEZsb3cgQ29udHJvbFxuIik7CisJaWYgKG5wLT5yeF9mbG93KQorCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGUgUnggRmxvdyBDb250cm9sXG4iKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIkRpc2FibGUgUnggRmxvdyBDb250cm9sXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittaWlfc2V0X21lZGlhIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVBIWV9TQ1JfdCBwc2NyOworCUJNQ1JfdCBibWNyOworCUJNU1JfdCBibXNyOworCUFOQVJfdCBhbmFyOworCWludCBwaHlfYWRkcjsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wOworCW5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwaHlfYWRkciA9IG5wLT5waHlfYWRkcjsKKworCS8qIERvZXMgdXNlciBzZXQgc3BlZWQ/ICovCisJaWYgKG5wLT5hbl9lbmFibGUpIHsKKwkJLyogQWR2ZXJ0aXNlIGNhcGFiaWxpdGllcyAqLworCQlibXNyLmltYWdlID0gbWlpX3JlYWQgKGRldiwgcGh5X2FkZHIsIE1JSV9CTVNSKTsKKwkJYW5hci5pbWFnZSA9IG1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBNSUlfQU5BUik7CisJCWFuYXIuYml0cy5tZWRpYV8xMDBCWF9GRCA9IGJtc3IuYml0cy5tZWRpYV8xMDBCWF9GRDsKKwkJYW5hci5iaXRzLm1lZGlhXzEwMEJYX0hEID0gYm1zci5iaXRzLm1lZGlhXzEwMEJYX0hEOworCQlhbmFyLmJpdHMubWVkaWFfMTAwQlQ0ID0gYm1zci5iaXRzLm1lZGlhXzEwMEJUNDsKKwkJYW5hci5iaXRzLm1lZGlhXzEwQlRfRkQgPSBibXNyLmJpdHMubWVkaWFfMTBCVF9GRDsKKwkJYW5hci5iaXRzLm1lZGlhXzEwQlRfSEQgPSBibXNyLmJpdHMubWVkaWFfMTBCVF9IRDsKKwkJYW5hci5iaXRzLnBhdXNlID0gMTsKKwkJYW5hci5iaXRzLmFzeW1tZXRyaWMgPSAxOworCQltaWlfd3JpdGUgKGRldiwgcGh5X2FkZHIsIE1JSV9BTkFSLCBhbmFyLmltYWdlKTsKKworCQkvKiBFbmFibGUgQXV0byBjcm9zc292ZXIgKi8KKwkJcHNjci5pbWFnZSA9IG1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBNSUlfUEhZX1NDUik7CisJCXBzY3IuYml0cy5tZGlfY3Jvc3NvdmVyX21vZGUgPSAzOwkvKiAxMSdiICovCisJCW1paV93cml0ZSAoZGV2LCBwaHlfYWRkciwgTUlJX1BIWV9TQ1IsIHBzY3IuaW1hZ2UpOworCQkKKwkJLyogU29mdCByZXNldCBQSFkgKi8KKwkJbWlpX3dyaXRlIChkZXYsIHBoeV9hZGRyLCBNSUlfQk1DUiwgTUlJX0JNQ1JfUkVTRVQpOworCQlibWNyLmltYWdlID0gMDsKKwkJYm1jci5iaXRzLmFuX2VuYWJsZSA9IDE7CisJCWJtY3IuYml0cy5yZXN0YXJ0X2FuID0gMTsKKwkJYm1jci5iaXRzLnJlc2V0ID0gMTsKKwkJbWlpX3dyaXRlIChkZXYsIHBoeV9hZGRyLCBNSUlfQk1DUiwgYm1jci5pbWFnZSk7CisJCW1kZWxheSgxKTsKKwl9IGVsc2UgeworCQkvKiBGb3JjZSBzcGVlZCBzZXR0aW5nICovCisJCS8qIDEpIERpc2FibGUgQXV0byBjcm9zc292ZXIgKi8KKwkJcHNjci5pbWFnZSA9IG1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBNSUlfUEhZX1NDUik7CisJCXBzY3IuYml0cy5tZGlfY3Jvc3NvdmVyX21vZGUgPSAwOworCQltaWlfd3JpdGUgKGRldiwgcGh5X2FkZHIsIE1JSV9QSFlfU0NSLCBwc2NyLmltYWdlKTsKKworCQkvKiAyKSBQSFkgUmVzZXQgKi8KKwkJYm1jci5pbWFnZSA9IG1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBNSUlfQk1DUik7CisJCWJtY3IuYml0cy5yZXNldCA9IDE7CisJCW1paV93cml0ZSAoZGV2LCBwaHlfYWRkciwgTUlJX0JNQ1IsIGJtY3IuaW1hZ2UpOworCisJCS8qIDMpIFBvd2VyIERvd24gKi8KKwkJYm1jci5pbWFnZSA9IDB4MTk0MDsJLyogbXVzdCBiZSAweDE5NDAgKi8KKwkJbWlpX3dyaXRlIChkZXYsIHBoeV9hZGRyLCBNSUlfQk1DUiwgYm1jci5pbWFnZSk7CisJCW1kZWxheSAoMTAwKTsJLyogd2FpdCBhIGNlcnRhaW4gdGltZSAqLworCisJCS8qIDQpIEFkdmVydGlzZSBub3RoaW5nICovCisJCW1paV93cml0ZSAoZGV2LCBwaHlfYWRkciwgTUlJX0FOQVIsIDApOworCisJCS8qIDUpIFNldCBtZWRpYSBhbmQgUG93ZXIgVXAgKi8KKwkJYm1jci5pbWFnZSA9IDA7CisJCWJtY3IuYml0cy5wb3dlcl9kb3duID0gMTsKKwkJaWYgKG5wLT5zcGVlZCA9PSAxMDApIHsKKwkJCWJtY3IuYml0cy5zcGVlZDEwMCA9IDE7CisJCQlibWNyLmJpdHMuc3BlZWQxMDAwID0gMDsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJNYW51YWwgMTAwIE1icHMsICIpOworCQl9IGVsc2UgaWYgKG5wLT5zcGVlZCA9PSAxMCkgeworCQkJYm1jci5iaXRzLnNwZWVkMTAwID0gMDsKKwkJCWJtY3IuYml0cy5zcGVlZDEwMDAgPSAwOworCQkJcHJpbnRrIChLRVJOX0lORk8gIk1hbnVhbCAxMCBNYnBzLCAiKTsKKwkJfQorCQlpZiAobnAtPmZ1bGxfZHVwbGV4KSB7CisJCQlibWNyLmJpdHMuZHVwbGV4X21vZGUgPSAxOworCQkJcHJpbnRrICgiRnVsbCBkdXBsZXhcbiIpOworCQl9IGVsc2UgeworCQkJYm1jci5iaXRzLmR1cGxleF9tb2RlID0gMDsKKwkJCXByaW50ayAoIkhhbGYgZHVwbGV4XG4iKTsKKwkJfQorI2lmIDAKKwkJLyogU2V0IDEwMDBCYXNlVCBNYXN0ZXIvU2xhdmUgc2V0dGluZyAqLworCQltc2NyLmltYWdlID0gbWlpX3JlYWQgKGRldiwgcGh5X2FkZHIsIE1JSV9NU0NSKTsKKwkJbXNjci5iaXRzLmNmZ19lbmFibGUgPSAxOworCQltc2NyLmJpdHMuY2ZnX3ZhbHVlID0gMDsKKyNlbmRpZgorCQltaWlfd3JpdGUgKGRldiwgcGh5X2FkZHIsIE1JSV9CTUNSLCBibWNyLmltYWdlKTsKKwkJbWRlbGF5KDEwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21paV9nZXRfbWVkaWFfcGNzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCUFOQVJfUENTX3QgbmVnb3RpYXRlOworCUJNU1JfdCBibXNyOworCUJNQ1JfdCBibWNyOworCWludCBwaHlfYWRkcjsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wOworCisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXBoeV9hZGRyID0gbnAtPnBoeV9hZGRyOworCisJYm1zci5pbWFnZSA9IG1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBQQ1NfQk1TUik7CisJaWYgKG5wLT5hbl9lbmFibGUpIHsKKwkJaWYgKCFibXNyLmJpdHMuYW5fY29tcGxldGUpIHsKKwkJCS8qIEF1dG8tTmVnb3RpYXRpb24gbm90IGNvbXBsZXRlZCAqLworCQkJcmV0dXJuIC0xOworCQl9CisJCW5lZ290aWF0ZS5pbWFnZSA9IG1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBQQ1NfQU5BUikgJiAKKwkJCW1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBQQ1NfQU5MUEFSKTsKKwkJbnAtPnNwZWVkID0gMTAwMDsKKwkJaWYgKG5lZ290aWF0ZS5iaXRzLmZ1bGxfZHVwbGV4KSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiQXV0byAxMDAwIE1icHMsIEZ1bGwgZHVwbGV4XG4iKTsKKwkJCW5wLT5mdWxsX2R1cGxleCA9IDE7CisJCX0gZWxzZSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiQXV0byAxMDAwIE1icHMsIGhhbGYgZHVwbGV4XG4iKTsKKwkJCW5wLT5mdWxsX2R1cGxleCA9IDA7CisJCX0KKwkJaWYgKG5lZ290aWF0ZS5iaXRzLnBhdXNlKSB7CisJCQlucC0+dHhfZmxvdyAmPSAxOworCQkJbnAtPnJ4X2Zsb3cgJj0gMTsKKwkJfSBlbHNlIGlmIChuZWdvdGlhdGUuYml0cy5hc3ltbWV0cmljKSB7CisJCQlucC0+dHhfZmxvdyA9IDA7CisJCQlucC0+cnhfZmxvdyAmPSAxOworCQl9CisJCS8qIGVsc2UgdHhfZmxvdywgcnhfZmxvdyA9IHVzZXIgc2VsZWN0ICAqLworCX0gZWxzZSB7CisJCWJtY3IuaW1hZ2UgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgUENTX0JNQ1IpOworCQlwcmludGsgKEtFUk5fSU5GTyAiT3BlcmF0aW5nIGF0IDEwMDAgTWJwcywgIik7CisJCWlmIChibWNyLmJpdHMuZHVwbGV4X21vZGUpIHsKKwkJCXByaW50ayAoIkZ1bGwgZHVwbGV4XG4iKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayAoIkhhbGYgZHVwbGV4XG4iKTsKKwkJfQorCX0KKwlpZiAobnAtPnR4X2Zsb3cpIAorCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGUgVHggRmxvdyBDb250cm9sXG4iKTsKKwllbHNlCQorCQlwcmludGsoS0VSTl9JTkZPICJEaXNhYmxlIFR4IEZsb3cgQ29udHJvbFxuIik7CisJaWYgKG5wLT5yeF9mbG93KQorCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGUgUnggRmxvdyBDb250cm9sXG4iKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIkRpc2FibGUgUnggRmxvdyBDb250cm9sXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittaWlfc2V0X21lZGlhX3BjcyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlCTUNSX3QgYm1jcjsKKwlFU1JfdCBlc3I7CisJQU5BUl9QQ1NfdCBhbmFyOworCWludCBwaHlfYWRkcjsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wOworCW5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwaHlfYWRkciA9IG5wLT5waHlfYWRkcjsKKworCS8qIEF1dG8tTmVnb3RpYXRpb24/ICovCisJaWYgKG5wLT5hbl9lbmFibGUpIHsKKwkJLyogQWR2ZXJ0aXNlIGNhcGFiaWxpdGllcyAqLworCQllc3IuaW1hZ2UgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgUENTX0VTUik7CisJCWFuYXIuaW1hZ2UgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgTUlJX0FOQVIpOworCQlhbmFyLmJpdHMuaGFsZl9kdXBsZXggPSAKKwkJCWVzci5iaXRzLm1lZGlhXzEwMDBCVF9IRCB8IGVzci5iaXRzLm1lZGlhXzEwMDBCWF9IRDsKKwkJYW5hci5iaXRzLmZ1bGxfZHVwbGV4ID0gCisJCQllc3IuYml0cy5tZWRpYV8xMDAwQlRfRkQgfCBlc3IuYml0cy5tZWRpYV8xMDAwQlhfRkQ7CisJCWFuYXIuYml0cy5wYXVzZSA9IDE7CisJCWFuYXIuYml0cy5hc3ltbWV0cmljID0gMTsKKwkJbWlpX3dyaXRlIChkZXYsIHBoeV9hZGRyLCBNSUlfQU5BUiwgYW5hci5pbWFnZSk7CisKKwkJLyogU29mdCByZXNldCBQSFkgKi8KKwkJbWlpX3dyaXRlIChkZXYsIHBoeV9hZGRyLCBNSUlfQk1DUiwgTUlJX0JNQ1JfUkVTRVQpOworCQlibWNyLmltYWdlID0gMDsKKwkJYm1jci5iaXRzLmFuX2VuYWJsZSA9IDE7CisJCWJtY3IuYml0cy5yZXN0YXJ0X2FuID0gMTsKKwkJYm1jci5iaXRzLnJlc2V0ID0gMTsKKwkJbWlpX3dyaXRlIChkZXYsIHBoeV9hZGRyLCBNSUlfQk1DUiwgYm1jci5pbWFnZSk7CisJCW1kZWxheSgxKTsKKwl9IGVsc2UgeworCQkvKiBGb3JjZSBzcGVlZCBzZXR0aW5nICovCisJCS8qIFBIWSBSZXNldCAqLworCQlibWNyLmltYWdlID0gMDsKKwkJYm1jci5iaXRzLnJlc2V0ID0gMTsKKwkJbWlpX3dyaXRlIChkZXYsIHBoeV9hZGRyLCBNSUlfQk1DUiwgYm1jci5pbWFnZSk7CisJCW1kZWxheSgxMCk7CisJCWJtY3IuaW1hZ2UgPSAwOworCQlibWNyLmJpdHMuYW5fZW5hYmxlID0gMDsKKwkJaWYgKG5wLT5mdWxsX2R1cGxleCkgeworCQkJYm1jci5iaXRzLmR1cGxleF9tb2RlID0gMTsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJNYW51YWwgZnVsbCBkdXBsZXhcbiIpOworCQl9IGVsc2UgeworCQkJYm1jci5iaXRzLmR1cGxleF9tb2RlID0gMDsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJNYW51YWwgaGFsZiBkdXBsZXhcbiIpOworCQl9CisJCW1paV93cml0ZSAoZGV2LCBwaHlfYWRkciwgTUlJX0JNQ1IsIGJtY3IuaW1hZ2UpOworCQltZGVsYXkoMTApOworCisJCS8qICBBZHZlcnRpc2Ugbm90aGluZyAqLworCQltaWlfd3JpdGUgKGRldiwgcGh5X2FkZHIsIE1JSV9BTkFSLCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorcmlvX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaTsKKworCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwl3cml0ZXcgKDAsIGlvYWRkciArIEludEVuYWJsZSk7CisKKwkvKiBTdG9wIFR4IGFuZCBSeCBsb2dpY3MgKi8KKwl3cml0ZWwgKFR4RGlzYWJsZSB8IFJ4RGlzYWJsZSB8IFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgTUFDQ3RybCk7CisJc3luY2hyb25pemVfaXJxIChkZXYtPmlycSk7CisJZnJlZV9pcnEgKGRldi0+aXJxLCBkZXYpOworCWRlbF90aW1lcl9zeW5jICgmbnAtPnRpbWVyKTsKKwkKKwkvKiBGcmVlIGFsbCB0aGUgc2tidWZmcyBpbiB0aGUgcXVldWUuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCW5wLT5yeF9yaW5nW2ldLmZyYWdpbmZvID0gMDsKKwkJc2tiID0gbnAtPnJ4X3NrYnVmZltpXTsKKwkJaWYgKHNrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZSAobnAtPnBkZXYsIG5wLT5yeF9yaW5nW2ldLmZyYWdpbmZvLAorCQkJCQkgIHNrYi0+bGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKwkJCW5wLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlza2IgPSBucC0+dHhfc2tidWZmW2ldOworCQlpZiAoc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlIChucC0+cGRldiwgbnAtPnR4X3JpbmdbaV0uZnJhZ2luZm8sCisJCQkJCSAgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKwkJCW5wLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorcmlvX3JlbW92ZTEgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCisJaWYgKGRldikgeworCQlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQl1bnJlZ2lzdGVyX25ldGRldiAoZGV2KTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCAocGRldiwgUlhfVE9UQUxfU0laRSwgbnAtPnJ4X3JpbmcsCisJCQkJICAgICBucC0+cnhfcmluZ19kbWEpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50IChwZGV2LCBUWF9UT1RBTF9TSVpFLCBucC0+dHhfcmluZywKKwkJCQkgICAgIG5wLT50eF9yaW5nX2RtYSk7CisjaWZkZWYgTUVNX01BUFBJTkcKKwkJaW91bm1hcCAoKGNoYXIgKikgKGRldi0+YmFzZV9hZGRyKSk7CisjZW5kaWYKKwkJZnJlZV9uZXRkZXYgKGRldik7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMgKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UgKHBkZXYpOworCX0KKwlwY2lfc2V0X2RydmRhdGEgKHBkZXYsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcmlvX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZGwyayIsCisJLmlkX3RhYmxlCT0gcmlvX3BjaV90YmwsCisJLnByb2JlCQk9IHJpb19wcm9iZTEsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChyaW9fcmVtb3ZlMSksCit9OworCitzdGF0aWMgaW50IF9faW5pdAorcmlvX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCAoJnJpb19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3Jpb19leGl0ICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJnJpb19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCAocmlvX2luaXQpOworbW9kdWxlX2V4aXQgKHJpb19leGl0KTsKKworLyoKKyAKK0NvbXBpbGUgY29tbWFuZDogCisgCitnY2MgLURfX0tFUk5FTF9fIC1ETU9EVUxFIC1JL3Vzci9zcmMvbGludXgvaW5jbHVkZSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMiAtYyBkbDJrLmMKKworUmVhZCBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGwyay50eHQgZm9yIGRldGFpbHMuCisKKyovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RsMmsuaCBiL2RyaXZlcnMvbmV0L2RsMmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTc1NDgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZGwyay5oCkBAIC0wLDAgKzEsNzExIEBACisvKiAgRC1MaW5rIERMMjAwMC1iYXNlZCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIgTGludXggZHJpdmVyICovCisvKiAgCisgICAgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyIGJ5IEQtTGluayBDb3Jwb3JhdGlvbgorICAgIFdyaXR0ZW4gYnkgRWR3YXJkIFBlbmcuPGVkd2FyZF9wZW5nQGRsaW5rLmNvbS50dz4KKyAgICBDcmVhdGVkIDAzLU1heS0yMDAxLCBiYXNlIG9uIExpbnV4JyBzdW5kYW5jZS5jLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyovCisKKyNpZm5kZWYgX19ETDJLX0hfXworI2RlZmluZSBfX0RMMktfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjZGVmaW5lIFRYX1JJTkdfU0laRQkyNTYKKyNkZWZpbmUgVFhfUVVFVUVfTEVOCShUWF9SSU5HX1NJWkUgLSAxKSAvKiBMaW1pdCByaW5nIGVudHJpZXMgYWN0dWFsbHkgdXNlZC4qLworI2RlZmluZSBSWF9SSU5HX1NJWkUgCTI1NgorI2RlZmluZSBUWF9UT1RBTF9TSVpFCVRYX1JJTkdfU0laRSpzaXplb2Yoc3RydWN0IG5ldGRldl9kZXNjKQorI2RlZmluZSBSWF9UT1RBTF9TSVpFCVJYX1JJTkdfU0laRSpzaXplb2Yoc3RydWN0IG5ldGRldl9kZXNjKQorCisvKiBUaGlzIGRyaXZlciB3YXMgd3JpdHRlbiB0byB1c2UgUENJIG1lbW9yeSBzcGFjZSwgaG93ZXZlciB4ODYtb3JpZW50ZWQKKyAgIGhhcmR3YXJlIG9mdGVuIHVzZXMgSS9PIHNwYWNlIGFjY2Vzc2VzLiAqLworI2lmbmRlZiBNRU1fTUFQUElORworI3VuZGVmIHJlYWRiCisjdW5kZWYgcmVhZHcKKyN1bmRlZiByZWFkbAorI3VuZGVmIHdyaXRlYgorI3VuZGVmIHdyaXRldworI3VuZGVmIHdyaXRlbAorI2RlZmluZSByZWFkYiBpbmIKKyNkZWZpbmUgcmVhZHcgaW53CisjZGVmaW5lIHJlYWRsIGlubAorI2RlZmluZSB3cml0ZWIgb3V0YgorI2RlZmluZSB3cml0ZXcgb3V0dworI2RlZmluZSB3cml0ZWwgb3V0bAorI2VuZGlmCisKKy8qIE9mZnNldHMgdG8gdGhlIGRldmljZSByZWdpc3RlcnMuCisgICBVbmxpa2Ugc29mdHdhcmUtb25seSBzeXN0ZW1zLCBkZXZpY2UgZHJpdmVycyBpbnRlcmFjdCB3aXRoIGNvbXBsZXggaGFyZHdhcmUuCisgICBJdCdzIG5vdCB1c2VmdWwgdG8gZGVmaW5lIHN5bWJvbGljIG5hbWVzIGZvciBldmVyeSByZWdpc3RlciBiaXQgaW4gdGhlCisgICBkZXZpY2UuICBUaGUgbmFtZSBjYW4gb25seSBwYXJ0aWFsbHkgZG9jdW1lbnQgdGhlIHNlbWFudGljcyBhbmQgbWFrZQorICAgdGhlIGRyaXZlciBsb25nZXIgYW5kIG1vcmUgZGlmZmljdWx0IHRvIHJlYWQuCisgICBJbiBnZW5lcmFsLCBvbmx5IHRoZSBpbXBvcnRhbnQgY29uZmlndXJhdGlvbiB2YWx1ZXMgb3IgYml0cyBjaGFuZ2VkCisgICBtdWx0aXBsZSB0aW1lcyBzaG91bGQgYmUgZGVmaW5lZCBzeW1ib2xpY2FsbHkuCisqLworZW51bSBkbDJ4X29mZnNldHMgeworCS8qIEkvTyByZWdpc3RlciBvZmZzZXRzICovCisJRE1BQ3RybCA9IDB4MDAsCisJUnhETUFTdGF0dXMgPSAweDA4LAorCVRGRExpc3RQdHIwID0gMHgxMCwKKwlURkRMaXN0UHRyMSA9IDB4MTQsCisJVHhETUFCdXJzdFRocmVzaCA9IDB4MTgsCisJVHhETUFVcmdlbnRUaHJlc2ggPSAweDE5LAorCVR4RE1BUG9sbFBlcmlvZCA9IDB4MWEsCisJUkZETGlzdFB0cjAgPSAweDFjLAorCVJGRExpc3RQdHIxID0gMHgyMCwKKwlSeERNQUJ1cnN0VGhyZXNoID0gMHgyNCwKKwlSeERNQVVyZ2VudFRocmVzaCA9IDB4MjUsCisJUnhETUFQb2xsUGVyaW9kID0gMHgyNiwKKwlSeERNQUludEN0cmwgPSAweDI4LAorCURlYnVnQ3RybCA9IDB4MmMsCisJQVNJQ0N0cmwgPSAweDMwLAorCUZpZm9DdHJsID0gMHgzOCwKKwlSeEVhcmx5VGhyZXNoID0gMHgzYSwKKwlGbG93T2ZmVGhyZXNoID0gMHgzYywKKwlGbG93T25UaHJlc2ggPSAweDNlLAorCVR4U3RhcnRUaHJlc2ggPSAweDQ0LAorCUVlcHJvbURhdGEgPSAweDQ4LAorCUVlcHJvbUN0cmwgPSAweDRhLAorCUV4cHJvbUFkZHIgPSAweDRjLAorCUV4cHJvZGF0YSA9IDB4NTAsCisJV2FrZUV2ZW50ID0gMHg1MSwKKwlDb3VudERvd24gPSAweDU0LAorCUludFN0YXR1c0FjayA9IDB4NWEsCisJSW50RW5hYmxlID0gMHg1YywKKwlJbnRTdGF0dXMgPSAweDVlLAorCVR4U3RhdHVzID0gMHg2MCwKKwlNQUNDdHJsID0gMHg2YywKKwlWTEFOVGFnID0gMHg3MCwKKwlQaHlDdHJsID0gMHg3NiwKKwlTdGF0aW9uQWRkcjAgPSAweDc4LAorCVN0YXRpb25BZGRyMSA9IDB4N2EsCisJU3RhdGlvbkFkZHIyID0gMHg3YywKKwlWTEFOSWQgPSAweDgwLAorCU1heEZyYW1lU2l6ZSA9IDB4ODYsCisJUmVjZWl2ZU1vZGUgPSAweDg4LAorCUhhc2hUYWJsZTAgPSAweDhjLAorCUhhc2hUYWJsZTEgPSAweDkwLAorCVJtb25TdGF0TWFzayA9IDB4OTgsCisJU3RhdE1hc2sgPSAweDljLAorCVJ4SnVtYm9GcmFtZXMgPSAweGJjLAorCVRDUENoZWNrU3VtRXJyb3JzID0gMHhjMCwKKwlJUENoZWNrU3VtRXJyb3JzID0gMHhjMiwKKwlVRFBDaGVja1N1bUVycm9ycyA9IDB4YzQsCisJVHhKdW1ib0ZyYW1lcyA9IDB4ZjQsCisJLyogRXRoZXJuZXQgTUlCIHN0YXRpc3RpYyByZWdpc3RlciBvZmZzZXRzICovCisJT2N0ZXRSY3ZPayA9IDB4YTgsCisJTWNzdE9jdGV0UmN2T2sgPSAweGFjLAorCUJjc3RPY3RldFJjdk9rID0gMHhiMCwKKwlGcmFtZXNSY3ZPayA9IDB4YjQsCisJTWNzdEZyYW1lc1JjdmRPayA9IDB4YjgsCisJQmNzdEZyYW1lc1JjdmRPayA9IDB4YmUsCisJTWFjQ29udHJvbEZyYW1lc1JjdmQgPSAweGM2LAorCUZyYW1lVG9vTG9uZ0Vycm9ycyA9IDB4YzgsCisJSW5SYW5nZUxlbmd0aEVycm9ycyA9IDB4Y2EsCisJRnJhbWVzQ2hlY2tTZXFFcnJvcnMgPSAweGNjLAorCUZyYW1lc0xvc3RSeEVycm9ycyA9IDB4Y2UsCisJT2N0ZXRYbXRPayA9IDB4ZDAsCisJTWNzdE9jdGV0WG10T2sgPSAweGQ0LAorCUJjc3RPY3RldFhtdE9rID0gMHhkOCwKKwlGcmFtZXNYbXRPayA9IDB4ZGMsCisJTWNzdEZyYW1lc1htdGRPayA9IDB4ZTAsCisJRnJhbWVzV0RlZmVycmVkWG10ID0gMHhlNCwKKwlMYXRlQ29sbGlzaW9ucyA9IDB4ZTgsCisJTXVsdGlDb2xGcmFtZXMgPSAweGVjLAorCVNpbmdsZUNvbEZyYW1lcyA9IDB4ZjAsCisJQmNzdEZyYW1lc1htdGRPayA9IDB4ZjYsCisJQ2FycmllclNlbnNlRXJyb3JzID0gMHhmOCwKKwlNYWNDb250cm9sRnJhbWVzWG10ZCA9IDB4ZmEsCisJRnJhbWVzQWJvcnRYU0NvbGxzID0gMHhmYywKKwlGcmFtZXNXRVhEZWZlcmFsID0gMHhmZSwKKwkvKiBSTU9OIHN0YXRpc3RpYyByZWdpc3RlciBvZmZzZXRzICovCisJRXRoZXJTdGF0c0NvbGxpc2lvbnMgPSAweDEwMCwKKwlFdGhlclN0YXRzT2N0ZXRzVHJhbnNtaXQgPSAweDEwNCwKKwlFdGhlclN0YXRzUGt0c1RyYW5zbWl0ID0gMHgxMDgsCisJRXRoZXJTdGF0c1BrdHM2NE9jdGV0VHJhbnNtaXQgPSAweDEwYywKKwlFdGhlclN0YXRzNjV0bzEyN09jdGV0c1RyYW5zbWl0ID0gMHgxMTAsCisJRXRoZXJTdGF0c1BrdHMxMjh0bzI1NU9jdGV0c1RyYW5zbWl0ID0gMHgxMTQsCisJRXRoZXJTdGF0c1BrdHMyNTZ0bzUxMU9jdGV0c1RyYW5zbWl0ID0gMHgxMTgsCisJRXRoZXJTdGF0c1BrdHM1MTJ0bzEwMjNPY3RldHNUcmFuc21pdCA9IDB4MTFjLAorCUV0aGVyU3RhdHNQa3RzMTAyNHRvMTUxOE9jdGV0c1RyYW5zbWl0ID0gMHgxMjAsCisJRXRoZXJTdGF0c0NSQ0FsaWduRXJyb3JzID0gMHgxMjQsCisJRXRoZXJTdGF0c1VuZGVyc2l6ZVBrdHMgPSAweDEyOCwKKwlFdGhlclN0YXRzRnJhZ21lbnRzID0gMHgxMmMsCisJRXRoZXJTdGF0c0phYmJlcnMgPSAweDEzMCwKKwlFdGhlclN0YXRzT2N0ZXRzID0gMHgxMzQsCisJRXRoZXJTdGF0c1BrdHMgPSAweDEzOCwKKwlFdGhlclN0YXRzNjRPY3RldHMgPSAweDEzYywKKwlFdGhlclN0YXRzUGt0czY1dG8xMjdPY3RldHMgPSAweDE0MCwKKwlFdGhlclN0YXRzUGt0czEyOHRvMjU1T2N0ZXRzID0gMHgxNDQsCisJRXRoZXJTdGF0c1BrdHMyNTZ0bzUxMU9jdGV0cyA9IDB4MTQ4LAorCUV0aGVyU3RhdHNQa3RzNTEydG8xMDIzT2N0ZXRzID0gMHgxNGMsCisJRXRoZXJTdGF0c1BrdHMxMDI0dG8xNTE4T2N0ZXRzID0gMHgxNTAsCit9OworCisvKiBCaXRzIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzL21hc2sgcmVnaXN0ZXJzLiAqLworZW51bSBJbnRTdGF0dXNfYml0cyB7CisJSW50ZXJydXB0U3RhdHVzID0gMHgwMDAxLAorCUhvc3RFcnJvciA9IDB4MDAwMiwKKwlNQUNDdHJsRnJhbWUgPSAweDAwMDgsCisJVHhDb21wbGV0ZSA9IDB4MDAwNCwKKwlSeENvbXBsZXRlID0gMHgwMDEwLAorCVJ4RWFybHkgPSAweDAwMjAsCisJSW50UmVxdWVzdGVkID0gMHgwMDQwLAorCVVwZGF0ZVN0YXRzID0gMHgwMDgwLAorCUxpbmtFdmVudCA9IDB4MDEwMCwKKwlUeERNQUNvbXBsZXRlID0gMHgwMjAwLAorCVJ4RE1BQ29tcGxldGUgPSAweDA0MDAsCisJUkZETGlzdEVuZCA9IDB4MDgwMCwKKwlSeERNQVByaW9yaXR5ID0gMHgxMDAwLAorfTsKKworLyogQml0cyBpbiB0aGUgUmVjZWl2ZU1vZGUgcmVnaXN0ZXIuICovCitlbnVtIFJlY2VpdmVNb2RlX2JpdHMgeworCVJlY2VpdmVVbmljYXN0ID0gMHgwMDAxLAorCVJlY2VpdmVNdWx0aWNhc3QgPSAweDAwMDIsCisJUmVjZWl2ZUJyb2FkY2FzdCA9IDB4MDAwNCwKKwlSZWNlaXZlQWxsRnJhbWVzID0gMHgwMDA4LAorCVJlY2VpdmVNdWx0aWNhc3RIYXNoID0gMHgwMDEwLAorCVJlY2VpdmVJUE11bHRpY2FzdCA9IDB4MDAyMCwKKwlSZWNlaXZlVkxBTk1hdGNoID0gMHgwMTAwLAorCVJlY2VpdmVWTEFOSGFzaCA9IDB4MDIwMCwKK307CisvKiBCaXRzIGluIE1BQ0N0cmwuICovCitlbnVtIE1BQ0N0cmxfYml0cyB7CisJRHVwbGV4U2VsZWN0ID0gMHgyMCwKKwlUeEZsb3dDb250cm9sRW5hYmxlID0gMHg4MCwKKwlSeEZsb3dDb250cm9sRW5hYmxlID0gMHgwMTAwLAorCVJjdkZDUyA9IDB4MjAwLAorCUF1dG9WTEFOdGFnZ2luZyA9IDB4MTAwMCwKKwlBdXRvVkxBTnVudGFnZ2luZyA9IDB4MjAwMCwKKwlTdGF0c0VuYWJsZSA9IDB4MDAyMDAwMDAsCisJU3RhdHNEaXNhYmxlID0gMHgwMDQwMDAwMCwKKwlTdGF0c0VuYWJsZWQgPSAweDAwODAwMDAwLAorCVR4RW5hYmxlID0gMHgwMTAwMDAwMCwKKwlUeERpc2FibGUgPSAweDAyMDAwMDAwLAorCVR4RW5hYmxlZCA9IDB4MDQwMDAwMDAsCisJUnhFbmFibGUgPSAweDA4MDAwMDAwLAorCVJ4RGlzYWJsZSA9IDB4MTAwMDAwMDAsCisJUnhFbmFibGVkID0gMHgyMDAwMDAwMCwKK307CisKK2VudW0gQVNJQ0N0cmxfTG9Xb3JkX2JpdHMgeworCVBoeU1lZGlhID0gMHgwMDgwLAorfTsKKwkKK2VudW0gQVNJQ0N0cmxfSGlXb3JkX2JpdHMgeworCUdsb2JhbFJlc2V0ID0gMHgwMDAxLAorCVJ4UmVzZXQgPSAweDAwMDIsCisJVHhSZXNldCA9IDB4MDAwNCwKKwlETUFSZXNldCA9IDB4MDAwOCwKKwlGSUZPUmVzZXQgPSAweDAwMTAsCisJTmV0d29ya1Jlc2V0ID0gMHgwMDIwLAorCUhvc3RSZXNldCA9IDB4MDA0MCwKKwlSZXNldEJ1c3kgPSAweDA0MDAsCit9OworCisvKiBUcmFuc21pdCBGcmFtZSBDb250cm9sIGJpdHMgKi8KK2VudW0gVEZDX2JpdHMgeworCUR3b3JkQWxpZ24gPSAweDAwMDAwMDAwLAorCVdvcmRBbGlnbkRpc2FibGUgPSAweDAwMDMwMDAwLAorCVdvcmRBbGlnbiA9IDB4MDAwMjAwMDAsCisJVENQQ2hlY2tzdW1FbmFibGUgPSAweDAwMDQwMDAwLAorCVVEUENoZWNrc3VtRW5hYmxlID0gMHgwMDA4MDAwMCwKKwlJUENoZWNrc3VtRW5hYmxlID0gMHgwMDEwMDAwMCwKKwlGQ1NBcHBlbmREaXNhYmxlID0gMHgwMDIwMDAwMCwKKwlUeEluZGljYXRlID0gMHgwMDQwMDAwMCwKKwlUeERNQUluZGljYXRlID0gMHgwMDgwMDAwMCwKKwlGcmFnQ291bnRTaGlmdCA9IDI0LAorCVZMQU5UYWdJbnNlcnQgPSAweDAwMDAwMDAwMTAwMDAwMDAsCisJVEZERG9uZSA9IDB4ODAwMDAwMDAsCisJVklEU2hpZnQgPSAzMiwKKwlVc2VQcmlvcml0eVNoaWZ0ID0gNDgsCit9OworCisvKiBSZWNlaXZlIEZyYW1lcyBTdGF0dXMgYml0cyAqLworZW51bSBSRlNfYml0cyB7CisJUnhGSUZPT3ZlcnJ1biA9IDB4MDAwMTAwMDAsCisJUnhSdW50RnJhbWUgPSAweDAwMDIwMDAwLAorCVJ4QWxpZ25tZW50RXJyb3IgPSAweDAwMDQwMDAwLAorCVJ4RkNTRXJyb3IgPSAweDAwMDgwMDAwLAorCVJ4T3ZlclNpemVkRnJhbWUgPSAweDAwMTAwMDAwLAorCVJ4TGVuZ3RoRXJyb3IgPSAweDAwMjAwMDAwLAorCVZMQU5EZXRlY3RlZCA9IDB4MDA0MDAwMDAsCisJVENQRGV0ZWN0ZWQgPSAweDAwODAwMDAwLAorCVRDUEVycm9yID0gMHgwMTAwMDAwMCwKKwlVRFBEZXRlY3RlZCA9IDB4MDIwMDAwMDAsCisJVURQRXJyb3IgPSAweDA0MDAwMDAwLAorCUlQRGV0ZWN0ZWQgPSAweDA4MDAwMDAwLAorCUlQRXJyb3IgPSAweDEwMDAwMDAwLAorCUZyYW1lU3RhcnQgPSAweDIwMDAwMDAwLAorCUZyYW1lRW5kID0gMHg0MDAwMDAwMCwKKwlSRkREb25lID0gMHg4MDAwMDAwMCwKKwlUQ0lTaGlmdCA9IDMyLAorCVJGU19FcnJvcnMgPSAweDAwM2YwMDAwLAorfTsKKworI2RlZmluZSBNSUlfUkVTRVRfVElNRV9PVVQJCTEwMDAwCisvKiBNSUkgcmVnaXN0ZXIgKi8KK2VudW0gX21paV9yZWcgeworCU1JSV9CTUNSID0gMCwKKwlNSUlfQk1TUiA9IDEsCisJTUlJX1BIWV9JRDEgPSAyLAorCU1JSV9QSFlfSUQyID0gMywKKwlNSUlfQU5BUiA9IDQsCisJTUlJX0FOTFBBUiA9IDUsCisJTUlJX0FORVIgPSA2LAorCU1JSV9BTk5QVCA9IDcsCisJTUlJX0FOTFBSTlAgPSA4LAorCU1JSV9NU0NSID0gOSwKKwlNSUlfTVNTUiA9IDEwLAorCU1JSV9FU1IgPSAxNSwKKwlNSUlfUEhZX1NDUiA9IDE2LAorfTsKKy8qIFBDUyByZWdpc3RlciAqLworZW51bSBfcGNzX3JlZyB7CisJUENTX0JNQ1IgPSAwLAorCVBDU19CTVNSID0gMSwKKwlQQ1NfQU5BUiA9IDQsCisJUENTX0FOTFBBUiA9IDUsCisJUENTX0FORVIgPSA2LAorCVBDU19BTk5QVCA9IDcsCisJUENTX0FOTFBSTlAgPSA4LAorCVBDU19FU1IgPSAxNSwKK307CisKKy8qIEJhc2ljIE1vZGUgQ29udHJvbCBSZWdpc3RlciAqLwordHlwZWRlZiB1bmlvbiB0X01JSV9CTUNSIHsKKwl1MTYgaW1hZ2U7CisJc3RydWN0IHsKKwkJdTE2IF9iaXRfNV8wOjY7CS8vIGJpdCA1OjAKKwkJdTE2IHNwZWVkMTAwMDoxOwkvLyBiaXQgNgorCQl1MTYgY29sX3Rlc3RfZW5hYmxlOjE7CS8vIGJpdCA3CisJCXUxNiBkdXBsZXhfbW9kZToxOwkvLyBiaXQgOAorCQl1MTYgcmVzdGFydF9hbjoxOwkvLyBiaXQgOQorCQl1MTYgaXNvbGF0ZToxOwkvLyBiaXQgMTAKKwkJdTE2IHBvd2VyX2Rvd246MTsJLy8gYml0IDExCisJCXUxNiBhbl9lbmFibGU6MTsJLy8gYml0IDEyCisJCXUxNiBzcGVlZDEwMDoxOwkvLyBiaXQgMTMKKwkJdTE2IGxvb3BiYWNrOjE7CS8vIGJpdCAxNAorCQl1MTYgcmVzZXQ6MTsJLy8gYml0IDE1CisJfSBiaXRzOworfSBCTUNSX3QsICpQQk1DUl90OworCitlbnVtIF9taWlfYm1jciB7CisJTUlJX0JNQ1JfUkVTRVQgPSAweDgwMDAsCisJTUlJX0JNQ1JfTE9PUF9CQUNLID0gMHg0MDAwLAorCU1JSV9CTUNSX1NQRUVEX0xTQiA9IDB4MjAwMCwKKwlNSUlfQk1DUl9BTl9FTkFCTEUgPSAweDEwMDAsCisJTUlJX0JNQ1JfUE9XRVJfRE9XTiA9IDB4MDgwMCwKKwlNSUlfQk1DUl9JU09MQVRFID0gMHgwNDAwLAorCU1JSV9CTUNSX1JFU1RBUlRfQU4gPSAweDAyMDAsCisJTUlJX0JNQ1JfRFVQTEVYX01PREUgPSAweDAxMDAsCisJTUlJX0JNQ1JfQ09MX1RFU1QgPSAweDAwODAsCisJTUlJX0JNQ1JfU1BFRURfTVNCID0gMHgwMDQwLAorCU1JSV9CTUNSX1NQRUVEX1JFU0VSVkVEID0gMHgwMDNmLAorCU1JSV9CTUNSX1NQRUVEXzEwID0gMCwKKwlNSUlfQk1DUl9TUEVFRF8xMDAgPSBNSUlfQk1DUl9TUEVFRF9MU0IsCisJTUlJX0JNQ1JfU1BFRURfMTAwMCA9IE1JSV9CTUNSX1NQRUVEX01TQiwKK307CisKKy8qIEJhc2ljIE1vZGUgU3RhdHVzIFJlZ2lzdGVyICovCit0eXBlZGVmIHVuaW9uIHRfTUlJX0JNU1IgeworCXUxNiBpbWFnZTsKKwlzdHJ1Y3QgeworCQl1MTYgZXh0X2NhcGFiaWxpdHk6MTsJLy8gYml0IDAKKwkJdTE2IGphcHBlcl9kZXRlY3Q6MTsJLy8gYml0IDEKKwkJdTE2IGxpbmtfc3RhdHVzOjE7CS8vIGJpdCAyCisJCXUxNiBhbl9hYmlsaXR5OjE7CS8vIGJpdCAzCisJCXUxNiByZW1vdGVfZmF1bHQ6MTsJLy8gYml0IDQKKwkJdTE2IGFuX2NvbXBsZXRlOjE7CS8vIGJpdCA1CisJCXUxNiBwcmVhbWJsZV9zdXBwOjE7CS8vIGJpdCA2CisJCXUxNiBfYml0Xzc6MTsJLy8gYml0IDcKKwkJdTE2IGV4dF9zdGF0dXM6MTsJLy8gYml0IDgKKwkJdTE2IG1lZGlhXzEwMEJUMl9IRDoxOwkvLyBiaXQgOQorCQl1MTYgbWVkaWFfMTAwQlQyX0ZEOjE7CS8vIGJpdCAxMAorCQl1MTYgbWVkaWFfMTBCVF9IRDoxOwkvLyBiaXQgMTEKKwkJdTE2IG1lZGlhXzEwQlRfRkQ6MTsJLy8gYml0IDEyCisJCXUxNiBtZWRpYV8xMDBCWF9IRDoxOwkvLyBiaXQgMTMKKwkJdTE2IG1lZGlhXzEwMEJYX0ZEOjE7CS8vIGJpdCAxNAorCQl1MTYgbWVkaWFfMTAwQlQ0OjE7CS8vIGJpdCAxNQorCX0gYml0czsKK30gQk1TUl90LCAqUEJNU1JfdDsKKworZW51bSBfbWlpX2Jtc3IgeworCU1JSV9CTVNSXzEwMEJUNCA9IDB4ODAwMCwKKwlNSUlfQk1TUl8xMDBCWF9GRCA9IDB4NDAwMCwKKwlNSUlfQk1TUl8xMDBCWF9IRCA9IDB4MjAwMCwKKwlNSUlfQk1TUl8xMEJUX0ZEID0gMHgxMDAwLAorCU1JSV9CTVNSXzEwQlRfSEQgPSAweDA4MDAsCisJTUlJX0JNU1JfMTAwQlQyX0ZEID0gMHgwNDAwLAorCU1JSV9CTVNSXzEwMEJUMl9IRCA9IDB4MDIwMCwKKwlNSUlfQk1TUl9FWFRfU1RBVFVTID0gMHgwMTAwLAorCU1JSV9CTVNSX1BSRUFNQkxFX1NVUFAgPSAweDAwNDAsCisJTUlJX0JNU1JfQU5fQ09NUExFVEUgPSAweDAwMjAsCisJTUlJX0JNU1JfUkVNT1RFX0ZBVUxUID0gMHgwMDEwLAorCU1JSV9CTVNSX0FOX0FCSUxJVFkgPSAweDAwMDgsCisJTUlJX0JNU1JfTElOS19TVEFUVVMgPSAweDAwMDQsCisJTUlJX0JNU1JfSkFCQkVSX0RFVEVDVCA9IDB4MDAwMiwKKwlNSUlfQk1TUl9FWFRfQ0FQID0gMHgwMDAxLAorfTsKKworLyogQU5BUiAqLwordHlwZWRlZiB1bmlvbiB0X01JSV9BTkFSIHsKKwl1MTYgaW1hZ2U7CisJc3RydWN0IHsKKwkJdTE2IHNlbGVjdG9yOjU7CS8vIGJpdCA0OjAKKwkJdTE2IG1lZGlhXzEwQlRfSEQ6MTsJLy8gYml0IDUKKwkJdTE2IG1lZGlhXzEwQlRfRkQ6MTsJLy8gYml0IDYKKwkJdTE2IG1lZGlhXzEwMEJYX0hEOjE7CS8vIGJpdCA3CisJCXUxNiBtZWRpYV8xMDBCWF9GRDoxOwkvLyBiaXQgOAorCQl1MTYgbWVkaWFfMTAwQlQ0OjE7CS8vIGJpdCA5CisJCXUxNiBwYXVzZToxOwkvLyBiaXQgMTAKKwkJdTE2IGFzeW1tZXRyaWM6MTsJLy8gYml0IDExCisJCXUxNiBfYml0MTI6MTsJLy8gYml0IDEyCisJCXUxNiByZW1vdGVfZmF1bHQ6MTsJLy8gYml0IDEzCisJCXUxNiBfYml0MTQ6MTsJLy8gYml0IDE0CisJCXUxNiBuZXh0X3BhZ2U6MTsJLy8gYml0IDE1CisJfSBiaXRzOworfSBBTkFSX3QsICpQQU5BUl90OworCitlbnVtIF9taWlfYW5hciB7CisJTUlJX0FOQVJfTkVYVF9QQUdFID0gMHg4MDAwLAorCU1JSV9BTkFSX1JFTU9URV9GQVVMVCA9IDB4NDAwMCwKKwlNSUlfQU5BUl9BU1lNTUVUUklDID0gMHgwODAwLAorCU1JSV9BTkFSX1BBVVNFID0gMHgwNDAwLAorCU1JSV9BTkFSXzEwMEJUNCA9IDB4MDIwMCwKKwlNSUlfQU5BUl8xMDBCWF9GRCA9IDB4MDEwMCwKKwlNSUlfQU5BUl8xMDBCWF9IRCA9IDB4MDA4MCwKKwlNSUlfQU5BUl8xMEJUX0ZEID0gMHgwMDIwLAorCU1JSV9BTkFSXzEwQlRfSEQgPSAweDAwMTAsCisJTUlJX0FOQVJfU0VMRUNUT1IgPSAweDAwMWYsCisJTUlJX0lFRUU4MDIzX0NTTUFDRCA9IDB4MDAwMSwKK307CisKKy8qIEFOTFBBUiAqLwordHlwZWRlZiB1bmlvbiB0X01JSV9BTkxQQVIgeworCXUxNiBpbWFnZTsKKwlzdHJ1Y3QgeworCQl1MTYgc2VsZWN0b3I6NTsJLy8gYml0IDQ6MAorCQl1MTYgbWVkaWFfMTBCVF9IRDoxOwkvLyBiaXQgNQorCQl1MTYgbWVkaWFfMTBCVF9GRDoxOwkvLyBiaXQgNgorCQl1MTYgbWVkaWFfMTAwQlhfSEQ6MTsJLy8gYml0IDcKKwkJdTE2IG1lZGlhXzEwMEJYX0ZEOjE7CS8vIGJpdCA4CisJCXUxNiBtZWRpYV8xMDBCVDQ6MTsJLy8gYml0IDkKKwkJdTE2IHBhdXNlOjE7CS8vIGJpdCAxMAorCQl1MTYgYXN5bW1ldHJpYzoxOwkvLyBiaXQgMTEKKwkJdTE2IF9iaXQxMjoxOwkvLyBiaXQgMTIKKwkJdTE2IHJlbW90ZV9mYXVsdDoxOwkvLyBiaXQgMTMKKwkJdTE2IF9iaXQxNDoxOwkvLyBiaXQgMTQKKwkJdTE2IG5leHRfcGFnZToxOwkvLyBiaXQgMTUKKwl9IGJpdHM7Cit9IEFOTFBBUl90LCAqUEFOTFBBUl90OworCitlbnVtIF9taWlfYW5scGFyIHsKKwlNSUlfQU5MUEFSX05FWFRfUEFHRSA9IE1JSV9BTkFSX05FWFRfUEFHRSwKKwlNSUlfQU5MUEFSX1JFTU9URV9GQVVMVCA9IE1JSV9BTkFSX1JFTU9URV9GQVVMVCwKKwlNSUlfQU5MUEFSX0FTWU1NRVRSSUMgPSBNSUlfQU5BUl9BU1lNTUVUUklDLAorCU1JSV9BTkxQQVJfUEFVU0UgPSBNSUlfQU5BUl9QQVVTRSwKKwlNSUlfQU5MUEFSXzEwMEJUNCA9IE1JSV9BTkFSXzEwMEJUNCwKKwlNSUlfQU5MUEFSXzEwMEJYX0ZEID0gTUlJX0FOQVJfMTAwQlhfRkQsCisJTUlJX0FOTFBBUl8xMDBCWF9IRCA9IE1JSV9BTkFSXzEwMEJYX0hELAorCU1JSV9BTkxQQVJfMTBCVF9GRCA9IE1JSV9BTkFSXzEwQlRfRkQsCisJTUlJX0FOTFBBUl8xMEJUX0hEID0gTUlJX0FOQVJfMTBCVF9IRCwKKwlNSUlfQU5MUEFSX1NFTEVDVE9SID0gTUlJX0FOQVJfU0VMRUNUT1IsCit9OworCisvKiBBdXRvLU5lZ290aWF0aW9uIEV4cGFuc2lvbiBSZWdpc3RlciAqLwordHlwZWRlZiB1bmlvbiB0X01JSV9BTkVSIHsKKwl1MTYgaW1hZ2U7CisJc3RydWN0IHsKKwkJdTE2IGxwX25lZ290aWFibGU6MTsJLy8gYml0IDAKKwkJdTE2IHBhZ2VfcmVjZWl2ZWQ6MTsJLy8gYml0IDEKKwkJdTE2IG5leHRwYWdhYmxlOjE7CS8vIGJpdCAyCisJCXUxNiBscF9uZXh0cGFnYWJsZToxOwkvLyBiaXQgMworCQl1MTYgcGRldGVjdF9mYXVsdDoxOwkvLyBiaXQgNAorCQl1MTYgX2JpdDE1XzU6MTE7CS8vIGJpdCAxNTo1CisJfSBiaXRzOworfSBBTkVSX3QsICpQQU5FUl90OworCitlbnVtIF9taWlfYW5lciB7CisJTUlJX0FORVJfUEFSX0RFVEVDVF9GQVVMVCA9IDB4MDAxMCwKKwlNSUlfQU5FUl9MUF9ORVhUUEFHQUJMRSA9IDB4MDAwOCwKKwlNSUlfQU5FUl9ORVRYVFBBR0FCTEUgPSAweDAwMDQsCisJTUlJX0FORVJfUEFHRV9SRUNFSVZFRCA9IDB4MDAwMiwKKwlNSUlfQU5FUl9MUF9ORUdPVElBQkxFID0gMHgwMDAxLAorfTsKKworLyogTUFTVEVSLVNMQVZFIENvbnRyb2wgUmVnaXN0ZXIgKi8KK3R5cGVkZWYgdW5pb24gdF9NSUlfTVNDUiB7CisJdTE2IGltYWdlOworCXN0cnVjdCB7CisJCXUxNiBfYml0XzdfMDo4OwkvLyBiaXQgNzowCisJCXUxNiBtZWRpYV8xMDAwQlRfSEQ6MTsJLy8gYml0IDgKKwkJdTE2IG1lZGlhXzEwMDBCVF9GRDoxOwkvLyBiaXQgOQorCQl1MTYgcG9ydF90eXBlOjE7CS8vIGJpdCAxMAorCQl1MTYgY2ZnX3ZhbHVlOjE7CS8vIGJpdCAxMQorCQl1MTYgY2ZnX2VuYWJsZToxOwkvLyBiaXQgMTIKKwkJdTE2IHRlc3RfbW9kZTozOwkvLyBiaXQgMTU6MTMKKwl9IGJpdHM7Cit9IE1TQ1JfdCwgKlBNU0NSX3Q7CisKK2VudW0gX21paV9tc2NyIHsKKwlNSUlfTVNDUl9URVNUX01PREUgPSAweGUwMDAsCisJTUlJX01TQ1JfQ0ZHX0VOQUJMRSA9IDB4MTAwMCwKKwlNSUlfTVNDUl9DRkdfVkFMVUUgPSAweDA4MDAsCisJTUlJX01TQ1JfUE9SVF9WQUxVRSA9IDB4MDQwMCwKKwlNSUlfTVNDUl8xMDAwQlRfRkQgPSAweDAyMDAsCisJTUlJX01TQ1JfMTAwMEJUX0hEID0gMFgwMTAwLAorfTsKKworLyogTUFTVEVSLVNMQVZFIFN0YXR1cyBSZWdpc3RlciAqLwordHlwZWRlZiB1bmlvbiB0X01JSV9NU1NSIHsKKwl1MTYgaW1hZ2U7CisJc3RydWN0IHsKKwkJdTE2IGlkbGVfZXJyX2NvdW50Ojg7CS8vIGJpdCA3OjAKKwkJdTE2IF9iaXRfOV84OjI7CS8vIGJpdCA5OjgKKwkJdTE2IGxwXzEwMDBCVF9IRDoxOwkvLyBiaXQgMTAKKwkJdTE2IGxwXzEwMDBCVF9GRDoxOwkvLyBiaXQgMTEKKwkJdTE2IHJlbW90ZV9yY3Zfc3RhdHVzOjE7CS8vIGJpdCAxMgorCQl1MTYgbG9jYWxfcmN2X3N0YXR1czoxOwkvLyBiaXQgMTMKKwkJdTE2IGNmZ19yZXNvbHV0aW9uOjE7CS8vIGJpdCAxNAorCQl1MTYgY2ZnX2ZhdWx0OjE7CS8vIGJpdCAxNQorCX0gYml0czsKK30gTVNTUl90LCAqUE1TU1JfdDsKKworZW51bSBfbWlpX21zc3IgeworCU1JSV9NU1NSX0NGR19GQVVMVCA9IDB4ODAwMCwKKwlNSUlfTVNTUl9DRkdfUkVTID0gMHg0MDAwLAorCU1JSV9NU1NSX0xPQ0FMX1JDVl9TVEFUVVMgPSAweDIwMDAsCisJTUlJX01TU1JfUkVNT1RFX1JDVlIgPSAweDEwMDAsCisJTUlJX01TU1JfTFBfMTAwMEJUX0hEID0gMHgwODAwLAorCU1JSV9NU1NSX0xQXzEwMDBCVF9GRCA9IDB4MDQwMCwKKwlNSUlfTVNTUl9JRExFX0VSUl9DT1VOVCA9IDB4MDBmZiwKK307CisKKy8qIElFRUUgRXh0ZW5lZCBTdGF0dXMgUmVnaXN0ZXIgKi8KK3R5cGVkZWYgdW5pb24gdF9NSUlfRVNSIHsKKwl1MTYgaW1hZ2U7CisJc3RydWN0IHsKKwkJdTE2IF9iaXRfMTFfMDoxMjsJLy8gYml0IDExOjAKKwkJdTE2IG1lZGlhXzEwMDBCVF9IRDoyOwkvLyBiaXQgMTIKKwkJdTE2IG1lZGlhXzEwMDBCVF9GRDoxOwkvLyBiaXQgMTMKKwkJdTE2IG1lZGlhXzEwMDBCWF9IRDoxOwkvLyBiaXQgMTQKKwkJdTE2IG1lZGlhXzEwMDBCWF9GRDoxOwkvLyBiaXQgMTUKKwl9IGJpdHM7Cit9IEVTUl90LCAqUEVTUl90OworCitlbnVtIF9taWlfZXNyIHsKKwlNSUlfRVNSXzEwMDBCWF9GRCA9IDB4ODAwMCwKKwlNSUlfRVNSXzEwMDBCWF9IRCA9IDB4NDAwMCwKKwlNSUlfRVNSXzEwMDBCVF9GRCA9IDB4MjAwMCwKKwlNSUlfRVNSXzEwMDBCVF9IRCA9IDB4MTAwMCwKK307CisvKiBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAqLwordHlwZWRlZiB1bmlvbiB0X01JSV9QSFlfU0NSIHsKKwl1MTYgaW1hZ2U7CisJc3RydWN0IHsKKwkJdTE2IGRpc2FibGVfamFiYmVyOjE7CS8vIGJpdCAwCisJCXUxNiBwb2xhcml0eV9yZXZlcnNhbDoxOwkvLyBiaXQgMQorCQl1MTYgU0VRX3Rlc3Q6MTsJLy8gYml0IDIKKwkJdTE2IF9iaXRfMzoxOwkvLyBiaXQgMworCQl1MTYgZGlzYWJsZV9DTEsxMjU6MTsJLy8gYml0IDQKKwkJdTE2IG1kaV9jcm9zc292ZXJfbW9kZToyOwkvLyBiaXQgNjo1CisJCXUxNiBlbmFibGVfZXh0X2Rpc3Q6MTsJLy8gYml0IDcKKwkJdTE2IF9iaXRfOF85OjI7CS8vIGJpdCA5OjgKKwkJdTE2IGZvcmNlX2xpbms6MTsJLy8gYml0IDEwCisJCXUxNiBhc3NlcnRfQ1JTOjE7CS8vIGJpdCAxMQorCQl1MTYgcmN2X2ZpZm9fZGVwdGg6MjsJLy8gYml0IDEzOjEyCisJCXUxNiB4bWl0X2ZpZm9fZGVwdGg6MjsJLy8gYml0IDE1OjE0CisJfSBiaXRzOworfSBQSFlfU0NSX3QsICpQUEhZX1NDUl90OworCit0eXBlZGVmIGVudW0gdF9NSUlfQURNSU5fU1RBVFVTIHsKKwlhZG1fcmVzZXQsCisJYWRtX29wZXJhdGlvbmFsLAorCWFkbV9sb29wYmFjaywKKwlhZG1fcG93ZXJfZG93biwKKwlhZG1faXNvbGF0ZQorfSBNSUlfQURNSU5fdCwgKlBNSUlfQURNSU5fdDsKKworLyogUGh5c2ljYWwgQ29kaW5nIFN1YmxheWVyIE1hbmFnZW1lbnQgKFBDUykgKi8KKy8qIFBDUyBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXJzIGJpdG1hcCBhcyB0aGUgc2FtZSBhcyBNSUkgKi8KKy8qIFBDUyBFeHRlbmRlZCBTdGF0dXMgcmVnaXN0ZXIgYml0bWFwIGFzIHRoZSBzYW1lIGFzIE1JSSAqLworLyogUENTIEFOQVIgKi8KK3R5cGVkZWYgdW5pb24gdF9QQ1NfQU5BUiB7CisJdTE2IGltYWdlOworCXN0cnVjdCB7CisJCXUxNiBfYml0XzRfMDo1OwkJLy8gYml0IDQ6MAorCQl1MTYgZnVsbF9kdXBsZXg6MTsJLy8gYml0IDUKKwkJdTE2IGhhbGZfZHVwbGV4OjE7CS8vIGJpdCA2CisJCXUxNiBhc3ltbWV0cmljOjE7CS8vIGJpdCA3CisJCXUxNiBwYXVzZToxOwkJLy8gYml0IDgKKwkJdTE2IF9iaXRfMTFfOTozOwkvLyBiaXQgMTE6OQorCQl1MTYgcmVtb3RlX2ZhdWx0OjI7CS8vIGJpdCAxMzoxMgorCQl1MTYgX2JpdF8xNDoxOwkJLy8gYml0IDE0CisJCXUxNiBuZXh0X3BhZ2U6MTsJLy8gYml0IDE1CisJfSBiaXRzOworfSBBTkFSX1BDU190LCAqUEFOQVJfUENTX3Q7CisKK2VudW0gX3Bjc19hbmFyIHsKKwlQQ1NfQU5BUl9ORVhUX1BBR0UgPSAweDgwMDAsCisJUENTX0FOQVJfUkVNT1RFX0ZBVUxUID0gMHgzMDAwLAorCVBDU19BTkFSX0FTWU1NRVRSSUMgPSAweDAxMDAsCisJUENTX0FOQVJfUEFVU0UgPSAweDAwODAsCisJUENTX0FOQVJfSEFMRl9EVVBMRVggPSAweDAwNDAsCisJUENTX0FOQVJfRlVMTF9EVVBMRVggPSAweDAwMjAsCit9OworLyogUENTIEFOTFBBUiAqLwordHlwZWRlZiB1bmlvbiB0X1BDU19BTkxQQVIgeworCXUxNiBpbWFnZTsKKwlzdHJ1Y3QgeworCQl1MTYgX2JpdF80XzA6NTsJCS8vIGJpdCA0OjAKKwkJdTE2IGZ1bGxfZHVwbGV4OjE7CS8vIGJpdCA1CisJCXUxNiBoYWxmX2R1cGxleDoxOwkvLyBiaXQgNgorCQl1MTYgYXN5bW1ldHJpYzoxOwkvLyBiaXQgNworCQl1MTYgcGF1c2U6MTsJCS8vIGJpdCA4CisJCXUxNiBfYml0XzExXzk6MzsJLy8gYml0IDExOjkKKwkJdTE2IHJlbW90ZV9mYXVsdDoyOwkvLyBiaXQgMTM6MTIKKwkJdTE2IF9iaXRfMTQ6MTsJCS8vIGJpdCAxNAorCQl1MTYgbmV4dF9wYWdlOjE7CS8vIGJpdCAxNQorCX0gYml0czsKK30gQU5MUEFSX1BDU190LCAqUEFOTFBBUl9QQ1NfdDsKKworZW51bSBfcGNzX2FubHBhciB7CisJUENTX0FOTFBBUl9ORVhUX1BBR0UgPSBQQ1NfQU5BUl9ORVhUX1BBR0UsIAorCVBDU19BTkxQQVJfUkVNT1RFX0ZBVUxUID0gUENTX0FOQVJfUkVNT1RFX0ZBVUxULAorCVBDU19BTkxQQVJfQVNZTU1FVFJJQyA9IFBDU19BTkFSX0FTWU1NRVRSSUMsCisJUENTX0FOTFBBUl9QQVVTRSA9IFBDU19BTkFSX1BBVVNFLAorCVBDU19BTkxQQVJfSEFMRl9EVVBMRVggPSBQQ1NfQU5BUl9IQUxGX0RVUExFWCwKKwlQQ1NfQU5MUEFSX0ZVTExfRFVQTEVYID0gUENTX0FOQVJfRlVMTF9EVVBMRVgsCit9OworCit0eXBlZGVmIHN0cnVjdCB0X1NST00geworCXUxNiBjb25maWdfcGFyYW07CS8qIDB4MDAgKi8KKwl1MTYgYXNpY19jdHJsOwkJLyogMHgwMiAqLworCXUxNiBzdWJfdmVuZG9yX2lkOwkvKiAweDA0ICovCisJdTE2IHN1Yl9zeXN0ZW1faWQ7CS8qIDB4MDYgKi8KKwl1MTYgcmVzZXJ2ZWQxWzEyXTsJLyogMHgwOC0weDFmICovCisJdTggbWFjX2FkZHJbNl07CQkvKiAweDIwLTB4MjUgKi8KKwl1OCByZXNlcnZlZDJbMTBdOwkvKiAweDI2LTB4MmYgKi8KKwl1OCBzaWJbMjA0XTsJCS8qIDB4MzAtMHhmYiAqLworCXUzMiBjcmM7CQkvKiAweGZjLTB4ZmYgKi8KK30gU1JPTV90LCAqUFNST01fdDsKKworLyogSW9jdGwgY3VzdG9tIGRhdGEgKi8KK3N0cnVjdCBpb2N0bF9kYXRhIHsKKwljaGFyIHNpZ25hdHVyZVsxMF07CisJaW50IGNtZDsKKwlpbnQgbGVuOworCWNoYXIgKmRhdGE7Cit9OworCitzdHJ1Y3QgbWlpX2RhdGEgeworCV9fdTE2IHJlc2VydmVkOworCV9fdTE2IHJlZ19udW07CisJX191MTYgaW5fdmFsdWU7CisJX191MTYgb3V0X3ZhbHVlOworfTsKKworLyogVGhlIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3QgbmV0ZGV2X2Rlc2MgeworCXU2NCBuZXh0X2Rlc2M7CisJdTY0IHN0YXR1czsKKwl1NjQgZnJhZ2luZm87Cit9OworCisjZGVmaW5lIFBSSVZfQUxJR04JMTUJLyogUmVxdWlyZWQgYWxpZ25tZW50IG1hc2sgKi8KKy8qIFVzZSAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoTDFfQ0FDSEVfQllURVMpKSkgIHRvIG1haW50YWluIGFsaWdubWVudAorICAgd2l0aGluIHRoZSBzdHJ1Y3R1cmUuICovCitzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgeworCS8qIERlc2NyaXB0b3IgcmluZ3MgZmlyc3QgZm9yIGFsaWdubWVudC4gKi8KKwlzdHJ1Y3QgbmV0ZGV2X2Rlc2MgKnJ4X3Jpbmc7CisJc3RydWN0IG5ldGRldl9kZXNjICp0eF9yaW5nOworCXN0cnVjdCBza19idWZmICpyeF9za2J1ZmZbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKwlkbWFfYWRkcl90IHJ4X3JpbmdfZG1hOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXNwaW5sb2NrX3QgdHhfbG9jazsKKwlzcGlubG9ja190IHJ4X2xvY2s7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdW5zaWduZWQgaW50IHJ4X2J1Zl9zejsJCS8qIEJhc2VkIG9uIE1UVStzbGFjay4gKi8KKwl1bnNpZ25lZCBpbnQgc3BlZWQ7CQkvKiBPcGVyYXRpbmcgc3BlZWQgKi8KKwl1bnNpZ25lZCBpbnQgdmxhbjsJCS8qIFZMQU4gSWQgKi8KKwl1bnNpZ25lZCBpbnQgY2hpcF9pZDsJCS8qIFBDSSB0YWJsZSBjaGlwIGlkICovCisJdW5zaWduZWQgaW50IHJ4X2NvYWxlc2NlOyAJLyogTWF4aW11bSBmcmFtZXMgZWFjaCBSeERNQUNvbXBsZXRlIGludHIgKi8KKwl1bnNpZ25lZCBpbnQgcnhfdGltZW91dDsgCS8qIFdhaXQgdGltZSBiZXR3ZWVuIFJ4RE1BQ29tcGxldGUgaW50ciAqLworCXVuc2lnbmVkIGludCB0eF9jb2FsZXNjZTsJLyogTWF4aW11bSBmcmFtZXMgZWFjaCB0eCBpbnRlcnJ1cHQgKi8KKwl1bnNpZ25lZCBpbnQgZnVsbF9kdXBsZXg6MTsJLyogRnVsbC1kdXBsZXggb3BlcmF0aW9uIHJlcXVlc3RlZC4gKi8KKwl1bnNpZ25lZCBpbnQgYW5fZW5hYmxlOjI7CS8qIEF1dG8tTmVnb3RpYXRlZCBFbmFibGUgKi8KKwl1bnNpZ25lZCBpbnQganVtYm86MTsJCS8qIEp1bWJvIGZyYW1lIGVuYWJsZSAqLworCXVuc2lnbmVkIGludCBjb2FsZXNjZToxOwkvKiBSeCBjb2FsZXNjaW5nIGVuYWJsZSAqLworCXVuc2lnbmVkIGludCB0eF9mbG93OjE7CQkvKiBUeCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisJdW5zaWduZWQgaW50IHJ4X2Zsb3c6MTsJCS8qIFJ4IGZsb3cgY29udHJvbCBlbmFibGUgKi8KKwl1bnNpZ25lZCBpbnQgcGh5X21lZGlhOjE7CS8qIDE6IGZpYmVyLCAwOiBjb3BwZXIgKi8KKwl1bnNpZ25lZCBpbnQgbGlua19zdGF0dXM6MTsJLyogQ3VycmVudCBsaW5rIHN0YXR1cyAqLworCXVuc2lnbmVkIGNoYXIgcGNpX3Jldl9pZDsJLyogUENJIHJldmlzaW9uIElEICovCisJc3RydWN0IG5ldGRldl9kZXNjICpsYXN0X3R4OwkvKiBMYXN0IFR4IGRlc2NyaXB0b3IgdXNlZC4gKi8KKwl1bnNpZ25lZCBsb25nIGN1cl9yeCwgb2xkX3J4OwkvKiBQcm9kdWNlci9jb25zdW1lciByaW5nIGluZGljZXMgKi8KKwl1bnNpZ25lZCBsb25nIGN1cl90eCwgb2xkX3R4OworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCWludCB3YWtlX3BvbGFyaXR5OworCWNoYXIgbmFtZVsyNTZdOwkJLyogbmV0IGRldmljZSBkZXNjcmlwdGlvbiAqLworCXU4IGR1cGxleF9wb2xhcml0eTsKKwl1MTYgbWNhc3RfZmlsdGVyWzRdOworCXUxNiBhZHZlcnRpc2luZzsJLyogTldheSBtZWRpYSBhZHZlcnRpc2VtZW50ICovCisJdTE2IG5lZ290aWF0ZTsJCS8qIE5lZ290aWF0ZWQgbWVkaWEgKi8KKwlpbnQgcGh5X2FkZHI7CQkvKiBQSFkgYWRkcmVzc2VzLiAqLworfTsKKworLyogVGhlIHN0YXRpb24gYWRkcmVzcyBsb2NhdGlvbiBpbiB0aGUgRUVQUk9NLiAqLworI2lmZGVmIE1FTV9NQVBQSU5HCisjZGVmaW5lIFBDSV9JT1RZUEUgKFBDSV9VU0VTX01BU1RFUiB8IFBDSV9VU0VTX01FTSB8IFBDSV9BRERSMSkKKyNlbHNlCisjZGVmaW5lIFBDSV9JT1RZUEUgKFBDSV9VU0VTX01BU1RFUiB8IFBDSV9VU0VTX0lPICB8IFBDSV9BRERSMCkKKyNlbmRpZgorLyogVGhlIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNvbnNpc3Qgb2Y6CisgICAgICAgIHZlbmRvciwgZGV2aWNlICAgICAgICAgIFZlbmRvciBhbmQgZGV2aWNlIElEIHRvIG1hdGNoIChvciBQQ0lfQU5ZX0lEKQorICAgICAgICBzdWJ2ZW5kb3IsIHN1YmRldmljZSAgICBTdWJzeXN0ZW0gdmVuZG9yIGFuZCBkZXZpY2UgSUQgdG8gbWF0Y2ggKG9yIFBDSV9BTllfSUQpCisgICAgICAgIGNsYXNzICAgICAgICAgICAgICAgICAgIERldmljZSBjbGFzcyB0byBtYXRjaC4gVGhlIGNsYXNzX21hc2sgdGVsbHMgd2hpY2ggYml0cworICAgICAgICBjbGFzc19tYXNrICAgICAgICAgICAgICBvZiB0aGUgY2xhc3MgYXJlIGhvbm9yZWQgZHVyaW5nIHRoZSBjb21wYXJpc29uLgorICAgICAgICBkcml2ZXJfZGF0YSAgICAgICAgICAgICBEYXRhIHByaXZhdGUgdG8gdGhlIGRyaXZlci4KKyovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcmlvX3BjaV90YmxbXSA9IHsKKwl7MHgxMTg2LCAweDQwMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXswLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIHJpb19wY2lfdGJsKTsKKyNkZWZpbmUgVFhfVElNRU9VVCAgKDQqSFopCisjZGVmaW5lIFBBQ0tFVF9TSVpFCQkxNTM2CisjZGVmaW5lIE1BWF9KVU1CTwkJODAwMAorI2RlZmluZSBSSU9fSU9fU0laRSAgICAgICAgICAgICAzNDAKKyNkZWZpbmUgREVGQVVMVF9SWEMJCTUKKyNkZWZpbmUgREVGQVVMVF9SWFQJCTc1MAorI2RlZmluZSBERUZBVUxUX1RYQwkJMQorI2RlZmluZSBNQVhfVFhDCQkJOAorI2VuZGlmCQkJCS8qIF9fREwyS19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2R1bW15LmMgYi9kcml2ZXJzL25ldC9kdW1teS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOGMxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kdW1teS5jCkBAIC0wLDAgKzEsMTUyIEBACisvKiBkdW1teS5jOiBhIGR1bW15IG5ldCBkcml2ZXIKKworCVRoZSBwdXJwb3NlIG9mIHRoaXMgZHJpdmVyIGlzIHRvIHByb3ZpZGUgYSBkZXZpY2UgdG8gcG9pbnQgYQorCXJvdXRlIHRocm91Z2gsIGJ1dCBub3QgdG8gYWN0dWFsbHkgdHJhbnNtaXQgcGFja2V0cy4KKworCVdoeT8gIElmIHlvdSBoYXZlIGEgbWFjaGluZSB3aG9zZSBvbmx5IGNvbm5lY3Rpb24gaXMgYW4gb2NjYXNpb25hbAorCVBQUC9TTElQL1BMSVAgbGluaywgeW91IGNhbiBvbmx5IGNvbm5lY3QgdG8geW91ciBvd24gaG9zdG5hbWUKKwl3aGVuIHRoZSBsaW5rIGlzIHVwLiAgT3RoZXJ3aXNlIHlvdSBoYXZlIHRvIHVzZSBsb2NhbGhvc3QuCisJVGhpcyBpc24ndCB2ZXJ5IGNvbnNpc3RlbnQuCisKKwlPbmUgc29sdXRpb24gaXMgdG8gc2V0IHVwIGEgZHVtbXkgbGluayB1c2luZyBQUFAvU0xJUC9QTElQLAorCWJ1dCB0aGlzIHNlZW1zICh0byBtZSkgdG9vIG11Y2ggb3ZlcmhlYWQgZm9yIHRvbyBsaXR0bGUgZ2Fpbi4KKwlUaGlzIGRyaXZlciBwcm92aWRlcyBhIHNtYWxsIGFsdGVybmF0aXZlLiBUaHVzIHlvdSBjYW4gZG8KKwkKKwlbd2hlbiBub3QgcnVubmluZyBzbGlwXQorCQlpZmNvbmZpZyBkdW1teSBzbGlwLmFkZHIuZXNzLmhlcmUgdXAKKwlbdG8gZ28gdG8gc2xpcF0KKwkJaWZjb25maWcgZHVtbXkgZG93bgorCQlkaXAgd2hhdGV2ZXIKKworCVRoaXMgd2FzIHdyaXR0ZW4gYnkgbG9va2luZyBhdCBEb25hbGQgQmVja2VyJ3Mgc2tlbGV0b24gZHJpdmVyCisJYW5kIHRoZSBsb29wYmFjayBkcml2ZXIuICBJIHRoZW4gdGhyZXcgYXdheSBhbnl0aGluZyB0aGF0IGRpZG4ndAorCWFwcGx5IQlUaGFua3MgdG8gQWxhbiBDb3ggZm9yIHRoZSBrZXkgY2x1ZSBvbiB3aGF0IHRvIGRvIHdpdGgKKwltaXNndWlkZWQgcGFja2V0cy4KKworCQkJTmljayBIb2xsb3dheSwgMjd0aCBNYXkgMTk5NAorCVtJIHR3ZWFrZWQgdGhpcyBleHBsYW5hdGlvbiBhIGxpdHRsZSBidXQgdGhhdCdzIGFsbF0KKwkJCUFsYW4gQ294LCAzMHRoIE1heSAxOTk0CisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworc3RhdGljIGludCBudW1kdW1taWVzID0gMTsKKworc3RhdGljIGludCBkdW1teV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpkdW1teV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgZHVtbXlfc2V0X2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gcDsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihzYS0+c2FfZGF0YSkpIAorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisJCQorCW1lbWNweShkZXYtPmRldl9hZGRyLCBzYS0+c2FfZGF0YSwgRVRIX0FMRU4pOworCXJldHVybiAwOworfQorCisvKiBmYWtlIG11bHRpY2FzdCBhYmlsaXR5ICovCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKK30KKworc3RhdGljIHZvaWQgX19pbml0IGR1bW15X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPmdldF9zdGF0cyA9IGR1bW15X2dldF9zdGF0czsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGR1bW15X3htaXQ7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBkdW1teV9zZXRfYWRkcmVzczsKKworCS8qIEZpbGwgaW4gZGV2aWNlIHN0cnVjdHVyZSB3aXRoIGV0aGVybmV0LWdlbmVyaWMgdmFsdWVzLiAqLworCWV0aGVyX3NldHVwKGRldik7CisJZGV2LT50eF9xdWV1ZV9sZW4gPSAwOworCWRldi0+Y2hhbmdlX210dSA9IE5VTEw7CisJZGV2LT5mbGFncyB8PSBJRkZfTk9BUlA7CisJZGV2LT5mbGFncyAmPSB+SUZGX01VTFRJQ0FTVDsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJcmFuZG9tX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgZHVtbXlfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IG5ldGRldl9wcml2KGRldik7CisKKwlzdGF0cy0+dHhfcGFja2V0cysrOworCXN0YXRzLT50eF9ieXRlcys9c2tiLT5sZW47CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZHVtbXlfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIG5ldGRldl9wcml2KGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqKmR1bW1pZXM7CisKKy8qIE51bWJlciBvZiBkdW1teSBkZXZpY2VzIHRvIGJlIHNldCB1cCBieSB0aGlzIG1vZHVsZS4gKi8KK21vZHVsZV9wYXJhbShudW1kdW1taWVzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhudW1kdW1taWVzLCAiTnVtYmVyIG9mIGR1bW15IHBzZXVkbyBkZXZpY2VzIik7CisKK3N0YXRpYyBpbnQgX19pbml0IGR1bW15X2luaXRfb25lKGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2R1bW15OworCWludCBlcnI7CisKKwlkZXZfZHVtbXkgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSwKKwkJCQkgImR1bW15JWQiLCBkdW1teV9zZXR1cCk7CisKKwlpZiAoIWRldl9kdW1teSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldihkZXZfZHVtbXkpKSkgeworCQlmcmVlX25ldGRldihkZXZfZHVtbXkpOworCQlkZXZfZHVtbXkgPSBOVUxMOworCX0gZWxzZSB7CisJCWR1bW1pZXNbaW5kZXhdID0gZGV2X2R1bW15OyAKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBkdW1teV9mcmVlX29uZShpbnQgaW5kZXgpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZHVtbWllc1tpbmRleF0pOworCWZyZWVfbmV0ZGV2KGR1bW1pZXNbaW5kZXhdKTsKK30gCisKK3N0YXRpYyBpbnQgX19pbml0IGR1bW15X2luaXRfbW9kdWxlKHZvaWQpCit7IAorCWludCBpLCBlcnIgPSAwOworCWR1bW1pZXMgPSBrbWFsbG9jKG51bWR1bW1pZXMgKiBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7IAorCWlmICghZHVtbWllcykKKwkJcmV0dXJuIC1FTk9NRU07IAorCWZvciAoaSA9IDA7IGkgPCBudW1kdW1taWVzICYmICFlcnI7IGkrKykKKwkJZXJyID0gZHVtbXlfaW5pdF9vbmUoaSk7IAorCWlmIChlcnIpIHsgCisJCXdoaWxlICgtLWkgPj0gMCkKKwkJCWR1bW15X2ZyZWVfb25lKGkpOworCX0KKwlyZXR1cm4gZXJyOworfSAKKworc3RhdGljIHZvaWQgX19leGl0IGR1bW15X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG51bWR1bW1pZXM7IGkrKykgCisJCWR1bW15X2ZyZWVfb25lKGkpOyAKKwlrZnJlZShkdW1taWVzKTsJCit9CisKK21vZHVsZV9pbml0KGR1bW15X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGR1bW15X2NsZWFudXBfbW9kdWxlKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAuYyBiL2RyaXZlcnMvbmV0L2UxMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjY4ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZTEwMC5jCkBAIC0wLDAgKzEsMjM3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKgllMTAwLmM6IEludGVsKFIpIFBSTy8xMDAgZXRoZXJuZXQgZHJpdmVyCisgKgorICoJKFJlKXdyaXR0ZW4gMjAwMyBieSBzY290dC5mZWxkbWFuQGludGVsLmNvbS4gIEJhc2VkIGxvb3NlbHkgb24KKyAqCW9yaWdpbmFsIGUxMDAgZHJpdmVyLCBidXQgYmV0dGVyIGRlc2NyaWJlZCBhcyBhIG11bmdpbmcgb2YKKyAqCWUxMDAsIGUxMDAwLCBlZXBybzEwMCwgdGczLCA4MTM5Y3AsIGFuZCBvdGhlciBkcml2ZXJzLgorICoKKyAqCVJlZmVyZW5jZXM6CisgKgkJSW50ZWwgODI1NXggMTAvMTAwIE1icHMgRXRoZXJuZXQgQ29udHJvbGxlciBGYW1pbHksCisgKgkJT3BlbiBTb3VyY2UgU29mdHdhcmUgRGV2ZWxvcGVycyBNYW51YWwsCisgKgkJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9lMTAwMAorICoKKyAqCisgKgkgICAgICAgICAgICAgICAgICAgICAgVGhlb3J5IG9mIE9wZXJhdGlvbgorICoKKyAqCUkuICAgR2VuZXJhbAorICoKKyAqCVRoZSBkcml2ZXIgc3VwcG9ydHMgSW50ZWwoUikgMTAvMTAwIE1icHMgUENJIEZhc3QgRXRoZXJuZXQKKyAqCWNvbnRyb2xsZXIgZmFtaWx5LCB3aGljaCBpbmNsdWRlcyB0aGUgODI1NTcsIDgyNTU4LCA4MjU1OSwgODI1NTAsCisgKgk4MjU1MSwgYW5kIDgyNTYyIGRldmljZXMuICA4MjU1OCBhbmQgZ3JlYXRlciBjb250cm9sbGVycworICoJaW50ZWdyYXRlIHRoZSBJbnRlbCA4MjU1NSBQSFkuICBUaGUgY29udHJvbGxlcnMgYXJlIHVzZWQgaW4KKyAqCXNlcnZlciBhbmQgY2xpZW50IG5ldHdvcmsgaW50ZXJmYWNlIGNhcmRzLCBhcyB3ZWxsIGFzIGluCisgKglMQU4tT24tTW90aGVyYm9hcmQgKExPTSksIENhcmRCdXMsIE1pbmlQQ0ksIGFuZCBJQ0h4CisgKgljb25maWd1cmF0aW9ucy4gIDgyNTV4IHN1cHBvcnRzIGEgMzItYml0IGxpbmVhciBhZGRyZXNzaW5nCisgKgltb2RlIGFuZCBvcGVyYXRlcyBhdCAzM01oeiBQQ0kgY2xvY2sgcmF0ZS4KKyAqCisgKglJSS4gIERyaXZlciBPcGVyYXRpb24KKyAqCisgKglNZW1vcnktbWFwcGVkIG1vZGUgaXMgdXNlZCBleGNsdXNpdmVseSB0byBhY2Nlc3MgdGhlIGRldmljZSdzCisgKglzaGFyZWQtbWVtb3J5IHN0cnVjdHVyZSwgdGhlIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVycyAoQ1NSKS4gQWxsCisgKglzZXR1cCwgY29uZmlndXJhdGlvbiwgYW5kIGNvbnRyb2wgb2YgdGhlIGRldmljZSwgaW5jbHVkaW5nIHF1ZXVpbmcKKyAqCW9mIFR4LCBSeCwgYW5kIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMgaXMgdGhyb3VnaCB0aGUgQ1NSLgorICoJY21kX2xvY2sgc2VyaWFsaXplcyBhY2Nlc3NlcyB0byB0aGUgQ1NSIGNvbW1hbmQgcmVnaXN0ZXIuICBjYl9sb2NrCisgKglwcm90ZWN0cyB0aGUgc2hhcmVkIENvbW1hbmQgQmxvY2sgTGlzdCAoQ0JMKS4KKyAqCisgKgk4MjU1eCBpcyBoaWdobHkgTUlJLWNvbXBsaWFudCBhbmQgYWxsIGFjY2VzcyB0byB0aGUgUEhZIGdvCisgKgl0aHJvdWdoIHRoZSBNYW5hZ2VtZW50IERhdGEgSW50ZXJmYWNlIChNREkpLiAgQ29uc2VxdWVudGx5LCB0aGUKKyAqCWRyaXZlciBsZXZlcmFnZXMgdGhlIG1paS5jIGxpYnJhcnkgc2hhcmVkIHdpdGggb3RoZXIgTUlJLWNvbXBsaWFudAorICoJZGV2aWNlcy4KKyAqCisgKglCaWctIGFuZCBMaXR0bGUtRW5kaWFuIGJ5dGUgb3JkZXIgYXMgd2VsbCBhcyAzMi0gYW5kIDY0LWJpdAorICoJYXJjaHMgYXJlIHN1cHBvcnRlZC4gIFdlYWstb3JkZXJlZCBtZW1vcnkgYW5kIG5vbi1jYWNoZS1jb2hlcmVudAorICoJYXJjaHMgYXJlIHN1cHBvcnRlZC4KKyAqCisgKglJSUkuIFRyYW5zbWl0CisgKgorICoJQSBUeCBza2IgaXMgbWFwcGVkIGFuZCBoYW5ncyBvZmYgb2YgYSBUQ0IuICBUQ0JzIGFyZSBsaW5rZWQKKyAqCXRvZ2V0aGVyIGluIGEgZml4ZWQtc2l6ZSByaW5nIChDQkwpIHRodXMgZm9ybWluZyB0aGUgZmxleGlibGUgbW9kZQorICoJbWVtb3J5IHN0cnVjdHVyZS4gIEEgVENCIG1hcmtlZCB3aXRoIHRoZSBzdXNwZW5kLWJpdCBpbmRpY2F0ZXMKKyAqCXRoZSBlbmQgb2YgdGhlIHJpbmcuICBUaGUgbGFzdCBUQ0IgcHJvY2Vzc2VkIHN1c3BlbmRzIHRoZQorICoJY29udHJvbGxlciwgYW5kIHRoZSBjb250cm9sbGVyIGNhbiBiZSByZXN0YXJ0ZWQgYnkgaXNzdWUgYSBDVQorICoJcmVzdW1lIGNvbW1hbmQgdG8gY29udGludWUgZnJvbSB0aGUgc3VzcGVuZCBwb2ludCwgb3IgYSBDVSBzdGFydAorICoJY29tbWFuZCB0byBzdGFydCBhdCBhIGdpdmVuIHBvc2l0aW9uIGluIHRoZSByaW5nLgorICoKKyAqCU5vbi1UeCBjb21tYW5kcyAoY29uZmlnLCBtdWx0aWNhc3Qgc2V0dXAsIGV0YykgYXJlIGxpbmtlZAorICoJaW50byB0aGUgQ0JMIHJpbmcgYWxvbmcgd2l0aCBUeCBjb21tYW5kcy4gIFRoZSBjb21tb24gc3RydWN0dXJlCisgKgl1c2VkIGZvciBib3RoIFR4IGFuZCBub24tVHggY29tbWFuZHMgaXMgdGhlIENvbW1hbmQgQmxvY2sgKENCKS4KKyAqCisgKgljYl90b191c2UgaXMgdGhlIG5leHQgQ0IgdG8gdXNlIGZvciBxdWV1aW5nIGEgY29tbWFuZDsgY2JfdG9fY2xlYW4KKyAqCWlzIHRoZSBuZXh0IENCIHRvIGNoZWNrIGZvciBjb21wbGV0aW9uOyBjYl90b19zZW5kIGlzIHRoZSBmaXJzdAorICoJQ0IgdG8gc3RhcnQgb24gaW4gY2FzZSBvZiBhIHByZXZpb3VzIGZhaWx1cmUgdG8gcmVzdW1lLiAgQ0IgY2xlYW4KKyAqCXVwIGhhcHBlbnMgaW4gaW50ZXJydXB0IGNvbnRleHQgaW4gcmVzcG9uc2UgdG8gYSBDVSBpbnRlcnJ1cHQuCisgKgljYnNfYXZhaWwga2VlcHMgdHJhY2sgb2YgbnVtYmVyIG9mIGZyZWUgQ0IgcmVzb3VyY2VzIGF2YWlsYWJsZS4KKyAqCisgKiAJSGFyZHdhcmUgcGFkZGluZyBvZiBzaG9ydCBwYWNrZXRzIHRvIG1pbmltdW0gcGFja2V0IHNpemUgaXMKKyAqIAllbmFibGVkLiAgODI1NTcgcGFkcyB3aXRoIDdFaCwgd2hpbGUgdGhlIGxhdGVyIGNvbnRyb2xsZXJzIHBhZAorICogCXdpdGggMDBoLgorICoKKyAqCUlWLiAgUmVjaWV2ZQorICoKKyAqCVRoZSBSZWNlaXZlIEZyYW1lIEFyZWEgKFJGQSkgY29tcHJpc2VzIGEgcmluZyBvZiBSZWNlaXZlIEZyYW1lCisgKglEZXNjcmlwdG9ycyAoUkZEKSArIGRhdGEgYnVmZmVyLCB0aHVzIGZvcm1pbmcgdGhlIHNpbXBsaWZpZWQgbW9kZQorICoJbWVtb3J5IHN0cnVjdHVyZS4gIFJ4IHNrYnMgYXJlIGFsbG9jYXRlZCB0byBjb250YWluIGJvdGggdGhlIFJGRAorICoJYW5kIHRoZSBkYXRhIGJ1ZmZlciwgYnV0IHRoZSBSRkQgaXMgcHVsbGVkIG9mZiBiZWZvcmUgdGhlIHNrYiBpcworICoJaW5kaWNhdGVkLiAgVGhlIGRhdGEgYnVmZmVyIGlzIGFsaWduZWQgc3VjaCB0aGF0IGVuY2Fwc3VsYXRlZAorICoJcHJvdG9jb2wgaGVhZGVycyBhcmUgdTMyLWFsaWduZWQuICBTaW5jZSB0aGUgUkZEIGlzIHBhcnQgb2YgdGhlCisgKgltYXBwZWQgc2hhcmVkIG1lbW9yeSwgYW5kIGNvbXBsZXRpb24gc3RhdHVzIGlzIGNvbnRhaW5lZCB3aXRoaW4KKyAqCXRoZSBSRkQsIHRoZSBSRkQgbXVzdCBiZSBkbWFfc3luYydlZCB0byBtYWludGFpbiBhIGNvbnNpc3RlbnQKKyAqCXZpZXcgZnJvbSBzb2Z0d2FyZSBhbmQgaGFyZHdhcmUuCisgKgorICoJVW5kZXIgdHlwaWNhbCBvcGVyYXRpb24sIHRoZSAgcmVjZWl2ZSB1bml0IChSVSkgaXMgc3RhcnQgb25jZSwKKyAqCWFuZCB0aGUgY29udHJvbGxlciBoYXBwaWx5IGZpbGxzIFJGRHMgYXMgZnJhbWVzIGFycml2ZS4gIElmCisgKglyZXBsYWNlbWVudCBSRkRzIGNhbm5vdCBiZSBhbGxvY2F0ZWQsIG9yIHRoZSBSVSBnb2VzIG5vbi1hY3RpdmUsCisgKgl0aGUgUlUgbXVzdCBiZSByZXN0YXJ0ZWQuICBGcmFtZSBhcnJpdmFsIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQsCisgKglhbmQgUnggaW5kaWNhdGlvbiBhbmQgcmUtYWxsb2NhdGlvbiBoYXBwZW4gaW4gdGhlIHNhbWUgY29udGV4dCwKKyAqCXRoZXJlZm9yZSBubyBsb2NraW5nIGlzIHJlcXVpcmVkLiAgQSBzb2Z0d2FyZS1nZW5lcmF0ZWQgaW50ZXJydXB0CisgKglpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgd2F0Y2hkb2cgdG8gcmVjb3ZlciBmcm9tIGEgZmFpbGVkIGFsbG9jYXRpb24KKyAqCXNlbmFyaW8gd2hlcmUgYWxsIFJ4IHJlc291cmNlcyBoYXZlIGJlZW4gaW5kaWNhdGVkIGFuZCBub25lIHJlLQorICoJcGxhY2VkLgorICoKKyAqCVYuICAgTWlzY2VsbGFuZW91cworICoKKyAqIAlWTEFOIG9mZmxvYWRpbmcgb2YgdGFnZ2luZywgc3RyaXBwaW5nIGFuZCBmaWx0ZXJpbmcgaXMgbm90CisgKiAJc3VwcG9ydGVkLCBidXQgZHJpdmVyIHdpbGwgYWNjb21tb2RhdGUgdGhlIGV4dHJhIDQtYnl0ZSBWTEFOIHRhZworICogCWZvciBwcm9jZXNzaW5nIGJ5IHVwcGVyIGxheWVycy4gIFR4L1J4IENoZWNrc3VtIG9mZmxvYWRpbmcgaXMgbm90CisgKiAJc3VwcG9ydGVkLiAgVHggU2NhdHRlci9HYXRoZXIgaXMgbm90IHN1cHBvcnRlZC4gIEp1bWJvIEZyYW1lcyBpcworICogCW5vdCBzdXBwb3J0ZWQgKGhhcmR3YXJlIGxpbWl0YXRpb24pLgorICoKKyAqIAlNYWdpY1BhY2tldCh0bSkgV29MIHN1cHBvcnQgaXMgZW5hYmxlZC9kaXNhYmxlZCB2aWEgZXRodG9vbC4KKyAqCisgKiAJVGhhbmtzIHRvIEpDIChqY2hhcG1hbkBrYXRhbGl4LmNvbSkgZm9yIGhlbHBpbmcgd2l0aAorICogCXRlc3RpbmcvdHJvdWJsZXNob290aW5nIHRoZSBkZXZlbG9wbWVudCBkcml2ZXIuCisgKgorICogCVRPRE86CisgKiAJbyBzZXZlcmFsIGVudHJ5IHBvaW50cyByYWNlIHdpdGggZGV2LT5jbG9zZQorICogCW8gY2hlY2sgZm9yIHR4LW5vLXJlc291cmNlcy9zdG9wIFEgcmFjZXMgd2l0aCB0eCBjbGVhbi93YWtlIFEKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisKKyNkZWZpbmUgRFJWX05BTUUJCSJlMTAwIgorI2RlZmluZSBEUlZfRVhUCQkiLU5BUEkiCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMy4zLjYtazIiRFJWX0VYVAorI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JCSJJbnRlbChSKSBQUk8vMTAwIE5ldHdvcmsgRHJpdmVyIgorI2RlZmluZSBEUlZfQ09QWVJJR0hUCQkiQ29weXJpZ2h0KGMpIDE5OTktMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbiIKKyNkZWZpbmUgUEZYCQkJRFJWX05BTUUgIjogIgorCisjZGVmaW5lIEUxMDBfV0FUQ0hET0dfUEVSSU9ECSgyICogSFopCisjZGVmaW5lIEUxMDBfTkFQSV9XRUlHSFQJMTYKKworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDUklQVElPTik7CitNT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCitzdGF0aWMgaW50IGRlYnVnID0gMzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMD1ub25lLC4uLiwxNj1hbGwpIik7CisjZGVmaW5lIERQUklOVEsobmxldmVsLCBrbGV2ZWwsIGZtdCwgYXJncy4uLikgXAorCSh2b2lkKSgoTkVUSUZfTVNHXyMjbmxldmVsICYgbmljLT5tc2dfZW5hYmxlKSAmJiBcCisJcHJpbnRrKEtFUk5fIyNrbGV2ZWwgUEZYICIlczogJXM6ICIgZm10LCBuaWMtPm5ldGRldi0+bmFtZSwgXAorCQlfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKSkKKworI2RlZmluZSBJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoZGV2aWNlX2lkLCBpY2gpIHtcCisJUENJX1ZFTkRPUl9JRF9JTlRFTCwgZGV2aWNlX2lkLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBcCisJUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQgPDwgOCwgMHhGRkZGMDAsIGljaCB9CitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZTEwMF9pZF90YWJsZVtdID0geworCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwMjksIDApLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwMzAsIDApLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwMzEsIDMpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwMzIsIDMpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwMzMsIDMpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwMzQsIDMpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwMzgsIDMpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwMzksIDQpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwM0EsIDQpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwM0IsIDQpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwM0MsIDQpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwM0QsIDQpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwM0UsIDQpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNTAsIDUpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNTEsIDUpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNTIsIDUpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNTMsIDUpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNTQsIDUpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNTUsIDUpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNTYsIDUpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNTcsIDUpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNTksIDApLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNjQsIDYpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNjUsIDYpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNjYsIDYpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNjcsIDYpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNjgsIDYpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNjksIDYpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNkEsIDYpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEwNkIsIDYpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEyMDksIDApLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDEyMjksIDApLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDI0NDksIDIpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDI0NTksIDIpLAorCUlOVEVMXzgyNTVYX0VUSEVSTkVUX0RFVklDRSgweDI0NUQsIDIpLAorCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBlMTAwX2lkX3RhYmxlKTsKKworZW51bSBtYWMgeworCW1hY184MjU1N19EMTAwX0EgID0gMCwKKwltYWNfODI1NTdfRDEwMF9CICA9IDEsCisJbWFjXzgyNTU3X0QxMDBfQyAgPSAyLAorCW1hY184MjU1OF9EMTAxX0E0ID0gNCwKKwltYWNfODI1NThfRDEwMV9CMCA9IDUsCisJbWFjXzgyNTU5X0QxMDFNICAgPSA4LAorCW1hY184MjU1OV9EMTAxUyAgID0gOSwKKwltYWNfODI1NTBfRDEwMiAgICA9IDEyLAorCW1hY184MjU1MF9EMTAyX0MgID0gMTMsCisJbWFjXzgyNTUxX0UgICAgICAgPSAxNCwKKwltYWNfODI1NTFfRiAgICAgICA9IDE1LAorCW1hY184MjU1MV8xMCAgICAgID0gMTYsCisJbWFjX3Vua25vd24gICAgICAgPSAweEZGLAorfTsKKworZW51bSBwaHkgeworCXBoeV8xMDBhICAgICA9IDB4MDAwMDAzRTAsCisJcGh5XzEwMGMgICAgID0gMHgwMzUwMDJBOCwKKwlwaHlfODI1NTVfdHggPSAweDAxNTAwMkE4LAorCXBoeV9uc2NfdHggICA9IDB4NUMwMDIwMDAsCisJcGh5XzgyNTYyX2V0ID0gMHgwMzMwMDJBOCwKKwlwaHlfODI1NjJfZW0gPSAweDAzMjAwMkE4LAorCXBoeV84MjU2Ml9layA9IDB4MDMxMDAyQTgsCisJcGh5XzgyNTYyX2VoID0gMHgwMTcwMDJBOCwKKwlwaHlfdW5rbm93biAgPSAweEZGRkZGRkZGLAorfTsKKworLyogQ1NSIChDb250cm9sL1N0YXR1cyBSZWdpc3RlcnMpICovCitzdHJ1Y3QgY3NyIHsKKwlzdHJ1Y3QgeworCQl1OCBzdGF0dXM7CisJCXU4IHN0YXRfYWNrOworCQl1OCBjbWRfbG87CisJCXU4IGNtZF9oaTsKKwkJdTMyIGdlbl9wdHI7CisJfSBzY2I7CisJdTMyIHBvcnQ7CisJdTE2IGZsYXNoX2N0cmw7CisJdTggZWVwcm9tX2N0cmxfbG87CisJdTggZWVwcm9tX2N0cmxfaGk7CisJdTMyIG1kaV9jdHJsOworCXUzMiByeF9kbWFfY291bnQ7Cit9OworCitlbnVtIHNjYl9zdGF0dXMgeworCXJ1c19yZWFkeSAgICAgICAgPSAweDEwLAorCXJ1c19tYXNrICAgICAgICAgPSAweDNDLAorfTsKKworZW51bSBzY2Jfc3RhdF9hY2sgeworCXN0YXRfYWNrX25vdF9vdXJzICAgID0gMHgwMCwKKwlzdGF0X2Fja19zd19nZW4gICAgICA9IDB4MDQsCisJc3RhdF9hY2tfcm5yICAgICAgICAgPSAweDEwLAorCXN0YXRfYWNrX2N1X2lkbGUgICAgID0gMHgyMCwKKwlzdGF0X2Fja19mcmFtZV9yeCAgICA9IDB4NDAsCisJc3RhdF9hY2tfY3VfY21kX2RvbmUgPSAweDgwLAorCXN0YXRfYWNrX25vdF9wcmVzZW50ID0gMHhGRiwKKwlzdGF0X2Fja19yeCA9IChzdGF0X2Fja19zd19nZW4gfCBzdGF0X2Fja19ybnIgfCBzdGF0X2Fja19mcmFtZV9yeCksCisJc3RhdF9hY2tfdHggPSAoc3RhdF9hY2tfY3VfaWRsZSB8IHN0YXRfYWNrX2N1X2NtZF9kb25lKSwKK307CisKK2VudW0gc2NiX2NtZF9oaSB7CisJaXJxX21hc2tfbm9uZSA9IDB4MDAsCisJaXJxX21hc2tfYWxsICA9IDB4MDEsCisJaXJxX3N3X2dlbiAgICA9IDB4MDIsCit9OworCitlbnVtIHNjYl9jbWRfbG8geworCWN1Y19ub3AgICAgICAgID0gMHgwMCwKKwlydWNfc3RhcnQgICAgICA9IDB4MDEsCisJcnVjX2xvYWRfYmFzZSAgPSAweDA2LAorCWN1Y19zdGFydCAgICAgID0gMHgxMCwKKwljdWNfcmVzdW1lICAgICA9IDB4MjAsCisJY3VjX2R1bXBfYWRkciAgPSAweDQwLAorCWN1Y19kdW1wX3N0YXRzID0gMHg1MCwKKwljdWNfbG9hZF9iYXNlICA9IDB4NjAsCisJY3VjX2R1bXBfcmVzZXQgPSAweDcwLAorfTsKKworZW51bSBjdWNfZHVtcCB7CisJY3VjX2R1bXBfY29tcGxldGUgICAgICAgPSAweDAwMDBBMDA1LAorCWN1Y19kdW1wX3Jlc2V0X2NvbXBsZXRlID0gMHgwMDAwQTAwNywKK307CisJCQorZW51bSBwb3J0IHsKKwlzb2Z0d2FyZV9yZXNldCAgPSAweDAwMDAsCisJc2VsZnRlc3QgICAgICAgID0gMHgwMDAxLAorCXNlbGVjdGl2ZV9yZXNldCA9IDB4MDAwMiwKK307CisKK2VudW0gZWVwcm9tX2N0cmxfbG8geworCWVlc2sgPSAweDAxLAorCWVlY3MgPSAweDAyLAorCWVlZGkgPSAweDA0LAorCWVlZG8gPSAweDA4LAorfTsKKworZW51bSBtZGlfY3RybCB7CisJbWRpX3dyaXRlID0gMHgwNDAwMDAwMCwKKwltZGlfcmVhZCAgPSAweDA4MDAwMDAwLAorCW1kaV9yZWFkeSA9IDB4MTAwMDAwMDAsCit9OworCitlbnVtIGVlcHJvbV9vcCB7CisJb3Bfd3JpdGUgPSAweDA1LAorCW9wX3JlYWQgID0gMHgwNiwKKwlvcF9ld2RzICA9IDB4MTAsCisJb3BfZXdlbiAgPSAweDEzLAorfTsKKworZW51bSBlZXByb21fb2Zmc2V0cyB7CisJZWVwcm9tX2NuZmdfbWRpeCAgPSAweDAzLAorCWVlcHJvbV9pZCAgICAgICAgID0gMHgwQSwKKwllZXByb21fY29uZmlnX2FzZiA9IDB4MEQsCisJZWVwcm9tX3NtYnVzX2FkZHIgPSAweDkwLAorfTsKKworZW51bSBlZXByb21fY25mZ19tZGl4IHsKKwllZXByb21fbWRpeF9lbmFibGVkID0gMHgwMDgwLAorfTsKKworZW51bSBlZXByb21faWQgeworCWVlcHJvbV9pZF93b2wgPSAweDAwMjAsCit9OworCitlbnVtIGVlcHJvbV9jb25maWdfYXNmIHsKKwllZXByb21fYXNmID0gMHg4MDAwLAorCWVlcHJvbV9nY2wgPSAweDQwMDAsCit9OworCitlbnVtIGNiX3N0YXR1cyB7CisJY2JfY29tcGxldGUgPSAweDgwMDAsCisJY2Jfb2sgICAgICAgPSAweDIwMDAsCit9OworCitlbnVtIGNiX2NvbW1hbmQgeworCWNiX25vcCAgICA9IDB4MDAwMCwKKwljYl9pYWFkZHIgPSAweDAwMDEsCisJY2JfY29uZmlnID0gMHgwMDAyLAorCWNiX211bHRpICA9IDB4MDAwMywKKwljYl90eCAgICAgPSAweDAwMDQsCisJY2JfdWNvZGUgID0gMHgwMDA1LAorCWNiX2R1bXAgICA9IDB4MDAwNiwKKwljYl90eF9zZiAgPSAweDAwMDgsCisJY2JfY2lkICAgID0gMHgxZjAwLAorCWNiX2kgICAgICA9IDB4MjAwMCwKKwljYl9zICAgICAgPSAweDQwMDAsCisJY2JfZWwgICAgID0gMHg4MDAwLAorfTsKKworc3RydWN0IHJmZCB7CisJdTE2IHN0YXR1czsKKwl1MTYgY29tbWFuZDsKKwl1MzIgbGluazsKKwl1MzIgcmJkOworCXUxNiBhY3R1YWxfc2l6ZTsKKwl1MTYgc2l6ZTsKK307CisKK3N0cnVjdCByeCB7CisJc3RydWN0IHJ4ICpuZXh0LCAqcHJldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7Cit9OworCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisjZGVmaW5lIFgoYSxiKQliLGEKKyNlbHNlCisjZGVmaW5lIFgoYSxiKQlhLGIKKyNlbmRpZgorc3RydWN0IGNvbmZpZyB7CisvKjAqLwl1OCBYKGJ5dGVfY291bnQ6NiwgcGFkMDoyKTsKKy8qMSovCXU4IFgoWChyeF9maWZvX2xpbWl0OjQsIHR4X2ZpZm9fbGltaXQ6MyksIHBhZDE6MSk7CisvKjIqLwl1OCBhZGFwdGl2ZV9pZnM7CisvKjMqLwl1OCBYKFgoWChYKG13aV9lbmFibGU6MSwgdHlwZV9lbmFibGU6MSksIHJlYWRfYWxpZ25fZW5hYmxlOjEpLAorCSAgIHRlcm1fd3JpdGVfY2FjaGVfbGluZToxKSwgcGFkMzo0KTsKKy8qNCovCXU4IFgocnhfZG1hX21heF9jb3VudDo3LCBwYWQ0OjEpOworLyo1Ki8JdTggWCh0eF9kbWFfbWF4X2NvdW50OjcsIGRtYV9tYXhfY291bnRfZW5hYmxlOjEpOworLyo2Ki8JdTggWChYKFgoWChYKFgoWChsYXRlX3NjYl91cGRhdGU6MSwgZGlyZWN0X3J4X2RtYToxKSwKKwkgICB0bm9faW50cjoxKSwgY25hX2ludHI6MSksIHN0YW5kYXJkX3RjYjoxKSwgc3RhbmRhcmRfc3RhdF9jb3VudGVyOjEpLAorCSAgIHJ4X2Rpc2NhcmRfb3ZlcnJ1bnM6MSksIHJ4X3NhdmVfYmFkX2ZyYW1lczoxKTsKKy8qNyovCXU4IFgoWChYKFgoWChyeF9kaXNjYXJkX3Nob3J0X2ZyYW1lczoxLCB0eF91bmRlcnJ1bl9yZXRyeToyKSwKKwkgICBwYWQ3OjIpLCByeF9leHRlbmRlZF9yZmQ6MSksIHR4X3R3b19mcmFtZXNfaW5fZmlmbzoxKSwKKwkgICB0eF9keW5hbWljX3RiZDoxKTsKKy8qOCovCXU4IFgoWChtaWlfbW9kZToxLCBwYWQ4OjYpLCBjc21hX2Rpc2FibGVkOjEpOworLyo5Ki8JdTggWChYKFgoWChYKHJ4X3RjcHVkcF9jaGVja3N1bToxLCBwYWQ5OjMpLCB2bGFuX2FycF90Y286MSksCisJICAgbGlua19zdGF0dXNfd2FrZToxKSwgYXJwX3dha2U6MSksIG1jbWF0Y2hfd2FrZToxKTsKKy8qMTAqLwl1OCBYKFgoWChwYWQxMDozLCBub19zb3VyY2VfYWRkcl9pbnNlcnRpb246MSksIHByZWFtYmxlX2xlbmd0aDoyKSwKKwkgICBsb29wYmFjazoyKTsKKy8qMTEqLwl1OCBYKGxpbmVhcl9wcmlvcml0eTozLCBwYWQxMTo1KTsKKy8qMTIqLwl1OCBYKFgobGluZWFyX3ByaW9yaXR5X21vZGU6MSwgcGFkMTI6MyksIGlmczo0KTsKKy8qMTMqLwl1OCBpcF9hZGRyX2xvOworLyoxNCovCXU4IGlwX2FkZHJfaGk7CisvKjE1Ki8JdTggWChYKFgoWChYKFgoWChwcm9taXNjdW91c19tb2RlOjEsIGJyb2FkY2FzdF9kaXNhYmxlZDoxKSwKKwkgICB3YWl0X2FmdGVyX3dpbjoxKSwgcGFkMTVfMToxKSwgaWdub3JlX3VsX2JpdDoxKSwgY3JjXzE2X2JpdDoxKSwKKwkgICBwYWQxNV8yOjEpLCBjcnNfb3JfY2R0OjEpOworLyoxNiovCXU4IGZjX2RlbGF5X2xvOworLyoxNyovCXU4IGZjX2RlbGF5X2hpOworLyoxOCovCXU4IFgoWChYKFgoWChyeF9zdHJpcHBpbmc6MSwgdHhfcGFkZGluZzoxKSwgcnhfY3JjX3RyYW5zZmVyOjEpLAorCSAgIHJ4X2xvbmdfb2s6MSksIGZjX3ByaW9yaXR5X3RocmVzaG9sZDozKSwgcGFkMTg6MSk7CisvKjE5Ki8JdTggWChYKFgoWChYKFgoWChhZGRyX3dha2U6MSwgbWFnaWNfcGFja2V0X2Rpc2FibGU6MSksCisJICAgZmNfZGlzYWJsZToxKSwgZmNfcmVzdG9wOjEpLCBmY19yZXN0YXJ0OjEpLCBmY19yZWplY3Q6MSksCisJICAgZnVsbF9kdXBsZXhfZm9yY2U6MSksIGZ1bGxfZHVwbGV4X3BpbjoxKTsKKy8qMjAqLwl1OCBYKFgoWChwYWQyMF8xOjUsIGZjX3ByaW9yaXR5X2xvY2F0aW9uOjEpLCBtdWx0aV9pYToxKSwgcGFkMjBfMjoxKTsKKy8qMjEqLwl1OCBYKFgocGFkMjFfMTozLCBtdWx0aWNhc3RfYWxsOjEpLCBwYWQyMV8yOjQpOworLyoyMiovCXU4IFgoWChyeF9kMTAyX21vZGU6MSwgcnhfdmxhbl9kcm9wOjEpLCBwYWQyMjo2KTsKKwl1OCBwYWRfZDEwMls5XTsKK307CisKKyNkZWZpbmUgRTEwMF9NQVhfTVVMVElDQVNUX0FERFJTCTY0CitzdHJ1Y3QgbXVsdGkgeworCXUxNiBjb3VudDsKKwl1OCBhZGRyW0UxMDBfTUFYX01VTFRJQ0FTVF9BRERSUyAqIEVUSF9BTEVOICsgMi8qcGFkKi9dOworfTsKKworLyogSW1wb3J0YW50OiBrZWVwIHRvdGFsIHN0cnVjdCB1MzItYWxpZ25lZCAqLworI2RlZmluZSBVQ09ERV9TSVpFCQkJMTM0CitzdHJ1Y3QgY2IgeworCXUxNiBzdGF0dXM7CisJdTE2IGNvbW1hbmQ7CisJdTMyIGxpbms7CisJdW5pb24geworCQl1OCBpYWFkZHJbRVRIX0FMRU5dOworCQl1MzIgdWNvZGVbVUNPREVfU0laRV07CisJCXN0cnVjdCBjb25maWcgY29uZmlnOworCQlzdHJ1Y3QgbXVsdGkgbXVsdGk7CisJCXN0cnVjdCB7CisJCQl1MzIgdGJkX2FycmF5OworCQkJdTE2IHRjYl9ieXRlX2NvdW50OworCQkJdTggdGhyZXNob2xkOworCQkJdTggdGJkX2NvdW50OworCQkJc3RydWN0IHsKKwkJCQl1MzIgYnVmX2FkZHI7CisJCQkJdTE2IHNpemU7CisJCQkJdTE2IGVvbDsKKwkJCX0gdGJkOworCQl9IHRjYjsKKwkJdTMyIGR1bXBfYnVmZmVyX2FkZHI7CisJfSB1OworCXN0cnVjdCBjYiAqbmV4dCwgKnByZXY7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworfTsKKworZW51bSBsb29wYmFjayB7CisJbGJfbm9uZSA9IDAsIGxiX21hYyA9IDEsIGxiX3BoeSA9IDMsCit9OworCitzdHJ1Y3Qgc3RhdHMgeworCXUzMiB0eF9nb29kX2ZyYW1lcywgdHhfbWF4X2NvbGxpc2lvbnMsIHR4X2xhdGVfY29sbGlzaW9ucywKKwkJdHhfdW5kZXJydW5zLCB0eF9sb3N0X2NycywgdHhfZGVmZXJyZWQsIHR4X3NpbmdsZV9jb2xsaXNpb25zLAorCQl0eF9tdWx0aXBsZV9jb2xsaXNpb25zLCB0eF90b3RhbF9jb2xsaXNpb25zOworCXUzMiByeF9nb29kX2ZyYW1lcywgcnhfY3JjX2Vycm9ycywgcnhfYWxpZ25tZW50X2Vycm9ycywKKwkJcnhfcmVzb3VyY2VfZXJyb3JzLCByeF9vdmVycnVuX2Vycm9ycywgcnhfY2R0X2Vycm9ycywKKwkJcnhfc2hvcnRfZnJhbWVfZXJyb3JzOworCXUzMiBmY194bXRfcGF1c2UsIGZjX3Jjdl9wYXVzZSwgZmNfcmN2X3Vuc3VwcG9ydGVkOworCXUxNiB4bXRfdGNvX2ZyYW1lcywgcmN2X3Rjb19mcmFtZXM7CisJdTMyIGNvbXBsZXRlOworfTsKKworc3RydWN0IG1lbSB7CisJc3RydWN0IHsKKwkJdTMyIHNpZ25hdHVyZTsKKwkJdTMyIHJlc3VsdDsKKwl9IHNlbGZ0ZXN0OworCXN0cnVjdCBzdGF0cyBzdGF0czsKKwl1OCBkdW1wX2J1Zls1OTZdOworfTsKKworc3RydWN0IHBhcmFtX3JhbmdlIHsKKwl1MzIgbWluOworCXUzMiBtYXg7CisJdTMyIGNvdW50OworfTsKKworc3RydWN0IHBhcmFtcyB7CisJc3RydWN0IHBhcmFtX3JhbmdlIHJmZHM7CisJc3RydWN0IHBhcmFtX3JhbmdlIGNiczsKK307CisKK3N0cnVjdCBuaWMgeworCS8qIEJlZ2luOiBmcmVxdWVudGx5IHVzZWQgdmFsdWVzOiBrZWVwIGFkamFjZW50IGZvciBjYWNoZSBlZmZlY3QgKi8KKwl1MzIgbXNnX2VuYWJsZQkJCQlfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCXN0cnVjdCByeCAqcnhzCQkJCV9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwlzdHJ1Y3QgcnggKnJ4X3RvX3VzZTsKKwlzdHJ1Y3QgcnggKnJ4X3RvX2NsZWFuOworCXN0cnVjdCByZmQgYmxhbmtfcmZkOworCWludCBydV9ydW5uaW5nOworCisJc3BpbmxvY2tfdCBjYl9sb2NrCQkJX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXNwaW5sb2NrX3QgY21kX2xvY2s7CisJc3RydWN0IGNzciBfX2lvbWVtICpjc3I7CisJZW51bSBzY2JfY21kX2xvIGN1Y19jbWQ7CisJdW5zaWduZWQgaW50IGNic19hdmFpbDsKKwlzdHJ1Y3QgY2IgKmNiczsKKwlzdHJ1Y3QgY2IgKmNiX3RvX3VzZTsKKwlzdHJ1Y3QgY2IgKmNiX3RvX3NlbmQ7CisJc3RydWN0IGNiICpjYl90b19jbGVhbjsKKwl1MTYgdHhfY29tbWFuZDsKKwkvKiBFbmQ6IGZyZXF1ZW50bHkgdXNlZCB2YWx1ZXM6IGtlZXAgYWRqYWNlbnQgZm9yIGNhY2hlIGVmZmVjdCAqLworCisJZW51bSB7CisJCWljaCAgICAgICAgICAgICAgICA9ICgxIDw8IDApLAorCQlwcm9taXNjdW91cyAgICAgICAgPSAoMSA8PCAxKSwKKwkJbXVsdGljYXN0X2FsbCAgICAgID0gKDEgPDwgMiksCisJCXdvbF9tYWdpYyAgICAgICAgICA9ICgxIDw8IDMpLAorCQlpY2hfMTBoX3dvcmthcm91bmQgPSAoMSA8PCA0KSwKKwl9IGZsYWdzCQkJCQlfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKKwllbnVtIG1hYyBtYWM7CisJZW51bSBwaHkgcGh5OworCXN0cnVjdCBwYXJhbXMgcGFyYW1zOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZzsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBibGlua190aW1lcjsKKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpOworCWVudW0gbG9vcGJhY2sgbG9vcGJhY2s7CisKKwlzdHJ1Y3QgbWVtICptZW07CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCWRtYV9hZGRyX3QgY2JzX2RtYV9hZGRyOworCXU4IGFkYXB0aXZlX2lmczsKKwl1OCB0eF90aHJlc2hvbGQ7CisJdTMyIHR4X2ZyYW1lczsKKwl1MzIgdHhfY29sbGlzaW9uczsKKwl1MzIgdHhfZGVmZXJyZWQ7CisJdTMyIHR4X3NpbmdsZV9jb2xsaXNpb25zOworCXUzMiB0eF9tdWx0aXBsZV9jb2xsaXNpb25zOworCXUzMiB0eF9mY19wYXVzZTsKKwl1MzIgdHhfdGNvX2ZyYW1lczsKKworCXUzMiByeF9mY19wYXVzZTsKKwl1MzIgcnhfZmNfdW5zdXBwb3J0ZWQ7CisJdTMyIHJ4X3Rjb19mcmFtZXM7CisJdTMyIHJ4X292ZXJfbGVuZ3RoX2Vycm9yczsKKworCXU4IHJldl9pZDsKKwl1MTYgbGVkczsKKwl1MTYgZWVwcm9tX3djOworCXUxNiBlZXByb21bMjU2XTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlMTAwX3dyaXRlX2ZsdXNoKHN0cnVjdCBuaWMgKm5pYykKK3sKKwkvKiBGbHVzaCBwcmV2aW91cyBQQ0kgd3JpdGVzIHRocm91Z2ggaW50ZXJtZWRpYXRlIGJyaWRnZXMKKwkgKiBieSBkb2luZyBhIGJlbmlnbiByZWFkICovCisJKHZvaWQpcmVhZGIoJm5pYy0+Y3NyLT5zY2Iuc3RhdHVzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGUxMDBfZW5hYmxlX2lycShzdHJ1Y3QgbmljICpuaWMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZuaWMtPmNtZF9sb2NrLCBmbGFncyk7CisJd3JpdGViKGlycV9tYXNrX25vbmUsICZuaWMtPmNzci0+c2NiLmNtZF9oaSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmljLT5jbWRfbG9jaywgZmxhZ3MpOworCWUxMDBfd3JpdGVfZmx1c2gobmljKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGUxMDBfZGlzYWJsZV9pcnEoc3RydWN0IG5pYyAqbmljKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmljLT5jbWRfbG9jaywgZmxhZ3MpOworCXdyaXRlYihpcnFfbWFza19hbGwsICZuaWMtPmNzci0+c2NiLmNtZF9oaSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmljLT5jbWRfbG9jaywgZmxhZ3MpOworCWUxMDBfd3JpdGVfZmx1c2gobmljKTsKK30KKworc3RhdGljIHZvaWQgZTEwMF9od19yZXNldChzdHJ1Y3QgbmljICpuaWMpCit7CisJLyogUHV0IENVIGFuZCBSVSBpbnRvIGlkbGUgd2l0aCBhIHNlbGVjdGl2ZSByZXNldCB0byBnZXQKKwkgKiBkZXZpY2Ugb2ZmIG9mIFBDSSBidXMgKi8KKwl3cml0ZWwoc2VsZWN0aXZlX3Jlc2V0LCAmbmljLT5jc3ItPnBvcnQpOworCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDIwKTsKKworCS8qIE5vdyBmdWxseSByZXNldCBkZXZpY2UgKi8KKwl3cml0ZWwoc29mdHdhcmVfcmVzZXQsICZuaWMtPmNzci0+cG9ydCk7CisJZTEwMF93cml0ZV9mbHVzaChuaWMpOyB1ZGVsYXkoMjApOworCisJLyogTWFzayBvZmYgb3VyIGludGVycnVwdCBsaW5lIC0gaXQncyB1bm1hc2tlZCBhZnRlciByZXNldCAqLworCWUxMDBfZGlzYWJsZV9pcnEobmljKTsKK30KKworc3RhdGljIGludCBlMTAwX3NlbGZfdGVzdChzdHJ1Y3QgbmljICpuaWMpCit7CisJdTMyIGRtYV9hZGRyID0gbmljLT5kbWFfYWRkciArIG9mZnNldG9mKHN0cnVjdCBtZW0sIHNlbGZ0ZXN0KTsKKworCS8qIFBhc3NpbmcgdGhlIHNlbGYtdGVzdCBpcyBhIHByZXR0eSBnb29kIGluZGljYXRpb24KKwkgKiB0aGF0IHRoZSBkZXZpY2UgY2FuIERNQSB0by9mcm9tIGhvc3QgbWVtb3J5ICovCisKKwluaWMtPm1lbS0+c2VsZnRlc3Quc2lnbmF0dXJlID0gMDsKKwluaWMtPm1lbS0+c2VsZnRlc3QucmVzdWx0ID0gMHhGRkZGRkZGRjsKKworCXdyaXRlbChzZWxmdGVzdCB8IGRtYV9hZGRyLCAmbmljLT5jc3ItPnBvcnQpOworCWUxMDBfd3JpdGVfZmx1c2gobmljKTsKKwkvKiBXYWl0IDEwIG1zZWMgZm9yIHNlbGYtdGVzdCB0byBjb21wbGV0ZSAqLworCW1zbGVlcCgxMCk7CisKKwkvKiBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGFmdGVyIHNlbGYtdGVzdCAqLworCWUxMDBfZGlzYWJsZV9pcnEobmljKTsKKworCS8qIENoZWNrIHJlc3VsdHMgb2Ygc2VsZi10ZXN0ICovCisJaWYobmljLT5tZW0tPnNlbGZ0ZXN0LnJlc3VsdCAhPSAwKSB7CisJCURQUklOVEsoSFcsIEVSUiwgIlNlbGYtdGVzdCBmYWlsZWQ6IHJlc3VsdD0weCUwOFhcbiIsCisJCQluaWMtPm1lbS0+c2VsZnRlc3QucmVzdWx0KTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCWlmKG5pYy0+bWVtLT5zZWxmdGVzdC5zaWduYXR1cmUgPT0gMCkgeworCQlEUFJJTlRLKEhXLCBFUlIsICJTZWxmLXRlc3QgZmFpbGVkOiB0aW1lZCBvdXRcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZTEwMF9lZXByb21fd3JpdGUoc3RydWN0IG5pYyAqbmljLCB1MTYgYWRkcl9sZW4sIHUxNiBhZGRyLCB1MTYgZGF0YSkKK3sKKwl1MzIgY21kX2FkZHJfZGF0YVszXTsKKwl1OCBjdHJsOworCWludCBpLCBqOworCisJLyogVGhyZWUgY21kczogd3JpdGUvZXJhc2UgZW5hYmxlLCB3cml0ZSBkYXRhLCB3cml0ZS9lcmFzZSBkaXNhYmxlICovCisJY21kX2FkZHJfZGF0YVswXSA9IG9wX2V3ZW4gPDwgKGFkZHJfbGVuIC0gMik7CisJY21kX2FkZHJfZGF0YVsxXSA9ICgoKG9wX3dyaXRlIDw8IGFkZHJfbGVuKSB8IGFkZHIpIDw8IDE2KSB8CisJCWNwdV90b19sZTE2KGRhdGEpOworCWNtZF9hZGRyX2RhdGFbMl0gPSBvcF9ld2RzIDw8IChhZGRyX2xlbiAtIDIpOworCisJLyogQml0LWJhbmcgY21kcyB0byB3cml0ZSB3b3JkIHRvIGVlcHJvbSAqLworCWZvcihqID0gMDsgaiA8IDM7IGorKykgeworCisJCS8qIENoaXAgc2VsZWN0ICovCisJCXdyaXRlYihlZWNzIHwgZWVzaywgJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CisJCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDQpOworCisJCWZvcihpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJCQljdHJsID0gKGNtZF9hZGRyX2RhdGFbal0gJiAoMSA8PCBpKSkgPworCQkJCWVlY3MgfCBlZWRpIDogZWVjczsKKwkJCXdyaXRlYihjdHJsLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKKwkJCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDQpOworCisJCQl3cml0ZWIoY3RybCB8IGVlc2ssICZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOworCQkJZTEwMF93cml0ZV9mbHVzaChuaWMpOyB1ZGVsYXkoNCk7CisJCX0KKwkJLyogV2FpdCAxMCBtc2VjIGZvciBjbWQgdG8gY29tcGxldGUgKi8KKwkJbXNsZWVwKDEwKTsKKworCQkvKiBDaGlwIGRlc2VsZWN0ICovCisJCXdyaXRlYigwLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKKwkJZTEwMF93cml0ZV9mbHVzaChuaWMpOyB1ZGVsYXkoNCk7CisJfQorfTsKKworLyogR2VuZXJhbCB0ZWNobmlxdWUgc3RvbGVuIGZyb20gdGhlIGVlcHJvMTAwIGRyaXZlciAtIHZlcnkgY2xldmVyICovCitzdGF0aWMgdTE2IGUxMDBfZWVwcm9tX3JlYWQoc3RydWN0IG5pYyAqbmljLCB1MTYgKmFkZHJfbGVuLCB1MTYgYWRkcikKK3sKKwl1MzIgY21kX2FkZHJfZGF0YTsKKwl1MTYgZGF0YSA9IDA7CisJdTggY3RybDsKKwlpbnQgaTsKKworCWNtZF9hZGRyX2RhdGEgPSAoKG9wX3JlYWQgPDwgKmFkZHJfbGVuKSB8IGFkZHIpIDw8IDE2OworCisJLyogQ2hpcCBzZWxlY3QgKi8KKwl3cml0ZWIoZWVjcyB8IGVlc2ssICZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOworCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDQpOworCisJLyogQml0LWJhbmcgdG8gcmVhZCB3b3JkIGZyb20gZWVwcm9tICovCisJZm9yKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwkJY3RybCA9IChjbWRfYWRkcl9kYXRhICYgKDEgPDwgaSkpID8gZWVjcyB8IGVlZGkgOiBlZWNzOworCQl3cml0ZWIoY3RybCwgJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CisJCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDQpOworCQkKKwkJd3JpdGViKGN0cmwgfCBlZXNrLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKKwkJZTEwMF93cml0ZV9mbHVzaChuaWMpOyB1ZGVsYXkoNCk7CisJCQorCQkvKiBFZXByb20gZHJpdmVzIGEgZHVtbXkgemVybyB0byBFRURPIGFmdGVyIHJlY2VpdmluZworCQkgKiBjb21wbGV0ZSBhZGRyZXNzLiAgVXNlIHRoaXMgdG8gYWRqdXN0IGFkZHJfbGVuLiAqLworCQljdHJsID0gcmVhZGIoJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CisJCWlmKCEoY3RybCAmIGVlZG8pICYmIGkgPiAxNikgeworCQkJKmFkZHJfbGVuIC09IChpIC0gMTYpOworCQkJaSA9IDE3OworCQl9CisJCQorCQlkYXRhID0gKGRhdGEgPDwgMSkgfCAoY3RybCAmIGVlZG8gPyAxIDogMCk7CisJfQorCisJLyogQ2hpcCBkZXNlbGVjdCAqLworCXdyaXRlYigwLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKKwllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7IHVkZWxheSg0KTsKKworCXJldHVybiBsZTE2X3RvX2NwdShkYXRhKTsKK307CisKKy8qIExvYWQgZW50aXJlIEVFUFJPTSBpbWFnZSBpbnRvIGRyaXZlciBjYWNoZSBhbmQgdmFsaWRhdGUgY2hlY2tzdW0gKi8KK3N0YXRpYyBpbnQgZTEwMF9lZXByb21fbG9hZChzdHJ1Y3QgbmljICpuaWMpCit7CisJdTE2IGFkZHIsIGFkZHJfbGVuID0gOCwgY2hlY2tzdW0gPSAwOworCisJLyogVHJ5IHJlYWRpbmcgd2l0aCBhbiA4LWJpdCBhZGRyIGxlbiB0byBkaXNjb3ZlciBhY3R1YWwgYWRkciBsZW4gKi8KKwllMTAwX2VlcHJvbV9yZWFkKG5pYywgJmFkZHJfbGVuLCAwKTsKKwluaWMtPmVlcHJvbV93YyA9IDEgPDwgYWRkcl9sZW47CisKKwlmb3IoYWRkciA9IDA7IGFkZHIgPCBuaWMtPmVlcHJvbV93YzsgYWRkcisrKSB7CisJCW5pYy0+ZWVwcm9tW2FkZHJdID0gZTEwMF9lZXByb21fcmVhZChuaWMsICZhZGRyX2xlbiwgYWRkcik7CisJCWlmKGFkZHIgPCBuaWMtPmVlcHJvbV93YyAtIDEpCisJCQljaGVja3N1bSArPSBjcHVfdG9fbGUxNihuaWMtPmVlcHJvbVthZGRyXSk7CisJfQorCisJLyogVGhlIGNoZWNrc3VtLCBzdG9yZWQgaW4gdGhlIGxhc3Qgd29yZCwgaXMgY2FsY3VsYXRlZCBzdWNoIHRoYXQKKwkgKiB0aGUgc3VtIG9mIHdvcmRzIHNob3VsZCBiZSAweEJBQkEgKi8KKwljaGVja3N1bSA9IGxlMTZfdG9fY3B1KDB4QkFCQSAtIGNoZWNrc3VtKTsKKwlpZihjaGVja3N1bSAhPSBuaWMtPmVlcHJvbVtuaWMtPmVlcHJvbV93YyAtIDFdKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgIkVFUFJPTSBjb3JydXB0ZWRcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogU2F2ZSAocG9ydGlvbiBvZikgZHJpdmVyIEVFUFJPTSBjYWNoZSB0byBkZXZpY2UgYW5kIHVwZGF0ZSBjaGVja3N1bSAqLworc3RhdGljIGludCBlMTAwX2VlcHJvbV9zYXZlKHN0cnVjdCBuaWMgKm5pYywgdTE2IHN0YXJ0LCB1MTYgY291bnQpCit7CisJdTE2IGFkZHIsIGFkZHJfbGVuID0gOCwgY2hlY2tzdW0gPSAwOworCisJLyogVHJ5IHJlYWRpbmcgd2l0aCBhbiA4LWJpdCBhZGRyIGxlbiB0byBkaXNjb3ZlciBhY3R1YWwgYWRkciBsZW4gKi8KKwllMTAwX2VlcHJvbV9yZWFkKG5pYywgJmFkZHJfbGVuLCAwKTsKKwluaWMtPmVlcHJvbV93YyA9IDEgPDwgYWRkcl9sZW47CisKKwlpZihzdGFydCArIGNvdW50ID49IG5pYy0+ZWVwcm9tX3djKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvcihhZGRyID0gc3RhcnQ7IGFkZHIgPCBzdGFydCArIGNvdW50OyBhZGRyKyspCisJCWUxMDBfZWVwcm9tX3dyaXRlKG5pYywgYWRkcl9sZW4sIGFkZHIsIG5pYy0+ZWVwcm9tW2FkZHJdKTsKKworCS8qIFRoZSBjaGVja3N1bSwgc3RvcmVkIGluIHRoZSBsYXN0IHdvcmQsIGlzIGNhbGN1bGF0ZWQgc3VjaCB0aGF0CisJICogdGhlIHN1bSBvZiB3b3JkcyBzaG91bGQgYmUgMHhCQUJBICovCisJZm9yKGFkZHIgPSAwOyBhZGRyIDwgbmljLT5lZXByb21fd2MgLSAxOyBhZGRyKyspCisJCWNoZWNrc3VtICs9IGNwdV90b19sZTE2KG5pYy0+ZWVwcm9tW2FkZHJdKTsKKwluaWMtPmVlcHJvbVtuaWMtPmVlcHJvbV93YyAtIDFdID0gbGUxNl90b19jcHUoMHhCQUJBIC0gY2hlY2tzdW0pOworCWUxMDBfZWVwcm9tX3dyaXRlKG5pYywgYWRkcl9sZW4sIG5pYy0+ZWVwcm9tX3djIC0gMSwKKwkJbmljLT5lZXByb21bbmljLT5lZXByb21fd2MgLSAxXSk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBFMTAwX1dBSVRfU0NCX1RJTUVPVVQgNDAKK3N0YXRpYyBpbmxpbmUgaW50IGUxMDBfZXhlY19jbWQoc3RydWN0IG5pYyAqbmljLCB1OCBjbWQsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZuaWMtPmNtZF9sb2NrLCBmbGFncyk7CisKKwkvKiBQcmV2aW91cyBjb21tYW5kIGlzIGFjY2VwdGVkIHdoZW4gU0NCIGNsZWFycyAqLworCWZvcihpID0gMDsgaSA8IEUxMDBfV0FJVF9TQ0JfVElNRU9VVDsgaSsrKSB7CisJCWlmKGxpa2VseSghcmVhZGIoJm5pYy0+Y3NyLT5zY2IuY21kX2xvKSkpCisJCQlicmVhazsKKwkJY3B1X3JlbGF4KCk7CisJCWlmKHVubGlrZWx5KGkgPiAoRTEwMF9XQUlUX1NDQl9USU1FT1VUID4+IDEpKSkKKwkJCXVkZWxheSg1KTsKKwl9CisJaWYodW5saWtlbHkoaSA9PSBFMTAwX1dBSVRfU0NCX1RJTUVPVVQpKSB7CisJCWVyciA9IC1FQUdBSU47CisJCWdvdG8gZXJyX3VubG9jazsKKwl9CisKKwlpZih1bmxpa2VseShjbWQgIT0gY3VjX3Jlc3VtZSkpCisJCXdyaXRlbChkbWFfYWRkciwgJm5pYy0+Y3NyLT5zY2IuZ2VuX3B0cik7CisJd3JpdGViKGNtZCwgJm5pYy0+Y3NyLT5zY2IuY21kX2xvKTsKKworZXJyX3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuaWMtPmNtZF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludCBlMTAwX2V4ZWNfY2Ioc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCXZvaWQgKCpjYl9wcmVwYXJlKShzdHJ1Y3QgbmljICosIHN0cnVjdCBjYiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlzdHJ1Y3QgY2IgKmNiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmljLT5jYl9sb2NrLCBmbGFncyk7CisKKwlpZih1bmxpa2VseSghbmljLT5jYnNfYXZhaWwpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VubG9jazsKKwl9CisKKwljYiA9IG5pYy0+Y2JfdG9fdXNlOworCW5pYy0+Y2JfdG9fdXNlID0gY2ItPm5leHQ7CisJbmljLT5jYnNfYXZhaWwtLTsKKwljYi0+c2tiID0gc2tiOworCisJaWYodW5saWtlbHkoIW5pYy0+Y2JzX2F2YWlsKSkKKwkJZXJyID0gLUVOT1NQQzsKKworCWNiX3ByZXBhcmUobmljLCBjYiwgc2tiKTsKKworCS8qIE9yZGVyIGlzIGltcG9ydGFudCBvdGhlcndpc2Ugd2UnbGwgYmUgaW4gYSByYWNlIHdpdGggaC93OgorCSAqIHNldCBTLWJpdCBpbiBjdXJyZW50IGZpcnN0LCB0aGVuIGNsZWFyIFMtYml0IGluIHByZXZpb3VzLiAqLworCWNiLT5jb21tYW5kIHw9IGNwdV90b19sZTE2KGNiX3MpOworCXdtYigpOworCWNiLT5wcmV2LT5jb21tYW5kICY9IGNwdV90b19sZTE2KH5jYl9zKTsKKworCXdoaWxlKG5pYy0+Y2JfdG9fc2VuZCAhPSBuaWMtPmNiX3RvX3VzZSkgeworCQlpZih1bmxpa2VseShlMTAwX2V4ZWNfY21kKG5pYywgbmljLT5jdWNfY21kLAorCQkJbmljLT5jYl90b19zZW5kLT5kbWFfYWRkcikpKSB7CisJCQkvKiBPaywgaGVyZSdzIHdoZXJlIHRoaW5ncyBnZXQgc3RpY2t5LiAgSXQncworCQkJICogcG9zc2libGUgdGhhdCB3ZSBjYW4ndCBzY2hlZHVsZSB0aGUgY29tbWFuZAorCQkJICogYmVjYXVzZSB0aGUgY29udHJvbGxlciBpcyB0b28gYnVzeSwgc28KKwkJCSAqIGxldCdzIGp1c3QgcXVldWUgdGhlIGNvbW1hbmQgYW5kIHRyeSBhZ2FpbgorCQkJICogd2hlbiBhbm90aGVyIGNvbW1hbmQgaXMgc2NoZWR1bGVkLiAqLworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQluaWMtPmN1Y19jbWQgPSBjdWNfcmVzdW1lOworCQkJbmljLT5jYl90b19zZW5kID0gbmljLT5jYl90b19zZW5kLT5uZXh0OworCQl9CisJfQorCitlcnJfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5pYy0+Y2JfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHUxNiBtZGlvX2N0cmwoc3RydWN0IG5pYyAqbmljLCB1MzIgYWRkciwgdTMyIGRpciwgdTMyIHJlZywgdTE2IGRhdGEpCit7CisJdTMyIGRhdGFfb3V0ID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXdyaXRlbCgocmVnIDw8IDE2KSB8IChhZGRyIDw8IDIxKSB8IGRpciB8IGRhdGEsICZuaWMtPmNzci0+bWRpX2N0cmwpOworCisJZm9yKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJdWRlbGF5KDIwKTsKKwkJaWYoKGRhdGFfb3V0ID0gcmVhZGwoJm5pYy0+Y3NyLT5tZGlfY3RybCkpICYgbWRpX3JlYWR5KQorCQkJYnJlYWs7CisJfQorCisJRFBSSU5USyhIVywgREVCVUcsCisJCSIlczphZGRyPSVkLCByZWc9JWQsIGRhdGFfaW49MHglMDRYLCBkYXRhX291dD0weCUwNFhcbiIsCisJCWRpciA9PSBtZGlfcmVhZCA/ICJSRUFEIiA6ICJXUklURSIsIGFkZHIsIHJlZywgZGF0YSwgZGF0YV9vdXQpOworCXJldHVybiAodTE2KWRhdGFfb3V0OworfQorCitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgYWRkciwgaW50IHJlZykKK3sKKwlyZXR1cm4gbWRpb19jdHJsKG5ldGRldl9wcml2KG5ldGRldiksIGFkZHIsIG1kaV9yZWFkLCByZWcsIDApOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBhZGRyLCBpbnQgcmVnLCBpbnQgZGF0YSkKK3sKKwltZGlvX2N0cmwobmV0ZGV2X3ByaXYobmV0ZGV2KSwgYWRkciwgbWRpX3dyaXRlLCByZWcsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBlMTAwX2dldF9kZWZhdWx0cyhzdHJ1Y3QgbmljICpuaWMpCit7CisJc3RydWN0IHBhcmFtX3JhbmdlIHJmZHMgPSB7IC5taW4gPSA2NCwgLm1heCA9IDI1NiwgLmNvdW50ID0gNjQgfTsKKwlzdHJ1Y3QgcGFyYW1fcmFuZ2UgY2JzICA9IHsgLm1pbiA9IDY0LCAubWF4ID0gMjU2LCAuY291bnQgPSA2NCB9OworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUobmljLT5wZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZuaWMtPnJldl9pZCk7CisJLyogTUFDIHR5cGUgaXMgZW5jb2RlZCBhcyByZXYgSUQ7IGV4Y2VwdGlvbjogSUNIIGlzIHRyZWF0ZWQgYXMgODI1NTkgKi8KKwluaWMtPm1hYyA9IChuaWMtPmZsYWdzICYgaWNoKSA/IG1hY184MjU1OV9EMTAxTSA6IG5pYy0+cmV2X2lkOworCWlmKG5pYy0+bWFjID09IG1hY191bmtub3duKQorCQluaWMtPm1hYyA9IG1hY184MjU1N19EMTAwX0E7CisKKwluaWMtPnBhcmFtcy5yZmRzID0gcmZkczsKKwluaWMtPnBhcmFtcy5jYnMgPSBjYnM7CisKKwkvKiBRdWFkd29yZHMgdG8gRE1BIGludG8gRklGTyBiZWZvcmUgc3RhcnRpbmcgZnJhbWUgdHJhbnNtaXQgKi8KKwluaWMtPnR4X3RocmVzaG9sZCA9IDB4RTA7CisKKwluaWMtPnR4X2NvbW1hbmQgPSBjcHVfdG9fbGUxNihjYl90eCB8IGNiX2kgfCBjYl90eF9zZiB8CisJCSgobmljLT5tYWMgPj0gbWFjXzgyNTU4X0QxMDFfQTQpID8gY2JfY2lkIDogMCkpOworCisJLyogVGVtcGxhdGUgZm9yIGEgZnJlc2hseSBhbGxvY2F0ZWQgUkZEICovCisJbmljLT5ibGFua19yZmQuY29tbWFuZCA9IGNwdV90b19sZTE2KGNiX2VsKTsKKwluaWMtPmJsYW5rX3JmZC5yYmQgPSAweEZGRkZGRkZGOworCW5pYy0+YmxhbmtfcmZkLnNpemUgPSBjcHVfdG9fbGUxNihWTEFOX0VUSF9GUkFNRV9MRU4pOworCisJLyogTUlJIHNldHVwICovCisJbmljLT5taWkucGh5X2lkX21hc2sgPSAweDFGOworCW5pYy0+bWlpLnJlZ19udW1fbWFzayA9IDB4MUY7CisJbmljLT5taWkuZGV2ID0gbmljLT5uZXRkZXY7CisJbmljLT5taWkubWRpb19yZWFkID0gbWRpb19yZWFkOworCW5pYy0+bWlpLm1kaW9fd3JpdGUgPSBtZGlvX3dyaXRlOworfQorCitzdGF0aWMgdm9pZCBlMTAwX2NvbmZpZ3VyZShzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBjYiAqY2IsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGNvbmZpZyAqY29uZmlnID0gJmNiLT51LmNvbmZpZzsKKwl1OCAqYyA9ICh1OCAqKWNvbmZpZzsKKworCWNiLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY2JfY29uZmlnKTsKKworCW1lbXNldChjb25maWcsIDAsIHNpemVvZihzdHJ1Y3QgY29uZmlnKSk7CisKKwljb25maWctPmJ5dGVfY291bnQgPSAweDE2OwkJLyogYnl0ZXMgaW4gdGhpcyBzdHJ1Y3QgKi8KKwljb25maWctPnJ4X2ZpZm9fbGltaXQgPSAweDg7CQkvKiBieXRlcyBpbiBGSUZPIGJlZm9yZSBETUEgKi8KKwljb25maWctPmRpcmVjdF9yeF9kbWEgPSAweDE7CQkvKiByZXNlcnZlZCAqLworCWNvbmZpZy0+c3RhbmRhcmRfdGNiID0gMHgxOwkJLyogMT1zdGFuZGFyZCwgMD1leHRlbmRlZCAqLworCWNvbmZpZy0+c3RhbmRhcmRfc3RhdF9jb3VudGVyID0gMHgxOwkvKiAxPXN0YW5kYXJkLCAwPWV4dGVuZGVkICovCisJY29uZmlnLT5yeF9kaXNjYXJkX3Nob3J0X2ZyYW1lcyA9IDB4MTsJLyogMT1kaXNjYXJkLCAwPXBhc3MgKi8KKwljb25maWctPnR4X3VuZGVycnVuX3JldHJ5ID0gMHgzOwkvKiAjIG9mIHVuZGVycnVuIHJldHJpZXMgKi8KKwljb25maWctPm1paV9tb2RlID0gMHgxOwkJCS8qIDE9TUlJIG1vZGUsIDA9NTAzIG1vZGUgKi8KKwljb25maWctPnBhZDEwID0gMHg2OworCWNvbmZpZy0+bm9fc291cmNlX2FkZHJfaW5zZXJ0aW9uID0gMHgxOwkvKiAxPW5vLCAwPXllcyAqLworCWNvbmZpZy0+cHJlYW1ibGVfbGVuZ3RoID0gMHgyOwkJLyogMD0xLCAxPTMsIDI9NywgMz0xNSBieXRlcyAqLworCWNvbmZpZy0+aWZzID0gMHg2OwkJCS8qIHgxNiA9IGludGVyIGZyYW1lIHNwYWNpbmcgKi8KKwljb25maWctPmlwX2FkZHJfaGkgPSAweEYyOwkJLyogQVJQIElQIGZpbHRlciAtIG5vdCB1c2VkICovCisJY29uZmlnLT5wYWQxNV8xID0gMHgxOworCWNvbmZpZy0+cGFkMTVfMiA9IDB4MTsKKwljb25maWctPmNyc19vcl9jZHQgPSAweDA7CQkvKiAwPUNSUyBvbmx5LCAxPUNSUyBvciBDRFQgKi8KKwljb25maWctPmZjX2RlbGF5X2hpID0gMHg0MDsJCS8qIHRpbWUgZGVsYXkgZm9yIGZjIGZyYW1lICovCisJY29uZmlnLT50eF9wYWRkaW5nID0gMHgxOwkJLyogMT1wYWQgc2hvcnQgZnJhbWVzICovCisJY29uZmlnLT5mY19wcmlvcml0eV90aHJlc2hvbGQgPSAweDc7CS8qIDc9cHJpb3JpdHkgZmMgZGlzYWJsZWQgKi8KKwljb25maWctPnBhZDE4ID0gMHgxOworCWNvbmZpZy0+ZnVsbF9kdXBsZXhfcGluID0gMHgxOwkJLyogMT1leGFtaW5lIEZEWCMgcGluICovCisJY29uZmlnLT5wYWQyMF8xID0gMHgxRjsKKwljb25maWctPmZjX3ByaW9yaXR5X2xvY2F0aW9uID0gMHgxOwkvKiAxPWJ5dGUjMzEsIDA9Ynl0ZSMxOSAqLworCWNvbmZpZy0+cGFkMjFfMSA9IDB4NTsKKworCWNvbmZpZy0+YWRhcHRpdmVfaWZzID0gbmljLT5hZGFwdGl2ZV9pZnM7CisJY29uZmlnLT5sb29wYmFjayA9IG5pYy0+bG9vcGJhY2s7CisKKwlpZihuaWMtPm1paS5mb3JjZV9tZWRpYSAmJiBuaWMtPm1paS5mdWxsX2R1cGxleCkKKwkJY29uZmlnLT5mdWxsX2R1cGxleF9mb3JjZSA9IDB4MTsJLyogMT1mb3JjZSwgMD1hdXRvICovCisKKwlpZihuaWMtPmZsYWdzICYgcHJvbWlzY3VvdXMgfHwgbmljLT5sb29wYmFjaykgeworCQljb25maWctPnJ4X3NhdmVfYmFkX2ZyYW1lcyA9IDB4MTsJLyogMT1zYXZlLCAwPWRpc2NhcmQgKi8KKwkJY29uZmlnLT5yeF9kaXNjYXJkX3Nob3J0X2ZyYW1lcyA9IDB4MDsJLyogMT1kaXNjYXJkLCAwPXNhdmUgKi8KKwkJY29uZmlnLT5wcm9taXNjdW91c19tb2RlID0gMHgxOwkJLyogMT1vbiwgMD1vZmYgKi8KKwl9CisKKwlpZihuaWMtPmZsYWdzICYgbXVsdGljYXN0X2FsbCkKKwkJY29uZmlnLT5tdWx0aWNhc3RfYWxsID0gMHgxOwkJLyogMT1hY2NlcHQsIDA9bm8gKi8KKworCWlmKCEobmljLT5mbGFncyAmIHdvbF9tYWdpYykpCisJCWNvbmZpZy0+bWFnaWNfcGFja2V0X2Rpc2FibGUgPSAweDE7CS8qIDE9b2ZmLCAwPW9uICovCisKKwlpZihuaWMtPm1hYyA+PSBtYWNfODI1NThfRDEwMV9BNCkgeworCQljb25maWctPmZjX2Rpc2FibGUgPSAweDE7CS8qIDE9VHggZmMgb2ZmLCAwPVR4IGZjIG9uICovCisJCWNvbmZpZy0+bXdpX2VuYWJsZSA9IDB4MTsJLyogMT1lbmFibGUsIDA9ZGlzYWJsZSAqLworCQljb25maWctPnN0YW5kYXJkX3RjYiA9IDB4MDsJLyogMT1zdGFuZGFyZCwgMD1leHRlbmRlZCAqLworCQljb25maWctPnJ4X2xvbmdfb2sgPSAweDE7CS8qIDE9VkxBTnMgb2ssIDA9c3RhbmRhcmQgKi8KKwkJaWYobmljLT5tYWMgPj0gbWFjXzgyNTU5X0QxMDFNKQorCQkJY29uZmlnLT50bm9faW50ciA9IDB4MTsJCS8qIFRDTyBzdGF0cyBlbmFibGUgKi8KKwkJZWxzZQorCQkJY29uZmlnLT5zdGFuZGFyZF9zdGF0X2NvdW50ZXIgPSAweDA7CisJfQorCisJRFBSSU5USyhIVywgREVCVUcsICJbMDAtMDddPSUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkJY1swXSwgY1sxXSwgY1syXSwgY1szXSwgY1s0XSwgY1s1XSwgY1s2XSwgY1s3XSk7CisJRFBSSU5USyhIVywgREVCVUcsICJbMDgtMTVdPSUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkJY1s4XSwgY1s5XSwgY1sxMF0sIGNbMTFdLCBjWzEyXSwgY1sxM10sIGNbMTRdLCBjWzE1XSk7CisJRFBSSU5USyhIVywgREVCVUcsICJbMTYtMjNdPSUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkJY1sxNl0sIGNbMTddLCBjWzE4XSwgY1sxOV0sIGNbMjBdLCBjWzIxXSwgY1syMl0sIGNbMjNdKTsKK30KKworc3RhdGljIHZvaWQgZTEwMF9sb2FkX3Vjb2RlKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGNiICpjYiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgaTsKKwlzdGF0aWMgY29uc3QgdTMyIHVjb2RlW1VDT0RFX1NJWkVdID0geworCQkvKiBORlMgcGFja2V0cyBhcmUgbWlzaW50ZXJwcmV0ZWQgYXMgVENPIHBhY2tldHMgYW5kCisJCSAqIGluY29ycmVjdGx5IHJvdXRlZCB0byB0aGUgQk1DIG92ZXIgU01CdXMuICBUaGlzCisJCSAqIG1pY3JvY29kZSBwYXRjaCBjaGVja3MgdGhlIGZyYWdtZW50ZWQgSVAgYml0IGluIHRoZQorCQkgKiBORlMvVURQIGhlYWRlciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIE5GUyBhbmQgVENPLiAqLworCQkweDBFRjcwRTM2LCAweDFGRkYxRkZGLCAweDFGRkYxRkZGLCAweDFGRkYxRkZGLCAweDFGRkYxRkZGLAorCQkweDFGRkYxRkZGLCAweDAwOTA2RTQxLCAweDAwODAwRTNDLCAweDAwRTAwRTM5LCAweDAwMDAwMDAwLAorCQkweDAwOTA2RUZELCAweDAwOTAwRUZELAkweDAwRTAwRUY4LAorCX07CisKKwlpZihuaWMtPm1hYyA9PSBtYWNfODI1NTFfRiB8fCBuaWMtPm1hYyA9PSBtYWNfODI1NTFfMTApIHsKKwkJZm9yKGkgPSAwOyBpIDwgVUNPREVfU0laRTsgaSsrKQorCQkJY2ItPnUudWNvZGVbaV0gPSBjcHVfdG9fbGUzMih1Y29kZVtpXSk7CisJCWNiLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY2JfdWNvZGUpOworCX0gZWxzZQorCQljYi0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNiX25vcCk7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfc2V0dXBfaWFhZGRyKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGNiICpjYiwKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWNiLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY2JfaWFhZGRyKTsKKwltZW1jcHkoY2ItPnUuaWFhZGRyLCBuaWMtPm5ldGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKK30KKworc3RhdGljIHZvaWQgZTEwMF9kdW1wKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGNiICpjYiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwljYi0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNiX2R1bXApOworCWNiLT51LmR1bXBfYnVmZmVyX2FkZHIgPSBjcHVfdG9fbGUzMihuaWMtPmRtYV9hZGRyICsKKwkJb2Zmc2V0b2Yoc3RydWN0IG1lbSwgZHVtcF9idWYpKTsKK30KKworI2RlZmluZSBOQ09ORklHX0FVVE9fU1dJVENICTB4MDA4MAorI2RlZmluZSBNSUlfTlNDX0NPTkcJCU1JSV9SRVNWMQorI2RlZmluZSBOU0NfQ09OR19FTkFCTEUJCTB4MDEwMAorI2RlZmluZSBOU0NfQ09OR19UWFJFQURZCTB4MDQwMAorI2RlZmluZSBBRFZFUlRJU0VfRkNfU1VQUE9SVEVECTB4MDQwMAorc3RhdGljIGludCBlMTAwX3BoeV9pbml0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gbmljLT5uZXRkZXY7CisJdTMyIGFkZHI7CisJdTE2IGJtY3IsIHN0YXQsIGlkX2xvLCBpZF9oaSwgY29uZzsKKworCS8qIERpc2NvdmVyIHBoeSBhZGRyIGJ5IHNlYXJjaGluZyBhZGRycyBpbiBvcmRlciB7MSwwLDIsLi4uLCAzMX0gKi8KKwlmb3IoYWRkciA9IDA7IGFkZHIgPCAzMjsgYWRkcisrKSB7CisJCW5pYy0+bWlpLnBoeV9pZCA9IChhZGRyID09IDApID8gMSA6IChhZGRyID09IDEpID8gMCA6IGFkZHI7CisJCWJtY3IgPSBtZGlvX3JlYWQobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9CTUNSKTsKKwkJc3RhdCA9IG1kaW9fcmVhZChuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX0JNU1IpOworCQlzdGF0ID0gbWRpb19yZWFkKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfQk1TUik7CisJCWlmKCEoKGJtY3IgPT0gMHhGRkZGKSB8fCAoKHN0YXQgPT0gMCkgJiYgKGJtY3IgPT0gMCkpKSkKKwkJCWJyZWFrOworCX0KKwlEUFJJTlRLKEhXLCBERUJVRywgInBoeV9hZGRyID0gJWRcbiIsIG5pYy0+bWlpLnBoeV9pZCk7CisJaWYoYWRkciA9PSAzMikKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBTZWxlY3RlZCB0aGUgcGh5IGFuZCBpc29sYXRlIHRoZSByZXN0ICovCisJZm9yKGFkZHIgPSAwOyBhZGRyIDwgMzI7IGFkZHIrKykgeworCQlpZihhZGRyICE9IG5pYy0+bWlpLnBoeV9pZCkgeworCQkJbWRpb193cml0ZShuZXRkZXYsIGFkZHIsIE1JSV9CTUNSLCBCTUNSX0lTT0xBVEUpOworCQl9IGVsc2UgeworCQkJYm1jciA9IG1kaW9fcmVhZChuZXRkZXYsIGFkZHIsIE1JSV9CTUNSKTsKKwkJCW1kaW9fd3JpdGUobmV0ZGV2LCBhZGRyLCBNSUlfQk1DUiwKKwkJCQlibWNyICYgfkJNQ1JfSVNPTEFURSk7CisJCX0KKwl9CisKKwkvKiBHZXQgcGh5IElEICovCisJaWRfbG8gPSBtZGlvX3JlYWQobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9QSFlTSUQxKTsKKwlpZF9oaSA9IG1kaW9fcmVhZChuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX1BIWVNJRDIpOworCW5pYy0+cGh5ID0gKHUzMilpZF9oaSA8PCAxNiB8ICh1MzIpaWRfbG87CisJRFBSSU5USyhIVywgREVCVUcsICJwaHkgSUQgPSAweCUwOFhcbiIsIG5pYy0+cGh5KTsKKworCS8qIEhhbmRsZSBOYXRpb25hbCB0eCBwaHlzICovCisjZGVmaW5lIE5DU19QSFlfTU9ERUxfTUFTSwkweEZGRjBGRkZGCisJaWYoKG5pYy0+cGh5ICYgTkNTX1BIWV9NT0RFTF9NQVNLKSA9PSBwaHlfbnNjX3R4KSB7CisJCS8qIERpc2FibGUgY29uZ2VzdGlvbiBjb250cm9sICovCisJCWNvbmcgPSBtZGlvX3JlYWQobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9OU0NfQ09ORyk7CisJCWNvbmcgfD0gTlNDX0NPTkdfVFhSRUFEWTsKKwkJY29uZyAmPSB+TlNDX0NPTkdfRU5BQkxFOworCQltZGlvX3dyaXRlKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfTlNDX0NPTkcsIGNvbmcpOworCX0KKworCWlmKChuaWMtPm1hYyA+PSBtYWNfODI1NTBfRDEwMikgfHwgKChuaWMtPmZsYWdzICYgaWNoKSAmJiAKKwkJKG1kaW9fcmVhZChuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX1RQSVNUQVRVUykgJiAweDgwMDApICYmIAorCQkobmljLT5lZXByb21bZWVwcm9tX2NuZmdfbWRpeF0gJiBlZXByb21fbWRpeF9lbmFibGVkKSkpCisJCS8qIGVuYWJsZS9kaXNhYmxlIE1ESS9NREktWCBhdXRvLXN3aXRjaGluZyAqLworCQltZGlvX3dyaXRlKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfTkNPTkZJRywKKwkJCW5pYy0+bWlpLmZvcmNlX21lZGlhID8gMCA6IE5DT05GSUdfQVVUT19TV0lUQ0gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZTEwMF9od19pbml0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpbnQgZXJyOworCisJZTEwMF9od19yZXNldChuaWMpOworCisJRFBSSU5USyhIVywgRVJSLCAiZTEwMF9od19pbml0XG4iKTsKKwlpZighaW5faW50ZXJydXB0KCkgJiYgKGVyciA9IGUxMDBfc2VsZl90ZXN0KG5pYykpKQorCQlyZXR1cm4gZXJyOworCisJaWYoKGVyciA9IGUxMDBfcGh5X2luaXQobmljKSkpCisJCXJldHVybiBlcnI7CisJaWYoKGVyciA9IGUxMDBfZXhlY19jbWQobmljLCBjdWNfbG9hZF9iYXNlLCAwKSkpCisJCXJldHVybiBlcnI7CisJaWYoKGVyciA9IGUxMDBfZXhlY19jbWQobmljLCBydWNfbG9hZF9iYXNlLCAwKSkpCisJCXJldHVybiBlcnI7CisJaWYoKGVyciA9IGUxMDBfZXhlY19jYihuaWMsIE5VTEwsIGUxMDBfbG9hZF91Y29kZSkpKQorCQlyZXR1cm4gZXJyOworCWlmKChlcnIgPSBlMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX2NvbmZpZ3VyZSkpKQorCQlyZXR1cm4gZXJyOworCWlmKChlcnIgPSBlMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX3NldHVwX2lhYWRkcikpKQorCQlyZXR1cm4gZXJyOworCWlmKChlcnIgPSBlMTAwX2V4ZWNfY21kKG5pYywgY3VjX2R1bXBfYWRkciwKKwkJbmljLT5kbWFfYWRkciArIG9mZnNldG9mKHN0cnVjdCBtZW0sIHN0YXRzKSkpKQorCQlyZXR1cm4gZXJyOworCWlmKChlcnIgPSBlMTAwX2V4ZWNfY21kKG5pYywgY3VjX2R1bXBfcmVzZXQsIDApKSkKKwkJcmV0dXJuIGVycjsKKworCWUxMDBfZGlzYWJsZV9pcnEobmljKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlMTAwX211bHRpKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGNiICpjYiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gbmljLT5uZXRkZXY7CisJc3RydWN0IGRldl9tY19saXN0ICpsaXN0ID0gbmV0ZGV2LT5tY19saXN0OworCXUxNiBpLCBjb3VudCA9IG1pbihuZXRkZXYtPm1jX2NvdW50LCBFMTAwX01BWF9NVUxUSUNBU1RfQUREUlMpOworCisJY2ItPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjYl9tdWx0aSk7CisJY2ItPnUubXVsdGkuY291bnQgPSBjcHVfdG9fbGUxNihjb3VudCAqIEVUSF9BTEVOKTsKKwlmb3IoaSA9IDA7IGxpc3QgJiYgaSA8IGNvdW50OyBpKyssIGxpc3QgPSBsaXN0LT5uZXh0KQorCQltZW1jcHkoJmNiLT51Lm11bHRpLmFkZHJbaSpFVEhfQUxFTl0sICZsaXN0LT5kbWlfYWRkciwKKwkJCUVUSF9BTEVOKTsKK30KKworc3RhdGljIHZvaWQgZTEwMF9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJRFBSSU5USyhIVywgREVCVUcsICJtY19jb3VudD0lZCwgZmxhZ3M9MHglMDRYXG4iLAorCQluZXRkZXYtPm1jX2NvdW50LCBuZXRkZXYtPmZsYWdzKTsKKworCWlmKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJbmljLT5mbGFncyB8PSBwcm9taXNjdW91czsKKwllbHNlCisJCW5pYy0+ZmxhZ3MgJj0gfnByb21pc2N1b3VzOworCisJaWYobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSB8fAorCQluZXRkZXYtPm1jX2NvdW50ID4gRTEwMF9NQVhfTVVMVElDQVNUX0FERFJTKQorCQluaWMtPmZsYWdzIHw9IG11bHRpY2FzdF9hbGw7CisJZWxzZQorCQluaWMtPmZsYWdzICY9IH5tdWx0aWNhc3RfYWxsOworCisJZTEwMF9leGVjX2NiKG5pYywgTlVMTCwgZTEwMF9jb25maWd1cmUpOworCWUxMDBfZXhlY19jYihuaWMsIE5VTEwsIGUxMDBfbXVsdGkpOworfQorCitzdGF0aWMgdm9pZCBlMTAwX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgbmljICpuaWMpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zID0gJm5pYy0+bmV0X3N0YXRzOworCXN0cnVjdCBzdGF0cyAqcyA9ICZuaWMtPm1lbS0+c3RhdHM7CisJdTMyICpjb21wbGV0ZSA9IChuaWMtPm1hYyA8IG1hY184MjU1OF9EMTAxX0E0KSA/ICZzLT5mY194bXRfcGF1c2UgOgorCQkobmljLT5tYWMgPCBtYWNfODI1NTlfRDEwMU0pID8gKHUzMiAqKSZzLT54bXRfdGNvX2ZyYW1lcyA6CisJCSZzLT5jb21wbGV0ZTsKKworCS8qIERldmljZSdzIHN0YXRzIHJlcG9ydGluZyBtYXkgdGFrZSBzZXZlcmFsIG1pY3Jvc2Vjb25kcyB0bworCSAqIGNvbXBsZXRlLCBzbyB3aGVyZSBhbHdheXMgd2FpdGluZyBmb3IgcmVzdWx0cyBvZiB0aGUKKwkgKiBwcmV2aW91cyBjb21tYW5kLiAqLworCisJaWYoKmNvbXBsZXRlID09IGxlMzJfdG9fY3B1KGN1Y19kdW1wX3Jlc2V0X2NvbXBsZXRlKSkgeworCQkqY29tcGxldGUgPSAwOworCQluaWMtPnR4X2ZyYW1lcyA9IGxlMzJfdG9fY3B1KHMtPnR4X2dvb2RfZnJhbWVzKTsKKwkJbmljLT50eF9jb2xsaXNpb25zID0gbGUzMl90b19jcHUocy0+dHhfdG90YWxfY29sbGlzaW9ucyk7CisJCW5zLT50eF9hYm9ydGVkX2Vycm9ycyArPSBsZTMyX3RvX2NwdShzLT50eF9tYXhfY29sbGlzaW9ucyk7CisJCW5zLT50eF93aW5kb3dfZXJyb3JzICs9IGxlMzJfdG9fY3B1KHMtPnR4X2xhdGVfY29sbGlzaW9ucyk7CisJCW5zLT50eF9jYXJyaWVyX2Vycm9ycyArPSBsZTMyX3RvX2NwdShzLT50eF9sb3N0X2Nycyk7CisJCW5zLT50eF9maWZvX2Vycm9ycyArPSBsZTMyX3RvX2NwdShzLT50eF91bmRlcnJ1bnMpOworCQlucy0+Y29sbGlzaW9ucyArPSBuaWMtPnR4X2NvbGxpc2lvbnM7CisJCW5zLT50eF9lcnJvcnMgKz0gbGUzMl90b19jcHUocy0+dHhfbWF4X2NvbGxpc2lvbnMpICsKKwkJCWxlMzJfdG9fY3B1KHMtPnR4X2xvc3RfY3JzKTsKKwkJbnMtPnJ4X2Ryb3BwZWQgKz0gbGUzMl90b19jcHUocy0+cnhfcmVzb3VyY2VfZXJyb3JzKTsKKwkJbnMtPnJ4X2xlbmd0aF9lcnJvcnMgKz0gbGUzMl90b19jcHUocy0+cnhfc2hvcnRfZnJhbWVfZXJyb3JzKSArCisJCQluaWMtPnJ4X292ZXJfbGVuZ3RoX2Vycm9yczsKKwkJbnMtPnJ4X2NyY19lcnJvcnMgKz0gbGUzMl90b19jcHUocy0+cnhfY3JjX2Vycm9ycyk7CisJCW5zLT5yeF9mcmFtZV9lcnJvcnMgKz0gbGUzMl90b19jcHUocy0+cnhfYWxpZ25tZW50X2Vycm9ycyk7CisJCW5zLT5yeF9vdmVyX2Vycm9ycyArPSBsZTMyX3RvX2NwdShzLT5yeF9vdmVycnVuX2Vycm9ycyk7CisJCW5zLT5yeF9maWZvX2Vycm9ycyArPSBsZTMyX3RvX2NwdShzLT5yeF9vdmVycnVuX2Vycm9ycyk7CisJCW5zLT5yeF9lcnJvcnMgKz0gbGUzMl90b19jcHUocy0+cnhfY3JjX2Vycm9ycykgKworCQkJbGUzMl90b19jcHUocy0+cnhfYWxpZ25tZW50X2Vycm9ycykgKworCQkJbGUzMl90b19jcHUocy0+cnhfc2hvcnRfZnJhbWVfZXJyb3JzKSArCisJCQlsZTMyX3RvX2NwdShzLT5yeF9jZHRfZXJyb3JzKTsKKwkJbmljLT50eF9kZWZlcnJlZCArPSBsZTMyX3RvX2NwdShzLT50eF9kZWZlcnJlZCk7CisJCW5pYy0+dHhfc2luZ2xlX2NvbGxpc2lvbnMgKz0KKwkJCWxlMzJfdG9fY3B1KHMtPnR4X3NpbmdsZV9jb2xsaXNpb25zKTsKKwkJbmljLT50eF9tdWx0aXBsZV9jb2xsaXNpb25zICs9CisJCQlsZTMyX3RvX2NwdShzLT50eF9tdWx0aXBsZV9jb2xsaXNpb25zKTsKKwkJaWYobmljLT5tYWMgPj0gbWFjXzgyNTU4X0QxMDFfQTQpIHsKKwkJCW5pYy0+dHhfZmNfcGF1c2UgKz0gbGUzMl90b19jcHUocy0+ZmNfeG10X3BhdXNlKTsKKwkJCW5pYy0+cnhfZmNfcGF1c2UgKz0gbGUzMl90b19jcHUocy0+ZmNfcmN2X3BhdXNlKTsKKwkJCW5pYy0+cnhfZmNfdW5zdXBwb3J0ZWQgKz0KKwkJCQlsZTMyX3RvX2NwdShzLT5mY19yY3ZfdW5zdXBwb3J0ZWQpOworCQkJaWYobmljLT5tYWMgPj0gbWFjXzgyNTU5X0QxMDFNKSB7CisJCQkJbmljLT50eF90Y29fZnJhbWVzICs9CisJCQkJCWxlMTZfdG9fY3B1KHMtPnhtdF90Y29fZnJhbWVzKTsKKwkJCQluaWMtPnJ4X3Rjb19mcmFtZXMgKz0KKwkJCQkJbGUxNl90b19jcHUocy0+cmN2X3Rjb19mcmFtZXMpOworCQkJfQorCQl9CisJfQorCisJZTEwMF9leGVjX2NtZChuaWMsIGN1Y19kdW1wX3Jlc2V0LCAwKTsKK30KKworc3RhdGljIHZvaWQgZTEwMF9hZGp1c3RfYWRhcHRpdmVfaWZzKHN0cnVjdCBuaWMgKm5pYywgaW50IHNwZWVkLCBpbnQgZHVwbGV4KQoreworCS8qIEFkanVzdCBpbnRlci1mcmFtZS1zcGFjaW5nIChJRlMpIGJldHdlZW4gdHdvIHRyYW5zbWl0cyBpZgorCSAqIHdlJ3JlIGdldHRpbmcgY29sbGlzaW9ucyBvbiBhIGhhbGYtZHVwbGV4IGNvbm5lY3Rpb24uICovCisKKwlpZihkdXBsZXggPT0gRFVQTEVYX0hBTEYpIHsKKwkJdTMyIHByZXYgPSBuaWMtPmFkYXB0aXZlX2lmczsKKwkJdTMyIG1pbl9mcmFtZXMgPSAoc3BlZWQgPT0gU1BFRURfMTAwKSA/IDEwMDAgOiAxMDA7CisKKwkJaWYoKG5pYy0+dHhfZnJhbWVzIC8gMzIgPCBuaWMtPnR4X2NvbGxpc2lvbnMpICYmCisJCSAgIChuaWMtPnR4X2ZyYW1lcyA+IG1pbl9mcmFtZXMpKSB7CisJCQlpZihuaWMtPmFkYXB0aXZlX2lmcyA8IDYwKQorCQkJCW5pYy0+YWRhcHRpdmVfaWZzICs9IDU7CisJCX0gZWxzZSBpZiAobmljLT50eF9mcmFtZXMgPCBtaW5fZnJhbWVzKSB7CisJCQlpZihuaWMtPmFkYXB0aXZlX2lmcyA+PSA1KQorCQkJCW5pYy0+YWRhcHRpdmVfaWZzIC09IDU7CisJCX0KKwkJaWYobmljLT5hZGFwdGl2ZV9pZnMgIT0gcHJldikKKwkJCWUxMDBfZXhlY19jYihuaWMsIE5VTEwsIGUxMDBfY29uZmlndXJlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGF0YTsKKwlzdHJ1Y3QgZXRodG9vbF9jbWQgY21kOworCisJRFBSSU5USyhUSU1FUiwgREVCVUcsICJyaWdodCBub3cgPSAlbGRcbiIsIGppZmZpZXMpOworCisJLyogbWlpIGxpYnJhcnkgaGFuZGxlcyBsaW5rIG1haW50ZW5hbmNlIHRhc2tzICovCisKKwltaWlfZXRodG9vbF9nc2V0KCZuaWMtPm1paSwgJmNtZCk7CisKKwlpZihtaWlfbGlua19vaygmbmljLT5taWkpICYmICFuZXRpZl9jYXJyaWVyX29rKG5pYy0+bmV0ZGV2KSkgeworCQlEUFJJTlRLKExJTkssIElORk8sICJsaW5rIHVwLCAlc01icHMsICVzLWR1cGxleFxuIiwKKwkJCWNtZC5zcGVlZCA9PSBTUEVFRF8xMDAgPyAiMTAwIiA6ICIxMCIsCisJCQljbWQuZHVwbGV4ID09IERVUExFWF9GVUxMID8gImZ1bGwiIDogImhhbGYiKTsKKwl9IGVsc2UgaWYoIW1paV9saW5rX29rKCZuaWMtPm1paSkgJiYgbmV0aWZfY2Fycmllcl9vayhuaWMtPm5ldGRldikpIHsKKwkJRFBSSU5USyhMSU5LLCBJTkZPLCAibGluayBkb3duXG4iKTsKKwl9CisKKwltaWlfY2hlY2tfbGluaygmbmljLT5taWkpOworCisJLyogU29mdHdhcmUgZ2VuZXJhdGVkIGludGVycnVwdCB0byByZWNvdmVyIGZyb20gKHJhcmUpIFJ4CisJKiBhbGxvY2F0aW9uIGZhaWx1cmUuCisJKiBVbmZvcnR1bmF0ZWx5IGhhdmUgdG8gdXNlIGEgc3BpbmxvY2sgdG8gbm90IHJlLWVuYWJsZSBpbnRlcnJ1cHRzCisJKiBhY2NpZGVudGFsbHksIGR1ZSB0byBoYXJkd2FyZSB0aGF0IHNoYXJlcyBhIHJlZ2lzdGVyIGJldHdlZW4gdGhlCisJKiBpbnRlcnJ1cHQgbWFzayBiaXQgYW5kIHRoZSBTVyBJbnRlcnJ1cHQgZ2VuZXJhdGlvbiBiaXQgKi8KKwlzcGluX2xvY2tfaXJxKCZuaWMtPmNtZF9sb2NrKTsKKwl3cml0ZWIocmVhZGIoJm5pYy0+Y3NyLT5zY2IuY21kX2hpKSB8IGlycV9zd19nZW4sJm5pYy0+Y3NyLT5zY2IuY21kX2hpKTsKKwlzcGluX3VubG9ja19pcnEoJm5pYy0+Y21kX2xvY2spOworCWUxMDBfd3JpdGVfZmx1c2gobmljKTsKKworCWUxMDBfdXBkYXRlX3N0YXRzKG5pYyk7CisJZTEwMF9hZGp1c3RfYWRhcHRpdmVfaWZzKG5pYywgY21kLnNwZWVkLCBjbWQuZHVwbGV4KTsKKworCWlmKG5pYy0+bWFjIDw9IG1hY184MjU1N19EMTAwX0MpCisJCS8qIElzc3VlIGEgbXVsdGljYXN0IGNvbW1hbmQgdG8gd29ya2Fyb3VuZCBhIDU1NyBsb2NrIHVwICovCisJCWUxMDBfc2V0X211bHRpY2FzdF9saXN0KG5pYy0+bmV0ZGV2KTsKKworCWlmKG5pYy0+ZmxhZ3MgJiBpY2ggJiYgY21kLnNwZWVkPT1TUEVFRF8xMCAmJiBjbWQuZHVwbGV4PT1EVVBMRVhfSEFMRikKKwkJLyogTmVlZCBTVyB3b3JrYXJvdW5kIGZvciBJQ0hbeF0gMTBNYnBzL2hhbGYgZHVwbGV4IFR4IGhhbmcuICovCisJCW5pYy0+ZmxhZ3MgfD0gaWNoXzEwaF93b3JrYXJvdW5kOworCWVsc2UKKwkJbmljLT5mbGFncyAmPSB+aWNoXzEwaF93b3JrYXJvdW5kOworCisJbW9kX3RpbWVyKCZuaWMtPndhdGNoZG9nLCBqaWZmaWVzICsgRTEwMF9XQVRDSERPR19QRVJJT0QpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZTEwMF94bWl0X3ByZXBhcmUoc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgY2IgKmNiLAorCXN0cnVjdCBza19idWZmICpza2IpCit7CisJY2ItPmNvbW1hbmQgPSBuaWMtPnR4X2NvbW1hbmQ7CisJY2ItPnUudGNiLnRiZF9hcnJheSA9IGNiLT5kbWFfYWRkciArIG9mZnNldG9mKHN0cnVjdCBjYiwgdS50Y2IudGJkKTsKKwljYi0+dS50Y2IudGNiX2J5dGVfY291bnQgPSAwOworCWNiLT51LnRjYi50aHJlc2hvbGQgPSBuaWMtPnR4X3RocmVzaG9sZDsKKwljYi0+dS50Y2IudGJkX2NvdW50ID0gMTsKKwljYi0+dS50Y2IudGJkLmJ1Zl9hZGRyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUobmljLT5wZGV2LAorCQlza2ItPmRhdGEsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKSk7CisJY2ItPnUudGNiLnRiZC5zaXplID0gY3B1X3RvX2xlMTYoc2tiLT5sZW4pOworfQorCitzdGF0aWMgaW50IGUxMDBfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IGVycjsKKworCWlmKG5pYy0+ZmxhZ3MgJiBpY2hfMTBoX3dvcmthcm91bmQpIHsKKwkJLyogU1cgd29ya2Fyb3VuZCBmb3IgSUNIW3hdIDEwTWJwcy9oYWxmIGR1cGxleCBUeCBoYW5nLgorCQkgICBJc3N1ZSBhIE5PUCBjb21tYW5kIGZvbGxvd2VkIGJ5IGEgMXVzIGRlbGF5IGJlZm9yZQorCQkgICBpc3N1aW5nIHRoZSBUeCBjb21tYW5kLiAqLworCQllMTAwX2V4ZWNfY21kKG5pYywgY3VjX25vcCwgMCk7CisJCXVkZWxheSgxKTsKKwl9CisKKwllcnIgPSBlMTAwX2V4ZWNfY2IobmljLCBza2IsIGUxMDBfeG1pdF9wcmVwYXJlKTsKKworCXN3aXRjaChlcnIpIHsKKwljYXNlIC1FTk9TUEM6CisJCS8qIFdlIHF1ZXVlZCB0aGUgc2tiLCBidXQgbm93IHdlJ3JlIG91dCBvZiBzcGFjZS4gKi8KKwkJRFBSSU5USyhUWF9FUlIsIERFQlVHLCAiTm8gc3BhY2UgZm9yIENCXG4iKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCQlicmVhazsKKwljYXNlIC1FTk9NRU06CisJCS8qIFRoaXMgaXMgYSBoYXJkIGVycm9yIC0gbG9nIGl0LiAqLworCQlEUFJJTlRLKFRYX0VSUiwgREVCVUcsICJPdXQgb2YgVHggcmVzb3VyY2VzLCByZXR1cm5pbmcgc2tiXG4iKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCQlyZXR1cm4gMTsKKwl9CisKKwluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZTEwMF90eF9jbGVhbihzdHJ1Y3QgbmljICpuaWMpCit7CisJc3RydWN0IGNiICpjYjsKKwlpbnQgdHhfY2xlYW5lZCA9IDA7CisKKwlzcGluX2xvY2soJm5pYy0+Y2JfbG9jayk7CisKKwlEUFJJTlRLKFRYX0RPTkUsIERFQlVHLCAiY2ItPnN0YXR1cyA9IDB4JTA0WFxuIiwKKwkJbmljLT5jYl90b19jbGVhbi0+c3RhdHVzKTsKKworCS8qIENsZWFuIENCcyBtYXJrZWQgY29tcGxldGUgKi8KKwlmb3IoY2IgPSBuaWMtPmNiX3RvX2NsZWFuOworCSAgICBjYi0+c3RhdHVzICYgY3B1X3RvX2xlMTYoY2JfY29tcGxldGUpOworCSAgICBjYiA9IG5pYy0+Y2JfdG9fY2xlYW4gPSBjYi0+bmV4dCkgeworCQlpZihsaWtlbHkoY2ItPnNrYiAhPSBOVUxMKSkgeworCQkJbmljLT5uZXRfc3RhdHMudHhfcGFja2V0cysrOworCQkJbmljLT5uZXRfc3RhdHMudHhfYnl0ZXMgKz0gY2ItPnNrYi0+bGVuOworCisJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwKKwkJCQlsZTMyX3RvX2NwdShjYi0+dS50Y2IudGJkLmJ1Zl9hZGRyKSwKKwkJCQlsZTE2X3RvX2NwdShjYi0+dS50Y2IudGJkLnNpemUpLAorCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoY2ItPnNrYik7CisJCQljYi0+c2tiID0gTlVMTDsKKwkJCXR4X2NsZWFuZWQgPSAxOworCQl9CisJCWNiLT5zdGF0dXMgPSAwOworCQluaWMtPmNic19hdmFpbCsrOworCX0KKworCXNwaW5fdW5sb2NrKCZuaWMtPmNiX2xvY2spOworCisJLyogUmVjb3ZlciBmcm9tIHJ1bm5pbmcgb3V0IG9mIFR4IHJlc291cmNlcyBpbiB4bWl0X2ZyYW1lICovCisJaWYodW5saWtlbHkodHhfY2xlYW5lZCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKG5pYy0+bmV0ZGV2KSkpCisJCW5ldGlmX3dha2VfcXVldWUobmljLT5uZXRkZXYpOworCisJcmV0dXJuIHR4X2NsZWFuZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfY2xlYW5fY2JzKHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpZihuaWMtPmNicykgeworCQl3aGlsZShuaWMtPmNic19hdmFpbCAhPSBuaWMtPnBhcmFtcy5jYnMuY291bnQpIHsKKwkJCXN0cnVjdCBjYiAqY2IgPSBuaWMtPmNiX3RvX2NsZWFuOworCQkJaWYoY2ItPnNrYikgeworCQkJCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LAorCQkJCQlsZTMyX3RvX2NwdShjYi0+dS50Y2IudGJkLmJ1Zl9hZGRyKSwKKwkJCQkJbGUxNl90b19jcHUoY2ItPnUudGNiLnRiZC5zaXplKSwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQkJZGV2X2tmcmVlX3NrYihjYi0+c2tiKTsKKwkJCX0KKwkJCW5pYy0+Y2JfdG9fY2xlYW4gPSBuaWMtPmNiX3RvX2NsZWFuLT5uZXh0OworCQkJbmljLT5jYnNfYXZhaWwrKzsKKwkJfQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KG5pYy0+cGRldiwKKwkJCXNpemVvZihzdHJ1Y3QgY2IpICogbmljLT5wYXJhbXMuY2JzLmNvdW50LAorCQkJbmljLT5jYnMsIG5pYy0+Y2JzX2RtYV9hZGRyKTsKKwkJbmljLT5jYnMgPSBOVUxMOworCQluaWMtPmNic19hdmFpbCA9IDA7CisJfQorCW5pYy0+Y3VjX2NtZCA9IGN1Y19zdGFydDsKKwluaWMtPmNiX3RvX3VzZSA9IG5pYy0+Y2JfdG9fc2VuZCA9IG5pYy0+Y2JfdG9fY2xlYW4gPQorCQluaWMtPmNiczsKK30KKworc3RhdGljIGludCBlMTAwX2FsbG9jX2NicyhzdHJ1Y3QgbmljICpuaWMpCit7CisJc3RydWN0IGNiICpjYjsKKwl1bnNpZ25lZCBpbnQgaSwgY291bnQgPSBuaWMtPnBhcmFtcy5jYnMuY291bnQ7CisKKwluaWMtPmN1Y19jbWQgPSBjdWNfc3RhcnQ7CisJbmljLT5jYl90b191c2UgPSBuaWMtPmNiX3RvX3NlbmQgPSBuaWMtPmNiX3RvX2NsZWFuID0gTlVMTDsKKwluaWMtPmNic19hdmFpbCA9IDA7CisKKwluaWMtPmNicyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG5pYy0+cGRldiwKKwkJc2l6ZW9mKHN0cnVjdCBjYikgKiBjb3VudCwgJm5pYy0+Y2JzX2RtYV9hZGRyKTsKKwlpZighbmljLT5jYnMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yKGNiID0gbmljLT5jYnMsIGkgPSAwOyBpIDwgY291bnQ7IGNiKyssIGkrKykgeworCQljYi0+bmV4dCA9IChpICsgMSA8IGNvdW50KSA/IGNiICsgMSA6IG5pYy0+Y2JzOworCQljYi0+cHJldiA9IChpID09IDApID8gbmljLT5jYnMgKyBjb3VudCAtIDEgOiBjYiAtIDE7CisKKwkJY2ItPmRtYV9hZGRyID0gbmljLT5jYnNfZG1hX2FkZHIgKyBpICogc2l6ZW9mKHN0cnVjdCBjYik7CisJCWNiLT5saW5rID0gY3B1X3RvX2xlMzIobmljLT5jYnNfZG1hX2FkZHIgKworCQkJKChpKzEpICUgY291bnQpICogc2l6ZW9mKHN0cnVjdCBjYikpOworCQljYi0+c2tiID0gTlVMTDsKKwl9CisKKwluaWMtPmNiX3RvX3VzZSA9IG5pYy0+Y2JfdG9fc2VuZCA9IG5pYy0+Y2JfdG9fY2xlYW4gPSBuaWMtPmNiczsKKwluaWMtPmNic19hdmFpbCA9IGNvdW50OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlMTAwX3N0YXJ0X3JlY2VpdmVyKHN0cnVjdCBuaWMgKm5pYykKK3sKKwkvKiAoUmUpc3RhcnQgUlUgaWYgc3VzcGVuZGVkIG9yIGlkbGUgYW5kIFJGQSBpcyBub24tTlVMTCAqLworCWlmKCFuaWMtPnJ1X3J1bm5pbmcgJiYgbmljLT5yeF90b19jbGVhbi0+c2tiKSB7CisJCWUxMDBfZXhlY19jbWQobmljLCBydWNfc3RhcnQsIG5pYy0+cnhfdG9fY2xlYW4tPmRtYV9hZGRyKTsKKwkJbmljLT5ydV9ydW5uaW5nID0gMTsKKwl9Cit9CisKKyNkZWZpbmUgUkZEX0JVRl9MRU4gKHNpemVvZihzdHJ1Y3QgcmZkKSArIFZMQU5fRVRIX0ZSQU1FX0xFTikKK3N0YXRpYyBpbmxpbmUgaW50IGUxMDBfcnhfYWxsb2Nfc2tiKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHJ4ICpyeCkKK3sKKwlpZighKHJ4LT5za2IgPSBkZXZfYWxsb2Nfc2tiKFJGRF9CVUZfTEVOICsgTkVUX0lQX0FMSUdOKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQWxpZ24sIGluaXQsIGFuZCBtYXAgdGhlIFJGRC4gKi8KKwlyeC0+c2tiLT5kZXYgPSBuaWMtPm5ldGRldjsKKwlza2JfcmVzZXJ2ZShyeC0+c2tiLCBORVRfSVBfQUxJR04pOworCW1lbWNweShyeC0+c2tiLT5kYXRhLCAmbmljLT5ibGFua19yZmQsIHNpemVvZihzdHJ1Y3QgcmZkKSk7CisJcngtPmRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUobmljLT5wZGV2LCByeC0+c2tiLT5kYXRhLAorCQlSRkRfQlVGX0xFTiwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKworCS8qIExpbmsgdGhlIFJGRCB0byBlbmQgb2YgUkZBIGJ5IGxpbmtpbmcgcHJldmlvdXMgUkZEIHRvCisJICogdGhpcyBvbmUsIGFuZCBjbGVhcmluZyBFTCBiaXQgb2YgcHJldmlvdXMuICAqLworCWlmKHJ4LT5wcmV2LT5za2IpIHsKKwkJc3RydWN0IHJmZCAqcHJldl9yZmQgPSAoc3RydWN0IHJmZCAqKXJ4LT5wcmV2LT5za2ItPmRhdGE7CisJCXB1dF91bmFsaWduZWQoY3B1X3RvX2xlMzIocngtPmRtYV9hZGRyKSwKKwkJCSh1MzIgKikmcHJldl9yZmQtPmxpbmspOworCQl3bWIoKTsKKwkJcHJldl9yZmQtPmNvbW1hbmQgJj0gfmNwdV90b19sZTE2KGNiX2VsKTsKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5pYy0+cGRldiwgcngtPnByZXYtPmRtYV9hZGRyLAorCQkJc2l6ZW9mKHN0cnVjdCByZmQpLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZTEwMF9yeF9pbmRpY2F0ZShzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCByeCAqcngsCisJdW5zaWduZWQgaW50ICp3b3JrX2RvbmUsIHVuc2lnbmVkIGludCB3b3JrX3RvX2RvKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSByeC0+c2tiOworCXN0cnVjdCByZmQgKnJmZCA9IChzdHJ1Y3QgcmZkICopc2tiLT5kYXRhOworCXUxNiByZmRfc3RhdHVzLCBhY3R1YWxfc2l6ZTsKKworCWlmKHVubGlrZWx5KHdvcmtfZG9uZSAmJiAqd29ya19kb25lID49IHdvcmtfdG9fZG8pKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qIE5lZWQgdG8gc3luYyBiZWZvcmUgdGFraW5nIGEgcGVlayBhdCBjYl9jb21wbGV0ZSBiaXQgKi8KKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobmljLT5wZGV2LCByeC0+ZG1hX2FkZHIsCisJCXNpemVvZihzdHJ1Y3QgcmZkKSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlyZmRfc3RhdHVzID0gbGUxNl90b19jcHUocmZkLT5zdGF0dXMpOworCisJRFBSSU5USyhSWF9TVEFUVVMsIERFQlVHLCAic3RhdHVzPTB4JTA0WFxuIiwgcmZkX3N0YXR1cyk7CisKKwkvKiBJZiBkYXRhIGlzbid0IHJlYWR5LCBub3RoaW5nIHRvIGluZGljYXRlICovCisJaWYodW5saWtlbHkoIShyZmRfc3RhdHVzICYgY2JfY29tcGxldGUpKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBHZXQgYWN0dWFsIGRhdGEgc2l6ZSAqLworCWFjdHVhbF9zaXplID0gbGUxNl90b19jcHUocmZkLT5hY3R1YWxfc2l6ZSkgJiAweDNGRkY7CisJaWYodW5saWtlbHkoYWN0dWFsX3NpemUgPiBSRkRfQlVGX0xFTiAtIHNpemVvZihzdHJ1Y3QgcmZkKSkpCisJCWFjdHVhbF9zaXplID0gUkZEX0JVRl9MRU4gLSBzaXplb2Yoc3RydWN0IHJmZCk7CisKKwkvKiBHZXQgZGF0YSAqLworCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LCByeC0+ZG1hX2FkZHIsCisJCVJGRF9CVUZfTEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJLyogUHVsbCBvZmYgdGhlIFJGRCBhbmQgcHV0IHRoZSBhY3R1YWwgZGF0YSAobWludXMgZXRoIGhkcikgKi8KKwlza2JfcmVzZXJ2ZShza2IsIHNpemVvZihzdHJ1Y3QgcmZkKSk7CisJc2tiX3B1dChza2IsIGFjdHVhbF9zaXplKTsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuaWMtPm5ldGRldik7CisKKwlpZih1bmxpa2VseSghKHJmZF9zdGF0dXMgJiBjYl9vaykpKSB7CisJCS8qIERvbid0IGluZGljYXRlIGlmIGhhcmR3YXJlIGluZGljYXRlcyBlcnJvcnMgKi8KKwkJbmljLT5uZXRfc3RhdHMucnhfZHJvcHBlZCsrOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0gZWxzZSBpZihhY3R1YWxfc2l6ZSA+IG5pYy0+bmV0ZGV2LT5tdHUgKyBWTEFOX0VUSF9ITEVOKSB7CisJCS8qIERvbid0IGluZGljYXRlIG92ZXJzaXplZCBmcmFtZXMgKi8KKwkJbmljLT5yeF9vdmVyX2xlbmd0aF9lcnJvcnMrKzsKKwkJbmljLT5uZXRfc3RhdHMucnhfZHJvcHBlZCsrOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0gZWxzZSB7CisJCW5pYy0+bmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKKwkJbmljLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gYWN0dWFsX3NpemU7CisJCW5pYy0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwkJaWYod29ya19kb25lKQorCQkJKCp3b3JrX2RvbmUpKys7CisJfQorCisJcngtPnNrYiA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGUxMDBfcnhfY2xlYW4oc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBpbnQgKndvcmtfZG9uZSwKKwl1bnNpZ25lZCBpbnQgd29ya190b19kbykKK3sKKwlzdHJ1Y3QgcnggKnJ4OworCisJLyogSW5kaWNhdGUgbmV3bHkgYXJyaXZlZCBwYWNrZXRzICovCisJZm9yKHJ4ID0gbmljLT5yeF90b19jbGVhbjsgcngtPnNrYjsgcnggPSBuaWMtPnJ4X3RvX2NsZWFuID0gcngtPm5leHQpIHsKKwkJaWYoZTEwMF9yeF9pbmRpY2F0ZShuaWMsIHJ4LCB3b3JrX2RvbmUsIHdvcmtfdG9fZG8pKQorCQkJYnJlYWs7IC8qIE5vIG1vcmUgdG8gY2xlYW4gKi8KKwl9CisKKwkvKiBBbGxvYyBuZXcgc2ticyB0byByZWZpbGwgbGlzdCAqLworCWZvcihyeCA9IG5pYy0+cnhfdG9fdXNlOyAhcngtPnNrYjsgcnggPSBuaWMtPnJ4X3RvX3VzZSA9IHJ4LT5uZXh0KSB7CisJCWlmKHVubGlrZWx5KGUxMDBfcnhfYWxsb2Nfc2tiKG5pYywgcngpKSkKKwkJCWJyZWFrOyAvKiBCZXR0ZXIgbHVjayBuZXh0IHRpbWUgKHNlZSB3YXRjaGRvZykgKi8KKwl9CisKKwllMTAwX3N0YXJ0X3JlY2VpdmVyKG5pYyk7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfcnhfY2xlYW5fbGlzdChzdHJ1Y3QgbmljICpuaWMpCit7CisJc3RydWN0IHJ4ICpyeDsKKwl1bnNpZ25lZCBpbnQgaSwgY291bnQgPSBuaWMtPnBhcmFtcy5yZmRzLmNvdW50OworCisJaWYobmljLT5yeHMpIHsKKwkJZm9yKHJ4ID0gbmljLT5yeHMsIGkgPSAwOyBpIDwgY291bnQ7IHJ4KyssIGkrKykgeworCQkJaWYocngtPnNrYikgeworCQkJCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LCByeC0+ZG1hX2FkZHIsCisJCQkJCVJGRF9CVUZfTEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2IocngtPnNrYik7CisJCQl9CisJCX0KKwkJa2ZyZWUobmljLT5yeHMpOworCQluaWMtPnJ4cyA9IE5VTEw7CisJfQorCisJbmljLT5yeF90b191c2UgPSBuaWMtPnJ4X3RvX2NsZWFuID0gTlVMTDsKKwluaWMtPnJ1X3J1bm5pbmcgPSAwOworfQorCitzdGF0aWMgaW50IGUxMDBfcnhfYWxsb2NfbGlzdChzdHJ1Y3QgbmljICpuaWMpCit7CisJc3RydWN0IHJ4ICpyeDsKKwl1bnNpZ25lZCBpbnQgaSwgY291bnQgPSBuaWMtPnBhcmFtcy5yZmRzLmNvdW50OworCisJbmljLT5yeF90b191c2UgPSBuaWMtPnJ4X3RvX2NsZWFuID0gTlVMTDsKKworCWlmKCEobmljLT5yeHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcngpICogY291bnQsIEdGUF9BVE9NSUMpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KG5pYy0+cnhzLCAwLCBzaXplb2Yoc3RydWN0IHJ4KSAqIGNvdW50KTsKKworCWZvcihyeCA9IG5pYy0+cnhzLCBpID0gMDsgaSA8IGNvdW50OyByeCsrLCBpKyspIHsKKwkJcngtPm5leHQgPSAoaSArIDEgPCBjb3VudCkgPyByeCArIDEgOiBuaWMtPnJ4czsKKwkJcngtPnByZXYgPSAoaSA9PSAwKSA/IG5pYy0+cnhzICsgY291bnQgLSAxIDogcnggLSAxOworCQlpZihlMTAwX3J4X2FsbG9jX3NrYihuaWMsIHJ4KSkgeworCQkJZTEwMF9yeF9jbGVhbl9saXN0KG5pYyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCW5pYy0+cnhfdG9fdXNlID0gbmljLT5yeF90b19jbGVhbiA9IG5pYy0+cnhzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlMTAwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2X2lkOworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTggc3RhdF9hY2sgPSByZWFkYigmbmljLT5jc3ItPnNjYi5zdGF0X2Fjayk7CisKKwlEUFJJTlRLKElOVFIsIERFQlVHLCAic3RhdF9hY2sgPSAweCUwMlhcbiIsIHN0YXRfYWNrKTsKKworCWlmKHN0YXRfYWNrID09IHN0YXRfYWNrX25vdF9vdXJzIHx8CS8qIE5vdCBvdXIgaW50ZXJydXB0ICovCisJICAgc3RhdF9hY2sgPT0gc3RhdF9hY2tfbm90X3ByZXNlbnQpCS8qIEhhcmR3YXJlIGlzIGVqZWN0ZWQgKi8KKwkJcmV0dXJuIElSUV9OT05FOworCisJLyogQWNrIGludGVycnVwdChzKSAqLworCXdyaXRlYihzdGF0X2FjaywgJm5pYy0+Y3NyLT5zY2Iuc3RhdF9hY2spOworCisJLyogV2UgaGl0IFJlY2VpdmUgTm8gUmVzb3VyY2UgKFJOUik7IHJlc3RhcnQgUlUgYWZ0ZXIgY2xlYW5pbmcgKi8KKwlpZihzdGF0X2FjayAmIHN0YXRfYWNrX3JucikKKwkJbmljLT5ydV9ydW5uaW5nID0gMDsKKworCWUxMDBfZGlzYWJsZV9pcnEobmljKTsKKwluZXRpZl9yeF9zY2hlZHVsZShuZXRkZXYpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGUxMDBfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXVuc2lnbmVkIGludCB3b3JrX3RvX2RvID0gbWluKG5ldGRldi0+cXVvdGEsICpidWRnZXQpOworCXVuc2lnbmVkIGludCB3b3JrX2RvbmUgPSAwOworCWludCB0eF9jbGVhbmVkOworCisJZTEwMF9yeF9jbGVhbihuaWMsICZ3b3JrX2RvbmUsIHdvcmtfdG9fZG8pOworCXR4X2NsZWFuZWQgPSBlMTAwX3R4X2NsZWFuKG5pYyk7CisKKwkvKiBJZiBubyBSeCBhbmQgVHggY2xlYW51cCB3b3JrIHdhcyBkb25lLCBleGl0IHBvbGxpbmcgbW9kZS4gKi8KKwlpZigoIXR4X2NsZWFuZWQgJiYgKHdvcmtfZG9uZSA9PSAwKSkgfHwgIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQluZXRpZl9yeF9jb21wbGV0ZShuZXRkZXYpOworCQllMTAwX2VuYWJsZV9pcnEobmljKTsKKwkJcmV0dXJuIDA7CisJfQorCisJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CisJbmV0ZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBlMTAwX25ldHBvbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWUxMDBfZGlzYWJsZV9pcnEobmljKTsKKwllMTAwX2ludHIobmljLT5wZGV2LT5pcnEsIG5ldGRldiwgTlVMTCk7CisJZTEwMF90eF9jbGVhbihuaWMpOworCWUxMDBfZW5hYmxlX2lycShuaWMpOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZTEwMF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXJldHVybiAmbmljLT5uZXRfc3RhdHM7Cit9CisKK3N0YXRpYyBpbnQgZTEwMF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKworCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKKwllMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX3NldHVwX2lhYWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlMTAwX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCit7CisJaWYobmV3X210dSA8IEVUSF9aTEVOIHx8IG5ld19tdHUgPiBFVEhfREFUQV9MRU4pCisJCXJldHVybiAtRUlOVkFMOworCW5ldGRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlMTAwX2FzZihzdHJ1Y3QgbmljICpuaWMpCit7CisJLyogQVNGIGNhbiBiZSBlbmFibGVkIGZyb20gZWVwcm9tICovCisJcmV0dXJuKChuaWMtPnBkZXYtPmRldmljZSA+PSAweDEwNTApICYmIChuaWMtPnBkZXYtPmRldmljZSA8PSAweDEwNTcpICYmCisJICAgKG5pYy0+ZWVwcm9tW2VlcHJvbV9jb25maWdfYXNmXSAmIGVlcHJvbV9hc2YpICYmCisJICAgIShuaWMtPmVlcHJvbVtlZXByb21fY29uZmlnX2FzZl0gJiBlZXByb21fZ2NsKSAmJgorCSAgICgobmljLT5lZXByb21bZWVwcm9tX3NtYnVzX2FkZHJdICYgMHhGRikgIT0gMHhGRSkpOworfQorCitzdGF0aWMgaW50IGUxMDBfdXAoc3RydWN0IG5pYyAqbmljKQoreworCWludCBlcnI7CisKKwlpZigoZXJyID0gZTEwMF9yeF9hbGxvY19saXN0KG5pYykpKQorCQlyZXR1cm4gZXJyOworCWlmKChlcnIgPSBlMTAwX2FsbG9jX2NicyhuaWMpKSkKKwkJZ290byBlcnJfcnhfY2xlYW5fbGlzdDsKKwlpZigoZXJyID0gZTEwMF9od19pbml0KG5pYykpKQorCQlnb3RvIGVycl9jbGVhbl9jYnM7CisJZTEwMF9zZXRfbXVsdGljYXN0X2xpc3QobmljLT5uZXRkZXYpOworCWUxMDBfc3RhcnRfcmVjZWl2ZXIobmljKTsKKwltb2RfdGltZXIoJm5pYy0+d2F0Y2hkb2csIGppZmZpZXMpOworCWlmKChlcnIgPSByZXF1ZXN0X2lycShuaWMtPnBkZXYtPmlycSwgZTEwMF9pbnRyLCBTQV9TSElSUSwKKwkJbmljLT5uZXRkZXYtPm5hbWUsIG5pYy0+bmV0ZGV2KSkpCisJCWdvdG8gZXJyX25vX2lycTsKKwllMTAwX2VuYWJsZV9pcnEobmljKTsKKwluZXRpZl93YWtlX3F1ZXVlKG5pYy0+bmV0ZGV2KTsKKwlyZXR1cm4gMDsKKworZXJyX25vX2lycToKKwlkZWxfdGltZXJfc3luYygmbmljLT53YXRjaGRvZyk7CitlcnJfY2xlYW5fY2JzOgorCWUxMDBfY2xlYW5fY2JzKG5pYyk7CitlcnJfcnhfY2xlYW5fbGlzdDoKKwllMTAwX3J4X2NsZWFuX2xpc3QobmljKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBlMTAwX2Rvd24oc3RydWN0IG5pYyAqbmljKQoreworCWUxMDBfaHdfcmVzZXQobmljKTsKKwlmcmVlX2lycShuaWMtPnBkZXYtPmlycSwgbmljLT5uZXRkZXYpOworCWRlbF90aW1lcl9zeW5jKCZuaWMtPndhdGNoZG9nKTsKKwluZXRpZl9jYXJyaWVyX29mZihuaWMtPm5ldGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShuaWMtPm5ldGRldik7CisJZTEwMF9jbGVhbl9jYnMobmljKTsKKwllMTAwX3J4X2NsZWFuX2xpc3QobmljKTsKK30KKworc3RhdGljIHZvaWQgZTEwMF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCURQUklOVEsoVFhfRVJSLCBERUJVRywgInNjYi5zdGF0dXM9MHglMDJYXG4iLAorCQlyZWFkYigmbmljLT5jc3ItPnNjYi5zdGF0dXMpKTsKKwllMTAwX2Rvd24obmV0ZGV2X3ByaXYobmV0ZGV2KSk7CisJZTEwMF91cChuZXRkZXZfcHJpdihuZXRkZXYpKTsKK30KKworc3RhdGljIGludCBlMTAwX2xvb3BiYWNrX3Rlc3Qoc3RydWN0IG5pYyAqbmljLCBlbnVtIGxvb3BiYWNrIGxvb3BiYWNrX21vZGUpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyogVXNlIGRyaXZlciByZXNvdXJjZXMgdG8gcGVyZm9ybSBpbnRlcm5hbCBNQUMgb3IgUEhZCisJICogbG9vcGJhY2sgdGVzdC4gIEEgc2luZ2xlIHBhY2tldCBpcyBwcmVwYXJlZCBhbmQgdHJhbnNtaXR0ZWQKKwkgKiBpbiBsb29wYmFjayBtb2RlLCBhbmQgdGhlIHRlc3QgcGFzc2VzIGlmIHRoZSByZWNlaXZlZAorCSAqIHBhY2tldCBjb21wYXJlcyBieXRlLWZvci1ieXRlIHRvIHRoZSB0cmFuc21pdHRlZCBwYWNrZXQuICovCisKKwlpZigoZXJyID0gZTEwMF9yeF9hbGxvY19saXN0KG5pYykpKQorCQlyZXR1cm4gZXJyOworCWlmKChlcnIgPSBlMTAwX2FsbG9jX2NicyhuaWMpKSkKKwkJZ290byBlcnJfY2xlYW5fcng7CisKKwkvKiBJQ0ggUEhZIGxvb3BiYWNrIGlzIGJyb2tlbiBzbyBkbyBNQUMgbG9vcGJhY2sgaW5zdGVhZCAqLworCWlmKG5pYy0+ZmxhZ3MgJiBpY2ggJiYgbG9vcGJhY2tfbW9kZSA9PSBsYl9waHkpCisJCWxvb3BiYWNrX21vZGUgPSBsYl9tYWM7CisKKwluaWMtPmxvb3BiYWNrID0gbG9vcGJhY2tfbW9kZTsKKwlpZigoZXJyID0gZTEwMF9od19pbml0KG5pYykpKQorCQlnb3RvIGVycl9sb29wYmFja19ub25lOworCisJaWYobG9vcGJhY2tfbW9kZSA9PSBsYl9waHkpCisJCW1kaW9fd3JpdGUobmljLT5uZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsCisJCQlCTUNSX0xPT1BCQUNLKTsKKworCWUxMDBfc3RhcnRfcmVjZWl2ZXIobmljKTsKKworCWlmKCEoc2tiID0gZGV2X2FsbG9jX3NrYihFVEhfREFUQV9MRU4pKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9sb29wYmFja19ub25lOworCX0KKwlza2JfcHV0KHNrYiwgRVRIX0RBVEFfTEVOKTsKKwltZW1zZXQoc2tiLT5kYXRhLCAweEZGLCBFVEhfREFUQV9MRU4pOworCWUxMDBfeG1pdF9mcmFtZShza2IsIG5pYy0+bmV0ZGV2KTsKKworCW1zbGVlcCgxMCk7CisKKwlpZihtZW1jbXAobmljLT5yeF90b19jbGVhbi0+c2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCByZmQpLAorCSAgIHNrYi0+ZGF0YSwgRVRIX0RBVEFfTEVOKSkKKwkJZXJyID0gLUVBR0FJTjsKKworZXJyX2xvb3BiYWNrX25vbmU6CisJbWRpb193cml0ZShuaWMtPm5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfQk1DUiwgMCk7CisJbmljLT5sb29wYmFjayA9IGxiX25vbmU7CisJZTEwMF9od19pbml0KG5pYyk7CisJZTEwMF9jbGVhbl9jYnMobmljKTsKK2Vycl9jbGVhbl9yeDoKKwllMTAwX3J4X2NsZWFuX2xpc3QobmljKTsKKwlyZXR1cm4gZXJyOworfQorCisjZGVmaW5lIE1JSV9MRURfQ09OVFJPTAkweDFCCitzdGF0aWMgdm9pZCBlMTAwX2JsaW5rX2xlZCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5pYyAqbmljID0gKHN0cnVjdCBuaWMgKilkYXRhOworCWVudW0gbGVkX3N0YXRlIHsKKwkJbGVkX29uICAgICA9IDB4MDEsCisJCWxlZF9vZmYgICAgPSAweDA0LAorCQlsZWRfb25fNTU5ID0gMHgwNSwKKwkJbGVkX29uXzU1NyA9IDB4MDcsCisJfTsKKworCW5pYy0+bGVkcyA9IChuaWMtPmxlZHMgJiBsZWRfb24pID8gbGVkX29mZiA6CisJCShuaWMtPm1hYyA8IG1hY184MjU1OV9EMTAxTSkgPyBsZWRfb25fNTU3IDogbGVkX29uXzU1OTsKKwltZGlvX3dyaXRlKG5pYy0+bmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9MRURfQ09OVFJPTCwgbmljLT5sZWRzKTsKKwltb2RfdGltZXIoJm5pYy0+YmxpbmtfdGltZXIsIGppZmZpZXMgKyBIWiAvIDQpOworfQorCitzdGF0aWMgaW50IGUxMDBfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJcmV0dXJuIG1paV9ldGh0b29sX2dzZXQoJm5pYy0+bWlpLCBjbWQpOworfQorCitzdGF0aWMgaW50IGUxMDBfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IGVycjsKKworCW1kaW9fd3JpdGUobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKwllcnIgPSBtaWlfZXRodG9vbF9zc2V0KCZuaWMtPm1paSwgY21kKTsKKwllMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX2NvbmZpZ3VyZSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBlMTAwX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5md192ZXJzaW9uLCAiTi9BIik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShuaWMtPnBkZXYpKTsKK30KKworc3RhdGljIGludCBlMTAwX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisjZGVmaW5lIEUxMDBfUEhZX1JFR1MJCTB4MUMKKyNkZWZpbmUgRTEwMF9SRUdTX0xFTgkJMSArIEUxMDBfUEhZX1JFR1MgKyBcCisJc2l6ZW9mKG5pYy0+bWVtLT5kdW1wX2J1ZikgLyBzaXplb2YodTMyKQorCXJldHVybiBFMTAwX1JFR1NfTEVOICogc2l6ZW9mKHUzMik7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwlzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpwKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTMyICpidWZmID0gcDsKKwlpbnQgaTsKKworCXJlZ3MtPnZlcnNpb24gPSAoMSA8PCAyNCkgfCBuaWMtPnJldl9pZDsKKwlidWZmWzBdID0gcmVhZGIoJm5pYy0+Y3NyLT5zY2IuY21kX2hpKSA8PCAyNCB8CisJCXJlYWRiKCZuaWMtPmNzci0+c2NiLmNtZF9sbykgPDwgMTYgfAorCQlyZWFkdygmbmljLT5jc3ItPnNjYi5zdGF0dXMpOworCWZvcihpID0gRTEwMF9QSFlfUkVHUzsgaSA+PSAwOyBpLS0pCisJCWJ1ZmZbMSArIEUxMDBfUEhZX1JFR1MgLSBpXSA9CisJCQltZGlvX3JlYWQobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIGkpOworCW1lbXNldChuaWMtPm1lbS0+ZHVtcF9idWYsIDAsIHNpemVvZihuaWMtPm1lbS0+ZHVtcF9idWYpKTsKKwllMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX2R1bXApOworCW1zbGVlcCgxMCk7CisJbWVtY3B5KCZidWZmWzIgKyBFMTAwX1BIWV9SRUdTXSwgbmljLT5tZW0tPmR1bXBfYnVmLAorCQlzaXplb2YobmljLT5tZW0tPmR1bXBfYnVmKSk7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl3b2wtPnN1cHBvcnRlZCA9IChuaWMtPm1hYyA+PSBtYWNfODI1NThfRDEwMV9BNCkgPyAgV0FLRV9NQUdJQyA6IDA7CisJd29sLT53b2xvcHRzID0gKG5pYy0+ZmxhZ3MgJiB3b2xfbWFnaWMpID8gV0FLRV9NQUdJQyA6IDA7Cit9CisKK3N0YXRpYyBpbnQgZTEwMF9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYod29sLT53b2xvcHRzICE9IFdBS0VfTUFHSUMgJiYgd29sLT53b2xvcHRzICE9IDApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmKHdvbC0+d29sb3B0cykKKwkJbmljLT5mbGFncyB8PSB3b2xfbWFnaWM7CisJZWxzZQorCQluaWMtPmZsYWdzICY9IH53b2xfbWFnaWM7CisKKwlwY2lfZW5hYmxlX3dha2UobmljLT5wZGV2LCAwLCBuaWMtPmZsYWdzICYgKHdvbF9tYWdpYyB8IGUxMDBfYXNmKG5pYykpKTsKKwllMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX2NvbmZpZ3VyZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBlMTAwX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJcmV0dXJuIG5pYy0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgZTEwMF9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHZhbHVlKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJbmljLT5tc2dfZW5hYmxlID0gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgZTEwMF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmbmljLT5taWkpOworfQorCitzdGF0aWMgdTMyIGUxMDBfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXJldHVybiBtaWlfbGlua19vaygmbmljLT5taWkpOworfQorCitzdGF0aWMgaW50IGUxMDBfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXJldHVybiBuaWMtPmVlcHJvbV93YyA8PCAxOworfQorCisjZGVmaW5lIEUxMDBfRUVQUk9NX01BR0lDCTB4MTIzNAorc3RhdGljIGludCBlMTAwX2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwlzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmJ5dGVzKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwllZXByb20tPm1hZ2ljID0gRTEwMF9FRVBST01fTUFHSUM7CisJbWVtY3B5KGJ5dGVzLCAmKCh1OCAqKW5pYy0+ZWVwcm9tKVtlZXByb20tPm9mZnNldF0sIGVlcHJvbS0+bGVuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGUxMDBfc2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCXN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqYnl0ZXMpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWlmKGVlcHJvbS0+bWFnaWMgIT0gRTEwMF9FRVBST01fTUFHSUMpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtY3B5KCYoKHU4ICopbmljLT5lZXByb20pW2VlcHJvbS0+b2Zmc2V0XSwgYnl0ZXMsIGVlcHJvbS0+bGVuKTsKKworCXJldHVybiBlMTAwX2VlcHJvbV9zYXZlKG5pYywgZWVwcm9tLT5vZmZzZXQgPj4gMSwKKwkJKGVlcHJvbS0+bGVuID4+IDEpICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCXN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBwYXJhbV9yYW5nZSAqcmZkcyA9ICZuaWMtPnBhcmFtcy5yZmRzOworCXN0cnVjdCBwYXJhbV9yYW5nZSAqY2JzID0gJm5pYy0+cGFyYW1zLmNiczsKKworCXJpbmctPnJ4X21heF9wZW5kaW5nID0gcmZkcy0+bWF4OworCXJpbmctPnR4X21heF9wZW5kaW5nID0gY2JzLT5tYXg7CisJcmluZy0+cnhfbWluaV9tYXhfcGVuZGluZyA9IDA7CisJcmluZy0+cnhfanVtYm9fbWF4X3BlbmRpbmcgPSAwOworCXJpbmctPnJ4X3BlbmRpbmcgPSByZmRzLT5jb3VudDsKKwlyaW5nLT50eF9wZW5kaW5nID0gY2JzLT5jb3VudDsKKwlyaW5nLT5yeF9taW5pX3BlbmRpbmcgPSAwOworCXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPSAwOworfQorCitzdGF0aWMgaW50IGUxMDBfc2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCXN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBwYXJhbV9yYW5nZSAqcmZkcyA9ICZuaWMtPnBhcmFtcy5yZmRzOworCXN0cnVjdCBwYXJhbV9yYW5nZSAqY2JzID0gJm5pYy0+cGFyYW1zLmNiczsKKworCWlmICgocmluZy0+cnhfbWluaV9wZW5kaW5nKSB8fCAocmluZy0+cnhfanVtYm9fcGVuZGluZykpIAorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJZTEwMF9kb3duKG5pYyk7CisJcmZkcy0+Y291bnQgPSBtYXgocmluZy0+cnhfcGVuZGluZywgcmZkcy0+bWluKTsKKwlyZmRzLT5jb3VudCA9IG1pbihyZmRzLT5jb3VudCwgcmZkcy0+bWF4KTsKKwljYnMtPmNvdW50ID0gbWF4KHJpbmctPnR4X3BlbmRpbmcsIGNicy0+bWluKTsKKwljYnMtPmNvdW50ID0gbWluKGNicy0+Y291bnQsIGNicy0+bWF4KTsKKwlEUFJJTlRLKERSViwgSU5GTywgIlJpbmcgUGFyYW0gc2V0dGluZ3M6IHJ4OiAlZCwgdHggJWRcbiIsCisJICAgICAgICByZmRzLT5jb3VudCwgY2JzLT5jb3VudCk7CisJaWYobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQllMTAwX3VwKG5pYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgZTEwMF9nc3RyaW5nc190ZXN0W11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwkiTGluayB0ZXN0ICAgICAob24vb2ZmbGluZSkiLAorCSJFZXByb20gdGVzdCAgIChvbi9vZmZsaW5lKSIsCisJIlNlbGYgdGVzdCAgICAgICAgKG9mZmxpbmUpIiwKKwkiTWFjIGxvb3BiYWNrICAgICAob2ZmbGluZSkiLAorCSJQaHkgbG9vcGJhY2sgICAgIChvZmZsaW5lKSIsCit9OworI2RlZmluZSBFMTAwX1RFU1RfTEVOCXNpemVvZihlMTAwX2dzdHJpbmdzX3Rlc3QpIC8gRVRIX0dTVFJJTkdfTEVOCisKK3N0YXRpYyBpbnQgZTEwMF9kaWFnX3Rlc3RfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gRTEwMF9URVNUX0xFTjsKK30KKworc3RhdGljIHZvaWQgZTEwMF9kaWFnX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwlzdHJ1Y3QgZXRodG9vbF90ZXN0ICp0ZXN0LCB1NjQgKmRhdGEpCit7CisJc3RydWN0IGV0aHRvb2xfY21kIGNtZDsKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBpLCBlcnI7CisKKwltZW1zZXQoZGF0YSwgMCwgRTEwMF9URVNUX0xFTiAqIHNpemVvZih1NjQpKTsKKwlkYXRhWzBdID0gIW1paV9saW5rX29rKCZuaWMtPm1paSk7CisJZGF0YVsxXSA9IGUxMDBfZWVwcm9tX2xvYWQobmljKTsKKwlpZih0ZXN0LT5mbGFncyAmIEVUSF9URVNUX0ZMX09GRkxJTkUpIHsKKworCQkvKiBzYXZlIHNwZWVkLCBkdXBsZXggJiBhdXRvbmVnIHNldHRpbmdzICovCisJCWVyciA9IG1paV9ldGh0b29sX2dzZXQoJm5pYy0+bWlpLCAmY21kKTsKKworCQlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCQllMTAwX2Rvd24obmljKTsKKwkJZGF0YVsyXSA9IGUxMDBfc2VsZl90ZXN0KG5pYyk7CisJCWRhdGFbM10gPSBlMTAwX2xvb3BiYWNrX3Rlc3QobmljLCBsYl9tYWMpOworCQlkYXRhWzRdID0gZTEwMF9sb29wYmFja190ZXN0KG5pYywgbGJfcGh5KTsKKworCQkvKiByZXN0b3JlIHNwZWVkLCBkdXBsZXggJiBhdXRvbmVnIHNldHRpbmdzICovCisJCWVyciA9IG1paV9ldGh0b29sX3NzZXQoJm5pYy0+bWlpLCAmY21kKTsKKworCQlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCQllMTAwX3VwKG5pYyk7CisJfQorCWZvcihpID0gMDsgaSA8IEUxMDBfVEVTVF9MRU47IGkrKykKKwkJdGVzdC0+ZmxhZ3MgfD0gZGF0YVtpXSA/IEVUSF9URVNUX0ZMX0ZBSUxFRCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgZTEwMF9waHlzX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBkYXRhKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZighZGF0YSB8fCBkYXRhID4gKHUzMikoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWikpCisJCWRhdGEgPSAodTMyKShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKTsKKwltb2RfdGltZXIoJm5pYy0+YmxpbmtfdGltZXIsIGppZmZpZXMpOworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGRhdGEgKiAxMDAwKTsKKwlkZWxfdGltZXJfc3luYygmbmljLT5ibGlua190aW1lcik7CisJbWRpb193cml0ZShuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX0xFRF9DT05UUk9MLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciBlMTAwX2dzdHJpbmdzX3N0YXRzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwkicnhfcGFja2V0cyIsICJ0eF9wYWNrZXRzIiwgInJ4X2J5dGVzIiwgInR4X2J5dGVzIiwgInJ4X2Vycm9ycyIsCisJInR4X2Vycm9ycyIsICJyeF9kcm9wcGVkIiwgInR4X2Ryb3BwZWQiLCAibXVsdGljYXN0IiwgImNvbGxpc2lvbnMiLAorCSJyeF9sZW5ndGhfZXJyb3JzIiwgInJ4X292ZXJfZXJyb3JzIiwgInJ4X2NyY19lcnJvcnMiLAorCSJyeF9mcmFtZV9lcnJvcnMiLCAicnhfZmlmb19lcnJvcnMiLCAicnhfbWlzc2VkX2Vycm9ycyIsCisJInR4X2Fib3J0ZWRfZXJyb3JzIiwgInR4X2NhcnJpZXJfZXJyb3JzIiwgInR4X2ZpZm9fZXJyb3JzIiwKKwkidHhfaGVhcnRiZWF0X2Vycm9ycyIsICJ0eF93aW5kb3dfZXJyb3JzIiwKKwkvKiBkZXZpY2Utc3BlY2lmaWMgc3RhdHMgKi8KKwkidHhfZGVmZXJyZWQiLCAidHhfc2luZ2xlX2NvbGxpc2lvbnMiLCAidHhfbXVsdGlfY29sbGlzaW9ucyIsCisJInR4X2Zsb3dfY29udHJvbF9wYXVzZSIsICJyeF9mbG93X2NvbnRyb2xfcGF1c2UiLAorCSJyeF9mbG93X2NvbnRyb2xfdW5zdXBwb3J0ZWQiLCAidHhfdGNvX3BhY2tldHMiLCAicnhfdGNvX3BhY2tldHMiLAorfTsKKyNkZWZpbmUgRTEwMF9ORVRfU1RBVFNfTEVOCTIxCisjZGVmaW5lIEUxMDBfU1RBVFNfTEVOCXNpemVvZihlMTAwX2dzdHJpbmdzX3N0YXRzKSAvIEVUSF9HU1RSSU5HX0xFTgorCitzdGF0aWMgaW50IGUxMDBfZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIEUxMDBfU1RBVFNfTEVOOworfQorCitzdGF0aWMgdm9pZCBlMTAwX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgKmRhdGEpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IEUxMDBfTkVUX1NUQVRTX0xFTjsgaSsrKQorCQlkYXRhW2ldID0gKCh1bnNpZ25lZCBsb25nICopJm5pYy0+bmV0X3N0YXRzKVtpXTsKKworCWRhdGFbaSsrXSA9IG5pYy0+dHhfZGVmZXJyZWQ7CisJZGF0YVtpKytdID0gbmljLT50eF9zaW5nbGVfY29sbGlzaW9uczsKKwlkYXRhW2krK10gPSBuaWMtPnR4X211bHRpcGxlX2NvbGxpc2lvbnM7CisJZGF0YVtpKytdID0gbmljLT50eF9mY19wYXVzZTsKKwlkYXRhW2krK10gPSBuaWMtPnJ4X2ZjX3BhdXNlOworCWRhdGFbaSsrXSA9IG5pYy0+cnhfZmNfdW5zdXBwb3J0ZWQ7CisJZGF0YVtpKytdID0gbmljLT50eF90Y29fZnJhbWVzOworCWRhdGFbaSsrXSA9IG5pYy0+cnhfdGNvX2ZyYW1lczsKK30KKworc3RhdGljIHZvaWQgZTEwMF9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqZGF0YSkKK3sKKwlzd2l0Y2goc3RyaW5nc2V0KSB7CisJY2FzZSBFVEhfU1NfVEVTVDoKKwkJbWVtY3B5KGRhdGEsICplMTAwX2dzdHJpbmdzX3Rlc3QsIHNpemVvZihlMTAwX2dzdHJpbmdzX3Rlc3QpKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCW1lbWNweShkYXRhLCAqZTEwMF9nc3RyaW5nc19zdGF0cywgc2l6ZW9mKGUxMDBfZ3N0cmluZ3Nfc3RhdHMpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGUxMDBfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwkJPSBlMTAwX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IGUxMDBfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwkJPSBlMTAwX2dldF9kcnZpbmZvLAorCS5nZXRfcmVnc19sZW4JCT0gZTEwMF9nZXRfcmVnc19sZW4sCisJLmdldF9yZWdzCQk9IGUxMDBfZ2V0X3JlZ3MsCisJLmdldF93b2wJCT0gZTEwMF9nZXRfd29sLAorCS5zZXRfd29sCQk9IGUxMDBfc2V0X3dvbCwKKwkuZ2V0X21zZ2xldmVsCQk9IGUxMDBfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gZTEwMF9zZXRfbXNnbGV2ZWwsCisJLm53YXlfcmVzZXQJCT0gZTEwMF9ud2F5X3Jlc2V0LAorCS5nZXRfbGluawkJPSBlMTAwX2dldF9saW5rLAorCS5nZXRfZWVwcm9tX2xlbgkJPSBlMTAwX2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tCQk9IGUxMDBfZ2V0X2VlcHJvbSwKKwkuc2V0X2VlcHJvbQkJPSBlMTAwX3NldF9lZXByb20sCisJLmdldF9yaW5ncGFyYW0JCT0gZTEwMF9nZXRfcmluZ3BhcmFtLAorCS5zZXRfcmluZ3BhcmFtCQk9IGUxMDBfc2V0X3JpbmdwYXJhbSwKKwkuc2VsZl90ZXN0X2NvdW50CT0gZTEwMF9kaWFnX3Rlc3RfY291bnQsCisJLnNlbGZfdGVzdAkJPSBlMTAwX2RpYWdfdGVzdCwKKwkuZ2V0X3N0cmluZ3MJCT0gZTEwMF9nZXRfc3RyaW5ncywKKwkucGh5c19pZAkJPSBlMTAwX3BoeXNfaWQsCisJLmdldF9zdGF0c19jb3VudAk9IGUxMDBfZ2V0X3N0YXRzX2NvdW50LAorCS5nZXRfZXRodG9vbF9zdGF0cwk9IGUxMDBfZ2V0X2V0aHRvb2xfc3RhdHMsCit9OworCitzdGF0aWMgaW50IGUxMDBfZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXJldHVybiBnZW5lcmljX21paV9pb2N0bCgmbmljLT5taWksIGlmX21paShpZnIpLCBjbWQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGUxMDBfYWxsb2Moc3RydWN0IG5pYyAqbmljKQoreworCW5pYy0+bWVtID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobmljLT5wZGV2LCBzaXplb2Yoc3RydWN0IG1lbSksCisJCSZuaWMtPmRtYV9hZGRyKTsKKwlyZXR1cm4gbmljLT5tZW0gPyAwIDogLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgZTEwMF9mcmVlKHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpZihuaWMtPm1lbSkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KG5pYy0+cGRldiwgc2l6ZW9mKHN0cnVjdCBtZW0pLAorCQkJbmljLT5tZW0sIG5pYy0+ZG1hX2FkZHIpOworCQluaWMtPm1lbSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGUxMDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IGVyciA9IDA7CisKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCWlmKChlcnIgPSBlMTAwX3VwKG5pYykpKQorCQlEUFJJTlRLKElGVVAsIEVSUiwgIkNhbm5vdCBvcGVuIGludGVyZmFjZSwgYWJvcnRpbmcuXG4iKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGUxMDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwllMTAwX2Rvd24obmV0ZGV2X3ByaXYobmV0ZGV2KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGUxMDBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBuaWMgKm5pYzsKKwlpbnQgZXJyOworCisJaWYoIShuZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5pYykpKSkgeworCQlpZigoKDEgPDwgZGVidWcpIC0gMSkgJiBORVRJRl9NU0dfUFJPQkUpCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJFdGhlcmRldiBhbGxvYyBmYWlsZWQsIGFib3J0LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW5ldGRldi0+b3BlbiA9IGUxMDBfb3BlbjsKKwluZXRkZXYtPnN0b3AgPSBlMTAwX2Nsb3NlOworCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0gZTEwMF94bWl0X2ZyYW1lOworCW5ldGRldi0+Z2V0X3N0YXRzID0gZTEwMF9nZXRfc3RhdHM7CisJbmV0ZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBlMTAwX3NldF9tdWx0aWNhc3RfbGlzdDsKKwluZXRkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGUxMDBfc2V0X21hY19hZGRyZXNzOworCW5ldGRldi0+Y2hhbmdlX210dSA9IGUxMDBfY2hhbmdlX210dTsKKwluZXRkZXYtPmRvX2lvY3RsID0gZTEwMF9kb19pb2N0bDsKKwlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmZTEwMF9ldGh0b29sX29wcyk7CisJbmV0ZGV2LT50eF90aW1lb3V0ID0gZTEwMF90eF90aW1lb3V0OworCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSBFMTAwX1dBVENIRE9HX1BFUklPRDsKKwluZXRkZXYtPnBvbGwgPSBlMTAwX3BvbGw7CisJbmV0ZGV2LT53ZWlnaHQgPSBFMTAwX05BUElfV0VJR0hUOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJbmV0ZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlMTAwX25ldHBvbGw7CisjZW5kaWYKKwlzdHJjcHkobmV0ZGV2LT5uYW1lLCBwY2lfbmFtZShwZGV2KSk7CisKKwluaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCW5pYy0+bmV0ZGV2ID0gbmV0ZGV2OworCW5pYy0+cGRldiA9IHBkZXY7CisJbmljLT5tc2dfZW5hYmxlID0gKDEgPDwgZGVidWcpIC0gMTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgbmV0ZGV2KTsKKworCWlmKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CisJfQorCisJaWYoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiQ2Fubm90IGZpbmQgcHJvcGVyIFBDSSBkZXZpY2UgIgorCQkJImJhc2UgYWRkcmVzcywgYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGRldjsKKwl9CisKKwlpZigoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSkpKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgIkNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlcywgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGRldjsKKwl9CisKKwlpZigoZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweEZGRkZGRkZGVUxMKSkpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihuZXRkZXYpOworCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7CisKKwluaWMtPmNzciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCBzaXplb2Yoc3RydWN0IGNzcikpOworCWlmKCFuaWMtPmNzcikgeworCQlEUFJJTlRLKFBST0JFLCBFUlIsICJDYW5ub3QgbWFwIGRldmljZSByZWdpc3RlcnMsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisKKwlpZihlbnQtPmRyaXZlcl9kYXRhKQorCQluaWMtPmZsYWdzIHw9IGljaDsKKwllbHNlCisJCW5pYy0+ZmxhZ3MgJj0gfmljaDsKKworCWUxMDBfZ2V0X2RlZmF1bHRzKG5pYyk7CisKKwlzcGluX2xvY2tfaW5pdCgmbmljLT5jYl9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbmljLT5jbWRfbG9jayk7CisKKwkvKiBSZXNldCB0aGUgZGV2aWNlIGJlZm9yZSBwY2lfc2V0X21hc3RlcigpIGluIGNhc2UgZGV2aWNlIGlzIGluIHNvbWUKKwkgKiBmdW5reSBzdGF0ZSBhbmQgaGFzIGFuIGludGVycnVwdCBwZW5kaW5nIC0gaGludDogd2UgZG9uJ3QgaGF2ZSB0aGUKKwkgKiBpbnRlcnJ1cHQgaGFuZGxlciByZWdpc3RlcmVkIHlldC4gKi8KKwllMTAwX2h3X3Jlc2V0KG5pYyk7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWluaXRfdGltZXIoJm5pYy0+d2F0Y2hkb2cpOworCW5pYy0+d2F0Y2hkb2cuZnVuY3Rpb24gPSBlMTAwX3dhdGNoZG9nOworCW5pYy0+d2F0Y2hkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKW5pYzsKKwlpbml0X3RpbWVyKCZuaWMtPmJsaW5rX3RpbWVyKTsKKwluaWMtPmJsaW5rX3RpbWVyLmZ1bmN0aW9uID0gZTEwMF9ibGlua19sZWQ7CisJbmljLT5ibGlua190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpbmljOworCisJaWYoKGVyciA9IGUxMDBfYWxsb2MobmljKSkpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiQ2Fubm90IGFsbG9jIGRyaXZlciBtZW1vcnksIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCWUxMDBfcGh5X2luaXQobmljKTsKKworCWlmKChlcnIgPSBlMTAwX2VlcHJvbV9sb2FkKG5pYykpKQorCQlnb3RvIGVycl9vdXRfZnJlZTsKKworCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBuaWMtPmVlcHJvbSwgRVRIX0FMRU4pOworCWlmKCFpc192YWxpZF9ldGhlcl9hZGRyKG5ldGRldi0+ZGV2X2FkZHIpKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgIkludmFsaWQgTUFDIGFkZHJlc3MgZnJvbSAiCisJCQkiRUVQUk9NLCBhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRUFHQUlOOworCQlnb3RvIGVycl9vdXRfZnJlZTsKKwl9CisKKwkvKiBXb2wgbWFnaWMgcGFja2V0IGNhbiBiZSBlbmFibGVkIGZyb20gZWVwcm9tICovCisJaWYoKG5pYy0+bWFjID49IG1hY184MjU1OF9EMTAxX0E0KSAmJgorCSAgIChuaWMtPmVlcHJvbVtlZXByb21faWRdICYgZWVwcm9tX2lkX3dvbCkpCisJCW5pYy0+ZmxhZ3MgfD0gd29sX21hZ2ljOworCisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDAsIG5pYy0+ZmxhZ3MgJiAod29sX21hZ2ljIHwgZTEwMF9hc2YobmljKSkpOworCisJc3RyY3B5KG5ldGRldi0+bmFtZSwgImV0aCVkIik7CisJaWYoKGVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpKSkgeworCQlEUFJJTlRLKFBST0JFLCBFUlIsICJDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisJfQorCisJRFBSSU5USyhQUk9CRSwgSU5GTywgImFkZHIgMHglbHgsIGlycSAlZCwgIgorCQkiTUFDIGFkZHIgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJCXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwgcGRldi0+aXJxLAorCQluZXRkZXYtPmRldl9hZGRyWzBdLCBuZXRkZXYtPmRldl9hZGRyWzFdLCBuZXRkZXYtPmRldl9hZGRyWzJdLAorCQluZXRkZXYtPmRldl9hZGRyWzNdLCBuZXRkZXYtPmRldl9hZGRyWzRdLCBuZXRkZXYtPmRldl9hZGRyWzVdKTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWU6CisJZTEwMF9mcmVlKG5pYyk7CitlcnJfb3V0X2lvdW5tYXA6CisJaW91bm1hcChuaWMtPmNzcik7CitlcnJfb3V0X2ZyZWVfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0X2Rpc2FibGVfcGRldjoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJfb3V0X2ZyZWVfZGV2OgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX25ldGRldihuZXRkZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBlMTAwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYobmV0ZGV2KSB7CisJCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJCWUxMDBfZnJlZShuaWMpOworCQlpb3VubWFwKG5pYy0+Y3NyKTsKKwkJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGUxMDBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJZTEwMF9kb3duKG5pYyk7CisJZTEwMF9od19yZXNldChuaWMpOworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSwgbmljLT5mbGFncyAmICh3b2xfbWFnaWMgfCBlMTAwX2FzZihuaWMpKSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZTEwMF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCWUxMDBfaHdfaW5pdChuaWMpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOworCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJZTEwMF91cChuaWMpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGUxMDBfZHJpdmVyID0geworCS5uYW1lID0gICAgICAgICBEUlZfTkFNRSwKKwkuaWRfdGFibGUgPSAgICAgZTEwMF9pZF90YWJsZSwKKwkucHJvYmUgPSAgICAgICAgZTEwMF9wcm9iZSwKKwkucmVtb3ZlID0gICAgICAgX19kZXZleGl0X3AoZTEwMF9yZW1vdmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gICAgICBlMTAwX3N1c3BlbmQsCisJLnJlc3VtZSA9ICAgICAgIGUxMDBfcmVzdW1lLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlMTAwX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaWYoKCgxIDw8IGRlYnVnKSAtIDEpICYgTkVUSUZfTVNHX0RSVikgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXMsICVzXG4iLCBEUlZfREVTQ1JJUFRJT04sIERSVl9WRVJTSU9OKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzXG4iLCBEUlZfQ09QWVJJR0hUKTsKKwl9CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZTEwMF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZTEwMF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZTEwMF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChlMTAwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGUxMDBfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvTElDRU5TRSBiL2RyaXZlcnMvbmV0L2UxMDAwL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyOTdlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL0xJQ0VOU0UKQEAgLTAsMCArMSwzMzkgQEAKKworIlRoaXMgc29mdHdhcmUgcHJvZ3JhbSBpcyBsaWNlbnNlZCBzdWJqZWN0IHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyhHUEwpLiBWZXJzaW9uIDIsIEp1bmUgMTk5MSwgYXZhaWxhYmxlIGF0IAorPGh0dHA6Ly93d3cuZnNmLm9yZy9jb3B5bGVmdC9ncGwuaHRtbD4iCisKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorCitWZXJzaW9uIDIsIEp1bmUgMTk5MQorCitDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzIGxpY2Vuc2UKK2RvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1ByZWFtYmxlCisKK1RoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0byAKK3NoYXJlIGFuZCBjaGFuZ2UgaXQuIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQKK3RvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgCit0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgCit0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gCit3aG9zZSBhdXRob3JzIGNvbW1pdCB0byB1c2luZyBpdC4gKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIAorc29mdHdhcmUgaXMgY292ZXJlZCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgWW91IAorY2FuIGFwcGx5IGl0IHRvIHlvdXIgcHJvZ3JhbXMsIHRvby4KKworV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdCBwcmljZS4gT3VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgdGhlIGZyZWVkb20gCit0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvciB0aGlzIHNlcnZpY2UgaWYgeW91IAord2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdCBpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgCitjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCAKK3lvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCitUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkIGFueW9uZSB0byAKK2RlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiBUaGVzZSAKK3Jlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91IGRpc3RyaWJ1dGUKK2NvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKK0ZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIgZ3JhdGlzIG9yIAorZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgeW91IGhhdmUuIFlvdSAKK211c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiBBbmQgeW91IAorbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKyAKK1dlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQgKDIpIAorb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIAorYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuIAorCitBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbiB0aGF0IAorZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiBJZiAKK3RoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2Ugd2FudCBpdHMgCityZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbyB0aGF0IGFueSAKK3Byb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsIGF1dGhvcnMnIAorcmVwdXRhdGlvbnMuIAorCitGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLiBXZSAKK3dpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZSBwcm9ncmFtIHdpbGwgCitpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUgcHJvZ3JhbSAKK3Byb3ByaWV0YXJ5LiBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueSBwYXRlbnQgbXVzdCBiZSAKK2xpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuIAorCitUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gCitmb2xsb3cuIAorCitURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucyBhIG5vdGljZQorICAgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIAorICAgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBUaGUgIlByb2dyYW0iLCBiZWxvdywgcmVmZXJzIHRvIGFueQorICAgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIiBtZWFucyBlaXRoZXIgdGhlIAorICAgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIAorICAgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggCisgICBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlciBsYW5ndWFnZS4gKEhlcmVpbmFmdGVyLCAKKyAgIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pIAorICAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuIAorCisgICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdCAKKyAgIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gVGhlIGFjdCBvZiBydW5uaW5nIAorICAgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0gaXMgY292ZXJlZCAKKyAgIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIChpbmRlcGVuZGVudCAKKyAgIG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMKKyAgIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4gCisKKzEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UgY29kZSAKKyAgIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZCAKKyAgIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgCisgICBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIAorICAgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyAKKyAgIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4gCisKKyAgIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZCB5b3UgCisgICBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuIAorCisyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uIG9mIGl0LCAKKyAgIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZCBkaXN0cmlidXRlIHN1Y2ggCisgICBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMSBhYm92ZSwgcHJvdmlkZWQgdGhhdCAKKyAgIHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6IAorCisgICAqIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIAorICAgICAgICB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4gCisKKyAgICogYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluIAorICAgICAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkgcGFydCAKKyAgICAgICAgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMKKyAgICAgICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gCisKKyAgICogYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseSB3aGVuIAorICAgICAgICBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaCBpbnRlcmFjdGl2ZSAKKyAgICAgICAgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbiBhbm5vdW5jZW1lbnQgCisgICAgICAgIGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhIG5vdGljZSB0aGF0IHRoZXJlIGlzCisgICAgICAgIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZSBhIHdhcnJhbnR5KSBhbmQgdGhhdCAKKyAgICAgICAgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlciB0aGVzZSBjb25kaXRpb25zLCBhbmQgCisgICAgICAgIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gKEV4Y2VwdGlvbjogaWYgCisgICAgICAgIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCAKKyAgICAgICAgYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIAorICAgICAgICBwcmludCBhbiBhbm5vdW5jZW1lbnQuKSAKKworICAgVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuIElmIGlkZW50aWZpYWJsZSAKKyAgIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwgYW5kIGNhbiBiZSAKKyAgIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4gdGhlbXNlbHZlcywgdGhlbiAKKyAgIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlIHNlY3Rpb25zIHdoZW4geW91IAorICAgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiBCdXQgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGUgc2FtZSAKKyAgIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIHRoZSAKKyAgIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCB3aG9zZSAKKyAgIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZSBlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIAorICAgZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4gCisKKyAgIFRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdCAKKyAgIHlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0byAKKyAgIGV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvciAKKyAgIGNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uIAorCisgICBJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtIAorICAgd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mIGEgCisgICBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIgdGhlIAorICAgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLiAKKworMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsIHVuZGVyIAorICAgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIAorICAgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAKKworICAgKiBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSAKKyAgICAgICAgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiAKKyAgICAgICAgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLCAKKworICAgKiBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycywgCisgICAgICAgIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIgY29zdCBvZiAKKyAgICAgICAgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUgbWFjaGluZS0KKyAgICAgICAgcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUgZGlzdHJpYnV0ZWQgCisgICAgICAgIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IAorICAgICAgICB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsIAorCisgICAqIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyIHRvIAorICAgICAgICBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuIChUaGlzIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgCisgICAgICAgIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdSByZWNlaXZlZCB0aGUgCisgICAgICAgIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gCisgICAgICAgIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pIAorCisgICBUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yIAorICAgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZSBjb2RlIAorICAgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IAorICAgYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgCisgICBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiBIb3dldmVyLCBhcyBhIHNwZWNpYWwgCisgICBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMgCisgICBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IgCisgICBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoCisgICB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzIHRoZSAKKyAgIGV4ZWN1dGFibGUuIAorCisgICBJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyAKKyAgIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSAKKyAgIHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcyBkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSAKKyAgIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdCBjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIAorICAgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuIAorCis0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gZXhjZXB0IGFzCisgICBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiBBbnkgYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgCisgICBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcyB2b2lkLCBhbmQgd2lsbCAKKyAgIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gSG93ZXZlciwgcGFydGllcyAKKyAgIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QKKyAgIGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCAKKyAgIGNvbXBsaWFuY2UuIAorCis1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3Qgc2lnbmVkIAorICAgaXQuIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yIGRpc3RyaWJ1dGUgCisgICB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlc2UgYWN0aW9ucyBhcmUgcHJvaGliaXRlZCBieSBsYXcgCisgICBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuIFRoZXJlZm9yZSwgYnkgbW9kaWZ5aW5nIG9yIAorICAgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSksIHlvdSAKKyAgIGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZCBhbGwgaXRzIHRlcm1zIGFuZAorICAgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZyB0aGUgUHJvZ3JhbSBvciB3b3JrcyAKKyAgIGJhc2VkIG9uIGl0LiAKKworNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZSAKKyAgIFByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIAorICAgb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0byAKKyAgIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIAorICAgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uIFlvdSBhcmUgbm90IAorICAgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8gdGhpcyBMaWNlbnNlLiAKKworNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudCAKKyAgIGluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksIAorICAgY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvciAKKyAgIG90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QgCisgICBleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiBJZiB5b3UgY2Fubm90IGRpc3RyaWJ1dGUgCisgICBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCAKKyAgIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5IG5vdCAKKyAgIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQgbGljZW5zZSB3b3VsZCAKKyAgIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5IGFsbCB0aG9zZSB3aG8gCisgICByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuIHRoZSBvbmx5IHdheSB5b3UgCisgICBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20gCisgICBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uIAorCisgICBJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55CisgICBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHkKKyAgIGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuIAorCisgICBJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55IAorICAgcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkgCisgICBzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlIAorICAgaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzIGltcGxlbWVudGVkIAorICAgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiBNYW55IHBlb3BsZSBoYXZlIG1hZGUgZ2VuZXJvdXMgY29udHJpYnV0aW9ucworICAgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiAKKyAgIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdCBzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSAKKyAgIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcgdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSAKKyAgIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QgaW1wb3NlIHRoYXQgY2hvaWNlLiAKKworICAgVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvIGJlIAorICAgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuIAorCis4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbiBjZXJ0YWluIAorICAgY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZSBvcmlnaW5hbCAKKyAgIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZCBhbiAKKyAgIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLCAKKyAgIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cyAKKyAgIGV4Y2x1ZGVkLiBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYgCisgICB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4gCisKKzkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIAorICAgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgCisgICBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gCisgICBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4gCisKKyAgIEVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBJZiB0aGUgUHJvZ3JhbSAKKyAgIHNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55IAorICAgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgCisgICBjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IAorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gCisgICBudW1iZXIgb2YgdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIAorCisxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlIHByb2dyYW1zCisgICAgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgCisgICAgZm9yIHBlcm1pc3Npb24uIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAgICBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSAKKyAgICBleGNlcHRpb25zIGZvciB0aGlzLiBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiAKKyAgICBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIAorICAgIG9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LiAKKworICAgTk8gV0FSUkFOVFkKKworMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZIAorICAgIEZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuIEVYQ0VQVCBXSEVOIAorICAgIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMgCisgICAgUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiAKKyAgICBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorICAgIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFIAorICAgIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIAorICAgIFlPVS4gU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgCisgICAgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIAorCisxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HIAorICAgIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IgCisgICAgUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgCisgICAgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgCisgICAgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gCisgICAgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgCisgICAgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiAKKyAgICBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiAKKyAgICBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIAorCitFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKK0lmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QgCitwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0IGZyZWUgCitzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuIAorCitUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gSXQgaXMgc2FmZXN0IHRvIAorYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseSBjb252ZXkgdGhlCitleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlICJjb3B5cmlnaHQiIAorbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4gCisKK29uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhbiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4KK0NvcHlyaWdodCAoQykgeXl5eSAgbmFtZSBvZiBhdXRob3IKKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCit1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKK21vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLiAKKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcyB3aGVuIAoraXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6IAorCitHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgbmFtZSBvZiBhdXRob3IgR25vbW92aXNpb24gY29tZXMgCit3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgJ3Nob3cgdycuICBUaGlzIGlzIGZyZWUgCitzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyAKK3R5cGUgJ3Nob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgJ3Nob3cgdycgYW5kICdzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZSAKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heSBiZSAKK2NhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiAnc2hvdyB3JyBhbmQgJ3Nob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZSAKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uIAorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91ciAKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmIAorbmVjZXNzYXJ5LiBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6IAorCitZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtIAorJ0dub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKK3NpZ25hdHVyZSBvZiBUeSBDb29uLCAxIEFwcmlsIDE5ODkKK1R5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50byAKK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkgCitjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUgCitsaWJyYXJ5LiBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgCitMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9lMTAwMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTlmODk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvTWFrZWZpbGUKQEAgLTAsMCArMSwzNSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgCisjIENvcHlyaWdodChjKSAxOTk5IC0gMjAwMyBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKKyMgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyMgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKKyMgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorIyB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgCisjIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorIyAKKyMgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisjIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisjIAorIyBDb250YWN0IEluZm9ybWF0aW9uOgorIyBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KKyMgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIworIyBNYWtlZmlsZSBmb3IgdGhlIEludGVsKFIpIFBSTy8xMDAwIGV0aGVybmV0IGRyaXZlcgorIworCitvYmotJChDT05GSUdfRTEwMDApICs9IGUxMDAwLm8KKworZTEwMDAtb2JqcyA6PSBlMTAwMF9tYWluLm8gZTEwMDBfaHcubyBlMTAwMF9ldGh0b29sLm8gZTEwMDBfcGFyYW0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaCBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ4OTMwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKQEAgLTAsMCArMSwyNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyAgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKKyAgbW9yZSBkZXRhaWxzLgorICAKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgCisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICAKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgIAorICBDb250YWN0IEluZm9ybWF0aW9uOgorICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIExpbnV4IFBSTy8xMDAwIEV0aGVybmV0IERyaXZlciBtYWluIGhlYWRlciBmaWxlICovCisKKyNpZm5kZWYgX0UxMDAwX0hfCisjZGVmaW5lIF9FMTAwMF9IXworCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaWZkZWYgTkVUSUZfRl9UU08KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisKKyNkZWZpbmUgQkFSXzAJCTAKKyNkZWZpbmUgQkFSXzEJCTEKKyNkZWZpbmUgQkFSXzUJCTUKKworI2RlZmluZSBJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoZGV2aWNlX2lkKSB7XAorCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgZGV2aWNlX2lkKX0KKworc3RydWN0IGUxMDAwX2FkYXB0ZXI7CisKKyNpbmNsdWRlICJlMTAwMF9ody5oIgorCisjaWZkZWYgREJHCisjZGVmaW5lIEUxMDAwX0RCRyhhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiZTEwMDA6ICIgYXJncykKKyNlbHNlCisjZGVmaW5lIEUxMDAwX0RCRyhhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgRTEwMDBfRVJSKGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiAiZTEwMDA6ICIgYXJncykKKworI2RlZmluZSBQRlggImUxMDAwOiAiCisjZGVmaW5lIERQUklOVEsobmxldmVsLCBrbGV2ZWwsIGZtdCwgYXJncy4uLikgXAorCSh2b2lkKSgoTkVUSUZfTVNHXyMjbmxldmVsICYgYWRhcHRlci0+bXNnX2VuYWJsZSkgJiYgXAorCXByaW50ayhLRVJOXyMja2xldmVsIFBGWCAiJXM6ICVzOiAiIGZtdCwgYWRhcHRlci0+bmV0ZGV2LT5uYW1lLCBcCisJCV9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpKQorCisjZGVmaW5lIEUxMDAwX01BWF9JTlRSIDEwCisKKy8qIFRYL1JYIGRlc2NyaXB0b3IgZGVmaW5lcyAqLworI2RlZmluZSBFMTAwMF9ERUZBVUxUX1RYRCAgICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBFMTAwMF9NQVhfVFhEICAgICAgICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBFMTAwMF9NSU5fVFhEICAgICAgICAgICAgICAgICAgICAgICA4MAorI2RlZmluZSBFMTAwMF9NQVhfODI1NDRfVFhEICAgICAgICAgICAgICAgNDA5NgorCisjZGVmaW5lIEUxMDAwX0RFRkFVTFRfUlhEICAgICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIEUxMDAwX01BWF9SWEQgICAgICAgICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIEUxMDAwX01JTl9SWEQgICAgICAgICAgICAgICAgICAgICAgIDgwCisjZGVmaW5lIEUxMDAwX01BWF84MjU0NF9SWEQgICAgICAgICAgICAgICA0MDk2CisKKy8qIFN1cHBvcnRlZCBSeCBCdWZmZXIgU2l6ZXMgKi8KKyNkZWZpbmUgRTEwMDBfUlhCVUZGRVJfMjA0OCAgMjA0OAorI2RlZmluZSBFMTAwMF9SWEJVRkZFUl80MDk2ICA0MDk2CisjZGVmaW5lIEUxMDAwX1JYQlVGRkVSXzgxOTIgIDgxOTIKKyNkZWZpbmUgRTEwMDBfUlhCVUZGRVJfMTYzODQgMTYzODQKKworLyogU21hcnRTcGVlZCBkZWxpbWl0ZXJzICovCisjZGVmaW5lIEUxMDAwX1NNQVJUU1BFRURfRE9XTlNISUZUIDMKKyNkZWZpbmUgRTEwMDBfU01BUlRTUEVFRF9NQVggICAgICAgMTUKKworLyogUGFja2V0IEJ1ZmZlciBhbGxvY2F0aW9ucyAqLworI2RlZmluZSBFMTAwMF9QQkFfQllURVNfU0hJRlQgMHhBCisjZGVmaW5lIEUxMDAwX1RYX0hFQURfQUREUl9TSElGVCA3CisjZGVmaW5lIEUxMDAwX1BCQV9UWF9NQVNLIDB4RkZGRjAwMDAKKworLyogRmxvdyBDb250cm9sIFdhdGVybWFya3MgKi8KKyNkZWZpbmUgRTEwMDBfRkNfSElHSF9ESUZGIDB4MTYzOCAgLyogSGlnaDogNTY4OCBieXRlcyBiZWxvdyBSeCBGSUZPIHNpemUgKi8KKyNkZWZpbmUgRTEwMDBfRkNfTE9XX0RJRkYgMHgxNjQwICAgLyogTG93OiAgNTY5NiBieXRlcyBiZWxvdyBSeCBGSUZPIHNpemUgKi8KKworI2RlZmluZSBFMTAwMF9GQ19QQVVTRV9USU1FIDB4MDY4MCAvKiA4NTggdXNlYyAqLworCisvKiBIb3cgbWFueSBUeCBEZXNjcmlwdG9ycyBkbyB3ZSBuZWVkIHRvIGNhbGwgbmV0aWZfd2FrZV9xdWV1ZSA/ICovCisjZGVmaW5lIEUxMDAwX1RYX1FVRVVFX1dBS0UJMTYKKy8qIEhvdyBtYW55IFJ4IEJ1ZmZlcnMgZG8gd2UgYnVuZGxlIGludG8gb25lIHdyaXRlIHRvIHRoZSBoYXJkd2FyZSA/ICovCisjZGVmaW5lIEUxMDAwX1JYX0JVRkZFUl9XUklURQkxNgkvKiBNdXN0IGJlIHBvd2VyIG9mIDIgKi8KKworI2RlZmluZSBBVVRPX0FMTF9NT0RFUyAgICAgICAwCisjZGVmaW5lIEUxMDAwX0VFUFJPTV84MjU0NF9BUE0gMHgwMDA0CisjZGVmaW5lIEUxMDAwX0VFUFJPTV9BUE1FICAgIDB4MDQwMAorCisjaWZuZGVmIEUxMDAwX01BU1RFUl9TTEFWRQorLyogU3dpdGNoIHRvIG92ZXJyaWRlIFBIWSBtYXN0ZXIvc2xhdmUgc2V0dGluZyAqLworI2RlZmluZSBFMTAwMF9NQVNURVJfU0xBVkUJZTEwMDBfbXNfaHdfZGVmYXVsdAorI2VuZGlmCisKKy8qIG9ubHkgd29ya3MgZm9yIHNpemVzIHRoYXQgYXJlIHBvd2VycyBvZiAyICovCisjZGVmaW5lIEUxMDAwX1JPVU5EVVAoaSwgc2l6ZSkgKChpKSA9ICgoKGkpICsgKHNpemUpIC0gMSkgJiB+KChzaXplKSAtIDEpKSkKKworLyogd3JhcHBlciBhcm91bmQgYSBwb2ludGVyIHRvIGEgc29ja2V0IGJ1ZmZlciwKKyAqIHNvIGEgRE1BIGhhbmRsZSBjYW4gYmUgc3RvcmVkIGFsb25nIHdpdGggdGhlIGJ1ZmZlciAqLworc3RydWN0IGUxMDAwX2J1ZmZlciB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1aW50NjRfdCBkbWE7CisJdW5zaWduZWQgbG9uZyB0aW1lX3N0YW1wOworCXVpbnQxNl90IGxlbmd0aDsKKwl1aW50MTZfdCBuZXh0X3RvX3dhdGNoOworfTsKKworc3RydWN0IGUxMDAwX2Rlc2NfcmluZyB7CisJLyogcG9pbnRlciB0byB0aGUgZGVzY3JpcHRvciByaW5nIG1lbW9yeSAqLworCXZvaWQgKmRlc2M7CisJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRvciByaW5nICovCisJZG1hX2FkZHJfdCBkbWE7CisJLyogbGVuZ3RoIG9mIGRlc2NyaXB0b3IgcmluZyBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBzaXplOworCS8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgcmluZyAqLworCXVuc2lnbmVkIGludCBjb3VudDsKKwkvKiBuZXh0IGRlc2NyaXB0b3IgdG8gYXNzb2NpYXRlIGEgYnVmZmVyIHdpdGggKi8KKwl1bnNpZ25lZCBpbnQgbmV4dF90b191c2U7CisJLyogbmV4dCBkZXNjcmlwdG9yIHRvIGNoZWNrIGZvciBERCBzdGF0dXMgYml0ICovCisJdW5zaWduZWQgaW50IG5leHRfdG9fY2xlYW47CisJLyogYXJyYXkgb2YgYnVmZmVyIGluZm9ybWF0aW9uIHN0cnVjdHMgKi8KKwlzdHJ1Y3QgZTEwMDBfYnVmZmVyICpidWZmZXJfaW5mbzsKK307CisKKyNkZWZpbmUgRTEwMDBfREVTQ19VTlVTRUQoUikgXAorCSgoKChSKS0+bmV4dF90b19jbGVhbiA+IChSKS0+bmV4dF90b191c2UpID8gMCA6IChSKS0+Y291bnQpICsgXAorCShSKS0+bmV4dF90b19jbGVhbiAtIChSKS0+bmV4dF90b191c2UgLSAxKQorCisjZGVmaW5lIEUxMDAwX0dFVF9ERVNDKFIsIGksIHR5cGUpCSgmKCgoc3RydWN0IHR5cGUgKikoKFIpLmRlc2MpKVtpXSkpCisjZGVmaW5lIEUxMDAwX1JYX0RFU0MoUiwgaSkJCUUxMDAwX0dFVF9ERVNDKFIsIGksIGUxMDAwX3J4X2Rlc2MpCisjZGVmaW5lIEUxMDAwX1RYX0RFU0MoUiwgaSkJCUUxMDAwX0dFVF9ERVNDKFIsIGksIGUxMDAwX3R4X2Rlc2MpCisjZGVmaW5lIEUxMDAwX0NPTlRFWFRfREVTQyhSLCBpKQlFMTAwMF9HRVRfREVTQyhSLCBpLCBlMTAwMF9jb250ZXh0X2Rlc2MpCisKKy8qIGJvYXJkIHNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IGUxMDAwX2FkYXB0ZXIgeworCXN0cnVjdCB0aW1lcl9saXN0IHR4X2ZpZm9fc3RhbGxfdGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QgcGh5X2luZm9fdGltZXI7CisJc3RydWN0IHZsYW5fZ3JvdXAgKnZsZ3JwOworCXVpbnQzMl90IGJkX251bWJlcjsKKwl1aW50MzJfdCByeF9idWZmZXJfbGVuOworCXVpbnQzMl90IHBhcnRfbnVtOworCXVpbnQzMl90IHdvbDsKKwl1aW50MzJfdCBzbWFydHNwZWVkOworCXVpbnQzMl90IGVuX21uZ19wdDsKKwl1aW50MTZfdCBsaW5rX3NwZWVkOworCXVpbnQxNl90IGxpbmtfZHVwbGV4OworCXNwaW5sb2NrX3Qgc3RhdHNfbG9jazsKKwlhdG9taWNfdCBpcnFfc2VtOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF90aW1lb3V0X3Rhc2s7CisJc3RydWN0IHdvcmtfc3RydWN0IHdhdGNoZG9nX3Rhc2s7CisJdWludDhfdCBmY19hdXRvbmVnOworCisJc3RydWN0IHRpbWVyX2xpc3QgYmxpbmtfdGltZXI7CisJdW5zaWduZWQgbG9uZyBsZWRfc3RhdHVzOworCisJLyogVFggKi8KKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nIHR4X3Jpbmc7CisJc3RydWN0IGUxMDAwX2J1ZmZlciBwcmV2aW91c19idWZmZXJfaW5mbzsKKwlzcGlubG9ja190IHR4X2xvY2s7CisJdWludDMyX3QgdHhkX2NtZDsKKwl1aW50MzJfdCB0eF9pbnRfZGVsYXk7CisJdWludDMyX3QgdHhfYWJzX2ludF9kZWxheTsKKwl1aW50MzJfdCBnb3RjbDsKKwl1aW50NjRfdCBnb3RjbF9vbGQ7CisJdWludDY0X3QgdHB0X29sZDsKKwl1aW50NjRfdCBjb2xjX29sZDsKKwl1aW50MzJfdCB0eF9maWZvX2hlYWQ7CisJdWludDMyX3QgdHhfaGVhZF9hZGRyOworCXVpbnQzMl90IHR4X2ZpZm9fc2l6ZTsKKwlhdG9taWNfdCB0eF9maWZvX3N0YWxsOworCWJvb2xlYW5fdCBwY2l4XzgyNTQ0OworCWJvb2xlYW5fdCBkZXRlY3RfdHhfaHVuZzsKKworCS8qIFJYICovCisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyByeF9yaW5nOworCXVpbnQ2NF90IGh3X2NzdW1fZXJyOworCXVpbnQ2NF90IGh3X2NzdW1fZ29vZDsKKwl1aW50MzJfdCByeF9pbnRfZGVsYXk7CisJdWludDMyX3QgcnhfYWJzX2ludF9kZWxheTsKKwlib29sZWFuX3QgcnhfY3N1bTsKKwl1aW50MzJfdCBnb3JjbDsKKwl1aW50NjRfdCBnb3JjbF9vbGQ7CisKKwkvKiBJbnRlcnJ1cHQgVGhyb3R0bGUgUmF0ZSAqLworCXVpbnQzMl90IGl0cjsKKworCS8qIE9TIGRlZmluZWQgc3RydWN0cyAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbmV0X3N0YXRzOworCisJLyogc3RydWN0cyBkZWZpbmVkIGluIGUxMDAwX2h3LmggKi8KKwlzdHJ1Y3QgZTEwMDBfaHcgaHc7CisJc3RydWN0IGUxMDAwX2h3X3N0YXRzIHN0YXRzOworCXN0cnVjdCBlMTAwMF9waHlfaW5mbyBwaHlfaW5mbzsKKwlzdHJ1Y3QgZTEwMDBfcGh5X3N0YXRzIHBoeV9zdGF0czsKKworCXVpbnQzMl90IHRlc3RfaWNyOworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgdGVzdF90eF9yaW5nOworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgdGVzdF9yeF9yaW5nOworCisKKwlpbnQgbXNnX2VuYWJsZTsKK307CisjZW5kaWYgLyogX0UxMDAwX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyY2E3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYwpAQCAtMCwwICsxLDE2NzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyAgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKKyAgbW9yZSBkZXRhaWxzLgorICAKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgCisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICAKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgIAorICBDb250YWN0IEluZm9ybWF0aW9uOgorICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBldGh0b29sIHN1cHBvcnQgZm9yIGUxMDAwICovCisKKyNpbmNsdWRlICJlMTAwMC5oIgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworZXh0ZXJuIGNoYXIgZTEwMDBfZHJpdmVyX25hbWVbXTsKK2V4dGVybiBjaGFyIGUxMDAwX2RyaXZlcl92ZXJzaW9uW107CisKK2V4dGVybiBpbnQgZTEwMDBfdXAoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworZXh0ZXJuIHZvaWQgZTEwMDBfZG93bihzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gdm9pZCBlMTAwMF9yZXNldChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gaW50IGUxMDAwX3NldF9zcGRfZHBseChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwgdWludDE2X3Qgc3BkZHBseCk7CitleHRlcm4gaW50IGUxMDAwX3NldHVwX3J4X3Jlc291cmNlcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gaW50IGUxMDAwX3NldHVwX3R4X3Jlc291cmNlcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gdm9pZCBlMTAwMF9mcmVlX3J4X3Jlc291cmNlcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gdm9pZCBlMTAwMF9mcmVlX3R4X3Jlc291cmNlcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gdm9pZCBlMTAwMF91cGRhdGVfc3RhdHMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworCitzdHJ1Y3QgZTEwMDBfc3RhdHMgeworCWNoYXIgc3RhdF9zdHJpbmdbRVRIX0dTVFJJTkdfTEVOXTsKKwlpbnQgc2l6ZW9mX3N0YXQ7CisJaW50IHN0YXRfb2Zmc2V0OworfTsKKworI2RlZmluZSBFMTAwMF9TVEFUKG0pIHNpemVvZigoKHN0cnVjdCBlMTAwMF9hZGFwdGVyICopMCktPm0pLCBcCisJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBlMTAwMF9hZGFwdGVyLCBtKQorc3RhdGljIGNvbnN0IHN0cnVjdCBlMTAwMF9zdGF0cyBlMTAwMF9nc3RyaW5nc19zdGF0c1tdID0geworCXsgInJ4X3BhY2tldHMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy5yeF9wYWNrZXRzKSB9LAorCXsgInR4X3BhY2tldHMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy50eF9wYWNrZXRzKSB9LAorCXsgInJ4X2J5dGVzIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMucnhfYnl0ZXMpIH0sCisJeyAidHhfYnl0ZXMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy50eF9ieXRlcykgfSwKKwl7ICJyeF9lcnJvcnMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy5yeF9lcnJvcnMpIH0sCisJeyAidHhfZXJyb3JzIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMudHhfZXJyb3JzKSB9LAorCXsgInJ4X2Ryb3BwZWQiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy5yeF9kcm9wcGVkKSB9LAorCXsgInR4X2Ryb3BwZWQiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy50eF9kcm9wcGVkKSB9LAorCXsgIm11bHRpY2FzdCIsIEUxMDAwX1NUQVQobmV0X3N0YXRzLm11bHRpY2FzdCkgfSwKKwl7ICJjb2xsaXNpb25zIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMuY29sbGlzaW9ucykgfSwKKwl7ICJyeF9sZW5ndGhfZXJyb3JzIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycykgfSwKKwl7ICJyeF9vdmVyX2Vycm9ycyIsIEUxMDAwX1NUQVQobmV0X3N0YXRzLnJ4X292ZXJfZXJyb3JzKSB9LAorCXsgInJ4X2NyY19lcnJvcnMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzKSB9LAorCXsgInJ4X2ZyYW1lX2Vycm9ycyIsIEUxMDAwX1NUQVQobmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycykgfSwKKwl7ICJyeF9maWZvX2Vycm9ycyIsIEUxMDAwX1NUQVQobmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzKSB9LAorCXsgInJ4X21pc3NlZF9lcnJvcnMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzKSB9LAorCXsgInR4X2Fib3J0ZWRfZXJyb3JzIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMpIH0sCisJeyAidHhfY2Fycmllcl9lcnJvcnMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy50eF9jYXJyaWVyX2Vycm9ycykgfSwKKwl7ICJ0eF9maWZvX2Vycm9ycyIsIEUxMDAwX1NUQVQobmV0X3N0YXRzLnR4X2ZpZm9fZXJyb3JzKSB9LAorCXsgInR4X2hlYXJ0YmVhdF9lcnJvcnMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKSB9LAorCXsgInR4X3dpbmRvd19lcnJvcnMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy50eF93aW5kb3dfZXJyb3JzKSB9LAorCXsgInR4X2Fib3J0X2xhdGVfY29sbCIsIEUxMDAwX1NUQVQoc3RhdHMubGF0ZWNvbCkgfSwKKwl7ICJ0eF9kZWZlcnJlZF9vayIsIEUxMDAwX1NUQVQoc3RhdHMuZGMpIH0sCisJeyAidHhfc2luZ2xlX2NvbGxfb2siLCBFMTAwMF9TVEFUKHN0YXRzLnNjYykgfSwKKwl7ICJ0eF9tdWx0aV9jb2xsX29rIiwgRTEwMDBfU1RBVChzdGF0cy5tY2MpIH0sCisJeyAicnhfbG9uZ19sZW5ndGhfZXJyb3JzIiwgRTEwMDBfU1RBVChzdGF0cy5yb2MpIH0sCisJeyAicnhfc2hvcnRfbGVuZ3RoX2Vycm9ycyIsIEUxMDAwX1NUQVQoc3RhdHMucnVjKSB9LAorCXsgInJ4X2FsaWduX2Vycm9ycyIsIEUxMDAwX1NUQVQoc3RhdHMuYWxnbmVycmMpIH0sCisJeyAidHhfdGNwX3NlZ19nb29kIiwgRTEwMDBfU1RBVChzdGF0cy50c2N0YykgfSwKKwl7ICJ0eF90Y3Bfc2VnX2ZhaWxlZCIsIEUxMDAwX1NUQVQoc3RhdHMudHNjdGZjKSB9LAorCXsgInJ4X2Zsb3dfY29udHJvbF94b24iLCBFMTAwMF9TVEFUKHN0YXRzLnhvbnJ4YykgfSwKKwl7ICJyeF9mbG93X2NvbnRyb2xfeG9mZiIsIEUxMDAwX1NUQVQoc3RhdHMueG9mZnJ4YykgfSwKKwl7ICJ0eF9mbG93X2NvbnRyb2xfeG9uIiwgRTEwMDBfU1RBVChzdGF0cy54b250eGMpIH0sCisJeyAidHhfZmxvd19jb250cm9sX3hvZmYiLCBFMTAwMF9TVEFUKHN0YXRzLnhvZmZ0eGMpIH0sCisJeyAicnhfbG9uZ19ieXRlX2NvdW50IiwgRTEwMDBfU1RBVChzdGF0cy5nb3JjbCkgfSwKKwl7ICJyeF9jc3VtX29mZmxvYWRfZ29vZCIsIEUxMDAwX1NUQVQoaHdfY3N1bV9nb29kKSB9LAorCXsgInJ4X2NzdW1fb2ZmbG9hZF9lcnJvcnMiLCBFMTAwMF9TVEFUKGh3X2NzdW1fZXJyKSB9Cit9OworI2RlZmluZSBFMTAwMF9TVEFUU19MRU4JXAorCXNpemVvZihlMTAwMF9nc3RyaW5nc19zdGF0cykgLyBzaXplb2Yoc3RydWN0IGUxMDAwX3N0YXRzKQorc3RhdGljIGNvbnN0IGNoYXIgZTEwMDBfZ3N0cmluZ3NfdGVzdFtdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisJIlJlZ2lzdGVyIHRlc3QgIChvZmZsaW5lKSIsICJFZXByb20gdGVzdCAgICAob2ZmbGluZSkiLAorCSJJbnRlcnJ1cHQgdGVzdCAob2ZmbGluZSkiLCAiTG9vcGJhY2sgdGVzdCAgKG9mZmxpbmUpIiwKKwkiTGluayB0ZXN0ICAgKG9uL29mZmxpbmUpIgorfTsKKyNkZWZpbmUgRTEwMDBfVEVTVF9MRU4gc2l6ZW9mKGUxMDAwX2dzdHJpbmdzX3Rlc3QpIC8gRVRIX0dTVFJJTkdfTEVOCisKK3N0YXRpYyBpbnQKK2UxMDAwX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKworCWlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisKKwkJZWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQkgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCSAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8CisJCSAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCSAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGx8CisJCSAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfQXV0b25lZyB8CisJCSAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfVFApOworCisJCWVjbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF9UUDsKKworCQlpZihody0+YXV0b25lZyA9PSAxKSB7CisJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0F1dG9uZWc7CisKKwkJCS8qIHRoZSBlMTAwMCBhdXRvbmVnIHNlZW1zIHRvIG1hdGNoIGV0aHRvb2wgbmljZWx5ICovCisKKwkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IGh3LT5hdXRvbmVnX2FkdmVydGlzZWQ7CisJCX0KKworCQllY21kLT5wb3J0ID0gUE9SVF9UUDsKKwkJZWNtZC0+cGh5X2FkZHJlc3MgPSBody0+cGh5X2FkZHI7CisKKwkJaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQzKQorCQkJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOworCQllbHNlCisJCQllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisKKwl9IGVsc2UgeworCQllY21kLT5zdXBwb3J0ZWQgICA9IChTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJCSAgICAgU1VQUE9SVEVEX0ZJQlJFIHwKKwkJCQkgICAgIFNVUFBPUlRFRF9BdXRvbmVnKTsKKworCQllY21kLT5hZHZlcnRpc2luZyA9IChTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJCSAgICAgU1VQUE9SVEVEX0ZJQlJFIHwKKwkJCQkgICAgIFNVUFBPUlRFRF9BdXRvbmVnKTsKKworCQllY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKworCQlpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDUpCisJCQllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisJCWVsc2UKKwkJCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKwl9CisKKwlpZihuZXRpZl9jYXJyaWVyX29rKGFkYXB0ZXItPm5ldGRldikpIHsKKworCQllMTAwMF9nZXRfc3BlZWRfYW5kX2R1cGxleChodywgJmFkYXB0ZXItPmxpbmtfc3BlZWQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkYXB0ZXItPmxpbmtfZHVwbGV4KTsKKwkJZWNtZC0+c3BlZWQgPSBhZGFwdGVyLT5saW5rX3NwZWVkOworCisJCS8qIHVuZm9ydHVuYXRseSBGVUxMX0RVUExFWCAhPSBEVVBMRVhfRlVMTAorCQkgKiAgICAgICAgICBhbmQgSEFMRl9EVVBMRVggIT0gRFVQTEVYX0hBTEYgKi8KKworCQlpZihhZGFwdGVyLT5saW5rX2R1cGxleCA9PSBGVUxMX0RVUExFWCkKKwkJCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQllbHNlCisJCQllY21kLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwl9IGVsc2UgeworCQllY21kLT5zcGVlZCA9IC0xOworCQllY21kLT5kdXBsZXggPSAtMTsKKwl9CisKKwllY21kLT5hdXRvbmVnID0gKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB8fAorCQkJIGh3LT5hdXRvbmVnKSA/IEFVVE9ORUdfRU5BQkxFIDogQVVUT05FR19ESVNBQkxFOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlMTAwMF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwlpZihlY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCWh3LT5hdXRvbmVnID0gMTsKKwkJaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IDB4MDAyRjsKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSAweDAwMkY7CisJfSBlbHNlCisJCWlmKGUxMDAwX3NldF9zcGRfZHBseChhZGFwdGVyLCBlY21kLT5zcGVlZCArIGVjbWQtPmR1cGxleCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHJlc2V0IHRoZSBsaW5rICovCisKKwlpZihuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwkJZTEwMDBfZG93bihhZGFwdGVyKTsKKwkJZTEwMDBfcmVzZXQoYWRhcHRlcik7CisJCWUxMDAwX3VwKGFkYXB0ZXIpOworCX0gZWxzZQorCQllMTAwMF9yZXNldChhZGFwdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwlwYXVzZS0+YXV0b25lZyA9IAorCQkoYWRhcHRlci0+ZmNfYXV0b25lZyA/IEFVVE9ORUdfRU5BQkxFIDogQVVUT05FR19ESVNBQkxFKTsKKwkKKwlpZihody0+ZmMgPT0gZTEwMDBfZmNfcnhfcGF1c2UpCisJCXBhdXNlLT5yeF9wYXVzZSA9IDE7CisJZWxzZSBpZihody0+ZmMgPT0gZTEwMDBfZmNfdHhfcGF1c2UpCisJCXBhdXNlLT50eF9wYXVzZSA9IDE7CisJZWxzZSBpZihody0+ZmMgPT0gZTEwMDBfZmNfZnVsbCkgeworCQlwYXVzZS0+cnhfcGF1c2UgPSAxOworCQlwYXVzZS0+dHhfcGF1c2UgPSAxOworCX0KK30KKworc3RhdGljIGludAorZTEwMDBfc2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJCisJYWRhcHRlci0+ZmNfYXV0b25lZyA9IHBhdXNlLT5hdXRvbmVnOworCisJaWYocGF1c2UtPnJ4X3BhdXNlICYmIHBhdXNlLT50eF9wYXVzZSkKKwkJaHctPmZjID0gZTEwMDBfZmNfZnVsbDsKKwllbHNlIGlmKHBhdXNlLT5yeF9wYXVzZSAmJiAhcGF1c2UtPnR4X3BhdXNlKQorCQlody0+ZmMgPSBlMTAwMF9mY19yeF9wYXVzZTsKKwllbHNlIGlmKCFwYXVzZS0+cnhfcGF1c2UgJiYgcGF1c2UtPnR4X3BhdXNlKQorCQlody0+ZmMgPSBlMTAwMF9mY190eF9wYXVzZTsKKwllbHNlIGlmKCFwYXVzZS0+cnhfcGF1c2UgJiYgIXBhdXNlLT50eF9wYXVzZSkKKwkJaHctPmZjID0gZTEwMDBfZmNfbm9uZTsKKworCWh3LT5vcmlnaW5hbF9mYyA9IGh3LT5mYzsKKworCWlmKGFkYXB0ZXItPmZjX2F1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJaWYobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CisJCQllMTAwMF9kb3duKGFkYXB0ZXIpOworCQkJZTEwMDBfdXAoYWRhcHRlcik7CisJCX0gZWxzZQorCQkJZTEwMDBfcmVzZXQoYWRhcHRlcik7CisJfQorCWVsc2UKKwkJcmV0dXJuICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgPworCQkJZTEwMDBfc2V0dXBfbGluayhodykgOiBlMTAwMF9mb3JjZV9tYWNfZmMoaHcpKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90CitlMTAwMF9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXJldHVybiBhZGFwdGVyLT5yeF9jc3VtOworfQorCitzdGF0aWMgaW50CitlMTAwMF9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBkYXRhKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWFkYXB0ZXItPnJ4X2NzdW0gPSBkYXRhOworCisJaWYobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCWUxMDAwX2Rvd24oYWRhcHRlcik7CisJCWUxMDAwX3VwKGFkYXB0ZXIpOworCX0gZWxzZQorCQllMTAwMF9yZXNldChhZGFwdGVyKTsKKwlyZXR1cm4gMDsKK30KKwkKK3N0YXRpYyB1aW50MzJfdAorZTEwMDBfZ2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX0NTVU0pICE9IDA7Cit9CisKK3N0YXRpYyBpbnQKK2UxMDAwX3NldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IGRhdGEpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisKKwlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKSB7CisJCWlmICghZGF0YSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGF0YSkKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX0NTVU07CisJZWxzZQorCQluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0hXX0NTVU07CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE5FVElGX0ZfVFNPCitzdGF0aWMgaW50CitlMTAwMF9zZXRfdHNvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IGRhdGEpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJaWYgKChhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTQ0KSB8fAorCSAgICAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSAKKwkJcmV0dXJuIGRhdGEgPyAtRUlOVkFMIDogMDsKKworCWlmIChkYXRhKQorCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOworCWVsc2UKKwkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9UU087CisJcmV0dXJuIDA7Cit9IAorI2VuZGlmIC8qIE5FVElGX0ZfVFNPICovCisKK3N0YXRpYyB1aW50MzJfdAorZTEwMDBfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJcmV0dXJuIGFkYXB0ZXItPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwMF9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlhZGFwdGVyLT5tc2dfZW5hYmxlID0gZGF0YTsKK30KKworc3RhdGljIGludCAKK2UxMDAwX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworI2RlZmluZSBFMTAwMF9SRUdTX0xFTiAzMgorCXJldHVybiBFMTAwMF9SRUdTX0xFTiAqIHNpemVvZih1aW50MzJfdCk7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwMF9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpwKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdWludDMyX3QgKnJlZ3NfYnVmZiA9IHA7CisJdWludDE2X3QgcGh5X2RhdGE7CisKKwltZW1zZXQocCwgMCwgRTEwMDBfUkVHU19MRU4gKiBzaXplb2YodWludDMyX3QpKTsKKworCXJlZ3MtPnZlcnNpb24gPSAoMSA8PCAyNCkgfCAoaHctPnJldmlzaW9uX2lkIDw8IDE2KSB8IGh3LT5kZXZpY2VfaWQ7CisKKwlyZWdzX2J1ZmZbMF0gID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCXJlZ3NfYnVmZlsxXSAgPSBFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKTsKKworCXJlZ3NfYnVmZlsyXSAgPSBFMTAwMF9SRUFEX1JFRyhodywgUkNUTCk7CisJcmVnc19idWZmWzNdICA9IEUxMDAwX1JFQURfUkVHKGh3LCBSRExFTik7CisJcmVnc19idWZmWzRdICA9IEUxMDAwX1JFQURfUkVHKGh3LCBSREgpOworCXJlZ3NfYnVmZls1XSAgPSBFMTAwMF9SRUFEX1JFRyhodywgUkRUKTsKKwlyZWdzX2J1ZmZbNl0gID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJEVFIpOworCisJcmVnc19idWZmWzddICA9IEUxMDAwX1JFQURfUkVHKGh3LCBUQ1RMKTsKKwlyZWdzX2J1ZmZbOF0gID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRETEVOKTsKKwlyZWdzX2J1ZmZbOV0gID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRESCk7CisJcmVnc19idWZmWzEwXSA9IEUxMDAwX1JFQURfUkVHKGh3LCBURFQpOworCXJlZ3NfYnVmZlsxMV0gPSBFMTAwMF9SRUFEX1JFRyhodywgVElEVik7CisKKwlyZWdzX2J1ZmZbMTJdID0gYWRhcHRlci0+aHcucGh5X3R5cGU7ICAvKiBQSFkgdHlwZSAoSUdQPTEsIE04OD0wKSAqLworCWlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CisJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAorCQkJCSAgICBJR1AwMUUxMDAwX1BIWV9BR0NfQSk7CisJCWUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfQUdDX0EgJgorCQkJCSAgIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULCAmcGh5X2RhdGEpOworCQlyZWdzX2J1ZmZbMTNdID0gKHVpbnQzMl90KXBoeV9kYXRhOyAvKiBjYWJsZSBsZW5ndGggKi8KKwkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCisJCQkJICAgIElHUDAxRTEwMDBfUEhZX0FHQ19CKTsKKwkJZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9BR0NfQiAmCisJCQkJICAgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsICZwaHlfZGF0YSk7CisJCXJlZ3NfYnVmZlsxNF0gPSAodWludDMyX3QpcGh5X2RhdGE7IC8qIGNhYmxlIGxlbmd0aCAqLworCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKKwkJCQkgICAgSUdQMDFFMTAwMF9QSFlfQUdDX0MpOworCQllMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX0FHQ19DICYKKwkJCQkgICBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgJnBoeV9kYXRhKTsKKwkJcmVnc19idWZmWzE1XSA9ICh1aW50MzJfdClwaHlfZGF0YTsgLyogY2FibGUgbGVuZ3RoICovCisJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAorCQkJCSAgICBJR1AwMUUxMDAwX1BIWV9BR0NfRCk7CisJCWUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfQUdDX0QgJgorCQkJCSAgIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULCAmcGh5X2RhdGEpOworCQlyZWdzX2J1ZmZbMTZdID0gKHVpbnQzMl90KXBoeV9kYXRhOyAvKiBjYWJsZSBsZW5ndGggKi8KKwkJcmVnc19idWZmWzE3XSA9IDA7IC8qIGV4dGVuZGVkIDEwYnQgZGlzdGFuY2UgKG5vdCBuZWVkZWQpICovCisJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDApOworCQllMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfU1RBVFVTICYKKwkJCQkgICBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgJnBoeV9kYXRhKTsKKwkJcmVnc19idWZmWzE4XSA9ICh1aW50MzJfdClwaHlfZGF0YTsgLyogY2FibGUgcG9sYXJpdHkgKi8KKwkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCisJCQkJICAgIElHUDAxRTEwMDBfUEhZX1BDU19JTklUX1JFRyk7CisJCWUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUENTX0lOSVRfUkVHICYKKwkJCQkgICBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgJnBoeV9kYXRhKTsKKwkJcmVnc19idWZmWzE5XSA9ICh1aW50MzJfdClwaHlfZGF0YTsgLyogY2FibGUgcG9sYXJpdHkgKi8KKwkJcmVnc19idWZmWzIwXSA9IDA7IC8qIHBvbGFyaXR5IGNvcnJlY3Rpb24gZW5hYmxlZCAoYWx3YXlzKSAqLworCQlyZWdzX2J1ZmZbMjJdID0gMDsgLyogcGh5IHJlY2VpdmUgZXJyb3JzICh1bmF2YWlsYWJsZSkgKi8KKwkJcmVnc19idWZmWzIzXSA9IHJlZ3NfYnVmZlsxOF07IC8qIG1kaXggbW9kZSAqLworCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMHgwKTsKKwl9IGVsc2UgeworICAgICAgICAJZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMsICZwaHlfZGF0YSk7CisJCXJlZ3NfYnVmZlsxM10gPSAodWludDMyX3QpcGh5X2RhdGE7IC8qIGNhYmxlIGxlbmd0aCAqLworCQlyZWdzX2J1ZmZbMTRdID0gMDsgIC8qIER1bW15ICh0byBhbGlnbiB3LyBJR1AgcGh5IHJlZyBkdW1wKSAqLworCQlyZWdzX2J1ZmZbMTVdID0gMDsgIC8qIER1bW15ICh0byBhbGlnbiB3LyBJR1AgcGh5IHJlZyBkdW1wKSAqLworCQlyZWdzX2J1ZmZbMTZdID0gMDsgIC8qIER1bW15ICh0byBhbGlnbiB3LyBJR1AgcGh5IHJlZyBkdW1wKSAqLworICAgICAgICAJZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCAmcGh5X2RhdGEpOworCQlyZWdzX2J1ZmZbMTddID0gKHVpbnQzMl90KXBoeV9kYXRhOyAvKiBleHRlbmRlZCAxMGJ0IGRpc3RhbmNlICovCisJCXJlZ3NfYnVmZlsxOF0gPSByZWdzX2J1ZmZbMTNdOyAvKiBjYWJsZSBwb2xhcml0eSAqLworCQlyZWdzX2J1ZmZbMTldID0gMDsgIC8qIER1bW15ICh0byBhbGlnbiB3LyBJR1AgcGh5IHJlZyBkdW1wKSAqLworCQlyZWdzX2J1ZmZbMjBdID0gcmVnc19idWZmWzE3XTsgLyogcG9sYXJpdHkgY29ycmVjdGlvbiAqLworCQkvKiBwaHkgcmVjZWl2ZSBlcnJvcnMgKi8KKwkJcmVnc19idWZmWzIyXSA9IGFkYXB0ZXItPnBoeV9zdGF0cy5yZWNlaXZlX2Vycm9yczsKKwkJcmVnc19idWZmWzIzXSA9IHJlZ3NfYnVmZlsxM107IC8qIG1kaXggbW9kZSAqLworCX0KKwlyZWdzX2J1ZmZbMjFdID0gYWRhcHRlci0+cGh5X3N0YXRzLmlkbGVfZXJyb3JzOyAgLyogcGh5IGlkbGUgZXJyb3JzICovCisJZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfU1RBVFVTLCAmcGh5X2RhdGEpOworCXJlZ3NfYnVmZlsyNF0gPSAodWludDMyX3QpcGh5X2RhdGE7ICAvKiBwaHkgbG9jYWwgcmVjZWl2ZXIgc3RhdHVzICovCisJcmVnc19idWZmWzI1XSA9IHJlZ3NfYnVmZlsyNF07ICAvKiBwaHkgcmVtb3RlIHJlY2VpdmVyIHN0YXR1cyAqLworCWlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCAmJgorCSAgIGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisJCXJlZ3NfYnVmZlsyNl0gPSBFMTAwMF9SRUFEX1JFRyhodywgTUFOQyk7CisJfQorfQorCitzdGF0aWMgaW50CitlMTAwMF9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXJldHVybiBhZGFwdGVyLT5ody5lZXByb20ud29yZF9zaXplICogMjsKK30KKworc3RhdGljIGludAorZTEwMDBfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1aW50OF90ICpieXRlcykKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXVpbnQxNl90ICplZXByb21fYnVmZjsKKwlpbnQgZmlyc3Rfd29yZCwgbGFzdF93b3JkOworCWludCByZXRfdmFsID0gMDsKKwl1aW50MTZfdCBpOworCisJaWYoZWVwcm9tLT5sZW4gPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllZXByb20tPm1hZ2ljID0gaHctPnZlbmRvcl9pZCB8IChody0+ZGV2aWNlX2lkIDw8IDE2KTsKKworCWZpcnN0X3dvcmQgPSBlZXByb20tPm9mZnNldCA+PiAxOworCWxhc3Rfd29yZCA9IChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuIC0gMSkgPj4gMTsKKworCWVlcHJvbV9idWZmID0ga21hbGxvYyhzaXplb2YodWludDE2X3QpICoKKwkJCShsYXN0X3dvcmQgLSBmaXJzdF93b3JkICsgMSksIEdGUF9LRVJORUwpOworCWlmKCFlZXByb21fYnVmZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZihody0+ZWVwcm9tLnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkKKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBmaXJzdF93b3JkLAorCQkJCQkgICAgbGFzdF93b3JkIC0gZmlyc3Rfd29yZCArIDEsCisJCQkJCSAgICBlZXByb21fYnVmZik7CisJZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBsYXN0X3dvcmQgLSBmaXJzdF93b3JkICsgMTsgaSsrKQorCQkJaWYoKHJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgZmlyc3Rfd29yZCArIGksIDEsCisJCQkJCQkJJmVlcHJvbV9idWZmW2ldKSkpCisJCQkJYnJlYWs7CisJfQorCisJLyogRGV2aWNlJ3MgZWVwcm9tIGlzIGFsd2F5cyBsaXR0bGUtZW5kaWFuLCB3b3JkIGFkZHJlc3NhYmxlICovCisJZm9yIChpID0gMDsgaSA8IGxhc3Rfd29yZCAtIGZpcnN0X3dvcmQgKyAxOyBpKyspCisJCWxlMTZfdG9fY3B1cygmZWVwcm9tX2J1ZmZbaV0pOworCisJbWVtY3B5KGJ5dGVzLCAodWludDhfdCAqKWVlcHJvbV9idWZmICsgKGVlcHJvbS0+b2Zmc2V0ICYgMSksCisJCQllZXByb20tPmxlbik7CisJa2ZyZWUoZWVwcm9tX2J1ZmYpOworCisJcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyBpbnQKK2UxMDAwX3NldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdWludDhfdCAqYnl0ZXMpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1aW50MTZfdCAqZWVwcm9tX2J1ZmY7CisJdm9pZCAqcHRyOworCWludCBtYXhfbGVuLCBmaXJzdF93b3JkLCBsYXN0X3dvcmQsIHJldF92YWwgPSAwOworCXVpbnQxNl90IGk7CisKKwlpZihlZXByb20tPmxlbiA9PSAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZihlZXByb20tPm1hZ2ljICE9IChody0+dmVuZG9yX2lkIHwgKGh3LT5kZXZpY2VfaWQgPDwgMTYpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltYXhfbGVuID0gaHctPmVlcHJvbS53b3JkX3NpemUgKiAyOworCisJZmlyc3Rfd29yZCA9IGVlcHJvbS0+b2Zmc2V0ID4+IDE7CisJbGFzdF93b3JkID0gKGVlcHJvbS0+b2Zmc2V0ICsgZWVwcm9tLT5sZW4gLSAxKSA+PiAxOworCWVlcHJvbV9idWZmID0ga21hbGxvYyhtYXhfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZighZWVwcm9tX2J1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHRyID0gKHZvaWQgKillZXByb21fYnVmZjsKKworCWlmKGVlcHJvbS0+b2Zmc2V0ICYgMSkgeworCQkvKiBuZWVkIHJlYWQvbW9kaWZ5L3dyaXRlIG9mIGZpcnN0IGNoYW5nZWQgRUVQUk9NIHdvcmQgKi8KKwkJLyogb25seSB0aGUgc2Vjb25kIGJ5dGUgb2YgdGhlIHdvcmQgaXMgYmVpbmcgbW9kaWZpZWQgKi8KKwkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBmaXJzdF93b3JkLCAxLAorCQkJCQkgICAgJmVlcHJvbV9idWZmWzBdKTsKKwkJcHRyKys7CisJfQorCWlmKCgoZWVwcm9tLT5vZmZzZXQgKyBlZXByb20tPmxlbikgJiAxKSAmJiAocmV0X3ZhbCA9PSAwKSkgeworCQkvKiBuZWVkIHJlYWQvbW9kaWZ5L3dyaXRlIG9mIGxhc3QgY2hhbmdlZCBFRVBST00gd29yZCAqLworCQkvKiBvbmx5IHRoZSBmaXJzdCBieXRlIG9mIHRoZSB3b3JkIGlzIGJlaW5nIG1vZGlmaWVkICovCisJCXJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgbGFzdF93b3JkLCAxLAorCQkgICAgICAgICAgICAgICAgICAmZWVwcm9tX2J1ZmZbbGFzdF93b3JkIC0gZmlyc3Rfd29yZF0pOworCX0KKworCS8qIERldmljZSdzIGVlcHJvbSBpcyBhbHdheXMgbGl0dGxlLWVuZGlhbiwgd29yZCBhZGRyZXNzYWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCBsYXN0X3dvcmQgLSBmaXJzdF93b3JkICsgMTsgaSsrKQorCQlsZTE2X3RvX2NwdXMoJmVlcHJvbV9idWZmW2ldKTsKKworCW1lbWNweShwdHIsIGJ5dGVzLCBlZXByb20tPmxlbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGFzdF93b3JkIC0gZmlyc3Rfd29yZCArIDE7IGkrKykKKwkJZWVwcm9tX2J1ZmZbaV0gPSBjcHVfdG9fbGUxNihlZXByb21fYnVmZltpXSk7CisKKwlyZXRfdmFsID0gZTEwMDBfd3JpdGVfZWVwcm9tKGh3LCBmaXJzdF93b3JkLAorCQkJCSAgICAgbGFzdF93b3JkIC0gZmlyc3Rfd29yZCArIDEsIGVlcHJvbV9idWZmKTsKKworCS8qIFVwZGF0ZSB0aGUgY2hlY2tzdW0gb3ZlciB0aGUgZmlyc3QgcGFydCBvZiB0aGUgRUVQUk9NIGlmIG5lZWRlZCAqLworCWlmKChyZXRfdmFsID09IDApICYmIGZpcnN0X3dvcmQgPD0gRUVQUk9NX0NIRUNLU1VNX1JFRykKKwkJZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bShodyk7CisKKwlrZnJlZShlZXByb21fYnVmZik7CisJcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwMF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJc3RybmNweShkcnZpbmZvLT5kcml2ZXIsICBlMTAwMF9kcml2ZXJfbmFtZSwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgZTEwMDBfZHJpdmVyX3ZlcnNpb24sIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sICJOL0EiLCAzMik7CisJc3RybmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldiksIDMyKTsKKwlkcnZpbmZvLT5uX3N0YXRzID0gRTEwMDBfU1RBVFNfTEVOOworCWRydmluZm8tPnRlc3RpbmZvX2xlbiA9IEUxMDAwX1RFU1RfTEVOOworCWRydmluZm8tPnJlZ2R1bXBfbGVuID0gZTEwMDBfZ2V0X3JlZ3NfbGVuKG5ldGRldik7CisJZHJ2aW5mby0+ZWVkdW1wX2xlbiA9IGUxMDAwX2dldF9lZXByb21fbGVuKG5ldGRldik7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwMF9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwllMTAwMF9tYWNfdHlwZSBtYWNfdHlwZSA9IGFkYXB0ZXItPmh3Lm1hY190eXBlOworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnR4ZHIgPSAmYWRhcHRlci0+dHhfcmluZzsKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICpyeGRyID0gJmFkYXB0ZXItPnJ4X3Jpbmc7CisKKwlyaW5nLT5yeF9tYXhfcGVuZGluZyA9IChtYWNfdHlwZSA8IGUxMDAwXzgyNTQ0KSA/IEUxMDAwX01BWF9SWEQgOgorCQlFMTAwMF9NQVhfODI1NDRfUlhEOworCXJpbmctPnR4X21heF9wZW5kaW5nID0gKG1hY190eXBlIDwgZTEwMDBfODI1NDQpID8gRTEwMDBfTUFYX1RYRCA6CisJCUUxMDAwX01BWF84MjU0NF9UWEQ7CisJcmluZy0+cnhfbWluaV9tYXhfcGVuZGluZyA9IDA7CisJcmluZy0+cnhfanVtYm9fbWF4X3BlbmRpbmcgPSAwOworCXJpbmctPnJ4X3BlbmRpbmcgPSByeGRyLT5jb3VudDsKKwlyaW5nLT50eF9wZW5kaW5nID0gdHhkci0+Y291bnQ7CisJcmluZy0+cnhfbWluaV9wZW5kaW5nID0gMDsKKwlyaW5nLT5yeF9qdW1ib19wZW5kaW5nID0gMDsKK30KKworc3RhdGljIGludCAKK2UxMDAwX3NldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWUxMDAwX21hY190eXBlIG1hY190eXBlID0gYWRhcHRlci0+aHcubWFjX3R5cGU7CisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqdHhkciA9ICZhZGFwdGVyLT50eF9yaW5nOworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnJ4ZHIgPSAmYWRhcHRlci0+cnhfcmluZzsKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nIHR4X29sZCwgdHhfbmV3LCByeF9vbGQsIHJ4X25ldzsKKwlpbnQgZXJyOworCisJdHhfb2xkID0gYWRhcHRlci0+dHhfcmluZzsKKwlyeF9vbGQgPSBhZGFwdGVyLT5yeF9yaW5nOworCisJaWYgKChyaW5nLT5yeF9taW5pX3BlbmRpbmcpIHx8IChyaW5nLT5yeF9qdW1ib19wZW5kaW5nKSkgCisJCXJldHVybiAtRUlOVkFMOworCisJaWYobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKQorCQllMTAwMF9kb3duKGFkYXB0ZXIpOworCisJcnhkci0+Y291bnQgPSBtYXgocmluZy0+cnhfcGVuZGluZywodWludDMyX3QpRTEwMDBfTUlOX1JYRCk7CisJcnhkci0+Y291bnQgPSBtaW4ocnhkci0+Y291bnQsKHVpbnQzMl90KShtYWNfdHlwZSA8IGUxMDAwXzgyNTQ0ID8KKwkJRTEwMDBfTUFYX1JYRCA6IEUxMDAwX01BWF84MjU0NF9SWEQpKTsKKwlFMTAwMF9ST1VORFVQKHJ4ZHItPmNvdW50LCBSRVFfUlhfREVTQ1JJUFRPUl9NVUxUSVBMRSk7IAorCisJdHhkci0+Y291bnQgPSBtYXgocmluZy0+dHhfcGVuZGluZywodWludDMyX3QpRTEwMDBfTUlOX1RYRCk7CisJdHhkci0+Y291bnQgPSBtaW4odHhkci0+Y291bnQsKHVpbnQzMl90KShtYWNfdHlwZSA8IGUxMDAwXzgyNTQ0ID8KKwkJRTEwMDBfTUFYX1RYRCA6IEUxMDAwX01BWF84MjU0NF9UWEQpKTsKKwlFMTAwMF9ST1VORFVQKHR4ZHItPmNvdW50LCBSRVFfVFhfREVTQ1JJUFRPUl9NVUxUSVBMRSk7IAorCisJaWYobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CisJCS8qIFRyeSB0byBnZXQgbmV3IHJlc291cmNlcyBiZWZvcmUgZGVsZXRpbmcgb2xkICovCisJCWlmKChlcnIgPSBlMTAwMF9zZXR1cF9yeF9yZXNvdXJjZXMoYWRhcHRlcikpKQorCQkJZ290byBlcnJfc2V0dXBfcng7CisJCWlmKChlcnIgPSBlMTAwMF9zZXR1cF90eF9yZXNvdXJjZXMoYWRhcHRlcikpKQorCQkJZ290byBlcnJfc2V0dXBfdHg7CisKKwkJLyogc2F2ZSB0aGUgbmV3LCByZXN0b3JlIHRoZSBvbGQgaW4gb3JkZXIgdG8gZnJlZSBpdCwKKwkJICogdGhlbiByZXN0b3JlIHRoZSBuZXcgYmFjayBhZ2FpbiAqLworCisJCXJ4X25ldyA9IGFkYXB0ZXItPnJ4X3Jpbmc7CisJCXR4X25ldyA9IGFkYXB0ZXItPnR4X3Jpbmc7CisJCWFkYXB0ZXItPnJ4X3JpbmcgPSByeF9vbGQ7CisJCWFkYXB0ZXItPnR4X3JpbmcgPSB0eF9vbGQ7CisJCWUxMDAwX2ZyZWVfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOworCQllMTAwMF9mcmVlX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKKwkJYWRhcHRlci0+cnhfcmluZyA9IHJ4X25ldzsKKwkJYWRhcHRlci0+dHhfcmluZyA9IHR4X25ldzsKKwkJaWYoKGVyciA9IGUxMDAwX3VwKGFkYXB0ZXIpKSkKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7CitlcnJfc2V0dXBfdHg6CisJZTEwMDBfZnJlZV9yeF9yZXNvdXJjZXMoYWRhcHRlcik7CitlcnJfc2V0dXBfcng6CisJYWRhcHRlci0+cnhfcmluZyA9IHJ4X29sZDsKKwlhZGFwdGVyLT50eF9yaW5nID0gdHhfb2xkOworCWUxMDAwX3VwKGFkYXB0ZXIpOworCXJldHVybiBlcnI7Cit9CisKKyNkZWZpbmUgUkVHX1BBVFRFUk5fVEVTVChSLCBNLCBXKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXVpbnQzMl90IHBhdCwgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXVpbnQzMl90IHRlc3RbXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl7MHg1QTVBNUE1QSwgMHhBNUE1QTVBNSwgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRn07ICAgICAgICAgICAgICBcCisJZm9yKHBhdCA9IDA7IHBhdCA8IHNpemVvZih0ZXN0KS9zaXplb2YodGVzdFswXSk7IHBhdCsrKSB7ICAgICAgICAgICAgICBcCisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFIsICh0ZXN0W3BhdF0gJiBXKSk7ICAgICAgICAgICAgIFwKKwkJdmFsdWUgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFIpOyAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZih2YWx1ZSAhPSAodGVzdFtwYXRdICYgVyAmIE0pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkqZGF0YSA9IChhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKSA/ICAgICAgICAgXAorCQkJCUUxMDAwXzgyNTQyXyMjUiA6IEUxMDAwXyMjUjsgICAgICAgICAgICAgICAgICAgXAorCQkJcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFJFR19TRVRfQU5EX0NIRUNLKFIsIE0sIFcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl1aW50MzJfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSLCBXICYgTSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl2YWx1ZSA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoKFcgJiBNKSAhPSAodmFsdWUgJiBNKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKmRhdGEgPSAoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0MykgPyAgICAgICAgICAgICAgICAgXAorCQkJRTEwMDBfODI1NDJfIyNSIDogRTEwMDBfIyNSOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitzdGF0aWMgaW50CitlMTAwMF9yZWdfdGVzdChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwgdWludDY0X3QgKmRhdGEpCit7CisJdWludDMyX3QgdmFsdWU7CisJdWludDMyX3QgaTsKKworCS8qIFRoZSBzdGF0dXMgcmVnaXN0ZXIgaXMgUmVhZCBPbmx5LCBzbyBhIHdyaXRlIHNob3VsZCBmYWlsLgorCSAqIFNvbWUgYml0cyB0aGF0IGdldCB0b2dnbGVkIGFyZSBpZ25vcmVkLgorCSAqLworCXZhbHVlID0gKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKSAmICgweEZGRkZGODMzKSk7CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTLCAoMHhGRkZGRkZGRikpOworCWlmKHZhbHVlICE9IChFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJiAoMHhGRkZGRjgzMykpKSB7CisJCSpkYXRhID0gMTsKKwkJcmV0dXJuIDE7CisJfQorCisJUkVHX1BBVFRFUk5fVEVTVChGQ0FMLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGKTsKKwlSRUdfUEFUVEVSTl9URVNUKEZDQUgsIDB4MDAwMEZGRkYsIDB4RkZGRkZGRkYpOworCVJFR19QQVRURVJOX1RFU1QoRkNULCAweDAwMDBGRkZGLCAweEZGRkZGRkZGKTsKKwlSRUdfUEFUVEVSTl9URVNUKFZFVCwgMHgwMDAwRkZGRiwgMHhGRkZGRkZGRik7CisJUkVHX1BBVFRFUk5fVEVTVChSRFRSLCAweDAwMDBGRkZGLCAweEZGRkZGRkZGKTsKKwlSRUdfUEFUVEVSTl9URVNUKFJEQkFILCAweEZGRkZGRkZGLCAweEZGRkZGRkZGKTsKKwlSRUdfUEFUVEVSTl9URVNUKFJETEVOLCAweDAwMEZGRjgwLCAweDAwMEZGRkZGKTsKKwlSRUdfUEFUVEVSTl9URVNUKFJESCwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRik7CisJUkVHX1BBVFRFUk5fVEVTVChSRFQsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYpOworCVJFR19QQVRURVJOX1RFU1QoRkNSVEgsIDB4MDAwMEZGRjgsIDB4MDAwMEZGRjgpOworCVJFR19QQVRURVJOX1RFU1QoRkNUVFYsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYpOworCVJFR19QQVRURVJOX1RFU1QoVElQRywgMHgzRkZGRkZGRiwgMHgzRkZGRkZGRik7CisJUkVHX1BBVFRFUk5fVEVTVChUREJBSCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRik7CisJUkVHX1BBVFRFUk5fVEVTVChURExFTiwgMHgwMDBGRkY4MCwgMHgwMDBGRkZGRik7CisKKwlSRUdfU0VUX0FORF9DSEVDSyhSQ1RMLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwKTsKKwlSRUdfU0VUX0FORF9DSEVDSyhSQ1RMLCAweDA2REZCM0ZFLCAweDAwM0ZGRkZCKTsKKwlSRUdfU0VUX0FORF9DSEVDSyhUQ1RMLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwKTsKKworCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQzKSB7CisKKwkJUkVHX1NFVF9BTkRfQ0hFQ0soUkNUTCwgMHgwNkRGQjNGRSwgMHhGRkZGRkZGRik7CisJCVJFR19QQVRURVJOX1RFU1QoUkRCQUwsIDB4RkZGRkZGRjAsIDB4RkZGRkZGRkYpOworCQlSRUdfUEFUVEVSTl9URVNUKFRYQ1csIDB4QzAwMEZGRkYsIDB4MDAwMEZGRkYpOworCQlSRUdfUEFUVEVSTl9URVNUKFREQkFMLCAweEZGRkZGRkYwLCAweEZGRkZGRkZGKTsKKwkJUkVHX1BBVFRFUk5fVEVTVChUSURWLCAweDAwMDBGRkZGLCAweDAwMDBGRkZGKTsKKworCQlmb3IoaSA9IDA7IGkgPCBFMTAwMF9SQVJfRU5UUklFUzsgaSsrKSB7CisJCQlSRUdfUEFUVEVSTl9URVNUKFJBICsgKChpIDw8IDEpIDw8IDIpLCAweEZGRkZGRkZGLAorCQkJCQkgMHhGRkZGRkZGRik7CisJCQlSRUdfUEFUVEVSTl9URVNUKFJBICsgKCgoaSA8PCAxKSArIDEpIDw8IDIpLCAweDgwMDNGRkZGLAorCQkJCQkgMHhGRkZGRkZGRik7CisJCX0KKworCX0gZWxzZSB7CisKKwkJUkVHX1NFVF9BTkRfQ0hFQ0soUkNUTCwgMHhGRkZGRkZGRiwgMHgwMUZGRkZGRik7CisJCVJFR19QQVRURVJOX1RFU1QoUkRCQUwsIDB4RkZGRkYwMDAsIDB4RkZGRkZGRkYpOworCQlSRUdfUEFUVEVSTl9URVNUKFRYQ1csIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYpOworCQlSRUdfUEFUVEVSTl9URVNUKFREQkFMLCAweEZGRkZGMDAwLCAweEZGRkZGRkZGKTsKKworCX0KKworCWZvcihpID0gMDsgaSA8IEUxMDAwX01DX1RCTF9TSVpFOyBpKyspCisJCVJFR19QQVRURVJOX1RFU1QoTVRBICsgKGkgPDwgMiksIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYpOworCisJKmRhdGEgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlMTAwMF9lZXByb21fdGVzdChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwgdWludDY0X3QgKmRhdGEpCit7CisJdWludDE2X3QgdGVtcDsKKwl1aW50MTZfdCBjaGVja3N1bSA9IDA7CisJdWludDE2X3QgaTsKKworCSpkYXRhID0gMDsKKwkvKiBSZWFkIGFuZCBhZGQgdXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBFRVBST00gKi8KKwlmb3IoaSA9IDA7IGkgPCAoRUVQUk9NX0NIRUNLU1VNX1JFRyArIDEpOyBpKyspIHsKKwkJaWYoKGUxMDAwX3JlYWRfZWVwcm9tKCZhZGFwdGVyLT5odywgaSwgMSwgJnRlbXApKSA8IDApIHsKKwkJCSpkYXRhID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWNoZWNrc3VtICs9IHRlbXA7CisJfQorCisJLyogSWYgQ2hlY2tzdW0gaXMgbm90IENvcnJlY3QgcmV0dXJuIGVycm9yIGVsc2UgdGVzdCBwYXNzZWQgKi8KKwlpZigoY2hlY2tzdW0gIT0gKHVpbnQxNl90KSBFRVBST01fU1VNKSAmJiAhKCpkYXRhKSkKKwkJKmRhdGEgPSAyOworCisJcmV0dXJuICpkYXRhOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK2UxMDAwX3Rlc3RfaW50cihpbnQgaXJxLAorCQl2b2lkICpkYXRhLAorCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisKKwlhZGFwdGVyLT50ZXN0X2ljciB8PSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIElDUik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQKK2UxMDAwX2ludHJfdGVzdChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwgdWludDY0X3QgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKyAJdWludDMyX3QgbWFzaywgaT0wLCBzaGFyZWRfaW50ID0gVFJVRTsKKyAJdWludDMyX3QgaXJxID0gYWRhcHRlci0+cGRldi0+aXJxOworCisJKmRhdGEgPSAwOworCisJLyogSG9vayB1cCB0ZXN0IGludGVycnVwdCBoYW5kbGVyIGp1c3QgZm9yIHRoaXMgdGVzdCAqLworIAlpZighcmVxdWVzdF9pcnEoaXJxLCAmZTEwMDBfdGVzdF9pbnRyLCAwLCBuZXRkZXYtPm5hbWUsIG5ldGRldikpIHsKKyAJCXNoYXJlZF9pbnQgPSBGQUxTRTsKKyAJfSBlbHNlIGlmKHJlcXVlc3RfaXJxKGlycSwgJmUxMDAwX3Rlc3RfaW50ciwgU0FfU0hJUlEsIAorCQkJbmV0ZGV2LT5uYW1lLCBuZXRkZXYpKXsKKwkJKmRhdGEgPSAxOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogRGlzYWJsZSBhbGwgdGhlIGludGVycnVwdHMgKi8KKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJTUMsIDB4RkZGRkZGRkYpOworCW1zZWNfZGVsYXkoMTApOworCisJLyogVGVzdCBlYWNoIGludGVycnVwdCAqLworCWZvcig7IGkgPCAxMDsgaSsrKSB7CisKKwkJLyogSW50ZXJydXB0IHRvIHRlc3QgKi8KKwkJbWFzayA9IDEgPDwgaTsKKworIAkJaWYoIXNoYXJlZF9pbnQpIHsKKyAJCQkvKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgdG8gYmUgcmVwb3J0ZWQgaW4KKyAJCQkgKiB0aGUgY2F1c2UgcmVnaXN0ZXIgYW5kIHRoZW4gZm9yY2UgdGhlIHNhbWUKKyAJCQkgKiBpbnRlcnJ1cHQgYW5kIHNlZSBpZiBvbmUgZ2V0cyBwb3N0ZWQuICBJZgorIAkJCSAqIGFuIGludGVycnVwdCB3YXMgcG9zdGVkIHRvIHRoZSBidXMsIHRoZQorIAkJCSAqIHRlc3QgZmFpbGVkLgorIAkJCSAqLworIAkJCWFkYXB0ZXItPnRlc3RfaWNyID0gMDsKKyAJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJTUMsIG1hc2spOworIAkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElDUywgbWFzayk7CisgCQkJbXNlY19kZWxheSgxMCk7CisgCisgCQkJaWYoYWRhcHRlci0+dGVzdF9pY3IgJiBtYXNrKSB7CisgCQkJCSpkYXRhID0gMzsKKyAJCQkJYnJlYWs7CisgCQkJfQorCQl9CisKKwkJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHQgdG8gYmUgcmVwb3J0ZWQgaW4KKwkJICogdGhlIGNhdXNlIHJlZ2lzdGVyIGFuZCB0aGVuIGZvcmNlIHRoZSBzYW1lCisJCSAqIGludGVycnVwdCBhbmQgc2VlIGlmIG9uZSBnZXRzIHBvc3RlZC4gIElmCisJCSAqIGFuIGludGVycnVwdCB3YXMgbm90IHBvc3RlZCB0byB0aGUgYnVzLCB0aGUKKwkJICogdGVzdCBmYWlsZWQuCisJCSAqLworCQlhZGFwdGVyLT50ZXN0X2ljciA9IDA7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElNUywgbWFzayk7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElDUywgbWFzayk7CisJCW1zZWNfZGVsYXkoMTApOworCisJCWlmKCEoYWRhcHRlci0+dGVzdF9pY3IgJiBtYXNrKSkgeworCQkJKmRhdGEgPSA0OworCQkJYnJlYWs7CisJCX0KKworIAkJaWYoIXNoYXJlZF9pbnQpIHsKKwkJCS8qIERpc2FibGUgdGhlIG90aGVyIGludGVycnVwdHMgdG8gYmUgcmVwb3J0ZWQgaW4KKwkJCSAqIHRoZSBjYXVzZSByZWdpc3RlciBhbmQgdGhlbiBmb3JjZSB0aGUgb3RoZXIKKwkJCSAqIGludGVycnVwdHMgYW5kIHNlZSBpZiBhbnkgZ2V0IHBvc3RlZC4gIElmCisJCQkgKiBhbiBpbnRlcnJ1cHQgd2FzIHBvc3RlZCB0byB0aGUgYnVzLCB0aGUKKwkJCSAqIHRlc3QgZmFpbGVkLgorCQkJICovCisJCQlhZGFwdGVyLT50ZXN0X2ljciA9IDA7CisJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJTUMsIAorCQkJCQkofm1hc2sgJiAweDAwMDA3RkZGKSk7CisJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJQ1MsIAorCQkJCQkofm1hc2sgJiAweDAwMDA3RkZGKSk7CisJCQltc2VjX2RlbGF5KDEwKTsKKworCQkJaWYoYWRhcHRlci0+dGVzdF9pY3IpIHsKKwkJCQkqZGF0YSA9IDU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBEaXNhYmxlIGFsbCB0aGUgaW50ZXJydXB0cyAqLworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElNQywgMHhGRkZGRkZGRik7CisJbXNlY19kZWxheSgxMCk7CisKKwkvKiBVbmhvb2sgdGVzdCBpbnRlcnJ1cHQgaGFuZGxlciAqLworCWZyZWVfaXJxKGlycSwgbmV0ZGV2KTsKKworCXJldHVybiAqZGF0YTsKK30KKworc3RhdGljIHZvaWQKK2UxMDAwX2ZyZWVfZGVzY19yaW5ncyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICp0eGRyID0gJmFkYXB0ZXItPnRlc3RfdHhfcmluZzsKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICpyeGRyID0gJmFkYXB0ZXItPnRlc3RfcnhfcmluZzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJaW50IGk7CisKKwlpZih0eGRyLT5kZXNjICYmIHR4ZHItPmJ1ZmZlcl9pbmZvKSB7CisJCWZvcihpID0gMDsgaSA8IHR4ZHItPmNvdW50OyBpKyspIHsKKwkJCWlmKHR4ZHItPmJ1ZmZlcl9pbmZvW2ldLmRtYSkKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIHR4ZHItPmJ1ZmZlcl9pbmZvW2ldLmRtYSwKKwkJCQkJCSB0eGRyLT5idWZmZXJfaW5mb1tpXS5sZW5ndGgsCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQlpZih0eGRyLT5idWZmZXJfaW5mb1tpXS5za2IpCisJCQkJZGV2X2tmcmVlX3NrYih0eGRyLT5idWZmZXJfaW5mb1tpXS5za2IpOworCQl9CisJfQorCisJaWYocnhkci0+ZGVzYyAmJiByeGRyLT5idWZmZXJfaW5mbykgeworCQlmb3IoaSA9IDA7IGkgPCByeGRyLT5jb3VudDsgaSsrKSB7CisJCQlpZihyeGRyLT5idWZmZXJfaW5mb1tpXS5kbWEpCisJCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCByeGRyLT5idWZmZXJfaW5mb1tpXS5kbWEsCisJCQkJCQkgcnhkci0+YnVmZmVyX2luZm9baV0ubGVuZ3RoLAorCQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlpZihyeGRyLT5idWZmZXJfaW5mb1tpXS5za2IpCisJCQkJZGV2X2tmcmVlX3NrYihyeGRyLT5idWZmZXJfaW5mb1tpXS5za2IpOworCQl9CisJfQorCisJaWYodHhkci0+ZGVzYykKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCB0eGRyLT5zaXplLCB0eGRyLT5kZXNjLCB0eGRyLT5kbWEpOworCWlmKHJ4ZHItPmRlc2MpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgcnhkci0+c2l6ZSwgcnhkci0+ZGVzYywgcnhkci0+ZG1hKTsKKworCWlmKHR4ZHItPmJ1ZmZlcl9pbmZvKQorCQlrZnJlZSh0eGRyLT5idWZmZXJfaW5mbyk7CisJaWYocnhkci0+YnVmZmVyX2luZm8pCisJCWtmcmVlKHJ4ZHItPmJ1ZmZlcl9pbmZvKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludAorZTEwMDBfc2V0dXBfZGVzY19yaW5ncyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICp0eGRyID0gJmFkYXB0ZXItPnRlc3RfdHhfcmluZzsKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICpyeGRyID0gJmFkYXB0ZXItPnRlc3RfcnhfcmluZzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJdWludDMyX3QgcmN0bDsKKwlpbnQgc2l6ZSwgaSwgcmV0X3ZhbDsKKworCS8qIFNldHVwIFR4IGRlc2NyaXB0b3IgcmluZyBhbmQgVHggYnVmZmVycyAqLworCisJdHhkci0+Y291bnQgPSA4MDsKKworCXNpemUgPSB0eGRyLT5jb3VudCAqIHNpemVvZihzdHJ1Y3QgZTEwMDBfYnVmZmVyKTsKKwlpZighKHR4ZHItPmJ1ZmZlcl9pbmZvID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkpIHsKKwkJcmV0X3ZhbCA9IDE7CisJCWdvdG8gZXJyX25vbWVtOworCX0KKwltZW1zZXQodHhkci0+YnVmZmVyX2luZm8sIDAsIHNpemUpOworCisJdHhkci0+c2l6ZSA9IHR4ZHItPmNvdW50ICogc2l6ZW9mKHN0cnVjdCBlMTAwMF90eF9kZXNjKTsKKwlFMTAwMF9ST1VORFVQKHR4ZHItPnNpemUsIDQwOTYpOworCWlmKCEodHhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsICZ0eGRyLT5kbWEpKSkgeworCQlyZXRfdmFsID0gMjsKKwkJZ290byBlcnJfbm9tZW07CisJfQorCW1lbXNldCh0eGRyLT5kZXNjLCAwLCB0eGRyLT5zaXplKTsKKwl0eGRyLT5uZXh0X3RvX3VzZSA9IHR4ZHItPm5leHRfdG9fY2xlYW4gPSAwOworCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVERCQUwsCisJCQkoKHVpbnQ2NF90KSB0eGRyLT5kbWEgJiAweDAwMDAwMDAwRkZGRkZGRkYpKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUREJBSCwgKCh1aW50NjRfdCkgdHhkci0+ZG1hID4+IDMyKSk7CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVERMRU4sCisJCQl0eGRyLT5jb3VudCAqIHNpemVvZihzdHJ1Y3QgZTEwMDBfdHhfZGVzYykpOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFRESCwgMCk7CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVERULCAwKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUQ1RMLAorCQkJRTEwMDBfVENUTF9QU1AgfCBFMTAwMF9UQ1RMX0VOIHwKKwkJCUUxMDAwX0NPTExJU0lPTl9USFJFU0hPTEQgPDwgRTEwMDBfQ1RfU0hJRlQgfAorCQkJRTEwMDBfRkRYX0NPTExJU0lPTl9ESVNUQU5DRSA8PCBFMTAwMF9DT0xEX1NISUZUKTsKKworCWZvcihpID0gMDsgaSA8IHR4ZHItPmNvdW50OyBpKyspIHsKKwkJc3RydWN0IGUxMDAwX3R4X2Rlc2MgKnR4X2Rlc2MgPSBFMTAwMF9UWF9ERVNDKCp0eGRyLCBpKTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdW5zaWduZWQgaW50IHNpemUgPSAxMDI0OworCisJCWlmKCEoc2tiID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9LRVJORUwpKSkgeworCQkJcmV0X3ZhbCA9IDM7CisJCQlnb3RvIGVycl9ub21lbTsKKwkJfQorCQlza2JfcHV0KHNrYiwgc2l6ZSk7CisJCXR4ZHItPmJ1ZmZlcl9pbmZvW2ldLnNrYiA9IHNrYjsKKwkJdHhkci0+YnVmZmVyX2luZm9baV0ubGVuZ3RoID0gc2tiLT5sZW47CisJCXR4ZHItPmJ1ZmZlcl9pbmZvW2ldLmRtYSA9CisJCQlwY2lfbWFwX3NpbmdsZShwZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJdHhfZGVzYy0+YnVmZmVyX2FkZHIgPSBjcHVfdG9fbGU2NCh0eGRyLT5idWZmZXJfaW5mb1tpXS5kbWEpOworCQl0eF9kZXNjLT5sb3dlci5kYXRhID0gY3B1X3RvX2xlMzIoc2tiLT5sZW4pOworCQl0eF9kZXNjLT5sb3dlci5kYXRhIHw9IGNwdV90b19sZTMyKEUxMDAwX1RYRF9DTURfRU9QIHwKKwkJCQkJCSAgIEUxMDAwX1RYRF9DTURfSUZDUyB8CisJCQkJCQkgICBFMTAwMF9UWERfQ01EX1JQUyk7CisJCXR4X2Rlc2MtPnVwcGVyLmRhdGEgPSAwOworCX0KKworCS8qIFNldHVwIFJ4IGRlc2NyaXB0b3IgcmluZyBhbmQgUnggYnVmZmVycyAqLworCisJcnhkci0+Y291bnQgPSA4MDsKKworCXNpemUgPSByeGRyLT5jb3VudCAqIHNpemVvZihzdHJ1Y3QgZTEwMDBfYnVmZmVyKTsKKwlpZighKHJ4ZHItPmJ1ZmZlcl9pbmZvID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkpIHsKKwkJcmV0X3ZhbCA9IDQ7CisJCWdvdG8gZXJyX25vbWVtOworCX0KKwltZW1zZXQocnhkci0+YnVmZmVyX2luZm8sIDAsIHNpemUpOworCisJcnhkci0+c2l6ZSA9IHJ4ZHItPmNvdW50ICogc2l6ZW9mKHN0cnVjdCBlMTAwMF9yeF9kZXNjKTsKKwlpZighKHJ4ZHItPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLCAmcnhkci0+ZG1hKSkpIHsKKwkJcmV0X3ZhbCA9IDU7CisJCWdvdG8gZXJyX25vbWVtOworCX0KKwltZW1zZXQocnhkci0+ZGVzYywgMCwgcnhkci0+c2l6ZSk7CisJcnhkci0+bmV4dF90b191c2UgPSByeGRyLT5uZXh0X3RvX2NsZWFuID0gMDsKKworCXJjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJDVEwpOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwgJiB+RTEwMDBfUkNUTF9FTik7CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkRCQUwsCisJCQkoKHVpbnQ2NF90KSByeGRyLT5kbWEgJiAweEZGRkZGRkZGKSk7CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkRCQUgsICgodWludDY0X3QpIHJ4ZHItPmRtYSA+PiAzMikpOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJETEVOLCByeGRyLT5zaXplKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSREgsIDApOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJEVCwgMCk7CisJcmN0bCA9IEUxMDAwX1JDVExfRU4gfCBFMTAwMF9SQ1RMX0JBTSB8IEUxMDAwX1JDVExfU1pfMjA0OCB8CisJCUUxMDAwX1JDVExfTEJNX05PIHwgRTEwMDBfUkNUTF9SRE1UU19IQUxGIHwKKwkJKGFkYXB0ZXItPmh3Lm1jX2ZpbHRlcl90eXBlIDw8IEUxMDAwX1JDVExfTU9fU0hJRlQpOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOworCisJZm9yKGkgPSAwOyBpIDwgcnhkci0+Y291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZTEwMDBfcnhfZGVzYyAqcnhfZGVzYyA9IEUxMDAwX1JYX0RFU0MoKnJ4ZHIsIGkpOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCWlmKCEoc2tiID0gYWxsb2Nfc2tiKEUxMDAwX1JYQlVGRkVSXzIwNDggKyBORVRfSVBfQUxJR04sIAorCQkJCUdGUF9LRVJORUwpKSkgeworCQkJcmV0X3ZhbCA9IDY7CisJCQlnb3RvIGVycl9ub21lbTsKKwkJfQorCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisJCXJ4ZHItPmJ1ZmZlcl9pbmZvW2ldLnNrYiA9IHNrYjsKKwkJcnhkci0+YnVmZmVyX2luZm9baV0ubGVuZ3RoID0gRTEwMDBfUlhCVUZGRVJfMjA0ODsKKwkJcnhkci0+YnVmZmVyX2luZm9baV0uZG1hID0KKwkJCXBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+ZGF0YSwgRTEwMDBfUlhCVUZGRVJfMjA0OCwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJcnhfZGVzYy0+YnVmZmVyX2FkZHIgPSBjcHVfdG9fbGU2NChyeGRyLT5idWZmZXJfaW5mb1tpXS5kbWEpOworCQltZW1zZXQoc2tiLT5kYXRhLCAweDAwLCBza2ItPmxlbik7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9ub21lbToKKwllMTAwMF9mcmVlX2Rlc2NfcmluZ3MoYWRhcHRlcik7CisJcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwMF9waHlfZGlzYWJsZV9yZWNlaXZlcihzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwkvKiBXcml0ZSBvdXQgdG8gUEhZIHJlZ2lzdGVycyAyOSBhbmQgMzAgdG8gZGlzYWJsZSB0aGUgUmVjZWl2ZXIuICovCisJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIDI5LCAweDAwMUYpOworCWUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCAzMCwgMHg4RkZDKTsKKwllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgMjksIDB4MDAxQSk7CisJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIDMwLCAweDhGRjApOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfcGh5X3Jlc2V0X2Nsa19hbmRfY3JzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXVpbnQxNl90IHBoeV9yZWc7CisKKwkvKiBCZWNhdXNlIHdlIHJlc2V0IHRoZSBQSFkgYWJvdmUsIHdlIG5lZWQgdG8gcmUtZm9yY2UgVFhfQ0xLIGluIHRoZQorCSAqIEV4dGVuZGVkIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyIHRvIDI1TUh6IGNsb2NrLiAgVGhpcworCSAqIHZhbHVlIGRlZmF1bHRzIGJhY2sgdG8gYSAyLjVNSHogY2xvY2sgd2hlbiB0aGUgUEhZIGlzIHJlc2V0LgorCSAqLworCWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMLCAmcGh5X3JlZyk7CisJcGh5X3JlZyB8PSBNODhFMTAwMF9FUFNDUl9UWF9DTEtfMjU7CisJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsCisJCU04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMLCBwaHlfcmVnKTsKKworCS8qIEluIGFkZGl0aW9uLCBiZWNhdXNlIG9mIHRoZSBzL3cgcmVzZXQgYWJvdmUsIHdlIG5lZWQgdG8gZW5hYmxlCisJICogQ1JTIG9uIFRYLiAgVGhpcyBtdXN0IGJlIHNldCBmb3IgYm90aCBmdWxsIGFuZCBoYWxmIGR1cGxleAorCSAqIG9wZXJhdGlvbi4KKwkgKi8KKwllMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCAmcGh5X3JlZyk7CisJcGh5X3JlZyB8PSBNODhFMTAwMF9QU0NSX0FTU0VSVF9DUlNfT05fVFg7CisJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsCisJCU04OEUxMDAwX1BIWV9TUEVDX0NUUkwsIHBoeV9yZWcpOworfQorCitzdGF0aWMgaW50CitlMTAwMF9ub25pbnRlZ3JhdGVkX3BoeV9sb29wYmFjayhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1aW50MzJfdCBjdHJsX3JlZzsKKwl1aW50MTZfdCBwaHlfcmVnOworCisJLyogU2V0dXAgdGhlIERldmljZSBDb250cm9sIFJlZ2lzdGVyIGZvciBQSFkgbG9vcGJhY2sgdGVzdC4gKi8KKworCWN0cmxfcmVnID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMKTsKKwljdHJsX3JlZyB8PSAoRTEwMDBfQ1RSTF9JTE9TIHwJCS8qIEludmVydCBMb3NzLU9mLVNpZ25hbCAqLworCQkgICAgIEUxMDAwX0NUUkxfRlJDU1BEIHwJLyogU2V0IHRoZSBGb3JjZSBTcGVlZCBCaXQgKi8KKwkJICAgICBFMTAwMF9DVFJMX0ZSQ0RQWCB8CS8qIFNldCB0aGUgRm9yY2UgRHVwbGV4IEJpdCAqLworCQkgICAgIEUxMDAwX0NUUkxfU1BEXzEwMDAgfAkvKiBGb3JjZSBTcGVlZCB0byAxMDAwICovCisJCSAgICAgRTEwMDBfQ1RSTF9GRCk7CQkvKiBGb3JjZSBEdXBsZXggdG8gRlVMTCAqLworCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgQ1RSTCwgY3RybF9yZWcpOworCisJLyogUmVhZCB0aGUgUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgKDB4MTApICovCisJZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgJnBoeV9yZWcpOworCisJLyogQ2xlYXIgQXV0by1Dcm9zc292ZXIgYml0cyBpbiBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlcgorCSAqIChiaXRzIDY6NSkuCisJICovCisJcGh5X3JlZyAmPSB+TTg4RTEwMDBfUFNDUl9BVVRPX1hfTU9ERTsKKwllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgcGh5X3JlZyk7CisKKwkvKiBQZXJmb3JtIHNvZnR3YXJlIHJlc2V0IG9uIHRoZSBQSFkgKi8KKwllMTAwMF9waHlfcmVzZXQoJmFkYXB0ZXItPmh3KTsKKworCS8qIEhhdmUgdG8gc2V0dXAgVFhfQ0xLIGFuZCBUWF9DUlMgYWZ0ZXIgc29mdHdhcmUgcmVzZXQgKi8KKwllMTAwMF9waHlfcmVzZXRfY2xrX2FuZF9jcnMoYWRhcHRlcik7CisKKwllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsIDB4ODEwMCk7CisKKwkvKiBXYWl0IGZvciByZXNldCB0byBjb21wbGV0ZS4gKi8KKwl1ZGVsYXkoNTAwKTsKKworCS8qIEhhdmUgdG8gc2V0dXAgVFhfQ0xLIGFuZCBUWF9DUlMgYWZ0ZXIgc29mdHdhcmUgcmVzZXQgKi8KKwllMTAwMF9waHlfcmVzZXRfY2xrX2FuZF9jcnMoYWRhcHRlcik7CisKKwkvKiBXcml0ZSBvdXQgdG8gUEhZIHJlZ2lzdGVycyAyOSBhbmQgMzAgdG8gZGlzYWJsZSB0aGUgUmVjZWl2ZXIuICovCisJZTEwMDBfcGh5X2Rpc2FibGVfcmVjZWl2ZXIoYWRhcHRlcik7CisKKwkvKiBTZXQgdGhlIGxvb3BiYWNrIGJpdCBpbiB0aGUgUEhZIGNvbnRyb2wgcmVnaXN0ZXIuICovCisJZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsICZwaHlfcmVnKTsKKwlwaHlfcmVnIHw9IE1JSV9DUl9MT09QQkFDSzsKKwllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsIHBoeV9yZWcpOworCisJLyogU2V0dXAgVFhfQ0xLIGFuZCBUWF9DUlMgb25lIG1vcmUgdGltZS4gKi8KKwllMTAwMF9waHlfcmVzZXRfY2xrX2FuZF9jcnMoYWRhcHRlcik7CisKKwkvKiBDaGVjayBQaHkgQ29uZmlndXJhdGlvbiAqLworCWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLCAmcGh5X3JlZyk7CisJaWYocGh5X3JlZyAhPSAweDQxMDApCisJCSByZXR1cm4gOTsKKworCWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMLCAmcGh5X3JlZyk7CisJaWYocGh5X3JlZyAhPSAweDAwNzApCisJCXJldHVybiAxMDsKKworCWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIDI5LCAmcGh5X3JlZyk7CisJaWYocGh5X3JlZyAhPSAweDAwMUEpCisJCXJldHVybiAxMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlMTAwMF9pbnRlZ3JhdGVkX3BoeV9sb29wYmFjayhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1aW50MzJfdCBjdHJsX3JlZyA9IDA7CisJdWludDMyX3Qgc3RhdF9yZWcgPSAwOworCisJYWRhcHRlci0+aHcuYXV0b25lZyA9IEZBTFNFOworCisJaWYoYWRhcHRlci0+aHcucGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgeworCQkvKiBBdXRvLU1ESS9NRElYIE9mZiAqLworCQllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywKKwkJCQkgICAgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgMHgwODA4KTsKKwkJLyogcmVzZXQgdG8gdXBkYXRlIEF1dG8tTURJL01ESVggKi8KKwkJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLCAweDkxNDApOworCQkvKiBhdXRvbmVnIG9mZiAqLworCQllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsIDB4ODE0MCk7CisJfQorCS8qIGZvcmNlIDEwMDAsIHNldCBsb29wYmFjayAqLworCWUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfQ1RSTCwgMHg0MTQwKTsKKworCS8qIE5vdyBzZXQgdXAgdGhlIE1BQyB0byB0aGUgc2FtZSBzcGVlZC9kdXBsZXggYXMgdGhlIFBIWS4gKi8KKwljdHJsX3JlZyA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgQ1RSTCk7CisJY3RybF9yZWcgJj0gfkUxMDAwX0NUUkxfU1BEX1NFTDsgLyogQ2xlYXIgdGhlIHNwZWVkIHNlbCBiaXRzICovCisJY3RybF9yZWcgfD0gKEUxMDAwX0NUUkxfRlJDU1BEIHwgLyogU2V0IHRoZSBGb3JjZSBTcGVlZCBCaXQgKi8KKwkJICAgICBFMTAwMF9DVFJMX0ZSQ0RQWCB8IC8qIFNldCB0aGUgRm9yY2UgRHVwbGV4IEJpdCAqLworCQkgICAgIEUxMDAwX0NUUkxfU1BEXzEwMDAgfC8qIEZvcmNlIFNwZWVkIHRvIDEwMDAgKi8KKwkJICAgICBFMTAwMF9DVFJMX0ZEKTsJIC8qIEZvcmNlIER1cGxleCB0byBGVUxMICovCisKKwlpZihhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyICYmCisJICAgYWRhcHRlci0+aHcucGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgeworCQljdHJsX3JlZyB8PSBFMTAwMF9DVFJMX0lMT1M7IC8qIEludmVydCBMb3NzIG9mIFNpZ25hbCAqLworCX0gZWxzZSB7CisJCS8qIFNldCB0aGUgSUxPUyBiaXQgb24gdGhlIGZpYmVyIE5pYyBpcyBoYWxmCisJCSAqIGR1cGxleCBsaW5rIGlzIGRldGVjdGVkLiAqLworCQlzdGF0X3JlZyA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKTsKKwkJaWYoKHN0YXRfcmVnICYgRTEwMDBfU1RBVFVTX0ZEKSA9PSAwKQorCQkJY3RybF9yZWcgfD0gKEUxMDAwX0NUUkxfSUxPUyB8IEUxMDAwX0NUUkxfU0xVKTsKKwl9CisKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMLCBjdHJsX3JlZyk7CisKKwkvKiBEaXNhYmxlIHRoZSByZWNlaXZlciBvbiB0aGUgUEhZIHNvIHdoZW4gYSBjYWJsZSBpcyBwbHVnZ2VkIGluLCB0aGUKKwkgKiBQSFkgZG9lcyBub3QgYmVnaW4gdG8gYXV0b25lZyB3aGVuIGEgY2FibGUgaXMgcmVjb25uZWN0ZWQgdG8gdGhlIE5JQy4KKwkgKi8KKwlpZihhZGFwdGVyLT5ody5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KQorCQllMTAwMF9waHlfZGlzYWJsZV9yZWNlaXZlcihhZGFwdGVyKTsKKworCXVkZWxheSg1MDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2UxMDAwX3NldF9waHlfbG9vcGJhY2soc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdWludDE2X3QgcGh5X3JlZyA9IDA7CisJdWludDE2X3QgY291bnQgPSAwOworCisJc3dpdGNoIChhZGFwdGVyLT5ody5tYWNfdHlwZSkgeworCWNhc2UgZTEwMDBfODI1NDM6CisJCWlmKGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKwkJCS8qIEF0dGVtcHQgdG8gc2V0dXAgTG9vcGJhY2sgbW9kZSBvbiBOb24taW50ZWdyYXRlZCBQSFkuCisJCQkgKiBTb21lIFBIWSByZWdpc3RlcnMgZ2V0IGNvcnJ1cHRlZCBhdCByYW5kb20sIHNvCisJCQkgKiBhdHRlbXB0IHRoaXMgMTAgdGltZXMuCisJCQkgKi8KKwkJCXdoaWxlKGUxMDAwX25vbmludGVncmF0ZWRfcGh5X2xvb3BiYWNrKGFkYXB0ZXIpICYmCisJCQkgICAgICBjb3VudCsrIDwgMTApOworCQkJaWYoY291bnQgPCAxMSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgZTEwMDBfODI1NDQ6CisJY2FzZSBlMTAwMF84MjU0MDoKKwljYXNlIGUxMDAwXzgyNTQ1OgorCWNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CisJY2FzZSBlMTAwMF84MjU0NjoKKwljYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorCWNhc2UgZTEwMDBfODI1NDE6CisJY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKwljYXNlIGUxMDAwXzgyNTQ3OgorCWNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisJCXJldHVybiBlMTAwMF9pbnRlZ3JhdGVkX3BoeV9sb29wYmFjayhhZGFwdGVyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBEZWZhdWx0IFBIWSBsb29wYmFjayB3b3JrIGlzIHRvIHJlYWQgdGhlIE1JSQorCQkgKiBjb250cm9sIHJlZ2lzdGVyIGFuZCBhc3NlcnQgYml0IDE0IChsb29wYmFjayBtb2RlKS4KKwkJICovCisJCWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLCAmcGh5X3JlZyk7CisJCXBoeV9yZWcgfD0gTUlJX0NSX0xPT1BCQUNLOworCQllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsIHBoeV9yZWcpOworCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDg7Cit9CisKK3N0YXRpYyBpbnQKK2UxMDAwX3NldHVwX2xvb3BiYWNrX3Rlc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdWludDMyX3QgcmN0bDsKKworCWlmKGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlciB8fAorCSAgIGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpIHsKKwkJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDUgfHwKKwkJICAgYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDYgfHwKKwkJICAgYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDVfcmV2XzMgfHwKKwkJICAgYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDZfcmV2XzMpCisJCQlyZXR1cm4gZTEwMDBfc2V0X3BoeV9sb29wYmFjayhhZGFwdGVyKTsKKwkJZWxzZSB7CisJCQlyY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMKTsKKwkJCXJjdGwgfD0gRTEwMDBfUkNUTF9MQk1fVENWUjsKKwkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgaWYoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikKKwkJcmV0dXJuIGUxMDAwX3NldF9waHlfbG9vcGJhY2soYWRhcHRlcik7CisKKwlyZXR1cm4gNzsKK30KKworc3RhdGljIHZvaWQKK2UxMDAwX2xvb3BiYWNrX2NsZWFudXAoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdWludDMyX3QgcmN0bDsKKwl1aW50MTZfdCBwaHlfcmVnOworCisJcmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7CisJcmN0bCAmPSB+KEUxMDAwX1JDVExfTEJNX1RDVlIgfCBFMTAwMF9SQ1RMX0xCTV9NQUMpOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOworCisJaWYoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlciB8fAorCSAgICgoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyIHx8CisJICAgICBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSAmJgorCSAgICAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDUgfHwKKwkgICAgIGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTQ2IHx8CisJICAgICBhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NV9yZXZfMyB8fAorCSAgICAgYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDZfcmV2XzMpKSkgeworCQlhZGFwdGVyLT5ody5hdXRvbmVnID0gVFJVRTsKKwkJZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsICZwaHlfcmVnKTsKKwkJaWYocGh5X3JlZyAmIE1JSV9DUl9MT09QQkFDSykgeworCQkJcGh5X3JlZyAmPSB+TUlJX0NSX0xPT1BCQUNLOworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLCBwaHlfcmVnKTsKKwkJCWUxMDAwX3BoeV9yZXNldCgmYWRhcHRlci0+aHcpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorZTEwMDBfY3JlYXRlX2xidGVzdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZSkKK3sKKwltZW1zZXQoc2tiLT5kYXRhLCAweEZGLCBmcmFtZV9zaXplKTsKKwlmcmFtZV9zaXplID0gKGZyYW1lX3NpemUgJSAyKSA/IChmcmFtZV9zaXplIC0gMSkgOiBmcmFtZV9zaXplOworCW1lbXNldCgmc2tiLT5kYXRhW2ZyYW1lX3NpemUgLyAyXSwgMHhBQSwgZnJhbWVfc2l6ZSAvIDIgLSAxKTsKKwltZW1zZXQoJnNrYi0+ZGF0YVtmcmFtZV9zaXplIC8gMiArIDEwXSwgMHhCRSwgMSk7CisJbWVtc2V0KCZza2ItPmRhdGFbZnJhbWVfc2l6ZSAvIDIgKyAxMl0sIDB4QUYsIDEpOworfQorCitzdGF0aWMgaW50CitlMTAwMF9jaGVja19sYnRlc3RfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGZyYW1lX3NpemUpCit7CisJZnJhbWVfc2l6ZSA9IChmcmFtZV9zaXplICUgMikgPyAoZnJhbWVfc2l6ZSAtIDEpIDogZnJhbWVfc2l6ZTsKKwlpZigqKHNrYi0+ZGF0YSArIDMpID09IDB4RkYpIHsKKwkJaWYoKCooc2tiLT5kYXRhICsgZnJhbWVfc2l6ZSAvIDIgKyAxMCkgPT0gMHhCRSkgJiYKKwkJICAgKCooc2tiLT5kYXRhICsgZnJhbWVfc2l6ZSAvIDIgKyAxMikgPT0gMHhBRikpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxMzsKK30KKworc3RhdGljIGludAorZTEwMDBfcnVuX2xvb3BiYWNrX3Rlc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqdHhkciA9ICZhZGFwdGVyLT50ZXN0X3R4X3Jpbmc7CisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqcnhkciA9ICZhZGFwdGVyLT50ZXN0X3J4X3Jpbmc7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCWludCBpLCByZXRfdmFsOworCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkRULCByeGRyLT5jb3VudCAtIDEpOworCisJZm9yKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQllMTAwMF9jcmVhdGVfbGJ0ZXN0X2ZyYW1lKHR4ZHItPmJ1ZmZlcl9pbmZvW2ldLnNrYiwgMTAyNCk7CisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShwZGV2LCB0eGRyLT5idWZmZXJfaW5mb1tpXS5kbWEsCisJCQkJCSAgICB0eGRyLT5idWZmZXJfaW5mb1tpXS5sZW5ndGgsCisJCQkJCSAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwl9CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVERULCBpKTsKKworCW1zZWNfZGVsYXkoMjAwKTsKKworCWkgPSAwOworCWRvIHsKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHBkZXYsIHJ4ZHItPmJ1ZmZlcl9pbmZvW2ldLmRtYSwKKwkJCQkJICAgIHJ4ZHItPmJ1ZmZlcl9pbmZvW2ldLmxlbmd0aCwKKwkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJcmV0X3ZhbCA9IGUxMDAwX2NoZWNrX2xidGVzdF9mcmFtZShyeGRyLT5idWZmZXJfaW5mb1tpXS5za2IsCisJCQkJCQkgICAxMDI0KTsKKwkJaSsrOworCX0gd2hpbGUgKHJldF92YWwgIT0gMCAmJiBpIDwgNjQpOworCisJcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyBpbnQKK2UxMDAwX2xvb3BiYWNrX3Rlc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHVpbnQ2NF90ICpkYXRhKQoreworCWlmKCgqZGF0YSA9IGUxMDAwX3NldHVwX2Rlc2NfcmluZ3MoYWRhcHRlcikpKSBnb3RvIGVycl9sb29wYmFjazsKKwlpZigoKmRhdGEgPSBlMTAwMF9zZXR1cF9sb29wYmFja190ZXN0KGFkYXB0ZXIpKSkgZ290byBlcnJfbG9vcGJhY2s7CisJKmRhdGEgPSBlMTAwMF9ydW5fbG9vcGJhY2tfdGVzdChhZGFwdGVyKTsKKwllMTAwMF9sb29wYmFja19jbGVhbnVwKGFkYXB0ZXIpOworCWUxMDAwX2ZyZWVfZGVzY19yaW5ncyhhZGFwdGVyKTsKK2Vycl9sb29wYmFjazoKKwlyZXR1cm4gKmRhdGE7Cit9CisKK3N0YXRpYyBpbnQKK2UxMDAwX2xpbmtfdGVzdChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwgdWludDY0X3QgKmRhdGEpCit7CisJKmRhdGEgPSAwOworCisJaWYgKGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpIHsKKwkJaW50IGkgPSAwOworCQlhZGFwdGVyLT5ody5zZXJkZXNfbGlua19kb3duID0gVFJVRTsKKworCQkvKiBvbiBzb21lIGJsYWRlIHNlcnZlciBkZXNpZ25zIGxpbmsgZXN0YWJsaXNobWVudCAqLworCQkvKiBjb3VsZCB0YWtlIGFzIGxvbmcgYXMgMi0zIG1pbnV0ZXMuICAgICAgICAgICAgICAqLworCQlkbyB7CisJCQllMTAwMF9jaGVja19mb3JfbGluaygmYWRhcHRlci0+aHcpOworCQkJaWYgKGFkYXB0ZXItPmh3LnNlcmRlc19saW5rX2Rvd24gPT0gRkFMU0UpCisJCQkJcmV0dXJuICpkYXRhOworCQkJbXNlY19kZWxheSgyMCk7CisJCX0gd2hpbGUgKGkrKyA8IDM3NTApOworCisJCSpkYXRhID0gMTsgCisJfSBlbHNlIHsKKwkJZTEwMDBfY2hlY2tfZm9yX2xpbmsoJmFkYXB0ZXItPmh3KTsKKworCQlpZighKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19MVSkpIHsKKwkJCSpkYXRhID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gKmRhdGE7Cit9CisKK3N0YXRpYyBpbnQgCitlMTAwMF9kaWFnX3Rlc3RfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gRTEwMDBfVEVTVF9MRU47Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwMF9kaWFnX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICAgc3RydWN0IGV0aHRvb2xfdGVzdCAqZXRoX3Rlc3QsIHVpbnQ2NF90ICpkYXRhKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWJvb2xlYW5fdCBpZl9ydW5uaW5nID0gbmV0aWZfcnVubmluZyhuZXRkZXYpOworCisJaWYoZXRoX3Rlc3QtPmZsYWdzID09IEVUSF9URVNUX0ZMX09GRkxJTkUpIHsKKwkJLyogT2ZmbGluZSB0ZXN0cyAqLworCisJCS8qIHNhdmUgc3BlZWQsIGR1cGxleCwgYXV0b25lZyBzZXR0aW5ncyAqLworCQl1aW50MTZfdCBhdXRvbmVnX2FkdmVydGlzZWQgPSBhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQ7CisJCXVpbnQ4X3QgZm9yY2VkX3NwZWVkX2R1cGxleCA9IGFkYXB0ZXItPmh3LmZvcmNlZF9zcGVlZF9kdXBsZXg7CisJCXVpbnQ4X3QgYXV0b25lZyA9IGFkYXB0ZXItPmh3LmF1dG9uZWc7CisKKwkJLyogTGluayB0ZXN0IHBlcmZvcm1lZCBiZWZvcmUgaGFyZHdhcmUgcmVzZXQgc28gYXV0b25lZyBkb2Vzbid0CisJCSAqIGludGVyZmVyZSB3aXRoIHRlc3QgcmVzdWx0ICovCisJCWlmKGUxMDAwX2xpbmtfdGVzdChhZGFwdGVyLCAmZGF0YVs0XSkpCisJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCisJCWlmKGlmX3J1bm5pbmcpCisJCQllMTAwMF9kb3duKGFkYXB0ZXIpOworCQllbHNlCisJCQllMTAwMF9yZXNldChhZGFwdGVyKTsKKworCQlpZihlMTAwMF9yZWdfdGVzdChhZGFwdGVyLCAmZGF0YVswXSkpCisJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCisJCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOworCQlpZihlMTAwMF9lZXByb21fdGVzdChhZGFwdGVyLCAmZGF0YVsxXSkpCisJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCisJCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOworCQlpZihlMTAwMF9pbnRyX3Rlc3QoYWRhcHRlciwgJmRhdGFbMl0pKQorCQkJZXRoX3Rlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKKworCQllMTAwMF9yZXNldChhZGFwdGVyKTsKKwkJaWYoZTEwMDBfbG9vcGJhY2tfdGVzdChhZGFwdGVyLCAmZGF0YVszXSkpCisJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCisJCS8qIHJlc3RvcmUgc3BlZWQsIGR1cGxleCwgYXV0b25lZyBzZXR0aW5ncyAqLworCQlhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQgPSBhdXRvbmVnX2FkdmVydGlzZWQ7CisJCWFkYXB0ZXItPmh3LmZvcmNlZF9zcGVlZF9kdXBsZXggPSBmb3JjZWRfc3BlZWRfZHVwbGV4OworCQlhZGFwdGVyLT5ody5hdXRvbmVnID0gYXV0b25lZzsKKworCQllMTAwMF9yZXNldChhZGFwdGVyKTsKKwkJaWYoaWZfcnVubmluZykKKwkJCWUxMDAwX3VwKGFkYXB0ZXIpOworCX0gZWxzZSB7CisJCS8qIE9ubGluZSB0ZXN0cyAqLworCQlpZihlMTAwMF9saW5rX3Rlc3QoYWRhcHRlciwgJmRhdGFbNF0pKQorCQkJZXRoX3Rlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKKworCQkvKiBPZmZsaW5lIHRlc3RzIGFyZW4ndCBydW47IHBhc3MgYnkgZGVmYXVsdCAqLworCQlkYXRhWzBdID0gMDsKKwkJZGF0YVsxXSA9IDA7CisJCWRhdGFbMl0gPSAwOworCQlkYXRhWzNdID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwMF9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCisJc3dpdGNoKGFkYXB0ZXItPmh3LmRldmljZV9pZCkgeworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQyOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQzR0NfRklCRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDNHQ19DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDRFSV9GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkVCX1FVQURfQ09QUEVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1RU1fRklCRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDVFTV9DT1BQRVI6CisJCXdvbC0+c3VwcG9ydGVkID0gMDsKKwkJd29sLT53b2xvcHRzICAgPSAwOworCQlyZXR1cm47CisKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkVCX0ZJQkVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfRklCRVI6CisJCS8qIFdha2UgZXZlbnRzIG9ubHkgc3VwcG9ydGVkIG9uIHBvcnQgQSBmb3IgZHVhbCBmaWJlciAqLworCQlpZihFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpIHsKKwkJCXdvbC0+c3VwcG9ydGVkID0gMDsKKwkJCXdvbC0+d29sb3B0cyAgID0gMDsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBGYWxsIFRocm91Z2ggKi8KKworCWRlZmF1bHQ6CisJCXdvbC0+c3VwcG9ydGVkID0gV0FLRV9VQ0FTVCB8IFdBS0VfTUNBU1QgfAorCQkJCSBXQUtFX0JDQVNUIHwgV0FLRV9NQUdJQzsKKworCQl3b2wtPndvbG9wdHMgPSAwOworCQlpZihhZGFwdGVyLT53b2wgJiBFMTAwMF9XVUZDX0VYKQorCQkJd29sLT53b2xvcHRzIHw9IFdBS0VfVUNBU1Q7CisJCWlmKGFkYXB0ZXItPndvbCAmIEUxMDAwX1dVRkNfTUMpCisJCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9NQ0FTVDsKKwkJaWYoYWRhcHRlci0+d29sICYgRTEwMDBfV1VGQ19CQykKKwkJCXdvbC0+d29sb3B0cyB8PSBXQUtFX0JDQVNUOworCQlpZihhZGFwdGVyLT53b2wgJiBFMTAwMF9XVUZDX01BRykKKwkJCXdvbC0+d29sb3B0cyB8PSBXQUtFX01BR0lDOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgaW50CitlMTAwMF9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCisJc3dpdGNoKGFkYXB0ZXItPmh3LmRldmljZV9pZCkgeworCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQyOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQzR0NfRklCRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDNHQ19DT1BQRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDRFSV9GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkVCX1FVQURfQ09QUEVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1RU1fRklCRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDVFTV9DT1BQRVI6CisJCXJldHVybiB3b2wtPndvbG9wdHMgPyAtRU9QTk9UU1VQUCA6IDA7CisKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkVCX0ZJQkVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfRklCRVI6CisJCS8qIFdha2UgZXZlbnRzIG9ubHkgc3VwcG9ydGVkIG9uIHBvcnQgQSBmb3IgZHVhbCBmaWJlciAqLworCQlpZihFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpCisJCQlyZXR1cm4gd29sLT53b2xvcHRzID8gLUVPUE5PVFNVUFAgOiAwOworCQkvKiBGYWxsIFRocm91Z2ggKi8KKworCWRlZmF1bHQ6CisJCWlmKHdvbC0+d29sb3B0cyAmIChXQUtFX1BIWSB8IFdBS0VfQVJQIHwgV0FLRV9NQUdJQ1NFQ1VSRSkpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkJYWRhcHRlci0+d29sID0gMDsKKworCQlpZih3b2wtPndvbG9wdHMgJiBXQUtFX1VDQVNUKQorCQkJYWRhcHRlci0+d29sIHw9IEUxMDAwX1dVRkNfRVg7CisJCWlmKHdvbC0+d29sb3B0cyAmIFdBS0VfTUNBU1QpCisJCQlhZGFwdGVyLT53b2wgfD0gRTEwMDBfV1VGQ19NQzsKKwkJaWYod29sLT53b2xvcHRzICYgV0FLRV9CQ0FTVCkKKwkJCWFkYXB0ZXItPndvbCB8PSBFMTAwMF9XVUZDX0JDOworCQlpZih3b2wtPndvbG9wdHMgJiBXQUtFX01BR0lDKQorCQkJYWRhcHRlci0+d29sIHw9IEUxMDAwX1dVRkNfTUFHOworCX0KKworCXJldHVybiAwOworfQorCisvKiB0b2dnbGUgTEVEIDQgdGltZXMgcGVyIHNlY29uZCA9IDIgImJsaW5rcyIgcGVyIHNlY29uZCAqLworI2RlZmluZSBFMTAwMF9JRF9JTlRFUlZBTAkoSFovNCkKKworLyogYml0IGRlZmluZXMgZm9yIGFkYXB0ZXItPmxlZF9zdGF0dXMgKi8KKyNkZWZpbmUgRTEwMDBfTEVEX09OCQkwCisKK3N0YXRpYyB2b2lkCitlMTAwMF9sZWRfYmxpbmtfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBlMTAwMF9hZGFwdGVyICopIGRhdGE7CisKKwlpZih0ZXN0X2FuZF9jaGFuZ2VfYml0KEUxMDAwX0xFRF9PTiwgJmFkYXB0ZXItPmxlZF9zdGF0dXMpKQorCQllMTAwMF9sZWRfb2ZmKCZhZGFwdGVyLT5odyk7CisJZWxzZQorCQllMTAwMF9sZWRfb24oJmFkYXB0ZXItPmh3KTsKKworCW1vZF90aW1lcigmYWRhcHRlci0+YmxpbmtfdGltZXIsIGppZmZpZXMgKyBFMTAwMF9JRF9JTlRFUlZBTCk7Cit9CisKK3N0YXRpYyBpbnQKK2UxMDAwX3BoeXNfaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCWlmKCFkYXRhIHx8IGRhdGEgPiAodWludDMyX3QpKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopKQorCQlkYXRhID0gKHVpbnQzMl90KShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKTsKKworCWlmKCFhZGFwdGVyLT5ibGlua190aW1lci5mdW5jdGlvbikgeworCQlpbml0X3RpbWVyKCZhZGFwdGVyLT5ibGlua190aW1lcik7CisJCWFkYXB0ZXItPmJsaW5rX3RpbWVyLmZ1bmN0aW9uID0gZTEwMDBfbGVkX2JsaW5rX2NhbGxiYWNrOworCQlhZGFwdGVyLT5ibGlua190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGFkYXB0ZXI7CisJfQorCisJZTEwMDBfc2V0dXBfbGVkKCZhZGFwdGVyLT5odyk7CisJbW9kX3RpbWVyKCZhZGFwdGVyLT5ibGlua190aW1lciwgamlmZmllcyk7CisKKwltc2xlZXBfaW50ZXJydXB0aWJsZShkYXRhICogMTAwMCk7CisJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPmJsaW5rX3RpbWVyKTsKKwllMTAwMF9sZWRfb2ZmKCZhZGFwdGVyLT5odyk7CisJY2xlYXJfYml0KEUxMDAwX0xFRF9PTiwgJmFkYXB0ZXItPmxlZF9zdGF0dXMpOworCWUxMDAwX2NsZWFudXBfbGVkKCZhZGFwdGVyLT5odyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZTEwMDBfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQllMTAwMF9kb3duKGFkYXB0ZXIpOworCQllMTAwMF91cChhZGFwdGVyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgCitlMTAwMF9nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gRTEwMDBfU1RBVFNfTEVOOworfQorCitzdGF0aWMgdm9pZCAKK2UxMDAwX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIAorCQlzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHVpbnQ2NF90ICpkYXRhKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWludCBpOworCisJZTEwMDBfdXBkYXRlX3N0YXRzKGFkYXB0ZXIpOworCWZvcihpID0gMDsgaSA8IEUxMDAwX1NUQVRTX0xFTjsgaSsrKSB7CisJCWNoYXIgKnAgPSAoY2hhciAqKWFkYXB0ZXIrZTEwMDBfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9vZmZzZXQ7CQorCQlkYXRhW2ldID0gKGUxMDAwX2dzdHJpbmdzX3N0YXRzW2ldLnNpemVvZl9zdGF0ID09IAorCQkJc2l6ZW9mKHVpbnQ2NF90KSkgPyAqKHVpbnQ2NF90ICopcCA6ICoodWludDMyX3QgKilwOworCX0KK30KKworc3RhdGljIHZvaWQgCitlMTAwMF9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBzdHJpbmdzZXQsIHVpbnQ4X3QgKmRhdGEpCit7CisJaW50IGk7CisKKwlzd2l0Y2goc3RyaW5nc2V0KSB7CisJY2FzZSBFVEhfU1NfVEVTVDoKKwkJbWVtY3B5KGRhdGEsICplMTAwMF9nc3RyaW5nc190ZXN0LCAKKwkJCUUxMDAwX1RFU1RfTEVOKkVUSF9HU1RSSU5HX0xFTik7CisJCWJyZWFrOworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQlmb3IgKGk9MDsgaSA8IEUxMDAwX1NUQVRTX0xFTjsgaSsrKSB7CisJCQltZW1jcHkoZGF0YSArIGkgKiBFVEhfR1NUUklOR19MRU4sIAorCQkJZTEwMDBfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9zdHJpbmcsCisJCQlFVEhfR1NUUklOR19MRU4pOworCQl9CisJCWJyZWFrOworCX0KK30KKworc3RydWN0IGV0aHRvb2xfb3BzIGUxMDAwX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MgICAgICAgICAgID0gZTEwMDBfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgICAgICAgICAgID0gZTEwMDBfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyAgICAgICAgICAgID0gZTEwMDBfZ2V0X2RydmluZm8sCisJLmdldF9yZWdzX2xlbiAgICAgICAgICAgPSBlMTAwMF9nZXRfcmVnc19sZW4sCisJLmdldF9yZWdzICAgICAgICAgICAgICAgPSBlMTAwMF9nZXRfcmVncywKKwkuZ2V0X3dvbCAgICAgICAgICAgICAgICA9IGUxMDAwX2dldF93b2wsCisJLnNldF93b2wgICAgICAgICAgICAgICAgPSBlMTAwMF9zZXRfd29sLAorCS5nZXRfbXNnbGV2ZWwJICAgICAgICA9IGUxMDAwX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCSAgICAgICAgPSBlMTAwMF9zZXRfbXNnbGV2ZWwsCisJLm53YXlfcmVzZXQgICAgICAgICAgICAgPSBlMTAwMF9ud2F5X3Jlc2V0LAorCS5nZXRfbGluayAgICAgICAgICAgICAgID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X2VlcHJvbV9sZW4gICAgICAgICA9IGUxMDAwX2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tICAgICAgICAgICAgID0gZTEwMDBfZ2V0X2VlcHJvbSwKKwkuc2V0X2VlcHJvbSAgICAgICAgICAgICA9IGUxMDAwX3NldF9lZXByb20sCisJLmdldF9yaW5ncGFyYW0gICAgICAgICAgPSBlMTAwMF9nZXRfcmluZ3BhcmFtLAorCS5zZXRfcmluZ3BhcmFtICAgICAgICAgID0gZTEwMDBfc2V0X3JpbmdwYXJhbSwKKwkuZ2V0X3BhdXNlcGFyYW0JCT0gZTEwMDBfZ2V0X3BhdXNlcGFyYW0sCisJLnNldF9wYXVzZXBhcmFtCQk9IGUxMDAwX3NldF9wYXVzZXBhcmFtLAorCS5nZXRfcnhfY3N1bQkJPSBlMTAwMF9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0JCT0gZTEwMDBfc2V0X3J4X2NzdW0sCisJLmdldF90eF9jc3VtCQk9IGUxMDAwX2dldF90eF9jc3VtLAorCS5zZXRfdHhfY3N1bQkJPSBlMTAwMF9zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKKyNpZmRlZiBORVRJRl9GX1RTTworCS5nZXRfdHNvCQk9IGV0aHRvb2xfb3BfZ2V0X3RzbywKKwkuc2V0X3RzbwkJPSBlMTAwMF9zZXRfdHNvLAorI2VuZGlmCisJLnNlbGZfdGVzdF9jb3VudCAgICAgICAgPSBlMTAwMF9kaWFnX3Rlc3RfY291bnQsCisJLnNlbGZfdGVzdCAgICAgICAgICAgICAgPSBlMTAwMF9kaWFnX3Rlc3QsCisJLmdldF9zdHJpbmdzICAgICAgICAgICAgPSBlMTAwMF9nZXRfc3RyaW5ncywKKwkucGh5c19pZCAgICAgICAgICAgICAgICA9IGUxMDAwX3BoeXNfaWQsCisJLmdldF9zdGF0c19jb3VudCAgICAgICAgPSBlMTAwMF9nZXRfc3RhdHNfY291bnQsCisJLmdldF9ldGh0b29sX3N0YXRzICAgICAgPSBlMTAwMF9nZXRfZXRodG9vbF9zdGF0cywKK307CisKK3ZvaWQgZTEwMDBfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmUxMDAwX2V0aHRvb2xfb3BzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NmE5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCkBAIC0wLDAgKzEsNTQwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGUxMDAwX2h3LmMKKyAqIFNoYXJlZCBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyBhbmQgY29uZmlndXJpbmcgdGhlIE1BQworICovCisKKyNpbmNsdWRlICJlMTAwMF9ody5oIgorCitzdGF0aWMgaW50MzJfdCBlMTAwMF9zZXRfcGh5X3R5cGUoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgdm9pZCBlMTAwMF9waHlfaW5pdF9zY3JpcHQoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9zZXR1cF9jb3BwZXJfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3NldHVwX2ZpYmVyX3NlcmRlc19saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfYWRqdXN0X3NlcmRlc19hbXBsaXR1ZGUoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9waHlfZm9yY2Vfc3BlZWRfZHVwbGV4KHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfY29uZmlnX21hY190b19waHkoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgdm9pZCBlMTAwMF9yYWlzZV9tZGlfY2xrKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90ICpjdHJsKTsKK3N0YXRpYyB2b2lkIGUxMDAwX2xvd2VyX21kaV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgKmN0cmwpOworc3RhdGljIHZvaWQgZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY291bnQpOworc3RhdGljIHVpbnQxNl90IGUxMDAwX3NoaWZ0X2luX21kaV9iaXRzKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfcGh5X3Jlc2V0X2RzcChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3dyaXRlX2VlcHJvbV9zcGkoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDE2X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB3b3JkcywgdWludDE2X3QgKmRhdGEpOworc3RhdGljIGludDMyX3QgZTEwMDBfd3JpdGVfZWVwcm9tX21pY3Jvd2lyZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBvZmZzZXQsIHVpbnQxNl90IHdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZGF0YSk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9zcGlfZWVwcm9tX3JlYWR5KHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIHZvaWQgZTEwMDBfcmFpc2VfZWVfY2xrKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90ICplZWNkKTsKK3N0YXRpYyB2b2lkIGUxMDAwX2xvd2VyX2VlX2NsayhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCAqZWVjZCk7CitzdGF0aWMgdm9pZCBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY291bnQpOworc3RhdGljIGludDMyX3QgZTEwMDBfd3JpdGVfcGh5X3JlZ19leChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCByZWdfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGh5X2RhdGEpOworc3RhdGljIGludDMyX3QgZTEwMDBfcmVhZF9waHlfcmVnX2V4KHN0cnVjdCBlMTAwMF9odyAqaHcsdWludDMyX3QgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKnBoeV9kYXRhKTsKK3N0YXRpYyB1aW50MTZfdCBlMTAwMF9zaGlmdF9pbl9lZV9iaXRzKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90IGNvdW50KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX2FjcXVpcmVfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIHZvaWQgZTEwMDBfcmVsZWFzZV9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgdm9pZCBlMTAwMF9zdGFuZGJ5X2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX2lkX2xlZF9pbml0KHN0cnVjdCBlMTAwMF9odyAqIGh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3NldF92Y29fc3BlZWQoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF93b3JrYXJvdW5kKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfc2V0X3BoeV9tb2RlKHN0cnVjdCBlMTAwMF9odyAqaHcpOworCisvKiBJR1AgY2FibGUgbGVuZ3RoIHRhYmxlICovCitzdGF0aWMgY29uc3QKK3VpbnQxNl90IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfdGFibGVbSUdQMDFFMTAwMF9BR0NfTEVOR1RIX1RBQkxFX1NJWkVdID0KKyAgICB7IDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCisgICAgICA1LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyNSwgMjUsIDI1LAorICAgICAgMjUsIDI1LCAyNSwgMjUsIDMwLCAzMCwgMzAsIDMwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsCisgICAgICA0MCwgNTAsIDUwLCA1MCwgNTAsIDUwLCA1MCwgNTAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwKKyAgICAgIDYwLCA3MCwgNzAsIDcwLCA3MCwgNzAsIDcwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA5MCwgOTAsIDkwLAorICAgICAgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLAorICAgICAgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLAorICAgICAgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZXQgdGhlIHBoeSB0eXBlIG1lbWJlciBpbiB0aGUgaHcgc3RydWN0LgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9zZXRfcGh5X3R5cGUoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBERUJVR0ZVTkMoImUxMDAwX3NldF9waHlfdHlwZSIpOworCisgICAgc3dpdGNoKGh3LT5waHlfaWQpIHsKKyAgICBjYXNlIE04OEUxMDAwX0VfUEhZX0lEOgorICAgIGNhc2UgTTg4RTEwMDBfSV9QSFlfSUQ6CisgICAgY2FzZSBNODhFMTAxMV9JX1BIWV9JRDoKKyAgICAgICAgaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X204ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJR1AwMUUxMDAwX0lfUEhZX0lEOgorICAgICAgICBpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEgfHwKKyAgICAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8CisgICAgICAgICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NyB8fAorICAgICAgICAgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpIHsKKyAgICAgICAgICAgIGh3LT5waHlfdHlwZSA9IGUxMDAwX3BoeV9pZ3A7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBGYWxsIFRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBTaG91bGQgbmV2ZXIgaGF2ZSBsb2FkZWQgb24gdGhpcyBkZXZpY2UgKi8KKyAgICAgICAgaHctPnBoeV90eXBlID0gZTEwMDBfcGh5X3VuZGVmaW5lZDsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZX1RZUEU7CisgICAgfQorCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElHUCBwaHkgaW5pdCBzY3JpcHQgLSBpbml0aWFsaXplcyB0aGUgR2JFIFBIWQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfcGh5X2luaXRfc2NyaXB0KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfc2F2ZWRfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X2luaXRfc2NyaXB0Iik7CisKKworICAgIGlmKGh3LT5waHlfaW5pdF9zY3JpcHQpIHsKKyAgICAgICAgbXNlY19kZWxheSgyMCk7CisKKyAgICAgICAgLyogU2F2ZSBvZmYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgcmVnaXN0ZXIgMHgyRjVCIHRvIGJlIHJlc3RvcmVkIGF0CisgICAgICAgICAqIHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lLiAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCAweDJGNUIsICZwaHlfc2F2ZWRfZGF0YSk7CisKKyAgICAgICAgLyogRGlzYWJsZWQgdGhlIFBIWSB0cmFuc21pdHRlciAqLworICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDJGNUIsIDB4MDAwMyk7CisKKyAgICAgICAgbXNlY19kZWxheSgyMCk7CisKKyAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywweDAwMDAsMHgwMTQwKTsKKworICAgICAgICBtc2VjX2RlbGF5KDUpOworCisgICAgICAgIHN3aXRjaChody0+bWFjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0MToKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0NzoKKyAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUY5NSwgMHgwMDAxKTsKKworICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjcxLCAweEJEMjEpOworCisgICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGNzksIDB4MDAxOCk7CisKKyAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUYzMCwgMHgxNjAwKTsKKworICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjMxLCAweDAwMTQpOworCisgICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGMzIsIDB4MTYxQyk7CisKKyAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUY5NCwgMHgwMDAzKTsKKworICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjk2LCAweDAwM0YpOworCisgICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDIwMTAsIDB4MDAwOCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorICAgICAgICBjYXNlIGUxMDAwXzgyNTQ3X3Jldl8yOgorICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjczLCAweDAwOTkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MDAwMCwgMHgzMzAwKTsKKworICAgICAgICBtc2VjX2RlbGF5KDIwKTsKKworICAgICAgICAvKiBOb3cgZW5hYmxlIHRoZSB0cmFuc21pdHRlciAqLworICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDJGNUIsIHBoeV9zYXZlZF9kYXRhKTsKKworICAgICAgICBpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGZ1c2VkLCBmaW5lLCBjb2Fyc2U7CisKKyAgICAgICAgICAgIC8qIE1vdmUgdG8gYW5hbG9nIHJlZ2lzdGVycyBwYWdlICovCisgICAgICAgICAgICBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfQU5BTE9HX1NQQVJFX0ZVU0VfU1RBVFVTLCAmZnVzZWQpOworCisgICAgICAgICAgICBpZighKGZ1c2VkICYgSUdQMDFFMTAwMF9BTkFMT0dfU1BBUkVfRlVTRV9FTkFCTEVEKSkgeworICAgICAgICAgICAgICAgIGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9TVEFUVVMsICZmdXNlZCk7CisKKyAgICAgICAgICAgICAgICBmaW5lID0gZnVzZWQgJiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfTUFTSzsKKyAgICAgICAgICAgICAgICBjb2Fyc2UgPSBmdXNlZCAmIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFX01BU0s7CisKKyAgICAgICAgICAgICAgICBpZihjb2Fyc2UgPiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9USFJFU0gpIHsKKyAgICAgICAgICAgICAgICAgICAgY29hcnNlIC09IElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFXzEwOworICAgICAgICAgICAgICAgICAgICBmaW5lIC09IElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfRklORV8xOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZihjb2Fyc2UgPT0gSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfVEhSRVNIKQorICAgICAgICAgICAgICAgICAgICBmaW5lIC09IElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfRklORV8xMDsKKworICAgICAgICAgICAgICAgIGZ1c2VkID0gKGZ1c2VkICYgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9QT0xZX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmaW5lICYgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb2Fyc2UgJiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9NQVNLKTsKKworICAgICAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09OVFJPTCwgZnVzZWQpOworICAgICAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQllQQVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9FTkFCTEVfU1dfQ09OVFJPTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldCB0aGUgbWFjIHR5cGUgbWVtYmVyIGluIHRoZSBodyBzdHJ1Y3QuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3NldF9tYWNfdHlwZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X21hY190eXBlIik7CisKKyAgICBzd2l0Y2ggKGh3LT5kZXZpY2VfaWQpIHsKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0MjoKKyAgICAgICAgc3dpdGNoIChody0+cmV2aXNpb25faWQpIHsKKyAgICAgICAgY2FzZSBFMTAwMF84MjU0Ml8yXzBfUkVWX0lEOgorICAgICAgICAgICAgaHctPm1hY190eXBlID0gZTEwMDBfODI1NDJfcmV2Ml8wOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRTEwMDBfODI1NDJfMl8xX1JFVl9JRDoKKyAgICAgICAgICAgIGh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQyX3JldjJfMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogSW52YWxpZCA4MjU0MiByZXZpc2lvbiBJRCAqLworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfTUFDX1RZUEU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDNHQ19GSUJFUjoKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0M0dDX0NPUFBFUjoKKyAgICAgICAgaHctPm1hY190eXBlID0gZTEwMDBfODI1NDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ0RUlfQ09QUEVSOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ0RUlfRklCRVI6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDRHQ19DT1BQRVI6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDRHQ19MT006CisgICAgICAgIGh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQ0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0MEVNOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQwRU1fTE9NOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQwRVA6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDBFUF9MT006CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDBFUF9MUDoKKyAgICAgICAgaHctPm1hY190eXBlID0gZTEwMDBfODI1NDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1RU1fQ09QUEVSOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1RU1fRklCRVI6CisgICAgICAgIGh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQ1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NUdNX0NPUFBFUjoKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NUdNX0ZJQkVSOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1R01fU0VSREVTOgorICAgICAgICBody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0NV9yZXZfMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDZFQl9DT1BQRVI6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDZFQl9GSUJFUjoKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NkVCX1FVQURfQ09QUEVSOgorICAgICAgICBody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0NjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9DT1BQRVI6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9GSUJFUjoKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX1NFUkRFUzoKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX1BDSUU6CisgICAgICAgIGh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQ2X3Jldl8zOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0MUVJOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQxRUlfTU9CSUxFOgorICAgICAgICBody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0MTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDFFUjoKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0MUdJOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQxR0lfTEY6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDFHSV9NT0JJTEU6CisgICAgICAgIGh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQxX3Jldl8yOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0N0VJOgorICAgICAgICBody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0NzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDdHSToKKyAgICAgICAgaHctPm1hY190eXBlID0gZTEwMDBfODI1NDdfcmV2XzI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIFNob3VsZCBuZXZlciBoYXZlIGxvYWRlZCBvbiB0aGlzIGRldmljZSAqLworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9NQUNfVFlQRTsKKyAgICB9CisKKyAgICBzd2l0Y2goaHctPm1hY190eXBlKSB7CisgICAgY2FzZSBlMTAwMF84MjU0MToKKyAgICBjYXNlIGUxMDAwXzgyNTQ3OgorICAgIGNhc2UgZTEwMDBfODI1NDFfcmV2XzI6CisgICAgY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKKyAgICAgICAgaHctPmFzZl9maXJtd2FyZV9wcmVzZW50ID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0IG1lZGlhIHR5cGUgYW5kIFRCSSBjb21wYXRpYmlsaXR5LgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX3NldF9tZWRpYV90eXBlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3Qgc3RhdHVzOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9zZXRfbWVkaWFfdHlwZSIpOworCisgICAgaWYoaHctPm1hY190eXBlICE9IGUxMDAwXzgyNTQzKSB7CisgICAgICAgIC8qIHRiaV9jb21wYXRpYmlsaXR5IGlzIG9ubHkgdmFsaWQgb24gODI1NDMgKi8KKyAgICAgICAgaHctPnRiaV9jb21wYXRpYmlsaXR5X2VuID0gRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChody0+ZGV2aWNlX2lkKSB7CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDVHTV9TRVJERVM6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9TRVJERVM6CisgICAgICAgIGh3LT5tZWRpYV90eXBlID0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXM7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgeworICAgICAgICAgICAgc3RhdHVzID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUyk7CisgICAgICAgICAgICBpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfVEJJTU9ERSkgeworICAgICAgICAgICAgICAgIGh3LT5tZWRpYV90eXBlID0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcjsKKyAgICAgICAgICAgICAgICAvKiB0YmlfY29tcGF0aWJpbGl0eSBub3QgdmFsaWQgb24gZmliZXIgKi8KKyAgICAgICAgICAgICAgICBody0+dGJpX2NvbXBhdGliaWxpdHlfZW4gPSBGQUxTRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaHctPm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYW4gODI1NDIgKGZpYmVyIG9ubHkpICovCisgICAgICAgICAgICBody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfZmliZXI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlc2V0IHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSB1bml0czsgbWFzayBhbmQgY2xlYXIgYWxsIGludGVycnVwdHMuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3Jlc2V0X2h3KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgY3RybDsKKyAgICB1aW50MzJfdCBjdHJsX2V4dDsKKyAgICB1aW50MzJfdCBpY3I7CisgICAgdWludDMyX3QgbWFuYzsKKyAgICB1aW50MzJfdCBsZWRfY3RybDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcmVzZXRfaHciKTsKKworICAgIC8qIEZvciA4MjU0MiAocmV2IDIuMCksIGRpc2FibGUgTVdJIGJlZm9yZSBpc3N1aW5nIGEgZGV2aWNlIHJlc2V0ICovCisgICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkgeworICAgICAgICBERUJVR09VVCgiRGlzYWJsaW5nIE1XSSBvbiA4MjU0MiByZXYgMi4wXG4iKTsKKyAgICAgICAgZTEwMDBfcGNpX2NsZWFyX213aShodyk7CisgICAgfQorCisgICAgLyogQ2xlYXIgaW50ZXJydXB0IG1hc2sgdG8gc3RvcCBib2FyZCBmcm9tIGdlbmVyYXRpbmcgaW50ZXJydXB0cyAqLworICAgIERFQlVHT1VUKCJNYXNraW5nIG9mZiBhbGwgaW50ZXJydXB0c1xuIik7CisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBJTUMsIDB4ZmZmZmZmZmYpOworCisgICAgLyogRGlzYWJsZSB0aGUgVHJhbnNtaXQgYW5kIFJlY2VpdmUgdW5pdHMuICBUaGVuIGRlbGF5IHRvIGFsbG93CisgICAgICogYW55IHBlbmRpbmcgdHJhbnNhY3Rpb25zIHRvIGNvbXBsZXRlIGJlZm9yZSB3ZSBoaXQgdGhlIE1BQyB3aXRoCisgICAgICogdGhlIGdsb2JhbCByZXNldC4KKyAgICAgKi8KKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIFJDVEwsIDApOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVENUTCwgRTEwMDBfVENUTF9QU1ApOworICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKworICAgIC8qIFRoZSB0YmlfY29tcGF0aWJpbGl0eV9vbiBGbGFnIG11c3QgYmUgY2xlYXJlZCB3aGVuIFJjdGwgaXMgY2xlYXJlZC4gKi8KKyAgICBody0+dGJpX2NvbXBhdGliaWxpdHlfb24gPSBGQUxTRTsKKworICAgIC8qIERlbGF5IHRvIGFsbG93IGFueSBvdXRzdGFuZGluZyBQQ0kgdHJhbnNhY3Rpb25zIHRvIGNvbXBsZXRlIGJlZm9yZQorICAgICAqIHJlc2V0dGluZyB0aGUgZGV2aWNlCisgICAgICovCisgICAgbXNlY19kZWxheSgxMCk7CisKKyAgICBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCisgICAgLyogTXVzdCByZXNldCB0aGUgUEhZIGJlZm9yZSByZXNldHRpbmcgdGhlIE1BQyAqLworICAgIGlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19JTyhodywgQ1RSTCwgKGN0cmwgfCBFMTAwMF9DVFJMX1BIWV9SU1QpKTsKKyAgICAgICAgbXNlY19kZWxheSg1KTsKKyAgICB9CisKKyAgICAvKiBJc3N1ZSBhIGdsb2JhbCByZXNldCB0byB0aGUgTUFDLiAgVGhpcyB3aWxsIHJlc2V0IHRoZSBjaGlwJ3MKKyAgICAgKiB0cmFuc21pdCwgcmVjZWl2ZSwgRE1BLCBhbmQgbGluayB1bml0cy4gIEl0IHdpbGwgbm90IGVmZmVjdAorICAgICAqIHRoZSBjdXJyZW50IFBDSSBjb25maWd1cmF0aW9uLiAgVGhlIGdsb2JhbCByZXNldCBiaXQgaXMgc2VsZi0KKyAgICAgKiBjbGVhcmluZywgYW5kIHNob3VsZCBjbGVhciB3aXRoaW4gYSBtaWNyb3NlY29uZC4KKyAgICAgKi8KKyAgICBERUJVR09VVCgiSXNzdWluZyBhIGdsb2JhbCByZXNldCB0byBNQUNcbiIpOworCisgICAgc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworICAgICAgICBjYXNlIGUxMDAwXzgyNTQ0OgorICAgICAgICBjYXNlIGUxMDAwXzgyNTQwOgorICAgICAgICBjYXNlIGUxMDAwXzgyNTQ1OgorICAgICAgICBjYXNlIGUxMDAwXzgyNTQ2OgorICAgICAgICBjYXNlIGUxMDAwXzgyNTQxOgorICAgICAgICBjYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorICAgICAgICAgICAgLyogVGhlc2UgY29udHJvbGxlcnMgY2FuJ3QgYWNrIHRoZSA2NC1iaXQgd3JpdGUgd2hlbiBpc3N1aW5nIHRoZQorICAgICAgICAgICAgICogcmVzZXQsIHNvIHVzZSBJTy1tYXBwaW5nIGFzIGEgd29ya2Fyb3VuZCB0byBpc3N1ZSB0aGUgcmVzZXQgKi8KKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFR19JTyhodywgQ1RSTCwgKGN0cmwgfCBFMTAwMF9DVFJMX1JTVCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDZfcmV2XzM6CisgICAgICAgICAgICAvKiBSZXNldCBpcyBwZXJmb3JtZWQgb24gYSBzaGFkb3cgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTF9EVVAsIChjdHJsIHwgRTEwMDBfQ1RSTF9SU1QpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCAoY3RybCB8IEUxMDAwX0NUUkxfUlNUKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBBZnRlciBNQUMgcmVzZXQsIGZvcmNlIHJlbG9hZCBvZiBFRVBST00gdG8gcmVzdG9yZSBwb3dlci1vbiBzZXR0aW5ncyB0bworICAgICAqIGRldmljZS4gIExhdGVyIGNvbnRyb2xsZXJzIHJlbG9hZCB0aGUgRUVQUk9NIGF1dG9tYXRpY2FsbHksIHNvIGp1c3Qgd2FpdAorICAgICAqIGZvciByZWxvYWQgdG8gY29tcGxldGUuCisgICAgICovCisgICAgc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworICAgICAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzE6CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDM6CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDQ6CisgICAgICAgICAgICAvKiBXYWl0IGZvciByZXNldCB0byBjb21wbGV0ZSAqLworICAgICAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgICAgIGN0cmxfZXh0ID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkxfRVhUKTsKKyAgICAgICAgICAgIGN0cmxfZXh0IHw9IEUxMDAwX0NUUkxfRVhUX0VFX1JTVDsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTF9FWFQsIGN0cmxfZXh0KTsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgICAgIC8qIFdhaXQgZm9yIEVFUFJPTSByZWxvYWQgKi8KKyAgICAgICAgICAgIG1zZWNfZGVsYXkoMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0MToKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0NzoKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKKyAgICAgICAgICAgIC8qIFdhaXQgZm9yIEVFUFJPTSByZWxvYWQgKi8KKyAgICAgICAgICAgIG1zZWNfZGVsYXkoMjApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBXYWl0IGZvciBFRVBST00gcmVsb2FkIChpdCBoYXBwZW5zIGF1dG9tYXRpY2FsbHkpICovCisgICAgICAgICAgICBtc2VjX2RlbGF5KDUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogRGlzYWJsZSBIVyBBUlBzIG9uIEFTRiBlbmFibGVkIGFkYXB0ZXJzICovCisgICAgaWYoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQwKSB7CisgICAgICAgIG1hbmMgPSBFMTAwMF9SRUFEX1JFRyhodywgTUFOQyk7CisgICAgICAgIG1hbmMgJj0gfihFMTAwMF9NQU5DX0FSUF9FTik7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTUFOQywgbWFuYyk7CisgICAgfQorCisgICAgaWYoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSkgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpIHsKKyAgICAgICAgZTEwMDBfcGh5X2luaXRfc2NyaXB0KGh3KTsKKworICAgICAgICAvKiBDb25maWd1cmUgYWN0aXZpdHkgTEVEIGFmdGVyIFBIWSByZXNldCAqLworICAgICAgICBsZWRfY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBMRURDVEwpOworICAgICAgICBsZWRfY3RybCAmPSBJR1BfQUNUSVZJVFlfTEVEX01BU0s7CisgICAgICAgIGxlZF9jdHJsIHw9IChJR1BfQUNUSVZJVFlfTEVEX0VOQUJMRSB8IElHUF9MRUQzX01PREUpOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIExFRENUTCwgbGVkX2N0cmwpOworICAgIH0KKworICAgIC8qIENsZWFyIGludGVycnVwdCBtYXNrIHRvIHN0b3AgYm9hcmQgZnJvbSBnZW5lcmF0aW5nIGludGVycnVwdHMgKi8KKyAgICBERUJVR09VVCgiTWFza2luZyBvZmYgYWxsIGludGVycnVwdHNcbiIpOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgSU1DLCAweGZmZmZmZmZmKTsKKworICAgIC8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdCBldmVudHMuICovCisgICAgaWNyID0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUik7CisKKyAgICAvKiBJZiBNV0kgd2FzIHByZXZpb3VzbHkgZW5hYmxlZCwgcmVlbmFibGUgaXQuICovCisgICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkgeworICAgICAgICBpZihody0+cGNpX2NtZF93b3JkICYgQ01EX01FTV9XUlRfSU5WQUxJREFURSkKKyAgICAgICAgICAgIGUxMDAwX3BjaV9zZXRfbXdpKGh3KTsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGVyZm9ybXMgYmFzaWMgY29uZmlndXJhdGlvbiBvZiB0aGUgYWRhcHRlci4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIEFzc3VtZXMgdGhhdCB0aGUgY29udHJvbGxlciBoYXMgcHJldmlvdXNseSBiZWVuIHJlc2V0IGFuZCBpcyBpbiBhCisgKiBwb3N0LXJlc2V0IHVuaW5pdGlhbGl6ZWQgc3RhdGUuIEluaXRpYWxpemVzIHRoZSByZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXJzLAorICogbXVsdGljYXN0IHRhYmxlLCBhbmQgVkxBTiBmaWx0ZXIgdGFibGUuIENhbGxzIHJvdXRpbmVzIHRvIHNldHVwIGxpbmsKKyAqIGNvbmZpZ3VyYXRpb24gYW5kIGZsb3cgY29udHJvbCBzZXR0aW5ncy4gQ2xlYXJzIGFsbCBvbi1jaGlwIGNvdW50ZXJzLiBMZWF2ZXMKKyAqIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSB1bml0cyBkaXNhYmxlZCBhbmQgdW5pbml0aWFsaXplZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2luaXRfaHcoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBjdHJsOworICAgIHVpbnQzMl90IGk7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBjaXhfY21kX3dvcmQ7CisgICAgdWludDE2X3QgcGNpeF9zdGF0X2hpX3dvcmQ7CisgICAgdWludDE2X3QgY21kX21tcmJjOworICAgIHVpbnQxNl90IHN0YXRfbW1yYmM7CisgICAgREVCVUdGVU5DKCJlMTAwMF9pbml0X2h3Iik7CisKKyAgICAvKiBJbml0aWFsaXplIElkZW50aWZpY2F0aW9uIExFRCAqLworICAgIHJldF92YWwgPSBlMTAwMF9pZF9sZWRfaW5pdChodyk7CisgICAgaWYocmV0X3ZhbCkgeworICAgICAgICBERUJVR09VVCgiRXJyb3IgSW5pdGlhbGl6aW5nIElkZW50aWZpY2F0aW9uIExFRFxuIik7CisgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0KKworICAgIC8qIFNldCB0aGUgbWVkaWEgdHlwZSBhbmQgVEJJIGNvbXBhdGliaWxpdHkgKi8KKyAgICBlMTAwMF9zZXRfbWVkaWFfdHlwZShodyk7CisKKyAgICAvKiBEaXNhYmxpbmcgVkxBTiBmaWx0ZXJpbmcuICovCisgICAgREVCVUdPVVQoIkluaXRpYWxpemluZyB0aGUgSUVFRSBWTEFOXG4iKTsKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIFZFVCwgMCk7CisKKyAgICBlMTAwMF9jbGVhcl92ZnRhKGh3KTsKKworICAgIC8qIEZvciA4MjU0MiAocmV2IDIuMCksIGRpc2FibGUgTVdJIGFuZCBwdXQgdGhlIHJlY2VpdmVyIGludG8gcmVzZXQgKi8KKyAgICBpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKSB7CisgICAgICAgIERFQlVHT1VUKCJEaXNhYmxpbmcgTVdJIG9uIDgyNTQyIHJldiAyLjBcbiIpOworICAgICAgICBlMTAwMF9wY2lfY2xlYXJfbXdpKGh3KTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBSQ1RMLCBFMTAwMF9SQ1RMX1JTVCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgbXNlY19kZWxheSg1KTsKKyAgICB9CisKKyAgICAvKiBTZXR1cCB0aGUgcmVjZWl2ZSBhZGRyZXNzLiBUaGlzIGludm9sdmVzIGluaXRpYWxpemluZyBhbGwgb2YgdGhlIFJlY2VpdmUKKyAgICAgKiBBZGRyZXNzIFJlZ2lzdGVycyAoUkFScyAwIC0gMTUpLgorICAgICAqLworICAgIGUxMDAwX2luaXRfcnhfYWRkcnMoaHcpOworCisgICAgLyogRm9yIDgyNTQyIChyZXYgMi4wKSwgdGFrZSB0aGUgcmVjZWl2ZXIgb3V0IG9mIHJlc2V0IGFuZCBlbmFibGUgTVdJICovCisgICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkgeworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFJDVEwsIDApOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgIG1zZWNfZGVsYXkoMSk7CisgICAgICAgIGlmKGh3LT5wY2lfY21kX3dvcmQgJiBDTURfTUVNX1dSVF9JTlZBTElEQVRFKQorICAgICAgICAgICAgZTEwMDBfcGNpX3NldF9td2koaHcpOworICAgIH0KKworICAgIC8qIFplcm8gb3V0IHRoZSBNdWx0aWNhc3QgSEFTSCB0YWJsZSAqLworICAgIERFQlVHT1VUKCJaZXJvaW5nIHRoZSBNVEFcbiIpOworICAgIGZvcihpID0gMDsgaSA8IEUxMDAwX01DX1RCTF9TSVpFOyBpKyspCisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgTVRBLCBpLCAwKTsKKworICAgIC8qIFNldCB0aGUgUENJIHByaW9yaXR5IGJpdCBjb3JyZWN0bHkgaW4gdGhlIENUUkwgcmVnaXN0ZXIuICBUaGlzCisgICAgICogZGV0ZXJtaW5lcyBpZiB0aGUgYWRhcHRlciBnaXZlcyBwcmlvcml0eSB0byByZWNlaXZlcywgb3IgaWYgaXQKKyAgICAgKiBnaXZlcyBlcXVhbCBwcmlvcml0eSB0byB0cmFuc21pdHMgYW5kIHJlY2VpdmVzLgorICAgICAqLworICAgIGlmKGh3LT5kbWFfZmFpcm5lc3MpIHsKKyAgICAgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsIHwgRTEwMDBfQ1RSTF9QUklPUik7CisgICAgfQorCisgICAgc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CisgICAgY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogV29ya2Fyb3VuZCBmb3IgUENJLVggcHJvYmxlbSB3aGVuIEJJT1Mgc2V0cyBNTVJCQyBpbmNvcnJlY3RseS4gKi8KKyAgICAgICAgaWYoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaXgpIHsKKyAgICAgICAgICAgIGUxMDAwX3JlYWRfcGNpX2NmZyhodywgUENJWF9DT01NQU5EX1JFR0lTVEVSLCAmcGNpeF9jbWRfd29yZCk7CisgICAgICAgICAgICBlMTAwMF9yZWFkX3BjaV9jZmcoaHcsIFBDSVhfU1RBVFVTX1JFR0lTVEVSX0hJLAorICAgICAgICAgICAgICAgICZwY2l4X3N0YXRfaGlfd29yZCk7CisgICAgICAgICAgICBjbWRfbW1yYmMgPSAocGNpeF9jbWRfd29yZCAmIFBDSVhfQ09NTUFORF9NTVJCQ19NQVNLKSA+PgorICAgICAgICAgICAgICAgIFBDSVhfQ09NTUFORF9NTVJCQ19TSElGVDsKKyAgICAgICAgICAgIHN0YXRfbW1yYmMgPSAocGNpeF9zdGF0X2hpX3dvcmQgJiBQQ0lYX1NUQVRVU19ISV9NTVJCQ19NQVNLKSA+PgorICAgICAgICAgICAgICAgIFBDSVhfU1RBVFVTX0hJX01NUkJDX1NISUZUOworICAgICAgICAgICAgaWYoc3RhdF9tbXJiYyA9PSBQQ0lYX1NUQVRVU19ISV9NTVJCQ180SykKKyAgICAgICAgICAgICAgICBzdGF0X21tcmJjID0gUENJWF9TVEFUVVNfSElfTU1SQkNfMks7CisgICAgICAgICAgICBpZihjbWRfbW1yYmMgPiBzdGF0X21tcmJjKSB7CisgICAgICAgICAgICAgICAgcGNpeF9jbWRfd29yZCAmPSB+UENJWF9DT01NQU5EX01NUkJDX01BU0s7CisgICAgICAgICAgICAgICAgcGNpeF9jbWRfd29yZCB8PSBzdGF0X21tcmJjIDw8IFBDSVhfQ09NTUFORF9NTVJCQ19TSElGVDsKKyAgICAgICAgICAgICAgICBlMTAwMF93cml0ZV9wY2lfY2ZnKGh3LCBQQ0lYX0NPTU1BTkRfUkVHSVNURVIsCisgICAgICAgICAgICAgICAgICAgICZwY2l4X2NtZF93b3JkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBDYWxsIGEgc3Vicm91dGluZSB0byBjb25maWd1cmUgdGhlIGxpbmsgYW5kIHNldHVwIGZsb3cgY29udHJvbC4gKi8KKyAgICByZXRfdmFsID0gZTEwMDBfc2V0dXBfbGluayhodyk7CisKKyAgICAvKiBTZXQgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3Igd3JpdGUtYmFjayBwb2xpY3kgKi8KKyAgICBpZihody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0NCkgeworICAgICAgICBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRYRENUTCk7CisgICAgICAgIGN0cmwgPSAoY3RybCAmIH5FMTAwMF9UWERDVExfV1RIUkVTSCkgfCBFMTAwMF9UWERDVExfRlVMTF9UWF9ERVNDX1dCOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFRYRENUTCwgY3RybCk7CisgICAgfQorCisgICAgLyogQ2xlYXIgYWxsIG9mIHRoZSBzdGF0aXN0aWNzIHJlZ2lzdGVycyAoY2xlYXIgb24gcmVhZCkuICBJdCBpcworICAgICAqIGltcG9ydGFudCB0aGF0IHdlIGRvIHRoaXMgYWZ0ZXIgd2UgaGF2ZSB0cmllZCB0byBlc3RhYmxpc2ggbGluaworICAgICAqIGJlY2F1c2UgdGhlIHN5bWJvbCBlcnJvciBjb3VudCB3aWxsIGluY3JlbWVudCB3aWxkbHkgaWYgdGhlcmUKKyAgICAgKiBpcyBubyBsaW5rLgorICAgICAqLworICAgIGUxMDAwX2NsZWFyX2h3X2NudHJzKGh3KTsKKworICAgIHJldHVybiByZXRfdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZGp1c3QgU0VSREVTIG91dHB1dCBhbXBsaXR1ZGUgYmFzZWQgb24gRUVQUk9NIHNldHRpbmcuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfYWRqdXN0X3NlcmRlc19hbXBsaXR1ZGUoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MTZfdCBlZXByb21fZGF0YTsKKyAgICBpbnQzMl90ICByZXRfdmFsOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9hZGp1c3Rfc2VyZGVzX2FtcGxpdHVkZSIpOworCisgICAgaWYoaHctPm1lZGlhX3R5cGUgIT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpCisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCisgICAgc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CisgICAgY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisgICAgfQorCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fU0VSREVTX0FNUExJVFVERSwgMSwgJmVlcHJvbV9kYXRhKTsKKyAgICBpZiAocmV0X3ZhbCkgeworICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisKKyAgICBpZihlZXByb21fZGF0YSAhPSBFRVBST01fUkVTRVJWRURfV09SRCkgeworICAgICAgICAvKiBBZGp1c3QgU0VSREVTIG91dHB1dCBhbXBsaXR1ZGUgb25seS4gKi8KKyAgICAgICAgZWVwcm9tX2RhdGEgJj0gRUVQUk9NX1NFUkRFU19BTVBMSVRVREVfTUFTSzsgCisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfRVhUX0NUUkwsIGVlcHJvbV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb25maWd1cmVzIGZsb3cgY29udHJvbCBhbmQgbGluayBzZXR0aW5ncy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIERldGVybWluZXMgd2hpY2ggZmxvdyBjb250cm9sIHNldHRpbmdzIHRvIHVzZS4gQ2FsbHMgdGhlIGFwcm9wcmlhdGUgbWVkaWEtCisgKiBzcGVjaWZpYyBsaW5rIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24uIENvbmZpZ3VyZXMgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncy4KKyAqIEFzc3VtaW5nIHRoZSBhZGFwdGVyIGhhcyBhIHZhbGlkIGxpbmsgcGFydG5lciwgYSB2YWxpZCBsaW5rIHNob3VsZCBiZQorICogZXN0YWJsaXNoZWQuIEFzc3VtZXMgdGhlIGhhcmR3YXJlIGhhcyBwcmV2aW91c2x5IGJlZW4gcmVzZXQgYW5kIHRoZQorICogdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyIGFyZSBub3QgZW5hYmxlZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3NldHVwX2xpbmsoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBjdHJsX2V4dDsKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgZWVwcm9tX2RhdGE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3NldHVwX2xpbmsiKTsKKworICAgIC8qIFJlYWQgYW5kIHN0b3JlIHdvcmQgMHgwRiBvZiB0aGUgRUVQUk9NLiBUaGlzIHdvcmQgY29udGFpbnMgYml0cworICAgICAqIHRoYXQgZGV0ZXJtaW5lIHRoZSBoYXJkd2FyZSdzIGRlZmF1bHQgUEFVU0UgKGZsb3cgY29udHJvbCkgbW9kZSwKKyAgICAgKiBhIGJpdCB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgSFcgZGVmYXVsdHMgdG8gZW5hYmxpbmcgb3IKKyAgICAgKiBkaXNhYmxpbmcgYXV0by1uZWdvdGlhdGlvbiwgYW5kIHRoZSBkaXJlY3Rpb24gb2YgdGhlCisgICAgICogU1cgZGVmaW5lZCBwaW5zLiBJZiB0aGVyZSBpcyBubyBTVyBvdmVyLXJpZGUgb2YgdGhlIGZsb3cKKyAgICAgKiBjb250cm9sIHNldHRpbmcsIHRoZW4gdGhlIHZhcmlhYmxlIGh3LT5mYyB3aWxsCisgICAgICogYmUgaW5pdGlhbGl6ZWQgYmFzZWQgb24gYSB2YWx1ZSBpbiB0aGUgRUVQUk9NLgorICAgICAqLworICAgIGlmKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fSU5JVF9DT05UUk9MMl9SRUcsIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CisgICAgICAgIERFQlVHT1VUKCJFRVBST00gUmVhZCBFcnJvclxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICB9CisKKyAgICBpZihody0+ZmMgPT0gZTEwMDBfZmNfZGVmYXVsdCkgeworICAgICAgICBpZigoZWVwcm9tX2RhdGEgJiBFRVBST01fV09SRDBGX1BBVVNFX01BU0spID09IDApCisgICAgICAgICAgICBody0+ZmMgPSBlMTAwMF9mY19ub25lOworICAgICAgICBlbHNlIGlmKChlZXByb21fZGF0YSAmIEVFUFJPTV9XT1JEMEZfUEFVU0VfTUFTSykgPT0KKyAgICAgICAgICAgICAgICBFRVBST01fV09SRDBGX0FTTV9ESVIpCisgICAgICAgICAgICBody0+ZmMgPSBlMTAwMF9mY190eF9wYXVzZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaHctPmZjID0gZTEwMDBfZmNfZnVsbDsKKyAgICB9CisKKyAgICAvKiBXZSB3YW50IHRvIHNhdmUgb2ZmIHRoZSBvcmlnaW5hbCBGbG93IENvbnRyb2wgY29uZmlndXJhdGlvbiBqdXN0CisgICAgICogaW4gY2FzZSB3ZSBnZXQgZGlzY29ubmVjdGVkIGFuZCB0aGVuIHJlY29ubmVjdGVkIGludG8gYSBkaWZmZXJlbnQKKyAgICAgKiBodWIgb3Igc3dpdGNoIHdpdGggZGlmZmVyZW50IEZsb3cgQ29udHJvbCBjYXBhYmlsaXRpZXMuCisgICAgICovCisgICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkKKyAgICAgICAgaHctPmZjICY9ICh+ZTEwMDBfZmNfdHhfcGF1c2UpOworCisgICAgaWYoKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKSAmJiAoaHctPnJlcG9ydF90eF9lYXJseSA9PSAxKSkKKyAgICAgICAgaHctPmZjICY9ICh+ZTEwMDBfZmNfcnhfcGF1c2UpOworCisgICAgaHctPm9yaWdpbmFsX2ZjID0gaHctPmZjOworCisgICAgREVCVUdPVVQxKCJBZnRlciBmaXgtdXBzIEZsb3dDb250cm9sIGlzIG5vdyA9ICV4XG4iLCBody0+ZmMpOworCisgICAgLyogVGFrZSB0aGUgNCBiaXRzIGZyb20gRUVQUk9NIHdvcmQgMHgwRiB0aGF0IGRldGVybWluZSB0aGUgaW5pdGlhbAorICAgICAqIHBvbGFyaXR5IHZhbHVlIGZvciB0aGUgU1cgY29udHJvbGxlZCBwaW5zLCBhbmQgc2V0dXAgdGhlCisgICAgICogRXh0ZW5kZWQgRGV2aWNlIENvbnRyb2wgcmVnIHdpdGggdGhhdCBpbmZvLgorICAgICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb25lIG9mIHRoZSBTVyBjb250cm9sbGVkIHBpbnMgaXMgdXNlZCBmb3IKKyAgICAgKiBzaWduYWwgZGV0ZWN0aW9uLiAgU28gdGhpcyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgZTEwMDBfc2V0dXBfcGNzX2xpbmsoKQorICAgICAqIG9yIGUxMDAwX3BoeV9zZXR1cCgpIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICBpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDMpIHsKKyAgICAgICAgY3RybF9leHQgPSAoKGVlcHJvbV9kYXRhICYgRUVQUk9NX1dPUkQwRl9TV1BESU9fRVhUKSA8PAorICAgICAgICAgICAgICAgICAgICBTV0RQSU9fX0VYVF9TSElGVCk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTF9FWFQsIGN0cmxfZXh0KTsKKyAgICB9CisKKyAgICAvKiBDYWxsIHRoZSBuZWNlc3Nhcnkgc3Vicm91dGluZSB0byBjb25maWd1cmUgdGhlIGxpbmsuICovCisgICAgcmV0X3ZhbCA9IChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgPworICAgICAgICAgICAgICBlMTAwMF9zZXR1cF9jb3BwZXJfbGluayhodykgOgorICAgICAgICAgICAgICBlMTAwMF9zZXR1cF9maWJlcl9zZXJkZXNfbGluayhodyk7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBmbG93IGNvbnRyb2wgYWRkcmVzcywgdHlwZSwgYW5kIFBBVVNFIHRpbWVyCisgICAgICogcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiAgVGhpcyBpcyBkb25lIGV2ZW4gaWYgZmxvdworICAgICAqIGNvbnRyb2wgaXMgZGlzYWJsZWQsIGJlY2F1c2UgaXQgZG9lcyBub3QgaHVydCBhbnl0aGluZyB0bworICAgICAqIGluaXRpYWxpemUgdGhlc2UgcmVnaXN0ZXJzLgorICAgICAqLworICAgIERFQlVHT1VUKCJJbml0aWFsaXppbmcgdGhlIEZsb3cgQ29udHJvbCBhZGRyZXNzLCB0eXBlIGFuZCB0aW1lciByZWdzXG4iKTsKKworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRkNBTCwgRkxPV19DT05UUk9MX0FERFJFU1NfTE9XKTsKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIEZDQUgsIEZMT1dfQ09OVFJPTF9BRERSRVNTX0hJR0gpOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRkNULCBGTE9XX0NPTlRST0xfVFlQRSk7CisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1RUViwgaHctPmZjX3BhdXNlX3RpbWUpOworCisgICAgLyogU2V0IHRoZSBmbG93IGNvbnRyb2wgcmVjZWl2ZSB0aHJlc2hvbGQgcmVnaXN0ZXJzLiAgTm9ybWFsbHksCisgICAgICogdGhlc2UgcmVnaXN0ZXJzIHdpbGwgYmUgc2V0IHRvIGEgZGVmYXVsdCB0aHJlc2hvbGQgdGhhdCBtYXkgYmUKKyAgICAgKiBhZGp1c3RlZCBsYXRlciBieSB0aGUgZHJpdmVyJ3MgcnVudGltZSBjb2RlLiAgSG93ZXZlciwgaWYgdGhlCisgICAgICogYWJpbGl0eSB0byB0cmFuc21pdCBwYXVzZSBmcmFtZXMgaW4gbm90IGVuYWJsZWQsIHRoZW4gdGhlc2UKKyAgICAgKiByZWdpc3RlcnMgd2lsbCBiZSBzZXQgdG8gMC4KKyAgICAgKi8KKyAgICBpZighKGh3LT5mYyAmIGUxMDAwX2ZjX3R4X3BhdXNlKSkgeworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEZDUlRMLCAwKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUSCwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogV2UgbmVlZCB0byBzZXQgdXAgdGhlIFJlY2VpdmUgVGhyZXNob2xkIGhpZ2ggYW5kIGxvdyB3YXRlciBtYXJrcworICAgICAgICAgKiBhcyB3ZWxsIGFzIChvcHRpb25hbGx5KSBlbmFibGluZyB0aGUgdHJhbnNtaXNzaW9uIG9mIFhPTiBmcmFtZXMuCisgICAgICAgICAqLworICAgICAgICBpZihody0+ZmNfc2VuZF94b24pIHsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRkNSVEwsIChody0+ZmNfbG93X3dhdGVyIHwgRTEwMDBfRkNSVExfWE9ORSkpOworICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUSCwgaHctPmZjX2hpZ2hfd2F0ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUTCwgaHctPmZjX2xvd193YXRlcik7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEZDUlRILCBody0+ZmNfaGlnaF93YXRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldHMgdXAgbGluayBmb3IgYSBmaWJlciBiYXNlZCBvciBzZXJkZXMgYmFzZWQgYWRhcHRlcgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogTWFuaXB1bGF0ZXMgUGh5c2ljYWwgQ29kaW5nIFN1YmxheWVyIGZ1bmN0aW9ucyBpbiBvcmRlciB0byBjb25maWd1cmUKKyAqIGxpbmsuIEFzc3VtZXMgdGhlIGhhcmR3YXJlIGhhcyBiZWVuIHByZXZpb3VzbHkgcmVzZXQgYW5kIHRoZSB0cmFuc21pdHRlcgorICogYW5kIHJlY2VpdmVyIGFyZSBub3QgZW5hYmxlZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9zZXR1cF9maWJlcl9zZXJkZXNfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmw7CisgICAgdWludDMyX3Qgc3RhdHVzOworICAgIHVpbnQzMl90IHR4Y3cgPSAwOworICAgIHVpbnQzMl90IGk7CisgICAgdWludDMyX3Qgc2lnbmFsID0gMDsKKyAgICBpbnQzMl90IHJldF92YWw7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3NldHVwX2ZpYmVyX3NlcmRlc19saW5rIik7CisKKyAgICAvKiBPbiBhZGFwdGVycyB3aXRoIGEgTUFDIG5ld2VyIHRoYW4gODI1NDQsIFNXIERlZmluZWFibGUgcGluIDEgd2lsbCBiZQorICAgICAqIHNldCB3aGVuIHRoZSBvcHRpY3MgZGV0ZWN0IGEgc2lnbmFsLiBPbiBvbGRlciBhZGFwdGVycywgaXQgd2lsbCBiZQorICAgICAqIGNsZWFyZWQgd2hlbiB0aGVyZSBpcyBhIHNpZ25hbC4gIFRoaXMgYXBwbGllcyB0byBmaWJlciBtZWRpYSBvbmx5LgorICAgICAqIElmIHdlJ3JlIG9uIHNlcmRlcyBtZWRpYSwgYWRqdXN0IHRoZSBvdXRwdXQgYW1wbGl0dWRlIHRvIHZhbHVlIHNldCBpbgorICAgICAqIHRoZSBFRVBST00uCisgICAgICovCisgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKyAgICBpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKQorICAgICAgICBzaWduYWwgPSAoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDQpID8gRTEwMDBfQ1RSTF9TV0RQSU4xIDogMDsKKworICAgIHJldF92YWwgPSBlMTAwMF9hZGp1c3Rfc2VyZGVzX2FtcGxpdHVkZShodyk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAvKiBUYWtlIHRoZSBsaW5rIG91dCBvZiByZXNldCAqLworICAgIGN0cmwgJj0gfihFMTAwMF9DVFJMX0xSU1QpOworCisgICAgLyogQWRqdXN0IFZDTyBzcGVlZCB0byBpbXByb3ZlIEJFUiBwZXJmb3JtYW5jZSAqLworICAgIHJldF92YWwgPSBlMTAwMF9zZXRfdmNvX3NwZWVkKGh3KTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIGUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7CisKKyAgICAvKiBDaGVjayBmb3IgYSBzb2Z0d2FyZSBvdmVycmlkZSBvZiB0aGUgZmxvdyBjb250cm9sIHNldHRpbmdzLCBhbmQgc2V0dXAKKyAgICAgKiB0aGUgZGV2aWNlIGFjY29yZGluZ2x5LiAgSWYgYXV0by1uZWdvdGlhdGlvbiBpcyBlbmFibGVkLCB0aGVuIHNvZnR3YXJlCisgICAgICogd2lsbCBoYXZlIHRvIHNldCB0aGUgIlBBVVNFIiBiaXRzIHRvIHRoZSBjb3JyZWN0IHZhbHVlIGluIHRoZSBUcmFubXNpdAorICAgICAqIENvbmZpZyBXb3JkIFJlZ2lzdGVyIChUWENXKSBhbmQgcmUtc3RhcnQgYXV0by1uZWdvdGlhdGlvbi4gIEhvd2V2ZXIsIGlmCisgICAgICogYXV0by1uZWdvdGlhdGlvbiBpcyBkaXNhYmxlZCwgdGhlbiBzb2Z0d2FyZSB3aWxsIGhhdmUgdG8gbWFudWFsbHkKKyAgICAgKiBjb25maWd1cmUgdGhlIHR3byBmbG93IGNvbnRyb2wgZW5hYmxlIGJpdHMgaW4gdGhlIENUUkwgcmVnaXN0ZXIuCisgICAgICoKKyAgICAgKiBUaGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSAiZmMiIHBhcmFtZXRlciBhcmU6CisgICAgICogICAgICAwOiAgRmxvdyBjb250cm9sIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQKKyAgICAgKiAgICAgIDE6ICBSeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHJlY2VpdmUgcGF1c2UgZnJhbWVzLCBidXQKKyAgICAgKiAgICAgICAgICBub3Qgc2VuZCBwYXVzZSBmcmFtZXMpLgorICAgICAqICAgICAgMjogIFR4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gc2VuZCBwYXVzZSBmcmFtZXMgYnV0IHdlIGRvCisgICAgICogICAgICAgICAgbm90IHN1cHBvcnQgcmVjZWl2aW5nIHBhdXNlIGZyYW1lcykuCisgICAgICogICAgICAzOiAgQm90aCBSeCBhbmQgVFggZmxvdyBjb250cm9sIChzeW1tZXRyaWMpIGFyZSBlbmFibGVkLgorICAgICAqLworICAgIHN3aXRjaCAoaHctPmZjKSB7CisgICAgY2FzZSBlMTAwMF9mY19ub25lOgorICAgICAgICAvKiBGbG93IGNvbnRyb2wgaXMgY29tcGxldGVseSBkaXNhYmxlZCBieSBhIHNvZnR3YXJlIG92ZXItcmlkZS4gKi8KKyAgICAgICAgdHhjdyA9IChFMTAwMF9UWENXX0FORSB8IEUxMDAwX1RYQ1dfRkQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwX2ZjX3J4X3BhdXNlOgorICAgICAgICAvKiBSWCBGbG93IGNvbnRyb2wgaXMgZW5hYmxlZCBhbmQgVFggRmxvdyBjb250cm9sIGlzIGRpc2FibGVkIGJ5IGEKKyAgICAgICAgICogc29mdHdhcmUgb3Zlci1yaWRlLiBTaW5jZSB0aGVyZSByZWFsbHkgaXNuJ3QgYSB3YXkgdG8gYWR2ZXJ0aXNlCisgICAgICAgICAqIHRoYXQgd2UgYXJlIGNhcGFibGUgb2YgUlggUGF1c2UgT05MWSwgd2Ugd2lsbCBhZHZlcnRpc2UgdGhhdCB3ZQorICAgICAgICAgKiBzdXBwb3J0IGJvdGggc3ltbWV0cmljIGFuZCBhc3ltbWV0cmljIFJYIFBBVVNFLiBMYXRlciwgd2Ugd2lsbAorICAgICAgICAgKiAgZGlzYWJsZSB0aGUgYWRhcHRlcidzIGFiaWxpdHkgdG8gc2VuZCBQQVVTRSBmcmFtZXMuCisgICAgICAgICAqLworICAgICAgICB0eGN3ID0gKEUxMDAwX1RYQ1dfQU5FIHwgRTEwMDBfVFhDV19GRCB8IEUxMDAwX1RYQ1dfUEFVU0VfTUFTSyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfZmNfdHhfcGF1c2U6CisgICAgICAgIC8qIFRYIEZsb3cgY29udHJvbCBpcyBlbmFibGVkLCBhbmQgUlggRmxvdyBjb250cm9sIGlzIGRpc2FibGVkLCBieSBhCisgICAgICAgICAqIHNvZnR3YXJlIG92ZXItcmlkZS4KKyAgICAgICAgICovCisgICAgICAgIHR4Y3cgPSAoRTEwMDBfVFhDV19BTkUgfCBFMTAwMF9UWENXX0ZEIHwgRTEwMDBfVFhDV19BU01fRElSKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF9mY19mdWxsOgorICAgICAgICAvKiBGbG93IGNvbnRyb2wgKGJvdGggUlggYW5kIFRYKSBpcyBlbmFibGVkIGJ5IGEgc29mdHdhcmUgb3Zlci1yaWRlLiAqLworICAgICAgICB0eGN3ID0gKEUxMDAwX1RYQ1dfQU5FIHwgRTEwMDBfVFhDV19GRCB8IEUxMDAwX1RYQ1dfUEFVU0VfTUFTSyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIERFQlVHT1VUKCJGbG93IGNvbnRyb2wgcGFyYW0gc2V0IGluY29ycmVjdGx5XG4iKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBTaW5jZSBhdXRvLW5lZ290aWF0aW9uIGlzIGVuYWJsZWQsIHRha2UgdGhlIGxpbmsgb3V0IG9mIHJlc2V0ICh0aGUgbGluaworICAgICAqIHdpbGwgYmUgaW4gcmVzZXQsIGJlY2F1c2Ugd2UgcHJldmlvdXNseSByZXNldCB0aGUgY2hpcCkuIFRoaXMgd2lsbAorICAgICAqIHJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbi4gIElmIGF1dG8tbmVvZ3RpYXRpb24gaXMgc3VjY2Vzc2Z1bCB0aGVuIHRoZQorICAgICAqIGxpbmstdXAgc3RhdHVzIGJpdCB3aWxsIGJlIHNldCBhbmQgdGhlIGZsb3cgY29udHJvbCBlbmFibGUgYml0cyAoUkZDRQorICAgICAqIGFuZCBURkNFKSB3aWxsIGJlIHNldCBhY2NvcmRpbmcgdG8gdGhlaXIgbmVnb3RpYXRlZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBERUJVR09VVCgiQXV0by1uZWdvdGlhdGlvbiBlbmFibGVkXG4iKTsKKworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVFhDVywgdHhjdyk7CisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKyAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisKKyAgICBody0+dHhjdyA9IHR4Y3c7CisgICAgbXNlY19kZWxheSgxKTsKKworICAgIC8qIElmIHdlIGhhdmUgYSBzaWduYWwgKHRoZSBjYWJsZSBpcyBwbHVnZ2VkIGluKSB0aGVuIHBvbGwgZm9yIGEgIkxpbmstVXAiCisgICAgICogaW5kaWNhdGlvbiBpbiB0aGUgRGV2aWNlIFN0YXR1cyBSZWdpc3Rlci4gIFRpbWUtb3V0IGlmIGEgbGluayBpc24ndAorICAgICAqIHNlZW4gaW4gNTAwIG1pbGxpc2Vjb25kcyBzZWNvbmRzIChBdXRvLW5lZ290aWF0aW9uIHNob3VsZCBjb21wbGV0ZSBpbgorICAgICAqIGxlc3MgdGhhbiA1MDAgbWlsbGlzZWNvbmRzIGV2ZW4gaWYgdGhlIG90aGVyIGVuZCBpcyBkb2luZyBpdCBpbiBTVykuCisgICAgICogRm9yIGludGVybmFsIHNlcmRlcywgd2UganVzdCBhc3N1bWUgYSBzaWduYWwgaXMgcHJlc2VudCwgdGhlbiBwb2xsLgorICAgICAqLworICAgIGlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzIHx8CisgICAgICAgKEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKSAmIEUxMDAwX0NUUkxfU1dEUElOMSkgPT0gc2lnbmFsKSB7CisgICAgICAgIERFQlVHT1VUKCJMb29raW5nIGZvciBMaW5rXG4iKTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgKExJTktfVVBfVElNRU9VVCAvIDEwKTsgaSsrKSB7CisgICAgICAgICAgICBtc2VjX2RlbGF5KDEwKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworICAgICAgICAgICAgaWYoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0xVKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZihpID09IChMSU5LX1VQX1RJTUVPVVQgLyAxMCkpIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJOZXZlciBnb3QgYSB2YWxpZCBsaW5rIGZyb20gYXV0by1uZWchISFcbiIpOworICAgICAgICAgICAgaHctPmF1dG9uZWdfZmFpbGVkID0gMTsKKyAgICAgICAgICAgIC8qIEF1dG9OZWcgZmFpbGVkIHRvIGFjaGlldmUgYSBsaW5rLCBzbyB3ZSdsbCBjYWxsCisgICAgICAgICAgICAgKiBlMTAwMF9jaGVja19mb3JfbGluay4gVGhpcyByb3V0aW5lIHdpbGwgZm9yY2UgdGhlIGxpbmsgdXAgaWYKKyAgICAgICAgICAgICAqIHdlIGRldGVjdCBhIHNpZ25hbC4gVGhpcyB3aWxsIGFsbG93IHVzIHRvIGNvbW11bmljYXRlIHdpdGgKKyAgICAgICAgICAgICAqIG5vbi1hdXRvbmVnb3RpYXRpbmcgbGluayBwYXJ0bmVycy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NoZWNrX2Zvcl9saW5rKGh3KTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3Igd2hpbGUgY2hlY2tpbmcgZm9yIGxpbmtcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHctPmF1dG9uZWdfZmFpbGVkID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGh3LT5hdXRvbmVnX2ZhaWxlZCA9IDA7CisgICAgICAgICAgICBERUJVR09VVCgiVmFsaWQgTGluayBGb3VuZFxuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBERUJVR09VVCgiTm8gU2lnbmFsIERldGVjdGVkXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGV0ZWN0cyB3aGljaCBQSFkgaXMgcHJlc2VudCBhbmQgdGhlIHNwZWVkIGFuZCBkdXBsZXgKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9zZXR1cF9jb3BwZXJfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmw7CisgICAgdWludDMyX3QgbGVkX2N0cmw7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IGk7CisgICAgdWludDE2X3QgcGh5X2RhdGE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3NldHVwX2NvcHBlcl9saW5rIik7CisKKyAgICBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworICAgIC8qIFdpdGggODI1NDMsIHdlIG5lZWQgdG8gZm9yY2Ugc3BlZWQgYW5kIGR1cGxleCBvbiB0aGUgTUFDIGVxdWFsIHRvIHdoYXQKKyAgICAgKiB0aGUgUEhZIHNwZWVkIGFuZCBkdXBsZXggY29uZmlndXJhdGlvbiBpcy4gSW4gYWRkaXRpb24sIHdlIG5lZWQgdG8KKyAgICAgKiBwZXJmb3JtIGEgaGFyZHdhcmUgcmVzZXQgb24gdGhlIFBIWSB0byB0YWtlIGl0IG91dCBvZiByZXNldC4KKyAgICAgKi8KKyAgICBpZihody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0MykgeworICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU0xVOworICAgICAgICBjdHJsICY9IH4oRTEwMDBfQ1RSTF9GUkNTUEQgfCBFMTAwMF9DVFJMX0ZSQ0RQWCk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3RybCB8PSAoRTEwMDBfQ1RSTF9GUkNTUEQgfCBFMTAwMF9DVFJMX0ZSQ0RQWCB8IEUxMDAwX0NUUkxfU0xVKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKyAgICAgICAgZTEwMDBfcGh5X2h3X3Jlc2V0KGh3KTsKKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIFBIWSAqLworICAgIHJldF92YWwgPSBlMTAwMF9kZXRlY3RfZ2lnX3BoeShodyk7CisgICAgaWYocmV0X3ZhbCkgeworICAgICAgICBERUJVR09VVCgiRXJyb3IsIGRpZCBub3QgZGV0ZWN0IHZhbGlkIHBoeS5cbiIpOworICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisgICAgREVCVUdPVVQxKCJQaHkgSUQgPSAleCBcbiIsIGh3LT5waHlfaWQpOworCisgICAgLyogU2V0IFBIWSB0byBjbGFzcyBBIG1vZGUgKGlmIG5lY2Vzc2FyeSkgKi8KKyAgICByZXRfdmFsID0gZTEwMDBfc2V0X3BoeV9tb2RlKGh3KTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIGlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDVfcmV2XzMpIHx8CisgICAgICAgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Nl9yZXZfMykpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICAgICAgcGh5X2RhdGEgfD0gMHgwMDAwMDAwODsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsIHBoeV9kYXRhKTsKKyAgICB9CisKKyAgICBpZihody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDMgfHwKKyAgICAgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3IHx8CisgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxX3Jldl8yIHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikKKyAgICAgICAgaHctPnBoeV9yZXNldF9kaXNhYmxlID0gRkFMU0U7CisKKyAgICBpZighaHctPnBoeV9yZXNldF9kaXNhYmxlKSB7CisgICAgICAgIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcGh5X3Jlc2V0KGh3KTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgUmVzZXR0aW5nIHRoZSBQSFlcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBXYWl0IDEwbXMgZm9yIE1BQyB0byBjb25maWd1cmUgUEhZIGZyb20gZWVwcm9tIHNldHRpbmdzICovCisgICAgICAgICAgICBtc2VjX2RlbGF5KDE1KTsKKworICAgICAgICAgICAgLyogQ29uZmlndXJlIGFjdGl2aXR5IExFRCBhZnRlciBQSFkgcmVzZXQgKi8KKyAgICAgICAgICAgIGxlZF9jdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIExFRENUTCk7CisgICAgICAgICAgICBsZWRfY3RybCAmPSBJR1BfQUNUSVZJVFlfTEVEX01BU0s7CisgICAgICAgICAgICBsZWRfY3RybCB8PSAoSUdQX0FDVElWSVRZX0xFRF9FTkFCTEUgfCBJR1BfTEVEM19NT0RFKTsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTEVEQ1RMLCBsZWRfY3RybCk7CisKKyAgICAgICAgICAgIC8qIGRpc2FibGUgbHBsdSBkMyBkdXJpbmcgZHJpdmVyIGluaXQgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9zZXRfZDNfbHBsdV9zdGF0ZShodywgRkFMU0UpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBEaXNhYmxpbmcgTFBMVSBEM1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENvbmZpZ3VyZSBtZGktbWRpeCBzZXR0aW5ncyAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DVFJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgaWYoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSkgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpIHsKKyAgICAgICAgICAgICAgICBody0+ZHNwX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2RzcF9jb25maWdfZGlzYWJsZWQ7CisgICAgICAgICAgICAgICAgLyogRm9yY2UgTURJIGZvciBlYXJsaWVyIHJldnMgb2YgdGhlIElHUCBQSFkgKi8KKyAgICAgICAgICAgICAgICBwaHlfZGF0YSAmPSB+KElHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVggfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QU0NSX0ZPUkNFX01ESV9NRElYKTsKKyAgICAgICAgICAgICAgICBody0+bWRpeCA9IDE7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaHctPmRzcF9jb25maWdfc3RhdGUgPSBlMTAwMF9kc3BfY29uZmlnX2VuYWJsZWQ7CisgICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVg7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGh3LT5tZGl4KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QU0NSX0ZPUkNFX01ESV9NRElYOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhIHw9IElHUDAxRTEwMDBfUFNDUl9GT1JDRV9NRElfTURJWDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhIHw9IElHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NUUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICAvKiBzZXQgYXV0by1tYXN0ZXIgc2xhdmUgcmVzb2x1dGlvbiBzZXR0aW5ncyAqLworICAgICAgICAgICAgaWYoaHctPmF1dG9uZWcpIHsKKyAgICAgICAgICAgICAgICBlMTAwMF9tc190eXBlIHBoeV9tc19zZXR0aW5nID0gaHctPm1hc3Rlcl9zbGF2ZTsKKworICAgICAgICAgICAgICAgIGlmKGh3LT5mZmVfY29uZmlnX3N0YXRlID09IGUxMDAwX2ZmZV9jb25maWdfYWN0aXZlKQorICAgICAgICAgICAgICAgICAgICBody0+ZmZlX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2ZmZV9jb25maWdfZW5hYmxlZDsKKworICAgICAgICAgICAgICAgIGlmKGh3LT5kc3BfY29uZmlnX3N0YXRlID09IGUxMDAwX2RzcF9jb25maWdfYWN0aXZhdGVkKQorICAgICAgICAgICAgICAgICAgICBody0+ZHNwX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2RzcF9jb25maWdfZW5hYmxlZDsKKworICAgICAgICAgICAgICAgIC8qIHdoZW4gYXV0b25lZ290aWF0aW9uIGFkdmVydGlzbWVudCBpcyBvbmx5IDEwMDBNYnBzIHRoZW4gd2UKKyAgICAgICAgICAgICAgICAgKiBzaG91bGQgZGlzYWJsZSBTbWFydFNwZWVkIGFuZCBlbmFibGUgQXV0byBNYXN0ZXJTbGF2ZQorICAgICAgICAgICAgICAgICAqIHJlc29sdXRpb24gYXMgaGFyZHdhcmUgZGVmYXVsdC4gKi8KKyAgICAgICAgICAgICAgICBpZihody0+YXV0b25lZ19hZHZlcnRpc2VkID09IEFEVkVSVElTRV8xMDAwX0ZVTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBTbWFydFNwZWVkICovCisgICAgICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7CisgICAgICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOworICAgICAgICAgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICAgICAgICAgIC8qIFNldCBhdXRvIE1hc3Rlci9TbGF2ZSByZXNvbHV0aW9uIHByb2Nlc3MgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsICZwaHlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfkNSXzEwMDBUX01TX0VOQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCBwaHlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICAgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgICAgIC8qIGxvYWQgZGVmYXVsdHMgZm9yIGZ1dHVyZSB1c2UgKi8KKyAgICAgICAgICAgICAgICBody0+b3JpZ2luYWxfbWFzdGVyX3NsYXZlID0gKHBoeV9kYXRhICYgQ1JfMTAwMFRfTVNfRU5BQkxFKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGh5X2RhdGEgJiBDUl8xMDAwVF9NU19WQUxVRSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfbXNfZm9yY2VfbWFzdGVyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX21zX2ZvcmNlX3NsYXZlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9tc19hdXRvOworCisgICAgICAgICAgICAgICAgc3dpdGNoIChwaHlfbXNfc2V0dGluZykgeworICAgICAgICAgICAgICAgIGNhc2UgZTEwMDBfbXNfZm9yY2VfbWFzdGVyOgorICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSB8PSAoQ1JfMTAwMFRfTVNfRU5BQkxFIHwgQ1JfMTAwMFRfTVNfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGUxMDAwX21zX2ZvcmNlX3NsYXZlOgorICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSB8PSBDUl8xMDAwVF9NU19FTkFCTEU7CisgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhICY9IH4oQ1JfMTAwMFRfTVNfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGUxMDAwX21zX2F1dG86CisgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhICY9IH5DUl8xMDAwVF9NU19FTkFCTEU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgcGh5X2RhdGEpOworICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRW5hYmxlIENSUyBvbiBUWC4gVGhpcyBtdXN0IGJlIHNldCBmb3IgaGFsZi1kdXBsZXggb3BlcmF0aW9uLiAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfQVNTRVJUX0NSU19PTl9UWDsKKworICAgICAgICAgICAgLyogT3B0aW9uczoKKyAgICAgICAgICAgICAqICAgTURJL01ESS1YID0gMCAoZGVmYXVsdCkKKyAgICAgICAgICAgICAqICAgMCAtIEF1dG8gZm9yIGFsbCBzcGVlZHMKKyAgICAgICAgICAgICAqICAgMSAtIE1ESSBtb2RlCisgICAgICAgICAgICAgKiAgIDIgLSBNREktWCBtb2RlCisgICAgICAgICAgICAgKiAgIDMgLSBBdXRvIGZvciAxMDAwQmFzZS1UIG9ubHkgKE1ESS1YIGZvciAxMC8xMDBCYXNlLVQgbW9kZXMpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBoeV9kYXRhICY9IH5NODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFOworCisgICAgICAgICAgICBzd2l0Y2ggKGh3LT5tZGl4KSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9NRElfTUFOVUFMX01PREU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9NRElYX01BTlVBTF9NT0RFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfQVVUT19YXzEwMDBUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBPcHRpb25zOgorICAgICAgICAgICAgICogICBkaXNhYmxlX3BvbGFyaXR5X2NvcnJlY3Rpb24gPSAwIChkZWZhdWx0KQorICAgICAgICAgICAgICogICAgICAgQXV0b21hdGljIENvcnJlY3Rpb24gZm9yIFJldmVyc2VkIENhYmxlIFBvbGFyaXR5CisgICAgICAgICAgICAgKiAgIDAgLSBEaXNhYmxlZAorICAgICAgICAgICAgICogICAxIC0gRW5hYmxlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwaHlfZGF0YSAmPSB+TTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTDsKKyAgICAgICAgICAgIGlmKGh3LT5kaXNhYmxlX3BvbGFyaXR5X2NvcnJlY3Rpb24gPT0gMSkKKyAgICAgICAgICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX1BPTEFSSVRZX1JFVkVSU0FMOworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICAvKiBGb3JjZSBUWF9DTEsgaW4gdGhlIEV4dGVuZGVkIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyCisgICAgICAgICAgICAgKiB0byAyNU1IeiBjbG9jay4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9FUFNDUl9UWF9DTEtfMjU7CisKKyAgICAgICAgICAgIGlmIChody0+cGh5X3JldmlzaW9uIDwgTTg4RTEwMTFfSV9SRVZfNCkgeworICAgICAgICAgICAgICAgIC8qIENvbmZpZ3VyZSBNYXN0ZXIgYW5kIFNsYXZlIGRvd25zaGlmdCB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICBwaHlfZGF0YSAmPSB+KE04OEUxMDAwX0VQU0NSX01BU1RFUl9ET1dOU0hJRlRfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfTUFTSyk7CisgICAgICAgICAgICAgICAgcGh5X2RhdGEgfD0gKE04OEUxMDAwX0VQU0NSX01BU1RFUl9ET1dOU0hJRlRfMVggfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfMVgpOworICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNXIFJlc2V0IHRoZSBQSFkgc28gYWxsIGNoYW5nZXMgdGFrZSBlZmZlY3QgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9waHlfcmVzZXQoaHcpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBSZXNldHRpbmcgdGhlIFBIWVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBPcHRpb25zOgorICAgICAgICAgKiAgIGF1dG9uZWcgPSAxIChkZWZhdWx0KQorICAgICAgICAgKiAgICAgIFBIWSB3aWxsIGFkdmVydGlzZSB2YWx1ZShzKSBwYXJzZWQgZnJvbQorICAgICAgICAgKiAgICAgIGF1dG9uZWdfYWR2ZXJ0aXNlZCBhbmQgZmMKKyAgICAgICAgICogICBhdXRvbmVnID0gMAorICAgICAgICAgKiAgICAgIFBIWSB3aWxsIGJlIHNldCB0byAxMEgsIDEwRiwgMTAwSCwgb3IgMTAwRgorICAgICAgICAgKiAgICAgIGRlcGVuZGluZyBvbiB2YWx1ZSBwYXJzZWQgZnJvbSBmb3JjZWRfc3BlZWRfZHVwbGV4LgorICAgICAgICAgKi8KKworICAgICAgICAvKiBJcyBhdXRvbmVnIGVuYWJsZWQ/ICBUaGlzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBvciBieSBzb2Z0d2FyZQorICAgICAgICAgKiBvdmVycmlkZS4gIElmIHNvLCBjYWxsIGUxMDAwX3BoeV9zZXR1cF9hdXRvbmVnIHJvdXRpbmUgdG8gcGFyc2UgdGhlCisgICAgICAgICAqIGF1dG9uZWdfYWR2ZXJ0aXNlZCBhbmQgZmMgb3B0aW9ucy4gSWYgYXV0b25lZyBpcyBOT1QgZW5hYmxlZCwgdGhlbgorICAgICAgICAgKiB0aGUgdXNlciBzaG91bGQgaGF2ZSBwcm92aWRlZCBhIHNwZWVkL2R1cGxleCBvdmVycmlkZS4gIElmIHNvLCB0aGVuCisgICAgICAgICAqIGNhbGwgZTEwMDBfcGh5X2ZvcmNlX3NwZWVkX2R1cGxleCB0byBwYXJzZSBhbmQgc2V0IHRoaXMgdXAuCisgICAgICAgICAqLworICAgICAgICBpZihody0+YXV0b25lZykgeworICAgICAgICAgICAgLyogUGVyZm9ybSBzb21lIGJvdW5kcyBjaGVja2luZyBvbiB0aGUgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZAorICAgICAgICAgICAgICogcGFyYW1ldGVyLiAgSWYgdGhpcyB2YXJpYWJsZSBpcyB6ZXJvLCB0aGVuIHNldCBpdCB0byB0aGUgZGVmYXVsdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmPSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUOworCisgICAgICAgICAgICAvKiBJZiBhdXRvbmVnX2FkdmVydGlzZWQgaXMgemVybywgd2UgYXNzdW1lIGl0IHdhcyBub3QgZGVmYXVsdGVkCisgICAgICAgICAgICAgKiBieSB0aGUgY2FsbGluZyBjb2RlIHNvIHdlIHNldCB0byBhZHZlcnRpc2UgZnVsbCBjYXBhYmlsaXR5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZihody0+YXV0b25lZ19hZHZlcnRpc2VkID09IDApCisgICAgICAgICAgICAgICAgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFVVE9ORUdfQURWRVJUSVNFX1NQRUVEX0RFRkFVTFQ7CisKKyAgICAgICAgICAgIERFQlVHT1VUKCJSZWNvbmZpZ3VyaW5nIGF1dG8tbmVnIGFkdmVydGlzZW1lbnQgcGFyYW1zXG4iKTsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9waHlfc2V0dXBfYXV0b25lZyhodyk7CisgICAgICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIFNldHRpbmcgdXAgQXV0by1OZWdvdGlhdGlvblxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBERUJVR09VVCgiUmVzdGFydGluZyBBdXRvLU5lZ1xuIik7CisKKyAgICAgICAgICAgIC8qIFJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbiBieSBzZXR0aW5nIHRoZSBBdXRvIE5lZyBFbmFibGUgYml0IGFuZAorICAgICAgICAgICAgICogdGhlIEF1dG8gTmVnIFJlc3RhcnQgYml0IGluIHRoZSBQSFkgY29udHJvbCByZWdpc3Rlci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0NUUkwsICZwaHlfZGF0YSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBwaHlfZGF0YSB8PSAoTUlJX0NSX0FVVE9fTkVHX0VOIHwgTUlJX0NSX1JFU1RBUlRfQVVUT19ORUcpOworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCBwaHlfZGF0YSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICAvKiBEb2VzIHRoZSB1c2VyIHdhbnQgdG8gd2FpdCBmb3IgQXV0by1OZWcgdG8gY29tcGxldGUgaGVyZSwgb3IKKyAgICAgICAgICAgICAqIGNoZWNrIGF0IGEgbGF0ZXIgdGltZSAoZm9yIGV4YW1wbGUsIGNhbGxiYWNrIHJvdXRpbmUpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZihody0+d2FpdF9hdXRvbmVnX2NvbXBsZXRlKSB7CisgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dhaXRfYXV0b25lZyhodyk7CisgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3Igd2hpbGUgd2FpdGluZyBmb3IgYXV0b25lZyB0byBjb21wbGV0ZVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGh3LT5nZXRfbGlua19zdGF0dXMgPSBUUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgREVCVUdPVVQoIkZvcmNpbmcgc3BlZWQgYW5kIGR1cGxleFxuIik7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcGh5X2ZvcmNlX3NwZWVkX2R1cGxleChodyk7CisgICAgICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIEZvcmNpbmcgU3BlZWQgYW5kIER1cGxleFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8qICFody0+cGh5X3Jlc2V0X2Rpc2FibGUgKi8KKworICAgIC8qIENoZWNrIGxpbmsgc3RhdHVzLiBXYWl0IHVwIHRvIDEwMCBtaWNyb3NlY29uZHMgZm9yIGxpbmsgdG8gYmVjb21lCisgICAgICogdmFsaWQuCisgICAgICovCisgICAgZm9yKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICBpZihwaHlfZGF0YSAmIE1JSV9TUl9MSU5LX1NUQVRVUykgeworICAgICAgICAgICAgLyogV2UgaGF2ZSBsaW5rLCBzbyB3ZSBuZWVkIHRvIGZpbmlzaCB0aGUgY29uZmlnIHByb2Nlc3M6CisgICAgICAgICAgICAgKiAgIDEpIFNldCB1cCB0aGUgTUFDIHRvIHRoZSBjdXJyZW50IFBIWSBzcGVlZC9kdXBsZXgKKyAgICAgICAgICAgICAqICAgICAgaWYgd2UgYXJlIG9uIDgyNTQzLiAgSWYgd2UKKyAgICAgICAgICAgICAqICAgICAgYXJlIG9uIG5ld2VyIHNpbGljb24sIHdlIG9ubHkgbmVlZCB0byBjb25maWd1cmUKKyAgICAgICAgICAgICAqICAgICAgY29sbGlzaW9uIGRpc3RhbmNlIGluIHRoZSBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyLgorICAgICAgICAgICAgICogICAyKSBTZXQgdXAgZmxvdyBjb250cm9sIG9uIHRoZSBNQUMgdG8gdGhhdCBlc3RhYmxpc2hlZCB3aXRoCisgICAgICAgICAgICAgKiAgICAgIHRoZSBsaW5rIHBhcnRuZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCkgeworICAgICAgICAgICAgICAgIGUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb25maWdfbWFjX3RvX3BoeShodyk7CisgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgY29uZmlndXJpbmcgTUFDIHRvIFBIWSBzZXR0aW5nc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cChodyk7CisgICAgICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIENvbmZpZ3VyaW5nIEZsb3cgQ29udHJvbFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBERUJVR09VVCgiVmFsaWQgbGluayBlc3RhYmxpc2hlZCEhIVxuIik7CisKKyAgICAgICAgICAgIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CisgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2UoaHcsIFRSVUUpOworICAgICAgICAgICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIENvbmZpZ3VyaW5nIERTUCBhZnRlciBsaW5rIHVwXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgREVCVUdPVVQoIlZhbGlkIGxpbmsgZXN0YWJsaXNoZWQhISFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgdWRlbGF5KDEwKTsKKyAgICB9CisKKyAgICBERUJVR09VVCgiVW5hYmxlIHRvIGVzdGFibGlzaCBsaW5rISEhXG4iKTsKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb25maWd1cmVzIFBIWSBhdXRvbmVnIGFuZCBmbG93IGNvbnRyb2wgYWR2ZXJ0aXNlbWVudCBzZXR0aW5ncworKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfcGh5X3NldHVwX2F1dG9uZWcoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgbWlpX2F1dG9uZWdfYWR2X3JlZzsKKyAgICB1aW50MTZfdCBtaWlfMTAwMHRfY3RybF9yZWc7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3BoeV9zZXR1cF9hdXRvbmVnIik7CisKKyAgICAvKiBSZWFkIHRoZSBNSUkgQXV0by1OZWcgQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAoQWRkcmVzcyA0KS4gKi8KKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfQVVUT05FR19BRFYsICZtaWlfYXV0b25lZ19hZHZfcmVnKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIC8qIFJlYWQgdGhlIE1JSSAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIgKEFkZHJlc3MgOSkuICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsICZtaWlfMTAwMHRfY3RybF9yZWcpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgLyogTmVlZCB0byBwYXJzZSBib3RoIGF1dG9uZWdfYWR2ZXJ0aXNlZCBhbmQgZmMgYW5kIHNldCB1cAorICAgICAqIHRoZSBhcHByb3ByaWF0ZSBQSFkgcmVnaXN0ZXJzLiAgRmlyc3Qgd2Ugd2lsbCBwYXJzZSBmb3IKKyAgICAgKiBhdXRvbmVnX2FkdmVydGlzZWQgc29mdHdhcmUgb3ZlcnJpZGUuICBTaW5jZSB3ZSBjYW4gYWR2ZXJ0aXNlCisgICAgICogYSBwbGV0aG9yYSBvZiBjb21iaW5hdGlvbnMsIHdlIG5lZWQgdG8gY2hlY2sgZWFjaCBiaXQKKyAgICAgKiBpbmRpdmlkdWFsbHkuCisgICAgICovCisKKyAgICAvKiBGaXJzdCB3ZSBjbGVhciBhbGwgdGhlIDEwLzEwMCBtYiBzcGVlZCBiaXRzIGluIHRoZSBBdXRvLU5lZworICAgICAqIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKEFkZHJlc3MgNCkgYW5kIHRoZSAxMDAwIG1iIHNwZWVkIGJpdHMgaW4KKyAgICAgKiB0aGUgIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAoQWRkcmVzcyA5KS4KKyAgICAgKi8KKyAgICBtaWlfYXV0b25lZ19hZHZfcmVnICY9IH5SRUc0X1NQRUVEX01BU0s7CisgICAgbWlpXzEwMDB0X2N0cmxfcmVnICY9IH5SRUc5X1NQRUVEX01BU0s7CisKKyAgICBERUJVR09VVDEoImF1dG9uZWdfYWR2ZXJ0aXNlZCAleFxuIiwgaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCk7CisKKyAgICAvKiBEbyB3ZSB3YW50IHRvIGFkdmVydGlzZSAxMCBNYiBIYWxmIER1cGxleD8gKi8KKyAgICBpZihody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwX0hBTEYpIHsKKyAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMG1iIEhhbGYgZHVwbGV4XG4iKTsKKyAgICAgICAgbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSBOV0FZX0FSXzEwVF9IRF9DQVBTOworICAgIH0KKworICAgIC8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwIE1iIEZ1bGwgRHVwbGV4PyAqLworICAgIGlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTBfRlVMTCkgeworICAgICAgICBERUJVR09VVCgiQWR2ZXJ0aXNlIDEwbWIgRnVsbCBkdXBsZXhcbiIpOworICAgICAgICBtaWlfYXV0b25lZ19hZHZfcmVnIHw9IE5XQVlfQVJfMTBUX0ZEX0NBUFM7CisgICAgfQorCisgICAgLyogRG8gd2Ugd2FudCB0byBhZHZlcnRpc2UgMTAwIE1iIEhhbGYgRHVwbGV4PyAqLworICAgIGlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwX0hBTEYpIHsKKyAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMDBtYiBIYWxmIGR1cGxleFxuIik7CisgICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl8xMDBUWF9IRF9DQVBTOworICAgIH0KKworICAgIC8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwMCBNYiBGdWxsIER1cGxleD8gKi8KKyAgICBpZihody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwMF9GVUxMKSB7CisgICAgICAgIERFQlVHT1VUKCJBZHZlcnRpc2UgMTAwbWIgRnVsbCBkdXBsZXhcbiIpOworICAgICAgICBtaWlfYXV0b25lZ19hZHZfcmVnIHw9IE5XQVlfQVJfMTAwVFhfRkRfQ0FQUzsKKyAgICB9CisKKyAgICAvKiBXZSBkbyBub3QgYWxsb3cgdGhlIFBoeSB0byBhZHZlcnRpc2UgMTAwMCBNYiBIYWxmIER1cGxleCAqLworICAgIGlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwMF9IQUxGKSB7CisgICAgICAgIERFQlVHT1VUKCJBZHZlcnRpc2UgMTAwMG1iIEhhbGYgZHVwbGV4IHJlcXVlc3RlZCwgcmVxdWVzdCBkZW5pZWQhXG4iKTsKKyAgICB9CisKKyAgICAvKiBEbyB3ZSB3YW50IHRvIGFkdmVydGlzZSAxMDAwIE1iIEZ1bGwgRHVwbGV4PyAqLworICAgIGlmKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJiBBRFZFUlRJU0VfMTAwMF9GVUxMKSB7CisgICAgICAgIERFQlVHT1VUKCJBZHZlcnRpc2UgMTAwMG1iIEZ1bGwgZHVwbGV4XG4iKTsKKyAgICAgICAgbWlpXzEwMDB0X2N0cmxfcmVnIHw9IENSXzEwMDBUX0ZEX0NBUFM7CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIGEgc29mdHdhcmUgb3ZlcnJpZGUgb2YgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncywgYW5kCisgICAgICogc2V0dXAgdGhlIFBIWSBhZHZlcnRpc2VtZW50IHJlZ2lzdGVycyBhY2NvcmRpbmdseS4gIElmCisgICAgICogYXV0by1uZWdvdGlhdGlvbiBpcyBlbmFibGVkLCB0aGVuIHNvZnR3YXJlIHdpbGwgaGF2ZSB0byBzZXQgdGhlCisgICAgICogIlBBVVNFIiBiaXRzIHRvIHRoZSBjb3JyZWN0IHZhbHVlIGluIHRoZSBBdXRvLU5lZ290aWF0aW9uCisgICAgICogQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAoUEhZX0FVVE9ORUdfQURWKSBhbmQgcmUtc3RhcnQgYXV0by1uZWdvdGlhdGlvbi4KKyAgICAgKgorICAgICAqIFRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlICJmYyIgcGFyYW1ldGVyIGFyZToKKyAgICAgKiAgICAgIDA6ICBGbG93IGNvbnRyb2wgaXMgY29tcGxldGVseSBkaXNhYmxlZAorICAgICAqICAgICAgMTogIFJ4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gcmVjZWl2ZSBwYXVzZSBmcmFtZXMKKyAgICAgKiAgICAgICAgICBidXQgbm90IHNlbmQgcGF1c2UgZnJhbWVzKS4KKyAgICAgKiAgICAgIDI6ICBUeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHNlbmQgcGF1c2UgZnJhbWVzCisgICAgICogICAgICAgICAgYnV0IHdlIGRvIG5vdCBzdXBwb3J0IHJlY2VpdmluZyBwYXVzZSBmcmFtZXMpLgorICAgICAqICAgICAgMzogIEJvdGggUnggYW5kIFRYIGZsb3cgY29udHJvbCAoc3ltbWV0cmljKSBhcmUgZW5hYmxlZC4KKyAgICAgKiAgb3RoZXI6ICBObyBzb2Z0d2FyZSBvdmVycmlkZS4gIFRoZSBmbG93IGNvbnRyb2wgY29uZmlndXJhdGlvbgorICAgICAqICAgICAgICAgIGluIHRoZSBFRVBST00gaXMgdXNlZC4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKGh3LT5mYykgeworICAgIGNhc2UgZTEwMDBfZmNfbm9uZTogLyogMCAqLworICAgICAgICAvKiBGbG93IGNvbnRyb2wgKFJYICYgVFgpIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQgYnkgYQorICAgICAgICAgKiBzb2Z0d2FyZSBvdmVyLXJpZGUuCisgICAgICAgICAqLworICAgICAgICBtaWlfYXV0b25lZ19hZHZfcmVnICY9IH4oTldBWV9BUl9BU01fRElSIHwgTldBWV9BUl9QQVVTRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfZmNfcnhfcGF1c2U6IC8qIDEgKi8KKyAgICAgICAgLyogUlggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQsIGFuZCBUWCBGbG93IGNvbnRyb2wgaXMKKyAgICAgICAgICogZGlzYWJsZWQsIGJ5IGEgc29mdHdhcmUgb3Zlci1yaWRlLgorICAgICAgICAgKi8KKyAgICAgICAgLyogU2luY2UgdGhlcmUgcmVhbGx5IGlzbid0IGEgd2F5IHRvIGFkdmVydGlzZSB0aGF0IHdlIGFyZQorICAgICAgICAgKiBjYXBhYmxlIG9mIFJYIFBhdXNlIE9OTFksIHdlIHdpbGwgYWR2ZXJ0aXNlIHRoYXQgd2UKKyAgICAgICAgICogc3VwcG9ydCBib3RoIHN5bW1ldHJpYyBhbmQgYXN5bW1ldHJpYyBSWCBQQVVTRS4gIExhdGVyCisgICAgICAgICAqIChpbiBlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cCkgd2Ugd2lsbCBkaXNhYmxlIHRoZQorICAgICAgICAgKmh3J3MgYWJpbGl0eSB0byBzZW5kIFBBVVNFIGZyYW1lcy4KKyAgICAgICAgICovCisgICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE5XQVlfQVJfQVNNX0RJUiB8IE5XQVlfQVJfUEFVU0UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwX2ZjX3R4X3BhdXNlOiAvKiAyICovCisgICAgICAgIC8qIFRYIEZsb3cgY29udHJvbCBpcyBlbmFibGVkLCBhbmQgUlggRmxvdyBjb250cm9sIGlzCisgICAgICAgICAqIGRpc2FibGVkLCBieSBhIHNvZnR3YXJlIG92ZXItcmlkZS4KKyAgICAgICAgICovCisgICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl9BU01fRElSOworICAgICAgICBtaWlfYXV0b25lZ19hZHZfcmVnICY9IH5OV0FZX0FSX1BBVVNFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwX2ZjX2Z1bGw6IC8qIDMgKi8KKyAgICAgICAgLyogRmxvdyBjb250cm9sIChib3RoIFJYIGFuZCBUWCkgaXMgZW5hYmxlZCBieSBhIHNvZnR3YXJlCisgICAgICAgICAqIG92ZXItcmlkZS4KKyAgICAgICAgICovCisgICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gKE5XQVlfQVJfQVNNX0RJUiB8IE5XQVlfQVJfUEFVU0UpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBERUJVR09VVCgiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKyAgICB9CisKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfQURWLCBtaWlfYXV0b25lZ19hZHZfcmVnKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIERFQlVHT1VUMSgiQXV0by1OZWcgQWR2ZXJ0aXNpbmcgJXhcbiIsIG1paV9hdXRvbmVnX2Fkdl9yZWcpOworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCBtaWlfMTAwMHRfY3RybF9yZWcpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRm9yY2UgUEhZIHNwZWVkIGFuZCBkdXBsZXggc2V0dGluZ3MgdG8gaHctPmZvcmNlZF9zcGVlZF9kdXBsZXgKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9waHlfZm9yY2Vfc3BlZWRfZHVwbGV4KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgY3RybDsKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgbWlpX2N0cmxfcmVnOworICAgIHVpbnQxNl90IG1paV9zdGF0dXNfcmVnOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworICAgIHVpbnQxNl90IGk7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3BoeV9mb3JjZV9zcGVlZF9kdXBsZXgiKTsKKworICAgIC8qIFR1cm4gb2ZmIEZsb3cgY29udHJvbCBpZiB3ZSBhcmUgZm9yY2luZyBzcGVlZCBhbmQgZHVwbGV4LiAqLworICAgIGh3LT5mYyA9IGUxMDAwX2ZjX25vbmU7CisKKyAgICBERUJVR09VVDEoImh3LT5mYyA9ICVkXG4iLCBody0+ZmMpOworCisgICAgLyogUmVhZCB0aGUgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIuICovCisgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKworICAgIC8qIFNldCB0aGUgYml0cyB0byBGb3JjZSBTcGVlZCBhbmQgRHVwbGV4IGluIHRoZSBEZXZpY2UgQ3RybCBSZWcuICovCisgICAgY3RybCB8PSAoRTEwMDBfQ1RSTF9GUkNTUEQgfCBFMTAwMF9DVFJMX0ZSQ0RQWCk7CisgICAgY3RybCAmPSB+KERFVklDRV9TUEVFRF9NQVNLKTsKKworICAgIC8qIENsZWFyIHRoZSBBdXRvIFNwZWVkIERldGVjdCBFbmFibGUgYml0LiAqLworICAgIGN0cmwgJj0gfkUxMDAwX0NUUkxfQVNERTsKKworICAgIC8qIFJlYWQgdGhlIE1JSSBDb250cm9sIFJlZ2lzdGVyLiAqLworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCAmbWlpX2N0cmxfcmVnKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIC8qIFdlIG5lZWQgdG8gZGlzYWJsZSBhdXRvbmVnIGluIG9yZGVyIHRvIGZvcmNlIGxpbmsgYW5kIGR1cGxleC4gKi8KKworICAgIG1paV9jdHJsX3JlZyAmPSB+TUlJX0NSX0FVVE9fTkVHX0VOOworCisgICAgLyogQXJlIHdlIGZvcmNpbmcgRnVsbCBvciBIYWxmIER1cGxleD8gKi8KKyAgICBpZihody0+Zm9yY2VkX3NwZWVkX2R1cGxleCA9PSBlMTAwMF8xMDBfZnVsbCB8fAorICAgICAgIGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2Z1bGwpIHsKKyAgICAgICAgLyogV2Ugd2FudCB0byBmb3JjZSBmdWxsIGR1cGxleCBzbyB3ZSBTRVQgdGhlIGZ1bGwgZHVwbGV4IGJpdHMgaW4gdGhlCisgICAgICAgICAqIERldmljZSBhbmQgTUlJIENvbnRyb2wgUmVnaXN0ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX0ZEOworICAgICAgICBtaWlfY3RybF9yZWcgfD0gTUlJX0NSX0ZVTExfRFVQTEVYOworICAgICAgICBERUJVR09VVCgiRnVsbCBEdXBsZXhcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFdlIHdhbnQgdG8gZm9yY2UgaGFsZiBkdXBsZXggc28gd2UgQ0xFQVIgdGhlIGZ1bGwgZHVwbGV4IGJpdHMgaW4KKyAgICAgICAgICogdGhlIERldmljZSBhbmQgTUlJIENvbnRyb2wgUmVnaXN0ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9GRDsKKyAgICAgICAgbWlpX2N0cmxfcmVnICY9IH5NSUlfQ1JfRlVMTF9EVVBMRVg7CisgICAgICAgIERFQlVHT1VUKCJIYWxmIER1cGxleFxuIik7CisgICAgfQorCisgICAgLyogQXJlIHdlIGZvcmNpbmcgMTAwTWJwcz8/PyAqLworICAgIGlmKGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwMF9mdWxsIHx8CisgICAgICAgaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTAwX2hhbGYpIHsKKyAgICAgICAgLyogU2V0IHRoZSAxMDBNYiBiaXQgYW5kIHR1cm4gb2ZmIHRoZSAxMDAwTWIgYW5kIDEwTWIgYml0cy4gKi8KKyAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NQRF8xMDA7CisgICAgICAgIG1paV9jdHJsX3JlZyB8PSBNSUlfQ1JfU1BFRURfMTAwOworICAgICAgICBtaWlfY3RybF9yZWcgJj0gfihNSUlfQ1JfU1BFRURfMTAwMCB8IE1JSV9DUl9TUEVFRF8xMCk7CisgICAgICAgIERFQlVHT1VUKCJGb3JjaW5nIDEwMG1iICIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFNldCB0aGUgMTBNYiBiaXQgYW5kIHR1cm4gb2ZmIHRoZSAxMDAwTWIgYW5kIDEwME1iIGJpdHMuICovCisgICAgICAgIGN0cmwgJj0gfihFMTAwMF9DVFJMX1NQRF8xMDAwIHwgRTEwMDBfQ1RSTF9TUERfMTAwKTsKKyAgICAgICAgbWlpX2N0cmxfcmVnIHw9IE1JSV9DUl9TUEVFRF8xMDsKKyAgICAgICAgbWlpX2N0cmxfcmVnICY9IH4oTUlJX0NSX1NQRUVEXzEwMDAgfCBNSUlfQ1JfU1BFRURfMTAwKTsKKyAgICAgICAgREVCVUdPVVQoIkZvcmNpbmcgMTBtYiAiKTsKKyAgICB9CisKKyAgICBlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworCisgICAgLyogV3JpdGUgdGhlIGNvbmZpZ3VyZWQgdmFsdWVzIGJhY2sgdG8gdGhlIERldmljZSBDb250cm9sIFJlZy4gKi8KKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworCisgICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAvKiBDbGVhciBBdXRvLUNyb3Nzb3ZlciB0byBmb3JjZSBNREkgbWFudWFsbHkuIE04OEUxMDAwIHJlcXVpcmVzIE1ESQorICAgICAgICAgKiBmb3JjZWQgd2hlbmV2ZXIgc3BlZWQgYXJlIGR1cGxleCBhcmUgZm9yY2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcGh5X2RhdGEgJj0gfk04OEUxMDAwX1BTQ1JfQVVUT19YX01PREU7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCBwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICBERUJVR09VVDEoIk04OEUxMDAwIFBTQ1I6ICV4IFxuIiwgcGh5X2RhdGEpOworCisgICAgICAgIC8qIE5lZWQgdG8gcmVzZXQgdGhlIFBIWSBvciB0aGVzZSBjaGFuZ2VzIHdpbGwgYmUgaWdub3JlZCAqLworICAgICAgICBtaWlfY3RybF9yZWcgfD0gTUlJX0NSX1JFU0VUOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENsZWFyIEF1dG8tQ3Jvc3NvdmVyIHRvIGZvcmNlIE1ESSBtYW51YWxseS4gIElHUCByZXF1aXJlcyBNREkKKyAgICAgICAgICogZm9yY2VkIHdoZW5ldmVyIHNwZWVkIG9yIGR1cGxleCBhcmUgZm9yY2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DVFJMLCAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDUl9BVVRPX01ESVg7CisgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVg7CisKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ1RSTCwgcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfQorCisgICAgLyogV3JpdGUgYmFjayB0aGUgbW9kaWZpZWQgUEhZIE1JSSBjb250cm9sIHJlZ2lzdGVyLiAqLworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfQ1RSTCwgbWlpX2N0cmxfcmVnKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHVkZWxheSgxKTsKKworICAgIC8qIFRoZSB3YWl0X2F1dG9uZWdfY29tcGxldGUgZmxhZyBtYXkgYmUgYSBsaXR0bGUgbWlzbGVhZGluZyBoZXJlLgorICAgICAqIFNpbmNlIHdlIGFyZSBmb3JjaW5nIHNwZWVkIGFuZCBkdXBsZXgsIEF1dG8tTmVnIGlzIG5vdCBlbmFibGVkLgorICAgICAqIEJ1dCB3ZSBkbyB3YW50IHRvIGRlbGF5IGZvciBhIHBlcmlvZCB3aGlsZSBmb3JjaW5nIG9ubHkgc28gd2UKKyAgICAgKiBkb24ndCBnZW5lcmF0ZSBmYWxzZSBObyBMaW5rIG1lc3NhZ2VzLiAgU28gd2Ugd2lsbCB3YWl0IGhlcmUKKyAgICAgKiBvbmx5IGlmIHRoZSB1c2VyIGhhcyBzZXQgd2FpdF9hdXRvbmVnX2NvbXBsZXRlIHRvIDEsIHdoaWNoIGlzCisgICAgICogdGhlIGRlZmF1bHQuCisgICAgICovCisgICAgaWYoaHctPndhaXRfYXV0b25lZ19jb21wbGV0ZSkgeworICAgICAgICAvKiBXZSB3aWxsIHdhaXQgZm9yIGF1dG9uZWcgdG8gY29tcGxldGUuICovCisgICAgICAgIERFQlVHT1VUKCJXYWl0aW5nIGZvciBmb3JjZWQgc3BlZWQvZHVwbGV4IGxpbmsuXG4iKTsKKyAgICAgICAgbWlpX3N0YXR1c19yZWcgPSAwOworCisgICAgICAgIC8qIFdlIHdpbGwgd2FpdCBmb3IgYXV0b25lZyB0byBjb21wbGV0ZSBvciA0LjUgc2Vjb25kcyB0byBleHBpcmUuICovCisgICAgICAgIGZvcihpID0gUEhZX0ZPUkNFX1RJTUU7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgICAgIC8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIHdhaXQgZm9yIEF1dG8tTmVnIENvbXBsZXRlIGJpdAorICAgICAgICAgICAgICogdG8gYmUgc2V0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIGlmKG1paV9zdGF0dXNfcmVnICYgTUlJX1NSX0xJTktfU1RBVFVTKSBicmVhazsKKyAgICAgICAgICAgIG1zZWNfZGVsYXkoMTAwKTsKKyAgICAgICAgfQorICAgICAgICBpZigoaSA9PSAwKSAmJgorICAgICAgICAgICAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpKSB7CisgICAgICAgICAgICAvKiBXZSBkaWRuJ3QgZ2V0IGxpbmsuICBSZXNldCB0aGUgRFNQIGFuZCB3YWl0IGFnYWluIGZvciBsaW5rLiAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9yZXNldF9kc3AoaHcpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBSZXNldHRpbmcgUEhZIERTUFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogVGhpcyBsb29wIHdpbGwgZWFybHktb3V0IGlmIHRoZSBsaW5rIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuICAqLworICAgICAgICBmb3IoaSA9IFBIWV9GT1JDRV9USU1FOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICBpZihtaWlfc3RhdHVzX3JlZyAmIE1JSV9TUl9MSU5LX1NUQVRVUykgYnJlYWs7CisgICAgICAgICAgICBtc2VjX2RlbGF5KDEwMCk7CisgICAgICAgICAgICAvKiBSZWFkIHRoZSBNSUkgU3RhdHVzIFJlZ2lzdGVyIGFuZCB3YWl0IGZvciBBdXRvLU5lZyBDb21wbGV0ZSBiaXQKKyAgICAgICAgICAgICAqIHRvIGJlIHNldC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZyk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSB7CisgICAgICAgIC8qIEJlY2F1c2Ugd2UgcmVzZXQgdGhlIFBIWSBhYm92ZSwgd2UgbmVlZCB0byByZS1mb3JjZSBUWF9DTEsgaW4gdGhlCisgICAgICAgICAqIEV4dGVuZGVkIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyIHRvIDI1TUh6IGNsb2NrLiAgVGhpcyB2YWx1ZQorICAgICAgICAgKiBkZWZhdWx0cyBiYWNrIHRvIGEgMi41TUh6IGNsb2NrIHdoZW4gdGhlIFBIWSBpcyByZXNldC4KKyAgICAgICAgICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMLCAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfRVBTQ1JfVFhfQ0xLXzI1OworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwsIHBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIC8qIEluIGFkZGl0aW9uLCBiZWNhdXNlIG9mIHRoZSBzL3cgcmVzZXQgYWJvdmUsIHdlIG5lZWQgdG8gZW5hYmxlIENSUyBvbgorICAgICAgICAgKiBUWC4gIFRoaXMgbXVzdCBiZSBzZXQgZm9yIGJvdGggZnVsbCBhbmQgaGFsZiBkdXBsZXggb3BlcmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfQVNTRVJUX0NSU19PTl9UWDsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsIHBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIGlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDQgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQzKSAmJgorICAgICAgICAgICAoIWh3LT5hdXRvbmVnKSAmJgorICAgICAgICAgICAoaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTBfZnVsbCB8fAorICAgICAgICAgICAgaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTBfaGFsZikpIHsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF93b3JrYXJvdW5kKGh3KTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2V0cyB0aGUgY29sbGlzaW9uIGRpc3RhbmNlIGluIHRoZSBUcmFuc21pdCBDb250cm9sIHJlZ2lzdGVyCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqCisqIExpbmsgc2hvdWxkIGhhdmUgYmVlbiBlc3RhYmxpc2hlZCBwcmV2aW91c2x5LiBSZWFkcyB0aGUgc3BlZWQgYW5kIGR1cGxleAorKiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBEZXZpY2UgU3RhdHVzIHJlZ2lzdGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgdGN0bDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0Iik7CisKKyAgICB0Y3RsID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRDVEwpOworCisgICAgdGN0bCAmPSB+RTEwMDBfVENUTF9DT0xEOworICAgIHRjdGwgfD0gRTEwMDBfQ09MTElTSU9OX0RJU1RBTkNFIDw8IEUxMDAwX0NPTERfU0hJRlQ7CisKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIFRDVEwsIHRjdGwpOworICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTZXRzIE1BQyBzcGVlZCBhbmQgZHVwbGV4IHNldHRpbmdzIHRvIHJlZmxlY3QgdGhlIHRob3NlIGluIHRoZSBQSFkKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogbWlpX3JlZyAtIGRhdGEgdG8gd3JpdGUgdG8gdGhlIE1JSSBjb250cm9sIHJlZ2lzdGVyCisqCisqIFRoZSBjb250ZW50cyBvZiB0aGUgUEhZIHJlZ2lzdGVyIGNvbnRhaW5pbmcgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiBuZWVkIHRvCisqIGJlIHBhc3NlZCBpbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9jb25maWdfbWFjX3RvX3BoeShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmw7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9jb25maWdfbWFjX3RvX3BoeSIpOworCisgICAgLyogUmVhZCB0aGUgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIgYW5kIHNldCB0aGUgYml0cyB0byBGb3JjZSBTcGVlZAorICAgICAqIGFuZCBEdXBsZXguCisgICAgICovCisgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKyAgICBjdHJsIHw9IChFMTAwMF9DVFJMX0ZSQ1NQRCB8IEUxMDAwX0NUUkxfRlJDRFBYKTsKKyAgICBjdHJsICY9IH4oRTEwMDBfQ1RSTF9TUERfU0VMIHwgRTEwMDBfQ1RSTF9JTE9TKTsKKworICAgIC8qIFNldCB1cCBkdXBsZXggaW4gdGhlIERldmljZSBDb250cm9sIGFuZCBUcmFuc21pdCBDb250cm9sCisgICAgICogcmVnaXN0ZXJzIGRlcGVuZGluZyBvbiBuZWdvdGlhdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3ApIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIGlmKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX0ZVTExfRFVQTEVYKSBjdHJsIHw9IEUxMDAwX0NUUkxfRkQ7CisgICAgICAgIGVsc2UgY3RybCAmPSB+RTEwMDBfQ1RSTF9GRDsKKworICAgICAgICBlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworCisgICAgICAgIC8qIFNldCB1cCBzcGVlZCBpbiB0aGUgRGV2aWNlIENvbnRyb2wgcmVnaXN0ZXIgZGVwZW5kaW5nIG9uCisgICAgICAgICAqIG5lZ290aWF0ZWQgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX1NQRUVEX01BU0spID09CisgICAgICAgICAgIElHUDAxRTEwMDBfUFNTUl9TUEVFRF8xMDAwTUJQUykKKyAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TUERfMTAwMDsKKyAgICAgICAgZWxzZSBpZigocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BTU1JfU1BFRURfTUFTSykgPT0KKyAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BTU1JfU1BFRURfMTAwTUJQUykKKyAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TUERfMTAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX1NUQVRVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgaWYocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0RQTFgpIGN0cmwgfD0gRTEwMDBfQ1RSTF9GRDsKKyAgICAgICAgZWxzZSBjdHJsICY9IH5FMTAwMF9DVFJMX0ZEOworCisgICAgICAgIGUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7CisKKyAgICAgICAgLyogU2V0IHVwIHNwZWVkIGluIHRoZSBEZXZpY2UgQ29udHJvbCByZWdpc3RlciBkZXBlbmRpbmcgb24KKyAgICAgICAgICogbmVnb3RpYXRlZCB2YWx1ZXMuCisgICAgICAgICAqLworICAgICAgICBpZigocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX1NQRUVEKSA9PSBNODhFMTAwMF9QU1NSXzEwMDBNQlMpCisgICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDA7CisgICAgICAgIGVsc2UgaWYoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9TUEVFRCkgPT0gTTg4RTEwMDBfUFNTUl8xMDBNQlMpCisgICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDsKKyAgICB9CisgICAgLyogV3JpdGUgdGhlIGNvbmZpZ3VyZWQgdmFsdWVzIGJhY2sgdG8gdGhlIERldmljZSBDb250cm9sIFJlZy4gKi8KKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGb3JjZXMgdGhlIE1BQydzIGZsb3cgY29udHJvbCBzZXR0aW5ncy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFNldHMgdGhlIFRGQ0UgYW5kIFJGQ0UgYml0cyBpbiB0aGUgZGV2aWNlIGNvbnRyb2wgcmVnaXN0ZXIgdG8gcmVmbGVjdAorICogdGhlIGFkYXB0ZXIgc2V0dGluZ3MuIFRGQ0UgYW5kIFJGQ0UgbmVlZCB0byBiZSBleHBsaWNpdGx5IHNldCBieQorICogc29mdHdhcmUgd2hlbiBhIENvcHBlciBQSFkgaXMgdXNlZCBiZWNhdXNlIGF1dG9uZWdvdGlhdGlvbiBpcyBtYW5hZ2VkCisgKiBieSB0aGUgUEhZIHJhdGhlciB0aGFuIHRoZSBNQUMuIFNvZnR3YXJlIG11c3QgYWxzbyBjb25maWd1cmUgdGhlc2UKKyAqIGJpdHMgd2hlbiBsaW5rIGlzIGZvcmNlZCBvbiBhIGZpYmVyIGNvbm5lY3Rpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9mb3JjZV9tYWNfZmMoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBjdHJsOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9mb3JjZV9tYWNfZmMiKTsKKworICAgIC8qIEdldCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBEZXZpY2UgQ29udHJvbCBSZWdpc3RlciAqLworICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisKKyAgICAvKiBCZWNhdXNlIHdlIGRpZG4ndCBnZXQgbGluayB2aWEgdGhlIGludGVybmFsIGF1dG8tbmVnb3RpYXRpb24KKyAgICAgKiBtZWNoYW5pc20gKHdlIGVpdGhlciBmb3JjZWQgbGluayBvciB3ZSBnb3QgbGluayB2aWEgUEhZCisgICAgICogYXV0by1uZWcpLCB3ZSBoYXZlIHRvIG1hbnVhbGx5IGVuYWJsZS9kaXNhYmxlIHRyYW5zbWl0IGFuCisgICAgICogcmVjZWl2ZSBmbG93IGNvbnRyb2wuCisgICAgICoKKyAgICAgKiBUaGUgIkNhc2UiIHN0YXRlbWVudCBiZWxvdyBlbmFibGVzL2Rpc2FibGUgZmxvdyBjb250cm9sCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSAiaHctPmZjIiBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBUaGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSAiZmMiIHBhcmFtZXRlciBhcmU6CisgICAgICogICAgICAwOiAgRmxvdyBjb250cm9sIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQKKyAgICAgKiAgICAgIDE6ICBSeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHJlY2VpdmUgcGF1c2UKKyAgICAgKiAgICAgICAgICBmcmFtZXMgYnV0IG5vdCBzZW5kIHBhdXNlIGZyYW1lcykuCisgICAgICogICAgICAyOiAgVHggZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgKHdlIGNhbiBzZW5kIHBhdXNlIGZyYW1lcworICAgICAqICAgICAgICAgIGZyYW1lcyBidXQgd2UgZG8gbm90IHJlY2VpdmUgcGF1c2UgZnJhbWVzKS4KKyAgICAgKiAgICAgIDM6ICBCb3RoIFJ4IGFuZCBUWCBmbG93IGNvbnRyb2wgKHN5bW1ldHJpYykgaXMgZW5hYmxlZC4KKyAgICAgKiAgb3RoZXI6ICBObyBvdGhlciB2YWx1ZXMgc2hvdWxkIGJlIHBvc3NpYmxlIGF0IHRoaXMgcG9pbnQuCisgICAgICovCisKKyAgICBzd2l0Y2ggKGh3LT5mYykgeworICAgIGNhc2UgZTEwMDBfZmNfbm9uZToKKyAgICAgICAgY3RybCAmPSAofihFMTAwMF9DVFJMX1RGQ0UgfCBFMTAwMF9DVFJMX1JGQ0UpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF9mY19yeF9wYXVzZToKKyAgICAgICAgY3RybCAmPSAofkUxMDAwX0NUUkxfVEZDRSk7CisgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9SRkNFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwX2ZjX3R4X3BhdXNlOgorICAgICAgICBjdHJsICY9ICh+RTEwMDBfQ1RSTF9SRkNFKTsKKyAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1RGQ0U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfZmNfZnVsbDoKKyAgICAgICAgY3RybCB8PSAoRTEwMDBfQ1RSTF9URkNFIHwgRTEwMDBfQ1RSTF9SRkNFKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgREVCVUdPVVQoIkZsb3cgY29udHJvbCBwYXJhbSBzZXQgaW5jb3JyZWN0bHlcbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CisgICAgfQorCisgICAgLyogRGlzYWJsZSBUWCBGbG93IENvbnRyb2wgZm9yIDgyNTQyIChyZXYgMi4wKSAqLworICAgIGlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApCisgICAgICAgIGN0cmwgJj0gKH5FMTAwMF9DVFJMX1RGQ0UpOworCisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29uZmlndXJlcyBmbG93IGNvbnRyb2wgc2V0dGluZ3MgYWZ0ZXIgbGluayBpcyBlc3RhYmxpc2hlZAorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogU2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhIHZhbGlkIGxpbmsgaGFzIGJlZW4gZXN0YWJsaXNoZWQuCisgKiBGb3JjZXMgTUFDIGZsb3cgY29udHJvbCBzZXR0aW5ncyBpZiBsaW5rIHdhcyBmb3JjZWQuIFdoZW4gaW4gTUlJL0dNSUkgbW9kZQorICogYW5kIGF1dG9uZWdvdGlhdGlvbiBpcyBlbmFibGVkLCB0aGUgTUFDIGZsb3cgY29udHJvbCBzZXR0aW5ncyB3aWxsIGJlIHNldAorICogYmFzZWQgb24gdGhlIGZsb3cgY29udHJvbCBuZWdvdGlhdGVkIGJ5IHRoZSBQSFkuIEluIFRCSSBtb2RlLCB0aGUgVEZDRQorICogYW5kIFJGQ0UgYml0cyB3aWxsIGJlIGF1dG9tYXRpY2FseSBzZXQgdG8gdGhlIG5lZ290aWF0ZWQgZmxvdyBjb250cm9sIG1vZGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBtaWlfc3RhdHVzX3JlZzsKKyAgICB1aW50MTZfdCBtaWlfbndheV9hZHZfcmVnOworICAgIHVpbnQxNl90IG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnOworICAgIHVpbnQxNl90IHNwZWVkOworICAgIHVpbnQxNl90IGR1cGxleDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXAiKTsKKworICAgIC8qIENoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGZpYmVyIG1lZGlhIGFuZCBhdXRvLW5lZyBmYWlsZWQKKyAgICAgKiBzbyB3ZSBoYWQgdG8gZm9yY2UgbGluay4gIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBmb3JjZSB0aGUKKyAgICAgKiBjb25maWd1cmF0aW9uIG9mIHRoZSBNQUMgdG8gbWF0Y2ggdGhlICJmYyIgcGFyYW1ldGVyLgorICAgICAqLworICAgIGlmKCgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgJiYgKGh3LT5hdXRvbmVnX2ZhaWxlZCkpIHx8CisgICAgICAgKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgJiYgKGh3LT5hdXRvbmVnX2ZhaWxlZCkpIHx8CisgICAgICAgKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgJiYgKCFody0+YXV0b25lZykpKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9mb3JjZV9tYWNfZmMoaHcpOworICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgZm9yY2luZyBmbG93IGNvbnRyb2wgc2V0dGluZ3NcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBjb3BwZXIgbWVkaWEgYW5kIGF1dG8tbmVnIGlzCisgICAgICogZW5hYmxlZC4gIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBjaGVjayBhbmQgc2VlIGlmIEF1dG8tTmVnCisgICAgICogaGFzIGNvbXBsZXRlZCwgYW5kIGlmIHNvLCBob3cgdGhlIFBIWSBhbmQgbGluayBwYXJ0bmVyIGhhcworICAgICAqIGZsb3cgY29udHJvbCBjb25maWd1cmVkLgorICAgICAqLworICAgIGlmKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgJiYgaHctPmF1dG9uZWcpIHsKKyAgICAgICAgLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgY2hlY2sgdG8gc2VlIGlmIEF1dG9OZWcKKyAgICAgICAgICogaGFzIGNvbXBsZXRlZC4gIFdlIHJlYWQgdGhpcyB0d2ljZSBiZWNhdXNlIHRoaXMgcmVnIGhhcworICAgICAgICAgKiBzb21lICJzdGlja3kiIChsYXRjaGVkKSBiaXRzLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgaWYobWlpX3N0YXR1c19yZWcgJiBNSUlfU1JfQVVUT05FR19DT01QTEVURSkgeworICAgICAgICAgICAgLyogVGhlIEF1dG9OZWcgcHJvY2VzcyBoYXMgY29tcGxldGVkLCBzbyB3ZSBub3cgbmVlZCB0bworICAgICAgICAgICAgICogcmVhZCBib3RoIHRoZSBBdXRvIE5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIKKyAgICAgICAgICAgICAqIChBZGRyZXNzIDQpIGFuZCB0aGUgQXV0b19OZWdvdGlhdGlvbiBCYXNlIFBhZ2UgQWJpbGl0eQorICAgICAgICAgICAgICogUmVnaXN0ZXIgKEFkZHJlc3MgNSkgdG8gZGV0ZXJtaW5lIGhvdyBmbG93IGNvbnRyb2wgd2FzCisgICAgICAgICAgICAgKiBuZWdvdGlhdGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfQVVUT05FR19BRFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWlfbndheV9hZHZfcmVnKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfTFBfQUJJTElUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1paV9ud2F5X2xwX2FiaWxpdHlfcmVnKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIC8qIFR3byBiaXRzIGluIHRoZSBBdXRvIE5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIKKyAgICAgICAgICAgICAqIChBZGRyZXNzIDQpIGFuZCB0d28gYml0cyBpbiB0aGUgQXV0byBOZWdvdGlhdGlvbiBCYXNlCisgICAgICAgICAgICAgKiBQYWdlIEFiaWxpdHkgUmVnaXN0ZXIgKEFkZHJlc3MgNSkgZGV0ZXJtaW5lIGZsb3cgY29udHJvbAorICAgICAgICAgICAgICogZm9yIGJvdGggdGhlIFBIWSBhbmQgdGhlIGxpbmsgcGFydG5lci4gIFRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgICAqIHRhYmxlLCB0YWtlbiBvdXQgb2YgdGhlIElFRUUgODAyLjNhYi9ENi4wIGRhdGVkIE1hcmNoIDI1LAorICAgICAgICAgICAgICogMTk5OSwgZGVzY3JpYmVzIHRoZXNlIFBBVVNFIHJlc29sdXRpb24gYml0cyBhbmQgaG93IGZsb3cKKyAgICAgICAgICAgICAqIGNvbnRyb2wgaXMgZGV0ZXJtaW5lZCBiYXNlZCB1cG9uIHRoZXNlIHNldHRpbmdzLgorICAgICAgICAgICAgICogTk9URTogIERDID0gRG9uJ3QgQ2FyZQorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqICAgTE9DQUwgREVWSUNFICB8ICAgTElOSyBQQVJUTkVSCisgICAgICAgICAgICAgKiBQQVVTRSB8IEFTTV9ESVIgfCBQQVVTRSB8IEFTTV9ESVIgfCBOSUMgUmVzb2x1dGlvbgorICAgICAgICAgICAgICotLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICogICAwICAgfCAgICAwICAgIHwgIERDICAgfCAgIERDICAgIHwgZTEwMDBfZmNfbm9uZQorICAgICAgICAgICAgICogICAwICAgfCAgICAxICAgIHwgICAwICAgfCAgIERDICAgIHwgZTEwMDBfZmNfbm9uZQorICAgICAgICAgICAgICogICAwICAgfCAgICAxICAgIHwgICAxICAgfCAgICAwICAgIHwgZTEwMDBfZmNfbm9uZQorICAgICAgICAgICAgICogICAwICAgfCAgICAxICAgIHwgICAxICAgfCAgICAxICAgIHwgZTEwMDBfZmNfdHhfcGF1c2UKKyAgICAgICAgICAgICAqICAgMSAgIHwgICAgMCAgICB8ICAgMCAgIHwgICBEQyAgICB8IGUxMDAwX2ZjX25vbmUKKyAgICAgICAgICAgICAqICAgMSAgIHwgICBEQyAgICB8ICAgMSAgIHwgICBEQyAgICB8IGUxMDAwX2ZjX2Z1bGwKKyAgICAgICAgICAgICAqICAgMSAgIHwgICAgMSAgICB8ICAgMCAgIHwgICAgMCAgICB8IGUxMDAwX2ZjX25vbmUKKyAgICAgICAgICAgICAqICAgMSAgIHwgICAgMSAgICB8ICAgMCAgIHwgICAgMSAgICB8IGUxMDAwX2ZjX3J4X3BhdXNlCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBBcmUgYm90aCBQQVVTRSBiaXRzIHNldCB0byAxPyAgSWYgc28sIHRoaXMgaW1wbGllcworICAgICAgICAgICAgICogU3ltbWV0cmljIEZsb3cgQ29udHJvbCBpcyBlbmFibGVkIGF0IGJvdGggZW5kcy4gIFRoZQorICAgICAgICAgICAgICogQVNNX0RJUiBiaXRzIGFyZSBpcnJlbGV2YW50IHBlciB0aGUgc3BlYy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBGb3IgU3ltbWV0cmljIEZsb3cgQ29udHJvbDoKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAgIExPQ0FMIERFVklDRSAgfCAgIExJTksgUEFSVE5FUgorICAgICAgICAgICAgICogUEFVU0UgfCBBU01fRElSIHwgUEFVU0UgfCBBU01fRElSIHwgUmVzdWx0CisgICAgICAgICAgICAgKi0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgKiAgIDEgICB8ICAgREMgICAgfCAgIDEgICB8ICAgREMgICAgfCBlMTAwMF9mY19mdWxsCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZigobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfUEFVU0UpICYmCisgICAgICAgICAgICAgICAobWlpX253YXlfbHBfYWJpbGl0eV9yZWcgJiBOV0FZX0xQQVJfUEFVU0UpKSB7CisgICAgICAgICAgICAgICAgLyogTm93IHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHVzZXIgc2VsZWN0ZWQgUlggT05MWQorICAgICAgICAgICAgICAgICAqIG9mIHBhdXNlIGZyYW1lcy4gIEluIHRoaXMgY2FzZSwgd2UgaGFkIHRvIGFkdmVydGlzZQorICAgICAgICAgICAgICAgICAqIEZVTEwgZmxvdyBjb250cm9sIGJlY2F1c2Ugd2UgY291bGQgbm90IGFkdmVydGlzZSBSWAorICAgICAgICAgICAgICAgICAqIE9OTFkuIEhlbmNlLCB3ZSBtdXN0IG5vdyBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0bworICAgICAgICAgICAgICAgICAqIHR1cm4gT0ZGICB0aGUgVFJBTlNNSVNTSU9OIG9mIFBBVVNFIGZyYW1lcy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZihody0+b3JpZ2luYWxfZmMgPT0gZTEwMDBfZmNfZnVsbCkgeworICAgICAgICAgICAgICAgICAgICBody0+ZmMgPSBlMTAwMF9mY19mdWxsOworICAgICAgICAgICAgICAgICAgICBERUJVR09VVCgiRmxvdyBDb250cm9sID0gRlVMTC5cclxuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaHctPmZjID0gZTEwMDBfZmNfcnhfcGF1c2U7CisgICAgICAgICAgICAgICAgICAgIERFQlVHT1VUKCJGbG93IENvbnRyb2wgPSBSWCBQQVVTRSBmcmFtZXMgb25seS5cclxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRm9yIHJlY2VpdmluZyBQQVVTRSBmcmFtZXMgT05MWS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAgIExPQ0FMIERFVklDRSAgfCAgIExJTksgUEFSVE5FUgorICAgICAgICAgICAgICogUEFVU0UgfCBBU01fRElSIHwgUEFVU0UgfCBBU01fRElSIHwgUmVzdWx0CisgICAgICAgICAgICAgKi0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgKiAgIDAgICB8ICAgIDEgICAgfCAgIDEgICB8ICAgIDEgICAgfCBlMTAwMF9mY190eF9wYXVzZQorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZWxzZSBpZighKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX1BBVVNFKSAmJgorICAgICAgICAgICAgICAgICAgICAobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfQVNNX0RJUikgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX1BBVVNFKSAmJgorICAgICAgICAgICAgICAgICAgICAobWlpX253YXlfbHBfYWJpbGl0eV9yZWcgJiBOV0FZX0xQQVJfQVNNX0RJUikpIHsKKyAgICAgICAgICAgICAgICBody0+ZmMgPSBlMTAwMF9mY190eF9wYXVzZTsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRmxvdyBDb250cm9sID0gVFggUEFVU0UgZnJhbWVzIG9ubHkuXHJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRm9yIHRyYW5zbWl0dGluZyBQQVVTRSBmcmFtZXMgT05MWS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAgIExPQ0FMIERFVklDRSAgfCAgIExJTksgUEFSVE5FUgorICAgICAgICAgICAgICogUEFVU0UgfCBBU01fRElSIHwgUEFVU0UgfCBBU01fRElSIHwgUmVzdWx0CisgICAgICAgICAgICAgKi0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgKiAgIDEgICB8ICAgIDEgICAgfCAgIDAgICB8ICAgIDEgICAgfCBlMTAwMF9mY19yeF9wYXVzZQorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZWxzZSBpZigobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfUEFVU0UpICYmCisgICAgICAgICAgICAgICAgICAgIChtaWlfbndheV9hZHZfcmVnICYgTldBWV9BUl9BU01fRElSKSAmJgorICAgICAgICAgICAgICAgICAgICAhKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX1BBVVNFKSAmJgorICAgICAgICAgICAgICAgICAgICAobWlpX253YXlfbHBfYWJpbGl0eV9yZWcgJiBOV0FZX0xQQVJfQVNNX0RJUikpIHsKKyAgICAgICAgICAgICAgICBody0+ZmMgPSBlMTAwMF9mY19yeF9wYXVzZTsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRmxvdyBDb250cm9sID0gUlggUEFVU0UgZnJhbWVzIG9ubHkuXHJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogUGVyIHRoZSBJRUVFIHNwZWMsIGF0IHRoaXMgcG9pbnQgZmxvdyBjb250cm9sIHNob3VsZCBiZQorICAgICAgICAgICAgICogZGlzYWJsZWQuICBIb3dldmVyLCB3ZSB3YW50IHRvIGNvbnNpZGVyIHRoYXQgd2UgY291bGQKKyAgICAgICAgICAgICAqIGJlIGNvbm5lY3RlZCB0byBhIGxlZ2FjeSBzd2l0Y2ggdGhhdCBkb2Vzbid0IGFkdmVydGlzZQorICAgICAgICAgICAgICogZGVzaXJlZCBmbG93IGNvbnRyb2wsIGJ1dCBjYW4gYmUgZm9yY2VkIG9uIHRoZSBsaW5rCisgICAgICAgICAgICAgKiBwYXJ0bmVyLiAgU28gaWYgd2UgYWR2ZXJ0aXNlZCBubyBmbG93IGNvbnRyb2wsIHRoYXQgaXMKKyAgICAgICAgICAgICAqIHdoYXQgd2Ugd2lsbCByZXNvbHZlIHRvLiAgSWYgd2UgYWR2ZXJ0aXNlZCBzb21lIGtpbmQgb2YKKyAgICAgICAgICAgICAqIHJlY2VpdmUgY2FwYWJpbGl0eSAoUnggUGF1c2UgT25seSBvciBGdWxsIEZsb3cgQ29udHJvbCkKKyAgICAgICAgICAgICAqIGFuZCB0aGUgbGluayBwYXJ0bmVyIGFkdmVydGlzZWQgbm9uZSwgd2Ugd2lsbCBjb25maWd1cmUKKyAgICAgICAgICAgICAqIG91cnNlbHZlcyB0byBlbmFibGUgUnggRmxvdyBDb250cm9sIG9ubHkuICBXZSBjYW4gZG8KKyAgICAgICAgICAgICAqIHRoaXMgc2FmZWx5IGZvciB0d28gcmVhc29uczogIElmIHRoZSBsaW5rIHBhcnRuZXIgcmVhbGx5CisgICAgICAgICAgICAgKiBkaWRuJ3Qgd2FudCBmbG93IGNvbnRyb2wgZW5hYmxlZCwgYW5kIHdlIGVuYWJsZSBSeCwgbm8KKyAgICAgICAgICAgICAqIGhhcm0gZG9uZSBzaW5jZSB3ZSB3b24ndCBiZSByZWNlaXZpbmcgYW55IFBBVVNFIGZyYW1lcworICAgICAgICAgICAgICogYW55d2F5LiAgSWYgdGhlIGludGVudCBvbiB0aGUgbGluayBwYXJ0bmVyIHdhcyB0byBoYXZlCisgICAgICAgICAgICAgKiBmbG93IGNvbnRyb2wgZW5hYmxlZCwgdGhlbiBieSB1cyBlbmFibGluZyBSWCBvbmx5LCB3ZQorICAgICAgICAgICAgICogY2FuIGF0IGxlYXN0IHJlY2VpdmUgcGF1c2UgZnJhbWVzIGFuZCBwcm9jZXNzIHRoZW0uCisgICAgICAgICAgICAgKiBUaGlzIGlzIGEgZ29vZCBpZGVhIGJlY2F1c2UgaW4gbW9zdCBjYXNlcywgc2luY2Ugd2UgYXJlCisgICAgICAgICAgICAgKiBwcmVkb21pbmFudGx5IGEgc2VydmVyIE5JQywgbW9yZSB0aW1lcyB0aGFuIG5vdCB3ZSB3aWxsCisgICAgICAgICAgICAgKiBiZSBhc2tlZCB0byBkZWxheSB0cmFuc21pc3Npb24gb2YgcGFja2V0cyB0aGFuIGFza2luZworICAgICAgICAgICAgICogb3VyIGxpbmsgcGFydG5lciB0byBwYXVzZSB0cmFuc21pc3Npb24gb2YgZnJhbWVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBlbHNlIGlmKChody0+b3JpZ2luYWxfZmMgPT0gZTEwMDBfZmNfbm9uZSB8fAorICAgICAgICAgICAgICAgICAgICAgaHctPm9yaWdpbmFsX2ZjID09IGUxMDAwX2ZjX3R4X3BhdXNlKSB8fAorICAgICAgICAgICAgICAgICAgICBody0+ZmNfc3RyaWN0X2llZWUpIHsKKyAgICAgICAgICAgICAgICBody0+ZmMgPSBlMTAwMF9mY19ub25lOworICAgICAgICAgICAgICAgIERFQlVHT1VUKCJGbG93IENvbnRyb2wgPSBOT05FLlxyXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaHctPmZjID0gZTEwMDBfZmNfcnhfcGF1c2U7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkZsb3cgQ29udHJvbCA9IFJYIFBBVVNFIGZyYW1lcyBvbmx5LlxyXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTm93IHdlIG5lZWQgdG8gZG8gb25lIGxhc3QgY2hlY2suLi4gIElmIHdlIGF1dG8tCisgICAgICAgICAgICAgKiBuZWdvdGlhdGVkIHRvIEhBTEYgRFVQTEVYLCBmbG93IGNvbnRyb2wgc2hvdWxkIG5vdCBiZQorICAgICAgICAgICAgICogZW5hYmxlZCBwZXIgSUVFRSA4MDIuMyBzcGVjLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoaHcsICZzcGVlZCwgJmR1cGxleCk7CisgICAgICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGdldHRpbmcgbGluayBzcGVlZCBhbmQgZHVwbGV4XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoZHVwbGV4ID09IEhBTEZfRFVQTEVYKQorICAgICAgICAgICAgICAgIGh3LT5mYyA9IGUxMDAwX2ZjX25vbmU7CisKKyAgICAgICAgICAgIC8qIE5vdyB3ZSBjYWxsIGEgc3Vicm91dGluZSB0byBhY3R1YWxseSBmb3JjZSB0aGUgTUFDCisgICAgICAgICAgICAgKiBjb250cm9sbGVyIHRvIHVzZSB0aGUgY29ycmVjdCBmbG93IGNvbnRyb2wgc2V0dGluZ3MuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9mb3JjZV9tYWNfZmMoaHcpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBmb3JjaW5nIGZsb3cgY29udHJvbCBzZXR0aW5nc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBERUJVR09VVCgiQ29wcGVyIFBIWSBhbmQgQXV0byBOZWcgaGFzIG5vdCBjb21wbGV0ZWQuXHJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBsaW5rIHN0YXR1cyBvZiB0aGUgaGFyZHdhcmUgaGFzIGNoYW5nZWQuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBDYWxsZWQgYnkgYW55IGZ1bmN0aW9uIHRoYXQgbmVlZHMgdG8gY2hlY2sgdGhlIGxpbmsgc3RhdHVzIG9mIHRoZSBhZGFwdGVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfY2hlY2tfZm9yX2xpbmsoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCByeGN3ID0gMDsKKyAgICB1aW50MzJfdCBjdHJsOworICAgIHVpbnQzMl90IHN0YXR1czsKKyAgICB1aW50MzJfdCByY3RsOworICAgIHVpbnQzMl90IGljcjsKKyAgICB1aW50MzJfdCBzaWduYWwgPSAwOworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY2hlY2tfZm9yX2xpbmsiKTsKKworICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisgICAgc3RhdHVzID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUyk7CisKKyAgICAvKiBPbiBhZGFwdGVycyB3aXRoIGEgTUFDIG5ld2VyIHRoYW4gODI1NDQsIFNXIERlZmluZWFibGUgcGluIDEgd2lsbCBiZQorICAgICAqIHNldCB3aGVuIHRoZSBvcHRpY3MgZGV0ZWN0IGEgc2lnbmFsLiBPbiBvbGRlciBhZGFwdGVycywgaXQgd2lsbCBiZQorICAgICAqIGNsZWFyZWQgd2hlbiB0aGVyZSBpcyBhIHNpZ25hbC4gIFRoaXMgYXBwbGllcyB0byBmaWJlciBtZWRpYSBvbmx5LgorICAgICAqLworICAgIGlmKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB8fAorICAgICAgIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykpIHsKKyAgICAgICAgcnhjdyA9IEUxMDAwX1JFQURfUkVHKGh3LCBSWENXKTsKKworICAgICAgICBpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB7CisgICAgICAgICAgICBzaWduYWwgPSAoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDQpID8gRTEwMDBfQ1RSTF9TV0RQSU4xIDogMDsKKyAgICAgICAgICAgIGlmKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19MVSkKKyAgICAgICAgICAgICAgICBody0+Z2V0X2xpbmtfc3RhdHVzID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiB3ZSBoYXZlIGEgY29wcGVyIFBIWSB0aGVuIHdlIG9ubHkgd2FudCB0byBnbyBvdXQgdG8gdGhlIFBIWQorICAgICAqIHJlZ2lzdGVycyB0byBzZWUgaWYgQXV0by1OZWcgaGFzIGNvbXBsZXRlZCBhbmQvb3IgaWYgb3VyIGxpbmsKKyAgICAgKiBzdGF0dXMgaGFzIGNoYW5nZWQuICBUaGUgZ2V0X2xpbmtfc3RhdHVzIGZsYWcgd2lsbCBiZSBzZXQgaWYgd2UKKyAgICAgKiByZWNlaXZlIGEgTGluayBTdGF0dXMgQ2hhbmdlIGludGVycnVwdCBvciB3ZSBoYXZlIFJ4IFNlcXVlbmNlCisgICAgICogRXJyb3JzLgorICAgICAqLworICAgIGlmKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgJiYgaHctPmdldF9saW5rX3N0YXR1cykgeworICAgICAgICAvKiBGaXJzdCB3ZSB3YW50IHRvIHNlZSBpZiB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciByZXBvcnRzCisgICAgICAgICAqIGxpbmsuICBJZiBzbywgdGhlbiB3ZSB3YW50IHRvIGdldCB0aGUgY3VycmVudCBzcGVlZC9kdXBsZXgKKyAgICAgICAgICogb2YgdGhlIFBIWS4KKyAgICAgICAgICogUmVhZCB0aGUgcmVnaXN0ZXIgdHdpY2Ugc2luY2UgdGhlIGxpbmsgYml0IGlzIHN0aWNreS4KKyAgICAgICAgICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIGlmKHBoeV9kYXRhICYgTUlJX1NSX0xJTktfU1RBVFVTKSB7CisgICAgICAgICAgICBody0+Z2V0X2xpbmtfc3RhdHVzID0gRkFMU0U7CisgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGVyZSB3YXMgRG93blNoaWZ0LCBtdXN0IGJlIGNoZWNrZWQgaW1tZWRpYXRlbHkgYWZ0ZXIKKyAgICAgICAgICAgICAqIGxpbmstdXAgKi8KKyAgICAgICAgICAgIGUxMDAwX2NoZWNrX2Rvd25zaGlmdChodyk7CisKKyAgICAgICAgICAgIC8qIElmIHdlIGFyZSBvbiA4MjU0NCBvciA4MjU0MyBzaWxpY29uIGFuZCBzcGVlZC9kdXBsZXgKKyAgICAgICAgICAgICAqIGFyZSBmb3JjZWQgdG8gMTBIIG9yIDEwRiwgdGhlbiB3ZSB3aWxsIGltcGxlbWVudCB0aGUgcG9sYXJpdHkKKyAgICAgICAgICAgICAqIHJldmVyc2FsIHdvcmthcm91bmQuICBXZSBkaXNhYmxlIGludGVycnVwdHMgZmlyc3QsIGFuZCB1cG9uCisgICAgICAgICAgICAgKiByZXR1cm5pbmcsIHBsYWNlIHRoZSBkZXZpY2VzIGludGVycnVwdCBzdGF0ZSB0byBpdHMgcHJldmlvdXMKKyAgICAgICAgICAgICAqIHZhbHVlIGV4Y2VwdCBmb3IgdGhlIGxpbmsgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgd2hpY2ggd2lsbAorICAgICAgICAgICAgICogaGFwcGVuIGR1ZSB0byB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgd29ya2Fyb3VuZC4KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBpZigoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ0IHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MykgJiYKKyAgICAgICAgICAgICAgICghaHctPmF1dG9uZWcpICYmCisgICAgICAgICAgICAgICAoaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTBfZnVsbCB8fAorICAgICAgICAgICAgICAgIGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2hhbGYpKSB7CisgICAgICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBJTUMsIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF93b3JrYXJvdW5kKGh3KTsKKyAgICAgICAgICAgICAgICBpY3IgPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSKTsKKyAgICAgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIElDUywgKGljciAmIH5FMTAwMF9JQ1NfTFNDKSk7CisgICAgICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBJTVMsIElNU19FTkFCTEVfTUFTSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5vIGxpbmsgZGV0ZWN0ZWQgKi8KKyAgICAgICAgICAgIGUxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2UoaHcsIEZBTFNFKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyogSWYgd2UgYXJlIGZvcmNpbmcgc3BlZWQvZHVwbGV4LCB0aGVuIHdlIHNpbXBseSByZXR1cm4gc2luY2UKKyAgICAgICAgICogd2UgaGF2ZSBhbHJlYWR5IGRldGVybWluZWQgd2hldGhlciB3ZSBoYXZlIGxpbmsgb3Igbm90LgorICAgICAgICAgKi8KKyAgICAgICAgaWYoIWh3LT5hdXRvbmVnKSByZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CisKKyAgICAgICAgLyogb3B0aW1pemUgdGhlIGRzcCBzZXR0aW5ncyBmb3IgdGhlIGlncCBwaHkgKi8KKyAgICAgICAgZTEwMDBfY29uZmlnX2RzcF9hZnRlcl9saW5rX2NoYW5nZShodywgVFJVRSk7CisKKyAgICAgICAgLyogV2UgaGF2ZSBhIE04OEUxMDAwIFBIWSBhbmQgQXV0by1OZWcgaXMgZW5hYmxlZC4gIElmIHdlCisgICAgICAgICAqIGhhdmUgU2kgb24gYm9hcmQgdGhhdCBpcyA4MjU0NCBvciBuZXdlciwgQXV0bworICAgICAgICAgKiBTcGVlZCBEZXRlY3Rpb24gdGFrZXMgY2FyZSBvZiBNQUMgc3BlZWQvZHVwbGV4CisgICAgICAgICAqIGNvbmZpZ3VyYXRpb24uICBTbyB3ZSBvbmx5IG5lZWQgdG8gY29uZmlndXJlIENvbGxpc2lvbgorICAgICAgICAgKiBEaXN0YW5jZSBpbiB0aGUgTUFDLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGZvcmNlCisgICAgICAgICAqIHNwZWVkL2R1cGxleCBvbiB0aGUgTUFDIHRvIHRoZSBjdXJyZW50IFBIWSBzcGVlZC9kdXBsZXgKKyAgICAgICAgICogc2V0dGluZ3MuCisgICAgICAgICAqLworICAgICAgICBpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpCisgICAgICAgICAgICBlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb25maWdfbWFjX3RvX3BoeShodyk7CisgICAgICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGNvbmZpZ3VyaW5nIE1BQyB0byBQSFkgc2V0dGluZ3NcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ29uZmlndXJlIEZsb3cgQ29udHJvbCBub3cgdGhhdCBBdXRvLU5lZyBoYXMgY29tcGxldGVkLiBGaXJzdCwgd2UKKyAgICAgICAgICogbmVlZCB0byByZXN0b3JlIHRoZSBkZXNpcmVkIGZsb3cgY29udHJvbCBzZXR0aW5ncyBiZWNhdXNlIHdlIG1heQorICAgICAgICAgKiBoYXZlIGhhZCB0byByZS1hdXRvbmVnIHdpdGggYSBkaWZmZXJlbnQgbGluayBwYXJ0bmVyLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKGh3KTsKKyAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGNvbmZpZ3VyaW5nIGZsb3cgY29udHJvbFxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHdlIGFyZSBvbiBjb3BwZXIgYW5kIHdlIGhhdmUKKyAgICAgICAgICogYXV0by1uZWdvdGlhdGVkIGxpbmsuICBUaGVzZSBhcmUgY29uZGl0aW9ucyBmb3IgY2hlY2tpbmcgdGhlIGxpbmsKKyAgICAgICAgICogcGFydG5lciBjYXBhYmlsaXR5IHJlZ2lzdGVyLiAgV2UgdXNlIHRoZSBsaW5rIHNwZWVkIHRvIGRldGVybWluZSBpZgorICAgICAgICAgKiBUQkkgY29tcGF0aWJpbGl0eSBuZWVkcyB0byBiZSB0dXJuZWQgb24gb3Igb2ZmLiAgSWYgdGhlIGxpbmsgaXMgbm90CisgICAgICAgICAqIGF0IGdpZ2FiaXQgc3BlZWQsIHRoZW4gVEJJIGNvbXBhdGliaWxpdHkgaXMgbm90IG5lZWRlZC4gIElmIHdlIGFyZQorICAgICAgICAgKiBhdCBnaWdhYml0IHNwZWVkLCB3ZSB0dXJuIG9uIFRCSSBjb21wYXRpYmlsaXR5LgorICAgICAgICAgKi8KKyAgICAgICAgaWYoaHctPnRiaV9jb21wYXRpYmlsaXR5X2VuKSB7CisgICAgICAgICAgICB1aW50MTZfdCBzcGVlZCwgZHVwbGV4OworICAgICAgICAgICAgZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoaHcsICZzcGVlZCwgJmR1cGxleCk7CisgICAgICAgICAgICBpZihzcGVlZCAhPSBTUEVFRF8xMDAwKSB7CisgICAgICAgICAgICAgICAgLyogSWYgbGluayBzcGVlZCBpcyBub3Qgc2V0IHRvIGdpZ2FiaXQgc3BlZWQsIHdlIGRvIG5vdCBuZWVkCisgICAgICAgICAgICAgICAgICogdG8gZW5hYmxlIFRCSSBjb21wYXRpYmlsaXR5LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKGh3LT50YmlfY29tcGF0aWJpbGl0eV9vbikgeworICAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSBwcmV2aW91c2x5IHdlcmUgaW4gdGhlIG1vZGUsIHR1cm4gaXQgb2ZmLiAqLworICAgICAgICAgICAgICAgICAgICByY3RsID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJDVEwpOworICAgICAgICAgICAgICAgICAgICByY3RsICY9IH5FMTAwMF9SQ1RMX1NCUDsKKyAgICAgICAgICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBSQ1RMLCByY3RsKTsKKyAgICAgICAgICAgICAgICAgICAgaHctPnRiaV9jb21wYXRpYmlsaXR5X29uID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBJZiBUQkkgY29tcGF0aWJpbGl0eSBpcyB3YXMgcHJldmlvdXNseSBvZmYsIHR1cm4gaXQgb24uIEZvcgorICAgICAgICAgICAgICAgICAqIGNvbXBhdGliaWxpdHkgd2l0aCBhIFRCSSBsaW5rIHBhcnRuZXIsIHdlIHdpbGwgc3RvcmUgYmFkCisgICAgICAgICAgICAgICAgICogcGFja2V0cy4gU29tZSBmcmFtZXMgaGF2ZSBhbiBhZGRpdGlvbmFsIGJ5dGUgb24gdGhlIGVuZCBhbmQKKyAgICAgICAgICAgICAgICAgKiB3aWxsIGxvb2sgbGlrZSBDUkMgZXJyb3JzIHRvIHRvIHRoZSBoYXJkd2FyZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZighaHctPnRiaV9jb21wYXRpYmlsaXR5X29uKSB7CisgICAgICAgICAgICAgICAgICAgIGh3LT50YmlfY29tcGF0aWJpbGl0eV9vbiA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHJjdGwgPSBFMTAwMF9SRUFEX1JFRyhodywgUkNUTCk7CisgICAgICAgICAgICAgICAgICAgIHJjdGwgfD0gRTEwMDBfUkNUTF9TQlA7CisgICAgICAgICAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgUkNUTCwgcmN0bCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIElmIHdlIGRvbid0IGhhdmUgbGluayAoYXV0by1uZWdvdGlhdGlvbiBmYWlsZWQgb3IgbGluayBwYXJ0bmVyIGNhbm5vdAorICAgICAqIGF1dG8tbmVnb3RpYXRlKSwgdGhlIGNhYmxlIGlzIHBsdWdnZWQgaW4gKHdlIGhhdmUgc2lnbmFsKSwgYW5kIG91cgorICAgICAqIGxpbmsgcGFydG5lciBpcyBub3QgdHJ5aW5nIHRvIGF1dG8tbmVnb3RpYXRlIHdpdGggdXMgKHdlIGFyZSByZWNlaXZpbmcKKyAgICAgKiBpZGxlcyBvciBkYXRhKSwgd2UgbmVlZCB0byBmb3JjZSBsaW5rIHVwLiBXZSBhbHNvIG5lZWQgdG8gZ2l2ZQorICAgICAqIGF1dG8tbmVnb3RpYXRpb24gdGltZSB0byBjb21wbGV0ZSwgaW4gY2FzZSB0aGUgY2FibGUgd2FzIGp1c3QgcGx1Z2dlZAorICAgICAqIGluLiBUaGUgYXV0b25lZ19mYWlsZWQgZmxhZyBkb2VzIHRoaXMuCisgICAgICovCisgICAgZWxzZSBpZigoKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSAmJgorICAgICAgICAgICAgICAoKGN0cmwgJiBFMTAwMF9DVFJMX1NXRFBJTjEpID09IHNpZ25hbCkpIHx8CisgICAgICAgICAgICAgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSkgJiYKKyAgICAgICAgICAgICghKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19MVSkpICYmCisgICAgICAgICAgICAoIShyeGN3ICYgRTEwMDBfUlhDV19DKSkpIHsKKyAgICAgICAgaWYoaHctPmF1dG9uZWdfZmFpbGVkID09IDApIHsKKyAgICAgICAgICAgIGh3LT5hdXRvbmVnX2ZhaWxlZCA9IDE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBERUJVR09VVCgiTk9UIFJYaW5nIC9DLywgZGlzYWJsZSBBdXRvTmVnIGFuZCBmb3JjZSBsaW5rLlxyXG4iKTsKKworICAgICAgICAvKiBEaXNhYmxlIGF1dG8tbmVnb3RpYXRpb24gaW4gdGhlIFRYQ1cgcmVnaXN0ZXIgKi8KKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBUWENXLCAoaHctPnR4Y3cgJiB+RTEwMDBfVFhDV19BTkUpKTsKKworICAgICAgICAvKiBGb3JjZSBsaW5rLXVwIGFuZCBhbHNvIGZvcmNlIGZ1bGwtZHVwbGV4LiAqLworICAgICAgICBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworICAgICAgICBjdHJsIHw9IChFMTAwMF9DVFJMX1NMVSB8IEUxMDAwX0NUUkxfRkQpOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworCisgICAgICAgIC8qIENvbmZpZ3VyZSBGbG93IENvbnRyb2wgYWZ0ZXIgZm9yY2luZyBsaW5rIHVwLiAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXAoaHcpOworICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgY29uZmlndXJpbmcgZmxvdyBjb250cm9sXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisgICAgfQorICAgIC8qIElmIHdlIGFyZSBmb3JjaW5nIGxpbmsgYW5kIHdlIGFyZSByZWNlaXZpbmcgL0MvIG9yZGVyZWQgc2V0cywgcmUtZW5hYmxlCisgICAgICogYXV0by1uZWdvdGlhdGlvbiBpbiB0aGUgVFhDVyByZWdpc3RlciBhbmQgZGlzYWJsZSBmb3JjZWQgbGluayBpbiB0aGUKKyAgICAgKiBEZXZpY2UgQ29udHJvbCByZWdpc3RlciBpbiBhbiBhdHRlbXB0IHRvIGF1dG8tbmVnb3RpYXRlIHdpdGggb3VyIGxpbmsKKyAgICAgKiBwYXJ0bmVyLgorICAgICAqLworICAgIGVsc2UgaWYoKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB8fAorICAgICAgICAgICAgIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykpICYmCisgICAgICAgICAgICAoY3RybCAmIEUxMDAwX0NUUkxfU0xVKSAmJiAocnhjdyAmIEUxMDAwX1JYQ1dfQykpIHsKKyAgICAgICAgREVCVUdPVVQoIlJYaW5nIC9DLywgZW5hYmxlIEF1dG9OZWcgYW5kIHN0b3AgZm9yY2luZyBsaW5rLlxyXG4iKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBUWENXLCBody0+dHhjdyk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgKGN0cmwgJiB+RTEwMDBfQ1RSTF9TTFUpKTsKKworICAgICAgICBody0+c2VyZGVzX2xpbmtfZG93biA9IEZBTFNFOworICAgIH0KKyAgICAvKiBJZiB3ZSBmb3JjZSBsaW5rIGZvciBub24tYXV0by1uZWdvdGlhdGlvbiBzd2l0Y2gsIGNoZWNrIGxpbmsgc3RhdHVzCisgICAgICogYmFzZWQgb24gTUFDIHN5bmNocm9uaXphdGlvbiBmb3IgaW50ZXJuYWwgc2VyZGVzIG1lZGlhIHR5cGUuCisgICAgICovCisgICAgZWxzZSBpZigoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpICYmCisgICAgICAgICAgICAhKEUxMDAwX1RYQ1dfQU5FICYgRTEwMDBfUkVBRF9SRUcoaHcsIFRYQ1cpKSkgeworICAgICAgICAvKiBTWU5DSCBiaXQgYW5kIElWIGJpdCBhcmUgc3RpY2t5LiAqLworICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICBpZihFMTAwMF9SWENXX1NZTkNIICYgRTEwMDBfUkVBRF9SRUcoaHcsIFJYQ1cpKSB7CisgICAgICAgICAgICBpZighKHJ4Y3cgJiBFMTAwMF9SWENXX0lWKSkgeworICAgICAgICAgICAgICAgIGh3LT5zZXJkZXNfbGlua19kb3duID0gRkFMU0U7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIlNFUkRFUzogTGluayBpcyB1cC5cbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaHctPnNlcmRlc19saW5rX2Rvd24gPSBUUlVFOworICAgICAgICAgICAgREVCVUdPVVQoIlNFUkRFUzogTGluayBpcyBkb3duLlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSAmJgorICAgICAgIChFMTAwMF9UWENXX0FORSAmIEUxMDAwX1JFQURfUkVHKGh3LCBUWENXKSkpIHsKKyAgICAgICAgaHctPnNlcmRlc19saW5rX2Rvd24gPSAhKEUxMDAwX1NUQVRVU19MVSAmIEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpKTsKKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERldGVjdHMgdGhlIGN1cnJlbnQgc3BlZWQgYW5kIGR1cGxleCBzZXR0aW5ncyBvZiB0aGUgaGFyZHdhcmUuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIHNwZWVkIC0gU3BlZWQgb2YgdGhlIGNvbm5lY3Rpb24KKyAqIGR1cGxleCAtIER1cGxleCBzZXR0aW5nIG9mIHRoZSBjb25uZWN0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9nZXRfc3BlZWRfYW5kX2R1cGxleChzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKnNwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmR1cGxleCkKK3sKKyAgICB1aW50MzJfdCBzdGF0dXM7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9nZXRfc3BlZWRfYW5kX2R1cGxleCIpOworCisgICAgaWYoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSB7CisgICAgICAgIHN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworICAgICAgICBpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfU1BFRURfMTAwMCkgeworICAgICAgICAgICAgKnNwZWVkID0gU1BFRURfMTAwMDsKKyAgICAgICAgICAgIERFQlVHT1VUKCIxMDAwIE1icywgIik7CisgICAgICAgIH0gZWxzZSBpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfU1BFRURfMTAwKSB7CisgICAgICAgICAgICAqc3BlZWQgPSBTUEVFRF8xMDA7CisgICAgICAgICAgICBERUJVR09VVCgiMTAwIE1icywgIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqc3BlZWQgPSBTUEVFRF8xMDsKKyAgICAgICAgICAgIERFQlVHT1VUKCIxMCBNYnMsICIpOworICAgICAgICB9CisKKyAgICAgICAgaWYoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0ZEKSB7CisgICAgICAgICAgICAqZHVwbGV4ID0gRlVMTF9EVVBMRVg7CisgICAgICAgICAgICBERUJVR09VVCgiRnVsbCBEdXBsZXhcclxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZHVwbGV4ID0gSEFMRl9EVVBMRVg7CisgICAgICAgICAgICBERUJVR09VVCgiIEhhbGYgRHVwbGV4XHJcbiIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVCVUdPVVQoIjEwMDAgTWJzLCBGdWxsIER1cGxleFxyXG4iKTsKKyAgICAgICAgKnNwZWVkID0gU1BFRURfMTAwMDsKKyAgICAgICAgKmR1cGxleCA9IEZVTExfRFVQTEVYOworICAgIH0KKworICAgIC8qIElHUDAxIFBIWSBtYXkgYWR2ZXJ0aXNlIGZ1bGwgZHVwbGV4IG9wZXJhdGlvbiBhZnRlciBzcGVlZCBkb3duZ3JhZGUgZXZlbgorICAgICAqIGlmIGl0IGlzIG9wZXJhdGluZyBhdCBoYWxmIGR1cGxleC4gIEhlcmUgd2Ugc2V0IHRoZSBkdXBsZXggc2V0dGluZ3MgdG8KKyAgICAgKiBtYXRjaCB0aGUgZHVwbGV4IGluIHRoZSBsaW5rIHBhcnRuZXIncyBjYXBhYmlsaXRpZXMuCisgICAgICovCisgICAgaWYoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3AgJiYgaHctPnNwZWVkX2Rvd25ncmFkZWQpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfRVhQLCAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgaWYoIShwaHlfZGF0YSAmIE5XQVlfRVJfTFBfTldBWV9DQVBTKSkKKyAgICAgICAgICAgICpkdXBsZXggPSBIQUxGX0RVUExFWDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfTFBfQUJJTElUWSwgJnBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICBpZigoKnNwZWVkID09IFNQRUVEXzEwMCAmJiAhKHBoeV9kYXRhICYgTldBWV9MUEFSXzEwMFRYX0ZEX0NBUFMpKSB8fAorICAgICAgICAgICAgICAgKCpzcGVlZCA9PSBTUEVFRF8xMCAmJiAhKHBoeV9kYXRhICYgTldBWV9MUEFSXzEwVF9GRF9DQVBTKSkpCisgICAgICAgICAgICAgICAgKmR1cGxleCA9IEhBTEZfRFVQTEVYOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQmxvY2tzIHVudGlsIGF1dG9uZWcgY29tcGxldGVzIG9yIHRpbWVzIG91dCAofjQuNSBzZWNvbmRzKQorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfd2FpdF9hdXRvbmVnKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IGk7CisgICAgdWludDE2X3QgcGh5X2RhdGE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3dhaXRfYXV0b25lZyIpOworICAgIERFQlVHT1VUKCJXYWl0aW5nIGZvciBBdXRvLU5lZyB0byBjb21wbGV0ZS5cbiIpOworCisgICAgLyogV2Ugd2lsbCB3YWl0IGZvciBhdXRvbmVnIHRvIGNvbXBsZXRlIG9yIDQuNSBzZWNvbmRzIHRvIGV4cGlyZS4gKi8KKyAgICBmb3IoaSA9IFBIWV9BVVRPX05FR19USU1FOyBpID4gMDsgaS0tKSB7CisgICAgICAgIC8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIHdhaXQgZm9yIEF1dG8tTmVnCisgICAgICAgICAqIENvbXBsZXRlIGJpdCB0byBiZSBzZXQuCisgICAgICAgICAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgaWYocGh5X2RhdGEgJiBNSUlfU1JfQVVUT05FR19DT01QTEVURSkgeworICAgICAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgbXNlY19kZWxheSgxMDApOworICAgIH0KKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSYWlzZXMgdGhlIE1hbmFnZW1lbnQgRGF0YSBDbG9jaworKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKiBjdHJsIC0gRGV2aWNlIGNvbnRyb2wgcmVnaXN0ZXIncyBjdXJyZW50IHZhbHVlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfcmFpc2VfbWRpX2NsayhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY3RybCkKK3sKKyAgICAvKiBSYWlzZSB0aGUgY2xvY2sgaW5wdXQgdG8gdGhlIE1hbmFnZW1lbnQgRGF0YSBDbG9jayAoYnkgc2V0dGluZyB0aGUgTURDCisgICAgICogYml0KSwgYW5kIHRoZW4gZGVsYXkgMTAgbWljcm9zZWNvbmRzLgorICAgICAqLworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgKCpjdHJsIHwgRTEwMDBfQ1RSTF9NREMpKTsKKyAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgdWRlbGF5KDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBMb3dlcnMgdGhlIE1hbmFnZW1lbnQgRGF0YSBDbG9jaworKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKiBjdHJsIC0gRGV2aWNlIGNvbnRyb2wgcmVnaXN0ZXIncyBjdXJyZW50IHZhbHVlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfbG93ZXJfbWRpX2NsayhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY3RybCkKK3sKKyAgICAvKiBMb3dlciB0aGUgY2xvY2sgaW5wdXQgdG8gdGhlIE1hbmFnZW1lbnQgRGF0YSBDbG9jayAoYnkgY2xlYXJpbmcgdGhlIE1EQworICAgICAqIGJpdCksIGFuZCB0aGVuIGRlbGF5IDEwIG1pY3Jvc2Vjb25kcy4KKyAgICAgKi8KKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsICgqY3RybCAmIH5FMTAwMF9DVFJMX01EQykpOworICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICB1ZGVsYXkoMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNoaWZ0cyBkYXRhIGJpdHMgb3V0IHRvIHRoZSBQSFkKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogZGF0YSAtIERhdGEgdG8gc2VuZCBvdXQgdG8gdGhlIFBIWQorKiBjb3VudCAtIE51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IG91dAorKgorKiBCaXRzIGFyZSBzaGlmdGVkIG91dCBpbiBNU0IgdG8gTFNCIG9yZGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3NoaWZ0X291dF9tZGlfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY291bnQpCit7CisgICAgdWludDMyX3QgY3RybDsKKyAgICB1aW50MzJfdCBtYXNrOworCisgICAgLyogV2UgbmVlZCB0byBzaGlmdCAiY291bnQiIG51bWJlciBvZiBiaXRzIG91dCB0byB0aGUgUEhZLiBTbywgdGhlIHZhbHVlCisgICAgICogaW4gdGhlICJkYXRhIiBwYXJhbWV0ZXIgd2lsbCBiZSBzaGlmdGVkIG91dCB0byB0aGUgUEhZIG9uZSBiaXQgYXQgYQorICAgICAqIHRpbWUuIEluIG9yZGVyIHRvIGRvIHRoaXMsICJkYXRhIiBtdXN0IGJlIGJyb2tlbiBkb3duIGludG8gYml0cy4KKyAgICAgKi8KKyAgICBtYXNrID0gMHgwMTsKKyAgICBtYXNrIDw8PSAoY291bnQgLSAxKTsKKworICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisKKyAgICAvKiBTZXQgTURJT19ESVIgYW5kIE1EQ19ESVIgZGlyZWN0aW9uIGJpdHMgdG8gYmUgdXNlZCBhcyBvdXRwdXQgcGlucy4gKi8KKyAgICBjdHJsIHw9IChFMTAwMF9DVFJMX01ESU9fRElSIHwgRTEwMDBfQ1RSTF9NRENfRElSKTsKKworICAgIHdoaWxlKG1hc2spIHsKKyAgICAgICAgLyogQSAiMSIgaXMgc2hpZnRlZCBvdXQgdG8gdGhlIFBIWSBieSBzZXR0aW5nIHRoZSBNRElPIGJpdCB0byAiMSIgYW5kCisgICAgICAgICAqIHRoZW4gcmFpc2luZyBhbmQgbG93ZXJpbmcgdGhlIE1hbmFnZW1lbnQgRGF0YSBDbG9jay4gQSAiMCIgaXMKKyAgICAgICAgICogc2hpZnRlZCBvdXQgdG8gdGhlIFBIWSBieSBzZXR0aW5nIHRoZSBNRElPIGJpdCB0byAiMCIgYW5kIHRoZW4KKyAgICAgICAgICogcmFpc2luZyBhbmQgbG93ZXJpbmcgdGhlIGNsb2NrLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoZGF0YSAmIG1hc2spIGN0cmwgfD0gRTEwMDBfQ1RSTF9NRElPOworICAgICAgICBlbHNlIGN0cmwgJj0gfkUxMDAwX0NUUkxfTURJTzsKKworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisKKyAgICAgICAgdWRlbGF5KDEwKTsKKworICAgICAgICBlMTAwMF9yYWlzZV9tZGlfY2xrKGh3LCAmY3RybCk7CisgICAgICAgIGUxMDAwX2xvd2VyX21kaV9jbGsoaHcsICZjdHJsKTsKKworICAgICAgICBtYXNrID0gbWFzayA+PiAxOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTaGlmdHMgZGF0YSBiaXRzIGluIGZyb20gdGhlIFBIWQorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKgorKiBCaXRzIGFyZSBzaGlmdGVkIGluIGluIE1TQiB0byBMU0Igb3JkZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWludDE2X3QKK2UxMDAwX3NoaWZ0X2luX21kaV9iaXRzKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgY3RybDsKKyAgICB1aW50MTZfdCBkYXRhID0gMDsKKyAgICB1aW50OF90IGk7CisKKyAgICAvKiBJbiBvcmRlciB0byByZWFkIGEgcmVnaXN0ZXIgZnJvbSB0aGUgUEhZLCB3ZSBuZWVkIHRvIHNoaWZ0IGluIGEgdG90YWwKKyAgICAgKiBvZiAxOCBiaXRzIGZyb20gdGhlIFBIWS4gVGhlIGZpcnN0IHR3byBiaXQgKHR1cm5hcm91bmQpIHRpbWVzIGFyZSB1c2VkCisgICAgICogdG8gYXZvaWQgY29udGVudGlvbiBvbiB0aGUgTURJTyBwaW4gd2hlbiBhIHJlYWQgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4KKyAgICAgKiBUaGVzZSB0d28gYml0cyBhcmUgaWdub3JlZCBieSB1cyBhbmQgdGhyb3duIGF3YXkuIEJpdHMgYXJlICJzaGlmdGVkIGluIgorICAgICAqIGJ5IHJhaXNpbmcgdGhlIGlucHV0IHRvIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sgKHNldHRpbmcgdGhlIE1EQyBiaXQpLAorICAgICAqIGFuZCB0aGVuIHJlYWRpbmcgdGhlIHZhbHVlIG9mIHRoZSBNRElPIGJpdC4KKyAgICAgKi8KKyAgICBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCisgICAgLyogQ2xlYXIgTURJT19ESVIgKFNXRFBJTzEpIHRvIGluZGljYXRlIHRoaXMgYml0IGlzIHRvIGJlIHVzZWQgYXMgaW5wdXQuICovCisgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9NRElPX0RJUjsKKyAgICBjdHJsICY9IH5FMTAwMF9DVFJMX01ESU87CisKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKworICAgIC8qIFJhaXNlIGFuZCBMb3dlciB0aGUgY2xvY2sgYmVmb3JlIHJlYWRpbmcgaW4gdGhlIGRhdGEuIFRoaXMgYWNjb3VudHMgZm9yCisgICAgICogdGhlIHR1cm5hcm91bmQgYml0cy4gVGhlIGZpcnN0IGNsb2NrIG9jY3VycmVkIHdoZW4gd2UgY2xvY2tlZCBvdXQgdGhlCisgICAgICogbGFzdCBiaXQgb2YgdGhlIFJlZ2lzdGVyIEFkZHJlc3MuCisgICAgICovCisgICAgZTEwMDBfcmFpc2VfbWRpX2NsayhodywgJmN0cmwpOworICAgIGUxMDAwX2xvd2VyX21kaV9jbGsoaHcsICZjdHJsKTsKKworICAgIGZvcihkYXRhID0gMCwgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGRhdGEgPSBkYXRhIDw8IDE7CisgICAgICAgIGUxMDAwX3JhaXNlX21kaV9jbGsoaHcsICZjdHJsKTsKKyAgICAgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKyAgICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIHNoaWZ0ZWQgaW4gYSAiMSIuICovCisgICAgICAgIGlmKGN0cmwgJiBFMTAwMF9DVFJMX01ESU8pIGRhdGEgfD0gMTsKKyAgICAgICAgZTEwMDBfbG93ZXJfbWRpX2NsayhodywgJmN0cmwpOworICAgIH0KKworICAgIGUxMDAwX3JhaXNlX21kaV9jbGsoaHcsICZjdHJsKTsKKyAgICBlMTAwMF9sb3dlcl9tZGlfY2xrKGh3LCAmY3RybCk7CisKKyAgICByZXR1cm4gZGF0YTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJlYWRzIHRoZSB2YWx1ZSBmcm9tIGEgUEhZIHJlZ2lzdGVyLCBpZiB0aGUgdmFsdWUgaXMgb24gYSBzcGVjaWZpYyBub24gemVybworKiBwYWdlLCBzZXRzIHRoZSBwYWdlIGZpcnN0LgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKiByZWdfYWRkciAtIGFkZHJlc3Mgb2YgdGhlIFBIWSByZWdpc3RlciB0byByZWFkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9yZWFkX3BoeV9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWdfYWRkciwKKyAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqcGh5X2RhdGEpCit7CisgICAgdWludDMyX3QgcmV0X3ZhbDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcmVhZF9waHlfcmVnIik7CisKKworICAgIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwICYmCisgICAgICAgKHJlZ19hZGRyID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpcmVnX2FkZHIpOworICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWdfZXgoaHcsIE1BWF9QSFlfUkVHX0FERFJFU1MgJiByZWdfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKworICAgIHJldHVybiByZXRfdmFsOworfQorCitpbnQzMl90CitlMTAwMF9yZWFkX3BoeV9yZWdfZXgoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWdfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqcGh5X2RhdGEpCit7CisgICAgdWludDMyX3QgaTsKKyAgICB1aW50MzJfdCBtZGljID0gMDsKKyAgICBjb25zdCB1aW50MzJfdCBwaHlfYWRkciA9IDE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3JlYWRfcGh5X3JlZ19leCIpOworCisgICAgaWYocmVnX2FkZHIgPiBNQVhfUEhZX1JFR19BRERSRVNTKSB7CisgICAgICAgIERFQlVHT1VUMSgiUEhZIEFkZHJlc3MgJWQgaXMgb3V0IG9mIHJhbmdlXG4iLCByZWdfYWRkcik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BBUkFNOworICAgIH0KKworICAgIGlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQzKSB7CisgICAgICAgIC8qIFNldCB1cCBPcC1jb2RlLCBQaHkgQWRkcmVzcywgYW5kIHJlZ2lzdGVyIGFkZHJlc3MgaW4gdGhlIE1ESQorICAgICAgICAgKiBDb250cm9sIHJlZ2lzdGVyLiAgVGhlIE1BQyB3aWxsIHRha2UgY2FyZSBvZiBpbnRlcmZhY2luZyB3aXRoIHRoZQorICAgICAgICAgKiBQSFkgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIG1kaWMgPSAoKHJlZ19hZGRyIDw8IEUxMDAwX01ESUNfUkVHX1NISUZUKSB8CisgICAgICAgICAgICAgICAgKHBoeV9hZGRyIDw8IEUxMDAwX01ESUNfUEhZX1NISUZUKSB8CisgICAgICAgICAgICAgICAgKEUxMDAwX01ESUNfT1BfUkVBRCkpOworCisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTURJQywgbWRpYyk7CisKKyAgICAgICAgLyogUG9sbCB0aGUgcmVhZHkgYml0IHRvIHNlZSBpZiB0aGUgTURJIHJlYWQgY29tcGxldGVkICovCisgICAgICAgIGZvcihpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgIHVkZWxheSg1MCk7CisgICAgICAgICAgICBtZGljID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1ESUMpOworICAgICAgICAgICAgaWYobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmKCEobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpKSB7CisgICAgICAgICAgICBERUJVR09VVCgiTURJIFJlYWQgZGlkIG5vdCBjb21wbGV0ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QSFk7CisgICAgICAgIH0KKyAgICAgICAgaWYobWRpYyAmIEUxMDAwX01ESUNfRVJST1IpIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJNREkgRXJyb3JcbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZOworICAgICAgICB9CisgICAgICAgICpwaHlfZGF0YSA9ICh1aW50MTZfdCkgbWRpYzsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBXZSBtdXN0IGZpcnN0IHNlbmQgYSBwcmVhbWJsZSB0aHJvdWdoIHRoZSBNRElPIHBpbiB0byBzaWduYWwgdGhlCisgICAgICAgICAqIGJlZ2lubmluZyBvZiBhbiBNSUkgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGRvbmUgYnkgc2VuZGluZyAzMgorICAgICAgICAgKiBjb25zZWN1dGl2ZSAiMSIgYml0cy4KKyAgICAgICAgICovCisgICAgICAgIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyhodywgUEhZX1BSRUFNQkxFLCBQSFlfUFJFQU1CTEVfU0laRSk7CisKKyAgICAgICAgLyogTm93IGNvbWJpbmUgdGhlIG5leHQgZmV3IGZpZWxkcyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgYSByZWFkCisgICAgICAgICAqIG9wZXJhdGlvbi4gIFdlIHVzZSB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhlCisgICAgICAgICAqIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyByb3V0aW5lIGZpdmUgZGlmZmVyZW50IHRpbWVzLiBUaGUgZm9ybWF0IG9mCisgICAgICAgICAqIGEgTUlJIHJlYWQgaW5zdHJ1Y3Rpb24gY29uc2lzdHMgb2YgYSBzaGlmdCBvdXQgb2YgMTQgYml0cyBhbmQgaXMKKyAgICAgICAgICogZGVmaW5lZCBhcyBmb2xsb3dzOgorICAgICAgICAgKiAgICA8UHJlYW1ibGU+PFNPRj48T3AgQ29kZT48UGh5IEFkZHI+PFJlZyBBZGRyPgorICAgICAgICAgKiBmb2xsb3dlZCBieSBhIHNoaWZ0IGluIG9mIDE4IGJpdHMuICBUaGlzIGZpcnN0IHR3byBiaXRzIHNoaWZ0ZWQgaW4KKyAgICAgICAgICogYXJlIFR1cm5Bcm91bmQgYml0cyB1c2VkIHRvIGF2b2lkIGNvbnRlbnRpb24gb24gdGhlIE1ESU8gcGluIHdoZW4gYQorICAgICAgICAgKiBSRUFEIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuICBUaGVzZSB0d28gYml0cyBhcmUgdGhyb3duIGF3YXkKKyAgICAgICAgICogZm9sbG93ZWQgYnkgYSBzaGlmdCBpbiBvZiAxNiBiaXRzIHdoaWNoIGNvbnRhaW5zIHRoZSBkZXNpcmVkIGRhdGEuCisgICAgICAgICAqLworICAgICAgICBtZGljID0gKChyZWdfYWRkcikgfCAocGh5X2FkZHIgPDwgNSkgfAorICAgICAgICAgICAgICAgIChQSFlfT1BfUkVBRCA8PCAxMCkgfCAoUEhZX1NPRiA8PCAxMikpOworCisgICAgICAgIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyhodywgbWRpYywgMTQpOworCisgICAgICAgIC8qIE5vdyB0aGF0IHdlJ3ZlIHNoaWZ0ZWQgb3V0IHRoZSByZWFkIGNvbW1hbmQgdG8gdGhlIE1JSSwgd2UgbmVlZCB0bworICAgICAgICAgKiAic2hpZnQgaW4iIHRoZSAxNi1iaXQgdmFsdWUgKDE4IHRvdGFsIGJpdHMpIG9mIHRoZSByZXF1ZXN0ZWQgUEhZCisgICAgICAgICAqIHJlZ2lzdGVyIGFkZHJlc3MuCisgICAgICAgICAqLworICAgICAgICAqcGh5X2RhdGEgPSBlMTAwMF9zaGlmdF9pbl9tZGlfYml0cyhodyk7CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFdyaXRlcyBhIHZhbHVlIHRvIGEgUEhZIHJlZ2lzdGVyCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIHJlZ19hZGRyIC0gYWRkcmVzcyBvZiB0aGUgUEhZIHJlZ2lzdGVyIHRvIHdyaXRlCisqIGRhdGEgLSBkYXRhIHRvIHdyaXRlIHRvIHRoZSBQSFkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3dyaXRlX3BoeV9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBoeV9kYXRhKQoreworICAgIHVpbnQzMl90IHJldF92YWw7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3dyaXRlX3BoeV9yZWciKTsKKworCisgICAgaWYoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3AgJiYKKyAgICAgICAocmVnX2FkZHIgPiBNQVhfUEhZX01VTFRJX1BBR0VfUkVHKSkgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZ19leChodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdClyZWdfYWRkcik7CisgICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoaHcsIE1BWF9QSFlfUkVHX0FERFJFU1MgJiByZWdfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisKKyAgICByZXR1cm4gcmV0X3ZhbDsKK30KKworaW50MzJfdAorZTEwMDBfd3JpdGVfcGh5X3JlZ19leChzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWdfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcGh5X2RhdGEpCit7CisgICAgdWludDMyX3QgaTsKKyAgICB1aW50MzJfdCBtZGljID0gMDsKKyAgICBjb25zdCB1aW50MzJfdCBwaHlfYWRkciA9IDE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3dyaXRlX3BoeV9yZWdfZXgiKTsKKworICAgIGlmKHJlZ19hZGRyID4gTUFYX1BIWV9SRUdfQUREUkVTUykgeworICAgICAgICBERUJVR09VVDEoIlBIWSBBZGRyZXNzICVkIGlzIG91dCBvZiByYW5nZVxuIiwgcmVnX2FkZHIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QQVJBTTsKKyAgICB9CisKKyAgICBpZihody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0MykgeworICAgICAgICAvKiBTZXQgdXAgT3AtY29kZSwgUGh5IEFkZHJlc3MsIHJlZ2lzdGVyIGFkZHJlc3MsIGFuZCBkYXRhIGludGVuZGVkCisgICAgICAgICAqIGZvciB0aGUgUEhZIHJlZ2lzdGVyIGluIHRoZSBNREkgQ29udHJvbCByZWdpc3Rlci4gIFRoZSBNQUMgd2lsbCB0YWtlCisgICAgICAgICAqIGNhcmUgb2YgaW50ZXJmYWNpbmcgd2l0aCB0aGUgUEhZIHRvIHNlbmQgdGhlIGRlc2lyZWQgZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIG1kaWMgPSAoKCh1aW50MzJfdCkgcGh5X2RhdGEpIHwKKyAgICAgICAgICAgICAgICAocmVnX2FkZHIgPDwgRTEwMDBfTURJQ19SRUdfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAocGh5X2FkZHIgPDwgRTEwMDBfTURJQ19QSFlfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAoRTEwMDBfTURJQ19PUF9XUklURSkpOworCisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTURJQywgbWRpYyk7CisKKyAgICAgICAgLyogUG9sbCB0aGUgcmVhZHkgYml0IHRvIHNlZSBpZiB0aGUgTURJIHJlYWQgY29tcGxldGVkICovCisgICAgICAgIGZvcihpID0gMDsgaSA8IDY0MDsgaSsrKSB7CisgICAgICAgICAgICB1ZGVsYXkoNSk7CisgICAgICAgICAgICBtZGljID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1ESUMpOworICAgICAgICAgICAgaWYobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmKCEobWRpYyAmIEUxMDAwX01ESUNfUkVBRFkpKSB7CisgICAgICAgICAgICBERUJVR09VVCgiTURJIFdyaXRlIGRpZCBub3QgY29tcGxldGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogV2UnbGwgbmVlZCB0byB1c2UgdGhlIFNXIGRlZmluZWQgcGlucyB0byBzaGlmdCB0aGUgd3JpdGUgY29tbWFuZAorICAgICAgICAgKiBvdXQgdG8gdGhlIFBIWS4gV2UgZmlyc3Qgc2VuZCBhIHByZWFtYmxlIHRvIHRoZSBQSFkgdG8gc2lnbmFsIHRoZQorICAgICAgICAgKiBiZWdpbm5pbmcgb2YgdGhlIE1JSSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgZG9uZSBieSBzZW5kaW5nIDMyCisgICAgICAgICAqIGNvbnNlY3V0aXZlICIxIiBiaXRzLgorICAgICAgICAgKi8KKyAgICAgICAgZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzKGh3LCBQSFlfUFJFQU1CTEUsIFBIWV9QUkVBTUJMRV9TSVpFKTsKKworICAgICAgICAvKiBOb3cgY29tYmluZSB0aGUgcmVtYWluaW5nIHJlcXVpcmVkIGZpZWxkcyB0aGF0IHdpbGwgaW5kaWNhdGUgYQorICAgICAgICAgKiB3cml0ZSBvcGVyYXRpb24uIFdlIHVzZSB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhlCisgICAgICAgICAqIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyByb3V0aW5lIGZvciBlYWNoIGZpZWxkIGluIHRoZSBjb21tYW5kLiBUaGUKKyAgICAgICAgICogZm9ybWF0IG9mIGEgTUlJIHdyaXRlIGluc3RydWN0aW9uIGlzIGFzIGZvbGxvd3M6CisgICAgICAgICAqIDxQcmVhbWJsZT48U09GPjxPcCBDb2RlPjxQaHkgQWRkcj48UmVnIEFkZHI+PFR1cm5hcm91bmQ+PERhdGE+LgorICAgICAgICAgKi8KKyAgICAgICAgbWRpYyA9ICgoUEhZX1RVUk5BUk9VTkQpIHwgKHJlZ19hZGRyIDw8IDIpIHwgKHBoeV9hZGRyIDw8IDcpIHwKKyAgICAgICAgICAgICAgICAoUEhZX09QX1dSSVRFIDw8IDEyKSB8IChQSFlfU09GIDw8IDE0KSk7CisgICAgICAgIG1kaWMgPDw9IDE2OworICAgICAgICBtZGljIHw9ICh1aW50MzJfdCkgcGh5X2RhdGE7CisKKyAgICAgICAgZTEwMDBfc2hpZnRfb3V0X21kaV9iaXRzKGh3LCBtZGljLCAzMik7CisgICAgfQorCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUmV0dXJucyB0aGUgUEhZIHRvIHRoZSBwb3dlci1vbiByZXNldCBzdGF0ZQorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfcGh5X2h3X3Jlc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgY3RybCwgY3RybF9leHQ7CisgICAgdWludDMyX3QgbGVkX2N0cmw7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3BoeV9od19yZXNldCIpOworCisgICAgREVCVUdPVVQoIlJlc2V0dGluZyBQaHkuLi5cbiIpOworCisgICAgaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDMpIHsKKyAgICAgICAgLyogUmVhZCB0aGUgZGV2aWNlIGNvbnRyb2wgcmVnaXN0ZXIgYW5kIGFzc2VydCB0aGUgRTEwMDBfQ1RSTF9QSFlfUlNUCisgICAgICAgICAqIGJpdC4gVGhlbiwgdGFrZSBpdCBvdXQgb2YgcmVzZXQuCisgICAgICAgICAqLworICAgICAgICBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwgfCBFMTAwMF9DVFJMX1BIWV9SU1QpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgIG1zZWNfZGVsYXkoMTApOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUmVhZCB0aGUgRXh0ZW5kZWQgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIsIGFzc2VydCB0aGUgUEhZX1JFU0VUX0RJUgorICAgICAgICAgKiBiaXQgdG8gcHV0IHRoZSBQSFkgaW50byByZXNldC4gVGhlbiwgdGFrZSBpdCBvdXQgb2YgcmVzZXQuCisgICAgICAgICAqLworICAgICAgICBjdHJsX2V4dCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMX0VYVCk7CisgICAgICAgIGN0cmxfZXh0IHw9IEUxMDAwX0NUUkxfRVhUX1NEUDRfRElSOworICAgICAgICBjdHJsX2V4dCAmPSB+RTEwMDBfQ1RSTF9FWFRfU0RQNF9EQVRBOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRVhULCBjdHJsX2V4dCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgbXNlY19kZWxheSgxMCk7CisgICAgICAgIGN0cmxfZXh0IHw9IEUxMDAwX0NUUkxfRVhUX1NEUDRfREFUQTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMX0VYVCwgY3RybF9leHQpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgfQorICAgIHVkZWxheSgxNTApOworCisgICAgaWYoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MSkgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpIHsKKyAgICAgICAgLyogQ29uZmlndXJlIGFjdGl2aXR5IExFRCBhZnRlciBQSFkgcmVzZXQgKi8KKyAgICAgICAgbGVkX2N0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgTEVEQ1RMKTsKKyAgICAgICAgbGVkX2N0cmwgJj0gSUdQX0FDVElWSVRZX0xFRF9NQVNLOworICAgICAgICBsZWRfY3RybCB8PSAoSUdQX0FDVElWSVRZX0xFRF9FTkFCTEUgfCBJR1BfTEVEM19NT0RFKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBMRURDVEwsIGxlZF9jdHJsKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUmVzZXRzIHRoZSBQSFkKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoKKyogU2V0cyBiaXQgMTUgb2YgdGhlIE1JSSBDb250cm9sIHJlZ2lzZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3BoeV9yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X3Jlc2V0Iik7CisKKyAgICBpZihody0+bWFjX3R5cGUgIT0gZTEwMDBfODI1NDFfcmV2XzIpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0NUUkwsICZwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICBwaHlfZGF0YSB8PSBNSUlfQ1JfUkVTRVQ7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfQ1RSTCwgcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgdWRlbGF5KDEpOworICAgIH0gZWxzZSBlMTAwMF9waHlfaHdfcmVzZXQoaHcpOworCisgICAgaWYoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3ApCisgICAgICAgIGUxMDAwX3BoeV9pbml0X3NjcmlwdChodyk7CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQcm9iZXMgdGhlIGV4cGVjdGVkIFBIWSBhZGRyZXNzIGZvciBrbm93biBQSFkgSURzCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9kZXRlY3RfZ2lnX3BoeShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcGh5X2luaXRfc3RhdHVzLCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9pZF9oaWdoLCBwaHlfaWRfbG93OworICAgIGJvb2xlYW5fdCBtYXRjaCA9IEZBTFNFOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9kZXRlY3RfZ2lnX3BoeSIpOworCisgICAgLyogUmVhZCB0aGUgUEhZIElEIFJlZ2lzdGVycyB0byBpZGVudGlmeSB3aGljaCBQSFkgaXMgb25ib2FyZC4gKi8KKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfSUQxLCAmcGh5X2lkX2hpZ2gpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgaHctPnBoeV9pZCA9ICh1aW50MzJfdCkgKHBoeV9pZF9oaWdoIDw8IDE2KTsKKyAgICB1ZGVsYXkoMjApOworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9JRDIsICZwaHlfaWRfbG93KTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIGh3LT5waHlfaWQgfD0gKHVpbnQzMl90KSAocGh5X2lkX2xvdyAmIFBIWV9SRVZJU0lPTl9NQVNLKTsKKyAgICBody0+cGh5X3JldmlzaW9uID0gKHVpbnQzMl90KSBwaHlfaWRfbG93ICYgflBIWV9SRVZJU0lPTl9NQVNLOworCisgICAgc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NDM6CisgICAgICAgIGlmKGh3LT5waHlfaWQgPT0gTTg4RTEwMDBfRV9QSFlfSUQpIG1hdGNoID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU0NDoKKyAgICAgICAgaWYoaHctPnBoeV9pZCA9PSBNODhFMTAwMF9JX1BIWV9JRCkgbWF0Y2ggPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwXzgyNTQwOgorICAgIGNhc2UgZTEwMDBfODI1NDU6CisgICAgY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKKyAgICBjYXNlIGUxMDAwXzgyNTQ2OgorICAgIGNhc2UgZTEwMDBfODI1NDZfcmV2XzM6CisgICAgICAgIGlmKGh3LT5waHlfaWQgPT0gTTg4RTEwMTFfSV9QSFlfSUQpIG1hdGNoID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU0MToKKyAgICBjYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorICAgIGNhc2UgZTEwMDBfODI1NDc6CisgICAgY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKKyAgICAgICAgaWYoaHctPnBoeV9pZCA9PSBJR1AwMUUxMDAwX0lfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIERFQlVHT1VUMSgiSW52YWxpZCBNQUMgdHlwZSAlZFxuIiwgaHctPm1hY190eXBlKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOworICAgIH0KKyAgICBwaHlfaW5pdF9zdGF0dXMgPSBlMTAwMF9zZXRfcGh5X3R5cGUoaHcpOworCisgICAgaWYgKChtYXRjaCkgJiYgKHBoeV9pbml0X3N0YXR1cyA9PSBFMTAwMF9TVUNDRVNTKSkgeworICAgICAgICBERUJVR09VVDEoIlBIWSBJRCAweCVYIGRldGVjdGVkXG4iLCBody0+cGh5X2lkKTsKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisgICAgfQorICAgIERFQlVHT1VUMSgiSW52YWxpZCBQSFkgSUQgMHglWFxuIiwgaHctPnBoeV9pZCk7CisgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJlc2V0cyB0aGUgUEhZJ3MgRFNQCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfcGh5X3Jlc2V0X2RzcChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICBERUJVR0ZVTkMoImUxMDAwX3BoeV9yZXNldF9kc3AiKTsKKworICAgIGRvIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDI5LCAweDAwMWQpOworICAgICAgICBpZihyZXRfdmFsKSBicmVhazsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDMwLCAweDAwYzEpOworICAgICAgICBpZihyZXRfdmFsKSBicmVhazsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDMwLCAweDAwMDApOworICAgICAgICBpZihyZXRfdmFsKSBicmVhazsKKyAgICAgICAgcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisgICAgfSB3aGlsZSgwKTsKKworICAgIHJldHVybiByZXRfdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEdldCBQSFkgaW5mb3JtYXRpb24gZnJvbSB2YXJpb3VzIFBIWSByZWdpc3RlcnMgZm9yIGlncCBQSFkgb25seS4KKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogcGh5X2luZm8gLSBQSFkgaW5mb3JtYXRpb24gc3RydWN0dXJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9waHlfaWdwX2dldF9pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlMTAwMF9waHlfaW5mbyAqcGh5X2luZm8pCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9kYXRhLCBwb2xhcml0eSwgbWluX2xlbmd0aCwgbWF4X2xlbmd0aCwgYXZlcmFnZTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X2lncF9nZXRfaW5mbyIpOworCisgICAgLyogVGhlIGRvd25zaGlmdCBzdGF0dXMgaXMgY2hlY2tlZCBvbmx5IG9uY2UsIGFmdGVyIGxpbmsgaXMgZXN0YWJsaXNoZWQsCisgICAgICogYW5kIGl0IHN0b3JlZCBpbiB0aGUgaHctPnNwZWVkX2Rvd25ncmFkZWQgcGFyYW1ldGVyLiAqLworICAgIHBoeV9pbmZvLT5kb3duc2hpZnQgPSBody0+c3BlZWRfZG93bmdyYWRlZDsKKworICAgIC8qIElHUDAxRTEwMDAgZG9lcyBub3QgbmVlZCB0byBzdXBwb3J0IGl0LiAqLworICAgIHBoeV9pbmZvLT5leHRlbmRlZF8xMGJ0X2Rpc3RhbmNlID0gZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfbm9ybWFsOworCisgICAgLyogSUdQMDFFMTAwMCBhbHdheXMgY29ycmVjdCBwb2xhcml0eSByZXZlcnNhbCAqLworICAgIHBoeV9pbmZvLT5wb2xhcml0eV9jb3JyZWN0aW9uID0gZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfZW5hYmxlZDsKKworICAgIC8qIENoZWNrIHBvbGFyaXR5IHN0YXR1cyAqLworICAgIHJldF92YWwgPSBlMTAwMF9jaGVja19wb2xhcml0eShodywgJnBvbGFyaXR5KTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHBoeV9pbmZvLT5jYWJsZV9wb2xhcml0eSA9IHBvbGFyaXR5OworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9TVEFUVVMsICZwaHlfZGF0YSk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBwaHlfaW5mby0+bWRpeF9tb2RlID0gKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX01ESVgpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUFNTUl9NRElYX1NISUZUOworCisgICAgaWYoKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX1NQRUVEX01BU0spID09CisgICAgICAgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwMDBNQlBTKSB7CisgICAgICAgIC8qIExvY2FsL1JlbW90ZSBSZWNlaXZlciBJbmZvcm1hdGlvbiBhcmUgb25seSB2YWxpZCBhdCAxMDAwIE1icHMgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX1NUQVRVUywgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIHBoeV9pbmZvLT5sb2NhbF9yeCA9IChwaHlfZGF0YSAmIFNSXzEwMDBUX0xPQ0FMX1JYX1NUQVRVUykgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTX1NISUZUOworICAgICAgICBwaHlfaW5mby0+cmVtb3RlX3J4ID0gKHBoeV9kYXRhICYgU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVUykgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNSXzEwMDBUX1JFTU9URV9SWF9TVEFUVVNfU0hJRlQ7CisKKyAgICAgICAgLyogR2V0IGNhYmxlIGxlbmd0aCAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfZ2V0X2NhYmxlX2xlbmd0aChodywgJm1pbl9sZW5ndGgsICZtYXhfbGVuZ3RoKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIC8qIHRyYW5zYWx0ZSB0byBvbGQgbWV0aG9kICovCisgICAgICAgIGF2ZXJhZ2UgPSAobWF4X2xlbmd0aCArIG1pbl9sZW5ndGgpIC8gMjsKKworICAgICAgICBpZihhdmVyYWdlIDw9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTApCisgICAgICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gZTEwMDBfY2FibGVfbGVuZ3RoXzUwOworICAgICAgICBlbHNlIGlmKGF2ZXJhZ2UgPD0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF84MCkKKyAgICAgICAgICAgIHBoeV9pbmZvLT5jYWJsZV9sZW5ndGggPSBlMTAwMF9jYWJsZV9sZW5ndGhfNTBfODA7CisgICAgICAgIGVsc2UgaWYoYXZlcmFnZSA8PSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzExMCkKKyAgICAgICAgICAgIHBoeV9pbmZvLT5jYWJsZV9sZW5ndGggPSBlMTAwMF9jYWJsZV9sZW5ndGhfODBfMTEwOworICAgICAgICBlbHNlIGlmKGF2ZXJhZ2UgPD0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNDApCisgICAgICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gZTEwMDBfY2FibGVfbGVuZ3RoXzExMF8xNDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBoeV9pbmZvLT5jYWJsZV9sZW5ndGggPSBlMTAwMF9jYWJsZV9sZW5ndGhfMTQwOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEdldCBQSFkgaW5mb3JtYXRpb24gZnJvbSB2YXJpb3VzIFBIWSByZWdpc3RlcnMgZm90IG04OCBQSFkgb25seS4KKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogcGh5X2luZm8gLSBQSFkgaW5mb3JtYXRpb24gc3RydWN0dXJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9waHlfbTg4X2dldF9pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlMTAwMF9waHlfaW5mbyAqcGh5X2luZm8pCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9kYXRhLCBwb2xhcml0eTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X204OF9nZXRfaW5mbyIpOworCisgICAgLyogVGhlIGRvd25zaGlmdCBzdGF0dXMgaXMgY2hlY2tlZCBvbmx5IG9uY2UsIGFmdGVyIGxpbmsgaXMgZXN0YWJsaXNoZWQsCisgICAgICogYW5kIGl0IHN0b3JlZCBpbiB0aGUgaHctPnNwZWVkX2Rvd25ncmFkZWQgcGFyYW1ldGVyLiAqLworICAgIHBoeV9pbmZvLT5kb3duc2hpZnQgPSBody0+c3BlZWRfZG93bmdyYWRlZDsKKworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBwaHlfaW5mby0+ZXh0ZW5kZWRfMTBidF9kaXN0YW5jZSA9CisgICAgICAgIChwaHlfZGF0YSAmIE04OEUxMDAwX1BTQ1JfMTBCVF9FWFRfRElTVF9FTkFCTEUpID4+CisgICAgICAgIE04OEUxMDAwX1BTQ1JfMTBCVF9FWFRfRElTVF9FTkFCTEVfU0hJRlQ7CisgICAgcGh5X2luZm8tPnBvbGFyaXR5X2NvcnJlY3Rpb24gPQorICAgICAgICAocGh5X2RhdGEgJiBNODhFMTAwMF9QU0NSX1BPTEFSSVRZX1JFVkVSU0FMKSA+PgorICAgICAgICBNODhFMTAwMF9QU0NSX1BPTEFSSVRZX1JFVkVSU0FMX1NISUZUOworCisgICAgLyogQ2hlY2sgcG9sYXJpdHkgc3RhdHVzICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX2NoZWNrX3BvbGFyaXR5KGh3LCAmcG9sYXJpdHkpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOyAKKyAgICBwaHlfaW5mby0+Y2FibGVfcG9sYXJpdHkgPSBwb2xhcml0eTsKKworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX1NUQVRVUywgJnBoeV9kYXRhKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHBoeV9pbmZvLT5tZGl4X21vZGUgPSAocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX01ESVgpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIE04OEUxMDAwX1BTU1JfTURJWF9TSElGVDsKKworICAgIGlmICgocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX1NQRUVEKSA9PSBNODhFMTAwMF9QU1NSXzEwMDBNQlMpIHsKKyAgICAgICAgLyogQ2FibGUgTGVuZ3RoIEVzdGltYXRpb24gYW5kIExvY2FsL1JlbW90ZSBSZWNlaXZlciBJbmZvcm1hdGlvbgorICAgICAgICAgKiBhcmUgb25seSB2YWxpZCBhdCAxMDAwIE1icHMuCisgICAgICAgICAqLworICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gKChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE04OEUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIX1NISUZUKTsKKworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcGh5X2luZm8tPmxvY2FsX3J4ID0gKHBoeV9kYXRhICYgU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUl8xMDAwVF9MT0NBTF9SWF9TVEFUVVNfU0hJRlQ7CisKKyAgICAgICAgcGh5X2luZm8tPnJlbW90ZV9yeCA9IChwaHlfZGF0YSAmIFNSXzEwMDBUX1JFTU9URV9SWF9TVEFUVVMpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUl8xMDAwVF9SRU1PVEVfUlhfU1RBVFVTX1NISUZUOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEdldCBQSFkgaW5mb3JtYXRpb24gZnJvbSB2YXJpb3VzIFBIWSByZWdpc3RlcnMKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogcGh5X2luZm8gLSBQSFkgaW5mb3JtYXRpb24gc3RydWN0dXJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9waHlfZ2V0X2luZm8oc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeV9pbmZvKQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcGh5X2dldF9pbmZvIik7CisKKyAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gZTEwMDBfY2FibGVfbGVuZ3RoX3VuZGVmaW5lZDsKKyAgICBwaHlfaW5mby0+ZXh0ZW5kZWRfMTBidF9kaXN0YW5jZSA9IGUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlX3VuZGVmaW5lZDsKKyAgICBwaHlfaW5mby0+Y2FibGVfcG9sYXJpdHkgPSBlMTAwMF9yZXZfcG9sYXJpdHlfdW5kZWZpbmVkOworICAgIHBoeV9pbmZvLT5kb3duc2hpZnQgPSBlMTAwMF9kb3duc2hpZnRfdW5kZWZpbmVkOworICAgIHBoeV9pbmZvLT5wb2xhcml0eV9jb3JyZWN0aW9uID0gZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfdW5kZWZpbmVkOworICAgIHBoeV9pbmZvLT5tZGl4X21vZGUgPSBlMTAwMF9hdXRvX3hfbW9kZV91bmRlZmluZWQ7CisgICAgcGh5X2luZm8tPmxvY2FsX3J4ID0gZTEwMDBfMTAwMHRfcnhfc3RhdHVzX3VuZGVmaW5lZDsKKyAgICBwaHlfaW5mby0+cmVtb3RlX3J4ID0gZTEwMDBfMTAwMHRfcnhfc3RhdHVzX3VuZGVmaW5lZDsKKworICAgIGlmKGh3LT5tZWRpYV90eXBlICE9IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisgICAgICAgIERFQlVHT1VUKCJQSFkgaW5mbyBpcyBvbmx5IHZhbGlkIGZvciBjb3BwZXIgbWVkaWFcbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CisgICAgfQorCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBpZigocGh5X2RhdGEgJiBNSUlfU1JfTElOS19TVEFUVVMpICE9IE1JSV9TUl9MSU5LX1NUQVRVUykgeworICAgICAgICBERUJVR09VVCgiUEhZIGluZm8gaXMgb25seSB2YWxpZCBpZiBsaW5rIGlzIHVwXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOworICAgIH0KKworICAgIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKQorICAgICAgICByZXR1cm4gZTEwMDBfcGh5X2lncF9nZXRfaW5mbyhodywgcGh5X2luZm8pOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGUxMDAwX3BoeV9tODhfZ2V0X2luZm8oaHcsIHBoeV9pbmZvKTsKK30KKworaW50MzJfdAorZTEwMDBfdmFsaWRhdGVfbWRpX3NldHRpbmcoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBERUJVR0ZVTkMoImUxMDAwX3ZhbGlkYXRlX21kaV9zZXR0aW5ncyIpOworCisgICAgaWYoIWh3LT5hdXRvbmVnICYmIChody0+bWRpeCA9PSAwIHx8IGh3LT5tZGl4ID09IDMpKSB7CisgICAgICAgIERFQlVHT1VUKCJJbnZhbGlkIE1ESSBzZXR0aW5nIGRldGVjdGVkXG4iKTsKKyAgICAgICAgaHctPm1kaXggPSAxOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldHMgdXAgZWVwcm9tIHZhcmlhYmxlcyBpbiB0aGUgaHcgc3RydWN0LiAgTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbWFjX3R5cGUKKyAqIGlzIGNvbmZpZ3VyZWQuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CisgICAgdWludDMyX3QgZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKyAgICB1aW50MTZfdCBlZXByb21fc2l6ZTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfaW5pdF9lZXByb21fcGFyYW1zIik7CisKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorICAgIGNhc2UgZTEwMDBfODI1NDM6CisgICAgY2FzZSBlMTAwMF84MjU0NDoKKyAgICAgICAgZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZTsKKyAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKKyAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyA9IDM7CisgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gNjsKKyAgICAgICAgZWVwcm9tLT5kZWxheV91c2VjID0gNTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODI1NDA6CisgICAgY2FzZSBlMTAwMF84MjU0NToKKyAgICBjYXNlIGUxMDAwXzgyNTQ1X3Jldl8zOgorICAgIGNhc2UgZTEwMDBfODI1NDY6CisgICAgY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKKyAgICAgICAgZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZTsKKyAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyA9IDM7CisgICAgICAgIGVlcHJvbS0+ZGVsYXlfdXNlYyA9IDUwOworICAgICAgICBpZihlZWNkICYgRTEwMDBfRUVDRF9TSVpFKSB7CisgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDI1NjsKKyAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVlcHJvbS0+d29yZF9zaXplID0gNjQ7CisgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDY7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU0MToKKyAgICBjYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorICAgIGNhc2UgZTEwMDBfODI1NDc6CisgICAgY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKKyAgICAgICAgaWYgKGVlY2QgJiBFMTAwMF9FRUNEX1RZUEUpIHsKKyAgICAgICAgICAgIGVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9zcGk7CisgICAgICAgICAgICBlZXByb20tPm9wY29kZV9iaXRzID0gODsKKyAgICAgICAgICAgIGVlcHJvbS0+ZGVsYXlfdXNlYyA9IDE7CisgICAgICAgICAgICBpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfQUREUl9CSVRTKSB7CisgICAgICAgICAgICAgICAgZWVwcm9tLT5wYWdlX3NpemUgPSAzMjsKKyAgICAgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDE2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlZXByb20tPnBhZ2Vfc2l6ZSA9IDg7CisgICAgICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSA4OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWVwcm9tLT50eXBlID0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZTsKKyAgICAgICAgICAgIGVlcHJvbS0+b3Bjb2RlX2JpdHMgPSAzOworICAgICAgICAgICAgZWVwcm9tLT5kZWxheV91c2VjID0gNTA7CisgICAgICAgICAgICBpZiAoZWVjZCAmIEUxMDAwX0VFQ0RfQUREUl9CSVRTKSB7CisgICAgICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSAyNTY7CisgICAgICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSA4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDY0OworICAgICAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKKyAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKKyAgICAgICAgaWYgKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fQ0ZHLCAxLCAmZWVwcm9tX3NpemUpID09IDApIHsKKyAgICAgICAgICAgIGVlcHJvbV9zaXplICY9IEVFUFJPTV9TSVpFX01BU0s7CisKKyAgICAgICAgICAgIHN3aXRjaCAoZWVwcm9tX3NpemUpIHsKKyAgICAgICAgICAgIGNhc2UgRUVQUk9NX1NJWkVfMTZLQjoKKyAgICAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDgxOTI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVFUFJPTV9TSVpFXzhLQjoKKyAgICAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDQwOTY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVFUFJPTV9TSVpFXzRLQjoKKyAgICAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDIwNDg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVFUFJPTV9TSVpFXzJLQjoKKyAgICAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDEwMjQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVFUFJPTV9TSVpFXzFLQjoKKyAgICAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDUxMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUVQUk9NX1NJWkVfNTEyQjoKKyAgICAgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDI1NjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUVQUk9NX1NJWkVfMTI4QjoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFpc2VzIHRoZSBFRVBST00ncyBjbG9jayBpbnB1dC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogZWVjZCAtIEVFQ0QncyBjdXJyZW50IHZhbHVlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfcmFpc2VfZWVfY2xrKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmVlY2QpCit7CisgICAgLyogUmFpc2UgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBFRVBST00gKGJ5IHNldHRpbmcgdGhlIFNLIGJpdCksIGFuZCB0aGVuCisgICAgICogd2FpdCA8ZGVsYXk+IG1pY3Jvc2Vjb25kcy4KKyAgICAgKi8KKyAgICAqZWVjZCA9ICplZWNkIHwgRTEwMDBfRUVDRF9TSzsKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsICplZWNkKTsKKyAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgdWRlbGF5KGh3LT5lZXByb20uZGVsYXlfdXNlYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExvd2VycyB0aGUgRUVQUk9NJ3MgY2xvY2sgaW5wdXQuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIGVlY2QgLSBFRUNEJ3MgY3VycmVudCB2YWx1ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX2xvd2VyX2VlX2NsayhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICplZWNkKQoreworICAgIC8qIExvd2VyIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgRUVQUk9NIChieSBjbGVhcmluZyB0aGUgU0sgYml0KSwgYW5kIHRoZW4KKyAgICAgKiB3YWl0IDUwIG1pY3Jvc2Vjb25kcy4KKyAgICAgKi8KKyAgICAqZWVjZCA9ICplZWNkICYgfkUxMDAwX0VFQ0RfU0s7CisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCAqZWVjZCk7CisgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgIHVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTaGlmdCBkYXRhIGJpdHMgb3V0IHRvIHRoZSBFRVBST00uCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIGRhdGEgLSBkYXRhIHRvIHNlbmQgdG8gdGhlIEVFUFJPTQorICogY291bnQgLSBudW1iZXIgb2YgYml0cyB0byBzaGlmdCBvdXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50KQoreworICAgIHN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CisgICAgdWludDMyX3QgZWVjZDsKKyAgICB1aW50MzJfdCBtYXNrOworCisgICAgLyogV2UgbmVlZCB0byBzaGlmdCAiY291bnQiIGJpdHMgb3V0IHRvIHRoZSBFRVBST00uIFNvLCB2YWx1ZSBpbiB0aGUKKyAgICAgKiAiZGF0YSIgcGFyYW1ldGVyIHdpbGwgYmUgc2hpZnRlZCBvdXQgdG8gdGhlIEVFUFJPTSBvbmUgYml0IGF0IGEgdGltZS4KKyAgICAgKiBJbiBvcmRlciB0byBkbyB0aGlzLCAiZGF0YSIgbXVzdCBiZSBicm9rZW4gZG93biBpbnRvIGJpdHMuCisgICAgICovCisgICAgbWFzayA9IDB4MDEgPDwgKGNvdW50IC0gMSk7CisgICAgZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKyAgICBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKKyAgICAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9ETzsKKyAgICB9IGVsc2UgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fc3BpKSB7CisgICAgICAgIGVlY2QgfD0gRTEwMDBfRUVDRF9ETzsKKyAgICB9CisgICAgZG8geworICAgICAgICAvKiBBICIxIiBpcyBzaGlmdGVkIG91dCB0byB0aGUgRUVQUk9NIGJ5IHNldHRpbmcgYml0ICJESSIgdG8gYSAiMSIsCisgICAgICAgICAqIGFuZCB0aGVuIHJhaXNpbmcgYW5kIHRoZW4gbG93ZXJpbmcgdGhlIGNsb2NrICh0aGUgU0sgYml0IGNvbnRyb2xzCisgICAgICAgICAqIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgRUVQUk9NKS4gIEEgIjAiIGlzIHNoaWZ0ZWQgb3V0IHRvIHRoZSBFRVBST00KKyAgICAgICAgICogYnkgc2V0dGluZyAiREkiIHRvICIwIiBhbmQgdGhlbiByYWlzaW5nIGFuZCB0aGVuIGxvd2VyaW5nIHRoZSBjbG9jay4KKyAgICAgICAgICovCisgICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfREk7CisKKyAgICAgICAgaWYoZGF0YSAmIG1hc2spCisgICAgICAgICAgICBlZWNkIHw9IEUxMDAwX0VFQ0RfREk7CisKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCisgICAgICAgIHVkZWxheShlZXByb20tPmRlbGF5X3VzZWMpOworCisgICAgICAgIGUxMDAwX3JhaXNlX2VlX2NsayhodywgJmVlY2QpOworICAgICAgICBlMTAwMF9sb3dlcl9lZV9jbGsoaHcsICZlZWNkKTsKKworICAgICAgICBtYXNrID0gbWFzayA+PiAxOworCisgICAgfSB3aGlsZShtYXNrKTsKKworICAgIC8qIFdlIGxlYXZlIHRoZSAiREkiIGJpdCBzZXQgdG8gIjAiIHdoZW4gd2UgbGVhdmUgdGhpcyByb3V0aW5lLiAqLworICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfREk7CisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2hpZnQgZGF0YSBiaXRzIGluIGZyb20gdGhlIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWludDE2X3QKK2UxMDAwX3NoaWZ0X2luX2VlX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY291bnQpCit7CisgICAgdWludDMyX3QgZWVjZDsKKyAgICB1aW50MzJfdCBpOworICAgIHVpbnQxNl90IGRhdGE7CisKKyAgICAvKiBJbiBvcmRlciB0byByZWFkIGEgcmVnaXN0ZXIgZnJvbSB0aGUgRUVQUk9NLCB3ZSBuZWVkIHRvIHNoaWZ0ICdjb3VudCcKKyAgICAgKiBiaXRzIGluIGZyb20gdGhlIEVFUFJPTS4gQml0cyBhcmUgInNoaWZ0ZWQgaW4iIGJ5IHJhaXNpbmcgdGhlIGNsb2NrCisgICAgICogaW5wdXQgdG8gdGhlIEVFUFJPTSAoc2V0dGluZyB0aGUgU0sgYml0KSwgYW5kIHRoZW4gcmVhZGluZyB0aGUgdmFsdWUgb2YKKyAgICAgKiB0aGUgIkRPIiBiaXQuICBEdXJpbmcgdGhpcyAic2hpZnRpbmcgaW4iIHByb2Nlc3MgdGhlICJESSIgYml0IHNob3VsZAorICAgICAqIGFsd2F5cyBiZSBjbGVhci4KKyAgICAgKi8KKworICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisKKyAgICBlZWNkICY9IH4oRTEwMDBfRUVDRF9ETyB8IEUxMDAwX0VFQ0RfREkpOworICAgIGRhdGEgPSAwOworCisgICAgZm9yKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBkYXRhID0gZGF0YSA8PCAxOworICAgICAgICBlMTAwMF9yYWlzZV9lZV9jbGsoaHcsICZlZWNkKTsKKworICAgICAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisgICAgICAgIGVlY2QgJj0gfihFMTAwMF9FRUNEX0RJKTsKKyAgICAgICAgaWYoZWVjZCAmIEUxMDAwX0VFQ0RfRE8pCisgICAgICAgICAgICBkYXRhIHw9IDE7CisKKyAgICAgICAgZTEwMDBfbG93ZXJfZWVfY2xrKGh3LCAmZWVjZCk7CisgICAgfQorCisgICAgcmV0dXJuIGRhdGE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByZXBhcmVzIEVFUFJPTSBmb3IgYWNjZXNzCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBMb3dlcnMgRUVQUk9NIGNsb2NrLiBDbGVhcnMgaW5wdXQgcGluLiBTZXRzIHRoZSBjaGlwIHNlbGVjdCBwaW4uIFRoaXMKKyAqIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGlzc3VpbmcgYSBjb21tYW5kIHRvIHRoZSBFRVBST00uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfYWNxdWlyZV9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworICAgIHVpbnQzMl90IGVlY2QsIGk9MDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfYWNxdWlyZV9lZXByb20iKTsKKworICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisKKyAgICAvKiBSZXF1ZXN0IEVFUFJPTSBBY2Nlc3MgKi8KKyAgICBpZihody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0NCkgeworICAgICAgICBlZWNkIHw9IEUxMDAwX0VFQ0RfUkVROworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworICAgICAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworICAgICAgICB3aGlsZSgoIShlZWNkICYgRTEwMDBfRUVDRF9HTlQpKSAmJgorICAgICAgICAgICAgICAoaSA8IEUxMDAwX0VFUFJPTV9HUkFOVF9BVFRFTVBUUykpIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIHVkZWxheSg1KTsKKyAgICAgICAgICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIShlZWNkICYgRTEwMDBfRUVDRF9HTlQpKSB7CisgICAgICAgICAgICBlZWNkICY9IH5FMTAwMF9FRUNEX1JFUTsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgICAgICAgICBERUJVR09VVCgiQ291bGQgbm90IGFjcXVpcmUgRUVQUk9NIGdyYW50XG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNldHVwIEVFUFJPTSBmb3IgUmVhZC9Xcml0ZSAqLworCisgICAgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fbWljcm93aXJlKSB7CisgICAgICAgIC8qIENsZWFyIFNLIGFuZCBESSAqLworICAgICAgICBlZWNkICY9IH4oRTEwMDBfRUVDRF9ESSB8IEUxMDAwX0VFQ0RfU0spOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCisgICAgICAgIC8qIFNldCBDUyAqLworICAgICAgICBlZWNkIHw9IEUxMDAwX0VFQ0RfQ1M7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgfSBlbHNlIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkgeworICAgICAgICAvKiBDbGVhciBTSyBhbmQgQ1MgKi8KKyAgICAgICAgZWVjZCAmPSB+KEUxMDAwX0VFQ0RfQ1MgfCBFMTAwMF9FRUNEX1NLKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgdWRlbGF5KDEpOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXR1cm5zIEVFUFJPTSB0byBhICJzdGFuZGJ5IiBzdGF0ZQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfc3RhbmRieV9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworICAgIHVpbnQzMl90IGVlY2Q7CisKKyAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisgICAgaWYoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKKyAgICAgICAgZWVjZCAmPSB+KEUxMDAwX0VFQ0RfQ1MgfCBFMTAwMF9FRUNEX1NLKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgICAgICB1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKKworICAgICAgICAvKiBDbG9jayBoaWdoICovCisgICAgICAgIGVlY2QgfD0gRTEwMDBfRUVDRF9TSzsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgICAgICB1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKKworICAgICAgICAvKiBTZWxlY3QgRUVQUk9NICovCisgICAgICAgIGVlY2QgfD0gRTEwMDBfRUVDRF9DUzsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgICAgICB1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKKworICAgICAgICAvKiBDbG9jayBsb3cgKi8KKyAgICAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9TSzsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgICAgICB1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKKyAgICB9IGVsc2UgaWYoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKKyAgICAgICAgLyogVG9nZ2xlIENTIHRvIGZsdXNoIGNvbW1hbmRzICovCisgICAgICAgIGVlY2QgfD0gRTEwMDBfRUVDRF9DUzsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgICAgICB1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKKyAgICAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9DUzsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgICAgICB1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlcm1pbmF0ZXMgYSBjb21tYW5kIGJ5IGludmVydGluZyB0aGUgRUVQUk9NJ3MgY2hpcCBzZWxlY3QgcGluCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9yZWxlYXNlX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGVlY2Q7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3JlbGVhc2VfZWVwcm9tIik7CisKKyAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisgICAgaWYgKGh3LT5lZXByb20udHlwZSA9PSBlMTAwMF9lZXByb21fc3BpKSB7CisgICAgICAgIGVlY2QgfD0gRTEwMDBfRUVDRF9DUzsgIC8qIFB1bGwgQ1MgaGlnaCAqLworICAgICAgICBlZWNkICY9IH5FMTAwMF9FRUNEX1NLOyAvKiBMb3dlciBTQ0sgKi8KKworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCisgICAgICAgIHVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOworICAgIH0gZWxzZSBpZihody0+ZWVwcm9tLnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgeworICAgICAgICAvKiBjbGVhbnVwIGVlcHJvbSAqLworCisgICAgICAgIC8qIENTIG9uIE1pY3Jvd2lyZSBpcyBhY3RpdmUtaGlnaCAqLworICAgICAgICBlZWNkICY9IH4oRTEwMDBfRUVDRF9DUyB8IEUxMDAwX0VFQ0RfREkpOworCisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisKKyAgICAgICAgLyogUmlzaW5nIGVkZ2Ugb2YgY2xvY2sgKi8KKyAgICAgICAgZWVjZCB8PSBFMTAwMF9FRUNEX1NLOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgIHVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOworCisgICAgICAgIC8qIEZhbGxpbmcgZWRnZSBvZiBjbG9jayAqLworICAgICAgICBlZWNkICY9IH5FMTAwMF9FRUNEX1NLOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgIHVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOworICAgIH0KKworICAgIC8qIFN0b3AgcmVxdWVzdGluZyBFRVBST00gYWNjZXNzICovCisgICAgaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDQpIHsKKyAgICAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9SRVE7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWFkcyBhIDE2IGJpdCB3b3JkIGZyb20gdGhlIEVFUFJPTS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfc3BpX2VlcHJvbV9yZWFkeShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQxNl90IHJldHJ5X2NvdW50ID0gMDsKKyAgICB1aW50OF90IHNwaV9zdGF0X3JlZzsKKworICAgIERFQlVHRlVOQygiZTEwMDBfc3BpX2VlcHJvbV9yZWFkeSIpOworCisgICAgLyogUmVhZCAiU3RhdHVzIFJlZ2lzdGVyIiByZXBlYXRlZGx5IHVudGlsIHRoZSBMU0IgaXMgY2xlYXJlZC4gIFRoZQorICAgICAqIEVFUFJPTSB3aWxsIHNpZ25hbCB0aGF0IHRoZSBjb21tYW5kIGhhcyBiZWVuIGNvbXBsZXRlZCBieSBjbGVhcmluZworICAgICAqIGJpdCAwIG9mIHRoZSBpbnRlcm5hbCBzdGF0dXMgcmVnaXN0ZXIuICBJZiBpdCdzIG5vdCBjbGVhcmVkIHdpdGhpbgorICAgICAqIDUgbWlsbGlzZWNvbmRzLCB0aGVuIGVycm9yIG91dC4KKyAgICAgKi8KKyAgICByZXRyeV9jb3VudCA9IDA7CisgICAgZG8geworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgRUVQUk9NX1JEU1JfT1BDT0RFX1NQSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHctPmVlcHJvbS5vcGNvZGVfYml0cyk7CisgICAgICAgIHNwaV9zdGF0X3JlZyA9ICh1aW50OF90KWUxMDAwX3NoaWZ0X2luX2VlX2JpdHMoaHcsIDgpOworICAgICAgICBpZiAoIShzcGlfc3RhdF9yZWcgJiBFRVBST01fU1RBVFVTX1JEWV9TUEkpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgdWRlbGF5KDUpOworICAgICAgICByZXRyeV9jb3VudCArPSA1OworCisgICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKKyAgICB9IHdoaWxlKHJldHJ5X2NvdW50IDwgRUVQUk9NX01BWF9SRVRSWV9TUEkpOworCisgICAgLyogQVRNRUwgU1BJIHdyaXRlIHRpbWUgY291bGQgdmFyeSBmcm9tIDAtMjBtU2VjIG9uIDMuM1YgZGV2aWNlcyAoYW5kCisgICAgICogb25seSAwLTVtU2VjIG9uIDVWIGRldmljZXMpCisgICAgICovCisgICAgaWYocmV0cnlfY291bnQgPj0gRUVQUk9NX01BWF9SRVRSWV9TUEkpIHsKKyAgICAgICAgREVCVUdPVVQoIlNQSSBFRVBST00gU3RhdHVzIGVycm9yXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWFkcyBhIDE2IGJpdCB3b3JkIGZyb20gdGhlIEVFUFJPTS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogb2Zmc2V0IC0gb2Zmc2V0IG9mICB3b3JkIGluIHRoZSBFRVBST00gdG8gcmVhZAorICogZGF0YSAtIHdvcmQgcmVhZCBmcm9tIHRoZSBFRVBST00KKyAqIHdvcmRzIC0gbnVtYmVyIG9mIHdvcmRzIHRvIHJlYWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3JlYWRfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICB1aW50MTZfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICB1aW50MTZfdCB3b3JkcywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkYXRhKQoreworICAgIHN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CisgICAgdWludDMyX3QgaSA9IDA7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3JlYWRfZWVwcm9tIik7CisgICAgLyogQSBjaGVjayBmb3IgaW52YWxpZCB2YWx1ZXM6ICBvZmZzZXQgdG9vIGxhcmdlLCB0b28gbWFueSB3b3JkcywgYW5kIG5vdAorICAgICAqIGVub3VnaCB3b3Jkcy4KKyAgICAgKi8KKyAgICBpZigob2Zmc2V0ID49IGVlcHJvbS0+d29yZF9zaXplKSB8fCAod29yZHMgPiBlZXByb20tPndvcmRfc2l6ZSAtIG9mZnNldCkgfHwKKyAgICAgICAod29yZHMgPT0gMCkpIHsKKyAgICAgICAgREVCVUdPVVQoIlwid29yZHNcIiBwYXJhbWV0ZXIgb3V0IG9mIGJvdW5kc1xuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICB9CisKKyAgICAvKiBQcmVwYXJlIHRoZSBFRVBST00gZm9yIHJlYWRpbmcgICovCisgICAgaWYoZTEwMDBfYWNxdWlyZV9lZXByb20oaHcpICE9IEUxMDAwX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKworICAgIGlmKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fc3BpKSB7CisgICAgICAgIHVpbnQxNl90IHdvcmRfaW47CisgICAgICAgIHVpbnQ4X3QgcmVhZF9vcGNvZGUgPSBFRVBST01fUkVBRF9PUENPREVfU1BJOworCisgICAgICAgIGlmKGUxMDAwX3NwaV9lZXByb21fcmVhZHkoaHcpKSB7CisgICAgICAgICAgICBlMTAwMF9yZWxlYXNlX2VlcHJvbShodyk7CisgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgICAgIH0KKworICAgICAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisKKyAgICAgICAgLyogU29tZSBTUEkgZWVwcm9tcyB1c2UgdGhlIDh0aCBhZGRyZXNzIGJpdCBlbWJlZGRlZCBpbiB0aGUgb3Bjb2RlICovCisgICAgICAgIGlmKChlZXByb20tPmFkZHJlc3NfYml0cyA9PSA4KSAmJiAob2Zmc2V0ID49IDEyOCkpCisgICAgICAgICAgICByZWFkX29wY29kZSB8PSBFRVBST01fQThfT1BDT0RFX1NQSTsKKworICAgICAgICAvKiBTZW5kIHRoZSBSRUFEIGNvbW1hbmQgKG9wY29kZSArIGFkZHIpICAqLworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgcmVhZF9vcGNvZGUsIGVlcHJvbS0+b3Bjb2RlX2JpdHMpOworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgKHVpbnQxNl90KShvZmZzZXQqMiksIGVlcHJvbS0+YWRkcmVzc19iaXRzKTsKKworICAgICAgICAvKiBSZWFkIHRoZSBkYXRhLiAgVGhlIGFkZHJlc3Mgb2YgdGhlIGVlcHJvbSBpbnRlcm5hbGx5IGluY3JlbWVudHMgd2l0aAorICAgICAgICAgKiBlYWNoIGJ5dGUgKHNwaSkgYmVpbmcgcmVhZCwgc2F2aW5nIG9uIHRoZSBvdmVyaGVhZCBvZiBlZXByb20gc2V0dXAKKyAgICAgICAgICogYW5kIHRlYXItZG93bi4gIFRoZSBhZGRyZXNzIGNvdW50ZXIgd2lsbCByb2xsIG92ZXIgaWYgcmVhZGluZyBiZXlvbmQKKyAgICAgICAgICogdGhlIHNpemUgb2YgdGhlIGVlcHJvbSwgdGh1cyBhbGxvd2luZyB0aGUgZW50aXJlIG1lbW9yeSB0byBiZSByZWFkCisgICAgICAgICAqIHN0YXJ0aW5nIGZyb20gYW55IG9mZnNldC4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIHdvcmRfaW4gPSBlMTAwMF9zaGlmdF9pbl9lZV9iaXRzKGh3LCAxNik7CisgICAgICAgICAgICBkYXRhW2ldID0gKHdvcmRfaW4gPj4gOCkgfCAod29yZF9pbiA8PCA4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZihlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgeworICAgICAgICAgICAgLyogU2VuZCB0aGUgUkVBRCBjb21tYW5kIChvcGNvZGUgKyBhZGRyKSAgKi8KKyAgICAgICAgICAgIGUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCBFRVBST01fUkVBRF9PUENPREVfTUlDUk9XSVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyk7CisgICAgICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgKHVpbnQxNl90KShvZmZzZXQgKyBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzKTsKKworICAgICAgICAgICAgLyogUmVhZCB0aGUgZGF0YS4gIEZvciBtaWNyb3dpcmUsIGVhY2ggd29yZCByZXF1aXJlcyB0aGUgb3ZlcmhlYWQKKyAgICAgICAgICAgICAqIG9mIGVlcHJvbSBzZXR1cCBhbmQgdGVhci1kb3duLiAqLworICAgICAgICAgICAgZGF0YVtpXSA9IGUxMDAwX3NoaWZ0X2luX2VlX2JpdHMoaHcsIDE2KTsKKyAgICAgICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEVuZCB0aGlzIHJlYWQgb3BlcmF0aW9uICovCisgICAgZTEwMDBfcmVsZWFzZV9lZXByb20oaHcpOworCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZlcmlmaWVzIHRoYXQgdGhlIEVFUFJPTSBoYXMgYSB2YWxpZCBjaGVja3N1bQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogUmVhZHMgdGhlIGZpcnN0IDY0IDE2IGJpdCB3b3JkcyBvZiB0aGUgRUVQUk9NIGFuZCBzdW1zIHRoZSB2YWx1ZXMgcmVhZC4KKyAqIElmIHRoZSB0aGUgc3VtIG9mIHRoZSA2NCAxNiBiaXQgd29yZHMgaXMgMHhCQUJBLCB0aGUgRUVQUk9NJ3MgY2hlY2tzdW0gaXMKKyAqIHZhbGlkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDE2X3QgY2hlY2tzdW0gPSAwOworICAgIHVpbnQxNl90IGksIGVlcHJvbV9kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF92YWxpZGF0ZV9lZXByb21fY2hlY2tzdW0iKTsKKworICAgIGZvcihpID0gMDsgaSA8IChFRVBST01fQ0hFQ0tTVU1fUkVHICsgMSk7IGkrKykgeworICAgICAgICBpZihlMTAwMF9yZWFkX2VlcHJvbShodywgaSwgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJFRVBST00gUmVhZCBFcnJvclxuIik7CisgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tzdW0gKz0gZWVwcm9tX2RhdGE7CisgICAgfQorCisgICAgaWYoY2hlY2tzdW0gPT0gKHVpbnQxNl90KSBFRVBST01fU1VNKQorICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKyAgICBlbHNlIHsKKyAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBDaGVja3N1bSBJbnZhbGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2FsY3VsYXRlcyB0aGUgRUVQUk9NIGNoZWNrc3VtIGFuZCB3cml0ZXMgaXQgdG8gdGhlIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogU3VtcyB0aGUgZmlyc3QgNjMgMTYgYml0IHdvcmRzIG9mIHRoZSBFRVBST00uIFN1YnRyYWN0cyB0aGUgc3VtIGZyb20gMHhCQUJBLgorICogV3JpdGVzIHRoZSBkaWZmZXJlbmNlIHRvIHdvcmQgb2Zmc2V0IDYzIG9mIHRoZSBFRVBST00uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF91cGRhdGVfZWVwcm9tX2NoZWNrc3VtKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDE2X3QgY2hlY2tzdW0gPSAwOworICAgIHVpbnQxNl90IGksIGVlcHJvbV9kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF91cGRhdGVfZWVwcm9tX2NoZWNrc3VtIik7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBFRVBST01fQ0hFQ0tTVU1fUkVHOyBpKyspIHsKKyAgICAgICAgaWYoZTEwMDBfcmVhZF9lZXByb20oaHcsIGksIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CisgICAgICAgICAgICBERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgICAgICB9CisgICAgICAgIGNoZWNrc3VtICs9IGVlcHJvbV9kYXRhOworICAgIH0KKyAgICBjaGVja3N1bSA9ICh1aW50MTZfdCkgRUVQUk9NX1NVTSAtIGNoZWNrc3VtOworICAgIGlmKGUxMDAwX3dyaXRlX2VlcHJvbShodywgRUVQUk9NX0NIRUNLU1VNX1JFRywgMSwgJmNoZWNrc3VtKSA8IDApIHsKKyAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBXcml0ZSBFcnJvclxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBhcmVudCBmdW5jdGlvbiBmb3Igd3JpdGluZyB3b3JkcyB0byB0aGUgZGlmZmVyZW50IEVFUFJPTSB0eXBlcy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogb2Zmc2V0IC0gb2Zmc2V0IHdpdGhpbiB0aGUgRUVQUk9NIHRvIGJlIHdyaXR0ZW4gdG8KKyAqIHdvcmRzIC0gbnVtYmVyIG9mIHdvcmRzIHRvIHdyaXRlCisgKiBkYXRhIC0gMTYgYml0IHdvcmQgdG8gYmUgd3JpdHRlbiB0byB0aGUgRUVQUk9NCisgKgorICogSWYgZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bSBpcyBub3QgY2FsbGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZQorICogRUVQUk9NIHdpbGwgbW9zdCBsaWtlbHkgY29udGFpbiBhbiBpbnZhbGlkIGNoZWNrc3VtLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfd3JpdGVfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdvcmRzLAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkYXRhKQoreworICAgIHN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CisgICAgaW50MzJfdCBzdGF0dXMgPSAwOworCisgICAgREVCVUdGVU5DKCJlMTAwMF93cml0ZV9lZXByb20iKTsKKworICAgIC8qIEEgY2hlY2sgZm9yIGludmFsaWQgdmFsdWVzOiAgb2Zmc2V0IHRvbyBsYXJnZSwgdG9vIG1hbnkgd29yZHMsIGFuZCBub3QKKyAgICAgKiBlbm91Z2ggd29yZHMuCisgICAgICovCisgICAgaWYoKG9mZnNldCA+PSBlZXByb20tPndvcmRfc2l6ZSkgfHwgKHdvcmRzID4gZWVwcm9tLT53b3JkX3NpemUgLSBvZmZzZXQpIHx8CisgICAgICAgKHdvcmRzID09IDApKSB7CisgICAgICAgIERFQlVHT1VUKCJcIndvcmRzXCIgcGFyYW1ldGVyIG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgfQorCisgICAgLyogUHJlcGFyZSB0aGUgRUVQUk9NIGZvciB3cml0aW5nICAqLworICAgIGlmIChlMTAwMF9hY3F1aXJlX2VlcHJvbShodykgIT0gRTEwMDBfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCisgICAgaWYoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKKyAgICAgICAgc3RhdHVzID0gZTEwMDBfd3JpdGVfZWVwcm9tX21pY3Jvd2lyZShodywgb2Zmc2V0LCB3b3JkcywgZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gZTEwMDBfd3JpdGVfZWVwcm9tX3NwaShodywgb2Zmc2V0LCB3b3JkcywgZGF0YSk7CisgICAgICAgIG1zZWNfZGVsYXkoMTApOworICAgIH0KKworICAgIC8qIERvbmUgd2l0aCB3cml0aW5nICovCisgICAgZTEwMDBfcmVsZWFzZV9lZXByb20oaHcpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV3JpdGVzIGEgMTYgYml0IHdvcmQgdG8gYSBnaXZlbiBvZmZzZXQgaW4gYW4gU1BJIEVFUFJPTS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogb2Zmc2V0IC0gb2Zmc2V0IHdpdGhpbiB0aGUgRUVQUk9NIHRvIGJlIHdyaXR0ZW4gdG8KKyAqIHdvcmRzIC0gbnVtYmVyIG9mIHdvcmRzIHRvIHdyaXRlCisgKiBkYXRhIC0gcG9pbnRlciB0byBhcnJheSBvZiA4IGJpdCB3b3JkcyB0byBiZSB3cml0dGVuIHRvIHRoZSBFRVBST00KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF93cml0ZV9lZXByb21fc3BpKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkYXRhKQoreworICAgIHN0cnVjdCBlMTAwMF9lZXByb21faW5mbyAqZWVwcm9tID0gJmh3LT5lZXByb207CisgICAgdWludDE2X3Qgd2lkeCA9IDA7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3dyaXRlX2VlcHJvbV9zcGkiKTsKKworICAgIHdoaWxlICh3aWR4IDwgd29yZHMpIHsKKyAgICAgICAgdWludDhfdCB3cml0ZV9vcGNvZGUgPSBFRVBST01fV1JJVEVfT1BDT0RFX1NQSTsKKworICAgICAgICBpZihlMTAwMF9zcGlfZWVwcm9tX3JlYWR5KGh3KSkgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworCisgICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKKworICAgICAgICAvKiAgU2VuZCB0aGUgV1JJVEUgRU5BQkxFIGNvbW1hbmQgKDggYml0IG9wY29kZSApICAqLworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgRUVQUk9NX1dSRU5fT1BDT0RFX1NQSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbS0+b3Bjb2RlX2JpdHMpOworCisgICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKKworICAgICAgICAvKiBTb21lIFNQSSBlZXByb21zIHVzZSB0aGUgOHRoIGFkZHJlc3MgYml0IGVtYmVkZGVkIGluIHRoZSBvcGNvZGUgKi8KKyAgICAgICAgaWYoKGVlcHJvbS0+YWRkcmVzc19iaXRzID09IDgpICYmIChvZmZzZXQgPj0gMTI4KSkKKyAgICAgICAgICAgIHdyaXRlX29wY29kZSB8PSBFRVBST01fQThfT1BDT0RFX1NQSTsKKworICAgICAgICAvKiBTZW5kIHRoZSBXcml0ZSBjb21tYW5kICg4LWJpdCBvcGNvZGUgKyBhZGRyKSAqLworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgd3JpdGVfb3Bjb2RlLCBlZXByb20tPm9wY29kZV9iaXRzKTsKKworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgKHVpbnQxNl90KSgob2Zmc2V0ICsgd2lkeCkqMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzKTsKKworICAgICAgICAvKiBTZW5kIHRoZSBkYXRhICovCisKKyAgICAgICAgLyogTG9vcCB0byBhbGxvdyBmb3IgdXAgdG8gd2hvbGUgcGFnZSB3cml0ZSAoMzIgYnl0ZXMpIG9mIGVlcHJvbSAqLworICAgICAgICB3aGlsZSAod2lkeCA8IHdvcmRzKSB7CisgICAgICAgICAgICB1aW50MTZfdCB3b3JkX291dCA9IGRhdGFbd2lkeF07CisgICAgICAgICAgICB3b3JkX291dCA9ICh3b3JkX291dCA+PiA4KSB8ICh3b3JkX291dCA8PCA4KTsKKyAgICAgICAgICAgIGUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCB3b3JkX291dCwgMTYpOworICAgICAgICAgICAgd2lkeCsrOworCisgICAgICAgICAgICAvKiBTb21lIGxhcmdlciBlZXByb20gc2l6ZXMgYXJlIGNhcGFibGUgb2YgYSAzMi1ieXRlIFBBR0UgV1JJVEUKKyAgICAgICAgICAgICAqIG9wZXJhdGlvbiwgd2hpbGUgdGhlIHNtYWxsZXIgZWVwcm9tcyBhcmUgY2FwYWJsZSBvZiBhbiA4LWJ5dGUKKyAgICAgICAgICAgICAqIFBBR0UgV1JJVEUgb3BlcmF0aW9uLiAgQnJlYWsgdGhlIGlubmVyIGxvb3AgdG8gcGFzcyBuZXcgYWRkcmVzcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZigoKChvZmZzZXQgKyB3aWR4KSoyKSAlIGVlcHJvbS0+cGFnZV9zaXplKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFdyaXRlcyBhIDE2IGJpdCB3b3JkIHRvIGEgZ2l2ZW4gb2Zmc2V0IGluIGEgTWljcm93aXJlIEVFUFJPTS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogb2Zmc2V0IC0gb2Zmc2V0IHdpdGhpbiB0aGUgRUVQUk9NIHRvIGJlIHdyaXR0ZW4gdG8KKyAqIHdvcmRzIC0gbnVtYmVyIG9mIHdvcmRzIHRvIHdyaXRlCisgKiBkYXRhIC0gcG9pbnRlciB0byBhcnJheSBvZiAxNiBiaXQgd29yZHMgdG8gYmUgd3JpdHRlbiB0byB0aGUgRUVQUk9NCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfd3JpdGVfZWVwcm9tX21pY3Jvd2lyZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZGF0YSkKK3sKKyAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworICAgIHVpbnQzMl90IGVlY2Q7CisgICAgdWludDE2X3Qgd29yZHNfd3JpdHRlbiA9IDA7CisgICAgdWludDE2X3QgaSA9IDA7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3dyaXRlX2VlcHJvbV9taWNyb3dpcmUiKTsKKworICAgIC8qIFNlbmQgdGhlIHdyaXRlIGVuYWJsZSBjb21tYW5kIHRvIHRoZSBFRVBST00gKDMtYml0IG9wY29kZSBwbHVzCisgICAgICogNi84LWJpdCBkdW1teSBhZGRyZXNzIGJlZ2lubmluZyB3aXRoIDExKS4gIEl0J3MgbGVzcyB3b3JrIHRvIGluY2x1ZGUKKyAgICAgKiB0aGUgMTEgb2YgdGhlIGR1bW15IGFkZHJlc3MgYXMgcGFydCBvZiB0aGUgb3Bjb2RlIHRoYW4gaXQgaXMgdG8gc2hpZnQKKyAgICAgKiBpdCBvdmVyIHRoZSBjb3JyZWN0IG51bWJlciBvZiBiaXRzIGZvciB0aGUgYWRkcmVzcy4gIFRoaXMgcHV0cyB0aGUKKyAgICAgKiBFRVBST00gaW50byB3cml0ZS9lcmFzZSBtb2RlLgorICAgICAqLworICAgIGUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCBFRVBST01fRVdFTl9PUENPREVfTUlDUk9XSVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCkoZWVwcm9tLT5vcGNvZGVfYml0cyArIDIpKTsKKworICAgIGUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCAwLCAodWludDE2X3QpKGVlcHJvbS0+YWRkcmVzc19iaXRzIC0gMikpOworCisgICAgLyogUHJlcGFyZSB0aGUgRUVQUk9NICovCisgICAgZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOworCisgICAgd2hpbGUgKHdvcmRzX3dyaXR0ZW4gPCB3b3JkcykgeworICAgICAgICAvKiBTZW5kIHRoZSBXcml0ZSBjb21tYW5kICgzLWJpdCBvcGNvZGUgKyBhZGRyKSAqLworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgRUVQUk9NX1dSSVRFX09QQ09ERV9NSUNST1dJUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbS0+b3Bjb2RlX2JpdHMpOworCisgICAgICAgIGUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCAodWludDE2X3QpKG9mZnNldCArIHdvcmRzX3dyaXR0ZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyk7CisKKyAgICAgICAgLyogU2VuZCB0aGUgZGF0YSAqLworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgZGF0YVt3b3Jkc193cml0dGVuXSwgMTYpOworCisgICAgICAgIC8qIFRvZ2dsZSB0aGUgQ1MgbGluZS4gIFRoaXMgaW4gZWZmZWN0IHRlbGxzIHRoZSBFRVBST00gdG8gZXhlY3V0ZQorICAgICAgICAgKiB0aGUgcHJldmlvdXMgY29tbWFuZC4KKyAgICAgICAgICovCisgICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKKworICAgICAgICAvKiBSZWFkIERPIHJlcGVhdGVkbHkgdW50aWwgaXQgaXMgaGlnaCAoZXF1YWwgdG8gJzEnKS4gIFRoZSBFRVBST00gd2lsbAorICAgICAgICAgKiBzaWduYWwgdGhhdCB0aGUgY29tbWFuZCBoYXMgYmVlbiBjb21wbGV0ZWQgYnkgcmFpc2luZyB0aGUgRE8gc2lnbmFsLgorICAgICAgICAgKiBJZiBETyBkb2VzIG5vdCBnbyBoaWdoIGluIDEwIG1pbGxpc2Vjb25kcywgdGhlbiBlcnJvciBvdXQuCisgICAgICAgICAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCAyMDA7IGkrKykgeworICAgICAgICAgICAgZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKyAgICAgICAgICAgIGlmKGVlY2QgJiBFMTAwMF9FRUNEX0RPKSBicmVhazsKKyAgICAgICAgICAgIHVkZWxheSg1MCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoaSA9PSAyMDApIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJFRVBST00gV3JpdGUgZGlkIG5vdCBjb21wbGV0ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgICAgIH0KKworICAgICAgICAvKiBSZWNvdmVyIGZyb20gd3JpdGUgKi8KKyAgICAgICAgZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOworCisgICAgICAgIHdvcmRzX3dyaXR0ZW4rKzsKKyAgICB9CisKKyAgICAvKiBTZW5kIHRoZSB3cml0ZSBkaXNhYmxlIGNvbW1hbmQgdG8gdGhlIEVFUFJPTSAoMy1iaXQgb3Bjb2RlIHBsdXMKKyAgICAgKiA2LzgtYml0IGR1bW15IGFkZHJlc3MgYmVnaW5uaW5nIHdpdGggMTApLiAgSXQncyBsZXNzIHdvcmsgdG8gaW5jbHVkZQorICAgICAqIHRoZSAxMCBvZiB0aGUgZHVtbXkgYWRkcmVzcyBhcyBwYXJ0IG9mIHRoZSBvcGNvZGUgdGhhbiBpdCBpcyB0byBzaGlmdAorICAgICAqIGl0IG92ZXIgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBhZGRyZXNzLiAgVGhpcyB0YWtlcyB0aGUKKyAgICAgKiBFRVBST00gb3V0IG9mIHdyaXRlL2VyYXNlIG1vZGUuCisgICAgICovCisgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIEVFUFJPTV9FV0RTX09QQ09ERV9NSUNST1dJUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KShlZXByb20tPm9wY29kZV9iaXRzICsgMikpOworCisgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIDAsICh1aW50MTZfdCkoZWVwcm9tLT5hZGRyZXNzX2JpdHMgLSAyKSk7CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVhZHMgdGhlIGFkYXB0ZXIncyBwYXJ0IG51bWJlciBmcm9tIHRoZSBFRVBST00KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogcGFydF9udW0gLSBBZGFwdGVyJ3MgcGFydCBudW1iZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3JlYWRfcGFydF9udW0oc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBhcnRfbnVtKQoreworICAgIHVpbnQxNl90IG9mZnNldCA9IEVFUFJPTV9QQkFfQllURV8xOworICAgIHVpbnQxNl90IGVlcHJvbV9kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9yZWFkX3BhcnRfbnVtIik7CisKKyAgICAvKiBHZXQgd29yZCAwIGZyb20gRUVQUk9NICovCisgICAgaWYoZTEwMDBfcmVhZF9lZXByb20oaHcsIG9mZnNldCwgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKKyAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgIH0KKyAgICAvKiBTYXZlIHdvcmQgMCBpbiB1cHBlciBoYWxmIG9mIHBhcnRfbnVtICovCisgICAgKnBhcnRfbnVtID0gKHVpbnQzMl90KSAoZWVwcm9tX2RhdGEgPDwgMTYpOworCisgICAgLyogR2V0IHdvcmQgMSBmcm9tIEVFUFJPTSAqLworICAgIGlmKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCArK29mZnNldCwgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKKyAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgIH0KKyAgICAvKiBTYXZlIHdvcmQgMSBpbiBsb3dlciBoYWxmIG9mIHBhcnRfbnVtICovCisgICAgKnBhcnRfbnVtIHw9IGVlcHJvbV9kYXRhOworCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWRzIHRoZSBhZGFwdGVyJ3MgTUFDIGFkZHJlc3MgZnJvbSB0aGUgRUVQUk9NIGFuZCBpbnZlcnRzIHRoZSBMU0IgZm9yIHRoZQorICogc2Vjb25kIGZ1bmN0aW9uIG9mIGR1YWwgZnVuY3Rpb24gZGV2aWNlcworICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9yZWFkX21hY19hZGRyKHN0cnVjdCBlMTAwMF9odyAqIGh3KQoreworICAgIHVpbnQxNl90IG9mZnNldDsKKyAgICB1aW50MTZfdCBlZXByb21fZGF0YSwgaTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcmVhZF9tYWNfYWRkciIpOworCisgICAgZm9yKGkgPSAwOyBpIDwgTk9ERV9BRERSRVNTX1NJWkU7IGkgKz0gMikgeworICAgICAgICBvZmZzZXQgPSBpID4+IDE7CisgICAgICAgIGlmKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBvZmZzZXQsIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CisgICAgICAgICAgICBERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgICAgICB9CisgICAgICAgIGh3LT5wZXJtX21hY19hZGRyW2ldID0gKHVpbnQ4X3QpIChlZXByb21fZGF0YSAmIDB4MDBGRik7CisgICAgICAgIGh3LT5wZXJtX21hY19hZGRyW2krMV0gPSAodWludDhfdCkgKGVlcHJvbV9kYXRhID4+IDgpOworICAgIH0KKyAgICBpZigoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NikgfHwgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Nl9yZXZfMykpICYmCisgICAgICAgKEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0ZVTkNfMSkpCisgICAgICAgICAgICBody0+cGVybV9tYWNfYWRkcls1XSBePSAweDAxOworCisgICAgZm9yKGkgPSAwOyBpIDwgTk9ERV9BRERSRVNTX1NJWkU7IGkrKykKKyAgICAgICAgaHctPm1hY19hZGRyW2ldID0gaHctPnBlcm1fbWFjX2FkZHJbaV07CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXRpYWxpemVzIHJlY2VpdmUgYWRkcmVzcyBmaWx0ZXJzLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogUGxhY2VzIHRoZSBNQUMgYWRkcmVzcyBpbiByZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXIgMCBhbmQgY2xlYXJzIHRoZSByZXN0CisgKiBvZiB0aGUgcmVjZWl2ZSBhZGRyZXNzcyByZWdpc3RlcnMuIENsZWFycyB0aGUgbXVsdGljYXN0IHRhYmxlLiBBc3N1bWVzCisgKiB0aGUgcmVjZWl2ZXIgaXMgaW4gcmVzZXQgd2hlbiB0aGUgcm91dGluZSBpcyBjYWxsZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitlMTAwMF9pbml0X3J4X2FkZHJzKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgaTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfaW5pdF9yeF9hZGRycyIpOworCisgICAgLyogU2V0dXAgdGhlIHJlY2VpdmUgYWRkcmVzcy4gKi8KKyAgICBERUJVR09VVCgiUHJvZ3JhbW1pbmcgTUFDIEFkZHJlc3MgaW50byBSQVJbMF1cbiIpOworCisgICAgZTEwMDBfcmFyX3NldChodywgaHctPm1hY19hZGRyLCAwKTsKKworICAgIC8qIFplcm8gb3V0IHRoZSBvdGhlciAxNSByZWNlaXZlIGFkZHJlc3Nlcy4gKi8KKyAgICBERUJVR09VVCgiQ2xlYXJpbmcgUkFSWzEtMTVdXG4iKTsKKyAgICBmb3IoaSA9IDE7IGkgPCBFMTAwMF9SQVJfRU5UUklFUzsgaSsrKSB7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsIChpIDw8IDEpLCAwKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgKChpIDw8IDEpICsgMSksIDApOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVXBkYXRlcyB0aGUgTUFDJ3MgbGlzdCBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBtY19hZGRyX2xpc3QgLSB0aGUgbGlzdCBvZiBuZXcgbXVsdGljYXN0IGFkZHJlc3NlcworICogbWNfYWRkcl9jb3VudCAtIG51bWJlciBvZiBhZGRyZXNzZXMKKyAqIHBhZCAtIG51bWJlciBvZiBieXRlcyBiZXR3ZWVuIGFkZHJlc3NlcyBpbiB0aGUgbGlzdAorICogcmFyX3VzZWRfY291bnQgLSBvZmZzZXQgd2hlcmUgdG8gc3RhcnQgYWRkaW5nIG1jIGFkZHJlc3NlcyBpbnRvIHRoZSBSQVIncworICoKKyAqIFRoZSBnaXZlbiBsaXN0IHJlcGxhY2VzIGFueSBleGlzdGluZyBsaXN0LiBDbGVhcnMgdGhlIGxhc3QgMTUgcmVjZWl2ZQorICogYWRkcmVzcyByZWdpc3RlcnMgYW5kIHRoZSBtdWx0aWNhc3QgdGFibGUuIFVzZXMgcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVycworICogZm9yIHRoZSBmaXJzdCAxNSBtdWx0aWNhc3QgYWRkcmVzc2VzLCBhbmQgaGFzaGVzIHRoZSByZXN0IGludG8gdGhlCisgKiBtdWx0aWNhc3QgdGFibGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitlMTAwMF9tY19hZGRyX2xpc3RfdXBkYXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm1jX2FkZHJfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWNfYWRkcl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYXJfdXNlZF9jb3VudCkKK3sKKyAgICB1aW50MzJfdCBoYXNoX3ZhbHVlOworICAgIHVpbnQzMl90IGk7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX21jX2FkZHJfbGlzdF91cGRhdGUiKTsKKworICAgIC8qIFNldCB0aGUgbmV3IG51bWJlciBvZiBNQyBhZGRyZXNzZXMgdGhhdCB3ZSBhcmUgYmVpbmcgcmVxdWVzdGVkIHRvIHVzZS4gKi8KKyAgICBody0+bnVtX21jX2FkZHJzID0gbWNfYWRkcl9jb3VudDsKKworICAgIC8qIENsZWFyIFJBUlsxLTE1XSAqLworICAgIERFQlVHT1VUKCIgQ2xlYXJpbmcgUkFSWzEtMTVdXG4iKTsKKyAgICBmb3IoaSA9IHJhcl91c2VkX2NvdW50OyBpIDwgRTEwMDBfUkFSX0VOVFJJRVM7IGkrKykgeworICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAoaSA8PCAxKSwgMCk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaSA8PCAxKSArIDEpLCAwKTsKKyAgICB9CisKKyAgICAvKiBDbGVhciB0aGUgTVRBICovCisgICAgREVCVUdPVVQoIiBDbGVhcmluZyBNVEFcbiIpOworICAgIGZvcihpID0gMDsgaSA8IEUxMDAwX05VTV9NVEFfUkVHSVNURVJTOyBpKyspIHsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBNVEEsIGksIDApOworICAgIH0KKworICAgIC8qIEFkZCB0aGUgbmV3IGFkZHJlc3NlcyAqLworICAgIGZvcihpID0gMDsgaSA8IG1jX2FkZHJfY291bnQ7IGkrKykgeworICAgICAgICBERUJVR09VVCgiIEFkZGluZyB0aGUgbXVsdGljYXN0IGFkZHJlc3NlczpcbiIpOworICAgICAgICBERUJVR09VVDcoIiBNQyBBZGRyICMlZCA9JS4yWCAlLjJYICUuMlggJS4yWCAlLjJYICUuMlhcbiIsIGksCisgICAgICAgICAgICAgICAgICBtY19hZGRyX2xpc3RbaSAqIChFVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpXSwKKyAgICAgICAgICAgICAgICAgIG1jX2FkZHJfbGlzdFtpICogKEVUSF9MRU5HVEhfT0ZfQUREUkVTUyArIHBhZCkgKyAxXSwKKyAgICAgICAgICAgICAgICAgIG1jX2FkZHJfbGlzdFtpICogKEVUSF9MRU5HVEhfT0ZfQUREUkVTUyArIHBhZCkgKyAyXSwKKyAgICAgICAgICAgICAgICAgIG1jX2FkZHJfbGlzdFtpICogKEVUSF9MRU5HVEhfT0ZfQUREUkVTUyArIHBhZCkgKyAzXSwKKyAgICAgICAgICAgICAgICAgIG1jX2FkZHJfbGlzdFtpICogKEVUSF9MRU5HVEhfT0ZfQUREUkVTUyArIHBhZCkgKyA0XSwKKyAgICAgICAgICAgICAgICAgIG1jX2FkZHJfbGlzdFtpICogKEVUSF9MRU5HVEhfT0ZfQUREUkVTUyArIHBhZCkgKyA1XSk7CisKKyAgICAgICAgaGFzaF92YWx1ZSA9IGUxMDAwX2hhc2hfbWNfYWRkcihodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY19hZGRyX2xpc3QgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICogKEVUSF9MRU5HVEhfT0ZfQUREUkVTUyArIHBhZCkpKTsKKworICAgICAgICBERUJVR09VVDEoIiBIYXNoIHZhbHVlID0gMHglMDNYXG4iLCBoYXNoX3ZhbHVlKTsKKworICAgICAgICAvKiBQbGFjZSB0aGlzIG11bHRpY2FzdCBhZGRyZXNzIGluIHRoZSBSQVIgaWYgdGhlcmUgaXMgcm9vbSwgKgorICAgICAgICAgKiBlbHNlIHB1dCBpdCBpbiB0aGUgTVRBCisgICAgICAgICAqLworICAgICAgICBpZihyYXJfdXNlZF9jb3VudCA8IEUxMDAwX1JBUl9FTlRSSUVTKSB7CisgICAgICAgICAgICBlMTAwMF9yYXJfc2V0KGh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBtY19hZGRyX2xpc3QgKyAoaSAqIChFVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmFyX3VzZWRfY291bnQpOworICAgICAgICAgICAgcmFyX3VzZWRfY291bnQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGUxMDAwX210YV9zZXQoaHcsIGhhc2hfdmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIERFQlVHT1VUKCJNQyBVcGRhdGUgQ29tcGxldGVcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIYXNoZXMgYW4gYWRkcmVzcyB0byBkZXRlcm1pbmUgaXRzIGxvY2F0aW9uIGluIHRoZSBtdWx0aWNhc3QgdGFibGUKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogbWNfYWRkciAtIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyB0byBoYXNoCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdAorZTEwMDBfaGFzaF9tY19hZGRyKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbWNfYWRkcikKK3sKKyAgICB1aW50MzJfdCBoYXNoX3ZhbHVlID0gMDsKKworICAgIC8qIFRoZSBwb3J0aW9uIG9mIHRoZSBhZGRyZXNzIHRoYXQgaXMgdXNlZCBmb3IgdGhlIGhhc2ggdGFibGUgaXMKKyAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBtY19maWx0ZXJfdHlwZSBzZXR0aW5nLgorICAgICAqLworICAgIHN3aXRjaCAoaHctPm1jX2ZpbHRlcl90eXBlKSB7CisgICAgLyogWzBdIFsxXSBbMl0gWzNdIFs0XSBbNV0KKyAgICAgKiAwMSAgQUEgIDAwICAxMiAgMzQgIDU2CisgICAgICogTFNCICAgICAgICAgICAgICAgICBNU0IKKyAgICAgKi8KKyAgICBjYXNlIDA6CisgICAgICAgIC8qIFs0NzozNl0gaS5lLiAweDU2MyBmb3IgYWJvdmUgZXhhbXBsZSBhZGRyZXNzICovCisgICAgICAgIGhhc2hfdmFsdWUgPSAoKG1jX2FkZHJbNF0gPj4gNCkgfCAoKCh1aW50MTZfdCkgbWNfYWRkcls1XSkgPDwgNCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIC8qIFs0NjozNV0gaS5lLiAweEFDNiBmb3IgYWJvdmUgZXhhbXBsZSBhZGRyZXNzICovCisgICAgICAgIGhhc2hfdmFsdWUgPSAoKG1jX2FkZHJbNF0gPj4gMykgfCAoKCh1aW50MTZfdCkgbWNfYWRkcls1XSkgPDwgNSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIC8qIFs0NTozNF0gaS5lLiAweDVEOCBmb3IgYWJvdmUgZXhhbXBsZSBhZGRyZXNzICovCisgICAgICAgIGhhc2hfdmFsdWUgPSAoKG1jX2FkZHJbNF0gPj4gMikgfCAoKCh1aW50MTZfdCkgbWNfYWRkcls1XSkgPDwgNikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIC8qIFs0MzozMl0gaS5lLiAweDYzNCBmb3IgYWJvdmUgZXhhbXBsZSBhZGRyZXNzICovCisgICAgICAgIGhhc2hfdmFsdWUgPSAoKG1jX2FkZHJbNF0pIHwgKCgodWludDE2X3QpIG1jX2FkZHJbNV0pIDw8IDgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaGFzaF92YWx1ZSAmPSAweEZGRjsKKyAgICByZXR1cm4gaGFzaF92YWx1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0cyB0aGUgYml0IGluIHRoZSBtdWx0aWNhc3QgdGFibGUgY29ycmVzcG9uZGluZyB0byB0aGUgaGFzaCB2YWx1ZS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogaGFzaF92YWx1ZSAtIE11bHRpY2FzdCBhZGRyZXNzIGhhc2ggdmFsdWUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX210YV9zZXQoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgdWludDMyX3QgaGFzaF92YWx1ZSkKK3sKKyAgICB1aW50MzJfdCBoYXNoX2JpdCwgaGFzaF9yZWc7CisgICAgdWludDMyX3QgbXRhOworICAgIHVpbnQzMl90IHRlbXA7CisKKyAgICAvKiBUaGUgTVRBIGlzIGEgcmVnaXN0ZXIgYXJyYXkgb2YgMTI4IDMyLWJpdCByZWdpc3RlcnMuCisgICAgICogSXQgaXMgdHJlYXRlZCBsaWtlIGFuIGFycmF5IG9mIDQwOTYgYml0cy4gIFdlIHdhbnQgdG8gc2V0CisgICAgICogYml0IEJpdEFycmF5W2hhc2hfdmFsdWVdLiBTbyB3ZSBmaWd1cmUgb3V0IHdoYXQgcmVnaXN0ZXIKKyAgICAgKiB0aGUgYml0IGlzIGluLCByZWFkIGl0LCBPUiBpbiB0aGUgbmV3IGJpdCwgdGhlbiB3cml0ZQorICAgICAqIGJhY2sgdGhlIG5ldyB2YWx1ZS4gIFRoZSByZWdpc3RlciBpcyBkZXRlcm1pbmVkIGJ5IHRoZQorICAgICAqIHVwcGVyIDcgYml0cyBvZiB0aGUgaGFzaCB2YWx1ZSBhbmQgdGhlIGJpdCB3aXRoaW4gdGhhdAorICAgICAqIHJlZ2lzdGVyIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlciA1IGJpdHMgb2YgdGhlIHZhbHVlLgorICAgICAqLworICAgIGhhc2hfcmVnID0gKGhhc2hfdmFsdWUgPj4gNSkgJiAweDdGOworICAgIGhhc2hfYml0ID0gaGFzaF92YWx1ZSAmIDB4MUY7CisKKyAgICBtdGEgPSBFMTAwMF9SRUFEX1JFR19BUlJBWShodywgTVRBLCBoYXNoX3JlZyk7CisKKyAgICBtdGEgfD0gKDEgPDwgaGFzaF9iaXQpOworCisgICAgLyogSWYgd2UgYXJlIG9uIGFuIDgyNTQ0IGFuZCB3ZSBhcmUgdHJ5aW5nIHRvIHdyaXRlIGFuIG9kZCBvZmZzZXQKKyAgICAgKiBpbiB0aGUgTVRBLCBzYXZlIG9mZiB0aGUgcHJldmlvdXMgZW50cnkgYmVmb3JlIHdyaXRpbmcgYW5kCisgICAgICogcmVzdG9yZSB0aGUgb2xkIHZhbHVlIGFmdGVyIHdyaXRpbmcuCisgICAgICovCisgICAgaWYoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NCkgJiYgKChoYXNoX3JlZyAmIDB4MSkgPT0gMSkpIHsKKyAgICAgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHX0FSUkFZKGh3LCBNVEEsIChoYXNoX3JlZyAtIDEpKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBNVEEsIGhhc2hfcmVnLCBtdGEpOworICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgKGhhc2hfcmVnIC0gMSksIHRlbXApOworICAgIH0gZWxzZSB7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgTVRBLCBoYXNoX3JlZywgbXRhKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFB1dHMgYW4gZXRoZXJuZXQgYWRkcmVzcyBpbnRvIGEgcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBhZGRyIC0gQWRkcmVzcyB0byBwdXQgaW50byByZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXIKKyAqIGluZGV4IC0gUmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyIHRvIHdyaXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitlMTAwMF9yYXJfc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgIHVpbnQ4X3QgKmFkZHIsCisgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4KQoreworICAgIHVpbnQzMl90IHJhcl9sb3csIHJhcl9oaWdoOworCisgICAgLyogSFcgZXhwZWN0cyB0aGVzZSBpbiBsaXR0bGUgZW5kaWFuIHNvIHdlIHJldmVyc2UgdGhlIGJ5dGUgb3JkZXIKKyAgICAgKiBmcm9tIG5ldHdvcmsgb3JkZXIgKGJpZyBlbmRpYW4pIHRvIGxpdHRsZSBlbmRpYW4KKyAgICAgKi8KKyAgICByYXJfbG93ID0gKCh1aW50MzJfdCkgYWRkclswXSB8CisgICAgICAgICAgICAgICAoKHVpbnQzMl90KSBhZGRyWzFdIDw8IDgpIHwKKyAgICAgICAgICAgICAgICgodWludDMyX3QpIGFkZHJbMl0gPDwgMTYpIHwgKCh1aW50MzJfdCkgYWRkclszXSA8PCAyNCkpOworCisgICAgcmFyX2hpZ2ggPSAoKHVpbnQzMl90KSBhZGRyWzRdIHwgKCh1aW50MzJfdCkgYWRkcls1XSA8PCA4KSB8IEUxMDAwX1JBSF9BVik7CisKKyAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAoaW5kZXggPDwgMSksIHJhcl9sb3cpOworICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaW5kZXggPDwgMSkgKyAxKSwgcmFyX2hpZ2gpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBXcml0ZXMgYSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIG9mZnNldCBpbiB0aGUgVkxBTiBmaWx0ZXIgdGFibGUuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG9mZnNldCAtIE9mZnNldCBpbiBWTEFOIGZpbGVyIHRhYmxlIHRvIHdyaXRlCisgKiB2YWx1ZSAtIFZhbHVlIHRvIHdyaXRlIGludG8gVkxBTiBmaWx0ZXIgdGFibGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX3dyaXRlX3ZmdGEoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICB1aW50MzJfdCB0ZW1wOworCisgICAgaWYoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NCkgJiYgKChvZmZzZXQgJiAweDEpID09IDEpKSB7CisgICAgICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFR19BUlJBWShodywgVkZUQSwgKG9mZnNldCAtIDEpKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBWRlRBLCBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBWRlRBLCAob2Zmc2V0IC0gMSksIHRlbXApOworICAgIH0gZWxzZSB7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgVkZUQSwgb2Zmc2V0LCB2YWx1ZSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDbGVhcnMgdGhlIFZMQU4gZmlsZXIgdGFibGUKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfY2xlYXJfdmZ0YShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IG9mZnNldDsKKworICAgIGZvcihvZmZzZXQgPSAwOyBvZmZzZXQgPCBFMTAwMF9WTEFOX0ZJTFRFUl9UQkxfU0laRTsgb2Zmc2V0KyspCisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgVkZUQSwgb2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGludDMyX3QKK2UxMDAwX2lkX2xlZF9pbml0KHN0cnVjdCBlMTAwMF9odyAqIGh3KQoreworICAgIHVpbnQzMl90IGxlZGN0bDsKKyAgICBjb25zdCB1aW50MzJfdCBsZWRjdGxfbWFzayA9IDB4MDAwMDAwRkY7CisgICAgY29uc3QgdWludDMyX3QgbGVkY3RsX29uID0gRTEwMDBfTEVEQ1RMX01PREVfTEVEX09OOworICAgIGNvbnN0IHVpbnQzMl90IGxlZGN0bF9vZmYgPSBFMTAwMF9MRURDVExfTU9ERV9MRURfT0ZGOworICAgIHVpbnQxNl90IGVlcHJvbV9kYXRhLCBpLCB0ZW1wOworICAgIGNvbnN0IHVpbnQxNl90IGxlZF9tYXNrID0gMHgwRjsKKworICAgIERFQlVHRlVOQygiZTEwMDBfaWRfbGVkX2luaXQiKTsKKworICAgIGlmKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQwKSB7CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisgICAgfQorCisgICAgbGVkY3RsID0gRTEwMDBfUkVBRF9SRUcoaHcsIExFRENUTCk7CisgICAgaHctPmxlZGN0bF9kZWZhdWx0ID0gbGVkY3RsOworICAgIGh3LT5sZWRjdGxfbW9kZTEgPSBody0+bGVkY3RsX2RlZmF1bHQ7CisgICAgaHctPmxlZGN0bF9tb2RlMiA9IGh3LT5sZWRjdGxfZGVmYXVsdDsKKworICAgIGlmKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fSURfTEVEX1NFVFRJTkdTLCAxLCAmZWVwcm9tX2RhdGEpIDwgMCkgeworICAgICAgICBERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgfQorICAgIGlmKChlZXByb21fZGF0YT09IElEX0xFRF9SRVNFUlZFRF8wMDAwKSB8fAorICAgICAgIChlZXByb21fZGF0YSA9PSBJRF9MRURfUkVTRVJWRURfRkZGRikpIGVlcHJvbV9kYXRhID0gSURfTEVEX0RFRkFVTFQ7CisgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHRlbXAgPSAoZWVwcm9tX2RhdGEgPj4gKGkgPDwgMikpICYgbGVkX21hc2s7CisgICAgICAgIHN3aXRjaCh0ZW1wKSB7CisgICAgICAgIGNhc2UgSURfTEVEX09OMV9ERUYyOgorICAgICAgICBjYXNlIElEX0xFRF9PTjFfT04yOgorICAgICAgICBjYXNlIElEX0xFRF9PTjFfT0ZGMjoKKyAgICAgICAgICAgIGh3LT5sZWRjdGxfbW9kZTEgJj0gfihsZWRjdGxfbWFzayA8PCAoaSA8PCAzKSk7CisgICAgICAgICAgICBody0+bGVkY3RsX21vZGUxIHw9IGxlZGN0bF9vbiA8PCAoaSA8PCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElEX0xFRF9PRkYxX0RFRjI6CisgICAgICAgIGNhc2UgSURfTEVEX09GRjFfT04yOgorICAgICAgICBjYXNlIElEX0xFRF9PRkYxX09GRjI6CisgICAgICAgICAgICBody0+bGVkY3RsX21vZGUxICY9IH4obGVkY3RsX21hc2sgPDwgKGkgPDwgMykpOworICAgICAgICAgICAgaHctPmxlZGN0bF9tb2RlMSB8PSBsZWRjdGxfb2ZmIDw8IChpIDw8IDMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBEbyBub3RoaW5nICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2godGVtcCkgeworICAgICAgICBjYXNlIElEX0xFRF9ERUYxX09OMjoKKyAgICAgICAgY2FzZSBJRF9MRURfT04xX09OMjoKKyAgICAgICAgY2FzZSBJRF9MRURfT0ZGMV9PTjI6CisgICAgICAgICAgICBody0+bGVkY3RsX21vZGUyICY9IH4obGVkY3RsX21hc2sgPDwgKGkgPDwgMykpOworICAgICAgICAgICAgaHctPmxlZGN0bF9tb2RlMiB8PSBsZWRjdGxfb24gPDwgKGkgPDwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJRF9MRURfREVGMV9PRkYyOgorICAgICAgICBjYXNlIElEX0xFRF9PTjFfT0ZGMjoKKyAgICAgICAgY2FzZSBJRF9MRURfT0ZGMV9PRkYyOgorICAgICAgICAgICAgaHctPmxlZGN0bF9tb2RlMiAmPSB+KGxlZGN0bF9tYXNrIDw8IChpIDw8IDMpKTsKKyAgICAgICAgICAgIGh3LT5sZWRjdGxfbW9kZTIgfD0gbGVkY3RsX29mZiA8PCAoaSA8PCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogRG8gbm90aGluZyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByZXBhcmVzIFNXIGNvbnRyb2xhYmxlIExFRCBmb3IgdXNlIGFuZCBzYXZlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgTEVELgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9zZXR1cF9sZWQoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBsZWRjdGw7CisgICAgaW50MzJfdCByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKKworICAgIERFQlVHRlVOQygiZTEwMDBfc2V0dXBfbGVkIik7CisKKyAgICBzd2l0Y2goaHctPm1hY190eXBlKSB7CisgICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CisgICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzE6CisgICAgY2FzZSBlMTAwMF84MjU0MzoKKyAgICBjYXNlIGUxMDAwXzgyNTQ0OgorICAgICAgICAvKiBObyBzZXR1cCBuZWNlc3NhcnkgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU0MToKKyAgICBjYXNlIGUxMDAwXzgyNTQ3OgorICAgIGNhc2UgZTEwMDBfODI1NDFfcmV2XzI6CisgICAgY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKKyAgICAgICAgLyogVHVybiBvZmYgUEhZIFNtYXJ0IFBvd2VyIERvd24gKGlmIGVuYWJsZWQpICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfR01JSV9GSUZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZody0+cGh5X3NwZF9kZWZhdWx0KTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCkoaHctPnBoeV9zcGRfZGVmYXVsdCAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5JR1AwMUUxMDAwX0dNSUlfU1BEKSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgLyogRmFsbCBUaHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgeworICAgICAgICAgICAgbGVkY3RsID0gRTEwMDBfUkVBRF9SRUcoaHcsIExFRENUTCk7CisgICAgICAgICAgICAvKiBTYXZlIGN1cnJlbnQgTEVEQ1RMIHNldHRpbmdzICovCisgICAgICAgICAgICBody0+bGVkY3RsX2RlZmF1bHQgPSBsZWRjdGw7CisgICAgICAgICAgICAvKiBUdXJuIG9mZiBMRUQwICovCisgICAgICAgICAgICBsZWRjdGwgJj0gfihFMTAwMF9MRURDVExfTEVEMF9JVlJUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0xFRENUTF9MRUQwX0JMSU5LIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0xFRENUTF9MRUQwX01PREVfTUFTSyk7CisgICAgICAgICAgICBsZWRjdGwgfD0gKEUxMDAwX0xFRENUTF9NT0RFX0xFRF9PRkYgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfTEVEQ1RMX0xFRDBfTU9ERV9TSElGVCk7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIExFRENUTCwgbGVkY3RsKTsKKyAgICAgICAgfSBlbHNlIGlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKQorICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBMRURDVEwsIGh3LT5sZWRjdGxfbW9kZTEpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVzdG9yZXMgdGhlIHNhdmVkIHN0YXRlIG9mIHRoZSBTVyBjb250cm9sYWJsZSBMRUQuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2NsZWFudXBfbGVkKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MzJfdCByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY2xlYW51cF9sZWQiKTsKKworICAgIHN3aXRjaChody0+bWFjX3R5cGUpIHsKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKKyAgICBjYXNlIGUxMDAwXzgyNTQzOgorICAgIGNhc2UgZTEwMDBfODI1NDQ6CisgICAgICAgIC8qIE5vIGNsZWFudXAgbmVjZXNzYXJ5ICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODI1NDE6CisgICAgY2FzZSBlMTAwMF84MjU0NzoKKyAgICBjYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorICAgIGNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisgICAgICAgIC8qIFR1cm4gb24gUEhZIFNtYXJ0IFBvd2VyIERvd24gKGlmIHByZXZpb3VzbHkgZW5hYmxlZCkgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfR01JSV9GSUZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBody0+cGh5X3NwZF9kZWZhdWx0KTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAvKiBGYWxsIFRocm91Z2ggKi8KKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBSZXN0b3JlIExFRENUTCBzZXR0aW5ncyAqLworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIExFRENUTCwgaHctPmxlZGN0bF9kZWZhdWx0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFR1cm5zIG9uIHRoZSBzb2Z0d2FyZSBjb250cm9sbGFibGUgTEVECisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2xlZF9vbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2xlZF9vbiIpOworCisgICAgc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorICAgIGNhc2UgZTEwMDBfODI1NDM6CisgICAgICAgIC8qIFNldCBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb24gdGhlIExFRCAqLworICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElOMDsKKyAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODI1NDQ6CisgICAgICAgIGlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKKyAgICAgICAgICAgIC8qIFNldCBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb24gdGhlIExFRCAqLworICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTjA7CisgICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElPMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIENsZWFyIFNXIERlZmluZWFibGUgUGluIDAgdG8gdHVybiBvbiB0aGUgTEVEICovCisgICAgICAgICAgICBjdHJsICY9IH5FMTAwMF9DVFJMX1NXRFBJTjA7CisgICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElPMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB7CisgICAgICAgICAgICAvKiBDbGVhciBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb24gdGhlIExFRCAqLworICAgICAgICAgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9TV0RQSU4wOworICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7CisgICAgICAgIH0gZWxzZSBpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBMRURDVEwsIGh3LT5sZWRjdGxfbW9kZTIpOworICAgICAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUdXJucyBvZmYgdGhlIHNvZnR3YXJlIGNvbnRyb2xsYWJsZSBMRUQKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfbGVkX29mZihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2xlZF9vZmYiKTsKKworICAgIHN3aXRjaChody0+bWFjX3R5cGUpIHsKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKKyAgICBjYXNlIGUxMDAwXzgyNTQzOgorICAgICAgICAvKiBDbGVhciBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb2ZmIHRoZSBMRUQgKi8KKyAgICAgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9TV0RQSU4wOworICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElPMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU0NDoKKyAgICAgICAgaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgeworICAgICAgICAgICAgLyogQ2xlYXIgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9mZiB0aGUgTEVEICovCisgICAgICAgICAgICBjdHJsICY9IH5FMTAwMF9DVFJMX1NXRFBJTjA7CisgICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElPMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFNldCBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb2ZmIHRoZSBMRUQgKi8KKyAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU4wOworICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgeworICAgICAgICAgICAgLyogU2V0IFNXIERlZmluZWFibGUgUGluIDAgdG8gdHVybiBvZmYgdGhlIExFRCAqLworICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTjA7CisgICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElPMDsKKyAgICAgICAgfSBlbHNlIGlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIExFRENUTCwgaHctPmxlZGN0bF9tb2RlMSk7CisgICAgICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENsZWFycyBhbGwgaGFyZHdhcmUgc3RhdGlzdGljcyBjb3VudGVycy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfY2xlYXJfaHdfY250cnMoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB0ZW1wOworCisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDUkNFUlJTKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNZTUVSUlMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgTVBDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNDQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFQ09MKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1DQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBMQVRFQ09MKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIENPTEMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgREMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgU0VDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJMRUMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgWE9OUlhDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFhPTlRYQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBYT0ZGUlhDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFhPRkZUWEMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgRkNSVUMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDNjQpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDMTI3KTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzI1NSk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkM1MTEpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDMTAyMyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkMxNTIyKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIEdQUkMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgQlBSQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBNUFJDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIEdQVEMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgR09SQ0wpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgR09SQ0gpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgR09UQ0wpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgR09UQ0gpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUk5CQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSVUMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUkZDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJPQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSSkMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgVE9STCk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUT1JIKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRPVEwpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgVE9USCk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUUFIpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgVFBUKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzY0KTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzEyNyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEMyNTUpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDNTExKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzEwMjMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDMTUyMik7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBNUFRDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIEJQVEMpOworCisgICAgaWYoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDMpIHJldHVybjsKKworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgQUxHTkVSUkMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUlhFUlJDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFROQ1JTKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIENFWFRFUlIpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgVFNDVEMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgVFNDVEZDKTsKKworICAgIGlmKGh3LT5tYWNfdHlwZSA8PSBlMTAwMF84MjU0NCkgcmV0dXJuOworCisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBNR1RQUkMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgTUdUUERDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1HVFBUQyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlc2V0cyBBZGFwdGl2ZSBJRlMgdG8gaXRzIGRlZmF1bHQgc3RhdGUuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBDYWxsIHRoaXMgYWZ0ZXIgZTEwMDBfaW5pdF9ody4gWW91IG1heSBvdmVycmlkZSB0aGUgSUZTIGRlZmF1bHRzIGJ5IHNldHRpbmcKKyAqIGh3LT5pZnNfcGFyYW1zX2ZvcmNlZCB0byBUUlVFLiBIb3dldmVyLCB5b3UgbXVzdCBpbml0aWFsaXplIGh3LT4KKyAqIGN1cnJlbnRfaWZzX3ZhbCwgaWZzX21pbl92YWwsIGlmc19tYXhfdmFsLCBpZnNfc3RlcF9zaXplLCBhbmQgaWZzX3JhdGlvCisgKiBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfcmVzZXRfYWRhcHRpdmUoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBERUJVR0ZVTkMoImUxMDAwX3Jlc2V0X2FkYXB0aXZlIik7CisKKyAgICBpZihody0+YWRhcHRpdmVfaWZzKSB7CisgICAgICAgIGlmKCFody0+aWZzX3BhcmFtc19mb3JjZWQpIHsKKyAgICAgICAgICAgIGh3LT5jdXJyZW50X2lmc192YWwgPSAwOworICAgICAgICAgICAgaHctPmlmc19taW5fdmFsID0gSUZTX01JTjsKKyAgICAgICAgICAgIGh3LT5pZnNfbWF4X3ZhbCA9IElGU19NQVg7CisgICAgICAgICAgICBody0+aWZzX3N0ZXBfc2l6ZSA9IElGU19TVEVQOworICAgICAgICAgICAgaHctPmlmc19yYXRpbyA9IElGU19SQVRJTzsKKyAgICAgICAgfQorICAgICAgICBody0+aW5faWZzX21vZGUgPSBGQUxTRTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBBSVQsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIERFQlVHT1VUKCJOb3QgaW4gQWRhcHRpdmUgSUZTIG1vZGUhXG4iKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENhbGxlZCBkdXJpbmcgdGhlIGNhbGxiYWNrL3dhdGNoZG9nIHJvdXRpbmUgdG8gdXBkYXRlIElGUyB2YWx1ZSBiYXNlZCBvbgorICogdGhlIHJhdGlvIG9mIHRyYW5zbWl0cyB0byBjb2xsaXNpb25zLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiB0eF9wYWNrZXRzIC0gTnVtYmVyIG9mIHRyYW5zbWl0cyBzaW5jZSBsYXN0IGNhbGxiYWNrCisgKiB0b3RhbF9jb2xsaXNpb25zIC0gTnVtYmVyIG9mIGNvbGxpc2lvbnMgc2luY2UgbGFzdCBjYWxsYmFjaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfdXBkYXRlX2FkYXB0aXZlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgREVCVUdGVU5DKCJlMTAwMF91cGRhdGVfYWRhcHRpdmUiKTsKKworICAgIGlmKGh3LT5hZGFwdGl2ZV9pZnMpIHsKKyAgICAgICAgaWYoKGh3LT5jb2xsaXNpb25fZGVsdGEgKiBody0+aWZzX3JhdGlvKSA+IGh3LT50eF9wYWNrZXRfZGVsdGEpIHsKKyAgICAgICAgICAgIGlmKGh3LT50eF9wYWNrZXRfZGVsdGEgPiBNSU5fTlVNX1hNSVRTKSB7CisgICAgICAgICAgICAgICAgaHctPmluX2lmc19tb2RlID0gVFJVRTsKKyAgICAgICAgICAgICAgICBpZihody0+Y3VycmVudF9pZnNfdmFsIDwgaHctPmlmc19tYXhfdmFsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGh3LT5jdXJyZW50X2lmc192YWwgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5jdXJyZW50X2lmc192YWwgPSBody0+aWZzX21pbl92YWw7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5jdXJyZW50X2lmc192YWwgKz0gaHctPmlmc19zdGVwX3NpemU7CisgICAgICAgICAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQUlULCBody0+Y3VycmVudF9pZnNfdmFsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZihody0+aW5faWZzX21vZGUgJiYgKGh3LT50eF9wYWNrZXRfZGVsdGEgPD0gTUlOX05VTV9YTUlUUykpIHsKKyAgICAgICAgICAgICAgICBody0+Y3VycmVudF9pZnNfdmFsID0gMDsKKyAgICAgICAgICAgICAgICBody0+aW5faWZzX21vZGUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEFJVCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBERUJVR09VVCgiTm90IGluIEFkYXB0aXZlIElGUyBtb2RlIVxuIik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZGp1c3RzIHRoZSBzdGF0aXN0aWMgY291bnRlcnMgd2hlbiBhIGZyYW1lIGlzIGFjY2VwdGVkIGJ5IFRCSV9BQ0NFUFQKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogZnJhbWVfbGVuIC0gVGhlIGxlbmd0aCBvZiB0aGUgZnJhbWUgaW4gcXVlc3Rpb24KKyAqIG1hY19hZGRyIC0gVGhlIEV0aGVybmV0IGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIGZyYW1lIGluIHF1ZXN0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitlMTAwMF90YmlfYWRqdXN0X3N0YXRzKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlMTAwMF9od19zdGF0cyAqc3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbWFjX2FkZHIpCit7CisgICAgdWludDY0X3QgY2FycnlfYml0OworCisgICAgLyogRmlyc3QgYWRqdXN0IHRoZSBmcmFtZSBsZW5ndGguICovCisgICAgZnJhbWVfbGVuLS07CisgICAgLyogV2UgbmVlZCB0byBhZGp1c3QgdGhlIHN0YXRpc3RpY3MgY291bnRlcnMsIHNpbmNlIHRoZSBoYXJkd2FyZQorICAgICAqIGNvdW50ZXJzIG92ZXJjb3VudCB0aGlzIHBhY2tldCBhcyBhIENSQyBlcnJvciBhbmQgdW5kZXJjb3VudAorICAgICAqIHRoZSBwYWNrZXQgYXMgYSBnb29kIHBhY2tldAorICAgICAqLworICAgIC8qIFRoaXMgcGFja2V0IHNob3VsZCBub3QgYmUgY291bnRlZCBhcyBhIENSQyBlcnJvci4gICAgKi8KKyAgICBzdGF0cy0+Y3JjZXJycy0tOworICAgIC8qIFRoaXMgcGFja2V0IGRvZXMgY291bnQgYXMgYSBHb29kIFBhY2tldCBSZWNlaXZlZC4gICAgKi8KKyAgICBzdGF0cy0+Z3ByYysrOworCisgICAgLyogQWRqdXN0IHRoZSBHb29kIE9jdGV0cyByZWNlaXZlZCBjb3VudGVycyAgICAgICAgICAgICAqLworICAgIGNhcnJ5X2JpdCA9IDB4ODAwMDAwMDAgJiBzdGF0cy0+Z29yY2w7CisgICAgc3RhdHMtPmdvcmNsICs9IGZyYW1lX2xlbjsKKyAgICAvKiBJZiB0aGUgaGlnaCBiaXQgb2YgR29yY2wgKHRoZSBsb3cgMzIgYml0cyBvZiB0aGUgR29vZCBPY3RldHMKKyAgICAgKiBSZWNlaXZlZCBDb3VudCkgd2FzIG9uZSBiZWZvcmUgdGhlIGFkZGl0aW9uLAorICAgICAqIEFORCBpdCBpcyB6ZXJvIGFmdGVyLCB0aGVuIHdlIGxvc3QgdGhlIGNhcnJ5IG91dCwKKyAgICAgKiBuZWVkIHRvIGFkZCBvbmUgdG8gR29yY2ggKEdvb2QgT2N0ZXRzIFJlY2VpdmVkIENvdW50IEhpZ2gpLgorICAgICAqIFRoaXMgY291bGQgYmUgc2ltcGxpZmllZCBpZiBhbGwgZW52aXJvbm1lbnRzIHN1cHBvcnRlZAorICAgICAqIDY0LWJpdCBpbnRlZ2Vycy4KKyAgICAgKi8KKyAgICBpZihjYXJyeV9iaXQgJiYgKChzdGF0cy0+Z29yY2wgJiAweDgwMDAwMDAwKSA9PSAwKSkKKyAgICAgICAgc3RhdHMtPmdvcmNoKys7CisgICAgLyogSXMgdGhpcyBhIGJyb2FkY2FzdCBvciBtdWx0aWNhc3Q/ICBDaGVjayBicm9hZGNhc3QgZmlyc3QsCisgICAgICogc2luY2UgdGhlIHRlc3QgZm9yIGEgbXVsdGljYXN0IGZyYW1lIHdpbGwgdGVzdCBwb3NpdGl2ZSBvbgorICAgICAqIGEgYnJvYWRjYXN0IGZyYW1lLgorICAgICAqLworICAgIGlmKChtYWNfYWRkclswXSA9PSAodWludDhfdCkgMHhmZikgJiYgKG1hY19hZGRyWzFdID09ICh1aW50OF90KSAweGZmKSkKKyAgICAgICAgLyogQnJvYWRjYXN0IHBhY2tldCAqLworICAgICAgICBzdGF0cy0+YnByYysrOworICAgIGVsc2UgaWYoKm1hY19hZGRyICYgMHgwMSkKKyAgICAgICAgLyogTXVsdGljYXN0IHBhY2tldCAqLworICAgICAgICBzdGF0cy0+bXByYysrOworCisgICAgaWYoZnJhbWVfbGVuID09IGh3LT5tYXhfZnJhbWVfc2l6ZSkgeworICAgICAgICAvKiBJbiB0aGlzIGNhc2UsIHRoZSBoYXJkd2FyZSBoYXMgb3ZlcmNvdW50ZWQgdGhlIG51bWJlciBvZgorICAgICAgICAgKiBvdmVyc2l6ZSBmcmFtZXMuCisgICAgICAgICAqLworICAgICAgICBpZihzdGF0cy0+cm9jID4gMCkKKyAgICAgICAgICAgIHN0YXRzLT5yb2MtLTsKKyAgICB9CisKKyAgICAvKiBBZGp1c3QgdGhlIGJpbiBjb3VudGVycyB3aGVuIHRoZSBleHRyYSBieXRlIHB1dCB0aGUgZnJhbWUgaW4gdGhlCisgICAgICogd3JvbmcgYmluLiBSZW1lbWJlciB0aGF0IHRoZSBmcmFtZV9sZW4gd2FzIGFkanVzdGVkIGFib3ZlLgorICAgICAqLworICAgIGlmKGZyYW1lX2xlbiA9PSA2NCkgeworICAgICAgICBzdGF0cy0+cHJjNjQrKzsKKyAgICAgICAgc3RhdHMtPnByYzEyNy0tOworICAgIH0gZWxzZSBpZihmcmFtZV9sZW4gPT0gMTI3KSB7CisgICAgICAgIHN0YXRzLT5wcmMxMjcrKzsKKyAgICAgICAgc3RhdHMtPnByYzI1NS0tOworICAgIH0gZWxzZSBpZihmcmFtZV9sZW4gPT0gMjU1KSB7CisgICAgICAgIHN0YXRzLT5wcmMyNTUrKzsKKyAgICAgICAgc3RhdHMtPnByYzUxMS0tOworICAgIH0gZWxzZSBpZihmcmFtZV9sZW4gPT0gNTExKSB7CisgICAgICAgIHN0YXRzLT5wcmM1MTErKzsKKyAgICAgICAgc3RhdHMtPnByYzEwMjMtLTsKKyAgICB9IGVsc2UgaWYoZnJhbWVfbGVuID09IDEwMjMpIHsKKyAgICAgICAgc3RhdHMtPnByYzEwMjMrKzsKKyAgICAgICAgc3RhdHMtPnByYzE1MjItLTsKKyAgICB9IGVsc2UgaWYoZnJhbWVfbGVuID09IDE1MjIpIHsKKyAgICAgICAgc3RhdHMtPnByYzE1MjIrKzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdldHMgdGhlIGN1cnJlbnQgUENJIGJ1cyB0eXBlLCBzcGVlZCwgYW5kIHdpZHRoIG9mIHRoZSBoYXJkd2FyZQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitlMTAwMF9nZXRfYnVzX2luZm8oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBzdGF0dXM7CisKKyAgICBzd2l0Y2ggKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorICAgICAgICBody0+YnVzX3R5cGUgPSBlMTAwMF9idXNfdHlwZV91bmtub3duOworICAgICAgICBody0+YnVzX3NwZWVkID0gZTEwMDBfYnVzX3NwZWVkX3Vua25vd247CisgICAgICAgIGh3LT5idXNfd2lkdGggPSBlMTAwMF9idXNfd2lkdGhfdW5rbm93bjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUyk7CisgICAgICAgIGh3LT5idXNfdHlwZSA9IChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfUENJWF9NT0RFKSA/CisgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX2J1c190eXBlX3BjaXggOiBlMTAwMF9idXNfdHlwZV9wY2k7CisKKyAgICAgICAgaWYoaHctPmRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfODI1NDZFQl9RVUFEX0NPUFBFUikgeworICAgICAgICAgICAgaHctPmJ1c19zcGVlZCA9IChody0+YnVzX3R5cGUgPT0gZTEwMDBfYnVzX3R5cGVfcGNpKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfYnVzX3NwZWVkXzY2IDogZTEwMDBfYnVzX3NwZWVkXzEyMDsKKyAgICAgICAgfSBlbHNlIGlmKGh3LT5idXNfdHlwZSA9PSBlMTAwMF9idXNfdHlwZV9wY2kpIHsKKyAgICAgICAgICAgIGh3LT5idXNfc3BlZWQgPSAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1BDSTY2KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfYnVzX3NwZWVkXzY2IDogZTEwMDBfYnVzX3NwZWVkXzMzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfUENJWF9TUEVFRCkgeworICAgICAgICAgICAgY2FzZSBFMTAwMF9TVEFUVVNfUENJWF9TUEVFRF82NjoKKyAgICAgICAgICAgICAgICBody0+YnVzX3NwZWVkID0gZTEwMDBfYnVzX3NwZWVkXzY2OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFMTAwMF9TVEFUVVNfUENJWF9TUEVFRF8xMDA6CisgICAgICAgICAgICAgICAgaHctPmJ1c19zcGVlZCA9IGUxMDAwX2J1c19zcGVlZF8xMDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzEzMzoKKyAgICAgICAgICAgICAgICBody0+YnVzX3NwZWVkID0gZTEwMDBfYnVzX3NwZWVkXzEzMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaHctPmJ1c19zcGVlZCA9IGUxMDAwX2J1c19zcGVlZF9yZXNlcnZlZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBody0+YnVzX3dpZHRoID0gKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19CVVM2NCkgPworICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfYnVzX3dpZHRoXzY0IDogZTEwMDBfYnVzX3dpZHRoXzMyOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWFkcyBhIHZhbHVlIGZyb20gb25lIG9mIHRoZSBkZXZpY2VzIHJlZ2lzdGVycyB1c2luZyBwb3J0IEkvTyAoYXMgb3Bwb3NlZAorICogbWVtb3J5IG1hcHBlZCBJL08pLiBPbmx5IDgyNTQ0IGFuZCBuZXdlciBkZXZpY2VzIHN1cHBvcnQgcG9ydCBJL08uCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG9mZnNldCAtIG9mZnNldCB0byByZWFkIGZyb20KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90CitlMTAwMF9yZWFkX3JlZ19pbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0KQoreworICAgIHVuc2lnbmVkIGxvbmcgaW9fYWRkciA9IGh3LT5pb19iYXNlOworICAgIHVuc2lnbmVkIGxvbmcgaW9fZGF0YSA9IGh3LT5pb19iYXNlICsgNDsKKworICAgIGUxMDAwX2lvX3dyaXRlKGh3LCBpb19hZGRyLCBvZmZzZXQpOworICAgIHJldHVybiBlMTAwMF9pb19yZWFkKGh3LCBpb19kYXRhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV3JpdGVzIGEgdmFsdWUgdG8gb25lIG9mIHRoZSBkZXZpY2VzIHJlZ2lzdGVycyB1c2luZyBwb3J0IEkvTyAoYXMgb3Bwb3NlZCB0bworICogbWVtb3J5IG1hcHBlZCBJL08pLiBPbmx5IDgyNTQ0IGFuZCBuZXdlciBkZXZpY2VzIHN1cHBvcnQgcG9ydCBJL08uCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG9mZnNldCAtIG9mZnNldCB0byB3cml0ZSB0bworICogdmFsdWUgLSB2YWx1ZSB0byB3cml0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfd3JpdGVfcmVnX2lvKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQoreworICAgIHVuc2lnbmVkIGxvbmcgaW9fYWRkciA9IGh3LT5pb19iYXNlOworICAgIHVuc2lnbmVkIGxvbmcgaW9fZGF0YSA9IGh3LT5pb19iYXNlICsgNDsKKworICAgIGUxMDAwX2lvX3dyaXRlKGh3LCBpb19hZGRyLCBvZmZzZXQpOworICAgIGUxMDAwX2lvX3dyaXRlKGh3LCBpb19kYXRhLCB2YWx1ZSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXN0aW1hdGVzIHRoZSBjYWJsZSBsZW5ndGguCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG1pbl9sZW5ndGggLSBUaGUgZXN0aW1hdGVkIG1pbmltdW0gbGVuZ3RoCisgKiBtYXhfbGVuZ3RoIC0gVGhlIGVzdGltYXRlZCBtYXhpbXVtIGxlbmd0aAorICoKKyAqIHJldHVybnM6IC0gRTEwMDBfRVJSX1hYWAorICogICAgICAgICAgICBFMTAwMF9TVUNDRVNTCisgKgorICogVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhIHJhbmdlZCBsZW5ndGggKG1pbmltdW0gJiBtYXhpbXVtKS4KKyAqIFNvIGZvciBNODggcGh5J3MsIHRoaXMgZnVuY3Rpb24gaW50ZXJwcmV0cyB0aGUgb25lIHZhbHVlIHJldHVybmVkIGZyb20gdGhlCisgKiByZWdpc3RlciB0byB0aGUgbWluaW11bSBhbmQgbWF4aW11bSByYW5nZS4KKyAqIEZvciBJR1AgcGh5J3MsIHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSByYW5nZSBieSB0aGUgQUdDIHJlZ2lzdGVycy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2dldF9jYWJsZV9sZW5ndGgoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKm1pbl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICptYXhfbGVuZ3RoKQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBhZ2NfdmFsdWUgPSAwOworICAgIHVpbnQxNl90IGN1cl9hZ2MsIG1pbl9hZ2MgPSBJR1AwMUUxMDAwX0FHQ19MRU5HVEhfVEFCTEVfU0laRTsKKyAgICB1aW50MTZfdCBpLCBwaHlfZGF0YTsKKyAgICB1aW50MTZfdCBjYWJsZV9sZW5ndGg7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2dldF9jYWJsZV9sZW5ndGgiKTsKKworICAgICptaW5fbGVuZ3RoID0gKm1heF9sZW5ndGggPSAwOworCisgICAgLyogVXNlIG9sZCBtZXRob2QgZm9yIFBoeSBvbGRlciB0aGFuIElHUCAqLworICAgIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX1NUQVRVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIGNhYmxlX2xlbmd0aCA9IChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfQ0FCTEVfTEVOR1RIKSA+PgorICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSF9TSElGVDsKKworICAgICAgICAvKiBDb252ZXJ0IHRoZSBlbnVtIHZhbHVlIHRvIHJhbmdlZCB2YWx1ZXMgKi8KKyAgICAgICAgc3dpdGNoIChjYWJsZV9sZW5ndGgpIHsKKyAgICAgICAgY2FzZSBlMTAwMF9jYWJsZV9sZW5ndGhfNTA6CisgICAgICAgICAgICAqbWluX2xlbmd0aCA9IDA7CisgICAgICAgICAgICAqbWF4X2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlMTAwMF9jYWJsZV9sZW5ndGhfNTBfODA6CisgICAgICAgICAgICAqbWluX2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTA7CisgICAgICAgICAgICAqbWF4X2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfODA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlMTAwMF9jYWJsZV9sZW5ndGhfODBfMTEwOgorICAgICAgICAgICAgKm1pbl9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzgwOworICAgICAgICAgICAgKm1heF9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzExMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGUxMDAwX2NhYmxlX2xlbmd0aF8xMTBfMTQwOgorICAgICAgICAgICAgKm1pbl9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzExMDsKKyAgICAgICAgICAgICptYXhfbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlMTAwMF9jYWJsZV9sZW5ndGhfMTQwOgorICAgICAgICAgICAgKm1pbl9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE0MDsKKyAgICAgICAgICAgICptYXhfbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNzA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BIWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7IC8qIEZvciBJR1AgUEhZICovCisgICAgICAgIHVpbnQxNl90IGFnY19yZWdfYXJyYXlbSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU1dID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtJR1AwMUUxMDAwX1BIWV9BR0NfQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BIWV9BR0NfQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BIWV9BR0NfQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BIWV9BR0NfRH07CisgICAgICAgIC8qIFJlYWQgdGhlIEFHQyByZWdpc3RlcnMgZm9yIGFsbCBjaGFubmVscyAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCBJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTTsgaSsrKSB7CisKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIGFnY19yZWdfYXJyYXlbaV0sICZwaHlfZGF0YSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBjdXJfYWdjID0gcGh5X2RhdGEgPj4gSUdQMDFFMTAwMF9BR0NfTEVOR1RIX1NISUZUOworCisgICAgICAgICAgICAvKiBBcnJheSBib3VuZCBjaGVjay4gKi8KKyAgICAgICAgICAgIGlmKChjdXJfYWdjID49IElHUDAxRTEwMDBfQUdDX0xFTkdUSF9UQUJMRV9TSVpFIC0gMSkgfHwKKyAgICAgICAgICAgICAgIChjdXJfYWdjID09IDApKQorICAgICAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BIWTsKKworICAgICAgICAgICAgYWdjX3ZhbHVlICs9IGN1cl9hZ2M7CisKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBtaW5pbWFsIEFHQyB2YWx1ZS4gKi8KKyAgICAgICAgICAgIGlmKG1pbl9hZ2MgPiBjdXJfYWdjKQorICAgICAgICAgICAgICAgIG1pbl9hZ2MgPSBjdXJfYWdjOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVtb3ZlIHRoZSBtaW5pbWFsIEFHQyByZXN1bHQgZm9yIGxlbmd0aCA8IDUwbSAqLworICAgICAgICBpZihhZ2NfdmFsdWUgPCBJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTSAqIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTApIHsKKyAgICAgICAgICAgIGFnY192YWx1ZSAtPSBtaW5fYWdjOworCisgICAgICAgICAgICAvKiBHZXQgdGhlIGF2ZXJhZ2UgbGVuZ3RoIG9mIHRoZSByZW1haW5pbmcgMyBjaGFubmVscyAqLworICAgICAgICAgICAgYWdjX3ZhbHVlIC89IChJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTSAtIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogR2V0IHRoZSBhdmVyYWdlIGxlbmd0aCBvZiBhbGwgdGhlIDQgY2hhbm5lbHMuICovCisgICAgICAgICAgICBhZ2NfdmFsdWUgLz0gSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU07CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgdGhlIHJhbmdlIG9mIHRoZSBjYWxjdWxhdGVkIGxlbmd0aC4gKi8KKyAgICAgICAgKm1pbl9sZW5ndGggPSAoKGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfdGFibGVbYWdjX3ZhbHVlXSAtCisgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfQUdDX1JBTkdFKSA+IDApID8KKyAgICAgICAgICAgICAgICAgICAgICAgKGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfdGFibGVbYWdjX3ZhbHVlXSAtCisgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfQUdDX1JBTkdFKSA6IDA7CisgICAgICAgICptYXhfbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF90YWJsZVthZ2NfdmFsdWVdICsKKyAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX0FHQ19SQU5HRTsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hlY2sgdGhlIGNhYmxlIHBvbGFyaXR5CisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIHBvbGFyaXR5IC0gb3V0cHV0IHBhcmFtZXRlciA6IDAgLSBQb2xhcml0eSBpcyBub3QgcmV2ZXJzZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBQb2xhcml0eSBpcyByZXZlcnNlZC4KKyAqCisgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9YWFgKKyAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUworICoKKyAqIEZvciBwaHkncyBvbGRlciB0aGVuIElHUCwgdGhpcyBmdW5jdGlvbiBzaW1wbHkgcmVhZHMgdGhlIHBvbGFyaXR5IGJpdCBpbiB0aGUKKyAqIFBoeSBTdGF0dXMgcmVnaXN0ZXIuICBGb3IgSUdQIHBoeSdzLCB0aGlzIGJpdCBpcyB2YWxpZCBvbmx5IGlmIGxpbmsgc3BlZWQgaXMKKyAqIDEwIE1icHMuICBJZiB0aGUgbGluayBzcGVlZCBpcyAxMDAgTWJwcyB0aGVyZSBpcyBubyBwb2xhcml0eSBzbyB0aGlzIGJpdCB3aWxsCisgKiByZXR1cm4gMC4gIElmIHRoZSBsaW5rIHNwZWVkIGlzIDEwMDAgTWJwcyB0aGUgcG9sYXJpdHkgc3RhdHVzIGlzIGluIHRoZQorICogSUdQMDFFMTAwMF9QSFlfUENTX0lOSVRfUkVHLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfY2hlY2tfcG9sYXJpdHkoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpwb2xhcml0eSkKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgcGh5X2RhdGE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2NoZWNrX3BvbGFyaXR5Iik7CisKKyAgICBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgeworICAgICAgICAvKiByZXR1cm4gdGhlIFBvbGFyaXR5IGJpdCBpbiB0aGUgU3RhdHVzIHJlZ2lzdGVyLiAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAqcG9sYXJpdHkgPSAocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX1JFVl9QT0xBUklUWSkgPj4KKyAgICAgICAgICAgICAgICAgICAgTTg4RTEwMDBfUFNTUl9SRVZfUE9MQVJJVFlfU0hJRlQ7CisgICAgfSBlbHNlIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CisgICAgICAgIC8qIFJlYWQgdGhlIFN0YXR1cyByZWdpc3RlciB0byBjaGVjayB0aGUgc3BlZWQgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIC8qIElmIHNwZWVkIGlzIDEwMDAgTWJwcywgbXVzdCByZWFkIHRoZSBJR1AwMUUxMDAwX1BIWV9QQ1NfSU5JVF9SRUcgdG8KKyAgICAgICAgICogZmluZCB0aGUgcG9sYXJpdHkgc3RhdHVzICovCisgICAgICAgIGlmKChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUFNTUl9TUEVFRF9NQVNLKSA9PQorICAgICAgICAgICBJR1AwMUUxMDAwX1BTU1JfU1BFRURfMTAwME1CUFMpIHsKKworICAgICAgICAgICAgLyogUmVhZCB0aGUgR0lHIGluaXRpYWxpemF0aW9uIFBDUyByZWdpc3RlciAoMHgwMEI0KSAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUENTX0lOSVRfUkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgLyogQ2hlY2sgdGhlIHBvbGFyaXR5IGJpdHMgKi8KKyAgICAgICAgICAgICpwb2xhcml0eSA9IChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUEhZX1BPTEFSSVRZX01BU0spID8gMSA6IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBGb3IgMTAgTWJwcywgcmVhZCB0aGUgcG9sYXJpdHkgYml0IGluIHRoZSBzdGF0dXMgcmVnaXN0ZXIuIChmb3IKKyAgICAgICAgICAgICAqIDEwMCBNYnBzIHRoaXMgYml0IGlzIGFsd2F5cyAwKSAqLworICAgICAgICAgICAgKnBvbGFyaXR5ID0gcGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BTU1JfUE9MQVJJVFlfUkVWRVJTRUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoZWNrIGlmIERvd25zaGlmdCBvY2N1cmVkCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIGRvd25zaGlmdCAtIG91dHB1dCBwYXJhbWV0ZXIgOiAwIC0gTm8gRG93bnNoaWZ0IG9jdXJlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gRG93bnNoaWZ0IG9jdXJlZC4KKyAqCisgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9YWFgKKyAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUyAKKyAqCisgKiBGb3IgcGh5J3Mgb2xkZXIgdGhlbiBJR1AsIHRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIERvd25zaGlmdCBiaXQgaW4gdGhlIFBoeQorICogU3BlY2lmaWMgU3RhdHVzIHJlZ2lzdGVyLiAgRm9yIElHUCBwaHkncywgaXQgcmVhZHMgdGhlIERvd25ncmFkZSBiaXQgaW4gdGhlCisgKiBMaW5rIEhlYWx0aCByZWdpc3Rlci4gIEluIElHUCB0aGlzIGJpdCBpcyBsYXRjaGVkIGhpZ2gsIHNvIHRoZSBkcml2ZXIgbXVzdAorICogcmVhZCBpdCBpbW1lZGlhdGVseSBhZnRlciBsaW5rIGlzIGVzdGFibGlzaGVkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfY2hlY2tfZG93bnNoaWZ0KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9jaGVja19kb3duc2hpZnQiKTsKKworICAgIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX0xJTktfSEVBTFRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICBody0+c3BlZWRfZG93bmdyYWRlZCA9IChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUExIUl9TU19ET1dOR1JBREUpID8gMSA6IDA7CisgICAgfSBlbHNlIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX1NUQVRVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgaHctPnNwZWVkX2Rvd25ncmFkZWQgPSAocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0RPV05TSElGVCkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9QU1NSX0RPV05TSElGVF9TSElGVDsKKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIDgyNTQxX3Jldl8yICYgODI1NDdfcmV2XzIgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBjb25maWd1cmUgdGhlIERTUCB3aGVuIGEKKyAqIGdpZ2FiaXQgbGluayBpcyBhY2hpZXZlZCB0byBpbXByb3ZlIGxpbmsgcXVhbGl0eS4KKyAqCisgKiBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogcmV0dXJuczogLSBFMTAwMF9FUlJfUEhZIGlmIGZhaWwgdG8gcmVhZC93cml0ZSB0aGUgUEhZCisgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MgYXQgYW55IG90aGVyIGNhc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludDMyX3QKK2UxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2Uoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbl90IGxpbmtfdXApCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9kYXRhLCBwaHlfc2F2ZWRfZGF0YSwgc3BlZWQsIGR1cGxleCwgaTsKKyAgICB1aW50MTZfdCBkc3BfcmVnX2FycmF5W0lHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0lHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9EfTsKKyAgICB1aW50MTZfdCBtaW5fbGVuZ3RoLCBtYXhfbGVuZ3RoOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9jb25maWdfZHNwX2FmdGVyX2xpbmtfY2hhbmdlIik7CisKKyAgICBpZihody0+cGh5X3R5cGUgIT0gZTEwMDBfcGh5X2lncCkKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisKKyAgICBpZihsaW5rX3VwKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9nZXRfc3BlZWRfYW5kX2R1cGxleChodywgJnNwZWVkLCAmZHVwbGV4KTsKKyAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGdldHRpbmcgbGluayBzcGVlZCBhbmQgZHVwbGV4XG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisKKyAgICAgICAgaWYoc3BlZWQgPT0gU1BFRURfMTAwMCkgeworCisgICAgICAgICAgICBlMTAwMF9nZXRfY2FibGVfbGVuZ3RoKGh3LCAmbWluX2xlbmd0aCwgJm1heF9sZW5ndGgpOworCisgICAgICAgICAgICBpZigoaHctPmRzcF9jb25maWdfc3RhdGUgPT0gZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkKSAmJgorICAgICAgICAgICAgICAgIG1pbl9sZW5ndGggPj0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF81MCkgeworCisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBkc3BfcmVnX2FycmF5W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QSFlfRURBQ19NVV9JTkRFWDsKKworICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgZHNwX3JlZ19hcnJheVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOworICAgICAgICAgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGh3LT5kc3BfY29uZmlnX3N0YXRlID0gZTEwMDBfZHNwX2NvbmZpZ19hY3RpdmF0ZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKChody0+ZmZlX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9mZmVfY29uZmlnX2VuYWJsZWQpICYmCisgICAgICAgICAgICAgICAobWluX2xlbmd0aCA8IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTApKSB7CisKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBmZmVfaWRsZV9lcnJfdGltZW91dCA9IEZGRV9JRExFX0VSUl9DT1VOVF9USU1FT1VUXzIwOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGlkbGVfZXJycyA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiBjbGVhciBwcmV2aW91cyBpZGxlIGVycm9yIGNvdW50cyAqLworICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgZmZlX2lkbGVfZXJyX3RpbWVvdXQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoMTAwMCk7CisgICAgICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICAgICAgICAgIGlkbGVfZXJycyArPSAocGh5X2RhdGEgJiBTUl8xMDAwVF9JRExFX0VSUk9SX0NOVCk7CisgICAgICAgICAgICAgICAgICAgIGlmKGlkbGVfZXJycyA+IFNSXzEwMDBUX1BIWV9FWENFU1NJVkVfSURMRV9FUlJfQ09VTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5mZmVfY29uZmlnX3N0YXRlID0gZTEwMDBfZmZlX2NvbmZpZ19hY3RpdmU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QSFlfRFNQX0ZGRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0RTUF9GRkVfQ01fQ1ApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoaWRsZV9lcnJzKQorICAgICAgICAgICAgICAgICAgICAgICAgZmZlX2lkbGVfZXJyX3RpbWVvdXQgPSBGRkVfSURMRV9FUlJfQ09VTlRfVElNRU9VVF8xMDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYoaHctPmRzcF9jb25maWdfc3RhdGUgPT0gZTEwMDBfZHNwX2NvbmZpZ19hY3RpdmF0ZWQpIHsKKyAgICAgICAgICAgIC8qIFNhdmUgb2ZmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHJlZ2lzdGVyIDB4MkY1QiB0byBiZSByZXN0b3JlZCBhdAorICAgICAgICAgICAgICogdGhlIGVuZCBvZiB0aGUgcm91dGluZXMuICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCAweDJGNUIsICZwaHlfc2F2ZWRfZGF0YSk7CisKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIFBIWSB0cmFuc21pdHRlciAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MkY1QiwgMHgwMDAzKTsKKworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgbXNlY19kZWxheSgyMCk7CisKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX0lFRUVfRk9SQ0VfR0lHQSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIGRzcF9yZWdfYXJyYXlbaV0sICZwaHlfZGF0YSk7CisgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QSFlfRURBQ19NVV9JTkRFWDsKKyAgICAgICAgICAgICAgICBwaHlfZGF0YSB8PSAgSUdQMDFFMTAwMF9QSFlfRURBQ19TSUdOX0VYVF85X0JJVFM7CisKKyAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodyxkc3BfcmVnX2FycmF5W2ldLCBwaHlfZGF0YSk7CisgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX0lFRUVfUkVTVEFSVF9BVVRPTkVHKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIG1zZWNfZGVsYXkoMjApOworCisgICAgICAgICAgICAvKiBOb3cgZW5hYmxlIHRoZSB0cmFuc21pdHRlciAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MkY1QiwgcGh5X3NhdmVkX2RhdGEpOworCisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBody0+ZHNwX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2RzcF9jb25maWdfZW5hYmxlZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGh3LT5mZmVfY29uZmlnX3N0YXRlID09IGUxMDAwX2ZmZV9jb25maWdfYWN0aXZlKSB7CisgICAgICAgICAgICAvKiBTYXZlIG9mZiB0aGUgY3VycmVudCB2YWx1ZSBvZiByZWdpc3RlciAweDJGNUIgdG8gYmUgcmVzdG9yZWQgYXQKKyAgICAgICAgICAgICAqIHRoZSBlbmQgb2YgdGhlIHJvdXRpbmVzLiAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgMHgyRjVCLCAmcGh5X3NhdmVkX2RhdGEpOworCisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBQSFkgdHJhbnNtaXR0ZXIgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDJGNUIsIDB4MDAwMyk7CisKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIG1zZWNfZGVsYXkoMjApOworCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9JRUVFX0ZPUkNFX0dJR0EpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9EU1BfRkZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QSFlfRFNQX0ZGRV9ERUZBVUxUKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX0lFRUVfUkVTVEFSVF9BVVRPTkVHKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIG1zZWNfZGVsYXkoMjApOworCisgICAgICAgICAgICAvKiBOb3cgZW5hYmxlIHRoZSB0cmFuc21pdHRlciAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MkY1QiwgcGh5X3NhdmVkX2RhdGEpOworCisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBody0+ZmZlX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2ZmZV9jb25maWdfZW5hYmxlZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZXQgUEhZIHRvIGNsYXNzIEEgbW9kZQorICogQXNzdW1lcyB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgd2lsbCBmb2xsb3cgdG8gZW5hYmxlIHRoZSBuZXcgY2xhc3MgbW9kZS4KKyAqICAxLiBEbyBhIFBIWSBzb2Z0IHJlc2V0CisgKiAgMi4gUmVzdGFydCBhdXRvLW5lZ290aWF0aW9uIG9yIGZvcmNlIGxpbmsuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX3NldF9waHlfbW9kZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBlZXByb21fZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X3BoeV9tb2RlIik7CisKKyAgICBpZigoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ1X3Jldl8zKSAmJgorICAgICAgIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBFRVBST01fUEhZX0NMQVNTX1dPUkQsIDEsICZlZXByb21fZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisKKyAgICAgICAgaWYoKGVlcHJvbV9kYXRhICE9IEVFUFJPTV9SRVNFUlZFRF9XT1JEKSAmJgorICAgICAgICAgICAoZWVwcm9tX2RhdGEgJiBFRVBST01fUEhZX0NMQVNTX0EpKSB7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMEIpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsIDB4ODEwNCk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBody0+cGh5X3Jlc2V0X2Rpc2FibGUgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGxwbHUgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBhY3RpdmUgZmxhZy4gIFdoZW4KKyAqIGFjdGl2YXRpbmcgbHBsdSB0aGlzIGZ1bmN0aW9uIGFsc28gZGlzYWJsZXMgc21hcnQgc3BlZWQgYW5kIHZpc2UgdmVyc2EuCisgKiBscGx1IHdpbGwgbm90IGJlIGFjdGl2YXRlZCB1bmxlc3MgdGhlIGRldmljZSBhdXRvbmVnb3RpYXRpb24gYWR2ZXJ0aXNtZW50CisgKiBtZWV0cyBzdGFuZGFyZHMgb2YgZWl0aGVyIDEwIG9yIDEwLzEwMCBvciAxMC8xMDAvMTAwMCBhdCBhbGwgZHVwbGV4ZXMuCisgKiBodzogU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBhY3RpdmUgLSB0cnVlIHRvIGVuYWJsZSBscGx1IGZhbHNlIHRvIGRpc2FibGUgbHBsdS4KKyAqCisgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9QSFkgaWYgZmFpbCB0byByZWFkL3dyaXRlIHRoZSBQSFkKKyAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUyBhdCBhbnkgb3RoZXIgY2FzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50MzJfdAorZTEwMDBfc2V0X2QzX2xwbHVfc3RhdGUoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5fdCBhY3RpdmUpCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X2QzX2xwbHVfc3RhdGUiKTsKKworICAgIGlmKCEoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MV9yZXZfMikgfHwKKyAgICAgICAgIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpKSkKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisKKyAgICAvKiBEdXJpbmcgZHJpdmVyIGFjdGl2aXR5IExQTFUgc2hvdWxkIG5vdCBiZSB1c2VkIG9yIGl0IHdpbGwgYXR0YWluIGxpbmsKKyAgICAgKiBmcm9tIHRoZSBsb3dlc3Qgc3BlZWRzIHN0YXJ0aW5nIGZyb20gMTBNYnBzLiBUaGUgY2FwYWJpbGl0eSBpcyB1c2VkIGZvcgorICAgICAqIER4IHRyYW5zaXRpb25zIGFuZCBzdGF0ZXMgKi8KKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0dNSUlfRklGTywgJnBoeV9kYXRhKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIGlmKCFhY3RpdmUpIHsKKyAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfR01JSV9GTEVYX1NQRDsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfR01JSV9GSUZPLCBwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAvKiBMUExVIGFuZCBTbWFydFNwZWVkIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICBMUExVIGlzIHVzZWQgZHVyaW5nCisgICAgICAgICAqIER4IHN0YXRlcyB3aGVyZSB0aGUgcG93ZXIgY29uc2VydmF0aW9uIGlzIG1vc3QgaW1wb3J0YW50LiAgRHVyaW5nCisgICAgICAgICAqIGRyaXZlciBhY3Rpdml0eSB3ZSBzaG91bGQgZW5hYmxlIFNtYXJ0U3BlZWQsIHNvIHBlcmZvcm1hbmNlIGlzCisgICAgICAgICAqIG1haW50YWluZWQuICovCisgICAgICAgIGlmIChody0+c21hcnRfc3BlZWQgPT0gZTEwMDBfc21hcnRfc3BlZWRfb24pIHsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgcGh5X2RhdGEgfD0gSUdQMDFFMTAwMF9QU0NGUl9TTUFSVF9TUEVFRDsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0gZWxzZSBpZiAoaHctPnNtYXJ0X3NwZWVkID09IGUxMDAwX3NtYXJ0X3NwZWVkX29mZikgeworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisJICAgIGlmIChyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QU0NGUl9TTUFSVF9TUEVFRDsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKworICAgIH0gZWxzZSBpZigoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9PSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUKSB8fAorICAgICAgICAgICAgICAoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9PSBBVVRPTkVHX0FEVkVSVElTRV8xMF9BTEwgKSB8fAorICAgICAgICAgICAgICAoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9PSBBVVRPTkVHX0FEVkVSVElTRV8xMF8xMDBfQUxMKSkgeworCisgICAgICAgIHBoeV9kYXRhIHw9IElHUDAxRTEwMDBfR01JSV9GTEVYX1NQRDsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfR01JSV9GSUZPLCBwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAvKiBXaGVuIExQTFUgaXMgZW5hYmxlZCB3ZSBzaG91bGQgZGlzYWJsZSBTbWFydFNwZWVkICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLCAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywgcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoYW5nZSBWQ08gc3BlZWQgcmVnaXN0ZXIgdG8gaW1wcm92ZSBCaXQgRXJyb3IgUmF0ZSBwZXJmb3JtYW5jZSBvZiBTRVJERVMuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9zZXRfdmNvX3NwZWVkKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MzJfdCAgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBkZWZhdWx0X3BhZ2UgPSAwOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9zZXRfdmNvX3NwZWVkIik7CisKKyAgICBzd2l0Y2goaHctPm1hY190eXBlKSB7CisgICAgY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKKyAgICBjYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworICAgIH0KKworICAgIC8qIFNldCBQSFkgcmVnaXN0ZXIgMzAsIHBhZ2UgNSwgYml0IDggdG8gMCAqLworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAmZGVmYXVsdF9wYWdlKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIDB4MDAwNSk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsICZwaHlfZGF0YSk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBwaHlfZGF0YSAmPSB+TTg4RTEwMDBfUEhZX1ZDT19SRUdfQklUODsKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCBwaHlfZGF0YSk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAvKiBTZXQgUEhZIHJlZ2lzdGVyIDMwLCBwYWdlIDQsIGJpdCAxMSB0byAxICovCisKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMDQpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAmcGh5X2RhdGEpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUEhZX1ZDT19SRUdfQklUMTE7CisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgcGh5X2RhdGEpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgZGVmYXVsdF9wYWdlKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50MzJfdAorZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfd29ya2Fyb3VuZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBtaWlfc3RhdHVzX3JlZzsKKyAgICB1aW50MTZfdCBpOworCisgICAgLyogUG9sYXJpdHkgcmV2ZXJzYWwgd29ya2Fyb3VuZCBmb3IgZm9yY2VkIDEwRi8xMEggbGlua3MuICovCisKKyAgICAvKiBEaXNhYmxlIHRoZSB0cmFuc21pdHRlciBvbiB0aGUgUEhZICovCisKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMTkpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsIDB4RkZGRik7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMDApOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgLyogVGhpcyBsb29wIHdpbGwgZWFybHktb3V0IGlmIHRoZSBOTyBsaW5rIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuICovCisgICAgZm9yKGkgPSBQSFlfRk9SQ0VfVElNRTsgaSA+IDA7IGktLSkgeworICAgICAgICAvKiBSZWFkIHRoZSBNSUkgU3RhdHVzIFJlZ2lzdGVyIGFuZCB3YWl0IGZvciBMaW5rIFN0YXR1cyBiaXQKKyAgICAgICAgICogdG8gYmUgY2xlYXIuCisgICAgICAgICAqLworCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZyk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgaWYoKG1paV9zdGF0dXNfcmVnICYgfk1JSV9TUl9MSU5LX1NUQVRVUykgPT0gMCkgYnJlYWs7CisgICAgICAgIG1zZWNfZGVsYXlfaXJxKDEwMCk7CisgICAgfQorCisgICAgLyogUmVjb21tZW5kZWQgZGVsYXkgdGltZSBhZnRlciBsaW5rIGhhcyBiZWVuIGxvc3QgKi8KKyAgICBtc2VjX2RlbGF5X2lycSgxMDAwKTsKKworICAgIC8qIE5vdyB3ZSB3aWxsIHJlLWVuYWJsZSB0aCB0cmFuc21pdHRlciBvbiB0aGUgUEhZICovCisKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMTkpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIG1zZWNfZGVsYXlfaXJxKDUwKTsKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAweEZGRjApOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIG1zZWNfZGVsYXlfaXJxKDUwKTsKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAweEZGMDApOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIG1zZWNfZGVsYXlfaXJxKDUwKTsKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAweDAwMDApOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMHgwMDAwKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIC8qIFRoaXMgbG9vcCB3aWxsIGVhcmx5LW91dCBpZiB0aGUgbGluayBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAqLworICAgIGZvcihpID0gUEhZX0ZPUkNFX1RJTUU7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgd2FpdCBmb3IgTGluayBTdGF0dXMgYml0CisgICAgICAgICAqIHRvIGJlIHNldC4KKyAgICAgICAgICovCisKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZyk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICBpZihtaWlfc3RhdHVzX3JlZyAmIE1JSV9TUl9MSU5LX1NUQVRVUykgYnJlYWs7CisgICAgICAgIG1zZWNfZGVsYXlfaXJxKDEwMCk7CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzk3ZTYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaApAQCAtMCwwICsxLDIxNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyAgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKKyAgbW9yZSBkZXRhaWxzLgorICAKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgCisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICAKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgIAorICBDb250YWN0IEluZm9ybWF0aW9uOgorICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBlMTAwMF9ody5oCisgKiBTdHJ1Y3R1cmVzLCBlbnVtcywgYW5kIG1hY3JvcyBmb3IgdGhlIE1BQworICovCisKKyNpZm5kZWYgX0UxMDAwX0hXX0hfCisjZGVmaW5lIF9FMTAwMF9IV19IXworCisjaW5jbHVkZSAiZTEwMDBfb3NkZXAuaCIKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIHNoYXJlZCBjb2RlICovCitzdHJ1Y3QgZTEwMDBfaHc7CitzdHJ1Y3QgZTEwMDBfaHdfc3RhdHM7CisKKy8qIEVudW1lcmF0ZWQgdHlwZXMgc3BlY2lmaWMgdG8gdGhlIGUxMDAwIGhhcmR3YXJlICovCisvKiBNZWRpYSBBY2Nlc3MgQ29udHJvbGVycyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF91bmRlZmluZWQgPSAwLAorICAgIGUxMDAwXzgyNTQyX3JldjJfMCwKKyAgICBlMTAwMF84MjU0Ml9yZXYyXzEsCisgICAgZTEwMDBfODI1NDMsCisgICAgZTEwMDBfODI1NDQsCisgICAgZTEwMDBfODI1NDAsCisgICAgZTEwMDBfODI1NDUsCisgICAgZTEwMDBfODI1NDVfcmV2XzMsCisgICAgZTEwMDBfODI1NDYsCisgICAgZTEwMDBfODI1NDZfcmV2XzMsCisgICAgZTEwMDBfODI1NDEsCisgICAgZTEwMDBfODI1NDFfcmV2XzIsCisgICAgZTEwMDBfODI1NDcsCisgICAgZTEwMDBfODI1NDdfcmV2XzIsCisgICAgZTEwMDBfbnVtX21hY3MKK30gZTEwMDBfbWFjX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfZWVwcm9tX3VuaW5pdGlhbGl6ZWQgPSAwLAorICAgIGUxMDAwX2VlcHJvbV9zcGksCisgICAgZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSwKKyAgICBlMTAwMF9udW1fZWVwcm9tX3R5cGVzCit9IGUxMDAwX2VlcHJvbV90eXBlOworCisvKiBNZWRpYSBUeXBlcyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9tZWRpYV90eXBlX2NvcHBlciA9IDAsCisgICAgZTEwMDBfbWVkaWFfdHlwZV9maWJlciA9IDEsCisgICAgZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMgPSAyLAorICAgIGUxMDAwX251bV9tZWRpYV90eXBlcworfSBlMTAwMF9tZWRpYV90eXBlOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwXzEwX2hhbGYgPSAwLAorICAgIGUxMDAwXzEwX2Z1bGwgPSAxLAorICAgIGUxMDAwXzEwMF9oYWxmID0gMiwKKyAgICBlMTAwMF8xMDBfZnVsbCA9IDMKK30gZTEwMDBfc3BlZWRfZHVwbGV4X3R5cGU7CisKKy8qIEZsb3cgQ29udHJvbCBTZXR0aW5ncyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9mY19ub25lID0gMCwKKyAgICBlMTAwMF9mY19yeF9wYXVzZSA9IDEsCisgICAgZTEwMDBfZmNfdHhfcGF1c2UgPSAyLAorICAgIGUxMDAwX2ZjX2Z1bGwgPSAzLAorICAgIGUxMDAwX2ZjX2RlZmF1bHQgPSAweEZGCit9IGUxMDAwX2ZjX3R5cGU7CisKKy8qIFBDSSBidXMgdHlwZXMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfYnVzX3R5cGVfdW5rbm93biA9IDAsCisgICAgZTEwMDBfYnVzX3R5cGVfcGNpLAorICAgIGUxMDAwX2J1c190eXBlX3BjaXgsCisgICAgZTEwMDBfYnVzX3R5cGVfcmVzZXJ2ZWQKK30gZTEwMDBfYnVzX3R5cGU7CisKKy8qIFBDSSBidXMgc3BlZWRzICovCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2J1c19zcGVlZF91bmtub3duID0gMCwKKyAgICBlMTAwMF9idXNfc3BlZWRfMzMsCisgICAgZTEwMDBfYnVzX3NwZWVkXzY2LAorICAgIGUxMDAwX2J1c19zcGVlZF8xMDAsCisgICAgZTEwMDBfYnVzX3NwZWVkXzEyMCwKKyAgICBlMTAwMF9idXNfc3BlZWRfMTMzLAorICAgIGUxMDAwX2J1c19zcGVlZF9yZXNlcnZlZAorfSBlMTAwMF9idXNfc3BlZWQ7CisKKy8qIFBDSSBidXMgd2lkdGhzICovCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2J1c193aWR0aF91bmtub3duID0gMCwKKyAgICBlMTAwMF9idXNfd2lkdGhfMzIsCisgICAgZTEwMDBfYnVzX3dpZHRoXzY0LAorICAgIGUxMDAwX2J1c193aWR0aF9yZXNlcnZlZAorfSBlMTAwMF9idXNfd2lkdGg7CisKKy8qIFBIWSBzdGF0dXMgaW5mbyBzdHJ1Y3R1cmUgYW5kIHN1cHBvcnRpbmcgZW51bXMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfY2FibGVfbGVuZ3RoXzUwID0gMCwKKyAgICBlMTAwMF9jYWJsZV9sZW5ndGhfNTBfODAsCisgICAgZTEwMDBfY2FibGVfbGVuZ3RoXzgwXzExMCwKKyAgICBlMTAwMF9jYWJsZV9sZW5ndGhfMTEwXzE0MCwKKyAgICBlMTAwMF9jYWJsZV9sZW5ndGhfMTQwLAorICAgIGUxMDAwX2NhYmxlX2xlbmd0aF91bmRlZmluZWQgPSAweEZGCit9IGUxMDAwX2NhYmxlX2xlbmd0aDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzEwICA9IDEwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMjAgID0gMjAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8zMCAgPSAzMCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzQwICA9IDQwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTAgID0gNTAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF82MCAgPSA2MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzcwICA9IDcwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfODAgID0gODAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF85MCAgPSA5MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzEwMCA9IDEwMCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzExMCA9IDExMCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzEyMCA9IDEyMCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzEzMCA9IDEzMCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE0MCA9IDE0MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE1MCA9IDE1MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE2MCA9IDE2MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE3MCA9IDE3MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzE4MCA9IDE4MAorfSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlX25vcm1hbCA9IDAsCisgICAgZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfbG93ZXIsCisgICAgZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGVfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9yZXZfcG9sYXJpdHlfbm9ybWFsID0gMCwKKyAgICBlMTAwMF9yZXZfcG9sYXJpdHlfcmV2ZXJzZWQsCisgICAgZTEwMDBfcmV2X3BvbGFyaXR5X3VuZGVmaW5lZCA9IDB4RkYKK30gZTEwMDBfcmV2X3BvbGFyaXR5OworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2Rvd25zaGlmdF9ub3JtYWwgPSAwLAorICAgIGUxMDAwX2Rvd25zaGlmdF9hY3RpdmF0ZWQsCisgICAgZTEwMDBfZG93bnNoaWZ0X3VuZGVmaW5lZCA9IDB4RkYKK30gZTEwMDBfZG93bnNoaWZ0OworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX3NtYXJ0X3NwZWVkX2RlZmF1bHQgPSAwLAorICAgIGUxMDAwX3NtYXJ0X3NwZWVkX29uLAorICAgIGUxMDAwX3NtYXJ0X3NwZWVkX29mZgorfSBlMTAwMF9zbWFydF9zcGVlZDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF9lbmFibGVkID0gMCwKKyAgICBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF9kaXNhYmxlZCwKKyAgICBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbF91bmRlZmluZWQgPSAweEZGCit9IGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2F1dG9feF9tb2RlX21hbnVhbF9tZGkgPSAwLAorICAgIGUxMDAwX2F1dG9feF9tb2RlX21hbnVhbF9tZGl4LAorICAgIGUxMDAwX2F1dG9feF9tb2RlX2F1dG8xLAorICAgIGUxMDAwX2F1dG9feF9tb2RlX2F1dG8yLAorICAgIGUxMDAwX2F1dG9feF9tb2RlX3VuZGVmaW5lZCA9IDB4RkYKK30gZTEwMDBfYXV0b194X21vZGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfMTAwMHRfcnhfc3RhdHVzX25vdF9vayA9IDAsCisgICAgZTEwMDBfMTAwMHRfcnhfc3RhdHVzX29rLAorICAgIGUxMDAwXzEwMDB0X3J4X3N0YXR1c191bmRlZmluZWQgPSAweEZGCit9IGUxMDAwXzEwMDB0X3J4X3N0YXR1czsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9waHlfbTg4ID0gMCwKKyAgICBlMTAwMF9waHlfaWdwLAorICAgIGUxMDAwX3BoeV91bmRlZmluZWQgPSAweEZGCit9IGUxMDAwX3BoeV90eXBlOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX21zX2h3X2RlZmF1bHQgPSAwLAorICAgIGUxMDAwX21zX2ZvcmNlX21hc3RlciwKKyAgICBlMTAwMF9tc19mb3JjZV9zbGF2ZSwKKyAgICBlMTAwMF9tc19hdXRvCit9IGUxMDAwX21zX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfZmZlX2NvbmZpZ19lbmFibGVkID0gMCwKKyAgICBlMTAwMF9mZmVfY29uZmlnX2FjdGl2ZSwKKyAgICBlMTAwMF9mZmVfY29uZmlnX2Jsb2NrZWQKK30gZTEwMDBfZmZlX2NvbmZpZzsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9kc3BfY29uZmlnX2Rpc2FibGVkID0gMCwKKyAgICBlMTAwMF9kc3BfY29uZmlnX2VuYWJsZWQsCisgICAgZTEwMDBfZHNwX2NvbmZpZ19hY3RpdmF0ZWQsCisgICAgZTEwMDBfZHNwX2NvbmZpZ191bmRlZmluZWQgPSAweEZGCit9IGUxMDAwX2RzcF9jb25maWc7CisKK3N0cnVjdCBlMTAwMF9waHlfaW5mbyB7CisgICAgZTEwMDBfY2FibGVfbGVuZ3RoIGNhYmxlX2xlbmd0aDsKKyAgICBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZSBleHRlbmRlZF8xMGJ0X2Rpc3RhbmNlOworICAgIGUxMDAwX3Jldl9wb2xhcml0eSBjYWJsZV9wb2xhcml0eTsKKyAgICBlMTAwMF9kb3duc2hpZnQgZG93bnNoaWZ0OworICAgIGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsIHBvbGFyaXR5X2NvcnJlY3Rpb247CisgICAgZTEwMDBfYXV0b194X21vZGUgbWRpeF9tb2RlOworICAgIGUxMDAwXzEwMDB0X3J4X3N0YXR1cyBsb2NhbF9yeDsKKyAgICBlMTAwMF8xMDAwdF9yeF9zdGF0dXMgcmVtb3RlX3J4OworfTsKKworc3RydWN0IGUxMDAwX3BoeV9zdGF0cyB7CisgICAgdWludDMyX3QgaWRsZV9lcnJvcnM7CisgICAgdWludDMyX3QgcmVjZWl2ZV9lcnJvcnM7Cit9OworCitzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8geworICAgIGUxMDAwX2VlcHJvbV90eXBlIHR5cGU7CisgICAgdWludDE2X3Qgd29yZF9zaXplOworICAgIHVpbnQxNl90IG9wY29kZV9iaXRzOworICAgIHVpbnQxNl90IGFkZHJlc3NfYml0czsKKyAgICB1aW50MTZfdCBkZWxheV91c2VjOworICAgIHVpbnQxNl90IHBhZ2Vfc2l6ZTsKK307CisKKworCisvKiBFcnJvciBDb2RlcyAqLworI2RlZmluZSBFMTAwMF9TVUNDRVNTICAgICAgMAorI2RlZmluZSBFMTAwMF9FUlJfRUVQUk9NICAgMQorI2RlZmluZSBFMTAwMF9FUlJfUEhZICAgICAgMgorI2RlZmluZSBFMTAwMF9FUlJfQ09ORklHICAgMworI2RlZmluZSBFMTAwMF9FUlJfUEFSQU0gICAgNAorI2RlZmluZSBFMTAwMF9FUlJfTUFDX1RZUEUgNQorI2RlZmluZSBFMTAwMF9FUlJfUEhZX1RZUEUgNgorCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCisvKiBJbml0aWFsaXphdGlvbiAqLworaW50MzJfdCBlMTAwMF9yZXNldF9odyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfaW5pdF9odyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfc2V0X21hY190eXBlKHN0cnVjdCBlMTAwMF9odyAqaHcpOwordm9pZCBlMTAwMF9zZXRfbWVkaWFfdHlwZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKKworLyogTGluayBDb25maWd1cmF0aW9uICovCitpbnQzMl90IGUxMDAwX3NldHVwX2xpbmsoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX3BoeV9zZXR1cF9hdXRvbmVnKHN0cnVjdCBlMTAwMF9odyAqaHcpOwordm9pZCBlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3Qoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKHN0cnVjdCBlMTAwMF9odyAqaHcpOworaW50MzJfdCBlMTAwMF9jaGVja19mb3JfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDE2X3QgKiBzcGVlZCwgdWludDE2X3QgKiBkdXBsZXgpOworaW50MzJfdCBlMTAwMF93YWl0X2F1dG9uZWcoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX2ZvcmNlX21hY19mYyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKKworLyogUEhZICovCitpbnQzMl90IGUxMDAwX3JlYWRfcGh5X3JlZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCByZWdfYWRkciwgdWludDE2X3QgKnBoeV9kYXRhKTsKK2ludDMyX3QgZTEwMDBfd3JpdGVfcGh5X3JlZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCByZWdfYWRkciwgdWludDE2X3QgZGF0YSk7Cit2b2lkIGUxMDAwX3BoeV9od19yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfcGh5X3Jlc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcpOworaW50MzJfdCBlMTAwMF9kZXRlY3RfZ2lnX3BoeShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfcGh5X2dldF9pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcsIHN0cnVjdCBlMTAwMF9waHlfaW5mbyAqcGh5X2luZm8pOworaW50MzJfdCBlMTAwMF9waHlfbTg4X2dldF9pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcsIHN0cnVjdCBlMTAwMF9waHlfaW5mbyAqcGh5X2luZm8pOworaW50MzJfdCBlMTAwMF9waHlfaWdwX2dldF9pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcsIHN0cnVjdCBlMTAwMF9waHlfaW5mbyAqcGh5X2luZm8pOworaW50MzJfdCBlMTAwMF9nZXRfY2FibGVfbGVuZ3RoKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90ICptaW5fbGVuZ3RoLCB1aW50MTZfdCAqbWF4X2xlbmd0aCk7CitpbnQzMl90IGUxMDAwX2NoZWNrX3BvbGFyaXR5KHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90ICpwb2xhcml0eSk7CitpbnQzMl90IGUxMDAwX2NoZWNrX2Rvd25zaGlmdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfdmFsaWRhdGVfbWRpX3NldHRpbmcoc3RydWN0IGUxMDAwX2h3ICpodyk7CisKKy8qIEVFUFJPTSBGdW5jdGlvbnMgKi8KK3ZvaWQgZTEwMDBfaW5pdF9lZXByb21fcGFyYW1zKHN0cnVjdCBlMTAwMF9odyAqaHcpOworaW50MzJfdCBlMTAwMF9yZWFkX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCByZWcsIHVpbnQxNl90IHdvcmRzLCB1aW50MTZfdCAqZGF0YSk7CitpbnQzMl90IGUxMDAwX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfd3JpdGVfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90IHJlZywgdWludDE2X3Qgd29yZHMsIHVpbnQxNl90ICpkYXRhKTsKK2ludDMyX3QgZTEwMDBfcmVhZF9wYXJ0X251bShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCAqIHBhcnRfbnVtKTsKK2ludDMyX3QgZTEwMDBfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgZTEwMDBfaHcgKiBodyk7CisKKy8qIEZpbHRlcnMgKG11bHRpY2FzdCwgdmxhbiwgcmVjZWl2ZSkgKi8KK3ZvaWQgZTEwMDBfaW5pdF9yeF9hZGRycyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfbWNfYWRkcl9saXN0X3VwZGF0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50OF90ICogbWNfYWRkcl9saXN0LCB1aW50MzJfdCBtY19hZGRyX2NvdW50LCB1aW50MzJfdCBwYWQsIHVpbnQzMl90IHJhcl91c2VkX2NvdW50KTsKK3VpbnQzMl90IGUxMDAwX2hhc2hfbWNfYWRkcihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50OF90ICogbWNfYWRkcik7Cit2b2lkIGUxMDAwX210YV9zZXQoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgaGFzaF92YWx1ZSk7Cit2b2lkIGUxMDAwX3Jhcl9zZXQoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDhfdCAqIG1jX2FkZHIsIHVpbnQzMl90IHJhcl9pbmRleCk7Cit2b2lkIGUxMDAwX3dyaXRlX3ZmdGEoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCB2YWx1ZSk7Cit2b2lkIGUxMDAwX2NsZWFyX3ZmdGEoc3RydWN0IGUxMDAwX2h3ICpodyk7CisKKy8qIExFRCBmdW5jdGlvbnMgKi8KK2ludDMyX3QgZTEwMDBfc2V0dXBfbGVkKHN0cnVjdCBlMTAwMF9odyAqaHcpOworaW50MzJfdCBlMTAwMF9jbGVhbnVwX2xlZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfbGVkX29uKHN0cnVjdCBlMTAwMF9odyAqaHcpOworaW50MzJfdCBlMTAwMF9sZWRfb2ZmKHN0cnVjdCBlMTAwMF9odyAqaHcpOworCisvKiBBZGFwdGl2ZSBJRlMgRnVuY3Rpb25zICovCisKKy8qIEV2ZXJ5dGhpbmcgZWxzZSAqLwordWludDMyX3QgZTEwMDBfZW5hYmxlX21uZ19wYXNzX3RocnUoc3RydWN0IGUxMDAwX2h3ICpodyk7Cit2b2lkIGUxMDAwX2NsZWFyX2h3X2NudHJzKHN0cnVjdCBlMTAwMF9odyAqaHcpOwordm9pZCBlMTAwMF9yZXNldF9hZGFwdGl2ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfdXBkYXRlX2FkYXB0aXZlKHN0cnVjdCBlMTAwMF9odyAqaHcpOwordm9pZCBlMTAwMF90YmlfYWRqdXN0X3N0YXRzKHN0cnVjdCBlMTAwMF9odyAqaHcsIHN0cnVjdCBlMTAwMF9od19zdGF0cyAqc3RhdHMsIHVpbnQzMl90IGZyYW1lX2xlbiwgdWludDhfdCAqIG1hY19hZGRyKTsKK3ZvaWQgZTEwMDBfZ2V0X2J1c19pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcpOwordm9pZCBlMTAwMF9wY2lfc2V0X213aShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfcGNpX2NsZWFyX213aShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfcmVhZF9wY2lfY2ZnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZywgdWludDE2X3QgKiB2YWx1ZSk7Cit2b2lkIGUxMDAwX3dyaXRlX3BjaV9jZmcoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnLCB1aW50MTZfdCAqIHZhbHVlKTsKKy8qIFBvcnQgSS9PIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgyNTQ0IGFuZCBuZXdlciAqLwordWludDMyX3QgZTEwMDBfaW9fcmVhZChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHBvcnQpOwordWludDMyX3QgZTEwMDBfcmVhZF9yZWdfaW8oc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3Qgb2Zmc2V0KTsKK3ZvaWQgZTEwMDBfaW9fd3JpdGUoc3RydWN0IGUxMDAwX2h3ICpodywgdW5zaWduZWQgbG9uZyBwb3J0LCB1aW50MzJfdCB2YWx1ZSk7Cit2b2lkIGUxMDAwX3dyaXRlX3JlZ19pbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKTsKK2ludDMyX3QgZTEwMDBfY29uZmlnX2RzcF9hZnRlcl9saW5rX2NoYW5nZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sZWFuX3QgbGlua191cCk7CitpbnQzMl90IGUxMDAwX3NldF9kM19scGx1X3N0YXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsIGJvb2xlYW5fdCBhY3RpdmUpOworCisjZGVmaW5lIEUxMDAwX1JFQURfUkVHX0lPKGEsIHJlZykgXAorICAgIGUxMDAwX3JlYWRfcmVnX2lvKChhKSwgRTEwMDBfIyNyZWcpCisjZGVmaW5lIEUxMDAwX1dSSVRFX1JFR19JTyhhLCByZWcsIHZhbCkgXAorICAgIGUxMDAwX3dyaXRlX3JlZ19pbygoYSksIEUxMDAwXyMjcmVnLCB2YWwpCisKKy8qIFBDSSBEZXZpY2UgSURzICovCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MiAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDNHQ19GSUJFUiAgICAgICAweDEwMDEKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQzR0NfQ09QUEVSICAgICAgMHgxMDA0CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NEVJX0NPUFBFUiAgICAgIDB4MTAwOAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDRFSV9GSUJFUiAgICAgICAweDEwMDkKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ0R0NfQ09QUEVSICAgICAgMHgxMDBDCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NEdDX0xPTSAgICAgICAgIDB4MTAwRAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDBFTSAgICAgICAgICAgICAweDEwMEUKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQwRU1fTE9NICAgICAgICAgMHgxMDE1CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MEVQX0xPTSAgICAgICAgIDB4MTAxNgorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDBFUCAgICAgICAgICAgICAweDEwMTcKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQwRVBfTFAgICAgICAgICAgMHgxMDFFCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NUVNX0NPUFBFUiAgICAgIDB4MTAwRgorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDVFTV9GSUJFUiAgICAgICAweDEwMTEKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ1R01fQ09QUEVSICAgICAgMHgxMDI2CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NUdNX0ZJQkVSICAgICAgIDB4MTAyNworI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDVHTV9TRVJERVMgICAgICAweDEwMjgKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2RUJfQ09QUEVSICAgICAgMHgxMDEwCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkVCX0ZJQkVSICAgICAgIDB4MTAxMgorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDZFQl9RVUFEX0NPUFBFUiAweDEwMUQKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQxRUkgICAgICAgICAgICAgMHgxMDEzCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MUVJX01PQklMRSAgICAgIDB4MTAxOAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDFFUiAgICAgICAgICAgICAweDEwNzgKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ3R0kgICAgICAgICAgICAgMHgxMDc1CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MUdJICAgICAgICAgICAgIDB4MTA3NgorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDFHSV9NT0JJTEUgICAgICAweDEwNzcKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQxR0lfTEYgICAgICAgICAgMHgxMDdDCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkdCX0NPUFBFUiAgICAgIDB4MTA3OQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDZHQl9GSUJFUiAgICAgICAweDEwN0EKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2R0JfU0VSREVTICAgICAgMHgxMDdCCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkdCX1BDSUUgICAgICAgIDB4MTA4QQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDdFSSAgICAgICAgICAgICAweDEwMTkKKworI2RlZmluZSBOT0RFX0FERFJFU1NfU0laRSA2CisjZGVmaW5lIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyA2CisKKy8qIE1BQyBkZWNvZGUgc2l6ZSBpcyAxMjhLIC0gVGhpcyBpcyB0aGUgc2l6ZSBvZiBCQVIwICovCisjZGVmaW5lIE1BQ19ERUNPREVfU0laRSAoMTI4ICogMTAyNCkKKworI2RlZmluZSBFMTAwMF84MjU0Ml8yXzBfUkVWX0lEIDIKKyNkZWZpbmUgRTEwMDBfODI1NDJfMl8xX1JFVl9JRCAzCisjZGVmaW5lIEUxMDAwX1JFVklTSU9OXzAgICAgICAgMAorI2RlZmluZSBFMTAwMF9SRVZJU0lPTl8xICAgICAgIDEKKyNkZWZpbmUgRTEwMDBfUkVWSVNJT05fMiAgICAgICAyCisKKyNkZWZpbmUgU1BFRURfMTAgICAgMTAKKyNkZWZpbmUgU1BFRURfMTAwICAgMTAwCisjZGVmaW5lIFNQRUVEXzEwMDAgIDEwMDAKKyNkZWZpbmUgSEFMRl9EVVBMRVggMQorI2RlZmluZSBGVUxMX0RVUExFWCAyCisKKy8qIFRoZSBzaXplcyAoaW4gYnl0ZXMpIG9mIGEgZXRoZXJuZXQgcGFja2V0ICovCisjZGVmaW5lIEVORVRfSEVBREVSX1NJWkUgICAgICAgICAgICAgMTQKKyNkZWZpbmUgTUFYSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFICAxNTE4IC8qIFdpdGggRkNTICovCisjZGVmaW5lIE1JTklNVU1fRVRIRVJORVRfRlJBTUVfU0laRSAgNjQgICAvKiBXaXRoIEZDUyAqLworI2RlZmluZSBFVEhFUk5FVF9GQ1NfU0laRSAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYSU1VTV9FVEhFUk5FVF9QQUNLRVRfU0laRSBcCisgICAgKE1BWElNVU1fRVRIRVJORVRfRlJBTUVfU0laRSAtIEVUSEVSTkVUX0ZDU19TSVpFKQorI2RlZmluZSBNSU5JTVVNX0VUSEVSTkVUX1BBQ0tFVF9TSVpFIFwKKyAgICAoTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFIC0gRVRIRVJORVRfRkNTX1NJWkUpCisjZGVmaW5lIENSQ19MRU5HVEggICAgICAgICAgICAgICAgICAgRVRIRVJORVRfRkNTX1NJWkUKKyNkZWZpbmUgTUFYX0pVTUJPX0ZSQU1FX1NJWkUgICAgICAgICAweDNGMDAKKworCisvKiA4MDIuMXEgVkxBTiBQYWNrZXQgU2l6ZXMgKi8KKyNkZWZpbmUgVkxBTl9UQUdfU0laRSAgICAgICAgICAgICAgICAgICAgIDQgICAgIC8qIDgwMi4zYWMgdGFnIChub3QgRE1BZWQpICovCisKKy8qIEV0aGVydHlwZSBmaWVsZCB2YWx1ZXMgKi8KKyNkZWZpbmUgRVRIRVJORVRfSUVFRV9WTEFOX1RZUEUgMHg4MTAwICAvKiA4MDIuM2FjIHBhY2tldCAqLworI2RlZmluZSBFVEhFUk5FVF9JUF9UWVBFICAgICAgICAweDA4MDAgIC8qIElQIHBhY2tldHMgKi8KKyNkZWZpbmUgRVRIRVJORVRfQVJQX1RZUEUgICAgICAgMHgwODA2ICAvKiBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgKEFSUCkgKi8KKworLyogUGFja2V0IEhlYWRlciBkZWZpbmVzICovCisjZGVmaW5lIElQX1BST1RPQ09MX1RDUCAgICA2CisjZGVmaW5lIElQX1BST1RPQ09MX1VEUCAgICAweDExCisKKy8qIFRoaXMgZGVmaW5lcyB0aGUgYml0cyB0aGF0IGFyZSBzZXQgaW4gdGhlIEludGVycnVwdCBNYXNrCisgKiBTZXQvUmVhZCBSZWdpc3Rlci4gIEVhY2ggYml0IGlzIGRvY3VtZW50ZWQgYmVsb3c6CisgKiAgIG8gUlhETVQwID0gUmVjZWl2ZSBEZXNjcmlwdG9yIE1pbmltdW0gVGhyZXNob2xkIGhpdCAocmluZyAwKQorICogICBvIFJYU0VRICA9IFJlY2VpdmUgU2VxdWVuY2UgRXJyb3IKKyAqLworI2RlZmluZSBQT0xMX0lNU19FTkFCTEVfTUFTSyAoIFwKKyAgICBFMTAwMF9JTVNfUlhETVQwIHwgICAgICAgICBcCisgICAgRTEwMDBfSU1TX1JYU0VRKQorCisvKiBUaGlzIGRlZmluZXMgdGhlIGJpdHMgdGhhdCBhcmUgc2V0IGluIHRoZSBJbnRlcnJ1cHQgTWFzaworICogU2V0L1JlYWQgUmVnaXN0ZXIuICBFYWNoIGJpdCBpcyBkb2N1bWVudGVkIGJlbG93OgorICogICBvIFJYVDAgICA9IFJlY2VpdmVyIFRpbWVyIEludGVycnVwdCAocmluZyAwKQorICogICBvIFRYRFcgICA9IFRyYW5zbWl0IERlc2NyaXB0b3IgV3JpdHRlbiBCYWNrCisgKiAgIG8gUlhETVQwID0gUmVjZWl2ZSBEZXNjcmlwdG9yIE1pbmltdW0gVGhyZXNob2xkIGhpdCAocmluZyAwKQorICogICBvIFJYU0VRICA9IFJlY2VpdmUgU2VxdWVuY2UgRXJyb3IKKyAqICAgbyBMU0MgICAgPSBMaW5rIFN0YXR1cyBDaGFuZ2UKKyAqLworI2RlZmluZSBJTVNfRU5BQkxFX01BU0sgKCBcCisgICAgRTEwMDBfSU1TX1JYVDAgICB8ICAgIFwKKyAgICBFMTAwMF9JTVNfVFhEVyAgIHwgICAgXAorICAgIEUxMDAwX0lNU19SWERNVDAgfCAgICBcCisgICAgRTEwMDBfSU1TX1JYU0VRICB8ICAgIFwKKyAgICBFMTAwMF9JTVNfTFNDKQorCisvKiBOdW1iZXIgb2YgaGlnaC9sb3cgcmVnaXN0ZXIgcGFpcnMgaW4gdGhlIFJBUi4gVGhlIFJBUiAoUmVjZWl2ZSBBZGRyZXNzCisgKiBSZWdpc3RlcnMpIGhvbGRzIHRoZSBkaXJlY3RlZCBhbmQgbXVsdGljYXN0IGFkZHJlc3NlcyB0aGF0IHdlIG1vbml0b3IuIFdlCisgKiByZXNlcnZlIG9uZSBvZiB0aGVzZSBzcG90cyBmb3Igb3VyIGRpcmVjdGVkIGFkZHJlc3MsIGFsbG93aW5nIHVzIHJvb20gZm9yCisgKiBFMTAwMF9SQVJfRU5UUklFUyAtIDEgbXVsdGljYXN0IGFkZHJlc3Nlcy4KKyAqLworI2RlZmluZSBFMTAwMF9SQVJfRU5UUklFUyAxNQorCisjZGVmaW5lIE1JTl9OVU1CRVJfT0ZfREVTQ1JJUFRPUlMgOAorI2RlZmluZSBNQVhfTlVNQkVSX09GX0RFU0NSSVBUT1JTIDB4RkZGOAorCisvKiBSZWNlaXZlIERlc2NyaXB0b3IgKi8KK3N0cnVjdCBlMTAwMF9yeF9kZXNjIHsKKyAgICB1aW50NjRfdCBidWZmZXJfYWRkcjsgLyogQWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRvcidzIGRhdGEgYnVmZmVyICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAgICAgLyogTGVuZ3RoIG9mIGRhdGEgRE1BZWQgaW50byBkYXRhIGJ1ZmZlciAqLworICAgIHVpbnQxNl90IGNzdW07ICAgICAgIC8qIFBhY2tldCBjaGVja3N1bSAqLworICAgIHVpbnQ4X3Qgc3RhdHVzOyAgICAgIC8qIERlc2NyaXB0b3Igc3RhdHVzICovCisgICAgdWludDhfdCBlcnJvcnM7ICAgICAgLyogRGVzY3JpcHRvciBFcnJvcnMgKi8KKyAgICB1aW50MTZfdCBzcGVjaWFsOworfTsKKworLyogUmVjZWl2ZSBEZWNyaXB0b3IgYml0IGRlZmluaXRpb25zICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX0REICAgICAgIDB4MDEgICAgLyogRGVzY3JpcHRvciBEb25lICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX0VPUCAgICAgIDB4MDIgICAgLyogRW5kIG9mIFBhY2tldCAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9JWFNNICAgICAweDA0ICAgIC8qIElnbm9yZSBjaGVja3N1bSAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9WUCAgICAgICAweDA4ICAgIC8qIElFRUUgVkxBTiBQYWNrZXQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfVENQQ1MgICAgMHgyMCAgICAvKiBUQ1AgeHN1bSBjYWxjdWxhdGVkICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX0lQQ1MgICAgIDB4NDAgICAgLyogSVAgeHN1bSBjYWxjdWxhdGVkICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX1BJRiAgICAgIDB4ODAgICAgLyogcGFzc2VkIGluLWV4YWN0IGZpbHRlciAqLworI2RlZmluZSBFMTAwMF9SWERfRVJSX0NFICAgICAgICAweDAxICAgIC8qIENSQyBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfRVJSX1NFICAgICAgICAweDAyICAgIC8qIFN5bWJvbCBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfRVJSX1NFUSAgICAgICAweDA0ICAgIC8qIFNlcXVlbmNlIEVycm9yICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfQ1hFICAgICAgIDB4MTAgICAgLyogQ2FycmllciBFeHRlbnNpb24gRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9UQ1BFICAgICAgMHgyMCAgICAvKiBUQ1AvVURQIENoZWNrc3VtIEVycm9yICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfSVBFICAgICAgIDB4NDAgICAgLyogSVAgQ2hlY2tzdW0gRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9SWEUgICAgICAgMHg4MCAgICAvKiBSeCBEYXRhIEVycm9yICovCisjZGVmaW5lIEUxMDAwX1JYRF9TUENfVkxBTl9NQVNLIDB4MEZGRiAgLyogVkxBTiBJRCBpcyBpbiBsb3dlciAxMiBiaXRzICovCisjZGVmaW5lIEUxMDAwX1JYRF9TUENfUFJJX01BU0sgIDB4RTAwMCAgLyogUHJpb3JpdHkgaXMgaW4gdXBwZXIgMyBiaXRzICovCisjZGVmaW5lIEUxMDAwX1JYRF9TUENfUFJJX1NISUZUIDB4MDAwRCAgLyogUHJpb3JpdHkgaXMgaW4gdXBwZXIgMyBvZiAxNiAqLworI2RlZmluZSBFMTAwMF9SWERfU1BDX0NGSV9NQVNLICAweDEwMDAgIC8qIENGSSBpcyBiaXQgMTIgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NQQ19DRklfU0hJRlQgMHgwMDBDICAvKiBDRkkgaXMgYml0IDEyICovCisKKy8qIG1hc2sgdG8gZGV0ZXJtaW5lIGlmIHBhY2tldHMgc2hvdWxkIGJlIGRyb3BwZWQgZHVlIHRvIGZyYW1lIGVycm9ycyAqLworI2RlZmluZSBFMTAwMF9SWERfRVJSX0ZSQU1FX0VSUl9NQVNLICggXAorICAgIEUxMDAwX1JYRF9FUlJfQ0UgIHwgICAgICAgICAgICAgICAgXAorICAgIEUxMDAwX1JYRF9FUlJfU0UgIHwgICAgICAgICAgICAgICAgXAorICAgIEUxMDAwX1JYRF9FUlJfU0VRIHwgICAgICAgICAgICAgICAgXAorICAgIEUxMDAwX1JYRF9FUlJfQ1hFIHwgICAgICAgICAgICAgICAgXAorICAgIEUxMDAwX1JYRF9FUlJfUlhFKQorCisvKiBUcmFuc21pdCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgZTEwMDBfdHhfZGVzYyB7CisgICAgdWludDY0X3QgYnVmZmVyX2FkZHI7ICAgICAgIC8qIEFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IncyBkYXRhIGJ1ZmZlciAqLworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgZGF0YTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsgICAgLyogRGF0YSBidWZmZXIgbGVuZ3RoICovCisgICAgICAgICAgICB1aW50OF90IGNzbzsgICAgICAgIC8qIENoZWNrc3VtIG9mZnNldCAqLworICAgICAgICAgICAgdWludDhfdCBjbWQ7ICAgICAgICAvKiBEZXNjcmlwdG9yIGNvbnRyb2wgKi8KKyAgICAgICAgfSBmbGFnczsKKyAgICB9IGxvd2VyOworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgZGF0YTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzOyAgICAgLyogRGVzY3JpcHRvciBzdGF0dXMgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY3NzOyAgICAgICAgLyogQ2hlY2tzdW0gc3RhcnQgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHNwZWNpYWw7CisgICAgICAgIH0gZmllbGRzOworICAgIH0gdXBwZXI7Cit9OworCisvKiBUcmFuc21pdCBEZXNjcmlwdG9yIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFMTAwMF9UWERfRFRZUF9EICAgICAweDAwMTAwMDAwIC8qIERhdGEgRGVzY3JpcHRvciAqLworI2RlZmluZSBFMTAwMF9UWERfRFRZUF9DICAgICAweDAwMDAwMDAwIC8qIENvbnRleHQgRGVzY3JpcHRvciAqLworI2RlZmluZSBFMTAwMF9UWERfUE9QVFNfSVhTTSAweDAxICAgICAgIC8qIEluc2VydCBJUCBjaGVja3N1bSAqLworI2RlZmluZSBFMTAwMF9UWERfUE9QVFNfVFhTTSAweDAyICAgICAgIC8qIEluc2VydCBUQ1AvVURQIGNoZWNrc3VtICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfRU9QICAgIDB4MDEwMDAwMDAgLyogRW5kIG9mIFBhY2tldCAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX0lGQ1MgICAweDAyMDAwMDAwIC8qIEluc2VydCBGQ1MgKEV0aGVybmV0IENSQykgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9JQyAgICAgMHgwNDAwMDAwMCAvKiBJbnNlcnQgQ2hlY2tzdW0gKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9SUyAgICAgMHgwODAwMDAwMCAvKiBSZXBvcnQgU3RhdHVzICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfUlBTICAgIDB4MTAwMDAwMDAgLyogUmVwb3J0IFBhY2tldCBTZW50ICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfREVYVCAgIDB4MjAwMDAwMDAgLyogRGVzY3JpcHRvciBleHRlbnNpb24gKDAgPSBsZWdhY3kpICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfVkxFICAgIDB4NDAwMDAwMDAgLyogQWRkIFZMQU4gdGFnICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfSURFICAgIDB4ODAwMDAwMDAgLyogRW5hYmxlIFRpZHYgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX1NUQVRfREQgICAgMHgwMDAwMDAwMSAvKiBEZXNjcmlwdG9yIERvbmUgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX1NUQVRfRUMgICAgMHgwMDAwMDAwMiAvKiBFeGNlc3MgQ29sbGlzaW9ucyAqLworI2RlZmluZSBFMTAwMF9UWERfU1RBVF9MQyAgICAweDAwMDAwMDA0IC8qIExhdGUgQ29sbGlzaW9ucyAqLworI2RlZmluZSBFMTAwMF9UWERfU1RBVF9UVSAgICAweDAwMDAwMDA4IC8qIFRyYW5zbWl0IHVuZGVycnVuICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfVENQICAgIDB4MDEwMDAwMDAgLyogVENQIHBhY2tldCAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX0lQICAgICAweDAyMDAwMDAwIC8qIElQIHBhY2tldCAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX1RTRSAgICAweDA0MDAwMDAwIC8qIFRDUCBTZWcgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1RYRF9TVEFUX1RDICAgIDB4MDAwMDAwMDQgLyogVHggVW5kZXJydW4gKi8KKworLyogT2ZmbG9hZCBDb250ZXh0IERlc2NyaXB0b3IgKi8KK3N0cnVjdCBlMTAwMF9jb250ZXh0X2Rlc2MgeworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgaXBfY29uZmlnOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDhfdCBpcGNzczsgICAgICAvKiBJUCBjaGVja3N1bSBzdGFydCAqLworICAgICAgICAgICAgdWludDhfdCBpcGNzbzsgICAgICAvKiBJUCBjaGVja3N1bSBvZmZzZXQgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGlwY3NlOyAgICAgLyogSVAgY2hlY2tzdW0gZW5kICovCisgICAgICAgIH0gaXBfZmllbGRzOworICAgIH0gbG93ZXJfc2V0dXA7CisgICAgdW5pb24geworICAgICAgICB1aW50MzJfdCB0Y3BfY29uZmlnOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDhfdCB0dWNzczsgICAgICAvKiBUQ1AgY2hlY2tzdW0gc3RhcnQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdHVjc287ICAgICAgLyogVENQIGNoZWNrc3VtIG9mZnNldCAqLworICAgICAgICAgICAgdWludDE2X3QgdHVjc2U7ICAgICAvKiBUQ1AgY2hlY2tzdW0gZW5kICovCisgICAgICAgIH0gdGNwX2ZpZWxkczsKKyAgICB9IHVwcGVyX3NldHVwOworICAgIHVpbnQzMl90IGNtZF9hbmRfbGVuZ3RoOyAgICAvKiAqLworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgZGF0YTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzOyAgICAgLyogRGVzY3JpcHRvciBzdGF0dXMgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaGRyX2xlbjsgICAgLyogSGVhZGVyIGxlbmd0aCAqLworICAgICAgICAgICAgdWludDE2X3QgbXNzOyAgICAgICAvKiBNYXhpbXVtIHNlZ21lbnQgc2l6ZSAqLworICAgICAgICB9IGZpZWxkczsKKyAgICB9IHRjcF9zZWdfc2V0dXA7Cit9OworCisvKiBPZmZsb2FkIGRhdGEgZGVzY3JpcHRvciAqLworc3RydWN0IGUxMDAwX2RhdGFfZGVzYyB7CisgICAgdWludDY0X3QgYnVmZmVyX2FkZHI7ICAgICAgIC8qIEFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IncyBidWZmZXIgYWRkcmVzcyAqLworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgZGF0YTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsgICAgLyogRGF0YSBidWZmZXIgbGVuZ3RoICovCisgICAgICAgICAgICB1aW50OF90IHR5cF9sZW5fZXh0OyAgICAgICAgLyogKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY21kOyAgICAgICAgLyogKi8KKyAgICAgICAgfSBmbGFnczsKKyAgICB9IGxvd2VyOworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgZGF0YTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzOyAgICAgLyogRGVzY3JpcHRvciBzdGF0dXMgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcG9wdHM7ICAgICAgLyogUGFja2V0IE9wdGlvbnMgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHNwZWNpYWw7ICAgLyogKi8KKyAgICAgICAgfSBmaWVsZHM7CisgICAgfSB1cHBlcjsKK307CisKKy8qIEZpbHRlcnMgKi8KKyNkZWZpbmUgRTEwMDBfTlVNX1VOSUNBU1QgICAgICAgICAgMTYgICAvKiBVbmljYXN0IGZpbHRlciBlbnRyaWVzICovCisjZGVmaW5lIEUxMDAwX01DX1RCTF9TSVpFICAgICAgICAgIDEyOCAgLyogTXVsdGljYXN0IEZpbHRlciBUYWJsZSAoNDA5NiBiaXRzKSAqLworI2RlZmluZSBFMTAwMF9WTEFOX0ZJTFRFUl9UQkxfU0laRSAxMjggIC8qIFZMQU4gRmlsdGVyIFRhYmxlICg0MDk2IGJpdHMpICovCisKKworLyogUmVjZWl2ZSBBZGRyZXNzIFJlZ2lzdGVyICovCitzdHJ1Y3QgZTEwMDBfcmFyIHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBsb3c7ICAgICAgLyogcmVjZWl2ZSBhZGRyZXNzIGxvdyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGhpZ2g7ICAgICAvKiByZWNlaXZlIGFkZHJlc3MgaGlnaCAqLworfTsKKworLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIE11bHRpY2FzdCBUYWJsZSBBcnJheSAoTVRBKS4gKi8KKyNkZWZpbmUgRTEwMDBfTlVNX01UQV9SRUdJU1RFUlMgMTI4CisKKy8qIElQdjQgQWRkcmVzcyBUYWJsZSBFbnRyeSAqLworc3RydWN0IGUxMDAwX2lwdjRfYXRfZW50cnkgeworICAgIHZvbGF0aWxlIHVpbnQzMl90IGlwdjRfYWRkcjsgICAgICAgIC8qIElQIEFkZHJlc3MgKFJXKSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkOworfTsKKworLyogRm91ciB3YWtldXAgSVAgYWRkcmVzc2VzIGFyZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV0FLRVVQX0lQX0FERFJFU1NfQ09VTlRfTUFYIDQKKyNkZWZpbmUgRTEwMDBfSVA0QVRfU0laRSAgICAgICAgICAgICAgICAgIEUxMDAwX1dBS0VVUF9JUF9BRERSRVNTX0NPVU5UX01BWAorI2RlZmluZSBFMTAwMF9JUDZBVF9TSVpFICAgICAgICAgICAgICAgICAgMQorCisvKiBJUHY2IEFkZHJlc3MgVGFibGUgRW50cnkgKi8KK3N0cnVjdCBlMTAwMF9pcHY2X2F0X2VudHJ5IHsKKyAgICB2b2xhdGlsZSB1aW50OF90IGlwdjZfYWRkclsxNl07Cit9OworCisvKiBGbGV4aWJsZSBGaWx0ZXIgTGVuZ3RoIFRhYmxlIEVudHJ5ICovCitzdHJ1Y3QgZTEwMDBfZmZsdF9lbnRyeSB7CisgICAgdm9sYXRpbGUgdWludDMyX3QgbGVuZ3RoOyAgIC8qIEZsZXhpYmxlIEZpbHRlciBMZW5ndGggKFJXKSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkOworfTsKKworLyogRmxleGlibGUgRmlsdGVyIE1hc2sgVGFibGUgRW50cnkgKi8KK3N0cnVjdCBlMTAwMF9mZm10X2VudHJ5IHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBtYXNrOyAgICAgLyogRmxleGlibGUgRmlsdGVyIE1hc2sgKFJXKSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkOworfTsKKworLyogRmxleGlibGUgRmlsdGVyIFZhbHVlIFRhYmxlIEVudHJ5ICovCitzdHJ1Y3QgZTEwMDBfZmZ2dF9lbnRyeSB7CisgICAgdm9sYXRpbGUgdWludDMyX3QgdmFsdWU7ICAgIC8qIEZsZXhpYmxlIEZpbHRlciBWYWx1ZSAoUlcpICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQ7Cit9OworCisvKiBGb3VyIEZsZXhpYmxlIEZpbHRlcnMgYXJlIHN1cHBvcnRlZCAqLworI2RlZmluZSBFMTAwMF9GTEVYSUJMRV9GSUxURVJfQ09VTlRfTUFYIDQKKworLyogRWFjaCBGbGV4aWJsZSBGaWx0ZXIgaXMgYXQgbW9zdCAxMjggKDB4ODApIGJ5dGVzIGluIGxlbmd0aCAqLworI2RlZmluZSBFMTAwMF9GTEVYSUJMRV9GSUxURVJfU0laRV9NQVggIDEyOAorCisjZGVmaW5lIEUxMDAwX0ZGTFRfU0laRSBFMTAwMF9GTEVYSUJMRV9GSUxURVJfQ09VTlRfTUFYCisjZGVmaW5lIEUxMDAwX0ZGTVRfU0laRSBFMTAwMF9GTEVYSUJMRV9GSUxURVJfU0laRV9NQVgKKyNkZWZpbmUgRTEwMDBfRkZWVF9TSVpFIEUxMDAwX0ZMRVhJQkxFX0ZJTFRFUl9TSVpFX01BWAorCisvKiBSZWdpc3RlciBTZXQuICg4MjU0MywgODI1NDQpCisgKgorICogUmVnaXN0ZXJzIGFyZSBkZWZpbmVkIHRvIGJlIDMyIGJpdHMgYW5kICBzaG91bGQgYmUgYWNjZXNzZWQgYXMgMzIgYml0IHZhbHVlcy4KKyAqIFRoZXNlIHJlZ2lzdGVycyBhcmUgcGh5c2ljYWxseSBsb2NhdGVkIG9uIHRoZSBOSUMsIGJ1dCBhcmUgbWFwcGVkIGludG8gdGhlCisgKiBob3N0IG1lbW9yeSBhZGRyZXNzIHNwYWNlLgorICoKKyAqIFJXIC0gcmVnaXN0ZXIgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUKKyAqIFJPIC0gcmVnaXN0ZXIgaXMgcmVhZCBvbmx5CisgKiBXTyAtIHJlZ2lzdGVyIGlzIHdyaXRlIG9ubHkKKyAqIFIvY2xyIC0gcmVnaXN0ZXIgaXMgcmVhZCBvbmx5IGFuZCBpcyBjbGVhcmVkIHdoZW4gcmVhZAorICogQSAtIHJlZ2lzdGVyIGFycmF5CisgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTCAgICAgMHgwMDAwMCAgLyogRGV2aWNlIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9DVFJMX0RVUCAweDAwMDA0ICAvKiBEZXZpY2UgQ29udHJvbCBEdXBsaWNhdGUgKFNoYWRvdykgLSBSVyAqLworI2RlZmluZSBFMTAwMF9TVEFUVVMgICAweDAwMDA4ICAvKiBEZXZpY2UgU3RhdHVzIC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfRUVDRCAgICAgMHgwMDAxMCAgLyogRUVQUk9NL0ZsYXNoIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9FRVJEICAgICAweDAwMDE0ICAvKiBFRVBST00gUmVhZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUIDB4MDAwMTggIC8qIEV4dGVuZGVkIERldmljZSBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkxBICAgICAgMHgwMDAxQyAgLyogRmxhc2ggQWNjZXNzIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfTURJQyAgICAgMHgwMDAyMCAgLyogTURJIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9GQ0FMICAgICAweDAwMDI4ICAvKiBGbG93IENvbnRyb2wgQWRkcmVzcyBMb3cgLSBSVyAqLworI2RlZmluZSBFMTAwMF9GQ0FIICAgICAweDAwMDJDICAvKiBGbG93IENvbnRyb2wgQWRkcmVzcyBIaWdoIC1SVyAqLworI2RlZmluZSBFMTAwMF9GQ1QgICAgICAweDAwMDMwICAvKiBGbG93IENvbnRyb2wgVHlwZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1ZFVCAgICAgIDB4MDAwMzggIC8qIFZMQU4gRXRoZXIgVHlwZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX0lDUiAgICAgIDB4MDAwQzAgIC8qIEludGVycnVwdCBDYXVzZSBSZWFkIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfSVRSICAgICAgMHgwMDBDNCAgLyogSW50ZXJydXB0IFRocm90dGxpbmcgUmF0ZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX0lDUyAgICAgIDB4MDAwQzggIC8qIEludGVycnVwdCBDYXVzZSBTZXQgLSBXTyAqLworI2RlZmluZSBFMTAwMF9JTVMgICAgICAweDAwMEQwICAvKiBJbnRlcnJ1cHQgTWFzayBTZXQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9JTUMgICAgICAweDAwMEQ4ICAvKiBJbnRlcnJ1cHQgTWFzayBDbGVhciAtIFdPICovCisjZGVmaW5lIEUxMDAwX1JDVEwgICAgIDB4MDAxMDAgIC8qIFJYIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9GQ1RUViAgICAweDAwMTcwICAvKiBGbG93IENvbnRyb2wgVHJhbnNtaXQgVGltZXIgVmFsdWUgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UWENXICAgICAweDAwMTc4ICAvKiBUWCBDb25maWd1cmF0aW9uIFdvcmQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SWENXICAgICAweDAwMTgwICAvKiBSWCBDb25maWd1cmF0aW9uIFdvcmQgLSBSTyAqLworI2RlZmluZSBFMTAwMF9UQ1RMICAgICAweDAwNDAwICAvKiBUWCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVElQRyAgICAgMHgwMDQxMCAgLyogVFggSW50ZXItcGFja2V0IGdhcCAtUlcgKi8KKyNkZWZpbmUgRTEwMDBfVEJUICAgICAgMHgwMDQ0OCAgLyogVFggQnVyc3QgVGltZXIgLSBSVyAqLworI2RlZmluZSBFMTAwMF9BSVQgICAgICAweDAwNDU4ICAvKiBBZGFwdGl2ZSBJbnRlcmZyYW1lIFNwYWNpbmcgVGhyb3R0bGUgLSBSVyAqLworI2RlZmluZSBFMTAwMF9MRURDVEwgICAweDAwRTAwICAvKiBMRUQgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1BCQSAgICAgIDB4MDEwMDAgIC8qIFBhY2tldCBCdWZmZXIgQWxsb2NhdGlvbiAtIFJXICovCisjZGVmaW5lIEUxMDAwX0ZDUlRMICAgIDB4MDIxNjAgIC8qIEZsb3cgQ29udHJvbCBSZWNlaXZlIFRocmVzaG9sZCBMb3cgLSBSVyAqLworI2RlZmluZSBFMTAwMF9GQ1JUSCAgICAweDAyMTY4ICAvKiBGbG93IENvbnRyb2wgUmVjZWl2ZSBUaHJlc2hvbGQgSGlnaCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEQkFMICAgIDB4MDI4MDAgIC8qIFJYIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIExvdyAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEQkFIICAgIDB4MDI4MDQgIC8qIFJYIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIEhpZ2ggLSBSVyAqLworI2RlZmluZSBFMTAwMF9SRExFTiAgICAweDAyODA4ICAvKiBSWCBEZXNjcmlwdG9yIExlbmd0aCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JESCAgICAgIDB4MDI4MTAgIC8qIFJYIERlc2NyaXB0b3IgSGVhZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEVCAgICAgIDB4MDI4MTggIC8qIFJYIERlc2NyaXB0b3IgVGFpbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JEVFIgICAgIDB4MDI4MjAgIC8qIFJYIERlbGF5IFRpbWVyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUlhEQ1RMICAgMHgwMjgyOCAgLyogUlggRGVzY3JpcHRvciBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkFEViAgICAgMHgwMjgyQyAgLyogUlggSW50ZXJydXB0IEFic29sdXRlIERlbGF5IFRpbWVyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUlNSUEQgICAgMHgwMkMwMCAgLyogUlggU21hbGwgUGFja2V0IERldGVjdCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RYRE1BQyAgIDB4MDMwMDAgIC8qIFRYIERNQSBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERGSCAgICAgMHgwMzQxMCAgLyogVFggRGF0YSBGSUZPIEhlYWQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREZUICAgICAweDAzNDE4ICAvKiBUWCBEYXRhIEZJRk8gVGFpbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RERkhTICAgIDB4MDM0MjAgIC8qIFRYIERhdGEgRklGTyBIZWFkIFNhdmVkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERGVFMgICAgMHgwMzQyOCAgLyogVFggRGF0YSBGSUZPIFRhaWwgU2F2ZWQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREZQQyAgICAweDAzNDMwICAvKiBUWCBEYXRhIEZJRk8gUGFja2V0IENvdW50IC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERCQUwgICAgMHgwMzgwMCAgLyogVFggRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgTG93IC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERCQUggICAgMHgwMzgwNCAgLyogVFggRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgSGlnaCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RETEVOICAgIDB4MDM4MDggIC8qIFRYIERlc2NyaXB0b3IgTGVuZ3RoIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERIICAgICAgMHgwMzgxMCAgLyogVFggRGVzY3JpcHRvciBIZWFkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERUICAgICAgMHgwMzgxOCAgLyogVFggRGVzY3JpcG90ciBUYWlsIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVElEViAgICAgMHgwMzgyMCAgLyogVFggSW50ZXJydXB0IERlbGF5IFZhbHVlIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMICAgMHgwMzgyOCAgLyogVFggRGVzY3JpcHRvciBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVEFEViAgICAgMHgwMzgyQyAgLyogVFggSW50ZXJydXB0IEFic29sdXRlIERlbGF5IFZhbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RTUE1UICAgIDB4MDM4MzAgIC8qIFRDUCBTZWdtZW50YXRpb24gUEFEICYgTWluIFRocmVzaG9sZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0NSQ0VSUlMgIDB4MDQwMDAgIC8qIENSQyBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0FMR05FUlJDIDB4MDQwMDQgIC8qIEFsaWdubWVudCBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1NZTUVSUlMgIDB4MDQwMDggIC8qIFN5bWJvbCBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JYRVJSQyAgIDB4MDQwMEMgIC8qIFJlY2VpdmUgRXJyb3IgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NUEMgICAgICAweDA0MDEwICAvKiBNaXNzZWQgUGFja2V0IENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfU0NDICAgICAgMHgwNDAxNCAgLyogU2luZ2xlIENvbGxpc2lvbiBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0VDT0wgICAgIDB4MDQwMTggIC8qIEV4Y2Vzc2l2ZSBDb2xsaXNpb24gQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NQ0MgICAgICAweDA0MDFDICAvKiBNdWx0aXBsZSBDb2xsaXNpb24gQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9MQVRFQ09MICAweDA0MDIwICAvKiBMYXRlIENvbGxpc2lvbiBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0NPTEMgICAgIDB4MDQwMjggIC8qIENvbGxpc2lvbiBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0RDICAgICAgIDB4MDQwMzAgIC8qIERlZmVyIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVE5DUlMgICAgMHgwNDAzNCAgLyogVFgtTm8gQ1JTIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfU0VDICAgICAgMHgwNDAzOCAgLyogU2VxdWVuY2UgRXJyb3IgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9DRVhURVJSICAweDA0MDNDICAvKiBDYXJyaWVyIEV4dGVuc2lvbiBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JMRUMgICAgIDB4MDQwNDAgIC8qIFJlY2VpdmUgTGVuZ3RoIEVycm9yIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfWE9OUlhDICAgMHgwNDA0OCAgLyogWE9OIFJYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfWE9OVFhDICAgMHgwNDA0QyAgLyogWE9OIFRYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfWE9GRlJYQyAgMHgwNDA1MCAgLyogWE9GRiBSWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1hPRkZUWEMgIDB4MDQwNTQgIC8qIFhPRkYgVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9GQ1JVQyAgICAweDA0MDU4ICAvKiBGbG93IENvbnRyb2wgUlggVW5zdXBwb3J0ZWQgQ291bnQtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzY0ICAgIDB4MDQwNUMgIC8qIFBhY2tldHMgUlggKDY0IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzEyNyAgIDB4MDQwNjAgIC8qIFBhY2tldHMgUlggKDY1LTEyNyBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QUkMyNTUgICAweDA0MDY0ICAvKiBQYWNrZXRzIFJYICgxMjgtMjU1IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzUxMSAgIDB4MDQwNjggIC8qIFBhY2tldHMgUlggKDI1NS01MTEgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFJDMTAyMyAgMHgwNDA2QyAgLyogUGFja2V0cyBSWCAoNTEyLTEwMjMgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFJDMTUyMiAgMHgwNDA3MCAgLyogUGFja2V0cyBSWCAoMTAyNC0xNTIyIGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0dQUkMgICAgIDB4MDQwNzQgIC8qIEdvb2QgUGFja2V0cyBSWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0JQUkMgICAgIDB4MDQwNzggIC8qIEJyb2FkY2FzdCBQYWNrZXRzIFJYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTVBSQyAgICAgMHgwNDA3QyAgLyogTXVsdGljYXN0IFBhY2tldHMgUlggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9HUFRDICAgICAweDA0MDgwICAvKiBHb29kIFBhY2tldHMgVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9HT1JDTCAgICAweDA0MDg4ICAvKiBHb29kIE9jdGV0cyBSWCBDb3VudCBMb3cgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9HT1JDSCAgICAweDA0MDhDICAvKiBHb29kIE9jdGV0cyBSWCBDb3VudCBIaWdoIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfR09UQ0wgICAgMHgwNDA5MCAgLyogR29vZCBPY3RldHMgVFggQ291bnQgTG93IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfR09UQ0ggICAgMHgwNDA5NCAgLyogR29vZCBPY3RldHMgVFggQ291bnQgSGlnaCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JOQkMgICAgIDB4MDQwQTAgIC8qIFJYIE5vIEJ1ZmZlcnMgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9SVUMgICAgICAweDA0MEE0ICAvKiBSWCBVbmRlcnNpemUgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9SRkMgICAgICAweDA0MEE4ICAvKiBSWCBGcmFnbWVudCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JPQyAgICAgIDB4MDQwQUMgIC8qIFJYIE92ZXJzaXplIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUkpDICAgICAgMHgwNDBCMCAgLyogUlggSmFiYmVyIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTUdUUFJDICAgMHgwNDBCNCAgLyogTWFuYWdlbWVudCBQYWNrZXRzIFJYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTUdUUERDICAgMHgwNDBCOCAgLyogTWFuYWdlbWVudCBQYWNrZXRzIERyb3BwZWQgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NR1RQVEMgICAweDA0MEJDICAvKiBNYW5hZ2VtZW50IFBhY2tldHMgVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UT1JMICAgICAweDA0MEMwICAvKiBUb3RhbCBPY3RldHMgUlggTG93IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVE9SSCAgICAgMHgwNDBDNCAgLyogVG90YWwgT2N0ZXRzIFJYIEhpZ2ggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UT1RMICAgICAweDA0MEM4ICAvKiBUb3RhbCBPY3RldHMgVFggTG93IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVE9USCAgICAgMHgwNDBDQyAgLyogVG90YWwgT2N0ZXRzIFRYIEhpZ2ggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UUFIgICAgICAweDA0MEQwICAvKiBUb3RhbCBQYWNrZXRzIFJYIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVFBUICAgICAgMHgwNDBENCAgLyogVG90YWwgUGFja2V0cyBUWCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BUQzY0ICAgIDB4MDQwRDggIC8qIFBhY2tldHMgVFggKDY0IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BUQzEyNyAgIDB4MDQwREMgIC8qIFBhY2tldHMgVFggKDY1LTEyNyBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QVEMyNTUgICAweDA0MEUwICAvKiBQYWNrZXRzIFRYICgxMjgtMjU1IGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BUQzUxMSAgIDB4MDQwRTQgIC8qIFBhY2tldHMgVFggKDI1Ni01MTEgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFRDMTAyMyAgMHgwNDBFOCAgLyogUGFja2V0cyBUWCAoNTEyLTEwMjMgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFRDMTUyMiAgMHgwNDBFQyAgLyogUGFja2V0cyBUWCAoMTAyNC0xNTIyIEJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX01QVEMgICAgIDB4MDQwRjAgIC8qIE11bHRpY2FzdCBQYWNrZXRzIFRYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfQlBUQyAgICAgMHgwNDBGNCAgLyogQnJvYWRjYXN0IFBhY2tldHMgVFggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UU0NUQyAgICAweDA0MEY4ICAvKiBUQ1AgU2VnbWVudGF0aW9uIENvbnRleHQgVFggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9UU0NURkMgICAweDA0MEZDICAvKiBUQ1AgU2VnbWVudGF0aW9uIENvbnRleHQgVFggRmFpbCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JYQ1NVTSAgIDB4MDUwMDAgIC8qIFJYIENoZWNrc3VtIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9NVEEgICAgICAweDA1MjAwICAvKiBNdWx0aWNhc3QgVGFibGUgQXJyYXkgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9SQSAgICAgICAweDA1NDAwICAvKiBSZWNlaXZlIEFkZHJlc3MgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9WRlRBICAgICAweDA1NjAwICAvKiBWTEFOIEZpbHRlciBUYWJsZSBBcnJheSAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX1dVQyAgICAgIDB4MDU4MDAgIC8qIFdha2V1cCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQyAgICAgMHgwNTgwOCAgLyogV2FrZXVwIEZpbHRlciBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfV1VTICAgICAgMHgwNTgxMCAgLyogV2FrZXVwIFN0YXR1cyAtIFJPICovCisjZGVmaW5lIEUxMDAwX01BTkMgICAgIDB4MDU4MjAgIC8qIE1hbmFnZW1lbnQgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0lQQVYgICAgIDB4MDU4MzggIC8qIElQIEFkZHJlc3MgVmFsaWQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9JUDRBVCAgICAweDA1ODQwICAvKiBJUHY0IEFkZHJlc3MgVGFibGUgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9JUDZBVCAgICAweDA1ODgwICAvKiBJUHY2IEFkZHJlc3MgVGFibGUgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9XVVBMICAgICAweDA1OTAwICAvKiBXYWtldXAgUGFja2V0IExlbmd0aCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1dVUE0gICAgIDB4MDVBMDAgIC8qIFdha2V1cCBQYWNrZXQgTWVtb3J5IC0gUk8gQSAqLworI2RlZmluZSBFMTAwMF9GRkxUICAgICAweDA1RjAwICAvKiBGbGV4aWJsZSBGaWx0ZXIgTGVuZ3RoIFRhYmxlIC0gUlcgQXJyYXkgKi8KKyNkZWZpbmUgRTEwMDBfSE9TVF9JRiAgMHgwODgwMCAgLyogSG9zdCBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgRTEwMDBfRkZNVCAgICAgMHgwOTAwMCAgLyogRmxleGlibGUgRmlsdGVyIE1hc2sgVGFibGUgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9GRlZUICAgICAweDA5ODAwICAvKiBGbGV4aWJsZSBGaWx0ZXIgVmFsdWUgVGFibGUgLSBSVyBBcnJheSAqLworCisvKiBSZWdpc3RlciBTZXQgKDgyNTQyKQorICoKKyAqIFNvbWUgb2YgdGhlIDgyNTQyIHJlZ2lzdGVycyBhcmUgbG9jYXRlZCBhdCBkaWZmZXJlbnQgb2Zmc2V0cyB0aGFuIHRoZXkgYXJlCisgKiBpbiBtb3JlIGN1cnJlbnQgdmVyc2lvbnMgb2YgdGhlIDgyNTR4LiBEZXNwaXRlIHRoZSBkaWZmZXJlbmNlIGluIGxvY2F0aW9uLAorICogdGhlIHJlZ2lzdGVycyBmdW5jdGlvbiBpbiB0aGUgc2FtZSBtYW5uZXIuCisgKi8KKyNkZWZpbmUgRTEwMDBfODI1NDJfQ1RSTCAgICAgRTEwMDBfQ1RSTAorI2RlZmluZSBFMTAwMF84MjU0Ml9DVFJMX0RVUCBFMTAwMF9DVFJMX0RVUAorI2RlZmluZSBFMTAwMF84MjU0Ml9TVEFUVVMgICBFMTAwMF9TVEFUVVMKKyNkZWZpbmUgRTEwMDBfODI1NDJfRUVDRCAgICAgRTEwMDBfRUVDRAorI2RlZmluZSBFMTAwMF84MjU0Ml9FRVJEICAgICBFMTAwMF9FRVJECisjZGVmaW5lIEUxMDAwXzgyNTQyX0NUUkxfRVhUIEUxMDAwX0NUUkxfRVhUCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZMQSAgICAgIEUxMDAwX0ZMQQorI2RlZmluZSBFMTAwMF84MjU0Ml9NRElDICAgICBFMTAwMF9NRElDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZDQUwgICAgIEUxMDAwX0ZDQUwKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkNBSCAgICAgRTEwMDBfRkNBSAorI2RlZmluZSBFMTAwMF84MjU0Ml9GQ1QgICAgICBFMTAwMF9GQ1QKKyNkZWZpbmUgRTEwMDBfODI1NDJfVkVUICAgICAgRTEwMDBfVkVUCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JBICAgICAgIDB4MDAwNDAKKyNkZWZpbmUgRTEwMDBfODI1NDJfSUNSICAgICAgRTEwMDBfSUNSCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lUUiAgICAgIEUxMDAwX0lUUgorI2RlZmluZSBFMTAwMF84MjU0Ml9JQ1MgICAgICBFMTAwMF9JQ1MKKyNkZWZpbmUgRTEwMDBfODI1NDJfSU1TICAgICAgRTEwMDBfSU1TCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lNQyAgICAgIEUxMDAwX0lNQworI2RlZmluZSBFMTAwMF84MjU0Ml9SQ1RMICAgICBFMTAwMF9SQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JEVFIgICAgIDB4MDAxMDgKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRCQUwgICAgMHgwMDExMAorI2RlZmluZSBFMTAwMF84MjU0Ml9SREJBSCAgICAweDAwMTE0CisjZGVmaW5lIEUxMDAwXzgyNTQyX1JETEVOICAgIDB4MDAxMTgKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRIICAgICAgMHgwMDEyMAorI2RlZmluZSBFMTAwMF84MjU0Ml9SRFQgICAgICAweDAwMTI4CisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZDUlRIICAgIDB4MDAxNjAKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkNSVEwgICAgMHgwMDE2OAorI2RlZmluZSBFMTAwMF84MjU0Ml9GQ1RUViAgICBFMTAwMF9GQ1RUVgorI2RlZmluZSBFMTAwMF84MjU0Ml9UWENXICAgICBFMTAwMF9UWENXCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JYQ1cgICAgIEUxMDAwX1JYQ1cKKyNkZWZpbmUgRTEwMDBfODI1NDJfTVRBICAgICAgMHgwMDIwMAorI2RlZmluZSBFMTAwMF84MjU0Ml9UQ1RMICAgICBFMTAwMF9UQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RJUEcgICAgIEUxMDAwX1RJUEcKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERCQUwgICAgMHgwMDQyMAorI2RlZmluZSBFMTAwMF84MjU0Ml9UREJBSCAgICAweDAwNDI0CisjZGVmaW5lIEUxMDAwXzgyNTQyX1RETEVOICAgIDB4MDA0MjgKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERIICAgICAgMHgwMDQzMAorI2RlZmluZSBFMTAwMF84MjU0Ml9URFQgICAgICAweDAwNDM4CisjZGVmaW5lIEUxMDAwXzgyNTQyX1RJRFYgICAgIDB4MDA0NDAKKyNkZWZpbmUgRTEwMDBfODI1NDJfVEJUICAgICAgRTEwMDBfVEJUCisjZGVmaW5lIEUxMDAwXzgyNTQyX0FJVCAgICAgIEUxMDAwX0FJVAorI2RlZmluZSBFMTAwMF84MjU0Ml9WRlRBICAgICAweDAwNjAwCisjZGVmaW5lIEUxMDAwXzgyNTQyX0xFRENUTCAgIEUxMDAwX0xFRENUTAorI2RlZmluZSBFMTAwMF84MjU0Ml9QQkEgICAgICBFMTAwMF9QQkEKKyNkZWZpbmUgRTEwMDBfODI1NDJfUlhEQ1RMICAgRTEwMDBfUlhEQ1RMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JBRFYgICAgIEUxMDAwX1JBRFYKKyNkZWZpbmUgRTEwMDBfODI1NDJfUlNSUEQgICAgRTEwMDBfUlNSUEQKKyNkZWZpbmUgRTEwMDBfODI1NDJfVFhETUFDICAgRTEwMDBfVFhETUFDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RERkhTICAgIEUxMDAwX1RERkhTCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RERlRTICAgIEUxMDAwX1RERlRTCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RERlBDICAgIEUxMDAwX1RERlBDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RYRENUTCAgIEUxMDAwX1RYRENUTAorI2RlZmluZSBFMTAwMF84MjU0Ml9UQURWICAgICBFMTAwMF9UQURWCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RTUE1UICAgIEUxMDAwX1RTUE1UCisjZGVmaW5lIEUxMDAwXzgyNTQyX0NSQ0VSUlMgIEUxMDAwX0NSQ0VSUlMKKyNkZWZpbmUgRTEwMDBfODI1NDJfQUxHTkVSUkMgRTEwMDBfQUxHTkVSUkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfU1lNRVJSUyAgRTEwMDBfU1lNRVJSUworI2RlZmluZSBFMTAwMF84MjU0Ml9SWEVSUkMgICBFMTAwMF9SWEVSUkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfTVBDICAgICAgRTEwMDBfTVBDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1NDQyAgICAgIEUxMDAwX1NDQworI2RlZmluZSBFMTAwMF84MjU0Ml9FQ09MICAgICBFMTAwMF9FQ09MCisjZGVmaW5lIEUxMDAwXzgyNTQyX01DQyAgICAgIEUxMDAwX01DQworI2RlZmluZSBFMTAwMF84MjU0Ml9MQVRFQ09MICBFMTAwMF9MQVRFQ09MCisjZGVmaW5lIEUxMDAwXzgyNTQyX0NPTEMgICAgIEUxMDAwX0NPTEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfREMgICAgICAgRTEwMDBfREMKKyNkZWZpbmUgRTEwMDBfODI1NDJfVE5DUlMgICAgRTEwMDBfVE5DUlMKKyNkZWZpbmUgRTEwMDBfODI1NDJfU0VDICAgICAgRTEwMDBfU0VDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0NFWFRFUlIgIEUxMDAwX0NFWFRFUlIKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkxFQyAgICAgRTEwMDBfUkxFQworI2RlZmluZSBFMTAwMF84MjU0Ml9YT05SWEMgICBFMTAwMF9YT05SWEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfWE9OVFhDICAgRTEwMDBfWE9OVFhDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1hPRkZSWEMgIEUxMDAwX1hPRkZSWEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfWE9GRlRYQyAgRTEwMDBfWE9GRlRYQworI2RlZmluZSBFMTAwMF84MjU0Ml9GQ1JVQyAgICBFMTAwMF9GQ1JVQworI2RlZmluZSBFMTAwMF84MjU0Ml9QUkM2NCAgICBFMTAwMF9QUkM2NAorI2RlZmluZSBFMTAwMF84MjU0Ml9QUkMxMjcgICBFMTAwMF9QUkMxMjcKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFJDMjU1ICAgRTEwMDBfUFJDMjU1CisjZGVmaW5lIEUxMDAwXzgyNTQyX1BSQzUxMSAgIEUxMDAwX1BSQzUxMQorI2RlZmluZSBFMTAwMF84MjU0Ml9QUkMxMDIzICBFMTAwMF9QUkMxMDIzCisjZGVmaW5lIEUxMDAwXzgyNTQyX1BSQzE1MjIgIEUxMDAwX1BSQzE1MjIKKyNkZWZpbmUgRTEwMDBfODI1NDJfR1BSQyAgICAgRTEwMDBfR1BSQworI2RlZmluZSBFMTAwMF84MjU0Ml9CUFJDICAgICBFMTAwMF9CUFJDCisjZGVmaW5lIEUxMDAwXzgyNTQyX01QUkMgICAgIEUxMDAwX01QUkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfR1BUQyAgICAgRTEwMDBfR1BUQworI2RlZmluZSBFMTAwMF84MjU0Ml9HT1JDTCAgICBFMTAwMF9HT1JDTAorI2RlZmluZSBFMTAwMF84MjU0Ml9HT1JDSCAgICBFMTAwMF9HT1JDSAorI2RlZmluZSBFMTAwMF84MjU0Ml9HT1RDTCAgICBFMTAwMF9HT1RDTAorI2RlZmluZSBFMTAwMF84MjU0Ml9HT1RDSCAgICBFMTAwMF9HT1RDSAorI2RlZmluZSBFMTAwMF84MjU0Ml9STkJDICAgICBFMTAwMF9STkJDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JVQyAgICAgIEUxMDAwX1JVQworI2RlZmluZSBFMTAwMF84MjU0Ml9SRkMgICAgICBFMTAwMF9SRkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfUk9DICAgICAgRTEwMDBfUk9DCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JKQyAgICAgIEUxMDAwX1JKQworI2RlZmluZSBFMTAwMF84MjU0Ml9NR1RQUkMgICBFMTAwMF9NR1RQUkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfTUdUUERDICAgRTEwMDBfTUdUUERDCisjZGVmaW5lIEUxMDAwXzgyNTQyX01HVFBUQyAgIEUxMDAwX01HVFBUQworI2RlZmluZSBFMTAwMF84MjU0Ml9UT1JMICAgICBFMTAwMF9UT1JMCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RPUkggICAgIEUxMDAwX1RPUkgKKyNkZWZpbmUgRTEwMDBfODI1NDJfVE9UTCAgICAgRTEwMDBfVE9UTAorI2RlZmluZSBFMTAwMF84MjU0Ml9UT1RIICAgICBFMTAwMF9UT1RICisjZGVmaW5lIEUxMDAwXzgyNTQyX1RQUiAgICAgIEUxMDAwX1RQUgorI2RlZmluZSBFMTAwMF84MjU0Ml9UUFQgICAgICBFMTAwMF9UUFQKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFRDNjQgICAgRTEwMDBfUFRDNjQKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFRDMTI3ICAgRTEwMDBfUFRDMTI3CisjZGVmaW5lIEUxMDAwXzgyNTQyX1BUQzI1NSAgIEUxMDAwX1BUQzI1NQorI2RlZmluZSBFMTAwMF84MjU0Ml9QVEM1MTEgICBFMTAwMF9QVEM1MTEKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFRDMTAyMyAgRTEwMDBfUFRDMTAyMworI2RlZmluZSBFMTAwMF84MjU0Ml9QVEMxNTIyICBFMTAwMF9QVEMxNTIyCisjZGVmaW5lIEUxMDAwXzgyNTQyX01QVEMgICAgIEUxMDAwX01QVEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfQlBUQyAgICAgRTEwMDBfQlBUQworI2RlZmluZSBFMTAwMF84MjU0Ml9UU0NUQyAgICBFMTAwMF9UU0NUQworI2RlZmluZSBFMTAwMF84MjU0Ml9UU0NURkMgICBFMTAwMF9UU0NURkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfUlhDU1VNICAgRTEwMDBfUlhDU1VNCisjZGVmaW5lIEUxMDAwXzgyNTQyX1dVQyAgICAgIEUxMDAwX1dVQworI2RlZmluZSBFMTAwMF84MjU0Ml9XVUZDICAgICBFMTAwMF9XVUZDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1dVUyAgICAgIEUxMDAwX1dVUworI2RlZmluZSBFMTAwMF84MjU0Ml9NQU5DICAgICBFMTAwMF9NQU5DCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lQQVYgICAgIEUxMDAwX0lQQVYKKyNkZWZpbmUgRTEwMDBfODI1NDJfSVA0QVQgICAgRTEwMDBfSVA0QVQKKyNkZWZpbmUgRTEwMDBfODI1NDJfSVA2QVQgICAgRTEwMDBfSVA2QVQKKyNkZWZpbmUgRTEwMDBfODI1NDJfV1VQTCAgICAgRTEwMDBfV1VQTAorI2RlZmluZSBFMTAwMF84MjU0Ml9XVVBNICAgICBFMTAwMF9XVVBNCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZGTFQgICAgIEUxMDAwX0ZGTFQKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERGSCAgICAgMHgwODAxMAorI2RlZmluZSBFMTAwMF84MjU0Ml9UREZUICAgICAweDA4MDE4CisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZGTVQgICAgIEUxMDAwX0ZGTVQKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkZWVCAgICAgRTEwMDBfRkZWVAorI2RlZmluZSBFMTAwMF84MjU0Ml9IT1NUX0lGICBFMTAwMF9IT1NUX0lGCisKKy8qIFN0YXRpc3RpY3MgY291bnRlcnMgY29sbGVjdGVkIGJ5IHRoZSBNQUMgKi8KK3N0cnVjdCBlMTAwMF9od19zdGF0cyB7CisgICAgdWludDY0X3QgY3JjZXJyczsKKyAgICB1aW50NjRfdCBhbGduZXJyYzsKKyAgICB1aW50NjRfdCBzeW1lcnJzOworICAgIHVpbnQ2NF90IHJ4ZXJyYzsKKyAgICB1aW50NjRfdCBtcGM7CisgICAgdWludDY0X3Qgc2NjOworICAgIHVpbnQ2NF90IGVjb2w7CisgICAgdWludDY0X3QgbWNjOworICAgIHVpbnQ2NF90IGxhdGVjb2w7CisgICAgdWludDY0X3QgY29sYzsKKyAgICB1aW50NjRfdCBkYzsKKyAgICB1aW50NjRfdCB0bmNyczsKKyAgICB1aW50NjRfdCBzZWM7CisgICAgdWludDY0X3QgY2V4dGVycjsKKyAgICB1aW50NjRfdCBybGVjOworICAgIHVpbnQ2NF90IHhvbnJ4YzsKKyAgICB1aW50NjRfdCB4b250eGM7CisgICAgdWludDY0X3QgeG9mZnJ4YzsKKyAgICB1aW50NjRfdCB4b2ZmdHhjOworICAgIHVpbnQ2NF90IGZjcnVjOworICAgIHVpbnQ2NF90IHByYzY0OworICAgIHVpbnQ2NF90IHByYzEyNzsKKyAgICB1aW50NjRfdCBwcmMyNTU7CisgICAgdWludDY0X3QgcHJjNTExOworICAgIHVpbnQ2NF90IHByYzEwMjM7CisgICAgdWludDY0X3QgcHJjMTUyMjsKKyAgICB1aW50NjRfdCBncHJjOworICAgIHVpbnQ2NF90IGJwcmM7CisgICAgdWludDY0X3QgbXByYzsKKyAgICB1aW50NjRfdCBncHRjOworICAgIHVpbnQ2NF90IGdvcmNsOworICAgIHVpbnQ2NF90IGdvcmNoOworICAgIHVpbnQ2NF90IGdvdGNsOworICAgIHVpbnQ2NF90IGdvdGNoOworICAgIHVpbnQ2NF90IHJuYmM7CisgICAgdWludDY0X3QgcnVjOworICAgIHVpbnQ2NF90IHJmYzsKKyAgICB1aW50NjRfdCByb2M7CisgICAgdWludDY0X3QgcmpjOworICAgIHVpbnQ2NF90IG1ncHJjOworICAgIHVpbnQ2NF90IG1ncGRjOworICAgIHVpbnQ2NF90IG1ncHRjOworICAgIHVpbnQ2NF90IHRvcmw7CisgICAgdWludDY0X3QgdG9yaDsKKyAgICB1aW50NjRfdCB0b3RsOworICAgIHVpbnQ2NF90IHRvdGg7CisgICAgdWludDY0X3QgdHByOworICAgIHVpbnQ2NF90IHRwdDsKKyAgICB1aW50NjRfdCBwdGM2NDsKKyAgICB1aW50NjRfdCBwdGMxMjc7CisgICAgdWludDY0X3QgcHRjMjU1OworICAgIHVpbnQ2NF90IHB0YzUxMTsKKyAgICB1aW50NjRfdCBwdGMxMDIzOworICAgIHVpbnQ2NF90IHB0YzE1MjI7CisgICAgdWludDY0X3QgbXB0YzsKKyAgICB1aW50NjRfdCBicHRjOworICAgIHVpbnQ2NF90IHRzY3RjOworICAgIHVpbnQ2NF90IHRzY3RmYzsKK307CisKKy8qIFN0cnVjdHVyZSBjb250YWluaW5nIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBzaGFyZWQgY29kZSAoZTEwMDBfaHcuYykgKi8KK3N0cnVjdCBlMTAwMF9odyB7CisgICAgdWludDhfdCBfX2lvbWVtICpod19hZGRyOworICAgIGUxMDAwX21hY190eXBlIG1hY190eXBlOworICAgIGUxMDAwX3BoeV90eXBlIHBoeV90eXBlOworICAgIHVpbnQzMl90IHBoeV9pbml0X3NjcmlwdDsKKyAgICBlMTAwMF9tZWRpYV90eXBlIG1lZGlhX3R5cGU7CisgICAgdm9pZCAqYmFjazsKKyAgICBlMTAwMF9mY190eXBlIGZjOworICAgIGUxMDAwX2J1c19zcGVlZCBidXNfc3BlZWQ7CisgICAgZTEwMDBfYnVzX3dpZHRoIGJ1c193aWR0aDsKKyAgICBlMTAwMF9idXNfdHlwZSBidXNfdHlwZTsKKyAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gZWVwcm9tOworICAgIGUxMDAwX21zX3R5cGUgbWFzdGVyX3NsYXZlOworICAgIGUxMDAwX21zX3R5cGUgb3JpZ2luYWxfbWFzdGVyX3NsYXZlOworICAgIGUxMDAwX2ZmZV9jb25maWcgZmZlX2NvbmZpZ19zdGF0ZTsKKyAgICB1aW50MzJfdCBhc2ZfZmlybXdhcmVfcHJlc2VudDsKKyAgICB1bnNpZ25lZCBsb25nIGlvX2Jhc2U7CisgICAgdWludDMyX3QgcGh5X2lkOworICAgIHVpbnQzMl90IHBoeV9yZXZpc2lvbjsKKyAgICB1aW50MzJfdCBwaHlfYWRkcjsKKyAgICB1aW50MzJfdCBvcmlnaW5hbF9mYzsKKyAgICB1aW50MzJfdCB0eGN3OworICAgIHVpbnQzMl90IGF1dG9uZWdfZmFpbGVkOworICAgIHVpbnQzMl90IG1heF9mcmFtZV9zaXplOworICAgIHVpbnQzMl90IG1pbl9mcmFtZV9zaXplOworICAgIHVpbnQzMl90IG1jX2ZpbHRlcl90eXBlOworICAgIHVpbnQzMl90IG51bV9tY19hZGRyczsKKyAgICB1aW50MzJfdCBjb2xsaXNpb25fZGVsdGE7CisgICAgdWludDMyX3QgdHhfcGFja2V0X2RlbHRhOworICAgIHVpbnQzMl90IGxlZGN0bF9kZWZhdWx0OworICAgIHVpbnQzMl90IGxlZGN0bF9tb2RlMTsKKyAgICB1aW50MzJfdCBsZWRjdGxfbW9kZTI7CisgICAgdWludDE2X3QgcGh5X3NwZF9kZWZhdWx0OworICAgIHVpbnQxNl90IGF1dG9uZWdfYWR2ZXJ0aXNlZDsKKyAgICB1aW50MTZfdCBwY2lfY21kX3dvcmQ7CisgICAgdWludDE2X3QgZmNfaGlnaF93YXRlcjsKKyAgICB1aW50MTZfdCBmY19sb3dfd2F0ZXI7CisgICAgdWludDE2X3QgZmNfcGF1c2VfdGltZTsKKyAgICB1aW50MTZfdCBjdXJyZW50X2lmc192YWw7CisgICAgdWludDE2X3QgaWZzX21pbl92YWw7CisgICAgdWludDE2X3QgaWZzX21heF92YWw7CisgICAgdWludDE2X3QgaWZzX3N0ZXBfc2l6ZTsKKyAgICB1aW50MTZfdCBpZnNfcmF0aW87CisgICAgdWludDE2X3QgZGV2aWNlX2lkOworICAgIHVpbnQxNl90IHZlbmRvcl9pZDsKKyAgICB1aW50MTZfdCBzdWJzeXN0ZW1faWQ7CisgICAgdWludDE2X3Qgc3Vic3lzdGVtX3ZlbmRvcl9pZDsKKyAgICB1aW50OF90IHJldmlzaW9uX2lkOworICAgIHVpbnQ4X3QgYXV0b25lZzsKKyAgICB1aW50OF90IG1kaXg7CisgICAgdWludDhfdCBmb3JjZWRfc3BlZWRfZHVwbGV4OworICAgIHVpbnQ4X3Qgd2FpdF9hdXRvbmVnX2NvbXBsZXRlOworICAgIHVpbnQ4X3QgZG1hX2ZhaXJuZXNzOworICAgIHVpbnQ4X3QgbWFjX2FkZHJbTk9ERV9BRERSRVNTX1NJWkVdOworICAgIHVpbnQ4X3QgcGVybV9tYWNfYWRkcltOT0RFX0FERFJFU1NfU0laRV07CisgICAgYm9vbGVhbl90IGRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbjsKKyAgICBib29sZWFuX3Qgc3BlZWRfZG93bmdyYWRlZDsKKyAgICBlMTAwMF9zbWFydF9zcGVlZCBzbWFydF9zcGVlZDsKKyAgICBlMTAwMF9kc3BfY29uZmlnIGRzcF9jb25maWdfc3RhdGU7CisgICAgYm9vbGVhbl90IGdldF9saW5rX3N0YXR1czsKKyAgICBib29sZWFuX3Qgc2VyZGVzX2xpbmtfZG93bjsKKyAgICBib29sZWFuX3QgdGJpX2NvbXBhdGliaWxpdHlfZW47CisgICAgYm9vbGVhbl90IHRiaV9jb21wYXRpYmlsaXR5X29uOworICAgIGJvb2xlYW5fdCBwaHlfcmVzZXRfZGlzYWJsZTsKKyAgICBib29sZWFuX3QgZmNfc2VuZF94b247CisgICAgYm9vbGVhbl90IGZjX3N0cmljdF9pZWVlOworICAgIGJvb2xlYW5fdCByZXBvcnRfdHhfZWFybHk7CisgICAgYm9vbGVhbl90IGFkYXB0aXZlX2lmczsKKyAgICBib29sZWFuX3QgaWZzX3BhcmFtc19mb3JjZWQ7CisgICAgYm9vbGVhbl90IGluX2lmc19tb2RlOworfTsKKworCisjZGVmaW5lIEUxMDAwX0VFUFJPTV9TV0RQSU4wICAgMHgwMDAxICAgLyogU1dEUElOIDAgRUVQUk9NIFZhbHVlICovCisjZGVmaW5lIEUxMDAwX0VFUFJPTV9MRURfTE9HSUMgMHgwMDIwICAgLyogTGVkIExvZ2ljIFdvcmQgKi8KKy8qIFJlZ2lzdGVyIEJpdCBNYXNrcyAqLworLyogRGV2aWNlIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9GRCAgICAgICAweDAwMDAwMDAxICAvKiBGdWxsIGR1cGxleC4wPWhhbGY7IDE9ZnVsbCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0JFTSAgICAgIDB4MDAwMDAwMDIgIC8qIEVuZGlhbiBNb2RlLjA9bGl0dGxlLDE9YmlnICovCisjZGVmaW5lIEUxMDAwX0NUUkxfUFJJT1IgICAgMHgwMDAwMDAwNCAgLyogUHJpb3JpdHkgb24gUENJLiAwPXJ4LDE9ZmFpciAqLworI2RlZmluZSBFMTAwMF9DVFJMX0xSU1QgICAgIDB4MDAwMDAwMDggIC8qIExpbmsgcmVzZXQuIDA9bm9ybWFsLDE9cmVzZXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9UTUUgICAgICAweDAwMDAwMDEwICAvKiBUZXN0IG1vZGUuIDA9bm9ybWFsLDE9dGVzdCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NMRSAgICAgIDB4MDAwMDAwMjAgIC8qIFNlcmlhbCBMaW5rIG9uIDA9ZGlzLDE9ZW4gKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9BU0RFICAgICAweDAwMDAwMDIwICAvKiBBdXRvLXNwZWVkIGRldGVjdCBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TTFUgICAgICAweDAwMDAwMDQwICAvKiBTZXQgbGluayB1cCAoRm9yY2UgTGluaykgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9JTE9TICAgICAweDAwMDAwMDgwICAvKiBJbnZlcnQgTG9zcy1PZiBTaWduYWwgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TUERfU0VMICAweDAwMDAwMzAwICAvKiBTcGVlZCBTZWxlY3QgTWFzayAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NQRF8xMCAgIDB4MDAwMDAwMDAgIC8qIEZvcmNlIDEwTWIgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TUERfMTAwICAweDAwMDAwMTAwICAvKiBGb3JjZSAxMDBNYiAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NQRF8xMDAwIDB4MDAwMDAyMDAgIC8qIEZvcmNlIDFHYiAqLworI2RlZmluZSBFMTAwMF9DVFJMX0JFTTMyICAgIDB4MDAwMDA0MDAgIC8qIEJpZyBFbmRpYW4gMzIgbW9kZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX0ZSQ1NQRCAgIDB4MDAwMDA4MDAgIC8qIEZvcmNlIFNwZWVkICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRlJDRFBYICAgMHgwMDAwMTAwMCAgLyogRm9yY2UgRHVwbGV4ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElOMCAgMHgwMDA0MDAwMCAgLyogU1dEUElOIDAgdmFsdWUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU4xICAweDAwMDgwMDAwICAvKiBTV0RQSU4gMSB2YWx1ZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTjIgIDB4MDAxMDAwMDAgIC8qIFNXRFBJTiAyIHZhbHVlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElOMyAgMHgwMDIwMDAwMCAgLyogU1dEUElOIDMgdmFsdWUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU8wICAweDAwNDAwMDAwICAvKiBTV0RQSU4gMCBJbnB1dCBvciBvdXRwdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU8xICAweDAwODAwMDAwICAvKiBTV0RQSU4gMSBpbnB1dCBvciBvdXRwdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU8yICAweDAxMDAwMDAwICAvKiBTV0RQSU4gMiBpbnB1dCBvciBvdXRwdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU8zICAweDAyMDAwMDAwICAvKiBTV0RQSU4gMyBpbnB1dCBvciBvdXRwdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9SU1QgICAgICAweDA0MDAwMDAwICAvKiBHbG9iYWwgcmVzZXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9SRkNFICAgICAweDA4MDAwMDAwICAvKiBSZWNlaXZlIEZsb3cgQ29udHJvbCBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9URkNFICAgICAweDEwMDAwMDAwICAvKiBUcmFuc21pdCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfUlRFICAgICAgMHgyMDAwMDAwMCAgLyogUm91dGluZyB0YWcgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfVk1FICAgICAgMHg0MDAwMDAwMCAgLyogSUVFRSBWTEFOIG1vZGUgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfUEhZX1JTVCAgMHg4MDAwMDAwMCAgLyogUEhZIFJlc2V0ICovCisKKy8qIERldmljZSBTdGF0dXMgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX0ZEICAgICAgICAgMHgwMDAwMDAwMSAgICAgIC8qIEZ1bGwgZHVwbGV4LjA9aGFsZiwxPWZ1bGwgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX0xVICAgICAgICAgMHgwMDAwMDAwMiAgICAgIC8qIExpbmsgdXAuMD1ubywxPWxpbmsgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX0ZVTkNfTUFTSyAgMHgwMDAwMDAwQyAgICAgIC8qIFBDSSBGdW5jdGlvbiBNYXNrICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19GVU5DXzAgICAgIDB4MDAwMDAwMDAgICAgICAvKiBGdW5jdGlvbiAwICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19GVU5DXzEgICAgIDB4MDAwMDAwMDQgICAgICAvKiBGdW5jdGlvbiAxICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19UWE9GRiAgICAgIDB4MDAwMDAwMTAgICAgICAvKiB0cmFuc21pc3Npb24gcGF1c2VkICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19UQklNT0RFICAgIDB4MDAwMDAwMjAgICAgICAvKiBUQkkgbW9kZSAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfTUFTSyAweDAwMDAwMEMwCisjZGVmaW5lIEUxMDAwX1NUQVRVU19TUEVFRF8xMCAgIDB4MDAwMDAwMDAgICAgICAvKiBTcGVlZCAxME1iL3MgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1NQRUVEXzEwMCAgMHgwMDAwMDA0MCAgICAgIC8qIFNwZWVkIDEwME1iL3MgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1NQRUVEXzEwMDAgMHgwMDAwMDA4MCAgICAgIC8qIFNwZWVkIDEwMDBNYi9zICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19BU0RWICAgICAgIDB4MDAwMDAzMDAgICAgICAvKiBBdXRvIHNwZWVkIGRldGVjdCB2YWx1ZSAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfTVRYQ0tPSyAgICAweDAwMDAwNDAwICAgICAgLyogTVRYIGNsb2NrIHJ1bm5pbmcgT0sgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1BDSTY2ICAgICAgMHgwMDAwMDgwMCAgICAgIC8qIEluIDY2TWh6IHNsb3QgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX0JVUzY0ICAgICAgMHgwMDAwMTAwMCAgICAgIC8qIEluIDY0IGJpdCBzbG90ICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0lYX01PREUgIDB4MDAwMDIwMDAgICAgICAvKiBQQ0ktWCBtb2RlICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEIDB4MDAwMEMwMDAgICAgICAvKiBQQ0ktWCBidXMgc3BlZWQgKi8KKworLyogQ29uc3RhbnRzIHVzZWQgdG8gaW50cmVwcmV0IHRoZSBtYXNrZWQgUENJLVggYnVzIHNwZWVkLiAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfUENJWF9TUEVFRF82NiAgMHgwMDAwMDAwMCAvKiBQQ0ktWCBidXMgc3BlZWQgIDUwLTY2IE1IeiAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfUENJWF9TUEVFRF8xMDAgMHgwMDAwNDAwMCAvKiBQQ0ktWCBidXMgc3BlZWQgIDY2LTEwMCBNSHogKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1BDSVhfU1BFRURfMTMzIDB4MDAwMDgwMDAgLyogUENJLVggYnVzIHNwZWVkIDEwMC0xMzMgTUh6ICovCisKKy8qIEVFUFJPTS9GbGFzaCBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfU0sgICAgICAgIDB4MDAwMDAwMDEgLyogRUVQUk9NIENsb2NrICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfQ1MgICAgICAgIDB4MDAwMDAwMDIgLyogRUVQUk9NIENoaXAgU2VsZWN0ICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfREkgICAgICAgIDB4MDAwMDAwMDQgLyogRUVQUk9NIERhdGEgSW4gKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9ETyAgICAgICAgMHgwMDAwMDAwOCAvKiBFRVBST00gRGF0YSBPdXQgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9GV0VfTUFTSyAgMHgwMDAwMDAzMAorI2RlZmluZSBFMTAwMF9FRUNEX0ZXRV9ESVMgICAweDAwMDAwMDEwIC8qIERpc2FibGUgRkxBU0ggd3JpdGVzICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfRldFX0VOICAgIDB4MDAwMDAwMjAgLyogRW5hYmxlIEZMQVNIIHdyaXRlcyAqLworI2RlZmluZSBFMTAwMF9FRUNEX0ZXRV9TSElGVCA0CisjZGVmaW5lIEUxMDAwX0VFQ0RfUkVRICAgICAgIDB4MDAwMDAwNDAgLyogRUVQUk9NIEFjY2VzcyBSZXF1ZXN0ICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfR05UICAgICAgIDB4MDAwMDAwODAgLyogRUVQUk9NIEFjY2VzcyBHcmFudCAqLworI2RlZmluZSBFMTAwMF9FRUNEX1BSRVMgICAgICAweDAwMDAwMTAwIC8qIEVFUFJPTSBQcmVzZW50ICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfU0laRSAgICAgIDB4MDAwMDAyMDAgLyogRUVQUk9NIFNpemUgKDA9NjQgd29yZCAxPTI1NiB3b3JkKSAqLworI2RlZmluZSBFMTAwMF9FRUNEX0FERFJfQklUUyAweDAwMDAwNDAwIC8qIEVFUFJPTSBBZGRyZXNzaW5nIGJpdHMgYmFzZWQgb24gdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICgwLXNtYWxsLCAxLWxhcmdlKSAqLworI2RlZmluZSBFMTAwMF9FRUNEX1RZUEUgICAgICAweDAwMDAyMDAwIC8qIEVFUFJPTSBUeXBlICgxLVNQSSwgMC1NaWNyb3dpcmUpICovCisjaWZuZGVmIEUxMDAwX0VFUFJPTV9HUkFOVF9BVFRFTVBUUworI2RlZmluZSBFMTAwMF9FRVBST01fR1JBTlRfQVRURU1QVFMgMTAwMCAvKiBFRVBST00gIyBhdHRlbXB0cyB0byBnYWluIGdyYW50ICovCisjZW5kaWYKKworLyogRUVQUk9NIFJlYWQgKi8KKyNkZWZpbmUgRTEwMDBfRUVSRF9TVEFSVCAgICAgIDB4MDAwMDAwMDEgLyogU3RhcnQgUmVhZCAqLworI2RlZmluZSBFMTAwMF9FRVJEX0RPTkUgICAgICAgMHgwMDAwMDAxMCAvKiBSZWFkIERvbmUgKi8KKyNkZWZpbmUgRTEwMDBfRUVSRF9BRERSX1NISUZUIDgKKyNkZWZpbmUgRTEwMDBfRUVSRF9BRERSX01BU0sgIDB4MDAwMEZGMDAgLyogUmVhZCBBZGRyZXNzICovCisjZGVmaW5lIEUxMDAwX0VFUkRfREFUQV9TSElGVCAxNgorI2RlZmluZSBFMTAwMF9FRVJEX0RBVEFfTUFTSyAgMHhGRkZGMDAwMCAvKiBSZWFkIERhdGEgKi8KKworLyogU1BJIEVFUFJPTSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRUVQUk9NX1NUQVRVU19SRFlfU1BJICAweDAxCisjZGVmaW5lIEVFUFJPTV9TVEFUVVNfV0VOX1NQSSAgMHgwMgorI2RlZmluZSBFRVBST01fU1RBVFVTX0JQMF9TUEkgIDB4MDQKKyNkZWZpbmUgRUVQUk9NX1NUQVRVU19CUDFfU1BJICAweDA4CisjZGVmaW5lIEVFUFJPTV9TVEFUVVNfV1BFTl9TUEkgMHg4MAorCisvKiBFeHRlbmRlZCBEZXZpY2UgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9HUEkwX0VOICAgMHgwMDAwMDAwMSAvKiBNYXBzIFNEUDQgdG8gR1BJMCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9HUEkxX0VOICAgMHgwMDAwMDAwMiAvKiBNYXBzIFNEUDUgdG8gR1BJMSAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9QSFlJTlRfRU4gRTEwMDBfQ1RSTF9FWFRfR1BJMV9FTgorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9HUEkyX0VOICAgMHgwMDAwMDAwNCAvKiBNYXBzIFNEUDYgdG8gR1BJMiAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9HUEkzX0VOICAgMHgwMDAwMDAwOCAvKiBNYXBzIFNEUDcgdG8gR1BJMyAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA0X0RBVEEgMHgwMDAwMDAxMCAvKiBWYWx1ZSBvZiBTVyBEZWZpbmVhYmxlIFBpbiA0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDVfREFUQSAweDAwMDAwMDIwIC8qIFZhbHVlIG9mIFNXIERlZmluZWFibGUgUGluIDUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfUEhZX0lOVCAgIEUxMDAwX0NUUkxfRVhUX1NEUDVfREFUQQorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA2X0RBVEEgMHgwMDAwMDA0MCAvKiBWYWx1ZSBvZiBTVyBEZWZpbmVhYmxlIFBpbiA2ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDdfREFUQSAweDAwMDAwMDgwIC8qIFZhbHVlIG9mIFNXIERlZmluZWFibGUgUGluIDcgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQNF9ESVIgIDB4MDAwMDAxMDAgLyogRGlyZWN0aW9uIG9mIFNEUDQgMD1pbiAxPW91dCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA1X0RJUiAgMHgwMDAwMDIwMCAvKiBEaXJlY3Rpb24gb2YgU0RQNSAwPWluIDE9b3V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDZfRElSICAweDAwMDAwNDAwIC8qIERpcmVjdGlvbiBvZiBTRFA2IDA9aW4gMT1vdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQN19ESVIgIDB4MDAwMDA4MDAgLyogRGlyZWN0aW9uIG9mIFNEUDcgMD1pbiAxPW91dCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9BU0RDSEsgICAgMHgwMDAwMTAwMCAvKiBJbml0aWF0ZSBhbiBBU0Qgc2VxdWVuY2UgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfRUVfUlNUICAgIDB4MDAwMDIwMDAgLyogUmVpbml0aWFsaXplIGZyb20gRUVQUk9NICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0lQUyAgICAgICAweDAwMDA0MDAwIC8qIEludmVydCBQb3dlciBTdGF0ZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TUERfQllQUyAgMHgwMDAwODAwMCAvKiBTcGVlZCBTZWxlY3QgQnlwYXNzICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0xJTktfTU9ERV9NQVNLIDB4MDBDMDAwMDAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfTElOS19NT0RFX0dNSUkgMHgwMDAwMDAwMAorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9MSU5LX01PREVfVEJJICAweDAwQzAwMDAwCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1dSX1dNQVJLX01BU0sgIDB4MDMwMDAwMDAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfV1JfV01BUktfMjU2ICAgMHgwMDAwMDAwMAorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9XUl9XTUFSS18zMjAgICAweDAxMDAwMDAwCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1dSX1dNQVJLXzM4NCAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfV1JfV01BUktfNDQ4ICAgMHgwMzAwMDAwMAorCisvKiBNREkgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9NRElDX0RBVEFfTUFTSyAweDAwMDBGRkZGCisjZGVmaW5lIEUxMDAwX01ESUNfUkVHX01BU0sgIDB4MDAxRjAwMDAKKyNkZWZpbmUgRTEwMDBfTURJQ19SRUdfU0hJRlQgMTYKKyNkZWZpbmUgRTEwMDBfTURJQ19QSFlfTUFTSyAgMHgwM0UwMDAwMAorI2RlZmluZSBFMTAwMF9NRElDX1BIWV9TSElGVCAyMQorI2RlZmluZSBFMTAwMF9NRElDX09QX1dSSVRFICAweDA0MDAwMDAwCisjZGVmaW5lIEUxMDAwX01ESUNfT1BfUkVBRCAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgRTEwMDBfTURJQ19SRUFEWSAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBFMTAwMF9NRElDX0lOVF9FTiAgICAweDIwMDAwMDAwCisjZGVmaW5lIEUxMDAwX01ESUNfRVJST1IgICAgIDB4NDAwMDAwMDAKKworLyogTEVEIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDBfTU9ERV9NQVNLICAgICAgIDB4MDAwMDAwMEYKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDBfTU9ERV9TSElGVCAgICAgIDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDBfSVZSVCAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDBfQkxJTksgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDFfTU9ERV9NQVNLICAgICAgIDB4MDAwMDBGMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDFfTU9ERV9TSElGVCAgICAgIDgKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDFfSVZSVCAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDFfQkxJTksgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDJfTU9ERV9NQVNLICAgICAgIDB4MDAwRjAwMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDJfTU9ERV9TSElGVCAgICAgIDE2CisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQyX0lWUlQgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQyX0JMSU5LICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQzX01PREVfTUFTSyAgICAgICAweDBGMDAwMDAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQzX01PREVfU0hJRlQgICAgICAyNAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEM19JVlJUICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEM19CTElOSyAgICAgICAgICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX0xJTktfMTBfMTAwMCAgMHgwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX0xJTktfMTAwXzEwMDAgMHgxCisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX0xJTktfVVAgICAgICAgMHgyCisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX0FDVElWSVRZICAgICAgMHgzCisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX0xJTktfQUNUSVZJVFkgMHg0CisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX0xJTktfMTAgICAgICAgMHg1CisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX0xJTktfMTAwICAgICAgMHg2CisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX0xJTktfMTAwMCAgICAgMHg3CisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX1BDSVhfTU9ERSAgICAgMHg4CisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX0ZVTExfRFVQTEVYICAgMHg5CisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX0NPTExJU0lPTiAgICAgMHhBCisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX0JVU19TUEVFRCAgICAgMHhCCisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX0JVU19TSVpFICAgICAgMHhDCisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX1BBVVNFRCAgICAgICAgMHhECisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX0xFRF9PTiAgICAgICAgMHhFCisjZGVmaW5lIEUxMDAwX0xFRENUTF9NT0RFX0xFRF9PRkYgICAgICAgMHhGCisKKy8qIFJlY2VpdmUgQWRkcmVzcyAqLworI2RlZmluZSBFMTAwMF9SQUhfQVYgIDB4ODAwMDAwMDAgICAgICAgIC8qIFJlY2VpdmUgZGVzY3JpcHRvciB2YWxpZCAqLworCisvKiBJbnRlcnJ1cHQgQ2F1c2UgUmVhZCAqLworI2RlZmluZSBFMTAwMF9JQ1JfVFhEVyAgICAgICAgICAweDAwMDAwMDAxIC8qIFRyYW5zbWl0IGRlc2Mgd3JpdHRlbiBiYWNrICovCisjZGVmaW5lIEUxMDAwX0lDUl9UWFFFICAgICAgICAgIDB4MDAwMDAwMDIgLyogVHJhbnNtaXQgUXVldWUgZW1wdHkgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX0xTQyAgICAgICAgICAgMHgwMDAwMDAwNCAvKiBMaW5rIFN0YXR1cyBDaGFuZ2UgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1JYU0VRICAgICAgICAgMHgwMDAwMDAwOCAvKiByeCBzZXF1ZW5jZSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JQ1JfUlhETVQwICAgICAgICAweDAwMDAwMDEwIC8qIHJ4IGRlc2MgbWluLiB0aHJlc2hvbGQgKDApICovCisjZGVmaW5lIEUxMDAwX0lDUl9SWE8gICAgICAgICAgIDB4MDAwMDAwNDAgLyogcnggb3ZlcnJ1biAqLworI2RlZmluZSBFMTAwMF9JQ1JfUlhUMCAgICAgICAgICAweDAwMDAwMDgwIC8qIHJ4IHRpbWVyIGludHIgKHJpbmcgMCkgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX01EQUMgICAgICAgICAgMHgwMDAwMDIwMCAvKiBNRElPIGFjY2VzcyBjb21wbGV0ZSAqLworI2RlZmluZSBFMTAwMF9JQ1JfUlhDRkcgICAgICAgICAweDAwMDAwNDAwIC8qIFJYIC9jLyBvcmRlcmVkIHNldCAqLworI2RlZmluZSBFMTAwMF9JQ1JfR1BJX0VOMCAgICAgICAweDAwMDAwODAwIC8qIEdQIEludCAwICovCisjZGVmaW5lIEUxMDAwX0lDUl9HUElfRU4xICAgICAgIDB4MDAwMDEwMDAgLyogR1AgSW50IDEgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX0dQSV9FTjIgICAgICAgMHgwMDAwMjAwMCAvKiBHUCBJbnQgMiAqLworI2RlZmluZSBFMTAwMF9JQ1JfR1BJX0VOMyAgICAgICAweDAwMDA0MDAwIC8qIEdQIEludCAzICovCisjZGVmaW5lIEUxMDAwX0lDUl9UWERfTE9XICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgRTEwMDBfSUNSX1NSUEQgICAgICAgICAgMHgwMDAxMDAwMAorCisvKiBJbnRlcnJ1cHQgQ2F1c2UgU2V0ICovCisjZGVmaW5lIEUxMDAwX0lDU19UWERXICAgICAgRTEwMDBfSUNSX1RYRFcgICAgICAvKiBUcmFuc21pdCBkZXNjIHdyaXR0ZW4gYmFjayAqLworI2RlZmluZSBFMTAwMF9JQ1NfVFhRRSAgICAgIEUxMDAwX0lDUl9UWFFFICAgICAgLyogVHJhbnNtaXQgUXVldWUgZW1wdHkgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX0xTQyAgICAgICBFMTAwMF9JQ1JfTFNDICAgICAgIC8qIExpbmsgU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhTRVEgICAgIEUxMDAwX0lDUl9SWFNFUSAgICAgLyogcnggc2VxdWVuY2UgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1JYRE1UMCAgICBFMTAwMF9JQ1JfUlhETVQwICAgIC8qIHJ4IGRlc2MgbWluLiB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1JYTyAgICAgICBFMTAwMF9JQ1JfUlhPICAgICAgIC8qIHJ4IG92ZXJydW4gKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1JYVDAgICAgICBFMTAwMF9JQ1JfUlhUMCAgICAgIC8qIHJ4IHRpbWVyIGludHIgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX01EQUMgICAgICBFMTAwMF9JQ1JfTURBQyAgICAgIC8qIE1ESU8gYWNjZXNzIGNvbXBsZXRlICovCisjZGVmaW5lIEUxMDAwX0lDU19SWENGRyAgICAgRTEwMDBfSUNSX1JYQ0ZHICAgICAvKiBSWCAvYy8gb3JkZXJlZCBzZXQgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX0dQSV9FTjAgICBFMTAwMF9JQ1JfR1BJX0VOMCAgIC8qIEdQIEludCAwICovCisjZGVmaW5lIEUxMDAwX0lDU19HUElfRU4xICAgRTEwMDBfSUNSX0dQSV9FTjEgICAvKiBHUCBJbnQgMSAqLworI2RlZmluZSBFMTAwMF9JQ1NfR1BJX0VOMiAgIEUxMDAwX0lDUl9HUElfRU4yICAgLyogR1AgSW50IDIgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX0dQSV9FTjMgICBFMTAwMF9JQ1JfR1BJX0VOMyAgIC8qIEdQIEludCAzICovCisjZGVmaW5lIEUxMDAwX0lDU19UWERfTE9XICAgRTEwMDBfSUNSX1RYRF9MT1cKKyNkZWZpbmUgRTEwMDBfSUNTX1NSUEQgICAgICBFMTAwMF9JQ1JfU1JQRAorCisvKiBJbnRlcnJ1cHQgTWFzayBTZXQgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1RYRFcgICAgICBFMTAwMF9JQ1JfVFhEVyAgICAgIC8qIFRyYW5zbWl0IGRlc2Mgd3JpdHRlbiBiYWNrICovCisjZGVmaW5lIEUxMDAwX0lNU19UWFFFICAgICAgRTEwMDBfSUNSX1RYUUUgICAgICAvKiBUcmFuc21pdCBRdWV1ZSBlbXB0eSAqLworI2RlZmluZSBFMTAwMF9JTVNfTFNDICAgICAgIEUxMDAwX0lDUl9MU0MgICAgICAgLyogTGluayBTdGF0dXMgQ2hhbmdlICovCisjZGVmaW5lIEUxMDAwX0lNU19SWFNFUSAgICAgRTEwMDBfSUNSX1JYU0VRICAgICAvKiByeCBzZXF1ZW5jZSBlcnJvciAqLworI2RlZmluZSBFMTAwMF9JTVNfUlhETVQwICAgIEUxMDAwX0lDUl9SWERNVDAgICAgLyogcnggZGVzYyBtaW4uIHRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9JTVNfUlhPICAgICAgIEUxMDAwX0lDUl9SWE8gICAgICAgLyogcnggb3ZlcnJ1biAqLworI2RlZmluZSBFMTAwMF9JTVNfUlhUMCAgICAgIEUxMDAwX0lDUl9SWFQwICAgICAgLyogcnggdGltZXIgaW50ciAqLworI2RlZmluZSBFMTAwMF9JTVNfTURBQyAgICAgIEUxMDAwX0lDUl9NREFDICAgICAgLyogTURJTyBhY2Nlc3MgY29tcGxldGUgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1JYQ0ZHICAgICBFMTAwMF9JQ1JfUlhDRkcgICAgIC8qIFJYIC9jLyBvcmRlcmVkIHNldCAqLworI2RlZmluZSBFMTAwMF9JTVNfR1BJX0VOMCAgIEUxMDAwX0lDUl9HUElfRU4wICAgLyogR1AgSW50IDAgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX0dQSV9FTjEgICBFMTAwMF9JQ1JfR1BJX0VOMSAgIC8qIEdQIEludCAxICovCisjZGVmaW5lIEUxMDAwX0lNU19HUElfRU4yICAgRTEwMDBfSUNSX0dQSV9FTjIgICAvKiBHUCBJbnQgMiAqLworI2RlZmluZSBFMTAwMF9JTVNfR1BJX0VOMyAgIEUxMDAwX0lDUl9HUElfRU4zICAgLyogR1AgSW50IDMgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1RYRF9MT1cgICBFMTAwMF9JQ1JfVFhEX0xPVworI2RlZmluZSBFMTAwMF9JTVNfU1JQRCAgICAgIEUxMDAwX0lDUl9TUlBECisKKy8qIEludGVycnVwdCBNYXNrIENsZWFyICovCisjZGVmaW5lIEUxMDAwX0lNQ19UWERXICAgICAgRTEwMDBfSUNSX1RYRFcgICAgICAvKiBUcmFuc21pdCBkZXNjIHdyaXR0ZW4gYmFjayAqLworI2RlZmluZSBFMTAwMF9JTUNfVFhRRSAgICAgIEUxMDAwX0lDUl9UWFFFICAgICAgLyogVHJhbnNtaXQgUXVldWUgZW1wdHkgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX0xTQyAgICAgICBFMTAwMF9JQ1JfTFNDICAgICAgIC8qIExpbmsgU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhTRVEgICAgIEUxMDAwX0lDUl9SWFNFUSAgICAgLyogcnggc2VxdWVuY2UgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1JYRE1UMCAgICBFMTAwMF9JQ1JfUlhETVQwICAgIC8qIHJ4IGRlc2MgbWluLiB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1JYTyAgICAgICBFMTAwMF9JQ1JfUlhPICAgICAgIC8qIHJ4IG92ZXJydW4gKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1JYVDAgICAgICBFMTAwMF9JQ1JfUlhUMCAgICAgIC8qIHJ4IHRpbWVyIGludHIgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX01EQUMgICAgICBFMTAwMF9JQ1JfTURBQyAgICAgIC8qIE1ESU8gYWNjZXNzIGNvbXBsZXRlICovCisjZGVmaW5lIEUxMDAwX0lNQ19SWENGRyAgICAgRTEwMDBfSUNSX1JYQ0ZHICAgICAvKiBSWCAvYy8gb3JkZXJlZCBzZXQgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX0dQSV9FTjAgICBFMTAwMF9JQ1JfR1BJX0VOMCAgIC8qIEdQIEludCAwICovCisjZGVmaW5lIEUxMDAwX0lNQ19HUElfRU4xICAgRTEwMDBfSUNSX0dQSV9FTjEgICAvKiBHUCBJbnQgMSAqLworI2RlZmluZSBFMTAwMF9JTUNfR1BJX0VOMiAgIEUxMDAwX0lDUl9HUElfRU4yICAgLyogR1AgSW50IDIgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX0dQSV9FTjMgICBFMTAwMF9JQ1JfR1BJX0VOMyAgIC8qIEdQIEludCAzICovCisjZGVmaW5lIEUxMDAwX0lNQ19UWERfTE9XICAgRTEwMDBfSUNSX1RYRF9MT1cKKyNkZWZpbmUgRTEwMDBfSU1DX1NSUEQgICAgICBFMTAwMF9JQ1JfU1JQRAorCisvKiBSZWNlaXZlIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9SU1QgICAgICAgICAgICAweDAwMDAwMDAxICAgIC8qIFNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lIEUxMDAwX1JDVExfRU4gICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAvKiBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TQlAgICAgICAgICAgICAweDAwMDAwMDA0ICAgIC8qIHN0b3JlIGJhZCBwYWNrZXQgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9VUEUgICAgICAgICAgICAweDAwMDAwMDA4ICAgIC8qIHVuaWNhc3QgcHJvbWlzY3VvdXMgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1JDVExfTVBFICAgICAgICAgICAgMHgwMDAwMDAxMCAgICAvKiBtdWx0aWNhc3QgcHJvbWlzY3VvdXMgZW5hYiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0xQRSAgICAgICAgICAgIDB4MDAwMDAwMjAgICAgLyogbG9uZyBwYWNrZXQgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1JDVExfTEJNX05PICAgICAgICAgMHgwMDAwMDAwMCAgICAvKiBubyBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIEUxMDAwX1JDVExfTEJNX01BQyAgICAgICAgMHgwMDAwMDA0MCAgICAvKiBNQUMgbG9vcGJhY2sgbW9kZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0xCTV9TTFAgICAgICAgIDB4MDAwMDAwODAgICAgLyogc2VyaWFsIGxpbmsgbG9vcGJhY2sgbW9kZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0xCTV9UQ1ZSICAgICAgIDB4MDAwMDAwQzAgICAgLyogdGN2ciBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIEUxMDAwX1JDVExfUkRNVFNfSEFMRiAgICAgMHgwMDAwMDAwMCAgICAvKiByeCBkZXNjIG1pbiB0aHJlc2hvbGQgc2l6ZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1JETVRTX1FVQVQgICAgIDB4MDAwMDAxMDAgICAgLyogcnggZGVzYyBtaW4gdGhyZXNob2xkIHNpemUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9SRE1UU19FSUdUSCAgICAweDAwMDAwMjAwICAgIC8qIHJ4IGRlc2MgbWluIHRocmVzaG9sZCBzaXplICovCisjZGVmaW5lIEUxMDAwX1JDVExfTU9fU0hJRlQgICAgICAgMTIgICAgICAgICAgICAvKiBtdWx0aWNhc3Qgb2Zmc2V0IHNoaWZ0ICovCisjZGVmaW5lIEUxMDAwX1JDVExfTU9fMCAgICAgICAgICAgMHgwMDAwMDAwMCAgICAvKiBtdWx0aWNhc3Qgb2Zmc2V0IDExOjAgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9NT18xICAgICAgICAgICAweDAwMDAxMDAwICAgIC8qIG11bHRpY2FzdCBvZmZzZXQgMTI6MSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01PXzIgICAgICAgICAgIDB4MDAwMDIwMDAgICAgLyogbXVsdGljYXN0IG9mZnNldCAxMzoyICovCisjZGVmaW5lIEUxMDAwX1JDVExfTU9fMyAgICAgICAgICAgMHgwMDAwMzAwMCAgICAvKiBtdWx0aWNhc3Qgb2Zmc2V0IDE1OjQgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9NRFIgICAgICAgICAgICAweDAwMDA0MDAwICAgIC8qIG11bHRpY2FzdCBkZXNjIHJpbmcgMCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0JBTSAgICAgICAgICAgIDB4MDAwMDgwMDAgICAgLyogYnJvYWRjYXN0IGVuYWJsZSAqLworLyogdGhlc2UgYnVmZmVyIHNpemVzIGFyZSB2YWxpZCBpZiBFMTAwMF9SQ1RMX0JTRVggaXMgMCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzIwNDggICAgICAgIDB4MDAwMDAwMDAgICAgLyogcnggYnVmZmVyIHNpemUgMjA0OCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzEwMjQgICAgICAgIDB4MDAwMTAwMDAgICAgLyogcnggYnVmZmVyIHNpemUgMTAyNCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzUxMiAgICAgICAgIDB4MDAwMjAwMDAgICAgLyogcnggYnVmZmVyIHNpemUgNTEyICovCisjZGVmaW5lIEUxMDAwX1JDVExfU1pfMjU2ICAgICAgICAgMHgwMDAzMDAwMCAgICAvKiByeCBidWZmZXIgc2l6ZSAyNTYgKi8KKy8qIHRoZXNlIGJ1ZmZlciBzaXplcyBhcmUgdmFsaWQgaWYgRTEwMDBfUkNUTF9CU0VYIGlzIDEgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TWl8xNjM4NCAgICAgICAweDAwMDEwMDAwICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDE2Mzg0ICovCisjZGVmaW5lIEUxMDAwX1JDVExfU1pfODE5MiAgICAgICAgMHgwMDAyMDAwMCAgICAvKiByeCBidWZmZXIgc2l6ZSA4MTkyICovCisjZGVmaW5lIEUxMDAwX1JDVExfU1pfNDA5NiAgICAgICAgMHgwMDAzMDAwMCAgICAvKiByeCBidWZmZXIgc2l6ZSA0MDk2ICovCisjZGVmaW5lIEUxMDAwX1JDVExfVkZFICAgICAgICAgICAgMHgwMDA0MDAwMCAgICAvKiB2bGFuIGZpbHRlciBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9DRklFTiAgICAgICAgICAweDAwMDgwMDAwICAgIC8qIGNhbm9uaWNhbCBmb3JtIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0NGSSAgICAgICAgICAgIDB4MDAxMDAwMDAgICAgLyogY2Fub25pY2FsIGZvcm0gaW5kaWNhdG9yICovCisjZGVmaW5lIEUxMDAwX1JDVExfRFBGICAgICAgICAgICAgMHgwMDQwMDAwMCAgICAvKiBkaXNjYXJkIHBhdXNlIGZyYW1lcyAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1BNQ0YgICAgICAgICAgIDB4MDA4MDAwMDAgICAgLyogcGFzcyBNQUMgY29udHJvbCBmcmFtZXMgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9CU0VYICAgICAgICAgICAweDAyMDAwMDAwICAgIC8qIEJ1ZmZlciBzaXplIGV4dGVuc2lvbiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NFQ1JDICAgICAgICAgIDB4MDQwMDAwMDAgICAgLyogU3RyaXAgRXRoZXJuZXQgQ1JDICovCisKKy8qIFJlY2VpdmUgRGVzY3JpcHRvciAqLworI2RlZmluZSBFMTAwMF9SRFRfREVMQVkgMHgwMDAwZmZmZiAgICAgIC8qIERlbGF5IHRpbWVyICgxPTEwMjR1cykgKi8KKyNkZWZpbmUgRTEwMDBfUkRUX0ZQREIgIDB4ODAwMDAwMDAgICAgICAvKiBGbHVzaCBkZXNjcmlwdG9yIGJsb2NrICovCisjZGVmaW5lIEUxMDAwX1JETEVOX0xFTiAweDAwMDdmZjgwICAgICAgLyogZGVzY3JpcHRvciBsZW5ndGggKi8KKyNkZWZpbmUgRTEwMDBfUkRIX1JESCAgIDB4MDAwMGZmZmYgICAgICAvKiByZWNlaXZlIGRlc2NyaXB0b3IgaGVhZCAqLworI2RlZmluZSBFMTAwMF9SRFRfUkRUICAgMHgwMDAwZmZmZiAgICAgIC8qIHJlY2VpdmUgZGVzY3JpcHRvciB0YWlsICovCisKKy8qIEZsb3cgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9GQ1JUSF9SVEggIDB4MDAwMEZGRjggICAgIC8qIE1hc2sgQml0c1sxNTozXSBmb3IgUlRIICovCisjZGVmaW5lIEUxMDAwX0ZDUlRIX1hGQ0UgMHg4MDAwMDAwMCAgICAgLyogRXh0ZXJuYWwgRmxvdyBDb250cm9sIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9GQ1JUTF9SVEwgIDB4MDAwMEZGRjggICAgIC8qIE1hc2sgQml0c1sxNTozXSBmb3IgUlRMICovCisjZGVmaW5lIEUxMDAwX0ZDUlRMX1hPTkUgMHg4MDAwMDAwMCAgICAgLyogRW5hYmxlIFhPTiBmcmFtZSB0cmFuc21pc3Npb24gKi8KKworLyogUmVjZWl2ZSBEZXNjcmlwdG9yIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfUlhEQ1RMX1BUSFJFU0ggMHgwMDAwMDAzRiAvKiBSWERDVEwgUHJlZmV0Y2ggVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1JYRENUTF9IVEhSRVNIIDB4MDAwMDNGMDAgLyogUlhEQ1RMIEhvc3QgVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1JYRENUTF9XVEhSRVNIIDB4MDAzRjAwMDAgLyogUlhEQ1RMIFdyaXRlYmFjayBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEQ1RMX0dSQU4gICAgMHgwMTAwMDAwMCAvKiBSWERDVEwgR3JhbnVsYXJpdHkgKi8KKworLyogVHJhbnNtaXQgRGVzY3JpcHRvciBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9QVEhSRVNIIDB4MDAwMDAwRkYgLyogVFhEQ1RMIFByZWZldGNoIFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9UWERDVExfSFRIUkVTSCAweDAwMDBGRjAwIC8qIFRYRENUTCBIb3N0IFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9UWERDVExfV1RIUkVTSCAweDAwRkYwMDAwIC8qIFRYRENUTCBXcml0ZWJhY2sgVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9HUkFOICAgIDB4MDEwMDAwMDAgLyogVFhEQ1RMIEdyYW51bGFyaXR5ICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9MV1RIUkVTSCAweEZFMDAwMDAwIC8qIFRYRENUTCBMb3cgVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9GVUxMX1RYX0RFU0NfV0IgMHgwMTAxMDAwMCAvKiBHUkFOPTEsIFdUSFJFU0g9MSAqLworCisvKiBUcmFuc21pdCBDb25maWd1cmF0aW9uIFdvcmQgKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19GRCAgICAgICAgIDB4MDAwMDAwMjAgICAgICAgIC8qIFRYQ1cgZnVsbCBkdXBsZXggKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19IRCAgICAgICAgIDB4MDAwMDAwNDAgICAgICAgIC8qIFRYQ1cgaGFsZiBkdXBsZXggKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19QQVVTRSAgICAgIDB4MDAwMDAwODAgICAgICAgIC8qIFRYQ1cgc3ltIHBhdXNlIHJlcXVlc3QgKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19BU01fRElSICAgIDB4MDAwMDAxMDAgICAgICAgIC8qIFRYQ1cgYXN0bSBwYXVzZSBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19QQVVTRV9NQVNLIDB4MDAwMDAxODAgICAgICAgIC8qIFRYQ1cgcGF1c2UgcmVxdWVzdCBtYXNrICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfUkYgICAgICAgICAweDAwMDAzMDAwICAgICAgICAvKiBUWENXIHJlbW90ZSBmYXVsdCAqLworI2RlZmluZSBFMTAwMF9UWENXX05QICAgICAgICAgMHgwMDAwODAwMCAgICAgICAgLyogVFhDVyBuZXh0IHBhZ2UgKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19DVyAgICAgICAgIDB4MDAwMGZmZmYgICAgICAgIC8qIFR4Q29uZmlnV29yZCBtYXNrICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfVFhDICAgICAgICAweDQwMDAwMDAwICAgICAgICAvKiBUcmFuc21pdCBDb25maWcgY29udHJvbCAqLworI2RlZmluZSBFMTAwMF9UWENXX0FORSAgICAgICAgMHg4MDAwMDAwMCAgICAgICAgLyogQXV0by1uZWcgZW5hYmxlICovCisKKy8qIFJlY2VpdmUgQ29uZmlndXJhdGlvbiBXb3JkICovCisjZGVmaW5lIEUxMDAwX1JYQ1dfQ1cgICAgMHgwMDAwZmZmZiAgICAgLyogUnhDb25maWdXb3JkIG1hc2sgKi8KKyNkZWZpbmUgRTEwMDBfUlhDV19OQyAgICAweDA0MDAwMDAwICAgICAvKiBSZWNlaXZlIGNvbmZpZyBubyBjYXJyaWVyICovCisjZGVmaW5lIEUxMDAwX1JYQ1dfSVYgICAgMHgwODAwMDAwMCAgICAgLyogUmVjZWl2ZSBjb25maWcgaW52YWxpZCAqLworI2RlZmluZSBFMTAwMF9SWENXX0NDICAgIDB4MTAwMDAwMDAgICAgIC8qIFJlY2VpdmUgY29uZmlnIGNoYW5nZSAqLworI2RlZmluZSBFMTAwMF9SWENXX0MgICAgIDB4MjAwMDAwMDAgICAgIC8qIFJlY2VpdmUgY29uZmlnICovCisjZGVmaW5lIEUxMDAwX1JYQ1dfU1lOQ0ggMHg0MDAwMDAwMCAgICAgLyogUmVjZWl2ZSBjb25maWcgc3luY2ggKi8KKyNkZWZpbmUgRTEwMDBfUlhDV19BTkMgICAweDgwMDAwMDAwICAgICAvKiBBdXRvLW5lZyBjb21wbGV0ZSAqLworCisvKiBUcmFuc21pdCBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1RDVExfUlNUICAgIDB4MDAwMDAwMDEgICAgLyogc29mdHdhcmUgcmVzZXQgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9FTiAgICAgMHgwMDAwMDAwMiAgICAvKiBlbmFibGUgdHggKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9CQ0UgICAgMHgwMDAwMDAwNCAgICAvKiBidXN5IGNoZWNrIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9UQ1RMX1BTUCAgICAweDAwMDAwMDA4ICAgIC8qIHBhZCBzaG9ydCBwYWNrZXRzICovCisjZGVmaW5lIEUxMDAwX1RDVExfQ1QgICAgIDB4MDAwMDBmZjAgICAgLyogY29sbGlzaW9uIHRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9UQ1RMX0NPTEQgICAweDAwM2ZmMDAwICAgIC8qIGNvbGxpc2lvbiBkaXN0YW5jZSAqLworI2RlZmluZSBFMTAwMF9UQ1RMX1NXWE9GRiAweDAwNDAwMDAwICAgIC8qIFNXIFhvZmYgdHJhbnNtaXNzaW9uICovCisjZGVmaW5lIEUxMDAwX1RDVExfUEJFICAgIDB4MDA4MDAwMDAgICAgLyogUGFja2V0IEJ1cnN0IEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9UQ1RMX1JUTEMgICAweDAxMDAwMDAwICAgIC8qIFJlLXRyYW5zbWl0IG9uIGxhdGUgY29sbGlzaW9uICovCisjZGVmaW5lIEUxMDAwX1RDVExfTlJUVSAgIDB4MDIwMDAwMDAgICAgLyogTm8gUmUtdHJhbnNtaXQgb24gdW5kZXJydW4gKi8KKworLyogUmVjZWl2ZSBDaGVja3N1bSBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1JYQ1NVTV9QQ1NTX01BU0sgMHgwMDAwMDBGRiAgIC8qIFBhY2tldCBDaGVja3N1bSBTdGFydCAqLworI2RlZmluZSBFMTAwMF9SWENTVU1fSVBPRkwgICAgIDB4MDAwMDAxMDAgICAvKiBJUHY0IGNoZWNrc3VtIG9mZmxvYWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhDU1VNX1RVT0ZMICAgICAweDAwMDAwMjAwICAgLyogVENQIC8gVURQIGNoZWNrc3VtIG9mZmxvYWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhDU1VNX0lQVjZPRkwgICAweDAwMDAwNDAwICAgLyogSVB2NiBjaGVja3N1bSBvZmZsb2FkICovCisKKy8qIERlZmluaXRpb25zIGZvciBwb3dlciBtYW5hZ2VtZW50IGFuZCB3YWtldXAgcmVnaXN0ZXJzICovCisvKiBXYWtlIFVwIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfV1VDX0FQTUUgICAgICAgMHgwMDAwMDAwMSAvKiBBUE0gRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVQ19QTUVfRU4gICAgIDB4MDAwMDAwMDIgLyogUE1FIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUNfUE1FX1NUQVRVUyAweDAwMDAwMDA0IC8qIFBNRSBTdGF0dXMgKi8KKyNkZWZpbmUgRTEwMDBfV1VDX0FQTVBNRSAgICAgMHgwMDAwMDAwOCAvKiBBc3NlcnQgUE1FIG9uIEFQTSBXYWtldXAgKi8KKyNkZWZpbmUgRTEwMDBfV1VDX1NQTSAgICAgICAgMHg4MDAwMDAwMCAvKiBFbmFibGUgU1BNICovCisKKy8qIFdha2UgVXAgRmlsdGVyIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19MTktDIDB4MDAwMDAwMDEgLyogTGluayBTdGF0dXMgQ2hhbmdlIFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19NQUcgIDB4MDAwMDAwMDIgLyogTWFnaWMgUGFja2V0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19FWCAgIDB4MDAwMDAwMDQgLyogRGlyZWN0ZWQgRXhhY3QgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX01DICAgMHgwMDAwMDAwOCAvKiBEaXJlY3RlZCBNdWx0aWNhc3QgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0JDICAgMHgwMDAwMDAxMCAvKiBCcm9hZGNhc3QgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0FSUCAgMHgwMDAwMDAyMCAvKiBBUlAgUmVxdWVzdCBQYWNrZXQgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0lQVjQgMHgwMDAwMDA0MCAvKiBEaXJlY3RlZCBJUHY0IFBhY2tldCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfSVBWNiAweDAwMDAwMDgwIC8qIERpcmVjdGVkIElQdjYgUGFja2V0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19GTFgwIDB4MDAwMTAwMDAgLyogRmxleGlibGUgRmlsdGVyIDAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfRkxYMSAweDAwMDIwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAxIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0ZMWDIgMHgwMDA0MDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMiBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19GTFgzIDB4MDAwODAwMDAgLyogRmxleGlibGUgRmlsdGVyIDMgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfQUxMX0ZJTFRFUlMgMHgwMDBGMDBGRiAvKiBNYXNrIGZvciBhbGwgd2FrZXVwIGZpbHRlcnMgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19GTFhfT0ZGU0VUIDE2ICAgICAgIC8qIE9mZnNldCB0byB0aGUgRmxleGlibGUgRmlsdGVycyBiaXRzICovCisjZGVmaW5lIEUxMDAwX1dVRkNfRkxYX0ZJTFRFUlMgMHgwMDBGMDAwMCAvKiBNYXNrIGZvciB0aGUgNCBmbGV4aWJsZSBmaWx0ZXJzICovCisKKy8qIFdha2UgVXAgU3RhdHVzICovCisjZGVmaW5lIEUxMDAwX1dVU19MTktDIDB4MDAwMDAwMDEgLyogTGluayBTdGF0dXMgQ2hhbmdlZCAqLworI2RlZmluZSBFMTAwMF9XVVNfTUFHICAweDAwMDAwMDAyIC8qIE1hZ2ljIFBhY2tldCBSZWNlaXZlZCAqLworI2RlZmluZSBFMTAwMF9XVVNfRVggICAweDAwMDAwMDA0IC8qIERpcmVjdGVkIEV4YWN0IFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19NQyAgIDB4MDAwMDAwMDggLyogRGlyZWN0ZWQgTXVsdGljYXN0IFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19CQyAgIDB4MDAwMDAwMTAgLyogQnJvYWRjYXN0IFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19BUlAgIDB4MDAwMDAwMjAgLyogQVJQIFJlcXVlc3QgUGFja2V0IFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19JUFY0IDB4MDAwMDAwNDAgLyogRGlyZWN0ZWQgSVB2NCBQYWNrZXQgV2FrZXVwIFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19JUFY2IDB4MDAwMDAwODAgLyogRGlyZWN0ZWQgSVB2NiBQYWNrZXQgV2FrZXVwIFJlY2VpdmVkICovCisjZGVmaW5lIEUxMDAwX1dVU19GTFgwIDB4MDAwMTAwMDAgLyogRmxleGlibGUgRmlsdGVyIDAgTWF0Y2ggKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0ZMWDEgMHgwMDAyMDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMSBNYXRjaCAqLworI2RlZmluZSBFMTAwMF9XVVNfRkxYMiAweDAwMDQwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAyIE1hdGNoICovCisjZGVmaW5lIEUxMDAwX1dVU19GTFgzIDB4MDAwODAwMDAgLyogRmxleGlibGUgRmlsdGVyIDMgTWF0Y2ggKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0ZMWF9GSUxURVJTIDB4MDAwRjAwMDAgLyogTWFzayBmb3IgdGhlIDQgZmxleGlibGUgZmlsdGVycyAqLworCisvKiBNYW5hZ2VtZW50IENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJVU19FTiAgICAgIDB4MDAwMDAwMDEgLyogU01CdXMgRW5hYmxlZCAtIFJPICovCisjZGVmaW5lIEUxMDAwX01BTkNfQVNGX0VOICAgICAgICAweDAwMDAwMDAyIC8qIEFTRiBFbmFibGVkIC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19SX09OX0ZPUkNFICAgIDB4MDAwMDAwMDQgLyogUmVzZXQgb24gRm9yY2UgVENPIC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19STUNQX0VOICAgICAgIDB4MDAwMDAxMDAgLyogRW5hYmxlIFJDTVAgMDI2RmggRmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfMDI5OF9FTiAgICAgICAweDAwMDAwMjAwIC8qIEVuYWJsZSBSQ01QIDAyOThoIEZpbHRlcmluZyAqLworI2RlZmluZSBFMTAwMF9NQU5DX0lQVjRfRU4gICAgICAgMHgwMDAwMDQwMCAvKiBFbmFibGUgSVB2NCAqLworI2RlZmluZSBFMTAwMF9NQU5DX0lQVjZfRU4gICAgICAgMHgwMDAwMDgwMCAvKiBFbmFibGUgSVB2NiAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NOQVBfRU4gICAgICAgMHgwMDAwMTAwMCAvKiBBY2NlcHQgTExDL1NOQVAgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19BUlBfRU4gICAgICAgIDB4MDAwMDIwMDAgLyogRW5hYmxlIEFSUCBSZXF1ZXN0IEZpbHRlcmluZyAqLworI2RlZmluZSBFMTAwMF9NQU5DX05FSUdIQk9SX0VOICAgMHgwMDAwNDAwMCAvKiBFbmFibGUgTmVpZ2hib3IgRGlzY292ZXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEZpbHRlcmluZyAqLworI2RlZmluZSBFMTAwMF9NQU5DX1RDT19SRVNFVCAgICAgMHgwMDAxMDAwMCAvKiBUQ08gUmVzZXQgT2NjdXJyZWQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19SQ1ZfVENPX0VOICAgIDB4MDAwMjAwMDAgLyogUmVjZWl2ZSBUQ08gUGFja2V0cyBFbmFibGVkICovCisjZGVmaW5lIEUxMDAwX01BTkNfUkVQT1JUX1NUQVRVUyAweDAwMDQwMDAwIC8qIFN0YXR1cyBSZXBvcnRpbmcgRW5hYmxlZCAqLworI2RlZmluZSBFMTAwMF9NQU5DX0VOX01BQ19BRERSX0ZJTFRFUiAgIDB4MDAxMDAwMDAgLyogRW5hYmxlIE1BQyBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19FTl9NTkcySE9TVCAgIDB4MDAyMDAwMDAgLyogRW5hYmxlIE1ORyBwYWNrZXRzIHRvIGhvc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbWVtb3J5ICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CX1JFUSAgICAgICAweDAxMDAwMDAwIC8qIFNNQnVzIFJlcXVlc3QgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfR05UICAgICAgIDB4MDIwMDAwMDAgLyogU01CdXMgR3JhbnQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfQ0xLX0lOICAgIDB4MDQwMDAwMDAgLyogU01CdXMgQ2xvY2sgSW4gKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfREFUQV9JTiAgIDB4MDgwMDAwMDAgLyogU01CdXMgRGF0YSBJbiAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9EQVRBX09VVCAgMHgxMDAwMDAwMCAvKiBTTUJ1cyBEYXRhIE91dCAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9DTEtfT1VUICAgMHgyMDAwMDAwMCAvKiBTTUJ1cyBDbG9jayBPdXQgKi8KKworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9EQVRBX09VVF9TSElGVCAgMjggLyogU01CdXMgRGF0YSBPdXQgU2hpZnQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfQ0xLX09VVF9TSElGVCAgIDI5IC8qIFNNQnVzIENsb2NrIE91dCBTaGlmdCAqLworCisvKiBXYWtlIFVwIFBhY2tldCBMZW5ndGggKi8KKyNkZWZpbmUgRTEwMDBfV1VQTF9MRU5HVEhfTUFTSyAweDBGRkYgICAvKiBPbmx5IHRoZSBsb3dlciAxMiBiaXRzIGFyZSB2YWxpZCAqLworCisjZGVmaW5lIEUxMDAwX01EQUxJR04gICAgICAgICAgNDA5NgorCisvKiBFRVBST00gQ29tbWFuZHMgLSBNaWNyb3dpcmUgKi8KKyNkZWZpbmUgRUVQUk9NX1JFQURfT1BDT0RFX01JQ1JPV0lSRSAgMHg2ICAvKiBFRVBST00gcmVhZCBvcGNvZGUgKi8KKyNkZWZpbmUgRUVQUk9NX1dSSVRFX09QQ09ERV9NSUNST1dJUkUgMHg1ICAvKiBFRVBST00gd3JpdGUgb3Bjb2RlICovCisjZGVmaW5lIEVFUFJPTV9FUkFTRV9PUENPREVfTUlDUk9XSVJFIDB4NyAgLyogRUVQUk9NIGVyYXNlIG9wY29kZSAqLworI2RlZmluZSBFRVBST01fRVdFTl9PUENPREVfTUlDUk9XSVJFICAweDEzIC8qIEVFUFJPTSBlcmFzZS93cml0ZSBlbmFibGUgKi8KKyNkZWZpbmUgRUVQUk9NX0VXRFNfT1BDT0RFX01JQ1JPV0lSRSAgMHgxMCAvKiBFRVBST00gZXJhc3Qvd3JpdGUgZGlzYWJsZSAqLworCisvKiBFRVBST00gQ29tbWFuZHMgLSBTUEkgKi8KKyNkZWZpbmUgRUVQUk9NX01BWF9SRVRSWV9TUEkgICAgNTAwMCAvKiBNYXggd2FpdCBvZiA1bXMsIGZvciBSRFkgc2lnbmFsICovCisjZGVmaW5lIEVFUFJPTV9SRUFEX09QQ09ERV9TUEkgIDB4MyAgLyogRUVQUk9NIHJlYWQgb3Bjb2RlICovCisjZGVmaW5lIEVFUFJPTV9XUklURV9PUENPREVfU1BJIDB4MiAgLyogRUVQUk9NIHdyaXRlIG9wY29kZSAqLworI2RlZmluZSBFRVBST01fQThfT1BDT0RFX1NQSSAgICAweDggIC8qIG9wY29kZSBiaXQtMyA9IGFkZHJlc3MgYml0LTggKi8KKyNkZWZpbmUgRUVQUk9NX1dSRU5fT1BDT0RFX1NQSSAgMHg2ICAvKiBFRVBST00gc2V0IFdyaXRlIEVuYWJsZSBsYXRjaCAqLworI2RlZmluZSBFRVBST01fV1JESV9PUENPREVfU1BJICAweDQgIC8qIEVFUFJPTSByZXNldCBXcml0ZSBFbmFibGUgbGF0Y2ggKi8KKyNkZWZpbmUgRUVQUk9NX1JEU1JfT1BDT0RFX1NQSSAgMHg1ICAvKiBFRVBST00gcmVhZCBTdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRUVQUk9NX1dSU1JfT1BDT0RFX1NQSSAgMHgxICAvKiBFRVBST00gd3JpdGUgU3RhdHVzIHJlZ2lzdGVyICovCisKKy8qIEVFUFJPTSBTaXplIGRlZmluaXRpb25zICovCisjZGVmaW5lIEVFUFJPTV9TSVpFXzE2S0IgICAgICAgIDB4MTgwMAorI2RlZmluZSBFRVBST01fU0laRV84S0IgICAgICAgICAweDE0MDAKKyNkZWZpbmUgRUVQUk9NX1NJWkVfNEtCICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEVFUFJPTV9TSVpFXzJLQiAgICAgICAgIDB4MEMwMAorI2RlZmluZSBFRVBST01fU0laRV8xS0IgICAgICAgICAweDA4MDAKKyNkZWZpbmUgRUVQUk9NX1NJWkVfNTEyQiAgICAgICAgMHgwNDAwCisjZGVmaW5lIEVFUFJPTV9TSVpFXzEyOEIgICAgICAgIDB4MDAwMAorI2RlZmluZSBFRVBST01fU0laRV9NQVNLICAgICAgICAweDFDMDAKKworLyogRUVQUk9NIFdvcmQgT2Zmc2V0cyAqLworI2RlZmluZSBFRVBST01fQ09NUEFUICAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgRUVQUk9NX0lEX0xFRF9TRVRUSU5HUyAgICAgICAgMHgwMDA0CisjZGVmaW5lIEVFUFJPTV9TRVJERVNfQU1QTElUVURFICAgICAgIDB4MDAwNiAvKiBGb3IgU0VSREVTIG91dHB1dCBhbXBsaXR1ZGUgYWRqdXN0bWVudC4gKi8KKyNkZWZpbmUgRUVQUk9NX1BIWV9DTEFTU19XT1JEICAgICAgICAgMHgwMDA3CisjZGVmaW5lIEVFUFJPTV9JTklUX0NPTlRST0wxX1JFRyAgICAgIDB4MDAwQQorI2RlZmluZSBFRVBST01fSU5JVF9DT05UUk9MMl9SRUcgICAgICAweDAwMEYKKyNkZWZpbmUgRUVQUk9NX0lOSVRfQ09OVFJPTDNfUE9SVF9CICAgMHgwMDE0CisjZGVmaW5lIEVFUFJPTV9JTklUX0NPTlRST0wzX1BPUlRfQSAgIDB4MDAyNAorI2RlZmluZSBFRVBST01fQ0ZHICAgICAgICAgICAgICAgICAgICAweDAwMTIKKyNkZWZpbmUgRUVQUk9NX0ZMQVNIX1ZFUlNJT04gICAgICAgICAgMHgwMDMyCisjZGVmaW5lIEVFUFJPTV9DSEVDS1NVTV9SRUcgICAgICAgICAgIDB4MDAzRgorCisvKiBXb3JkIGRlZmluaXRpb25zIGZvciBJRCBMRUQgU2V0dGluZ3MgKi8KKyNkZWZpbmUgSURfTEVEX1JFU0VSVkVEXzAwMDAgMHgwMDAwCisjZGVmaW5lIElEX0xFRF9SRVNFUlZFRF9GRkZGIDB4RkZGRgorI2RlZmluZSBJRF9MRURfREVGQVVMVCAgICAgICAoKElEX0xFRF9PRkYxX09OMiA8PCAxMikgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURfTEVEX09GRjFfT0ZGMiA8PCA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRF9MRURfREVGMV9ERUYyIDw8IDQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEX0xFRF9ERUYxX0RFRjIpKQorI2RlZmluZSBJRF9MRURfREVGMV9ERUYyICAgICAweDEKKyNkZWZpbmUgSURfTEVEX0RFRjFfT04yICAgICAgMHgyCisjZGVmaW5lIElEX0xFRF9ERUYxX09GRjIgICAgIDB4MworI2RlZmluZSBJRF9MRURfT04xX0RFRjIgICAgICAweDQKKyNkZWZpbmUgSURfTEVEX09OMV9PTjIgICAgICAgMHg1CisjZGVmaW5lIElEX0xFRF9PTjFfT0ZGMiAgICAgIDB4NgorI2RlZmluZSBJRF9MRURfT0ZGMV9ERUYyICAgICAweDcKKyNkZWZpbmUgSURfTEVEX09GRjFfT04yICAgICAgMHg4CisjZGVmaW5lIElEX0xFRF9PRkYxX09GRjIgICAgIDB4OQorCisjZGVmaW5lIElHUF9BQ1RJVklUWV9MRURfTUFTSyAgIDB4RkZGRkYwRkYKKyNkZWZpbmUgSUdQX0FDVElWSVRZX0xFRF9FTkFCTEUgMHgwMzAwCisjZGVmaW5lIElHUF9MRUQzX01PREUgICAgICAgICAgIDB4MDcwMDAwMDAKKworCisvKiBNYXNrIGJpdHMgZm9yIFNFUkRFUyBhbXBsaXR1ZGUgYWRqdXN0bWVudCBpbiBXb3JkIDYgb2YgdGhlIEVFUFJPTSAqLworI2RlZmluZSBFRVBST01fU0VSREVTX0FNUExJVFVERV9NQVNLICAweDAwMEYKKworLyogTWFzayBiaXQgZm9yIFBIWSBjbGFzcyBpbiBXb3JkIDcgb2YgdGhlIEVFUFJPTSAqLworI2RlZmluZSBFRVBST01fUEhZX0NMQVNTX0EgICAweDgwMDAKKworLyogTWFzayBiaXRzIGZvciBmaWVsZHMgaW4gV29yZCAweDBhIG9mIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgRUVQUk9NX1dPUkQwQV9JTE9TICAgMHgwMDEwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEFfU1dEUElPIDB4MDFFMAorI2RlZmluZSBFRVBST01fV09SRDBBX0xSU1QgICAweDAyMDAKKyNkZWZpbmUgRUVQUk9NX1dPUkQwQV9GRCAgICAgMHgwNDAwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEFfNjZNSFogIDB4MDgwMAorCisvKiBNYXNrIGJpdHMgZm9yIGZpZWxkcyBpbiBXb3JkIDB4MGYgb2YgdGhlIEVFUFJPTSAqLworI2RlZmluZSBFRVBST01fV09SRDBGX1BBVVNFX01BU0sgMHgzMDAwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEZfUEFVU0UgICAgICAweDEwMDAKKyNkZWZpbmUgRUVQUk9NX1dPUkQwRl9BU01fRElSICAgIDB4MjAwMAorI2RlZmluZSBFRVBST01fV09SRDBGX0FORSAgICAgICAgMHgwODAwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEZfU1dQRElPX0VYVCAweDAwRjAKKworLyogRm9yIGNoZWNrc3VtbWluZywgdGhlIHN1bSBvZiBhbGwgd29yZHMgaW4gdGhlIEVFUFJPTSBzaG91bGQgZXF1YWwgMHhCQUJBLiAqLworI2RlZmluZSBFRVBST01fU1VNIDB4QkFCQQorCisvKiBFRVBST00gTWFwIGRlZmluZXMgKFdPUkQgT0ZGU0VUUykqLworI2RlZmluZSBFRVBST01fTk9ERV9BRERSRVNTX0JZVEVfMCAwCisjZGVmaW5lIEVFUFJPTV9QQkFfQllURV8xICAgICAgICAgIDgKKworI2RlZmluZSBFRVBST01fUkVTRVJWRURfV09SRCAgICAgICAgICAweEZGRkYKKworLyogRUVQUk9NIE1hcCBTaXplcyAoQnl0ZSBDb3VudHMpICovCisjZGVmaW5lIFBCQV9TSVpFIDQKKworLyogQ29sbGlzaW9uIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEUxMDAwX0NPTExJU0lPTl9USFJFU0hPTEQgICAgICAgMTUKKyNkZWZpbmUgRTEwMDBfQ1RfU0hJRlQgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEUxMDAwX0NPTExJU0lPTl9ESVNUQU5DRSAgICAgICAgNjQKKyNkZWZpbmUgRTEwMDBfRkRYX0NPTExJU0lPTl9ESVNUQU5DRSAgICBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0UKKyNkZWZpbmUgRTEwMDBfSERYX0NPTExJU0lPTl9ESVNUQU5DRSAgICBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0UKKyNkZWZpbmUgRTEwMDBfQ09MRF9TSElGVCAgICAgICAgICAgICAgICAxMgorCisvKiBOdW1iZXIgb2YgVHJhbnNtaXQgYW5kIFJlY2VpdmUgRGVzY3JpcHRvcnMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggKi8KKyNkZWZpbmUgUkVRX1RYX0RFU0NSSVBUT1JfTVVMVElQTEUgIDgKKyNkZWZpbmUgUkVRX1JYX0RFU0NSSVBUT1JfTVVMVElQTEUgIDgKKworLyogRGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSB0cmFuc21pdCBJUEcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgREVGQVVMVF84MjU0Ml9USVBHX0lQR1QgICAgICAgIDEwCisjZGVmaW5lIERFRkFVTFRfODI1NDNfVElQR19JUEdUX0ZJQkVSICA5CisjZGVmaW5lIERFRkFVTFRfODI1NDNfVElQR19JUEdUX0NPUFBFUiA4CisKKyNkZWZpbmUgRTEwMDBfVElQR19JUEdUX01BU0sgIDB4MDAwMDAzRkYKKyNkZWZpbmUgRTEwMDBfVElQR19JUEdSMV9NQVNLIDB4MDAwRkZDMDAKKyNkZWZpbmUgRTEwMDBfVElQR19JUEdSMl9NQVNLIDB4M0ZGMDAwMDAKKworI2RlZmluZSBERUZBVUxUXzgyNTQyX1RJUEdfSVBHUjEgMgorI2RlZmluZSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHUjEgOAorI2RlZmluZSBFMTAwMF9USVBHX0lQR1IxX1NISUZUICAxMAorCisjZGVmaW5lIERFRkFVTFRfODI1NDJfVElQR19JUEdSMiAxMAorI2RlZmluZSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHUjIgNgorI2RlZmluZSBFMTAwMF9USVBHX0lQR1IyX1NISUZUICAyMAorCisjZGVmaW5lIEUxMDAwX1RYRE1BQ19EUFAgMHgwMDAwMDAwMQorCisvKiBBZGFwdGl2ZSBJRlMgZGVmaW5lcyAqLworI2RlZmluZSBUWF9USFJFU0hPTERfU1RBUlQgICAgIDgKKyNkZWZpbmUgVFhfVEhSRVNIT0xEX0lOQ1JFTUVOVCAxMAorI2RlZmluZSBUWF9USFJFU0hPTERfREVDUkVNRU5UIDEKKyNkZWZpbmUgVFhfVEhSRVNIT0xEX1NUT1AgICAgICAxOTAKKyNkZWZpbmUgVFhfVEhSRVNIT0xEX0RJU0FCTEUgICAwCisjZGVmaW5lIFRYX1RIUkVTSE9MRF9USU1FUl9NUyAgMTAwMDAKKyNkZWZpbmUgTUlOX05VTV9YTUlUUyAgICAgICAgICAxMDAwCisjZGVmaW5lIElGU19NQVggICAgICAgICAgICAgICAgODAKKyNkZWZpbmUgSUZTX1NURVAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBJRlNfTUlOICAgICAgICAgICAgICAgIDQwCisjZGVmaW5lIElGU19SQVRJTyAgICAgICAgICAgICAgNAorCisvKiBQQkEgY29uc3RhbnRzICovCisjZGVmaW5lIEUxMDAwX1BCQV8xNksgMHgwMDEwICAgIC8qIDE2S0IsIGRlZmF1bHQgVFggYWxsb2NhdGlvbiAqLworI2RlZmluZSBFMTAwMF9QQkFfMjJLIDB4MDAxNgorI2RlZmluZSBFMTAwMF9QQkFfMjRLIDB4MDAxOAorI2RlZmluZSBFMTAwMF9QQkFfMzBLIDB4MDAxRQorI2RlZmluZSBFMTAwMF9QQkFfNDBLIDB4MDAyOAorI2RlZmluZSBFMTAwMF9QQkFfNDhLIDB4MDAzMCAgICAvKiA0OEtCLCBkZWZhdWx0IFJYIGFsbG9jYXRpb24gKi8KKworLyogRmxvdyBDb250cm9sIENvbnN0YW50cyAqLworI2RlZmluZSBGTE9XX0NPTlRST0xfQUREUkVTU19MT1cgIDB4MDBDMjgwMDEKKyNkZWZpbmUgRkxPV19DT05UUk9MX0FERFJFU1NfSElHSCAweDAwMDAwMTAwCisjZGVmaW5lIEZMT1dfQ09OVFJPTF9UWVBFICAgICAgICAgMHg4ODA4CisKKy8qIFRoZSBoaXN0b3JpY2FsIGRlZmF1bHRzIGZvciB0aGUgZmxvdyBjb250cm9sIHZhbHVlcyBhcmUgZ2l2ZW4gYmVsb3cuICovCisjZGVmaW5lIEZDX0RFRkFVTFRfSElfVEhSRVNIICAgICAgICAoMHg4MDAwKSAgICAvKiAzMktCICovCisjZGVmaW5lIEZDX0RFRkFVTFRfTE9fVEhSRVNIICAgICAgICAoMHg0MDAwKSAgICAvKiAxNktCICovCisjZGVmaW5lIEZDX0RFRkFVTFRfVFhfVElNRVIgICAgICAgICAoMHgxMDApICAgICAvKiB+MTMwIHVzICovCisKKy8qIFBDSVggQ29uZmlnIHNwYWNlICovCisjZGVmaW5lIFBDSVhfQ09NTUFORF9SRUdJU1RFUiAgICAweEU2CisjZGVmaW5lIFBDSVhfU1RBVFVTX1JFR0lTVEVSX0xPICAweEU4CisjZGVmaW5lIFBDSVhfU1RBVFVTX1JFR0lTVEVSX0hJICAweEVBCisKKyNkZWZpbmUgUENJWF9DT01NQU5EX01NUkJDX01BU0sgICAgICAweDAwMEMKKyNkZWZpbmUgUENJWF9DT01NQU5EX01NUkJDX1NISUZUICAgICAweDIKKyNkZWZpbmUgUENJWF9TVEFUVVNfSElfTU1SQkNfTUFTSyAgICAweDAwNjAKKyNkZWZpbmUgUENJWF9TVEFUVVNfSElfTU1SQkNfU0hJRlQgICAweDUKKyNkZWZpbmUgUENJWF9TVEFUVVNfSElfTU1SQkNfNEsgICAgICAweDMKKyNkZWZpbmUgUENJWF9TVEFUVVNfSElfTU1SQkNfMksgICAgICAweDIKKworCisvKiBOdW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBzaGlmdCByaWdodCB0aGUgInBhdXNlIiBiaXRzIGZyb20gdGhlCisgKiBFRVBST00gKGJpdHMgMTM6MTIpIHRvIHRoZSAicGF1c2UiIChiaXRzIDg6NykgZmllbGQgaW4gdGhlIFRYQ1cgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgUEFVU0VfU0hJRlQgNQorCisvKiBOdW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBzaGlmdCBsZWZ0IHRoZSAiU1dEUElPIiBiaXRzIGZyb20gdGhlCisgKiBFRVBST00gKGJpdHMgODo1KSB0byB0aGUgIlNXRFBJTyIgKGJpdHMgMjU6MjIpIGZpZWxkIGluIHRoZSBDVFJMIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNXRFBJT19TSElGVCAxNworCisvKiBOdW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBzaGlmdCBsZWZ0IHRoZSAiU1dEUElPX0VYVCIgYml0cyBmcm9tIHRoZQorICogRUVQUk9NIHdvcmQgRiAoYml0cyA3OjQpIHRvIHRoZSBiaXRzIDExOjggb2YgVGhlIEV4dGVuZGVkIENUUkwgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU1dEUElPX19FWFRfU0hJRlQgNAorCisvKiBOdW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byBzaGlmdCBsZWZ0IHRoZSAiSUxPUyIgYml0IGZyb20gdGhlIEVFUFJPTQorICogKGJpdCA0KSB0byB0aGUgIklMT1MiIChiaXQgNykgZmllbGQgaW4gdGhlIENUUkwgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgSUxPU19TSElGVCAgMworCisKKyNkZWZpbmUgUkVDRUlWRV9CVUZGRVJfQUxJR05fU0laRSAgKDI1NikKKworLyogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB3ZSB3YWl0IGZvciBhdXRvLW5lZ290aWF0aW9uIHRvIGNvbXBsZXRlICovCisjZGVmaW5lIExJTktfVVBfVElNRU9VVCAgICAgICAgICAgICA1MDAKKworI2RlZmluZSBFMTAwMF9UWF9CVUZGRVJfU0laRSAoKHVpbnQzMl90KTE1MTQpCisKKy8qIFRoZSBjYXJyaWVyIGV4dGVuc2lvbiBzeW1ib2wsIGFzIHJlY2VpdmVkIGJ5IHRoZSBOSUMuICovCisjZGVmaW5lIENBUlJJRVJfRVhURU5TSU9OICAgMHgwRgorCisvKiBUQklfQUNDRVBUIG1hY3JvIGRlZmluaXRpb246CisgKgorICogVGhpcyBtYWNybyByZXF1aXJlczoKKyAqICAgICAgYWRhcHRlciA9IGEgcG9pbnRlciB0byBzdHJ1Y3QgZTEwMDBfaHcKKyAqICAgICAgc3RhdHVzID0gdGhlIDggYml0IHN0YXR1cyBmaWVsZCBvZiB0aGUgUlggZGVzY3JpcHRvciB3aXRoIEVPUCBzZXQKKyAqICAgICAgZXJyb3IgPSB0aGUgOCBiaXQgZXJyb3IgZmllbGQgb2YgdGhlIFJYIGRlc2NyaXB0b3Igd2l0aCBFT1Agc2V0CisgKiAgICAgIGxlbmd0aCA9IHRoZSBzdW0gb2YgYWxsIHRoZSBsZW5ndGggZmllbGRzIG9mIHRoZSBSWCBkZXNjcmlwdG9ycyB0aGF0CisgKiAgICAgICAgICAgICAgIG1ha2UgdXAgdGhlIGN1cnJlbnQgZnJhbWUKKyAqICAgICAgbGFzdF9ieXRlID0gdGhlIGxhc3QgYnl0ZSBvZiB0aGUgZnJhbWUgRE1BZWQgYnkgdGhlIGhhcmR3YXJlCisgKiAgICAgIG1heF9mcmFtZV9sZW5ndGggPSB0aGUgbWF4aW11bSBmcmFtZSBsZW5ndGggd2Ugd2FudCB0byBhY2NlcHQuCisgKiAgICAgIG1pbl9mcmFtZV9sZW5ndGggPSB0aGUgbWluaW11bSBmcmFtZSBsZW5ndGggd2Ugd2FudCB0byBhY2NlcHQuCisgKgorICogVGhpcyBtYWNybyBpcyBhIGNvbmRpdGlvbmFsIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIGludGVycnVwdAorICogaGFuZGxlcidzIFJ4IHByb2Nlc3Npbmcgcm91dGluZSB3aGVuIFJ4RXJyb3JzIGhhdmUgYmVlbiBkZXRlY3RlZC4KKyAqCisgKiBUeXBpY2FsIHVzZToKKyAqICAuLi4KKyAqICBpZiAoVEJJX0FDQ0VQVCkgeworICogICAgICBhY2NlcHRfZnJhbWUgPSBUUlVFOworICogICAgICBlMTAwMF90YmlfYWRqdXN0X3N0YXRzKGFkYXB0ZXIsIE1hY0FkZHJlc3MpOworICogICAgICBmcmFtZV9sZW5ndGgtLTsKKyAqICB9IGVsc2UgeworICogICAgICBhY2NlcHRfZnJhbWUgPSBGQUxTRTsKKyAqICB9CisgKiAgLi4uCisgKi8KKworI2RlZmluZSBUQklfQUNDRVBUKGFkYXB0ZXIsIHN0YXR1cywgZXJyb3JzLCBsZW5ndGgsIGxhc3RfYnl0ZSkgXAorICAgICgoYWRhcHRlciktPnRiaV9jb21wYXRpYmlsaXR5X29uICYmIFwKKyAgICAgKCgoZXJyb3JzKSAmIEUxMDAwX1JYRF9FUlJfRlJBTUVfRVJSX01BU0spID09IEUxMDAwX1JYRF9FUlJfQ0UpICYmIFwKKyAgICAgKChsYXN0X2J5dGUpID09IENBUlJJRVJfRVhURU5TSU9OKSAmJiBcCisgICAgICgoKHN0YXR1cykgJiBFMTAwMF9SWERfU1RBVF9WUCkgPyBcCisgICAgICAgICAgKCgobGVuZ3RoKSA+ICgoYWRhcHRlciktPm1pbl9mcmFtZV9zaXplIC0gVkxBTl9UQUdfU0laRSkpICYmIFwKKyAgICAgICAgICAgKChsZW5ndGgpIDw9ICgoYWRhcHRlciktPm1heF9mcmFtZV9zaXplICsgMSkpKSA6IFwKKyAgICAgICAgICAoKChsZW5ndGgpID4gKGFkYXB0ZXIpLT5taW5fZnJhbWVfc2l6ZSkgJiYgXAorICAgICAgICAgICAoKGxlbmd0aCkgPD0gKChhZGFwdGVyKS0+bWF4X2ZyYW1lX3NpemUgKyBWTEFOX1RBR19TSVpFICsgMSkpKSkpCisKKworLyogU3RydWN0dXJlcywgZW51bXMsIGFuZCBtYWNyb3MgZm9yIHRoZSBQSFkgKi8KKworLyogQml0IGRlZmluaXRpb25zIGZvciB0aGUgTWFuYWdlbWVudCBEYXRhIElPIChNRElPKSBhbmQgTWFuYWdlbWVudCBEYXRhCisgKiBDbG9jayAoTURDKSBwaW5zIGluIHRoZSBEZXZpY2UgQ29udHJvbCBSZWdpc3Rlci4KKyAqLworI2RlZmluZSBFMTAwMF9DVFJMX1BIWV9SRVNFVF9ESVIgIEUxMDAwX0NUUkxfU1dEUElPMAorI2RlZmluZSBFMTAwMF9DVFJMX1BIWV9SRVNFVCAgICAgIEUxMDAwX0NUUkxfU1dEUElOMAorI2RlZmluZSBFMTAwMF9DVFJMX01ESU9fRElSICAgICAgIEUxMDAwX0NUUkxfU1dEUElPMgorI2RlZmluZSBFMTAwMF9DVFJMX01ESU8gICAgICAgICAgIEUxMDAwX0NUUkxfU1dEUElOMgorI2RlZmluZSBFMTAwMF9DVFJMX01EQ19ESVIgICAgICAgIEUxMDAwX0NUUkxfU1dEUElPMworI2RlZmluZSBFMTAwMF9DVFJMX01EQyAgICAgICAgICAgIEUxMDAwX0NUUkxfU1dEUElOMworI2RlZmluZSBFMTAwMF9DVFJMX1BIWV9SRVNFVF9ESVI0IEUxMDAwX0NUUkxfRVhUX1NEUDRfRElSCisjZGVmaW5lIEUxMDAwX0NUUkxfUEhZX1JFU0VUNCAgICAgRTEwMDBfQ1RSTF9FWFRfU0RQNF9EQVRBCisKKy8qIFBIWSAxMDAwIE1JSSBSZWdpc3Rlci9CaXQgRGVmaW5pdGlvbnMgKi8KKy8qIFBIWSBSZWdpc3RlcnMgZGVmaW5lZCBieSBJRUVFICovCisjZGVmaW5lIFBIWV9DVFJMICAgICAgICAgMHgwMCAvKiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9TVEFUVVMgICAgICAgMHgwMSAvKiBTdGF0dXMgUmVnaXNlciAqLworI2RlZmluZSBQSFlfSUQxICAgICAgICAgIDB4MDIgLyogUGh5IElkIFJlZyAod29yZCAxKSAqLworI2RlZmluZSBQSFlfSUQyICAgICAgICAgIDB4MDMgLyogUGh5IElkIFJlZyAod29yZCAyKSAqLworI2RlZmluZSBQSFlfQVVUT05FR19BRFYgIDB4MDQgLyogQXV0b25lZyBBZHZlcnRpc2VtZW50ICovCisjZGVmaW5lIFBIWV9MUF9BQklMSVRZICAgMHgwNSAvKiBMaW5rIFBhcnRuZXIgQWJpbGl0eSAoQmFzZSBQYWdlKSAqLworI2RlZmluZSBQSFlfQVVUT05FR19FWFAgIDB4MDYgLyogQXV0b25lZyBFeHBhbnNpb24gUmVnICovCisjZGVmaW5lIFBIWV9ORVhUX1BBR0VfVFggMHgwNyAvKiBOZXh0IFBhZ2UgVFggKi8KKyNkZWZpbmUgUEhZX0xQX05FWFRfUEFHRSAweDA4IC8qIExpbmsgUGFydG5lciBOZXh0IFBhZ2UgKi8KKyNkZWZpbmUgUEhZXzEwMDBUX0NUUkwgICAweDA5IC8qIDEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgUEhZXzEwMDBUX1NUQVRVUyAweDBBIC8qIDEwMDBCYXNlLVQgU3RhdHVzIFJlZyAqLworI2RlZmluZSBQSFlfRVhUX1NUQVRVUyAgIDB4MEYgLyogRXh0ZW5kZWQgU3RhdHVzIFJlZyAqLworCisjZGVmaW5lIE1BWF9QSFlfUkVHX0FERFJFU1MgICAgICAgIDB4MUYgIC8qIDUgYml0IGFkZHJlc3MgYnVzICgwLTB4MUYpICovCisjZGVmaW5lIE1BWF9QSFlfTVVMVElfUEFHRV9SRUcgICAgIDB4RiAgIC8qIFJlZ2lzdGVycyBlcXVhbCBvbiBhbGwgcGFnZXMgKi8KKworLyogTTg4RTEwMDAgU3BlY2lmaWMgUmVnaXN0ZXJzICovCisjZGVmaW5lIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwgICAgIDB4MTAgIC8qIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE04OEUxMDAwX1BIWV9TUEVDX1NUQVRVUyAgIDB4MTEgIC8qIFBIWSBTcGVjaWZpYyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfSU5UX0VOQUJMRSAgICAgICAgMHgxMiAgLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9JTlRfU1RBVFVTICAgICAgICAweDEzICAvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMIDB4MTQgIC8qIEV4dGVuZGVkIFBIWSBTcGVjaWZpYyBDb250cm9sICovCisjZGVmaW5lIE04OEUxMDAwX1JYX0VSUl9DTlRSICAgICAgIDB4MTUgIC8qIFJlY2VpdmUgRXJyb3IgQ291bnRlciAqLworCisjZGVmaW5lIE04OEUxMDAwX1BIWV9FWFRfQ1RSTCAgICAgIDB4MUEgIC8qIFBIWSBleHRlbmQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QgICAweDFEICAvKiBSZWcgMjkgZm9yIHBhZ2UgbnVtYmVyIHNldHRpbmcgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MICAgMHgxRSAgLyogSXRzIG1lYW5pbmcgZGVwZW5kcyBvbiByZWcgMjkgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUEhZX1ZDT19SRUdfQklUOCAgMHgxMDAgLyogQml0cyA4ICYgMTEgYXJlIGFkanVzdGVkIGZvciAqLworI2RlZmluZSBNODhFMTAwMF9QSFlfVkNPX1JFR19CSVQxMSAweDgwMCAgICAvKiBpbXByb3ZlZCBCRVIgcGVyZm9ybWFuY2UgKi8KKworI2RlZmluZSBJR1AwMUUxMDAwX0lFRUVfUkVHU19QQUdFICAweDAwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9JRUVFX1JFU1RBUlRfQVVUT05FRyAweDMzMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9JRUVFX0ZPUkNFX0dJR0EgICAgICAweDAxNDAKKworLyogSUdQMDFFMTAwMCBTcGVjaWZpYyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcgMHgxMCAvKiBQSFkgU3BlY2lmaWMgUG9ydCBDb25maWcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfUE9SVF9TVEFUVVMgMHgxMSAvKiBQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BPUlRfQ1RSTCAgIDB4MTIgLyogUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfTElOS19IRUFMVEggMHgxMyAvKiBQSFkgTGluayBIZWFsdGggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9HTUlJX0ZJRk8gICAgICAgMHgxNCAvKiBHTUlJIEZJRk8gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9RVUFMSVRZIDB4MTUgLyogUEhZIENoYW5uZWwgUXVhbGl0eSBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCAgICAgMHgxRiAvKiBQSFkgUGFnZSBTZWxlY3QgQ29yZSBSZWdpc3RlciAqLworCisvKiBJR1AwMUUxMDAwIEFHQyBSZWdpc3RlcnMgLSBzdG9yZXMgdGhlIGNhYmxlIGxlbmd0aCB2YWx1ZXMqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BR0NfQSAgICAgICAgMHgxMTcyCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19CICAgICAgICAweDEyNzIKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX0MgICAgICAgIDB4MTQ3MgorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BR0NfRCAgICAgICAgMHgxODcyCisKKy8qIElHUDAxRTEwMDAgRFNQIFJlc2V0IFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0RTUF9SRVNFVCAgIDB4MUYzMworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9EU1BfU0VUICAgICAweDFGNzEKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfRFNQX0ZGRSAgICAgMHgxRjM1CisKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU0gICAgNAorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BR0NfUEFSQU1fQSAgICAweDExNzEKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX1BBUkFNX0IgICAgMHgxMjcxCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9DICAgIDB4MTQ3MQorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BR0NfUEFSQU1fRCAgICAweDE4NzEKKworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9FREFDX01VX0lOREVYICAgICAgICAweEMwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfRURBQ19TSUdOX0VYVF85X0JJVFMgMHg4MDAwCisKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQU5BTE9HX1RYX1NUQVRFICAgICAgMHgyODkwCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FOQUxPR19DTEFTU19BICAgICAgIDB4MjAwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9GT1JDRV9BTkFMT0dfRU5BQkxFICAweDAwMDQKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfRFNQX0ZGRV9DTV9DUCAgICAgICAgMHgwMDY5CisKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfRFNQX0ZGRV9ERUZBVUxUICAgICAgMHgwMDJBCisvKiBJR1AwMUUxMDAwIFBDUyBJbml0aWFsaXphdGlvbiByZWdpc3RlciAtIHN0b3JlcyB0aGUgcG9sYXJpdHkgc3RhdHVzIHdoZW4KKyAqIHNwZWVkID0gMTAwMCBNYnBzLiAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9QQ1NfSU5JVF9SRUcgIDB4MDBCNAorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9QQ1NfQ1RSTF9SRUcgIDB4MDBCNQorCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX1JFR1NfUEFHRSAgMHgyMEMwCisKKworLyogUEhZIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0NSX1NQRUVEX1NFTEVDVF9NU0IgMHgwMDQwICAvKiBiaXRzIDYsMTM6IDEwPTEwMDAsIDAxPTEwMCwgMDA9MTAgKi8KKyNkZWZpbmUgTUlJX0NSX0NPTExfVEVTVF9FTkFCTEUgMHgwMDgwICAvKiBDb2xsaXNpb24gdGVzdCBlbmFibGUgKi8KKyNkZWZpbmUgTUlJX0NSX0ZVTExfRFVQTEVYICAgICAgMHgwMTAwICAvKiBGRFggPTEsIGhhbGYgZHVwbGV4ID0wICovCisjZGVmaW5lIE1JSV9DUl9SRVNUQVJUX0FVVE9fTkVHIDB4MDIwMCAgLyogUmVzdGFydCBhdXRvIG5lZ290aWF0aW9uICovCisjZGVmaW5lIE1JSV9DUl9JU09MQVRFICAgICAgICAgIDB4MDQwMCAgLyogSXNvbGF0ZSBQSFkgZnJvbSBNSUkgKi8KKyNkZWZpbmUgTUlJX0NSX1BPV0VSX0RPV04gICAgICAgMHgwODAwICAvKiBQb3dlciBkb3duICovCisjZGVmaW5lIE1JSV9DUl9BVVRPX05FR19FTiAgICAgIDB4MTAwMCAgLyogQXV0byBOZWcgRW5hYmxlICovCisjZGVmaW5lIE1JSV9DUl9TUEVFRF9TRUxFQ1RfTFNCIDB4MjAwMCAgLyogYml0cyA2LDEzOiAxMD0xMDAwLCAwMT0xMDAsIDAwPTEwICovCisjZGVmaW5lIE1JSV9DUl9MT09QQkFDSyAgICAgICAgIDB4NDAwMCAgLyogMCA9IG5vcm1hbCwgMSA9IGxvb3BiYWNrICovCisjZGVmaW5lIE1JSV9DUl9SRVNFVCAgICAgICAgICAgIDB4ODAwMCAgLyogMCA9IG5vcm1hbCwgMSA9IFBIWSByZXNldCAqLworCisvKiBQSFkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9TUl9FWFRFTkRFRF9DQVBTICAgICAweDAwMDEgLyogRXh0ZW5kZWQgcmVnaXN0ZXIgY2FwYWJpbGl0aWVzICovCisjZGVmaW5lIE1JSV9TUl9KQUJCRVJfREVURUNUICAgICAweDAwMDIgLyogSmFiYmVyIERldGVjdGVkICovCisjZGVmaW5lIE1JSV9TUl9MSU5LX1NUQVRVUyAgICAgICAweDAwMDQgLyogTGluayBTdGF0dXMgMSA9IGxpbmsgKi8KKyNkZWZpbmUgTUlJX1NSX0FVVE9ORUdfQ0FQUyAgICAgIDB4MDAwOCAvKiBBdXRvIE5lZyBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl9SRU1PVEVfRkFVTFQgICAgICAweDAwMTAgLyogUmVtb3RlIEZhdWx0IERldGVjdCAqLworI2RlZmluZSBNSUlfU1JfQVVUT05FR19DT01QTEVURSAgMHgwMDIwIC8qIEF1dG8gTmVnIENvbXBsZXRlICovCisjZGVmaW5lIE1JSV9TUl9QUkVBTUJMRV9TVVBQUkVTUyAweDAwNDAgLyogUHJlYW1ibGUgbWF5IGJlIHN1cHByZXNzZWQgKi8KKyNkZWZpbmUgTUlJX1NSX0VYVEVOREVEX1NUQVRVUyAgIDB4MDEwMCAvKiBFeHQuIHN0YXR1cyBpbmZvIGluIFJlZyAweDBGICovCisjZGVmaW5lIE1JSV9TUl8xMDBUMl9IRF9DQVBTICAgICAweDAyMDAgLyogMTAwVDIgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTAwVDJfRkRfQ0FQUyAgICAgMHgwNDAwIC8qIDEwMFQyIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwVF9IRF9DQVBTICAgICAgIDB4MDgwMCAvKiAxMFQgICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMFRfRkRfQ0FQUyAgICAgICAweDEwMDAgLyogMTBUICAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTAwWF9IRF9DQVBTICAgICAgMHgyMDAwIC8qIDEwMFggIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwMFhfRkRfQ0FQUyAgICAgIDB4NDAwMCAvKiAxMDBYICBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMDBUNF9DQVBTICAgICAgICAweDgwMDAgLyogMTAwVDQgQ2FwYWJsZSAqLworCisvKiBBdXRvbmVnIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTldBWV9BUl9TRUxFQ1RPUl9GSUVMRCAweDAwMDEgICAvKiBpbmRpY2F0ZXMgSUVFRSA4MDIuMyBDU01BL0NEICovCisjZGVmaW5lIE5XQVlfQVJfMTBUX0hEX0NBUFMgICAgMHgwMDIwICAgLyogMTBUICAgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0FSXzEwVF9GRF9DQVBTICAgIDB4MDA0MCAgIC8qIDEwVCAgIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9BUl8xMDBUWF9IRF9DQVBTICAweDAwODAgICAvKiAxMDBUWCBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfQVJfMTAwVFhfRkRfQ0FQUyAgMHgwMTAwICAgLyogMTAwVFggRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0FSXzEwMFQ0X0NBUFMgICAgIDB4MDIwMCAgIC8qIDEwMFQ0IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9BUl9QQVVTRSAgICAgICAgICAweDA0MDAgICAvKiBQYXVzZSBvcGVyYXRpb24gZGVzaXJlZCAqLworI2RlZmluZSBOV0FZX0FSX0FTTV9ESVIgICAgICAgIDB4MDgwMCAgIC8qIEFzeW1tZXRyaWMgUGF1c2UgRGlyZWN0aW9uIGJpdCAqLworI2RlZmluZSBOV0FZX0FSX1JFTU9URV9GQVVMVCAgIDB4MjAwMCAgIC8qIFJlbW90ZSBGYXVsdCBkZXRlY3RlZCAqLworI2RlZmluZSBOV0FZX0FSX05FWFRfUEFHRSAgICAgIDB4ODAwMCAgIC8qIE5leHQgUGFnZSBhYmlsaXR5IHN1cHBvcnRlZCAqLworCisvKiBMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWdpc3RlciAoQmFzZSBQYWdlKSAqLworI2RlZmluZSBOV0FZX0xQQVJfU0VMRUNUT1JfRklFTEQgMHgwMDAwIC8qIExQIHByb3RvY29sIHNlbGVjdG9yIGZpZWxkICovCisjZGVmaW5lIE5XQVlfTFBBUl8xMFRfSERfQ0FQUyAgICAweDAwMjAgLyogTFAgaXMgMTBUICAgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0xQQVJfMTBUX0ZEX0NBUFMgICAgMHgwMDQwIC8qIExQIGlzIDEwVCAgIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9MUEFSXzEwMFRYX0hEX0NBUFMgIDB4MDA4MCAvKiBMUCBpcyAxMDBUWCBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfTFBBUl8xMDBUWF9GRF9DQVBTICAweDAxMDAgLyogTFAgaXMgMTAwVFggRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0xQQVJfMTAwVDRfQ0FQUyAgICAgMHgwMjAwIC8qIExQIGlzIDEwMFQ0IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9MUEFSX1BBVVNFICAgICAgICAgIDB4MDQwMCAvKiBMUCBQYXVzZSBvcGVyYXRpb24gZGVzaXJlZCAqLworI2RlZmluZSBOV0FZX0xQQVJfQVNNX0RJUiAgICAgICAgMHgwODAwIC8qIExQIEFzeW1tZXRyaWMgUGF1c2UgRGlyZWN0aW9uIGJpdCAqLworI2RlZmluZSBOV0FZX0xQQVJfUkVNT1RFX0ZBVUxUICAgMHgyMDAwIC8qIExQIGhhcyBkZXRlY3RlZCBSZW1vdGUgRmF1bHQgKi8KKyNkZWZpbmUgTldBWV9MUEFSX0FDS05PV0xFREdFICAgIDB4NDAwMCAvKiBMUCBoYXMgcngnZCBsaW5rIGNvZGUgd29yZCAqLworI2RlZmluZSBOV0FZX0xQQVJfTkVYVF9QQUdFICAgICAgMHg4MDAwIC8qIE5leHQgUGFnZSBhYmlsaXR5IHN1cHBvcnRlZCAqLworCisvKiBBdXRvbmVnIEV4cGFuc2lvbiBSZWdpc3RlciAqLworI2RlZmluZSBOV0FZX0VSX0xQX05XQVlfQ0FQUyAgICAgIDB4MDAwMSAvKiBMUCBoYXMgQXV0byBOZWcgQ2FwYWJpbGl0eSAqLworI2RlZmluZSBOV0FZX0VSX1BBR0VfUlhEICAgICAgICAgIDB4MDAwMiAvKiBMUCBpcyAxMFQgICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfRVJfTkVYVF9QQUdFX0NBUFMgICAgMHgwMDA0IC8qIExQIGlzIDEwVCAgIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9FUl9MUF9ORVhUX1BBR0VfQ0FQUyAweDAwMDggLyogTFAgaXMgMTAwVFggSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0VSX1BBUl9ERVRFQ1RfRkFVTFQgIDB4MDAxMCAvKiBMUCBpcyAxMDBUWCBGdWxsIER1cGxleCBDYXBhYmxlICovCisKKy8qIE5leHQgUGFnZSBUWCBSZWdpc3RlciAqLworI2RlZmluZSBOUFRYX01TR19DT0RFX0ZJRUxEIDB4MDAwMSAvKiBOUCBtc2cgY29kZSBvciB1bmZvcm1hdHRlZCBkYXRhICovCisjZGVmaW5lIE5QVFhfVE9HR0xFICAgICAgICAgMHgwODAwIC8qIFRvZ2dsZXMgYmV0d2VlbiBleGNoYW5nZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgZGlmZmVyZW50IE5QCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOUFRYX0FDS05PV0xER0UyICAgIDB4MTAwMCAvKiAxID0gd2lsbCBjb21wbHkgd2l0aCBtc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMCA9IGNhbm5vdCBjb21wbHkgd2l0aCBtc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5QVFhfTVNHX1BBR0UgICAgICAgMHgyMDAwIC8qIGZvcm1hdHRlZCgxKS91bmZvcm1hdHRlZCgwKSBwZyAqLworI2RlZmluZSBOUFRYX05FWFRfUEFHRSAgICAgIDB4ODAwMCAvKiAxID0gYWRkaXRpb24gTlAgd2lsbCBmb2xsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMCA9IHNlbmRpbmcgbGFzdCBOUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogTGluayBQYXJ0bmVyIE5leHQgUGFnZSBSZWdpc3RlciAqLworI2RlZmluZSBMUF9STlBSX01TR19DT0RFX0ZJRUxEIDB4MDAwMSAvKiBOUCBtc2cgY29kZSBvciB1bmZvcm1hdHRlZCBkYXRhICovCisjZGVmaW5lIExQX1JOUFJfVE9HR0xFICAgICAgICAgMHgwODAwIC8qIFRvZ2dsZXMgYmV0d2VlbiBleGNoYW5nZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgZGlmZmVyZW50IE5QCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMUF9STlBSX0FDS05PV0xER0UyICAgIDB4MTAwMCAvKiAxID0gd2lsbCBjb21wbHkgd2l0aCBtc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMCA9IGNhbm5vdCBjb21wbHkgd2l0aCBtc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExQX1JOUFJfTVNHX1BBR0UgICAgICAgMHgyMDAwICAvKiBmb3JtYXR0ZWQoMSkvdW5mb3JtYXR0ZWQoMCkgcGcgKi8KKyNkZWZpbmUgTFBfUk5QUl9BQ0tOT1dMREdFICAgICAweDQwMDAgIC8qIDEgPSBBQ0sgLyAwID0gTk8gQUNLICovCisjZGVmaW5lIExQX1JOUFJfTkVYVF9QQUdFICAgICAgMHg4MDAwICAvKiAxID0gYWRkaXRpb24gTlAgd2lsbCBmb2xsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAgPSBzZW5kaW5nIGxhc3QgTlAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiAxMDAwQkFTRS1UIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfQVNZTV9QQVVTRSAgICAgIDB4MDA4MCAvKiBBZHZlcnRpc2UgYXN5bW1ldHJpYyBwYXVzZSBiaXQgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfSERfQ0FQUyAgICAgICAgIDB4MDEwMCAvKiBBZHZlcnRpc2UgMTAwMFQgSEQgY2FwYWJpbGl0eSAqLworI2RlZmluZSBDUl8xMDAwVF9GRF9DQVBTICAgICAgICAgMHgwMjAwIC8qIEFkdmVydGlzZSAxMDAwVCBGRCBjYXBhYmlsaXR5ICAqLworI2RlZmluZSBDUl8xMDAwVF9SRVBFQVRFUl9EVEUgICAgMHgwNDAwIC8qIDE9UmVwZWF0ZXIvc3dpdGNoIGRldmljZSBwb3J0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMD1EVEUgZGV2aWNlICovCisjZGVmaW5lIENSXzEwMDBUX01TX1ZBTFVFICAgICAgICAweDA4MDAgLyogMT1Db25maWd1cmUgUEhZIGFzIE1hc3RlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA9Q29uZmlndXJlIFBIWSBhcyBTbGF2ZSAqLworI2RlZmluZSBDUl8xMDAwVF9NU19FTkFCTEUgICAgICAgMHgxMDAwIC8qIDE9TWFzdGVyL1NsYXZlIG1hbnVhbCBjb25maWcgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwPUF1dG9tYXRpYyBNYXN0ZXIvU2xhdmUgY29uZmlnICovCisjZGVmaW5lIENSXzEwMDBUX1RFU1RfTU9ERV9OT1JNQUwgMHgwMDAwIC8qIE5vcm1hbCBPcGVyYXRpb24gKi8KKyNkZWZpbmUgQ1JfMTAwMFRfVEVTVF9NT0RFXzEgICAgIDB4MjAwMCAvKiBUcmFuc21pdCBXYXZlZm9ybSB0ZXN0ICovCisjZGVmaW5lIENSXzEwMDBUX1RFU1RfTU9ERV8yICAgICAweDQwMDAgLyogTWFzdGVyIFRyYW5zbWl0IEppdHRlciB0ZXN0ICovCisjZGVmaW5lIENSXzEwMDBUX1RFU1RfTU9ERV8zICAgICAweDYwMDAgLyogU2xhdmUgVHJhbnNtaXQgSml0dGVyIHRlc3QgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfVEVTVF9NT0RFXzQgICAgIDB4ODAwMCAvKiBUcmFuc21pdHRlciBEaXN0b3J0aW9uIHRlc3QgKi8KKworLyogMTAwMEJBU0UtVCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1JfMTAwMFRfSURMRV9FUlJPUl9DTlQgICAweDAwRkYgLyogTnVtIGlkbGUgZXJyb3JzIHNpbmNlIGxhc3QgcmVhZCAqLworI2RlZmluZSBTUl8xMDAwVF9BU1lNX1BBVVNFX0RJUiAgIDB4MDEwMCAvKiBMUCBhc3ltbWV0cmljIHBhdXNlIGRpcmVjdGlvbiBiaXQgKi8KKyNkZWZpbmUgU1JfMTAwMFRfTFBfSERfQ0FQUyAgICAgICAweDA0MDAgLyogTFAgaXMgMTAwMFQgSEQgY2FwYWJsZSAqLworI2RlZmluZSBTUl8xMDAwVF9MUF9GRF9DQVBTICAgICAgIDB4MDgwMCAvKiBMUCBpcyAxMDAwVCBGRCBjYXBhYmxlICovCisjZGVmaW5lIFNSXzEwMDBUX1JFTU9URV9SWF9TVEFUVVMgMHgxMDAwIC8qIFJlbW90ZSByZWNlaXZlciBPSyAqLworI2RlZmluZSBTUl8xMDAwVF9MT0NBTF9SWF9TVEFUVVMgIDB4MjAwMCAvKiBMb2NhbCByZWNlaXZlciBPSyAqLworI2RlZmluZSBTUl8xMDAwVF9NU19DT05GSUdfUkVTICAgIDB4NDAwMCAvKiAxPUxvY2FsIFRYIGlzIE1hc3RlciwgMD1TbGF2ZSAqLworI2RlZmluZSBTUl8xMDAwVF9NU19DT05GSUdfRkFVTFQgIDB4ODAwMCAvKiBNYXN0ZXIvU2xhdmUgY29uZmlnIGZhdWx0ICovCisjZGVmaW5lIFNSXzEwMDBUX1JFTU9URV9SWF9TVEFUVVNfU0hJRlQgICAgICAgICAgMTIKKyNkZWZpbmUgU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTX1NISUZUICAgICAgICAgICAxMworI2RlZmluZSBTUl8xMDAwVF9QSFlfRVhDRVNTSVZFX0lETEVfRVJSX0NPVU5UICAgIDUKKyNkZWZpbmUgRkZFX0lETEVfRVJSX0NPVU5UX1RJTUVPVVRfMjAgICAgICAgICAgICAyMAorI2RlZmluZSBGRkVfSURMRV9FUlJfQ09VTlRfVElNRU9VVF8xMDAgICAgICAgICAgIDEwMAorCisvKiBFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUVFRV9FU1JfMTAwMFRfSERfQ0FQUyAweDEwMDAgLyogMTAwMFQgSEQgY2FwYWJsZSAqLworI2RlZmluZSBJRUVFX0VTUl8xMDAwVF9GRF9DQVBTIDB4MjAwMCAvKiAxMDAwVCBGRCBjYXBhYmxlICovCisjZGVmaW5lIElFRUVfRVNSXzEwMDBYX0hEX0NBUFMgMHg0MDAwIC8qIDEwMDBYIEhEIGNhcGFibGUgKi8KKyNkZWZpbmUgSUVFRV9FU1JfMTAwMFhfRkRfQ0FQUyAweDgwMDAgLyogMTAwMFggRkQgY2FwYWJsZSAqLworCisjZGVmaW5lIFBIWV9UWF9QT0xBUklUWV9NQVNLICAgMHgwMTAwIC8qIHJlZ2lzdGVyIDEwaCBiaXQgOCAocG9sYXJpdHkgYml0KSAqLworI2RlZmluZSBQSFlfVFhfTk9STUFMX1BPTEFSSVRZIDAgICAgICAvKiByZWdpc3RlciAxMGggYml0IDggKG5vcm1hbCBwb2xhcml0eSkgKi8KKworI2RlZmluZSBBVVRPX1BPTEFSSVRZX0RJU0FCTEUgIDB4MDAxMCAvKiByZWdpc3RlciAxMWggYml0IDQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKDA9ZW5hYmxlLCAxPWRpc2FibGUpICovCisKKy8qIE04OEUxMDAwIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfSkFCQkVSX0RJU0FCTEUgICAgMHgwMDAxIC8qIDE9SmFiYmVyIEZ1bmN0aW9uIGRpc2FibGVkICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUwgMHgwMDAyIC8qIDE9UG9sYXJpdHkgUmV2ZXJzYWwgZW5hYmxlZCAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX1NRRV9URVNUICAgICAgICAgIDB4MDAwNCAvKiAxPVNRRSBUZXN0IGVuYWJsZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9DTEsxMjVfRElTQUJMRSAgICAweDAwMTAgLyogMT1DTEsxMjUgbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwPUNMSzEyNSB0b2dnbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9NRElfTUFOVUFMX01PREUgIDB4MDAwMCAgLyogTURJIENyb3Nzb3ZlciBNb2RlIGJpdHMgNjo1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hbnVhbCBNREkgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX01ESVhfTUFOVUFMX01PREUgMHgwMDIwICAvKiBNYW51YWwgTURJWCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfQVVUT19YXzEwMDBUICAgICAweDAwNDAgIC8qIDEwMDBCQVNFLVQ6IEF1dG8gY3Jvc3NvdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgMTAwQkFTRS1UWC8xMEJBU0UtVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIE1ESSBNb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFICAgICAgMHgwMDYwICAvKiBBdXRvIGNyb3Nzb3ZlciBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFsbCBzcGVlZHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSXzEwQlRfRVhUX0RJU1RfRU5BQkxFIDB4MDA4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE9RW5hYmxlIEV4dGVuZGVkIDEwQkFTRS1UIGRpc3RhbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKExvd2VyIDEwQkFTRS1UIFJYIFRocmVzaG9sZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwPU5vcm1hbCAxMEJBU0UtVCBSWCBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9NSUlfNUJJVF9FTkFCTEUgICAgICAweDAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxPTUtQml0IGludGVyZmFjZSBpbiAxMDBCQVNFLVRYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMD1NSUkgaW50ZXJmYWNlIGluIDEwMEJBU0UtVFggKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9TQ1JBTUJMRVJfRElTQUJMRSAgICAweDAyMDAgLyogMT1TY3JhbWJsZXIgZGlzYWJsZSAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX0ZPUkNFX0xJTktfR09PRCAgICAgIDB4MDQwMCAvKiAxPUZvcmNlIGxpbmsgZ29vZCAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX0FTU0VSVF9DUlNfT05fVFggICAgIDB4MDgwMCAvKiAxPUFzc2VydCBDUlMgb24gVHJhbnNtaXQgKi8KKworI2RlZmluZSBNODhFMTAwMF9QU0NSX1BPTEFSSVRZX1JFVkVSU0FMX1NISUZUICAgIDEKKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9BVVRPX1hfTU9ERV9TSElGVCAgICAgICAgICA1CisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfMTBCVF9FWFRfRElTVF9FTkFCTEVfU0hJRlQgNworCisvKiBNODhFMTAwMCBQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfSkFCQkVSICAgICAgICAgICAgIDB4MDAwMSAvKiAxPUphYmJlciAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX1JFVl9QT0xBUklUWSAgICAgICAweDAwMDIgLyogMT1Qb2xhcml0eSByZXZlcnNlZCAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX0RPV05TSElGVCAgICAgICAgICAweDAwMjAgLyogMT1Eb3duc2hpZnRlZCAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX01ESVggICAgICAgICAgICAgICAweDAwNDAgLyogMT1NRElYOyAwPU1ESSAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSCAgICAgICAweDAzODAgLyogMD08NTBNOzE9NTAtODBNOzI9ODAtMTEwTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAzPTExMC0xNDBNOzQ9PjE0ME0gKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9MSU5LICAgICAgICAgICAgICAgMHgwNDAwIC8qIDE9TGluayB1cCwgMD1MaW5rIGRvd24gKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9TUERfRFBMWF9SRVNPTFZFRCAgMHgwODAwIC8qIDE9U3BlZWQgJiBEdXBsZXggcmVzb2x2ZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9QQUdFX1JDVkQgICAgICAgICAgMHgxMDAwIC8qIDE9UGFnZSByZWNlaXZlZCAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX0RQTFggICAgICAgICAgICAgICAweDIwMDAgLyogMT1EdXBsZXggMD1IYWxmIER1cGxleCAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX1NQRUVEICAgICAgICAgICAgICAweEMwMDAgLyogU3BlZWQsIGJpdHMgMTQ6MTUgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl8xME1CUyAgICAgICAgICAgICAgMHgwMDAwIC8qIDAwPTEwTWJzICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfMTAwTUJTICAgICAgICAgICAgIDB4NDAwMCAvKiAwMT0xMDBNYnMgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl8xMDAwTUJTICAgICAgICAgICAgMHg4MDAwIC8qIDEwPTEwMDBNYnMgKi8KKworI2RlZmluZSBNODhFMTAwMF9QU1NSX1JFVl9QT0xBUklUWV9TSElGVCAxCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfRE9XTlNISUZUX1NISUZUICAgIDUKKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9NRElYX1NISUZUICAgICAgICAgNgorI2RlZmluZSBNODhFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSF9TSElGVCA3CisKKy8qIE04OEUxMDAwIEV4dGVuZGVkIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX0ZJQkVSX0xPT1BCQUNLIDB4NDAwMCAvKiAxPUZpYmVyIGxvb3BiYWNrICovCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX0RPV05fTk9fSURMRSAgIDB4ODAwMCAvKiAxPUxvc3QgbG9jayBkZXRlY3QgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFdpbGwgYXNzZXJ0IGxvc3QgbG9jayBhbmQgYnJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGxpbmsgZG93biBpZiBpZGxlIG5vdCBzZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aXRoaW4gMW1zIGluIDEwMDBCQVNFLVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTnVtYmVyIG9mIHRpbWVzIHdlIHdpbGwgYXR0ZW1wdCB0byBhdXRvbmVnb3RpYXRlIGJlZm9yZSBkb3duc2hpZnRpbmcgaWYgd2UKKyAqIGFyZSB0aGUgbWFzdGVyICovCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX01BU1RFUl9ET1dOU0hJRlRfTUFTSyAweDBDMDAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF8xWCAgIDB4MDAwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUXzJYICAgMHgwNDAwCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX01BU1RFUl9ET1dOU0hJRlRfM1ggICAweDA4MDAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF80WCAgIDB4MEMwMAorLyogTnVtYmVyIG9mIHRpbWVzIHdlIHdpbGwgYXR0ZW1wdCB0byBhdXRvbmVnb3RpYXRlIGJlZm9yZSBkb3duc2hpZnRpbmcgaWYgd2UKKyAqIGFyZSB0aGUgc2xhdmUgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUX01BU0sgIDB4MDMwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfRElTICAgMHgwMDAwCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1NMQVZFX0RPV05TSElGVF8xWCAgICAweDAxMDAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUXzJYICAgIDB4MDIwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfM1ggICAgMHgwMzAwCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1RYX0NMS18yXzUgICAgIDB4MDA2MCAvKiAyLjUgTUh6IFRYX0NMSyAqLworI2RlZmluZSBNODhFMTAwMF9FUFNDUl9UWF9DTEtfMjUgICAgICAweDAwNzAgLyogMjUgIE1IeiBUWF9DTEsgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfVFhfQ0xLXzAgICAgICAgMHgwMDAwIC8qIE5PICBUWF9DTEsgKi8KKworLyogSUdQMDFFMTAwMCBTcGVjaWZpYyBQb3J0IENvbmZpZyBSZWdpc3RlciAtIFIvVyAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BTQ0ZSX0FVVE9fTURJWF9QQVJfREVURUNUICAweDAwMTAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NGUl9QUkVfRU4gICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ0ZSX0RJU0FCTEVfVFBMT09QQkFDSyAgICAweDAxMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NGUl9ESVNBQkxFX0pBQkJFUiAgICAgICAgMHgwNDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDRlJfRElTQUJMRV9UUkFOU01JVCAgICAgIDB4MjAwMAorCisvKiBJR1AwMUUxMDAwIFNwZWNpZmljIFBvcnQgU3RhdHVzIFJlZ2lzdGVyIC0gUi9PICovCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9BVVRPTkVHX0ZBSUxFRCAgICAgICAgIDB4MDAwMSAvKiBSTyBMSCBTQyAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfUE9MQVJJVFlfUkVWRVJTRUQgICAgICAweDAwMDIKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSCAgICAgICAgICAgMHgwMDdDCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9GVUxMX0RVUExFWCAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfTElOS19VUCAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX01ESVggICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9TUEVFRF9NQVNLICAgICAgICAgICAgIDB4QzAwMCAvKiBzcGVlZCBiaXRzIG1hc2sgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwTUJQUyAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9TUEVFRF8xMDBNQlBTICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfU1BFRURfMTAwME1CUFMgICAgICAgICAweEMwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSF9TSElGVCAgICAgMHgwMDAyIC8qIHNoaWZ0IHJpZ2h0IDIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX01ESVhfU0hJRlQgICAgICAgICAgICAgMHgwMDBCIC8qIHNoaWZ0IHJpZ2h0IDExICovCisKKy8qIElHUDAxRTEwMDAgU3BlY2lmaWMgUG9ydCBDb250cm9sIFJlZ2lzdGVyIC0gUi9XICovCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDUl9UUF9MT09QQkFDSyAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ1JfQ09SUkVDVF9OQ19TQ01CTFIgICAgICAweDAyMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NSX1RFTl9DUlNfU0VMRUNUICAgICAgICAgMHgwNDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDUl9GTElQX0NISVAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NSX0ZPUkNFX01ESV9NRElYICAgICAgICAgMHgyMDAwIC8qIDAtTURJLCAxLU1ESVggKi8KKworLyogSUdQMDFFMTAwMCBTcGVjaWZpYyBQb3J0IExpbmsgSGVhbHRoIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9TU19ET1dOR1JBREUgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfR0lHX1NDUkFNQkxFUl9FUlJPUiAgICAweDQwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX01BU1RFUl9GQVVMVCAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9NQVNURVJfUkVTT0xVVElPTiAgICAgIDB4MTAwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfR0lHX1JFTV9SQ1ZSX05PSyAgICAgICAweDA4MDAgLyogTEggKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0lETEVfRVJST1JfQ05UX09GTE9XICAgMHgwNDAwIC8qIExIICovCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9EQVRBX0VSUl8xICAgICAgICAgICAgIDB4MDIwMCAvKiBMSCAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfREFUQV9FUlJfMCAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0FVVE9ORUdfRkFVTFQgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9BVVRPTkVHX0FDVElWRSAgICAgICAgIDB4MDAxMAorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfVkFMSURfQ0hBTk5FTF9EICAgICAgICAweDAwMDgKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX1ZBTElEX0NIQU5ORUxfQyAgICAgICAgMHgwMDA0CisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9WQUxJRF9DSEFOTkVMX0IgICAgICAgIDB4MDAwMgorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfVkFMSURfQ0hBTk5FTF9BICAgICAgICAweDAwMDEKKworLyogSUdQMDFFMTAwMCBDaGFubmVsIFF1YWxpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9NU0VfQ0hBTk5FTF9EICAgICAgICAweDAwMEYKKyNkZWZpbmUgSUdQMDFFMTAwMF9NU0VfQ0hBTk5FTF9DICAgICAgICAweDAwRjAKKyNkZWZpbmUgSUdQMDFFMTAwMF9NU0VfQ0hBTk5FTF9CICAgICAgICAweDBGMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9NU0VfQ0hBTk5FTF9BICAgICAgICAweEYwMDAKKworLyogSUdQMDFFMTAwMCBEU1AgcmVzZXQgbWFjcm9zICovCisjZGVmaW5lIERTUF9SRVNFVF9FTkFCTEUgICAgIDB4MAorI2RlZmluZSBEU1BfUkVTRVRfRElTQUJMRSAgICAweDIKKyNkZWZpbmUgRTEwMDBfTUFYX0RTUF9SRVNFVFMgMTAKKworLyogSUdQMDFFMTAwMCBBR0MgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgSUdQMDFFMTAwMF9BR0NfTEVOR1RIX1NISUZUIDcgICAgICAgICAvKiBDb2Fyc2UgLSAxMzoxMSwgRmluZSAtIDEwOjcgKi8KKworLyogNyBiaXRzICgzIENvYXJzZSArIDQgRmluZSkgLS0+IDEyOCBvcHRpb25hbCB2YWx1ZXMgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9BR0NfTEVOR1RIX1RBQkxFX1NJWkUgMTI4CisKKy8qIFRoZSBwcmVjaXNpb24gb2YgdGhlIGxlbmd0aCBpcyArLy0gMTAgbWV0ZXJzICovCisjZGVmaW5lIElHUDAxRTEwMDBfQUdDX1JBTkdFICAgIDEwCisKKy8qIElHUDAxRTEwMDAgUENTIEluaXRpYWxpemF0aW9uIHJlZ2lzdGVyICovCisvKiBiaXRzIDM6NiBpbiB0aGUgUENTIHJlZ2lzdGVycyBzdG9yZXMgdGhlIGNoYW5uZWxzIHBvbGFyaXR5ICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BPTEFSSVRZX01BU0sgICAgMHgwMDc4CisKKy8qIElHUDAxRTEwMDAgR01JSSBGSUZPIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfR01JSV9GTEVYX1NQRCAgICAgICAgICAgICAgIDB4MTAgLyogRW5hYmxlIGZsZXhpYmxlIHNwZWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb24gTGluay1VcCAqLworI2RlZmluZSBJR1AwMUUxMDAwX0dNSUlfU1BEICAgICAgICAgICAgICAgICAgICAweDIwIC8qIEVuYWJsZSBTUEQgKi8KKworLyogSUdQMDFFMTAwMCBBbmFsb2cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfU1BBUkVfRlVTRV9TVEFUVVMgICAgICAgMHgyMEQxCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfU1RBVFVTICAgICAgICAgICAgIDB4MjBEMAorI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPTlRST0wgICAgICAgICAgICAweDIwREMKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9CWVBBU1MgICAgICAgICAgICAgMHgyMERFCisKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9QT0xZX01BU0sgICAgICAgICAgICAweEYwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FX01BU0sgICAgICAgICAgICAweDBGODAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfTUFTSyAgICAgICAgICAweDAwNzAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfU1BBUkVfRlVTRV9FTkFCTEVEICAgICAgICAweDAxMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9FTkFCTEVfU1dfQ09OVFJPTCAgICAweDAwMDIKKworI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9USFJFU0ggICAgICAgIDB4MDA0MAorI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV8xMCAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfMSAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfMTAgICAgICAgICAgICAgIDB4MDUwMAorCisKKy8qIEJpdCBkZWZpbml0aW9ucyBmb3IgdmFsaWQgUEhZIElEcy4gKi8KKy8qIEkgPSBJbnRlZ3JhdGVkCisgKiBFID0gRXh0ZXJuYWwKKyAqLworI2RlZmluZSBNODhFMTAwMF9FX1BIWV9JRCAgMHgwMTQxMEM1MAorI2RlZmluZSBNODhFMTAwMF9JX1BIWV9JRCAgMHgwMTQxMEMzMAorI2RlZmluZSBNODhFMTAxMV9JX1BIWV9JRCAgMHgwMTQxMEMyMAorI2RlZmluZSBJR1AwMUUxMDAwX0lfUEhZX0lEICAweDAyQTgwMzgwCisjZGVmaW5lIE04OEUxMDAwXzEyX1BIWV9JRCBNODhFMTAwMF9FX1BIWV9JRAorI2RlZmluZSBNODhFMTAwMF8xNF9QSFlfSUQgTTg4RTEwMDBfRV9QSFlfSUQKKyNkZWZpbmUgTTg4RTEwMTFfSV9SRVZfNCAgIDB4MDQKKworLyogTWlzY2VsbGFuZW91cyBQSFkgYml0IGRlZmluaXRpb25zLiAqLworI2RlZmluZSBQSFlfUFJFQU1CTEUgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgUEhZX1NPRiAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFBIWV9PUF9SRUFEICAgICAgICAgMHgwMgorI2RlZmluZSBQSFlfT1BfV1JJVEUgICAgICAgIDB4MDEKKyNkZWZpbmUgUEhZX1RVUk5BUk9VTkQgICAgICAweDAyCisjZGVmaW5lIFBIWV9QUkVBTUJMRV9TSVpFICAgMzIKKyNkZWZpbmUgTUlJX0NSX1NQRUVEXzEwMDAgICAweDAwNDAKKyNkZWZpbmUgTUlJX0NSX1NQRUVEXzEwMCAgICAweDIwMDAKKyNkZWZpbmUgTUlJX0NSX1NQRUVEXzEwICAgICAweDAwMDAKKyNkZWZpbmUgRTEwMDBfUEhZX0FERFJFU1MgICAweDAxCisjZGVmaW5lIFBIWV9BVVRPX05FR19USU1FICAgNDUgIC8qIDQuNSBTZWNvbmRzICovCisjZGVmaW5lIFBIWV9GT1JDRV9USU1FICAgICAgMjAgIC8qIDIuMCBTZWNvbmRzICovCisjZGVmaW5lIFBIWV9SRVZJU0lPTl9NQVNLICAgMHhGRkZGRkZGMAorI2RlZmluZSBERVZJQ0VfU1BFRURfTUFTSyAgIDB4MDAwMDAzMDAgIC8qIERldmljZSBDdHJsIFJlZyBTcGVlZCBNYXNrICovCisjZGVmaW5lIFJFRzRfU1BFRURfTUFTSyAgICAgMHgwMUUwCisjZGVmaW5lIFJFRzlfU1BFRURfTUFTSyAgICAgMHgwMzAwCisjZGVmaW5lIEFEVkVSVElTRV8xMF9IQUxGICAgMHgwMDAxCisjZGVmaW5lIEFEVkVSVElTRV8xMF9GVUxMICAgMHgwMDAyCisjZGVmaW5lIEFEVkVSVElTRV8xMDBfSEFMRiAgMHgwMDA0CisjZGVmaW5lIEFEVkVSVElTRV8xMDBfRlVMTCAgMHgwMDA4CisjZGVmaW5lIEFEVkVSVElTRV8xMDAwX0hBTEYgMHgwMDEwCisjZGVmaW5lIEFEVkVSVElTRV8xMDAwX0ZVTEwgMHgwMDIwCisjZGVmaW5lIEFVVE9ORUdfQURWRVJUSVNFX1NQRUVEX0RFRkFVTFQgMHgwMDJGICAvKiBFdmVyeXRoaW5nIGJ1dCAxMDAwLUhhbGYgKi8KKyNkZWZpbmUgQVVUT05FR19BRFZFUlRJU0VfMTBfMTAwX0FMTCAgICAweDAwMEYgLyogQWxsIDEwLzEwMCBzcGVlZHMqLworI2RlZmluZSBBVVRPTkVHX0FEVkVSVElTRV8xMF9BTEwgICAgICAgIDB4MDAwMyAvKiAxME1icHMgRnVsbCAmIEhhbGYgc3BlZWRzKi8KKworI2VuZGlmIC8qIF9FMTAwMF9IV19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNTQ5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKQEAgLTAsMCArMSwzMTYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIAorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisgIGFueSBsYXRlciB2ZXJzaW9uLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisgIG1vcmUgZGV0YWlscy4KKyAgCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAgCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICAKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImUxMDAwLmgiCisKKy8qIENoYW5nZSBMb2cKKyAqIDUuMy4xMgk2LzcvMDQKKyAqIC0ga2NvbXBhdCBORVRJRl9NU0cgZm9yIG9sZGVyIGtlcm5lbHMgKDIuNC45KSA8c2Vhbi5wLm1jZGVybW90dEBpbnRlbC5jb20+CisgKiAtIGlmX21paSBzdXBwb3J0IGFuZCBhc3NvY2lhdGVkIGtjb21wYXQgZm9yIG9sZGVyIGtlcm5lbHMKKyAqIC0gTW9yZSBlcnJsb2dnaW5nIHN1cHBvcnQgZnJvbSBKb24gTWFzb24gPGpvbm1hc29uQHVzLmlibS5jb20+CisgKiAtIEZpeCBUU08gaXNzdWVzIG9uIFBQQzY0IG1hY2hpbmVzIC0tIEpvbiBNYXNvbiA8am9ubWFzb25AdXMuaWJtLmNvbT4KKyAqCisgKiA1LjcuMQkxMi8xNi8wNAorICogLSBSZXN1cnJlY3QgODI1NDdFSS9HSSByZWxhdGVkIGZpeCBpbiBlMTAwMF9pbnRyIHRvIGF2b2lkIGRlYWRsb2Nrcy4gVGhpcworICogICBmaXggd2FzIHJlbW92ZWQgYXMgaXQgY2F1c2VkIHN5c3RlbSBpbnN0YWJpbGl0eS4gVGhlIHN1c3BlY3RlZCBjYXVzZSBvZiAKKyAqICAgdGhpcyBpcyB0aGUgY2FsbGVkIHRvIGUxMDAwX2lycV9kaXNhYmxlIGluIGUxMDAwX2ludHIuIElubGluZWQgdGhlIAorICogICByZXF1aXJlZCBwaWVjZSBvZiBlMTAwMF9pcnFfZGlzYWJsZSBpbnRvIGUxMDAwX2ludHIgLSBBbnRvbiBCbGFuY2hhcmQKKyAqIDUuNy4wCTEyLzEwLzA0CisgKiAtIGluY2x1ZGUgZml4IHRvIHRoZSBjb25kaXRpb24gdGhhdCBkZXRlcm1pbmVzIHdoZW4gdG8gcXVpdCBOQVBJIC0gUm9iZXJ0IE9sc3NvbgorICogLSB1c2UgbmV0aWZfcG9sbF97ZGlzYWJsZS9lbmFibGV9IHRvIHN5bmNocm9uaXplIGJldHdlZW4gTkFQSSBhbmQgaS9mIHVwL2Rvd24KKyAqIDUuNi41IAkxMS8wMS8wNAorICogLSBFbmFibGluZyBORVRJRl9GX1NHIHdpdGhvdXQgY2hlY2tzdW0gb2ZmbG9hZCBpcyBpbGxlZ2FsIC0gCisgICAgIEpvaG4gTWFzb24gPGpkbWFzb25AdXMuaWJtLmNvbT4KKyAqIDUuNi4zICAgICAgICAxMC8yNi8wNAorICogLSBSZW1vdmUgcmVkdW5kYW50IGluaXRpYWxpemF0aW9uIC0gSmFtYWwgSGFkaQorICogLSBSZXNldCBidWZmZXJfaW5mby0+ZG1hIGluIHR4IHJlc291cmNlIGNsZWFudXAgbG9naWMKKyAqIDUuNi4yCTEwLzEyLzA0CisgKiAtIEF2b2lkIGZpbGxpbmcgdHhfcmluZyBjb21wbGV0ZWx5IC0gc2hlbW1pbmdlckBvc2RsLm9yZworICogLSBSZXBsYWNlIHNjaGVkdWxlX3RpbWVvdXQoKSB3aXRoIG1zbGVlcCgpL21zbGVlcF9pbnRlcnJ1cHRpYmxlKCkgLQorICogICBuYWNjQHVzLmlibS5jb20KKyAqIC0gU3BhcnNlIGNsZWFudXAgLSBzaGVtbWluZ2VyQG9zZGwub3JnCisgKiAtIEZpeCB0eCByZXNvdXJjZSBjbGVhbnVwIGxvZ2ljCisgKiAtIExMVFggc3VwcG9ydCAtIGFrQHN1c2UuZGUgYW5kIGhhZGlAY3liZXJ1cy5jYQorICovCisKK2NoYXIgZTEwMDBfZHJpdmVyX25hbWVbXSA9ICJlMTAwMCI7CitjaGFyIGUxMDAwX2RyaXZlcl9zdHJpbmdbXSA9ICJJbnRlbChSKSBQUk8vMTAwMCBOZXR3b3JrIERyaXZlciI7CisjaWZuZGVmIENPTkZJR19FMTAwMF9OQVBJCisjZGVmaW5lIERSSVZFUk5BUEkKKyNlbHNlCisjZGVmaW5lIERSSVZFUk5BUEkgIi1OQVBJIgorI2VuZGlmCisjZGVmaW5lIERSVl9WRVJTSU9OICI1LjcuNi1rMiJEUklWRVJOQVBJCitjaGFyIGUxMDAwX2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKK2NoYXIgZTEwMDBfY29weXJpZ2h0W10gPSAiQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIjsKKworLyogZTEwMDBfcGNpX3RibCAtIFBDSSBEZXZpY2UgSUQgVGFibGUKKyAqCisgKiBMYXN0IGVudHJ5IG11c3QgYmUgYWxsIDBzCisgKgorICogTWFjcm8gZXhwYW5kcyB0by4uLgorICogICB7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBkZXZpY2VfaWQpfQorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZTEwMDBfcGNpX3RibFtdID0geworCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMDApLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMDEpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMDQpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMDgpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMDkpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMEMpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMEQpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMEUpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMEYpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMTApLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMTEpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMTIpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMTMpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMTQpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMTUpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMTYpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMTcpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMTgpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMTkpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMUQpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMUUpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMjYpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMjcpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwMjgpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwNzUpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwNzYpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwNzcpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwNzgpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwNzkpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwN0EpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwN0IpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwN0MpLAorCUlOVEVMX0UxMDAwX0VUSEVSTkVUX0RFVklDRSgweDEwOEEpLAorCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KKwl7MCx9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZTEwMDBfcGNpX3RibCk7CisKK2ludCBlMTAwMF91cChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIGUxMDAwX2Rvd24oc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBlMTAwMF9yZXNldChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitpbnQgZTEwMDBfc2V0X3NwZF9kcGx4KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLCB1aW50MTZfdCBzcGRkcGx4KTsKK2ludCBlMTAwMF9zZXR1cF90eF9yZXNvdXJjZXMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IGUxMDAwX3NldHVwX3J4X3Jlc291cmNlcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIGUxMDAwX2ZyZWVfdHhfcmVzb3VyY2VzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgZTEwMDBfZnJlZV9yeF9yZXNvdXJjZXMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBlMTAwMF91cGRhdGVfc3RhdHMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworCisvKiBMb2NhbCBGdW5jdGlvbiBQcm90b3R5cGVzICovCisKK3N0YXRpYyBpbnQgZTEwMDBfaW5pdF9tb2R1bGUodm9pZCk7CitzdGF0aWMgdm9pZCBlMTAwMF9leGl0X21vZHVsZSh2b2lkKTsKK3N0YXRpYyBpbnQgZTEwMDBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHZvaWQgX19kZXZleGl0IGUxMDAwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitzdGF0aWMgaW50IGUxMDAwX3N3X2luaXQoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBlMTAwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworc3RhdGljIGludCBlMTAwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyB2b2lkIGUxMDAwX2NvbmZpZ3VyZV90eChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgdm9pZCBlMTAwMF9jb25maWd1cmVfcngoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgZTEwMDBfc2V0dXBfcmN0bChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgdm9pZCBlMTAwMF9jbGVhbl90eF9yaW5nKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIGUxMDAwX2NsZWFuX3J4X3Jpbmcoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgZTEwMDBfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworc3RhdGljIHZvaWQgZTEwMDBfdXBkYXRlX3BoeV9pbmZvKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBlMTAwMF93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgZTEwMDBfd2F0Y2hkb2dfdGFzayhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgdm9pZCBlMTAwMF84MjU0N190eF9maWZvX3N0YWxsKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgaW50IGUxMDAwX3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBlMTAwMF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgaW50IGUxMDAwX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpOworc3RhdGljIGludCBlMTAwMF9zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKnApOworc3RhdGljIGlycXJldHVybl90IGUxMDAwX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGJvb2xlYW5fdCBlMTAwMF9jbGVhbl90eF9pcnEoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCitzdGF0aWMgaW50IGUxMDAwX2NsZWFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCAqYnVkZ2V0KTsKK3N0YXRpYyBib29sZWFuX3QgZTEwMDBfY2xlYW5fcnhfaXJxKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp3b3JrX2RvbmUsIGludCB3b3JrX3RvX2RvKTsKKyNlbHNlCitzdGF0aWMgYm9vbGVhbl90IGUxMDAwX2NsZWFuX3J4X2lycShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGUxMDAwX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBlMTAwMF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CitzdGF0aWMgaW50IGUxMDAwX21paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwKKwkJCSAgIGludCBjbWQpOwordm9pZCBlMTAwMF9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgdm9pZCBlMTAwMF9lbnRlcl84MjU0Ml9yc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgZTEwMDBfbGVhdmVfODI1NDJfcnN0KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIGUxMDAwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlMTAwMF90eF90aW1lb3V0X3Rhc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlMTAwMF9zbWFydHNwZWVkKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbmxpbmUgaW50IGUxMDAwXzgyNTQ3X2ZpZm9fd29ya2Fyb3VuZChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyB2b2lkIGUxMDAwX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCk7CitzdGF0aWMgdm9pZCBlMTAwMF92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDE2X3QgdmlkKTsKK3N0YXRpYyB2b2lkIGUxMDAwX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDE2X3QgdmlkKTsKK3N0YXRpYyB2b2lkIGUxMDAwX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CisKK3N0YXRpYyBpbnQgZTEwMDBfbm90aWZ5X3JlYm9vdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKTsKK3N0YXRpYyBpbnQgZTEwMDBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludDMyX3Qgc3RhdGUpOworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBlMTAwMF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyogZm9yIG5ldGR1bXAgLyBuZXQgY29uc29sZSAqLworc3RhdGljIHZvaWQgZTEwMDBfbmV0cG9sbCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CisjZW5kaWYKKworc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGUxMDAwX25vdGlmaWVyX3JlYm9vdCA9IHsKKwkubm90aWZpZXJfY2FsbAk9IGUxMDAwX25vdGlmeV9yZWJvb3QsCisJLm5leHQJCT0gTlVMTCwKKwkucHJpb3JpdHkJPSAwCit9OworCisvKiBFeHBvcnRlZCBmcm9tIG90aGVyIG1vZHVsZXMgKi8KKworZXh0ZXJuIHZvaWQgZTEwMDBfY2hlY2tfb3B0aW9ucyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlMTAwMF9kcml2ZXIgPSB7CisJLm5hbWUgICAgID0gZTEwMDBfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlID0gZTEwMDBfcGNpX3RibCwKKwkucHJvYmUgICAgPSBlMTAwMF9wcm9iZSwKKwkucmVtb3ZlICAgPSBfX2RldmV4aXRfcChlMTAwMF9yZW1vdmUpLAorCS8qIFBvd2VyIE1hbmFnbWVudCBIb29rcyAqLworI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kICA9IGUxMDAwX3N1c3BlbmQsCisJLnJlc3VtZSAgID0gZTEwMDBfcmVzdW1lCisjZW5kaWYKK307CisKK01PRFVMRV9BVVRIT1IoIkludGVsIENvcnBvcmF0aW9uLCA8bGludXgubmljc0BpbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsKFIpIFBSTy8xMDAwIE5ldHdvcmsgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK3N0YXRpYyBpbnQgZGVidWcgPSBORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX1BST0JFOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwPW5vbmUsLi4uLDE2PWFsbCkiKTsKKworLyoqCisgKiBlMTAwMF9pbml0X21vZHVsZSAtIERyaXZlciBSZWdpc3RyYXRpb24gUm91dGluZQorICoKKyAqIGUxMDAwX2luaXRfbW9kdWxlIGlzIHRoZSBmaXJzdCByb3V0aW5lIGNhbGxlZCB3aGVuIHRoZSBkcml2ZXIgaXMKKyAqIGxvYWRlZC4gQWxsIGl0IGRvZXMgaXMgcmVnaXN0ZXIgd2l0aCB0aGUgUENJIHN1YnN5c3RlbS4KKyAqKi8KKworc3RhdGljIGludCBfX2luaXQKK2UxMDAwX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldDsKKwlwcmludGsoS0VSTl9JTkZPICIlcyAtIHZlcnNpb24gJXNcbiIsCisJICAgICAgIGUxMDAwX2RyaXZlcl9zdHJpbmcsIGUxMDAwX2RyaXZlcl92ZXJzaW9uKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBlMTAwMF9jb3B5cmlnaHQpOworCisJcmV0ID0gcGNpX21vZHVsZV9pbml0KCZlMTAwMF9kcml2ZXIpOworCWlmKHJldCA+PSAwKSB7CisJCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmZTEwMDBfbm90aWZpZXJfcmVib290KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworbW9kdWxlX2luaXQoZTEwMDBfaW5pdF9tb2R1bGUpOworCisvKioKKyAqIGUxMDAwX2V4aXRfbW9kdWxlIC0gRHJpdmVyIEV4aXQgQ2xlYW51cCBSb3V0aW5lCisgKgorICogZTEwMDBfZXhpdF9tb2R1bGUgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBkcml2ZXIgaXMgcmVtb3ZlZAorICogZnJvbSBtZW1vcnkuCisgKiovCisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZTEwMDBfZXhpdF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmZTEwMDBfbm90aWZpZXJfcmVib290KTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmUxMDAwX2RyaXZlcik7Cit9CisKK21vZHVsZV9leGl0KGUxMDAwX2V4aXRfbW9kdWxlKTsKKworLyoqCisgKiBlMTAwMF9pcnFfZGlzYWJsZSAtIE1hc2sgb2ZmIGludGVycnVwdCBnZW5lcmF0aW9uIG9uIHRoZSBOSUMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK2UxMDAwX2lycV9kaXNhYmxlKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCWF0b21pY19pbmMoJmFkYXB0ZXItPmlycV9zZW0pOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElNQywgfjApOworCUUxMDAwX1dSSVRFX0ZMVVNIKCZhZGFwdGVyLT5odyk7CisJc3luY2hyb25pemVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSk7Cit9CisKKy8qKgorICogZTEwMDBfaXJxX2VuYWJsZSAtIEVuYWJsZSBkZWZhdWx0IGludGVycnVwdCBnZW5lcmF0aW9uIHNldHRpbmdzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KKworc3RhdGljIGlubGluZSB2b2lkCitlMTAwMF9pcnFfZW5hYmxlKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCWlmKGxpa2VseShhdG9taWNfZGVjX2FuZF90ZXN0KCZhZGFwdGVyLT5pcnFfc2VtKSkpIHsKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSU1TLCBJTVNfRU5BQkxFX01BU0spOworCQlFMTAwMF9XUklURV9GTFVTSCgmYWRhcHRlci0+aHcpOworCX0KK30KKworaW50CitlMTAwMF91cChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCWludCBlcnI7CisKKwkvKiBoYXJkd2FyZSBoYXMgYmVlbiByZXNldCwgd2UgbmVlZCB0byByZWxvYWQgc29tZSB0aGluZ3MgKi8KKworCS8qIFJlc2V0IHRoZSBQSFkgaWYgaXQgd2FzIHByZXZpb3VzbHkgcG93ZXJlZCBkb3duICovCisJaWYoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCQl1aW50MTZfdCBtaWlfcmVnOworCQllMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfQ1RSTCwgJm1paV9yZWcpOworCQlpZihtaWlfcmVnICYgTUlJX0NSX1BPV0VSX0RPV04pCisJCQllMTAwMF9waHlfcmVzZXQoJmFkYXB0ZXItPmh3KTsKKwl9CisKKwllMTAwMF9zZXRfbXVsdGkobmV0ZGV2KTsKKworCWUxMDAwX3Jlc3RvcmVfdmxhbihhZGFwdGVyKTsKKworCWUxMDAwX2NvbmZpZ3VyZV90eChhZGFwdGVyKTsKKwllMTAwMF9zZXR1cF9yY3RsKGFkYXB0ZXIpOworCWUxMDAwX2NvbmZpZ3VyZV9yeChhZGFwdGVyKTsKKwllMTAwMF9hbGxvY19yeF9idWZmZXJzKGFkYXB0ZXIpOworCisJaWYoKGVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwgJmUxMDAwX2ludHIsCisJCSAgICAgICAgICAgICAgU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NLAorCQkgICAgICAgICAgICAgIG5ldGRldi0+bmFtZSwgbmV0ZGV2KSkpCisJCXJldHVybiBlcnI7CisKKwltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzKTsKKwllMTAwMF9pcnFfZW5hYmxlKGFkYXB0ZXIpOworCisjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKKwluZXRpZl9wb2xsX2VuYWJsZShuZXRkZXYpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2UxMDAwX2Rvd24oc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKworCWUxMDAwX2lycV9kaXNhYmxlKGFkYXB0ZXIpOworCWZyZWVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwgbmV0ZGV2KTsKKwlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+dHhfZmlmb19zdGFsbF90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+cGh5X2luZm9fdGltZXIpOworCisjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKKwluZXRpZl9wb2xsX2Rpc2FibGUobmV0ZGV2KTsKKyNlbmRpZgorCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAwOworCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gMDsKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOworCWUxMDAwX2NsZWFuX3R4X3JpbmcoYWRhcHRlcik7CisJZTEwMDBfY2xlYW5fcnhfcmluZyhhZGFwdGVyKTsKKworCS8qIElmIFdvTCBpcyBub3QgZW5hYmxlZAorCSAqIFBvd2VyIGRvd24gdGhlIFBIWSBzbyBubyBsaW5rIGlzIGltcGxpZWQgd2hlbiBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmKCFhZGFwdGVyLT53b2wgJiYgYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCQl1aW50MTZfdCBtaWlfcmVnOworCQllMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfQ1RSTCwgJm1paV9yZWcpOworCQltaWlfcmVnIHw9IE1JSV9DUl9QT1dFUl9ET1dOOworCQllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsIG1paV9yZWcpOworCX0KK30KKwordm9pZAorZTEwMDBfcmVzZXQoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdWludDMyX3QgcGJhOworCisJLyogUmVwYXJ0aXRpb24gUGJhIGZvciBncmVhdGVyIHRoYW4gOWsgbXR1CisJICogVG8gdGFrZSBlZmZlY3QgQ1RSTC5SU1QgaXMgcmVxdWlyZWQuCisJICovCisKKwlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTQ3KSB7CisJCWlmKGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPiBFMTAwMF9SWEJVRkZFUl84MTkyKQorCQkJcGJhID0gRTEwMDBfUEJBXzQwSzsKKwkJZWxzZQorCQkJcGJhID0gRTEwMDBfUEJBXzQ4SzsKKwl9IGVsc2UgeworCQlpZihhZGFwdGVyLT5yeF9idWZmZXJfbGVuID4gRTEwMDBfUlhCVUZGRVJfODE5MikKKwkJCXBiYSA9IEUxMDAwX1BCQV8yMks7CisJCWVsc2UKKwkJCXBiYSA9IEUxMDAwX1BCQV8zMEs7CisJCWFkYXB0ZXItPnR4X2ZpZm9faGVhZCA9IDA7CisJCWFkYXB0ZXItPnR4X2hlYWRfYWRkciA9IHBiYSA8PCBFMTAwMF9UWF9IRUFEX0FERFJfU0hJRlQ7CisJCWFkYXB0ZXItPnR4X2ZpZm9fc2l6ZSA9CisJCQkoRTEwMDBfUEJBXzQwSyAtIHBiYSkgPDwgRTEwMDBfUEJBX0JZVEVTX1NISUZUOworCQlhdG9taWNfc2V0KCZhZGFwdGVyLT50eF9maWZvX3N0YWxsLCAwKTsKKwl9CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUEJBLCBwYmEpOworCisJLyogZmxvdyBjb250cm9sIHNldHRpbmdzICovCisJYWRhcHRlci0+aHcuZmNfaGlnaF93YXRlciA9IChwYmEgPDwgRTEwMDBfUEJBX0JZVEVTX1NISUZUKSAtCisJCQkJICAgIEUxMDAwX0ZDX0hJR0hfRElGRjsKKwlhZGFwdGVyLT5ody5mY19sb3dfd2F0ZXIgPSAocGJhIDw8IEUxMDAwX1BCQV9CWVRFU19TSElGVCkgLQorCQkJCSAgIEUxMDAwX0ZDX0xPV19ESUZGOworCWFkYXB0ZXItPmh3LmZjX3BhdXNlX3RpbWUgPSBFMTAwMF9GQ19QQVVTRV9USU1FOworCWFkYXB0ZXItPmh3LmZjX3NlbmRfeG9uID0gMTsKKwlhZGFwdGVyLT5ody5mYyA9IGFkYXB0ZXItPmh3Lm9yaWdpbmFsX2ZjOworCisJZTEwMDBfcmVzZXRfaHcoJmFkYXB0ZXItPmh3KTsKKwlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCkKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgV1VDLCAwKTsKKwlpZihlMTAwMF9pbml0X2h3KCZhZGFwdGVyLT5odykpCisJCURQUklOVEsoUFJPQkUsIEVSUiwgIkhhcmR3YXJlIEVycm9yXG4iKTsKKworCS8qIEVuYWJsZSBoL3cgdG8gcmVjb2duaXplIGFuIDgwMi4xUSBWTEFOIEV0aGVybmV0IHBhY2tldCAqLworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFZFVCwgRVRIRVJORVRfSUVFRV9WTEFOX1RZUEUpOworCisJZTEwMDBfcmVzZXRfYWRhcHRpdmUoJmFkYXB0ZXItPmh3KTsKKwllMTAwMF9waHlfZ2V0X2luZm8oJmFkYXB0ZXItPmh3LCAmYWRhcHRlci0+cGh5X2luZm8pOworfQorCisvKioKKyAqIGUxMDAwX3Byb2JlIC0gRGV2aWNlIEluaXRpYWxpemF0aW9uIFJvdXRpbmUKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIHN0cnVjdAorICogQGVudDogZW50cnkgaW4gZTEwMDBfcGNpX3RibAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKgorICogZTEwMDBfcHJvYmUgaW5pdGlhbGl6ZXMgYW4gYWRhcHRlciBpZGVudGlmaWVkIGJ5IGEgcGNpX2RldiBzdHJ1Y3R1cmUuCisgKiBUaGUgT1MgaW5pdGlhbGl6YXRpb24sIGNvbmZpZ3VyaW5nIG9mIHRoZSBhZGFwdGVyIHByaXZhdGUgc3RydWN0dXJlLAorICogYW5kIGEgaGFyZHdhcmUgcmVzZXQgb2NjdXIuCisgKiovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitlMTAwMF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcjsKKwlzdGF0aWMgaW50IGNhcmRzX2ZvdW5kID0gMDsKKwl1bnNpZ25lZCBsb25nIG1taW9fc3RhcnQ7CisJaW50IG1taW9fbGVuOworCWludCBwY2lfdXNpbmdfZGFjOworCWludCBpOworCWludCBlcnI7CisJdWludDE2X3QgZWVwcm9tX2RhdGE7CisJdWludDE2X3QgZWVwcm9tX2FwbWVfbWFzayA9IEUxMDAwX0VFUFJPTV9BUE1FOworCisJaWYoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkKKwkJcmV0dXJuIGVycjsKKworCWlmKCEoZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpKSB7CisJCXBjaV91c2luZ19kYWMgPSAxOworCX0gZWxzZSB7CisJCWlmKChlcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkpIHsKKwkJCUUxMDAwX0VSUigiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCBhYm9ydGluZ1xuIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCXBjaV91c2luZ19kYWMgPSAwOworCX0KKworCWlmKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIGUxMDAwX2RyaXZlcl9uYW1lKSkpCisJCXJldHVybiBlcnI7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZTEwMDBfYWRhcHRlcikpOworCWlmKCFuZXRkZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfYWxsb2NfZXRoZXJkZXY7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihuZXRkZXYpOworCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgbmV0ZGV2KTsKKwlhZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWFkYXB0ZXItPm5ldGRldiA9IG5ldGRldjsKKwlhZGFwdGVyLT5wZGV2ID0gcGRldjsKKwlhZGFwdGVyLT5ody5iYWNrID0gYWRhcHRlcjsKKwlhZGFwdGVyLT5tc2dfZW5hYmxlID0gKDEgPDwgZGVidWcpIC0gMTsKKworCW1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgQkFSXzApOworCW1taW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBCQVJfMCk7CisKKwlhZGFwdGVyLT5ody5od19hZGRyID0gaW9yZW1hcChtbWlvX3N0YXJ0LCBtbWlvX2xlbik7CisJaWYoIWFkYXB0ZXItPmh3Lmh3X2FkZHIpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfaW9yZW1hcDsKKwl9CisKKwlmb3IoaSA9IEJBUl8xOyBpIDw9IEJBUl81OyBpKyspIHsKKwkJaWYocGNpX3Jlc291cmNlX2xlbihwZGV2LCBpKSA9PSAwKQorCQkJY29udGludWU7CisJCWlmKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBpKSAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJCWFkYXB0ZXItPmh3LmlvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCW5ldGRldi0+b3BlbiA9ICZlMTAwMF9vcGVuOworCW5ldGRldi0+c3RvcCA9ICZlMTAwMF9jbG9zZTsKKwluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZlMTAwMF94bWl0X2ZyYW1lOworCW5ldGRldi0+Z2V0X3N0YXRzID0gJmUxMDAwX2dldF9zdGF0czsKKwluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZlMTAwMF9zZXRfbXVsdGk7CisJbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAmZTEwMDBfc2V0X21hYzsKKwluZXRkZXYtPmNoYW5nZV9tdHUgPSAmZTEwMDBfY2hhbmdlX210dTsKKwluZXRkZXYtPmRvX2lvY3RsID0gJmUxMDAwX2lvY3RsOworCWUxMDAwX3NldF9ldGh0b29sX29wcyhuZXRkZXYpOworCW5ldGRldi0+dHhfdGltZW91dCA9ICZlMTAwMF90eF90aW1lb3V0OworCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSA1ICogSFo7CisjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKKwluZXRkZXYtPnBvbGwgPSAmZTEwMDBfY2xlYW47CisJbmV0ZGV2LT53ZWlnaHQgPSA2NDsKKyNlbmRpZgorCW5ldGRldi0+dmxhbl9yeF9yZWdpc3RlciA9IGUxMDAwX3ZsYW5fcnhfcmVnaXN0ZXI7CisJbmV0ZGV2LT52bGFuX3J4X2FkZF92aWQgPSBlMTAwMF92bGFuX3J4X2FkZF92aWQ7CisJbmV0ZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gZTEwMDBfdmxhbl9yeF9raWxsX3ZpZDsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCW5ldGRldi0+cG9sbF9jb250cm9sbGVyID0gZTEwMDBfbmV0cG9sbDsKKyNlbmRpZgorCXN0cmNweShuZXRkZXYtPm5hbWUsIHBjaV9uYW1lKHBkZXYpKTsKKworCW5ldGRldi0+bWVtX3N0YXJ0ID0gbW1pb19zdGFydDsKKwluZXRkZXYtPm1lbV9lbmQgPSBtbWlvX3N0YXJ0ICsgbW1pb19sZW47CisJbmV0ZGV2LT5iYXNlX2FkZHIgPSBhZGFwdGVyLT5ody5pb19iYXNlOworCisJYWRhcHRlci0+YmRfbnVtYmVyID0gY2FyZHNfZm91bmQ7CisKKwkvKiBzZXR1cCB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKworCWlmKChlcnIgPSBlMTAwMF9zd19pbml0KGFkYXB0ZXIpKSkKKwkJZ290byBlcnJfc3dfaW5pdDsKKworCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQzKSB7CisJCW5ldGRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwKKwkJCQkgICBORVRJRl9GX0hXX0NTVU0gfAorCQkJCSAgIE5FVElGX0ZfSFdfVkxBTl9UWCB8CisJCQkJICAgTkVUSUZfRl9IV19WTEFOX1JYIHwKKwkJCQkgICBORVRJRl9GX0hXX1ZMQU5fRklMVEVSOworCX0KKworI2lmZGVmIE5FVElGX0ZfVFNPCisJaWYoKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQ0KSAmJgorCSAgIChhZGFwdGVyLT5ody5tYWNfdHlwZSAhPSBlMTAwMF84MjU0NykpCisJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CisjZW5kaWYKKwlpZihwY2lfdXNpbmdfZGFjKQorCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKworIAkvKiBoYXJkX3N0YXJ0X3htaXQgaXMgc2FmZSBhZ2FpbnN0IHBhcmFsbGVsIGxvY2tpbmcgKi8KKyAJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xMVFg7IAorIAorCS8qIGJlZm9yZSByZWFkaW5nIHRoZSBFRVBST00sIHJlc2V0IHRoZSBjb250cm9sbGVyIHRvIAorCSAqIHB1dCB0aGUgZGV2aWNlIGluIGEga25vd24gZ29vZCBzdGFydGluZyBzdGF0ZSAqLworCQorCWUxMDAwX3Jlc2V0X2h3KCZhZGFwdGVyLT5odyk7CisKKwkvKiBtYWtlIHN1cmUgdGhlIEVFUFJPTSBpcyBnb29kICovCisKKwlpZihlMTAwMF92YWxpZGF0ZV9lZXByb21fY2hlY2tzdW0oJmFkYXB0ZXItPmh3KSA8IDApIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiVGhlIEVFUFJPTSBDaGVja3N1bSBJcyBOb3QgVmFsaWRcbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9lZXByb207CisJfQorCisJLyogY29weSB0aGUgTUFDIGFkZHJlc3Mgb3V0IG9mIHRoZSBFRVBST00gKi8KKworCWlmIChlMTAwMF9yZWFkX21hY19hZGRyKCZhZGFwdGVyLT5odykpCisJCURQUklOVEsoUFJPQkUsIEVSUiwgIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKKwltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+aHcubWFjX2FkZHIsIG5ldGRldi0+YWRkcl9sZW4pOworCisJaWYoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobmV0ZGV2LT5kZXZfYWRkcikpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiSW52YWxpZCBNQUMgQWRkcmVzc1xuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX2VlcHJvbTsKKwl9CisKKwllMTAwMF9yZWFkX3BhcnRfbnVtKCZhZGFwdGVyLT5odywgJihhZGFwdGVyLT5wYXJ0X251bSkpOworCisJZTEwMDBfZ2V0X2J1c19pbmZvKCZhZGFwdGVyLT5odyk7CisKKwlpbml0X3RpbWVyKCZhZGFwdGVyLT50eF9maWZvX3N0YWxsX3RpbWVyKTsKKwlhZGFwdGVyLT50eF9maWZvX3N0YWxsX3RpbWVyLmZ1bmN0aW9uID0gJmUxMDAwXzgyNTQ3X3R4X2ZpZm9fc3RhbGw7CisJYWRhcHRlci0+dHhfZmlmb19zdGFsbF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGFkYXB0ZXI7CisKKwlpbml0X3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lcik7CisJYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIuZnVuY3Rpb24gPSAmZTEwMDBfd2F0Y2hkb2c7CisJYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBhZGFwdGVyOworCisJSU5JVF9XT1JLKCZhZGFwdGVyLT53YXRjaGRvZ190YXNrLAorCQkodm9pZCAoKikodm9pZCAqKSllMTAwMF93YXRjaGRvZ190YXNrLCBhZGFwdGVyKTsKKworCWluaXRfdGltZXIoJmFkYXB0ZXItPnBoeV9pbmZvX3RpbWVyKTsKKwlhZGFwdGVyLT5waHlfaW5mb190aW1lci5mdW5jdGlvbiA9ICZlMTAwMF91cGRhdGVfcGh5X2luZm87CisJYWRhcHRlci0+cGh5X2luZm9fdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBhZGFwdGVyOworCisJSU5JVF9XT1JLKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2ssCisJCSh2b2lkICgqKSh2b2lkICopKWUxMDAwX3R4X3RpbWVvdXRfdGFzaywgbmV0ZGV2KTsKKworCS8qIHdlJ3JlIGdvaW5nIHRvIHJlc2V0LCBzbyBhc3N1bWUgd2UgaGF2ZSBubyBsaW5rIGZvciBub3cgKi8KKworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJZTEwMDBfY2hlY2tfb3B0aW9ucyhhZGFwdGVyKTsKKworCS8qIEluaXRpYWwgV2FrZSBvbiBMQU4gc2V0dGluZworCSAqIElmIEFQTSB3YWtlIGlzIGVuYWJsZWQgaW4gdGhlIEVFUFJPTSwKKwkgKiBlbmFibGUgdGhlIEFDUEkgTWFnaWMgUGFja2V0IGZpbHRlcgorCSAqLworCisJc3dpdGNoKGFkYXB0ZXItPmh3Lm1hY190eXBlKSB7CisJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CisJY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzE6CisJY2FzZSBlMTAwMF84MjU0MzoKKwkJYnJlYWs7CisJY2FzZSBlMTAwMF84MjU0NDoKKwkJZTEwMDBfcmVhZF9lZXByb20oJmFkYXB0ZXItPmh3LAorCQkJRUVQUk9NX0lOSVRfQ09OVFJPTDJfUkVHLCAxLCAmZWVwcm9tX2RhdGEpOworCQllZXByb21fYXBtZV9tYXNrID0gRTEwMDBfRUVQUk9NXzgyNTQ0X0FQTTsKKwkJYnJlYWs7CisJY2FzZSBlMTAwMF84MjU0NjoKKwljYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorCQlpZigoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0ZVTkNfMSkKKwkJICAgJiYgKGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpKSB7CisJCQllMTAwMF9yZWFkX2VlcHJvbSgmYWRhcHRlci0+aHcsCisJCQkJRUVQUk9NX0lOSVRfQ09OVFJPTDNfUE9SVF9CLCAxLCAmZWVwcm9tX2RhdGEpOworCQkJYnJlYWs7CisJCX0KKwkJLyogRmFsbCBUaHJvdWdoICovCisJZGVmYXVsdDoKKwkJZTEwMDBfcmVhZF9lZXByb20oJmFkYXB0ZXItPmh3LAorCQkJRUVQUk9NX0lOSVRfQ09OVFJPTDNfUE9SVF9BLCAxLCAmZWVwcm9tX2RhdGEpOworCQlicmVhazsKKwl9CisJaWYoZWVwcm9tX2RhdGEgJiBlZXByb21fYXBtZV9tYXNrKQorCQlhZGFwdGVyLT53b2wgfD0gRTEwMDBfV1VGQ19NQUc7CisKKwkvKiByZXNldCB0aGUgaGFyZHdhcmUgd2l0aCB0aGUgbmV3IHNldHRpbmdzICovCisJZTEwMDBfcmVzZXQoYWRhcHRlcik7CisKKwlzdHJjcHkobmV0ZGV2LT5uYW1lLCAiZXRoJWQiKTsKKwlpZigoZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldikpKQorCQlnb3RvIGVycl9yZWdpc3RlcjsKKworCURQUklOVEsoUFJPQkUsIElORk8sICJJbnRlbChSKSBQUk8vMTAwMCBOZXR3b3JrIENvbm5lY3Rpb25cbiIpOworCisJY2FyZHNfZm91bmQrKzsKKwlyZXR1cm4gMDsKKworZXJyX3JlZ2lzdGVyOgorZXJyX3N3X2luaXQ6CitlcnJfZWVwcm9tOgorCWlvdW5tYXAoYWRhcHRlci0+aHcuaHdfYWRkcik7CitlcnJfaW9yZW1hcDoKKwlmcmVlX25ldGRldihuZXRkZXYpOworZXJyX2FsbG9jX2V0aGVyZGV2OgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBlMTAwMF9yZW1vdmUgLSBEZXZpY2UgUmVtb3ZhbCBSb3V0aW5lCisgKiBAcGRldjogUENJIGRldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3QKKyAqCisgKiBlMTAwMF9yZW1vdmUgaXMgY2FsbGVkIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtIHRvIGFsZXJ0IHRoZSBkcml2ZXIKKyAqIHRoYXQgaXQgc2hvdWxkIHJlbGVhc2UgYSBQQ0kgZGV2aWNlLiAgVGhlIGNvdWxkIGJlIGNhdXNlZCBieSBhCisgKiBIb3QtUGx1ZyBldmVudCwgb3IgYmVjYXVzZSB0aGUgZHJpdmVyIGlzIGdvaW5nIHRvIGJlIHJlbW92ZWQgZnJvbQorICogbWVtb3J5LgorICoqLworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQKK2UxMDAwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXVpbnQzMl90IG1hbmM7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYKKwkgICBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisJCW1hbmMgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1BTkMpOworCQlpZihtYW5jICYgRTEwMDBfTUFOQ19TTUJVU19FTikgeworCQkJbWFuYyB8PSBFMTAwMF9NQU5DX0FSUF9FTjsKKwkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIE1BTkMsIG1hbmMpOworCQl9CisJfQorCisJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKworCWUxMDAwX3BoeV9od19yZXNldCgmYWRhcHRlci0+aHcpOworCisJaW91bm1hcChhZGFwdGVyLT5ody5od19hZGRyKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworLyoqCisgKiBlMTAwMF9zd19pbml0IC0gSW5pdGlhbGl6ZSBnZW5lcmFsIHNvZnR3YXJlIHN0cnVjdHVyZXMgKHN0cnVjdCBlMTAwMF9hZGFwdGVyKQorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlIHRvIGluaXRpYWxpemUKKyAqCisgKiBlMTAwMF9zd19pbml0IGluaXRpYWxpemVzIHRoZSBBZGFwdGVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUuCisgKiBGaWVsZHMgYXJlIGluaXRpYWxpemVkIGJhc2VkIG9uIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gYW5kCisgKiBPUyBuZXR3b3JrIGRldmljZSBzZXR0aW5ncyAoTVRVIHNpemUpLgorICoqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZTEwMDBfc3dfaW5pdChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCisJLyogUENJIGNvbmZpZyBzcGFjZSBpbmZvICovCisKKwlody0+dmVuZG9yX2lkID0gcGRldi0+dmVuZG9yOworCWh3LT5kZXZpY2VfaWQgPSBwZGV2LT5kZXZpY2U7CisJaHctPnN1YnN5c3RlbV92ZW5kb3JfaWQgPSBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCWh3LT5zdWJzeXN0ZW1faWQgPSBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmaHctPnJldmlzaW9uX2lkKTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmaHctPnBjaV9jbWRfd29yZCk7CisKKwlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gRTEwMDBfUlhCVUZGRVJfMjA0ODsKKwlody0+bWF4X2ZyYW1lX3NpemUgPSBuZXRkZXYtPm10dSArCisJCQkgICAgIEVORVRfSEVBREVSX1NJWkUgKyBFVEhFUk5FVF9GQ1NfU0laRTsKKwlody0+bWluX2ZyYW1lX3NpemUgPSBNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkU7CisKKwkvKiBpZGVudGlmeSB0aGUgTUFDICovCisKKwlpZihlMTAwMF9zZXRfbWFjX3R5cGUoaHcpKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgIlVua25vd24gTUFDIFR5cGVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBpbml0aWFsaXplIGVlcHJvbSBwYXJhbWV0ZXJzICovCisKKwllMTAwMF9pbml0X2VlcHJvbV9wYXJhbXMoaHcpOworCisJc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworCWRlZmF1bHQ6CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NDE6CisJY2FzZSBlMTAwMF84MjU0NzoKKwljYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorCWNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisJCWh3LT5waHlfaW5pdF9zY3JpcHQgPSAxOworCQlicmVhazsKKwl9CisKKwllMTAwMF9zZXRfbWVkaWFfdHlwZShodyk7CisKKwlody0+d2FpdF9hdXRvbmVnX2NvbXBsZXRlID0gRkFMU0U7CisJaHctPnRiaV9jb21wYXRpYmlsaXR5X2VuID0gVFJVRTsKKwlody0+YWRhcHRpdmVfaWZzID0gVFJVRTsKKworCS8qIENvcHBlciBvcHRpb25zICovCisKKwlpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCQlody0+bWRpeCA9IEFVVE9fQUxMX01PREVTOworCQlody0+ZGlzYWJsZV9wb2xhcml0eV9jb3JyZWN0aW9uID0gRkFMU0U7CisJCWh3LT5tYXN0ZXJfc2xhdmUgPSBFMTAwMF9NQVNURVJfU0xBVkU7CisJfQorCisJYXRvbWljX3NldCgmYWRhcHRlci0+aXJxX3NlbSwgMSk7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnN0YXRzX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT50eF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGUxMDAwX29wZW4gLSBDYWxsZWQgd2hlbiBhIG5ldHdvcmsgaW50ZXJmYWNlIGlzIG1hZGUgYWN0aXZlCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUKKyAqCisgKiBUaGUgb3BlbiBlbnRyeSBwb2ludCBpcyBjYWxsZWQgd2hlbiBhIG5ldHdvcmsgaW50ZXJmYWNlIGlzIG1hZGUKKyAqIGFjdGl2ZSBieSB0aGUgc3lzdGVtIChJRkZfVVApLiAgQXQgdGhpcyBwb2ludCBhbGwgcmVzb3VyY2VzIG5lZWRlZAorICogZm9yIHRyYW5zbWl0IGFuZCByZWNlaXZlIG9wZXJhdGlvbnMgYXJlIGFsbG9jYXRlZCwgdGhlIGludGVycnVwdAorICogaGFuZGxlciBpcyByZWdpc3RlcmVkIHdpdGggdGhlIE9TLCB0aGUgd2F0Y2hkb2cgdGltZXIgaXMgc3RhcnRlZCwKKyAqIGFuZCB0aGUgc3RhY2sgaXMgbm90aWZpZWQgdGhhdCB0aGUgaW50ZXJmYWNlIGlzIHJlYWR5LgorICoqLworCitzdGF0aWMgaW50CitlMTAwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJaW50IGVycjsKKworCS8qIGFsbG9jYXRlIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCisKKwlpZigoZXJyID0gZTEwMDBfc2V0dXBfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpKSkKKwkJZ290byBlcnJfc2V0dXBfdHg7CisKKwkvKiBhbGxvY2F0ZSByZWNlaXZlIGRlc2NyaXB0b3JzICovCisKKwlpZigoZXJyID0gZTEwMDBfc2V0dXBfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpKSkKKwkJZ290byBlcnJfc2V0dXBfcng7CisKKwlpZigoZXJyID0gZTEwMDBfdXAoYWRhcHRlcikpKQorCQlnb3RvIGVycl91cDsKKworCXJldHVybiBFMTAwMF9TVUNDRVNTOworCitlcnJfdXA6CisJZTEwMDBfZnJlZV9yeF9yZXNvdXJjZXMoYWRhcHRlcik7CitlcnJfc2V0dXBfcng6CisJZTEwMDBfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlcik7CitlcnJfc2V0dXBfdHg6CisJZTEwMDBfcmVzZXQoYWRhcHRlcik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGUxMDAwX2Nsb3NlIC0gRGlzYWJsZXMgYSBuZXR3b3JrIGludGVyZmFjZQorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCwgdGhpcyBpcyBub3QgYWxsb3dlZCB0byBmYWlsCisgKgorICogVGhlIGNsb3NlIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuIGFuIGludGVyZmFjZSBpcyBkZS1hY3RpdmF0ZWQKKyAqIGJ5IHRoZSBPUy4gIFRoZSBoYXJkd2FyZSBpcyBzdGlsbCB1bmRlciB0aGUgZHJpdmVycyBjb250cm9sLCBidXQKKyAqIG5lZWRzIHRvIGJlIGRpc2FibGVkLiAgQSBnbG9iYWwgTUFDIHJlc2V0IGlzIGlzc3VlZCB0byBzdG9wIHRoZQorICogaGFyZHdhcmUsIGFuZCBhbGwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcmVzb3VyY2VzIGFyZSBmcmVlZC4KKyAqKi8KKworc3RhdGljIGludAorZTEwMDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCWUxMDAwX2Rvd24oYWRhcHRlcik7CisKKwllMTAwMF9mcmVlX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKKwllMTAwMF9mcmVlX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGUxMDAwX2NoZWNrXzY0a19ib3VuZCAtIGNoZWNrIHRoYXQgbWVtb3J5IGRvZXNuJ3QgY3Jvc3MgNjRrQiBib3VuZGFyeQorICogQGFkYXB0ZXI6IGFkZHJlc3Mgb2YgYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqIEBiZWdpbjogYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2YgbWVtb3J5CisgKiBAZW5kOiBhZGRyZXNzIG9mIGVuZCBvZiBtZW1vcnkKKyAqKi8KK3N0YXRpYyBpbmxpbmUgYm9vbGVhbl90CitlMTAwMF9jaGVja182NGtfYm91bmQoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCSAgICAgIHZvaWQgKnN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGJlZ2luID0gKHVuc2lnbmVkIGxvbmcpIHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgZW5kID0gYmVnaW4gKyBsZW47CisKKwkvKiBmaXJzdCByZXYgODI1NDUgYW5kIDgyNTQ2IG5lZWQgdG8gbm90IGFsbG93IGFueSBtZW1vcnkKKwkgKiB3cml0ZSBsb2NhdGlvbiB0byBjcm9zcyBhIDY0ayBib3VuZGFyeSBkdWUgdG8gZXJyYXRhIDIzICovCisJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTQ1IHx8CisJICAgIGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTQ2ICkgeworCisJCS8qIGNoZWNrIGJ1ZmZlciBkb2Vzbid0IGNyb3NzIDY0a0IgKi8KKwkJcmV0dXJuICgoYmVnaW4gXiAoZW5kIC0gMSkpID4+IDE2KSAhPSAwID8gRkFMU0UgOiBUUlVFOworCX0KKworCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIGUxMDAwX3NldHVwX3R4X3Jlc291cmNlcyAtIGFsbG9jYXRlIFR4IHJlc291cmNlcyAoRGVzY3JpcHRvcnMpCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKiovCisKK2ludAorZTEwMDBfc2V0dXBfdHhfcmVzb3VyY2VzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnR4ZHIgPSAmYWRhcHRlci0+dHhfcmluZzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJaW50IHNpemU7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBlMTAwMF9idWZmZXIpICogdHhkci0+Y291bnQ7CisJdHhkci0+YnVmZmVyX2luZm8gPSB2bWFsbG9jKHNpemUpOworCWlmKCF0eGRyLT5idWZmZXJfaW5mbykgeworCQlEUFJJTlRLKFBST0JFLCBFUlIsIAorCQkiVW5hYmxlIHRvIEFsbG9jYXRlIE1lbW9yeSBmb3IgdGhlIFRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZ1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQodHhkci0+YnVmZmVyX2luZm8sIDAsIHNpemUpOworCisJLyogcm91bmQgdXAgdG8gbmVhcmVzdCA0SyAqLworCisJdHhkci0+c2l6ZSA9IHR4ZHItPmNvdW50ICogc2l6ZW9mKHN0cnVjdCBlMTAwMF90eF9kZXNjKTsKKwlFMTAwMF9ST1VORFVQKHR4ZHItPnNpemUsIDQwOTYpOworCisJdHhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsICZ0eGRyLT5kbWEpOworCWlmKCF0eGRyLT5kZXNjKSB7CitzZXR1cF90eF9kZXNjX2RpZToKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAKKwkJIlVuYWJsZSB0byBBbGxvY2F0ZSBNZW1vcnkgZm9yIHRoZSBUcmFuc21pdCBkZXNjcmlwdG9yIHJpbmdcbiIpOworCQl2ZnJlZSh0eGRyLT5idWZmZXJfaW5mbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIGZpeCBmb3IgZXJyYXRhIDIzLCBjYW50IGNyb3NzIDY0a0IgYm91bmRhcnkgKi8KKwlpZiAoIWUxMDAwX2NoZWNrXzY0a19ib3VuZChhZGFwdGVyLCB0eGRyLT5kZXNjLCB0eGRyLT5zaXplKSkgeworCQl2b2lkICpvbGRkZXNjID0gdHhkci0+ZGVzYzsKKwkJZG1hX2FkZHJfdCBvbGRkbWEgPSB0eGRyLT5kbWE7CisJCURQUklOVEsoVFhfRVJSLEVSUiwidHhkciBhbGlnbiBjaGVjayBmYWlsZWQ6ICV1IGJ5dGVzIGF0ICVwXG4iLAorCQkgICAgICAgIHR4ZHItPnNpemUsIHR4ZHItPmRlc2MpOworCQkvKiB0cnkgYWdhaW4sIHdpdGhvdXQgZnJlZWluZyB0aGUgcHJldmlvdXMgKi8KKwkJdHhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsICZ0eGRyLT5kbWEpOworCQkvKiBmYWlsZWQgYWxsb2NhdGlvbiwgY3JpdGlhbCBmYWlsdXJlICovCisJCWlmKCF0eGRyLT5kZXNjKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsIG9sZGRlc2MsIG9sZGRtYSk7CisJCQlnb3RvIHNldHVwX3R4X2Rlc2NfZGllOworCQl9CisKKwkJaWYgKCFlMTAwMF9jaGVja182NGtfYm91bmQoYWRhcHRlciwgdHhkci0+ZGVzYywgdHhkci0+c2l6ZSkpIHsKKwkJCS8qIGdpdmUgdXAgKi8KKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgdHhkci0+c2l6ZSwKKwkJCSAgICAgdHhkci0+ZGVzYywgdHhkci0+ZG1hKTsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgdHhkci0+c2l6ZSwgb2xkZGVzYywgb2xkZG1hKTsKKwkJCURQUklOVEsoUFJPQkUsIEVSUiwKKwkJCSAiVW5hYmxlIHRvIEFsbG9jYXRlIGFsaWduZWQgTWVtb3J5IGZvciB0aGUgVHJhbnNtaXQiCisJCSAgICAgICAgICIgZGVzY3JpcHRvciByaW5nXG4iKTsKKwkJCXZmcmVlKHR4ZHItPmJ1ZmZlcl9pbmZvKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9IGVsc2UgeworCQkJLyogZnJlZSBvbGQsIG1vdmUgb24gd2l0aCB0aGUgbmV3IG9uZSBzaW5jZSBpdHMgb2theSAqLworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCB0eGRyLT5zaXplLCBvbGRkZXNjLCBvbGRkbWEpOworCQl9CisJfQorCW1lbXNldCh0eGRyLT5kZXNjLCAwLCB0eGRyLT5zaXplKTsKKworCXR4ZHItPm5leHRfdG9fdXNlID0gMDsKKwl0eGRyLT5uZXh0X3RvX2NsZWFuID0gMDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGUxMDAwX2NvbmZpZ3VyZV90eCAtIENvbmZpZ3VyZSA4MjU0eCBUcmFuc21pdCBVbml0IGFmdGVyIFJlc2V0CisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBDb25maWd1cmUgdGhlIFR4IHVuaXQgb2YgdGhlIE1BQyBhZnRlciBhIHJlc2V0LgorICoqLworCitzdGF0aWMgdm9pZAorZTEwMDBfY29uZmlndXJlX3R4KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXVpbnQ2NF90IHRkYmEgPSBhZGFwdGVyLT50eF9yaW5nLmRtYTsKKwl1aW50MzJfdCB0ZGxlbiA9IGFkYXB0ZXItPnR4X3JpbmcuY291bnQgKiBzaXplb2Yoc3RydWN0IGUxMDAwX3R4X2Rlc2MpOworCXVpbnQzMl90IHRjdGwsIHRpcGc7CisKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUREJBTCwgKHRkYmEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUREJBSCwgKHRkYmEgPj4gMzIpKTsKKworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFRETEVOLCB0ZGxlbik7CisKKwkvKiBTZXR1cCB0aGUgSFcgVHggSGVhZCBhbmQgVGFpbCBkZXNjcmlwdG9yIHBvaW50ZXJzICovCisKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUREgsIDApOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFREVCwgMCk7CisKKwkvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgVHggSW50ZXIgUGFja2V0IEdhcCB0aW1lciAqLworCisJc3dpdGNoIChhZGFwdGVyLT5ody5tYWNfdHlwZSkgeworCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorCQl0aXBnID0gREVGQVVMVF84MjU0Ml9USVBHX0lQR1Q7CisJCXRpcGcgfD0gREVGQVVMVF84MjU0Ml9USVBHX0lQR1IxIDw8IEUxMDAwX1RJUEdfSVBHUjFfU0hJRlQ7CisJCXRpcGcgfD0gREVGQVVMVF84MjU0Ml9USVBHX0lQR1IyIDw8IEUxMDAwX1RJUEdfSVBHUjJfU0hJRlQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmKGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlciB8fAorCQkgICBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKQorCQkJdGlwZyA9IERFRkFVTFRfODI1NDNfVElQR19JUEdUX0ZJQkVSOworCQllbHNlCisJCQl0aXBnID0gREVGQVVMVF84MjU0M19USVBHX0lQR1RfQ09QUEVSOworCQl0aXBnIHw9IERFRkFVTFRfODI1NDNfVElQR19JUEdSMSA8PCBFMTAwMF9USVBHX0lQR1IxX1NISUZUOworCQl0aXBnIHw9IERFRkFVTFRfODI1NDNfVElQR19JUEdSMiA8PCBFMTAwMF9USVBHX0lQR1IyX1NISUZUOworCX0KKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUSVBHLCB0aXBnKTsKKworCS8qIFNldCB0aGUgVHggSW50ZXJydXB0IERlbGF5IHJlZ2lzdGVyICovCisKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUSURWLCBhZGFwdGVyLT50eF9pbnRfZGVsYXkpOworCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQwKQorCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUQURWLCBhZGFwdGVyLT50eF9hYnNfaW50X2RlbGF5KTsKKworCS8qIFByb2dyYW0gdGhlIFRyYW5zbWl0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKworCXRjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRDVEwpOworCisJdGN0bCAmPSB+RTEwMDBfVENUTF9DVDsKKwl0Y3RsIHw9IEUxMDAwX1RDVExfRU4gfCBFMTAwMF9UQ1RMX1BTUCB8CisJCShFMTAwMF9DT0xMSVNJT05fVEhSRVNIT0xEIDw8IEUxMDAwX0NUX1NISUZUKTsKKworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFRDVEwsIHRjdGwpOworCisJZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KCZhZGFwdGVyLT5odyk7CisKKwkvKiBTZXR1cCBUcmFuc21pdCBEZXNjcmlwdG9yIFNldHRpbmdzIGZvciBlb3AgZGVzY3JpcHRvciAqLworCWFkYXB0ZXItPnR4ZF9jbWQgPSBFMTAwMF9UWERfQ01EX0lERSB8IEUxMDAwX1RYRF9DTURfRU9QIHwKKwkJRTEwMDBfVFhEX0NNRF9JRkNTOworCisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0MykKKwkJYWRhcHRlci0+dHhkX2NtZCB8PSBFMTAwMF9UWERfQ01EX1JQUzsKKwllbHNlCisJCWFkYXB0ZXItPnR4ZF9jbWQgfD0gRTEwMDBfVFhEX0NNRF9SUzsKKworCS8qIENhY2hlIGlmIHdlJ3JlIDgyNTQ0IHJ1bm5pbmcgaW4gUENJLVggYmVjYXVzZSB3ZSdsbAorCSAqIG5lZWQgdGhpcyB0byBhcHBseSBhIHdvcmthcm91bmQgbGF0ZXIgaW4gdGhlIHNlbmQgcGF0aC4gKi8KKwlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NCAmJgorCSAgIGFkYXB0ZXItPmh3LmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaXgpCisJCWFkYXB0ZXItPnBjaXhfODI1NDQgPSAxOworfQorCisvKioKKyAqIGUxMDAwX3NldHVwX3J4X3Jlc291cmNlcyAtIGFsbG9jYXRlIFJ4IHJlc291cmNlcyAoRGVzY3JpcHRvcnMpCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICoqLworCitpbnQKK2UxMDAwX3NldHVwX3J4X3Jlc291cmNlcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICpyeGRyID0gJmFkYXB0ZXItPnJ4X3Jpbmc7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCWludCBzaXplOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfYnVmZmVyKSAqIHJ4ZHItPmNvdW50OworCXJ4ZHItPmJ1ZmZlcl9pbmZvID0gdm1hbGxvYyhzaXplKTsKKwlpZighcnhkci0+YnVmZmVyX2luZm8pIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAKKwkJIlVuYWJsZSB0byBBbGxvY2F0ZSBNZW1vcnkgZm9yIHRoZSBSZWNpZXZlIGRlc2NyaXB0b3IgcmluZ1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocnhkci0+YnVmZmVyX2luZm8sIDAsIHNpemUpOworCisJLyogUm91bmQgdXAgdG8gbmVhcmVzdCA0SyAqLworCisJcnhkci0+c2l6ZSA9IHJ4ZHItPmNvdW50ICogc2l6ZW9mKHN0cnVjdCBlMTAwMF9yeF9kZXNjKTsKKwlFMTAwMF9ST1VORFVQKHJ4ZHItPnNpemUsIDQwOTYpOworCisJcnhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHJ4ZHItPnNpemUsICZyeGRyLT5kbWEpOworCisJaWYoIXJ4ZHItPmRlc2MpIHsKK3NldHVwX3J4X2Rlc2NfZGllOgorCQlEUFJJTlRLKFBST0JFLCBFUlIsIAorCQkiVW5ibGUgdG8gQWxsb2NhdGUgTWVtb3J5IGZvciB0aGUgUmVjaWV2ZSBkZXNjcmlwdG9yIHJpbmdcbiIpOworCQl2ZnJlZShyeGRyLT5idWZmZXJfaW5mbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIGZpeCBmb3IgZXJyYXRhIDIzLCBjYW50IGNyb3NzIDY0a0IgYm91bmRhcnkgKi8KKwlpZiAoIWUxMDAwX2NoZWNrXzY0a19ib3VuZChhZGFwdGVyLCByeGRyLT5kZXNjLCByeGRyLT5zaXplKSkgeworCQl2b2lkICpvbGRkZXNjID0gcnhkci0+ZGVzYzsKKwkJZG1hX2FkZHJfdCBvbGRkbWEgPSByeGRyLT5kbWE7CisJCURQUklOVEsoUlhfRVJSLEVSUiwKKwkJCSJyeGRyIGFsaWduIGNoZWNrIGZhaWxlZDogJXUgYnl0ZXMgYXQgJXBcbiIsCisJCQlyeGRyLT5zaXplLCByeGRyLT5kZXNjKTsKKwkJLyogdHJ5IGFnYWluLCB3aXRob3V0IGZyZWVpbmcgdGhlIHByZXZpb3VzICovCisJCXJ4ZHItPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLCAmcnhkci0+ZG1hKTsKKwkJLyogZmFpbGVkIGFsbG9jYXRpb24sIGNyaXRpYWwgZmFpbHVyZSAqLworCQlpZighcnhkci0+ZGVzYykgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLCBvbGRkZXNjLCBvbGRkbWEpOworCQkJZ290byBzZXR1cF9yeF9kZXNjX2RpZTsKKwkJfQorCisJCWlmICghZTEwMDBfY2hlY2tfNjRrX2JvdW5kKGFkYXB0ZXIsIHJ4ZHItPmRlc2MsIHJ4ZHItPnNpemUpKSB7CisJCQkvKiBnaXZlIHVwICovCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHJ4ZHItPnNpemUsCisJCQkgICAgIHJ4ZHItPmRlc2MsIHJ4ZHItPmRtYSk7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHJ4ZHItPnNpemUsIG9sZGRlc2MsIG9sZGRtYSk7CisJCQlEUFJJTlRLKFBST0JFLCBFUlIsIAorCQkJCSJVbmFibGUgdG8gQWxsb2NhdGUgYWxpZ25lZCBNZW1vcnkgZm9yIHRoZSIKKwkJCQkiIFJlY2VpdmUgZGVzY3JpcHRvciByaW5nXG4iKTsKKwkJCXZmcmVlKHJ4ZHItPmJ1ZmZlcl9pbmZvKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9IGVsc2UgeworCQkJLyogZnJlZSBvbGQsIG1vdmUgb24gd2l0aCB0aGUgbmV3IG9uZSBzaW5jZSBpdHMgb2theSAqLworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLCBvbGRkZXNjLCBvbGRkbWEpOworCQl9CisJfQorCW1lbXNldChyeGRyLT5kZXNjLCAwLCByeGRyLT5zaXplKTsKKworCXJ4ZHItPm5leHRfdG9fY2xlYW4gPSAwOworCXJ4ZHItPm5leHRfdG9fdXNlID0gMDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGUxMDAwX3NldHVwX3JjdGwgLSBjb25maWd1cmUgdGhlIHJlY2VpdmUgY29udHJvbCByZWdpc3RlcgorICogQGFkYXB0ZXI6IEJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyB2b2lkCitlMTAwMF9zZXR1cF9yY3RsKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXVpbnQzMl90IHJjdGw7CisKKwlyY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMKTsKKworCXJjdGwgJj0gfigzIDw8IEUxMDAwX1JDVExfTU9fU0hJRlQpOworCisJcmN0bCB8PSBFMTAwMF9SQ1RMX0VOIHwgRTEwMDBfUkNUTF9CQU0gfAorCQlFMTAwMF9SQ1RMX0xCTV9OTyB8IEUxMDAwX1JDVExfUkRNVFNfSEFMRiB8CisJCShhZGFwdGVyLT5ody5tY19maWx0ZXJfdHlwZSA8PCBFMTAwMF9SQ1RMX01PX1NISUZUKTsKKworCWlmKGFkYXB0ZXItPmh3LnRiaV9jb21wYXRpYmlsaXR5X29uID09IDEpCisJCXJjdGwgfD0gRTEwMDBfUkNUTF9TQlA7CisJZWxzZQorCQlyY3RsICY9IH5FMTAwMF9SQ1RMX1NCUDsKKworCS8qIFNldHVwIGJ1ZmZlciBzaXplcyAqLworCXJjdGwgJj0gfihFMTAwMF9SQ1RMX1NaXzQwOTYpOworCXJjdGwgfD0gKEUxMDAwX1JDVExfQlNFWCB8IEUxMDAwX1JDVExfTFBFKTsKKwlzd2l0Y2ggKGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4pIHsKKwljYXNlIEUxMDAwX1JYQlVGRkVSXzIwNDg6CisJZGVmYXVsdDoKKwkJcmN0bCB8PSBFMTAwMF9SQ1RMX1NaXzIwNDg7CisJCXJjdGwgJj0gfihFMTAwMF9SQ1RMX0JTRVggfCBFMTAwMF9SQ1RMX0xQRSk7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfUlhCVUZGRVJfNDA5NjoKKwkJcmN0bCB8PSBFMTAwMF9SQ1RMX1NaXzQwOTY7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfUlhCVUZGRVJfODE5MjoKKwkJcmN0bCB8PSBFMTAwMF9SQ1RMX1NaXzgxOTI7CisJCWJyZWFrOworCWNhc2UgRTEwMDBfUlhCVUZGRVJfMTYzODQ6CisJCXJjdGwgfD0gRTEwMDBfUkNUTF9TWl8xNjM4NDsKKwkJYnJlYWs7CisJfQorCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkNUTCwgcmN0bCk7Cit9CisKKy8qKgorICogZTEwMDBfY29uZmlndXJlX3J4IC0gQ29uZmlndXJlIDgyNTR4IFJlY2VpdmUgVW5pdCBhZnRlciBSZXNldAorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogQ29uZmlndXJlIHRoZSBSeCB1bml0IG9mIHRoZSBNQUMgYWZ0ZXIgYSByZXNldC4KKyAqKi8KKworc3RhdGljIHZvaWQKK2UxMDAwX2NvbmZpZ3VyZV9yeChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1aW50NjRfdCByZGJhID0gYWRhcHRlci0+cnhfcmluZy5kbWE7CisJdWludDMyX3QgcmRsZW4gPSBhZGFwdGVyLT5yeF9yaW5nLmNvdW50ICogc2l6ZW9mKHN0cnVjdCBlMTAwMF9yeF9kZXNjKTsKKwl1aW50MzJfdCByY3RsOworCXVpbnQzMl90IHJ4Y3N1bTsKKworCS8qIGRpc2FibGUgcmVjZWl2ZXMgd2hpbGUgc2V0dGluZyB1cCB0aGUgZGVzY3JpcHRvcnMgKi8KKwlyY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsICYgfkUxMDAwX1JDVExfRU4pOworCisJLyogc2V0IHRoZSBSZWNlaXZlIERlbGF5IFRpbWVyIFJlZ2lzdGVyICovCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkRUUiwgYWRhcHRlci0+cnhfaW50X2RlbGF5KTsKKworCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQwKSB7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJBRFYsIGFkYXB0ZXItPnJ4X2Fic19pbnRfZGVsYXkpOworCQlpZihhZGFwdGVyLT5pdHIgPiAxKQorCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVRSLAorCQkJCTEwMDAwMDAwMDAgLyAoYWRhcHRlci0+aXRyICogMjU2KSk7CisJfQorCisJLyogU2V0dXAgdGhlIEJhc2UgYW5kIExlbmd0aCBvZiB0aGUgUnggRGVzY3JpcHRvciBSaW5nICovCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkRCQUwsIChyZGJhICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSk7CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkRCQUgsIChyZGJhID4+IDMyKSk7CisKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRExFTiwgcmRsZW4pOworCisJLyogU2V0dXAgdGhlIEhXIFJ4IEhlYWQgYW5kIFRhaWwgRGVzY3JpcHRvciBQb2ludGVycyAqLworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJESCwgMCk7CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkRULCAwKTsKKworCS8qIEVuYWJsZSA4MjU0MyBSZWNlaXZlIENoZWNrc3VtIE9mZmxvYWQgZm9yIFRDUCBhbmQgVURQICovCisJaWYoKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQzKSAmJgorCSAgIChhZGFwdGVyLT5yeF9jc3VtID09IFRSVUUpKSB7CisJCXJ4Y3N1bSA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUlhDU1VNKTsKKwkJcnhjc3VtIHw9IEUxMDAwX1JYQ1NVTV9UVU9GTDsKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUlhDU1VNLCByeGNzdW0pOworCX0KKworCS8qIEVuYWJsZSBSZWNlaXZlcyAqLworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOworfQorCisvKioKKyAqIGUxMDAwX2ZyZWVfdHhfcmVzb3VyY2VzIC0gRnJlZSBUeCBSZXNvdXJjZXMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIEZyZWUgYWxsIHRyYW5zbWl0IHNvZnR3YXJlIHJlc291cmNlcworICoqLworCit2b2lkCitlMTAwMF9mcmVlX3R4X3Jlc291cmNlcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisKKwllMTAwMF9jbGVhbl90eF9yaW5nKGFkYXB0ZXIpOworCisJdmZyZWUoYWRhcHRlci0+dHhfcmluZy5idWZmZXJfaW5mbyk7CisJYWRhcHRlci0+dHhfcmluZy5idWZmZXJfaW5mbyA9IE5VTEw7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIGFkYXB0ZXItPnR4X3Jpbmcuc2l6ZSwKKwkgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXItPnR4X3JpbmcuZGVzYywgYWRhcHRlci0+dHhfcmluZy5kbWEpOworCisJYWRhcHRlci0+dHhfcmluZy5kZXNjID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitlMTAwMF91bm1hcF9hbmRfZnJlZV90eF9yZXNvdXJjZShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwKKwkJCXN0cnVjdCBlMTAwMF9idWZmZXIgKmJ1ZmZlcl9pbmZvKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKworCWlmKGJ1ZmZlcl9pbmZvLT5kbWEpIHsKKwkJcGNpX3VubWFwX3BhZ2UocGRldiwKKwkJCSAgICAgICBidWZmZXJfaW5mby0+ZG1hLAorCQkJICAgICAgIGJ1ZmZlcl9pbmZvLT5sZW5ndGgsCisJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJCWJ1ZmZlcl9pbmZvLT5kbWEgPSAwOworCX0KKwlpZihidWZmZXJfaW5mby0+c2tiKSB7CisJCWRldl9rZnJlZV9za2JfYW55KGJ1ZmZlcl9pbmZvLT5za2IpOworCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKKwl9Cit9CisKKy8qKgorICogZTEwMDBfY2xlYW5fdHhfcmluZyAtIEZyZWUgVHggQnVmZmVycworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyB2b2lkCitlMTAwMF9jbGVhbl90eF9yaW5nKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZzsKKwlzdHJ1Y3QgZTEwMDBfYnVmZmVyICpidWZmZXJfaW5mbzsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBGcmVlIGFsbCB0aGUgVHggcmluZyBza19idWZmcyAqLworCisJaWYgKGxpa2VseShhZGFwdGVyLT5wcmV2aW91c19idWZmZXJfaW5mby5za2IgIT0gTlVMTCkpIHsKKwkJZTEwMDBfdW5tYXBfYW5kX2ZyZWVfdHhfcmVzb3VyY2UoYWRhcHRlciwgCisJCQkJJmFkYXB0ZXItPnByZXZpb3VzX2J1ZmZlcl9pbmZvKTsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCB0eF9yaW5nLT5jb3VudDsgaSsrKSB7CisJCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCQllMTAwMF91bm1hcF9hbmRfZnJlZV90eF9yZXNvdXJjZShhZGFwdGVyLCBidWZmZXJfaW5mbyk7CisJfQorCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfYnVmZmVyKSAqIHR4X3JpbmctPmNvdW50OworCW1lbXNldCh0eF9yaW5nLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CisKKwkvKiBaZXJvIG91dCB0aGUgZGVzY3JpcHRvciByaW5nICovCisKKwltZW1zZXQodHhfcmluZy0+ZGVzYywgMCwgdHhfcmluZy0+c2l6ZSk7CisKKwl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7CisJdHhfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7CisKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUREgsIDApOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFREVCwgMCk7Cit9CisKKy8qKgorICogZTEwMDBfZnJlZV9yeF9yZXNvdXJjZXMgLSBGcmVlIFJ4IFJlc291cmNlcworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogRnJlZSBhbGwgcmVjZWl2ZSBzb2Z0d2FyZSByZXNvdXJjZXMKKyAqKi8KKwordm9pZAorZTEwMDBfZnJlZV9yeF9yZXNvdXJjZXMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKworCWUxMDAwX2NsZWFuX3J4X3JpbmcoYWRhcHRlcik7CisKKwl2ZnJlZShyeF9yaW5nLT5idWZmZXJfaW5mbyk7CisJcnhfcmluZy0+YnVmZmVyX2luZm8gPSBOVUxMOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCByeF9yaW5nLT5zaXplLCByeF9yaW5nLT5kZXNjLCByeF9yaW5nLT5kbWEpOworCisJcnhfcmluZy0+ZGVzYyA9IE5VTEw7Cit9CisKKy8qKgorICogZTEwMDBfY2xlYW5fcnhfcmluZyAtIEZyZWUgUnggQnVmZmVycworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyB2b2lkCitlMTAwMF9jbGVhbl9yeF9yaW5nKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKKwlzdHJ1Y3QgZTEwMDBfYnVmZmVyICpidWZmZXJfaW5mbzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGludCBpOworCisJLyogRnJlZSBhbGwgdGhlIFJ4IHJpbmcgc2tfYnVmZnMgKi8KKworCWZvcihpID0gMDsgaSA8IHJ4X3JpbmctPmNvdW50OyBpKyspIHsKKwkJYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCWlmKGJ1ZmZlcl9pbmZvLT5za2IpIHsKKworCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LAorCQkJCQkgYnVmZmVyX2luZm8tPmRtYSwKKwkJCQkJIGJ1ZmZlcl9pbmZvLT5sZW5ndGgsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQlkZXZfa2ZyZWVfc2tiKGJ1ZmZlcl9pbmZvLT5za2IpOworCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisJCX0KKwl9CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBlMTAwMF9idWZmZXIpICogcnhfcmluZy0+Y291bnQ7CisJbWVtc2V0KHJ4X3JpbmctPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKKworCS8qIFplcm8gb3V0IHRoZSBkZXNjcmlwdG9yIHJpbmcgKi8KKworCW1lbXNldChyeF9yaW5nLT5kZXNjLCAwLCByeF9yaW5nLT5zaXplKTsKKworCXJ4X3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOworCXJ4X3JpbmctPm5leHRfdG9fdXNlID0gMDsKKworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJESCwgMCk7CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkRULCAwKTsKK30KKworLyogVGhlIDgyNTQyIDIuMCAocmV2aXNpb24gMikgbmVlZHMgdG8gaGF2ZSB0aGUgcmVjZWl2ZSB1bml0IGluIHJlc2V0CisgKiBhbmQgbWVtb3J5IHdyaXRlIGFuZCBpbnZhbGlkYXRlIGRpc2FibGVkIGZvciBjZXJ0YWluIG9wZXJhdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2UxMDAwX2VudGVyXzgyNTQyX3JzdChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXVpbnQzMl90IHJjdGw7CisKKwllMTAwMF9wY2lfY2xlYXJfbXdpKCZhZGFwdGVyLT5odyk7CisKKwlyY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMKTsKKwlyY3RsIHw9IEUxMDAwX1JDVExfUlNUOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOworCUUxMDAwX1dSSVRFX0ZMVVNIKCZhZGFwdGVyLT5odyk7CisJbWRlbGF5KDUpOworCisJaWYobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQllMTAwMF9jbGVhbl9yeF9yaW5nKGFkYXB0ZXIpOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfbGVhdmVfODI1NDJfcnN0KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJdWludDMyX3QgcmN0bDsKKworCXJjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJDVEwpOworCXJjdGwgJj0gfkUxMDAwX1JDVExfUlNUOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOworCUUxMDAwX1dSSVRFX0ZMVVNIKCZhZGFwdGVyLT5odyk7CisJbWRlbGF5KDUpOworCisJaWYoYWRhcHRlci0+aHcucGNpX2NtZF93b3JkICYgUENJX0NPTU1BTkRfSU5WQUxJREFURSkKKwkJZTEwMDBfcGNpX3NldF9td2koJmFkYXB0ZXItPmh3KTsKKworCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQllMTAwMF9jb25maWd1cmVfcngoYWRhcHRlcik7CisJCWUxMDAwX2FsbG9jX3J4X2J1ZmZlcnMoYWRhcHRlcik7CisJfQorfQorCisvKioKKyAqIGUxMDAwX3NldF9tYWMgLSBDaGFuZ2UgdGhlIEV0aGVybmV0IEFkZHJlc3Mgb2YgdGhlIE5JQworICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQHA6IHBvaW50ZXIgdG8gYW4gYWRkcmVzcyBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICoqLworCitzdGF0aWMgaW50CitlMTAwMF9zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKKworCWlmKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwkvKiA4MjU0MiAyLjAgbmVlZHMgdG8gYmUgaW4gcmVzZXQgdG8gd3JpdGUgcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVycyAqLworCisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKQorCQllMTAwMF9lbnRlcl84MjU0Ml9yc3QoYWRhcHRlcik7CisKKwltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CisJbWVtY3B5KGFkYXB0ZXItPmh3Lm1hY19hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKKworCWUxMDAwX3Jhcl9zZXQoJmFkYXB0ZXItPmh3LCBhZGFwdGVyLT5ody5tYWNfYWRkciwgMCk7CisKKwlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApCisJCWUxMDAwX2xlYXZlXzgyNTQyX3JzdChhZGFwdGVyKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGUxMDAwX3NldF9tdWx0aSAtIE11bHRpY2FzdCBhbmQgUHJvbWlzY3VvdXMgbW9kZSBzZXQKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGUgc2V0X211bHRpIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgbXVsdGljYXN0IGFkZHJlc3MKKyAqIGxpc3Qgb3IgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGZsYWdzIGFyZSB1cGRhdGVkLiAgVGhpcyByb3V0aW5lIGlzCisgKiByZXNwb25zaWJsZSBmb3IgY29uZmlndXJpbmcgdGhlIGhhcmR3YXJlIGZvciBwcm9wZXIgbXVsdGljYXN0LAorICogcHJvbWlzY3VvdXMgbW9kZSwgYW5kIGFsbC1tdWx0aSBiZWhhdmlvci4KKyAqKi8KKworc3RhdGljIHZvaWQKK2UxMDAwX3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJc3RydWN0IGRldl9tY19saXN0ICptY19wdHI7CisJdWludDMyX3QgcmN0bDsKKwl1aW50MzJfdCBoYXNoX3ZhbHVlOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBDaGVjayBmb3IgUHJvbWlzY3VvdXMgYW5kIEFsbCBNdWx0aWNhc3QgbW9kZXMgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT50eF9sb2NrLCBmbGFncyk7CisKKwlyY3RsID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJDVEwpOworCisJaWYobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCXJjdGwgfD0gKEUxMDAwX1JDVExfVVBFIHwgRTEwMDBfUkNUTF9NUEUpOworCX0gZWxzZSBpZihuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCXJjdGwgfD0gRTEwMDBfUkNUTF9NUEU7CisJCXJjdGwgJj0gfkUxMDAwX1JDVExfVVBFOworCX0gZWxzZSB7CisJCXJjdGwgJj0gfihFMTAwMF9SQ1RMX1VQRSB8IEUxMDAwX1JDVExfTVBFKTsKKwl9CisKKwlFMTAwMF9XUklURV9SRUcoaHcsIFJDVEwsIHJjdGwpOworCisJLyogODI1NDIgMi4wIG5lZWRzIHRvIGJlIGluIHJlc2V0IHRvIHdyaXRlIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlcnMgKi8KKworCWlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApCisJCWUxMDAwX2VudGVyXzgyNTQyX3JzdChhZGFwdGVyKTsKKworCS8qIGxvYWQgdGhlIGZpcnN0IDE0IG11bHRpY2FzdCBhZGRyZXNzIGludG8gdGhlIGV4YWN0IGZpbHRlcnMgMS0xNAorCSAqIFJBUiAwIGlzIHVzZWQgZm9yIHRoZSBzdGF0aW9uIE1BQyBhZGRkcmVzcworCSAqIGlmIHRoZXJlIGFyZSBub3QgMTQgYWRkcmVzc2VzLCBnbyBhaGVhZCBhbmQgY2xlYXIgdGhlIGZpbHRlcnMKKwkgKi8KKwltY19wdHIgPSBuZXRkZXYtPm1jX2xpc3Q7CisKKwlmb3IoaSA9IDE7IGkgPCBFMTAwMF9SQVJfRU5UUklFUzsgaSsrKSB7CisJCWlmKG1jX3B0cikgeworCQkJZTEwMDBfcmFyX3NldChodywgbWNfcHRyLT5kbWlfYWRkciwgaSk7CisJCQltY19wdHIgPSBtY19wdHItPm5leHQ7CisJCX0gZWxzZSB7CisJCQlFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCBpIDw8IDEsIDApOworCQkJRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgKGkgPDwgMSkgKyAxLCAwKTsKKwkJfQorCX0KKworCS8qIGNsZWFyIHRoZSBvbGQgc2V0dGluZ3MgZnJvbSB0aGUgbXVsdGljYXN0IGhhc2ggdGFibGUgKi8KKworCWZvcihpID0gMDsgaSA8IEUxMDAwX05VTV9NVEFfUkVHSVNURVJTOyBpKyspCisJCUUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgTVRBLCBpLCAwKTsKKworCS8qIGxvYWQgYW55IHJlbWFpbmluZyBhZGRyZXNzZXMgaW50byB0aGUgaGFzaCB0YWJsZSAqLworCisJZm9yKDsgbWNfcHRyOyBtY19wdHIgPSBtY19wdHItPm5leHQpIHsKKwkJaGFzaF92YWx1ZSA9IGUxMDAwX2hhc2hfbWNfYWRkcihodywgbWNfcHRyLT5kbWlfYWRkcik7CisJCWUxMDAwX210YV9zZXQoaHcsIGhhc2hfdmFsdWUpOworCX0KKworCWlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApCisJCWUxMDAwX2xlYXZlXzgyNTQyX3JzdChhZGFwdGVyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnR4X2xvY2ssIGZsYWdzKTsKK30KKworLyogTmVlZCB0byB3YWl0IGEgZmV3IHNlY29uZHMgYWZ0ZXIgbGluayB1cCB0byBnZXQgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmcm9tCisgKiB0aGUgcGh5ICovCisKK3N0YXRpYyB2b2lkCitlMTAwMF91cGRhdGVfcGh5X2luZm8odW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBlMTAwMF9hZGFwdGVyICopIGRhdGE7CisJZTEwMDBfcGh5X2dldF9pbmZvKCZhZGFwdGVyLT5odywgJmFkYXB0ZXItPnBoeV9pbmZvKTsKK30KKworLyoqCisgKiBlMTAwMF84MjU0N190eF9maWZvX3N0YWxsIC0gVGltZXIgQ2FsbC1iYWNrCisgKiBAZGF0YTogcG9pbnRlciB0byBhZGFwdGVyIGNhc3QgaW50byBhbiB1bnNpZ25lZCBsb25nCisgKiovCisKK3N0YXRpYyB2b2lkCitlMTAwMF84MjU0N190eF9maWZvX3N0YWxsKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqKSBkYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJdWludDMyX3QgdGN0bDsKKworCWlmKGF0b21pY19yZWFkKCZhZGFwdGVyLT50eF9maWZvX3N0YWxsKSkgeworCQlpZigoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBURFQpID09CisJCSAgICBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRESCkpICYmCisJCSAgIChFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRERlQpID09CisJCSAgICBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRERkgpKSAmJgorCQkgICAoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBUREZUUykgPT0KKwkJICAgIEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVERGSFMpKSkgeworCQkJdGN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVENUTCk7CisJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUQ1RMLAorCQkJCQl0Y3RsICYgfkUxMDAwX1RDVExfRU4pOworCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVERGVCwKKwkJCQkJYWRhcHRlci0+dHhfaGVhZF9hZGRyKTsKKwkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFRERkgsCisJCQkJCWFkYXB0ZXItPnR4X2hlYWRfYWRkcik7CisJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUREZUUywKKwkJCQkJYWRhcHRlci0+dHhfaGVhZF9hZGRyKTsKKwkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFRERkhTLAorCQkJCQlhZGFwdGVyLT50eF9oZWFkX2FkZHIpOworCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVENUTCwgdGN0bCk7CisJCQlFMTAwMF9XUklURV9GTFVTSCgmYWRhcHRlci0+aHcpOworCisJCQlhZGFwdGVyLT50eF9maWZvX2hlYWQgPSAwOworCQkJYXRvbWljX3NldCgmYWRhcHRlci0+dHhfZmlmb19zdGFsbCwgMCk7CisJCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisJCX0gZWxzZSB7CisJCQltb2RfdGltZXIoJmFkYXB0ZXItPnR4X2ZpZm9fc3RhbGxfdGltZXIsIGppZmZpZXMgKyAxKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBlMTAwMF93YXRjaGRvZyAtIFRpbWVyIENhbGwtYmFjaworICogQGRhdGE6IHBvaW50ZXIgdG8gYWRhcHRlciBjYXN0IGludG8gYW4gdW5zaWduZWQgbG9uZworICoqLworc3RhdGljIHZvaWQKK2UxMDAwX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqKSBkYXRhOworCisJLyogRG8gdGhlIHJlc3Qgb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dCAqLworCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPndhdGNoZG9nX3Rhc2spOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfd2F0Y2hkb2dfdGFzayhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnR4ZHIgPSAmYWRhcHRlci0+dHhfcmluZzsKKwl1aW50MzJfdCBsaW5rOworCisJZTEwMDBfY2hlY2tfZm9yX2xpbmsoJmFkYXB0ZXItPmh3KTsKKworCWlmKChhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSAmJgorCSAgICEoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBUWENXKSAmIEUxMDAwX1RYQ1dfQU5FKSkKKwkJbGluayA9ICFhZGFwdGVyLT5ody5zZXJkZXNfbGlua19kb3duOworCWVsc2UKKwkJbGluayA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19MVTsKKworCWlmKGxpbmspIHsKKwkJaWYoIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQkJZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoJmFkYXB0ZXItPmh3LAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkYXB0ZXItPmxpbmtfc3BlZWQsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRhcHRlci0+bGlua19kdXBsZXgpOworCisJCQlEUFJJTlRLKExJTkssIElORk8sICJOSUMgTGluayBpcyBVcCAlZCBNYnBzICVzXG4iLAorCQkJICAgICAgIGFkYXB0ZXItPmxpbmtfc3BlZWQsCisJCQkgICAgICAgYWRhcHRlci0+bGlua19kdXBsZXggPT0gRlVMTF9EVVBMRVggPworCQkJICAgICAgICJGdWxsIER1cGxleCIgOiAiSGFsZiBEdXBsZXgiKTsKKworCQkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOworCQkJbW9kX3RpbWVyKCZhZGFwdGVyLT5waHlfaW5mb190aW1lciwgamlmZmllcyArIDIgKiBIWik7CisJCQlhZGFwdGVyLT5zbWFydHNwZWVkID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWlmKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IDA7CisJCQlhZGFwdGVyLT5saW5rX2R1cGxleCA9IDA7CisJCQlEUFJJTlRLKExJTkssIElORk8sICJOSUMgTGluayBpcyBEb3duXG4iKTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCQltb2RfdGltZXIoJmFkYXB0ZXItPnBoeV9pbmZvX3RpbWVyLCBqaWZmaWVzICsgMiAqIEhaKTsKKwkJfQorCisJCWUxMDAwX3NtYXJ0c3BlZWQoYWRhcHRlcik7CisJfQorCisJZTEwMDBfdXBkYXRlX3N0YXRzKGFkYXB0ZXIpOworCisJYWRhcHRlci0+aHcudHhfcGFja2V0X2RlbHRhID0gYWRhcHRlci0+c3RhdHMudHB0IC0gYWRhcHRlci0+dHB0X29sZDsKKwlhZGFwdGVyLT50cHRfb2xkID0gYWRhcHRlci0+c3RhdHMudHB0OworCWFkYXB0ZXItPmh3LmNvbGxpc2lvbl9kZWx0YSA9IGFkYXB0ZXItPnN0YXRzLmNvbGMgLSBhZGFwdGVyLT5jb2xjX29sZDsKKwlhZGFwdGVyLT5jb2xjX29sZCA9IGFkYXB0ZXItPnN0YXRzLmNvbGM7CisKKwlhZGFwdGVyLT5nb3JjbCA9IGFkYXB0ZXItPnN0YXRzLmdvcmNsIC0gYWRhcHRlci0+Z29yY2xfb2xkOworCWFkYXB0ZXItPmdvcmNsX29sZCA9IGFkYXB0ZXItPnN0YXRzLmdvcmNsOworCWFkYXB0ZXItPmdvdGNsID0gYWRhcHRlci0+c3RhdHMuZ290Y2wgLSBhZGFwdGVyLT5nb3RjbF9vbGQ7CisJYWRhcHRlci0+Z290Y2xfb2xkID0gYWRhcHRlci0+c3RhdHMuZ290Y2w7CisKKwllMTAwMF91cGRhdGVfYWRhcHRpdmUoJmFkYXB0ZXItPmh3KTsKKworCWlmKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJaWYoRTEwMDBfREVTQ19VTlVTRUQodHhkcikgKyAxIDwgdHhkci0+Y291bnQpIHsKKwkJCS8qIFdlJ3ZlIGxvc3QgbGluaywgc28gdGhlIGNvbnRyb2xsZXIgc3RvcHMgRE1BLAorCQkJICogYnV0IHdlJ3ZlIGdvdCBxdWV1ZWQgVHggd29yayB0aGF0J3MgbmV2ZXIgZ29pbmcKKwkJCSAqIHRvIGdldCBkb25lLCBzbyByZXNldCBjb250cm9sbGVyIHRvIGZsdXNoIFR4LgorCQkJICogKERvIHRoZSByZXNldCBvdXRzaWRlIG9mIGludGVycnVwdCBjb250ZXh0KS4gKi8KKwkJCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnR4X3RpbWVvdXRfdGFzayk7CisJCX0KKwl9CisKKwkvKiBEeW5hbWljIG1vZGUgZm9yIEludGVycnVwdCBUaHJvdHRsZSBSYXRlIChJVFIpICovCisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYgYWRhcHRlci0+aXRyID09IDEpIHsKKwkJLyogU3ltbWV0cmljIFR4L1J4IGdldHMgYSByZWR1Y2VkIElUUj0yMDAwOyBUb3RhbAorCQkgKiBhc3ltbWV0cmljYWwgVHggb3IgUnggZ2V0cyBJVFI9ODAwMDsgZXZlcnlvbmUKKwkJICogZWxzZSBpcyBiZXR3ZWVuIDIwMDAtODAwMC4gKi8KKwkJdWludDMyX3QgZ29jID0gKGFkYXB0ZXItPmdvdGNsICsgYWRhcHRlci0+Z29yY2wpIC8gMTAwMDA7CisJCXVpbnQzMl90IGRpZiA9IChhZGFwdGVyLT5nb3RjbCA+IGFkYXB0ZXItPmdvcmNsID8gCisJCQlhZGFwdGVyLT5nb3RjbCAtIGFkYXB0ZXItPmdvcmNsIDoKKwkJCWFkYXB0ZXItPmdvcmNsIC0gYWRhcHRlci0+Z290Y2wpIC8gMTAwMDA7CisJCXVpbnQzMl90IGl0ciA9IGdvYyA+IDAgPyAoZGlmICogNjAwMCAvIGdvYyArIDIwMDApIDogODAwMDsKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVRSLCAxMDAwMDAwMDAwIC8gKGl0ciAqIDI1NikpOworCX0KKworCS8qIENhdXNlIHNvZnR3YXJlIGludGVycnVwdCB0byBlbnN1cmUgcnggcmluZyBpcyBjbGVhbmVkICovCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSUNTLCBFMTAwMF9JQ1NfUlhETVQwKTsKKworCS8qIEZvcmNlIGRldGVjdGlvbiBvZiBodW5nIGNvbnRyb2xsZXIgZXZlcnkgd2F0Y2hkb2cgcGVyaW9kKi8KKwlhZGFwdGVyLT5kZXRlY3RfdHhfaHVuZyA9IFRSVUU7CisKKwkvKiBSZXNldCB0aGUgdGltZXIgKi8KKwltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzICsgMiAqIEhaKTsKK30KKworI2RlZmluZSBFMTAwMF9UWF9GTEFHU19DU1VNCQkweDAwMDAwMDAxCisjZGVmaW5lIEUxMDAwX1RYX0ZMQUdTX1ZMQU4JCTB4MDAwMDAwMDIKKyNkZWZpbmUgRTEwMDBfVFhfRkxBR1NfVFNPCQkweDAwMDAwMDA0CisjZGVmaW5lIEUxMDAwX1RYX0ZMQUdTX1ZMQU5fTUFTSwkweGZmZmYwMDAwCisjZGVmaW5lIEUxMDAwX1RYX0ZMQUdTX1ZMQU5fU0hJRlQJMTYKKworc3RhdGljIGlubGluZSBpbnQKK2UxMDAwX3RzbyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyNpZmRlZiBORVRJRl9GX1RTTworCXN0cnVjdCBlMTAwMF9jb250ZXh0X2Rlc2MgKmNvbnRleHRfZGVzYzsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1aW50MzJfdCBjbWRfbGVuZ3RoID0gMDsKKwl1aW50MTZfdCBpcGNzZSwgdHVjc2UsIG1zczsKKwl1aW50OF90IGlwY3NzLCBpcGNzbywgdHVjc3MsIHR1Y3NvLCBoZHJfbGVuOworCWludCBlcnI7CisKKwlpZihza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKSB7CisJCWlmIChza2JfaGVhZGVyX2Nsb25lZChza2IpKSB7CisJCQllcnIgPSBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQyk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKworCQloZHJfbGVuID0gKChza2ItPmgucmF3IC0gc2tiLT5kYXRhKSArIChza2ItPmgudGgtPmRvZmYgPDwgMikpOworCQltc3MgPSBza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplOworCQlza2ItPm5oLmlwaC0+dG90X2xlbiA9IDA7CisJCXNrYi0+bmguaXBoLT5jaGVjayA9IDA7CisJCXNrYi0+aC50aC0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoc2tiLT5uaC5pcGgtPnNhZGRyLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+bmguaXBoLT5kYWRkciwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQUFJPVE9fVENQLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCQlpcGNzcyA9IHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhOworCQlpcGNzbyA9ICh2b2lkICopJihza2ItPm5oLmlwaC0+Y2hlY2spIC0gKHZvaWQgKilza2ItPmRhdGE7CisJCWlwY3NlID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSAtIDE7CisJCXR1Y3NzID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJdHVjc28gPSAodm9pZCAqKSYoc2tiLT5oLnRoLT5jaGVjaykgLSAodm9pZCAqKXNrYi0+ZGF0YTsKKwkJdHVjc2UgPSAwOworCisJCWNtZF9sZW5ndGggfD0gKEUxMDAwX1RYRF9DTURfREVYVCB8IEUxMDAwX1RYRF9DTURfVFNFIHwKKwkJCSAgICAgICBFMTAwMF9UWERfQ01EX0lQIHwgRTEwMDBfVFhEX0NNRF9UQ1AgfAorCQkJICAgICAgIChza2ItPmxlbiAtIChoZHJfbGVuKSkpOworCisJCWkgPSBhZGFwdGVyLT50eF9yaW5nLm5leHRfdG9fdXNlOworCQljb250ZXh0X2Rlc2MgPSBFMTAwMF9DT05URVhUX0RFU0MoYWRhcHRlci0+dHhfcmluZywgaSk7CisKKwkJY29udGV4dF9kZXNjLT5sb3dlcl9zZXR1cC5pcF9maWVsZHMuaXBjc3MgID0gaXBjc3M7CisJCWNvbnRleHRfZGVzYy0+bG93ZXJfc2V0dXAuaXBfZmllbGRzLmlwY3NvICA9IGlwY3NvOworCQljb250ZXh0X2Rlc2MtPmxvd2VyX3NldHVwLmlwX2ZpZWxkcy5pcGNzZSAgPSBjcHVfdG9fbGUxNihpcGNzZSk7CisJCWNvbnRleHRfZGVzYy0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzcyA9IHR1Y3NzOworCQljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc28gPSB0dWNzbzsKKwkJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NlID0gY3B1X3RvX2xlMTYodHVjc2UpOworCQljb250ZXh0X2Rlc2MtPnRjcF9zZWdfc2V0dXAuZmllbGRzLm1zcyAgICAgPSBjcHVfdG9fbGUxNihtc3MpOworCQljb250ZXh0X2Rlc2MtPnRjcF9zZWdfc2V0dXAuZmllbGRzLmhkcl9sZW4gPSBoZHJfbGVuOworCQljb250ZXh0X2Rlc2MtPmNtZF9hbmRfbGVuZ3RoID0gY3B1X3RvX2xlMzIoY21kX2xlbmd0aCk7CisKKwkJaWYoKytpID09IGFkYXB0ZXItPnR4X3JpbmcuY291bnQpIGkgPSAwOworCQlhZGFwdGVyLT50eF9yaW5nLm5leHRfdG9fdXNlID0gaTsKKworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2xlYW5fdAorZTEwMDBfdHhfY3N1bShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZTEwMDBfY29udGV4dF9kZXNjICpjb250ZXh0X2Rlc2M7CisJdW5zaWduZWQgaW50IGk7CisJdWludDhfdCBjc3M7CisKKwlpZihsaWtlbHkoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpKSB7CisJCWNzcyA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CisKKwkJaSA9IGFkYXB0ZXItPnR4X3JpbmcubmV4dF90b191c2U7CisJCWNvbnRleHRfZGVzYyA9IEUxMDAwX0NPTlRFWFRfREVTQyhhZGFwdGVyLT50eF9yaW5nLCBpKTsKKworCQljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc3MgPSBjc3M7CisJCWNvbnRleHRfZGVzYy0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzbyA9IGNzcyArIHNrYi0+Y3N1bTsKKwkJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NlID0gMDsKKwkJY29udGV4dF9kZXNjLT50Y3Bfc2VnX3NldHVwLmRhdGEgPSAwOworCQljb250ZXh0X2Rlc2MtPmNtZF9hbmRfbGVuZ3RoID0gY3B1X3RvX2xlMzIoRTEwMDBfVFhEX0NNRF9ERVhUKTsKKworCQlpZih1bmxpa2VseSgrK2kgPT0gYWRhcHRlci0+dHhfcmluZy5jb3VudCkpIGkgPSAwOworCQlhZGFwdGVyLT50eF9yaW5nLm5leHRfdG9fdXNlID0gaTsKKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKyNkZWZpbmUgRTEwMDBfTUFYX1RYRF9QV1IJMTIKKyNkZWZpbmUgRTEwMDBfTUFYX0RBVEFfUEVSX1RYRAkoMTw8RTEwMDBfTUFYX1RYRF9QV1IpCisKK3N0YXRpYyBpbmxpbmUgaW50CitlMTAwMF90eF9tYXAoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IsCisJdW5zaWduZWQgaW50IGZpcnN0LCB1bnNpZ25lZCBpbnQgbWF4X3Blcl90eGQsCisJdW5zaWduZWQgaW50IG5yX2ZyYWdzLCB1bnNpZ25lZCBpbnQgbXNzKQoreworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZzsKKwlzdHJ1Y3QgZTEwMDBfYnVmZmVyICpidWZmZXJfaW5mbzsKKwl1bnNpZ25lZCBpbnQgbGVuID0gc2tiLT5sZW47CisJdW5zaWduZWQgaW50IG9mZnNldCA9IDAsIHNpemUsIGNvdW50ID0gMCwgaTsKKwl1bnNpZ25lZCBpbnQgZjsKKwlsZW4gLT0gc2tiLT5kYXRhX2xlbjsKKworCWkgPSB0eF9yaW5nLT5uZXh0X3RvX3VzZTsKKworCXdoaWxlKGxlbikgeworCQlidWZmZXJfaW5mbyA9ICZ0eF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwkJc2l6ZSA9IG1pbihsZW4sIG1heF9wZXJfdHhkKTsKKyNpZmRlZiBORVRJRl9GX1RTTworCQkvKiBXb3JrYXJvdW5kIGZvciBwcmVtYXR1cmUgZGVzYyB3cml0ZS1iYWNrcworCQkgKiBpbiBUU08gbW9kZS4gIEFwcGVuZCA0LWJ5dGUgc2VudGluZWwgZGVzYyAqLworCQlpZih1bmxpa2VseShtc3MgJiYgIW5yX2ZyYWdzICYmIHNpemUgPT0gbGVuICYmIHNpemUgPiA4KSkKKwkJCXNpemUgLT0gNDsKKyNlbmRpZgorCQkvKiBXb3JrYXJvdW5kIGZvciBwb3RlbnRpYWwgODI1NDQgaGFuZyBpbiBQQ0ktWC4gIEF2b2lkCisJCSAqIHRlcm1pbmF0aW5nIGJ1ZmZlcnMgd2l0aGluIGV2ZW5seS1hbGlnbmVkIGR3b3Jkcy4gKi8KKwkJaWYodW5saWtlbHkoYWRhcHRlci0+cGNpeF84MjU0NCAmJgorCQkgICAhKCh1bnNpZ25lZCBsb25nKShza2ItPmRhdGEgKyBvZmZzZXQgKyBzaXplIC0gMSkgJiA0KSAmJgorCQkgICBzaXplID4gNCkpCisJCQlzaXplIC09IDQ7CisKKwkJYnVmZmVyX2luZm8tPmxlbmd0aCA9IHNpemU7CisJCWJ1ZmZlcl9pbmZvLT5kbWEgPQorCQkJcGNpX21hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwKKwkJCQlza2ItPmRhdGEgKyBvZmZzZXQsCisJCQkJc2l6ZSwKKwkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJYnVmZmVyX2luZm8tPnRpbWVfc3RhbXAgPSBqaWZmaWVzOworCisJCWxlbiAtPSBzaXplOworCQlvZmZzZXQgKz0gc2l6ZTsKKwkJY291bnQrKzsKKwkJaWYodW5saWtlbHkoKytpID09IHR4X3JpbmctPmNvdW50KSkgaSA9IDA7CisJfQorCisJZm9yKGYgPSAwOyBmIDwgbnJfZnJhZ3M7IGYrKykgeworCQlzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFnOworCisJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmXTsKKwkJbGVuID0gZnJhZy0+c2l6ZTsKKwkJb2Zmc2V0ID0gZnJhZy0+cGFnZV9vZmZzZXQ7CisKKwkJd2hpbGUobGVuKSB7CisJCQlidWZmZXJfaW5mbyA9ICZ0eF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwkJCXNpemUgPSBtaW4obGVuLCBtYXhfcGVyX3R4ZCk7CisjaWZkZWYgTkVUSUZfRl9UU08KKwkJCS8qIFdvcmthcm91bmQgZm9yIHByZW1hdHVyZSBkZXNjIHdyaXRlLWJhY2tzCisJCQkgKiBpbiBUU08gbW9kZS4gIEFwcGVuZCA0LWJ5dGUgc2VudGluZWwgZGVzYyAqLworCQkJaWYodW5saWtlbHkobXNzICYmIGYgPT0gKG5yX2ZyYWdzLTEpICYmIHNpemUgPT0gbGVuICYmIHNpemUgPiA4KSkKKwkJCQlzaXplIC09IDQ7CisjZW5kaWYKKwkJCS8qIFdvcmthcm91bmQgZm9yIHBvdGVudGlhbCA4MjU0NCBoYW5nIGluIFBDSS1YLgorCQkJICogQXZvaWQgdGVybWluYXRpbmcgYnVmZmVycyB3aXRoaW4gZXZlbmx5LWFsaWduZWQKKwkJCSAqIGR3b3Jkcy4gKi8KKwkJCWlmKHVubGlrZWx5KGFkYXB0ZXItPnBjaXhfODI1NDQgJiYKKwkJCSAgICEoKHVuc2lnbmVkIGxvbmcpKGZyYWctPnBhZ2Urb2Zmc2V0K3NpemUtMSkgJiA0KSAmJgorCQkJICAgc2l6ZSA+IDQpKQorCQkJCXNpemUgLT0gNDsKKworCQkJYnVmZmVyX2luZm8tPmxlbmd0aCA9IHNpemU7CisJCQlidWZmZXJfaW5mby0+ZG1hID0KKwkJCQlwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwKKwkJCQkJZnJhZy0+cGFnZSwKKwkJCQkJb2Zmc2V0LAorCQkJCQlzaXplLAorCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWJ1ZmZlcl9pbmZvLT50aW1lX3N0YW1wID0gamlmZmllczsKKworCQkJbGVuIC09IHNpemU7CisJCQlvZmZzZXQgKz0gc2l6ZTsKKwkJCWNvdW50Kys7CisJCQlpZih1bmxpa2VseSgrK2kgPT0gdHhfcmluZy0+Y291bnQpKSBpID0gMDsKKwkJfQorCX0KKworCWkgPSAoaSA9PSAwKSA/IHR4X3JpbmctPmNvdW50IC0gMSA6IGkgLSAxOworCXR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldLnNrYiA9IHNrYjsKKwl0eF9yaW5nLT5idWZmZXJfaW5mb1tmaXJzdF0ubmV4dF90b193YXRjaCA9IGk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZTEwMDBfdHhfcXVldWUoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBjb3VudCwgaW50IHR4X2ZsYWdzKQoreworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZzsKKwlzdHJ1Y3QgZTEwMDBfdHhfZGVzYyAqdHhfZGVzYyA9IE5VTEw7CisJc3RydWN0IGUxMDAwX2J1ZmZlciAqYnVmZmVyX2luZm87CisJdWludDMyX3QgdHhkX3VwcGVyID0gMCwgdHhkX2xvd2VyID0gRTEwMDBfVFhEX0NNRF9JRkNTOworCXVuc2lnbmVkIGludCBpOworCisJaWYobGlrZWx5KHR4X2ZsYWdzICYgRTEwMDBfVFhfRkxBR1NfVFNPKSkgeworCQl0eGRfbG93ZXIgfD0gRTEwMDBfVFhEX0NNRF9ERVhUIHwgRTEwMDBfVFhEX0RUWVBfRCB8CisJCSAgICAgICAgICAgICBFMTAwMF9UWERfQ01EX1RTRTsKKwkJdHhkX3VwcGVyIHw9IChFMTAwMF9UWERfUE9QVFNfSVhTTSB8IEUxMDAwX1RYRF9QT1BUU19UWFNNKSA8PCA4OworCX0KKworCWlmKGxpa2VseSh0eF9mbGFncyAmIEUxMDAwX1RYX0ZMQUdTX0NTVU0pKSB7CisJCXR4ZF9sb3dlciB8PSBFMTAwMF9UWERfQ01EX0RFWFQgfCBFMTAwMF9UWERfRFRZUF9EOworCQl0eGRfdXBwZXIgfD0gRTEwMDBfVFhEX1BPUFRTX1RYU00gPDwgODsKKwl9CisKKwlpZih1bmxpa2VseSh0eF9mbGFncyAmIEUxMDAwX1RYX0ZMQUdTX1ZMQU4pKSB7CisJCXR4ZF9sb3dlciB8PSBFMTAwMF9UWERfQ01EX1ZMRTsKKwkJdHhkX3VwcGVyIHw9ICh0eF9mbGFncyAmIEUxMDAwX1RYX0ZMQUdTX1ZMQU5fTUFTSyk7CisJfQorCisJaSA9IHR4X3JpbmctPm5leHRfdG9fdXNlOworCisJd2hpbGUoY291bnQtLSkgeworCQlidWZmZXJfaW5mbyA9ICZ0eF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwkJdHhfZGVzYyA9IEUxMDAwX1RYX0RFU0MoKnR4X3JpbmcsIGkpOworCQl0eF9kZXNjLT5idWZmZXJfYWRkciA9IGNwdV90b19sZTY0KGJ1ZmZlcl9pbmZvLT5kbWEpOworCQl0eF9kZXNjLT5sb3dlci5kYXRhID0KKwkJCWNwdV90b19sZTMyKHR4ZF9sb3dlciB8IGJ1ZmZlcl9pbmZvLT5sZW5ndGgpOworCQl0eF9kZXNjLT51cHBlci5kYXRhID0gY3B1X3RvX2xlMzIodHhkX3VwcGVyKTsKKwkJaWYodW5saWtlbHkoKytpID09IHR4X3JpbmctPmNvdW50KSkgaSA9IDA7CisJfQorCisJdHhfZGVzYy0+bG93ZXIuZGF0YSB8PSBjcHVfdG9fbGUzMihhZGFwdGVyLT50eGRfY21kKTsKKworCS8qIEZvcmNlIG1lbW9yeSB3cml0ZXMgdG8gY29tcGxldGUgYmVmb3JlIGxldHRpbmcgaC93CisJICoga25vdyB0aGVyZSBhcmUgbmV3IGRlc2NyaXB0b3JzIHRvIGZldGNoLiAgKE9ubHkKKwkgKiBhcHBsaWNhYmxlIGZvciB3ZWFrLW9yZGVyZWQgbWVtb3J5IG1vZGVsIGFyY2hzLAorCSAqIHN1Y2ggYXMgSUEtNjQpLiAqLworCXdtYigpOworCisJdHhfcmluZy0+bmV4dF90b191c2UgPSBpOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFREVCwgaSk7Cit9CisKKy8qKgorICogODI1NDcgd29ya2Fyb3VuZCB0byBhdm9pZCBjb250cm9sbGVyIGhhbmcgaW4gaGFsZi1kdXBsZXggZW52aXJvbm1lbnQuCisgKiBUaGUgd29ya2Fyb3VuZCBpcyB0byBhdm9pZCBxdWV1aW5nIGEgbGFyZ2UgcGFja2V0IHRoYXQgd291bGQgc3BhbgorICogdGhlIGludGVybmFsIFR4IEZJRk8gcmluZyBib3VuZGFyeSBieSBub3RpZnlpbmcgdGhlIHN0YWNrIHRvIHJlc2VuZAorICogdGhlIHBhY2tldCBhdCBhIGxhdGVyIHRpbWUuICBUaGlzIGdpdmVzIHRoZSBUeCBGSUZPIGFuIG9wcG9ydHVuaXR5IHRvCisgKiBmbHVzaCBhbGwgcGFja2V0cy4gIFdoZW4gdGhhdCBvY2N1cnMsIHdlIHJlc2V0IHRoZSBUeCBGSUZPIHBvaW50ZXJzCisgKiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBUeCBGSUZPLgorICoqLworCisjZGVmaW5lIEUxMDAwX0ZJRk9fSERSCQkJMHgxMAorI2RlZmluZSBFMTAwMF84MjU0N19QQURfTEVOCQkweDNFMAorCitzdGF0aWMgaW5saW5lIGludAorZTEwMDBfODI1NDdfZmlmb193b3JrYXJvdW5kKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVpbnQzMl90IGZpZm9fc3BhY2UgPSBhZGFwdGVyLT50eF9maWZvX3NpemUgLSBhZGFwdGVyLT50eF9maWZvX2hlYWQ7CisJdWludDMyX3Qgc2tiX2ZpZm9fbGVuID0gc2tiLT5sZW4gKyBFMTAwMF9GSUZPX0hEUjsKKworCUUxMDAwX1JPVU5EVVAoc2tiX2ZpZm9fbGVuLCBFMTAwMF9GSUZPX0hEUik7CisKKwlpZihhZGFwdGVyLT5saW5rX2R1cGxleCAhPSBIQUxGX0RVUExFWCkKKwkJZ290byBub19maWZvX3N0YWxsX3JlcXVpcmVkOworCisJaWYoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnR4X2ZpZm9fc3RhbGwpKQorCQlyZXR1cm4gMTsKKworCWlmKHNrYl9maWZvX2xlbiA+PSAoRTEwMDBfODI1NDdfUEFEX0xFTiArIGZpZm9fc3BhY2UpKSB7CisJCWF0b21pY19zZXQoJmFkYXB0ZXItPnR4X2ZpZm9fc3RhbGwsIDEpOworCQlyZXR1cm4gMTsKKwl9CisKK25vX2ZpZm9fc3RhbGxfcmVxdWlyZWQ6CisJYWRhcHRlci0+dHhfZmlmb19oZWFkICs9IHNrYl9maWZvX2xlbjsKKwlpZihhZGFwdGVyLT50eF9maWZvX2hlYWQgPj0gYWRhcHRlci0+dHhfZmlmb19zaXplKQorCQlhZGFwdGVyLT50eF9maWZvX2hlYWQgLT0gYWRhcHRlci0+dHhfZmlmb19zaXplOworCXJldHVybiAwOworfQorCisjZGVmaW5lIFRYRF9VU0VfQ09VTlQoUywgWCkgKCgoUykgPj4gKFgpKSArIDEgKQorc3RhdGljIGludAorZTEwMDBfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXVuc2lnbmVkIGludCBmaXJzdCwgbWF4X3Blcl90eGQgPSBFMTAwMF9NQVhfREFUQV9QRVJfVFhEOworCXVuc2lnbmVkIGludCBtYXhfdHhkX3B3ciA9IEUxMDAwX01BWF9UWERfUFdSOworCXVuc2lnbmVkIGludCB0eF9mbGFncyA9IDA7CisJdW5zaWduZWQgaW50IGxlbiA9IHNrYi0+bGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG5yX2ZyYWdzID0gMDsKKwl1bnNpZ25lZCBpbnQgbXNzID0gMDsKKwlpbnQgY291bnQgPSAwOworCWludCB0c287CisJdW5zaWduZWQgaW50IGY7CisJbGVuIC09IHNrYi0+ZGF0YV9sZW47CisKKwlpZih1bmxpa2VseShza2ItPmxlbiA8PSAwKSkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gTkVUREVWX1RYX09LOworCX0KKworI2lmZGVmIE5FVElGX0ZfVFNPCisJbXNzID0gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZTsKKwkvKiBUaGUgY29udHJvbGxlciBkb2VzIGEgc2ltcGxlIGNhbGN1bGF0aW9uIHRvCisJICogbWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCByb29tIGluIHRoZSBGSUZPIGJlZm9yZQorCSAqIGluaXRpYXRpbmcgdGhlIERNQSBmb3IgZWFjaCBidWZmZXIuICBUaGUgY2FsYyBpczoKKwkgKiA0ID0gY2VpbChidWZmZXIgbGVuL21zcykuICBUbyBtYWtlIHN1cmUgd2UgZG9uJ3QKKwkgKiBvdmVycnVuIHRoZSBGSUZPLCBhZGp1c3QgdGhlIG1heCBidWZmZXIgbGVuIGlmIG1zcworCSAqIGRyb3BzLiAqLworCWlmKG1zcykgeworCQltYXhfcGVyX3R4ZCA9IG1pbihtc3MgPDwgMiwgbWF4X3Blcl90eGQpOworCQltYXhfdHhkX3B3ciA9IGZscyhtYXhfcGVyX3R4ZCkgLSAxOworCX0KKworCWlmKChtc3MpIHx8IChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykpCisJCWNvdW50Kys7CisJY291bnQrKzsJLyogZm9yIHNlbnRpbmVsIGRlc2MgKi8KKyNlbHNlCisJaWYoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCisJCWNvdW50Kys7CisjZW5kaWYKKwljb3VudCArPSBUWERfVVNFX0NPVU5UKGxlbiwgbWF4X3R4ZF9wd3IpOworCisJaWYoYWRhcHRlci0+cGNpeF84MjU0NCkKKwkJY291bnQrKzsKKworCW5yX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwlmb3IoZiA9IDA7IGYgPCBucl9mcmFnczsgZisrKQorCQljb3VudCArPSBUWERfVVNFX0NPVU5UKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbZl0uc2l6ZSwKKwkJCQkgICAgICAgbWF4X3R4ZF9wd3IpOworCWlmKGFkYXB0ZXItPnBjaXhfODI1NDQpCisJCWNvdW50ICs9IG5yX2ZyYWdzOworCisgCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgCisgCWlmICghc3Bpbl90cnlsb2NrKCZhZGFwdGVyLT50eF9sb2NrKSkgeyAKKyAJCS8qIENvbGxpc2lvbiAtIHRlbGwgdXBwZXIgbGF5ZXIgdG8gcmVxdWV1ZSAqLyAKKyAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgCisgCQlyZXR1cm4gTkVUREVWX1RYX0xPQ0tFRDsgCisgCX0gCisKKwkvKiBuZWVkOiBjb3VudCArIDIgZGVzYyBnYXAgdG8ga2VlcCB0YWlsIGZyb20gdG91Y2hpbmcKKwkgKiBoZWFkLCBvdGhlcndpc2UgdHJ5IG5leHQgdGltZSAqLworCWlmKHVubGlrZWx5KEUxMDAwX0RFU0NfVU5VU0VEKCZhZGFwdGVyLT50eF9yaW5nKSA8IGNvdW50ICsgMikpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT50eF9sb2NrLCBmbGFncyk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwlpZih1bmxpa2VseShhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NykpIHsKKwkJaWYodW5saWtlbHkoZTEwMDBfODI1NDdfZmlmb193b3JrYXJvdW5kKGFkYXB0ZXIsIHNrYikpKSB7CisJCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCQltb2RfdGltZXIoJmFkYXB0ZXItPnR4X2ZpZm9fc3RhbGxfdGltZXIsIGppZmZpZXMpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+dHhfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCQl9CisJfQorCisJaWYodW5saWtlbHkoYWRhcHRlci0+dmxncnAgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpKSkgeworCQl0eF9mbGFncyB8PSBFMTAwMF9UWF9GTEFHU19WTEFOOworCQl0eF9mbGFncyB8PSAodmxhbl90eF90YWdfZ2V0KHNrYikgPDwgRTEwMDBfVFhfRkxBR1NfVkxBTl9TSElGVCk7CisJfQorCisJZmlyc3QgPSBhZGFwdGVyLT50eF9yaW5nLm5leHRfdG9fdXNlOworCQorCXRzbyA9IGUxMDAwX3RzbyhhZGFwdGVyLCBza2IpOworCWlmICh0c28gPCAwKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiBORVRERVZfVFhfT0s7CisJfQorCisJaWYgKGxpa2VseSh0c28pKQorCQl0eF9mbGFncyB8PSBFMTAwMF9UWF9GTEFHU19UU087CisJZWxzZSBpZihsaWtlbHkoZTEwMDBfdHhfY3N1bShhZGFwdGVyLCBza2IpKSkKKwkJdHhfZmxhZ3MgfD0gRTEwMDBfVFhfRkxBR1NfQ1NVTTsKKworCWUxMDAwX3R4X3F1ZXVlKGFkYXB0ZXIsCisJCWUxMDAwX3R4X21hcChhZGFwdGVyLCBza2IsIGZpcnN0LCBtYXhfcGVyX3R4ZCwgbnJfZnJhZ3MsIG1zcyksCisJCXR4X2ZsYWdzKTsKKworCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogTWFrZSBzdXJlIHRoZXJlIGlzIHNwYWNlIGluIHRoZSByaW5nIGZvciB0aGUgbmV4dCBzZW5kLiAqLworCWlmKHVubGlrZWx5KEUxMDAwX0RFU0NfVU5VU0VEKCZhZGFwdGVyLT50eF9yaW5nKSA8IE1BWF9TS0JfRlJBR1MgKyAyKSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+dHhfbG9jaywgZmxhZ3MpOworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKy8qKgorICogZTEwMDBfdHhfdGltZW91dCAtIFJlc3BvbmQgdG8gYSBUeCBIYW5nCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyB2b2lkCitlMTAwMF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisKKwkvKiBEbyB0aGUgcmVzZXQgb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dCAqLworCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnR4X3RpbWVvdXRfdGFzayk7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwMF90eF90aW1lb3V0X3Rhc2soc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCWUxMDAwX2Rvd24oYWRhcHRlcik7CisJZTEwMDBfdXAoYWRhcHRlcik7Cit9CisKKy8qKgorICogZTEwMDBfZ2V0X3N0YXRzIC0gR2V0IFN5c3RlbSBOZXR3b3JrIFN0YXRpc3RpY3MKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2Ugc3RhdGlzdGljcyBzdHJ1Y3R1cmUuCisgKiBUaGUgc3RhdGlzdGljcyBhcmUgYWN0dWFsbHkgdXBkYXRlZCBmcm9tIHRoZSB0aW1lciBjYWxsYmFjay4KKyAqKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK2UxMDAwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJZTEwMDBfdXBkYXRlX3N0YXRzKGFkYXB0ZXIpOworCXJldHVybiAmYWRhcHRlci0+bmV0X3N0YXRzOworfQorCisvKioKKyAqIGUxMDAwX2NoYW5nZV9tdHUgLSBDaGFuZ2UgdGhlIE1heGltdW0gVHJhbnNmZXIgVW5pdAorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQG5ld19tdHU6IG5ldyB2YWx1ZSBmb3IgbWF4aW11bSBmcmFtZSBzaXplCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqKi8KKworc3RhdGljIGludAorZTEwMDBfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlpbnQgb2xkX210dSA9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW47CisJaW50IG1heF9mcmFtZSA9IG5ld19tdHUgKyBFTkVUX0hFQURFUl9TSVpFICsgRVRIRVJORVRfRkNTX1NJWkU7CisKKwlpZigobWF4X2ZyYW1lIDwgTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFKSB8fAorCQkobWF4X2ZyYW1lID4gTUFYX0pVTUJPX0ZSQU1FX1NJWkUpKSB7CisJCQlEUFJJTlRLKFBST0JFLCBFUlIsICJJbnZhbGlkIE1UVSBzZXR0aW5nXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmKG1heF9mcmFtZSA8PSBNQVhJTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUpIHsKKwkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IEUxMDAwX1JYQlVGRkVSXzIwNDg7CisKKwl9IGVsc2UgaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0MykgeworCQlEUFJJTlRLKFBST0JFLCBFUlIsICJKdW1ibyBGcmFtZXMgbm90IHN1cHBvcnRlZCBvbiA4MjU0MlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCisJfSBlbHNlIGlmKG1heF9mcmFtZSA8PSBFMTAwMF9SWEJVRkZFUl80MDk2KSB7CisJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSBFMTAwMF9SWEJVRkZFUl80MDk2OworCisJfSBlbHNlIGlmKG1heF9mcmFtZSA8PSBFMTAwMF9SWEJVRkZFUl84MTkyKSB7CisJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSBFMTAwMF9SWEJVRkZFUl84MTkyOworCisJfSBlbHNlIHsKKwkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IEUxMDAwX1JYQlVGRkVSXzE2Mzg0OworCX0KKworCWlmKG9sZF9tdHUgIT0gYWRhcHRlci0+cnhfYnVmZmVyX2xlbiAmJiBuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJZTEwMDBfZG93bihhZGFwdGVyKTsKKwkJZTEwMDBfdXAoYWRhcHRlcik7CisJfQorCisJbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OworCWFkYXB0ZXItPmh3Lm1heF9mcmFtZV9zaXplID0gbWF4X2ZyYW1lOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZTEwMDBfdXBkYXRlX3N0YXRzIC0gVXBkYXRlIHRoZSBib2FyZCBzdGF0aXN0aWNzIGNvdW50ZXJzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KKwordm9pZAorZTEwMDBfdXBkYXRlX3N0YXRzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1aW50MTZfdCBwaHlfdG1wOworCisjZGVmaW5lIFBIWV9JRExFX0VSUk9SX0NPVU5UX01BU0sgMHgwMEZGCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOworCisJLyogdGhlc2UgY291bnRlcnMgYXJlIG1vZGlmaWVkIGZyb20gZTEwMDBfYWRqdXN0X3RiaV9zdGF0cywKKwkgKiBjYWxsZWQgZnJvbSB0aGUgaW50ZXJydXB0IGNvbnRleHQsIHNvIHRoZXkgbXVzdCBvbmx5CisJICogYmUgd3JpdHRlbiB3aGlsZSBob2xkaW5nIGFkYXB0ZXItPnN0YXRzX2xvY2sKKwkgKi8KKworCWFkYXB0ZXItPnN0YXRzLmNyY2VycnMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIENSQ0VSUlMpOworCWFkYXB0ZXItPnN0YXRzLmdwcmMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIEdQUkMpOworCWFkYXB0ZXItPnN0YXRzLmdvcmNsICs9IEUxMDAwX1JFQURfUkVHKGh3LCBHT1JDTCk7CisJYWRhcHRlci0+c3RhdHMuZ29yY2ggKz0gRTEwMDBfUkVBRF9SRUcoaHcsIEdPUkNIKTsKKwlhZGFwdGVyLT5zdGF0cy5icHJjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBCUFJDKTsKKwlhZGFwdGVyLT5zdGF0cy5tcHJjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBNUFJDKTsKKwlhZGFwdGVyLT5zdGF0cy5yb2MgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFJPQyk7CisJYWRhcHRlci0+c3RhdHMucHJjNjQgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzY0KTsKKwlhZGFwdGVyLT5zdGF0cy5wcmMxMjcgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzEyNyk7CisJYWRhcHRlci0+c3RhdHMucHJjMjU1ICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkMyNTUpOworCWFkYXB0ZXItPnN0YXRzLnByYzUxMSArPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDNTExKTsKKwlhZGFwdGVyLT5zdGF0cy5wcmMxMDIzICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkMxMDIzKTsKKwlhZGFwdGVyLT5zdGF0cy5wcmMxNTIyICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkMxNTIyKTsKKworCWFkYXB0ZXItPnN0YXRzLnN5bWVycnMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFNZTUVSUlMpOworCWFkYXB0ZXItPnN0YXRzLm1wYyArPSBFMTAwMF9SRUFEX1JFRyhodywgTVBDKTsKKwlhZGFwdGVyLT5zdGF0cy5zY2MgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFNDQyk7CisJYWRhcHRlci0+c3RhdHMuZWNvbCArPSBFMTAwMF9SRUFEX1JFRyhodywgRUNPTCk7CisJYWRhcHRlci0+c3RhdHMubWNjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBNQ0MpOworCWFkYXB0ZXItPnN0YXRzLmxhdGVjb2wgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIExBVEVDT0wpOworCWFkYXB0ZXItPnN0YXRzLmRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBEQyk7CisJYWRhcHRlci0+c3RhdHMuc2VjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBTRUMpOworCWFkYXB0ZXItPnN0YXRzLnJsZWMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFJMRUMpOworCWFkYXB0ZXItPnN0YXRzLnhvbnJ4YyArPSBFMTAwMF9SRUFEX1JFRyhodywgWE9OUlhDKTsKKwlhZGFwdGVyLT5zdGF0cy54b250eGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFhPTlRYQyk7CisJYWRhcHRlci0+c3RhdHMueG9mZnJ4YyArPSBFMTAwMF9SRUFEX1JFRyhodywgWE9GRlJYQyk7CisJYWRhcHRlci0+c3RhdHMueG9mZnR4YyArPSBFMTAwMF9SRUFEX1JFRyhodywgWE9GRlRYQyk7CisJYWRhcHRlci0+c3RhdHMuZmNydWMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIEZDUlVDKTsKKwlhZGFwdGVyLT5zdGF0cy5ncHRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBHUFRDKTsKKwlhZGFwdGVyLT5zdGF0cy5nb3RjbCArPSBFMTAwMF9SRUFEX1JFRyhodywgR09UQ0wpOworCWFkYXB0ZXItPnN0YXRzLmdvdGNoICs9IEUxMDAwX1JFQURfUkVHKGh3LCBHT1RDSCk7CisJYWRhcHRlci0+c3RhdHMucm5iYyArPSBFMTAwMF9SRUFEX1JFRyhodywgUk5CQyk7CisJYWRhcHRlci0+c3RhdHMucnVjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBSVUMpOworCWFkYXB0ZXItPnN0YXRzLnJmYyArPSBFMTAwMF9SRUFEX1JFRyhodywgUkZDKTsKKwlhZGFwdGVyLT5zdGF0cy5yamMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFJKQyk7CisJYWRhcHRlci0+c3RhdHMudG9ybCArPSBFMTAwMF9SRUFEX1JFRyhodywgVE9STCk7CisJYWRhcHRlci0+c3RhdHMudG9yaCArPSBFMTAwMF9SRUFEX1JFRyhodywgVE9SSCk7CisJYWRhcHRlci0+c3RhdHMudG90bCArPSBFMTAwMF9SRUFEX1JFRyhodywgVE9UTCk7CisJYWRhcHRlci0+c3RhdHMudG90aCArPSBFMTAwMF9SRUFEX1JFRyhodywgVE9USCk7CisJYWRhcHRlci0+c3RhdHMudHByICs9IEUxMDAwX1JFQURfUkVHKGh3LCBUUFIpOworCWFkYXB0ZXItPnN0YXRzLnB0YzY0ICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEM2NCk7CisJYWRhcHRlci0+c3RhdHMucHRjMTI3ICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEMxMjcpOworCWFkYXB0ZXItPnN0YXRzLnB0YzI1NSArPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDMjU1KTsKKwlhZGFwdGVyLT5zdGF0cy5wdGM1MTEgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzUxMSk7CisJYWRhcHRlci0+c3RhdHMucHRjMTAyMyArPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDMTAyMyk7CisJYWRhcHRlci0+c3RhdHMucHRjMTUyMiArPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDMTUyMik7CisJYWRhcHRlci0+c3RhdHMubXB0YyArPSBFMTAwMF9SRUFEX1JFRyhodywgTVBUQyk7CisJYWRhcHRlci0+c3RhdHMuYnB0YyArPSBFMTAwMF9SRUFEX1JFRyhodywgQlBUQyk7CisKKwkvKiB1c2VkIGZvciBhZGFwdGl2ZSBJRlMgKi8KKworCWh3LT50eF9wYWNrZXRfZGVsdGEgPSBFMTAwMF9SRUFEX1JFRyhodywgVFBUKTsKKwlhZGFwdGVyLT5zdGF0cy50cHQgKz0gaHctPnR4X3BhY2tldF9kZWx0YTsKKwlody0+Y29sbGlzaW9uX2RlbHRhID0gRTEwMDBfUkVBRF9SRUcoaHcsIENPTEMpOworCWFkYXB0ZXItPnN0YXRzLmNvbGMgKz0gaHctPmNvbGxpc2lvbl9kZWx0YTsKKworCWlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgeworCQlhZGFwdGVyLT5zdGF0cy5hbGduZXJyYyArPSBFMTAwMF9SRUFEX1JFRyhodywgQUxHTkVSUkMpOworCQlhZGFwdGVyLT5zdGF0cy5yeGVycmMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFJYRVJSQyk7CisJCWFkYXB0ZXItPnN0YXRzLnRuY3JzICs9IEUxMDAwX1JFQURfUkVHKGh3LCBUTkNSUyk7CisJCWFkYXB0ZXItPnN0YXRzLmNleHRlcnIgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIENFWFRFUlIpOworCQlhZGFwdGVyLT5zdGF0cy50c2N0YyArPSBFMTAwMF9SRUFEX1JFRyhodywgVFNDVEMpOworCQlhZGFwdGVyLT5zdGF0cy50c2N0ZmMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFRTQ1RGQyk7CisJfQorCisJLyogRmlsbCBvdXQgdGhlIE9TIHN0YXRpc3RpY3Mgc3RydWN0dXJlICovCisKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfcGFja2V0cyA9IGFkYXB0ZXItPnN0YXRzLmdwcmM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X3BhY2tldHMgPSBhZGFwdGVyLT5zdGF0cy5ncHRjOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9ieXRlcyA9IGFkYXB0ZXItPnN0YXRzLmdvcmNsOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9ieXRlcyA9IGFkYXB0ZXItPnN0YXRzLmdvdGNsOworCWFkYXB0ZXItPm5ldF9zdGF0cy5tdWx0aWNhc3QgPSBhZGFwdGVyLT5zdGF0cy5tcHJjOworCWFkYXB0ZXItPm5ldF9zdGF0cy5jb2xsaXNpb25zID0gYWRhcHRlci0+c3RhdHMuY29sYzsKKworCS8qIFJ4IEVycm9ycyAqLworCisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLnJ4ZXJyYyArCisJCWFkYXB0ZXItPnN0YXRzLmNyY2VycnMgKyBhZGFwdGVyLT5zdGF0cy5hbGduZXJyYyArCisJCWFkYXB0ZXItPnN0YXRzLnJsZWMgKyBhZGFwdGVyLT5zdGF0cy5ybmJjICsKKwkJYWRhcHRlci0+c3RhdHMubXBjICsgYWRhcHRlci0+c3RhdHMuY2V4dGVycjsKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZHJvcHBlZCA9IGFkYXB0ZXItPnN0YXRzLnJuYmM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPSBhZGFwdGVyLT5zdGF0cy5ybGVjOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMuY3JjZXJyczsKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZnJhbWVfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMuYWxnbmVycmM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gYWRhcHRlci0+c3RhdHMubXBjOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMubXBjOworCisJLyogVHggRXJyb3JzICovCisKKwlhZGFwdGVyLT5uZXRfc3RhdHMudHhfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMuZWNvbCArCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXItPnN0YXRzLmxhdGVjb2w7CisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMuZWNvbDsKKwlhZGFwdGVyLT5uZXRfc3RhdHMudHhfd2luZG93X2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLmxhdGVjb2w7CisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMudG5jcnM7CisKKwkvKiBUeCBEcm9wcGVkIG5lZWRzIHRvIGJlIG1haW50YWluZWQgZWxzZXdoZXJlICovCisKKwkvKiBQaHkgU3RhdHMgKi8KKworCWlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisJCWlmKChhZGFwdGVyLT5saW5rX3NwZWVkID09IFNQRUVEXzEwMDApICYmCisJCSAgICghZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfU1RBVFVTLCAmcGh5X3RtcCkpKSB7CisJCQlwaHlfdG1wICY9IFBIWV9JRExFX0VSUk9SX0NPVU5UX01BU0s7CisJCQlhZGFwdGVyLT5waHlfc3RhdHMuaWRsZV9lcnJvcnMgKz0gcGh5X3RtcDsKKwkJfQorCisJCWlmKChody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDYpICYmCisJCSAgIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgJiYKKwkJICAgIWUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUlhfRVJSX0NOVFIsICZwaHlfdG1wKSkKKwkJCWFkYXB0ZXItPnBoeV9zdGF0cy5yZWNlaXZlX2Vycm9ycyArPSBwaHlfdG1wOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnN0YXRzX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBlMTAwMF9pbnRyIC0gSW50ZXJydXB0IEhhbmRsZXIKKyAqIEBpcnE6IGludGVycnVwdCBudW1iZXIKKyAqIEBkYXRhOiBwb2ludGVyIHRvIGEgbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQHB0X3JlZ3M6IENQVSByZWdpc3RlcnMgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorZTEwMDBfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXVpbnQzMl90IGljciA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1IpOworI2lmbmRlZiBDT05GSUdfRTEwMDBfTkFQSQorCXVuc2lnbmVkIGludCBpOworI2VuZGlmCisKKwlpZih1bmxpa2VseSghaWNyKSkKKwkJcmV0dXJuIElSUV9OT05FOyAgLyogTm90IG91ciBpbnRlcnJ1cHQgKi8KKworCWlmKHVubGlrZWx5KGljciAmIChFMTAwMF9JQ1JfUlhTRVEgfCBFMTAwMF9JQ1JfTFNDKSkpIHsKKwkJaHctPmdldF9saW5rX3N0YXR1cyA9IDE7CisJCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMpOworCX0KKworI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCisJaWYobGlrZWx5KG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAobmV0ZGV2KSkpIHsKKworCQkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHJlZ2lzdGVyIGZvciBwb2xsLiBUaGUgZmx1c2ggCisJCSAgb2YgdGhlIHBvc3RlZCB3cml0ZSBpcyBpbnRlbnRpb25hbGx5IGxlZnQgb3V0LgorCQkqLworCisJCWF0b21pY19pbmMoJmFkYXB0ZXItPmlycV9zZW0pOworCQlFMTAwMF9XUklURV9SRUcoaHcsIElNQywgfjApOworCQlfX25ldGlmX3J4X3NjaGVkdWxlKG5ldGRldik7CisJfQorI2Vsc2UKKwkvKiBXcml0aW5nIElNQyBhbmQgSU1TIGlzIG5lZWRlZCBmb3IgODI1NDcuCisJICAgRHVlIHRvIEh1YiBMaW5rIGJ1cyBiZWluZyBvY2N1cGllZCwgYW4gaW50ZXJydXB0CisJICAgZGUtYXNzZXJ0aW9uIG1lc3NhZ2UgaXMgbm90IGFibGUgdG8gYmUgc2VudC4KKwkgICBXaGVuIGFuIGludGVycnVwdCBhc3NlcnRpb24gbWVzc2FnZSBpcyBnZW5lcmF0ZWQgbGF0ZXIsCisJICAgdHdvIG1lc3NhZ2VzIGFyZSByZS1vcmRlcmVkIGFuZCBzZW50IG91dC4KKwkgICBUaGF0IGNhdXNlcyBBUElDIHRvIHRoaW5rIDgyNTQ3IGlzIGluIGRlLWFzc2VydGlvbgorCSAgIHN0YXRlLCB3aGlsZSA4MjU0NyBpcyBpbiBhc3NlcnRpb24gc3RhdGUsIHJlc3VsdGluZworCSAgIGluIGRlYWQgbG9jay4gV3JpdGluZyBJTUMgZm9yY2VzIDgyNTQ3IGludG8KKwkgICBkZS1hc3NlcnRpb24gc3RhdGUuCisJKi8KKwlpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3X3Jldl8yKXsKKwkJYXRvbWljX2luYygmYWRhcHRlci0+aXJxX3NlbSk7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElNQywgfjApOworCX0KKworCWZvcihpID0gMDsgaSA8IEUxMDAwX01BWF9JTlRSOyBpKyspCisJCWlmKHVubGlrZWx5KCFlMTAwMF9jbGVhbl9yeF9pcnEoYWRhcHRlcikgJgorCQkgICAhZTEwMDBfY2xlYW5fdHhfaXJxKGFkYXB0ZXIpKSkKKwkJCWJyZWFrOworCisJaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3IHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMikKKwkJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKKyNlbmRpZgorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKKy8qKgorICogZTEwMDBfY2xlYW4gLSBOQVBJIFJ4IHBvbGxpbmcgY2FsbGJhY2sKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworCitzdGF0aWMgaW50CitlMTAwMF9jbGVhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlpbnQgd29ya190b19kbyA9IG1pbigqYnVkZ2V0LCBuZXRkZXYtPnF1b3RhKTsKKwlpbnQgdHhfY2xlYW5lZDsKKwlpbnQgd29ya19kb25lID0gMDsKKwkKKwl0eF9jbGVhbmVkID0gZTEwMDBfY2xlYW5fdHhfaXJxKGFkYXB0ZXIpOworCWUxMDAwX2NsZWFuX3J4X2lycShhZGFwdGVyLCAmd29ya19kb25lLCB3b3JrX3RvX2RvKTsKKworCSpidWRnZXQgLT0gd29ya19kb25lOworCW5ldGRldi0+cXVvdGEgLT0gd29ya19kb25lOworCQorCS8qIGlmIG5vIFR4IGFuZCBub3QgZW5vdWdoIFJ4IHdvcmsgZG9uZSwgZXhpdCB0aGUgcG9sbGluZyBtb2RlICovCisJaWYoKCF0eF9jbGVhbmVkICYmICh3b3JrX2RvbmUgPCB3b3JrX3RvX2RvKSkgfHwgCisJCQkJIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQluZXRpZl9yeF9jb21wbGV0ZShuZXRkZXYpOworCQllMTAwMF9pcnFfZW5hYmxlKGFkYXB0ZXIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworI2VuZGlmCisvKioKKyAqIGUxMDAwX2NsZWFuX3R4X2lycSAtIFJlY2xhaW0gcmVzb3VyY2VzIGFmdGVyIHRyYW5zbWl0IGNvbXBsZXRlcworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyBib29sZWFuX3QKK2UxMDAwX2NsZWFuX3R4X2lycShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlzdHJ1Y3QgZTEwMDBfdHhfZGVzYyAqdHhfZGVzYywgKmVvcF9kZXNjOworCXN0cnVjdCBlMTAwMF9idWZmZXIgKmJ1ZmZlcl9pbmZvOworCXVuc2lnbmVkIGludCBpLCBlb3A7CisJYm9vbGVhbl90IGNsZWFuZWQgPSBGQUxTRTsKKworCWkgPSB0eF9yaW5nLT5uZXh0X3RvX2NsZWFuOworCWVvcCA9IHR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldLm5leHRfdG9fd2F0Y2g7CisJZW9wX2Rlc2MgPSBFMTAwMF9UWF9ERVNDKCp0eF9yaW5nLCBlb3ApOworCisJd2hpbGUoZW9wX2Rlc2MtPnVwcGVyLmRhdGEgJiBjcHVfdG9fbGUzMihFMTAwMF9UWERfU1RBVF9ERCkpIHsKKwkJLyogcHJlLW1hdHVyZSB3cml0ZWJhY2sgb2YgVHggZGVzY3JpcHRvcnMgICAgICovCisJCS8qIGNsZWFyIChmcmVlIGJ1ZmZlcnMgYW5kIHVubWFwIHBjaV9tYXBwaW5nKSAqLworCQkvKiBwcmV2aW91c19idWZmZXJfaW5mbyAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJaWYgKGxpa2VseShhZGFwdGVyLT5wcmV2aW91c19idWZmZXJfaW5mby5za2IgIT0gTlVMTCkpIHsKKwkJCWUxMDAwX3VubWFwX2FuZF9mcmVlX3R4X3Jlc291cmNlKGFkYXB0ZXIsIAorCQkJCQkmYWRhcHRlci0+cHJldmlvdXNfYnVmZmVyX2luZm8pOworCQl9CisKKwkJZm9yKGNsZWFuZWQgPSBGQUxTRTsgIWNsZWFuZWQ7ICkgeworCQkJdHhfZGVzYyA9IEUxMDAwX1RYX0RFU0MoKnR4X3JpbmcsIGkpOworCQkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCQljbGVhbmVkID0gKGkgPT0gZW9wKTsKKworCQkJLyogcHJlLW1hdHVyZSB3cml0ZWJhY2sgb2YgVHggZGVzY3JpcHRvcnMgKi8KKwkJCS8qIHNhdmUgdGhlIGNsZWFuaW5nIG9mIHRoZSB0aGlzIGZvciB0aGUgICovCisJCQkvKiBuZXh0IGl0ZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJaWYgKGNsZWFuZWQpIHsKKwkJCQltZW1jcHkoJmFkYXB0ZXItPnByZXZpb3VzX2J1ZmZlcl9pbmZvLAorCQkJCQlidWZmZXJfaW5mbywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBlMTAwMF9idWZmZXIpKTsKKwkJCQltZW1zZXQoYnVmZmVyX2luZm8sCisJCQkJCTAsCisJCQkJCXNpemVvZihzdHJ1Y3QgZTEwMDBfYnVmZmVyKSk7CisJCQl9IGVsc2UgeworCQkJCWUxMDAwX3VubWFwX2FuZF9mcmVlX3R4X3Jlc291cmNlKGFkYXB0ZXIsIAorCQkJCQkJCWJ1ZmZlcl9pbmZvKTsKKwkJCX0KKworCQkJdHhfZGVzYy0+YnVmZmVyX2FkZHIgPSAwOworCQkJdHhfZGVzYy0+bG93ZXIuZGF0YSA9IDA7CisJCQl0eF9kZXNjLT51cHBlci5kYXRhID0gMDsKKworCQkJY2xlYW5lZCA9IChpID09IGVvcCk7CisJCQlpZih1bmxpa2VseSgrK2kgPT0gdHhfcmluZy0+Y291bnQpKSBpID0gMDsKKwkJfQorCQkKKwkJZW9wID0gdHhfcmluZy0+YnVmZmVyX2luZm9baV0ubmV4dF90b193YXRjaDsKKwkJZW9wX2Rlc2MgPSBFMTAwMF9UWF9ERVNDKCp0eF9yaW5nLCBlb3ApOworCX0KKworCXR4X3JpbmctPm5leHRfdG9fY2xlYW4gPSBpOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT50eF9sb2NrKTsKKworCWlmKHVubGlrZWx5KGNsZWFuZWQgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChuZXRkZXYpICYmCisJCSAgICBuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpKQorCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisKKwlzcGluX3VubG9jaygmYWRhcHRlci0+dHhfbG9jayk7CisgCisJaWYoYWRhcHRlci0+ZGV0ZWN0X3R4X2h1bmcpIHsKKwkJLyogZGV0ZWN0IGEgdHJhbnNtaXQgaGFuZyBpbiBoYXJkd2FyZSwgdGhpcyBzZXJpYWxpemVzIHRoZQorCQkgKiBjaGVjayB3aXRoIHRoZSBjbGVhcmluZyBvZiB0aW1lX3N0YW1wIGFuZCBtb3ZlbWVudCBvZiBpICovCisJCWFkYXB0ZXItPmRldGVjdF90eF9odW5nID0gRkFMU0U7CisJCWlmKHR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldLmRtYSAmJgorCQkgICB0aW1lX2FmdGVyKGppZmZpZXMsIHR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldLnRpbWVfc3RhbXAgKyBIWikgJiYKKwkJICAgIShFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfVFhPRkYpKQorCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCX0KKworCXJldHVybiBjbGVhbmVkOworfQorCisvKioKKyAqIGUxMDAwX3J4X2NoZWNrc3VtIC0gUmVjZWl2ZSBDaGVja3N1bSBPZmZsb2FkIGZvciA4MjU0MworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiBAcnhfZGVzYzogcmVjZWl2ZSBkZXNjcmlwdG9yCisgKiBAc2tfYnVmZjogc29ja2V0IGJ1ZmZlciB3aXRoIHJlY2VpdmVkIGRhdGEKKyAqKi8KKworc3RhdGljIGlubGluZSB2b2lkCitlMTAwMF9yeF9jaGVja3N1bShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBlMTAwMF9yeF9kZXNjICpyeF9kZXNjLAorICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiA4MjU0MyBvciBuZXdlciBvbmx5ICovCisJaWYodW5saWtlbHkoKGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NDMpIHx8CisJLyogSWdub3JlIENoZWNrc3VtIGJpdCBpcyBzZXQgKi8KKwkocnhfZGVzYy0+c3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfSVhTTSkgfHwKKwkvKiBUQ1AgQ2hlY2tzdW0gaGFzIG5vdCBiZWVuIGNhbGN1bGF0ZWQgKi8KKwkoIShyeF9kZXNjLT5zdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9UQ1BDUykpKSkgeworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCXJldHVybjsKKwl9CisKKwkvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlIGhhcmR3YXJlIGRpZCB0aGUgVENQIGNoZWNrc3VtICovCisJLyogbm93IGxvb2sgYXQgdGhlIFRDUCBjaGVja3N1bSBlcnJvciBiaXQgKi8KKwlpZihyeF9kZXNjLT5lcnJvcnMgJiBFMTAwMF9SWERfRVJSX1RDUEUpIHsKKwkJLyogbGV0IHRoZSBzdGFjayB2ZXJpZnkgY2hlY2tzdW0gZXJyb3JzICovCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJYWRhcHRlci0+aHdfY3N1bV9lcnIrKzsKKwl9IGVsc2UgeworCQkvKiBUQ1AgY2hlY2tzdW0gaXMgZ29vZCAqLworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQlhZGFwdGVyLT5od19jc3VtX2dvb2QrKzsKKwl9Cit9CisKKy8qKgorICogZTEwMDBfY2xlYW5fcnhfaXJxIC0gU2VuZCByZWNlaXZlZCBkYXRhIHVwIHRoZSBuZXR3b3JrIHN0YWNrCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KKworc3RhdGljIGJvb2xlYW5fdAorI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCitlMTAwMF9jbGVhbl9yeF9pcnEoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCAqd29ya19kb25lLAorICAgICAgICAgICAgICAgICAgIGludCB3b3JrX3RvX2RvKQorI2Vsc2UKK2UxMDAwX2NsZWFuX3J4X2lycShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKKyNlbmRpZgoreworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwlzdHJ1Y3QgZTEwMDBfcnhfZGVzYyAqcnhfZGVzYzsKKwlzdHJ1Y3QgZTEwMDBfYnVmZmVyICpidWZmZXJfaW5mbzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDMyX3QgbGVuZ3RoOworCXVpbnQ4X3QgbGFzdF9ieXRlOworCXVuc2lnbmVkIGludCBpOworCWJvb2xlYW5fdCBjbGVhbmVkID0gRkFMU0U7CisKKwlpID0gcnhfcmluZy0+bmV4dF90b19jbGVhbjsKKwlyeF9kZXNjID0gRTEwMDBfUlhfREVTQygqcnhfcmluZywgaSk7CisKKwl3aGlsZShyeF9kZXNjLT5zdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9ERCkgeworCQlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKyNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQorCQlpZigqd29ya19kb25lID49IHdvcmtfdG9fZG8pCisJCQlicmVhazsKKwkJKCp3b3JrX2RvbmUpKys7CisjZW5kaWYKKwkJY2xlYW5lZCA9IFRSVUU7CisKKwkJcGNpX3VubWFwX3NpbmdsZShwZGV2LAorCQkgICAgICAgICAgICAgICAgIGJ1ZmZlcl9pbmZvLT5kbWEsCisJCSAgICAgICAgICAgICAgICAgYnVmZmVyX2luZm8tPmxlbmd0aCwKKwkJICAgICAgICAgICAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCXNrYiA9IGJ1ZmZlcl9pbmZvLT5za2I7CisJCWxlbmd0aCA9IGxlMTZfdG9fY3B1KHJ4X2Rlc2MtPmxlbmd0aCk7CisKKwkJaWYodW5saWtlbHkoIShyeF9kZXNjLT5zdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9FT1ApKSkgeworCQkJLyogQWxsIHJlY2VpdmVzIG11c3QgZml0IGludG8gYSBzaW5nbGUgYnVmZmVyICovCisJCQlFMTAwMF9EQkcoIiVzOiBSZWNlaXZlIHBhY2tldCBjb25zdW1lZCBtdWx0aXBsZSIKKwkJCQkJIiBidWZmZXJzXG4iLCBuZXRkZXYtPm5hbWUpOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCWdvdG8gbmV4dF9kZXNjOworCQl9CisKKwkJaWYodW5saWtlbHkocnhfZGVzYy0+ZXJyb3JzICYgRTEwMDBfUlhEX0VSUl9GUkFNRV9FUlJfTUFTSykpIHsKKwkJCWxhc3RfYnl0ZSA9ICooc2tiLT5kYXRhICsgbGVuZ3RoIC0gMSk7CisJCQlpZihUQklfQUNDRVBUKCZhZGFwdGVyLT5odywgcnhfZGVzYy0+c3RhdHVzLAorCQkJICAgICAgICAgICAgICByeF9kZXNjLT5lcnJvcnMsIGxlbmd0aCwgbGFzdF9ieXRlKSkgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7CisJCQkJZTEwMDBfdGJpX2FkanVzdF9zdGF0cygmYWRhcHRlci0+aHcsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAmYWRhcHRlci0+c3RhdHMsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIHNrYi0+ZGF0YSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c3RhdHNfbG9jaywKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKwkJCQlsZW5ndGgtLTsKKwkJCX0gZWxzZSB7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCQlnb3RvIG5leHRfZGVzYzsKKwkJCX0KKwkJfQorCisJCS8qIEdvb2QgUmVjZWl2ZSAqLworCQlza2JfcHV0KHNrYiwgbGVuZ3RoIC0gRVRIRVJORVRfRkNTX1NJWkUpOworCisJCS8qIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCAqLworCQllMTAwMF9yeF9jaGVja3N1bShhZGFwdGVyLCByeF9kZXNjLCBza2IpOworCisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7CisjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKKwkJaWYodW5saWtlbHkoYWRhcHRlci0+dmxncnAgJiYKKwkJCSAgICAocnhfZGVzYy0+c3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfVlApKSkgeworCQkJdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKHNrYiwgYWRhcHRlci0+dmxncnAsCisJCQkJCWxlMTZfdG9fY3B1KHJ4X2Rlc2MtPnNwZWNpYWwpICYKKwkJCQkJRTEwMDBfUlhEX1NQQ19WTEFOX01BU0spOworCQl9IGVsc2UgeworCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwkJfQorI2Vsc2UgLyogQ09ORklHX0UxMDAwX05BUEkgKi8KKwkJaWYodW5saWtlbHkoYWRhcHRlci0+dmxncnAgJiYKKwkJCSAgICAocnhfZGVzYy0+c3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfVlApKSkgeworCQkJdmxhbl9od2FjY2VsX3J4KHNrYiwgYWRhcHRlci0+dmxncnAsCisJCQkJCWxlMTZfdG9fY3B1KHJ4X2Rlc2MtPnNwZWNpYWwpICYKKwkJCQkJRTEwMDBfUlhEX1NQQ19WTEFOX01BU0spOworCQl9IGVsc2UgeworCQkJbmV0aWZfcngoc2tiKTsKKwkJfQorI2VuZGlmIC8qIENPTkZJR19FMTAwMF9OQVBJICovCisJCW5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKK25leHRfZGVzYzoKKwkJcnhfZGVzYy0+c3RhdHVzID0gMDsKKwkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisJCWlmKHVubGlrZWx5KCsraSA9PSByeF9yaW5nLT5jb3VudCkpIGkgPSAwOworCisJCXJ4X2Rlc2MgPSBFMTAwMF9SWF9ERVNDKCpyeF9yaW5nLCBpKTsKKwl9CisKKwlyeF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gaTsKKworCWUxMDAwX2FsbG9jX3J4X2J1ZmZlcnMoYWRhcHRlcik7CisKKwlyZXR1cm4gY2xlYW5lZDsKK30KKworLyoqCisgKiBlMTAwMF9hbGxvY19yeF9idWZmZXJzIC0gUmVwbGFjZSB1c2VkIHJlY2VpdmUgYnVmZmVycworICogQGFkYXB0ZXI6IGFkZHJlc3Mgb2YgYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KKworc3RhdGljIHZvaWQKK2UxMDAwX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXN0cnVjdCBlMTAwMF9yeF9kZXNjICpyeF9kZXNjOworCXN0cnVjdCBlMTAwMF9idWZmZXIgKmJ1ZmZlcl9pbmZvOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IGksIGJ1ZnN6OworCisJaSA9IHJ4X3JpbmctPm5leHRfdG9fdXNlOworCWJ1ZmZlcl9pbmZvID0gJnJ4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCisJd2hpbGUoIWJ1ZmZlcl9pbmZvLT5za2IpIHsKKwkJYnVmc3ogPSBhZGFwdGVyLT5yeF9idWZmZXJfbGVuICsgTkVUX0lQX0FMSUdOOworCisJCXNrYiA9IGRldl9hbGxvY19za2IoYnVmc3opOworCQlpZih1bmxpa2VseSghc2tiKSkgeworCQkJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZCAqLworCQkJYnJlYWs7CisJCX0KKworCQkvKiBmaXggZm9yIGVycmF0YSAyMywgY2FudCBjcm9zcyA2NGtCIGJvdW5kYXJ5ICovCisJCWlmICghZTEwMDBfY2hlY2tfNjRrX2JvdW5kKGFkYXB0ZXIsIHNrYi0+ZGF0YSwgYnVmc3opKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqb2xkc2tiID0gc2tiOworCQkJRFBSSU5USyhSWF9FUlIsRVJSLAorCQkJCSJza2IgYWxpZ24gY2hlY2sgZmFpbGVkOiAldSBieXRlcyBhdCAlcFxuIiwKKwkJCQlidWZzeiwgc2tiLT5kYXRhKTsKKwkJCS8qIHRyeSBhZ2Fpbiwgd2l0aG91dCBmcmVlaW5nIHRoZSBwcmV2aW91cyAqLworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihidWZzeik7CisJCQlpZiAoIXNrYikgeworCQkJCWRldl9rZnJlZV9za2Iob2xkc2tiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghZTEwMDBfY2hlY2tfNjRrX2JvdW5kKGFkYXB0ZXIsIHNrYi0+ZGF0YSwgYnVmc3opKSB7CisJCQkJLyogZ2l2ZSB1cCAqLworCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCQlkZXZfa2ZyZWVfc2tiKG9sZHNrYik7CisJCQkJYnJlYWs7IC8qIHdoaWxlICFidWZmZXJfaW5mby0+c2tiICovCisJCQl9IGVsc2UgeworCQkJCS8qIG1vdmUgb24gd2l0aCB0aGUgbmV3IG9uZSAqLworCQkJCWRldl9rZnJlZV9za2Iob2xkc2tiKTsKKwkJCX0KKwkJfQorCisJCS8qIE1ha2UgYnVmZmVyIGFsaWdubWVudCAyIGJleW9uZCBhIDE2IGJ5dGUgYm91bmRhcnkKKwkJICogdGhpcyB3aWxsIHJlc3VsdCBpbiBhIDE2IGJ5dGUgYWxpZ25lZCBJUCBoZWFkZXIgYWZ0ZXIKKwkJICogdGhlIDE0IGJ5dGUgTUFDIGhlYWRlciBpcyByZW1vdmVkCisJCSAqLworCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisKKwkJc2tiLT5kZXYgPSBuZXRkZXY7CisKKwkJYnVmZmVyX2luZm8tPnNrYiA9IHNrYjsKKwkJYnVmZmVyX2luZm8tPmxlbmd0aCA9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW47CisJCWJ1ZmZlcl9pbmZvLT5kbWEgPSBwY2lfbWFwX3NpbmdsZShwZGV2LAorCQkJCQkJICBza2ItPmRhdGEsCisJCQkJCQkgIGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4sCisJCQkJCQkgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJLyogZml4IGZvciBlcnJhdGEgMjMsIGNhbnQgY3Jvc3MgNjRrQiBib3VuZGFyeSAqLworCQlpZighZTEwMDBfY2hlY2tfNjRrX2JvdW5kKGFkYXB0ZXIsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpYnVmZmVyX2luZm8tPmRtYSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci0+cnhfYnVmZmVyX2xlbikpIHsKKwkJCURQUklOVEsoUlhfRVJSLEVSUiwKKwkJCQkiZG1hIGFsaWduIGNoZWNrIGZhaWxlZDogJXUgYnl0ZXMgYXQgJWxkXG4iLAorCQkJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4sICh1bnNpZ25lZCBsb25nKWJ1ZmZlcl9pbmZvLT5kbWEpOworCisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKKworCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LAorCQkJCQkgYnVmZmVyX2luZm8tPmRtYSwKKwkJCQkJIGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4sCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQlicmVhazsgLyogd2hpbGUgIWJ1ZmZlcl9pbmZvLT5za2IgKi8KKwkJfQorCisJCXJ4X2Rlc2MgPSBFMTAwMF9SWF9ERVNDKCpyeF9yaW5nLCBpKTsKKwkJcnhfZGVzYy0+YnVmZmVyX2FkZHIgPSBjcHVfdG9fbGU2NChidWZmZXJfaW5mby0+ZG1hKTsKKworCQlpZih1bmxpa2VseSgoaSAmIH4oRTEwMDBfUlhfQlVGRkVSX1dSSVRFIC0gMSkpID09IGkpKSB7CisJCQkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIHRvIGNvbXBsZXRlIGJlZm9yZSBsZXR0aW5nIGgvdworCQkJICoga25vdyB0aGVyZSBhcmUgbmV3IGRlc2NyaXB0b3JzIHRvIGZldGNoLiAgKE9ubHkKKwkJCSAqIGFwcGxpY2FibGUgZm9yIHdlYWstb3JkZXJlZCBtZW1vcnkgbW9kZWwgYXJjaHMsCisJCQkgKiBzdWNoIGFzIElBLTY0KS4gKi8KKwkJCXdtYigpOworCisJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRFQsIGkpOworCQl9CisKKwkJaWYodW5saWtlbHkoKytpID09IHJ4X3JpbmctPmNvdW50KSkgaSA9IDA7CisJCWJ1ZmZlcl9pbmZvID0gJnJ4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCX0KKworCXJ4X3JpbmctPm5leHRfdG9fdXNlID0gaTsKK30KKworLyoqCisgKiBlMTAwMF9zbWFydHNwZWVkIC0gV29ya2Fyb3VuZCBmb3IgU21hcnRTcGVlZCBvbiA4MjU0MSBhbmQgODI1NDcgY29udHJvbGxlcnMuCisgKiBAYWRhcHRlcjoKKyAqKi8KKworc3RhdGljIHZvaWQKK2UxMDAwX3NtYXJ0c3BlZWQoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdWludDE2X3QgcGh5X3N0YXR1czsKKwl1aW50MTZfdCBwaHlfY3RybDsKKworCWlmKChhZGFwdGVyLT5ody5waHlfdHlwZSAhPSBlMTAwMF9waHlfaWdwKSB8fCAhYWRhcHRlci0+aHcuYXV0b25lZyB8fAorCSAgICEoYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwMDBfRlVMTCkpCisJCXJldHVybjsKKworCWlmKGFkYXB0ZXItPnNtYXJ0c3BlZWQgPT0gMCkgeworCQkvKiBJZiBNYXN0ZXIvU2xhdmUgY29uZmlnIGZhdWx0IGlzIGFzc2VydGVkIHR3aWNlLAorCQkgKiB3ZSBhc3N1bWUgYmFjay10by1iYWNrICovCisJCWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV8xMDAwVF9TVEFUVVMsICZwaHlfc3RhdHVzKTsKKwkJaWYoIShwaHlfc3RhdHVzICYgU1JfMTAwMFRfTVNfQ09ORklHX0ZBVUxUKSkgcmV0dXJuOworCQllMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfMTAwMFRfU1RBVFVTLCAmcGh5X3N0YXR1cyk7CisJCWlmKCEocGh5X3N0YXR1cyAmIFNSXzEwMDBUX01TX0NPTkZJR19GQVVMVCkpIHJldHVybjsKKwkJZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZXzEwMDBUX0NUUkwsICZwaHlfY3RybCk7CisJCWlmKHBoeV9jdHJsICYgQ1JfMTAwMFRfTVNfRU5BQkxFKSB7CisJCQlwaHlfY3RybCAmPSB+Q1JfMTAwMFRfTVNfRU5BQkxFOworCQkJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV8xMDAwVF9DVFJMLAorCQkJCQkgICAgcGh5X2N0cmwpOworCQkJYWRhcHRlci0+c21hcnRzcGVlZCsrOworCQkJaWYoIWUxMDAwX3BoeV9zZXR1cF9hdXRvbmVnKCZhZGFwdGVyLT5odykgJiYKKwkJCSAgICFlMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfQ1RSTCwKKwkJCQkgICAJICAgICAgICZwaHlfY3RybCkpIHsKKwkJCQlwaHlfY3RybCB8PSAoTUlJX0NSX0FVVE9fTkVHX0VOIHwKKwkJCQkJICAgICBNSUlfQ1JfUkVTVEFSVF9BVVRPX05FRyk7CisJCQkJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLAorCQkJCQkJICAgIHBoeV9jdHJsKTsKKwkJCX0KKwkJfQorCQlyZXR1cm47CisJfSBlbHNlIGlmKGFkYXB0ZXItPnNtYXJ0c3BlZWQgPT0gRTEwMDBfU01BUlRTUEVFRF9ET1dOU0hJRlQpIHsKKwkJLyogSWYgc3RpbGwgbm8gbGluaywgcGVyaGFwcyB1c2luZyAyLzMgcGFpciBjYWJsZSAqLworCQllMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfMTAwMFRfQ1RSTCwgJnBoeV9jdHJsKTsKKwkJcGh5X2N0cmwgfD0gQ1JfMTAwMFRfTVNfRU5BQkxFOworCQllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZXzEwMDBUX0NUUkwsIHBoeV9jdHJsKTsKKwkJaWYoIWUxMDAwX3BoeV9zZXR1cF9hdXRvbmVnKCZhZGFwdGVyLT5odykgJiYKKwkJICAgIWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLCAmcGh5X2N0cmwpKSB7CisJCQlwaHlfY3RybCB8PSAoTUlJX0NSX0FVVE9fTkVHX0VOIHwKKwkJCQkgICAgIE1JSV9DUl9SRVNUQVJUX0FVVE9fTkVHKTsKKwkJCWUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfQ1RSTCwgcGh5X2N0cmwpOworCQl9CisJfQorCS8qIFJlc3RhcnQgcHJvY2VzcyBhZnRlciBFMTAwMF9TTUFSVFNQRUVEX01BWCBpdGVyYXRpb25zICovCisJaWYoYWRhcHRlci0+c21hcnRzcGVlZCsrID09IEUxMDAwX1NNQVJUU1BFRURfTUFYKQorCQlhZGFwdGVyLT5zbWFydHNwZWVkID0gMDsKK30KKworLyoqCisgKiBlMTAwMF9pb2N0bCAtCisgKiBAbmV0ZGV2OgorICogQGlmcmVxOgorICogQGNtZDoKKyAqKi8KKworc3RhdGljIGludAorZTEwMDBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCWNhc2UgU0lPQ0dNSUlSRUc6CisJY2FzZSBTSU9DU01JSVJFRzoKKwkJcmV0dXJuIGUxMDAwX21paV9pb2N0bChuZXRkZXYsIGlmciwgY21kKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCisvKioKKyAqIGUxMDAwX21paV9pb2N0bCAtCisgKiBAbmV0ZGV2OgorICogQGlmcmVxOgorICogQGNtZDoKKyAqKi8KKworc3RhdGljIGludAorZTEwMDBfbWlpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShpZnIpOworCWludCByZXR2YWw7CisJdWludDE2X3QgbWlpX3JlZzsKKwl1aW50MTZfdCBzcGRkcGx4OworCisJaWYoYWRhcHRlci0+aHcubWVkaWFfdHlwZSAhPSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCQlkYXRhLT5waHlfaWQgPSBhZGFwdGVyLT5ody5waHlfYWRkcjsKKwkJYnJlYWs7CisJY2FzZSBTSU9DR01JSVJFRzoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIGRhdGEtPnJlZ19udW0gJiAweDFGLAorCQkJCSAgICZkYXRhLT52YWxfb3V0KSkKKwkJCXJldHVybiAtRUlPOworCQlicmVhazsKKwljYXNlIFNJT0NTTUlJUkVHOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoZGF0YS0+cmVnX251bSAmIH4oMHgxRikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbWlpX3JlZyA9IGRhdGEtPnZhbF9pbjsKKwkJaWYgKGUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBkYXRhLT5yZWdfbnVtLAorCQkJCQltaWlfcmVnKSkKKwkJCXJldHVybiAtRUlPOworCQlpZiAoYWRhcHRlci0+aHcucGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgeworCQkJc3dpdGNoIChkYXRhLT5yZWdfbnVtKSB7CisJCQljYXNlIFBIWV9DVFJMOgorCQkJCWlmKG1paV9yZWcgJiBNSUlfQ1JfUE9XRVJfRE9XTikKKwkJCQkJYnJlYWs7CisJCQkJaWYobWlpX3JlZyAmIE1JSV9DUl9BVVRPX05FR19FTikgeworCQkJCQlhZGFwdGVyLT5ody5hdXRvbmVnID0gMTsKKwkJCQkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gMHgyRjsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAobWlpX3JlZyAmIDB4NDApCisJCQkJCQlzcGRkcGx4ID0gU1BFRURfMTAwMDsKKwkJCQkJZWxzZSBpZiAobWlpX3JlZyAmIDB4MjAwMCkKKwkJCQkJCXNwZGRwbHggPSBTUEVFRF8xMDA7CisJCQkJCWVsc2UKKwkJCQkJCXNwZGRwbHggPSBTUEVFRF8xMDsKKwkJCQkJc3BkZHBseCArPSAobWlpX3JlZyAmIDB4MTAwKQorCQkJCQkJICAgPyBGVUxMX0RVUExFWCA6CisJCQkJCQkgICBIQUxGX0RVUExFWDsKKwkJCQkJcmV0dmFsID0gZTEwMDBfc2V0X3NwZF9kcGx4KGFkYXB0ZXIsCisJCQkJCQkJCSAgICBzcGRkcGx4KTsKKwkJCQkJaWYocmV0dmFsKQorCQkJCQkJcmV0dXJuIHJldHZhbDsKKwkJCQl9CisJCQkJaWYobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CisJCQkJCWUxMDAwX2Rvd24oYWRhcHRlcik7CisJCQkJCWUxMDAwX3VwKGFkYXB0ZXIpOworCQkJCX0gZWxzZQorCQkJCQllMTAwMF9yZXNldChhZGFwdGVyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTDoKKwkJCWNhc2UgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkw6CisJCQkJaWYgKGUxMDAwX3BoeV9yZXNldCgmYWRhcHRlci0+aHcpKQorCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoZGF0YS0+cmVnX251bSkgeworCQkJY2FzZSBQSFlfQ1RSTDoKKwkJCQlpZihtaWlfcmVnICYgTUlJX0NSX1BPV0VSX0RPV04pCisJCQkJCWJyZWFrOworCQkJCWlmKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgeworCQkJCQllMTAwMF9kb3duKGFkYXB0ZXIpOworCQkJCQllMTAwMF91cChhZGFwdGVyKTsKKwkJCQl9IGVsc2UKKwkJCQkJZTEwMDBfcmVzZXQoYWRhcHRlcik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKwordm9pZAorZTEwMDBfcGNpX3NldF9td2koc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IGh3LT5iYWNrOworCisJaW50IHJldDsKKwlyZXQgPSBwY2lfc2V0X213aShhZGFwdGVyLT5wZGV2KTsKK30KKwordm9pZAorZTEwMDBfcGNpX2NsZWFyX213aShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gaHctPmJhY2s7CisKKwlwY2lfY2xlYXJfbXdpKGFkYXB0ZXItPnBkZXYpOworfQorCit2b2lkCitlMTAwMF9yZWFkX3BjaV9jZmcoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnLCB1aW50MTZfdCAqdmFsdWUpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBody0+YmFjazsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFkYXB0ZXItPnBkZXYsIHJlZywgdmFsdWUpOworfQorCit2b2lkCitlMTAwMF93cml0ZV9wY2lfY2ZnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZywgdWludDE2X3QgKnZhbHVlKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gaHctPmJhY2s7CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWRhcHRlci0+cGRldiwgcmVnLCAqdmFsdWUpOworfQorCit1aW50MzJfdAorZTEwMDBfaW9fcmVhZChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJcmV0dXJuIGlubChwb3J0KTsKK30KKwordm9pZAorZTEwMDBfaW9fd3JpdGUoc3RydWN0IGUxMDAwX2h3ICpodywgdW5zaWduZWQgbG9uZyBwb3J0LCB1aW50MzJfdCB2YWx1ZSkKK3sKKwlvdXRsKHZhbHVlLCBwb3J0KTsKK30KKworc3RhdGljIHZvaWQKK2UxMDAwX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwl1aW50MzJfdCBjdHJsLCByY3RsOworCisJZTEwMDBfaXJxX2Rpc2FibGUoYWRhcHRlcik7CisJYWRhcHRlci0+dmxncnAgPSBncnA7CisKKwlpZihncnApIHsKKwkJLyogZW5hYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLworCQljdHJsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMKTsKKwkJY3RybCB8PSBFMTAwMF9DVFJMX1ZNRTsKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgQ1RSTCwgY3RybCk7CisKKwkJLyogZW5hYmxlIFZMQU4gcmVjZWl2ZSBmaWx0ZXJpbmcgKi8KKwkJcmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7CisJCXJjdGwgfD0gRTEwMDBfUkNUTF9WRkU7CisJCXJjdGwgJj0gfkUxMDAwX1JDVExfQ0ZJRU47CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOworCX0gZWxzZSB7CisJCS8qIGRpc2FibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisJCWN0cmwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIENUUkwpOworCQljdHJsICY9IH5FMTAwMF9DVFJMX1ZNRTsKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgQ1RSTCwgY3RybCk7CisKKwkJLyogZGlzYWJsZSBWTEFOIGZpbHRlcmluZyAqLworCQlyY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMKTsKKwkJcmN0bCAmPSB+RTEwMDBfUkNUTF9WRkU7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOworCX0KKworCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwMF92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDE2X3QgdmlkKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXVpbnQzMl90IHZmdGEsIGluZGV4OworCisJLyogYWRkIFZJRCB0byBmaWx0ZXIgdGFibGUgKi8KKwlpbmRleCA9ICh2aWQgPj4gNSkgJiAweDdGOworCXZmdGEgPSBFMTAwMF9SRUFEX1JFR19BUlJBWSgmYWRhcHRlci0+aHcsIFZGVEEsIGluZGV4KTsKKwl2ZnRhIHw9ICgxIDw8ICh2aWQgJiAweDFGKSk7CisJZTEwMDBfd3JpdGVfdmZ0YSgmYWRhcHRlci0+aHcsIGluZGV4LCB2ZnRhKTsKK30KKworc3RhdGljIHZvaWQKK2UxMDAwX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDE2X3QgdmlkKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXVpbnQzMl90IHZmdGEsIGluZGV4OworCisJZTEwMDBfaXJxX2Rpc2FibGUoYWRhcHRlcik7CisKKwlpZihhZGFwdGVyLT52bGdycCkKKwkJYWRhcHRlci0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdID0gTlVMTDsKKworCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7CisKKwkvKiByZW1vdmUgVklEIGZyb20gZmlsdGVyIHRhYmxlICovCisJaW5kZXggPSAodmlkID4+IDUpICYgMHg3RjsKKwl2ZnRhID0gRTEwMDBfUkVBRF9SRUdfQVJSQVkoJmFkYXB0ZXItPmh3LCBWRlRBLCBpbmRleCk7CisJdmZ0YSAmPSB+KDEgPDwgKHZpZCAmIDB4MUYpKTsKKwllMTAwMF93cml0ZV92ZnRhKCZhZGFwdGVyLT5odywgaW5kZXgsIHZmdGEpOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfcmVzdG9yZV92bGFuKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCWUxMDAwX3ZsYW5fcnhfcmVnaXN0ZXIoYWRhcHRlci0+bmV0ZGV2LCBhZGFwdGVyLT52bGdycCk7CisKKwlpZihhZGFwdGVyLT52bGdycCkgeworCQl1aW50MTZfdCB2aWQ7CisJCWZvcih2aWQgPSAwOyB2aWQgPCBWTEFOX0dST1VQX0FSUkFZX0xFTjsgdmlkKyspIHsKKwkJCWlmKCFhZGFwdGVyLT52bGdycC0+dmxhbl9kZXZpY2VzW3ZpZF0pCisJCQkJY29udGludWU7CisJCQllMTAwMF92bGFuX3J4X2FkZF92aWQoYWRhcHRlci0+bmV0ZGV2LCB2aWQpOworCQl9CisJfQorfQorCitpbnQKK2UxMDAwX3NldF9zcGRfZHBseChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwgdWludDE2X3Qgc3BkZHBseCkKK3sKKwlhZGFwdGVyLT5ody5hdXRvbmVnID0gMDsKKworCXN3aXRjaChzcGRkcGx4KSB7CisJY2FzZSBTUEVFRF8xMCArIERVUExFWF9IQUxGOgorCQlhZGFwdGVyLT5ody5mb3JjZWRfc3BlZWRfZHVwbGV4ID0gZTEwMDBfMTBfaGFsZjsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMCArIERVUExFWF9GVUxMOgorCQlhZGFwdGVyLT5ody5mb3JjZWRfc3BlZWRfZHVwbGV4ID0gZTEwMDBfMTBfZnVsbDsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDAgKyBEVVBMRVhfSEFMRjoKKwkJYWRhcHRlci0+aHcuZm9yY2VkX3NwZWVkX2R1cGxleCA9IGUxMDAwXzEwMF9oYWxmOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMCArIERVUExFWF9GVUxMOgorCQlhZGFwdGVyLT5ody5mb3JjZWRfc3BlZWRfZHVwbGV4ID0gZTEwMDBfMTAwX2Z1bGw7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwMCArIERVUExFWF9GVUxMOgorCQlhZGFwdGVyLT5ody5hdXRvbmVnID0gMTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gQURWRVJUSVNFXzEwMDBfRlVMTDsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDAwICsgRFVQTEVYX0hBTEY6IC8qIG5vdCBzdXBwb3J0ZWQgKi8KKwlkZWZhdWx0OgorCQlEUFJJTlRLKFBST0JFLCBFUlIsIAorCQkJIlVuc3VwcG9ydGVkIFNwZWVkL0R1cGxleGl0eSBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlMTAwMF9ub3RpZnlfcmVib290KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnApCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBTWVNfRE9XTjoKKwljYXNlIFNZU19IQUxUOgorCWNhc2UgU1lTX1BPV0VSX09GRjoKKwkJd2hpbGUoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGRldikpKSB7CisJCQlpZihwY2lfZGV2X2RyaXZlcihwZGV2KSA9PSAmZTEwMDBfZHJpdmVyKQorCQkJCWUxMDAwX3N1c3BlbmQocGRldiwgMyk7CisJCX0KKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgaW50CitlMTAwMF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1aW50MzJfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXVpbnQzMl90IGN0cmwsIGN0cmxfZXh0LCByY3RsLCBtYW5jLCBzdGF0dXM7CisJdWludDMyX3Qgd3VmYyA9IGFkYXB0ZXItPndvbDsKKworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKworCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJZTEwMDBfZG93bihhZGFwdGVyKTsKKworCXN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKTsKKwlpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfTFUpCisJCXd1ZmMgJj0gfkUxMDAwX1dVRkNfTE5LQzsKKworCWlmKHd1ZmMpIHsKKwkJZTEwMDBfc2V0dXBfcmN0bChhZGFwdGVyKTsKKwkJZTEwMDBfc2V0X211bHRpKG5ldGRldik7CisKKwkJLyogdHVybiBvbiBhbGwtbXVsdGkgbW9kZSBpZiB3YWtlIG9uIG11bHRpY2FzdCBpcyBlbmFibGVkICovCisJCWlmKGFkYXB0ZXItPndvbCAmIEUxMDAwX1dVRkNfTUMpIHsKKwkJCXJjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJDVEwpOworCQkJcmN0bCB8PSBFMTAwMF9SQ1RMX01QRTsKKwkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOworCQl9CisKKwkJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDApIHsKKwkJCWN0cmwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIENUUkwpOworCQkJLyogYWR2ZXJ0aXNlIHdha2UgZnJvbSBEM0NvbGQgKi8KKwkJCSNkZWZpbmUgRTEwMDBfQ1RSTF9BRFZEM1dVQyAweDAwMTAwMDAwCisJCQkvKiBwaHkgcG93ZXIgbWFuYWdlbWVudCBlbmFibGUgKi8KKwkJCSNkZWZpbmUgRTEwMDBfQ1RSTF9FTl9QSFlfUFdSX01HTVQgMHgwMDIwMDAwMAorCQkJY3RybCB8PSBFMTAwMF9DVFJMX0FEVkQzV1VDIHwKKwkJCQlFMTAwMF9DVFJMX0VOX1BIWV9QV1JfTUdNVDsKKwkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkwsIGN0cmwpOworCQl9CisKKwkJaWYoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyIHx8CisJCSAgIGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpIHsKKwkJCS8qIGtlZXAgdGhlIGxhc2VyIHJ1bm5pbmcgaW4gRDMgKi8KKwkJCWN0cmxfZXh0ID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMX0VYVCk7CisJCQljdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9TRFA3X0RBVEE7CisJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMX0VYVCwgY3RybF9leHQpOworCQl9CisKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgV1VDLCBFMTAwMF9XVUNfUE1FX0VOKTsKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgV1VGQywgd3VmYyk7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCAzLCAxKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDQsIDEpOyAvKiA0ID09IEQzIGNvbGQgKi8KKwl9IGVsc2UgeworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBXVUMsIDApOworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBXVUZDLCAwKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDMsIDApOworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgNCwgMCk7IC8qIDQgPT0gRDMgY29sZCAqLworCX0KKworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYKKwkgICBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisJCW1hbmMgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1BTkMpOworCQlpZihtYW5jICYgRTEwMDBfTUFOQ19TTUJVU19FTikgeworCQkJbWFuYyB8PSBFMTAwMF9NQU5DX0FSUF9FTjsKKwkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIE1BTkMsIG1hbmMpOworCQkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDMsIDEpOworCQkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDQsIDEpOyAvKiA0ID09IEQzIGNvbGQgKi8KKwkJfQorCX0KKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXN0YXRlID0gKHN0YXRlID4gMCkgPyAzIDogMDsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHN0YXRlKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50CitlMTAwMF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwl1aW50MzJfdCBtYW5jLCByZXQ7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChwZGV2LT5pc19idXNtYXN0ZXIpCisJCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDMsIDApOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCA0LCAwKTsgLyogNCA9PSBEMyBjb2xkICovCisKKwllMTAwMF9yZXNldChhZGFwdGVyKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBXVVMsIH4wKTsKKworCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJZTEwMDBfdXAoYWRhcHRlcik7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CisKKwlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCAmJgorCSAgIGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKwkJbWFuYyA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgTUFOQyk7CisJCW1hbmMgJj0gfihFMTAwMF9NQU5DX0FSUF9FTik7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIE1BTkMsIG1hbmMpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyoKKyAqIFBvbGxpbmcgJ2ludGVycnVwdCcgLSB1c2VkIGJ5IHRoaW5ncyBsaWtlIG5ldGNvbnNvbGUgdG8gc2VuZCBza2JzCisgKiB3aXRob3V0IGhhdmluZyB0byByZS1lbmFibGUgaW50ZXJydXB0cy4gSXQncyBub3QgY2FsbGVkIHdoaWxlCisgKiB0aGUgaW50ZXJydXB0IHJvdXRpbmUgaXMgZXhlY3V0aW5nLgorICovCitzdGF0aWMgdm9pZAorZTEwMDBfbmV0cG9sbCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlkaXNhYmxlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEpOworCWUxMDAwX2ludHIoYWRhcHRlci0+cGRldi0+aXJxLCBuZXRkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKK30KKyNlbmRpZgorCisvKiBlMTAwMF9tYWluLmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX29zZGVwLmggYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9vc2RlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MGM2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9vc2RlcC5oCkBAIC0wLDAgKzEsMTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIAorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisgIGFueSBsYXRlciB2ZXJzaW9uLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisgIG1vcmUgZGV0YWlscy4KKyAgCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAgCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICAKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBnbHVlIGZvciB0aGUgT1MgaW5kZXBlbmRlbnQgcGFydCBvZiBlMTAwMAorICogaW5jbHVkZXMgcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcworICovCisKKyNpZm5kZWYgX0UxMDAwX09TREVQX0hfCisjZGVmaW5lIF9FMTAwMF9PU0RFUF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpZm5kZWYgbXNlY19kZWxheQorI2RlZmluZSBtc2VjX2RlbGF5KHgpIG1zbGVlcCh4KQorCisvKiBTb21lIHdvcmthcm91bmRzIHJlcXVpcmUgbWlsbGlzZWNvbmQgZGVsYXlzIGFuZCBhcmUgcnVuIGR1cmluZyBpbnRlcnJ1cHQKKyAqIGNvbnRleHQuICBNb3N0IG5vdGFibHksIHdoZW4gZXN0YWJsaXNoaW5nIGxpbmssIHRoZSBwaHkgbWF5IG5lZWQgdHdlYWtpbmcKKyAqIGJ1dCBjYW5ub3QgcHJvY2VzcyBwaHkgcmVnaXN0ZXIgcmVhZHMvd3JpdGVzIGZhc3RlciB0aGFuIG1pbGxpc2Vjb25kCisgKiBpbnRlcnZhbHMuLi5hbmQgd2UgZXN0YWJsaXNoIGxpbmsgZHVlIHRvIGEgImxpbmsgc3RhdHVzIGNoYW5nZSIgaW50ZXJydXB0LgorICovCisjZGVmaW5lIG1zZWNfZGVsYXlfaXJxKHgpIG1kZWxheSh4KQorI2VuZGlmCisKKyNkZWZpbmUgUENJX0NPTU1BTkRfUkVHSVNURVIgICBQQ0lfQ09NTUFORAorI2RlZmluZSBDTURfTUVNX1dSVF9JTlZBTElEQVRFIFBDSV9DT01NQU5EX0lOVkFMSURBVEUKKwordHlwZWRlZiBlbnVtIHsKKyN1bmRlZiBGQUxTRQorICAgIEZBTFNFID0gMCwKKyN1bmRlZiBUUlVFCisgICAgVFJVRSA9IDEKK30gYm9vbGVhbl90OworCisjZGVmaW5lIE1TR09VVChTLCBBLCBCKQlwcmludGsoS0VSTl9ERUJVRyBTICJcbiIsIEEsIEIpCisKKyNpZmRlZiBEQkcKKyNkZWZpbmUgREVCVUdPVVQoUykJCXByaW50ayhLRVJOX0RFQlVHIFMgIlxuIikKKyNkZWZpbmUgREVCVUdPVVQxKFMsIEEuLi4pCXByaW50ayhLRVJOX0RFQlVHIFMgIlxuIiwgQSkKKyNlbHNlCisjZGVmaW5lIERFQlVHT1VUKFMpCisjZGVmaW5lIERFQlVHT1VUMShTLCBBLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgREVCVUdGVU5DKEYpIERFQlVHT1VUKEYpCisjZGVmaW5lIERFQlVHT1VUMiBERUJVR09VVDEKKyNkZWZpbmUgREVCVUdPVVQzIERFQlVHT1VUMgorI2RlZmluZSBERUJVR09VVDcgREVCVUdPVVQzCisKKworI2RlZmluZSBFMTAwMF9XUklURV9SRUcoYSwgcmVnLCB2YWx1ZSkgKCBcCisgICAgd3JpdGVsKCh2YWx1ZSksICgoYSktPmh3X2FkZHIgKyBcCisgICAgICAgICgoKGEpLT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgPyBFMTAwMF8jI3JlZyA6IEUxMDAwXzgyNTQyXyMjcmVnKSkpKQorCisjZGVmaW5lIEUxMDAwX1JFQURfUkVHKGEsIHJlZykgKCBcCisgICAgcmVhZGwoKGEpLT5od19hZGRyICsgXAorICAgICAgICAoKChhKS0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpID8gRTEwMDBfIyNyZWcgOiBFMTAwMF84MjU0Ml8jI3JlZykpKQorCisjZGVmaW5lIEUxMDAwX1dSSVRFX1JFR19BUlJBWShhLCByZWcsIG9mZnNldCwgdmFsdWUpICggXAorICAgIHdyaXRlbCgodmFsdWUpLCAoKGEpLT5od19hZGRyICsgXAorICAgICAgICAoKChhKS0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpID8gRTEwMDBfIyNyZWcgOiBFMTAwMF84MjU0Ml8jI3JlZykgKyBcCisgICAgICAgICgob2Zmc2V0KSA8PCAyKSkpKQorCisjZGVmaW5lIEUxMDAwX1JFQURfUkVHX0FSUkFZKGEsIHJlZywgb2Zmc2V0KSAoIFwKKyAgICByZWFkbCgoYSktPmh3X2FkZHIgKyBcCisgICAgICAgICgoKGEpLT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgPyBFMTAwMF8jI3JlZyA6IEUxMDAwXzgyNTQyXyMjcmVnKSArIFwKKyAgICAgICAgKChvZmZzZXQpIDw8IDIpKSkKKworI2RlZmluZSBFMTAwMF9XUklURV9GTFVTSChhKSBFMTAwMF9SRUFEX1JFRyhhLCBTVEFUVVMpCisKKyNlbmRpZiAvKiBfRTEwMDBfT1NERVBfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX3BhcmFtLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9wYXJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTRkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9wYXJhbS5jCkBAIC0wLDAgKzEsNzQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIAorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisgIGFueSBsYXRlciB2ZXJzaW9uLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisgIG1vcmUgZGV0YWlscy4KKyAgCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAgCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICAKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImUxMDAwLmgiCisKKy8qIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvIGFkanVzdCB0aGUKKyAqIG1heGltdW0gbnVtYmVyIG9mIHBvcnRzIHRoYXQgdGhlIGRyaXZlciBjYW4gbWFuYWdlLgorICovCisKKyNkZWZpbmUgRTEwMDBfTUFYX05JQyAzMgorCisjZGVmaW5lIE9QVElPTl9VTlNFVCAgIC0xCisjZGVmaW5lIE9QVElPTl9ESVNBQkxFRCAwCisjZGVmaW5lIE9QVElPTl9FTkFCTEVEICAxCisKKy8qIEFsbCBwYXJhbWV0ZXJzIGFyZSB0cmVhdGVkIHRoZSBzYW1lLCBhcyBhbiBpbnRlZ2VyIGFycmF5IG9mIHZhbHVlcy4KKyAqIFRoaXMgbWFjcm8ganVzdCByZWR1Y2VzIHRoZSBuZWVkIHRvIHJlcGVhdCB0aGUgc2FtZSBkZWNsYXJhdGlvbiBjb2RlCisgKiBvdmVyIGFuZCBvdmVyIChwbHVzIHRoaXMgaGVscHMgdG8gYXZvaWQgdHlwbyBidWdzKS4KKyAqLworCisjZGVmaW5lIEUxMDAwX1BBUkFNX0lOSVQgeyBbMCAuLi4gRTEwMDBfTUFYX05JQ10gPSBPUFRJT05fVU5TRVQgfQorI2RlZmluZSBFMTAwMF9QQVJBTShYLCBkZXNjKSBcCisJc3RhdGljIGludCBfX2RldmluaXRkYXRhIFhbRTEwMDBfTUFYX05JQysxXSA9IEUxMDAwX1BBUkFNX0lOSVQ7IFwKKwlzdGF0aWMgaW50IG51bV8jI1ggPSAwOyBcCisJbW9kdWxlX3BhcmFtX2FycmF5X25hbWVkKFgsIFgsIGludCwgJm51bV8jI1gsIDApOyBcCisJTU9EVUxFX1BBUk1fREVTQyhYLCBkZXNjKTsKKworLyogVHJhbnNtaXQgRGVzY3JpcHRvciBDb3VudAorICoKKyAqIFZhbGlkIFJhbmdlOiA4MC0yNTYgZm9yIDgyNTQyIGFuZCA4MjU0MyBnaWdhYml0IGV0aGVybmV0IGNvbnRyb2xsZXJzCisgKiBWYWxpZCBSYW5nZTogODAtNDA5NiBmb3IgODI1NDQgYW5kIG5ld2VyCisgKgorICogRGVmYXVsdCBWYWx1ZTogMjU2CisgKi8KKworRTEwMDBfUEFSQU0oVHhEZXNjcmlwdG9ycywgIk51bWJlciBvZiB0cmFuc21pdCBkZXNjcmlwdG9ycyIpOworCisvKiBSZWNlaXZlIERlc2NyaXB0b3IgQ291bnQKKyAqCisgKiBWYWxpZCBSYW5nZTogODAtMjU2IGZvciA4MjU0MiBhbmQgODI1NDMgZ2lnYWJpdCBldGhlcm5ldCBjb250cm9sbGVycworICogVmFsaWQgUmFuZ2U6IDgwLTQwOTYgZm9yIDgyNTQ0IGFuZCBuZXdlcgorICoKKyAqIERlZmF1bHQgVmFsdWU6IDI1NgorICovCisKK0UxMDAwX1BBUkFNKFJ4RGVzY3JpcHRvcnMsICJOdW1iZXIgb2YgcmVjZWl2ZSBkZXNjcmlwdG9ycyIpOworCisvKiBVc2VyIFNwZWNpZmllZCBTcGVlZCBPdmVycmlkZQorICoKKyAqIFZhbGlkIFJhbmdlOiAwLCAxMCwgMTAwLCAxMDAwCisgKiAgLSAwICAgIC0gYXV0by1uZWdvdGlhdGUgYXQgYWxsIHN1cHBvcnRlZCBzcGVlZHMKKyAqICAtIDEwICAgLSBvbmx5IGxpbmsgYXQgMTAgTWJwcworICogIC0gMTAwICAtIG9ubHkgbGluayBhdCAxMDAgTWJwcworICogIC0gMTAwMCAtIG9ubHkgbGluayBhdCAxMDAwIE1icHMKKyAqCisgKiBEZWZhdWx0IFZhbHVlOiAwCisgKi8KKworRTEwMDBfUEFSQU0oU3BlZWQsICJTcGVlZCBzZXR0aW5nIik7CisKKy8qIFVzZXIgU3BlY2lmaWVkIER1cGxleCBPdmVycmlkZQorICoKKyAqIFZhbGlkIFJhbmdlOiAwLTIKKyAqICAtIDAgLSBhdXRvLW5lZ290aWF0ZSBmb3IgZHVwbGV4CisgKiAgLSAxIC0gb25seSBsaW5rIGF0IGhhbGYgZHVwbGV4CisgKiAgLSAyIC0gb25seSBsaW5rIGF0IGZ1bGwgZHVwbGV4CisgKgorICogRGVmYXVsdCBWYWx1ZTogMAorICovCisKK0UxMDAwX1BBUkFNKER1cGxleCwgIkR1cGxleCBzZXR0aW5nIik7CisKKy8qIEF1dG8tbmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCBPdmVycmlkZQorICoKKyAqIFZhbGlkIFJhbmdlOiAweDAxLTB4MEYsIDB4MjAtMHgyRiAoY29wcGVyKTsgMHgyMCAoZmliZXIpCisgKgorICogVGhlIEF1dG9OZWcgdmFsdWUgaXMgYSBiaXQgbWFzayBkZXNjcmliaW5nIHdoaWNoIHNwZWVkIGFuZCBkdXBsZXgKKyAqIGNvbWJpbmF0aW9ucyBzaG91bGQgYmUgYWR2ZXJ0aXNlZCBkdXJpbmcgYXV0by1uZWdvdGlhdGlvbi4KKyAqIFRoZSBzdXBwb3J0ZWQgc3BlZWQgYW5kIGR1cGxleCBtb2RlcyBhcmUgbGlzdGVkIGJlbG93CisgKgorICogQml0ICAgICAgICAgICA3ICAgICA2ICAgICA1ICAgICAgNCAgICAgIDMgICAgIDIgICAgIDEgICAgICAwCisgKiBTcGVlZCAoTWJwcykgIE4vQSAgIE4vQSAgIDEwMDAgICBOL0EgICAgMTAwICAgMTAwICAgMTAgICAgIDEwCisgKiBEdXBsZXggICAgICAgICAgICAgICAgICAgIEZ1bGwgICAgICAgICAgRnVsbCAgSGFsZiAgRnVsbCAgIEhhbGYKKyAqCisgKiBEZWZhdWx0IFZhbHVlOiAweDJGIChjb3BwZXIpOyAweDIwIChmaWJlcikKKyAqLworCitFMTAwMF9QQVJBTShBdXRvTmVnLCAiQWR2ZXJ0aXNlZCBhdXRvLW5lZ290aWF0aW9uIHNldHRpbmciKTsKKworLyogVXNlciBTcGVjaWZpZWQgRmxvdyBDb250cm9sIE92ZXJyaWRlCisgKgorICogVmFsaWQgUmFuZ2U6IDAtMworICogIC0gMCAtIE5vIEZsb3cgQ29udHJvbAorICogIC0gMSAtIFJ4IG9ubHksIHJlc3BvbmQgdG8gUEFVU0UgZnJhbWVzIGJ1dCBkbyBub3QgZ2VuZXJhdGUgdGhlbQorICogIC0gMiAtIFR4IG9ubHksIGdlbmVyYXRlIFBBVVNFIGZyYW1lcyBidXQgaWdub3JlIHRoZW0gb24gcmVjZWl2ZQorICogIC0gMyAtIEZ1bGwgRmxvdyBDb250cm9sIFN1cHBvcnQKKyAqCisgKiBEZWZhdWx0IFZhbHVlOiBSZWFkIGZsb3cgY29udHJvbCBzZXR0aW5ncyBmcm9tIHRoZSBFRVBST00KKyAqLworCitFMTAwMF9QQVJBTShGbG93Q29udHJvbCwgIkZsb3cgQ29udHJvbCBzZXR0aW5nIik7CisKKy8qIFhzdW1SWCAtIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCBFbmFibGUvRGlzYWJsZQorICoKKyAqIFZhbGlkIFJhbmdlOiAwLCAxCisgKiAgLSAwIC0gZGlzYWJsZXMgYWxsIGNoZWNrc3VtIG9mZmxvYWQKKyAqICAtIDEgLSBlbmFibGVzIHJlY2VpdmUgSVAvVENQL1VEUCBjaGVja3N1bSBvZmZsb2FkCisgKiAgICAgICAgb24gODI1NDMgYW5kIG5ld2VyIC1iYXNlZCBOSUNzCisgKgorICogRGVmYXVsdCBWYWx1ZTogMQorICovCisKK0UxMDAwX1BBUkFNKFhzdW1SWCwgIkRpc2FibGUgb3IgZW5hYmxlIFJlY2VpdmUgQ2hlY2tzdW0gb2ZmbG9hZCIpOworCisvKiBUcmFuc21pdCBJbnRlcnJ1cHQgRGVsYXkgaW4gdW5pdHMgb2YgMS4wMjQgbWljcm9zZWNvbmRzCisgKgorICogVmFsaWQgUmFuZ2U6IDAtNjU1MzUKKyAqCisgKiBEZWZhdWx0IFZhbHVlOiA2NAorICovCisKK0UxMDAwX1BBUkFNKFR4SW50RGVsYXksICJUcmFuc21pdCBJbnRlcnJ1cHQgRGVsYXkiKTsKKworLyogVHJhbnNtaXQgQWJzb2x1dGUgSW50ZXJydXB0IERlbGF5IGluIHVuaXRzIG9mIDEuMDI0IG1pY3Jvc2Vjb25kcworICoKKyAqIFZhbGlkIFJhbmdlOiAwLTY1NTM1CisgKgorICogRGVmYXVsdCBWYWx1ZTogMAorICovCisKK0UxMDAwX1BBUkFNKFR4QWJzSW50RGVsYXksICJUcmFuc21pdCBBYnNvbHV0ZSBJbnRlcnJ1cHQgRGVsYXkiKTsKKworLyogUmVjZWl2ZSBJbnRlcnJ1cHQgRGVsYXkgaW4gdW5pdHMgb2YgMS4wMjQgbWljcm9zZWNvbmRzCisgKgorICogVmFsaWQgUmFuZ2U6IDAtNjU1MzUKKyAqCisgKiBEZWZhdWx0IFZhbHVlOiAwCisgKi8KKworRTEwMDBfUEFSQU0oUnhJbnREZWxheSwgIlJlY2VpdmUgSW50ZXJydXB0IERlbGF5Iik7CisKKy8qIFJlY2VpdmUgQWJzb2x1dGUgSW50ZXJydXB0IERlbGF5IGluIHVuaXRzIG9mIDEuMDI0IG1pY3Jvc2Vjb25kcworICoKKyAqIFZhbGlkIFJhbmdlOiAwLTY1NTM1CisgKgorICogRGVmYXVsdCBWYWx1ZTogMTI4CisgKi8KKworRTEwMDBfUEFSQU0oUnhBYnNJbnREZWxheSwgIlJlY2VpdmUgQWJzb2x1dGUgSW50ZXJydXB0IERlbGF5Iik7CisKKy8qIEludGVycnVwdCBUaHJvdHRsZSBSYXRlIChpbnRlcnJ1cHRzL3NlYykKKyAqCisgKiBWYWxpZCBSYW5nZTogMTAwLTEwMDAwMCAoMD1vZmYsIDE9ZHluYW1pYykKKyAqCisgKiBEZWZhdWx0IFZhbHVlOiAxCisgKi8KKworRTEwMDBfUEFSQU0oSW50ZXJydXB0VGhyb3R0bGVSYXRlLCAiSW50ZXJydXB0IFRocm90dGxpbmcgUmF0ZSIpOworCisjZGVmaW5lIEFVVE9ORUdfQURWX0RFRkFVTFQgIDB4MkYKKyNkZWZpbmUgQVVUT05FR19BRFZfTUFTSyAgICAgMHgyRgorI2RlZmluZSBGTE9XX0NPTlRST0xfREVGQVVMVCBGTE9XX0NPTlRST0xfRlVMTAorCisjZGVmaW5lIERFRkFVTFRfUkRUUiAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1BWF9SWERFTEFZICAgICAgICAgICAgICAgMHhGRkZGCisjZGVmaW5lIE1JTl9SWERFTEFZICAgICAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgREVGQVVMVF9SQURWICAgICAgICAgICAgICAgICAxMjgKKyNkZWZpbmUgTUFYX1JYQUJTREVMQVkgICAgICAgICAgICAweEZGRkYKKyNkZWZpbmUgTUlOX1JYQUJTREVMQVkgICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBERUZBVUxUX1RJRFYgICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBNQVhfVFhERUxBWSAgICAgICAgICAgICAgIDB4RkZGRgorI2RlZmluZSBNSU5fVFhERUxBWSAgICAgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIERFRkFVTFRfVEFEViAgICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIE1BWF9UWEFCU0RFTEFZICAgICAgICAgICAgMHhGRkZGCisjZGVmaW5lIE1JTl9UWEFCU0RFTEFZICAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgREVGQVVMVF9JVFIgICAgICAgICAgICAgICAgIDgwMDAKKyNkZWZpbmUgTUFYX0lUUiAgICAgICAgICAgICAgICAgICAxMDAwMDAKKyNkZWZpbmUgTUlOX0lUUiAgICAgICAgICAgICAgICAgICAgICAxMDAKKworc3RydWN0IGUxMDAwX29wdGlvbiB7CisJZW51bSB7IGVuYWJsZV9vcHRpb24sIHJhbmdlX29wdGlvbiwgbGlzdF9vcHRpb24gfSB0eXBlOworCWNoYXIgKm5hbWU7CisJY2hhciAqZXJyOworCWludCAgZGVmOworCXVuaW9uIHsKKwkJc3RydWN0IHsgLyogcmFuZ2Vfb3B0aW9uIGluZm8gKi8KKwkJCWludCBtaW47CisJCQlpbnQgbWF4OworCQl9IHI7CisJCXN0cnVjdCB7IC8qIGxpc3Rfb3B0aW9uIGluZm8gKi8KKwkJCWludCBucjsKKwkJCXN0cnVjdCBlMTAwMF9vcHRfbGlzdCB7IGludCBpOyBjaGFyICpzdHI7IH0gKnA7CisJCX0gbDsKKwl9IGFyZzsKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitlMTAwMF92YWxpZGF0ZV9vcHRpb24oaW50ICp2YWx1ZSwgc3RydWN0IGUxMDAwX29wdGlvbiAqb3B0LAorCQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZigqdmFsdWUgPT0gT1BUSU9OX1VOU0VUKSB7CisJCSp2YWx1ZSA9IG9wdC0+ZGVmOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKG9wdC0+dHlwZSkgeworCWNhc2UgZW5hYmxlX29wdGlvbjoKKwkJc3dpdGNoICgqdmFsdWUpIHsKKwkJY2FzZSBPUFRJT05fRU5BQkxFRDoKKwkJCURQUklOVEsoUFJPQkUsIElORk8sICIlcyBFbmFibGVkXG4iLCBvcHQtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgT1BUSU9OX0RJU0FCTEVEOgorCQkJRFBSSU5USyhQUk9CRSwgSU5GTywgIiVzIERpc2FibGVkXG4iLCBvcHQtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSByYW5nZV9vcHRpb246CisJCWlmKCp2YWx1ZSA+PSBvcHQtPmFyZy5yLm1pbiAmJiAqdmFsdWUgPD0gb3B0LT5hcmcuci5tYXgpIHsKKwkJCURQUklOVEsoUFJPQkUsIElORk8sCisJCQkJCSIlcyBzZXQgdG8gJWlcbiIsIG9wdC0+bmFtZSwgKnZhbHVlKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWNhc2UgbGlzdF9vcHRpb246IHsKKwkJaW50IGk7CisJCXN0cnVjdCBlMTAwMF9vcHRfbGlzdCAqZW50OworCisJCWZvcihpID0gMDsgaSA8IG9wdC0+YXJnLmwubnI7IGkrKykgeworCQkJZW50ID0gJm9wdC0+YXJnLmwucFtpXTsKKwkJCWlmKCp2YWx1ZSA9PSBlbnQtPmkpIHsKKwkJCQlpZihlbnQtPnN0clswXSAhPSAnXDAnKQorCQkJCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiJXNcbiIsIGVudC0+c3RyKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJRFBSSU5USyhQUk9CRSwgSU5GTywgIkludmFsaWQgJXMgc3BlY2lmaWVkICglaSkgJXNcbiIsCisJICAgICAgIG9wdC0+bmFtZSwgKnZhbHVlLCBvcHQtPmVycik7CisJKnZhbHVlID0gb3B0LT5kZWY7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBlMTAwMF9jaGVja19maWJlcl9vcHRpb25zKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIGUxMDAwX2NoZWNrX2NvcHBlcl9vcHRpb25zKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKKworLyoqCisgKiBlMTAwMF9jaGVja19vcHRpb25zIC0gUmFuZ2UgQ2hlY2tpbmcgZm9yIENvbW1hbmQgTGluZSBQYXJhbWV0ZXJzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIHJvdXRpbmUgY2hlY2tzIGFsbCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyBmb3IgdmFsaWQgdXNlcgorICogaW5wdXQuICBJZiBhbiBpbnZhbGlkIHZhbHVlIGlzIGdpdmVuLCBvciBpZiBubyB1c2VyIHNwZWNpZmllZAorICogdmFsdWUgZXhpc3RzLCBhIGRlZmF1bHQgdmFsdWUgaXMgdXNlZC4gIFRoZSBmaW5hbCB2YWx1ZSBpcyBzdG9yZWQKKyAqIGluIGEgdmFyaWFibGUgaW4gdGhlIGFkYXB0ZXIgc3RydWN0dXJlLgorICoqLworCit2b2lkIF9fZGV2aW5pdAorZTEwMDBfY2hlY2tfb3B0aW9ucyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgYmQgPSBhZGFwdGVyLT5iZF9udW1iZXI7CisJaWYoYmQgPj0gRTEwMDBfTUFYX05JQykgeworCQlEUFJJTlRLKFBST0JFLCBOT1RJQ0UsCisJCSAgICAgICAiV2FybmluZzogbm8gY29uZmlndXJhdGlvbiBmb3IgYm9hcmQgIyVpXG4iLCBiZCk7CisJCURQUklOVEsoUFJPQkUsIE5PVElDRSwgIlVzaW5nIGRlZmF1bHRzIGZvciBhbGwgdmFsdWVzXG4iKTsKKwl9CisKKwl7IC8qIFRyYW5zbWl0IERlc2NyaXB0b3IgQ291bnQgKi8KKwkJc3RydWN0IGUxMDAwX29wdGlvbiBvcHQgPSB7CisJCQkudHlwZSA9IHJhbmdlX29wdGlvbiwKKwkJCS5uYW1lID0gIlRyYW5zbWl0IERlc2NyaXB0b3JzIiwKKwkJCS5lcnIgID0gInVzaW5nIGRlZmF1bHQgb2YgIgorCQkJCV9fTU9EVUxFX1NUUklORyhFMTAwMF9ERUZBVUxUX1RYRCksCisJCQkuZGVmICA9IEUxMDAwX0RFRkFVTFRfVFhELAorCQkJLmFyZyAgPSB7IC5yID0geyAubWluID0gRTEwMDBfTUlOX1RYRCB9fQorCQl9OworCQlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJCWUxMDAwX21hY190eXBlIG1hY190eXBlID0gYWRhcHRlci0+aHcubWFjX3R5cGU7CisJCW9wdC5hcmcuci5tYXggPSBtYWNfdHlwZSA8IGUxMDAwXzgyNTQ0ID8KKwkJCUUxMDAwX01BWF9UWEQgOiBFMTAwMF9NQVhfODI1NDRfVFhEOworCisJCWlmIChudW1fVHhEZXNjcmlwdG9ycyA+IGJkKSB7CisJCQl0eF9yaW5nLT5jb3VudCA9IFR4RGVzY3JpcHRvcnNbYmRdOworCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZ0eF9yaW5nLT5jb3VudCwgJm9wdCwgYWRhcHRlcik7CisJCQlFMTAwMF9ST1VORFVQKHR4X3JpbmctPmNvdW50LCAKKwkJCQkJCVJFUV9UWF9ERVNDUklQVE9SX01VTFRJUExFKTsKKwkJfSBlbHNlIHsKKwkJCXR4X3JpbmctPmNvdW50ID0gb3B0LmRlZjsKKwkJfQorCX0KKwl7IC8qIFJlY2VpdmUgRGVzY3JpcHRvciBDb3VudCAqLworCQlzdHJ1Y3QgZTEwMDBfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gcmFuZ2Vfb3B0aW9uLAorCQkJLm5hbWUgPSAiUmVjZWl2ZSBEZXNjcmlwdG9ycyIsCisJCQkuZXJyICA9ICJ1c2luZyBkZWZhdWx0IG9mICIKKwkJCQlfX01PRFVMRV9TVFJJTkcoRTEwMDBfREVGQVVMVF9SWEQpLAorCQkJLmRlZiAgPSBFMTAwMF9ERUZBVUxUX1JYRCwKKwkJCS5hcmcgID0geyAuciA9IHsgLm1pbiA9IEUxMDAwX01JTl9SWEQgfX0KKwkJfTsKKwkJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nOworCQllMTAwMF9tYWNfdHlwZSBtYWNfdHlwZSA9IGFkYXB0ZXItPmh3Lm1hY190eXBlOworCQlvcHQuYXJnLnIubWF4ID0gbWFjX3R5cGUgPCBlMTAwMF84MjU0NCA/IEUxMDAwX01BWF9SWEQgOgorCQkJRTEwMDBfTUFYXzgyNTQ0X1JYRDsKKworCQlpZiAobnVtX1J4RGVzY3JpcHRvcnMgPiBiZCkgeworCQkJcnhfcmluZy0+Y291bnQgPSBSeERlc2NyaXB0b3JzW2JkXTsKKwkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmcnhfcmluZy0+Y291bnQsICZvcHQsIGFkYXB0ZXIpOworCQkJRTEwMDBfUk9VTkRVUChyeF9yaW5nLT5jb3VudCwgCisJCQkJCQlSRVFfUlhfREVTQ1JJUFRPUl9NVUxUSVBMRSk7CisJCX0gZWxzZSB7CisJCQlyeF9yaW5nLT5jb3VudCA9IG9wdC5kZWY7CisJCX0KKwl9CisJeyAvKiBDaGVja3N1bSBPZmZsb2FkIEVuYWJsZS9EaXNhYmxlICovCisJCXN0cnVjdCBlMTAwMF9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSBlbmFibGVfb3B0aW9uLAorCQkJLm5hbWUgPSAiQ2hlY2tzdW0gT2ZmbG9hZCIsCisJCQkuZXJyICA9ICJkZWZhdWx0aW5nIHRvIEVuYWJsZWQiLAorCQkJLmRlZiAgPSBPUFRJT05fRU5BQkxFRAorCQl9OworCisJCWlmIChudW1fWHN1bVJYID4gYmQpIHsKKwkJCWludCByeF9jc3VtID0gWHN1bVJYW2JkXTsKKwkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmcnhfY3N1bSwgJm9wdCwgYWRhcHRlcik7CisJCQlhZGFwdGVyLT5yeF9jc3VtID0gcnhfY3N1bTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPnJ4X2NzdW0gPSBvcHQuZGVmOworCQl9CisJfQorCXsgLyogRmxvdyBDb250cm9sICovCisKKwkJc3RydWN0IGUxMDAwX29wdF9saXN0IGZjX2xpc3RbXSA9CisJCQl7eyBlMTAwMF9mY19ub25lLCAgICAiRmxvdyBDb250cm9sIERpc2FibGVkIiB9LAorCQkJIHsgZTEwMDBfZmNfcnhfcGF1c2UsIkZsb3cgQ29udHJvbCBSZWNlaXZlIE9ubHkiIH0sCisJCQkgeyBlMTAwMF9mY190eF9wYXVzZSwiRmxvdyBDb250cm9sIFRyYW5zbWl0IE9ubHkiIH0sCisJCQkgeyBlMTAwMF9mY19mdWxsLCAgICAiRmxvdyBDb250cm9sIEVuYWJsZWQiIH0sCisJCQkgeyBlMTAwMF9mY19kZWZhdWx0LCAiRmxvdyBDb250cm9sIEhhcmR3YXJlIERlZmF1bHQiIH19OworCisJCXN0cnVjdCBlMTAwMF9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSBsaXN0X29wdGlvbiwKKwkJCS5uYW1lID0gIkZsb3cgQ29udHJvbCIsCisJCQkuZXJyICA9ICJyZWFkaW5nIGRlZmF1bHQgc2V0dGluZ3MgZnJvbSBFRVBST00iLAorCQkJLmRlZiAgPSBlMTAwMF9mY19kZWZhdWx0LAorCQkJLmFyZyAgPSB7IC5sID0geyAubnIgPSBBUlJBWV9TSVpFKGZjX2xpc3QpLAorCQkJCQkgLnAgPSBmY19saXN0IH19CisJCX07CisKKwkJaWYgKG51bV9GbG93Q29udHJvbCA+IGJkKSB7CisJCQlpbnQgZmMgPSBGbG93Q29udHJvbFtiZF07CisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmZjLCAmb3B0LCBhZGFwdGVyKTsKKwkJCWFkYXB0ZXItPmh3LmZjID0gYWRhcHRlci0+aHcub3JpZ2luYWxfZmMgPSBmYzsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPmh3LmZjID0gb3B0LmRlZjsKKwkJfQorCX0KKwl7IC8qIFRyYW5zbWl0IEludGVycnVwdCBEZWxheSAqLworCQlzdHJ1Y3QgZTEwMDBfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gcmFuZ2Vfb3B0aW9uLAorCQkJLm5hbWUgPSAiVHJhbnNtaXQgSW50ZXJydXB0IERlbGF5IiwKKwkJCS5lcnIgID0gInVzaW5nIGRlZmF1bHQgb2YgIiBfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9USURWKSwKKwkJCS5kZWYgID0gREVGQVVMVF9USURWLAorCQkJLmFyZyAgPSB7IC5yID0geyAubWluID0gTUlOX1RYREVMQVksCisJCQkJCSAubWF4ID0gTUFYX1RYREVMQVkgfX0KKwkJfTsKKworCQlpZiAobnVtX1R4SW50RGVsYXkgPiBiZCkgeworCQkJYWRhcHRlci0+dHhfaW50X2RlbGF5ID0gVHhJbnREZWxheVtiZF07CisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPnR4X2ludF9kZWxheSwgJm9wdCwgCisJCQkJCQkJCWFkYXB0ZXIpOworCQl9IGVsc2UgeworCQkJYWRhcHRlci0+dHhfaW50X2RlbGF5ID0gb3B0LmRlZjsKKwkJfQorCX0KKwl7IC8qIFRyYW5zbWl0IEFic29sdXRlIEludGVycnVwdCBEZWxheSAqLworCQlzdHJ1Y3QgZTEwMDBfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gcmFuZ2Vfb3B0aW9uLAorCQkJLm5hbWUgPSAiVHJhbnNtaXQgQWJzb2x1dGUgSW50ZXJydXB0IERlbGF5IiwKKwkJCS5lcnIgID0gInVzaW5nIGRlZmF1bHQgb2YgIiBfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9UQURWKSwKKwkJCS5kZWYgID0gREVGQVVMVF9UQURWLAorCQkJLmFyZyAgPSB7IC5yID0geyAubWluID0gTUlOX1RYQUJTREVMQVksCisJCQkJCSAubWF4ID0gTUFYX1RYQUJTREVMQVkgfX0KKwkJfTsKKworCQlpZiAobnVtX1R4QWJzSW50RGVsYXkgPiBiZCkgeworCQkJYWRhcHRlci0+dHhfYWJzX2ludF9kZWxheSA9IFR4QWJzSW50RGVsYXlbYmRdOworCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZhZGFwdGVyLT50eF9hYnNfaW50X2RlbGF5LCAmb3B0LCAKKwkJCQkJCQkJYWRhcHRlcik7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT50eF9hYnNfaW50X2RlbGF5ID0gb3B0LmRlZjsKKwkJfQorCX0KKwl7IC8qIFJlY2VpdmUgSW50ZXJydXB0IERlbGF5ICovCisJCXN0cnVjdCBlMTAwMF9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSByYW5nZV9vcHRpb24sCisJCQkubmFtZSA9ICJSZWNlaXZlIEludGVycnVwdCBEZWxheSIsCisJCQkuZXJyICA9ICJ1c2luZyBkZWZhdWx0IG9mICIgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfUkRUUiksCisJCQkuZGVmICA9IERFRkFVTFRfUkRUUiwKKwkJCS5hcmcgID0geyAuciA9IHsgLm1pbiA9IE1JTl9SWERFTEFZLAorCQkJCQkgLm1heCA9IE1BWF9SWERFTEFZIH19CisJCX07CisKKwkJaWYgKG51bV9SeEludERlbGF5ID4gYmQpIHsKKwkJCWFkYXB0ZXItPnJ4X2ludF9kZWxheSA9IFJ4SW50RGVsYXlbYmRdOworCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZhZGFwdGVyLT5yeF9pbnRfZGVsYXksICZvcHQsIAorCQkJCQkJCQlhZGFwdGVyKTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPnJ4X2ludF9kZWxheSA9IG9wdC5kZWY7CisJCX0KKwl9CisJeyAvKiBSZWNlaXZlIEFic29sdXRlIEludGVycnVwdCBEZWxheSAqLworCQlzdHJ1Y3QgZTEwMDBfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gcmFuZ2Vfb3B0aW9uLAorCQkJLm5hbWUgPSAiUmVjZWl2ZSBBYnNvbHV0ZSBJbnRlcnJ1cHQgRGVsYXkiLAorCQkJLmVyciAgPSAidXNpbmcgZGVmYXVsdCBvZiAiIF9fTU9EVUxFX1NUUklORyhERUZBVUxUX1JBRFYpLAorCQkJLmRlZiAgPSBERUZBVUxUX1JBRFYsCisJCQkuYXJnICA9IHsgLnIgPSB7IC5taW4gPSBNSU5fUlhBQlNERUxBWSwKKwkJCQkJIC5tYXggPSBNQVhfUlhBQlNERUxBWSB9fQorCQl9OworCisJCWlmIChudW1fUnhBYnNJbnREZWxheSA+IGJkKSB7CisJCQlhZGFwdGVyLT5yeF9hYnNfaW50X2RlbGF5ID0gUnhBYnNJbnREZWxheVtiZF07CisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPnJ4X2Fic19pbnRfZGVsYXksICZvcHQsIAorCQkJCQkJCQlhZGFwdGVyKTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPnJ4X2Fic19pbnRfZGVsYXkgPSBvcHQuZGVmOworCQl9CisJfQorCXsgLyogSW50ZXJydXB0IFRocm90dGxpbmcgUmF0ZSAqLworCQlzdHJ1Y3QgZTEwMDBfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gcmFuZ2Vfb3B0aW9uLAorCQkJLm5hbWUgPSAiSW50ZXJydXB0IFRocm90dGxpbmcgUmF0ZSAoaW50cy9zZWMpIiwKKwkJCS5lcnIgID0gInVzaW5nIGRlZmF1bHQgb2YgIiBfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9JVFIpLAorCQkJLmRlZiAgPSBERUZBVUxUX0lUUiwKKwkJCS5hcmcgID0geyAuciA9IHsgLm1pbiA9IE1JTl9JVFIsCisJCQkJCSAubWF4ID0gTUFYX0lUUiB9fQorCQl9OworCisJCWlmIChudW1fSW50ZXJydXB0VGhyb3R0bGVSYXRlID4gYmQpIHsKKwkJCWFkYXB0ZXItPml0ciA9IEludGVycnVwdFRocm90dGxlUmF0ZVtiZF07CisJCQlzd2l0Y2goYWRhcHRlci0+aXRyKSB7CisJCQljYXNlIDA6CisJCQkJRFBSSU5USyhQUk9CRSwgSU5GTywgIiVzIHR1cm5lZCBvZmZcbiIsIAorCQkJCQlvcHQubmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJRFBSSU5USyhQUk9CRSwgSU5GTywgIiVzIHNldCB0byBkeW5hbWljIG1vZGVcbiIsIAorCQkJCQlvcHQubmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIC0xOgorCQkJZGVmYXVsdDoKKwkJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFkYXB0ZXItPml0ciwgJm9wdCwgCisJCQkJCWFkYXB0ZXIpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJYWRhcHRlci0+aXRyID0gb3B0LmRlZjsKKwkJfQorCX0KKworCXN3aXRjaChhZGFwdGVyLT5ody5tZWRpYV90eXBlKSB7CisJY2FzZSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyOgorCWNhc2UgZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXM6CisJCWUxMDAwX2NoZWNrX2ZpYmVyX29wdGlvbnMoYWRhcHRlcik7CisJCWJyZWFrOworCWNhc2UgZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXI6CisJCWUxMDAwX2NoZWNrX2NvcHBlcl9vcHRpb25zKGFkYXB0ZXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKKy8qKgorICogZTEwMDBfY2hlY2tfZmliZXJfb3B0aW9ucyAtIFJhbmdlIENoZWNraW5nIGZvciBMaW5rIE9wdGlvbnMsIEZpYmVyIFZlcnNpb24KKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIEhhbmRsZXMgc3BlZWQgYW5kIGR1cGxleCBvcHRpb25zIG9uIGZpYmVyIGFkYXB0ZXJzCisgKiovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorZTEwMDBfY2hlY2tfZmliZXJfb3B0aW9ucyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgYmQgPSBhZGFwdGVyLT5iZF9udW1iZXI7CisJaWYobnVtX1NwZWVkID4gYmQpIHsKKwkJRFBSSU5USyhQUk9CRSwgSU5GTywgIlNwZWVkIG5vdCB2YWxpZCBmb3IgZmliZXIgYWRhcHRlcnMsICIKKwkJICAgICAgICJwYXJhbWV0ZXIgaWdub3JlZFxuIik7CisJfQorCisJaWYobnVtX0R1cGxleCA+IGJkKSB7CisJCURQUklOVEsoUFJPQkUsIElORk8sICJEdXBsZXggbm90IHZhbGlkIGZvciBmaWJlciBhZGFwdGVycywgIgorCQkgICAgICAgInBhcmFtZXRlciBpZ25vcmVkXG4iKTsKKwl9CisKKwlpZigobnVtX0F1dG9OZWcgPiBiZCkgJiYgKEF1dG9OZWdbYmRdICE9IDB4MjApKSB7CisJCURQUklOVEsoUFJPQkUsIElORk8sICJBdXRvTmVnIG90aGVyIHRoYW4gMTAwMC9GdWxsIGlzICIKKwkJCQkgIm5vdCB2YWxpZCBmb3IgZmliZXIgYWRhcHRlcnMsICIKKwkJCQkgInBhcmFtZXRlciBpZ25vcmVkXG4iKTsKKwl9Cit9CisKKy8qKgorICogZTEwMDBfY2hlY2tfY29wcGVyX29wdGlvbnMgLSBSYW5nZSBDaGVja2luZyBmb3IgTGluayBPcHRpb25zLCBDb3BwZXIgVmVyc2lvbgorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogSGFuZGxlcyBzcGVlZCBhbmQgZHVwbGV4IG9wdGlvbnMgb24gY29wcGVyIGFkYXB0ZXJzCisgKiovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorZTEwMDBfY2hlY2tfY29wcGVyX29wdGlvbnMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHNwZWVkLCBkcGx4OworCWludCBiZCA9IGFkYXB0ZXItPmJkX251bWJlcjsKKworCXsgLyogU3BlZWQgKi8KKwkJc3RydWN0IGUxMDAwX29wdF9saXN0IHNwZWVkX2xpc3RbXSA9IHt7ICAgICAgICAgIDAsICIiIH0sCisJCQkJCQkgICAgICB7ICAgU1BFRURfMTAsICIiIH0sCisJCQkJCQkgICAgICB7ICBTUEVFRF8xMDAsICIiIH0sCisJCQkJCQkgICAgICB7IFNQRUVEXzEwMDAsICIiIH19OworCisJCXN0cnVjdCBlMTAwMF9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSBsaXN0X29wdGlvbiwKKwkJCS5uYW1lID0gIlNwZWVkIiwKKwkJCS5lcnIgID0gInBhcmFtZXRlciBpZ25vcmVkIiwKKwkJCS5kZWYgID0gMCwKKwkJCS5hcmcgID0geyAubCA9IHsgLm5yID0gQVJSQVlfU0laRShzcGVlZF9saXN0KSwKKwkJCQkJIC5wID0gc3BlZWRfbGlzdCB9fQorCQl9OworCisJCWlmIChudW1fU3BlZWQgPiBiZCkgeworCQkJc3BlZWQgPSBTcGVlZFtiZF07CisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJnNwZWVkLCAmb3B0LCBhZGFwdGVyKTsKKwkJfSBlbHNlIHsKKwkJCXNwZWVkID0gb3B0LmRlZjsKKwkJfQorCX0KKwl7IC8qIER1cGxleCAqLworCQlzdHJ1Y3QgZTEwMDBfb3B0X2xpc3QgZHBseF9saXN0W10gPSB7eyAgICAgICAgICAgMCwgIiIgfSwKKwkJCQkJCSAgICAgeyBIQUxGX0RVUExFWCwgIiIgfSwKKwkJCQkJCSAgICAgeyBGVUxMX0RVUExFWCwgIiIgfX07CisKKwkJc3RydWN0IGUxMDAwX29wdGlvbiBvcHQgPSB7CisJCQkudHlwZSA9IGxpc3Rfb3B0aW9uLAorCQkJLm5hbWUgPSAiRHVwbGV4IiwKKwkJCS5lcnIgID0gInBhcmFtZXRlciBpZ25vcmVkIiwKKwkJCS5kZWYgID0gMCwKKwkJCS5hcmcgID0geyAubCA9IHsgLm5yID0gQVJSQVlfU0laRShkcGx4X2xpc3QpLAorCQkJCQkgLnAgPSBkcGx4X2xpc3QgfX0KKwkJfTsKKworCQlpZiAobnVtX0R1cGxleCA+IGJkKSB7CisJCQlkcGx4ID0gRHVwbGV4W2JkXTsKKwkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmZHBseCwgJm9wdCwgYWRhcHRlcik7CisJCX0gZWxzZSB7CisJCQlkcGx4ID0gb3B0LmRlZjsKKwkJfQorCX0KKworCWlmKChudW1fQXV0b05lZyA+IGJkKSAmJiAoc3BlZWQgIT0gMCB8fCBkcGx4ICE9IDApKSB7CisJCURQUklOVEsoUFJPQkUsIElORk8sCisJCSAgICAgICAiQXV0b05lZyBzcGVjaWZpZWQgYWxvbmcgd2l0aCBTcGVlZCBvciBEdXBsZXgsICIKKwkJICAgICAgICJwYXJhbWV0ZXIgaWdub3JlZFxuIik7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFVVE9ORUdfQURWX0RFRkFVTFQ7CisJfSBlbHNlIHsgLyogQXV0b25lZyAqLworCQlzdHJ1Y3QgZTEwMDBfb3B0X2xpc3QgYW5fbGlzdFtdID0KKwkJCSNkZWZpbmUgQUEgIkF1dG9OZWcgYWR2ZXJ0aXNpbmcgIgorCQkJe3sgMHgwMSwgQUEgIjEwL0hEIiB9LAorCQkJIHsgMHgwMiwgQUEgIjEwL0ZEIiB9LAorCQkJIHsgMHgwMywgQUEgIjEwL0ZELCAxMC9IRCIgfSwKKwkJCSB7IDB4MDQsIEFBICIxMDAvSEQiIH0sCisJCQkgeyAweDA1LCBBQSAiMTAwL0hELCAxMC9IRCIgfSwKKwkJCSB7IDB4MDYsIEFBICIxMDAvSEQsIDEwL0ZEIiB9LAorCQkJIHsgMHgwNywgQUEgIjEwMC9IRCwgMTAvRkQsIDEwL0hEIiB9LAorCQkJIHsgMHgwOCwgQUEgIjEwMC9GRCIgfSwKKwkJCSB7IDB4MDksIEFBICIxMDAvRkQsIDEwL0hEIiB9LAorCQkJIHsgMHgwYSwgQUEgIjEwMC9GRCwgMTAvRkQiIH0sCisJCQkgeyAweDBiLCBBQSAiMTAwL0ZELCAxMC9GRCwgMTAvSEQiIH0sCisJCQkgeyAweDBjLCBBQSAiMTAwL0ZELCAxMDAvSEQiIH0sCisJCQkgeyAweDBkLCBBQSAiMTAwL0ZELCAxMDAvSEQsIDEwL0hEIiB9LAorCQkJIHsgMHgwZSwgQUEgIjEwMC9GRCwgMTAwL0hELCAxMC9GRCIgfSwKKwkJCSB7IDB4MGYsIEFBICIxMDAvRkQsIDEwMC9IRCwgMTAvRkQsIDEwL0hEIiB9LAorCQkJIHsgMHgyMCwgQUEgIjEwMDAvRkQiIH0sCisJCQkgeyAweDIxLCBBQSAiMTAwMC9GRCwgMTAvSEQiIH0sCisJCQkgeyAweDIyLCBBQSAiMTAwMC9GRCwgMTAvRkQiIH0sCisJCQkgeyAweDIzLCBBQSAiMTAwMC9GRCwgMTAvRkQsIDEwL0hEIiB9LAorCQkJIHsgMHgyNCwgQUEgIjEwMDAvRkQsIDEwMC9IRCIgfSwKKwkJCSB7IDB4MjUsIEFBICIxMDAwL0ZELCAxMDAvSEQsIDEwL0hEIiB9LAorCQkJIHsgMHgyNiwgQUEgIjEwMDAvRkQsIDEwMC9IRCwgMTAvRkQiIH0sCisJCQkgeyAweDI3LCBBQSAiMTAwMC9GRCwgMTAwL0hELCAxMC9GRCwgMTAvSEQiIH0sCisJCQkgeyAweDI4LCBBQSAiMTAwMC9GRCwgMTAwL0ZEIiB9LAorCQkJIHsgMHgyOSwgQUEgIjEwMDAvRkQsIDEwMC9GRCwgMTAvSEQiIH0sCisJCQkgeyAweDJhLCBBQSAiMTAwMC9GRCwgMTAwL0ZELCAxMC9GRCIgfSwKKwkJCSB7IDB4MmIsIEFBICIxMDAwL0ZELCAxMDAvRkQsIDEwL0ZELCAxMC9IRCIgfSwKKwkJCSB7IDB4MmMsIEFBICIxMDAwL0ZELCAxMDAvRkQsIDEwMC9IRCIgfSwKKwkJCSB7IDB4MmQsIEFBICIxMDAwL0ZELCAxMDAvRkQsIDEwMC9IRCwgMTAvSEQiIH0sCisJCQkgeyAweDJlLCBBQSAiMTAwMC9GRCwgMTAwL0ZELCAxMDAvSEQsIDEwL0ZEIiB9LAorCQkJIHsgMHgyZiwgQUEgIjEwMDAvRkQsIDEwMC9GRCwgMTAwL0hELCAxMC9GRCwgMTAvSEQiIH19OworCisJCXN0cnVjdCBlMTAwMF9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSBsaXN0X29wdGlvbiwKKwkJCS5uYW1lID0gIkF1dG9OZWciLAorCQkJLmVyciAgPSAicGFyYW1ldGVyIGlnbm9yZWQiLAorCQkJLmRlZiAgPSBBVVRPTkVHX0FEVl9ERUZBVUxULAorCQkJLmFyZyAgPSB7IC5sID0geyAubnIgPSBBUlJBWV9TSVpFKGFuX2xpc3QpLAorCQkJCQkgLnAgPSBhbl9saXN0IH19CisJCX07CisKKwkJaW50IGFuID0gQXV0b05lZ1tiZF07CisJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmYW4sICZvcHQsIGFkYXB0ZXIpOworCQlhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQgPSBhbjsKKwl9CisKKwlzd2l0Y2ggKHNwZWVkICsgZHBseCkgeworCWNhc2UgMDoKKwkJYWRhcHRlci0+aHcuYXV0b25lZyA9IGFkYXB0ZXItPmZjX2F1dG9uZWcgPSAxOworCQlpZigobnVtX1NwZWVkID4gYmQpICYmIChzcGVlZCAhPSAwIHx8IGRwbHggIT0gMCkpCisJCQlEUFJJTlRLKFBST0JFLCBJTkZPLAorCQkJICAgICAgICJTcGVlZCBhbmQgZHVwbGV4IGF1dG9uZWdvdGlhdGlvbiBlbmFibGVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBIQUxGX0RVUExFWDoKKwkJRFBSSU5USyhQUk9CRSwgSU5GTywgIkhhbGYgRHVwbGV4IHNwZWNpZmllZCB3aXRob3V0IFNwZWVkXG4iKTsKKwkJRFBSSU5USyhQUk9CRSwgSU5GTywgIlVzaW5nIEF1dG9uZWdvdGlhdGlvbiBhdCAiCisJCQkiSGFsZiBEdXBsZXggb25seVxuIik7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSBhZGFwdGVyLT5mY19hdXRvbmVnID0gMTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gQURWRVJUSVNFXzEwX0hBTEYgfAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VfMTAwX0hBTEY7CisJCWJyZWFrOworCWNhc2UgRlVMTF9EVVBMRVg6CisJCURQUklOVEsoUFJPQkUsIElORk8sICJGdWxsIER1cGxleCBzcGVjaWZpZWQgd2l0aG91dCBTcGVlZFxuIik7CisJCURQUklOVEsoUFJPQkUsIElORk8sICJVc2luZyBBdXRvbmVnb3RpYXRpb24gYXQgIgorCQkJIkZ1bGwgRHVwbGV4IG9ubHlcbiIpOworCQlhZGFwdGVyLT5ody5hdXRvbmVnID0gYWRhcHRlci0+ZmNfYXV0b25lZyA9IDE7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFEVkVSVElTRV8xMF9GVUxMIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURWRVJUSVNFXzEwMF9GVUxMIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURWRVJUSVNFXzEwMDBfRlVMTDsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDoKKwkJRFBSSU5USyhQUk9CRSwgSU5GTywgIjEwIE1icHMgU3BlZWQgc3BlY2lmaWVkICIKKwkJCSJ3aXRob3V0IER1cGxleFxuIik7CisJCURQUklOVEsoUFJPQkUsIElORk8sICJVc2luZyBBdXRvbmVnb3RpYXRpb24gYXQgMTAgTWJwcyBvbmx5XG4iKTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZyA9IGFkYXB0ZXItPmZjX2F1dG9uZWcgPSAxOworCQlhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQgPSBBRFZFUlRJU0VfMTBfSEFMRiB8CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEVkVSVElTRV8xMF9GVUxMOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwICsgSEFMRl9EVVBMRVg6CisJCURQUklOVEsoUFJPQkUsIElORk8sICJGb3JjaW5nIHRvIDEwIE1icHMgSGFsZiBEdXBsZXhcbiIpOworCQlhZGFwdGVyLT5ody5hdXRvbmVnID0gYWRhcHRlci0+ZmNfYXV0b25lZyA9IDA7CisJCWFkYXB0ZXItPmh3LmZvcmNlZF9zcGVlZF9kdXBsZXggPSBlMTAwMF8xMF9oYWxmOworCQlhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQgPSAwOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwICsgRlVMTF9EVVBMRVg6CisJCURQUklOVEsoUFJPQkUsIElORk8sICJGb3JjaW5nIHRvIDEwIE1icHMgRnVsbCBEdXBsZXhcbiIpOworCQlhZGFwdGVyLT5ody5hdXRvbmVnID0gYWRhcHRlci0+ZmNfYXV0b25lZyA9IDA7CisJCWFkYXB0ZXItPmh3LmZvcmNlZF9zcGVlZF9kdXBsZXggPSBlMTAwMF8xMF9mdWxsOworCQlhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQgPSAwOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMDoKKwkJRFBSSU5USyhQUk9CRSwgSU5GTywgIjEwMCBNYnBzIFNwZWVkIHNwZWNpZmllZCAiCisJCQkid2l0aG91dCBEdXBsZXhcbiIpOworCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiVXNpbmcgQXV0b25lZ290aWF0aW9uIGF0ICIKKwkJCSIxMDAgTWJwcyBvbmx5XG4iKTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZyA9IGFkYXB0ZXItPmZjX2F1dG9uZWcgPSAxOworCQlhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQgPSBBRFZFUlRJU0VfMTAwX0hBTEYgfAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VfMTAwX0ZVTEw7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwICsgSEFMRl9EVVBMRVg6CisJCURQUklOVEsoUFJPQkUsIElORk8sICJGb3JjaW5nIHRvIDEwMCBNYnBzIEhhbGYgRHVwbGV4XG4iKTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZyA9IGFkYXB0ZXItPmZjX2F1dG9uZWcgPSAwOworCQlhZGFwdGVyLT5ody5mb3JjZWRfc3BlZWRfZHVwbGV4ID0gZTEwMDBfMTAwX2hhbGY7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IDA7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwICsgRlVMTF9EVVBMRVg6CisJCURQUklOVEsoUFJPQkUsIElORk8sICJGb3JjaW5nIHRvIDEwMCBNYnBzIEZ1bGwgRHVwbGV4XG4iKTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZyA9IGFkYXB0ZXItPmZjX2F1dG9uZWcgPSAwOworCQlhZGFwdGVyLT5ody5mb3JjZWRfc3BlZWRfZHVwbGV4ID0gZTEwMDBfMTAwX2Z1bGw7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IDA7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwMDoKKwkJRFBSSU5USyhQUk9CRSwgSU5GTywgIjEwMDAgTWJwcyBTcGVlZCBzcGVjaWZpZWQgd2l0aG91dCAiCisJCQkiRHVwbGV4XG4iKTsKKwkJRFBSSU5USyhQUk9CRSwgSU5GTywKKwkJCSJVc2luZyBBdXRvbmVnb3RpYXRpb24gYXQgMTAwMCBNYnBzICIKKwkJCSJGdWxsIER1cGxleCBvbmx5XG4iKTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZyA9IGFkYXB0ZXItPmZjX2F1dG9uZWcgPSAxOworCQlhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQgPSBBRFZFUlRJU0VfMTAwMF9GVUxMOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMDAgKyBIQUxGX0RVUExFWDoKKwkJRFBSSU5USyhQUk9CRSwgSU5GTywKKwkJCSJIYWxmIER1cGxleCBpcyBub3Qgc3VwcG9ydGVkIGF0IDEwMDAgTWJwc1xuIik7CisJCURQUklOVEsoUFJPQkUsIElORk8sCisJCQkiVXNpbmcgQXV0b25lZ290aWF0aW9uIGF0IDEwMDAgTWJwcyAiCisJCQkiRnVsbCBEdXBsZXggb25seVxuIik7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSBhZGFwdGVyLT5mY19hdXRvbmVnID0gMTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gQURWRVJUSVNFXzEwMDBfRlVMTDsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDAwICsgRlVMTF9EVVBMRVg6CisJCURQUklOVEsoUFJPQkUsIElORk8sCisJCSAgICAgICAiVXNpbmcgQXV0b25lZ290aWF0aW9uIGF0IDEwMDAgTWJwcyBGdWxsIER1cGxleCBvbmx5XG4iKTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZyA9IGFkYXB0ZXItPmZjX2F1dG9uZWcgPSAxOworCQlhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQgPSBBRFZFUlRJU0VfMTAwMF9GVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwkvKiBTcGVlZCwgQXV0b05lZyBhbmQgTURJL01ESS1YIG11c3QgYWxsIHBsYXkgbmljZSAqLworCWlmIChlMTAwMF92YWxpZGF0ZV9tZGlfc2V0dGluZygmKGFkYXB0ZXItPmh3KSkgPCAwKSB7CisJCURQUklOVEsoUFJPQkUsIElORk8sCisJCQkiU3BlZWQsIEF1dG9OZWcgYW5kIE1ESS1YIHNwZWNpZmljYXRpb25zIGFyZSAiCisJCQkiaW5jb21wYXRpYmxlLiBTZXR0aW5nIE1ESS1YIHRvIGEgY29tcGF0aWJsZSB2YWx1ZS5cbiIpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTIxMDAuYyBiL2RyaXZlcnMvbmV0L2UyMTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjOWZhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2UyMTAwLmMKQEAgLTAsMCArMSw0ODUgQEAKKy8qIGUyMTAwLmM6IEEgQ2FibGV0cm9uIEUyMTAwIHNlcmllcyBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKwlXcml0dGVuIDE5OTMtMTk5NCBieSBEb25hbGQgQmVja2VyLgorCisJQ29weXJpZ2h0IDE5OTQgYnkgRG9uYWxkIEJlY2tlci4KKwlDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisJRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kCisJZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisJaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgQ2FibGV0cm9uIEUyMTAwIHNlcmllcyBldGhlcmNhcmRzLgorCisJVGhlIEF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJVGhlIEUyMTAwIHNlcmllcyBldGhlcmNhcmQgaXMgYSBmYWlybHkgZ2VuZXJpYyBzaGFyZWQgbWVtb3J5IDgzOTAKKwlpbXBsZW1lbnRhdGlvbi4gIFRoZSBvbmx5IHVudXN1YWwgYXNwZWN0IGlzIHRoZSB3YXkgdGhlIHNoYXJlZCBtZW1vcnkKKwlyZWdpc3RlcnMgYXJlIHNldDogZmlyc3QgeW91IGRvIGFuIGluYigpIGluIHdoYXQgaXMgbm9ybWFsbHkgdGhlCisJc3RhdGlvbiBhZGRyZXNzIHJlZ2lvbiwgYW5kIHRoZSBsb3cgdGhyZWUgYml0cyBvZiBuZXh0IG91dGIoKSAqYWRkcmVzcyoKKwlpcyB1c2VkCWFzIHRoZSB3cml0ZSB2YWx1ZSBmb3IgdGhhdCByZWdpc3Rlci4gIEVpdGhlciBzb21lb25lIHdhc24ndAorCXRvbyB1c2VkIHRvIGRlbSBiaXQgZW4gYml0ZXMsIG9yIHRoZXkgd2VyZSB0cnlpbmcgdG8gb2JmdXNjYXRlIHRoZQorCXByb2dyYW1taW5nIGludGVyZmFjZS4KKworCVRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgY29tcGxpY2F0aW9uIHdoZW4gc2V0dGluZyB0aGUgd2luZG93IG9uIHRoZSBwYWNrZXQKKwlidWZmZXIuICBZb3UgbXVzdCBmaXJzdCBkbyBhIHJlYWQgaW50byB0aGUgcGFja2V0IGJ1ZmZlciByZWdpb24gd2l0aCB0aGUKKwlsb3cgOCBhZGRyZXNzIGJpdHMgdGhlIGFkZHJlc3Mgc2V0dGluZyB0aGUgcGFnZSBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQKKwlidWZmZXIgd2luZG93LCBhbmQgdGhlbiBkbyB0aGUgYWJvdmUgb3BlcmF0aW9uLiAgU2VlIG1lbV9vbigpIGZvciBkZXRhaWxzLgorCisJT25lIGJ1ZyBvbiB0aGUgY2hpcCBpcyB0aGF0IGV2ZW4gYSBoYXJkIHJlc2V0IHdvbid0IGRpc2FibGUgdGhlIG1lbW9yeQorCXdpbmRvdywgdXN1YWxseSByZXN1bHRpbmcgaW4gYSBodW5nIG1hY2hpbmUgaWYgbWVtX29mZigpIGlzbid0IGNhbGxlZC4KKwlJZiB0aGlzIGhhcHBlbnMsIHlvdSBtdXN0IHBvd2VyIGRvd24gdGhlIG1hY2hpbmUgZm9yIGFib3V0IDMwIHNlY29uZHMuCisqLworCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQorCSJlMjEwMC5jOnYxLjAxIDcvMjEvOTQgRG9uYWxkIEJlY2tlciAoYmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292KVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworI2RlZmluZSBEUlZfTkFNRSAiZTIxMDAiCisKK3N0YXRpYyBpbnQgZTIxX3Byb2JlX2xpc3RbXSA9IHsweDMwMCwgMHgyODAsIDB4MzgwLCAweDIyMCwgMH07CisKKy8qIE9mZnNldHMgZnJvbSB0aGUgYmFzZV9hZGRyLgorICAgUmVhZCBmcm9tIHRoZSBBU0lDIHJlZ2lzdGVyLCBhbmQgdGhlIGxvdyB0aHJlZSBiaXRzIG9mIHRoZSBuZXh0IG91dGIoKQorICAgYWRkcmVzcyBpcyB1c2VkIHRvIHNldCB0aGUgY29ycmVzcG9uZGluZyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgRTIxX05JQ19PRkZTRVQgIDAJCS8qIE9mZnNldCB0byB0aGUgODM5MCBOSUMuICovCisjZGVmaW5lIEUyMV9BU0lDCQkweDEwCisjZGVmaW5lIEUyMV9NRU1fRU5BQkxFCTB4MTAKKyNkZWZpbmUgIEUyMV9NRU1fT04JCTB4MDUJLyogRW5hYmxlIG1lbW9yeSBpbiAxNiBiaXQgbW9kZS4gKi8KKyNkZWZpbmUgIEUyMV9NRU1fT05fOAkweDA3CS8qIEVuYWJsZSBtZW1vcnkgaW4gIDggYml0IG1vZGUuICovCisjZGVmaW5lIEUyMV9NRU1fQkFTRQkweDExCisjZGVmaW5lIEUyMV9JUlFfTE9XCQkweDEyCS8qIFRoZSBsb3cgdGhyZWUgYml0cyBvZiB0aGUgSVJRIG51bWJlci4gKi8KKyNkZWZpbmUgRTIxX0lSUV9ISUdICTB4MTQJLyogVGhlIGhpZ2ggSVJRIGJpdCBhbmQgbWVkaWEgc2VsZWN0IC4uLiAgKi8KKyNkZWZpbmUgRTIxX01FRElBCQkweDE0CS8qIChhbGlhcykuICovCisjZGVmaW5lICBFMjFfQUxUX0lGUE9SVCAweDAyCS8qIFNldCB0byB1c2UgdGhlIG90aGVyIChCTkMsQVVJKSBwb3J0LiAqLworI2RlZmluZSAgRTIxX0JJR19NRU0JMHgwNAkvKiBVc2UgYSBiaWdnZXIgKDY0SykgYnVmZmVyICh3ZSBkb24ndCkgKi8KKyNkZWZpbmUgRTIxX1NBUFJPTQkJMHgxMAkvKiBPZmZzZXQgdG8gc3RhdGlvbiBhZGRyZXNzIGRhdGEuICovCisjZGVmaW5lIEUyMV9JT19FWFRFTlQJIDB4MjAKKworc3RhdGljIGlubGluZSB2b2lkIG1lbV9vbihzaG9ydCBwb3J0LCB2b2xhdGlsZSBjaGFyIF9faW9tZW0gKm1lbV9iYXNlLAorCQkJCQkJICB1bnNpZ25lZCBjaGFyIHN0YXJ0X3BhZ2UgKQoreworCS8qIFRoaXMgaXMgYSBsaXR0bGUgd2VpcmQ6IHNldCB0aGUgc2hhcmVkIG1lbW9yeSB3aW5kb3cgYnkgZG9pbmcgYQorCSAgIHJlYWQuICBUaGUgbG93IGFkZHJlc3MgYml0cyBzcGVjaWZ5IHRoZSBzdGFydGluZyBwYWdlLiAqLworCXJlYWRiKG1lbV9iYXNlK3N0YXJ0X3BhZ2UpOworCWluYihwb3J0ICsgRTIxX01FTV9FTkFCTEUpOworCW91dGIoRTIxX01FTV9PTiwgcG9ydCArIEUyMV9NRU1fRU5BQkxFICsgRTIxX01FTV9PTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fb2ZmKHNob3J0IHBvcnQpCit7CisJaW5iKHBvcnQgKyBFMjFfTUVNX0VOQUJMRSk7CisJb3V0YigweDAwLCBwb3J0ICsgRTIxX01FTV9FTkFCTEUpOworfQorCisvKiBJbiBvdGhlciBkcml2ZXJzIEkgcHV0IHRoZSBUWCBwYWdlcyBmaXJzdCwgYnV0IHRoZSBFMjEwMCB3aW5kb3cgY2lyY3VpdHJ5CisgICBpcyBkZXNpZ25lZCB0byBoYXZlIGEgNEsgVHggcmVnaW9uIGxhc3QuIFRoZSB3aW5kb3dpbmcgY2lyY3VpdHJ5IHdyYXBzIHRoZQorICAgd2luZG93IGF0IDB4MmZmZi0+MHgwMDAwIHNvIHRoYXQgdGhlIHBhY2tldHMgYXQgZS5nLiAweDJmMDAgaW4gdGhlIFJYIHJpbmcKKyAgIGFwcGVhciBjb250aWd1b3VzbHkgaW4gdGhlIHdpbmRvdy4gKi8KKyNkZWZpbmUgRTIxX1JYX1NUQVJUX1BHCQkweDAwCS8qIEZpcnN0IHBhZ2Ugb2YgUlggYnVmZmVyICovCisjZGVmaW5lIEUyMV9SWF9TVE9QX1BHCQkweDMwCS8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nICovCisjZGVmaW5lIEUyMV9CSUdfUlhfU1RPUF9QRwkweEYwCS8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nICovCisjZGVmaW5lIEUyMV9UWF9TVEFSVF9QRwkJRTIxX1JYX1NUT1BfUEcJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKworc3RhdGljIGludCBlMjFfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworCitzdGF0aWMgaW50IGUyMV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZTIxX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlMjFfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIGUyMV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCQkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIGUyMV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCQkJCQlpbnQgcmluZ19wYWdlKTsKKworc3RhdGljIGludCBlMjFfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwwKKy8qICBQcm9iZSBmb3IgdGhlIEUyMTAwIHNlcmllcyBldGhlcmNhcmRzLiAgVGhlc2UgY2FyZHMgaGF2ZSBhbiA4MzkwIGF0IHRoZQorCWJhc2UgYWRkcmVzcyBhbmQgdGhlIHN0YXRpb24gYWRkcmVzcyBhdCBib3RoIG9mZnNldCAweDEwIGFuZCAweDE4LiAgSSByZWFkCisJdGhlIHN0YXRpb24gYWRkcmVzcyBmcm9tIG9mZnNldCAweDE4IHRvIGF2b2lkIHRoZSBkYXRhcG9ydCBvZiBORTIwMDAKKwlldGhlcmNhcmRzLCBhbmQgbG9vayBmb3IgQ3Ryb24ncyB1bmlxdWUgSUQgKGZpcnN0IHRocmVlIG9jdGV0cyBvZiB0aGUKKwlzdGF0aW9uIGFkZHJlc3MpLgorICovCisKK3N0YXRpYyBpbnQgIF9faW5pdCBkb19lMjEwMF9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCAqcG9ydDsKKwlpbnQgYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGlycSA9IGRldi0+aXJxOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKGJhc2VfYWRkciA+IDB4MWZmKQkJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQlyZXR1cm4gZTIxX3Byb2JlMShkZXYsIGJhc2VfYWRkcik7CisJZWxzZSBpZiAoYmFzZV9hZGRyICE9IDApCS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJcmV0dXJuIC1FTlhJTzsKKworCWZvciAocG9ydCA9IGUyMV9wcm9iZV9saXN0OyAqcG9ydDsgcG9ydCsrKSB7CisJCWRldi0+aXJxID0gaXJxOworCQlpZiAoZTIxX3Byb2JlMShkZXYsICpwb3J0KSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIE5COiBlMjFfY2xvc2UoKSBoYW5kbGVzIGZyZWVfaXJxICovCisJaW91bm1hcChlaV9zdGF0dXMubWVtKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRTIxX0lPX0VYVEVOVCk7Cit9CisKKyNpZm5kZWYgTU9EVUxFCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBlMjEwMF9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gZG9fZTIxMDBfcHJvYmUoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJY2xlYW51cF9jYXJkKGRldik7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGUyMV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlpbnQgaSwgc3RhdHVzLCByZXR2YWw7CisJdW5zaWduZWQgY2hhciAqc3RhdGlvbl9hZGRyID0gZGV2LT5kZXZfYWRkcjsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEUyMV9JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIEZpcnN0IGNoZWNrIHRoZSBzdGF0aW9uIGFkZHJlc3MgZm9yIHRoZSBDdHJvbiBwcmVmaXguICovCisJaWYgKGluYihpb2FkZHIgKyBFMjFfU0FQUk9NICsgMCkgIT0gMHgwMAorCQl8fCBpbmIoaW9hZGRyICsgRTIxX1NBUFJPTSArIDEpICE9IDB4MDAKKwkJfHwgaW5iKGlvYWRkciArIEUyMV9TQVBST00gKyAyKSAhPSAweDFkKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFZlcmlmeSBieSBtYWtpbmcgY2VydGFpbiB0aGF0IHRoZXJlIGlzIGEgODM5MCBhdCB0aGVyZS4gKi8KKwlvdXRiKEU4MzkwX05PRE1BICsgRTgzOTBfU1RPUCwgaW9hZGRyKTsKKwl1ZGVsYXkoMSk7CS8qIHdlIHdhbnQgdG8gZGVsYXkgb25lIEkvTyBjeWNsZSAtIHdoaWNoIGlzIDJNSHogKi8KKwlzdGF0dXMgPSBpbmIoaW9hZGRyKTsKKwlpZiAoc3RhdHVzICE9IDB4MjEgJiYgc3RhdHVzICE9IDB4MjMpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJLyogUmVhZCB0aGUgc3RhdGlvbiBhZGRyZXNzIFBST00uICAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXN0YXRpb25fYWRkcltpXSA9IGluYihpb2FkZHIgKyBFMjFfU0FQUk9NICsgaSk7CisKKwlpbmIoaW9hZGRyICsgRTIxX01FRElBKTsgCQkvKiBQb2ludCB0byBtZWRpYSBzZWxlY3Rpb24uICovCisJb3V0YigwLCBpb2FkZHIgKyBFMjFfQVNJQyk7IAkvKiBhbmQgZGlzYWJsZSB0aGUgc2Vjb25kYXJ5IGludGVyZmFjZS4gKi8KKworCWlmIChlaV9kZWJ1ZyAgJiYgIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayh2ZXJzaW9uKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUwMlgiLCBzdGF0aW9uX2FkZHJbaV0pOworCisJaWYgKGRldi0+aXJxIDwgMikgeworCQlpbnQgaXJxbGlzdFtdID0gezE1LDExLDEwLDEyLDUsOSwzLDR9LCBpOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJaWYgKHJlcXVlc3RfaXJxIChpcnFsaXN0W2ldLCBOVUxMLCAwLCAiYm9ndXMiLCBOVUxMKSAhPSAtRUJVU1kpIHsKKwkJCQlkZXYtPmlycSA9IGlycWxpc3RbaV07CisJCQkJYnJlYWs7CisJCQl9CisJCWlmIChpID49IDgpIHsKKwkJCXByaW50aygiIHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwgZGV2LT5pcnEpOworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIGlmIChkZXYtPmlycSA9PSAyKQkvKiBGaXh1cCBsdXNlciBib2dvc2l0eTogSVJRMiBpcyByZWFsbHkgSVJROSAqLworCQlkZXYtPmlycSA9IDk7CisKKwkvKiBUaGUgODM5MCBpcyBhdCB0aGUgYmFzZSBhZGRyZXNzLiAqLworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJZWlfc3RhdHVzLm5hbWUgPSAiRTIxMDAiOworCWVpX3N0YXR1cy53b3JkMTYgPSAxOworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gRTIxX1RYX1NUQVJUX1BHOworCWVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gRTIxX1JYX1NUQVJUX1BHOworCWVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBFMjFfUlhfU1RPUF9QRzsKKwllaV9zdGF0dXMuc2F2ZWRfaXJxID0gZGV2LT5pcnE7CisKKwkvKiBDaGVjayB0aGUgbWVkaWEgcG9ydCB1c2VkLiAgVGhlIHBvcnQgY2FuIGJlIHBhc3NlZCBpbiBvbiB0aGUKKwkgICBsb3cgbWVtX2VuZCBiaXRzLiAqLworCWlmIChkZXYtPm1lbV9lbmQgJiAxNSkKKwkJZGV2LT5pZl9wb3J0ID0gZGV2LT5tZW1fZW5kICYgNzsKKwllbHNlIHsKKwkJZGV2LT5pZl9wb3J0ID0gMDsKKwkJaW5iKGlvYWRkciArIEUyMV9NRURJQSk7IAkvKiBUdXJuIGF1dG9tYXRpYyBtZWRpYSBkZXRlY3Rpb24gb24uICovCisJCWZvcihpID0gMDsgaSA8IDY7IGkrKykKKwkJCWlmIChzdGF0aW9uX2FkZHJbaV0gIT0gaW5iKGlvYWRkciArIEUyMV9TQVBST00gKyA4ICsgaSkpIHsKKwkJCQlkZXYtPmlmX3BvcnQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCX0KKworCS8qIE5ldmVyIG1hcCBpbiB0aGUgRTIxIHNoYXJlZCBtZW1vcnkgdW5sZXNzIHlvdSBhcmUgYWN0aXZlbHkgdXNpbmcgaXQuCisJICAgQWxzbywgdGhlIHNoYXJlZCBtZW1vcnkgaGFzIGVmZmVjdGl2ZSBvbmx5IG9uZSBzZXR0aW5nIC0tIHNwcmVhZCBhbGwKKwkgICBvdmVyIHRoZSAxMjhLIHJlZ2lvbiEgKi8KKwlpZiAoZGV2LT5tZW1fc3RhcnQgPT0gMCkKKwkJZGV2LT5tZW1fc3RhcnQgPSAweGQwMDAwOworCisJZWlfc3RhdHVzLm1lbSA9IGlvcmVtYXAoZGV2LT5tZW1fc3RhcnQsIDIqMTAyNCk7CisJaWYgKCFlaV9zdGF0dXMubWVtKSB7CisJCXByaW50aygidW5hYmxlIHRvIHJlbWFwIG1lbW9yeVxuIik7CisJCXJldHZhbCA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKworI2lmZGVmIG5vdGRlZgorCS8qIFRoZXNlIHZhbHVlcyBhcmUgdW51c2VkLiAgVGhlIEUyMTAwIGhhcyBhIDJLIHdpbmRvdyBpbnRvIHRoZSBwYWNrZXQKKwkgICBidWZmZXIuICBUaGUgd2luZG93IGNhbiBiZSBzZXQgdG8gc3RhcnQgb24gYW55IHBhZ2UgYm91bmRhcnkuICovCisJZWlfc3RhdHVzLnJtZW1fc3RhcnQgPSBkZXYtPm1lbV9zdGFydCArIFRYX1BBR0VTKjI1NjsKKwlkZXYtPm1lbV9lbmQgPSBlaV9zdGF0dXMucm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIDIqMTAyNDsKKyNlbmRpZgorCisJcHJpbnRrKCIsIElSUSAlZCwgJXMgbWVkaWEsIG1lbW9yeSBAICUjbHguXG4iLCBkZXYtPmlycSwKKwkJICAgZGV2LT5pZl9wb3J0ID8gInNlY29uZGFyeSIgOiAicHJpbWFyeSIsIGRldi0+bWVtX3N0YXJ0KTsKKworCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJmUyMV9yZXNldF84MzkwOworCWVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZlMjFfYmxvY2tfaW5wdXQ7CisJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZlMjFfYmxvY2tfb3V0cHV0OworCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmZTIxX2dldF84MzkwX2hkcjsKKwlkZXYtPm9wZW4gPSAmZTIxX29wZW47CisJZGV2LT5zdG9wID0gJmUyMV9jbG9zZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCU5TODM5MF9pbml0KGRldiwgMCk7CisKKwlyZXR1cm4gMDsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEUyMV9JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK2UyMV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHJldHZhbDsKKworCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpKSkKKwkJcmV0dXJuIHJldHZhbDsKKworCS8qIFNldCB0aGUgaW50ZXJydXB0IGxpbmUgYW5kIG1lbW9yeSBiYXNlIG9uIHRoZSBoYXJkd2FyZS4gKi8KKwlpbmIoaW9hZGRyICsgRTIxX0lSUV9MT1cpOworCW91dGIoMCwgaW9hZGRyICsgRTIxX0FTSUMgKyAoZGV2LT5pcnEgJiA3KSk7CisJaW5iKGlvYWRkciArIEUyMV9JUlFfSElHSCk7IAkJCS8qIEhpZ2ggSVJRIGJpdCwgYW5kIGlmX3BvcnQuICovCisJb3V0YigwLCBpb2FkZHIgKyBFMjFfQVNJQyArIChkZXYtPmlycSA+IDcgPyAxOjApCisJCSAgICsgKGRldi0+aWZfcG9ydCA/IEUyMV9BTFRfSUZQT1JUIDogMCkpOworCWluYihpb2FkZHIgKyBFMjFfTUVNX0JBU0UpOworCW91dGIoMCwgaW9hZGRyICsgRTIxX0FTSUMgKyAoKGRldi0+bWVtX3N0YXJ0ID4+IDE3KSAmIDcpKTsKKworCWVpX29wZW4oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2UyMV9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlvdXRiKDB4MDEsIGlvYWRkcik7CisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldHRpbmcgdGhlIEUyMTgweDMgdD0lbGQuLi4iLCBqaWZmaWVzKTsKKwllaV9zdGF0dXMudHhpbmcgPSAwOworCisJLyogU2V0IHVwIHRoZSBBU0lDIHJlZ2lzdGVycywganVzdCBpbiBjYXNlIHNvbWV0aGluZyBjaGFuZ2VkIHRoZW0uICovCisKKwlpZiAoZWlfZGVidWcgPiAxKSBwcmludGsoInJlc2V0IGRvbmVcbiIpOworCXJldHVybjsKK30KKworLyogR3JhYiB0aGUgODM5MCBzcGVjaWZpYyBoZWFkZXIuIFdlIHB1dCB0aGUgMmsgd2luZG93IHNvIHRoZSBoZWFkZXIgcGFnZQorICAgYXBwZWFycyBhdCB0aGUgc3RhcnQgb2YgdGhlIHNoYXJlZCBtZW1vcnkuICovCisKK3N0YXRpYyB2b2lkCitlMjFfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpCit7CisKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwljaGFyIF9faW9tZW0gKnNoYXJlZF9tZW0gPSBlaV9zdGF0dXMubWVtOworCisJbWVtX29uKGlvYWRkciwgc2hhcmVkX21lbSwgcmluZ19wYWdlKTsKKworI2lmZGVmIG5vdGRlZgorCS8qIE9mZmljaWFsbHkgdGhpcyBpcyB3aGF0IHdlIGFyZSBkb2luZywgYnV0IHRoZSByZWFkbCgpIGlzIGZhc3RlciAqLworCW1lbWNweV9mcm9taW8oaGRyLCBzaGFyZWRfbWVtLCBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpKTsKKyNlbHNlCisJKCh1bnNpZ25lZCBpbnQqKWhkcilbMF0gPSByZWFkbChzaGFyZWRfbWVtKTsKKyNlbmRpZgorCisJLyogVHVybiBvZmYgbWVtb3J5IGFjY2Vzczogd2Ugd291bGQgbmVlZCB0byByZXByb2dyYW0gdGhlIHdpbmRvdyBhbnl3YXkuICovCisJbWVtX29mZihpb2FkZHIpOworCit9CisKKy8qICBCbG9jayBpbnB1dCBhbmQgb3V0cHV0IGFyZSBlYXN5IG9uIHNoYXJlZCBtZW1vcnkgZXRoZXJjYXJkcy4KKwlUaGUgRTIxeHggbWFrZXMgYmxvY2tfaW5wdXQoKSBlc3BlY2lhbGx5IGVhc3kgYnkgd3JhcHBpbmcgdGhlIHRvcAorCXJpbmcgYnVmZmVyIHRvIHRoZSBib3R0b20gYXV0b21hdGljYWxseS4gKi8KK3N0YXRpYyB2b2lkCitlMjFfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJY2hhciBfX2lvbWVtICpzaGFyZWRfbWVtID0gZWlfc3RhdHVzLm1lbTsKKworCW1lbV9vbihpb2FkZHIsIHNoYXJlZF9tZW0sIChyaW5nX29mZnNldD4+OCkpOworCisJLyogUGFja2V0IGlzIGFsd2F5cyBpbiBvbmUgY2h1bmsgLS0gd2UgY2FuIGNvcHkgKyBja3N1bS4gKi8KKwlldGhfaW9fY29weV9hbmRfc3VtKHNrYiwgZWlfc3RhdHVzLm1lbSArIChyaW5nX29mZnNldCAmIDB4ZmYpLCBjb3VudCwgMCk7CisKKwltZW1fb2ZmKGlvYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkCitlMjFfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCSBpbnQgc3RhcnRfcGFnZSkKK3sKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl2b2xhdGlsZSBjaGFyIF9faW9tZW0gKnNoYXJlZF9tZW0gPSBlaV9zdGF0dXMubWVtOworCisJLyogU2V0IHRoZSBzaGFyZWQgbWVtb3J5IHdpbmRvdyBzdGFydCBieSBkb2luZyBhIHJlYWQsIHdpdGggdGhlIGxvdyBhZGRyZXNzCisJICAgYml0cyBzcGVjaWZ5aW5nIHRoZSBzdGFydGluZyBwYWdlLiAqLworCXJlYWRiKHNoYXJlZF9tZW0gKyBzdGFydF9wYWdlKTsKKwltZW1fb24oaW9hZGRyLCBzaGFyZWRfbWVtLCBzdGFydF9wYWdlKTsKKworCW1lbWNweV90b2lvKHNoYXJlZF9tZW0sIGJ1ZiwgY291bnQpOworCW1lbV9vZmYoaW9hZGRyKTsKK30KKworc3RhdGljIGludAorZTIxX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsoIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZC5cbiIsIGRldi0+bmFtZSk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlkZXYtPmlycSA9IGVpX3N0YXR1cy5zYXZlZF9pcnE7CisKKwkvKiBTaHV0IG9mZiB0aGUgaW50ZXJydXB0IGxpbmUgYW5kIHNlY29uZGFyeSBpbnRlcmZhY2UuICovCisJaW5iKGlvYWRkciArIEUyMV9JUlFfTE9XKTsKKwlvdXRiKDAsIGlvYWRkciArIEUyMV9BU0lDKTsKKwlpbmIoaW9hZGRyICsgRTIxX0lSUV9ISUdIKTsgCQkJLyogSGlnaCBJUlEgYml0LCBhbmQgaWZfcG9ydC4gKi8KKwlvdXRiKDAsIGlvYWRkciArIEUyMV9BU0lDKTsKKworCWVpX2Nsb3NlKGRldik7CisKKwkvKiBEb3VibGUtY2hlY2sgdGhhdCB0aGUgbWVtb3J5IGhhcyBiZWVuIHR1cm5lZCBvZmYsIGJlY2F1c2UgcmVhbGx5CisJICAgcmVhbGx5IGJhZCB0aGluZ3MgaGFwcGVuIGlmIGl0IGlzbid0LiAqLworCW1lbV9vZmYoaW9hZGRyKTsKKworCXJldHVybiAwOworfQorCisMCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIE1BWF9FMjFfQ0FSRFMJNAkvKiBNYXggbnVtYmVyIG9mIEUyMSBjYXJkcyBwZXIgbW9kdWxlICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9lMjFbTUFYX0UyMV9DQVJEU107CitzdGF0aWMgaW50IGlvW01BWF9FMjFfQ0FSRFNdOworc3RhdGljIGludCBpcnFbTUFYX0UyMV9DQVJEU107CitzdGF0aWMgaW50IG1lbVtNQVhfRTIxX0NBUkRTXTsKK3N0YXRpYyBpbnQgeGN2cltNQVhfRTIxX0NBUkRTXTsJCS8qIGNob29zZSBpbnQuIG9yIGV4dC4geGN2ciAqLworCittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG1lbSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh4Y3ZyLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBudW1iZXIocykiKTsKK01PRFVMRV9QQVJNX0RFU0MobWVtLCAiIG1lbW9yeSBiYXNlIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKHhjdnIsICJ0cmFuc2NlaXZlcihzKSAoMD1pbnRlcm5hbCwgMT1leHRlcm5hbCkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ2FibGV0cm9uIEUyMTAwIElTQSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogVGhpcyBpcyBzZXQgdXAgc28gdGhhdCBvbmx5IGEgc2luZ2xlIGF1dG9wcm9iZSB0YWtlcyBwbGFjZSBwZXIgY2FsbC4KK0lTQSBkZXZpY2UgYXV0b3Byb2JlcyBvbiBhIHJ1bm5pbmcgbWFjaGluZSBhcmUgbm90IHJlY29tbWVuZGVkLiAqLworaW50Citpbml0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHRoaXNfZGV2LCBmb3VuZCA9IDA7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfRTIxX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCWlmIChpb1t0aGlzX2Rldl0gPT0gMCkgIHsKKwkJCWlmICh0aGlzX2RldiAhPSAwKSBicmVhazsgLyogb25seSBhdXRvcHJvYmUgMXN0IG9uZSAqLworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJlMjEwMC5jOiBQcmVzZW50bHkgYXV0b3Byb2JpbmcgKG5vdCByZWNvbW1lbmRlZCkgZm9yIGEgc2luZ2xlIGNhcmQuXG4iKTsKKwkJfQorCQlkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwkJaWYgKCFkZXYpCisJCQlicmVhazsKKwkJZGV2LT5pcnEgPSBpcnFbdGhpc19kZXZdOworCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKKwkJZGV2LT5tZW1fc3RhcnQgPSBtZW1bdGhpc19kZXZdOworCQlkZXYtPm1lbV9lbmQgPSB4Y3ZyW3RoaXNfZGV2XTsJLyogbG93IDRiaXRzID0geGN2ciBzZWwuICovCisJCWlmIChkb19lMjEwMF9wcm9iZShkZXYpID09IDApIHsKKwkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7CisJCQkJZGV2X2UyMVtmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImUyMTAwLmM6IE5vIEUyMTAwIGNhcmQgZm91bmQgKGkvbyA9IDB4JXgpLlxuIiwgaW9bdGhpc19kZXZdKTsKKwkJYnJlYWs7CisJfQorCWlmIChmb3VuZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FTlhJTzsKK30KKwordm9pZAorY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXY7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfRTIxX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZTIxW3RoaXNfZGV2XTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VlcHJvLmMgYi9kcml2ZXJzL25ldC9lZXByby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMjQ3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lZXByby5jCkBAIC0wLDAgKzEsMTg2NSBAQAorLyogZWVwcm8uYzogSW50ZWwgRXRoZXJFeHByZXNzIFByby8xMCBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTk0LCAxOTk1LDE5OTYgYnkgQmFvIEMuIEhhLgorCisJQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LDE5OTYgYnkgQmFvIEMuIEhhLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQKKwlhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKwlpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXQgYmFvLmhhQHNycy5nb3YKKwlvciA0MTggSGFzdGluZ3MgUGxhY2UsIE1hcnRpbmV6LCBHQSAzMDkwNy4KKworCVRoaW5ncyByZW1haW5pbmcgdG8gZG86CisJQmV0dGVyIHJlY29yZCBrZWVwaW5nIG9mIGVycm9ycy4KKwlFbGltaW5hdGUgdHJhbnNtaXQgaW50ZXJydXB0IHRvIHJlZHVjZSBvdmVyaGVhZC4KKwlJbXBsZW1lbnQgImNvbmN1cnJlbnQgcHJvY2Vzc2luZyIuIEkgd29uJ3QgYmUgZG9pbmcgaXQhCisKKwlCdWdzOgorCisJSWYgeW91IGhhdmUgYSBwcm9ibGVtIG9mIG5vdCBkZXRlY3RpbmcgdGhlIDgyNTk1IGR1cmluZyBhCisJcmVib290ICh3YXJtIHJlc2V0KSwgZGlzYWJsZSB0aGUgRkxBU0ggbWVtb3J5IHNob3VsZCBmaXggaXQuCisJVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgaGFyZHdhcmUgcHJvYmxlbS4KKworCVZlcnNpb25zOgorCTAuMTNiCWJhc2ljIGV0aHRvb2wgc3VwcG9ydCAoYXJpcywgMDkvMTMvMjAwNCkKKwkwLjEzYSAgIGluIG1lbW9yeSBzaG9ydGFnZSwgZHJvcCBwYWNrZXRzIGFsc28gaW4gYm9hcmQKKwkJKE1pY2hhZWwgV2VzdGVybWFubiA8bXdAbWljcm9kYXRhLXBvcy5kZT4sIDA3LzMwLzIwMDIpCisJMC4xMyAgICBpcnEgc2hhcmluZywgcmV3cm90ZSBwcm9iZSBmdW5jdGlvbiwgZml4ZWQgYSBuYXN0eSBidWcgaW4KKwkJaGFyZHdhcmVfc2VuZF9wYWNrZXQgYW5kIGEgbWFqb3IgY2xlYW51cCAoYXJpcywgMTEvMDgvMjAwMSkKKwkwLjEyZAlmaXhpbmcgYSBwcm9ibGVtIHdpdGggc2luZ2xlIGNhcmQgZGV0ZWN0ZWQgYXMgZWlnaHQgZXRoIGRldmljZXMKKwkJZml4aW5nIGEgcHJvYmxlbSB3aXRoIHN1ZGRlbiBkcm9wIGluIGNhcmQgcGVyZm9ybWFuY2UKKwkJKGNocmlzIChhc2RuQGdvMi5wbCksIDEwLzI5LzIwMDEpCisJMC4xMmMJZml4aW5nIHNvbWUgcHJvYmxlbXMgd2l0aCBvbGQgY2FyZHMgKGFyaXMsIDAxLzA4LzIwMDEpCisJMC4xMmIJbWlzYyBmaXhlcyAoYXJpcywgMDYvMjYvMjAwMCkKKwkwLjEyYSAgIHBvcnQgb2YgdmVyc2lvbiAwLjEyYSBvZiAyLjIueCBrZXJuZWxzIHRvIDIuMy54CisJCShhcmlzIChhcmlzQGNvbmVjdGl2YS5jb20uYnIpLCAwNS8xOS8yMDAwKQorCTAuMTFlICAgc29tZSB0d2Vha3MgYWJvdXQgbXVsdGlwbGUgY2FyZHMgc3VwcG9ydCAoUGRQLCBqdWwvYXVnIDE5OTkpCisJMC4xMWQJYWRkZWQgX19pbml0ZGF0YSwgX19pbml0IHN0dWZmOyBjYWxsIHNwaW5fbG9ja19pbml0CisJICAgICAgICBpbiBlZXByb19wcm9iZTEuIFJlcGxhY2VkICJlZXBybyIgYnkgZGV2LT5uYW1lLiBBdWdtZW50ZWQKKwkJdGhlIGNvZGUgcHJvdGVjdGVkIGJ5IHNwaW5fbG9jayBpbiBpbnRlcnJ1cHQgcm91dGluZQorCQkoUGRQLCAxMi8xMi8xOTk4KQorCTAuMTFjICAgbWlub3IgY2xlYW51cCAoUGRQLCBSTUMsIDA5LzEyLzE5OTgpCisJMC4xMWIgICBQYXNjYWwgRHVwdWlzIChkdXB1aXNAbGVpLnVjbC5hYy5iZSk6IHdvcmtzIGFzIGEgbW9kdWxlCisJICAgICAgICB1bmRlciAyLjEueHguIERlYnVnIG1lc3NhZ2VzIGFyZSBmbGFnZ2VkIGFzIEtFUk5fREVCVUcgdG8KKwkJYXZvaWQgY29uc29sZSBmbG9vZGluZy4gQWRkZWQgbG9ja2luZyBhdCBjcml0aWNhbCBwYXJ0cy4gTm93CisJCXRoZSBkYXduIHRoaW5nIGlzIFNNUCBzYWZlLgorCTAuMTFhICAgQXR0ZW1wdCB0byBnZXQgMi4xLnh4IHN1cHBvcnQgdXAgKFJNQykKKwkwLjExCUJyaWFuIENhbmRsZXIgYWRkZWQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgY2FyZHMuIFRlc3RlZCBhcworCQlhIG1vZHVsZSwgbm8gaWRlYSBpZiBpdCB3b3JrcyB3aGVuIGNvbXBpbGVkIGludG8ga2VybmVsLgorCisJMC4xMGUJUmljayBCcmVzc2xlciBub3RpZmllZCBtZSB0aGF0IGlmY29uZmlnIHVwO2lmY29uZmlnIGRvd24gZmFpbHMKKwkJYmVjYXVzZSB0aGUgaXJxIGlzIGxvc3Qgc29tZXdoZXJlLiBGaXhlZCB0aGF0IGJ5IG1vdmluZworCQlyZXF1ZXN0X2lycSBhbmQgZnJlZV9pcnEgdG8gZWVwcm9fb3BlbiBhbmQgZWVwcm9fY2xvc2UgcmVzcGVjdGl2ZWx5LgorCTAuMTBkCVVnaCEgTm93IFdha2V1cCB3b3Jrcy4gV2FzIHNlcmlvdXNseSBicm9rZW4gaW4gbXkgZmlyc3QgYXR0ZW1wdC4KKwkJSSdsbCBuZWVkIHRvIGZpbmQgYSB3YXkgdG8gc3BlY2lmeSBhbiBpb3BvcnQgb3RoZXIgdGhhbgorCQl0aGUgZGVmYXVsdCBvbmUgaW4gdGhlIFBuUCBjYXNlLiBQblAgZGVmaW5pdGl2ZWx5IHN1Y2tzLgorCQlBbmQsIHllcywgdGhpcyBpcyBub3QgdGhlIG9ubHkgcmVhc29uLgorCTAuMTBjCVBuUCBXYWtldXAgVGVzdCBmb3IgNTk1RlguIHVuY29tbWVudCAjZGVmaW5lIFBuUFdha2V1cDsKKwkJdG8gdXNlLgorCTAuMTBiCVNob3VsZCB3b3JrIG5vdyB3aXRoIChzb21lKSBQcm8vMTArLiBBdCBsZWFzdCBmb3IKKwkJbWUgKGFuZCBteSB0d28gY2FyZHMpIGl0IGRvZXMuIF9Ob18gZ3VhcmFudGVlIGZvcgorCQlmdW5jdGlvbiB3aXRoIG5vbi1Qcm8vMTArIGNhcmRzISAoZG9uJ3QgaGF2ZSBhbnkpCisJCShSTUMsIDkvMTEvOTYpCisKKwkwLjEwCUFkZGVkIHN1cHBvcnQgZm9yIHRoZSBFdGhlcmV4cHJlc3MgUHJvLzEwKy4gIFRoZQorCQlJUlEgbWFwIHdhcyBjaGFuZ2VkIHNpZ25pZmljYW50bHkgZnJvbSB0aGUgb2xkCisJCXByby8xMC4gIFRoZSBuZXcgaW50ZXJydXB0IG1hcCB3YXMgcHJvdmlkZWQgYnkKKwkJUmFpbmVyIE0uIENhbmF2YW4gKENhbmF2YW5AWmV1cy5jcy5ib25uLmVkdSkuCisJCShCQ0gsIDkvMy85NikKKworCTAuMDkJRml4ZWQgYSByYWNlIGNvbmRpdGlvbiBpbiB0aGUgdHJhbnNtaXQgYWxnb3JpdGhtLAorCQl3aGljaCBjYXVzZXMgY3Jhc2hlcyB1bmRlciBoZWF2eSBsb2FkIHdpdGggZmFzdAorCQlwZW50aXVtIGNvbXB1dGVycy4gIFRoZSBwZXJmb3JtYW5jZSBzaG91bGQgYWxzbworCQlpbXByb3ZlIGEgYml0LiAgVGhlIHNpemUgb2YgUlggYnVmZmVyLCBhbmQgaGVuY2UKKwkJVFggYnVmZmVyLCBjYW4gYWxzbyBiZSBjaGFuZ2VkIHZpYSBsaWxvIG9yIGluc21vZC4KKwkJKEJDSCwgNy8zMS85NikKKworCTAuMDgJSW1wbGVtZW50IDMyLWJpdCBJL08gZm9yIHRoZSA4MjU5NVRYIGFuZCA4MjU5NUZYCisJCWJhc2VkIGxhbiBjYXJkcy4gIERpc2FibGUgZnVsbC1kdXBsZXggbW9kZSBpZiBUUEUKKwkJaXMgbm90IHVzZWQuICAoQkNILCA0LzgvOTYpCisKKwkwLjA3YQlGaXggYSBzdGF0IHJlcG9ydCB3aGljaCBjb3VudHMgZXZlcnkgcGFja2V0IGFzIGEKKwkJaGVhcnQtYmVhdCBmYWlsdXJlLiAoQkNILCA2LzMvOTUpCisKKwkwLjA3CU1vZGlmaWVkIHRvIHN1cHBvcnQgYWxsIG90aGVyIDgyNTk1LWJhc2VkIGxhbiBjYXJkcy4KKwkJVGhlIElSUSB2ZWN0b3Igb2YgdGhlIEV0aGVyRXhwcmVzcyBQcm8gd2lsbCBiZSBzZXQKKwkJYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBzYXZlZCBpbiB0aGUgRUVQUk9NLiAgRm9yIG90aGVyCisJCWNhcmRzLCBJIHdpbGwgZG8gYXV0b2lycV9yZXF1ZXN0KCkgdG8gZ3JhYiB0aGUgbmV4dAorCQlhdmFpbGFibGUgaW50ZXJydXB0IHZlY3Rvci4gKEJDSCwgMy8xNy85NSkKKworCTAuMDZhLGIJSW50ZXJpbSByZWxlYXNlZC4gIE1pbm9yIGNoYW5nZXMgaW4gdGhlIGNvbW1lbnRzIGFuZAorCQlwcmludCBvdXQgZm9ybWF0LiAoQkNILCAzLzkvOTUgYW5kIDMvMTQvOTUpCisKKwkwLjA2CUZpcnN0IHN0YWJsZSByZWxlYXNlIHRoYXQgSSBhbSBjb21mb3J0YWJsZSB3aXRoLiAoQkNILAorCQkzLzIvOTUpCisKKwkwLjA1CUNvbXBsZXRlIHRlc3Rpbmcgb2YgbXVsdGljYXN0LiAoQkNILCAyLzIzLzk1KQorCisJMC4wNAlBZGRpbmcgbXVsdGljYXN0IHN1cHBvcnQuIChCQ0gsIDIvMTQvOTUpCisKKwkwLjAzCUZpcnN0IHdpZGVseSBhbHBoYSByZWxlYXNlIGZvciBwdWJsaWMgdGVzdGluZy4KKwkJKEJDSCwgMi8xNC85NSkKKworKi8KKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKwkiZWVwcm8uYzogdjAuMTNiIDA5LzEzLzIwMDQgYXJpc0BjYXRoZWRyYWxsYWJzLm9yZ1xuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisvKgorICBTb3VyY2VzOgorCisJVGhpcyBkcml2ZXIgd291bGRuJ3QgaGF2ZSBiZWVuIHdyaXR0ZW4gd2l0aG91dCB0aGUgYXZhaWxhYmlsaXR5CisJb2YgdGhlIENyeW53cidzIExhbjU5NSBkcml2ZXIgc291cmNlIGNvZGUuICBJdCBoZWxwcyBtZSB0bworCWZhbWlsaWFyaXplIHdpdGggdGhlIDgyNTk1IGNoaXBzZXQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIEludGVsCisJZG9jdW1lbnRhdGlvbi4gIEkgYWxzbyBsZWFybmVkIGhvdyB0byBkZXRlY3QgdGhlIDgyNTk1IHVzaW5nCisJdGhlIHBhY2tldCBkcml2ZXIncyB0ZWNobmlxdWUuCisKKwlUaGlzIGRyaXZlciBpcyB3cml0dGVuIGJ5IGN1dHRpbmcgYW5kIHBhc3RpbmcgdGhlIHNrZWxldG9uLmMgZHJpdmVyCisJcHJvdmlkZWQgYnkgRG9uYWxkIEJlY2tlci4gIEkgYWxzbyBib3Jyb3dlZCB0aGUgRUVQUk9NIHJvdXRpbmUgZnJvbQorCURvbmFsZCBCZWNrZXIncyA4MjU4NiBkcml2ZXIuCisKKwlEYXRhc2hlZXQgZm9yIHRoZSBJbnRlbCA4MjU5NSAoaW5jbHVkaW5nIHRoZSBUWCBhbmQgRlggdmVyc2lvbikuIEl0CisJcHJvdmlkZXMganVzdCBlbm91Z2ggaW5mbyB0aGF0IHRoZSBjYXN1YWwgcmVhZGVyIG1pZ2h0IHRoaW5rIHRoYXQgaXQKKwlkb2N1bWVudHMgdGhlIGk4MjU5NS4KKworCVRoZSBVc2VyIE1hbnVhbCBmb3IgdGhlIDgyNTk1LiAgSXQgcHJvdmlkZXMgYSBsb3Qgb2YgdGhlIG1pc3NpbmcKKwlpbmZvcm1hdGlvbi4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjZGVmaW5lIERSVl9OQU1FICJlZXBybyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMTNiIgorCisjZGVmaW5lIGNvbXBhdF9kZXZfa2ZyZWVfc2tiKCBza2IsIG1vZGUgKSBkZXZfa2ZyZWVfc2tiKCAoc2tiKSApCisvKiBJIGhhZCByZXBvcnRzIG9mIGxvb29uZyBkZWxheXMgd2l0aCBTTE9XX0RPV04gZGVmaW5lZCBhcyB1ZGVsYXkoMikgKi8KKyNkZWZpbmUgU0xPV19ET1dOIGluYigweDgwKQorLyogdWRlbGF5KDIpICovCisjZGVmaW5lIGNvbXBhdF9pbml0X2RhdGEgICAgIF9faW5pdGRhdGEKK2VudW0gaWZ0eXBlIHsgQVVJPTAsIEJOQz0xLCBUUEU9MiB9OworCisvKiBGaXJzdCwgYSBmZXcgZGVmaW5pdGlvbnMgdGhhdCB0aGUgYnJhdmUgbWlnaHQgY2hhbmdlLiAqLworLyogQSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBJL08gYWRkcmVzc2VzIHRvIGJlIHByb2JlZC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZWVwcm9fcG9ydGxpc3RbXSBjb21wYXRfaW5pdF9kYXRhID0KKyAgIHsgMHgzMDAsIDB4MjEwLCAweDI0MCwgMHgyODAsIDB4MkMwLCAweDIwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMH07CisvKiBub3RlOiAweDMwMCBpcyBkZWZhdWx0LCB0aGUgNTk1Rlggc3VwcG9ydHMgQUxMIElPIFBvcnRzCisgIGZyb20gMHgwMDAgdG8gMHgzRjAsIHNvbWUgb2Ygd2hpY2ggYXJlIHJlc2VydmVkIGluIFBDcyAqLworCisvKiBUbyB0cnkgdGhlIChub3QtcmVhbGx5IFBuUCBXYWtldXA6ICovCisvKgorI2RlZmluZSBQblBXYWtldXAKKyovCisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLworI2lmbmRlZiBORVRfREVCVUcKKyNkZWZpbmUgTkVUX0RFQlVHIDAKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludCBuZXRfZGVidWcgPSBORVRfREVCVUc7CisKKy8qIFRoZSBudW1iZXIgb2YgbG93IEkvTyBwb3J0cyB1c2VkIGJ5IHRoZSBldGhlcmNhcmQuICovCisjZGVmaW5lIEVFUFJPX0lPX0VYVEVOVAkxNgorCisvKiBEaWZmZXJlbnQgODI1OTUgY2hpcHMgKi8KKyNkZWZpbmUJTEFONTk1CQkwCisjZGVmaW5lCUxBTjU5NVRYCTEKKyNkZWZpbmUJTEFONTk1RlgJMgorI2RlZmluZQlMQU41OTVGWF8xMElTQQkzCisKKy8qIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLiAqLworc3RydWN0IGVlcHJvX2xvY2FsIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl1bnNpZ25lZCByeF9zdGFydDsKKwl1bnNpZ25lZCB0eF9zdGFydDsgLyogc3RhcnQgb2YgdGhlIHRyYW5zbWl0IGNoYWluICovCisJaW50IHR4X2xhc3Q7ICAvKiBwb2ludGVyIHRvIGxhc3QgcGFja2V0IGluIHRoZSB0cmFuc21pdCBjaGFpbiAqLworCXVuc2lnbmVkIHR4X2VuZDsgICAvKiBlbmQgb2YgdGhlIHRyYW5zbWl0IGNoYWluIChwbHVzIDEpICovCisJaW50IGVlcHJvOwkvKiAxIGZvciB0aGUgRXRoZXJFeHByZXNzIFByby8xMCwKKwkJCSAgIDIgZm9yIHRoZSBFdGhlckV4cHJlc3MgUHJvLzEwKywKKwkJCSAgIDMgZm9yIHRoZSBFdGhlckV4cHJlc3MgMTAgKGJsdWUgY2FyZHMpLAorCQkJICAgMCBmb3Igb3RoZXIgODI1OTUtYmFzZWQgbGFuIGNhcmRzLiAqLworCWludCB2ZXJzaW9uOwkvKiBhIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhpcyBpcyBhIFRYIG9yIEZYCisJCQkJICAgdmVyc2lvbiBvZiB0aGUgODI1OTUgY2hpcC4gKi8KKwlpbnQgc3RlcHBpbmc7CisKKwlzcGlubG9ja190IGxvY2s7IC8qIFNlcmlhbGl6aW5nIGxvY2sgICovCisKKwl1bnNpZ25lZCByY3ZfcmFtOwkvKiBwcmUtY2FsY3VsYXRlZCBzcGFjZSBmb3IgcnggKi8KKwl1bnNpZ25lZCB4bXRfcmFtOwkvKiBwcmUtY2FsY3VsYXRlZCBzcGFjZSBmb3IgdHggKi8KKwl1bnNpZ25lZCBjaGFyIHhtdF9iYXI7CisJdW5zaWduZWQgY2hhciB4bXRfbG93ZXJfbGltaXRfcmVnOworCXVuc2lnbmVkIGNoYXIgeG10X3VwcGVyX2xpbWl0X3JlZzsKKwlzaG9ydCB4bXRfbG93ZXJfbGltaXQ7CisJc2hvcnQgeG10X3VwcGVyX2xpbWl0OworCXNob3J0IHJjdl9sb3dlcl9saW1pdDsKKwlzaG9ydCByY3ZfdXBwZXJfbGltaXQ7CisJdW5zaWduZWQgY2hhciBlZXByb21fcmVnOworCXVuc2lnbmVkIHNob3J0IHdvcmRbOF07Cit9OworCisvKiBUaGUgc3RhdGlvbiAoZXRoZXJuZXQpIGFkZHJlc3MgcHJlZml4LCB1c2VkIGZvciBJRGluZyB0aGUgYm9hcmQuICovCisjZGVmaW5lIFNBX0FERFIwIDB4MDAJLyogRXRoZXJleHByZXNzIFByby8xMCAqLworI2RlZmluZSBTQV9BRERSMSAweGFhCisjZGVmaW5lIFNBX0FERFIyIDB4MDAKKworI2RlZmluZSBHZXRCaXQoeCx5KSAoKHggJiAoMTw8eSkpPj55KQorCisvKiBFRVBST00gV29yZCAwOiAqLworI2RlZmluZSBlZV9QblAgICAgICAgMCAgLyogUGx1ZyAnbiBQbGF5IGVuYWJsZSBiaXQgKi8KKyNkZWZpbmUgZWVfV29yZDEgICAgIDEgIC8qIFdvcmQgMT8gKi8KKyNkZWZpbmUgZWVfQnVzV2lkdGggIDIgIC8qIDgvMTYgYml0ICovCisjZGVmaW5lIGVlX0ZsYXNoQWRkciAzICAvKiBGbGFzaCBBZGRyZXNzICovCisjZGVmaW5lIGVlX0ZsYXNoTWFzayAweDcgICAvKiBNYXNrICovCisjZGVmaW5lIGVlX0F1dG9JTyAgICA2ICAvKiAqLworI2RlZmluZSBlZV9yZXNlcnZlZDAgNyAgLyogPTAhICovCisjZGVmaW5lIGVlX0ZsYXNoICAgICA4ICAvKiBGbGFzaCB0aGVyZT8gKi8KKyNkZWZpbmUgZWVfQXV0b05lZyAgIDkgIC8qIEF1dG8gTmVnb3RpYXRpb24gZW5hYmxlZD8gKi8KKyNkZWZpbmUgZWVfSU8wICAgICAgIDEwIC8qIElPIEFkZHJlc3MgTFNCICovCisjZGVmaW5lIGVlX0lPME1hc2sgICAweCAvKi4uLiovCisjZGVmaW5lIGVlX0lPMSAgICAgICAxNSAvKiBJTyBNU0IgKi8KKworLyogRUVQUk9NIFdvcmQgMTogKi8KKyNkZWZpbmUgZWVfSW50U2VsICAgIDAgICAvKiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgZWVfSW50TWFzayAgIDB4NworI2RlZmluZSBlZV9MSSAgICAgICAgMyAgIC8qIExpbmsgSW50ZWdyaXR5IDA9IGVuYWJsZWQgKi8KKyNkZWZpbmUgZWVfUEMgICAgICAgIDQgICAvKiBQb2xhcml0eSBDb3JyZWN0aW9uIDA9IGVuYWJsZWQgKi8KKyNkZWZpbmUgZWVfVFBFX0FVSSAgIDUgICAvKiBQb3J0U2VsZWN0aW9uIDE9VFBFICovCisjZGVmaW5lIGVlX0phYmJlciAgICA2ICAgLyogSmFiYmVyIHByZXZlbnRpb24gMD0gZW5hYmxlZCAqLworI2RlZmluZSBlZV9BdXRvUG9ydCAgNyAgIC8qIEF1dG8gUG9ydCBTZWxlY3Rpb24gMT0gRGlzYWJsZWQgKi8KKyNkZWZpbmUgZWVfU01PVVQgICAgIDggICAvKiBTTW91dCBQaW4gQ29udHJvbCAwPSBJbnB1dCAqLworI2RlZmluZSBlZV9QUk9NICAgICAgOSAgIC8qIEZsYXNoIEVQUk9NIC8gUFJPTSAwPUZsYXNoICovCisjZGVmaW5lIGVlX3Jlc2VydmVkMSAxMCAgLyogLi4gMTIgPTAhICovCisjZGVmaW5lIGVlX0FsdFJlYWR5ICAxMyAgLyogQWx0ZXJuYXRlIFJlYWR5LCAwPW5vcm1hbCAqLworI2RlZmluZSBlZV9yZXNlcnZlZDIgMTQgIC8qID0wISAqLworI2RlZmluZSBlZV9EdXBsZXggICAgMTUKKworLyogV29yZDIsMyw0OiAqLworI2RlZmluZSBlZV9JQTUgICAgICAgMCAvKmJpdCBzdGFydCBmb3IgaW5kaXZpZHVhbCBBZGRyIEJ5dGUgNSAqLworI2RlZmluZSBlZV9JQTQgICAgICAgOCAvKmJpdCBzdGFydCBmb3IgaW5kaXZpZHVhbCBBZGRyIEJ5dGUgNSAqLworI2RlZmluZSBlZV9JQTMgICAgICAgMCAvKmJpdCBzdGFydCBmb3IgaW5kaXZpZHVhbCBBZGRyIEJ5dGUgNSAqLworI2RlZmluZSBlZV9JQTIgICAgICAgOCAvKmJpdCBzdGFydCBmb3IgaW5kaXZpZHVhbCBBZGRyIEJ5dGUgNSAqLworI2RlZmluZSBlZV9JQTEgICAgICAgMCAvKmJpdCBzdGFydCBmb3IgaW5kaXZpZHVhbCBBZGRyIEJ5dGUgNSAqLworI2RlZmluZSBlZV9JQTAgICAgICAgOCAvKmJpdCBzdGFydCBmb3IgaW5kaXZpZHVhbCBBZGRyIEJ5dGUgNSAqLworCisvKiBXb3JkIDU6ICovCisjZGVmaW5lIGVlX0JOQ19UUEUgICAwIC8qIDA9VFBFICovCisjZGVmaW5lIGVlX0Jvb3RUeXBlICAxIC8qIDAwPU5vbmUsIDAxPUlQWCwgMTA9T0RJLCAxMT1ORElTICovCisjZGVmaW5lIGVlX0Jvb3RUeXBlTWFzayAweDMKKyNkZWZpbmUgZWVfTnVtQ29ubiAgIDMgIC8qIE51bWJlciBvZiBDb25uZWN0aW9ucyAwPSBPbmUgb3IgVHdvICovCisjZGVmaW5lIGVlX0ZsYXNoU29jayA0ICAvKiBQcmVzZW5jZSBvZiBGbGFzaCBTb2NrZXQgMD0gUHJlc2VudCAqLworI2RlZmluZSBlZV9Qb3J0VFBFICAgNQorI2RlZmluZSBlZV9Qb3J0Qk5DICAgNgorI2RlZmluZSBlZV9Qb3J0QVVJICAgNworI2RlZmluZSBlZV9Qb3dlck1ndCAgMTAgLyogMD0gZGlzYWJsZWQgKi8KKyNkZWZpbmUgZWVfQ1AgICAgICAgIDEzIC8qIENvbmN1cnJlbnQgUHJvY2Vzc2luZyAqLworI2RlZmluZSBlZV9DUE1hc2sgICAgMHg3CisKKy8qIFdvcmQgNjogKi8KKyNkZWZpbmUgZWVfU3RlcHBpbmcgIDAgLyogU3RlcHBpbmcgaW5mbyAqLworI2RlZmluZSBlZV9TdGVwTWFzayAgMHgwRgorI2RlZmluZSBlZV9Cb2FyZElEICAgNCAvKiBNYW51Y2F0dXJlciBCb2FyZCBJRCwgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgZWVfQm9hcmRNYXNrIDB4MEZGRgorCisvKiBXb3JkIDc6ICovCisjZGVmaW5lIGVlX0lOVF9UT19JUlEgMCAvKiBpbnQgdG8gSVJRIE1hcHBpbmcgID0gMHgxRUI4IGZvciBQcm8vMTArICovCisjZGVmaW5lIGVlX0ZYX0lOVDJJUlEgMHgxRUI4IC8qIHRoZSBfb25seV8gbWFwcGluZyBhbGxvd2VkIGZvciBGWCBjaGlwcyAqLworCisvKi4uKi8KKyNkZWZpbmUgZWVfU0laRSAweDQwIC8qIHRvdGFsIEVFcHJvbSBTaXplICovCisjZGVmaW5lIGVlX0NoZWNrc3VtIDB4QkFCQSAvKiBpbml0aWFsIGFuZCBmaW5hbCB2YWx1ZSBmb3IgYWRkaW5nIGNoZWNrc3VtICovCisKKworLyogQ2FyZCBpZGVudGlmaWNhdGlvbiB2aWEgRUVwcm9tOiAgICovCisjZGVmaW5lIGVlX2FkZHJfdmVuZG9yIDB4MTAgIC8qIFdvcmQgb2Zmc2V0IGZvciBFSVNBIFZlbmRvciBJRCAqLworI2RlZmluZSBlZV9hZGRyX2lkIDB4MTEgICAgICAvKiBXb3JkIG9mZnNldCBmb3IgQ2FyZCBJRCAqLworI2RlZmluZSBlZV9hZGRyX1NOIDB4MTIgICAgICAvKiBTZXJpYWwgTnVtYmVyICovCisjZGVmaW5lIGVlX2FkZHJfQ1JDXzggMHgxNCAgIC8qIENSQyBvdmVyIGxhc3QgdGhlZSBCeXRlcyAqLworCisKKyNkZWZpbmUgZWVfdmVuZG9yX2ludGVsMCAweDI1ICAvKiBWZW5kb3IgSUQgSW50ZWwgKi8KKyNkZWZpbmUgZWVfdmVuZG9yX2ludGVsMSAweEQ0CisjZGVmaW5lIGVlX2lkX2VlcHJvMTBwMCAweDEwICAgLyogSUQgZm9yIGVlcHJvLzEwKyAqLworI2RlZmluZSBlZV9pZF9lZXBybzEwcDEgMHgzMQorCisjZGVmaW5lIFRYX1RJTUVPVVQgNDAKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworCitzdGF0aWMgaW50CWVlcHJvX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYXV0b3Byb2JlKTsKK3N0YXRpYyBpbnQJZWVwcm9fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJZWVwcm9fc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZWVwcm9faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgCWVlcHJvX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCWVlcHJvX3RyYW5zbWl0X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJZWVwcm9fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVlcHJvX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgICBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICAgZWVwcm9fdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgcmVhZF9lZXByb20oaW50IGlvYWRkciwgaW50IGxvY2F0aW9uLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJaGFyZHdhcmVfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYnVmLCBzaG9ydCBsZW5ndGgpOworc3RhdGljIGludAllZXByb19ncmFiX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoKKwkJCURldGFpbHMgb2YgdGhlIGk4MjU5NS4KKworWW91IHdpbGwgbmVlZCBlaXRoZXIgdGhlIGRhdGFzaGVldCBvciB0aGUgdXNlciBtYW51YWwgdG8gdW5kZXJzdGFuZCB3aGF0CitpcyBnb2luZyBvbiBoZXJlLiAgVGhlIDgyNTk1IGlzIHZlcnkgZGlmZmVyZW50IGZyb20gdGhlIDgyNTg2LCA4MjU5My4KKworVGhlIHJlY2VpdmUgYWxnb3JpdGhtIGluIGVlcHJvX3J4KCkgaXMganVzdCBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKK1JDViByaW5nIHN0cnVjdHVyZSB0aGF0IHRoZSBJbnRlbCA4MjU5NSBpbXBvc2VzIGF0IHRoZSBoYXJkd2FyZSBsZXZlbC4KK1RoZSByZWNlaXZlIGJ1ZmZlciBpcyBzZXQgYXQgMjRLLCBhbmQgdGhlIHRyYW5zbWl0IGJ1ZmZlciBpcyA4Sy4gIEkKK2FtIGFzc3VtaW5nIHRoYXQgdGhlIHRvdGFsIGJ1ZmZlciBtZW1vcnkgaXMgMzJLLCB3aGljaCBpcyB0cnVlIGZvciB0aGUKK0ludGVsIEV0aGVyRXhwcmVzcyBQcm8vMTAuICBJZiBpdCBpcyBsZXNzIHRoYW4gdGhhdCBvbiBhIGdlbmVyaWMgY2FyZCwKK3RoZSBkcml2ZXIgd2lsbCBiZSBicm9rZW4uCisKK1RoZSB0cmFuc21pdCBhbGdvcml0aG0gaW4gdGhlIGhhcmR3YXJlX3NlbmRfcGFja2V0KCkgaXMgc2ltaWxhciB0byB0aGUKK29uZSBpbiB0aGUgZWVwcm9fcngoKS4gIFRoZSB0cmFuc21pdCBidWZmZXIgaXMgYSByaW5nIGxpbmtlZCBsaXN0LgorSSBqdXN0IHF1ZXVlIHRoZSBuZXh0IGF2YWlsYWJsZSBwYWNrZXQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gIEluIG15CitzeXN0ZW0sIHRoZSA4MjU5NSBpcyBzbyBmYXN0IHRoYXQgdGhlIGxpc3Qgc2VlbXMgdG8gYWx3YXlzIGNvbnRhaW4gYQorc2luZ2xlIHBhY2tldC4gIEluIG90aGVyIHN5c3RlbXMgd2l0aCBmYXN0ZXIgY29tcHV0ZXJzIGFuZCBtb3JlIGNvbmdlc3RlZAorbmV0d29yayB0cmFmZmljcywgdGhlIHJpbmcgbGlua2VkIGxpc3Qgc2hvdWxkIGltcHJvdmUgcGVyZm9ybWFuY2UgYnkKK2FsbG93aW5nIHVwIHRvIDhLIHdvcnRoIG9mIHBhY2tldHMgdG8gYmUgcXVldWVkLgorCitUaGUgc2l6ZXMgb2YgdGhlIHJlY2VpdmUgYW5kIHRyYW5zbWl0IGJ1ZmZlcnMgY2FuIG5vdyBiZSBjaGFuZ2VkIHZpYSBsaWxvCitvciBpbnNtb2QuICBMaWxvIHVzZXMgdGhlIGFwcGVuZGVkIGxpbmUgImV0aGVyPWlvLGlycSxkZWJ1ZyxyeC1idWZmZXIsZXRoMCIKK3doZXJlIHJ4LWJ1ZmZlciBpcyBpbiBLQiB1bml0LiAgTW9kdWxlcyB1c2VzIHRoZSBwYXJhbWV0ZXIgbWVtIHdoaWNoIGlzCithbHNvIGluIEtCIHVuaXQsIGZvciBleGFtcGxlICJpbnNtb2QgaW89aW8tYWRkcmVzcyBpcnE9MCBtZW09cngtYnVmZmVyLiIKK1RoZSByZWNlaXZlIGJ1ZmZlciBoYXMgdG8gYmUgbW9yZSB0aGFuIDNLIG9yIGxlc3MgdGhhbiAyOUsuICBPdGhlcndpc2UsCitpdCBpcyByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAyNEssIGFuZCwgaGVuY2UsIDhLIGZvciB0aGUgdHJhc25taXQKK2J1ZmZlciAodHJhbnNtaXQtYnVmZmVyID0gMzJLIC0gcmVjZWl2ZS1idWZmZXIpLgorCisqLworI2RlZmluZSBSQU1fU0laRSAgICAgICAgMHg4MDAwCisKKyNkZWZpbmUgUkNWX0hFQURFUiAgICAgIDgKKyNkZWZpbmUgUkNWX0RFRkFVTFRfUkFNIDB4NjAwMAorCisjZGVmaW5lIFhNVF9IRUFERVIgICAgICA4CisjZGVmaW5lIFhNVF9ERUZBVUxUX1JBTQkoUkFNX1NJWkUgLSBSQ1ZfREVGQVVMVF9SQU0pCisKKyNkZWZpbmUgWE1UX1NUQVJUX1BSTwlSQ1ZfREVGQVVMVF9SQU0KKyNkZWZpbmUgWE1UX1NUQVJUXzEwCTB4MDAwMAorI2RlZmluZSBSQ1ZfU1RBUlRfUFJPCTB4MDAwMAorI2RlZmluZSBSQ1ZfU1RBUlRfMTAJWE1UX0RFRkFVTFRfUkFNCisKKyNkZWZpbmUJUkNWX0RPTkUJMHgwMDA4CisjZGVmaW5lCVJYX09LCQkweDIwMDAKKyNkZWZpbmUJUlhfRVJST1IJMHgwZDgxCisKKyNkZWZpbmUJVFhfRE9ORV9CSVQJMHgwMDgwCisjZGVmaW5lCVRYX09LCQkweDIwMDAKKyNkZWZpbmUJQ0hBSU5fQklUCTB4ODAwMAorI2RlZmluZQlYTVRfU1RBVFVTCTB4MDIKKyNkZWZpbmUJWE1UX0NIQUlOCTB4MDQKKyNkZWZpbmUJWE1UX0NPVU5UCTB4MDYKKworI2RlZmluZQlCQU5LMF9TRUxFQ1QJMHgwMAorI2RlZmluZQlCQU5LMV9TRUxFQ1QJMHg0MAorI2RlZmluZQlCQU5LMl9TRUxFQ1QJMHg4MAorCisvKiBCYW5rIDAgcmVnaXN0ZXJzICovCisjZGVmaW5lCUNPTU1BTkRfUkVHCTB4MDAJLyogUmVnaXN0ZXIgMCAqLworI2RlZmluZQlNQ19TRVRVUAkweDAzCisjZGVmaW5lCVhNVF9DTUQJCTB4MDQKKyNkZWZpbmUJRElBR05PU0VfQ01ECTB4MDcKKyNkZWZpbmUJUkNWX0VOQUJMRV9DTUQJMHgwOAorI2RlZmluZQlSQ1ZfRElTQUJMRV9DTUQJMHgwYQorI2RlZmluZQlTVE9QX1JDVl9DTUQJMHgwYgorI2RlZmluZQlSRVNFVF9DTUQJMHgwZQorI2RlZmluZQlQT1dFUl9ET1dOX0NNRAkweDE4CisjZGVmaW5lCVJFU1VNRV9YTVRfQ01ECTB4MWMKKyNkZWZpbmUJU0VMX1JFU0VUX0NNRAkweDFlCisjZGVmaW5lCVNUQVRVU19SRUcJMHgwMQkvKiBSZWdpc3RlciAxICovCisjZGVmaW5lCVJYX0lOVAkJMHgwMgorI2RlZmluZQlUWF9JTlQJCTB4MDQKKyNkZWZpbmUJRVhFQ19TVEFUVVMJMHgzMAorI2RlZmluZQlJRF9SRUcJCTB4MDIJLyogUmVnaXN0ZXIgMgkqLworI2RlZmluZQlSX1JPQklOX0JJVFMJMHhjMAkvKiByb3VuZCByb2JpbiBjb3VudGVyICovCisjZGVmaW5lCUlEX1JFR19NQVNLCTB4MmMKKyNkZWZpbmUJSURfUkVHX1NJRwkweDI0CisjZGVmaW5lCUFVVE9fRU5BQkxFCTB4MTAKKyNkZWZpbmUJSU5UX01BU0tfUkVHCTB4MDMJLyogUmVnaXN0ZXIgMwkqLworI2RlZmluZQlSWF9TVE9QX01BU0sJMHgwMQorI2RlZmluZQlSWF9NQVNLCQkweDAyCisjZGVmaW5lCVRYX01BU0sJCTB4MDQKKyNkZWZpbmUJRVhFQ19NQVNLCTB4MDgKKyNkZWZpbmUJQUxMX01BU0sJMHgwZgorI2RlZmluZQlJT18zMl9CSVQJMHgxMAorI2RlZmluZQlSQ1ZfQkFSCQkweDA0CS8qIFRoZSBmb2xsb3dpbmcgYXJlIHdvcmQgKDE2LWJpdCkgcmVnaXN0ZXJzICovCisjZGVmaW5lCVJDVl9TVE9QCTB4MDYKKworI2RlZmluZQlYTVRfQkFSX1BSTwkweDBhCisjZGVmaW5lCVhNVF9CQVJfMTAJMHgwYgorCisjZGVmaW5lCUhPU1RfQUREUkVTU19SRUcJMHgwYworI2RlZmluZQlJT19QT1JUCQkweDBlCisjZGVmaW5lCUlPX1BPUlRfMzJfQklUCTB4MGMKKworLyogQmFuayAxIHJlZ2lzdGVycyAqLworI2RlZmluZQlSRUcxCTB4MDEKKyNkZWZpbmUJV09SRF9XSURUSAkweDAyCisjZGVmaW5lCUlOVF9FTkFCTEUJMHg4MAorI2RlZmluZSBJTlRfTk9fUkVHCTB4MDIKKyNkZWZpbmUJUkNWX0xPV0VSX0xJTUlUX1JFRwkweDA4CisjZGVmaW5lCVJDVl9VUFBFUl9MSU1JVF9SRUcJMHgwOQorCisjZGVmaW5lCVhNVF9MT1dFUl9MSU1JVF9SRUdfUFJPIDB4MGEKKyNkZWZpbmUJWE1UX1VQUEVSX0xJTUlUX1JFR19QUk8gMHgwYgorI2RlZmluZQlYTVRfTE9XRVJfTElNSVRfUkVHXzEwICAweDBiCisjZGVmaW5lCVhNVF9VUFBFUl9MSU1JVF9SRUdfMTAgIDB4MGEKKworLyogQmFuayAyIHJlZ2lzdGVycyAqLworI2RlZmluZQlYTVRfQ2hhaW5fSW50CTB4MjAJLyogSW50ZXJydXB0IGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zbWl0IGNoYWluICovCisjZGVmaW5lCVhNVF9DaGFpbl9FcnJTdG9wCTB4NDAgLyogSW50ZXJydXB0IGF0IHRoZSBlbmQgb2YgdGhlIGNoYWluIGV2ZW4gaWYgdGhlcmUgYXJlIGVycm9ycyAqLworI2RlZmluZQlSQ1ZfRGlzY2FyZF9CYWRGcmFtZQkweDgwIC8qIFRocm93IGJhZCBmcmFtZXMgYXdheSwgYW5kIGNvbnRpbnVlIHRvIHJlY2VpdmUgb3RoZXJzICovCisjZGVmaW5lCVJFRzIJCTB4MDIKKyNkZWZpbmUJUFJNU0NfTW9kZQkweDAxCisjZGVmaW5lCU11bHRpX0lBCTB4MjAKKyNkZWZpbmUJUkVHMwkJMHgwMworI2RlZmluZQlUUEVfQklUCQkweDA0CisjZGVmaW5lCUJOQ19CSVQJCTB4MjAKKyNkZWZpbmUJUkVHMTMJCTB4MGQKKyNkZWZpbmUJRkRYCQkweDAwCisjZGVmaW5lCUFfTl9FTkFCTEUJMHgwMgorCisjZGVmaW5lCUlfQUREX1JFRzAJMHgwNAorI2RlZmluZQlJX0FERF9SRUcxCTB4MDUKKyNkZWZpbmUJSV9BRERfUkVHMgkweDA2CisjZGVmaW5lCUlfQUREX1JFRzMJMHgwNworI2RlZmluZQlJX0FERF9SRUc0CTB4MDgKKyNkZWZpbmUJSV9BRERfUkVHNQkweDA5CisKKyNkZWZpbmUJRUVQUk9NX1JFR19QUk8gMHgwYQorI2RlZmluZQlFRVBST01fUkVHXzEwICAweDBiCisKKyNkZWZpbmUgRUVTSyAweDAxCisjZGVmaW5lIEVFQ1MgMHgwMgorI2RlZmluZSBFRURJIDB4MDQKKyNkZWZpbmUgRUVETyAweDA4CisKKy8qIGRvIGEgZnVsbCByZXNldCAqLworI2RlZmluZSBlZXByb19yZXNldChpb2FkZHIpIG91dGIoUkVTRVRfQ01ELCBpb2FkZHIpCisKKy8qIGRvIGEgbmljZSByZXNldCAqLworI2RlZmluZSBlZXByb19zZWxfcmVzZXQoaW9hZGRyKSAJeyBcCisJCQkJCW91dGIoU0VMX1JFU0VUX0NNRCwgaW9hZGRyKTsgXAorCQkJCQlTTE9XX0RPV047IFwKKwkJCQkJU0xPV19ET1dOOyBcCisJCQkJCX0KKworLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworI2RlZmluZSBlZXByb19kaXNfaW50KGlvYWRkcikgb3V0YihBTExfTUFTSywgaW9hZGRyICsgSU5UX01BU0tfUkVHKQorCisvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworI2RlZmluZSBlZXByb19jbGVhcl9pbnQoaW9hZGRyKSBvdXRiKEFMTF9NQVNLLCBpb2FkZHIgKyBTVEFUVVNfUkVHKQorCisvKiBlbmFibGUgdHgvcnggKi8KKyNkZWZpbmUgZWVwcm9fZW5faW50KGlvYWRkcikgb3V0YihBTExfTUFTSyAmIH4oUlhfTUFTSyB8IFRYX01BU0spLCBcCisJCQkJCQkJaW9hZGRyICsgSU5UX01BU0tfUkVHKQorCisvKiBlbmFibGUgZXhlYyBldmVudCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgZWVwcm9fZW5faW50ZXhlYyhpb2FkZHIpIG91dGIoQUxMX01BU0sgJiB+KEVYRUNfTUFTSyksIGlvYWRkciArIElOVF9NQVNLX1JFRykKKworLyogZW5hYmxlIHJ4ICovCisjZGVmaW5lIGVlcHJvX2VuX3J4KGlvYWRkcikgb3V0YihSQ1ZfRU5BQkxFX0NNRCwgaW9hZGRyKQorCisvKiBkaXNhYmxlIHJ4ICovCisjZGVmaW5lIGVlcHJvX2Rpc19yeChpb2FkZHIpIG91dGIoUkNWX0RJU0FCTEVfQ01ELCBpb2FkZHIpCisKKy8qIHN3aXRjaCBiYW5rICovCisjZGVmaW5lIGVlcHJvX3N3MmJhbmswKGlvYWRkcikgb3V0YihCQU5LMF9TRUxFQ1QsIGlvYWRkcikKKyNkZWZpbmUgZWVwcm9fc3cyYmFuazEoaW9hZGRyKSBvdXRiKEJBTksxX1NFTEVDVCwgaW9hZGRyKQorI2RlZmluZSBlZXByb19zdzJiYW5rMihpb2FkZHIpIG91dGIoQkFOSzJfU0VMRUNULCBpb2FkZHIpCisKKy8qIGVuYWJsZSBpbnRlcnJ1cHQgbGluZSAqLworI2RlZmluZSBlZXByb19lbl9pbnRsaW5lKGlvYWRkcikgb3V0YihpbmIoaW9hZGRyICsgUkVHMSkgfCBJTlRfRU5BQkxFLFwKKwkJCQlpb2FkZHIgKyBSRUcxKQorCisvKiBkaXNhYmxlIGludGVycnVwdCBsaW5lICovCisjZGVmaW5lIGVlcHJvX2Rpc19pbnRsaW5lKGlvYWRkcikgb3V0YihpbmIoaW9hZGRyICsgUkVHMSkgJiAweDdmLCBcCisJCQkJaW9hZGRyICsgUkVHMSk7CisKKy8qIHNldCBkaWFnbm9zZSBmbGFnICovCisjZGVmaW5lIGVlcHJvX2RpYWcoaW9hZGRyKSBvdXRiKERJQUdOT1NFX0NNRCwgaW9hZGRyKQorCisvKiBhY2sgZm9yIHJ4IGludCAqLworI2RlZmluZSBlZXByb19hY2tfcngoaW9hZGRyKSBvdXRiIChSWF9JTlQsIGlvYWRkciArIFNUQVRVU19SRUcpCisKKy8qIGFjayBmb3IgdHggaW50ICovCisjZGVmaW5lIGVlcHJvX2Fja190eChpb2FkZHIpIG91dGIgKFRYX0lOVCwgaW9hZGRyICsgU1RBVFVTX1JFRykKKworLyogYSBjb21wbGV0ZSBzZWwgcmVzZXQgKi8KKyNkZWZpbmUgZWVwcm9fY29tcGxldGVfc2VscmVzZXQoaW9hZGRyKSB7IFwKKwkJCQkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKztcCisJCQkJCQllZXByb19zZWxfcmVzZXQoaW9hZGRyKTtcCisJCQkJCQlscC0+dHhfZW5kID0gXAorCQkJCQkJCWxwLT54bXRfbG93ZXJfbGltaXQ7XAorCQkJCQkJbHAtPnR4X3N0YXJ0ID0gbHAtPnR4X2VuZDtcCisJCQkJCQlscC0+dHhfbGFzdCA9IDA7XAorCQkJCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7XAorCQkJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpO1wKKwkJCQkJCWVlcHJvX2VuX3J4KGlvYWRkcik7XAorCQkJCQl9CisKKy8qIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUsIGFuZCByZXR1cm4gJzAnIGlmIG9uZSBleGlzdHMuCisgICBJZiBkZXYtPmJhc2VfYWRkciA9PSAwLCBwcm9iZSBhbGwgbGlrZWx5IGxvY2F0aW9ucy4KKyAgIElmIGRldi0+YmFzZV9hZGRyID09IDEsIGFsd2F5cyByZXR1cm4gZmFpbHVyZS4KKyAgIElmIGRldi0+YmFzZV9hZGRyID09IDIsIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZGV2aWNlIGFuZCByZXR1cm4gc3VjY2VzcworICAgKGRldGFjaGFibGUgZGV2aWNlcyBvbmx5KS4KKyAgICovCitzdGF0aWMgaW50IF9faW5pdCBkb19lZXByb19wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCWludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaXJxID0gZGV2LT5pcnE7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKyNpZmRlZiBQblBXYWtldXAKKwkvKiBYWFhYIGZvciBtdWx0aXBsZSBjYXJkcyBzaG91bGQgdGhpcyBvbmx5IGJlIHJ1biBvbmNlPyAqLworCisJLyogV2FrZXVwOiAqLworCSNkZWZpbmUgV2FrZXVwUG9ydCAweDI3OQorCSNkZWZpbmUgV2FrZXVwU2VxICAgIHsweDZBLCAweEI1LCAweERBLCAweEVELCAweEY2LCAweEZCLCAweDdELCAweEJFLFwKKwkgICAgICAgICAgICAgICAgICAgICAgMHhERiwgMHg2RiwgMHgzNywgMHgxQiwgMHgwRCwgMHg4NiwgMHhDMywgMHg2MSxcCisJICAgICAgICAgICAgICAgICAgICAgIDB4QjAsIDB4NTgsIDB4MkMsIDB4MTYsIDB4OEIsIDB4NDUsIDB4QTIsIDB4RDEsXAorCSAgICAgICAgICAgICAgICAgICAgICAweEU4LCAweDc0LCAweDNBLCAweDlELCAweENFLCAweEU3LCAweDczLCAweDQzfQorCisJeworCQl1bnNpZ25lZCBzaG9ydCBpbnQgV1NbMzJdPVdha2V1cFNlcTsKKworCQlpZiAoY2hlY2tfcmVnaW9uKFdha2V1cFBvcnQsIDIpPT0wKSB7CisKKwkJCWlmIChuZXRfZGVidWc+NSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiV2FraW5nIFVQXG4iKTsKKworCQkJb3V0Yl9wKDAsV2FrZXVwUG9ydCk7CisJCQlvdXRiX3AoMCxXYWtldXBQb3J0KTsKKwkJCWZvciAoaT0wOyBpPDMyOyBpKyspIHsKKwkJCQlvdXRiX3AoV1NbaV0sV2FrZXVwUG9ydCk7CisJCQkJaWYgKG5ldF9kZWJ1Zz41KSBwcmludGsoS0VSTl9ERUJVRyAiOiAlI3ggIixXU1tpXSk7CisJCQl9CisJCX0gZWxzZSBwcmludGsoS0VSTl9XQVJOSU5HICJDaGVja3JlZ2lvbiBGYWlsZWQhXG4iKTsKKwl9CisjZW5kaWYKKworCWlmIChiYXNlX2FkZHIgPiAweDFmZikJCS8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJcmV0dXJuIGVlcHJvX3Byb2JlMShkZXYsIDApOworCisJZWxzZSBpZiAoYmFzZV9hZGRyICE9IDApCS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJcmV0dXJuIC1FTlhJTzsKKworCWZvciAoaSA9IDA7IGVlcHJvX3BvcnRsaXN0W2ldOyBpKyspIHsKKwkJZGV2LT5iYXNlX2FkZHIgPSBlZXByb19wb3J0bGlzdFtpXTsKKwkJZGV2LT5pcnEgPSBpcnE7CisJCWlmIChlZXByb19wcm9iZTEoZGV2LCAxKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKyNpZm5kZWYgTU9EVUxFCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBlZXByb19wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBlZXByb19sb2NhbCkpOworCWludCBlcnI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCWVyciA9IGRvX2VlcHJvX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFRVBST19JT19FWFRFTlQpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2luaXQgcHJpbnRFRVBST01JbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVlcHJvX2xvY2FsICpscCA9IChzdHJ1Y3QgZWVwcm9fbG9jYWwgKilkZXYtPnByaXY7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIHNob3J0IFdvcmQ7CisJaW50IGksajsKKworCWogPSBlZV9DaGVja3N1bTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlqICs9IGxwLT53b3JkW2ldOworCWZvciAoIDsgaSA8IGVlX1NJWkU7IGkrKykKKwkJaiArPSByZWFkX2VlcHJvbShpb2FkZHIsIGksIGRldik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiQ2hlY2tzdW06ICUjeFxuIixqJjB4ZmZmZik7CisKKwlXb3JkID0gbHAtPndvcmRbMF07CisJcHJpbnRrKEtFUk5fREVCVUcgIldvcmQwOlxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBQbHVnICduIFByYXk6ICVkXG4iLEdldEJpdChXb3JkLGVlX1BuUCkpOworCXByaW50ayhLRVJOX0RFQlVHICIgQnVzd2lkdGg6ICVkXG4iLChHZXRCaXQoV29yZCxlZV9CdXNXaWR0aCkrMSkqOCApOworCXByaW50ayhLRVJOX0RFQlVHICIgQXV0b05lZ290aWF0aW9uOiAlZFxuIixHZXRCaXQoV29yZCxlZV9BdXRvTmVnKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBJTyBBZGRyZXNzOiAlI3hcbiIsIChXb3JkPj5lZV9JTzApPDw0KTsKKworCWlmIChuZXRfZGVidWc+NCkgIHsKKwkJV29yZCA9IGxwLT53b3JkWzFdOworCQlwcmludGsoS0VSTl9ERUJVRyAiV29yZDE6XG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBJTlQ6ICVkXG4iLCBXb3JkICYgZWVfSW50TWFzayk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgTEk6ICVkXG4iLCBHZXRCaXQoV29yZCxlZV9MSSkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiIFBDOiAlZFxuIiwgR2V0Qml0KFdvcmQsZWVfUEMpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBUUEUvQVVJOiAlZFxuIiwgR2V0Qml0KFdvcmQsZWVfVFBFX0FVSSkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiIEphYmJlcjogJWRcbiIsIEdldEJpdChXb3JkLGVlX0phYmJlcikpOworCQlwcmludGsoS0VSTl9ERUJVRyAiIEF1dG9Qb3J0OiAlZFxuIiwgR2V0Qml0KCFXb3JkLGVlX0phYmJlcikpOworCQlwcmludGsoS0VSTl9ERUJVRyAiIER1cGxleDogJWRcbiIsIEdldEJpdChXb3JkLGVlX0R1cGxleCkpOworCX0KKworCVdvcmQgPSBscC0+d29yZFs1XTsKKwlwcmludGsoS0VSTl9ERUJVRyAiV29yZDU6XG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIEJOQzogJWRcbiIsR2V0Qml0KFdvcmQsZWVfQk5DX1RQRSkpOworCXByaW50ayhLRVJOX0RFQlVHICIgTnVtQ29ubmVjdG9yczogJWRcbiIsR2V0Qml0KFdvcmQsZWVfTnVtQ29ubikpOworCXByaW50ayhLRVJOX0RFQlVHICIgSGFzICIpOworCWlmIChHZXRCaXQoV29yZCxlZV9Qb3J0VFBFKSkgcHJpbnRrKEtFUk5fREVCVUcgIlRQRSAiKTsKKwlpZiAoR2V0Qml0KFdvcmQsZWVfUG9ydEJOQykpIHByaW50ayhLRVJOX0RFQlVHICJCTkMgIik7CisJaWYgKEdldEJpdChXb3JkLGVlX1BvcnRBVUkpKSBwcmludGsoS0VSTl9ERUJVRyAiQVVJICIpOworCXByaW50ayhLRVJOX0RFQlVHICJwb3J0KHMpIFxuIik7CisKKwlXb3JkID0gbHAtPndvcmRbNl07CisJcHJpbnRrKEtFUk5fREVCVUcgIldvcmQ2OlxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBTdGVwcGluZzogJWRcbiIsV29yZCAmIGVlX1N0ZXBNYXNrKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIEJvYXJkSUQ6ICVkXG4iLFdvcmQ+PmVlX0JvYXJkSUQpOworCisJV29yZCA9IGxwLT53b3JkWzddOworCXByaW50ayhLRVJOX0RFQlVHICJXb3JkNzpcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICIgSU5UIHRvIElSUTpcbiIpOworCisJZm9yIChpPTAsIGo9MDsgaTwxNTsgaSsrKQorCQlpZiAoR2V0Qml0KFdvcmQsaSkpIHByaW50ayhLRVJOX0RFQlVHICIgSU5UJWQgLT4gSVJRICVkOyIsaisrLGkpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7Cit9CisKKy8qIGZ1bmN0aW9uIHRvIHJlY2FsY3VsYXRlIHRoZSBsaW1pdHMgb2YgYnVmZmVyIGJhc2VkIG9uIHJjdl9yYW0gKi8KK3N0YXRpYyB2b2lkIGVlcHJvX3JlY2FsYyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWVwcm9fbG9jYWwgKglscDsKKworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlscC0+eG10X3JhbSA9IFJBTV9TSVpFIC0gbHAtPnJjdl9yYW07CisKKwlpZiAobHAtPmVlcHJvID09IExBTjU5NUZYXzEwSVNBKSB7CisJCWxwLT54bXRfbG93ZXJfbGltaXQgPSBYTVRfU1RBUlRfMTA7CisJCWxwLT54bXRfdXBwZXJfbGltaXQgPSAobHAtPnhtdF9yYW0gLSAyKTsKKwkJbHAtPnJjdl9sb3dlcl9saW1pdCA9IGxwLT54bXRfcmFtOworCQlscC0+cmN2X3VwcGVyX2xpbWl0ID0gKFJBTV9TSVpFIC0gMik7CisJfQorCWVsc2UgeworCQlscC0+cmN2X2xvd2VyX2xpbWl0ID0gUkNWX1NUQVJUX1BSTzsKKwkJbHAtPnJjdl91cHBlcl9saW1pdCA9IChscC0+cmN2X3JhbSAtIDIpOworCQlscC0+eG10X2xvd2VyX2xpbWl0ID0gbHAtPnJjdl9yYW07CisJCWxwLT54bXRfdXBwZXJfbGltaXQgPSAoUkFNX1NJWkUgLSAyKTsKKwl9Cit9CisKKy8qIHByaW50cyBib290LXRpbWUgaW5mbyAqLworc3RhdGljIHZvaWQgX19pbml0IGVlcHJvX3ByaW50X2luZm8gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVlcHJvX2xvY2FsICoJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludAkJCWk7CisJY29uc3QgY2hhciAqCQlpZm1hcFtdID0geyJBVUkiLCAiMTBCYXNlMiIsICIxMEJhc2VUIn07CisKKwlpID0gaW5iKGRldi0+YmFzZV9hZGRyICsgSURfUkVHKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIGlkOiAlI3ggIixpKTsKKwlwcmludGsoIiBpbzogJSN4ICIsICh1bnNpZ25lZClkZXYtPmJhc2VfYWRkcik7CisKKwlzd2l0Y2ggKGxwLT5lZXBybykgeworCQljYXNlIExBTjU5NUZYXzEwSVNBOgorCQkJcHJpbnRrKCIlczogSW50ZWwgRXRoZXJFeHByZXNzIDEwIElTQVxuIGF0ICUjeCwiLAorCQkJCQlkZXYtPm5hbWUsICh1bnNpZ25lZClkZXYtPmJhc2VfYWRkcik7CisJCQlicmVhazsKKwkJY2FzZSBMQU41OTVGWDoKKwkJCXByaW50aygiJXM6IEludGVsIEV0aGVyRXhwcmVzcyBQcm8vMTArIElTQVxuIGF0ICUjeCwiLCAKKwkJCQkJZGV2LT5uYW1lLCAodW5zaWduZWQpZGV2LT5iYXNlX2FkZHIpOworCQkJYnJlYWs7CisJCWNhc2UgTEFONTk1VFg6CisJCQlwcmludGsoIiVzOiBJbnRlbCBFdGhlckV4cHJlc3MgUHJvLzEwIElTQSBhdCAlI3gsIiwKKwkJCQkJZGV2LT5uYW1lLCAodW5zaWduZWQpZGV2LT5iYXNlX2FkZHIpOworCQkJYnJlYWs7CisJCWNhc2UgTEFONTk1OgorCQkJcHJpbnRrKCIlczogSW50ZWwgODI1OTUtYmFzZWQgbGFuIGNhcmQgYXQgJSN4LCIsIAorCQkJCQlkZXYtPm5hbWUsICh1bnNpZ25lZClkZXYtPmJhc2VfYWRkcik7CisJfQorCisJZm9yIChpPTA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJWMlMDJ4IiwgaSA/ICc6JyA6ICcgJywgZGV2LT5kZXZfYWRkcltpXSk7CisKKwlpZiAobmV0X2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiwgJWRLIFJDViBidWZmZXIiLAorCQkJCShpbnQpKGxwLT5yY3ZfcmFtKS8xMDI0KTsKKworCWlmIChkZXYtPmlycSA+IDIpCisJCXByaW50aygiLCBJUlEgJWQsICVzLlxuIiwgZGV2LT5pcnEsIGlmbWFwW2Rldi0+aWZfcG9ydF0pOworCWVsc2UgCisJCXByaW50aygiLCAlcy5cbiIsIGlmbWFwW2Rldi0+aWZfcG9ydF0pOworCisJaWYgKG5ldF9kZWJ1ZyA+IDMpIHsKKwkJaSA9IGxwLT53b3JkWzVdOworCQlpZiAoaSAmIDB4MjAwMCkgLyogYml0IDEzIG9mIEVFUFJPTSB3b3JkIDUgKi8KKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ29uY3VycmVudCBQcm9jZXNzaW5nIGlzICIKKwkJCQkiZW5hYmxlZCBidXQgbm90IHVzZWQhXG4iLCBkZXYtPm5hbWUpOworCX0KKworCS8qIENoZWNrIHRoZSBzdGF0aW9uIGFkZHJlc3MgZm9yIHRoZSBtYW51ZmFjdHVyZXIncyBjb2RlICovCisJaWYgKG5ldF9kZWJ1Zz4zKQorCQlwcmludEVFUFJPTUluZm8oZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBlZXByb19ldGh0b29sX29wczsKKworLyogVGhpcyBpcyB0aGUgcmVhbCBwcm9iZSByb3V0aW5lLiAgTGludXggaGFzIGEgaGlzdG9yeSBvZiBmcmllbmRseSBkZXZpY2UKKyAgIHByb2JlcyBvbiB0aGUgSVNBIGJ1cy4gIEEgZ29vZCBkZXZpY2UgcHJvYmUgYXZvaWRzIGRvaW5nIHdyaXRlcywgYW5kCisgICB2ZXJpZmllcyB0aGF0IHRoZSBjb3JyZWN0IGRldmljZSBleGlzdHMgYW5kIGZ1bmN0aW9ucy4gICovCisKK3N0YXRpYyBpbnQgX19pbml0IGVlcHJvX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYXV0b3Byb2JlKQoreworCXVuc2lnbmVkIHNob3J0IHN0YXRpb25fYWRkclszXSwgaWQsIGNvdW50ZXI7CisJaW50IGk7CisJc3RydWN0IGVlcHJvX2xvY2FsICpscDsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBHcmFiIHRoZSByZWdpb24gc28gd2UgY2FuIGZpbmQgYW5vdGhlciBib2FyZCBpZiBhdXRvSVJRIGZhaWxzLiAqLworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBFRVBST19JT19FWFRFTlQsIERSVl9OQU1FKSkgeyAKKwkJaWYgKCFhdXRvcHJvYmUpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRVBSTzogaW8tcG9ydCAweCUwNHggaW4gdXNlIFxuIiwKKwkJCQlpb2FkZHIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIE5vdywgd2UgYXJlIGdvaW5nIHRvIGNoZWNrIGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoZQorCSAgIElEX1JFRyAocmVnaXN0ZXIgMiBvZiBiYW5rIDApICovCisKKwlpZCA9IGluYihpb2FkZHIgKyBJRF9SRUcpOworCisJaWYgKChpZCAmIElEX1JFR19NQVNLKSAhPSBJRF9SRUdfU0lHKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBXZSBzZWVtIHRvIGhhdmUgdGhlIDgyNTk1IHNpZ25hdHVyZSwgbGV0J3MKKwkgICBwbGF5IHdpdGggaXRzIGNvdW50ZXIgKGxhc3QgMiBiaXRzIG9mCisJICAgcmVnaXN0ZXIgMiBvZiBiYW5rIDApIHRvIGJlIHN1cmUuICovCisKKwljb3VudGVyID0gaWQgJiBSX1JPQklOX0JJVFM7CisKKwlpZiAoKGluYihpb2FkZHIgKyBJRF9SRUcpICYgUl9ST0JJTl9CSVRTKSAhPSAoY291bnRlciArIDB4NDApKQorCQlnb3RvIGV4aXQ7CisKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJbWVtc2V0KGxwLCAwLCBzaXplb2Yoc3RydWN0IGVlcHJvX2xvY2FsKSk7CisJbHAtPnhtdF9iYXIgPSBYTVRfQkFSX1BSTzsKKwlscC0+eG10X2xvd2VyX2xpbWl0X3JlZyA9IFhNVF9MT1dFUl9MSU1JVF9SRUdfUFJPOworCWxwLT54bXRfdXBwZXJfbGltaXRfcmVnID0gWE1UX1VQUEVSX0xJTUlUX1JFR19QUk87CisJbHAtPmVlcHJvbV9yZWcgPSBFRVBST01fUkVHX1BSTzsKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisJLyogTm93LCBnZXQgdGhlIGV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MgZnJvbQorCSAgIHRoZSBFRVBST00gKi8KKwlzdGF0aW9uX2FkZHJbMF0gPSByZWFkX2VlcHJvbShpb2FkZHIsIDIsIGRldik7CisKKwkvKiBGSVhNRSAtIGZpbmQgYW5vdGhlciB3YXkgdG8ga25vdyB0aGF0IHdlJ3ZlIGZvdW5kCisJICogYW4gRXRoZXJleHByZXNzIDEwCisJICovCisJaWYgKHN0YXRpb25fYWRkclswXSA9PSAweDAwMDAgfHwgc3RhdGlvbl9hZGRyWzBdID09IDB4ZmZmZikgeworCQlscC0+ZWVwcm8gPSBMQU41OTVGWF8xMElTQTsKKwkJbHAtPmVlcHJvbV9yZWcgPSBFRVBST01fUkVHXzEwOworCQlscC0+eG10X2xvd2VyX2xpbWl0X3JlZyA9IFhNVF9MT1dFUl9MSU1JVF9SRUdfMTA7CisJCWxwLT54bXRfdXBwZXJfbGltaXRfcmVnID0gWE1UX1VQUEVSX0xJTUlUX1JFR18xMDsKKwkJbHAtPnhtdF9iYXIgPSBYTVRfQkFSXzEwOworCQlzdGF0aW9uX2FkZHJbMF0gPSByZWFkX2VlcHJvbShpb2FkZHIsIDIsIGRldik7CisJfQorCisJLyogZ2V0IGFsbCB3b3JkcyBhdCBvbmNlLiB3aWxsIGJlIHVzZWQgaGVyZSBhbmQgZm9yIGV0aHRvb2wgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWxwLT53b3JkW2ldID0gcmVhZF9lZXByb20oaW9hZGRyLCBpLCBkZXYpOworCX0KKwlzdGF0aW9uX2FkZHJbMV0gPSBscC0+d29yZFszXTsKKwlzdGF0aW9uX2FkZHJbMl0gPSBscC0+d29yZFs0XTsKKworCWlmICghbHAtPmVlcHJvKSB7CisJCWlmIChscC0+d29yZFs3XSA9PSBlZV9GWF9JTlQySVJRKQorCQkJbHAtPmVlcHJvID0gMjsKKwkJZWxzZSBpZiAoc3RhdGlvbl9hZGRyWzJdID09IFNBX0FERFIxKQorCQkJbHAtPmVlcHJvID0gMTsKKwl9CisKKwkvKiBGaWxsIGluIHRoZSAnZGV2JyBmaWVsZHMuICovCisJZm9yIChpPTA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSAoKHVuc2lnbmVkIGNoYXIgKikgc3RhdGlvbl9hZGRyKVs1LWldOworCisJLyogUlggYnVmZmVyIG11c3QgYmUgbW9yZSB0aGFuIDNLIGFuZCBsZXNzIHRoYW4gMjlLICovCisJaWYgKGRldi0+bWVtX2VuZCA8IDMwNzIgfHwgZGV2LT5tZW1fZW5kID4gMjk2OTYpCisJCWxwLT5yY3ZfcmFtID0gUkNWX0RFRkFVTFRfUkFNOworCisJLyogY2FsY3VsYXRlIHt4bXQscmN2fV97bG93ZXIsdXBwZXJ9X2xpbWl0ICovCisJZWVwcm9fcmVjYWxjKGRldik7CisKKwlpZiAoR2V0Qml0KGxwLT53b3JkWzVdLCBlZV9CTkNfVFBFKSkKKwkJZGV2LT5pZl9wb3J0ID0gQk5DOworCWVsc2UKKwkJZGV2LT5pZl9wb3J0ID0gVFBFOworCisgCWlmIChkZXYtPmlycSA8IDIgJiYgbHAtPmVlcHJvICE9IDApIHsKKyAJCS8qIE1hc2sgb2ZmIElOVCBudW1iZXIgKi8KKyAJCWludCBjb3VudCA9IGxwLT53b3JkWzFdICYgNzsKKyAJCXVuc2lnbmVkIGlycU1hc2sgPSBscC0+d29yZFs3XTsKKyAKKyAJCXdoaWxlIChjb3VudC0tKQorIAkJCWlycU1hc2sgJj0gaXJxTWFzayAtIDE7CisgCisgCQljb3VudCA9IGZmcyhpcnFNYXNrKTsKKyAKKyAJCWlmIChjb3VudCkKKyAJCQlkZXYtPmlycSA9IGNvdW50IC0gMTsKKyAKKyAJCWlmIChkZXYtPmlycSA8IDIpIHsKKyAJCQlwcmludGsoS0VSTl9FUlIgIiBEdWghIGlsbGVnYWwgaW50ZXJydXB0IHZlY3RvciBzdG9yZWQgaW4gRUVQUk9NLlxuIik7CisgCQkJZ290byBleGl0OworIAkJfSBlbHNlIGlmIChkZXYtPmlycSA9PSAyKSB7CisgCQkJZGV2LT5pcnEgPSA5OworIAkJfQorIAl9CisgCisgCWRldi0+b3BlbiAgICAgICAgICAgICAgID0gZWVwcm9fb3BlbjsKKyAJZGV2LT5zdG9wICAgICAgICAgICAgICAgPSBlZXByb19jbG9zZTsKKyAJZGV2LT5oYXJkX3N0YXJ0X3htaXQgICAgPSBlZXByb19zZW5kX3BhY2tldDsKKyAJZGV2LT5nZXRfc3RhdHMgICAgICAgICAgPSBlZXByb19nZXRfc3RhdHM7CisgCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKyAJZGV2LT50eF90aW1lb3V0CQk9IGVlcHJvX3R4X3RpbWVvdXQ7CisgCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOworCWRldi0+ZXRodG9vbF9vcHMJPSAmZWVwcm9fZXRodG9vbF9vcHM7CisgCisJLyogcHJpbnQgYm9vdCB0aW1lIGluZm8gKi8KKwllZXByb19wcmludF9pbmZvKGRldik7CisKKwkvKiByZXNldCA4MjU5NSAqLworCWVlcHJvX3Jlc2V0KGlvYWRkcik7CisJcmV0dXJuIDA7CitleGl0OgorIAlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRUVQUk9fSU9fRVhURU5UKTsKKyAJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuICBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICAgc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorCisgICBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgICByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICAgdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAgICovCisKK3N0YXRpYyBjaGFyIGlycXJtYXBbXSA9IHstMSwtMSwwLDEsLTEsMiwtMSwtMSwtMSwwLDMsNCwtMSwtMSwtMSwtMX07CitzdGF0aWMgY2hhciBpcnFybWFwMltdID0gey0xLC0xLDQsMCwxLDIsLTEsMywtMSw0LDUsNiw3LC0xLC0xLC0xfTsKK3N0YXRpYyBpbnQJZWVwcm9fZ3JhYl9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaXJxbGlzdFtdID0geyAzLCA0LCA1LCA3LCA5LCAxMCwgMTEsIDEyLCAwIH07CisJaW50ICppcnFwID0gaXJxbGlzdCwgdGVtcF9yZWcsIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJZWVwcm9fc3cyYmFuazEoaW9hZGRyKTsgLyogYmUgQ0FSRUZVTCwgQkFOSyAxIG5vdyAqLworCisJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHQgbGluZS4gKi8KKwllZXByb19lbl9pbnRsaW5lKGlvYWRkcik7CisKKwkvKiBiZSBDQVJFRlVMLCBCQU5LIDAgbm93ICovCisJZWVwcm9fc3cyYmFuazAoaW9hZGRyKTsKKworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisJZWVwcm9fY2xlYXJfaW50KGlvYWRkcik7CisKKwkvKiBMZXQgRVhFQyBldmVudCB0byBpbnRlcnJ1cHQgKi8KKwllZXByb19lbl9pbnRleGVjKGlvYWRkcik7CisKKwlkbyB7CisJCWVlcHJvX3N3MmJhbmsxKGlvYWRkcik7IC8qIGJlIENBUkVGVUwsIEJBTksgMSBub3cgKi8KKworCQl0ZW1wX3JlZyA9IGluYihpb2FkZHIgKyBJTlRfTk9fUkVHKTsKKwkJb3V0YigodGVtcF9yZWcgJiAweGY4KSB8IGlycXJtYXBbKmlycXBdLCBpb2FkZHIgKyBJTlRfTk9fUkVHKTsKKworCQllZXByb19zdzJiYW5rMChpb2FkZHIpOyAvKiBTd2l0Y2ggYmFjayB0byBCYW5rIDAgKi8KKworCQlpZiAocmVxdWVzdF9pcnEgKCppcnFwLCBOVUxMLCBTQV9TSElSUSwgImJvZ3VzIiwgZGV2KSAhPSBFQlVTWSkgeworCQkJdW5zaWduZWQgbG9uZyBpcnFfbWFzazsKKwkJCS8qIFR3aW5rbGUgdGhlIGludGVycnVwdCwgYW5kIGNoZWNrIGlmIGl0J3Mgc2VlbiAqLworCQkJaXJxX21hc2sgPSBwcm9iZV9pcnFfb24oKTsKKworCQkJZWVwcm9fZGlhZyhpb2FkZHIpOyAvKiBSRVNFVCB0aGUgODI1OTUgKi8KKwkJCW1kZWxheSgyMCk7CisKKwkJCWlmICgqaXJxcCA9PSBwcm9iZV9pcnFfb2ZmKGlycV9tYXNrKSkgIC8qIEl0J3MgYSBnb29kIElSUSBsaW5lICovCisJCQkJYnJlYWs7CisKKwkJCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisJCQllZXByb19jbGVhcl9pbnQoaW9hZGRyKTsKKwkJfQorCX0gd2hpbGUgKCorK2lycXApOworCisJZWVwcm9fc3cyYmFuazEoaW9hZGRyKTsgLyogU3dpdGNoIGJhY2sgdG8gQmFuayAxICovCisKKwkvKiBEaXNhYmxlIHRoZSBwaHlzaWNhbCBpbnRlcnJ1cHQgbGluZS4gKi8KKwllZXByb19kaXNfaW50bGluZShpb2FkZHIpOworCisJZWVwcm9fc3cyYmFuazAoaW9hZGRyKTsgLyogU3dpdGNoIGJhY2sgdG8gQmFuayAwICovCisKKwkvKiBNYXNrIGFsbCB0aGUgaW50ZXJydXB0cy4gKi8KKwllZXByb19kaXNfaW50KGlvYWRkcik7CisKKwkvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworCWVlcHJvX2NsZWFyX2ludChpb2FkZHIpOworCisJcmV0dXJuIGRldi0+aXJxOworfQorCitzdGF0aWMgaW50IGVlcHJvX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wX3JlZywgb2xkOCwgb2xkOTsKKwlpbnQgaXJxTWFzazsKKwlpbnQgaSwgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVlcHJvX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobmV0X2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbnRlcmluZyBlZXByb19vcGVuIHJvdXRpbmUuXG4iLCBkZXYtPm5hbWUpOworCisJaXJxTWFzayA9IGxwLT53b3JkWzddOworCisJaWYgKGxwLT5lZXBybyA9PSBMQU41OTVGWF8xMElTQSkgeworCQlpZiAobmV0X2RlYnVnID4gMykgcHJpbnRrKEtFUk5fREVCVUcgInAtPmVlcHJvID0gMztcbiIpOworCX0KKwllbHNlIGlmIChpcnFNYXNrID09IGVlX0ZYX0lOVDJJUlEpIC8qIElOVCB0byBJUlEgTWFzayAqLworCQl7CisJCQlscC0+ZWVwcm8gPSAyOyAvKiBZZXMsIGFuIEludGVsIEV0aGVyRXhwcmVzcyBQcm8vMTArICovCisJCQlpZiAobmV0X2RlYnVnID4gMykgcHJpbnRrKEtFUk5fREVCVUcgInAtPmVlcHJvID0gMjtcbiIpOworCQl9CisKKwllbHNlIGlmICgoZGV2LT5kZXZfYWRkclswXSA9PSBTQV9BRERSMCAmJgorCQkJZGV2LT5kZXZfYWRkclsxXSA9PSBTQV9BRERSMSAmJgorCQkJZGV2LT5kZXZfYWRkclsyXSA9PSBTQV9BRERSMikpCisJCXsKKwkJCWxwLT5lZXBybyA9IDE7CisJCQlpZiAobmV0X2RlYnVnID4gMykgcHJpbnRrKEtFUk5fREVCVUcgInAtPmVlcHJvID0gMTtcbiIpOworCQl9ICAvKiBZZXMsIGFuIEludGVsIEV0aGVyRXhwcmVzcyBQcm8vMTAgKi8KKworCWVsc2UgbHAtPmVlcHJvID0gMDsgLyogTm8sIGl0IGlzIGEgZ2VuZXJpYyA4MjU4NSBsYW4gY2FyZCAqLworCisJLyogR2V0IHRoZSBpbnRlcnJ1cHQgdmVjdG9yIGZvciB0aGUgODI1OTUgKi8KKwlpZiAoZGV2LT5pcnEgPCAyICYmIGVlcHJvX2dyYWJfaXJxKGRldikgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZC5cbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEgLCAmZWVwcm9faW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBJUlEgJWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisjaWZkZWYgaXJxMmRldl9tYXAKKwlpZiAgKCgoaXJxMmRldl9tYXBbZGV2LT5pcnFdICE9IDApCisJCXx8IChpcnEyZGV2X21hcFtkZXYtPmlycV0gPSBkZXYpID09IDApICYmCisJCShpcnEyZGV2X21hcFtkZXYtPmlycV0hPWRldikpIHsKKwkJLyogcHJpbnRrKCIlczogSVJRIG1hcCB3cm9uZ1xuIiwgZGV2LT5uYW1lKTsgKi8KKwkgICAgICAgIGZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisjZW5kaWYKKworCS8qIEluaXRpYWxpemUgdGhlIDgyNTk1LiAqLworCisJZWVwcm9fc3cyYmFuazIoaW9hZGRyKTsgLyogYmUgQ0FSRUZVTCwgQkFOSyAyIG5vdyAqLworCXRlbXBfcmVnID0gaW5iKGlvYWRkciArIGxwLT5lZXByb21fcmVnKTsKKworCWxwLT5zdGVwcGluZyA9IHRlbXBfcmVnID4+IDU7CS8qIEdldCB0aGUgc3RlcHBpbmcgbnVtYmVyIG9mIHRoZSA1OTUgKi8KKworCWlmIChuZXRfZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiVGhlIHN0ZXBwaW5nIG9mIHRoZSA4MjU5NSBpcyAlZFxuIiwgbHAtPnN0ZXBwaW5nKTsKKworCWlmICh0ZW1wX3JlZyAmIDB4MTApIC8qIENoZWNrIHRoZSBUdXJuT2ZmIEVuYWJsZSBiaXQgKi8KKwkJb3V0Yih0ZW1wX3JlZyAmIDB4ZWYsIGlvYWRkciArIGxwLT5lZXByb21fcmVnKTsKKwlmb3IgKGk9MDsgaSA8IDY7IGkrKykKKwkJb3V0YihkZXYtPmRldl9hZGRyW2ldICwgaW9hZGRyICsgSV9BRERfUkVHMCArIGkpOworCisJdGVtcF9yZWcgPSBpbmIoaW9hZGRyICsgUkVHMSk7ICAgIC8qIFNldHVwIFRyYW5zbWl0IENoYWluaW5nICovCisJb3V0Yih0ZW1wX3JlZyB8IFhNVF9DaGFpbl9JbnQgfCBYTVRfQ2hhaW5fRXJyU3RvcCAvKiBhbmQgZGlzY2FyZCBiYWQgUkNWIGZyYW1lcyAqLworCQl8IFJDVl9EaXNjYXJkX0JhZEZyYW1lLCBpb2FkZHIgKyBSRUcxKTsKKworCXRlbXBfcmVnID0gaW5iKGlvYWRkciArIFJFRzIpOyAvKiBNYXRjaCBicm9hZGNhc3QgKi8KKwlvdXRiKHRlbXBfcmVnIHwgMHgxNCwgaW9hZGRyICsgUkVHMik7CisKKwl0ZW1wX3JlZyA9IGluYihpb2FkZHIgKyBSRUczKTsKKwlvdXRiKHRlbXBfcmVnICYgMHgzZiwgaW9hZGRyICsgUkVHMyk7IC8qIGNsZWFyIHRlc3QgbW9kZSAqLworCisJLyogU2V0IHRoZSByZWNlaXZpbmcgbW9kZSAqLworCWVlcHJvX3N3MmJhbmsxKGlvYWRkcik7IC8qIGJlIENBUkVGVUwsIEJBTksgMSBub3cgKi8KKworCS8qIFNldCB0aGUgaW50ZXJydXB0IHZlY3RvciAqLworCXRlbXBfcmVnID0gaW5iKGlvYWRkciArIElOVF9OT19SRUcpOworCWlmIChscC0+ZWVwcm8gPT0gTEFONTk1RlggfHwgbHAtPmVlcHJvID09IExBTjU5NUZYXzEwSVNBKQorCQlvdXRiKCh0ZW1wX3JlZyAmIDB4ZjgpIHwgaXJxcm1hcDJbZGV2LT5pcnFdLCBpb2FkZHIgKyBJTlRfTk9fUkVHKTsKKwllbHNlIG91dGIoKHRlbXBfcmVnICYgMHhmOCkgfCBpcnFybWFwW2Rldi0+aXJxXSwgaW9hZGRyICsgSU5UX05PX1JFRyk7CisKKworCXRlbXBfcmVnID0gaW5iKGlvYWRkciArIElOVF9OT19SRUcpOworCWlmIChscC0+ZWVwcm8gPT0gTEFONTk1RlggfHwgbHAtPmVlcHJvID09IExBTjU5NUZYXzEwSVNBKQorCQlvdXRiKCh0ZW1wX3JlZyAmIDB4ZjApIHwgaXJxcm1hcDJbZGV2LT5pcnFdIHwgMHgwOCxpb2FkZHIrSU5UX05PX1JFRyk7CisJZWxzZSBvdXRiKCh0ZW1wX3JlZyAmIDB4ZjgpIHwgaXJxcm1hcFtkZXYtPmlycV0sIGlvYWRkciArIElOVF9OT19SRUcpOworCisJaWYgKG5ldF9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICJlZXByb19vcGVuOiBjb250ZW50IG9mIElOVCBSZWcgaXMgJXhcbiIsIHRlbXBfcmVnKTsKKworCisJLyogSW5pdGlhbGl6ZSB0aGUgUkNWIGFuZCBYTVQgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cyAqLworCW91dGIobHAtPnJjdl9sb3dlcl9saW1pdCA+PiA4LCBpb2FkZHIgKyBSQ1ZfTE9XRVJfTElNSVRfUkVHKTsgCisJb3V0YihscC0+cmN2X3VwcGVyX2xpbWl0ID4+IDgsIGlvYWRkciArIFJDVl9VUFBFUl9MSU1JVF9SRUcpOyAKKwlvdXRiKGxwLT54bXRfbG93ZXJfbGltaXQgPj4gOCwgaW9hZGRyICsgbHAtPnhtdF9sb3dlcl9saW1pdF9yZWcpOworCW91dGIobHAtPnhtdF91cHBlcl9saW1pdCA+PiA4LCBpb2FkZHIgKyBscC0+eG10X3VwcGVyX2xpbWl0X3JlZyk7CisKKwkvKiBFbmFibGUgdGhlIGludGVycnVwdCBsaW5lLiAqLworCWVlcHJvX2VuX2ludGxpbmUoaW9hZGRyKTsKKworCS8qIFN3aXRjaCBiYWNrIHRvIEJhbmsgMCAqLworCWVlcHJvX3N3MmJhbmswKGlvYWRkcik7CisKKwkvKiBMZXQgUlggYW5kIFRYIGV2ZW50cyB0byBpbnRlcnJ1cHQgKi8KKwllZXByb19lbl9pbnQoaW9hZGRyKTsKKworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisJZWVwcm9fY2xlYXJfaW50KGlvYWRkcik7CisKKwkvKiBJbml0aWFsaXplIFJDViAqLworCW91dHcobHAtPnJjdl9sb3dlcl9saW1pdCwgaW9hZGRyICsgUkNWX0JBUik7IAorCWxwLT5yeF9zdGFydCA9IGxwLT5yY3ZfbG93ZXJfbGltaXQ7CisJb3V0dyhscC0+cmN2X3VwcGVyX2xpbWl0IHwgMHhmZSwgaW9hZGRyICsgUkNWX1NUT1ApOyAKKworCS8qIEluaXRpYWxpemUgWE1UICovCisJb3V0dyhscC0+eG10X2xvd2VyX2xpbWl0LCBpb2FkZHIgKyBscC0+eG10X2Jhcik7IAorCWxwLT50eF9zdGFydCA9IGxwLT50eF9lbmQgPSBscC0+eG10X2xvd2VyX2xpbWl0OworCWxwLT50eF9sYXN0ID0gMDsKKworCS8qIENoZWNrIGZvciB0aGUgaTgyNTk1VFggYW5kIGk4MjU5NUZYICovCisJb2xkOCA9IGluYihpb2FkZHIgKyA4KTsKKwlvdXRiKH5vbGQ4LCBpb2FkZHIgKyA4KTsKKworCWlmICgodGVtcF9yZWcgPSBpbmIoaW9hZGRyICsgOCkpID09IG9sZDgpIHsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDMpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiaTgyNTk1IGRldGVjdGVkIVxuIik7CisJCWxwLT52ZXJzaW9uID0gTEFONTk1OworCX0KKwllbHNlIHsKKwkJbHAtPnZlcnNpb24gPSBMQU41OTVUWDsKKwkJb3V0YihvbGQ4LCBpb2FkZHIgKyA4KTsKKwkJb2xkOSA9IGluYihpb2FkZHIgKyA5KTsKKworCQlpZiAoaXJxTWFzaz09ZWVfRlhfSU5UMklSUSkgeworCQkJaWYgKG5ldF9kZWJ1ZyA+IDMpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiSXJxTWFzazogJSN4XG4iLGlycU1hc2spOworCQkJCXByaW50ayhLRVJOX0RFQlVHICJpODI1OTVGWCBkZXRlY3RlZCFcbiIpOworCQkJfQorCQkJbHAtPnZlcnNpb24gPSBMQU41OTVGWDsKKwkJCW91dGIob2xkOSwgaW9hZGRyICsgOSk7CisJCQlpZiAoZGV2LT5pZl9wb3J0ICE9IFRQRSkgewkvKiBIb3BlZnVsbHksIHRoaXMgd2lsbCBmaXggdGhlCisJCQkJCQkJcHJvYmxlbSBvZiB1c2luZyBQZW50aXVtcyBhbmQKKwkJCQkJCQlwcm8vMTAgdy8gQk5DLiAqLworCQkJCWVlcHJvX3N3MmJhbmsyKGlvYWRkcik7IC8qIGJlIENBUkVGVUwsIEJBTksgMiBub3cgKi8KKwkJCQl0ZW1wX3JlZyA9IGluYihpb2FkZHIgKyBSRUcxMyk7CisJCQkJLyogZGlzYWJsZSB0aGUgZnVsbCBkdXBsZXggbW9kZSBzaW5jZSBpdCBpcyBub3QKKwkJCQlhcHBsaWNhYmxlIHdpdGggdGhlIDEwQmFzZTIgY2FibGUuICovCisJCQkJb3V0Yih0ZW1wX3JlZyAmIH4oRkRYIHwgQV9OX0VOQUJMRSksIFJFRzEzKTsKKwkJCQllZXByb19zdzJiYW5rMChpb2FkZHIpOyAvKiBiZSBDQVJFRlVMLCBCQU5LIDAgbm93ICovCisJCQl9CisJCX0KKwkJZWxzZSBpZiAobmV0X2RlYnVnID4gMykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInRlbXBfcmVnOiAlI3ggIH5vbGQ5OiAlI3hcbiIsdGVtcF9yZWcsKCh+b2xkOSkmMHhmZikpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImk4MjU5NVRYIGRldGVjdGVkIVxuIik7CisJCX0KKwl9CisKKwllZXByb19zZWxfcmVzZXQoaW9hZGRyKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlpZiAobmV0X2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGVlcHJvX29wZW4gcm91dGluZS5cbiIsIGRldi0+bmFtZSk7CisKKwkvKiBlbmFibGluZyByeCAqLworCWVlcHJvX2VuX3J4KGlvYWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZWVwcm9fdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWVwcm9fbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBpZiAobmV0X2RlYnVnID4gMSkgKi8KKwlwcmludGsgKEtFUk5fRVJSICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCAlcz9cbiIsIGRldi0+bmFtZSwKKwkJIm5ldHdvcmsgY2FibGUgcHJvYmxlbSIpOworCS8qIFRoaXMgaXMgbm90IGEgZHVwbGljYXRlLiBPbmUgbWVzc2FnZSBmb3IgdGhlIGNvbnNvbGUsCisJICAgb25lIGZvciB0aGUgdGhlIGxvZyBmaWxlICAqLworCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/XG4iLCBkZXYtPm5hbWUsCisJCSJuZXR3b3JrIGNhYmxlIHByb2JsZW0iKTsKKwllZXByb19jb21wbGV0ZV9zZWxyZXNldChpb2FkZHIpOworfQorCisKK3N0YXRpYyBpbnQgZWVwcm9fc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWVwcm9fbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzaG9ydCBsZW5ndGggPSBza2ItPmxlbjsKKworCWlmIChuZXRfZGVidWcgPiA1KQorCQlwcmludGsoS0VSTl9ERUJVRyAgIiVzOiBlbnRlcmluZyBlZXByb19zZW5kX3BhY2tldCByb3V0aW5lLlxuIiwgZGV2LT5uYW1lKTsKKworCWlmIChsZW5ndGggPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQlsZW5ndGggPSBFVEhfWkxFTjsKKwl9CisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCWVlcHJvX2Rpc19pbnQoaW9hZGRyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXsKKwkJdW5zaWduZWQgY2hhciAqYnVmID0gc2tiLT5kYXRhOworCisJCWlmIChoYXJkd2FyZV9zZW5kX3BhY2tldChkZXYsIGJ1ZiwgbGVuZ3RoKSkKKwkJCS8qIHdlIHdvbid0IHdha2UgcXVldWUgaGVyZSBiZWNhdXNlIHdlJ3JlIG91dCBvZiBzcGFjZSAqLworCQkJbHAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJZWxzZSB7CisJCWxwLT5zdGF0cy50eF9ieXRlcys9c2tiLT5sZW47CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQl9CisKKwl9CisKKwlkZXZfa2ZyZWVfc2tiIChza2IpOworCisJLyogWW91IG1pZ2h0IG5lZWQgdG8gY2xlYW4gdXAgYW5kIHJlY29yZCBUeCBzdGF0aXN0aWNzIGhlcmUuICovCisJLyogbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7ICovCisKKwlpZiAobmV0X2RlYnVnID4gNSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGVlcHJvX3NlbmRfcGFja2V0IHJvdXRpbmUuXG4iLCBkZXYtPm5hbWUpOworCisJZWVwcm9fZW5faW50KGlvYWRkcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisKKy8qCVRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisJSGFuZGxlIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpbnRlcnJ1cHRzLiAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK2VlcHJvX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gIChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwkgICAgICAgICAgICAgICAgICAgICAgLyogKHN0cnVjdCBuZXRfZGV2aWNlICopKGlycTJkZXZfbWFwW2lycV0pOyovCisJc3RydWN0IGVlcHJvX2xvY2FsICpscDsKKwlpbnQgaW9hZGRyLCBzdGF0dXMsIGJvZ3VzY291bnQgPSAyMDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwcmludGsgKEtFUk5fRVJSICJlZXByb19pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cXG4iLCBpcnEpOworICAgICAgICAgICAgICAgIHJldHVybiBJUlFfTk9ORTsKKyAgICAgICAgfQorCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHNwaW5fbG9jaygmbHAtPmxvY2spOworCisJaWYgKG5ldF9kZWJ1ZyA+IDUpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZW50ZXJpbmcgZWVwcm9faW50ZXJydXB0IHJvdXRpbmUuXG4iLCBkZXYtPm5hbWUpOworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwl3aGlsZSAoKChzdGF0dXMgPSBpbmIoaW9hZGRyICsgU1RBVFVTX1JFRykpICYgKFJYX0lOVHxUWF9JTlQpKSAmJiAoYm9ndXNjb3VudC0tKSkKKwl7CisJCWhhbmRsZWQgPSAxOworCQlpZiAoc3RhdHVzICYgUlhfSU5UKSB7CisJCQlpZiAobmV0X2RlYnVnID4gNCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHBhY2tldCByZWNlaXZlZCBpbnRlcnJ1cHQuXG4iLCBkZXYtPm5hbWUpOworCisJCQllZXByb19kaXNfaW50KGlvYWRkcik7CisKKwkJCS8qIEdldCB0aGUgcmVjZWl2ZWQgcGFja2V0cyAqLworCQkJZWVwcm9fYWNrX3J4KGlvYWRkcik7CisJCQllZXByb19yeChkZXYpOworCisJCQllZXByb19lbl9pbnQoaW9hZGRyKTsKKwkJfQorCQlpZiAoc3RhdHVzICYgVFhfSU5UKSB7CisJCQlpZiAobmV0X2RlYnVnID4gNCkKKyAJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwYWNrZXQgdHJhbnNtaXQgaW50ZXJydXB0LlxuIiwgZGV2LT5uYW1lKTsKKworCisJCQllZXByb19kaXNfaW50KGlvYWRkcik7CisKKwkJCS8qIFByb2Nlc3MgdGhlIHN0YXR1cyBvZiB0cmFuc21pdHRlZCBwYWNrZXRzICovCisJCQllZXByb19hY2tfdHgoaW9hZGRyKTsKKwkJCWVlcHJvX3RyYW5zbWl0X2ludGVycnVwdChkZXYpOworCisJCQllZXByb19lbl9pbnQoaW9hZGRyKTsKKwkJfQorCX0KKworCWlmIChuZXRfZGVidWcgPiA1KQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgZWVwcm9faW50ZXJydXB0IHJvdXRpbmUuXG4iLCBkZXYtPm5hbWUpOworCisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIGludCBlZXByb19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlZXByb19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzaG9ydCB0ZW1wX3JlZzsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWVlcHJvX3N3MmJhbmsxKGlvYWRkcik7IC8qIFN3aXRjaCBiYWNrIHRvIEJhbmsgMSAqLworCisJLyogRGlzYWJsZSB0aGUgcGh5c2ljYWwgaW50ZXJydXB0IGxpbmUuICovCisJdGVtcF9yZWcgPSBpbmIoaW9hZGRyICsgUkVHMSk7CisJb3V0Yih0ZW1wX3JlZyAmIDB4N2YsIGlvYWRkciArIFJFRzEpOworCisJZWVwcm9fc3cyYmFuazAoaW9hZGRyKTsgLyogU3dpdGNoIGJhY2sgdG8gQmFuayAwICovCisKKwkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnguICovCisJb3V0YihTVE9QX1JDVl9DTUQsIGlvYWRkcik7CisJbHAtPnR4X3N0YXJ0ID0gbHAtPnR4X2VuZCA9IGxwLT54bXRfbG93ZXJfbGltaXQ7CisJbHAtPnR4X2xhc3QgPSAwOworCisJLyogTWFzayBhbGwgdGhlIGludGVycnVwdHMuICovCisJZWVwcm9fZGlzX2ludChpb2FkZHIpOworCisJLyogY2xlYXIgYWxsIGludGVycnVwdHMgKi8KKwllZXByb19jbGVhcl9pbnQoaW9hZGRyKTsKKworCS8qIFJlc2V0IHRoZSA4MjU5NSAqLworCWVlcHJvX3Jlc2V0KGlvYWRkcik7CisKKwkvKiByZWxlYXNlIHRoZSBpbnRlcnJ1cHQgKi8KKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworI2lmZGVmIGlycTJkZXZfbWFwCisJaXJxMmRldl9tYXBbZGV2LT5pcnFdID0gMDsKKyNlbmRpZgorCisJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGhlcmUuIFdoYXQgc3RhdGlzdGljcz8gKi8KKworCXJldHVybiAwOworfQorCisvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4JVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvcgorICAgY2xvc2VkLiAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK2VlcHJvX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlZXByb19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICovCitzdGF0aWMgdm9pZAorc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVlcHJvX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgbW9kZTsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaT1kZXYtPm1jX2xpc3Q7CisKKwlpZiAoZGV2LT5mbGFncyYoSUZGX0FMTE1VTFRJfElGRl9QUk9NSVNDKSB8fCBkZXYtPm1jX2NvdW50ID4gNjMpCisJeworCQkvKgorCQkgKglXZSBtdXN0IG1ha2UgdGhlIGtlcm5lbCByZWFsaXNlIHdlIGhhZCB0byBtb3ZlCisJCSAqCWludG8gcHJvbWlzYyBtb2RlIG9yIHdlIHN0YXJ0IGFsbCBvdXQgd2FyIG9uCisJCSAqCXRoZSBjYWJsZS4gSWYgaXQgd2FzIGEgcHJvbWlzYyByZXF1ZXN0IHRoZQorCQkgKglmbGFnIGlzIGFscmVhZHkgc2V0LiBJZiBub3Qgd2UgYXNzZXJ0IGl0LgorCQkgKi8KKwkJZGV2LT5mbGFnc3w9SUZGX1BST01JU0M7CisKKwkJZWVwcm9fc3cyYmFuazIoaW9hZGRyKTsgLyogYmUgQ0FSRUZVTCwgQkFOSyAyIG5vdyAqLworCQltb2RlID0gaW5iKGlvYWRkciArIFJFRzIpOworCQlvdXRiKG1vZGUgfCBQUk1TQ19Nb2RlLCBpb2FkZHIgKyBSRUcyKTsKKwkJbW9kZSA9IGluYihpb2FkZHIgKyBSRUczKTsKKwkJb3V0Yihtb2RlLCBpb2FkZHIgKyBSRUczKTsgLyogd3JpdGluZyByZWcuIDMgdG8gY29tcGxldGUgdGhlIHVwZGF0ZSAqLworCQllZXByb19zdzJiYW5rMChpb2FkZHIpOyAvKiBSZXR1cm4gdG8gQkFOSyAwIG5vdyAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogcHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwl9CisKKwllbHNlIGlmIChkZXYtPm1jX2NvdW50PT0wICkKKwl7CisJCWVlcHJvX3N3MmJhbmsyKGlvYWRkcik7IC8qIGJlIENBUkVGVUwsIEJBTksgMiBub3cgKi8KKwkJbW9kZSA9IGluYihpb2FkZHIgKyBSRUcyKTsKKwkJb3V0Yihtb2RlICYgMHhkNiwgaW9hZGRyICsgUkVHMik7IC8qIFR1cm4gb2ZmIE11bHRpLUlBIGFuZCBQUk1TQ19Nb2RlIGJpdHMgKi8KKwkJbW9kZSA9IGluYihpb2FkZHIgKyBSRUczKTsKKwkJb3V0Yihtb2RlLCBpb2FkZHIgKyBSRUczKTsgLyogd3JpdGluZyByZWcuIDMgdG8gY29tcGxldGUgdGhlIHVwZGF0ZSAqLworCQllZXByb19zdzJiYW5rMChpb2FkZHIpOyAvKiBSZXR1cm4gdG8gQkFOSyAwIG5vdyAqLworCX0KKworCWVsc2UKKwl7CisJCXVuc2lnbmVkIHNob3J0IHN0YXR1cywgKmVhZGRyczsKKwkJaW50IGksIGJvZ3VzY291bnQgPSAwOworCisJCS8qIERpc2FibGUgUlggYW5kIFRYIGludGVycnVwdHMuICBOZWNlc3NhcnkgdG8gYXZvaWQKKwkJICAgY29ycnVwdGlvbiBvZiB0aGUgSE9TVF9BRERSRVNTX1JFRyBieSBpbnRlcnJ1cHQKKwkJICAgc2VydmljZSByb3V0aW5lcy4gKi8KKwkJZWVwcm9fZGlzX2ludChpb2FkZHIpOworCisJCWVlcHJvX3N3MmJhbmsyKGlvYWRkcik7IC8qIGJlIENBUkVGVUwsIEJBTksgMiBub3cgKi8KKwkJbW9kZSA9IGluYihpb2FkZHIgKyBSRUcyKTsKKwkJb3V0Yihtb2RlIHwgTXVsdGlfSUEsIGlvYWRkciArIFJFRzIpOworCQltb2RlID0gaW5iKGlvYWRkciArIFJFRzMpOworCQlvdXRiKG1vZGUsIGlvYWRkciArIFJFRzMpOyAvKiB3cml0aW5nIHJlZy4gMyB0byBjb21wbGV0ZSB0aGUgdXBkYXRlICovCisJCWVlcHJvX3N3MmJhbmswKGlvYWRkcik7IC8qIFJldHVybiB0byBCQU5LIDAgbm93ICovCisJCW91dHcobHAtPnR4X2VuZCwgaW9hZGRyICsgSE9TVF9BRERSRVNTX1JFRyk7CisJCW91dHcoTUNfU0VUVVAsIGlvYWRkciArIElPX1BPUlQpOworCQlvdXR3KDAsIGlvYWRkciArIElPX1BPUlQpOworCQlvdXR3KDAsIGlvYWRkciArIElPX1BPUlQpOworCQlvdXR3KDYqKGRldi0+bWNfY291bnQgKyAxKSwgaW9hZGRyICsgSU9fUE9SVCk7CisKKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykKKwkJeworCQkJZWFkZHJzPSh1bnNpZ25lZCBzaG9ydCAqKWRtaS0+ZG1pX2FkZHI7CisJCQlkbWk9ZG1pLT5uZXh0OworCQkJb3V0dygqZWFkZHJzKyssIGlvYWRkciArIElPX1BPUlQpOworCQkJb3V0dygqZWFkZHJzKyssIGlvYWRkciArIElPX1BPUlQpOworCQkJb3V0dygqZWFkZHJzKyssIGlvYWRkciArIElPX1BPUlQpOworCQl9CisKKwkJZWFkZHJzID0gKHVuc2lnbmVkIHNob3J0ICopIGRldi0+ZGV2X2FkZHI7CisJCW91dHcoZWFkZHJzWzBdLCBpb2FkZHIgKyBJT19QT1JUKTsKKwkJb3V0dyhlYWRkcnNbMV0sIGlvYWRkciArIElPX1BPUlQpOworCQlvdXR3KGVhZGRyc1syXSwgaW9hZGRyICsgSU9fUE9SVCk7CisJCW91dHcobHAtPnR4X2VuZCwgaW9hZGRyICsgbHAtPnhtdF9iYXIpOworCQlvdXRiKE1DX1NFVFVQLCBpb2FkZHIpOworCisJCS8qIFVwZGF0ZSB0aGUgdHJhbnNtaXQgcXVldWUgKi8KKwkJaSA9IGxwLT50eF9lbmQgKyBYTVRfSEVBREVSICsgNiooZGV2LT5tY19jb3VudCArIDEpOworCisJCWlmIChscC0+dHhfc3RhcnQgIT0gbHAtPnR4X2VuZCkKKwkJeworCQkJLyogdXBkYXRlIHRoZSBuZXh0IGFkZHJlc3MgYW5kIHRoZSBjaGFpbiBiaXQgaW4gdGhlCisJCQkgICBsYXN0IHBhY2tldCAqLworCQkJb3V0dyhscC0+dHhfbGFzdCArIFhNVF9DSEFJTiwgaW9hZGRyICsgSE9TVF9BRERSRVNTX1JFRyk7CisJCQlvdXR3KGksIGlvYWRkciArIElPX1BPUlQpOworCQkJb3V0dyhscC0+dHhfbGFzdCArIFhNVF9DT1VOVCwgaW9hZGRyICsgSE9TVF9BRERSRVNTX1JFRyk7CisJCQlzdGF0dXMgPSBpbncoaW9hZGRyICsgSU9fUE9SVCk7CisJCQlvdXR3KHN0YXR1cyB8IENIQUlOX0JJVCwgaW9hZGRyICsgSU9fUE9SVCk7CisJCQlscC0+dHhfZW5kID0gaSA7CisJCX0KKwkJZWxzZSB7CisJCQlscC0+dHhfc3RhcnQgPSBscC0+dHhfZW5kID0gaSA7CisJCX0KKworCQkvKiBBY2tub3dsZWRnZSB0aGF0IHRoZSBNQyBzZXR1cCBpcyBkb25lICovCisJCWRvIHsgLyogV2Ugc2hvdWxkIGJlIGRvaW5nIHRoaXMgaW4gdGhlIGVlcHJvX2ludGVycnVwdCgpISAqLworCQkJU0xPV19ET1dOOworCQkJU0xPV19ET1dOOworCQkJaWYgKGluYihpb2FkZHIgKyBTVEFUVVNfUkVHKSAmIDB4MDgpCisJCQl7CisJCQkJaSA9IGluYihpb2FkZHIpOworCQkJCW91dGIoMHgwOCwgaW9hZGRyICsgU1RBVFVTX1JFRyk7CisKKwkJCQlpZiAoaSAmIDB4MjApIHsgLyogY29tbWFuZCBBQk9SVGVkICovCisJCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IG11bHRpY2FzdCBzZXR1cCBmYWlsZWQuXG4iLCAKKwkJCQkJCWRldi0+bmFtZSk7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSBpZiAoKGkgJiAweDBmKSA9PSAweDAzKQl7IC8qIE1DLURvbmUgKi8KKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzZXQgUnggbW9kZSB0byAlZCBhZGRyZXNzJXMuXG4iLAorCQkJCQkJZGV2LT5uYW1lLCBkZXYtPm1jX2NvdW50LAorCQkJCQkJZGV2LT5tY19jb3VudCA+IDEgPyAiZXMiOiIiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlICgrK2JvZ3VzY291bnQgPCAxMDApOworCisJCS8qIFJlLWVuYWJsZSBSWCBhbmQgVFggaW50ZXJydXB0cyAqLworCQllZXByb19lbl9pbnQoaW9hZGRyKTsKKwl9CisJaWYgKGxwLT5lZXBybyA9PSBMQU41OTVGWF8xMElTQSkgeworCQllZXByb19jb21wbGV0ZV9zZWxyZXNldChpb2FkZHIpOworCX0KKwllbHNlCisJCWVlcHJvX2VuX3J4KGlvYWRkcik7Cit9CisKKy8qIFRoZSBob3JyaWJsZSByb3V0aW5lIHRvIHJlYWQgYSB3b3JkIGZyb20gdGhlIHNlcmlhbCBFRVBST00uICovCisvKiBJTVBPUlRBTlQgLSB0aGUgODI1OTUgd2lsbCBiZSBzZXQgdG8gQmFuayAwIGFmdGVyIHRoZSBlZXByb20gaXMgcmVhZCAqLworCisvKiBUaGUgZGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuICovCisjZGVmaW5lIGVlcHJvbV9kZWxheSgpIHsgdWRlbGF5KDQwKTsgfQorI2RlZmluZSBFRV9SRUFEX0NNRCAoNiA8PCA2KQorCitpbnQKK3JlYWRfZWVwcm9tKGludCBpb2FkZHIsIGludCBsb2NhdGlvbiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCByZXR2YWwgPSAwOworCXN0cnVjdCBlZXByb19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNob3J0IGVlX2FkZHIgPSBpb2FkZHIgKyBscC0+ZWVwcm9tX3JlZzsKKwlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IEVFX1JFQURfQ01EOworCXNob3J0IGN0cmxfdmFsID0gRUVDUyA7CisKKwkvKiBYWFhYIC0gYmxhY2sgbWFnaWMgKi8KKwkJZWVwcm9fc3cyYmFuazEoaW9hZGRyKTsKKwkJb3V0YigweDAwLCBpb2FkZHIgKyBTVEFUVVNfUkVHKTsKKwkvKiBYWFhYIC0gYmxhY2sgbWFnaWMgKi8KKworCWVlcHJvX3N3MmJhbmsyKGlvYWRkcik7CisJb3V0YihjdHJsX3ZhbCwgZWVfYWRkcik7CisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDg7IGkgPj0gMDsgaS0tKSB7CisJCXNob3J0IG91dHZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IGN0cmxfdmFsIHwgRUVESQorCQkJOiBjdHJsX3ZhbDsKKwkJb3V0YihvdXR2YWwsIGVlX2FkZHIpOworCQlvdXRiKG91dHZhbCB8IEVFU0ssIGVlX2FkZHIpOwkvKiBFRVBST00gY2xvY2sgdGljay4gKi8KKwkJZWVwcm9tX2RlbGF5KCk7CisJCW91dGIob3V0dmFsLCBlZV9hZGRyKTsJLyogRmluaXNoIEVFUFJPTSBhIGNsb2NrIHRpY2suICovCisJCWVlcHJvbV9kZWxheSgpOworCX0KKwlvdXRiKGN0cmxfdmFsLCBlZV9hZGRyKTsKKworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCW91dGIoY3RybF92YWwgfCBFRVNLLCBlZV9hZGRyKTsJIGVlcHJvbV9kZWxheSgpOworCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbmIoZWVfYWRkcikgJiBFRURPKSA/IDEgOiAwKTsKKwkJb3V0YihjdHJsX3ZhbCwgZWVfYWRkcik7ICBlZXByb21fZGVsYXkoKTsKKwl9CisKKwkvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisJY3RybF92YWwgJj0gfkVFQ1M7CisJb3V0YihjdHJsX3ZhbCB8IEVFU0ssIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSgpOworCW91dGIoY3RybF92YWwsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSgpOworCWVlcHJvX3N3MmJhbmswKGlvYWRkcik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAoraGFyZHdhcmVfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYnVmLCBzaG9ydCBsZW5ndGgpCit7CisJc3RydWN0IGVlcHJvX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgc3RhdHVzLCB0eF9hdmFpbGFibGUsIGxhc3QsIGVuZDsKKworCWlmIChuZXRfZGVidWcgPiA1KQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIGhhcmR3YXJlX3NlbmRfcGFja2V0IHJvdXRpbmUuXG4iLCBkZXYtPm5hbWUpOworCisJCS8qIGRldGVybWluZSBob3cgbXVjaCBvZiB0aGUgdHJhbnNtaXQgYnVmZmVyIHNwYWNlIGlzIGF2YWlsYWJsZSAqLworCQlpZiAobHAtPnR4X2VuZCA+IGxwLT50eF9zdGFydCkKKwkJdHhfYXZhaWxhYmxlID0gbHAtPnhtdF9yYW0gLSAobHAtPnR4X2VuZCAtIGxwLT50eF9zdGFydCk7CisJCWVsc2UgaWYgKGxwLT50eF9lbmQgPCBscC0+dHhfc3RhcnQpCisJCQl0eF9hdmFpbGFibGUgPSBscC0+dHhfc3RhcnQgLSBscC0+dHhfZW5kOworCWVsc2UgdHhfYXZhaWxhYmxlID0gbHAtPnhtdF9yYW07CisKKwlpZiAoKCgoKGxlbmd0aCArIDMpID4+IDEpIDw8IDEpICsgMipYTVRfSEVBREVSKSA+PSB0eF9hdmFpbGFibGUpIHsKKwkJLyogTm8gc3BhY2UgYXZhaWxhYmxlID8/PyAqLworCQlyZXR1cm4gMTsKKwkJfQorCisJCWxhc3QgPSBscC0+dHhfZW5kOworCQllbmQgPSBsYXN0ICsgKCgobGVuZ3RoICsgMykgPj4gMSkgPDwgMSkgKyBYTVRfSEVBREVSOworCisJaWYgKGVuZCA+PSBscC0+eG10X3VwcGVyX2xpbWl0ICsgMikgeyAvKiB0aGUgdHJhbnNtaXQgYnVmZmVyIGlzIHdyYXBwZWQgYXJvdW5kICovCisJCWlmICgobHAtPnhtdF91cHBlcl9saW1pdCArIDIgLSBsYXN0KSA8PSBYTVRfSEVBREVSKSB7CQorCQkJCS8qIEFycnJyISEhLCBtdXN0IGtlZXAgdGhlIHhtdCBoZWFkZXIgdG9nZXRoZXIsCisJCQkJc2V2ZXJhbCBkYXlzIHdlcmUgbG9zdCB0byBjaGFzZSB0aGlzIG9uZSBkb3duLiAqLworCQkJbGFzdCA9IGxwLT54bXRfbG93ZXJfbGltaXQ7CisJCQkJZW5kID0gbGFzdCArICgoKGxlbmd0aCArIDMpID4+IDEpIDw8IDEpICsgWE1UX0hFQURFUjsKKwkJCX0KKwkJZWxzZSBlbmQgPSBscC0+eG10X2xvd2VyX2xpbWl0ICsgKGVuZCAtCisJCQkJCQlscC0+eG10X3VwcGVyX2xpbWl0ICsgMik7CisJCX0KKworCQlvdXR3KGxhc3QsIGlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOworCQlvdXR3KFhNVF9DTUQsIGlvYWRkciArIElPX1BPUlQpOworCQlvdXR3KDAsIGlvYWRkciArIElPX1BPUlQpOworCQlvdXR3KGVuZCwgaW9hZGRyICsgSU9fUE9SVCk7CisJCW91dHcobGVuZ3RoLCBpb2FkZHIgKyBJT19QT1JUKTsKKworCQlpZiAobHAtPnZlcnNpb24gPT0gTEFONTk1KQorCQkJb3V0c3coaW9hZGRyICsgSU9fUE9SVCwgYnVmLCAobGVuZ3RoICsgMykgPj4gMSk7CisJCWVsc2UgewkvKiBMQU41OTVUWCBvciBMQU41OTVGWCwgY2FwYWJsZSBvZiAzMi1iaXQgSS9PIHByb2Nlc3NpbmcgKi8KKwkJCXVuc2lnbmVkIHNob3J0IHRlbXAgPSBpbmIoaW9hZGRyICsgSU5UX01BU0tfUkVHKTsKKwkJCW91dGIodGVtcCB8IElPXzMyX0JJVCwgaW9hZGRyICsgSU5UX01BU0tfUkVHKTsKKwkJCW91dHNsKGlvYWRkciArIElPX1BPUlRfMzJfQklULCBidWYsIChsZW5ndGggKyAzKSA+PiAyKTsKKwkJCW91dGIodGVtcCAmIH4oSU9fMzJfQklUKSwgaW9hZGRyICsgSU5UX01BU0tfUkVHKTsKKwkJfQorCisJCS8qIEEgZHVtbXkgcmVhZCB0byBmbHVzaCB0aGUgRFJBTSB3cml0ZSBwaXBlbGluZSAqLworCQlzdGF0dXMgPSBpbncoaW9hZGRyICsgSU9fUE9SVCk7CisKKwkJaWYgKGxwLT50eF9zdGFydCA9PSBscC0+dHhfZW5kKSB7CisJCW91dHcobGFzdCwgaW9hZGRyICsgbHAtPnhtdF9iYXIpOworCQkJb3V0YihYTVRfQ01ELCBpb2FkZHIpOworCQkJbHAtPnR4X3N0YXJ0ID0gbGFzdDsgICAvKiBJIGRvbid0IGxpa2UgdG8gY2hhbmdlIHR4X3N0YXJ0IGhlcmUgKi8KKwkJfQorCQllbHNlIHsKKwkJCS8qIHVwZGF0ZSB0aGUgbmV4dCBhZGRyZXNzIGFuZCB0aGUgY2hhaW4gYml0IGluIHRoZQorCQkJbGFzdCBwYWNrZXQgKi8KKworCQkJaWYgKGxwLT50eF9lbmQgIT0gbGFzdCkgeworCQkJCW91dHcobHAtPnR4X2xhc3QgKyBYTVRfQ0hBSU4sIGlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOworCQkJCW91dHcobGFzdCwgaW9hZGRyICsgSU9fUE9SVCk7CisJCQl9CisKKwkJCW91dHcobHAtPnR4X2xhc3QgKyBYTVRfQ09VTlQsIGlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOworCQkJc3RhdHVzID0gaW53KGlvYWRkciArIElPX1BPUlQpOworCQkJb3V0dyhzdGF0dXMgfCBDSEFJTl9CSVQsIGlvYWRkciArIElPX1BPUlQpOworCisJCQkvKiBDb250aW51ZSB0aGUgdHJhbnNtaXQgY29tbWFuZCAqLworCQkJb3V0YihSRVNVTUVfWE1UX0NNRCwgaW9hZGRyKTsKKwkJfQorCisJCWxwLT50eF9sYXN0ID0gbGFzdDsKKwkJbHAtPnR4X2VuZCA9IGVuZDsKKworCQlpZiAobmV0X2RlYnVnID4gNSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBoYXJkd2FyZV9zZW5kX3BhY2tldCByb3V0aW5lLlxuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZWVwcm9fcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWVwcm9fbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzaG9ydCBib2d1c2NvdW50ID0gMjA7CisJc2hvcnQgcmN2X2NhciA9IGxwLT5yeF9zdGFydDsKKwl1bnNpZ25lZCByY3ZfZXZlbnQsIHJjdl9zdGF0dXMsIHJjdl9uZXh0X2ZyYW1lLCByY3Zfc2l6ZTsKKworCWlmIChuZXRfZGVidWcgPiA1KQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIGVlcHJvX3J4IHJvdXRpbmUuXG4iLCBkZXYtPm5hbWUpOworCisJLyogU2V0IHRoZSByZWFkIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBSQ1YgKi8KKwlvdXR3KHJjdl9jYXIsIGlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOworCisJcmN2X2V2ZW50ID0gaW53KGlvYWRkciArIElPX1BPUlQpOworCisJd2hpbGUgKHJjdl9ldmVudCA9PSBSQ1ZfRE9ORSkgeworCisJCXJjdl9zdGF0dXMgPSBpbncoaW9hZGRyICsgSU9fUE9SVCk7CisJCXJjdl9uZXh0X2ZyYW1lID0gaW53KGlvYWRkciArIElPX1BPUlQpOworCQlyY3Zfc2l6ZSA9IGludyhpb2FkZHIgKyBJT19QT1JUKTsKKworCQlpZiAoKHJjdl9zdGF0dXMgJiAoUlhfT0sgfCBSWF9FUlJPUikpID09IFJYX09LKSB7CisKKwkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJbHAtPnN0YXRzLnJ4X2J5dGVzKz1yY3Zfc2l6ZTsKKwkJCXJjdl9zaXplICY9IDB4M2ZmZjsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IocmN2X3NpemUrNSk7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCXJjdl9jYXIgPSBscC0+cnhfc3RhcnQgKyBSQ1ZfSEVBREVSICsgcmN2X3NpemU7CisJCQkJbHAtPnJ4X3N0YXJ0ID0gcmN2X25leHRfZnJhbWU7CisJCQkJb3V0dyhyY3ZfbmV4dF9mcmFtZSwgaW9hZGRyICsgSE9TVF9BRERSRVNTX1JFRyk7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUoc2tiLDIpOworCisJCQlpZiAobHAtPnZlcnNpb24gPT0gTEFONTk1KQorCQkJCWluc3coaW9hZGRyK0lPX1BPUlQsIHNrYl9wdXQoc2tiLHJjdl9zaXplKSwgKHJjdl9zaXplICsgMykgPj4gMSk7CisJCQllbHNlIHsgLyogTEFONTk1VFggb3IgTEFONTk1RlgsIGNhcGFibGUgb2YgMzItYml0IEkvTyBwcm9jZXNzaW5nICovCisJCQkJdW5zaWduZWQgc2hvcnQgdGVtcCA9IGluYihpb2FkZHIgKyBJTlRfTUFTS19SRUcpOworCQkJCW91dGIodGVtcCB8IElPXzMyX0JJVCwgaW9hZGRyICsgSU5UX01BU0tfUkVHKTsKKwkJCQlpbnNsKGlvYWRkcitJT19QT1JUXzMyX0JJVCwgc2tiX3B1dChza2IscmN2X3NpemUpLAorCQkJCQkocmN2X3NpemUgKyAzKSA+PiAyKTsKKwkJCQlvdXRiKHRlbXAgJiB+KElPXzMyX0JJVCksIGlvYWRkciArIElOVF9NQVNLX1JFRyk7CisJCQl9CisKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJfQorCisJCWVsc2UgeyAvKiBOb3Qgc3VyZSB3aWxsIGV2ZXIgcmVhY2ggaGVyZSwKKwkJCUkgc2V0IHRoZSA1OTUgdG8gZGlzY2FyZCBiYWQgcmVjZWl2ZWQgZnJhbWVzICovCisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisKKwkJCWlmIChyY3Zfc3RhdHVzICYgMHgwMTAwKQorCQkJCWxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCisJCQllbHNlIGlmIChyY3Zfc3RhdHVzICYgMHgwNDAwKQorCQkJCWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKworCQkJZWxzZSBpZiAocmN2X3N0YXR1cyAmIDB4MDgwMCkKKwkJCQlscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV2ZW50ID0gJSN4LCBzdGF0dXMgPSAlI3gsIG5leHQgPSAlI3gsIHNpemUgPSAlI3hcbiIsIAorCQkJCWRldi0+bmFtZSwgcmN2X2V2ZW50LCByY3Zfc3RhdHVzLCByY3ZfbmV4dF9mcmFtZSwgcmN2X3NpemUpOworCQl9CisKKwkJaWYgKHJjdl9zdGF0dXMgJiAweDEwMDApCisJCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCisJCXJjdl9jYXIgPSBscC0+cnhfc3RhcnQgKyBSQ1ZfSEVBREVSICsgcmN2X3NpemU7CisJCWxwLT5yeF9zdGFydCA9IHJjdl9uZXh0X2ZyYW1lOworCisJCWlmICgtLWJvZ3VzY291bnQgPT0gMCkKKwkJCWJyZWFrOworCisJCW91dHcocmN2X25leHRfZnJhbWUsIGlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOworCQlyY3ZfZXZlbnQgPSBpbncoaW9hZGRyICsgSU9fUE9SVCk7CisKKwl9CisJaWYgKHJjdl9jYXIgPT0gMCkKKwkJcmN2X2NhciA9IGxwLT5yY3ZfdXBwZXJfbGltaXQgfCAweGZmOworCisJb3V0dyhyY3ZfY2FyIC0gMSwgaW9hZGRyICsgUkNWX1NUT1ApOworCisJaWYgKG5ldF9kZWJ1ZyA+IDUpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBlZXByb19yeCByb3V0aW5lLlxuIiwgZGV2LT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQKK2VlcHJvX3RyYW5zbWl0X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlZXByb19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXNob3J0IGJvZ3VzY291bnQgPSAyNTsgCisJc2hvcnQgeG10X3N0YXR1czsKKworCXdoaWxlICgobHAtPnR4X3N0YXJ0ICE9IGxwLT50eF9lbmQpICYmIGJvZ3VzY291bnQtLSkgeyAKKworCQlvdXR3KGxwLT50eF9zdGFydCwgaW9hZGRyICsgSE9TVF9BRERSRVNTX1JFRyk7CisJCXhtdF9zdGF0dXMgPSBpbncoaW9hZGRyK0lPX1BPUlQpOworCisJCWlmICghKHhtdF9zdGF0dXMgJiBUWF9ET05FX0JJVCkpCisJCQkJYnJlYWs7CisKKwkJeG10X3N0YXR1cyA9IGludyhpb2FkZHIrSU9fUE9SVCk7CisJCWxwLT50eF9zdGFydCA9IGludyhpb2FkZHIrSU9fUE9SVCk7CisKKwkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKworCQlpZiAoeG10X3N0YXR1cyAmIFRYX09LKQorCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJZWxzZSB7CisJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlpZiAoeG10X3N0YXR1cyAmIDB4MDQwMCkgeworCQkJCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogY2FycmllciBlcnJvclxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFhNVCBzdGF0dXMgPSAlI3hcbiIsCisJCQkJCWRldi0+bmFtZSwgeG10X3N0YXR1cyk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFhNVCBzdGF0dXMgPSAlI3hcbiIsCisJCQkJCWRldi0+bmFtZSwgeG10X3N0YXR1cyk7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBYTVQgc3RhdHVzID0gJSN4XG4iLAorCQkJCQlkZXYtPm5hbWUsIHhtdF9zdGF0dXMpOworCQkJfQorCQl9CisJCWlmICh4bXRfc3RhdHVzICYgMHgwMDBmKSB7CisJCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSAoeG10X3N0YXR1cyAmIDB4MDAwZik7CisJCX0KKworCQlpZiAoKHhtdF9zdGF0dXMgJiAweDAwNDApID09IDB4MCkgeworCQkJbHAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBlZXByb19ldGh0b29sX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZWVwcm9fbG9jYWwJKmxwID0gKHN0cnVjdCBlZXByb19sb2NhbCAqKWRldi0+cHJpdjsKKworCWNtZC0+c3VwcG9ydGVkID0gCVNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCAKKwkJCQlTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCQlTVVBQT1JURURfQXV0b25lZzsKKwljbWQtPmFkdmVydGlzaW5nID0JQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfAorCQkJCUFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKKwkJCQlBRFZFUlRJU0VEX0F1dG9uZWc7CisKKwlpZiAoR2V0Qml0KGxwLT53b3JkWzVdLCBlZV9Qb3J0VFBFKSkgeworCQljbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfVFA7CisJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9UUDsKKwl9CisJaWYgKEdldEJpdChscC0+d29yZFs1XSwgZWVfUG9ydEJOQykpIHsKKwkJY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX0JOQzsKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0JOQzsKKwl9CisJaWYgKEdldEJpdChscC0+d29yZFs1XSwgZWVfUG9ydEFVSSkpIHsKKwkJY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX0FVSTsKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0FVSTsKKwl9CisKKwljbWQtPnNwZWVkID0gU1BFRURfMTA7CisKKwlpZiAoZGV2LT5pZl9wb3J0ID09IFRQRSAmJiBscC0+d29yZFsxXSAmIGVlX0R1cGxleCkgeworCQljbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOworCX0KKwllbHNlIHsKKwkJY21kLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwl9CisKKwljbWQtPnBvcnQgPSBkZXYtPmlmX3BvcnQ7CisJY21kLT5waHlfYWRkcmVzcyA9IGRldi0+YmFzZV9hZGRyOworCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCisJaWYgKGxwLT53b3JkWzBdICYgZWVfQXV0b05lZykgeworCQljbWQtPmF1dG9uZWcgPSAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlZXByb19ldGh0b29sX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCit7CisJc3RyY3B5KGRydmluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShkcnZpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3ByaW50ZihkcnZpbmZvLT5idXNfaW5mbywgIklTQSAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBlZXByb19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzCT0gZWVwcm9fZXRodG9vbF9nZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvIAk9IGVlcHJvX2V0aHRvb2xfZ2V0X2RydmluZm8sCit9OworCisjaWZkZWYgTU9EVUxFCisKKyNkZWZpbmUgTUFYX0VFUFJPIDgKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2VlcHJvW01BWF9FRVBST107CisKK3N0YXRpYyBpbnQgaW9bTUFYX0VFUFJPXSA9IHsKKyAgWzAgLi4uIE1BWF9FRVBSTy0xXSA9IC0xCit9Oworc3RhdGljIGludCBpcnFbTUFYX0VFUFJPXTsKK3N0YXRpYyBpbnQgbWVtW01BWF9FRVBST10gPSB7CS8qIFNpemUgb2YgdGhlIHJ4IGJ1ZmZlciBpbiBLQiAqLworICBbMCAuLi4gTUFYX0VFUFJPLTFdID0gUkNWX0RFRkFVTFRfUkFNLzEwMjQKK307CitzdGF0aWMgaW50IGF1dG9kZXRlY3Q7CisKK3N0YXRpYyBpbnQgbl9lZXBybzsKKy8qIEZvciBsaW51eCAyLjEueHggKi8KKworTU9EVUxFX0FVVEhPUigiUGFzY2FsIER1cHVpcyBhbmQgb3RoZXJzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIGk4MjU5NSBJU0EgRXRoZXJFeHByZXNzUHJvMTAvMTArIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IG51bV9wYXJhbXM7Cittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgJm51bV9wYXJhbXMsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCAmbnVtX3BhcmFtcywgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWVtLCBpbnQsICZudW1fcGFyYW1zLCAwKTsKK21vZHVsZV9wYXJhbShhdXRvZGV0ZWN0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkV0aGVyRXhwcmVzcyBQcm8vMTAgSS9PIGJhc2UgYWRkcmVzKGVzKSIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJFdGhlckV4cHJlc3MgUHJvLzEwIElSUSBudW1iZXIocykiKTsKK01PRFVMRV9QQVJNX0RFU0MobWVtLCAiRXRoZXJFeHByZXNzIFByby8xMCBSeCBidWZmZXIgc2l6ZShlcykgaW4ga0IgKDMtMjkpIik7CitNT0RVTEVfUEFSTV9ERVNDKGF1dG9kZXRlY3QsICJFdGhlckV4cHJlc3MgUHJvLzEwIGZvcmNlIGJvYXJkKHMpIGRldGVjdGlvbiAoMC0xKSIpOworCitpbnQKK2luaXRfbW9kdWxlKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaTsKKwlpZiAoaW9bMF0gPT0gLTEgJiYgYXV0b2RldGVjdCA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVlcHJvX2luaXRfbW9kdWxlOiBQcm9iZSBpcyB2ZXJ5IGRhbmdlcm91cyBpbiBJU0EgYm9hcmRzIVxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVlcHJvX2luaXRfbW9kdWxlOiBQbGVhc2UgYWRkIFwiYXV0b2RldGVjdD0xXCIgdG8gZm9yY2UgcHJvYmVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZWxzZSBpZiAoYXV0b2RldGVjdCkgeworCQkvKiBpZiBhdXRvZGV0ZWN0IGlzIHNldCB0aGVuIHdlIG11c3QgZm9yY2UgZGV0ZWN0aW9uICovCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfRUVQUk87IGkrKykgeworCQkJaW9baV0gPSAwOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZWVwcm9faW5pdF9tb2R1bGU6IEF1dG8tZGV0ZWN0aW5nIGJvYXJkcyAoTWF5IEdvZCBwcm90ZWN0IHVzLi4uKVxuIik7CisJfQorCisJZm9yIChpID0gMDsgaW9baV0gIT0gLTEgJiYgaSA8IE1BWF9FRVBSTzsgaSsrKSB7CisJCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZWVwcm9fbG9jYWwpKTsKKwkJaWYgKCFkZXYpCisJCQlicmVhazsKKworCQlkZXYtPm1lbV9lbmQgPSBtZW1baV07CisJCWRldi0+YmFzZV9hZGRyID0gaW9baV07CisJCWRldi0+aXJxID0gaXJxW2ldOworCisJCWlmIChkb19lZXByb19wcm9iZShkZXYpID09IDApIHsKKwkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7CisJCQkJZGV2X2VlcHJvW25fZWVwcm8rK10gPSBkZXY7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRUVQUk9fSU9fRVhURU5UKTsKKwkJfQorCQlmcmVlX25ldGRldihkZXYpOworCQlicmVhazsKKwl9CisKKwlpZiAobl9lZXBybykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCXJldHVybiBuX2VlcHJvID8gMCA6IC1FTk9ERVY7Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaTxuX2VlcHJvOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9lZXByb1tpXTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVFUFJPX0lPX0VYVEVOVCk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorfQorI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWVwcm8xMDAuYyBiL2RyaXZlcnMvbmV0L2VlcHJvMTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiM2EyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2VlcHJvMTAwLmMKQEAgLTAsMCArMSwyNDEyIEBACisvKiBkcml2ZXJzL25ldC9lZXBybzEwMC5jOiBBbiBJbnRlbCBpODI1NTctNTU5IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguICovCisvKgorCVdyaXR0ZW4gMTk5Ni0xOTk5IGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGUgZHJpdmVyIGFsc28gY29udGFpbnMgdXBkYXRlcyBieSBkaWZmZXJlbnQga2VybmVsIGRldmVsb3BlcnMKKwkoc2VlIGluY29tcGxldGUgbGlzdCBiZWxvdykuCisJQ3VycmVudCBtYWludGFpbmVyIGlzIEFuZHJleSBWLiBTYXZvY2hraW4gPHNhd0BzYXcuc3cuY29tLnNnPi4KKwlQbGVhc2UgdXNlIHRoaXMgZW1haWwgYWRkcmVzcyBhbmQgbGludXgta2VybmVsIG1haWxpbmcgbGlzdCBmb3IgYnVnIHJlcG9ydHMuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVRoaXMgZHJpdmVyIGlzIGZvciB0aGUgSW50ZWwgRXRoZXJFeHByZXNzIFBybzEwMCAoU3BlZWRvMykgZGVzaWduLgorCUl0IHNob3VsZCB3b3JrIHdpdGggYWxsIGk4MjU1Ny81NTgvNTU5IGJvYXJkcy4KKworCVZlcnNpb24gaGlzdG9yeToKKwkxOTk4IEFwciAtIDIwMDAgRmViICBBbmRyZXkgVi4gU2F2b2Noa2luIDxzYXdAc2F3LnN3LmNvbS5zZz4KKwkJU2VyaW91cyBmaXhlcyBmb3IgbXVsdGljYXN0IGZpbHRlciBsaXN0IHNldHRpbmcsIFRYIHRpbWVvdXQgcm91dGluZTsKKwkJUlggcmluZyByZWZpbGxpbmcgbG9naWM7ICBvdGhlciBzdHVmZgorCTIwMDAgRmViICBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJCUNvbnZlcnQgdG8gbmV3IFBDSSBkcml2ZXIgaW50ZXJmYWNlCisJMjAwMCBNYXIgMjQgIERyYWdhbiBTdGFuY2V2aWMgPHZpc2l0b3JAdmFsaW51eC5jb20+CisJCURpc2FibGVkIEZDIGFuZCBFUiwgdG8gYXZvaWQgbG9ja3VwcyB3aGVuIHdoZW4gd2UgZ2V0IEZDUCBpbnRlcnJ1cHRzLgorCTIwMDAgSnVsIDE3IEdvdXRoYW0gUmFvIDxnb3V0aGFtLnJhb0BpbnRlbC5jb20+CisJCVBDSSBETUEgQVBJIGZpeGVzLCBhZGRpbmcgcGNpX2RtYV9zeW5jX3NpbmdsZSBjYWxscyB3aGVyZSBuZWNjZXNhcnkKKwkyMDAwIEF1ZyAzMSBEYXZpZCBNb3NiZXJnZXIgPGRhdmlkbUBocGwuaHAuY29tPgorCQlyeF9hbGlnbiBzdXBwb3J0OiBlbmFibGVzIHJ4IERNQSB3aXRob3V0IGNhdXNpbmcgdW5hbGlnbmVkIGFjY2Vzc2VzLgorKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQorImVlcHJvMTAwLmM6djEuMDlqLXQgOS8yOS85OSBEb25hbGQgQmVja2VyIGh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvZWVwcm8xMDAuaHRtbFxuIgorImVlcHJvMTAwLmM6ICRSZXZpc2lvbjogMS4zNiAkIDIwMDAvMTEvMTcgTW9kaWZpZWQgYnkgQW5kcmV5IFYuIFNhdm9jaGtpbiA8c2F3QHNhdy5zdy5jb20uc2c+IGFuZCBvdGhlcnNcbiI7CisKKy8qIEEgZmV3IHVzZXItY29uZmlndXJhYmxlIHZhbHVlcyB0aGF0IGFwcGx5IHRvIGFsbCBib2FyZHMuCisgICBGaXJzdCBzZXQgaXMgdW5kb2N1bWVudGVkIGFuZCBzcGVsbGVkIHBlciBJbnRlbCByZWNvbW1lbmRhdGlvbnMuICovCisKK3N0YXRpYyBpbnQgY29uZ2VuYiAvKiA9IDAgKi87IC8qIEVuYWJsZSBjb25nZXN0aW9uIGNvbnRyb2wgaW4gdGhlIERQODM4NDAuICovCitzdGF0aWMgaW50IHR4ZmlmbyA9IDg7CQkvKiBUeCBGSUZPIHRocmVzaG9sZCBpbiA0IGJ5dGUgdW5pdHMsIDAtMTUgKi8KK3N0YXRpYyBpbnQgcnhmaWZvID0gODsJCS8qIFJ4IEZJRk8gdGhyZXNob2xkLCBkZWZhdWx0IDMyIGJ5dGVzLiAqLworLyogVHgvUnggRE1BIGJ1cnN0IGxlbmd0aCwgMC0xMjcsIDAgPT0gbm8gcHJlZW1wdGlvbiwgdHg9PTEyOCAtPiBkaXNhYmxlZC4gKi8KK3N0YXRpYyBpbnQgdHhkbWFjb3VudCA9IDEyODsKK3N0YXRpYyBpbnQgcnhkbWFjb3VudCAvKiA9IDAgKi87CisKKyNpZiBkZWZpbmVkKF9faWE2NF9fKSB8fCBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19taXBzX18pIHx8IFwKKwlkZWZpbmVkKF9fYXJtX18pCisgIC8qIGFsaWduIHJ4IGJ1ZmZlcnMgdG8gMiBieXRlcyBzbyB0aGF0IElQIGhlYWRlciBpcyBhbGlnbmVkICovCisjIGRlZmluZSByeF9hbGlnbihza2IpCQlza2JfcmVzZXJ2ZSgoc2tiKSwgMikKKyMgZGVmaW5lIFJ4RkRfQUxJR05NRU5UCQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMiksIHBhY2tlZCkpCisjZWxzZQorIyBkZWZpbmUgcnhfYWxpZ24oc2tiKQorIyBkZWZpbmUgUnhGRF9BTElHTk1FTlQKKyNlbmRpZgorCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWJ1ZmZlciBSeCBtZXRob2QuCisgICBMb3dlciB2YWx1ZXMgdXNlIG1vcmUgbWVtb3J5LCBidXQgYXJlIGZhc3Rlci4gKi8KK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMjAwOworCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0LiAqLworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyMDsKKworLyogTWF4aW11bSBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBmaWx0ZXIgKHZzLiByeC1hbGwtbXVsdGljYXN0KSAqLworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gNjQ7CisKKy8qICdvcHRpb25zJyBpcyB1c2VkIHRvIHBhc3MgYSB0cmFuc2NlaXZlciBvdmVycmlkZSBvciBmdWxsLWR1cGxleCBmbGFnCisgICBlLmcuICJvcHRpb25zPTE2IiBmb3IgRkQsICJvcHRpb25zPTMyIiBmb3IgMTAwbWJwcy1vbmx5LiAqLworc3RhdGljIGludCBmdWxsX2R1cGxleFtdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CitzdGF0aWMgaW50IG9wdGlvbnNbXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OworCisvKiBBIGZldyB2YWx1ZXMgdGhhdCBtYXkgYmUgdHdlYWtlZC4gKi8KKy8qIFRoZSByaW5nIHNpemVzIHNob3VsZCBiZSBhIHBvd2VyIG9mIHR3byBmb3IgZWZmaWNpZW5jeS4gKi8KKyNkZWZpbmUgVFhfUklOR19TSVpFCTY0CisjZGVmaW5lIFJYX1JJTkdfU0laRQk2NAorLyogSG93IG11Y2ggc2xvdHMgbXVsdGljYXN0IGZpbHRlciBzZXR1cCBtYXkgdGFrZS4KKyAgIERvIG5vdCBkZXNjcmVhc2Ugd2l0aG91dCBjaGFuZ2luZyBzZXRfcnhfbW9kZSgpIGltcGxlbWVudGFpb24uICovCisjZGVmaW5lIFRYX01VTFRJQ0FTVF9TSVpFICAgMgorI2RlZmluZSBUWF9NVUxUSUNBU1RfUkVTRVJWIChUWF9NVUxUSUNBU1RfU0laRSoyKQorLyogQWN0dWFsIG51bWJlciBvZiBUWCBwYWNrZXRzIHF1ZXVlZCwgbXVzdCBiZQorICAgPD0gVFhfUklOR19TSVpFLVRYX01VTFRJQ0FTVF9SRVNFUlYuICovCisjZGVmaW5lIFRYX1FVRVVFX0xJTUlUICAoVFhfUklOR19TSVpFLVRYX01VTFRJQ0FTVF9SRVNFUlYpCisvKiBIeXN0ZXJlc2lzIG1hcmtpbmcgcXVldWUgYXMgbm8gbG9uZ2VyIGZ1bGwuICovCisjZGVmaW5lIFRYX1FVRVVFX1VORlVMTCAoVFhfUVVFVUVfTElNSVQtNCkKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQJCSgyKkhaKQorLyogU2l6ZSBvZiBhbiBwcmUtYWxsb2NhdGVkIFJ4IGJ1ZmZlcjogPEV0aGVybmV0IE1UVT4gKyBzbGFjay4qLworI2RlZmluZSBQS1RfQlVGX1NaCQkxNTM2CisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisKK3N0YXRpYyBpbnQgdXNlX2lvOworc3RhdGljIGludCBkZWJ1ZyA9IC0xOworI2RlZmluZSBERUJVR19ERUZBVUxUCQkoTkVUSUZfTVNHX0RSVgkJfCBcCisJCQkJIE5FVElGX01TR19IVwkJfCBcCisJCQkJIE5FVElGX01TR19SWF9FUlIJfCBcCisJCQkJIE5FVElGX01TR19UWF9FUlIpCisjZGVmaW5lIERFQlVHCQkJKChkZWJ1ZyA+PSAwKSA/ICgxPDxkZWJ1ZyktMSA6IERFQlVHX0RFRkFVTFQpCisKKworTU9EVUxFX0FVVEhPUigiTWFpbnRhaW5lcjogQW5kcmV5IFYuIFNhdm9jaGtpbiA8c2F3QHNhdy5zdy5jb20uc2c+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIGk4MjU1Ny9pODI1NTgvaTgyNTU5IFBDSSBFdGhlckV4cHJlc3NQcm8gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW0odXNlX2lvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZnVsbF9kdXBsZXgsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0oY29uZ2VuYiwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh0eGZpZm8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocnhmaWZvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHR4ZG1hY291bnQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocnhkbWFjb3VudCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWF4X2ludGVycnVwdF93b3JrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG11bHRpY2FzdF9maWx0ZXJfbGltaXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZGVidWcgbGV2ZWwgKDAtNikiKTsKK01PRFVMRV9QQVJNX0RFU0Mob3B0aW9ucywgIkJpdHMgMC0zOiB0cmFuc2NlaXZlciB0eXBlLCBiaXQgNDogZnVsbCBkdXBsZXgsIGJpdCA1OiAxMDBNYnBzIik7CitNT0RVTEVfUEFSTV9ERVNDKGZ1bGxfZHVwbGV4LCAiZnVsbCBkdXBsZXggc2V0dGluZyhzKSAoMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoY29uZ2VuYiwgIkVuYWJsZSBjb25nZXN0aW9uIGNvbnRyb2wgKDEpIik7CitNT0RVTEVfUEFSTV9ERVNDKHR4ZmlmbywgIlR4IEZJRk8gdGhyZXNob2xkIGluIDQgYnl0ZSB1bml0cywgKDAtMTUpIik7CitNT0RVTEVfUEFSTV9ERVNDKHJ4ZmlmbywgIlJ4IEZJRk8gdGhyZXNob2xkIGluIDQgYnl0ZSB1bml0cywgKDAtMTUpIik7CitNT0RVTEVfUEFSTV9ERVNDKHR4ZG1hY291bnQsICJUeCBETUEgYnVyc3QgbGVuZ3RoOyAxMjggLSBkaXNhYmxlICgwLTEyOCkiKTsKK01PRFVMRV9QQVJNX0RFU0MocnhkbWFjb3VudCwgIlJ4IERNQSBidXJzdCBsZW5ndGg7IDEyOCAtIGRpc2FibGUgKDAtMTI4KSIpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICJjb3B5IGJyZWFrcG9pbnQgZm9yIGNvcHktb25seS10aW55LWZyYW1lcyIpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfaW50ZXJydXB0X3dvcmssICJtYXhpbXVtIGV2ZW50cyBoYW5kbGVkIHBlciBpbnRlcnJ1cHQiKTsKK01PRFVMRV9QQVJNX0RFU0MobXVsdGljYXN0X2ZpbHRlcl9saW1pdCwgIm1heGltdW0gbnVtYmVyIG9mIGZpbHRlcmVkIG11bHRpY2FzdCBhZGRyZXNzZXMiKTsKKworI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMgKyAoeCkpCisKKyNkZWZpbmUgbmV0ZGV2aWNlX3N0YXJ0KGRldikKKyNkZWZpbmUgbmV0ZGV2aWNlX3N0b3AoZGV2KQorI2RlZmluZSBuZXRpZl9zZXRfdHhfdGltZW91dChkZXYsIHRmLCB0bSkgXAorCQkJCQkJCQlkbyB7IFwKKwkJCQkJCQkJCShkZXYpLT50eF90aW1lb3V0ID0gKHRmKTsgXAorCQkJCQkJCQkJKGRldiktPndhdGNoZG9nX3RpbWVvID0gKHRtKTsgXAorCQkJCQkJCQl9IHdoaWxlKDApCisKKworCisvKgorCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworSS4gQm9hcmQgQ29tcGF0aWJpbGl0eQorCitUaGlzIGRldmljZSBkcml2ZXIgaXMgZGVzaWduZWQgZm9yIHRoZSBJbnRlbCBpODI1NTcgIlNwZWVkbzMiIGNoaXAsIEludGVsJ3MKK3NpbmdsZS1jaGlwIGZhc3QgRXRoZXJuZXQgY29udHJvbGxlciBmb3IgUENJLCBhcyB1c2VkIG9uIHRoZSBJbnRlbAorRXRoZXJFeHByZXNzIFBybyAxMDAgYWRhcHRlci4KKworSUkuIEJvYXJkLXNwZWNpZmljIHNldHRpbmdzCisKK1BDSSBidXMgZGV2aWNlcyBhcmUgY29uZmlndXJlZCBieSB0aGUgc3lzdGVtIGF0IGJvb3QgdGltZSwgc28gbm8ganVtcGVycworbmVlZCB0byBiZSBzZXQgb24gdGhlIGJvYXJkLiAgVGhlIHN5c3RlbSBCSU9TIHNob3VsZCBiZSBzZXQgdG8gYXNzaWduIHRoZQorUENJIElOVEEgc2lnbmFsIHRvIGFuIG90aGVyd2lzZSB1bnVzZWQgc3lzdGVtIElSUSBsaW5lLiAgV2hpbGUgaXQncworcG9zc2libGUgdG8gc2hhcmUgUENJIGludGVycnVwdCBsaW5lcywgaXQgbmVnYXRpdmVseSBpbXBhY3RzIHBlcmZvcm1hbmNlIGFuZAorb25seSByZWNlbnQga2VybmVscyBzdXBwb3J0IGl0LgorCitJSUkuIERyaXZlciBvcGVyYXRpb24KKworSUlJQS4gR2VuZXJhbAorVGhlIFNwZWVkbzMgaXMgdmVyeSBzaW1pbGFyIHRvIG90aGVyIEludGVsIG5ldHdvcmsgY2hpcHMsIHRoYXQgaXMgdG8gc2F5CisiYXBwYXJlbnRseSBkZXNpZ25lZCBvbiBhIGRpZmZlcmVudCBwbGFuZXQiLiAgVGhpcyBjaGlwcyByZXRhaW5zIHRoZSBjb21wbGV4CitSeCBhbmQgVHggZGVzY3JpcHRvcnMgYW5kIG11bHRpcGxlIGJ1ZmZlcnMgcG9pbnRlcnMgYXMgcHJldmlvdXMgY2hpcHMsIGJ1dAorYWxzbyBoYXMgc2ltcGxpZmllZCBUeCBhbmQgUnggYnVmZmVyIG1vZGVzLiAgVGhpcyBkcml2ZXIgdXNlcyB0aGUgImZsZXhpYmxlIgorVHggbW9kZSwgYnV0IGluIGEgc2ltcGxpZmllZCBsb3dlci1vdmVyaGVhZCBtYW5uZXI6IGl0IGFzc29jaWF0ZXMgb25seSBhCitzaW5nbGUgYnVmZmVyIGRlc2NyaXB0b3Igd2l0aCBlYWNoIGZyYW1lIGRlc2NyaXB0b3IuCisKK0Rlc3BpdGUgdGhlIGV4dHJhIHNwYWNlIG92ZXJoZWFkIGluIGVhY2ggcmVjZWl2ZSBza2J1ZmYsIHRoZSBkcml2ZXIgbXVzdCB1c2UKK3RoZSBzaW1wbGlmaWVkIFJ4IGJ1ZmZlciBtb2RlIHRvIGFzc3VyZSB0aGF0IG9ubHkgYSBzaW5nbGUgZGF0YSBidWZmZXIgaXMKK2Fzc29jaWF0ZWQgd2l0aCBlYWNoIFJ4RkQuIFRoZSBkcml2ZXIgaW1wbGVtZW50cyB0aGlzIGJ5IHJlc2VydmluZyBzcGFjZQorZm9yIHRoZSBSeCBkZXNjcmlwdG9yIGF0IHRoZSBoZWFkIG9mIGVhY2ggUnggc2tidWZmLgorCitUaGUgU3BlZWRvLTMgaGFzIHJlY2VpdmUgYW5kIGNvbW1hbmQgdW5pdCBiYXNlIGFkZHJlc3NlcyB0aGF0IGFyZSBhZGRlZCB0bworYWxtb3N0IGFsbCBkZXNjcmlwdG9yIHBvaW50ZXJzLiAgVGhlIGRyaXZlciBzZXRzIHRoZXNlIHRvIHplcm8sIHNvIHRoYXQgYWxsCitwb2ludGVyIGZpZWxkcyBhcmUgYWJzb2x1dGUgYWRkcmVzc2VzLgorCitUaGUgU3lzdGVtIENvbnRyb2wgQmxvY2sgKFNDQikgb2Ygc29tZSBwcmV2aW91cyBJbnRlbCBjaGlwcyBleGlzdHMgb24gdGhlCitjaGlwIGluIGJvdGggUENJIEkvTyBhbmQgbWVtb3J5IHNwYWNlLiAgVGhpcyBkcml2ZXIgdXNlcyB0aGUgSS9PIHNwYWNlCityZWdpc3RlcnMsIGJ1dCBtaWdodCBzd2l0Y2ggdG8gbWVtb3J5IG1hcHBlZCBtb2RlIHRvIGJldHRlciBzdXBwb3J0IG5vbi14ODYKK3Byb2Nlc3NvcnMuCisKK0lJSUIuIFRyYW5zbWl0IHN0cnVjdHVyZQorCitUaGUgZHJpdmVyIG11c3QgdXNlIHRoZSBjb21wbGV4IFR4IGNvbW1hbmQrZGVzY3JpcHRvciBtb2RlIGluIG9yZGVyIHRvCitoYXZlIGEgaW5kaXJlY3QgcG9pbnRlciB0byB0aGUgc2tidWZmIGRhdGEgc2VjdGlvbi4gIEVhY2ggVHggY29tbWFuZCBibG9jaworKFR4Q0IpIGlzIGFzc29jaWF0ZWQgd2l0aCB0d28gaW1tZWRpYXRlbHkgYXBwZW5kZWQgVHggQnVmZmVyIERlc2NyaXB0b3IKKyhUeEJEKS4gIEEgZml4ZWQgcmluZyBvZiB0aGVzZSBUeENCK1R4QkQgcGFpcnMgYXJlIGtlcHQgYXMgcGFydCBvZiB0aGUKK3NwZWVkb19wcml2YXRlIGRhdGEgc3RydWN0dXJlIGZvciBlYWNoIGFkYXB0ZXIgaW5zdGFuY2UuCisKK1RoZSBuZXdlciBpODI1NTggZXhwbGljaXRseSBzdXBwb3J0cyB0aGlzIHN0cnVjdHVyZSwgYW5kIGNhbiByZWFkIHRoZSB0d28KK1R4QkRzIGluIHRoZSBzYW1lIFBDSSBidXJzdCBhcyB0aGUgVHhDQi4KKworVGhpcyByaW5nIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgbm9ybWFsIHRyYW5zbWl0IHBhY2tldHMsIGJ1dCB0aGUKK3RyYW5zbWl0IHBhY2tldCBkZXNjcmlwdG9ycyBhcmVuJ3QgbG9uZyBlbm91Z2ggZm9yIG1vc3Qgbm9uLVR4IGNvbW1hbmRzIHN1Y2gKK2FzIENtZENvbmZpZ3VyZS4gIFRoaXMgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIGNoaXAgaGFzCithbHJlYWR5IGxvYWRlZCB0aGUgbGluayBhZGRyZXNzIGluIHRoZSBwcmV2aW91cyBkZXNjcmlwdG9yLiAgU28gZm9yIHRoZXNlCitjb21tYW5kcyB3ZSBjb252ZXJ0IHRoZSBuZXh0IGZyZWUgZGVzY3JpcHRvciBvbiB0aGUgcmluZyB0byBhIE5vT3AsIGFuZCBwb2ludAordGhhdCBkZXNjcmlwdG9yJ3MgbGluayB0byB0aGUgY29tcGxleCBjb21tYW5kLgorCitBbiBhZGRpdGlvbmFsIGNvbXBsZXhpdHkgb2YgdGhlc2Ugbm9uLXRyYW5zbWl0IGNvbW1hbmRzIGFyZSB0aGF0IHRoZXkgbWF5IGJlCithZGRlZCBhc3luY2hyb25vdXMgdG8gdGhlIG5vcm1hbCB0cmFuc21pdCBxdWV1ZSwgc28gd2UgZGlzYWJsZSBpbnRlcnJ1cHRzCit3aGVuZXZlciB0aGUgVHggZGVzY3JpcHRvciByaW5nIGlzIG1hbmlwdWxhdGVkLgorCitBIG5vdGFibGUgYXNwZWN0IG9mIHRoZXNlIHNwZWNpYWwgY29uZmlndXJlIGNvbW1hbmRzIGlzIHRoYXQgdGhleSBkbword29yayB3aXRoIHRoZSBub3JtYWwgVHggcmluZyBlbnRyeSBzY2F2ZW5nZSBtZXRob2QuICBUaGUgVHggcmluZyBzY2F2ZW5nZQoraXMgZG9uZSBhdCBpbnRlcnJ1cHQgdGltZSB1c2luZyB0aGUgJ2RpcnR5X3R4JyBpbmRleCwgYW5kIGNoZWNraW5nIGZvciB0aGUKK2NvbW1hbmQtY29tcGxldGUgYml0LiAgV2hpbGUgdGhlIHNldHVwIGZyYW1lcyBtYXkgaGF2ZSB0aGUgTm9PcCBjb21tYW5kIG9uIHRoZQorVHggcmluZyBtYXJrZWQgYXMgY29tcGxldGUsIGJ1dCBub3QgaGF2ZSBjb21wbGV0ZWQgdGhlIHNldHVwIGNvbW1hbmQsIHRoaXMKK2lzIG5vdCBhIHByb2JsZW0uICBUaGUgdHhfcmluZyBlbnRyeSBjYW4gYmUgc3RpbGwgc2FmZWx5IHJldXNlZCwgYXMgdGhlCit0eF9za2J1ZmZbXSBlbnRyeSBpcyBhbHdheXMgZW1wdHkgZm9yIGNvbmZpZ19jbWQgYW5kIG1jX3NldHVwIGZyYW1lcy4KKworQ29tbWFuZHMgbWF5IGhhdmUgYml0cyBzZXQgZS5nLiBDbWRTdXNwZW5kIGluIHRoZSBjb21tYW5kIHdvcmQgdG8gZWl0aGVyCitzdXNwZW5kIG9yIHN0b3AgdGhlIHRyYW5zbWl0L2NvbW1hbmQgdW5pdC4gIFRoaXMgZHJpdmVyIGFsd2F5cyBmbGFncyB0aGUgbGFzdAorY29tbWFuZCB3aXRoIENtZFN1c3BlbmQsIGVyYXNlcyB0aGUgQ21kU3VzcGVuZCBpbiB0aGUgcHJldmlvdXMgY29tbWFuZCwgYW5kCit0aGVuIGlzc3VlcyBhIENVX1JFU1VNRS4KK05vdGU6IFdhdGNoIG91dCBmb3IgdGhlIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBoZXJlOiBpbWFnaW5lCisJZXJhc2luZyB0aGUgcHJldmlvdXMgc3VzcGVuZAorCQl0aGUgY2hpcCBwcm9jZXNzZXMgdGhlIHByZXZpb3VzIGNvbW1hbmQKKwkJdGhlIGNoaXAgcHJvY2Vzc2VzIHRoZSBmaW5hbCBjb21tYW5kLCBhbmQgc3VzcGVuZHMKKwlkb2luZyB0aGUgQ1VfUkVTVU1FCisJCXRoZSBjaGlwIHByb2Nlc3NlcyB0aGUgbmV4dC15ZXQtdmFsaWQgcG9zdC1maW5hbC1jb21tYW5kLgorU28gYmxpbmRseSBzZW5kaW5nIGEgQ1VfUkVTVU1FIGlzIG9ubHkgc2FmZSBpZiB3ZSBkbyBpdCBpbW1lZGlhdGVseSBhZnRlcgorYWZ0ZXIgZXJhc2luZyB0aGUgcHJldmlvdXMgQ21kU3VzcGVuZCwgd2l0aG91dCB0aGUgcG9zc2liaWxpdHkgb2YgYW4KK2ludGVydmVuaW5nIGRlbGF5LiAgVGh1cyB0aGUgcmVzdW1lIGNvbW1hbmQgaXMgYWx3YXlzIHdpdGhpbiB0aGUKK2ludGVycnVwdHMtZGlzYWJsZWQgcmVnaW9uLiAgVGhpcyBpcyBhIHRpbWluZyBkZXBlbmRlbmNlLCBidXQgaGFuZGxpbmcgdGhpcworY29uZGl0aW9uIGluIGEgdGltaW5nLWluZGVwZW5kZW50IHdheSB3b3VsZCBjb25zaWRlcmFibHkgY29tcGxpY2F0ZSB0aGUgY29kZS4KKworTm90ZTogSW4gcHJldmlvdXMgZ2VuZXJhdGlvbiBJbnRlbCBjaGlwcywgcmVzdGFydGluZyB0aGUgY29tbWFuZCB1bml0IHdhcyBhCitub3RvcmlvdXNseSBzbG93IHByb2Nlc3MuICBUaGlzIGlzIHByZXN1bWFibHkgbm8gbG9uZ2VyIHRydWUuCisKK0lJSUMuIFJlY2VpdmUgc3RydWN0dXJlCisKK0JlY2F1c2Ugb2YgdGhlIGJ1cy1tYXN0ZXIgc3VwcG9ydCBvbiB0aGUgU3BlZWRvMyB0aGlzIGRyaXZlciB1c2VzIHRoZSBuZXcKK1NLQlVGRl9SWF9DT1BZQlJFQUsgc2NoZW1lLCByYXRoZXIgdGhhbiBhIGZpeGVkIGludGVybWVkaWF0ZSByZWNlaXZlIGJ1ZmZlci4KK1RoaXMgc2NoZW1lIGFsbG9jYXRlcyBmdWxsLXNpemVkIHNrYnVmZnMgYXMgcmVjZWl2ZSBidWZmZXJzLiAgVGhlIHZhbHVlCitTS0JVRkZfUlhfQ09QWUJSRUFLIGlzIHVzZWQgYXMgdGhlIGNvcHlpbmcgYnJlYWtwb2ludDogaXQgaXMgY2hvc2VuIHRvCit0cmFkZS1vZmYgdGhlIG1lbW9yeSB3YXN0ZWQgYnkgcGFzc2luZyB0aGUgZnVsbC1zaXplZCBza2J1ZmYgdG8gdGhlIHF1ZXVlCitsYXllciBmb3IgYWxsIGZyYW1lcyB2cy4gdGhlIGNvcHlpbmcgY29zdCBvZiBjb3B5aW5nIGEgZnJhbWUgdG8gYQorY29ycmVjdGx5LXNpemVkIHNrYnVmZi4KKworRm9yIHNtYWxsIGZyYW1lcyB0aGUgY29weWluZyBjb3N0IGlzIG5lZ2xpZ2libGUgKGVzcC4gY29uc2lkZXJpbmcgdGhhdCB3ZQorYXJlIHByZS1sb2FkaW5nIHRoZSBjYWNoZSB3aXRoIGltbWVkaWF0ZWx5IHVzZWZ1bCBoZWFkZXIgaW5mb3JtYXRpb24pLCBzbyB3ZQorYWxsb2NhdGUgYSBuZXcsIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICBGb3IgbGFyZ2UgZnJhbWVzIHRoZSBjb3B5aW5nIGNvc3QKK2lzIG5vbi10cml2aWFsLCBhbmQgdGhlIGxhcmdlciBjb3B5IG1pZ2h0IGZsdXNoIHRoZSBjYWNoZSBvZiB1c2VmdWwgZGF0YSwgc28KK3dlIHBhc3MgdXAgdGhlIHNrYnVmZiB0aGUgcGFja2V0IHdhcyByZWNlaXZlZCBpbnRvLgorCitJVi4gTm90ZXMKKworVGhhbmtzIHRvIFN0ZXZlIFdpbGxpYW1zIG9mIEludGVsIGZvciBhcnJhbmdpbmcgdGhlIG5vbi1kaXNjbG9zdXJlIGFncmVlbWVudAordGhhdCBzdGF0ZWQgdGhhdCBJIGNvdWxkIGRpc2Nsb3NlIHRoZSBpbmZvcm1hdGlvbi4gIEJ1dCBJIHN0aWxsIHJlc2VudAoraGF2aW5nIHRvIHNpZ24gYW4gSW50ZWwgTkRBIHdoZW4gSSdtIGhlbHBpbmcgSW50ZWwgc2VsbCB0aGVpciBvd24gcHJvZHVjdCEKKworKi8KKworc3RhdGljIGludCBzcGVlZG9fZm91bmQxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGZuZF9jbnQsIGludCBhY3BpX2lkbGVfc3RhdGUpOworCitlbnVtIHBjaV9mbGFnc19iaXQgeworCVBDSV9VU0VTX0lPPTEsIFBDSV9VU0VTX01FTT0yLCBQQ0lfVVNFU19NQVNURVI9NCwKKwlQQ0lfQUREUjA9MHgxMDw8MCwgUENJX0FERFIxPTB4MTA8PDEsIFBDSV9BRERSMj0weDEwPDwyLCBQQ0lfQUREUjM9MHgxMDw8MywKK307CisKKy8qIE9mZnNldHMgdG8gdGhlIHZhcmlvdXMgcmVnaXN0ZXJzLgorICAgQWxsIGFjY2Vzc2VzIG5lZWQgbm90IGJlIGxvbmd3b3JkIGFsaWduZWQuICovCitlbnVtIHNwZWVkb19vZmZzZXRzIHsKKwlTQ0JTdGF0dXMgPSAwLCBTQ0JDbWQgPSAyLAkvKiBSeC9Db21tYW5kIFVuaXQgY29tbWFuZCBhbmQgc3RhdHVzLiAqLworCVNDQkludG1hc2sgPSAzLAorCVNDQlBvaW50ZXIgPSA0LAkJCQkvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlci4gKi8KKwlTQ0JQb3J0ID0gOCwJCQkJLyogTWlzYy4gY29tbWFuZHMgYW5kIG9wZXJhbmRzLiAgKi8KKwlTQ0JmbGFzaCA9IDEyLCBTQ0JlZXByb20gPSAxNCwgLyogRUVQUk9NIGFuZCBmbGFzaCBtZW1vcnkgY29udHJvbC4gKi8KKwlTQ0JDdHJsTURJID0gMTYsCQkJLyogTURJIGludGVyZmFjZSBjb250cm9sLiAqLworCVNDQkVhcmx5UnggPSAyMCwJCQkvKiBFYXJseSByZWNlaXZlIGJ5dGUgY291bnQuICovCit9OworLyogQ29tbWFuZHMgdGhhdCBjYW4gYmUgcHV0IGluIGEgY29tbWFuZCBsaXN0IGVudHJ5LiAqLworZW51bSBjb21tYW5kcyB7CisJQ21kTk9wID0gMCwgQ21kSUFTZXR1cCA9IDB4MTAwMDAsIENtZENvbmZpZ3VyZSA9IDB4MjAwMDAsCisJQ21kTXVsdGljYXN0TGlzdCA9IDB4MzAwMDAsIENtZFR4ID0gMHg0MDAwMCwgQ21kVERSID0gMHg1MDAwMCwKKwlDbWREdW1wID0gMHg2MDAwMCwgQ21kRGlhZ25vc2UgPSAweDcwMDAwLAorCUNtZFN1c3BlbmQgPSAweDQwMDAwMDAwLAkvKiBTdXNwZW5kIGFmdGVyIGNvbXBsZXRpb24uICovCisJQ21kSW50ciA9IDB4MjAwMDAwMDAsCQkvKiBJbnRlcnJ1cHQgYWZ0ZXIgY29tcGxldGlvbi4gKi8KKwlDbWRUeEZsZXggPSAweDAwMDgwMDAwLAkJLyogVXNlICJGbGV4aWJsZSBtb2RlIiBmb3IgQ21kVHggY29tbWFuZC4gKi8KK307CisvKiBDbGVhciBDbWRTdXNwZW5kICgxPDwzMCkgYXZvaWRpbmcgaW50ZXJmZXJlbmNlIHdpdGggdGhlIGNhcmQgYWNjZXNzIHRvIHRoZQorICAgc3RhdHVzIGJpdHMuICBQcmV2aW91cyBkcml2ZXIgdmVyc2lvbnMgdXNlZCBzZXBhcmF0ZSAxNiBiaXQgZmllbGRzIGZvcgorICAgY29tbWFuZHMgYW5kIHN0YXR1c2VzLiAgLS1TQVcKKyAqLworI2lmIGRlZmluZWQoX19hbHBoYV9fKQorIyBkZWZpbmUgY2xlYXJfc3VzcGVuZChjbWQpICBjbGVhcl9iaXQoMzAsICYoY21kKS0+Y21kX3N0YXR1cyk7CisjZWxzZQorIyBpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKyMgIGRlZmluZSBjbGVhcl9zdXNwZW5kKGNtZCkgICgoX191MTYgKikmKGNtZCktPmNtZF9zdGF0dXMpWzFdICY9IH4weDQwMDAKKyMgZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKyMgIGRlZmluZSBjbGVhcl9zdXNwZW5kKGNtZCkgICgoX191MTYgKikmKGNtZCktPmNtZF9zdGF0dXMpWzFdICY9IH4weDAwNDAKKyMgZWxzZQorIyAgZXJyb3IgVW5zdXBwb3J0ZWQgYnl0ZW9yZGVyCisjIGVuZGlmCisjZW5kaWYKKworZW51bSBTQ0JDbWRCaXRzIHsKKwlTQ0JNYXNrQ21kRG9uZT0weDgwMDAsIFNDQk1hc2tSeERvbmU9MHg0MDAwLCBTQ0JNYXNrQ21kSWRsZT0weDIwMDAsCisJU0NCTWFza1J4U3VzcGVuZD0weDEwMDAsIFNDQk1hc2tFYXJseVJ4PTB4MDgwMCwgU0NCTWFza0Zsb3dDdGw9MHgwNDAwLAorCVNDQlRyaWdnZXJJbnRyPTB4MDIwMCwgU0NCTWFza0FsbD0weDAxMDAsCisJLyogVGhlIHJlc3QgYXJlIFJ4IGFuZCBUeCBjb21tYW5kcy4gKi8KKwlDVVN0YXJ0PTB4MDAxMCwgQ1VSZXN1bWU9MHgwMDIwLCBDVVN0YXRzQWRkcj0weDAwNDAsIENVU2hvd1N0YXRzPTB4MDA1MCwKKwlDVUNtZEJhc2U9MHgwMDYwLAkvKiBDVSBCYXNlIGFkZHJlc3MgKHNldCB0byB6ZXJvKSAuICovCisJQ1VEdW1wU3RhdHM9MHgwMDcwLCAvKiBEdW1wIHRoZW4gcmVzZXQgc3RhdHMgY291bnRlcnMuICovCisJUnhTdGFydD0weDAwMDEsIFJ4UmVzdW1lPTB4MDAwMiwgUnhBYm9ydD0weDAwMDQsIFJ4QWRkckxvYWQ9MHgwMDA2LAorCVJ4UmVzdW1lTm9SZXNvdXJjZXM9MHgwMDA3LAorfTsKKworZW51bSBTQ0JQb3J0X2NtZHMgeworCVBvcnRSZXNldD0wLCBQb3J0U2VsZlRlc3Q9MSwgUG9ydFBhcnRpYWxSZXNldD0yLCBQb3J0RHVtcD0zLAorfTsKKworLyogVGhlIFNwZWVkbzMgUnggYW5kIFR4IGZyYW1lL2J1ZmZlciBkZXNjcmlwdG9ycy4gKi8KK3N0cnVjdCBkZXNjcmlwdG9yIHsJCQkgICAgLyogQSBnZW5lcmljIGRlc2NyaXB0b3IuICovCisJdm9sYXRpbGUgczMyIGNtZF9zdGF0dXM7CS8qIEFsbCBjb21tYW5kIGFuZCBzdGF0dXMgZmllbGRzLiAqLworCXUzMiBsaW5rOwkJCQkgICAgLyogc3RydWN0IGRlc2NyaXB0b3IgKiAgKi8KKwl1bnNpZ25lZCBjaGFyIHBhcmFtc1swXTsKK307CisKKy8qIFRoZSBTcGVlZG8zIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3QgUnhGRCB7CQkJCQkvKiBSZWNlaXZlIGZyYW1lIGRlc2NyaXB0b3IuICovCisJdm9sYXRpbGUgczMyIHN0YXR1czsKKwl1MzIgbGluazsJCQkJCS8qIHN0cnVjdCBSeEZEICogKi8KKwl1MzIgcnhfYnVmX2FkZHI7CQkJLyogdm9pZCAqICovCisJdTMyIGNvdW50OworfSBSeEZEX0FMSUdOTUVOVDsKKworLyogU2VsZWN0ZWQgZWxlbWVudHMgb2YgdGhlIFR4L1J4RkQuc3RhdHVzIHdvcmQuICovCitlbnVtIFJ4RkRfYml0cyB7CisJUnhDb21wbGV0ZT0weDgwMDAsIFJ4T0s9MHgyMDAwLAorCVJ4RXJyQ1JDPTB4MDgwMCwgUnhFcnJBbGlnbj0weDA0MDAsIFJ4RXJyVG9vQmlnPTB4MDIwMCwgUnhFcnJTeW1ib2w9MHgwMDEwLAorCVJ4RXRoMlR5cGU9MHgwMDIwLCBSeE5vTWF0Y2g9MHgwMDA0LCBSeE5vSUFNYXRjaD0weDAwMDIsCisJVHhVbmRlcnJ1bj0weDEwMDAsICBTdGF0dXNDb21wbGV0ZT0weDgwMDAsCit9OworCisjZGVmaW5lIENPTkZJR19EQVRBX1NJWkUgMjIKK3N0cnVjdCBUeEZEIHsJCQkJCS8qIFRyYW5zbWl0IGZyYW1lIGRlc2NyaXB0b3Igc2V0LiAqLworCXMzMiBzdGF0dXM7CisJdTMyIGxpbms7CQkJCQkvKiB2b2lkICogKi8KKwl1MzIgdHhfZGVzY19hZGRyOwkJCS8qIEFsd2F5cyBwb2ludHMgdG8gdGhlIHR4X2J1Zl9hZGRyIGVsZW1lbnQuICovCisJczMyIGNvdW50OwkJCQkJLyogIyBvZiBUQkQgKD0xKSwgVHggc3RhcnQgdGhyZXNoLiwgZXRjLiAqLworCS8qIFRoaXMgY29uc3RpdHV0ZXMgdHdvICJUQkQiIGVudHJpZXMgLS0gd2Ugb25seSB1c2Ugb25lLiAqLworI2RlZmluZSBUWF9ERVNDUl9CVUZfT0ZGU0VUIDE2CisJdTMyIHR4X2J1Zl9hZGRyMDsJCQkvKiB2b2lkICosIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkLiAgKi8KKwlzMzIgdHhfYnVmX3NpemUwOwkJCS8qIExlbmd0aCBvZiBUeCBmcmFtZS4gKi8KKwl1MzIgdHhfYnVmX2FkZHIxOwkJCS8qIHZvaWQgKiwgZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQuICAqLworCXMzMiB0eF9idWZfc2l6ZTE7CQkJLyogTGVuZ3RoIG9mIFR4IGZyYW1lLiAqLworCS8qIHRoZSBzdHJ1Y3R1cmUgbXVzdCBoYXZlIHNwYWNlIGZvciBhdCBsZWFzdCBDT05GSUdfREFUQV9TSVpFIHN0YXJ0aW5nCisJICogZnJvbSB0eF9kZXNjX2FkZHIgZmllbGQgKi8KK307CisKKy8qIE11bHRpY2FzdCBmaWx0ZXIgc2V0dGluZyBibG9jay4gIC0tU0FXICovCitzdHJ1Y3Qgc3BlZWRvX21jX2Jsb2NrIHsKKwlzdHJ1Y3Qgc3BlZWRvX21jX2Jsb2NrICpuZXh0OworCXVuc2lnbmVkIGludCB0eDsKKwlkbWFfYWRkcl90IGZyYW1lX2RtYTsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXN0cnVjdCBkZXNjcmlwdG9yIGZyYW1lIF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXygxNikpKTsKK307CisKKy8qIEVsZW1lbnRzIG9mIHRoZSBkdW1wX3N0YXRpc3RpY3MgYmxvY2suIFRoaXMgYmxvY2sgbXVzdCBiZSBsd29yZCBhbGlnbmVkLiAqLworc3RydWN0IHNwZWVkb19zdGF0cyB7CisJdTMyIHR4X2dvb2RfZnJhbWVzOworCXUzMiB0eF9jb2xsMTZfZXJyczsKKwl1MzIgdHhfbGF0ZV9jb2xsczsKKwl1MzIgdHhfdW5kZXJydW5zOworCXUzMiB0eF9sb3N0X2NhcnJpZXI7CisJdTMyIHR4X2RlZmVycmVkOworCXUzMiB0eF9vbmVfY29sbHM7CisJdTMyIHR4X211bHRpX2NvbGxzOworCXUzMiB0eF90b3RhbF9jb2xsczsKKwl1MzIgcnhfZ29vZF9mcmFtZXM7CisJdTMyIHJ4X2NyY19lcnJzOworCXUzMiByeF9hbGlnbl9lcnJzOworCXUzMiByeF9yZXNvdXJjZV9lcnJzOworCXUzMiByeF9vdmVycnVuX2VycnM7CisJdTMyIHJ4X2NvbGxzX2VycnM7CisJdTMyIHJ4X3J1bnRfZXJyczsKKwl1MzIgZG9uZV9tYXJrZXI7Cit9OworCitlbnVtIFJ4X3Jpbmdfc3RhdGVfYml0cyB7CisJUnJOb01lbT0xLCBSclBvc3Rwb25lZD0yLCBSck5vUmVzb3VyY2VzPTQsIFJyT09NUmVwb3J0ZWQ9OCwKK307CisKKy8qIERvIG5vdCBjaGFuZ2UgdGhlIHBvc2l0aW9uIChhbGlnbm1lbnQpIG9mIHRoZSBmaXJzdCBmZXcgZWxlbWVudHMhCisgICBUaGUgbGF0ZXIgZWxlbWVudHMgYXJlIGdyb3VwZWQgZm9yIGNhY2hlIGxvY2FsaXR5LgorCisgICBVbmZvcnR1bmF0ZWx5LCBhbGwgdGhlIHBvc2l0aW9ucyBoYXZlIGJlZW4gc2hpZnRlZCBzaW5jZSB0aGVyZS4KKyAgIEEgbmV3IHJlLWFsaWdubWVudCBpcyByZXF1aXJlZC4gIDIwMDAvMDMvMDYgIFNBVyAqLworc3RydWN0IHNwZWVkb19wcml2YXRlIHsKKyAgICB2b2lkIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IFR4RkQJKnR4X3Jpbmc7CQkvKiBDb21tYW5kcyAodXN1YWxseSBDbWRUeFBhY2tldCkuICovCisJc3RydWN0IFJ4RkQgKnJ4X3JpbmdwW1JYX1JJTkdfU0laRV07CS8qIFJ4IGRlc2NyaXB0b3IsIHVzZWQgYXMgcmluZy4gKi8KKwkvKiBUaGUgYWRkcmVzc2VzIG9mIGEgVHgvUngtaW4tcGxhY2UgcGFja2V0cy9idWZmZXJzLiAqLworCXN0cnVjdCBza19idWZmICp0eF9za2J1ZmZbVFhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJLyogTWFwcGVkIGFkZHJlc3NlcyBvZiB0aGUgcmluZ3MuICovCisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKyNkZWZpbmUgVFhfUklOR19FTEVNX0RNQShzcCwgbikgKChzcCktPnR4X3JpbmdfZG1hICsgKG4pKnNpemVvZihzdHJ1Y3QgVHhGRCkpCisJZG1hX2FkZHJfdCByeF9yaW5nX2RtYVtSWF9SSU5HX1NJWkVdOworCXN0cnVjdCBkZXNjcmlwdG9yICpsYXN0X2NtZDsJCS8qIExhc3QgY29tbWFuZCBzZW50LiAqLworCXVuc2lnbmVkIGludCBjdXJfdHgsIGRpcnR5X3R4OwkJLyogVGhlIHJpbmcgZW50cmllcyB0byBiZSBmcmVlKCllZC4gKi8KKwlzcGlubG9ja190IGxvY2s7CQkJLyogR3JvdXAgd2l0aCBUeCBjb250cm9sIGNhY2hlIGxpbmUuICovCisJdTMyIHR4X3RocmVzaG9sZDsJCQkvKiBUaGUgdmFsdWUgZm9yIHR4ZGVzYy5jb3VudC4gKi8KKwlzdHJ1Y3QgUnhGRCAqbGFzdF9yeGY7CQkJLyogTGFzdCBmaWxsZWQgUlggYnVmZmVyLiAqLworCWRtYV9hZGRyX3QgbGFzdF9yeGZfZG1hOworCXVuc2lnbmVkIGludCBjdXJfcngsIGRpcnR5X3J4OwkJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCisJbG9uZyBsYXN0X3J4X3RpbWU7CQkJLyogTGFzdCBSeCwgaW4gamlmZmllcywgdG8gaGFuZGxlIFJ4IGhhbmcuICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHNwZWVkb19zdGF0cyAqbHN0YXRzOworCWRtYV9hZGRyX3QgbHN0YXRzX2RtYTsKKwlpbnQgY2hpcF9pZDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJCS8qIE1lZGlhIHNlbGVjdGlvbiB0aW1lci4gKi8KKwlzdHJ1Y3Qgc3BlZWRvX21jX2Jsb2NrICptY19zZXR1cF9oZWFkOwkvKiBNdWx0aWNhc3Qgc2V0dXAgZnJhbWUgbGlzdCBoZWFkLiAqLworCXN0cnVjdCBzcGVlZG9fbWNfYmxvY2sgKm1jX3NldHVwX3RhaWw7CS8qIE11bHRpY2FzdCBzZXR1cCBmcmFtZSBsaXN0IHRhaWwuICovCisJbG9uZyBpbl9pbnRlcnJ1cHQ7CQkJLyogV29yZC1hbGlnbmVkIGRldi0+aW50ZXJydXB0ICovCisJdW5zaWduZWQgY2hhciBhY3BpX3B3cjsKKwlzaWduZWQgY2hhciByeF9tb2RlOwkJCS8qIEN1cnJlbnQgUFJPTUlTQy9BTExNVUxUSSBzZXR0aW5nLiAqLworCXVuc2lnbmVkIGludCB0eF9mdWxsOjE7CQkJLyogVGhlIFR4IHF1ZXVlIGlzIGZ1bGwuICovCisJdW5zaWduZWQgaW50IGZsb3dfY3RybDoxOwkJLyogVXNlIDgwMi4zeCBmbG93IGNvbnRyb2wuICovCisJdW5zaWduZWQgaW50IHJ4X2J1ZzoxOwkJCS8qIFdvcmsgYXJvdW5kIHJlY2VpdmVyIGhhbmcgZXJyYXRhLiAqLworCXVuc2lnbmVkIGNoYXIgZGVmYXVsdF9wb3J0Ojg7CQkvKiBMYXN0IGRldi0+aWZfcG9ydCB2YWx1ZS4gKi8KKwl1bnNpZ25lZCBjaGFyIHJ4X3Jpbmdfc3RhdGU7CQkvKiBSWCByaW5nIHN0YXR1cyBmbGFncy4gKi8KKwl1bnNpZ25lZCBzaG9ydCBwaHlbMl07CQkJLyogUEhZIG1lZGlhIGludGVyZmFjZXMgYXZhaWxhYmxlLiAqLworCXVuc2lnbmVkIHNob3J0IHBhcnRuZXI7CQkJLyogTGluayBwYXJ0bmVyIGNhcHMuICovCisJc3RydWN0IG1paV9pZl9pbmZvIG1paV9pZjsJCS8qIE1JSSBBUEkgaG9va3MsIGluZm8gKi8KKwl1MzIgbXNnX2VuYWJsZTsJCQkJLyogZGVidWcgbWVzc2FnZSBsZXZlbCAqLworfTsKKworLyogVGhlIHBhcmFtZXRlcnMgZm9yIGEgQ21kQ29uZmlndXJlIG9wZXJhdGlvbi4KKyAgIFRoZXJlIGFyZSBzbyBtYW55IG9wdGlvbnMgdGhhdCBpdCB3b3VsZCBiZSBkaWZmaWN1bHQgdG8gZG9jdW1lbnQgZWFjaCBiaXQuCisgICBXZSBtb3N0bHkgdXNlIHRoZSBkZWZhdWx0IG9yIHJlY29tbWVuZGVkIHNldHRpbmdzLiAqLworc3RhdGljIGNvbnN0IGNoYXIgaTgyNTU3X2NvbmZpZ19jbWRbQ09ORklHX0RBVEFfU0laRV0gPSB7CisJMjIsIDB4MDgsIDAsIDAsICAwLCAwLCAweDMyLCAweDAzLCAgMSwgLyogMT1Vc2UgTUlJICAwPVVzZSBBVUkgKi8KKwkwLCAweDJFLCAwLCAgMHg2MCwgMCwKKwkweGYyLCAweDQ4LCAgIDAsIDB4NDAsIDB4ZjIsIDB4ODAsIAkJLyogMHg0MD1Gb3JjZSBmdWxsLWR1cGxleCAqLworCTB4M2YsIDB4MDUsIH07CitzdGF0aWMgY29uc3QgY2hhciBpODI1NThfY29uZmlnX2NtZFtDT05GSUdfREFUQV9TSVpFXSA9IHsKKwkyMiwgMHgwOCwgMCwgMSwgIDAsIDAsIDB4MjIsIDB4MDMsICAxLCAvKiAxPVVzZSBNSUkgIDA9VXNlIEFVSSAqLworCTAsIDB4MkUsIDAsICAweDYwLCAweDA4LCAweDg4LAorCTB4NjgsIDAsIDB4NDAsIDB4ZjIsIDB4ODQsCQkvKiBEaXNhYmxlIEZDICovCisJMHgzMSwgMHgwNSwgfTsKKworLyogUEhZIG1lZGlhIGludGVyZmFjZSBjaGlwcy4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICpwaHlzW10gPSB7CisJIk5vbmUiLCAiaTgyNTUzLUEvQiIsICJpODI1NTMtQyIsICJpODI1MDMiLAorCSJEUDgzODQwIiwgIjgwYzI0MCIsICI4MGMyNCIsICJpODI1NTUiLAorCSJ1bmtub3duLTgiLCAidW5rbm93bi05IiwgIkRQODM4NDBBIiwgInVua25vd24tMTEiLAorCSJ1bmtub3duLTEyIiwgInVua25vd24tMTMiLCAidW5rbm93bi0xNCIsICJ1bmtub3duLTE1IiwgfTsKK2VudW0gcGh5X2NoaXBzIHsgTm9uU3VjaFBoeT0wLCBJODI1NTNBQiwgSTgyNTUzQywgSTgyNTAzLCBEUDgzODQwLCBTODBDMjQwLAorCQkJCQkgUzgwQzI0LCBJODI1NTUsIERQODM4NDBBPTEwLCB9Oworc3RhdGljIGNvbnN0IGNoYXIgaXNfbWlpW10gPSB7IDAsIDEsIDEsIDAsIDEsIDEsIDAsIDEgfTsKKyNkZWZpbmUgRUVfUkVBRF9DTUQJCSg2KQorCitzdGF0aWMgaW50IGVlcHJvMTAwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKKworc3RhdGljIGludCBkb19lZXByb21fY21kKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgY21kLCBpbnQgY21kX2xlbik7CitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSk7CitzdGF0aWMgaW50IHNwZWVkb19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc3BlZWRvX3Jlc3VtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNwZWVkb190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgc3BlZWRvX2luaXRfcnhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNwZWVkb190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzcGVlZG9fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNwZWVkb19yZWZpbGxfcnhfYnVmZmVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZm9yY2UpOworc3RhdGljIGludCBzcGVlZG9fcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzcGVlZG9fdHhfYnVmZmVyX2djKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHNwZWVkb19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IHNwZWVkb19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3BlZWRvX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc3BlZWRvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzcGVlZG9fc2hvd19zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHM7CisKKwwKKworI2lmZGVmIGhvbm9yX2RlZmF1bHRfcG9ydAorLyogT3B0aW9uYWwgZHJpdmVyIGZlYXR1cmUgdG8gYWxsb3cgZm9yY2luZyB0aGUgdHJhbnNjZWl2ZXIgc2V0dGluZy4KKyAgIE5vdCByZWNvbW1lbmRlZC4gKi8KK3N0YXRpYyBpbnQgbWlpX2N0cmxbOF0gPSB7IDB4MzMwMCwgMHgzMTAwLCAweDAwMDAsIDB4MDEwMCwKKwkJCQkJCSAgIDB4MjAwMCwgMHgyMTAwLCAweDA0MDAsIDB4MzEwMH07CisjZW5kaWYKKworLyogSG93IHRvIHdhaXQgZm9yIHRoZSBjb21tYW5kIHVuaXQgdG8gYWNjZXB0IGEgY29tbWFuZC4KKyAgIFR5cGljYWxseSB0aGlzIHRha2VzIDAgdGlja3MuICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgd2FpdF9mb3JfY21kX2RvbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCQkJCQkJICAJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCkKK3sKKwlpbnQgd2FpdCA9IDEwMDA7CisJdm9pZCBfX2lvbWVtICpjbWRfaW9hZGRyID0gc3AtPnJlZ3MgKyBTQ0JDbWQ7CisJdW5zaWduZWQgY2hhciByOworCisJZG8gIHsKKwkJdWRlbGF5KDEpOworCQlyID0gaW9yZWFkOChjbWRfaW9hZGRyKTsKKwl9IHdoaWxlKHIgJiYgLS13YWl0ID49IDApOworCisJaWYgKHdhaXQgPCAwKQorCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IHdhaXRfZm9yX2NtZF9kb25lIHRpbWVvdXQhXG4iLCBkZXYtPm5hbWUpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlZXBybzEwMF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJaW50IGlycSwgcGNpX2JhcjsKKwlpbnQgYWNwaV9pZGxlX3N0YXRlID0gMCwgcG07CisJc3RhdGljIGludCBjYXJkc19mb3VuZCAvKiA9IDAgKi87CisJdW5zaWduZWQgbG9uZyBwY2lfYmFzZTsKKworI2lmbmRlZiBNT0RVTEUKKwkvKiB3aGVuIGJ1aWx0LWluLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisJc3RhdGljIGludCBkaWRfdmVyc2lvbjsKKwlpZiAoZGlkX3ZlcnNpb24rKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCS8qIHNhdmUgcG93ZXIgc3RhdGUgYmVmb3JlIHBjaV9lbmFibGVfZGV2aWNlIG92ZXJ3cml0ZXMgaXQgKi8KKwlwbSA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QTSk7CisJaWYgKHBtKSB7CisJCXUxNiBwd3JfY29tbWFuZDsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG0gKyBQQ0lfUE1fQ1RSTCwgJnB3cl9jb21tYW5kKTsKKwkJYWNwaV9pZGxlX3N0YXRlID0gcHdyX2NvbW1hbmQgJiBQQ0lfUE1fQ1RSTF9TVEFURV9NQVNLOworCX0KKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJZ290byBlcnJfb3V0X2ZyZWVfbW1pb19yZWdpb247CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmICghcmVxdWVzdF9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpLAorCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSwgImVlcHJvMTAwIikpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiZWVwcm8xMDA6IGNhbm5vdCByZXNlcnZlIEkvTyBwb3J0c1xuIik7CisJCWdvdG8gZXJyX291dF9ub25lOworCX0KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCisJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApLCAiZWVwcm8xMDAiKSkgeworCQlwcmludGsgKEtFUk5fRVJSICJlZXBybzEwMDogY2Fubm90IHJlc2VydmUgTU1JTyByZWdpb25cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9waW9fcmVnaW9uOworCX0KKworCWlycSA9IHBkZXYtPmlycTsKKwlwY2lfYmFyID0gdXNlX2lvID8gMSA6IDA7CisJcGNpX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgcGNpX2Jhcik7CisJaWYgKERFQlVHICYgTkVUSUZfTVNHX1BST0JFKQorCQlwcmludGsoIkZvdW5kIEludGVsIGk4MjU1NyBQQ0kgU3BlZWRvIGF0ICUjbHgsIElSUSAlZC5cbiIsCisJCSAgICAgICBwY2lfYmFzZSwgaXJxKTsKKworCWlvYWRkciA9IHBjaV9pb21hcChwZGV2LCBwY2lfYmFyLCAwKTsKKwlpZiAoIWlvYWRkcikgeworCQlwcmludGsgKEtFUk5fRVJSICJlZXBybzEwMDogY2Fubm90IHJlbWFwIElPXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbW1pb19yZWdpb247CisJfQorCisJaWYgKHNwZWVkb19mb3VuZDEocGRldiwgaW9hZGRyLCBjYXJkc19mb3VuZCwgYWNwaV9pZGxlX3N0YXRlKSA9PSAwKQorCQljYXJkc19mb3VuZCsrOworCWVsc2UKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9pb3VubWFwOiA7CisJcGNpX2lvdW5tYXAocGRldiwgaW9hZGRyKTsKK2Vycl9vdXRfZnJlZV9tbWlvX3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKK2Vycl9vdXRfZnJlZV9waW9fcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSk7CitlcnJfb3V0X25vbmU6CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyoKKyAqIFBvbGxpbmcgJ2ludGVycnVwdCcgLSB1c2VkIGJ5IHRoaW5ncyBsaWtlIG5ldGNvbnNvbGUgdG8gc2VuZCBza2JzCisgKiB3aXRob3V0IGhhdmluZyB0byByZS1lbmFibGUgaW50ZXJydXB0cy4gSXQncyBub3QgY2FsbGVkIHdoaWxlCisgKiB0aGUgaW50ZXJydXB0IHJvdXRpbmUgaXMgZXhlY3V0aW5nLgorICovCisKK3N0YXRpYyB2b2lkIHBvbGxfc3BlZWRvIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGRpc2FibGVfaXJxIGlzIG5vdCB2ZXJ5IG5pY2UsIGJ1dCB3aXRoIHRoZSBmdW5ueSBsb2NrbGVzcyBkZXNpZ24KKwkgICB3ZSBoYXZlIG5vIG90aGVyIGNob2ljZS4gKi8KKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJc3BlZWRvX2ludGVycnVwdCAoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgc3BlZWRvX2ZvdW5kMShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJdm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBjYXJkX2lkeCwgaW50IGFjcGlfaWRsZV9zdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3A7CisJY29uc3QgY2hhciAqcHJvZHVjdDsKKwlpbnQgaSwgb3B0aW9uOworCXUxNiBlZXByb21bMHgxMDBdOworCWludCBzaXplOworCXZvaWQgKnR4X3Jpbmdfc3BhY2U7CisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKworCXNpemUgPSBUWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IFR4RkQpICsgc2l6ZW9mKHN0cnVjdCBzcGVlZG9fc3RhdHMpOworCXR4X3Jpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplLCAmdHhfcmluZ19kbWEpOworCWlmICh0eF9yaW5nX3NwYWNlID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUpKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlZXBybzEwMDogQ291bGQgbm90IGFsbG9jYXRlIGV0aGVybmV0IGRldmljZS5cbiIpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemUsIHR4X3Jpbmdfc3BhY2UsIHR4X3JpbmdfZG1hKTsKKwkJcmV0dXJuIC0xOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJaWYgKGRldi0+bWVtX3N0YXJ0ID4gMCkKKwkJb3B0aW9uID0gZGV2LT5tZW1fc3RhcnQ7CisJZWxzZSBpZiAoY2FyZF9pZHggPj0gMCAgJiYgIG9wdGlvbnNbY2FyZF9pZHhdID49IDApCisJCW9wdGlvbiA9IG9wdGlvbnNbY2FyZF9pZHhdOworCWVsc2UKKwkJb3B0aW9uID0gMDsKKworCXJ0bmxfbG9jaygpOworCWlmIChkZXZfYWxsb2NfbmFtZShkZXYsIGRldi0+bmFtZSkgPCAwKSAKKwkJZ290byBlcnJfZnJlZV91bmxvY2s7CisKKwkvKiBSZWFkIHRoZSBzdGF0aW9uIGFkZHJlc3MgRUVQUk9NIGJlZm9yZSBkb2luZyB0aGUgcmVzZXQuCisJICAgTm9taW5hbGx5IGhpcyBzaG91bGQgZXZlbiBiZSBkb25lIGJlZm9yZSBhY2NlcHRpbmcgdGhlIGRldmljZSwgYnV0CisJICAgdGhlbiB3ZSB3b3VsZG4ndCBoYXZlIGEgZGV2aWNlIG5hbWUgd2l0aCB3aGljaCB0byByZXBvcnQgdGhlIGVycm9yLgorCSAgIFRoZSBzaXplIHRlc3QgaXMgZm9yIDYgYml0IHZzLiA4IGJpdCBhZGRyZXNzIHNlcmlhbCBFRVBST01zLgorCSovCisJeworCQl2b2lkIF9faW9tZW0gKmlvYmFzZTsKKwkJaW50IHJlYWRfY21kLCBlZV9zaXplOworCQl1MTYgc3VtOworCQlpbnQgajsKKworCQkvKiBVc2UgSU8gb25seSB0byBhdm9pZCBwb3N0cG9uZWQgd3JpdGVzIGFuZCBzYXRpc2Z5IEVFUFJPTSB0aW1pbmcKKwkJICAgcmVxdWlyZW1lbnRzLiAqLworCQlpb2Jhc2UgPSBwY2lfaW9tYXAocGRldiwgMSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSk7CisJCWlmICghaW9iYXNlKQorCQkJZ290byBlcnJfZnJlZV91bmxvY2s7CisJCWlmICgoZG9fZWVwcm9tX2NtZChpb2Jhc2UsIEVFX1JFQURfQ01EIDw8IDI0LCAyNykgJiAweGZmZTAwMDApCisJCQk9PSAweGZmZTAwMDApIHsKKwkJCWVlX3NpemUgPSAweDEwMDsKKwkJCXJlYWRfY21kID0gRUVfUkVBRF9DTUQgPDwgMjQ7CisJCX0gZWxzZSB7CisJCQllZV9zaXplID0gMHg0MDsKKwkJCXJlYWRfY21kID0gRUVfUkVBRF9DTUQgPDwgMjI7CisJCX0KKworCQlmb3IgKGogPSAwLCBpID0gMCwgc3VtID0gMDsgaSA8IGVlX3NpemU7IGkrKykgeworCQkJdTE2IHZhbHVlID0gZG9fZWVwcm9tX2NtZChpb2Jhc2UsIHJlYWRfY21kIHwgKGkgPDwgMTYpLCAyNyk7CisJCQllZXByb21baV0gPSB2YWx1ZTsKKwkJCXN1bSArPSB2YWx1ZTsKKwkJCWlmIChpIDwgMykgeworCQkJCWRldi0+ZGV2X2FkZHJbaisrXSA9IHZhbHVlOworCQkJCWRldi0+ZGV2X2FkZHJbaisrXSA9IHZhbHVlID4+IDg7CisJCQl9CisJCX0KKwkJaWYgKHN1bSAhPSAweEJBQkEpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW52YWxpZCBFRVBST00gY2hlY2tzdW0gJSM0LjR4LCAiCisJCQkJICAgImNoZWNrIHNldHRpbmdzIGJlZm9yZSBhY3RpdmF0aW5nIHRoaXMgZGV2aWNlIVxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHN1bSk7CisJCS8qIERvbid0ICB1bnJlZ2lzdGVyX25ldGRldihkZXYpOyAgYXMgdGhlIEVFUHJvIG1heSBhY3R1YWxseSBiZQorCQkgICB1c2FibGUsIGVzcGVjaWFsbHkgaWYgdGhlIE1BQyBhZGRyZXNzIGlzIHNldCBsYXRlci4KKwkJICAgT24gdGhlIG90aGVyIGhhbmQsIGl0IG1heSBiZSB1bnVzYWJsZSBpZiBNREkgZGF0YSBpcyBjb3JydXB0ZWQuICovCisKKwkJcGNpX2lvdW5tYXAocGRldiwgaW9iYXNlKTsKKwl9CisKKwkvKiBSZXNldCB0aGUgY2hpcDogc3RvcCBUeCBhbmQgUnggcHJvY2Vzc2VzIGFuZCBjbGVhciBjb3VudGVycy4KKwkgICBUaGlzIHRha2VzIGxlc3MgdGhhbiAxMHVzZWMgYW5kIHdpbGwgZWFzaWx5IGZpbmlzaCBiZWZvcmUgdGhlIG5leHQKKwkgICBhY3Rpb24uICovCisJaW93cml0ZTMyKFBvcnRSZXNldCwgaW9hZGRyICsgU0NCUG9ydCk7CisJaW9yZWFkMzIoaW9hZGRyICsgU0NCUG9ydCk7CisJdWRlbGF5KDEwKTsKKworCWlmIChlZXByb21bM10gJiAweDAxMDApCisJCXByb2R1Y3QgPSAiT0VNIGk4MjU1Ny9pODI1NTggMTAvMTAwIEV0aGVybmV0IjsKKwllbHNlCisJCXByb2R1Y3QgPSBwY2lfbmFtZShwZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcywgIiwgZGV2LT5uYW1lLCBwcm9kdWN0KTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCXByaW50aygiJTIuMlg6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIlMi4yWCwgIiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCJJUlEgJWQuXG4iLCBwZGV2LT5pcnEpOworCisJc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogd2UgbXVzdCBpbml0aWFsaXplIHRoaXMgZWFybHksIGZvciBtZGlvX3tyZWFkLHdyaXRlfSAqLworCXNwLT5yZWdzID0gaW9hZGRyOworCisjaWYgMSB8fCBkZWZpbmVkKGtlcm5lbF9ibG9hdCkKKwkvKiBPSywgdGhpcyBpcyBwdXJlIGtlcm5lbCBibG9hdC4gIEkgZG9uJ3QgbGlrZSBpdCB3aGVuIG90aGVyIGRyaXZlcnMKKwkgICB3YXN0ZSBub24tcGFnZWFibGUga2VybmVsIHNwYWNlIHRvIGVtaXQgc2ltaWxhciBtZXNzYWdlcywgYnV0IEkgbmVlZAorCSAgIHRoZW0gZm9yIGJ1ZyByZXBvcnRzLiAqLworCXsKKwkJY29uc3QgY2hhciAqY29ubmVjdG9yc1tdID0geyIgUko0NSIsICIgQk5DIiwgIiBBVUkiLCAiIE1JSSJ9OworCQkvKiBUaGUgc2VsZi10ZXN0IHJlc3VsdHMgbXVzdCBiZSBwYXJhZ3JhcGggYWxpZ25lZC4gKi8KKwkJdm9sYXRpbGUgczMyICpzZWxmX3Rlc3RfcmVzdWx0czsKKwkJaW50IGJvZ3VzY250ID0gMTYwMDA7CS8qIFRpbWVvdXQgZm9yIHNldC10ZXN0LiAqLworCQlpZiAoKGVlcHJvbVszXSAmIDB4MDMpICE9IDB4MDMpCisJCQlwcmludGsoS0VSTl9JTkZPICIgIFJlY2VpdmVyIGxvY2stdXAgYnVnIGV4aXN0cyAtLSBlbmFibGluZyIKKwkJCQkgICAiIHdvcmstYXJvdW5kLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIiAgQm9hcmQgYXNzZW1ibHkgJTQuNHglMi4yeC0lMy4zZCwgUGh5c2ljYWwiCisJCQkgICAiIGNvbm5lY3RvcnMgcHJlc2VudDoiLAorCQkJICAgZWVwcm9tWzhdLCBlZXByb21bOV0+PjgsIGVlcHJvbVs5XSAmIDB4ZmYpOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJaWYgKGVlcHJvbVs1XSAmICgxPDxpKSkKKwkJCQlwcmludGsoY29ubmVjdG9yc1tpXSk7CisJCXByaW50aygiXG4iS0VSTl9JTkZPIiAgUHJpbWFyeSBpbnRlcmZhY2UgY2hpcCAlcyBQSFkgIyVkLlxuIiwKKwkJCSAgIHBoeXNbKGVlcHJvbVs2XT4+OCkmMTVdLCBlZXByb21bNl0gJiAweDFmKTsKKwkJaWYgKGVlcHJvbVs3XSAmIDB4MDcwMCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiAgICBTZWNvbmRhcnkgaW50ZXJmYWNlIGNoaXAgJXMuXG4iLAorCQkJCSAgIHBoeXNbKGVlcHJvbVs3XT4+OCkmN10pOworCQlpZiAoKChlZXByb21bNl0+PjgpICYgMHgzZikgPT0gRFA4Mzg0MAorCQkJfHwgICgoZWVwcm9tWzZdPj44KSAmIDB4M2YpID09IERQODM4NDBBKSB7CisJCQlpbnQgbWRpX3JlZzIzID0gbWRpb19yZWFkKGRldiwgZWVwcm9tWzZdICYgMHgxZiwgMjMpIHwgMHgwNDIyOworCQkJaWYgKGNvbmdlbmIpCisJCQkgIG1kaV9yZWcyMyB8PSAweDAxMDA7CisJCQlwcmludGsoS0VSTl9JTkZPIiAgRFA4Mzg0MCBzcGVjaWZpYyBzZXR1cCwgc2V0dGluZyByZWdpc3RlciAyMyB0byAlNC40eC5cbiIsCisJCQkJICAgbWRpX3JlZzIzKTsKKwkJCW1kaW9fd3JpdGUoZGV2LCBlZXByb21bNl0gJiAweDFmLCAyMywgbWRpX3JlZzIzKTsKKwkJfQorCQlpZiAoKG9wdGlvbiA+PSAwKSAmJiAob3B0aW9uICYgMHg3MCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiAgRm9yY2luZyAlZE1icyAlcy1kdXBsZXggb3BlcmF0aW9uLlxuIiwKKwkJCQkgICAob3B0aW9uICYgMHgyMCA/IDEwMCA6IDEwKSwKKwkJCQkgICAob3B0aW9uICYgMHgxMCA/ICJmdWxsIiA6ICJoYWxmIikpOworCQkJbWRpb193cml0ZShkZXYsIGVlcHJvbVs2XSAmIDB4MWYsIE1JSV9CTUNSLAorCQkJCQkgICAoKG9wdGlvbiAmIDB4MjApID8gMHgyMDAwIDogMCkgfCAJLyogMTAwbWJwcz8gKi8KKwkJCQkJICAgKChvcHRpb24gJiAweDEwKSA/IDB4MDEwMCA6IDApKTsgLyogRnVsbCBkdXBsZXg/ICovCisJCX0KKworCQkvKiBQZXJmb3JtIGEgc3lzdGVtIHNlbGYtdGVzdC4gKi8KKwkJc2VsZl90ZXN0X3Jlc3VsdHMgPSAoczMyKikgKCgoKGxvbmcpIHR4X3Jpbmdfc3BhY2UpICsgMTUpICYgfjB4Zik7CisJCXNlbGZfdGVzdF9yZXN1bHRzWzBdID0gMDsKKwkJc2VsZl90ZXN0X3Jlc3VsdHNbMV0gPSAtMTsKKwkJaW93cml0ZTMyKHR4X3JpbmdfZG1hIHwgUG9ydFNlbGZUZXN0LCBpb2FkZHIgKyBTQ0JQb3J0KTsKKwkJZG8geworCQkJdWRlbGF5KDEwKTsKKwkJfSB3aGlsZSAoc2VsZl90ZXN0X3Jlc3VsdHNbMV0gPT0gLTEgICYmICAtLWJvZ3VzY250ID49IDApOworCisJCWlmIChib2d1c2NudCA8IDApIHsJCS8qIFRlc3Qgb3B0aW1pemVkIG91dC4gKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiU2VsZiB0ZXN0IGZhaWxlZCwgc3RhdHVzICU4Ljh4OlxuIgorCQkJCSAgIEtFUk5fRVJSICIgRmFpbHVyZSB0byBpbml0aWFsaXplIHRoZSBpODI1NTcuXG4iCisJCQkJICAgS0VSTl9FUlIgIiBWZXJpZnkgdGhhdCB0aGUgY2FyZCBpcyBhIGJ1cy1tYXN0ZXIiCisJCQkJICAgIiBjYXBhYmxlIHNsb3QuXG4iLAorCQkJCSAgIHNlbGZfdGVzdF9yZXN1bHRzWzFdKTsKKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICIgIEdlbmVyYWwgc2VsZi10ZXN0OiAlcy5cbiIKKwkJCQkgICBLRVJOX0lORk8gIiAgU2VyaWFsIHN1Yi1zeXN0ZW0gc2VsZi10ZXN0OiAlcy5cbiIKKwkJCQkgICBLRVJOX0lORk8gIiAgSW50ZXJuYWwgcmVnaXN0ZXJzIHNlbGYtdGVzdDogJXMuXG4iCisJCQkJICAgS0VSTl9JTkZPICIgIFJPTSBjaGVja3N1bSBzZWxmLXRlc3Q6ICVzICglIzguOHgpLlxuIiwKKwkJCQkgICBzZWxmX3Rlc3RfcmVzdWx0c1sxXSAmIDB4MTAwMCA/ICJmYWlsZWQiIDogInBhc3NlZCIsCisJCQkJICAgc2VsZl90ZXN0X3Jlc3VsdHNbMV0gJiAweDAwMjAgPyAiZmFpbGVkIiA6ICJwYXNzZWQiLAorCQkJCSAgIHNlbGZfdGVzdF9yZXN1bHRzWzFdICYgMHgwMDA4ID8gImZhaWxlZCIgOiAicGFzc2VkIiwKKwkJCQkgICBzZWxmX3Rlc3RfcmVzdWx0c1sxXSAmIDB4MDAwNCA/ICJmYWlsZWQiIDogInBhc3NlZCIsCisJCQkJICAgc2VsZl90ZXN0X3Jlc3VsdHNbMF0pOworCX0KKyNlbmRpZiAgLyoga2VybmVsX2Jsb2F0ICovCisKKwlpb3dyaXRlMzIoUG9ydFJlc2V0LCBpb2FkZHIgKyBTQ0JQb3J0KTsKKwlpb3JlYWQzMihpb2FkZHIgKyBTQ0JQb3J0KTsKKwl1ZGVsYXkoMTApOworCisJLyogUmV0dXJuIHRoZSBjaGlwIHRvIGl0cyBvcmlnaW5hbCBwb3dlciBzdGF0ZS4gKi8KKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIGFjcGlfaWRsZV9zdGF0ZSk7CisKKwlwY2lfc2V0X2RydmRhdGEgKHBkZXYsIGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWRldi0+aXJxID0gcGRldi0+aXJxOworCisJc3AtPnBkZXYgPSBwZGV2OworCXNwLT5tc2dfZW5hYmxlID0gREVCVUc7CisJc3AtPmFjcGlfcHdyID0gYWNwaV9pZGxlX3N0YXRlOworCXNwLT50eF9yaW5nID0gdHhfcmluZ19zcGFjZTsKKwlzcC0+dHhfcmluZ19kbWEgPSB0eF9yaW5nX2RtYTsKKwlzcC0+bHN0YXRzID0gKHN0cnVjdCBzcGVlZG9fc3RhdHMgKikoc3AtPnR4X3JpbmcgKyBUWF9SSU5HX1NJWkUpOworCXNwLT5sc3RhdHNfZG1hID0gVFhfUklOR19FTEVNX0RNQShzcCwgVFhfUklOR19TSVpFKTsKKwlpbml0X3RpbWVyKCZzcC0+dGltZXIpOyAvKiB1c2VkIGluIGlvY3RsKCkgKi8KKwlzcGluX2xvY2tfaW5pdCgmc3AtPmxvY2spOworCisJc3AtPm1paV9pZi5mdWxsX2R1cGxleCA9IG9wdGlvbiA+PSAwICYmIChvcHRpb24gJiAweDEwKSA/IDEgOiAwOworCWlmIChjYXJkX2lkeCA+PSAwKSB7CisJCWlmIChmdWxsX2R1cGxleFtjYXJkX2lkeF0gPj0gMCkKKwkJCXNwLT5taWlfaWYuZnVsbF9kdXBsZXggPSBmdWxsX2R1cGxleFtjYXJkX2lkeF07CisJfQorCXNwLT5kZWZhdWx0X3BvcnQgPSBvcHRpb24gPj0gMCA/IChvcHRpb24gJiAweDBmKSA6IDA7CisKKwlzcC0+cGh5WzBdID0gZWVwcm9tWzZdOworCXNwLT5waHlbMV0gPSBlZXByb21bN107CisKKwlzcC0+bWlpX2lmLnBoeV9pZCA9IGVlcHJvbVs2XSAmIDB4MWY7CisJc3AtPm1paV9pZi5waHlfaWRfbWFzayA9IDB4MWY7CisJc3AtPm1paV9pZi5yZWdfbnVtX21hc2sgPSAweDFmOworCXNwLT5taWlfaWYuZGV2ID0gZGV2OworCXNwLT5taWlfaWYubWRpb19yZWFkID0gbWRpb19yZWFkOworCXNwLT5taWlfaWYubWRpb193cml0ZSA9IG1kaW9fd3JpdGU7CisJCisJc3AtPnJ4X2J1ZyA9IChlZXByb21bM10gJiAweDAzKSA9PSAzID8gMCA6IDE7CisJaWYgKCgocGRldi0+ZGV2aWNlID4gMHgxMDMwICYmIChwZGV2LT5kZXZpY2UgPCAweDEwM0YpKSkgCisJICAgIHx8IChwZGV2LT5kZXZpY2UgPT0gMHgyNDQ5KSB8fCAocGRldi0+ZGV2aWNlID09IDB4MjQ1OSkgCisgICAgICAgICAgICB8fCAocGRldi0+ZGV2aWNlID09IDB4MjQ1RCkpIHsKKwkgICAgCXNwLT5jaGlwX2lkID0gMTsKKwl9CisKKwlpZiAoc3AtPnJ4X2J1ZykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICBSZWNlaXZlciBsb2NrLXVwIHdvcmthcm91bmQgYWN0aXZhdGVkLlxuIik7CisKKwkvKiBUaGUgU3BlZWRvLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuID0gJnNwZWVkb19vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnNwZWVkb19zdGFydF94bWl0OworCW5ldGlmX3NldF90eF90aW1lb3V0KGRldiwgJnNwZWVkb190eF90aW1lb3V0LCBUWF9USU1FT1VUKTsKKwlkZXYtPnN0b3AgPSAmc3BlZWRvX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJnNwZWVkb19nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7CisJZGV2LT5kb19pb2N0bCA9ICZzcGVlZG9faW9jdGw7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmV0aHRvb2xfb3BzKTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gJnBvbGxfc3BlZWRvOworI2VuZGlmCisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2aWNlKGRldikpCisJCWdvdG8gZXJyX2ZyZWVfdW5sb2NrOworCXJ0bmxfdW5sb2NrKCk7CisKKwlyZXR1cm4gMDsKKworIGVycl9mcmVlX3VubG9jazoKKwlydG5sX3VubG9jaygpOworCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBkb19zbG93X2NvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCwgaW50IGNtZCkKK3sKKwl2b2lkIF9faW9tZW0gKmNtZF9pb2FkZHIgPSBzcC0+cmVncyArIFNDQkNtZDsKKwlpbnQgd2FpdCA9IDA7CisJZG8KKwkJaWYgKGlvcmVhZDgoY21kX2lvYWRkcikgPT0gMCkgYnJlYWs7CisJd2hpbGUoKyt3YWl0IDw9IDIwMCk7CisJaWYgKHdhaXQgPiAxMDApCisJCXByaW50ayhLRVJOX0VSUiAiQ29tbWFuZCAlNC40eCBuZXZlciBhY2NlcHRlZCAoJWQgcG9sbHMpIVxuIiwKKwkJICAgICAgIGlvcmVhZDgoY21kX2lvYWRkciksIHdhaXQpOworCisJaW93cml0ZTgoY21kLCBjbWRfaW9hZGRyKTsKKworCWZvciAod2FpdCA9IDA7IHdhaXQgPD0gMTAwOyB3YWl0KyspCisJCWlmIChpb3JlYWQ4KGNtZF9pb2FkZHIpID09IDApIHJldHVybjsKKwlmb3IgKDsgd2FpdCA8PSAyMDAwMDsgd2FpdCsrKQorCQlpZiAoaW9yZWFkOChjbWRfaW9hZGRyKSA9PSAwKSByZXR1cm47CisJCWVsc2UgdWRlbGF5KDEpOworCXByaW50ayhLRVJOX0VSUiAiQ29tbWFuZCAlNC40eCB3YXMgbm90IGFjY2VwdGVkIGFmdGVyICVkIHBvbGxzISIKKwkgICAgICAgIiAgQ3VycmVudCBzdGF0dXMgJTguOHguXG4iLAorCSAgICAgICBjbWQsIHdhaXQsIGlvcmVhZDMyKHNwLT5yZWdzICsgU0NCU3RhdHVzKSk7Cit9CisKKy8qIFNlcmlhbCBFRVBST00gc2VjdGlvbi4KKyAgIEEgImJpdCIgZ3J1bmd5LCBidXQgd2Ugd29yayBvdXIgd2F5IHRocm91Z2ggYml0LWJ5LWJpdCA6LT4uICovCisvKiAgRUVQUk9NX0N0cmwgYml0cy4gKi8KKyNkZWZpbmUgRUVfU0hJRlRfQ0xLCTB4MDEJLyogRUVQUk9NIHNoaWZ0IGNsb2NrLiAqLworI2RlZmluZSBFRV9DUwkJCTB4MDIJLyogRUVQUk9NIGNoaXAgc2VsZWN0LiAqLworI2RlZmluZSBFRV9EQVRBX1dSSVRFCTB4MDQJLyogRUVQUk9NIGNoaXAgZGF0YSBpbi4gKi8KKyNkZWZpbmUgRUVfREFUQV9SRUFECTB4MDgJLyogRUVQUk9NIGNoaXAgZGF0YSBvdXQuICovCisjZGVmaW5lIEVFX0VOQgkJCSgweDQ4MDAgfCBFRV9DUykKKyNkZWZpbmUgRUVfV1JJVEVfMAkJMHg0ODAyCisjZGVmaW5lIEVFX1dSSVRFXzEJCTB4NDgwNgorI2RlZmluZSBFRV9PRkZTRVQJCVNDQmVlcHJvbQorCisvKiBUaGUgZml4ZXMgZm9yIHRoZSBjb2RlIHdlcmUga2luZGx5IHByb3ZpZGVkIGJ5IERyYWdhbiBTdGFuY2V2aWMKKyAgIDx2aXNpdG9yQHZhbGludXguY29tPiB0byBzdHJpY3RseSBmb2xsb3cgSW50ZWwgc3BlY2lmaWNhdGlvbnMgb2YgRUVQUk9NCisgICBhY2Nlc3MgdGltaW5nLgorICAgVGhlIHB1YmxpY2x5IGF2YWlsYWJsZSBzaGVldCA2NDQ4NjMwMiAoc2VjLiAzLjEpIHNwZWNpZmllcyAxdXMgYWNjZXNzCisgICBpbnRlcnZhbCBmb3Igc2VyaWFsIEVFUFJPTS4gIEhvd2V2ZXIsIGl0IGxvb2tzIGxpa2UgdGhhdCB0aGVyZSBpcyBhbgorICAgYWRkaXRpb25hbCByZXF1aXJlbWVudCBkaWN0YXRpbmcgbGFyZ2VyIHVkZWxheSdzIGluIHRoZSBjb2RlIGJlbG93LgorICAgMjAwMC8wNS8yNCAgU0FXICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkb19lZXByb21fY21kKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgY21kLCBpbnQgY21kX2xlbikKK3sKKwl1bnNpZ25lZCByZXR2YWwgPSAwOworCXZvaWQgX19pb21lbSAqZWVfYWRkciA9IGlvYWRkciArIFNDQmVlcHJvbTsKKworCWlvd3JpdGUxNihFRV9FTkIsIGVlX2FkZHIpOyB1ZGVsYXkoMik7CisJaW93cml0ZTE2KEVFX0VOQiB8IEVFX1NISUZUX0NMSywgZWVfYWRkcik7IHVkZWxheSgyKTsKKworCS8qIFNoaWZ0IHRoZSBjb21tYW5kIGJpdHMgb3V0LiAqLworCWRvIHsKKwkJc2hvcnQgZGF0YXZhbCA9IChjbWQgJiAoMSA8PCBjbWRfbGVuKSkgPyBFRV9XUklURV8xIDogRUVfV1JJVEVfMDsKKwkJaW93cml0ZTE2KGRhdGF2YWwsIGVlX2FkZHIpOyB1ZGVsYXkoMik7CisJCWlvd3JpdGUxNihkYXRhdmFsIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsgdWRlbGF5KDIpOworCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpb3JlYWQxNihlZV9hZGRyKSAmIEVFX0RBVEFfUkVBRCkgPyAxIDogMCk7CisJfSB3aGlsZSAoLS1jbWRfbGVuID49IDApOworCWlvd3JpdGUxNihFRV9FTkIsIGVlX2FkZHIpOyB1ZGVsYXkoMik7CisKKwkvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisJaW93cml0ZTE2KEVFX0VOQiAmIH5FRV9DUywgZWVfYWRkcik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gc3AtPnJlZ3M7CisJaW50IHZhbCwgYm9ndXNjbnQgPSA2NCoxMDsJCS8qIDw2NCB1c2VjLiB0byBjb21wbGV0ZSwgdHlwIDI3IHRpY2tzICovCisJaW93cml0ZTMyKDB4MDgwMDAwMDAgfCAobG9jYXRpb248PDE2KSB8IChwaHlfaWQ8PDIxKSwgaW9hZGRyICsgU0NCQ3RybE1ESSk7CisJZG8geworCQl2YWwgPSBpb3JlYWQzMihpb2FkZHIgKyBTQ0JDdHJsTURJKTsKKwkJaWYgKC0tYm9ndXNjbnQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiBtZGlvX3JlYWQoKSB0aW1lZCBvdXQgd2l0aCB2YWwgPSAlOC44eC5cbiIsIHZhbCk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCEgKHZhbCAmIDB4MTAwMDAwMDApKTsKKwlyZXR1cm4gdmFsICYgMHhmZmZmOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gc3AtPnJlZ3M7CisJaW50IHZhbCwgYm9ndXNjbnQgPSA2NCoxMDsJCS8qIDw2NCB1c2VjLiB0byBjb21wbGV0ZSwgdHlwIDI3IHRpY2tzICovCisJaW93cml0ZTMyKDB4MDQwMDAwMDAgfCAobG9jYXRpb248PDE2KSB8IChwaHlfaWQ8PDIxKSB8IHZhbHVlLAorCQkgaW9hZGRyICsgU0NCQ3RybE1ESSk7CisJZG8geworCQl2YWwgPSBpb3JlYWQzMihpb2FkZHIgKyBTQ0JDdHJsTURJKTsKKwkJaWYgKC0tYm9ndXNjbnQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIiIG1kaW9fd3JpdGUoKSB0aW1lZCBvdXQgd2l0aCB2YWwgPSAlOC44eC5cbiIsIHZhbCk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCEgKHZhbCAmIDB4MTAwMDAwMDApKTsKK30KKworc3RhdGljIGludAorc3BlZWRvX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHNwLT5yZWdzOworCWludCByZXR2YWw7CisKKwlpZiAobmV0aWZfbXNnX2lmdXAoc3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNwZWVkb19vcGVuKCkgaXJxICVkLlxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHNwLT5wZGV2LCBQQ0lfRDApOworCisJLyogU2V0IHVwIHRoZSBUeCBxdWV1ZSBlYXJseS4uICovCisJc3AtPmN1cl90eCA9IDA7CisJc3AtPmRpcnR5X3R4ID0gMDsKKwlzcC0+bGFzdF9jbWQgPSBOVUxMOworCXNwLT50eF9mdWxsID0gMDsKKwlzcC0+aW5faW50ZXJydXB0ID0gMDsKKworCS8qIC4uIHdlIGNhbiBzYWZlbHkgdGFrZSBoYW5kbGVyIGNhbGxzIGR1cmluZyBpbml0LiAqLworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmc3BlZWRvX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJZGV2LT5pZl9wb3J0ID0gc3AtPmRlZmF1bHRfcG9ydDsKKworI2lmZGVmIG9oX25vX3lvdV9kb250X3VubGVzc195b3VfaG9ub3VyX3RoZV9vcHRpb25zX3Bhc3NlZF9pbl90b191cworCS8qIFJldHJpZ2dlciBuZWdvdGlhdGlvbiB0byByZXNldCBwcmV2aW91cyBlcnJvcnMuICovCisJaWYgKChzcC0+cGh5WzBdICYgMHg4MDAwKSA9PSAwKSB7CisJCWludCBwaHlfYWRkciA9IHNwLT5waHlbMF0gJiAweDFmIDsKKwkJLyogVXNlIDB4MzMwMCBmb3IgcmVzdGFydGluZyBOV2F5LCBvdGhlciB2YWx1ZXMgdG8gZm9yY2UgeGN2cjoKKwkJICAgMHgwMDAwIDEwLUhECisJCSAgIDB4MDEwMCAxMC1GRAorCQkgICAweDIwMDAgMTAwLUhECisJCSAgIDB4MjEwMCAxMDAtRkQKKwkJKi8KKyNpZmRlZiBob25vcl9kZWZhdWx0X3BvcnQKKwkJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQk1DUiwgbWlpX2N0cmxbZGV2LT5kZWZhdWx0X3BvcnQgJiA3XSk7CisjZWxzZQorCQltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9CTUNSLCAweDMzMDApOworI2VuZGlmCisJfQorI2VuZGlmCisKKwlzcGVlZG9faW5pdF9yeF9yaW5nKGRldik7CisKKwkvKiBGaXJlIHVwIHRoZSBoYXJkd2FyZS4gKi8KKwlpb3dyaXRlMTYoU0NCTWFza0FsbCwgaW9hZGRyICsgU0NCQ21kKTsKKwlzcGVlZG9fcmVzdW1lKGRldik7CisKKwluZXRkZXZpY2Vfc3RhcnQoZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJLyogU2V0dXAgdGhlIGNoaXAgYW5kIGNvbmZpZ3VyZSB0aGUgbXVsdGljYXN0IGxpc3QuICovCisJc3AtPm1jX3NldHVwX2hlYWQgPSBOVUxMOworCXNwLT5tY19zZXR1cF90YWlsID0gTlVMTDsKKwlzcC0+Zmxvd19jdHJsID0gc3AtPnBhcnRuZXIgPSAwOworCXNwLT5yeF9tb2RlID0gLTE7CQkJLyogSW52YWxpZCAtPiBhbHdheXMgcmVzZXQgdGhlIG1vZGUuICovCisJc2V0X3J4X21vZGUoZGV2KTsKKwlpZiAoKHNwLT5waHlbMF0gJiAweDgwMDApID09IDApCisJCXNwLT5taWlfaWYuYWR2ZXJ0aXNpbmcgPSBtZGlvX3JlYWQoZGV2LCBzcC0+cGh5WzBdICYgMHgxZiwgTUlJX0FEVkVSVElTRSk7CisKKwltaWlfY2hlY2tfbGluaygmc3AtPm1paV9pZik7CisKKwlpZiAobmV0aWZfbXNnX2lmdXAoc3ApKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRG9uZSBzcGVlZG9fb3BlbigpLCBzdGF0dXMgJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQxNihpb2FkZHIgKyBTQ0JTdGF0dXMpKTsKKwl9CisKKwkvKiBTZXQgdGhlIHRpbWVyLiAgVGhlIHRpbWVyIHNlcnZlcyBhIGR1YWwgcHVycG9zZToKKwkgICAxKSB0byBtb25pdG9yIHRoZSBtZWRpYSBpbnRlcmZhY2UgKGUuZy4gbGluayBiZWF0KSBhbmQgcGVyaGFwcyBzd2l0Y2gKKwkgICB0byBhbiBhbHRlcm5hdGUgbWVkaWEgdHlwZQorCSAgIDIpIHRvIG1vbml0b3IgUnggYWN0aXZpdHksIGFuZCByZXN0YXJ0IHRoZSBSeCBwcm9jZXNzIGlmIHRoZSByZWNlaXZlcgorCSAgIGhhbmdzLiAqLworCXNwLT50aW1lci5leHBpcmVzID0gUlVOX0FUKCgyNCpIWikvMTApOyAJCQkvKiAyLjQgc2VjLiAqLworCXNwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXNwLT50aW1lci5mdW5jdGlvbiA9ICZzcGVlZG9fdGltZXI7CQkJCQkvKiB0aW1lciBoYW5kbGVyICovCisJYWRkX3RpbWVyKCZzcC0+dGltZXIpOworCisJLyogTm8gbmVlZCB0byB3YWl0IGZvciB0aGUgY29tbWFuZCB1bml0IHRvIGFjY2VwdCBoZXJlLiAqLworCWlmICgoc3AtPnBoeVswXSAmIDB4ODAwMCkgPT0gMCkKKwkJbWRpb19yZWFkKGRldiwgc3AtPnBoeVswXSAmIDB4MWYsIE1JSV9CTUNSKTsKKworCXJldHVybiAwOworfQorCisvKiBTdGFydCB0aGUgY2hpcCBoYXJkd2FyZSBhZnRlciBhIGZ1bGwgcmVzZXQuICovCitzdGF0aWMgdm9pZCBzcGVlZG9fcmVzdW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBzcC0+cmVnczsKKworCS8qIFN0YXJ0IHdpdGggYSBUeCB0aHJlc2hvbGQgb2YgMjU2ICgweC4uMjAuLi4uIDggYnl0ZSB1bml0cykuICovCisJc3AtPnR4X3RocmVzaG9sZCA9IDB4MDEyMDgwMDA7CisKKwkvKiBTZXQgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzIHRvICcwJy4gKi8KKwlpZiAod2FpdF9mb3JfY21kX2RvbmUoZGV2LCBzcCkgIT0gMCkgeworCQlpb3dyaXRlMzIoUG9ydFBhcnRpYWxSZXNldCwgaW9hZGRyICsgU0NCUG9ydCk7CisJCXVkZWxheSgxMCk7CisJfQorCisgICAgICAgIGlvd3JpdGUzMigwLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKKyAgICAgICAgaW9yZWFkMzIoaW9hZGRyICsgU0NCUG9pbnRlcik7CQkJLyogRmx1c2ggdG8gUENJLiAqLworICAgICAgICB1ZGVsYXkoMTApOwkJCS8qIEJvZ3VzLCBidXQgaXQgYXZvaWRzIHRoZSBidWcuICovCisKKyAgICAgICAgLyogTm90ZTogdGhlc2UgbmV4dCB0d28gb3BlcmF0aW9ucyBjYW4gdGFrZSBhIHdoaWxlLiAqLworICAgICAgICBkb19zbG93X2NvbW1hbmQoZGV2LCBzcCwgUnhBZGRyTG9hZCk7CisgICAgICAgIGRvX3Nsb3dfY29tbWFuZChkZXYsIHNwLCBDVUNtZEJhc2UpOworCisJLyogTG9hZCB0aGUgc3RhdGlzdGljcyBibG9jayBhbmQgcnggcmluZyBhZGRyZXNzZXMuICovCisJaW93cml0ZTMyKHNwLT5sc3RhdHNfZG1hLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKKwlpb3JlYWQzMihpb2FkZHIgKyBTQ0JQb2ludGVyKTsJCQkvKiBGbHVzaCB0byBQQ0kgKi8KKworCWlvd3JpdGU4KENVU3RhdHNBZGRyLCBpb2FkZHIgKyBTQ0JDbWQpOworCXNwLT5sc3RhdHMtPmRvbmVfbWFya2VyID0gMDsKKwl3YWl0X2Zvcl9jbWRfZG9uZShkZXYsIHNwKTsKKworCWlmIChzcC0+cnhfcmluZ3Bbc3AtPmN1cl9yeCAlIFJYX1JJTkdfU0laRV0gPT0gTlVMTCkgeworCQlpZiAobmV0aWZfbXNnX3J4X2VycihzcCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5VTEwgY3VyX3J4IGluIHNwZWVkb19yZXN1bWUoKS5cbiIsCisJCQkJCWRldi0+bmFtZSk7CisJfSBlbHNlIHsKKwkJaW93cml0ZTMyKHNwLT5yeF9yaW5nX2RtYVtzcC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFXSwKKwkJCSBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKKwkJaW9yZWFkMzIoaW9hZGRyICsgU0NCUG9pbnRlcik7CQkvKiBGbHVzaCB0byBQQ0kgKi8KKwl9CisKKwkvKiBOb3RlOiBSeFN0YXJ0IHNob3VsZCBjb21wbGV0ZSBpbnN0YW50bHkuICovCisJZG9fc2xvd19jb21tYW5kKGRldiwgc3AsIFJ4U3RhcnQpOworCWRvX3Nsb3dfY29tbWFuZChkZXYsIHNwLCBDVUR1bXBTdGF0cyk7CisKKwkvKiBGaWxsIHRoZSBmaXJzdCBjb21tYW5kIHdpdGggb3VyIHBoeXNpY2FsIGFkZHJlc3MuICovCisJeworCQlzdHJ1Y3QgZGVzY3JpcHRvciAqaWFzX2NtZDsKKworCQlpYXNfY21kID0KKwkJCShzdHJ1Y3QgZGVzY3JpcHRvciAqKSZzcC0+dHhfcmluZ1tzcC0+Y3VyX3R4KysgJSBUWF9SSU5HX1NJWkVdOworCQkvKiBBdm9pZCBhIGJ1Zyg/ISkgaGVyZSBieSBtYXJraW5nIHRoZSBjb21tYW5kIGFscmVhZHkgY29tcGxldGVkLiAqLworCQlpYXNfY21kLT5jbWRfc3RhdHVzID0gY3B1X3RvX2xlMzIoKENtZFN1c3BlbmQgfCBDbWRJQVNldHVwKSB8IDB4YTAwMCk7CisJCWlhc19jbWQtPmxpbmsgPQorCQkJY3B1X3RvX2xlMzIoVFhfUklOR19FTEVNX0RNQShzcCwgc3AtPmN1cl90eCAlIFRYX1JJTkdfU0laRSkpOworCQltZW1jcHkoaWFzX2NtZC0+cGFyYW1zLCBkZXYtPmRldl9hZGRyLCA2KTsKKwkJaWYgKHNwLT5sYXN0X2NtZCkKKwkJCWNsZWFyX3N1c3BlbmQoc3AtPmxhc3RfY21kKTsKKwkJc3AtPmxhc3RfY21kID0gaWFzX2NtZDsKKwl9CisKKwkvKiBTdGFydCB0aGUgY2hpcCdzIFR4IHByb2Nlc3MgYW5kIHVubWFzayBpbnRlcnJ1cHRzLiAqLworCWlvd3JpdGUzMihUWF9SSU5HX0VMRU1fRE1BKHNwLCBzcC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkUpLAorCQkgaW9hZGRyICsgU0NCUG9pbnRlcik7CisJLyogV2UgYXJlIG5vdCBBQ0staW5nIEZDUCBhbmQgRVIgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyIHlldCBzbyB0aGV5IHNob3VsZAorCSAgIHJlbWFpbiBtYXNrZWQgLS1EcmFnYW4gKi8KKwlpb3dyaXRlMTYoQ1VTdGFydCB8IFNDQk1hc2tFYXJseVJ4IHwgU0NCTWFza0Zsb3dDdGwsIGlvYWRkciArIFNDQkNtZCk7Cit9CisKKy8qCisgKiBTb21ldGltZXMgdGhlIHJlY2VpdmVyIHN0b3BzIG1ha2luZyBwcm9ncmVzcy4gIFRoaXMgcm91dGluZSBrbm93cyBob3cgdG8KKyAqIGdldCBpdCBnb2luZyBhZ2Fpbiwgd2l0aG91dCBsb3NpbmcgcGFja2V0cyBvciBiZWluZyBvdGhlcndpc2UgbmFzdHkgbGlrZQorICogYSBjaGlwIHJlc2V0IHdvdWxkIGJlLiAgUHJldmlvdXNseSB0aGUgZHJpdmVyIGhhZCBhIHdob2xlIHNlcXVlbmNlCisgKiBvZiBpZiBSeFN1c3BlbmRlZCwgaWYgaXQncyBubyBidWZmZXJzIGRvIG9uZSB0aGluZywgaWYgaXQncyBubyByZXNvdXJjZXMsCisgKiBkbyBhbm90aGVyLCBldGMuICBCdXQgdGhvc2UgdGhpbmdzIGRvbid0IHJlYWxseSBtYXR0ZXIuICBTZXBhcmF0ZSBsb2dpYworICogaW4gdGhlIElTUiBwcm92aWRlcyBmb3IgYWxsb2NhdGluZyBidWZmZXJzLS10aGUgb3RoZXIgaGFsZiBvZiBvcGVyYXRpb24KKyAqIGlzIGp1c3QgbWFraW5nIHN1cmUgdGhlIHJlY2VpdmVyIGlzIGFjdGl2ZS4gIHNwZWVkb19yeF9zb2Z0X3Jlc2V0IGRvZXMgdGhhdC4KKyAqIFRoaXMgcHJvYmxlbSB3aXRoIHRoZSBvbGQsIG1vcmUgaW52b2x2ZWQgYWxnb3JpdGhtIGlzIHNob3duIHVwIHVuZGVyCisgKiBwaW5nIGZsb29kcyBvbiB0aGUgb3JkZXIgb2YgNjBLIHBhY2tldHMvc2Vjb25kIG9uIGEgMTAwTWJwcyBmZHggbmV0d29yay4KKyAqLworc3RhdGljIHZvaWQKK3NwZWVkb19yeF9zb2Z0X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IFJ4RkQgKnJmZDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKworCWlvYWRkciA9IHNwLT5yZWdzOworCWlmICh3YWl0X2Zvcl9jbWRfZG9uZShkZXYsIHNwKSAhPSAwKSB7CisJCXByaW50aygiJXM6IHByZXZpb3VzIGNvbW1hbmQgc3RhbGxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwkvKgorCSogUHV0IHRoZSBoYXJkd2FyZSBpbnRvIGEga25vd24gc3RhdGUuCisJKi8KKwlpb3dyaXRlOChSeEFib3J0LCBpb2FkZHIgKyBTQ0JDbWQpOworCisJcmZkID0gc3AtPnJ4X3JpbmdwW3NwLT5jdXJfcnggJSBSWF9SSU5HX1NJWkVdOworCisJcmZkLT5yeF9idWZfYWRkciA9IDB4ZmZmZmZmZmY7CisKKwlpZiAod2FpdF9mb3JfY21kX2RvbmUoZGV2LCBzcCkgIT0gMCkgeworCQlwcmludGsoIiVzOiBSeEFib3J0IGNvbW1hbmQgc3RhbGxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlpb3dyaXRlMzIoc3AtPnJ4X3JpbmdfZG1hW3NwLT5jdXJfcnggJSBSWF9SSU5HX1NJWkVdLAorCQlpb2FkZHIgKyBTQ0JQb2ludGVyKTsKKwlpb3dyaXRlOChSeFN0YXJ0LCBpb2FkZHIgKyBTQ0JDbWQpOworfQorCisKKy8qIE1lZGlhIG1vbml0b3JpbmcgYW5kIGNvbnRyb2wuICovCitzdGF0aWMgdm9pZCBzcGVlZG9fdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gc3AtPnJlZ3M7CisJaW50IHBoeV9udW0gPSBzcC0+cGh5WzBdICYgMHgxZjsKKworCS8qIFdlIGhhdmUgTUlJIGFuZCBsb3N0IGxpbmsgYmVhdC4gKi8KKwlpZiAoKHNwLT5waHlbMF0gJiAweDgwMDApID09IDApIHsKKwkJaW50IHBhcnRuZXIgPSBtZGlvX3JlYWQoZGV2LCBwaHlfbnVtLCBNSUlfTFBBKTsKKwkJaWYgKHBhcnRuZXIgIT0gc3AtPnBhcnRuZXIpIHsKKwkJCWludCBmbG93X2N0cmwgPSBzcC0+bWlpX2lmLmFkdmVydGlzaW5nICYgcGFydG5lciAmIDB4MDQwMCA/IDEgOiAwOworCQkJaWYgKG5ldGlmX21zZ19saW5rKHNwKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTGluayBzdGF0dXMgY2hhbmdlLlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE9sZCBwYXJ0bmVyICV4LCBuZXcgJXgsIGFkdiAleC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgc3AtPnBhcnRuZXIsIHBhcnRuZXIsIHNwLT5taWlfaWYuYWR2ZXJ0aXNpbmcpOworCQkJfQorCQkJc3AtPnBhcnRuZXIgPSBwYXJ0bmVyOworCQkJaWYgKGZsb3dfY3RybCAhPSBzcC0+Zmxvd19jdHJsKSB7CisJCQkJc3AtPmZsb3dfY3RybCA9IGZsb3dfY3RybDsKKwkJCQlzcC0+cnhfbW9kZSA9IC0xOwkvKiBUcmlnZ2VyIGEgcmVsb2FkLiAqLworCQkJfQorCQl9CisJfQorCW1paV9jaGVja19saW5rKCZzcC0+bWlpX2lmKTsKKwlpZiAobmV0aWZfbXNnX3RpbWVyKHNwKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1lZGlhIGNvbnRyb2wgdGljaywgc3RhdHVzICU0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMTYoaW9hZGRyICsgU0NCU3RhdHVzKSk7CisJfQorCWlmIChzcC0+cnhfbW9kZSA8IDAgIHx8CisJCShzcC0+cnhfYnVnICAmJiBqaWZmaWVzIC0gc3AtPmxhc3RfcnhfdGltZSA+IDIqSFopKSB7CisJCS8qIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgYSBwYWNrZXQgaW4gYSBMb25nIFRpbWUuICBXZSBtaWdodCBoYXZlIGJlZW4KKwkJICAgYml0dGVuIGJ5IHRoZSByZWNlaXZlciBoYW5nIGJ1Zy4gIFRoaXMgY2FuIGJlIGNsZWFyZWQgYnkgc2VuZGluZworCQkgICBhIHNldCBtdWx0aWNhc3QgbGlzdCBjb21tYW5kLiAqLworCQlpZiAobmV0aWZfbXNnX3RpbWVyKHNwKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2VuZGluZyBhIG11bHRpY2FzdCBsaXN0IHNldCBjb21tYW5kIgorCQkJCSAgICIgZnJvbSBhIHRpbWVyIHJvdXRpbmUsIgorCQkJCSAgICIgbT0lZCwgaj0lbGQsIGw9JWxkLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHNwLT5yeF9tb2RlLCBqaWZmaWVzLCBzcC0+bGFzdF9yeF90aW1lKTsKKwkJc2V0X3J4X21vZGUoZGV2KTsKKwl9CisJLyogV2UgbXVzdCBjb250aW51ZSB0byBtb25pdG9yIHRoZSBtZWRpYS4gKi8KKwlzcC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCgyKkhaKTsgCQkJLyogMi4wIHNlYy4gKi8KKwlhZGRfdGltZXIoJnNwLT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIHNwZWVkb19zaG93X3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlpZiAobmV0aWZfbXNnX3BrdGRhdGEoc3ApKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHggcmluZyBkdW1wLCAgVHggcXVldWUgJXUgLyAldTpcbiIsIAorCQkgICAgZGV2LT5uYW1lLCBzcC0+Y3VyX3R4LCBzcC0+ZGlydHlfdHgpOworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICAlYyVjJTJkICU4Ljh4LlxuIiwgZGV2LT5uYW1lLAorCQkJICAgIGkgPT0gc3AtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFID8gJyonIDogJyAnLAorCQkJICAgIGkgPT0gc3AtPmN1cl90eCAlIFRYX1JJTkdfU0laRSA/ICc9JyA6ICcgJywKKwkJCSAgICBpLCBzcC0+dHhfcmluZ1tpXS5zdGF0dXMpOworCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUHJpbnRpbmcgUnggcmluZyIKKwkJICAgICIgKG5leHQgdG8gcmVjZWl2ZSBpbnRvICV1LCBkaXJ0eSBpbmRleCAldSkuXG4iLAorCQkgICAgZGV2LT5uYW1lLCBzcC0+Y3VyX3J4LCBzcC0+ZGlydHlfcngpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVjJWMlYyUyZCAlOC44eC5cbiIsIGRldi0+bmFtZSwKKwkJCSAgICBzcC0+cnhfcmluZ3BbaV0gPT0gc3AtPmxhc3RfcnhmID8gJ2wnIDogJyAnLAorCQkJICAgIGkgPT0gc3AtPmRpcnR5X3J4ICUgUlhfUklOR19TSVpFID8gJyonIDogJyAnLAorCQkJICAgIGkgPT0gc3AtPmN1cl9yeCAlIFJYX1JJTkdfU0laRSA/ICc9JyA6ICcgJywKKwkJCSAgICBpLCAoc3AtPnJ4X3JpbmdwW2ldICE9IE5VTEwpID8KKwkJCSAgICAodW5zaWduZWQpc3AtPnJ4X3JpbmdwW2ldLT5zdGF0dXMgOiAwKTsKKwl9CisKKyNpZiAwCisJeworCQl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHNwLT5yZWdzOworCQlpbnQgcGh5X251bSA9IHNwLT5waHlbMF0gJiAweDFmOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJLyogRklYTUU6IHdoYXQgZG9lcyBpdCBtZWFuPyAgLS1TQVcgKi8KKwkJCWlmIChpID09IDYpIGkgPSAyMTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIFBIWSBpbmRleCAlZCByZWdpc3RlciAlZCBpcyAlNC40eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBwaHlfbnVtLCBpLCBtZGlvX3JlYWQoZGV2LCBwaHlfbnVtLCBpKSk7CisJCX0KKwl9CisjZW5kaWYKKworfQorCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQKK3NwZWVkb19pbml0X3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgUnhGRCAqcnhmLCAqbGFzdF9yeGYgPSBOVUxMOworCWRtYV9hZGRyX3QgbGFzdF9yeGZfZG1hID0gMCAvKiB0byBzaHV0IHVwIHRoZSBjb21waWxlciAqLzsKKwlpbnQgaTsKKworCXNwLT5jdXJfcnggPSAwOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXNrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWiArIHNpemVvZihzdHJ1Y3QgUnhGRCkpOworCQkvKiBYWFg6IGRvIHdlIHJlYWxseSB3YW50IHRvIGNhbGwgdGhpcyBiZWZvcmUgdGhlIE5VTEwgY2hlY2s/IC0taGNoICovCisJCXJ4X2FsaWduKHNrYik7CQkJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyeSAqLworCQlzcC0+cnhfc2tidWZmW2ldID0gc2tiOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlicmVhazsJCQkvKiBPSy4gIEp1c3QgaW5pdGlhbGx5IHNob3J0IG9mIFJ4IGJ1ZnMuICovCisJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJcnhmID0gKHN0cnVjdCBSeEZEICopc2tiLT50YWlsOworCQlzcC0+cnhfcmluZ3BbaV0gPSByeGY7CisJCXNwLT5yeF9yaW5nX2RtYVtpXSA9CisJCQlwY2lfbWFwX3NpbmdsZShzcC0+cGRldiwgcnhmLAorCQkJCQlQS1RfQlVGX1NaICsgc2l6ZW9mKHN0cnVjdCBSeEZEKSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCBzaXplb2Yoc3RydWN0IFJ4RkQpKTsKKwkJaWYgKGxhc3RfcnhmKSB7CisJCQlsYXN0X3J4Zi0+bGluayA9IGNwdV90b19sZTMyKHNwLT5yeF9yaW5nX2RtYVtpXSk7CisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3AtPnBkZXYsIGxhc3RfcnhmX2RtYSwKKwkJCQkJCQkJCQkgICBzaXplb2Yoc3RydWN0IFJ4RkQpLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJfQorCQlsYXN0X3J4ZiA9IHJ4ZjsKKwkJbGFzdF9yeGZfZG1hID0gc3AtPnJ4X3JpbmdfZG1hW2ldOworCQlyeGYtPnN0YXR1cyA9IGNwdV90b19sZTMyKDB4MDAwMDAwMDEpOwkvKiAnMScgaXMgZmxhZyB2YWx1ZSBvbmx5LiAqLworCQlyeGYtPmxpbmsgPSAwOwkJCQkJCS8qIE5vbmUgeWV0LiAqLworCQkvKiBUaGlzIGZpZWxkIHVudXNlZCBieSBpODI1NTcuICovCisJCXJ4Zi0+cnhfYnVmX2FkZHIgPSAweGZmZmZmZmZmOworCQlyeGYtPmNvdW50ID0gY3B1X3RvX2xlMzIoUEtUX0JVRl9TWiA8PCAxNik7CisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzcC0+cGRldiwgc3AtPnJ4X3JpbmdfZG1hW2ldLAorCQkJCQkJCQkJICAgc2l6ZW9mKHN0cnVjdCBSeEZEKSwgUENJX0RNQV9UT0RFVklDRSk7CisJfQorCXNwLT5kaXJ0eV9yeCA9ICh1bnNpZ25lZCBpbnQpKGkgLSBSWF9SSU5HX1NJWkUpOworCS8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgZW5kLW9mLWxpc3QuICovCisJbGFzdF9yeGYtPnN0YXR1cyA9IGNwdV90b19sZTMyKDB4QzAwMDAwMDIpOwkvKiAnMicgaXMgZmxhZyB2YWx1ZSBvbmx5LiAqLworCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzcC0+cGRldiwgc3AtPnJ4X3JpbmdfZG1hW1JYX1JJTkdfU0laRS0xXSwKKwkJCQkJCQkJICAgc2l6ZW9mKHN0cnVjdCBSeEZEKSwgUENJX0RNQV9UT0RFVklDRSk7CisJc3AtPmxhc3RfcnhmID0gbGFzdF9yeGY7CisJc3AtPmxhc3RfcnhmX2RtYSA9IGxhc3RfcnhmX2RtYTsKK30KKworc3RhdGljIHZvaWQgc3BlZWRvX3B1cmdlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5OworCisJd2hpbGUgKChpbnQpKHNwLT5jdXJfdHggLSBzcC0+ZGlydHlfdHgpID4gMCkgeworCQllbnRyeSA9IHNwLT5kaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKKwkJaWYgKHNwLT50eF9za2J1ZmZbZW50cnldKSB7CisJCQlzcC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHNwLT5wZGV2LAorCQkJCQlsZTMyX3RvX2NwdShzcC0+dHhfcmluZ1tlbnRyeV0udHhfYnVmX2FkZHIwKSwKKwkJCQkJc3AtPnR4X3NrYnVmZltlbnRyeV0tPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShzcC0+dHhfc2tidWZmW2VudHJ5XSk7CisJCQlzcC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCX0KKwkJc3AtPmRpcnR5X3R4Kys7CisJfQorCXdoaWxlIChzcC0+bWNfc2V0dXBfaGVhZCAhPSBOVUxMKSB7CisJCXN0cnVjdCBzcGVlZG9fbWNfYmxvY2sgKnQ7CisJCWlmIChuZXRpZl9tc2dfdHhfZXJyKHNwKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZnJlZWluZyBtYyBmcmFtZS5cbiIsIGRldi0+bmFtZSk7CisJCXBjaV91bm1hcF9zaW5nbGUoc3AtPnBkZXYsIHNwLT5tY19zZXR1cF9oZWFkLT5mcmFtZV9kbWEsCisJCQkJc3AtPm1jX3NldHVwX2hlYWQtPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCXQgPSBzcC0+bWNfc2V0dXBfaGVhZC0+bmV4dDsKKwkJa2ZyZWUoc3AtPm1jX3NldHVwX2hlYWQpOworCQlzcC0+bWNfc2V0dXBfaGVhZCA9IHQ7CisJfQorCXNwLT5tY19zZXR1cF90YWlsID0gTlVMTDsKKwlzcC0+dHhfZnVsbCA9IDA7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgdm9pZCByZXNldF9taWkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIFJlc2V0IHRoZSBNSUkgdHJhbnNjZWl2ZXIsIHN1Z2dlc3RlZCBieSBGcmVkIFlvdW5nIEAgc2NhbGFibGUuY29tLiAqLworCWlmICgoc3AtPnBoeVswXSAmIDB4ODAwMCkgPT0gMCkgeworCQlpbnQgcGh5X2FkZHIgPSBzcC0+cGh5WzBdICYgMHgxZjsKKwkJaW50IGFkdmVydGlzaW5nID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9BRFZFUlRJU0UpOworCQlpbnQgbWlpX2JtY3IgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0JNQ1IpOworCQltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9CTUNSLCAweDA0MDApOworCQltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9CTVNSLCAweDAwMDApOworCQltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9BRFZFUlRJU0UsIDB4MDAwMCk7CisJCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0JNQ1IsIDB4ODAwMCk7CisjaWZkZWYgaG9ub3JfZGVmYXVsdF9wb3J0CisJCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0JNQ1IsIG1paV9jdHJsW2Rldi0+ZGVmYXVsdF9wb3J0ICYgN10pOworI2Vsc2UKKwkJbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9CTUNSKTsKKwkJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQk1DUiwgbWlpX2JtY3IpOworCQltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9BRFZFUlRJU0UsIGFkdmVydGlzaW5nKTsKKyNlbmRpZgorCX0KK30KKworc3RhdGljIHZvaWQgc3BlZWRvX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHNwLT5yZWdzOworCWludCBzdGF0dXMgPSBpb3JlYWQxNihpb2FkZHIgKyBTQ0JTdGF0dXMpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobmV0aWZfbXNnX3R4X2VycihzcCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dDogc3RhdHVzICU0LjR4ICIKKwkJICAgIiAlNC40eCBhdCAlZC8lZCBjb21tYW5kICU4Ljh4LlxuIiwKKwkJICAgZGV2LT5uYW1lLCBzdGF0dXMsIGlvcmVhZDE2KGlvYWRkciArIFNDQkNtZCksCisJCSAgIHNwLT5kaXJ0eV90eCwgc3AtPmN1cl90eCwKKwkJICAgc3AtPnR4X3Jpbmdbc3AtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFXS5zdGF0dXMpOworCisJfQorCXNwZWVkb19zaG93X3N0YXRlKGRldik7CisjaWYgMAorCWlmICgoc3RhdHVzICYgMHgwMEMwKSAhPSAweDAwODAKKwkJJiYgIChzdGF0dXMgJiAweDAwM0MpID09IDB4MDAxMCkgeworCQkvKiBPbmx5IHRoZSBjb21tYW5kIHVuaXQgaGFzIHN0b3BwZWQuICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcnlpbmcgdG8gcmVzdGFydCB0aGUgdHJhbnNtaXR0ZXIuLi5cbiIsCisJCQkgICBkZXYtPm5hbWUpOworCQlpb3dyaXRlMzIoVFhfUklOR19FTEVNX0RNQShzcCwgZGlydHlfdHggJSBUWF9SSU5HX1NJWkVdKSwKKwkJCSBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKKwkJaW93cml0ZTE2KENVU3RhcnQsIGlvYWRkciArIFNDQkNtZCk7CisJCXJlc2V0X21paShkZXYpOworCX0gZWxzZSB7CisjZWxzZQorCXsKKyNlbmRpZgorCQlkZWxfdGltZXJfc3luYygmc3AtPnRpbWVyKTsKKwkJLyogUmVzZXQgdGhlIFR4IGFuZCBSeCB1bml0cy4gKi8KKwkJaW93cml0ZTMyKFBvcnRSZXNldCwgaW9hZGRyICsgU0NCUG9ydCk7CisJCS8qIFdlIG1heSBnZXQgc3B1cmlvdXMgaW50ZXJydXB0cyBoZXJlLiAgQnV0IEkgZG9uJ3QgdGhpbmsgdGhhdCB0aGV5CisJCSAgIG1heSBkbyBtdWNoIGhhcm0uICAxOTk5LzEyLzA5IFNBVyAqLworCQl1ZGVsYXkoMTApOworCQkvKiBEaXNhYmxlIGludGVycnVwdHMuICovCisJCWlvd3JpdGUxNihTQ0JNYXNrQWxsLCBpb2FkZHIgKyBTQ0JDbWQpOworCQlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCQlzcGVlZG9fdHhfYnVmZmVyX2djKGRldik7CisJCS8qIEZyZWUgYXMgbXVjaCBhcyBwb3NzaWJsZS4KKwkJICAgSXQgaGVscHMgdG8gcmVjb3ZlciBmcm9tIGEgaGFuZyBiZWNhdXNlIG9mIG91dC1vZi1tZW1vcnkuCisJCSAgIEl0IGFsc28gc2ltcGxpZmllcyBzcGVlZG9fcmVzdW1lKCkgaW4gY2FzZSBUWCByaW5nIGlzIGZ1bGwgb3IKKwkJICAgY2xvc2UtdG8tYmUgZnVsbC4gKi8KKwkJc3BlZWRvX3B1cmdlX3R4KGRldik7CisJCXNwZWVkb19yZWZpbGxfcnhfYnVmZmVycyhkZXYsIDEpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwkJc3BlZWRvX3Jlc3VtZShkZXYpOworCQlzcC0+cnhfbW9kZSA9IC0xOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwkJc2V0X3J4X21vZGUoZGV2KTsgLyogaXQgdGFrZXMgdGhlIHNwaW5sb2NrIGl0c2VsZiAtLVNBVyAqLworCQkvKiBSZXNldCBNSUkgdHJhbnNjZWl2ZXIuICBEbyBpdCBiZWZvcmUgc3RhcnRpbmcgdGhlIHRpbWVyIHRvIHNlcmlhbGl6ZQorCQkgICBtZGlvX3h4eCBvcGVyYXRpb25zLiAgWWVzLCBpdCdzIGEgcGFyYW5veWEgOi0pICAyMDAwLzA1LzA5IFNBVyAqLworCQlyZXNldF9taWkoZGV2KTsKKwkJc3AtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQoMipIWik7CisJCWFkZF90aW1lcigmc3AtPnRpbWVyKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50CitzcGVlZG9fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gc3AtPnJlZ3M7CisJaW50IGVudHJ5OworCisJLyogUHJldmVudCBpbnRlcnJ1cHRzIGZyb20gY2hhbmdpbmcgdGhlIFR4IHJpbmcgZnJvbSB1bmRlcm5lYXRoIHVzLiAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3AtPmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBlbm91Z2ggc3BhY2UuICovCisJaWYgKChpbnQpKHNwLT5jdXJfdHggLSBzcC0+ZGlydHlfdHgpID49IFRYX1FVRVVFX0xJTUlUKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGluY29ycmVjdCB0YnVzeSBzdGF0ZSwgZml4ZWQuXG4iLCBkZXYtPm5hbWUpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNwLT50eF9mdWxsID0gMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogQ2FsY3VsYXRlIHRoZSBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0gc3AtPmN1cl90eCsrICUgVFhfUklOR19TSVpFOworCisJc3AtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJc3AtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9CisJCWNwdV90b19sZTMyKENtZFN1c3BlbmQgfCBDbWRUeCB8IENtZFR4RmxleCk7CisJaWYgKCEoZW50cnkgJiAoKFRYX1JJTkdfU0laRT4+MiktMSkpKQorCQlzcC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzIHw9IGNwdV90b19sZTMyKENtZEludHIpOworCXNwLT50eF9yaW5nW2VudHJ5XS5saW5rID0KKwkJY3B1X3RvX2xlMzIoVFhfUklOR19FTEVNX0RNQShzcCwgc3AtPmN1cl90eCAlIFRYX1JJTkdfU0laRSkpOworCXNwLT50eF9yaW5nW2VudHJ5XS50eF9kZXNjX2FkZHIgPQorCQljcHVfdG9fbGUzMihUWF9SSU5HX0VMRU1fRE1BKHNwLCBlbnRyeSkgKyBUWF9ERVNDUl9CVUZfT0ZGU0VUKTsKKwkvKiBUaGUgZGF0YSByZWdpb24gaXMgYWx3YXlzIGluIG9uZSBidWZmZXIgZGVzY3JpcHRvci4gKi8KKwlzcC0+dHhfcmluZ1tlbnRyeV0uY291bnQgPSBjcHVfdG9fbGUzMihzcC0+dHhfdGhyZXNob2xkKTsKKwlzcC0+dHhfcmluZ1tlbnRyeV0udHhfYnVmX2FkZHIwID0KKwkJY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3AtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJICAgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpKTsKKwlzcC0+dHhfcmluZ1tlbnRyeV0udHhfYnVmX3NpemUwID0gY3B1X3RvX2xlMzIoc2tiLT5sZW4pOworCisJLyogd29ya2Fyb3VuZCBmb3IgaGFyZHdhcmUgYnVnIG9uIDEwIG1iaXQgaGFsZiBkdXBsZXggKi8KKworCWlmICgoc3AtPnBhcnRuZXIgPT0gMCkgJiYgKHNwLT5jaGlwX2lkID09IDEpKSB7CisJCXdhaXRfZm9yX2NtZF9kb25lKGRldiwgc3ApOworCQlpb3dyaXRlOCgwICwgaW9hZGRyICsgU0NCQ21kKTsKKwkJdWRlbGF5KDEpOworCX0KKworCS8qIFRyaWdnZXIgdGhlIGNvbW1hbmQgdW5pdCByZXN1bWUuICovCisJd2FpdF9mb3JfY21kX2RvbmUoZGV2LCBzcCk7CisJY2xlYXJfc3VzcGVuZChzcC0+bGFzdF9jbWQpOworCS8qIFdlIHdhbnQgdGhlIHRpbWUgd2luZG93IGJldHdlZW4gY2xlYXJpbmcgc3VzcGVuZCBmbGFnIG9uIHRoZSBwcmV2aW91cworCSAgIGNvbW1hbmQgYW5kIHJlc3VtaW5nIENVIHRvIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLgorCSAgIEludGVycnVwdHMgaW4gYmV0d2VlbiBhcmUgdmVyeSB1bmRlc2lyZWQuICAtLVNBVyAqLworCWlvd3JpdGU4KENVUmVzdW1lLCBpb2FkZHIgKyBTQ0JDbWQpOworCXNwLT5sYXN0X2NtZCA9IChzdHJ1Y3QgZGVzY3JpcHRvciAqKSZzcC0+dHhfcmluZ1tlbnRyeV07CisKKwkvKiBMZWF2ZSByb29tIGZvciBzZXRfcnhfbW9kZSgpLiBJZiB0aGVyZSBpcyBubyBtb3JlIHNwYWNlIHRoYW4gcmVzZXJ2ZWQKKwkgICBmb3IgbXVsdGljYXN0IGZpbHRlciBtYXJrIHRoZSByaW5nIGFzIGZ1bGwuICovCisJaWYgKChpbnQpKHNwLT5jdXJfdHggLSBzcC0+ZGlydHlfdHgpID49IFRYX1FVRVVFX0xJTUlUKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc3AtPnR4X2Z1bGwgPSAxOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT5sb2NrLCBmbGFncyk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzcGVlZG9fdHhfYnVmZmVyX2djKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IGRpcnR5X3R4OworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZGlydHlfdHggPSBzcC0+ZGlydHlfdHg7CisJd2hpbGUgKChpbnQpKHNwLT5jdXJfdHggLSBkaXJ0eV90eCkgPiAwKSB7CisJCWludCBlbnRyeSA9IGRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQlpbnQgc3RhdHVzID0gbGUzMl90b19jcHUoc3AtPnR4X3JpbmdbZW50cnldLnN0YXR1cyk7CisKKwkJaWYgKG5ldGlmX21zZ190eF9kb25lKHNwKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgc2NhdmVuZ2UgY2FuZGlkYXRlICVkIHN0YXR1cyAlNC40eC5cbiIsCisJCQkJICAgZW50cnksIHN0YXR1cyk7CisJCWlmICgoc3RhdHVzICYgU3RhdHVzQ29tcGxldGUpID09IDApCisJCQlicmVhazsJCQkvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQuICovCisJCWlmIChzdGF0dXMgJiBUeFVuZGVycnVuKQorCQkJaWYgKHNwLT50eF90aHJlc2hvbGQgPCAweDAxZTA4MDAwKSB7CisJCQkJaWYgKG5ldGlmX21zZ190eF9lcnIoc3ApKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRYIHVuZGVycnVuLCB0aHJlc2hvbGQgYWRqdXN0ZWQuXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lKTsKKwkJCQlzcC0+dHhfdGhyZXNob2xkICs9IDB4MDAwNDAwMDA7CisJCQl9CisJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KKwkJaWYgKHNwLT50eF9za2J1ZmZbZW50cnldKSB7CisJCQlzcC0+c3RhdHMudHhfcGFja2V0cysrOwkvKiBDb3VudCBvbmx5IHVzZXIgcGFja2V0cy4gKi8KKwkJCXNwLT5zdGF0cy50eF9ieXRlcyArPSBzcC0+dHhfc2tidWZmW2VudHJ5XS0+bGVuOworCQkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwKKwkJCQkJbGUzMl90b19jcHUoc3AtPnR4X3JpbmdbZW50cnldLnR4X2J1Zl9hZGRyMCksCisJCQkJCXNwLT50eF9za2J1ZmZbZW50cnldLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc3AtPnR4X3NrYnVmZltlbnRyeV0pOworCQkJc3AtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQl9CisJCWRpcnR5X3R4Kys7CisJfQorCisJaWYgKG5ldGlmX21zZ190eF9lcnIoc3ApICYmIChpbnQpKHNwLT5jdXJfdHggLSBkaXJ0eV90eCkgPiBUWF9SSU5HX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJvdXQtb2Ytc3luYyBkaXJ0eSBwb2ludGVyLCAlZCB2cy4gJWQsIgorCQkJICAgIiBmdWxsPSVkLlxuIiwKKwkJCSAgIGRpcnR5X3R4LCBzcC0+Y3VyX3R4LCBzcC0+dHhfZnVsbCk7CisJCWRpcnR5X3R4ICs9IFRYX1JJTkdfU0laRTsKKwl9CisKKwl3aGlsZSAoc3AtPm1jX3NldHVwX2hlYWQgIT0gTlVMTAorCQkgICAmJiAoaW50KShkaXJ0eV90eCAtIHNwLT5tY19zZXR1cF9oZWFkLT50eCAtIDEpID4gMCkgeworCQlzdHJ1Y3Qgc3BlZWRvX21jX2Jsb2NrICp0OworCQlpZiAobmV0aWZfbXNnX3R4X2VycihzcCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZyZWVpbmcgbWMgZnJhbWUuXG4iLCBkZXYtPm5hbWUpOworCQlwY2lfdW5tYXBfc2luZ2xlKHNwLT5wZGV2LCBzcC0+bWNfc2V0dXBfaGVhZC0+ZnJhbWVfZG1hLAorCQkJCXNwLT5tY19zZXR1cF9oZWFkLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl0ID0gc3AtPm1jX3NldHVwX2hlYWQtPm5leHQ7CisJCWtmcmVlKHNwLT5tY19zZXR1cF9oZWFkKTsKKwkJc3AtPm1jX3NldHVwX2hlYWQgPSB0OworCX0KKwlpZiAoc3AtPm1jX3NldHVwX2hlYWQgPT0gTlVMTCkKKwkJc3AtPm1jX3NldHVwX3RhaWwgPSBOVUxMOworCisJc3AtPmRpcnR5X3R4ID0gZGlydHlfdHg7Cit9CisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIGFsbCBvZiB0aGUgUnggdGhyZWFkIHdvcmsgYW5kIGNsZWFucyB1cAorICAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzcGVlZG9faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pbnN0YW5jZTsKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCWxvbmcgYm9ndXNjbnQgPSBtYXhfaW50ZXJydXB0X3dvcms7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKworCXNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpb2FkZHIgPSBzcC0+cmVnczsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJLyogQSBsb2NrIHRvIHByZXZlbnQgc2ltdWx0YW5lb3VzIGVudHJ5IG9uIFNNUCBtYWNoaW5lcy4gKi8KKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCopJnNwLT5pbl9pbnRlcnJ1cHQpKSB7CisJCXByaW50ayhLRVJOX0VSUiIlczogU01QIHNpbXVsdGFuZW91cyBlbnRyeSBvZiBhbiBpbnRlcnJ1cHQgaGFuZGxlci5cbiIsCisJCQkgICBkZXYtPm5hbWUpOworCQlzcC0+aW5faW50ZXJydXB0ID0gMDsJLyogQXZvaWQgaGFsdGluZyBtYWNoaW5lLiAqLworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorI2VuZGlmCisKKwlkbyB7CisJCXN0YXR1cyA9IGlvcmVhZDE2KGlvYWRkciArIFNDQlN0YXR1cyk7CisJCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworCQkvKiBXaWxsIGNoYW5nZSBmcm9tIDB4ZmMwMCB0byAweGZmMDAgd2hlbiB3ZSBzdGFydCBoYW5kbGluZworCQkgICBGQ1AgYW5kIEVSIGludGVycnVwdHMgLS1EcmFnYW4gKi8KKwkJaW93cml0ZTE2KHN0YXR1cyAmIDB4ZmMwMCwgaW9hZGRyICsgU0NCU3RhdHVzKTsKKworCQlpZiAobmV0aWZfbXNnX2ludHIoc3ApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQgIHN0YXR1cz0lIzQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKworCQlpZiAoKHN0YXR1cyAmIDB4ZmMwMCkgPT0gMCkKKwkJCWJyZWFrOworCQloYW5kbGVkID0gMTsKKworCisJCWlmICgoc3RhdHVzICYgMHg1MDAwKSB8fAkvKiBQYWNrZXQgcmVjZWl2ZWQsIG9yIFJ4IGVycm9yLiAqLworCQkJKHNwLT5yeF9yaW5nX3N0YXRlJihSck5vTWVtfFJyUG9zdHBvbmVkKSkgPT0gUnJQb3N0cG9uZWQpCisJCQkJCQkJCQkvKiBOZWVkIHRvIGdhdGhlciB0aGUgcG9zdHBvbmVkIHBhY2tldC4gKi8KKwkJCXNwZWVkb19yeChkZXYpOworCisJCS8qIEFsd2F5cyBjaGVjayBpZiBhbGwgcnggYnVmZmVycyBhcmUgYWxsb2NhdGVkLiAgLS1TQVcgKi8KKwkJc3BlZWRvX3JlZmlsbF9yeF9idWZmZXJzKGRldiwgMCk7CisJCQorCQlzcGluX2xvY2soJnNwLT5sb2NrKTsKKwkJLyoKKwkJICogVGhlIGNoaXAgbWF5IGhhdmUgc3VzcGVuZGVkIHJlY2VwdGlvbiBmb3IgdmFyaW91cyByZWFzb25zLgorCQkgKiBDaGVjayBmb3IgdGhhdCwgYW5kIHJlLXByaW1lIGl0IHNob3VsZCB0aGlzIGJlIHRoZSBjYXNlLgorCQkgKi8KKwkJc3dpdGNoICgoc3RhdHVzID4+IDIpICYgMHhmKSB7CisJCWNhc2UgMDogLyogSWRsZSAqLworCQkJYnJlYWs7CisJCWNhc2UgMToJLyogU3VzcGVuZGVkICovCisJCWNhc2UgMjoJLyogTm8gcmVzb3VyY2VzIChSeEZEcykgKi8KKwkJY2FzZSA5OgkvKiBTdXNwZW5kZWQgd2l0aCBubyBtb3JlIFJCRHMgKi8KKwkJY2FzZSAxMDogLyogTm8gcmVzb3VyY2VzIGR1ZSB0byBubyBSQkRzICovCisJCWNhc2UgMTI6IC8qIFJlYWR5IHdpdGggbm8gUkJEcyAqLworCQkJc3BlZWRvX3J4X3NvZnRfcmVzZXQoZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIDM6ICBjYXNlIDU6ICBjYXNlIDY6ICBjYXNlIDc6ICBjYXNlIDg6CisJCWNhc2UgMTE6ICBjYXNlIDEzOiAgY2FzZSAxNDogIGNhc2UgMTU6CisJCQkvKiB0aGVzZSBhcmUgYWxsIHJlc2VydmVkIHZhbHVlcyAqLworCQkJYnJlYWs7CisJCX0KKwkJCisJCQorCQkvKiBVc2VyIGludGVycnVwdCwgQ29tbWFuZC9UeCB1bml0IGludGVycnVwdCBvciBDVSBub3QgYWN0aXZlLiAqLworCQlpZiAoc3RhdHVzICYgMHhBNDAwKSB7CisJCQlzcGVlZG9fdHhfYnVmZmVyX2djKGRldik7CisJCQlpZiAoc3AtPnR4X2Z1bGwKKwkJCQkmJiAoaW50KShzcC0+Y3VyX3R4IC0gc3AtPmRpcnR5X3R4KSA8IFRYX1FVRVVFX1VORlVMTCkgeworCQkJCS8qIFRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsLiAqLworCQkJCXNwLT50eF9mdWxsID0gMDsKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7IC8qIEF0dGVudGlvbjogdW5kZXIgYSBzcGlubG9jay4gIC0tU0FXICovCisJCQl9CisJCX0KKwkJCisJCXNwaW5fdW5sb2NrKCZzcC0+bG9jayk7CisKKwkJaWYgKC0tYm9ndXNjbnQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCwgc3RhdHVzPTB4JTQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHQgc291cmNlcy4gKi8KKwkJCS8qIFdpbGwgY2hhbmdlIGZyb20gMHhmYzAwIHRvIDB4ZmYwMCB3aGVuIHdlIHN0YXJ0IGhhbmRsaW5nCisJCQkgICBGQ1AgYW5kIEVSIGludGVycnVwdHMgLS1EcmFnYW4gKi8KKwkJCWlvd3JpdGUxNigweGZjMDAsIGlvYWRkciArIFNDQlN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDEpOworCisJaWYgKG5ldGlmX21zZ19pbnRyKHNwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzPSUjNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDE2KGlvYWRkciArIFNDQlN0YXR1cykpOworCisJY2xlYXJfYml0KDAsICh2b2lkKikmc3AtPmluX2ludGVycnVwdCk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IFJ4RkQgKnNwZWVkb19yeF9hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZW50cnkpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IFJ4RkQgKnJ4ZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCS8qIEdldCBhIGZyZXNoIHNrYnVmZiB0byByZXBsYWNlIHRoZSBjb25zdW1lZCBvbmUuICovCisJc2tiID0gZGV2X2FsbG9jX3NrYihQS1RfQlVGX1NaICsgc2l6ZW9mKHN0cnVjdCBSeEZEKSk7CisJLyogWFhYOiBkbyB3ZSByZWFsbHkgd2FudCB0byBjYWxsIHRoaXMgYmVmb3JlIHRoZSBOVUxMIGNoZWNrPyAtLWhjaCAqLworCXJ4X2FsaWduKHNrYik7CQkJCS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcnkgKi8KKwlzcC0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJc3AtPnJ4X3JpbmdwW2VudHJ5XSA9IE5VTEw7CisJCXJldHVybiBOVUxMOworCX0KKwlyeGYgPSBzcC0+cnhfcmluZ3BbZW50cnldID0gKHN0cnVjdCBSeEZEICopc2tiLT50YWlsOworCXNwLT5yeF9yaW5nX2RtYVtlbnRyeV0gPQorCQlwY2lfbWFwX3NpbmdsZShzcC0+cGRldiwgcnhmLAorCQkJCQkgICBQS1RfQlVGX1NaICsgc2l6ZW9mKHN0cnVjdCBSeEZEKSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlza2ItPmRldiA9IGRldjsKKwlza2JfcmVzZXJ2ZShza2IsIHNpemVvZihzdHJ1Y3QgUnhGRCkpOworCXJ4Zi0+cnhfYnVmX2FkZHIgPSAweGZmZmZmZmZmOworCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzcC0+cGRldiwgc3AtPnJ4X3JpbmdfZG1hW2VudHJ5XSwKKwkJCQkJCQkJICAgc2l6ZW9mKHN0cnVjdCBSeEZEKSwgUENJX0RNQV9UT0RFVklDRSk7CisJcmV0dXJuIHJ4ZjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNwZWVkb19yeF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBlbnRyeSwKKwkJCQkJCQkJICBzdHJ1Y3QgUnhGRCAqcnhmLCBkbWFfYWRkcl90IHJ4Zl9kbWEpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJcnhmLT5zdGF0dXMgPSBjcHVfdG9fbGUzMigweEMwMDAwMDAxKTsgCS8qICcxJyBmb3IgZHJpdmVyIHVzZSBvbmx5LiAqLworCXJ4Zi0+bGluayA9IDA7CQkJLyogTm9uZSB5ZXQuICovCisJcnhmLT5jb3VudCA9IGNwdV90b19sZTMyKFBLVF9CVUZfU1ogPDwgMTYpOworCXNwLT5sYXN0X3J4Zi0+bGluayA9IGNwdV90b19sZTMyKHJ4Zl9kbWEpOworCXNwLT5sYXN0X3J4Zi0+c3RhdHVzICY9IGNwdV90b19sZTMyKH4weEMwMDAwMDAwKTsKKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3AtPnBkZXYsIHNwLT5sYXN0X3J4Zl9kbWEsCisJCQkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgUnhGRCksIFBDSV9ETUFfVE9ERVZJQ0UpOworCXNwLT5sYXN0X3J4ZiA9IHJ4ZjsKKwlzcC0+bGFzdF9yeGZfZG1hID0gcnhmX2RtYTsKK30KKworc3RhdGljIGludCBzcGVlZG9fcmVmaWxsX3J4X2J1ZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZm9yY2UpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5OworCXN0cnVjdCBSeEZEICpyeGY7CisKKwllbnRyeSA9IHNwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwlpZiAoc3AtPnJ4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkgeworCQlyeGYgPSBzcGVlZG9fcnhfYWxsb2MoZGV2LCBlbnRyeSk7CisJCWlmIChyeGYgPT0gTlVMTCkgeworCQkJdW5zaWduZWQgaW50IGZvcnc7CisJCQlpbnQgZm9yd19lbnRyeTsKKwkJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHNwKSB8fCAhKHNwLT5yeF9yaW5nX3N0YXRlICYgUnJPT01SZXBvcnRlZCkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2FuJ3QgZmlsbCByeCBidWZmZXIgKGZvcmNlICVkKSFcbiIsCisJCQkJCQlkZXYtPm5hbWUsIGZvcmNlKTsKKwkJCQlzcC0+cnhfcmluZ19zdGF0ZSB8PSBSck9PTVJlcG9ydGVkOworCQkJfQorCQkJc3BlZWRvX3Nob3dfc3RhdGUoZGV2KTsKKwkJCWlmICghZm9yY2UpCisJCQkJcmV0dXJuIC0xOwkvKiBCZXR0ZXIgbHVjayBuZXh0IHRpbWUhICAqLworCQkJLyogQm9ycm93IGFuIHNrYiBmcm9tIG9uZSBvZiBuZXh0IGVudHJpZXMuICovCisJCQlmb3IgKGZvcncgPSBzcC0+ZGlydHlfcnggKyAxOyBmb3J3ICE9IHNwLT5jdXJfcng7IGZvcncrKykKKwkJCQlpZiAoc3AtPnJ4X3NrYnVmZltmb3J3ICUgUlhfUklOR19TSVpFXSAhPSBOVUxMKQorCQkJCQlicmVhazsKKwkJCWlmIChmb3J3ID09IHNwLT5jdXJfcngpCisJCQkJcmV0dXJuIC0xOworCQkJZm9yd19lbnRyeSA9IGZvcncgJSBSWF9SSU5HX1NJWkU7CisJCQlzcC0+cnhfc2tidWZmW2VudHJ5XSA9IHNwLT5yeF9za2J1ZmZbZm9yd19lbnRyeV07CisJCQlzcC0+cnhfc2tidWZmW2ZvcndfZW50cnldID0gTlVMTDsKKwkJCXJ4ZiA9IHNwLT5yeF9yaW5ncFtmb3J3X2VudHJ5XTsKKwkJCXNwLT5yeF9yaW5ncFtmb3J3X2VudHJ5XSA9IE5VTEw7CisJCQlzcC0+cnhfcmluZ3BbZW50cnldID0gcnhmOworCQl9CisJfSBlbHNlIHsKKwkJcnhmID0gc3AtPnJ4X3JpbmdwW2VudHJ5XTsKKwl9CisJc3BlZWRvX3J4X2xpbmsoZGV2LCBlbnRyeSwgcnhmLCBzcC0+cnhfcmluZ19kbWFbZW50cnldKTsKKwlzcC0+ZGlydHlfcngrKzsKKwlzcC0+cnhfcmluZ19zdGF0ZSAmPSB+KFJyTm9NZW18UnJPT01SZXBvcnRlZCk7IC8qIE1hcmsgdGhlIHByb2dyZXNzLiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzcGVlZG9fcmVmaWxsX3J4X2J1ZmZlcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZvcmNlKQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogUmVmaWxsIHRoZSBSWCByaW5nLiAqLworCXdoaWxlICgoaW50KShzcC0+Y3VyX3J4IC0gc3AtPmRpcnR5X3J4KSA+IDAgJiYKKwkJCXNwZWVkb19yZWZpbGxfcnhfYnVmKGRldiwgZm9yY2UpICE9IC0xKTsKK30KKworc3RhdGljIGludAorc3BlZWRvX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5ID0gc3AtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlpbnQgcnhfd29ya19saW1pdCA9IHNwLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSAtIHNwLT5jdXJfcng7CisJaW50IGFsbG9jX29rID0gMTsKKwlpbnQgbnBrdHMgPSAwOworCisJaWYgKG5ldGlmX21zZ19pbnRyKHNwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBJbiBzcGVlZG9fcngoKS5cbiIpOworCS8qIElmIHdlIG93biB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKHNwLT5yeF9yaW5ncFtlbnRyeV0gIT0gTlVMTCkgeworCQlpbnQgc3RhdHVzOworCQlpbnQgcGt0X2xlbjsKKworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3AtPnBkZXYsIHNwLT5yeF9yaW5nX2RtYVtlbnRyeV0sCisJCQkJCQkJCQlzaXplb2Yoc3RydWN0IFJ4RkQpLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlzdGF0dXMgPSBsZTMyX3RvX2NwdShzcC0+cnhfcmluZ3BbZW50cnldLT5zdGF0dXMpOworCQlwa3RfbGVuID0gbGUzMl90b19jcHUoc3AtPnJ4X3JpbmdwW2VudHJ5XS0+Y291bnQpICYgMHgzZmZmOworCisJCWlmICghKHN0YXR1cyAmIFJ4Q29tcGxldGUpKQorCQkJYnJlYWs7CisKKwkJaWYgKC0tcnhfd29ya19saW1pdCA8IDApCisJCQlicmVhazsKKworCQkvKiBDaGVjayBmb3IgYSByYXJlIG91dC1vZi1tZW1vcnkgY2FzZTogdGhlIGN1cnJlbnQgYnVmZmVyIGlzCisJCSAgIHRoZSBsYXN0IGJ1ZmZlciBhbGxvY2F0ZWQgaW4gdGhlIFJYIHJpbmcuICAtLVNBVyAqLworCQlpZiAoc3AtPmxhc3RfcnhmID09IHNwLT5yeF9yaW5ncFtlbnRyeV0pIHsKKwkJCS8qIFBvc3Rwb25lIHRoZSBwYWNrZXQuICBJdCdsbCBiZSByZWFwZWQgYXQgYW4gaW50ZXJydXB0IHdoZW4gdGhpcworCQkJICAgcGFja2V0IGlzIG5vIGxvbmdlciB0aGUgbGFzdCBwYWNrZXQgaW4gdGhlIHJpbmcuICovCisJCQlpZiAobmV0aWZfbXNnX3J4X2VycihzcCkpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSWCBwYWNrZXQgcG9zdHBvbmVkIVxuIiwKKwkJCQkJICAgZGV2LT5uYW1lKTsKKwkJCXNwLT5yeF9yaW5nX3N0YXRlIHw9IFJyUG9zdHBvbmVkOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobmV0aWZfbXNnX3J4X3N0YXR1cyhzcCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiICBzcGVlZG9fcngoKSBzdGF0dXMgJTguOHggbGVuICVkLlxuIiwgc3RhdHVzLAorCQkJCSAgIHBrdF9sZW4pOworCQlpZiAoKHN0YXR1cyAmIChSeEVyclRvb0JpZ3xSeE9LfDB4MGY5MCkpICE9IFJ4T0spIHsKKwkJCWlmIChzdGF0dXMgJiBSeEVyclRvb0JpZykKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFdGhlcm5ldCBmcmFtZSBvdmVycmFuIHRoZSBSeCBidWZmZXIsICIKKwkJCQkJICAgInN0YXR1cyAlOC44eCFcbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCWVsc2UgaWYgKCEgKHN0YXR1cyAmIFJ4T0spKSB7CisJCQkJLyogVGhlcmUgd2FzIGEgZmF0YWwgZXJyb3IuICBUaGlzICpzaG91bGQqIGJlIGltcG9zc2libGUuICovCisJCQkJc3AtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEFub21hbG91cyBldmVudCBpbiBzcGVlZG9fcngoKSwgIgorCQkJCQkgICAic3RhdHVzICU4Ljh4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBqdXN0IGFjY2VwdCB3aXRob3V0CisJCQkgICBjb3B5aW5nIHRvIGEgcHJvcGVybHkgc2l6ZWQgc2tidWZmLiAqLworCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKKwkJCQkmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IDApIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KKwkJCQkvKiAnc2tiX3B1dCgpJyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHNrX2J1ZmYgZGF0YSBhcmVhLiAqLworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzcC0+cGRldiwgc3AtPnJ4X3JpbmdfZG1hW2VudHJ5XSwKKwkJCQkJCQkJCQkJc2l6ZW9mKHN0cnVjdCBSeEZEKSArIHBrdF9sZW4sCisJCQkJCQkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisKKyNpZiAxIHx8IFVTRV9JUF9DU1VNCisJCQkJLyogUGFja2V0IGlzIGluIG9uZSBjaHVuayAtLSB3ZSBjYW4gY29weSArIGNrc3VtLiAqLworCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBzcC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworI2Vsc2UKKwkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLCBzcC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwKKwkJCQkJICAgcGt0X2xlbik7CisjZW5kaWYKKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3AtPnBkZXYsIHNwLT5yeF9yaW5nX2RtYVtlbnRyeV0sCisJCQkJCQkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgUnhGRCkgKyBwa3RfbGVuLAorCQkJCQkJCQkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCW5wa3RzKys7CisJCQl9IGVsc2UgeworCQkJCS8qIFBhc3MgdXAgdGhlIGFscmVhZHktZmlsbGVkIHNrYnVmZi4gKi8KKwkJCQlza2IgPSBzcC0+cnhfc2tidWZmW2VudHJ5XTsKKwkJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW5jb25zaXN0ZW50IFJ4IGRlc2NyaXB0b3IgY2hhaW4uXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXNwLT5yeF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQkJbnBrdHMrKzsKKwkJCQlzcC0+cnhfcmluZ3BbZW50cnldID0gTlVMTDsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHNwLT5wZGV2LCBzcC0+cnhfcmluZ19kbWFbZW50cnldLAorCQkJCQkJCQkgUEtUX0JVRl9TWiArIHNpemVvZihzdHJ1Y3QgUnhGRCksCisJCQkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJc3AtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCXNwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisJCWVudHJ5ID0gKCsrc3AtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CisJCXNwLT5yeF9yaW5nX3N0YXRlICY9IH5SclBvc3Rwb25lZDsKKwkJLyogUmVmaWxsIHRoZSByZWNlbnRseSB0YWtlbiBidWZmZXJzLgorCQkgICBEbyBpdCBvbmUtYnktb25lIHRvIGhhbmRsZSB0cmFmZmljIGJ1cnN0cyBiZXR0ZXIuICovCisJCWlmIChhbGxvY19vayAmJiBzcGVlZG9fcmVmaWxsX3J4X2J1ZihkZXYsIDApID09IC0xKQorCQkJYWxsb2Nfb2sgPSAwOworCX0KKworCS8qIFRyeSBoYXJkIHRvIHJlZmlsbCB0aGUgcmVjZW50bHkgdGFrZW4gYnVmZmVycy4gKi8KKwlzcGVlZG9fcmVmaWxsX3J4X2J1ZmZlcnMoZGV2LCAxKTsKKworCWlmIChucGt0cykKKwkJc3AtPmxhc3RfcnhfdGltZSA9IGppZmZpZXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc3BlZWRvX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBzcC0+cmVnczsKKwlpbnQgaTsKKworCW5ldGRldmljZV9zdG9wKGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKG5ldGlmX21zZ19pZmRvd24oc3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzICU0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMTYoaW9hZGRyICsgU0NCU3RhdHVzKSk7CisKKwkvKiBTaHV0IG9mZiB0aGUgbWVkaWEgbW9uaXRvcmluZyB0aW1lci4gKi8KKwlkZWxfdGltZXJfc3luYygmc3AtPnRpbWVyKTsKKworCWlvd3JpdGUxNihTQ0JNYXNrQWxsLCBpb2FkZHIgKyBTQ0JDbWQpOworCisJLyogU2h1dHRpbmcgZG93biB0aGUgY2hpcCBuaWNlbHkgZmFpbHMgdG8gZGlzYWJsZSBmbG93IGNvbnRyb2wuIFNvLi4gKi8KKwlpb3dyaXRlMzIoUG9ydFBhcnRpYWxSZXNldCwgaW9hZGRyICsgU0NCUG9ydCk7CisJaW9yZWFkMzIoaW9hZGRyICsgU0NCUG9ydCk7IC8qIGZsdXNoIHBvc3RlZCB3cml0ZSAqLworCS8qCisJICogVGhlIGNoaXAgcmVxdWlyZXMgYSAxMCBtaWNyb3NlY29uZCBxdWlldCBwZXJpb2QuICBXYWl0IGhlcmUhCisJICovCisJdWRlbGF5KDEwKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXNwZWVkb19zaG93X3N0YXRlKGRldik7CisKKyAgICAvKiBGcmVlIGFsbCB0aGUgc2tidWZmcyBpbiB0aGUgUnggYW5kIFR4IHF1ZXVlcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNwLT5yeF9za2J1ZmZbaV07CisJCXNwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQkvKiBDbGVhciB0aGUgUnggZGVzY3JpcHRvcnMuICovCisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoc3AtPnBkZXYsCisJCQkJCSBzcC0+cnhfcmluZ19kbWFbaV0sCisJCQkJCSBQS1RfQlVGX1NaICsgc2l6ZW9mKHN0cnVjdCBSeEZEKSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc3AtPnR4X3NrYnVmZltpXTsKKwkJc3AtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCS8qIENsZWFyIHRoZSBUeCBkZXNjcmlwdG9ycy4gKi8KKwkJaWYgKHNrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwKKwkJCQkJIGxlMzJfdG9fY3B1KHNwLT50eF9yaW5nW2ldLnR4X2J1Zl9hZGRyMCksCisJCQkJCSBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCX0KKwl9CisKKwkvKiBGcmVlIG11bHRpY2FzdCBzZXR0aW5nIGJsb2Nrcy4gKi8KKwlmb3IgKGkgPSAwOyBzcC0+bWNfc2V0dXBfaGVhZCAhPSBOVUxMOyBpKyspIHsKKwkJc3RydWN0IHNwZWVkb19tY19ibG9jayAqdDsKKwkJdCA9IHNwLT5tY19zZXR1cF9oZWFkLT5uZXh0OworCQlrZnJlZShzcC0+bWNfc2V0dXBfaGVhZCk7CisJCXNwLT5tY19zZXR1cF9oZWFkID0gdDsKKwl9CisJc3AtPm1jX3NldHVwX3RhaWwgPSBOVUxMOworCWlmIChuZXRpZl9tc2dfaWZkb3duKHNwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlZCBtdWx0aWNhc3QgYmxvY2tzIGRyb3BwZWQuXG4iLCBkZXYtPm5hbWUsIGkpOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShzcC0+cGRldiwgUENJX0QyKTsKKworCXJldHVybiAwOworfQorCisvKiBUaGUgU3BlZWRvLTMgaGFzIGFuIGVzcGVjaWFsbHkgYXdrd2FyZCBhbmQgdW51c2FibGUgbWV0aG9kIG9mIGdldHRpbmcKKyAgIHN0YXRpc3RpY3Mgb3V0IG9mIHRoZSBjaGlwLiAgSXQgdGFrZXMgYW4gdW5wcmVkaWN0YWJsZSBsZW5ndGggb2YgdGltZQorICAgZm9yIHRoZSBkdW1wLXN0YXRzIGNvbW1hbmQgdG8gY29tcGxldGUuICBUbyBhdm9pZCBhIGJ1c3ktd2FpdCBsb29wIHdlCisgICB1cGRhdGUgdGhlIHN0YXRzIHdpdGggdGhlIHByZXZpb3VzIGR1bXAgcmVzdWx0cywgYW5kIHRoZW4gdHJpZ2dlciBhCisgICBuZXcgZHVtcC4KKworICAgT2gsIGFuZCBpbmNvbWluZyBmcmFtZXMgYXJlIGRyb3BwZWQgd2hpbGUgZXhlY3V0aW5nIGR1bXAtc3RhdHMhCisgICAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK3NwZWVkb19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHNwLT5yZWdzOworCisJLyogVXBkYXRlIG9ubHkgaWYgdGhlIHByZXZpb3VzIGR1bXAgZmluaXNoZWQuICovCisJaWYgKHNwLT5sc3RhdHMtPmRvbmVfbWFya2VyID09IGxlMzJfdG9fY3B1KDB4QTAwNykpIHsKKwkJc3AtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IGxlMzJfdG9fY3B1KHNwLT5sc3RhdHMtPnR4X2NvbGwxNl9lcnJzKTsKKwkJc3AtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMgKz0gbGUzMl90b19jcHUoc3AtPmxzdGF0cy0+dHhfbGF0ZV9jb2xscyk7CisJCXNwLT5zdGF0cy50eF9maWZvX2Vycm9ycyArPSBsZTMyX3RvX2NwdShzcC0+bHN0YXRzLT50eF91bmRlcnJ1bnMpOworCQlzcC0+c3RhdHMudHhfZmlmb19lcnJvcnMgKz0gbGUzMl90b19jcHUoc3AtPmxzdGF0cy0+dHhfbG9zdF9jYXJyaWVyKTsKKwkJLypzcC0+c3RhdHMudHhfZGVmZXJyZWQgKz0gbGUzMl90b19jcHUoc3AtPmxzdGF0cy0+dHhfZGVmZXJyZWQpOyovCisJCXNwLT5zdGF0cy5jb2xsaXNpb25zICs9IGxlMzJfdG9fY3B1KHNwLT5sc3RhdHMtPnR4X3RvdGFsX2NvbGxzKTsKKwkJc3AtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gbGUzMl90b19jcHUoc3AtPmxzdGF0cy0+cnhfY3JjX2VycnMpOworCQlzcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGxlMzJfdG9fY3B1KHNwLT5sc3RhdHMtPnJ4X2FsaWduX2VycnMpOworCQlzcC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgKz0gbGUzMl90b19jcHUoc3AtPmxzdGF0cy0+cnhfcmVzb3VyY2VfZXJycyk7CisJCXNwLT5zdGF0cy5yeF9maWZvX2Vycm9ycyArPSBsZTMyX3RvX2NwdShzcC0+bHN0YXRzLT5yeF9vdmVycnVuX2VycnMpOworCQlzcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyArPSBsZTMyX3RvX2NwdShzcC0+bHN0YXRzLT5yeF9ydW50X2VycnMpOworCQlzcC0+bHN0YXRzLT5kb25lX21hcmtlciA9IDB4MDAwMDsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCS8qIFRha2UgYSBzcGlubG9jayB0byBtYWtlIHdhaXRfZm9yX2NtZF9kb25lIGFuZCBzZW5kaW5nIHRoZQorCQkJICAgY29tbWFuZCBhdG9taWMuICAtLVNBVyAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNwLT5sb2NrLCBmbGFncyk7CisJCQl3YWl0X2Zvcl9jbWRfZG9uZShkZXYsIHNwKTsKKwkJCWlvd3JpdGU4KENVRHVtcFN0YXRzLCBpb2FkZHIgKyBTQ0JDbWQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwkJfQorCX0KKwlyZXR1cm4gJnNwLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgc3BlZWRvX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RybmNweShpbmZvLT5kcml2ZXIsICJlZXBybzEwMCIsIHNpemVvZihpbmZvLT5kcml2ZXIpLTEpOworCXN0cm5jcHkoaW5mby0+dmVyc2lvbiwgdmVyc2lvbiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pLTEpOworCWlmIChzcC0+cGRldikKKwkJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShzcC0+cGRldikpOworfQorCitzdGF0aWMgaW50IHNwZWVkb19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXNwaW5fbG9ja19pcnEoJnNwLT5sb2NrKTsKKwltaWlfZXRodG9vbF9nc2V0KCZzcC0+bWlpX2lmLCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJnNwLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGVlZG9fc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmVzOworCXNwaW5fbG9ja19pcnEoJnNwLT5sb2NrKTsKKwlyZXMgPSBtaWlfZXRodG9vbF9zc2V0KCZzcC0+bWlpX2lmLCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJnNwLT5sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHNwZWVkb19ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIG1paV9ud2F5X3Jlc3RhcnQoJnNwLT5taWlfaWYpOworfQorCitzdGF0aWMgdTMyIHNwZWVkb19nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBtaWlfbGlua19vaygmc3AtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgc3BlZWRvX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBzcC0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgc3BlZWRvX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdikKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcC0+bXNnX2VuYWJsZSA9IHY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvID0gc3BlZWRvX2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MgPSBzcGVlZG9fZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBzcGVlZG9fc2V0X3NldHRpbmdzLAorCS5ud2F5X3Jlc2V0ID0gc3BlZWRvX253YXlfcmVzZXQsCisJLmdldF9saW5rID0gc3BlZWRvX2dldF9saW5rLAorCS5nZXRfbXNnbGV2ZWwgPSBzcGVlZG9fZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwgPSBzcGVlZG9fc2V0X21zZ2xldmVsLAorfTsKKworc3RhdGljIGludCBzcGVlZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkocnEpOworCWludCBwaHkgPSBzcC0+cGh5WzBdICYgMHgxZjsKKwlpbnQgc2F2ZWRfYWNwaTsKKwlpbnQgdDsKKworICAgIHN3aXRjaChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgkJLyogR2V0IGFkZHJlc3Mgb2YgTUlJIFBIWSBpbiB1c2UuICovCisJCWRhdGEtPnBoeV9pZCA9IHBoeTsKKworCWNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCS8qIEZJWE1FOiB0aGVzZSBvcGVyYXRpb25zIG5lZWQgdG8gYmUgc2VyaWFsaXplZCB3aXRoIE1ESU8KKwkJICAgYWNjZXNzIGZyb20gdGhlIHRpbWVvdXQgaGFuZGxlci4KKwkJICAgVGhleSBhcmUgY3VycmVudGx5IHNlcmlhbGl6ZWQgb25seSB3aXRoIE1ESU8gYWNjZXNzIGZyb20gdGhlCisJCSAgIHRpbWVyIHJvdXRpbmUuICAyMDAwLzA1LzA5IFNBVyAqLworCQlzYXZlZF9hY3BpID0gcGNpX3NldF9wb3dlcl9zdGF0ZShzcC0+cGRldiwgUENJX0QwKTsKKwkJdCA9IGRlbF90aW1lcl9zeW5jKCZzcC0+dGltZXIpOworCQlkYXRhLT52YWxfb3V0ID0gbWRpb19yZWFkKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYpOworCQlpZiAodCkKKwkJCWFkZF90aW1lcigmc3AtPnRpbWVyKTsgLyogbWF5IGJlIHNldCB0byB0aGUgcGFzdCAgLS1TQVcgKi8KKwkJcGNpX3NldF9wb3dlcl9zdGF0ZShzcC0+cGRldiwgc2F2ZWRfYWNwaSk7CisJCXJldHVybiAwOworCisJY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCXNhdmVkX2FjcGkgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHNwLT5wZGV2LCBQQ0lfRDApOworCQl0ID0gZGVsX3RpbWVyX3N5bmMoJnNwLT50aW1lcik7CisJCW1kaW9fd3JpdGUoZGV2LCBkYXRhLT5waHlfaWQsIGRhdGEtPnJlZ19udW0sIGRhdGEtPnZhbF9pbik7CisJCWlmICh0KQorCQkJYWRkX3RpbWVyKCZzcC0+dGltZXIpOyAvKiBtYXkgYmUgc2V0IHRvIHRoZSBwYXN0ICAtLVNBVyAqLworCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHNwLT5wZGV2LCBzYXZlZF9hY3BpKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgICBUaGlzIGlzIHZlcnkgdWdseSB3aXRoIEludGVsIGNoaXBzIC0tIHdlIHVzdWFsbHkgaGF2ZSB0byBleGVjdXRlIGFuCisgICBlbnRpcmUgY29uZmlndXJhdGlvbiBjb21tYW5kLCBwbHVzIHByb2Nlc3MgYSBtdWx0aWNhc3QgY29tbWFuZC4KKyAgIFRoaXMgaXMgY29tcGxpY2F0ZWQuICBXZSBtdXN0IHB1dCBhIGxhcmdlIGNvbmZpZ3VyYXRpb24gY29tbWFuZCBhbmQKKyAgIGFuIGFyYml0cmFyaWx5LXNpemVkIG11bHRpY2FzdCBjb21tYW5kIGluIHRoZSB0cmFuc21pdCBsaXN0LgorICAgVG8gbWluaW1pemUgdGhlIGRpc3J1cHRpb24gLS0gdGhlIHByZXZpb3VzIGNvbW1hbmQgbWlnaHQgaGF2ZSBhbHJlYWR5CisgICBsb2FkZWQgdGhlIGxpbmsgLS0gd2UgY29udmVydCB0aGUgY3VycmVudCBjb21tYW5kIGJsb2NrLCBub3JtYWxseSBhIFR4CisgICBjb21tYW5kLCBpbnRvIGEgbm8tb3AgYW5kIGxpbmsgaXQgdG8gdGhlIG5ldyBjb21tYW5kLgorKi8KK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBzcC0+cmVnczsKKwlzdHJ1Y3QgZGVzY3JpcHRvciAqbGFzdF9jbWQ7CisJY2hhciBuZXdfcnhfbW9kZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlbnRyeSwgaTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJCQkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCW5ld19yeF9tb2RlID0gMzsKKwl9IGVsc2UgaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSAgfHwKKwkJCSAgIGRldi0+bWNfY291bnQgPiBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0KSB7CisJCW5ld19yeF9tb2RlID0gMTsKKwl9IGVsc2UKKwkJbmV3X3J4X21vZGUgPSAwOworCisJaWYgKG5ldGlmX21zZ19yeF9zdGF0dXMoc3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNldF9yeF9tb2RlICVkIC0+ICVkXG4iLCBkZXYtPm5hbWUsCisJCQkJc3AtPnJ4X21vZGUsIG5ld19yeF9tb2RlKTsKKworCWlmICgoaW50KShzcC0+Y3VyX3R4IC0gc3AtPmRpcnR5X3R4KSA+IFRYX1JJTkdfU0laRSAtIFRYX01VTFRJQ0FTVF9TSVpFKSB7CisJICAgIC8qIFRoZSBUeCByaW5nIGlzIGZ1bGwgLS0gZG9uJ3QgYWRkIGFueXRoaW5nISAgSG9wZSB0aGUgbW9kZSB3aWxsIGJlCisJCSAqIHNldCBhZ2FpbiBsYXRlci4gKi8KKwkJc3AtPnJ4X21vZGUgPSAtMTsKKwkJcmV0dXJuOworCX0KKworCWlmIChuZXdfcnhfbW9kZSAhPSBzcC0+cnhfbW9kZSkgeworCQl1OCAqY29uZmlnX2NtZF9kYXRhOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+bG9jaywgZmxhZ3MpOworCQllbnRyeSA9IHNwLT5jdXJfdHgrKyAlIFRYX1JJTkdfU0laRTsKKwkJbGFzdF9jbWQgPSBzcC0+bGFzdF9jbWQ7CisJCXNwLT5sYXN0X2NtZCA9IChzdHJ1Y3QgZGVzY3JpcHRvciAqKSZzcC0+dHhfcmluZ1tlbnRyeV07CisKKwkJc3AtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOwkJCS8qIFJlZHVuZGFudC4gKi8KKwkJc3AtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9IGNwdV90b19sZTMyKENtZFN1c3BlbmQgfCBDbWRDb25maWd1cmUpOworCQlzcC0+dHhfcmluZ1tlbnRyeV0ubGluayA9CisJCQljcHVfdG9fbGUzMihUWF9SSU5HX0VMRU1fRE1BKHNwLCAoZW50cnkgKyAxKSAlIFRYX1JJTkdfU0laRSkpOworCQljb25maWdfY21kX2RhdGEgPSAodm9pZCAqKSZzcC0+dHhfcmluZ1tlbnRyeV0udHhfZGVzY19hZGRyOworCQkvKiBDb25zdHJ1Y3QgYSBmdWxsIENtZENvbmZpZyBmcmFtZS4gKi8KKwkJbWVtY3B5KGNvbmZpZ19jbWRfZGF0YSwgaTgyNTU4X2NvbmZpZ19jbWQsIENPTkZJR19EQVRBX1NJWkUpOworCQljb25maWdfY21kX2RhdGFbMV0gPSAodHhmaWZvIDw8IDQpIHwgcnhmaWZvOworCQljb25maWdfY21kX2RhdGFbNF0gPSByeGRtYWNvdW50OworCQljb25maWdfY21kX2RhdGFbNV0gPSB0eGRtYWNvdW50ICsgMHg4MDsKKwkJY29uZmlnX2NtZF9kYXRhWzE1XSB8PSAobmV3X3J4X21vZGUgJiAyKSA/IDEgOiAwOworCQkvKiAweDgwIGRvZXNuJ3QgZGlzYWJsZSBGQyAweDg0IGRvZXMuCisJCSAgIERpc2FibGUgRmxvdyBjb250cm9sIHNpbmNlIHdlIGFyZSBub3QgQUNLLWluZyBhbnkgRkMgaW50ZXJydXB0cworCQkgICBmb3Igbm93LiAtLURyYWdhbiAqLworCQljb25maWdfY21kX2RhdGFbMTldID0gMHg4NDsKKwkJY29uZmlnX2NtZF9kYXRhWzE5XSB8PSBzcC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID8gMHg0MCA6IDA7CisJCWNvbmZpZ19jbWRfZGF0YVsyMV0gPSAobmV3X3J4X21vZGUgJiAxKSA/IDB4MEQgOiAweDA1OworCQlpZiAoc3AtPnBoeVswXSAmIDB4ODAwMCkgewkJCS8qIFVzZSB0aGUgQVVJIHBvcnQgaW5zdGVhZC4gKi8KKwkJCWNvbmZpZ19jbWRfZGF0YVsxNV0gfD0gMHg4MDsKKwkJCWNvbmZpZ19jbWRfZGF0YVs4XSA9IDA7CisJCX0KKwkJLyogVHJpZ2dlciB0aGUgY29tbWFuZCB1bml0IHJlc3VtZS4gKi8KKwkJd2FpdF9mb3JfY21kX2RvbmUoZGV2LCBzcCk7CisJCWNsZWFyX3N1c3BlbmQobGFzdF9jbWQpOworCQlpb3dyaXRlOChDVVJlc3VtZSwgaW9hZGRyICsgU0NCQ21kKTsKKwkJaWYgKChpbnQpKHNwLT5jdXJfdHggLSBzcC0+ZGlydHlfdHgpID49IFRYX1FVRVVFX0xJTUlUKSB7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQlzcC0+dHhfZnVsbCA9IDE7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAobmV3X3J4X21vZGUgPT0gMCAgJiYgIGRldi0+bWNfY291bnQgPCA0KSB7CisJCS8qIFRoZSBzaW1wbGUgY2FzZSBvZiAwLTMgbXVsdGljYXN0IGxpc3QgZW50cmllcyBvY2N1cnMgb2Z0ZW4sIGFuZAorCQkgICBmaXRzIHdpdGhpbiBvbmUgdHhfcmluZ1tdIGVudHJ5LiAqLworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJdTE2ICpzZXR1cF9wYXJhbXMsICplYWRkcnM7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNwLT5sb2NrLCBmbGFncyk7CisJCWVudHJ5ID0gc3AtPmN1cl90eCsrICUgVFhfUklOR19TSVpFOworCQlsYXN0X2NtZCA9IHNwLT5sYXN0X2NtZDsKKwkJc3AtPmxhc3RfY21kID0gKHN0cnVjdCBkZXNjcmlwdG9yICopJnNwLT50eF9yaW5nW2VudHJ5XTsKKworCQlzcC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCXNwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBjcHVfdG9fbGUzMihDbWRTdXNwZW5kIHwgQ21kTXVsdGljYXN0TGlzdCk7CisJCXNwLT50eF9yaW5nW2VudHJ5XS5saW5rID0KKwkJCWNwdV90b19sZTMyKFRYX1JJTkdfRUxFTV9ETUEoc3AsIChlbnRyeSArIDEpICUgVFhfUklOR19TSVpFKSk7CisJCXNwLT50eF9yaW5nW2VudHJ5XS50eF9kZXNjX2FkZHIgPSAwOyAvKiBSZWFsbHkgTUMgbGlzdCBjb3VudC4gKi8KKwkJc2V0dXBfcGFyYW1zID0gKHUxNiAqKSZzcC0+dHhfcmluZ1tlbnRyeV0udHhfZGVzY19hZGRyOworCQkqc2V0dXBfcGFyYW1zKysgPSBjcHVfdG9fbGUxNihkZXYtPm1jX2NvdW50KjYpOworCQkvKiBGaWxsIGluIHRoZSBtdWx0aWNhc3QgYWRkcmVzc2VzLiAqLworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IGkgPCBkZXYtPm1jX2NvdW50OworCQkJIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQllYWRkcnMgPSAodTE2ICopbWNsaXN0LT5kbWlfYWRkcjsKKwkJCSpzZXR1cF9wYXJhbXMrKyA9ICplYWRkcnMrKzsKKwkJCSpzZXR1cF9wYXJhbXMrKyA9ICplYWRkcnMrKzsKKwkJCSpzZXR1cF9wYXJhbXMrKyA9ICplYWRkcnMrKzsKKwkJfQorCisJCXdhaXRfZm9yX2NtZF9kb25lKGRldiwgc3ApOworCQljbGVhcl9zdXNwZW5kKGxhc3RfY21kKTsKKwkJLyogSW1tZWRpYXRlbHkgdHJpZ2dlciB0aGUgY29tbWFuZCB1bml0IHJlc3VtZS4gKi8KKwkJaW93cml0ZTgoQ1VSZXN1bWUsIGlvYWRkciArIFNDQkNtZCk7CisKKwkJaWYgKChpbnQpKHNwLT5jdXJfdHggLSBzcC0+ZGlydHlfdHgpID49IFRYX1FVRVVFX0xJTUlUKSB7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQlzcC0+dHhfZnVsbCA9IDE7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgaWYgKG5ld19yeF9tb2RlID09IDApIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCXUxNiAqc2V0dXBfcGFyYW1zLCAqZWFkZHJzOworCQlzdHJ1Y3Qgc3BlZWRvX21jX2Jsb2NrICptY19ibGs7CisJCXN0cnVjdCBkZXNjcmlwdG9yICptY19zZXR1cF9mcm07CisJCWludCBpOworCisJCW1jX2JsayA9IGttYWxsb2Moc2l6ZW9mKCptY19ibGspICsgMiArIG11bHRpY2FzdF9maWx0ZXJfbGltaXQqNiwKKwkJCQkJCSBHRlBfQVRPTUlDKTsKKwkJaWYgKG1jX2JsayA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgYSBzZXR1cCBmcmFtZS5cbiIsCisJCQkJICAgZGV2LT5uYW1lKTsKKwkJCXNwLT5yeF9tb2RlID0gLTE7IC8qIFdlIGZhaWxlZCwgdHJ5IGFnYWluLiAqLworCQkJcmV0dXJuOworCQl9CisJCW1jX2Jsay0+bmV4dCA9IE5VTEw7CisJCW1jX2Jsay0+bGVuID0gMiArIG11bHRpY2FzdF9maWx0ZXJfbGltaXQqNjsKKwkJbWNfYmxrLT5mcmFtZV9kbWEgPQorCQkJcGNpX21hcF9zaW5nbGUoc3AtPnBkZXYsICZtY19ibGstPmZyYW1lLCBtY19ibGstPmxlbiwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCW1jX3NldHVwX2ZybSA9ICZtY19ibGstPmZyYW1lOworCisJCS8qIEZpbGwgdGhlIHNldHVwIGZyYW1lLiAqLworCQlpZiAobmV0aWZfbXNnX2lmdXAoc3ApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDb25zdHJ1Y3RpbmcgYSBzZXR1cCBmcmFtZSBhdCAlcC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBtY19zZXR1cF9mcm0pOworCQltY19zZXR1cF9mcm0tPmNtZF9zdGF0dXMgPQorCQkJY3B1X3RvX2xlMzIoQ21kU3VzcGVuZCB8IENtZEludHIgfCBDbWRNdWx0aWNhc3RMaXN0KTsKKwkJLyogTGluayBzZXQgYmVsb3cuICovCisJCXNldHVwX3BhcmFtcyA9ICh1MTYgKikmbWNfc2V0dXBfZnJtLT5wYXJhbXM7CisJCSpzZXR1cF9wYXJhbXMrKyA9IGNwdV90b19sZTE2KGRldi0+bWNfY291bnQqNik7CisJCS8qIEZpbGwgaW4gdGhlIG11bHRpY2FzdCBhZGRyZXNzZXMuICovCisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgaSA8IGRldi0+bWNfY291bnQ7CisJCQkgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWVhZGRycyA9ICh1MTYgKiltY2xpc3QtPmRtaV9hZGRyOworCQkJKnNldHVwX3BhcmFtcysrID0gKmVhZGRycysrOworCQkJKnNldHVwX3BhcmFtcysrID0gKmVhZGRycysrOworCQkJKnNldHVwX3BhcmFtcysrID0gKmVhZGRycysrOworCQl9CisKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWxlIHBsYXlpbmcgd2l0aCB0aGUgVHggQ21kIGxpc3QuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+bG9jaywgZmxhZ3MpOworCisJCWlmIChzcC0+bWNfc2V0dXBfdGFpbCkKKwkJCXNwLT5tY19zZXR1cF90YWlsLT5uZXh0ID0gbWNfYmxrOworCQllbHNlCisJCQlzcC0+bWNfc2V0dXBfaGVhZCA9IG1jX2JsazsKKwkJc3AtPm1jX3NldHVwX3RhaWwgPSBtY19ibGs7CisJCW1jX2Jsay0+dHggPSBzcC0+Y3VyX3R4OworCisJCWVudHJ5ID0gc3AtPmN1cl90eCsrICUgVFhfUklOR19TSVpFOworCQlsYXN0X2NtZCA9IHNwLT5sYXN0X2NtZDsKKwkJc3AtPmxhc3RfY21kID0gbWNfc2V0dXBfZnJtOworCisJCS8qIENoYW5nZSB0aGUgY29tbWFuZCB0byBhIE5vT3AsIHBvaW50aW5nIHRvIHRoZSBDbWRNdWx0aSBjb21tYW5kLiAqLworCQlzcC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCXNwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBjcHVfdG9fbGUzMihDbWROT3ApOworCQlzcC0+dHhfcmluZ1tlbnRyeV0ubGluayA9IGNwdV90b19sZTMyKG1jX2Jsay0+ZnJhbWVfZG1hKTsKKworCQkvKiBTZXQgdGhlIGxpbmsgaW4gdGhlIHNldHVwIGZyYW1lLiAqLworCQltY19zZXR1cF9mcm0tPmxpbmsgPQorCQkJY3B1X3RvX2xlMzIoVFhfUklOR19FTEVNX0RNQShzcCwgKGVudHJ5ICsgMSkgJSBUWF9SSU5HX1NJWkUpKTsKKworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3AtPnBkZXYsIG1jX2Jsay0+ZnJhbWVfZG1hLAorCQkJCQkJCQkJICAgbWNfYmxrLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCXdhaXRfZm9yX2NtZF9kb25lKGRldiwgc3ApOworCQljbGVhcl9zdXNwZW5kKGxhc3RfY21kKTsKKwkJLyogSW1tZWRpYXRlbHkgdHJpZ2dlciB0aGUgY29tbWFuZCB1bml0IHJlc3VtZS4gKi8KKwkJaW93cml0ZTgoQ1VSZXN1bWUsIGlvYWRkciArIFNDQkNtZCk7CisKKwkJaWYgKChpbnQpKHNwLT5jdXJfdHggLSBzcC0+ZGlydHlfdHgpID49IFRYX1FVRVVFX0xJTUlUKSB7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQlzcC0+dHhfZnVsbCA9IDE7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAobmV0aWZfbXNnX3J4X3N0YXR1cyhzcCkpCisJCQlwcmludGsoIiBDbWRNQ1NldHVwIGZyYW1lIGxlbmd0aCAlZCBpbiBlbnRyeSAlZC5cbiIsCisJCQkJICAgZGV2LT5tY19jb3VudCwgZW50cnkpOworCX0KKworCXNwLT5yeF9tb2RlID0gbmV3X3J4X21vZGU7Cit9CisMCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGVlcHJvMTAwX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHNwLT5yZWdzOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIDA7CisJCQorCWRlbF90aW1lcl9zeW5jKCZzcC0+dGltZXIpOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCWlvd3JpdGUzMihQb3J0UGFydGlhbFJlc2V0LCBpb2FkZHIgKyBTQ0JQb3J0KTsKKwkKKwkvKiBYWFggY2FsbCBwY2lfc2V0X3Bvd2VyX3N0YXRlICgpPyAqLworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlIChwZGV2LCBQQ0lfRDNob3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVlcHJvMTAwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHNwLT5yZWdzOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCisJLyogSSdtIGFic29sdXRlbHkgdW5jZXJ0YWluIGlmIHRoaXMgcGFydCBvZiBjb2RlIG1heSB3b3JrLgorCSAgIFRoZSBwcm9ibGVtcyBhcmU6CisJICAgIC0gY29ycmVjdCBoYXJkd2FyZSByZWluaXRpYWxpemF0aW9uOworCQktIGNvcnJlY3QgZHJpdmVyIGJlaGF2aW9yIGJldHdlZW4gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZQorCQkgIHJlaW5pdGlhbGl6YXRpb247CisJCS0gc2VyaWFsaXphdGlvbiB3aXRoIG90aGVyIGRyaXZlciBjYWxscy4KKwkgICAyMDAwLzAzLzA4ICBTQVcgKi8KKwlpb3dyaXRlMTYoU0NCTWFza0FsbCwgaW9hZGRyICsgU0NCQ21kKTsKKwlzcGVlZG9fcmVzdW1lKGRldik7CisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCXNwLT5yeF9tb2RlID0gLTE7CisJc3AtPmZsb3dfY3RybCA9IHNwLT5wYXJ0bmVyID0gMDsKKwlzZXRfcnhfbW9kZShkZXYpOworCXNwLT50aW1lci5leHBpcmVzID0gUlVOX0FUKDIqSFopOworCWFkZF90aW1lcigmc3AtPnRpbWVyKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGVlcHJvMTAwX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwlyZWxlYXNlX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCisJcGNpX2lvdW5tYXAocGRldiwgc3AtPnJlZ3MpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCBUeEZEKQorCQkJCQkJCQkrIHNpemVvZihzdHJ1Y3Qgc3BlZWRvX3N0YXRzKSwKKwkJCQkJCXNwLT50eF9yaW5nLCBzcC0+dHhfcmluZ19kbWEpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworfQorDAorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGVlcHJvMTAwX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTIyOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTIwOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAyOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzQSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzQiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzQywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTAzRSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTA1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTA1OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTIyNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjQ0OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjQ1OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjQ1RCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NTIwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NTIwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDAsfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBlZXBybzEwMF9wY2lfdGJsKTsKKwkKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlZXBybzEwMF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImVlcHJvMTAwIiwKKwkuaWRfdGFibGUJPSBlZXBybzEwMF9wY2lfdGJsLAorCS5wcm9iZQkJPSBlZXBybzEwMF9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGVlcHJvMTAwX3JlbW92ZV9vbmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gZWVwcm8xMDBfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGVlcHJvMTAwX3Jlc3VtZSwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVlcHJvMTAwX2luaXRfbW9kdWxlKHZvaWQpCit7CisjaWZkZWYgTU9EVUxFCisJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZWVwcm8xMDBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVlcHJvMTAwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZlZXBybzEwMF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChlZXBybzEwMF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChlZXBybzEwMF9jbGVhbnVwX21vZHVsZSk7CisMCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLUkvdXNyL3NyYy9saW51eC9uZXQvaW5ldCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtYyBlZXBybzEwMC5jIGBbIC1mIC91c3IvaW5jbHVkZS9saW51eC9tb2R2ZXJzaW9ucy5oIF0gJiYgZWNobyAtRE1PRFZFUlNJT05TYCIKKyAqICBjLWluZGVudC1sZXZlbDogNAorICogIGMtYmFzaWMtb2Zmc2V0OiA0CisgKiAgdGFiLXdpZHRoOiA0CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VleHByZXNzLmMgYi9kcml2ZXJzL25ldC9lZXhwcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOGU3OTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lZXhwcmVzcy5jCkBAIC0wLDAgKzEsMTc1MiBAQAorLyogSW50ZWwgRXRoZXJFeHByZXNzIDE2IGRldmljZSBkcml2ZXIgZm9yIExpbnV4CisgKgorICogV3JpdHRlbiBieSBKb2huIFN1bGxpdmFuLCAxOTk1CisgKiAgYmFzZWQgb24gb3JpZ2luYWwgY29kZSBieSBEb25hbGQgQmVja2VyLCB3aXRoIGNoYW5nZXMgYnkKKyAqICBBbGFuIENveCBhbmQgUGF1bGluZSBNaWRkZWxpbmsuCisgKgorICogU3VwcG9ydCBmb3IgOC1iaXQgbW9kZSBieSBab2x0YW4gU3ppbGFneWkgPHpvbHRhbnNAY3MuYXJpem9uYS5lZHU+CisgKgorICogTWFueSBtb2RpZmljYXRpb25zLCBhbmQgY3VycmVudGx5IG1haW50YWluZWQsIGJ5CisgKiAgUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgorICogQWRkZWQgdGhlIENvbXBhcSBMVEUgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKiBBZGRlZCBNQ0Egc3VwcG9ydCBBZGFtIEZyaXR6bGVyIDxtaWRAYXVrLmN4PgorICoKKyAqIE5vdGUgLSB0aGlzIGRyaXZlciBpcyBleHBlcmltZW50YWwgc3RpbGwgLSBpdCBoYXMgcHJvYmxlbXMgb24gZmFzdGVyCisgKiBtYWNoaW5lcy4gU29tZW9uZSBuZWVkcyB0byBzaXQgZG93biBhbmQgZ28gdGhyb3VnaCBpdCBsaW5lIGJ5IGxpbmUgd2l0aAorICogYSBkYXRhYm9vay4uLgorICovCisKKy8qIFRoZSBFdGhlckV4cHJlc3MgMTYgaXMgYSBmYWlybHkgc2ltcGxlIGNhcmQsIGJhc2VkIG9uIGEgc2hhcmVkLW1lbW9yeQorICogZGVzaWduIHVzaW5nIHRoZSBpODI1ODYgRXRoZXJuZXQgY29wcm9jZXNzb3IuICBJdCBiZWFycyBubyByZWxhdGlvbnNoaXAsCisgKiBhcyBmYXIgYXMgSSBrbm93LCB0byB0aGUgc2ltaWxhcmx5LW5hbWVkICJFdGhlckV4cHJlc3MgUHJvIiByYW5nZS4KKyAqCisgKiBIaXN0b3JpY2FsbHksIExpbnV4IHN1cHBvcnQgZm9yIHRoZXNlIGNhcmRzIGhhcyBiZWVuIHZlcnkgYmFkLiAgSG93ZXZlciwKKyAqIHRoaW5ncyBzZWVtIHRvIGJlIGdldHRpbmcgYmV0dGVyIHNsb3dseS4KKyAqLworCisvKiBJZiB5b3VyIGNhcmQgaXMgY29uZnVzZWQgYWJvdXQgd2hhdCBzb3J0IG9mIGludGVyZmFjZSBpdCBoYXMgKGVnIGl0CisgKiBwZXJzaXN0ZW50bHkgcmVwb3J0cyAiMTBiYXNlVCIgd2hlbiBub25lIGlzIGZpdHRlZCksIHJ1bm5pbmcgJ1NPRlRTRVQgL0JBUlQnCisgKiBvciAnU09GVFNFVCAvTElTQScgZnJvbSBET1Mgc2VlbXMgdG8gaGVscC4KKyAqLworCisvKiBIZXJlJ3MgdGhlIHNjb29wIG9uIG1lbW9yeSBtYXBwaW5nLgorICoKKyAqIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGFjY2VzcyBFdGhlckV4cHJlc3MgY2FyZCBtZW1vcnk6IGVpdGhlciB1c2luZyB0aGUKKyAqIHNoYXJlZC1tZW1vcnkgbWFwcGluZywgb3IgdXNpbmcgUElPIHRocm91Z2ggdGhlIGRhdGFwb3J0LCBvciB1c2luZyBQSU8KKyAqIHRocm91Z2ggdGhlICJzaGFkb3cgbWVtb3J5IiBwb3J0cy4KKyAqCisgKiBUaGUgc2hhZG93IG1lbW9yeSBzeXN0ZW0gd29ya3MgYnkgaGF2aW5nIHRoZSBjYXJkIG1hcCBzb21lIG9mIGl0cyBtZW1vcnkKKyAqIGFzIGZvbGxvd3M6CisgKgorICogKHRoZSBsb3cgZml2ZSBiaXRzIG9mIHRoZSBTTVBUUiBhcmUgaWdub3JlZCkKKyAqCisgKiAgYmFzZSsweDQwMDAuLjQwMGYgICAgICBtZW1vcnkgYXQgU01QVFIrMC4uMTUKKyAqICBiYXNlKzB4ODAwMC4uODAwZiAgICAgIG1lbW9yeSBhdCBTTVBUUisxNi4uMzEKKyAqICBiYXNlKzB4YzAwMC4uYzAwNyAgICAgIGR1YmlvdXMgc3R1ZmYgKG1lbW9yeSBhdCBTTVBUUisxNi4uMjMgYXBwYXJlbnRseSkKKyAqICBiYXNlKzB4YzAwOC4uYzAwZiAgICAgIG1lbW9yeSBhdCAweDAwMDguLjB4MDAwZgorICoKKyAqIFRoaXMgbGFzdCBzZXQgKHRoZSBvbmUgYXQgYzAwOCkgaXMgcGFydGljdWxhcmx5IGhhbmR5IGJlY2F1c2UgdGhlIFNDQgorICogbGl2ZXMgYXQgMHgwMDA4LiAgU28gdGhhdCBzZXQgb2YgcG9ydHMgZ2l2ZXMgdXMgZWFzeSByYW5kb20gYWNjZXNzIHRvIGRhdGEKKyAqIGluIHRoZSBTQ0Igd2l0aG91dCBoYXZpbmcgdG8gbWVzcyBhcm91bmQgc2V0dGluZyB1cCBwb2ludGVycyBhbmQgdGhlIGxpa2UuCisgKiBXZSBhbHdheXMgdXNlIHRoaXMgbWV0aG9kIHRvIGFjY2VzcyB0aGUgU0NCICh2aWEgdGhlIHNjYl94eCgpIGZ1bmN0aW9ucykuCisgKgorICogRGF0YXBvcnQgYWNjZXNzIHdvcmtzIGJ5IGFpbWluZyB0aGUgYXBwcm9wcmlhdGUgKHJlYWQgb3Igd3JpdGUpIHBvaW50ZXIKKyAqIGF0IHRoZSBmaXJzdCBhZGRyZXNzIHlvdSdyZSBpbnRlcmVzdGVkIGluLCBhbmQgdGhlbiByZWFkaW5nIG9yIHdyaXRpbmcgZnJvbQorICogdGhlIGRhdGFwb3J0LiAgVGhlIHBvaW50ZXJzIGF1dG8taW5jcmVtZW50IGFmdGVyIGVhY2ggdHJhbnNmZXIuICBXZSB1c2UKKyAqIHRoaXMgZm9yIGRhdGEgdHJhbnNmZXIuCisgKgorICogV2UgZG9uJ3QgdXNlIHRoZSBzaGFyZWQtbWVtb3J5IHN5c3RlbSBiZWNhdXNlIGl0IGFsbGVnZWRseSBkb2Vzbid0IHdvcmsgb24KKyAqIGFsbCBjYXJkcywgYW5kIGJlY2F1c2UgaXQncyBhIGJpdCBtb3JlIHByb25lIHRvIGdvIHdyb25nIChpdCdzIG9uZSBtb3JlCisgKiB0aGluZyB0byBjb25maWd1cmUuLi4pLgorICovCisKKy8qIEtub3duIGJ1Z3M6CisgKgorICogLSBUaGUgY2FyZCBzZWVtcyB0byB3YW50IHRvIGdpdmUgdXMgdHdvIGludGVycnVwdHMgZXZlcnkgdGltZSBzb21ldGhpbmcKKyAqICAgaGFwcGVucywgd2hlcmUganVzdCBvbmUgd291bGQgYmUgYmV0dGVyLgorICovCisKKy8qCisgKgorICogTm90ZSBieSBab2x0YW4gU3ppbGFneWkgMTAtMTItOTY6CisgKgorICogSSd2ZSBzdWNjZWVkZWQgaW4gZWxpbWluYXRpbmcgdGhlICJDVSB3ZWRnZWQiIG1lc3NhZ2VzLCBhbmQgaGVuY2UgdGhlCisgKiBsb2NrdXBzLCB3aGljaCB3ZXJlIG9ubHkgb2NjdXJyaW5nIHdpdGggY2FyZHMgcnVubmluZyBpbiA4LWJpdCBtb2RlICgiZm9yY2UKKyAqIDgtYml0IG9wZXJhdGlvbiIgaW4gSW50ZWwncyBTb2Z0U2V0IHV0aWxpdHkpLiBUaGlzIHZlcnNpb24gb2YgdGhlIGRyaXZlcgorICogc2V0cyB0aGUgODI1ODYgYW5kIHRoZSBBU0lDIHRvIDgtYml0IG1vZGUgYXQgc3RhcnR1cDsgaXQgYWxzbyBzdG9wcyB0aGUKKyAqIENVIGJlZm9yZSBzdWJtaXR0aW5nIGEgcGFja2V0IGZvciB0cmFuc21pc3Npb24sIGFuZCB0aGVuIHJlc3RhcnRzIGl0IGFzIHNvb24KKyAqIGFzIHRoZSBwcm9jZXNzIG9mIGhhbmRpbmcgdGhlIHBhY2tldCBpcyBjb21wbGV0ZS4gVGhpcyBpcyBkZWZpbml0ZWx5IGFuCisgKiB1bm5lY2Vzc2FyeSBzbG93ZG93biBpZiB0aGUgY2FyZCBpcyBydW5uaW5nIGluIDE2LWJpdCBtb2RlOyB0aGVyZWZvcmUgb25lCisgKiBzaG91bGQgZGV0ZWN0IDE2LWJpdCB2cyA4LWJpdCBtb2RlIGZyb20gdGhlIEVFUFJPTSBzZXR0aW5ncyBhbmQgYWN0IAorICogYWNjb3JkaW5nbHkuIEluIDgtYml0IG1vZGUgd2l0aCB0aGlzIGJ1Z2ZpeCBJJ20gZ2V0dGluZyBhYm91dCAxNTAgSy9zIGZvcgorICogZnRwJ3MsIHdoaWNoIGlzIHNpZ25pZmljYW50bHkgYmV0dGVyIHRoYW4gSSBnZXQgaW4gRE9TLCBzbyB0aGUgb3ZlcmhlYWQgb2YKKyAqIHN0b3BwaW5nIGFuZCByZXN0YXJ0aW5nIHRoZSBDVSB3aXRoIGVhY2ggdHJhbnNtaXQgaXMgbm90IHByb2hpYml0aXZlIGluCisgKiBwcmFjdGljZS4KKyAqCisgKiBVcGRhdGUgYnkgRGF2aWQgV29vZGhvdXNlIDExLzUvOTk6CisgKgorICogSSd2ZSBzZWVuICJDVSB3ZWRnZWQiIG1lc3NhZ2VzIGluIDE2LWJpdCBtb2RlLCBvbiB0aGUgQWxwaGEgYXJjaGl0ZWN0dXJlLgorICogSSBhc3N1bWUgdGhhdCB0aGlzIGlzIGJlY2F1c2UgMTYtYml0IGFjY2Vzc2VzIGFyZSBhY3R1YWxseSBoYW5kbGVkIGFzIHR3bworICogOC1iaXQgYWNjZXNzZXMuCisgKi8KKworI2lmZGVmIF9fYWxwaGFfXworI2RlZmluZSBMT0NLVVAxNiAxCisjZW5kaWYKKyNpZm5kZWYgTE9DS1VQMTYKKyNkZWZpbmUgTE9DS1VQMTYgMAorI2VuZGlmCisgIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbWNhLWxlZ2FjeS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaWZuZGVmIE5FVF9ERUJVRworI2RlZmluZSBORVRfREVCVUcgNAorI2VuZGlmCisKKyNpbmNsdWRlICJlZXhwcmVzcy5oIgorCisjZGVmaW5lIEVFWFBfSU9fRVhURU5UICAxNgorCisvKgorICogUHJpdmF0ZSBkYXRhIGRlY2xhcmF0aW9ucworICovCisKK3N0cnVjdCBuZXRfbG9jYWwKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdHg7ICAgICAgIC8qIGppZmZpZXMgd2hlbiBsYXN0IHRyYW5zbWl0IHN0YXJ0ZWQgKi8KKwl1bnNpZ25lZCBsb25nIGluaXRfdGltZTsgICAgIC8qIGppZmZpZXMgd2hlbiBlZXhwX2h3X2luaXQ1ODYgY2FsbGVkICovCisJdW5zaWduZWQgc2hvcnQgcnhfZmlyc3Q7ICAgICAvKiBmaXJzdCByeCBidWYsIHNhbWUgYXMgUlhfQlVGX1NUQVJUICovCisJdW5zaWduZWQgc2hvcnQgcnhfbGFzdDsgICAgICAvKiBsYXN0IHJ4IGJ1ZiAqLworCXVuc2lnbmVkIHNob3J0IHJ4X3B0cjsgICAgICAgLyogZmlyc3QgcnggYnVmIHRvIGxvb2sgYXQgKi8KKwl1bnNpZ25lZCBzaG9ydCB0eF9oZWFkOyAgICAgIC8qIG5leHQgZnJlZSB0eCBidWYgKi8KKwl1bnNpZ25lZCBzaG9ydCB0eF9yZWFwOyAgICAgIC8qIGZpcnN0IGluLXVzZSB0eCBidWYgKi8KKwl1bnNpZ25lZCBzaG9ydCB0eF90YWlsOyAgICAgIC8qIHByZXZpb3VzIHR4IGJ1ZiB0byB0eF9oZWFkICovCisJdW5zaWduZWQgc2hvcnQgdHhfbGluazsgICAgICAvKiBsYXN0IGtub3duLWV4ZWN1dGluZyB0eCBidWYgKi8KKwl1bnNpZ25lZCBzaG9ydCBsYXN0X3R4X3Jlc3RhcnQ7ICAgLyogc2V0IHRvIHR4X2xpbmsgd2hlbiB3ZQorCQkJCQkgICAgIHJlc3RhcnQgdGhlIENVICovCisJdW5zaWduZWQgY2hhciBzdGFydGVkOworCXVuc2lnbmVkIHNob3J0IHJ4X2J1Zl9zdGFydDsKKwl1bnNpZ25lZCBzaG9ydCByeF9idWZfZW5kOworCXVuc2lnbmVkIHNob3J0IG51bV90eF9idWZzOworCXVuc2lnbmVkIHNob3J0IG51bV9yeF9idWZzOworCXVuc2lnbmVkIGNoYXIgd2lkdGg7ICAgICAgICAgLyogMCBmb3IgMTZiaXQsIDEgZm9yIDhiaXQgKi8KKwl1bnNpZ25lZCBjaGFyIHdhc19wcm9taXNjOworCXVuc2lnbmVkIGNoYXIgb2xkX21jX2NvdW50OworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKy8qIFRoaXMgaXMgdGhlIGNvZGUgYW5kIGRhdGEgdGhhdCBpcyBkb3dubG9hZGVkIHRvIHRoZSBFdGhlckV4cHJlc3MgY2FyZCdzCisgKiBtZW1vcnkgYXQgYm9vdCB0aW1lLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzdGFydF9jb2RlW10gPSB7CisvKiAweDAwMDAgKi8KKwkweDAwMDEsICAgICAgICAgICAgICAgICAvKiBJU0NQOiBidXN5IC0gY2xlYXJlZCBhZnRlciByZXNldCAqLworCTB4MDAwOCwweDAwMDAsMHgwMDAwLCAgIC8qIG9mZnNldCxhZGRyZXNzIChsbyxoaSkgb2YgU0NCICovCisKKwkweDAwMDAsMHgwMDAwLCAgICAgICAgICAvKiBTQ0I6IHN0YXR1cywgY29tbWFuZHMgKi8KKwkweDAwMDAsMHgwMDAwLCAgICAgICAgICAvKiBsaW5rcyB0byBmaXJzdCBjb21tYW5kIGJsb2NrLAorCQkJCSAgIGZpcnN0IHJlY2VpdmUgZGVzY3JpcHRvciAqLworCTB4MDAwMCwweDAwMDAsICAgICAgICAgIC8qIENSQyBlcnJvciwgYWxpZ25tZW50IGVycm9yIGNvdW50cyAqLworCTB4MDAwMCwweDAwMDAsICAgICAgICAgIC8qIG91dCBvZiByZXNvdXJjZXMsIG92ZXJydW4gZXJyb3IgY291bnRzICovCisKKwkweDAwMDAsMHgwMDAwLCAgICAgICAgICAvKiBwYWQgKi8KKwkweDAwMDAsMHgwMDAwLAorCisvKiAweDIwIC0tIHN0YXJ0IG9mIDgyNTg2IENVIHByb2dyYW0gKi8KKyNkZWZpbmUgQ09ORl9MSU5LIDB4MjAKKwkweDAwMDAsQ21kX0NvbmZpZywgICAgICAKKwkweDAwMzIsICAgICAgICAgICAgICAgICAvKiBsaW5rIHRvIG5leHQgY29tbWFuZCAqLworCTB4MDgwYywgICAgICAgICAgICAgICAgIC8qIDEyIGJ5dGVzIGZvbGxvdyA6IGZpZm8gdGhyZXNob2xkPTggKi8KKwkweDJlNDAsICAgICAgICAgICAgICAgICAvKiBkb24ndCByeCBiYWQgZnJhbWVzCisJCQkJICogU1JEWS9BUkRZID0+IGV4dC4gc3luYy4gOiBwcmVhbWJsZSBsZW49OAorCSAgICAgICAgICAgICAgICAgICAgICAgICAqIHRha2UgYWRkcmVzc2VzIGZyb20gZGF0YSBidWZmZXJzCisJCQkJICogNiBieXRlcy9hZGRyZXNzCisJCQkJICovCisJMHg2MDAwLCAgICAgICAgICAgICAgICAgLyogZGVmYXVsdCBiYWNrb2ZmIG1ldGhvZCAmIHByaW9yaXR5CisJCQkJICogaW50ZXJmcmFtZSBzcGFjaW5nID0gMHg2MCAqLworCTB4ZjIwMCwgICAgICAgICAgICAgICAgIC8qIHNsb3QgdGltZT0weDIwMCAKKwkJCQkgKiBtYXggY29sbGlzaW9uIHJldHJ5ID0gMHhmICovCisjZGVmaW5lIENPTkZfUFJPTUlTQyAgMHgyZQorCTB4MDAwMCwgICAgICAgICAgICAgICAgIC8qIG5vIEhETEMgOiBub3JtYWwgQ1JDIDogZW5hYmxlIGJyb2FkY2FzdCAKKwkJCQkgKiBkaXNhYmxlIHByb21pc2N1b3VzL211bHRpY2FzdCBtb2RlcyAqLworCTB4MDAzYywgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gZnJhbWUgbGVuZ3RoID0gNjAgb2N0ZXRzKSAqLworCisJMHgwMDAwLENtZF9TZXRBZGRyLAorCTB4MDAzZSwgICAgICAgICAgICAgICAgIC8qIGxpbmsgdG8gbmV4dCBjb21tYW5kICovCisjZGVmaW5lIENPTkZfSFdBRERSICAweDM4CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsICAgLyogaGFyZHdhcmUgYWRkcmVzcyBwbGFjZWQgaGVyZSAqLworCisJMHgwMDAwLENtZF9NQ2FzdCwKKwkweDAwNzYsICAgICAgICAgICAgICAgICAvKiBsaW5rIHRvIG5leHQgY29tbWFuZCAqLworI2RlZmluZSBDT05GX05SX01VTFRJQ0FTVCAweDQ0CisJMHgwMDAwLCAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgQ09ORl9NVUxUSUNBU1QgMHg0NgorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIC8qIHNvbWUgYWRkcmVzc2VzICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKworI2RlZmluZSBDT05GX0RJQUdfUkVTVUxUICAweDc2CisJMHgwMDAwLCBDbWRfRGlhZywKKwkweDAwN2MsICAgICAgICAgICAgICAgICAvKiBsaW5rIHRvIG5leHQgY29tbWFuZCAqLworCisJMHgwMDAwLENtZF9URFJ8Q21kX0lOVCwKKwkweDAwODQsCisjZGVmaW5lIENPTkZfVERSX1JFU1VMVCAgMHg4MgorCTB4MDAwMCwKKworCTB4MDAwMCxDbWRfRU5EfENtZF9Ob3AsIC8qIGVuZCBvZiBjb25maWd1cmUgc2VxdWVuY2UgKi8KKwkweDAwODQgICAgICAgICAgICAgICAgICAvKiBkdW1teSBsaW5rICovCit9OworCisvKiBtYXBzIGlycSBudW1iZXIgdG8gRXRoZXJFeHByZXNzIG1hZ2ljIHZhbHVlICovCitzdGF0aWMgY2hhciBpcnFybWFwW10gPSB7IDAsMCwxLDIsMyw0LDAsMCwwLDEsNSw2LDAsMCwwLDAgfTsKKworI2lmZGVmIENPTkZJR19NQ0FfTEVHQUNZCisvKiBtYXBwaW5nIG9mIHRoZSBmaXJzdCBmb3VyIGJpdHMgb2YgdGhlIHNlY29uZCBQT1MgcmVnaXN0ZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBtY2FfaW9tYXBbXSA9IHsKKwkweDI3MCwgMHgyNjAsIDB4MjUwLCAweDI0MCwgMHgyMzAsIDB4MjIwLCAweDIxMCwgMHgyMDAsCisJMHgzNzAsIDB4MzYwLCAweDM1MCwgMHgzNDAsIDB4MzMwLCAweDMyMCwgMHgzMTAsIDB4MzAwCit9OworLyogYml0cyA1LTcgb2YgdGhlIHNlY29uZCBQT1MgcmVnaXN0ZXIgKi8KK3N0YXRpYyBjaGFyIG1jYV9pcnFtYXBbXSA9IHsgMTIsIDksIDMsIDQsIDUsIDEwLCAxMSwgMTUgfTsKKyNlbmRpZiAKKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIExpbnV4IGludGVyZmFjZQorICovCisKK3N0YXRpYyBpbnQgZWV4cF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlZXhwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWV4cF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplZXhwX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlZXhwX3htaXQoc3RydWN0IHNrX2J1ZmYgKmJ1Ziwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlZXhwX2lycShpbnQgaXJxLCB2b2lkICpkZXZfYWRkciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgZWV4cF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKgorICogUHJvdG90eXBlcyBmb3IgaGFyZHdhcmUgYWNjZXNzIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIGVleHBfaHdfcnhfcGlvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWV4cF9od190eF9waW8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgKmJ1ZiwKKwkJICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbik7CitzdGF0aWMgaW50IGVleHBfaHdfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1bnNpZ25lZCBzaG9ydCBpb2FkZHIpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGVleHBfaHdfcmVhZGVlcHJvbSh1bnNpZ25lZCBzaG9ydCBpb2FkZHIsCisJCQkJCSB1bnNpZ25lZCBjaGFyIGxvY2F0aW9uKTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGVleHBfaHdfbGFzdHR4c3RhdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVleHBfaHdfdHhyZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBlZXhwX2h3X3R4aW5pdCAgICAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlZXhwX2h3X3J4aW5pdCAgICAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIGVleHBfaHdfaW5pdDU4NiAgIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVleHBfc2V0dXBfZmlsdGVyIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGNoYXIgKmVleHBfaWZtYXBbXT17IkFVSSIsICJCTkMiLCAiUko0NSJ9OworZW51bSBlZXhwX2lmdHlwZSB7QVVJPTAsIEJOQz0xLCBUUEU9Mn07CisKKyNkZWZpbmUgU1RBUlRFRF9SVSAgICAgIDIKKyNkZWZpbmUgU1RBUlRFRF9DVSAgICAgIDEKKworLyoKKyAqIFByaW1pdGl2ZSBoYXJkd2FyZSBhY2Nlc3MgZnVuY3Rpb25zLgorICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgc2NiX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBpbncoZGV2LT5iYXNlX2FkZHIgKyAweGMwMDgpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHNjYl9yZGNtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBpbncoZGV2LT5iYXNlX2FkZHIgKyAweGMwMGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2NiX2NvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgY21kKQoreworCW91dHcoY21kLCBkZXYtPmJhc2VfYWRkciArIDB4YzAwYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2Jfd3JjYmwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCW91dHcodmFsLCBkZXYtPmJhc2VfYWRkciArIDB4YzAwYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2Jfd3JyZmEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmFsKQoreworCW91dHcodmFsLCBkZXYtPmJhc2VfYWRkciArIDB4YzAwZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbG9vcGJhY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlvdXRiKGluYihkZXYtPmJhc2VfYWRkciArIENvbmZpZykgfCAyLCBkZXYtPmJhc2VfYWRkciArIENvbmZpZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9sb29wYmFjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW91dGIoaW5iKGRldi0+YmFzZV9hZGRyICsgQ29uZmlnKSAmIH4yLCBkZXYtPmJhc2VfYWRkciArIENvbmZpZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IFNIQURPVyhzaG9ydCBpbnQgYWRkcikKK3sKKwlhZGRyICY9IDB4MWY7CisJaWYgKGFkZHIgPiAweGYpIGFkZHIgKz0gMHgzZmYwOworCXJldHVybiBhZGRyICsgMHg0MDAwOworfQorCisvKgorICogTGludXggaW50ZXJmYWNlCisgKi8KKworLyoKKyAqIGNoZWNrcyBmb3IgcHJlc2VuY2Ugb2YgRXRoZXJFeHByZXNzIGNhcmQKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBkb19leHByZXNzX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgc2hvcnQgKnBvcnQ7CisJc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvcnRzW10gPSB7IDB4MjQwLDB4MzAwLDB4MzEwLDB4MjcwLDB4MzIwLDB4MzQwLDAgfTsKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgZGV2X2lycSA9IGRldi0+aXJxOworCWludCBlcnI7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlkZXYtPmlmX3BvcnQgPSAweGZmOyAvKiBub3Qgc2V0ICovCisKKyNpZmRlZiBDT05GSUdfTUNBX0xFR0FDWQorCWlmIChNQ0FfYnVzKSB7CisJCWludCBzbG90ID0gMDsKKworCQkvKgorCQkgKiBPbmx5IGZpbmQgb25lIGNhcmQgYXQgYSB0aW1lLiAgU3Vic2VxdWVudCBjYWxscworCQkgKiB3aWxsIGZpbmQgb3RoZXJzLCBob3dldmVyLCBwcm9wZXIgbXVsdGljYXJkIE1DQQorCQkgKiBwcm9iaW5nIGFuZCBzZXR1cCBjYW4ndCBiZSBkb25lIHdpdGggdGhlCisJCSAqIG9sZC1zdHlsZSBTcGFjZS5jIGluaXQgcm91dGluZXMuICAtLSBBU0YKKwkJICovCisJCXdoaWxlIChzbG90ICE9IE1DQV9OT1RGT1VORCkgeworCQkJaW50IHBvczAsIHBvczE7CisJCQkKKwkJCXNsb3QgPSBtY2FfZmluZF91bnVzZWRfYWRhcHRlcigweDYyOEIsIHNsb3QpOworCQkJaWYgKHNsb3QgPT0gTUNBX05PVEZPVU5EKQorCQkJCWJyZWFrOworCisJCQlwb3MwID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCAyKTsKKwkJCXBvczEgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDMpOworCQkJaW9hZGRyID0gbWNhX2lvbWFwW3BvczEmMHhmXTsKKworCQkJZGV2LT5pcnEgPSBtY2FfaXJxbWFwWyhwb3MxPj40KSYweDddOworCQkJCisJCQkvKgorCQkJICogWFhYOiBUcmFuc2NpZXZlciBzZWxlY3Rpb24gaXMgZG9uZQorCQkJICogZGlmZmVyZW50bHkgb24gdGhlIE1DQSB2ZXJzaW9uLiAgCisJCQkgKiBIb3cgdG8gZ2V0IGl0IHRvIHNlbGVjdCBzb21ldGhpbmcKKwkJCSAqIG90aGVyIHRoYW4gZXh0ZXJuYWwvQVVJIGlzIGN1cnJlbnRseQorCQkJICogdW5rbm93bi4gIFRoaXMgY29kZSBpcyBqdXN0IGZvciBsb29rcy4gLS0gQVNGCisJCQkgKi8KKwkJCWlmICgocG9zMCAmIDB4NykgPT0gMHgxKQorCQkJCWRldi0+aWZfcG9ydCA9IEFVSTsKKwkJCWVsc2UgaWYgKChwb3MwICYgMHg3KSA9PSAweDUpIHsKKwkJCQlpZiAocG9zMSAmIDB4ODApCisJCQkJCWRldi0+aWZfcG9ydCA9IEJOQzsKKwkJCQllbHNlCisJCQkJCWRldi0+aWZfcG9ydCA9IFRQRTsKKwkJCX0KKworCQkJbWNhX3NldF9hZGFwdGVyX25hbWUoc2xvdCwgIkludGVsIEV0aGVyRXhwcmVzcyAxNiBNQ0EiKTsKKwkJCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oc2xvdCwgTlVMTCwgZGV2KTsKKwkJCW1jYV9tYXJrX2FzX3VzZWQoc2xvdCk7CisKKwkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmCisJaWYgKGlvYWRkciYweGZlMDApIHsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEVFWFBfSU9fRVhURU5ULCAiRXRoZXJFeHByZXNzIikpCisJCQlyZXR1cm4gLUVCVVNZOworCQllcnIgPSBlZXhwX2h3X3Byb2JlKGRldixpb2FkZHIpOworCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEVFWFBfSU9fRVhURU5UKTsKKwkJcmV0dXJuIGVycjsKKwl9IGVsc2UgaWYgKGlvYWRkcikKKwkJcmV0dXJuIC1FTlhJTzsKKworCWZvciAocG9ydD0mcG9ydHNbMF0gOyAqcG9ydCA7IHBvcnQrKyApCisJeworCQl1bnNpZ25lZCBzaG9ydCBzdW0gPSAwOworCQlpbnQgaTsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbigqcG9ydCwgRUVYUF9JT19FWFRFTlQsICJFdGhlckV4cHJlc3MiKSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKCBpPTAgOyBpPDQgOyBpKysgKQorCQl7CisJCQl1bnNpZ25lZCBzaG9ydCB0OworCQkJdCA9IGluYigqcG9ydCArIElEX1BPUlQpOworCQkJc3VtIHw9ICh0Pj40KSA8PCAoKHQgJiAweDAzKTw8Mik7CisJCX0KKwkJaWYgKHN1bT09MHhiYWJhICYmICFlZXhwX2h3X3Byb2JlKGRldiwqcG9ydCkpIHsKKwkJCXJlbGVhc2VfcmVnaW9uKCpwb3J0LCBFRVhQX0lPX0VYVEVOVCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZWxlYXNlX3JlZ2lvbigqcG9ydCwgRUVYUF9JT19FWFRFTlQpOworCQlkZXYtPmlycSA9IGRldl9pcnE7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgZXhwcmVzc19wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlpbnQgZXJyOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwllcnIgPSBkb19leHByZXNzX3Byb2JlKGRldik7CisJaWYgKCFlcnIpIHsKKwkJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWlmICghZXJyKQorCQkJcmV0dXJuIGRldjsKKwl9CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorI2VuZGlmCisKKy8qCisgKiBvcGVuIGFuZCBpbml0aWFsaXplIHRoZSBhZGFwdGVyLCByZWFkeSBmb3IgdXNlCisgKi8KKworc3RhdGljIGludCBlZXhwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworI2lmIE5FVF9ERUJVRyA+IDYKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVleHBfb3BlbigpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlpZiAoIWRldi0+aXJxIHx8ICFpcnFybWFwW2Rldi0+aXJxXSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCZlZXhwX2lycSwwLGRldi0+bmFtZSxkZXYpOworCWlmIChyZXQpIHJldHVybiByZXQ7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgRUVYUF9JT19FWFRFTlQsICJFdGhlckV4cHJlc3MiKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFdGhlckV4cHJlc3MgaW8gcG9ydCAleCwgaXMgYnVzeS5cbiIKKwkJCSwgaW9hZGRyKTsKKwkJZ290byBlcnJfb3V0MTsKKwl9CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIrMHg0MDAwLCBFRVhQX0lPX0VYVEVOVCwgIkV0aGVyRXhwcmVzcyBzaGFkb3ciKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFdGhlckV4cHJlc3MgaW8gcG9ydCAleCwgaXMgYnVzeS5cbiIKKwkJCSwgaW9hZGRyKzB4NDAwMCk7CisJCWdvdG8gZXJyX291dDI7CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyKzB4ODAwMCwgRUVYUF9JT19FWFRFTlQsICJFdGhlckV4cHJlc3Mgc2hhZG93IikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXRoZXJFeHByZXNzIGlvIHBvcnQgJXgsIGlzIGJ1c3kuXG4iCisJCQksIGlvYWRkcisweDgwMDApOworCQlnb3RvIGVycl9vdXQzOworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkcisweGMwMDAsIEVFWFBfSU9fRVhURU5ULCAiRXRoZXJFeHByZXNzIHNoYWRvdyIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkV0aGVyRXhwcmVzcyBpbyBwb3J0ICV4LCBpcyBidXN5LlxuIgorCQkJLCBpb2FkZHIrMHhjMDAwKTsKKwkJZ290byBlcnJfb3V0NDsKKwl9CisJCisJaWYgKGxwLT53aWR0aCkgeworCQlwcmludGsoIiVzOiBmb3JjaW5nIEFTSUMgdG8gOC1iaXQgbW9kZVxuIiwgZGV2LT5uYW1lKTsKKwkJb3V0YihpbmIoZGV2LT5iYXNlX2FkZHIrQ29uZmlnKSZ+NCwgZGV2LT5iYXNlX2FkZHIrQ29uZmlnKTsKKwl9CisKKwllZXhwX2h3X2luaXQ1ODYoZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworI2lmIE5FVF9ERUJVRyA+IDYKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGxlYXZpbmcgZWV4cF9vcGVuKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworCWVycl9vdXQ0OgorCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIrMHg4MDAwLCBFRVhQX0lPX0VYVEVOVCk7CisJZXJyX291dDM6CisJCXJlbGVhc2VfcmVnaW9uKGlvYWRkcisweDQwMDAsIEVFWFBfSU9fRVhURU5UKTsKKwllcnJfb3V0MjoKKwkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBFRVhQX0lPX0VYVEVOVCk7CisJZXJyX291dDE6CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gLUVCVVNZOworfQorCisvKgorICogY2xvc2UgYW5kIGRpc2FibGUgdGhlIGludGVyZmFjZSwgbGVhdmluZyB0aGUgNTg2IGluIHJlc2V0LgorICovCisKK3N0YXRpYyBpbnQgZWV4cF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWludCBpcnEgPSBkZXYtPmlycTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlvdXRiKFNJUlFfZGlzfGlycXJtYXBbaXJxXSxpb2FkZHIrU0VUX0lSUSk7CisJbHAtPnN0YXJ0ZWQgPSAwOworCXNjYl9jb21tYW5kKGRldiwgU0NCX0NVc3VzcGVuZHxTQ0JfUlVzdXNwZW5kKTsKKwlvdXRiKDAsaW9hZGRyK1NJR05BTF9DQSk7CisJZnJlZV9pcnEoaXJxLGRldik7CisJb3V0YihpNTg2X1JTVCxpb2FkZHIrRUVQUk9NX0N0cmwpOworCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgRUVYUF9JT19FWFRFTlQpOworCXJlbGVhc2VfcmVnaW9uKGlvYWRkcisweDQwMDAsIDE2KTsKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIrMHg4MDAwLCAxNik7CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyKzB4YzAwMCwgMTYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gaW50ZXJmYWNlIHN0YXRzCisgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplZXhwX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qCisgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYSBoaWdoZXIgbGV2ZWwgdGhpbmtzIHdlIGFyZSBicm9rZW4uICBDaGVjayB0aGF0CisgKiBub3RoaW5nIGhhcyBiZWNvbWUgamFtbWVkIGluIHRoZSBDVS4KKyAqLworCitzdGF0aWMgdm9pZCB1bnN0aWNrX2N1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKGxwLT5zdGFydGVkKQorCXsKKwkJaWYgKChqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydCk+NTApCisJCXsKKwkJCWlmIChscC0+dHhfbGluaz09bHAtPmxhc3RfdHhfcmVzdGFydCkKKwkJCXsKKwkJCQl1bnNpZ25lZCBzaG9ydCBib2d1c2NvdW50PTIwMCxyc3N0OworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUwNHgsIHJlc2V0dGluZy4uLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBzY2Jfc3RhdHVzKGRldikpOworCQkJCWVleHBfaHdfdHhpbml0KGRldik7CisJCQkJbHAtPmxhc3RfdHhfcmVzdGFydCA9IDA7CisJCQkJc2NiX3dyY2JsKGRldiwgbHAtPnR4X2xpbmspOworCQkJCXNjYl9jb21tYW5kKGRldiwgU0NCX0NVc3RhcnQpOworCQkJCW91dGIoMCxpb2FkZHIrU0lHTkFMX0NBKTsKKwkJCQl3aGlsZSAoIVNDQl9jb21wbGV0ZShyc3N0PXNjYl9zdGF0dXMoZGV2KSkpCisJCQkJeworCQkJCQlpZiAoIS0tYm9ndXNjb3VudCkKKwkJCQkJeworCQkJCQkJYm9ndXNjb3VudD0yMDA7CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVzZXQgdGltZWQgb3V0IHN0YXR1cyAlMDR4LCByZXRyeWluZy4uLlxuIiwKKwkJCQkJCSAgICAgICBkZXYtPm5hbWUscnNzdCk7CisJCQkJCQlzY2Jfd3JjYmwoZGV2LCBscC0+dHhfbGluayk7CisJCQkJCQlzY2JfY29tbWFuZChkZXYsIFNDQl9DVXN0YXJ0KTsKKwkJCQkJCW91dGIoMCxpb2FkZHIrU0lHTkFMX0NBKTsKKwkJCQkJfQorCQkJCX0KKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdW5zaWduZWQgc2hvcnQgc3RhdHVzID0gc2NiX3N0YXR1cyhkZXYpOworCQkJCWlmIChTQ0JfQ1VkZWFkKHN0YXR1cykpCisJCQkJeworCQkJCQl1bnNpZ25lZCBzaG9ydCB0eHN0YXR1cyA9IGVleHBfaHdfbGFzdHR4c3RhdChkZXYpOworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJhbnNtaXQgdGltZWQgb3V0LCBDVSBub3QgYWN0aXZlIHN0YXR1cyAlMDR4ICUwNHgsIHJlc3RhcnRpbmcuLi5cbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cywgdHhzdGF0dXMpOworCQkJCQllZXhwX2h3X3R4cmVzdGFydChkZXYpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl1bnNpZ25lZCBzaG9ydCB0eHN0YXR1cyA9IGVleHBfaHdfbGFzdHR4c3RhdChkZXYpOworCQkJCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmICF0eHN0YXR1cykKKwkJCQkJeworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENVIHdlZGdlZCwgc3RhdHVzICUwNHggJTA0eCwgcmVzZXR0aW5nLi4uXG4iLAorCQkJCQkJICAgICAgIGRldi0+bmFtZSxzdGF0dXMsdHhzdGF0dXMpOworCQkJCQkJZWV4cF9od19pbml0NTg2KGRldik7CisJCQkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0XG4iLCBkZXYtPm5hbWUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCWlmICgoamlmZmllcy1scC0+aW5pdF90aW1lKT4xMCkKKwkJeworCQkJdW5zaWduZWQgc2hvcnQgc3RhdHVzID0gc2NiX3N0YXR1cyhkZXYpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGk4MjU4NiBzdGFydHVwIHRpbWVkIG91dCwgc3RhdHVzICUwNHgsIHJlc2V0dGluZy4uLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQllZXhwX2h3X2luaXQ1ODYoZGV2KTsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZWV4cF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworI2lmZGVmIENPTkZJR19TTVAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2VuZGlmCisJaW50IHN0YXR1czsKKwkKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisKKwkvKgorCSAqCUJlc3Qgd291bGQgYmUgdG8gdXNlIHN5bmNocm9uaXplX2lycSgpOyBzcGluX2xvY2soKSBoZXJlCisJICoJbGV0cyBtYWtlIGl0IHdvcmsgZmlyc3QuLgorCSAqLworCSAKKyNpZmRlZiBDT05GSUdfU01QCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisjZW5kaWYKKworCXN0YXR1cyA9IHNjYl9zdGF0dXMoZGV2KTsKKwl1bnN0aWNrX2N1KGRldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/XG4iLCBkZXYtPm5hbWUsCisJICAgICAgIChTQ0JfY29tcGxldGUoc3RhdHVzKT8ibG9zdCBpbnRlcnJ1cHQiOgorCQkiYm9hcmQgb24gZmlyZSIpKTsKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJbHAtPmxhc3RfdHggPSBqaWZmaWVzOworCWlmICghU0NCX2NvbXBsZXRlKHN0YXR1cykpIHsKKwkJc2NiX2NvbW1hbmQoZGV2LCBTQ0JfQ1VhYm9ydCk7CisJCW91dGIoMCxkZXYtPmJhc2VfYWRkcitTSUdOQUxfQ0EpOworCX0KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CQorI2lmZGVmIENPTkZJR19TTVAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworI2VuZGlmCit9CisKKy8qCisgKiBDYWxsZWQgdG8gdHJhbnNtaXQgYSBwYWNrZXQsIG9yIHRvIGFsbG93IHVzIHRvIHJpZ2h0IG91cnNlbHZlcworICogaWYgdGhlIGtlcm5lbCB0aGlua3Mgd2UndmUgZGllZC4KKyAqLworc3RhdGljIGludCBlZXhwX3htaXQoc3RydWN0IHNrX2J1ZmYgKmJ1Ziwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc2hvcnQgbGVuZ3RoID0gYnVmLT5sZW47CisjaWZkZWYgQ09ORklHX1NNUAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjZW5kaWYKKworI2lmIE5FVF9ERUJVRyA+IDYKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVleHBfeG1pdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlpZiAoYnVmLT5sZW4gPCBFVEhfWkxFTikgeworCQlidWYgPSBza2JfcGFkdG8oYnVmLCBFVEhfWkxFTik7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQlsZW5ndGggPSBFVEhfWkxFTjsKKwl9CisKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisKKwkvKgorCSAqCUJlc3Qgd291bGQgYmUgdG8gdXNlIHN5bmNocm9uaXplX2lycSgpOyBzcGluX2xvY2soKSBoZXJlCisJICoJbGV0cyBtYWtlIGl0IHdvcmsgZmlyc3QuLgorCSAqLworCSAKKyNpZmRlZiBDT05GSUdfU01QCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisjZW5kaWYKKyAgCisJeworCQl1bnNpZ25lZCBzaG9ydCAqZGF0YSA9ICh1bnNpZ25lZCBzaG9ydCAqKWJ1Zi0+ZGF0YTsKKworCQlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuZ3RoOworCisJICAgICAgICBlZXhwX2h3X3R4X3BpbyhkZXYsZGF0YSxsZW5ndGgpOworCX0KKwlkZXZfa2ZyZWVfc2tiKGJ1Zik7CisjaWZkZWYgQ09ORklHX1NNUAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisjZW5kaWYKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhhbmRsZSBhbiBFdGhlckV4cHJlc3MgaW50ZXJydXB0CisgKiBJZiB3ZSd2ZSBmaW5pc2hlZCBpbml0aWFsaXppbmcsIHN0YXJ0IHRoZSBSVSBhbmQgQ1UgdXAuCisgKiBJZiB3ZSd2ZSBhbHJlYWR5IHN0YXJ0ZWQsIHJlYXAgdHggYnVmZmVycywgaGFuZGxlIGFueSByZWNlaXZlZCBwYWNrZXRzLAorICogY2hlY2sgdG8gbWFrZSBzdXJlIHdlJ3ZlIG5vdCBiZWNvbWUgd2VkZ2VkLgorICovCisKKy8qCisgKiBIYW5kbGUgYW4gRXRoZXJFeHByZXNzIGludGVycnVwdAorICogSWYgd2UndmUgZmluaXNoZWQgaW5pdGlhbGl6aW5nLCBzdGFydCB0aGUgUlUgYW5kIENVIHVwLgorICogSWYgd2UndmUgYWxyZWFkeSBzdGFydGVkLCByZWFwIHR4IGJ1ZmZlcnMsIGhhbmRsZSBhbnkgcmVjZWl2ZWQgcGFja2V0cywKKyAqIGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSd2ZSBub3QgYmVjb21lIHdlZGdlZC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZWV4cF9zdGFydF9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHN0YXR1cykKK3sKKwl1bnNpZ25lZCBzaG9ydCBhY2tfY21kID0gU0NCX2FjayhzdGF0dXMpOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfVVApICYmICEobHAtPnN0YXJ0ZWQgJiBTVEFSVEVEX0NVKSkgeworCQlzaG9ydCBkaWFnX3N0YXR1cywgdGRyX3N0YXR1czsKKwkJd2hpbGUgKFNDQl9DVXN0YXQoc3RhdHVzKT09MikKKwkJCXN0YXR1cyA9IHNjYl9zdGF0dXMoZGV2KTsKKyNpZiBORVRfREVCVUcgPiA0CisJCXByaW50aygiJXM6IENVIHdlbnQgbm9uLWFjdGl2ZSAoc3RhdHVzICUwNHgpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworI2VuZGlmCisKKwkJb3V0dyhDT05GX0RJQUdfUkVTVUxUICYgfjMxLCBpb2FkZHIgKyBTTV9QVFIpOworCQlkaWFnX3N0YXR1cyA9IGludyhpb2FkZHIgKyBTSEFET1coQ09ORl9ESUFHX1JFU1VMVCkpOworCQlpZiAoZGlhZ19zdGF0dXMgJiAxPDwxMSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IDgyNTg2IGZhaWxlZCBzZWxmLXRlc3RcbiIsIAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCX0gZWxzZSBpZiAoIShkaWFnX3N0YXR1cyAmIDE8PDEzKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IDgyNTg2IHNlbGYtdGVzdCBmYWlsZWQgdG8gY29tcGxldGVcbiIsIGRldi0+bmFtZSk7CisJCX0KKworCQlvdXR3KENPTkZfVERSX1JFU1VMVCAmIH4zMSwgaW9hZGRyICsgU01fUFRSKTsKKwkJdGRyX3N0YXR1cyA9IGludyhpb2FkZHIgKyBTSEFET1coQ09ORl9URFJfUkVTVUxUKSk7CisJCWlmICh0ZHJfc3RhdHVzICYgKFREUl9TSE9SVHxURFJfT1BFTikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBURFIgcmVwb3J0cyBjYWJsZSAlcyBhdCAlZCB0aWNrJXNcbiIsIGRldi0+bmFtZSwgKHRkcl9zdGF0dXMgJiBURFJfU0hPUlQpPyJzaG9ydCI6ImJyb2tlbiIsIHRkcl9zdGF0dXMgJiBURFJfVElNRSwgKCh0ZHJfc3RhdHVzICYgVERSX1RJTUUpICE9IDEpID8gInMiIDogIiIpOworCQl9IAorCQllbHNlIGlmICh0ZHJfc3RhdHVzICYgVERSX1hDVlJQUk9CTEVNKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVERSIHJlcG9ydHMgdHJhbnNjZWl2ZXIgcHJvYmxlbVxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCQllbHNlIGlmICh0ZHJfc3RhdHVzICYgVERSX0xJTktPSykgeworI2lmIE5FVF9ERUJVRyA+IDQKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVERSIHJlcG9ydHMgbGluayBPS1xuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJcHJpbnRrKCIlczogVERSIGlzIGdhLWdhIChzdGF0dXMgJTA0eClcbiIsIGRldi0+bmFtZSwKKwkJCSAgICAgICB0ZHJfc3RhdHVzKTsKKwkJfQorCQkJCisJCWxwLT5zdGFydGVkIHw9IFNUQVJURURfQ1U7CisJCXNjYl93cmNibChkZXYsIGxwLT50eF9saW5rKTsKKwkJLyogaWYgdGhlIFJVIGlzbid0IHJ1bm5pbmcsIHN0YXJ0IGl0IG5vdyAqLworCQlpZiAoIShscC0+c3RhcnRlZCAmIFNUQVJURURfUlUpKSB7CisJCQlhY2tfY21kIHw9IFNDQl9SVXN0YXJ0OworCQkJc2NiX3dycmZhKGRldiwgbHAtPnJ4X2J1Zl9zdGFydCk7CisJCQlscC0+cnhfcHRyID0gbHAtPnJ4X2J1Zl9zdGFydDsKKwkJCWxwLT5zdGFydGVkIHw9IFNUQVJURURfUlU7CisJCX0KKwkJYWNrX2NtZCB8PSBTQ0JfQ1VzdGFydCB8IDB4MjAwMDsKKwl9CisKKwlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfVVApICYmICEobHAtPnN0YXJ0ZWQgJiBTVEFSVEVEX1JVKSAmJiBTQ0JfUlVzdGF0KHN0YXR1cyk9PTQpIAorCQlscC0+c3RhcnRlZHw9U1RBUlRFRF9SVTsKKworCXJldHVybiBhY2tfY21kOworfQorCitzdGF0aWMgdm9pZCBlZXhwX2NtZF9jbGVhcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW50IG9sZHRpbWUgPSBqaWZmaWVzOworCXdoaWxlIChzY2JfcmRjbWQoZGV2KSAmJiAoKGppZmZpZXMtb2xkdGltZSk8MTApKTsKKwlpZiAoc2NiX3JkY21kKGRldikpIHsKKwkJcHJpbnRrKCIlczogY29tbWFuZCBkaWRuJ3QgY2xlYXJcbiIsIGRldi0+bmFtZSk7CisJfQorfQorCQorc3RhdGljIGlycXJldHVybl90IGVleHBfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pbmZvLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2luZm87CisJc3RydWN0IG5ldF9sb2NhbCAqbHA7CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyLHN0YXR1cyxhY2tfY21kOworCXVuc2lnbmVkIHNob3J0IG9sZF9yZWFkX3B0ciwgb2xkX3dyaXRlX3B0cjsKKworCWlmIChkZXY9PU5VTEwpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJlZXhwcmVzczogaXJxICVkIGZvciB1bmtub3duIGRldmljZVxuIiwKKwkJICAgICAgIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKworCW9sZF9yZWFkX3B0ciA9IGludyhpb2FkZHIrUkVBRF9QVFIpOworCW9sZF93cml0ZV9wdHIgPSBpbncoaW9hZGRyK1dSSVRFX1BUUik7CisKKwlvdXRiKFNJUlFfZGlzfGlycXJtYXBbaXJxXSxpb2FkZHIrU0VUX0lSUSk7CisKKwkKKwlzdGF0dXMgPSBzY2Jfc3RhdHVzKGRldik7CisKKyNpZiBORVRfREVCVUcgPiA0CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQgKHN0YXR1cyAleClcbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKyNlbmRpZgorCisJaWYgKGxwLT5zdGFydGVkID09IChTVEFSVEVEX0NVIHwgU1RBUlRFRF9SVSkpIHsKKworCQlkbyB7CisJCQllZXhwX2NtZF9jbGVhcihkZXYpOworCisJCQlhY2tfY21kID0gU0NCX2FjayhzdGF0dXMpOworCQkJc2NiX2NvbW1hbmQoZGV2LCBhY2tfY21kKTsKKwkJCW91dGIoMCxpb2FkZHIrU0lHTkFMX0NBKTsKKworCQkJZWV4cF9jbWRfY2xlYXIoZGV2KTsKKworCQkJaWYgKFNDQl9jb21wbGV0ZShzdGF0dXMpKSB7CisJCQkJaWYgKCFlZXhwX2h3X2xhc3R0eHN0YXQoZGV2KSkgeworCQkJCQlwcmludGsoIiVzOiB0eCBpbnRlcnJ1cHQgYnV0IG5vIHN0YXR1c1xuIiwgZGV2LT5uYW1lKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmIChTQ0JfcnhkZnJhbWUoc3RhdHVzKSkgCisJCQkJZWV4cF9od19yeF9waW8oZGV2KTsKKworCQkJc3RhdHVzID0gc2NiX3N0YXR1cyhkZXYpOworCQl9IHdoaWxlIChzdGF0dXMgJiAweGMwMDApOworCisJCWlmIChTQ0JfUlVkZWFkKHN0YXR1cykpIAorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUlUgc3RvcHBlZDogc3RhdHVzICUwNHhcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLHN0YXR1cyk7CisjaWYgMAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGN1cl9yZmQ9JTA0eCwgY3VyX3JiZD0lMDR4XG4iLCBkZXYtPm5hbWUsIGxwLT5jdXJfcmZkLCBscC0+Y3VyX3JiZCk7CisJCQlvdXR3KGxwLT5jdXJfcmZkLCBpb2FkZHIrUkVBRF9QVFIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFslMDR4XVxuIiwgZGV2LT5uYW1lLCBpbncoaW9hZGRyK0RBVEFQT1JUKSk7CisJCQlvdXR3KGxwLT5jdXJfcmZkKzYsIGlvYWRkcitSRUFEX1BUUik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmJkIGlzICUwNHhcbiIsIGRldi0+bmFtZSwgcmJkPSBpbncoaW9hZGRyK0RBVEFQT1JUKSk7CisJCQlvdXR3KHJiZCwgaW9hZGRyK1JFQURfUFRSKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBbJTA0eCAlMDR4XSAiLCBkZXYtPm5hbWUsIGludyhpb2FkZHIrREFUQVBPUlQpLCBpbncoaW9hZGRyK0RBVEFQT1JUKSk7CisJCQlvdXR3KHJiZCs4LCBpb2FkZHIrUkVBRF9QVFIpOworCQkJcHJpbnRrKCJbJTA0eF1cbiIsIGludyhpb2FkZHIrREFUQVBPUlQpKTsKKyNlbmRpZgorCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworI2lmIDEKKwkJICAgICAgICBlZXhwX2h3X3J4aW5pdChkZXYpOworI2Vsc2UKKwkJCWxwLT5jdXJfcmZkID0gbHAtPmZpcnN0X3JmZDsKKyNlbmRpZgorCQkJc2NiX3dycmZhKGRldiwgbHAtPnJ4X2J1Zl9zdGFydCk7CisJCQlzY2JfY29tbWFuZChkZXYsIFNDQl9SVXN0YXJ0KTsKKwkJCW91dGIoMCxpb2FkZHIrU0lHTkFMX0NBKTsKKwkJfSAKKwl9IGVsc2UgeworCQlpZiAoc3RhdHVzICYgMHg4MDAwKSAKKwkJCWFja19jbWQgPSBlZXhwX3N0YXJ0X2lycShkZXYsIHN0YXR1cyk7CisJCWVsc2UKKwkJCWFja19jbWQgPSBTQ0JfYWNrKHN0YXR1cyk7CisJCXNjYl9jb21tYW5kKGRldiwgYWNrX2NtZCk7CisJCW91dGIoMCxpb2FkZHIrU0lHTkFMX0NBKTsKKwl9CisKKwllZXhwX2NtZF9jbGVhcihkZXYpOworCisJb3V0YihTSVJRX2VufGlycXJtYXBbaXJxXSxpb2FkZHIrU0VUX0lSUSk7IAorCisjaWYgTkVUX0RFQlVHID4gNiAKKwlwcmludGsoIiVzOiBsZWF2aW5nIGVleHBfaXJxKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlvdXR3KG9sZF9yZWFkX3B0ciwgaW9hZGRyK1JFQURfUFRSKTsKKwlvdXR3KG9sZF93cml0ZV9wdHIsIGlvYWRkcitXUklURV9QVFIpOworCQorCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogSGFyZHdhcmUgYWNjZXNzIGZ1bmN0aW9ucworICovCisKKy8qCisgKiBTZXQgdGhlIGNhYmxlIHR5cGUgdG8gdXNlLgorICovCisKK3N0YXRpYyB2b2lkIGVleHBfaHdfc2V0X2ludGVyZmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGNoYXIgb2xkdmFsID0gaW5iKGRldi0+YmFzZV9hZGRyICsgMHgzMDBlKTsKKwlvbGR2YWwgJj0gfjB4ODI7CisJc3dpdGNoIChkZXYtPmlmX3BvcnQpIHsKKwljYXNlIFRQRToKKwkJb2xkdmFsIHw9IDB4MjsKKwljYXNlIEJOQzoKKwkJb2xkdmFsIHw9IDB4ODA7CisJCWJyZWFrOworCX0KKwlvdXRiKG9sZHZhbCwgZGV2LT5iYXNlX2FkZHIrMHgzMDBlKTsKKwltZGVsYXkoMjApOworfQorCisvKgorICogQ2hlY2sgYWxsIHRoZSByZWNlaXZlIGJ1ZmZlcnMsIGFuZCBoYW5kIGFueSByZWNlaXZlZCBwYWNrZXRzCisgKiB0byB0aGUgdXBwZXIgbGV2ZWxzLiBCYXNpYyBzYW5pdHkgY2hlY2sgb24gZWFjaCBmcmFtZQorICogZGVzY3JpcHRvciwgdGhvdWdoIHdlIGRvbid0IGJvdGhlciB0cnlpbmcgdG8gZml4IGJyb2tlbiBvbmVzLgorICovCisKK3N0YXRpYyB2b2lkIGVleHBfaHdfcnhfcGlvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIHNob3J0IHJ4X2Jsb2NrID0gbHAtPnJ4X3B0cjsKKwl1bnNpZ25lZCBzaG9ydCBib2d1c2NvdW50ID0gbHAtPm51bV9yeF9idWZzOworCXVuc2lnbmVkIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKworI2lmIE5FVF9ERUJVRyA+IDYKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVleHBfaHdfcngoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisgCWRvIHsKKyAJCXVuc2lnbmVkIHNob3J0IHJmZF9jbWQsIHJ4X25leHQsIHBidWYsIHBrdF9sZW47CisgIAorCQlvdXR3KHJ4X2Jsb2NrLCBpb2FkZHIgKyBSRUFEX1BUUik7CisJCXN0YXR1cyA9IGludyhpb2FkZHIgKyBEQVRBUE9SVCk7CisKKwkJaWYgKEZEX0RvbmUoc3RhdHVzKSkKKwkJeworCQkJcmZkX2NtZCA9IGludyhpb2FkZHIgKyBEQVRBUE9SVCk7CisJCQlyeF9uZXh0ID0gaW53KGlvYWRkciArIERBVEFQT1JUKTsKKwkJCXBidWYgPSBpbncoaW9hZGRyICsgREFUQVBPUlQpOworIAorCQkJb3V0dyhwYnVmLCBpb2FkZHIgKyBSRUFEX1BUUik7CisJCQlwa3RfbGVuID0gaW53KGlvYWRkciArIERBVEFQT1JUKTsKKworCQkJaWYgKHJmZF9jbWQhPTB4MDAwMCkKKyAgCQkJeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZmRfY21kIG5vdCB6ZXJvOjB4JTA0eFxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCByZmRfY21kKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBidWYhPXJ4X2Jsb2NrKzB4MTYpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJmZCBhbmQgcmJkIG91dCBvZiBzeW5jIDB4JTA0eCAweCUwNHhcbiIsIAorCQkJCSAgICAgICBkZXYtPm5hbWUsIHJ4X2Jsb2NrKzB4MTYsIHBidWYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZWxzZSBpZiAoKHBrdF9sZW4gJiAweGMwMDApIT0weGMwMDApIAorCQkJeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFT0Ygb3IgRiBub3Qgc2V0IG9uIHJlY2VpdmVkIGJ1ZmZlciAoJTA0eClcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgcGt0X2xlbiAmIDB4YzAwMCk7CisgIAkJCQljb250aW51ZTsKKyAgCQkJfQorICAJCQllbHNlIGlmICghRkRfT0soc3RhdHVzKSkgCisJCQl7CisJCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWlmIChGRF9DUkMoc3RhdHVzKSkKKwkJCQkJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlpZiAoRkRfQWxpZ24oc3RhdHVzKSkKKwkJCQkJbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCWlmIChGRF9SZXNyYyhzdGF0dXMpKQorCQkJCQlscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQlpZiAoRkRfRE1BKHN0YXR1cykpCisJCQkJCWxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJCWlmIChGRF9TaG9ydChzdGF0dXMpKQorCQkJCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQkJcGt0X2xlbiAmPSAweDNmZmY7CisJCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzE2KTsKKwkJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldFxuIixkZXYtPm5hbWUpOworCQkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJCQlvdXR3KHBidWYrMTAsIGlvYWRkcitSRUFEX1BUUik7CisJCQkgICAgICAgIGluc3coaW9hZGRyK0RBVEFQT1JULCBza2JfcHV0KHNrYixwa3RfbGVuKSwocGt0X2xlbisxKT4+MSk7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQkJfQorCQkJb3V0dyhyeF9ibG9jaywgaW9hZGRyK1dSSVRFX1BUUik7CisJCQlvdXR3KDAsIGlvYWRkcitEQVRBUE9SVCk7CisJCQlvdXR3KDAsIGlvYWRkcitEQVRBUE9SVCk7CisJCQlyeF9ibG9jayA9IHJ4X25leHQ7CisJCX0KKwl9IHdoaWxlIChGRF9Eb25lKHN0YXR1cykgJiYgYm9ndXNjb3VudC0tKTsKKwlscC0+cnhfcHRyID0gcnhfYmxvY2s7Cit9CisKKy8qCisgKiBIYW5kIGEgcGFja2V0IHRvIHRoZSBjYXJkIGZvciB0cmFuc21pc3Npb24KKyAqIElmIHdlIGdldCBoZXJlLCB3ZSBNVVNUIGhhdmUgYWxyZWFkeSBjaGVja2VkCisgKiB0byBtYWtlIHN1cmUgdGhlcmUgaXMgcm9vbSBpbiB0aGUgdHJhbnNtaXQKKyAqIGJ1ZmZlciByZWdpb24uCisgKi8KKworc3RhdGljIHZvaWQgZWV4cF9od190eF9waW8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgKmJ1ZiwKKwkJICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoTE9DS1VQMTYgfHwgbHAtPndpZHRoKSB7CisJCS8qIFN0b3AgdGhlIENVIHNvIHRoYXQgdGhlcmUgaXMgbm8gY2hhbmNlIHRoYXQgaXQKKwkJICAganVtcHMgb2ZmIHRvIGEgYm9ndXMgYWRkcmVzcyB3aGlsZSB3ZSBhcmUgd3JpdGluZyB0aGUKKwkJICAgcG9pbnRlciB0byB0aGUgbmV4dCB0cmFuc21pdCBwYWNrZXQgaW4gOC1iaXQgbW9kZSAtLSAKKwkJICAgdGhpcyBlbGltaW5hdGVzIHRoZSAiQ1Ugd2VkZ2VkIiBlcnJvcnMgaW4gOC1iaXQgbW9kZS4KKwkJICAgKFpvbHRhbiBTemlsYWd5aSAxMC0xMi05NikgKi8gCisJCXNjYl9jb21tYW5kKGRldiwgU0NCX0NVc3VzcGVuZCk7CisJCW91dHcoMHhGRkZGLCBpb2FkZHIrU0lHTkFMX0NBKTsKKwl9CisKKyAJb3V0dyhscC0+dHhfaGVhZCwgaW9hZGRyICsgV1JJVEVfUFRSKTsKKworCW91dHcoMHgwMDAwLCBpb2FkZHIgKyBEQVRBUE9SVCk7CisgICAgICAgIG91dHcoQ21kX0lOVHxDbWRfWG1pdCwgaW9hZGRyICsgREFUQVBPUlQpOworCW91dHcobHAtPnR4X2hlYWQrMHgwOCwgaW9hZGRyICsgREFUQVBPUlQpOworCW91dHcobHAtPnR4X2hlYWQrMHgwZSwgaW9hZGRyICsgREFUQVBPUlQpOworCisJb3V0dygweDAwMDAsIGlvYWRkciArIERBVEFQT1JUKTsKKwlvdXR3KDB4MDAwMCwgaW9hZGRyICsgREFUQVBPUlQpOworCW91dHcobHAtPnR4X2hlYWQrMHgwOCwgaW9hZGRyICsgREFUQVBPUlQpOworCisJb3V0dygweDgwMDB8bGVuLCBpb2FkZHIgKyBEQVRBUE9SVCk7CisJb3V0dygtMSwgaW9hZGRyICsgREFUQVBPUlQpOworCW91dHcobHAtPnR4X2hlYWQrMHgxNiwgaW9hZGRyICsgREFUQVBPUlQpOworCW91dHcoMCwgaW9hZGRyICsgREFUQVBPUlQpOworCisgICAgICAgIG91dHN3KGlvYWRkciArIERBVEFQT1JULCBidWYsIChsZW4rMSk+PjEpOworCisJb3V0dyhscC0+dHhfdGFpbCsweGMsIGlvYWRkciArIFdSSVRFX1BUUik7CisJb3V0dyhscC0+dHhfaGVhZCwgaW9hZGRyICsgREFUQVBPUlQpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbHAtPnR4X3RhaWwgPSBscC0+dHhfaGVhZDsKKwlpZiAobHAtPnR4X2hlYWQ9PVRYX0JVRl9TVEFSVCsoKGxwLT5udW1fdHhfYnVmcy0xKSpUWF9CVUZfU0laRSkpCisJCWxwLT50eF9oZWFkID0gVFhfQlVGX1NUQVJUOworCWVsc2UKKwkJbHAtPnR4X2hlYWQgKz0gVFhfQlVGX1NJWkU7CisJaWYgKGxwLT50eF9oZWFkICE9IGxwLT50eF9yZWFwKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQorCWlmIChMT0NLVVAxNiB8fCBscC0+d2lkdGgpIHsKKwkJLyogUmVzdGFydCB0aGUgQ1Ugc28gdGhhdCB0aGUgcGFja2V0IGNhbiBhY3R1YWxseQorCQkgICBiZSB0cmFuc21pdHRlZC4gKFpvbHRhbiBTemlsYWd5aSAxMC0xMi05NikgKi8KKwkJc2NiX2NvbW1hbmQoZGV2LCBTQ0JfQ1VyZXN1bWUpOworCQlvdXR3KDB4RkZGRiwgaW9hZGRyK1NJR05BTF9DQSk7CisJfQorCisJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlscC0+bGFzdF90eCA9IGppZmZpZXM7Cit9CisKKy8qCisgKiBTYW5pdHkgY2hlY2sgdGhlIHN1c3BlY3RlZCBFdGhlckV4cHJlc3MgY2FyZAorICogUmVhZCBoYXJkd2FyZSBhZGRyZXNzLCByZXNldCBjYXJkLCBzaXplIG1lbW9yeSBhbmQgaW5pdGlhbGl6ZSBidWZmZXIKKyAqIG1lbW9yeSBwb2ludGVycy4gVGhlc2UgYXJlIGhlbGQgaW4gZGV2LT5wcml2LCBpbiBjYXNlIHNvbWVvbmUgaGFzIG1vcmUKKyAqIHRoYW4gb25lIGNhcmQgaW4gYSBtYWNoaW5lLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGVleHBfaHdfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgaW9hZGRyKQoreworCXVuc2lnbmVkIHNob3J0IGh3X2FkZHJbM107CisJdW5zaWduZWQgY2hhciBidXN3aWR0aDsKKwl1bnNpZ25lZCBpbnQgbWVtb3J5X3NpemU7CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgeHN1bSA9IDA7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcHJpbnRrKCIlczogRXRoZXJFeHByZXNzIDE2IGF0ICUjeCAiLGRldi0+bmFtZSxpb2FkZHIpOworCisJb3V0YihBU0lDX1JTVCwgaW9hZGRyK0VFUFJPTV9DdHJsKTsKKwlvdXRiKDAsIGlvYWRkcitFRVBST01fQ3RybCk7CisJdWRlbGF5KDUwMCk7CisJb3V0YihpNTg2X1JTVCwgaW9hZGRyK0VFUFJPTV9DdHJsKTsKKworCWh3X2FkZHJbMF0gPSBlZXhwX2h3X3JlYWRlZXByb20oaW9hZGRyLDIpOworCWh3X2FkZHJbMV0gPSBlZXhwX2h3X3JlYWRlZXByb20oaW9hZGRyLDMpOworCWh3X2FkZHJbMl0gPSBlZXhwX2h3X3JlYWRlZXByb20oaW9hZGRyLDQpOworCisJLyogU3RhbmRhcmQgQWRkcmVzcyBvciBDb21wYXEgTFRFIEFkZHJlc3MgKi8KKwlpZiAoISgoaHdfYWRkclsyXT09MHgwMGFhICYmICgoaHdfYWRkclsxXSAmIDB4ZmYwMCk9PTB4MDAwMCkpIHx8CisJICAgICAgKGh3X2FkZHJbMl09PTB4MDA4MCAmJiAoKGh3X2FkZHJbMV0gJiAweGZmMDApPT0weDVGMDApKSkpIAorCXsKKwkJcHJpbnRrKCIgcmVqZWN0ZWQ6IGludmFsaWQgYWRkcmVzcyAlMDR4JTA0eCUwNHhcbiIsCisJCQlod19hZGRyWzJdLGh3X2FkZHJbMV0saHdfYWRkclswXSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIENhbGN1bGF0ZSB0aGUgRUVQUk9NIGNoZWNrc3VtLiAgQ2Fycnkgb24gYW55d2F5IGlmIGl0J3MgYmFkLAorCSAqIHRob3VnaC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKwkJeHN1bSArPSBlZXhwX2h3X3JlYWRlZXByb20oaW9hZGRyLCBpKTsKKwlpZiAoeHN1bSAhPSAweGJhYmEpCisJCXByaW50aygiIChiYWQgRUVQUk9NIHhzdW0gMHglMDJ4KSIsIHhzdW0pOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZm9yICggaT0wIDsgaTw2IDsgaSsrICkKKwkJZGV2LT5kZXZfYWRkcltpXSA9ICgodW5zaWduZWQgY2hhciAqKWh3X2FkZHIpWzUtaV07CisKKwl7CisJCXN0YXRpYyBjaGFyIGlycW1hcFtdPXswLCA5LCAzLCA0LCA1LCAxMCwgMTEsIDB9OworCQl1bnNpZ25lZCBzaG9ydCBzZXR1cHZhbCA9IGVleHBfaHdfcmVhZGVlcHJvbShpb2FkZHIsMCk7CisKKwkJLyogVXNlIHRoZSBJUlEgZnJvbSBFRVBST00gaWYgbm9uZSB3YXMgZ2l2ZW4gKi8KKwkJaWYgKCFkZXYtPmlycSkKKwkJCWRldi0+aXJxID0gaXJxbWFwW3NldHVwdmFsPj4xM107CisKKwkJaWYgKGRldi0+aWZfcG9ydCA9PSAweGZmKSB7CisJCQlkZXYtPmlmX3BvcnQgPSAhKHNldHVwdmFsICYgMHgxMDAwKSA/IEFVSSA6CisJCQkJZWV4cF9od19yZWFkZWVwcm9tKGlvYWRkciw1KSAmIDB4MSA/IFRQRSA6IEJOQzsKKwkJfQorCisJCWJ1c3dpZHRoID0gISgoc2V0dXB2YWwgJiAweDQwMCkgPj4gMTApOworCX0KKworCW1lbXNldChscCwgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisgCXByaW50aygiKElSUSAlZCwgJXMgY29ubmVjdG9yLCAlZC1iaXQgYnVzIiwgZGV2LT5pcnEsIAorIAkgICAgICAgZWV4cF9pZm1hcFtkZXYtPmlmX3BvcnRdLCBidXN3aWR0aD84OjE2KTsKKyAKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldi0+YmFzZV9hZGRyICsgMHgzMDBlLCAxLCAiRXRoZXJFeHByZXNzIikpCisJCXJldHVybiAtRUJVU1k7CisKKyAJZWV4cF9od19zZXRfaW50ZXJmYWNlKGRldik7CisgCisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIgKyAweDMwMGUsIDEpOworICAKKwkvKiBGaW5kIG91dCBob3cgbXVjaCBSQU0gd2UgaGF2ZSBvbiB0aGUgY2FyZCAqLworCW91dHcoMCwgZGV2LT5iYXNlX2FkZHIgKyBXUklURV9QVFIpOworCWZvciAoaSA9IDA7IGkgPCAzMjc2ODsgaSsrKQorCQlvdXR3KDAsIGRldi0+YmFzZV9hZGRyICsgREFUQVBPUlQpOworCisgICAgICAgIGZvciAobWVtb3J5X3NpemUgPSAwOyBtZW1vcnlfc2l6ZSA8IDY0OyBtZW1vcnlfc2l6ZSsrKQorCXsKKwkJb3V0dyhtZW1vcnlfc2l6ZTw8MTAsIGRldi0+YmFzZV9hZGRyICsgUkVBRF9QVFIpOworCQlpZiAoaW53KGRldi0+YmFzZV9hZGRyK0RBVEFQT1JUKSkKKwkJCWJyZWFrOworCQlvdXR3KG1lbW9yeV9zaXplPDwxMCwgZGV2LT5iYXNlX2FkZHIgKyBXUklURV9QVFIpOworCQlvdXR3KG1lbW9yeV9zaXplIHwgMHg1MDAwLCBkZXYtPmJhc2VfYWRkcitEQVRBUE9SVCk7CisJCW91dHcobWVtb3J5X3NpemU8PDEwLCBkZXYtPmJhc2VfYWRkciArIFJFQURfUFRSKTsKKwkJaWYgKGludyhkZXYtPmJhc2VfYWRkcitEQVRBUE9SVCkgIT0gKG1lbW9yeV9zaXplIHwgMHg1MDAwKSkKKwkJCWJyZWFrOworCX0KKworCS8qIFNvcnQgb3V0IHRoZSBudW1iZXIgb2YgYnVmZmVycy4gIFdlIG1heSBoYXZlIDE2LCAzMiwgNDggb3IgNjRrCisJICogb2YgUkFNIHRvIHBsYXkgd2l0aC4KKwkgKi8KKwlscC0+bnVtX3R4X2J1ZnMgPSA0OworCWxwLT5yeF9idWZfZW5kID0gMHgzZmY2OworCXN3aXRjaCAobWVtb3J5X3NpemUpCisJeworCWNhc2UgNjQ6CisJCWxwLT5yeF9idWZfZW5kICs9IDB4NDAwMDsKKwljYXNlIDQ4OgorCQlscC0+bnVtX3R4X2J1ZnMgKz0gNDsKKwkJbHAtPnJ4X2J1Zl9lbmQgKz0gMHg0MDAwOworCWNhc2UgMzI6CisJCWxwLT5yeF9idWZfZW5kICs9IDB4NDAwMDsKKwljYXNlIDE2OgorCQlwcmludGsoIiwgJWRrIFJBTSlcbiIsIG1lbW9yeV9zaXplKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCIpIGJhZCBtZW1vcnkgc2l6ZSAoJWRrKS5cbiIsIG1lbW9yeV9zaXplKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJCWJyZWFrOworCX0KKworCWxwLT5yeF9idWZfc3RhcnQgPSBUWF9CVUZfU1RBUlQgKyAobHAtPm51bV90eF9idWZzKlRYX0JVRl9TSVpFKTsKKwlscC0+d2lkdGggPSBidXN3aWR0aDsKKworCWRldi0+b3BlbiA9IGVleHBfb3BlbjsKKwlkZXYtPnN0b3AgPSBlZXhwX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gZWV4cF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gZWV4cF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZlZXhwX3NldF9tdWx0aWNhc3Q7CisJZGV2LT50eF90aW1lb3V0ID0gZWV4cF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAyKkhaOworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBhIHdvcmQgZnJvbSB0aGUgRXRoZXJFeHByZXNzIG9uLWJvYXJkIHNlcmlhbCBFRVBST00uCisgKiBUaGUgRUVQUk9NIGNvbnRhaW5zIDY0IHdvcmRzIG9mIDE2IGJpdHMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBfX2luaXQgZWV4cF9od19yZWFkZWVwcm9tKHVuc2lnbmVkIHNob3J0IGlvYWRkciwKKwkJCQkJCSAgICB1bnNpZ25lZCBjaGFyIGxvY2F0aW9uKQoreworCXVuc2lnbmVkIHNob3J0IGNtZCA9IDB4MTgwfChsb2NhdGlvbiYweDdmKTsKKwl1bnNpZ25lZCBzaG9ydCBydmFsID0gMCx3dmFsID0gRUNfQ1N8aTU4Nl9SU1Q7CisJaW50IGk7CisKKwlvdXRiKEVDX0NTfGk1ODZfUlNULGlvYWRkcitFRVBST01fQ3RybCk7CisJZm9yIChpPTB4MTAwIDsgaSA7IGk+Pj0xICkKKwl7CisJCWlmIChjbWQmaSkKKwkJCXd2YWwgfD0gRUNfV3I7CisJCWVsc2UKKwkJCXd2YWwgJj0gfkVDX1dyOworCisJCW91dGIod3ZhbCxpb2FkZHIrRUVQUk9NX0N0cmwpOworCQlvdXRiKHd2YWx8RUNfQ2xrLGlvYWRkcitFRVBST01fQ3RybCk7CisJCWVlcHJvbV9kZWxheSgpOworCQlvdXRiKHd2YWwsaW9hZGRyK0VFUFJPTV9DdHJsKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJfQorCXd2YWwgJj0gfkVDX1dyOworCW91dGIod3ZhbCxpb2FkZHIrRUVQUk9NX0N0cmwpOworCWZvciAoaT0weDgwMDAgOyBpIDsgaT4+PTEgKQorCXsKKwkJb3V0Yih3dmFsfEVDX0Nsayxpb2FkZHIrRUVQUk9NX0N0cmwpOworCQllZXByb21fZGVsYXkoKTsKKwkJaWYgKGluYihpb2FkZHIrRUVQUk9NX0N0cmwpJkVDX1JkKQorCQkJcnZhbCB8PSBpOworCQlvdXRiKHd2YWwsaW9hZGRyK0VFUFJPTV9DdHJsKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJfQorCXd2YWwgJj0gfkVDX0NTOworCW91dGIod3ZhbHxFQ19DbGssaW9hZGRyK0VFUFJPTV9DdHJsKTsKKwllZXByb21fZGVsYXkoKTsKKwlvdXRiKHd2YWwsaW9hZGRyK0VFUFJPTV9DdHJsKTsKKwllZXByb21fZGVsYXkoKTsKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIFJlYXAgdHggYnVmZmVycyBhbmQgcmV0dXJuIGxhc3QgdHJhbnNtaXQgc3RhdHVzLgorICogaWYgPT0wIHRoZW4gZWl0aGVyOgorICogICAgYSkgd2UncmUgbm90IHRyYW5zbWl0dGluZyBhbnl0aGluZywgc28gd2h5IGFyZSB3ZSBoZXJlPworICogICAgYikgd2UndmUgZGllZC4KKyAqIG90aGVyd2lzZSwgU3RhdF9CdXN5KHJldHVybikgbWVhbnMgd2UndmUgc3RpbGwgZ290IHNvbWUgcGFja2V0cworICogdG8gdHJhbnNtaXQsIFN0YXRfRG9uZShyZXR1cm4pIG1lYW5zIG91ciBidWZmZXJzIHNob3VsZCBiZSBlbXB0eQorICogYWdhaW4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZWV4cF9od19sYXN0dHhzdGF0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIHNob3J0IHR4X2Jsb2NrID0gbHAtPnR4X3JlYXA7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCisJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYgbHAtPnR4X2hlYWQ9PWxwLT50eF9yZWFwKQorCQlyZXR1cm4gMHgwMDAwOworCisJZG8KKwl7CisJCW91dHcodHhfYmxvY2sgJiB+MzEsIGRldi0+YmFzZV9hZGRyICsgU01fUFRSKTsKKwkJc3RhdHVzID0gaW53KGRldi0+YmFzZV9hZGRyICsgU0hBRE9XKHR4X2Jsb2NrKSk7CisJCWlmICghU3RhdF9Eb25lKHN0YXR1cykpCisJCXsKKwkJCWxwLT50eF9saW5rID0gdHhfYmxvY2s7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJCWVsc2UKKwkJeworCQkJbHAtPmxhc3RfdHhfcmVzdGFydCA9IDA7CisJCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSBTdGF0X05vQ29sbChzdGF0dXMpOworCQkJaWYgKCFTdGF0X09LKHN0YXR1cykpCisJCQl7CisJCQkJY2hhciAqd2hhdHN1cCA9IE5VTEw7CisJCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworICAJCQkJaWYgKFN0YXRfQWJvcnQoc3RhdHVzKSkgCisgIAkJCQkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJaWYgKFN0YXRfVE5vQ2FyKHN0YXR1cykpIHsKKwkJCQkJd2hhdHN1cCA9ICJhYm9ydGVkLCBubyBjYXJyaWVyIjsKKwkJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJfQorCQkJCWlmIChTdGF0X1ROb0NUUyhzdGF0dXMpKSB7CisJCQkJCXdoYXRzdXAgPSAiYWJvcnRlZCwgbG9zdCBDVFMiOworICAJCQkJCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCX0KKwkJCQlpZiAoU3RhdF9UTm9ETUEoc3RhdHVzKSkgeworCQkJCQl3aGF0c3VwID0gIkZJRk8gdW5kZXJyYW4iOworICAJCQkJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCX0KKwkJCQlpZiAoU3RhdF9UWENvbGwoc3RhdHVzKSkgeworCQkJCQl3aGF0c3VwID0gImFib3J0ZWQsIHRvbyBtYW55IGNvbGxpc2lvbnMiOworCQkJCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQl9CisJCQkJaWYgKHdoYXRzdXApCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiB0cmFuc21pdCAlc1xuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSwgd2hhdHN1cCk7CisJCQl9CisJCQllbHNlCisJCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCQlpZiAodHhfYmxvY2sgPT0gVFhfQlVGX1NUQVJUKygobHAtPm51bV90eF9idWZzLTEpKlRYX0JVRl9TSVpFKSkKKwkJCWxwLT50eF9yZWFwID0gdHhfYmxvY2sgPSBUWF9CVUZfU1RBUlQ7CisJCWVsc2UKKwkJCWxwLT50eF9yZWFwID0gdHhfYmxvY2sgKz0gVFhfQlVGX1NJWkU7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJd2hpbGUgKGxwLT50eF9yZWFwICE9IGxwLT50eF9oZWFkKTsKKworCWxwLT50eF9saW5rID0gbHAtPnR4X3RhaWwgKyAweDA4OworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gSXQgaXMgY2FsbGVkIHdoZW4gc29tZSBoaWdoZXIgcm91dGluZSBkZXRlY3RzCisgKiB0aGF0IHRoZSBDVSBoYXMgc3RvcHBlZCwgdG8gdHJ5IHRvIHJlc3RhcnQgaXQgZnJvbSB0aGUgbGFzdCBwYWNrZXQgd2Uga25ldworICogd2Ugd2VyZSB3b3JraW5nIG9uLCBvciB0aGUgaWRsZSBsb29wIGlmIHdlIGhhZCBmaW5pc2hlZCBmb3IgdGhlIHRpbWUuCisgKi8KKworc3RhdGljIHZvaWQgZWV4cF9od190eHJlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlscC0+bGFzdF90eF9yZXN0YXJ0ID0gbHAtPnR4X2xpbms7CisJc2NiX3dyY2JsKGRldiwgbHAtPnR4X2xpbmspOworCXNjYl9jb21tYW5kKGRldiwgU0NCX0NVc3RhcnQpOworCW91dGIoMCxpb2FkZHIrU0lHTkFMX0NBKTsKKworCXsKKwkJdW5zaWduZWQgc2hvcnQgYm9ndXNjb3VudD01MCxmYWlsY291bnQ9NTsKKwkJd2hpbGUgKCFzY2Jfc3RhdHVzKGRldikpCisJCXsKKwkJCWlmICghLS1ib2d1c2NvdW50KQorCQkJeworCQkJCWlmICgtLWZhaWxjb3VudCkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDVSBzdGFydCB0aW1lZCBvdXQsIHN0YXR1cyAlMDR4LCBjbWQgJTA0eFxuIiwgZGV2LT5uYW1lLCBzY2Jfc3RhdHVzKGRldiksIHNjYl9yZGNtZChkZXYpKTsKKwkJCQkgICAgICAgIHNjYl93cmNibChkZXYsIGxwLT50eF9saW5rKTsKKwkJCQkJc2NiX2NvbW1hbmQoZGV2LCBTQ0JfQ1VzdGFydCk7CisJCQkJCW91dGIoMCxpb2FkZHIrU0lHTkFMX0NBKTsKKwkJCQkJYm9ndXNjb3VudCA9IDEwMDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZhaWxlZCB0byByZXN0YXJ0IENVLCByZXNldHRpbmcgYm9hcmQuLi5cbiIsZGV2LT5uYW1lKTsKKwkJCQkJZWV4cF9od19pbml0NTg2KGRldik7CisJCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqIFdyaXRlcyBkb3duIHRoZSBsaXN0IG9mIHRyYW5zbWl0IGJ1ZmZlcnMgaW50byBjYXJkIG1lbW9yeS4gIEVhY2gKKyAqIGVudHJ5IGNvbnNpc3RzIG9mIGFuIDgyNTg2IHRyYW5zbWl0IGNvbW1hbmQsIGZvbGxvd2VkIGJ5IGEganVtcAorICogcG9pbnRpbmcgdG8gaXRzZWxmLiAgV2hlbiB3ZSB3YW50IHRvIHRyYW5zbWl0IGEgcGFja2V0LCB3ZSB3cml0ZQorICogdGhlIGRhdGEgaW50byB0aGUgYXBwcm9wcmlhdGUgdHJhbnNtaXQgYnVmZmVyIGFuZCB0aGVuIG1vZGlmeSB0aGUKKyAqIHByZWNlZGluZyBqdW1wIHRvIHBvaW50IGF0IHRoZSBuZXcgdHJhbnNtaXQgY29tbWFuZC4gIFRoaXMgbWVhbnMgdGhhdAorICogdGhlIDU4NiBjb21tYW5kIHVuaXQgaXMgY29udGludW91c2x5IGFjdGl2ZS4KKyAqLworCitzdGF0aWMgdm9pZCBlZXhwX2h3X3R4aW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBzaG9ydCB0eF9ibG9jayA9IFRYX0JVRl9TVEFSVDsKKwl1bnNpZ25lZCBzaG9ydCBjdXJ0YnVmOworCXVuc2lnbmVkIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJZm9yICggY3VydGJ1Zj0wIDsgY3VydGJ1ZjxscC0+bnVtX3R4X2J1ZnMgOyBjdXJ0YnVmKysgKQorCXsKKwkJb3V0dyh0eF9ibG9jaywgaW9hZGRyICsgV1JJVEVfUFRSKTsKKworCSAgICAgICAgb3V0dygweDAwMDAsIGlvYWRkciArIERBVEFQT1JUKTsKKwkJb3V0dyhDbWRfSU5UfENtZF9YbWl0LCBpb2FkZHIgKyBEQVRBUE9SVCk7CisJCW91dHcodHhfYmxvY2srMHgwOCwgaW9hZGRyICsgREFUQVBPUlQpOworCQlvdXR3KHR4X2Jsb2NrKzB4MGUsIGlvYWRkciArIERBVEFQT1JUKTsKKworCQlvdXR3KDB4MDAwMCwgaW9hZGRyICsgREFUQVBPUlQpOworCQlvdXR3KDB4MDAwMCwgaW9hZGRyICsgREFUQVBPUlQpOworCQlvdXR3KHR4X2Jsb2NrKzB4MDgsIGlvYWRkciArIERBVEFQT1JUKTsKKworCQlvdXR3KDB4ODAwMCwgaW9hZGRyICsgREFUQVBPUlQpOworCQlvdXR3KC0xLCBpb2FkZHIgKyBEQVRBUE9SVCk7CisJCW91dHcodHhfYmxvY2srMHgxNiwgaW9hZGRyICsgREFUQVBPUlQpOworCQlvdXR3KDB4MDAwMCwgaW9hZGRyICsgREFUQVBPUlQpOworCisJCXR4X2Jsb2NrICs9IFRYX0JVRl9TSVpFOworCX0KKwlscC0+dHhfaGVhZCA9IFRYX0JVRl9TVEFSVDsKKwlscC0+dHhfcmVhcCA9IFRYX0JVRl9TVEFSVDsKKwlscC0+dHhfdGFpbCA9IHR4X2Jsb2NrIC0gVFhfQlVGX1NJWkU7CisJbHAtPnR4X2xpbmsgPSBscC0+dHhfdGFpbCArIDB4MDg7CisJbHAtPnJ4X2J1Zl9zdGFydCA9IHR4X2Jsb2NrOworCit9CisKKy8qCisgKiBXcml0ZSB0aGUgY2lyY3VsYXIgbGlzdCBvZiByZWNlaXZlIGJ1ZmZlciBkZXNjcmlwdG9ycyB0byBjYXJkIG1lbW9yeS4KKyAqIFRoZSBlbmQgb2YgdGhlIGxpc3QgaXNuJ3QgbWFya2VkLCB3aGljaCBtZWFucyB0aGF0IHRoZSA4MjU4NiByZWNlaXZlCisgKiB1bml0IHdpbGwgbG9vcCB1bnRpbCBidWZmZXJzIGJlY29tZSBhdmFpbGFibGUgKHRoaXMgYXZvaWRzIGl0IGdpdmluZyB1cworICogIm91dCBvZiByZXNvdXJjZXMiIG1lc3NhZ2VzKS4KKyAqLworCitzdGF0aWMgdm9pZCBlZXhwX2h3X3J4aW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBzaG9ydCByeF9ibG9jayA9IGxwLT5yeF9idWZfc3RhcnQ7CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlscC0+bnVtX3J4X2J1ZnMgPSAwOworCWxwLT5yeF9maXJzdCA9IGxwLT5yeF9wdHIgPSByeF9ibG9jazsKKwlkbworCXsKKwkJbHAtPm51bV9yeF9idWZzKys7CisKKwkJb3V0dyhyeF9ibG9jaywgaW9hZGRyICsgV1JJVEVfUFRSKTsKKworCQlvdXR3KDAsIGlvYWRkciArIERBVEFQT1JUKTsgIG91dHcoMCwgaW9hZGRyK0RBVEFQT1JUKTsKKwkJb3V0dyhyeF9ibG9jayArIFJYX0JVRl9TSVpFLCBpb2FkZHIrREFUQVBPUlQpOworCQlvdXR3KDB4ZmZmZiwgaW9hZGRyK0RBVEFQT1JUKTsKKworCQlvdXR3KDB4MDAwMCwgaW9hZGRyK0RBVEFQT1JUKTsKKwkJb3V0dygweGRlYWQsIGlvYWRkcitEQVRBUE9SVCk7CisJCW91dHcoMHhkZWFkLCBpb2FkZHIrREFUQVBPUlQpOworCQlvdXR3KDB4ZGVhZCwgaW9hZGRyK0RBVEFQT1JUKTsKKwkJb3V0dygweGRlYWQsIGlvYWRkcitEQVRBUE9SVCk7CisJCW91dHcoMHhkZWFkLCBpb2FkZHIrREFUQVBPUlQpOworCQlvdXR3KDB4ZGVhZCwgaW9hZGRyK0RBVEFQT1JUKTsKKworCQlvdXR3KDB4MDAwMCwgaW9hZGRyK0RBVEFQT1JUKTsKKwkJb3V0dyhyeF9ibG9jayArIFJYX0JVRl9TSVpFICsgMHgxNiwgaW9hZGRyK0RBVEFQT1JUKTsKKwkJb3V0dyhyeF9ibG9jayArIDB4MjAsIGlvYWRkcitEQVRBUE9SVCk7CisJCW91dHcoMCwgaW9hZGRyK0RBVEFQT1JUKTsKKwkJb3V0dyhSWF9CVUZfU0laRS0weDIwLCBpb2FkZHIrREFUQVBPUlQpOworCisJCWxwLT5yeF9sYXN0ID0gcnhfYmxvY2s7CisJCXJ4X2Jsb2NrICs9IFJYX0JVRl9TSVpFOworCX0gd2hpbGUgKHJ4X2Jsb2NrIDw9IGxwLT5yeF9idWZfZW5kLVJYX0JVRl9TSVpFKTsKKworCisJLyogTWFrZSBmaXJzdCBSeCBmcmFtZSBkZXNjcmlwdG9yIHBvaW50IHRvIGZpcnN0IFJ4IGJ1ZmZlcgorICAgICAgICAgICBkZXNjcmlwdG9yICovCisJb3V0dyhscC0+cnhfZmlyc3QgKyA2LCBpb2FkZHIrV1JJVEVfUFRSKTsKKwlvdXR3KGxwLT5yeF9maXJzdCArIDB4MTYsIGlvYWRkcitEQVRBUE9SVCk7CisKKwkvKiBDbG9zZSBSeCBmcmFtZSBkZXNjcmlwdG9yIHJpbmcgKi8KKyAgCW91dHcobHAtPnJ4X2xhc3QgKyA0LCBpb2FkZHIrV1JJVEVfUFRSKTsKKyAgCW91dHcobHAtPnJ4X2ZpcnN0LCBpb2FkZHIrREFUQVBPUlQpOworICAKKwkvKiBDbG9zZSBSeCBidWZmZXIgZGVzY3JpcHRvciByaW5nICovCisJb3V0dyhscC0+cnhfbGFzdCArIDB4MTYgKyAyLCBpb2FkZHIrV1JJVEVfUFRSKTsKKwlvdXR3KGxwLT5yeF9maXJzdCArIDB4MTYsIGlvYWRkcitEQVRBUE9SVCk7CisJCit9CisKKy8qCisgKiBVbi1yZXNldCB0aGUgNTg2LCBhbmQgc3RhcnQgdGhlIGNvbmZpZ3VyYXRpb24gc2VxdWVuY2UuIFdlIGRvbid0IHdhaXQgZm9yCisgKiB0aGlzIHRvIGZpbmlzaCwgYnV0IGFsbG93IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBzdGFydCB0aGUgQ1UgYW5kIFJVIGZvcgorICogdXMuICBXZSBjYW4ndCBzdGFydCB0aGUgcmVjZWl2ZS90cmFuc21pc3Npb24gc3lzdGVtIHVwIGJlZm9yZSB3ZSBrbm93IHRoYXQKKyAqIHRoZSBoYXJkd2FyZSBpcyBjb25maWd1cmVkIGNvcnJlY3RseS4KKyAqLworCitzdGF0aWMgdm9pZCBlZXhwX2h3X2luaXQ1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisKKyNpZiBORVRfREVCVUcgPiA2CisJcHJpbnRrKCIlczogZWV4cF9od19pbml0NTg2KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCWxwLT5zdGFydGVkID0gMDsKKworCXNldF9sb29wYmFjayhkZXYpOworCisJb3V0YihTSVJRX2Rpc3xpcnFybWFwW2Rldi0+aXJxXSxpb2FkZHIrU0VUX0lSUSk7CisKKwkvKiBEb3dubG9hZCB0aGUgc3RhcnR1cCBjb2RlICovCisJb3V0dyhscC0+cnhfYnVmX2VuZCAmIH4zMSwgaW9hZGRyICsgU01fUFRSKTsKKwlvdXR3KGxwLT53aWR0aD8weDAwMDE6MHgwMDAwLCBpb2FkZHIgKyAweDgwMDYpOworCW91dHcoMHgwMDAwLCBpb2FkZHIgKyAweDgwMDgpOworCW91dHcoMHgwMDAwLCBpb2FkZHIgKyAweDgwMGEpOworCW91dHcoMHgwMDAwLCBpb2FkZHIgKyAweDgwMGMpOworCW91dHcoMHgwMDAwLCBpb2FkZHIgKyAweDgwMGUpOworCisJZm9yIChpID0gMDsgaSA8IChzaXplb2Yoc3RhcnRfY29kZSkpOyBpKz0zMikgeworCQlpbnQgajsKKwkJb3V0dyhpLCBpb2FkZHIgKyBTTV9QVFIpOworCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorPTIpCisJCQlvdXR3KHN0YXJ0X2NvZGVbKGkraikvMl0sCisJCQkgICAgIGlvYWRkcisweDQwMDAraik7CisJCWZvciAoaiA9IDA7IGogPCAxNjsgais9MikKKwkJCW91dHcoc3RhcnRfY29kZVsoaStqKzE2KS8yXSwKKwkJCSAgICAgaW9hZGRyKzB4ODAwMCtqKTsKKwl9CisKKwkvKiBEbyB3ZSB3YW50IHByb21pc2N1b3VzIG1vZGUgb3IgbXVsdGljYXN0PyAqLworCW91dHcoQ09ORl9QUk9NSVNDICYgfjMxLCBpb2FkZHIrU01fUFRSKTsKKwlpID0gaW53KGlvYWRkcitTSEFET1coQ09ORl9QUk9NSVNDKSk7CisJb3V0dygoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKT8oaXwxKTooaSAmIH4xKSwgCisJICAgICBpb2FkZHIrU0hBRE9XKENPTkZfUFJPTUlTQykpOworCWxwLT53YXNfcHJvbWlzYyA9IGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQzsKKyNpZiAwCisJZWV4cF9zZXR1cF9maWx0ZXIoZGV2KTsKKyNlbmRpZgorCisJLyogV3JpdGUgb3VyIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwlvdXR3KENPTkZfSFdBRERSICYgfjMxLCBpb2FkZHIrU01fUFRSKTsKKwlvdXR3KCgodW5zaWduZWQgc2hvcnQgKilkZXYtPmRldl9hZGRyKVswXSwgaW9hZGRyK1NIQURPVyhDT05GX0hXQUREUikpOworCW91dHcoKCh1bnNpZ25lZCBzaG9ydCAqKWRldi0+ZGV2X2FkZHIpWzFdLCAKKwkgICAgIGlvYWRkcitTSEFET1coQ09ORl9IV0FERFIrMikpOworCW91dHcoKCh1bnNpZ25lZCBzaG9ydCAqKWRldi0+ZGV2X2FkZHIpWzJdLAorCSAgICAgaW9hZGRyK1NIQURPVyhDT05GX0hXQUREUis0KSk7CisKKwllZXhwX2h3X3R4aW5pdChkZXYpOworCWVleHBfaHdfcnhpbml0KGRldik7CisKKwlvdXRiKDAsaW9hZGRyK0VFUFJPTV9DdHJsKTsKKwltZGVsYXkoNSk7CisKKwlzY2JfY29tbWFuZChkZXYsIDB4ZjAwMCk7CisJb3V0YigwLGlvYWRkcitTSUdOQUxfQ0EpOworCisJb3V0dygwLCBpb2FkZHIrU01fUFRSKTsKKworCXsKKwkJdW5zaWduZWQgc2hvcnQgcmJvZ3VzY291bnQ9NTAscmZhaWxjb3VudD01OworCQl3aGlsZSAoaW53KGlvYWRkcisweDQwMDApKQorCQl7CisJCQlpZiAoIS0tcmJvZ3VzY291bnQpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGk4MjU4NiByZXNldCB0aW1lZCBvdXQsIGtpY2tpbmcuLi5cbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQkJc2NiX2NvbW1hbmQoZGV2LCAwKTsKKwkJCQlvdXRiKDAsaW9hZGRyK1NJR05BTF9DQSk7CisJCQkJcmJvZ3VzY291bnQgPSAxMDA7CisJCQkJaWYgKCEtLXJmYWlsY291bnQpCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaTgyNTg2IG5vdCByZXNwb25kaW5nLCBnaXZpbmcgdXAuXG4iLAorCQkJCQkJZGV2LT5uYW1lKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworICAgICAgICBzY2Jfd3JjYmwoZGV2LCBDT05GX0xJTkspOworCXNjYl9jb21tYW5kKGRldiwgMHhmMDAwfFNDQl9DVXN0YXJ0KTsKKwlvdXRiKDAsaW9hZGRyK1NJR05BTF9DQSk7CisKKwl7CisJCXVuc2lnbmVkIHNob3J0IGlib2d1c2NvdW50PTUwLGlmYWlsY291bnQ9NTsKKwkJd2hpbGUgKCFzY2Jfc3RhdHVzKGRldikpCisJCXsKKwkJCWlmICghLS1pYm9ndXNjb3VudCkKKwkJCXsKKwkJCQlpZiAoLS1pZmFpbGNvdW50KQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGk4MjU4NiBpbml0aWFsaXphdGlvbiB0aW1lZCBvdXQsIHN0YXR1cyAlMDR4LCBjbWQgJTA0eFxuIiwKKwkJCQkJCWRldi0+bmFtZSwgc2NiX3N0YXR1cyhkZXYpLCBzY2JfcmRjbWQoZGV2KSk7CisJCQkJCXNjYl93cmNibChkZXYsIENPTkZfTElOSyk7CisJCQkJICAgICAgICBzY2JfY29tbWFuZChkZXYsIDB4ZjAwMHxTQ0JfQ1VzdGFydCk7CisJCQkJCW91dGIoMCxpb2FkZHIrU0lHTkFMX0NBKTsKKwkJCQkJaWJvZ3VzY291bnQgPSAxMDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBpODI1ODYsIGdpdmluZyB1cC5cbiIsZGV2LT5uYW1lKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWNsZWFyX2xvb3BiYWNrKGRldik7CisJb3V0YihTSVJRX2VufGlycXJtYXBbZGV2LT5pcnFdLGlvYWRkcitTRVRfSVJRKTsKKworCWxwLT5pbml0X3RpbWUgPSBqaWZmaWVzOworI2lmIE5FVF9ERUJVRyA+IDYKKyAgICAgICAgcHJpbnRrKCIlczogbGVhdmluZyBlZXhwX2h3X2luaXQ1ODYoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZWV4cF9zZXR1cF9maWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgY291bnQgPSBkZXYtPm1jX2NvdW50OworCWludCBpOworCWlmIChjb3VudCA+IDgpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHRvbyBtYW55IG11bHRpY2FzdCBhZGRyZXNzZXMgKCVkKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgY291bnQpOworCQljb3VudCA9IDg7CisJfQorCQorCW91dHcoQ09ORl9OUl9NVUxUSUNBU1QgJiB+MzEsIGlvYWRkcitTTV9QVFIpOworCW91dHcoY291bnQsIGlvYWRkcitTSEFET1coQ09ORl9OUl9NVUxUSUNBU1QpKTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQl1bnNpZ25lZCBzaG9ydCAqZGF0YSA9ICh1bnNpZ25lZCBzaG9ydCAqKWRtaS0+ZG1pX2FkZHI7CisJCWlmICghZG1pKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogdG9vIGZldyBtdWx0aWNhc3QgYWRkcmVzc2VzXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGRtaS0+ZG1pX2FkZHJsZW4gIT0gRVRIX0FMRU4pIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIG11bHRpY2FzdCBhZGRyZXNzIGxlbmd0aCBnaXZlbi5cbiIsIGRldi0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlvdXR3KChDT05GX01VTFRJQ0FTVCsoNippKSkgJiB+MzEsIGlvYWRkcitTTV9QVFIpOworCQlvdXR3KGRhdGFbMF0sIGlvYWRkcitTSEFET1coQ09ORl9NVUxUSUNBU1QrKDYqaSkpKTsKKwkJb3V0dygoQ09ORl9NVUxUSUNBU1QrKDYqaSkrMikgJiB+MzEsIGlvYWRkcitTTV9QVFIpOworCQlvdXR3KGRhdGFbMV0sIGlvYWRkcitTSEFET1coQ09ORl9NVUxUSUNBU1QrKDYqaSkrMikpOworCQlvdXR3KChDT05GX01VTFRJQ0FTVCsoNippKSs0KSAmIH4zMSwgaW9hZGRyK1NNX1BUUik7CisJCW91dHcoZGF0YVsyXSwgaW9hZGRyK1NIQURPVyhDT05GX01VTFRJQ0FTVCsoNippKSs0KSk7CisJfQorfQorCisvKgorICogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgKi8KK3N0YXRpYyB2b2lkCitlZXhwX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGtpY2sgPSAwLCBpOworICAgICAgICBpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgIT0gbHAtPndhc19wcm9taXNjKSB7CisgICAgICAgICAgICAgICAgb3V0dyhDT05GX1BST01JU0MgJiB+MzEsIGlvYWRkcitTTV9QVFIpOworICAgICAgICAgICAgICAgIGkgPSBpbncoaW9hZGRyK1NIQURPVyhDT05GX1BST01JU0MpKTsKKyAgICAgICAgICAgICAgICBvdXR3KChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpPyhpfDEpOihpICYgfjEpLAorICAgICAgICAgICAgICAgICAgICAgaW9hZGRyK1NIQURPVyhDT05GX1BST01JU0MpKTsKKyAgICAgICAgICAgICAgICBscC0+d2FzX3Byb21pc2MgPSBkZXYtPmZsYWdzICYgSUZGX1BST01JU0M7CisgICAgICAgICAgICAgICAga2ljayA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSkgeworICAgICAgICAgICAgICAgIGVleHBfc2V0dXBfZmlsdGVyKGRldik7CisgICAgICAgICAgICAgICAgaWYgKGxwLT5vbGRfbWNfY291bnQgIT0gZGV2LT5tY19jb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAga2ljayA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBscC0+b2xkX21jX2NvdW50ID0gZGV2LT5tY19jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGtpY2spIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9qOworICAgICAgICAgICAgICAgIHNjYl9jb21tYW5kKGRldiwgU0NCX0NVc3VzcGVuZCk7CisgICAgICAgICAgICAgICAgb3V0YigwLCBpb2FkZHIrU0lHTkFMX0NBKTsKKyAgICAgICAgICAgICAgICBvdXRiKDAsIGlvYWRkcitTSUdOQUxfQ0EpOworI2lmIDAKKyAgICAgICAgICAgICAgICBwcmludGsoIiVzOiB3YWl0aW5nIGZvciBDVSB0byBnbyBzdXNwZW5kZWRcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBvaiA9IGppZmZpZXM7CisgICAgICAgICAgICAgICAgd2hpbGUgKChTQ0JfQ1VzdGF0KHNjYl9zdGF0dXMoZGV2KSkgPT0gMikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKChqaWZmaWVzLW9qKSA8IDIwMDApKTsKKwkJaWYgKFNDQl9DVXN0YXQoc2NiX3N0YXR1cyhkZXYpKSA9PSAyKQorCQkJcHJpbnRrKCIlczogd2FybmluZywgQ1UgZGlkbid0IHN0b3BcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgbHAtPnN0YXJ0ZWQgJj0gfihTVEFSVEVEX0NVKTsKKyAgICAgICAgICAgICAgICBzY2Jfd3JjYmwoZGV2LCBDT05GX0xJTkspOworICAgICAgICAgICAgICAgIHNjYl9jb21tYW5kKGRldiwgU0NCX0NVc3RhcnQpOworICAgICAgICAgICAgICAgIG91dGIoMCwgaW9hZGRyK1NJR05BTF9DQSk7CisgICAgICAgIH0KK30KKworCisvKgorICogTU9EVUxFIHN0dWZmCisgKi8KKworI2lmZGVmIE1PRFVMRQorCisjZGVmaW5lIEVFWFBfTUFYX0NBUkRTICAgICA0ICAgIC8qIG1heCBudW1iZXIgb2YgY2FyZHMgdG8gc3VwcG9ydCAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9lZXhwW0VFWFBfTUFYX0NBUkRTXTsKK3N0YXRpYyBpbnQgaXJxW0VFWFBfTUFYX0NBUkRTXTsKK3N0YXRpYyBpbnQgaW9bRUVYUF9NQVhfQ0FSRFNdOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkV0aGVyRXhwcmVzcyAxNiBJL08gYmFzZSBhZGRyZXNzKGVzKSIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJFdGhlckV4cHJlc3MgMTYgSVJRIG51bWJlcihzKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKy8qIElkZWFsbHkgdGhlIHVzZXIgd291bGQgZ2l2ZSB1cyBpbz0sIGlycT0gZm9yIGV2ZXJ5IGNhcmQuICBJZiBhbnkgcGFyYW1ldGVycworICogYXJlIHNwZWNpZmllZCwgd2UgdmVyaWZ5IGFuZCB0aGVuIHVzZSB0aGVtLiAgSWYgbm8gcGFyYW1ldGVycyBhcmUgZ2l2ZW4sIHdlCisgKiBhdXRvcHJvYmUgZm9yIG9uZSBjYXJkIG9ubHkuCisgKi8KK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHRoaXNfZGV2LCBmb3VuZCA9IDA7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBFRVhQX01BWF9DQVJEUzsgdGhpc19kZXYrKykgeworCQlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCQlkZXYtPmlycSA9IGlycVt0aGlzX2Rldl07CisJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOworCQlpZiAoaW9bdGhpc19kZXZdID09IDApIHsKKwkJCWlmICh0aGlzX2RldikKKwkJCQlicmVhazsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiZWV4cHJlc3MuYzogTW9kdWxlIGF1dG9wcm9iZSBub3QgcmVjb21tZW5kZWQsIGdpdmUgaW89eHguXG4iKTsKKwkJfQorCQlpZiAoZG9fZXhwcmVzc19wcm9iZShkZXYpID09IDAgJiYgcmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgeworCQkJZGV2X2VleHBbdGhpc19kZXZdID0gZGV2OworCQkJZm91bmQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVleHByZXNzLmM6IEZhaWxlZCB0byByZWdpc3RlciBjYXJkIGF0IDB4JXguXG4iLCBpb1t0aGlzX2Rldl0pOworCQlmcmVlX25ldGRldihkZXYpOworCQlicmVhazsKKwl9CisJaWYgKGZvdW5kKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOWElPOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgRUVYUF9NQVhfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9lZXhwW3RoaXNfZGV2XTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYKKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqICBjLWZpbGUtc3R5bGU6ICJsaW51eCIKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWV4cHJlc3MuaCBiL2RyaXZlcnMvbmV0L2VleHByZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiNDMxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2VleHByZXNzLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBlZXhwcmVzcy5oOiBJbnRlbCBFdGhlckV4cHJlc3MxNiBkZWZpbmVzCisgKi8KKworLyoKKyAqIEV0aGVyRXhwcmVzcyBjYXJkIHJlZ2lzdGVyIGFkZHJlc3NlcworICogYXMgb2Zmc2V0cyBmcm9tIHRoZSBiYXNlIElPIHJlZ2lvbiAoZGV2LT5iYXNlX2FkZHIpCisgKi8KKworI2RlZmluZSBEQVRBUE9SVCAgICAgIDB4MDAwMAorI2RlZmluZSBXUklURV9QVFIgICAgIDB4MDAwMgorI2RlZmluZSBSRUFEX1BUUiAgICAgIDB4MDAwNAorI2RlZmluZSBTSUdOQUxfQ0EgICAgIDB4MDAwNgorI2RlZmluZSBTRVRfSVJRICAgICAgIDB4MDAwNworI2RlZmluZSBTTV9QVFIgICAgICAgIDB4MDAwOAorI2RlZmluZQlNRU1fRGVjCSAgICAgIDB4MDAwYQorI2RlZmluZSBNRU1fQ3RybCAgICAgIDB4MDAwYgorI2RlZmluZSBNRU1fUGFnZV9DdHJsIDB4MDAwYworI2RlZmluZSBDb25maWcgICAgICAgIDB4MDAwZAorI2RlZmluZSBFRVBST01fQ3RybCAgIDB4MDAwZQorI2RlZmluZSBJRF9QT1JUICAgICAgIDB4MDAwZgorI2RlZmluZQlNRU1fRUN0cmwgICAgIDB4MDAwZgorCisvKgorICogY2FyZCByZWdpc3RlciBkZWZpbmVzCisgKi8KKworLyogU0VUX0lSUSAqLworI2RlZmluZSBTSVJRX2VuICAgICAgIDB4MDgKKyNkZWZpbmUgU0lSUV9kaXMgICAgICAweDAwCisKKy8qIEVFUFJPTV9DdHJsICovCisjZGVmaW5lIEVDX0NsayAgICAgICAgMHgwMQorI2RlZmluZSBFQ19DUyAgICAgICAgIDB4MDIKKyNkZWZpbmUgRUNfV3IgICAgICAgICAweDA0CisjZGVmaW5lIEVDX1JkICAgICAgICAgMHgwOAorI2RlZmluZSBBU0lDX1JTVCAgICAgIDB4NDAKKyNkZWZpbmUgaTU4Nl9SU1QgICAgICAweDgwCisKKyNkZWZpbmUgZWVwcm9tX2RlbGF5KCkgeyB1ZGVsYXkoNDApOyB9CisKKy8qCisgKiBpODI1ODYgTWVtb3J5IENvbmZpZ3VyYXRpb24KKyAqLworCisvKiAoU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlcikgU3lzdGVtIHN0YXJ0IHVwIGJsb2NrLCByZWFkIGFmdGVyIDU4Nl9SU1QgKi8KKyNkZWZpbmUgU0NQX1NUQVJUIDB4ZmZmNgorCisvKiBJbnRlcm1lZGlhdGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAqLworI2RlZmluZSBJU0NQX1NUQVJUIDB4MDAwMAorCisvKiBTeXN0ZW0gQ29tbWFuZCBCbG9jayAqLworI2RlZmluZSBTQ0JfU1RBUlQgMHgwMDA4CisKKy8qIFN0YXJ0IG9mIGJ1ZmZlciByZWdpb24uICBFdmVyeXRoaW5nIGJlZm9yZSB0aGlzIGlzIHVzZWQgZm9yIGNvbnRyb2wKKyAqIHN0cnVjdHVyZXMgYW5kIHRoZSBDVSBjb25maWd1cmF0aW9uIHByb2dyYW0uICBUaGUgbWVtb3J5IGxheW91dCBpcyAKKyAqIGRldGVybWluZWQgaW4gZWV4cF9od19wcm9iZSgpLCBvbmNlIHdlIGtub3cgaG93IG11Y2ggbWVtb3J5IGlzIAorICogYXZhaWxhYmxlIG9uIHRoZSBjYXJkLgorICovCisKKyNkZWZpbmUgVFhfQlVGX1NUQVJUIDB4MDEwMAorCisjZGVmaW5lIFRYX0JVRl9TSVpFICgoMjQrRVRIX0ZSQU1FX0xFTiszMSkmfjB4MWYpCisjZGVmaW5lIFJYX0JVRl9TSVpFICgoMzIrRVRIX0ZSQU1FX0xFTiszMSkmfjB4MWYpCisKKy8qCisgKiBTQ0IgZGVmaW5lcyAKKyAqLworCisvKiB0aGVzZSBmdW5jdGlvbnMgdGFrZSB0aGUgU0NCIHN0YXR1cyB3b3JkIGFuZCB0ZXN0IHRoZSByZWxldmFudCBzdGF0dXMgYml0ICovCisjZGVmaW5lIFNDQl9jb21wbGV0ZShzKSAoKHMmMHg4MDAwKSE9MCkKKyNkZWZpbmUgU0NCX3J4ZGZyYW1lKHMpICgocyYweDQwMDApIT0wKQorI2RlZmluZSBTQ0JfQ1VkZWFkKHMpICAgKChzJjB4MjAwMCkhPTApCisjZGVmaW5lIFNDQl9SVWRlYWQocykgICAoKHMmMHgxMDAwKSE9MCkKKyNkZWZpbmUgU0NCX2FjayhzKSAgICAgIChzICYgMHhmMDAwKQorCisvKiBDb21tYW5kIHVuaXQgc3RhdHVzOiAwPWlkbGUsIDE9c3VzcGVuZGVkLCAyPWFjdGl2ZSAqLworI2RlZmluZSBTQ0JfQ1VzdGF0KHMpICAgKChzJjB4MDMwMCk+PjgpCisKKy8qIFJlY2VpdmUgdW5pdCBzdGF0dXM6IDA9aWRsZSwgMT1zdXNwZW5kZWQsIDI9b3V0IG9mIHJlc291cmNlcywgND1yZWFkeSAqLworI2RlZmluZSBTQ0JfUlVzdGF0KHMpICAgKChzJjB4MDA3MCk+PjQpCisKKy8qIFNDQiBjb21tYW5kcyAqLworI2RlZmluZSBTQ0JfQ1Vub3AgICAgICAgMHgwMDAwCisjZGVmaW5lIFNDQl9DVXN0YXJ0ICAgICAweDAxMDAKKyNkZWZpbmUgU0NCX0NVcmVzdW1lICAgIDB4MDIwMAorI2RlZmluZSBTQ0JfQ1VzdXNwZW5kICAgMHgwMzAwCisjZGVmaW5lIFNDQl9DVWFib3J0ICAgICAweDA0MDAKKyNkZWZpbmUgU0NCX3Jlc2V0Y2hpcCAgIDB4MDA4MAorCisjZGVmaW5lIFNDQl9SVW5vcCAgICAgICAweDAwMDAKKyNkZWZpbmUgU0NCX1JVc3RhcnQgICAgIDB4MDAxMAorI2RlZmluZSBTQ0JfUlVyZXN1bWUgICAgMHgwMDIwCisjZGVmaW5lIFNDQl9SVXN1c3BlbmQgICAweDAwMzAKKyNkZWZpbmUgU0NCX1JVYWJvcnQgICAgIDB4MDA0MAorCisvKgorICogQ29tbWFuZCBibG9jayBkZWZpbmVzIAorICovCisKKyNkZWZpbmUgU3RhdF9Eb25lKHMpICAgICgocyYweDgwMDApIT0wKQorI2RlZmluZSBTdGF0X0J1c3kocykgICAgKChzJjB4NDAwMCkhPTApCisjZGVmaW5lIFN0YXRfT0socykgICAgICAoKHMmMHgyMDAwKSE9MCkKKyNkZWZpbmUgU3RhdF9BYm9ydChzKSAgICgocyYweDEwMDApIT0wKQorI2RlZmluZSBTdGF0X1NURmFpbCAgICAgKChzJjB4MDgwMCkhPTApCisjZGVmaW5lIFN0YXRfVE5vQ2FyKHMpICAoKHMmMHgwNDAwKSE9MCkKKyNkZWZpbmUgU3RhdF9UTm9DVFMocykgICgocyYweDAyMDApIT0wKQorI2RlZmluZSBTdGF0X1ROb0RNQShzKSAgKChzJjB4MDEwMCkhPTApCisjZGVmaW5lIFN0YXRfVERlZmVyKHMpICAoKHMmMHgwMDgwKSE9MCkKKyNkZWZpbmUgU3RhdF9UQ29sbChzKSAgICgocyYweDAwNDApIT0wKQorI2RlZmluZSBTdGF0X1RYQ29sbChzKSAgKChzJjB4MDAyMCkhPTApCisjZGVmaW5lIFN0YXRfTm9Db2xsKHMpICAocyYweDAwMGYpCisKKy8qIENtZF9FTkQgd2lsbCBlbmQgQUZURVIgdGhlIGNvbW1hbmQgaWYgdGhpcyBpcyB0aGUgZmlyc3QKKyAqIGNvbW1hbmQgYmxvY2sgYWZ0ZXIgYW4gU0NCX0NVc3RhcnQsIGJ1dCBCRUZPUkUgdGhlIGNvbW1hbmQKKyAqIGZvciBhbGwgc3Vic2VxdWVudCBjb21tYW5kcy4gQmVzdCBzdHJhdGVneSBpcyB0byBwbGFjZQorICogQ21kX0lOVCBvbiB0aGUgbGFzdCBjb21tYW5kIGluIHRoZSBzZXF1ZW5jZSwgZm9sbG93ZWQgYnkgYQorICogZHVtbXkgQ21kX05vcCB3aXRoIENtZF9FTkQgYWZ0ZXIgdGhpcy4KKyAqLworCisjZGVmaW5lIENtZF9FTkQgICAgIDB4ODAwMAorI2RlZmluZSBDbWRfU1VTICAgICAweDQwMDAKKyNkZWZpbmUgQ21kX0lOVCAgICAgMHgyMDAwCisKKyNkZWZpbmUgQ21kX05vcCAgICAgMHgwMDAwCisjZGVmaW5lIENtZF9TZXRBZGRyIDB4MDAwMQorI2RlZmluZSBDbWRfQ29uZmlnICAweDAwMDIKKyNkZWZpbmUgQ21kX01DYXN0ICAgMHgwMDAzCisjZGVmaW5lIENtZF9YbWl0ICAgIDB4MDAwNAorI2RlZmluZSBDbWRfVERSICAgICAweDAwMDUKKyNkZWZpbmUgQ21kX0R1bXAgICAgMHgwMDA2CisjZGVmaW5lIENtZF9EaWFnICAgIDB4MDAwNworCisKKy8qCisgKiBGcmFtZSBEZXNjcmlwdG9yIChSZWNlaXZlIGJsb2NrKSBkZWZpbmVzCisgKi8KKworI2RlZmluZSBGRF9Eb25lKHMpICAoKHMmMHg4MDAwKSE9MCkKKyNkZWZpbmUgRkRfQnVzeShzKSAgKChzJjB4NDAwMCkhPTApCisjZGVmaW5lIEZEX09LKHMpICAgICgocyYweDIwMDApIT0wKQorCisjZGVmaW5lIEZEX0NSQyhzKSAgICgocyYweDA4MDApIT0wKQorI2RlZmluZSBGRF9BbGlnbihzKSAoKHMmMHgwNDAwKSE9MCkKKyNkZWZpbmUgRkRfUmVzcmMocykgKChzJjB4MDIwMCkhPTApCisjZGVmaW5lIEZEX0RNQShzKSAgICgocyYweDAxMDApIT0wKQorI2RlZmluZSBGRF9TaG9ydChzKSAoKHMmMHgwMDgwKSE9MCkKKyNkZWZpbmUgRkRfTm9FT0YocykgKChzJjB4MDA0MCkhPTApCisKK3N0cnVjdCByZmRfaGVhZGVyIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGxpbms7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgcmJkX29mZnNldDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBkc3RhZGRyMTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBkc3RhZGRyMjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBkc3RhZGRyMzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBzcmNhZGRyMTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBzcmNhZGRyMjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBzcmNhZGRyMzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBsZW5ndGg7CisgIAorCS8qIFRoaXMgaXMgYWN0dWFsbHkgYSBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yLiAgVGhlIHdheSB3ZSAKKwkgKiBhcnJhbmdlIG1lbW9yeSBtZWFucyB0aGF0IGFuIFJCRCBhbHdheXMgZm9sbG93cyB0aGUgUkZEIHRoYXQgCisJICogcG9pbnRzIHRvIGl0LCBzbyB0aGV5IG1pZ2h0IGFzIHdlbGwgYmUgaW4gdGhlIHNhbWUgc3RydWN0dXJlLgorCSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGFjdHVhbF9jb3VudDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBuZXh0X3JiZDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBidWZfYWRkcjE7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgYnVmX2FkZHIyOworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IHNpemU7Cit9OworCisvKiBSZXR1cm5lZCBkYXRhIGZyb20gdGhlIFRpbWUgRG9tYWluIFJlZmxlY3RvbWV0ZXIgKi8KKworI2RlZmluZSBURFJfTElOS09LICAgICAgICgxPDwxNSkKKyNkZWZpbmUgVERSX1hDVlJQUk9CTEVNICAoMTw8MTQpCisjZGVmaW5lIFREUl9PUEVOICAgICAgICAgKDE8PDEzKQorI2RlZmluZSBURFJfU0hPUlQgICAgICAgICgxPDwxMikKKyNkZWZpbmUgVERSX1RJTUUgICAgICAgICAweDdmZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXBpYzEwMC5jIGIvZHJpdmVycy9uZXQvZXBpYzEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZWJhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lcGljMTAwLmMKQEAgLTAsMCArMSwxNjg3IEBACisvKiBlcGljMTAwLmM6IEEgU01DIDgzYzE3MCBFUElDLzEwMCBGYXN0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguICovCisvKgorCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTctMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisJRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKwlhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBTTUM4M2MxNzAvMTc1ICJFUElDIiBzZXJpZXMsIGFzIHVzZWQgb24gdGhlCisJU01DIEV0aGVyUG93ZXIgSUkgOTQzMiBQQ0kgYWRhcHRlciwgYW5kIHNldmVyYWwgQ2FyZEJ1cyBjYXJkcy4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCUluZm9ybWF0aW9uIGFuZCB1cGRhdGVzIGF2YWlsYWJsZSBhdAorCWh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvZXBpYzEwMC5odG1sCisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkKKwlMaW51eCBrZXJuZWwtc3BlY2lmaWMgY2hhbmdlczoKKwkKKwlMSzEuMS4yIChqZ2FyemlrKToKKwkqIE1lcmdlIGJlY2tlciB2ZXJzaW9uIDEuMDkgKDQvMDgvMjAwMCkKKworCUxLMS4xLjM6CisJKiBNYWpvciBidWdmaXggdG8gMS4wOSBkcml2ZXIgKEZyYW5jaXMgUm9taWV1KQorCQorCUxLMS4xLjQgKGpnYXJ6aWspOgorCSogTWVyZ2UgYmVja2VyIHRlc3QgdmVyc2lvbiAxLjA5ICg1LzI5LzIwMDApCisKKwlMSzEuMS41OgorCSogRml4IGxvY2tpbmcgKGpnYXJ6aWspCisJKiBMaW1pdCA4M2MxNzUgcHJvYmUgdG8gZXRoZXJuZXQtY2xhc3MgUENJIGRldmljZXMgKHJnb29jaCkKKworCUxLMS4xLjY6CisJKiBNZXJnZSBiZWNrZXIgdmVyc2lvbiAxLjExCisJKiBNb3ZlIHBjaV9lbmFibGVfZGV2aWNlIGJlZm9yZSBhbnkgUENJIEJBUiBsZW4gY2hlY2tzCisKKwlMSzEuMS43OgorCSogeyBmaWxsIG1lIGluIH0KKworCUxLMS4xLjg6CisJKiBldGh0b29sIGRyaXZlciBpbmZvIHN1cHBvcnQgKGpnYXJ6aWspCisKKwlMSzEuMS45OgorCSogZXRodG9vbCBtZWRpYSBnZXQvc2V0IHN1cHBvcnQgKGpnYXJ6aWspCisKKwlMSzEuMS4xMDoKKwkqIHJldmVydCBNSUkgdHJhbnNjZWl2ZXIgaW5pdCBjaGFuZ2UgKGpnYXJ6aWspCisKKwlMSzEuMS4xMToKKwkqIGltcGxlbWVudCBFVEhUT09MX1tHU11TRVQsIF9OV0FZX1JTVCwgX1tHU11NU0dMVkwsIF9HTElOSyAoamdhcnppaykKKwkqIHJlcGxhY2Ugc29tZSBNSUktcmVsYXRlZCBtYWdpYyBudW1iZXJzIHdpdGggY29uc3RhbnRzCisKKwlMSzEuMS4xMjoKKwkqIGZpeCBwb3dlci11cCBzZXF1ZW5jZQorCisJTEsxLjEuMTM6CisJKiByZXZlcnQgdmVyc2lvbiAxLjEuMTIsIHBvd2VyLXVwIHNlcXVlbmNlICJmaXgiCisKKwlMSzEuMS4xNCAoS3J5enN6dG9mIEhhbGFzYSk6CisJKiBmaXggc3B1cmlvdXMgYmFkIGluaXRpYWxpemF0aW9ucworCSogcG91bmQgcGh5IGEgbGEgU01TQydzIGFwcCBub3RlIG9uIHRoZSBzdWJqZWN0CisJCisJQUMxLjEuMTRhYworCSogZml4IHBvd2VyIHVwL2Rvd24gZm9yIGV0aHRvb2wgdGhhdCBicm9rZSBpbiAxLjExCisKKyovCisKKyNkZWZpbmUgRFJWX05BTUUgICAgICAgICJlcGljMTAwIgorI2RlZmluZSBEUlZfVkVSU0lPTiAgICAgIjEuMTErTEsxLjEuMTQrQUMxLjEuMTQiCisjZGVmaW5lIERSVl9SRUxEQVRFICAgICAiSnVuZSAyLCAyMDA0IgorCisvKiBUaGUgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLgorICAgVGhlc2UgbWF5IGJlIG1vZGlmaWVkIHdoZW4gYSBkcml2ZXIgbW9kdWxlIGlzIGxvYWRlZC4qLworCitzdGF0aWMgaW50IGRlYnVnID0gMTsJCQkvKiAxIG5vcm1hbCBtZXNzYWdlcywgMCBxdWlldCAuLiA3IHZlcmJvc2UuICovCisKKy8qIFVzZWQgdG8gcGFzcyB0aGUgZnVsbC1kdXBsZXggZmxhZywgZXRjLiAqLworI2RlZmluZSBNQVhfVU5JVFMgOAkJLyogTW9yZSBhcmUgc3VwcG9ydGVkLCBsaW1pdCBvbmx5IG9uIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgb3B0aW9uc1tNQVhfVU5JVFNdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4W01BWF9VTklUU10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKKworLyogU2V0IHRoZSBjb3B5IGJyZWFrcG9pbnQgZm9yIHRoZSBjb3B5LW9ubHktdGlueS1mcmFtZXMgc2NoZW1lLgorICAgU2V0dGluZyB0byA+IDE1MTggZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhpcyBmZWF0dXJlLiAqLworc3RhdGljIGludCByeF9jb3B5YnJlYWs7CisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZS4gKi8KKworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3Igb3BlcmF0aW9uYWwgZWZmaWNpZW5jeS4KKyAgIFRoZSBjb21waWxlciB3aWxsIGNvbnZlcnQgPHVuc2lnbmVkPiclJzwyXk4+IGludG8gYSBiaXQgbWFzay4KKyAgIE1ha2luZyB0aGUgVHggcmluZyB0b28gbGFyZ2UgZGVjcmVhc2VzIHRoZSBlZmZlY3RpdmVuZXNzIG9mIGNoYW5uZWwKKyAgIGJvbmRpbmcgYW5kIHBhY2tldCBwcmlvcml0eS4KKyAgIFRoZXJlIGFyZSBubyBpbGwgZWZmZWN0cyBmcm9tIHRvby1sYXJnZSByZWNlaXZlIHJpbmdzLiAqLworI2RlZmluZSBUWF9SSU5HX1NJWkUJMjU2CisjZGVmaW5lIFRYX1FVRVVFX0xFTgkyNDAJCS8qIExpbWl0IHJpbmcgZW50cmllcyBhY3R1YWxseSB1c2VkLiAgKi8KKyNkZWZpbmUgUlhfUklOR19TSVpFCTI1NgorI2RlZmluZSBUWF9UT1RBTF9TSVpFCVRYX1JJTkdfU0laRSpzaXplb2Yoc3RydWN0IGVwaWNfdHhfZGVzYykKKyNkZWZpbmUgUlhfVE9UQUxfU0laRQlSWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCBlcGljX3J4X2Rlc2MpCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAgKDIqSFopCisKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTUzNgkJCS8qIFNpemUgb2YgZWFjaCB0ZW1wb3JhcnkgUnggYnVmZmVyLiovCisKKy8qIEJ5dGVzIHRyYW5zZmVycmVkIHRvIGNoaXAgYmVmb3JlIHRyYW5zbWlzc2lvbiBzdGFydHMuICovCisvKiBJbml0aWFsIHRocmVzaG9sZCwgaW5jcmVhc2VkIG9uIHVuZGVyZmxvdywgcm91bmRlZCBkb3duIHRvIDQgYnl0ZSB1bml0cy4gKi8KKyNkZWZpbmUgVFhfRklGT19USFJFU0ggMjU2CisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIIDEJCS8qIDAtMywgMD09MzIsIDY0LDk2LCBvciAzPT0xMjggYnl0ZXMgICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiBUaGVzZSBpZGVudGlmeSB0aGUgZHJpdmVyIGJhc2UgdmVyc2lvbiBhbmQgbWF5IG5vdCBiZSByZW1vdmVkLiAqLworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorRFJWX05BTUUgIi5jOnYxLjExIDEvNy8yMDAxIFdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT5cbiI7CitzdGF0aWMgY2hhciB2ZXJzaW9uMltdIF9fZGV2aW5pdGRhdGEgPQorIiAgaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay9lcGljMTAwLmh0bWxcbiI7CitzdGF0aWMgY2hhciB2ZXJzaW9uM1tdIF9fZGV2aW5pdGRhdGEgPQorIiAgKHVub2ZmaWNpYWwgMi40Lngga2VybmVsIHBvcnQsIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiLCAiIERSVl9SRUxEQVRFICIpXG4iOworCitNT0RVTEVfQVVUSE9SKCJEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTTUMgODNjMTcwIEVQSUMgc2VyaWVzIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZnVsbF9kdXBsZXgsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRVBJQy8xMDAgZGVidWcgbGV2ZWwgKDAtNSkiKTsKK01PRFVMRV9QQVJNX0RFU0Mob3B0aW9ucywgIkVQSUMvMTAwOiBCaXRzIDAtMzogbWVkaWEgdHlwZSwgYml0IDQ6IGZ1bGwgZHVwbGV4Iik7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X2NvcHlicmVhaywgIkVQSUMvMTAwIGNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7CitNT0RVTEVfUEFSTV9ERVNDKGZ1bGxfZHVwbGV4LCAiRVBJQy8xMDAgZnVsbCBkdXBsZXggc2V0dGluZyhzKSAoMSkiKTsKKworLyoKKwkJCQlUaGVvcnkgb2YgT3BlcmF0aW9uCisKK0kuIEJvYXJkIENvbXBhdGliaWxpdHkKKworVGhpcyBkZXZpY2UgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgU01DICJFUElDLzEwMCIsIHRoZSBTTUMKK3NpbmdsZS1jaGlwIEV0aGVybmV0IGNvbnRyb2xsZXJzIGZvciBQQ0kuICBUaGlzIGNoaXAgaXMgdXNlZCBvbgordGhlIFNNQyBFdGhlclBvd2VyIElJIGJvYXJkcy4KKworSUkuIEJvYXJkLXNwZWNpZmljIHNldHRpbmdzCisKK1BDSSBidXMgZGV2aWNlcyBhcmUgY29uZmlndXJlZCBieSB0aGUgc3lzdGVtIGF0IGJvb3QgdGltZSwgc28gbm8ganVtcGVycworbmVlZCB0byBiZSBzZXQgb24gdGhlIGJvYXJkLiAgVGhlIHN5c3RlbSBCSU9TIHdpbGwgYXNzaWduIHRoZQorUENJIElOVEEgc2lnbmFsIHRvIGEgKHByZWZlcmFibHkgb3RoZXJ3aXNlIHVudXNlZCkgc3lzdGVtIElSUSBsaW5lLgorTm90ZTogS2VybmVsIHZlcnNpb25zIGVhcmxpZXIgdGhhbiAxLjMuNzMgZG8gbm90IHN1cHBvcnQgc2hhcmVkIFBDSQoraW50ZXJydXB0IGxpbmVzLgorCitJSUkuIERyaXZlciBvcGVyYXRpb24KKworSUlJYS4gUmluZyBidWZmZXJzCisKK0lWYi4gUmVmZXJlbmNlcworCitodHRwOi8vd3d3LnNtc2MuY29tL21haW4vZGF0YXNoZWV0cy84M2MxNzEucGRmCitodHRwOi8vd3d3LnNtc2MuY29tL21haW4vZGF0YXNoZWV0cy84M2MxNzUucGRmCitodHRwOi8vc2N5bGQuY29tL2V4cGVydC9OV2F5Lmh0bWwKK2h0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0RQL0RQODM4NDBBLmh0bWwKKworSVZjLiBFcnJhdGEKKworKi8KKworCitlbnVtIHBjaV9pZF9mbGFnc19iaXRzIHsKKyAgICAgICAgLyogU2V0IFBDSSBjb21tYW5kIHJlZ2lzdGVyIGJpdHMgYmVmb3JlIGNhbGxpbmcgcHJvYmUxKCkuICovCisgICAgICAgIFBDSV9VU0VTX0lPPTEsIFBDSV9VU0VTX01FTT0yLCBQQ0lfVVNFU19NQVNURVI9NCwKKyAgICAgICAgLyogUmVhZCBhbmQgbWFwIHRoZSBzaW5nbGUgZm9sbG93aW5nIFBDSSBCQVIuICovCisgICAgICAgIFBDSV9BRERSMD0wPDw0LCBQQ0lfQUREUjE9MTw8NCwgUENJX0FERFIyPTI8PDQsIFBDSV9BRERSMz0zPDw0LAorICAgICAgICBQQ0lfQUREUl82NEJJVFM9MHgxMDAsIFBDSV9OT19BQ1BJX1dBS0U9MHgyMDAsIFBDSV9OT19NSU5fTEFURU5DWT0weDQwMCwKK307CisKK2VudW0gY2hpcF9jYXBhYmlsaXR5X2ZsYWdzIHsgTUlJX1BXUkRXTj0xLCBUWVBFMl9JTlRSPTIsIE5PX01JST00IH07CisKKyNkZWZpbmUgRVBJQ19UT1RBTF9TSVpFIDB4MTAwCisjZGVmaW5lIFVTRV9JT19PUFMgMQorI2lmZGVmIFVTRV9JT19PUFMKKyNkZWZpbmUgRVBJQ19JT1RZUEUgUENJX1VTRVNfTUFTVEVSfFBDSV9VU0VTX0lPfFBDSV9BRERSMAorI2Vsc2UKKyNkZWZpbmUgRVBJQ19JT1RZUEUgUENJX1VTRVNfTUFTVEVSfFBDSV9VU0VTX01FTXxQQ0lfQUREUjEKKyNlbmRpZgorCit0eXBlZGVmIGVudW0geworCVNNU0NfODNDMTcwXzAsCisJU01TQ184M0MxNzAsCisJU01TQ184M0MxNzUsCit9IGNoaXBfdDsKKworCitzdHJ1Y3QgZXBpY19jaGlwX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJZW51bSBwY2lfaWRfZmxhZ3NfYml0cyBwY2lfZmxhZ3M7CisgICAgICAgIGludCBpb19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkZWQgZm9yIEkvTyByZWdpb24gY2hlY2sgb3IgaW9yZW1hcCgpLiAqLworICAgICAgICBpbnQgZHJ2X2ZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRHJpdmVyIHVzZSwgaW50ZW5kZWQgYXMgY2FwYWJpbGl0eSBmbGFncy4gKi8KK307CisKKworLyogaW5kZXhlZCBieSBjaGlwX3QgKi8KK3N0YXRpYyBzdHJ1Y3QgZXBpY19jaGlwX2luZm8gcGNpX2lkX3RibFtdID0geworCXsgIlNNU0MgRVBJQy8xMDAgODNjMTcwIiwKKwkgRVBJQ19JT1RZUEUsIEVQSUNfVE9UQUxfU0laRSwgVFlQRTJfSU5UUiB8IE5PX01JSSB8IE1JSV9QV1JEV04gfSwKKwl7ICJTTVNDIEVQSUMvMTAwIDgzYzE3MCIsCisJIEVQSUNfSU9UWVBFLCBFUElDX1RPVEFMX1NJWkUsIFRZUEUyX0lOVFIgfSwKKwl7ICJTTVNDIEVQSUMvQyA4M2MxNzUiLAorCSBFUElDX0lPVFlQRSwgRVBJQ19UT1RBTF9TSVpFLCBUWVBFMl9JTlRSIHwgTUlJX1BXUkRXTiB9LAorfTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZXBpY19wY2lfdGJsW10gPSB7CisJeyAweDEwQjgsIDB4MDAwNSwgMHgxMDkyLCAweDBBQjQsIDAsIDAsIFNNU0NfODNDMTcwXzAgfSwKKwl7IDB4MTBCOCwgMHgwMDA1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTTVNDXzgzQzE3MCB9LAorCXsgMHgxMEI4LCAweDAwMDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJICBQQ0lfQ0xBU1NfTkVUV09SS19FVEhFUk5FVCA8PCA4LCAweGZmZmYwMCwgU01TQ184M0MxNzUgfSwKKwl7IDAsfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgZXBpY19wY2lfdGJsKTsKKworCQorI2lmbmRlZiBVU0VfSU9fT1BTCisjdW5kZWYgaW5iCisjdW5kZWYgaW53CisjdW5kZWYgaW5sCisjdW5kZWYgb3V0YgorI3VuZGVmIG91dHcKKyN1bmRlZiBvdXRsCisjZGVmaW5lIGluYiByZWFkYgorI2RlZmluZSBpbncgcmVhZHcKKyNkZWZpbmUgaW5sIHJlYWRsCisjZGVmaW5lIG91dGIgd3JpdGViCisjZGVmaW5lIG91dHcgd3JpdGV3CisjZGVmaW5lIG91dGwgd3JpdGVsCisjZW5kaWYKKworLyogT2Zmc2V0cyB0byByZWdpc3RlcnMsIHVzaW5nIHRoZSAodWdoKSBTTUMgbmFtZXMuICovCitlbnVtIGVwaWNfcmVnaXN0ZXJzIHsKKyAgQ09NTUFORD0wLCBJTlRTVEFUPTQsIElOVE1BU0s9OCwgR0VOQ1RMPTB4MEMsIE5WQ1RMPTB4MTAsIEVFQ1RMPTB4MTQsCisgIFBDSUJ1cnN0Q250PTB4MTgsCisgIFRFU1QxPTB4MUMsIENSQ0NOVD0weDIwLCBBTElDTlQ9MHgyNCwgTVBDTlQ9MHgyOCwJLyogUnggZXJyb3IgY291bnRlcnMuICovCisgIE1JSUN0cmw9MHgzMCwgTUlJRGF0YT0weDM0LCBNSUlDZmc9MHgzOCwKKyAgTEFOMD02NCwJCQkJCQkvKiBNQUMgYWRkcmVzcy4gKi8KKyAgTUMwPTgwLAkJCQkJCS8qIE11bHRpY2FzdCBmaWx0ZXIgdGFibGUuICovCisgIFJ4Q3RybD05NiwgVHhDdHJsPTExMiwgVHhTVEFUPTB4NzQsCisgIFBSeENEQVI9MHg4NCwgUnhTVEFUPTB4QTQsIEVhcmx5Ung9MHhCMCwgUFR4Q0RBUj0weEM0LCBUeFRocmVzaD0weERDLAorfTsKKworLyogSW50ZXJydXB0IHJlZ2lzdGVyIGJpdHMsIHVzaW5nIG15IG93biBtZWFuaW5nZnVsIG5hbWVzLiAqLworZW51bSBJbnRyU3RhdHVzIHsKKwlUeElkbGU9MHg0MDAwMCwgUnhJZGxlPTB4MjAwMDAsIEludHJTdW1tYXJ5PTB4MDEwMDAwLAorCVBDSUJ1c0VycjE3MD0weDcwMDAsIFBDSUJ1c0VycjE3NT0weDEwMDAsIFBoeUV2ZW50MTc1PTB4ODAwMCwKKwlSeFN0YXJ0ZWQ9MHgwODAwLCBSeEVhcmx5V2Fybj0weDA0MDAsIENudEZ1bGw9MHgwMjAwLCBUeFVuZGVycnVuPTB4MDEwMCwKKwlUeEVtcHR5PTB4MDA4MCwgVHhEb25lPTB4MDAyMCwgUnhFcnJvcj0weDAwMTAsCisJUnhPdmVyZmxvdz0weDAwMDgsIFJ4RnVsbD0weDAwMDQsIFJ4SGVhZGVyPTB4MDAwMiwgUnhEb25lPTB4MDAwMSwKK307CitlbnVtIENvbW1hbmRCaXRzIHsKKwlTdG9wUng9MSwgU3RhcnRSeD0yLCBUeFF1ZXVlZD00LCBSeFF1ZXVlZD04LAorCVN0b3BUeERNQT0weDIwLCBTdG9wUnhETUE9MHg0MCwgUmVzdGFydFR4PTB4ODAsCit9OworCisjZGVmaW5lIEVwaWNSZW1vdmVkCTB4ZmZmZmZmZmYJLyogQ2hpcCBmYWlsZWQgb3IgcmVtb3ZlZCAoQ2FyZEJ1cykgKi8KKworI2RlZmluZSBFcGljTmFwaUV2ZW50CShUeEVtcHR5IHwgVHhEb25lIHwgXAorCQkJIFJ4RG9uZSB8IFJ4U3RhcnRlZCB8IFJ4RWFybHlXYXJuIHwgUnhPdmVyZmxvdyB8IFJ4RnVsbCkKKyNkZWZpbmUgRXBpY05vcm1hbEV2ZW50CSgweDAwMDBmZmZmICYgfkVwaWNOYXBpRXZlbnQpCisKK3N0YXRpYyB1MTYgbWVkaWEybWlpY3RsWzE2XSA9IHsKKwkwLCAweDBDMDAsIDB4MEMwMCwgMHgyMDAwLCAgMHgwMTAwLCAweDIxMDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAgfTsKKworLyogVGhlIEVQSUMxMDAgUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KKworc3RydWN0IGVwaWNfdHhfZGVzYyB7CisJdTMyIHR4c3RhdHVzOworCXUzMiBidWZhZGRyOworCXUzMiBidWZsZW5ndGg7CisJdTMyIG5leHQ7Cit9OworCitzdHJ1Y3QgZXBpY19yeF9kZXNjIHsKKwl1MzIgcnhzdGF0dXM7CisJdTMyIGJ1ZmFkZHI7CisJdTMyIGJ1Zmxlbmd0aDsKKwl1MzIgbmV4dDsKK307CisKK2VudW0gZGVzY19zdGF0dXNfYml0cyB7CisJRGVzY093bj0weDgwMDAsCit9OworCisjZGVmaW5lIFBSSVZfQUxJR04JMTUgCS8qIFJlcXVpcmVkIGFsaWdubWVudCBtYXNrICovCitzdHJ1Y3QgZXBpY19wcml2YXRlIHsKKwlzdHJ1Y3QgZXBpY19yeF9kZXNjICpyeF9yaW5nOworCXN0cnVjdCBlcGljX3R4X2Rlc2MgKnR4X3Jpbmc7CisJLyogVGhlIHNhdmVkIGFkZHJlc3Mgb2YgYSBzZW50LWluLXBsYWNlIHBhY2tldC9idWZmZXIsIGZvciBza2ZyZWUoKS4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiogdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisJLyogVGhlIGFkZHJlc3NlcyBvZiByZWNlaXZlLWluLXBsYWNlIHNrYnVmZnMuICovCisJc3RydWN0IHNrX2J1ZmYqIHJ4X3NrYnVmZltSWF9SSU5HX1NJWkVdOworCisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKwlkbWFfYWRkcl90IHJ4X3JpbmdfZG1hOworCisJLyogUmluZyBwb2ludGVycy4gKi8KKwlzcGlubG9ja190IGxvY2s7CQkJCS8qIEdyb3VwIHdpdGggVHggY29udHJvbCBjYWNoZSBsaW5lLiAqLworCXNwaW5sb2NrX3QgbmFwaV9sb2NrOworCXVuc2lnbmVkIGludCByZXNjaGVkdWxlX2luX3BvbGw7CisJdW5zaWduZWQgaW50IGN1cl90eCwgZGlydHlfdHg7CisKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCBkaXJ0eV9yeDsKKwl1MzIgaXJxX21hc2s7CisJdW5zaWduZWQgaW50IHJ4X2J1Zl9zejsJCQkJLyogQmFzZWQgb24gTVRVK3NsYWNrLiAqLworCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CQkJLyogUENJIGJ1cyBsb2NhdGlvbi4gKi8KKwlpbnQgY2hpcF9pZCwgY2hpcF9mbGFnczsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkJCS8qIE1lZGlhIHNlbGVjdGlvbiB0aW1lci4gKi8KKwlpbnQgdHhfdGhyZXNob2xkOworCXVuc2lnbmVkIGNoYXIgbWNfZmlsdGVyWzhdOworCXNpZ25lZCBjaGFyIHBoeXNbNF07CQkJCS8qIE1JSSBkZXZpY2UgYWRkcmVzc2VzLiAqLworCXUxNiBhZHZlcnRpc2luZzsJCQkJCS8qIE5XYXkgbWVkaWEgYWR2ZXJ0aXNlbWVudCAqLworCWludCBtaWlfcGh5X2NudDsKKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpOworCXVuc2lnbmVkIGludCB0eF9mdWxsOjE7CQkJCS8qIFRoZSBUeCBxdWV1ZSBpcyBmdWxsLiAqLworCXVuc2lnbmVkIGludCBkZWZhdWx0X3BvcnQ6NDsJCS8qIExhc3QgZGV2LT5pZl9wb3J0IHZhbHVlLiAqLworfTsKKworc3RhdGljIGludCBlcGljX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKGxvbmcgaW9hZGRyLCBpbnQgbG9jYXRpb24pOworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvYywgaW50IHZhbCk7CitzdGF0aWMgdm9pZCBlcGljX3Jlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlcGljX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBlcGljX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlcGljX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZXBpY19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlcGljX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWRnZXQpOworc3RhdGljIGludCBlcGljX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpOworc3RhdGljIGlycXJldHVybl90IGVwaWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBuZXRkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKK3N0YXRpYyBpbnQgZXBpY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZXBpY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworDAorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlcGljX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdGF0aWMgaW50IGNhcmRfaWR4ID0gLTE7CisJbG9uZyBpb2FkZHI7CisJaW50IGNoaXBfaWR4ID0gKGludCkgZW50LT5kcml2ZXJfZGF0YTsKKwlpbnQgaXJxOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXA7CisJaW50IGksIHJldCwgb3B0aW9uID0gMCwgZHVwbGV4ID0gMDsKKwl2b2lkICpyaW5nX3NwYWNlOworCWRtYV9hZGRyX3QgcmluZ19kbWE7CisKKy8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayAoS0VSTl9JTkZPICIlcyIgS0VSTl9JTkZPICIlcyIgS0VSTl9JTkZPICIlcyIsCisJCQl2ZXJzaW9uLCB2ZXJzaW9uMiwgdmVyc2lvbjMpOworI2VuZGlmCisJCisJY2FyZF9pZHgrKzsKKwkKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlpcnEgPSBwZGV2LT5pcnE7CisKKwlpZiAocGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSA8IHBjaV9pZF90YmxbY2hpcF9pZHhdLmlvX3NpemUpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiY2FyZCAlZDogbm8gUENJIHJlZ2lvbiBzcGFjZVxuIiwgY2FyZF9pZHgpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwl9CisJCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisKKwlyZXQgPSAtRU5PTUVNOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mICgqZXApKTsKKwlpZiAoIWRldikgeworCQlwcmludGsgKEtFUk5fRVJSICJjYXJkICVkOiBubyBtZW1vcnkgZm9yIGV0aCBkZXZpY2VcbiIsIGNhcmRfaWR4KTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworI2lmZGVmIFVTRV9JT19PUFMKKwlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDApOworI2Vsc2UKKwlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDEpOworCWlvYWRkciA9IChsb25nKSBpb3JlbWFwIChpb2FkZHIsIHBjaV9yZXNvdXJjZV9sZW4gKHBkZXYsIDEpKTsKKwlpZiAoIWlvYWRkcikgeworCQlwcmludGsgKEtFUk5fRVJSIERSVl9OQU1FICIgJWQ6IGlvcmVtYXAgZmFpbGVkXG4iLCBjYXJkX2lkeCk7CisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKwl9CisjZW5kaWYKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCWVwID0gZGV2LT5wcml2OworCWVwLT5taWkuZGV2ID0gZGV2OworCWVwLT5taWkubWRpb19yZWFkID0gbWRpb19yZWFkOworCWVwLT5taWkubWRpb193cml0ZSA9IG1kaW9fd3JpdGU7CisJZXAtPm1paS5waHlfaWRfbWFzayA9IDB4MWY7CisJZXAtPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOworCisJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CisJaWYgKCFyaW5nX3NwYWNlKQorCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwllcC0+dHhfcmluZyA9IChzdHJ1Y3QgZXBpY190eF9kZXNjICopcmluZ19zcGFjZTsKKwllcC0+dHhfcmluZ19kbWEgPSByaW5nX2RtYTsKKworCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCAmcmluZ19kbWEpOworCWlmICghcmluZ19zcGFjZSkKKwkJZ290byBlcnJfb3V0X3VubWFwX3R4OworCWVwLT5yeF9yaW5nID0gKHN0cnVjdCBlcGljX3J4X2Rlc2MgKilyaW5nX3NwYWNlOworCWVwLT5yeF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJaWYgKGRldi0+bWVtX3N0YXJ0KSB7CisJCW9wdGlvbiA9IGRldi0+bWVtX3N0YXJ0OworCQlkdXBsZXggPSAoZGV2LT5tZW1fc3RhcnQgJiAxNikgPyAxIDogMDsKKwl9IGVsc2UgaWYgKGNhcmRfaWR4ID49IDAgICYmICBjYXJkX2lkeCA8IE1BWF9VTklUUykgeworCQlpZiAob3B0aW9uc1tjYXJkX2lkeF0gPj0gMCkKKwkJCW9wdGlvbiA9IG9wdGlvbnNbY2FyZF9pZHhdOworCQlpZiAoZnVsbF9kdXBsZXhbY2FyZF9pZHhdID49IDApCisJCQlkdXBsZXggPSBmdWxsX2R1cGxleFtjYXJkX2lkeF07CisJfQorCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisKKwlzcGluX2xvY2tfaW5pdCgmZXAtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZlcC0+bmFwaV9sb2NrKTsKKwllcC0+cmVzY2hlZHVsZV9pbl9wb2xsID0gMDsKKworCS8qIEJyaW5nIHRoZSBjaGlwIG91dCBvZiBsb3ctcG93ZXIgbW9kZS4gKi8KKwlvdXRsKDB4NDIwMCwgaW9hZGRyICsgR0VOQ1RMKTsKKwkvKiBNYWdpYz8hICBJZiB3ZSBkb24ndCBzZXQgdGhpcyBiaXQgdGhlIE1JSSBpbnRlcmZhY2Ugd29uJ3Qgd29yay4gKi8KKwkvKiBUaGlzIG1hZ2ljIGlzIGRvY3VtZW50ZWQgaW4gU01TQyBhcHAgbm90ZSA3LjE1ICovCisJZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pCisJCW91dGwoMHgwMDA4LCBpb2FkZHIgKyBURVNUMSk7CisKKwkvKiBUdXJuIG9uIHRoZSBNSUkgdHJhbnNjZWl2ZXIuICovCisJb3V0bCgweDEyLCBpb2FkZHIgKyBNSUlDZmcpOworCWlmIChjaGlwX2lkeCA9PSAxKQorCQlvdXRsKChpbmwoaW9hZGRyICsgTlZDVEwpICYgfjB4MDAzQykgfCAweDQ4MDAsIGlvYWRkciArIE5WQ1RMKTsKKwlvdXRsKDB4MDIwMCwgaW9hZGRyICsgR0VOQ1RMKTsKKworCS8qIE5vdGU6IHRoZSAnMTc1IGRvZXMgbm90IGhhdmUgYSBzZXJpYWwgRUVQUk9NLiAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCSgodTE2ICopZGV2LT5kZXZfYWRkcilbaV0gPSBsZTE2X3RvX2NwdShpbncoaW9hZGRyICsgTEFOMCArIGkqNCkpOworCisJaWYgKGRlYnVnID4gMikgeworCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiKCVzKTogRUVQUk9NIGNvbnRlbnRzXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKwkJCXByaW50aygiICU0LjR4JXMiLCByZWFkX2VlcHJvbShpb2FkZHIsIGkpLAorCQkJCSAgIGkgJSAxNiA9PSAxNSA/ICJcbiIgOiAiIik7CisJfQorCisJZXAtPnBjaV9kZXYgPSBwZGV2OworCWVwLT5jaGlwX2lkID0gY2hpcF9pZHg7CisJZXAtPmNoaXBfZmxhZ3MgPSBwY2lfaWRfdGJsW2NoaXBfaWR4XS5kcnZfZmxhZ3M7CisJZXAtPmlycV9tYXNrID0gCisJCShlcC0+Y2hpcF9mbGFncyAmIFRZUEUyX0lOVFIgPyAgUENJQnVzRXJyMTc1IDogUENJQnVzRXJyMTcwKQorCQkgfCBDbnRGdWxsIHwgVHhVbmRlcnJ1biB8IEVwaWNOYXBpRXZlbnQ7CisKKwkvKiBGaW5kIHRoZSBjb25uZWN0ZWQgTUlJIHhjdnJzLgorCSAgIERvaW5nIHRoaXMgaW4gb3BlbigpIHdvdWxkIGFsbG93IGRldGVjdGluZyBleHRlcm5hbCB4Y3ZycyBsYXRlciwgYnV0CisJICAgdGFrZXMgbXVjaCB0aW1lIGFuZCBubyBjYXJkcyBoYXZlIGV4dGVybmFsIE1JSS4gKi8KKwl7CisJCWludCBwaHksIHBoeV9pZHggPSAwOworCQlmb3IgKHBoeSA9IDE7IHBoeSA8IDMyICYmIHBoeV9pZHggPCBzaXplb2YoZXAtPnBoeXMpOyBwaHkrKykgeworCQkJaW50IG1paV9zdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9CTVNSKTsKKwkJCWlmIChtaWlfc3RhdHVzICE9IDB4ZmZmZiAgJiYgIG1paV9zdGF0dXMgIT0gMHgwMDAwKSB7CisJCQkJZXAtPnBoeXNbcGh5X2lkeCsrXSA9IHBoeTsKKwkJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICIoJXMpOiBNSUkgdHJhbnNjZWl2ZXIgIyVkIGNvbnRyb2wgIgorCQkJCQkgICAiJTQuNHggc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkJICAgcGNpX25hbWUocGRldiksIHBoeSwgbWRpb19yZWFkKGRldiwgcGh5LCAwKSwgbWlpX3N0YXR1cyk7CisJCQl9CisJCX0KKwkJZXAtPm1paV9waHlfY250ID0gcGh5X2lkeDsKKwkJaWYgKHBoeV9pZHggIT0gMCkgeworCQkJcGh5ID0gZXAtPnBoeXNbMF07CisJCQllcC0+bWlpLmFkdmVydGlzaW5nID0gbWRpb19yZWFkKGRldiwgcGh5LCBNSUlfQURWRVJUSVNFKTsKKwkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUgIiglcyk6IEF1dG9uZWdvdGlhdGlvbiBhZHZlcnRpc2luZyAlNC40eCBsaW5rICIKKwkJCQkgICAicGFydG5lciAlNC40eC5cbiIsCisJCQkJICAgcGNpX25hbWUocGRldiksIGVwLT5taWkuYWR2ZXJ0aXNpbmcsIG1kaW9fcmVhZChkZXYsIHBoeSwgNSkpOworCQl9IGVsc2UgaWYgKCAhIChlcC0+Y2hpcF9mbGFncyAmIE5PX01JSSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIiglcyk6ICoqKldBUk5JTkcqKio6IE5vIE1JSSB0cmFuc2NlaXZlciBmb3VuZCFcbiIsCisJCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQkJLyogVXNlIHRoZSBrbm93biBQSFkgYWRkcmVzcyBvZiB0aGUgRVBJSS4gKi8KKwkJCWVwLT5waHlzWzBdID0gMzsKKwkJfQorCQllcC0+bWlpLnBoeV9pZCA9IGVwLT5waHlzWzBdOworCX0KKworCS8qIFR1cm4gb2ZmIHRoZSBNSUkgeGN2ciAoMTc1IG9ubHkhKSwgbGVhdmUgdGhlIGNoaXAgaW4gbG93LXBvd2VyIG1vZGUuICovCisJaWYgKGVwLT5jaGlwX2ZsYWdzICYgTUlJX1BXUkRXTikKKwkJb3V0bChpbmwoaW9hZGRyICsgTlZDVEwpICYgfjB4NDgzQywgaW9hZGRyICsgTlZDVEwpOworCW91dGwoMHgwMDA4LCBpb2FkZHIgKyBHRU5DVEwpOworCisJLyogVGhlIGxvd2VyIGZvdXIgYml0cyBhcmUgdGhlIG1lZGlhIHR5cGUuICovCisJaWYgKGR1cGxleCkgeworCQllcC0+bWlpLmZvcmNlX21lZGlhID0gZXAtPm1paS5mdWxsX2R1cGxleCA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUgIiglcyk6ICBGb3JjZWQgZnVsbCBkdXBsZXggb3BlcmF0aW9uIHJlcXVlc3RlZC5cbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJfQorCWRldi0+aWZfcG9ydCA9IGVwLT5kZWZhdWx0X3BvcnQgPSBvcHRpb247CisKKwkvKiBUaGUgRXBpYy1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZlcGljX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZXBpY19zdGFydF94bWl0OworCWRldi0+c3RvcCA9ICZlcGljX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJmVwaWNfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOworCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOworCWRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCWRldi0+dHhfdGltZW91dCA9ICZlcGljX3R4X3RpbWVvdXQ7CisJZGV2LT5wb2xsID0gZXBpY19wb2xsOworCWRldi0+d2VpZ2h0ID0gNjQ7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfb3V0X3VubWFwX3J4OworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0ICUjbHgsIElSUSAlZCwgIiwKKwkJICAgZGV2LT5uYW1lLCBwY2lfaWRfdGJsW2NoaXBfaWR4XS5uYW1lLCBpb2FkZHIsIGRldi0+aXJxKTsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlwcmludGsoIiUyLjJ4OiIsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiJTIuMnguXG4iLCBkZXYtPmRldl9hZGRyW2ldKTsKKworb3V0OgorCXJldHVybiByZXQ7CisKK2Vycl9vdXRfdW5tYXBfcng6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCBlcC0+cnhfcmluZywgZXAtPnJ4X3JpbmdfZG1hKTsKK2Vycl9vdXRfdW5tYXBfdHg6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCBlcC0+dHhfcmluZywgZXAtPnR4X3JpbmdfZG1hKTsKK2Vycl9vdXRfaW91bm1hcDoKKyNpZm5kZWYgVVNFX0lPX09QUworCWlvdW5tYXAoaW9hZGRyKTsKK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisjZW5kaWYKKwlmcmVlX25ldGRldihkZXYpOworZXJyX291dF9mcmVlX3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlnb3RvIG91dDsKK30KKwwKKy8qIFNlcmlhbCBFRVBST00gc2VjdGlvbi4gKi8KKworLyogIEVFUFJPTV9DdHJsIGJpdHMuICovCisjZGVmaW5lIEVFX1NISUZUX0NMSwkweDA0CS8qIEVFUFJPTSBzaGlmdCBjbG9jay4gKi8KKyNkZWZpbmUgRUVfQ1MJCQkweDAyCS8qIEVFUFJPTSBjaGlwIHNlbGVjdC4gKi8KKyNkZWZpbmUgRUVfREFUQV9XUklURQkweDA4CS8qIEVFUFJPTSBjaGlwIGRhdGEgaW4uICovCisjZGVmaW5lIEVFX1dSSVRFXzAJCTB4MDEKKyNkZWZpbmUgRUVfV1JJVEVfMQkJMHgwOQorI2RlZmluZSBFRV9EQVRBX1JFQUQJMHgxMAkvKiBFRVBST00gY2hpcCBkYXRhIG91dC4gKi8KKyNkZWZpbmUgRUVfRU5CCQkJKDB4MDAwMSB8IEVFX0NTKQorCisvKiBEZWxheSBiZXR3ZWVuIEVFUFJPTSBjbG9jayB0cmFuc2l0aW9ucy4KKyAgIFRoaXMgc2VydmVzIHRvIGZsdXNoIHRoZSBvcGVyYXRpb24gdG8gdGhlIFBDSSBidXMuCisgKi8KKworI2RlZmluZSBlZXByb21fZGVsYXkoKQlpbmwoZWVfYWRkcikKKworLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCisjZGVmaW5lIEVFX1dSSVRFX0NNRAkoNSA8PCA2KQorI2RlZmluZSBFRV9SRUFENjRfQ01ECSg2IDw8IDYpCisjZGVmaW5lIEVFX1JFQUQyNTZfQ01ECSg2IDw8IDgpCisjZGVmaW5lIEVFX0VSQVNFX0NNRAkoNyA8PCA2KQorCitzdGF0aWMgdm9pZCBlcGljX2Rpc2FibGVfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlcGljX3ByaXZhdGUgKmVwKQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlvdXRsKDB4MDAwMDAwMDAsIGlvYWRkciArIElOVE1BU0spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19lcGljX3BjaV9jb21taXQobG9uZyBpb2FkZHIpCit7CisjaWZuZGVmIFVTRV9JT19PUFMKKwlpbmwoaW9hZGRyICsgSU5UTUFTSyk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVwaWNfbmFwaV9pcnFfb2ZmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZXBpY19wcml2YXRlICplcCkKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJb3V0bChlcC0+aXJxX21hc2sgJiB+RXBpY05hcGlFdmVudCwgaW9hZGRyICsgSU5UTUFTSyk7CisJX19lcGljX3BjaV9jb21taXQoaW9hZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVwaWNfbmFwaV9pcnFfb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXApCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8qIE5vIG5lZWQgdG8gY29tbWl0IHBvc3NpYmxlIHBvc3RlZCB3cml0ZSAqLworCW91dGwoZXAtPmlycV9tYXNrIHwgRXBpY05hcGlFdmVudCwgaW9hZGRyICsgSU5UTUFTSyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJlYWRfZWVwcm9tKGxvbmcgaW9hZGRyLCBpbnQgbG9jYXRpb24pCit7CisJaW50IGk7CisJaW50IHJldHZhbCA9IDA7CisJbG9uZyBlZV9hZGRyID0gaW9hZGRyICsgRUVDVEw7CisJaW50IHJlYWRfY21kID0gbG9jYXRpb24gfAorCQkoaW5sKGVlX2FkZHIpICYgMHg0MCA/IEVFX1JFQUQ2NF9DTUQgOiBFRV9SRUFEMjU2X0NNRCk7CisKKwlvdXRsKEVFX0VOQiAmIH5FRV9DUywgZWVfYWRkcik7CisJb3V0bChFRV9FTkIsIGVlX2FkZHIpOworCisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAxMjsgaSA+PSAwOyBpLS0pIHsKKwkJc2hvcnQgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFX1dSSVRFXzEgOiBFRV9XUklURV8wOworCQlvdXRsKEVFX0VOQiB8IGRhdGF2YWwsIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoKTsKKwkJb3V0bChFRV9FTkIgfCBkYXRhdmFsIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJfQorCW91dGwoRUVfRU5CLCBlZV9hZGRyKTsKKworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCW91dGwoRUVfRU5CIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlubChlZV9hZGRyKSAmIEVFX0RBVEFfUkVBRCkgPyAxIDogMCk7CisJCW91dGwoRUVfRU5CLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJfQorCisJLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworCW91dGwoRUVfRU5CICYgfkVFX0NTLCBlZV9hZGRyKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIE1JSV9SRUFET1AJCTEKKyNkZWZpbmUgTUlJX1dSSVRFT1AJCTIKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCByZWFkX2NtZCA9IChwaHlfaWQgPDwgOSkgfCAobG9jYXRpb24gPDwgNCkgfCBNSUlfUkVBRE9QOworCWludCBpOworCisJb3V0bChyZWFkX2NtZCwgaW9hZGRyICsgTUlJQ3RybCk7CisJLyogVHlwaWNhbCBvcGVyYXRpb24gdGFrZXMgMjUgbG9vcHMuICovCisJZm9yIChpID0gNDAwOyBpID4gMDsgaS0tKSB7CisJCWJhcnJpZXIoKTsKKwkJaWYgKChpbmwoaW9hZGRyICsgTUlJQ3RybCkgJiBNSUlfUkVBRE9QKSA9PSAwKSB7CisJCQkvKiBXb3JrIGFyb3VuZCByZWFkIGZhaWx1cmUgYnVnLiAqLworCQkJaWYgKHBoeV9pZCA9PSAxICYmIGxvY2F0aW9uIDwgNgorCQkJCSYmIGludyhpb2FkZHIgKyBNSUlEYXRhKSA9PSAweGZmZmYpIHsKKwkJCQlvdXRsKHJlYWRfY21kLCBpb2FkZHIgKyBNSUlDdHJsKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJldHVybiBpbncoaW9hZGRyICsgTUlJRGF0YSk7CisJCX0KKwl9CisJcmV0dXJuIDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jLCBpbnQgdmFsdWUpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaTsKKworCW91dHcodmFsdWUsIGlvYWRkciArIE1JSURhdGEpOworCW91dGwoKHBoeV9pZCA8PCA5KSB8IChsb2MgPDwgNCkgfCBNSUlfV1JJVEVPUCwgaW9hZGRyICsgTUlJQ3RybCk7CisJZm9yIChpID0gMTAwMDA7IGkgPiAwOyBpLS0pIHsgCisJCWJhcnJpZXIoKTsKKwkJaWYgKChpbmwoaW9hZGRyICsgTUlJQ3RybCkgJiBNSUlfV1JJVEVPUCkgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CisKKwwKK3N0YXRpYyBpbnQgZXBpY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXAgPSBkZXYtPnByaXY7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaTsKKwlpbnQgcmV0dmFsOworCisJLyogU29mdCByZXNldCB0aGUgY2hpcC4gKi8KKwlvdXRsKDB4NDAwMSwgaW9hZGRyICsgR0VOQ1RMKTsKKworCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZlcGljX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSkpCisJCXJldHVybiByZXR2YWw7CisKKwllcGljX2luaXRfcmluZyhkZXYpOworCisJb3V0bCgweDQwMDAsIGlvYWRkciArIEdFTkNUTCk7CisJLyogVGhpcyBtYWdpYyBpcyBkb2N1bWVudGVkIGluIFNNU0MgYXBwIG5vdGUgNy4xNSAqLworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKQorCQlvdXRsKDB4MDAwOCwgaW9hZGRyICsgVEVTVDEpOworCisJLyogUHVsbCB0aGUgY2hpcCBvdXQgb2YgbG93LXBvd2VyIG1vZGUsIGVuYWJsZSBpbnRlcnJ1cHRzLCBhbmQgc2V0IGZvcgorCSAgIFBDSSByZWFkIG11bHRpcGxlLiAgVGhlIE1JSWNmZyBzZXR0aW5nIGFuZCBzdHJhbmdlIHdyaXRlIG9yZGVyIGFyZQorCSAgIHJlcXVpcmVkIGJ5IHRoZSBkZXRhaWxzIG9mIHdoaWNoIGJpdHMgYXJlIHJlc2V0IGFuZCB0aGUgdHJhbnNjZWl2ZXIKKwkgICB3aXJpbmcgb24gdGhlIE9zaXRlY2ggQ2FyZEJ1cyBjYXJkLgorCSovCisjaWYgMAorCW91dGwoZGV2LT5pZl9wb3J0ID09IDEgPyAweDEzIDogMHgxMiwgaW9hZGRyICsgTUlJQ2ZnKTsKKyNlbmRpZgorCWlmIChlcC0+Y2hpcF9mbGFncyAmIE1JSV9QV1JEV04pCisJCW91dGwoKGlubChpb2FkZHIgKyBOVkNUTCkgJiB+MHgwMDNDKSB8IDB4NDgwMCwgaW9hZGRyICsgTlZDVEwpOworCisjaWYgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX3NwYXJjX18pCQkvKiBCaWcgZW5kaWFuICovCisJb3V0bCgweDQ0MzIgfCAoUlhfRklGT19USFJFU0g8PDgpLCBpb2FkZHIgKyBHRU5DVEwpOworCWlubChpb2FkZHIgKyBHRU5DVEwpOworCW91dGwoMHgwNDMyIHwgKFJYX0ZJRk9fVEhSRVNIPDw4KSwgaW9hZGRyICsgR0VOQ1RMKTsKKyNlbHNlCisJb3V0bCgweDQ0MTIgfCAoUlhfRklGT19USFJFU0g8PDgpLCBpb2FkZHIgKyBHRU5DVEwpOworCWlubChpb2FkZHIgKyBHRU5DVEwpOworCW91dGwoMHgwNDEyIHwgKFJYX0ZJRk9fVEhSRVNIPDw4KSwgaW9hZGRyICsgR0VOQ1RMKTsKKyNlbmRpZgorCisJdWRlbGF5KDIwKTsgLyogTG9va3MgbGlrZSBFUElJIG5lZWRzIHRoYXQgaWYgeW91IHdhbnQgcmVsaWFibGUgUlggaW5pdC4gRklYTUU6IHBjaSBwb3N0aW5nIGJ1Zz8gKi8KKwkKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlvdXRsKGNwdV90b19sZTE2KCgodTE2KilkZXYtPmRldl9hZGRyKVtpXSksIGlvYWRkciArIExBTjAgKyBpKjQpOworCisJZXAtPnR4X3RocmVzaG9sZCA9IFRYX0ZJRk9fVEhSRVNIOworCW91dGwoZXAtPnR4X3RocmVzaG9sZCwgaW9hZGRyICsgVHhUaHJlc2gpOworCisJaWYgKG1lZGlhMm1paWN0bFtkZXYtPmlmX3BvcnQgJiAxNV0pIHsKKwkJaWYgKGVwLT5taWlfcGh5X2NudCkKKwkJCW1kaW9fd3JpdGUoZGV2LCBlcC0+cGh5c1swXSwgTUlJX0JNQ1IsIG1lZGlhMm1paWN0bFtkZXYtPmlmX3BvcnQmMTVdKTsKKwkJaWYgKGRldi0+aWZfcG9ydCA9PSAxKSB7CisJCQlpZiAoZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVc2luZyB0aGUgMTBiYXNlMiB0cmFuc2NlaXZlciwgTUlJICIKKwkJCQkJICAgInN0YXR1cyAlNC40eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgbWRpb19yZWFkKGRldiwgZXAtPnBoeXNbMF0sIE1JSV9CTVNSKSk7CisJCX0KKwl9IGVsc2UgeworCQlpbnQgbWlpX2xwYSA9IG1kaW9fcmVhZChkZXYsIGVwLT5waHlzWzBdLCBNSUlfTFBBKTsKKwkJaWYgKG1paV9scGEgIT0gMHhmZmZmKSB7CisJCQlpZiAoKG1paV9scGEgJiBMUEFfMTAwRlVMTCkgfHwgKG1paV9scGEgJiAweDAxQzApID09IExQQV8xMEZVTEwpCisJCQkJZXAtPm1paS5mdWxsX2R1cGxleCA9IDE7CisJCQllbHNlIGlmICghIChtaWlfbHBhICYgTFBBX0xQQUNLKSkKKwkJCQltZGlvX3dyaXRlKGRldiwgZXAtPnBoeXNbMF0sIE1JSV9CTUNSLCBCTUNSX0FORU5BQkxFfEJNQ1JfQU5SRVNUQVJUKTsKKwkJCWlmIChkZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNldHRpbmcgJXMtZHVwbGV4IGJhc2VkIG9uIE1JSSB4Y3ZyICVkIgorCQkJCQkgICAiIHJlZ2lzdGVyIHJlYWQgb2YgJTQuNHguXG4iLCBkZXYtPm5hbWUsCisJCQkJCSAgIGVwLT5taWkuZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIsCisJCQkJCSAgIGVwLT5waHlzWzBdLCBtaWlfbHBhKTsKKwkJfQorCX0KKworCW91dGwoZXAtPm1paS5mdWxsX2R1cGxleCA/IDB4N0YgOiAweDc5LCBpb2FkZHIgKyBUeEN0cmwpOworCW91dGwoZXAtPnJ4X3JpbmdfZG1hLCBpb2FkZHIgKyBQUnhDREFSKTsKKwlvdXRsKGVwLT50eF9yaW5nX2RtYSwgaW9hZGRyICsgUFR4Q0RBUik7CisKKwkvKiBTdGFydCB0aGUgY2hpcCdzIFJ4IHByb2Nlc3MuICovCisJc2V0X3J4X21vZGUoZGV2KTsKKwlvdXRsKFN0YXJ0UnggfCBSeFF1ZXVlZCwgaW9hZGRyICsgQ09NTUFORCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJb3V0bCgoZXAtPmNoaXBfZmxhZ3MgJiBUWVBFMl9JTlRSID8gUENJQnVzRXJyMTc1IDogUENJQnVzRXJyMTcwKQorCQkgfCBDbnRGdWxsIHwgVHhVbmRlcnJ1biAKKwkJIHwgUnhFcnJvciB8IFJ4SGVhZGVyIHwgRXBpY05hcGlFdmVudCwgaW9hZGRyICsgSU5UTUFTSyk7CisKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVwaWNfb3BlbigpIGlvYWRkciAlbHggSVJRICVkIHN0YXR1cyAlNC40eCAiCisJCQkgICAiJXMtZHVwbGV4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9hZGRyLCBkZXYtPmlycSwgKGludClpbmwoaW9hZGRyICsgR0VOQ1RMKSwKKwkJCSAgIGVwLT5taWkuZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIpOworCisJLyogU2V0IHRoZSB0aW1lciB0byBzd2l0Y2ggdG8gY2hlY2sgZm9yIGxpbmsgYmVhdCBhbmQgcGVyaGFwcyBzd2l0Y2gKKwkgICB0byBhbiBhbHRlcm5hdGUgbWVkaWEgdHlwZS4gKi8KKwlpbml0X3RpbWVyKCZlcC0+dGltZXIpOworCWVwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIDMqSFo7CisJZXAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJZXAtPnRpbWVyLmZ1bmN0aW9uID0gJmVwaWNfdGltZXI7CQkJCS8qIHRpbWVyIGhhbmRsZXIgKi8KKwlhZGRfdGltZXIoJmVwLT50aW1lcik7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVzZXQgdGhlIGNoaXAgdG8gcmVjb3ZlciBmcm9tIGEgUENJIHRyYW5zYWN0aW9uIGVycm9yLgorICAgVGhpcyBtYXkgb2NjdXIgYXQgaW50ZXJydXB0IHRpbWUuICovCitzdGF0aWMgdm9pZCBlcGljX3BhdXNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZXBpY19wcml2YXRlICplcCA9IGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlvdXRsKDB4MDAwMDAwMDAsIGlvYWRkciArIElOVE1BU0spOworCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggRE1BIHByb2Nlc3Nlcy4gKi8KKwlvdXR3KFN0b3BSeCB8IFN0b3BUeERNQSB8IFN0b3BSeERNQSwgaW9hZGRyICsgQ09NTUFORCk7CisKKwkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50cy4gKi8KKwlpZiAoaW53KGlvYWRkciArIENPTU1BTkQpICE9IDB4ZmZmZikgeworCQllcC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgTVBDTlQpOworCQllcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGluYihpb2FkZHIgKyBBTElDTlQpOworCQllcC0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgQ1JDQ05UKTsKKwl9CisKKwkvKiBSZW1vdmUgdGhlIHBhY2tldHMgb24gdGhlIFJ4IHF1ZXVlLiAqLworCWVwaWNfcngoZGV2LCBSWF9SSU5HX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBlcGljX3Jlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlcGljX3ByaXZhdGUgKmVwID0gZGV2LT5wcml2OworCWludCBpOworCisJLyogU29mdCByZXNldCB0aGUgY2hpcC4gKi8KKwlvdXRsKDB4NDAwMSwgaW9hZGRyICsgR0VOQ1RMKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVzdGFydGluZyB0aGUgRVBJQyBjaGlwLCBSeCAlZC8lZCBUeCAlZC8lZC5cbiIsCisJCSAgIGRldi0+bmFtZSwgZXAtPmN1cl9yeCwgZXAtPmRpcnR5X3J4LCBlcC0+ZGlydHlfdHgsIGVwLT5jdXJfdHgpOworCXVkZWxheSgxKTsKKworCS8qIFRoaXMgbWFnaWMgaXMgZG9jdW1lbnRlZCBpbiBTTVNDIGFwcCBub3RlIDcuMTUgKi8KKwlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkKKwkJb3V0bCgweDAwMDgsIGlvYWRkciArIFRFU1QxKTsKKworI2lmIGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19zcGFyY19fKQkJLyogQmlnIGVuZGlhbiAqLworCW91dGwoMHgwNDMyIHwgKFJYX0ZJRk9fVEhSRVNIPDw4KSwgaW9hZGRyICsgR0VOQ1RMKTsKKyNlbHNlCisJb3V0bCgweDA0MTIgfCAoUlhfRklGT19USFJFU0g8PDgpLCBpb2FkZHIgKyBHRU5DVEwpOworI2VuZGlmCisJb3V0bChkZXYtPmlmX3BvcnQgPT0gMSA/IDB4MTMgOiAweDEyLCBpb2FkZHIgKyBNSUlDZmcpOworCWlmIChlcC0+Y2hpcF9mbGFncyAmIE1JSV9QV1JEV04pCisJCW91dGwoKGlubChpb2FkZHIgKyBOVkNUTCkgJiB+MHgwMDNDKSB8IDB4NDgwMCwgaW9hZGRyICsgTlZDVEwpOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJb3V0bChjcHVfdG9fbGUxNigoKHUxNiopZGV2LT5kZXZfYWRkcilbaV0pLCBpb2FkZHIgKyBMQU4wICsgaSo0KTsKKworCWVwLT50eF90aHJlc2hvbGQgPSBUWF9GSUZPX1RIUkVTSDsKKwlvdXRsKGVwLT50eF90aHJlc2hvbGQsIGlvYWRkciArIFR4VGhyZXNoKTsKKwlvdXRsKGVwLT5taWkuZnVsbF9kdXBsZXggPyAweDdGIDogMHg3OSwgaW9hZGRyICsgVHhDdHJsKTsKKwlvdXRsKGVwLT5yeF9yaW5nX2RtYSArIChlcC0+Y3VyX3J4JVJYX1JJTkdfU0laRSkqCisJCXNpemVvZihzdHJ1Y3QgZXBpY19yeF9kZXNjKSwgaW9hZGRyICsgUFJ4Q0RBUik7CisJb3V0bChlcC0+dHhfcmluZ19kbWEgKyAoZXAtPmRpcnR5X3R4JVRYX1JJTkdfU0laRSkqCisJCSBzaXplb2Yoc3RydWN0IGVwaWNfdHhfZGVzYyksIGlvYWRkciArIFBUeENEQVIpOworCisJLyogU3RhcnQgdGhlIGNoaXAncyBSeCBwcm9jZXNzLiAqLworCXNldF9yeF9tb2RlKGRldik7CisJb3V0bChTdGFydFJ4IHwgUnhRdWV1ZWQsIGlvYWRkciArIENPTU1BTkQpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJb3V0bCgoZXAtPmNoaXBfZmxhZ3MgJiBUWVBFMl9JTlRSID8gUENJQnVzRXJyMTc1IDogUENJQnVzRXJyMTcwKQorCQkgfCBDbnRGdWxsIHwgVHhVbmRlcnJ1bgorCQkgfCBSeEVycm9yIHwgUnhIZWFkZXIgfCBFcGljTmFwaUV2ZW50LCBpb2FkZHIgKyBJTlRNQVNLKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogZXBpY19yZXN0YXJ0KCkgZG9uZSwgY21kIHN0YXR1cyAlNC40eCwgY3RsICU0LjR4IgorCQkgICAiIGludGVycnVwdCAlNC40eC5cbiIsCisJCSAgIGRldi0+bmFtZSwgKGludClpbmwoaW9hZGRyICsgQ09NTUFORCksIChpbnQpaW5sKGlvYWRkciArIEdFTkNUTCksCisJCSAgIChpbnQpaW5sKGlvYWRkciArIElOVFNUQVQpKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXAgPSBkZXYtPnByaXY7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgbWlpX2xwYSA9IGVwLT5taWlfcGh5X2NudCA/IG1kaW9fcmVhZChkZXYsIGVwLT5waHlzWzBdLCBNSUlfTFBBKSA6IDA7CisJaW50IG5lZ290aWF0ZWQgPSBtaWlfbHBhICYgZXAtPm1paS5hZHZlcnRpc2luZzsKKwlpbnQgZHVwbGV4ID0gKG5lZ290aWF0ZWQgJiAweDAxMDApIHx8IChuZWdvdGlhdGVkICYgMHgwMUMwKSA9PSAweDAwNDA7CisKKwlpZiAoZXAtPm1paS5mb3JjZV9tZWRpYSkKKwkJcmV0dXJuOworCWlmIChtaWlfbHBhID09IDB4ZmZmZikJCS8qIEJvZ3VzIHJlYWQgKi8KKwkJcmV0dXJuOworCWlmIChlcC0+bWlpLmZ1bGxfZHVwbGV4ICE9IGR1cGxleCkgeworCQllcC0+bWlpLmZ1bGxfZHVwbGV4ID0gZHVwbGV4OworCQlwcmludGsoS0VSTl9JTkZPICIlczogU2V0dGluZyAlcy1kdXBsZXggYmFzZWQgb24gTUlJICMlZCBsaW5rIgorCQkJICAgIiBwYXJ0bmVyIGNhcGFiaWxpdHkgb2YgJTQuNHguXG4iLCBkZXYtPm5hbWUsCisJCQkgICBlcC0+bWlpLmZ1bGxfZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiLCBlcC0+cGh5c1swXSwgbWlpX2xwYSk7CisJCW91dGwoZXAtPm1paS5mdWxsX2R1cGxleCA/IDB4N0YgOiAweDc5LCBpb2FkZHIgKyBUeEN0cmwpOworCX0KK30KKworc3RhdGljIHZvaWQgZXBpY190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXAgPSBkZXYtPnByaXY7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgbmV4dF90aWNrID0gNSpIWjsKKworCWlmIChkZWJ1ZyA+IDMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNZWRpYSBtb25pdG9yIHRpY2ssIFR4IHN0YXR1cyAlOC44eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIChpbnQpaW5sKGlvYWRkciArIFR4U1RBVCkpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE90aGVyIHJlZ2lzdGVycyBhcmUgSW50TWFzayAlNC40eCAiCisJCQkgICAiSW50U3RhdHVzICU0LjR4IFJ4U3RhdHVzICU0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgKGludClpbmwoaW9hZGRyICsgSU5UTUFTSyksCisJCQkgICAoaW50KWlubChpb2FkZHIgKyBJTlRTVEFUKSwgKGludClpbmwoaW9hZGRyICsgUnhTVEFUKSk7CisJfQorCisJY2hlY2tfbWVkaWEoZGV2KTsKKworCWVwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG5leHRfdGljazsKKwlhZGRfdGltZXIoJmVwLT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIGVwaWNfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlcGljX3ByaXZhdGUgKmVwID0gZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoZGVidWcgPiAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lb3V0IHVzaW5nIE1JSSBkZXZpY2UsICIKKwkJCSAgICJUeCBzdGF0dXMgJTQuNHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCAoaW50KWludyhpb2FkZHIgKyBUeFNUQVQpKTsKKwkJaWYgKGRlYnVnID4gMSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeCBpbmRpY2VzOiBkaXJ0eV90eCAlZCwgY3VyX3R4ICVkLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGVwLT5kaXJ0eV90eCwgZXAtPmN1cl90eCk7CisJCX0KKwl9CisJaWYgKGludyhpb2FkZHIgKyBUeFNUQVQpICYgMHgxMCkgewkJLyogVHggRklGTyB1bmRlcmZsb3cuICovCisJCWVwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQlvdXRsKFJlc3RhcnRUeCwgaW9hZGRyICsgQ09NTUFORCk7CisJfSBlbHNlIHsKKwkJZXBpY19yZXN0YXJ0KGRldik7CisJCW91dGwoVHhRdWV1ZWQsIGRldi0+YmFzZV9hZGRyICsgQ09NTUFORCk7CisJfQorCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJZXAtPnN0YXRzLnR4X2Vycm9ycysrOworCWlmICghZXAtPnR4X2Z1bGwpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgUnggYW5kIFR4IHJpbmdzLCBhbG9uZyB3aXRoIHZhcmlvdXMgJ2RldicgYml0cy4gKi8KK3N0YXRpYyB2b2lkIGVwaWNfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXAgPSBkZXYtPnByaXY7CisJaW50IGk7CisKKwllcC0+dHhfZnVsbCA9IDA7CisJZXAtPmRpcnR5X3R4ID0gZXAtPmN1cl90eCA9IDA7CisJZXAtPmN1cl9yeCA9IGVwLT5kaXJ0eV9yeCA9IDA7CisJZXAtPnJ4X2J1Zl9zeiA9IChkZXYtPm10dSA8PSAxNTAwID8gUEtUX0JVRl9TWiA6IGRldi0+bXR1ICsgMzIpOworCisJLyogSW5pdGlhbGl6ZSBhbGwgUnggZGVzY3JpcHRvcnMuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCWVwLT5yeF9yaW5nW2ldLnJ4c3RhdHVzID0gMDsKKwkJZXAtPnJ4X3JpbmdbaV0uYnVmbGVuZ3RoID0gY3B1X3RvX2xlMzIoZXAtPnJ4X2J1Zl9zeik7CisJCWVwLT5yeF9yaW5nW2ldLm5leHQgPSBlcC0+cnhfcmluZ19kbWEgKyAKKwkJCQkgICAgICAoaSsxKSpzaXplb2Yoc3RydWN0IGVwaWNfcnhfZGVzYyk7CisJCWVwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCX0KKwkvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IGFzIHdyYXBwaW5nIHRoZSByaW5nLiAqLworCWVwLT5yeF9yaW5nW2ktMV0ubmV4dCA9IGVwLT5yeF9yaW5nX2RtYTsKKworCS8qIEZpbGwgaW4gdGhlIFJ4IGJ1ZmZlcnMuICBIYW5kbGUgYWxsb2NhdGlvbiBmYWlsdXJlIGdyYWNlZnVsbHkuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKGVwLT5yeF9idWZfc3opOworCQllcC0+cnhfc2tidWZmW2ldID0gc2tiOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlicmVhazsKKwkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIuICovCisJCWVwLT5yeF9yaW5nW2ldLmJ1ZmFkZHIgPSBwY2lfbWFwX3NpbmdsZShlcC0+cGNpX2RldiwgCisJCQlza2ItPnRhaWwsIGVwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWVwLT5yeF9yaW5nW2ldLnJ4c3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bik7CisJfQorCWVwLT5kaXJ0eV9yeCA9ICh1bnNpZ25lZCBpbnQpKGkgLSBSWF9SSU5HX1NJWkUpOworCisJLyogVGhlIFR4IGJ1ZmZlciBkZXNjcmlwdG9yIGlzIGZpbGxlZCBpbiBhcyBuZWVkZWQsIGJ1dCB3ZQorCSAgIGRvIG5lZWQgdG8gY2xlYXIgdGhlIG93bmVyc2hpcCBiaXQuICovCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWVwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQllcC0+dHhfcmluZ1tpXS50eHN0YXR1cyA9IDB4MDAwMDsKKwkJZXAtPnR4X3JpbmdbaV0ubmV4dCA9IGVwLT50eF9yaW5nX2RtYSArIAorCQkJKGkrMSkqc2l6ZW9mKHN0cnVjdCBlcGljX3R4X2Rlc2MpOworCX0KKwllcC0+dHhfcmluZ1tpLTFdLm5leHQgPSBlcC0+dHhfcmluZ19kbWE7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGVwaWNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlcGljX3ByaXZhdGUgKmVwID0gZGV2LT5wcml2OworCWludCBlbnRyeSwgZnJlZV9jb3VudDsKKwl1MzIgY3RybF93b3JkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDYXV0aW9uOiB0aGUgd3JpdGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUsIHNldCB0aGUgZmllbGQgd2l0aCB0aGUKKwkgICAib3duZXJzaGlwIiBiaXQgbGFzdC4gKi8KKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZlcC0+bG9jaywgZmxhZ3MpOworCWZyZWVfY291bnQgPSBlcC0+Y3VyX3R4IC0gZXAtPmRpcnR5X3R4OworCWVudHJ5ID0gZXAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworCWVwLT50eF9za2J1ZmZbZW50cnldID0gc2tiOworCWVwLT50eF9yaW5nW2VudHJ5XS5idWZhZGRyID0gcGNpX21hcF9zaW5nbGUoZXAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwgCisJCSAJCQkgICAgICAgICAgICBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKGZyZWVfY291bnQgPCBUWF9RVUVVRV9MRU4vMikgey8qIFR5cGljYWwgcGF0aCAqLworCQljdHJsX3dvcmQgPSBjcHVfdG9fbGUzMigweDEwMDAwMCk7IC8qIE5vIGludGVycnVwdCAqLworCX0gZWxzZSBpZiAoZnJlZV9jb3VudCA9PSBUWF9RVUVVRV9MRU4vMikgeworCQljdHJsX3dvcmQgPSBjcHVfdG9fbGUzMigweDE0MDAwMCk7IC8qIFR4LWRvbmUgaW50ci4gKi8KKwl9IGVsc2UgaWYgKGZyZWVfY291bnQgPCBUWF9RVUVVRV9MRU4gLSAxKSB7CisJCWN0cmxfd29yZCA9IGNwdV90b19sZTMyKDB4MTAwMDAwKTsgLyogTm8gVHgtZG9uZSBpbnRyLiAqLworCX0gZWxzZSB7CisJCS8qIExlYXZlIHJvb20gZm9yIGFuIGFkZGl0aW9uYWwgZW50cnkuICovCisJCWN0cmxfd29yZCA9IGNwdV90b19sZTMyKDB4MTQwMDAwKTsgLyogVHgtZG9uZSBpbnRyLiAqLworCQllcC0+dHhfZnVsbCA9IDE7CisJfQorCWVwLT50eF9yaW5nW2VudHJ5XS5idWZsZW5ndGggPSBjdHJsX3dvcmQgfCBjcHVfdG9fbGUzMihza2ItPmxlbik7CisJZXAtPnR4X3JpbmdbZW50cnldLnR4c3RhdHVzID0KKwkJKChza2ItPmxlbiA+PSBFVEhfWkxFTiA/IHNrYi0+bGVuIDogRVRIX1pMRU4pIDw8IDE2KQorCQl8IGNwdV90b19sZTMyKERlc2NPd24pOworCisJZXAtPmN1cl90eCsrOworCWlmIChlcC0+dHhfZnVsbCkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmxvY2ssIGZsYWdzKTsKKwkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQuICovCisJb3V0bChUeFF1ZXVlZCwgZGV2LT5iYXNlX2FkZHIgKyBDT01NQU5EKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWlmIChkZWJ1ZyA+IDQpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUXVldWVkIFR4IHBhY2tldCBzaXplICVkIHRvIHNsb3QgJWQsICIKKwkJCSAgICJmbGFnICUyLjJ4IFR4IHN0YXR1cyAlOC44eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIChpbnQpc2tiLT5sZW4sIGVudHJ5LCBjdHJsX3dvcmQsCisJCQkgICAoaW50KWlubChkZXYtPmJhc2VfYWRkciArIFR4U1RBVCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVwaWNfdHhfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXAsCisJCQkgIGludCBzdGF0dXMpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmVwLT5zdGF0czsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJLyogVGhlcmUgd2FzIGFuIG1ham9yIGVycm9yLCBsb2cgaXQuICovCisJaWYgKGRlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBlcnJvciwgVHggc3RhdHVzICU4Ljh4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKyNlbmRpZgorCXN0YXRzLT50eF9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgMHgxMDUwKQorCQlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgMHgwMDA4KQorCQlzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgMHgwMDQwKQorCQlzdGF0cy0+dHhfd2luZG93X2Vycm9ycysrOworCWlmIChzdGF0dXMgJiAweDAwMTApCisJCXN0YXRzLT50eF9maWZvX2Vycm9ycysrOworfQorCitzdGF0aWMgdm9pZCBlcGljX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlcGljX3ByaXZhdGUgKmVwKQoreworCXVuc2lnbmVkIGludCBkaXJ0eV90eCwgY3VyX3R4OworCisJLyoKKwkgKiBOb3RlOiBpZiB0aGlzIGxvY2sgYmVjb21lcyBhIHByb2JsZW0gd2UgY2FuIG5hcnJvdyB0aGUgbG9ja2VkCisJICogcmVnaW9uIGF0IHRoZSBjb3N0IG9mIG9jY2FzaW9uYWxseSBncmFiYmluZyB0aGUgbG9jayBtb3JlIHRpbWVzLgorCSAqLworCWN1cl90eCA9IGVwLT5jdXJfdHg7CisJZm9yIChkaXJ0eV90eCA9IGVwLT5kaXJ0eV90eDsgY3VyX3R4IC0gZGlydHlfdHggPiAwOyBkaXJ0eV90eCsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWludCBlbnRyeSA9IGRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQlpbnQgdHhzdGF0dXMgPSBsZTMyX3RvX2NwdShlcC0+dHhfcmluZ1tlbnRyeV0udHhzdGF0dXMpOworCisJCWlmICh0eHN0YXR1cyAmIERlc2NPd24pCisJCQlicmVhazsJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gVHhlZCAqLworCisJCWlmIChsaWtlbHkodHhzdGF0dXMgJiAweDAwMDEpKSB7CisJCQllcC0+c3RhdHMuY29sbGlzaW9ucyArPSAodHhzdGF0dXMgPj4gOCkgJiAxNTsKKwkJCWVwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQllcC0+c3RhdHMudHhfYnl0ZXMgKz0gZXAtPnR4X3NrYnVmZltlbnRyeV0tPmxlbjsKKwkJfSBlbHNlCisJCQllcGljX3R4X2Vycm9yKGRldiwgZXAsIHR4c3RhdHVzKTsKKworCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCXNrYiA9IGVwLT50eF9za2J1ZmZbZW50cnldOworCQlwY2lfdW5tYXBfc2luZ2xlKGVwLT5wY2lfZGV2LCBlcC0+dHhfcmluZ1tlbnRyeV0uYnVmYWRkciwgCisJCQkJIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJZXAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCX0KKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJaWYgKGN1cl90eCAtIGRpcnR5X3R4ID4gVFhfUklOR19TSVpFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogT3V0LW9mLXN5bmMgZGlydHkgcG9pbnRlciwgJWQgdnMuICVkLCBmdWxsPSVkLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZGlydHlfdHgsIGN1cl90eCwgZXAtPnR4X2Z1bGwpOworCQlkaXJ0eV90eCArPSBUWF9SSU5HX1NJWkU7CisJfQorI2VuZGlmCisJZXAtPmRpcnR5X3R4ID0gZGlydHlfdHg7CisJaWYgKGVwLT50eF9mdWxsICYmIGN1cl90eCAtIGRpcnR5X3R4IDwgVFhfUVVFVUVfTEVOIC0gNCkgeworCQkvKiBUaGUgcmluZyBpcyBubyBsb25nZXIgZnVsbCwgYWxsb3cgbmV3IFRYIGVudHJpZXMuICovCisJCWVwLT50eF9mdWxsID0gMDsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KK30KKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworc3RhdGljIGlycXJldHVybl90IGVwaWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgZXBpY19wcml2YXRlICplcCA9IGRldi0+cHJpdjsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW5sKGlvYWRkciArIElOVFNUQVQpOworCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworCW91dGwoc3RhdHVzICYgRXBpY05vcm1hbEV2ZW50LCBpb2FkZHIgKyBJTlRTVEFUKTsKKworCWlmIChkZWJ1ZyA+IDQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbnRlcnJ1cHQsIHN0YXR1cz0lIzguOHggbmV3ICIKKwkJCQkgICAiaW50c3RhdD0lIzguOHguXG4iLCBkZXYtPm5hbWUsIHN0YXR1cywKKwkJCQkgICAoaW50KWlubChpb2FkZHIgKyBJTlRTVEFUKSk7CisJfQorCisJaWYgKChzdGF0dXMgJiBJbnRyU3VtbWFyeSkgPT0gMCkKKwkJZ290byBvdXQ7CisKKwloYW5kbGVkID0gMTsKKworCWlmICgoc3RhdHVzICYgRXBpY05hcGlFdmVudCkgJiYgIWVwLT5yZXNjaGVkdWxlX2luX3BvbGwpIHsKKwkJc3Bpbl9sb2NrKCZlcC0+bmFwaV9sb2NrKTsKKwkJaWYgKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgeworCQkJZXBpY19uYXBpX2lycV9vZmYoZGV2LCBlcCk7CisJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJCX0gZWxzZQorCQkJZXAtPnJlc2NoZWR1bGVfaW5fcG9sbCsrOworCQlzcGluX3VubG9jaygmZXAtPm5hcGlfbG9jayk7CisJfQorCXN0YXR1cyAmPSB+RXBpY05hcGlFdmVudDsKKworCS8qIENoZWNrIHVuY29tbW9uIGV2ZW50cyBhbGwgYXQgb25jZS4gKi8KKwlpZiAoc3RhdHVzICYgKENudEZ1bGwgfCBUeFVuZGVycnVuIHwgUENJQnVzRXJyMTcwIHwgUENJQnVzRXJyMTc1KSkgeworCQlpZiAoc3RhdHVzID09IEVwaWNSZW1vdmVkKQorCQkJZ290byBvdXQ7CisKKwkJLyogQWx3YXlzIHVwZGF0ZSB0aGUgZXJyb3IgY291bnRzIHRvIGF2b2lkIG92ZXJoZWFkIGxhdGVyLiAqLworCQllcC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgTVBDTlQpOworCQllcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGluYihpb2FkZHIgKyBBTElDTlQpOworCQllcC0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgQ1JDQ05UKTsKKworCQlpZiAoc3RhdHVzICYgVHhVbmRlcnJ1bikgeyAvKiBUeCBGSUZPIHVuZGVyZmxvdy4gKi8KKwkJCWVwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJb3V0bChlcC0+dHhfdGhyZXNob2xkICs9IDEyOCwgaW9hZGRyICsgVHhUaHJlc2gpOworCQkJLyogUmVzdGFydCB0aGUgdHJhbnNtaXQgcHJvY2Vzcy4gKi8KKwkJCW91dGwoUmVzdGFydFR4LCBpb2FkZHIgKyBDT01NQU5EKTsKKwkJfQorCQlpZiAoc3RhdHVzICYgUENJQnVzRXJyMTcwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgQnVzIEVycm9yISBzdGF0dXMgJTQuNHguXG4iLAorCQkJCQkgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJZXBpY19wYXVzZShkZXYpOworCQkJZXBpY19yZXN0YXJ0KGRldik7CisJCX0KKwkJLyogQ2xlYXIgYWxsIGVycm9yIHNvdXJjZXMuICovCisJCW91dGwoc3RhdHVzICYgMHg3ZjE4LCBpb2FkZHIgKyBJTlRTVEFUKTsKKwl9CisKK291dDoKKwlpZiAoZGVidWcgPiAzKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdCBpbnRlcnJ1cHQsIGludHJfc3RhdHVzPSUjNC40eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCX0KKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgaW50IGVwaWNfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgZXBpY19wcml2YXRlICplcCA9IGRldi0+cHJpdjsKKwlpbnQgZW50cnkgPSBlcC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCWludCByeF93b3JrX2xpbWl0ID0gZXAtPmRpcnR5X3J4ICsgUlhfUklOR19TSVpFIC0gZXAtPmN1cl9yeDsKKwlpbnQgd29ya19kb25lID0gMDsKKworCWlmIChkZWJ1ZyA+IDQpCisJCXByaW50ayhLRVJOX0RFQlVHICIgSW4gZXBpY19yeCgpLCBlbnRyeSAlZCAlOC44eC5cbiIsIGVudHJ5LAorCQkJICAgZXAtPnJ4X3JpbmdbZW50cnldLnJ4c3RhdHVzKTsKKworCWlmIChyeF93b3JrX2xpbWl0ID4gYnVkZ2V0KQorCQlyeF93b3JrX2xpbWl0ID0gYnVkZ2V0OworCisJLyogSWYgd2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKwl3aGlsZSAoKGVwLT5yeF9yaW5nW2VudHJ5XS5yeHN0YXR1cyAmIGNwdV90b19sZTMyKERlc2NPd24pKSA9PSAwKSB7CisJCWludCBzdGF0dXMgPSBsZTMyX3RvX2NwdShlcC0+cnhfcmluZ1tlbnRyeV0ucnhzdGF0dXMpOworCisJCWlmIChkZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiICBlcGljX3J4KCkgc3RhdHVzIHdhcyAlOC44eC5cbiIsIHN0YXR1cyk7CisJCWlmICgtLXJ4X3dvcmtfbGltaXQgPCAwKQorCQkJYnJlYWs7CisJCWlmIChzdGF0dXMgJiAweDIwMDYpIHsKKwkJCWlmIChkZWJ1ZyA+IDIpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlcGljX3J4KCkgZXJyb3Igc3RhdHVzIHdhcyAlOC44eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCWlmIChzdGF0dXMgJiAweDIwMDApIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3ZlcnNpemVkIEV0aGVybmV0IGZyYW1lIHNwYW5uZWQgIgorCQkJCQkgICAibXVsdGlwbGUgYnVmZmVycywgc3RhdHVzICU0LjR4IVxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJCWVwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIDB4MDAwNikKKwkJCQkvKiBSeCBGcmFtZSBlcnJvcnMgYXJlIGNvdW50ZWQgaW4gaGFyZHdhcmUuICovCisJCQkJZXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIsIGNvbXBhdGlibGUgd2l0aCBuZXQtMmUuICovCisJCQkvKiBPbWl0IHRoZSBmb3VyIG9jdGV0IENSQyBmcm9tIHRoZSBsZW5ndGguICovCisJCQlzaG9ydCBwa3RfbGVuID0gKHN0YXR1cyA+PiAxNikgLSA0OworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJaWYgKHBrdF9sZW4gPiBQS1RfQlVGX1NaIC0gNCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCBmcmFtZSwgc3RhdHVzICV4ICIKKwkJCQkJICAgIiVkIGJ5dGVzLlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBzdGF0dXMsIHBrdF9sZW4pOworCQkJCXBrdF9sZW4gPSAxNTE0OworCQkJfQorCQkJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBhY2NlcHQgd2l0aG91dCBjb3B5aW5nCisJCQkgICB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCisJCQlpZiAocGt0X2xlbiA8IHJ4X2NvcHlicmVhaworCQkJCSYmIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShlcC0+cGNpX2RldiwKKwkJCQkJCQkgICAgZXAtPnJ4X3JpbmdbZW50cnldLmJ1ZmFkZHIsCisJCQkJCQkJICAgIGVwLT5yeF9idWZfc3osCisJCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIGVwLT5yeF9za2J1ZmZbZW50cnldLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGVwLT5wY2lfZGV2LAorCQkJCQkJCSAgICAgICBlcC0+cnhfcmluZ1tlbnRyeV0uYnVmYWRkciwKKwkJCQkJCQkgICAgICAgZXAtPnJ4X2J1Zl9zeiwKKwkJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCX0gZWxzZSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShlcC0+cGNpX2RldiwgCisJCQkJCWVwLT5yeF9yaW5nW2VudHJ5XS5idWZhZGRyLCAKKwkJCQkJZXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlza2JfcHV0KHNrYiA9IGVwLT5yeF9za2J1ZmZbZW50cnldLCBwa3RfbGVuKTsKKwkJCQllcC0+cnhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQl9CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQllcC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJZXAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0KKwkJd29ya19kb25lKys7CisJCWVudHJ5ID0gKCsrZXAtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CisJfQorCisJLyogUmVmaWxsIHRoZSBSeCByaW5nIGJ1ZmZlcnMuICovCisJZm9yICg7IGVwLT5jdXJfcnggLSBlcC0+ZGlydHlfcnggPiAwOyBlcC0+ZGlydHlfcngrKykgeworCQllbnRyeSA9IGVwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwkJaWYgKGVwLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQlza2IgPSBlcC0+cnhfc2tidWZmW2VudHJ5XSA9IGRldl9hbGxvY19za2IoZXAtPnJ4X2J1Zl9zeik7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KKwkJCWVwLT5yeF9yaW5nW2VudHJ5XS5idWZhZGRyID0gcGNpX21hcF9zaW5nbGUoZXAtPnBjaV9kZXYsIAorCQkJCXNrYi0+dGFpbCwgZXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXdvcmtfZG9uZSsrOworCQl9CisJCWVwLT5yeF9yaW5nW2VudHJ5XS5yeHN0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd24pOworCX0KKwlyZXR1cm4gd29ya19kb25lOworfQorCitzdGF0aWMgdm9pZCBlcGljX3J4X2VycihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXBpY19wcml2YXRlICplcCkKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbmwoaW9hZGRyICsgSU5UU1RBVCk7CisKKwlpZiAoc3RhdHVzID09IEVwaWNSZW1vdmVkKQorCQlyZXR1cm47CisJaWYgKHN0YXR1cyAmIFJ4T3ZlcmZsb3cpIAkvKiBNaXNzZWQgYSBSeCBmcmFtZS4gKi8KKwkJZXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCWlmIChzdGF0dXMgJiAoUnhPdmVyZmxvdyB8IFJ4RnVsbCkpCisJCW91dHcoUnhRdWV1ZWQsIGlvYWRkciArIENPTU1BTkQpOworfQorCitzdGF0aWMgaW50IGVwaWNfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlzdHJ1Y3QgZXBpY19wcml2YXRlICplcCA9IGRldi0+cHJpdjsKKwlpbnQgd29ya19kb25lLCBvcmlnX2J1ZGdldDsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJb3JpZ19idWRnZXQgPSAoKmJ1ZGdldCA+IGRldi0+cXVvdGEpID8gZGV2LT5xdW90YSA6ICpidWRnZXQ7CisKK3J4X2FjdGlvbjoKKworCWVwaWNfdHgoZGV2LCBlcCk7CisKKwl3b3JrX2RvbmUgPSBlcGljX3J4KGRldiwgKmJ1ZGdldCk7CisKKwllcGljX3J4X2VycihkZXYsIGVwKTsKKworCSpidWRnZXQgLT0gd29ya19kb25lOworCWRldi0+cXVvdGEgLT0gd29ya19kb25lOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiAod29ya19kb25lIDwgb3JpZ19idWRnZXQpKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCWludCBtb3JlOworCisJCS8qIEEgYml0IGJhcm9xdWUgYnV0IGl0IGF2b2lkcyBhIChzcGFjZSBodW5ncnkpIHNwaW5fdW5sb2NrICovCisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVwLT5uYXBpX2xvY2ssIGZsYWdzKTsKKworCQltb3JlID0gZXAtPnJlc2NoZWR1bGVfaW5fcG9sbDsKKwkJaWYgKCFtb3JlKSB7CisJCQlfX25ldGlmX3J4X2NvbXBsZXRlKGRldik7CisJCQlvdXRsKEVwaWNOYXBpRXZlbnQsIGlvYWRkciArIElOVFNUQVQpOworCQkJZXBpY19uYXBpX2lycV9vbihkZXYsIGVwKTsKKwkJfSBlbHNlCisJCQllcC0+cmVzY2hlZHVsZV9pbl9wb2xsLS07CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPm5hcGlfbG9jaywgZmxhZ3MpOworCisJCWlmIChtb3JlKQorCQkJZ290byByeF9hY3Rpb247CisJfQorCisJcmV0dXJuICh3b3JrX2RvbmUgPj0gb3JpZ19idWRnZXQpOworfQorCitzdGF0aWMgaW50IGVwaWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlcGljX3ByaXZhdGUgKmVwID0gZGV2LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzICUyLjJ4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgKGludClpbmwoaW9hZGRyICsgSU5UU1RBVCkpOworCisJZGVsX3RpbWVyX3N5bmMoJmVwLT50aW1lcik7CisKKwllcGljX2Rpc2FibGVfaW50KGRldiwgZXApOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwllcGljX3BhdXNlKGRldik7CisKKwkvKiBGcmVlIGFsbCB0aGUgc2tidWZmcyBpbiB0aGUgUnggcXVldWUuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXNrYiA9IGVwLT5yeF9za2J1ZmZbaV07CisJCWVwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQllcC0+cnhfcmluZ1tpXS5yeHN0YXR1cyA9IDA7CQkvKiBOb3Qgb3duZWQgYnkgRXBpYyBjaGlwLiAqLworCQllcC0+cnhfcmluZ1tpXS5idWZsZW5ndGggPSAwOworCQlpZiAoc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGVwLT5wY2lfZGV2LCBlcC0+cnhfcmluZ1tpXS5idWZhZGRyLCAKKwkJCQkgCSBlcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQl9CisJCWVwLT5yeF9yaW5nW2ldLmJ1ZmFkZHIgPSAweEJBREYwMEQwOyAvKiBBbiBpbnZhbGlkIGFkZHJlc3MuICovCisJfQorCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlza2IgPSBlcC0+dHhfc2tidWZmW2ldOworCQllcC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJaWYgKCFza2IpCisJCQljb250aW51ZTsKKwkJcGNpX3VubWFwX3NpbmdsZShlcC0+cGNpX2RldiwgZXAtPnR4X3JpbmdbaV0uYnVmYWRkciwgCisJCQkJIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKworCS8qIEdyZWVuISBMZWF2ZSB0aGUgY2hpcCBpbiBsb3ctcG93ZXIgbW9kZS4gKi8KKwlvdXRsKDB4MDAwOCwgaW9hZGRyICsgR0VOQ1RMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVwaWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXAgPSBkZXYtPnByaXY7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJLyogVXBkYXRlIHRoZSBlcnJvciBjb3VudHMuICovCisJCWVwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGluYihpb2FkZHIgKyBNUENOVCk7CisJCWVwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gaW5iKGlvYWRkciArIEFMSUNOVCk7CisJCWVwLT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9IGluYihpb2FkZHIgKyBDUkNDTlQpOworCX0KKworCXJldHVybiAmZXAtPnN0YXRzOworfQorCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAgIE5vdGUgdGhhdCB3ZSBvbmx5IHVzZSBleGNsdXNpb24gYXJvdW5kIGFjdHVhbGx5IHF1ZXVlaW5nIHRoZQorICAgbmV3IGZyYW1lLCBub3QgYXJvdW5kIGZpbGxpbmcgZXAtPnNldHVwX2ZyYW1lLiAgVGhpcyBpcyBub24tZGV0ZXJtaW5pc3RpYworICAgd2hlbiByZS1lbnRlcmVkIGJ1dCBzdGlsbCBjb3JyZWN0LiAqLworCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXAgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgY2hhciBtY19maWx0ZXJbOF07CQkgLyogTXVsdGljYXN0IGhhc2ggZmlsdGVyICovCisJaW50IGk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CQkJLyogU2V0IHByb21pc2N1b3VzLiAqLworCQlvdXRsKDB4MDAyQywgaW9hZGRyICsgUnhDdHJsKTsKKwkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKKwl9IGVsc2UgaWYgKChkZXYtPm1jX2NvdW50ID4gMCkgIHx8ICAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJLyogVGhlcmUgaXMgYXBwYXJlbnRseSBhIGNoaXAgYnVnLCBzbyB0aGUgbXVsdGljYXN0IGZpbHRlcgorCQkgICBpcyBuZXZlciBlbmFibGVkLiAqLworCQkvKiBUb28gbWFueSB0byBmaWx0ZXIgcGVyZmVjdGx5IC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJbWVtc2V0KG1jX2ZpbHRlciwgMHhmZiwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlvdXRsKDB4MDAwQywgaW9hZGRyICsgUnhDdHJsKTsKKwl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPT0gMCkgeworCQlvdXRsKDB4MDAwNCwgaW9hZGRyICsgUnhDdHJsKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CQkJCQkvKiBOZXZlciBleGVjdXRlZCwgZm9yIG5vdy4gKi8KKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisKKwkJbWVtc2V0KG1jX2ZpbHRlciwgMCwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsKKwkJCSBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJdW5zaWduZWQgaW50IGJpdF9uciA9CisJCQkJZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSAmIDB4M2Y7CisJCQltY19maWx0ZXJbYml0X25yID4+IDNdIHw9ICgxIDw8IGJpdF9ucik7CisJCX0KKwl9CisJLyogVG9EbzogcGVyaGFwcyB3ZSBuZWVkIHRvIHN0b3AgdGhlIFR4IGFuZCBSeCBwcm9jZXNzIGhlcmU/ICovCisJaWYgKG1lbWNtcChtY19maWx0ZXIsIGVwLT5tY19maWx0ZXIsIHNpemVvZihtY19maWx0ZXIpKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJb3V0dygoKHUxNiAqKW1jX2ZpbHRlcilbaV0sIGlvYWRkciArIE1DMCArIGkqNCk7CisJCW1lbWNweShlcC0+bWNfZmlsdGVyLCBtY19maWx0ZXIsIHNpemVvZihtY19maWx0ZXIpKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqbnAgPSBkZXYtPnByaXY7CisKKwlzdHJjcHkgKGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweSAoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweSAoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZGV2X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZXBpY19wcml2YXRlICpucCA9IGRldi0+cHJpdjsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJcmMgPSBtaWlfZXRodG9vbF9nc2V0KCZucC0+bWlpLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG5ldGRldl9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqbnAgPSBkZXYtPnByaXY7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXJjID0gbWlpX2V0aHRvb2xfc3NldCgmbnAtPm1paSwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBuZXRkZXZfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlcGljX3ByaXZhdGUgKm5wID0gZGV2LT5wcml2OworCXJldHVybiBtaWlfbndheV9yZXN0YXJ0KCZucC0+bWlpKTsKK30KKworc3RhdGljIHUzMiBuZXRkZXZfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXBpY19wcml2YXRlICpucCA9IGRldi0+cHJpdjsKKwlyZXR1cm4gbWlpX2xpbmtfb2soJm5wLT5taWkpOworfQorCitzdGF0aWMgdTMyIG5ldGRldl9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGVidWc7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQoreworCWRlYnVnID0gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgZXRodG9vbF9iZWdpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJLyogcG93ZXItdXAsIGlmIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCEgbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCW91dGwoMHgwMjAwLCBpb2FkZHIgKyBHRU5DVEwpOworCQlvdXRsKChpbmwoaW9hZGRyICsgTlZDVEwpICYgfjB4MDAzQykgfCAweDQ4MDAsIGlvYWRkciArIE5WQ1RMKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV0aHRvb2xfY29tcGxldGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCS8qIHBvd2VyLWRvd24sIGlmIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCEgbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCW91dGwoMHgwMDA4LCBpb2FkZHIgKyBHRU5DVEwpOworCQlvdXRsKChpbmwoaW9hZGRyICsgTlZDVEwpICYgfjB4NDgzQykgfCAweDAwMDAsIGlvYWRkciArIE5WQ1RMKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisJLmdldF9zZXR0aW5ncwkJPSBuZXRkZXZfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gbmV0ZGV2X3NldF9zZXR0aW5ncywKKwkubndheV9yZXNldAkJPSBuZXRkZXZfbndheV9yZXNldCwKKwkuZ2V0X2xpbmsJCT0gbmV0ZGV2X2dldF9saW5rLAorCS5nZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IG5ldGRldl9zZXRfbXNnbGV2ZWwsCisJLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLmdldF90eF9jc3VtCQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisJLmJlZ2luCQkJPSBldGh0b29sX2JlZ2luLAorCS5jb21wbGV0ZQkJPSBldGh0b29sX2NvbXBsZXRlCit9OworCitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBlcGljX3ByaXZhdGUgKm5wID0gZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IG1paV9pb2N0bF9kYXRhICpkYXRhID0gaWZfbWlpKHJxKTsKKwlpbnQgcmM7CisKKwkvKiBwb3dlci11cCwgaWYgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoISBuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJb3V0bCgweDAyMDAsIGlvYWRkciArIEdFTkNUTCk7CisJCW91dGwoKGlubChpb2FkZHIgKyBOVkNUTCkgJiB+MHgwMDNDKSB8IDB4NDgwMCwgaW9hZGRyICsgTlZDVEwpOworCX0KKworCS8qIGFsbCBub24tZXRodG9vbCBpb2N0bHMgKHRoZSBTSU9DW0dTXU1JSXh4eCBpb2N0bHMpICovCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJm5wLT5taWksIGRhdGEsIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwkvKiBwb3dlci1kb3duLCBpZiBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghIG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlvdXRsKDB4MDAwOCwgaW9hZGRyICsgR0VOQ1RMKTsKKwkJb3V0bCgoaW5sKGlvYWRkciArIE5WQ1RMKSAmIH4weDQ4M0MpIHwgMHgwMDAwLCBpb2FkZHIgKyBOVkNUTCk7CisJfQorCXJldHVybiByYzsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZXBpY19yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBlcGljX3ByaXZhdGUgKmVwID0gZGV2LT5wcml2OworCQorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgZXAtPnR4X3JpbmcsIGVwLT50eF9yaW5nX2RtYSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCBlcC0+cnhfcmluZywgZXAtPnJ4X3JpbmdfZG1hKTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworI2lmbmRlZiBVU0VfSU9fT1BTCisJaW91bm1hcCgodm9pZCopIGRldi0+YmFzZV9hZGRyKTsKKyNlbmRpZgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCS8qIHBjaV9wb3dlcl9vZmYocGRldiwgLTEpOyAqLworfQorCisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBlcGljX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCWVwaWNfcGF1c2UoZGV2KTsKKwkvKiBQdXQgdGhlIGNoaXAgaW50byBsb3ctcG93ZXIgbW9kZS4gKi8KKwlvdXRsKDB4MDAwOCwgaW9hZGRyICsgR0VOQ1RMKTsKKwkvKiBwY2lfcG93ZXJfb2ZmKHBkZXYsIC0xKTsgKi8KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGVwaWNfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCWVwaWNfcmVzdGFydChkZXYpOworCS8qIHBjaV9wb3dlcl9vbihwZGV2KTsgKi8KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlcGljX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJPSBlcGljX3BjaV90YmwsCisJLnByb2JlCQk9IGVwaWNfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChlcGljX3JlbW92ZV9vbmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gZXBpY19zdXNwZW5kLAorCS5yZXN1bWUJCT0gZXBpY19yZXN1bWUsCisjZW5kaWYgLyogQ09ORklHX1BNICovCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGVwaWNfaW5pdCAodm9pZCkKK3sKKy8qIHdoZW4gYSBtb2R1bGUsIHRoaXMgaXMgcHJpbnRlZCB3aGV0aGVyIG9yIG5vdCBkZXZpY2VzIGFyZSBmb3VuZCBpbiBwcm9iZSAqLworI2lmZGVmIE1PRFVMRQorCXByaW50ayAoS0VSTl9JTkZPICIlcyIgS0VSTl9JTkZPICIlcyIgS0VSTl9JTkZPICIlcyIsCisJCXZlcnNpb24sIHZlcnNpb24yLCB2ZXJzaW9uMyk7CisjZW5kaWYKKworCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZlcGljX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGVwaWNfY2xlYW51cCAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZlcGljX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoZXBpY19pbml0KTsKK21vZHVsZV9leGl0KGVwaWNfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lcWwuYyBiL2RyaXZlcnMvbmV0L2VxbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNjg2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lcWwuYwpAQCAtMCwwICsxLDYxMyBAQAorLyoKKyAqIEVxdWFsaXplciBMb2FkLWJhbGFuY2VyIGZvciBzZXJpYWwgbmV0d29yayBpbnRlcmZhY2VzLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMTk5NSBTaW1vbiAiR3VydSBBbGVwaC1OdWxsIiBKYW5lcworICogTkNNOiBOZXR3b3JrIGFuZCBDb21tdW5pY2F0aW9ucyBNYW5hZ2VtZW50LCBJbmMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqCisgKglUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKglvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICogCisgKiBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIHNpbW9uQG5jbS5jb20sIG9yIEMvTworICogICAgTkNNCisgKiAgICBBdHRuOiBTaW1vbiBKYW5lcworICogICAgNjgwMyBXaGl0dGllciBBdmUKKyAqICAgIE1jTGVhbiBWQSAyMjEwMQorICogICAgUGhvbmU6IDEtNzAzLTg0Ny0wMDQwIGV4dCAxMDMKKyAqLworCisvKgorICogU291cmNlczoKKyAqICAgc2tlbGV0b24uYyBieSBEb25hbGQgQmVja2VyLgorICogSW5zcGlyYXRpb25zOgorICogICBUaGUgSGFycmllZCBhbmQgT3ZlcndvcmtlZCBBbGFuIENveAorICogQ29uc3BpcmFjaWVzOgorICogICBUaGUgQWxhbiBDb3ggYW5kIE1pa2UgTWNMYWdhbiBwbG90IHRvIGdldCBzb21lb25lIGVsc2UgdG8gZG8gdGhlIGNvZGUsIAorICogICB3aGljaCB0dXJuZWQgb3V0IHRvIGJlIG1lLgorICovCisKKy8qCisgKiAkTG9nOiBlcWwuYyx2ICQKKyAqIFJldmlzaW9uIDEuMiAgMTk5Ni8wNC8xMSAxNzo1MTo1MiAgZ3VydQorICogQWRkZWQgb25lLWxpbmUgZXFsX3JlbW92ZV9zbGF2ZSBwYXRjaC4KKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTYvMDQvMTEgMTc6NDQ6MTcgIGd1cnUKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKiBSZXZpc2lvbiAzLjEzICAxOTk2LzAxLzIxICAxNToxNzoxOCAgYWxhbgorICogdHhfcXVldWVfbGVuIGNoYW5nZXMuCisgKiByZWZvcm1hdHRlZC4KKyAqCisgKiBSZXZpc2lvbiAzLjEyICAxOTk1LzAzLzIyICAyMTowNzo1MSAgYW5hcmNoeQorICogQWRkZWQgY2FwYWJsZSgpIGNoZWNrcyBvbiBjb25maWd1cmF0aW9uLgorICogTW92ZWQgaGVhZGVyIGZpbGUuCisgKgorICogUmV2aXNpb24gMy4xMSAgMTk5NS8wMS8xOSAgMjM6MTQ6MzEgIGd1cnUKKyAqIAkJICAgICAgc2xhdmVfbG9hZCA9IChVTE9OR19NQVggLSAoVUxPTkdfTUFYIC8gMikpIC0KKyAqIAkJCShwcmlvcml0eV9CcHMpICsgYnl0ZXNfcXVldWVkICogODsKKyAqCisgKiBSZXZpc2lvbiAzLjEwICAxOTk1LzAxLzE5ICAyMzowNzo1MyAgZ3VydQorICogYmFjayB0bworICogCQkgICAgICBzbGF2ZV9sb2FkID0gKFVMT05HX01BWCAtIChVTE9OR19NQVggLyAyKSkgLQorICogCQkJKHByaW9yaXR5X0JwcykgKyBieXRlc19xdWV1ZWQ7CisgKgorICogUmV2aXNpb24gMy45ICAxOTk1LzAxLzE5ICAyMjozODoyMCAgZ3VydQorICogCQkgICAgICBzbGF2ZV9sb2FkID0gKFVMT05HX01BWCAtIChVTE9OR19NQVggLyAyKSkgLQorICogCQkJKHByaW9yaXR5X0JwcykgKyBieXRlc19xdWV1ZWQgKiA0OworICoKKyAqIFJldmlzaW9uIDMuOCAgMTk5NS8wMS8xOSAgMjI6MzA6NTUgIGd1cnUKKyAqICAgICAgIHNsYXZlX2xvYWQgPSAoVUxPTkdfTUFYIC0gKFVMT05HX01BWCAvIDIpKSAtCisgKiAJCQkocHJpb3JpdHlfQnBzKSArIGJ5dGVzX3F1ZXVlZCAqIDI7CisgKgorICogUmV2aXNpb24gMy43ICAxOTk1LzAxLzE5ICAyMTo1MjozNSAgZ3VydQorICogcHJpbnRrJ3MgdHJpbW1lZCBvdXQuCisgKgorICogUmV2aXNpb24gMy42ICAxOTk1LzAxLzE5ICAyMTo0OTo1NiAgZ3VydQorICogVGhpcyBpcyB3b3JraW5nIHByZXR0eSB3ZWxsLiBJIGdhaW5lZCAxIEsvcyBpbiBzcGVlZC4uIG5vdyBpdCdzIGp1c3QKKyAqIHJvYnVzdG5lc3MgYW5kIHByaW50aydzIHRvIGJlIGRpa2VkIG91dC4KKyAqCisgKiBSZXZpc2lvbiAzLjUgIDE5OTUvMDEvMTggIDIyOjI5OjU5ICBndXJ1CisgKiBzdGlsbCBjcmFzaGVzIHRoZSBrZXJuZWwgd2hlbiB0aGUgbG9ja193YWl0IHRoaW5nIGlzIHdva2VuIHVwLgorICoKKyAqIFJldmlzaW9uIDMuNCAgMTk5NS8wMS8xOCAgMjE6NTk6NDcgIGd1cnUKKyAqIEJyb2tlbiBzZXQtYml0IGxvY2tpbmcgc25hcHNob3QKKyAqCisgKiBSZXZpc2lvbiAzLjMgIDE5OTUvMDEvMTcgIDIyOjA5OjE4ICBndXJ1CisgKiBpbmZpbml0ZSBzbGVlcCBpbiBhIGxvY2sgc29tZXdoZXJlLi4KKyAqCisgKiBSZXZpc2lvbiAzLjIgIDE5OTUvMDEvMTUgIDE2OjQ2OjA2ICBndXJ1CisgKiBMb2cgdHJpbW1lZCBvZiBub24tcGVydGluZW50IDEueCBicmFuY2ggbWVzc2FnZXMKKyAqCisgKiBSZXZpc2lvbiAzLjEgIDE5OTUvMDEvMTUgIDE0OjQxOjQ1ICBndXJ1CisgKiBOZXcgU2NoZWR1bGVyIGFuZCB0aW1lciBzdHVmZi4uLgorICoKKyAqIFJldmlzaW9uIDEuMTUgIDE5OTUvMDEvMTUgIDE0OjI5OjAyICBndXJ1CisgKiBXaWxsIG1ha2UgMS4xNCAobm93IDEuMTUpIHRoZSAzLjAgYnJhbmNoLCBhbmQgdGhlIDEuMTIgdGhlIDIuMCBicmFuY2gsIHRoZSBvbmUKKyAqIHdpdGggdGhlIGR1bWJlciBzY2hlZHVsZXIKKyAqCisgKiBSZXZpc2lvbiAxLjE0ICAxOTk1LzAxLzE1ICAwMjozNzowOCAgZ3VydQorICogc2hvY2suLiB0aGUga2VwdC1uZXctdmVyc2lvbnMgY291bGQgaGF2ZSB6b25rZWQgd29ya2luZworICogc3R1ZmYuLiBzaHVkZGVyCisgKgorICogUmV2aXNpb24gMS4xMyAgMTk5NS8wMS8xNSAgMDI6MzY6MzEgIGd1cnUKKyAqIGJpZyBjaGFuZ2VzCisgKgorICogCXNjaGVkdWxlciB3YXMgdG9ybiBvdXQgYW5kIHJlcGxhY2VkIHdpdGggc29tZXRoaW5nIHNtYXJ0ZXIKKyAqCisgKiAJZ2xvYmFsIG5hbWVzIG5vdCBwcmVmaXhlZCB3aXRoIGVxbF8gd2VyZSByZW5hbWVkIHRvIHByb3RlY3QKKyAqIAlhZ2FpbnN0IG5hbWVzcGFjZSBjb2xsaXNpb25zCisgKgorICogCWEgZmV3IG1vcmUgYWJzdHJhY3QgaW50ZXJmYWNlcyB3ZXJlIGFkZGVkIHRvIGZhY2lsaXRhdGUgYW55CisgKiAJcG90ZW50aWFsIGNoYW5nZSBvZiBkYXRhc3RydWN0dXJlLiAgdGhlIGRyaXZlciBpcyBzdGlsbCB1c2luZworICogCWEgbGlua2VkIGxpc3Qgb2Ygc2xhdmVzLiAgZ29pbmcgdG8gYSBoZWFwIHdvdWxkIGJlIGEgYml0IG9mCisgKiAJYW4gb3ZlcmtpbGwuCisgKgorICogCXRoaXMgY29tcGlsZXMgZmluZSB3aXRoIG5vIHdhcm5pbmdzLgorICoKKyAqIAl0aGUgbG9ja2luZyBtZWNoYW5pc20gYW5kIHRpbWVyIHN0dWZmIG11c3QgYmUgd3JpdHRlbiBob3dldmVyLAorICogCXRoaXMgdmVyc2lvbiB3aWxsIG5vdCB3b3JrIG90aGVyd2lzZQorICoKKyAqIFNvcnJ5LCBJIGhhZCB0byByZXdyaXRlIG1vc3Qgb2YgdGhpcyBmb3IgMi41LnggLURhdmVNCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9lcWwuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbnQgZXFsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVxbF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZXFsX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgZXFsX3NsYXZlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVxbF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNkZWZpbmUgZXFsX2lzX3NsYXZlKGRldikJKChkZXYtPmZsYWdzICYgSUZGX1NMQVZFKSA9PSBJRkZfU0xBVkUpCisjZGVmaW5lIGVxbF9pc19tYXN0ZXIoZGV2KQkoKGRldi0+ZmxhZ3MgJiBJRkZfTUFTVEVSKSA9PSBJRkZfTUFTVEVSKQorCitzdGF0aWMgdm9pZCBlcWxfa2lsbF9vbmVfc2xhdmUoc2xhdmVfdCAqc2xhdmUpOworCitzdGF0aWMgdm9pZCBlcWxfdGltZXIodW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwllcXVhbGl6ZXJfdCAqZXFsID0gKGVxdWFsaXplcl90ICopIHBhcmFtOworCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXMsICp0bXAsICpoZWFkOworCQorCXNwaW5fbG9ja19iaCgmZXFsLT5xdWV1ZS5sb2NrKTsKKwloZWFkID0gJmVxbC0+cXVldWUuYWxsX3NsYXZlczsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodGhpcywgdG1wLCBoZWFkKSB7CisJCXNsYXZlX3QgKnNsYXZlID0gbGlzdF9lbnRyeSh0aGlzLCBzbGF2ZV90LCBsaXN0KTsKKworCQlpZiAoKHNsYXZlLT5kZXYtPmZsYWdzICYgSUZGX1VQKSA9PSBJRkZfVVApIHsKKwkJCXNsYXZlLT5ieXRlc19xdWV1ZWQgLT0gc2xhdmUtPnByaW9yaXR5X0JwczsKKwkJCWlmIChzbGF2ZS0+Ynl0ZXNfcXVldWVkIDwgMCkKKwkJCQlzbGF2ZS0+Ynl0ZXNfcXVldWVkID0gMDsKKwkJfSBlbHNlIHsKKwkJCWVxbF9raWxsX29uZV9zbGF2ZShzbGF2ZSk7CisJCX0KKworCX0KKwlzcGluX3VubG9ja19iaCgmZXFsLT5xdWV1ZS5sb2NrKTsKKworCWVxbC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBFUUxfREVGQVVMVF9SRVNDSEVEX0lWQUw7CisJYWRkX3RpbWVyKCZlcWwtPnRpbWVyKTsKK30KKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSAKKwkiRXF1YWxpemVyMjAwMjogU2ltb24gSmFuZXMgKHNpbW9uQG5jbS5jb20pIGFuZCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pXG4iOworCitzdGF0aWMgdm9pZCBfX2luaXQgZXFsX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZXF1YWxpemVyX3QgKmVxbCA9IG5ldGRldl9wcml2KGRldik7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpbml0X3RpbWVyKCZlcWwtPnRpbWVyKTsKKwllcWwtPnRpbWVyLmRhdGEgICAgIAk9ICh1bnNpZ25lZCBsb25nKSBlcWw7CisJZXFsLT50aW1lci5leHBpcmVzICAJPSBqaWZmaWVzICsgRVFMX0RFRkFVTFRfUkVTQ0hFRF9JVkFMOworCWVxbC0+dGltZXIuZnVuY3Rpb24gCT0gZXFsX3RpbWVyOworCisJc3Bpbl9sb2NrX2luaXQoJmVxbC0+cXVldWUubG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmVxbC0+cXVldWUuYWxsX3NsYXZlcyk7CisJZXFsLT5xdWV1ZS5tYXN0ZXJfZGV2CT0gZGV2OworCisJZGV2LT5vcGVuCQk9IGVxbF9vcGVuOworCWRldi0+c3RvcAkJPSBlcWxfY2xvc2U7CisJZGV2LT5kb19pb2N0bAkJPSBlcWxfaW9jdGw7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBlcWxfc2xhdmVfeG1pdDsKKwlkZXYtPmdldF9zdGF0cwkJPSBlcWxfZ2V0X3N0YXRzOworICAKKwkvKgorCSAqCU5vdyB3ZSB1bmRvIHNvbWUgb2YgdGhlIHRoaW5ncyB0aGF0IGV0aF9zZXR1cCBkb2VzCisJICogCXRoYXQgd2UgZG9uJ3QgbGlrZSAKKwkgKi8KKwkgCisJZGV2LT5tdHUgICAgICAgIAk9IEVRTF9ERUZBVUxUX01UVTsJLyogc2V0IHRvIDU3NiBpbiBpZl9lcWwuaCAqLworCWRldi0+ZmxhZ3MgICAgICAJPSBJRkZfTUFTVEVSOworCisJZGV2LT50eXBlICAgICAgIAk9IEFSUEhSRF9TTElQOworCWRldi0+dHhfcXVldWVfbGVuIAk9IDU7CQkvKiBIYW5kcyB0aGVtIG9mZiBmYXN0ICovCit9CisKK3N0YXRpYyBpbnQgZXFsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllcXVhbGl6ZXJfdCAqZXFsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIFhYWCBXZSBzaG91bGQgZm9yY2UgdGhpcyBvZmYgYXV0b21hdGljYWxseSBmb3IgdGhlIHVzZXIuICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlbWVtYmVyIHRvIHR1cm4gb2ZmIFZhbi1KYWNvYnNvbiBjb21wcmVzc2lvbiBvbiAiCisJICAgICAgICJ5b3VyIHNsYXZlIGRldmljZXMuXG4iLCBkZXYtPm5hbWUpOworCisJaWYgKCFsaXN0X2VtcHR5KCZlcWwtPnF1ZXVlLmFsbF9zbGF2ZXMpKQorCQlCVUcoKTsKKworCWVxbC0+bWluX3NsYXZlcyA9IDE7CisJZXFsLT5tYXhfc2xhdmVzID0gRVFMX0RFRkFVTFRfTUFYX1NMQVZFUzsgLyogNCB1c3VhbGx5Li4uICovCisKKwlhZGRfdGltZXIoJmVxbC0+dGltZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVxbF9raWxsX29uZV9zbGF2ZShzbGF2ZV90ICpzbGF2ZSkKK3sKKwlsaXN0X2RlbCgmc2xhdmUtPmxpc3QpOworCXNsYXZlLT5kZXYtPmZsYWdzICY9IH5JRkZfU0xBVkU7CisJZGV2X3B1dChzbGF2ZS0+ZGV2KTsKKwlrZnJlZShzbGF2ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGVxbF9raWxsX3NsYXZlX3F1ZXVlKHNsYXZlX3F1ZXVlX3QgKnF1ZXVlKQoreyAKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCAqdG1wLCAqdGhpczsKKworCXNwaW5fbG9ja19iaCgmcXVldWUtPmxvY2spOworCisJaGVhZCA9ICZxdWV1ZS0+YWxsX3NsYXZlczsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodGhpcywgdG1wLCBoZWFkKSB7CisJCXNsYXZlX3QgKnMgPSBsaXN0X2VudHJ5KHRoaXMsIHNsYXZlX3QsIGxpc3QpOworCisJCWVxbF9raWxsX29uZV9zbGF2ZShzKTsKKwkJcXVldWUtPm51bV9zbGF2ZXMtLTsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOworfQorCitzdGF0aWMgaW50IGVxbF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVxdWFsaXplcl90ICplcWwgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyoKKwkgKglUaGUgdGltZXIgaGFzIHRvIGJlIHN0b3BwZWQgZmlyc3QgYmVmb3JlIHdlIHN0YXJ0IGhhY2tpbmcgYXdheQorCSAqCWF0IHRoZSBkYXRhIHN0cnVjdHVyZSBpdCBzY2FucyBldmVyeSBzbyBvZnRlbi4uLiAKKwkgKi8KKworCWRlbF90aW1lcl9zeW5jKCZlcWwtPnRpbWVyKTsKKworCWVxbF9raWxsX3NsYXZlX3F1ZXVlKCZlcWwtPnF1ZXVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVxbF9lbnNsYXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsICBzbGF2aW5nX3JlcXVlc3RfdCBfX3VzZXIgKnNycSk7CitzdGF0aWMgaW50IGVxbF9lbWFuY2lwYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNsYXZpbmdfcmVxdWVzdF90IF9fdXNlciAqc3JxKTsKKworc3RhdGljIGludCBlcWxfZ19zbGF2ZV9jZmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2xhdmVfY29uZmlnX3QgX191c2VyICpzYyk7CitzdGF0aWMgaW50IGVxbF9zX3NsYXZlX2NmZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzbGF2ZV9jb25maWdfdCBfX3VzZXIgKnNjKTsKKworc3RhdGljIGludCBlcWxfZ19tYXN0ZXJfY2ZnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIG1hc3Rlcl9jb25maWdfdCBfX3VzZXIgKm1jKTsKK3N0YXRpYyBpbnQgZXFsX3NfbWFzdGVyX2NmZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBtYXN0ZXJfY29uZmlnX3QgX191c2VyICptYyk7CisKK3N0YXRpYyBpbnQgZXFsX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreyAgCisJaWYgKGNtZCAhPSBFUUxfR0VUTUFTVFJDRkcgJiYgY21kICE9IEVRTF9HRVRTTEFWRUNGRyAmJgorCSAgICAhY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkgIAlyZXR1cm4gLUVQRVJNOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBFUUxfRU5TTEFWRToKKwkJCXJldHVybiBlcWxfZW5zbGF2ZShkZXYsIGlmci0+aWZyX2RhdGEpOworCQljYXNlIEVRTF9FTUFOQ0lQQVRFOgorCQkJcmV0dXJuIGVxbF9lbWFuY2lwYXRlKGRldiwgaWZyLT5pZnJfZGF0YSk7CisJCWNhc2UgRVFMX0dFVFNMQVZFQ0ZHOgorCQkJcmV0dXJuIGVxbF9nX3NsYXZlX2NmZyhkZXYsIGlmci0+aWZyX2RhdGEpOworCQljYXNlIEVRTF9TRVRTTEFWRUNGRzoKKwkJCXJldHVybiBlcWxfc19zbGF2ZV9jZmcoZGV2LCBpZnItPmlmcl9kYXRhKTsKKwkJY2FzZSBFUUxfR0VUTUFTVFJDRkc6CisJCQlyZXR1cm4gZXFsX2dfbWFzdGVyX2NmZyhkZXYsIGlmci0+aWZyX2RhdGEpOworCQljYXNlIEVRTF9TRVRNQVNUUkNGRzoKKwkJCXJldHVybiBlcWxfc19tYXN0ZXJfY2ZnKGRldiwgaWZyLT5pZnJfZGF0YSk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfTsKK30KKworLyogcXVldWUtPmxvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgc2xhdmVfdCAqX19lcWxfc2NoZWR1bGVfc2xhdmVzKHNsYXZlX3F1ZXVlX3QgKnF1ZXVlKQoreworCXVuc2lnbmVkIGxvbmcgYmVzdF9sb2FkID0gfjBVTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzLCAqdG1wLCAqaGVhZDsKKwlzbGF2ZV90ICpiZXN0X3NsYXZlOworCisJYmVzdF9zbGF2ZSA9IE5VTEw7CisKKwkvKiBNYWtlIGEgcGFzcyB0byBzZXQgdGhlIGJlc3Qgc2xhdmUuICovCisJaGVhZCA9ICZxdWV1ZS0+YWxsX3NsYXZlczsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodGhpcywgdG1wLCBoZWFkKSB7CisJCXNsYXZlX3QgKnNsYXZlID0gbGlzdF9lbnRyeSh0aGlzLCBzbGF2ZV90LCBsaXN0KTsKKwkJdW5zaWduZWQgbG9uZyBzbGF2ZV9sb2FkLCBieXRlc19xdWV1ZWQsIHByaW9yaXR5X0JwczsgCisKKwkJLyogR28gdGhyb3VnaCB0aGUgc2xhdmUgbGlzdCBvbmNlLCB1cGRhdGluZyBiZXN0X3NsYXZlCisJCSAqIHdoZW5ldmVyIGEgbmV3IGJlc3RfbG9hZCBpcyBmb3VuZC4KKwkJICovCisJCWJ5dGVzX3F1ZXVlZCA9IHNsYXZlLT5ieXRlc19xdWV1ZWQ7CisJCXByaW9yaXR5X0JwcyA9IHNsYXZlLT5wcmlvcml0eV9CcHM7ICAgIAorCQlpZiAoKHNsYXZlLT5kZXYtPmZsYWdzICYgSUZGX1VQKSA9PSBJRkZfVVApIHsKKwkJCXNsYXZlX2xvYWQgPSAofjBVTCAtICh+MFVMIC8gMikpIC0gCisJCQkJKHByaW9yaXR5X0JwcykgKyBieXRlc19xdWV1ZWQgKiA4OworCisJCQlpZiAoc2xhdmVfbG9hZCA8IGJlc3RfbG9hZCkgeworCQkJCWJlc3RfbG9hZCA9IHNsYXZlX2xvYWQ7CisJCQkJYmVzdF9zbGF2ZSA9IHNsYXZlOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogV2UgZm91bmQgYSBkZWFkIHNsYXZlLCBraWxsIGl0LiAqLworCQkJZXFsX2tpbGxfb25lX3NsYXZlKHNsYXZlKTsKKwkJfQorCX0KKwlyZXR1cm4gYmVzdF9zbGF2ZTsKK30KKworc3RhdGljIGludCBlcWxfc2xhdmVfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVxdWFsaXplcl90ICplcWwgPSBuZXRkZXZfcHJpdihkZXYpOworCXNsYXZlX3QgKnNsYXZlOworCisJc3Bpbl9sb2NrKCZlcWwtPnF1ZXVlLmxvY2spOworCisJc2xhdmUgPSBfX2VxbF9zY2hlZHVsZV9zbGF2ZXMoJmVxbC0+cXVldWUpOworCWlmIChzbGF2ZSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2ID0gc2xhdmUtPmRldjsKKworCQlza2ItPmRldiA9IHNsYXZlX2RldjsKKwkJc2tiLT5wcmlvcml0eSA9IDE7CisJCXNsYXZlLT5ieXRlc19xdWV1ZWQgKz0gc2tiLT5sZW47IAorCQlkZXZfcXVldWVfeG1pdChza2IpOworCQllcWwtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwl9IGVsc2UgeworCQllcWwtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0JICAKKworCXNwaW5fdW5sb2NrKCZlcWwtPnF1ZXVlLmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIGVxbF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllcXVhbGl6ZXJfdCAqZXFsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJmVxbC0+c3RhdHM7Cit9CisKKy8qCisgKglQcml2YXRlIGlvY3RsIGZ1bmN0aW9ucworICovCisKKy8qIHF1ZXVlLT5sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIHNsYXZlX3QgKl9fZXFsX2ZpbmRfc2xhdmVfZGV2KHNsYXZlX3F1ZXVlX3QgKnF1ZXVlLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXMsICpoZWFkOworCisJaGVhZCA9ICZxdWV1ZS0+YWxsX3NsYXZlczsKKwlsaXN0X2Zvcl9lYWNoKHRoaXMsIGhlYWQpIHsKKwkJc2xhdmVfdCAqc2xhdmUgPSBsaXN0X2VudHJ5KHRoaXMsIHNsYXZlX3QsIGxpc3QpOworCisJCWlmIChzbGF2ZS0+ZGV2ID09IGRldikKKwkJCXJldHVybiBzbGF2ZTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXFsX2lzX2Z1bGwoc2xhdmVfcXVldWVfdCAqcXVldWUpCit7CisJZXF1YWxpemVyX3QgKmVxbCA9IG5ldGRldl9wcml2KHF1ZXVlLT5tYXN0ZXJfZGV2KTsKKworCWlmIChxdWV1ZS0+bnVtX3NsYXZlcyA+PSBlcWwtPm1heF9zbGF2ZXMpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKiBxdWV1ZS0+bG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyBpbnQgX19lcWxfaW5zZXJ0X3NsYXZlKHNsYXZlX3F1ZXVlX3QgKnF1ZXVlLCBzbGF2ZV90ICpzbGF2ZSkKK3sKKwlpZiAoIWVxbF9pc19mdWxsKHF1ZXVlKSkgeworCQlzbGF2ZV90ICpkdXBsaWNhdGVfc2xhdmUgPSBOVUxMOworCisJCWR1cGxpY2F0ZV9zbGF2ZSA9IF9fZXFsX2ZpbmRfc2xhdmVfZGV2KHF1ZXVlLCBzbGF2ZS0+ZGV2KTsKKwkJaWYgKGR1cGxpY2F0ZV9zbGF2ZSAhPSAwKQorCQkJZXFsX2tpbGxfb25lX3NsYXZlKGR1cGxpY2F0ZV9zbGF2ZSk7CisKKwkJbGlzdF9hZGQoJnNsYXZlLT5saXN0LCAmcXVldWUtPmFsbF9zbGF2ZXMpOworCQlxdWV1ZS0+bnVtX3NsYXZlcysrOworCQlzbGF2ZS0+ZGV2LT5mbGFncyB8PSBJRkZfU0xBVkU7CisKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK3N0YXRpYyBpbnQgZXFsX2Vuc2xhdmUoc3RydWN0IG5ldF9kZXZpY2UgKm1hc3Rlcl9kZXYsIHNsYXZpbmdfcmVxdWVzdF90IF9fdXNlciAqc3JxcCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2OworCXNsYXZpbmdfcmVxdWVzdF90IHNycTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc3JxLCBzcnFwLCBzaXplb2YgKHNsYXZpbmdfcmVxdWVzdF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc2xhdmVfZGV2ICA9IGRldl9nZXRfYnlfbmFtZShzcnEuc2xhdmVfbmFtZSk7CisJaWYgKHNsYXZlX2RldikgeworCQlpZiAoKG1hc3Rlcl9kZXYtPmZsYWdzICYgSUZGX1VQKSA9PSBJRkZfVVApIHsKKwkJCS8qIHNsYXZlIGlzIG5vdCBhIG1hc3RlciAmIG5vdCBhbHJlYWR5IGEgc2xhdmU6ICovCisJCQlpZiAoIWVxbF9pc19tYXN0ZXIoc2xhdmVfZGV2KSAmJgorCQkJICAgICFlcWxfaXNfc2xhdmUoc2xhdmVfZGV2KSkgeworCQkJCXNsYXZlX3QgKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCQkJCWVxdWFsaXplcl90ICplcWwgPSBuZXRkZXZfcHJpdihtYXN0ZXJfZGV2KTsKKwkJCQlpbnQgcmV0OworCisJCQkJaWYgKCFzKSB7CisJCQkJCWRldl9wdXQoc2xhdmVfZGV2KTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCisJCQkJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworCQkJCXMtPmRldiA9IHNsYXZlX2RldjsKKwkJCQlzLT5wcmlvcml0eSA9IHNycS5wcmlvcml0eTsKKwkJCQlzLT5wcmlvcml0eV9icHMgPSBzcnEucHJpb3JpdHk7CisJCQkJcy0+cHJpb3JpdHlfQnBzID0gc3JxLnByaW9yaXR5IC8gODsKKworCQkJCXNwaW5fbG9ja19iaCgmZXFsLT5xdWV1ZS5sb2NrKTsKKwkJCQlyZXQgPSBfX2VxbF9pbnNlcnRfc2xhdmUoJmVxbC0+cXVldWUsIHMpOworCQkJCWlmIChyZXQpIHsKKwkJCQkJZGV2X3B1dChzbGF2ZV9kZXYpOworCQkJCQlrZnJlZShzKTsKKwkJCQl9CisJCQkJc3Bpbl91bmxvY2tfYmgoJmVxbC0+cXVldWUubG9jayk7CisKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCWRldl9wdXQoc2xhdmVfZGV2KTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBlcWxfZW1hbmNpcGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbWFzdGVyX2Rldiwgc2xhdmluZ19yZXF1ZXN0X3QgX191c2VyICpzcnFwKQoreworCWVxdWFsaXplcl90ICplcWwgPSBuZXRkZXZfcHJpdihtYXN0ZXJfZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2OworCXNsYXZpbmdfcmVxdWVzdF90IHNycTsKKwlpbnQgcmV0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzcnEsIHNycXAsIHNpemVvZiAoc2xhdmluZ19yZXF1ZXN0X3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzbGF2ZV9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoc3JxLnNsYXZlX25hbWUpOworCXJldCA9IC1FSU5WQUw7CisJaWYgKHNsYXZlX2RldikgeworCQlzcGluX2xvY2tfYmgoJmVxbC0+cXVldWUubG9jayk7CisKKwkJaWYgKGVxbF9pc19zbGF2ZShzbGF2ZV9kZXYpKSB7CisJCQlzbGF2ZV90ICpzbGF2ZSA9IF9fZXFsX2ZpbmRfc2xhdmVfZGV2KCZlcWwtPnF1ZXVlLAorCQkJCQkJCSAgICAgIHNsYXZlX2Rldik7CisKKwkJCWlmIChzbGF2ZSkgeworCQkJCWVxbF9raWxsX29uZV9zbGF2ZShzbGF2ZSk7CisJCQkJcmV0ID0gMDsKKwkJCX0KKwkJfQorCQlkZXZfcHV0KHNsYXZlX2Rldik7CisKKwkJc3Bpbl91bmxvY2tfYmgoJmVxbC0+cXVldWUubG9jayk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlcWxfZ19zbGF2ZV9jZmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2xhdmVfY29uZmlnX3QgX191c2VyICpzY3ApCit7CisJZXF1YWxpemVyX3QgKmVxbCA9IG5ldGRldl9wcml2KGRldik7CisJc2xhdmVfdCAqc2xhdmU7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldjsKKwlzbGF2ZV9jb25maWdfdCBzYzsKKwlpbnQgcmV0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzYywgc2NwLCBzaXplb2YgKHNsYXZlX2NvbmZpZ190KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc2xhdmVfZGV2ID0gZGV2X2dldF9ieV9uYW1lKHNjLnNsYXZlX25hbWUpOworCWlmICghc2xhdmVfZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IC1FSU5WQUw7CisKKwlzcGluX2xvY2tfYmgoJmVxbC0+cXVldWUubG9jayk7CisJaWYgKGVxbF9pc19zbGF2ZShzbGF2ZV9kZXYpKSB7CisJCXNsYXZlID0gX19lcWxfZmluZF9zbGF2ZV9kZXYoJmVxbC0+cXVldWUsIHNsYXZlX2Rldik7CisJCWlmIChzbGF2ZSkgeworCQkJc2MucHJpb3JpdHkgPSBzbGF2ZS0+cHJpb3JpdHk7CisJCQlyZXQgPSAwOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2JoKCZlcWwtPnF1ZXVlLmxvY2spOworCisJZGV2X3B1dChzbGF2ZV9kZXYpOworCisJaWYgKCFyZXQgJiYgY29weV90b191c2VyKHNjcCwgJnNjLCBzaXplb2YgKHNsYXZlX2NvbmZpZ190KSkpCisJCXJldCA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVxbF9zX3NsYXZlX2NmZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzbGF2ZV9jb25maWdfdCBfX3VzZXIgKnNjcCkKK3sKKwlzbGF2ZV90ICpzbGF2ZTsKKwllcXVhbGl6ZXJfdCAqZXFsOworCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXY7CisJc2xhdmVfY29uZmlnX3Qgc2M7CisJaW50IHJldDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc2MsIHNjcCwgc2l6ZW9mIChzbGF2ZV9jb25maWdfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNsYXZlX2RldiA9IGRldl9nZXRfYnlfbmFtZShzYy5zbGF2ZV9uYW1lKTsKKwlpZiAoIXNsYXZlX2RldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSAtRUlOVkFMOworCisJZXFsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfYmgoJmVxbC0+cXVldWUubG9jayk7CisJaWYgKGVxbF9pc19zbGF2ZShzbGF2ZV9kZXYpKSB7CisJCXNsYXZlID0gX19lcWxfZmluZF9zbGF2ZV9kZXYoJmVxbC0+cXVldWUsIHNsYXZlX2Rldik7CisJCWlmIChzbGF2ZSkgeworCQkJc2xhdmUtPnByaW9yaXR5ID0gc2MucHJpb3JpdHk7CisJCQlzbGF2ZS0+cHJpb3JpdHlfYnBzID0gc2MucHJpb3JpdHk7CisJCQlzbGF2ZS0+cHJpb3JpdHlfQnBzID0gc2MucHJpb3JpdHkgLyA4OworCQkJcmV0ID0gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmZXFsLT5xdWV1ZS5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXFsX2dfbWFzdGVyX2NmZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBtYXN0ZXJfY29uZmlnX3QgX191c2VyICptY3ApCit7CisJZXF1YWxpemVyX3QgKmVxbDsKKwltYXN0ZXJfY29uZmlnX3QgbWM7CisKKwlpZiAoZXFsX2lzX21hc3RlcihkZXYpKSB7CisJCWVxbCA9IG5ldGRldl9wcml2KGRldik7CisJCW1jLm1heF9zbGF2ZXMgPSBlcWwtPm1heF9zbGF2ZXM7CisJCW1jLm1pbl9zbGF2ZXMgPSBlcWwtPm1pbl9zbGF2ZXM7CisJCWlmIChjb3B5X3RvX3VzZXIobWNwLCAmbWMsIHNpemVvZiAobWFzdGVyX2NvbmZpZ190KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGVxbF9zX21hc3Rlcl9jZmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbWFzdGVyX2NvbmZpZ190IF9fdXNlciAqbWNwKQoreworCWVxdWFsaXplcl90ICplcWw7CisJbWFzdGVyX2NvbmZpZ190IG1jOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZtYywgbWNwLCBzaXplb2YgKG1hc3Rlcl9jb25maWdfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChlcWxfaXNfbWFzdGVyKGRldikpIHsKKwkJZXFsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJZXFsLT5tYXhfc2xhdmVzID0gbWMubWF4X3NsYXZlczsKKwkJZXFsLT5taW5fc2xhdmVzID0gbWMubWluX3NsYXZlczsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9lcWw7CisKK3N0YXRpYyBpbnQgX19pbml0IGVxbF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCBlcnI7CisKKwlwcmludGsodmVyc2lvbik7CisKKwlkZXZfZXFsID0gYWxsb2NfbmV0ZGV2KHNpemVvZihlcXVhbGl6ZXJfdCksICJlcWwiLCBlcWxfc2V0dXApOworCWlmICghZGV2X2VxbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2X2VxbCk7CisJaWYgKGVycikgCisJCWZyZWVfbmV0ZGV2KGRldl9lcWwpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlcWxfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfZXFsKTsKKwlmcmVlX25ldGRldihkZXZfZXFsKTsKK30KKworbW9kdWxlX2luaXQoZXFsX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGVxbF9jbGVhbnVwX21vZHVsZSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lczMyMTAuYyBiL2RyaXZlcnMvbmV0L2VzMzIxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTgxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lczMyMTAuYwpAQCAtMCwwICsxLDQ3OCBAQAorLyoKKwllczMyMTAuYworCisJTGludXggZHJpdmVyIGZvciBSYWNhbC1JbnRlcmxhbiBFUzMyMTAgRUlTQSBOZXR3b3JrIEFkYXB0ZXIKKworCUNvcHlyaWdodCAoQykgMTk5NiwgUGF1bCBHb3J0bWFrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCUluZm9ybWF0aW9uIGFuZCBDb2RlIFNvdXJjZXM6CisKKwkxKSBUaGUgZXhpc3RpbmcgbXlyaWFkIG9mIExpbnV4IDgzOTAgZHJpdmVycyB3cml0dGVuIGJ5IERvbmFsZCBCZWNrZXIuCisKKwkyKSBPbmNlIGFnYWluIFJ1c3MgTmVsc29uJ3MgYXNtIHBhY2tldCBkcml2ZXIgcHJvdmlkZWQgYWRkaXRpb25hbCBpbmZvLgorCisJMykgSW5mbyBmb3IgZ2V0dGluZyBJUlEgYW5kIHNoLW1lbSBnbGVhbmVkIGZyb20gdGhlIEVJU0EgY2ZnIGZpbGVzLgorCSAgIFRvbyBiYWQgaXQgZG9lc24ndCB3b3JrIC0tIHNlZSBiZWxvdy4KKworCVRoZSBFUzMyMTAgaXMgYW4gRUlTQSBzaGFyZWQgbWVtb3J5IE5TODM5MCBpbXBsZW1lbnRhdGlvbi4gTm90ZQorCXRoYXQgYWxsIG1lbW9yeSBjb3BpZXMgdG8vZnJvbSB0aGUgYm9hcmQgbXVzdCBiZSAzMmJpdCB0cmFuc2ZlcnMuCisJV2hpY2ggcnVsZXMgb3V0IHVzaW5nIGV0aF9pb19jb3B5X2FuZF9zdW0oKSBpbiB0aGlzIGRyaXZlci4KKworCUFwcGFyZW50bHkgdGhlcmUgYXJlIHR3byBzbGlnaHRseSBkaWZmZXJlbnQgcmV2aXNpb25zIG9mIHRoZQorCWNhcmQsIHNpbmNlIHRoZXJlIGFyZSB0d28gZGlzdGluY3QgRUlTQSBjZmcgZmlsZXMgKCFyaWkwMTAxLmNmZworCWFuZCAhcmlpMDEwMi5jZmcpIE9uZSBoYXMgbWVkaWEgc2VsZWN0IGluIHRoZSBjZmcgZmlsZSBhbmQgdGhlCisJb3RoZXIgZG9lc24ndC4gSG9wZWZ1bGx5IHRoaXMgd2lsbCB3b3JrIHdpdGggZWl0aGVyLgorCisJVGhhdCBpcyBhYm91dCBhbGwgSSBjYW4gdGVsbCB5b3UgYWJvdXQgaXQsIGhhdmluZyBuZXZlciBhY3R1YWxseQorCWV2ZW4gc2VlbiBvbmUgb2YgdGhlc2UgY2FyZHMuIDopICBUcnkgaHR0cDovL3d3dy5pbnRlcmxhbi5jb20KKwlpZiB5b3Ugd2FudCBtb3JlIGluZm8uCisKKwlUaGFua3MgZ28gdG8gTWFyayBTYWxhemFyIGZvciB0ZXN0aW5nIHYwLjAyIG9mIHRoaXMgZHJpdmVyLgorCisJQnVncywgdG8tZml4LCBldGM6CisKKwkxKSBUaGUgRUlTQSBjZmcgcG9ydHMgdGhhdCBhcmUgKnN1cHBvc2VkKiB0byBoYXZlIHRoZSBJUlEgYW5kIHNoYXJlZAorCSAgIG1lbSB2YWx1ZXMganVzdCByZWFkIDB4ZmYgYWxsIHRoZSB0aW1lLiBIcnJtcGYuIEFwcGFyZW50bHkgdGhlCisJICAgc2FtZSBoYXBwZW5zIHdpdGggdGhlIHBhY2tldCBkcml2ZXIgYXMgdGhlIGNvZGUgZm9yIHJlYWRpbmcKKwkgICB0aGVzZSByZWdpc3RlcnMgaXMgZGlzYWJsZWQgdGhlcmUuIEluIHRoZSBtZWFudGltZSwgYm9vdCB3aXRoOgorCSAgIGV0aGVyPTxJUlE+LDAsMHg8c2hhcmVkX21lbV9hZGRyPixldGgwIHRvIG92ZXJyaWRlIHRoZSBJUlEgYW5kCisJICAgc2hhcmVkIG1lbW9yeSBkZXRlY3Rpb24uIChUaGUgaS9vIHBvcnQgZGV0ZWN0aW9uIGlzIG9rYXkuKQorCisJMikgTW9kdWxlIHN1cHBvcnQgY3VycmVudGx5IHVudGVzdGVkLiBQcm9iYWJseSB3b3JrcyB0aG91Z2guCisKKyovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisJImVzMzIxMC5jOiBEcml2ZXIgcmV2aXNpb24gdjAuMDMsIDE0LzA5Lzk2XG4iOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZWlzYS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKK3N0YXRpYyBpbnQgZXNfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworCitzdGF0aWMgaW50IGVzX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVzX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBlc19yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBlc19nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSk7CitzdGF0aWMgdm9pZCBlc19ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCBlc19ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKKworI2RlZmluZSBFU19TVEFSVF9QRwkweDAwICAgIC8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyCQkqLworI2RlZmluZSBFU19TVE9QX1BHCTB4NDAgICAgLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcJCSovCisKKyNkZWZpbmUgRVNfSU9fRVhURU5UCTB4MzcJLyogVGhlIGNmZyBmaWxlIHNheXMgMHhjOTAgLT4gMHhjYzcJKi8KKyNkZWZpbmUgRVNfSURfUE9SVAkweGM4MAkvKiBTYW1lIGZvciBhbGwgRUlTQSBjYXJkcyAJCSovCisjZGVmaW5lIEVTX1NBX1BST00JMHhjOTAJLyogU3RhcnQgb2YgZSduZXQgYWRkci4JCQkqLworI2RlZmluZSBFU19SRVNFVF9QT1JUCTB4Yzg0CS8qIEZyb20gdGhlIHBhY2tldCBkcml2ZXIgc291cmNlCSovCisjZGVmaW5lIEVTX05JQ19PRkZTRVQJMHhjYTAJLyogSGVsbG8sIHRoZSA4MzkwIGlzICpoZXJlKgkJKi8KKworI2RlZmluZSBFU19BRERSMAkweDAyCS8qIDMgYnl0ZSB2ZW5kb3IgcHJlZml4CQkJKi8KKyNkZWZpbmUgRVNfQUREUjEJMHgwNworI2RlZmluZSBFU19BRERSMgkweDAxCisKKy8qCisgKiBUd28gY2FyZCByZXZpc2lvbnMuIEVJU0EgSUQncyBhcmUgYWx3YXlzIHJldi4gbWlub3IsIHJldi4gbWFqb3IsLCBhbmQKKyAqIHRoZW4gdGhlIHRocmVlIHZlbmRvciBsZXR0ZXJzIHN0b3JlZCBpbiA1IGJpdHMgZWFjaCwgd2l0aCBhbiAiYSIgPSAxLgorICogRm9yIGVnOiAicmlpIiA9IDEwMDEwIDAxMDAxIDAxMDAxID0gMHg0OTI5LCB3aGljaCBpcyBob3cgdGhlIEVJU0EKKyAqIGNvbmZpZyB1dGlsaXR5IGRldGVybWluZXMgYXV0b21hZ2ljYWxseSB3aGF0IGNvbmZpZyBmaWxlKHMpIHRvIHVzZS4KKyAqLworI2RlZmluZSBFU19FSVNBX0lEMQkweDAxMDEyOTQ5CS8qICFyaWkwMTAxLmNmZyAJCSovCisjZGVmaW5lIEVTX0VJU0FfSUQyCTB4MDIwMTI5NDkJLyogIXJpaTAxMDIuY2ZnIAkJKi8KKworI2RlZmluZSBFU19DRkcxCQkweGNjMAkvKiBJT1BPUlQoMSkgLS0+IElPUE9SVCg2KSBpbiBjZmcgZmlsZQkqLworI2RlZmluZSBFU19DRkcyCQkweGNjMQorI2RlZmluZSBFU19DRkczCQkweGNjMgorI2RlZmluZSBFU19DRkc0CQkweGNjMworI2RlZmluZSBFU19DRkc1CQkweGNjNAorI2RlZmluZSBFU19DRkc2CQkweGM4NAkvKiBOQjogMHhjODQgaXMgYWxzbyAicmVzZXQiIHBvcnQuCSovCisKKy8qCisgKglZb3UgY2FuIE9SIGFueSBvZiB0aGUgZm9sbG93aW5nIGJpdHMgdG9nZXRoZXIgYW5kIGFzc2lnbiBpdAorICoJdG8gRVNfREVCVUcgdG8gZ2V0IHZlcmJvc2UgZHJpdmVyIGluZm8gZHVyaW5nIG9wZXJhdGlvbi4KKyAqCVNvbWUgb2YgdGhlc2UgZG9uJ3QgZG8gYW55dGhpbmcgeWV0LgorICovCisKKyNkZWZpbmUgRVNfRF9QUk9CRQkweDAxCisjZGVmaW5lIEVTX0RfUlhfUEtUCTB4MDIKKyNkZWZpbmUgRVNfRF9UWF9QS1QJMHgwNAorI2RlZmluZSBFRF9EX0lSUQkweDA4CisKKyNkZWZpbmUgRVNfREVCVUcJMAorCitzdGF0aWMgdW5zaWduZWQgY2hhciBsb19pcnFfbWFwW10gX19pbml0ZGF0YSA9IHszLCA0LCA1LCA2LCA3LCA5LCAxMH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBoaV9pcnFfbWFwW10gX19pbml0ZGF0YSA9IHsxMSwgMTIsIDAsIDE0LCAwLCAwLCAwLCAxNX07CisKKy8qCisgKglQcm9iZSBmb3IgdGhlIGNhcmQuIFRoZSBiZXN0IHdheSBpcyB0byByZWFkIHRoZSBFSVNBIElEIGlmIGl0CisgKglpcyBrbm93bi4gVGhlbiB3ZSBjaGVjayB0aGUgcHJlZml4IG9mIHRoZSBzdGF0aW9uIGFkZHJlc3MKKyAqCVBST00gZm9yIGEgbWF0Y2ggYWdhaW5zdCB0aGUgUmFjYWwtSW50ZXJsYW4gYXNzaWduZWQgdmFsdWUuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgZG9fZXNfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaXJxID0gZGV2LT5pcnE7CisJaW50IG1lbV9zdGFydCA9IGRldi0+bWVtX3N0YXJ0OworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKGlvYWRkciA+IDB4MWZmKQkJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQlyZXR1cm4gZXNfcHJvYmUxKGRldiwgaW9hZGRyKTsKKwllbHNlIGlmIChpb2FkZHIgPiAwKQkJLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCQlyZXR1cm4gLUVOWElPOworCisJaWYgKCFFSVNBX2J1cykgeworI2lmIEVTX0RFQlVHICYgRVNfRF9QUk9CRQorCQlwcmludGsoImVzMzIxMC5jOiBOb3QgRUlTQSBidXMuIE5vdCBwcm9iaW5nIGhpZ2ggcG9ydHMuXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIEVJU0Egc3BlYyBhbGxvd3MgZm9yIHVwIHRvIDE2IHNsb3RzLCBidXQgOCBpcyB0eXBpY2FsLiAqLworCWZvciAoaW9hZGRyID0gMHgxMDAwOyBpb2FkZHIgPCAweDkwMDA7IGlvYWRkciArPSAweDEwMDApIHsKKwkJaWYgKGVzX3Byb2JlMShkZXYsIGlvYWRkcikgPT0gMCkKKwkJCXJldHVybiAwOworCQlkZXYtPmlycSA9IGlycTsKKwkJZGV2LT5tZW1fc3RhcnQgPSBtZW1fc3RhcnQ7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFU19JT19FWFRFTlQpOworCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7Cit9CisKKyNpZm5kZWYgTU9EVUxFCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBlc19wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gZG9fZXNfcHJvYmUoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJY2xlYW51cF9jYXJkKGRldik7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGVzX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKQoreworCWludCBpLCByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBlaXNhX2lkOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIgKyBFU19TQV9QUk9NLCBFU19JT19FWFRFTlQsICJlczMyMTAiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKyNpZiBFU19ERUJVRyAmIEVTX0RfUFJPQkUKKwlwcmludGsoImVzMzIxMC5jOiBwcm9iZSBhdCAlI3gsIElEICUjOHhcbiIsIGlvYWRkciwgaW5sKGlvYWRkciArIEVTX0lEX1BPUlQpKTsKKwlwcmludGsoImVzMzIxMC5jOiBjb25maWcgcmVnczogJSN4ICUjeCAlI3ggJSN4ICUjeCAlI3hcbiIsCisJCWluYihpb2FkZHIgKyBFU19DRkcxKSwgaW5iKGlvYWRkciArIEVTX0NGRzIpLCBpbmIoaW9hZGRyICsgRVNfQ0ZHMyksCisJCWluYihpb2FkZHIgKyBFU19DRkc0KSwgaW5iKGlvYWRkciArIEVTX0NGRzUpLCBpbmIoaW9hZGRyICsgRVNfQ0ZHNikpOworI2VuZGlmCisKKworLyoJQ2hlY2sgdGhlIEVJU0EgSUQgb2YgdGhlIGNhcmQuICovCisJZWlzYV9pZCA9IGlubChpb2FkZHIgKyBFU19JRF9QT1JUKTsKKwlpZiAoKGVpc2FfaWQgIT0gRVNfRUlTQV9JRDEpICYmIChlaXNhX2lkICE9IEVTX0VJU0FfSUQyKSkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKy8qCUNoZWNrIHRoZSBSYWNhbCB2ZW5kb3IgSUQgYXMgd2VsbC4gKi8KKwlpZiAoaW5iKGlvYWRkciArIEVTX1NBX1BST00gKyAwKSAhPSBFU19BRERSMAorCQl8fCBpbmIoaW9hZGRyICsgRVNfU0FfUFJPTSArIDEpICE9IEVTX0FERFIxCisJCXx8IGluYihpb2FkZHIgKyBFU19TQV9QUk9NICsgMikgIT0gRVNfQUREUjIgKSB7CisJCXByaW50aygiZXMzMjEwLmM6IGNhcmQgbm90IGZvdW5kIik7CisJCWZvcihpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspCisJCQlwcmludGsoIiAlMDJ4IiwgaW5iKGlvYWRkciArIEVTX1NBX1BST00gKyBpKSk7CisJCXByaW50aygiIChpbnZhbGlkIHByZWZpeCkuXG4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJcHJpbnRrKCJlczMyMTAuYzogRVMzMjEwIHJldi4gJWxkIGF0ICUjeCwgbm9kZSIsIGVpc2FfaWQ+PjI0LCBpb2FkZHIpOworCWZvcihpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspCisJCXByaW50aygiICUwMngiLCAoZGV2LT5kZXZfYWRkcltpXSA9IGluYihpb2FkZHIgKyBFU19TQV9QUk9NICsgaSkpKTsKKworCS8qIFNuYXJmIHRoZSBpbnRlcnJ1cHQgbm93LiAqLworCWlmIChkZXYtPmlycSA9PSAwKSB7CisJCXVuc2lnbmVkIGNoYXIgaGlfaXJxID0gaW5iKGlvYWRkciArIEVTX0NGRzIpICYgMHgwNzsKKwkJdW5zaWduZWQgY2hhciBsb19pcnEgPSBpbmIoaW9hZGRyICsgRVNfQ0ZHMSkgJiAweGZlOworCisJCWlmIChoaV9pcnEgIT0gMCkgeworCQkJZGV2LT5pcnEgPSBoaV9pcnFfbWFwW2hpX2lycSAtIDFdOworCQl9IGVsc2UgeworCQkJaW50IGkgPSAwOworCQkJd2hpbGUgKGxvX2lycSA+ICgxPDxpKSkgaSsrOworCQkJZGV2LT5pcnEgPSBsb19pcnFfbWFwW2ldOworCQl9CisJCXByaW50aygiIHVzaW5nIElSUSAlZCIsIGRldi0+aXJxKTsKKyNpZiBFU19ERUJVRyAmIEVTX0RfUFJPQkUKKwkJcHJpbnRrKCJlczMyMTAuYzogaGlfaXJxICUjeCwgbG9faXJxICUjeCwgZGV2LT5pcnEgPSAlZFxuIiwKKwkJCQkJaGlfaXJxLCBsb19pcnEsIGRldi0+aXJxKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWlmIChkZXYtPmlycSA9PSAyKQorCQkJZGV2LT5pcnEgPSA5OwkJCS8qIERvaCEgKi8KKwkJcHJpbnRrKCIgYXNzaWduaW5nIElSUSAlZCIsIGRldi0+aXJxKTsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgImVzMzIxMCIsIGRldikpIHsKKwkJcHJpbnRrICgiIHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwgZGV2LT5pcnEpOworCQlyZXR2YWwgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZGV2LT5tZW1fc3RhcnQgPT0gMCkgeworCQl1bnNpZ25lZCBjaGFyIG1lbV9lbmFibGVkID0gaW5iKGlvYWRkciArIEVTX0NGRzIpICYgMHhjMDsKKwkJdW5zaWduZWQgY2hhciBtZW1fYml0cyA9IGluYihpb2FkZHIgKyBFU19DRkczKSAmIDB4MDc7CisKKwkJaWYgKG1lbV9lbmFibGVkICE9IDB4ODApIHsKKwkJCXByaW50aygiIHNoYXJlZCBtZW0gZGlzYWJsZWQgLSBnaXZpbmcgdXBcbiIpOworCQkJcmV0dmFsID0gLUVOWElPOworCQkJZ290byBvdXQxOworCQl9CisJCWRldi0+bWVtX3N0YXJ0ID0gMHhDMDAwMCArIG1lbV9iaXRzKjB4NDAwMDsKKwkJcHJpbnRrKCIgdXNpbmcgIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIgYXNzaWduaW5nICIpOworCX0KKworCWVpX3N0YXR1cy5tZW0gPSBpb3JlbWFwKGRldi0+bWVtX3N0YXJ0LCAoRVNfU1RPUF9QRyAtIEVTX1NUQVJUX1BHKSoyNTYpOworCWlmICghZWlfc3RhdHVzLm1lbSkgeworCQlwcmludGsoImlvcmVtYXAgZmFpbGVkIC0gZ2l2aW5nIHVwXG4iKTsKKwkJcmV0dmFsID0gLUVOWElPOworCQlnb3RvIG91dDE7CisJfQorCisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAoRVNfU1RPUF9QRyAtIEVTX1NUQVJUX1BHKSoyNTY7CisKKwlwcmludGsoIm1lbSAlI2x4LSUjbHhcbiIsIGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQtMSk7CisKKyNpZiBFU19ERUJVRyAmIEVTX0RfUFJPQkUKKwlpZiAoaW5iKGlvYWRkciArIEVTX0NGRzUpKQorCQlwcmludGsoImVzMzIxMDogV2FybmluZyAtIERNQSBjaGFubmVsIGVuYWJsZWQsIGJ1dCBub3QgdXNlZCBoZXJlLlxuIik7CisjZW5kaWYKKwkvKiBOb3RlLCBwb2ludCBhdCB0aGUgODM5MCwgYW5kIG5vdCB0aGUgY2FyZC4uLiAqLworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyICsgRVNfTklDX09GRlNFVDsKKworCWVpX3N0YXR1cy5uYW1lID0gIkVTMzIxMCI7CisJZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBFU19TVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IEVTX1NUQVJUX1BHICsgVFhfUEFHRVM7CisJZWlfc3RhdHVzLnN0b3BfcGFnZSA9IEVTX1NUT1BfUEc7CisJZWlfc3RhdHVzLndvcmQxNiA9IDE7CisKKwlpZiAoZWlfZGVidWcgPiAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwllaV9zdGF0dXMucmVzZXRfODM5MCA9ICZlc19yZXNldF84MzkwOworCWVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZlc19ibG9ja19pbnB1dDsKKwllaV9zdGF0dXMuYmxvY2tfb3V0cHV0ID0gJmVzX2Jsb2NrX291dHB1dDsKKwllaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJmVzX2dldF84MzkwX2hkcjsKKworCWRldi0+b3BlbiA9ICZlc19vcGVuOworCWRldi0+c3RvcCA9ICZlc19jbG9zZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCU5TODM5MF9pbml0KGRldiwgMCk7CisJcmV0dXJuIDA7CitvdXQxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciArIEVTX1NBX1BST00sIEVTX0lPX0VYVEVOVCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqCVJlc2V0IGFzIHBlciB0aGUgcGFja2V0IGRyaXZlciBtZXRob2QuIEp1ZGdpbmcgYnkgdGhlIEVJU0EgY2ZnCisgKglmaWxlLCB0aGlzIGp1c3QgdG9nZ2xlcyB0aGUgIkJvYXJkIEVuYWJsZSIgYml0cyAoYml0IDIgYW5kIDApLgorICovCisKK3N0YXRpYyB2b2lkIGVzX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGVuZDsKKworCW91dGIoMHgwNCwgaW9hZGRyICsgRVNfUkVTRVRfUE9SVCk7CisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCIlczogcmVzZXR0aW5nIHRoZSBFUzMyMTAuLi4iLCBkZXYtPm5hbWUpOworCisJZW5kID0gamlmZmllcyArIDIqSFovMTAwOworICAgICAgICB3aGlsZSAoKHNpZ25lZCkoZW5kIC0gamlmZmllcykgPiAwKSBjb250aW51ZTsKKworCWVpX3N0YXR1cy50eGluZyA9IDA7CisJb3V0YigweDAxLCBpb2FkZHIgKyBFU19SRVNFVF9QT1JUKTsKKwlpZiAoZWlfZGVidWcgPiAxKSBwcmludGsoInJlc2V0IGRvbmVcbiIpOworCisJcmV0dXJuOworfQorCisvKgorICoJTm90ZTogSW4gdGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMgaXMgdGhlIGltcGxpY2l0IGFzc3VtcHRpb24KKyAqCXRoYXQgdGhlIGFzc29jaWF0ZWQgbWVtY3B5IHdpbGwgb25seSB1c2UgInJlcDsgbW92c2wiIGFzIGxvbmcgYXMKKyAqCXdlIGtlZXAgdGhlIGNvdW50cyBhcyBzb21lIG11bHRpcGxlIG9mIGRvdWJsZXdvcmRzLiBUaGlzIGlzIGEKKyAqCXJlcXVpcmVtZW50IG9mIHRoZSBoYXJkd2FyZSwgYW5kIGFsc28gcHJldmVudHMgdXMgZnJvbSB1c2luZworICoJZXRoX2lvX2NvcHlfYW5kX3N1bSgpIHNpbmNlIHdlIGNhbid0IGd1YXJhbnRlZSBpdCB3aWxsIGxpbWl0CisgKglpdHNlbGYgdG8gZG91Ymxld29yZCBhY2Nlc3MuCisgKi8KKworLyoKKyAqCUdyYWIgdGhlIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiBTaW1pbGFyIHRvIHRoZSBibG9ja19pbnB1dCByb3V0aW5lLCBidXQKKyAqCXdlIGRvbid0IG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGggcmluZyB3cmFwIGFzIHRoZSBoZWFkZXIgd2lsbCBiZSBhdAorICoJdGhlIHN0YXJ0IG9mIGEgcGFnZSwgc28gd2Ugb3B0aW1pemUgYWNjb3JkaW5nbHkuIChBIHNpbmdsZSBkb3VibGV3b3JkLikKKyAqLworCitzdGF0aWMgdm9pZAorZXNfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpCit7CisJdm9pZCBfX2lvbWVtICpoZHJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgKChyaW5nX3BhZ2UgLSBFU19TVEFSVF9QRyk8PDgpOworCW1lbWNweV9mcm9taW8oaGRyLCBoZHJfc3RhcnQsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworCWhkci0+Y291bnQgPSAoaGRyLT5jb3VudCArIDMpICYgfjM7ICAgICAvKiBSb3VuZCB1cCBhbGxvY2F0aW9uLiAqLworfQorCisvKgorICoJQmxvY2sgaW5wdXQgYW5kIG91dHB1dCBhcmUgZWFzeSBvbiBzaGFyZWQgbWVtb3J5IGV0aGVyY2FyZHMsIHRoZSBvbmx5CisgKgljb21wbGljYXRpb24gaXMgd2hlbiB0aGUgcmluZyBidWZmZXIgd3JhcHMuIFRoZSBjb3VudCB3aWxsIGFscmVhZHkKKyAqCWJlIHJvdW5kZWQgdXAgdG8gYSBkb3VibGV3b3JkIHZhbHVlIHZpYSBlc19nZXRfODM5MF9oZHIoKSBhYm92ZS4KKyAqLworCitzdGF0aWMgdm9pZCBlc19ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkgIGludCByaW5nX29mZnNldCkKK3sKKwl2b2lkIF9faW9tZW0gKnhmZXJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgcmluZ19vZmZzZXQgLSBFU19TVEFSVF9QRyoyNTY7CisKKwlpZiAocmluZ19vZmZzZXQgKyBjb3VudCA+IEVTX1NUT1BfUEcqMjU2KSB7CisJCS8qIFBhY2tldCB3cmFwcyBvdmVyIGVuZCBvZiByaW5nIGJ1ZmZlci4gKi8KKwkJaW50IHNlbWlfY291bnQgPSBFU19TVE9QX1BHKjI1NiAtIHJpbmdfb2Zmc2V0OworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgeGZlcl9zdGFydCwgc2VtaV9jb3VudCk7CisJCWNvdW50IC09IHNlbWlfY291bnQ7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgc2VtaV9jb3VudCwgZWlfc3RhdHVzLm1lbSwgY291bnQpOworCX0gZWxzZSB7CisJCS8qIFBhY2tldCBpcyBpbiBvbmUgY2h1bmsuICovCisJCWV0aF9pb19jb3B5X2FuZF9zdW0oc2tiLCB4ZmVyX3N0YXJ0LCBjb3VudCwgMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlc19ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHN0YXJ0X3BhZ2UpCit7CisJdm9pZCBfX2lvbWVtICpzaG1lbSA9IGVpX3N0YXR1cy5tZW0gKyAoKHN0YXJ0X3BhZ2UgLSBFU19TVEFSVF9QRyk8PDgpOworCisJY291bnQgPSAoY291bnQgKyAzKSAmIH4zOyAgICAgLyogUm91bmQgdXAgdG8gZG91Ymxld29yZCAqLworCW1lbWNweV90b2lvKHNobWVtLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGludCBlc19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZWlfb3BlbihkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVzX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsoIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZC5cbiIsIGRldi0+bmFtZSk7CisKKwllaV9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIE1BWF9FU19DQVJEUwk0CS8qIE1heCBudW1iZXIgb2YgRVMzMjEwIGNhcmRzIHBlciBtb2R1bGUgKi8KKyNkZWZpbmUgTkFNRUxFTgkJOAkvKiAjIG9mIGNoYXJzIGZvciBzdG9yaW5nIGRldi0+bmFtZSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfZXMzMjEwW01BWF9FU19DQVJEU107CitzdGF0aWMgaW50IGlvW01BWF9FU19DQVJEU107CitzdGF0aWMgaW50IGlycVtNQVhfRVNfQ0FSRFNdOworc3RhdGljIGludCBtZW1bTUFYX0VTX0NBUkRTXTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShtZW0sIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGJhc2UgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIG51bWJlcihzKSIpOworTU9EVUxFX1BBUk1fREVTQyhtZW0sICJtZW1vcnkgYmFzZSBhZGRyZXNzKGVzKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSYWNhbC1JbnRlcmxhbiBFUzMyMTAgRUlTQSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworaW50Citpbml0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHRoaXNfZGV2LCBmb3VuZCA9IDA7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfRVNfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJaWYgKGlvW3RoaXNfZGV2XSA9PSAwICYmIHRoaXNfZGV2ICE9IDApCisJCQlicmVhazsKKwkJZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CisJCWRldi0+bWVtX3N0YXJ0ID0gbWVtW3RoaXNfZGV2XTsKKwkJaWYgKGRvX2VzX3Byb2JlKGRldikgPT0gMCkgeworCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCQlkZXZfZXMzMjEwW2ZvdW5kKytdID0gZGV2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY2xlYW51cF9jYXJkKGRldik7CisJCX0KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXMzMjEwLmM6IE5vIGVzMzIxMCBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsIGlvW3RoaXNfZGV2XSk7CisJCWJyZWFrOworCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiAtRU5YSU87Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0VTX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZXMzMjEwW3RoaXNfZGV2XTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoMTZpLmMgYi9kcml2ZXJzL25ldC9ldGgxNmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2FlNmJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoMTZpLmMKQEAgLTAsMCArMSwxNTA5IEBACisvKiBldGgxNmkuYyBBbiBJQ0wgRXRoZXJUZWFtIDE2aSBhbmQgMzIgRUlTQSBldGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4CisgICAKKyAgIFdyaXR0ZW4gMTk5NC0xOTk5IGJ5IE1pa2EgS3VvcHBhbGEKKyAgIAorICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTkgYnkgTWlrYSBLdW9wcGFsYQorICAgQmFzZWQgb24gc2tlbGV0b24uYyBhbmQgaGVhdmlseSBvbiBhdDE3MDAuYyBieSBEb25hbGQgQmVja2VyCisKKyAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAgIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyAgIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgbWlrdUBpa2kuZmkKKworICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgZm9sbG93aW5nIGNhcmRzIDoKKwktIElDTCBFdGhlclRlYW0gMTZpCisJLSBJQ0wgRXRoZXJUZWFtIDMyIEVJU0EgCisJICAoVXNlcyB0cnVlIDMyIGJpdCB0cmFuc2ZlcnMgcmF0aGVyIHRoYW4gMTZpIGNvbXBhYmlsaXR5IG1vZGUpCisKKyAgIEV4YW1wbGUgTW9kdWxlIHVzYWdlOgorICAgICAgICBpbnNtb2QgZXRoMTZpLm8gaW89MHgyYTAgbWVkaWF0eXBlPWJuYworCisJbWVkaWF0eXBlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogYm5jLHRwLGRpeCxhdXRvLGVwcm9tCisKKwknYXV0bycgd2lsbCB0cnkgdG8gYXV0b3Byb2JlIG1lZGlhdHlwZS4KKwknZXByb20nIHdpbGwgdXNlIHdoYXRldmVyIHR5cGUgZGVmaW5lZCBpbiBlcHJvbS4KKworICAgSSBoYXZlIGJlbmNobWFya2VkIGRyaXZlciB3aXRoIFBJSS8zMDBNaHogYXMgYSBmdHAgY2xpZW50CisgICBhbmQgNDg2LzMzTWh6IGFzIGEgZnRwIHNlcnZlci4gVG9wIHNwZWVkIHdhcyAxMTI4LjM3IGtpbG9ieXRlcy9zZWMuCisgICAKKyAgIFNvdXJjZXM6CisgICAgIC0gc2tlbGV0b24uYyAgYSBzYW1wbGUgbmV0d29yayBkcml2ZXIgY29yZSBmb3IgbGludXgsCisgICAgICAgd3JpdHRlbiBieSBEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPgorICAgICAtIGF0MTcwMC5jIGEgZHJpdmVyIGZvciBBbGxpZWQgVGVsZXNpcyBBVDE3MDAsIHdyaXR0ZW4gCisgICAgICAgYnkgRG9uYWxkIEJlY2tlci4KKyAgICAgLSBlMTZpU1JWLmFzbSBhIE5ldHdhcmUgMy5YIFNlcnZlciBEcml2ZXIgZm9yIElDTCBFdGhlclRlYW0xNmkKKyAgICAgICB3cml0dGVuIGJ5IE1hcmtrdSBWaWltYQorICAgICAtIFRoZSBGdWppdHN1IE1CODY5NjUgZGF0YWJvb2suCisgICAKKyAgIEF1dGhvciB0aGFua3MgZm9sbG93aW5nIHBlcnNvbnMgZHVlIHRvIHRoZWlyIHZhbHVlYmxlIGFzc2lzdGFuY2U6ICAgIAorICAgICAgICBNYXJra3UgVmlpbWEgKElDTCkKKwlBcmkgVmFsdmUgKElDTCkgICAgICAKKwlEb25hbGQgQmVja2VyCisJS3VydCBIdXdpZyA8a3VydEBodXdpZy5kZT4KKworICAgUmV2aXNpb24gaGlzdG9yeToKKworICAgVmVyc2lvbglEYXRlCQlEZXNjcmlwdGlvbgorICAgCisgICAwLjAxICAgICAgICAgMTUuMTItOTQgICAgICAgIEluaXRpYWwgdmVyc2lvbiAoY2FyZCBkZXRlY3Rpb24pCisgICAwLjAyICAgICAgICAgMjMuMDEtOTUgICAgICAgIEludGVycnVwdCBpcyBub3cgaG9va2VkIGNvcnJlY3RseQorICAgMC4wMyAgICAgICAgIDAxLjAyLTk1ICAgICAgICBSZXdyb3RlIGluaXRpYWxpemF0aW9uIHBhcnQKKyAgIDAuMDQgICAgICAgICAwNy4wMi05NSAgICAgICAgQmFzZSBza2VsZXRvbiBkb25lLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hZGUgYSBmZXcgY2hhbmdlcyB0byBzaWduYXR1cmUgY2hlY2tpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gbWFrZSBpdCBhIGJpdCByZWxpYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBmaXhlZCBidWcgaW4gdHhfYnVmIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBmaXhlZCBidWcgaW4gaW5pdGlhbGl6YXRpb24gKERMQ19FTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc24ndCBlbmFibGVkIHdoZW4gaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgZG9uZS4pCisgICAwLjA1ICAgICAgICAgMDguMDItOTUgICAgICAgIElmIHRoZXJlIHdlcmUgbW9yZSB0aGFuIG9uZSBwYWNrZXQgdG8gc2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXQgd2FzIGphbW1lZCBkdWUgdG8gaW52YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciB3cml0ZS4uLm5vdyBmaXhlZAorICAgMC4wNiAgICAgICAgIDE5LjAyLTk1ICAgICAgICBSZXdyb3RlIGludGVycnVwdCBoYW5kbGluZyAgICAgICAgCisgICAwLjA3ICAgICAgICAgMTMuMDQtOTUgICAgICAgIFdyb3RlIEVFUFJPTSByZWFkIHJvdXRpbmVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmQgY29uZmlndXJhdGlvbiBub3cgc2V0IGFjY29yZGluZyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHJlYWQgZnJvbSBFRVBST00KKyAgIDAuMDggICAgICAgICAyMy4wNi05NSAgICAgICAgV3JvdGUgcGFydCB0aGF0IHRyaWVzIHRvIHByb2JlIHVzZWQgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgaWYgQVVUTyBpcyBzZWxlY3RlZAorCisgICAwLjA5ICAgICAgICAgMDEuMDktOTUgICAgICAgIEFkZGVkIG1vZHVsZSBzdXBwb3J0CisgICAKKyAgIDAuMTAgICAgICAgICAwNC4wOS05NSAgICAgICAgRml4ZWQgcmVjZWl2ZSBwYWNrZXQgYWxsb2NhdGlvbiB0byB3b3JrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGgga2VybmVscyA+IDEuMy54CisgICAgICAKKyAgIDAuMjAJCTIwLjA5LTk1CUFkZGVkIHN1cHBvcnQgZm9yIEV0aGVyVGVhbTMyIEVJU0EJCisKKyAgIDAuMjEgICAgICAgICAxNy4xMC05NSAgICAgICAgUmVtb3ZlZCB0aGUgdW5uZWNlc3NhcnkgZXh0ZXJuIAorCQkJCWluaXRfZXRoZXJkZXYoKSBkZWNsYXJhdGlvbi4gU29tZQorCQkJCW90aGVyIGNsZWFudXBzLgorICAgCQkJCQorICAgMC4yMgkJMjIuMDItOTYJUmVjZWl2ZSBidWZmZXIgd2FzIG5vdCBmbHVzaGVkCisJCQkJY29ycmVjdGx5IHdoZW4gZmF1bHR5IHBhY2tldCB3YXMKKwkJCQlyZWNlaXZlZC4gTm93IGZpeGVkLgorCisgICAwLjIzCQkyNi4wMi05NglNYWRlIHJlc2V0dGluZyB0aGUgYWRhcHRlcgkKKwkJCSAJbW9yZSByZWxpYWJsZS4KKyAgIAorICAgMC4yNAkJMjcuMDItOTYJUmV3cm90ZSBmYXVsdHkgcGFja2V0IGhhbmRsaW5nIGluIGV0aDE2aV9yeAorCisgICAwLjI1CQkyMi4wNS05NglrZnJlZSgpIHdhcyBtaXNzaW5nIGZyb20gY2xlYW51cF9tb2R1bGUuCisKKyAgIDAuMjYJCTExLjA2LTk2CVNvbWV0aW1lcyBjYXJkIHdhcyBub3QgZm91bmQgYnkgCisJCQkJY2hlY2tfc2lnbmF0dXJlKCkuIE5vdyBtYWRlIG1vcmUgcmVsaWFibGUuCisgICAKKyAgIDAuMjcJCTIzLjA2LTk2CU9vcHMuIDE2IGNvbnNlY3V0aXZlIGNvbGxpc2lvbnMgaGFsdGVkIAorCQkJCWFkYXB0ZXIuIE5vdyB3aWxsIHRyeSB0byByZXRyYW5zbWl0IAorCQkJCU1BWF9DT0xfMTYgdGltZXMgYmVmb3JlIGZpbmFsbHkgZ2l2aW5nIHVwLgorICAgCisgICAwLjI4CSAgICAgICAgMjguMTAtOTcJQWRkZWQgZGV2X2lkIHBhcmFtZXRlciAoTlVMTCkgZm9yIGZyZWVfaXJxCisKKyAgIDAuMjkgICAgICAgICAyOS4xMC05NyAgICAgICAgTXVsdGlwbGUgY2FyZCBzdXBwb3J0IGZvciBtb2R1bGUgdXNlcnMKKworICAgMC4zMCAgICAgICAgIDMwLjEwLTk3ICAgICAgICBGaXhlZCBpcnEgYWxsb2NhdGlvbiBidWcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXF1ZXN0X2lycSBtb3ZlZCBmcm9tIHByb2JlIHRvIG9wZW4pCisKKyAgIDAuMzBhICAgICAgICAyMS4wOC05OCAgICAgICAgQ2FyZCBkZXRlY3Rpb24gbWFkZSBtb3JlIHJlbGF4ZWQuIERyaXZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWQgcHJvYmxlbXMgd2l0aCBzb21lIFRDUC9JUC1QUk9NIGJvb3RzCisJCQkJdG8gZmluZCB0aGUgY2FyZC4gU3VnZ2VzdGVkIGJ5IAorCQkJCUt1cnQgSHV3aWcgPGt1cnRAaHV3aWcuZGU+CisKKyAgIDAuMzEgICAgICAgICAyOC4wOC05OCAgICAgICAgTWVkaWEgaW50ZXJmYWNlIHBvcnQgY2FuIG5vdyBiZSBzZWxlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG1vZHVsZSBwYXJhbWV0ZXJzIG9yIGtlcm5lbAorCQkJCWJvb3QgcGFyYW1ldGVycy4gCisKKyAgIDAuMzIgICAgICAgICAzMS4wOC05OCAgICAgICAgSVJRIHdhcyBuZXZlciBmcmVlZCBpZiBvcGVuL2Nsb3NlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyIHdhc24ndCBjYWxsZWQuIE5vdyBmaXhlZC4KKyAgIAorICAgMC4zMyAgICAgICAgIDEwLjA5LTk4ICAgICAgICBXaGVuIGV0aDE2aV9vcGVuKCkgd2FzIGNhbGxlZCBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGgxNmlfY2xvc2UoKSBjaGlwIG5ldmVyIHJlY292ZXJlZC4KKwkJCQlOb3cgbW9yZSBzaGFsbG93IHJlc2V0IGlzIG1hZGUgb24KKwkJCQljbG9zZS4KKworICAgMC4zNCAgICAgICAgIDI5LjA2LTk5CUZpeGVkIG9uZSBiYWQgI2lmZGVmLgorCQkJCUNoYW5nZWQgaW9hZGRyIC0+IGlvIGZvciBjb25zaXN0ZW5jeQorCisgICAwLjM1ICAgICAgICAgMDEuMDctOTkgICAgICAgIHRyYW5zbWl0LC1yZWNlaXZlIGJ5dGVzIHdlcmUgbmV2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCBpbiBzdGF0cy4gCisKKyAgIEJ1Z3M6CisJSW4gc29tZSBjYXNlcyB0aGUgbWVkaWEgaW50ZXJmYWNlIGF1dG9wcm9iaW5nIGNvZGUgZG9lc24ndCBmaW5kIAorCXRoZSBjb3JyZWN0IGludGVyZmFjZSB0eXBlLiBJbiB0aGlzIGNhc2UgeW91IGNhbiAKKwltYW51YWxseSBjaG9vc2UgdGhlIGludGVyZmFjZSB0eXBlIGluIERPUyB3aXRoIEUxNklDLkVYRSB3aGljaCBpcyAKKwljb25maWd1cmF0aW9uIHNvZnR3YXJlIGZvciBFdGhlclRlYW0xNmkgYW5kIEV0aGVyVGVhbTMyIGNhcmRzLgorCVRoaXMgaXMgYWxzbyB0cnVlIGZvciBJUlEgc2V0dGluZy4gWW91IGNhbm5vdCB1c2UgbW9kdWxlCisJcGFyYW1ldGVyIHRvIGNvbmZpZ3VyZSBJUlEgb2YgdGhlIGNhcmQgKHlldCkuIAorCisgICBUbyBkbzoKKwktIFJlYWwgbXVsdGljYXN0IHN1cHBvcnQKKwktIFJld3JpdGUgdGhlIG1lZGlhIGludGVyZmFjZSBhdXRvcHJvYmluZyBjb2RlLiBJdHMgX2hvcnJpYmxlXyAhCisJLSBQb3NzaWJseSBtZXJnZSBhbGwgdGhlIE1CODY5NjUgc3BlY2lmaWMgY29kZSB0byBleHRlcm5hbAorCSAgbW9kdWxlIGZvciB1c2UgYnkgZXRoMTYuYyBhbmQgRG9uYWxkJ3MgYXQxNzAwLmMKKwktIElSUSBjb25maWd1cmF0aW9uIHdpdGggbW9kdWxlIHBhcmFtZXRlci4gSSB3aWxsIGRvCisJICB0aGlzIHdoZW4gaSB3aWxsIGdldCBlbm91Z2ggaW5mbyBhYm91dCBzZXR0aW5nCisJICBpcnEgd2l0aG91dCBjb25maWd1cmF0aW9uIHV0aWxpdHkuCisqLworCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9IAorICAgICJldGgxNmkuYzogdjAuMzUgMDEtSnVsLTE5OTkgTWlrYSBLdW9wcGFsYSAobWlrdUBpa2kuZmkpXG4iOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JCSAgCisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4JCSAgCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CQkgIAorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkJICAKKyNpbmNsdWRlIDxsaW51eC9pbi5oPgkJICAKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkgIAorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkJICAKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CQkgIAorI2luY2x1ZGUgPGFzbS9pby5oPgkJICAKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKworCisvKiBGZXcgbWFjcm9zICovCisjZGVmaW5lIEJJVChhKQkJICAgICAgICggKDEgPDwgKGEpKSApICAKKyNkZWZpbmUgQklUU0VUKGlvYWRkciwgYm51bSkgICAoKG91dGIoKChpbmIoaW9hZGRyKSkgfCAoYm51bSkpLCBpb2FkZHIpKSkgCisjZGVmaW5lIEJJVENMUihpb2FkZHIsIGJudW0pICAgKChvdXRiKCgoaW5iKGlvYWRkcikpICYgKH4oYm51bSkpKSwgaW9hZGRyKSkpCisKKy8qIFRoaXMgaXMgdGhlIEkvTyBhZGRyZXNzIHNwYWNlIGZvciBFdGhlcnRlYW0gMTZpIGFkYXB0ZXIuICovCisjZGVmaW5lIEVUSDE2SV9JT19FWFRFTlQgICAgICAgMzIKKworLyogVGlja3MgYmVmb3JlIGRlY2lkaW5nIHRoYXQgdHJhbnNtaXQgaGFzIHRpbWVkIG91dCAqLworI2RlZmluZSBUWF9USU1FT1VUICAgICAgICAgICAgICg0MDAqSFovMTAwMCkKKworLyogTWF4aW11bSBsb29wIGNvdW50IHdoZW4gcmVjZWl2aW5nIHBhY2tldHMgKi8KKyNkZWZpbmUgTUFYX1JYX0xPT1AgICAgICAgICAgICAyMAorCisvKiBTb21lIGludGVycnVwdCBtYXNrcyAqLworI2RlZmluZSBFVEgxNklfSU5UUl9PTgkgICAgICAgMHhlZjhhICAgICAgIC8qIEhpZ2hlciBpcyByZWNlaXZlIG1hc2sgKi8KKyNkZWZpbmUgRVRIMTZJX0lOVFJfT0ZGCSAgICAgICAweDAwMDAKKwkgCisvKiBCdWZmZXJzIGhlYWRlciBzdGF0dXMgYnl0ZSBtZWFuaW5ncyAqLworI2RlZmluZSBQS1RfR09PRCAgICAgICAgICAgICAgIEJJVCg1KQorI2RlZmluZSBQS1RfR09PRF9STVQgICAgICAgICAgIEJJVCg0KQorI2RlZmluZSBQS1RfU0hPUlQgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBQS1RfQUxJR05fRVJSICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBQS1RfQ1JDX0VSUiAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBQS1RfUlhfQlVGX09WRVJGTE9XICAgIEJJVCgwKQorCisvKiBUcmFuc21pdCBzdGF0dXMgcmVnaXN0ZXIgKERMQ1IwKSAqLworI2RlZmluZSBUWF9TVEFUVVNfUkVHICAgICAgICAgIDAKKyNkZWZpbmUgVFhfRE9ORSAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgTkVUX0JVU1kgICAgICAgICAgICAgICBCSVQoNikKKyNkZWZpbmUgVFhfUEtUX1JDRCAgICAgICAgICAgICBCSVQoNSkKKyNkZWZpbmUgQ1JfTE9TVCAgICAgICAgICAgICAgICBCSVQoNCkKKyNkZWZpbmUgVFhfSkFCQkVSX0VSUgkgICAgICAgQklUKDMpCisjZGVmaW5lIENPTExJU0lPTiAgICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIENPTExJU0lPTlNfMTYgICAgICAgICAgQklUKDEpCisKKy8qIFJlY2VpdmUgc3RhdHVzIHJlZ2lzdGVyIChETENSMSkgKi8KKyNkZWZpbmUgUlhfU1RBVFVTX1JFRyAgICAgICAgICAxCisjZGVmaW5lIFJYX1BLVCAgICAgICAgICAgICAgICAgQklUKDcpICAvKiBQYWNrZXQgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgQlVTX1JEX0VSUiAgICAgICAgICAgICBCSVQoNikKKyNkZWZpbmUgU0hPUlRfUEtUX0VSUiAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgQUxJR05fRVJSICAgICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgQ1JDX0VSUiAgICAgICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgUlhfQlVGX09WRVJGTE9XICAgICAgICBCSVQoMCkKKyAgICAgICAgICAgICAgCisvKiBUcmFuc21pdCBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIChETENSMikgKi8KKyNkZWZpbmUgVFhfSU5UUl9SRUcgICAgICAgICAgICAyCisjZGVmaW5lIFRYX0lOVFJfRE9ORSAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIFRYX0lOVFJfQ09MICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIFRYX0lOVFJfMTZfQ09MICAgICAgICAgQklUKDEpCisKKy8qIFJlY2VpdmUgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAoRExDUjMpICovCisjZGVmaW5lIFJYX0lOVFJfUkVHICAgICAgICAgICAgMworI2RlZmluZSBSWF9JTlRSX1JFQ0VJVkUgICAgICAgIEJJVCg3KQorI2RlZmluZSBSWF9JTlRSX1NIT1JUX1BLVCAgICAgIEJJVCgzKQorI2RlZmluZSBSWF9JTlRSX0NSQ19FUlIgICAgICAgIEJJVCgxKQorI2RlZmluZSBSWF9JTlRSX0JVRl9PVkVSRkxPVyAgIEJJVCgwKQorCisvKiBUcmFuc21pdCBNb2RlIFJlZ2lzdGVyIChETENSNCkgKi8KKyNkZWZpbmUgVFJBTlNNSVRfTU9ERV9SRUcgICAgICA0CisjZGVmaW5lIExPT1BCQUNLX0NPTlRST0wgICAgICAgQklUKDEpCisjZGVmaW5lIENPTlRST0xfT1VUUFVUICAgICAgICAgQklUKDIpCisKKy8qIFJlY2VpdmUgTW9kZSBSZWdpc3RlciAoRExDUjUpICovCisjZGVmaW5lIFJFQ0VJVkVfTU9ERV9SRUcgICAgICAgNQorI2RlZmluZSBSWF9CVUZGRVJfRU1QVFkgICAgICAgIEJJVCg2KQorI2RlZmluZSBBQ0NFUFRfQkFEX1BBQ0tFVFMgICAgIEJJVCg1KQorI2RlZmluZSBSRUNFSVZFX1NIT1JUX0FERFIgICAgIEJJVCg0KQorI2RlZmluZSBBQ0NFUFRfU0hPUlRfUEFDS0VUUyAgIEJJVCgzKQorI2RlZmluZSBSRU1PVEVfUkVTRVQgICAgICAgICAgIEJJVCgyKQorCisjZGVmaW5lIEFERFJFU1NfRklMVEVSX01PREUgICAgQklUKDEpIHwgQklUKDApCisjZGVmaW5lIFJFSkVDVF9BTEwgICAgICAgICAgICAgMAorI2RlZmluZSBBQ0NFUFRfQUxMICAgICAgICAgICAgIDMKKyNkZWZpbmUgTU9ERV8xICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgLyogTk9ERSBJRCwgQkMsIE1DLCAyLTI0dGggYml0ICovCisjZGVmaW5lIE1PREVfMiAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgIC8qIE5PREUgSUQsIEJDLCBNQywgSGFzaCBUYWJsZSAqLworCisvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDAgKERMQ1I2KSAqLworI2RlZmluZSBDT05GSUdfUkVHXzAgICAgICAgICAgIDYKKyNkZWZpbmUgRExDX0VOICAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgU1JBTV9DWUNMRV9USU1FXzEwME5TICBCSVQoNikKKyNkZWZpbmUgU1lTVEVNX0JVU19XSURUSF84ICAgICBCSVQoNSkgICAgICAgLyogMSA9IDhiaXQsIDAgPSAxNmJpdCAqLworI2RlZmluZSBCVUZGRVJfV0lEVEhfOCAgICAgICAgIEJJVCg0KSAgICAgICAvKiAxID0gOGJpdCwgMCA9IDE2Yml0ICovCisjZGVmaW5lIFRCUzEgICAgICAgICAgICAgICAgICAgQklUKDMpICAgICAgIAorI2RlZmluZSBUQlMwICAgICAgICAgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBTUkFNX0JTMSAgICAgICAgICAgICAgIEJJVCgxKSAgICAgICAvKiAwMD04a2IsICAwMT0xNmtiICAqLworI2RlZmluZSBTUkFNX0JTMCAgICAgICAgICAgICAgIEJJVCgwKSAgICAgICAvKiAxMD0zMmtiLCAxMT02NGtiICAqLworCisjaWZuZGVmIEVUSDE2SV9UWF9CVUZfU0laRSAgICAgICAgICAgICAgICAgICAvKiAwID0gMmtiLCAxID0gNGtiICAqLyAKKyNkZWZpbmUgRVRIMTZJX1RYX0JVRl9TSVpFICAgICAzICAgICAgICAgICAgIC8qIDIgPSA4a2IsIDMgPSAxNmtiICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBUWF9CVUZfMXgyMDQ4ICAgICAgICAgIDAKKyNkZWZpbmUgVFhfQlVGXzJ4MjA0OCAgICAgICAgICAxCisjZGVmaW5lIFRYX0JVRl8yeDQwOTggICAgICAgICAgMgorI2RlZmluZSBUWF9CVUZfMng4MTkyICAgICAgICAgIDMKKworLyogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxIChETENSNykgKi8KKyNkZWZpbmUgQ09ORklHX1JFR18xICAgICAgICAgICA3CisjZGVmaW5lIFBPV0VSVVAgICAgICAgICAgICAgICAgQklUKDUpCisKKy8qIFRyYW5zbWl0IHN0YXJ0IHJlZ2lzdGVyICovCisjZGVmaW5lIFRSQU5TTUlUX1NUQVJUX1JFRyAgICAgMTAKKyNkZWZpbmUgVFJBTlNNSVRfU1RBUlRfUkIgICAgICAyCisjZGVmaW5lIFRYX1NUQVJUICAgICAgICAgICAgICAgQklUKDcpICAgICAgIC8qIFJlc3Qgb2YgcmVnaXN0ZXIgYml0IGluZGljYXRlKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHBhY2tldHMgaW4gdHggYnVmZmVyKi8KKy8qIE5vZGUgSUQgcmVnaXN0ZXJzIChETENSOC0xMykgKi8KKyNkZWZpbmUgTk9ERV9JRF8wICAgICAgICAgICAgICA4CisjZGVmaW5lIE5PREVfSURfUkIgICAgICAgICAgICAgMAorCisvKiBIYXNoIFRhYmxlIHJlZ2lzdGVycyAoSFQ4LTE1KSAqLworI2RlZmluZSBIQVNIX1RBQkxFXzAgICAgICAgICAgIDgKKyNkZWZpbmUgSEFTSF9UQUJMRV9SQiAgICAgICAgICAxCisKKy8qIEJ1ZmZlciBtZW1vcnkgcG9ydHMgKi8KKyNkZWZpbmUgQlVGRkVSX01FTV9QT1JUX0xCICAgICA4CisjZGVmaW5lIERBVEFQT1JUICAgICAgICAgICAgICAgQlVGRkVSX01FTV9QT1JUX0xCCisjZGVmaW5lIEJVRkZFUl9NRU1fUE9SVF9IQiAgICAgOQorCisvKiAxNiBDb2xsaXNpb24gY29udHJvbCByZWdpc3RlciAoQk1QUjExKSAqLworI2RlZmluZSBDT0xfMTZfUkVHICAgICAgICAgICAgIDExCisjZGVmaW5lIEhBTFRfT05fMTYgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBSRVRSQU5TX0FORF9IQUxUX09OXzE2IDB4MDIKKworLyogTWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgdG8gc2VuZCBhZnRlciAxNiBjb25jZWN1dGl2ZSBjb2xsaXNpb25zICovCisjZGVmaW5lIE1BWF9DT0xfMTYJICAgICAgIDEwCisKKy8qIERNQSBCdXJzdCBhbmQgVHJhbnNjZWl2ZXIgTW9kZSBSZWdpc3RlciAoQk1QUjEzKSAqLworI2RlZmluZSBUUkFOU0NFSVZFUl9NT0RFX1JFRyAgIDEzCisjZGVmaW5lIFRSQU5TQ0VJVkVSX01PREVfUkIgICAgMiAgICAgICAgIAorI2RlZmluZSBJT19CQVNFX1VOTE9DSwkgICAgICAgQklUKDcpCisjZGVmaW5lIExPV0VSX1NRVUVMQ0hfVFJFU0ggICAgQklUKDYpCisjZGVmaW5lIExJTktfVEVTVF9ESVNBQkxFICAgICAgQklUKDUpCisjZGVmaW5lIEFVSV9TRUxFQ1QgICAgICAgICAgICAgQklUKDQpCisjZGVmaW5lIERJU19BVVRPX1BPUlRfU0VMICAgICAgQklUKDMpCisKKy8qIEZpbHRlciBTZWxmIFJlY2VpdmUgUmVnaXN0ZXIgKEJNUFIxNCkgICovCisjZGVmaW5lIEZJTFRFUl9TRUxGX1JYX1JFRyAgICAgMTQKKyNkZWZpbmUgU0tJUF9SWF9QQUNLRVQgICAgICAgICBCSVQoMikKKyNkZWZpbmUgRklMVEVSX1NFTEZfUkVDRUlWRSAgICBCSVQoMCkKKworLyogRUVQUk9NIENvbnRyb2wgUmVnaXN0ZXIgKEJNUFIgMTYpICovCisjZGVmaW5lIEVFUFJPTV9DVFJMX1JFRyAgICAgICAgMTYKKworLyogRUVQUk9NIERhdGEgUmVnaXN0ZXIgKEJNUFIgMTcpICovCisjZGVmaW5lIEVFUFJPTV9EQVRBX1JFRyAgICAgICAgMTcKKworLyogTk1DOTNDU3g2IEVFUFJPTSBDb250cm9sIEJpdHMgKi8KKyNkZWZpbmUgQ1NfMCAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIENTXzEgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBTS18wICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0tfMSAgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIERJXzAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBESV8xICAgICAgICAgICAgICAgICAgIDB4ODAKKworLyogTk1DOTNDU3g2IEVFUFJPTSBJbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgRUVQUk9NX1JFQUQgICAgICAgICAgICAweDgwCisKKy8qIE5NQzkzQ1N4NiBFRVBST00gQWRkcmVzc2VzICovCisjZGVmaW5lIEVfTk9ERUlEXzAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBFX05PREVJRF8xICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgRV9OT0RFSURfMiAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEVfUE9SVF9TRUxFQ1QgICAgICAgICAgMHgxNAorICAjZGVmaW5lIEVfUE9SVF9CTkMgICAgICAgICAgIDB4MDAKKyAgI2RlZmluZSBFX1BPUlRfRElYICAgICAgICAgICAweDAxCisgICNkZWZpbmUgRV9QT1JUX1RQICAgICAgICAgICAgMHgwMgorICAjZGVmaW5lIEVfUE9SVF9BVVRPICAgICAgICAgIDB4MDMKKyAgI2RlZmluZSBFX1BPUlRfRlJPTV9FUFJPTSAgICAweDA0CisjZGVmaW5lIEVfUFJPRFVDVF9DRkcgICAgICAgICAgMHgzMAorIAorCisvKiBNYWNybyB0byBzbG93IGRvd24gaW8gYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMgKi8KKyNkZWZpbmUgZWVwcm9tX3Nsb3dfaW8oKSBkbyB7IGludCBfaSA9IDQwOyB3aGlsZSgtLV9pID4gMCkgeyBpbmIoMHg4MCk7IH19d2hpbGUoMCkKKworLyogSnVtcGVybGVzcyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChCTVBSMTkpICovCisjZGVmaW5lIEpVTVBFUkxFU1NfQ09ORklHICAgICAgMTkKKworLyogSUQgUk9NIHJlZ2lzdGVycywgd3JpdGluZyB0byB0aGVtIGFsc28gcmVzZXRzIHNvbWUgcGFydHMgb2YgY2hpcCAqLworI2RlZmluZSBJRF9ST01fMCAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIElEX1JPTV83ICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgUkVTRVQgICAgICAgICAgICAgICAgICBJRF9ST01fMAorCisvKiBUaGlzIGlzIHRoZSBJL08gYWRkcmVzcyBsaXN0IHRvIGJlIHByb2JlZCB3aGVuIHNlZWtpbmcgdGhlIGNhcmQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXRoMTZpX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9IHsKKwkweDI2MCwgMHgyODAsIDB4MkEwLCAweDI0MCwgMHgzNDAsIDB4MzIwLCAweDM4MCwgMHgzMDAsIDAgCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGV0aDMyaV9wb3J0bGlzdFtdIF9faW5pdGRhdGEgPSB7IAorCTB4MTAwMCwgMHgyMDAwLCAweDMwMDAsIDB4NDAwMCwgMHg1MDAwLCAweDYwMDAsIDB4NzAwMCwgMHg4MDAwLAorCTB4OTAwMCwgMHhBMDAwLCAweEIwMDAsIDB4QzAwMCwgMHhEMDAwLCAweEUwMDAsIDB4RjAwMCwgMCAKK307CisKKy8qIFRoaXMgaXMgdGhlIEludGVycnVwdCBsb29rdXAgdGFibGUgZm9yIEV0aDE2aSBjYXJkICovCitzdGF0aWMgdW5zaWduZWQgaW50IGV0aDE2aV9pcnFtYXBbXSBfX2luaXRkYXRhID0geyA5LCAxMCwgNSwgMTUsIDAgfTsKKyNkZWZpbmUgTlVNX09GX0lTQV9JUlFTICAgIDQKKworLyogVGhpcyBpcyB0aGUgSW50ZXJydXB0IGxvb2t1cCB0YWJsZSBmb3IgRXRoMzJpIGNhcmQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXRoMzJpX2lycW1hcFtdIF9faW5pdGRhdGEgPSB7IDMsIDUsIDcsIDksIDEwLCAxMSwgMTIsIDE1LCAwIH07ICAKKyNkZWZpbmUgRUlTQV9JUlFfUkVHCTB4Yzg5CisjZGVmaW5lIE5VTV9PRl9FSVNBX0lSUVMgICA4CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXRoMTZpX3R4X2J1Zl9tYXBbXSA9IHsgMjA0OCwgMjA0OCwgNDA5NiwgODE5MiB9OworCisvKiBVc2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcgKi8KKyNpZm5kZWYgRVRIMTZJX0RFQlVHCisjZGVmaW5lIEVUSDE2SV9ERUJVRyAwCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXRoMTZpX2RlYnVnID0gRVRIMTZJX0RFQlVHOworCisvKiBJbmZvcm1hdGlvbiBmb3IgZWFjaCBib2FyZCAqLworCitzdHJ1Y3QgZXRoMTZpX2xvY2FsIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl1bnNpZ25lZCBjaGFyICAgICB0eF9zdGFydGVkOworCXVuc2lnbmVkIGNoYXIgICAgIHR4X2J1Zl9idXN5OworCXVuc2lnbmVkIHNob3J0ICAgIHR4X3F1ZXVlOyAgLyogTnVtYmVyIG9mIHBhY2tldHMgaW4gdHJhbnNtaXQgYnVmZmVyICovCisJdW5zaWduZWQgc2hvcnQgICAgdHhfcXVldWVfbGVuOyAgICAgICAgIAorCXVuc2lnbmVkIGludCAgICAgIHR4X2J1Zl9zaXplOworCXVuc2lnbmVkIGxvbmcgICAgIG9wZW5fdGltZTsKKwl1bnNpZ25lZCBsb25nICAgICB0eF9idWZmZXJlZF9wYWNrZXRzOworCXVuc2lnbmVkIGxvbmcgICAgIHR4X2J1ZmZlcmVkX2J5dGVzOworCXVuc2lnbmVkIGxvbmcgICAgIGNvbF8xNjsKKwlzcGlubG9ja190CSAgbG9jazsKK307CisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGludCAgICAgZXRoMTZpX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIGV0aDE2aV9jaGVja19zaWduYXR1cmUoaW50IGlvYWRkcik7CitzdGF0aWMgaW50ICAgICBldGgxNmlfcHJvYmVfcG9ydChpbnQgaW9hZGRyKTsKK3N0YXRpYyB2b2lkICAgIGV0aDE2aV9zZXRfcG9ydChpbnQgaW9hZGRyLCBpbnQgcG9ydHR5cGUpOworc3RhdGljIGludCAgICAgZXRoMTZpX3NlbmRfcHJvYmVfcGFja2V0KGludCBpb2FkZHIsIHVuc2lnbmVkIGNoYXIgKmIsIGludCBsKTsKK3N0YXRpYyBpbnQgICAgIGV0aDE2aV9yZWNlaXZlX3Byb2JlX3BhY2tldChpbnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIGV0aDE2aV9nZXRfaXJxKGludCBpb2FkZHIpOworc3RhdGljIGludCAgICAgZXRoMTZpX3JlYWRfZWVwcm9tKGludCBpb2FkZHIsIGludCBvZmZzZXQpOworc3RhdGljIGludCAgICAgZXRoMTZpX3JlYWRfZWVwcm9tX3dvcmQoaW50IGlvYWRkcik7CitzdGF0aWMgdm9pZCAgICBldGgxNmlfZWVwcm9tX2NtZChpbnQgaW9hZGRyLCB1bnNpZ25lZCBjaGFyIGNvbW1hbmQpOworc3RhdGljIGludCAgICAgZXRoMTZpX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBldGgxNmlfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBldGgxNmlfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBldGgxNmlfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBldGgxNmlfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBldGgxNmlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgICAgZXRoMTZpX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgZXRoMTZpX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBldGgxNmlfc2tpcF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBldGgxNmlfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOyAKK3N0YXRpYyB2b2lkICAgIGV0aDE2aV9zZWxlY3RfcmVnYmFuayh1bnNpZ25lZCBjaGFyIHJlZ2JhbmssIGludCBpb2FkZHIpOworc3RhdGljIHZvaWQgICAgZXRoMTZpX2luaXRpYWxpemUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJvb3QpOworCisjaWYgMAorc3RhdGljIGludCAgICAgZXRoMTZpX3NldF9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKworI2lmZGVmIE1PRFVMRQorc3RhdGljIHVzaG9ydCAgZXRoMTZpX3BhcnNlX21lZGlhdHlwZShjb25zdCBjaGFyKiBzKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmV0aDE2aV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBjaGFyIGNhcmRuYW1lW10gX19pbml0ZGF0YSA9ICJJQ0wgRXRoZXJUZWFtIDE2aS8zMiI7CisKK3N0YXRpYyBpbnQgX19pbml0IGRvX2V0aDE2aV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCWludCBpb2FkZHI7CisJaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIAorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmKGV0aDE2aV9kZWJ1ZyA+IDQpIAorCQlwcmludGsoS0VSTl9ERUJVRyAiUHJvYmluZyBzdGFydGVkIGZvciAlc1xuIiwgY2FyZG5hbWUpOworCisJaWYoYmFzZV9hZGRyID4gMHgxZmYpICAgICAgICAgICAvKiBDaGVjayBvbmx5IHNpbmdsZSBsb2NhdGlvbiAqLworCQlyZXR1cm4gZXRoMTZpX3Byb2JlMShkZXYsIGJhc2VfYWRkcik7CisJZWxzZSBpZihiYXNlX2FkZHIgIT0gMCkgICAgICAgICAvKiBEb24ndCBwcm9iZSBhdCBhbGwgKi8KKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qIFNlZWsgY2FyZCBmcm9tIHRoZSBJU0EgaW8gYWRkcmVzcyBzcGFjZSAqLworCWZvcihpID0gMDsgKGlvYWRkciA9IGV0aDE2aV9wb3J0bGlzdFtpXSkgOyBpKyspCisJCWlmKGV0aDE2aV9wcm9iZTEoZGV2LCBpb2FkZHIpID09IDApCisJCQlyZXR1cm4gMDsKKworCS8qIFNlZWsgY2FyZCBmcm9tIHRoZSBFSVNBIGlvIGFkZHJlc3Mgc3BhY2UgKi8KKwlmb3IoaSA9IDA7IChpb2FkZHIgPSBldGgzMmlfcG9ydGxpc3RbaV0pIDsgaSsrKQorCQlpZihldGgxNmlfcHJvYmUxKGRldiwgaW9hZGRyKSA9PSAwKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGV0aDE2aV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBldGgxNmlfbG9jYWwpKTsKKwlpbnQgZXJyOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwllcnIgPSBkb19ldGgxNmlfcHJvYmUoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVUSDE2SV9JT19FWFRFTlQpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBldGgxNmlfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJc3RydWN0IGV0aDE2aV9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisJaW50IHJldHZhbDsKKworCS8qIExldCdzIGdyYWIgdGhlIHJlZ2lvbiAqLworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBFVEgxNklfSU9fRVhURU5ULCBjYXJkbmFtZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKgorCSAgVGhlIE1CODY5ODUgY2hpcCBoYXMgb24gcmVnaXN0ZXIgd2hpY2ggaG9sZHMgaW5mb3JtYXRpb24gaW4gd2hpY2ggCisJICBpbyBhZGRyZXNzIHRoZSBjaGlwIGxpZXMuIEZpcnN0IHJlYWQgdGhpcyByZWdpc3RlciBhbmQgY29tcGFyZQorCSAgaXQgdG8gb3VyIGN1cnJlbnQgaW8gYWRkcmVzcyBhbmQgaWYgbWF0Y2ggdGhlbiB0aGlzIGNvdWxkCisJICBiZSBvdXIgY2hpcC4KKwkgICovCisKKwlpZihpb2FkZHIgPCAweDEwMDApIHsKKwkJaWYoZXRoMTZpX3BvcnRsaXN0WyhpbmIoaW9hZGRyICsgSlVNUEVSTEVTU19DT05GSUcpICYgMHgwNyldIAorCQkgICAhPSBpb2FkZHIpIHsKKwkJCXJldHZhbCA9IC1FTk9ERVY7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIE5vdyB3ZSB3aWxsIGdvIGEgYml0IGRlZXBlciBhbmQgdHJ5IHRvIGZpbmQgdGhlIGNoaXAncyBzaWduYXR1cmUgKi8KKworCWlmKGV0aDE2aV9jaGVja19zaWduYXR1cmUoaW9hZGRyKSAhPSAwKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCS8qIAorCSAgIE5vdyBpdCBzZWVtcyB0aGF0IHdlIGhhdmUgZm91bmQgYSBldGhlcm5ldCBjaGlwIGluIHRoaXMgcGFydGljdWxhcgorCSAgIGlvYWRkci4gVGhlIE1CODY5ODUgY2hpcCBoYXMgdGhpcyBmZWF0dXJlLCB0aGF0IHdoZW4geW91IHJlYWQgYSAKKwkgICBjZXJ0YWluIHJlZ2lzdGVyIGl0IHdpbGwgaW5jcmVhc2UgaXQncyBpbyBiYXNlIGFkZHJlc3MgdG8gbmV4dAorCSAgIGNvbmZpZ3VyYWJsZSBzbG90LiBOb3cgd2hlbiB3ZSBoYXZlIGZvdW5kIHRoZSBjaGlwLCBmaXJzdCB0aGluZyBpcworCSAgIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjaGlwJ3MgaW9hZGRyIHdpbGwgaG9sZCBzdGlsbCBoZXJlLgorCSAgICovCisKKwlldGgxNmlfc2VsZWN0X3JlZ2JhbmsoVFJBTlNDRUlWRVJfTU9ERV9SQiwgaW9hZGRyKTsKKwlvdXRiKDB4MDAsIGlvYWRkciArIFRSQU5TQ0VJVkVSX01PREVfUkVHKTsKKworCW91dGIoMHgwMCwgaW9hZGRyICsgUkVTRVQpOyAgICAgICAgICAgICAvKiBSZXNldCBzb21lIHBhcnRzIG9mIGNoaXAgKi8KKwlCSVRTRVQoaW9hZGRyICsgQ09ORklHX1JFR18wLCBCSVQoNykpOyAgLyogRGlzYWJsZSB0aGUgZGF0YSBsaW5rICovCisKKwlpZiggKGV0aDE2aV9kZWJ1ZyAmIHZlcnNpb25fcHJpbnRlZCsrKSA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBldGgxNmlfZ2V0X2lycShpb2FkZHIpOworCisJLyogVHJ5IHRvIG9idGFpbiBpbnRlcnJ1cHQgdmVjdG9yICovCisKKwlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAodm9pZCAqKSZldGgxNmlfaW50ZXJydXB0LCAwLCBjYXJkbmFtZSwgZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgYXQgJSMzeCwgYnV0IGlzIHVudXNhYmxlIGR1ZSB0byBjb25mbGljdGluZyBJUlEgJWQuXG4iLCAKKwkJICAgICAgIGNhcmRuYW1lLCBpb2FkZHIsIGRldi0+aXJxKTsKKwkJZ290byBvdXQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0ICUjM3gsIElSUSAlZCwgIiwKKwkgICAgICAgZGV2LT5uYW1lLCBjYXJkbmFtZSwgaW9hZGRyLCBkZXYtPmlycSk7CisKKworCS8qIE5vdyB3ZSB3aWxsIGhhdmUgdG8gbG9jayB0aGUgY2hpcCdzIGlvIGFkZHJlc3MgKi8KKwlldGgxNmlfc2VsZWN0X3JlZ2JhbmsoVFJBTlNDRUlWRVJfTU9ERV9SQiwgaW9hZGRyKTsKKwlvdXRiKDB4MzgsIGlvYWRkciArIFRSQU5TQ0VJVkVSX01PREVfUkVHKTsgCisKKwlldGgxNmlfaW5pdGlhbGl6ZShkZXYsIDEpOyAvKiBJbml0aWFsaXplIHJlc3Qgb2YgdGhlIGNoaXAncyByZWdpc3RlcnMgKi8KKworCS8qIE5vdyBsZXQncyBzYW1lIHNvbWUgZW5lcmd5IGJ5IHNodXR0aW5nIGRvd24gdGhlIGNoaXAgOykgKi8KKwlCSVRDTFIoaW9hZGRyICsgQ09ORklHX1JFR18xLCBQT1dFUlVQKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQobHAsIDAsIHNpemVvZihzdHJ1Y3QgZXRoMTZpX2xvY2FsKSk7CisJZGV2LT5vcGVuICAgICAgICAgICAgICAgPSBldGgxNmlfb3BlbjsKKwlkZXYtPnN0b3AgICAgICAgICAgICAgICA9IGV0aDE2aV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCAgICA9IGV0aDE2aV90eDsKKwlkZXYtPmdldF9zdGF0cyAgICAgICAgICA9IGV0aDE2aV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBldGgxNmlfbXVsdGljYXN0OworCWRldi0+dHhfdGltZW91dCAJPSBldGgxNmlfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gVFhfVElNRU9VVDsKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCXJldHVybiAwOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgRVRIMTZJX0lPX0VYVEVOVCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgdm9pZCBldGgxNmlfaW5pdGlhbGl6ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYm9vdCkKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGksIG5vZGVfdyA9IDA7CisJdW5zaWduZWQgY2hhciBub2RlX2J5dGUgPSAwOworCisJLyogU2V0dXAgc3RhdGlvbiBhZGRyZXNzICovCisJZXRoMTZpX3NlbGVjdF9yZWdiYW5rKE5PREVfSURfUkIsIGlvYWRkcik7CisJZm9yKGkgPSAwIDsgaSA8IDMgOyBpKyspIHsKKwkJdW5zaWduZWQgc2hvcnQgbm9kZV92YWwgPSBldGgxNmlfcmVhZF9lZXByb20oaW9hZGRyLCBFX05PREVJRF8wICsgaSk7CisJCSgodW5zaWduZWQgc2hvcnQgKilkZXYtPmRldl9hZGRyKVtpXSA9IG50b2hzKG5vZGVfdmFsKTsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCA2OyBpKyspIHsgCisJCW91dGIoICgodW5zaWduZWQgY2hhciAqKWRldi0+ZGV2X2FkZHIpW2ldLCBpb2FkZHIgKyBOT0RFX0lEXzAgKyBpKTsKKwkJaWYoYm9vdCkgeworCQkJcHJpbnRrKCIlMDJ4IiwgaW5iKGlvYWRkciArIE5PREVfSURfMCArIGkpKTsKKwkJCWlmKGkgIT0gNSkKKwkJCQlwcmludGsoIjoiKTsKKwkJfQorCX0KKworCS8qIE5vdyB3ZSB3aWxsIHNldCBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGFjY2VwdCBub25lICovCisJZXRoMTZpX3NlbGVjdF9yZWdiYW5rKEhBU0hfVEFCTEVfUkIsIGlvYWRkcik7CisJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSAKKwkJb3V0YigweDAwLCBpb2FkZHIgKyBIQVNIX1RBQkxFXzAgKyBpKTsKKworCS8qCisJICBOb3cgbGV0J3MgZGlzYWJsZSB0aGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyLCBzZXQgdGhlIGJ1ZmZlciByYW0gCisJICBjeWNsZSB0aW1lLCBidXMgd2lkdGggYW5kIGJ1ZmZlciBkYXRhIHBhdGggd2lkdGguIEFsc28gd2Ugc2hhbGwKKwkgIHNldCB0cmFuc21pdCBidWZmZXIgc2l6ZSBhbmQgdG90YWwgYnVmZmVyIHNpemUuCisJICAqLworCisJZXRoMTZpX3NlbGVjdF9yZWdiYW5rKDIsIGlvYWRkcik7CisKKwlub2RlX2J5dGUgPSAwOworCW5vZGVfdyA9IGV0aDE2aV9yZWFkX2VlcHJvbShpb2FkZHIsIEVfUFJPRFVDVF9DRkcpOworCisJaWYoIChub2RlX3cgJiAweEZGMDApID09IDB4MDgwMCkKKwkJbm9kZV9ieXRlIHw9IEJVRkZFUl9XSURUSF84OworCisJbm9kZV9ieXRlIHw9IFNSQU1fQlMxOworCisJaWYoIChub2RlX3cgJiAweDAwRkYpID09IDY0KQorCQlub2RlX2J5dGUgfD0gU1JBTV9CUzA7CisKKwlub2RlX2J5dGUgfD0gRExDX0VOIHwgU1JBTV9DWUNMRV9USU1FXzEwME5TIHwgKEVUSDE2SV9UWF9CVUZfU0laRSA8PCAyKTsKKworCW91dGIobm9kZV9ieXRlLCBpb2FkZHIgKyBDT05GSUdfUkVHXzApOworCisJLyogV2Ugc2hhbGwgaGFsdCB0aGUgdHJhbnNtaXR0aW5nLCBpZiAxNiBjb2xsaXNpb25zIGFyZSBkZXRlY3RlZCAqLworCW91dGIoSEFMVF9PTl8xNiwgaW9hZGRyICsgQ09MXzE2X1JFRyk7CisKKyNpZmRlZiBNT0RVTEUKKwkvKiBpZl9wb3J0IGFscmVhZHkgc2V0IGJ5IGluaXRfbW9kdWxlKCkgKi8KKyNlbHNlCisJZGV2LT5pZl9wb3J0ID0gKGRldi0+bWVtX3N0YXJ0IDwgRV9QT1JUX0ZST01fRVBST00pID8gCisJCWRldi0+bWVtX3N0YXJ0IDogRV9QT1JUX0ZST01fRVBST007CisjZW5kaWYKKworCS8qIFNldCBpbnRlcmZhY2UgcG9ydCB0eXBlICovCisJaWYoYm9vdCkgeworCQljaGFyICpwb3J0dHlwZVtdID0geyJCTkMiLCAiRElYIiwgIlRQIiwgIkFVVE8iLCAiRlJPTV9FUFJPTSIgfTsKKworCQlzd2l0Y2goZGV2LT5pZl9wb3J0KQorCQl7CisKKwkJY2FzZSBFX1BPUlRfRlJPTV9FUFJPTToKKwkJCWRldi0+aWZfcG9ydCA9IGV0aDE2aV9yZWFkX2VlcHJvbShpb2FkZHIsIEVfUE9SVF9TRUxFQ1QpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFX1BPUlRfQVVUTzoKKwkJCWRldi0+aWZfcG9ydCA9IGV0aDE2aV9wcm9iZV9wb3J0KGlvYWRkcik7CisJCQlicmVhazsKKwkJCQorCQljYXNlIEVfUE9SVF9CTkM6CisJCWNhc2UgRV9QT1JUX1RQOgorCQljYXNlIEVfUE9SVF9ESVg6CisJCQlicmVhazsKKwkJfQorCisJCXByaW50aygiICVzIGludGVyZmFjZS5cbiIsIHBvcnR0eXBlW2Rldi0+aWZfcG9ydF0pOworCisJCWV0aDE2aV9zZXRfcG9ydChpb2FkZHIsIGRldi0+aWZfcG9ydCk7CisJfQorCisJLyogU2V0IFJlY2VpdmUgTW9kZSB0byBub3JtYWwgb3BlcmF0aW9uICovCisJb3V0YihNT0RFXzIsIGlvYWRkciArIFJFQ0VJVkVfTU9ERV9SRUcpOworfQorCitzdGF0aWMgaW50IGV0aDE2aV9wcm9iZV9wb3J0KGludCBpb2FkZHIpCit7CisJaW50IGk7CisJaW50IHJldGNvZGU7CisJdW5zaWduZWQgY2hhciBkdW1teV9wYWNrZXRbNjRdOworCisJLyogUG93ZXJ1cCB0aGUgY2hpcCAqLworCW91dGIoMHhjMCB8IFBPV0VSVVAsIGlvYWRkciArIENPTkZJR19SRUdfMSk7CisKKwlCSVRTRVQoaW9hZGRyICsgQ09ORklHX1JFR18wLCBETENfRU4pOworCisJZXRoMTZpX3NlbGVjdF9yZWdiYW5rKE5PREVfSURfUkIsIGlvYWRkcik7CisKKwlmb3IoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJZHVtbXlfcGFja2V0W2ldID0gaW5iKGlvYWRkciArIE5PREVfSURfMCArIGkpOworCQlkdW1teV9wYWNrZXRbaSs2XSA9IGluYihpb2FkZHIgKyBOT0RFX0lEXzAgKyBpKTsKKwl9CisKKwlkdW1teV9wYWNrZXRbMTJdID0gMHgwMDsKKwlkdW1teV9wYWNrZXRbMTNdID0gMHgwNDsKKwltZW1zZXQoZHVtbXlfcGFja2V0ICsgMTQsIDAsIHNpemVvZihkdW1teV9wYWNrZXQpIC0gMTQpOworCisJZXRoMTZpX3NlbGVjdF9yZWdiYW5rKDIsIGlvYWRkcik7CisKKwlmb3IoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJQklUU0VUKGlvYWRkciArIENPTkZJR19SRUdfMCwgRExDX0VOKTsKKwkJQklUQ0xSKGlvYWRkciArIENPTkZJR19SRUdfMCwgRExDX0VOKTsKKwkJZXRoMTZpX3NldF9wb3J0KGlvYWRkciwgaSk7CisKKwkJaWYoZXRoMTZpX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICJTZXQgcG9ydCBudW1iZXIgJWRcbiIsIGkpOworCisJCXJldGNvZGUgPSBldGgxNmlfc2VuZF9wcm9iZV9wYWNrZXQoaW9hZGRyLCBkdW1teV9wYWNrZXQsIDY0KTsKKwkJaWYocmV0Y29kZSA9PSAwKSB7CisJCQlyZXRjb2RlID0gZXRoMTZpX3JlY2VpdmVfcHJvYmVfcGFja2V0KGlvYWRkcik7CisJCQlpZihyZXRjb2RlICE9IC0xKSB7CisJCQkJaWYoZXRoMTZpX2RlYnVnID4gMSkKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIkV0aDE2aSBpbnRlcmZhY2UgcG9ydCBmb3VuZCBhdCAlZFxuIiwgaSk7CisJCQkJcmV0dXJuIGk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlpZihldGgxNmlfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJUUkFOU01JVF9ET05FIHRpbWVvdXQgd2hlbiBwcm9iaW5nIGludGVyZmFjZSBwb3J0XG4iKTsKKwkJfQorCX0KKworCWlmKCBldGgxNmlfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiVXNpbmcgZGVmYXVsdCBwb3J0XG4iKTsKKworCXJldHVybiBFX1BPUlRfQk5DOworfQorCitzdGF0aWMgdm9pZCBldGgxNmlfc2V0X3BvcnQoaW50IGlvYWRkciwgaW50IHBvcnR0eXBlKQoreyAKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wID0gMDsKKworCWV0aDE2aV9zZWxlY3RfcmVnYmFuayhUUkFOU0NFSVZFUl9NT0RFX1JCLCBpb2FkZHIpOworCW91dGIoTE9PUEJBQ0tfQ09OVFJPTCwgaW9hZGRyICsgVFJBTlNNSVRfTU9ERV9SRUcpOworCisJdGVtcCB8PSBESVNfQVVUT19QT1JUX1NFTDsKKworCXN3aXRjaChwb3J0dHlwZSkgeworCisJY2FzZSBFX1BPUlRfQk5DIDoKKwkJdGVtcCB8PSBBVUlfU0VMRUNUOworCQlicmVhazsKKworCWNhc2UgRV9QT1JUX1RQIDoKKwkJYnJlYWs7CisKKwljYXNlIEVfUE9SVF9ESVggOgorCQl0ZW1wIHw9IEFVSV9TRUxFQ1Q7CisJCUJJVFNFVChpb2FkZHIgKyBUUkFOU01JVF9NT0RFX1JFRywgQ09OVFJPTF9PVVRQVVQpOworCQlicmVhazsKKwl9ICAKKworCW91dGIodGVtcCwgaW9hZGRyICsgVFJBTlNDRUlWRVJfTU9ERV9SRUcpOworCisJaWYoZXRoMTZpX2RlYnVnID4gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiVFJBTlNNSVRfTU9ERV9SRUcgPSAleFxuIiwgaW5iKGlvYWRkciArIFRSQU5TTUlUX01PREVfUkVHKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJUUkFOU0NFSVZFUl9NT0RFX1JFRyA9ICV4XG4iLCAKKwkJICAgICAgIGluYihpb2FkZHIrVFJBTlNDRUlWRVJfTU9ERV9SRUcpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXRoMTZpX3NlbmRfcHJvYmVfcGFja2V0KGludCBpb2FkZHIsIHVuc2lnbmVkIGNoYXIgKmIsIGludCBsKQoreworCWludCBzdGFydHRpbWU7CisKKwlvdXRiKDB4ZmYsIGlvYWRkciArIFRYX1NUQVRVU19SRUcpOworCisJb3V0dyhsLCBpb2FkZHIgKyBEQVRBUE9SVCk7CisJb3V0c3coaW9hZGRyICsgREFUQVBPUlQsICh1bnNpZ25lZCBzaG9ydCAqKWIsIChsICsgMSkgPj4gMSk7ICAKKworCXN0YXJ0dGltZSA9IGppZmZpZXM7CisJb3V0YihUWF9TVEFSVCB8IDEsIGlvYWRkciArIFRSQU5TTUlUX1NUQVJUX1JFRyk7IAorCisJd2hpbGUoIChpbmIoaW9hZGRyICsgVFhfU1RBVFVTX1JFRykgJiAweDgwKSA9PSAwKSB7CisJCWlmKCAoamlmZmllcyAtIHN0YXJ0dGltZSkgPiBUWF9USU1FT1VUKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGgxNmlfcmVjZWl2ZV9wcm9iZV9wYWNrZXQoaW50IGlvYWRkcikKK3sKKwlpbnQgc3RhcnR0aW1lOworCisJc3RhcnR0aW1lID0gamlmZmllczsKKworCXdoaWxlKChpbmIoaW9hZGRyICsgVFhfU1RBVFVTX1JFRykgJiAweDIwKSA9PSAwKSB7CisJCWlmKCAoamlmZmllcyAtIHN0YXJ0dGltZSkgPiBUWF9USU1FT1VUKSB7CisKKwkJCWlmKGV0aDE2aV9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRpbWVvdXQgb2NjdXJyZWQgd2FpdGluZyB0cmFuc21pdCBwYWNrZXQgcmVjZWl2ZWRcbiIpOworCQkJc3RhcnR0aW1lID0gamlmZmllczsKKwkJCXdoaWxlKChpbmIoaW9hZGRyICsgUlhfU1RBVFVTX1JFRykgJiAweDgwKSA9PSAwKSB7CisJCQkJaWYoIChqaWZmaWVzIC0gc3RhcnR0aW1lKSA+IFRYX1RJTUVPVVQpIHsKKwkJCQkJaWYoZXRoMTZpX2RlYnVnID4gMSkKKwkJCQkJCXByaW50ayhLRVJOX0RFQlVHICJUaW1lb3V0IG9jY3VycmVkIHdhaXRpbmcgcmVjZWl2ZSBwYWNrZXRcbiIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfQorCisJCQlpZihldGgxNmlfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJSRUNFSVZFX1BBQ0tFVFxuIik7CisJCQlyZXR1cm4oMCk7IC8qIEZvdW5kIHJlY2VpdmUgcGFja2V0ICovCisJCX0KKwl9CisKKwlpZihldGgxNmlfZGVidWcgPiAxKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJUUkFOU01JVF9QQUNLRVRfUkVDRUlWRUQgJXhcbiIsIGluYihpb2FkZHIgKyBUWF9TVEFUVVNfUkVHKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJSWF9TVEFUVVNfUkVHID0gJXhcbiIsIGluYihpb2FkZHIgKyBSWF9TVEFUVVNfUkVHKSk7CisJfQorCisJcmV0dXJuKDApOyAvKiBSZXR1cm4gc3VjY2VzcyAqLworfQorCisjaWYgMAorc3RhdGljIGludCBldGgxNmlfc2V0X2lycShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCWNvbnN0IGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwljb25zdCBpbnQgaXJxID0gZGV2LT5pcnE7CisJaW50IGkgPSAwOworCisJaWYoaW9hZGRyIDwgMHgxMDAwKSB7CQkKKwkJd2hpbGUoZXRoMTZpX2lycW1hcFtpXSAmJiBldGgxNmlfaXJxbWFwW2ldICE9IGlycSkKKwkJCWkrKzsKKwkKKwkJaWYoaSA8IE5VTV9PRl9JU0FfSVJRUykgeworCQkJdTggY2J5dGUgPSBpbmIoaW9hZGRyICsgSlVNUEVSTEVTU19DT05GSUcpOworCQkJY2J5dGUgPSAoY2J5dGUgJiAweDNGKSB8IChpIDw8IDYpOworCQkJb3V0YihjYnl0ZSwgaW9hZGRyICsgSlVNUEVSTEVTU19DT05GSUcpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZWxzZSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IEVJU0EgSW50ZXJydXB0IGNhbm5vdCBiZSBzZXQuIFVzZSBFSVNBIENvbmZpZ3VyYXRpb24gdXRpbGl0eS5cbiIsIGRldi0+bmFtZSk7CisJfQorCQorCXJldHVybiAtMTsKKworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGV0aDE2aV9nZXRfaXJxKGludCBpb2FkZHIpCit7CisJdW5zaWduZWQgY2hhciBjYnl0ZTsKKworCWlmKCBpb2FkZHIgPCAweDEwMDApIHsKKwkJY2J5dGUgPSBpbmIoaW9hZGRyICsgSlVNUEVSTEVTU19DT05GSUcpOworCQlyZXR1cm4oIGV0aDE2aV9pcnFtYXBbICgoY2J5dGUgJiAweEMwKSA+PiA2KSBdICk7CisJfSBlbHNlIHsgIC8qIE9oLi50aGUgY2FyZCBpcyBFSVNBIHNvIG1ldGhvZCBnZXR0aW5nIElSUSBkaWZmZXJlbnQgKi8KKwkJdW5zaWduZWQgc2hvcnQgaW5kZXggPSAwOworCQljYnl0ZSA9IGluYihpb2FkZHIgKyBFSVNBX0lSUV9SRUcpOworCQl3aGlsZSggKGNieXRlICYgMHgwMSkgPT0gMCkgeworCQkJY2J5dGUgPSBjYnl0ZSA+PiAxOworCQkJaW5kZXgrKzsKKwkJfQorCQlyZXR1cm4oIGV0aDMyaV9pcnFtYXBbIGluZGV4IF0gKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGV0aDE2aV9jaGVja19zaWduYXR1cmUoaW50IGlvYWRkcikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGNyZWdbNF0gPSB7IDAgfTsKKworCWZvcihpID0gMDsgaSA8IDQgOyBpKyspIHsKKworCQljcmVnW2ldID0gaW5iKGlvYWRkciArIFRSQU5TTUlUX01PREVfUkVHICsgaSk7CisKKwkJaWYoZXRoMTZpX2RlYnVnID4gMSkKKwkJCXByaW50aygiZXRoMTZpOiByZWFkIHNpZ25hdHVyZSBieXRlICV4IGF0ICV4XG4iLCAKKwkJCSAgICAgICBjcmVnW2ldLAorCQkJICAgICAgIGlvYWRkciArIFRSQU5TTUlUX01PREVfUkVHICsgaSk7CisJfQorCisJY3JlZ1swXSAmPSAweDBGOyAgICAgIC8qIE1hc2sgY29sbGlzaW9uIGNuciAqLworCWNyZWdbMl0gJj0gMHg3RjsgICAgICAvKiBNYXNrIERDTEVOIGJpdCAqLworCisjaWYgMAorCS8qIAorCSAgIFRoaXMgd2FzIHJlbW92ZWQgYmVjYXVzZSB0aGUgY2FyZCB3YXMgc29tZXRpbWVzIGxlZnQgdG8gc3RhdGUKKwkgICBmcm9tIHdoaWNoIGl0IGNvdWxkbid0IGJlIGZpbmQgYW55bW9yZS4gSWYgdGhlcmUgaXMgbmVlZAorCSAgIHRvIG1vcmUgc3RyaWN0IGNoZWNrIHN0aWxsIHRoaXMgaGF2ZSB0byBiZSBmaXhlZC4KKwkgICAqLworCWlmKCAhICgoY3JlZ1swXSA9PSAweDA2KSAmJiAoY3JlZ1sxXSA9PSAweDQxKSkgKSB7CisJCWlmKGNyZWdbMV0gIT0gMHg0MikKKwkJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKworCWlmKCAhKChjcmVnWzJdID09IDB4MzYpICYmIChjcmVnWzNdID09IDB4RTApKSApIHsKKwkJY3JlZ1syXSAmPSAweDQwOworCQljcmVnWzNdICY9IDB4MDM7CisJCQorCQlpZiggISgoY3JlZ1syXSA9PSAweDQwKSAmJiAoY3JlZ1szXSA9PSAweDAwKSkgKQorCQkJcmV0dXJuIC0xOworCX0KKwkKKwlpZihldGgxNmlfcmVhZF9lZXByb20oaW9hZGRyLCBFX05PREVJRF8wKSAhPSAwKQorCQlyZXR1cm4gLTE7CisJCisJaWYoKGV0aDE2aV9yZWFkX2VlcHJvbShpb2FkZHIsIEVfTk9ERUlEXzEpICYgMHhGRjAwKSAhPSAweDRCMDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV0aDE2aV9yZWFkX2VlcHJvbShpbnQgaW9hZGRyLCBpbnQgb2Zmc2V0KQoreworCWludCBkYXRhID0gMDsKKworCWV0aDE2aV9lZXByb21fY21kKGlvYWRkciwgRUVQUk9NX1JFQUQgfCBvZmZzZXQpOworCW91dGIoQ1NfMSwgaW9hZGRyICsgRUVQUk9NX0NUUkxfUkVHKTsKKwlkYXRhID0gZXRoMTZpX3JlYWRfZWVwcm9tX3dvcmQoaW9hZGRyKTsKKwlvdXRiKENTXzAgfCBTS18wLCBpb2FkZHIgKyBFRVBST01fQ1RSTF9SRUcpOworCisJcmV0dXJuKGRhdGEpOyAgCit9CisKK3N0YXRpYyBpbnQgZXRoMTZpX3JlYWRfZWVwcm9tX3dvcmQoaW50IGlvYWRkcikKK3sKKwlpbnQgaTsKKwlpbnQgZGF0YSA9IDA7CisgICAgIAorCWZvcihpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwkJb3V0YihDU18xIHwgU0tfMCwgaW9hZGRyICsgRUVQUk9NX0NUUkxfUkVHKTsKKwkJZWVwcm9tX3Nsb3dfaW8oKTsKKwkJb3V0YihDU18xIHwgU0tfMSwgaW9hZGRyICsgRUVQUk9NX0NUUkxfUkVHKTsKKwkJZWVwcm9tX3Nsb3dfaW8oKTsKKwkJZGF0YSA9IChkYXRhIDw8IDEpIHwgCisJCQkoKGluYihpb2FkZHIgKyBFRVBST01fREFUQV9SRUcpICYgRElfMSkgPyAxIDogMCk7CisJCQorCQllZXByb21fc2xvd19pbygpOworCX0KKworCXJldHVybihkYXRhKTsKK30KKworc3RhdGljIHZvaWQgZXRoMTZpX2VlcHJvbV9jbWQoaW50IGlvYWRkciwgdW5zaWduZWQgY2hhciBjb21tYW5kKQoreworCWludCBpOworCisJb3V0YihDU18wIHwgU0tfMCwgaW9hZGRyICsgRUVQUk9NX0NUUkxfUkVHKTsKKwlvdXRiKERJXzAsIGlvYWRkciArIEVFUFJPTV9EQVRBX1JFRyk7CisJb3V0YihDU18xIHwgU0tfMCwgaW9hZGRyICsgRUVQUk9NX0NUUkxfUkVHKTsKKwlvdXRiKERJXzEsIGlvYWRkciArIEVFUFJPTV9EQVRBX1JFRyk7CisJb3V0YihDU18xIHwgU0tfMSwgaW9hZGRyICsgRUVQUk9NX0NUUkxfUkVHKTsKKworCWZvcihpID0gNzsgaSA+PSAwOyBpLS0pIHsKKwkJc2hvcnQgY21kID0gKCAoY29tbWFuZCAmICgxIDw8IGkpKSA/IERJXzEgOiBESV8wICk7CisJCW91dGIoY21kLCBpb2FkZHIgKyBFRVBST01fREFUQV9SRUcpOworCQlvdXRiKENTXzEgfCBTS18wLCBpb2FkZHIgKyBFRVBST01fQ1RSTF9SRUcpOworCQllZXByb21fc2xvd19pbygpOworCQlvdXRiKENTXzEgfCBTS18xLCBpb2FkZHIgKyBFRVBST01fQ1RSTF9SRUcpOworCQllZXByb21fc2xvd19pbygpOworCX0gCit9CisKK3N0YXRpYyBpbnQgZXRoMTZpX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXRoMTZpX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCQorCS8qIFBvd2VydXAgdGhlIGNoaXAgKi8KKwlvdXRiKDB4YzAgfCBQT1dFUlVQLCBpb2FkZHIgKyBDT05GSUdfUkVHXzEpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY2hpcCAqLworCWV0aDE2aV9pbml0aWFsaXplKGRldiwgMCk7ICAKKworCS8qIFNldCB0aGUgdHJhbnNtaXQgYnVmZmVyIHNpemUgKi8KKwlscC0+dHhfYnVmX3NpemUgPSBldGgxNmlfdHhfYnVmX21hcFtFVEgxNklfVFhfQlVGX1NJWkUgJiAweDAzXTsKKworCWlmKGV0aDE2aV9kZWJ1ZyA+IDApCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHJhbnNtaXQgYnVmZmVyIHNpemUgJWRcbiIsIAorCQkgICAgICAgZGV2LT5uYW1lLCBscC0+dHhfYnVmX3NpemUpOworCisJLyogTm93IGVuYWJsZSBUcmFuc21pdHRlciBhbmQgUmVjZWl2ZXIgc2VjdGlvbnMgKi8KKwlCSVRDTFIoaW9hZGRyICsgQ09ORklHX1JFR18wLCBETENfRU4pOworCisJLyogTm93IHN3aXRjaCB0byByZWdpc3RlciBiYW5rIDIsIGZvciBydW4gdGltZSBvcGVyYXRpb24gKi8KKwlldGgxNmlfc2VsZWN0X3JlZ2JhbmsoMiwgaW9hZGRyKTsKKworCWxwLT5vcGVuX3RpbWUgPSBqaWZmaWVzOworCWxwLT50eF9zdGFydGVkID0gMDsKKwlscC0+dHhfcXVldWUgPSAwOworCWxwLT50eF9xdWV1ZV9sZW4gPSAwOworCisJLyogVHVybiBvbiBpbnRlcnJ1cHRzKi8KKwlvdXR3KEVUSDE2SV9JTlRSX09OLCBpb2FkZHIgKyBUWF9JTlRSX1JFRyk7ICAKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXRoMTZpX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0aDE2aV9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWV0aDE2aV9yZXNldChkZXYpOworCisJLyogVHVybiBvZmYgaW50ZXJydXB0cyovCisJb3V0dyhFVEgxNklfSU5UUl9PRkYsIGlvYWRkciArIFRYX0lOVFJfUkVHKTsgIAorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWxwLT5vcGVuX3RpbWUgPSAwOworCisJLyogRGlzYWJsZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSAqLworCUJJVFNFVChpb2FkZHIgKyBDT05GSUdfUkVHXzAsIERMQ19FTik7CisKKwkvKiBSZXNldCB0aGUgY2hpcCAqLworCS8qIG91dGIoMHhmZiwgaW9hZGRyICsgUkVTRVQpOyAqLworCS8qIG91dHcoMHhmZmZmLCBpb2FkZHIgKyBUWF9TVEFUVVNfUkVHKTsgICAgKi8KKwkKKwlvdXRiKDB4MDAsIGlvYWRkciArIENPTkZJR19SRUdfMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXRoMTZpX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXRoMTZpX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCS8qIAorCSAgIElmIHdlIGdldCBoZXJlLCBzb21lIGhpZ2hlciBsZXZlbCBoYXMgZGVjaWRlZCB0aGF0IAorCSAgIHdlIGFyZSBicm9rZW4uIFRoZXJlIHNob3VsZCByZWFsbHkgYmUgYSAia2ljayBtZSIgCisJICAgZnVuY3Rpb24gY2FsbCBpbnN0ZWFkLiAKKwkgICAqLworCisJb3V0dyhFVEgxNklfSU5UUl9PRkYsIGlvYWRkciArIFRYX0lOVFJfUkVHKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0IHdpdGggc3RhdHVzICUwNHgsICVzID9cbiIsIAorCSAgICAgICBkZXYtPm5hbWUsCisJaW53KGlvYWRkciArIFRYX1NUQVRVU19SRUcpLCAgKGluYihpb2FkZHIgKyBUWF9TVEFUVVNfUkVHKSAmIFRYX0RPTkUpID8gCisJCSAgICAgICAiSVJRIGNvbmZsaWN0IiA6ICJuZXR3b3JrIGNhYmxlIHByb2JsZW0iKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogTGV0J3MgZHVtcCBhbGwgcmVnaXN0ZXJzICovCisJaWYoZXRoMTZpX2RlYnVnID4gMCkgeyAKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0aW1lb3V0OiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnguXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBpbmIoaW9hZGRyICsgMCksIAorCQkgICAgICAgaW5iKGlvYWRkciArIDEpLCBpbmIoaW9hZGRyICsgMiksIAorCQkgICAgICAgaW5iKGlvYWRkciArIDMpLCBpbmIoaW9hZGRyICsgNCksIAorCQkgICAgICAgaW5iKGlvYWRkciArIDUpLAorCQkgICAgICAgaW5iKGlvYWRkciArIDYpLCBpbmIoaW9hZGRyICsgNykpOworCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHJhbnNtaXQgc3RhcnQgcmVnOiAlMDJ4LiBjb2xsaXNpb24gcmVnICUwMnhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGluYihpb2FkZHIgKyBUUkFOU01JVF9TVEFSVF9SRUcpLAorCQkgICAgICAgaW5iKGlvYWRkciArIENPTF8xNl9SRUcpKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJscC0+dHhfcXVldWUgPSAlZFxuIiwgbHAtPnR4X3F1ZXVlKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImxwLT50eF9xdWV1ZV9sZW4gPSAlZFxuIiwgbHAtPnR4X3F1ZXVlX2xlbik7CisJCXByaW50ayhLRVJOX0RFQlVHICJscC0+dHhfc3RhcnRlZCA9ICVkXG4iLCBscC0+dHhfc3RhcnRlZCk7CisJfQorCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwlldGgxNmlfcmVzZXQoZGV2KTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlvdXR3KEVUSDE2SV9JTlRSX09OLCBpb2FkZHIgKyBUWF9JTlRSX1JFRyk7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGV0aDE2aV90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBldGgxNmlfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHN0YXR1cyA9IDA7CisJdXNob3J0IGxlbmd0aCA9IHNrYi0+bGVuOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGxlbmd0aCA8IEVUSF9aTEVOKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWxlbmd0aCA9IEVUSF9aTEVOOworCX0KKwlidWYgPSBza2ItPmRhdGE7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQorCS8qIFR1cm4gb2ZmIFRYIGludGVycnVwdHMgKi8KKwlvdXR3KEVUSDE2SV9JTlRSX09GRiwgaW9hZGRyICsgVFhfSU5UUl9SRUcpOworCQorCS8qIFdlIHdvdWxkIGJlIGJldHRlciBkb2luZyB0aGUgZGlzYWJsZV9pcnEgdHJpY2tzIHRoZSAzYzUwOSBkb2VzLAorCSAgIHRoYXQgd291bGQgbWFrZSB0aGlzIHN1Y2sgYSBsb3QgbGVzcyAqLworCSAgIAorCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJaWYoIChsZW5ndGggKyAyKSA+IChscC0+dHhfYnVmX3NpemUgLSBscC0+dHhfcXVldWVfbGVuKSkgeworCQlpZihldGgxNmlfZGVidWcgPiAwKSAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCBidWZmZXIgZnVsbC5cbiIsIGRldi0+bmFtZSk7ICAKKwl9IAorCWVsc2UgeworCQlvdXR3KGxlbmd0aCwgaW9hZGRyICsgREFUQVBPUlQpOworCisJCWlmKCBpb2FkZHIgPCAweDEwMDAgKSAKKwkJCW91dHN3KGlvYWRkciArIERBVEFQT1JULCBidWYsIChsZW5ndGggKyAxKSA+PiAxKTsKKwkJZWxzZSB7CisJCQl1bnNpZ25lZCBjaGFyIGZyYWcgPSBsZW5ndGggJSA0OworCQkJb3V0c2woaW9hZGRyICsgREFUQVBPUlQsIGJ1ZiwgbGVuZ3RoID4+IDIpOworCQkJaWYoIGZyYWcgIT0gMCApIHsKKwkJCQlvdXRzdyhpb2FkZHIgKyBEQVRBUE9SVCwgKGJ1ZiArIChsZW5ndGggJiAweEZGRkMpKSwgMSk7CisJCQkJaWYoIGZyYWcgPT0gMyApIAorCQkJCQlvdXRzdyhpb2FkZHIgKyBEQVRBUE9SVCwgCisJCQkJCSAgICAgIChidWYgKyAobGVuZ3RoICYgMHhGRkZDKSArIDIpLCAxKTsKKwkJCX0KKwkJfQorCQlscC0+dHhfYnVmZmVyZWRfcGFja2V0cysrOworCQlscC0+dHhfYnVmZmVyZWRfYnl0ZXMgPSBsZW5ndGg7CisJCWxwLT50eF9xdWV1ZSsrOworCQlscC0+dHhfcXVldWVfbGVuICs9IGxlbmd0aCArIDI7CisJfQorCWxwLT50eF9idWZfYnVzeSA9IDA7CisKKwlpZihscC0+dHhfc3RhcnRlZCA9PSAwKSB7CisJCS8qIElmIHRoZSB0cmFuc21pdHRlciBpcyBpZGxlLi5hbHdheXMgdHJpZ2dlciBhIHRyYW5zbWl0ICovCisJCW91dGIoVFhfU1RBUlQgfCBscC0+dHhfcXVldWUsIGlvYWRkciArIFRSQU5TTUlUX1NUQVJUX1JFRyk7CisJCWxwLT50eF9xdWV1ZSA9IDA7CisJCWxwLT50eF9xdWV1ZV9sZW4gPSAwOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJbHAtPnR4X3N0YXJ0ZWQgPSAxOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCWVsc2UgaWYobHAtPnR4X3F1ZXVlX2xlbiA8IGxwLT50eF9idWZfc2l6ZSAtIChFVEhfRlJBTUVfTEVOICsgMikpIHsKKwkJLyogVGhlcmUgaXMgc3RpbGwgbW9yZSByb29tIGZvciBvbmUgbW9yZSBwYWNrZXQgaW4gdHggYnVmZmVyICovCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJCisJb3V0dyhFVEgxNklfSU5UUl9PTiwgaW9hZGRyICsgVFhfSU5UUl9SRUcpOworCS8qIFR1cm4gVFggaW50ZXJydXB0cyBiYWNrIG9uICovCisJLyogb3V0YihUWF9JTlRSX0RPTkUgfCBUWF9JTlRSXzE2X0NPTCwgaW9hZGRyICsgVFhfSU5UUl9SRUcpOyAqLworCXN0YXR1cyA9IDA7CisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBldGgxNmlfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXRoMTZpX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBib2d1c2NvdW50ID0gTUFYX1JYX0xPT1A7CisKKwkvKiBMb29wIHVudGlsIGFsbCBwYWNrZXRzIGhhdmUgYmVlbiByZWFkICovCisJd2hpbGUoIChpbmIoaW9hZGRyICsgUkVDRUlWRV9NT0RFX1JFRykgJiBSWF9CVUZGRVJfRU1QVFkpID09IDApIHsKKworCQkvKiBSZWFkIHN0YXR1cyBieXRlIGZyb20gcmVjZWl2ZSBidWZmZXIgKi8gCisJCXVzaG9ydCBzdGF0dXMgPSBpbncoaW9hZGRyICsgREFUQVBPUlQpOworCisJCS8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgcGFja2V0IGZyb20gcmVjZWl2ZSBidWZmZXIgKi8KKwkJdXNob3J0IHBrdF9sZW4gPSBpbncoaW9hZGRyICsgREFUQVBPUlQpOworCisJCWlmKGV0aDE2aV9kZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlY2VpdmluZyBwYWNrZXQgbW9kZSAlMDJ4IHN0YXR1cyAlMDR4LlxuIiwgCisJCQkgICAgICAgZGV2LT5uYW1lLCAKKwkJCSAgICAgICBpbmIoaW9hZGRyICsgUkVDRUlWRV9NT0RFX1JFRyksIHN0YXR1cyk7CisJCQorCQlpZiggIShzdGF0dXMgJiBQS1RfR09PRCkgKSB7CisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisKKwkJCWlmKCAocGt0X2xlbiA8IEVUSF9aTEVOKSB8fCAocGt0X2xlbiA+IEVUSF9GUkFNRV9MRU4pICkgeworCQkJCWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJZXRoMTZpX3Jlc2V0KGRldik7CisJCQkJcmV0dXJuOwkJCisJCQl9CisJCQllbHNlIHsgCisJCQkJZXRoMTZpX3NraXBfcGFja2V0KGRldik7CisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCX0JCisJCX0KKwkJZWxzZSB7ICAgLyogT2sgc28gbm93IHdlIHNob3VsZCBoYXZlIGEgZ29vZCBwYWNrZXQgKi8KKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDMpOworCQkJaWYoIHNrYiA9PSBOVUxMICkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCduIGFsbG9jYXRlIG1lbW9yeSBmb3IgcGFja2V0IChsZW4gJWQpXG4iLCAKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKwkJCQlldGgxNmlfc2tpcF9wYWNrZXQoZGV2KTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWJyZWFrOworCQkJfQorCisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlKHNrYiwyKTsKKwkJCQorCQkJLyogCisJCQkgICBOb3cgbGV0J3MgZ2V0IHRoZSBwYWNrZXQgb3V0IG9mIGJ1ZmZlci4KKwkJCSAgIHNpemUgaXMgKHBrdF9sZW4gKyAxKSA+PiAxLCBjYXVzZSB3ZSBhcmUgbm93IHJlYWRpbmcgd29yZHMKKwkJCSAgIGFuZCBpdCBoYXZlIHRvIGJlIGV2ZW4gYWxpZ25lZC4KKwkJCSAgICovIAorCQkJCisJCQlpZihpb2FkZHIgPCAweDEwMDApIAorCQkJCWluc3coaW9hZGRyICsgREFUQVBPUlQsIHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwgCisJCQkJICAgICAocGt0X2xlbiArIDEpID4+IDEpOworCQkJZWxzZSB7CQorCQkJCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJCQl1bnNpZ25lZCBjaGFyIGZyYWcgPSBwa3RfbGVuICUgNDsKKworCQkJCWluc2woaW9hZGRyICsgREFUQVBPUlQsIGJ1ZiwgcGt0X2xlbiA+PiAyKTsKKworCQkJCWlmKGZyYWcgIT0gMCkgeworCQkJCQl1bnNpZ25lZCBzaG9ydCByZXN0WzJdOworCQkJCQlyZXN0WzBdID0gaW53KCBpb2FkZHIgKyBEQVRBUE9SVCApOworCQkJCQlpZihmcmFnID09IDMpCisJCQkJCQlyZXN0WzFdID0gaW53KCBpb2FkZHIgKyBEQVRBUE9SVCApOworCisJCQkJCW1lbWNweShidWYgKyAocGt0X2xlbiAmIDB4ZmZmYyksIChjaGFyICopcmVzdCwgZnJhZyk7CisJCQkJfQorCQkJfQorCisJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCQkJaWYoIGV0aDE2aV9kZWJ1ZyA+IDUgKSB7CisJCQkJaW50IGk7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWNlaXZlZCBwYWNrZXQgb2YgbGVuZ3RoICVkLlxuIiwgCisJCQkJICAgICAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCQkJZm9yKGkgPSAwOyBpIDwgMTQ7IGkrKykgCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIgJTAyeCIsIHNrYi0+ZGF0YVtpXSk7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIi5cbiIpOworCQkJfQorCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisKKwkJfSAvKiBlbHNlICovCisKKwkJaWYoLS1ib2d1c2NvdW50IDw9IDApCisJCQlicmVhazsKKworCX0gLyogd2hpbGUgKi8KK30KKworc3RhdGljIGlycXJldHVybl90IGV0aDE2aV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBldGgxNmlfbG9jYWwgKmxwOworCWludCBpb2FkZHIgPSAwLCBzdGF0dXM7CisJaW50IGhhbmRsZWQgPSAwOworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogVHVybiBvZmYgYWxsIGludGVycnVwdHMgZnJvbSBhZGFwdGVyICovCisJb3V0dyhFVEgxNklfSU5UUl9PRkYsIGlvYWRkciArIFRYX0lOVFJfUkVHKTsKKworCS8qIGV0aDE2aV90eCB3b24ndCBiZSBjYWxsZWQgKi8KKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKworCXN0YXR1cyA9IGludyhpb2FkZHIgKyBUWF9TVEFUVVNfUkVHKTsgICAgICAvKiBHZXQgdGhlIHN0YXR1cyAqLworCW91dHcoc3RhdHVzLCBpb2FkZHIgKyBUWF9TVEFUVVNfUkVHKTsgICAgICAvKiBDbGVhciBzdGF0dXMgYml0cyAqLworCisJaWYgKHN0YXR1cykKKwkJaGFuZGxlZCA9IDE7CisKKwlpZihldGgxNmlfZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEludGVycnVwdCB3aXRoIHN0YXR1cyAlMDR4LlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCisJaWYoIHN0YXR1cyAmIDB4N2YwMCApIHsKKworCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisKKwkJaWYoc3RhdHVzICYgKEJVU19SRF9FUlIgPDwgOCkgKSAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCdXMgcmVhZCBlcnJvci5cbiIsZGV2LT5uYW1lKTsKKwkJaWYoc3RhdHVzICYgKFNIT1JUX1BLVF9FUlIgPDwgOCkgKSAgIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWlmKHN0YXR1cyAmIChBTElHTl9FUlIgPDwgOCkgKSAgICAgICBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCWlmKHN0YXR1cyAmIChDUkNfRVJSIDw8IDgpICkJICAgIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCWlmKHN0YXR1cyAmIChSWF9CVUZfT1ZFUkZMT1cgPDwgOCkgKSBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwl9CisJaWYoIHN0YXR1cyAmIDB4MDAxYSkgeworCisJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKworCQlpZihzdGF0dXMgJiBDUl9MT1NUKSBscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJaWYoc3RhdHVzICYgVFhfSkFCQkVSX0VSUikgbHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKworI2lmIDAJICAgICAgIAorCQlpZihzdGF0dXMgJiBDT0xMSVNJT04pIHsKKwkJCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IAorCQkJCSgoaW5iKGlvYWRkcitUUkFOU01JVF9NT0RFX1JFRykgJiAweEYwKSA+PiA0KTsKKwkJfQorI2VuZGlmCisJCWlmKHN0YXR1cyAmIENPTExJU0lPTlNfMTYpIHsKKwkJCWlmKGxwLT5jb2xfMTYgPCBNQVhfQ09MXzE2KSB7IAorCQkJCWxwLT5jb2xfMTYrKzsKKwkJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJCS8qIFJlc3VtZSB0cmFuc21pdHRpbmcsIHNraXAgZmFpbGVkIHBhY2tldCAqLworCQkJCW91dGIoMHgwMiwgaW9hZGRyICsgQ09MXzE2X1JFRyk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogYmFpbGluZyBvdXQgZHVlIHRvIG1hbnkgY29uc2VjdXRpdmUgMTYtaW4tYS1yb3cgY29sbGlzaW9ucy4gTmV0d29yayBjYWJsZSBwcm9ibGVtP1xuIiwgZGV2LT5uYW1lKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCBzdGF0dXMgJiAweDAwZmYgKSB7ICAgICAgICAgIC8qIExldCdzIGNoZWNrIHRoZSB0cmFuc21pdCBzdGF0dXMgcmVnICovCisKKwkJaWYoc3RhdHVzICYgVFhfRE9ORSkgeyAgICAgICAgIC8qIFRoZSB0cmFuc21pdCBoYXMgYmVlbiBkb25lICovCisJCQlscC0+c3RhdHMudHhfcGFja2V0cyA9IGxwLT50eF9idWZmZXJlZF9wYWNrZXRzOworCQkJbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxwLT50eF9idWZmZXJlZF9ieXRlczsKKwkJCWxwLT5jb2xfMTYgPSAwOwkJICAgCisKKwkJCWlmKGxwLT50eF9xdWV1ZSkgeyAgICAgICAgICAgLyogSXMgdGhlcmUgc3RpbGwgcGFja2V0cyA/ICovCisJCQkJLyogVGhlcmUgd2FzIHBhY2tldChzKSBzbyBzdGFydCB0cmFuc21pdHRpbmcgYW5kIHdyaXRlIGFsc28KKwkJCQkgICBob3cgbWFueSBwYWNrZXRzIHRoZXJlIGlzIHRvIGJlIHNlbmRlZCAqLworCQkJCW91dGIoVFhfU1RBUlQgfCBscC0+dHhfcXVldWUsIGlvYWRkciArIFRSQU5TTUlUX1NUQVJUX1JFRyk7CisJCQkJbHAtPnR4X3F1ZXVlID0gMDsKKwkJCQlscC0+dHhfcXVldWVfbGVuID0gMDsKKwkJCQlscC0+dHhfc3RhcnRlZCA9IDE7CisJCQl9CisJCQllbHNlIHsKKwkJCQlscC0+dHhfc3RhcnRlZCA9IDA7CisJCQl9CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKwl9CisKKwlpZiggKCBzdGF0dXMgJiAweDgwMDAgKSB8fCAKKwkgICAgKCAoaW5iKGlvYWRkciArIFJFQ0VJVkVfTU9ERV9SRUcpICYgUlhfQlVGRkVSX0VNUFRZKSA9PSAwKSApIHsKKwkJZXRoMTZpX3J4KGRldik7ICAvKiBXZSBoYXZlIHBhY2tldCBpbiByZWNlaXZlIGJ1ZmZlciAqLworCX0gIAorCQorCS8qIFR1cm4gaW50ZXJydXB0cyBiYWNrIG9uICovCisJb3V0dyhFVEgxNklfSU5UUl9PTiwgaW9hZGRyICsgVFhfSU5UUl9SRUcpOworCQorCWlmKGxwLT50eF9xdWV1ZV9sZW4gPCBscC0+dHhfYnVmX3NpemUgLSAoRVRIX0ZSQU1FX0xFTiArIDIpKSB7CisJCS8qIFRoZXJlIGlzIHN0aWxsIG1vcmUgcm9vbSBmb3Igb25lIG1vcmUgcGFja2V0IGluIHR4IGJ1ZmZlciAqLworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCQorCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyB2b2lkIGV0aDE2aV9za2lwX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorewkgCisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaW53KGlvYWRkciArIERBVEFQT1JUKTsKKwlpbncoaW9hZGRyICsgREFUQVBPUlQpOworCWludyhpb2FkZHIgKyBEQVRBUE9SVCk7CisKKwlvdXRiKFNLSVBfUlhfUEFDS0VULCBpb2FkZHIgKyBGSUxURVJfU0VMRl9SWF9SRUcpOworCXdoaWxlKCBpbmIoIGlvYWRkciArIEZJTFRFUl9TRUxGX1JYX1JFRyApICE9IDApOworfQorCitzdGF0aWMgdm9pZCBldGgxNmlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXRoMTZpX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYoZXRoMTZpX2RlYnVnID4gMSkgCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVzZXR0aW5nIGRldmljZS5cbiIsIGRldi0+bmFtZSk7CisKKwlCSVRTRVQoaW9hZGRyICsgQ09ORklHX1JFR18wLCBETENfRU4pOworCW91dHcoMHhmZmZmLCBpb2FkZHIgKyBUWF9TVEFUVVNfUkVHKTsgICAgCisJZXRoMTZpX3NlbGVjdF9yZWdiYW5rKDIsIGlvYWRkcik7CisKKwlscC0+dHhfc3RhcnRlZCA9IDA7CisJbHAtPnR4X2J1Zl9idXN5ID0gMDsKKwlscC0+dHhfcXVldWUgPSAwOworCWxwLT50eF9xdWV1ZV9sZW4gPSAwOyAgICAKKwlCSVRDTFIoaW9hZGRyICsgQ09ORklHX1JFR18wLCBETENfRU4pOworfQorCitzdGF0aWMgdm9pZCBldGgxNmlfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAKKwlpZihkZXYtPm1jX2NvdW50IHx8IGRldi0+ZmxhZ3MmKElGRl9BTExNVUxUSXxJRkZfUFJPTUlTQykpIAorCXsKKwkJZGV2LT5mbGFnc3w9SUZGX1BST01JU0M7CS8qIE11c3QgZG8gdGhpcyAqLworCQlvdXRiKDMsIGlvYWRkciArIFJFQ0VJVkVfTU9ERV9SRUcpOyAgICAKKwl9IGVsc2UgeworCQlvdXRiKDIsIGlvYWRkciArIFJFQ0VJVkVfTU9ERV9SRUcpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpldGgxNmlfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0aDE2aV9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmbHAtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBldGgxNmlfc2VsZWN0X3JlZ2JhbmsodW5zaWduZWQgY2hhciBiYW5rbmJyLCBpbnQgaW9hZGRyKQoreworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKworCWRhdGEgPSBpbmIoaW9hZGRyICsgQ09ORklHX1JFR18xKTsKKwlvdXRiKCAoKGRhdGEgJiAweEYzKSB8ICggKGJhbmtuYnIgJiAweDAzKSA8PCAyKSksIGlvYWRkciArIENPTkZJR19SRUdfMSk7IAorfQorCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyB1c2hvcnQgZXRoMTZpX3BhcnNlX21lZGlhdHlwZShjb25zdCBjaGFyKiBzKQoreworCWlmKCFzKQorCQlyZXR1cm4gRV9QT1JUX0ZST01fRVBST007CisJCisgICAgICAgIGlmICghc3RybmNtcChzLCAiYm5jIiwgMykpCisJCXJldHVybiBFX1BPUlRfQk5DOworICAgICAgICBlbHNlIGlmICghc3RybmNtcChzLCAidHAiLCAyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRV9QT1JUX1RQOworICAgICAgICBlbHNlIGlmICghc3RybmNtcChzLCAiZGl4IiwgMykpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVfUE9SVF9ESVg7CisgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKHMsICJhdXRvIiwgNCkpCisJCXJldHVybiBFX1BPUlRfQVVUTzsKKwllbHNlCisJCXJldHVybiBFX1BPUlRfRlJPTV9FUFJPTTsKK30KKworI2RlZmluZSBNQVhfRVRIMTZJX0NBUkRTIDQgIC8qIE1heCBudW1iZXIgb2YgRXRoMTZpIGNhcmRzIHBlciBtb2R1bGUgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfZXRoMTZpW01BWF9FVEgxNklfQ0FSRFNdOworc3RhdGljIGludCBpb1tNQVhfRVRIMTZJX0NBUkRTXTsKKyNpZiAwCitzdGF0aWMgaW50IGlycVtNQVhfRVRIMTZJX0NBUkRTXTsKKyNlbmRpZgorc3RhdGljIGNoYXIqIG1lZGlhdHlwZVtNQVhfRVRIMTZJX0NBUkRTXTsKK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsKKworTU9EVUxFX0FVVEhPUigiTWlrYSBLdW9wcGFsYSA8bWlrdUBpa2kuZmk+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklDTCBFdGhlclRlYW0gMTZpLzMyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJldGgxNmkgSS9PIGJhc2UgYWRkcmVzcyhlcykiKTsKKworI2lmIDAKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgImV0aDE2aSBpbnRlcnJ1cHQgcmVxdWVzdCBudW1iZXIiKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW1fYXJyYXkobWVkaWF0eXBlLCBjaGFycCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1lZGlhdHlwZSwgImV0aDE2aSBtZWRpYSB0eXBlIG9mIGludGVyZmFjZShzKSAoYm5jLHRwLGRpeCxhdXRvLGVwcm9tKSIpOworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZXRoMTZpIGRlYnVnIGxldmVsICgwLTYpIik7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfRVRIMTZJX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZXRoMTZpX2xvY2FsKSk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisKKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CisKKwkgICAgICAgIGlmKGRlYnVnICE9IC0xKQorCQkJZXRoMTZpX2RlYnVnID0gZGVidWc7CisKKwkJaWYoZXRoMTZpX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX05PVElDRSAiZXRoMTZpKCVkKTogaW50ZXJmYWNlIHR5cGUgJXNcbiIsIHRoaXNfZGV2LCBtZWRpYXR5cGVbdGhpc19kZXZdID8gbWVkaWF0eXBlW3RoaXNfZGV2XSA6ICJub25lIiApOworCisJCWRldi0+aWZfcG9ydCA9IGV0aDE2aV9wYXJzZV9tZWRpYXR5cGUobWVkaWF0eXBlW3RoaXNfZGV2XSk7CisKKwkJaWYoaW9bdGhpc19kZXZdID09IDApIHsKKwkJCWlmKHRoaXNfZGV2ICE9IDApIC8qIE9ubHkgYXV0b3Byb2JlIDFzdCBvbmUgKi8KKwkJCQlicmVhazsKKworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJldGgxNmkuYzogUHJlc2VudGx5IGF1dG9wcm9iaW5nIChub3QgcmVjb21tZW5kZWQpIGZvciBhIHNpbmdsZSBjYXJkLlxuIik7CisJCX0KKworCQlpZiAoZG9fZXRoMTZpX3Byb2JlKGRldikgPT0gMCkgeworCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCQlkZXZfZXRoMTZpW2ZvdW5kKytdID0gZGV2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRVRIMTZJX0lPX0VYVEVOVCk7CisJCX0KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXRoMTZpLmMgTm8gRXRoMTZpIGNhcmQgZm91bmQgKGkvbyA9IDB4JXgpLlxuIiwKKwkJICAgICAgIGlvW3RoaXNfZGV2XSk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCWJyZWFrOworCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiAtRU5YSU87Cit9CisJCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCisJZm9yKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfRVRIMTZJX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZXRoMTZpW3RoaXNfZGV2XTsKKwkJCisJCWlmKGRldi0+cHJpdikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVUSDE2SV9JT19FWFRFTlQpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1jIGV0aDE2aS5jIgorICogIGFsdC1jb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RWRVJTSU9OUyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QgLXByb3RvdHlwZXMgLU82IC1jIGV0aDE2aS5jIgorICogIHRhYi13aWR0aDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqIEVuZDoKKyAqLworCisvKiBFbmQgb2YgZmlsZSBldGgxNmkuYyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXdyazMuYyBiL2RyaXZlcnMvbmV0L2V3cmszLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmOTY5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V3cmszLmMKQEAgLTAsMCArMSwyMDA3IEBACisvKiAgZXdyazMuYzogQSBESUdJVEFMIEV0aGVyV09SS1MgMyBldGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgorCisgICBXcml0dGVuIDE5OTQgYnkgRGF2aWQgQy4gRGF2aWVzLgorCisgICBDb3B5cmlnaHQgMTk5NCBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbi4KKworICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworICAgVGhpcyBkcml2ZXIgaXMgd3JpdHRlbiBmb3IgdGhlIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIHNlcmllcworICAgb2YgRXRoZXJXT1JLUyBldGhlcm5ldCBjYXJkczoKKworICAgREUyMDMgVHVyYm8gKEJOQykKKyAgIERFMjA0IFR1cmJvIChUUCkKKyAgIERFMjA1IFR1cmJvIChUUCBCTkMpCisKKyAgIFRoZSBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIG9uIGEgcmVsYXRpdmVseSBidXN5ICBuZXR3b3JrIHVzaW5nIHRoZSBERTIwNQorICAgY2FyZCBhbmQgYmVuY2htYXJrZWQgd2l0aCAndHRjcCc6IGl0IHRyYW5zZmVycmVkIDE2TSAgb2YgZGF0YSBhdCA5NzVrQi9zCisgICAoNy44TWIvcykgdG8gYSBERUNzdGF0aW9uIDUwMDAvMjAwLgorCisgICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGF0IGRhdmllc0BtYW5pYWMudWx0cmFuZXQuY29tLgorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBUaGlzIGRyaXZlciBoYXMgYmVlbiB3cml0dGVuICBzdWJzdGFudGlhbGx5ICBmcm9tIHNjcmF0Y2gsIGFsdGhvdWdoICBpdHMKKyAgIGluaGVyaXRhbmNlIG9mIHN0eWxlIGFuZCBzdGFjayBpbnRlcmZhY2UgZnJvbSAnZGVwY2EuYycgYW5kIGluIHR1cm4gZnJvbQorICAgRG9uYWxkIEJlY2tlcidzICdsYW5jZS5jJyBzaG91bGQgYmUgb2J2aW91cy4KKworICAgVGhlICBERTIwMy80LzUgYm9hcmRzICBhbGwgIHVzZSBhIG5ldyBwcm9wcmlldGFyeSAgIGNoaXAgaW4gcGxhY2Ugb2YgdGhlCisgICBMQU5DRSBjaGlwIHVzZWQgaW4gcHJpb3IgY2FyZHMgIChERVBDQSwgREUxMDAsIERFMjAwLzEvMiwgREUyMTAsIERFNDIyKS4KKyAgIFVzZSB0aGUgZGVwY2EuYyBkcml2ZXIgaW4gdGhlIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiAgZm9yIHRoZSBMQU5DRSBiYXNlZAorICAgY2FyZHMgZnJvbSBESUdJVEFMOyB0aGlzIGRyaXZlciB3aWxsIG5vdCB3b3JrIHdpdGggdGhlbS4KKworICAgVGhlIERFMjAzLzQvNSBjYXJkcyBoYXZlIDIgIG1haW4gbW9kZXM6IHNoYXJlZCBtZW1vcnkgIGFuZCBJL08gb25seS4gSS9PCisgICBvbmx5IG1ha2VzICBhbGwgdGhlIGNhcmQgYWNjZXNzZXMgdGhyb3VnaCAgSS9PIHRyYW5zYWN0aW9ucyBhbmQgIG5vIGhpZ2gKKyAgIChzaGFyZWQpICBtZW1vcnkgaXMgdXNlZC4gVGhpcyAgbW9kZSBwcm92aWRlcyBhID40OCUgcGVyZm9ybWFuY2UgcGVuYWx0eQorICAgYW5kICBpcyBkZXByZWNhdGVkIGluIHRoaXMgIGRyaXZlciwgIGFsdGhvdWdoIGFsbG93ZWQgdG8gcHJvdmlkZSBpbml0aWFsCisgICBzZXR1cCB3aGVuIGhhcmRzdHJhcHBlZC4KKworICAgVGhlIHNoYXJlZCBtZW1vcnkgbW9kZSBjb21lcyBpbiAzIGZsYXZvdXJzOiAya0IsIDMya0IgYW5kIDY0a0IuIFRoZXJlIGlzCisgICBubyBwb2ludCBpbiB1c2luZyBhbnkgbW9kZSBvdGhlciB0aGFuIHRoZSAya0IgIG1vZGUgLSB0aGVpciBwZXJmb3JtYW5jZXMKKyAgIGFyZSB2aXJ0dWFsbHkgaWRlbnRpY2FsLCBhbHRob3VnaCB0aGUgZHJpdmVyIGhhcyAgYmVlbiB0ZXN0ZWQgaW4gdGhlIDJrQgorICAgYW5kIDMya0IgbW9kZXMuIEkgd291bGQgc3VnZ2VzdCB5b3UgdW5jb21tZW50IHRoZSBsaW5lOgorCisgICBGT1JDRV8yS19NT0RFOworCisgICB0byBhbGxvdyB0aGUgZHJpdmVyIHRvIGNvbmZpZ3VyZSB0aGUgY2FyZCBhcyBhICAya0IgY2FyZCBhdCB5b3VyIGN1cnJlbnQKKyAgIGJhc2UgIGFkZHJlc3MsIHRodXMgbGVhdmluZyBtb3JlICByb29tIHRvIGNsdXR0ZXIgIHlvdXIgIHN5c3RlbSBib3ggd2l0aAorICAgb3RoZXIgbWVtb3J5IGh1bmdyeSBib2FyZHMuCisKKyAgIEFzIG1hbnkgSVNBICBhbmQgRUlTQSBjYXJkcyAgY2FuIGJlIHN1cHBvcnRlZCAgdW5kZXIgdGhpcyBkcml2ZXIgIGFzIHlvdQorICAgd2lzaCwgbGltaXRlZCBwcmltYXJpbHkgIGJ5IHRoZSBhdmFpbGFibGUgSVJRIGxpbmVzLCAgcmF0aGVyIHRoYW4gYnkgdGhlCisgICBhdmFpbGFibGUgSS9PIGFkZHJlc3NlcyAgKDI0IElTQSwgIDE2IEVJU0EpLiAgIEkgaGF2ZSAgY2hlY2tlZCBkaWZmZXJlbnQKKyAgIGNvbmZpZ3VyYXRpb25zIG9mICBtdWx0aXBsZSAgZGVwY2EgY2FyZHMgYW5kICBld3JrMyBjYXJkcyAgYW5kIGhhdmUgIG5vdAorICAgZm91bmQgYSBwcm9ibGVtIHlldCAocHJvdmlkZWQgeW91IGhhdmUgYXQgbGVhc3QgZGVwY2EuYyB2MC4zOCkgLi4uCisKKyAgIFRoZSBib2FyZCBJUlEgc2V0dGluZyAgIG11c3QgYmUgYXQgIGFuIHVudXNlZCAgSVJRIHdoaWNoIGlzICBhdXRvLXByb2JlZAorICAgdXNpbmcgIERvbmFsZCAgQmVja2VyJ3MgYXV0b3Byb2JlICByb3V0aW5lcy4gICBBbGwgIHRoZXNlIGNhcmRzICAgYXJlIGF0CisgICB7NSwxMCwxMSwxNX0uCisKKyAgIE5vIDE2TUIgbWVtb3J5ICBsaW1pdGF0aW9uIHNob3VsZCBleGlzdCB3aXRoIHRoaXMgIGRyaXZlciBhcyBETUEgaXMgIG5vdAorICAgdXNlZCBhbmQgdGhlIGNvbW1vbiBtZW1vcnkgYXJlYSBpcyBpbiBsb3cgbWVtb3J5IG9uIHRoZSBuZXR3b3JrIGNhcmQgKG15CisgICBjdXJyZW50IHN5c3RlbSBoYXMgMjBNQiBhbmQgSSd2ZSBub3QgaGFkIHByb2JsZW1zIHlldCkuCisKKyAgIFRoZSBhYmlsaXR5IHRvIGxvYWQgIHRoaXMgZHJpdmVyIGFzIGEgIGxvYWRhYmxlIG1vZHVsZSBoYXMgYmVlbiBpbmNsdWRlZAorICAgYW5kIHVzZWQgIGV4dGVuc2l2ZWx5IGR1cmluZyB0aGUgIGRyaXZlciBkZXZlbG9wbWVudCAodG8gc2F2ZSB0aG9zZSBsb25nCisgICByZWJvb3Qgc2VxdWVuY2VzKS4gVG8gdXRpbGlzZSB0aGlzIGFiaWxpdHksIHlvdSBoYXZlIHRvIGRvIDggdGhpbmdzOgorCisgICAwKSBoYXZlIGEgY29weSBvZiB0aGUgbG9hZGFibGUgbW9kdWxlcyBjb2RlIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbS4KKyAgIDEpIGNvcHkgZXdyazMuYyBmcm9tIHRoZSAgL2xpbnV4L2RyaXZlcnMvbmV0IGRpcmVjdG9yeSB0byB5b3VyIGZhdm91cml0ZQorICAgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKyAgIDIpIGVkaXQgdGhlICBzb3VyY2UgY29kZSBuZWFyICBsaW5lIDE4OTggdG8gcmVmbGVjdCAgdGhlIEkvTyBhZGRyZXNzIGFuZAorICAgSVJRIHlvdSdyZSB1c2luZy4KKyAgIDMpIGNvbXBpbGUgIGV3cmszLmMsIGJ1dCBpbmNsdWRlIC1ETU9EVUxFIGluICB0aGUgY29tbWFuZCBsaW5lIHRvIGVuc3VyZQorICAgdGhhdCB0aGUgY29ycmVjdCBiaXRzIGFyZSBjb21waWxlZCAoc2VlIGVuZCBvZiBzb3VyY2UgY29kZSkuCisgICA0KSBpZiB5b3UgYXJlIHdhbnRpbmcgdG8gYWRkIGEgbmV3ICBjYXJkLCBnb3RvIDUuIE90aGVyd2lzZSwgcmVjb21waWxlIGEKKyAgIGtlcm5lbCB3aXRoIHRoZSBld3JrMyBjb25maWd1cmF0aW9uIHR1cm5lZCBvZmYgYW5kIHJlYm9vdC4KKyAgIDUpIGluc21vZCBld3JrMy5vCisgICBbQWxhbiBDb3g6IENoYW5nZWQgdGhpcyBzbyB5b3UgY2FuIGluc21vZCBld3JrMy5vIGlycT14IGlvPXldCisgICBbQWRhbSBLcm9wZWxpbjogbm93IGFjY2VwdHMgaXJxPXgxLHgyIGlvPXkxLHkyIGZvciBtdWx0aXBsZSBjYXJkc10KKyAgIDYpIHJ1biB0aGUgbmV0IHN0YXJ0dXAgYml0cyBmb3IgeW91ciBuZXcgZXRoPz8gaW50ZXJmYWNlIG1hbnVhbGx5CisgICAodXN1YWxseSAvZXRjL3JjLmluZXRbMTJdIGF0IGJvb3QgdGltZSkuCisgICA3KSBlbmpveSEKKworICAgTm90ZSB0aGF0IGF1dG9wcm9iaW5nIGlzIG5vdCBhbGxvd2VkIGluIGxvYWRhYmxlIG1vZHVsZXMgLSB0aGUgc3lzdGVtIGlzCisgICBhbHJlYWR5IHVwIGFuZCBydW5uaW5nIGFuZCB5b3UncmUgbWVzc2luZyB3aXRoIGludGVycnVwdHMuCisKKyAgIFRvIHVubG9hZCBhIG1vZHVsZSwgdHVybiBvZmYgdGhlIGFzc29jaWF0ZWQgaW50ZXJmYWNlCisgICAnaWZjb25maWcgZXRoPz8gZG93bicgdGhlbiAncm1tb2QgZXdyazMnLgorCisgICBQcm9taXNjdW91cyAgIG1vZGUgaGFzIGJlZW4gIHR1cm5lZCAgb2ZmICBpbiB0aGlzIGRyaXZlciwgICBidXQgIGFsbCB0aGUKKyAgIG11bHRpY2FzdCAgYWRkcmVzcyBiaXRzICBoYXZlIGJlZW4gICB0dXJuZWQgb24uIFRoaXMgIGltcHJvdmVkIHRoZSAgc2VuZAorICAgcGVyZm9ybWFuY2Ugb24gYSBidXN5IG5ldHdvcmsgYnkgYWJvdXQgMTMlLgorCisgICBJb2N0bCdzIGhhdmUgbm93IGJlZW4gcHJvdmlkZWQgKHByaW1hcmlseSBiZWNhdXNlICBJIHdhbnRlZCB0byBncmFiIHNvbWUKKyAgIHBhY2tldCBzaXplIHN0YXRpc3RpY3MpLiBUaGV5ICBhcmUgcGF0dGVybmVkIGFmdGVyICdwbGlwY29uZmlnLmMnIGZyb20gYQorICAgc3VnZ2VzdGlvbiBieSBBbGFuIENveC4gIFVzaW5nIHRoZXNlICBpb2N0bHMsIHlvdSBjYW4gZW5hYmxlIHByb21pc2N1b3VzCisgICBtb2RlLCBhZGQvZGVsZXRlIG11bHRpY2FzdCAgYWRkcmVzc2VzLCBjaGFuZ2UgdGhlIGhhcmR3YXJlIGFkZHJlc3MsICBnZXQKKyAgIHBhY2tldCBzaXplIGRpc3RyaWJ1dGlvbiBzdGF0aXN0aWNzIGFuZCBtdWNrIGFyb3VuZCB3aXRoIHRoZSBjb250cm9sIGFuZAorICAgc3RhdHVzIHJlZ2lzdGVyLiBJJ2xsIGFkZCBvdGhlcnMgaWYgYW5kIHdoZW4gdGhlIG5lZWQgYXJpc2VzLgorCisgICBUTyBETzoKKyAgIC0tLS0tLQorCisKKyAgIFJldmlzaW9uIEhpc3RvcnkKKyAgIC0tLS0tLS0tLS0tLS0tLS0KKworICAgVmVyc2lvbiAgIERhdGUgICAgICAgIERlc2NyaXB0aW9uCisKKyAgIDAuMSAgICAgMjYtYXVnLTk0ICAgSW5pdGlhbCB3cml0aW5nLiBBTFBIQSBjb2RlIHJlbGVhc2UuCisgICAwLjExICAgIDMxLWF1Zy05NCAgIEZpeGVkOiAyayBtb2RlIG1lbW9yeSBiYXNlIGNhbGMuLAorICAgTGVNQUMgdmVyc2lvbiBjYWxjLiwKKyAgIElSUSB2ZWN0b3IgYXNzaWdubWVudHMgZHVyaW5nIGF1dG9wcm9iZS4KKyAgIDAuMTIgICAgMzEtYXVnLTk0ICAgVGVzdGVkIHdvcmtpbmcgb24gTGVNQUMyIChERTIwWzM0NV0tQUMpIGNhcmQuCisgICBGaXhlZCB1cCBNQ0EgaGFzaCB0YWJsZSBhbGdvcml0aG0uCisgICAwLjIwICAgICA0LXNlcC05NCAgIEFkZGVkIElPQ1RMIGZ1bmN0aW9uYWxpdHkuCisgICAwLjIxICAgIDE0LXNlcC05NCAgIEFkZGVkIEkvTyBtb2RlLgorICAgMC4yMWF4cCAxNS1zZXAtOTQgICBTcGVjaWFsIHZlcnNpb24gZm9yIEFMUEhBIEFYUCBMaW51eCBWMS4wLgorICAgMC4yMiAgICAxNi1zZXAtOTQgICBBZGRlZCBtb3JlIElPQ1RMcyAmIHRpZGllZCB1cC4KKyAgIDAuMjMgICAgMjEtc2VwLTk0ICAgQWRkZWQgdHJhbnNtaXQgY3V0IHRocm91Z2guCisgICAwLjI0ICAgIDMxLW9jdC05NCAgIEFkZGVkIHVpZCBjaGVja3MgaW4gc29tZSBpb2N0bHMuCisgICAwLjMwICAgICAxLW5vdi05NCAgIEJFVEEgY29kZSByZWxlYXNlLgorICAgMC4zMSAgICAgNS1kZWMtOTQgICBBZGRlZCBjaGVjay9hbGxvY2F0ZSByZWdpb24gY29kZS4KKyAgIDAuMzIgICAgMTYtamFuLTk1ICAgQnJvYWRjYXN0IHBhY2tldCBmaXguCisgICAwLjMzICAgIDEwLUZlYi05NSAgIEZpeCByZWNvZ25pdGlvbiBidWcgcmVwb3J0ZWQgYnkgPGJrbUBzdGFyLnJsLmFjLnVrPi4KKyAgIDAuNDAgICAgMjctRGVjLTk1ICAgUmF0aW9uYWxpc2UgTU9EVUxFIGFuZCBhdXRvcHJvYmUgY29kZS4KKyAgIFJld3JpdGUgZm9yIHBvcnRhYmlsaXR5ICYgdXBkYXRlZC4KKyAgIEFMUEhBIHN1cHBvcnQgZnJvbSA8amVzdGFicm9AYW10LnRheTEuZGVjLmNvbT4KKyAgIEFkZGVkIHZlcmlmeV9hcmVhKCkgY2FsbHMgaW4gZXdyazNfaW9jdGwoKSBmcm9tCisgICBzdWdnZXN0aW9uIGJ5IDxoZWlrb0Bjb2xvc3N1cy5lc2NhcGUuZGU+LgorICAgQWRkIG5ldyBtdWx0aWNhc3RpbmcgY29kZS4KKyAgIDAuNDEgICAgMjAtSmFuLTk2ICAgRml4IElSUSBzZXQgdXAgcHJvYmxlbSByZXBvcnRlZCBieQorICAgPGtlbm5ldGhAYmJzLnNhcy5udHUuYWMuc2c+LgorICAgMC40MiAgICAyMi1BcHItOTYgICBGaXggYWxsb2NfZGV2aWNlKCkgYnVnIDxqYXJpQG1hcmtrdXMyLmZpbXIuZmk+CisgICAwLjQzICAgIDE2LUF1Zy05NiAgIFVwZGF0ZSBhbGxvY19kZXZpY2UoKSB0byBjb25mb3JtIHRvIGRlNHg1LmMKKyAgIDAuNDQgICAgMDgtTm92LTAxICAgdXNlIGxpYnJhcnkgY3JjMzIgZnVuY3Rpb25zIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAgIDAuNDUgICAgMTktSnVsLTAyICAgZml4IHVuYWxpZ25lZCBhY2Nlc3Mgb24gYWxwaGEgPG1hcnRpbkBicnVsaS5uZXQ+CisgICAwLjQ2ICAgIDEwLU9jdC0wMiAgIE11bHRpcGxlIE5JQyBzdXBwb3J0IHdoZW4gbW9kdWxlIDxha3JvcGVsMUByb2NoZXN0ZXIucnIuY29tPgorICAgMC40NyAgICAxOC1PY3QtMDIgICBldGh0b29sIHN1cHBvcnQgPGFrcm9wZWwxQHJvY2hlc3Rlci5yci5jb20+CisgICAwLjQ4ICAgIDE4LU9jdC0wMiAgIGNsaS9zdGkgcmVtb3ZhbCBmb3IgMi41IDx2ZGFAcG9ydC5pbXRwLmlseWljaGV2c2sub2Rlc3NhLnVhPgorICAgaW9jdGwgbG9ja2luZywgc2lnbmF0dXJlIHNlYXJjaCBjbGVhbnVwIDxha3JvcGVsMUByb2NoZXN0ZXIucnIuY29tPgorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiZXdyazMuaCIKKworI2RlZmluZSBEUlZfTkFNRQkiZXdyazMiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjQ4IgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9CitEUlZfTkFNRSAiOnYiIERSVl9WRVJTSU9OICIgMjAwMi8xMC8xOCBkYXZpZXNAbWFuaWFjLnVsdHJhbmV0LmNvbVxuIjsKKworI2lmZGVmIEVXUkszX0RFQlVHCitzdGF0aWMgaW50IGV3cmszX2RlYnVnID0gRVdSSzNfREVCVUc7CisjZWxzZQorc3RhdGljIGludCBld3JrM19kZWJ1ZyA9IDE7CisjZW5kaWYKKworI2RlZmluZSBFV1JLM19OREEgMHhmZmUwCS8qIE5vIERldmljZSBBZGRyZXNzICovCisKKyNkZWZpbmUgUFJPQkVfTEVOR1RIICAgIDMyCisjZGVmaW5lIEVUSF9QUk9NX1NJRyAgICAweEFBNTUwMEZGVUwKKworI2lmbmRlZiBFV1JLM19TSUdOQVRVUkUKKyNkZWZpbmUgRVdSSzNfU0lHTkFUVVJFIHsiREUyMDMiLCJERTIwNCIsIkRFMjA1IiwiIn0KKyNkZWZpbmUgRVdSSzNfU1RSTEVOIDgKKyNlbmRpZgorCisjaWZuZGVmIEVXUkszX1JBTV9CQVNFX0FERFJFU1NFUworI2RlZmluZSBFV1JLM19SQU1fQkFTRV9BRERSRVNTRVMgezB4YzAwMDAsMHhkMDAwMCwweDAwMDAwfQorI2VuZGlmCisKKy8qCisgICAqKiBTZXRzIHVwIHRoZSBJL08gYXJlYSBmb3IgdGhlIGF1dG9wcm9iZS4KKyAqLworI2RlZmluZSBFV1JLM19JT19CQVNFIDB4MTAwCS8qIFN0YXJ0IGFkZHJlc3MgZm9yIHByb2JlIHNlYXJjaCAqLworI2RlZmluZSBFV1JLM19JT1BfSU5DIDB4MjAJLyogSS9PIGFkZHJlc3MgaW5jcmVtZW50ICovCisjZGVmaW5lIEVXUkszX1RPVEFMX1NJWkUgMHgyMAkvKiByZXF1aXJlZCBJL08gYWRkcmVzcyBsZW5ndGggKi8KKworI2lmbmRlZiBNQVhfTlVNX0VXUkszUworI2RlZmluZSBNQVhfTlVNX0VXUkszUyAyMQorI2VuZGlmCisKKyNpZm5kZWYgRVdSSzNfRUlTQV9JT19QT1JUUworI2RlZmluZSBFV1JLM19FSVNBX0lPX1BPUlRTIDB4MGMwMAkvKiBJL08gcG9ydCBiYXNlIGFkZHJlc3MsIHNsb3QgMCAqLworI2VuZGlmCisKKyNpZm5kZWYgTUFYX0VJU0FfU0xPVFMKKyNkZWZpbmUgTUFYX0VJU0FfU0xPVFMgMTYKKyNkZWZpbmUgRUlTQV9TTE9UX0lOQyAweDEwMDAKKyNlbmRpZgorCisjZGVmaW5lIFFVRVVFX1BLVF9USU1FT1VUICgxKkhaKQkvKiBKaWZmaWVzICovCisKKy8qCisgICAqKiBFdGhlcldPUktTIDMgc2hhcmVkIG1lbW9yeSB3aW5kb3cgc2l6ZXMKKyAqLworI2RlZmluZSBJT19PTkxZICAgICAgICAgMHgwMAorI2RlZmluZSBTSE1FTV8ySyAgICAgICAgMHg4MDAKKyNkZWZpbmUgU0hNRU1fMzJLICAgICAgIDB4ODAwMAorI2RlZmluZSBTSE1FTV82NEsgICAgICAgMHgxMDAwMAorCisvKgorICAgKiogRXRoZXJXT1JLUyAzIElSUSBFTkFCTEUvRElTQUJMRQorICovCisjZGVmaW5lIEVOQUJMRV9JUlFzIHsgXAorICBpY3IgfD0gbHAtPmlycV9tYXNrO1wKKyAgb3V0YihpY3IsIEVXUkszX0lDUik7ICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIHRoZSBJUlFzICovXAorfQorCisjZGVmaW5lIERJU0FCTEVfSVJRcyB7IFwKKyAgaWNyID0gaW5iKEVXUkszX0lDUik7XAorICBpY3IgJj0gfmxwLT5pcnFfbWFzaztcCisgIG91dGIoaWNyLCBFV1JLM19JQ1IpOyAgICAgICAgICAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIElSUXMgKi9cCit9CisKKy8qCisgICAqKiBFdGhlcldPUktTIDMgU1RBUlQvU1RPUAorICovCisjZGVmaW5lIFNUQVJUX0VXUkszIHsgXAorICBjc3IgPSBpbmIoRVdSSzNfQ1NSKTtcCisgIGNzciAmPSB+KENTUl9UWER8Q1NSX1JYRCk7XAorICBvdXRiKGNzciwgRVdSSzNfQ1NSKTsgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgdGhlIFRYIGFuZC9vciBSWCAqL1wKK30KKworI2RlZmluZSBTVE9QX0VXUkszIHsgXAorICBjc3IgPSAoQ1NSX1RYRHxDU1JfUlhEKTtcCisgIG91dGIoY3NyLCBFV1JLM19DU1IpOyAgICAgICAgICAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIFRYIGFuZC9vciBSWCAqL1wKK30KKworLyoKKyAgICoqIFRoZSBFdGhlcldPUktTIDMgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqLworI2RlZmluZSBFV1JLM19QS1RfU1RBVF9TWiAxNgorI2RlZmluZSBFV1JLM19QS1RfQklOX1NaICAxMjgJLyogU2hvdWxkIGJlID49MTAwIHVubGVzcyB5b3UKKwkJCQkgICBpbmNyZWFzZSBFV1JLM19QS1RfU1RBVF9TWiAqLworCitzdHJ1Y3QgZXdyazNfc3RhdHMgeworCXUzMiBiaW5zW0VXUkszX1BLVF9TVEFUX1NaXTsKKwl1MzIgdW5pY2FzdDsKKwl1MzIgbXVsdGljYXN0OworCXUzMiBicm9hZGNhc3Q7CisJdTMyIGV4Y2Vzc2l2ZV9jb2xsaXNpb25zOworCXUzMiB0eF91bmRlcnJ1bnM7CisJdTMyIGV4Y2Vzc2l2ZV91bmRlcnJ1bnM7Cit9OworCitzdHJ1Y3QgZXdyazNfcHJpdmF0ZSB7CisJY2hhciBhZGFwdGVyX25hbWVbODBdOwkvKiBOYW1lIGV4cG9ydGVkIHRvIC9wcm9jL2lvcG9ydHMgKi8KKwl1X2xvbmcgc2htZW1fYmFzZTsJLyogU2hhcmVkIG1lbW9yeSBzdGFydCBhZGRyZXNzICovCisJdm9pZCBfX2lvbWVtICpzaG1lbTsKKwl1X2xvbmcgc2htZW1fbGVuZ3RoOwkvKiBTaGFyZWQgbWVtb3J5IHdpbmRvdyBsZW5ndGggKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogUHVibGljIHN0YXRzICovCisJc3RydWN0IGV3cmszX3N0YXRzIHBrdFN0YXRzOyAvKiBQcml2YXRlIHN0YXRzIGNvdW50ZXJzICovCisJdV9jaGFyIGlycV9tYXNrOwkvKiBBZGFwdGVyIElSUSBtYXNrIGJpdHMgKi8KKwl1X2NoYXIgbVBhZ2U7CQkvKiBNYXhpbXVtIDJrQiBQYWdlIG51bWJlciAqLworCXVfY2hhciBsZW1hYzsJCS8qIENoaXAgcmV2LiBsZXZlbCAqLworCXVfY2hhciBoYXJkX3N0cmFwcGVkOwkvKiBEb24ndCBhbGxvdyBhIGZ1bGwgb3BlbiAqLworCXVfY2hhciB0eGM7CQkvKiBUcmFuc21pdCBjdXQgdGhyb3VnaCAqLworCXZvaWQgX19pb21lbSAqbWN0Ymw7CS8qIFBvaW50ZXIgdG8gdGhlIG11bHRpY2FzdCB0YWJsZSAqLworCXVfY2hhciBsZWRfbWFzazsJLyogVXNlZCB0byByZXNlcnZlIExFRCBhY2Nlc3MgZm9yIGV0aHRvb2wgKi8KKwlzcGlubG9ja190IGh3X2xvY2s7Cit9OworCisvKgorICAgKiogRm9yY2UgdGhlIEV0aGVyV09SS1MgMyBjYXJkIHRvIGJlIGluIDJrQiBNT0RFCisgKi8KKyNkZWZpbmUgRk9SQ0VfMktfTU9ERSB7IFwKKyAgc2htZW1fbGVuZ3RoID0gU0hNRU1fMks7XAorICBvdXRiKCgobWVtX3N0YXJ0IC0gMHg4MDAwMCkgPj4gMTEpLCBFV1JLM19NQlIpO1wKK30KKworLyoKKyAgICoqIFB1YmxpYyBGdW5jdGlvbnMKKyAqLworc3RhdGljIGludCBld3JrM19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBld3JrM19xdWV1ZV9wa3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZXdyazNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBld3JrM19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZXdyazNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBld3JrM19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHNfMjAzOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBldGh0b29sX29wczsKKworLyoKKyAgICoqIFByaXZhdGUgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbnQgZXdyazNfaHdfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2xvbmcgaW9iYXNlKTsKK3N0YXRpYyB2b2lkIGV3cmszX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGV3cmszX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBld3JrM190eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGV3cmszX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIEV0aHdya1NpZ25hdHVyZShjaGFyICpuYW1lLCBjaGFyICplZXByb21faW1hZ2UpOworc3RhdGljIGludCBEZXZpY2VQcmVzZW50KHVfbG9uZyBpb2Jhc2UpOworc3RhdGljIHZvaWQgU2V0TXVsdGljYXN0RmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBFSVNBX3NpZ25hdHVyZShjaGFyICpuYW1lLCBzMzIgZWlzYV9pZCk7CisKK3N0YXRpYyBpbnQgUmVhZF9FRVBST00odV9sb25nIGlvYmFzZSwgdV9jaGFyIGVhZGRyKTsKK3N0YXRpYyBpbnQgV3JpdGVfRUVQUk9NKHNob3J0IGRhdGEsIHVfbG9uZyBpb2Jhc2UsIHVfY2hhciBlYWRkcik7CitzdGF0aWMgdV9jaGFyIGdldF9od19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciAqIGVlcHJvbV9pbWFnZSwgY2hhciBjaGlwVHlwZSk7CisKK3N0YXRpYyBpbnQgZXdyazNfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2Jhc2UsIGludCBpcnEpOworc3RhdGljIGludCBpc2FfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9sb25nIGlvYmFzZSk7CitzdGF0aWMgaW50IGVpc2FfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9sb25nIGlvYmFzZSk7CisKK3N0YXRpYyB1X2NoYXIgaXJxW01BWF9OVU1fRVdSSzNTKzFdID0gezUsIDAsIDEwLCAzLCAxMSwgOSwgMTUsIDEyfTsKKworc3RhdGljIGNoYXIgbmFtZVtFV1JLM19TVFJMRU4gKyAxXTsKK3N0YXRpYyBpbnQgbnVtX2V3cmtzM3M7CisKKy8qCisgICAqKiBNaXNjZWxsYW5lb3VzIGRlZmluZXMuLi4KKyAqLworI2RlZmluZSBJTklUX0VXUkszIHtcCisgICAgb3V0YihFRVBST01fSU5JVCwgRVdSSzNfSU9QUik7XAorICAgIG1kZWxheSgxKTtcCit9CisKKyNpZm5kZWYgTU9EVUxFCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBld3JrM19wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBld3JrM19wcml2YXRlKSk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwllcnIgPSBld3JrM19wcm9iZTEoZGV2LCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCWlmIChlcnIpIAorCQlnb3RvIG91dDsKKwlyZXR1cm4gZGV2Oworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBld3JrM19wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9sb25nIGlvYmFzZSwgaW50IGlycSkKK3sKKwlpbnQgZXJyOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2Jhc2U7CisJZGV2LT5pcnEgPSBpcnE7CisKKwkvKiBBZGRyZXNzIFBST00gcGF0dGVybiAqLworCWVyciA9IGlzYV9wcm9iZShkZXYsIGlvYmFzZSk7CisJaWYgKGVyciAhPSAwKSAKKwkJZXJyID0gZWlzYV9wcm9iZShkZXYsIGlvYmFzZSk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVXUkszX1RPVEFMX1NJWkUpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2luaXQgCitld3JrM19od19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2Jhc2UpCit7CisJc3RydWN0IGV3cmszX3ByaXZhdGUgKmxwOworCWludCBpLCBzdGF0dXMgPSAwOworCXVfbG9uZyBtZW1fc3RhcnQsIHNobWVtX2xlbmd0aDsKKwl1X2NoYXIgY3IsIGNtciwgaWNyLCBuaWNzciwgbGVtYWMsIGhhcmRfc3RyYXBwZWQgPSAwOworCXVfY2hhciBlZXByb21faW1hZ2VbRUVQUk9NX01BWF0sIGNoa3N1bSwgZWlzYV9jciA9IDA7CisKKwkvKgorCSoqIFN0b3AgdGhlIEVXUkszLiBFbmFibGUgdGhlIERCUiBST00uIERpc2FibGUgaW50ZXJydXB0cyBhbmQgcmVtb3RlIGJvb3QuCisJKiogVGhpcyBhbHNvIGRpc2FibGVzIHRoZSBFSVNBX0VOQUJMRSBiaXQgaW4gdGhlIEVJU0EgQ29udHJvbCBSZWdpc3Rlci4KKwkgKi8KKwlpZiAoaW9iYXNlID4gMHg0MDApCisJCWVpc2FfY3IgPSBpbmIoRUlTQV9DUik7CisJSU5JVF9FV1JLMzsKKworCW5pY3NyID0gaW5iKEVXUkszX0NTUik7CisKKwlpY3IgPSBpbmIoRVdSSzNfSUNSKTsKKwlpY3IgJj0gMHg3MDsKKwlvdXRiKGljciwgRVdSSzNfSUNSKTsJLyogRGlzYWJsZSBhbGwgdGhlIElSUXMgKi8KKworCWlmIChuaWNzciA9PSAoQ1NSX1RYRCB8IENTUl9SWEQpKQorCQlyZXR1cm4gLUVOWElPOworCisKKwkvKiBDaGVjayB0aGF0IHRoZSBFRVBST00gaXMgYWxpdmUgYW5kIHdlbGwgYW5kIG5vdCBsaXZpbmcgb24gUGx1dG8uLi4gKi8KKwlmb3IgKGNoa3N1bSA9IDAsIGkgPSAwOyBpIDwgRUVQUk9NX01BWDsgaSArPSAyKSB7CisJCXVuaW9uIHsKKwkJCXNob3J0IHZhbDsKKwkJCWNoYXIgY1syXTsKKwkJfSB0bXA7CisKKwkJdG1wLnZhbCA9IChzaG9ydCkgUmVhZF9FRVBST00oaW9iYXNlLCAoaSA+PiAxKSk7CisJCWVlcHJvbV9pbWFnZVtpXSA9IHRtcC5jWzBdOworCQllZXByb21faW1hZ2VbaSArIDFdID0gdG1wLmNbMV07CisJCWNoa3N1bSArPSBlZXByb21faW1hZ2VbaV0gKyBlZXByb21faW1hZ2VbaSArIDFdOworCX0KKworCWlmIChjaGtzdW0gIT0gMCkgewkvKiBCYWQgRUVQUk9NIERhdGEhICovCisJCXByaW50aygiJXM6IERldmljZSBoYXMgYSBiYWQgb24tYm9hcmQgRUVQUk9NLlxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJCisJRXRod3JrU2lnbmF0dXJlKG5hbWUsIGVlcHJvbV9pbWFnZSk7CisJaWYgKCpuYW1lID09ICdcMCcpIAorCQlyZXR1cm4gLUVOWElPOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2Jhc2U7CisJCQkJCisJaWYgKGlvYmFzZSA+IDB4NDAwKSB7CisJCW91dGIoZWlzYV9jciwgRUlTQV9DUik7CQkvKiBSZXdyaXRlIHRoZSBFSVNBIENSICovCisJfQorCWxlbWFjID0gZWVwcm9tX2ltYWdlW0VFUFJPTV9DSElQVkVSXTsKKwljbXIgPSBpbmIoRVdSSzNfQ01SKTsKKwkKKwlpZiAoKChsZW1hYyA9PSBMZU1BQykgJiYgKChjbXIgJiBDTVJfTk9fRUVQUk9NKSAhPSBDTVJfTk9fRUVQUk9NKSkgfHwKKwkgICAgKChsZW1hYyA9PSBMZU1BQzIpICYmICEoY21yICYgQ01SX0hTKSkpIHsKKwkJcHJpbnRrKCIlczogJXMgYXQgJSM0bHgiLCBkZXYtPm5hbWUsIG5hbWUsIGlvYmFzZSk7CisJCWhhcmRfc3RyYXBwZWQgPSAxOworCX0gZWxzZSBpZiAoKGlvYmFzZSAmIDB4MGZmZikgPT0gRVdSSzNfRUlTQV9JT19QT1JUUykgeworCQkvKiBFSVNBIHNsb3QgYWRkcmVzcyAqLworCQlwcmludGsoIiVzOiAlcyBhdCAlIzRseCAoRUlTQSBzbG90ICVsZCkiLAorCQkgICAgICAgZGV2LT5uYW1lLCBuYW1lLCBpb2Jhc2UsICgoaW9iYXNlID4+IDEyKSAmIDB4MGYpKTsKKwl9IGVsc2UgewkvKiBJU0EgcG9ydCBhZGRyZXNzICovCisJCXByaW50aygiJXM6ICVzIGF0ICUjNGx4IiwgZGV2LT5uYW1lLCBuYW1lLCBpb2Jhc2UpOworCX0KKworCXByaW50aygiLCBoL3cgYWRkcmVzcyAiKTsKKwlpZiAobGVtYWMgIT0gTGVNQUMyKQorCQlEZXZpY2VQcmVzZW50KGlvYmFzZSk7CS8qIG5lZWQgYWZ0ZXIgRVdSSzNfSU5JVCAqLworCXN0YXR1cyA9IGdldF9od19hZGRyKGRldiwgZWVwcm9tX2ltYWdlLCBsZW1hYyk7CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOIC0gMTsgaSsrKSB7CS8qIGdldCB0aGUgZXRoZXJuZXQgYWRkci4gKi8KKwkJcHJpbnRrKCIlMi4yeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisJcHJpbnRrKCIlMi4yeCxcbiIsIGRldi0+ZGV2X2FkZHJbaV0pOworCQorCWlmIChzdGF0dXMpIHsKKwkJcHJpbnRrKCIgICAgICB3aGljaCBoYXMgYW4gRUVQUk9NIENSQyBlcnJvci5cbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWlmIChsZW1hYyA9PSBMZU1BQzIpIHsJLyogU3BlY2lhbCBMZU1BQzIgQ01SIHRoaW5ncyAqLworCQljbXIgJj0gfihDTVJfUkEgfCBDTVJfV0IgfCBDTVJfTElOSyB8IENNUl9QT0xBUklUWSB8IENNUl8wV1MpOworCQlpZiAoZWVwcm9tX2ltYWdlW0VFUFJPTV9NSVNDMF0gJiBSRUFEX0FIRUFEKQorCQkJY21yIHw9IENNUl9SQTsKKwkJaWYgKGVlcHJvbV9pbWFnZVtFRVBST01fTUlTQzBdICYgV1JJVEVfQkVISU5EKQorCQkJY21yIHw9IENNUl9XQjsKKwkJaWYgKGVlcHJvbV9pbWFnZVtFRVBST01fTkVUTUFOMF0gJiBORVRNQU5fUE9MKQorCQkJY21yIHw9IENNUl9QT0xBUklUWTsKKwkJaWYgKGVlcHJvbV9pbWFnZVtFRVBST01fTkVUTUFOMF0gJiBORVRNQU5fTElOSykKKwkJCWNtciB8PSBDTVJfTElOSzsKKwkJaWYgKGVlcHJvbV9pbWFnZVtFRVBST01fTUlTQzBdICYgXzBXU19FTkEpCisJCQljbXIgfD0gQ01SXzBXUzsKKwl9CisJaWYgKGVlcHJvbV9pbWFnZVtFRVBST01fU0VUVVBdICYgU0VUVVBfRFJBTSkKKwkJY21yIHw9IENNUl9EUkFNOworCW91dGIoY21yLCBFV1JLM19DTVIpOworCQorCWNyID0gaW5iKEVXUkszX0NSKTsJLyogU2V0IHVwIHRoZSBDb250cm9sIFJlZ2lzdGVyICovCisJY3IgfD0gZWVwcm9tX2ltYWdlW0VFUFJPTV9TRVRVUF0gJiBTRVRVUF9BUEQ7CisJaWYgKGNyICYgU0VUVVBfQVBEKQorCQljciB8PSBlZXByb21faW1hZ2VbRUVQUk9NX1NFVFVQXSAmIFNFVFVQX1BTOworCWNyIHw9IGVlcHJvbV9pbWFnZVtFRVBST01fTUlTQzBdICYgRkFTVF9CVVM7CisJY3IgfD0gZWVwcm9tX2ltYWdlW0VFUFJPTV9NSVNDMF0gJiBFTkFfMTY7CisJb3V0YihjciwgRVdSSzNfQ1IpOworCisJLyoKKwkqKiBEZXRlcm1pbmUgdGhlIGJhc2UgYWRkcmVzcyBhbmQgd2luZG93IGxlbmd0aCBmb3IgdGhlIEVXUkszCisJKiogUkFNIGZyb20gdGhlIG1lbW9yeSBiYXNlIHJlZ2lzdGVyLgorCSovCisJbWVtX3N0YXJ0ID0gaW5iKEVXUkszX01CUik7CisJc2htZW1fbGVuZ3RoID0gMDsKKwlpZiAobWVtX3N0YXJ0ICE9IDApIHsKKwkJaWYgKChtZW1fc3RhcnQgPj0gMHgwYSkgJiYgKG1lbV9zdGFydCA8PSAweDBmKSkgeworCQkJbWVtX3N0YXJ0ICo9IFNITUVNXzY0SzsKKwkJCXNobWVtX2xlbmd0aCA9IFNITUVNXzY0SzsKKwkJfSBlbHNlIGlmICgobWVtX3N0YXJ0ID49IDB4MTQpICYmIChtZW1fc3RhcnQgPD0gMHgxZikpIHsKKwkJCW1lbV9zdGFydCAqPSBTSE1FTV8zMks7CisJCQlzaG1lbV9sZW5ndGggPSBTSE1FTV8zMks7CisJCX0gZWxzZSBpZiAoKG1lbV9zdGFydCA+PSAweDQwKSAmJiAobWVtX3N0YXJ0IDw9IDB4ZmYpKSB7CisJCQltZW1fc3RhcnQgPSBtZW1fc3RhcnQgKiBTSE1FTV8ySyArIDB4ODAwMDA7CisJCQlzaG1lbV9sZW5ndGggPSBTSE1FTV8ySzsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKwl9CisJLyoKKwkqKiBTZWUgdGhlIHRvcCBvZiB0aGlzIHNvdXJjZSBjb2RlIGZvciBjb21tZW50cyBhYm91dAorCSoqIHVuY29tbWVudGluZyB0aGlzIGxpbmUuCisJKi8KKy8qICAgICAgICAgIEZPUkNFXzJLX01PREU7ICovCisJCisJaWYgKGhhcmRfc3RyYXBwZWQpIHsKKwkJcHJpbnRrKCIgICAgICBpcyBoYXJkIHN0cmFwcGVkLlxuIik7CisJfSBlbHNlIGlmIChtZW1fc3RhcnQpIHsKKwkJcHJpbnRrKCIgICAgICBoYXMgYSAlZGsgUkFNIHdpbmRvdyIsIChpbnQpIChzaG1lbV9sZW5ndGggPj4gMTApKTsKKwkJcHJpbnRrKCIgYXQgMHglLjVseCIsIG1lbV9zdGFydCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIgICAgICBpcyBpbiBJL08gb25seSBtb2RlIik7CisJfQorCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxwLT5zaG1lbV9iYXNlID0gbWVtX3N0YXJ0OworCWxwLT5zaG1lbSA9IGlvcmVtYXAobWVtX3N0YXJ0LCBzaG1lbV9sZW5ndGgpOworCWlmICghbHAtPnNobWVtKQorCQlyZXR1cm4gLUVOT01FTTsKKwlscC0+c2htZW1fbGVuZ3RoID0gc2htZW1fbGVuZ3RoOworCWxwLT5sZW1hYyA9IGxlbWFjOworCWxwLT5oYXJkX3N0cmFwcGVkID0gaGFyZF9zdHJhcHBlZDsKKwlscC0+bGVkX21hc2sgPSBDUl9MRUQ7CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5od19sb2NrKTsKKwkKKwlscC0+bVBhZ2UgPSA2NDsKKwlpZiAoY21yICYgQ01SX0RSQU0pCisJCWxwLT5tUGFnZSA8PD0gMTsJLyogMiBEUkFNUyBvbiBtb2R1bGUgKi8KKwkKKwlzcHJpbnRmKGxwLT5hZGFwdGVyX25hbWUsICIlcyAoJXMpIiwgbmFtZSwgZGV2LT5uYW1lKTsKKwkKKwlscC0+aXJxX21hc2sgPSBJQ1JfVE5FTSB8IElDUl9UWERNIHwgSUNSX1JORU0gfCBJQ1JfUlhETTsKKwkKKwlpZiAoIWhhcmRfc3RyYXBwZWQpIHsKKwkJLyoKKwkJKiogRW5hYmxlIEVXUkszIGJvYXJkIGludGVycnVwdHMgZm9yIGF1dG9wcm9iaW5nCisJCSovCisJCWljciB8PSBJQ1JfSUU7CS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJCW91dGIoaWNyLCBFV1JLM19JQ1IpOworCQkKKwkJLyogVGhlIERNQSBjaGFubmVsIG1heSBiZSBwYXNzZWQgaW4gb24gdGhpcyBwYXJhbWV0ZXIuICovCisJCWRldi0+ZG1hID0gMDsKKwkJCisJCS8qIFRvIGF1dG8tSVJRIHdlIGVuYWJsZSB0aGUgaW5pdGlhbGl6YXRpb24tZG9uZSBhbmQgRE1BIGVyciwKKwkJICAgaW50ZXJydXB0cy4gRm9yIG5vdyB3ZSB3aWxsIGFsd2F5cyBnZXQgYSBETUEgZXJyb3IuICovCisJCWlmIChkZXYtPmlycSA8IDIpIHsKKyNpZm5kZWYgTU9EVUxFCisJCQl1X2NoYXIgaXJxbnVtOworCQkJdW5zaWduZWQgbG9uZyBpcnFfbWFzazsKKwkJCQorCisJCQlpcnFfbWFzayA9IHByb2JlX2lycV9vbigpOworCQkJCisJCQkvKgorCQkJKiogVHJpZ2dlciBhIFRORSBpbnRlcnJ1cHQuCisJCQkqLworCQkJaWNyIHw9IElDUl9UTkVNOworCQkJb3V0YigxLCBFV1JLM19URFEpOwkvKiBXcml0ZSB0byB0aGUgVFggZG9uZSBxdWV1ZSAqLworCQkJb3V0YihpY3IsIEVXUkszX0lDUik7CS8qIFVubWFzayB0aGUgVFhEIGludGVycnVwdCAqLworCQkJCisJCQlpcnFudW0gPSBpcnFbKChpY3IgJiBJUlFfU0VMKSA+PiA0KV07CisJCQkKKwkJCW1kZWxheSgyMCk7CisJCQlkZXYtPmlycSA9IHByb2JlX2lycV9vZmYoaXJxX21hc2spOworCQkJaWYgKChkZXYtPmlycSkgJiYgKGlycW51bSA9PSBkZXYtPmlycSkpIHsKKwkJCQlwcmludGsoIiBhbmQgdXNlcyBJUlElZC5cbiIsIGRldi0+aXJxKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFkZXYtPmlycSkgeworCQkJCQlwcmludGsoIiBhbmQgZmFpbGVkIHRvIGRldGVjdCBJUlEgbGluZS5cbiIpOworCQkJCX0gZWxzZSBpZiAoKGlycW51bSA9PSAxKSAmJiAobGVtYWMgPT0gTGVNQUMyKSkgeworCQkJCQlwcmludGsoIiBhbmQgYW4gaWxsZWdhbCBJUlEgbGluZSBkZXRlY3RlZC5cbiIpOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50aygiLCBidXQgaW5jb3JyZWN0IElSUSBsaW5lIGRldGVjdGVkLlxuIik7CisJCQkJfQorCQkJCWlvdW5tYXAobHAtPnNobWVtKTsKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJfQorCisJCQlESVNBQkxFX0lSUXM7CS8qIE1hc2sgYWxsIGludGVycnVwdHMgKi8KKworI2VuZGlmCQkJCS8qIE1PRFVMRSAqLworCQl9IGVsc2UgeworCQkJcHJpbnRrKCIgYW5kIHJlcXVpcmVzIElSUSVkLlxuIiwgZGV2LT5pcnEpOworCQl9CisJfQorCisJaWYgKGV3cmszX2RlYnVnID4gMSkgeworCQlwcmludGsodmVyc2lvbik7CisJfQorCS8qIFRoZSBFV1JLMy1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9IGV3cmszX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBld3JrM19xdWV1ZV9wa3Q7CisJZGV2LT5zdG9wID0gZXdyazNfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSBld3JrM19nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5kb19pb2N0bCA9IGV3cmszX2lvY3RsOworCWlmIChscC0+YWRhcHRlcl9uYW1lWzRdID09ICczJykKKwkJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmV0aHRvb2xfb3BzXzIwMyk7CisJZWxzZQorCQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOworCWRldi0+dHhfdGltZW91dCA9IGV3cmszX3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFFVRVVFX1BLVF9USU1FT1VUOworCQorCWRldi0+bWVtX3N0YXJ0ID0gMDsKKworCXJldHVybiAwOworfQorDAorCitzdGF0aWMgaW50IGV3cmszX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXdyazNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaSwgc3RhdHVzID0gMDsKKwl1X2NoYXIgaWNyLCBjc3I7CisKKwkvKgorCSAgICoqIFN0b3AgdGhlIFRYIGFuZCBSWC4uLgorCSAqLworCVNUT1BfRVdSSzM7CisKKwlpZiAoIWxwLT5oYXJkX3N0cmFwcGVkKSB7CisJCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgKHZvaWQgKikgZXdyazNfaW50ZXJydXB0LCAwLCAiZXdyazMiLCBkZXYpKSB7CisJCQlwcmludGsoImV3cmszX29wZW4oKTogUmVxdWVzdGVkIElSUSVkIGlzIGJ1c3lcbiIsIGRldi0+aXJxKTsKKwkJCXN0YXR1cyA9IC1FQUdBSU47CisJCX0gZWxzZSB7CisKKwkJCS8qCisJCQkgICAqKiBSZS1pbml0aWFsaXplIHRoZSBFV1JLMy4uLgorCQkJICovCisJCQlld3JrM19pbml0KGRldik7CisKKwkJCWlmIChld3JrM19kZWJ1ZyA+IDEpIHsKKwkJCQlwcmludGsoIiVzOiBld3JrMyBvcGVuIHdpdGggaXJxICVkXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJCQlwcmludGsoIiAgcGh5c2ljYWwgYWRkcmVzczogIik7CisJCQkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQkJCQlwcmludGsoIiUyLjJ4OiIsICh1X2NoYXIpIGRldi0+ZGV2X2FkZHJbaV0pOworCQkJCX0KKwkJCQlwcmludGsoIiUyLjJ4XG4iLCAodV9jaGFyKSBkZXYtPmRldl9hZGRyW2ldKTsKKwkJCQlpZiAobHAtPnNobWVtX2xlbmd0aCA9PSAwKSB7CisJCQkJCXByaW50aygiICBubyBzaGFyZWQgbWVtb3J5LCBJL08gb25seSBtb2RlXG4iKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsoIiAgc3RhcnQgb2Ygc2hhcmVkIG1lbW9yeTogMHglMDhseFxuIiwgbHAtPnNobWVtX2Jhc2UpOworCQkJCQlwcmludGsoIiAgd2luZG93IGxlbmd0aDogMHglMDRseFxuIiwgbHAtPnNobWVtX2xlbmd0aCk7CisJCQkJfQorCQkJCXByaW50aygiICAjIG9mIERSQU1TOiAlZFxuIiwgKChpbmIoRVdSSzNfQ01SKSAmIDB4MDIpID8gMiA6IDEpKTsKKwkJCQlwcmludGsoIiAgY3NyOiAgMHglMDJ4XG4iLCBpbmIoRVdSSzNfQ1NSKSk7CisJCQkJcHJpbnRrKCIgIGNyOiAgIDB4JTAyeFxuIiwgaW5iKEVXUkszX0NSKSk7CisJCQkJcHJpbnRrKCIgIGljcjogIDB4JTAyeFxuIiwgaW5iKEVXUkszX0lDUikpOworCQkJCXByaW50aygiICBjbXI6ICAweCUwMnhcbiIsIGluYihFV1JLM19DTVIpKTsKKwkJCQlwcmludGsoIiAgZm1xYzogMHglMDJ4XG4iLCBpbmIoRVdSSzNfRk1RQykpOworCQkJfQorCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCS8qCisJCQkgICAqKiBVbm1hc2sgRVdSSzMgYm9hcmQgaW50ZXJydXB0cworCQkJICovCisJCQlpY3IgPSBpbmIoRVdSSzNfSUNSKTsKKwkJCUVOQUJMRV9JUlFzOworCisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBld3JrMyBhdmFpbGFibGUgZm9yIGhhcmQgc3RyYXBwZWQgc2V0IHVwIG9ubHkuXG4iLCBkZXYtPm5hbWUpOworCQlwcmludGsoS0VSTl9FUlIgIiAgICAgIFJ1biB0aGUgJ2V3cmszc2V0dXAnIHV0aWxpdHkgb3IgcmVtb3ZlIHRoZSBoYXJkIHN0cmFwcy5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgKiogSW5pdGlhbGl6ZSB0aGUgRXRoZXJXT1JLUyAzIG9wZXJhdGluZyBjb25kaXRpb25zCisgKi8KK3N0YXRpYyB2b2lkIGV3cmszX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXdyazNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVfY2hhciBjc3IsIHBhZ2U7CisJdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCisJLyoKKwkgICAqKiBFbmFibGUgYW55IG11bHRpY2FzdHMKKwkgKi8KKwlzZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKworCS8qCisJKiogU2V0IGhhcmR3YXJlIE1BQyBhZGRyZXNzLiBBZGRyZXNzIGlzIGluaXRpYWxpemVkIGZyb20gdGhlIEVFUFJPTQorCSoqIGR1cmluZyBzdGFydHVwIGJ1dCBtYXkgaGF2ZSBzaW5jZSBiZWVuIGNoYW5nZWQgYnkgdGhlIHVzZXIuCisJKi8KKwlmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKQorCQlvdXRiKGRldi0+ZGV2X2FkZHJbaV0sIEVXUkszX1BBUjAgKyBpKTsKKworCS8qCisJICAgKiogQ2xlYW4gb3V0IGFueSByZW1haW5pbmcgZW50cmllcyBpbiBhbGwgdGhlIHF1ZXVlcyBoZXJlCisJICovCisJd2hpbGUgKGluYihFV1JLM19UUSkpOworCXdoaWxlIChpbmIoRVdSSzNfVERRKSk7CisJd2hpbGUgKGluYihFV1JLM19SUSkpOworCXdoaWxlIChpbmIoRVdSSzNfRk1RKSk7CisKKwkvKgorCSAgICoqIFdyaXRlIGEgY2xlYW4gZnJlZSBtZW1vcnkgcXVldWUKKwkgKi8KKwlmb3IgKHBhZ2UgPSAxOyBwYWdlIDwgbHAtPm1QYWdlOyBwYWdlKyspIHsJLyogV3JpdGUgdGhlIGZyZWUgcGFnZSBudW1iZXJzICovCisJCW91dGIocGFnZSwgRVdSSzNfRk1RKTsJLyogdG8gdGhlIEZyZWUgTWVtb3J5IFF1ZXVlICovCisJfQorCisJU1RBUlRfRVdSSzM7CQkvKiBFbmFibGUgdGhlIFRYIGFuZC9vciBSWCAqLworfQorCisvKgorICogIFRyYW5zbWl0IHRpbWVvdXQKKyAqLworIAorc3RhdGljIHZvaWQgZXdyazNfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBld3JrM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdV9jaGFyIGljciwgY3NyOworCXVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwkKKwlpZiAoIWxwLT5oYXJkX3N0cmFwcGVkKSAKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkciJXM6IHRyYW5zbWl0IHRpbWVkL2xvY2tlZCBvdXQsIHN0YXR1cyAlMDR4LCByZXNldHRpbmcuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBpbmIoRVdSSzNfQ1NSKSk7CisKKwkJLyoKKwkJICAgKiogTWFzayBhbGwgYm9hcmQgaW50ZXJydXB0cworCQkgKi8KKwkJRElTQUJMRV9JUlFzOworCisJCS8qCisJCSAgICoqIFN0b3AgdGhlIFRYIGFuZCBSWC4uLgorCQkgKi8KKwkJU1RPUF9FV1JLMzsKKworCQlld3JrM19pbml0KGRldik7CisKKwkJLyoKKwkJICAgKiogVW5tYXNrIEVXUkszIGJvYXJkIGludGVycnVwdHMKKwkJICovCisJCUVOQUJMRV9JUlFzOworCisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorfQorCisvKgorICAgKiogV3JpdGVzIGEgc29ja2V0IGJ1ZmZlciB0byB0aGUgZnJlZSBwYWdlIHF1ZXVlCisgKi8KK3N0YXRpYyBpbnQgZXdyazNfcXVldWVfcGt0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBld3JrM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXZvaWQgX19pb21lbSAqYnVmID0gTlVMTDsKKwl1X2NoYXIgaWNyOworCXVfY2hhciBwYWdlOworCisJc3Bpbl9sb2NrX2lycSAoJmxwLT5od19sb2NrKTsKKwlESVNBQkxFX0lSUXM7CisKKwkvKiBpZiBubyByZXNvdXJjZXMgYXZhaWxhYmxlLCBleGl0LCByZXF1ZXN0IHBhY2tldCBiZSBxdWV1ZWQgKi8KKwlpZiAoaW5iIChFV1JLM19GTVFDKSA9PSAwKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogZXdyazNfcXVldWVfcGt0KCk6IE5vIGZyZWUgcmVzb3VyY2VzLi4uXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBld3JrM19xdWV1ZV9wa3QoKTogQ1NSOiAlMDJ4IElDUjogJTAyeCBGTVFDOiAlMDJ4XG4iLAorCQkJZGV2LT5uYW1lLCBpbmIgKEVXUkszX0NTUiksIGluYiAoRVdSSzNfSUNSKSwKKwkJCWluYiAoRVdSSzNfRk1RQykpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyoKKwkgKiogR2V0IGEgZnJlZSBwYWdlIGZyb20gdGhlIEZNUQorCSAqLworCWlmICgocGFnZSA9IGluYiAoRVdSSzNfRk1RKSkgPj0gbHAtPm1QYWdlKSB7CisJCXByaW50ayAoImV3cmszX3F1ZXVlX3BrdCgpOiBJbnZhbGlkIGZyZWUgbWVtb3J5IHBhZ2UgKCVkKS5cbiIsCisJCSAgICAgKHVfY2hhcikgcGFnZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKworCS8qCisJICoqIFNldCB1cCBzaGFyZWQgbWVtb3J5IHdpbmRvdyBhbmQgcG9pbnRlciBpbnRvIHRoZSB3aW5kb3cKKwkgKi8KKwlpZiAobHAtPnNobWVtX2xlbmd0aCA9PSBJT19PTkxZKSB7CisJCW91dGIgKHBhZ2UsIEVXUkszX0lPUFIpOworCX0gZWxzZSBpZiAobHAtPnNobWVtX2xlbmd0aCA9PSBTSE1FTV8ySykgeworCQlidWYgPSBscC0+c2htZW07CisJCW91dGIgKHBhZ2UsIEVXUkszX01QUik7CisJfSBlbHNlIGlmIChscC0+c2htZW1fbGVuZ3RoID09IFNITUVNXzMySykgeworCQlidWYgPSAoKChzaG9ydCkgcGFnZSA8PCAxMSkgJiAweDc4MDApICsgbHAtPnNobWVtOworCQlvdXRiICgocGFnZSA+PiA0KSwgRVdSSzNfTVBSKTsKKwl9IGVsc2UgaWYgKGxwLT5zaG1lbV9sZW5ndGggPT0gU0hNRU1fNjRLKSB7CisJCWJ1ZiA9ICgoKHNob3J0KSBwYWdlIDw8IDExKSAmIDB4ZjgwMCkgKyBscC0+c2htZW07CisJCW91dGIgKChwYWdlID4+IDUpLCBFV1JLM19NUFIpOworCX0gZWxzZSB7CisJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBPb3BzIC0geW91ciBwcml2YXRlIGRhdGEgYXJlYSBpcyBob3NlZCFcbiIsCisJCQlkZXYtPm5hbWUpOworCQlCVUcgKCk7CisJfQorCisJLyoKKwkgKiogU2V0IHVwIHRoZSBidWZmZXIgY29udHJvbCBzdHJ1Y3R1cmVzIGFuZCBjb3B5IHRoZSBkYXRhIGZyb20KKwkgKiogdGhlIHNvY2tldCBidWZmZXIgdG8gdGhlIHNoYXJlZCBtZW1vcnkgLgorCSAqLworCWlmIChscC0+c2htZW1fbGVuZ3RoID09IElPX09OTFkpIHsKKwkJaW50IGk7CisJCXVfY2hhciAqcCA9IHNrYi0+ZGF0YTsKKwkJb3V0YiAoKGNoYXIpIChUQ1JfUU1PREUgfCBUQ1JfUEFEIHwgVENSX0lGQyksIEVXUkszX0RBVEEpOworCQlvdXRiICgoY2hhcikgKHNrYi0+bGVuICYgMHhmZiksIEVXUkszX0RBVEEpOworCQlvdXRiICgoY2hhcikgKChza2ItPmxlbiA+PiA4KSAmIDB4ZmYpLCBFV1JLM19EQVRBKTsKKwkJb3V0YiAoKGNoYXIpIDB4MDQsIEVXUkszX0RBVEEpOworCQlmb3IgKGkgPSAwOyBpIDwgc2tiLT5sZW47IGkrKykgeworCQkJb3V0YiAoKnArKywgRVdSSzNfREFUQSk7CisJCX0KKwkJb3V0YiAocGFnZSwgRVdSSzNfVFEpOwkvKiBTdGFydCBzZW5kaW5nIHBrdCAqLworCX0gZWxzZSB7CisJCXdyaXRlYiAoKGNoYXIpIChUQ1JfUU1PREUgfCBUQ1JfUEFEIHwgVENSX0lGQyksIGJ1Zik7CS8qIGN0cmwgYnl0ZSAqLworCQlidWYgKz0gMTsKKwkJd3JpdGViICgoY2hhcikgKHNrYi0+bGVuICYgMHhmZiksIGJ1Zik7CS8qIGxlbmd0aCAoMTYgYml0IHhmZXIpICovCisJCWJ1ZiArPSAxOworCQlpZiAobHAtPnR4YykgeworCQkJd3JpdGViKCgoc2tiLT5sZW4gPj4gOCkgJiAweGZmKSB8IFhDVCwgYnVmKTsKKwkJCWJ1ZiArPSAxOworCQkJd3JpdGViICgweDA0LCBidWYpOwkvKiBpbmRleCBieXRlICovCisJCQlidWYgKz0gMTsKKwkJCXdyaXRlYiAoMHgwMCwgKGJ1ZiArIHNrYi0+bGVuKSk7CS8qIFdyaXRlIHRoZSBYQ1QgZmxhZyAqLworCQkJbWVtY3B5X3RvaW8gKGJ1Ziwgc2tiLT5kYXRhLCBQUkVMT0FEKTsJLyogV3JpdGUgUFJFTE9BRCBieXRlcyAqLworCQkJb3V0YiAocGFnZSwgRVdSSzNfVFEpOwkvKiBTdGFydCBzZW5kaW5nIHBrdCAqLworCQkJbWVtY3B5X3RvaW8gKGJ1ZiArIFBSRUxPQUQsCisJCQkJCSBza2ItPmRhdGEgKyBQUkVMT0FELAorCQkJCQkgc2tiLT5sZW4gLSBQUkVMT0FEKTsKKwkJCXdyaXRlYiAoMHhmZiwgKGJ1ZiArIHNrYi0+bGVuKSk7CS8qIFdyaXRlIHRoZSBYQ1QgZmxhZyAqLworCQl9IGVsc2UgeworCQkJd3JpdGViICgoc2tiLT5sZW4gPj4gOCkgJiAweGZmLCBidWYpOworCQkJYnVmICs9IDE7CisJCQl3cml0ZWIgKDB4MDQsIGJ1Zik7CS8qIGluZGV4IGJ5dGUgKi8KKwkJCWJ1ZiArPSAxOworCQkJbWVtY3B5X3RvaW8gKGJ1Ziwgc2tiLT5kYXRhLCBza2ItPmxlbik7CS8qIFdyaXRlIGRhdGEgYnl0ZXMgKi8KKwkJCW91dGIgKHBhZ2UsIEVXUkszX1RRKTsJLyogU3RhcnQgc2VuZGluZyBwa3QgKi8KKwkJfQorCX0KKworCUVOQUJMRV9JUlFzOworCXNwaW5fdW5sb2NrX2lycSAoJmxwLT5od19sb2NrKTsKKworCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlkZXZfa2ZyZWVfc2tiIChza2IpOworCisJLyogQ2hlY2sgZm9yIGZyZWUgcmVzb3VyY2VzOiBzdG9wIFR4IHF1ZXVlIGlmIHRoZXJlIGFyZSBub25lICovCisJaWYgKGluYiAoRVdSSzNfRk1RQykgPT0gMCkKKwkJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCXJldHVybiAwOworCitlcnJfb3V0OgorCUVOQUJMRV9JUlFzOworCXNwaW5fdW5sb2NrX2lycSAoJmxwLT5od19sb2NrKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAgICoqIFRoZSBFV1JLMyBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIGlycXJldHVybl90IGV3cmszX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGV3cmszX3ByaXZhdGUgKmxwOworCXVfbG9uZyBpb2Jhc2U7CisJdV9jaGFyIGljciwgY3IsIGNzcjsKKworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8qIGdldCB0aGUgaW50ZXJydXB0IGluZm9ybWF0aW9uICovCisJY3NyID0gaW5iKEVXUkszX0NTUik7CisKKwkvKgorCSAqKiBNYXNrIHRoZSBFV1JLMyBib2FyZCBpbnRlcnJ1cHRzIGFuZCB0dXJuIG9uIHRoZSBMRUQKKwkgKi8KKwlzcGluX2xvY2soJmxwLT5od19sb2NrKTsKKwlESVNBQkxFX0lSUXM7CisKKwljciA9IGluYihFV1JLM19DUik7CisJY3IgfD0gbHAtPmxlZF9tYXNrOworCW91dGIoY3IsIEVXUkszX0NSKTsKKworCWlmIChjc3IgJiBDU1JfUk5FKQkvKiBSeCBpbnRlcnJ1cHQgKHBhY2tldFtzXSBhcnJpdmVkKSAqLworCQlld3JrM19yeChkZXYpOworCisJaWYgKGNzciAmIENTUl9UTkUpCS8qIFR4IGludGVycnVwdCAocGFja2V0IHNlbnQpICovCisJCWV3cmszX3R4KGRldik7CisKKwkvKgorCSAqKiBOb3cgZGVhbCB3aXRoIHRoZSBUWC9SWCBkaXNhYmxlIGZsYWdzLiBUaGVzZSBhcmUgc2V0IHdoZW4gdGhlcmUKKwkgKiogYXJlIG5vIG1vcmUgcmVzb3VyY2VzLiBJZiByZXNvdXJjZXMgZnJlZSB1cCB0aGVuIGVuYWJsZSB0aGVzZQorCSAqKiBpbnRlcnJ1cHRzLCBvdGhlcndpc2UgbWFzayB0aGVtIC0gZmFpbHVyZSB0byBkbyB0aGlzIHdpbGwgcmVzdWx0CisJICoqIGluIHRoZSBzeXN0ZW0gaGFuZ2luZyBpbiBhbiBpbnRlcnJ1cHQgbG9vcC4KKwkgKi8KKwlpZiAoaW5iKEVXUkszX0ZNUUMpKSB7CS8qIGFueSByZXNvdXJjZXMgYXZhaWxhYmxlPyAqLworCQlscC0+aXJxX21hc2sgfD0gSUNSX1RYRE0gfCBJQ1JfUlhETTsJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgc291cmNlICovCisJCWNzciAmPSB+KENTUl9UWEQgfCBDU1JfUlhEKTsJLyogZW5zdXJlIHJlc3RhcnQgb2YgYSBzdGFsbGVkIFRYIG9yIFJYICovCisJCW91dGIoY3NyLCBFV1JLM19DU1IpOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfSBlbHNlIHsKKwkJbHAtPmlycV9tYXNrICY9IH4oSUNSX1RYRE0gfCBJQ1JfUlhETSk7CQkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgc291cmNlICovCisJfQorCisJLyogVW5tYXNrIHRoZSBFV1JLMyBib2FyZCBpbnRlcnJ1cHRzIGFuZCB0dXJuIG9mZiB0aGUgTEVEICovCisJY3IgJj0gfihscC0+bGVkX21hc2spOworCW91dGIoY3IsIEVXUkszX0NSKTsKKwlFTkFCTEVfSVJRczsKKwlzcGluX3VubG9jaygmbHAtPmh3X2xvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogQ2FsbGVkIHdpdGggbHAtPmh3X2xvY2sgaGVsZCAqLworc3RhdGljIGludCBld3JrM19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBld3JrM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCWludCBpLCBzdGF0dXMgPSAwOworCXVfY2hhciBwYWdlOworCXZvaWQgX19pb21lbSAqYnVmID0gTlVMTDsKKworCXdoaWxlIChpbmIoRVdSSzNfUlFDKSAmJiAhc3RhdHVzKSB7CS8qIFdoaWxzdCB0aGVyZSdzIGluY29taW5nIGRhdGEgKi8KKwkJaWYgKChwYWdlID0gaW5iKEVXUkszX1JRKSkgPCBscC0+bVBhZ2UpIHsJLyogR2V0IG5leHQgZW50cnkncyBidWZmZXIgcGFnZSAqLworCQkJLyoKKwkJCSAgICoqIFNldCB1cCBzaGFyZWQgbWVtb3J5IHdpbmRvdyBhbmQgcG9pbnRlciBpbnRvIHRoZSB3aW5kb3cKKwkJCSAqLworCQkJaWYgKGxwLT5zaG1lbV9sZW5ndGggPT0gSU9fT05MWSkgeworCQkJCW91dGIocGFnZSwgRVdSSzNfSU9QUik7CisJCQl9IGVsc2UgaWYgKGxwLT5zaG1lbV9sZW5ndGggPT0gU0hNRU1fMkspIHsKKwkJCQlidWYgPSBscC0+c2htZW07CisJCQkJb3V0YihwYWdlLCBFV1JLM19NUFIpOworCQkJfSBlbHNlIGlmIChscC0+c2htZW1fbGVuZ3RoID09IFNITUVNXzMySykgeworCQkJCWJ1ZiA9ICgoKHNob3J0KSBwYWdlIDw8IDExKSAmIDB4NzgwMCkgKyBscC0+c2htZW07CisJCQkJb3V0YigocGFnZSA+PiA0KSwgRVdSSzNfTVBSKTsKKwkJCX0gZWxzZSBpZiAobHAtPnNobWVtX2xlbmd0aCA9PSBTSE1FTV82NEspIHsKKwkJCQlidWYgPSAoKChzaG9ydCkgcGFnZSA8PCAxMSkgJiAweGY4MDApICsgbHAtPnNobWVtOworCQkJCW91dGIoKHBhZ2UgPj4gNSksIEVXUkszX01QUik7CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IC0xOworCQkJCXByaW50aygiJXM6IE9vcHMgLSB5b3VyIHByaXZhdGUgZGF0YSBhcmVhIGlzIGhvc2VkIVxuIiwgZGV2LT5uYW1lKTsKKwkJCX0KKworCQkJaWYgKCFzdGF0dXMpIHsKKwkJCQljaGFyIHJ4X3N0YXR1czsKKwkJCQlpbnQgcGt0X2xlbjsKKworCQkJCWlmIChscC0+c2htZW1fbGVuZ3RoID09IElPX09OTFkpIHsKKwkJCQkJcnhfc3RhdHVzID0gaW5iKEVXUkszX0RBVEEpOworCQkJCQlwa3RfbGVuID0gaW5iKEVXUkszX0RBVEEpOworCQkJCQlwa3RfbGVuIHw9ICgodV9zaG9ydCkgaW5iKEVXUkszX0RBVEEpIDw8IDgpOworCQkJCX0gZWxzZSB7CisJCQkJCXJ4X3N0YXR1cyA9IHJlYWRiKGJ1Zik7CisJCQkJCWJ1ZiArPSAxOworCQkJCQlwa3RfbGVuID0gcmVhZHcoYnVmKTsKKwkJCQkJYnVmICs9IDM7CisJCQkJfQorCisJCQkJaWYgKCEocnhfc3RhdHVzICYgUl9ST0spKSB7CS8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KKwkJCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOwkvKiBVcGRhdGUgdGhlIGVycm9yIHN0YXRzLiAqLworCQkJCQlpZiAocnhfc3RhdHVzICYgUl9EQkUpCisJCQkJCQlscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJCWlmIChyeF9zdGF0dXMgJiBSX0NSQykKKwkJCQkJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJCWlmIChyeF9zdGF0dXMgJiBSX1BMTCkKKwkJCQkJCWxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJCX0gZWxzZSB7CisJCQkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCQkJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgeworCQkJCQkJdW5zaWduZWQgY2hhciAqcDsKKwkJCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gdG8gMTYgYnl0ZXMgKi8KKwkJCQkJCXAgPSBza2JfcHV0KHNrYiwgcGt0X2xlbik7CisKKwkJCQkJCWlmIChscC0+c2htZW1fbGVuZ3RoID09IElPX09OTFkpIHsKKwkJCQkJCQkqcCA9IGluYihFV1JLM19EQVRBKTsJLyogZHVtbXkgcmVhZCAqLworCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBwa3RfbGVuOyBpKyspIHsKKwkJCQkJCQkJKnArKyA9IGluYihFV1JLM19EQVRBKTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCW1lbWNweV9mcm9taW8ocCwgYnVmLCBwa3RfbGVuKTsKKwkJCQkJCX0KKworCQkJCQkJZm9yIChpID0gMTsgaSA8IEVXUkszX1BLVF9TVEFUX1NaIC0gMTsgaSsrKSB7CisJCQkJCQkJaWYgKHBrdF9sZW4gPCBpICogRVdSSzNfUEtUX0JJTl9TWikgeworCQkJCQkJCQlscC0+cGt0U3RhdHMuYmluc1tpXSsrOworCQkJCQkJCQlpID0gRVdSSzNfUEtUX1NUQVRfU1o7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJcCA9IHNrYi0+ZGF0YTsJLyogTG9vayBhdCB0aGUgZGVzdCBhZGRyICovCisJCQkJCQlpZiAocFswXSAmIDB4MDEpIHsJLyogTXVsdGljYXN0L0Jyb2FkY2FzdCAqLworCQkJCQkJCWlmICgoKihzMTYgKikgJiBwWzBdID09IC0xKSAmJiAoKihzMTYgKikgJiBwWzJdID09IC0xKSAmJiAoKihzMTYgKikgJiBwWzRdID09IC0xKSkgeworCQkJCQkJCQlscC0+cGt0U3RhdHMuYnJvYWRjYXN0Kys7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJbHAtPnBrdFN0YXRzLm11bHRpY2FzdCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoKCooczE2ICopICYgcFswXSA9PSAqKHMxNiAqKSAmIGRldi0+ZGV2X2FkZHJbMF0pICYmCisJCQkJCQkJICAgKCooczE2ICopICYgcFsyXSA9PSAqKHMxNiAqKSAmIGRldi0+ZGV2X2FkZHJbMl0pICYmCisJCQkJCQkJICAgKCooczE2ICopICYgcFs0XSA9PSAqKHMxNiAqKSAmIGRldi0+ZGV2X2FkZHJbNF0pKSB7CisJCQkJCQkJbHAtPnBrdFN0YXRzLnVuaWNhc3QrKzsKKwkJCQkJCX0KKwkJCQkJCWxwLT5wa3RTdGF0cy5iaW5zWzBdKys7CQkvKiBEdXBsaWNhdGVzIHN0YXRzLnJ4X3BhY2tldHMgKi8KKwkJCQkJCWlmIChscC0+cGt0U3RhdHMuYmluc1swXSA9PSAwKSB7CS8qIFJlc2V0IGNvdW50ZXJzICovCisJCQkJCQkJbWVtc2V0KCZscC0+cGt0U3RhdHMsIDAsIHNpemVvZihscC0+cGt0U3RhdHMpKTsKKwkJCQkJCX0KKwkJCQkJCS8qCisJCQkJCQkgICAqKiBOb3RpZnkgdGhlIHVwcGVyIHByb3RvY29sIGxheWVycyB0aGF0IHRoZXJlIGlzIGFub3RoZXIKKwkJCQkJCSAgICoqIHBhY2tldCB0byBoYW5kbGUKKwkJCQkJCSAqLworCQkJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQkJCW5ldGlmX3J4KHNrYik7CisKKwkJCQkJCS8qCisJCQkJCQkgICAqKiBVcGRhdGUgc3RhdHMKKwkJCQkJCSAqLworCQkJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByaW50aygiJXM6IEluc3VmZmljaWVudCBtZW1vcnk7IG51a2luZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQkJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsJCS8qIFJlYWxseSwgZGVmZXJyZWQuICovCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgICAqKiBSZXR1cm4gdGhlIHJlY2VpdmVkIGJ1ZmZlciB0byB0aGUgZnJlZSBtZW1vcnkgcXVldWUKKwkJCSAqLworCQkJb3V0YihwYWdlLCBFV1JLM19GTVEpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJld3JrM19yeCgpOiBJbGxlZ2FsIHBhZ2UgbnVtYmVyLCBwYWdlICVkXG4iLCBwYWdlKTsKKwkJCXByaW50aygiZXdyazNfcngoKTogQ1NSOiAlMDJ4IElDUjogJTAyeCBGTVFDOiAlMDJ4XG4iLCBpbmIoRVdSSzNfQ1NSKSwgaW5iKEVXUkszX0lDUiksIGluYihFV1JLM19GTVFDKSk7CisJCX0KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyoqIEJ1ZmZlciBzZW50IC0gY2hlY2sgZm9yIFRYIGJ1ZmZlciBlcnJvcnMuCisqKiBDYWxsZWQgd2l0aCBscC0+aHdfbG9jayBoZWxkCisqLworc3RhdGljIGludCBld3JrM190eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBld3JrM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXVfY2hhciB0eF9zdGF0dXM7CisKKwl3aGlsZSAoKHR4X3N0YXR1cyA9IGluYihFV1JLM19URFEpKSA+IDApIHsJLyogV2hpbHN0IHRoZXJlJ3Mgb2xkIGJ1ZmZlcnMgKi8KKwkJaWYgKHR4X3N0YXR1cyAmIFRfVlNUUykgewkvKiBUaGUgc3RhdHVzIGlzIHZhbGlkICovCisJCQlpZiAodHhfc3RhdHVzICYgVF9UWEUpIHsKKwkJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJaWYgKHR4X3N0YXR1cyAmIFRfTkNMKQorCQkJCQlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQlpZiAodHhfc3RhdHVzICYgVF9MQ0wpCisJCQkJCWxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQkJaWYgKHR4X3N0YXR1cyAmIFRfQ1RVKSB7CisJCQkJCWlmICgodHhfc3RhdHVzICYgVF9DT0xMKSBeIFRfWFVSKSB7CisJCQkJCQlscC0+cGt0U3RhdHMudHhfdW5kZXJydW5zKys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlscC0+cGt0U3RhdHMuZXhjZXNzaXZlX3VuZGVycnVucysrOworCQkJCQl9CisJCQkJfSBlbHNlIGlmICh0eF9zdGF0dXMgJiBUX0NPTEwpIHsKKwkJCQkJaWYgKCh0eF9zdGF0dXMgJiBUX0NPTEwpIF4gVF9YQ09MTCkgeworCQkJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxwLT5wa3RTdGF0cy5leGNlc3NpdmVfY29sbGlzaW9ucysrOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXdyazNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXdyazNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwl1X2NoYXIgaWNyLCBjc3I7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJaWYgKGV3cmszX2RlYnVnID4gMSkgeworCQlwcmludGsoIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlMi4yeC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGluYihFV1JLM19DU1IpKTsKKwl9CisJLyoKKwkgICAqKiBXZSBzdG9wIHRoZSBFV1JLMyBoZXJlLi4uIG1hc2sgaW50ZXJydXB0cyBhbmQgc3RvcCBUWCAmIFJYCisJICovCisJRElTQUJMRV9JUlFzOworCisJU1RPUF9FV1JLMzsKKworCS8qCisJICAgKiogQ2xlYW4gb3V0IHRoZSBUWCBhbmQgUlggcXVldWVzIGhlcmUgKG5vdGUgdGhhdCBvbmUgZW50cnkKKwkgICAqKiBtYXkgZ2V0IGFkZGVkIHRvIGVpdGhlciB0aGUgVFhEIG9yIFJYIHF1ZXVlcyBpZiB0aGUgVFggb3IgUlgKKwkgICAqKiBqdXN0IHN0YXJ0cyBwcm9jZXNzaW5nIGEgcGFja2V0IGJlZm9yZSB0aGUgU1RPUF9FV1JLMyBjb21tYW5kCisJICAgKiogaXMgcmVjZWl2ZWQuIFRoaXMgd2lsbCBiZSBmbHVzaGVkIGluIHRoZSBld3JrM19vcGVuKCkgY2FsbCkuCisJICovCisJd2hpbGUgKGluYihFV1JLM19UUSkpOworCXdoaWxlIChpbmIoRVdSSzNfVERRKSk7CisJd2hpbGUgKGluYihFV1JLM19SUSkpOworCisJaWYgKCFscC0+aGFyZF9zdHJhcHBlZCkgeworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZXdyazNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV3cmszX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIE51bGwgYm9keSBzaW5jZSB0aGVyZSBpcyBubyBmcmFtaW5nIGVycm9yIGNvdW50ZXIgKi8KKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyoKKyAgICoqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdGVyLgorICovCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXdyazNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwl1X2NoYXIgY3NyOworCisJY3NyID0gaW5iKEVXUkszX0NTUik7CisKKwlpZiAobHAtPnNobWVtX2xlbmd0aCA9PSBJT19PTkxZKSB7CisJCWxwLT5tY3RibCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJbHAtPm1jdGJsID0gbHAtPnNobWVtICsgUEFHRTBfSFRFOworCX0KKworCWNzciAmPSB+KENTUl9QTUUgfCBDU1JfTUNFKTsKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CQkvKiBzZXQgcHJvbWlzY3VvdXMgbW9kZSAqLworCQljc3IgfD0gQ1NSX1BNRTsKKwkJb3V0Yihjc3IsIEVXUkszX0NTUik7CisJfSBlbHNlIHsKKwkJU2V0TXVsdGljYXN0RmlsdGVyKGRldik7CisJCWNzciB8PSBDU1JfTUNFOworCQlvdXRiKGNzciwgRVdSSzNfQ1NSKTsKKwl9Cit9CisKKy8qCisgICAqKiBDYWxjdWxhdGUgdGhlIGhhc2ggY29kZSBhbmQgdXBkYXRlIHRoZSBsb2dpY2FsIGFkZHJlc3MgZmlsdGVyCisgICAqKiBmcm9tIGEgbGlzdCBvZiBldGhlcm5ldCBtdWx0aWNhc3QgYWRkcmVzc2VzLgorICAgKiogTGl0dGxlIGVuZGlhbiBjcmMgb25lIGxpbmVyIGZyb20gTWF0dCBUaG9tYXMsIERFQy4KKyAgICoqCisgICAqKiBOb3RlIHRoYXQgd2hlbiBjbGVhcmluZyB0aGUgdGFibGUsIHRoZSBicm9hZGNhc3QgYml0IG11c3QgcmVtYWluIGFzc2VydGVkCisgICAqKiB0byByZWNlaXZlIGJyb2FkY2FzdCBtZXNzYWdlcy4KKyAqLworc3RhdGljIHZvaWQgU2V0TXVsdGljYXN0RmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV3cmszX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwl1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisJY2hhciAqYWRkcnMsIGJpdCwgYnl0ZTsKKwlzaG9ydCBfX2lvbWVtICpwID0gbHAtPm1jdGJsOworCXUxNiBoYXNoY29kZTsKKwl1MzIgY3JjOworCisJc3Bpbl9sb2NrX2lycSgmbHAtPmh3X2xvY2spOworCisJaWYgKGxwLT5zaG1lbV9sZW5ndGggPT0gSU9fT05MWSkgeworCQlvdXRiKDAsIEVXUkszX0lPUFIpOworCQlvdXR3KFBBR0UwX0hURSwgRVdSSzNfUElSMSk7CisJfSBlbHNlIHsKKwkJb3V0YigwLCBFV1JLM19NUFIpOworCX0KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCWZvciAoaSA9IDA7IGkgPCAoSEFTSF9UQUJMRV9MRU4gPj4gMyk7IGkrKykgeworCQkJaWYgKGxwLT5zaG1lbV9sZW5ndGggPT0gSU9fT05MWSkgeworCQkJCW91dGIoMHhmZiwgRVdSSzNfREFUQSk7CisJCQl9IGVsc2UgewkvKiBtZW1zZXQgZGlkbid0IHdvcmsgaGVyZSAqLworCQkJCXdyaXRldygweGZmZmYsIHApOworCQkJCXArKzsKKwkJCQlpKys7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBDbGVhciB0YWJsZSBleGNlcHQgZm9yIGJyb2FkY2FzdCBiaXQgKi8KKwkJaWYgKGxwLT5zaG1lbV9sZW5ndGggPT0gSU9fT05MWSkgeworCQkJZm9yIChpID0gMDsgaSA8IChIQVNIX1RBQkxFX0xFTiA+PiA0KSAtIDE7IGkrKykgeworCQkJCW91dGIoMHgwMCwgRVdSSzNfREFUQSk7CisJCQl9CisJCQlvdXRiKDB4ODAsIEVXUkszX0RBVEEpOworCQkJaSsrOwkvKiBpbnNlcnQgdGhlIGJyb2FkY2FzdCBiaXQgKi8KKwkJCWZvciAoOyBpIDwgKEhBU0hfVEFCTEVfTEVOID4+IDMpOyBpKyspIHsKKwkJCQlvdXRiKDB4MDAsIEVXUkszX0RBVEEpOworCQkJfQorCQl9IGVsc2UgeworCQkJbWVtc2V0X2lvKGxwLT5tY3RibCwgMCwgSEFTSF9UQUJMRV9MRU4gPj4gMyk7CisJCQl3cml0ZWIoMHg4MCwgbHAtPm1jdGJsICsgKEhBU0hfVEFCTEVfTEVOID4+IDQpIC0gMSk7CisJCX0KKworCQkvKiBVcGRhdGUgdGFibGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgewkvKiBmb3IgZWFjaCBhZGRyZXNzIGluIHRoZSBsaXN0ICovCisJCQlhZGRycyA9IGRtaS0+ZG1pX2FkZHI7CisJCQlkbWkgPSBkbWktPm5leHQ7CisJCQlpZiAoKCphZGRycyAmIDB4MDEpID09IDEpIHsJLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCisJCQkJY3JjID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBhZGRycyk7CisJCQkJaGFzaGNvZGUgPSBjcmMgJiAoKDEgPDwgOSkgLSAxKTsJLyogaGFzaGNvZGUgaXMgOSBMU2Igb2YgQ1JDICovCisKKwkJCQlieXRlID0gaGFzaGNvZGUgPj4gMzsJLyogYml0WzMtOF0gLT4gYnl0ZSBpbiBmaWx0ZXIgKi8KKwkJCQliaXQgPSAxIDw8IChoYXNoY29kZSAmIDB4MDcpOwkvKiBiaXRbMC0yXSAtPiBiaXQgaW4gYnl0ZSAqLworCisJCQkJaWYgKGxwLT5zaG1lbV9sZW5ndGggPT0gSU9fT05MWSkgeworCQkJCQl1X2NoYXIgdG1wOworCisJCQkJCW91dHcoUEFHRTBfSFRFICsgYnl0ZSwgRVdSSzNfUElSMSk7CisJCQkJCXRtcCA9IGluYihFV1JLM19EQVRBKTsKKwkJCQkJdG1wIHw9IGJpdDsKKwkJCQkJb3V0dyhQQUdFMF9IVEUgKyBieXRlLCBFV1JLM19QSVIxKTsKKwkJCQkJb3V0Yih0bXAsIEVXUkszX0RBVEEpOworCQkJCX0gZWxzZSB7CisJCQkJCXdyaXRlYihyZWFkYihscC0+bWN0YmwgKyBieXRlKSB8IGJpdCwgbHAtPm1jdGJsICsgYnl0ZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZscC0+aHdfbG9jayk7Cit9CisKKy8qCisgICAqKiBJU0EgYnVzIEkvTyBkZXZpY2UgcHJvYmUKKyAqLworc3RhdGljIGludCBfX2luaXQgaXNhX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2FkZHIpCit7CisJaW50IGkgPSBudW1fZXdya3MzcywgbWF4U2xvdHM7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwl1X2xvbmcgaW9iYXNlOworCisJaWYgKGlvYWRkciA+PSAweDQwMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoaW9hZGRyID09IDApIHsJLyogQXV0b3Byb2JpbmcgKi8KKwkJaW9iYXNlID0gRVdSSzNfSU9fQkFTRTsJCS8qIEdldCB0aGUgZmlyc3Qgc2xvdCBhZGRyZXNzICovCisJCW1heFNsb3RzID0gMjQ7CisJfSBlbHNlIHsJCS8qIFByb2JlIGEgc3BlY2lmaWMgbG9jYXRpb24gKi8KKwkJaW9iYXNlID0gaW9hZGRyOworCQltYXhTbG90cyA9IGkgKyAxOworCX0KKworCWZvciAoOyAoaSA8IG1heFNsb3RzKSAmJiAoZGV2ICE9IE5VTEwpOworCSAgICAgaW9iYXNlICs9IEVXUkszX0lPUF9JTkMsIGkrKykKKwl7CisJCWlmIChyZXF1ZXN0X3JlZ2lvbihpb2Jhc2UsIEVXUkszX1RPVEFMX1NJWkUsIERSVl9OQU1FKSkgeworCQkJaWYgKERldmljZVByZXNlbnQoaW9iYXNlKSA9PSAwKSB7CisJCQkJaW50IGlycSA9IGRldi0+aXJxOworCQkJCXJldCA9IGV3cmszX2h3X2luaXQoZGV2LCBpb2Jhc2UpOworCQkJCWlmICghcmV0KQorCQkJCQlicmVhazsKKwkJCQlkZXYtPmlycSA9IGlycTsKKwkJCX0KKwkJCXJlbGVhc2VfcmVnaW9uKGlvYmFzZSwgRVdSSzNfVE9UQUxfU0laRSk7CisJCX0KKwl9Cisgb3V0OgorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAgICoqIEVJU0EgYnVzIEkvTyBkZXZpY2UgcHJvYmUuIFByb2JlIGZyb20gc2xvdCAxIHNpbmNlIHNsb3QgMCBpcyB1c3VhbGx5CisgICAqKiB0aGUgbW90aGVyYm9hcmQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGVpc2FfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9sb25nIGlvYWRkcikKK3sKKwlpbnQgaSwgbWF4U2xvdHM7CisJdV9sb25nIGlvYmFzZTsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCWlmIChpb2FkZHIgPCAweDEwMDApCisJCWdvdG8gb3V0OworCisJaWYgKGlvYWRkciA9PSAwKSB7CS8qIEF1dG9wcm9iaW5nICovCisJCWlvYmFzZSA9IEVJU0FfU0xPVF9JTkM7CQkvKiBHZXQgdGhlIGZpcnN0IHNsb3QgYWRkcmVzcyAqLworCQlpID0gMTsKKwkJbWF4U2xvdHMgPSBNQVhfRUlTQV9TTE9UUzsKKwl9IGVsc2UgewkJLyogUHJvYmUgYSBzcGVjaWZpYyBsb2NhdGlvbiAqLworCQlpb2Jhc2UgPSBpb2FkZHI7CisJCWkgPSAoaW9hZGRyID4+IDEyKTsKKwkJbWF4U2xvdHMgPSBpICsgMTsKKwl9CisKKwlmb3IgKGkgPSAxOyAoaSA8IG1heFNsb3RzKSAmJiAoZGV2ICE9IE5VTEwpOyBpKyssIGlvYmFzZSArPSBFSVNBX1NMT1RfSU5DKSB7CisJCWlmIChFSVNBX3NpZ25hdHVyZShuYW1lLCBFSVNBX0lEKSA9PSAwKSB7CisJCQlpZiAocmVxdWVzdF9yZWdpb24oaW9iYXNlLCBFV1JLM19UT1RBTF9TSVpFLCBEUlZfTkFNRSkgJiYKKwkJCSAgICBEZXZpY2VQcmVzZW50KGlvYmFzZSkgPT0gMCkgeworCQkJCWludCBpcnEgPSBkZXYtPmlycTsKKwkJCQlyZXQgPSBld3JrM19od19pbml0KGRldiwgaW9iYXNlKTsKKwkJCQlpZiAoIXJldCkKKwkJCQkJYnJlYWs7CisJCQkJZGV2LT5pcnEgPSBpcnE7CisJCQl9CisJCQlyZWxlYXNlX3JlZ2lvbihpb2Jhc2UsIEVXUkszX1RPVEFMX1NJWkUpOworCQl9CisJfQorCisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAgICoqIFJlYWQgdGhlIEVXUkszIEVFUFJPTSB1c2luZyB0aGlzIHJvdXRpbmUKKyAqLworc3RhdGljIGludCBSZWFkX0VFUFJPTSh1X2xvbmcgaW9iYXNlLCB1X2NoYXIgZWFkZHIpCit7CisJaW50IGk7CisKKwlvdXRiKChlYWRkciAmIDB4M2YpLCBFV1JLM19QSVIxKTsJLyogc2V0IHVwIDYgYml0cyBvZiBhZGRyZXNzIGluZm8gKi8KKwlvdXRiKEVFUFJPTV9SRCwgRVdSSzNfSU9QUik7CS8qIGlzc3VlIHJlYWQgY29tbWFuZCAqLworCWZvciAoaSA9IDA7IGkgPCA1MDAwOyBpKyspCisJCWluYihFV1JLM19DU1IpOwkvKiB3YWl0IDFtc2VjICovCisKKwlyZXR1cm4gaW53KEVXUkszX0VQUk9NMSk7CS8qIDE2IGJpdHMgZGF0YSByZXR1cm4gKi8KK30KKworLyoKKyAgICoqIFdyaXRlIHRoZSBFV1JLMyBFRVBST00gdXNpbmcgdGhpcyByb3V0aW5lCisgKi8KK3N0YXRpYyBpbnQgV3JpdGVfRUVQUk9NKHNob3J0IGRhdGEsIHVfbG9uZyBpb2Jhc2UsIHVfY2hhciBlYWRkcikKK3sKKwlpbnQgaTsKKworCW91dGIoRUVQUk9NX1dSX0VOLCBFV1JLM19JT1BSKTsJCS8qIGlzc3VlIHdyaXRlIGVuYWJsZSBjb21tYW5kICovCisJZm9yIChpID0gMDsgaSA8IDUwMDA7IGkrKykKKwkJaW5iKEVXUkszX0NTUik7CS8qIHdhaXQgMW1zZWMgKi8KKwlvdXR3KGRhdGEsIEVXUkszX0VQUk9NMSk7CS8qIHdyaXRlIGRhdGEgdG8gcmVnaXN0ZXIgKi8KKwlvdXRiKChlYWRkciAmIDB4M2YpLCBFV1JLM19QSVIxKTsJLyogc2V0IHVwIDYgYml0cyBvZiBhZGRyZXNzIGluZm8gKi8KKwlvdXRiKEVFUFJPTV9XUiwgRVdSSzNfSU9QUik7CS8qIGlzc3VlIHdyaXRlIGNvbW1hbmQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNzUwMDA7IGkrKykKKwkJaW5iKEVXUkszX0NTUik7CS8qIHdhaXQgMTVtc2VjICovCisJb3V0YihFRVBST01fV1JfRElTLCBFV1JLM19JT1BSKTsJLyogaXNzdWUgd3JpdGUgZGlzYWJsZSBjb21tYW5kICovCisJZm9yIChpID0gMDsgaSA8IDUwMDA7IGkrKykKKwkJaW5iKEVXUkszX0NTUik7CS8qIHdhaXQgMW1zZWMgKi8KKworCXJldHVybiAwOworfQorCisvKgorICAgKiogTG9vayBmb3IgYSBwYXJ0aWN1bGFyIGJvYXJkIG5hbWUgaW4gdGhlIG9uLWJvYXJkIEVFUFJPTS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IEV0aHdya1NpZ25hdHVyZShjaGFyICpuYW1lLCBjaGFyICplZXByb21faW1hZ2UpCit7CisJaW50IGk7CisJY2hhciAqc2lnbmF0dXJlc1tdID0gRVdSSzNfU0lHTkFUVVJFOworCisJZm9yIChpPTA7ICpzaWduYXR1cmVzW2ldICE9ICdcMCc7IGkrKykKKwkJaWYoICFzdHJuY21wKGVlcHJvbV9pbWFnZStFRVBST01fUE5BTUU3LCBzaWduYXR1cmVzW2ldLCBzdHJsZW4oc2lnbmF0dXJlc1tpXSkpICkKKwkJCWJyZWFrOworCisJaWYgKCpzaWduYXR1cmVzW2ldICE9ICdcMCcpIHsKKwkJbWVtY3B5KG5hbWUsIGVlcHJvbV9pbWFnZStFRVBST01fUE5BTUU3LCBFV1JLM19TVFJMRU4pOworCQluYW1lW0VXUkszX1NUUkxFTl0gPSAnXDAnOworCX0gZWxzZQorCQluYW1lWzBdID0gJ1wwJzsKKworCXJldHVybjsKK30KKworLyoKKyAgICoqIExvb2sgZm9yIGEgc3BlY2lhbCBzZXF1ZW5jZSBpbiB0aGUgRXRoZXJuZXQgc3RhdGlvbiBhZGRyZXNzIFBST00gdGhhdAorICAgKiogaXMgY29tbW9uIGFjcm9zcyBhbGwgRVdSSzMgcHJvZHVjdHMuCisgICAqKgorICAgKiogU2VhcmNoIHRoZSBFdGhlcm5ldCBhZGRyZXNzIFJPTSBmb3IgdGhlIHNpZ25hdHVyZS4gU2luY2UgdGhlIFJPTSBhZGRyZXNzCisgICAqKiBjb3VudGVyIGNhbiBzdGFydCBhdCBhbiBhcmJpdHJhcnkgcG9pbnQsIHRoZSBzZWFyY2ggbXVzdCBpbmNsdWRlIHRoZSBlbnRpcmUKKyAgICoqIHByb2JlIHNlcXVlbmNlIGxlbmd0aCBwbHVzIHRoZSAobGVuZ3RoX29mX3RoZV9zaWduYXR1cmUgLSAxKS4KKyAgICoqIFN0b3AgdGhlIHNlYXJjaCBJTU1FRElBVEVMWSBhZnRlciB0aGUgc2lnbmF0dXJlIGlzIGZvdW5kIHNvIHRoYXQgdGhlCisgICAqKiBQUk9NIGFkZHJlc3MgY291bnRlciBpcyBjb3JyZWN0bHkgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlCisgICAqKiBldGhlcm5ldCBhZGRyZXNzIGZvciBsYXRlciByZWFkIG91dC4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBEZXZpY2VQcmVzZW50KHVfbG9uZyBpb2Jhc2UpCit7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTMyIGE7CisJCQl1MzIgYjsKKwkJfSBsbHNpZzsKKwkJY2hhciBTaWdbc2l6ZW9mKHUzMikgPDwgMV07CisJfQorCWRldjsKKwlzaG9ydCBzaWdMZW5ndGg7CisJY2hhciBkYXRhOworCWludCBpLCBqLCBzdGF0dXMgPSAwOworCisJZGV2Lmxsc2lnLmEgPSBFVEhfUFJPTV9TSUc7CisJZGV2Lmxsc2lnLmIgPSBFVEhfUFJPTV9TSUc7CisJc2lnTGVuZ3RoID0gc2l6ZW9mKHUzMikgPDwgMTsKKworCWZvciAoaSA9IDAsIGogPSAwOyBqIDwgc2lnTGVuZ3RoICYmIGkgPCBQUk9CRV9MRU5HVEggKyBzaWdMZW5ndGggLSAxOyBpKyspIHsKKwkJZGF0YSA9IGluYihFV1JLM19BUFJPTSk7CisJCWlmIChkZXYuU2lnW2pdID09IGRhdGEpIHsJLyogdHJhY2sgc2lnbmF0dXJlICovCisJCQlqKys7CisJCX0gZWxzZSB7CS8qIGxvc3Qgc2lnbmF0dXJlOyBiZWdpbiBzZWFyY2ggYWdhaW4gKi8KKwkJCWlmIChkYXRhID09IGRldi5TaWdbMF0pIHsKKwkJCQlqID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJaiA9IDA7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaiAhPSBzaWdMZW5ndGgpIHsKKwkJc3RhdHVzID0gLUVOT0RFVjsJLyogc2VhcmNoIGZhaWxlZCAqLworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdV9jaGFyIF9faW5pdCBnZXRfaHdfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgKiBlZXByb21faW1hZ2UsIGNoYXIgY2hpcFR5cGUpCit7CisJaW50IGksIGosIGs7CisJdV9zaG9ydCBjaGtzdW07CisJdV9jaGFyIGNyYywgbGZzciwgc2QsIHN0YXR1cyA9IDA7CisJdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXUxNiB0bXA7CisKKwlpZiAoY2hpcFR5cGUgPT0gTGVNQUMyKSB7CisJCWZvciAoY3JjID0gMHg2YSwgaiA9IDA7IGogPCBFVEhfQUxFTjsgaisrKSB7CisJCQlzZCA9IGRldi0+ZGV2X2FkZHJbal0gPSBlZXByb21faW1hZ2VbRUVQUk9NX1BBRERSMCArIGpdOworCQkJb3V0YihkZXYtPmRldl9hZGRyW2pdLCBFV1JLM19QQVIwICsgaik7CisJCQlmb3IgKGsgPSAwOyBrIDwgODsgaysrLCBzZCA+Pj0gMSkgeworCQkJCWxmc3IgPSAoKCgoY3JjICYgMHgwMikgPj4gMSkgXiAoY3JjICYgMHgwMSkpIF4gKHNkICYgMHgwMSkpIDw8IDc7CisJCQkJY3JjID0gKGNyYyA+PiAxKSArIGxmc3I7CisJCQl9CisJCX0KKwkJaWYgKGNyYyAhPSBlZXByb21faW1hZ2VbRUVQUk9NX1BBX0NSQ10pCisJCQlzdGF0dXMgPSAtMTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwLCBrID0gMDsgaSA8IEVUSF9BTEVOOykgeworCQkJayA8PD0gMTsKKwkJCWlmIChrID4gMHhmZmZmKQorCQkJCWsgLT0gMHhmZmZmOworCisJCQlrICs9ICh1X2NoYXIpICh0bXAgPSBpbmIoRVdSSzNfQVBST00pKTsKKwkJCWRldi0+ZGV2X2FkZHJbaV0gPSAodV9jaGFyKSB0bXA7CisJCQlvdXRiKGRldi0+ZGV2X2FkZHJbaV0sIEVXUkszX1BBUjAgKyBpKTsKKwkJCWkrKzsKKwkJCWsgKz0gKHVfc2hvcnQpICgodG1wID0gaW5iKEVXUkszX0FQUk9NKSkgPDwgOCk7CisJCQlkZXYtPmRldl9hZGRyW2ldID0gKHVfY2hhcikgdG1wOworCQkJb3V0YihkZXYtPmRldl9hZGRyW2ldLCBFV1JLM19QQVIwICsgaSk7CisJCQlpKys7CisKKwkJCWlmIChrID4gMHhmZmZmKQorCQkJCWsgLT0gMHhmZmZmOworCQl9CisJCWlmIChrID09IDB4ZmZmZikKKwkJCWsgPSAwOworCQljaGtzdW0gPSBpbmIoRVdSSzNfQVBST00pOworCQljaGtzdW0gfD0gKGluYihFV1JLM19BUFJPTSkgPDwgOCk7CisJCWlmIChrICE9IGNoa3N1bSkKKwkJCXN0YXR1cyA9IC0xOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAqKiBMb29rIGZvciBhIHBhcnRpY3VsYXIgYm9hcmQgbmFtZSBpbiB0aGUgRUlTQSBjb25maWd1cmF0aW9uIHNwYWNlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IEVJU0Ffc2lnbmF0dXJlKGNoYXIgKm5hbWUsIHMzMiBlaXNhX2lkKQoreworCXVfbG9uZyBpOworCWNoYXIgKnNpZ25hdHVyZXNbXSA9IEVXUkszX1NJR05BVFVSRTsKKwljaGFyIE1hbkNvZGVbRVdSSzNfU1RSTEVOXTsKKwl1bmlvbiB7CisJCXMzMiBJRDsKKwkJY2hhciBJZFs0XTsKKwl9IEVpc2E7CisJaW50IHN0YXR1cyA9IDA7CisKKwkqbmFtZSA9ICdcMCc7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlFaXNhLklkW2ldID0gaW5iKGVpc2FfaWQgKyBpKTsKKwl9CisKKwlNYW5Db2RlWzBdID0gKCgoRWlzYS5JZFswXSA+PiAyKSAmIDB4MWYpICsgMHg0MCk7CisJTWFuQ29kZVsxXSA9ICgoKEVpc2EuSWRbMV0gJiAweGUwKSA+PiA1KSArICgoRWlzYS5JZFswXSAmIDB4MDMpIDw8IDMpICsgMHg0MCk7CisJTWFuQ29kZVsyXSA9ICgoKEVpc2EuSWRbMl0gPj4gNCkgJiAweDBmKSArIDB4MzApOworCU1hbkNvZGVbM10gPSAoKEVpc2EuSWRbMl0gJiAweDBmKSArIDB4MzApOworCU1hbkNvZGVbNF0gPSAoKChFaXNhLklkWzNdID4+IDQpICYgMHgwZikgKyAweDMwKTsKKwlNYW5Db2RlWzVdID0gJ1wwJzsKKworCWZvciAoaSA9IDA7ICgqc2lnbmF0dXJlc1tpXSAhPSAnXDAnKSAmJiAoKm5hbWUgPT0gJ1wwJyk7IGkrKykgeworCQlpZiAoc3Ryc3RyKE1hbkNvZGUsIHNpZ25hdHVyZXNbaV0pICE9IE5VTEwpIHsKKwkJCXN0cmNweShuYW1lLCBNYW5Db2RlKTsKKwkJCXN0YXR1cyA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOwkJLyogcmV0dXJuIHRoZSBkZXZpY2UgbmFtZSBzdHJpbmcgKi8KK30KKworc3RhdGljIHZvaWQgZXdyazNfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlpbnQgZndyZXYgPSBSZWFkX0VFUFJPTShkZXYtPmJhc2VfYWRkciwgRUVQUk9NX1JFVkxWTCk7CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzcHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sICIlZCIsIGZ3cmV2KTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sICJOL0EiKTsKKwlpbmZvLT5lZWR1bXBfbGVuID0gRUVQUk9NX01BWDsKK30KKworc3RhdGljIGludCBld3JrM19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBld3JrM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwl1OCBjciA9IGluYihFV1JLM19DUik7CisKKwlzd2l0Y2ggKGxwLT5hZGFwdGVyX25hbWVbNF0pIHsKKwljYXNlICczJzogLyogREUyMDMgKi8KKwkJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEX0JOQzsKKwkJZWNtZC0+cG9ydCA9IFBPUlRfQk5DOworCQlicmVhazsKKworCWNhc2UgJzQnOiAvKiBERTIwNCAqLworCQllY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfVFA7CisJCWVjbWQtPnBvcnQgPSBQT1JUX1RQOworCQlicmVhazsKKworCWNhc2UgJzUnOiAvKiBERTIwNSAqLworCQllY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfVFAgfCBTVVBQT1JURURfQk5DIHwgU1VQUE9SVEVEX0FVSTsKKwkJZWNtZC0+YXV0b25lZyA9ICEoY3IgJiBDUl9BUEQpOworCQkvKgorCQkqKiBQb3J0IGlzIG9ubHkgdmFsaWQgaWYgYXV0b25lZyBpcyBkaXNhYmxlZAorCQkqKiBhbmQgZXZlbiB0aGVuIHdlIGRvbid0IGtub3cgaWYgQVVJIGlzIGp1bXBlcmVkLgorCQkqLworCQlpZiAoIWVjbWQtPmF1dG9uZWcpCisJCQllY21kLT5wb3J0ID0gKGNyICYgQ1JfUFNFTCkgPyBQT1JUX0JOQyA6IFBPUlRfVFA7CisJCWJyZWFrOworCX0KKworCWVjbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfMTBiYXNlVF9IYWxmOworCWVjbWQtPnNwZWVkID0gU1BFRURfMTA7CisJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXdyazNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgZXdyazNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBjcjsKKworCS8qIERFMjA1IGlzIHRoZSBvbmx5IGNhcmQgd2l0aCBhbnl0aGluZyB0byBzZXQgKi8KKwlpZiAobHAtPmFkYXB0ZXJfbmFtZVs0XSAhPSAnNScpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIFNhbml0eS1jaGVjayBwYXJhbWV0ZXJzICovCisJaWYgKGVjbWQtPnNwZWVkICE9IFNQRUVEXzEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+cG9ydCAhPSBQT1JUX1RQICYmIGVjbWQtPnBvcnQgIT0gUE9SVF9CTkMpCisJCXJldHVybiAtRUlOVkFMOyAvKiBBVUkgaXMgbm90IHNvZnR3YXJlLXNlbGVjdGFibGUgKi8KKwlpZiAoZWNtZC0+dHJhbnNjZWl2ZXIgIT0gWENWUl9JTlRFUk5BTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPnBoeV9hZGRyZXNzICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisJY3IgPSBpbmIoRVdSSzNfQ1IpOworCisJLyogSWYgQXV0b25lZyBpcyBzZXQsIGNoYW5nZSB0byBBdXRvIFBvcnQgbW9kZSAqLworCS8qIE90aGVyd2lzZSwgZGlzYWJsZSBBdXRvIFBvcnQgYW5kIHNldCBwb3J0IGV4cGxpY2l0bHkgKi8KKwlpZiAoZWNtZC0+YXV0b25lZykgeworCQljciAmPSB+Q1JfQVBEOworCX0gZWxzZSB7CisJCWNyIHw9IENSX0FQRDsKKwkJaWYgKGVjbWQtPnBvcnQgPT0gUE9SVF9UUCkKKwkJCWNyICY9IH5DUl9QU0VMOwkJLyogRm9yY2UgVFAgKi8KKwkJZWxzZQorCQkJY3IgfD0gQ1JfUFNFTDsJCS8qIEZvcmNlIEJOQyAqLworCX0KKworCS8qIENvbW1pdCB0aGUgY2hhbmdlcyAqLworCW91dGIoY3IsIEVXUkszX0NSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+aHdfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGV3cmszX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwl1OCBjbXIgPSBpbmIoRVdSSzNfQ01SKTsKKwkvKiBERTIwMyBoYXMgQk5DIG9ubHkgYW5kIGxpbmsgc3RhdHVzIGRvZXMgbm90IGFwcGx5ICovCisJLyogT24gREUyMDQgdGhpcyBpcyBhbHdheXMgdmFsaWQgc2luY2UgVFAgaXMgdGhlIG9ubHkgcG9ydC4gKi8KKwkvKiBPbiBERTIwNSB0aGlzIHJlZmxlY3RzIFRQIHN0YXR1cyBldmVuIGlmIEJOQyBvciBBVUkgaXMgc2VsZWN0ZWQuICovCisJcmV0dXJuICEoY21yICYgQ01SX0xJTkspOworfQorCitzdGF0aWMgaW50IGV3cmszX3BoeXNfaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJc3RydWN0IGV3cmszX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggY3I7CisJaW50IGNvdW50OworCisJLyogVG9nZ2xlIExFRCA0eCBwZXIgc2Vjb25kICovCisJY291bnQgPSBkYXRhIDw8IDI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmh3X2xvY2ssIGZsYWdzKTsKKworCS8qIEJhaWwgaWYgYSBQSFlTX0lEIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKi8KKwlpZiAobHAtPmxlZF9tYXNrID09IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmh3X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBQcmV2ZW50IElTUiBmcm9tIHR3aWRkbGluZyB0aGUgTEVEICovCisJbHAtPmxlZF9tYXNrID0gMDsKKworCXdoaWxlIChjb3VudC0tKSB7CisJCS8qIFRvZ2dsZSB0aGUgTEVEICovCisJCWNyID0gaW5iKEVXUkszX0NSKTsKKwkJb3V0YihjciBeIENSX0xFRCwgRVdSSzNfQ1IpOworCisJCS8qIFdhaXQgYSBsaXR0bGUgd2hpbGUgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmh3X2xvY2ssIGZsYWdzKTsKKwkJbXNsZWVwKDI1MCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+aHdfbG9jaywgZmxhZ3MpOworCisJCS8qIEV4aXQgaWYgd2UgZ290IGEgc2lnbmFsICovCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCX0KKworCWxwLT5sZWRfbWFzayA9IENSX0xFRDsKKwljciA9IGluYihFV1JLM19DUik7CisJb3V0YihjciAmIH5DUl9MRUQsIEVXUkszX0NSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+aHdfbG9jaywgZmxhZ3MpOworCXJldHVybiBzaWduYWxfcGVuZGluZyhjdXJyZW50KSA/IC1FUkVTVEFSVFNZUyA6IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHNfMjAzID0geworCS5nZXRfZHJ2aW5mbyA9IGV3cmszX2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MgPSBld3JrM19nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyA9IGV3cmszX3NldF9zZXR0aW5ncywKKwkucGh5c19pZCA9IGV3cmszX3BoeXNfaWQsCit9OworCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IGV3cmszX2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MgPSBld3JrM19nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyA9IGV3cmszX3NldF9zZXR0aW5ncywKKwkuZ2V0X2xpbmsgPSBld3JrM19nZXRfbGluaywKKwkucGh5c19pZCA9IGV3cmszX3BoeXNfaWQsCit9OworCisvKgorICAgKiogUGVyZm9ybSBJT0NUTCBjYWxsIGZ1bmN0aW9ucyBoZXJlLiBTb21lIGFyZSBwcml2aWxlZ2VkIG9wZXJhdGlvbnMgYW5kIHRoZQorICAgKiogZWZmZWN0aXZlIHVpZCBpcyBjaGVja2VkIGluIHRob3NlIGNhc2VzLgorICovCitzdGF0aWMgaW50IGV3cmszX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IGV3cmszX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZXdyazNfaW9jdGwgKmlvYyA9IChzdHJ1Y3QgZXdyazNfaW9jdGwgKikgJnJxLT5pZnJfaWZydTsKKwl1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGksIGosIHN0YXR1cyA9IDA7CisJdV9jaGFyIGNzcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuaW9uIGV3cmszX2FkZHIgeworCQl1X2NoYXIgYWRkcltIQVNIX1RBQkxFX0xFTiAqIEVUSF9BTEVOXTsKKwkJdV9zaG9ydCB2YWxbKEhBU0hfVEFCTEVfTEVOICogRVRIX0FMRU4pID4+IDFdOworCX07CisJCisJdW5pb24gZXdyazNfYWRkciAqdG1wOworCisJLyogQWxsIHdlIGhhbmRsZSBhcmUgcHJpdmF0ZSBJT0NUTHMgKi8KKwlpZiAoY21kICE9IEVXUkszSU9DVEwpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXRtcCA9IGttYWxsb2Moc2l6ZW9mKHVuaW9uIGV3cmszX2FkZHIpLCBHRlBfS0VSTkVMKTsKKwlpZih0bXA9PU5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc3dpdGNoIChpb2MtPmNtZCkgeworCWNhc2UgRVdSSzNfR0VUX0hXQUREUjoJLyogR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzICovCisJCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisJCQl0bXAtPmFkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworCQl9CisJCWlvYy0+bGVuID0gRVRIX0FMRU47CisJCWlmIChjb3B5X3RvX3VzZXIoaW9jLT5kYXRhLCB0bXAtPmFkZHIsIGlvYy0+bGVuKSkKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWJyZWFrOworCQkKKwljYXNlIEVXUkszX1NFVF9IV0FERFI6CS8qIFNldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyAqLworCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisJCQljc3IgPSBpbmIoRVdSSzNfQ1NSKTsKKwkJCWNzciB8PSAoQ1NSX1RYRCB8IENTUl9SWEQpOworCQkJb3V0Yihjc3IsIEVXUkszX0NTUik7CS8qIERpc2FibGUgdGhlIFRYIGFuZCBSWCAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmh3X2xvY2ssIGZsYWdzKTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKHRtcC0+YWRkciwgaW9jLT5kYXRhLCBFVEhfQUxFTikpIHsKKwkJCQlzdGF0dXMgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgeworCQkJCWRldi0+ZGV2X2FkZHJbaV0gPSB0bXAtPmFkZHJbaV07CisJCQkJb3V0Yih0bXAtPmFkZHJbaV0sIEVXUkszX1BBUjAgKyBpKTsKKwkJCX0KKworCQkJY3NyID0gaW5iKEVXUkszX0NTUik7CisJCQljc3IgJj0gfihDU1JfVFhEIHwgQ1NSX1JYRCk7CS8qIEVuYWJsZSB0aGUgVFggYW5kIFJYICovCisJCQlvdXRiKGNzciwgRVdSSzNfQ1NSKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKworCQlicmVhazsKKwljYXNlIEVXUkszX1NFVF9QUk9NOgkvKiBTZXQgUHJvbWlzY3VvdXMgTW9kZSAqLworCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisJCQljc3IgPSBpbmIoRVdSSzNfQ1NSKTsKKwkJCWNzciB8PSBDU1JfUE1FOworCQkJY3NyICY9IH5DU1JfTUNFOworCQkJb3V0Yihjc3IsIEVXUkszX0NTUik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+aHdfbG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBFV1JLM19DTFJfUFJPTToJLyogQ2xlYXIgUHJvbWlzY3VvdXMgTW9kZSAqLworCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisJCQljc3IgPSBpbmIoRVdSSzNfQ1NSKTsKKwkJCWNzciAmPSB+Q1NSX1BNRTsKKwkJCW91dGIoY3NyLCBFV1JLM19DU1IpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmh3X2xvY2ssIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgRVdSSzNfR0VUX01DQToJLyogR2V0IHRoZSBtdWx0aWNhc3QgYWRkcmVzcyB0YWJsZSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmh3X2xvY2ssIGZsYWdzKTsKKwkJaWYgKGxwLT5zaG1lbV9sZW5ndGggPT0gSU9fT05MWSkgeworCQkJb3V0YigwLCBFV1JLM19JT1BSKTsKKwkJCW91dHcoUEFHRTBfSFRFLCBFV1JLM19QSVIxKTsKKwkJCWZvciAoaSA9IDA7IGkgPCAoSEFTSF9UQUJMRV9MRU4gPj4gMyk7IGkrKykgeworCQkJCXRtcC0+YWRkcltpXSA9IGluYihFV1JLM19EQVRBKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW91dGIoMCwgRVdSSzNfTVBSKTsKKwkJCW1lbWNweV9mcm9taW8odG1wLT5hZGRyLCBscC0+c2htZW0gKyBQQUdFMF9IVEUsIChIQVNIX1RBQkxFX0xFTiA+PiAzKSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmh3X2xvY2ssIGZsYWdzKTsKKworCQlpb2MtPmxlbiA9IChIQVNIX1RBQkxFX0xFTiA+PiAzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihpb2MtPmRhdGEsIHRtcC0+YWRkciwgaW9jLT5sZW4pKQorCQkJc3RhdHVzID0gLUVGQVVMVDsKKworCQlicmVhazsKKwljYXNlIEVXUkszX1NFVF9NQ0E6CS8qIFNldCBhIG11bHRpY2FzdCBhZGRyZXNzICovCisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlpZiAoaW9jLT5sZW4gPiAxMDI0KQorCQkJeworCQkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY29weV9mcm9tX3VzZXIodG1wLT5hZGRyLCBpb2MtPmRhdGEsIEVUSF9BTEVOICogaW9jLT5sZW4pKSB7CisJCQkJc3RhdHVzID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNldF9tdWx0aWNhc3RfbGlzdChkZXYpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBFV1JLM19DTFJfTUNBOgkvKiBDbGVhciBhbGwgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJc2V0X211bHRpY2FzdF9saXN0KGRldik7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKworCQlicmVhazsKKwljYXNlIEVXUkszX01DQV9FTjoJLyogRW5hYmxlIG11bHRpY2FzdCBhZGRyZXNzaW5nICovCisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmh3X2xvY2ssIGZsYWdzKTsKKwkJCWNzciA9IGluYihFV1JLM19DU1IpOworCQkJY3NyIHw9IENTUl9NQ0U7CisJCQljc3IgJj0gfkNTUl9QTUU7CisJCQlvdXRiKGNzciwgRVdSSzNfQ1NSKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKworCQlicmVhazsKKwljYXNlIEVXUkszX0dFVF9TVEFUUzogeyAvKiBHZXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisJCXN0cnVjdCBld3JrM19zdGF0cyAqdG1wX3N0YXRzID0KKyAgICAgICAgCQlrbWFsbG9jKHNpemVvZihscC0+cGt0U3RhdHMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0bXBfc3RhdHMpIHsKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+aHdfbG9jaywgZmxhZ3MpOworCQltZW1jcHkodG1wX3N0YXRzLCAmbHAtPnBrdFN0YXRzLCBzaXplb2YobHAtPnBrdFN0YXRzKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisKKwkJaW9jLT5sZW4gPSBzaXplb2YobHAtPnBrdFN0YXRzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihpb2MtPmRhdGEsIHRtcF9zdGF0cywgc2l6ZW9mKGxwLT5wa3RTdGF0cykpKQorICAgIAkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWtmcmVlKHRtcF9zdGF0cyk7CisJCWJyZWFrOworCX0KKwljYXNlIEVXUkszX0NMUl9TVEFUUzoJLyogWmVybyBvdXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmh3X2xvY2ssIGZsYWdzKTsKKwkJCW1lbXNldCgmbHAtPnBrdFN0YXRzLCAwLCBzaXplb2YobHAtPnBrdFN0YXRzKSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+aHdfbG9jayxmbGFncyk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKworCQlicmVhazsKKwljYXNlIEVXUkszX0dFVF9DU1I6CS8qIEdldCB0aGUgQ1NSIFJlZ2lzdGVyIGNvbnRlbnRzICovCisJCXRtcC0+YWRkclswXSA9IGluYihFV1JLM19DU1IpOworCQlpb2MtPmxlbiA9IDE7CisJCWlmIChjb3B5X3RvX3VzZXIoaW9jLT5kYXRhLCB0bXAtPmFkZHIsIGlvYy0+bGVuKSkKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgRVdSSzNfU0VUX0NTUjoJLyogU2V0IHRoZSBDU1IgUmVnaXN0ZXIgY29udGVudHMgKi8KKwkJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcih0bXAtPmFkZHIsIGlvYy0+ZGF0YSwgMSkpIHsKKwkJCQlzdGF0dXMgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJb3V0Yih0bXAtPmFkZHJbMF0sIEVXUkszX0NTUik7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKworCQlicmVhazsKKwljYXNlIEVXUkszX0dFVF9FRVBST006CS8qIEdldCB0aGUgRUVQUk9NIGNvbnRlbnRzICovCisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgKEVFUFJPTV9NQVggPj4gMSk7IGkrKykgeworCQkJCXRtcC0+dmFsW2ldID0gKHNob3J0KSBSZWFkX0VFUFJPTShpb2Jhc2UsIGkpOworCQkJfQorCQkJaSA9IEVFUFJPTV9NQVg7CisJCQl0bXAtPmFkZHJbaSsrXSA9IGluYihFV1JLM19DTVIpOwkJLyogQ29uZmlnL01hbmFnZW1lbnQgUmVnLiAqLworCQkJZm9yIChqID0gMDsgaiA8IEVUSF9BTEVOOyBqKyspIHsKKwkJCQl0bXAtPmFkZHJbaSsrXSA9IGluYihFV1JLM19QQVIwICsgaik7CisJCQl9CisJCQlpb2MtPmxlbiA9IEVFUFJPTV9NQVggKyAxICsgRVRIX0FMRU47CisJCQlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgdG1wLT5hZGRyLCBpb2MtPmxlbikpCisJCQkJc3RhdHVzID0gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgRVdSSzNfU0VUX0VFUFJPTToJLyogU2V0IHRoZSBFRVBST00gY29udGVudHMgKi8KKwkJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcih0bXAtPmFkZHIsIGlvYy0+ZGF0YSwgRUVQUk9NX01BWCkpIHsKKwkJCQlzdGF0dXMgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJZm9yIChpID0gMDsgaSA8IChFRVBST01fTUFYID4+IDEpOyBpKyspIHsKKwkJCQlXcml0ZV9FRVBST00odG1wLT52YWxbaV0sIGlvYmFzZSwgaSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKworCQlicmVhazsKKwljYXNlIEVXUkszX0dFVF9DTVI6CS8qIEdldCB0aGUgQ01SIFJlZ2lzdGVyIGNvbnRlbnRzICovCisJCXRtcC0+YWRkclswXSA9IGluYihFV1JLM19DTVIpOworCQlpb2MtPmxlbiA9IDE7CisJCWlmIChjb3B5X3RvX3VzZXIoaW9jLT5kYXRhLCB0bXAtPmFkZHIsIGlvYy0+bGVuKSkKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgRVdSSzNfU0VUX1RYX0NVVF9USFJVOgkvKiBTZXQgVFggY3V0IHRocm91Z2ggbW9kZSAqLworCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJbHAtPnR4YyA9IDE7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKworCQlicmVhazsKKwljYXNlIEVXUkszX0NMUl9UWF9DVVRfVEhSVToJLyogQ2xlYXIgVFggY3V0IHRocm91Z2ggbW9kZSAqLworCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJbHAtPnR4YyA9IDA7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwl9CisJa2ZyZWUodG1wKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmV3cmszX2RldnNbTUFYX05VTV9FV1JLM1NdOworc3RhdGljIGludCBuZGV2czsKK3N0YXRpYyBpbnQgaW9bTUFYX05VTV9FV1JLM1MrMV0gPSB7IDB4MzAwLCAwLCB9OworCisvKiAnMjEnIGJlbG93IHNob3VsZCByZWFsbHkgYmUgJ01BWF9OVU1fRVdSSzNTJyAqLworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJFdGhlcldPUktTIDMgSS9PIGJhc2UgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiRXRoZXJXT1JLUyAzIElSUSBudW1iZXIocykiKTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGV3cmszX2V4aXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IoIGk9MDsgaTxuZGV2czsgaSsrICkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZXdyazNfZGV2c1tpXTsKKwkJc3RydWN0IGV3cmszX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJZXdyazNfZGV2c1tpXSA9IE5VTEw7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFV1JLM19UT1RBTF9TSVpFKTsKKwkJaW91bm1hcChscC0+c2htZW0pOworCQlmcmVlX25ldGRldihkZXYpOworCX0KK30KKworc3RhdGljIF9faW5pdCBpbnQgZXdyazNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgaT0wOworCisJd2hpbGUoIGlvW2ldICYmIGlycVtpXSApIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCQkJPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGV3cmszX3ByaXZhdGUpKTsKKworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCisJCWlmIChld3JrM19wcm9iZTEoZGV2LCBpb1tpXSwgaXJxW2ldKSAhPSAwKSB7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJYnJlYWs7CisJCX0KKworCQlld3JrM19kZXZzW25kZXZzKytdID0gZGV2OworCQlpKys7CisJfQorCisJcmV0dXJuIG5kZXZzID8gMCA6IC1FSU87Cit9CisKKworLyogSGFjayBmb3IgYnJlYWthZ2UgaW4gbmV3IG1vZHVsZSBzdHVmZiAqLworbW9kdWxlX2V4aXQoZXdyazNfZXhpdF9tb2R1bGUpOworbW9kdWxlX2luaXQoZXdyazNfaW5pdF9tb2R1bGUpOworI2VuZGlmCQkJCS8qIE1PRFVMRSAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisMCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSS9saW51eC9pbmNsdWRlIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1zdHJlbmd0aC1yZWR1Y2UgLW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tanVtcHM9MiAtbWFsaWduLWZ1bmN0aW9ucz0yIC1PMiAtbTQ4NiAtYyBld3JrMy5jIgorICoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX0tFUk5FTF9fIC1ETU9EVUxFIC1JL2xpbnV4L2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtZm9taXQtZnJhbWUtcG9pbnRlciAtZm5vLXN0cmVuZ3RoLXJlZHVjZSAtbWFsaWduLWxvb3BzPTIgLW1hbGlnbi1qdW1wcz0yIC1tYWxpZ24tZnVuY3Rpb25zPTIgLU8yIC1tNDg2IC1jIGV3cmszLmMiCisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V3cmszLmggYi9kcml2ZXJzL25ldC9ld3JrMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNzRiZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ld3JrMy5oCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICAgIFdyaXR0ZW4gMTk5NCBieSBEYXZpZCBDLiBEYXZpZXMuCisKKyAgICBDb3B5cmlnaHQgMTk5NCBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbi4KKworICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byAgdGhlIHRlcm1zIG9mIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworICAgIFRoZSBhdXRob3IgbWF5ICAgIGJlICByZWFjaGVkIGFzIGRhdmllc0B3YW50b24ubGtnLmRlYy5jb20gIG9yICAgRGlnaXRhbAorICAgIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgNTUwIEtpbmcgU3RyZWV0LCBMaXR0bGV0b24gTUEgMDE0NjAuCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKgorKiogSS9PIEFkZHJlc3MgUmVnaXN0ZXIgTWFwCisqLworI2RlZmluZSBFV1JLM19DU1IgICAgaW9iYXNlKzB4MDAgICAvKiBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVdSSzNfQ1IgICAgIGlvYmFzZSsweDAxICAgLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBFV1JLM19JQ1IgICAgaW9iYXNlKzB4MDIgICAvKiBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBFV1JLM19UU1IgICAgaW9iYXNlKzB4MDMgICAvKiBUcmFuc21pdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVdSSzNfUlNWRDEgIGlvYmFzZSsweDA0ICAgLyogUkVTRVJWRUQgKi8KKyNkZWZpbmUgRVdSSzNfUlNWRDIgIGlvYmFzZSsweDA1ICAgLyogUkVTRVJWRUQgKi8KKyNkZWZpbmUgRVdSSzNfRk1RICAgIGlvYmFzZSsweDA2ICAgLyogRnJlZSBNZW1vcnkgUXVldWUgKi8KKyNkZWZpbmUgRVdSSzNfRk1RQyAgIGlvYmFzZSsweDA3ICAgLyogRnJlZSBNZW1vcnkgUXVldWUgQ291bnRlciAqLworI2RlZmluZSBFV1JLM19SUSAgICAgaW9iYXNlKzB4MDggICAvKiBSZWNlaXZlIFF1ZXVlICovCisjZGVmaW5lIEVXUkszX1JRQyAgICBpb2Jhc2UrMHgwOSAgIC8qIFJlY2VpdmUgUXVldWUgQ291bnRlciAqLworI2RlZmluZSBFV1JLM19UUSAgICAgaW9iYXNlKzB4MGEgICAvKiBUcmFuc21pdCBRdWV1ZSAqLworI2RlZmluZSBFV1JLM19UUUMgICAgaW9iYXNlKzB4MGIgICAvKiBUcmFuc21pdCBRdWV1ZSBDb3VudGVyICovCisjZGVmaW5lIEVXUkszX1REUSAgICBpb2Jhc2UrMHgwYyAgIC8qIFRyYW5zbWl0IERvbmUgUXVldWUgKi8KKyNkZWZpbmUgRVdSSzNfVERRQyAgIGlvYmFzZSsweDBkICAgLyogVHJhbnNtaXQgRG9uZSBRdWV1ZSBDb3VudGVyICovCisjZGVmaW5lIEVXUkszX1BJUjEgICBpb2Jhc2UrMHgwZSAgIC8qIFBhZ2UgSW5kZXggUmVnaXN0ZXIgMSAqLworI2RlZmluZSBFV1JLM19QSVIyICAgaW9iYXNlKzB4MGYgICAvKiBQYWdlIEluZGV4IFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRVdSSzNfREFUQSAgIGlvYmFzZSsweDEwICAgLyogRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBFV1JLM19JT1BSICAgaW9iYXNlKzB4MTEgICAvKiBJL08gUGFnZSBSZWdpc3RlciAqLworI2RlZmluZSBFV1JLM19JT0JSICAgaW9iYXNlKzB4MTIgICAvKiBJL08gQmFzZSBSZWdpc3RlciAqLworI2RlZmluZSBFV1JLM19NUFIgICAgaW9iYXNlKzB4MTMgICAvKiBNZW1vcnkgUGFnZSBSZWdpc3RlciAqLworI2RlZmluZSBFV1JLM19NQlIgICAgaW9iYXNlKzB4MTQgICAvKiBNZW1vcnkgQmFzZSBSZWdpc3RlciAqLworI2RlZmluZSBFV1JLM19BUFJPTSAgaW9iYXNlKzB4MTUgICAvKiBBZGRyZXNzIFBST00gKi8KKyNkZWZpbmUgRVdSSzNfRVBST00xIGlvYmFzZSsweDE2ICAgLyogRUVQUk9NIERhdGEgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBFV1JLM19FUFJPTTIgaW9iYXNlKzB4MTcgICAvKiBFRVBST00gRGF0YSBSZWdpc3RlciAyICovCisjZGVmaW5lIEVXUkszX1BBUjAgICBpb2Jhc2UrMHgxOCAgIC8qIFBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBFV1JLM19QQVIxICAgaW9iYXNlKzB4MTkgICAvKiBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRVdSSzNfUEFSMiAgIGlvYmFzZSsweDFhICAgLyogUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciAyICovCisjZGVmaW5lIEVXUkszX1BBUjMgICBpb2Jhc2UrMHgxYiAgIC8qIFBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXIgMyAqLworI2RlZmluZSBFV1JLM19QQVI0ICAgaW9iYXNlKzB4MWMgICAvKiBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUgRVdSSzNfUEFSNSAgIGlvYmFzZSsweDFkICAgLyogUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciA1ICovCisjZGVmaW5lIEVXUkszX0NNUiAgICBpb2Jhc2UrMHgxZSAgIC8qIENvbmZpZ3VyYXRpb24vTWFuYWdlbWVudCBSZWdpc3RlciAqLworCisvKgorKiogQ29udHJvbCBQYWdlIE1hcAorKi8KKyNkZWZpbmUgUEFHRTBfRk1RICAgICAweDAwMCAgICAgICAgIC8qIEZyZWUgTWVtb3J5IFF1ZXVlICovCisjZGVmaW5lIFBBR0UwX1JRICAgICAgMHgwODAgICAgICAgICAvKiBSZWNlaXZlIFF1ZXVlICovCisjZGVmaW5lIFBBR0UwX1RRICAgICAgMHgxMDAgICAgICAgICAvKiBUcmFuc21pdCBRdWV1ZSAqLworI2RlZmluZSBQQUdFMF9URFEgICAgIDB4MTgwICAgICAgICAgLyogVHJhbnNtaXQgRG9uZSBRdWV1ZSAqLworI2RlZmluZSBQQUdFMF9IVEUgICAgIDB4MjAwICAgICAgICAgLyogSGFzaCBUYWJsZSBFbnRyaWVzICovCisjZGVmaW5lIFBBR0UwX1JTVkQgICAgMHgyNDAgICAgICAgICAvKiBSRVNFUlZFRCAqLworI2RlZmluZSBQQUdFMF9VU1JEICAgIDB4NjAwICAgICAgICAgLyogVXNlciBEYXRhICovCisKKy8qCisqKiBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zIChFV1JLM19DU1IpCisqLworI2RlZmluZSBDU1JfUkEJCTB4ODAJICAgIC8qIFJ1bnQgQWNjZXB0ICovCisjZGVmaW5lIENTUl9QTUUJCTB4NDAJICAgIC8qIFByb21pc2N1b3VzIE1vZGUgRW5hYmxlICovCisjZGVmaW5lIENTUl9NQ0UJCTB4MjAJICAgIC8qIE11bHRpY2FzdCBFbmFibGUgKi8gCisjZGVmaW5lIENTUl9UTkUJCTB4MDgJICAgIC8qIFRYIERvbmUgUXVldWUgTm90IEVtcHR5ICovCisjZGVmaW5lIENTUl9STkUJCTB4MDQJICAgIC8qIFJYIFF1ZXVlIE5vdCBFbXB0eSAqLworI2RlZmluZSBDU1JfVFhECQkweDAyCSAgICAvKiBUWCBEaXNhYmxlICovCisjZGVmaW5lIENTUl9SWEQJCTB4MDEJICAgIC8qIFJYIERpc2FibGUgKi8KKworLyoKKyoqIENvbnRyb2wgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zIChFV1JLM19DUikKKyovCisjZGVmaW5lIENSX0FQRAkJMHg4MAkvKiBBdXRvIFBvcnQgRGlzYWJsZSAqLworI2RlZmluZSBDUl9QU0VMCQkweDQwCS8qIFBvcnQgU2VsZWN0ICgwLT5UUCBwb3J0KSAqLworI2RlZmluZSBDUl9MQkNLCQkweDIwCS8qIExvb3BCYUNLIGVuYWJsZSAqLworI2RlZmluZSBDUl9GRFVQCQkweDEwCS8qIEZ1bGwgRFVQbGV4IGVuYWJsZSAqLworI2RlZmluZSBDUl9GQlVTCQkweDA4CS8qIEZhc3QgQlVTIGVuYWJsZSAoSVNBIGNsayA+IDguMzNNSHopICovCisjZGVmaW5lIENSX0VOXzE2CTB4MDQJLyogRU5hYmxlIDE2IGJpdCBtZW1vcnkgYWNjZXNzZXMgKi8KKyNkZWZpbmUgQ1JfTEVECQkweDAyCS8qIExFRCAoMS0+IHR1cm4gb24pICovCisKKy8qCisqKiBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKEVXUkszX0lDUikKKyovCisjZGVmaW5lIElDUl9JRQkJMHg4MAkvKiBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIElDUl9JUwkJMHg2MAkvKiBJbnRlcnJ1cHQgU2VsZWN0ZWQgKi8KKyNkZWZpbmUgSUNSX1RORU0JMHgwOAkvKiBUTkUgTWFzayAoMC0+bWFzaykgKi8KKyNkZWZpbmUgSUNSX1JORU0JMHgwNAkvKiBSTkUgTWFzayAoMC0+bWFzaykgKi8KKyNkZWZpbmUgSUNSX1RYRE0JMHgwMgkvKiBUWEQgTWFzayAoMC0+bWFzaykgKi8KKyNkZWZpbmUgSUNSX1JYRE0JMHgwMQkvKiBSWEQgTWFzayAoMC0+bWFzaykgKi8KKworLyoKKyoqIFRyYW5zbWl0IFN0YXR1cyBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKEVXUkszX1RTUikKKyovCisjZGVmaW5lIFRTUl9OQ0wJCTB4ODAJLyogTm8gQ2FycmllciBMb29wYmFjayAqLworI2RlZmluZSBUU1JfSUQJCTB4NDAJLyogSW5pdGlhbGx5IERlZmVycmVkICovCisjZGVmaW5lIFRTUl9MQ0wJCTB4MjAJLyogTGF0ZSBDb0xsaXNpb24gKi8KKyNkZWZpbmUgVFNSX0VDTAkJMHgxMAkvKiBFeGNlc3NpdmUgQ29MbGlzaW9ucyAqLworI2RlZmluZSBUU1JfUkNOVFIJMHgwZgkvKiBSZXRyaWVzIENvdU5UZVIgKi8KKworLyoKKyoqIEkvTyBQYWdlIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAoRVdSSzNfSU9QUikKKyovCisjZGVmaW5lIEVFUFJPTV9JTklUCTB4YzAJLyogRUVQUk9NIElOSVQgY29tbWFuZCAqLworI2RlZmluZSBFRVBST01fV1JfRU4JMHhjOAkvKiBFRVBST00gV1JJVEUgRU5BQkxFIGNvbW1hbmQgKi8KKyNkZWZpbmUgRUVQUk9NX1dSCTB4ZDAJLyogRUVQUk9NIFdSSVRFIGNvbW1hbmQgKi8KKyNkZWZpbmUgRUVQUk9NX1dSX0RJUwkweGQ4CS8qIEVFUFJPTSBXUklURSBESVNBQkxFIGNvbW1hbmQgKi8KKyNkZWZpbmUgRUVQUk9NX1JECTB4ZTAJLyogRUVQUk9NIFJFQUQgY29tbWFuZCAqLworCisvKgorKiogSS9PIEJhc2UgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zIChFV1JLM19JT0JSKQorKi8KKyNkZWZpbmUgRUlTQV9SRUdTX0VOCTB4MjAJLyogRW5hYmxlIEVJU0EgSUQgYW5kIENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIEVJU0FfSU9CICAgICAgICAweDFmCS8qIENvbXBhcmUgYml0cyBmb3IgSS9PIEJhc2UgQWRkcmVzcyAqLworCisvKgorKiogSS9PIENvbmZpZ3VyYXRpb24vTWFuYWdlbWVudCBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKEVXUkszX0NNUikKKyovCisjZGVmaW5lIENNUl9SQSAgICAgICAgICAweDgwICAgIC8qIFJlYWQgQWhlYWQgKi8KKyNkZWZpbmUgQ01SX1dCICAgICAgICAgIDB4NDAgICAgLyogV3JpdGUgQmVoaW5kICovCisjZGVmaW5lIENNUl9MSU5LICAgICAgICAweDIwCS8qIDAtPlRQICovCisjZGVmaW5lIENNUl9QT0xBUklUWSAgICAweDEwCS8qIEluZm9ybWF0aW9uYWwgKi8KKyNkZWZpbmUgQ01SX05PX0VFUFJPTQkweDBjCS8qIE5PX0VFUFJPTTwxOjA+IHBpbiBzdGF0dXMgKi8KKyNkZWZpbmUgQ01SX0hTICAgICAgICAgIDB4MDgJLyogSGFyZCBTdHJhcHBlZCBwaW4gc3RhdHVzIChMZU1BQzIpICovCisjZGVmaW5lIENNUl9QTlAgICAgICAgICAweDA0ICAgIC8qIFBsdWcgJ24gUGxheSAqLworI2RlZmluZSBDTVJfRFJBTSAgICAgICAgMHgwMgkvKiAwLT4gMURSQU0sIDEtPiAyIERSQU0gb24gYm9hcmQgKi8KKyNkZWZpbmUgQ01SXzBXUyAgICAgICAgIDB4MDEgICAgLyogWmVybyBXYWl0IFN0YXRlICovCisKKy8qIAorKiogTUFDIFJlY2VpdmUgU3RhdHVzIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucworKi8KKworI2RlZmluZSBSX1JPSyAgICAgCTB4ODAgCS8qIFJlY2VpdmUgT0sgc3VtbWFyeSAqLworI2RlZmluZSBSX0lBTSAgICAgCTB4MTAgCS8qIEluZGl2aWR1YWwgQWRkcmVzcyBNYXRjaCAqLworI2RlZmluZSBSX01DTSAgICAgCTB4MDggCS8qIE11bHRpQ2FzdCBNYXRjaCAqLworI2RlZmluZSBSX0RCRSAgICAgCTB4MDQgCS8qIERyaWJibGUgQml0IEVycm9yICovCisjZGVmaW5lIFJfQ1JDICAgICAJMHgwMiAJLyogQ1JDIGVycm9yICovCisjZGVmaW5lIFJfUExMICAgICAJMHgwMSAJLyogUGhhc2UgTG9jayBMb3N0ICovCisKKy8qIAorKiogTUFDIFRyYW5zbWl0IENvbnRyb2wgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zCisqLworCisjZGVmaW5lIFRDUl9TUUVFICAgIAkweDQwIAkvKiBTUUUgRW5hYmxlIC0gbG9vayBmb3IgaGVhcnRiZWF0ICAqLworI2RlZmluZSBUQ1JfU0VEICAgICAJMHgyMCAJLyogU3RvcCB3aGVuIEVycm9yIERldGVjdGVkICovCisjZGVmaW5lIFRDUl9RTU9ERSAgICAgCTB4MTAgCS8qIFFfTU9ERSAqLworI2RlZmluZSBUQ1JfTEFCICAgICAgICAgMHgwOCAJLyogTGVzcyBBZ2dyZXNzaXZlIEJhY2tvZmYgKi8KKyNkZWZpbmUgVENSX1BBRCAgICAgCTB4MDQgCS8qIFBBRCBSdW50IFBhY2tldHMgKi8KKyNkZWZpbmUgVENSX0lGQyAgICAgCTB4MDIgCS8qIEluc2VydCBGcmFtZSBDaGVjayAqLworI2RlZmluZSBUQ1JfSVNBICAgICAJMHgwMSAJLyogSW5zZXJ0IFNvdXJjZSBBZGRyZXNzICovCisKKy8qIAorKiogTUFDIFRyYW5zbWl0IFN0YXR1cyBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMKKyovCisKKyNkZWZpbmUgVF9WU1RTICAgIAkweDgwIAkvKiBWYWxpZCBTVGF0dVMgKi8KKyNkZWZpbmUgVF9DVFUgICAgIAkweDQwIAkvKiBDdXQgVGhyb3VnaCBVc2VkICovCisjZGVmaW5lIFRfU1FFICAgICAJMHgyMCAJLyogU2lnbmFsIFF1YWxpdHkgRXJyb3IgKi8KKyNkZWZpbmUgVF9OQ0wgICAgIAkweDEwIAkvKiBObyBDYXJyaWVyIExvb3BiYWNrICovCisjZGVmaW5lIFRfTENMICAgICAgICAgICAweDA4IAkvKiBMYXRlIENvbGxpc2lvbiAqLworI2RlZmluZSBUX0lEICAgICAgCTB4MDQgCS8qIEluaXRpYWxseSBEZWZlcnJlZCAqLworI2RlZmluZSBUX0NPTEwgICAgIAkweDAzIAkvKiBDT0xMaXNpb24gc3RhdHVzICovCisjZGVmaW5lIFRfWENPTEwgICAgICAgICAweDAzICAgIC8qIEV4Y2Vzc2l2ZSBDb2xsaXNpb25zICovCisjZGVmaW5lIFRfTUNPTEwgICAgICAgICAweDAyICAgIC8qIE11bHRpcGxlIENvbGxpc2lvbnMgKi8KKyNkZWZpbmUgVF9PQ09MTCAgICAgICAgIDB4MDEgICAgLyogT25lIENvbGxpc2lvbiAqLworI2RlZmluZSBUX05PQ09MTCAgICAgICAgMHgwMCAgICAvKiBObyBDb2xsaXNpb25zICovCisjZGVmaW5lIFRfWFVSICAgICAgICAgICAweDAzICAgIC8qIEV4Y2Vzc2l2ZSBVbmRlcnJ1bnMgKi8KKyNkZWZpbmUgVF9UWEUgICAgICAgICAgIDB4N2YgICAgLyogVFggRXJyb3JzICovCisKKy8qIAorKiogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAKKyovCisKKyNkZWZpbmUgRUlTQV9JRCAgICAgICBpb2Jhc2UgKyAweDBjODAgIC8qIEVJU0EgSUQgUmVnaXN0ZXJzICovIAorI2RlZmluZSBFSVNBX0lEMCAgICAgIGlvYmFzZSArIDB4MGM4MCAgLyogRUlTQSBJRCBSZWdpc3RlciAwICovIAorI2RlZmluZSBFSVNBX0lEMSAgICAgIGlvYmFzZSArIDB4MGM4MSAgLyogRUlTQSBJRCBSZWdpc3RlciAxICovIAorI2RlZmluZSBFSVNBX0lEMiAgICAgIGlvYmFzZSArIDB4MGM4MiAgLyogRUlTQSBJRCBSZWdpc3RlciAyICovIAorI2RlZmluZSBFSVNBX0lEMyAgICAgIGlvYmFzZSArIDB4MGM4MyAgLyogRUlTQSBJRCBSZWdpc3RlciAzICovIAorI2RlZmluZSBFSVNBX0NSICAgICAgIGlvYmFzZSArIDB4MGM4NCAgLyogRUlTQSBDb250cm9sIFJlZ2lzdGVyICovCisKKy8qCisqKiBFRVBST00gQllURVMKKyovCisjZGVmaW5lIEVFUFJPTV9NRU1CICAgICAweDAwCisjZGVmaW5lIEVFUFJPTV9JT0IgICAgICAweDAxCisjZGVmaW5lIEVFUFJPTV9FSVNBX0lEMCAweDAyCisjZGVmaW5lIEVFUFJPTV9FSVNBX0lEMSAweDAzCisjZGVmaW5lIEVFUFJPTV9FSVNBX0lEMiAweDA0CisjZGVmaW5lIEVFUFJPTV9FSVNBX0lEMyAweDA1CisjZGVmaW5lIEVFUFJPTV9NSVNDMCAgICAweDA2CisjZGVmaW5lIEVFUFJPTV9NSVNDMSAgICAweDA3CisjZGVmaW5lIEVFUFJPTV9QTkFNRTcgICAweDA4CisjZGVmaW5lIEVFUFJPTV9QTkFNRTYgICAweDA5CisjZGVmaW5lIEVFUFJPTV9QTkFNRTUgICAweDBhCisjZGVmaW5lIEVFUFJPTV9QTkFNRTQgICAweDBiCisjZGVmaW5lIEVFUFJPTV9QTkFNRTMgICAweDBjCisjZGVmaW5lIEVFUFJPTV9QTkFNRTIgICAweDBkCisjZGVmaW5lIEVFUFJPTV9QTkFNRTEgICAweDBlCisjZGVmaW5lIEVFUFJPTV9QTkFNRTAgICAweDBmCisjZGVmaW5lIEVFUFJPTV9TV0ZMQUdTICAweDEwCisjZGVmaW5lIEVFUFJPTV9IV0NBVCAgICAweDExCisjZGVmaW5lIEVFUFJPTV9ORVRNQU4yICAweDEyCisjZGVmaW5lIEVFUFJPTV9SRVZMVkwgICAweDEzCisjZGVmaW5lIEVFUFJPTV9ORVRNQU4wICAweDE0CisjZGVmaW5lIEVFUFJPTV9ORVRNQU4xICAweDE1CisjZGVmaW5lIEVFUFJPTV9DSElQVkVSICAweDE2CisjZGVmaW5lIEVFUFJPTV9TRVRVUCAgICAweDE3CisjZGVmaW5lIEVFUFJPTV9QQUREUjAgICAweDE4CisjZGVmaW5lIEVFUFJPTV9QQUREUjEgICAweDE5CisjZGVmaW5lIEVFUFJPTV9QQUREUjIgICAweDFhCisjZGVmaW5lIEVFUFJPTV9QQUREUjMgICAweDFiCisjZGVmaW5lIEVFUFJPTV9QQUREUjQgICAweDFjCisjZGVmaW5lIEVFUFJPTV9QQUREUjUgICAweDFkCisjZGVmaW5lIEVFUFJPTV9QQV9DUkMgICAweDFlCisjZGVmaW5lIEVFUFJPTV9DSEtTVU0gICAweDFmCisKKy8qCisqKiBFRVBST00gYnl0ZXMgZm9yIGNoZWNrc3VtbWluZworKi8KKyNkZWZpbmUgRUVQUk9NX01BWCAgICAgIDMyICAgICAgICAgICAgIC8qIGJ5dGVzICovCisKKy8qCisqKiBFRVBST00gTUlTQ0VMTEFORU9VUyBGTEFHUworKi8KKyNkZWZpbmUgUkJFX1NIQURPVwkweDAxMDAJLyogUmVtb3RlIEJvb3QgRW5hYmxlIFNoYWRvdyAqLyAKKyNkZWZpbmUgUkVBRF9BSEVBRCAgICAgIDB4MDA4MCAgLyogUmVhZCBBaGVhZCBmZWF0dXJlICovCisjZGVmaW5lIElSUV9TRUwyICAgICAgICAweDAwNzAgIC8qIElSUSBsaW5lIHNlbGVjdGlvbiAoTGVNQUMyKSAqLworI2RlZmluZSBJUlFfU0VMICAgICAgICAgMHgwMDYwICAvKiBJUlEgbGluZSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgRkFTVF9CVVMgICAgICAgIDB4MDAwOCAgLyogSVNBIEJ1cyBzcGVlZHMgPiA4LjMzTUh6ICovCisjZGVmaW5lIEVOQV8xNiAgICAgICAgICAweDAwMDQgIC8qIEVuYWJsZXMgMTYgYml0IG1lbW9yeSB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgV1JJVEVfQkVISU5EICAgIDB4MDAwMiAgLyogV3JpdGUgQmVoaW5kIGZlYXR1cmUgKi8KKyNkZWZpbmUgXzBXU19FTkEgICAgICAgIDB4MDAwMSAgLyogWmVybyBXYWl0IFN0YXRlIEVuYWJsZSAqLworCisvKgorKiogRUVQUk9NIE5FVFdPUksgTUFOQUdFTUVOVCBGTEFHUworKi8KKyNkZWZpbmUgTkVUTUFOX1BPTCAgICAgIDB4MDQgICAgLyogUG9sYXJpdHkgZGVmZWF0ICovCisjZGVmaW5lIE5FVE1BTl9MSU5LICAgICAweDAyICAgIC8qIExpbmsgZGVmZWF0ICovCisjZGVmaW5lIE5FVE1BTl9DQ0UgICAgICAweDAxICAgIC8qIEN1c3RvbSBDb3VudGVycyBFbmFibGUgKi8KKworLyoKKyoqIEVFUFJPTSBTVyBGTEFHUworKi8KKyNkZWZpbmUgU1dfU1FFCQkweDEwCS8qIFNpZ25hbCBRdWFsaXR5IEVycm9yICovIAorI2RlZmluZSBTV19MQUIJCTB4MDgJLyogTGVzcyBBZ2dyZXNzaXZlIEJhY2tvZmYgKi8KKyNkZWZpbmUgU1dfSU5JVAkJMHgwNAkvKiBJbml0aWFsaXplZCAqLworI2RlZmluZSBTV19USU1FT1VUICAgICAJMHgwMgkvKiAwOjIuNSBtaW5zLCAxOiAzMCBzZWNzICovCisjZGVmaW5lIFNXX1JFTU9URSAgICAgIAkweDAxICAgIC8qIFJlbW90ZSBCb290IEVuYWJsZSAtPiAxICovCisKKy8qCisqKiBFRVBST00gU0VUVVAgRkxBR1MKKyovCisjZGVmaW5lIFNFVFVQX0FQRAkweDgwCS8qIEF1dG9Qb3J0IERpc2FibGUgKi8KKyNkZWZpbmUgU0VUVVBfUFMJMHg0MAkvKiBQb3J0IFNlbGVjdCAqLworI2RlZmluZSBTRVRVUF9NUAkweDIwCS8qIE11bHRpUG9ydCAqLworI2RlZmluZSBTRVRVUF8xVFAJMHgxMAkvKiAxIHBvcnQsIFRQICovCisjZGVmaW5lIFNFVFVQXzFDT0FYCTB4MDAJLyogMSBwb3J0LCBDb2F4ICovCisjZGVmaW5lIFNFVFVQX0RSQU0JMHgwMgkvKiBOdW1iZXIgb2YgRFJBTVMgb24gYm9hcmQgKi8KKworLyoKKyoqIEVFUFJPTSBNQU5BR0VNRU5UIEZMQUdTCisqLworI2RlZmluZSBNR01UX0NDRQkweDAxCS8qIEN1c3RvbSBDb3VudGVycyBFbmFibGUgKi8KKworLyoKKyoqIEVFUFJPTSBWRVJTSU9OUworKi8KKyNkZWZpbmUgTGVNQUMgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgTGVNQUMyICAgICAgICAgIDB4MTIKKworLyoKKyoqIE1pc2NlbGxhbmVvdXMKKyovCisKKyNkZWZpbmUgRUVQUk9NX1dBSVRfVElNRSAxMDAwICAgIC8qIE51bWJlciBvZiBtaWNyb3NlY29uZHMgKi8KKyNkZWZpbmUgRUlTQV9FTiAgICAgICAgIDB4MDAwMSAgIC8qIEVuYWJsZSBFSVNBIGJ1cyBidWZmZXJzICovCisKKyNkZWZpbmUgSEFTSF9UQUJMRV9MRU4gICA1MTIgICAgIC8qIEJpdHMgKi8KKworI2RlZmluZSBYQ1QgMHg4MCAgICAgICAgICAgICAgICAgLyogVHJhbnNtaXQgQ3V0IFRocm91Z2ggKi8KKyNkZWZpbmUgUFJFTE9BRCAxNiAgICAgICAgICAgICAgIC8qIDQgbG9uZyB3b3JkcyAqLworCisjZGVmaW5lIE1BU0tfSU5URVJSVVBUUyAgIDEKKyNkZWZpbmUgVU5NQVNLX0lOVEVSUlVQVFMgMAorCisjZGVmaW5lIEVFUFJPTV9PRkZTRVQoYSkgKCh1X3Nob3J0KSgodV9sb25nKShhKSkpCisKKy8qCisqKiBJbmNsdWRlIHRoZSBJT0NUTCBzdHVmZgorKi8KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisKKyNkZWZpbmUJRVdSSzNJT0NUTAlTSU9DREVWUFJJVkFURQorCitzdHJ1Y3QgZXdyazNfaW9jdGwgeworCXVuc2lnbmVkIHNob3J0IGNtZDsgICAgICAgICAgICAgICAgLyogQ29tbWFuZCB0byBydW4gKi8KKwl1bnNpZ25lZCBzaG9ydCBsZW47ICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyICBfX3VzZXIgKmRhdGE7ICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyICovCit9OworCisvKiAKKyoqIFJlY29nbmlzZWQgY29tbWFuZHMgZm9yIHRoZSBkcml2ZXIgCisqLworI2RlZmluZSBFV1JLM19HRVRfSFdBRERSCTB4MDEgLyogR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzICovCisjZGVmaW5lIEVXUkszX1NFVF9IV0FERFIJMHgwMiAvKiBHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRVdSSzNfU0VUX1BST00gIAkweDAzIC8qIFNldCBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIEVXUkszX0NMUl9QUk9NICAJMHgwNCAvKiBDbGVhciBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIEVXUkszX1NBWV9CT08JICAgICAgICAweDA1IC8qIFNheSAiQm9vISIgdG8gdGhlIGtlcm5lbCBsb2cgZmlsZSAqLworI2RlZmluZSBFV1JLM19HRVRfTUNBICAgCTB4MDYgLyogR2V0IGEgbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgRVdSSzNfU0VUX01DQSAgIAkweDA3IC8qIFNldCBhIG11bHRpY2FzdCBhZGRyZXNzICovCisjZGVmaW5lIEVXUkszX0NMUl9NQ0EgICAgCTB4MDggLyogQ2xlYXIgYSBtdWx0aWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBFV1JLM19NQ0FfRU4gICAgCTB4MDkgLyogRW5hYmxlIGEgbXVsdGljYXN0IGFkZHJlc3MgZ3JvdXAgKi8KKyNkZWZpbmUgRVdSSzNfR0VUX1NUQVRTICAJMHgwYSAvKiBHZXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisjZGVmaW5lIEVXUkszX0NMUl9TVEFUUyAJMHgwYiAvKiBaZXJvIG91dCB0aGUgZHJpdmVyIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgRVdSSzNfR0VUX0NTUiAgIAkweDBjIC8qIEdldCB0aGUgQ1NSIFJlZ2lzdGVyIGNvbnRlbnRzICovCisjZGVmaW5lIEVXUkszX1NFVF9DU1IgICAJMHgwZCAvKiBTZXQgdGhlIENTUiBSZWdpc3RlciBjb250ZW50cyAqLworI2RlZmluZSBFV1JLM19HRVRfRUVQUk9NICAgCTB4MGUgLyogR2V0IHRoZSBFRVBST00gY29udGVudHMgKi8KKyNkZWZpbmUgRVdSSzNfU0VUX0VFUFJPTQkweDBmIC8qIFNldCB0aGUgRUVQUk9NIGNvbnRlbnRzICovCisjZGVmaW5lIEVXUkszX0dFVF9DTVIgICAJMHgxMCAvKiBHZXQgdGhlIENNUiBSZWdpc3RlciBjb250ZW50cyAqLworI2RlZmluZSBFV1JLM19DTFJfVFhfQ1VUX1RIUlUgIAkweDExIC8qIENsZWFyIHRoZSBUWCBjdXQgdGhyb3VnaCBtb2RlICovCisjZGVmaW5lIEVXUkszX1NFVF9UWF9DVVRfVEhSVQkweDEyIC8qIFNldCB0aGUgVFggY3V0IHRocm91Z2ggbW9kZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZmVhbG54LmMgYi9kcml2ZXJzL25ldC9mZWFsbnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDVlOWRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZmVhbG54LmMKQEAgLTAsMCArMSwyMDA1IEBACisvKgorCVdyaXR0ZW4gMTk5OC0yMDAwIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisJdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKwlEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisJcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorCWEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlTdXBwb3J0IGluZm9ybWF0aW9uIGFuZCB1cGRhdGVzIGF2YWlsYWJsZSBhdAorCWh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvcGNpLXNrZWxldG9uLmh0bWwKKworCUxpbnV4IGtlcm5lbCB1cGRhdGVzOgorCisJVmVyc2lvbiAyLjUxLCBOb3YgMTcsIDIwMDEgKGpnYXJ6aWspOgorCS0gQWRkIGV0aHRvb2wgc3VwcG9ydAorCS0gUmVwbGFjZSBzb21lIE1JSS1yZWxhdGVkIG1hZ2ljIG51bWJlcnMgd2l0aCBjb25zdGFudHMKKworKi8KKworI2RlZmluZSBEUlZfTkFNRQkiZmVhbG54IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMi41MSIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIk5vdi0xNy0yMDAxIgorCitzdGF0aWMgaW50IGRlYnVnOwkJLyogMS0+IHByaW50IGRlYnVnIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gMjA7CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gZmlsdGVyICh2cy4gUngtYWxsLW11bHRpY2FzdCkuICovCitzdGF0aWMgaW50IG11bHRpY2FzdF9maWx0ZXJfbGltaXQgPSAzMjsKKworLyogU2V0IHRoZSBjb3B5IGJyZWFrcG9pbnQgZm9yIHRoZSBjb3B5LW9ubHktdGlueS1mcmFtZXMgc2NoZW1lLiAqLworLyogU2V0dGluZyB0byA+IDE1MTggZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhpcyBmZWF0dXJlLiAgICAgICAgICAqLworc3RhdGljIGludCByeF9jb3B5YnJlYWs7CisKKy8qIFVzZWQgdG8gcGFzcyB0aGUgbWVkaWEgdHlwZSwgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQm90aCAnb3B0aW9uc1tdJyBhbmQgJ2Z1bGxfZHVwbGV4W10nIHNob3VsZCBleGlzdCBmb3IgZHJpdmVyICovCisvKiBpbnRlcm9wZXJhYmlsaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZSBtZWRpYSB0eXBlIGlzIHVzdWFsbHkgcGFzc2VkIGluICdvcHRpb25zW10nLiAgICAgICAgICAgICAqLworI2RlZmluZSBNQVhfVU5JVFMgOAkJLyogTW9yZSBhcmUgc3VwcG9ydGVkLCBsaW1pdCBvbmx5IG9uIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgb3B0aW9uc1tNQVhfVU5JVFNdID0geyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfTsKK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXSA9IHsgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH07CisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZS4gICAgICAgICAgICAgICAgICovCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBjb21waWxlIGVmZmljaWVuY3kuICAgICAgICAgICAqLworLyogVGhlIGNvbXBpbGVyIHdpbGwgY29udmVydCA8dW5zaWduZWQ+JyUnPDJeTj4gaW50byBhIGJpdCBtYXNrLiAgICAgICAgKi8KKy8qIE1ha2luZyB0aGUgVHggcmluZyB0b28gbGFyZ2UgZGVjcmVhc2VzIHRoZSBlZmZlY3RpdmVuZXNzIG9mIGNoYW5uZWwgICovCisvKiBib25kaW5nIGFuZCBwYWNrZXQgcHJpb3JpdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlcmUgYXJlIG5vIGlsbCBlZmZlY3RzIGZyb20gdG9vLWxhcmdlIHJlY2VpdmUgcmluZ3MuICAgICAgICAgICAgICAgKi8KKy8vIDg4LTEyLTkgbW9kaWZ5LAorLy8gI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgMTYKKy8vICNkZWZpbmUgUlhfUklOR19TSVpFICAgIDMyCisjZGVmaW5lIFRYX1JJTkdfU0laRSAgICA2CisjZGVmaW5lIFJYX1JJTkdfU0laRSAgICAxMgorI2RlZmluZSBUWF9UT1RBTF9TSVpFCVRYX1JJTkdfU0laRSpzaXplb2Yoc3RydWN0IGZlYWxueF9kZXNjKQorI2RlZmluZSBSWF9UT1RBTF9TSVpFCVJYX1JJTkdfU0laRSpzaXplb2Yoc3RydWN0IGZlYWxueF9kZXNjKQorCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICAgICAoMipIWikKKworI2RlZmluZSBQS1RfQlVGX1NaICAgICAgMTUzNgkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4gKi8KKworCisvKiBJbmNsdWRlIGZpbGVzLCBkZXNpZ25lZCB0byBzdXBwb3J0IG1vc3Qga2VybmVsIHZlcnNpb25zIDIuMC4wIGFuZCBsYXRlci4gKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CS8qIFByb2Nlc3NvciB0eXBlIGZvciBjYWNoZSBhbGlnbm1lbnQuICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KK0tFUk5fSU5GTyBEUlZfTkFNRSAiLmM6diIgRFJWX1ZFUlNJT04gIiAiIERSVl9SRUxEQVRFICJcbiI7CisKKworLyogVGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gdG8gdXNlIFBDSSBtZW1vcnkgc3BhY2UsIGhvd2V2ZXIgc29tZSB4ODYgc3lzdGVtcworICAgd29yayBvbmx5IHdpdGggSS9PIHNwYWNlIGFjY2Vzc2VzLiAqLworI2lmbmRlZiBfX2FscGhhX18KKyNkZWZpbmUgVVNFX0lPX09QUworI2VuZGlmCisKKy8qIEtlcm5lbCBjb21wYXRpYmlsaXR5IGRlZmluZXMsIHNvbWUgY29tbW9uIHRvIERhdmlkIEhpbmRzJyBQQ01DSUEgcGFja2FnZS4gKi8KKy8qIFRoaXMgaXMgb25seSBpbiB0aGUgc3VwcG9ydC1hbGwta2VybmVscyBzb3VyY2UgY29kZS4gKi8KKworI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMgKyAoeCkpCisKK01PRFVMRV9BVVRIT1IoIk15c29uIG9yIHdob2V2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTXlzb24gTVRELTh4eCAxMDAvMTBNIEV0aGVybmV0IFBDSSBBZGFwdGVyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKKy8vTU9EVUxFX1BBUk0obWluX3BjaV9sYXRlbmN5LCAiaSIpOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtdWx0aWNhc3RfZmlsdGVyX2xpbWl0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZnVsbF9kdXBsZXgsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pbnRlcnJ1cHRfd29yaywgImZlYWxueCBtYXhpbXVtIGV2ZW50cyBoYW5kbGVkIHBlciBpbnRlcnJ1cHQiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJmZWFsbnggZW5hYmxlIGRlYnVnZ2luZyAoMC0xKSIpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICJmZWFsbnggY29weSBicmVha3BvaW50IGZvciBjb3B5LW9ubHktdGlueS1mcmFtZXMiKTsKK01PRFVMRV9QQVJNX0RFU0MobXVsdGljYXN0X2ZpbHRlcl9saW1pdCwgImZlYWxueCBtYXhpbXVtIG51bWJlciBvZiBmaWx0ZXJlZCBtdWx0aWNhc3QgYWRkcmVzc2VzIik7CitNT0RVTEVfUEFSTV9ERVNDKG9wdGlvbnMsICJmZWFsbng6IEJpdHMgMC0zOiBtZWRpYSB0eXBlLCBiaXQgMTc6IGZ1bGwgZHVwbGV4Iik7CitNT0RVTEVfUEFSTV9ERVNDKGZ1bGxfZHVwbGV4LCAiZmVhbG54IGZ1bGwgZHVwbGV4IHNldHRpbmcocykgKDEpIik7CisKKyNkZWZpbmUgTUlOX1JFR0lPTl9TSVpFIDEzNgorCitlbnVtIHBjaV9mbGFnc19iaXQgeworCVBDSV9VU0VTX0lPID0gMSwKKwlQQ0lfVVNFU19NRU0gPSAyLAorCVBDSV9VU0VTX01BU1RFUiA9IDQsCisJUENJX0FERFIwID0gMHgxMCA8PCAwLAorCVBDSV9BRERSMSA9IDB4MTAgPDwgMSwKKwlQQ0lfQUREUjIgPSAweDEwIDw8IDIsCisJUENJX0FERFIzID0gMHgxMCA8PCAzLAorfTsKKworLyogQSBjaGlwIGNhcGFiaWxpdGllcyB0YWJsZSwgbWF0Y2hpbmcgdGhlIGVudHJpZXMgaW4gcGNpX3RibFtdIGFib3ZlLiAqLworZW51bSBjaGlwX2NhcGFiaWxpdHlfZmxhZ3MgeworCUhBU19NSUlfWENWUiwKKwlIQVNfQ0hJUF9YQ1ZSLAorfTsKKworLyogODkvNi8xMyBhZGQsICovCisvKiBmb3IgZGlmZmVyZW50IFBIWSAqLworZW51bSBwaHlfdHlwZV9mbGFncyB7CisJTXlzb25QSFkgPSAxLAorCUFoZG9jUEhZID0gMiwKKwlTZWVxUEhZID0gMywKKwlNYXJ2ZWxsUEhZID0gNCwKKwlNeXNvbjk4MSA9IDUsCisJTGV2ZWxPbmVQSFkgPSA2LAorCU90aGVyUEhZID0gMTAsCit9OworCitzdHJ1Y3QgY2hpcF9pbmZvIHsKKwljaGFyICpjaGlwX25hbWU7CisJaW50IGlvX3NpemU7CisJaW50IGZsYWdzOworfTsKKworc3RhdGljIHN0cnVjdCBjaGlwX2luZm8gc2tlbF9uZXRkcnZfdGJsW10gPSB7CisJeyIxMDAvMTBNIEV0aGVybmV0IFBDSSBBZGFwdGVyIiwgMTM2LCBIQVNfTUlJX1hDVlJ9LAorCXsiMTAwLzEwTSBFdGhlcm5ldCBQQ0kgQWRhcHRlciIsIDEzNiwgSEFTX0NISVBfWENWUn0sCisJeyIxMDAwLzEwMC8xME0gRXRoZXJuZXQgUENJIEFkYXB0ZXIiLCAxMzYsIEhBU19NSUlfWENWUn0sCit9OworCisvKiBPZmZzZXRzIHRvIHRoZSBDb21tYW5kIGFuZCBTdGF0dXMgUmVnaXN0ZXJzLiAqLworZW51bSBmZWFsbnhfb2Zmc2V0cyB7CisJUEFSMCA9IDB4MCwJCS8qIHBoeXNpY2FsIGFkZHJlc3MgMC0zICovCisJUEFSMSA9IDB4MDQsCQkvKiBwaHlzaWNhbCBhZGRyZXNzIDQtNSAqLworCU1BUjAgPSAweDA4LAkJLyogbXVsdGljYXN0IGFkZHJlc3MgMC0zICovCisJTUFSMSA9IDB4MEMsCQkvKiBtdWx0aWNhc3QgYWRkcmVzcyA0LTcgKi8KKwlGQVIwID0gMHgxMCwJCS8qIGZsb3ctY29udHJvbCBhZGRyZXNzIDAtMyAqLworCUZBUjEgPSAweDE0LAkJLyogZmxvdy1jb250cm9sIGFkZHJlc3MgNC01ICovCisJVENSUkNSID0gMHgxOCwJCS8qIHJlY2VpdmUgJiB0cmFuc21pdCBjb25maWd1cmF0aW9uICovCisJQkNSID0gMHgxQywJCS8qIGJ1cyBjb21tYW5kICovCisJVFhQRFIgPSAweDIwLAkJLyogdHJhbnNtaXQgcG9sbGluZyBkZW1hbmQgKi8KKwlSWFBEUiA9IDB4MjQsCQkvKiByZWNlaXZlIHBvbGxpbmcgZGVtYW5kICovCisJUlhDV1AgPSAweDI4LAkJLyogcmVjZWl2ZSBjdXJyZW50IHdvcmQgcG9pbnRlciAqLworCVRYTEJBID0gMHgyQywJCS8qIHRyYW5zbWl0IGxpc3QgYmFzZSBhZGRyZXNzICovCisJUlhMQkEgPSAweDMwLAkJLyogcmVjZWl2ZSBsaXN0IGJhc2UgYWRkcmVzcyAqLworCUlTUiA9IDB4MzQsCQkvKiBpbnRlcnJ1cHQgc3RhdHVzICovCisJSU1SID0gMHgzOCwJCS8qIGludGVycnVwdCBtYXNrICovCisJRlRIID0gMHgzQywJCS8qIGZsb3cgY29udHJvbCBoaWdoL2xvdyB0aHJlc2hvbGQgKi8KKwlNQU5BR0VNRU5UID0gMHg0MCwJLyogYm9vdHJvbS9lZXByb20gYW5kIG1paSBtYW5hZ2VtZW50ICovCisJVEFMTFkgPSAweDQ0LAkJLyogdGFsbHkgY291bnRlcnMgZm9yIGNyYyBhbmQgbXBhICovCisJVFNSID0gMHg0OCwJCS8qIHRhbGx5IGNvdW50ZXIgZm9yIHRyYW5zbWl0IHN0YXR1cyAqLworCUJNQ1JTUiA9IDB4NGMsCQkvKiBiYXNpYyBtb2RlIGNvbnRyb2wgYW5kIHN0YXR1cyAqLworCVBIWUlERU5USUZJRVIgPSAweDUwLAkvKiBwaHkgaWRlbnRpZmllciAqLworCUFOQVJBTkxQQVIgPSAweDU0LAkvKiBhdXRvLW5lZ290aWF0aW9uIGFkdmVydGlzZW1lbnQgYW5kIGxpbmsKKwkJCQkgICBwYXJ0bmVyIGFiaWxpdHkgKi8KKwlBTkVST0NSID0gMHg1OCwJCS8qIGF1dG8tbmVnb3RpYXRpb24gZXhwYW5zaW9uIGFuZCBwY2kgY29uZi4gKi8KKwlCUFJFTVJQU1IgPSAweDVjLAkvKiBieXBhc3MgJiByZWNlaXZlIGVycm9yIG1hc2sgYW5kIHBoeSBzdGF0dXMgKi8KK307CisKKy8qIEJpdHMgaW4gdGhlIGludGVycnVwdCBzdGF0dXMvZW5hYmxlIHJlZ2lzdGVycy4gKi8KKy8qIFRoZSBiaXRzIGluIHRoZSBJbnRyIFN0YXR1cy9FbmFibGUgcmVnaXN0ZXJzLCBtb3N0bHkgaW50ZXJydXB0IHNvdXJjZXMuICovCitlbnVtIGludHJfc3RhdHVzX2JpdHMgeworCVJGQ09OID0gMHgwMDAyMDAwMCwJLyogcmVjZWl2ZSBmbG93IGNvbnRyb2wgeG9uIHBhY2tldCAqLworCVJGQ09GRiA9IDB4MDAwMTAwMDAsCS8qIHJlY2VpdmUgZmxvdyBjb250cm9sIHhvZmYgcGFja2V0ICovCisJTFNDU3RhdHVzID0gMHgwMDAwODAwMCwJLyogbGluayBzdGF0dXMgY2hhbmdlICovCisJQU5DU3RhdHVzID0gMHgwMDAwNDAwMCwJLyogYXV0b25lZ290aWF0aW9uIGNvbXBsZXRlZCAqLworCUZCRSA9IDB4MDAwMDIwMDAsCS8qIGZhdGFsIGJ1cyBlcnJvciAqLworCUZCRU1hc2sgPSAweDAwMDAxODAwLAkvKiBtYXNrIGJpdDEyLTExICovCisJUGFyaXR5RXJyID0gMHgwMDAwMDAwMCwJLyogcGFyaXR5IGVycm9yICovCisJVGFyZ2V0RXJyID0gMHgwMDAwMTAwMCwJLyogdGFyZ2V0IGFib3J0ICovCisJTWFzdGVyRXJyID0gMHgwMDAwMDgwMCwJLyogbWFzdGVyIGVycm9yICovCisJVFVORiA9IDB4MDAwMDA0MDAsCS8qIHRyYW5zbWl0IHVuZGVyZmxvdyAqLworCVJPVkYgPSAweDAwMDAwMjAwLAkvKiByZWNlaXZlIG92ZXJmbG93ICovCisJRVRJID0gMHgwMDAwMDEwMCwJLyogdHJhbnNtaXQgZWFybHkgaW50ICovCisJRVJJID0gMHgwMDAwMDA4MCwJLyogcmVjZWl2ZSBlYXJseSBpbnQgKi8KKwlDTlRPVkYgPSAweDAwMDAwMDQwLAkvKiBjb3VudGVyIG92ZXJmbG93ICovCisJUkJVID0gMHgwMDAwMDAyMCwJLyogcmVjZWl2ZSBidWZmZXIgdW5hdmFpbGFibGUgKi8KKwlUQlUgPSAweDAwMDAwMDEwLAkvKiB0cmFuc21pdCBidWZmZXIgdW5hdmlsYWJsZSAqLworCVRJID0gMHgwMDAwMDAwOCwJLyogdHJhbnNtaXQgaW50ZXJydXB0ICovCisJUkkgPSAweDAwMDAwMDA0LAkvKiByZWNlaXZlIGludGVycnVwdCAqLworCVJ4RXJyID0gMHgwMDAwMDAwMiwJLyogcmVjZWl2ZSBlcnJvciAqLworfTsKKworLyogQml0cyBpbiB0aGUgTmV0d29ya0NvbmZpZyByZWdpc3RlciwgVyBmb3Igd3JpdGluZywgUiBmb3IgcmVhZGluZyAqLworLyogRklYTUU6IHNvbWUgbmFtZXMgYXJlIGludmVudGVkIGJ5IG1lLiBNYXJrZWQgd2l0aCAobmFtZT8pICovCisvKiBJZiB5b3UgaGF2ZSBkb2NzIGFuZCBrbm93IGJpdCBuYW1lcywgcGxlYXNlIGZpeCAnZW0gKi8KK2VudW0gcnhfbW9kZV9iaXRzIHsKKwlDUl9XX0VOSAk9IDB4MDIwMDAwMDAsCS8qIGVuaGFuY2VkIG1vZGUgKG5hbWU/KSAqLworCUNSX1dfRkQJCT0gMHgwMDEwMDAwMCwJLyogZnVsbCBkdXBsZXggKi8KKwlDUl9XX1BTMTAJPSAweDAwMDgwMDAwLAkvKiAxMCBtYml0ICovCisJQ1JfV19UWEVOCT0gMHgwMDA0MDAwMCwJLyogdHggZW5hYmxlIChuYW1lPykgKi8KKwlDUl9XX1BTMTAwMAk9IDB4MDAwMTAwMDAsCS8qIDEwMDAgbWJpdCAqLworICAgICAvKiBDUl9XX1JYQlVSU1RNQVNLPSAweDAwMDAwZTAwLCBJbSB1bnN1cmUgYWJvdXQgdGhpcyAqLworCUNSX1dfUlhNT0RFTUFTSwk9IDB4MDAwMDAwZTAsCisJQ1JfV19QUk9NCT0gMHgwMDAwMDA4MCwJLyogcHJvbWlzY3VvdXMgbW9kZSAqLworCUNSX1dfQUIJCT0gMHgwMDAwMDA0MCwJLyogYWNjZXB0IGJyb2FkY2FzdCAqLworCUNSX1dfQU0JCT0gMHgwMDAwMDAyMCwJLyogYWNjZXB0IG11dGxpY2FzdCAqLworCUNSX1dfQVJQCT0gMHgwMDAwMDAwOCwJLyogcmVjZWl2ZSBydW50IHBrdCAqLworCUNSX1dfQUxQCT0gMHgwMDAwMDAwNCwJLyogcmVjZWl2ZSBsb25nIHBrdCAqLworCUNSX1dfU0VQCT0gMHgwMDAwMDAwMiwJLyogcmVjZWl2ZSBlcnJvciBwa3QgKi8KKwlDUl9XX1JYRU4JPSAweDAwMDAwMDAxLAkvKiByeCBlbmFibGUgKHVuaWNhc3Q/KSAobmFtZT8pICovCisKKwlDUl9SX1RYU1RPUAk9IDB4MDQwMDAwMDAsCS8qIHR4IHN0b3BwZWQgKG5hbWU/KSAqLworCUNSX1JfRkQJCT0gMHgwMDEwMDAwMCwJLyogZnVsbCBkdXBsZXggZGV0ZWN0ZWQgKi8KKwlDUl9SX1BTMTAJPSAweDAwMDgwMDAwLAkvKiAxMCBtYml0IGRldGVjdGVkICovCisJQ1JfUl9SWFNUT1AJPSAweDAwMDA4MDAwLAkvKiByeCBzdG9wcGVkIChuYW1lPykgKi8KK307CisKKy8qIFRoZSBUdWxpcCBSeCBhbmQgVHggYnVmZmVyIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IGZlYWxueF9kZXNjIHsKKwlzMzIgc3RhdHVzOworCXMzMiBjb250cm9sOworCXUzMiBidWZmZXI7CisJdTMyIG5leHRfZGVzYzsKKwlzdHJ1Y3QgZmVhbG54X2Rlc2MgKm5leHRfZGVzY19sb2dpY2FsOworCXN0cnVjdCBza19idWZmICpza2J1ZmY7CisJdTMyIHJlc2VydmVkMTsKKwl1MzIgcmVzZXJ2ZWQyOworfTsKKworLyogQml0cyBpbiBuZXR3b3JrX2Rlc2Muc3RhdHVzICovCitlbnVtIHJ4X2Rlc2Nfc3RhdHVzX2JpdHMgeworCVJYT1dOID0gMHg4MDAwMDAwMCwJLyogb3duIGJpdCAqLworCUZMTkdNQVNLID0gMHgwZmZmMDAwMCwJLyogZnJhbWUgbGVuZ3RoICovCisJRkxOR1NoaWZ0ID0gMTYsCisJTUFSU1RBVFVTID0gMHgwMDAwNDAwMCwJLyogbXVsdGljYXN0IGFkZHJlc3MgcmVjZWl2ZWQgKi8KKwlCQVJTVEFUVVMgPSAweDAwMDAyMDAwLAkvKiBicm9hZGNhc3QgYWRkcmVzcyByZWNlaXZlZCAqLworCVBIWVNUQVRVUyA9IDB4MDAwMDEwMDAsCS8qIHBoeXNpY2FsIGFkZHJlc3MgcmVjZWl2ZWQgKi8KKwlSWEZTRCA9IDB4MDAwMDA4MDAsCS8qIGZpcnN0IGRlc2NyaXB0b3IgKi8KKwlSWExTRCA9IDB4MDAwMDA0MDAsCS8qIGxhc3QgZGVzY3JpcHRvciAqLworCUVycm9yU3VtbWFyeSA9IDB4ODAsCS8qIGVycm9yIHN1bW1hcnkgKi8KKwlSVU5UID0gMHg0MCwJCS8qIHJ1bnQgcGFja2V0IHJlY2VpdmVkICovCisJTE9ORyA9IDB4MjAsCQkvKiBsb25nIHBhY2tldCByZWNlaXZlZCAqLworCUZBRSA9IDB4MTAsCQkvKiBmcmFtZSBhbGlnbiBlcnJvciAqLworCUNSQyA9IDB4MDgsCQkvKiBjcmMgZXJyb3IgKi8KKwlSWEVSID0gMHgwNCwJCS8qIHJlY2VpdmUgZXJyb3IgKi8KK307CisKK2VudW0gcnhfZGVzY19jb250cm9sX2JpdHMgeworCVJYSUMgPSAweDAwODAwMDAwLAkvKiBpbnRlcnJ1cHQgY29udHJvbCAqLworCVJCU1NoaWZ0ID0gMCwKK307CisKK2VudW0gdHhfZGVzY19zdGF0dXNfYml0cyB7CisJVFhPV04gPSAweDgwMDAwMDAwLAkvKiBvd24gYml0ICovCisJSkFCVE8gPSAweDAwMDA0MDAwLAkvKiBqYWJiZXIgdGltZW91dCAqLworCUNTTCA9IDB4MDAwMDIwMDAsCS8qIGNhcnJpZXIgc2Vuc2UgbG9zdCAqLworCUxDID0gMHgwMDAwMTAwMCwJLyogbGF0ZSBjb2xsaXNpb24gKi8KKwlFQyA9IDB4MDAwMDA4MDAsCS8qIGV4Y2Vzc2l2ZSBjb2xsaXNpb24gKi8KKwlVREYgPSAweDAwMDAwNDAwLAkvKiBmaWZvIHVuZGVyZmxvdyAqLworCURGUiA9IDB4MDAwMDAyMDAsCS8qIGRlZmVycmVkICovCisJSEYgPSAweDAwMDAwMTAwLAkvKiBoZWFydGJlYXQgZmFpbCAqLworCU5DUk1hc2sgPSAweDAwMDAwMGZmLAkvKiBjb2xsaXNpb24gcmV0cnkgY291bnQgKi8KKwlOQ1JTaGlmdCA9IDAsCit9OworCitlbnVtIHR4X2Rlc2NfY29udHJvbF9iaXRzIHsKKwlUWElDID0gMHg4MDAwMDAwMCwJLyogaW50ZXJydXB0IGNvbnRyb2wgKi8KKwlFVElDb250cm9sID0gMHg0MDAwMDAwMCwJLyogZWFybHkgdHJhbnNtaXQgaW50ZXJydXB0ICovCisJVFhMRCA9IDB4MjAwMDAwMDAsCS8qIGxhc3QgZGVzY3JpcHRvciAqLworCVRYRkQgPSAweDEwMDAwMDAwLAkvKiBmaXJzdCBkZXNjcmlwdG9yICovCisJQ1JDRW5hYmxlID0gMHgwODAwMDAwMCwJLyogY3JjIGNvbnRyb2wgKi8KKwlQQURFbmFibGUgPSAweDA0MDAwMDAwLAkvKiBwYWRkaW5nIGNvbnRyb2wgKi8KKwlSZXRyeVR4TEMgPSAweDAyMDAwMDAwLAkvKiByZXRyeSBsYXRlIGNvbGxpc2lvbiAqLworCVBLVFNNYXNrID0gMHgzZmY4MDAsCS8qIHBhY2tldCBzaXplIGJpdDIxLTExICovCisJUEtUU1NoaWZ0ID0gMTEsCisJVEJTTWFzayA9IDB4MDAwMDA3ZmYsCS8qIHRyYW5zbWl0IGJ1ZmZlciBiaXQgMTAtMCAqLworCVRCU1NoaWZ0ID0gMCwKK307CisKKy8qIEJvb3RST00vRUVQUk9NL01JSSBNYW5hZ2VtZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIE1BU0tfTUlJUl9NSUlfUkVBRCAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE1BU0tfTUlJUl9NSUlfV1JJVEUgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIE1BU0tfTUlJUl9NSUlfTURPICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE1BU0tfTUlJUl9NSUlfTURJICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE1BU0tfTUlJUl9NSUlfTURDICAgICAgICAweDAwMDAwMDAxCisKKy8qIFNUK09QK1BIWUFEK1JFR0FEK1RBICovCisjZGVmaW5lIE9QX1JFQUQgICAgICAgICAgICAgMHg2MDAwCS8qIFNUOjAxK09QOjEwK1BIWUFEK1JFR0FEK1RBOlowICovCisjZGVmaW5lIE9QX1dSSVRFICAgICAgICAgICAgMHg1MDAyCS8qIFNUOjAxK09QOjAxK1BIWUFEK1JFR0FEK1RBOjEwICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgQ29uc3RhbnRzIGZvciBNeXNvbiBQSFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgTXlzb25QSFlJRCAgICAgIDB4ZDAwMDAzMDIKKy8qIDg5LTctMjcgYWRkLCAoYmVnaW4pICovCisjZGVmaW5lIE15c29uUEhZSUQwICAgICAweDAzMDIKKyNkZWZpbmUgU3RhdHVzUmVnaXN0ZXIgIDE4CisjZGVmaW5lIFNQRUVEMTAwICAgICAgICAweDA0MDAJLy8gYml0MTAKKyNkZWZpbmUgRlVMTE1PREUgICAgICAgIDB4MDgwMAkvLyBiaXQxMQorLyogODktNy0yNyBhZGQsIChlbmQpICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgQ29uc3RhbnRzIGZvciBTZWVxIDgwMjI1IFBIWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgU2VlcVBIWUlEMCAgICAgIDB4MDAxNgorCisjZGVmaW5lIE1JSVJlZ2lzdGVyMTggICAxOAorI2RlZmluZSBTUERfREVUXzEwMCAgICAgMHg4MAorI2RlZmluZSBEUExYX0RFVF9GVUxMICAgMHg0MAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIENvbnN0YW50cyBmb3IgQWhkb2MgMTAxIFBIWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEFoZG9jUEhZSUQwICAgICAweDAwMjIKKworI2RlZmluZSBEaWFnbm9zdGljUmVnICAgMTgKKyNkZWZpbmUgRFBMWF9GVUxMICAgICAgIDB4MDgwMAorI2RlZmluZSBTcGVlZF8xMDAgICAgICAgMHgwNDAwCisKKy8qIDg5LzYvMTMgYWRkLCAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgQ29uc3RhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBNYXJ2ZWxsUEhZSUQwICAgICAgICAgICAweDAxNDEKKyNkZWZpbmUgTGV2ZWxPbmVQSFlJRDAJCTB4MDAxMworCisjZGVmaW5lIE1JSTEwMDBCYXNlVENvbnRyb2xSZWcgIDkKKyNkZWZpbmUgTUlJMTAwMEJhc2VUU3RhdHVzUmVnICAgMTAKKyNkZWZpbmUgU3BlY2lmaWNSZWcJCTE3CisKKy8qIGZvciAxMDAwQmFzZVQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQSFlBYmxldG9QZXJmb3JtMTAwMEZ1bGxEdXBsZXggIDB4MDIwMAorI2RlZmluZSBQSFlBYmxldG9QZXJmb3JtMTAwMEhhbGZEdXBsZXggIDB4MDEwMAorI2RlZmluZSBQSFkxMDAwQWJpbGl0eU1hc2sgICAgICAgICAgICAgIDB4MzAwCisKKy8vIGZvciBwaHkgc3BlY2lmaWMgc3RhdHVzIHJlZ2lzdGVyLCBtYXJ2ZWxsIHBoeS4KKyNkZWZpbmUgU3BlZWRNYXNrICAgICAgIDB4MGMwMDAKKyNkZWZpbmUgU3BlZWRfMTAwME0gICAgIDB4MDgwMDAKKyNkZWZpbmUgU3BlZWRfMTAwTSAgICAgIDB4NDAwMAorI2RlZmluZSBTcGVlZF8xME0gICAgICAgMAorI2RlZmluZSBGdWxsX0R1cGxleCAgICAgMHgyMDAwCisKKy8vIDg5LzEyLzI5IGFkZCwgZm9yIHBoeSBzcGVjaWZpYyBzdGF0dXMgcmVnaXN0ZXIsIGxldmVsb25lIHBoeSwgKGJlZ2luKQorI2RlZmluZSBMWFQxMDAwXzEwME0gICAgMHgwODAwMAorI2RlZmluZSBMWFQxMDAwXzEwMDBNICAgMHgwYzAwMAorI2RlZmluZSBMWFQxMDAwX0Z1bGwgICAgMHgyMDAKKy8vIDg5LzEyLzI5IGFkZCwgZm9yIHBoeSBzcGVjaWZpYyBzdGF0dXMgcmVnaXN0ZXIsIGxldmVsb25lIHBoeSwgKGVuZCkKKworLyogZm9yIDMtaW4tMSBjYXNlLCBCTUNSU1IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTGlua0lzVXAyCTB4MDAwNDAwMDAKKworLyogZm9yIFBIWSAqLworI2RlZmluZSBMaW5rSXNVcCAgICAgICAgMHgwMDA0CisKKworc3RydWN0IG5ldGRldl9wcml2YXRlIHsKKwkvKiBEZXNjcmlwdG9yIHJpbmdzIGZpcnN0IGZvciBhbGlnbm1lbnQuICovCisJc3RydWN0IGZlYWxueF9kZXNjICpyeF9yaW5nOworCXN0cnVjdCBmZWFsbnhfZGVzYyAqdHhfcmluZzsKKworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKworCXNwaW5sb2NrX3QgbG9jazsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisJLyogTWVkaWEgbW9uaXRvcmluZyB0aW1lci4gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKworCS8qIFJlc2V0IHRpbWVyICovCisJc3RydWN0IHRpbWVyX2xpc3QgcmVzZXRfdGltZXI7CisJaW50IHJlc2V0X3RpbWVyX2FybWVkOworCXVuc2lnbmVkIGxvbmcgY3J2YWx1ZV9zdjsKKwl1bnNpZ25lZCBsb25nIGltcnZhbHVlX3N2OworCisJLyogRnJlcXVlbnRseSB1c2VkIHZhbHVlczoga2VlcCBzb21lIGFkamFjZW50IGZvciBjYWNoZSBlZmZlY3QuICovCisJaW50IGZsYWdzOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCXVuc2lnbmVkIGxvbmcgY3J2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGJjcnZhbHVlOworCXVuc2lnbmVkIGxvbmcgaW1ydmFsdWU7CisJc3RydWN0IGZlYWxueF9kZXNjICpjdXJfcng7CisJc3RydWN0IGZlYWxueF9kZXNjICpsYWNrX3J4YnVmOworCWludCByZWFsbHlfcnhfY291bnQ7CisJc3RydWN0IGZlYWxueF9kZXNjICpjdXJfdHg7CisJc3RydWN0IGZlYWxueF9kZXNjICpjdXJfdHhfY29weTsKKwlpbnQgcmVhbGx5X3R4X2NvdW50OworCWludCBmcmVlX3R4X2NvdW50OworCXVuc2lnbmVkIGludCByeF9idWZfc3o7CS8qIEJhc2VkIG9uIE1UVStzbGFjay4gKi8KKworCS8qIFRoZXNlIHZhbHVlcyBhcmUga2VlcCB0cmFjayBvZiB0aGUgdHJhbnNjZWl2ZXIvbWVkaWEgaW4gdXNlLiAqLworCXVuc2lnbmVkIGludCBsaW5rb2s7CisJdW5zaWduZWQgaW50IGxpbmVfc3BlZWQ7CisJdW5zaWduZWQgaW50IGR1cGxleG1vZGU7CisJdW5zaWduZWQgaW50IGRlZmF1bHRfcG9ydDo0OwkvKiBMYXN0IGRldi0+aWZfcG9ydCB2YWx1ZS4gKi8KKwl1bnNpZ25lZCBpbnQgUEhZVHlwZTsKKworCS8qIE1JSSB0cmFuc2NlaXZlciBzZWN0aW9uLiAqLworCWludCBtaWlfY250OwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisJdW5zaWduZWQgY2hhciBwaHlzWzJdOwkvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcy4gKi8KKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpOworCXZvaWQgX19pb21lbSAqbWVtOworfTsKKworCitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSk7CitzdGF0aWMgaW50IG5ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZ2V0bGlua3R5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBnZXRsaW5rc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmV0ZGV2X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCByZXNldF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGluaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc3RhcnRfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBuZXRkZXZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIF9fc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWlpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CitzdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJlc2V0X3J4X2Rlc2NyaXB0b3JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcmVzZXRfdHhfZGVzY3JpcHRvcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIHN0b3BfbmljX3J4KHZvaWQgX19pb21lbSAqaW9hZGRyLCBsb25nIGNydmFsdWUpCit7CisJaW50IGRlbGF5ID0gMHgxMDAwOworCWlvd3JpdGUzMihjcnZhbHVlICYgfihDUl9XX1JYRU4pLCBpb2FkZHIgKyBUQ1JSQ1IpOworCXdoaWxlICgtLWRlbGF5KSB7CisJCWlmICggKGlvcmVhZDMyKGlvYWRkciArIFRDUlJDUikgJiBDUl9SX1JYU1RPUCkgPT0gQ1JfUl9SWFNUT1ApCisJCQlicmVhazsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgc3RvcF9uaWNfcnh0eCh2b2lkIF9faW9tZW0gKmlvYWRkciwgbG9uZyBjcnZhbHVlKQoreworCWludCBkZWxheSA9IDB4MTAwMDsKKwlpb3dyaXRlMzIoY3J2YWx1ZSAmIH4oQ1JfV19SWEVOK0NSX1dfVFhFTiksIGlvYWRkciArIFRDUlJDUik7CisJd2hpbGUgKC0tZGVsYXkpIHsKKwkJaWYgKCAoaW9yZWFkMzIoaW9hZGRyICsgVENSUkNSKSAmIChDUl9SX1JYU1RPUCtDUl9SX1RYU1RPUCkpCisJCQkJCSAgICA9PSAoQ1JfUl9SWFNUT1ArQ1JfUl9UWFNUT1ApICkKKwkJCWJyZWFrOworCX0KK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmZWFsbnhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnA7CisJaW50IGksIG9wdGlvbiwgZXJyLCBpcnE7CisJc3RhdGljIGludCBjYXJkX2lkeCA9IC0xOworCWNoYXIgYm9hcmRuYW1lWzEyXTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwl1bnNpZ25lZCBpbnQgY2hpcF9pZCA9IGVudC0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl2b2lkICpyaW5nX3NwYWNlOworCWRtYV9hZGRyX3QgcmluZ19kbWE7CisjaWZkZWYgVVNFX0lPX09QUworCWludCBiYXIgPSAwOworI2Vsc2UKKwlpbnQgYmFyID0gMTsKKyNlbmRpZgorCQorLyogd2hlbiBidWlsdCBpbnRvIHRoZSBrZXJuZWwsIHdlIG9ubHkgcHJpbnQgdmVyc2lvbiBpZiBkZXZpY2UgaXMgZm91bmQgKi8KKyNpZm5kZWYgTU9EVUxFCisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisJCisJY2FyZF9pZHgrKzsKKwlzcHJpbnRmKGJvYXJkbmFtZSwgImZlYWxueCVkIiwgY2FyZF9pZHgpOworCQorCW9wdGlvbiA9IGNhcmRfaWR4IDwgTUFYX1VOSVRTID8gb3B0aW9uc1tjYXJkX2lkeF0gOiAwOworCisJaSA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChpKSByZXR1cm4gaTsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwkKKwlsZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGJhcik7CisJaWYgKGxlbiA8IE1JTl9SRUdJT05fU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWdpb24gc2l6ZSAlbGQgdG9vIHNtYWxsLCBhYm9ydGluZ1xuIiwKKwkJICAgICAgIGJvYXJkbmFtZSwgbGVuKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaSA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgYm9hcmRuYW1lKTsKKwlpZiAoaSkgcmV0dXJuIGk7CisJCisJaXJxID0gcGRldi0+aXJxOworCisJaW9hZGRyID0gcGNpX2lvbWFwKHBkZXYsIGJhciwgbGVuKTsKKwlpZiAoIWlvYWRkcikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfcmVzOworCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUpKTsKKwlpZiAoIWRldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfdW5tYXA7CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJLyogcmVhZCBldGhlcm5ldCBpZCAqLworCWZvciAoaSA9IDA7IGkgPCA2OyArK2kpCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBpb3JlYWQ4KGlvYWRkciArIFBBUjAgKyBpKTsKKworCS8qIFJlc2V0IHRoZSBjaGlwIHRvIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24uICovCisJaW93cml0ZTMyKDB4MDAwMDAwMDEsIGlvYWRkciArIEJDUik7CisKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKworCS8qIE1ha2UgY2VydGFpbiB0aGUgZGVzY3JpcHRvciBsaXN0cyBhcmUgYWxpZ25lZC4gKi8KKwlucCA9IG5ldGRldl9wcml2KGRldik7CisJbnAtPm1lbSA9IGlvYWRkcjsKKwlzcGluX2xvY2tfaW5pdCgmbnAtPmxvY2spOworCW5wLT5wY2lfZGV2ID0gcGRldjsKKwlucC0+ZmxhZ3MgPSBza2VsX25ldGRydl90YmxbY2hpcF9pZF0uZmxhZ3M7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJbnAtPm1paS5kZXYgPSBkZXY7CisJbnAtPm1paS5tZGlvX3JlYWQgPSBtZGlvX3JlYWQ7CisJbnAtPm1paS5tZGlvX3dyaXRlID0gbWRpb193cml0ZTsKKwlucC0+bWlpLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlucC0+bWlpLnJlZ19udW1fbWFzayA9IDB4MWY7CisKKwlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmdfc3BhY2UpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCX0KKwlucC0+cnhfcmluZyA9IChzdHJ1Y3QgZmVhbG54X2Rlc2MgKilyaW5nX3NwYWNlOworCW5wLT5yeF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CisJaWYgKCFyaW5nX3NwYWNlKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX3J4OworCX0KKwlucC0+dHhfcmluZyA9IChzdHJ1Y3QgZmVhbG54X2Rlc2MgKilyaW5nX3NwYWNlOworCW5wLT50eF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJLyogZmluZCB0aGUgY29ubmVjdGVkIE1JSSB4Y3ZycyAqLworCWlmIChucC0+ZmxhZ3MgPT0gSEFTX01JSV9YQ1ZSKSB7CisJCWludCBwaHksIHBoeV9pZHggPSAwOworCisJCWZvciAocGh5ID0gMTsgcGh5IDwgMzIgJiYgcGh5X2lkeCA8IDQ7IHBoeSsrKSB7CisJCQlpbnQgbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChkZXYsIHBoeSwgMSk7CisKKwkJCWlmIChtaWlfc3RhdHVzICE9IDB4ZmZmZiAmJiBtaWlfc3RhdHVzICE9IDB4MDAwMCkgeworCQkJCW5wLT5waHlzW3BoeV9pZHgrK10gPSBwaHk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICAgICAiJXM6IE1JSSBQSFkgZm91bmQgYXQgYWRkcmVzcyAlZCwgc3RhdHVzICIKKwkJCQkgICAgICAgIjB4JTQuNHguXG4iLCBkZXYtPm5hbWUsIHBoeSwgbWlpX3N0YXR1cyk7CisJCQkJLyogZ2V0IHBoeSB0eXBlICovCisJCQkJeworCQkJCQl1bnNpZ25lZCBpbnQgZGF0YTsKKworCQkJCQlkYXRhID0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIDIpOworCQkJCQlpZiAoZGF0YSA9PSBTZWVxUEhZSUQwKQorCQkJCQkJbnAtPlBIWVR5cGUgPSBTZWVxUEhZOworCQkJCQllbHNlIGlmIChkYXRhID09IEFoZG9jUEhZSUQwKQorCQkJCQkJbnAtPlBIWVR5cGUgPSBBaGRvY1BIWTsKKwkJCQkJZWxzZSBpZiAoZGF0YSA9PSBNYXJ2ZWxsUEhZSUQwKQorCQkJCQkJbnAtPlBIWVR5cGUgPSBNYXJ2ZWxsUEhZOworCQkJCQllbHNlIGlmIChkYXRhID09IE15c29uUEhZSUQwKQorCQkJCQkJbnAtPlBIWVR5cGUgPSBNeXNvbjk4MTsKKwkJCQkJZWxzZSBpZiAoZGF0YSA9PSBMZXZlbE9uZVBIWUlEMCkKKwkJCQkJCW5wLT5QSFlUeXBlID0gTGV2ZWxPbmVQSFk7CisJCQkJCWVsc2UKKwkJCQkJCW5wLT5QSFlUeXBlID0gT3RoZXJQSFk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJbnAtPm1paV9jbnQgPSBwaHlfaWR4OworCQlpZiAocGh5X2lkeCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTUlJIFBIWSBub3QgZm91bmQgLS0gdGhpcyBkZXZpY2UgbWF5ICIKKwkJCSAgICAgICAibm90IG9wZXJhdGUgY29ycmVjdGx5LlxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCX0gZWxzZSB7CisJCW5wLT5waHlzWzBdID0gMzI7CisvKiA4OS82LzIzIGFkZCwgKGJlZ2luKSAqLworCQkvKiBnZXQgcGh5IHR5cGUgKi8KKwkJaWYgKGlvcmVhZDMyKGlvYWRkciArIFBIWUlERU5USUZJRVIpID09IE15c29uUEhZSUQpCisJCQlucC0+UEhZVHlwZSA9IE15c29uUEhZOworCQllbHNlCisJCQlucC0+UEhZVHlwZSA9IE90aGVyUEhZOworCX0KKwlucC0+bWlpLnBoeV9pZCA9IG5wLT5waHlzWzBdOworCisJaWYgKGRldi0+bWVtX3N0YXJ0KQorCQlvcHRpb24gPSBkZXYtPm1lbV9zdGFydDsKKworCS8qIFRoZSBsb3dlciBmb3VyIGJpdHMgYXJlIHRoZSBtZWRpYSB0eXBlLiAqLworCWlmIChvcHRpb24gPiAwKSB7CisJCWlmIChvcHRpb24gJiAweDIwMCkKKwkJCW5wLT5taWkuZnVsbF9kdXBsZXggPSAxOworCQlucC0+ZGVmYXVsdF9wb3J0ID0gb3B0aW9uICYgMTU7CisJfQorCisJaWYgKGNhcmRfaWR4IDwgTUFYX1VOSVRTICYmIGZ1bGxfZHVwbGV4W2NhcmRfaWR4XSA+IDApCisJCW5wLT5taWkuZnVsbF9kdXBsZXggPSBmdWxsX2R1cGxleFtjYXJkX2lkeF07CisKKwlpZiAobnAtPm1paS5mdWxsX2R1cGxleCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVkaWEgdHlwZSBmb3JjZWQgdG8gRnVsbCBEdXBsZXguXG4iLCBkZXYtPm5hbWUpOworLyogODkvNi8xMyBhZGQsIChiZWdpbikgKi8KKy8vICAgICAgaWYgKG5wLT5QSFlUeXBlPT1NYXJ2ZWxsUEhZKQorCQlpZiAoKG5wLT5QSFlUeXBlID09IE1hcnZlbGxQSFkpIHx8IChucC0+UEhZVHlwZSA9PSBMZXZlbE9uZVBIWSkpIHsKKwkJCXVuc2lnbmVkIGludCBkYXRhOworCisJCQlkYXRhID0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIDkpOworCQkJZGF0YSA9IChkYXRhICYgMHhmY2ZmKSB8IDB4MDIwMDsKKwkJCW1kaW9fd3JpdGUoZGV2LCBucC0+cGh5c1swXSwgOSwgZGF0YSk7CisJCX0KKy8qIDg5LzYvMTMgYWRkLCAoZW5kKSAqLworCQlpZiAobnAtPmZsYWdzID09IEhBU19NSUlfWENWUikKKwkJCW1kaW9fd3JpdGUoZGV2LCBucC0+cGh5c1swXSwgTUlJX0FEVkVSVElTRSwgQURWRVJUSVNFX0ZVTEwpOworCQllbHNlCisJCQlpb3dyaXRlMzIoQURWRVJUSVNFX0ZVTEwsIGlvYWRkciArIEFOQVJBTkxQQVIpOworCQlucC0+bWlpLmZvcmNlX21lZGlhID0gMTsKKwl9CisKKwkvKiBUaGUgY2hpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZuZXRkZXZfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzdGFydF90eDsKKwlkZXYtPnN0b3AgPSAmbmV0ZGV2X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJmdldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKwlkZXYtPmRvX2lvY3RsID0gJm1paV9pb2N0bDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKwkKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV90eDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBhdCAlcCwgIiwKKwkgICAgICAgZGV2LT5uYW1lLCBza2VsX25ldGRydl90YmxbY2hpcF9pZF0uY2hpcF9uYW1lLCBpb2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIlMi4yeCwgSVJRICVkLlxuIiwgZGV2LT5kZXZfYWRkcltpXSwgaXJxKTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfdHg6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCBucC0+dHhfcmluZywgbnAtPnR4X3JpbmdfZG1hKTsKK2Vycl9vdXRfZnJlZV9yeDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFJYX1RPVEFMX1NJWkUsIG5wLT5yeF9yaW5nLCBucC0+cnhfcmluZ19kbWEpOworZXJyX291dF9mcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworZXJyX291dF91bm1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCBpb2FkZHIpOworZXJyX291dF9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBmZWFsbnhfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldikgeworCQlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsIG5wLT50eF9yaW5nLAorCQkJbnAtPnR4X3JpbmdfZG1hKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCBucC0+cnhfcmluZywKKwkJCW5wLT5yeF9yaW5nX2RtYSk7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCXBjaV9pb3VubWFwKHBkZXYsIG5wLT5tZW0pOworCQlmcmVlX25ldGRldihkZXYpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiAiZmVhbG54OiByZW1vdmUgZm9yIHVua25vd24gZGV2aWNlXG4iKTsKK30KKworCitzdGF0aWMgdWxvbmcgbTgweF9zZW5kX2NtZF90b19waHkodm9pZCBfX2lvbWVtICptaWlwb3J0LCBpbnQgb3Bjb2RlLCBpbnQgcGh5YWQsIGludCByZWdhZCkKK3sKKwl1bG9uZyBtaWlyOworCWludCBpOworCXVuc2lnbmVkIGludCBtYXNrLCBkYXRhOworCisJLyogZW5hYmxlIE1JSSBvdXRwdXQgKi8KKwltaWlyID0gKHVsb25nKSBpb3JlYWQzMihtaWlwb3J0KTsKKwltaWlyICY9IDB4ZmZmZmZmZjA7CisKKwltaWlyIHw9IE1BU0tfTUlJUl9NSUlfV1JJVEUgKyBNQVNLX01JSVJfTUlJX01ETzsKKworCS8qIHNlbmQgMzIgMSdzIHByZWFtYmxlICovCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJLyogbG93IE1EQzsgTURPIGlzIGFscmVhZHkgaGlnaCAobWlpcikgKi8KKwkJbWlpciAmPSB+TUFTS19NSUlSX01JSV9NREM7CisJCWlvd3JpdGUzMihtaWlyLCBtaWlwb3J0KTsKKworCQkvKiBoaWdoIE1EQyAqLworCQltaWlyIHw9IE1BU0tfTUlJUl9NSUlfTURDOworCQlpb3dyaXRlMzIobWlpciwgbWlpcG9ydCk7CisJfQorCisJLyogY2FsY3VsYXRlIFNUK09QK1BIWUFEK1JFR0FEK1RBICovCisJZGF0YSA9IG9wY29kZSB8IChwaHlhZCA8PCA3KSB8IChyZWdhZCA8PCAyKTsKKworCS8qIHNlbnQgb3V0ICovCisJbWFzayA9IDB4ODAwMDsKKwl3aGlsZSAobWFzaykgeworCQkvKiBsb3cgTURDLCBwcmVwYXJlIE1ETyAqLworCQltaWlyICY9IH4oTUFTS19NSUlSX01JSV9NREMgKyBNQVNLX01JSVJfTUlJX01ETyk7CisJCWlmIChtYXNrICYgZGF0YSkKKwkJCW1paXIgfD0gTUFTS19NSUlSX01JSV9NRE87CisKKwkJaW93cml0ZTMyKG1paXIsIG1paXBvcnQpOworCQkvKiBoaWdoIE1EQyAqLworCQltaWlyIHw9IE1BU0tfTUlJUl9NSUlfTURDOworCQlpb3dyaXRlMzIobWlpciwgbWlpcG9ydCk7CisJCXVkZWxheSgzMCk7CisKKwkJLyogbmV4dCAqLworCQltYXNrID4+PSAxOworCQlpZiAobWFzayA9PSAweDIgJiYgb3Bjb2RlID09IE9QX1JFQUQpCisJCQltaWlyICY9IH5NQVNLX01JSVJfTUlJX1dSSVRFOworCX0KKwlyZXR1cm4gbWlpcjsKK30KKworCitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5YWQsIGludCByZWdhZCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKm1paXBvcnQgPSBucC0+bWVtICsgTUFOQUdFTUVOVDsKKwl1bG9uZyBtaWlyOworCXVuc2lnbmVkIGludCBtYXNrLCBkYXRhOworCisJbWlpciA9IG04MHhfc2VuZF9jbWRfdG9fcGh5KG1paXBvcnQsIE9QX1JFQUQsIHBoeWFkLCByZWdhZCk7CisKKwkvKiByZWFkIGRhdGEgKi8KKwltYXNrID0gMHg4MDAwOworCWRhdGEgPSAwOworCXdoaWxlIChtYXNrKSB7CisJCS8qIGxvdyBNREMgKi8KKwkJbWlpciAmPSB+TUFTS19NSUlSX01JSV9NREM7CisJCWlvd3JpdGUzMihtaWlyLCBtaWlwb3J0KTsKKworCQkvKiByZWFkIE1ESSAqLworCQltaWlyID0gaW9yZWFkMzIobWlpcG9ydCk7CisJCWlmIChtaWlyICYgTUFTS19NSUlSX01JSV9NREkpCisJCQlkYXRhIHw9IG1hc2s7CisKKwkJLyogaGlnaCBNREMsIGFuZCB3YWl0ICovCisJCW1paXIgfD0gTUFTS19NSUlSX01JSV9NREM7CisJCWlvd3JpdGUzMihtaWlyLCBtaWlwb3J0KTsKKwkJdWRlbGF5KDMwKTsKKworCQkvKiBuZXh0ICovCisJCW1hc2sgPj49IDE7CisJfQorCisJLyogbG93IE1EQyAqLworCW1paXIgJj0gfk1BU0tfTUlJUl9NSUlfTURDOworCWlvd3JpdGUzMihtaWlyLCBtaWlwb3J0KTsKKworCXJldHVybiBkYXRhICYgMHhmZmZmOworfQorCisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeWFkLCBpbnQgcmVnYWQsIGludCBkYXRhKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqbWlpcG9ydCA9IG5wLT5tZW0gKyBNQU5BR0VNRU5UOworCXVsb25nIG1paXI7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwltaWlyID0gbTgweF9zZW5kX2NtZF90b19waHkobWlpcG9ydCwgT1BfV1JJVEUsIHBoeWFkLCByZWdhZCk7CisKKwkvKiB3cml0ZSBkYXRhICovCisJbWFzayA9IDB4ODAwMDsKKwl3aGlsZSAobWFzaykgeworCQkvKiBsb3cgTURDLCBwcmVwYXJlIE1ETyAqLworCQltaWlyICY9IH4oTUFTS19NSUlSX01JSV9NREMgKyBNQVNLX01JSVJfTUlJX01ETyk7CisJCWlmIChtYXNrICYgZGF0YSkKKwkJCW1paXIgfD0gTUFTS19NSUlSX01JSV9NRE87CisJCWlvd3JpdGUzMihtaWlyLCBtaWlwb3J0KTsKKworCQkvKiBoaWdoIE1EQyAqLworCQltaWlyIHw9IE1BU0tfTUlJUl9NSUlfTURDOworCQlpb3dyaXRlMzIobWlpciwgbWlpcG9ydCk7CisKKwkJLyogbmV4dCAqLworCQltYXNrID4+PSAxOworCX0KKworCS8qIGxvdyBNREMgKi8KKwltaWlyICY9IH5NQVNLX01JSVJfTUlJX01EQzsKKwlpb3dyaXRlMzIobWlpciwgbWlpcG9ydCk7Cit9CisKKworc3RhdGljIGludCBuZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPm1lbTsKKwlpbnQgaTsKKworCWlvd3JpdGUzMigweDAwMDAwMDAxLCBpb2FkZHIgKyBCQ1IpOwkvKiBSZXNldCAqLworCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmaW50cl9oYW5kbGVyLCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCWlvd3JpdGUxNigoKHVuc2lnbmVkIHNob3J0KilkZXYtPmRldl9hZGRyKVtpXSwKKwkJCQlpb2FkZHIgKyBQQVIwICsgaSoyKTsKKworCWluaXRfcmluZyhkZXYpOworCisJaW93cml0ZTMyKG5wLT5yeF9yaW5nX2RtYSwgaW9hZGRyICsgUlhMQkEpOworCWlvd3JpdGUzMihucC0+dHhfcmluZ19kbWEsIGlvYWRkciArIFRYTEJBKTsKKworCS8qIEluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzLiAqLworCS8qIENvbmZpZ3VyZSB0aGUgUENJIGJ1cyBidXJzdHMgYW5kIEZJRk8gdGhyZXNob2xkcy4KKwkgICA0ODY6IFNldCA4IGxvbmd3b3JkIGJ1cnN0LgorCSAgIDU4Njogbm8gYnVyc3QgbGltaXQuCisJICAgQnVyc3QgbGVuZ3RoIDU6MworCSAgIDAgMCAwICAgMQorCSAgIDAgMCAxICAgNAorCSAgIDAgMSAwICAgOAorCSAgIDAgMSAxICAgMTYKKwkgICAxIDAgMCAgIDMyCisJICAgMSAwIDEgICA2NAorCSAgIDEgMSAwICAgMTI4CisJICAgMSAxIDEgICAyNTYKKwkgICBXYWl0IHRoZSBzcGVjaWZpZWQgNTAgUENJIGN5Y2xlcyBhZnRlciBhIHJlc2V0IGJ5IGluaXRpYWxpemluZworCSAgIFR4IGFuZCBSeCBxdWV1ZXMgYW5kIHRoZSBhZGRyZXNzIGZpbHRlciBsaXN0LgorCSAgIEZJWE1FIChVZWltb3IpOiBvcHRpbWlzdGljIGZvciBhbHBoYSArIHBvc3RlZCB3cml0ZXMgPyAqLworI2lmIGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19zcGFyY19fKQorLy8gODkvOS8xIG1vZGlmeSwgCisvLyAgIG5wLT5iY3J2YWx1ZT0weDA0IHwgMHgweDM4OyAgLyogYmlnLWVuZGlhbiwgMjU2IGJ1cnN0IGxlbmd0aCAqLworCW5wLT5iY3J2YWx1ZSA9IDB4MDQgfCAweDEwOwkvKiBiaWctZW5kaWFuLCB0eCA4IGJ1cnN0IGxlbmd0aCAqLworCW5wLT5jcnZhbHVlID0gMHhlMDA7CS8qIHJ4IDEyOCBidXJzdCBsZW5ndGggKi8KKyNlbGlmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisvLyA4OS85LzEgbW9kaWZ5LCAKKy8vICAgbnAtPmJjcnZhbHVlPTB4Mzg7ICAgICAgICAgICAvKiBsaXR0bGUtZW5kaWFuLCAyNTYgYnVyc3QgbGVuZ3RoICovCisJbnAtPmJjcnZhbHVlID0gMHgxMDsJLyogbGl0dGxlLWVuZGlhbiwgOCBidXJzdCBsZW5ndGggKi8KKwlucC0+Y3J2YWx1ZSA9IDB4ZTAwOwkvKiByeCAxMjggYnVyc3QgbGVuZ3RoICovCisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorI2lmIGRlZmluZWQoTU9EVUxFKQorLy8gODkvOS8xIG1vZGlmeSwgCisvLyAgIG5wLT5iY3J2YWx1ZT0weDM4OyAgICAgICAgICAgLyogbGl0dGxlLWVuZGlhbiwgMjU2IGJ1cnN0IGxlbmd0aCAqLworCW5wLT5iY3J2YWx1ZSA9IDB4MTA7CS8qIGxpdHRsZS1lbmRpYW4sIDggYnVyc3QgbGVuZ3RoICovCisJbnAtPmNydmFsdWUgPSAweGUwMDsJLyogcnggMTI4IGJ1cnN0IGxlbmd0aCAqLworI2Vsc2UKKwkvKiBXaGVuIG5vdCBhIG1vZHVsZSB3ZSBjYW4gd29yayBhcm91bmQgYnJva2VuICc0ODYgUENJIGJvYXJkcy4gKi8KKyNkZWZpbmUgeDg2IGJvb3RfY3B1X2RhdGEueDg2CisvLyA4OS85LzEgbW9kaWZ5LCAKKy8vICAgbnAtPmJjcnZhbHVlPSh4ODYgPD0gNCA/IDB4MTAgOiAweDM4KTsKKwlucC0+YmNydmFsdWUgPSAweDEwOworCW5wLT5jcnZhbHVlID0gKHg4NiA8PSA0ID8gMHhhMDAgOiAweGUwMCk7CisJaWYgKHg4NiA8PSA0KQorCQlwcmludGsoS0VSTl9JTkZPICIlczogVGhpcyBpcyBhIDM4Ni80ODYgUENJIHN5c3RlbSwgc2V0dGluZyBidXJzdCAiCisJCSAgICAgICAibGVuZ3RoIHRvICV4LlxuIiwgZGV2LT5uYW1lLCAoeDg2IDw9IDQgPyAweDEwIDogMHgzOCkpOworI2VuZGlmCisjZWxzZQorLy8gODkvOS8xIG1vZGlmeSwKKy8vICAgbnAtPmJjcnZhbHVlPTB4Mzg7CisJbnAtPmJjcnZhbHVlID0gMHgxMDsKKwlucC0+Y3J2YWx1ZSA9IDB4ZTAwOwkvKiByeCAxMjggYnVyc3QgbGVuZ3RoICovCisjd2FybmluZyBQcm9jZXNzb3IgYXJjaGl0ZWN0dXJlIHVuZGVmaW5lZCEKKyNlbmRpZgorLy8gODkvMTIvMjkgYWRkLAorLy8gOTAvMS8xNiBtb2RpZnksCisvLyAgIG5wLT5pbXJ2YWx1ZT1GQkV8VFVORnxDTlRPVkZ8UkJVfFRJfFJJOworCW5wLT5pbXJ2YWx1ZSA9IFRVTkYgfCBDTlRPVkYgfCBSQlUgfCBUSSB8IFJJOworCWlmIChucC0+cGNpX2Rldi0+ZGV2aWNlID09IDB4ODkxKSB7CisJCW5wLT5iY3J2YWx1ZSB8PSAweDIwMDsJLyogc2V0IFBST0cgYml0ICovCisJCW5wLT5jcnZhbHVlIHw9IENSX1dfRU5IOwkvKiBzZXQgZW5oYW5jZWQgYml0ICovCisJCW5wLT5pbXJ2YWx1ZSB8PSBFVEk7CisJfQorCWlvd3JpdGUzMihucC0+YmNydmFsdWUsIGlvYWRkciArIEJDUik7CisKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDApCisJCWRldi0+aWZfcG9ydCA9IG5wLT5kZWZhdWx0X3BvcnQ7CisKKwlpb3dyaXRlMzIoMCwgaW9hZGRyICsgUlhQRFIpOworLy8gODkvOS8xIG1vZGlmeSwKKy8vICAgbnAtPmNydmFsdWUgPSAweDAwZTQwMDAxOyAgICAvKiB0eCBzdG9yZSBhbmQgZm9yd2FyZCwgdHgvcnggZW5hYmxlICovCisJbnAtPmNydmFsdWUgfD0gMHgwMGU0MDAwMTsJLyogdHggc3RvcmUgYW5kIGZvcndhcmQsIHR4L3J4IGVuYWJsZSAqLworCW5wLT5taWkuZnVsbF9kdXBsZXggPSBucC0+bWlpLmZvcmNlX21lZGlhOworCWdldGxpbmtzdGF0dXMoZGV2KTsKKwlpZiAobnAtPmxpbmtvaykKKwkJZ2V0bGlua3R5cGUoZGV2KTsKKwlfX3NldF9yeF9tb2RlKGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJLyogQ2xlYXIgYW5kIEVuYWJsZSBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCWlvd3JpdGUzMihGQkUgfCBUVU5GIHwgQ05UT1ZGIHwgUkJVIHwgVEkgfCBSSSwgaW9hZGRyICsgSVNSKTsKKwlpb3dyaXRlMzIobnAtPmltcnZhbHVlLCBpb2FkZHIgKyBJTVIpOworCisJaWYgKGRlYnVnKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgbmV0ZGV2X29wZW4oKS5cbiIsIGRldi0+bmFtZSk7CisKKwkvKiBTZXQgdGhlIHRpbWVyIHRvIGNoZWNrIGZvciBsaW5rIGJlYXQuICovCisJaW5pdF90aW1lcigmbnAtPnRpbWVyKTsKKwlucC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCgzICogSFopOworCW5wLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwlucC0+dGltZXIuZnVuY3Rpb24gPSAmbmV0ZGV2X3RpbWVyOworCisJLyogdGltZXIgaGFuZGxlciAqLworCWFkZF90aW1lcigmbnAtPnRpbWVyKTsKKworCWluaXRfdGltZXIoJm5wLT5yZXNldF90aW1lcik7CisJbnAtPnJlc2V0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCW5wLT5yZXNldF90aW1lci5mdW5jdGlvbiA9ICZyZXNldF90aW1lcjsKKwlucC0+cmVzZXRfdGltZXJfYXJtZWQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgZ2V0bGlua3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorLyogZnVuY3Rpb246IFJvdXRpbmUgd2lsbCByZWFkIE1JSSBTdGF0dXMgUmVnaXN0ZXIgdG8gZ2V0IGxpbmsgc3RhdHVzLiAgICAgICAqLworLyogaW5wdXQgICA6IGRldi4uLiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogb3V0cHV0ICA6IG5vbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBpLCBEZWxheVRpbWUgPSAweDEwMDA7CisKKwlucC0+bGlua29rID0gMDsKKworCWlmIChucC0+UEhZVHlwZSA9PSBNeXNvblBIWSkgeworCQlmb3IgKGkgPSAwOyBpIDwgRGVsYXlUaW1lOyArK2kpIHsKKwkJCWlmIChpb3JlYWQzMihucC0+bWVtICsgQk1DUlNSKSAmIExpbmtJc1VwMikgeworCQkJCW5wLT5saW5rb2sgPSAxOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXVkZWxheSgxMDApOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IERlbGF5VGltZTsgKytpKSB7CisJCQlpZiAobWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTVNSKSAmIEJNU1JfTFNUQVRVUykgeworCQkJCW5wLT5saW5rb2sgPSAxOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXVkZWxheSgxMDApOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGdldGxpbmt0eXBlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobnAtPlBIWVR5cGUgPT0gTXlzb25QSFkpIHsJLyogMy1pbi0xIGNhc2UgKi8KKwkJaWYgKGlvcmVhZDMyKG5wLT5tZW0gKyBUQ1JSQ1IpICYgQ1JfUl9GRCkKKwkJCW5wLT5kdXBsZXhtb2RlID0gMjsJLyogZnVsbCBkdXBsZXggKi8KKwkJZWxzZQorCQkJbnAtPmR1cGxleG1vZGUgPSAxOwkvKiBoYWxmIGR1cGxleCAqLworCQlpZiAoaW9yZWFkMzIobnAtPm1lbSArIFRDUlJDUikgJiBDUl9SX1BTMTApCisJCQlucC0+bGluZV9zcGVlZCA9IDE7CS8qIDEwTSAqLworCQllbHNlCisJCQlucC0+bGluZV9zcGVlZCA9IDI7CS8qIDEwME0gKi8KKwl9IGVsc2UgeworCQlpZiAobnAtPlBIWVR5cGUgPT0gU2VlcVBIWSkgewkvKiB0aGlzIFBIWSBpcyBTRUVRIDgwMjI1ICovCisJCQl1bnNpZ25lZCBpbnQgZGF0YTsKKworCQkJZGF0YSA9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlSZWdpc3RlcjE4KTsKKwkJCWlmIChkYXRhICYgU1BEX0RFVF8xMDApCisJCQkJbnAtPmxpbmVfc3BlZWQgPSAyOwkvKiAxMDBNICovCisJCQllbHNlCisJCQkJbnAtPmxpbmVfc3BlZWQgPSAxOwkvKiAxME0gKi8KKwkJCWlmIChkYXRhICYgRFBMWF9ERVRfRlVMTCkKKwkJCQlucC0+ZHVwbGV4bW9kZSA9IDI7CS8qIGZ1bGwgZHVwbGV4IG1vZGUgKi8KKwkJCWVsc2UKKwkJCQlucC0+ZHVwbGV4bW9kZSA9IDE7CS8qIGhhbGYgZHVwbGV4IG1vZGUgKi8KKwkJfSBlbHNlIGlmIChucC0+UEhZVHlwZSA9PSBBaGRvY1BIWSkgeworCQkJdW5zaWduZWQgaW50IGRhdGE7CisKKwkJCWRhdGEgPSBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgRGlhZ25vc3RpY1JlZyk7CisJCQlpZiAoZGF0YSAmIFNwZWVkXzEwMCkKKwkJCQlucC0+bGluZV9zcGVlZCA9IDI7CS8qIDEwME0gKi8KKwkJCWVsc2UKKwkJCQlucC0+bGluZV9zcGVlZCA9IDE7CS8qIDEwTSAqLworCQkJaWYgKGRhdGEgJiBEUExYX0ZVTEwpCisJCQkJbnAtPmR1cGxleG1vZGUgPSAyOwkvKiBmdWxsIGR1cGxleCBtb2RlICovCisJCQllbHNlCisJCQkJbnAtPmR1cGxleG1vZGUgPSAxOwkvKiBoYWxmIGR1cGxleCBtb2RlICovCisJCX0KKy8qIDg5LzYvMTMgYWRkLCAoYmVnaW4pICovCisJCWVsc2UgaWYgKG5wLT5QSFlUeXBlID09IE1hcnZlbGxQSFkpIHsKKwkJCXVuc2lnbmVkIGludCBkYXRhOworCisJCQlkYXRhID0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIFNwZWNpZmljUmVnKTsKKwkJCWlmIChkYXRhICYgRnVsbF9EdXBsZXgpCisJCQkJbnAtPmR1cGxleG1vZGUgPSAyOwkvKiBmdWxsIGR1cGxleCBtb2RlICovCisJCQllbHNlCisJCQkJbnAtPmR1cGxleG1vZGUgPSAxOwkvKiBoYWxmIGR1cGxleCBtb2RlICovCisJCQlkYXRhICY9IFNwZWVkTWFzazsKKwkJCWlmIChkYXRhID09IFNwZWVkXzEwMDBNKQorCQkJCW5wLT5saW5lX3NwZWVkID0gMzsJLyogMTAwME0gKi8KKwkJCWVsc2UgaWYgKGRhdGEgPT0gU3BlZWRfMTAwTSkKKwkJCQlucC0+bGluZV9zcGVlZCA9IDI7CS8qIDEwME0gKi8KKwkJCWVsc2UKKwkJCQlucC0+bGluZV9zcGVlZCA9IDE7CS8qIDEwTSAqLworCQl9CisvKiA4OS82LzEzIGFkZCwgKGVuZCkgKi8KKy8qIDg5LzcvMjcgYWRkLCAoYmVnaW4pICovCisJCWVsc2UgaWYgKG5wLT5QSFlUeXBlID09IE15c29uOTgxKSB7CisJCQl1bnNpZ25lZCBpbnQgZGF0YTsKKworCQkJZGF0YSA9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBTdGF0dXNSZWdpc3Rlcik7CisKKwkJCWlmIChkYXRhICYgU1BFRUQxMDApCisJCQkJbnAtPmxpbmVfc3BlZWQgPSAyOworCQkJZWxzZQorCQkJCW5wLT5saW5lX3NwZWVkID0gMTsKKworCQkJaWYgKGRhdGEgJiBGVUxMTU9ERSkKKwkJCQlucC0+ZHVwbGV4bW9kZSA9IDI7CisJCQllbHNlCisJCQkJbnAtPmR1cGxleG1vZGUgPSAxOworCQl9CisvKiA4OS83LzI3IGFkZCwgKGVuZCkgKi8KKy8qIDg5LzEyLzI5IGFkZCAqLworCQllbHNlIGlmIChucC0+UEhZVHlwZSA9PSBMZXZlbE9uZVBIWSkgeworCQkJdW5zaWduZWQgaW50IGRhdGE7CisKKwkJCWRhdGEgPSBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgU3BlY2lmaWNSZWcpOworCQkJaWYgKGRhdGEgJiBMWFQxMDAwX0Z1bGwpCisJCQkJbnAtPmR1cGxleG1vZGUgPSAyOwkvKiBmdWxsIGR1cGxleCBtb2RlICovCisJCQllbHNlCisJCQkJbnAtPmR1cGxleG1vZGUgPSAxOwkvKiBoYWxmIGR1cGxleCBtb2RlICovCisJCQlkYXRhICY9IFNwZWVkTWFzazsKKwkJCWlmIChkYXRhID09IExYVDEwMDBfMTAwME0pCisJCQkJbnAtPmxpbmVfc3BlZWQgPSAzOwkvKiAxMDAwTSAqLworCQkJZWxzZSBpZiAoZGF0YSA9PSBMWFQxMDAwXzEwME0pCisJCQkJbnAtPmxpbmVfc3BlZWQgPSAyOwkvKiAxMDBNICovCisJCQllbHNlCisJCQkJbnAtPmxpbmVfc3BlZWQgPSAxOwkvKiAxME0gKi8KKwkJfQorCQlucC0+Y3J2YWx1ZSAmPSAofkNSX1dfUFMxMCkgJiAofkNSX1dfRkQpICYgKH5DUl9XX1BTMTAwMCk7CisJCWlmIChucC0+bGluZV9zcGVlZCA9PSAxKQorCQkJbnAtPmNydmFsdWUgfD0gQ1JfV19QUzEwOworCQllbHNlIGlmIChucC0+bGluZV9zcGVlZCA9PSAzKQorCQkJbnAtPmNydmFsdWUgfD0gQ1JfV19QUzEwMDA7CisJCWlmIChucC0+ZHVwbGV4bW9kZSA9PSAyKQorCQkJbnAtPmNydmFsdWUgfD0gQ1JfV19GRDsKKwl9Cit9CisKKworLyogVGFrZSBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMgKi8KK3N0YXRpYyB2b2lkIGFsbG9jYXRlX3J4X2J1ZmZlcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qICBhbGxvY2F0ZSBza2IgZm9yIHJ4IGJ1ZmZlcnMgKi8KKwl3aGlsZSAobnAtPnJlYWxseV9yeF9jb3VudCAhPSBSWF9SSU5HX1NJWkUpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKG5wLT5yeF9idWZfc3opOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlicmVhazsJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZC4gKi8KKworCQl3aGlsZSAobnAtPmxhY2tfcnhidWYtPnNrYnVmZikKKwkJCW5wLT5sYWNrX3J4YnVmID0gbnAtPmxhY2tfcnhidWYtPm5leHRfZGVzY19sb2dpY2FsOworCisJCXNrYi0+ZGV2ID0gZGV2OwkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCW5wLT5sYWNrX3J4YnVmLT5za2J1ZmYgPSBza2I7CisJCW5wLT5sYWNrX3J4YnVmLT5idWZmZXIgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT50YWlsLAorCQkJbnAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJbnAtPmxhY2tfcnhidWYtPnN0YXR1cyA9IFJYT1dOOworCQkrK25wLT5yZWFsbHlfcnhfY291bnQ7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIG5ldGRldl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPm1lbTsKKwlpbnQgb2xkX2NydmFsdWUgPSBucC0+Y3J2YWx1ZTsKKwl1bnNpZ25lZCBpbnQgb2xkX2xpbmtvayA9IG5wLT5saW5rb2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNZWRpYSBzZWxlY3Rpb24gdGltZXIgdGljaywgc3RhdHVzICU4Ljh4ICIKKwkJICAgICAgICJjb25maWcgJTguOHguXG4iLCBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIElTUiksCisJCSAgICAgICBpb3JlYWQzMihpb2FkZHIgKyBUQ1JSQ1IpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOworCisJaWYgKG5wLT5mbGFncyA9PSBIQVNfTUlJX1hDVlIpIHsKKwkJZ2V0bGlua3N0YXR1cyhkZXYpOworCQlpZiAoKG9sZF9saW5rb2sgPT0gMCkgJiYgKG5wLT5saW5rb2sgPT0gMSkpIHsJLyogd2UgbmVlZCB0byBkZXRlY3QgdGhlIG1lZGlhIHR5cGUgYWdhaW4gKi8KKwkJCWdldGxpbmt0eXBlKGRldik7CisJCQlpZiAobnAtPmNydmFsdWUgIT0gb2xkX2NydmFsdWUpIHsKKwkJCQlzdG9wX25pY19yeHR4KGlvYWRkciwgbnAtPmNydmFsdWUpOworCQkJCWlvd3JpdGUzMihucC0+Y3J2YWx1ZSwgaW9hZGRyICsgVENSUkNSKTsKKwkJCX0KKwkJfQorCX0KKworCWFsbG9jYXRlX3J4X2J1ZmZlcnMoZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT5sb2NrLCBmbGFncyk7CisKKwlucC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCgxMCAqIEhaKTsKKwlhZGRfdGltZXIoJm5wLT50aW1lcik7Cit9CisKKworLyogVGFrZSBsb2NrIGJlZm9yZSBjYWxsaW5nICovCisvKiBSZXNldCBjaGlwIGFuZCBkaXNhYmxlIHJ4LCB0eCBhbmQgaW50ZXJydXB0cyAqLworc3RhdGljIHZvaWQgcmVzZXRfYW5kX2Rpc2FibGVfcnh0eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPm1lbTsKKwlpbnQgZGVsYXk9NTE7CisKKwkvKiBSZXNldCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisJc3RvcF9uaWNfcnh0eChpb2FkZHIsIDApOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlpb3dyaXRlMzIoMCwgaW9hZGRyICsgSU1SKTsKKworCS8qIFJlc2V0IHRoZSBjaGlwIHRvIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24uICovCisJaW93cml0ZTMyKDB4MDAwMDAwMDEsIGlvYWRkciArIEJDUik7CisKKwkvKiBVZWltb3I6IHdhaXQgZm9yIDUwIFBDSSBjeWNsZXMgKGFuZCBmbHVzaCBwb3N0ZWQgd3JpdGVzIGJ0dykuIAorCSAgIFdlIHN1cmVseSB3YWl0IHRvbyBsb25nIChhZGRyZXNzK2RhdGEgcGhhc2UpLiBXaG8gY2FyZXM/ICovCisJd2hpbGUgKC0tZGVsYXkpIHsKKwkJaW9yZWFkMzIoaW9hZGRyICsgQkNSKTsKKwkJcm1iKCk7CisJfQorfQorCisKKy8qIFRha2UgbG9jayBiZWZvcmUgY2FsbGluZyAqLworLyogUmVzdG9yZSBjaGlwIGFmdGVyIHJlc2V0ICovCitzdGF0aWMgdm9pZCBlbmFibGVfcnh0eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPm1lbTsKKworCXJlc2V0X3J4X2Rlc2NyaXB0b3JzKGRldik7CisKKwlpb3dyaXRlMzIobnAtPnR4X3JpbmdfZG1hICsgKChjaGFyKilucC0+Y3VyX3R4IC0gKGNoYXIqKW5wLT50eF9yaW5nKSwKKwkJaW9hZGRyICsgVFhMQkEpOworCWlvd3JpdGUzMihucC0+cnhfcmluZ19kbWEgKyAoKGNoYXIqKW5wLT5jdXJfcnggLSAoY2hhciopbnAtPnJ4X3JpbmcpLAorCQlpb2FkZHIgKyBSWExCQSk7CisKKwlpb3dyaXRlMzIobnAtPmJjcnZhbHVlLCBpb2FkZHIgKyBCQ1IpOworCisJaW93cml0ZTMyKDAsIGlvYWRkciArIFJYUERSKTsKKwlfX3NldF9yeF9tb2RlKGRldik7IC8qIGNoYW5nZXMgbnAtPmNydmFsdWUsIHdyaXRlcyBpdCBpbnRvIFRDUlJDUiAqLworCisJLyogQ2xlYXIgYW5kIEVuYWJsZSBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCWlvd3JpdGUzMihGQkUgfCBUVU5GIHwgQ05UT1ZGIHwgUkJVIHwgVEkgfCBSSSwgaW9hZGRyICsgSVNSKTsKKwlpb3dyaXRlMzIobnAtPmltcnZhbHVlLCBpb2FkZHIgKyBJTVIpOworCisJaW93cml0ZTMyKDAsIGlvYWRkciArIFRYUERSKTsKK30KKworCitzdGF0aWMgdm9pZCByZXNldF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVzZXR0aW5nIHR4IGFuZCByeCBtYWNoaW5lcnlcbiIsIGRldi0+bmFtZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKKwlucC0+Y3J2YWx1ZSA9IG5wLT5jcnZhbHVlX3N2OworCW5wLT5pbXJ2YWx1ZSA9IG5wLT5pbXJ2YWx1ZV9zdjsKKworCXJlc2V0X2FuZF9kaXNhYmxlX3J4dHgoZGV2KTsKKwkvKiB3b3JrcyBmb3IgbWUgd2l0aG91dCB0aGlzOgorCXJlc2V0X3R4X2Rlc2NyaXB0b3JzKGRldik7ICovCisJZW5hYmxlX3J4dHgoZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOyAvKiBGSVhNRTogb3IgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOyA/ICovCisJCQorCW5wLT5yZXNldF90aW1lcl9hcm1lZCA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5tZW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlOC44eCwiCisJICAgICAgICIgcmVzZXR0aW5nLi4uXG4iLCBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIElTUikpOworCisJeworCQlwcmludGsoS0VSTl9ERUJVRyAiICBSeCByaW5nICVwOiAiLCBucC0+cnhfcmluZyk7CisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykKKwkJCXByaW50aygiICU4Ljh4IiwgKHVuc2lnbmVkIGludCkgbnAtPnJ4X3JpbmdbaV0uc3RhdHVzKTsKKwkJcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAiICBUeCByaW5nICVwOiAiLCBucC0+dHhfcmluZyk7CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKKwkJCXByaW50aygiICU0LjR4IiwgbnAtPnR4X3JpbmdbaV0uc3RhdHVzKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKKworCXJlc2V0X2FuZF9kaXNhYmxlX3J4dHgoZGV2KTsKKwlyZXNldF90eF9kZXNjcmlwdG9ycyhkZXYpOworCWVuYWJsZV9yeHR4KGRldik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbnAtPnN0YXRzLnR4X2Vycm9ycysrOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsgLyogb3IgLi5fc3RhcnRfLi4gPz8gKi8KK30KKworCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQgaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwkvKiBpbml0aWFsaXplIHJ4IHZhcmlhYmxlcyAqLworCW5wLT5yeF9idWZfc3ogPSAoZGV2LT5tdHUgPD0gMTUwMCA/IFBLVF9CVUZfU1ogOiBkZXYtPm10dSArIDMyKTsKKwlucC0+Y3VyX3J4ID0gJm5wLT5yeF9yaW5nWzBdOworCW5wLT5sYWNrX3J4YnVmID0gbnAtPnJ4X3Jpbmc7CisJbnAtPnJlYWxseV9yeF9jb3VudCA9IDA7CisKKwkvKiBpbml0aWFsIHJ4IGRlc2NyaXB0b3JzLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlucC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOworCQlucC0+cnhfcmluZ1tpXS5jb250cm9sID0gbnAtPnJ4X2J1Zl9zeiA8PCBSQlNTaGlmdDsKKwkJbnAtPnJ4X3JpbmdbaV0ubmV4dF9kZXNjID0gbnAtPnJ4X3JpbmdfZG1hICsKKwkJCShpICsgMSkqc2l6ZW9mKHN0cnVjdCBmZWFsbnhfZGVzYyk7CisJCW5wLT5yeF9yaW5nW2ldLm5leHRfZGVzY19sb2dpY2FsID0gJm5wLT5yeF9yaW5nW2kgKyAxXTsKKwkJbnAtPnJ4X3JpbmdbaV0uc2tidWZmID0gTlVMTDsKKwl9CisKKwkvKiBmb3IgdGhlIGxhc3QgcnggZGVzY3JpcHRvciAqLworCW5wLT5yeF9yaW5nW2kgLSAxXS5uZXh0X2Rlc2MgPSBucC0+cnhfcmluZ19kbWE7CisJbnAtPnJ4X3JpbmdbaSAtIDFdLm5leHRfZGVzY19sb2dpY2FsID0gbnAtPnJ4X3Jpbmc7CisKKwkvKiBhbGxvY2F0ZSBza2IgZm9yIHJ4IGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IobnAtPnJ4X2J1Zl9zeik7CisKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlucC0+bGFja19yeGJ1ZiA9ICZucC0+cnhfcmluZ1tpXTsKKwkJCWJyZWFrOworCQl9CisKKwkJKytucC0+cmVhbGx5X3J4X2NvdW50OworCQlucC0+cnhfcmluZ1tpXS5za2J1ZmYgPSBza2I7CisJCXNrYi0+ZGV2ID0gZGV2OwkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCW5wLT5yeF9yaW5nW2ldLmJ1ZmZlciA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPnRhaWwsCisJCQlucC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlucC0+cnhfcmluZ1tpXS5zdGF0dXMgPSBSWE9XTjsKKwkJbnAtPnJ4X3JpbmdbaV0uY29udHJvbCB8PSBSWElDOworCX0KKworCS8qIGluaXRpYWxpemUgdHggdmFyaWFibGVzICovCisJbnAtPmN1cl90eCA9ICZucC0+dHhfcmluZ1swXTsKKwlucC0+Y3VyX3R4X2NvcHkgPSAmbnAtPnR4X3JpbmdbMF07CisJbnAtPnJlYWxseV90eF9jb3VudCA9IDA7CisJbnAtPmZyZWVfdHhfY291bnQgPSBUWF9SSU5HX1NJWkU7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJbnAtPnR4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwkJLyogZG8gd2UgbmVlZCBucC0+dHhfcmluZ1tpXS5jb250cm9sID0gWFhYOyA/PyAqLworCQlucC0+dHhfcmluZ1tpXS5uZXh0X2Rlc2MgPSBucC0+dHhfcmluZ19kbWEgKworCQkJKGkgKyAxKSpzaXplb2Yoc3RydWN0IGZlYWxueF9kZXNjKTsKKwkJbnAtPnR4X3JpbmdbaV0ubmV4dF9kZXNjX2xvZ2ljYWwgPSAmbnAtPnR4X3JpbmdbaSArIDFdOworCQlucC0+dHhfcmluZ1tpXS5za2J1ZmYgPSBOVUxMOworCX0KKworCS8qIGZvciB0aGUgbGFzdCB0eCBkZXNjcmlwdG9yICovCisJbnAtPnR4X3JpbmdbaSAtIDFdLm5leHRfZGVzYyA9IG5wLT50eF9yaW5nX2RtYTsKKwlucC0+dHhfcmluZ1tpIC0gMV0ubmV4dF9kZXNjX2xvZ2ljYWwgPSAmbnAtPnR4X3JpbmdbMF07Cit9CisKKworc3RhdGljIGludCBzdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKKworCW5wLT5jdXJfdHhfY29weS0+c2tidWZmID0gc2tiOworCisjZGVmaW5lIG9uZV9idWZmZXIKKyNkZWZpbmUgQlBUIDEwMjIKKyNpZiBkZWZpbmVkKG9uZV9idWZmZXIpCisJbnAtPmN1cl90eF9jb3B5LT5idWZmZXIgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT5kYXRhLAorCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJbnAtPmN1cl90eF9jb3B5LT5jb250cm9sID0gVFhJQyB8IFRYTEQgfCBUWEZEIHwgQ1JDRW5hYmxlIHwgUEFERW5hYmxlOworCW5wLT5jdXJfdHhfY29weS0+Y29udHJvbCB8PSAoc2tiLT5sZW4gPDwgUEtUU1NoaWZ0KTsJLyogcGt0IHNpemUgKi8KKwlucC0+Y3VyX3R4X2NvcHktPmNvbnRyb2wgfD0gKHNrYi0+bGVuIDw8IFRCU1NoaWZ0KTsJLyogYnVmZmVyIHNpemUgKi8KKy8vIDg5LzEyLzI5IGFkZCwKKwlpZiAobnAtPnBjaV9kZXYtPmRldmljZSA9PSAweDg5MSkKKwkJbnAtPmN1cl90eF9jb3B5LT5jb250cm9sIHw9IEVUSUNvbnRyb2wgfCBSZXRyeVR4TEM7CisJbnAtPmN1cl90eF9jb3B5LT5zdGF0dXMgPSBUWE9XTjsKKwlucC0+Y3VyX3R4X2NvcHkgPSBucC0+Y3VyX3R4X2NvcHktPm5leHRfZGVzY19sb2dpY2FsOworCS0tbnAtPmZyZWVfdHhfY291bnQ7CisjZWxpZiBkZWZpbmVkKHR3b19idWZmZXIpCisJaWYgKHNrYi0+bGVuID4gQlBUKSB7CisJCXN0cnVjdCBmZWFsbnhfZGVzYyAqbmV4dDsKKworCQkvKiBmb3IgdGhlIGZpcnN0IGRlc2NyaXB0b3IgKi8KKwkJbnAtPmN1cl90eF9jb3B5LT5idWZmZXIgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT5kYXRhLAorCQkJQlBULCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJbnAtPmN1cl90eF9jb3B5LT5jb250cm9sID0gVFhJQyB8IFRYRkQgfCBDUkNFbmFibGUgfCBQQURFbmFibGU7CisJCW5wLT5jdXJfdHhfY29weS0+Y29udHJvbCB8PSAoc2tiLT5sZW4gPDwgUEtUU1NoaWZ0KTsJLyogcGt0IHNpemUgKi8KKwkJbnAtPmN1cl90eF9jb3B5LT5jb250cm9sIHw9IChCUFQgPDwgVEJTU2hpZnQpOwkvKiBidWZmZXIgc2l6ZSAqLworCisJCS8qIGZvciB0aGUgbGFzdCBkZXNjcmlwdG9yICovCisJCW5leHQgPSBucC0+Y3VyX3R4X2NvcHktPm5leHRfZGVzY19sb2dpY2FsOworCQluZXh0LT5za2J1ZmYgPSBza2I7CisJCW5leHQtPmNvbnRyb2wgPSBUWElDIHwgVFhMRCB8IENSQ0VuYWJsZSB8IFBBREVuYWJsZTsKKwkJbmV4dC0+Y29udHJvbCB8PSAoc2tiLT5sZW4gPDwgUEtUU1NoaWZ0KTsJLyogcGt0IHNpemUgKi8KKwkJbmV4dC0+Y29udHJvbCB8PSAoKHNrYi0+bGVuIC0gQlBUKSA8PCBUQlNTaGlmdCk7CS8qIGJ1ZiBzaXplICovCisvLyA4OS8xMi8yOSBhZGQsCisJCWlmIChucC0+cGNpX2Rldi0+ZGV2aWNlID09IDB4ODkxKQorCQkJbnAtPmN1cl90eF9jb3B5LT5jb250cm9sIHw9IEVUSUNvbnRyb2wgfCBSZXRyeVR4TEM7CisJCW5leHQtPmJ1ZmZlciA9IHBjaV9tYXBfc2luZ2xlKGVwLT5wY2lfZGV2LCBza2ItPmRhdGEgKyBCUFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+bGVuIC0gQlBULCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQluZXh0LT5zdGF0dXMgPSBUWE9XTjsKKwkJbnAtPmN1cl90eF9jb3B5LT5zdGF0dXMgPSBUWE9XTjsKKworCQlucC0+Y3VyX3R4X2NvcHkgPSBuZXh0LT5uZXh0X2Rlc2NfbG9naWNhbDsKKwkJbnAtPmZyZWVfdHhfY291bnQgLT0gMjsKKwl9IGVsc2UgeworCQlucC0+Y3VyX3R4X2NvcHktPmJ1ZmZlciA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEsCisJCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCW5wLT5jdXJfdHhfY29weS0+Y29udHJvbCA9IFRYSUMgfCBUWExEIHwgVFhGRCB8IENSQ0VuYWJsZSB8IFBBREVuYWJsZTsKKwkJbnAtPmN1cl90eF9jb3B5LT5jb250cm9sIHw9IChza2ItPmxlbiA8PCBQS1RTU2hpZnQpOwkvKiBwa3Qgc2l6ZSAqLworCQlucC0+Y3VyX3R4X2NvcHktPmNvbnRyb2wgfD0gKHNrYi0+bGVuIDw8IFRCU1NoaWZ0KTsJLyogYnVmZmVyIHNpemUgKi8KKy8vIDg5LzEyLzI5IGFkZCwKKwkJaWYgKG5wLT5wY2lfZGV2LT5kZXZpY2UgPT0gMHg4OTEpCisJCQlucC0+Y3VyX3R4X2NvcHktPmNvbnRyb2wgfD0gRVRJQ29udHJvbCB8IFJldHJ5VHhMQzsKKwkJbnAtPmN1cl90eF9jb3B5LT5zdGF0dXMgPSBUWE9XTjsKKwkJbnAtPmN1cl90eF9jb3B5ID0gbnAtPmN1cl90eF9jb3B5LT5uZXh0X2Rlc2NfbG9naWNhbDsKKwkJLS1ucC0+ZnJlZV90eF9jb3VudDsKKwl9CisjZW5kaWYKKworCWlmIChucC0+ZnJlZV90eF9jb3VudCA8IDIpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkrK25wLT5yZWFsbHlfdHhfY291bnQ7CisJaW93cml0ZTMyKDAsIG5wLT5tZW0gKyBUWFBEUik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisKKy8qIFRha2UgbG9jayBiZWZvcmUgY2FsbGluZyAqLworLyogQ2hpcCBwcm9iYWJseSBob3NlZCB0eCByaW5nLiBDbGVhbiB1cC4gKi8KK3N0YXRpYyB2b2lkIHJlc2V0X3R4X2Rlc2NyaXB0b3JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGZlYWxueF9kZXNjICpjdXI7CisJaW50IGk7CisKKwkvKiBpbml0aWFsaXplIHR4IHZhcmlhYmxlcyAqLworCW5wLT5jdXJfdHggPSAmbnAtPnR4X3JpbmdbMF07CisJbnAtPmN1cl90eF9jb3B5ID0gJm5wLT50eF9yaW5nWzBdOworCW5wLT5yZWFsbHlfdHhfY291bnQgPSAwOworCW5wLT5mcmVlX3R4X2NvdW50ID0gVFhfUklOR19TSVpFOworCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWN1ciA9ICZucC0+dHhfcmluZ1tpXTsKKwkJaWYgKGN1ci0+c2tidWZmKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBjdXItPmJ1ZmZlciwKKwkJCQljdXItPnNrYnVmZi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IoY3VyLT5za2J1ZmYpOworCQkJLyogb3IgZGV2X2tmcmVlX3NrYl9pcnEoY3VyLT5za2J1ZmYpOyA/ICovCisJCQljdXItPnNrYnVmZiA9IE5VTEw7CisJCX0KKwkJY3VyLT5zdGF0dXMgPSAwOworCQljdXItPmNvbnRyb2wgPSAwOwkvKiBuZWVkZWQ/ICovCisJCS8qIHByb2JhYmx5IG5vdCBuZWVkZWQuIFdlIGRvIGl0IGZvciBwdXJlbHkgcGFyYW5vaWQgcmVhc29ucyAqLworCQljdXItPm5leHRfZGVzYyA9IG5wLT50eF9yaW5nX2RtYSArCisJCQkoaSArIDEpKnNpemVvZihzdHJ1Y3QgZmVhbG54X2Rlc2MpOworCQljdXItPm5leHRfZGVzY19sb2dpY2FsID0gJm5wLT50eF9yaW5nW2kgKyAxXTsKKwl9CisJLyogZm9yIHRoZSBsYXN0IHR4IGRlc2NyaXB0b3IgKi8KKwlucC0+dHhfcmluZ1tUWF9SSU5HX1NJWkUgLSAxXS5uZXh0X2Rlc2MgPSBucC0+dHhfcmluZ19kbWE7CisJbnAtPnR4X3JpbmdbVFhfUklOR19TSVpFIC0gMV0ubmV4dF9kZXNjX2xvZ2ljYWwgPSAmbnAtPnR4X3JpbmdbMF07Cit9CisKKworLyogVGFrZSBsb2NrIGFuZCBzdG9wIHJ4IGJlZm9yZSBjYWxsaW5nIHRoaXMgKi8KK3N0YXRpYyB2b2lkIHJlc2V0X3J4X2Rlc2NyaXB0b3JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGZlYWxueF9kZXNjICpjdXIgPSBucC0+Y3VyX3J4OworCWludCBpOworCisJYWxsb2NhdGVfcnhfYnVmZmVycyhkZXYpOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChjdXItPnNrYnVmZikKKwkJCWN1ci0+c3RhdHVzID0gUlhPV047CisJCWN1ciA9IGN1ci0+bmV4dF9kZXNjX2xvZ2ljYWw7CisJfQorCisJaW93cml0ZTMyKG5wLT5yeF9yaW5nX2RtYSArICgoY2hhciopbnAtPmN1cl9yeCAtIChjaGFyKilucC0+cnhfcmluZyksCisJCW5wLT5tZW0gKyBSWExCQSk7Cit9CisKKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworc3RhdGljIGlycXJldHVybl90IGludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+bWVtOworCWxvbmcgYm9ndXNjbnQgPSBtYXhfaW50ZXJydXB0X3dvcms7CisJdW5zaWduZWQgaW50IG51bV90eCA9IDA7CisJaW50IGhhbmRsZWQgPSAwOworCisJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisKKwlpb3dyaXRlMzIoMCwgaW9hZGRyICsgSU1SKTsKKworCWRvIHsKKwkJdTMyIGludHJfc3RhdHVzID0gaW9yZWFkMzIoaW9hZGRyICsgSVNSKTsKKworCQkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKwkJaW93cml0ZTMyKGludHJfc3RhdHVzLCBpb2FkZHIgKyBJU1IpOworCisJCWlmIChkZWJ1ZykKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogSW50ZXJydXB0LCBzdGF0dXMgJTQuNHguXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgaW50cl9zdGF0dXMpOworCisJCWlmICghKGludHJfc3RhdHVzICYgbnAtPmltcnZhbHVlKSkKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisvLyA5MC8xLzE2IGRlbGV0ZSwKKy8vCisvLyAgICAgIGlmIChpbnRyX3N0YXR1cyAmIEZCRSkKKy8vICAgICAgeyAgIC8qIGZhdGFsIGVycm9yICovCisvLyAgICAgICAgICBzdG9wX25pY190eChpb2FkZHIsIDApOworLy8gICAgICAgICAgc3RvcF9uaWNfcngoaW9hZGRyLCAwKTsKKy8vICAgICAgICAgIGJyZWFrOworLy8gICAgICB9OworCisJCWlmIChpbnRyX3N0YXR1cyAmIFRVTkYpCisJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgVFhQRFIpOworCisJCWlmIChpbnRyX3N0YXR1cyAmIENOVE9WRikgeworCQkJLyogbWlzc2VkIHBrdHMgKi8KKwkJCW5wLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlvcmVhZDMyKGlvYWRkciArIFRBTExZKSAmIDB4N2ZmZjsKKworCQkJLyogY3JjIGVycm9yICovCisJCQlucC0+c3RhdHMucnhfY3JjX2Vycm9ycyArPQorCQkJICAgIChpb3JlYWQzMihpb2FkZHIgKyBUQUxMWSkgJiAweDdmZmYwMDAwKSA+PiAxNjsKKwkJfQorCisJCWlmIChpbnRyX3N0YXR1cyAmIChSSSB8IFJCVSkpIHsKKwkJCWlmIChpbnRyX3N0YXR1cyAmIFJJKQorCQkJCW5ldGRldl9yeChkZXYpOworCQkJZWxzZSB7CisJCQkJc3RvcF9uaWNfcngoaW9hZGRyLCBucC0+Y3J2YWx1ZSk7CisJCQkJcmVzZXRfcnhfZGVzY3JpcHRvcnMoZGV2KTsKKwkJCQlpb3dyaXRlMzIobnAtPmNydmFsdWUsIGlvYWRkciArIFRDUlJDUik7CisJCQl9CQkJCQorCQl9CisKKwkJd2hpbGUgKG5wLT5yZWFsbHlfdHhfY291bnQpIHsKKwkJCWxvbmcgdHhfc3RhdHVzID0gbnAtPmN1cl90eC0+c3RhdHVzOworCQkJbG9uZyB0eF9jb250cm9sID0gbnAtPmN1cl90eC0+Y29udHJvbDsKKworCQkJaWYgKCEodHhfY29udHJvbCAmIFRYTEQpKSB7CS8qIHRoaXMgcGt0IGlzIGNvbWJpbmVkIGJ5IHR3byB0eCBkZXNjcmlwdG9ycyAqLworCQkJCXN0cnVjdCBmZWFsbnhfZGVzYyAqbmV4dDsKKworCQkJCW5leHQgPSBucC0+Y3VyX3R4LT5uZXh0X2Rlc2NfbG9naWNhbDsKKwkJCQl0eF9zdGF0dXMgPSBuZXh0LT5zdGF0dXM7CisJCQkJdHhfY29udHJvbCA9IG5leHQtPmNvbnRyb2w7CisJCQl9CisKKwkJCWlmICh0eF9zdGF0dXMgJiBUWE9XTikKKwkJCQlicmVhazsKKworCQkJaWYgKCEobnAtPmNydmFsdWUgJiBDUl9XX0VOSCkpIHsKKwkJCQlpZiAodHhfc3RhdHVzICYgKENTTCB8IExDIHwgRUMgfCBVREYgfCBIRikpIHsKKwkJCQkJbnAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCQlpZiAodHhfc3RhdHVzICYgRUMpCisJCQkJCQlucC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJaWYgKHR4X3N0YXR1cyAmIENTTCkKKwkJCQkJCW5wLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCQlpZiAodHhfc3RhdHVzICYgTEMpCisJCQkJCQlucC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJCQlpZiAodHhfc3RhdHVzICYgVURGKQorCQkJCQkJbnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJCWlmICgodHhfc3RhdHVzICYgSEYpICYmIG5wLT5taWkuZnVsbF9kdXBsZXggPT0gMCkKKwkJCQkJCW5wLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisKKwkJCQl9IGVsc2UgeworCQkJCQlucC0+c3RhdHMudHhfYnl0ZXMgKz0KKwkJCQkJICAgICgodHhfY29udHJvbCAmIFBLVFNNYXNrKSA+PiBQS1RTU2hpZnQpOworCisJCQkJCW5wLT5zdGF0cy5jb2xsaXNpb25zICs9CisJCQkJCSAgICAoKHR4X3N0YXR1cyAmIE5DUk1hc2spID4+IE5DUlNoaWZ0KTsKKwkJCQkJbnAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW5wLT5zdGF0cy50eF9ieXRlcyArPQorCQkJCSAgICAoKHR4X2NvbnRyb2wgJiBQS1RTTWFzaykgPj4gUEtUU1NoaWZ0KTsKKwkJCQlucC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJfQorCisJCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBucC0+Y3VyX3R4LT5idWZmZXIsCisJCQkJbnAtPmN1cl90eC0+c2tidWZmLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9pcnEobnAtPmN1cl90eC0+c2tidWZmKTsKKwkJCW5wLT5jdXJfdHgtPnNrYnVmZiA9IE5VTEw7CisJCQktLW5wLT5yZWFsbHlfdHhfY291bnQ7CisJCQlpZiAobnAtPmN1cl90eC0+Y29udHJvbCAmIFRYTEQpIHsKKwkJCQlucC0+Y3VyX3R4ID0gbnAtPmN1cl90eC0+bmV4dF9kZXNjX2xvZ2ljYWw7CisJCQkJKytucC0+ZnJlZV90eF9jb3VudDsKKwkJCX0gZWxzZSB7CisJCQkJbnAtPmN1cl90eCA9IG5wLT5jdXJfdHgtPm5leHRfZGVzY19sb2dpY2FsOworCQkJCW5wLT5jdXJfdHggPSBucC0+Y3VyX3R4LT5uZXh0X2Rlc2NfbG9naWNhbDsKKwkJCQlucC0+ZnJlZV90eF9jb3VudCArPSAyOworCQkJfQorCQkJbnVtX3R4Kys7CisJCX0JCS8qIGVuZCBvZiBmb3IgbG9vcCAqLworCQkKKwkJaWYgKG51bV90eCAmJiBucC0+ZnJlZV90eF9jb3VudCA+PSAyKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJCS8qIHJlYWQgdHJhbnNtaXQgc3RhdHVzIGZvciBlbmhhbmNlZCBtb2RlIG9ubHkgKi8KKwkJaWYgKG5wLT5jcnZhbHVlICYgQ1JfV19FTkgpIHsKKwkJCWxvbmcgZGF0YTsKKworCQkJZGF0YSA9IGlvcmVhZDMyKGlvYWRkciArIFRTUik7CisJCQlucC0+c3RhdHMudHhfZXJyb3JzICs9IChkYXRhICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisJCQlucC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgKz0gKGRhdGEgJiAweGZmMDAwMDAwKSA+PiAyNDsKKwkJCW5wLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzICs9IChkYXRhICYgMHgwMGZmMDAwMCkgPj4gMTY7CisJCQlucC0+c3RhdHMuY29sbGlzaW9ucyArPSAoZGF0YSAmIDB4MDAwMGZmZmYpOworCQl9CisKKwkJaWYgKC0tYm9ndXNjbnQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIG11Y2ggd29yayBhdCBpbnRlcnJ1cHQsICIKKwkJCSAgICAgICAic3RhdHVzPTB4JTQuNHguXG4iLCBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKwkJCWlmICghbnAtPnJlc2V0X3RpbWVyX2FybWVkKSB7CisJCQkJbnAtPnJlc2V0X3RpbWVyX2FybWVkID0gMTsKKwkJCQlucC0+cmVzZXRfdGltZXIuZXhwaXJlcyA9IFJVTl9BVChIWi8yKTsKKwkJCQlhZGRfdGltZXIoJm5wLT5yZXNldF90aW1lcik7CisJCQkJc3RvcF9uaWNfcnh0eChpb2FkZHIsIDApOworCQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCQkvKiBvciBuZXRpZl90eF9kaXNhYmxlKGRldik7ID8/ICovCisJCQkJLyogUHJldmVudCBvdGhlciBwYXRocyBmcm9tIGVuYWJsaW5nIHR4LHJ4LGludHJzICovCisJCQkJbnAtPmNydmFsdWVfc3YgPSBucC0+Y3J2YWx1ZTsKKwkJCQlucC0+aW1ydmFsdWVfc3YgPSBucC0+aW1ydmFsdWU7CisJCQkJbnAtPmNydmFsdWUgJj0gfihDUl9XX1RYRU4gfCBDUl9XX1JYRU4pOyAvKiBvciBzaW1wbHkgPSAwPyAqLworCQkJCW5wLT5pbXJ2YWx1ZSA9IDA7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwkvKiByZWFkIHRoZSB0YWxseSBjb3VudGVycyAqLworCS8qIG1pc3NlZCBwa3RzICovCisJbnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW9yZWFkMzIoaW9hZGRyICsgVEFMTFkpICYgMHg3ZmZmOworCisJLyogY3JjIGVycm9yICovCisJbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gKGlvcmVhZDMyKGlvYWRkciArIFRBTExZKSAmIDB4N2ZmZjAwMDApID4+IDE2OworCisJaWYgKGRlYnVnKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBzdGF0dXM9JSM0LjR4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgSVNSKSk7CisKKwlpb3dyaXRlMzIobnAtPmltcnZhbHVlLCBpb2FkZHIgKyBJTVIpOworCisJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKKy8qIFRoaXMgcm91dGluZSBpcyBsb2dpY2FsbHkgcGFydCBvZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIGJ1dCBzZXBhcmF0ZWQKKyAgIGZvciBjbGFyaXR5IGFuZCBiZXR0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbi4gKi8KK3N0YXRpYyBpbnQgbmV0ZGV2X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+bWVtOworCisJLyogSWYgRU9QIGlzIHNldCBvbiB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKCEobnAtPmN1cl9yeC0+c3RhdHVzICYgUlhPV04pICYmIG5wLT5jdXJfcngtPnNrYnVmZikgeworCQlzMzIgcnhfc3RhdHVzID0gbnAtPmN1cl9yeC0+c3RhdHVzOworCisJCWlmIChucC0+cmVhbGx5X3J4X2NvdW50ID09IDApCisJCQlicmVhazsKKworCQlpZiAoZGVidWcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiICBuZXRkZXZfcngoKSBzdGF0dXMgd2FzICU4Ljh4LlxuIiwgcnhfc3RhdHVzKTsKKworCQlpZiAoKCEoKHJ4X3N0YXR1cyAmIFJYRlNEKSAmJiAocnhfc3RhdHVzICYgUlhMU0QpKSkKKwkJICAgIHx8IChyeF9zdGF0dXMgJiBFcnJvclN1bW1hcnkpKSB7CisJCQlpZiAocnhfc3RhdHVzICYgRXJyb3JTdW1tYXJ5KSB7CS8qIHRoZXJlIHdhcyBhIGZhdGFsIGVycm9yICovCisJCQkJaWYgKGRlYnVnKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCQkgICAgICAgIiVzOiBSZWNlaXZlIGVycm9yLCBSeCBzdGF0dXMgJTguOHguXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lLCByeF9zdGF0dXMpOworCisJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOwkvKiBlbmQgb2YgYSBwYWNrZXQuICovCisJCQkJaWYgKHJ4X3N0YXR1cyAmIChMT05HIHwgUlVOVCkpCisJCQkJCW5wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJaWYgKHJ4X3N0YXR1cyAmIFJYRVIpCisJCQkJCW5wLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlpZiAocnhfc3RhdHVzICYgQ1JDKQorCQkJCQlucC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgbmVlZF90b19yZXNldCA9IDA7CisJCQkJaW50IGRlc25vID0gMDsKKworCQkJCWlmIChyeF9zdGF0dXMgJiBSWEZTRCkgewkvKiB0aGlzIHBrdCBpcyB0b28gbG9uZywgb3ZlciBvbmUgcnggYnVmZmVyICovCisJCQkJCXN0cnVjdCBmZWFsbnhfZGVzYyAqY3VyOworCisJCQkJCS8qIGNoZWNrIHRoaXMgcGFja2V0IGlzIHJlY2VpdmVkIGNvbXBsZXRlbHk/ICovCisJCQkJCWN1ciA9IG5wLT5jdXJfcng7CisJCQkJCXdoaWxlIChkZXNubyA8PSBucC0+cmVhbGx5X3J4X2NvdW50KSB7CisJCQkJCQkrK2Rlc25vOworCQkJCQkJaWYgKCghKGN1ci0+c3RhdHVzICYgUlhPV04pKQorCQkJCQkJICAgICYmIChjdXItPnN0YXR1cyAmIFJYTFNEKSkKKwkJCQkJCQlicmVhazsKKwkJCQkJCS8qIGdvdG8gbmV4dCByeCBkZXNjcmlwdG9yICovCisJCQkJCQljdXIgPSBjdXItPm5leHRfZGVzY19sb2dpY2FsOworCQkJCQl9CisJCQkJCWlmIChkZXNubyA+IG5wLT5yZWFsbHlfcnhfY291bnQpCisJCQkJCQluZWVkX3RvX3Jlc2V0ID0gMTsKKwkJCQl9IGVsc2UJLyogUlhMU0QgZGlkIG5vdCBmaW5kLCBzb21ldGhpbmcgZXJyb3IgKi8KKwkJCQkJbmVlZF90b19yZXNldCA9IDE7CisKKwkJCQlpZiAobmVlZF90b19yZXNldCA9PSAwKSB7CisJCQkJCWludCBpOworCisJCQkJCW5wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisKKwkJCQkJLyogZnJlZSBhbGwgcnggZGVzY3JpcHRvcnMgcmVsYXRlZCB0aGlzIGxvbmcgcGt0ICovCisJCQkJCWZvciAoaSA9IDA7IGkgPCBkZXNubzsgKytpKSB7CisJCQkJCQlpZiAoIW5wLT5jdXJfcngtPnNrYnVmZikgeworCQkJCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJCQkJCSIlczogSSdtIHNjYXJlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCW5wLT5jdXJfcngtPnN0YXR1cyA9IFJYT1dOOworCQkJCQkJbnAtPmN1cl9yeCA9IG5wLT5jdXJfcngtPm5leHRfZGVzY19sb2dpY2FsOworCQkJCQl9CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSB7ICAgICAgICAvKiByeCBlcnJvciwgbmVlZCB0byByZXNldCB0aGlzIGNoaXAgKi8KKwkJCQkJc3RvcF9uaWNfcngoaW9hZGRyLCBucC0+Y3J2YWx1ZSk7CisJCQkJCXJlc2V0X3J4X2Rlc2NyaXB0b3JzKGRldik7CisJCQkJCWlvd3JpdGUzMihucC0+Y3J2YWx1ZSwgaW9hZGRyICsgVENSUkNSKTsKKwkJCQl9CisJCQkJYnJlYWs7CS8qIGV4aXQgdGhlIHdoaWxlIGxvb3AgKi8KKwkJCX0KKwkJfSBlbHNlIHsJLyogdGhpcyByZWNlaXZlZCBwa3QgaXMgb2sgKi8KKworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCS8qIE9taXQgdGhlIGZvdXIgb2N0ZXQgQ1JDIGZyb20gdGhlIGxlbmd0aC4gKi8KKwkJCXNob3J0IHBrdF9sZW4gPSAoKHJ4X3N0YXR1cyAmIEZMTkdNQVNLKSA+PiBGTE5HU2hpZnQpIC0gNDsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQlpZiAoZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbmV0ZGV2X3J4KCkgbm9ybWFsIFJ4IHBrdCBsZW5ndGggJWQiCisJCQkJICAgICAgICIgc3RhdHVzICV4LlxuIiwgcGt0X2xlbiwgcnhfc3RhdHVzKTsKKyNlbmRpZgorCisJCQkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGxvbmcgZW5vdWdoIHRvIGFjY2VwdCB3aXRob3V0IGNvcHlpbmcKKwkJCSAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KKwkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrICYmCisJCQkgICAgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KG5wLT5wY2lfZGV2LAorCQkJCQkJCSAgICBucC0+Y3VyX3J4LT5idWZmZXIsCisJCQkJCQkJICAgIG5wLT5yeF9idWZfc3osCisJCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJLyogQ2FsbCBjb3B5ICsgY2tzdW0gaWYgYXZhaWxhYmxlLiAqLworCisjaWYgISBkZWZpbmVkKF9fYWxwaGFfXykKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgCisJCQkJCW5wLT5jdXJfcngtPnNrYnVmZi0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworI2Vsc2UKKwkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCQlucC0+Y3VyX3J4LT5za2J1ZmYtPnRhaWwsIHBrdF9sZW4pOworI2VuZGlmCisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5wLT5wY2lfZGV2LAorCQkJCQkJCSAgICAgICBucC0+Y3VyX3J4LT5idWZmZXIsCisJCQkJCQkJICAgICAgIG5wLT5yeF9idWZfc3osCisJCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQl9IGVsc2UgeworCQkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsCisJCQkJCQkgbnAtPmN1cl9yeC0+YnVmZmVyLAorCQkJCQkJIG5wLT5yeF9idWZfc3osCisJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlza2JfcHV0KHNrYiA9IG5wLT5jdXJfcngtPnNrYnVmZiwgcGt0X2xlbik7CisJCQkJbnAtPmN1cl9yeC0+c2tidWZmID0gTlVMTDsKKwkJCQktLW5wLT5yZWFsbHlfcnhfY291bnQ7CisJCQl9CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlucC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJbnAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0KKworCQlucC0+Y3VyX3J4ID0gbnAtPmN1cl9yeC0+bmV4dF9kZXNjX2xvZ2ljYWw7CisJfQkJCS8qIGVuZCBvZiB3aGlsZSBsb29wICovCisKKwkvKiAgYWxsb2NhdGUgc2tiIGZvciByeCBidWZmZXJzICovCisJYWxsb2NhdGVfcnhfYnVmZmVycyhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5tZW07CisKKwkvKiBUaGUgY2hpcCBvbmx5IG5lZWQgcmVwb3J0IGZyYW1lIHNpbGVudGx5IGRyb3BwZWQuICovCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlucC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpb3JlYWQzMihpb2FkZHIgKyBUQUxMWSkgJiAweDdmZmY7CisJCW5wLT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9IChpb3JlYWQzMihpb2FkZHIgKyBUQUxMWSkgJiAweDdmZmYwMDAwKSA+PiAxNjsKKwl9CisKKwlyZXR1cm4gJm5wLT5zdGF0czsKK30KKworCisvKiBmb3IgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgKi8KK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3BpbmxvY2tfdCAqbHAgPSAmKChzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+bG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKGxwLCBmbGFncyk7CisJX19zZXRfcnhfbW9kZShkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobHAsIGZsYWdzKTsKK30KKworCisvKiBUYWtlIGxvY2sgYmVmb3JlIGNhbGxpbmcgKi8KK3N0YXRpYyB2b2lkIF9fc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5tZW07CisJdTMyIG1jX2ZpbHRlclsyXTsJLyogTXVsdGljYXN0IGhhc2ggZmlsdGVyICovCisJdTMyIHJ4X21vZGU7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CS8qIFNldCBwcm9taXNjdW91cy4gKi8KKwkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJbWVtc2V0KG1jX2ZpbHRlciwgMHhmZiwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlyeF9tb2RlID0gQ1JfV19QUk9NIHwgQ1JfV19BQiB8IENSX1dfQU07CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpCisJCSAgIHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBtYXRjaCwgb3IgYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQltZW1zZXQobWNfZmlsdGVyLCAweGZmLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCXJ4X21vZGUgPSBDUl9XX0FCIHwgQ1JfV19BTTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJaW50IGk7CisKKwkJbWVtc2V0KG1jX2ZpbHRlciwgMCwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsKKwkJICAgICBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJdW5zaWduZWQgaW50IGJpdDsKKwkJCWJpdCA9IChldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDI2KSBeIDB4M0Y7CisJCQltY19maWx0ZXJbYml0ID4+IDVdIHw9ICgxIDw8IGJpdCk7CisJCX0KKwkJcnhfbW9kZSA9IENSX1dfQUIgfCBDUl9XX0FNOworCX0KKworCXN0b3BfbmljX3J4dHgoaW9hZGRyLCBucC0+Y3J2YWx1ZSk7CisKKwlpb3dyaXRlMzIobWNfZmlsdGVyWzBdLCBpb2FkZHIgKyBNQVIwKTsKKwlpb3dyaXRlMzIobWNfZmlsdGVyWzFdLCBpb2FkZHIgKyBNQVIxKTsKKwlucC0+Y3J2YWx1ZSAmPSB+Q1JfV19SWE1PREVNQVNLOworCW5wLT5jcnZhbHVlIHw9IHJ4X21vZGU7CisJaW93cml0ZTMyKG5wLT5jcnZhbHVlLCBpb2FkZHIgKyBUQ1JSQ1IpOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKK30KKworc3RhdGljIGludCBuZXRkZXZfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByYzsKKworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyYyA9IG1paV9ldGh0b29sX2dzZXQoJm5wLT5taWksIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZGV2X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJcmMgPSBtaWlfZXRodG9vbF9zc2V0KCZucC0+bWlpLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG5ldGRldl9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIG1paV9ud2F5X3Jlc3RhcnQoJm5wLT5taWkpOworfQorCitzdGF0aWMgdTMyIG5ldGRldl9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBtaWlfbGlua19vaygmbnAtPm1paSk7Cit9CisKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBkZWJ1ZzsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCit7CisJZGVidWcgPSB2YWx1ZTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKKwkuZ2V0X3NldHRpbmdzCQk9IG5ldGRldl9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBuZXRkZXZfc2V0X3NldHRpbmdzLAorCS5ud2F5X3Jlc2V0CQk9IG5ldGRldl9ud2F5X3Jlc2V0LAorCS5nZXRfbGluawkJPSBuZXRkZXZfZ2V0X2xpbmssCisJLmdldF9tc2dsZXZlbAkJPSBuZXRkZXZfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X3NldF9tc2dsZXZlbCwKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKKwkuZ2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKK307CisKK3N0YXRpYyBpbnQgbWlpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJm5wLT5taWksIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGludCBuZXRkZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5tZW07CisJaW50IGk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCWlvd3JpdGUzMigweDAwMDAsIGlvYWRkciArIElNUik7CisKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKwlzdG9wX25pY19yeHR4KGlvYWRkciwgMCk7CisKKwlkZWxfdGltZXJfc3luYygmbnAtPnRpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmbnAtPnJlc2V0X3RpbWVyKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJLyogRnJlZSBhbGwgdGhlIHNrYnVmZnMgaW4gdGhlIFJ4IHF1ZXVlLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbnAtPnJ4X3JpbmdbaV0uc2tidWZmOworCisJCW5wLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIG5wLT5yeF9yaW5nW2ldLmJ1ZmZlciwKKwkJCQlucC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJbnAtPnJ4X3JpbmdbaV0uc2tidWZmID0gTlVMTDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbnAtPnR4X3JpbmdbaV0uc2tidWZmOworCisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIG5wLT50eF9yaW5nW2ldLmJ1ZmZlciwKKwkJCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlucC0+dHhfcmluZ1tpXS5za2J1ZmYgPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBmZWFsbnhfcGNpX3RibFtdID0geworCXsweDE1MTYsIDB4MDgwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJezB4MTUxNiwgMHgwODAzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxfSwKKwl7MHgxNTE2LCAweDA4OTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDJ9LAorCXt9IC8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGZlYWxueF9wY2lfdGJsKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZmVhbG54X2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZmVhbG54IiwKKwkuaWRfdGFibGUJPSBmZWFsbnhfcGNpX3RibCwKKwkucHJvYmUJCT0gZmVhbG54X2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZmVhbG54X3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZmVhbG54X2luaXQodm9pZCkKK3sKKy8qIHdoZW4gYSBtb2R1bGUsIHRoaXMgaXMgcHJpbnRlZCB3aGV0aGVyIG9yIG5vdCBkZXZpY2VzIGFyZSBmb3VuZCBpbiBwcm9iZSAqLworI2lmZGVmIE1PRFVMRQorCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZmVhbG54X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmZWFsbnhfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZmVhbG54X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGZlYWxueF9pbml0KTsKK21vZHVsZV9leGl0KGZlYWxueF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlYy5jIGIvZHJpdmVycy9uZXQvZmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3MDA4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2ZlYy5jCkBAIC0wLDAgKzEsMjI1OSBAQAorLyoKKyAqIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoRkVDKSBkcml2ZXIgZm9yIE1vdG9yb2xhIE1QQzh4eC4KKyAqIENvcHlyaWdodCAoYykgMTk5NyBEYW4gTWFsZWsgKGRtYWxla0BqbGMubmV0KQorICoKKyAqIFRoaXMgdmVyc2lvbiBvZiB0aGUgZHJpdmVyIGlzIHNwZWNpZmljIHRvIHRoZSBGQURTIGltcGxlbWVudGF0aW9uLAorICogc2luY2UgdGhlIGJvYXJkIGNvbnRhaW5zIGNvbnRyb2wgcmVnaXN0ZXJzIGV4dGVybmFsIHRvIHRoZSBwcm9jZXNzb3IKKyAqIGZvciB0aGUgY29udHJvbCBvZiB0aGUgTGV2ZWxPbmUgTFhUOTcwIHRyYW5zY2VpdmVyLiAgVGhlIE1QQzg2MFQgbWFudWFsCisgKiBkZXNjcmliZXMgY29ubmVjdGlvbnMgdXNpbmcgdGhlIGludGVybmFsIHBhcmFsbGVsIHBvcnQgSS9PLCB3aGljaAorICogaXMgYmFzaWNhbGx5IGFsbCBvZiBQb3J0IEQuCisgKgorICogUmlnaHQgbm93LCBJIGFtIHZlcnkgd2F0c2VmdWwgd2l0aCB0aGUgYnVmZmVycy4gIEkgYWxsb2NhdGUgbWVtb3J5CisgKiBwYWdlcyBhbmQgdGhlbiBkaXZpZGUgdGhlbSBpbnRvIDJLIGZyYW1lIGJ1ZmZlcnMuICBUaGlzIHdheSBJIGtub3cgSQorICogaGF2ZSBidWZmZXJzIGxhcmdlIGVub3VnaCB0byBob2xkIG9uZSBmcmFtZSB3aXRoaW4gb25lIGJ1ZmZlciBkZXNjcmlwdG9yLgorICogT25jZSBJIGdldCB0aGlzIHdvcmtpbmcsIEkgd2lsbCB1c2UgNjQgb3IgMTI4IGJ5dGUgQ1BNIGJ1ZmZlcnMsIHdoaWNoCisgKiB3aWxsIGJlIG11Y2ggbW9yZSBtZW1vcnkgZWZmaWNpZW50IGFuZCB3aWxsIGVhc2lseSBoYW5kbGUgbG90cyBvZgorICogc21hbGwgcGFja2V0cy4KKyAqCisgKiBNdWNoIGJldHRlciBtdWx0aXBsZSBQSFkgc3VwcG9ydCBieSBNYWdudXMgRGFtbS4KKyAqIENvcHlyaWdodCAoYykgMjAwMCBFcmljc3NvbiBSYWRpbyBTeXN0ZW1zIEFCLgorICoKKyAqIFN1cHBvcnQgZm9yIEZFQyBjb250cm9sbGVyIG9mIENvbGRGaXJlLzUyNzAvNTI3MS81MjcyLzUyNzQvNTI3NS81MjgwLzUyODIuCisgKiBDb3B5cnVnaHQgKGMpIDIwMDEtMjAwNCBHcmVnIFVuZ2VyZXIgKGdlcmdAc25hcGdlYXIuY29tKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfTTUyN3gpIHx8IGRlZmluZWQoQ09ORklHX001MjcyKSB8fCBkZWZpbmVkKENPTkZJR19NNTI4eCkKKyNpbmNsdWRlIDxhc20vY29sZGZpcmUuaD4KKyNpbmNsdWRlIDxhc20vbWNmc2ltLmg+CisjaW5jbHVkZSAiZmVjLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzbS84eHhfaW1tYXAuaD4KKyNpbmNsdWRlIDxhc20vbXBjOHh4Lmg+CisjaW5jbHVkZSAiY29tbXByb2MuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfRkVDMikKKyNkZWZpbmUJRkVDX01BWF9QT1JUUwkyCisjZWxzZQorI2RlZmluZQlGRUNfTUFYX1BPUlRTCTEKKyNlbmRpZgorCisvKgorICogRGVmaW5lIHRoZSBmaXhlZCBhZGRyZXNzIG9mIHRoZSBGRUMgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmVjX2h3W10gPSB7CisjaWYgZGVmaW5lZChDT05GSUdfTTUyNzIpCisJKE1DRl9NQkFSICsgMHg4NDApLAorI2VsaWYgZGVmaW5lZChDT05GSUdfTTUyN3gpCisJKE1DRl9NQkFSICsgMHgxMDAwKSwKKwkoTUNGX01CQVIgKyAweDE4MDApLAorI2VsaWYgZGVmaW5lZChDT05GSUdfTTUyOHgpCisJKE1DRl9NQkFSICsgMHgxMDAwKSwKKyNlbHNlCisJJigoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9jcG0uY3BfZmVjKSwKKyNlbmRpZgorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIJZmVjX21hY19kZWZhdWx0W10gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKK307CisKKy8qCisgKiBTb21lIGhhcmR3YXJlIGdldHMgaXQgTUFDIGFkZHJlc3Mgb3V0IG9mIGxvY2FsIGZsYXNoIG1lbW9yeS4KKyAqIGlmIHRoaXMgaXMgbm9uLXplcm8gdGhlbiBhc3N1bWUgaXQgaXMgdGhlIGFkZHJlc3MgdG8gZ2V0IE1BQyBmcm9tLgorICovCisjaWYgZGVmaW5lZChDT05GSUdfTkVUdGVsKQorI2RlZmluZQlGRUNfRkxBU0hNQUMJMHhmMDAwNjAwNgorI2VsaWYgZGVmaW5lZChDT05GSUdfR0lMQkFSQ09OQVApIHx8IGRlZmluZWQoQ09ORklHX1NDQUxFUykKKyNkZWZpbmUJRkVDX0ZMQVNITUFDCTB4ZjAwMDYwMDAKKyNlbGlmIGRlZmluZWQgKENPTkZJR19NVERfS2V5VGVjaG5vbG9neSkKKyNkZWZpbmUJRkVDX0ZMQVNITUFDCTB4ZmZlMDQwMDAKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NBTkNhbSkKKyNkZWZpbmUJRkVDX0ZMQVNITUFDCTB4ZjAwMjAwMDAKKyNlbHNlCisjZGVmaW5lCUZFQ19GTEFTSE1BQwkwCisjZW5kaWYKKwordW5zaWduZWQgY2hhciAqZmVjX2ZsYXNobWFjID0gKHVuc2lnbmVkIGNoYXIgKikgRkVDX0ZMQVNITUFDOworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBzb21lIHN0cnVjdHVyZXMgdG8gc3VwcG9ydCBkaWZmZXJlbnQgUEhZcworKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQgbWlpX2RhdGE7CisJdm9pZCAoKmZ1bmN0KSh1aW50IG1paV9yZWcsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworfSBwaHlfY21kX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50IGlkOworCWNoYXIgKm5hbWU7CisKKwljb25zdCBwaHlfY21kX3QgKmNvbmZpZzsKKwljb25zdCBwaHlfY21kX3QgKnN0YXJ0dXA7CisJY29uc3QgcGh5X2NtZF90ICphY2tfaW50OworCWNvbnN0IHBoeV9jbWRfdCAqc2h1dGRvd247Cit9IHBoeV9pbmZvX3Q7CisKKy8qIFRoZSBudW1iZXIgb2YgVHggYW5kIFJ4IGJ1ZmZlcnMuICBUaGVzZSBhcmUgYWxsb2NhdGVkIGZyb20gdGhlIHBhZ2UKKyAqIHBvb2wuICBUaGUgY29kZSBtYXkgYXNzdW1lIHRoZXNlIGFyZSBwb3dlciBvZiB0d28sIHNvIGl0IGl0IGJlc3QKKyAqIHRvIGtlZXAgdGhlbSB0aGF0IHNpemUuCisgKiBXZSBkb24ndCBuZWVkIHRvIGFsbG9jYXRlIHBhZ2VzIGZvciB0aGUgdHJhbnNtaXR0ZXIuICBXZSBqdXN0IHVzZQorICogdGhlIHNrYnVmZmVyIGRpcmVjdGx5LgorICovCisjZGVmaW5lIEZFQ19FTkVUX1JYX1BBR0VTCTgKKyNkZWZpbmUgRkVDX0VORVRfUlhfRlJTSVpFCTIwNDgKKyNkZWZpbmUgRkVDX0VORVRfUlhfRlJQUEcJKFBBR0VfU0laRSAvIEZFQ19FTkVUX1JYX0ZSU0laRSkKKyNkZWZpbmUgUlhfUklOR19TSVpFCQkoRkVDX0VORVRfUlhfRlJQUEcgKiBGRUNfRU5FVF9SWF9QQUdFUykKKyNkZWZpbmUgRkVDX0VORVRfVFhfRlJTSVpFCTIwNDgKKyNkZWZpbmUgRkVDX0VORVRfVFhfRlJQUEcJKFBBR0VfU0laRSAvIEZFQ19FTkVUX1RYX0ZSU0laRSkKKyNkZWZpbmUgVFhfUklOR19TSVpFCQkxNgkvKiBNdXN0IGJlIHBvd2VyIG9mIHR3byAqLworI2RlZmluZSBUWF9SSU5HX01PRF9NQVNLCTE1CS8qICAgZm9yIHRoaXMgdG8gd29yayAqLworCisvKiBJbnRlcnJ1cHQgZXZlbnRzL21hc2tzLgorKi8KKyNkZWZpbmUgRkVDX0VORVRfSEJFUlIJKCh1aW50KTB4ODAwMDAwMDApCS8qIEhlYXJ0YmVhdCBlcnJvciAqLworI2RlZmluZSBGRUNfRU5FVF9CQUJSCSgodWludCkweDQwMDAwMDAwKQkvKiBCYWJibGluZyByZWNlaXZlciAqLworI2RlZmluZSBGRUNfRU5FVF9CQUJUCSgodWludCkweDIwMDAwMDAwKQkvKiBCYWJibGluZyB0cmFuc21pdHRlciAqLworI2RlZmluZSBGRUNfRU5FVF9HUkEJKCh1aW50KTB4MTAwMDAwMDApCS8qIEdyYWNlZnVsIHN0b3AgY29tcGxldGUgKi8KKyNkZWZpbmUgRkVDX0VORVRfVFhGCSgodWludCkweDA4MDAwMDAwKQkvKiBGdWxsIGZyYW1lIHRyYW5zbWl0dGVkICovCisjZGVmaW5lIEZFQ19FTkVUX1RYQgkoKHVpbnQpMHgwNDAwMDAwMCkJLyogQSBidWZmZXIgd2FzIHRyYW5zbWl0dGVkICovCisjZGVmaW5lIEZFQ19FTkVUX1JYRgkoKHVpbnQpMHgwMjAwMDAwMCkJLyogRnVsbCBmcmFtZSByZWNlaXZlZCAqLworI2RlZmluZSBGRUNfRU5FVF9SWEIJKCh1aW50KTB4MDEwMDAwMDApCS8qIEEgYnVmZmVyIHdhcyByZWNlaXZlZCAqLworI2RlZmluZSBGRUNfRU5FVF9NSUkJKCh1aW50KTB4MDA4MDAwMDApCS8qIE1JSSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRkVDX0VORVRfRUJFUlIJKCh1aW50KTB4MDA0MDAwMDApCS8qIFNETUEgYnVzIGVycm9yICovCisKKy8qIFRoZSBGRUMgc3RvcmVzIGRlc3Qvc3JjL3R5cGUsIGRhdGEsIGFuZCBjaGVja3N1bSBmb3IgcmVjZWl2ZSBwYWNrZXRzLgorICovCisjZGVmaW5lIFBLVF9NQVhCVUZfU0laRQkJMTUxOAorI2RlZmluZSBQS1RfTUlOQlVGX1NJWkUJCTY0CisjZGVmaW5lIFBLVF9NQVhCTFJfU0laRQkJMTUyMAorCisKKy8qCisgKiBUaGUgNTI3MC81MjcxLzUyODAvNTI4MiBSWCBjb250cm9sIHJlZ2lzdGVyIGFsc28gY29udGFpbnMgbWF4aW11bSBmcmFtZQorICogc2l6ZSBiaXRzLiBPdGhlciBGRUMgaGFyZHdhcmUgZG9lcyBub3QsIHNvIHdlIG5lZWQgdG8gdGFrZSB0aGF0IGludG8KKyAqIGFjY291bnQgd2hlbiBzZXR0aW5nIGl0LgorICovCisjaWYgZGVmaW5lZChDT05GSUdfTTUyN3gpIHx8IGRlZmluZWQoQ09ORklHX001Mjh4KQorI2RlZmluZQlPUFRfRlJBTUVfU0laRQkoUEtUX01BWEJVRl9TSVpFIDw8IDE2KQorI2Vsc2UKKyNkZWZpbmUJT1BUX0ZSQU1FX1NJWkUJMAorI2VuZGlmCisKKy8qIFRoZSBGRUMgYnVmZmVyIGRlc2NyaXB0b3JzIHRyYWNrIHRoZSByaW5nIGJ1ZmZlcnMuICBUaGUgcnhfYmRfYmFzZSBhbmQKKyAqIHR4X2JkX2Jhc2UgYWx3YXlzIHBvaW50IHRvIHRoZSBiYXNlIG9mIHRoZSBidWZmZXIgZGVzY3JpcHRvcnMuICBUaGUKKyAqIGN1cl9yeCBhbmQgY3VyX3R4IHBvaW50IHRvIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGJ1ZmZlci4KKyAqIFRoZSBkaXJ0eV90eCB0cmFja3MgdGhlIGN1cnJlbnQgYnVmZmVyIHRoYXQgaXMgYmVpbmcgc2VudCBieSB0aGUKKyAqIGNvbnRyb2xsZXIuICBUaGUgY3VyX3R4IGFuZCBkaXJ0eV90eCBhcmUgZXF1YWwgdW5kZXIgYm90aCBjb21wbGV0ZWx5CisgKiBlbXB0eSBhbmQgY29tcGxldGVseSBmdWxsIGNvbmRpdGlvbnMuICBUaGUgZW1wdHkvcmVhZHkgaW5kaWNhdG9yIGluCisgKiB0aGUgYnVmZmVyIGRlc2NyaXB0b3IgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIGNvbmRpdGlvbi4KKyAqLworc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgeworCS8qIEhhcmR3YXJlIHJlZ2lzdGVycyBvZiB0aGUgRkVDIGRldmljZSAqLworCXZvbGF0aWxlIGZlY190CSpod3A7CisKKwkvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQtaW4tcGxhY2UgcGFja2V0L2J1ZmZlciwgZm9yIHNrZnJlZSgpLiAqLworCXVuc2lnbmVkIGNoYXIgKnR4X2JvdW5jZVtUWF9SSU5HX1NJWkVdOworCXN0cnVjdAlza19idWZmKiB0eF9za2J1ZmZbVFhfUklOR19TSVpFXTsKKwl1c2hvcnQJc2tiX2N1cjsKKwl1c2hvcnQJc2tiX2RpcnR5OworCisJLyogQ1BNIGR1YWwgcG9ydCBSQU0gcmVsYXRpdmUgYWRkcmVzc2VzLgorCSovCisJY2JkX3QJKnJ4X2JkX2Jhc2U7CQkvKiBBZGRyZXNzIG9mIFJ4IGFuZCBUeCBidWZmZXJzLiAqLworCWNiZF90CSp0eF9iZF9iYXNlOworCWNiZF90CSpjdXJfcngsICpjdXJfdHg7CQkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KKwljYmRfdAkqZGlydHlfdHg7CS8qIFRoZSByaW5nIGVudHJpZXMgdG8gYmUgZnJlZSgpZWQuICovCisJc3RydWN0CW5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdWludAl0eF9mdWxsOworCXNwaW5sb2NrX3QgbG9jazsKKworCXVpbnQJcGh5X2lkOworCXVpbnQJcGh5X2lkX2RvbmU7CisJdWludAlwaHlfc3RhdHVzOworCXVpbnQJcGh5X3NwZWVkOworCXBoeV9pbmZvX3QJKnBoeTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcGh5X3Rhc2s7CisKKwl1aW50CXNlcXVlbmNlX2RvbmU7CisJdWludAltaWlfcGh5X3Rhc2tfcXVldWVkOworCisJdWludAlwaHlfYWRkcjsKKworCWludAlpbmRleDsKKwlpbnQJb3BlbmVkOworCWludAlsaW5rOworCWludAlvbGRfbGluazsKKwlpbnQJZnVsbF9kdXBsZXg7CisJdW5zaWduZWQgY2hhciBtYWNfYWRkcltFVEhfQUxFTl07Cit9OworCitzdGF0aWMgaW50IGZlY19lbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGZlY19lbmV0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBmZWNfZW5ldF9taWkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZmVjX2VuZXRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CitzdGF0aWMgdm9pZCBmZWNfZW5ldF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGZlY19lbmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBmZWNfZW5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZmVjX2VuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZmVjX3Jlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGR1cGxleCk7CitzdGF0aWMgdm9pZCBmZWNfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGZlY19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworLyogTUlJIHByb2Nlc3NpbmcuICBXZSBrZWVwIHRoaXMgYXMgc2ltcGxlIGFzIHBvc3NpYmxlLiAgUmVxdWVzdHMgYXJlCisgKiBwbGFjZWQgb24gdGhlIGxpc3QgKGlmIHRoZXJlIGlzIHJvb20pLiAgV2hlbiB0aGUgcmVxdWVzdCBpcyBmaW5pc2hlZAorICogYnkgdGhlIE1JSSwgYW4gb3B0aW9uYWwgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWlpX2xpc3QgeworCXVpbnQJbWlpX3JlZ3ZhbDsKKwl2b2lkCSgqbWlpX2Z1bmMpKHVpbnQgdmFsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwlzdHJ1Y3QJbWlpX2xpc3QgKm1paV9uZXh0OworfSBtaWlfbGlzdF90OworCisjZGVmaW5lCQlOTUlJCTIwCittaWlfbGlzdF90CW1paV9jbWRzW05NSUldOworbWlpX2xpc3RfdAkqbWlpX2ZyZWU7CittaWlfbGlzdF90CSptaWlfaGVhZDsKK21paV9saXN0X3QJKm1paV90YWlsOworCitzdGF0aWMgaW50CW1paV9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVxdWVzdCwgCisJCQkJdm9pZCAoKmZ1bmMpKHVpbnQsIHN0cnVjdCBuZXRfZGV2aWNlICopKTsKKworLyogTWFrZSBNSUkgcmVhZC93cml0ZSBjb21tYW5kcyBmb3IgdGhlIEZFQy4KKyovCisjZGVmaW5lIG1rX21paV9yZWFkKFJFRykJKDB4NjAwMjAwMDAgfCAoKFJFRyAmIDB4MWYpIDw8IDE4KSkKKyNkZWZpbmUgbWtfbWlpX3dyaXRlKFJFRywgVkFMKQkoMHg1MDAyMDAwMCB8ICgoUkVHICYgMHgxZikgPDwgMTgpIHwgXAorCQkJCQkJKFZBTCAmIDB4ZmZmZikpCisjZGVmaW5lIG1rX21paV9lbmQJMAorCisvKiBUcmFuc21pdHRlciB0aW1lb3V0LgorKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAoMipIWikKKworLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBQSFkuCisqLworCisjZGVmaW5lIE1JSV9SRUdfQ1IgICAgICAgICAgMCAgLyogQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSUlfUkVHX1NSICAgICAgICAgIDEgIC8qIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1JFR19QSFlJUjEgICAgICAyICAvKiBQSFkgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgMSAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9SRUdfUEhZSVIyICAgICAgMyAgLyogUEhZIElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyIDIgICAgICAgICAgICAqLworI2RlZmluZSBNSUlfUkVHX0FOQVIgICAgICAgIDQgIC8qIEEtTiBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8gCisjZGVmaW5lIE1JSV9SRUdfQU5MUEFSICAgICAgNSAgLyogQS1OIExpbmsgUGFydG5lciBBYmlsaXR5IFJlZ2lzdGVyICAgICAgICAqLworI2RlZmluZSBNSUlfUkVHX0FORVIgICAgICAgIDYgIC8qIEEtTiBFeHBhbnNpb24gUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1JFR19BTk5QVFIgICAgICA3ICAvKiBBLU4gTmV4dCBQYWdlIFRyYW5zbWl0IFJlZ2lzdGVyICAgICAgICAgICovCisjZGVmaW5lIE1JSV9SRUdfQU5MUFJOUFIgICAgOCAgLyogQS1OIExpbmsgUGFydG5lciBSZWNlaXZlZCBOZXh0IFBhZ2UgUmVnLiAqLworCisvKiB2YWx1ZXMgZm9yIHBoeV9zdGF0dXMgKi8KKworI2RlZmluZSBQSFlfQ09ORl9BTkUJMHgwMDAxICAvKiAxIGF1dG8tbmVnb3RpYXRpb24gZW5hYmxlZCAqLworI2RlZmluZSBQSFlfQ09ORl9MT09QCTB4MDAwMiAgLyogMSBsb29wYmFjayBtb2RlIGVuYWJsZWQgKi8KKyNkZWZpbmUgUEhZX0NPTkZfU1BNQVNLCTB4MDBmMCAgLyogbWFzayBmb3Igc3BlZWQgKi8KKyNkZWZpbmUgUEhZX0NPTkZfMTBIRFgJMHgwMDEwICAvKiAxMCBNYml0IGhhbGYgZHVwbGV4IHN1cHBvcnRlZCAqLworI2RlZmluZSBQSFlfQ09ORl8xMEZEWAkweDAwMjAgIC8qIDEwIE1iaXQgZnVsbCBkdXBsZXggc3VwcG9ydGVkICovIAorI2RlZmluZSBQSFlfQ09ORl8xMDBIRFgJMHgwMDQwICAvKiAxMDAgTWJpdCBoYWxmIGR1cGxleCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUEhZX0NPTkZfMTAwRkRYCTB4MDA4MCAgLyogMTAwIE1iaXQgZnVsbCBkdXBsZXggc3VwcG9ydGVkICovIAorCisjZGVmaW5lIFBIWV9TVEFUX0xJTksJMHgwMTAwICAvKiAxIHVwIC0gMCBkb3duICovCisjZGVmaW5lIFBIWV9TVEFUX0ZBVUxUCTB4MDIwMCAgLyogMSByZW1vdGUgZmF1bHQgKi8KKyNkZWZpbmUgUEhZX1NUQVRfQU5DCTB4MDQwMCAgLyogMSBhdXRvLW5lZ290aWF0aW9uIGNvbXBsZXRlCSovCisjZGVmaW5lIFBIWV9TVEFUX1NQTUFTSwkweGYwMDAgIC8qIG1hc2sgZm9yIHNwZWVkICovCisjZGVmaW5lIFBIWV9TVEFUXzEwSERYCTB4MTAwMCAgLyogMTAgTWJpdCBoYWxmIGR1cGxleCBzZWxlY3RlZAkqLworI2RlZmluZSBQSFlfU1RBVF8xMEZEWAkweDIwMDAgIC8qIDEwIE1iaXQgZnVsbCBkdXBsZXggc2VsZWN0ZWQJKi8gCisjZGVmaW5lIFBIWV9TVEFUXzEwMEhEWAkweDQwMDAgIC8qIDEwMCBNYml0IGhhbGYgZHVwbGV4IHNlbGVjdGVkICovCisjZGVmaW5lIFBIWV9TVEFUXzEwMEZEWAkweDgwMDAgIC8qIDEwMCBNYml0IGZ1bGwgZHVwbGV4IHNlbGVjdGVkICovIAorCisKK3N0YXRpYyBpbnQKK2ZlY19lbmV0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwOworCXZvbGF0aWxlIGZlY190CSpmZWNwOworCXZvbGF0aWxlIGNiZF90CSpiZHA7CisKKwlmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWZlY3AgPSAodm9sYXRpbGUgZmVjX3QqKWRldi0+YmFzZV9hZGRyOworCisJaWYgKCFmZXAtPmxpbmspIHsKKwkJLyogTGluayBpcyBkb3duIG9yIGF1dG9uZWdvdGlhdGlvbiBpcyBpbiBwcm9ncmVzcy4gKi8KKwkJcmV0dXJuIDE7CisJfQorCisJLyogRmlsbCBpbiBhIFR4IHJpbmcgZW50cnkgKi8KKwliZHAgPSBmZXAtPmN1cl90eDsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJaWYgKGJkcC0+Y2JkX3NjICYgQkRfRU5FVF9UWF9SRUFEWSkgeworCQkvKiBPb29wcy4gIEFsbCB0cmFuc21pdCBidWZmZXJzIGFyZSBmdWxsLiAgQmFpbCBvdXQuCisJCSAqIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHNpbmNlIGRldi0+dGJ1c3kgc2hvdWxkIGJlIHNldC4KKwkJICovCisJCXByaW50aygiJXM6IHR4IHF1ZXVlIGZ1bGwhLlxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisKKwkvKiBDbGVhciBhbGwgb2YgdGhlIHN0YXR1cyBmbGFncy4KKwkgKi8KKwliZHAtPmNiZF9zYyAmPSB+QkRfRU5FVF9UWF9TVEFUUzsKKworCS8qIFNldCBidWZmZXIgbGVuZ3RoIGFuZCBidWZmZXIgcG9pbnRlci4KKwkqLworCWJkcC0+Y2JkX2J1ZmFkZHIgPSBfX3BhKHNrYi0+ZGF0YSk7CisJYmRwLT5jYmRfZGF0bGVuID0gc2tiLT5sZW47CisKKwkvKgorCSAqCU9uIHNvbWUgRkVDIGltcGxlbWVudGF0aW9ucyBkYXRhIG11c3QgYmUgYWxpZ25lZCBvbgorCSAqCTQtYnl0ZSBib3VuZGFyaWVzLiBVc2UgYm91bmNlIGJ1ZmZlcnMgdG8gY29weSBkYXRhCisJICoJYW5kIGdldCBpdCBhbGlnbmVkLiBVZ2guCisJICovCisJaWYgKGJkcC0+Y2JkX2J1ZmFkZHIgJiAweDMpIHsKKwkJdW5zaWduZWQgaW50IGluZGV4OworCQlpbmRleCA9IGJkcCAtIGZlcC0+dHhfYmRfYmFzZTsKKwkJbWVtY3B5KGZlcC0+dHhfYm91bmNlW2luZGV4XSwgKHZvaWQgKikgYmRwLT5jYmRfYnVmYWRkciwgYmRwLT5jYmRfZGF0bGVuKTsKKwkJYmRwLT5jYmRfYnVmYWRkciA9IF9fcGEoZmVwLT50eF9ib3VuY2VbaW5kZXhdKTsKKwl9CisKKwkvKiBTYXZlIHNrYiBwb2ludGVyLgorCSovCisJZmVwLT50eF9za2J1ZmZbZmVwLT5za2JfY3VyXSA9IHNrYjsKKworCWZlcC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZmVwLT5za2JfY3VyID0gKGZlcC0+c2tiX2N1cisxKSAmIFRYX1JJTkdfTU9EX01BU0s7CisJCisJLyogUHVzaCB0aGUgZGF0YSBjYWNoZSBzbyB0aGUgQ1BNIGRvZXMgbm90IGdldCBzdGFsZSBtZW1vcnkKKwkgKiBkYXRhLgorCSAqLworCWZsdXNoX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylza2ItPmRhdGEsCisJCQkgICAodW5zaWduZWQgbG9uZylza2ItPmRhdGEgKyBza2ItPmxlbik7CisKKwlzcGluX2xvY2tfaXJxKCZmZXAtPmxvY2spOworCisJLyogU2VuZCBpdCBvbiBpdHMgd2F5LiAgVGVsbCBGRUMgaXRzIHJlYWR5LCBpbnRlcnJ1cHQgd2hlbiBkb25lLAorCSAqIGl0cyB0aGUgbGFzdCBCRCBvZiB0aGUgZnJhbWUsIGFuZCB0byBwdXQgdGhlIENSQyBvbiB0aGUgZW5kLgorCSAqLworCisJYmRwLT5jYmRfc2MgfD0gKEJEX0VORVRfVFhfUkVBRFkgfCBCRF9FTkVUX1RYX0lOVFIKKwkJCXwgQkRfRU5FVF9UWF9MQVNUIHwgQkRfRU5FVF9UWF9UQyk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIFRyaWdnZXIgdHJhbnNtaXNzaW9uIHN0YXJ0ICovCisJZmVjcC0+ZmVjX3hfZGVzX2FjdGl2ZSA9IDB4MDEwMDAwMDA7CisKKwkvKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBCRCBpbiB0aGUgcmluZywgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBhZ2Fpbi4KKwkqLworCWlmIChiZHAtPmNiZF9zYyAmIEJEX0VORVRfVFhfV1JBUCkgeworCQliZHAgPSBmZXAtPnR4X2JkX2Jhc2U7CisJfSBlbHNlIHsKKwkJYmRwKys7CisJfQorCisJaWYgKGJkcCA9PSBmZXAtPmRpcnR5X3R4KSB7CisJCWZlcC0+dHhfZnVsbCA9IDE7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl9CisKKwlmZXAtPmN1cl90eCA9IChjYmRfdCAqKWJkcDsKKworCXNwaW5fdW5sb2NrX2lycSgmZmVwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZmVjX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaW50aygiJXM6IHRyYW5zbWl0IHRpbWVkIG91dC5cbiIsIGRldi0+bmFtZSk7CisJZmVwLT5zdGF0cy50eF9lcnJvcnMrKzsKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCXsKKwlpbnQJaTsKKwljYmRfdAkqYmRwOworCisJcHJpbnRrKCJSaW5nIGRhdGEgZHVtcDogY3VyX3R4ICVseCVzLCBkaXJ0eV90eCAlbHggY3VyX3J4OiAlbHhcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKWZlcC0+Y3VyX3R4LCBmZXAtPnR4X2Z1bGwgPyAiIChmdWxsKSIgOiAiIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpZmVwLT5kaXJ0eV90eCwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpZmVwLT5jdXJfcngpOworCisJYmRwID0gZmVwLT50eF9iZF9iYXNlOworCXByaW50aygiIHR4OiAldSBidWZmZXJzXG4iLCAgVFhfUklOR19TSVpFKTsKKwlmb3IgKGkgPSAwIDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXByaW50aygiICAlMDh4OiAlMDR4ICUwNHggJTA4eFxuIiwgCisJCSAgICAgICAodWludCkgYmRwLAorCQkgICAgICAgYmRwLT5jYmRfc2MsCisJCSAgICAgICBiZHAtPmNiZF9kYXRsZW4sCisJCSAgICAgICAoaW50KSBiZHAtPmNiZF9idWZhZGRyKTsKKwkJYmRwKys7CisJfQorCisJYmRwID0gZmVwLT5yeF9iZF9iYXNlOworCXByaW50aygiIHJ4OiAlbHUgYnVmZmVyc1xuIiwgICh1bnNpZ25lZCBsb25nKSBSWF9SSU5HX1NJWkUpOworCWZvciAoaSA9IDAgOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJcHJpbnRrKCIgICUwOHg6ICUwNHggJTA0eCAlMDh4XG4iLAorCQkgICAgICAgKHVpbnQpIGJkcCwKKwkJICAgICAgIGJkcC0+Y2JkX3NjLAorCQkgICAgICAgYmRwLT5jYmRfZGF0bGVuLAorCQkgICAgICAgKGludCkgYmRwLT5jYmRfYnVmYWRkcik7CisJCWJkcCsrOworCX0KKwl9CisjZW5kaWYKKwlmZWNfcmVzdGFydChkZXYsIDApOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyLgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgTVBDIGNvcmUgaW50ZXJydXB0LgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2ZlY19lbmV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0CW5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwl2b2xhdGlsZSBmZWNfdAkqZmVjcDsKKwl1aW50CWludF9ldmVudHM7CisJaW50IGhhbmRsZWQgPSAwOworCisJZmVjcCA9ICh2b2xhdGlsZSBmZWNfdCopZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBHZXQgdGhlIGludGVycnVwdCBldmVudHMgdGhhdCBjYXVzZWQgdXMgdG8gYmUgaGVyZS4KKwkqLworCXdoaWxlICgoaW50X2V2ZW50cyA9IGZlY3AtPmZlY19pZXZlbnQpICE9IDApIHsKKwkJZmVjcC0+ZmVjX2lldmVudCA9IGludF9ldmVudHM7CisKKwkJLyogSGFuZGxlIHJlY2VpdmUgZXZlbnQgaW4gaXRzIG93biBmdW5jdGlvbi4KKwkJICovCisJCWlmIChpbnRfZXZlbnRzICYgRkVDX0VORVRfUlhGKSB7CisJCQloYW5kbGVkID0gMTsKKwkJCWZlY19lbmV0X3J4KGRldik7CisJCX0KKworCQkvKiBUcmFuc21pdCBPSywgb3Igbm9uLWZhdGFsIGVycm9yLiBVcGRhdGUgdGhlIGJ1ZmZlcgorCQkgICBkZXNjcmlwdG9ycy4gRkVDIGhhbmRsZXMgYWxsIGVycm9ycywgd2UganVzdCBkaXNjb3ZlcgorCQkgICB0aGVtIGFzIHBhcnQgb2YgdGhlIHRyYW5zbWl0IHByb2Nlc3MuCisJCSovCisJCWlmIChpbnRfZXZlbnRzICYgRkVDX0VORVRfVFhGKSB7CisJCQloYW5kbGVkID0gMTsKKwkJCWZlY19lbmV0X3R4KGRldik7CisJCX0KKworCQlpZiAoaW50X2V2ZW50cyAmIEZFQ19FTkVUX01JSSkgeworCQkJaGFuZGxlZCA9IDE7CisJCQlmZWNfZW5ldF9taWkoZGV2KTsKKwkJfQorCQorCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCitzdGF0aWMgdm9pZAorZmVjX2VuZXRfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QJZmVjX2VuZXRfcHJpdmF0ZSAqZmVwOworCXZvbGF0aWxlIGNiZF90CSpiZHA7CisJc3RydWN0CXNrX2J1ZmYJKnNrYjsKKworCWZlcCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrKCZmZXAtPmxvY2spOworCWJkcCA9IGZlcC0+ZGlydHlfdHg7CisKKwl3aGlsZSAoKGJkcC0+Y2JkX3NjJkJEX0VORVRfVFhfUkVBRFkpID09IDApIHsKKwkJaWYgKGJkcCA9PSBmZXAtPmN1cl90eCAmJiBmZXAtPnR4X2Z1bGwgPT0gMCkgYnJlYWs7CisKKwkJc2tiID0gZmVwLT50eF9za2J1ZmZbZmVwLT5za2JfZGlydHldOworCQkvKiBDaGVjayBmb3IgZXJyb3JzLiAqLworCQlpZiAoYmRwLT5jYmRfc2MgJiAoQkRfRU5FVF9UWF9IQiB8IEJEX0VORVRfVFhfTEMgfAorCQkJCSAgIEJEX0VORVRfVFhfUkwgfCBCRF9FTkVUX1RYX1VOIHwKKwkJCQkgICBCRF9FTkVUX1RYX0NTTCkpIHsKKwkJCWZlcC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlpZiAoYmRwLT5jYmRfc2MgJiBCRF9FTkVUX1RYX0hCKSAgLyogTm8gaGVhcnRiZWF0ICovCisJCQkJZmVwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCQlpZiAoYmRwLT5jYmRfc2MgJiBCRF9FTkVUX1RYX0xDKSAgLyogTGF0ZSBjb2xsaXNpb24gKi8KKwkJCQlmZXAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCWlmIChiZHAtPmNiZF9zYyAmIEJEX0VORVRfVFhfUkwpICAvKiBSZXRyYW5zIGxpbWl0ICovCisJCQkJZmVwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJaWYgKGJkcC0+Y2JkX3NjICYgQkRfRU5FVF9UWF9VTikgIC8qIFVuZGVycnVuICovCisJCQkJZmVwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJaWYgKGJkcC0+Y2JkX3NjICYgQkRfRU5FVF9UWF9DU0wpIC8qIENhcnJpZXIgbG9zdCAqLworCQkJCWZlcC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCWZlcC0+c3RhdHMudHhfcGFja2V0cysrOworCQl9CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQlpZiAoYmRwLT5jYmRfc2MgJiBCRF9FTkVUX1RYX1JFQURZKQorCQkJcHJpbnRrKCJIRVkhIEVuZXQgeG1pdCBpbnRlcnJ1cHQgYW5kIFRYX1JFQURZLlxuIik7CisjZW5kaWYKKwkJLyogRGVmZXJyZWQgbWVhbnMgc29tZSBjb2xsaXNpb25zIG9jY3VycmVkIGR1cmluZyB0cmFuc21pdCwKKwkJICogYnV0IHdlIGV2ZW50dWFsbHkgc2VudCB0aGUgcGFja2V0IE9LLgorCQkgKi8KKwkJaWYgKGJkcC0+Y2JkX3NjICYgQkRfRU5FVF9UWF9ERUYpCisJCQlmZXAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkgICAgCisJCS8qIEZyZWUgdGhlIHNrIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXN0IHRyYW5zbWl0LgorCQkgKi8KKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJZmVwLT50eF9za2J1ZmZbZmVwLT5za2JfZGlydHldID0gTlVMTDsKKwkJZmVwLT5za2JfZGlydHkgPSAoZmVwLT5za2JfZGlydHkgKyAxKSAmIFRYX1JJTkdfTU9EX01BU0s7CisJICAgIAorCQkvKiBVcGRhdGUgcG9pbnRlciB0byBuZXh0IGJ1ZmZlciBkZXNjcmlwdG9yIHRvIGJlIHRyYW5zbWl0dGVkLgorCQkgKi8KKwkJaWYgKGJkcC0+Y2JkX3NjICYgQkRfRU5FVF9UWF9XUkFQKQorCQkJYmRwID0gZmVwLT50eF9iZF9iYXNlOworCQllbHNlCisJCQliZHArKzsKKwkgICAgCisJCS8qIFNpbmNlIHdlIGhhdmUgZnJlZWQgdXAgYSBidWZmZXIsIHRoZSByaW5nIGlzIG5vIGxvbmdlcgorCQkgKiBmdWxsLgorCQkgKi8KKwkJaWYgKGZlcC0+dHhfZnVsbCkgeworCQkJZmVwLT50eF9mdWxsID0gMDsKKwkJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQl9CisJfQorCWZlcC0+ZGlydHlfdHggPSAoY2JkX3QgKiliZHA7CisJc3Bpbl91bmxvY2soJmZlcC0+bG9jayk7Cit9CisKKworLyogRHVyaW5nIGEgcmVjZWl2ZSwgdGhlIGN1cl9yeCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgaW5jb21pbmcgYnVmZmVyLgorICogV2hlbiB3ZSB1cGRhdGUgdGhyb3VnaCB0aGUgcmluZywgaWYgdGhlIG5leHQgaW5jb21pbmcgYnVmZmVyIGhhcworICogbm90IGJlZW4gZ2l2ZW4gdG8gdGhlIHN5c3RlbSwgd2UganVzdCBzZXQgdGhlIGVtcHR5IGluZGljYXRvciwKKyAqIGVmZmVjdGl2ZWx5IHRvc3NpbmcgdGhlIHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQKK2ZlY19lbmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0CWZlY19lbmV0X3ByaXZhdGUgKmZlcDsKKwl2b2xhdGlsZSBmZWNfdAkqZmVjcDsKKwl2b2xhdGlsZSBjYmRfdCAqYmRwOworCXN0cnVjdAlza19idWZmCSpza2I7CisJdXNob3J0CXBrdF9sZW47CisJX191OCAqZGF0YTsKKworCWZlcCA9IG5ldGRldl9wcml2KGRldik7CisJZmVjcCA9ICh2b2xhdGlsZSBmZWNfdCopZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBGaXJzdCwgZ3JhYiBhbGwgb2YgdGhlIHN0YXRzIGZvciB0aGUgaW5jb21pbmcgcGFja2V0LgorCSAqIFRoZXNlIGdldCBtZXNzZWQgdXAgaWYgd2UgZ2V0IGNhbGxlZCBkdWUgdG8gYSBidXN5IGNvbmRpdGlvbi4KKwkgKi8KKwliZHAgPSBmZXAtPmN1cl9yeDsKKword2hpbGUgKCEoYmRwLT5jYmRfc2MgJiBCRF9FTkVUX1JYX0VNUFRZKSkgeworCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkvKiBTaW5jZSB3ZSBoYXZlIGFsbG9jYXRlZCBzcGFjZSB0byBob2xkIGEgY29tcGxldGUgZnJhbWUsCisJICogdGhlIGxhc3QgaW5kaWNhdG9yIHNob3VsZCBiZSBzZXQuCisJICovCisJaWYgKChiZHAtPmNiZF9zYyAmIEJEX0VORVRfUlhfTEFTVCkgPT0gMCkKKwkJcHJpbnRrKCJGRUMgRU5FVDogcmN2IGlzIG5vdCArbGFzdFxuIik7CisjZW5kaWYKKworCWlmICghZmVwLT5vcGVuZWQpCisJCWdvdG8gcnhfcHJvY2Vzc2luZ19kb25lOworCisJLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KKwlpZiAoYmRwLT5jYmRfc2MgJiAoQkRfRU5FVF9SWF9MRyB8IEJEX0VORVRfUlhfU0ggfCBCRF9FTkVUX1JYX05PIHwKKwkJCSAgIEJEX0VORVRfUlhfQ1IgfCBCRF9FTkVUX1JYX09WKSkgeworCQlmZXAtPnN0YXRzLnJ4X2Vycm9ycysrOyAgICAgICAKKwkJaWYgKGJkcC0+Y2JkX3NjICYgKEJEX0VORVRfUlhfTEcgfCBCRF9FTkVUX1JYX1NIKSkgeworCQkvKiBGcmFtZSB0b28gbG9uZyBvciB0b28gc2hvcnQuICovCisJCQlmZXAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJfQorCQlpZiAoYmRwLT5jYmRfc2MgJiBCRF9FTkVUX1JYX05PKQkvKiBGcmFtZSBhbGlnbm1lbnQgKi8KKwkJCWZlcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCWlmIChiZHAtPmNiZF9zYyAmIEJEX0VORVRfUlhfQ1IpCS8qIENSQyBFcnJvciAqLworCQkJZmVwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCWlmIChiZHAtPmNiZF9zYyAmIEJEX0VORVRfUlhfT1YpCS8qIEZJRk8gb3ZlcnJ1biAqLworCQkJZmVwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJfQorCisJLyogUmVwb3J0IGxhdGUgY29sbGlzaW9ucyBhcyBhIGZyYW1lIGVycm9yLgorCSAqIE9uIHRoaXMgZXJyb3IsIHRoZSBCRCBpcyBjbG9zZWQsIGJ1dCB3ZSBkb24ndCBrbm93IHdoYXQgd2UKKwkgKiBoYXZlIGluIHRoZSBidWZmZXIuICBTbywganVzdCBkcm9wIHRoaXMgZnJhbWUgb24gdGhlIGZsb29yLgorCSAqLworCWlmIChiZHAtPmNiZF9zYyAmIEJEX0VORVRfUlhfQ0wpIHsKKwkJZmVwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJZmVwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJZ290byByeF9wcm9jZXNzaW5nX2RvbmU7CisJfQorCisJLyogUHJvY2VzcyB0aGUgaW5jb21pbmcgZnJhbWUuCisJICovCisJZmVwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJcGt0X2xlbiA9IGJkcC0+Y2JkX2RhdGxlbjsKKwlmZXAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJZGF0YSA9IChfX3U4KilfX3ZhKGJkcC0+Y2JkX2J1ZmFkZHIpOworCisJLyogVGhpcyBkb2VzIDE2IGJ5dGUgYWxpZ25tZW50LCBleGFjdGx5IHdoYXQgd2UgbmVlZC4KKwkgKiBUaGUgcGFja2V0IGxlbmd0aCBpbmNsdWRlcyBGQ1MsIGJ1dCB3ZSBkb24ndCB3YW50IHRvCisJICogaW5jbHVkZSB0aGF0IHdoZW4gcGFzc2luZyB1cHN0cmVhbSBhcyBpdCBtZXNzZXMgdXAKKwkgKiBicmlkZ2luZyBhcHBsaWNhdGlvbnMuCisJICovCisJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuLTQpOworCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQlmZXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwl9IGVsc2UgeworCQlza2ItPmRldiA9IGRldjsKKwkJc2tiX3B1dChza2IscGt0X2xlbi00KTsJLyogTWFrZSByb29tICovCisJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLAorCQkJCSAodW5zaWduZWQgY2hhciAqKV9fdmEoYmRwLT5jYmRfYnVmYWRkciksCisJCQkJIHBrdF9sZW4tNCwgMCk7CisJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCW5ldGlmX3J4KHNrYik7CisJfQorICByeF9wcm9jZXNzaW5nX2RvbmU6CisKKwkvKiBDbGVhciB0aGUgc3RhdHVzIGZsYWdzIGZvciB0aGlzIGJ1ZmZlci4KKwkqLworCWJkcC0+Y2JkX3NjICY9IH5CRF9FTkVUX1JYX1NUQVRTOworCisJLyogTWFyayB0aGUgYnVmZmVyIGVtcHR5LgorCSovCisJYmRwLT5jYmRfc2MgfD0gQkRfRU5FVF9SWF9FTVBUWTsKKworCS8qIFVwZGF0ZSBCRCBwb2ludGVyIHRvIG5leHQgZW50cnkuCisJKi8KKwlpZiAoYmRwLT5jYmRfc2MgJiBCRF9FTkVUX1JYX1dSQVApCisJCWJkcCA9IGZlcC0+cnhfYmRfYmFzZTsKKwllbHNlCisJCWJkcCsrOworCQorI2lmIDEKKwkvKiBEb2luZyB0aGlzIGhlcmUgd2lsbCBrZWVwIHRoZSBGRUMgcnVubmluZyB3aGlsZSB3ZSBwcm9jZXNzCisJICogaW5jb21pbmcgZnJhbWVzLiAgT24gYSBoZWF2aWx5IGxvYWRlZCBuZXR3b3JrLCB3ZSBzaG91bGQgYmUKKwkgKiBhYmxlIHRvIGtlZXAgdXAgYXQgdGhlIGV4cGVuc2Ugb2Ygc3lzdGVtIHJlc291cmNlcy4KKwkgKi8KKwlmZWNwLT5mZWNfcl9kZXNfYWN0aXZlID0gMHgwMTAwMDAwMDsKKyNlbmRpZgorICAgfSAvKiB3aGlsZSAoIShiZHAtPmNiZF9zYyAmIEJEX0VORVRfUlhfRU1QVFkpKSAqLworCWZlcC0+Y3VyX3J4ID0gKGNiZF90ICopYmRwOworCisjaWYgMAorCS8qIERvaW5nIHRoaXMgaGVyZSB3aWxsIGFsbG93IHVzIHRvIHByb2Nlc3MgYWxsIGZyYW1lcyBpbiB0aGUKKwkgKiByaW5nIGJlZm9yZSB0aGUgRkVDIGlzIGFsbG93ZWQgdG8gcHV0IG1vcmUgdGhlcmUuICBPbiBhIGhlYXZpbHkKKwkgKiBsb2FkZWQgbmV0d29yaywgc29tZSBmcmFtZXMgbWF5IGJlIGxvc3QuICBVbmZvcnR1bmF0ZWx5LCB0aGlzCisJICogaW5jcmVhc2VzIHRoZSBpbnRlcnJ1cHQgb3ZlcmhlYWQgc2luY2Ugd2UgY2FuIHBvdGVudGlhbGx5IHdvcmsKKwkgKiBvdXIgd2F5IGJhY2sgdG8gdGhlIGludGVycnVwdCByZXR1cm4gb25seSB0byBjb21lIHJpZ2h0IGJhY2sKKwkgKiBoZXJlLgorCSAqLworCWZlY3AtPmZlY19yX2Rlc19hY3RpdmUgPSAweDAxMDAwMDAwOworI2VuZGlmCit9CisKKworc3RhdGljIHZvaWQKK2ZlY19lbmV0X21paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdAlmZWNfZW5ldF9wcml2YXRlICpmZXA7CisJdm9sYXRpbGUgZmVjX3QJKmVwOworCW1paV9saXN0X3QJKm1pcDsKKwl1aW50CQltaWlfcmVnOworCisJZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwllcCA9IGZlcC0+aHdwOworCW1paV9yZWcgPSBlcC0+ZmVjX21paV9kYXRhOworCQorCWlmICgobWlwID0gbWlpX2hlYWQpID09IE5VTEwpIHsKKwkJcHJpbnRrKCJNSUkgYW5kIG5vIGhlYWQhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChtaXAtPm1paV9mdW5jICE9IE5VTEwpCisJCSgqKG1pcC0+bWlpX2Z1bmMpKShtaWlfcmVnLCBkZXYpOworCisJbWlpX2hlYWQgPSBtaXAtPm1paV9uZXh0OworCW1pcC0+bWlpX25leHQgPSBtaWlfZnJlZTsKKwltaWlfZnJlZSA9IG1pcDsKKworCWlmICgobWlwID0gbWlpX2hlYWQpICE9IE5VTEwpCisJCWVwLT5mZWNfbWlpX2RhdGEgPSBtaXAtPm1paV9yZWd2YWw7Cit9CisKK3N0YXRpYyBpbnQKK21paV9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVndmFsLCB2b2lkICgqZnVuYykodWludCwgc3RydWN0IG5ldF9kZXZpY2UgKikpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCW1paV9saXN0X3QJKm1pcDsKKwlpbnQJCXJldHZhbDsKKworCS8qIEFkZCBQSFkgYWRkcmVzcyB0byByZWdpc3RlciBjb21tYW5kLgorCSovCisJZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZWd2YWwgfD0gZmVwLT5waHlfYWRkciA8PCAyMzsKKworCXJldHZhbCA9IDA7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKworCWlmICgobWlwID0gbWlpX2ZyZWUpICE9IE5VTEwpIHsKKwkJbWlpX2ZyZWUgPSBtaXAtPm1paV9uZXh0OworCQltaXAtPm1paV9yZWd2YWwgPSByZWd2YWw7CisJCW1pcC0+bWlpX2Z1bmMgPSBmdW5jOworCQltaXAtPm1paV9uZXh0ID0gTlVMTDsKKwkJaWYgKG1paV9oZWFkKSB7CisJCQltaWlfdGFpbC0+bWlpX25leHQgPSBtaXA7CisJCQltaWlfdGFpbCA9IG1pcDsKKwkJfQorCQllbHNlIHsKKwkJCW1paV9oZWFkID0gbWlpX3RhaWwgPSBtaXA7CisJCQlmZXAtPmh3cC0+ZmVjX21paV9kYXRhID0gcmVndmFsOworCQl9CisJfQorCWVsc2UgeworCQlyZXR2YWwgPSAxOworCX0KKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuKHJldHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIG1paV9kb19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgcGh5X2NtZF90ICpjKQoreworCWludCBrOworCisJaWYoIWMpCisJCXJldHVybjsKKworCWZvcihrID0gMDsgKGMrayktPm1paV9kYXRhICE9IG1rX21paV9lbmQ7IGsrKykgeworCQltaWlfcXVldWUoZGV2LCAoYytrKS0+bWlpX2RhdGEsIChjK2spLT5mdW5jdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBtaWlfcGFyc2Vfc3IodWludCBtaWlfcmVnLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHVpbnQgKnMgPSAmKGZlcC0+cGh5X3N0YXR1cyk7CisKKwkqcyAmPSB+KFBIWV9TVEFUX0xJTksgfCBQSFlfU1RBVF9GQVVMVCB8IFBIWV9TVEFUX0FOQyk7CisKKwlpZiAobWlpX3JlZyAmIDB4MDAwNCkKKwkJKnMgfD0gUEhZX1NUQVRfTElOSzsKKwlpZiAobWlpX3JlZyAmIDB4MDAxMCkKKwkJKnMgfD0gUEhZX1NUQVRfRkFVTFQ7CisJaWYgKG1paV9yZWcgJiAweDAwMjApCisJCSpzIHw9IFBIWV9TVEFUX0FOQzsKK30KKworc3RhdGljIHZvaWQgbWlpX3BhcnNlX2NyKHVpbnQgbWlpX3JlZywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSB1aW50ICpzID0gJihmZXAtPnBoeV9zdGF0dXMpOworCisJKnMgJj0gfihQSFlfQ09ORl9BTkUgfCBQSFlfQ09ORl9MT09QKTsKKworCWlmIChtaWlfcmVnICYgMHgxMDAwKQorCQkqcyB8PSBQSFlfQ09ORl9BTkU7CisJaWYgKG1paV9yZWcgJiAweDQwMDApCisJCSpzIHw9IFBIWV9DT05GX0xPT1A7Cit9CisKK3N0YXRpYyB2b2lkIG1paV9wYXJzZV9hbmFyKHVpbnQgbWlpX3JlZywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSB1aW50ICpzID0gJihmZXAtPnBoeV9zdGF0dXMpOworCisJKnMgJj0gfihQSFlfQ09ORl9TUE1BU0spOworCisJaWYgKG1paV9yZWcgJiAweDAwMjApCisJCSpzIHw9IFBIWV9DT05GXzEwSERYOworCWlmIChtaWlfcmVnICYgMHgwMDQwKQorCQkqcyB8PSBQSFlfQ09ORl8xMEZEWDsKKwlpZiAobWlpX3JlZyAmIDB4MDA4MCkKKwkJKnMgfD0gUEhZX0NPTkZfMTAwSERYOworCWlmIChtaWlfcmVnICYgMHgwMDEwMCkKKwkJKnMgfD0gUEhZX0NPTkZfMTAwRkRYOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBUaGUgTGV2ZWwgb25lIExYVDk3MCBpcyB1c2VkIGJ5IG1hbnkgYm9hcmRzCQkJCSAgICAgKi8KKworI2RlZmluZSBNSUlfTFhUOTcwX01JUlJPUiAgICAxNiAgLyogTWlycm9yIHJlZ2lzdGVyICAgICAgICAgICAqLworI2RlZmluZSBNSUlfTFhUOTcwX0lFUiAgICAgICAxNyAgLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfTFhUOTcwX0lTUiAgICAgICAxOCAgLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfTFhUOTcwX0NPTkZJRyAgICAxOSAgLyogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgICAqLworI2RlZmluZSBNSUlfTFhUOTcwX0NTUiAgICAgICAyMCAgLyogQ2hpcCBTdGF0dXMgUmVnaXN0ZXIgICAgICAqLworCitzdGF0aWMgdm9pZCBtaWlfcGFyc2VfbHh0OTcwX2Nzcih1aW50IG1paV9yZWcsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgdWludCAqcyA9ICYoZmVwLT5waHlfc3RhdHVzKTsKKworCSpzICY9IH4oUEhZX1NUQVRfU1BNQVNLKTsKKworCWlmIChtaWlfcmVnICYgMHgwODAwKSB7CisJCWlmIChtaWlfcmVnICYgMHgxMDAwKQorCQkJKnMgfD0gUEhZX1NUQVRfMTAwRkRYOworCQllbHNlCisJCQkqcyB8PSBQSFlfU1RBVF8xMDBIRFg7CisJfSBlbHNlIHsKKwkJaWYgKG1paV9yZWcgJiAweDEwMDApCisJCQkqcyB8PSBQSFlfU1RBVF8xMEZEWDsKKwkJZWxzZQorCQkJKnMgfD0gUEhZX1NUQVRfMTBIRFg7CisJfQorfQorCitzdGF0aWMgcGh5X2luZm9fdCBwaHlfaW5mb19seHQ5NzAgPSB7CisJMHgwNzgxMDAwMCwgCisJIkxYVDk3MCIsCisKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7ICAvKiBjb25maWcgKi8KKwkJeyBta19taWlfcmVhZChNSUlfUkVHX0NSKSwgbWlpX3BhcnNlX2NyIH0sCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19BTkFSKSwgbWlpX3BhcnNlX2FuYXIgfSwKKwkJeyBta19taWlfZW5kLCB9CisJfSwKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7ICAvKiBzdGFydHVwIC0gZW5hYmxlIGludGVycnVwdHMgKi8KKwkJeyBta19taWlfd3JpdGUoTUlJX0xYVDk3MF9JRVIsIDB4MDAwMiksIE5VTEwgfSwKKwkJeyBta19taWlfd3JpdGUoTUlJX1JFR19DUiwgMHgxMjAwKSwgTlVMTCB9LCAvKiBhdXRvbmVnb3RpYXRlICovCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAvKiBhY2tfaW50ICovCisJCS8qIHJlYWQgU1IgYW5kIElTUiB0byBhY2tub3dsZWRnZSAqLworCQl7IG1rX21paV9yZWFkKE1JSV9SRUdfU1IpLCBtaWlfcGFyc2Vfc3IgfSwKKwkJeyBta19taWlfcmVhZChNSUlfTFhUOTcwX0lTUiksIE5VTEwgfSwKKworCQkvKiBmaW5kIG91dCB0aGUgY3VycmVudCBzdGF0dXMgKi8KKwkJeyBta19taWlfcmVhZChNSUlfTFhUOTcwX0NTUiksIG1paV9wYXJzZV9seHQ5NzBfY3NyIH0sCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAgLyogc2h1dGRvd24gLSBkaXNhYmxlIGludGVycnVwdHMgKi8KKwkJeyBta19taWlfd3JpdGUoTUlJX0xYVDk3MF9JRVIsIDB4MDAwMCksIE5VTEwgfSwKKwkJeyBta19taWlfZW5kLCB9CisJfSwKK307CisJCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBUaGUgTGV2ZWwgb25lIExYVDk3MSBpcyB1c2VkIG9uIHNvbWUgb2YgbXkgY3VzdG9tIGJvYXJkcyAgICAgICAgICAgICAgICAgICovCisKKy8qIHJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciB0aGUgOTcxICovCisKKyNkZWZpbmUgTUlJX0xYVDk3MV9QQ1IgICAgICAgMTYgIC8qIFBvcnQgQ29udHJvbCBSZWdpc3RlciAgICAgKi8KKyNkZWZpbmUgTUlJX0xYVDk3MV9TUjIgICAgICAgMTcgIC8qIFN0YXR1cyBSZWdpc3RlciAyICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0xYVDk3MV9JRVIgICAgICAgMTggIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0xYVDk3MV9JU1IgICAgICAgMTkgIC8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0xYVDk3MV9MQ1IgICAgICAgMjAgIC8qIExFRCBDb250cm9sIFJlZ2lzdGVyICAgICAgKi8KKyNkZWZpbmUgTUlJX0xYVDk3MV9UQ1IgICAgICAgMzAgIC8qIFRyYW5zbWl0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKworLyogCisgKiBJIGhhZCBzb21lIG5pY2UgaWRlYXMgb2YgcnVubmluZyB0aGUgTURJTyBmYXN0ZXIuLi4KKyAqIFRoZSA5NzEgc2hvdWxkIHN1cHBvcnQgOE1IeiBhbmQgSSB0cmllZCBpdCwgYnV0IHRoaW5ncyBhY3RlZCByZWFsbHkKKyAqIHdlaXJkLCBzbyAyLjUgTUh6IG91Z2h0IHRvIGJlIGVub3VnaCBmb3IgYW55b25lLi4uCisgKi8KKworc3RhdGljIHZvaWQgbWlpX3BhcnNlX2x4dDk3MV9zcjIodWludCBtaWlfcmVnLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHVpbnQgKnMgPSAmKGZlcC0+cGh5X3N0YXR1cyk7CisKKwkqcyAmPSB+KFBIWV9TVEFUX1NQTUFTSyB8IFBIWV9TVEFUX0xJTksgfCBQSFlfU1RBVF9BTkMpOworCisJaWYgKG1paV9yZWcgJiAweDA0MDApIHsKKwkJZmVwLT5saW5rID0gMTsKKwkJKnMgfD0gUEhZX1NUQVRfTElOSzsKKwl9IGVsc2UgeworCQlmZXAtPmxpbmsgPSAwOworCX0KKwlpZiAobWlpX3JlZyAmIDB4MDA4MCkKKwkJKnMgfD0gUEhZX1NUQVRfQU5DOworCWlmIChtaWlfcmVnICYgMHg0MDAwKSB7CisJCWlmIChtaWlfcmVnICYgMHgwMjAwKQorCQkJKnMgfD0gUEhZX1NUQVRfMTAwRkRYOworCQllbHNlCisJCQkqcyB8PSBQSFlfU1RBVF8xMDBIRFg7CisJfSBlbHNlIHsKKwkJaWYgKG1paV9yZWcgJiAweDAyMDApCisJCQkqcyB8PSBQSFlfU1RBVF8xMEZEWDsKKwkJZWxzZQorCQkJKnMgfD0gUEhZX1NUQVRfMTBIRFg7CisJfQorCWlmIChtaWlfcmVnICYgMHgwMDA4KQorCQkqcyB8PSBQSFlfU1RBVF9GQVVMVDsKK30KKworc3RhdGljIHBoeV9pbmZvX3QgcGh5X2luZm9fbHh0OTcxID0geworCTB4MDAwMTM3OGUsIAorCSJMWFQ5NzEiLAorCQorCShjb25zdCBwaHlfY21kX3QgW10pIHsgIC8qIGNvbmZpZyAqLyAgCisJCS8qIGxpbWl0IHRvIDEwTUJpdCBiZWNhdXNlIG15IHByb3RvcnlwZSBib2FyZCAKKwkJICogZG9lc24ndCB3b3JrIHdpdGggMTAwLiAqLworCQl7IG1rX21paV9yZWFkKE1JSV9SRUdfQ1IpLCBtaWlfcGFyc2VfY3IgfSwKKwkJeyBta19taWlfcmVhZChNSUlfUkVHX0FOQVIpLCBtaWlfcGFyc2VfYW5hciB9LAorCQl7IG1rX21paV9yZWFkKE1JSV9MWFQ5NzFfU1IyKSwgbWlpX3BhcnNlX2x4dDk3MV9zcjIgfSwKKwkJeyBta19taWlfZW5kLCB9CisJfSwKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7ICAvKiBzdGFydHVwIC0gZW5hYmxlIGludGVycnVwdHMgKi8KKwkJeyBta19taWlfd3JpdGUoTUlJX0xYVDk3MV9JRVIsIDB4MDBmMiksIE5VTEwgfSwKKwkJeyBta19taWlfd3JpdGUoTUlJX1JFR19DUiwgMHgxMjAwKSwgTlVMTCB9LCAvKiBhdXRvbmVnb3RpYXRlICovCisJCXsgbWtfbWlpX3dyaXRlKE1JSV9MWFQ5NzFfTENSLCAweGQ0MjIpLCBOVUxMIH0sIC8qIExFRCBjb25maWcgKi8KKwkJLyogU29tZWhvdyBkb2VzIHRoZSA5NzEgdGVsbCBtZSB0aGF0IHRoZSBsaW5rIGlzIGRvd24KKwkJICogdGhlIGZpcnN0IHJlYWQgYWZ0ZXIgcG93ZXItdXAuCisJCSAqIHJlYWQgaGVyZSB0byBnZXQgYSB2YWxpZCB2YWx1ZSBpbiBhY2tfaW50ICovCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19TUiksIG1paV9wYXJzZV9zciB9LCAKKwkJeyBta19taWlfZW5kLCB9CisJfSwKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7IC8qIGFja19pbnQgKi8KKwkJLyogZmluZCBvdXQgdGhlIGN1cnJlbnQgc3RhdHVzICovCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19TUiksIG1paV9wYXJzZV9zciB9LAorCQl7IG1rX21paV9yZWFkKE1JSV9MWFQ5NzFfU1IyKSwgbWlpX3BhcnNlX2x4dDk3MV9zcjIgfSwKKwkJLyogd2Ugb25seSBuZWVkIHRvIHJlYWQgSVNSIHRvIGFja25vd2xlZGdlICovCisJCXsgbWtfbWlpX3JlYWQoTUlJX0xYVDk3MV9JU1IpLCBOVUxMIH0sCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAgLyogc2h1dGRvd24gLSBkaXNhYmxlIGludGVycnVwdHMgKi8KKwkJeyBta19taWlfd3JpdGUoTUlJX0xYVDk3MV9JRVIsIDB4MDAwMCksIE5VTEwgfSwKKwkJeyBta19taWlfZW5kLCB9CisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFRoZSBRdWFsaXR5IFNlbWljb25kdWN0b3IgUVM2NjEyIGlzIHVzZWQgb24gdGhlIFJQWCBDTExGICAgICAgICAgICAgICAgICAgKi8KKworLyogcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBNSUlfUVM2NjEyX01DUiAgICAgICAxNyAgLyogTW9kZSBDb250cm9sIFJlZ2lzdGVyICAgICAgKi8KKyNkZWZpbmUgTUlJX1FTNjYxMl9GVFIgICAgICAgMjcgIC8qIEZhY3RvcnkgVGVzdCBSZWdpc3RlciAgICAgICovCisjZGVmaW5lIE1JSV9RUzY2MTJfTUNPICAgICAgIDI4ICAvKiBNaXNjLiBDb250cm9sIFJlZ2lzdGVyICAgICAqLworI2RlZmluZSBNSUlfUVM2NjEyX0lTUiAgICAgICAyOSAgLyogSW50ZXJydXB0IFNvdXJjZSBSZWdpc3RlciAgKi8KKyNkZWZpbmUgTUlJX1FTNjYxMl9JTVIgICAgICAgMzAgIC8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICAgICovCisjZGVmaW5lIE1JSV9RUzY2MTJfUENSICAgICAgIDMxICAvKiAxMDBCYXNlVHggUEhZIENvbnRyb2wgUmVnLiAqLworCitzdGF0aWMgdm9pZCBtaWlfcGFyc2VfcXM2NjEyX3Bjcih1aW50IG1paV9yZWcsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgdWludCAqcyA9ICYoZmVwLT5waHlfc3RhdHVzKTsKKworCSpzICY9IH4oUEhZX1NUQVRfU1BNQVNLKTsKKworCXN3aXRjaCgobWlpX3JlZyA+PiAyKSAmIDcpIHsKKwljYXNlIDE6ICpzIHw9IFBIWV9TVEFUXzEwSERYOyBicmVhazsKKwljYXNlIDI6ICpzIHw9IFBIWV9TVEFUXzEwMEhEWDsgYnJlYWs7CisJY2FzZSA1OiAqcyB8PSBQSFlfU1RBVF8xMEZEWDsgYnJlYWs7CisJY2FzZSA2OiAqcyB8PSBQSFlfU1RBVF8xMDBGRFg7IGJyZWFrOworCX0KK30KKworc3RhdGljIHBoeV9pbmZvX3QgcGh5X2luZm9fcXM2NjEyID0geworCTB4MDAxODE0NDAsIAorCSJRUzY2MTIiLAorCQorCShjb25zdCBwaHlfY21kX3QgW10pIHsgIC8qIGNvbmZpZyAqLyAgCisJCS8qIFRoZSBQSFkgcG93ZXJzIHVwIGlzb2xhdGVkIG9uIHRoZSBSUFgsIAorCQkgKiBzbyBzZW5kIGEgY29tbWFuZCB0byBhbGxvdyBvcGVyYXRpb24uCisJCSAqLworCQl7IG1rX21paV93cml0ZShNSUlfUVM2NjEyX1BDUiwgMHgwZGMwKSwgTlVMTCB9LAorCisJCS8qIHBhcnNlIGNyIGFuZCBhbmFyIHRvIGdldCBzb21lIGluZm8gKi8KKwkJeyBta19taWlfcmVhZChNSUlfUkVHX0NSKSwgbWlpX3BhcnNlX2NyIH0sCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19BTkFSKSwgbWlpX3BhcnNlX2FuYXIgfSwKKwkJeyBta19taWlfZW5kLCB9CisJfSwKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7ICAvKiBzdGFydHVwIC0gZW5hYmxlIGludGVycnVwdHMgKi8KKwkJeyBta19taWlfd3JpdGUoTUlJX1FTNjYxMl9JTVIsIDB4MDAzYSksIE5VTEwgfSwKKwkJeyBta19taWlfd3JpdGUoTUlJX1JFR19DUiwgMHgxMjAwKSwgTlVMTCB9LCAvKiBhdXRvbmVnb3RpYXRlICovCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAvKiBhY2tfaW50ICovCisJCS8qIHdlIG5lZWQgdG8gcmVhZCBJU1IsIFNSIGFuZCBBTkVSIHRvIGFja25vd2xlZGdlICovCisJCXsgbWtfbWlpX3JlYWQoTUlJX1FTNjYxMl9JU1IpLCBOVUxMIH0sCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19TUiksIG1paV9wYXJzZV9zciB9LAorCQl7IG1rX21paV9yZWFkKE1JSV9SRUdfQU5FUiksIE5VTEwgfSwKKworCQkvKiByZWFkIHBjciB0byBnZXQgaW5mbyAqLworCQl7IG1rX21paV9yZWFkKE1JSV9RUzY2MTJfUENSKSwgbWlpX3BhcnNlX3FzNjYxMl9wY3IgfSwKKwkJeyBta19taWlfZW5kLCB9CisJfSwKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7ICAvKiBzaHV0ZG93biAtIGRpc2FibGUgaW50ZXJydXB0cyAqLworCQl7IG1rX21paV93cml0ZShNSUlfUVM2NjEyX0lNUiwgMHgwMDAwKSwgTlVMTCB9LAorCQl7IG1rX21paV9lbmQsIH0KKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogQU1EIEFNNzlDODc0IHBoeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiByZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIDg3NCAqLworCisjZGVmaW5lIE1JSV9BTTc5Qzg3NF9NRlIgICAgICAgMTYgIC8qIE1pc2NlbGxhbmVvdXMgRmVhdHVyZSBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQU03OUM4NzRfSUNTUiAgICAgIDE3ICAvKiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICAgICAgKi8KKyNkZWZpbmUgTUlJX0FNNzlDODc0X0RSICAgICAgICAxOCAgLyogRGlhZ25vc3RpYyBSZWdpc3RlciAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9BTTc5Qzg3NF9QTUxSICAgICAgMTkgIC8qIFBvd2VyIGFuZCBMb29wYmFjayBSZWdpc3RlciAgICAqLworI2RlZmluZSBNSUlfQU03OUM4NzRfTUNSICAgICAgIDIxICAvKiBNb2RlQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0FNNzlDODc0X0RDICAgICAgICAyMyAgLyogRGlzY29ubmVjdCBDb3VudGVyICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9BTTc5Qzg3NF9SRUMgICAgICAgMjQgIC8qIFJlY2lldmUgRXJyb3IgQ291bnRlciAgICAgICAgICAqLworCitzdGF0aWMgdm9pZCBtaWlfcGFyc2VfYW03OWM4NzRfZHIodWludCBtaWlfcmVnLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHVpbnQgKnMgPSAmKGZlcC0+cGh5X3N0YXR1cyk7CisKKwkqcyAmPSB+KFBIWV9TVEFUX1NQTUFTSyB8IFBIWV9TVEFUX0FOQyk7CisKKwlpZiAobWlpX3JlZyAmIDB4MDA4MCkKKwkJKnMgfD0gUEhZX1NUQVRfQU5DOworCWlmIChtaWlfcmVnICYgMHgwNDAwKQorCQkqcyB8PSAoKG1paV9yZWcgJiAweDA4MDApID8gUEhZX1NUQVRfMTAwRkRYIDogUEhZX1NUQVRfMTAwSERYKTsKKwllbHNlCisJCSpzIHw9ICgobWlpX3JlZyAmIDB4MDgwMCkgPyBQSFlfU1RBVF8xMEZEWCA6IFBIWV9TVEFUXzEwSERYKTsKK30KKworc3RhdGljIHBoeV9pbmZvX3QgcGh5X2luZm9fYW03OWM4NzQgPSB7CisJMHgwMDAyMjU2MSwgCisJIkFNNzlDODc0IiwKKwkKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7ICAvKiBjb25maWcgKi8gIAorCQkvKiBsaW1pdCB0byAxME1CaXQgYmVjYXVzZSBteSBwcm90b3J5cGUgYm9hcmQgCisJCSAqIGRvZXNuJ3Qgd29yayB3aXRoIDEwMC4gKi8KKwkJeyBta19taWlfcmVhZChNSUlfUkVHX0NSKSwgbWlpX3BhcnNlX2NyIH0sCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19BTkFSKSwgbWlpX3BhcnNlX2FuYXIgfSwKKwkJeyBta19taWlfcmVhZChNSUlfQU03OUM4NzRfRFIpLCBtaWlfcGFyc2VfYW03OWM4NzRfZHIgfSwKKwkJeyBta19taWlfZW5kLCB9CisJfSwKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7ICAvKiBzdGFydHVwIC0gZW5hYmxlIGludGVycnVwdHMgKi8KKwkJeyBta19taWlfd3JpdGUoTUlJX0FNNzlDODc0X0lDU1IsIDB4ZmYwMCksIE5VTEwgfSwKKwkJeyBta19taWlfd3JpdGUoTUlJX1JFR19DUiwgMHgxMjAwKSwgTlVMTCB9LCAvKiBhdXRvbmVnb3RpYXRlICovCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19TUiksIG1paV9wYXJzZV9zciB9LCAKKwkJeyBta19taWlfZW5kLCB9CisJfSwKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7IC8qIGFja19pbnQgKi8KKwkJLyogZmluZCBvdXQgdGhlIGN1cnJlbnQgc3RhdHVzICovCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19TUiksIG1paV9wYXJzZV9zciB9LAorCQl7IG1rX21paV9yZWFkKE1JSV9BTTc5Qzg3NF9EUiksIG1paV9wYXJzZV9hbTc5Yzg3NF9kciB9LAorCQkvKiB3ZSBvbmx5IG5lZWQgdG8gcmVhZCBJU1IgdG8gYWNrbm93bGVkZ2UgKi8KKwkJeyBta19taWlfcmVhZChNSUlfQU03OUM4NzRfSUNTUiksIE5VTEwgfSwKKwkJeyBta19taWlfZW5kLCB9CisJfSwKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7ICAvKiBzaHV0ZG93biAtIGRpc2FibGUgaW50ZXJydXB0cyAqLworCQl7IG1rX21paV93cml0ZShNSUlfQU03OUM4NzRfSUNTUiwgMHgwMDAwKSwgTlVMTCB9LAorCQl7IG1rX21paV9lbmQsIH0KKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogS2VuZGluIEtTODcyMUJMIHBoeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiByZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIDg3MjEgKi8KKworI2RlZmluZSBNSUlfS1M4NzIxQkxfUlhFUkNSCTIxCisjZGVmaW5lIE1JSV9LUzg3MjFCTF9JQ1NSCTIyCisjZGVmaW5lCU1JSV9LUzg3MjFCTF9QSFlDUgkzMQorCitzdGF0aWMgcGh5X2luZm9fdCBwaHlfaW5mb19rczg3MjFibCA9IHsKKwkweDAwMDIyMTYxLCAKKwkiS1M4NzIxQkwiLAorCQorCShjb25zdCBwaHlfY21kX3QgW10pIHsgIC8qIGNvbmZpZyAqLyAgCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19DUiksIG1paV9wYXJzZV9jciB9LAorCQl7IG1rX21paV9yZWFkKE1JSV9SRUdfQU5BUiksIG1paV9wYXJzZV9hbmFyIH0sCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAgLyogc3RhcnR1cCAqLworCQl7IG1rX21paV93cml0ZShNSUlfS1M4NzIxQkxfSUNTUiwgMHhmZjAwKSwgTlVMTCB9LAorCQl7IG1rX21paV93cml0ZShNSUlfUkVHX0NSLCAweDEyMDApLCBOVUxMIH0sIC8qIGF1dG9uZWdvdGlhdGUgKi8KKwkJeyBta19taWlfcmVhZChNSUlfUkVHX1NSKSwgbWlpX3BhcnNlX3NyIH0sIAorCQl7IG1rX21paV9lbmQsIH0KKwl9LAorCShjb25zdCBwaHlfY21kX3QgW10pIHsgLyogYWNrX2ludCAqLworCQkvKiBmaW5kIG91dCB0aGUgY3VycmVudCBzdGF0dXMgKi8KKwkJeyBta19taWlfcmVhZChNSUlfUkVHX1NSKSwgbWlpX3BhcnNlX3NyIH0sCisJCS8qIHdlIG9ubHkgbmVlZCB0byByZWFkIElTUiB0byBhY2tub3dsZWRnZSAqLworCQl7IG1rX21paV9yZWFkKE1JSV9LUzg3MjFCTF9JQ1NSKSwgTlVMTCB9LAorCQl7IG1rX21paV9lbmQsIH0KKwl9LAorCShjb25zdCBwaHlfY21kX3QgW10pIHsgIC8qIHNodXRkb3duICovCisJCXsgbWtfbWlpX3dyaXRlKE1JSV9LUzg3MjFCTF9JQ1NSLCAweDAwMDApLCBOVUxMIH0sCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBwaHlfaW5mb190ICpwaHlfaW5mb1tdID0geworCSZwaHlfaW5mb19seHQ5NzAsCisJJnBoeV9pbmZvX2x4dDk3MSwKKwkmcGh5X2luZm9fcXM2NjEyLAorCSZwaHlfaW5mb19hbTc5Yzg3NCwKKwkmcGh5X2luZm9fa3M4NzIxYmwsCisJTlVMTAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX1JQWENMQVNTSUMKK3N0YXRpYyB2b2lkCittaWlfbGlua19pbnRlcnJ1cHQodm9pZCAqZGV2X2lkKTsKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QKK21paV9saW5rX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NNTI3MikKKworLyoKKyAqCUNvZGUgc3BlY2lmaWMgdG8gQ29sZGZpcmUgNTI3MiBzZXR1cC4KKyAqLworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfcmVxdWVzdF9pbnRycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmljcnA7CisKKwkvKiBTZXR1cCBpbnRlcnJ1cHQgaGFuZGxlcnMuICovCisJaWYgKHJlcXVlc3RfaXJxKDg2LCBmZWNfZW5ldF9pbnRlcnJ1cHQsIDAsICJmZWMoUlgpIiwgZGV2KSAhPSAwKQorCQlwcmludGsoIkZFQzogQ291bGQgbm90IGFsbG9jYXRlIEZFQyhSQykgSVJRKDg2KSFcbiIpOworCWlmIChyZXF1ZXN0X2lycSg4NywgZmVjX2VuZXRfaW50ZXJydXB0LCAwLCAiZmVjKFRYKSIsIGRldikgIT0gMCkKKwkJcHJpbnRrKCJGRUM6IENvdWxkIG5vdCBhbGxvY2F0ZSBGRUMoUkMpIElSUSg4NykhXG4iKTsKKwlpZiAocmVxdWVzdF9pcnEoODgsIGZlY19lbmV0X2ludGVycnVwdCwgMCwgImZlYyhPVEhFUikiLCBkZXYpICE9IDApCisJCXByaW50aygiRkVDOiBDb3VsZCBub3QgYWxsb2NhdGUgRkVDKE9USEVSKSBJUlEoODgpIVxuIik7CisJaWYgKHJlcXVlc3RfaXJxKDY2LCBtaWlfbGlua19pbnRlcnJ1cHQsIDAsICJmZWMoTUlJKSIsIGRldikgIT0gMCkKKwkJcHJpbnRrKCJGRUM6IENvdWxkIG5vdCBhbGxvY2F0ZSBNSUkgSVJRKDY2KSFcbiIpOworCisJLyogVW5tYXNrIGludGVycnVwdCBhdCBDb2xkRmlyZSA1MjcyIFNJTSAqLworCWljcnAgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoTUNGX01CQVIgKyBNQ0ZTSU1fSUNSMyk7CisJKmljcnAgPSAweDAwMDAwZGRkOworCWljcnAgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoTUNGX01CQVIgKyBNQ0ZTSU1fSUNSMSk7CisJKmljcnAgPSAoKmljcnAgJiAweDcwNzc3Nzc3KSB8IDB4MGQwMDAwMDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX3NldF9taWkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCkKK3sKKwl2b2xhdGlsZSBmZWNfdCAqZmVjcDsKKworCWZlY3AgPSBmZXAtPmh3cDsKKwlmZWNwLT5mZWNfcl9jbnRybCA9IE9QVF9GUkFNRV9TSVpFIHwgMHgwNDsKKwlmZWNwLT5mZWNfeF9jbnRybCA9IDB4MDA7CisKKwkvKgorCSAqIFNldCBNSUkgc3BlZWQgdG8gMi41IE1IegorCSAqIFNlZSA1MjcyIG1hbnVhbCBzZWN0aW9uIDExLjUuODogTVNDUgorCSAqLworCWZlcC0+cGh5X3NwZWVkID0gKCgoKE1DRl9DTEsgLyA0KSAvICgyNTAwMDAwIC8gMTApKSArIDUpIC8gMTApICogMjsKKwlmZWNwLT5mZWNfbWlpX3NwZWVkID0gZmVwLT5waHlfc3BlZWQ7CisKKwlmZWNfcmVzdGFydChkZXYsIDApOworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY19nZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3A7CisJdW5zaWduZWQgY2hhciAqaWFwLCB0bXBhZGRyWzZdOworCWludCBpOworCisJZmVjcCA9IGZlcC0+aHdwOworCisJaWYgKGZlY19mbGFzaG1hYykgeworCQkvKgorCQkgKiBHZXQgTUFDIGFkZHJlc3MgZnJvbSBGTEFTSC4KKwkJICogSWYgaXQgaXMgYWxsIDEncyBvciAwJ3MsIHVzZSB0aGUgZGVmYXVsdC4KKwkJICovCisJCWlhcCA9IGZlY19mbGFzaG1hYzsKKwkJaWYgKChpYXBbMF0gPT0gMCkgJiYgKGlhcFsxXSA9PSAwKSAmJiAoaWFwWzJdID09IDApICYmCisJCSAgICAoaWFwWzNdID09IDApICYmIChpYXBbNF0gPT0gMCkgJiYgKGlhcFs1XSA9PSAwKSkKKwkJCWlhcCA9IGZlY19tYWNfZGVmYXVsdDsKKwkJaWYgKChpYXBbMF0gPT0gMHhmZikgJiYgKGlhcFsxXSA9PSAweGZmKSAmJiAoaWFwWzJdID09IDB4ZmYpICYmCisJCSAgICAoaWFwWzNdID09IDB4ZmYpICYmIChpYXBbNF0gPT0gMHhmZikgJiYgKGlhcFs1XSA9PSAweGZmKSkKKwkJCWlhcCA9IGZlY19tYWNfZGVmYXVsdDsKKwl9IGVsc2UgeworCQkqKCh1bnNpZ25lZCBsb25nICopICZ0bXBhZGRyWzBdKSA9IGZlY3AtPmZlY19hZGRyX2xvdzsKKwkJKigodW5zaWduZWQgc2hvcnQgKikgJnRtcGFkZHJbNF0pID0gKGZlY3AtPmZlY19hZGRyX2hpZ2ggPj4gMTYpOworCQlpYXAgPSAmdG1wYWRkclswXTsKKwl9CisKKwlmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gZmVwLT5tYWNfYWRkcltpXSA9ICppYXArKzsKKworCS8qIEFkanVzdCBNQUMgaWYgdXNpbmcgZGVmYXVsdCBNQUMgYWRkcmVzcyAqLworCWlmIChpYXAgPT0gZmVjX21hY19kZWZhdWx0KSB7CisJCWRldi0+ZGV2X2FkZHJbRVRIX0FMRU4tMV0gPSBmZXAtPm1hY19hZGRyW0VUSF9BTEVOLTFdID0KKwkJCWlhcFtFVEhfQUxFTi0xXSArIGZlcC0+aW5kZXg7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY19lbmFibGVfcGh5X2ludHIodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfZGlzYWJsZV9waHlfaW50cih2b2lkKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmljcnA7CisJaWNycCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChNQ0ZfTUJBUiArIE1DRlNJTV9JQ1IxKTsKKwkqaWNycCA9ICgqaWNycCAmIDB4NzA3Nzc3NzcpIHwgMHgwODAwMDAwMDsKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfcGh5X2Fja19pbnRyKHZvaWQpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqaWNycDsKKwkvKiBBY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0ICovCisJaWNycCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChNQ0ZfTUJBUiArIE1DRlNJTV9JQ1IxKTsKKwkqaWNycCA9ICgqaWNycCAmIDB4Nzc3Nzc3NzcpIHwgMHgwODAwMDAwMDsKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfbG9jYWxod19zZXR1cCh2b2lkKQoreworfQorCisvKgorICoJRG8gbm90IG5lZWQgdG8gbWFrZSByZWdpb24gdW5jYWNoZWQgb24gNTI3Mi4KKyAqLworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfdW5jYWNoZSh1bnNpZ25lZCBsb25nIGFkZHIpCit7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2VsaWYgZGVmaW5lZChDT05GSUdfTTUyN3gpIHx8IGRlZmluZWQoQ09ORklHX001Mjh4KQorCisvKgorICoJQ29kZSBzcGVjaWZpYyB0byBDb2xkZmlyZSA1MjcwLzUyNzEvNTI3NC81Mjc1IGFuZCA1MjgwLzUyODIgc2V0dXBzLgorICovCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY19yZXF1ZXN0X2ludHJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcDsKKwlpbnQgYjsKKworCWZlcCA9IG5ldGRldl9wcml2KGRldik7CisJYiA9IChmZXAtPmluZGV4KSA/IDEyOCA6IDY0OworCisJLyogU2V0dXAgaW50ZXJydXB0IGhhbmRsZXJzLiAqLworCWlmIChyZXF1ZXN0X2lycShiKzIzLCBmZWNfZW5ldF9pbnRlcnJ1cHQsIDAsICJmZWMoVFhGKSIsIGRldikgIT0gMCkKKwkJcHJpbnRrKCJGRUM6IENvdWxkIG5vdCBhbGxvY2F0ZSBGRUMoVFhGKSBJUlEoJWQrMjMpIVxuIiwgYik7CisJaWYgKHJlcXVlc3RfaXJxKGIrMjQsIGZlY19lbmV0X2ludGVycnVwdCwgMCwgImZlYyhUWEIpIiwgZGV2KSAhPSAwKQorCQlwcmludGsoIkZFQzogQ291bGQgbm90IGFsbG9jYXRlIEZFQyhUWEIpIElSUSglZCsyNCkhXG4iLCBiKTsKKwlpZiAocmVxdWVzdF9pcnEoYisyNSwgZmVjX2VuZXRfaW50ZXJydXB0LCAwLCAiZmVjKFRYRklGTykiLCBkZXYpICE9IDApCisJCXByaW50aygiRkVDOiBDb3VsZCBub3QgYWxsb2NhdGUgRkVDKFRYRklGTykgSVJRKCVkKzI1KSFcbiIsIGIpOworCWlmIChyZXF1ZXN0X2lycShiKzI2LCBmZWNfZW5ldF9pbnRlcnJ1cHQsIDAsICJmZWMoVFhDUikiLCBkZXYpICE9IDApCisJCXByaW50aygiRkVDOiBDb3VsZCBub3QgYWxsb2NhdGUgRkVDKFRYQ1IpIElSUSglZCsyNikhXG4iLCBiKTsKKworCWlmIChyZXF1ZXN0X2lycShiKzI3LCBmZWNfZW5ldF9pbnRlcnJ1cHQsIDAsICJmZWMoUlhGKSIsIGRldikgIT0gMCkKKwkJcHJpbnRrKCJGRUM6IENvdWxkIG5vdCBhbGxvY2F0ZSBGRUMoUlhGKSBJUlEoJWQrMjcpIVxuIiwgYik7CisJaWYgKHJlcXVlc3RfaXJxKGIrMjgsIGZlY19lbmV0X2ludGVycnVwdCwgMCwgImZlYyhSWEIpIiwgZGV2KSAhPSAwKQorCQlwcmludGsoIkZFQzogQ291bGQgbm90IGFsbG9jYXRlIEZFQyhSWEIpIElSUSglZCsyOCkhXG4iLCBiKTsKKworCWlmIChyZXF1ZXN0X2lycShiKzI5LCBmZWNfZW5ldF9pbnRlcnJ1cHQsIDAsICJmZWMoTUlJKSIsIGRldikgIT0gMCkKKwkJcHJpbnRrKCJGRUM6IENvdWxkIG5vdCBhbGxvY2F0ZSBGRUMoTUlJKSBJUlEoJWQrMjkpIVxuIiwgYik7CisJaWYgKHJlcXVlc3RfaXJxKGIrMzAsIGZlY19lbmV0X2ludGVycnVwdCwgMCwgImZlYyhMQykiLCBkZXYpICE9IDApCisJCXByaW50aygiRkVDOiBDb3VsZCBub3QgYWxsb2NhdGUgRkVDKExDKSBJUlEoJWQrMzApIVxuIiwgYik7CisJaWYgKHJlcXVlc3RfaXJxKGIrMzEsIGZlY19lbmV0X2ludGVycnVwdCwgMCwgImZlYyhIQkVSUikiLCBkZXYpICE9IDApCisJCXByaW50aygiRkVDOiBDb3VsZCBub3QgYWxsb2NhdGUgRkVDKEhCRVJSKSBJUlEoJWQrMzEpIVxuIiwgYik7CisJaWYgKHJlcXVlc3RfaXJxKGIrMzIsIGZlY19lbmV0X2ludGVycnVwdCwgMCwgImZlYyhHUkEpIiwgZGV2KSAhPSAwKQorCQlwcmludGsoIkZFQzogQ291bGQgbm90IGFsbG9jYXRlIEZFQyhHUkEpIElSUSglZCszMikhXG4iLCBiKTsKKwlpZiAocmVxdWVzdF9pcnEoYiszMywgZmVjX2VuZXRfaW50ZXJydXB0LCAwLCAiZmVjKEVCRVJSKSIsIGRldikgIT0gMCkKKwkJcHJpbnRrKCJGRUM6IENvdWxkIG5vdCBhbGxvY2F0ZSBGRUMoRUJFUlIpIElSUSglZCszMykhXG4iLCBiKTsKKwlpZiAocmVxdWVzdF9pcnEoYiszNCwgZmVjX2VuZXRfaW50ZXJydXB0LCAwLCAiZmVjKEJBQlQpIiwgZGV2KSAhPSAwKQorCQlwcmludGsoIkZFQzogQ291bGQgbm90IGFsbG9jYXRlIEZFQyhCQUJUKSBJUlEoJWQrMzQpIVxuIiwgYik7CisJaWYgKHJlcXVlc3RfaXJxKGIrMzUsIGZlY19lbmV0X2ludGVycnVwdCwgMCwgImZlYyhCQUJSKSIsIGRldikgIT0gMCkKKwkJcHJpbnRrKCJGRUM6IENvdWxkIG5vdCBhbGxvY2F0ZSBGRUMoQkFCUikgSVJRKCVkKzM1KSFcbiIsIGIpOworCisJLyogVW5tYXNrIGludGVycnVwdHMgYXQgQ29sZEZpcmUgNTI4MC81MjgyIGludGVycnVwdCBjb250cm9sbGVyICovCisJeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAqaWNycDsKKwkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAgKmltcnA7CisJCWludCBpOworCisJCWIgPSAoZmVwLT5pbmRleCkgPyBNQ0ZJQ01fSU5UQzEgOiBNQ0ZJQ01fSU5UQzA7CisJCWljcnAgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoTUNGX0lQU0JBUiArIGIgKworCQkJTUNGSU5UQ19JQ1IwKTsKKwkJZm9yIChpID0gMjM7IChpIDwgMzYpOyBpKyspCisJCQlpY3JwW2ldID0gMHgyMzsKKworCQlpbXJwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKE1DRl9JUFNCQVIgKyBiICsKKwkJCU1DRklOVENfSU1SSCk7CisJCSppbXJwICY9IH4weDAwMDAwMDBmOworCQlpbXJwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKE1DRl9JUFNCQVIgKyBiICsKKwkJCU1DRklOVENfSU1STCk7CisJCSppbXJwICY9IH4weGZmODAwMDAxOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX001Mjh4KQorCS8qIFNldCB1cCBncGlvIG91dHB1dHMgZm9yIE1JSSBsaW5lcyAqLworCXsKKwkJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKmdwaW9fcGFzcGFyOworICAKKwkJZ3Bpb19wYXNwYXIgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikgKE1DRl9JUFNCQVIgKworCQkJMHgxMDAwNTYpOworCQkqZ3Bpb19wYXNwYXIgPSAweDBmMDA7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX3NldF9taWkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCkKK3sKKwl2b2xhdGlsZSBmZWNfdCAqZmVjcDsKKworCWZlY3AgPSBmZXAtPmh3cDsKKwlmZWNwLT5mZWNfcl9jbnRybCA9IE9QVF9GUkFNRV9TSVpFIHwgMHgwNDsKKwlmZWNwLT5mZWNfeF9jbnRybCA9IDB4MDA7CisKKwkvKgorCSAqIFNldCBNSUkgc3BlZWQgdG8gMi41IE1IegorCSAqIFNlZSA1MjgyIG1hbnVhbCBzZWN0aW9uIDE3LjUuNC43OiBNU0NSCisJICovCisJZmVwLT5waHlfc3BlZWQgPSAoKCgoTUNGX0NMSyAvIDIpIC8gKDI1MDAwMDAgLyAxMCkpICsgNSkgLyAxMCkgKiAyOworCWZlY3AtPmZlY19taWlfc3BlZWQgPSBmZXAtPnBoeV9zcGVlZDsKKworCWZlY19yZXN0YXJ0KGRldiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX2dldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBmZWNfdCAqZmVjcDsKKwl1bnNpZ25lZCBjaGFyICppYXAsIHRtcGFkZHJbNl07CisJaW50IGk7CisKKwlmZWNwID0gZmVwLT5od3A7CisKKwlpZiAoZmVjX2ZsYXNobWFjKSB7CisJCS8qCisJCSAqIEdldCBNQUMgYWRkcmVzcyBmcm9tIEZMQVNILgorCQkgKiBJZiBpdCBpcyBhbGwgMSdzIG9yIDAncywgdXNlIHRoZSBkZWZhdWx0LgorCQkgKi8KKwkJaWFwID0gZmVjX2ZsYXNobWFjOworCQlpZiAoKGlhcFswXSA9PSAwKSAmJiAoaWFwWzFdID09IDApICYmIChpYXBbMl0gPT0gMCkgJiYKKwkJICAgIChpYXBbM10gPT0gMCkgJiYgKGlhcFs0XSA9PSAwKSAmJiAoaWFwWzVdID09IDApKQorCQkJaWFwID0gZmVjX21hY19kZWZhdWx0OworCQlpZiAoKGlhcFswXSA9PSAweGZmKSAmJiAoaWFwWzFdID09IDB4ZmYpICYmIChpYXBbMl0gPT0gMHhmZikgJiYKKwkJICAgIChpYXBbM10gPT0gMHhmZikgJiYgKGlhcFs0XSA9PSAweGZmKSAmJiAoaWFwWzVdID09IDB4ZmYpKQorCQkJaWFwID0gZmVjX21hY19kZWZhdWx0OworCX0gZWxzZSB7CisJCSooKHVuc2lnbmVkIGxvbmcgKikgJnRtcGFkZHJbMF0pID0gZmVjcC0+ZmVjX2FkZHJfbG93OworCQkqKCh1bnNpZ25lZCBzaG9ydCAqKSAmdG1wYWRkcls0XSkgPSAoZmVjcC0+ZmVjX2FkZHJfaGlnaCA+PiAxNik7CisJCWlhcCA9ICZ0bXBhZGRyWzBdOworCX0KKworCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBmZXAtPm1hY19hZGRyW2ldID0gKmlhcCsrOworCisJLyogQWRqdXN0IE1BQyBpZiB1c2luZyBkZWZhdWx0IE1BQyBhZGRyZXNzICovCisJaWYgKGlhcCA9PSBmZWNfbWFjX2RlZmF1bHQpIHsKKwkJZGV2LT5kZXZfYWRkcltFVEhfQUxFTi0xXSA9IGZlcC0+bWFjX2FkZHJbRVRIX0FMRU4tMV0gPQorCQkJaWFwW0VUSF9BTEVOLTFdICsgZmVwLT5pbmRleDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX2VuYWJsZV9waHlfaW50cih2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY19kaXNhYmxlX3BoeV9pbnRyKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX3BoeV9hY2tfaW50cih2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY19sb2NhbGh3X3NldHVwKHZvaWQpCit7Cit9CisKKy8qCisgKglEbyBub3QgbmVlZCB0byBtYWtlIHJlZ2lvbiB1bmNhY2hlZCBvbiA1MjcyLgorICovCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY191bmNhY2hlKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZWxzZQorCisvKgorICoJQ29kZSBzZXBjaWZpYyB0byB0aGUgTVBDODYwVCBzZXR1cC4KKyAqLworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfcmVxdWVzdF9pbnRycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwOworCisJaW1tYXAgPSAoaW1tYXBfdCAqKUlNQVBfQUREUjsJLyogcG9pbnRlciB0byBpbnRlcm5hbCByZWdpc3RlcnMgKi8KKworCWlmIChyZXF1ZXN0Xzh4eGlycShGRUNfSU5URVJSVVBULCBmZWNfZW5ldF9pbnRlcnJ1cHQsIDAsICJmZWMiLCBkZXYpICE9IDApCisJCXBhbmljKCJDb3VsZCBub3QgYWxsb2NhdGUgRkVDIElSUSEiKTsKKworI2lmZGVmIENPTkZJR19SUFhDTEFTU0lDCisJLyogTWFrZSBQb3J0IEMsIGJpdCAxNSBhbiBpbnB1dCB0aGF0IGNhdXNlcyBpbnRlcnJ1cHRzLgorCSovCisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNwYXIgJj0gfjB4MDAwMTsKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RpciAmPSB+MHgwMDAxOworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3Bjc28gJj0gfjB4MDAwMTsKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2ludCB8PSAweDAwMDE7CisJY3BtX2luc3RhbGxfaGFuZGxlcihDUE1WRUNfUElPX1BDMTUsIG1paV9saW5rX2ludGVycnVwdCwgZGV2KTsKKworCS8qIE1ha2UgTEVEUyByZWZsZWN0IExpbmsgc3RhdHVzLgorCSovCisJKigodWludCAqKSBSUFhfQ1NSX0FERFIpICY9IH5CQ1NSMl9GRVRITEVETU9ERTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19GQURTCisJaWYgKHJlcXVlc3RfOHh4aXJxKFNJVV9JUlEyLCBtaWlfbGlua19pbnRlcnJ1cHQsIDAsICJtaWkiLCBkZXYpICE9IDApCisJCXBhbmljKCJDb3VsZCBub3QgYWxsb2NhdGUgTUlJIElSUSEiKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY19nZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgY2hhciAqaWFwLCB0bXBhZGRyWzZdOworCWJkX3QgKmJkOworCWludCBpOworCisJaWFwID0gYmQtPmJpX2VuZXRhZGRyOworCWJkID0gKGJkX3QgKilfX3JlczsKKworI2lmZGVmIENPTkZJR19SUFhDTEFTU0lDCisJLyogVGhlIEVtYmVkZGVkIFBsYW5ldCBib2FyZHMgaGF2ZSBvbmx5IG9uZSBNQUMgYWRkcmVzcyBpbgorCSAqIHRoZSBFRVBST00sIGJ1dCBjYW4gaGF2ZSB0d28gRXRoZXJuZXQgcG9ydHMuICBGb3IgdGhlCisJICogRkVDIHBvcnQsIHdlIGNyZWF0ZSBhbm90aGVyIGFkZHJlc3MgYnkgc2V0dGluZyBvbmUgb2YKKwkgKiB0aGUgYWRkcmVzcyBiaXRzIGFib3ZlIHNvbWV0aGluZyB0aGF0IHdvdWxkIGhhdmUgKHVwIHRvCisJICogbm93KSBiZWVuIGFsbG9jYXRlZC4KKwkgKi8KKwlmb3IgKGk9MDsgaTw2OyBpKyspCisJCXRtcGFkZHJbaV0gPSAqaWFwKys7CisJdG1wYWRkclszXSB8PSAweDgwOworCWlhcCA9IHRtcGFkZHI7CisjZW5kaWYKKworCWZvciAoaT0wOyBpPDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGZlcC0+bWFjX2FkZHJbaV0gPSAqaWFwKys7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX3NldF9taWkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCkKK3sKKwlleHRlcm4gdWludCBfZ2V0X0lNTVIodm9pZCk7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXA7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3A7CisKKwlmZWNwID0gZmVwLT5od3A7CisJaW1tYXAgPSAoaW1tYXBfdCAqKUlNQVBfQUREUjsJLyogcG9pbnRlciB0byBpbnRlcm5hbCByZWdpc3RlcnMgKi8KKworCS8qIENvbmZpZ3VyZSBhbGwgb2YgcG9ydCBEIGZvciBNSUkuCisJKi8KKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wZHBhciA9IDB4MWZmZjsKKworCS8qIEJpdHMgbW92ZWQgZnJvbSBSZXYuIEQgb253YXJkLgorCSovCisJaWYgKChfZ2V0X0lNTVIoKSAmIDB4ZmZmZikgPCAweDA1MDEpCisJCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BkZGlyID0gMHgxYzU4OwkvKiBQcmUgcmV2LiBEICovCisJZWxzZQorCQlpbW1hcC0+aW1faW9wb3J0LmlvcF9wZGRpciA9IDB4MWZmZjsJLyogUmV2LiBEIGFuZCBsYXRlciAqLworCQorCS8qIFNldCBNSUkgc3BlZWQgdG8gMi41IE1IegorCSovCisJZmVjcC0+ZmVjX21paV9zcGVlZCA9IGZlcC0+cGh5X3NwZWVkID0gCisJCSgoYmQtPmJpX2J1c2ZyZXEgKiAxMDAwMDAwKSAvIDI1MDAwMDApICYgMHg3ZTsKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfZW5hYmxlX3BoeV9pbnRyKHZvaWQpCit7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3A7CisKKwlmZWNwID0gZmVwLT5od3A7CisKKwkvKiBFbmFibGUgTUlJIGNvbW1hbmQgZmluaXNoZWQgaW50ZXJydXB0IAorCSovCisJZmVjcC0+ZmVjX2l2ZWMgPSAoRkVDX0lOVEVSUlVQVC8yKSA8PCAyOTsKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfZGlzYWJsZV9waHlfaW50cih2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY19waHlfYWNrX2ludHIodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfbG9jYWxod19zZXR1cCh2b2lkKQoreworCXZvbGF0aWxlIGZlY190ICpmZWNwOworCisJZmVjcCA9IGZlcC0+aHdwOworCWZlY3AtPmZlY19yX2hhc2ggPSBQS1RfTUFYQlVGX1NJWkU7CisJLyogRW5hYmxlIGJpZyBlbmRpYW4gYW5kIGRvbid0IGNhcmUgYWJvdXQgU0RNQSBGQy4KKwkqLworCWZlY3AtPmZlY19mdW5fY29kZSA9IDB4NzgwMDAwMDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX3VuY2FjaGUodW5zaWduZWQgbG9uZyBhZGRyKQoreworCXB0ZV90ICpwdGU7CisJcHRlID0gdmFfdG9fcHRlKG1lbV9hZGRyKTsKKwlwdGVfdmFsKCpwdGUpIHw9IF9QQUdFX05PX0NBQ0hFOworCWZsdXNoX3RsYl9wYWdlKGluaXRfbW0ubW1hcCwgbWVtX2FkZHIpOworfQorCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBtaWlfZGlzcGxheV9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSB1aW50ICpzID0gJihmZXAtPnBoeV9zdGF0dXMpOworCisJaWYgKCFmZXAtPmxpbmsgJiYgIWZlcC0+b2xkX2xpbmspIHsKKwkJLyogTGluayBpcyBzdGlsbCBkb3duIC0gZG9uJ3QgcHJpbnQgYW55dGhpbmcgKi8KKwkJcmV0dXJuOworCX0KKworCXByaW50aygiJXM6IHN0YXR1czogIiwgZGV2LT5uYW1lKTsKKworCWlmICghZmVwLT5saW5rKSB7CisJCXByaW50aygibGluayBkb3duIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJsaW5rIHVwIik7CisKKwkJc3dpdGNoKCpzICYgUEhZX1NUQVRfU1BNQVNLKSB7CisJCWNhc2UgUEhZX1NUQVRfMTAwRkRYOiBwcmludGsoIiwgMTAwTUJpdCBGdWxsIER1cGxleCIpOyBicmVhazsKKwkJY2FzZSBQSFlfU1RBVF8xMDBIRFg6IHByaW50aygiLCAxMDBNQml0IEhhbGYgRHVwbGV4Iik7IGJyZWFrOworCQljYXNlIFBIWV9TVEFUXzEwRkRYOiBwcmludGsoIiwgMTBNQml0IEZ1bGwgRHVwbGV4Iik7IGJyZWFrOworCQljYXNlIFBIWV9TVEFUXzEwSERYOiBwcmludGsoIiwgMTBNQml0IEhhbGYgRHVwbGV4Iik7IGJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCIsIFVua25vd24gc3BlZWQvZHVwbGV4Iik7CisJCX0KKworCQlpZiAoKnMgJiBQSFlfU1RBVF9BTkMpCisJCQlwcmludGsoIiwgYXV0by1uZWdvdGlhdGlvbiBjb21wbGV0ZSIpOworCX0KKworCWlmICgqcyAmIFBIWV9TVEFUX0ZBVUxUKQorCQlwcmludGsoIiwgcmVtb3RlIGZhdWx0Iik7CisKKwlwcmludGsoIi5cbiIpOworfQorCitzdGF0aWMgdm9pZCBtaWlfZGlzcGxheV9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSB1aW50ICpzID0gJihmZXAtPnBoeV9zdGF0dXMpOworCisJLyoKKwkqKiBXaGVuIHdlIGdldCBoZXJlLCBwaHlfdGFzayBpcyBhbHJlYWR5IHJlbW92ZWQgZnJvbQorCSoqIHRoZSB3b3JrcXVldWUuICBJdCBpcyB0aHVzIHNhZmUgdG8gYWxsb3cgdG8gcmV1c2UgaXQuCisJKi8KKwlmZXAtPm1paV9waHlfdGFza19xdWV1ZWQgPSAwOworCXByaW50aygiJXM6IGNvbmZpZzogYXV0by1uZWdvdGlhdGlvbiAiLCBkZXYtPm5hbWUpOworCisJaWYgKCpzICYgUEhZX0NPTkZfQU5FKQorCQlwcmludGsoIm9uIik7CisJZWxzZQorCQlwcmludGsoIm9mZiIpOworCisJaWYgKCpzICYgUEhZX0NPTkZfMTAwRkRYKQorCQlwcmludGsoIiwgMTAwRkRYIik7CisJaWYgKCpzICYgUEhZX0NPTkZfMTAwSERYKQorCQlwcmludGsoIiwgMTAwSERYIik7CisJaWYgKCpzICYgUEhZX0NPTkZfMTBGRFgpCisJCXByaW50aygiLCAxMEZEWCIpOworCWlmICgqcyAmIFBIWV9DT05GXzEwSERYKQorCQlwcmludGsoIiwgMTBIRFgiKTsKKwlpZiAoISgqcyAmIFBIWV9DT05GX1NQTUFTSykpCisJCXByaW50aygiLCBObyBzcGVlZC9kdXBsZXggc2VsZWN0ZWQ/Iik7CisKKwlpZiAoKnMgJiBQSFlfQ09ORl9MT09QKQorCQlwcmludGsoIiwgbG9vcGJhY2sgZW5hYmxlZCIpOworCQorCXByaW50aygiLlxuIik7CisKKwlmZXAtPnNlcXVlbmNlX2RvbmUgPSAxOworfQorCitzdGF0aWMgdm9pZCBtaWlfcmVsaW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGR1cGxleDsKKworCS8qCisJKiogV2hlbiB3ZSBnZXQgaGVyZSwgcGh5X3Rhc2sgaXMgYWxyZWFkeSByZW1vdmVkIGZyb20KKwkqKiB0aGUgd29ya3F1ZXVlLiAgSXQgaXMgdGh1cyBzYWZlIHRvIGFsbG93IHRvIHJldXNlIGl0LgorCSovCisJZmVwLT5taWlfcGh5X3Rhc2tfcXVldWVkID0gMDsKKwlmZXAtPmxpbmsgPSAoZmVwLT5waHlfc3RhdHVzICYgUEhZX1NUQVRfTElOSykgPyAxIDogMDsKKwltaWlfZGlzcGxheV9zdGF0dXMoZGV2KTsKKwlmZXAtPm9sZF9saW5rID0gZmVwLT5saW5rOworCisJaWYgKGZlcC0+bGluaykgeworCQlkdXBsZXggPSAwOworCQlpZiAoZmVwLT5waHlfc3RhdHVzIAorCQkgICAgJiAoUEhZX1NUQVRfMTAwRkRYIHwgUEhZX1NUQVRfMTBGRFgpKQorCQkJZHVwbGV4ID0gMTsKKwkJZmVjX3Jlc3RhcnQoZGV2LCBkdXBsZXgpOworCX0KKwllbHNlCisJCWZlY19zdG9wKGRldik7CisKKyNpZiAwCisJZW5hYmxlX2lycShmZXAtPm1paV9pcnEpOworI2VuZGlmCisKK30KKworLyogbWlpX3F1ZXVlX3JlbGluayBpcyBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQgZnJvbSBtaWlfbGlua19pbnRlcnJ1cHQgKi8KK3N0YXRpYyB2b2lkIG1paV9xdWV1ZV9yZWxpbmsodWludCBtaWlfcmVnLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyoKKwkqKiBXZSBjYW5ub3QgcXVldWUgcGh5X3Rhc2sgdHdpY2UgaW4gdGhlIHdvcmtxdWV1ZS4gIEl0CisJKiogd291bGQgY2F1c2UgYW4gZW5kbGVzcyBsb29wIGluIHRoZSB3b3JrcXVldWUuCisJKiogRm9ydHVuYXRlbHksIGlmIHRoZSBsYXN0IG1paV9yZWxpbmsgZW50cnkgaGFzIG5vdCB5ZXQgYmVlbgorCSoqIGV4ZWN1dGVkIG5vdywgaXQgd2lsbCBkbyB0aGUgam9iIGZvciB0aGUgY3VycmVudCBpbnRlcnJ1cHQsCisJKiogd2hpY2ggaXMganVzdCB3aGF0IHdlIHdhbnQuCisJKi8KKwlpZiAoZmVwLT5taWlfcGh5X3Rhc2tfcXVldWVkKQorCQlyZXR1cm47CisKKwlmZXAtPm1paV9waHlfdGFza19xdWV1ZWQgPSAxOworCUlOSVRfV09SSygmZmVwLT5waHlfdGFzaywgKHZvaWQqKW1paV9yZWxpbmssIGRldik7CisJc2NoZWR1bGVfd29yaygmZmVwLT5waHlfdGFzayk7Cit9CisKKy8qIG1paV9xdWV1ZV9jb25maWcgaXMgY2FsbGVkIGluIHVzZXIgY29udGV4dCBmcm9tIGZlY19lbmV0X29wZW4gKi8KK3N0YXRpYyB2b2lkIG1paV9xdWV1ZV9jb25maWcodWludCBtaWlfcmVnLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGZlcC0+bWlpX3BoeV90YXNrX3F1ZXVlZCkKKwkJcmV0dXJuOworCisJZmVwLT5taWlfcGh5X3Rhc2tfcXVldWVkID0gMTsKKwlJTklUX1dPUksoJmZlcC0+cGh5X3Rhc2ssICh2b2lkKiltaWlfZGlzcGxheV9jb25maWcsIGRldik7CisJc2NoZWR1bGVfd29yaygmZmVwLT5waHlfdGFzayk7Cit9CisKKworCitwaHlfY21kX3QgcGh5X2NtZF9yZWxpbmtbXSA9IHsgeyBta19taWlfcmVhZChNSUlfUkVHX0NSKSwgbWlpX3F1ZXVlX3JlbGluayB9LAorCQkJICAgICAgIHsgbWtfbWlpX2VuZCwgfSB9OworcGh5X2NtZF90IHBoeV9jbWRfY29uZmlnW10gPSB7IHsgbWtfbWlpX3JlYWQoTUlJX1JFR19DUiksIG1paV9xdWV1ZV9jb25maWcgfSwKKwkJCSAgICAgICB7IG1rX21paV9lbmQsIH0gfTsKKworCisKKy8qIFJlYWQgcmVtYWluZGVyIG9mIFBIWSBJRC4KKyovCitzdGF0aWMgdm9pZAorbWlpX2Rpc2NvdmVyX3BoeTModWludCBtaWlfcmVnLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXA7CisJaW50IGk7CisKKwlmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWZlcC0+cGh5X2lkIHw9IChtaWlfcmVnICYgMHhmZmZmKTsKKwlwcmludGsoImZlYzogUEhZIEAgMHgleCwgSUQgMHglMDh4IiwgZmVwLT5waHlfYWRkciwgZmVwLT5waHlfaWQpOworCisJZm9yKGkgPSAwOyBwaHlfaW5mb1tpXTsgaSsrKSB7CisJCWlmKHBoeV9pbmZvW2ldLT5pZCA9PSAoZmVwLT5waHlfaWQgPj4gNCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAocGh5X2luZm9baV0pCisJCXByaW50aygiIC0tICVzXG4iLCBwaHlfaW5mb1tpXS0+bmFtZSk7CisJZWxzZQorCQlwcmludGsoIiAtLSB1bmtub3duIFBIWSFcbiIpOworICAgICAgCisJZmVwLT5waHkgPSBwaHlfaW5mb1tpXTsKKwlmZXAtPnBoeV9pZF9kb25lID0gMTsKK30KKworLyogU2NhbiBhbGwgb2YgdGhlIE1JSSBQSFkgYWRkcmVzc2VzIGxvb2tpbmcgZm9yIHNvbWVvbmUgdG8gcmVzcG9uZAorICogd2l0aCBhIHZhbGlkIElELiAgVGhpcyB1c3VhbGx5IGhhcHBlbnMgcXVpY2tseS4KKyAqLworc3RhdGljIHZvaWQKK21paV9kaXNjb3Zlcl9waHkodWludCBtaWlfcmVnLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXA7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3A7CisJdWludCBwaHl0eXBlOworCisJZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlmZWNwID0gZmVwLT5od3A7CisKKwlpZiAoZmVwLT5waHlfYWRkciA8IDMyKSB7CisJCWlmICgocGh5dHlwZSA9IChtaWlfcmVnICYgMHhmZmZmKSkgIT0gMHhmZmZmICYmIHBoeXR5cGUgIT0gMCkgeworCQkJCisJCQkvKiBHb3QgZmlyc3QgcGFydCBvZiBJRCwgbm93IGdldCByZW1haW5kZXIuCisJCQkqLworCQkJZmVwLT5waHlfaWQgPSBwaHl0eXBlIDw8IDE2OworCQkJbWlpX3F1ZXVlKGRldiwgbWtfbWlpX3JlYWQoTUlJX1JFR19QSFlJUjIpLAorCQkJCQkJCW1paV9kaXNjb3Zlcl9waHkzKTsKKwkJfQorCQllbHNlIHsKKwkJCWZlcC0+cGh5X2FkZHIrKzsKKwkJCW1paV9xdWV1ZShkZXYsIG1rX21paV9yZWFkKE1JSV9SRUdfUEhZSVIxKSwKKwkJCQkJCQltaWlfZGlzY292ZXJfcGh5KTsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50aygiRkVDOiBObyBQSFkgZGV2aWNlIGZvdW5kLlxuIik7CisJCS8qIERpc2FibGUgZXh0ZXJuYWwgTUlJIGludGVyZmFjZSAqLworCQlmZWNwLT5mZWNfbWlpX3NwZWVkID0gZmVwLT5waHlfc3BlZWQgPSAwOworCQlmZWNfZGlzYWJsZV9waHlfaW50cigpOworCX0KK30KKworLyogVGhpcyBpbnRlcnJ1cHQgb2NjdXJzIHdoZW4gdGhlIFBIWSBkZXRlY3RzIGEgbGluayBjaGFuZ2UuCisqLworI2lmZGVmIENPTkZJR19SUFhDTEFTU0lDCitzdGF0aWMgdm9pZAorbWlpX2xpbmtfaW50ZXJydXB0KHZvaWQgKmRldl9pZCkKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QKK21paV9saW5rX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCisjZW5kaWYKK3sKKwlzdHJ1Y3QJbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZmVjX3BoeV9hY2tfaW50cigpOworCisjaWYgMAorCWRpc2FibGVfaXJxKGZlcC0+bWlpX2lycSk7ICAvKiBkaXNhYmxlIG5vdywgZW5hYmxlIGxhdGVyICovCisjZW5kaWYKKworCW1paV9kb19jbWQoZGV2LCBmZXAtPnBoeS0+YWNrX2ludCk7CisJbWlpX2RvX2NtZChkZXYsIHBoeV9jbWRfcmVsaW5rKTsgIC8qIHJlc3RhcnQgYW5kIGRpc3BsYXkgc3RhdHVzICovCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQKK2ZlY19lbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIEkgc2hvdWxkIHJlc2V0IHRoZSByaW5nIGJ1ZmZlcnMgaGVyZSwgYnV0IEkgZG9uJ3QgeWV0IGtub3cKKwkgKiBhIHNpbXBsZSB3YXkgdG8gZG8gdGhhdC4KKwkgKi8KKwlmZWNfc2V0X21hY19hZGRyZXNzKGRldik7CisKKwlmZXAtPnNlcXVlbmNlX2RvbmUgPSAwOworCWZlcC0+bGluayA9IDA7CisKKwlpZiAoZmVwLT5waHkpIHsKKwkJbWlpX2RvX2NtZChkZXYsIGZlcC0+cGh5LT5hY2tfaW50KTsKKwkJbWlpX2RvX2NtZChkZXYsIGZlcC0+cGh5LT5jb25maWcpOworCQltaWlfZG9fY21kKGRldiwgcGh5X2NtZF9jb25maWcpOyAgLyogZGlzcGxheSBjb25maWd1cmF0aW9uICovCisKKwkJLyogRklYTUU6IHVzZSBuZXRpZl9jYXJyaWVyX3tvbixvZmZ9IDsgdGhpcyBwb2xscworCQkgKiB1bnRpbCBsaW5rIGlzIHVwIHdoaWNoIGlzIHdyb25nLi4uICBjb3VsZCBiZQorCQkgKiAzMCBzZWNvbmRzIG9yIG1vcmUgd2UgYXJlIHRyYXBwZWQgaW4gaGVyZS4gLWpnYXJ6aWsKKwkJICovCisJCXdoaWxlKCFmZXAtPnNlcXVlbmNlX2RvbmUpCisJCQlzY2hlZHVsZSgpOworCisJCW1paV9kb19jbWQoZGV2LCBmZXAtPnBoeS0+c3RhcnR1cCk7CisKKwkJLyogU2V0IHRoZSBpbml0aWFsIGxpbmsgc3RhdGUgdG8gdHJ1ZS4gQSBsb3Qgb2YgaGFyZHdhcmUKKwkJICogYmFzZWQgb24gdGhpcyBkZXZpY2UgZG9lcyBub3QgaW1wbGVtZW50IGEgUEhZIGludGVycnVwdCwKKwkJICogc28gd2UgYXJlIG5ldmVyIG5vdGlmaWVkIG9mIGxpbmsgY2hhbmdlLgorCQkgKi8KKwkJZmVwLT5saW5rID0gMTsKKwl9IGVsc2UgeworCQlmZXAtPmxpbmsgPSAxOyAvKiBsZXRzIGp1c3QgdHJ5IGl0IGFuZCBzZWUgKi8KKwkJLyogbm8gcGh5LCAgZ28gZnVsbCBkdXBsZXgsICBpdCdzIG1vc3QgbGlrZWx5IGEgaHViIGNoaXAgKi8KKwkJZmVjX3Jlc3RhcnQoZGV2LCAxKTsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCWZlcC0+b3BlbmVkID0gMTsKKwlyZXR1cm4gMDsJCS8qIFN1Y2Nlc3MgKi8KK30KKworc3RhdGljIGludAorZmVjX2VuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIERvbid0IGtub3cgd2hhdCB0byBkbyB5ZXQuCisJKi8KKwlmZXAtPm9wZW5lZCA9IDA7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWZlY19zdG9wKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpmZWNfZW5ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAmZmVwLT5zdGF0czsKK30KKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgKiBTa2VsZXRvbiB0YWtlbiBmcm9tIHN1bmxhbmNlIGRyaXZlci4KKyAqIFRoZSBDUE0gRXRoZXJuZXQgaW1wbGVtZW50YXRpb24gYWxsb3dzIE11bHRpY2FzdCBhcyB3ZWxsIGFzIGluZGl2aWR1YWwKKyAqIE1BQyBhZGRyZXNzIGZpbHRlcmluZy4gIFNvbWUgb2YgdGhlIGRyaXZlcnMgY2hlY2sgdG8gbWFrZSBzdXJlIGl0IGlzCisgKiBhIGdyb3VwIG11bHRpY2FzdCBhZGRyZXNzLCBhbmQgZGlzY2FyZCB0aG9zZSB0aGF0IGFyZSBub3QuICBJIGd1ZXNzIEkKKyAqIHdpbGwgZG8gdGhlIHNhbWUgZm9yIG5vdywgYnV0IGp1c3QgcmVtb3ZlIHRoZSB0ZXN0IGlmIHlvdSB3YW50CisgKiBpbmRpdmlkdWFsIGZpbHRlcmluZyBhcyB3ZWxsIChkbyB0aGUgdXBwZXIgbmV0IGxheWVycyB3YW50IG9yIHN1cHBvcnQKKyAqIHRoaXMga2luZCBvZiBmZWF0dXJlPykuCisgKi8KKworI2RlZmluZSBIQVNIX0JJVFMJNgkJLyogI2JpdHMgaW4gaGFzaCAqLworI2RlZmluZSBDUkMzMl9QT0xZCTB4RURCODgzMjAKKworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcDsKKwl2b2xhdGlsZSBmZWNfdCAqZXA7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWk7CisJdW5zaWduZWQgaW50IGksIGosIGJpdCwgZGF0YSwgY3JjOworCXVuc2lnbmVkIGNoYXIgaGFzaDsKKworCWZlcCA9IG5ldGRldl9wcml2KGRldik7CisJZXAgPSBmZXAtPmh3cDsKKworCWlmIChkZXYtPmZsYWdzJklGRl9QUk9NSVNDKSB7CisJCS8qIExvZyBhbnkgbmV0IHRhcHMuICovCisJCXByaW50aygiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCWVwLT5mZWNfcl9jbnRybCB8PSAweDAwMDg7CisJfSBlbHNlIHsKKworCQllcC0+ZmVjX3JfY250cmwgJj0gfjB4MDAwODsKKworCQlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkJLyogQ2F0Y2ggYWxsIG11bHRpY2FzdCBhZGRyZXNzZXMsIHNvIHNldCB0aGUKKwkJCSAqIGZpbHRlciB0byBhbGwgMSdzLgorCQkJICovCisJCQllcC0+ZmVjX2hhc2hfdGFibGVfaGlnaCA9IDB4ZmZmZmZmZmY7CisJCQllcC0+ZmVjX2hhc2hfdGFibGVfbG93ID0gMHhmZmZmZmZmZjsKKwkJfSBlbHNlIHsKKwkJCS8qIENsZWFyIGZpbHRlciBhbmQgYWRkIHRoZSBhZGRyZXNzZXMgaW4gaGFzaCByZWdpc3Rlci4KKwkJCSovCisJCQllcC0+ZmVjX2hhc2hfdGFibGVfaGlnaCA9IDA7CisJCQllcC0+ZmVjX2hhc2hfdGFibGVfbG93ID0gMDsKKyAgICAgICAgICAgIAorCQkJZG1pID0gZGV2LT5tY19saXN0OworCisJCQlmb3IgKGogPSAwOyBqIDwgZGV2LT5tY19jb3VudDsgaisrLCBkbWkgPSBkbWktPm5leHQpCisJCQl7CisJCQkJLyogT25seSBzdXBwb3J0IGdyb3VwIG11bHRpY2FzdCBmb3Igbm93LgorCQkJCSovCisJCQkJaWYgKCEoZG1pLT5kbWlfYWRkclswXSAmIDEpKQorCQkJCQljb250aW51ZTsKKwkJCQorCQkJCS8qIGNhbGN1bGF0ZSBjcmMzMiB2YWx1ZSBvZiBtYWMgYWRkcmVzcworCQkJCSovCisJCQkJY3JjID0gMHhmZmZmZmZmZjsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBkbWktPmRtaV9hZGRybGVuOyBpKyspCisJCQkJeworCQkJCQlkYXRhID0gZG1pLT5kbWlfYWRkcltpXTsKKwkJCQkJZm9yIChiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKywgZGF0YSA+Pj0gMSkKKwkJCQkJeworCQkJCQkJY3JjID0gKGNyYyA+PiAxKSBeCisJCQkJCQkoKChjcmMgXiBkYXRhKSAmIDEpID8gQ1JDMzJfUE9MWSA6IDApOworCQkJCQl9CisJCQkJfQorCisJCQkJLyogb25seSB1cHBlciA2IGJpdHMgKEhBU0hfQklUUykgYXJlIHVzZWQKKwkJCQkgICB3aGljaCBwb2ludCB0byBzcGVjaWZpYyBiaXQgaW4gaGUgaGFzaCByZWdpc3RlcnMKKwkJCQkqLworCQkJCWhhc2ggPSAoY3JjID4+ICgzMiAtIEhBU0hfQklUUykpICYgMHgzZjsKKwkJCQorCQkJCWlmIChoYXNoID4gMzEpCisJCQkJCWVwLT5mZWNfaGFzaF90YWJsZV9oaWdoIHw9IDEgPDwgKGhhc2ggLSAzMik7CisJCQkJZWxzZQorCQkJCQllcC0+ZmVjX2hhc2hfdGFibGVfbG93IHw9IDEgPDwgaGFzaDsKKwkJCX0KKwkJfQorCX0KK30KKworLyogU2V0IGEgTUFDIGNoYW5nZSBpbiBoYXJkd2FyZS4KKyAqLworc3RhdGljIHZvaWQKK2ZlY19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwOworCXZvbGF0aWxlIGZlY190ICpmZWNwOworCisJZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlmZWNwID0gZmVwLT5od3A7CisKKwkvKiBTZXQgc3RhdGlvbiBhZGRyZXNzLiAqLworCWZlY3AtPmZlY19hZGRyX2xvdyA9IGZlcC0+bWFjX2FkZHJbM10gfCAoZmVwLT5tYWNfYWRkclsyXSA8PCA4KSB8CisJCShmZXAtPm1hY19hZGRyWzFdIDw8IDE2KSB8IChmZXAtPm1hY19hZGRyWzBdIDw8IDI0KTsKKwlmZWNwLT5mZWNfYWRkcl9oaWdoID0gKGZlcC0+bWFjX2FkZHJbNV0gPDwgMTYpIHwKKwkJKGZlcC0+bWFjX2FkZHJbNF0gPDwgMjQpOworCit9CisKKy8qIEluaXRpYWxpemUgdGhlIEZFQyBFdGhlcm5ldCBvbiA4NjBUIChvciBDb2xkRmlyZSA1MjcyKS4KKyAqLworIC8qCisgICogWFhYOiAgV2UgbmVlZCB0byBjbGVhbiB1cCBvbiBmYWlsdXJlIGV4aXRzIGhlcmUuCisgICovCitpbnQgX19pbml0IGZlY19lbmV0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nCW1lbV9hZGRyOworCXZvbGF0aWxlIGNiZF90CSpiZHA7CisJY2JkX3QJCSpjYmRfYmFzZTsKKwl2b2xhdGlsZSBmZWNfdAkqZmVjcDsKKwlpbnQgCQlpLCBqOworCXN0YXRpYyBpbnQJaW5kZXggPSAwOworCisJLyogT25seSBhbGxvdyB1cyB0byBiZSBwcm9iZWQgb25jZS4gKi8KKwlpZiAoaW5kZXggPj0gRkVDX01BWF9QT1JUUykKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qIENyZWF0ZSBhbiBFdGhlcm5ldCBkZXZpY2UgaW5zdGFuY2UuCisJKi8KKwlmZWNwID0gKHZvbGF0aWxlIGZlY190ICopIGZlY19od1tpbmRleF07CisKKwlmZXAtPmluZGV4ID0gaW5kZXg7CisJZmVwLT5od3AgPSBmZWNwOworCisJLyogV2hhY2sgYSByZXNldC4gIFdlIHNob3VsZCB3YWl0IGZvciB0aGlzLgorCSovCisJZmVjcC0+ZmVjX2VjbnRybCA9IDE7CisJdWRlbGF5KDEwKTsKKworCS8qIENsZWFyIGFuZCBlbmFibGUgaW50ZXJydXB0cyAqLworCWZlY3AtPmZlY19pZXZlbnQgPSAweGZmYzA7CisJZmVjcC0+ZmVjX2ltYXNrID0gKEZFQ19FTkVUX1RYRiB8IEZFQ19FTkVUX1RYQiB8CisJCUZFQ19FTkVUX1JYRiB8IEZFQ19FTkVUX1JYQiB8IEZFQ19FTkVUX01JSSk7CisJZmVjcC0+ZmVjX2hhc2hfdGFibGVfaGlnaCA9IDA7CisJZmVjcC0+ZmVjX2hhc2hfdGFibGVfbG93ID0gMDsKKwlmZWNwLT5mZWNfcl9idWZmX3NpemUgPSBQS1RfTUFYQkxSX1NJWkU7CisgICAgICAgIGZlY3AtPmZlY19lY250cmwgPSAyOworICAgICAgICBmZWNwLT5mZWNfcl9kZXNfYWN0aXZlID0gMHgwMTAwMDAwMDsKKworCS8qIFNldCB0aGUgRXRoZXJuZXQgYWRkcmVzcy4gIElmIHVzaW5nIG11bHRpcGxlIEVuZXRzIG9uIHRoZSA4eHgsCisJICogdGhpcyBuZWVkcyBzb21lIHdvcmsgdG8gZ2V0IHVuaXF1ZSBhZGRyZXNzZXMuCisJICoKKwkgKiBUaGlzIGlzIG91ciBkZWZhdWx0IE1BQyBhZGRyZXNzIHVubGVzcyB0aGUgdXNlciBjaGFuZ2VzCisJICogaXQgdmlhIGV0aF9tYWNfYWRkciAob3VyIGRldi0+c2V0X21hY19hZGRyIGhhbmRsZXIpLgorCSAqLworCWZlY19nZXRfbWFjKGRldik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGJ1ZmZlciBkZXNjcmlwdG9ycy4KKwkqLworCWlmICgoKFJYX1JJTkdfU0laRSArIFRYX1JJTkdfU0laRSkgKiBzaXplb2YoY2JkX3QpKSA+IFBBR0VfU0laRSkgeworCQlwcmludGsoIkZFQyBpbml0IGVycm9yLiAgTmVlZCBtb3JlIHNwYWNlLlxuIik7CisJCXByaW50aygiRkVDIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJbWVtX2FkZHIgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2JkX2Jhc2UgPSAoY2JkX3QgKiltZW1fYWRkcjsKKwkvKiBYWFg6IG1pc3NpbmcgY2hlY2sgZm9yIGFsbG9jYXRpb24gZmFpbHVyZSAqLworCisJZmVjX3VuY2FjaGUobWVtX2FkZHIpOworCisJLyogU2V0IHJlY2VpdmUgYW5kIHRyYW5zbWl0IGRlc2NyaXB0b3IgYmFzZS4KKwkqLworCWZlcC0+cnhfYmRfYmFzZSA9IGNiZF9iYXNlOworCWZlcC0+dHhfYmRfYmFzZSA9IGNiZF9iYXNlICsgUlhfUklOR19TSVpFOworCisJZmVwLT5kaXJ0eV90eCA9IGZlcC0+Y3VyX3R4ID0gZmVwLT50eF9iZF9iYXNlOworCWZlcC0+Y3VyX3J4ID0gZmVwLT5yeF9iZF9iYXNlOworCisJZmVwLT5za2JfY3VyID0gZmVwLT5za2JfZGlydHkgPSAwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZSBidWZmZXIgZGVzY3JpcHRvcnMuCisJKi8KKwliZHAgPSBmZXAtPnJ4X2JkX2Jhc2U7CisJZm9yIChpPTA7IGk8RkVDX0VORVRfUlhfUEFHRVM7IGkrKykgeworCisJCS8qIEFsbG9jYXRlIGEgcGFnZS4KKwkJKi8KKwkJbWVtX2FkZHIgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCS8qIFhYWDogbWlzc2luZyBjaGVjayBmb3IgYWxsb2NhdGlvbiBmYWlsdXJlICovCisKKwkJZmVjX3VuY2FjaGUobWVtX2FkZHIpOworCisJCS8qIEluaXRpYWxpemUgdGhlIEJEIGZvciBldmVyeSBmcmFnbWVudCBpbiB0aGUgcGFnZS4KKwkJKi8KKwkJZm9yIChqPTA7IGo8RkVDX0VORVRfUlhfRlJQUEc7IGorKykgeworCQkJYmRwLT5jYmRfc2MgPSBCRF9FTkVUX1JYX0VNUFRZOworCQkJYmRwLT5jYmRfYnVmYWRkciA9IF9fcGEobWVtX2FkZHIpOworCQkJbWVtX2FkZHIgKz0gRkVDX0VORVRfUlhfRlJTSVpFOworCQkJYmRwKys7CisJCX0KKwl9CisKKwkvKiBTZXQgdGhlIGxhc3QgYnVmZmVyIHRvIHdyYXAuCisJKi8KKwliZHAtLTsKKwliZHAtPmNiZF9zYyB8PSBCRF9TQ19XUkFQOworCisJLyogLi4uYW5kIHRoZSBzYW1lIGZvciB0cmFuc21taXQuCisJKi8KKwliZHAgPSBmZXAtPnR4X2JkX2Jhc2U7CisJZm9yIChpPTAsIGo9RkVDX0VORVRfVFhfRlJQUEc7IGk8VFhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKGogPj0gRkVDX0VORVRfVFhfRlJQUEcpIHsKKwkJCW1lbV9hZGRyID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCQkJaiA9IDE7CisJCX0gZWxzZSB7CisJCQltZW1fYWRkciArPSBGRUNfRU5FVF9UWF9GUlNJWkU7CisJCQlqKys7CisJCX0KKwkJZmVwLT50eF9ib3VuY2VbaV0gPSAodW5zaWduZWQgY2hhciAqKSBtZW1fYWRkcjsKKworCQkvKiBJbml0aWFsaXplIHRoZSBCRCBmb3IgZXZlcnkgZnJhZ21lbnQgaW4gdGhlIHBhZ2UuCisJCSovCisJCWJkcC0+Y2JkX3NjID0gMDsKKwkJYmRwLT5jYmRfYnVmYWRkciA9IDA7CisJCWJkcCsrOworCX0KKworCS8qIFNldCB0aGUgbGFzdCBidWZmZXIgdG8gd3JhcC4KKwkqLworCWJkcC0tOworCWJkcC0+Y2JkX3NjIHw9IEJEX1NDX1dSQVA7CisKKwkvKiBTZXQgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgZGVzY3JpcHRvciBiYXNlLgorCSovCisJZmVjcC0+ZmVjX3JfZGVzX3N0YXJ0ID0gX19wYSgodWludCkoZmVwLT5yeF9iZF9iYXNlKSk7CisJZmVjcC0+ZmVjX3hfZGVzX3N0YXJ0ID0gX19wYSgodWludCkoZmVwLT50eF9iZF9iYXNlKSk7CisKKwkvKiBJbnN0YWxsIG91ciBpbnRlcnJ1cHQgaGFuZGxlcnMuIFRoaXMgdmFyaWVzIGRlcGVuZGluZyBvbgorCSAqIHRoZSBhcmNoaXRlY3R1cmUuCisJKi8KKwlmZWNfcmVxdWVzdF9pbnRycyhkZXYpOworCisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylmZWNwOworCisJLyogVGhlIEZFQyBFdGhlcm5ldCBzcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9IGZlY19lbmV0X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBmZWNfZW5ldF9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dCA9IGZlY190aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCWRldi0+c3RvcCA9IGZlY19lbmV0X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gZmVjX2VuZXRfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2V0X211bHRpY2FzdF9saXN0OworCisJZm9yIChpPTA7IGk8Tk1JSS0xOyBpKyspCisJCW1paV9jbWRzW2ldLm1paV9uZXh0ID0gJm1paV9jbWRzW2krMV07CisJbWlpX2ZyZWUgPSBtaWlfY21kczsKKworCS8qIHNldHVwIE1JSSBpbnRlcmZhY2UgKi8KKwlmZWNfc2V0X21paShkZXYsIGZlcCk7CisKKwlwcmludGsoIiVzOiBGRUMgRU5FVCBWZXJzaW9uIDAuMiwgIiwgZGV2LT5uYW1lKTsKKwlmb3IgKGk9MDsgaTw1OyBpKyspCisJCXByaW50aygiJTAyeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiUwMnhcbiIsIGRldi0+ZGV2X2FkZHJbNV0pOworCisJLyogUXVldWUgdXAgY29tbWFuZCB0byBkZXRlY3QgdGhlIFBIWSBhbmQgaW5pdGlhbGl6ZSB0aGUKKwkgKiByZW1haW5kZXIgb2YgdGhlIGludGVyZmFjZS4KKwkgKi8KKwlmZXAtPnBoeV9pZF9kb25lID0gMDsKKwlmZXAtPnBoeV9hZGRyID0gMDsKKwltaWlfcXVldWUoZGV2LCBta19taWlfcmVhZChNSUlfUkVHX1BIWUlSMSksIG1paV9kaXNjb3Zlcl9waHkpOworCisJaW5kZXgrKzsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3RhcnQgb3IgcmVzdGFydCB0aGUgRkVDIGR1cmluZyBhIGxpbmsKKyAqIGNoYW5nZS4gIFRoaXMgb25seSBoYXBwZW5zIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gaGFsZiBhbmQgZnVsbAorICogZHVwbGV4LgorICovCitzdGF0aWMgdm9pZAorZmVjX3Jlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGR1cGxleCkKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwOworCXZvbGF0aWxlIGNiZF90ICpiZHA7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3A7CisJaW50IGk7CisKKwlmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWZlY3AgPSBmZXAtPmh3cDsKKworCS8qIFdoYWNrIGEgcmVzZXQuICBXZSBzaG91bGQgd2FpdCBmb3IgdGhpcy4KKwkqLworCWZlY3AtPmZlY19lY250cmwgPSAxOworCXVkZWxheSgxMCk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyB3ZSB3aXNoIHRvIHNlcnZpY2UuCisJKi8KKwlmZWNwLT5mZWNfaW1hc2sgPSAoRkVDX0VORVRfVFhGIHwgRkVDX0VORVRfVFhCIHwKKwkJCQlGRUNfRU5FVF9SWEYgfCBGRUNfRU5FVF9SWEIgfCBGRUNfRU5FVF9NSUkpOworCisJLyogQ2xlYXIgYW55IG91dHN0YW5kaW5nIGludGVycnVwdC4KKwkqLworCWZlY3AtPmZlY19pZXZlbnQgPSAweGZmYzA7CisJZmVjX2VuYWJsZV9waHlfaW50cigpOworCisJLyogU2V0IHN0YXRpb24gYWRkcmVzcy4KKwkqLworCWZlY3AtPmZlY19hZGRyX2xvdyA9IGZlcC0+bWFjX2FkZHJbM10gfCAoZmVwLT5tYWNfYWRkclsyXSA8PCA4KSB8CisJCShmZXAtPm1hY19hZGRyWzFdIDw8IDE2KSB8IChmZXAtPm1hY19hZGRyWzBdIDw8IDI0KTsKKwlmZWNwLT5mZWNfYWRkcl9oaWdoID0gKGZlcC0+bWFjX2FkZHJbNV0gPDwgMTYpIHwKKwkJKGZlcC0+bWFjX2FkZHJbNF0gPDwgMjQpOworCisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGZlcC0+bWFjX2FkZHJbaV07CisKKwkvKiBSZXNldCBhbGwgbXVsdGljYXN0LgorCSovCisJZmVjcC0+ZmVjX2hhc2hfdGFibGVfaGlnaCA9IDA7CisJZmVjcC0+ZmVjX2hhc2hfdGFibGVfbG93ID0gMDsKKworCS8qIFNldCBtYXhpbXVtIHJlY2VpdmUgYnVmZmVyIHNpemUuCisJKi8KKwlmZWNwLT5mZWNfcl9idWZmX3NpemUgPSBQS1RfTUFYQkxSX1NJWkU7CisKKwlmZWNfbG9jYWxod19zZXR1cCgpOworCisJLyogU2V0IHJlY2VpdmUgYW5kIHRyYW5zbWl0IGRlc2NyaXB0b3IgYmFzZS4KKwkqLworCWZlY3AtPmZlY19yX2Rlc19zdGFydCA9IF9fcGEoKHVpbnQpKGZlcC0+cnhfYmRfYmFzZSkpOworCWZlY3AtPmZlY194X2Rlc19zdGFydCA9IF9fcGEoKHVpbnQpKGZlcC0+dHhfYmRfYmFzZSkpOworCisJZmVwLT5kaXJ0eV90eCA9IGZlcC0+Y3VyX3R4ID0gZmVwLT50eF9iZF9iYXNlOworCWZlcC0+Y3VyX3J4ID0gZmVwLT5yeF9iZF9iYXNlOworCisJLyogUmVzZXQgU0tCIHRyYW5zbWl0IGJ1ZmZlcnMuCisJKi8KKwlmZXAtPnNrYl9jdXIgPSBmZXAtPnNrYl9kaXJ0eSA9IDA7CisJZm9yIChpPTA7IGk8PVRYX1JJTkdfTU9EX01BU0s7IGkrKykgeworCQlpZiAoZmVwLT50eF9za2J1ZmZbaV0gIT0gTlVMTCkgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoZmVwLT50eF9za2J1ZmZbaV0pOworCQkJZmVwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZSBidWZmZXIgZGVzY3JpcHRvcnMuCisJKi8KKwliZHAgPSBmZXAtPnJ4X2JkX2Jhc2U7CisJZm9yIChpPTA7IGk8UlhfUklOR19TSVpFOyBpKyspIHsKKworCQkvKiBJbml0aWFsaXplIHRoZSBCRCBmb3IgZXZlcnkgZnJhZ21lbnQgaW4gdGhlIHBhZ2UuCisJCSovCisJCWJkcC0+Y2JkX3NjID0gQkRfRU5FVF9SWF9FTVBUWTsKKwkJYmRwKys7CisJfQorCisJLyogU2V0IHRoZSBsYXN0IGJ1ZmZlciB0byB3cmFwLgorCSovCisJYmRwLS07CisJYmRwLT5jYmRfc2MgfD0gQkRfU0NfV1JBUDsKKworCS8qIC4uLmFuZCB0aGUgc2FtZSBmb3IgdHJhbnNtbWl0LgorCSovCisJYmRwID0gZmVwLT50eF9iZF9iYXNlOworCWZvciAoaT0wOyBpPFRYX1JJTkdfU0laRTsgaSsrKSB7CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgQkQgZm9yIGV2ZXJ5IGZyYWdtZW50IGluIHRoZSBwYWdlLgorCQkqLworCQliZHAtPmNiZF9zYyA9IDA7CisJCWJkcC0+Y2JkX2J1ZmFkZHIgPSAwOworCQliZHArKzsKKwl9CisKKwkvKiBTZXQgdGhlIGxhc3QgYnVmZmVyIHRvIHdyYXAuCisJKi8KKwliZHAtLTsKKwliZHAtPmNiZF9zYyB8PSBCRF9TQ19XUkFQOworCisJLyogRW5hYmxlIE1JSSBtb2RlLgorCSovCisJaWYgKGR1cGxleCkgeworCQlmZWNwLT5mZWNfcl9jbnRybCA9IE9QVF9GUkFNRV9TSVpFIHwgMHgwNDsvKiBNSUkgZW5hYmxlICovCisJCWZlY3AtPmZlY194X2NudHJsID0gMHgwNDsJCSAgLyogRkQgZW5hYmxlICovCisJfQorCWVsc2UgeworCQkvKiBNSUkgZW5hYmxlfE5vIFJjdiBvbiBYbWl0ICovCisJCWZlY3AtPmZlY19yX2NudHJsID0gT1BUX0ZSQU1FX1NJWkUgfCAweDA2OworCQlmZWNwLT5mZWNfeF9jbnRybCA9IDB4MDA7CisJfQorCWZlcC0+ZnVsbF9kdXBsZXggPSBkdXBsZXg7CisKKwkvKiBTZXQgTUlJIHNwZWVkLgorCSovCisJZmVjcC0+ZmVjX21paV9zcGVlZCA9IGZlcC0+cGh5X3NwZWVkOworCisJLyogQW5kIGxhc3QsIGVuYWJsZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcHJvY2Vzc2luZy4KKwkqLworCWZlY3AtPmZlY19lY250cmwgPSAyOworCWZlY3AtPmZlY19yX2Rlc19hY3RpdmUgPSAweDAxMDAwMDAwOworfQorCitzdGF0aWMgdm9pZAorZmVjX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl2b2xhdGlsZSBmZWNfdCAqZmVjcDsKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwOworCisJZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlmZWNwID0gZmVwLT5od3A7CisKKwlmZWNwLT5mZWNfeF9jbnRybCA9IDB4MDE7CS8qIEdyYWNlZnVsIHRyYW5zbWl0IHN0b3AgKi8KKworCXdoaWxlKCEoZmVjcC0+ZmVjX2lldmVudCAmIDB4MTAwMDAwMDApKTsKKworCS8qIFdoYWNrIGEgcmVzZXQuICBXZSBzaG91bGQgd2FpdCBmb3IgdGhpcy4KKwkqLworCWZlY3AtPmZlY19lY250cmwgPSAxOworCXVkZWxheSgxMCk7CisKKwkvKiBDbGVhciBvdXRzdGFuZGluZyBNSUkgY29tbWFuZCBpbnRlcnJ1cHRzLgorCSovCisJZmVjcC0+ZmVjX2lldmVudCA9IEZFQ19FTkVUX01JSTsKKwlmZWNfZW5hYmxlX3BoeV9pbnRyKCk7CisKKwlmZWNwLT5mZWNfaW1hc2sgPSBGRUNfRU5FVF9NSUk7CisJZmVjcC0+ZmVjX21paV9zcGVlZCA9IGZlcC0+cGh5X3NwZWVkOworfQorCitzdGF0aWMgaW50IF9faW5pdCBmZWNfZW5ldF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGksIGVycjsKKworCWZvciAoaSA9IDA7IChpIDwgRkVDX01BWF9QT1JUUyk7IGkrKykgeworCQlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGZlY19lbmV0X3ByaXZhdGUpKTsKKwkJaWYgKCFkZXYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZXJyID0gZmVjX2VuZXRfaW5pdChkZXYpOworCQlpZiAoZXJyKSB7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwkJCS8qIFhYWDogbWlzc2luZyBjbGVhbnVwIGhlcmUgKi8KKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoZmVjX2VuZXRfbW9kdWxlX2luaXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWMuaCBiL2RyaXZlcnMvbmV0L2ZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZTRmOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9mZWMuaApAQCAtMCwwICsxLDE2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglmZWMuaCAgLS0gIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciBmb3IgTW90b3JvbGEgQ29sZEZpcmUgNTI3MCwKKwkJICAgNTI3MSwgNTI3MiwgNTI3NCwgNTI3NSwgNTI4MCBhbmQgNTI4Mi4KKyAqCisgKgkoQykgQ29weXJpZ2h0IDIwMDAtMjAwMywgR3JlZyBVbmdlcmVyIChnZXJnQHNuYXBnZWFyLmNvbSkKKyAqCShDKSBDb3B5cmlnaHQgMjAwMC0yMDAxLCBMaW5lbyAod3d3LmxpbmVvLmNvbSkKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgRkVDX0gKKyNkZWZpbmUJRkVDX0gKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChDT05GSUdfTTUyN3gpIHx8IGRlZmluZWQoQ09ORklHX001Mjh4KQorLyoKKyAqCUp1c3QgZmlndXJlcywgTW90b3JvbGEgd291bGQgaGF2ZSB0byBjaGFuZ2UgdGhlIG9mZnNldHMgZm9yCisgKglyZWdpc3RlcnMgaW4gdGhlIHNhbWUgcGVyaXBoZXJhbCBkZXZpY2Ugb24gZGlmZmVyZW50IG1vZGVscworICoJb2YgdGhlIENvbGRGaXJlIQorICovCit0eXBlZGVmIHN0cnVjdCBmZWMgeworCXVuc2lnbmVkIGxvbmcJZmVjX3Jlc2VydmVkMDsKKwl1bnNpZ25lZCBsb25nCWZlY19pZXZlbnQ7CQkvKiBJbnRlcnJ1cHQgZXZlbnQgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfaW1hc2s7CQkvKiBJbnRlcnJ1cHQgbWFzayByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yZXNlcnZlZDE7CisJdW5zaWduZWQgbG9uZwlmZWNfcl9kZXNfYWN0aXZlOwkvKiBSZWNlaXZlIGRlc2NyaXB0b3IgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfeF9kZXNfYWN0aXZlOwkvKiBUcmFuc21pdCBkZXNjcmlwdG9yIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3Jlc2VydmVkMlszXTsKKwl1bnNpZ25lZCBsb25nCWZlY19lY250cmw7CQkvKiBFdGhlcm5ldCBjb250cm9sIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3Jlc2VydmVkM1s2XTsKKwl1bnNpZ25lZCBsb25nCWZlY19taWlfZGF0YTsJCS8qIE1JSSBtYW5hZ2UgZnJhbWUgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfbWlpX3NwZWVkOwkJLyogTUlJIHNwZWVkIGNvbnRyb2wgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfcmVzZXJ2ZWQ0WzddOworCXVuc2lnbmVkIGxvbmcJZmVjX21pYl9jdHJsc3RhdDsJLyogTUlCIGNvbnRyb2wvc3RhdHVzIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3Jlc2VydmVkNVs3XTsKKwl1bnNpZ25lZCBsb25nCWZlY19yX2NudHJsOwkJLyogUmVjZWl2ZSBjb250cm9sIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3Jlc2VydmVkNlsxNV07CisJdW5zaWduZWQgbG9uZwlmZWNfeF9jbnRybDsJCS8qIFRyYW5zbWl0IENvbnRyb2wgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfcmVzZXJ2ZWQ3WzddOworCXVuc2lnbmVkIGxvbmcJZmVjX2FkZHJfbG93OwkJLyogTG93IDMyYml0cyBNQUMgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX2FkZHJfaGlnaDsJCS8qIEhpZ2ggMTZiaXRzIE1BQyBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZwlmZWNfb3BkOwkJLyogT3Bjb2RlICsgUGF1c2UgZHVyYXRpb24gKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yZXNlcnZlZDhbMTBdOworCXVuc2lnbmVkIGxvbmcJZmVjX2hhc2hfdGFibGVfaGlnaDsJLyogSGlnaCAzMmJpdHMgaGFzaCB0YWJsZSAqLworCXVuc2lnbmVkIGxvbmcJZmVjX2hhc2hfdGFibGVfbG93OwkvKiBMb3cgMzJiaXRzIGhhc2ggdGFibGUgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19ncnBfaGFzaF90YWJsZV9oaWdoOy8qIEhpZ2ggMzJiaXRzIGhhc2ggdGFibGUgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19ncnBfaGFzaF90YWJsZV9sb3c7CS8qIExvdyAzMmJpdHMgaGFzaCB0YWJsZSAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3Jlc2VydmVkOVs3XTsKKwl1bnNpZ25lZCBsb25nCWZlY194X3dtcms7CQkvKiBGSUZPIHRyYW5zbWl0IHdhdGVyIG1hcmsgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yZXNlcnZlZDEwOworCXVuc2lnbmVkIGxvbmcJZmVjX3JfYm91bmQ7CQkvKiBGSUZPIHJlY2VpdmUgYm91bmQgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfcl9mc3RhcnQ7CQkvKiBGSUZPIHJlY2VpdmUgc3RhcnQgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfcmVzZXJ2ZWQxMVsxMV07CisJdW5zaWduZWQgbG9uZwlmZWNfcl9kZXNfc3RhcnQ7CS8qIFJlY2VpdmUgZGVzY3JpcHRvciByaW5nICovCisJdW5zaWduZWQgbG9uZwlmZWNfeF9kZXNfc3RhcnQ7CS8qIFRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3JfYnVmZl9zaXplOwkvKiBNYXhpbXVtIHJlY2VpdmUgYnVmZiBzaXplICovCit9IGZlY190OworCisjZWxzZQorCisvKgorICoJRGVmaW5lIGRldmljZSByZWdpc3RlciBzZXQgYWRkcmVzcyBtYXAuCisgKi8KK3R5cGVkZWYgc3RydWN0IGZlYyB7CisJdW5zaWduZWQgbG9uZwlmZWNfZWNudHJsOwkJLyogRXRoZXJuZXQgY29udHJvbCByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19pZXZlbnQ7CQkvKiBJbnRlcnJ1cHQgZXZlbiByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19pbWFzazsJCS8qIEludGVycnVwdCBtYXNrIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX2l2ZWM7CQkvKiBJbnRlcnJ1cHQgdmVjIHN0YXR1cyByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yX2Rlc19hY3RpdmU7CS8qIFJlY2VpdmUgZGVzY3JpcHRvciByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY194X2Rlc19hY3RpdmU7CS8qIFRyYW5zbWl0IGRlc2NyaXB0b3IgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfcmVzZXJ2ZWQxWzEwXTsKKwl1bnNpZ25lZCBsb25nCWZlY19taWlfZGF0YTsJCS8qIE1JSSBtYW5hZ2UgZnJhbWUgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfbWlpX3NwZWVkOwkJLyogTUlJIHNwZWVkIGNvbnRyb2wgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfcmVzZXJ2ZWQyWzE3XTsKKwl1bnNpZ25lZCBsb25nCWZlY19yX2JvdW5kOwkJLyogRklGTyByZWNlaXZlIGJvdW5kIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3JfZnN0YXJ0OwkJLyogRklGTyByZWNlaXZlIHN0YXJ0IHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3Jlc2VydmVkM1s0XTsKKwl1bnNpZ25lZCBsb25nCWZlY194X3dtcms7CQkvKiBGSUZPIHRyYW5zbWl0IHdhdGVyIG1hcmsgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yZXNlcnZlZDQ7CisJdW5zaWduZWQgbG9uZwlmZWNfeF9mc3RhcnQ7CQkvKiBGSUZPIHRyYW5zbWl0IHN0YXJ0IHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3Jlc2VydmVkNVsyMV07CisJdW5zaWduZWQgbG9uZwlmZWNfcl9jbnRybDsJCS8qIFJlY2VpdmUgY29udHJvbCByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19tYXhfZnJtX2xlbjsJLyogTWF4aW11bSBmcmFtZSBsZW5ndGggcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfcmVzZXJ2ZWQ2WzE0XTsKKwl1bnNpZ25lZCBsb25nCWZlY194X2NudHJsOwkJLyogVHJhbnNtaXQgQ29udHJvbCByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yZXNlcnZlZDdbMTU4XTsKKwl1bnNpZ25lZCBsb25nCWZlY19hZGRyX2xvdzsJCS8qIExvdyAzMmJpdHMgTUFDIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19hZGRyX2hpZ2g7CQkvKiBIaWdoIDE2Yml0cyBNQUMgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX2hhc2hfdGFibGVfaGlnaDsJLyogSGlnaCAzMmJpdHMgaGFzaCB0YWJsZSAqLworCXVuc2lnbmVkIGxvbmcJZmVjX2hhc2hfdGFibGVfbG93OwkvKiBMb3cgMzJiaXRzIGhhc2ggdGFibGUgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yX2Rlc19zdGFydDsJLyogUmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY194X2Rlc19zdGFydDsJLyogVHJhbnNtaXQgZGVzY3JpcHRvciByaW5nICovCisJdW5zaWduZWQgbG9uZwlmZWNfcl9idWZmX3NpemU7CS8qIE1heGltdW0gcmVjZWl2ZSBidWZmIHNpemUgKi8KKwl1bnNpZ25lZCBsb25nCXJlc2VydmVkOFs5XTsKKwl1bnNpZ25lZCBsb25nCWZlY19maWZvX3JhbVsxMTJdOwkvKiBGSUZPIFJBTSBidWZmZXIgKi8KK30gZmVjX3Q7CisKKyNlbmRpZiAvKiBDT05GSUdfTTUyNzIgKi8KKworCisvKgorICoJRGVmaW5lIHRoZSBidWZmZXIgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGJ1ZmRlc2MgeworCXVuc2lnbmVkIHNob3J0CWNiZF9zYzsJCQkvKiBDb250cm9sIGFuZCBzdGF0dXMgaW5mbyAqLworCXVuc2lnbmVkIHNob3J0CWNiZF9kYXRsZW47CQkvKiBEYXRhIGxlbmd0aCAqLworCXVuc2lnbmVkIGxvbmcJY2JkX2J1ZmFkZHI7CQkvKiBCdWZmZXIgYWRkcmVzcyAqLworfSBjYmRfdDsKKworCisvKgorICoJVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBjb3VydGVzeSBvZiBjb21tcHJvYy5oLCB3aGljaCB3aGVyZQorICoJQ29weXJpZ2h0IChjKSAxOTk3IERhbiBNYWxlayAoZG1hbGVrQGpsYy5uZXQpLgorICovCisjZGVmaW5lIEJEX1NDX0VNUFRZICAgICAoKHVzaG9ydCkweDgwMDApICAgICAgICAvKiBSZWNpZXZlIGlzIGVtcHR5ICovCisjZGVmaW5lIEJEX1NDX1JFQURZICAgICAoKHVzaG9ydCkweDgwMDApICAgICAgICAvKiBUcmFuc21pdCBpcyByZWFkeSAqLworI2RlZmluZSBCRF9TQ19XUkFQICAgICAgKCh1c2hvcnQpMHgyMDAwKSAgICAgICAgLyogTGFzdCBidWZmZXIgZGVzY3JpcHRvciAqLworI2RlZmluZSBCRF9TQ19JTlRSUFQgICAgKCh1c2hvcnQpMHgxMDAwKSAgICAgICAgLyogSW50ZXJydXB0IG9uIGNoYW5nZSAqLworI2RlZmluZSBCRF9TQ19DTSAgICAgICAgKCh1c2hvcnQpMHgwMjAwKSAgICAgICAgLyogQ29udGlub3VzIG1vZGUgKi8KKyNkZWZpbmUgQkRfU0NfSUQgICAgICAgICgodXNob3J0KTB4MDEwMCkgICAgICAgIC8qIFJlYydkIHRvbyBtYW55IGlkbGVzICovCisjZGVmaW5lIEJEX1NDX1AgICAgICAgICAoKHVzaG9ydCkweDAxMDApICAgICAgICAvKiB4bXQgcHJlYW1ibGUgKi8KKyNkZWZpbmUgQkRfU0NfQlIgICAgICAgICgodXNob3J0KTB4MDAyMCkgICAgICAgIC8qIEJyZWFrIHJlY2VpdmVkICovCisjZGVmaW5lIEJEX1NDX0ZSICAgICAgICAoKHVzaG9ydCkweDAwMTApICAgICAgICAvKiBGcmFtaW5nIGVycm9yICovCisjZGVmaW5lIEJEX1NDX1BSICAgICAgICAoKHVzaG9ydCkweDAwMDgpICAgICAgICAvKiBQYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgQkRfU0NfT1YgICAgICAgICgodXNob3J0KTB4MDAwMikgICAgICAgIC8qIE92ZXJydW4gKi8KKyNkZWZpbmUgQkRfU0NfQ0QgICAgICAgICgodXNob3J0KTB4MDAwMSkgICAgICAgIC8qID8/ICovCisKKy8qIEJ1ZmZlciBkZXNjcmlwdG9yIGNvbnRyb2wvc3RhdHVzIHVzZWQgYnkgRXRoZXJuZXQgcmVjZWl2ZS4KKyovCisjZGVmaW5lIEJEX0VORVRfUlhfRU1QVFkgICAgICAgICgodXNob3J0KTB4ODAwMCkKKyNkZWZpbmUgQkRfRU5FVF9SWF9XUkFQICAgICAgICAgKCh1c2hvcnQpMHgyMDAwKQorI2RlZmluZSBCRF9FTkVUX1JYX0lOVFIgICAgICAgICAoKHVzaG9ydCkweDEwMDApCisjZGVmaW5lIEJEX0VORVRfUlhfTEFTVCAgICAgICAgICgodXNob3J0KTB4MDgwMCkKKyNkZWZpbmUgQkRfRU5FVF9SWF9GSVJTVCAgICAgICAgKCh1c2hvcnQpMHgwNDAwKQorI2RlZmluZSBCRF9FTkVUX1JYX01JU1MgICAgICAgICAoKHVzaG9ydCkweDAxMDApCisjZGVmaW5lIEJEX0VORVRfUlhfTEcgICAgICAgICAgICgodXNob3J0KTB4MDAyMCkKKyNkZWZpbmUgQkRfRU5FVF9SWF9OTyAgICAgICAgICAgKCh1c2hvcnQpMHgwMDEwKQorI2RlZmluZSBCRF9FTkVUX1JYX1NIICAgICAgICAgICAoKHVzaG9ydCkweDAwMDgpCisjZGVmaW5lIEJEX0VORVRfUlhfQ1IgICAgICAgICAgICgodXNob3J0KTB4MDAwNCkKKyNkZWZpbmUgQkRfRU5FVF9SWF9PViAgICAgICAgICAgKCh1c2hvcnQpMHgwMDAyKQorI2RlZmluZSBCRF9FTkVUX1JYX0NMICAgICAgICAgICAoKHVzaG9ydCkweDAwMDEpCisjZGVmaW5lIEJEX0VORVRfUlhfU1RBVFMgICAgICAgICgodXNob3J0KTB4MDEzZikgICAgICAgIC8qIEFsbCBzdGF0dXMgYml0cyAqLworCisvKiBCdWZmZXIgZGVzY3JpcHRvciBjb250cm9sL3N0YXR1cyB1c2VkIGJ5IEV0aGVybmV0IHRyYW5zbWl0LgorKi8KKyNkZWZpbmUgQkRfRU5FVF9UWF9SRUFEWSAgICAgICAgKCh1c2hvcnQpMHg4MDAwKQorI2RlZmluZSBCRF9FTkVUX1RYX1BBRCAgICAgICAgICAoKHVzaG9ydCkweDQwMDApCisjZGVmaW5lIEJEX0VORVRfVFhfV1JBUCAgICAgICAgICgodXNob3J0KTB4MjAwMCkKKyNkZWZpbmUgQkRfRU5FVF9UWF9JTlRSICAgICAgICAgKCh1c2hvcnQpMHgxMDAwKQorI2RlZmluZSBCRF9FTkVUX1RYX0xBU1QgICAgICAgICAoKHVzaG9ydCkweDA4MDApCisjZGVmaW5lIEJEX0VORVRfVFhfVEMgICAgICAgICAgICgodXNob3J0KTB4MDQwMCkKKyNkZWZpbmUgQkRfRU5FVF9UWF9ERUYgICAgICAgICAgKCh1c2hvcnQpMHgwMjAwKQorI2RlZmluZSBCRF9FTkVUX1RYX0hCICAgICAgICAgICAoKHVzaG9ydCkweDAxMDApCisjZGVmaW5lIEJEX0VORVRfVFhfTEMgICAgICAgICAgICgodXNob3J0KTB4MDA4MCkKKyNkZWZpbmUgQkRfRU5FVF9UWF9STCAgICAgICAgICAgKCh1c2hvcnQpMHgwMDQwKQorI2RlZmluZSBCRF9FTkVUX1RYX1JDTUFTSyAgICAgICAoKHVzaG9ydCkweDAwM2MpCisjZGVmaW5lIEJEX0VORVRfVFhfVU4gICAgICAgICAgICgodXNob3J0KTB4MDAwMikKKyNkZWZpbmUgQkRfRU5FVF9UWF9DU0wgICAgICAgICAgKCh1c2hvcnQpMHgwMDAxKQorI2RlZmluZSBCRF9FTkVUX1RYX1NUQVRTICAgICAgICAoKHVzaG9ydCkweDAzZmYpICAgICAgICAvKiBBbGwgc3RhdHVzIGJpdHMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZiAvKiBGRUNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZmVjXzh4eC9LY29uZmlnIGIvZHJpdmVycy9uZXQvZmVjXzh4eC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMzZhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9mZWNfOHh4L0tjb25maWcKQEAgLTAsMCArMSwxNCBAQAorY29uZmlnIEZFQ184WFgKKwl0cmlzdGF0ZSAiTW90b3JvbGEgOHh4IEZFQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgOHh4ICYmIChORVRUQSB8fCBORVRQSE9ORSkKKwlzZWxlY3QgTUlJCisKK2NvbmZpZyBGRUNfOFhYX0dFTkVSSUNfUEhZCisJYm9vbCAiU3VwcG9ydCBhbnkgZ2VuZXJpYyBQSFkiCisJZGVwZW5kcyBvbiBGRUNfOFhYCisJZGVmYXVsdCB5CisKK2NvbmZpZyBGRUNfOFhYX0RNOTE2MV9QSFkKKwlib29sICJTdXBwb3J0IERNOTE2MSBQSFkiCisJZGVwZW5kcyBvbiBGRUNfOFhYCisJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWNfOHh4L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZmVjXzh4eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGM1NGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZmVjXzh4eC9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTW90b3JvbGEgOHh4IEZFQyBldGhlcm5ldCBjb250cm9sbGVyCisjCisKK29iai0kKENPTkZJR19GRUNfOFhYKSArPSBmZWNfOHh4Lm8KKworZmVjXzh4eC1vYmpzIDo9IGZlY19tYWluLm8gZmVjX21paS5vCisKKyMgdGhlIHBsYXRmb3JtIGluc3RhbnRhdGlhdGlvbiBvYmplY3RzCitpZmVxICgkKENPTkZJR19ORVRUQSkseSkKK2ZlY184eHgtb2JqcwkrPSBmZWNfOHh4LW5ldHRhLm8KK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWNfOHh4L2ZlY184eHgtbmV0dGEuYyBiL2RyaXZlcnMvbmV0L2ZlY184eHgvZmVjXzh4eC1uZXR0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YzI3NWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9mZWNfOHh4L2ZlY184eHgtbmV0dGEuYwpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIEZFQyBpbnN0YW50YXRpYXRpb24gZmlsZSBmb3IgTkVUVEEKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vOHh4X2ltbWFwLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vbXBjOHh4Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2NvbW1wcm9jLmg+CisKKyNpbmNsdWRlICJmZWNfOHh4LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IGZlY19wbGF0Zm9ybV9pbmZvIGZlYzFfaW5mbyA9IHsKKwkuZmVjX25vID0gMCwKKwkudXNlX21kaW8gPSAxLAorCS5waHlfYWRkciA9IDgsCisJLmZlY19pcnEgPSBTSVVfTEVWRUwxLAorCS5waHlfaXJxID0gQ1BNX0lSUV9PRkZTRVQgKyBDUE1WRUNfUElPX1BDNiwKKwkucnhfcmluZyA9IDEyOCwKKwkudHhfcmluZyA9IDE2LAorCS5yeF9jb3B5YnJlYWsgPSAyNDAsCisJLnVzZV9uYXBpID0gMSwKKwkubmFwaV93ZWlnaHQgPSAxNywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmVjX3BsYXRmb3JtX2luZm8gZmVjMl9pbmZvID0geworCS5mZWNfbm8gPSAxLAorCS51c2VfbWRpbyA9IDEsCisJLnBoeV9hZGRyID0gMiwKKwkuZmVjX2lycSA9IFNJVV9MRVZFTDMsCisJLnBoeV9pcnEgPSBDUE1fSVJRX09GRlNFVCArIENQTVZFQ19QSU9fUEM3LAorCS5yeF9yaW5nID0gMTI4LAorCS50eF9yaW5nID0gMTYsCisJLnJ4X2NvcHlicmVhayA9IDI0MCwKKwkudXNlX25hcGkgPSAxLAorCS5uYXBpX3dlaWdodCA9IDE3LAorfTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpmZWMxX2RldjsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZmVjMl9kZXY7CisKKy8qIFhYWCBjdXN0b20gdS1ib290ICYgTGludXggc3RhcnR1cCBuZWVkZWQgKi8KK2V4dGVybiBjb25zdCBjaGFyICpfX2Z3X2dldGVudihjb25zdCBjaGFyICp2YXIpOworCisvKiBhY2Nlc3MgcG9ydHMgKi8KKyNkZWZpbmUgc2V0Yml0czMyKF9hZGRyLCBfdikgX19mZWNfb3V0MzIoJihfYWRkciksIF9fZmVjX2luMzIoJihfYWRkcikpIHwgIChfdikpCisjZGVmaW5lIGNscmJpdHMzMihfYWRkciwgX3YpIF9fZmVjX291dDMyKCYoX2FkZHIpLCBfX2ZlY19pbjMyKCYoX2FkZHIpKSAmIH4oX3YpKQorCisjZGVmaW5lIHNldGJpdHMxNihfYWRkciwgX3YpIF9fZmVjX291dDE2KCYoX2FkZHIpLCBfX2ZlY19pbjE2KCYoX2FkZHIpKSB8ICAoX3YpKQorI2RlZmluZSBjbHJiaXRzMTYoX2FkZHIsIF92KSBfX2ZlY19vdXQxNigmKF9hZGRyKSwgX19mZWNfaW4xNigmKF9hZGRyKSkgJiB+KF92KSkKKworaW50IGZlY184eHhfcGxhdGZvcm1faW5pdCh2b2lkKQoreworCWltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilJTUFQX0FERFI7CisJYmRfdCAqYmQgPSAoYmRfdCAqKSBfX3JlczsKKwljb25zdCBjaGFyICpzOworCWNoYXIgKmU7CisJaW50IGk7CisKKwkvKiB1c2UgTURDIGZvciBNSUkgKi8KKwlzZXRiaXRzMTYoaW1tYXAtPmltX2lvcG9ydC5pb3BfcGRwYXIsIDB4MDA4MCk7CisJY2xyYml0czE2KGltbWFwLT5pbV9pb3BvcnQuaW9wX3BkZGlyLCAweDAwODApOworCisJLyogY29uZmlndXJlIEZFQzEgcGlucyAqLworCXNldGJpdHMxNihpbW1hcC0+aW1faW9wb3J0LmlvcF9wYXBhciwgMHhlODEwKTsKKwlzZXRiaXRzMTYoaW1tYXAtPmltX2lvcG9ydC5pb3BfcGFkaXIsIDB4MDgxMCk7CisJY2xyYml0czE2KGltbWFwLT5pbV9pb3BvcnQuaW9wX3BhZGlyLCAweGUwMDApOworCisJc2V0Yml0czMyKGltbWFwLT5pbV9jcG0uY3BfcGJwYXIsIDB4MDAwMDAwMDEpOworCWNscmJpdHMzMihpbW1hcC0+aW1fY3BtLmNwX3BiZGlyLCAweDAwMDAwMDAxKTsKKworCXNldGJpdHMzMihpbW1hcC0+aW1fY3BtLmNwX2NwdHIsIDB4MDAwMDAxMDApOworCWNscmJpdHMzMihpbW1hcC0+aW1fY3BtLmNwX2NwdHIsIDB4MDAwMDAwNTApOworCisJY2xyYml0czE2KGltbWFwLT5pbV9pb3BvcnQuaW9wX3BjcGFyLCAweDAyMDApOworCWNscmJpdHMxNihpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RpciwgMHgwMjAwKTsKKwljbHJiaXRzMTYoaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNzbywgMHgwMjAwKTsKKwlzZXRiaXRzMTYoaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNpbnQsIDB4MDIwMCk7CisKKwkvKiBjb25maWd1cmUgRkVDMiBwaW5zICovCisJc2V0Yml0czMyKGltbWFwLT5pbV9jcG0uY3BfcGVwYXIsIDB4MDAwMzk2MjApOworCXNldGJpdHMzMihpbW1hcC0+aW1fY3BtLmNwX3BlZGlyLCAweDAwMDM5NjIwKTsKKwlzZXRiaXRzMzIoaW1tYXAtPmltX2NwbS5jcF9wZXNvLCAweDAwMDMxMDAwKTsKKwljbHJiaXRzMzIoaW1tYXAtPmltX2NwbS5jcF9wZXNvLCAweDAwMDA4NjIwKTsKKworCXNldGJpdHMzMihpbW1hcC0+aW1fY3BtLmNwX2NwdHIsIDB4MDAwMDAwODApOworCWNscmJpdHMzMihpbW1hcC0+aW1fY3BtLmNwX2NwdHIsIDB4MDAwMDAwMjgpOworCisJY2xyYml0czE2KGltbWFwLT5pbV9pb3BvcnQuaW9wX3BjcGFyLCAweDAyMDApOworCWNscmJpdHMxNihpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RpciwgMHgwMjAwKTsKKwljbHJiaXRzMTYoaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNzbywgMHgwMjAwKTsKKwlzZXRiaXRzMTYoaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNpbnQsIDB4MDIwMCk7CisKKwkvKiBmaWxsIHVwICovCisJZmVjMV9pbmZvLnN5c19jbGsgPSBiZC0+YmlfaW50ZnJlcTsKKwlmZWMyX2luZm8uc3lzX2NsayA9IGJkLT5iaV9pbnRmcmVxOworCisJcyA9IF9fZndfZ2V0ZW52KCJldGhhZGRyIik7CisJaWYgKHMgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQlmZWMxX2luZm8ubWFjYWRkcltpXSA9IHNpbXBsZV9zdHJ0b3VsKHMsICZlLCAxNik7CisJCQlpZiAoKmUpCisJCQkJcyA9IGUgKyAxOworCQl9CisJfQorCisJcyA9IF9fZndfZ2V0ZW52KCJldGgxYWRkciIpOworCWlmIChzICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJZmVjMl9pbmZvLm1hY2FkZHJbaV0gPSBzaW1wbGVfc3RydG91bChzLCAmZSwgMTYpOworCQkJaWYgKCplKQorCQkJCXMgPSBlICsgMTsKKwkJfQorCX0KKworCWZlY184eHhfaW5pdF9vbmUoJmZlYzFfaW5mbywgJmZlYzFfZGV2KTsKKwlmZWNfOHh4X2luaXRfb25lKCZmZWMyX2luZm8sICZmZWMyX2Rldik7CisKKwlyZXR1cm4gZmVjMV9kZXYgIT0gTlVMTCAmJiBmZWMyX2RldiAhPSBOVUxMID8gMCA6IC0xOworfQorCit2b2lkIGZlY184eHhfcGxhdGZvcm1fY2xlYW51cCh2b2lkKQoreworCWlmIChmZWMyX2RldiAhPSBOVUxMKQorCQlmZWNfOHh4X2NsZWFudXBfb25lKGZlYzJfZGV2KTsKKworCWlmIChmZWMxX2RldiAhPSBOVUxMKQorCQlmZWNfOHh4X2NsZWFudXBfb25lKGZlYzFfZGV2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlY184eHgvZmVjXzh4eC5oIGIvZHJpdmVycy9uZXQvZmVjXzh4eC9mZWNfOHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmNjBiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2ZlY184eHgvZmVjXzh4eC5oCkBAIC0wLDAgKzEsMjE4IEBACisjaWZuZGVmIEZFQ184WFhfSAorI2RlZmluZSBGRUNfOFhYX0gKKworI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogSFcgaW5mbyAqLworCisvKiBDUkMgcG9seW5vbWl1bSB1c2VkIGJ5IHRoZSBGRUMgZm9yIHRoZSBtdWx0aWNhc3QgZ3JvdXAgZmlsdGVyaW5nICovCisjZGVmaW5lIEZFQ19DUkNfUE9MWSAgIDB4MDRDMTFEQjcKKworI2RlZmluZSBNSUlfQURWRVJUSVNFX0hBTEYJKEFEVkVSVElTRV8xMDBIQUxGIHwgXAorCQkJCSBBRFZFUlRJU0VfMTBIQUxGIHwgQURWRVJUSVNFX0NTTUEpCisjZGVmaW5lIE1JSV9BRFZFUlRJU0VfQUxMCShBRFZFUlRJU0VfMTAwRlVMTCB8IFwKKwkJCQkgQURWRVJUSVNFXzEwRlVMTCB8IE1JSV9BRFZFUlRJU0VfSEFMRikKKworLyogSW50ZXJydXB0IGV2ZW50cy9tYXNrcy4KKyovCisjZGVmaW5lIEZFQ19FTkVUX0hCRVJSCTB4ODAwMDAwMDBVCS8qIEhlYXJ0YmVhdCBlcnJvciAgICAgICAgICAqLworI2RlZmluZSBGRUNfRU5FVF9CQUJSCTB4NDAwMDAwMDBVCS8qIEJhYmJsaW5nIHJlY2VpdmVyICAgICAgICAqLworI2RlZmluZSBGRUNfRU5FVF9CQUJUCTB4MjAwMDAwMDBVCS8qIEJhYmJsaW5nIHRyYW5zbWl0dGVyICAgICAqLworI2RlZmluZSBGRUNfRU5FVF9HUkEJMHgxMDAwMDAwMFUJLyogR3JhY2VmdWwgc3RvcCBjb21wbGV0ZSAgICovCisjZGVmaW5lIEZFQ19FTkVUX1RYRgkweDA4MDAwMDAwVQkvKiBGdWxsIGZyYW1lIHRyYW5zbWl0dGVkICAgKi8KKyNkZWZpbmUgRkVDX0VORVRfVFhCCTB4MDQwMDAwMDBVCS8qIEEgYnVmZmVyIHdhcyB0cmFuc21pdHRlZCAqLworI2RlZmluZSBGRUNfRU5FVF9SWEYJMHgwMjAwMDAwMFUJLyogRnVsbCBmcmFtZSByZWNlaXZlZCAgICAgICovCisjZGVmaW5lIEZFQ19FTkVUX1JYQgkweDAxMDAwMDAwVQkvKiBBIGJ1ZmZlciB3YXMgcmVjZWl2ZWQgICAgKi8KKyNkZWZpbmUgRkVDX0VORVRfTUlJCTB4MDA4MDAwMDBVCS8qIE1JSSBpbnRlcnJ1cHQgICAgICAgICAgICAqLworI2RlZmluZSBGRUNfRU5FVF9FQkVSUgkweDAwNDAwMDAwVQkvKiBTRE1BIGJ1cyBlcnJvciAgICAgICAgICAgKi8KKworI2RlZmluZSBGRUNfRUNOVFJMX1BJTk1VWAkweDAwMDAwMDA0CisjZGVmaW5lIEZFQ19FQ05UUkxfRVRIRVJfRU4JMHgwMDAwMDAwMgorI2RlZmluZSBGRUNfRUNOVFJMX1JFU0VUCTB4MDAwMDAwMDEKKworI2RlZmluZSBGRUNfUkNOVFJMX0JDX1JFSgkweDAwMDAwMDEwCisjZGVmaW5lIEZFQ19SQ05UUkxfUFJPTQkJMHgwMDAwMDAwOAorI2RlZmluZSBGRUNfUkNOVFJMX01JSV9NT0RFCTB4MDAwMDAwMDQKKyNkZWZpbmUgRkVDX1JDTlRSTF9EUlQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRkVDX1JDTlRSTF9MT09QCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgRkVDX1RDTlRSTF9GREVOCQkweDAwMDAwMDA0CisjZGVmaW5lIEZFQ19UQ05UUkxfSEJDCQkweDAwMDAwMDAyCisjZGVmaW5lIEZFQ19UQ05UUkxfR1RTCQkweDAwMDAwMDAxCisKKy8qIHZhbHVlcyBmb3IgTUlJIHBoeV9zdGF0dXMgKi8KKworI2RlZmluZSBQSFlfQ09ORl9BTkUJMHgwMDAxCS8qIDEgYXV0by1uZWdvdGlhdGlvbiBlbmFibGVkICAgICAqLworI2RlZmluZSBQSFlfQ09ORl9MT09QCTB4MDAwMgkvKiAxIGxvb3BiYWNrIG1vZGUgZW5hYmxlZCAgICAgICAgKi8KKyNkZWZpbmUgUEhZX0NPTkZfU1BNQVNLCTB4MDBmMAkvKiBtYXNrIGZvciBzcGVlZCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUEhZX0NPTkZfMTBIRFgJMHgwMDEwCS8qIDEwIE1iaXQgaGFsZiBkdXBsZXggc3VwcG9ydGVkICAqLworI2RlZmluZSBQSFlfQ09ORl8xMEZEWAkweDAwMjAJLyogMTAgTWJpdCBmdWxsIGR1cGxleCBzdXBwb3J0ZWQgICovCisjZGVmaW5lIFBIWV9DT05GXzEwMEhEWAkweDAwNDAJLyogMTAwIE1iaXQgaGFsZiBkdXBsZXggc3VwcG9ydGVkICovCisjZGVmaW5lIFBIWV9DT05GXzEwMEZEWAkweDAwODAJLyogMTAwIE1iaXQgZnVsbCBkdXBsZXggc3VwcG9ydGVkICovCisKKyNkZWZpbmUgUEhZX1NUQVRfTElOSwkweDAxMDAJLyogMSB1cCAtIDAgZG93biAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBIWV9TVEFUX0ZBVUxUCTB4MDIwMAkvKiAxIHJlbW90ZSBmYXVsdCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUEhZX1NUQVRfQU5DCTB4MDQwMAkvKiAxIGF1dG8tbmVnb3RpYXRpb24gY29tcGxldGUgICAgKi8KKyNkZWZpbmUgUEhZX1NUQVRfU1BNQVNLCTB4ZjAwMAkvKiBtYXNrIGZvciBzcGVlZCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUEhZX1NUQVRfMTBIRFgJMHgxMDAwCS8qIDEwIE1iaXQgaGFsZiBkdXBsZXggc2VsZWN0ZWQgICAqLworI2RlZmluZSBQSFlfU1RBVF8xMEZEWAkweDIwMDAJLyogMTAgTWJpdCBmdWxsIGR1cGxleCBzZWxlY3RlZCAgICovCisjZGVmaW5lIFBIWV9TVEFUXzEwMEhEWAkweDQwMDAJLyogMTAwIE1iaXQgaGFsZiBkdXBsZXggc2VsZWN0ZWQgICovCisjZGVmaW5lIFBIWV9TVEFUXzEwMEZEWAkweDgwMDAJLyogMTAwIE1iaXQgZnVsbCBkdXBsZXggc2VsZWN0ZWQgICovCisKK3R5cGVkZWYgc3RydWN0IHBoeV9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJY29uc3QgY2hhciAqbmFtZTsKKwl2b2lkICgqc3RhcnR1cCkgKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KTsKKwl2b2lkICgqc2h1dGRvd24pIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldik7CisJdm9pZCAoKmFja19pbnQpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldik7Cit9IHBoeV9pbmZvX3Q7CisKKy8qIFRoZSBGRUMgc3RvcmVzIGRlc3Qvc3JjL3R5cGUsIGRhdGEsIGFuZCBjaGVja3N1bSBmb3IgcmVjZWl2ZSBwYWNrZXRzLgorICovCisjZGVmaW5lIE1BWF9NVFUgMTUwOAkJLyogQWxsb3cgZnVsbHNpemVkIHBwcG9lIHBhY2tldHMgb3ZlciBWTEFOICovCisjZGVmaW5lIE1JTl9NVFUgNDYJCS8qIHRoaXMgaXMgZGF0YSBzaXplICovCisjZGVmaW5lIENSQ19MRU4gNAorCisjZGVmaW5lIFBLVF9NQVhCVUZfU0laRQkJKE1BWF9NVFUrRVRIX0hMRU4rQ1JDX0xFTikKKyNkZWZpbmUgUEtUX01JTkJVRl9TSVpFCQkoTUlOX01UVStFVEhfSExFTitDUkNfTEVOKQorCisvKiBNdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAqLworI2RlZmluZSBQS1RfTUFYQkxSX1NJWkUJCSgoUEtUX01BWEJVRl9TSVpFKzMpICYgfjMpCisvKiBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IGludmFsaWRhdGVfeHh4IHdvbnQgaW52YWxpZGF0ZSB0b28gbXVjaCAqLworI2RlZmluZSBFTkVUX1JYX0ZSU0laRQkJTDFfQ0FDSEVfQUxJR04oUEtUX01BWEJVRl9TSVpFKQorCisvKiBwbGF0Zm9ybSBpbnRlcmZhY2UgKi8KKworc3RydWN0IGZlY19wbGF0Zm9ybV9pbmZvIHsKKwlpbnQgZmVjX25vOwkJLyogRkVDIGluZGV4ICAgICAgICAgICAgICAgICAgKi8KKwlpbnQgdXNlX21kaW87CQkvKiB1c2UgZXh0ZXJuYWwgTUlJICAgICAgICAgICAqLworCWludCBwaHlfYWRkcjsJCS8qIHRoZSBwaHkgYWRkcmVzcyAgICAgICAgICAgICovCisJaW50IGZlY19pcnEsIHBoeV9pcnE7CS8qIHRoZSBpcnEgZm9yIHRoZSBjb250cm9sbGVyICovCisJaW50IHJ4X3JpbmcsIHR4X3Jpbmc7CS8qIG51bWJlciBvZiBidWZmZXJzIG9uIHJ4ICAgICovCisJaW50IHN5c19jbGs7CQkvKiBzeXN0ZW0gY2xvY2sgICAgICAgICAgICAgICAqLworCV9fdTggbWFjYWRkcls2XTsJLyogbWFjIGFkZHJlc3MgICAgICAgICAgICAgICAgKi8KKwlpbnQgcnhfY29weWJyZWFrOwkvKiBsaW1pdCB3ZSBjb3B5IHNtYWxsIGZyYW1lcyAqLworCWludCB1c2VfbmFwaTsJCS8qIHVzZSBOQVBJICAgICAgICAgICAgICAgICAgICovCisJaW50IG5hcGlfd2VpZ2h0OwkvKiBOQVBJIHdlaWdodCAgICAgICAgICAgICAgICAqLworfTsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RydWN0IGZlYzsKKworc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgeworCXNwaW5sb2NrX3QgbG9jazsJLyogZHVyaW5nIGFsbCBvcHMgZXhjZXB0IFRYIHBja3QgcHJvY2Vzc2luZyAqLworCXNwaW5sb2NrX3QgdHhfbG9jazsJLyogZHVyaW5nIGZlY19zdGFydF94bWl0IGFuZCBmZWNfdHggICAgICAgICAqLworCWludCBmZWNubzsKKwlzdHJ1Y3QgZmVjICpmZWNwOworCWNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1faW5mbyAqZnBpOworCWludCByeF9yaW5nLCB0eF9yaW5nOworCWRtYV9hZGRyX3QgcmluZ19tZW1fYWRkcjsKKwl2b2lkICpyaW5nX2Jhc2U7CisJc3RydWN0IHNrX2J1ZmYgKipyeF9za2J1ZmY7CisJc3RydWN0IHNrX2J1ZmYgKip0eF9za2J1ZmY7CisJY2JkX3QgKnJ4X2JkX2Jhc2U7CS8qIEFkZHJlc3Mgb2YgUnggYW5kIFR4IGJ1ZmZlcnMuICAgICovCisJY2JkX3QgKnR4X2JkX2Jhc2U7CisJY2JkX3QgKmRpcnR5X3R4OwkvKiByaW5nIGVudHJpZXMgdG8gYmUgZnJlZSgpZWQuICAgICAqLworCWNiZF90ICpjdXJfcng7CisJY2JkX3QgKmN1cl90eDsKKwlpbnQgdHhfZnJlZTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBwaHlfdGltZXJfbGlzdDsKKwljb25zdCBzdHJ1Y3QgcGh5X2luZm8gKnBoeTsKKwl1bnNpZ25lZCBpbnQgZmVjX3BoeV9zcGVlZDsKKwlfX3UzMiBtc2dfZW5hYmxlOworCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWlfaWY7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGZlY19yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBkdXBsZXgsIGludCBzcGVlZCk7Cit2b2lkIGZlY19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgZmVjX21paV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7Cit2b2lkIGZlY19taWlfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworCitpbnQgZmVjX21paV9waHlfaWRfZGV0ZWN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBmZWNfbWlpX3N0YXJ0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGZlY19taWlfc2h1dGRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGZlY19taWlfYWNrX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordm9pZCBmZWNfbWlpX2xpbmtfc3RhdHVzX2NoYW5nZV9jaGVjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5pdF9tZWRpYSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRkVDMV9OTwkweDAwCisjZGVmaW5lIEZFQzJfTk8JMHgwMQorI2RlZmluZSBGRUMzX05PCTB4MDIKKworaW50IGZlY184eHhfaW5pdF9vbmUoY29uc3Qgc3RydWN0IGZlY19wbGF0Zm9ybV9pbmZvICpmcGksCisJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKipkZXZwKTsKK2ludCBmZWNfOHh4X2NsZWFudXBfb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJImZlY184eHgiCisjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjAuMSIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJNYXkgNiwgMjAwNCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGZlY184eHhfcGxhdGZvcm1faW5pdCh2b2lkKTsKK3ZvaWQgZmVjXzh4eF9wbGF0Zm9ybV9jbGVhbnVwKHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGRUMgYWNjZXNzIG1hY3JvcyAqLworI2lmIGRlZmluZWQoQ09ORklHXzh4eCkKKy8qIGZvciBhIDh4eCBfX3Jhd194eHgncyBhcmUgc3VmZmljaWVudCAqLworI2RlZmluZSBfX2ZlY19vdXQzMihhZGRyLCB4KQlfX3Jhd193cml0ZWwoeCwgYWRkcikKKyNkZWZpbmUgX19mZWNfb3V0MTYoYWRkciwgeCkJX19yYXdfd3JpdGV3KHgsIGFkZHIpCisjZGVmaW5lIF9fZmVjX2luMzIoYWRkcikJX19yYXdfcmVhZGwoYWRkcikKKyNkZWZpbmUgX19mZWNfaW4xNihhZGRyKQlfX3Jhd19yZWFkdyhhZGRyKQorI2Vsc2UKKy8qIGZvciBvdGhlcnMgcGxheSBpdCBzYWZlICovCisjZGVmaW5lIF9fZmVjX291dDMyKGFkZHIsIHgpCW91dF9iZTMyKGFkZHIsIHgpCisjZGVmaW5lIF9fZmVjX291dDE2KGFkZHIsIHgpCW91dF9iZTE2KGFkZHIsIHgpCisjZGVmaW5lIF9fZmVjX2luMzIoYWRkcikJaW5fYmUzMihhZGRyKQorI2RlZmluZSBfX2ZlY19pbjE2KGFkZHIpCWluX2JlMTYoYWRkcikKKyNlbmRpZgorCisvKiB3cml0ZSAqLworI2RlZmluZSBGVyhfZmVjcCwgX3JlZywgX3YpIF9fZmVjX291dDMyKCYoX2ZlY3ApLT5mZWNfICMjIF9yZWcsIChfdikpCisKKy8qIHJlYWQgKi8KKyNkZWZpbmUgRlIoX2ZlY3AsIF9yZWcpCV9fZmVjX2luMzIoJihfZmVjcCktPmZlY18gIyMgX3JlZykKKworLyogc2V0IGJpdHMgKi8KKyNkZWZpbmUgRlMoX2ZlY3AsIF9yZWcsIF92KSBGVyhfZmVjcCwgX3JlZywgRlIoX2ZlY3AsIF9yZWcpIHwgKF92KSkKKworLyogY2xlYXIgYml0cyAqLworI2RlZmluZSBGQyhfZmVjcCwgX3JlZywgX3YpIEZXKF9mZWNwLCBfcmVnLCBGUihfZmVjcCwgX3JlZykgJiB+KF92KSkKKworLyogYnVmZmVyIGRlc2NyaXB0b3IgYWNjZXNzIG1hY3JvcyAqLworCisvKiB3cml0ZSAqLworI2RlZmluZSBDQkRXX1NDKF9jYmQsIF9zYykgCQlfX2ZlY19vdXQxNigmKF9jYmQpLT5jYmRfc2MsIChfc2MpKQorI2RlZmluZSBDQkRXX0RBVExFTihfY2JkLCBfZGF0bGVuKQlfX2ZlY19vdXQxNigmKF9jYmQpLT5jYmRfZGF0bGVuLCAoX2RhdGxlbikpCisjZGVmaW5lIENCRFdfQlVGQUREUihfY2JkLCBfYnVmYWRkcikJX19mZWNfb3V0MzIoJihfY2JkKS0+Y2JkX2J1ZmFkZHIsIChfYnVmYWRkcikpCisKKy8qIHJlYWQgKi8KKyNkZWZpbmUgQ0JEUl9TQyhfY2JkKSAJCQlfX2ZlY19pbjE2KCYoX2NiZCktPmNiZF9zYykKKyNkZWZpbmUgQ0JEUl9EQVRMRU4oX2NiZCkJCV9fZmVjX2luMTYoJihfY2JkKS0+Y2JkX2RhdGxlbikKKyNkZWZpbmUgQ0JEUl9CVUZBRERSKF9jYmQpCQlfX2ZlY19pbjMyKCYoX2NiZCktPmNiZF9idWZhZGRyKQorCisvKiBzZXQgYml0cyAqLworI2RlZmluZSBDQkRTX1NDKF9jYmQsIF9zYykgCQlDQkRXX1NDKF9jYmQsIENCRFJfU0MoX2NiZCkgfCAoX3NjKSkKKworLyogY2xlYXIgYml0cyAqLworI2RlZmluZSBDQkRDX1NDKF9jYmQsIF9zYykgCQlDQkRXX1NDKF9jYmQsIENCRFJfU0MoX2NiZCkgJiB+KF9zYykpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZmVjXzh4eC9mZWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvZmVjXzh4eC9mZWNfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZjNhOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9mZWNfOHh4L2ZlY19tYWluLmMKQEAgLTAsMCArMSwxMjc1IEBACisvKgorICogRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChGRUMpIGRyaXZlciBmb3IgTW90b3JvbGEgTVBDOHh4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBJbnRyYWNvbSBTLkEuIAorICogIGJ5IFBhbnRlbGlzIEFudG9uaW91IDxwYW50b0BpbnRyYWNvbS5ncj4KKyAqCisgKiBIZWF2aWx5IGJhc2VkIG9uIG9yaWdpbmFsIEZFQyBkcml2ZXIgYnkgRGFuIE1hbGVrIDxkYW5AZW1iZWRkZWRlZGdlLmNvbT4KKyAqIGFuZCBtb2RpZmljYXRpb25zIGJ5IEpvYWtpbSBUamVybmx1bmQgPGpvYWtpbS50amVybmx1bmRAbHVtZW50aXMuc2U+CisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS84eHhfaW1tYXAuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9tcGM4eHguaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vY29tbXByb2MuaD4KKyNpbmNsdWRlIDxhc20vZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgImZlY184eHguaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRkVDX01BWF9NVUxUSUNBU1RfQUREUlMJNjQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKyAgICBEUlZfTU9EVUxFX05BTUUgIi5jOnYiIERSVl9NT0RVTEVfVkVSU0lPTiAiICgiIERSVl9NT0RVTEVfUkVMREFURSAiKSIgIlxuIjsKKworTU9EVUxFX0FVVEhPUigiUGFudGVsaXMgQW50b25pb3UgPHBhbnRvQGludHJhY29tLmdyPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNb3Rvcm9sYSA4eHggRkVDIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitNT0RVTEVfUEFSTShmZWNfOHh4X2RlYnVnLCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhmZWNfOHh4X2RlYnVnLAorCQkgIkZFQyA4eHggYml0bWFwcGVkIGRlYnVnZ2luZyBtZXNzYWdlIGVuYWJsZSB2YWx1ZSIpOworCitpbnQgZmVjXzh4eF9kZWJ1ZyA9IC0xOwkJLyogLTEgPT0gdXNlIEZFQ184WFhfREVGX01TR19FTkFCTEUgYXMgdmFsdWUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBEZWxheSB0byB3YWl0IGZvciBGRUMgcmVzZXQgY29tbWFuZCB0byBjb21wbGV0ZSAoaW4gdXMpIAorICovCisjZGVmaW5lIEZFQ19SRVNFVF9ERUxBWQkJNTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBmZWNfd2hhY2tfcmVzZXQoZmVjX3QgKiBmZWNwKQoreworCWludCBpOworCisJLyoKKwkgKiBXaGFjayBhIHJlc2V0LiAgV2Ugc2hvdWxkIHdhaXQgZm9yIHRoaXMuICAKKwkgKi8KKwlGVyhmZWNwLCBlY250cmwsIEZFQ19FQ05UUkxfUElOTVVYIHwgRkVDX0VDTlRSTF9SRVNFVCk7CisJZm9yIChpID0gMDsKKwkgICAgIChGUihmZWNwLCBlY250cmwpICYgRkVDX0VDTlRSTF9SRVNFVCkgIT0gMCAmJiBpIDwgRkVDX1JFU0VUX0RFTEFZOworCSAgICAgaSsrKQorCQl1ZGVsYXkoMSk7CisKKwlpZiAoaSA9PSBGRUNfUkVTRVRfREVMQVkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZFQyBSZXNldCB0aW1lb3V0IVxuIik7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUcmFuc21pdHRlciB0aW1lb3V0LiAgCisgKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAoMipIWikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBSZXR1cm5zIHRoZSBDUkMgbmVlZGVkIHdoZW4gZmlsbGluZyBpbiB0aGUgaGFzaCB0YWJsZSBmb3IKKyAqIG11bHRpY2FzdCBncm91cCBmaWx0ZXJpbmcKKyAqIHBBZGRyIG11c3QgcG9pbnQgdG8gYSBNQUMgYWRkcmVzcyAoNiBieXRlcykKKyAqLworc3RhdGljIF9fdTMyIGZlY19tdWxpY2FzdF9jYWxjX2NyYyhjaGFyICpwQWRkcikKK3sKKwl1OCBieXRlOworCWludCBieXRlX2NvdW50OworCWludCBiaXRfY291bnQ7CisJX191MzIgY3JjID0gMHhmZmZmZmZmZjsKKwl1OCBtc2I7CisKKwlmb3IgKGJ5dGVfY291bnQgPSAwOyBieXRlX2NvdW50IDwgNjsgYnl0ZV9jb3VudCsrKSB7CisJCWJ5dGUgPSBwQWRkcltieXRlX2NvdW50XTsKKwkJZm9yIChiaXRfY291bnQgPSAwOyBiaXRfY291bnQgPCA4OyBiaXRfY291bnQrKykgeworCQkJbXNiID0gY3JjID4+IDMxOworCQkJY3JjIDw8PSAxOworCQkJaWYgKG1zYiBeIChieXRlICYgMHgxKSkgeworCQkJCWNyYyBePSBGRUNfQ1JDX1BPTFk7CisJCQl9CisJCQlieXRlID4+PSAxOworCQl9CisJfQorCXJldHVybiAoY3JjKTsKK30KKworLyoKKyAqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICogU2tlbGV0b24gdGFrZW4gZnJvbSBzdW5sYW5jZSBkcml2ZXIuCisgKiBUaGUgQ1BNIEV0aGVybmV0IGltcGxlbWVudGF0aW9uIGFsbG93cyBNdWx0aWNhc3QgYXMgd2VsbCBhcyBpbmRpdmlkdWFsCisgKiBNQUMgYWRkcmVzcyBmaWx0ZXJpbmcuICBTb21lIG9mIHRoZSBkcml2ZXJzIGNoZWNrIHRvIG1ha2Ugc3VyZSBpdCBpcworICogYSBncm91cCBtdWx0aWNhc3QgYWRkcmVzcywgYW5kIGRpc2NhcmQgdGhvc2UgdGhhdCBhcmUgbm90LiAgSSBndWVzcyBJCisgKiB3aWxsIGRvIHRoZSBzYW1lIGZvciBub3csIGJ1dCBqdXN0IHJlbW92ZSB0aGUgdGVzdCBpZiB5b3Ugd2FudAorICogaW5kaXZpZHVhbCBmaWx0ZXJpbmcgYXMgd2VsbCAoZG8gdGhlIHVwcGVyIG5ldCBsYXllcnMgd2FudCBvciBzdXBwb3J0CisgKiB0aGlzIGtpbmQgb2YgZmVhdHVyZT8pLgorICovCitzdGF0aWMgdm9pZCBmZWNfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJZmVjX3QgKmZlY3AgPSBmZXAtPmZlY3A7CisJc3RydWN0IGRldl9tY19saXN0ICpwbWM7CisJX191MzIgY3JjOworCWludCB0ZW1wOworCV9fdTMyIGNzclZhbDsKKwlpbnQgaGFzaF9pbmRleDsKKwlfX3UzMiBodGhpLCBodGxvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSAhPSAwKSB7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCQlGUyhmZWNwLCByX2NudHJsLCBGRUNfUkNOVFJMX1BST00pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKworCQkvKgorCQkgKiBMb2cgYW55IG5ldCB0YXBzLiAKKwkJICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX01PRFVMRV9OQU1FCisJCSAgICAgICAiOiAlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCisJfQorCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSAhPSAwIHx8CisJICAgIGRldi0+bWNfY291bnQgPiBGRUNfTUFYX01VTFRJQ0FTVF9BRERSUykgeworCQkvKgorCQkgKiBDYXRjaCBhbGwgbXVsdGljYXN0IGFkZHJlc3Nlcywgc2V0IHRoZSBmaWx0ZXIgdG8gYWxsIDEncy4KKwkJICovCisJCWh0aGkgPSAweGZmZmZmZmZmVTsKKwkJaHRsbyA9IDB4ZmZmZmZmZmZVOworCX0gZWxzZSB7CisJCWh0aGkgPSAwOworCQlodGxvID0gMDsKKworCQkvKgorCQkgKiBOb3cgcG9wdWxhdGUgdGhlIGhhc2ggdGFibGUgCisJCSAqLworCQlmb3IgKHBtYyA9IGRldi0+bWNfbGlzdDsgcG1jICE9IE5VTEw7IHBtYyA9IHBtYy0+bmV4dCkgeworCQkJY3JjID0gZmVjX211bGljYXN0X2NhbGNfY3JjKHBtYy0+ZG1pX2FkZHIpOworCQkJdGVtcCA9IChjcmMgJiAweDNmKSA+PiAxOworCQkJaGFzaF9pbmRleCA9ICgodGVtcCAmIDB4MDEpIDw8IDQpIHwKKwkJCQkgICAgICgodGVtcCAmIDB4MDIpIDw8IDIpIHwKKwkJCQkgICAgICgodGVtcCAmIDB4MDQpKSB8CisJCQkJICAgICAoKHRlbXAgJiAweDA4KSA+PiAyKSB8CisJCQkJICAgICAoKHRlbXAgJiAweDEwKSA+PiA0KTsKKwkJCWNzclZhbCA9ICgxIDw8IGhhc2hfaW5kZXgpOworCQkJaWYgKGNyYyAmIDEpCisJCQkJaHRoaSB8PSBjc3JWYWw7CisJCQllbHNlCisJCQkJaHRsbyB8PSBjc3JWYWw7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmVwLT5sb2NrLCBmbGFncyk7CisJRkMoZmVjcCwgcl9jbnRybCwgRkVDX1JDTlRSTF9QUk9NKTsKKwlGVyhmZWNwLCBoYXNoX3RhYmxlX2hpZ2gsIGh0aGkpOworCUZXKGZlY3AsIGhhc2hfdGFibGVfbG93LCBodGxvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZXAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBmZWNfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyICptYWMgPSBhZGRyOworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmZWMgKmZlY3AgPSBmZXAtPmZlY3A7CisJaW50IGk7CisJX191MzIgYWRkcmhpLCBhZGRybG87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIEdldCBwb2ludGVyIHRvIFNDQyBhcmVhIGluIHBhcmFtZXRlciBSQU0uICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IG1hYy0+c2FfZGF0YVtpXTsKKworCS8qCisJICogU2V0IHN0YXRpb24gYWRkcmVzcy4gCisJICovCisJYWRkcmhpID0gKChfX3UzMikgZGV2LT5kZXZfYWRkclswXSA8PCAyNCkgfAorCQkgKChfX3UzMikgZGV2LT5kZXZfYWRkclsxXSA8PCAxNikgfAorCSAgIAkgKChfX3UzMikgZGV2LT5kZXZfYWRkclsyXSA8PCAgOCkgfAorCSAgICAJICAoX191MzIpIGRldi0+ZGV2X2FkZHJbM107CisJYWRkcmxvID0gKChfX3UzMikgZGV2LT5kZXZfYWRkcls0XSA8PCAyNCkgfAorCSAgICAJICgoX191MzIpIGRldi0+ZGV2X2FkZHJbNV0gPDwgMTYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCUZXKGZlY3AsIGFkZHJfbG93LCBhZGRyaGkpOworCUZXKGZlY3AsIGFkZHJfaGlnaCwgYWRkcmxvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3RhcnQgb3IgcmVzdGFydCB0aGUgRkVDIGR1cmluZyBhIGxpbmsKKyAqIGNoYW5nZS4gIFRoaXMgb25seSBoYXBwZW5zIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gaGFsZiBhbmQgZnVsbAorICogZHVwbGV4LgorICovCit2b2lkIGZlY19yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBkdXBsZXgsIGludCBzcGVlZCkKK3sKKyNpZmRlZiBDT05GSUdfRFVFVAorCWltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgSU1BUF9BRERSOworCV9fdTMyIGNwdHI7CisjZW5kaWYKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZmVjICpmZWNwID0gZmVwLT5mZWNwOworCWNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1faW5mbyAqZnBpID0gZmVwLT5mcGk7CisJY2JkX3QgKmJkcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBpOworCV9fdTMyIGFkZHJoaSwgYWRkcmxvOworCisJZmVjX3doYWNrX3Jlc2V0KGZlcC0+ZmVjcCk7CisKKwkvKgorCSAqIFNldCBzdGF0aW9uIGFkZHJlc3MuIAorCSAqLworCWFkZHJoaSA9ICgoX191MzIpIGRldi0+ZGV2X2FkZHJbMF0gPDwgMjQpIHwKKwkJICgoX191MzIpIGRldi0+ZGV2X2FkZHJbMV0gPDwgMTYpIHwKKwkJICgoX191MzIpIGRldi0+ZGV2X2FkZHJbMl0gPDwgIDgpIHwKKwkJIChfX3UzMikgZGV2LT5kZXZfYWRkclszXTsKKwlhZGRybG8gPSAoKF9fdTMyKSBkZXYtPmRldl9hZGRyWzRdIDw8IDI0KSB8CisJCSAoKF9fdTMyKSBkZXYtPmRldl9hZGRyWzVdIDw8IDE2KTsKKwlGVyhmZWNwLCBhZGRyX2xvdywgYWRkcmhpKTsKKwlGVyhmZWNwLCBhZGRyX2hpZ2gsIGFkZHJsbyk7CisKKwkvKgorCSAqIFJlc2V0IGFsbCBtdWx0aWNhc3QuIAorCSAqLworCUZXKGZlY3AsIGhhc2hfdGFibGVfaGlnaCwgMCk7CisJRlcoZmVjcCwgaGFzaF90YWJsZV9sb3csIDApOworCisJLyoKKwkgKiBTZXQgbWF4aW11bSByZWNlaXZlIGJ1ZmZlciBzaXplLiAKKwkgKi8KKwlGVyhmZWNwLCByX2J1ZmZfc2l6ZSwgUEtUX01BWEJMUl9TSVpFKTsKKwlGVyhmZWNwLCByX2hhc2gsIFBLVF9NQVhCVUZfU0laRSk7CisKKwkvKgorCSAqIFNldCByZWNlaXZlIGFuZCB0cmFuc21pdCBkZXNjcmlwdG9yIGJhc2UuIAorCSAqLworCUZXKGZlY3AsIHJfZGVzX3N0YXJ0LCBpb3BhKChfX3UzMikgKGZlcC0+cnhfYmRfYmFzZSkpKTsKKwlGVyhmZWNwLCB4X2Rlc19zdGFydCwgaW9wYSgoX191MzIpIChmZXAtPnR4X2JkX2Jhc2UpKSk7CisKKwlmZXAtPmRpcnR5X3R4ID0gZmVwLT5jdXJfdHggPSBmZXAtPnR4X2JkX2Jhc2U7CisJZmVwLT50eF9mcmVlID0gZmVwLT50eF9yaW5nOworCWZlcC0+Y3VyX3J4ID0gZmVwLT5yeF9iZF9iYXNlOworCisJLyoKKwkgKiBSZXNldCBTS0IgcmVjZWl2ZSBidWZmZXJzIAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBmZXAtPnJ4X3Jpbmc7IGkrKykgeworCQlpZiAoKHNrYiA9IGZlcC0+cnhfc2tidWZmW2ldKSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWZlcC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZSBidWZmZXIgZGVzY3JpcHRvcnMuIAorCSAqLworCWZvciAoaSA9IDAsIGJkcCA9IGZlcC0+cnhfYmRfYmFzZTsgaSA8IGZlcC0+cnhfcmluZzsgaSsrLCBiZHArKykgeworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKEVORVRfUlhfRlJTSVpFKTsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9NT0RVTEVfTkFNRQorCQkJICAgICAgICI6ICVzIE1lbW9yeSBzcXVlZXplLCB1bmFibGUgdG8gYWxsb2NhdGUgc2tiXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlmZXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWJyZWFrOworCQl9CisJCWZlcC0+cnhfc2tidWZmW2ldID0gc2tiOworCQlza2ItPmRldiA9IGRldjsKKwkJQ0JEV19CVUZBRERSKGJkcCwgZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLAorCQkJCQkgTDFfQ0FDSEVfQUxJR04oUEtUX01BWEJVRl9TSVpFKSwKKwkJCQkJIERNQV9GUk9NX0RFVklDRSkpOworCQlDQkRXX0RBVExFTihiZHAsIDApOwkvKiB6ZXJvICovCisJCUNCRFdfU0MoYmRwLCBCRF9FTkVUX1JYX0VNUFRZIHwKKwkJCSgoaSA8IGZlcC0+cnhfcmluZyAtIDEpID8gMCA6IEJEX1NDX1dSQVApKTsKKwl9CisJLyoKKwkgKiBpZiB3ZSBmYWlsZWQsIGZpbGx1cCByZW1haW5kZXIgCisJICovCisJZm9yICg7IGkgPCBmZXAtPnJ4X3Jpbmc7IGkrKywgYmRwKyspIHsKKwkJZmVwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQlDQkRXX1NDKGJkcCwgKGkgPCBmZXAtPnJ4X3JpbmcgLSAxKSA/IDAgOiBCRF9TQ19XUkFQKTsKKwl9CisKKwkvKgorCSAqIFJlc2V0IFNLQiB0cmFuc21pdCBidWZmZXJzLiAgCisJICovCisJZm9yIChpID0gMDsgaSA8IGZlcC0+dHhfcmluZzsgaSsrKSB7CisJCWlmICgoc2tiID0gZmVwLT50eF9za2J1ZmZbaV0pID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJZmVwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorCisJLyoKKwkgKiAuLi5hbmQgdGhlIHNhbWUgZm9yIHRyYW5zbWl0LiAgCisJICovCisJZm9yIChpID0gMCwgYmRwID0gZmVwLT50eF9iZF9iYXNlOyBpIDwgZmVwLT50eF9yaW5nOyBpKyssIGJkcCsrKSB7CisJCWZlcC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJQ0JEV19CVUZBRERSKGJkcCwgdmlydF90b19idXMoTlVMTCkpOworCQlDQkRXX0RBVExFTihiZHAsIDApOworCQlDQkRXX1NDKGJkcCwgKGkgPCBmZXAtPnR4X3JpbmcgLSAxKSA/IDAgOiBCRF9TQ19XUkFQKTsKKwl9CisKKwkvKgorCSAqIEVuYWJsZSBiaWcgZW5kaWFuIGFuZCBkb24ndCBjYXJlIGFib3V0IFNETUEgRkMuIAorCSAqLworCUZXKGZlY3AsIGZ1bl9jb2RlLCAweDc4MDAwMDAwKTsKKworCS8qCisJICogU2V0IE1JSSBzcGVlZC4gCisJICovCisJRlcoZmVjcCwgbWlpX3NwZWVkLCBmZXAtPmZlY19waHlfc3BlZWQpOworCisJLyoKKwkgKiBDbGVhciBhbnkgb3V0c3RhbmRpbmcgaW50ZXJydXB0LiAKKwkgKi8KKwlGVyhmZWNwLCBpZXZlbnQsIDB4ZmZjMCk7CisJRlcoZmVjcCwgaXZlYywgKGZwaS0+ZmVjX2lycSAvIDIpIDw8IDI5KTsKKworCS8qCisJICogYWRqdXN0IHRvIHNwZWVkIChvbmx5IGZvciBEVUVUICYgUk1JSSkgCisJICovCisjaWZkZWYgQ09ORklHX0RVRVQKKwljcHRyID0gaW5fYmUzMigmaW1tYXAtPmltX2NwbS5jcF9jcHRyKTsKKwlzd2l0Y2ggKGZwaS0+ZmVjX25vKSB7CisJY2FzZSAwOgorCQkvKgorCQkgKiBjaGVjayBpZiBpbiBSTUlJIG1vZGUgCisJCSAqLworCQlpZiAoKGNwdHIgJiAweDEwMCkgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChzcGVlZCA9PSAxMCkKKwkJCWNwdHIgfD0gMHgwMDAwMDEwOworCQllbHNlIGlmIChzcGVlZCA9PSAxMDApCisJCQljcHRyICY9IH4weDAwMDAwMTA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyoKKwkJICogY2hlY2sgaWYgaW4gUk1JSSBtb2RlIAorCQkgKi8KKwkJaWYgKChjcHRyICYgMHg4MCkgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChzcGVlZCA9PSAxMCkKKwkJCWNwdHIgfD0gMHgwMDAwMDA4OworCQllbHNlIGlmIChzcGVlZCA9PSAxMDApCisJCQljcHRyICY9IH4weDAwMDAwMDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlvdXRfYmUzMigmaW1tYXAtPmltX2NwbS5jcF9jcHRyLCBjcHRyKTsKKyNlbmRpZgorCisJRlcoZmVjcCwgcl9jbnRybCwgRkVDX1JDTlRSTF9NSUlfTU9ERSk7CS8qIE1JSSBlbmFibGUgKi8KKwkvKgorCSAqIGFkanVzdCB0byBkdXBsZXggbW9kZSAKKwkgKi8KKwlpZiAoZHVwbGV4KSB7CisJCUZDKGZlY3AsIHJfY250cmwsIEZFQ19SQ05UUkxfRFJUKTsKKwkJRlMoZmVjcCwgeF9jbnRybCwgRkVDX1RDTlRSTF9GREVOKTsJLyogRkQgZW5hYmxlICovCisJfSBlbHNlIHsKKwkJRlMoZmVjcCwgcl9jbnRybCwgRkVDX1JDTlRSTF9EUlQpOworCQlGQyhmZWNwLCB4X2NudHJsLCBGRUNfVENOVFJMX0ZERU4pOwkvKiBGRCBkaXNhYmxlICovCisJfQorCisJLyoKKwkgKiBFbmFibGUgaW50ZXJydXB0cyB3ZSB3aXNoIHRvIHNlcnZpY2UuIAorCSAqLworCUZXKGZlY3AsIGltYXNrLCBGRUNfRU5FVF9UWEYgfCBGRUNfRU5FVF9UWEIgfAorCSAgIEZFQ19FTkVUX1JYRiB8IEZFQ19FTkVUX1JYQik7CisKKwkvKgorCSAqIEFuZCBsYXN0LCBlbmFibGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3NpbmcuIAorCSAqLworCUZXKGZlY3AsIGVjbnRybCwgRkVDX0VDTlRSTF9QSU5NVVggfCBGRUNfRUNOVFJMX0VUSEVSX0VOKTsKKwlGVyhmZWNwLCByX2Rlc19hY3RpdmUsIDB4MDEwMDAwMDApOworfQorCit2b2lkIGZlY19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJZmVjX3QgKmZlY3AgPSBmZXAtPmZlY3A7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaTsKKworCWlmICgoRlIoZmVjcCwgZWNudHJsKSAmIEZFQ19FQ05UUkxfRVRIRVJfRU4pID09IDApCisJCXJldHVybjsJCS8qIGFscmVhZHkgZG93biAqLworCisJRlcoZmVjcCwgeF9jbnRybCwgMHgwMSk7CS8qIEdyYWNlZnVsIHRyYW5zbWl0IHN0b3AgKi8KKwlmb3IgKGkgPSAwOyAoKEZSKGZlY3AsIGlldmVudCkgJiAweDEwMDAwMDAwKSA9PSAwKSAmJgorCSAgICAgaSA8IEZFQ19SRVNFVF9ERUxBWTsgaSsrKQorCQl1ZGVsYXkoMSk7CisKKwlpZiAoaSA9PSBGRUNfUkVTRVRfREVMQVkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX01PRFVMRV9OQU1FCisJCSAgICAgICAiOiAlcyBGRUMgdGltZW91dCBvbiBncmFjZWZ1bCB0cmFuc21pdCBzdG9wXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkvKgorCSAqIERpc2FibGUgRkVDLiBMZXQgb25seSBNSUkgaW50ZXJydXB0cy4gCisJICovCisJRlcoZmVjcCwgaW1hc2ssIDApOworCUZXKGZlY3AsIGVjbnRybCwgfkZFQ19FQ05UUkxfRVRIRVJfRU4pOworCisJLyoKKwkgKiBSZXNldCBTS0IgdHJhbnNtaXQgYnVmZmVycy4gIAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBmZXAtPnR4X3Jpbmc7IGkrKykgeworCQlpZiAoKHNrYiA9IGZlcC0+dHhfc2tidWZmW2ldKSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWZlcC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKworCS8qCisJICogUmVzZXQgU0tCIHJlY2VpdmUgYnVmZmVycyAKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZmVwLT5yeF9yaW5nOyBpKyspIHsKKwkJaWYgKChza2IgPSBmZXAtPnJ4X3NrYnVmZltpXSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmZXAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9Cit9CisKKy8qIGNvbW1vbiByZWNlaXZlIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IGZlY19lbmV0X3J4X2NvbW1vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlmZWNfdCAqZmVjcCA9IGZlcC0+ZmVjcDsKKwljb25zdCBzdHJ1Y3QgZmVjX3BsYXRmb3JtX2luZm8gKmZwaSA9IGZlcC0+ZnBpOworCWNiZF90ICpiZHA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnNrYm4sICpza2J0OworCWludCByZWNlaXZlZCA9IDA7CisJX191MTYgcGt0X2xlbiwgc2M7CisJaW50IGN1cmlkeDsKKwlpbnQgcnhfd29ya19saW1pdDsKKworCWlmIChmcGktPnVzZV9uYXBpKSB7CisJCXJ4X3dvcmtfbGltaXQgPSBtaW4oZGV2LT5xdW90YSwgKmJ1ZGdldCk7CisKKwkJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEZpcnN0LCBncmFiIGFsbCBvZiB0aGUgc3RhdHMgZm9yIHRoZSBpbmNvbWluZyBwYWNrZXQuCisJICogVGhlc2UgZ2V0IG1lc3NlZCB1cCBpZiB3ZSBnZXQgY2FsbGVkIGR1ZSB0byBhIGJ1c3kgY29uZGl0aW9uLgorCSAqLworCWJkcCA9IGZlcC0+Y3VyX3J4OworCisJLyogY2xlYXIgUlggc3RhdHVzIGJpdHMgZm9yIG5hcGkqLworCWlmIChmcGktPnVzZV9uYXBpKQorCQlGVyhmZWNwLCBpZXZlbnQsIEZFQ19FTkVUX1JYRiB8IEZFQ19FTkVUX1JYQik7CisKKwl3aGlsZSAoKChzYyA9IENCRFJfU0MoYmRwKSkgJiBCRF9FTkVUX1JYX0VNUFRZKSA9PSAwKSB7CisKKwkJY3VyaWR4ID0gYmRwIC0gZmVwLT5yeF9iZF9iYXNlOworCisJCS8qCisJCSAqIFNpbmNlIHdlIGhhdmUgYWxsb2NhdGVkIHNwYWNlIHRvIGhvbGQgYSBjb21wbGV0ZSBmcmFtZSwKKwkJICogdGhlIGxhc3QgaW5kaWNhdG9yIHNob3VsZCBiZSBzZXQuCisJCSAqLworCQlpZiAoKHNjICYgQkRfRU5FVF9SWF9MQVNUKSA9PSAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTU9EVUxFX05BTUUKKwkJCSAgICAgICAiOiAlcyByY3YgaXMgbm90ICtsYXN0XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIGVycm9ycy4gCisJCSAqLworCQlpZiAoc2MgJiAoQkRfRU5FVF9SWF9MRyB8IEJEX0VORVRfUlhfU0ggfCBCRF9FTkVUX1JYX0NMIHwKKwkJCSAgQkRfRU5FVF9SWF9OTyB8IEJEX0VORVRfUlhfQ1IgfCBCRF9FTkVUX1JYX09WKSkgeworCQkJZmVwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCS8qIEZyYW1lIHRvbyBsb25nIG9yIHRvbyBzaG9ydC4gKi8KKwkJCWlmIChzYyAmIChCRF9FTkVUX1JYX0xHIHwgQkRfRU5FVF9SWF9TSCkpCisJCQkJZmVwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkvKiBGcmFtZSBhbGlnbm1lbnQgKi8KKwkJCWlmIChzYyAmIChCRF9FTkVUX1JYX05PIHwgQkRfRU5FVF9SWF9DTCkpCisJCQkJZmVwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCS8qIENSQyBFcnJvciAqLworCQkJaWYgKHNjICYgQkRfRU5FVF9SWF9DUikKKwkJCQlmZXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCS8qIEZJRk8gb3ZlcnJ1biAqLworCQkJaWYgKHNjICYgQkRfRU5FVF9SWF9PVikKKwkJCQlmZXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKworCQkJc2tibiA9IGZlcC0+cnhfc2tidWZmW2N1cmlkeF07CisJCQlCVUdfT04oc2tibiA9PSBOVUxMKTsKKworCQl9IGVsc2UgeworCisJCQkvKiBuYXBpLCBnb3QgcGFja2V0IGJ1dCBubyBxdW90YSAqLworCQkJaWYgKGZwaS0+dXNlX25hcGkgJiYgLS1yeF93b3JrX2xpbWl0IDwgMCkKKwkJCQlicmVhazsKKworCQkJc2tiID0gZmVwLT5yeF9za2J1ZmZbY3VyaWR4XTsKKwkJCUJVR19PTihza2IgPT0gTlVMTCk7CisKKwkJCS8qCisJCQkgKiBQcm9jZXNzIHRoZSBpbmNvbWluZyBmcmFtZS4KKwkJCSAqLworCQkJZmVwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlwa3RfbGVuID0gQ0JEUl9EQVRMRU4oYmRwKSAtIDQ7CS8qIHJlbW92ZSBDUkMgKi8KKwkJCWZlcC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbiArIDQ7CisKKwkJCWlmIChwa3RfbGVuIDw9IGZwaS0+cnhfY29weWJyZWFrKSB7CisJCQkJLyogKzIgdG8gbWFrZSBJUCBoZWFkZXIgTDEgY2FjaGUgYWxpZ25lZCAqLworCQkJCXNrYm4gPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKTsKKwkJCQlpZiAoc2tibiAhPSBOVUxMKSB7CisJCQkJCXNrYl9yZXNlcnZlKHNrYm4sIDIpOwkvKiBhbGlnbiBJUCBoZWFkZXIgKi8KKwkJCQkJbWVtY3B5KHNrYm4tPmRhdGEsIHNrYi0+ZGF0YSwgcGt0X2xlbik7CisJCQkJCS8qIHN3YXAgKi8KKwkJCQkJc2tidCA9IHNrYjsKKwkJCQkJc2tiID0gc2tibjsKKwkJCQkJc2tibiA9IHNrYnQ7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJc2tibiA9IGRldl9hbGxvY19za2IoRU5FVF9SWF9GUlNJWkUpOworCisJCQlpZiAoc2tibiAhPSBOVUxMKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJCXJlY2VpdmVkKys7CisJCQkJaWYgKCFmcGktPnVzZV9uYXBpKQorCQkJCQluZXRpZl9yeChza2IpOworCQkJCWVsc2UKKwkJCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTU9EVUxFX05BTUUKKwkJCQkgICAgICAgIjogJXMgTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJZmVwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJc2tibiA9IHNrYjsKKwkJCX0KKwkJfQorCisJCWZlcC0+cnhfc2tidWZmW2N1cmlkeF0gPSBza2JuOworCQlDQkRXX0JVRkFERFIoYmRwLCBkbWFfbWFwX3NpbmdsZShOVUxMLCBza2JuLT5kYXRhLAorCQkJCQkJIEwxX0NBQ0hFX0FMSUdOKFBLVF9NQVhCVUZfU0laRSksCisJCQkJCQkgRE1BX0ZST01fREVWSUNFKSk7CisJCUNCRFdfREFUTEVOKGJkcCwgMCk7CisJCUNCRFdfU0MoYmRwLCAoc2MgJiB+QkRfRU5FVF9SWF9TVEFUUykgfCBCRF9FTkVUX1JYX0VNUFRZKTsKKworCQkvKgorCQkgKiBVcGRhdGUgQkQgcG9pbnRlciB0byBuZXh0IGVudHJ5LiAKKwkJICovCisJCWlmICgoc2MgJiBCRF9FTkVUX1JYX1dSQVApID09IDApCisJCQliZHArKzsKKwkJZWxzZQorCQkJYmRwID0gZmVwLT5yeF9iZF9iYXNlOworCisJCS8qCisJCSAqIERvaW5nIHRoaXMgaGVyZSB3aWxsIGtlZXAgdGhlIEZFQyBydW5uaW5nIHdoaWxlIHdlIHByb2Nlc3MKKwkJICogaW5jb21pbmcgZnJhbWVzLiAgT24gYSBoZWF2aWx5IGxvYWRlZCBuZXR3b3JrLCB3ZSBzaG91bGQgYmUKKwkJICogYWJsZSB0byBrZWVwIHVwIGF0IHRoZSBleHBlbnNlIG9mIHN5c3RlbSByZXNvdXJjZXMuCisJCSAqLworCQlGVyhmZWNwLCByX2Rlc19hY3RpdmUsIDB4MDEwMDAwMDApOworCX0KKworCWZlcC0+Y3VyX3J4ID0gYmRwOworCisJaWYgKGZwaS0+dXNlX25hcGkpIHsKKwkJZGV2LT5xdW90YSAtPSByZWNlaXZlZDsKKwkJKmJ1ZGdldCAtPSByZWNlaXZlZDsKKworCQlpZiAocnhfd29ya19saW1pdCA8IDApCisJCQlyZXR1cm4gMTsJLyogbm90IGRvbmUgKi8KKworCQkvKiBkb25lICovCisJCW5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisKKwkJLyogZW5hYmxlIFJYIGludGVycnVwdCBiaXRzICovCisJCUZTKGZlY3AsIGltYXNrLCBGRUNfRU5FVF9SWEYgfCBGRUNfRU5FVF9SWEIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmZWNfZW5ldF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWNiZF90ICpiZHA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZGlydHlpZHgsIGRvX3dha2U7CisJX191MTYgc2M7CisKKwlzcGluX2xvY2soJmZlcC0+bG9jayk7CisJYmRwID0gZmVwLT5kaXJ0eV90eDsKKworCWRvX3dha2UgPSAwOworCXdoaWxlICgoKHNjID0gQ0JEUl9TQyhiZHApKSAmIEJEX0VORVRfVFhfUkVBRFkpID09IDApIHsKKworCQlkaXJ0eWlkeCA9IGJkcCAtIGZlcC0+dHhfYmRfYmFzZTsKKworCQlpZiAoZmVwLT50eF9mcmVlID09IGZlcC0+dHhfcmluZykKKwkJCWJyZWFrOworCisJCXNrYiA9IGZlcC0+dHhfc2tidWZmW2RpcnR5aWR4XTsKKworCQkvKgorCQkgKiBDaGVjayBmb3IgZXJyb3JzLiAKKwkJICovCisJCWlmIChzYyAmIChCRF9FTkVUX1RYX0hCIHwgQkRfRU5FVF9UWF9MQyB8CisJCQkgIEJEX0VORVRfVFhfUkwgfCBCRF9FTkVUX1RYX1VOIHwgQkRfRU5FVF9UWF9DU0wpKSB7CisJCQlmZXAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHNjICYgQkRfRU5FVF9UWF9IQikJLyogTm8gaGVhcnRiZWF0ICovCisJCQkJZmVwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCQlpZiAoc2MgJiBCRF9FTkVUX1RYX0xDKQkvKiBMYXRlIGNvbGxpc2lvbiAqLworCQkJCWZlcC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJaWYgKHNjICYgQkRfRU5FVF9UWF9STCkJLyogUmV0cmFucyBsaW1pdCAqLworCQkJCWZlcC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmIChzYyAmIEJEX0VORVRfVFhfVU4pCS8qIFVuZGVycnVuICovCisJCQkJZmVwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJaWYgKHNjICYgQkRfRU5FVF9UWF9DU0wpCS8qIENhcnJpZXIgbG9zdCAqLworCQkJCWZlcC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJfSBlbHNlCisJCQlmZXAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKworCQlpZiAoc2MgJiBCRF9FTkVUX1RYX1JFQURZKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTU9EVUxFX05BTUUKKwkJCSAgICAgICAiOiAlcyBIRVkhIEVuZXQgeG1pdCBpbnRlcnJ1cHQgYW5kIFRYX1JFQURZLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCisJCS8qCisJCSAqIERlZmVycmVkIG1lYW5zIHNvbWUgY29sbGlzaW9ucyBvY2N1cnJlZCBkdXJpbmcgdHJhbnNtaXQsCisJCSAqIGJ1dCB3ZSBldmVudHVhbGx5IHNlbnQgdGhlIHBhY2tldCBPSy4KKwkJICovCisJCWlmIChzYyAmIEJEX0VORVRfVFhfREVGKQorCQkJZmVwLT5zdGF0cy5jb2xsaXNpb25zKys7CisKKwkJLyoKKwkJICogRnJlZSB0aGUgc2sgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxhc3QgdHJhbnNtaXQuIAorCQkgKi8KKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJZmVwLT50eF9za2J1ZmZbZGlydHlpZHhdID0gTlVMTDsKKworCQkvKgorCQkgKiBVcGRhdGUgcG9pbnRlciB0byBuZXh0IGJ1ZmZlciBkZXNjcmlwdG9yIHRvIGJlIHRyYW5zbWl0dGVkLiAKKwkJICovCisJCWlmICgoc2MgJiBCRF9FTkVUX1RYX1dSQVApID09IDApCisJCQliZHArKzsKKwkJZWxzZQorCQkJYmRwID0gZmVwLT50eF9iZF9iYXNlOworCisJCS8qCisJCSAqIFNpbmNlIHdlIGhhdmUgZnJlZWQgdXAgYSBidWZmZXIsIHRoZSByaW5nIGlzIG5vIGxvbmdlcgorCQkgKiBmdWxsLgorCQkgKi8KKwkJaWYgKCFmZXAtPnR4X2ZyZWUrKykKKwkJCWRvX3dha2UgPSAxOworCX0KKworCWZlcC0+ZGlydHlfdHggPSBiZHA7CisKKwlzcGluX3VubG9jaygmZmVwLT5sb2NrKTsKKworCWlmIChkb193YWtlICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKgorICogVGhlIGludGVycnVwdCBoYW5kbGVyLgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgTVBDIGNvcmUgaW50ZXJydXB0LgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2ZlY19lbmV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcDsKKwljb25zdCBzdHJ1Y3QgZmVjX3BsYXRmb3JtX2luZm8gKmZwaTsKKwlmZWNfdCAqZmVjcDsKKwlfX3UzMiBpbnRfZXZlbnRzOworCV9fdTMyIGludF9ldmVudHNfbmFwaTsKKworCWlmICh1bmxpa2VseShkZXYgPT0gTlVMTCkpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWZlcCA9IG5ldGRldl9wcml2KGRldik7CisJZmVjcCA9IGZlcC0+ZmVjcDsKKwlmcGkgPSBmZXAtPmZwaTsKKworCS8qCisJICogR2V0IHRoZSBpbnRlcnJ1cHQgZXZlbnRzIHRoYXQgY2F1c2VkIHVzIHRvIGJlIGhlcmUuCisJICovCisJd2hpbGUgKChpbnRfZXZlbnRzID0gRlIoZmVjcCwgaWV2ZW50KSAmIEZSKGZlY3AsIGltYXNrKSkgIT0gMCkgeworCisJCWlmICghZnBpLT51c2VfbmFwaSkKKwkJCUZXKGZlY3AsIGlldmVudCwgaW50X2V2ZW50cyk7CisJCWVsc2UgeworCQkJaW50X2V2ZW50c19uYXBpID0gaW50X2V2ZW50cyAmIH4oRkVDX0VORVRfUlhGIHwgRkVDX0VORVRfUlhCKTsKKwkJCUZXKGZlY3AsIGlldmVudCwgaW50X2V2ZW50c19uYXBpKTsKKwkJfQorCisJCWlmICgoaW50X2V2ZW50cyAmIChGRUNfRU5FVF9IQkVSUiB8IEZFQ19FTkVUX0JBQlIgfAorCQkJCSAgIEZFQ19FTkVUX0JBQlQgfCBGRUNfRU5FVF9FQkVSUikpICE9IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9NT0RVTEVfTkFNRQorCQkJICAgICAgICI6ICVzIEZFQyBFUlJPUihzKSAweCV4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgaW50X2V2ZW50cyk7CisKKwkJaWYgKChpbnRfZXZlbnRzICYgRkVDX0VORVRfUlhGKSAhPSAwKSB7CisJCQlpZiAoIWZwaS0+dXNlX25hcGkpCisJCQkJZmVjX2VuZXRfcnhfY29tbW9uKGRldiwgTlVMTCk7CisJCQllbHNlIHsKKwkJCQlpZiAobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChkZXYpKSB7CisJCQkJCS8qIGRpc2FibGUgcnggaW50ZXJydXB0cyAqLworCQkJCQlGQyhmZWNwLCBpbWFzaywgRkVDX0VORVRfUlhGIHwgRkVDX0VORVRfUlhCKTsKKwkJCQkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiBEUlZfTU9EVUxFX05BTUUKKwkJCQkJICAgICAgICI6ICVzIGRyaXZlciBidWchIGludGVycnVwdCB3aGlsZSBpbiBwb2xsIVxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJCUZDKGZlY3AsIGltYXNrLCBGRUNfRU5FVF9SWEYgfCBGRUNfRU5FVF9SWEIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICgoaW50X2V2ZW50cyAmIEZFQ19FTkVUX1RYRikgIT0gMCkKKwkJCWZlY19lbmV0X3R4KGRldik7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBUaGlzIGludGVycnVwdCBvY2N1cnMgd2hlbiB0aGUgUEhZIGRldGVjdHMgYSBsaW5rIGNoYW5nZS4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorZmVjX21paV9saW5rX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcDsKKwljb25zdCBzdHJ1Y3QgZmVjX3BsYXRmb3JtX2luZm8gKmZwaTsKKworCWlmICh1bmxpa2VseShkZXYgPT0gTlVMTCkpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWZlcCA9IG5ldGRldl9wcml2KGRldik7CisJZnBpID0gZmVwLT5mcGk7CisKKwlpZiAoIWZwaS0+dXNlX21kaW8pCisJCXJldHVybiBJUlFfTk9ORTsKKworCS8qCisJICogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCBpZiBwb3NzaWJsZS4gSWYgd2UgaGF2ZSBub3QKKwkgKiBmb3VuZCB0aGUgUEhZIHlldCB3ZSBjYW4ndCBwcm9jZXNzIG9yIGFja25vd2xlZGdlIHRoZQorCSAqIGludGVycnVwdCBub3cuIEluc3RlYWQgd2UgaWdub3JlIHRoaXMgaW50ZXJydXB0IGZvciBub3csCisJICogd2hpY2ggd2UgY2FuIGRvIHNpbmNlIGl0IGlzIGVkZ2UgdHJpZ2dlcmVkLiBJdCB3aWxsIGJlCisJICogYWNrbm93bGVkZ2VkIGxhdGVyIGJ5IGZlY19lbmV0X29wZW4oKS4KKwkgKi8KKwlpZiAoIWZlcC0+cGh5KQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlmZWNfbWlpX2Fja19pbnQoZGV2KTsKKwlmZWNfbWlpX2xpbmtfc3RhdHVzX2NoYW5nZV9jaGVjayhkZXYsIDApOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGZlY19lbmV0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlmZWNfdCAqZmVjcCA9IGZlcC0+ZmVjcDsKKwljYmRfdCAqYmRwOworCWludCBjdXJpZHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmZXAtPnR4X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogRmlsbCBpbiBhIFR4IHJpbmcgZW50cnkgCisJICovCisJYmRwID0gZmVwLT5jdXJfdHg7CisKKwlpZiAoIWZlcC0+dHhfZnJlZSB8fCAoQ0JEUl9TQyhiZHApICYgQkRfRU5FVF9UWF9SRUFEWSkpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZXAtPnR4X2xvY2ssIGZsYWdzKTsKKworCQkvKgorCQkgKiBPb29wcy4gIEFsbCB0cmFuc21pdCBidWZmZXJzIGFyZSBmdWxsLiAgQmFpbCBvdXQuCisJCSAqIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHNpbmNlIHRoZSB0eCBxdWV1ZSBzaG91bGQgYmUgc3RvcHBlZC4KKwkJICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX01PRFVMRV9OQU1FCisJCSAgICAgICAiOiAlcyB0eCBxdWV1ZSBmdWxsIS5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWN1cmlkeCA9IGJkcCAtIGZlcC0+dHhfYmRfYmFzZTsKKwkvKgorCSAqIENsZWFyIGFsbCBvZiB0aGUgc3RhdHVzIGZsYWdzLiAKKwkgKi8KKwlDQkRDX1NDKGJkcCwgQkRfRU5FVF9UWF9TVEFUUyk7CisKKwkvKgorCSAqIFNhdmUgc2tiIHBvaW50ZXIuIAorCSAqLworCWZlcC0+dHhfc2tidWZmW2N1cmlkeF0gPSBza2I7CisKKwlmZXAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJLyoKKwkgKiBQdXNoIHRoZSBkYXRhIGNhY2hlIHNvIHRoZSBDUE0gZG9lcyBub3QgZ2V0IHN0YWxlIG1lbW9yeSBkYXRhLiAKKwkgKi8KKwlDQkRXX0JVRkFERFIoYmRwLCBkbWFfbWFwX3NpbmdsZShOVUxMLCBza2ItPmRhdGEsCisJCQkJCSBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSkpOworCUNCRFdfREFUTEVOKGJkcCwgc2tiLT5sZW4pOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwkvKgorCSAqIElmIHRoaXMgd2FzIHRoZSBsYXN0IEJEIGluIHRoZSByaW5nLCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIGFnYWluLiAKKwkgKi8KKwlpZiAoKENCRFJfU0MoYmRwKSAmIEJEX0VORVRfVFhfV1JBUCkgPT0gMCkKKwkJZmVwLT5jdXJfdHgrKzsKKwllbHNlCisJCWZlcC0+Y3VyX3R4ID0gZmVwLT50eF9iZF9iYXNlOworCisJaWYgKCEtLWZlcC0+dHhfZnJlZSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyoKKwkgKiBUcmlnZ2VyIHRyYW5zbWlzc2lvbiBzdGFydCAKKwkgKi8KKwlDQkRTX1NDKGJkcCwgQkRfRU5FVF9UWF9SRUFEWSB8IEJEX0VORVRfVFhfSU5UUiB8CisJCUJEX0VORVRfVFhfTEFTVCB8IEJEX0VORVRfVFhfVEMpOworCUZXKGZlY3AsIHhfZGVzX2FjdGl2ZSwgMHgwMTAwMDAwMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZXAtPnR4X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmZWNfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZmVwLT5zdGF0cy50eF9lcnJvcnMrKzsKKworCWlmIChmZXAtPnR4X2ZyZWUpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCS8qIGNoZWNrIGxpbmsgc3RhdHVzIGFnYWluICovCisJZmVjX21paV9saW5rX3N0YXR1c19jaGFuZ2VfY2hlY2soZGV2LCAwKTsKK30KKworc3RhdGljIGludCBmZWNfZW5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJY29uc3Qgc3RydWN0IGZlY19wbGF0Zm9ybV9pbmZvICpmcGkgPSBmZXAtPmZwaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogSW5zdGFsbCBvdXIgaW50ZXJydXB0IGhhbmRsZXIuICovCisJaWYgKHJlcXVlc3RfaXJxKGZwaS0+ZmVjX2lycSwgZmVjX2VuZXRfaW50ZXJydXB0LCAwLCAiZmVjIiwgZGV2KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTU9EVUxFX05BTUUKKwkJICAgICAgICI6ICVzIENvdWxkIG5vdCBhbGxvY2F0ZSBGRUMgSVJRISIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEluc3RhbGwgb3VyIHBoeSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCWlmIChmcGktPnBoeV9pcnEgIT0gLTEgJiYgCisJCXJlcXVlc3RfaXJxKGZwaS0+cGh5X2lycSwgZmVjX21paV9saW5rX2ludGVycnVwdCwgMCwgImZlYy1waHkiLAorCQkJCWRldikgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX01PRFVMRV9OQU1FCisJCSAgICAgICAiOiAlcyBDb3VsZCBub3QgYWxsb2NhdGUgUEhZIElSUSEiLCBkZXYtPm5hbWUpOworCQlmcmVlX2lycShmcGktPmZlY19pcnEsIGRldik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChmcGktPnVzZV9tZGlvKSB7CisJCWZlY19taWlfc3RhcnR1cChkZXYpOworCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQlmZWNfbWlpX2xpbmtfc3RhdHVzX2NoYW5nZV9jaGVjayhkZXYsIDEpOworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKwkJZmVjX3Jlc3RhcnQoZGV2LCAxLCAxMDApOwkvKiBYWFggdGhpcyBzdWNrcyAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKworCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZlY19lbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJY29uc3Qgc3RydWN0IGZlY19wbGF0Zm9ybV9pbmZvICpmcGkgPSBmZXAtPmZwaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwlpZiAoZnBpLT51c2VfbWRpbykKKwkJZmVjX21paV9zaHV0ZG93bihkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCWZlY19zdG9wKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT5sb2NrLCBmbGFncyk7CisKKwkvKiByZWxlYXNlIGFueSBpcnFzICovCisJaWYgKGZwaS0+cGh5X2lycSAhPSAtMSkKKwkJZnJlZV9pcnEoZnBpLT5waHlfaXJxLCBkZXYpOworCWZyZWVfaXJxKGZwaS0+ZmVjX2lycSwgZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmZlY19lbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmZmVwLT5zdGF0czsKK30KKworc3RhdGljIGludCBmZWNfZW5ldF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCXJldHVybiBmZWNfZW5ldF9yeF9jb21tb24oZGV2LCBidWRnZXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgZmVjX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTU9EVUxFX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfTU9EVUxFX1ZFUlNJT04pOworfQorCitzdGF0aWMgaW50IGZlY19nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gc2l6ZW9mKGZlY190KTsKK30KKworc3RhdGljIHZvaWQgZmVjX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsCisJCQkgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHJlZ3MtPmxlbiA8IHNpemVvZihmZWNfdCkpCisJCXJldHVybjsKKworCXJlZ3MtPnZlcnNpb24gPSAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKwltZW1jcHlfZnJvbWlvKHAsIGZlcC0+ZmVjcCwgc2l6ZW9mKGZlY190KSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZmVjX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKwlyYyA9IG1paV9ldGh0b29sX2dzZXQoJmZlcC0+bWlpX2lmLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGZlY19zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmVwLT5sb2NrLCBmbGFncyk7CisJcmMgPSBtaWlfZXRodG9vbF9zc2V0KCZmZXAtPm1paV9pZiwgY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBmZWNfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBtaWlfbndheV9yZXN0YXJ0KCZmZXAtPm1paV9pZik7Cit9CisKK3N0YXRpYyBfX3UzMiBmZWNfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIGZlcC0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgZmVjX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlmZXAtPm1zZ19lbmFibGUgPSB2YWx1ZTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBmZWNfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvID0gZmVjX2dldF9kcnZpbmZvLAorCS5nZXRfcmVnc19sZW4gPSBmZWNfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfc2V0dGluZ3MgPSBmZWNfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBmZWNfc2V0X3NldHRpbmdzLAorCS5ud2F5X3Jlc2V0ID0gZmVjX253YXlfcmVzZXQsCisJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsID0gZmVjX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsID0gZmVjX3NldF9tc2dsZXZlbCwKKwkuZ2V0X3R4X2NzdW0gPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorCS5zZXRfdHhfY3N1bSA9IGV0aHRvb2xfb3Bfc2V0X3R4X2NzdW0sCS8qIGxvY2FsISAqLworCS5nZXRfc2cgPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnID0gZXRodG9vbF9vcF9zZXRfc2csCisJLmdldF9yZWdzID0gZmVjX2dldF9yZWdzLAorfTsKKworc3RhdGljIGludCBmZWNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKm1paSA9IChzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKikmcnEtPmlmcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJmZlcC0+bWlpX2lmLCBtaWksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCitpbnQgZmVjXzh4eF9pbml0X29uZShjb25zdCBzdHJ1Y3QgZmVjX3BsYXRmb3JtX2luZm8gKmZwaSwKKwkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqKmRldnApCit7CisJaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBJTUFQX0FERFI7CisJc3RhdGljIGludCBmZWNfOHh4X3ZlcnNpb25fcHJpbnRlZCA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IE5VTEw7CisJZmVjX3QgKmZlY3AgPSBOVUxMOworCWludCBpOworCWludCBlcnIgPSAwOworCWludCByZWdpc3RlcmVkID0gMDsKKwlfX3UzMiBzaWVsOworCisJKmRldnAgPSBOVUxMOworCisJc3dpdGNoIChmcGktPmZlY19ubykgeworCWNhc2UgMDoKKwkJZmVjcCA9ICYoKGltbWFwX3QgKikgSU1BUF9BRERSKS0+aW1fY3BtLmNwX2ZlYzsKKwkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0RVRVQKKwljYXNlIDE6CisJCWZlY3AgPSAmKChpbW1hcF90ICopIElNQVBfQUREUiktPmltX2NwbS5jcF9mZWMyOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChmZWNfOHh4X3ZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwlpID0gc2l6ZW9mKCpmZXApICsgKHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKikgKgorCQkJICAgIChmcGktPnJ4X3JpbmcgKyBmcGktPnR4X3JpbmcpKTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KGkpOworCWlmICghZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogcGFydGlhbCByZXNldCBvZiBGRUMgKi8KKwlmZWNfd2hhY2tfcmVzZXQoZmVjcCk7CisKKwkvKiBwb2ludCByeF9za2J1ZmYsIHR4X3NrYnVmZiAqLworCWZlcC0+cnhfc2tidWZmID0gKHN0cnVjdCBza19idWZmICoqKSZmZXBbMV07CisJZmVwLT50eF9za2J1ZmYgPSBmZXAtPnJ4X3NrYnVmZiArIGZwaS0+cnhfcmluZzsKKworCWZlcC0+ZmVjcCA9IGZlY3A7CisJZmVwLT5mcGkgPSBmcGk7CisKKwkvKiBpbml0IGxvY2tzICovCisJc3Bpbl9sb2NrX2luaXQoJmZlcC0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmZlcC0+dHhfbG9jayk7CisKKwkvKgorCSAqIFNldCB0aGUgRXRoZXJuZXQgYWRkcmVzcy4gCisJICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGZwaS0+bWFjYWRkcltpXTsKKworCWZlcC0+cmluZ19iYXNlID0gZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsCisJCQkJCSAgICAoZnBpLT50eF9yaW5nICsgZnBpLT5yeF9yaW5nKSAqCisJCQkJCSAgICBzaXplb2YoY2JkX3QpLCAmZmVwLT5yaW5nX21lbV9hZGRyLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKGZlcC0+cmluZ19iYXNlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9NT0RVTEVfTkFNRQorCQkgICAgICAgIjogJXMgZG1hIGFsbG9jIGZhaWxlZC5cbiIsIGRldi0+bmFtZSk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCS8qCisJICogU2V0IHJlY2VpdmUgYW5kIHRyYW5zbWl0IGRlc2NyaXB0b3IgYmFzZS4KKwkgKi8KKwlmZXAtPnJ4X2JkX2Jhc2UgPSBmZXAtPnJpbmdfYmFzZTsKKwlmZXAtPnR4X2JkX2Jhc2UgPSBmZXAtPnJ4X2JkX2Jhc2UgKyBmcGktPnJ4X3Jpbmc7CisKKwkvKiBpbml0aWFsaXplIHJpbmcgc2l6ZSB2YXJpYWJsZXMgKi8KKwlmZXAtPnR4X3JpbmcgPSBmcGktPnR4X3Jpbmc7CisJZmVwLT5yeF9yaW5nID0gZnBpLT5yeF9yaW5nOworCisJLyogU0lVIGludGVycnVwdCAqLworCWlmIChmcGktPnBoeV9pcnEgIT0gLTEgJiYKKwkJKGZwaS0+cGh5X2lycSA+PSBTSVVfSVJRMCAmJiBmcGktPnBoeV9pcnEgPCBTSVVfTEVWRUw3KSkgeworCisJCXNpZWwgPSBpbl9iZTMyKCZpbW1hcC0+aW1fc2l1X2NvbmYuc2Nfc2llbCk7CisJCWlmICgoZnBpLT5waHlfaXJxICYgMSkgPT0gMCkKKwkJCXNpZWwgfD0gKDB4ODAwMDAwMDAgPj4gZnBpLT5waHlfaXJxKTsKKwkJZWxzZQorCQkJc2llbCAmPSB+KDB4ODAwMDAwMDAgPj4gKGZwaS0+cGh5X2lycSAmIH4xKSk7CisJCW91dF9iZTMyKCZpbW1hcC0+aW1fc2l1X2NvbmYuc2Nfc2llbCwgc2llbCk7CisJfQorCisJLyoKKwkgKiBUaGUgRkVDIEV0aGVybmV0IHNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuIAorCSAqLworCWRldi0+b3BlbiA9IGZlY19lbmV0X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBmZWNfZW5ldF9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dCA9IGZlY190aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCWRldi0+c3RvcCA9IGZlY19lbmV0X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gZmVjX2VuZXRfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gZmVjX3NldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGZlY19zZXRfbWFjX2FkZHJlc3M7CisJaWYgKGZwaS0+dXNlX25hcGkpIHsKKwkJZGV2LT5wb2xsID0gZmVjX2VuZXRfcG9sbDsKKwkJZGV2LT53ZWlnaHQgPSBmcGktPm5hcGlfd2VpZ2h0OworCX0KKwlkZXYtPmV0aHRvb2xfb3BzID0gJmZlY19ldGh0b29sX29wczsKKwlkZXYtPmRvX2lvY3RsID0gZmVjX2lvY3RsOworCisJZmVwLT5mZWNfcGh5X3NwZWVkID0KKwkgICAgKCgoKGZwaS0+c3lzX2NsayArIDQ5OTk5OTkpIC8gMjUwMDAwMCkgLyAyKSAmIDB4M0YpIDw8IDE7CisKKwlpbml0X3RpbWVyKCZmZXAtPnBoeV90aW1lcl9saXN0KTsKKworCS8qIHBhcnRpYWwgcmVzZXQgb2YgRkVDIHNvIHRoYXQgb25seSBNSUkgd29ya3MgKi8KKwlGVyhmZWNwLCBtaWlfc3BlZWQsIGZlcC0+ZmVjX3BoeV9zcGVlZCk7CisJRlcoZmVjcCwgaWV2ZW50LCAweGZmYzApOworCUZXKGZlY3AsIGl2ZWMsIChmcGktPmZlY19pcnEgLyAyKSA8PCAyOSk7CisJRlcoZmVjcCwgaW1hc2ssIDApOworCUZXKGZlY3AsIHJfY250cmwsIEZFQ19SQ05UUkxfTUlJX01PREUpOwkvKiBNSUkgZW5hYmxlICovCisJRlcoZmVjcCwgZWNudHJsLCBGRUNfRUNOVFJMX1BJTk1VWCB8IEZFQ19FQ05UUkxfRVRIRVJfRU4pOworCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIgIT0gMCkKKwkJZ290byBlcnI7CisJcmVnaXN0ZXJlZCA9IDE7CisKKwlpZiAoZnBpLT51c2VfbWRpbykgeworCQlmZXAtPm1paV9pZi5kZXYgPSBkZXY7CisJCWZlcC0+bWlpX2lmLm1kaW9fcmVhZCA9IGZlY19taWlfcmVhZDsKKwkJZmVwLT5taWlfaWYubWRpb193cml0ZSA9IGZlY19taWlfd3JpdGU7CisJCWZlcC0+bWlpX2lmLnBoeV9pZF9tYXNrID0gMHgxZjsKKwkJZmVwLT5taWlfaWYucmVnX251bV9tYXNrID0gMHgxZjsKKwkJZmVwLT5taWlfaWYucGh5X2lkID0gZmVjX21paV9waHlfaWRfZGV0ZWN0KGRldik7CisJfQorCisJKmRldnAgPSBkZXY7CisKKwlyZXR1cm4gMDsKKworICAgICAgZXJyOgorCWlmIChkZXYgIT0gTlVMTCkgeworCQlpZiAoZmVjcCAhPSBOVUxMKQorCQkJZmVjX3doYWNrX3Jlc2V0KGZlY3ApOworCisJCWlmIChyZWdpc3RlcmVkKQorCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCQlpZiAoZmVwICE9IE5VTEwpIHsKKwkJCWlmIChmZXAtPnJpbmdfYmFzZSkKKwkJCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLAorCQkJCQkJICAoZnBpLT50eF9yaW5nICsKKwkJCQkJCSAgIGZwaS0+cnhfcmluZykgKgorCQkJCQkJICBzaXplb2YoY2JkX3QpLCBmZXAtPnJpbmdfYmFzZSwKKwkJCQkJCSAgZmVwLT5yaW5nX21lbV9hZGRyKTsKKwkJfQorCQlmcmVlX25ldGRldihkZXYpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitpbnQgZmVjXzh4eF9jbGVhbnVwX29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWZlY190ICpmZWNwID0gZmVwLT5mZWNwOworCWNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1faW5mbyAqZnBpID0gZmVwLT5mcGk7CisKKwlmZWNfd2hhY2tfcmVzZXQoZmVjcCk7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgKGZwaS0+dHhfcmluZyArIGZwaS0+cnhfcmluZykgKiBzaXplb2YoY2JkX3QpLAorCQkJICBmZXAtPnJpbmdfYmFzZSwgZmVwLT5yaW5nX21lbV9hZGRyKTsKKworCWZyZWVfbmV0ZGV2KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdCBmZWNfOHh4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZmVjXzh4eF9wbGF0Zm9ybV9pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmZWNfOHh4X2NsZWFudXAodm9pZCkKK3sKKwlmZWNfOHh4X3BsYXRmb3JtX2NsZWFudXAoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCittb2R1bGVfaW5pdChmZWNfOHh4X2luaXQpOworbW9kdWxlX2V4aXQoZmVjXzh4eF9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlY184eHgvZmVjX21paS5jIGIvZHJpdmVycy9uZXQvZmVjXzh4eC9mZWNfbWlpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAzZWIwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2ZlY184eHgvZmVjX21paS5jCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChGRUMpIGRyaXZlciBmb3IgTW90b3JvbGEgTVBDOHh4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBJbnRyYWNvbSBTLkEuIAorICogIGJ5IFBhbnRlbGlzIEFudG9uaW91IDxwYW50b0BpbnRyYWNvbS5ncj4KKyAqCisgKiBIZWF2aWx5IGJhc2VkIG9uIG9yaWdpbmFsIEZFQyBkcml2ZXIgYnkgRGFuIE1hbGVrIDxkYW5AZW1iZWRkZWRlZGdlLmNvbT4KKyAqIGFuZCBtb2RpZmljYXRpb25zIGJ5IEpvYWtpbSBUamVybmx1bmQgPGpvYWtpbS50amVybmx1bmRAbHVtZW50aXMuc2U+CisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS84eHhfaW1tYXAuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9tcGM4eHguaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vY29tbXByb2MuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmZWNfOHh4LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNYWtlIE1JSSByZWFkL3dyaXRlIGNvbW1hbmRzIGZvciB0aGUgRkVDLgorKi8KKyNkZWZpbmUgbWtfbWlpX3JlYWQoUkVHKQkoMHg2MDAyMDAwMCB8ICgoUkVHICYgMHgxZikgPDwgMTgpKQorI2RlZmluZSBta19taWlfd3JpdGUoUkVHLCBWQUwpCSgweDUwMDIwMDAwIHwgKChSRUcgJiAweDFmKSA8PCAxOCkgfCAoVkFMICYgMHhmZmZmKSkKKyNkZWZpbmUgbWtfbWlpX2VuZAkJMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogWFhYIGJvdGggRkVDcyB1c2UgdGhlIE1JSSBpbnRlcmZhY2Ugb2YgRkVDMSAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhmZWNfbWlpX2xvY2spOworCisjZGVmaW5lIEZFQ19NSUlfTE9PUFMJMTAwMDAKKworaW50IGZlY19taWlfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJZmVjX3QgKmZlY3A7CisJaW50IGksIHJldCA9IC0xOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBYWFggTUlJIGludGVyZmFjZSBpcyBvbmx5IGNvbm5lY3RlZCB0byBGRUMxICovCisJZmVjcCA9ICYoKGltbWFwX3QgKikgSU1BUF9BRERSKS0+aW1fY3BtLmNwX2ZlYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmZWNfbWlpX2xvY2ssIGZsYWdzKTsKKworCWlmICgoRlIoZmVjcCwgcl9jbnRybCkgJiBGRUNfUkNOVFJMX01JSV9NT0RFKSA9PSAwKSB7CisJCUZTKGZlY3AsIHJfY250cmwsIEZFQ19SQ05UUkxfTUlJX01PREUpOwkvKiBNSUkgZW5hYmxlICovCisJCUZTKGZlY3AsIGVjbnRybCwgRkVDX0VDTlRSTF9QSU5NVVggfCBGRUNfRUNOVFJMX0VUSEVSX0VOKTsKKwkJRlcoZmVjcCwgaWV2ZW50LCBGRUNfRU5FVF9NSUkpOworCX0KKworCS8qIEFkZCBQSFkgYWRkcmVzcyB0byByZWdpc3RlciBjb21tYW5kLiAgKi8KKwlGVyhmZWNwLCBtaWlfc3BlZWQsIGZlcC0+ZmVjX3BoeV9zcGVlZCk7CisJRlcoZmVjcCwgbWlpX2RhdGEsIChwaHlfaWQgPDwgMjMpIHwgbWtfbWlpX3JlYWQobG9jYXRpb24pKTsKKworCWZvciAoaSA9IDA7IGkgPCBGRUNfTUlJX0xPT1BTOyBpKyspCisJCWlmICgoRlIoZmVjcCwgaWV2ZW50KSAmIEZFQ19FTkVUX01JSSkgIT0gMCkKKwkJCWJyZWFrOworCisJaWYgKGkgPCBGRUNfTUlJX0xPT1BTKSB7CisJCUZXKGZlY3AsIGlldmVudCwgRkVDX0VORVRfTUlJKTsKKwkJcmV0ID0gRlIoZmVjcCwgbWlpX2RhdGEpICYgMHhmZmZmOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlY19taWlfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBmZWNfbWlpX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWZlY190ICpmZWNwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwkvKiBYWFggTUlJIGludGVyZmFjZSBpcyBvbmx5IGNvbm5lY3RlZCB0byBGRUMxICovCisJZmVjcCA9ICYoKGltbWFwX3QgKikgSU1BUF9BRERSKS0+aW1fY3BtLmNwX2ZlYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmZWNfbWlpX2xvY2ssIGZsYWdzKTsKKworCWlmICgoRlIoZmVjcCwgcl9jbnRybCkgJiBGRUNfUkNOVFJMX01JSV9NT0RFKSA9PSAwKSB7CisJCUZTKGZlY3AsIHJfY250cmwsIEZFQ19SQ05UUkxfTUlJX01PREUpOwkvKiBNSUkgZW5hYmxlICovCisJCUZTKGZlY3AsIGVjbnRybCwgRkVDX0VDTlRSTF9QSU5NVVggfCBGRUNfRUNOVFJMX0VUSEVSX0VOKTsKKwkJRlcoZmVjcCwgaWV2ZW50LCBGRUNfRU5FVF9NSUkpOworCX0KKworCS8qIEFkZCBQSFkgYWRkcmVzcyB0byByZWdpc3RlciBjb21tYW5kLiAgKi8KKwlGVyhmZWNwLCBtaWlfc3BlZWQsIGZlcC0+ZmVjX3BoeV9zcGVlZCk7CS8qIGFsd2F5cyBhZGFwdCBtaWkgc3BlZWQgKi8KKwlGVyhmZWNwLCBtaWlfZGF0YSwgKHBoeV9pZCA8PCAyMykgfCBta19taWlfd3JpdGUobG9jYXRpb24sIHZhbHVlKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRkVDX01JSV9MT09QUzsgaSsrKQorCQlpZiAoKEZSKGZlY3AsIGlldmVudCkgJiBGRUNfRU5FVF9NSUkpICE9IDApCisJCQlicmVhazsKKworCWlmIChpIDwgRkVDX01JSV9MT09QUykKKwkJRlcoZmVjcCwgaWV2ZW50LCBGRUNfRU5FVF9NSUkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVjX21paV9sb2NrLCBmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX0ZFQ184WFhfR0VORVJJQ19QSFkKKworLyoKKyAqIEdlbmVyaWMgUEhZIHN1cHBvcnQuCisgKiBTaG91bGQgd29yayBmb3IgYWxsIFBIWXMsIGJ1dCBsaW5rIGNoYW5nZSBpcyBkZXRlY3RlZCBieSBwb2xsaW5nCisgKi8KKworc3RhdGljIHZvaWQgZ2VuZXJpY190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlmZXAtPnBoeV90aW1lcl9saXN0LmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAyOworCisJYWRkX3RpbWVyKCZmZXAtPnBoeV90aW1lcl9saXN0KTsKKworCWZlY19taWlfbGlua19zdGF0dXNfY2hhbmdlX2NoZWNrKGRldiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVyaWNfc3RhcnR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZmVwLT5waHlfdGltZXJfbGlzdC5leHBpcmVzID0gamlmZmllcyArIEhaIC8gMjsJLyogZXZlcnkgNTAwbXMgKi8KKwlmZXAtPnBoeV90aW1lcl9saXN0LmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJZmVwLT5waHlfdGltZXJfbGlzdC5mdW5jdGlvbiA9IGdlbmVyaWNfdGltZXJfY2FsbGJhY2s7CisJYWRkX3RpbWVyKCZmZXAtPnBoeV90aW1lcl9saXN0KTsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJpY19zaHV0ZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZGVsX3RpbWVyX3N5bmMoJmZlcC0+cGh5X3RpbWVyX2xpc3QpOworfQorCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GRUNfOFhYX0RNOTE2MV9QSFkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVGhlIERhdmljb20gRE05MTYxIGlzIHVzZWQgb24gdGhlIE5FVFRBIGJvYXJkCQkJICAgICAqLworCisvKiByZWdpc3RlciBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIE1JSV9ETTkxNjFfQUNSCQkxNgkvKiBBdXguIENvbmZpZyBSZWdpc3RlciAgICAgICAgICovCisjZGVmaW5lIE1JSV9ETTkxNjFfQUNTUgkJMTcJLyogQXV4LiBDb25maWcvU3RhdHVzIFJlZ2lzdGVyICAqLworI2RlZmluZSBNSUlfRE05MTYxXzEwVENTUgkxOAkvKiAxMEJhc2VUIENvbmZpZy9TdGF0dXMgUmVnLiAgICovCisjZGVmaW5lIE1JSV9ETTkxNjFfSU5UUgkJMjEJLyogSW50ZXJydXB0IFJlZ2lzdGVyICAgICAgICAgICAqLworI2RlZmluZSBNSUlfRE05MTYxX1JFQ1IJCTIyCS8qIFJlY2VpdmUgRXJyb3IgQ291bnRlciBSZWcuICAgKi8KKyNkZWZpbmUgTUlJX0RNOTE2MV9ESVNDUgkyMwkvKiBEaXNjb25uZWN0IENvdW50ZXIgUmVnaXN0ZXIgICovCisKK3N0YXRpYyB2b2lkIGRtOTE2MV9zdGFydHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlmZWNfbWlpX3dyaXRlKGRldiwgZmVwLT5taWlfaWYucGh5X2lkLCBNSUlfRE05MTYxX0lOVFIsIDB4MDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRtOTE2MV9hY2tfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlmZWNfbWlpX3JlYWQoZGV2LCBmZXAtPm1paV9pZi5waHlfaWQsIE1JSV9ETTkxNjFfSU5UUik7Cit9CisKK3N0YXRpYyB2b2lkIGRtOTE2MV9zaHV0ZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZmVjX21paV93cml0ZShkZXYsIGZlcC0+bWlpX2lmLnBoeV9pZCwgTUlJX0RNOTE2MV9JTlRSLCAweDBmMDApOworfQorCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGh5X2luZm8gcGh5X2luZm9bXSA9IHsKKyNpZmRlZiBDT05GSUdfRkVDXzhYWF9ETTkxNjFfUEhZCisJeworCSAuaWQgPSAweDAwMTgxYjg4LAorCSAubmFtZSA9ICJETTkxNjEiLAorCSAuc3RhcnR1cCA9IGRtOTE2MV9zdGFydHVwLAorCSAuYWNrX2ludCA9IGRtOTE2MV9hY2tfaW50LAorCSAuc2h1dGRvd24gPSBkbTkxNjFfc2h1dGRvd24sCisJIH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRkVDXzhYWF9HRU5FUklDX1BIWQorCXsKKwkgLmlkID0gMCwKKwkgLm5hbWUgPSAiR0VORVJJQyIsCisJIC5zdGFydHVwID0gZ2VuZXJpY19zdGFydHVwLAorCSAuc2h1dGRvd24gPSBnZW5lcmljX3NodXRkb3duLAorCSB9LAorI2VuZGlmCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGZlY19taWlfcGh5X2lkX2RldGVjdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1faW5mbyAqZnBpID0gZmVwLT5mcGk7CisJaW50IGksIHIsIHN0YXJ0LCBlbmQsIHBoeXR5cGUsIHBoeXN1YnR5cGU7CisJY29uc3Qgc3RydWN0IHBoeV9pbmZvICpwaHk7CisJaW50IHBoeV9od2lkLCBwaHlfaWQ7CisKKwkvKiBpZiBubyBNRElPICovCisJaWYgKGZwaS0+dXNlX21kaW8gPT0gMCkKKwkJcmV0dXJuIC0xOworCisJcGh5X2h3aWQgPSAtMTsKKwlmZXAtPnBoeSA9IE5VTEw7CisKKwkvKiBhdXRvLWRldGVjdD8gKi8KKwlpZiAoZnBpLT5waHlfYWRkciA9PSAtMSkgeworCQlzdGFydCA9IDA7CisJCWVuZCA9IDMyOworCX0gZWxzZSB7CQkvKiBkaXJlY3QgKi8KKwkJc3RhcnQgPSBmcGktPnBoeV9hZGRyOworCQllbmQgPSBzdGFydCArIDE7CisJfQorCisJZm9yIChwaHlfaWQgPSBzdGFydDsgcGh5X2lkIDwgZW5kOyBwaHlfaWQrKykgeworCQlyID0gZmVjX21paV9yZWFkKGRldiwgcGh5X2lkLCBNSUlfUEhZU0lEMSk7CisJCWlmIChyID09IC0xIHx8IChwaHl0eXBlID0gKHIgJiAweGZmZmYpKSA9PSAweGZmZmYpCisJCQljb250aW51ZTsKKwkJciA9IGZlY19taWlfcmVhZChkZXYsIHBoeV9pZCwgTUlJX1BIWVNJRDIpOworCQlpZiAociA9PSAtMSB8fCAocGh5c3VidHlwZSA9IChyICYgMHhmZmZmKSkgPT0gMHhmZmZmKQorCQkJY29udGludWU7CisJCXBoeV9od2lkID0gKHBoeXR5cGUgPDwgMTYpIHwgcGh5c3VidHlwZTsKKwkJaWYgKHBoeV9od2lkICE9IC0xKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHBoeV9od2lkID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTU9EVUxFX05BTUUKKwkJICAgICAgICI6ICVzIE5vIFBIWSBkZXRlY3RlZCFcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKGkgPSAwLCBwaHkgPSBwaHlfaW5mbzsgaSA8IHNpemVvZihwaHlfaW5mbykgLyBzaXplb2YocGh5X2luZm9bMF0pOworCSAgICAgaSsrLCBwaHkrKykKKwkJaWYgKHBoeS0+aWQgPT0gKHBoeV9od2lkID4+IDQpIHx8IHBoeS0+aWQgPT0gMCkKKwkJCWJyZWFrOworCisJaWYgKGkgPj0gc2l6ZW9mKHBoeV9pbmZvKSAvIHNpemVvZihwaHlfaW5mb1swXSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9NT0RVTEVfTkFNRQorCQkgICAgICAgIjogJXMgUEhZIGlkIDB4JTA4eCBpcyBub3Qgc3VwcG9ydGVkIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcGh5X2h3aWQpOworCQlyZXR1cm4gLTE7CisJfQorCisJZmVwLT5waHkgPSBwaHk7CisKKwlwcmludGsoS0VSTl9JTkZPIERSVl9NT0RVTEVfTkFNRQorCSAgICAgICAiOiAlcyBQaHkgQCAweCV4LCB0eXBlICVzICgweCUwOHgpXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHBoeV9pZCwgZmVwLT5waHktPm5hbWUsIHBoeV9od2lkKTsKKworCXJldHVybiBwaHlfaWQ7Cit9CisKK3ZvaWQgZmVjX21paV9zdGFydHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJY29uc3Qgc3RydWN0IGZlY19wbGF0Zm9ybV9pbmZvICpmcGkgPSBmZXAtPmZwaTsKKworCWlmICghZnBpLT51c2VfbWRpbyB8fCBmZXAtPnBoeSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoZmVwLT5waHktPnN0YXJ0dXAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJKCpmZXAtPnBoeS0+c3RhcnR1cCkgKGRldik7Cit9CisKK3ZvaWQgZmVjX21paV9zaHV0ZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1faW5mbyAqZnBpID0gZmVwLT5mcGk7CisKKwlpZiAoIWZwaS0+dXNlX21kaW8gfHwgZmVwLT5waHkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGZlcC0+cGh5LT5zaHV0ZG93biA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkoKmZlcC0+cGh5LT5zaHV0ZG93bikgKGRldik7Cit9CisKK3ZvaWQgZmVjX21paV9hY2tfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJY29uc3Qgc3RydWN0IGZlY19wbGF0Zm9ybV9pbmZvICpmcGkgPSBmZXAtPmZwaTsKKworCWlmICghZnBpLT51c2VfbWRpbyB8fCBmZXAtPnBoeSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoZmVwLT5waHktPmFja19pbnQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJKCpmZXAtPnBoeS0+YWNrX2ludCkgKGRldik7Cit9CisKKy8qIGhlbHBlciBmdW5jdGlvbiAqLworc3RhdGljIGludCBtaWlfbmVnb3RpYXRlZChzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paSkKK3sKKwlpbnQgYWR2ZXJ0LCBscGEsIHZhbDsKKworCWlmICghbWlpX2xpbmtfb2sobWlpKSkKKwkJcmV0dXJuIDA7CisKKwl2YWwgPSAoKm1paS0+bWRpb19yZWFkKSAobWlpLT5kZXYsIG1paS0+cGh5X2lkLCBNSUlfQk1TUik7CisJaWYgKCh2YWwgJiBCTVNSX0FORUdDT01QTEVURSkgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlhZHZlcnQgPSAoKm1paS0+bWRpb19yZWFkKSAobWlpLT5kZXYsIG1paS0+cGh5X2lkLCBNSUlfQURWRVJUSVNFKTsKKwlscGEgPSAoKm1paS0+bWRpb19yZWFkKSAobWlpLT5kZXYsIG1paS0+cGh5X2lkLCBNSUlfTFBBKTsKKworCXJldHVybiBtaWlfbndheV9yZXN1bHQoYWR2ZXJ0ICYgbHBhKTsKK30KKwordm9pZCBmZWNfbWlpX2xpbmtfc3RhdHVzX2NoYW5nZV9jaGVjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5pdF9tZWRpYSkKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgbWVkaWE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChtaWlfY2hlY2tfbWVkaWEoJmZlcC0+bWlpX2lmLCBuZXRpZl9tc2dfbGluayhmZXApLCBpbml0X21lZGlhKSA9PSAwKQorCQlyZXR1cm47CisKKwltZWRpYSA9IG1paV9uZWdvdGlhdGVkKCZmZXAtPm1paV9pZik7CisKKwlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKwkJZmVjX3Jlc3RhcnQoZGV2LCAhIShtZWRpYSAmIEFEVkVSVElTRV9GVUxMKSwKKwkJCSAgICAobWVkaWEgJiAoQURWRVJUSVNFXzEwMEZVTEwgfCBBRFZFUlRJU0VfMTAwSEFMRikpID8KKwkJCSAgICAxMDAgOiAxMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJfSBlbHNlIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKwkJZmVjX3N0b3AoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT5sb2NrLCBmbGFncyk7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mbXYxOHguYyBiL2RyaXZlcnMvbmV0L2ZtdjE4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Yzc0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9mbXYxOHguYwpAQCAtMCwwICsxLDY4OSBAQAorLyogZm12MTh4LmM6IEEgbmV0d29yayBkZXZpY2UgZHJpdmVyIGZvciB0aGUgRnVqaXRzdSBGTVYtMTgxLzE4Mi8xODMvMTg0LgorCisJT3JpZ2luYWw6IGF0MTcwMC5jICgxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIpLgorCQlDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisJCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisJCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJCQlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwkJCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJCQlBbm5hcG9saXMgTUQgMjE0MDMKKworCU1vZGlmaWVkIGJ5IFl1dGFrYSBUQU1JWUEgKHRhbXlAZmxhYi5mdWppdHN1LmNvLmpwKQorCQlDb3B5cmlnaHQgMTk5NCBGdWppdHN1IExhYm9yYXRvcmllcyBMdGQuCisJU3BlY2lhbCB0aGFua3MgdG86CisJCU1hc2F5b3NoaSBVVEFLQSAodXRha2FAYWNlLnlrLmZ1aml0c3UuY28uanApCisJCQlmb3IgdGVzdGluZyB0aGlzIGRyaXZlci4KKwkJSC4gTkVHSVNISSAoYWd5LCBuZWdpc2hpQHN1bjQ1LnBzZC5jcy5mdWppdHN1LmNvLmpwKQorCQkJZm9yIHN1Z2dlc3Rpb24gb2Ygc29tZSBwcm9ncmFtIG1vZGlmaWNhdGlvbi4KKwkJTWFzYWhpcm8gU0VLSUdVQ0hJIDxzZWtpQHN5c3JhcC5jcy5mdWppdHN1LmNvLmpwPgorCQkJZm9yIHN1Z2dlc3Rpb24gb2Ygc29tZSBwcm9ncmFtIG1vZGlmaWNhdGlvbi4KKwkJS2F6dXRvc2hpIE1PUklPS0EgKG1vcmlva2FAYXVyb3JhLm9ha3MuY3MuZnVqaXRzdS5jby5qcCkKKwkJCWZvciB0ZXN0aW5nIHRoaXMgZHJpdmVyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGlzIGlzIGEgZGV2aWNlIGRyaXZlciBmb3IgdGhlIEZ1aml0c3UgRk1WLTE4MS8xODIvMTgzLzE4NCwgd2hpY2gKKwlpcyBhIHN0cmFpZ2h0LWZvcndhcmQgRnVqaXRzdSBNQjg2OTY1IGltcGxlbWVudGF0aW9uLgorCisgIFNvdXJjZXM6CisgICAgYXQxNzAwLmMKKyAgICBUaGUgRnVqaXRzdSBNQjg2OTY1IGRhdGFzaGVldC4KKyAgICBUaGUgRnVqaXRzdSBGTVYtMTgxLzE4MiB1c2VyJ3MgZ3VpZGUKKyovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisJImZtdjE4eC5jOnYyLjIuMCAwOS8yNC85OCAgWXV0YWthIFRBTUlZQSAodGFteUBmbGFiLmZ1aml0c3UuY28uanApXG4iOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2RlZmluZSBEUlZfTkFNRSAiZm12MTh4IgorCitzdGF0aWMgdW5zaWduZWQgZm12MTh4X3Byb2JlX2xpc3RbXSBfX2luaXRkYXRhID0geworCTB4MjIwLCAweDI0MCwgMHgyNjAsIDB4MjgwLCAweDJhMCwgMHgyYzAsIDB4MzAwLCAweDM0MCwgMAorfTsKKworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnICovCisjaWZuZGVmIE5FVF9ERUJVRworI2RlZmluZSBORVRfREVCVUcgMQorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldF9kZWJ1ZyA9IE5FVF9ERUJVRzsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVjaGFyOworCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3N0cnVjdCBuZXRfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWxvbmcgb3Blbl90aW1lOwkJCQkvKiBVc2VsZXNzIGV4YW1wbGUgbG9jYWwgaW5mby4gKi8KKwl1aW50IHR4X3N0YXJ0ZWQ6MTsJCQkvKiBOdW1iZXIgb2YgcGFja2V0IG9uIHRoZSBUeCBxdWV1ZS4gKi8KKwl1aW50IHR4X3F1ZXVlX3JlYWR5OjE7CQkvKiBUeCBxdWV1ZSBpcyByZWFkeSB0byBiZSBzZW50LiAqLworCXVpbnQgcnhfc3RhcnRlZDoxOwkJCS8qIFBhY2tldHMgYXJlIFJ4aW5nLiAqLworCXVjaGFyIHR4X3F1ZXVlOwkJCQkvKiBOdW1iZXIgb2YgcGFja2V0IG9uIHRoZSBUeCBxdWV1ZS4gKi8KKwl1c2hvcnQgdHhfcXVldWVfbGVuOwkJLyogQ3VycmVudCBsZW5ndGggb2YgdGhlIFR4IHF1ZXVlLiAqLworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKworLyogT2Zmc2V0cyBmcm9tIHRoZSBiYXNlIGFkZHJlc3MuICovCisjZGVmaW5lIFNUQVRVUwkJCTAKKyNkZWZpbmUgVFhfU1RBVFVTCQkwCisjZGVmaW5lIFJYX1NUQVRVUwkJMQorI2RlZmluZSBUWF9JTlRSCQkJMgkJLyogQml0LW1hcHBlZCBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgUlhfSU5UUgkJCTMKKyNkZWZpbmUgVFhfTU9ERQkJCTQKKyNkZWZpbmUgUlhfTU9ERQkJCTUKKyNkZWZpbmUgQ09ORklHXzAJCTYJCS8qIE1pc2MuIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuICovCisjZGVmaW5lIENPTkZJR18xCQk3CisvKiBSdW4tdGltZSByZWdpc3RlciBiYW5rIDIgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIERBVEFQT1JUCQk4CQkvKiBXb3JkLXdpZGUgRE1BIG9yIHByb2dyYW1tZWQtSS9PIGRhdGFwb3J0LiAqLworI2RlZmluZSBUWF9TVEFSVAkJMTAKKyNkZWZpbmUgQ09MMTZDTlRMCQkxMQkJLyogQ29udHJvbGwgUmVnIGZvciAxNiBjb2xsaXNpb25zICovCisjZGVmaW5lIE1PREUxMwkJCTEzCisvKiBGdWppdHN1IEZNVi0xOHggQ2FyZCBDb25maWd1cmF0aW9uICovCisjZGVmaW5lCUZKX1NUQVRVUzAJCTB4MTAKKyNkZWZpbmUJRkpfU1RBVFVTMQkJMHgxMQorI2RlZmluZQlGSl9DT05GSUcwCQkweDEyCisjZGVmaW5lCUZKX0NPTkZJRzEJCTB4MTMKKyNkZWZpbmUJRkpfTUFDQUREUgkJMHgxNAkvKiAweDE0IC0gMHgxOSAqLworI2RlZmluZQlGSl9CVUZDTlRMCQkweDFBCisjZGVmaW5lCUZKX0JVRkRBVEEJCTB4MUMKKyNkZWZpbmUgRk1WMThYX0lPX0VYVEVOVAkzMgorCisvKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisKK3N0YXRpYyBpbnQgZm12MTh4X3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBpb2FkZHIpOworc3RhdGljIGludCBuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IG5ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBuZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBuZXRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisMCisvKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0b3Igb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZmYgb25lIGV4aXN0cy4KKyAgIElmIGRldi0+YmFzZV9hZGRyID09IDAsIHByb2JlIGFsbCBsaWtlbHkgbG9jYXRpb25zLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMSwgYWx3YXlzIHJldHVybiBmYWlsdXJlLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMiwgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBkZXZpY2UgYW5kIHJldHVybiBzdWNjZXNzCisgICAoZGV0YWNoYWJsZSBkZXZpY2VzIG9ubHkpLgorICAgKi8KKworc3RhdGljIGludCBpbyA9IDB4MjIwOworc3RhdGljIGludCBpcnE7CisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGZtdjE4eF9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwl1bnNpZ25lZCAqcG9ydDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQlpbyA9IGRldi0+YmFzZV9hZGRyOworCQlpcnEgPSBkZXYtPmlycTsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoaW8gPiAweDFmZikgewkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCWVyciA9IGZtdjE4eF9wcm9iZTEoZGV2LCBpbyk7CisJfSBlbHNlIGlmIChpbyAhPSAwKSB7CS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJZXJyID0gLUVOWElPOworCX0gZWxzZSB7CisJCWZvciAocG9ydCA9IGZtdjE4eF9wcm9iZV9saXN0OyAqcG9ydDsgcG9ydCsrKQorCQkJaWYgKGZtdjE4eF9wcm9iZTEoZGV2LCAqcG9ydCkgPT0gMCkKKwkJCQlicmVhazsKKwkJaWYgKCEqcG9ydCkKKwkJCWVyciA9IC1FTk9ERVY7CisJfQorCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRk1WMThYX0lPX0VYVEVOVCk7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCisvKiBUaGUgRnVqaXRzdSBkYXRhc2hlZXQgc3VnZ2VzdHMgdGhhdCB0aGUgTklDIGJlIHByb2JlZCBmb3IgYnkgY2hlY2tpbmcgaXRzCisgICAic2lnbmF0dXJlIiwgdGhlIGRlZmF1bHQgYml0IHBhdHRlcm4gYWZ0ZXIgYSByZXNldC4gIFRoaXMgKmRvZXNuJ3QqIHdvcmsgLS0KKyAgIHRoZXJlIGlzIG5vIHdheSB0byByZXNldCB0aGUgYnVzIGludGVyZmFjZSB3aXRob3V0IGEgY29tcGxldGUgcG93ZXItY3ljbGUhCisKKyAgIEl0IHR1cm5zIG91dCB0aGF0IEFUSSBjYW1lIHRvIHRoZSBzYW1lIGNvbmNsdXNpb24gSSBkaWQ6IHRoZSBvbmx5IHRoaW5nCisgICB0aGF0IGNhbiBiZSBkb25lIGlzIGNoZWNraW5nIGEgZmV3IGJpdHMgYW5kIHRoZW4gZGl2aW5nIHJpZ2h0IGludG8gTUFDCisgICBhZGRyZXNzIGNoZWNrLiAqLworCitzdGF0aWMgaW50IF9faW5pdCBmbXYxOHhfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGlvYWRkcikKK3sKKwljaGFyIGlycW1hcFs0XSA9IHszLCA3LCAxMCwgMTV9OworCWNoYXIgaXJxbWFwX3BucFs4XSA9IHszLCA0LCA1LCA3LCA5LCAxMCwgMTEsIDE1fTsKKwl1bnNpZ25lZCBpbnQgaSwgcmV0dmFsOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwOworCisJLyogUmVzZXR0aW5nIHRoZSBjaGlwIGRvZXNuJ3QgcmVzZXQgdGhlIElTQSBpbnRlcmZhY2UsIHNvIGRvbid0IGJvdGhlci4KKwkgICBUaGF0IG1lYW5zIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB3aXRoIHRoZSByZWdpc3RlciB2YWx1ZXMgd2UgcHJvYmUgZm9yLgorCSAgICovCisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgRk1WMThYX0lPX0VYVEVOVCwgRFJWX05BTUUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKwkvKiBDaGVjayBJL08gYWRkcmVzcyBjb25maWd1cmF0aW9uIGFuZCBGdWppdHN1IHZlbmRvciBjb2RlICovCisJaWYgKGluYihpb2FkZHIrRkpfTUFDQUREUiAgKSAhPSAweDAwCisJfHwgIGluYihpb2FkZHIrRkpfTUFDQUREUisxKSAhPSAweDAwCisJfHwgIGluYihpb2FkZHIrRkpfTUFDQUREUisyKSAhPSAweDBlKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCS8qIENoZWNrIFBuUCBtb2RlIGZvciBGTVYtMTgzLzE4NC8xODNBLzE4NEEuICovCisJLyogVGhpcyBQblAgcm91dGluZSBpcyB2ZXJ5IHBvb3IuIElPIGFuZCBJUlEgc2hvdWxkIGJlIGtub3duLiAqLworCWlmIChpbmIoaW9hZGRyICsgRkpfU1RBVFVTMSkgJiAweDIwKSB7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCWlmIChkZXYtPmlycSA9PSBpcnFtYXBfcG5wW2ldKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpID09IDgpIHsKKwkJCXJldHZhbCA9IC1FTk9ERVY7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChmbXYxOHhfcHJvYmVfbGlzdFtpbmIoaW9hZGRyICsgRkpfQ09ORklHMCkgJiAweDA3XSAhPSBpb2FkZHIpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJZGV2LT5pcnEgPSBpcnFtYXBbKGluYihpb2FkZHIgKyBGSl9DT05GSUcwKT4+NikgJiAweDAzXTsKKwl9CisKKwkvKiBTbmFyZiB0aGUgaW50ZXJydXB0IHZlY3RvciBub3cuICovCisJcmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZuZXRfaW50ZXJydXB0LCAwLCBEUlZfTkFNRSwgZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayAoIkZNVi0xOHggZm91bmQgYXQgJSMzeCwgYnV0IGl0J3MgdW51c2FibGUgZHVlIHRvIGEgY29uZmxpY3Qgb24iCisJCQkJIklSUSAlZC5cbiIsIGlvYWRkciwgZGV2LT5pcnEpOworCQlnb3RvIG91dDsKKwl9CisKKwlwcmludGsoIiVzOiBGTVYtMTh4IGZvdW5kIGF0ICUjM3gsIElSUSAlZCwgYWRkcmVzcyAiLCBkZXYtPm5hbWUsCisJCSAgIGlvYWRkciwgZGV2LT5pcnEpOworCisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgdmFsID0gaW5iKGlvYWRkciArIEZKX01BQ0FERFIgKyBpKTsKKwkJcHJpbnRrKCIlMDJ4IiwgdmFsKTsKKwkJZGV2LT5kZXZfYWRkcltpXSA9IHZhbDsKKwl9CisKKwkvKiAiRkpfU1RBVFVTMCIgMTIgYml0IDB4MDQwMCBtZWFucyB1c2UgcmVndWxhciAxMDAgb2htIDEwYmFzZVQgc2lnbmFscywKKwkgICByYXRoZXIgdGhhbiAxNTAgb2htIHNoaWVsZGVkIHR3aXN0ZWQgcGFpciBjb21wZW5zYXRpb24uCisJICAgMHgwMDAwID09IGF1dG8tc2Vuc2UgdGhlIGludGVyZmFjZQorCSAgIDB4MDgwMCA9PSB1c2UgVFAgaW50ZXJmYWNlCisJICAgMHgxODAwID09IHVzZSBjb2F4IGludGVyZmFjZQorCSAgICovCisJeworCQljb25zdCBjaGFyICpwb3J0dHlwZVtdID0geyJhdXRvLXNlbnNlIiwgIjEwYmFzZVQiLCAiYXV0by1zZW5zZSIsICIxMGJhc2UyLzUifTsKKwkJdXNob3J0IHNldHVwX3ZhbHVlID0gaW5iKGlvYWRkciArIEZKX1NUQVRVUzApOworCisJCXN3aXRjaCggc2V0dXBfdmFsdWUgJiAweDA3ICl7CisJCWNhc2UgMHgwMSAvKiAxMGJhc2U1ICovOgorCQljYXNlIDB4MDIgLyogMTBiYXNlMiAqLzogZGV2LT5pZl9wb3J0ID0gMHgxODsgYnJlYWs7CisJCWNhc2UgMHgwNCAvKiAxMGJhc2VUICovOiBkZXYtPmlmX3BvcnQgPSAweDA4OyBicmVhazsKKwkJZGVmYXVsdCAvKiBhdXRvLXNlbnNlKi86IGRldi0+aWZfcG9ydCA9IDB4MDA7IGJyZWFrOworCQl9CisJCXByaW50aygiICVzIGludGVyZmFjZS5cbiIsIHBvcnR0eXBlWyhkZXYtPmlmX3BvcnQ+PjMpICYgM10pOworCX0KKworCS8qIEluaXRpYWxpemUgTEFOIENvbnRyb2xsZXIgYW5kIExBTiBDYXJkICovCisJb3V0YigweGRhLCBpb2FkZHIgKyBDT05GSUdfMCk7CSAvKiBJbml0aWFsaXplIExBTiBDb250cm9sbGVyICovCisJb3V0YigweDAwLCBpb2FkZHIgKyBDT05GSUdfMSk7CSAvKiBTdGFuZCBieSBtb2RlICovCisJb3V0YigweDAwLCBpb2FkZHIgKyBGSl9DT05GSUcxKTsgLyogRGlzYWJsZSBJUlEgb2YgTEFOIENhcmQgKi8KKwlvdXRiKDB4MDAsIGlvYWRkciArIEZKX0JVRkNOVEwpOyAvKiBSZXNldCA/IEknbSBub3Qgc3VyZSAoVEFNSVlBKSAqLworCisJLyogd2FpdCBmb3IgYSB3aGlsZSAqLworCXVkZWxheSgyMDApOworCisJLyogU2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MgaW4gYmFuayB6ZXJvLiAqLworCW91dGIoMHgwMCwgaW9hZGRyICsgQ09ORklHXzEpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCW91dGIoZGV2LT5kZXZfYWRkcltpXSwgaW9hZGRyICsgOCArIGkpOworCisJLyogU3dpdGNoIHRvIGJhbmsgMSBhbmQgc2V0IHRoZSBtdWx0aWNhc3QgdGFibGUgdG8gYWNjZXB0IG5vbmUuICovCisJb3V0YigweDA0LCBpb2FkZHIgKyBDT05GSUdfMSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJb3V0YigweDAwLCBpb2FkZHIgKyA4ICsgaSk7CisKKwkvKiBTd2l0Y2ggdG8gYmFuayAyIGFuZCBsb2NrIG91ciBJL08gYWRkcmVzcy4gKi8KKwlvdXRiKDB4MDgsIGlvYWRkciArIENPTkZJR18xKTsKKwlvdXRiKGRldi0+aWZfcG9ydCwgaW9hZGRyICsgTU9ERTEzKTsKKwlvdXRiKDB4MDAsIGlvYWRkciArIENPTDE2Q05UTCk7CisKKwlpZiAobmV0X2RlYnVnKQorCQlwcmludGsodmVyc2lvbik7CisKKwkvKiBJbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+cHJpdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+cHJpdikgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIG91dF9pcnE7CisJfQorCW1lbXNldChkZXYtPnByaXYsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJbHAgPSBkZXYtPnByaXY7CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworCWRldi0+b3BlbgkJPSBuZXRfb3BlbjsKKwlkZXYtPnN0b3AJCT0gbmV0X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gbmV0X3NlbmRfcGFja2V0OworCWRldi0+dHhfdGltZW91dAkJPSBuZXRfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gSFovMTA7CisJZGV2LT5nZXRfc3RhdHMJCT0gbmV0X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9tdWx0aWNhc3RfbGlzdDsKKwlyZXR1cm4gMDsKKworb3V0X2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEZNVjE4WF9JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisMCisKK3N0YXRpYyBpbnQgbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBTZXQgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMCB0byAzMksgMTAwbnMuIGJ5dGUtd2lkZSBtZW1vcnksCisJICAgMTYgYml0IGJ1cyBhY2Nlc3MsIGFuZCB0d28gNEsgVHgsIGVuYWJsZSB0aGUgUnggYW5kIFR4LiAqLworCW91dGIoMHg1YSwgaW9hZGRyICsgQ09ORklHXzApOworCisJLyogUG93ZXJ1cCBhbmQgc3dpdGNoIHRvIHJlZ2lzdGVyIGJhbmsgMiBmb3IgdGhlIHJ1bi10aW1lIHJlZ2lzdGVycy4gKi8KKwlvdXRiKDB4ZTgsIGlvYWRkciArIENPTkZJR18xKTsKKworCWxwLT50eF9zdGFydGVkID0gMDsKKwlscC0+dHhfcXVldWVfcmVhZHkgPSAxOworCWxwLT5yeF9zdGFydGVkID0gMDsKKwlscC0+dHhfcXVldWUgPSAwOworCWxwLT50eF9xdWV1ZV9sZW4gPSAwOworCisJLyogQ2xlYXIgVHggYW5kIFJ4IFN0YXR1cyAqLworCW91dGIoMHhmZiwgaW9hZGRyICsgVFhfU1RBVFVTKTsKKwlvdXRiKDB4ZmYsIGlvYWRkciArIFJYX1NUQVRVUyk7CisJbHAtPm9wZW5fdGltZSA9IGppZmZpZXM7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQorCS8qIEVuYWJsZSB0aGUgSVJRIG9mIHRoZSBMQU4gQ2FyZCAqLworCW91dGIoMHg4MCwgaW9hZGRyICsgRkpfQ09ORklHMSk7CisKKwkvKiBFbmFibGUgYm90aCBUeCBhbmQgUnggaW50ZXJydXB0cyAqLworCW91dHcoMHg4MTgyLCBpb2FkZHIrVFhfSU5UUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmV0X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwkKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0IHdpdGggc3RhdHVzICUwNHgsICVzP1xuIiwgZGV2LT5uYW1lLAorCQkgICBodG9ucyhpbncoaW9hZGRyICsgVFhfU1RBVFVTKSksCisJCSAgIGluYihpb2FkZHIgKyBUWF9TVEFUVVMpICYgMHg4MAorCQkgICA/ICJJUlEgY29uZmxpY3QiIDogIm5ldHdvcmsgY2FibGUgcHJvYmxlbSIpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0aW1lb3V0IHJlZ2lzdGVyczogJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4LlxuIiwKKwkJICAgZGV2LT5uYW1lLCBodG9ucyhpbncoaW9hZGRyICsgMCkpLAorCQkgICBodG9ucyhpbncoaW9hZGRyICsgMikpLCBodG9ucyhpbncoaW9hZGRyICsgNCkpLAorCQkgICBodG9ucyhpbncoaW9hZGRyICsgNikpLCBodG9ucyhpbncoaW9hZGRyICsgOCkpLAorCQkgICBodG9ucyhpbncoaW9hZGRyICsxMCkpLCBodG9ucyhpbncoaW9hZGRyICsxMikpLAorCQkgICBodG9ucyhpbncoaW9hZGRyICsxNCkpKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJldGggY2FyZDogJTA0eCAlMDR4XG4iLAorCQlodG9ucyhpbncoaW9hZGRyK0ZKX1NUQVRVUzApKSwKKwkJaHRvbnMoaW53KGlvYWRkcitGSl9DT05GSUcwKSkpOworCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkvKiBUb0RvOiBXZSBzaG91bGQgdHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuLi4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIEluaXRpYWxpemUgTEFOIENvbnRyb2xsZXIgYW5kIExBTiBDYXJkICovCisJb3V0YigweGRhLCBpb2FkZHIgKyBDT05GSUdfMCk7ICAgLyogSW5pdGlhbGl6ZSBMQU4gQ29udHJvbGxlciAqLworCW91dGIoMHgwMCwgaW9hZGRyICsgQ09ORklHXzEpOyAgIC8qIFN0YW5kIGJ5IG1vZGUgKi8KKwlvdXRiKDB4MDAsIGlvYWRkciArIEZKX0NPTkZJRzEpOyAvKiBEaXNhYmxlIElSUSBvZiBMQU4gQ2FyZCAqLworCW91dGIoMHgwMCwgaW9hZGRyICsgRkpfQlVGQ05UTCk7IC8qIFJlc2V0ID8gSSdtIG5vdCBzdXJlICovCisJbmV0X29wZW4oZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IG5ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzaG9ydCBsZW5ndGggPSBza2ItPmxlbjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIEJsb2NrIGEgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4gICovCisJCisJaWYgKGxlbmd0aCA+IEVUSF9GUkFNRV9MRU4pIHsKKwkJaWYgKG5ldF9kZWJ1ZykKKwkJCXByaW50aygiJXM6IEF0dGVtcHRpbmcgdG8gc2VuZCBhIGxhcmdlIHBhY2tldCAoJWQgYnl0ZXMpLlxuIiwKKwkJCQlkZXYtPm5hbWUsIGxlbmd0aCk7CisJCXJldHVybiAxOworCX0KKwkKKwlpZiAobGVuZ3RoIDwgRVRIX1pMRU4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJbGVuZ3RoID0gRVRIX1pMRU47CisJfQorCWJ1ZiA9IHNrYi0+ZGF0YTsKKwkKKwlpZiAobmV0X2RlYnVnID4gNCkKKwkJcHJpbnRrKCIlczogVHJhbnNtaXR0aW5nIGEgcGFja2V0IG9mIGxlbmd0aCAlbHUuXG4iLCBkZXYtPm5hbWUsCisJCQkgICAodW5zaWduZWQgbG9uZylza2ItPmxlbik7CisJLyogV2UgbWF5IG5vdCBzdGFydCB0cmFuc21pdHRpbmcgdW5sZXNzIHdlIGZpbmlzaCB0cmFuc2ZlcnJpbmcKKwkgICBhIHBhY2tldCBpbnRvIHRoZSBUeCBxdWV1ZS4gRHVyaW5nIGV4ZWN1dGluZyB0aGUgZm9sbG93aW5nCisJICAgY29kZXMgd2UgcG9zc2libHkgY2F0Y2ggYSBUeCBpbnRlcnJ1cHQuIFRodXMgd2UgZmxhZyBvZmYKKwkgICB0eF9xdWV1ZV9yZWFkeSwgc28gdGhhdCB3ZSBwcmV2ZW50IHRoZSBpbnRlcnJ1cHQgcm91dGluZQorCSAgIChuZXRfaW50ZXJydXB0KSB0byBzdGFydCB0cmFuc21pdHRpbmcuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJbHAtPnR4X3F1ZXVlX3JlYWR5ID0gMDsKKwl7CisJCW91dHcobGVuZ3RoLCBpb2FkZHIgKyBEQVRBUE9SVCk7CisJCW91dHN3KGlvYWRkciArIERBVEFQT1JULCBidWYsIChsZW5ndGggKyAxKSA+PiAxKTsKKwkJbHAtPnR4X3F1ZXVlKys7CisJCWxwLT50eF9xdWV1ZV9sZW4gKz0gbGVuZ3RoICsgMjsKKwl9CisJbHAtPnR4X3F1ZXVlX3JlYWR5ID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGxwLT50eF9zdGFydGVkID09IDApIHsKKwkJLyogSWYgdGhlIFR4IGlzIGlkbGUsIGFsd2F5cyB0cmlnZ2VyIGEgdHJhbnNtaXQuICovCisJCW91dGIoMHg4MCB8IGxwLT50eF9xdWV1ZSwgaW9hZGRyICsgVFhfU1RBUlQpOworCQlscC0+dHhfcXVldWUgPSAwOworCQlscC0+dHhfcXVldWVfbGVuID0gMDsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWxwLT50eF9zdGFydGVkID0gMTsKKwl9IGVsc2UgaWYgKGxwLT50eF9xdWV1ZV9sZW4gPj0gNDA5NiAtIDE1MDIpIC8qIE5vIHJvb20gZm9yIGEgcGFja2V0ICovCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKwwKKy8qIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisgICBIYW5kbGUgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGludGVycnVwdHMuICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK25ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwOworCWludCBpb2FkZHIsIHN0YXR1czsKKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWxwID0gZGV2LT5wcml2OworCXN0YXR1cyA9IGludyhpb2FkZHIgKyBUWF9TVEFUVVMpOworCW91dHcoc3RhdHVzLCBpb2FkZHIgKyBUWF9TVEFUVVMpOworCisJaWYgKG5ldF9kZWJ1ZyA+IDQpCisJCXByaW50aygiJXM6IEludGVycnVwdCB3aXRoIHN0YXR1cyAlMDR4LlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCWlmIChscC0+cnhfc3RhcnRlZCA9PSAwICYmCisJCShzdGF0dXMgJiAweGZmMDAgfHwgKGluYihpb2FkZHIgKyBSWF9NT0RFKSAmIDB4NDApID09IDApKSB7CisJCS8qIEdvdCBhIHBhY2tldChzKS4KKwkJICAgV2UgY2Fubm90IGV4ZWN1dGUgbmV0X3J4IG1vcmUgdGhhbiBvbmNlIGF0IHRoZSBzYW1lIHRpbWUgZm9yCisJCSAgIHRoZSBzYW1lIGRldmljZS4gRHVyaW5nIGV4ZWN1dGluZyBuZXRfcngsIHdlIHBvc3NpYmx5IGNhdGNoIGEKKwkJICAgVHggaW50ZXJydXB0LiBUaHVzIHdlIGZsYWcgb24gcnhfc3RhcnRlZCwgc28gdGhhdCB3ZSBwcmV2ZW50CisJCSAgIHRoZSBpbnRlcnJ1cHQgcm91dGluZSAobmV0X2ludGVycnVwdCkgdG8gZGl2ZSBpbnRvIG5ldF9yeAorCQkgICBhZ2Fpbi4gKi8KKwkJbHAtPnJ4X3N0YXJ0ZWQgPSAxOworCQlvdXRiKDB4MDAsIGlvYWRkciArIFJYX0lOVFIpOwkvKiBEaXNhYmxlIFJYIGludHIuICovCisJCW5ldF9yeChkZXYpOworCQlvdXRiKDB4ODEsIGlvYWRkciArIFJYX0lOVFIpOwkvKiBFbmFibGUgIFJYIGludHIuICovCisJCWxwLT5yeF9zdGFydGVkID0gMDsKKwl9CisJaWYgKHN0YXR1cyAmIDB4MDBmZikgeworCQlpZiAoc3RhdHVzICYgMHgwMikgeworCQkJLyogTW9yZSB0aGFuIDE2IGNvbGxpc2lvbnMgb2NjdXJyZWQgKi8KKwkJCWlmIChuZXRfZGVidWcgPiA0KQorCQkJCXByaW50aygiJXM6IDE2IENvbGxpc2lvbiBvY2N1ciBkdXJpbmcgVHhpbmcuXG4iLCBkZXYtPm5hbWUpOworCQkJLyogQ2FuY2VsIHNlbmRpbmcgYSBwYWNrZXQuICovCisJCQlvdXRiKDB4MDMsIGlvYWRkciArIENPTDE2Q05UTCk7CisJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOworCQl9CisJCWlmIChzdGF0dXMgJiAweDgyKSB7CisJCQlzcGluX2xvY2soJmxwLT5sb2NrKTsKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlpZiAobHAtPnR4X3F1ZXVlICYmIGxwLT50eF9xdWV1ZV9yZWFkeSkgeworCQkJCW91dGIoMHg4MCB8IGxwLT50eF9xdWV1ZSwgaW9hZGRyICsgVFhfU1RBUlQpOworCQkJCWxwLT50eF9xdWV1ZSA9IDA7CisJCQkJbHAtPnR4X3F1ZXVlX2xlbiA9IDA7CisJCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwkvKiBJbmZvcm0gdXBwZXIgbGF5ZXJzLiAqLworCQkJfSBlbHNlIHsKKwkJCQlscC0+dHhfc3RhcnRlZCA9IDA7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwkvKiBJbmZvcm0gdXBwZXIgbGF5ZXJzLiAqLworCQkJfQorCQkJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKwkJfQorCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChzdGF0dXMpOworfQorCisvKiBXZSBoYXZlIGEgZ29vZCBwYWNrZXQocyksIGdldCBpdC90aGVtIG91dCBvZiB0aGUgYnVmZmVycy4gKi8KK3N0YXRpYyB2b2lkIG5ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgYm9ndXNjb3VudCA9IDU7CisKKwl3aGlsZSAoKGluYihpb2FkZHIgKyBSWF9NT0RFKSAmIDB4NDApID09IDApIHsKKwkJLyogQ2xlYXIgUEtUX1JEWSBiaXQ6IGJ5IGFneSAxOTk0MDkyMiAqLworCQkvKiBvdXRiKDB4ODAsIGlvYWRkciArIFJYX1NUQVRVUyk7ICovCisJCXVzaG9ydCBzdGF0dXMgPSBpbncoaW9hZGRyICsgREFUQVBPUlQpOworCisJCWlmIChuZXRfZGVidWcgPiA0KQorCQkJcHJpbnRrKCIlczogUnhpbmcgcGFja2V0IG1vZGUgJTAyeCBzdGF0dXMgJTA0eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbmIoaW9hZGRyICsgUlhfTU9ERSksIHN0YXR1cyk7CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJaWYgKHN0YXR1cyA9PSAwKSB7CisJCQlvdXRiKDB4MDUsIGlvYWRkciArIDE0KTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKworCQlpZiAoKHN0YXR1cyAmIDB4RjApICE9IDB4MjApIHsJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIDB4MDgpIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgMHgwNCkgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIDB4MDIpIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgMHgwMSkgbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCX0gZWxzZSB7CisJCQl1c2hvcnQgcGt0X2xlbiA9IGludyhpb2FkZHIgKyBEQVRBUE9SVCk7CisJCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4gKi8KKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCWlmIChwa3RfbGVuID4gMTU1MCkgeworCQkJCXByaW50aygiJXM6IFRoZSBGTVYtMTh4IGNsYWltZWQgYSB2ZXJ5IGxhcmdlIHBhY2tldCwgc2l6ZSAlZC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCQkJb3V0YigweDA1LCBpb2FkZHIgKyAxNCk7CisJCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWJyZWFrOworCQkJfQorCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzMpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKCIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldCAobGVuICVkKS5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCQkJb3V0YigweDA1LCBpb2FkZHIgKyAxNCk7CisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUoc2tiLDIpOworCisJCQlpbnN3KGlvYWRkciArIERBVEFQT1JULCBza2JfcHV0KHNrYixwa3RfbGVuKSwgKHBrdF9sZW4gKyAxKSA+PiAxKTsKKworCQkJaWYgKG5ldF9kZWJ1ZyA+IDUpIHsKKwkJCQlpbnQgaTsKKwkJCQlwcmludGsoIiVzOiBSeGVkIHBhY2tldCBvZiBsZW5ndGggJWQ6ICIsIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCQkJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCisJCQkJCXByaW50aygiICUwMngiLCBza2ItPmRhdGFbaV0pOworCQkJCXByaW50aygiLlxuIik7CisJCQl9CisKKwkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0KKwkJaWYgKC0tYm9ndXNjb3VudCA8PSAwKQorCQkJYnJlYWs7CisJfQorCisJLyogSWYgYW55IHdvcnRoLXdoaWxlIHBhY2tldHMgaGF2ZSBiZWVuIHJlY2VpdmVkLCBkZXZfcmludCgpCisJICAgaGFzIGRvbmUgYSBtYXJrX2JoKE5FVF9CSCkgZm9yIHVzIGFuZCB3aWxsIHdvcmsgb24gdGhlbQorCSAgIHdoZW4gd2UgZ2V0IHRvIHRoZSBib3R0b20taGFsZiByb3V0aW5lLiAqLworCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCQlpZiAoKGluYihpb2FkZHIgKyBSWF9NT0RFKSAmIDB4NDApID09IDB4NDApCisJCQkJYnJlYWs7CisJCQkodm9pZClpbncoaW9hZGRyICsgREFUQVBPUlQpOwkJCQkvKiBkdW1teSBzdGF0dXMgcmVhZCAqLworCQkJb3V0YigweDA1LCBpb2FkZHIgKyAxNCk7CisJCX0KKworCQlpZiAobmV0X2RlYnVnID4gNSAmJiBpID4gMCkKKwkJCXByaW50aygiJXM6IEV4aW50IFJ4IHBhY2tldCB3aXRoIG1vZGUgJTAyeCBhZnRlciAlZCB0aWNrcy5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbmIoaW9hZGRyICsgUlhfTU9ERSksIGkpOworCX0KKworCXJldHVybjsKK30KKworLyogVGhlIGludmVyc2Ugcm91dGluZSB0byBuZXRfb3BlbigpLiAqLworc3RhdGljIGludCBuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkoKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXYpLT5vcGVuX3RpbWUgPSAwOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCS8qIFNldCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDAgdG8gZGlzYWJsZSBUeCBhbmQgUnguICovCisJb3V0YigweGRhLCBpb2FkZHIgKyBDT05GSUdfMCk7CisKKwkvKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3MgLS0gVG9Eby4gKi8KKworCS8qIFBvd2VyLWRvd24gdGhlIGNoaXAuICBHcmVlbiwgZ3JlZW4sIGdyZWVuISAqLworCW91dGIoMHgwMCwgaW9hZGRyICsgQ09ORklHXzEpOworCisJLyogU2V0IHRoZSBldGhlcm5ldCBhZGFwdG9yIGRpc2FibGUgSVJRICovCisJb3V0YigweDAwLCBpb2FkZHIgKyBGSl9DT05GSUcxKTsKKworCXJldHVybiAwOworfQorCisvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4JVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvcgorICAgY2xvc2VkLiAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICAgbnVtX2FkZHJzID09IC0xCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKyAgIG51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICAgbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsIGFuZCBkbworCQkJYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCisgCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpZiAoZGV2LT5tY19jb3VudCB8fCBkZXYtPmZsYWdzJihJRkZfUFJPTUlTQ3xJRkZfQUxMTVVMVEkpKQorCXsKKwkJLyoKKwkJICoJV2UgbXVzdCBtYWtlIHRoZSBrZXJuZWwgcmVhbGlzZSB3ZSBoYWQgdG8gbW92ZQorCQkgKglpbnRvIHByb21pc2MgbW9kZSBvciB3ZSBzdGFydCBhbGwgb3V0IHdhciBvbgorCQkgKgl0aGUgY2FibGUuIC0gQUMKKwkJICovCisJCWRldi0+ZmxhZ3N8PUlGRl9QUk9NSVNDOworCisJCW91dGIoMywgaW9hZGRyICsgUlhfTU9ERSk7CS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJfQorCWVsc2UKKwkJb3V0YigyLCBpb2FkZHIgKyBSWF9NT0RFKTsJLyogRGlzYWJsZSBwcm9taXNjdW91cywgdXNlIG5vcm1hbCBtb2RlICovCit9CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2ZtdjE4eDsKKworTU9EVUxFX1BBUk0oaW8sICJpIik7CitNT0RVTEVfUEFSTShpcnEsICJpIik7CitNT0RVTEVfUEFSTShuZXRfZGVidWcsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiRk1WLTE4WCBJL08gYWRkcmVzcyIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJGTVYtMThYIElSUSBudW1iZXIiKTsKK01PRFVMRV9QQVJNX0RFU0MobmV0X2RlYnVnLCAiRk1WLTE4WCBkZWJ1ZyBsZXZlbCAoMC0xLDUtNikiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaWYgKGlvID09IDApCisJCXByaW50aygiZm12MTh4OiBZb3Ugc2hvdWxkIG5vdCB1c2UgYXV0by1wcm9iaW5nIHdpdGggaW5zbW9kIVxuIik7CisJZGV2X2ZtdjE4eCA9IGZtdjE4eF9wcm9iZSgtMSk7CisJaWYgKElTX0VSUihkZXZfZm12MTh4KSkKKwkJcmV0dXJuIFBUUl9FUlIoZGV2X2ZtdjE4eCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X2ZtdjE4eCk7CisJZnJlZV9pcnEoZGV2X2ZtdjE4eC0+aXJxLCBkZXZfZm12MTh4KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXZfZm12MTh4LT5iYXNlX2FkZHIsIEZNVjE4WF9JT19FWFRFTlQpOworCWZyZWVfbmV0ZGV2KGRldl9mbXYxOHgpOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX0tFUk5FTF9fIC1JL3Vzci9zcmMvbGludXgvbmV0L2luZXQgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLW00ODYgLWMgZm12MTh4LmMiCisgKiAgdmVyc2lvbi1jb250cm9sOiB0CisgKiAga2VwdC1uZXctdmVyc2lvbnM6IDUKKyAqICB0YWItd2lkdGg6IDQKKyAqICBjLWluZGVudC1sZXZlbDogNAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYyBiL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYTQ4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpAQCAtMCwwICsxLDIyMzIgQEAKKy8qCisgKiBmb3JjZWRldGg6IEV0aGVybmV0IGRyaXZlciBmb3IgTlZJRElBIG5Gb3JjZSBtZWRpYSBhY2Nlc3MgY29udHJvbGxlcnMuCisgKgorICogTm90ZTogVGhpcyBkcml2ZXIgaXMgYSBjbGVhbnJvb20gcmVpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiByZXZlcnNlCisgKiAgICAgIGVuZ2luZWVyZWQgZG9jdW1lbnRhdGlvbiB3cml0dGVuIGJ5IENhcmwtRGFuaWVsIEhhaWxmaW5nZXIKKyAqICAgICAgYW5kIEFuZHJldyBkZSBRdWluY2V5LiBJdCdzIG5laXRoZXIgc3VwcG9ydGVkIG5vciBlbmRvcnNlZAorICogICAgICBieSBOVklESUEgQ29ycC4gVXNlIGF0IHlvdXIgb3duIHJpc2suCisgKgorICogTlZJRElBLCBuRm9yY2UgYW5kIG90aGVyIE5WSURJQSBtYXJrcyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkCisgKiB0cmFkZW1hcmtzIG9mIE5WSURJQSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQgb3RoZXIKKyAqIGNvdW50cmllcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsNCBNYW5mcmVkIFNwcmF1bAorICogQ29weXJpZ2h0IChDKSAyMDA0IEFuZHJldyBkZSBRdWluY2V5ICh3b2wgc3VwcG9ydCkKKyAqIENvcHlyaWdodCAoQykgMjAwNCBDYXJsLURhbmllbCBIYWlsZmluZ2VyIChpbnZhbGlkIE1BQyBoYW5kbGluZywgaW5zYW5lCisgKgkJSVJRIHJhdGUgZml4ZXMsIGJpZ2VuZGlhbiBmaXhlcywgY2xlYW51cHMsIHZlcmlmaWNhdGlvbikKKyAqIENvcHlyaWdodCAoYykgMjAwNCBOVklESUEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogQ2hhbmdlbG9nOgorICogCTAuMDE6IDA1IE9jdCAyMDAzOiBGaXJzdCByZWxlYXNlIHRoYXQgY29tcGlsZXMgd2l0aG91dCB3YXJuaW5ncy4KKyAqIAkwLjAyOiAwNSBPY3QgMjAwMzogRml4IGJ1ZyBmb3IgbnZfZHJhaW5fdHg6IGRvIG5vdCB0cnkgdG8gZnJlZSBOVUxMIHNrYnMuCisgKiAJCQkgICBDaGVjayBhbGwgUENJIEJBUnMgZm9yIHRoZSByZWdpc3RlciB3aW5kb3cuCisgKiAJCQkgICB1ZGVsYXkgYWRkZWQgdG8gbWlpX3J3LgorICogCTAuMDM6IDA2IE9jdCAyMDAzOiBJbml0aWFsaXplIGRldi0+aXJxLgorICogCTAuMDQ6IDA3IE9jdCAyMDAzOiBJbml0aWFsaXplIG5wLT5sb2NrLCByZWR1Y2UgaGFuZGxlZCBpcnFzLCBhZGQgcHJpbnRrcy4KKyAqIAkwLjA1OiAwOSBPY3QgMjAwMzogcHJpbnRrIHJlbW92ZWQgYWdhaW4sIGlycSBzdGF0dXMgcHJpbnQgdHhfdGltZW91dC4KKyAqIAkwLjA2OiAxMCBPY3QgMjAwMzogTUFDIEFkZHJlc3MgcmVhZCB1cGRhdGVkLCBwZmYgZmxhZyBnZW5lcmF0aW9uIHVwZGF0ZWQsCisgKiAJCQkgICBpcnEgbWFzayB1cGRhdGVkCisgKiAJMC4wNzogMTQgT2N0IDIwMDM6IEZ1cnRoZXIgaXJxIG1hc2sgdXBkYXRlcy4KKyAqIAkwLjA4OiAyMCBPY3QgMjAwMzogcnhfZGVzYy5MZW5ndGggaW5pdGlhbGl6YXRpb24gYWRkZWQsIG52X2FsbG9jX3J4IHJlZmlsbAorICogCQkJICAgYWRkZWQgaW50byBpcnEgaGFuZGxlciwgTlVMTCBjaGVjayBmb3IgZHJhaW5fcmluZy4KKyAqIAkwLjA5OiAyMCBPY3QgMjAwMzogQmFzaWMgbGluayBzcGVlZCBpcnEgaW1wbGVtZW50YXRpb24uIE9ubHkgaGFuZGxlIHRoZQorICogCQkJICAgcmVxdWVzdGVkIGludGVycnVwdCBzb3VyY2VzLgorICogCTAuMTA6IDIwIE9jdCAyMDAzOiBGaXJzdCBjbGVhbnVwIGZvciByZWxlYXNlLgorICogCTAuMTE6IDIxIE9jdCAyMDAzOiBoZXhkdW1wIGZvciB0eCBhZGRlZCwgcnggYnVmZmVyIHNpemVzIGluY3JlYXNlZC4KKyAqIAkJCSAgIE1BQyBBZGRyZXNzIGluaXQgZml4LCBzZXRfbXVsdGljYXN0IGNsZWFudXAuCisgKiAJMC4xMjogMjMgT2N0IDIwMDM6IENsZWFudXBzIGZvciByZWxlYXNlLgorICogCTAuMTM6IDI1IE9jdCAyMDAzOiBMaW1pdCBmb3IgY29uY3VycmVudCB0eCBwYWNrZXRzIGluY3JlYXNlZCB0byAxMC4KKyAqIAkJCSAgIFNldCBsaW5rIHNwZWVkIGNvcnJlY3RseS4gc3RhcnQgcnggYmVmb3JlIHN0YXJ0aW5nCisgKiAJCQkgICB0eCAobnZfc3RhcnRfcnggc2V0cyB0aGUgbGluayBzcGVlZCkuCisgKiAJMC4xNDogMjUgT2N0IDIwMDM6IE5pYyBkZXBlbmRhbnQgaXJxIG1hc2suCisgKiAJMC4xNTogMDggTm92IDIwMDM6IGZpeCBzbXAgZGVhZGxvY2sgd2l0aCBzZXRfbXVsdGljYXN0X2xpc3QgZHVyaW5nCisgKiAJCQkgICBvcGVuLgorICogCTAuMTY6IDE1IE5vdiAyMDAzOiBpbmNsdWRlIGZpbGUgY2xlYW51cCBmb3IgcHBjNjQsIHJ4IGJ1ZmZlciBzaXplCisgKiAJCQkgICBpbmNyZWFzZWQgdG8gMTYyOCBieXRlcy4KKyAqIAkwLjE3OiAxNiBOb3YgMjAwMzogdW5kbyByeCBidWZmZXIgc2l6ZSBpbmNyZWFzZS4gU3Vic3RyYWN0IDEgZnJvbQorICogCQkJICAgdGhlIHR4IGxlbmd0aC4KKyAqIAkwLjE4OiAxNyBOb3YgMjAwMzogZml4IG9vcHMgZHVlIHRvIGxhdGUgaW5pdGlhbGl6YXRpb24gb2YgZGV2X3N0YXRzCisgKiAJMC4xOTogMjkgTm92IDIwMDM6IEhhbmRsZSBSeE5vQnVmLCBkZXRlY3QgJiBoYW5kbGUgaW52YWxpZCBtYWMKKyAqIAkJCSAgIGFkZHJlc3NlcywgcmVhbGx5IHN0b3AgcnggaWYgYWxyZWFkeSBydW5uaW5nCisgKiAJCQkgICBpbiBudl9zdGFydF9yeCwgY2xlYW4gdXAgYSBiaXQuCisgKiAJMC4yMDogMDcgRGVjIDIwMDM6IGFsbG9jIGZpeGVzCisgKiAJMC4yMTogMTIgSmFuIDIwMDQ6IGFkZGl0aW9uYWwgYWxsb2MgZml4LCBuaWMgcG9sbGluZyBmaXguCisgKgkwLjIyOiAxOSBKYW4gMjAwNDogcmVwcm9ncmFtIHRpbWVyIHRvIGEgc2FuZSByYXRlLCBhdm9pZCBsb2NrdXAKKyAqCQkJICAgb24gY2xvc2UuCisgKgkwLjIzOiAyNiBKYW4gMjAwNDogdmFyaW91cyBzbWFsbCBjbGVhbnVwcworICoJMC4yNDogMjcgRmViIDIwMDQ6IG1ha2UgZHJpdmVyIGV2ZW4gbGVzcyBhbm9ueW1vdXMgaW4gYmFja3RyYWNlcworICoJMC4yNTogMDkgTWFyIDIwMDQ6IHdvbCBzdXBwb3J0CisgKgkwLjI2OiAwMyBKdW4gMjAwNDogbmV0ZHJpdmVyIHNwZWNpZmljIGFubm90YXRpb24sIHNwYXJzZS1yZWxhdGVkIGZpeGVzCisgKgkwLjI3OiAxOSBKdW4gMjAwNDogR2lnYWJpdCBzdXBwb3J0LCBuZXcgZGVzY3JpcHRvciByaW5ncywKKyAqCQkJICAgYWRkZWQgQ0s4MDQvTUNQMDQgZGV2aWNlIElEcywgY29kZSBmaXhlcworICoJCQkgICBmb3IgcmVnaXN0ZXJzLCBsaW5rIHN0YXR1cyBhbmQgb3RoZXIgbWlub3IgZml4ZXMuCisgKgkwLjI4OiAyMSBKdW4gMjAwNDogQmlnIGNsZWFudXAsIG1ha2luZyBkcml2ZXIgbW9zdGx5IGVuZGlhbiBzYWZlCisgKgkwLjI5OiAzMSBBdWcgMjAwNDogQWRkIGJhY2t1cCB0aW1lciBmb3IgbGluayBjaGFuZ2Ugbm90aWZpY2F0aW9uLgorICoJMC4zMDogMjUgU2VwIDIwMDQ6IHJ4IGNoZWNrc3VtIHN1cHBvcnQgZm9yIG5mIDI1MCBHYi4gQWRkIHJ4IHJlc2V0CisgKgkJCSAgIGludG8gbnZfY2xvc2UsIG90aGVyd2lzZSByZWVuYWJsaW5nIGZvciB3b2wgY2FuCisgKgkJCSAgIGNhdXNlIERNQSB0byBrZnJlZSdkIG1lbW9yeS4KKyAqCTAuMzE6IDE0IE5vdiAyMDA0OiBldGh0b29sIHN1cHBvcnQgZm9yIGdldHRpbmcvc2V0dGluZyBsaW5rCisgKgkgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLgorICoKKyAqIEtub3duIGJ1Z3M6CisgKiBXZSBzdXNwZWN0IHRoYXQgb24gc29tZSBoYXJkd2FyZSBubyBUWCBkb25lIGludGVycnVwdHMgYXJlIGdlbmVyYXRlZC4KKyAqIFRoaXMgbWVhbnMgcmVjb3ZlcnkgZnJvbSBuZXRpZl9zdG9wX3F1ZXVlIG9ubHkgaGFwcGVucyBpZiB0aGUgaHcgdGltZXIKKyAqIGludGVycnVwdCBmaXJlcyAoMTAwIHRpbWVzL3NlY29uZCwgY29uZmlndXJhYmxlIHdpdGggTlZSRUdfUE9MTF9ERUZBVUxUKQorICogYW5kIHRoZSB0aW1lciBpcyBhY3RpdmUgaW4gdGhlIElSUU1hc2ssIG9yIGlmIGEgcnggcGFja2V0IGFycml2ZXMgYnkgY2hhbmNlLgorICogSWYgeW91ciBoYXJkd2FyZSByZWxpYWJseSBnZW5lcmF0ZXMgdHggZG9uZSBpbnRlcnJ1cHRzLCB0aGVuIHlvdSBjYW4gcmVtb3ZlCisgKiBERVZfTkVFRF9USU1FUklSUSBmcm9tIHRoZSBkcml2ZXJfZGF0YSBmbGFncy4KKyAqIERFVl9ORUVEX1RJTUVSSVJRIHdpbGwgbm90IGhhcm0geW91IG9uIHNhbmUgaGFyZHdhcmUsIG9ubHkgZ2VuZXJhdGluZyBhIGZldworICogc3VwZXJmbHVvdXMgdGltZXIgaW50ZXJydXB0cyBmcm9tIHRoZSBuaWMuCisgKi8KKyNkZWZpbmUgRk9SQ0VERVRIX1ZFUlNJT04JCSIwLjMxIgorI2RlZmluZSBEUlZfTkFNRQkJCSJmb3JjZWRldGgiCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2lmIDAKKyNkZWZpbmUgZHByaW50awkJCXByaW50aworI2Vsc2UKKyNkZWZpbmUgZHByaW50ayh4Li4uKQkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyoKKyAqIEhhcmR3YXJlIGFjY2VzczoKKyAqLworCisjZGVmaW5lIERFVl9ORUVEX0xBU1RQQUNLRVQxCTB4MDAwMQkvKiBzZXQgTEFTVFBBQ0tFVDEgaW4gdHggZmxhZ3MgKi8KKyNkZWZpbmUgREVWX0lSUU1BU0tfMQkJMHgwMDAyICAvKiB1c2UgTlZSRUdfSVJRTUFTS19XQU5URURfMSBmb3IgaXJxIG1hc2sgKi8KKyNkZWZpbmUgREVWX0lSUU1BU0tfMgkJMHgwMDA0ICAvKiB1c2UgTlZSRUdfSVJRTUFTS19XQU5URURfMiBmb3IgaXJxIG1hc2sgKi8KKyNkZWZpbmUgREVWX05FRURfVElNRVJJUlEJMHgwMDA4ICAvKiBzZXQgdGhlIHRpbWVyIGlycSBmbGFnIGluIHRoZSBpcnEgbWFzayAqLworI2RlZmluZSBERVZfTkVFRF9MSU5LVElNRVIJMHgwMDEwCS8qIHBvbGwgbGluayBzZXR0aW5ncy4gUmVsaWVzIG9uIHRoZSB0aW1lciBpcnEgKi8KKworZW51bSB7CisJTnZSZWdJcnFTdGF0dXMgPSAweDAwMCwKKyNkZWZpbmUgTlZSRUdfSVJRU1RBVF9NSUlFVkVOVAkweDA0MAorI2RlZmluZSBOVlJFR19JUlFTVEFUX01BU0sJCTB4MWZmCisJTnZSZWdJcnFNYXNrID0gMHgwMDQsCisjZGVmaW5lIE5WUkVHX0lSUV9SWF9FUlJPUgkJMHgwMDAxCisjZGVmaW5lIE5WUkVHX0lSUV9SWAkJCTB4MDAwMgorI2RlZmluZSBOVlJFR19JUlFfUlhfTk9CVUYJCTB4MDAwNAorI2RlZmluZSBOVlJFR19JUlFfVFhfRVJSCQkweDAwMDgKKyNkZWZpbmUgTlZSRUdfSVJRX1RYMgkJCTB4MDAxMAorI2RlZmluZSBOVlJFR19JUlFfVElNRVIJCQkweDAwMjAKKyNkZWZpbmUgTlZSRUdfSVJRX0xJTksJCQkweDAwNDAKKyNkZWZpbmUgTlZSRUdfSVJRX1RYMQkJCTB4MDEwMAorI2RlZmluZSBOVlJFR19JUlFNQVNLX1dBTlRFRF8xCQkweDAwNWYKKyNkZWZpbmUgTlZSRUdfSVJRTUFTS19XQU5URURfMgkJMHgwMTQ3CisjZGVmaW5lIE5WUkVHX0lSUV9VTktOT1dOCQkofihOVlJFR19JUlFfUlhfRVJST1J8TlZSRUdfSVJRX1JYfE5WUkVHX0lSUV9SWF9OT0JVRnxOVlJFR19JUlFfVFhfRVJSfE5WUkVHX0lSUV9UWDJ8TlZSRUdfSVJRX1RJTUVSfE5WUkVHX0lSUV9MSU5LfE5WUkVHX0lSUV9UWDEpKQorCisJTnZSZWdVbmtub3duU2V0dXBSZWc2ID0gMHgwMDgsCisjZGVmaW5lIE5WUkVHX1VOS1NFVFVQNl9WQUwJCTMKKworLyoKKyAqIE5WUkVHX1BPTExfREVGQVVMVCBpcyB0aGUgaW50ZXJ2YWwgbGVuZ3RoIG9mIHRoZSB0aW1lciBzb3VyY2Ugb24gdGhlIG5pYworICogTlZSRUdfUE9MTF9ERUZBVUxUPTk3IHdvdWxkIHJlc3VsdCBpbiBhbiBpbnRlcnZhbCBsZW5ndGggb2YgMSBtcworICovCisJTnZSZWdQb2xsaW5nSW50ZXJ2YWwgPSAweDAwYywKKyNkZWZpbmUgTlZSRUdfUE9MTF9ERUZBVUxUCTk3MAorCU52UmVnTWlzYzEgPSAweDA4MCwKKyNkZWZpbmUgTlZSRUdfTUlTQzFfSEQJCTB4MDIKKyNkZWZpbmUgTlZSRUdfTUlTQzFfRk9SQ0UJMHgzYjBmM2MKKworCU52UmVnVHJhbnNtaXR0ZXJDb250cm9sID0gMHgwODQsCisjZGVmaW5lIE5WUkVHX1hNSVRDVExfU1RBUlQJMHgwMQorCU52UmVnVHJhbnNtaXR0ZXJTdGF0dXMgPSAweDA4OCwKKyNkZWZpbmUgTlZSRUdfWE1JVFNUQVRfQlVTWQkweDAxCisKKwlOdlJlZ1BhY2tldEZpbHRlckZsYWdzID0gMHg4YywKKyNkZWZpbmUgTlZSRUdfUEZGX0FMV0FZUwkweDdGMDAwOAorI2RlZmluZSBOVlJFR19QRkZfUFJPTUlTQwkweDgwCisjZGVmaW5lIE5WUkVHX1BGRl9NWUFERFIJMHgyMAorCisJTnZSZWdPZmZsb2FkQ29uZmlnID0gMHg5MCwKKyNkZWZpbmUgTlZSRUdfT0ZGTE9BRF9IT01FUEhZCTB4NjAxCisjZGVmaW5lIE5WUkVHX09GRkxPQURfTk9STUFMCVJYX05JQ19CVUZTSVpFCisJTnZSZWdSZWNlaXZlckNvbnRyb2wgPSAweDA5NCwKKyNkZWZpbmUgTlZSRUdfUkNWQ1RMX1NUQVJUCTB4MDEKKwlOdlJlZ1JlY2VpdmVyU3RhdHVzID0gMHg5OCwKKyNkZWZpbmUgTlZSRUdfUkNWU1RBVF9CVVNZCTB4MDEKKworCU52UmVnUmFuZG9tU2VlZCA9IDB4OWMsCisjZGVmaW5lIE5WUkVHX1JORFNFRURfTUFTSwkweDAwZmYKKyNkZWZpbmUgTlZSRUdfUk5EU0VFRF9GT1JDRQkweDdmMDAKKyNkZWZpbmUgTlZSRUdfUk5EU0VFRF9GT1JDRTIJMHgyZDAwCisjZGVmaW5lIE5WUkVHX1JORFNFRURfRk9SQ0UzCTB4NzQwMAorCisJTnZSZWdVbmtub3duU2V0dXBSZWcxID0gMHhBMCwKKyNkZWZpbmUgTlZSRUdfVU5LU0VUVVAxX1ZBTAkweDE2MDcwZgorCU52UmVnVW5rbm93blNldHVwUmVnMiA9IDB4QTQsCisjZGVmaW5lIE5WUkVHX1VOS1NFVFVQMl9WQUwJMHgxNgorCU52UmVnTWFjQWRkckEgPSAweEE4LAorCU52UmVnTWFjQWRkckIgPSAweEFDLAorCU52UmVnTXVsdGljYXN0QWRkckEgPSAweEIwLAorI2RlZmluZSBOVlJFR19NQ0FTVEFERFJBX0ZPUkNFCTB4MDEKKwlOdlJlZ011bHRpY2FzdEFkZHJCID0gMHhCNCwKKwlOdlJlZ011bHRpY2FzdE1hc2tBID0gMHhCOCwKKwlOdlJlZ011bHRpY2FzdE1hc2tCID0gMHhCQywKKworCU52UmVnUGh5SW50ZXJmYWNlID0gMHhDMCwKKyNkZWZpbmUgUEhZX1JHTUlJCQkweDEwMDAwMDAwCisKKwlOdlJlZ1R4UmluZ1BoeXNBZGRyID0gMHgxMDAsCisJTnZSZWdSeFJpbmdQaHlzQWRkciA9IDB4MTA0LAorCU52UmVnUmluZ1NpemVzID0gMHgxMDgsCisjZGVmaW5lIE5WUkVHX1JJTkdTWl9UWFNISUZUIDAKKyNkZWZpbmUgTlZSRUdfUklOR1NaX1JYU0hJRlQgMTYKKwlOdlJlZ1Vua25vd25UcmFuc21pdHRlclJlZyA9IDB4MTBjLAorCU52UmVnTGlua1NwZWVkID0gMHgxMTAsCisjZGVmaW5lIE5WUkVHX0xJTktTUEVFRF9GT1JDRSAweDEwMDAwCisjZGVmaW5lIE5WUkVHX0xJTktTUEVFRF8xMAkxMDAwCisjZGVmaW5lIE5WUkVHX0xJTktTUEVFRF8xMDAJMTAwCisjZGVmaW5lIE5WUkVHX0xJTktTUEVFRF8xMDAwCTUwCisjZGVmaW5lIE5WUkVHX0xJTktTUEVFRF9NQVNLCSgweEZGRikKKwlOdlJlZ1Vua25vd25TZXR1cFJlZzUgPSAweDEzMCwKKyNkZWZpbmUgTlZSRUdfVU5LU0VUVVA1X0JJVDMxCSgxPDwzMSkKKwlOdlJlZ1Vua25vd25TZXR1cFJlZzMgPSAweDEzYywKKyNkZWZpbmUgTlZSRUdfVU5LU0VUVVAzX1ZBTDEJMHgyMDAwMTAKKwlOdlJlZ1R4UnhDb250cm9sID0gMHgxNDQsCisjZGVmaW5lIE5WUkVHX1RYUlhDVExfS0lDSwkweDAwMDEKKyNkZWZpbmUgTlZSRUdfVFhSWENUTF9CSVQxCTB4MDAwMgorI2RlZmluZSBOVlJFR19UWFJYQ1RMX0JJVDIJMHgwMDA0CisjZGVmaW5lIE5WUkVHX1RYUlhDVExfSURMRQkweDAwMDgKKyNkZWZpbmUgTlZSRUdfVFhSWENUTF9SRVNFVAkweDAwMTAKKyNkZWZpbmUgTlZSRUdfVFhSWENUTF9SWENIRUNLCTB4MDQwMAorCU52UmVnTUlJU3RhdHVzID0gMHgxODAsCisjZGVmaW5lIE5WUkVHX01JSVNUQVRfRVJST1IJCTB4MDAwMQorI2RlZmluZSBOVlJFR19NSUlTVEFUX0xJTktDSEFOR0UJMHgwMDA4CisjZGVmaW5lIE5WUkVHX01JSVNUQVRfTUFTSwkJMHgwMDBmCisjZGVmaW5lIE5WUkVHX01JSVNUQVRfTUFTSzIJCTB4MDAwZgorCU52UmVnVW5rbm93blNldHVwUmVnNCA9IDB4MTg0LAorI2RlZmluZSBOVlJFR19VTktTRVRVUDRfVkFMCTgKKworCU52UmVnQWRhcHRlckNvbnRyb2wgPSAweDE4OCwKKyNkZWZpbmUgTlZSRUdfQURBUFRDVExfU1RBUlQJMHgwMgorI2RlZmluZSBOVlJFR19BREFQVENUTF9MSU5LVVAJMHgwNAorI2RlZmluZSBOVlJFR19BREFQVENUTF9QSFlWQUxJRAkweDQwMDAwCisjZGVmaW5lIE5WUkVHX0FEQVBUQ1RMX1JVTk5JTkcJMHgxMDAwMDAKKyNkZWZpbmUgTlZSRUdfQURBUFRDVExfUEhZU0hJRlQJMjQKKwlOdlJlZ01JSVNwZWVkID0gMHgxOGMsCisjZGVmaW5lIE5WUkVHX01JSVNQRUVEX0JJVDgJKDE8PDgpCisjZGVmaW5lIE5WUkVHX01JSURFTEFZCTUKKwlOdlJlZ01JSUNvbnRyb2wgPSAweDE5MCwKKyNkZWZpbmUgTlZSRUdfTUlJQ1RMX0lOVVNFCTB4MDgwMDAKKyNkZWZpbmUgTlZSRUdfTUlJQ1RMX1dSSVRFCTB4MDA0MDAKKyNkZWZpbmUgTlZSRUdfTUlJQ1RMX0FERFJTSElGVAk1CisJTnZSZWdNSUlEYXRhID0gMHgxOTQsCisJTnZSZWdXYWtlVXBGbGFncyA9IDB4MjAwLAorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19WQUwJCTB4Nzc3MAorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19CVVNZU0hJRlQJMjQKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfRU5BQkxFU0hJRlQJMTYKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfRDNTSElGVAkxMgorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19EMlNISUZUCTgKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfRDFTSElGVAk0CisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0QwU0hJRlQJMAorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19BQ0NFUFRfTUFHUEFUCQkweDAxCisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0FDQ0VQVF9XQUtFVVBQQVQJMHgwMgorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19BQ0NFUFRfTElOS0NIQU5HRQkweDA0CisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0VOQUJMRQkweDExMTEKKworCU52UmVnUGF0dGVybkNSQyA9IDB4MjA0LAorCU52UmVnUGF0dGVybk1hc2sgPSAweDIwOCwKKwlOdlJlZ1Bvd2VyQ2FwID0gMHgyNjgsCisjZGVmaW5lIE5WUkVHX1BPV0VSQ0FQX0QzU1VQUAkoMTw8MzApCisjZGVmaW5lIE5WUkVHX1BPV0VSQ0FQX0QyU1VQUAkoMTw8MjYpCisjZGVmaW5lIE5WUkVHX1BPV0VSQ0FQX0QxU1VQUAkoMTw8MjUpCisJTnZSZWdQb3dlclN0YXRlID0gMHgyNmMsCisjZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEVfUE9XRVJFRFVQCTB4ODAwMAorI2RlZmluZSBOVlJFR19QT1dFUlNUQVRFX1ZBTElECQkweDAxMDAKKyNkZWZpbmUgTlZSRUdfUE9XRVJTVEFURV9NQVNLCQkweDAwMDMKKyNkZWZpbmUgTlZSRUdfUE9XRVJTVEFURV9EMAkJMHgwMDAwCisjZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEVfRDEJCTB4MDAwMQorI2RlZmluZSBOVlJFR19QT1dFUlNUQVRFX0QyCQkweDAwMDIKKyNkZWZpbmUgTlZSRUdfUE9XRVJTVEFURV9EMwkJMHgwMDAzCit9OworCisvKiBCaWcgZW5kaWFuOiBzaG91bGQgd29yaywgYnV0IGlzIHVudGVzdGVkICovCitzdHJ1Y3QgcmluZ19kZXNjIHsKKwl1MzIgUGFja2V0QnVmZmVyOworCXUzMiBGbGFnTGVuOworfTsKKworI2RlZmluZSBGTEFHX01BU0tfVjEgMHhmZmZmMDAwMAorI2RlZmluZSBGTEFHX01BU0tfVjIgMHhmZmZmYzAwMAorI2RlZmluZSBMRU5fTUFTS19WMSAoMHhmZmZmZmZmZiBeIEZMQUdfTUFTS19WMSkKKyNkZWZpbmUgTEVOX01BU0tfVjIgKDB4ZmZmZmZmZmYgXiBGTEFHX01BU0tfVjIpCisKKyNkZWZpbmUgTlZfVFhfTEFTVFBBQ0tFVAkoMTw8MTYpCisjZGVmaW5lIE5WX1RYX1JFVFJZRVJST1IJKDE8PDE5KQorI2RlZmluZSBOVl9UWF9MQVNUUEFDS0VUMQkoMTw8MjQpCisjZGVmaW5lIE5WX1RYX0RFRkVSUkVECQkoMTw8MjYpCisjZGVmaW5lIE5WX1RYX0NBUlJJRVJMT1NUCSgxPDwyNykKKyNkZWZpbmUgTlZfVFhfTEFURUNPTExJU0lPTgkoMTw8MjgpCisjZGVmaW5lIE5WX1RYX1VOREVSRkxPVwkJKDE8PDI5KQorI2RlZmluZSBOVl9UWF9FUlJPUgkJKDE8PDMwKQorI2RlZmluZSBOVl9UWF9WQUxJRAkJKDE8PDMxKQorCisjZGVmaW5lIE5WX1RYMl9MQVNUUEFDS0VUCSgxPDwyOSkKKyNkZWZpbmUgTlZfVFgyX1JFVFJZRVJST1IJKDE8PDE4KQorI2RlZmluZSBOVl9UWDJfTEFTVFBBQ0tFVDEJKDE8PDIzKQorI2RlZmluZSBOVl9UWDJfREVGRVJSRUQJCSgxPDwyNSkKKyNkZWZpbmUgTlZfVFgyX0NBUlJJRVJMT1NUCSgxPDwyNikKKyNkZWZpbmUgTlZfVFgyX0xBVEVDT0xMSVNJT04JKDE8PDI3KQorI2RlZmluZSBOVl9UWDJfVU5ERVJGTE9XCSgxPDwyOCkKKy8qIGVycm9yIGFuZCB2YWxpZCBhcmUgdGhlIHNhbWUgZm9yIGJvdGggKi8KKyNkZWZpbmUgTlZfVFgyX0VSUk9SCQkoMTw8MzApCisjZGVmaW5lIE5WX1RYMl9WQUxJRAkJKDE8PDMxKQorCisjZGVmaW5lIE5WX1JYX0RFU0NSSVBUT1JWQUxJRAkoMTw8MTYpCisjZGVmaW5lIE5WX1JYX01JU1NFREZSQU1FCSgxPDwxNykKKyNkZWZpbmUgTlZfUlhfU1VCU1RSQUNUMQkoMTw8MTgpCisjZGVmaW5lIE5WX1JYX0VSUk9SMQkJKDE8PDIzKQorI2RlZmluZSBOVl9SWF9FUlJPUjIJCSgxPDwyNCkKKyNkZWZpbmUgTlZfUlhfRVJST1IzCQkoMTw8MjUpCisjZGVmaW5lIE5WX1JYX0VSUk9SNAkJKDE8PDI2KQorI2RlZmluZSBOVl9SWF9DUkNFUlIJCSgxPDwyNykKKyNkZWZpbmUgTlZfUlhfT1ZFUkZMT1cJCSgxPDwyOCkKKyNkZWZpbmUgTlZfUlhfRlJBTUlOR0VSUgkoMTw8MjkpCisjZGVmaW5lIE5WX1JYX0VSUk9SCQkoMTw8MzApCisjZGVmaW5lIE5WX1JYX0FWQUlMCQkoMTw8MzEpCisKKyNkZWZpbmUgTlZfUlgyX0NIRUNLU1VNTUFTSwkoMHgxQzAwMDAwMCkKKyNkZWZpbmUgTlZfUlgyX0NIRUNLU1VNT0sxCSgweDEwMDAwMDAwKQorI2RlZmluZSBOVl9SWDJfQ0hFQ0tTVU1PSzIJKDB4MTQwMDAwMDApCisjZGVmaW5lIE5WX1JYMl9DSEVDS1NVTU9LMwkoMHgxODAwMDAwMCkKKyNkZWZpbmUgTlZfUlgyX0RFU0NSSVBUT1JWQUxJRAkoMTw8MjkpCisjZGVmaW5lIE5WX1JYMl9TVUJTVFJBQ1QxCSgxPDwyNSkKKyNkZWZpbmUgTlZfUlgyX0VSUk9SMQkJKDE8PDE4KQorI2RlZmluZSBOVl9SWDJfRVJST1IyCQkoMTw8MTkpCisjZGVmaW5lIE5WX1JYMl9FUlJPUjMJCSgxPDwyMCkKKyNkZWZpbmUgTlZfUlgyX0VSUk9SNAkJKDE8PDIxKQorI2RlZmluZSBOVl9SWDJfQ1JDRVJSCQkoMTw8MjIpCisjZGVmaW5lIE5WX1JYMl9PVkVSRkxPVwkJKDE8PDIzKQorI2RlZmluZSBOVl9SWDJfRlJBTUlOR0VSUgkoMTw8MjQpCisvKiBlcnJvciBhbmQgYXZhaWwgYXJlIHRoZSBzYW1lIGZvciBib3RoICovCisjZGVmaW5lIE5WX1JYMl9FUlJPUgkJKDE8PDMwKQorI2RlZmluZSBOVl9SWDJfQVZBSUwJCSgxPDwzMSkKKworLyogTWlzY2VsYW5lb3VzIGhhcmR3YXJlIHJlbGF0ZWQgZGVmaW5lczogKi8KKyNkZWZpbmUgTlZfUENJX1JFR1NaCQkweDI3MAorCisvKiB2YXJpb3VzIHRpbWVvdXQgZGVsYXlzOiBhbGwgaW4gdXNlYyAqLworI2RlZmluZSBOVl9UWFJYX1JFU0VUX0RFTEFZCTQKKyNkZWZpbmUgTlZfVFhTVE9QX0RFTEFZMQkxMAorI2RlZmluZSBOVl9UWFNUT1BfREVMQVkxTUFYCTUwMDAwMAorI2RlZmluZSBOVl9UWFNUT1BfREVMQVkyCTEwMAorI2RlZmluZSBOVl9SWFNUT1BfREVMQVkxCTEwCisjZGVmaW5lIE5WX1JYU1RPUF9ERUxBWTFNQVgJNTAwMDAwCisjZGVmaW5lIE5WX1JYU1RPUF9ERUxBWTIJMTAwCisjZGVmaW5lIE5WX1NFVFVQNV9ERUxBWQkJNQorI2RlZmluZSBOVl9TRVRVUDVfREVMQVlNQVgJNTAwMDAKKyNkZWZpbmUgTlZfUE9XRVJVUF9ERUxBWQk1CisjZGVmaW5lIE5WX1BPV0VSVVBfREVMQVlNQVgJNTAwMAorI2RlZmluZSBOVl9NSUlCVVNZX0RFTEFZCTUwCisjZGVmaW5lIE5WX01JSVBIWV9ERUxBWQkxMAorI2RlZmluZSBOVl9NSUlQSFlfREVMQVlNQVgJMTAwMDAKKworI2RlZmluZSBOVl9XQUtFVVBQQVRURVJOUwk1CisjZGVmaW5lIE5WX1dBS0VVUE1BU0tFTlRSSUVTCTQKKworLyogR2VuZXJhbCBkcml2ZXIgZGVmYXVsdHMgKi8KKyNkZWZpbmUgTlZfV0FUQ0hET0dfVElNRU8JKDUqSFopCisKKyNkZWZpbmUgUlhfUklORwkJMTI4CisjZGVmaW5lIFRYX1JJTkcJCTY0CisvKiAKKyAqIElmIHlvdXIgbmljIG15c3RlcmlvdXNseSBoYW5ncyB0aGVuIHRyeSB0byByZWR1Y2UgdGhlIGxpbWl0cworICogdG8gMS8wOiBJdCBtaWdodCBiZSByZXF1aXJlZCB0byBzZXQgTlZfVFhfTEFTVFBBQ0tFVCBpbiB0aGUKKyAqIGxhc3QgdmFsaWQgcmluZyBlbnRyeS4gQnV0IHRoaXMgd291bGQgYmUgaW1wb3NzaWJsZSB0bworICogaW1wbGVtZW50IC0gcHJvYmFibHkgYSBkaXNhc3NlbWJseSBlcnJvci4KKyAqLworI2RlZmluZSBUWF9MSU1JVF9TVE9QCTYzCisjZGVmaW5lIFRYX0xJTUlUX1NUQVJUCTYyCisKKy8qIHJ4L3R4IG1hYyBhZGRyICsgdHlwZSArIHZsYW4gKyBhbGlnbiArIHNsYWNrKi8KKyNkZWZpbmUgUlhfTklDX0JVRlNJWkUJCShFVEhfREFUQV9MRU4gKyA2NCkKKy8qIGV2ZW4gbW9yZSBzbGFjayAqLworI2RlZmluZSBSWF9BTExPQ19CVUZTSVpFCShFVEhfREFUQV9MRU4gKyAxMjgpCisKKyNkZWZpbmUgT09NX1JFRklMTAkoMStIWi8yMCkKKyNkZWZpbmUgUE9MTF9XQUlUCSgxK0haLzEwMCkKKyNkZWZpbmUgTElOS19USU1FT1VUCSgzKkhaKQorCisvKiAKKyAqIGRlc2NfdmVyIHZhbHVlczoKKyAqIFRoaXMgZmllbGQgaGFzIHR3byBwdXJwb3NlczoKKyAqIC0gTmV3ZXIgbmljcyB1c2VzIGEgZGlmZmVyZW50IHJpbmcgbGF5b3V0LiBUaGUgbGF5b3V0IGlzIHNlbGVjdGVkIGJ5CisgKiAgIGNvbXBhcmluZyBucC0+ZGVzY192ZXIgd2l0aCBERVNDX1ZFUl94eS4KKyAqIC0gSXQgY29udGFpbnMgYml0cyB0aGF0IGFyZSBmb3JjZWQgb24gd2hlbiB3cml0aW5nIHRvIE52UmVnVHhSeENvbnRyb2wuCisgKi8KKyNkZWZpbmUgREVTQ19WRVJfMQkweDAKKyNkZWZpbmUgREVTQ19WRVJfMgkoMHgwMjEwMHxOVlJFR19UWFJYQ1RMX1JYQ0hFQ0spCisKKy8qIFBIWSBkZWZpbmVzICovCisjZGVmaW5lIFBIWV9PVUlfTUFSVkVMTAkweDUwNDMKKyNkZWZpbmUgUEhZX09VSV9DSUNBREEJMHgwM2YxCisjZGVmaW5lIFBIWUlEMV9PVUlfTUFTSwkweDAzZmYKKyNkZWZpbmUgUEhZSUQxX09VSV9TSEZUCTYKKyNkZWZpbmUgUEhZSUQyX09VSV9NQVNLCTB4ZmMwMAorI2RlZmluZSBQSFlJRDJfT1VJX1NIRlQJMTAKKyNkZWZpbmUgUEhZX0lOSVQxCTB4MGYwMDAKKyNkZWZpbmUgUEhZX0lOSVQyCTB4MGUwMAorI2RlZmluZSBQSFlfSU5JVDMJMHgwMTAwMAorI2RlZmluZSBQSFlfSU5JVDQJMHgwMjAwCisjZGVmaW5lIFBIWV9JTklUNQkweDAwMDQKKyNkZWZpbmUgUEhZX0lOSVQ2CTB4MDIwMDAKKyNkZWZpbmUgUEhZX0dJR0FCSVQJMHgwMTAwCisKKyNkZWZpbmUgUEhZX1RJTUVPVVQJMHgxCisjZGVmaW5lIFBIWV9FUlJPUgkweDIKKworI2RlZmluZSBQSFlfMTAwCTB4MQorI2RlZmluZSBQSFlfMTAwMAkweDIKKyNkZWZpbmUgUEhZX0hBTEYJMHgxMDAKKworLyogRklYTUU6IE1JSSBkZWZpbmVzIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIDxsaW51eC9taWkuaD4gKi8KKyNkZWZpbmUgTUlJXzEwMDBCVF9DUgkweDA5CisjZGVmaW5lIE1JSV8xMDAwQlRfU1IJMHgwYQorI2RlZmluZSBBRFZFUlRJU0VfMTAwMEZVTEwJMHgwMjAwCisjZGVmaW5lIEFEVkVSVElTRV8xMDAwSEFMRgkweDAxMDAKKyNkZWZpbmUgTFBBXzEwMDBGVUxMCTB4MDgwMAorI2RlZmluZSBMUEFfMTAwMEhBTEYJMHgwNDAwCisKKworLyoKKyAqIFNNUCBsb2NraW5nOgorICogQWxsIGhhcmR3YXJlIGFjY2VzcyB1bmRlciBkZXYtPnByaXYtPmxvY2ssIGV4Y2VwdCB0aGUgcGVyZm9ybWFuY2UKKyAqIGNyaXRpY2FsIHBhcnRzOgorICogLSByeCBpcyAocHNldWRvLSkgbG9ja2xlc3M6IGl0IHJlbGllcyBvbiB0aGUgc2luZ2xlLXRocmVhZGluZyBwcm92aWRlZAorICoJYnkgdGhlIGFyY2ggY29kZSBmb3IgaW50ZXJydXB0cy4KKyAqIC0gdHggc2V0dXAgaXMgbG9ja2xlc3M6IGl0IHJlbGllcyBvbiBkZXYtPnhtaXRfbG9jay4gQWN0dWFsIHN1Ym1pc3Npb24KKyAqCW5lZWRzIGRldi0+cHJpdi0+bG9jayA6LSgKKyAqIC0gc2V0X211bHRpY2FzdF9saXN0OiBwcmVwYXJhdGlvbiBsb2NrbGVzcywgcmVsaWVzIG9uIGRldi0+eG1pdF9sb2NrLgorICovCisKKy8qIGluIGRldjogYmFzZSwgaXJxICovCitzdHJ1Y3QgZmVfcHJpdiB7CisJc3BpbmxvY2tfdCBsb2NrOworCisJLyogR2VuZXJhbCBkYXRhOgorCSAqIExvY2tpbmc6IHNwaW5fbG9jaygmbnAtPmxvY2spOyAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWludCBpbl9zaHV0ZG93bjsKKwl1MzIgbGlua3NwZWVkOworCWludCBkdXBsZXg7CisJaW50IGF1dG9uZWc7CisJaW50IGZpeGVkX21vZGU7CisJaW50IHBoeWFkZHI7CisJaW50IHdvbGVuYWJsZWQ7CisJdW5zaWduZWQgaW50IHBoeV9vdWk7CisJdTE2IGdpZ2FiaXQ7CisKKwkvKiBHZW5lcmFsIGRhdGE6IFJPIGZpZWxkcyAqLworCWRtYV9hZGRyX3QgcmluZ19hZGRyOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCXUzMiBvcmlnX21hY1syXTsKKwl1MzIgaXJxbWFzazsKKwl1MzIgZGVzY192ZXI7CisKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisKKwkvKiByeCBzcGVjaWZpYyBmaWVsZHMuCisJICogTG9ja2luZzogV2l0aGluIGlycSBoYW5kZXIgb3IgZGlzYWJsZV9pcnErc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJICovCisJc3RydWN0IHJpbmdfZGVzYyAqcnhfcmluZzsKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCByZWZpbGxfcng7CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYnVmZltSWF9SSU5HXTsKKwlkbWFfYWRkcl90IHJ4X2RtYVtSWF9SSU5HXTsKKwl1bnNpZ25lZCBpbnQgcnhfYnVmX3N6OworCXN0cnVjdCB0aW1lcl9saXN0IG9vbV9raWNrOworCXN0cnVjdCB0aW1lcl9saXN0IG5pY19wb2xsOworCisJLyogbWVkaWEgZGV0ZWN0aW9uIHdvcmthcm91bmQuCisJICogTG9ja2luZzogV2l0aGluIGlycSBoYW5kZXIgb3IgZGlzYWJsZV9pcnErc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJICovCisJaW50IG5lZWRfbGlua3RpbWVyOworCXVuc2lnbmVkIGxvbmcgbGlua190aW1lb3V0OworCS8qCisJICogdHggc3BlY2lmaWMgZmllbGRzLgorCSAqLworCXN0cnVjdCByaW5nX2Rlc2MgKnR4X3Jpbmc7CisJdW5zaWduZWQgaW50IG5leHRfdHgsIG5pY190eDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tidWZmW1RYX1JJTkddOworCWRtYV9hZGRyX3QgdHhfZG1hW1RYX1JJTkddOworCXUzMiB0eF9mbGFnczsKK307CisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBsb29wcyB1bnRpbCB3ZSBhc3N1bWUgdGhhdCBhIGJpdCBpbiB0aGUgaXJxIG1hc2sKKyAqIGlzIHN0dWNrLiBPdmVycmlkYWJsZSB3aXRoIG1vZHVsZSBwYXJhbS4KKyAqLworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSA1OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBmZV9wcml2ICpnZXRfbnZwcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIG5ldGRldl9wcml2KGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggX19pb21lbSAqZ2V0X2h3YmFzZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBnZXRfbnZwcml2KGRldiktPmJhc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfcHVzaCh1OCBfX2lvbWVtICpiYXNlKQoreworCS8qIGZvcmNlIG91dCBwZW5kaW5nIHBvc3RlZCB3cml0ZXMgKi8KKwlyZWFkbChiYXNlKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbnZfZGVzY3JfZ2V0bGVuZ3RoKHN0cnVjdCByaW5nX2Rlc2MgKnByZCwgdTMyIHYpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KHByZC0+RmxhZ0xlbikKKwkJJiAoKHYgPT0gREVTQ19WRVJfMSkgPyBMRU5fTUFTS19WMSA6IExFTl9NQVNLX1YyKTsKK30KKworc3RhdGljIGludCByZWdfZGVsYXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9mZnNldCwgdTMyIG1hc2ssIHUzMiB0YXJnZXQsCisJCQkJaW50IGRlbGF5LCBpbnQgZGVsYXltYXgsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCisJcGNpX3B1c2goYmFzZSk7CisJZG8geworCQl1ZGVsYXkoZGVsYXkpOworCQlkZWxheW1heCAtPSBkZWxheTsKKwkJaWYgKGRlbGF5bWF4IDwgMCkgeworCQkJaWYgKG1zZykKKwkJCQlwcmludGsobXNnKTsKKwkJCXJldHVybiAxOworCQl9CisJfSB3aGlsZSAoKHJlYWRsKGJhc2UgKyBvZmZzZXQpICYgbWFzaykgIT0gdGFyZ2V0KTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNSUlfUkVBRAkoLTEpCisvKiBtaWlfcnc6IHJlYWQvd3JpdGUgYSByZWdpc3RlciBvbiB0aGUgUEhZLgorICoKKyAqIENhbGxlciBtdXN0IGd1YXJhbnRlZSBzZXJpYWxpemF0aW9uCisgKi8KK3N0YXRpYyBpbnQgbWlpX3J3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhZGRyLCBpbnQgbWlpcmVnLCBpbnQgdmFsdWUpCit7CisJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKwl1MzIgcmVnOworCWludCByZXR2YWw7CisKKwl3cml0ZWwoTlZSRUdfTUlJU1RBVF9NQVNLLCBiYXNlICsgTnZSZWdNSUlTdGF0dXMpOworCisJcmVnID0gcmVhZGwoYmFzZSArIE52UmVnTUlJQ29udHJvbCk7CisJaWYgKHJlZyAmIE5WUkVHX01JSUNUTF9JTlVTRSkgeworCQl3cml0ZWwoTlZSRUdfTUlJQ1RMX0lOVVNFLCBiYXNlICsgTnZSZWdNSUlDb250cm9sKTsKKwkJdWRlbGF5KE5WX01JSUJVU1lfREVMQVkpOworCX0KKworCXJlZyA9IChhZGRyIDw8IE5WUkVHX01JSUNUTF9BRERSU0hJRlQpIHwgbWlpcmVnOworCWlmICh2YWx1ZSAhPSBNSUlfUkVBRCkgeworCQl3cml0ZWwodmFsdWUsIGJhc2UgKyBOdlJlZ01JSURhdGEpOworCQlyZWcgfD0gTlZSRUdfTUlJQ1RMX1dSSVRFOworCX0KKwl3cml0ZWwocmVnLCBiYXNlICsgTnZSZWdNSUlDb250cm9sKTsKKworCWlmIChyZWdfZGVsYXkoZGV2LCBOdlJlZ01JSUNvbnRyb2wsIE5WUkVHX01JSUNUTF9JTlVTRSwgMCwKKwkJCU5WX01JSVBIWV9ERUxBWSwgTlZfTUlJUEhZX0RFTEFZTUFYLCBOVUxMKSkgeworCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBtaWlfcncgb2YgcmVnICVkIGF0IFBIWSAlZCB0aW1lZCBvdXQuXG4iLAorCQkJCWRldi0+bmFtZSwgbWlpcmVnLCBhZGRyKTsKKwkJcmV0dmFsID0gLTE7CisJfSBlbHNlIGlmICh2YWx1ZSAhPSBNSUlfUkVBRCkgeworCQkvKiBpdCB3YXMgYSB3cml0ZSBvcGVyYXRpb24gLSBmZXdlciBmYWlsdXJlcyBhcmUgZGV0ZWN0YWJsZSAqLworCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBtaWlfcncgd3JvdGUgMHgleCB0byByZWcgJWQgYXQgUEhZICVkXG4iLAorCQkJCWRldi0+bmFtZSwgdmFsdWUsIG1paXJlZywgYWRkcik7CisJCXJldHZhbCA9IDA7CisJfSBlbHNlIGlmIChyZWFkbChiYXNlICsgTnZSZWdNSUlTdGF0dXMpICYgTlZSRUdfTUlJU1RBVF9FUlJPUikgeworCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBtaWlfcncgb2YgcmVnICVkIGF0IFBIWSAlZCBmYWlsZWQuXG4iLAorCQkJCWRldi0+bmFtZSwgbWlpcmVnLCBhZGRyKTsKKwkJcmV0dmFsID0gLTE7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gcmVhZGwoYmFzZSArIE52UmVnTUlJRGF0YSk7CisJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG1paV9ydyByZWFkIGZyb20gcmVnICVkIGF0IFBIWSAlZDogMHgleC5cbiIsCisJCQkJZGV2LT5uYW1lLCBtaWlyZWcsIGFkZHIsIHJldHZhbCk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBwaHlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CisJdTMyIG1paWNvbnRyb2w7CisJdW5zaWduZWQgaW50IHRyaWVzID0gMDsKKworCW1paWNvbnRyb2wgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIE1JSV9SRUFEKTsKKwltaWljb250cm9sIHw9IEJNQ1JfUkVTRVQ7CisJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQk1DUiwgbWlpY29udHJvbCkpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHdhaXQgZm9yIDUwMG1zICovCisJbXNsZWVwKDUwMCk7CisKKwkvKiBtdXN0IHdhaXQgdGlsbCByZXNldCBpcyBkZWFzc2VydGVkICovCisJd2hpbGUgKG1paWNvbnRyb2wgJiBCTUNSX1JFU0VUKSB7CisJCW1zbGVlcCgxMCk7CisJCW1paWNvbnRyb2wgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIE1JSV9SRUFEKTsKKwkJLyogRklYTUU6IDEwMCB0cmllcyBzZWVtIGV4Y2Vzc2l2ZSAqLworCQlpZiAodHJpZXMrKyA+IDEwMCkKKwkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGh5X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CisJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKwl1MzIgcGh5aW50ZXJmYWNlLCBwaHlfcmVzZXJ2ZWQsIG1paV9zdGF0dXMsIG1paV9jb250cm9sLCBtaWlfY29udHJvbF8xMDAwLHJlZzsKKworCS8qIHNldCBhZHZlcnRpc2UgcmVnaXN0ZXIgKi8KKwlyZWcgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0FEVkVSVElTRSwgTUlJX1JFQUQpOworCXJlZyB8PSAoQURWRVJUSVNFXzEwSEFMRnxBRFZFUlRJU0VfMTBGVUxMfEFEVkVSVElTRV8xMDBIQUxGfEFEVkVSVElTRV8xMDBGVUxMfDB4ODAwfDB4NDAwKTsKKwlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9BRFZFUlRJU0UsIHJlZykpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSB3cml0ZSB0byBhZHZlcnRpc2UgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJcmV0dXJuIFBIWV9FUlJPUjsKKwl9CisKKwkvKiBnZXQgcGh5IGludGVyZmFjZSB0eXBlICovCisJcGh5aW50ZXJmYWNlID0gcmVhZGwoYmFzZSArIE52UmVnUGh5SW50ZXJmYWNlKTsKKworCS8qIHNlZSBpZiBnaWdhYml0IHBoeSAqLworCW1paV9zdGF0dXMgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNU1IsIE1JSV9SRUFEKTsKKwlpZiAobWlpX3N0YXR1cyAmIFBIWV9HSUdBQklUKSB7CisJCW5wLT5naWdhYml0ID0gUEhZX0dJR0FCSVQ7CisJCW1paV9jb250cm9sXzEwMDAgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJXzEwMDBCVF9DUiwgTUlJX1JFQUQpOworCQltaWlfY29udHJvbF8xMDAwICY9IH5BRFZFUlRJU0VfMTAwMEhBTEY7CisJCWlmIChwaHlpbnRlcmZhY2UgJiBQSFlfUkdNSUkpCisJCQltaWlfY29udHJvbF8xMDAwIHw9IEFEVkVSVElTRV8xMDAwRlVMTDsKKwkJZWxzZQorCQkJbWlpX2NvbnRyb2xfMTAwMCAmPSB+QURWRVJUSVNFXzEwMDBGVUxMOworCisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJXzEwMDBCVF9DUiwgbWlpX2NvbnRyb2xfMTAwMCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCX0KKwllbHNlCisJCW5wLT5naWdhYml0ID0gMDsKKworCS8qIHJlc2V0IHRoZSBwaHkgKi8KKwlpZiAocGh5X3Jlc2V0KGRldikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSByZXNldCBmYWlsZWRcbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCXJldHVybiBQSFlfRVJST1I7CisJfQorCisJLyogcGh5IHZlbmRvciBzcGVjaWZpYyBjb25maWd1cmF0aW9uICovCisJaWYgKChucC0+cGh5X291aSA9PSBQSFlfT1VJX0NJQ0FEQSkgJiYgKHBoeWludGVyZmFjZSAmIFBIWV9SR01JSSkgKSB7CisJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfUkVTVjEsIE1JSV9SRUFEKTsKKwkJcGh5X3Jlc2VydmVkICY9IH4oUEhZX0lOSVQxIHwgUEhZX0lOSVQyKTsKKwkJcGh5X3Jlc2VydmVkIHw9IChQSFlfSU5JVDMgfCBQSFlfSU5JVDQpOworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9SRVNWMSwgcGh5X3Jlc2VydmVkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfTkNPTkZJRywgTUlJX1JFQUQpOworCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX0lOSVQ1OworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9OQ09ORklHLCBwaHlfcmVzZXJ2ZWQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwl9CisJaWYgKG5wLT5waHlfb3VpID09IFBIWV9PVUlfQ0lDQURBKSB7CisJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfU1JFVklTSU9OLCBNSUlfUkVBRCk7CisJCXBoeV9yZXNlcnZlZCB8PSBQSFlfSU5JVDY7CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX1NSRVZJU0lPTiwgcGh5X3Jlc2VydmVkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJfQorCisJLyogcmVzdGFydCBhdXRvIG5lZ290aWF0aW9uICovCisJbWlpX2NvbnRyb2wgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIE1JSV9SRUFEKTsKKwltaWlfY29udHJvbCB8PSAoQk1DUl9BTlJFU1RBUlQgfCBCTUNSX0FORU5BQkxFKTsKKwlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9CTUNSLCBtaWlfY29udHJvbCkpIHsKKwkJcmV0dXJuIFBIWV9FUlJPUjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbnZfc3RhcnRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CisJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKworCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3N0YXJ0X3J4XG4iLCBkZXYtPm5hbWUpOworCS8qIEFscmVhZHkgcnVubmluZz8gU3RvcCBpdC4gKi8KKwlpZiAocmVhZGwoYmFzZSArIE52UmVnUmVjZWl2ZXJDb250cm9sKSAmIE5WUkVHX1JDVkNUTF9TVEFSVCkgeworCQl3cml0ZWwoMCwgYmFzZSArIE52UmVnUmVjZWl2ZXJDb250cm9sKTsKKwkJcGNpX3B1c2goYmFzZSk7CisJfQorCXdyaXRlbChucC0+bGlua3NwZWVkLCBiYXNlICsgTnZSZWdMaW5rU3BlZWQpOworCXBjaV9wdXNoKGJhc2UpOworCXdyaXRlbChOVlJFR19SQ1ZDVExfU1RBUlQsIGJhc2UgKyBOdlJlZ1JlY2VpdmVyQ29udHJvbCk7CisJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfc3RhcnRfcnggdG8gZHVwbGV4ICVkLCBzcGVlZCAweCUwOHguXG4iLAorCQkJCWRldi0+bmFtZSwgbnAtPmR1cGxleCwgbnAtPmxpbmtzcGVlZCk7CisJcGNpX3B1c2goYmFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIG52X3N0b3Bfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCisJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfc3RvcF9yeFxuIiwgZGV2LT5uYW1lKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnUmVjZWl2ZXJDb250cm9sKTsKKwlyZWdfZGVsYXkoZGV2LCBOdlJlZ1JlY2VpdmVyU3RhdHVzLCBOVlJFR19SQ1ZTVEFUX0JVU1ksIDAsCisJCQlOVl9SWFNUT1BfREVMQVkxLCBOVl9SWFNUT1BfREVMQVkxTUFYLAorCQkJS0VSTl9JTkZPICJudl9zdG9wX3J4OiBSZWNlaXZlclN0YXR1cyByZW1haW5lZCBidXN5Iik7CisKKwl1ZGVsYXkoTlZfUlhTVE9QX0RFTEFZMik7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ0xpbmtTcGVlZCk7Cit9CisKK3N0YXRpYyB2b2lkIG52X3N0YXJ0X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKworCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3N0YXJ0X3R4XG4iLCBkZXYtPm5hbWUpOworCXdyaXRlbChOVlJFR19YTUlUQ1RMX1NUQVJULCBiYXNlICsgTnZSZWdUcmFuc21pdHRlckNvbnRyb2wpOworCXBjaV9wdXNoKGJhc2UpOworfQorCitzdGF0aWMgdm9pZCBudl9zdG9wX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKworCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3N0b3BfdHhcbiIsIGRldi0+bmFtZSk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1RyYW5zbWl0dGVyQ29udHJvbCk7CisJcmVnX2RlbGF5KGRldiwgTnZSZWdUcmFuc21pdHRlclN0YXR1cywgTlZSRUdfWE1JVFNUQVRfQlVTWSwgMCwKKwkJCU5WX1RYU1RPUF9ERUxBWTEsIE5WX1RYU1RPUF9ERUxBWTFNQVgsCisJCQlLRVJOX0lORk8gIm52X3N0b3BfdHg6IFRyYW5zbWl0dGVyU3RhdHVzIHJlbWFpbmVkIGJ1c3kiKTsKKworCXVkZWxheShOVl9UWFNUT1BfREVMQVkyKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnVW5rbm93blRyYW5zbWl0dGVyUmVnKTsKK30KKworc3RhdGljIHZvaWQgbnZfdHhyeF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCisJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfdHhyeF9yZXNldFxuIiwgZGV2LT5uYW1lKTsKKwl3cml0ZWwoTlZSRUdfVFhSWENUTF9CSVQyIHwgTlZSRUdfVFhSWENUTF9SRVNFVCB8IG5wLT5kZXNjX3ZlciwgYmFzZSArIE52UmVnVHhSeENvbnRyb2wpOworCXBjaV9wdXNoKGJhc2UpOworCXVkZWxheShOVl9UWFJYX1JFU0VUX0RFTEFZKTsKKwl3cml0ZWwoTlZSRUdfVFhSWENUTF9CSVQyIHwgbnAtPmRlc2NfdmVyLCBiYXNlICsgTnZSZWdUeFJ4Q29udHJvbCk7CisJcGNpX3B1c2goYmFzZSk7Cit9CisKKy8qCisgKiBudl9nZXRfc3RhdHM6IGRldi0+Z2V0X3N0YXRzIGZ1bmN0aW9uCisgKiBHZXQgbGF0ZXN0IHN0YXRzIHZhbHVlIGZyb20gdGhlIG5pYy4KKyAqIENhbGxlZCB3aXRoIHJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jaykgaGVsZCBmb3IgcmVhZCAtCisgKiBvbmx5IHN5bmNocm9uaXplZCBhZ2FpbnN0IHVucmVnaXN0ZXJfbmV0ZGV2aWNlLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm52X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKworCS8qIEl0IHNlZW1zIHRoYXQgdGhlIG5pYyBhbHdheXMgZ2VuZXJhdGVzIGludGVycnVwdHMgYW5kIGRvZXNuJ3QKKwkgKiBhY2N1bXVsYXRlIGVycm9ycyBpbnRlcm5hbGx5LiBUaHVzIHRoZSBjdXJyZW50IHZhbHVlcyBpbiBucC0+c3RhdHMKKwkgKiBhcmUgYWxyZWFkeSB1cCB0byBkYXRlLgorCSAqLworCXJldHVybiAmbnAtPnN0YXRzOworfQorCisvKgorICogbnZfYWxsb2Nfcng6IGZpbGwgcnggcmluZyBlbnRyaWVzLgorICogUmV0dXJuIDEgaWYgdGhlIGFsbG9jYXRpb25zIGZvciB0aGUgc2ticyBmYWlsZWQgYW5kIHRoZQorICogcnggZW5naW5lIGlzIHdpdGhvdXQgQXZhaWxhYmxlIGRlc2NyaXB0b3JzCisgKi8KK3N0YXRpYyBpbnQgbnZfYWxsb2Nfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CisJdW5zaWduZWQgaW50IHJlZmlsbF9yeCA9IG5wLT5yZWZpbGxfcng7CisJaW50IG5yOworCisJd2hpbGUgKG5wLT5jdXJfcnggIT0gcmVmaWxsX3J4KSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJbnIgPSByZWZpbGxfcnggJSBSWF9SSU5HOworCQlpZiAobnAtPnJ4X3NrYnVmZltucl0gPT0gTlVMTCkgeworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKFJYX0FMTE9DX0JVRlNJWkUpOworCQkJaWYgKCFza2IpCisJCQkJYnJlYWs7CisKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJbnAtPnJ4X3NrYnVmZltucl0gPSBza2I7CisJCX0gZWxzZSB7CisJCQlza2IgPSBucC0+cnhfc2tidWZmW25yXTsKKwkJfQorCQlucC0+cnhfZG1hW25yXSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJbnAtPnJ4X3JpbmdbbnJdLlBhY2tldEJ1ZmZlciA9IGNwdV90b19sZTMyKG5wLT5yeF9kbWFbbnJdKTsKKwkJd21iKCk7CisJCW5wLT5yeF9yaW5nW25yXS5GbGFnTGVuID0gY3B1X3RvX2xlMzIoUlhfTklDX0JVRlNJWkUgfCBOVl9SWF9BVkFJTCk7CisJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X2FsbG9jX3J4OiBQYWNrZXQgJWQgbWFya2VkIGFzIEF2YWlsYWJsZVxuIiwKKwkJCQkJZGV2LT5uYW1lLCByZWZpbGxfcngpOworCQlyZWZpbGxfcngrKzsKKwl9CisJbnAtPnJlZmlsbF9yeCA9IHJlZmlsbF9yeDsKKwlpZiAobnAtPmN1cl9yeCAtIHJlZmlsbF9yeCA9PSBSWF9SSU5HKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbnZfZG9fcnhfcmVmaWxsKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCWlmIChudl9hbGxvY19yeChkZXYpKSB7CisJCXNwaW5fbG9jaygmbnAtPmxvY2spOworCQlpZiAoIW5wLT5pbl9zaHV0ZG93bikKKwkJCW1vZF90aW1lcigmbnAtPm9vbV9raWNrLCBqaWZmaWVzICsgT09NX1JFRklMTCk7CisJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJfQorCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorCitzdGF0aWMgaW50IG52X2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwlpbnQgaTsKKworCW5wLT5uZXh0X3R4ID0gbnAtPm5pY190eCA9IDA7CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkc7IGkrKykKKwkJbnAtPnR4X3JpbmdbaV0uRmxhZ0xlbiA9IDA7CisKKwlucC0+Y3VyX3J4ID0gUlhfUklORzsKKwlucC0+cmVmaWxsX3J4ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklORzsgaSsrKQorCQlucC0+cnhfcmluZ1tpXS5GbGFnTGVuID0gMDsKKwlyZXR1cm4gbnZfYWxsb2NfcngoZGV2KTsKK30KKworc3RhdGljIHZvaWQgbnZfZHJhaW5fdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkc7IGkrKykgeworCQlucC0+dHhfcmluZ1tpXS5GbGFnTGVuID0gMDsKKwkJaWYgKG5wLT50eF9za2J1ZmZbaV0pIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIG5wLT50eF9kbWFbaV0sCisJCQkJCQlucC0+dHhfc2tidWZmW2ldLT5sZW4sCisJCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IobnAtPnR4X3NrYnVmZltpXSk7CisJCQlucC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJCW5wLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG52X2RyYWluX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HOyBpKyspIHsKKwkJbnAtPnJ4X3JpbmdbaV0uRmxhZ0xlbiA9IDA7CisJCXdtYigpOworCQlpZiAobnAtPnJ4X3NrYnVmZltpXSkgeworCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwgbnAtPnJ4X2RtYVtpXSwKKwkJCQkJCW5wLT5yeF9za2J1ZmZbaV0tPmxlbiwKKwkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKG5wLT5yeF9za2J1ZmZbaV0pOworCQkJbnAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRyYWluX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwludl9kcmFpbl90eChkZXYpOworCW52X2RyYWluX3J4KGRldik7Cit9CisKKy8qCisgKiBudl9zdGFydF94bWl0OiBkZXYtPmhhcmRfc3RhcnRfeG1pdCBmdW5jdGlvbgorICogQ2FsbGVkIHdpdGggZGV2LT54bWl0X2xvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBudl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCWludCBuciA9IG5wLT5uZXh0X3R4ICUgVFhfUklORzsKKworCW5wLT50eF9za2J1ZmZbbnJdID0gc2tiOworCW5wLT50eF9kbWFbbnJdID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSxza2ItPmxlbiwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisKKwlucC0+dHhfcmluZ1tucl0uUGFja2V0QnVmZmVyID0gY3B1X3RvX2xlMzIobnAtPnR4X2RtYVtucl0pOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXdtYigpOworCW5wLT50eF9yaW5nW25yXS5GbGFnTGVuID0gY3B1X3RvX2xlMzIoIChza2ItPmxlbi0xKSB8IG5wLT50eF9mbGFncyApOworCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3N0YXJ0X3htaXQ6IHBhY2tldCBwYWNrZXQgJWQgcXVldWVkIGZvciB0cmFuc21pc3Npb24uXG4iLAorCQkJCWRldi0+bmFtZSwgbnAtPm5leHRfdHgpOworCXsKKwkJaW50IGo7CisJCWZvciAoaj0wOyBqPDY0OyBqKyspIHsKKwkJCWlmICgoaiUxNikgPT0gMCkKKwkJCQlkcHJpbnRrKCJcbiUwM3g6Iiwgaik7CisJCQlkcHJpbnRrKCIgJTAyeCIsICgodW5zaWduZWQgY2hhciopc2tiLT5kYXRhKVtqXSk7CisJCX0KKwkJZHByaW50aygiXG4iKTsKKwl9CisKKwlucC0+bmV4dF90eCsrOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJaWYgKG5wLT5uZXh0X3R4IC0gbnAtPm5pY190eCA+PSBUWF9MSU1JVF9TVE9QKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJd3JpdGVsKE5WUkVHX1RYUlhDVExfS0lDS3xucC0+ZGVzY192ZXIsIGdldF9od2Jhc2UoZGV2KSArIE52UmVnVHhSeENvbnRyb2wpOworCXBjaV9wdXNoKGdldF9od2Jhc2UoZGV2KSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBudl90eF9kb25lOiBjaGVjayBmb3IgY29tcGxldGVkIHBhY2tldHMsIHJlbGVhc2UgdGhlIHNrYnMuCisgKgorICogQ2FsbGVyIG11c3Qgb3duIG5wLT5sb2NrLgorICovCitzdGF0aWMgdm9pZCBudl90eF9kb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCXUzMiBGbGFnczsKKwlpbnQgaTsKKworCXdoaWxlIChucC0+bmljX3R4ICE9IG5wLT5uZXh0X3R4KSB7CisJCWkgPSBucC0+bmljX3R4ICUgVFhfUklORzsKKworCQlGbGFncyA9IGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nW2ldLkZsYWdMZW4pOworCisJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3R4X2RvbmU6IGxvb2tpbmcgYXQgcGFja2V0ICVkLCBGbGFncyAweCV4LlxuIiwKKwkJCQkJZGV2LT5uYW1lLCBucC0+bmljX3R4LCBGbGFncyk7CisJCWlmIChGbGFncyAmIE5WX1RYX1ZBTElEKQorCQkJYnJlYWs7CisJCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSkgeworCQkJaWYgKEZsYWdzICYgKE5WX1RYX1JFVFJZRVJST1J8TlZfVFhfQ0FSUklFUkxPU1R8TlZfVFhfTEFURUNPTExJU0lPTnwKKwkJCQkJCQlOVl9UWF9VTkRFUkZMT1d8TlZfVFhfRVJST1IpKSB7CisJCQkJaWYgKEZsYWdzICYgTlZfVFhfVU5ERVJGTE9XKQorCQkJCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQlpZiAoRmxhZ3MgJiBOVl9UWF9DQVJSSUVSTE9TVCkKKwkJCQkJbnAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJbnAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJfSBlbHNlIHsKKwkJCQlucC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCW5wLT5zdGF0cy50eF9ieXRlcyArPSBucC0+dHhfc2tidWZmW2ldLT5sZW47CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoRmxhZ3MgJiAoTlZfVFgyX1JFVFJZRVJST1J8TlZfVFgyX0NBUlJJRVJMT1NUfE5WX1RYMl9MQVRFQ09MTElTSU9OfAorCQkJCQkJCU5WX1RYMl9VTkRFUkZMT1d8TlZfVFgyX0VSUk9SKSkgeworCQkJCWlmIChGbGFncyAmIE5WX1RYMl9VTkRFUkZMT1cpCisJCQkJCW5wLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCWlmIChGbGFncyAmIE5WX1RYMl9DQVJSSUVSTE9TVCkKKwkJCQkJbnAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJbnAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJfSBlbHNlIHsKKwkJCQlucC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCW5wLT5zdGF0cy50eF9ieXRlcyArPSBucC0+dHhfc2tidWZmW2ldLT5sZW47CisJCQl9CisJCX0KKwkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwgbnAtPnR4X2RtYVtpXSwKKwkJCQkJbnAtPnR4X3NrYnVmZltpXS0+bGVuLAorCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9pcnEobnAtPnR4X3NrYnVmZltpXSk7CisJCW5wLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQlucC0+bmljX3R4Kys7CisJfQorCWlmIChucC0+bmV4dF90eCAtIG5wLT5uaWNfdHggPCBUWF9MSU1JVF9TVEFSVCkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKgorICogbnZfdHhfdGltZW91dDogZGV2LT50eF90aW1lb3V0IGZ1bmN0aW9uCisgKiBDYWxsZWQgd2l0aCBkZXYtPnhtaXRfbG9jayBoZWxkLgorICovCitzdGF0aWMgdm9pZCBudl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisKKwlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBHb3QgdHhfdGltZW91dC4gaXJxOiAlMDh4XG4iLCBkZXYtPm5hbWUsCisJCQlyZWFkbChiYXNlICsgTnZSZWdJcnFTdGF0dXMpICYgTlZSRUdfSVJRU1RBVF9NQVNLKTsKKworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKworCS8qIDEpIHN0b3AgdHggZW5naW5lICovCisJbnZfc3RvcF90eChkZXYpOworCisJLyogMikgY2hlY2sgdGhhdCB0aGUgcGFja2V0cyB3ZXJlIG5vdCBzZW50IGFscmVhZHk6ICovCisJbnZfdHhfZG9uZShkZXYpOworCisJLyogMykgaWYgdGhlcmUgYXJlIGRlYWQgZW50cmllczogY2xlYXIgZXZlcnl0aGluZyAqLworCWlmIChucC0+bmV4dF90eCAhPSBucC0+bmljX3R4KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHhfdGltZW91dDogZGVhZCBlbnRyaWVzIVxuIiwgZGV2LT5uYW1lKTsKKwkJbnZfZHJhaW5fdHgoZGV2KTsKKwkJbnAtPm5leHRfdHggPSBucC0+bmljX3R4ID0gMDsKKwkJd3JpdGVsKCh1MzIpIChucC0+cmluZ19hZGRyICsgUlhfUklORypzaXplb2Yoc3RydWN0IHJpbmdfZGVzYykpLCBiYXNlICsgTnZSZWdUeFJpbmdQaHlzQWRkcik7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwkvKiA0KSByZXN0YXJ0IHR4IGVuZ2luZSAqLworCW52X3N0YXJ0X3R4KGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG52X3J4X3Byb2Nlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CisJdTMyIEZsYWdzOworCisJZm9yICg7OykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlpbnQgbGVuOworCQlpbnQgaTsKKwkJaWYgKG5wLT5jdXJfcnggLSBucC0+cmVmaWxsX3J4ID49IFJYX1JJTkcpCisJCQlicmVhazsJLyogd2Ugc2Nhbm5lZCB0aGUgd2hvbGUgcmluZyAtIGRvIG5vdCBjb250aW51ZSAqLworCisJCWkgPSBucC0+Y3VyX3J4ICUgUlhfUklORzsKKwkJRmxhZ3MgPSBsZTMyX3RvX2NwdShucC0+cnhfcmluZ1tpXS5GbGFnTGVuKTsKKwkJbGVuID0gbnZfZGVzY3JfZ2V0bGVuZ3RoKCZucC0+cnhfcmluZ1tpXSwgbnAtPmRlc2NfdmVyKTsKKworCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9yeF9wcm9jZXNzOiBsb29raW5nIGF0IHBhY2tldCAlZCwgRmxhZ3MgMHgleC5cbiIsCisJCQkJCWRldi0+bmFtZSwgbnAtPmN1cl9yeCwgRmxhZ3MpOworCisJCWlmIChGbGFncyAmIE5WX1JYX0FWQUlMKQorCQkJYnJlYWs7CS8qIHN0aWxsIG93bmVkIGJ5IGhhcmR3YXJlLCAqLworCisJCS8qCisJCSAqIHRoZSBwYWNrZXQgaXMgZm9yIHVzIC0gaW1tZWRpYXRlbHkgdGVhciBkb3duIHRoZSBwY2kgbWFwcGluZy4KKwkJICogVE9ETzogY2hlY2sgaWYgYSBwcmVmZXRjaCBvZiB0aGUgZmlyc3QgY2FjaGVsaW5lIGltcHJvdmVzCisJCSAqIHRoZSBwZXJmb3JtYW5jZS4KKwkJICovCisJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIG5wLT5yeF9kbWFbaV0sCisJCQkJbnAtPnJ4X3NrYnVmZltpXS0+bGVuLAorCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJeworCQkJaW50IGo7CisJCQlkcHJpbnRrKEtFUk5fREVCVUcgIkR1bXBpbmcgcGFja2V0IChmbGFncyAweCV4KS4iLEZsYWdzKTsKKwkJCWZvciAoaj0wOyBqPDY0OyBqKyspIHsKKwkJCQlpZiAoKGolMTYpID09IDApCisJCQkJCWRwcmludGsoIlxuJTAzeDoiLCBqKTsKKwkJCQlkcHJpbnRrKCIgJTAyeCIsICgodW5zaWduZWQgY2hhciopbnAtPnJ4X3NrYnVmZltpXS0+ZGF0YSlbal0pOworCQkJfQorCQkJZHByaW50aygiXG4iKTsKKwkJfQorCQkvKiBsb29rIGF0IHdoYXQgd2UgYWN0dWFsbHkgZ290OiAqLworCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEpIHsKKwkJCWlmICghKEZsYWdzICYgTlZfUlhfREVTQ1JJUFRPUlZBTElEKSkKKwkJCQlnb3RvIG5leHRfcGt0OworCisJCQlpZiAoRmxhZ3MgJiBOVl9SWF9NSVNTRURGUkFNRSkgeworCQkJCW5wLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKys7CisJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWdvdG8gbmV4dF9wa3Q7CisJCQl9CisJCQlpZiAoRmxhZ3MgJiAoTlZfUlhfRVJST1IxfE5WX1JYX0VSUk9SMnxOVl9SWF9FUlJPUjN8TlZfUlhfRVJST1I0KSkgeworCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlnb3RvIG5leHRfcGt0OworCQkJfQorCQkJaWYgKEZsYWdzICYgTlZfUlhfQ1JDRVJSKSB7CisJCQkJbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJZ290byBuZXh0X3BrdDsKKwkJCX0KKwkJCWlmIChGbGFncyAmIE5WX1JYX09WRVJGTE9XKSB7CisJCQkJbnAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWdvdG8gbmV4dF9wa3Q7CisJCQl9CisJCQlpZiAoRmxhZ3MgJiBOVl9SWF9FUlJPUikgeworCQkJCS8qIGZyYW1pbmcgZXJyb3JzIGFyZSBzb2Z0IGVycm9ycywgdGhlIHJlc3QgaXMgZmF0YWwuICovCisJCQkJaWYgKEZsYWdzICYgTlZfUlhfRlJBTUlOR0VSUikgeworCQkJCQlpZiAoRmxhZ3MgJiBOVl9SWF9TVUJTVFJBQ1QxKSB7CisJCQkJCQlsZW4tLTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQkJZ290byBuZXh0X3BrdDsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIShGbGFncyAmIE5WX1JYMl9ERVNDUklQVE9SVkFMSUQpKQorCQkJCWdvdG8gbmV4dF9wa3Q7CisKKwkJCWlmIChGbGFncyAmIChOVl9SWDJfRVJST1IxfE5WX1JYMl9FUlJPUjJ8TlZfUlgyX0VSUk9SM3xOVl9SWDJfRVJST1I0KSkgeworCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlnb3RvIG5leHRfcGt0OworCQkJfQorCQkJaWYgKEZsYWdzICYgTlZfUlgyX0NSQ0VSUikgeworCQkJCW5wLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWdvdG8gbmV4dF9wa3Q7CisJCQl9CisJCQlpZiAoRmxhZ3MgJiBOVl9SWDJfT1ZFUkZMT1cpIHsKKwkJCQlucC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJZ290byBuZXh0X3BrdDsKKwkJCX0KKwkJCWlmIChGbGFncyAmIE5WX1JYMl9FUlJPUikgeworCQkJCS8qIGZyYW1pbmcgZXJyb3JzIGFyZSBzb2Z0IGVycm9ycywgdGhlIHJlc3QgaXMgZmF0YWwuICovCisJCQkJaWYgKEZsYWdzICYgTlZfUlgyX0ZSQU1JTkdFUlIpIHsKKwkJCQkJaWYgKEZsYWdzICYgTlZfUlgyX1NVQlNUUkFDVDEpIHsKKwkJCQkJCWxlbi0tOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQlnb3RvIG5leHRfcGt0OworCQkJCX0KKwkJCX0KKwkJCUZsYWdzICY9IE5WX1JYMl9DSEVDS1NVTU1BU0s7CisJCQlpZiAoRmxhZ3MgPT0gTlZfUlgyX0NIRUNLU1VNT0sxIHx8CisJCQkJCUZsYWdzID09IE5WX1JYMl9DSEVDS1NVTU9LMiB8fAorCQkJCQlGbGFncyA9PSBOVl9SWDJfQ0hFQ0tTVU1PSzMpIHsKKwkJCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBodyBjaGVja3N1bSBoaXQhLlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlucC0+cnhfc2tidWZmW2ldLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCX0gZWxzZSB7CisJCQkJZHByaW50ayhLRVJOX0RFQlVHICIlczogaHdjaGVja3N1bSBtaXNzIS5cbiIsIGRldi0+bmFtZSk7CisJCQl9CisJCX0KKwkJLyogZ290IGEgdmFsaWQgcGFja2V0IC0gZm9yd2FyZCBpdCB0byB0aGUgbmV0d29yayBjb3JlICovCisJCXNrYiA9IG5wLT5yeF9za2J1ZmZbaV07CisJCW5wLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCisJCXNrYl9wdXQoc2tiLCBsZW4pOworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9yeF9wcm9jZXNzOiBwYWNrZXQgJWQgd2l0aCAlZCBieXRlcywgcHJvdG8gJWQgYWNjZXB0ZWQuXG4iLAorCQkJCQlkZXYtPm5hbWUsIG5wLT5jdXJfcngsIGxlbiwgc2tiLT5wcm90b2NvbCk7CisJCW5ldGlmX3J4KHNrYik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW5wLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCW5wLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CituZXh0X3BrdDoKKwkJbnAtPmN1cl9yeCsrOworCX0KK30KKworLyoKKyAqIG52X2NoYW5nZV9tdHU6IGRldi0+Y2hhbmdlX210dSBmdW5jdGlvbgorICogQ2FsbGVkIHdpdGggZGV2X2Jhc2VfbG9jayBoZWxkIGZvciByZWFkLgorICovCitzdGF0aWMgaW50IG52X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKG5ld19tdHUgPiBFVEhfREFUQV9MRU4pCisJCXJldHVybiAtRUlOVkFMOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG52X3NldF9tdWx0aWNhc3Q6IGRldi0+c2V0X211bHRpY2FzdCBmdW5jdGlvbgorICogQ2FsbGVkIHdpdGggZGV2LT54bWl0X2xvY2sgaGVsZC4KKyAqLworc3RhdGljIHZvaWQgbnZfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCXUzMiBhZGRyWzJdOworCXUzMiBtYXNrWzJdOworCXUzMiBwZmY7CisKKwltZW1zZXQoYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwltZW1zZXQobWFzaywgMCwgc2l6ZW9mKG1hc2spKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJcGZmID0gTlZSRUdfUEZGX1BST01JU0M7CisJfSBlbHNlIHsKKwkJcGZmID0gTlZSRUdfUEZGX01ZQUREUjsKKworCQlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSB8fCBkZXYtPm1jX2xpc3QpIHsKKwkJCXUzMiBhbHdheXNPZmZbMl07CisJCQl1MzIgYWx3YXlzT25bMl07CisKKwkJCWFsd2F5c09uWzBdID0gYWx3YXlzT25bMV0gPSBhbHdheXNPZmZbMF0gPSBhbHdheXNPZmZbMV0gPSAweGZmZmZmZmZmOworCQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJCQlhbHdheXNPblswXSA9IGFsd2F5c09uWzFdID0gYWx3YXlzT2ZmWzBdID0gYWx3YXlzT2ZmWzFdID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGRldl9tY19saXN0ICp3YWxrOworCisJCQkJd2FsayA9IGRldi0+bWNfbGlzdDsKKwkJCQl3aGlsZSAod2FsayAhPSBOVUxMKSB7CisJCQkJCXUzMiBhLCBiOworCQkJCQlhID0gbGUzMl90b19jcHUoKih1MzIgKikgd2Fsay0+ZG1pX2FkZHIpOworCQkJCQliID0gbGUxNl90b19jcHUoKih1MTYgKikgKCZ3YWxrLT5kbWlfYWRkcls0XSkpOworCQkJCQlhbHdheXNPblswXSAmPSBhOworCQkJCQlhbHdheXNPZmZbMF0gJj0gfmE7CisJCQkJCWFsd2F5c09uWzFdICY9IGI7CisJCQkJCWFsd2F5c09mZlsxXSAmPSB+YjsKKwkJCQkJd2FsayA9IHdhbGstPm5leHQ7CisJCQkJfQorCQkJfQorCQkJYWRkclswXSA9IGFsd2F5c09uWzBdOworCQkJYWRkclsxXSA9IGFsd2F5c09uWzFdOworCQkJbWFza1swXSA9IGFsd2F5c09uWzBdIHwgYWx3YXlzT2ZmWzBdOworCQkJbWFza1sxXSA9IGFsd2F5c09uWzFdIHwgYWx3YXlzT2ZmWzFdOworCQl9CisJfQorCWFkZHJbMF0gfD0gTlZSRUdfTUNBU1RBRERSQV9GT1JDRTsKKwlwZmYgfD0gTlZSRUdfUEZGX0FMV0FZUzsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbnZfc3RvcF9yeChkZXYpOworCXdyaXRlbChhZGRyWzBdLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RBZGRyQSk7CisJd3JpdGVsKGFkZHJbMV0sIGJhc2UgKyBOdlJlZ011bHRpY2FzdEFkZHJCKTsKKwl3cml0ZWwobWFza1swXSwgYmFzZSArIE52UmVnTXVsdGljYXN0TWFza0EpOworCXdyaXRlbChtYXNrWzFdLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RNYXNrQik7CisJd3JpdGVsKHBmZiwgYmFzZSArIE52UmVnUGFja2V0RmlsdGVyRmxhZ3MpOworCWRwcmludGsoS0VSTl9JTkZPICIlczogcmVjb25maWd1cmF0aW9uIGZvciBtdWx0aWNhc3QgbGlzdHMuXG4iLAorCQlkZXYtPm5hbWUpOworCW52X3N0YXJ0X3J4KGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgbnZfdXBkYXRlX2xpbmtzcGVlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCWludCBhZHYsIGxwYTsKKwlpbnQgbmV3bHMgPSBucC0+bGlua3NwZWVkOworCWludCBuZXdkdXAgPSBucC0+ZHVwbGV4OworCWludCBtaWlfc3RhdHVzOworCWludCByZXR2YWwgPSAwOworCXUzMiBjb250cm9sXzEwMDAsIHN0YXR1c18xMDAwLCBwaHlyZWc7CisKKwkvKiBCTVNSX0xTVEFUVVMgaXMgbGF0Y2hlZCwgcmVhZCBpdCB0d2ljZToKKwkgKiB3ZSB3YW50IHRoZSBjdXJyZW50IHZhbHVlLgorCSAqLworCW1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQk1TUiwgTUlJX1JFQUQpOworCW1paV9zdGF0dXMgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNU1IsIE1JSV9SRUFEKTsKKworCWlmICghKG1paV9zdGF0dXMgJiBCTVNSX0xTVEFUVVMpKSB7CisJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5vIGxpbmsgZGV0ZWN0ZWQgYnkgcGh5IC0gZmFsbGluZyBiYWNrIHRvIDEwSEQuXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFfE5WUkVHX0xJTktTUEVFRF8xMDsKKwkJbmV3ZHVwID0gMDsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBzZXRfc3BlZWQ7CisJfQorCisJaWYgKG5wLT5hdXRvbmVnID09IDApIHsKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfdXBkYXRlX2xpbmtzcGVlZDogYXV0b25lZyBvZmYsIFBIWSBzZXQgdG8gMHglMDR4LlxuIiwKKwkJCQlkZXYtPm5hbWUsIG5wLT5maXhlZF9tb2RlKTsKKwkJaWYgKG5wLT5maXhlZF9tb2RlICYgTFBBXzEwMEZVTEwpIHsKKwkJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFfE5WUkVHX0xJTktTUEVFRF8xMDA7CisJCQluZXdkdXAgPSAxOworCQl9IGVsc2UgaWYgKG5wLT5maXhlZF9tb2RlICYgTFBBXzEwMEhBTEYpIHsKKwkJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFfE5WUkVHX0xJTktTUEVFRF8xMDA7CisJCQluZXdkdXAgPSAwOworCQl9IGVsc2UgaWYgKG5wLT5maXhlZF9tb2RlICYgTFBBXzEwRlVMTCkgeworCQkJbmV3bHMgPSBOVlJFR19MSU5LU1BFRURfRk9SQ0V8TlZSRUdfTElOS1NQRUVEXzEwOworCQkJbmV3ZHVwID0gMTsKKwkJfSBlbHNlIHsKKwkJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFfE5WUkVHX0xJTktTUEVFRF8xMDsKKwkJCW5ld2R1cCA9IDA7CisJCX0KKwkJcmV0dmFsID0gMTsKKwkJZ290byBzZXRfc3BlZWQ7CisJfQorCS8qIGNoZWNrIGF1dG8gbmVnb3RpYXRpb24gaXMgY29tcGxldGUgKi8KKwlpZiAoIShtaWlfc3RhdHVzICYgQk1TUl9BTkVHQ09NUExFVEUpKSB7CisJCS8qIHN0aWxsIGluIGF1dG9uZWdvdGlhdGlvbiAtIGNvbmZpZ3VyZSBuaWMgZm9yIDEwIE1CaXQgSEQgYW5kIHdhaXQuICovCisJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFfE5WUkVHX0xJTktTUEVFRF8xMDsKKwkJbmV3ZHVwID0gMDsKKwkJcmV0dmFsID0gMDsKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogYXV0b25lZyBub3QgY29tcGxldGVkIC0gZmFsbGluZyBiYWNrIHRvIDEwSEQuXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIHNldF9zcGVlZDsKKwl9CisKKwlyZXR2YWwgPSAxOworCWlmIChucC0+Z2lnYWJpdCA9PSBQSFlfR0lHQUJJVCkgeworCQljb250cm9sXzEwMDAgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJXzEwMDBCVF9DUiwgTUlJX1JFQUQpOworCQlzdGF0dXNfMTAwMCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfMTAwMEJUX1NSLCBNSUlfUkVBRCk7CisKKwkJaWYgKChjb250cm9sXzEwMDAgJiBBRFZFUlRJU0VfMTAwMEZVTEwpICYmCisJCQkoc3RhdHVzXzEwMDAgJiBMUEFfMTAwMEZVTEwpKSB7CisJCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl91cGRhdGVfbGlua3NwZWVkOiBHQml0IGV0aGVybmV0IGRldGVjdGVkLlxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJbmV3bHMgPSBOVlJFR19MSU5LU1BFRURfRk9SQ0V8TlZSRUdfTElOS1NQRUVEXzEwMDA7CisJCQluZXdkdXAgPSAxOworCQkJZ290byBzZXRfc3BlZWQ7CisJCX0KKwl9CisKKwlhZHYgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0FEVkVSVElTRSwgTUlJX1JFQUQpOworCWxwYSA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfTFBBLCBNSUlfUkVBRCk7CisJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfdXBkYXRlX2xpbmtzcGVlZDogUEhZIGFkdmVydGlzZXMgMHglMDR4LCBscGEgMHglMDR4LlxuIiwKKwkJCQlkZXYtPm5hbWUsIGFkdiwgbHBhKTsKKworCS8qIEZJWE1FOiBoYW5kbGUgcGFyYWxsZWwgZGV0ZWN0aW9uIHByb3Blcmx5ICovCisJbHBhID0gbHBhICYgYWR2OworCWlmIChscGEgJiBMUEFfMTAwRlVMTCkgeworCQluZXdscyA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRXxOVlJFR19MSU5LU1BFRURfMTAwOworCQluZXdkdXAgPSAxOworCX0gZWxzZSBpZiAobHBhICYgTFBBXzEwMEhBTEYpIHsKKwkJbmV3bHMgPSBOVlJFR19MSU5LU1BFRURfRk9SQ0V8TlZSRUdfTElOS1NQRUVEXzEwMDsKKwkJbmV3ZHVwID0gMDsKKwl9IGVsc2UgaWYgKGxwYSAmIExQQV8xMEZVTEwpIHsKKwkJbmV3bHMgPSBOVlJFR19MSU5LU1BFRURfRk9SQ0V8TlZSRUdfTElOS1NQRUVEXzEwOworCQluZXdkdXAgPSAxOworCX0gZWxzZSBpZiAobHBhICYgTFBBXzEwSEFMRikgeworCQluZXdscyA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRXxOVlJFR19MSU5LU1BFRURfMTA7CisJCW5ld2R1cCA9IDA7CisJfSBlbHNlIHsKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogYmFkIGFiaWxpdHkgJTA0eCAtIGZhbGxpbmcgYmFjayB0byAxMEhELlxuIiwgZGV2LT5uYW1lLCBscGEpOworCQluZXdscyA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRXxOVlJFR19MSU5LU1BFRURfMTA7CisJCW5ld2R1cCA9IDA7CisJfQorCitzZXRfc3BlZWQ6CisJaWYgKG5wLT5kdXBsZXggPT0gbmV3ZHVwICYmIG5wLT5saW5rc3BlZWQgPT0gbmV3bHMpCisJCXJldHVybiByZXR2YWw7CisKKwlkcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNoYW5naW5nIGxpbmsgc2V0dGluZyBmcm9tICVkLyVkIHRvICVkLyVkLlxuIiwKKwkJCWRldi0+bmFtZSwgbnAtPmxpbmtzcGVlZCwgbnAtPmR1cGxleCwgbmV3bHMsIG5ld2R1cCk7CisKKwlucC0+ZHVwbGV4ID0gbmV3ZHVwOworCW5wLT5saW5rc3BlZWQgPSBuZXdsczsKKworCWlmIChucC0+Z2lnYWJpdCA9PSBQSFlfR0lHQUJJVCkgeworCQlwaHlyZWcgPSByZWFkbChiYXNlICsgTnZSZWdSYW5kb21TZWVkKTsKKwkJcGh5cmVnICY9IH4oMHgzRkYwMCk7CisJCWlmICgobnAtPmxpbmtzcGVlZCAmIDB4RkZGKSA9PSBOVlJFR19MSU5LU1BFRURfMTApCisJCQlwaHlyZWcgfD0gTlZSRUdfUk5EU0VFRF9GT1JDRTM7CisJCWVsc2UgaWYgKChucC0+bGlua3NwZWVkICYgMHhGRkYpID09IE5WUkVHX0xJTktTUEVFRF8xMDApCisJCQlwaHlyZWcgfD0gTlZSRUdfUk5EU0VFRF9GT1JDRTI7CisJCWVsc2UgaWYgKChucC0+bGlua3NwZWVkICYgMHhGRkYpID09IE5WUkVHX0xJTktTUEVFRF8xMDAwKQorCQkJcGh5cmVnIHw9IE5WUkVHX1JORFNFRURfRk9SQ0U7CisJCXdyaXRlbChwaHlyZWcsIGJhc2UgKyBOdlJlZ1JhbmRvbVNlZWQpOworCX0KKworCXBoeXJlZyA9IHJlYWRsKGJhc2UgKyBOdlJlZ1BoeUludGVyZmFjZSk7CisJcGh5cmVnICY9IH4oUEhZX0hBTEZ8UEhZXzEwMHxQSFlfMTAwMCk7CisJaWYgKG5wLT5kdXBsZXggPT0gMCkKKwkJcGh5cmVnIHw9IFBIWV9IQUxGOworCWlmICgobnAtPmxpbmtzcGVlZCAmIE5WUkVHX0xJTktTUEVFRF9NQVNLKSA9PSBOVlJFR19MSU5LU1BFRURfMTAwKQorCQlwaHlyZWcgfD0gUEhZXzEwMDsKKwllbHNlIGlmICgobnAtPmxpbmtzcGVlZCAmIE5WUkVHX0xJTktTUEVFRF9NQVNLKSA9PSBOVlJFR19MSU5LU1BFRURfMTAwMCkKKwkJcGh5cmVnIHw9IFBIWV8xMDAwOworCXdyaXRlbChwaHlyZWcsIGJhc2UgKyBOdlJlZ1BoeUludGVyZmFjZSk7CisKKwl3cml0ZWwoTlZSRUdfTUlTQzFfRk9SQ0UgfCAoIG5wLT5kdXBsZXggPyAwIDogTlZSRUdfTUlTQzFfSEQpLAorCQliYXNlICsgTnZSZWdNaXNjMSk7CisJcGNpX3B1c2goYmFzZSk7CisJd3JpdGVsKG5wLT5saW5rc3BlZWQsIGJhc2UgKyBOdlJlZ0xpbmtTcGVlZCk7CisJcGNpX3B1c2goYmFzZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBudl9saW5rY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKG52X3VwZGF0ZV9saW5rc3BlZWQoZGV2KSkgeworCQlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCQludl9zdG9wX3J4KGRldik7CisJCX0gZWxzZSB7CisJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayB1cC5cbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJbnZfc3RhcnRfcngoZGV2KTsKKwl9IGVsc2UgeworCQlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgZG93bi5cbiIsIGRldi0+bmFtZSk7CisJCQludl9zdG9wX3J4KGRldik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG52X2xpbmtfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKwl1MzIgbWlpc3RhdDsKKworCW1paXN0YXQgPSByZWFkbChiYXNlICsgTnZSZWdNSUlTdGF0dXMpOworCXdyaXRlbChOVlJFR19NSUlTVEFUX01BU0ssIGJhc2UgKyBOdlJlZ01JSVN0YXR1cyk7CisJZHByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIGNoYW5nZSBpcnEsIHN0YXR1cyAweCV4LlxuIiwgZGV2LT5uYW1lLCBtaWlzdGF0KTsKKworCWlmIChtaWlzdGF0ICYgKE5WUkVHX01JSVNUQVRfTElOS0NIQU5HRSkpCisJCW52X2xpbmtjaGFuZ2UoZGV2KTsKKwlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBsaW5rIGNoYW5nZSBub3RpZmljYXRpb24gZG9uZS5cbiIsIGRldi0+bmFtZSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBudl9uaWNfaXJxKGludCBmb28sIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CisJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKwl1MzIgZXZlbnRzOworCWludCBpOworCisJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfbmljX2lycVxuIiwgZGV2LT5uYW1lKTsKKworCWZvciAoaT0wOyA7IGkrKykgeworCQlldmVudHMgPSByZWFkbChiYXNlICsgTnZSZWdJcnFTdGF0dXMpICYgTlZSRUdfSVJRU1RBVF9NQVNLOworCQl3cml0ZWwoTlZSRUdfSVJRU1RBVF9NQVNLLCBiYXNlICsgTnZSZWdJcnFTdGF0dXMpOworCQlwY2lfcHVzaChiYXNlKTsKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogaXJxOiAlMDh4XG4iLCBkZXYtPm5hbWUsIGV2ZW50cyk7CisJCWlmICghKGV2ZW50cyAmIG5wLT5pcnFtYXNrKSkKKwkJCWJyZWFrOworCisJCWlmIChldmVudHMgJiAoTlZSRUdfSVJRX1RYMXxOVlJFR19JUlFfVFgyfE5WUkVHX0lSUV9UWF9FUlIpKSB7CisJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJCW52X3R4X2RvbmUoZGV2KTsKKwkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJCX0KKworCQlpZiAoZXZlbnRzICYgKE5WUkVHX0lSUV9SWF9FUlJPUnxOVlJFR19JUlFfUlh8TlZSRUdfSVJRX1JYX05PQlVGKSkgeworCQkJbnZfcnhfcHJvY2VzcyhkZXYpOworCQkJaWYgKG52X2FsbG9jX3J4KGRldikpIHsKKwkJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJCQlpZiAoIW5wLT5pbl9zaHV0ZG93bikKKwkJCQkJbW9kX3RpbWVyKCZucC0+b29tX2tpY2ssIGppZmZpZXMgKyBPT01fUkVGSUxMKTsKKwkJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQkJfQorCQl9CisKKwkJaWYgKGV2ZW50cyAmIE5WUkVHX0lSUV9MSU5LKSB7CisJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJCW52X2xpbmtfaXJxKGRldik7CisJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQl9CisJCWlmIChucC0+bmVlZF9saW5rdGltZXIgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBucC0+bGlua190aW1lb3V0KSkgeworCQkJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJCQludl9saW5rY2hhbmdlKGRldik7CisJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQkJbnAtPmxpbmtfdGltZW91dCA9IGppZmZpZXMgKyBMSU5LX1RJTUVPVVQ7CisJCX0KKwkJaWYgKGV2ZW50cyAmIChOVlJFR19JUlFfVFhfRVJSKSkgeworCQkJZHByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZWQgaXJxIHdpdGggZXZlbnRzIDB4JXguIFByb2JhYmx5IFRYIGZhaWwuXG4iLAorCQkJCQkJZGV2LT5uYW1lLCBldmVudHMpOworCQl9CisJCWlmIChldmVudHMgJiAoTlZSRUdfSVJRX1VOS05PV04pKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlY2VpdmVkIGlycSB3aXRoIHVua25vd24gZXZlbnRzIDB4JXguIFBsZWFzZSByZXBvcnRcbiIsCisJCQkJCQlkZXYtPm5hbWUsIGV2ZW50cyk7CisJCX0KKwkJaWYgKGkgPiBtYXhfaW50ZXJydXB0X3dvcmspIHsKKwkJCXNwaW5fbG9jaygmbnAtPmxvY2spOworCQkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBuaWMgKi8KKwkJCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdJcnFNYXNrKTsKKwkJCXBjaV9wdXNoKGJhc2UpOworCisJCQlpZiAoIW5wLT5pbl9zaHV0ZG93bikKKwkJCQltb2RfdGltZXIoJm5wLT5uaWNfcG9sbCwgamlmZmllcyArIFBPTExfV0FJVCk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRvbyBtYW55IGl0ZXJhdGlvbnMgKCVkKSBpbiBudl9uaWNfaXJxLlxuIiwgZGV2LT5uYW1lLCBpKTsKKwkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJCQlicmVhazsKKwkJfQorCisJfQorCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X25pY19pcnEgY29tcGxldGVkXG4iLCBkZXYtPm5hbWUpOworCisJcmV0dXJuIElSUV9SRVRWQUwoaSk7Cit9CisKK3N0YXRpYyB2b2lkIG52X2RvX25pY19wb2xsKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJLyogRklYTUU6IERvIHdlIG5lZWQgc3luY2hyb25pemVfaXJxKGRldi0+aXJxKSBoZXJlPyAqLworCS8qCisJICogcmVlbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgbmljLCB3ZSBoYXZlIHRvIGRvIHRoaXMgYmVmb3JlIGNhbGxpbmcKKwkgKiBudl9uaWNfaXJxIGJlY2F1c2UgdGhhdCBtYXkgZGVjaWRlIHRvIGRvIG90aGVyd2lzZQorCSAqLworCXdyaXRlbChucC0+aXJxbWFzaywgYmFzZSArIE52UmVnSXJxTWFzayk7CisJcGNpX3B1c2goYmFzZSk7CisJbnZfbmljX2lycSgoaW50KSAwLCAodm9pZCAqKSBkYXRhLCAoc3RydWN0IHB0X3JlZ3MgKikgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIG52X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCXN0cmNweShpbmZvLT5kcml2ZXIsICJmb3JjZWRldGgiKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRk9SQ0VERVRIX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKK30KKworc3RhdGljIHZvaWQgbnZfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2xpbmZvKQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwl3b2xpbmZvLT5zdXBwb3J0ZWQgPSBXQUtFX01BR0lDOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCWlmIChucC0+d29sZW5hYmxlZCkKKwkJd29saW5mby0+d29sb3B0cyA9IFdBS0VfTUFHSUM7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgbnZfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2xpbmZvKQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCWlmICh3b2xpbmZvLT53b2xvcHRzID09IDApIHsKKwkJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1dha2VVcEZsYWdzKTsKKwkJbnAtPndvbGVuYWJsZWQgPSAwOworCX0KKwlpZiAod29saW5mby0+d29sb3B0cyAmIFdBS0VfTUFHSUMpIHsKKwkJd3JpdGVsKE5WUkVHX1dBS0VVUEZMQUdTX0VOQUJMRSwgYmFzZSArIE52UmVnV2FrZVVwRmxhZ3MpOworCQlucC0+d29sZW5hYmxlZCA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG52X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgYWR2OworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCWVjbWQtPnBvcnQgPSBQT1JUX01JSTsKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkvKiBXZSBkbyBub3QgdHJhY2sgbGluayBzcGVlZCAvIGR1cGxleCBzZXR0aW5nIGlmIHRoZQorCQkgKiBpbnRlcmZhY2UgaXMgZGlzYWJsZWQuIEZvcmNlIGEgbGluayBjaGVjayAqLworCQludl91cGRhdGVfbGlua3NwZWVkKGRldik7CisJfQorCXN3aXRjaChucC0+bGlua3NwZWVkICYgKE5WUkVHX0xJTktTUEVFRF9NQVNLKSkgeworCQljYXNlIE5WUkVHX0xJTktTUEVFRF8xMDoKKwkJCWVjbWQtPnNwZWVkID0gU1BFRURfMTA7CisJCQlicmVhazsKKwkJY2FzZSBOVlJFR19MSU5LU1BFRURfMTAwOgorCQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDA7CisJCQlicmVhazsKKwkJY2FzZSBOVlJFR19MSU5LU1BFRURfMTAwMDoKKwkJCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwMDsKKwkJCWJyZWFrOworCX0KKwllY21kLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwlpZiAobnAtPmR1cGxleCkKKwkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisKKwllY21kLT5hdXRvbmVnID0gbnAtPmF1dG9uZWc7CisKKwllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfTUlJOworCWlmIChucC0+YXV0b25lZykgeworCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0F1dG9uZWc7CisJCWFkdiA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQURWRVJUSVNFLCBNSUlfUkVBRCk7CisJfSBlbHNlIHsKKwkJYWR2ID0gbnAtPmZpeGVkX21vZGU7CisJfQorCWlmIChhZHYgJiBBRFZFUlRJU0VfMTBIQUxGKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZjsKKwlpZiAoYWR2ICYgQURWRVJUSVNFXzEwRlVMTCkKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGw7CisJaWYgKGFkdiAmIEFEVkVSVElTRV8xMDBIQUxGKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGY7CisJaWYgKGFkdiAmIEFEVkVSVElTRV8xMDBGVUxMKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7CisJaWYgKG5wLT5hdXRvbmVnICYmIG5wLT5naWdhYml0ID09IFBIWV9HSUdBQklUKSB7CisJCWFkdiA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfMTAwMEJUX0NSLCBNSUlfUkVBRCk7CisJCWlmIChhZHYgJiBBRFZFUlRJU0VfMTAwMEZVTEwpCisJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsOworCX0KKworCWVjbWQtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfQXV0b25lZyB8CisJCVNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCVNVUFBPUlRFRF9NSUkpOworCWlmIChucC0+Z2lnYWJpdCA9PSBQSFlfR0lHQUJJVCkKKwkJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKKworCWVjbWQtPnBoeV9hZGRyZXNzID0gbnAtPnBoeWFkZHI7CisJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOworCisJLyogaWdub3JlIG1heHR4cGt0LCBtYXhyeHBrdCBmb3Igbm93ICovCisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnZfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGVjbWQtPnBvcnQgIT0gUE9SVF9NSUkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlY21kLT50cmFuc2NlaXZlciAhPSBYQ1ZSX0VYVEVSTkFMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+cGh5X2FkZHJlc3MgIT0gbnAtPnBoeWFkZHIpIHsKKwkJLyogVE9ETzogc3VwcG9ydCBzd2l0Y2hpbmcgYmV0d2VlbiBtdWx0aXBsZSBwaHlzLiBTaG91bGQgYmUKKwkJICogdHJpdmlhbCwgYnV0IG5vdCBlbmFibGVkIGR1ZSB0byBsYWNrIG9mIHRlc3QgaGFyZHdhcmUuICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQl1MzIgbWFzazsKKworCQltYXNrID0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8CisJCQkgIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbDsKKwkJaWYgKG5wLT5naWdhYml0ID09IFBIWV9HSUdBQklUKQorCQkJbWFzayB8PSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsOworCisJCWlmICgoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBtYXNrKSA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwl9IGVsc2UgaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKSB7CisJCS8qIE5vdGU6IGF1dG9uZWdvdGlhdGlvbiBkaXNhYmxlLCBzcGVlZCAxMDAwIGludGVudGlvbmFsbHkKKwkJICogZm9yYmlkZGVuIC0gbm9vbmUgc2hvdWxkIG5lZWQgdGhhdC4gKi8KKworCQlpZiAoZWNtZC0+c3BlZWQgIT0gU1BFRURfMTAgJiYgZWNtZC0+c3BlZWQgIT0gU1BFRURfMTAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChlY21kLT5kdXBsZXggIT0gRFVQTEVYX0hBTEYgJiYgZWNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCWlmIChlY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCWludCBhZHYsIGJtY3I7CisKKwkJbnAtPmF1dG9uZWcgPSAxOworCisJCS8qIGFkdmVydGlzZSBvbmx5IHdoYXQgaGFzIGJlZW4gcmVxdWVzdGVkICovCisJCWFkdiA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQURWRVJUSVNFLCBNSUlfUkVBRCk7CisJCWFkdiAmPSB+KEFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfMTAwQkFTRTQpOworCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKKwkJCWFkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJCWFkdiB8PSBBRFZFUlRJU0VfMTBGVUxMOworCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCQlhZHYgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJCWlmIChlY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKKwkJCWFkdiB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwkJbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9BRFZFUlRJU0UsIGFkdik7CisKKwkJaWYgKG5wLT5naWdhYml0ID09IFBIWV9HSUdBQklUKSB7CisJCQlhZHYgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJXzEwMDBCVF9DUiwgTUlJX1JFQUQpOworCQkJYWR2ICY9IH5BRFZFUlRJU0VfMTAwMEZVTEw7CisJCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQorCQkJCWFkdiB8PSBBRFZFUlRJU0VfMTAwMEZVTEw7CisJCQltaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJXzEwMDBCVF9DUiwgYWR2KTsKKwkJfQorCisJCWJtY3IgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIE1JSV9SRUFEKTsKKwkJYm1jciB8PSAoQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKwkJbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9CTUNSLCBibWNyKTsKKworCX0gZWxzZSB7CisJCWludCBhZHYsIGJtY3I7CisKKwkJbnAtPmF1dG9uZWcgPSAwOworCisJCWFkdiA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQURWRVJUSVNFLCBNSUlfUkVBRCk7CisJCWFkdiAmPSB+KEFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfMTAwQkFTRTQpOworCQlpZiAoZWNtZC0+c3BlZWQgPT0gU1BFRURfMTAgJiYgZWNtZC0+ZHVwbGV4ID09IERVUExFWF9IQUxGKQorCQkJYWR2IHw9IEFEVkVSVElTRV8xMEhBTEY7CisJCWlmIChlY21kLT5zcGVlZCA9PSBTUEVFRF8xMCAmJiBlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQlhZHYgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwkJaWYgKGVjbWQtPnNwZWVkID09IFNQRUVEXzEwMCAmJiBlY21kLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCQlhZHYgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJCWlmIChlY21kLT5zcGVlZCA9PSBTUEVFRF8xMDAgJiYgZWNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJYWR2IHw9IEFEVkVSVElTRV8xMDBGVUxMOworCQltaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0FEVkVSVElTRSwgYWR2KTsKKwkJbnAtPmZpeGVkX21vZGUgPSBhZHY7CisKKwkJaWYgKG5wLT5naWdhYml0ID09IFBIWV9HSUdBQklUKSB7CisJCQlhZHYgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJXzEwMDBCVF9DUiwgTUlJX1JFQUQpOworCQkJYWR2ICY9IH5BRFZFUlRJU0VfMTAwMEZVTEw7CisJCQltaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJXzEwMDBCVF9DUiwgYWR2KTsKKwkJfQorCisJCWJtY3IgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIE1JSV9SRUFEKTsKKwkJYm1jciB8PSB+KEJNQ1JfQU5FTkFCTEV8Qk1DUl9TUEVFRDEwMHxCTUNSX0ZVTExEUExYKTsKKwkJaWYgKGFkdiAmIChBRFZFUlRJU0VfMTBGVUxMfEFEVkVSVElTRV8xMDBGVUxMKSkKKwkJCWJtY3IgfD0gQk1DUl9GVUxMRFBMWDsKKwkJaWYgKGFkdiAmIChBRFZFUlRJU0VfMTAwSEFMRnxBRFZFUlRJU0VfMTAwRlVMTCkpCisJCQlibWNyIHw9IEJNQ1JfU1BFRUQxMDA7CisJCW1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQk1DUiwgYm1jcik7CisKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJLyogV2FpdCBhIGJpdCBhbmQgdGhlbiByZWNvbmZpZ3VyZSB0aGUgbmljLiAqLworCQkJdWRlbGF5KDEwKTsKKwkJCW52X2xpbmtjaGFuZ2UoZGV2KTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG9wcyA9IHsKKwkuZ2V0X2RydmluZm8gPSBudl9nZXRfZHJ2aW5mbywKKwkuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfd29sID0gbnZfZ2V0X3dvbCwKKwkuc2V0X3dvbCA9IG52X3NldF93b2wsCisJLmdldF9zZXR0aW5ncyA9IG52X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzID0gbnZfc2V0X3NldHRpbmdzLAorfTsKKworc3RhdGljIGludCBudl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisJaW50IHJldCwgb29tLCBpOworCisJZHByaW50ayhLRVJOX0RFQlVHICJudl9vcGVuOiBiZWdpblxuIik7CisKKwkvKiAxKSBlcmFzZSBwcmV2aW91cyBtaXNjb25maWd1cmF0aW9uICovCisJLyogNC4xLTE6IHN0b3AgYWRhcHRlcjogaWdub3JlZCwgNC4zIHNlZW1zIHRvIGJlIG92ZXJraWxsICovCisJd3JpdGVsKE5WUkVHX01DQVNUQUREUkFfRk9SQ0UsIGJhc2UgKyBOdlJlZ011bHRpY2FzdEFkZHJBKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnTXVsdGljYXN0QWRkckIpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RNYXNrQSk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ011bHRpY2FzdE1hc2tCKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnUGFja2V0RmlsdGVyRmxhZ3MpOworCisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1RyYW5zbWl0dGVyQ29udHJvbCk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1JlY2VpdmVyQ29udHJvbCk7CisKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnQWRhcHRlckNvbnRyb2wpOworCisJLyogMikgaW5pdGlhbGl6ZSBkZXNjcmlwdG9yIHJpbmdzICovCisJb29tID0gbnZfaW5pdF9yaW5nKGRldik7CisKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnTGlua1NwZWVkKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnVW5rbm93blRyYW5zbWl0dGVyUmVnKTsKKwludl90eHJ4X3Jlc2V0KGRldik7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1Vua25vd25TZXR1cFJlZzYpOworCisJbnAtPmluX3NodXRkb3duID0gMDsKKworCS8qIDMpIHNldCBtYWMgYWRkcmVzcyAqLworCXsKKwkJdTMyIG1hY1syXTsKKworCQltYWNbMF0gPSAoZGV2LT5kZXZfYWRkclswXSA8PCAwKSArIChkZXYtPmRldl9hZGRyWzFdIDw8IDgpICsKKwkJCQkoZGV2LT5kZXZfYWRkclsyXSA8PCAxNikgKyAoZGV2LT5kZXZfYWRkclszXSA8PCAyNCk7CisJCW1hY1sxXSA9IChkZXYtPmRldl9hZGRyWzRdIDw8IDApICsgKGRldi0+ZGV2X2FkZHJbNV0gPDwgOCk7CisKKwkJd3JpdGVsKG1hY1swXSwgYmFzZSArIE52UmVnTWFjQWRkckEpOworCQl3cml0ZWwobWFjWzFdLCBiYXNlICsgTnZSZWdNYWNBZGRyQik7CisJfQorCisJLyogNCkgZ2l2ZSBodyByaW5ncyAqLworCXdyaXRlbCgodTMyKSBucC0+cmluZ19hZGRyLCBiYXNlICsgTnZSZWdSeFJpbmdQaHlzQWRkcik7CisJd3JpdGVsKCh1MzIpIChucC0+cmluZ19hZGRyICsgUlhfUklORypzaXplb2Yoc3RydWN0IHJpbmdfZGVzYykpLCBiYXNlICsgTnZSZWdUeFJpbmdQaHlzQWRkcik7CisJd3JpdGVsKCAoKFJYX1JJTkctMSkgPDwgTlZSRUdfUklOR1NaX1JYU0hJRlQpICsgKChUWF9SSU5HLTEpIDw8IE5WUkVHX1JJTkdTWl9UWFNISUZUKSwKKwkJYmFzZSArIE52UmVnUmluZ1NpemVzKTsKKworCS8qIDUpIGNvbnRpbnVlIHNldHVwICovCisJd3JpdGVsKG5wLT5saW5rc3BlZWQsIGJhc2UgKyBOdlJlZ0xpbmtTcGVlZCk7CisJd3JpdGVsKE5WUkVHX1VOS1NFVFVQM19WQUwxLCBiYXNlICsgTnZSZWdVbmtub3duU2V0dXBSZWczKTsKKwl3cml0ZWwobnAtPmRlc2NfdmVyLCBiYXNlICsgTnZSZWdUeFJ4Q29udHJvbCk7CisJcGNpX3B1c2goYmFzZSk7CisJd3JpdGVsKE5WUkVHX1RYUlhDVExfQklUMXxucC0+ZGVzY192ZXIsIGJhc2UgKyBOdlJlZ1R4UnhDb250cm9sKTsKKwlyZWdfZGVsYXkoZGV2LCBOdlJlZ1Vua25vd25TZXR1cFJlZzUsIE5WUkVHX1VOS1NFVFVQNV9CSVQzMSwgTlZSRUdfVU5LU0VUVVA1X0JJVDMxLAorCQkJTlZfU0VUVVA1X0RFTEFZLCBOVl9TRVRVUDVfREVMQVlNQVgsCisJCQlLRVJOX0lORk8gIm9wZW46IFNldHVwUmVnNSwgQml0IDMxIHJlbWFpbmVkIG9mZlxuIik7CisKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnNCk7CisJd3JpdGVsKE5WUkVHX0lSUVNUQVRfTUFTSywgYmFzZSArIE52UmVnSXJxU3RhdHVzKTsKKwl3cml0ZWwoTlZSRUdfTUlJU1RBVF9NQVNLMiwgYmFzZSArIE52UmVnTUlJU3RhdHVzKTsKKworCS8qIDYpIGNvbnRpbnVlIHNldHVwICovCisJd3JpdGVsKE5WUkVHX01JU0MxX0ZPUkNFIHwgTlZSRUdfTUlTQzFfSEQsIGJhc2UgKyBOdlJlZ01pc2MxKTsKKwl3cml0ZWwocmVhZGwoYmFzZSArIE52UmVnVHJhbnNtaXR0ZXJTdGF0dXMpLCBiYXNlICsgTnZSZWdUcmFuc21pdHRlclN0YXR1cyk7CisJd3JpdGVsKE5WUkVHX1BGRl9BTFdBWVMsIGJhc2UgKyBOdlJlZ1BhY2tldEZpbHRlckZsYWdzKTsKKwl3cml0ZWwoTlZSRUdfT0ZGTE9BRF9OT1JNQUwsIGJhc2UgKyBOdlJlZ09mZmxvYWRDb25maWcpOworCisJd3JpdGVsKHJlYWRsKGJhc2UgKyBOdlJlZ1JlY2VpdmVyU3RhdHVzKSwgYmFzZSArIE52UmVnUmVjZWl2ZXJTdGF0dXMpOworCWdldF9yYW5kb21fYnl0ZXMoJmksIHNpemVvZihpKSk7CisJd3JpdGVsKE5WUkVHX1JORFNFRURfRk9SQ0UgfCAoaSZOVlJFR19STkRTRUVEX01BU0spLCBiYXNlICsgTnZSZWdSYW5kb21TZWVkKTsKKwl3cml0ZWwoTlZSRUdfVU5LU0VUVVAxX1ZBTCwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnMSk7CisJd3JpdGVsKE5WUkVHX1VOS1NFVFVQMl9WQUwsIGJhc2UgKyBOdlJlZ1Vua25vd25TZXR1cFJlZzIpOworCXdyaXRlbChOVlJFR19QT0xMX0RFRkFVTFQsIGJhc2UgKyBOdlJlZ1BvbGxpbmdJbnRlcnZhbCk7CisJd3JpdGVsKE5WUkVHX1VOS1NFVFVQNl9WQUwsIGJhc2UgKyBOdlJlZ1Vua25vd25TZXR1cFJlZzYpOworCXdyaXRlbCgobnAtPnBoeWFkZHIgPDwgTlZSRUdfQURBUFRDVExfUEhZU0hJRlQpfE5WUkVHX0FEQVBUQ1RMX1BIWVZBTElEfE5WUkVHX0FEQVBUQ1RMX1JVTk5JTkcsCisJCQliYXNlICsgTnZSZWdBZGFwdGVyQ29udHJvbCk7CisJd3JpdGVsKE5WUkVHX01JSVNQRUVEX0JJVDh8TlZSRUdfTUlJREVMQVksIGJhc2UgKyBOdlJlZ01JSVNwZWVkKTsKKwl3cml0ZWwoTlZSRUdfVU5LU0VUVVA0X1ZBTCwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnNCk7CisJd3JpdGVsKE5WUkVHX1dBS0VVUEZMQUdTX1ZBTCwgYmFzZSArIE52UmVnV2FrZVVwRmxhZ3MpOworCisJaSA9IHJlYWRsKGJhc2UgKyBOdlJlZ1Bvd2VyU3RhdGUpOworCWlmICggKGkgJiBOVlJFR19QT1dFUlNUQVRFX1BPV0VSRURVUCkgPT0gMCkKKwkJd3JpdGVsKE5WUkVHX1BPV0VSU1RBVEVfUE9XRVJFRFVQfGksIGJhc2UgKyBOdlJlZ1Bvd2VyU3RhdGUpOworCisJcGNpX3B1c2goYmFzZSk7CisJdWRlbGF5KDEwKTsKKwl3cml0ZWwocmVhZGwoYmFzZSArIE52UmVnUG93ZXJTdGF0ZSkgfCBOVlJFR19QT1dFUlNUQVRFX1ZBTElELCBiYXNlICsgTnZSZWdQb3dlclN0YXRlKTsKKworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdJcnFNYXNrKTsKKwlwY2lfcHVzaChiYXNlKTsKKwl3cml0ZWwoTlZSRUdfTUlJU1RBVF9NQVNLMiwgYmFzZSArIE52UmVnTUlJU3RhdHVzKTsKKwl3cml0ZWwoTlZSRUdfSVJRU1RBVF9NQVNLLCBiYXNlICsgTnZSZWdJcnFTdGF0dXMpOworCXBjaV9wdXNoKGJhc2UpOworCisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZudl9uaWNfaXJxLCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2RyYWluOworCisJLyogYXNrIGZvciBpbnRlcnJ1cHRzICovCisJd3JpdGVsKG5wLT5pcnFtYXNrLCBiYXNlICsgTnZSZWdJcnFNYXNrKTsKKworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwl3cml0ZWwoTlZSRUdfTUNBU1RBRERSQV9GT1JDRSwgYmFzZSArIE52UmVnTXVsdGljYXN0QWRkckEpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RBZGRyQik7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ011bHRpY2FzdE1hc2tBKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnTXVsdGljYXN0TWFza0IpOworCXdyaXRlbChOVlJFR19QRkZfQUxXQVlTfE5WUkVHX1BGRl9NWUFERFIsIGJhc2UgKyBOdlJlZ1BhY2tldEZpbHRlckZsYWdzKTsKKwkvKiBPbmUgbWFudWFsIGxpbmsgc3BlZWQgdXBkYXRlOiBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkLCBmdXR1cmUgbGluaworCSAqIHNwZWVkIGNoYW5nZXMgY2F1c2UgaW50ZXJydXB0cyBhbmQgYXJlIGhhbmRsZWQgYnkgbnZfbGlua19pcnEoKS4KKwkgKi8KKwl7CisJCXUzMiBtaWlzdGF0OworCQltaWlzdGF0ID0gcmVhZGwoYmFzZSArIE52UmVnTUlJU3RhdHVzKTsKKwkJd3JpdGVsKE5WUkVHX01JSVNUQVRfTUFTSywgYmFzZSArIE52UmVnTUlJU3RhdHVzKTsKKwkJZHByaW50ayhLRVJOX0lORk8gInN0YXJ0dXA6IGdvdCAweCUwOHguXG4iLCBtaWlzdGF0KTsKKwl9CisJcmV0ID0gbnZfdXBkYXRlX2xpbmtzcGVlZChkZXYpOworCW52X3N0YXJ0X3J4KGRldik7CisJbnZfc3RhcnRfdHgoZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCWlmIChyZXQpIHsKKwkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCX0gZWxzZSB7CisJCXByaW50aygiJXM6IG5vIGxpbmsgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwl9CisJaWYgKG9vbSkKKwkJbW9kX3RpbWVyKCZucC0+b29tX2tpY2ssIGppZmZpZXMgKyBPT01fUkVGSUxMKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCXJldHVybiAwOworb3V0X2RyYWluOgorCWRyYWluX3JpbmcoZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG52X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCXU4IF9faW9tZW0gKmJhc2U7CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbnAtPmluX3NodXRkb3duID0gMTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCisJZGVsX3RpbWVyX3N5bmMoJm5wLT5vb21fa2ljayk7CisJZGVsX3RpbWVyX3N5bmMoJm5wLT5uaWNfcG9sbCk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCW52X3N0b3BfdHgoZGV2KTsKKwludl9zdG9wX3J4KGRldik7CisJbnZfdHhyeF9yZXNldChkZXYpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBuaWMgb3Igd2Ugd2lsbCBsb2NrIHVwICovCisJYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnSXJxTWFzayk7CisJcGNpX3B1c2goYmFzZSk7CisJZHByaW50ayhLRVJOX0lORk8gIiVzOiBJcnFtYXNrIGlzIHplcm8gYWdhaW5cbiIsIGRldi0+bmFtZSk7CisKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJZHJhaW5fcmluZyhkZXYpOworCisJaWYgKG5wLT53b2xlbmFibGVkKQorCQludl9zdGFydF9yeChkZXYpOworCisJLyogRklYTUU6IHBvd2VyIGRvd24gbmljICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbnZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBmZV9wcml2ICpucDsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdTggX19pb21lbSAqYmFzZTsKKwlpbnQgZXJyLCBpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBmZV9wcml2KSk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWRldikKKwkJZ290byBvdXQ7CisKKwlucCA9IGdldF9udnByaXYoZGV2KTsKKwlucC0+cGNpX2RldiA9IHBjaV9kZXY7CisJc3Bpbl9sb2NrX2luaXQoJm5wLT5sb2NrKTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGNpX2Rldi0+ZGV2KTsKKworCWluaXRfdGltZXIoJm5wLT5vb21fa2ljayk7CisJbnAtPm9vbV9raWNrLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCW5wLT5vb21fa2ljay5mdW5jdGlvbiA9ICZudl9kb19yeF9yZWZpbGw7CS8qIHRpbWVyIGhhbmRsZXIgKi8KKwlpbml0X3RpbWVyKCZucC0+bmljX3BvbGwpOworCW5wLT5uaWNfcG9sbC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwlucC0+bmljX3BvbGwuZnVuY3Rpb24gPSAmbnZfZG9fbmljX3BvbGw7CS8qIHRpbWVyIGhhbmRsZXIgKi8KKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZm9yY2VkZXRoOiBwY2lfZW5hYmxlX2RldiBmYWlsZWQgKCVkKSBmb3IgZGV2aWNlICVzXG4iLAorCQkJCWVyciwgcGNpX25hbWUocGNpX2RldikpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOworCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2lfZGV2LCBEUlZfTkFNRSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2Rpc2FibGU7CisKKwllcnIgPSAtRUlOVkFMOworCWFkZHIgPSAwOworCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgeworCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZXNvdXJjZSAlZCBzdGFydCAlcCBsZW4gJWxkIGZsYWdzIDB4JTA4bHguXG4iLAorCQkJCXBjaV9uYW1lKHBjaV9kZXYpLCBpLCAodm9pZCopcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIGkpLAorCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgaSksCisJCQkJcGNpX3Jlc291cmNlX2ZsYWdzKHBjaV9kZXYsIGkpKTsKKwkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lfZGV2LCBpKSAmIElPUkVTT1VSQ0VfTUVNICYmCisJCQkJcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCBpKSA+PSBOVl9QQ0lfUkVHU1opIHsKKwkJCWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgaSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSBERVZJQ0VfQ09VTlRfUkVTT1VSQ0UpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZm9yY2VkZXRoOiBDb3VsZG4ndCBmaW5kIHJlZ2lzdGVyIHdpbmRvdyBmb3IgZGV2aWNlICVzLlxuIiwKKwkJCQkJcGNpX25hbWUocGNpX2RldikpOworCQlnb3RvIG91dF9yZWxyZWc7CisJfQorCisJLyogaGFuZGxlIGRpZmZlcmVudCBkZXNjcmlwdG9yIHZlcnNpb25zICovCisJaWYgKHBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMSB8fAorCQlwY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzIgfHwKKwkJcGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zKQorCQlucC0+ZGVzY192ZXIgPSBERVNDX1ZFUl8xOworCWVsc2UKKwkJbnAtPmRlc2NfdmVyID0gREVTQ19WRVJfMjsKKworCWVyciA9IC1FTk9NRU07CisJbnAtPmJhc2UgPSBpb3JlbWFwKGFkZHIsIE5WX1BDSV9SRUdTWik7CisJaWYgKCFucC0+YmFzZSkKKwkJZ290byBvdXRfcmVscmVnOworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpbnAtPmJhc2U7CisJZGV2LT5pcnEgPSBwY2lfZGV2LT5pcnE7CisJbnAtPnJ4X3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2Yoc3RydWN0IHJpbmdfZGVzYykgKiAoUlhfUklORyArIFRYX1JJTkcpLAorCQkJCQkJJm5wLT5yaW5nX2FkZHIpOworCWlmICghbnAtPnJ4X3JpbmcpCisJCWdvdG8gb3V0X3VubWFwOworCW5wLT50eF9yaW5nID0gJm5wLT5yeF9yaW5nW1JYX1JJTkddOworCisJZGV2LT5vcGVuID0gbnZfb3BlbjsKKwlkZXYtPnN0b3AgPSBudl9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG52X3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBudl9nZXRfc3RhdHM7CisJZGV2LT5jaGFuZ2VfbXR1ID0gbnZfY2hhbmdlX210dTsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IG52X3NldF9tdWx0aWNhc3Q7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJm9wcyk7CisJZGV2LT50eF90aW1lb3V0ID0gbnZfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gTlZfV0FUQ0hET0dfVElNRU87CisKKwlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgZGV2KTsKKworCS8qIHJlYWQgdGhlIG1hYyBhZGRyZXNzICovCisJYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKwlucC0+b3JpZ19tYWNbMF0gPSByZWFkbChiYXNlICsgTnZSZWdNYWNBZGRyQSk7CisJbnAtPm9yaWdfbWFjWzFdID0gcmVhZGwoYmFzZSArIE52UmVnTWFjQWRkckIpOworCisJZGV2LT5kZXZfYWRkclswXSA9IChucC0+b3JpZ19tYWNbMV0gPj4gIDgpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzFdID0gKG5wLT5vcmlnX21hY1sxXSA+PiAgMCkgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbMl0gPSAobnAtPm9yaWdfbWFjWzBdID4+IDI0KSAmIDB4ZmY7CisJZGV2LT5kZXZfYWRkclszXSA9IChucC0+b3JpZ19tYWNbMF0gPj4gMTYpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzRdID0gKG5wLT5vcmlnX21hY1swXSA+PiAgOCkgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbNV0gPSAobnAtPm9yaWdfbWFjWzBdID4+ICAwKSAmIDB4ZmY7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpIHsKKwkJLyoKKwkJICogQmFkIG1hYyBhZGRyZXNzLiBBdCBsZWFzdCBvbmUgYmlvcyBzZXRzIHRoZSBtYWMgYWRkcmVzcworCQkgKiB0byAwMToyMzo0NTo2Nzo4OTphYgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBNYWMgYWRkcmVzcyBkZXRlY3RlZDogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwY2lfbmFtZShwY2lfZGV2KSwKKwkJCWRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCisJCQlkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJQbGVhc2UgY29tcGxhaW4gdG8geW91ciBoYXJkd2FyZSB2ZW5kb3IuIFN3aXRjaGluZyB0byBhIHJhbmRvbSBNQUMuXG4iKTsKKwkJZGV2LT5kZXZfYWRkclswXSA9IDB4MDA7CisJCWRldi0+ZGV2X2FkZHJbMV0gPSAweDAwOworCQlkZXYtPmRldl9hZGRyWzJdID0gMHg2YzsKKwkJZ2V0X3JhbmRvbV9ieXRlcygmZGV2LT5kZXZfYWRkclszXSwgMyk7CisJfQorCisJZHByaW50ayhLRVJOX0RFQlVHICIlczogTUFDIEFkZHJlc3MgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIHBjaV9uYW1lKHBjaV9kZXYpLAorCQkJZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkJCWRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOworCisJLyogZGlzYWJsZSBXT0wgKi8KKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnV2FrZVVwRmxhZ3MpOworCW5wLT53b2xlbmFibGVkID0gMDsKKworCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSkgeworCQlucC0+dHhfZmxhZ3MgPSBOVl9UWF9MQVNUUEFDS0VUfE5WX1RYX1ZBTElEOworCQlpZiAoaWQtPmRyaXZlcl9kYXRhICYgREVWX05FRURfTEFTVFBBQ0tFVDEpCisJCQlucC0+dHhfZmxhZ3MgfD0gTlZfVFhfTEFTVFBBQ0tFVDE7CisJfSBlbHNlIHsKKwkJbnAtPnR4X2ZsYWdzID0gTlZfVFgyX0xBU1RQQUNLRVR8TlZfVFgyX1ZBTElEOworCQlpZiAoaWQtPmRyaXZlcl9kYXRhICYgREVWX05FRURfTEFTVFBBQ0tFVDEpCisJCQlucC0+dHhfZmxhZ3MgfD0gTlZfVFgyX0xBU1RQQUNLRVQxOworCX0KKwlpZiAoaWQtPmRyaXZlcl9kYXRhICYgREVWX0lSUU1BU0tfMSkKKwkJbnAtPmlycW1hc2sgPSBOVlJFR19JUlFNQVNLX1dBTlRFRF8xOworCWlmIChpZC0+ZHJpdmVyX2RhdGEgJiBERVZfSVJRTUFTS18yKQorCQlucC0+aXJxbWFzayA9IE5WUkVHX0lSUU1BU0tfV0FOVEVEXzI7CisJaWYgKGlkLT5kcml2ZXJfZGF0YSAmIERFVl9ORUVEX1RJTUVSSVJRKQorCQlucC0+aXJxbWFzayB8PSBOVlJFR19JUlFfVElNRVI7CisJaWYgKGlkLT5kcml2ZXJfZGF0YSAmIERFVl9ORUVEX0xJTktUSU1FUikgeworCQlkcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdGltZXIgb24uXG4iLCBwY2lfbmFtZShwY2lfZGV2KSk7CisJCW5wLT5uZWVkX2xpbmt0aW1lciA9IDE7CisJCW5wLT5saW5rX3RpbWVvdXQgPSBqaWZmaWVzICsgTElOS19USU1FT1VUOworCX0gZWxzZSB7CisJCWRwcmludGsoS0VSTl9JTkZPICIlczogbGluayB0aW1lciBvZmYuXG4iLCBwY2lfbmFtZShwY2lfZGV2KSk7CisJCW5wLT5uZWVkX2xpbmt0aW1lciA9IDA7CisJfQorCisJLyogZmluZCBhIHN1aXRhYmxlIHBoeSAqLworCWZvciAoaSA9IDE7IGkgPCAzMjsgaSsrKSB7CisJCWludCBpZDEsIGlkMjsKKworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJCWlkMSA9IG1paV9ydyhkZXYsIGksIE1JSV9QSFlTSUQxLCBNSUlfUkVBRCk7CisJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQlpZiAoaWQxIDwgMCB8fCBpZDEgPT0gMHhmZmZmKQorCQkJY29udGludWU7CisJCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJaWQyID0gbWlpX3J3KGRldiwgaSwgTUlJX1BIWVNJRDIsIE1JSV9SRUFEKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJCWlmIChpZDIgPCAwIHx8IGlkMiA9PSAweGZmZmYpCisJCQljb250aW51ZTsKKworCQlpZDEgPSAoaWQxICYgUEhZSUQxX09VSV9NQVNLKSA8PCBQSFlJRDFfT1VJX1NIRlQ7CisJCWlkMiA9IChpZDIgJiBQSFlJRDJfT1VJX01BU0spID4+IFBIWUlEMl9PVUlfU0hGVDsKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogb3BlbjogRm91bmQgUEhZICUwNHg6JTA0eCBhdCBhZGRyZXNzICVkLlxuIiwKKwkJCQlwY2lfbmFtZShwY2lfZGV2KSwgaWQxLCBpZDIsIGkpOworCQlucC0+cGh5YWRkciA9IGk7CisJCW5wLT5waHlfb3VpID0gaWQxIHwgaWQyOworCQlicmVhazsKKwl9CisJaWYgKGkgPT0gMzIpIHsKKwkJLyogUEhZIGluIGlzb2xhdGUgbW9kZT8gTm8gcGh5IGF0dGFjaGVkIGFuZCB1c2VyIHdhbnRzIHRvCisJCSAqIHRlc3QgbG9vcGJhY2s/IFZlcnkgb2RkLCBidXQgY2FuIGJlIGNvcnJlY3QuCisJCSAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogb3BlbjogQ291bGQgbm90IGZpbmQgYSB2YWxpZCBQSFkuXG4iLAorCQkJCXBjaV9uYW1lKHBjaV9kZXYpKTsKKwl9CisKKwlpZiAoaSAhPSAzMikgeworCQkvKiByZXNldCBpdCAqLworCQlwaHlfaW5pdChkZXYpOworCX0KKworCS8qIHNldCBkZWZhdWx0IGxpbmsgc3BlZWQgc2V0dGluZ3MgKi8KKwlucC0+bGlua3NwZWVkID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFfE5WUkVHX0xJTktTUEVFRF8xMDsKKwlucC0+ZHVwbGV4ID0gMDsKKwlucC0+YXV0b25lZyA9IDE7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0lORk8gImZvcmNlZGV0aDogdW5hYmxlIHRvIHJlZ2lzdGVyIG5ldGRldjogJWRcbiIsIGVycik7CisJCWdvdG8gb3V0X2ZyZWVyaW5nOworCX0KKwlwcmludGsoS0VSTl9JTkZPICIlczogZm9yY2VkZXRoLmM6IHN1YnN5c3RlbTogJTA1eDolMDR4IGJvdW5kIHRvICVzXG4iLAorCQkJZGV2LT5uYW1lLCBwY2lfZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBwY2lfZGV2LT5zdWJzeXN0ZW1fZGV2aWNlLAorCQkJcGNpX25hbWUocGNpX2RldikpOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlcmluZzoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KG5wLT5wY2lfZGV2LCBzaXplb2Yoc3RydWN0IHJpbmdfZGVzYykgKiAoUlhfUklORyArIFRYX1JJTkcpLAorCQkJCW5wLT5yeF9yaW5nLCBucC0+cmluZ19hZGRyKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7CitvdXRfdW5tYXA6CisJaW91bm1hcChnZXRfaHdiYXNlKGRldikpOworb3V0X3JlbHJlZzoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXYpOworb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOworb3V0X2ZyZWU6CisJZnJlZV9uZXRkZXYoZGV2KTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgbnZfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJLyogc3BlY2lhbCBvcDogd3JpdGUgYmFjayB0aGUgbWlzb3JkZXJlZCBNQUMgYWRkcmVzcyAtIG90aGVyd2lzZQorCSAqIHRoZSBuZXh0IG52X3Byb2JlIHdvdWxkIHNlZSBhIHdyb25nIGFkZHJlc3MuCisJICovCisJd3JpdGVsKG5wLT5vcmlnX21hY1swXSwgYmFzZSArIE52UmVnTWFjQWRkckEpOworCXdyaXRlbChucC0+b3JpZ19tYWNbMV0sIGJhc2UgKyBOdlJlZ01hY0FkZHJCKTsKKworCS8qIGZyZWUgYWxsIHN0cnVjdHVyZXMgKi8KKwlwY2lfZnJlZV9jb25zaXN0ZW50KG5wLT5wY2lfZGV2LCBzaXplb2Yoc3RydWN0IHJpbmdfZGVzYykgKiAoUlhfUklORyArIFRYX1JJTkcpLCBucC0+cnhfcmluZywgbnAtPnJpbmdfYWRkcik7CisJaW91bm1hcChnZXRfaHdiYXNlKGRldikpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpX2Rldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOworCWZyZWVfbmV0ZGV2KGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpX3RibFtdID0geworCXsJLyogbkZvcmNlIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAorCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzEsCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX0lSUU1BU0tfMXxERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVIsCisJfSwKKwl7CS8qIG5Gb3JjZTIgRXRoZXJuZXQgQ29udHJvbGxlciAqLworCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9OVklESUEsCisJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMiwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUiwKKwl9LAorCXsJLyogbkZvcmNlMyBFdGhlcm5ldCBDb250cm9sbGVyICovCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zLAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSLAorCX0sCisJewkvKiBuRm9yY2UzIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAorCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzQsCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUSwKKwl9LAorCXsJLyogbkZvcmNlMyBFdGhlcm5ldCBDb250cm9sbGVyICovCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF81LAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlEsCisJfSwKKwl7CS8qIG5Gb3JjZTMgRXRoZXJuZXQgQ29udHJvbGxlciAqLworCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9OVklESUEsCisJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfNiwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRLAorCX0sCisJewkvKiBuRm9yY2UzIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAorCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzcsCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUSwKKwl9LAorCXsJLyogQ0s4MDQgRXRoZXJuZXQgQ29udHJvbGxlciAqLworCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9OVklESUEsCisJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfOCwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRLAorCX0sCisJewkvKiBDSzgwNCBFdGhlcm5ldCBDb250cm9sbGVyICovCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF85LAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlEsCisJfSwKKwl7CS8qIE1DUDA0IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAorCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzEwLAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlEsCisJfSwKKwl7CS8qIE1DUDA0IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAorCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzExLAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlEsCisJfSwKKwl7MCx9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZSA9ICJmb3JjZWRldGgiLAorCS5pZF90YWJsZSA9IHBjaV90YmwsCisJLnByb2JlID0gbnZfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG52X3JlbW92ZSksCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmljKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiZm9yY2VkZXRoLmM6IFJldmVyc2UgRW5naW5lZXJlZCBuRm9yY2UgZXRoZXJuZXQgZHJpdmVyLiBWZXJzaW9uICVzLlxuIiwgRk9SQ0VERVRIX1ZFUlNJT04pOworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25pYyh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2ludGVycnVwdF93b3JrLCAiZm9yY2VkZXRoIG1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworCitNT0RVTEVfQVVUSE9SKCJNYW5mcmVkIFNwcmF1bCA8bWFuZnJlZEBjb2xvcmZ1bGxpZmUuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSZXZlcnNlIEVuZ2luZWVyZWQgbkZvcmNlIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNpX3RibCk7CisKK21vZHVsZV9pbml0KGluaXRfbmljKTsKK21vZHVsZV9leGl0KGV4aXRfbmljKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDNiMmIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCkBAIC0wLDAgKzEsMTg0OSBAQAorLyogCisgKiBkcml2ZXJzL25ldC9naWFuZmFyLmMKKyAqCisgKiBHaWFuZmFyIEV0aGVybmV0IERyaXZlcgorICogRHJpdmVyIGZvciBGRUMgb24gTVBDODU0MCBhbmQgVFNFQyBvbiBNUEM4NTQwL01QQzg1NjAKKyAqIEJhc2VkIG9uIDgyNjBfaW8vZmNjX2VuZXQuYworICoKKyAqIEF1dGhvcjogQW5keSBGbGVtaW5nCisgKiBNYWludGFpbmVyOiBLdW1hciBHYWxhIChrdW1hci5nYWxhQGZyZWVzY2FsZS5jb20pCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBHaWFuZmFyOiAgQUtBIExhbWJkYSBEcmFjb25pcywgIkRyYWdvbiIKKyAqICBSQSAxMSAzMSAyNC4yCisgKiAgRGVjICs2OSAxOSA1MgorICogIFYgMy44NAorICogIEItViArMS42MgorICoKKyAqICBUaGVvcnkgb2Ygb3BlcmF0aW9uCisgKiAgVGhpcyBkcml2ZXIgaXMgZGVzaWduZWQgZm9yIHRoZSBUcmlwbGUtc3BlZWQgRXRoZXJuZXQKKyAqICBjb250cm9sbGVycyBvbiB0aGUgRnJlZXNjYWxlIDg1NDAvODU2MCBpbnRlZ3JhdGVkIHByb2Nlc3NvcnMsCisgKiAgYXMgd2VsbCBhcyB0aGUgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIG9uIHRoZSA4NTQwLiAgCisgKiAgCisgKiAgVGhlIGRyaXZlciBpcyBpbml0aWFsaXplZCB0aHJvdWdoIHBsYXRmb3JtX2RldmljZS4gIFN0cnVjdHVyZXMgd2hpY2gKKyAqICBkZWZpbmUgdGhlIGNvbmZpZ3VyYXRpb24gbmVlZGVkIGJ5IHRoZSBib2FyZCBhcmUgZGVmaW5lZCBpbiBhCisgKiAgYm9hcmQgc3RydWN0dXJlIGluIGFyY2gvcHBjL3BsYXRmb3JtcyAodGhvdWdoIEkgZG8gbm90CisgKiAgZGlzY291bnQgdGhlIHBvc3NpYmlsaXR5IHRoYXQgb3RoZXIgYXJjaGl0ZWN0dXJlcyBjb3VsZCBvbmUKKyAqICBkYXkgYmUgc3VwcG9ydGVkLiAgT25lIGFzc3VtcHRpb24gdGhlIGRyaXZlciBjdXJyZW50bHkgbWFrZXMKKyAqICBpcyB0aGF0IHRoZSBQSFkgaXMgY29uZmlndXJlZCBpbiBzdWNoIGEgd2F5IHRvIGFkdmVydGlzZSBhbGwKKyAqICBjYXBhYmlsaXRpZXMuICBUaGlzIGlzIGEgc2Vuc2libGUgZGVmYXVsdCwgYW5kIG9uIGNlcnRhaW4KKyAqICBQSFlzLCBjaGFuZ2luZyB0aGlzIGRlZmF1bHQgZW5jb3VudGVycyBzdWJzdGFudGlhbCBlcnJhdGEKKyAqICBpc3N1ZXMuICBGdXR1cmUgdmVyc2lvbnMgbWF5IHJlbW92ZSB0aGlzIHJlcXVpcmVtZW50LCBidXQgZm9yCisgKiAgbm93LCBpdCBpcyBiZXN0IGZvciB0aGUgZmlybXdhcmUgdG8gZW5zdXJlIHRoaXMgaXMgdGhlIGNhc2UuCisgKgorICogIFRoZSBHaWFuZmFyIEV0aGVybmV0IENvbnRyb2xsZXIgdXNlcyBhIHJpbmcgb2YgYnVmZmVyCisgKiAgZGVzY3JpcHRvcnMuICBUaGUgYmVnaW5uaW5nIGlzIGluZGljYXRlZCBieSBhIHJlZ2lzdGVyCisgKiAgcG9pbnRpbmcgdG8gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSByaW5nLiAKKyAqICBUaGUgZW5kIGlzIGRldGVybWluZWQgYnkgYSAid3JhcCIgYml0IGJlaW5nIHNldCBpbiB0aGUgCisgKiAgbGFzdCBkZXNjcmlwdG9yIG9mIHRoZSByaW5nLgorICoKKyAqICBXaGVuIGEgcGFja2V0IGlzIHJlY2VpdmVkLCB0aGUgUlhGIGJpdCBpbiB0aGUKKyAqICBJRVZFTlQgcmVnaXN0ZXIgaXMgc2V0LCB0cmlnZ2VyaW5nIGFuIGludGVycnVwdCB3aGVuIHRoZSAKKyAqICBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgSU1BU0sgcmVnaXN0ZXIgaXMgYWxzbyBzZXQgKGlmCisgKiAgaW50ZXJydXB0IGNvYWxlc2NpbmcgaXMgYWN0aXZlLCB0aGVuIHRoZSBpbnRlcnJ1cHQgbWF5IG5vdAorICogIGhhcHBlbiBpbW1lZGlhdGVseSwgYnV0IHdpbGwgd2FpdCB1bnRpbCBlaXRoZXIgYSBzZXQgbnVtYmVyCisgKiAgb2YgZnJhbWVzIG9yIGFtb3VudCBvZiB0aW1lIGhhdmUgcGFzc2VkLikuICBJbiBOQVBJLCB0aGUKKyAqICBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIHNpZ25hbCB0aGVyZSBpcyB3b3JrIHRvIGJlIGRvbmUsIGFuZAorICogIGV4aXQuICBXaXRob3V0IE5BUEksIHRoZSBwYWNrZXQocykgd2lsbCBiZSBoYW5kbGVkCisgKiAgaW1tZWRpYXRlbHkuICBCb3RoIG1ldGhvZHMgd2lsbCBzdGFydCBhdCB0aGUgbGFzdCBrbm93biBlbXB0eQorICogIGRlc2NyaXB0b3IsIGFuZCBwcm9jZXNzIGV2ZXJ5IHN1YnNlcXVlbnQgZGVzY3JpcHRvciB1bnRpbCB0aGVyZSAKKyAqICBhcmUgbm9uZSBsZWZ0IHdpdGggZGF0YSAoTkFQSSB3aWxsIHN0b3AgYWZ0ZXIgYSBzZXQgbnVtYmVyIG9mCisgKiAgcGFja2V0cyB0byBnaXZlIHRpbWUgdG8gb3RoZXIgdGFza3MsIGJ1dCB3aWxsIGV2ZW50dWFsbHkKKyAqICBwcm9jZXNzIGFsbCB0aGUgcGFja2V0cykuICBUaGUgZGF0YSBhcnJpdmVzIGluc2lkZSBhCisgKiAgcHJlLWFsbG9jYXRlZCBza2IsIGFuZCBzbyBhZnRlciB0aGUgc2tiIGlzIHBhc3NlZCB1cCB0byB0aGUKKyAqICBzdGFjaywgYSBuZXcgc2tiIG11c3QgYmUgYWxsb2NhdGVkLCBhbmQgdGhlIGFkZHJlc3MgZmllbGQgaW4KKyAqICB0aGUgYnVmZmVyIGRlc2NyaXB0b3IgbXVzdCBiZSB1cGRhdGVkIHRvIGluZGljYXRlIHRoaXMgbmV3CisgKiAgc2tiLgorICoKKyAqICBXaGVuIHRoZSBrZXJuZWwgcmVxdWVzdHMgdGhhdCBhIHBhY2tldCBiZSB0cmFuc21pdHRlZCwgdGhlCisgKiAgZHJpdmVyIHN0YXJ0cyB3aGVyZSBpdCBsZWZ0IG9mZiBsYXN0IHRpbWUsIGFuZCBwb2ludHMgdGhlCisgKiAgZGVzY3JpcHRvciBhdCB0aGUgYnVmZmVyIHdoaWNoIHdhcyBwYXNzZWQgaW4uICBUaGUgZHJpdmVyCisgKiAgdGhlbiBpbmZvcm1zIHRoZSBETUEgZW5naW5lIHRoYXQgdGhlcmUgYXJlIHBhY2tldHMgcmVhZHkgdG8KKyAqICBiZSB0cmFuc21pdHRlZC4gIE9uY2UgdGhlIGNvbnRyb2xsZXIgaXMgZmluaXNoZWQgdHJhbnNtaXR0aW5nCisgKiAgdGhlIHBhY2tldCwgYW4gaW50ZXJydXB0IG1heSBiZSB0cmlnZ2VyZWQgKHVuZGVyIHRoZSBzYW1lCisgKiAgY29uZGl0aW9ucyBhcyBmb3IgcmVjZXB0aW9uLCBidXQgZGVwZW5kaW5nIG9uIHRoZSBUWEYgYml0KS4KKyAqICBUaGUgZHJpdmVyIHRoZW4gY2xlYW5zIHVwIHRoZSBidWZmZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorCisjaW5jbHVkZSAiZ2lhbmZhci5oIgorI2luY2x1ZGUgImdpYW5mYXJfcGh5LmgiCisKKyNkZWZpbmUgVFhfVElNRU9VVCAgICAgICgxKkhaKQorI2RlZmluZSBTS0JfQUxMT0NfVElNRU9VVCAxMDAwMDAwCisjdW5kZWYgQlJJRUZfR0ZBUl9FUlJPUlMKKyN1bmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCisKKyNpZmRlZiBDT05GSUdfR0ZBUl9OQVBJCisjZGVmaW5lIFJFQ0VJVkUoeCkgbmV0aWZfcmVjZWl2ZV9za2IoeCkKKyNlbHNlCisjZGVmaW5lIFJFQ0VJVkUoeCkgbmV0aWZfcngoeCkKKyNlbmRpZgorCitjb25zdCBjaGFyIGdmYXJfZHJpdmVyX25hbWVbXSA9ICJHaWFuZmFyIEV0aGVybmV0IjsKK2NvbnN0IGNoYXIgZ2Zhcl9kcml2ZXJfdmVyc2lvbltdID0gIjEuMSI7CisKK2ludCBzdGFydHVwX2dmYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGdmYXJfZW5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBnZmFyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBnZmFyX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGdmYXJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdHJ1Y3Qgc2tfYnVmZiAqZ2Zhcl9uZXdfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCByeGJkOCAqYmRwKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2Zhcl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGdmYXJfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBnZmFyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpOworc3RhdGljIGlycXJldHVybl90IGdmYXJfZXJyb3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgZ2Zhcl90cmFuc21pdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2lycXJldHVybl90IGdmYXJfcmVjZWl2ZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBnZmFyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBwaHlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgZ2Zhcl9waHlfY2hhbmdlKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgZ2Zhcl9waHlfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGFkanVzdF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaW5pdF9yZWdpc3RlcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGluaXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBnZmFyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGdmYXJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7Cit2b2lkIGZyZWVfc2tiX3Jlc291cmNlcyhzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2KTsKK3N0YXRpYyB2b2lkIGdmYXJfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZ2Zhcl9zZXRfaGFzaF9mb3JfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqYWRkcik7CisjaWZkZWYgQ09ORklHX0dGQVJfTkFQSQorc3RhdGljIGludCBnZmFyX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpOworI2VuZGlmCitzdGF0aWMgaW50IGdmYXJfY2xlYW5fcnhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcnhfd29ya19saW1pdCk7CitzdGF0aWMgaW50IGdmYXJfcHJvY2Vzc19mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGdmYXJfcGh5X3N0YXJ0dXBfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKKworZXh0ZXJuIHN0cnVjdCBldGh0b29sX29wcyBnZmFyX2V0aHRvb2xfb3BzOworCitNT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdpYW5mYXIgRXRoZXJuZXQgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgZ2Zhcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJdTMyIHRlbXB2YWw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IE5VTEw7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXZpY2UpOworCXN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKmVpbmZvOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlpbnQgaWR4OworCWludCBlcnIgPSAwOworCWludCBkZXZfZXRodG9vbF9vcHMgPSAwOworCisJZWluZm8gPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChlaW5mbyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZ2ZhciAlZDogTWlzc2luZyBhZGRpdGlvbmFsIGRhdGEhXG4iLAorCQkgICAgICAgcGRldi0+aWQpOworCisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIENyZWF0ZSBhbiBldGhlcm5ldCBkZXZpY2UgaW5zdGFuY2UgKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YgKCpwcml2KSk7CisKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBTZXQgdGhlIGluZm8gaW4gdGhlIHByaXYgdG8gdGhlIGN1cnJlbnQgaW5mbyAqLworCXByaXYtPmVpbmZvID0gZWluZm87CisKKwkvKiBmaWxsIG91dCBJUlEgZmllbGRzICovCisJaWYgKGVpbmZvLT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX01VTFRJX0lOVFIpIHsKKwkJcHJpdi0+aW50ZXJydXB0VHJhbnNtaXQgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAidHgiKTsKKwkJcHJpdi0+aW50ZXJydXB0UmVjZWl2ZSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJyeCIpOworCQlwcml2LT5pbnRlcnJ1cHRFcnJvciA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJlcnJvciIpOworCX0gZWxzZSB7CisJCXByaXYtPmludGVycnVwdFRyYW5zbWl0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwl9CisKKwkvKiBnZXQgYSBwb2ludGVyIHRvIHRoZSByZWdpc3RlciBtZW1vcnkgKi8KKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlwcml2LT5yZWdzID0gKHN0cnVjdCBnZmFyICopCisJCWlvcmVtYXAoci0+c3RhcnQsIHNpemVvZiAoc3RydWN0IGdmYXIpKTsKKworCWlmIChwcml2LT5yZWdzID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byByZWdzX2ZhaWw7CisJfQorCisJLyogU2V0IHRoZSBQSFkgYmFzZSBhZGRyZXNzICovCisJcHJpdi0+cGh5cmVncyA9IChzdHJ1Y3QgZ2ZhciAqKQorCSAgICBpb3JlbWFwKGVpbmZvLT5waHlfcmVnX2FkZHIsIHNpemVvZiAoc3RydWN0IGdmYXIpKTsKKworCWlmIChwcml2LT5waHlyZWdzID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBwaHlfcmVnc19mYWlsOworCX0KKworCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXZpY2UsIGRldik7CisKKwkvKiBTdG9wIHRoZSBETUEgZW5naW5lIG5vdywgaW4gY2FzZSBpdCB3YXMgcnVubmluZyBiZWZvcmUgKi8KKwkvKiAoVGhlIGZpcm13YXJlIGNvdWxkIGhhdmUgdXNlZCBpdCwgYW5kIGxlZnQgaXQgcnVubmluZykuICovCisJLyogVG8gZG8gdGhpcywgd2Ugd3JpdGUgR3JhY2VmdWwgUmVjZWl2ZSBTdG9wIGFuZCBHcmFjZWZ1bCAqLworCS8qIFRyYW5zbWl0IFN0b3AsIGFuZCB0aGVuIHdhaXQgdW50aWwgdGhlIGNvcnJlc3BvbmRpbmcgYml0cyAqLworCS8qIGluIElFVkVOVCBpbmRpY2F0ZSB0aGUgc3RvcHMgaGF2ZSBjb21wbGV0ZWQuICovCisJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+ZG1hY3RybCk7CisJdGVtcHZhbCAmPSB+KERNQUNUUkxfR1JTIHwgRE1BQ1RSTF9HVFMpOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmRtYWN0cmwsIHRlbXB2YWwpOworCisJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+ZG1hY3RybCk7CisJdGVtcHZhbCB8PSAoRE1BQ1RSTF9HUlMgfCBETUFDVFJMX0dUUyk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+ZG1hY3RybCwgdGVtcHZhbCk7CisKKwl3aGlsZSAoIShnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmlldmVudCkgJiAoSUVWRU5UX0dSU0MgfCBJRVZFTlRfR1RTQykpKQorCQljcHVfcmVsYXgoKTsKKworCS8qIFJlc2V0IE1BQyBsYXllciAqLworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPm1hY2NmZzEsIE1BQ0NGRzFfU09GVF9SRVNFVCk7CisKKwl0ZW1wdmFsID0gKE1BQ0NGRzFfVFhfRkxPVyB8IE1BQ0NGRzFfUlhfRkxPVyk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+bWFjY2ZnMSwgdGVtcHZhbCk7CisKKwkvKiBJbml0aWFsaXplIE1BQ0NGRzIuICovCisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+bWFjY2ZnMiwgTUFDQ0ZHMl9JTklUX1NFVFRJTkdTKTsKKworCS8qIEluaXRpYWxpemUgRUNOVFJMICovCisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+ZWNudHJsLCBFQ05UUkxfSU5JVF9TRVRUSU5HUyk7CisKKwkvKiBDb3B5IHRoZSBzdGF0aW9uIGFkZHJlc3MgaW50byB0aGUgZGV2IHN0cnVjdHVyZSwgKi8KKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgZWluZm8tPm1hY19hZGRyLCBNQUNfQUREUl9MRU4pOworCisJLyogU2V0IHRoZSBkZXYtPmJhc2VfYWRkciB0byB0aGUgZ2ZhciByZWcgcmVnaW9uICovCisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZykgKHByaXYtPnJlZ3MpOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgZGV2aWNlKTsKKworCS8qIEZpbGwgaW4gdGhlIGRldiBzdHJ1Y3R1cmUgKi8KKwlkZXYtPm9wZW4gPSBnZmFyX2VuZXRfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGdmYXJfc3RhcnRfeG1pdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSBnZmFyX3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjaWZkZWYgQ09ORklHX0dGQVJfTkFQSQorCWRldi0+cG9sbCA9IGdmYXJfcG9sbDsKKwlkZXYtPndlaWdodCA9IEdGQVJfREVWX1dFSUdIVDsKKyNlbmRpZgorCWRldi0+c3RvcCA9IGdmYXJfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSBnZmFyX2dldF9zdGF0czsKKwlkZXYtPmNoYW5nZV9tdHUgPSBnZmFyX2NoYW5nZV9tdHU7CisJZGV2LT5tdHUgPSAxNTAwOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gZ2Zhcl9zZXRfbXVsdGk7CisKKwkvKiBJbmRleCBpbnRvIHRoZSBhcnJheSBvZiBwb3NzaWJsZSBldGh0b29sCisJICogb3BzIHRvIGNhdGNoIGFsbCA0IHBvc3NpYmlsaXRpZXMgKi8KKwlpZigocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfUk1PTikgPT0gMCkKKwkJZGV2X2V0aHRvb2xfb3BzICs9IDE7CisKKwlpZigocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfQ09BTEVTQ0UpID09IDApCisJCWRldl9ldGh0b29sX29wcyArPSAyOworCisJZGV2LT5ldGh0b29sX29wcyA9IGdmYXJfb3BfYXJyYXlbZGV2X2V0aHRvb2xfb3BzXTsKKworCXByaXYtPnJ4X2J1ZmZlcl9zaXplID0gREVGQVVMVF9SWF9CVUZGRVJfU0laRTsKKyNpZmRlZiBDT05GSUdfR0ZBUl9CVUZTVEFTSAorCXByaXYtPnJ4X3N0YXNoX3NpemUgPSBTVEFTSF9MRU5HVEg7CisjZW5kaWYKKwlwcml2LT50eF9yaW5nX3NpemUgPSBERUZBVUxUX1RYX1JJTkdfU0laRTsKKwlwcml2LT5yeF9yaW5nX3NpemUgPSBERUZBVUxUX1JYX1JJTkdfU0laRTsKKworCXByaXYtPnR4Y29hbGVzY2luZyA9IERFRkFVTFRfVFhfQ09BTEVTQ0U7CisJcHJpdi0+dHhjb3VudCA9IERFRkFVTFRfVFhDT1VOVDsKKwlwcml2LT50eHRpbWUgPSBERUZBVUxUX1RYVElNRTsKKwlwcml2LT5yeGNvYWxlc2NpbmcgPSBERUZBVUxUX1JYX0NPQUxFU0NFOworCXByaXYtPnJ4Y291bnQgPSBERUZBVUxUX1JYQ09VTlQ7CisJcHJpdi0+cnh0aW1lID0gREVGQVVMVF9SWFRJTUU7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsIGFib3J0aW5nLlxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQlnb3RvIHJlZ2lzdGVyX2ZhaWw7CisJfQorCisJLyogUHJpbnQgb3V0IHRoZSBkZXZpY2UgaW5mbyAqLworCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUsIGRldi0+bmFtZSk7CisJZm9yIChpZHggPSAwOyBpZHggPCA2OyBpZHgrKykKKwkJcHJpbnRrKCIlMi4yeCVjIiwgZGV2LT5kZXZfYWRkcltpZHhdLCBpZHggPT0gNSA/ICcgJyA6ICc6Jyk7CisJcHJpbnRrKCJcbiIpOworCisJLyogRXZlbiBtb3JlIGRldmljZSBpbmZvIGhlbHBzIHdoZW4gZGV0ZXJtaW5pbmcgd2hpY2gga2VybmVsICovCisJLyogcHJvdmlkZWQgd2hpY2ggc2V0IG9mIGJlbmNobWFya3MuICBTaW5jZSB0aGlzIGlzIGdsb2JhbCBmb3IgYWxsICovCisJLyogZGV2aWNlcywgd2Ugb25seSBwcmludCBpdCBvbmNlICovCisjaWZkZWYgQ09ORklHX0dGQVJfTkFQSQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBSdW5uaW5nIHdpdGggTkFQSSBlbmFibGVkXG4iLCBkZXYtPm5hbWUpOworI2Vsc2UKKwlwcmludGsoS0VSTl9JTkZPICIlczogUnVubmluZyB3aXRoIE5BUEkgZGlzYWJsZWRcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlwcmludGsoS0VSTl9JTkZPICIlczogJWQvJWQgUlgvVFggQkQgcmluZyBzaXplXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHByaXYtPnJ4X3Jpbmdfc2l6ZSwgcHJpdi0+dHhfcmluZ19zaXplKTsKKworCXJldHVybiAwOworCityZWdpc3Rlcl9mYWlsOgorCWlvdW5tYXAoKHZvaWQgKikgcHJpdi0+cGh5cmVncyk7CitwaHlfcmVnc19mYWlsOgorCWlvdW5tYXAoKHZvaWQgKikgcHJpdi0+cmVncyk7CityZWdzX2ZhaWw6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBnZmFyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZGV2X3NldF9kcnZkYXRhKGRldmljZSwgTlVMTCk7CisKKwlpb3VubWFwKCh2b2lkICopIHByaXYtPnJlZ3MpOworCWlvdW5tYXAoKHZvaWQgKikgcHJpdi0+cGh5cmVncyk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKworCXJldHVybiAwOworfQorCisKKy8qIENvbmZpZ3VyZSB0aGUgUEhZIGZvciBkZXYuCisgKiByZXR1cm5zIDAgaWYgc3VjY2Vzcy4gIC0xIGlmIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBpbml0X3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwaHlfaW5mbyAqY3VycGh5OworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gUEhZX0lOSVRfVElNRU9VVDsKKwlzdHJ1Y3QgZ2ZhciAqcGh5cmVncyA9IHByaXYtPnBoeXJlZ3M7CisJc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvOworCWludCBlcnI7CisKKwlwcml2LT5vbGRsaW5rID0gMDsKKwlwcml2LT5vbGRzcGVlZCA9IDA7CisJcHJpdi0+b2xkZHVwbGV4ID0gLTE7CisKKwltaWlfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBnZmFyX21paV9pbmZvKSwKKwkJCUdGUF9LRVJORUwpOworCisJaWYoTlVMTCA9PSBtaWlfaW5mbykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWlpX2luZm9cbiIsIAorCQkJCWRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1paV9pbmZvLT5zcGVlZCA9IFNQRUVEXzEwMDA7CisJbWlpX2luZm8tPmR1cGxleCA9IERVUExFWF9GVUxMOworCW1paV9pbmZvLT5wYXVzZSA9IDA7CisJbWlpX2luZm8tPmxpbmsgPSAxOworCisJbWlpX2luZm8tPmFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwKKwkJCUFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKKwkJCUFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8CisJCQlBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAorCQkJQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCk7CisJbWlpX2luZm8tPmF1dG9uZWcgPSAxOworCisJc3Bpbl9sb2NrX2luaXQoJm1paV9pbmZvLT5tZGlvX2xvY2spOworCisJbWlpX2luZm8tPm1paV9pZCA9IHByaXYtPmVpbmZvLT5waHlpZDsKKworCW1paV9pbmZvLT5kZXYgPSBkZXY7CisKKwltaWlfaW5mby0+bWRpb19yZWFkID0gJnJlYWRfcGh5X3JlZzsKKwltaWlfaW5mby0+bWRpb193cml0ZSA9ICZ3cml0ZV9waHlfcmVnOworCisJcHJpdi0+bWlpX2luZm8gPSBtaWlfaW5mbzsKKworCS8qIFJlc2V0IHRoZSBtYW5hZ2VtZW50IGludGVyZmFjZSAqLworCWdmYXJfd3JpdGUoJnBoeXJlZ3MtPm1paW1jZmcsIE1JSU1DRkdfUkVTRVQpOworCisJLyogU2V0dXAgdGhlIE1JSSBNZ210IGNsb2NrIHNwZWVkICovCisJZ2Zhcl93cml0ZSgmcGh5cmVncy0+bWlpbWNmZywgTUlJTUNGR19JTklUX1ZBTFVFKTsKKworCS8qIFdhaXQgdW50aWwgdGhlIGJ1cyBpcyBmcmVlICovCisJd2hpbGUgKChnZmFyX3JlYWQoJnBoeXJlZ3MtPm1paW1pbmQpICYgTUlJTUlORF9CVVNZKSAmJgorCQkJdGltZW91dC0tKQorCQljcHVfcmVsYXgoKTsKKworCWlmKHRpbWVvdXQgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUaGUgTUlJIEJ1cyBpcyBzdHVjayFcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJZXJyID0gLTE7CisJCWdvdG8gYnVzX2ZhaWw7CisJfQorCisJLyogZ2V0IGluZm8gZm9yIHRoaXMgUEhZICovCisJY3VycGh5ID0gZ2V0X3BoeV9pbmZvKHByaXYtPm1paV9pbmZvKTsKKworCWlmIChjdXJwaHkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyBQSFkgZm91bmRcbiIsIGRldi0+bmFtZSk7CisJCWVyciA9IC0xOworCQlnb3RvIG5vX3BoeTsKKwl9CisKKwltaWlfaW5mby0+cGh5aW5mbyA9IGN1cnBoeTsKKworCS8qIFJ1biB0aGUgY29tbWFuZHMgd2hpY2ggaW5pdGlhbGl6ZSB0aGUgUEhZICovCisJaWYoY3VycGh5LT5pbml0KSB7CisJCWVyciA9IGN1cnBoeS0+aW5pdChwcml2LT5taWlfaW5mbyk7CisKKwkJaWYgKGVycikgCisJCQlnb3RvIHBoeV9pbml0X2ZhaWw7CisJfQorCisJcmV0dXJuIDA7CisKK3BoeV9pbml0X2ZhaWw6Citub19waHk6CitidXNfZmFpbDoKKwlrZnJlZShtaWlfaW5mbyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBpbml0X3JlZ2lzdGVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogQ2xlYXIgSUVWRU5UICovCisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWV2ZW50LCBJRVZFTlRfSU5JVF9DTEVBUik7CisKKwkvKiBJbml0aWFsaXplIElNQVNLICovCisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aW1hc2ssIElNQVNLX0lOSVRfQ0xFQVIpOworCisJLyogSW5pdCBoYXNoIHJlZ2lzdGVycyB0byB6ZXJvICovCisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWFkZHIwLCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pYWRkcjEsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlhZGRyMiwgMCk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWFkZHIzLCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pYWRkcjQsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlhZGRyNSwgMCk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWFkZHI2LCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pYWRkcjcsIDApOworCisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+Z2FkZHIwLCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5nYWRkcjEsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmdhZGRyMiwgMCk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+Z2FkZHIzLCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5nYWRkcjQsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmdhZGRyNSwgMCk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+Z2FkZHI2LCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5nYWRkcjcsIDApOworCisJLyogWmVybyBvdXQgcmN0cmwgKi8KKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5yY3RybCwgMHgwMDAwMDAwMCk7CisKKwkvKiBaZXJvIG91dCB0aGUgcm1vbiBtaWIgcmVnaXN0ZXJzIGlmIGl0IGhhcyB0aGVtICovCisJaWYgKHByaXYtPmVpbmZvLT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX1JNT04pIHsKKwkJbWVtc2V0KCh2b2lkICopICYocHJpdi0+cmVncy0+cm1vbiksIDAsCisJCSAgICAgICBzaXplb2YgKHN0cnVjdCBybW9uX21pYikpOworCisJCS8qIE1hc2sgb2ZmIHRoZSBDQU0gaW50ZXJydXB0cyAqLworCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5ybW9uLmNhbTEsIDB4ZmZmZmZmZmYpOworCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5ybW9uLmNhbTIsIDB4ZmZmZmZmZmYpOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIG1heCByZWNlaXZlIGJ1ZmZlciBsZW5ndGggKi8KKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5tcmJsciwgcHJpdi0+cnhfYnVmZmVyX3NpemUpOworCisjaWZkZWYgQ09ORklHX0dGQVJfQlVGU1RBU0gKKwkvKiBJZiB3ZSBhcmUgc3Rhc2hpbmcgYnVmZmVycywgd2UgbmVlZCB0byBzZXQgdGhlCisJICogZXh0cmFjdGlvbiBsZW5ndGggdG8gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAqLworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmF0dHJlbGksIHByaXYtPnJ4X3N0YXNoX3NpemUgPDwgMTYpOworI2VuZGlmCisKKwkvKiBJbml0aWFsaXplIHRoZSBNaW5pbXVtIEZyYW1lIExlbmd0aCBSZWdpc3RlciAqLworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPm1pbmZsciwgTUlORkxSX0lOSVRfU0VUVElOR1MpOworCisJLyogU2V0dXAgQXR0cmlidXRlcyBzbyB0aGF0IHNub29waW5nIGlzIG9uIGZvciByeCAqLworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmF0dHIsIEFUVFJfSU5JVF9TRVRUSU5HUyk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+YXR0cmVsaSwgQVRUUkVMSV9JTklUX1NFVFRJTkdTKTsKKworCS8qIEFzc2lnbiB0aGUgVEJJIGFuIGFkZHJlc3Mgd2hpY2ggd29uJ3QgY29uZmxpY3Qgd2l0aCB0aGUgUEhZcyAqLworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnRiaXBhLCBUQklQQV9WQUxVRSk7Cit9CisKK3ZvaWQgc3RvcF9nZmFyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGdmYXIgKnJlZ3MgPSBwcml2LT5yZWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHRlbXB2YWw7CisKKwkvKiBMb2NrIGl0IGRvd24gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogVGVsbCB0aGUga2VybmVsIHRoZSBsaW5rIGlzIGRvd24gKi8KKwlwcml2LT5taWlfaW5mby0+bGluayA9IDA7CisJYWRqdXN0X2xpbmsoZGV2KTsKKworCS8qIE1hc2sgYWxsIGludGVycnVwdHMgKi8KKwlnZmFyX3dyaXRlKCZyZWdzLT5pbWFzaywgSU1BU0tfSU5JVF9DTEVBUik7CisKKwkvKiBDbGVhciBhbGwgaW50ZXJydXB0cyAqLworCWdmYXJfd3JpdGUoJnJlZ3MtPmlldmVudCwgSUVWRU5UX0lOSVRfQ0xFQVIpOworCisJLyogU3RvcCB0aGUgRE1BLCBhbmQgd2FpdCBmb3IgaXQgdG8gc3RvcCAqLworCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmRtYWN0cmwpOworCWlmICgodGVtcHZhbCAmIChETUFDVFJMX0dSUyB8IERNQUNUUkxfR1RTKSkKKwkgICAgIT0gKERNQUNUUkxfR1JTIHwgRE1BQ1RSTF9HVFMpKSB7CisJCXRlbXB2YWwgfD0gKERNQUNUUkxfR1JTIHwgRE1BQ1RSTF9HVFMpOworCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5kbWFjdHJsLCB0ZW1wdmFsKTsKKworCQl3aGlsZSAoIShnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmlldmVudCkgJgorCQkJIChJRVZFTlRfR1JTQyB8IElFVkVOVF9HVFNDKSkpCisJCQljcHVfcmVsYXgoKTsKKwl9CisKKwkvKiBEaXNhYmxlIFJ4IGFuZCBUeCAqLworCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPm1hY2NmZzEpOworCXRlbXB2YWwgJj0gfihNQUNDRkcxX1JYX0VOIHwgTUFDQ0ZHMV9UWF9FTik7CisJZ2Zhcl93cml0ZSgmcmVncy0+bWFjY2ZnMSwgdGVtcHZhbCk7CisKKwlpZiAocHJpdi0+ZWluZm8tPmJvYXJkX2ZsYWdzICYgRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUikgeworCQkvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJCW1paV9jbGVhcl9waHlfaW50ZXJydXB0KHByaXYtPm1paV9pbmZvKTsKKworCQkvKiBEaXNhYmxlIFBIWSBJbnRlcnJ1cHRzICovCisJCW1paV9jb25maWd1cmVfcGh5X2ludGVycnVwdChwcml2LT5taWlfaW5mbywgCisJCQkJTUlJX0lOVEVSUlVQVF9ESVNBQkxFRCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogRnJlZSB0aGUgSVJRcyAqLworCWlmIChwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19NVUxUSV9JTlRSKSB7CisJCWZyZWVfaXJxKHByaXYtPmludGVycnVwdEVycm9yLCBkZXYpOworCQlmcmVlX2lycShwcml2LT5pbnRlcnJ1cHRUcmFuc21pdCwgZGV2KTsKKwkJZnJlZV9pcnEocHJpdi0+aW50ZXJydXB0UmVjZWl2ZSwgZGV2KTsKKwl9IGVsc2UgeworCQlmcmVlX2lycShwcml2LT5pbnRlcnJ1cHRUcmFuc21pdCwgZGV2KTsKKwl9CisKKwlpZiAocHJpdi0+ZWluZm8tPmJvYXJkX2ZsYWdzICYgRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUikgeworCQlmcmVlX2lycShwcml2LT5laW5mby0+aW50ZXJydXB0UEhZLCBkZXYpOworCX0gZWxzZSB7CisJCWRlbF90aW1lcl9zeW5jKCZwcml2LT5waHlfaW5mb190aW1lcik7CisJfQorCisJZnJlZV9za2JfcmVzb3VyY2VzKHByaXYpOworCisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwKKwkJCXNpemVvZihzdHJ1Y3QgdHhiZDgpKnByaXYtPnR4X3Jpbmdfc2l6ZQorCQkJKyBzaXplb2Yoc3RydWN0IHJ4YmQ4KSpwcml2LT5yeF9yaW5nX3NpemUsCisJCQlwcml2LT50eF9iZF9iYXNlLAorCQkJZ2Zhcl9yZWFkKCZyZWdzLT50YmFzZSkpOworfQorCisvKiBJZiB0aGVyZSBhcmUgYW55IHR4IHNrYnMgb3Igcnggc2ticyBzdGlsbCBhcm91bmQsIGZyZWUgdGhlbS4KKyAqIFRoZW4gZnJlZSB0eF9za2J1ZmYgYW5kIHJ4X3NrYnVmZiAqLwordm9pZCBmcmVlX3NrYl9yZXNvdXJjZXMoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgcnhiZDggKnJ4YmRwOworCXN0cnVjdCB0eGJkOCAqdHhiZHA7CisJaW50IGk7CisKKwkvKiBHbyB0aHJvdWdoIGFsbCB0aGUgYnVmZmVyIGRlc2NyaXB0b3JzIGFuZCBmcmVlIHRoZWlyIGRhdGEgYnVmZmVycyAqLworCXR4YmRwID0gcHJpdi0+dHhfYmRfYmFzZTsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT50eF9yaW5nX3NpemU7IGkrKykgeworCisJCWlmIChwcml2LT50eF9za2J1ZmZbaV0pIHsKKwkJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgdHhiZHAtPmJ1ZlB0ciwKKwkJCQkJdHhiZHAtPmxlbmd0aCwKKwkJCQkJRE1BX1RPX0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShwcml2LT50eF9za2J1ZmZbaV0pOworCQkJcHJpdi0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KKworCWtmcmVlKHByaXYtPnR4X3NrYnVmZik7CisKKwlyeGJkcCA9IHByaXYtPnJ4X2JkX2Jhc2U7CisKKwkvKiByeF9za2J1ZmYgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgYWxsb2NhdGVkLCBzbyBvbmx5CisJICogZnJlZSBpdCBhbmQgaXRzIGNvbnRlbnRzIGlmIGl0IGlzIGFsbG9jYXRlZCAqLworCWlmKHByaXYtPnJ4X3NrYnVmZiAhPSBOVUxMKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwcml2LT5yeF9yaW5nX3NpemU7IGkrKykgeworCQkJaWYgKHByaXYtPnJ4X3NrYnVmZltpXSkgeworCQkJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgcnhiZHAtPmJ1ZlB0ciwKKwkJCQkJCXByaXYtPnJ4X2J1ZmZlcl9zaXplCisJCQkJCQkrIFJYQlVGX0FMSUdOTUVOVCwKKwkJCQkJCURNQV9GUk9NX0RFVklDRSk7CisKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShwcml2LT5yeF9za2J1ZmZbaV0pOworCQkJCXByaXYtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJCQl9CisKKwkJCXJ4YmRwLT5zdGF0dXMgPSAwOworCQkJcnhiZHAtPmxlbmd0aCA9IDA7CisJCQlyeGJkcC0+YnVmUHRyID0gMDsKKworCQkJcnhiZHArKzsKKwkJfQorCisJCWtmcmVlKHByaXYtPnJ4X3NrYnVmZik7CisJfQorfQorCisvKiBCcmluZyB0aGUgY29udHJvbGxlciB1cCBhbmQgcnVubmluZyAqLworaW50IHN0YXJ0dXBfZ2ZhcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0eGJkOCAqdHhiZHA7CisJc3RydWN0IHJ4YmQ4ICpyeGJkcDsKKwlkbWFfYWRkcl90IGFkZHI7CisJdW5zaWduZWQgbG9uZyB2YWRkcjsKKwlpbnQgaTsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZ2ZhciAqcmVncyA9IHByaXYtPnJlZ3M7CisJdTMyIHRlbXB2YWw7CisJaW50IGVyciA9IDA7CisKKwlnZmFyX3dyaXRlKCZyZWdzLT5pbWFzaywgSU1BU0tfSU5JVF9DTEVBUik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBidWZmZXIgZGVzY3JpcHRvcnMgKi8KKwl2YWRkciA9ICh1bnNpZ25lZCBsb25nKSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgCisJCQlzaXplb2YgKHN0cnVjdCB0eGJkOCkgKiBwcml2LT50eF9yaW5nX3NpemUgKworCQkJc2l6ZW9mIChzdHJ1Y3QgcnhiZDgpICogcHJpdi0+cnhfcmluZ19zaXplLAorCQkJJmFkZHIsIEdGUF9LRVJORUwpOworCisJaWYgKHZhZGRyID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IGFsbG9jYXRlIGJ1ZmZlciBkZXNjcmlwdG9ycyFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwcml2LT50eF9iZF9iYXNlID0gKHN0cnVjdCB0eGJkOCAqKSB2YWRkcjsKKworCS8qIGVuZXQgRE1BIG9ubHkgdW5kZXJzdGFuZHMgcGh5c2ljYWwgYWRkcmVzc2VzICovCisJZ2Zhcl93cml0ZSgmcmVncy0+dGJhc2UsIGFkZHIpOworCisJLyogU3RhcnQgdGhlIHJ4IGRlc2NyaXB0b3IgcmluZyB3aGVyZSB0aGUgdHggcmluZyBsZWF2ZXMgb2ZmICovCisJYWRkciA9IGFkZHIgKyBzaXplb2YgKHN0cnVjdCB0eGJkOCkgKiBwcml2LT50eF9yaW5nX3NpemU7CisJdmFkZHIgPSB2YWRkciArIHNpemVvZiAoc3RydWN0IHR4YmQ4KSAqIHByaXYtPnR4X3Jpbmdfc2l6ZTsKKwlwcml2LT5yeF9iZF9iYXNlID0gKHN0cnVjdCByeGJkOCAqKSB2YWRkcjsKKwlnZmFyX3dyaXRlKCZyZWdzLT5yYmFzZSwgYWRkcik7CisKKwkvKiBTZXR1cCB0aGUgc2tidWZmIHJpbmdzICovCisJcHJpdi0+dHhfc2tidWZmID0KKwkgICAgKHN0cnVjdCBza19idWZmICoqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IHNrX2J1ZmYgKikgKgorCQkJCQlwcml2LT50eF9yaW5nX3NpemUsIEdGUF9LRVJORUwpOworCisJaWYgKHByaXYtPnR4X3NrYnVmZiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSB0eF9za2J1ZmZcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHR4X3NrYl9mYWlsOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT50eF9yaW5nX3NpemU7IGkrKykKKwkJcHJpdi0+dHhfc2tidWZmW2ldID0gTlVMTDsKKworCXByaXYtPnJ4X3NrYnVmZiA9CisJICAgIChzdHJ1Y3Qgc2tfYnVmZiAqKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBza19idWZmICopICoKKwkJCQkJcHJpdi0+cnhfcmluZ19zaXplLCBHRlBfS0VSTkVMKTsKKworCWlmIChwcml2LT5yeF9za2J1ZmYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcnhfc2tidWZmXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byByeF9za2JfZmFpbDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cnhfcmluZ19zaXplOyBpKyspCisJCXByaXYtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisKKwkvKiBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIGluIG91ciBkZXYgc3RydWN0dXJlICovCisJcHJpdi0+ZGlydHlfdHggPSBwcml2LT5jdXJfdHggPSBwcml2LT50eF9iZF9iYXNlOworCXByaXYtPmN1cl9yeCA9IHByaXYtPnJ4X2JkX2Jhc2U7CisJcHJpdi0+c2tiX2N1cnR4ID0gcHJpdi0+c2tiX2RpcnR5dHggPSAwOworCXByaXYtPnNrYl9jdXJyeCA9IDA7CisKKwkvKiBJbml0aWFsaXplIFRyYW5zbWl0IERlc2NyaXB0b3IgUmluZyAqLworCXR4YmRwID0gcHJpdi0+dHhfYmRfYmFzZTsKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhfcmluZ19zaXplOyBpKyspIHsKKwkJdHhiZHAtPnN0YXR1cyA9IDA7CisJCXR4YmRwLT5sZW5ndGggPSAwOworCQl0eGJkcC0+YnVmUHRyID0gMDsKKwkJdHhiZHArKzsKKwl9CisKKwkvKiBTZXQgdGhlIGxhc3QgZGVzY3JpcHRvciBpbiB0aGUgcmluZyB0byBpbmRpY2F0ZSB3cmFwICovCisJdHhiZHAtLTsKKwl0eGJkcC0+c3RhdHVzIHw9IFRYQkRfV1JBUDsKKworCXJ4YmRwID0gcHJpdi0+cnhfYmRfYmFzZTsKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cnhfcmluZ19zaXplOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisKKwkJcnhiZHAtPnN0YXR1cyA9IDA7CisKKwkJc2tiID0gZ2Zhcl9uZXdfc2tiKGRldiwgcnhiZHApOworCisJCXByaXYtPnJ4X3NrYnVmZltpXSA9IHNrYjsKKworCQlyeGJkcCsrOworCX0KKworCS8qIFNldCB0aGUgbGFzdCBkZXNjcmlwdG9yIGluIHRoZSByaW5nIHRvIHdyYXAgKi8KKwlyeGJkcC0tOworCXJ4YmRwLT5zdGF0dXMgfD0gUlhCRF9XUkFQOworCisJLyogSWYgdGhlIGRldmljZSBoYXMgbXVsdGlwbGUgaW50ZXJydXB0cywgcmVnaXN0ZXIgZm9yCisJICogdGhlbS4gIE90aGVyd2lzZSwgb25seSByZWdpc3RlciBmb3IgdGhlIG9uZSAqLworCWlmIChwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19NVUxUSV9JTlRSKSB7CisJCS8qIEluc3RhbGwgb3VyIGludGVycnVwdCBoYW5kbGVycyBmb3IgRXJyb3IsIAorCQkgKiBUcmFuc21pdCwgYW5kIFJlY2VpdmUgKi8KKwkJaWYgKHJlcXVlc3RfaXJxKHByaXYtPmludGVycnVwdEVycm9yLCBnZmFyX2Vycm9yLAorCQkJCTAsICJlbmV0X2Vycm9yIiwgZGV2KSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBwcml2LT5pbnRlcnJ1cHRFcnJvcik7CisKKwkJCWVyciA9IC0xOworCQkJZ290byBlcnJfaXJxX2ZhaWw7CisJCX0KKworCQlpZiAocmVxdWVzdF9pcnEocHJpdi0+aW50ZXJydXB0VHJhbnNtaXQsIGdmYXJfdHJhbnNtaXQsCisJCQkJMCwgImVuZXRfdHgiLCBkZXYpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgZ2V0IElSUSAlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHByaXYtPmludGVycnVwdFRyYW5zbWl0KTsKKworCQkJZXJyID0gLTE7CisKKwkJCWdvdG8gdHhfaXJxX2ZhaWw7CisJCX0KKworCQlpZiAocmVxdWVzdF9pcnEocHJpdi0+aW50ZXJydXB0UmVjZWl2ZSwgZ2Zhcl9yZWNlaXZlLAorCQkJCTAsICJlbmV0X3J4IiwgZGV2KSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWQgKHJlY2VpdmUwKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHByaXYtPmludGVycnVwdFJlY2VpdmUpOworCisJCQllcnIgPSAtMTsKKwkJCWdvdG8gcnhfaXJxX2ZhaWw7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocmVxdWVzdF9pcnEocHJpdi0+aW50ZXJydXB0VHJhbnNtaXQsIGdmYXJfaW50ZXJydXB0LAorCQkJCTAsICJnZmFyX2ludGVycnVwdCIsIGRldikgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBnZXQgSVJRICVkXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgcHJpdi0+aW50ZXJydXB0RXJyb3IpOworCisJCQllcnIgPSAtMTsKKwkJCWdvdG8gZXJyX2lycV9mYWlsOworCQl9CisJfQorCisJLyogU2V0IHVwIHRoZSBQSFkgY2hhbmdlIHdvcmsgcXVldWUgKi8KKwlJTklUX1dPUksoJnByaXYtPnRxLCBnZmFyX3BoeV9jaGFuZ2UsIGRldik7CisKKwlpbml0X3RpbWVyKCZwcml2LT5waHlfaW5mb190aW1lcik7CisJcHJpdi0+cGh5X2luZm9fdGltZXIuZnVuY3Rpb24gPSAmZ2Zhcl9waHlfc3RhcnR1cF90aW1lcjsKKwlwcml2LT5waHlfaW5mb190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHByaXYtPm1paV9pbmZvOworCW1vZF90aW1lcigmcHJpdi0+cGh5X2luZm9fdGltZXIsIGppZmZpZXMgKyBIWik7CisKKwkvKiBDb25maWd1cmUgdGhlIGNvYWxlc2Npbmcgc3VwcG9ydCAqLworCWlmIChwcml2LT50eGNvYWxlc2NpbmcpCisJCWdmYXJfd3JpdGUoJnJlZ3MtPnR4aWMsCisJCQkgICBta19pY192YWx1ZShwcml2LT50eGNvdW50LCBwcml2LT50eHRpbWUpKTsKKwllbHNlCisJCWdmYXJfd3JpdGUoJnJlZ3MtPnR4aWMsIDApOworCisJaWYgKHByaXYtPnJ4Y29hbGVzY2luZykKKwkJZ2Zhcl93cml0ZSgmcmVncy0+cnhpYywKKwkJCSAgIG1rX2ljX3ZhbHVlKHByaXYtPnJ4Y291bnQsIHByaXYtPnJ4dGltZSkpOworCWVsc2UKKwkJZ2Zhcl93cml0ZSgmcmVncy0+cnhpYywgMCk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5yeGNsZWFudXBxKTsKKworCS8qIEVuYWJsZSBSeCBhbmQgVHggaW4gTUFDQ0ZHMSAqLworCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPm1hY2NmZzEpOworCXRlbXB2YWwgfD0gKE1BQ0NGRzFfUlhfRU4gfCBNQUNDRkcxX1RYX0VOKTsKKwlnZmFyX3dyaXRlKCZyZWdzLT5tYWNjZmcxLCB0ZW1wdmFsKTsKKworCS8qIEluaXRpYWxpemUgRE1BQ1RSTCB0byBoYXZlIFdXUiBhbmQgV09QICovCisJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+ZG1hY3RybCk7CisJdGVtcHZhbCB8PSBETUFDVFJMX0lOSVRfU0VUVElOR1M7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+ZG1hY3RybCwgdGVtcHZhbCk7CisKKwkvKiBDbGVhciBUSExULCBzbyB0aGF0IHRoZSBETUEgc3RhcnRzIHBvbGxpbmcgbm93ICovCisJZ2Zhcl93cml0ZSgmcmVncy0+dHN0YXQsIFRTVEFUX0NMRUFSX1RIQUxUKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmVuJ3Qgc3RvcHBlZCAqLworCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmRtYWN0cmwpOworCXRlbXB2YWwgJj0gfihETUFDVFJMX0dSUyB8IERNQUNUUkxfR1RTKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5kbWFjdHJsLCB0ZW1wdmFsKTsKKworCS8qIFVubWFzayB0aGUgaW50ZXJydXB0cyB3ZSBsb29rIGZvciAqLworCWdmYXJfd3JpdGUoJnJlZ3MtPmltYXNrLCBJTUFTS19ERUZBVUxUKTsKKworCXJldHVybiAwOworCityeF9pcnFfZmFpbDoKKwlmcmVlX2lycShwcml2LT5pbnRlcnJ1cHRUcmFuc21pdCwgZGV2KTsKK3R4X2lycV9mYWlsOgorCWZyZWVfaXJxKHByaXYtPmludGVycnVwdEVycm9yLCBkZXYpOworZXJyX2lycV9mYWlsOgorcnhfc2tiX2ZhaWw6CisJZnJlZV9za2JfcmVzb3VyY2VzKHByaXYpOwordHhfc2tiX2ZhaWw6CisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwKKwkJCXNpemVvZihzdHJ1Y3QgdHhiZDgpKnByaXYtPnR4X3Jpbmdfc2l6ZQorCQkJKyBzaXplb2Yoc3RydWN0IHJ4YmQ4KSpwcml2LT5yeF9yaW5nX3NpemUsCisJCQlwcml2LT50eF9iZF9iYXNlLAorCQkJZ2Zhcl9yZWFkKCZyZWdzLT50YmFzZSkpOworCisJaWYgKHByaXYtPm1paV9pbmZvLT5waHlpbmZvLT5jbG9zZSkKKwkJcHJpdi0+bWlpX2luZm8tPnBoeWluZm8tPmNsb3NlKHByaXYtPm1paV9pbmZvKTsKKworCWtmcmVlKHByaXYtPm1paV9pbmZvKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIENhbGxlZCB3aGVuIHNvbWV0aGluZyBuZWVkcyB0byB1c2UgdGhlIGV0aGVybmV0IGRldmljZSAqLworLyogUmV0dXJucyAwIGZvciBzdWNjZXNzLiAqLworc3RhdGljIGludCBnZmFyX2VuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBlcnI7CisKKwkvKiBJbml0aWFsaXplIGEgYnVuY2ggb2YgcmVnaXN0ZXJzICovCisJaW5pdF9yZWdpc3RlcnMoZGV2KTsKKworCWdmYXJfc2V0X21hY19hZGRyZXNzKGRldik7CisKKwllcnIgPSBpbml0X3BoeShkZXYpOworCisJaWYoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gc3RhcnR1cF9nZmFyKGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGtlcm5lbCB3aGVuIGEgZnJhbWUgaXMgcmVhZHkgZm9yIHRyYW5zbWlzc2lvbi4gKi8KKy8qIEl0IGlzIHBvaW50ZWQgdG8gYnkgdGhlIGRldi0+aGFyZF9zdGFydF94bWl0IGZ1bmN0aW9uIHBvaW50ZXIgKi8KK3N0YXRpYyBpbnQgZ2Zhcl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHR4YmQ4ICp0eGJkcDsKKworCS8qIFVwZGF0ZSB0cmFuc21pdCBzdGF0cyAqLworCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJLyogTG9jayBwcml2IG5vdyAqLworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOworCisJLyogUG9pbnQgYXQgdGhlIGZpcnN0IGZyZWUgdHggZGVzY3JpcHRvciAqLworCXR4YmRwID0gcHJpdi0+Y3VyX3R4OworCisJLyogQ2xlYXIgYWxsIGJ1dCB0aGUgV1JBUCBzdGF0dXMgZmxhZ3MgKi8KKwl0eGJkcC0+c3RhdHVzICY9IFRYQkRfV1JBUDsKKworCS8qIFNldCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyICovCisJdHhiZHAtPmxlbmd0aCA9IHNrYi0+bGVuOworCXR4YmRwLT5idWZQdHIgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBza2ItPmRhdGEsIAorCQkJc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCisJLyogU2F2ZSB0aGUgc2tiIHBvaW50ZXIgc28gd2UgY2FuIGZyZWUgaXQgbGF0ZXIgKi8KKwlwcml2LT50eF9za2J1ZmZbcHJpdi0+c2tiX2N1cnR4XSA9IHNrYjsKKworCS8qIFVwZGF0ZSB0aGUgY3VycmVudCBza2IgcG9pbnRlciAod3JhcHBpbmcgaWYgdGhpcyB3YXMgdGhlIGxhc3QpICovCisJcHJpdi0+c2tiX2N1cnR4ID0KKwkgICAgKHByaXYtPnNrYl9jdXJ0eCArIDEpICYgVFhfUklOR19NT0RfTUFTSyhwcml2LT50eF9yaW5nX3NpemUpOworCisJLyogRmxhZyB0aGUgQkQgYXMgaW50ZXJydXB0LWNhdXNpbmcgKi8KKwl0eGJkcC0+c3RhdHVzIHw9IFRYQkRfSU5URVJSVVBUOworCisJLyogRmxhZyB0aGUgQkQgYXMgcmVhZHkgdG8gZ28sIGxhc3QgaW4gZnJhbWUsIGFuZCAgKi8KKwkvKiBpbiBuZWVkIG9mIENSQyAqLworCXR4YmRwLT5zdGF0dXMgfD0gKFRYQkRfUkVBRFkgfCBUWEJEX0xBU1QgfCBUWEJEX0NSQyk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIElmIHRoaXMgd2FzIHRoZSBsYXN0IEJEIGluIHRoZSByaW5nLCB0aGUgbmV4dCBvbmUgKi8KKwkvKiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByaW5nICovCisJaWYgKHR4YmRwLT5zdGF0dXMgJiBUWEJEX1dSQVApCisJCXR4YmRwID0gcHJpdi0+dHhfYmRfYmFzZTsKKwllbHNlCisJCXR4YmRwKys7CisKKwkvKiBJZiB0aGUgbmV4dCBCRCBzdGlsbCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLCB0aGVuIHRoZSBiZHMKKwkgICBhcmUgZnVsbC4gIFdlIG5lZWQgdG8gdGVsbCB0aGUga2VybmVsIHRvIHN0b3Agc2VuZGluZyB1cyBzdHVmZi4gKi8KKwlpZiAodHhiZHAgPT0gcHJpdi0+ZGlydHlfdHgpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCXByaXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJfQorCisJLyogVXBkYXRlIHRoZSBjdXJyZW50IHR4YmQgdG8gdGhlIG5leHQgb25lICovCisJcHJpdi0+Y3VyX3R4ID0gdHhiZHA7CisKKwkvKiBUZWxsIHRoZSBETUEgdG8gZ28gZ28gZ28gKi8KKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT50c3RhdCwgVFNUQVRfQ0xFQVJfVEhBTFQpOworCisJLyogVW5sb2NrIHByaXYgKi8KKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFN0b3BzIHRoZSBrZXJuZWwgcXVldWUsIGFuZCBoYWx0cyB0aGUgY29udHJvbGxlciAqLworc3RhdGljIGludCBnZmFyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RvcF9nZmFyKGRldik7CisKKwkvKiBTaHV0ZG93biB0aGUgUEhZICovCisJaWYgKHByaXYtPm1paV9pbmZvLT5waHlpbmZvLT5jbG9zZSkKKwkJcHJpdi0+bWlpX2luZm8tPnBoeWluZm8tPmNsb3NlKHByaXYtPm1paV9pbmZvKTsKKworCWtmcmVlKHByaXYtPm1paV9pbmZvKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKiByZXR1cm5zIGEgbmV0X2RldmljZV9zdGF0cyBzdHJ1Y3R1cmUgcG9pbnRlciAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogZ2Zhcl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAmKHByaXYtPnN0YXRzKTsKK30KKworLyogQ2hhbmdlcyB0aGUgbWFjIGFkZHJlc3MgaWYgdGhlIGNvbnRyb2xsZXIgaXMgbm90IHJ1bm5pbmcuICovCitpbnQgZ2Zhcl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwljaGFyIHRtcGJ1ZltNQUNfQUREUl9MRU5dOworCXUzMiB0ZW1wdmFsOworCisJLyogTm93IGNvcHkgaXQgaW50byB0aGUgbWFjIHJlZ2lzdGVycyBiYWNrd2FyZHMsIGN1eiAqLworCS8qIGxpdHRsZSBlbmRpYW4gaXMgc2lsbHkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFDX0FERFJfTEVOOyBpKyspCisJCXRtcGJ1ZltNQUNfQUREUl9MRU4gLSAxIC0gaV0gPSBkZXYtPmRldl9hZGRyW2ldOworCisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+bWFjc3RuYWRkcjEsICooKHUzMiAqKSAodG1wYnVmKSkpOworCisJdGVtcHZhbCA9ICooKHUzMiAqKSAodG1wYnVmICsgNCkpOworCisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+bWFjc3RuYWRkcjIsIHRlbXB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBnZmFyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaW50IHRlbXBzaXplLCB0ZW1wdmFsOworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBvbGRzaXplID0gcHJpdi0+cnhfYnVmZmVyX3NpemU7CisJaW50IGZyYW1lX3NpemUgPSBuZXdfbXR1ICsgMTg7CisKKwlpZiAoKGZyYW1lX3NpemUgPCA2NCkgfHwgKGZyYW1lX3NpemUgPiBKVU1CT19GUkFNRV9TSVpFKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIE1UVSBzZXR0aW5nXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0ZW1wc2l6ZSA9CisJICAgIChmcmFtZV9zaXplICYgfihJTkNSRU1FTlRBTF9CVUZGRVJfU0laRSAtIDEpKSArCisJICAgIElOQ1JFTUVOVEFMX0JVRkZFUl9TSVpFOworCisJLyogT25seSBzdG9wIGFuZCBzdGFydCB0aGUgY29udHJvbGxlciBpZiBpdCBpc24ndCBhbHJlYWR5CisJICogc3RvcHBlZCAqLworCWlmICgob2xkc2l6ZSAhPSB0ZW1wc2l6ZSkgJiYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQlzdG9wX2dmYXIoZGV2KTsKKworCXByaXYtPnJ4X2J1ZmZlcl9zaXplID0gdGVtcHNpemU7CisKKwlkZXYtPm10dSA9IG5ld19tdHU7CisKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5tcmJsciwgcHJpdi0+cnhfYnVmZmVyX3NpemUpOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPm1heGZybSwgcHJpdi0+cnhfYnVmZmVyX3NpemUpOworCisJLyogSWYgdGhlIG10dSBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4IHNpemUgZm9yIHN0YW5kYXJkCisJICogZXRoZXJuZXQgZnJhbWVzIChpZSwgYSBqdW1ibyBmcmFtZSksIHRoZW4gc2V0IG1hY2NmZzIKKwkgKiB0byBhbGxvdyBodWdlIGZyYW1lcywgYW5kIHRvIGNoZWNrIHRoZSBsZW5ndGggKi8KKwl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5tYWNjZmcyKTsKKworCWlmIChwcml2LT5yeF9idWZmZXJfc2l6ZSA+IERFRkFVTFRfUlhfQlVGRkVSX1NJWkUpCisJCXRlbXB2YWwgfD0gKE1BQ0NGRzJfSFVHRUZSQU1FIHwgTUFDQ0ZHMl9MRU5HVEhDSEVDSyk7CisJZWxzZQorCQl0ZW1wdmFsICY9IH4oTUFDQ0ZHMl9IVUdFRlJBTUUgfCBNQUNDRkcyX0xFTkdUSENIRUNLKTsKKworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPm1hY2NmZzIsIHRlbXB2YWwpOworCisJaWYgKChvbGRzaXplICE9IHRlbXBzaXplKSAmJiAoZGV2LT5mbGFncyAmIElGRl9VUCkpCisJCXN0YXJ0dXBfZ2ZhcihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGdmYXJfdGltZW91dCBnZXRzIGNhbGxlZCB3aGVuIGEgcGFja2V0IGhhcyBub3QgYmVlbgorICogdHJhbnNtaXR0ZWQgYWZ0ZXIgYSBzZXQgYW1vdW50IG9mIHRpbWUuCisgKiBGb3Igbm93LCBhc3N1bWUgdGhhdCBjbGVhcmluZyBvdXQgYWxsIHRoZSBzdHJ1Y3R1cmVzLCBhbmQKKyAqIHN0YXJ0aW5nIG92ZXIgd2lsbCBmaXggdGhlIHByb2JsZW0uICovCitzdGF0aWMgdm9pZCBnZmFyX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKKwkJc3RvcF9nZmFyKGRldik7CisJCXN0YXJ0dXBfZ2ZhcihkZXYpOworCX0KKworCW5ldGlmX3NjaGVkdWxlKGRldik7Cit9CisKKy8qIEludGVycnVwdCBIYW5kbGVyIGZvciBUcmFuc21pdCBjb21wbGV0ZSAqLworc3RhdGljIGlycXJldHVybl90IGdmYXJfdHJhbnNtaXQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdHhiZDggKmJkcDsKKworCS8qIENsZWFyIElFVkVOVCAqLworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlldmVudCwgSUVWRU5UX1RYX01BU0spOworCisJLyogTG9jayBwcml2ICovCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwliZHAgPSBwcml2LT5kaXJ0eV90eDsKKwl3aGlsZSAoKGJkcC0+c3RhdHVzICYgVFhCRF9SRUFEWSkgPT0gMCkgeworCQkvKiBJZiBkaXJ0eV90eCBhbmQgY3VyX3R4IGFyZSB0aGUgc2FtZSwgdGhlbiBlaXRoZXIgdGhlICovCisJCS8qIHJpbmcgaXMgZW1wdHkgb3IgZnVsbCBub3cgKGl0IGNvdWxkIG9ubHkgYmUgZnVsbCBpbiB0aGUgYmVnaW5uaW5nLCAqLworCQkvKiBvYnZpb3VzbHkpLiAgSWYgaXQgaXMgZW1wdHksIHdlIGFyZSBkb25lLiAqLworCQlpZiAoKGJkcCA9PSBwcml2LT5jdXJfdHgpICYmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgPT0gMCkpCisJCQlicmVhazsKKworCQlwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7CisKKwkJLyogRGVmZXJyZWQgbWVhbnMgc29tZSBjb2xsaXNpb25zIG9jY3VycmVkIGR1cmluZyB0cmFuc21pdCwgKi8KKwkJLyogYnV0IHdlIGV2ZW50dWFsbHkgc2VudCB0aGUgcGFja2V0LiAqLworCQlpZiAoYmRwLT5zdGF0dXMgJiBUWEJEX0RFRikKKwkJCXByaXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKworCQkvKiBGcmVlIHRoZSBzayBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVHhCRCAqLworCQlkZXZfa2ZyZWVfc2tiX2lycShwcml2LT50eF9za2J1ZmZbcHJpdi0+c2tiX2RpcnR5dHhdKTsKKwkJcHJpdi0+dHhfc2tidWZmW3ByaXYtPnNrYl9kaXJ0eXR4XSA9IE5VTEw7CisJCXByaXYtPnNrYl9kaXJ0eXR4ID0KKwkJICAgIChwcml2LT5za2JfZGlydHl0eCArCisJCSAgICAgMSkgJiBUWF9SSU5HX01PRF9NQVNLKHByaXYtPnR4X3Jpbmdfc2l6ZSk7CisKKwkJLyogdXBkYXRlIGJkcCB0byBwb2ludCBhdCBuZXh0IGJkIGluIHRoZSByaW5nICh3cmFwcGluZyBpZiBuZWNlc3NhcnkpICovCisJCWlmIChiZHAtPnN0YXR1cyAmIFRYQkRfV1JBUCkKKwkJCWJkcCA9IHByaXYtPnR4X2JkX2Jhc2U7CisJCWVsc2UKKwkJCWJkcCsrOworCisJCS8qIE1vdmUgZGlydHlfdHggdG8gYmUgdGhlIG5leHQgYmQgKi8KKwkJcHJpdi0+ZGlydHlfdHggPSBiZHA7CisKKwkJLyogV2UgZnJlZWQgYSBidWZmZXIsIHNvIG5vdyB3ZSBjYW4gcmVzdGFydCB0cmFuc21pc3Npb24gKi8KKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9IC8qIHdoaWxlICgoYmRwLT5zdGF0dXMgJiBUWEJEX1JFQURZKSA9PSAwKSAqLworCisJLyogSWYgd2UgYXJlIGNvYWxlc2NpbmcgdGhlIGludGVycnVwdHMsIHJlc2V0IHRoZSB0aW1lciAqLworCS8qIE90aGVyd2lzZSwgY2xlYXIgaXQgKi8KKwlpZiAocHJpdi0+dHhjb2FsZXNjaW5nKQorCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT50eGljLAorCQkJICAgbWtfaWNfdmFsdWUocHJpdi0+dHhjb3VudCwgcHJpdi0+dHh0aW1lKSk7CisJZWxzZQorCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT50eGljLCAwKTsKKworCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RydWN0IHNrX2J1ZmYgKiBnZmFyX25ld19za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHJ4YmQ4ICpiZHApCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSBTS0JfQUxMT0NfVElNRU9VVDsKKworCS8qIFdlIGhhdmUgdG8gYWxsb2NhdGUgdGhlIHNrYiwgc28ga2VlcCB0cnlpbmcgdGlsbCB3ZSBzdWNjZWVkICovCisJd2hpbGUgKCghc2tiKSAmJiB0aW1lb3V0LS0pCisJCXNrYiA9IGRldl9hbGxvY19za2IocHJpdi0+cnhfYnVmZmVyX3NpemUgKyBSWEJVRl9BTElHTk1FTlQpOworCisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFdlIG5lZWQgdGhlIGRhdGEgYnVmZmVyIHRvIGJlIGFsaWduZWQgcHJvcGVybHkuICBXZSB3aWxsIHJlc2VydmUKKwkgKiBhcyBtYW55IGJ5dGVzIGFzIG5lZWRlZCB0byBhbGlnbiB0aGUgZGF0YSBwcm9wZXJseQorCSAqLworCXNrYl9yZXNlcnZlKHNrYiwKKwkJICAgIFJYQlVGX0FMSUdOTUVOVCAtCisJCSAgICAoKCh1bnNpZ25lZCkgc2tiLT5kYXRhKSAmIChSWEJVRl9BTElHTk1FTlQgLSAxKSkpOworCisJc2tiLT5kZXYgPSBkZXY7CisKKwliZHAtPmJ1ZlB0ciA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsIHNrYi0+ZGF0YSwKKwkJCXByaXYtPnJ4X2J1ZmZlcl9zaXplICsgUlhCVUZfQUxJR05NRU5ULCAKKwkJCURNQV9GUk9NX0RFVklDRSk7CisKKwliZHAtPmxlbmd0aCA9IDA7CisKKwkvKiBNYXJrIHRoZSBidWZmZXIgZW1wdHkgKi8KKwliZHAtPnN0YXR1cyB8PSAoUlhCRF9FTVBUWSB8IFJYQkRfSU5URVJSVVBUKTsKKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3VudF9lcnJvcnModW5zaWduZWQgc2hvcnQgc3RhdHVzLCBzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKKwlzdHJ1Y3QgZ2Zhcl9leHRyYV9zdGF0cyAqZXN0YXRzID0gJnByaXYtPmV4dHJhX3N0YXRzOworCisJLyogSWYgdGhlIHBhY2tldCB3YXMgdHJ1bmNhdGVkLCBub25lIG9mIHRoZSBvdGhlciBlcnJvcnMKKwkgKiBtYXR0ZXIgKi8KKwlpZiAoc3RhdHVzICYgUlhCRF9UUlVOQ0FURUQpIHsKKwkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKworCQllc3RhdHMtPnJ4X3RydW5jKys7CisKKwkJcmV0dXJuOworCX0KKwkvKiBDb3VudCB0aGUgZXJyb3JzLCBpZiB0aGVyZSB3ZXJlIGFueSAqLworCWlmIChzdGF0dXMgJiAoUlhCRF9MQVJHRSB8IFJYQkRfU0hPUlQpKSB7CisJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisKKwkJaWYgKHN0YXR1cyAmIFJYQkRfTEFSR0UpCisJCQllc3RhdHMtPnJ4X2xhcmdlKys7CisJCWVsc2UKKwkJCWVzdGF0cy0+cnhfc2hvcnQrKzsKKwl9CisJaWYgKHN0YXR1cyAmIFJYQkRfTk9OT0NURVQpIHsKKwkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycysrOworCQllc3RhdHMtPnJ4X25vbm9jdGV0Kys7CisJfQorCWlmIChzdGF0dXMgJiBSWEJEX0NSQ0VSUikgeworCQllc3RhdHMtPnJ4X2NyY2VycisrOworCQlzdGF0cy0+cnhfY3JjX2Vycm9ycysrOworCX0KKwlpZiAoc3RhdHVzICYgUlhCRF9PVkVSUlVOKSB7CisJCWVzdGF0cy0+cnhfb3ZlcnJ1bisrOworCQlzdGF0cy0+cnhfY3JjX2Vycm9ycysrOworCX0KK30KKworaXJxcmV0dXJuX3QgZ2Zhcl9yZWNlaXZlKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBDT05GSUdfR0ZBUl9OQVBJCisJdTMyIHRlbXB2YWw7CisjZW5kaWYKKworCS8qIENsZWFyIElFVkVOVCwgc28gcnggaW50ZXJydXB0IGlzbid0IGNhbGxlZCBhZ2FpbgorCSAqIGJlY2F1c2Ugb2YgdGhpcyBpbnRlcnJ1cHQgKi8KKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pZXZlbnQsIElFVkVOVF9SWF9NQVNLKTsKKworCS8qIHN1cHBvcnQgTkFQSSAqLworI2lmZGVmIENPTkZJR19HRkFSX05BUEkKKwlpZiAobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChkZXYpKSB7CisJCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmltYXNrKTsKKwkJdGVtcHZhbCAmPSBJTUFTS19SWF9ESVNBQkxFRDsKKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aW1hc2ssIHRlbXB2YWwpOworCisJCV9fbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKKwl9IGVsc2UgeworI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZWNlaXZlIGNhbGxlZCB0d2ljZSAoJXgpWyV4XVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5pZXZlbnQpLAorCQkgICAgICAgZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5pbWFzaykpOworI2VuZGlmCisJfQorI2Vsc2UKKworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJZ2Zhcl9jbGVhbl9yeF9yaW5nKGRldiwgcHJpdi0+cnhfcmluZ19zaXplKTsKKworCS8qIElmIHdlIGFyZSBjb2FsZXNjaW5nIGludGVycnVwdHMsIHVwZGF0ZSB0aGUgdGltZXIgKi8KKwkvKiBPdGhlcndpc2UsIGNsZWFyIGl0ICovCisJaWYgKHByaXYtPnJ4Y29hbGVzY2luZykKKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cnhpYywKKwkJCSAgIG1rX2ljX3ZhbHVlKHByaXYtPnJ4Y291bnQsIHByaXYtPnJ4dGltZSkpOworCWVsc2UKKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cnhpYywgMCk7CisKKwkvKiBKdXN0IGluIGNhc2Ugd2UgbmVlZCB0byB3YWtlIHRoZSByaW5nIHBhcmFtIGNoYW5nZXIgKi8KKwlwcml2LT5yeGNsZWFuID0gMTsKKworCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKyNlbmRpZgorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qIGdmYXJfcHJvY2Vzc19mcmFtZSgpIC0tIGhhbmRsZSBvbmUgaW5jb21pbmcgcGFja2V0IGlmIHNrYgorICogaXNuJ3QgTlVMTC4gICovCitzdGF0aWMgaW50IGdmYXJfcHJvY2Vzc19mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQlpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHNrYiA9PSBOVUxMKSB7CisjaWZkZWYgQlJJRUZfR0ZBUl9FUlJPUlMKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1pc3Npbmcgc2tiISEuXG4iLAorCQkJCWRldi0+bmFtZSk7CisjZW5kaWYKKwkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlwcml2LT5leHRyYV9zdGF0cy5yeF9za2JtaXNzaW5nKys7CisJfSBlbHNlIHsKKwkJLyogUHJlcCB0aGUgc2tiIGZvciB0aGUgcGFja2V0ICovCisJCXNrYl9wdXQoc2tiLCBsZW5ndGgpOworCisJCS8qIFRlbGwgdGhlIHNrYiB3aGF0IGtpbmQgb2YgcGFja2V0IHRoaXMgaXMgKi8KKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCQkvKiBTZW5kIHRoZSBwYWNrZXQgdXAgdGhlIHN0YWNrICovCisJCWlmIChSRUNFSVZFKHNrYikgPT0gTkVUX1JYX0RST1ApIHsKKwkJCXByaXYtPmV4dHJhX3N0YXRzLmtlcm5lbF9kcm9wcGVkKys7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogZ2Zhcl9jbGVhbl9yeF9yaW5nKCkgLS0gUHJvY2Vzc2VzIGVhY2ggZnJhbWUgaW4gdGhlIHJ4IHJpbmcKKyAqICAgdW50aWwgdGhlIGJ1ZGdldC9xdW90YSBoYXMgYmVlbiByZWFjaGVkLiBSZXR1cm5zIHRoZSBudW1iZXIgCisgKiAgIG9mIGZyYW1lcyBoYW5kbGVkCisgKi8KK3N0YXRpYyBpbnQgZ2Zhcl9jbGVhbl9yeF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByeF93b3JrX2xpbWl0KQoreworCXN0cnVjdCByeGJkOCAqYmRwOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTE2IHBrdF9sZW47CisJaW50IGhvd21hbnkgPSAwOworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogR2V0IHRoZSBmaXJzdCBmdWxsIGRlc2NyaXB0b3IgKi8KKwliZHAgPSBwcml2LT5jdXJfcng7CisKKwl3aGlsZSAoISgoYmRwLT5zdGF0dXMgJiBSWEJEX0VNUFRZKSB8fCAoLS1yeF93b3JrX2xpbWl0IDwgMCkpKSB7CisJCXNrYiA9IHByaXYtPnJ4X3NrYnVmZltwcml2LT5za2JfY3VycnhdOworCisJCWlmICghKGJkcC0+c3RhdHVzICYKKwkJICAgICAgKFJYQkRfTEFSR0UgfCBSWEJEX1NIT1JUIHwgUlhCRF9OT05PQ1RFVAorCQkgICAgICAgfCBSWEJEX0NSQ0VSUiB8IFJYQkRfT1ZFUlJVTiB8IFJYQkRfVFJVTkNBVEVEKSkpIHsKKwkJCS8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHBhY2tldHMgKi8KKwkJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWhvd21hbnkrKzsKKworCQkJLyogUmVtb3ZlIHRoZSBGQ1MgZnJvbSB0aGUgcGFja2V0IGxlbmd0aCAqLworCQkJcGt0X2xlbiA9IGJkcC0+bGVuZ3RoIC0gNDsKKworCQkJZ2Zhcl9wcm9jZXNzX2ZyYW1lKGRldiwgc2tiLCBwa3RfbGVuKTsKKworCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfSBlbHNlIHsKKwkJCWNvdW50X2Vycm9ycyhiZHAtPnN0YXR1cywgcHJpdik7CisKKwkJCWlmIChza2IpCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCQkJcHJpdi0+cnhfc2tidWZmW3ByaXYtPnNrYl9jdXJyeF0gPSBOVUxMOworCQl9CisKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCQkvKiBDbGVhciB0aGUgc3RhdHVzIGZsYWdzIGZvciB0aGlzIGJ1ZmZlciAqLworCQliZHAtPnN0YXR1cyAmPSB+UlhCRF9TVEFUUzsKKworCQkvKiBBZGQgYW5vdGhlciBza2IgZm9yIHRoZSBmdXR1cmUgKi8KKwkJc2tiID0gZ2Zhcl9uZXdfc2tiKGRldiwgYmRwKTsKKwkJcHJpdi0+cnhfc2tidWZmW3ByaXYtPnNrYl9jdXJyeF0gPSBza2I7CisKKwkJLyogVXBkYXRlIHRvIHRoZSBuZXh0IHBvaW50ZXIgKi8KKwkJaWYgKGJkcC0+c3RhdHVzICYgUlhCRF9XUkFQKQorCQkJYmRwID0gcHJpdi0+cnhfYmRfYmFzZTsKKwkJZWxzZQorCQkJYmRwKys7CisKKwkJLyogdXBkYXRlIHRvIHBvaW50IGF0IHRoZSBuZXh0IHNrYiAqLworCQlwcml2LT5za2JfY3VycnggPQorCQkgICAgKHByaXYtPnNrYl9jdXJyeCArCisJCSAgICAgMSkgJiBSWF9SSU5HX01PRF9NQVNLKHByaXYtPnJ4X3Jpbmdfc2l6ZSk7CisKKwl9CisKKwkvKiBVcGRhdGUgdGhlIGN1cnJlbnQgcnhiZCBwb2ludGVyIHRvIGJlIHRoZSBuZXh0IG9uZSAqLworCXByaXYtPmN1cl9yeCA9IGJkcDsKKworCS8qIElmIG5vIHBhY2tldHMgaGF2ZSBhcnJpdmVkIHNpbmNlIHRoZQorCSAqIGxhc3Qgb25lIHdlIHByb2Nlc3NlZCwgY2xlYXIgdGhlIElFVkVOVCBSWCBhbmQKKwkgKiBCU1kgYml0cyBzbyB0aGF0IGFub3RoZXIgaW50ZXJydXB0IHdvbid0IGJlCisJICogZ2VuZXJhdGVkIHdoZW4gd2Ugc2V0IElNQVNLICovCisJaWYgKGJkcC0+c3RhdHVzICYgUlhCRF9FTVBUWSkKKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWV2ZW50LCBJRVZFTlRfUlhfTUFTSyk7CisKKwlyZXR1cm4gaG93bWFueTsKK30KKworI2lmZGVmIENPTkZJR19HRkFSX05BUEkKK3N0YXRpYyBpbnQgZ2Zhcl9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCWludCBob3dtYW55OworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByeF93b3JrX2xpbWl0ID0gKmJ1ZGdldDsKKworCWlmIChyeF93b3JrX2xpbWl0ID4gZGV2LT5xdW90YSkKKwkJcnhfd29ya19saW1pdCA9IGRldi0+cXVvdGE7CisKKwlob3dtYW55ID0gZ2Zhcl9jbGVhbl9yeF9yaW5nKGRldiwgcnhfd29ya19saW1pdCk7CisKKwlkZXYtPnF1b3RhIC09IGhvd21hbnk7CisJcnhfd29ya19saW1pdCAtPSBob3dtYW55OworCSpidWRnZXQgLT0gaG93bWFueTsKKworCWlmIChyeF93b3JrX2xpbWl0ID49IDApIHsKKwkJbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKKworCQkvKiBDbGVhciB0aGUgaGFsdCBiaXQgaW4gUlNUQVQgKi8KKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cnN0YXQsIFJTVEFUX0NMRUFSX1JIQUxUKTsKKworCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pbWFzaywgSU1BU0tfREVGQVVMVCk7CisKKwkJLyogSWYgd2UgYXJlIGNvYWxlc2NpbmcgaW50ZXJydXB0cywgdXBkYXRlIHRoZSB0aW1lciAqLworCQkvKiBPdGhlcndpc2UsIGNsZWFyIGl0ICovCisJCWlmIChwcml2LT5yeGNvYWxlc2NpbmcpCisJCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5yeGljLAorCQkJCSAgIG1rX2ljX3ZhbHVlKHByaXYtPnJ4Y291bnQsIHByaXYtPnJ4dGltZSkpOworCQllbHNlCisJCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5yeGljLCAwKTsKKworCQkvKiBTaWduYWwgdG8gdGhlIHJpbmcgc2l6ZSBjaGFuZ2VyIHRoYXQgaXQncyBzYWZlIHRvIGdvICovCisJCXByaXYtPnJ4Y2xlYW4gPSAxOworCX0KKworCXJldHVybiAocnhfd29ya19saW1pdCA8IDApID8gMSA6IDA7Cit9CisjZW5kaWYKKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGZvciBkZXZpY2VzIHdpdGggb25lIGludGVycnVwdCAqLworc3RhdGljIGlycXJldHVybl90IGdmYXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIFNhdmUgaWV2ZW50IGZvciBmdXR1cmUgcmVmZXJlbmNlICovCisJdTMyIGV2ZW50cyA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+aWV2ZW50KTsKKworCS8qIENsZWFyIElFVkVOVCAqLworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlldmVudCwgZXZlbnRzKTsKKworCS8qIENoZWNrIGZvciByZWNlcHRpb24gKi8KKwlpZiAoKGV2ZW50cyAmIElFVkVOVF9SWEYwKSB8fCAoZXZlbnRzICYgSUVWRU5UX1JYQjApKQorCQlnZmFyX3JlY2VpdmUoaXJxLCBkZXZfaWQsIHJlZ3MpOworCisJLyogQ2hlY2sgZm9yIHRyYW5zbWl0IGNvbXBsZXRpb24gKi8KKwlpZiAoKGV2ZW50cyAmIElFVkVOVF9UWEYpIHx8IChldmVudHMgJiBJRVZFTlRfVFhCKSkKKwkJZ2Zhcl90cmFuc21pdChpcnEsIGRldl9pZCwgcmVncyk7CisKKwkvKiBVcGRhdGUgZXJyb3Igc3RhdGlzdGljcyAqLworCWlmIChldmVudHMgJiBJRVZFTlRfVFhFKSB7CisJCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCisJCWlmIChldmVudHMgJiBJRVZFTlRfTEMpCisJCQlwcml2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCWlmIChldmVudHMgJiBJRVZFTlRfQ1JMKQorCQkJcHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJaWYgKGV2ZW50cyAmIElFVkVOVF9YRlVOKSB7CisjaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHR4IHVuZGVycnVuLiBkcm9wcGVkIHBhY2tldFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQlwcml2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJCQlwcml2LT5leHRyYV9zdGF0cy50eF91bmRlcnJ1bisrOworCisJCQkvKiBSZWFjdGl2YXRlIHRoZSBUeCBRdWV1ZXMgKi8KKwkJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnRzdGF0LCBUU1RBVF9DTEVBUl9USEFMVCk7CisJCX0KKwl9CisJaWYgKGV2ZW50cyAmIElFVkVOVF9CU1kpIHsKKwkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCXByaXYtPmV4dHJhX3N0YXRzLnJ4X2JzeSsrOworCisJCWdmYXJfcmVjZWl2ZShpcnEsIGRldl9pZCwgcmVncyk7CisKKyNpZm5kZWYgQ09ORklHX0dGQVJfTkFQSQorCQkvKiBDbGVhciB0aGUgaGFsdCBiaXQgaW4gUlNUQVQgKi8KKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cnN0YXQsIFJTVEFUX0NMRUFSX1JIQUxUKTsKKyNlbmRpZgorCisjaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJ1c3kgZXJyb3IgKHJoYWx0OiAleClcbiIsIGRldi0+bmFtZSwKKwkJICAgICAgIGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+cnN0YXQpKTsKKyNlbmRpZgorCX0KKwlpZiAoZXZlbnRzICYgSUVWRU5UX0JBQlIpIHsKKwkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCXByaXYtPmV4dHJhX3N0YXRzLnJ4X2JhYnIrKzsKKworI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBiYWJibGluZyBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCX0KKwlpZiAoZXZlbnRzICYgSUVWRU5UX0VCRVJSKSB7CisJCXByaXYtPmV4dHJhX3N0YXRzLmViZXJyKys7CisjaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEVCRVJSXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJfQorCWlmIChldmVudHMgJiBJRVZFTlRfUlhDKSB7CisjaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNvbnRyb2wgZnJhbWVcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwl9CisKKwlpZiAoZXZlbnRzICYgSUVWRU5UX0JBQlQpIHsKKwkJcHJpdi0+ZXh0cmFfc3RhdHMudHhfYmFidCsrOworI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBiYWJ0IGVycm9yXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcGh5X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogQ2xlYXIgdGhlIGludGVycnVwdCAqLworCW1paV9jbGVhcl9waHlfaW50ZXJydXB0KHByaXYtPm1paV9pbmZvKTsKKworCS8qIERpc2FibGUgUEhZIGludGVycnVwdHMgKi8KKwltaWlfY29uZmlndXJlX3BoeV9pbnRlcnJ1cHQocHJpdi0+bWlpX2luZm8sCisJCQlNSUlfSU5URVJSVVBUX0RJU0FCTEVEKTsKKworCS8qIFNjaGVkdWxlIHRoZSBwaHkgY2hhbmdlICovCisJc2NoZWR1bGVfd29yaygmcHJpdi0+dHEpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBTY2hlZHVsZWQgYnkgdGhlIHBoeV9pbnRlcnJ1cHQvdGltZXIgdG8gaGFuZGxlIFBIWSBjaGFuZ2VzICovCitzdGF0aWMgdm9pZCBnZmFyX3BoeV9jaGFuZ2Uodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJlc3VsdCA9IDA7CisKKwkvKiBEZWxheSB0byBnaXZlIHRoZSBQSFkgYSBjaGFuY2UgdG8gY2hhbmdlIHRoZQorCSAqIHJlZ2lzdGVyIHN0YXRlICovCisJbXNsZWVwKDEpOworCisJLyogVXBkYXRlIHRoZSBsaW5rLCBzcGVlZCwgZHVwbGV4ICovCisJcmVzdWx0ID0gcHJpdi0+bWlpX2luZm8tPnBoeWluZm8tPnJlYWRfc3RhdHVzKHByaXYtPm1paV9pbmZvKTsKKworCS8qIEFkanVzdCB0aGUga25vd24gc3RhdHVzIGFzIGxvbmcgYXMgdGhlIGxpbmsKKwkgKiBpc24ndCBzdGlsbCBjb21pbmcgdXAgKi8KKwlpZigoMCA9PSByZXN1bHQpIHx8IChwcml2LT5taWlfaW5mby0+bGluayA9PSAwKSkKKwkJYWRqdXN0X2xpbmsoZGV2KTsKKworCS8qIFJlZW5hYmxlIGludGVycnVwdHMsIGlmIG5lZWRlZCAqLworCWlmIChwcml2LT5laW5mby0+Ym9hcmRfZmxhZ3MgJiBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSKQorCQltaWlfY29uZmlndXJlX3BoeV9pbnRlcnJ1cHQocHJpdi0+bWlpX2luZm8sCisJCQkJTUlJX0lOVEVSUlVQVF9FTkFCTEVEKTsKK30KKworLyogQ2FsbGVkIGV2ZXJ5IHNvIG9mdGVuIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBpbnRlcnJ1cHQKKyAqIHRoZSBjb3JlIGZvciBQSFkgY2hhbmdlcyAqLworc3RhdGljIHZvaWQgZ2Zhcl9waHlfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNjaGVkdWxlX3dvcmsoJnByaXYtPnRxKTsKKworCW1vZF90aW1lcigmcHJpdi0+cGh5X2luZm9fdGltZXIsIGppZmZpZXMgKworCQkJR0ZBUl9QSFlfQ0hBTkdFX1RJTUUgKiBIWik7Cit9CisKKy8qIEtlZXAgdHJ5aW5nIGFuZWcgZm9yIHNvbWUgdGltZQorICogSWYsIGFmdGVyIEdGQVJfQU5fVElNRU9VVCBzZWNvbmRzLCBpdCBoYXMgbm90CisgKiBmaW5pc2hlZCwgd2Ugc3dpdGNoIHRvIGZvcmNlZC4KKyAqIEVpdGhlciB3YXksIG9uY2UgdGhlIHByb2Nlc3MgaGFzIGNvbXBsZXRlZCwgd2UgZWl0aGVyCisgKiByZXF1ZXN0IHRoZSBpbnRlcnJ1cHQsIG9yIHN3aXRjaCB0aGUgdGltZXIgb3ZlciB0byAKKyAqIHVzaW5nIGdmYXJfcGh5X3RpbWVyIHRvIGNoZWNrIHN0YXR1cyAqLworc3RhdGljIHZvaWQgZ2Zhcl9waHlfc3RhcnR1cF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJaW50IHJlc3VsdDsKKwlzdGF0aWMgaW50IHNlY29uZGFyeSA9IEdGQVJfQU5fVElNRU9VVDsKKwlzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8gPSAoc3RydWN0IGdmYXJfbWlpX2luZm8gKilkYXRhOworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihtaWlfaW5mby0+ZGV2KTsKKworCS8qIENvbmZpZ3VyZSB0aGUgQXV0by1uZWdvdGlhdGlvbiAqLworCXJlc3VsdCA9IG1paV9pbmZvLT5waHlpbmZvLT5jb25maWdfYW5lZyhtaWlfaW5mbyk7CisKKwkvKiBJZiBhdXRvbmVnb3RpYXRpb24gZmFpbGVkIHRvIHN0YXJ0LCBhbmQKKwkgKiB3ZSBoYXZlbid0IHRpbWVkIG91dCwgcmVzZXQgdGhlIHRpbWVyLCBhbmQgcmV0dXJuICovCisJaWYgKHJlc3VsdCAmJiBzZWNvbmRhcnktLSkgeworCQltb2RfdGltZXIoJnByaXYtPnBoeV9pbmZvX3RpbWVyLCBqaWZmaWVzICsgSFopOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChyZXN1bHQpIHsKKwkJLyogQ291bGRuJ3Qgc3RhcnQgYXV0b25lZ290aWF0aW9uLgorCQkgKiBUcnkgc3dpdGNoaW5nIHRvIGZvcmNlZCAqLworCQltaWlfaW5mby0+YXV0b25lZyA9IDA7CisJCXJlc3VsdCA9IG1paV9pbmZvLT5waHlpbmZvLT5jb25maWdfYW5lZyhtaWlfaW5mbyk7CisKKwkJLyogRm9yY2luZyBmYWlsZWQhICBHaXZlIHVwICovCisJCWlmKHJlc3VsdCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRm9yY2luZyBmYWlsZWQhXG4iLAorCQkJCQltaWlfaW5mby0+ZGV2LT5uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIEtpbGwgdGhlIHRpbWVyIHNvIGl0IGNhbiBiZSByZXN0YXJ0ZWQgKi8KKwlkZWxfdGltZXJfc3luYygmcHJpdi0+cGh5X2luZm9fdGltZXIpOworCisJLyogR3JhYiB0aGUgUEhZIGludGVycnVwdCwgaWYgbmVjZXNzYXJ5L3Bvc3NpYmxlICovCisJaWYgKHByaXYtPmVpbmZvLT5ib2FyZF9mbGFncyAmIEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFIpIHsKKwkJaWYgKHJlcXVlc3RfaXJxKHByaXYtPmVpbmZvLT5pbnRlcnJ1cHRQSFksIAorCQkJCQlwaHlfaW50ZXJydXB0LAorCQkJCQlTQV9TSElSUSwgCisJCQkJCSJwaHlfaW50ZXJydXB0IiwgCisJCQkJCW1paV9pbmZvLT5kZXYpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgZ2V0IElSUSAlZCAoUEhZKVxuIiwKKwkJCQkJbWlpX2luZm8tPmRldi0+bmFtZSwKKwkJCQkJcHJpdi0+ZWluZm8tPmludGVycnVwdFBIWSk7CisJCX0gZWxzZSB7CisJCQltaWlfY29uZmlndXJlX3BoeV9pbnRlcnJ1cHQocHJpdi0+bWlpX2luZm8sIAorCQkJCQlNSUlfSU5URVJSVVBUX0VOQUJMRUQpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogU3RhcnQgdGhlIHRpbWVyIGFnYWluLCB0aGlzIHRpbWUgaW4gb3JkZXIgdG8KKwkgKiBoYW5kbGUgYSBjaGFuZ2UgaW4gc3RhdHVzICovCisJaW5pdF90aW1lcigmcHJpdi0+cGh5X2luZm9fdGltZXIpOworCXByaXYtPnBoeV9pbmZvX3RpbWVyLmZ1bmN0aW9uID0gJmdmYXJfcGh5X3RpbWVyOworCXByaXYtPnBoeV9pbmZvX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgbWlpX2luZm8tPmRldjsKKwltb2RfdGltZXIoJnByaXYtPnBoeV9pbmZvX3RpbWVyLCBqaWZmaWVzICsKKwkJCUdGQVJfUEhZX0NIQU5HRV9USU1FICogSFopOworfQorCisvKiBDYWxsZWQgZXZlcnkgdGltZSB0aGUgY29udHJvbGxlciBtaWdodCBuZWVkIHRvIGJlIG1hZGUKKyAqIGF3YXJlIG9mIG5ldyBsaW5rIHN0YXRlLiAgVGhlIFBIWSBjb2RlIGNvbnZleXMgdGhpcworICogaW5mb3JtYXRpb24gdGhyb3VnaCB2YXJpYWJsZXMgaW4gdGhlIHByaXYgc3RydWN0dXJlLCBhbmQgdGhpcworICogZnVuY3Rpb24gY29udmVydHMgdGhvc2UgdmFyaWFibGVzIGludG8gdGhlIGFwcHJvcHJpYXRlCisgKiByZWdpc3RlciB2YWx1ZXMsIGFuZCBjYW4gYnJpbmcgZG93biB0aGUgZGV2aWNlIGlmIG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQgYWRqdXN0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZ2ZhciAqcmVncyA9IHByaXYtPnJlZ3M7CisJdTMyIHRlbXB2YWw7CisJc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvID0gcHJpdi0+bWlpX2luZm87CisKKwlpZiAobWlpX2luZm8tPmxpbmspIHsKKwkJLyogTm93IHdlIG1ha2Ugc3VyZSB0aGF0IHdlIGNhbiBiZSBpbiBmdWxsIGR1cGxleCBtb2RlLgorCQkgKiBJZiBub3QsIHdlIG9wZXJhdGUgaW4gaGFsZi1kdXBsZXggbW9kZS4gKi8KKwkJaWYgKG1paV9pbmZvLT5kdXBsZXggIT0gcHJpdi0+b2xkZHVwbGV4KSB7CisJCQlpZiAoIShtaWlfaW5mby0+ZHVwbGV4KSkgeworCQkJCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPm1hY2NmZzIpOworCQkJCXRlbXB2YWwgJj0gfihNQUNDRkcyX0ZVTExfRFVQTEVYKTsKKwkJCQlnZmFyX3dyaXRlKCZyZWdzLT5tYWNjZmcyLCB0ZW1wdmFsKTsKKworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBIYWxmIER1cGxleFxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcmVncy0+bWFjY2ZnMik7CisJCQkJdGVtcHZhbCB8PSBNQUNDRkcyX0ZVTExfRFVQTEVYOworCQkJCWdmYXJfd3JpdGUoJnJlZ3MtPm1hY2NmZzIsIHRlbXB2YWwpOworCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZ1bGwgRHVwbGV4XG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJfQorCisJCQlwcml2LT5vbGRkdXBsZXggPSBtaWlfaW5mby0+ZHVwbGV4OworCQl9CisKKwkJaWYgKG1paV9pbmZvLT5zcGVlZCAhPSBwcml2LT5vbGRzcGVlZCkgeworCQkJc3dpdGNoIChtaWlfaW5mby0+c3BlZWQpIHsKKwkJCWNhc2UgMTAwMDoKKwkJCQl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZyZWdzLT5tYWNjZmcyKTsKKwkJCQl0ZW1wdmFsID0KKwkJCQkgICAgKCh0ZW1wdmFsICYgfihNQUNDRkcyX0lGKSkgfCBNQUNDRkcyX0dNSUkpOworCQkJCWdmYXJfd3JpdGUoJnJlZ3MtPm1hY2NmZzIsIHRlbXB2YWwpOworCQkJCWJyZWFrOworCQkJY2FzZSAxMDA6CisJCQljYXNlIDEwOgorCQkJCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPm1hY2NmZzIpOworCQkJCXRlbXB2YWwgPQorCQkJCSAgICAoKHRlbXB2YWwgJiB+KE1BQ0NGRzJfSUYpKSB8IE1BQ0NGRzJfTUlJKTsKKwkJCQlnZmFyX3dyaXRlKCZyZWdzLT5tYWNjZmcyLCB0ZW1wdmFsKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiJXM6IEFjayEgIFNwZWVkICglZCkgaXMgbm90IDEwLzEwMC8xMDAwIVxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBtaWlfaW5mby0+c3BlZWQpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU3BlZWQgJWRCVFxuIiwgZGV2LT5uYW1lLAorCQkJICAgICAgIG1paV9pbmZvLT5zcGVlZCk7CisKKwkJCXByaXYtPm9sZHNwZWVkID0gbWlpX2luZm8tPnNwZWVkOworCQl9CisKKwkJaWYgKCFwcml2LT5vbGRsaW5rKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBpcyB1cFxuIiwgZGV2LT5uYW1lKTsKKwkJCXByaXYtPm9sZGxpbmsgPSAxOworCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJbmV0aWZfc2NoZWR1bGUoZGV2KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwcml2LT5vbGRsaW5rKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBpcyBkb3duXG4iLCBkZXYtPm5hbWUpOworCQkJcHJpdi0+b2xkbGluayA9IDA7CisJCQlwcml2LT5vbGRzcGVlZCA9IDA7CisJCQlwcml2LT5vbGRkdXBsZXggPSAtMTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCX0KKwl9Cit9CisKKworLyogVXBkYXRlIHRoZSBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGxpc3Qgb2YgbXVsdGljYXN0CisgKiBhZGRyZXNzZXMgd2Ugc3Vic2NyaWJlIHRvLiAgQWxzbywgY2hhbmdlIHRoZSBwcm9taXNjdWl0eSBvZgorICogdGhlIGRldmljZSBiYXNlZCBvbiB0aGUgZmxhZ3MgKHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgKiB3aGVuZXZlciBkZXYtPmZsYWdzIGlzIGNoYW5nZWQgKi8KK3N0YXRpYyB2b2lkIGdmYXJfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9tY19saXN0ICptY19wdHI7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGdmYXIgKnJlZ3MgPSBwcml2LT5yZWdzOworCXUzMiB0ZW1wdmFsOworCisJaWYoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbnRlcmluZyBwcm9taXNjdW91cyBtb2RlLlxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkvKiBTZXQgUkNUUkwgdG8gUFJPTSAqLworCQl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZyZWdzLT5yY3RybCk7CisJCXRlbXB2YWwgfD0gUkNUUkxfUFJPTTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+cmN0cmwsIHRlbXB2YWwpOworCX0gZWxzZSB7CisJCS8qIFNldCBSQ1RSTCB0byBub3QgUFJPTSAqLworCQl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZyZWdzLT5yY3RybCk7CisJCXRlbXB2YWwgJj0gfihSQ1RSTF9QUk9NKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+cmN0cmwsIHRlbXB2YWwpOworCX0KKwkKKwlpZihkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCS8qIFNldCB0aGUgaGFzaCB0byByeCBhbGwgbXVsdGljYXN0IGZyYW1lcyAqLworCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjAsIDB4ZmZmZmZmZmYpOworCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjEsIDB4ZmZmZmZmZmYpOworCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjIsIDB4ZmZmZmZmZmYpOworCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjMsIDB4ZmZmZmZmZmYpOworCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjQsIDB4ZmZmZmZmZmYpOworCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjUsIDB4ZmZmZmZmZmYpOworCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjYsIDB4ZmZmZmZmZmYpOworCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjcsIDB4ZmZmZmZmZmYpOworCX0gZWxzZSB7CisJCS8qIHplcm8gb3V0IHRoZSBoYXNoICovCisJCWdmYXJfd3JpdGUoJnJlZ3MtPmdhZGRyMCwgMHgwKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHIxLCAweDApOworCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjIsIDB4MCk7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmdhZGRyMywgMHgwKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHI0LCAweDApOworCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjUsIDB4MCk7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmdhZGRyNiwgMHgwKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHI3LCAweDApOworCisJCWlmKGRldi0+bWNfY291bnQgPT0gMCkKKwkJCXJldHVybjsKKworCQkvKiBQYXJzZSB0aGUgbGlzdCwgYW5kIHNldCB0aGUgYXBwcm9wcmlhdGUgYml0cyAqLworCQlmb3IobWNfcHRyID0gZGV2LT5tY19saXN0OyBtY19wdHI7IG1jX3B0ciA9IG1jX3B0ci0+bmV4dCkgeworCQkJZ2Zhcl9zZXRfaGFzaF9mb3JfYWRkcihkZXYsIG1jX3B0ci0+ZG1pX2FkZHIpOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKiBTZXQgdGhlIGFwcHJvcHJpYXRlIGhhc2ggYml0IGZvciB0aGUgZ2l2ZW4gYWRkciAqLworLyogVGhlIGFsZ29yaXRobSB3b3JrcyBsaWtlIHNvOgorICogMSkgVGFrZSB0aGUgRGVzdGluYXRpb24gQWRkcmVzcyAoaWUgdGhlIG11bHRpY2FzdCBhZGRyZXNzKSwgYW5kCisgKiBkbyBhIENSQyBvbiBpdCAobGl0dGxlIGVuZGlhbiksIGFuZCByZXZlcnNlIHRoZSBiaXRzIG9mIHRoZQorICogcmVzdWx0LgorICogMikgVXNlIHRoZSA4IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBhcyBhIGhhc2ggaW50byBhIDI1Ni1lbnRyeQorICogdGFibGUuICBUaGUgdGFibGUgaXMgY29udHJvbGxlZCB0aHJvdWdoIDggMzItYml0IHJlZ2lzdGVyczoKKyAqIGdhZGRyMC03LiAgZ2FkZHIwJ3MgTVNCIGlzIGVudHJ5IDAsIGFuZCBnYWRkcjcncyBMU0IgaXMKKyAqIGdhZGRyNy4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgMyBtb3N0IHNpZ25pZmljYW50IGJpdHMgaW4gdGhlCisgKiBoYXNoIGluZGV4IHdoaWNoIGdhZGRyIHJlZ2lzdGVyIHRvIHVzZSwgYW5kIHRoZSA1IG90aGVyIGJpdHMKKyAqIGluZGljYXRlIHdoaWNoIGJpdCAoYXNzdW1pbmcgYW4gSUJNIG51bWJlcmluZyBzY2hlbWUsIHdoaWNoCisgKiBmb3IgUG93ZXJQQyAodG0pIGlzIHVzdWFsbHkgdGhlIGNhc2UpIGluIHRoZSByZWdpc3RlciBob2xkcworICogdGhlIGVudHJ5LiAqLworc3RhdGljIHZvaWQgZ2Zhcl9zZXRfaGFzaF9mb3JfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqYWRkcikKK3sKKwl1MzIgdGVtcHZhbDsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZ2ZhciAqcmVncyA9IHByaXYtPnJlZ3M7CisJdTMyICpoYXNoID0gJnJlZ3MtPmdhZGRyMDsKKwl1MzIgcmVzdWx0ID0gZXRoZXJfY3JjKE1BQ19BRERSX0xFTiwgYWRkcik7CisJdTggd2hpY2hyZWcgPSAoKHJlc3VsdCA+PiAyOSkgJiAweDcpOworCXU4IHdoaWNoYml0ID0gKChyZXN1bHQgPj4gMjQpICYgMHgxZik7CisJdTMyIHZhbHVlID0gKDEgPDwgKDMxLXdoaWNoYml0KSk7CisKKwl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZoYXNoW3doaWNocmVnXSk7CisJdGVtcHZhbCB8PSB2YWx1ZTsKKwlnZmFyX3dyaXRlKCZoYXNoW3doaWNocmVnXSwgdGVtcHZhbCk7CisKKwlyZXR1cm47Cit9CisKKy8qIEdGQVIgZXJyb3IgaW50ZXJydXB0IGhhbmRsZXIgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBnZmFyX2Vycm9yKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIFNhdmUgaWV2ZW50IGZvciBmdXR1cmUgcmVmZXJlbmNlICovCisJdTMyIGV2ZW50cyA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+aWV2ZW50KTsKKworCS8qIENsZWFyIElFVkVOVCAqLworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlldmVudCwgSUVWRU5UX0VSUl9NQVNLKTsKKworCS8qIEhtbS4uLiAqLworI2lmIGRlZmluZWQgKEJSSUVGX0dGQVJfRVJST1JTKSB8fCBkZWZpbmVkIChWRVJCT1NFX0dGQVJfRVJST1JTKQorCXByaW50ayhLRVJOX0RFQlVHICIlczogZXJyb3IgaW50ZXJydXB0IChpZXZlbnQ9MHglMDh4IGltYXNrPTB4JTA4eClcbiIsCisJICAgICAgIGRldi0+bmFtZSwgZXZlbnRzLCBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmltYXNrKSk7CisjZW5kaWYKKworCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnRlcnMgKi8KKwlpZiAoZXZlbnRzICYgSUVWRU5UX1RYRSkgeworCQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKworCQlpZiAoZXZlbnRzICYgSUVWRU5UX0xDKQorCQkJcHJpdi0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQlpZiAoZXZlbnRzICYgSUVWRU5UX0NSTCkKKwkJCXByaXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCWlmIChldmVudHMgJiBJRVZFTlRfWEZVTikgeworI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5kZXJydW4uICBwYWNrZXQgZHJvcHBlZC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOworCQkJcHJpdi0+ZXh0cmFfc3RhdHMudHhfdW5kZXJydW4rKzsKKworCQkJLyogUmVhY3RpdmF0ZSB0aGUgVHggUXVldWVzICovCisJCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT50c3RhdCwgVFNUQVRfQ0xFQVJfVEhBTFQpOworCQl9CisjaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRyYW5zbWl0IEVycm9yXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJfQorCWlmIChldmVudHMgJiBJRVZFTlRfQlNZKSB7CisJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlwcml2LT5leHRyYV9zdGF0cy5yeF9ic3krKzsKKworCQlnZmFyX3JlY2VpdmUoaXJxLCBkZXZfaWQsIHJlZ3MpOworCisjaWZuZGVmIENPTkZJR19HRkFSX05BUEkKKwkJLyogQ2xlYXIgdGhlIGhhbHQgYml0IGluIFJTVEFUICovCisJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnJzdGF0LCBSU1RBVF9DTEVBUl9SSEFMVCk7CisjZW5kaWYKKworI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidXN5IGVycm9yIChyaGFsdDogJXgpXG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPnJzdGF0KSk7CisjZW5kaWYKKwl9CisJaWYgKGV2ZW50cyAmIElFVkVOVF9CQUJSKSB7CisJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlwcml2LT5leHRyYV9zdGF0cy5yeF9iYWJyKys7CisKKyNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogYmFiYmxpbmcgZXJyb3JcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwl9CisJaWYgKGV2ZW50cyAmIElFVkVOVF9FQkVSUikgeworCQlwcml2LT5leHRyYV9zdGF0cy5lYmVycisrOworI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBFQkVSUlxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCX0KKwlpZiAoZXZlbnRzICYgSUVWRU5UX1JYQykKKyNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogY29udHJvbCBmcmFtZVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJaWYgKGV2ZW50cyAmIElFVkVOVF9CQUJUKSB7CisJCXByaXYtPmV4dHJhX3N0YXRzLnR4X2JhYnQrKzsKKyNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogYmFidCBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIFN0cnVjdHVyZSBmb3IgYSBkZXZpY2UgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgZ2Zhcl9kcml2ZXIgPSB7CisJLm5hbWUgPSAiZnNsLWdpYW5mYXIiLAorCS5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlID0gZ2Zhcl9wcm9iZSwKKwkucmVtb3ZlID0gZ2Zhcl9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBnZmFyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZnZmFyX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBnZmFyX2V4aXQodm9pZCkKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmZ2Zhcl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChnZmFyX2luaXQpOworbW9kdWxlX2V4aXQoZ2Zhcl9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhci5oIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZjc4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9naWFuZmFyLmgKQEAgLTAsMCArMSw1MzggQEAKKy8qIAorICogZHJpdmVycy9uZXQvZ2lhbmZhci5oCisgKgorICogR2lhbmZhciBFdGhlcm5ldCBEcml2ZXIKKyAqIERyaXZlciBmb3IgRkVDIG9uIE1QQzg1NDAgYW5kIFRTRUMgb24gTVBDODU0MC9NUEM4NTYwCisgKiBCYXNlZCBvbiA4MjYwX2lvL2ZjY19lbmV0LmMKKyAqCisgKiBBdXRob3I6IEFuZHkgRmxlbWluZworICogTWFpbnRhaW5lcjogS3VtYXIgR2FsYSAoa3VtYXIuZ2FsYUBmcmVlc2NhbGUuY29tKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgU3RpbGwgbGVmdCB0byBkbzoKKyAqICAgICAgLUFkZCBzdXBwb3J0IGZvciBtb2R1bGUgcGFyYW1ldGVycworICoJLUFkZCBzdXBwb3J0IGZvciBldGh0b29sIC1zCisgKgktQWRkIHBhdGNoIGZvciBldGh0b29sIHBoeXMgaWQKKyAqLworI2lmbmRlZiBfX0dJQU5GQVJfSAorI2RlZmluZSBfX0dJQU5GQVJfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgImdpYW5mYXJfcGh5LmgiCisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIHRvIGJlIGhhbmRsZWQgaW4gb25lIGNhbGwgb2YgZ2Zhcl9wb2xsICovCisjZGVmaW5lIEdGQVJfREVWX1dFSUdIVCA2NAorCisvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gYWxpZ24gdGhlIHJ4IGJ1ZnMgdG8gKi8KKyNkZWZpbmUgUlhCVUZfQUxJR05NRU5UIDY0CisKKy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggY29tcG9zZXMgYSB1bml0IGZvciB0aGUgcHVycG9zZSBvZgorICogYWxsb2NhdGluZyBkYXRhIGJ1ZmZlcnMuICBpZS1mb3IgYW55IGdpdmVuIE1UVSwgdGhlIGRhdGEgYnVmZmVyCisgKiB3aWxsIGJlIHRoZSBuZXh0IGhpZ2hlc3QgbXVsdGlwbGUgb2YgNTEyIGJ5dGVzLiAqLworI2RlZmluZSBJTkNSRU1FTlRBTF9CVUZGRVJfU0laRSA1MTIKKworCisjZGVmaW5lIE1BQ19BRERSX0xFTiA2CisKKyNkZWZpbmUgUEhZX0lOSVRfVElNRU9VVCAxMDAwMDAKKyNkZWZpbmUgR0ZBUl9QSFlfQ0hBTkdFX1RJTUUgMgorCisjZGVmaW5lIERFVklDRV9OQU1FICIlczogR2lhbmZhciBFdGhlcm5ldCBDb250cm9sbGVyIFZlcnNpb24gMS4xLCAiCisjZGVmaW5lIERSVl9OQU1FICJnZmFyLWVuZXQiCitleHRlcm4gY29uc3QgY2hhciBnZmFyX2RyaXZlcl9uYW1lW107CitleHRlcm4gY29uc3QgY2hhciBnZmFyX2RyaXZlcl92ZXJzaW9uW107CisKKy8qIFRoZXNlIG5lZWQgdG8gYmUgcG93ZXJzIG9mIDIgZm9yIHRoaXMgZHJpdmVyICovCisjaWZkZWYgQ09ORklHX0dGQVJfTkFQSQorI2RlZmluZSBERUZBVUxUX1RYX1JJTkdfU0laRQkyNTYKKyNkZWZpbmUgREVGQVVMVF9SWF9SSU5HX1NJWkUJMjU2CisjZWxzZQorI2RlZmluZSBERUZBVUxUX1RYX1JJTkdfU0laRSAgICA2NAorI2RlZmluZSBERUZBVUxUX1JYX1JJTkdfU0laRSAgICA2NAorI2VuZGlmCisKKyNkZWZpbmUgR0ZBUl9SWF9NQVhfUklOR19TSVpFICAgMjU2CisjZGVmaW5lIEdGQVJfVFhfTUFYX1JJTkdfU0laRSAgIDI1NgorCisjZGVmaW5lIERFRkFVTFRfUlhfQlVGRkVSX1NJWkUgIDE1MzYKKyNkZWZpbmUgVFhfUklOR19NT0RfTUFTSyhzaXplKSAoc2l6ZS0xKQorI2RlZmluZSBSWF9SSU5HX01PRF9NQVNLKHNpemUpIChzaXplLTEpCisjZGVmaW5lIEpVTUJPX0JVRkZFUl9TSVpFIDk3MjgKKyNkZWZpbmUgSlVNQk9fRlJBTUVfU0laRSA5NjAwCisKKy8qIExhdGVuY3kgb2YgaW50ZXJmYWNlIGNsb2NrIGluIG5hbm9zZWNvbmRzICovCisvKiBJbnRlcmZhY2UgY2xvY2sgbGF0ZW5jeSAsIGluIHRoaXMgY2FzZSwgbWVhbnMgdGhlIAorICogdGltZSBkZXNjcmliZWQgYnkgYSB2YWx1ZSBvZiAxIGluIHRoZSBpbnRlcnJ1cHQKKyAqIGNvYWxlc2NpbmcgcmVnaXN0ZXJzJyB0aW1lIGZpZWxkcy4gIFNpbmNlIHRob3NlIGZpZWxkcworICogcmVmZXIgdG8gdGhlIHRpbWUgaXQgdGFrZXMgZm9yIDY0IGNsb2NrcyB0byBwYXNzLCB0aGUKKyAqIGxhdGVuY2llcyBhcmUgYXMgc3VjaDoKKyAqIEdCSVQgPSAxMjVNSHogPT4gOG5zL2Nsb2NrID0+IDgqNjQgbnMgLyB0aWNrCisgKiAxMDAgPSAyNSBNSHogPT4gNDBucy9jbG9jayA9PiA0MCo2NCBucyAvIHRpY2sKKyAqIDEwID0gMi41IE1IeiA9PiA0MDBucy9jbG9jayA9PiA0MDAqNjQgbnMgLyB0aWNrCisgKi8KKyNkZWZpbmUgR0ZBUl9HQklUX1RJTUUgIDUxMgorI2RlZmluZSBHRkFSXzEwMF9USU1FICAgMjU2MAorI2RlZmluZSBHRkFSXzEwX1RJTUUgICAgMjU2MDAKKworI2RlZmluZSBERUZBVUxUX1RYX0NPQUxFU0NFIDEKKyNkZWZpbmUgREVGQVVMVF9UWENPVU5UCTE2CisjZGVmaW5lIERFRkFVTFRfVFhUSU1FCTQwMAorCisjZGVmaW5lIERFRkFVTFRfUlhfQ09BTEVTQ0UgMQorI2RlZmluZSBERUZBVUxUX1JYQ09VTlQJMTYKKyNkZWZpbmUgREVGQVVMVF9SWFRJTUUJNDAwCisKKyNkZWZpbmUgVEJJUEFfVkFMVUUJCTB4MWYKKyNkZWZpbmUgTUlJTUNGR19JTklUX1ZBTFVFCTB4MDAwMDAwMDcKKyNkZWZpbmUgTUlJTUNGR19SRVNFVCAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBNSUlNSU5EX0JVU1kgICAgICAgICAgICAweDAwMDAwMDAxCisKKy8qIE1BQyByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIE1BQ0NGRzFfU09GVF9SRVNFVAkweDgwMDAwMDAwCisjZGVmaW5lIE1BQ0NGRzFfUkVTRVRfUlhfTUMJMHgwMDA4MDAwMAorI2RlZmluZSBNQUNDRkcxX1JFU0VUX1RYX01DCTB4MDAwNDAwMDAKKyNkZWZpbmUgTUFDQ0ZHMV9SRVNFVF9SWF9GVU4JMHgwMDAyMDAwMAorI2RlZmluZQlNQUNDRkcxX1JFU0VUX1RYX0ZVTgkweDAwMDEwMDAwCisjZGVmaW5lIE1BQ0NGRzFfTE9PUEJBQ0sJMHgwMDAwMDEwMAorI2RlZmluZSBNQUNDRkcxX1JYX0ZMT1cJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTUFDQ0ZHMV9UWF9GTE9XCQkweDAwMDAwMDEwCisjZGVmaW5lIE1BQ0NGRzFfU1lOQ0RfUlhfRU4JMHgwMDAwMDAwOAorI2RlZmluZSBNQUNDRkcxX1JYX0VOCQkweDAwMDAwMDA0CisjZGVmaW5lIE1BQ0NGRzFfU1lOQ0RfVFhfRU4JMHgwMDAwMDAwMgorI2RlZmluZSBNQUNDRkcxX1RYX0VOCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgTUFDQ0ZHMl9JTklUX1NFVFRJTkdTCTB4MDAwMDcyMDUKKyNkZWZpbmUgTUFDQ0ZHMl9GVUxMX0RVUExFWAkweDAwMDAwMDAxCisjZGVmaW5lIE1BQ0NGRzJfSUYgICAgICAgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgTUFDQ0ZHMl9NSUkgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBNQUNDRkcyX0dNSUkgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIE1BQ0NGRzJfSFVHRUZSQU1FCTB4MDAwMDAwMjAKKyNkZWZpbmUgTUFDQ0ZHMl9MRU5HVEhDSEVDSwkweDAwMDAwMDEwCisKKyNkZWZpbmUgRUNOVFJMX0lOSVRfU0VUVElOR1MJMHgwMDAwMTAwMAorI2RlZmluZSBFQ05UUkxfVEJJX01PREUgICAgICAgICAweDAwMDAwMDIwCisKKyNkZWZpbmUgTVJCTFJfSU5JVF9TRVRUSU5HUwlERUZBVUxUX1JYX0JVRkZFUl9TSVpFCisKKyNkZWZpbmUgTUlORkxSX0lOSVRfU0VUVElOR1MJMHgwMDAwMDA0MAorCisvKiBJbml0IHRvIGRvIHR4IHNub29waW5nIGZvciBidWZmZXJzIGFuZCBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBETUFDVFJMX0lOSVRfU0VUVElOR1MgICAweDAwMDAwMGMzCisjZGVmaW5lIERNQUNUUkxfR1JTICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRE1BQ1RSTF9HVFMgICAgICAgICAgICAgMHgwMDAwMDAwOAorCisjZGVmaW5lIFRTVEFUX0NMRUFSX1RIQUxUICAgICAgIDB4ODAwMDAwMDAKKworLyogSW50ZXJydXB0IGNvYWxlc2NpbmcgbWFjcm9zICovCisjZGVmaW5lIElDX0lDRU4JCQkweDgwMDAwMDAwCisjZGVmaW5lIElDX0lDRlRfTUFTSwkJMHgxZmUwMDAwMAorI2RlZmluZSBJQ19JQ0ZUX1NISUZUCQkyMQorI2RlZmluZSBta19pY19pY2Z0KHgpCQlcCisJKCgodW5zaWduZWQgaW50KXggPDwgSUNfSUNGVF9TSElGVCkmSUNfSUNGVF9NQVNLKQorI2RlZmluZSBJQ19JQ1RUX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgbWtfaWNfaWN0dCh4KQkJKHgmSUNfSUNUVF9NQVNLKQorCisjZGVmaW5lIG1rX2ljX3ZhbHVlKGNvdW50LCB0aW1lKSAoSUNfSUNFTiB8IFwKKwkJCQlta19pY19pY2Z0KGNvdW50KSB8IFwKKwkJCQlta19pY19pY3R0KHRpbWUpKQorCisjZGVmaW5lIFJDVFJMX1BST00JCTB4MDAwMDAwMDgKKyNkZWZpbmUgUlNUQVRfQ0xFQVJfUkhBTFQgICAgICAgMHgwMDgwMDAwMAorCisjZGVmaW5lIElFVkVOVF9JTklUX0NMRUFSCTB4ZmZmZmZmZmYKKyNkZWZpbmUgSUVWRU5UX0JBQlIJCTB4ODAwMDAwMDAKKyNkZWZpbmUgSUVWRU5UX1JYQwkJMHg0MDAwMDAwMAorI2RlZmluZSBJRVZFTlRfQlNZCQkweDIwMDAwMDAwCisjZGVmaW5lIElFVkVOVF9FQkVSUgkJMHgxMDAwMDAwMAorI2RlZmluZSBJRVZFTlRfTVNSTwkJMHgwNDAwMDAwMAorI2RlZmluZSBJRVZFTlRfR1RTQwkJMHgwMjAwMDAwMAorI2RlZmluZSBJRVZFTlRfQkFCVAkJMHgwMTAwMDAwMAorI2RlZmluZSBJRVZFTlRfVFhDCQkweDAwODAwMDAwCisjZGVmaW5lIElFVkVOVF9UWEUJCTB4MDA0MDAwMDAKKyNkZWZpbmUgSUVWRU5UX1RYQgkJMHgwMDIwMDAwMAorI2RlZmluZSBJRVZFTlRfVFhGCQkweDAwMTAwMDAwCisjZGVmaW5lIElFVkVOVF9MQwkJMHgwMDA0MDAwMAorI2RlZmluZSBJRVZFTlRfQ1JMCQkweDAwMDIwMDAwCisjZGVmaW5lIElFVkVOVF9YRlVOCQkweDAwMDEwMDAwCisjZGVmaW5lIElFVkVOVF9SWEIwCQkweDAwMDA4MDAwCisjZGVmaW5lIElFVkVOVF9HUlNDCQkweDAwMDAwMTAwCisjZGVmaW5lIElFVkVOVF9SWEYwCQkweDAwMDAwMDgwCisjZGVmaW5lIElFVkVOVF9SWF9NQVNLICAgICAgICAgIChJRVZFTlRfUlhCMCB8IElFVkVOVF9SWEYwKQorI2RlZmluZSBJRVZFTlRfVFhfTUFTSyAgICAgICAgICAoSUVWRU5UX1RYQiB8IElFVkVOVF9UWEYpCisjZGVmaW5lIElFVkVOVF9FUlJfTUFTSyAgICAgICAgIFwKKyhJRVZFTlRfUlhDIHwgSUVWRU5UX0JTWSB8IElFVkVOVF9FQkVSUiB8IElFVkVOVF9NU1JPIHwgXAorIElFVkVOVF9CQUJUIHwgSUVWRU5UX1RYQyB8IElFVkVOVF9UWEUgfCBJRVZFTlRfTEMgXAorIHwgSUVWRU5UX0NSTCB8IElFVkVOVF9YRlVOKQorCisjZGVmaW5lIElNQVNLX0lOSVRfQ0xFQVIJMHgwMDAwMDAwMAorI2RlZmluZSBJTUFTS19CQUJSICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIElNQVNLX1JYQyAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgSU1BU0tfQlNZICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBJTUFTS19FQkVSUiAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIElNQVNLX01TUk8JCTB4MDQwMDAwMDAKKyNkZWZpbmUgSU1BU0tfR1JTQyAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBJTUFTS19CQUJUCQkweDAxMDAwMDAwCisjZGVmaW5lIElNQVNLX1RYQyAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgSU1BU0tfVFhFRU4JCTB4MDA0MDAwMDAKKyNkZWZpbmUgSU1BU0tfVFhCRU4JCTB4MDAyMDAwMDAKKyNkZWZpbmUgSU1BU0tfVFhGRU4gICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBJTUFTS19MQwkJMHgwMDA0MDAwMAorI2RlZmluZSBJTUFTS19DUkwJCTB4MDAwMjAwMDAKKyNkZWZpbmUgSU1BU0tfWEZVTgkJMHgwMDAxMDAwMAorI2RlZmluZSBJTUFTS19SWEIwICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIElNQVNLX0dUU0MgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSU1BU0tfUlhGRU4wCQkweDAwMDAwMDgwCisjZGVmaW5lIElNQVNLX1JYX0RJU0FCTEVEIH4oSU1BU0tfUlhGRU4wIHwgSU1BU0tfQlNZKQorI2RlZmluZSBJTUFTS19ERUZBVUxUICAoSU1BU0tfVFhFRU4gfCBJTUFTS19UWEZFTiB8IElNQVNLX1RYQkVOIHwgXAorCQlJTUFTS19SWEZFTjAgfCBJTUFTS19CU1kgfCBJTUFTS19FQkVSUiB8IElNQVNLX0JBQlIgfCBcCisJCUlNQVNLX1hGVU4gfCBJTUFTS19SWEMgfCBJTUFTS19CQUJUKQorCisKKy8qIEF0dHJpYnV0ZSBmaWVsZHMgKi8KKworLyogVGhpcyBlbmFibGVzIHJ4IHNub29waW5nIGZvciBidWZmZXJzIGFuZCBkZXNjcmlwdG9ycyAqLworI2lmZGVmIENPTkZJR19HRkFSX0JEU1RBU0gKKyNkZWZpbmUgQVRUUl9CRFNUQVNICQkweDAwMDAwODAwCisjZWxzZQorI2RlZmluZSBBVFRSX0JEU1RBU0gJCTB4MDAwMDAwMDAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0dGQVJfQlVGU1RBU0gKKyNkZWZpbmUgQVRUUl9CVUZTVEFTSAkJMHgwMDAwNDAwMAorI2RlZmluZSBTVEFTSF9MRU5HVEgJCTY0CisjZWxzZQorI2RlZmluZSBBVFRSX0JVRlNUQVNICQkweDAwMDAwMDAwCisjZW5kaWYKKworI2RlZmluZSBBVFRSX1NOT09QSU5HCQkweDAwMDAwMGMwCisjZGVmaW5lIEFUVFJfSU5JVF9TRVRUSU5HUyAgICAgIChBVFRSX1NOT09QSU5HIFwKKwkJfCBBVFRSX0JEU1RBU0ggfCBBVFRSX0JVRlNUQVNIKQorCisjZGVmaW5lIEFUVFJFTElfSU5JVF9TRVRUSU5HUyAgIDB4MAorCisKKy8qIFR4QkQgc3RhdHVzIGZpZWxkIGJpdHMgKi8KKyNkZWZpbmUgVFhCRF9SRUFEWQkJMHg4MDAwCisjZGVmaW5lIFRYQkRfUEFEQ1JDCQkweDQwMDAKKyNkZWZpbmUgVFhCRF9XUkFQCQkweDIwMDAKKyNkZWZpbmUgVFhCRF9JTlRFUlJVUFQJCTB4MTAwMAorI2RlZmluZSBUWEJEX0xBU1QJCTB4MDgwMAorI2RlZmluZSBUWEJEX0NSQwkJMHgwNDAwCisjZGVmaW5lIFRYQkRfREVGCQkweDAyMDAKKyNkZWZpbmUgVFhCRF9IVUdFRlJBTUUJCTB4MDA4MAorI2RlZmluZSBUWEJEX0xBVEVDT0xMSVNJT04JMHgwMDgwCisjZGVmaW5lIFRYQkRfUkVUUllMSU1JVAkJMHgwMDQwCisjZGVmaW5lCVRYQkRfUkVUUllDT1VOVE1BU0sJMHgwMDNjCisjZGVmaW5lIFRYQkRfVU5ERVJSVU4JCTB4MDAwMgorCisvKiBSeEJEIHN0YXR1cyBmaWVsZCBiaXRzICovCisjZGVmaW5lIFJYQkRfRU1QVFkJCTB4ODAwMAorI2RlZmluZSBSWEJEX1JPMQkJMHg0MDAwCisjZGVmaW5lIFJYQkRfV1JBUAkJMHgyMDAwCisjZGVmaW5lIFJYQkRfSU5URVJSVVBUCQkweDEwMDAKKyNkZWZpbmUgUlhCRF9MQVNUCQkweDA4MDAKKyNkZWZpbmUgUlhCRF9GSVJTVAkJMHgwNDAwCisjZGVmaW5lIFJYQkRfTUlTUwkJMHgwMTAwCisjZGVmaW5lIFJYQkRfQlJPQURDQVNUCQkweDAwODAKKyNkZWZpbmUgUlhCRF9NVUxUSUNBU1QJCTB4MDA0MAorI2RlZmluZSBSWEJEX0xBUkdFCQkweDAwMjAKKyNkZWZpbmUgUlhCRF9OT05PQ1RFVAkJMHgwMDEwCisjZGVmaW5lIFJYQkRfU0hPUlQJCTB4MDAwOAorI2RlZmluZSBSWEJEX0NSQ0VSUgkJMHgwMDA0CisjZGVmaW5lIFJYQkRfT1ZFUlJVTgkJMHgwMDAyCisjZGVmaW5lIFJYQkRfVFJVTkNBVEVECQkweDAwMDEKKyNkZWZpbmUgUlhCRF9TVEFUUwkJMHgwMWZmCisKK3N0cnVjdCB0eGJkOAoreworCXUxNglzdGF0dXM7CS8qIFN0YXR1cyBGaWVsZHMgKi8KKwl1MTYJbGVuZ3RoOwkvKiBCdWZmZXIgbGVuZ3RoICovCisJdTMyCWJ1ZlB0cjsJLyogQnVmZmVyIFBvaW50ZXIgKi8KK307CisKK3N0cnVjdCByeGJkOAoreworCXUxNglzdGF0dXM7CS8qIFN0YXR1cyBGaWVsZHMgKi8KKwl1MTYJbGVuZ3RoOwkvKiBCdWZmZXIgTGVuZ3RoICovCisJdTMyCWJ1ZlB0cjsJLyogQnVmZmVyIFBvaW50ZXIgKi8KK307CisKK3N0cnVjdCBybW9uX21pYgoreworCXUzMgl0cjY0OwkvKiAweC42ODAgLSBUcmFuc21pdCBhbmQgUmVjZWl2ZSA2NC1ieXRlIEZyYW1lIENvdW50ZXIgKi8KKwl1MzIJdHIxMjc7CS8qIDB4LjY4NCAtIFRyYW5zbWl0IGFuZCBSZWNlaXZlIDY1LTEyNyBieXRlIEZyYW1lIENvdW50ZXIgKi8KKwl1MzIJdHIyNTU7CS8qIDB4LjY4OCAtIFRyYW5zbWl0IGFuZCBSZWNlaXZlIDEyOC0yNTUgYnl0ZSBGcmFtZSBDb3VudGVyICovCisJdTMyCXRyNTExOwkvKiAweC42OGMgLSBUcmFuc21pdCBhbmQgUmVjZWl2ZSAyNTYtNTExIGJ5dGUgRnJhbWUgQ291bnRlciAqLworCXUzMgl0cjFrOwkvKiAweC42OTAgLSBUcmFuc21pdCBhbmQgUmVjZWl2ZSA1MTItMTAyMyBieXRlIEZyYW1lIENvdW50ZXIgKi8KKwl1MzIJdHJtYXg7CS8qIDB4LjY5NCAtIFRyYW5zbWl0IGFuZCBSZWNlaXZlIDEwMjQtMTUxOCBieXRlIEZyYW1lIENvdW50ZXIgKi8KKwl1MzIJdHJtZ3Y7CS8qIDB4LjY5OCAtIFRyYW5zbWl0IGFuZCBSZWNlaXZlIDE1MTktMTUyMiBieXRlIEdvb2QgVkxBTiBGcmFtZSAqLworCXUzMglyYnl0OwkvKiAweC42OWMgLSBSZWNlaXZlIEJ5dGUgQ291bnRlciAqLworCXUzMglycGt0OwkvKiAweC42YTAgLSBSZWNlaXZlIFBhY2tldCBDb3VudGVyICovCisJdTMyCXJmY3M7CS8qIDB4LjZhNCAtIFJlY2VpdmUgRkNTIEVycm9yIENvdW50ZXIgKi8KKwl1MzIJcm1jYTsJLyogMHguNmE4IC0gUmVjZWl2ZSBNdWx0aWNhc3QgUGFja2V0IENvdW50ZXIgKi8KKwl1MzIJcmJjYTsJLyogMHguNmFjIC0gUmVjZWl2ZSBCcm9hZGNhc3QgUGFja2V0IENvdW50ZXIgKi8KKwl1MzIJcnhjZjsJLyogMHguNmIwIC0gUmVjZWl2ZSBDb250cm9sIEZyYW1lIFBhY2tldCBDb3VudGVyICovCisJdTMyCXJ4cGY7CS8qIDB4LjZiNCAtIFJlY2VpdmUgUGF1c2UgRnJhbWUgUGFja2V0IENvdW50ZXIgKi8KKwl1MzIJcnh1bzsJLyogMHguNmI4IC0gUmVjZWl2ZSBVbmtub3duIE9QIENvZGUgQ291bnRlciAqLworCXUzMglyYWxuOwkvKiAweC42YmMgLSBSZWNlaXZlIEFsaWdubWVudCBFcnJvciBDb3VudGVyICovCisJdTMyCXJmbHI7CS8qIDB4LjZjMCAtIFJlY2VpdmUgRnJhbWUgTGVuZ3RoIEVycm9yIENvdW50ZXIgKi8KKwl1MzIJcmNkZTsJLyogMHguNmM0IC0gUmVjZWl2ZSBDb2RlIEVycm9yIENvdW50ZXIgKi8KKwl1MzIJcmNzZTsJLyogMHguNmM4IC0gUmVjZWl2ZSBDYXJyaWVyIFNlbnNlIEVycm9yIENvdW50ZXIgKi8KKwl1MzIJcnVuZDsJLyogMHguNmNjIC0gUmVjZWl2ZSBVbmRlcnNpemUgUGFja2V0IENvdW50ZXIgKi8KKwl1MzIJcm92cjsJLyogMHguNmQwIC0gUmVjZWl2ZSBPdmVyc2l6ZSBQYWNrZXQgQ291bnRlciAqLworCXUzMglyZnJnOwkvKiAweC42ZDQgLSBSZWNlaXZlIEZyYWdtZW50cyBDb3VudGVyICovCisJdTMyCXJqYnI7CS8qIDB4LjZkOCAtIFJlY2VpdmUgSmFiYmVyIENvdW50ZXIgKi8KKwl1MzIJcmRycDsJLyogMHguNmRjIC0gUmVjZWl2ZSBEcm9wIENvdW50ZXIgKi8KKwl1MzIJdGJ5dDsJLyogMHguNmUwIC0gVHJhbnNtaXQgQnl0ZSBDb3VudGVyIENvdW50ZXIgKi8KKwl1MzIJdHBrdDsJLyogMHguNmU0IC0gVHJhbnNtaXQgUGFja2V0IENvdW50ZXIgKi8KKwl1MzIJdG1jYTsJLyogMHguNmU4IC0gVHJhbnNtaXQgTXVsdGljYXN0IFBhY2tldCBDb3VudGVyICovCisJdTMyCXRiY2E7CS8qIDB4LjZlYyAtIFRyYW5zbWl0IEJyb2FkY2FzdCBQYWNrZXQgQ291bnRlciAqLworCXUzMgl0eHBmOwkvKiAweC42ZjAgLSBUcmFuc21pdCBQYXVzZSBDb250cm9sIEZyYW1lIENvdW50ZXIgKi8KKwl1MzIJdGRmcjsJLyogMHguNmY0IC0gVHJhbnNtaXQgRGVmZXJyYWwgUGFja2V0IENvdW50ZXIgKi8KKwl1MzIJdGVkZjsJLyogMHguNmY4IC0gVHJhbnNtaXQgRXhjZXNzaXZlIERlZmVycmFsIFBhY2tldCBDb3VudGVyICovCisJdTMyCXRzY2w7CS8qIDB4LjZmYyAtIFRyYW5zbWl0IFNpbmdsZSBDb2xsaXNpb24gUGFja2V0IENvdW50ZXIgKi8KKwl1MzIJdG1jbDsJLyogMHguNzAwIC0gVHJhbnNtaXQgTXVsdGlwbGUgQ29sbGlzaW9uIFBhY2tldCBDb3VudGVyICovCisJdTMyCXRsY2w7CS8qIDB4LjcwNCAtIFRyYW5zbWl0IExhdGUgQ29sbGlzaW9uIFBhY2tldCBDb3VudGVyICovCisJdTMyCXR4Y2w7CS8qIDB4LjcwOCAtIFRyYW5zbWl0IEV4Y2Vzc2l2ZSBDb2xsaXNpb24gUGFja2V0IENvdW50ZXIgKi8KKwl1MzIJdG5jbDsJLyogMHguNzBjIC0gVHJhbnNtaXQgVG90YWwgQ29sbGlzaW9uIENvdW50ZXIgKi8KKwl1OAlyZXMxWzRdOworCXUzMgl0ZHJwOwkvKiAweC43MTQgLSBUcmFuc21pdCBEcm9wIEZyYW1lIENvdW50ZXIgKi8KKwl1MzIJdGpicjsJLyogMHguNzE4IC0gVHJhbnNtaXQgSmFiYmVyIEZyYW1lIENvdW50ZXIgKi8KKwl1MzIJdGZjczsJLyogMHguNzFjIC0gVHJhbnNtaXQgRkNTIEVycm9yIENvdW50ZXIgKi8KKwl1MzIJdHhjZjsJLyogMHguNzIwIC0gVHJhbnNtaXQgQ29udHJvbCBGcmFtZSBDb3VudGVyICovCisJdTMyCXRvdnI7CS8qIDB4LjcyNCAtIFRyYW5zbWl0IE92ZXJzaXplIEZyYW1lIENvdW50ZXIgKi8KKwl1MzIJdHVuZDsJLyogMHguNzI4IC0gVHJhbnNtaXQgVW5kZXJzaXplIEZyYW1lIENvdW50ZXIgKi8KKwl1MzIJdGZyZzsJLyogMHguNzJjIC0gVHJhbnNtaXQgRnJhZ21lbnRzIEZyYW1lIENvdW50ZXIgKi8KKwl1MzIJY2FyMTsJLyogMHguNzMwIC0gQ2FycnkgUmVnaXN0ZXIgT25lICovCisJdTMyCWNhcjI7CS8qIDB4LjczNCAtIENhcnJ5IFJlZ2lzdGVyIFR3byAqLworCXUzMgljYW0xOwkvKiAweC43MzggLSBDYXJyeSBNYXNrIFJlZ2lzdGVyIE9uZSAqLworCXUzMgljYW0yOwkvKiAweC43M2MgLSBDYXJyeSBNYXNrIFJlZ2lzdGVyIFR3byAqLworfTsKKworc3RydWN0IGdmYXJfZXh0cmFfc3RhdHMgeworCXU2NCBrZXJuZWxfZHJvcHBlZDsKKwl1NjQgcnhfbGFyZ2U7CisJdTY0IHJ4X3Nob3J0OworCXU2NCByeF9ub25vY3RldDsKKwl1NjQgcnhfY3JjZXJyOworCXU2NCByeF9vdmVycnVuOworCXU2NCByeF9ic3k7CisJdTY0IHJ4X2JhYnI7CisJdTY0IHJ4X3RydW5jOworCXU2NCBlYmVycjsKKwl1NjQgdHhfYmFidDsKKwl1NjQgdHhfdW5kZXJydW47CisJdTY0IHJ4X3NrYm1pc3Npbmc7CisJdTY0IHR4X3RpbWVvdXQ7Cit9OworCisjZGVmaW5lIEdGQVJfUk1PTl9MRU4gKChzaXplb2Yoc3RydWN0IHJtb25fbWliKSAtIDE2KS9zaXplb2YodTMyKSkKKyNkZWZpbmUgR0ZBUl9FWFRSQV9TVEFUU19MRU4gKHNpemVvZihzdHJ1Y3QgZ2Zhcl9leHRyYV9zdGF0cykvc2l6ZW9mKHU2NCkpCisKKy8qIE51bWJlciBvZiBzdGF0cyBpbiB0aGUgc3RhdHMgc3RydWN0dXJlIChpZ25vcmUgY2FyIGFuZCBjYW0gcmVncykqLworI2RlZmluZSBHRkFSX1NUQVRTX0xFTiAoR0ZBUl9STU9OX0xFTiArIEdGQVJfRVhUUkFfU1RBVFNfTEVOKQorCisjZGVmaW5lIEdGQVJfSU5GT1NUUl9MRU4gMzIKKworc3RydWN0IGdmYXJfc3RhdHMgeworCXU2NCBleHRyYVtHRkFSX0VYVFJBX1NUQVRTX0xFTl07CisJdTY0IHJtb25bR0ZBUl9STU9OX0xFTl07Cit9OworCisKK3N0cnVjdCBnZmFyIHsKKwl1OAlyZXMxWzE2XTsKKwl1MzIJaWV2ZW50OwkJCS8qIDB4LjAxMCAtIEludGVycnVwdCBFdmVudCBSZWdpc3RlciAqLworCXUzMglpbWFzazsJCQkvKiAweC4wMTQgLSBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworCXUzMgllZGlzOwkJCS8qIDB4LjAxOCAtIEVycm9yIERpc2FibGVkIFJlZ2lzdGVyICovCisJdTgJcmVzMls0XTsKKwl1MzIJZWNudHJsOwkJCS8qIDB4LjAyMCAtIEV0aGVybmV0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1MzIJbWluZmxyOwkJCS8qIDB4LjAyNCAtIE1pbmltdW0gRnJhbWUgTGVuZ3RoIFJlZ2lzdGVyICovCisJdTMyCXB0djsJCQkvKiAweC4wMjggLSBQYXVzZSBUaW1lIFZhbHVlIFJlZ2lzdGVyICovCisJdTMyCWRtYWN0cmw7CQkvKiAweC4wMmMgLSBETUEgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMgl0YmlwYTsJCQkvKiAweC4wMzAgLSBUQkkgUEhZIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1OAlyZXMzWzg4XTsKKwl1MzIJZmlmb190eF90aHI7CQkvKiAweC4wOGMgLSBGSUZPIHRyYW5zbWl0IHRocmVzaG9sZCByZWdpc3RlciAqLworCXU4CXJlczRbOF07CisJdTMyCWZpZm9fdHhfc3RhcnZlOwkJLyogMHguMDk4IC0gRklGTyB0cmFuc21pdCBzdGFydmUgcmVnaXN0ZXIgKi8KKwl1MzIJZmlmb190eF9zdGFydmVfc2h1dG9mZjsJLyogMHguMDljIC0gRklGTyB0cmFuc21pdCBzdGFydmUgc2h1dG9mZiByZWdpc3RlciAqLworCXU4CXJlczVbOTZdOworCXUzMgl0Y3RybDsJCQkvKiAweC4xMDAgLSBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyICovCisJdTMyCXRzdGF0OwkJCS8qIDB4LjEwNCAtIFRyYW5zbWl0IFN0YXR1cyBSZWdpc3RlciAqLworCXU4CXJlczZbNF07CisJdTMyCXRiZGxlbjsJCQkvKiAweC4xMGMgLSBUcmFuc21pdCBCdWZmZXIgRGVzY3JpcHRvciBEYXRhIExlbmd0aCBSZWdpc3RlciAqLworCXUzMgl0eGljOwkJCS8qIDB4LjExMCAtIFRyYW5zbWl0IEludGVycnVwdCBDb2FsZXNjaW5nIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwl1OAlyZXM3WzE2XTsKKwl1MzIJY3RicHRyOwkJCS8qIDB4LjEyNCAtIEN1cnJlbnQgVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworCXU4CXJlczhbOTJdOworCXUzMgl0YnB0cjsJCQkvKiAweC4xODQgLSBUcmFuc21pdCBCdWZmZXIgRGVzY3JpcHRvciBQb2ludGVyIExvdyBSZWdpc3RlciAqLworCXU4CXJlczlbMTI0XTsKKwl1MzIJdGJhc2U7CQkJLyogMHguMjA0IC0gVHJhbnNtaXQgRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1OAlyZXMxMFsxNjhdOworCXUzMglvc3RiZDsJCQkvKiAweC4yYjAgLSBPdXQtb2YtU2VxdWVuY2UgVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgUmVnaXN0ZXIgKi8KKwl1MzIJb3N0YmRwOwkJCS8qIDB4LjJiNCAtIE91dC1vZi1TZXF1ZW5jZSBUcmFuc21pdCBEYXRhIEJ1ZmZlciBQb2ludGVyIFJlZ2lzdGVyICovCisJdTgJcmVzMTFbNzJdOworCXUzMglyY3RybDsJCQkvKiAweC4zMDAgLSBSZWNlaXZlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1MzIJcnN0YXQ7CQkJLyogMHguMzA0IC0gUmVjZWl2ZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1OAlyZXMxMls0XTsKKwl1MzIJcmJkbGVuOwkJCS8qIDB4LjMwYyAtIFJ4QkQgRGF0YSBMZW5ndGggUmVnaXN0ZXIgKi8KKwl1MzIJcnhpYzsJCQkvKiAweC4zMTAgLSBSZWNlaXZlIEludGVycnVwdCBDb2FsZXNjaW5nIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwl1OAlyZXMxM1sxNl07CisJdTMyCWNyYnB0cjsJCQkvKiAweC4zMjQgLSBDdXJyZW50IFJlY2VpdmUgQnVmZmVyIERlc2NyaXB0b3IgUG9pbnRlciAqLworCXU4CXJlczE0WzI0XTsKKwl1MzIJbXJibHI7CQkJLyogMHguMzQwIC0gTWF4aW11bSBSZWNlaXZlIEJ1ZmZlciBMZW5ndGggUmVnaXN0ZXIgKi8KKwl1OAlyZXMxNVs2NF07CisJdTMyCXJicHRyOwkJCS8qIDB4LjM4NCAtIFJlY2VpdmUgQnVmZmVyIERlc2NyaXB0b3IgUG9pbnRlciAqLworCXU4CXJlczE2WzEyNF07CisJdTMyCXJiYXNlOwkJCS8qIDB4LjQwNCAtIFJlY2VpdmUgRGVzY3JpcHRvciBCYXNlIEFkZHJlc3MgKi8KKwl1OAlyZXMxN1syNDhdOworCXUzMgltYWNjZmcxOwkJLyogMHguNTAwIC0gTUFDIENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLworCXUzMgltYWNjZmcyOwkJLyogMHguNTA0IC0gTUFDIENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworCXUzMglpcGdpZmc7CQkJLyogMHguNTA4IC0gSW50ZXIgUGFja2V0IEdhcC9JbnRlciBGcmFtZSBHYXAgUmVnaXN0ZXIgKi8KKwl1MzIJaGFmZHVwOwkJCS8qIDB4LjUwYyAtIEhhbGYgRHVwbGV4IFJlZ2lzdGVyICovCisJdTMyCW1heGZybTsJCQkvKiAweC41MTAgLSBNYXhpbXVtIEZyYW1lIExlbmd0aCBSZWdpc3RlciAqLworCXU4CXJlczE4WzEyXTsKKwl1MzIJbWlpbWNmZzsJCS8qIDB4LjUyMCAtIE1JSSBNYW5hZ2VtZW50IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwl1MzIJbWlpbWNvbTsJCS8qIDB4LjUyNCAtIE1JSSBNYW5hZ2VtZW50IENvbW1hbmQgUmVnaXN0ZXIgKi8KKwl1MzIJbWlpbWFkZDsJCS8qIDB4LjUyOCAtIE1JSSBNYW5hZ2VtZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1MzIJbWlpbWNvbjsJCS8qIDB4LjUyYyAtIE1JSSBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1MzIJbWlpbXN0YXQ7CQkvKiAweC41MzAgLSBNSUkgTWFuYWdlbWVudCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1MzIJbWlpbWluZDsJCS8qIDB4LjUzNCAtIE1JSSBNYW5hZ2VtZW50IEluZGljYXRvciBSZWdpc3RlciAqLworCXU4CXJlczE5WzRdOworCXUzMglpZnN0YXQ7CQkJLyogMHguNTNjIC0gSW50ZXJmYWNlIFN0YXR1cyBSZWdpc3RlciAqLworCXUzMgltYWNzdG5hZGRyMTsJCS8qIDB4LjU0MCAtIFN0YXRpb24gQWRkcmVzcyBQYXJ0IDEgUmVnaXN0ZXIgKi8KKwl1MzIJbWFjc3RuYWRkcjI7CQkvKiAweC41NDQgLSBTdGF0aW9uIEFkZHJlc3MgUGFydCAyIFJlZ2lzdGVyICovCisJdTgJcmVzMjBbMzEyXTsKKwlzdHJ1Y3Qgcm1vbl9taWIJcm1vbjsKKwl1OAlyZXMyMVsxOTJdOworCXUzMglpYWRkcjA7CQkJLyogMHguODAwIC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgMCAqLworCXUzMglpYWRkcjE7CQkJLyogMHguODA0IC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgMSAqLworCXUzMglpYWRkcjI7CQkJLyogMHguODA4IC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgMiAqLworCXUzMglpYWRkcjM7CQkJLyogMHguODBjIC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgMyAqLworCXUzMglpYWRkcjQ7CQkJLyogMHguODEwIC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgNCAqLworCXUzMglpYWRkcjU7CQkJLyogMHguODE0IC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgNSAqLworCXUzMglpYWRkcjY7CQkJLyogMHguODE4IC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgNiAqLworCXUzMglpYWRkcjc7CQkJLyogMHguODFjIC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgNyAqLworCXU4CXJlczIyWzk2XTsKKwl1MzIJZ2FkZHIwOwkJCS8qIDB4Ljg4MCAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDAgKi8KKwl1MzIJZ2FkZHIxOwkJCS8qIDB4Ljg4NCAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDEgKi8KKwl1MzIJZ2FkZHIyOwkJCS8qIDB4Ljg4OCAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KKwl1MzIJZ2FkZHIzOwkJCS8qIDB4Ljg4YyAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDMgKi8KKwl1MzIJZ2FkZHI0OwkJCS8qIDB4Ljg5MCAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDQgKi8KKwl1MzIJZ2FkZHI1OwkJCS8qIDB4Ljg5NCAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDUgKi8KKwl1MzIJZ2FkZHI2OwkJCS8qIDB4Ljg5OCAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDYgKi8KKwl1MzIJZ2FkZHI3OwkJCS8qIDB4Ljg5YyAtIEdsb2JhbCBhZGRyZXNzIHJlZ2lzdGVyIDcgKi8KKwl1OAlyZXMyM1s4NTZdOworCXUzMglhdHRyOwkJCS8qIDB4LmJmOCAtIEF0dHJpYnV0ZXMgUmVnaXN0ZXIgKi8KKwl1MzIJYXR0cmVsaTsJCS8qIDB4LmJmYyAtIEF0dHJpYnV0ZXMgRXh0cmFjdCBMZW5ndGggYW5kIEV4dHJhY3QgSW5kZXggUmVnaXN0ZXIgKi8KKwl1OAlyZXMyNFsxMDI0XTsKKworfTsKKworLyogU3RydWN0IHN0b2xlbiBhbG1vc3QgY29tcGxldGVseSAoYW5kIHNoYW1lbGVzc2x5KSBmcm9tIHRoZSBGQ0MgZW5ldCBzb3VyY2UKKyAqIChPaywgdGhhdCdzIG5vdCBzbyB0cnVlIGFueW1vcmUsIGJ1dCB0aGVyZSBpcyBhIGZhbWlseSByZXNlbWJsZW5jZSkKKyAqIFRoZSBHRkFSIGJ1ZmZlciBkZXNjcmlwdG9ycyB0cmFjayB0aGUgcmluZyBidWZmZXJzLiAgVGhlIHJ4X2JkX2Jhc2UKKyAqIGFuZCB0eF9iZF9iYXNlIGFsd2F5cyBwb2ludCB0byB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBidWZmZXIuCisgKiBUaGUgZGlydHlfdHggdHJhY2tzIHRoZSBjdXJyZW50IGJ1ZmZlciB0aGF0IGlzIGJlaW5nIHNlbnQgYnkgdGhlCisgKiBjb250cm9sbGVyLiAgVGhlIGN1cl90eCBhbmQgZGlydHlfdHggYXJlIGVxdWFsIHVuZGVyIGJvdGggY29tcGxldGVseQorICogZW1wdHkgYW5kIGNvbXBsZXRlbHkgZnVsbCBjb25kaXRpb25zLiAgVGhlIGVtcHR5L3JlYWR5IGluZGljYXRvciBpbgorICogdGhlIGJ1ZmZlciBkZXNjcmlwdG9yIGRldGVybWluZXMgdGhlIGFjdHVhbCBjb25kaXRpb24uCisgKi8KK3N0cnVjdCBnZmFyX3ByaXZhdGUgeworCS8qIHBvaW50ZXJzIHRvIGFycmF5cyBvZiBza2J1ZmZzIGZvciB0eCBhbmQgcnggKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqKiB0eF9za2J1ZmY7CisJc3RydWN0IHNrX2J1ZmYgKiogcnhfc2tidWZmOworCisJLyogaW5kaWNlcyBwb2ludGluZyB0byB0aGUgbmV4dCBmcmVlIHNiayBpbiBza2IgYXJyYXlzICovCisJdTE2IHNrYl9jdXJ0eDsKKwl1MTYgc2tiX2N1cnJ4OworCisJLyogaW5kZXggb2YgdGhlIGZpcnN0IHNrYiB3aGljaCBoYXNuJ3QgYmVlbiB0cmFuc21pdHRlZAorCSAqIHlldC4gKi8KKwl1MTYgc2tiX2RpcnR5dHg7CisKKwkvKiBDb25maWd1cmF0aW9uIGluZm8gZm9yIHRoZSBjb2FsZXNjaW5nIGZlYXR1cmVzICovCisJdW5zaWduZWQgY2hhciB0eGNvYWxlc2Npbmc7CisJdW5zaWduZWQgc2hvcnQgdHhjb3VudDsKKwl1bnNpZ25lZCBzaG9ydCB0eHRpbWU7CisJdW5zaWduZWQgY2hhciByeGNvYWxlc2Npbmc7CisJdW5zaWduZWQgc2hvcnQgcnhjb3VudDsKKwl1bnNpZ25lZCBzaG9ydCByeHRpbWU7CisKKwkvKiBHRkFSIGFkZHJlc3NlcyAqLworCXN0cnVjdCByeGJkOCAqcnhfYmRfYmFzZTsJLyogQmFzZSBhZGRyZXNzZXMgb2YgUnggYW5kIFR4IEJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgdHhiZDggKnR4X2JkX2Jhc2U7CisJc3RydWN0IHJ4YmQ4ICpjdXJfcng7ICAgICAgICAgICAvKiBOZXh0IGZyZWUgcnggcmluZyBlbnRyeSAqLworCXN0cnVjdCB0eGJkOCAqY3VyX3R4OwkgICAgICAgIC8qIE5leHQgZnJlZSByaW5nIGVudHJ5ICovCisJc3RydWN0IHR4YmQ4ICpkaXJ0eV90eDsJCS8qIFRoZSBSaW5nIGVudHJ5IHRvIGJlIGZyZWVkLiAqLworCXN0cnVjdCBnZmFyICpyZWdzOwkvKiBQb2ludGVyIHRvIHRoZSBHRkFSIG1lbW9yeSBtYXBwZWQgUmVnaXN0ZXJzICovCisJc3RydWN0IGdmYXIgKnBoeXJlZ3M7CisJc3RydWN0IHdvcmtfc3RydWN0IHRxOworCXN0cnVjdCB0aW1lcl9saXN0IHBoeV9pbmZvX3RpbWVyOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOyAvKiBsaW51eCBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgZ2Zhcl9leHRyYV9zdGF0cyBleHRyYV9zdGF0czsKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgaW50IHJ4X2J1ZmZlcl9zaXplOworCXVuc2lnbmVkIGludCByeF9zdGFzaF9zaXplOworCXVuc2lnbmVkIGludCB0eF9yaW5nX3NpemU7CisJdW5zaWduZWQgaW50IHJ4X3Jpbmdfc2l6ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCByeGNsZWFudXBxOworCXVuc2lnbmVkIGludCByeGNsZWFuOworCisJLyogSW5mbyBzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQgYnkgYm9hcmQgc2V0dXAgY29kZSAqLworCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRUcmFuc21pdDsKKwl1bnNpZ25lZCBpbnQgaW50ZXJydXB0UmVjZWl2ZTsKKwl1bnNpZ25lZCBpbnQgaW50ZXJydXB0RXJyb3I7CisJc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqZWluZm87CisKKwlzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm87CisJaW50IG9sZHNwZWVkOworCWludCBvbGRkdXBsZXg7CisJaW50IG9sZGxpbms7Cit9OworCitleHRlcm4gaW5saW5lIHUzMiBnZmFyX3JlYWQodm9sYXRpbGUgdW5zaWduZWQgKmFkZHIpCit7CisJdTMyIHZhbDsKKwl2YWwgPSBpbl9iZTMyKGFkZHIpOworCXJldHVybiB2YWw7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCBnZmFyX3dyaXRlKHZvbGF0aWxlIHVuc2lnbmVkICphZGRyLCB1MzIgdmFsKQoreworCW91dF9iZTMyKGFkZHIsIHZhbCk7Cit9CisKK2V4dGVybiBzdHJ1Y3QgZXRodG9vbF9vcHMgKmdmYXJfb3BfYXJyYXlbXTsKKworI2VuZGlmIC8qIF9fR0lBTkZBUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfZXRodG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDQ2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9naWFuZmFyX2V0aHRvb2wuYwpAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqICBkcml2ZXJzL25ldC9naWFuZmFyX2V0aHRvb2wuYworICoKKyAqICBHaWFuZmFyIEV0aGVybmV0IERyaXZlcgorICogIEV0aHRvb2wgc3VwcG9ydCBmb3IgR2lhbmZhciBFbmV0CisgKiAgQmFzZWQgb24gZTEwMDAgZXRodG9vbCBzdXBwb3J0CisgKgorICogIEF1dGhvcjogQW5keSBGbGVtaW5nCisgKiAgTWFpbnRhaW5lcjogS3VtYXIgR2FsYSAoa3VtYXIuZ2FsYUBmcmVlc2NhbGUuY29tKQorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMsMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gCisgKiAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiAKKyAqICBieSByZWZlcmVuY2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKworI2luY2x1ZGUgImdpYW5mYXIuaCIKKworI2RlZmluZSBpc19wb3dlcl9vZl8yKHgpICAgICAgICAoKHgpICE9IDAgJiYgKCgoeCkgJiAoKHgpIC0gMSkpID09IDApKQorCitleHRlcm4gaW50IHN0YXJ0dXBfZ2ZhcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHN0b3BfZ2ZhcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGdmYXJfcmVjZWl2ZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKwordm9pZCBnZmFyX2ZpbGxfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfc3RhdHMgKmR1bW15LAorCQkgICAgIHU2NCAqIGJ1Zik7Cit2b2lkIGdmYXJfZ3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKiBidWYpOworaW50IGdmYXJfZ2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjdmFscyk7CitpbnQgZ2Zhcl9zY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmN2YWxzKTsKK3ZvaWQgZ2Zhcl9ncmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcnZhbHMpOworaW50IGdmYXJfc3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJ2YWxzKTsKK3ZvaWQgZ2Zhcl9nZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKTsKKworc3RhdGljIGNoYXIgc3RhdF9nc3RyaW5nc1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisJInJ4LWRyb3BwZWQtYnkta2VybmVsIiwKKwkicngtbGFyZ2UtZnJhbWUtZXJyb3JzIiwKKwkicngtc2hvcnQtZnJhbWUtZXJyb3JzIiwKKwkicngtbm9uLW9jdGV0LWVycm9ycyIsCisJInJ4LWNyYy1lcnJvcnMiLAorCSJyeC1vdmVycnVuLWVycm9ycyIsCisJInJ4LWJ1c3ktZXJyb3JzIiwKKwkicngtYmFiYmxpbmctZXJyb3JzIiwKKwkicngtdHJ1bmNhdGVkLWZyYW1lcyIsCisJImV0aGVybmV0LWJ1cy1lcnJvciIsCisJInR4LWJhYmJsaW5nLWVycm9ycyIsCisJInR4LXVuZGVycnVuLWVycm9ycyIsCisJInJ4LXNrYi1taXNzaW5nLWVycm9ycyIsCisJInR4LXRpbWVvdXQtZXJyb3JzIiwKKwkidHgtcngtNjQtZnJhbWVzIiwKKwkidHgtcngtNjUtMTI3LWZyYW1lcyIsCisJInR4LXJ4LTEyOC0yNTUtZnJhbWVzIiwKKwkidHgtcngtMjU2LTUxMS1mcmFtZXMiLAorCSJ0eC1yeC01MTItMTAyMy1mcmFtZXMiLAorCSJ0eC1yeC0xMDI0LTE1MTgtZnJhbWVzIiwKKwkidHgtcngtMTUxOS0xNTIyLWdvb2QtdmxhbiIsCisJInJ4LWJ5dGVzIiwKKwkicngtcGFja2V0cyIsCisJInJ4LWZjcy1lcnJvcnMiLAorCSJyZWNlaXZlLW11bHRpY2FzdC1wYWNrZXQiLAorCSJyZWNlaXZlLWJyb2FkY2FzdC1wYWNrZXQiLAorCSJyeC1jb250cm9sLWZyYW1lLXBhY2tldHMiLAorCSJyeC1wYXVzZS1mcmFtZS1wYWNrZXRzIiwKKwkicngtdW5rbm93bi1vcC1jb2RlIiwKKwkicngtYWxpZ25tZW50LWVycm9yIiwKKwkicngtZnJhbWUtbGVuZ3RoLWVycm9yIiwKKwkicngtY29kZS1lcnJvciIsCisJInJ4LWNhcnJpZXItc2Vuc2UtZXJyb3IiLAorCSJyeC11bmRlcnNpemUtcGFja2V0cyIsCisJInJ4LW92ZXJzaXplLXBhY2tldHMiLAorCSJyeC1mcmFnbWVudGVkLWZyYW1lcyIsCisJInJ4LWphYmJlci1mcmFtZXMiLAorCSJyeC1kcm9wcGVkLWZyYW1lcyIsCisJInR4LWJ5dGUtY291bnRlciIsCisJInR4LXBhY2tldHMiLAorCSJ0eC1tdWx0aWNhc3QtcGFja2V0cyIsCisJInR4LWJyb2FkY2FzdC1wYWNrZXRzIiwKKwkidHgtcGF1c2UtY29udHJvbC1mcmFtZXMiLAorCSJ0eC1kZWZlcnJhbC1wYWNrZXRzIiwKKwkidHgtZXhjZXNzaXZlLWRlZmVycmFsLXBhY2tldHMiLAorCSJ0eC1zaW5nbGUtY29sbGlzaW9uLXBhY2tldHMiLAorCSJ0eC1tdWx0aXBsZS1jb2xsaXNpb24tcGFja2V0cyIsCisJInR4LWxhdGUtY29sbGlzaW9uLXBhY2tldHMiLAorCSJ0eC1leGNlc3NpdmUtY29sbGlzaW9uLXBhY2tldHMiLAorCSJ0eC10b3RhbC1jb2xsaXNpb24iLAorCSJyZXNlcnZlZCIsCisJInR4LWRyb3BwZWQtZnJhbWVzIiwKKwkidHgtamFiYmVyLWZyYW1lcyIsCisJInR4LWZjcy1lcnJvcnMiLAorCSJ0eC1jb250cm9sLWZyYW1lcyIsCisJInR4LW92ZXJzaXplLWZyYW1lcyIsCisJInR4LXVuZGVyc2l6ZS1mcmFtZXMiLAorCSJ0eC1mcmFnbWVudGVkLWZyYW1lcyIsCit9OworCisvKiBGaWxsIGluIGFuIGFycmF5IG9mIDY0LWJpdCBzdGF0aXN0aWNzIGZyb20gdmFyaW91cyBzb3VyY2VzLgorICogVGhpcyBhcnJheSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGV0aHRvb2xfc3RhdHMKKyAqIHN0cnVjdHVyZSwgYW5kIHJldHVybmVkIHRvIHVzZXIgc3BhY2UKKyAqLwordm9pZCBnZmFyX2ZpbGxfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfc3RhdHMgKmR1bW15LCB1NjQgKiBidWYpCit7CisJaW50IGk7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyICpybW9uID0gKHUzMiAqKSAmIHByaXYtPnJlZ3MtPnJtb247CisJdTY0ICpleHRyYSA9ICh1NjQgKikgJiBwcml2LT5leHRyYV9zdGF0czsKKwlzdHJ1Y3QgZ2Zhcl9zdGF0cyAqc3RhdHMgPSAoc3RydWN0IGdmYXJfc3RhdHMgKikgYnVmOworCisJZm9yIChpID0gMDsgaSA8IEdGQVJfUk1PTl9MRU47IGkrKykgeworCQlzdGF0cy0+cm1vbltpXSA9ICh1NjQpIChybW9uW2ldKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgR0ZBUl9FWFRSQV9TVEFUU19MRU47IGkrKykgeworCQlzdGF0cy0+ZXh0cmFbaV0gPSBleHRyYVtpXTsKKwl9Cit9CisKKy8qIFJldHVybnMgdGhlIG51bWJlciBvZiBzdGF0cyAoYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RyaW5ncykgKi8KK2ludCBnZmFyX3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIEdGQVJfU1RBVFNfTEVOOworfQorCit2b2lkIGdmYXJfZ3N0cmluZ3Nfbm9ybW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICogYnVmKQoreworCW1lbWNweShidWYsIHN0YXRfZ3N0cmluZ3MsIEdGQVJfRVhUUkFfU1RBVFNfTEVOICogRVRIX0dTVFJJTkdfTEVOKTsKK30KKwordm9pZCBnZmFyX2ZpbGxfc3RhdHNfbm9ybW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAorCQlzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqZHVtbXksIHU2NCAqIGJ1ZikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1NjQgKmV4dHJhID0gKHU2NCAqKSAmIHByaXYtPmV4dHJhX3N0YXRzOworCisJZm9yIChpID0gMDsgaSA8IEdGQVJfRVhUUkFfU1RBVFNfTEVOOyBpKyspIHsKKwkJYnVmW2ldID0gZXh0cmFbaV07CisJfQorfQorCisKK2ludCBnZmFyX3N0YXRzX2NvdW50X25vcm1vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBHRkFSX0VYVFJBX1NUQVRTX0xFTjsKK30KKy8qIEZpbGxzIGluIHRoZSBkcnZpbmZvIHN0cnVjdHVyZSB3aXRoIHNvbWUgYmFzaWMgaW5mbyAqLwordm9pZCBnZmFyX2dkcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdAorCSAgICAgIGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKK3sKKwlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgRFJWX05BTUUsIEdGQVJfSU5GT1NUUl9MRU4pOworCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgZ2Zhcl9kcml2ZXJfdmVyc2lvbiwgR0ZBUl9JTkZPU1RSX0xFTik7CisJc3RybmNweShkcnZpbmZvLT5md192ZXJzaW9uLCAiTi9BIiwgR0ZBUl9JTkZPU1RSX0xFTik7CisJc3RybmNweShkcnZpbmZvLT5idXNfaW5mbywgIk4vQSIsIEdGQVJfSU5GT1NUUl9MRU4pOworCWRydmluZm8tPm5fc3RhdHMgPSBHRkFSX1NUQVRTX0xFTjsKKwlkcnZpbmZvLT50ZXN0aW5mb19sZW4gPSAwOworCWRydmluZm8tPnJlZ2R1bXBfbGVuID0gMDsKKwlkcnZpbmZvLT5lZWR1bXBfbGVuID0gMDsKK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHNldHRpbmdzIGluIHRoZSBldGh0b29sX2NtZCBzdHJ1Y3R1cmUgKi8KK2ludCBnZmFyX2dzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1aW50IGdpZ2FiaXRfc3VwcG9ydCA9IAorCQlwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19HSUdBQklUID8KKwkJCVNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCA6IDA7CisJdWludCBnaWdhYml0X2FkdmVydCA9IAorCQlwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19HSUdBQklUID8KKwkJCUFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw6IDA7CisKKwljbWQtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfMTBiYXNlVF9IYWxmCisJCQkgIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYKKwkJCSAgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbAorCQkJICB8IGdpZ2FiaXRfc3VwcG9ydCB8IFNVUFBPUlRFRF9BdXRvbmVnKTsKKworCS8qIEZvciBub3csIHdlIGFsd2F5cyBhZHZlcnRpc2UgZXZlcnl0aGluZyAqLworCWNtZC0+YWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYKKwkJCSAgICB8IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZgorCQkJICAgIHwgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsCisJCQkgICAgfCBnaWdhYml0X2FkdmVydCB8IEFEVkVSVElTRURfQXV0b25lZyk7CisKKwljbWQtPnNwZWVkID0gcHJpdi0+bWlpX2luZm8tPnNwZWVkOworCWNtZC0+ZHVwbGV4ID0gcHJpdi0+bWlpX2luZm8tPmR1cGxleDsKKwljbWQtPnBvcnQgPSBQT1JUX01JSTsKKwljbWQtPnBoeV9hZGRyZXNzID0gcHJpdi0+bWlpX2luZm8tPm1paV9pZDsKKwljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKwljbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwljbWQtPm1heHR4cGt0ID0gcHJpdi0+dHhjb3VudDsKKwljbWQtPm1heHJ4cGt0ID0gcHJpdi0+cnhjb3VudDsKKworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc3RydWN0dXJlICovCitpbnQgZ2Zhcl9yZWdsZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gc2l6ZW9mIChzdHJ1Y3QgZ2Zhcik7Cit9CisKKy8qIFJldHVybiBhIGR1bXAgb2YgdGhlIEdGQVIgcmVnaXN0ZXIgc3BhY2UgKi8KK3ZvaWQgZ2Zhcl9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpyZWdidWYpCit7CisJaW50IGk7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyICp0aGVyZWdzID0gKHUzMiAqKSBwcml2LT5yZWdzOworCXUzMiAqYnVmID0gKHUzMiAqKSByZWdidWY7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgZ2ZhcikgLyBzaXplb2YgKHUzMik7IGkrKykKKwkJYnVmW2ldID0gdGhlcmVnc1tpXTsKK30KKworLyogRmlsbCBpbiBhIGJ1ZmZlciB3aXRoIHRoZSBzdHJpbmdzIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlCisgKiBzdGF0cyAqLwordm9pZCBnZmFyX2dzdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICogYnVmKQoreworCW1lbWNweShidWYsIHN0YXRfZ3N0cmluZ3MsIEdGQVJfU1RBVFNfTEVOICogRVRIX0dTVFJJTkdfTEVOKTsKK30KKworLyogQ29udmVydCBtaWNyb3NlY29uZHMgdG8gZXRoZXJuZXQgY2xvY2sgdGlja3MsIHdoaWNoIGNoYW5nZXMKKyAqIGRlcGVuZGluZyBvbiB3aGF0IHNwZWVkIHRoZSBjb250cm9sbGVyIGlzIHJ1bm5pbmcgYXQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2Zhcl91c2VjczJ0aWNrcyhzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2LCB1bnNpZ25lZCBpbnQgdXNlY3MpCit7CisJdW5zaWduZWQgaW50IGNvdW50OworCisJLyogVGhlIHRpbWVyIGlzIGRpZmZlcmVudCwgZGVwZW5kaW5nIG9uIHRoZSBpbnRlcmZhY2Ugc3BlZWQgKi8KKwlzd2l0Y2ggKHByaXYtPm1paV9pbmZvLT5zcGVlZCkgeworCWNhc2UgMTAwMDoKKwkJY291bnQgPSBHRkFSX0dCSVRfVElNRTsKKwkJYnJlYWs7CisJY2FzZSAxMDA6CisJCWNvdW50ID0gR0ZBUl8xMDBfVElNRTsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwlkZWZhdWx0OgorCQljb3VudCA9IEdGQVJfMTBfVElNRTsKKwkJYnJlYWs7CisJfQorCisJLyogTWFrZSBzdXJlIHdlIHJldHVybiBhIG51bWJlciBncmVhdGVyIHRoYW4gMAorCSAqIGlmIHVzZWNzID4gMCAqLworCXJldHVybiAoKHVzZWNzICogMTAwMCArIGNvdW50IC0gMSkgLyBjb3VudCk7Cit9CisKKy8qIENvbnZlcnQgZXRoZXJuZXQgY2xvY2sgdGlja3MgdG8gbWljcm9zZWNvbmRzICovCitzdGF0aWMgdW5zaWduZWQgaW50IGdmYXJfdGlja3MydXNlY3Moc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgaW50IHRpY2tzKQoreworCXVuc2lnbmVkIGludCBjb3VudDsKKworCS8qIFRoZSB0aW1lciBpcyBkaWZmZXJlbnQsIGRlcGVuZGluZyBvbiB0aGUgaW50ZXJmYWNlIHNwZWVkICovCisJc3dpdGNoIChwcml2LT5taWlfaW5mby0+c3BlZWQpIHsKKwljYXNlIDEwMDA6CisJCWNvdW50ID0gR0ZBUl9HQklUX1RJTUU7CisJCWJyZWFrOworCWNhc2UgMTAwOgorCQljb3VudCA9IEdGQVJfMTAwX1RJTUU7CisJCWJyZWFrOworCWNhc2UgMTA6CisJZGVmYXVsdDoKKwkJY291bnQgPSBHRkFSXzEwX1RJTUU7CisJCWJyZWFrOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSByZXR1cm4gYSBudW1iZXIgZ3JlYXRlciB0aGFuIDAgKi8KKwkvKiBpZiB0aWNrcyBpcyA+IDAgKi8KKwlyZXR1cm4gKCh0aWNrcyAqIGNvdW50KSAvIDEwMDApOworfQorCisvKiBHZXQgdGhlIGNvYWxlc2NpbmcgcGFyYW1ldGVycywgYW5kIHB1dCB0aGVtIGluIHRoZSBjdmFscworICogc3RydWN0dXJlLiAgKi8KK2ludCBnZmFyX2djb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY3ZhbHMpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwljdmFscy0+cnhfY29hbGVzY2VfdXNlY3MgPSBnZmFyX3RpY2tzMnVzZWNzKHByaXYsIHByaXYtPnJ4dGltZSk7CisJY3ZhbHMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gcHJpdi0+cnhjb3VudDsKKworCWN2YWxzLT50eF9jb2FsZXNjZV91c2VjcyA9IGdmYXJfdGlja3MydXNlY3MocHJpdiwgcHJpdi0+dHh0aW1lKTsKKwljdmFscy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPSBwcml2LT50eGNvdW50OworCisJY3ZhbHMtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSA9IDA7CisJY3ZhbHMtPnVzZV9hZGFwdGl2ZV90eF9jb2FsZXNjZSA9IDA7CisKKwljdmFscy0+cGt0X3JhdGVfbG93ID0gMDsKKwljdmFscy0+cnhfY29hbGVzY2VfdXNlY3NfbG93ID0gMDsKKwljdmFscy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfbG93ID0gMDsKKwljdmFscy0+dHhfY29hbGVzY2VfdXNlY3NfbG93ID0gMDsKKwljdmFscy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfbG93ID0gMDsKKworCS8qIFdoZW4gdGhlIHBhY2tldCByYXRlIGlzIGJlbG93IHBrdF9yYXRlX2hpZ2ggYnV0IGFib3ZlCisJICogcGt0X3JhdGVfbG93IChib3RoIG1lYXN1cmVkIGluIHBhY2tldHMgcGVyIHNlY29uZCkgdGhlCisJICogbm9ybWFsIHtyeCx0eH1fKiBjb2FsZXNjaW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQuCisJICovCisKKwkvKiBXaGVuIHRoZSBwYWNrZXQgcmF0ZSBpcyAobWVhc3VyZWQgaW4gcGFja2V0cyBwZXIgc2Vjb25kKQorCSAqIGlzIGFib3ZlIHBrdF9yYXRlX2hpZ2gsIHRoZSB7cngsdHh9XypfaGlnaCBwYXJhbWV0ZXJzIGFyZQorCSAqIHVzZWQuCisJICovCisJY3ZhbHMtPnBrdF9yYXRlX2hpZ2ggPSAwOworCWN2YWxzLT5yeF9jb2FsZXNjZV91c2Vjc19oaWdoID0gMDsKKwljdmFscy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaGlnaCA9IDA7CisJY3ZhbHMtPnR4X2NvYWxlc2NlX3VzZWNzX2hpZ2ggPSAwOworCWN2YWxzLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19oaWdoID0gMDsKKworCS8qIEhvdyBvZnRlbiB0byBkbyBhZGFwdGl2ZSBjb2FsZXNjaW5nIHBhY2tldCByYXRlIHNhbXBsaW5nLAorCSAqIG1lYXN1cmVkIGluIHNlY29uZHMuICBNdXN0IG5vdCBiZSB6ZXJvLgorCSAqLworCWN2YWxzLT5yYXRlX3NhbXBsZV9pbnRlcnZhbCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhbmdlIHRoZSBjb2FsZXNjaW5nIHZhbHVlcy4KKyAqIEJvdGggY3ZhbHMtPipfdXNlY3MgYW5kIGN2YWxzLT4qX2ZyYW1lcyBoYXZlIHRvIGJlID4gMAorICogaW4gb3JkZXIgZm9yIGNvYWxlc2NpbmcgdG8gYmUgYWN0aXZlCisgKi8KK2ludCBnZmFyX3Njb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY3ZhbHMpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBTZXQgdXAgcnggY29hbGVzY2luZyAqLworCWlmICgoY3ZhbHMtPnJ4X2NvYWxlc2NlX3VzZWNzID09IDApIHx8CisJICAgIChjdmFscy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPT0gMCkpCisJCXByaXYtPnJ4Y29hbGVzY2luZyA9IDA7CisJZWxzZQorCQlwcml2LT5yeGNvYWxlc2NpbmcgPSAxOworCisJcHJpdi0+cnh0aW1lID0gZ2Zhcl91c2VjczJ0aWNrcyhwcml2LCBjdmFscy0+cnhfY29hbGVzY2VfdXNlY3MpOworCXByaXYtPnJ4Y291bnQgPSBjdmFscy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXM7CisKKwkvKiBTZXQgdXAgdHggY29hbGVzY2luZyAqLworCWlmICgoY3ZhbHMtPnR4X2NvYWxlc2NlX3VzZWNzID09IDApIHx8CisJICAgIChjdmFscy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPT0gMCkpCisJCXByaXYtPnR4Y29hbGVzY2luZyA9IDA7CisJZWxzZQorCQlwcml2LT50eGNvYWxlc2NpbmcgPSAxOworCisJcHJpdi0+dHh0aW1lID0gZ2Zhcl91c2VjczJ0aWNrcyhwcml2LCBjdmFscy0+dHhfY29hbGVzY2VfdXNlY3MpOworCXByaXYtPnR4Y291bnQgPSBjdmFscy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXM7CisKKwlpZiAocHJpdi0+cnhjb2FsZXNjaW5nKQorCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5yeGljLAorCQkJICAgbWtfaWNfdmFsdWUocHJpdi0+cnhjb3VudCwgcHJpdi0+cnh0aW1lKSk7CisJZWxzZQorCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5yeGljLCAwKTsKKworCWlmIChwcml2LT50eGNvYWxlc2NpbmcpCisJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnR4aWMsCisJCQkgICBta19pY192YWx1ZShwcml2LT50eGNvdW50LCBwcml2LT50eHRpbWUpKTsKKwllbHNlCisJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnR4aWMsIDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbGxzIGluIHJ2YWxzIHdpdGggdGhlIGN1cnJlbnQgcmluZyBwYXJhbWV0ZXJzLiAgQ3VycmVudGx5LAorICogcngsIHJ4X21pbmksIGFuZCByeF9qdW1ibyByaW5ncyBhcmUgdGhlIHNhbWUgc2l6ZSwgYXMgbWluaSBhbmQKKyAqIGp1bWJvIGFyZSBpZ25vcmVkIGJ5IHRoZSBkcml2ZXIgKi8KK3ZvaWQgZ2Zhcl9ncmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcnZhbHMpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlydmFscy0+cnhfbWF4X3BlbmRpbmcgPSBHRkFSX1JYX01BWF9SSU5HX1NJWkU7CisJcnZhbHMtPnJ4X21pbmlfbWF4X3BlbmRpbmcgPSBHRkFSX1JYX01BWF9SSU5HX1NJWkU7CisJcnZhbHMtPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gR0ZBUl9SWF9NQVhfUklOR19TSVpFOworCXJ2YWxzLT50eF9tYXhfcGVuZGluZyA9IEdGQVJfVFhfTUFYX1JJTkdfU0laRTsKKworCS8qIFZhbHVlcyBjaGFuZ2VhYmxlIGJ5IHRoZSB1c2VyLiAgVGhlIHZhbGlkIHZhbHVlcyBhcmUKKwkgKiBpbiB0aGUgcmFuZ2UgMSB0byB0aGUgIipfbWF4X3BlbmRpbmciIGNvdW50ZXJwYXJ0IGFib3ZlLgorCSAqLworCXJ2YWxzLT5yeF9wZW5kaW5nID0gcHJpdi0+cnhfcmluZ19zaXplOworCXJ2YWxzLT5yeF9taW5pX3BlbmRpbmcgPSBwcml2LT5yeF9yaW5nX3NpemU7CisJcnZhbHMtPnJ4X2p1bWJvX3BlbmRpbmcgPSBwcml2LT5yeF9yaW5nX3NpemU7CisJcnZhbHMtPnR4X3BlbmRpbmcgPSBwcml2LT50eF9yaW5nX3NpemU7Cit9CisKKy8qIENoYW5nZSB0aGUgY3VycmVudCByaW5nIHBhcmFtZXRlcnMsIHN0b3BwaW5nIHRoZSBjb250cm9sbGVyIGlmCisgKiBuZWNlc3Nhcnkgc28gdGhhdCB3ZSBkb24ndCBtZXNzIHRoaW5ncyB1cCB3aGlsZSB3ZSdyZSBpbgorICogbW90aW9uLiAgV2Ugd2FpdCBmb3IgdGhlIHJpbmcgdG8gYmUgY2xlYW4gYmVmb3JlIHJlYWxsb2NhdGluZworICogdGhlIHJpbmdzLiAqLworaW50IGdmYXJfc3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJ2YWxzKQoreworCXUzMiB0ZW1wdmFsOworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnIgPSAwOworCisJaWYgKHJ2YWxzLT5yeF9wZW5kaW5nID4gR0ZBUl9SWF9NQVhfUklOR19TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghaXNfcG93ZXJfb2ZfMihydmFscy0+cnhfcGVuZGluZykpIHsKKwkJcHJpbnRrKCIlczogUmluZyBzaXplcyBtdXN0IGJlIGEgcG93ZXIgb2YgMlxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocnZhbHMtPnR4X3BlbmRpbmcgPiBHRkFSX1RYX01BWF9SSU5HX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFpc19wb3dlcl9vZl8yKHJ2YWxzLT50eF9wZW5kaW5nKSkgeworCQlwcmludGsoIiVzOiBSaW5nIHNpemVzIG11c3QgYmUgYSBwb3dlciBvZiAyXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFN0b3AgdGhlIGNvbnRyb2xsZXIgc28gd2UgZG9uJ3QgcnggYW55IG1vcmUgZnJhbWVzICovCisJLyogQnV0IGZpcnN0LCBtYWtlIHN1cmUgd2UgY2xlYXIgdGhlIGJpdHMgKi8KKwl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5kbWFjdHJsKTsKKwl0ZW1wdmFsICY9IH4oRE1BQ1RSTF9HUlMgfCBETUFDVFJMX0dUUyk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+ZG1hY3RybCwgdGVtcHZhbCk7CisKKwl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5kbWFjdHJsKTsKKwl0ZW1wdmFsIHw9IChETUFDVFJMX0dSUyB8IERNQUNUUkxfR1RTKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5kbWFjdHJsLCB0ZW1wdmFsKTsKKworCXdoaWxlICghKGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+aWV2ZW50KSAmIChJRVZFTlRfR1JTQyB8IElFVkVOVF9HVFNDKSkpCisJCWNwdV9yZWxheCgpOworCisJLyogTm90ZSB0aGF0IHJ4IGlzIG5vdCBjbGVhbiByaWdodCBub3cgKi8KKwlwcml2LT5yeGNsZWFuID0gMDsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCS8qIFRlbGwgdGhlIGRyaXZlciB0byBwcm9jZXNzIHRoZSByZXN0IG9mIHRoZSBmcmFtZXMgKi8KKwkJZ2Zhcl9yZWNlaXZlKDAsICh2b2lkICopIGRldiwgTlVMTCk7CisKKwkJLyogTm93IHdhaXQgZm9yIGl0IHRvIGJlIGRvbmUgKi8KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHByaXYtPnJ4Y2xlYW51cHEsIHByaXYtPnJ4Y2xlYW4pOworCisJCS8qIE9rLCBhbGwgcGFja2V0cyBoYXZlIGJlZW4gaGFuZGxlZC4gIE5vdyB3ZSBicmluZyBpdCBkb3duLAorCQkgKiBjaGFuZ2UgdGhlIHJpbmcgc2l6ZSwgYW5kIGJyaW5nIGl0IHVwICovCisKKwkJc3RvcF9nZmFyKGRldik7CisJfQorCisJcHJpdi0+cnhfcmluZ19zaXplID0gcnZhbHMtPnJ4X3BlbmRpbmc7CisJcHJpdi0+dHhfcmluZ19zaXplID0gcnZhbHMtPnR4X3BlbmRpbmc7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJZXJyID0gc3RhcnR1cF9nZmFyKGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgZXRodG9vbF9vcHMgZ2Zhcl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0gZ2Zhcl9nc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvID0gZ2Zhcl9nZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuID0gZ2Zhcl9yZWdsZW4sCisJLmdldF9yZWdzID0gZ2Zhcl9nZXRfcmVncywKKwkuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfY29hbGVzY2UgPSBnZmFyX2djb2FsZXNjZSwKKwkuc2V0X2NvYWxlc2NlID0gZ2Zhcl9zY29hbGVzY2UsCisJLmdldF9yaW5ncGFyYW0gPSBnZmFyX2dyaW5ncGFyYW0sCisJLnNldF9yaW5ncGFyYW0gPSBnZmFyX3NyaW5ncGFyYW0sCisJLmdldF9zdHJpbmdzID0gZ2Zhcl9nc3RyaW5ncywKKwkuZ2V0X3N0YXRzX2NvdW50ID0gZ2Zhcl9zdGF0c19jb3VudCwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMgPSBnZmFyX2ZpbGxfc3RhdHMsCit9OworCitzdHJ1Y3QgZXRodG9vbF9vcHMgZ2Zhcl9ub3Jtb25fbm9jb2FsZXNjZV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0gZ2Zhcl9nc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvID0gZ2Zhcl9nZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuID0gZ2Zhcl9yZWdsZW4sCisJLmdldF9yZWdzID0gZ2Zhcl9nZXRfcmVncywKKwkuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfcmluZ3BhcmFtID0gZ2Zhcl9ncmluZ3BhcmFtLAorCS5zZXRfcmluZ3BhcmFtID0gZ2Zhcl9zcmluZ3BhcmFtLAorCS5nZXRfc3RyaW5ncyA9IGdmYXJfZ3N0cmluZ3Nfbm9ybW9uLAorCS5nZXRfc3RhdHNfY291bnQgPSBnZmFyX3N0YXRzX2NvdW50X25vcm1vbiwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMgPSBnZmFyX2ZpbGxfc3RhdHNfbm9ybW9uLAorfTsKKworc3RydWN0IGV0aHRvb2xfb3BzIGdmYXJfbm9jb2FsZXNjZV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0gZ2Zhcl9nc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvID0gZ2Zhcl9nZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuID0gZ2Zhcl9yZWdsZW4sCisJLmdldF9yZWdzID0gZ2Zhcl9nZXRfcmVncywKKwkuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfcmluZ3BhcmFtID0gZ2Zhcl9ncmluZ3BhcmFtLAorCS5zZXRfcmluZ3BhcmFtID0gZ2Zhcl9zcmluZ3BhcmFtLAorCS5nZXRfc3RyaW5ncyA9IGdmYXJfZ3N0cmluZ3MsCisJLmdldF9zdGF0c19jb3VudCA9IGdmYXJfc3RhdHNfY291bnQsCisJLmdldF9ldGh0b29sX3N0YXRzID0gZ2Zhcl9maWxsX3N0YXRzLAorfTsKKworc3RydWN0IGV0aHRvb2xfb3BzIGdmYXJfbm9ybW9uX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MgPSBnZmFyX2dzZXR0aW5ncywKKwkuZ2V0X2RydmluZm8gPSBnZmFyX2dkcnZpbmZvLAorCS5nZXRfcmVnc19sZW4gPSBnZmFyX3JlZ2xlbiwKKwkuZ2V0X3JlZ3MgPSBnZmFyX2dldF9yZWdzLAorCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9jb2FsZXNjZSA9IGdmYXJfZ2NvYWxlc2NlLAorCS5zZXRfY29hbGVzY2UgPSBnZmFyX3Njb2FsZXNjZSwKKwkuZ2V0X3JpbmdwYXJhbSA9IGdmYXJfZ3JpbmdwYXJhbSwKKwkuc2V0X3JpbmdwYXJhbSA9IGdmYXJfc3JpbmdwYXJhbSwKKwkuZ2V0X3N0cmluZ3MgPSBnZmFyX2dzdHJpbmdzX25vcm1vbiwKKwkuZ2V0X3N0YXRzX2NvdW50ID0gZ2Zhcl9zdGF0c19jb3VudF9ub3Jtb24sCisJLmdldF9ldGh0b29sX3N0YXRzID0gZ2Zhcl9maWxsX3N0YXRzX25vcm1vbiwKK307CisKK3N0cnVjdCBldGh0b29sX29wcyAqZ2Zhcl9vcF9hcnJheVtdID0geworCSZnZmFyX2V0aHRvb2xfb3BzLAorCSZnZmFyX25vcm1vbl9ldGh0b29sX29wcywKKwkmZ2Zhcl9ub2NvYWxlc2NlX2V0aHRvb2xfb3BzLAorCSZnZmFyX25vcm1vbl9ub2NvYWxlc2NlX2V0aHRvb2xfb3BzCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhcl9waHkuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfcGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiMTZhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfcGh5LmMKQEAgLTAsMCArMSw2NjEgQEAKKy8qIAorICogZHJpdmVycy9uZXQvZ2lhbmZhcl9waHkuYworICoKKyAqIEdpYW5mYXIgRXRoZXJuZXQgRHJpdmVyIC0tIFBIWSBoYW5kbGluZworICogRHJpdmVyIGZvciBGRUMgb24gTVBDODU0MCBhbmQgVFNFQyBvbiBNUEM4NTQwL01QQzg1NjAKKyAqIEJhc2VkIG9uIDgyNjBfaW8vZmNjX2VuZXQuYworICoKKyAqIEF1dGhvcjogQW5keSBGbGVtaW5nCisgKiBNYWludGFpbmVyOiBLdW1hciBHYWxhIChrdW1hci5nYWxhQGZyZWVzY2FsZS5jb20pCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorCisjaW5jbHVkZSAiZ2lhbmZhci5oIgorI2luY2x1ZGUgImdpYW5mYXJfcGh5LmgiCisKK3N0YXRpYyB2b2lkIGNvbmZpZ19nZW5taWlfYWR2ZXJ0KHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbyk7CitzdGF0aWMgdm9pZCBnZW5taWlfc2V0dXBfZm9yY2VkKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbyk7CitzdGF0aWMgdm9pZCBnZW5taWlfcmVzdGFydF9hbmVnKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbyk7CitzdGF0aWMgaW50IGdiaXRfY29uZmlnX2FuZWcoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKTsKK3N0YXRpYyBpbnQgZ2VubWlpX2NvbmZpZ19hbmVnKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbyk7CitzdGF0aWMgaW50IGdlbm1paV91cGRhdGVfbGluayhzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pOworc3RhdGljIGludCBnZW5taWlfcmVhZF9zdGF0dXMoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKTsKK3UxNiBwaHlfcmVhZChzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8sIHUxNiByZWdudW0pOwordm9pZCBwaHlfd3JpdGUoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvLCB1MTYgcmVnbnVtLCB1MTYgdmFsKTsKKworLyogV3JpdGUgdmFsdWUgdG8gdGhlIFBIWSBmb3IgdGhpcyBkZXZpY2UgdG8gdGhlIHJlZ2lzdGVyIGF0IHJlZ251bSwgKi8KKy8qIHdhaXRpbmcgdW50aWwgdGhlIHdyaXRlIGlzIGRvbmUgYmVmb3JlIGl0IHJldHVybnMuICBBbGwgUEhZICovCisvKiBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIHRocm91Z2ggdGhlIFRTRUMxIE1JSU0gcmVncyAqLwordm9pZCB3cml0ZV9waHlfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWdudW0sIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZ2ZhciAqcmVnYmFzZSA9IHByaXYtPnBoeXJlZ3M7CisKKwkvKiBTZXQgdGhlIFBIWSBhZGRyZXNzIGFuZCB0aGUgcmVnaXN0ZXIgYWRkcmVzcyB3ZSB3YW50IHRvIHdyaXRlICovCisJZ2Zhcl93cml0ZSgmcmVnYmFzZS0+bWlpbWFkZCwgKG1paV9pZCA8PCA4KSB8IHJlZ251bSk7CisKKwkvKiBXcml0ZSBvdXQgdGhlIHZhbHVlIHdlIHdhbnQgKi8KKwlnZmFyX3dyaXRlKCZyZWdiYXNlLT5taWltY29uLCB2YWx1ZSk7CisKKwkvKiBXYWl0IGZvciB0aGUgdHJhbnNhY3Rpb24gdG8gZmluaXNoICovCisJd2hpbGUgKGdmYXJfcmVhZCgmcmVnYmFzZS0+bWlpbWluZCkgJiBNSUlNSU5EX0JVU1kpCisJCWNwdV9yZWxheCgpOworfQorCisvKiBSZWFkcyBmcm9tIHJlZ2lzdGVyIHJlZ251bSBpbiB0aGUgUEhZIGZvciBkZXZpY2UgZGV2LCAqLworLyogcmV0dXJuaW5nIHRoZSB2YWx1ZS4gIENsZWFycyBtaWltY29tIGZpcnN0LiAgQWxsIFBIWSAqLworLyogY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSB0aHJvdWdoIHRoZSBUU0VDMSBNSUlNIHJlZ3MgKi8KK2ludCByZWFkX3BoeV9yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZ251bSkKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZ2ZhciAqcmVnYmFzZSA9IHByaXYtPnBoeXJlZ3M7CisJdTE2IHZhbHVlOworCisJLyogU2V0IHRoZSBQSFkgYWRkcmVzcyBhbmQgdGhlIHJlZ2lzdGVyIGFkZHJlc3Mgd2Ugd2FudCB0byByZWFkICovCisJZ2Zhcl93cml0ZSgmcmVnYmFzZS0+bWlpbWFkZCwgKG1paV9pZCA8PCA4KSB8IHJlZ251bSk7CisKKwkvKiBDbGVhciBtaWltY29tLCBhbmQgdGhlbiBpbml0aWF0ZSBhIHJlYWQgKi8KKwlnZmFyX3dyaXRlKCZyZWdiYXNlLT5taWltY29tLCAwKTsKKwlnZmFyX3dyaXRlKCZyZWdiYXNlLT5taWltY29tLCBNSUlfUkVBRF9DT01NQU5EKTsKKworCS8qIFdhaXQgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBmaW5pc2ggKi8KKwl3aGlsZSAoZ2Zhcl9yZWFkKCZyZWdiYXNlLT5taWltaW5kKSAmIChNSUlNSU5EX05PVFZBTElEIHwgTUlJTUlORF9CVVNZKSkKKwkJY3B1X3JlbGF4KCk7CisKKwkvKiBHcmFiIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgZnJvbSBtaWltc3RhdCAqLworCXZhbHVlID0gZ2Zhcl9yZWFkKCZyZWdiYXNlLT5taWltc3RhdCk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3ZvaWQgbWlpX2NsZWFyX3BoeV9pbnRlcnJ1cHQoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKQoreworCWlmKG1paV9pbmZvLT5waHlpbmZvLT5hY2tfaW50ZXJydXB0KQorCQltaWlfaW5mby0+cGh5aW5mby0+YWNrX2ludGVycnVwdChtaWlfaW5mbyk7Cit9CisKKwordm9pZCBtaWlfY29uZmlndXJlX3BoeV9pbnRlcnJ1cHQoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvLCB1MzIgaW50ZXJydXB0cykKK3sKKwltaWlfaW5mby0+aW50ZXJydXB0cyA9IGludGVycnVwdHM7CisJaWYobWlpX2luZm8tPnBoeWluZm8tPmNvbmZpZ19pbnRyKQorCQltaWlfaW5mby0+cGh5aW5mby0+Y29uZmlnX2ludHIobWlpX2luZm8pOworfQorCisKKy8qIFdyaXRlcyBNSUlfQURWRVJUSVNFIHdpdGggdGhlIGFwcHJvcHJpYXRlIHZhbHVlcywgYWZ0ZXIKKyAqIHNhbml0aXppbmcgYWR2ZXJ0aXNlIHRvIG1ha2Ugc3VyZSBvbmx5IHN1cHBvcnRlZCBmZWF0dXJlcworICogYXJlIGFkdmVydGlzZWQgCisgKi8KK3N0YXRpYyB2b2lkIGNvbmZpZ19nZW5taWlfYWR2ZXJ0KHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwl1MzIgYWR2ZXJ0aXNlOworCXUxNiBhZHY7CisKKwkvKiBPbmx5IGFsbG93IGFkdmVydGlzaW5nIHdoYXQgdGhpcyBQSFkgc3VwcG9ydHMgKi8KKwltaWlfaW5mby0+YWR2ZXJ0aXNpbmcgJj0gbWlpX2luZm8tPnBoeWluZm8tPmZlYXR1cmVzOworCWFkdmVydGlzZSA9IG1paV9pbmZvLT5hZHZlcnRpc2luZzsKKworCS8qIFNldHVwIHN0YW5kYXJkIGFkdmVydGlzZW1lbnQgKi8KKwlhZHYgPSBwaHlfcmVhZChtaWlfaW5mbywgTUlJX0FEVkVSVElTRSk7CisJYWR2ICY9IH4oQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV8xMDBCQVNFNCk7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwSEFMRjsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTBGVUxMOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJcGh5X3dyaXRlKG1paV9pbmZvLCBNSUlfQURWRVJUSVNFLCBhZHYpOworfQorCitzdGF0aWMgdm9pZCBnZW5taWlfc2V0dXBfZm9yY2VkKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwl1MTYgY3RybDsKKwl1MzIgZmVhdHVyZXMgPSBtaWlfaW5mby0+cGh5aW5mby0+ZmVhdHVyZXM7CisJCisJY3RybCA9IHBoeV9yZWFkKG1paV9pbmZvLCBNSUlfQk1DUik7CisKKwljdHJsICY9IH4oQk1DUl9GVUxMRFBMWHxCTUNSX1NQRUVEMTAwfEJNQ1JfU1BFRUQxMDAwfEJNQ1JfQU5FTkFCTEUpOworCWN0cmwgfD0gQk1DUl9SRVNFVDsKKworCXN3aXRjaChtaWlfaW5mby0+c3BlZWQpIHsKKwkJY2FzZSBTUEVFRF8xMDAwOgorCQkJaWYoZmVhdHVyZXMgJiAoU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmCisJCQkJCQl8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkpIHsKKwkJCQljdHJsIHw9IEJNQ1JfU1BFRUQxMDAwOworCQkJCWJyZWFrOworCQkJfQorCQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTAwOworCQljYXNlIFNQRUVEXzEwMDoKKwkJCWlmIChmZWF0dXJlcyAmIChTVVBQT1JURURfMTAwYmFzZVRfSGFsZgorCQkJCQkJfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCkpIHsKKwkJCQljdHJsIHw9IEJNQ1JfU1BFRUQxMDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQltaWlfaW5mby0+c3BlZWQgPSBTUEVFRF8xMDsKKwkJY2FzZSBTUEVFRF8xMDoKKwkJCWlmIChmZWF0dXJlcyAmIChTVVBQT1JURURfMTBiYXNlVF9IYWxmCisJCQkJCQl8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwpKQorCQkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBVbnN1cHBvcnRlZCBzcGVlZCEgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEJhZCBzcGVlZCFcbiIsIAorCQkJCQltaWlfaW5mby0+ZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCX0KKworCXBoeV93cml0ZShtaWlfaW5mbywgTUlJX0JNQ1IsIGN0cmwpOworfQorCisKKy8qIEVuYWJsZSBhbmQgUmVzdGFydCBBdXRvbmVnb3RpYXRpb24gKi8KK3N0YXRpYyB2b2lkIGdlbm1paV9yZXN0YXJ0X2FuZWcoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKQoreworCXUxNiBjdGw7CisKKwljdGwgPSBwaHlfcmVhZChtaWlfaW5mbywgTUlJX0JNQ1IpOworCWN0bCB8PSAoQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKwlwaHlfd3JpdGUobWlpX2luZm8sIE1JSV9CTUNSLCBjdGwpOworfQorCisKK3N0YXRpYyBpbnQgZ2JpdF9jb25maWdfYW5lZyhzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJdTE2IGFkdjsKKwl1MzIgYWR2ZXJ0aXNlOworCisJaWYobWlpX2luZm8tPmF1dG9uZWcpIHsKKwkJLyogQ29uZmlndXJlIHRoZSBBRFZFUlRJU0UgcmVnaXN0ZXIgKi8KKwkJY29uZmlnX2dlbm1paV9hZHZlcnQobWlpX2luZm8pOworCQlhZHZlcnRpc2UgPSBtaWlfaW5mby0+YWR2ZXJ0aXNpbmc7CisKKwkJYWR2ID0gcGh5X3JlYWQobWlpX2luZm8sIE1JSV8xMDAwQkFTRVRDT05UUk9MKTsKKwkJYWR2ICY9IH4oTUlJXzEwMDBCQVNFVENPTlRST0xfRlVMTERVUExFWENBUCB8CisJCQkJTUlJXzEwMDBCQVNFVENPTlRST0xfSEFMRkRVUExFWENBUCk7CisJCWlmIChhZHZlcnRpc2UgJiBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYpCisJCQlhZHYgfD0gTUlJXzEwMDBCQVNFVENPTlRST0xfSEFMRkRVUExFWENBUDsKKwkJaWYgKGFkdmVydGlzZSAmIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkKKwkJCWFkdiB8PSBNSUlfMTAwMEJBU0VUQ09OVFJPTF9GVUxMRFVQTEVYQ0FQOworCQlwaHlfd3JpdGUobWlpX2luZm8sIE1JSV8xMDAwQkFTRVRDT05UUk9MLCBhZHYpOworCisJCS8qIFN0YXJ0L1Jlc3RhcnQgYW5lZyAqLworCQlnZW5taWlfcmVzdGFydF9hbmVnKG1paV9pbmZvKTsKKwl9IGVsc2UKKwkJZ2VubWlpX3NldHVwX2ZvcmNlZChtaWlfaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXJ2ZWxsX2NvbmZpZ19hbmVnKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwkvKiBUaGUgTWFydmVsbCBQSFkgaGFzIGFuIGVycmF0YSB3aGljaCByZXF1aXJlcworCSAqIHRoYXQgY2VydGFpbiByZWdpc3RlcnMgZ2V0IHdyaXR0ZW4gaW4gb3JkZXIKKwkgKiB0byByZXN0YXJ0IGF1dG9uZWdvdGlhdGlvbiAqLworCXBoeV93cml0ZShtaWlfaW5mbywgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCisJcGh5X3dyaXRlKG1paV9pbmZvLCAweDFkLCAweDFmKTsKKwlwaHlfd3JpdGUobWlpX2luZm8sIDB4MWUsIDB4MjAwYyk7CisJcGh5X3dyaXRlKG1paV9pbmZvLCAweDFkLCAweDUpOworCXBoeV93cml0ZShtaWlfaW5mbywgMHgxZSwgMCk7CisJcGh5X3dyaXRlKG1paV9pbmZvLCAweDFlLCAweDEwMCk7CisKKwlnYml0X2NvbmZpZ19hbmVnKG1paV9pbmZvKTsKKworCXJldHVybiAwOworfQorc3RhdGljIGludCBnZW5taWlfY29uZmlnX2FuZWcoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKQoreworCWlmIChtaWlfaW5mby0+YXV0b25lZykgeworCQljb25maWdfZ2VubWlpX2FkdmVydChtaWlfaW5mbyk7CisJCWdlbm1paV9yZXN0YXJ0X2FuZWcobWlpX2luZm8pOworCX0gZWxzZQorCQlnZW5taWlfc2V0dXBfZm9yY2VkKG1paV9pbmZvKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZ2VubWlpX3VwZGF0ZV9saW5rKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwl1MTYgc3RhdHVzOworCisJLyogRG8gYSBmYWtlIHJlYWQgKi8KKwlwaHlfcmVhZChtaWlfaW5mbywgTUlJX0JNU1IpOworCisJLyogUmVhZCBsaW5rIGFuZCBhdXRvbmVnb3RpYXRpb24gc3RhdHVzICovCisJc3RhdHVzID0gcGh5X3JlYWQobWlpX2luZm8sIE1JSV9CTVNSKTsKKwlpZiAoKHN0YXR1cyAmIEJNU1JfTFNUQVRVUykgPT0gMCkKKwkJbWlpX2luZm8tPmxpbmsgPSAwOworCWVsc2UKKwkJbWlpX2luZm8tPmxpbmsgPSAxOworCisJLyogSWYgd2UgYXJlIGF1dG9uZWdvdGlhdGluZywgYW5kIG5vdCBkb25lLCAKKwkgKiByZXR1cm4gYW4gZXJyb3IgKi8KKwlpZiAobWlpX2luZm8tPmF1dG9uZWcgJiYgIShzdGF0dXMgJiBCTVNSX0FORUdDT01QTEVURSkpCisJCXJldHVybiAtRUFHQUlOOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VubWlpX3JlYWRfc3RhdHVzKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwl1MTYgc3RhdHVzOworCWludCBlcnI7CisKKwkvKiBVcGRhdGUgdGhlIGxpbmssIGJ1dCByZXR1cm4gaWYgdGhlcmUKKwkgKiB3YXMgYW4gZXJyb3IgKi8KKwllcnIgPSBnZW5taWlfdXBkYXRlX2xpbmsobWlpX2luZm8pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAobWlpX2luZm8tPmF1dG9uZWcpIHsKKwkJc3RhdHVzID0gcGh5X3JlYWQobWlpX2luZm8sIE1JSV9MUEEpOworCisJCWlmIChzdGF0dXMgJiAoTFBBXzEwRlVMTCB8IExQQV8xMDBGVUxMKSkKKwkJCW1paV9pbmZvLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJZWxzZQorCQkJbWlpX2luZm8tPmR1cGxleCA9IERVUExFWF9IQUxGOworCQlpZiAoc3RhdHVzICYgKExQQV8xMDBGVUxMIHwgTFBBXzEwMEhBTEYpKQorCQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTAwOworCQllbHNlCisJCQltaWlfaW5mby0+c3BlZWQgPSBTUEVFRF8xMDsKKwkJbWlpX2luZm8tPnBhdXNlID0gMDsKKwl9CisJLyogT24gbm9uLWFuZWcsIHdlIGFzc3VtZSB3aGF0IHdlIHB1dCBpbiBCTUNSIGlzIHRoZSBzcGVlZCwKKwkgKiB0aG91Z2ggbWFnaWMtYW5lZyBzaG91bGRuJ3QgcHJldmVudCB0aGlzIGNhc2UgZnJvbSBvY2N1cnJpbmcKKwkgKi8KKworCXJldHVybiAwOworfQorc3RhdGljIGludCBtYXJ2ZWxsX3JlYWRfc3RhdHVzKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwl1MTYgc3RhdHVzOworCWludCBlcnI7CisKKwkvKiBVcGRhdGUgdGhlIGxpbmssIGJ1dCByZXR1cm4gaWYgdGhlcmUKKwkgKiB3YXMgYW4gZXJyb3IgKi8KKwllcnIgPSBnZW5taWlfdXBkYXRlX2xpbmsobWlpX2luZm8pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBJZiB0aGUgbGluayBpcyB1cCwgcmVhZCB0aGUgc3BlZWQgYW5kIGR1cGxleCAqLworCS8qIElmIHdlIGFyZW4ndCBhdXRvbmVnb3RpYXRpbmcsIGFzc3VtZSBzcGVlZHMgCisJICogYXJlIGFzIHNldCAqLworCWlmIChtaWlfaW5mby0+YXV0b25lZyAmJiBtaWlfaW5mby0+bGluaykgeworCQlpbnQgc3BlZWQ7CisJCXN0YXR1cyA9IHBoeV9yZWFkKG1paV9pbmZvLCBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTKTsKKworI2lmIDAKKwkJLyogSWYgc3BlZWQgYW5kIGR1cGxleCBhcmVuJ3QgcmVzb2x2ZWQsCisJCSAqIHJldHVybiBhbiBlcnJvci4gIElzbid0IHRoaXMgaGFuZGxlZAorCQkgKiBieSBjaGVja2luZyBhbmVnPworCQkgKi8KKwkJaWYgKChzdGF0dXMgJiBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTX1JFU09MVkVEKSA9PSAwKQorCQkJcmV0dXJuIC1FQUdBSU47CisjZW5kaWYKKworCQkvKiBHZXQgdGhlIGR1cGxleGl0eSAqLworCQlpZiAoc3RhdHVzICYgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU19GVUxMRFVQTEVYKQorCQkJbWlpX2luZm8tPmR1cGxleCA9IERVUExFWF9GVUxMOworCQllbHNlCisJCQltaWlfaW5mby0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisKKwkJLyogR2V0IHRoZSBzcGVlZCAqLworCQlzcGVlZCA9IHN0YXR1cyAmIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfU1BEX01BU0s7CisJCXN3aXRjaChzcGVlZCkgeworCQkJY2FzZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTXzEwMDA6CisJCQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTAwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU18xMDA6CisJCQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQltaWlfaW5mby0+c3BlZWQgPSBTUEVFRF8xMDsKKwkJCQlicmVhazsKKwkJfQorCQltaWlfaW5mby0+cGF1c2UgPSAwOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY2lzODIweF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJdTE2IHN0YXR1czsKKwlpbnQgZXJyOworCisJLyogVXBkYXRlIHRoZSBsaW5rLCBidXQgcmV0dXJuIGlmIHRoZXJlCisJICogd2FzIGFuIGVycm9yICovCisJZXJyID0gZ2VubWlpX3VwZGF0ZV9saW5rKG1paV9pbmZvKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogSWYgdGhlIGxpbmsgaXMgdXAsIHJlYWQgdGhlIHNwZWVkIGFuZCBkdXBsZXggKi8KKwkvKiBJZiB3ZSBhcmVuJ3QgYXV0b25lZ290aWF0aW5nLCBhc3N1bWUgc3BlZWRzIAorCSAqIGFyZSBhcyBzZXQgKi8KKwlpZiAobWlpX2luZm8tPmF1dG9uZWcgJiYgbWlpX2luZm8tPmxpbmspIHsKKwkJaW50IHNwZWVkOworCisJCXN0YXR1cyA9IHBoeV9yZWFkKG1paV9pbmZvLCBNSUlfQ0lTODIwMV9BVVhfQ09OU1RBVCk7CisJCWlmIChzdGF0dXMgJiBNSUlfQ0lTODIwMV9BVVhDT05TVEFUX0RVUExFWCkKKwkJCW1paV9pbmZvLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJZWxzZQorCQkJbWlpX2luZm8tPmR1cGxleCA9IERVUExFWF9IQUxGOworCisJCXNwZWVkID0gc3RhdHVzICYgTUlJX0NJUzgyMDFfQVVYQ09OU1RBVF9TUEVFRDsKKworCQlzd2l0Y2ggKHNwZWVkKSB7CisJCWNhc2UgTUlJX0NJUzgyMDFfQVVYQ09OU1RBVF9HQklUOgorCQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTAwMDsKKwkJCWJyZWFrOworCQljYXNlIE1JSV9DSVM4MjAxX0FVWENPTlNUQVRfMTAwOgorCQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltaWlfaW5mby0+c3BlZWQgPSBTUEVFRF8xMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFydmVsbF9hY2tfaW50ZXJydXB0KHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwkvKiBDbGVhciB0aGUgaW50ZXJydXB0cyBieSByZWFkaW5nIHRoZSByZWcgKi8KKwlwaHlfcmVhZChtaWlfaW5mbywgTUlJX00xMDExX0lFVkVOVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXJ2ZWxsX2NvbmZpZ19pbnRyKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwlpZihtaWlfaW5mby0+aW50ZXJydXB0cyA9PSBNSUlfSU5URVJSVVBUX0VOQUJMRUQpCisJCXBoeV93cml0ZShtaWlfaW5mbywgTUlJX00xMDExX0lNQVNLLCBNSUlfTTEwMTFfSU1BU0tfSU5JVCk7CisJZWxzZQorCQlwaHlfd3JpdGUobWlpX2luZm8sIE1JSV9NMTAxMV9JTUFTSywgTUlJX00xMDExX0lNQVNLX0NMRUFSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpczgyMHhfaW5pdChzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJcGh5X3dyaXRlKG1paV9pbmZvLCBNSUlfQ0lTODIwMV9BVVhfQ09OU1RBVCwgCisJCQlNSUlfQ0lTODIwMV9BVVhDT05TVEFUX0lOSVQpOworCXBoeV93cml0ZShtaWlfaW5mbywgTUlJX0NJUzgyMDFfRVhUX0NPTjEsCisJCQlNSUlfQ0lTODIwMV9FWFRDT04xX0lOSVQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2lzODIweF9hY2tfaW50ZXJydXB0KHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwlwaHlfcmVhZChtaWlfaW5mbywgTUlJX0NJUzgyMDFfSVNUQVQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2lzODIweF9jb25maWdfaW50cihzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJaWYobWlpX2luZm8tPmludGVycnVwdHMgPT0gTUlJX0lOVEVSUlVQVF9FTkFCTEVEKQorCQlwaHlfd3JpdGUobWlpX2luZm8sIE1JSV9DSVM4MjAxX0lNQVNLLCBNSUlfQ0lTODIwMV9JTUFTS19NQVNLKTsKKwllbHNlCisJCXBoeV93cml0ZShtaWlfaW5mbywgTUlJX0NJUzgyMDFfSU1BU0ssIDApOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRE05MTYxX0RFTEFZIDEwCisKK3N0YXRpYyBpbnQgZG05MTYxX3JlYWRfc3RhdHVzKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwl1MTYgc3RhdHVzOworCWludCBlcnI7CisKKwkvKiBVcGRhdGUgdGhlIGxpbmssIGJ1dCByZXR1cm4gaWYgdGhlcmUKKwkgKiB3YXMgYW4gZXJyb3IgKi8KKwllcnIgPSBnZW5taWlfdXBkYXRlX2xpbmsobWlpX2luZm8pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBJZiB0aGUgbGluayBpcyB1cCwgcmVhZCB0aGUgc3BlZWQgYW5kIGR1cGxleCAqLworCS8qIElmIHdlIGFyZW4ndCBhdXRvbmVnb3RpYXRpbmcsIGFzc3VtZSBzcGVlZHMgCisJICogYXJlIGFzIHNldCAqLworCWlmIChtaWlfaW5mby0+YXV0b25lZyAmJiBtaWlfaW5mby0+bGluaykgeworCQlzdGF0dXMgPSBwaHlfcmVhZChtaWlfaW5mbywgTUlJX0RNOTE2MV9TQ1NSKTsKKwkJaWYgKHN0YXR1cyAmIChNSUlfRE05MTYxX1NDU1JfMTAwRiB8IE1JSV9ETTkxNjFfU0NTUl8xMDBIKSkKKwkJCW1paV9pbmZvLT5zcGVlZCA9IFNQRUVEXzEwMDsKKwkJZWxzZQorCQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTA7CisKKwkJaWYgKHN0YXR1cyAmIChNSUlfRE05MTYxX1NDU1JfMTAwRiB8IE1JSV9ETTkxNjFfU0NTUl8xMEYpKQorCQkJbWlpX2luZm8tPmR1cGxleCA9IERVUExFWF9GVUxMOworCQllbHNlCisJCQltaWlfaW5mby0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBkbTkxNjFfY29uZmlnX2FuZWcoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKQoreworCXN0cnVjdCBkbTkxNjFfcHJpdmF0ZSAqcHJpdiA9IG1paV9pbmZvLT5wcml2OworCisJaWYoMCA9PSBwcml2LT5yZXNldGRvbmUpCisJCXJldHVybiAtRUFHQUlOOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRtOTE2MV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvID0gKHN0cnVjdCBnZmFyX21paV9pbmZvICopZGF0YTsKKwlzdHJ1Y3QgZG05MTYxX3ByaXZhdGUgKnByaXYgPSBtaWlfaW5mby0+cHJpdjsKKwl1MTYgc3RhdHVzID0gcGh5X3JlYWQobWlpX2luZm8sIE1JSV9CTVNSKTsKKworCWlmIChzdGF0dXMgJiBCTVNSX0FORUdDT01QTEVURSkgeworCQlwcml2LT5yZXNldGRvbmUgPSAxOworCX0gZWxzZQorCQltb2RfdGltZXIoJnByaXYtPnRpbWVyLCBqaWZmaWVzICsgRE05MTYxX0RFTEFZICogSFopOworfQorCitzdGF0aWMgaW50IGRtOTE2MV9pbml0KHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwlzdHJ1Y3QgZG05MTYxX3ByaXZhdGUgKnByaXY7CisKKwkvKiBBbGxvY2F0ZSB0aGUgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAqLworCXByaXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZG05MTYxX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKKworCWlmIChOVUxMID09IHByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJbWlpX2luZm8tPnByaXYgPSBwcml2OworCisJLyogUmVzZXQgaXMgbm90IGRvbmUgeWV0ICovCisJcHJpdi0+cmVzZXRkb25lID0gMDsKKworCS8qIElzb2xhdGUgdGhlIFBIWSAqLworCXBoeV93cml0ZShtaWlfaW5mbywgTUlJX0JNQ1IsIEJNQ1JfSVNPTEFURSk7CisKKwkvKiBEbyBub3QgYnlwYXNzIHRoZSBzY3JhbWJsZXIvZGVzY3JhbWJsZXIgKi8KKwlwaHlfd3JpdGUobWlpX2luZm8sIE1JSV9ETTkxNjFfU0NSLCBNSUlfRE05MTYxX1NDUl9JTklUKTsKKworCS8qIENsZWFyIDEwQlRDU1IgdG8gZGVmYXVsdCAqLworCXBoeV93cml0ZShtaWlfaW5mbywgTUlJX0RNOTE2MV8xMEJUQ1NSLCBNSUlfRE05MTYxXzEwQlRDU1JfSU5JVCk7CisKKwkvKiBSZWNvbm5lY3QgdGhlIFBIWSwgYW5kIGVuYWJsZSBBdXRvbmVnb3RpYXRpb24gKi8KKwlwaHlfd3JpdGUobWlpX2luZm8sIE1JSV9CTUNSLCBCTUNSX0FORU5BQkxFKTsKKworCS8qIFN0YXJ0IGEgdGltZXIgZm9yIERNOTE2MV9ERUxBWSBzZWNvbmRzIHRvIHdhaXQKKwkgKiBmb3IgdGhlIFBIWSB0byBiZSByZWFkeSAqLworCWluaXRfdGltZXIoJnByaXYtPnRpbWVyKTsKKwlwcml2LT50aW1lci5mdW5jdGlvbiA9ICZkbTkxNjFfdGltZXI7CisJcHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtaWlfaW5mbzsKKwltb2RfdGltZXIoJnByaXYtPnRpbWVyLCBqaWZmaWVzICsgRE05MTYxX0RFTEFZICogSFopOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRtOTE2MV9jbG9zZShzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJc3RydWN0IGRtOTE2MV9wcml2YXRlICpwcml2ID0gbWlpX2luZm8tPnByaXY7CisKKwlkZWxfdGltZXJfc3luYygmcHJpdi0+dGltZXIpOworCWtmcmVlKHByaXYpOworfQorCisjaWYgMAorc3RhdGljIGludCBkbTkxNjFfYWNrX2ludGVycnVwdChzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJcGh5X3JlYWQobWlpX2luZm8sIE1JSV9ETTkxNjFfSU5UUik7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBDaWNhZGEgODIweCAqLworc3RhdGljIHN0cnVjdCBwaHlfaW5mbyBwaHlfaW5mb19jaXM4MjB4ID0geworCTB4MDAwZmM0NDAsCisJIkNpY2FkYSBDaXM4MjA0IiwKKwkweDAwMGZmZmMwLAorCS5mZWF0dXJlcwk9IE1JSV9HQklUX0ZFQVRVUkVTLAorCS5pbml0CQk9ICZjaXM4MjB4X2luaXQsCisJLmNvbmZpZ19hbmVnCT0gJmdiaXRfY29uZmlnX2FuZWcsCisJLnJlYWRfc3RhdHVzCT0gJmNpczgyMHhfcmVhZF9zdGF0dXMsCisJLmFja19pbnRlcnJ1cHQJPSAmY2lzODIweF9hY2tfaW50ZXJydXB0LAorCS5jb25maWdfaW50cgk9ICZjaXM4MjB4X2NvbmZpZ19pbnRyLAorfTsKKworc3RhdGljIHN0cnVjdCBwaHlfaW5mbyBwaHlfaW5mb19kbTkxNjEgPSB7CisJLnBoeV9pZAkJPSAweDAxODFiODgwLAorCS5uYW1lCQk9ICJEYXZpY29tIERNOTE2MUUiLAorCS5waHlfaWRfbWFzawk9IDB4MGZmZmZmZjAsCisJLmluaXQJCT0gZG05MTYxX2luaXQsCisJLmNvbmZpZ19hbmVnCT0gZG05MTYxX2NvbmZpZ19hbmVnLAorCS5yZWFkX3N0YXR1cwk9IGRtOTE2MV9yZWFkX3N0YXR1cywKKwkuY2xvc2UJCT0gZG05MTYxX2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCBwaHlfaW5mbyBwaHlfaW5mb19tYXJ2ZWxsID0geworCS5waHlfaWQJCT0gMHgwMTQxMGMwMCwKKwkucGh5X2lkX21hc2sJPSAweGZmZmZmZjAwLAorCS5uYW1lCQk9ICJNYXJ2ZWxsIDg4RTExMDEiLAorCS5mZWF0dXJlcwk9IE1JSV9HQklUX0ZFQVRVUkVTLAorCS5jb25maWdfYW5lZwk9ICZtYXJ2ZWxsX2NvbmZpZ19hbmVnLAorCS5yZWFkX3N0YXR1cwk9ICZtYXJ2ZWxsX3JlYWRfc3RhdHVzLAorCS5hY2tfaW50ZXJydXB0CT0gJm1hcnZlbGxfYWNrX2ludGVycnVwdCwKKwkuY29uZmlnX2ludHIJPSAmbWFydmVsbF9jb25maWdfaW50ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5X2luZm8gcGh5X2luZm9fZ2VubWlpPSB7CisJLnBoeV9pZAkJPSAweDAwMDAwMDAwLAorCS5waHlfaWRfbWFzawk9IDB4MDAwMDAwMDAsCisJLm5hbWUJCT0gIkdlbmVyaWMgTUlJIiwKKwkuZmVhdHVyZXMJPSBNSUlfQkFTSUNfRkVBVFVSRVMsCisJLmNvbmZpZ19hbmVnCT0gZ2VubWlpX2NvbmZpZ19hbmVnLAorCS5yZWFkX3N0YXR1cwk9IGdlbm1paV9yZWFkX3N0YXR1cywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5X2luZm8gKnBoeV9pbmZvW10gPSB7CisJJnBoeV9pbmZvX2NpczgyMHgsCisJJnBoeV9pbmZvX21hcnZlbGwsCisJJnBoeV9pbmZvX2RtOTE2MSwKKwkmcGh5X2luZm9fZ2VubWlpLAorCU5VTEwKK307CisKK3UxNiBwaHlfcmVhZChzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8sIHUxNiByZWdudW0pCit7CisJdTE2IHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1paV9pbmZvLT5tZGlvX2xvY2ssIGZsYWdzKTsKKwlyZXR2YWwgPSBtaWlfaW5mby0+bWRpb19yZWFkKG1paV9pbmZvLT5kZXYsIG1paV9pbmZvLT5taWlfaWQsIHJlZ251bSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlpX2luZm8tPm1kaW9fbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCBwaHlfd3JpdGUoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvLCB1MTYgcmVnbnVtLCB1MTYgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWlpX2luZm8tPm1kaW9fbG9jaywgZmxhZ3MpOworCW1paV9pbmZvLT5tZGlvX3dyaXRlKG1paV9pbmZvLT5kZXYsIAorCQkJbWlpX2luZm8tPm1paV9pZCwgCisJCQlyZWdudW0sIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlpX2luZm8tPm1kaW9fbG9jaywgZmxhZ3MpOworfQorCisvKiBVc2UgdGhlIFBIWSBJRCByZWdpc3RlcnMgdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBQSFkgaXMgYXR0YWNoZWQKKyAqIHRvIGRldmljZSBkZXYuICByZXR1cm4gYSBzdHJ1Y3QgcGh5X2luZm8gc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhhdCBQSFkKKyAqLworc3RydWN0IHBoeV9pbmZvICogZ2V0X3BoeV9pbmZvKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwl1MTYgcGh5X3JlZzsKKwl1MzIgcGh5X0lEOworCWludCBpOworCXN0cnVjdCBwaHlfaW5mbyAqdGhlSW5mbyA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG1paV9pbmZvLT5kZXY7CisKKwkvKiBHcmFiIHRoZSBiaXRzIGZyb20gUEhZSVIxLCBhbmQgcHV0IHRoZW0gaW4gdGhlIHVwcGVyIGhhbGYgKi8KKwlwaHlfcmVnID0gcGh5X3JlYWQobWlpX2luZm8sIE1JSV9QSFlTSUQxKTsKKwlwaHlfSUQgPSAocGh5X3JlZyAmIDB4ZmZmZikgPDwgMTY7CisKKwkvKiBHcmFiIHRoZSBiaXRzIGZyb20gUEhZSVIyLCBhbmQgcHV0IHRoZW0gaW4gdGhlIGxvd2VyIGhhbGYgKi8KKwlwaHlfcmVnID0gcGh5X3JlYWQobWlpX2luZm8sIE1JSV9QSFlTSUQyKTsKKwlwaHlfSUQgfD0gKHBoeV9yZWcgJiAweGZmZmYpOworCisJLyogbG9vcCB0aHJvdWdoIGFsbCB0aGUga25vd24gUEhZIHR5cGVzLCBhbmQgZmluZCBvbmUgdGhhdCAqLworCS8qIG1hdGNoZXMgdGhlIElEIHdlIHJlYWQgZnJvbSB0aGUgUEhZLiAqLworCWZvciAoaSA9IDA7IHBoeV9pbmZvW2ldOyBpKyspCisJCWlmIChwaHlfaW5mb1tpXS0+cGh5X2lkID09IAorCQkJCShwaHlfSUQgJiBwaHlfaW5mb1tpXS0+cGh5X2lkX21hc2spKSB7CisJCQl0aGVJbmZvID0gcGh5X2luZm9baV07CisJCQlicmVhazsKKwkJfQorCisJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBhcyB3ZSBoYXZlIGdlbmVyaWMgUEhZIHN1cHBvcnQgKi8KKwlpZiAodGhlSW5mbyA9PSBOVUxMKSB7CisJCXByaW50aygiJXM6IFBIWSBpZCAleCBpcyBub3Qgc3VwcG9ydGVkIVxuIiwgZGV2LT5uYW1lLCBwaHlfSUQpOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgeworCQlwcmludGsoIiVzOiBQSFkgaXMgJXMgKCV4KVxuIiwgZGV2LT5uYW1lLCB0aGVJbmZvLT5uYW1lLAorCQkgICAgICAgcGh5X0lEKTsKKwl9CisKKwlyZXR1cm4gdGhlSW5mbzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXJfcGh5LmggYi9kcml2ZXJzL25ldC9naWFuZmFyX3BoeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOWIzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9naWFuZmFyX3BoeS5oCkBAIC0wLDAgKzEsMjEzIEBACisvKiAKKyAqIGRyaXZlcnMvbmV0L2dpYW5mYXJfcGh5LmgKKyAqCisgKiBHaWFuZmFyIEV0aGVybmV0IERyaXZlciAtLSBQSFkgaGFuZGxpbmcKKyAqIERyaXZlciBmb3IgRkVDIG9uIE1QQzg1NDAgYW5kIFRTRUMgb24gTVBDODU0MC9NUEM4NTYwCisgKiBCYXNlZCBvbiA4MjYwX2lvL2ZjY19lbmV0LmMKKyAqCisgKiBBdXRob3I6IEFuZHkgRmxlbWluZworICogTWFpbnRhaW5lcjogS3VtYXIgR2FsYSAoa3VtYXIuZ2FsYUBmcmVlc2NhbGUuY29tKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpZm5kZWYgX19HSUFORkFSX1BIWV9ICisjZGVmaW5lIF9fR0lBTkZBUl9QSFlfSAorCisjZGVmaW5lIE1JSV9lbmQgKCh1MzIpLTIpCisjZGVmaW5lIE1JSV9yZWFkICgodTMyKS0xKQorCisjZGVmaW5lIE1JSU1JTkRfQlVTWSAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTUlJTUlORF9OT1RWQUxJRCAgICAgICAgMHgwMDAwMDAwNAorCisjZGVmaW5lIEdGQVJfQU5fVElNRU9VVCAgICAgICAgIDIwMDAKKworLyogMTAwMEJUIGNvbnRyb2wgKE1hcnZlbGwgJiBCQ001NHh4IGF0IGxlYXN0KSAqLworI2RlZmluZSBNSUlfMTAwMEJBU0VUQ09OVFJPTAkJCTB4MDkKKyNkZWZpbmUgTUlJXzEwMDBCQVNFVENPTlRST0xfRlVMTERVUExFWENBUAkweDAyMDAKKyNkZWZpbmUgTUlJXzEwMDBCQVNFVENPTlRST0xfSEFMRkRVUExFWENBUAkweDAxMDAKKworLyogQ2ljYWRhIEV4dGVuZGVkIENvbnRyb2wgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBNSUlfQ0lTODIwMV9FWFRfQ09OMSAgICAgICAgICAgMHgxNworI2RlZmluZSBNSUlfQ0lTODIwMV9FWFRDT04xX0lOSVQgICAgICAgMHgwMDAwCisKKy8qIENpY2FkYSBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQ0lTODIwMV9JTUFTSwkJMHgxOQorI2RlZmluZSBNSUlfQ0lTODIwMV9JTUFTS19JRU4JCTB4ODAwMAorI2RlZmluZSBNSUlfQ0lTODIwMV9JTUFTS19TUEVFRAkweDQwMDAKKyNkZWZpbmUgTUlJX0NJUzgyMDFfSU1BU0tfTElOSwkJMHgyMDAwCisjZGVmaW5lIE1JSV9DSVM4MjAxX0lNQVNLX0RVUExFWAkweDEwMDAKKyNkZWZpbmUgTUlJX0NJUzgyMDFfSU1BU0tfTUFTSwkJMHhmMDAwCisKKy8qIENpY2FkYSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9DSVM4MjAxX0lTVEFUCQkweDFhCisjZGVmaW5lIE1JSV9DSVM4MjAxX0lTVEFUX1NUQVRVUwkweDgwMDAKKyNkZWZpbmUgTUlJX0NJUzgyMDFfSVNUQVRfU1BFRUQJMHg0MDAwCisjZGVmaW5lIE1JSV9DSVM4MjAxX0lTVEFUX0xJTksJCTB4MjAwMAorI2RlZmluZSBNSUlfQ0lTODIwMV9JU1RBVF9EVVBMRVgJMHgxMDAwCisKKy8qIENpY2FkYSBBdXhpbGlhcnkgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0NJUzgyMDFfQVVYX0NPTlNUQVQgICAgICAgIDB4MWMKKyNkZWZpbmUgTUlJX0NJUzgyMDFfQVVYQ09OU1RBVF9JTklUICAgIDB4MDAwNAorI2RlZmluZSBNSUlfQ0lTODIwMV9BVVhDT05TVEFUX0RVUExFWCAgMHgwMDIwCisjZGVmaW5lIE1JSV9DSVM4MjAxX0FVWENPTlNUQVRfU1BFRUQgICAweDAwMTgKKyNkZWZpbmUgTUlJX0NJUzgyMDFfQVVYQ09OU1RBVF9HQklUICAgIDB4MDAxMAorI2RlZmluZSBNSUlfQ0lTODIwMV9BVVhDT05TVEFUXzEwMCAgICAgMHgwMDA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLyogODhFMTAxMSBQSFkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVMJCTB4MTEKKyNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU18xMDAwCQkweDgwMDAKKyNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU18xMDAJCTB4NDAwMAorI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTX1NQRF9NQVNLCTB4YzAwMAorI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTX0ZVTExEVVBMRVgJMHgyMDAwCisjZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfUkVTT0xWRUQJMHgwODAwCisjZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfTElOSwkJMHgwNDAwCisKKyNkZWZpbmUgTUlJX00xMDExX0lFVkVOVAkJMHgxMworI2RlZmluZSBNSUlfTTEwMTFfSUVWRU5UX0NMRUFSCQkweDAwMDAKKworI2RlZmluZSBNSUlfTTEwMTFfSU1BU0sJCQkweDEyCisjZGVmaW5lIE1JSV9NMTAxMV9JTUFTS19JTklUCQkweDY0MDAKKyNkZWZpbmUgTUlJX00xMDExX0lNQVNLX0NMRUFSCQkweDAwMDAKKworI2RlZmluZSBNSUlfRE05MTYxX1NDUgkJMHgxMAorI2RlZmluZSBNSUlfRE05MTYxX1NDUl9JTklUCTB4MDYxMAorCisvKiBETTkxNjEgU3BlY2lmaWVkIENvbmZpZ3VyYXRpb24gYW5kIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfRE05MTYxX1NDU1IJMHgxMQorI2RlZmluZSBNSUlfRE05MTYxX1NDU1JfMTAwRgkweDgwMDAKKyNkZWZpbmUgTUlJX0RNOTE2MV9TQ1NSXzEwMEgJMHg0MDAwCisjZGVmaW5lIE1JSV9ETTkxNjFfU0NTUl8xMEYJMHgyMDAwCisjZGVmaW5lIE1JSV9ETTkxNjFfU0NTUl8xMEgJMHgxMDAwCisKKy8qIERNOTE2MSBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSCTB4MTUKKyNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX1BFTkQJCTB4ODAwMAorI2RlZmluZSBNSUlfRE05MTYxX0lOVFJfRFBMWF9NQVNLCTB4MDgwMAorI2RlZmluZSBNSUlfRE05MTYxX0lOVFJfU1BEX01BU0sJMHgwNDAwCisjZGVmaW5lIE1JSV9ETTkxNjFfSU5UUl9MSU5LX01BU0sJMHgwMjAwCisjZGVmaW5lIE1JSV9ETTkxNjFfSU5UUl9NQVNLCQkweDAxMDAKKyNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX0RQTFhfQ0hBTkdFCTB4MDAxMAorI2RlZmluZSBNSUlfRE05MTYxX0lOVFJfU1BEX0NIQU5HRQkweDAwMDgKKyNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX0xJTktfQ0hBTkdFCTB4MDAwNAorI2RlZmluZSBNSUlfRE05MTYxX0lOVFJfSU5JVCAJCTB4MDAwMAorI2RlZmluZSBNSUlfRE05MTYxX0lOVFJfU1RPUAlcCisoTUlJX0RNOTE2MV9JTlRSX0RQTFhfTUFTSyB8IE1JSV9ETTkxNjFfSU5UUl9TUERfTUFTSyBcCisgfCBNSUlfRE05MTYxX0lOVFJfTElOS19NQVNLIHwgTUlJX0RNOTE2MV9JTlRSX01BU0spCisKKy8qIERNOTE2MSAxMEJUIENvbmZpZ3VyYXRpb24vU3RhdHVzICovCisjZGVmaW5lIE1JSV9ETTkxNjFfMTBCVENTUgkweDEyCisjZGVmaW5lIE1JSV9ETTkxNjFfMTBCVENTUl9JTklUCTB4NzgwMAorCisjZGVmaW5lIE1JSV9CQVNJQ19GRUFUVVJFUwkoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8IFwKKwkJCQkgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8IFwKKwkJCQkgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBcCisJCQkJIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwgXAorCQkJCSBTVVBQT1JURURfQXV0b25lZyB8IFwKKwkJCQkgU1VQUE9SVEVEX1RQIHwgXAorCQkJCSBTVVBQT1JURURfTUlJKQorCisjZGVmaW5lIE1JSV9HQklUX0ZFQVRVUkVTCShNSUlfQkFTSUNfRkVBVFVSRVMgfCBcCisJCQkJIFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8IFwKKwkJCQkgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsKQorCisjZGVmaW5lIE1JSV9SRUFEX0NPTU1BTkQgICAgICAgMHgwMDAwMDAwMQorCisjZGVmaW5lIE1JSV9JTlRFUlJVUFRfRElTQUJMRUQgMHgwCisjZGVmaW5lIE1JSV9JTlRFUlJVUFRfRU5BQkxFRCAweDEKKy8qIFRha2VuIGZyb20gbWlpX2lmX2luZm8gYW5kIHN1bmdlbV9waHkuaCAqLworc3RydWN0IGdmYXJfbWlpX2luZm8geworCS8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBQSFkgdHlwZSAqLworCS8qIEFuZCBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworCXN0cnVjdCBwaHlfaW5mbyAqcGh5aW5mbzsKKworCS8qIGZvcmNlZCBzcGVlZCAmIGR1cGxleCAobm8gYXV0b25lZykKKwkgKiBwYXJ0bmVyIHNwZWVkICYgZHVwbGV4ICYgcGF1c2UgKGF1dG9uZWcpCisJICovCisJaW50IHNwZWVkOworCWludCBkdXBsZXg7CisJaW50IHBhdXNlOworCisJLyogVGhlIG1vc3QgcmVjZW50bHkgcmVhZCBsaW5rIHN0YXRlICovCisJaW50IGxpbms7CisKKwkvKiBFbmFibGVkIEludGVycnVwdHMgKi8KKwl1MzIgaW50ZXJydXB0czsKKworCXUzMiBhZHZlcnRpc2luZzsKKwlpbnQgYXV0b25lZzsKKwlpbnQgbWlpX2lkOworCisJLyogcHJpdmF0ZSBkYXRhIHBvaW50ZXIgKi8KKwkvKiBGb3IgdXNlIGJ5IFBIWXMgdG8gbWFpbnRhaW4gZXh0cmEgc3RhdGUgKi8KKwl2b2lkICpwcml2OworCisJLyogUHJvdmlkZWQgYnkgaG9zdCBjaGlwICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCS8qIEEgbG9jayB0byBlbnN1cmUgdGhhdCBvbmx5IG9uZSB0aGluZyBjYW4gcmVhZC93cml0ZQorCSAqIHRoZSBNRElPIGJ1cyBhdCBhIHRpbWUgKi8KKwlzcGlubG9ja190IG1kaW9fbG9jazsKKworCS8qIFByb3ZpZGVkIGJ5IGV0aGVybmV0IGRyaXZlciAqLworCWludCAoKm1kaW9fcmVhZCkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWcpOworCXZvaWQgKCptZGlvX3dyaXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZywgaW50IHZhbCk7Cit9OworCisvKiBzdHJ1Y3QgcGh5X2luZm86IGEgc3RydWN0dXJlIHdoaWNoIGRlZmluZXMgYXR0cmlidXRlcyBmb3IgYSBQSFkKKyAqCisgKiBpZCB3aWxsIGNvbnRhaW4gYSBudW1iZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgUEhZLiAgRHVyaW5nCisgKiBzdGFydHVwLCB0aGUgZHJpdmVyIHdpbGwgcG9sbCB0aGUgUEhZIHRvIGZpbmQgb3V0IHdoYXQgaXRzCisgKiBVSUQtLWFzIGRlZmluZWQgYnkgcmVnaXN0ZXJzIDIgYW5kIDMtLWlzLiAgVGhlIDMyLWJpdCByZXN1bHQKKyAqIGdvdHRlbiBmcm9tIHRoZSBQSFkgd2lsbCBiZSBBTkRlZCB3aXRoIHBoeV9pZF9tYXNrIHRvCisgKiBkaXNjYXJkIGFueSBiaXRzIHdoaWNoIG1heSBjaGFuZ2UgYmFzZWQgb24gcmV2aXNpb24gbnVtYmVycworICogdW5pbXBvcnRhbnQgdG8gZnVuY3Rpb25hbGl0eQorICoKKyAqIFRoZXJlIGFyZSA2IGNvbW1hbmRzIHdoaWNoIHRha2UgYSBnZmFyX21paV9pbmZvIHN0cnVjdHVyZS4KKyAqIEVhY2ggUEhZIG11c3QgZGVjbGFyZSBjb25maWdfYW5lZywgYW5kIHJlYWRfc3RhdHVzLgorICovCitzdHJ1Y3QgcGh5X2luZm8geworCXUzMiBwaHlfaWQ7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgcGh5X2lkX21hc2s7CisJdTMyIGZlYXR1cmVzOworCisJLyogQ2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIFBIWSAqLworCWludCAoKmluaXQpKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbyk7CisKKwkvKiBDYWxsZWQgdG8gc3VzcGVuZCB0aGUgUEhZIGZvciBwb3dlciAqLworCWludCAoKnN1c3BlbmQpKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbyk7CisKKwkvKiBSZWNvbmZpZ3VyZXMgYXV0b25lZ290aWF0aW9uIChvciBkaXNhYmxlcyBpdCkgKi8KKwlpbnQgKCpjb25maWdfYW5lZykoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKTsKKworCS8qIERldGVybWluZXMgdGhlIG5lZ290aWF0ZWQgc3BlZWQgYW5kIGR1cGxleCAqLworCWludCAoKnJlYWRfc3RhdHVzKShzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pOworCisJLyogQ2xlYXJzIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KKwlpbnQgKCphY2tfaW50ZXJydXB0KShzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pOworCisJLyogRW5hYmxlcyBvciBkaXNhYmxlcyBpbnRlcnJ1cHRzICovCisJaW50ICgqY29uZmlnX2ludHIpKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbyk7CisKKwkvKiBDbGVhcnMgdXAgYW55IG1lbW9yeSBpZiBuZWVkZWQgKi8KKwl2b2lkICgqY2xvc2UpKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbyk7Cit9OworCitzdHJ1Y3QgcGh5X2luZm8gKmdldF9waHlfaW5mbyhzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pOworaW50IHJlYWRfcGh5X3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtKTsKK3ZvaWQgd3JpdGVfcGh5X3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtLCBpbnQgdmFsdWUpOwordm9pZCBtaWlfY2xlYXJfcGh5X2ludGVycnVwdChzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pOwordm9pZCBtaWlfY29uZmlndXJlX3BoeV9pbnRlcnJ1cHQoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvLCB1MzIgaW50ZXJydXB0cyk7CisKK3N0cnVjdCBkbTkxNjFfcHJpdmF0ZSB7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJaW50IHJlc2V0ZG9uZTsKK307CisKKyNlbmRpZiAvKiBHSUFORkFSX1BIWV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ndDY0MjQwZXRoLmggYi9kcml2ZXJzL25ldC9ndDY0MjQwZXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3YWYwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2d0NjQyNDBldGguaApAQCAtMCwwICsxLDQwMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBQYXR0b24gRWxlY3Ryb25pY3MgQ29tcGFueQorICogQ29weXJpZ2h0IChDKSAyMDAyIE1vbWVudHVtIENvbXB1dGVyCisgKgorICogQ29weXJpZ2h0IDIwMDAgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgCXN0ZXZlbEBtdmlzdGEuY29tIG9yIHN1cHBvcnRAbXZpc3RhLmNvbQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIEV0aGVybmV0IGRyaXZlciBkZWZpbml0aW9ucyBmb3IgdGhlIE1JUFMgR1Q5NjEwMCBBZHZhbmNlZAorICogQ29tbXVuaWNhdGlvbiBDb250cm9sbGVyLgorICogCisgKiBNb2RpZmllZCBmb3IgdGhlIE1hcnZlbGxvdXMgR1Q2NDI0MCBSZXRhcmRlZCBDb21tdW5pY2F0aW9uIENvbnRyb2xsZXIuCisgKi8KKyNpZm5kZWYgX0dUNjQyNDBFVEhfSAorI2RlZmluZSBfR1Q2NDI0MEVUSF9ICisKKyNpbmNsdWRlIDxhc20vZ3Q2NDI0MC5oPgorCisjZGVmaW5lIEVUSEVSTkVUX1BPUlRTX0RJRkZFUkVOQ0VfT0ZGU0VUUwkweDQwMAorCisvKiBUcmFuc2xhdGUgdGhvc2Ugd2VhbmllIG5hbWVzIGZyb20gR2FsaWxlby9WeFdvcmtzIGhlYWRlciBmaWxlczogKi8KKworI2RlZmluZSBHVDY0MjQwX01SUiAgICAgICAgICAgICAgICAgICAgTUFJTl9ST1VUSU5HX1JFR0lTVEVSCisjZGVmaW5lIEdUNjQyNDBfQ0lVX0FSQklURVJfQ09ORklHICAgICBDT01NX1VOSVRfQVJCSVRFUl9DT05GSUdVUkFUSU9OX1JFR0lTVEVSCisjZGVmaW5lIEdUNjQyNDBfQ0lVX0FSQklURVJfQ09OVFJPTCAgICBDT01NX1VOSVRfQVJCSVRFUl9DT05UUk9MCisjZGVmaW5lIEdUNjQyNDBfTUFJTl9MT1dfQ0FVU0UgICAgICAgICBMT1dfSU5URVJSVVBUX0NBVVNFX1JFR0lTVEVSCisjZGVmaW5lIEdUNjQyNDBfTUFJTl9ISUdIX0NBVVNFICAgICAgICBISUdIX0lOVEVSUlVQVF9DQVVTRV9SRUdJU1RFUgorI2RlZmluZSBHVDY0MjQwX0NQVV9MT1dfTUFTSyAgICAgICAgICAgQ1BVX0lOVEVSUlVQVF9NQVNLX1JFR0lTVEVSX0xPVworI2RlZmluZSBHVDY0MjQwX0NQVV9ISUdIX01BU0sgICAgICAgICAgQ1BVX0lOVEVSUlVQVF9NQVNLX1JFR0lTVEVSX0hJR0gKKyNkZWZpbmUgR1Q2NDI0MF9DUFVfU0VMRUNUX0NBVVNFICAgICAgIENQVV9TRUxFQ1RfQ0FVU0VfUkVHSVNURVIKKworI2RlZmluZSBHVDY0MjQwX0VUSF9QSFlfQUREUl9SRUcgICAgICAgRVRIRVJORVRfUEhZX0FERFJFU1NfUkVHSVNURVIKKyNkZWZpbmUgR1Q2NDI0MF9FVEhfUE9SVF9DT05GSUcgICAgICAgIEVUSEVSTkVUMF9QT1JUX0NPTkZJR1VSQVRJT05fUkVHSVNURVIKKyNkZWZpbmUgR1Q2NDI0MF9FVEhfUE9SVF9DT05GSUdfRVhUICAgIEVUSEVSTkVUMF9QT1JUX0NPTkZJR1VSQVRJT05fRVhURU5EX1JFR0lTVEVSCisjZGVmaW5lIEdUNjQyNDBfRVRIX1BPUlRfQ09NTUFORCAgICAgICBFVEhFUk5FVDBfUE9SVF9DT01NQU5EX1JFR0lTVEVSCisjZGVmaW5lIEdUNjQyNDBfRVRIX1BPUlRfU1RBVFVTICAgICAgICBFVEhFUk5FVDBfUE9SVF9TVEFUVVNfUkVHSVNURVIKKyNkZWZpbmUgR1Q2NDI0MF9FVEhfSU9fU0laRSAgICAgICAgICAgIEVUSEVSTkVUX1BPUlRTX0RJRkZFUkVOQ0VfT0ZGU0VUUworI2RlZmluZSBHVDY0MjQwX0VUSF9TTUlfUkVHICAgICAgICAgICAgRVRIRVJORVRfU01JX1JFR0lTVEVSCisjZGVmaW5lIEdUNjQyNDBfRVRIX01JQl9DT1VOVF9CQVNFICAgICBFVEhFUk5FVDBfTUlCX0NPVU5URVJfQkFTRQorI2RlZmluZSBHVDY0MjQwX0VUSF9TRE1BX0NPTkZJRyAgICAgICAgRVRIRVJORVQwX1NETUFfQ09ORklHVVJBVElPTl9SRUdJU1RFUgorI2RlZmluZSBHVDY0MjQwX0VUSF9TRE1BX0NPTU0gICAgICAgICAgRVRIRVJORVQwX1NETUFfQ09NTUFORF9SRUdJU1RFUgorI2RlZmluZSBHVDY0MjQwX0VUSF9JTlRfTUFTSyAgICAgICAgICAgRVRIRVJORVQwX0lOVEVSUlVQVF9NQVNLX1JFR0lTVEVSCisjZGVmaW5lIEdUNjQyNDBfRVRIX0lOVF9DQVVTRSAgICAgICAgICBFVEhFUk5FVDBfSU5URVJSVVBUX0NBVVNFX1JFR0lTVEVSCisjZGVmaW5lIEdUNjQyNDBfRVRIX0NVUlJfVFhfREVTQ19QVFIwICBFVEhFUk5FVDBfQ1VSUkVOVF9UWF9ERVNDUklQVE9SX1BPSU5URVIwCisjZGVmaW5lIEdUNjQyNDBfRVRIX0NVUlJfVFhfREVTQ19QVFIxICBFVEhFUk5FVDBfQ1VSUkVOVF9UWF9ERVNDUklQVE9SX1BPSU5URVIxCisjZGVmaW5lIEdUNjQyNDBfRVRIXzFTVF9SWF9ERVNDX1BUUjAgICBFVEhFUk5FVDBfRklSU1RfUlhfREVTQ1JJUFRPUl9QT0lOVEVSMAorI2RlZmluZSBHVDY0MjQwX0VUSF9DVVJSX1JYX0RFU0NfUFRSMCAgRVRIRVJORVQwX0NVUlJFTlRfUlhfREVTQ1JJUFRPUl9QT0lOVEVSMAorI2RlZmluZSBHVDY0MjQwX0VUSF9IQVNIX1RCTF9QVFIgICAgICAgRVRIRVJORVQwX0hBU0hfVEFCTEVfUE9JTlRFUl9SRUdJU1RFUgorCisvKiBUdXJuIG9uIE5BUEkgYnkgZGVmYXVsdCAqLworCisjZGVmaW5lCUdUNjQyNDBfTkFQSQkJCTEKKworLyogU29tZSA2NDI0MCBzZXR0aW5ncyB0aGF0IFNIT1VMRCBldmVudHVhbGx5IGJlIHNldHVwIGluIFBST00gbW9uaXRvcjogKi8KKy8qIChCb2FyZC1zcGVjaWZpYyB0byB0aGUgRFNMMzIyNCBSZXYgQSBib2FyZCBPTkxZISkgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEQzMjI0X01QUF9DVFJMMF9TRVRUSU5HCQkweDY2NjY5OTAwCisjZGVmaW5lIEQzMjI0X01QUF9DVFJMMV9TRVRUSU5HCQkweDAwMDAwMDAwCisjZGVmaW5lIEQzMjI0X01QUF9DVFJMMl9TRVRUSU5HCQkweDAwODg3NzAwCisjZGVmaW5lIEQzMjI0X01QUF9DVFJMM19TRVRUSU5HCQkweDAwMDAwMDQ0CisjZGVmaW5lIEQzMjI0X0dQUF9JT19DVFJMX1NFVFRJTkcJMHgwMDAwZTgwMAorI2RlZmluZSBEMzIyNF9HUFBfTEVWRUxfQ1RSTF9TRVRUSU5HCTB4ZjAwMWY3MDMKKyNkZWZpbmUgRDMyMjRfR1BQX1ZBTFVFX1NFVFRJTkcJCTB4MDAwMDAwMDAKKworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgZWZmaWNpZW5jeS4gKi8KKy8vLSNkZWZpbmUgVFhfUklOR19TSVpFIDE2CisjZGVmaW5lIFRYX1JJTkdfU0laRQk2NAkvKiBURVNUSU5HICEhISAqLworI2RlZmluZSBSWF9SSU5HX1NJWkUJMzIKKyNkZWZpbmUgUEtUX0JVRl9TWgkxNTM2CS8qIFNpemUgb2YgZWFjaCB0ZW1wb3JhcnkgUnggYnVmZmVyLiAqLworCisjZGVmaW5lIFJYX0hBU0hfVEFCTEVfU0laRSAxNjM4NAorI2RlZmluZSBIQVNIX0hPUF9OVU1CRVIgMTIKKworI2RlZmluZSBOVU1fSU5URVJGQUNFUyAzCisKKyNkZWZpbmUgR1Q2NDI0MEVUSF9UWF9USU1FT1VUIEhaLzQKKworI2RlZmluZSBNSVBTX0dUNjQyNDBfQkFTRSAweGY0MDAwMDAwCisjZGVmaW5lIEdUNjQyNDBfRVRIMF9CQVNFIChNSVBTX0dUNjQyNDBfQkFTRSArIEdUNjQyNDBfRVRIX1BPUlRfQ09ORklHKQorI2RlZmluZSBHVDY0MjQwX0VUSDFfQkFTRSAoR1Q2NDI0MF9FVEgwX0JBU0UgKyBHVDY0MjQwX0VUSF9JT19TSVpFKQorI2RlZmluZSBHVDY0MjQwX0VUSDJfQkFTRSAoR1Q2NDI0MF9FVEgxX0JBU0UgKyBHVDY0MjQwX0VUSF9JT19TSVpFKQorCisjaWYgZGVmaW5lZChDT05GSUdfTUlQU19EU0wzMjI0KQorI2RlZmluZSBHVDY0MjQwX0VUSEVSMF9JUlEgNAorI2RlZmluZSBHVDY0MjQwX0VUSEVSMV9JUlEgNAorI2Vsc2UKKyNkZWZpbmUgR1Q2NDI0MF9FVEhFUjBfSVJRIC0xCisjZGVmaW5lIEdUNjQyNDBfRVRIRVIxX0lSUSAtMQorI2VuZGlmCisKKyNkZWZpbmUgUkVWX0dUNjQyNDAgIDB4MQorI2RlZmluZSBSRVZfR1Q2NDI0MEEgMHgxMAorCisjZGVmaW5lIEdUNjQyNDBFVEhfUkVBRChncCwgb2Zmc2V0KQkJCQkJXAorCUdUX1JFQUQoKGdwKS0+cG9ydF9vZmZzZXQgKyAob2Zmc2V0KSkKKworI2RlZmluZSBHVDY0MjQwRVRIX1dSSVRFKGdwLCBvZmZzZXQsIGRhdGEpCQkJCVwKKwlHVF9XUklURSgoZ3ApLT5wb3J0X29mZnNldCArIChvZmZzZXQpLCAoZGF0YSkpCisKKyNkZWZpbmUgR1Q2NDI0MEVUSF9TRVRCSVQoZ3AsIG9mZnNldCwgYml0cykJCQkJXAorCUdUNjQyNDBFVEhfV1JJVEUoKGdwKSwgKG9mZnNldCksCQkJCVwKKwkgICAgICAgICAgICAgICAgIEdUNjQyNDBFVEhfUkVBRCgoZ3ApLCAob2Zmc2V0KSkgfCAoYml0cykpCisKKyNkZWZpbmUgR1Q2NDI0MEVUSF9DTFJCSVQoZ3AsIG9mZnNldCwgYml0cykJCQkJXAorCUdUNjQyNDBFVEhfV1JJVEUoKGdwKSwgKG9mZnNldCksCQkJCVwKKwkgICAgICAgICAgICAgICAgIEdUNjQyNDBFVEhfUkVBRCgoZ3ApLCAob2Zmc2V0KSkgJiB+KGJpdHMpKQorCisjZGVmaW5lIEdUNjQyNDBfUkVBRChvZnMpCQlHVF9SRUFEKG9mcykKKyNkZWZpbmUgR1Q2NDI0MF9XUklURShvZnMsIGRhdGEpCUdUX1dSSVRFKChvZnMpLCAoZGF0YSkpCisKKy8qIEJpdCBkZWZpbml0aW9ucyBvZiB0aGUgU01JIFJlZyAqLworZW51bSB7CisJc21pckRhdGFNYXNrID0gMHhmZmZmLAorCXNtaXJQaHlBZE1hc2sgPSAweDFmIDw8IDE2LAorCXNtaXJQaHlBZEJpdCA9IDE2LAorCXNtaXJSZWdBZE1hc2sgPSAweDFmIDw8IDIxLAorCXNtaXJSZWdBZEJpdCA9IDIxLAorCXNtaXJPcENvZGUgPSAxIDw8IDI2LAorCXNtaXJSZWFkVmFsaWQgPSAxIDw8IDI3LAorCXNtaXJCdXN5ID0gMSA8PCAyOAorfTsKKworLyogQml0IGRlZmluaXRpb25zIG9mIHRoZSBQb3J0IENvbmZpZyBSZWcgKi8KK2VudW0gcGNyX2JpdHMgeworCXBjclBNID0gMSA8PCAwLAorCXBjclJCTSA9IDEgPDwgMSwKKwlwY3JQQkYgPSAxIDw8IDIsCisJcGNyRU4gPSAxIDw8IDcsCisJcGNyTFBCS01hc2sgPSAweDMgPDwgOCwKKwlwY3JMUEJLQml0ID0gMSA8PCA4LAorCXBjckZDID0gMSA8PCAxMCwKKwlwY3JIUyA9IDEgPDwgMTIsCisJcGNySE0gPSAxIDw8IDEzLAorCXBjckhETSA9IDEgPDwgMTQsCisJcGNySEQgPSAxIDw8IDE1LAorCXBjcklTTE1hc2sgPSAweDcgPDwgMjgsCisJcGNySVNMQml0ID0gMjgsCisJcGNyQUNDUyA9IDEgPDwgMzEKK307CisKKy8qIEJpdCBkZWZpbml0aW9ucyBvZiB0aGUgUG9ydCBDb25maWcgRXh0ZW5kIFJlZyAqLworZW51bSBwY3hyX2JpdHMgeworCXBjeHJJR01QID0gMSwKKwlwY3hyU1BBTiA9IDIsCisJcGN4clBBUiA9IDQsCisJcGN4clBSSU90eE1hc2sgPSAweDcgPDwgMywKKwlwY3hyUFJJT3R4Qml0ID0gMywKKwlwY3hyUFJJT3J4TWFzayA9IDB4MyA8PCA2LAorCXBjeHJQUklPcnhCaXQgPSA2LAorCXBjeHJQUklPcnhPdmVycmlkZSA9IDEgPDwgOCwKKwlwY3hyRFBMWGVuID0gMSA8PCA5LAorCXBjeHJGQ1RMZW4gPSAxIDw8IDEwLAorCXBjeHJGTFAgPSAxIDw8IDExLAorCXBjeHJGQ1RMID0gMSA8PCAxMiwKKwlwY3hyTUZMTWFzayA9IDB4MyA8PCAxNCwKKwlwY3hyTUZMQml0ID0gMTQsCisJcGN4ck1JQmNsck1vZGUgPSAxIDw8IDE2LAorCXBjeHJTcGVlZCA9IDEgPDwgMTgsCisJcGN4clNwZWVkZW4gPSAxIDw8IDE5LAorCXBjeHJSTUlJZW4gPSAxIDw8IDIwLAorCXBjeHJEU0NQZW4gPSAxIDw8IDIxCit9OworCisvKiBCaXQgZGVmaW5pdGlvbnMgb2YgdGhlIFBvcnQgQ29tbWFuZCBSZWcgKi8KK2VudW0gcGNtcl9iaXRzIHsKKwlwY21yRkogPSAxIDw8IDE1Cit9OworCisKKy8qIEJpdCBkZWZpbml0aW9ucyBvZiB0aGUgUG9ydCBTdGF0dXMgUmVnICovCitlbnVtIHBzcl9iaXRzIHsKKwlwc3JTcGVlZCA9IDEsCisJcHNyRHVwbGV4ID0gMiwKKwlwc3JGY3RsID0gNCwKKwlwc3JMaW5rID0gOCwKKwlwc3JQYXVzZSA9IDEgPDwgNCwKKwlwc3JUeExvdyA9IDEgPDwgNSwKKwlwc3JUeEhpZ2ggPSAxIDw8IDYsCisJcHNyVHhJblByb2cgPSAxIDw8IDcKK307CisKKy8qIEJpdCBkZWZpbml0aW9ucyBvZiB0aGUgU0RNQSBDb25maWcgUmVnICovCitlbnVtIHNkY3JfYml0cyB7CisJc2RjclJDTWFzayA9IDB4ZiA8PCAyLAorCXNkY3JSQ0JpdCA9IDIsCisJc2RjckJMTVIgPSAxIDw8IDYsCisJc2RjckJMTVQgPSAxIDw8IDcsCisJc2RjclBPVlIgPSAxIDw8IDgsCisJc2RjclJJRkIgPSAxIDw8IDksCisJc2RjckJTWk1hc2sgPSAweDMgPDwgMTIsCisJc2RjckJTWkJpdCA9IDEyCit9OworCisvKiBCaXQgZGVmaW5pdGlvbnMgb2YgdGhlIFNETUEgQ29tbWFuZCBSZWcgKi8KK2VudW0gc2RjbXJfYml0cyB7CisJc2RjbXJFUkQgPSAxIDw8IDcsCisJc2RjbXJBUiA9IDEgPDwgMTUsCisJc2RjbXJTVERIID0gMSA8PCAxNiwKKwlzZGNtclNUREwgPSAxIDw8IDE3LAorCXNkY21yVFhESCA9IDEgPDwgMjMsCisJc2RjbXJUWERMID0gMSA8PCAyNCwKKwlzZGNtckFUID0gMSA8PCAzMQorfTsKKworLyogQml0IGRlZmluaXRpb25zIG9mIHRoZSBJbnRlcnJ1cHQgQ2F1c2UgUmVnICovCitlbnVtIGljcl9iaXRzIHsKKwlpY3JSeEJ1ZmZlciA9IDEsCisJaWNyVHhCdWZmZXJIaWdoID0gMSA8PCAyLAorCWljclR4QnVmZmVyTG93ID0gMSA8PCAzLAorCWljclR4RW5kSGlnaCA9IDEgPDwgNiwKKwlpY3JUeEVuZExvdyA9IDEgPDwgNywKKwlpY3JSeEVycm9yID0gMSA8PCA4LAorCWljclR4RXJyb3JIaWdoID0gMSA8PCAxMCwKKwlpY3JUeEVycm9yTG93ID0gMSA8PCAxMSwKKwlpY3JSeE9WUiA9IDEgPDwgMTIsCisJaWNyVHhVZHIgPSAxIDw8IDEzLAorCWljclJ4QnVmZmVyUTAgPSAxIDw8IDE2LAorCWljclJ4QnVmZmVyUTEgPSAxIDw8IDE3LAorCWljclJ4QnVmZmVyUTIgPSAxIDw8IDE4LAorCWljclJ4QnVmZmVyUTMgPSAxIDw8IDE5LAorCWljclJ4RXJyb3JRMCA9IDEgPDwgMjAsCisJaWNyUnhFcnJvclExID0gMSA8PCAyMSwKKwlpY3JSeEVycm9yUTIgPSAxIDw8IDIyLAorCWljclJ4RXJyb3JRMyA9IDEgPDwgMjMsCisJaWNyTUlJUGh5U1RDID0gMSA8PCAyOCwKKwlpY3JTTUlkb25lID0gMSA8PCAyOSwKKwlpY3JFdGhlckludFN1bSA9IDEgPDwgMzEKK307CisKKworLyogVGhlIFJ4IGFuZCBUeCBkZXNjcmlwdG9yIGxpc3RzLiAqLworI2lmZGVmIF9fTElUVExFX0VORElBTgordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBjbWRzdGF0OworCXUxNiByZXNlcnZlZDsJCS8vLXByazIxYXVnMDEgICAgdTMyIHJlc2VydmVkOjE2OworCXUxNiBieXRlX2NudDsJCS8vLXByazIxYXVnMDEgICAgdTMyIGJ5dGVfY250OjE2OworCXUzMiBidWZmX3B0cjsKKwl1MzIgbmV4dDsKK30gZ3Q2NDI0MF90ZF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIGNtZHN0YXQ7CisJdTE2IGJ5dGVfY250OwkJLy8tcHJrMjFhdWcwMSAgICB1MzIgYnl0ZV9jbnQ6MTY7CisJdTE2IGJ1ZmZfc3o7CQkvLy1wcmsyMWF1ZzAxICAgIHUzMiBidWZmX3N6OjE2OworCXUzMiBidWZmX3B0cjsKKwl1MzIgbmV4dDsKK30gZ3Q2NDI0MF9yZF90OworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGJ5dGVfY250OwkJLy8tcHJrMjFhdWcwMSAgICB1MzIgYnl0ZV9jbnQ6MTY7CisJdTE2IHJlc2VydmVkOwkJLy8tcHJrMjFhdWcwMSAgICB1MzIgcmVzZXJ2ZWQ6MTY7CisJdTMyIGNtZHN0YXQ7CisJdTMyIG5leHQ7CisJdTMyIGJ1ZmZfcHRyOworfSBndDY0MjQwX3RkX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgYnVmZl9zejsJCS8vLXByazIxYXVnMDEgICAgdTMyIGJ1ZmZfc3o6MTY7CisJdTE2IGJ5dGVfY250OwkJLy8tcHJrMjFhdWcwMSAgICB1MzIgYnl0ZV9jbnQ6MTY7CisJdTMyIGNtZHN0YXQ7CisJdTMyIG5leHQ7CisJdTMyIGJ1ZmZfcHRyOworfSBndDY0MjQwX3JkX3Q7CisjZWxzZQorI2Vycm9yIEVpdGhlciBfX0JJR19FTkRJQU4gb3IgX19MSVRUTEVfRU5ESUFOIG11c3QgYmUgZGVmaW5lZCEKKyNlbmRpZgorCisKKy8qIFZhbHVlcyBmb3IgdGhlIFR4IGNvbW1hbmQtc3RhdHVzIGRlc2NyaXB0b3IgZW50cnkuICovCitlbnVtIHRkX2NtZHN0YXQgeworCXR4T3duID0gMSA8PCAzMSwKKwl0eEF1dG9Nb2RlID0gMSA8PCAzMCwKKwl0eEVJID0gMSA8PCAyMywKKwl0eEdlbkNSQyA9IDEgPDwgMjIsCisJdHhQYWQgPSAxIDw8IDE4LAorCXR4Rmlyc3QgPSAxIDw8IDE3LAorCXR4TGFzdCA9IDEgPDwgMTYsCisJdHhFcnJvclN1bW1hcnkgPSAxIDw8IDE1LAorCXR4UmVUeENudE1hc2sgPSAweDBmIDw8IDEwLAorCXR4UmVUeENudEJpdCA9IDEwLAorCXR4Q29sbGlzaW9uID0gMSA8PCA5LAorCXR4UmVUeExpbWl0ID0gMSA8PCA4LAorCXR4VW5kZXJydW4gPSAxIDw8IDYsCisJdHhMYXRlQ29sbGlzaW9uID0gMSA8PCA1Cit9OworCisKKy8qIFZhbHVlcyBmb3IgdGhlIFJ4IGNvbW1hbmQtc3RhdHVzIGRlc2NyaXB0b3IgZW50cnkuICovCitlbnVtIHJkX2NtZHN0YXQgeworCXJ4T3duID0gMSA8PCAzMSwKKwlyeEF1dG9Nb2RlID0gMSA8PCAzMCwKKwlyeEVJID0gMSA8PCAyMywKKwlyeEZpcnN0ID0gMSA8PCAxNywKKwlyeExhc3QgPSAxIDw8IDE2LAorCXJ4RXJyb3JTdW1tYXJ5ID0gMSA8PCAxNSwKKwlyeElHTVAgPSAxIDw8IDE0LAorCXJ4SGFzaEV4cGlyZWQgPSAxIDw8IDEzLAorCXJ4TWlzc2VkRnJhbWUgPSAxIDw8IDEyLAorCXJ4RnJhbWVUeXBlID0gMSA8PCAxMSwKKwlyeFNob3J0RnJhbWUgPSAxIDw8IDgsCisJcnhNYXhGcmFtZUxlbiA9IDEgPDwgNywKKwlyeE92ZXJydW4gPSAxIDw8IDYsCisJcnhDb2xsaXNpb24gPSAxIDw8IDQsCisJcnhDUkNFcnJvciA9IDEKK307CisKKy8qIEJpdCBmaWVsZHMgb2YgYSBIYXNoIFRhYmxlIEVudHJ5ICovCitlbnVtIGhhc2hfdGFibGVfZW50cnkgeworCWh0ZVZhbGlkID0gMSwKKwlodGVTa2lwID0gMiwKKwlodGVSRCA9IDQKK307CisKKy8vIFRoZSBNSUIgY291bnRlcnMKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgYnl0ZVJlY2VpdmVkOworCXUzMiBieXRlU2VudDsKKwl1MzIgZnJhbWVzUmVjZWl2ZWQ7CisJdTMyIGZyYW1lc1NlbnQ7CisJdTMyIHRvdGFsQnl0ZVJlY2VpdmVkOworCXUzMiB0b3RhbEZyYW1lc1JlY2VpdmVkOworCXUzMiBicm9hZGNhc3RGcmFtZXNSZWNlaXZlZDsKKwl1MzIgbXVsdGljYXN0RnJhbWVzUmVjZWl2ZWQ7CisJdTMyIGNSQ0Vycm9yOworCXUzMiBvdmVyc2l6ZUZyYW1lczsKKwl1MzIgZnJhZ21lbnRzOworCXUzMiBqYWJiZXI7CisJdTMyIGNvbGxpc2lvbjsKKwl1MzIgbGF0ZUNvbGxpc2lvbjsKKwl1MzIgZnJhbWVzNjQ7CisJdTMyIGZyYW1lczY1XzEyNzsKKwl1MzIgZnJhbWVzMTI4XzI1NTsKKwl1MzIgZnJhbWVzMjU2XzUxMTsKKwl1MzIgZnJhbWVzNTEyXzEwMjM7CisJdTMyIGZyYW1lczEwMjRfTWF4U2l6ZTsKKwl1MzIgbWFjUnhFcnJvcjsKKwl1MzIgZHJvcHBlZEZyYW1lczsKKwl1MzIgb3V0TXVsdGljYXN0RnJhbWVzOworCXUzMiBvdXRCcm9hZGNhc3RGcmFtZXM7CisJdTMyIHVuZGVyc2l6ZUZyYW1lczsKK30gbWliX2NvdW50ZXJzX3Q7CisKKworc3RydWN0IGd0NjQyNDBfcHJpdmF0ZSB7CisJZ3Q2NDI0MF9yZF90ICpyeF9yaW5nOworCWd0NjQyNDBfdGRfdCAqdHhfcmluZzsKKwkvLyBUaGUgUnggYW5kIFR4IHJpbmdzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkCisJZG1hX2FkZHJfdCByeF9yaW5nX2RtYTsKKwlkbWFfYWRkcl90IHR4X3JpbmdfZG1hOworCWNoYXIgKmhhc2hfdGFibGU7CisJLy8gVGhlIEhhc2ggVGFibGUgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZAorCWRtYV9hZGRyX3QgaGFzaF90YWJsZV9kbWE7CisJaW50IGhhc2hfbW9kZTsKKworCS8vIFRoZSBSeCBidWZmZXJzIG11c3QgYmUgOC1ieXRlIGFsaWduZWQKKwljaGFyICpyeF9idWZmOworCWRtYV9hZGRyX3QgcnhfYnVmZl9kbWE7CisJLy8gVHggYnVmZmVycyAodHhfc2tidWZmW2ldLT5kYXRhKSB3aXRoIGxlc3MgdGhhbiA4IGJ5dGVzCisJLy8gb2YgcGF5bG9hZCBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkCisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworCWludCByeF9uZXh0X291dDsJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5IHRvIHJlY2VpdmUgKi8KKwlpbnQgdHhfbmV4dF9pbjsJCS8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSB0byBzZW5kICovCisJaW50IHR4X25leHRfb3V0OwkvKiBUaGUgbGFzdCByaW5nIGVudHJ5IHRoZSBJU1IgcHJvY2Vzc2VkICovCisJaW50IHR4X2NvdW50OwkJLyogY3VycmVudCAjIG9mIHBrdHMgd2FpdGluZyB0byBiZSBzZW50IGluIFR4IHJpbmcgKi8KKwlpbnQgaW50cl93b3JrX2RvbmU7CS8qIG51bWJlciBvZiBSeCBhbmQgVHggcGt0cyBwcm9jZXNzZWQgaW4gdGhlIGlzciAqLworCWludCB0eF9mdWxsOwkJLyogVHggcmluZyBpcyBmdWxsICovCisKKwltaWJfY291bnRlcnNfdCBtaWI7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKwlpbnQgaW9fc2l6ZTsKKwlpbnQgcG9ydF9udW07CQkvLyAwIG9yIDEKKwl1MzIgcG9ydF9vZmZzZXQ7CisKKwlpbnQgcGh5X2FkZHI7CQkvLyBQSFkgYWRkcmVzcworCXUzMiBsYXN0X3BzcjsJCS8vIGxhc3QgdmFsdWUgb2YgdGhlIHBvcnQgc3RhdHVzIHJlZ2lzdGVyCisKKwlpbnQgb3B0aW9uczsJCS8qIFVzZXItc2V0dGFibGUgbWlzYy4gZHJpdmVyIG9wdGlvbnMuICovCisJaW50IGRydl9mbGFnczsKKwlzcGlubG9ja190IGxvY2s7CS8qIFNlcmlhbGlzZSBhY2Nlc3MgdG8gZGV2aWNlICovCisJc3RydWN0IG1paV9pZl9pbmZvIG1paV9pZjsKKworCXUzMiBtc2dfZW5hYmxlOworfTsKKworI2VuZGlmIC8qIF9HVDY0MjQwRVRIX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2d0OTYxMDBldGguYyBiL2RyaXZlcnMvbmV0L2d0OTYxMDBldGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjZjZmJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZ3Q5NjEwMGV0aC5jCkBAIC0wLDAgKzEsMTU2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIAlzdGV2ZWxAbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIEV0aGVybmV0IGRyaXZlciBmb3IgdGhlIE1JUFMgR1Q5NjEwMCBBZHZhbmNlZCBDb21tdW5pY2F0aW9uIENvbnRyb2xsZXIuCisgKiAKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAKKyAqICAgIDExLjExLjIwMDEgIE1vdmVkIHRvIDIuNC4xNCwgcHBvcG92QG12aXN0YS5jb20uICBNb2RpZmllZCBkcml2ZXIgdG8gYWRkCisgKiAgICAgICAgICAgICAgICBwcm9wZXIgZ3Q5NjEwMEEgc3VwcG9ydC4KKyAqICAgIDEyLjA1LjIwMDEgIE1vdmVkIGV0aCBwb3J0IDAgdG8gaXJxIDMgKG1hcHBlZCB0byBHVF9TRVJJTlQwIG9uIEVWOTYxMDBBKQorICogICAgICAgICAgICAgICAgaW4gb3JkZXIgZm9yIGJvdGggcG9ydHMgdG8gd29yay4gQWxzbyBjbGVhbmVkIHVwIGJvb3QKKyAqICAgICAgICAgICAgICAgIG9wdGlvbiBzdXBwb3J0IChtYWMgYWRkcmVzcyBzdHJpbmcgcGFyc2luZyksIGZsZXNoZWQgb3V0CisgKiAgICAgICAgICAgICAgICBndDk2MTAwX2NsZWFudXBfbW9kdWxlKCksIGFuZCBvdGhlciBnZW5lcmFsIGNvZGUgY2xlYW51cHMKKyAqICAgICAgICAgICAgICAgIDxzdGV2ZWxAbXZpc3RhLmNvbT4uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIERFU0NfQkUgMQorI2RlZmluZSBERVNDX0RBVEFfQkUgMQorCisjZGVmaW5lIEdUOTYxMDBfREVCVUcgMgorCisjaW5jbHVkZSAiZ3Q5NjEwMGV0aC5oIgorCisvLyBwcm90b3R5cGVzCitzdGF0aWMgdm9pZCogZG1hYWxsb2Moc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUpOworc3RhdGljIHZvaWQgZG1hZnJlZShzaXplX3Qgc2l6ZSwgdm9pZCAqdmFkZHIpOworc3RhdGljIHZvaWQgZ3Q5NjEwMF9kZWxheShpbnQgbXNlYyk7CitzdGF0aWMgaW50IGd0OTYxMDBfYWRkX2hhc2hfZW50cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHVuc2lnbmVkIGNoYXIqIGFkZHIpOworc3RhdGljIHZvaWQgcmVhZF9taWJfY291bnRlcnMoc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3ApOworc3RhdGljIGludCByZWFkX01JSShpbnQgcGh5X2FkZHIsIHUzMiByZWcpOworc3RhdGljIGludCB3cml0ZV9NSUkoaW50IHBoeV9hZGRyLCB1MzIgcmVnLCB1MTYgZGF0YSk7CitzdGF0aWMgaW50IGd0OTYxMDBfaW5pdF9tb2R1bGUodm9pZCk7CitzdGF0aWMgdm9pZCBndDk2MTAwX2NsZWFudXBfbW9kdWxlKHZvaWQpOworc3RhdGljIHZvaWQgZHVtcF9NSUkoaW50IGRiZ19sdmwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZHVtcF90eF9kZXNjKGludCBkYmdfbHZsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaSk7CitzdGF0aWMgdm9pZCBkdW1wX3J4X2Rlc2MoaW50IGRiZ19sdmwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpKTsKK3N0YXRpYyB2b2lkIGR1bXBfc2tiKGludCBkYmdfbHZsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgZHVtcF9od19hZGRyKGludCBkYmdfbHZsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIGNvbnN0IGNoYXIqIHBmeCwgdW5zaWduZWQgY2hhciogYWRkcl9zdHIpOworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKHN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwKTsKK3N0YXRpYyB2b2lkIGFib3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhYm9ydF9iaXRzKTsKK3N0YXRpYyB2b2lkIGhhcmRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVuYWJsZV9ldGhlcl9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBkaXNhYmxlX2V0aGVyX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZ3Q5NjEwMF9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBjaSwgaW50IHBvcnRfbnVtKTsKK3N0YXRpYyB2b2lkIHJlc2V0X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcmVzZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGd0OTYxMDBfY2hlY2tfdHhfY29uc2lzdGVudChzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCk7CitzdGF0aWMgaW50IGd0OTYxMDBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZ3Q5NjEwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBndDk2MTAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBndDk2MTAwX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBndDk2MTAwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdGF0dXMpOworc3RhdGljIGlycXJldHVybl90IGd0OTYxMDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgZ3Q5NjEwMF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZ3Q5NjEwMF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyogZ3Q5NjEwMF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK2V4dGVybiBjaGFyICogX19pbml0IHByb21fZ2V0Y21kbGluZSh2b2lkKTsKKworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAzMjsKKworI2RlZmluZSBuaWJzd2FwKHgpICgoKCh4KSA+PiA0KSAmIDB4MGYpIHwgKCgoeCkgPDwgNCkgJiAweGYwKSkKKworI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMgKyAoeCkpCisKKy8vIEZvciByZWFkaW5nL3dyaXRpbmcgMzItYml0IHdvcmRzIGFuZCBoYWxmLXdvcmRzIGZyb20vdG8gRE1BIG1lbW9yeQorI2lmZGVmIERFU0NfQkUKKyNkZWZpbmUgY3B1X3RvX2RtYTMyIGNwdV90b19iZTMyCisjZGVmaW5lIGRtYTMyX3RvX2NwdSBiZTMyX3RvX2NwdQorI2RlZmluZSBjcHVfdG9fZG1hMTYgY3B1X3RvX2JlMTYKKyNkZWZpbmUgZG1hMTZfdG9fY3B1IGJlMTZfdG9fY3B1CisjZWxzZQorI2RlZmluZSBjcHVfdG9fZG1hMzIgY3B1X3RvX2xlMzIKKyNkZWZpbmUgZG1hMzJfdG9fY3B1IGxlMzJfdG9fY3B1CisjZGVmaW5lIGNwdV90b19kbWExNiBjcHVfdG9fbGUxNgorI2RlZmluZSBkbWExNl90b19jcHUgbGUxNl90b19jcHUKKyNlbmRpZgorCitzdGF0aWMgY2hhciBtYWMwWzE4XSA9ICIwMC4wMi4wMy4wNC4wNS4wNiI7CitzdGF0aWMgY2hhciBtYWMxWzE4XSA9ICIwMC4wMS4wMi4wMy4wNC4wNSI7CitNT0RVTEVfUEFSTShtYWMwLCAiYzE4Iik7CitNT0RVTEVfUEFSTShtYWMxLCAiYzE4Iik7CitNT0RVTEVfUEFSTV9ERVNDKG1hYzAsICJNQUMgYWRkcmVzcyBmb3IgR1Q5NjEwMCBldGhlcm5ldCBwb3J0IDAiKTsKK01PRFVMRV9QQVJNX0RFU0MobWFjMSwgIk1BQyBhZGRyZXNzIGZvciBHVDk2MTAwIGV0aGVybmV0IHBvcnQgMSIpOworCisvKgorICogSW5mbyBmb3IgdGhlIEdUOTYxMDAgZXRoZXJuZXQgY29udHJvbGxlcidzIHBvcnRzLgorICovCitzdGF0aWMgc3RydWN0IGd0OTYxMDBfaWZfdCB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBpbnQgIGlvYmFzZTsgICAvLyBJTyBCYXNlIGFkZHJlc3Mgb2YgdGhpcyBwb3J0CisJaW50ICAgICAgICAgICBpcnE7ICAgICAgLy8gSVJRIG51bWJlciBvZiB0aGlzIHBvcnQKKwljaGFyICAgICAgICAgKm1hY19zdHI7Cit9IGd0OTYxMDBfaWZsaXN0W05VTV9JTlRFUkZBQ0VTXSA9IHsKKwl7CisJCU5VTEwsCisJCUdUOTYxMDBfRVRIMF9CQVNFLCBHVDk2MTAwX0VUSEVSMF9JUlEsCisJCW1hYzAKKwl9LAorCXsKKwkJTlVMTCwKKwkJR1Q5NjEwMF9FVEgxX0JBU0UsIEdUOTYxMDBfRVRIRVIxX0lSUSwKKwkJbWFjMQorCX0KK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhcioKK2NoaXBfbmFtZShpbnQgY2hpcF9yZXYpCit7CisJc3dpdGNoIChjaGlwX3JldikgeworCWNhc2UgUkVWX0dUOTYxMDA6CisJCXJldHVybiAiR1Q5NjEwMCI7CisJY2FzZSBSRVZfR1Q5NjEwMEFfMToKKwljYXNlIFJFVl9HVDk2MTAwQToKKwkJcmV0dXJuICJHVDk2MTAwQSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVbmtub3duIEdUOTYxMDAiOworCX0KK30KKworLyoKKyAgRE1BIG1lbW9yeSBhbGxvY2F0aW9uLCBkZXJpdmVkIGZyb20gcGNpX2FsbG9jX2NvbnNpc3RlbnQuCisqLworc3RhdGljIHZvaWQgKiBkbWFhbGxvYyhzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSkKK3sKKwl2b2lkICpyZXQ7CisJCisJcmV0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9BVE9NSUMgfCBHRlBfRE1BLCBnZXRfb3JkZXIoc2l6ZSkpOworCQorCWlmIChyZXQgIT0gTlVMTCkgeworCQlkbWFfY2FjaGVfaW52KCh1bnNpZ25lZCBsb25nKXJldCwgc2l6ZSk7CisJCWlmIChkbWFfaGFuZGxlICE9IE5VTEwpCisJCQkqZG1hX2hhbmRsZSA9IHZpcnRfdG9fcGh5cyhyZXQpOworCisJCS8qIGJ1bXAgdmlydHVhbCBhZGRyZXNzIHVwIHRvIG5vbi1jYWNoZWQgYXJlYSAqLworCQlyZXQgPSAodm9pZCopS1NFRzFBRERSKHJldCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZG1hZnJlZShzaXplX3Qgc2l6ZSwgdm9pZCAqdmFkZHIpCit7CisJdmFkZHIgPSAodm9pZCopS1NFRzBBRERSKHZhZGRyKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOworfQorCitzdGF0aWMgdm9pZCBndDk2MTAwX2RlbGF5KGludCBtcykKK3sKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCXJldHVybjsKKwllbHNlCisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKG1zKTsKK30KKworc3RhdGljIGludAorcGFyc2VfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciogbWFjc3RyKQoreworCWludCBpLCBqOworCXVuc2lnbmVkIGNoYXIgcmVzdWx0LCB2YWx1ZTsKKwkKKwlmb3IgKGk9MDsgaTw2OyBpKyspIHsKKwkJcmVzdWx0ID0gMDsKKwkJaWYgKGkgIT0gNSAmJiAqKG1hY3N0cisyKSAhPSAnLicpIHsKKwkJCWVycihfX0ZJTEVfXyAiaW52YWxpZCBtYWMgYWRkcmVzcyBmb3JtYXQ6ICVkICVjXG4iLAorCQkJICAgIGksICoobWFjc3RyKzIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCQorCQlmb3IgKGo9MDsgajwyOyBqKyspIHsKKwkJCWlmIChpc3hkaWdpdCgqbWFjc3RyKSAmJgorCQkJICAgICh2YWx1ZSA9IGlzZGlnaXQoKm1hY3N0cikgPyAqbWFjc3RyLScwJyA6IAorCQkJICAgICB0b3VwcGVyKCptYWNzdHIpLSdBJysxMCkgPCAxNikgeworCQkJCXJlc3VsdCA9IHJlc3VsdCoxNiArIHZhbHVlOworCQkJCW1hY3N0cisrOworCQkJfSBlbHNlIHsKKwkJCQllcnIoX19GSUxFX18gImludmFsaWQgbWFjIGFkZHJlc3MgIgorCQkJCSAgICAiY2hhcmFjdGVyOiAlY1xuIiwgKm1hY3N0cik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKworCQltYWNzdHIrKzsgLy8gc3RlcCBvdmVyICcuJworCQlkZXYtPmRldl9hZGRyW2ldID0gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3JlYWRfTUlJKGludCBwaHlfYWRkciwgdTMyIHJlZykKK3sKKwlpbnQgdGltZWRvdXQgPSAyMDsKKwl1MzIgc21pciA9IHNtaXJPcENvZGUgfCAocGh5X2FkZHIgPDwgc21pclBoeUFkQml0KSB8CisJCShyZWcgPDwgc21pclJlZ0FkQml0KTsKKworCS8vIHdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGNvbXBsZXRlCisJd2hpbGUgKEdUOTYxMDBfUkVBRChHVDk2MTAwX0VUSF9TTUlfUkVHKSAmIHNtaXJCdXN5KSB7CisJCS8vIHNub296ZSBmb3IgMSBtc2VjIGFuZCBjaGVjayBhZ2FpbgorCQlndDk2MTAwX2RlbGF5KDEpOworCisJCWlmICgtLXRpbWVkb3V0ID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJ1c3kgdGltZW91dCEhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisgICAgCisJR1Q5NjEwMF9XUklURShHVDk2MTAwX0VUSF9TTUlfUkVHLCBzbWlyKTsKKworCXRpbWVkb3V0ID0gMjA7CisJLy8gd2FpdCBmb3IgcmVhZCB0byBjb21wbGV0ZQorCXdoaWxlICghKChzbWlyID0gR1Q5NjEwMF9SRUFEKEdUOTYxMDBfRVRIX1NNSV9SRUcpKSAmIHNtaXJSZWFkVmFsaWQpKSB7CisJCS8vIHNub296ZSBmb3IgMSBtc2VjIGFuZCBjaGVjayBhZ2FpbgorCQlndDk2MTAwX2RlbGF5KDEpOworCQorCQlpZiAoLS10aW1lZG91dCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0ISFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCXJldHVybiAoaW50KShzbWlyICYgc21pckRhdGFNYXNrKTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfdHhfZGVzYyhpbnQgZGJnX2x2bCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGkpCit7CisJc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOworCWd0OTYxMDBfdGRfdCAqdGQgPSAmZ3AtPnR4X3JpbmdbaV07CisKKwlkYmcoZGJnX2x2bCwgIlR4IGRlc2NyaXB0b3IgYXQgMHglMDhseDpcbiIsIHZpcnRfdG9fcGh5cyh0ZCkpOworCWRiZyhkYmdfbHZsLAorCSAgICAiICAgIGNtZHN0YXQ9JTA0eCwgYnl0ZV9jbnQ9JTA0eCwgYnVmZl9wdHI9JTA0eCwgbmV4dD0lMDR4XG4iLAorCSAgICBkbWEzMl90b19jcHUodGQtPmNtZHN0YXQpLAorCSAgICBkbWExNl90b19jcHUodGQtPmJ5dGVfY250KSwKKwkgICAgZG1hMzJfdG9fY3B1KHRkLT5idWZmX3B0ciksCisJICAgIGRtYTMyX3RvX2NwdSh0ZC0+bmV4dCkpOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9yeF9kZXNjKGludCBkYmdfbHZsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaSkKK3sKKwlzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCA9IG5ldGRldl9wcml2KGRldik7CisJZ3Q5NjEwMF9yZF90ICpyZCA9ICZncC0+cnhfcmluZ1tpXTsKKworCWRiZyhkYmdfbHZsLCAiUnggZGVzY3JpcHRvciBhdCAweCUwOGx4OlxuIiwgdmlydF90b19waHlzKHJkKSk7CisJZGJnKGRiZ19sdmwsICIgICAgY21kc3RhdD0lMDR4LCBidWZmX3N6PSUwNHgsIGJ5dGVfY250PSUwNHgsICIKKwkgICAgImJ1ZmZfcHRyPSUwNHgsIG5leHQ9JTA0eFxuIiwKKwkgICAgZG1hMzJfdG9fY3B1KHJkLT5jbWRzdGF0KSwKKwkgICAgZG1hMTZfdG9fY3B1KHJkLT5idWZmX3N6KSwKKwkgICAgZG1hMTZfdG9fY3B1KHJkLT5ieXRlX2NudCksCisJICAgIGRtYTMyX3RvX2NwdShyZC0+YnVmZl9wdHIpLAorCSAgICBkbWEzMl90b19jcHUocmQtPm5leHQpKTsKK30KKworc3RhdGljIGludAord3JpdGVfTUlJKGludCBwaHlfYWRkciwgdTMyIHJlZywgdTE2IGRhdGEpCit7CisJaW50IHRpbWVkb3V0ID0gMjA7CisJdTMyIHNtaXIgPSAocGh5X2FkZHIgPDwgc21pclBoeUFkQml0KSB8CisJCShyZWcgPDwgc21pclJlZ0FkQml0KSB8IGRhdGE7CisKKwkvLyB3YWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBjb21wbGV0ZQorCXdoaWxlIChHVDk2MTAwX1JFQUQoR1Q5NjEwMF9FVEhfU01JX1JFRykgJiBzbWlyQnVzeSkgeworCQkvLyBzbm9vemUgZm9yIDEgbXNlYyBhbmQgY2hlY2sgYWdhaW4KKwkJZ3Q5NjEwMF9kZWxheSgxKTsKKwkKKwkJaWYgKC0tdGltZWRvdXQgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogYnVzeSB0aW1lb3V0ISFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlHVDk2MTAwX1dSSVRFKEdUOTYxMDBfRVRIX1NNSV9SRUcsIHNtaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9NSUkoaW50IGRiZ19sdmwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGksIHZhbDsKKwlzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCA9IG5ldGRldl9wcml2KGRldik7CisgICAgCisJaWYgKGRiZ19sdmwgPD0gR1Q5NjEwMF9ERUJVRykgeworCQlmb3IgKGk9MDsgaTw3OyBpKyspIHsKKwkJCWlmICgodmFsID0gcmVhZF9NSUkoZ3AtPnBoeV9hZGRyLCBpKSkgPj0gMCkKKwkJCQlwcmludGsoIk1JSSBSZWcgJWQ9JXhcbiIsIGksIHZhbCk7CisJCX0KKwkJZm9yIChpPTE2OyBpPDIxOyBpKyspIHsKKwkJCWlmICgodmFsID0gcmVhZF9NSUkoZ3AtPnBoeV9hZGRyLCBpKSkgPj0gMCkKKwkJCQlwcmludGsoIk1JSSBSZWcgJWQ9JXhcbiIsIGksIHZhbCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2h3X2FkZHIoaW50IGRiZ19sdmwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIqIHBmeCwKKwkgICAgIHVuc2lnbmVkIGNoYXIqIGFkZHJfc3RyKQoreworCWludCBpOworCWNoYXIgYnVmWzEwMF0sIG9jdGV0WzVdOworICAgIAorCWlmIChkYmdfbHZsIDw9IEdUOTYxMDBfREVCVUcpIHsKKwkJc3RyY3B5KGJ1ZiwgcGZ4KTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJc3ByaW50ZihvY3RldCwgIiUyLjJ4JXMiLAorCQkJCWFkZHJfc3RyW2ldLCBpPDUgPyAiOiIgOiAiXG4iKTsKKwkJCXN0cmNhdChidWYsIG9jdGV0KTsKKwkJfQorCQlpbmZvKCIlcyIsIGJ1Zik7CisJfQorfQorCisKK3N0YXRpYyB2b2lkCitkdW1wX3NrYihpbnQgZGJnX2x2bCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyKiBza2JkYXRhOworICAgIAorCWlmIChkYmdfbHZsIDw9IEdUOTYxMDBfREVCVUcpIHsKKwkJZGJnKGRiZ19sdmwsICIlczogc2tiPSVwLCBza2ItPmRhdGE9JXAsIHNrYi0+bGVuPSVkXG4iLAorCQkgICAgX19GVU5DVElPTl9fLCBza2IsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJCXNrYmRhdGEgPSAodW5zaWduZWQgY2hhciopS1NFRzFBRERSKHNrYi0+ZGF0YSk7CisgICAgCisJCWZvciAoaT0wOyBpPHNrYi0+bGVuOyBpKyspIHsKKwkJCWlmICghKGkgJSAxNikpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuICAgJTMuM3g6ICUyLjJ4LCIsCisJCQkJICAgICAgIGksIHNrYmRhdGFbaV0pOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlMi4yeCwiLCBza2JkYXRhW2ldKTsKKwkJfQorCQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKKwl9Cit9CisKKworc3RhdGljIGludAorZ3Q5NjEwMF9hZGRfaGFzaF9lbnRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyKiBhZGRyKQoreworCXN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkvL3UxNiBoYXNoUmVzdWx0LCBzdG1wOworCS8vdW5zaWduZWQgY2hhciBjdG1wLCBoYXNoX2VhWzZdOworCXUzMiB0YmxFbnRyeTEsIHRibEVudHJ5MCwgKnRibEVudHJ5QWRkcjsKKwlpbnQgaTsKKworCXRibEVudHJ5MSA9IGh0ZVZhbGlkIHwgaHRlUkQ7CisJdGJsRW50cnkxIHw9ICh1MzIpYWRkcls1XSA8PCAzOworCXRibEVudHJ5MSB8PSAodTMyKWFkZHJbNF0gPDwgMTE7CisJdGJsRW50cnkxIHw9ICh1MzIpYWRkclszXSA8PCAxOTsKKwl0YmxFbnRyeTEgfD0gKCh1MzIpYWRkclsyXSAmIDB4MWYpIDw8IDI3OworCWRiZygzLCAiJXM6IHRibEVudHJ5MT0leFxuIiwgX19GVU5DVElPTl9fLCB0YmxFbnRyeTEpOworCXRibEVudHJ5MCA9ICgodTMyKWFkZHJbMl0gPj4gNSkgJiAweDA3OworCXRibEVudHJ5MCB8PSAodTMyKWFkZHJbMV0gPDwgMzsKKwl0YmxFbnRyeTAgfD0gKHUzMilhZGRyWzBdIDw8IDExOworCWRiZygzLCAiJXM6IHRibEVudHJ5MD0leFxuIiwgX19GVU5DVElPTl9fLCB0YmxFbnRyeTApOworCisjaWYgMAorCisJZm9yIChpPTA7IGk8NjsgaSsrKSB7CisJCS8vIG5pYmJsZSBzd2FwCisJCWN0bXAgPSBuaWJzd2FwKGFkZHJbaV0pOworCQkvLyBpbnZlcnQgZXZlcnkgbmliYmxlCisJCWhhc2hfZWFbaV0gPSAoKGN0bXAmMSk8PDMpIHwgKChjdG1wJjgpPj4zKSB8CisJCQkoKGN0bXAmMik8PDEpIHwgKChjdG1wJjQpPj4xKTsKKwkJaGFzaF9lYVtpXSB8PSAoKGN0bXAmMHgxMCk8PDMpIHwgKChjdG1wJjB4ODApPj4zKSB8CisJCQkoKGN0bXAmMHgyMCk8PDEpIHwgKChjdG1wJjB4NDApPj4xKTsKKwl9CisKKwlkdW1wX2h3X2FkZHIoMywgZGV2LCAiJXM6IG5pYiBzd2FwL2ludnQgYWRkcj0iLCBfX0ZVTkNUSU9OX18sIGhhc2hfZWEpOworICAgIAorCWlmIChncC0+aGFzaF9tb2RlID09IDApIHsKKwkJaGFzaFJlc3VsdCA9ICgodTE2KWhhc2hfZWFbMF0gJiAweGZjKSA8PCA3OworCQlzdG1wID0gKCh1MTYpaGFzaF9lYVswXSAmIDB4MDMpIHwKKwkJCSgoKHUxNiloYXNoX2VhWzFdICYgMHg3ZikgPDwgMik7CisJCXN0bXAgXj0gKCgodTE2KWhhc2hfZWFbMV0gPj4gNykgJiAweDAxKSB8CisJCQkoKHUxNiloYXNoX2VhWzJdIDw8IDEpOworCQlzdG1wIF49ICh1MTYpaGFzaF9lYVszXSB8ICgoKHUxNiloYXNoX2VhWzRdICYgMSkgPDwgOCk7CisJCWhhc2hSZXN1bHQgfD0gc3RtcDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLTE7IC8vIGRvbid0IHN1cHBvcnQgaGFzaCBtb2RlIDEKKwl9CisKKwlkYmcoMywgIiVzOiBoYXNoUmVzdWx0PSV4XG4iLCBfX0ZVTkNUSU9OX18sIGhhc2hSZXN1bHQpOworCisJdGJsRW50cnlBZGRyID0KKwkJKHUzMiAqKSgmZ3AtPmhhc2hfdGFibGVbKCh1MzIpaGFzaFJlc3VsdCAmIDB4N2ZmKSA8PCAzXSk7CisgICAgCisJZGJnKDMsICIlczogdGJsRW50cnlBZGRyPSVwXG4iLCB0YmxFbnRyeUFkZHIsIF9fRlVOQ1RJT05fXyk7CisKKwlmb3IgKGk9MDsgaTxIQVNIX0hPUF9OVU1CRVI7IGkrKykgeworCQlpZiAoKCp0YmxFbnRyeUFkZHIgJiBodGVWYWxpZCkgJiYKKwkJICAgICEoKnRibEVudHJ5QWRkciAmIGh0ZVNraXApKSB7CisJCQkvLyBUaGlzIGVudHJ5IGlzIGFscmVhZHkgb2NjdXBpZWQsIGdvIHRvIG5leHQgZW50cnkKKwkJCXRibEVudHJ5QWRkciArPSAyOworCQkJZGJnKDMsICIlczogc2tpcHBpbmcgdG8gJXBcbiIsIF9fRlVOQ1RJT05fXywgCisJCQkgICAgdGJsRW50cnlBZGRyKTsKKwkJfSBlbHNlIHsKKwkJCW1lbXNldCh0YmxFbnRyeUFkZHIsIDAsIDgpOworCQkJdGJsRW50cnlBZGRyWzFdID0gY3B1X3RvX2RtYTMyKHRibEVudHJ5MSk7CisJCQl0YmxFbnRyeUFkZHJbMF0gPSBjcHVfdG9fZG1hMzIodGJsRW50cnkwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPj0gSEFTSF9IT1BfTlVNQkVSKSB7CisJCWVycigiJXM6IGV4cGlyZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLTE7IC8vIENvdWxkbid0IGZpbmQgYW4gdW51c2VkIGVudHJ5CisJfQorCisjZWxzZQorCisJdGJsRW50cnlBZGRyID0gKHUzMiAqKWdwLT5oYXNoX3RhYmxlOworCWZvciAoaT0wOyBpPFJYX0hBU0hfVEFCTEVfU0laRS80OyBpKz0yKSB7CisJCXRibEVudHJ5QWRkcltpKzFdID0gY3B1X3RvX2RtYTMyKHRibEVudHJ5MSk7CisJCXRibEVudHJ5QWRkcltpXSA9IGNwdV90b19kbWEzMih0YmxFbnRyeTApOworCX0KKworI2VuZGlmCisgICAgCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK3JlYWRfbWliX2NvdW50ZXJzKHN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwKQoreworCXUzMiogbWliX3JlZ3MgPSAodTMyKikmZ3AtPm1pYjsKKwlpbnQgaTsKKyAgICAKKwlmb3IgKGk9MDsgaTxzaXplb2YobWliX2NvdW50ZXJzX3QpL3NpemVvZih1MzIpOyBpKyspCisJCW1pYl9yZWdzW2ldID0gR1Q5NjEwMEVUSF9SRUFEKGdwLCBHVDk2MTAwX0VUSF9NSUJfQ09VTlRfQkFTRSArCisJCQkJCSAgICAgIGkqc2l6ZW9mKHUzMikpOworfQorCisKK3N0YXRpYyB2b2lkCit1cGRhdGVfc3RhdHMoc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3ApCit7CisJbWliX2NvdW50ZXJzX3QgKm1pYiA9ICZncC0+bWliOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZncC0+c3RhdHM7CisgICAgCisJcmVhZF9taWJfY291bnRlcnMoZ3ApOworICAgIAorCXN0YXRzLT5yeF9wYWNrZXRzID0gbWliLT50b3RhbEZyYW1lc1JlY2VpdmVkOworCXN0YXRzLT50eF9wYWNrZXRzID0gbWliLT5mcmFtZXNTZW50OworCXN0YXRzLT5yeF9ieXRlcyA9IG1pYi0+dG90YWxCeXRlUmVjZWl2ZWQ7CisJc3RhdHMtPnR4X2J5dGVzID0gbWliLT5ieXRlU2VudDsKKwlzdGF0cy0+cnhfZXJyb3JzID0gbWliLT50b3RhbEZyYW1lc1JlY2VpdmVkIC0gbWliLT5mcmFtZXNSZWNlaXZlZDsKKwkvL3RoZSB0eCBlcnJvciBjb3VudGVycyBhcmUgaW5jcmVtZW50ZWQgYnkgdGhlIElTUgorCS8vcnhfZHJvcHBlZCBpbmNyZW1lbnRlZCBieSBndDk2MTAwX3J4CisJLy90eF9kcm9wcGVkIGluY3JlbWVudGVkIGJ5IGd0OTYxMDBfdHgKKwlzdGF0cy0+bXVsdGljYXN0ID0gbWliLT5tdWx0aWNhc3RGcmFtZXNSZWNlaXZlZDsKKwkvLyBjb2xsaXNpb25zIGluY3JlbWVudGVkIGJ5IGd0OTYxMDBfdHhfY29tcGxldGUKKwlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyA9IG1pYi0+b3ZlcnNpemVGcmFtZXMgKyBtaWItPmZyYWdtZW50czsKKwkvLyBUaGUgUnhFcnJvciBjb25kaXRpb24gbWVhbnMgdGhlIFJ4IERNQSBlbmNvdW50ZXJlZCBhCisJLy8gQ1BVIG93bmVkIGRlc2NyaXB0b3IsIHdoaWNoLCBpZiB0aGluZ3MgYXJlIHdvcmtpbmcgYXMKKwkvLyB0aGV5IHNob3VsZCwgbWVhbnMgdGhlIFJ4IHJpbmcgaGFzIG92ZXJmbG93ZWQuCisJc3RhdHMtPnJ4X292ZXJfZXJyb3JzID0gbWliLT5tYWNSeEVycm9yOworCXN0YXRzLT5yeF9jcmNfZXJyb3JzID0gbWliLT5jUkNFcnJvcjsKK30KKworc3RhdGljIHZvaWQKK2Fib3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhYm9ydF9iaXRzKQoreworCXN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgdGltZWRvdXQgPSAxMDA7IC8vIHdhaXQgdXAgdG8gMTAwIG1zZWMgZm9yIGhhcmQgc3RvcCB0byBjb21wbGV0ZQorCisJZGJnKDMsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCS8vIFJldHVybiBpZiBuZWl0aGVyIFJ4IG9yIFR4IGFib3J0IGJpdHMgYXJlIHNldAorCWlmICghKGFib3J0X2JpdHMgJiAoc2RjbXJBUiB8IHNkY21yQVQpKSkKKwkJcmV0dXJuOworCisJLy8gbWFrZSBzdXJlIG9ubHkgdGhlIFJ4L1R4IGFib3J0IGJpdHMgYXJlIHNldAorCWFib3J0X2JpdHMgJj0gKHNkY21yQVIgfCBzZGNtckFUKTsKKyAgICAKKwlzcGluX2xvY2soJmdwLT5sb2NrKTsKKworCS8vIGFib3J0IGFueSBSeC9UeCBETUEgaW1tZWRpYXRlbHkKKwlHVDk2MTAwRVRIX1dSSVRFKGdwLCBHVDk2MTAwX0VUSF9TRE1BX0NPTU0sIGFib3J0X2JpdHMpOworCisJZGJnKDMsICIlczogU0RNQSBjb21tID0gJXhcbiIsIF9fRlVOQ1RJT05fXywKKwkgICAgR1Q5NjEwMEVUSF9SRUFEKGdwLCBHVDk2MTAwX0VUSF9TRE1BX0NPTU0pKTsKKworCS8vIHdhaXQgZm9yIGFib3J0IHRvIGNvbXBsZXRlCisJd2hpbGUgKEdUOTYxMDBFVEhfUkVBRChncCwgR1Q5NjEwMF9FVEhfU0RNQV9DT01NKSAmIGFib3J0X2JpdHMpIHsKKwkJLy8gc25vb3plIGZvciAxIG1zZWMgYW5kIGNoZWNrIGFnYWluCisJCWd0OTYxMDBfZGVsYXkoMSk7CisJCisJCWlmICgtLXRpbWVkb3V0ID09IDApIHsKKwkJCWVycigiJXM6IHRpbWVvdXQhIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJmdwLT5sb2NrKTsKK30KKworCitzdGF0aWMgdm9pZAoraGFyZF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZGJnKDMsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWRpc2FibGVfZXRoZXJfaXJxKGRldik7CisKKwlhYm9ydChkZXYsIHNkY21yQVIgfCBzZGNtckFUKTsKKworCS8vIGRpc2FibGUgcG9ydAorCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX1BPUlRfQ09ORklHLCAwKTsKK30KKworCitzdGF0aWMgdm9pZAorZW5hYmxlX2V0aGVyX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgaW50TWFzazsKKwkvKgorCSAqIHJvdXRlIGV0aGVybmV0IGludGVycnVwdCB0byBHVF9TRVJJTlQwIGZvciBwb3J0IDAsCisJICogR1RfSU5UMCBmb3IgcG9ydCAxLgorCSAqLworCWludCBpbnRyX21hc2tfcmVnID0gKGdwLT5wb3J0X251bSA9PSAwKSA/CisJCUdUOTYxMDBfU0VSSU5UMF9NQVNLIDogR1Q5NjEwMF9JTlQwX0hJR0hfTUFTSzsKKwkKKwlpZiAoZ3AtPmNoaXBfcmV2ID49IFJFVl9HVDk2MTAwQV8xKSB7CisJCWludE1hc2sgPSBpY3JUeEJ1ZmZlckxvdyB8IGljclR4RW5kTG93IHwKKwkJCWljclR4RXJyb3JMb3cgIHwgaWNyUnhPVlIgfCBpY3JUeFVkciB8CisJCQlpY3JSeEJ1ZmZlclEwIHwgaWNyUnhFcnJvclEwIHwKKwkJCWljck1JSVBoeVNUQyB8IGljckV0aGVySW50U3VtOworCX0KKwllbHNlIHsKKwkJaW50TWFzayA9IGljclR4QnVmZmVyTG93IHwgaWNyVHhFbmRMb3cgfAorCQkJaWNyVHhFcnJvckxvdyAgfCBpY3JSeE9WUiB8IGljclR4VWRyIHwKKwkJCWljclJ4QnVmZmVyIHwgaWNyUnhFcnJvciB8CisJCQlpY3JNSUlQaHlTVEMgfCBpY3JFdGhlckludFN1bTsKKwl9CisJCisJLy8gdW5tYXNrIGludGVycnVwdHMKKwlHVDk2MTAwRVRIX1dSSVRFKGdwLCBHVDk2MTAwX0VUSF9JTlRfTUFTSywgaW50TWFzayk7CisgICAgCisJaW50TWFzayA9IEdUOTYxMDBfUkVBRChpbnRyX21hc2tfcmVnKTsKKwlpbnRNYXNrIHw9IDE8PGdwLT5wb3J0X251bTsKKwlHVDk2MTAwX1dSSVRFKGludHJfbWFza19yZWcsIGludE1hc2spOworfQorCitzdGF0aWMgdm9pZAorZGlzYWJsZV9ldGhlcl9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIGludE1hc2s7CisJaW50IGludHJfbWFza19yZWcgPSAoZ3AtPnBvcnRfbnVtID09IDApID8KKwkJR1Q5NjEwMF9TRVJJTlQwX01BU0sgOiBHVDk2MTAwX0lOVDBfSElHSF9NQVNLOworCisJaW50TWFzayA9IEdUOTYxMDBfUkVBRChpbnRyX21hc2tfcmVnKTsKKwlpbnRNYXNrICY9IH4oMTw8Z3AtPnBvcnRfbnVtKTsKKwlHVDk2MTAwX1dSSVRFKGludHJfbWFza19yZWcsIGludE1hc2spOworICAgIAorCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX0lOVF9NQVNLLCAwKTsKK30KKworCisvKgorICogSW5pdCBHVDk2MTAwIGV0aGVybmV0IGNvbnRyb2xsZXIgZHJpdmVyCisgKi8KK3N0YXRpYyBpbnQgZ3Q5NjEwMF9pbml0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2k7CisJaW50IGksIHJldHZhbD0wOworCXUzMiBjcHVDb25maWc7CisKKwkvKgorCSAqIFN0dXBpZCBwcm9iZSBiZWNhdXNlIHRoaXMgcmVhbGx5IGlzbid0IGEgUENJIGRldmljZQorCSAqLworCWlmICghKHBjaSA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX01BUlZFTEwsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfTUFSVkVMTF9HVDk2MTAwLCBOVUxMKSkgJiYKKwkgICAgIShwY2kgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLAorCQkgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfTUFSVkVMTF9HVDk2MTAwQSwgTlVMTCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiBfX0ZJTEVfXyAiOiBHVDk2MTAwIG5vdCBmb3VuZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljcHVDb25maWcgPSBHVDk2MTAwX1JFQUQoR1Q5NjEwMF9DUFVfSU5URVJGX0NPTkZJRyk7CisJaWYgKGNwdUNvbmZpZyAmICgxPDwxMikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIF9fRklMRV9fCisJCSAgICAgICAiOiBtdXN0IGJlIGluIEJpZyBFbmRpYW4gbW9kZSFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmb3IgKGk9MDsgaSA8IE5VTV9JTlRFUkZBQ0VTOyBpKyspCisJCXJldHZhbCB8PSBndDk2MTAwX3Byb2JlMShwY2ksIGkpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBfX2luaXQgZ3Q5NjEwMF9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBjaSwgaW50IHBvcnRfbnVtKQoreworCXN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwID0gTlVMTDsKKwlzdHJ1Y3QgZ3Q5NjEwMF9pZl90ICpndGlmID0gJmd0OTYxMDBfaWZsaXN0W3BvcnRfbnVtXTsKKwlpbnQgcGh5X2FkZHIsIHBoeV9pZDEsIHBoeV9pZDI7CisJdTMyIHBoeUFEOworCWludCByZXR2YWw7CisJdW5zaWduZWQgY2hhciBjaGlwX3JldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKyAgICAKKwlpZiAoZ3RpZi0+aXJxIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpcnEgdW5rbm93biAtIHByb2Jpbmcgbm90IHN1cHBvcnRlZFxuIiwKKwkJICAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorICAgIAorCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaSwgUENJX1JFVklTSU9OX0lELCAmY2hpcF9yZXYpOworCisJaWYgKGNoaXBfcmV2ID49IFJFVl9HVDk2MTAwQV8xKSB7CisJCXBoeUFEID0gR1Q5NjEwMF9SRUFEKEdUOTYxMDBfRVRIX1BIWV9BRERSX1JFRyk7CisJCXBoeV9hZGRyID0gKHBoeUFEID4+ICg1KnBvcnRfbnVtKSkgJiAweDFmOworCX0gZWxzZSB7CisJCS8qCisJCSAqIG5vdCBzdXJlIHdoYXQncyB0aGlzIGFib3V0IC0tIHByb2JhYmx5IGEgZ3QgYnVnCisJCSAqLworCQlwaHlfYWRkciA9IHBvcnRfbnVtOworCQlwaHlBRCA9IEdUOTYxMDBfUkVBRChHVDk2MTAwX0VUSF9QSFlfQUREUl9SRUcpOworCQlwaHlBRCAmPSB+KDB4MWYgPDwgKHBvcnRfbnVtKjUpKTsKKwkJcGh5QUQgfD0gcGh5X2FkZHIgPDwgKHBvcnRfbnVtKjUpOworCQlHVDk2MTAwX1dSSVRFKEdUOTYxMDBfRVRIX1BIWV9BRERSX1JFRywgcGh5QUQpOworCX0KKwkKKwkvLyBwcm9iZSBmb3IgdGhlIGV4dGVybmFsIFBIWQorCWlmICgocGh5X2lkMSA9IHJlYWRfTUlJKHBoeV9hZGRyLCAyKSkgPD0gMCB8fAorCSAgICAocGh5X2lkMiA9IHJlYWRfTUlJKHBoeV9hZGRyLCAzKSkgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBQSFkgZm91bmQgb24gTUlJJWRcbiIsIF9fRlVOQ1RJT05fXywgcG9ydF9udW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihndGlmLT5pb2Jhc2UsIEdUOTYxMDBfRVRIX0lPX1NJWkUsICJHVDk2MTAwRVRIIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVxdWVzdF9yZWdpb24gZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlKSk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0OworCWd0aWYtPmRldiA9IGRldjsKKwkKKwkvKiBwcml2YXRlIHN0cnVjdCBhbGlnbmVkIGFuZCB6ZXJvZWQgYnkgYWxsb2NfZXRoZXJkZXYgKi8KKwkvKiBGaWxsIGluIHRoZSAnZGV2JyBmaWVsZHMuICovCisJZGV2LT5iYXNlX2FkZHIgPSBndGlmLT5pb2Jhc2U7CisJZGV2LT5pcnEgPSBndGlmLT5pcnE7CisKKwlpZiAoKHJldHZhbCA9IHBhcnNlX21hY19hZGRyKGRldiwgZ3RpZi0+bWFjX3N0cikpKSB7CisJCWVycigiJXM6IE1BQyBhZGRyZXNzIHBhcnNlIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBvdXQxOworCX0KKworCWdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW1lbXNldChncCwgMCwgc2l6ZW9mKCpncCkpOyAvLyBjbGVhciBpdAorCisJZ3AtPnBvcnRfbnVtID0gcG9ydF9udW07CisJZ3AtPmlvX3NpemUgPSBHVDk2MTAwX0VUSF9JT19TSVpFOworCWdwLT5wb3J0X29mZnNldCA9IHBvcnRfbnVtICogR1Q5NjEwMF9FVEhfSU9fU0laRTsKKwlncC0+cGh5X2FkZHIgPSBwaHlfYWRkcjsKKwlncC0+Y2hpcF9yZXYgPSBjaGlwX3JldjsKKworCWluZm8oIiVzIGZvdW5kIGF0IDB4JXgsIGlycSAlZFxuIiwKKwkgICAgIGNoaXBfbmFtZShncC0+Y2hpcF9yZXYpLCBndGlmLT5pb2Jhc2UsIGd0aWYtPmlycSk7CisJZHVtcF9od19hZGRyKDAsIGRldiwgIkhXIEFkZHJlc3MgIiwgZGV2LT5kZXZfYWRkcik7CisJaW5mbygiJXMgY2hpcCByZXZpc2lvbj0lZFxuIiwgY2hpcF9uYW1lKGdwLT5jaGlwX3JldiksIGdwLT5jaGlwX3Jldik7CisJaW5mbygiJXMgZXRoZXJuZXQgcG9ydCAlZFxuIiwgY2hpcF9uYW1lKGdwLT5jaGlwX3JldiksIGdwLT5wb3J0X251bSk7CisJaW5mbygiZXh0ZXJuYWwgUEhZIElEMT0weCUwNHgsIElEMj0weCUwNHhcbiIsIHBoeV9pZDEsIHBoeV9pZDIpOworCisJLy8gQWxsb2NhdGUgUnggYW5kIFR4IGRlc2NyaXB0b3IgcmluZ3MKKwlpZiAoZ3AtPnJ4X3JpbmcgPT0gTlVMTCkgeworCQkvLyBBbGwgZGVzY3JpcHRvcnMgaW4gcmluZyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAorCQlncC0+cnhfcmluZyA9IGRtYWFsbG9jKHNpemVvZihndDk2MTAwX3JkX3QpICogUlhfUklOR19TSVpFCisJCQkJICAgICAgICsgc2l6ZW9mKGd0OTYxMDBfdGRfdCkgKiBUWF9SSU5HX1NJWkUsCisJCQkJICAgICAgICZncC0+cnhfcmluZ19kbWEpOworCQlpZiAoZ3AtPnJ4X3JpbmcgPT0gTlVMTCkgeworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0MTsKKwkJfQorCQorCQlncC0+dHhfcmluZyA9IChndDk2MTAwX3RkX3QgKikoZ3AtPnJ4X3JpbmcgKyBSWF9SSU5HX1NJWkUpOworCQlncC0+dHhfcmluZ19kbWEgPQorCQkJZ3AtPnJ4X3JpbmdfZG1hICsgc2l6ZW9mKGd0OTYxMDBfcmRfdCkgKiBSWF9SSU5HX1NJWkU7CisJfQorICAgIAorCS8vIEFsbG9jYXRlIHRoZSBSeCBEYXRhIEJ1ZmZlcnMKKwlpZiAoZ3AtPnJ4X2J1ZmYgPT0gTlVMTCkgeworCQlncC0+cnhfYnVmZiA9IGRtYWFsbG9jKFBLVF9CVUZfU1oqUlhfUklOR19TSVpFLAorCQkJCSAgICAgICAmZ3AtPnJ4X2J1ZmZfZG1hKTsKKwkJaWYgKGdwLT5yeF9idWZmID09IE5VTEwpIHsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDI7CisJCX0KKwl9CisgICAgCisJZGJnKDMsICIlczogcnhfcmluZz0lcCwgdHhfcmluZz0lcFxuIiwgX19GVU5DVElPTl9fLAorCSAgICBncC0+cnhfcmluZywgZ3AtPnR4X3JpbmcpOworCisJLy8gQWxsb2NhdGUgUnggSGFzaCBUYWJsZQorCWlmIChncC0+aGFzaF90YWJsZSA9PSBOVUxMKSB7CisJCWdwLT5oYXNoX3RhYmxlID0gKGNoYXIqKWRtYWFsbG9jKFJYX0hBU0hfVEFCTEVfU0laRSwKKwkJCQkJCSAmZ3AtPmhhc2hfdGFibGVfZG1hKTsKKwkJaWYgKGdwLT5oYXNoX3RhYmxlID09IE5VTEwpIHsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDM7CisJCX0KKwl9CisgICAgCisJZGJnKDMsICIlczogaGFzaD0lcFxuIiwgX19GVU5DVElPTl9fLCBncC0+aGFzaF90YWJsZSk7CisKKwlzcGluX2xvY2tfaW5pdCgmZ3AtPmxvY2spOworICAgIAorCWRldi0+b3BlbiA9IGd0OTYxMDBfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGd0OTYxMDBfdHg7CisJZGV2LT5zdG9wID0gZ3Q5NjEwMF9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9IGd0OTYxMDBfZ2V0X3N0YXRzOworCS8vZGV2LT5kb19pb2N0bCA9IGd0OTYxMDBfaW9jdGw7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBndDk2MTAwX3NldF9yeF9tb2RlOworCWRldi0+dHhfdGltZW91dCA9IGd0OTYxMDBfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gR1Q5NjEwMEVUSF9UWF9USU1FT1VUOworCisJcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ0OworCXJldHVybiAwOworCitvdXQ0OgorCWRtYWZyZWUoUlhfSEFTSF9UQUJMRV9TSVpFLCBncC0+aGFzaF90YWJsZV9kbWEpOworb3V0MzoKKwlkbWFmcmVlKFBLVF9CVUZfU1oqUlhfUklOR19TSVpFLCBncC0+cnhfYnVmZik7CitvdXQyOgorCWRtYWZyZWUoc2l6ZW9mKGd0OTYxMDBfcmRfdCkgKiBSWF9SSU5HX1NJWkUKKwkJKyBzaXplb2YoZ3Q5NjEwMF90ZF90KSAqIFRYX1JJTkdfU0laRSwKKwkJZ3AtPnJ4X3JpbmcpOworb3V0MToKKwlmcmVlX25ldGRldiAoZGV2KTsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihndGlmLT5pb2Jhc2UsIEdUOTYxMDBfRVRIX0lPX1NJWkUpOworCisJZXJyKCIlcyBmYWlsZWQuICBSZXR1cm5zICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgdm9pZAorcmVzZXRfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlhYm9ydChkZXYsIHNkY21yQVQpOworCisJZm9yIChpPTA7IGk8VFhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKGdwLT50eF9za2J1ZmZbaV0pIHsKKwkJCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShncC0+dHhfc2tidWZmW2ldKTsKKwkJCWVsc2UKKwkJCQlkZXZfa2ZyZWVfc2tiKGdwLT50eF9za2J1ZmZbaV0pOworCQkJZ3AtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCX0KKworCQlncC0+dHhfcmluZ1tpXS5jbWRzdGF0ID0gMDsgLy8gQ1BVIG93bnMKKwkJZ3AtPnR4X3JpbmdbaV0uYnl0ZV9jbnQgPSAwOworCQlncC0+dHhfcmluZ1tpXS5idWZmX3B0ciA9IDA7CisJCWdwLT50eF9yaW5nW2ldLm5leHQgPQorCQkJY3B1X3RvX2RtYTMyKGdwLT50eF9yaW5nX2RtYSArCisJCQkJICAgICBzaXplb2YoZ3Q5NjEwMF90ZF90KSAqIChpKzEpKTsKKwkJZHVtcF90eF9kZXNjKDQsIGRldiwgaSk7CisJfQorCS8qIFdyYXAgdGhlIHJpbmcuICovCisJZ3AtPnR4X3JpbmdbaS0xXS5uZXh0ID0gY3B1X3RvX2RtYTMyKGdwLT50eF9yaW5nX2RtYSk7CisgICAgCisJLy8gc2V0dXAgb25seSB0aGUgbG93ZXN0IHByaW9yaXR5IFR4Q0RQIHJlZworCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX0NVUlJfVFhfREVTQ19QVFIwLCBncC0+dHhfcmluZ19kbWEpOworCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX0NVUlJfVFhfREVTQ19QVFIxLCAwKTsKKworCS8vIGluaXQgVHggaW5kZWNlcyBhbmQgcGt0IGNvdW50ZXIKKwlncC0+dHhfbmV4dF9pbiA9IGdwLT50eF9uZXh0X291dCA9IDA7CisJZ3AtPnR4X2NvdW50ID0gMDsKKworfQorCitzdGF0aWMgdm9pZAorcmVzZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlhYm9ydChkZXYsIHNkY21yQVIpOworICAgIAorCWZvciAoaT0wOyBpPFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCWdwLT5yeF9yaW5nW2ldLm5leHQgPQorCQkJY3B1X3RvX2RtYTMyKGdwLT5yeF9yaW5nX2RtYSArCisJCQkJICAgICBzaXplb2YoZ3Q5NjEwMF9yZF90KSAqIChpKzEpKTsKKwkJZ3AtPnJ4X3JpbmdbaV0uYnVmZl9wdHIgPQorCQkJY3B1X3RvX2RtYTMyKGdwLT5yeF9idWZmX2RtYSArIGkqUEtUX0JVRl9TWik7CisJCWdwLT5yeF9yaW5nW2ldLmJ1ZmZfc3ogPSBjcHVfdG9fZG1hMTYoUEtUX0JVRl9TWik7CisJCS8vIEdpdmUgb3duZXJzaGlwIHRvIGRldmljZSwgc2V0IGZpcnN0IGFuZCBsYXN0LCBlbmFibGUgaW50cgorCQlncC0+cnhfcmluZ1tpXS5jbWRzdGF0ID0KKwkJCWNwdV90b19kbWEzMigodTMyKShyeEZpcnN0IHwgcnhMYXN0IHwgcnhPd24gfCByeEVJKSk7CisJCWR1bXBfcnhfZGVzYyg0LCBkZXYsIGkpOworCX0KKwkvKiBXcmFwIHRoZSByaW5nLiAqLworCWdwLT5yeF9yaW5nW2ktMV0ubmV4dCA9IGNwdV90b19kbWEzMihncC0+cnhfcmluZ19kbWEpOworCisJLy8gU2V0dXAgb25seSB0aGUgbG93ZXN0IHByaW9yaXR5IFJ4RkRQIGFuZCBSeENEUCByZWdzCisJZm9yIChpPTA7IGk8NDsgaSsrKSB7CisJCWlmIChpID09IDApIHsKKwkJCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIXzFTVF9SWF9ERVNDX1BUUjAsCisJCQkJCSBncC0+cnhfcmluZ19kbWEpOworCQkJR1Q5NjEwMEVUSF9XUklURShncCwgR1Q5NjEwMF9FVEhfQ1VSUl9SWF9ERVNDX1BUUjAsCisJCQkJCSBncC0+cnhfcmluZ19kbWEpOworCQl9IGVsc2UgeworCQkJR1Q5NjEwMEVUSF9XUklURShncCwKKwkJCQkJIEdUOTYxMDBfRVRIXzFTVF9SWF9ERVNDX1BUUjAgKyBpKjQsCisJCQkJCSAwKTsKKwkJCUdUOTYxMDBFVEhfV1JJVEUoZ3AsCisJCQkJCSBHVDk2MTAwX0VUSF9DVVJSX1JYX0RFU0NfUFRSMCArIGkqNCwKKwkJCQkJIDApOworCQl9CisJfQorCisJLy8gaW5pdCBSeCBOZXh0T3V0IGluZGV4CisJZ3AtPnJ4X25leHRfb3V0ID0gMDsKK30KKworCisvLyBSZXR1cm5zIDEgaWYgdGhlIFR4IGNvdW50ZXIgYW5kIGluZGVjZXMgZG9uJ3QgZ2VsCitzdGF0aWMgaW50CitndDk2MTAwX2NoZWNrX3R4X2NvbnNpc3RlbnQoc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3ApCit7CisJaW50IGRpZmYgPSBncC0+dHhfbmV4dF9pbiAtIGdwLT50eF9uZXh0X291dDsKKworCWRpZmYgPSBkaWZmPDAgPyBUWF9SSU5HX1NJWkUgKyBkaWZmIDogZGlmZjsKKwlkaWZmID0gZ3AtPnR4X2NvdW50ID09IFRYX1JJTkdfU0laRSA/IGRpZmYgKyBUWF9SSU5HX1NJWkUgOiBkaWZmOworICAgIAorCXJldHVybiAoZGlmZiAhPSBncC0+dHhfY291bnQpOworfQorCitzdGF0aWMgaW50CitndDk2MTAwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHRtcDsKKwl1MTYgbWlpX3JlZzsKKyAgICAKKwlkYmcoMywgIiVzOiBkZXY9JXBcbiIsIF9fRlVOQ1RJT05fXywgZGV2KTsKKwlkYmcoMywgIiVzOiBzY3MxMF9sbz0lNHgsIHNjczEwX2hpPSU0eFxuIiwgX19GVU5DVElPTl9fLCAKKwkgICAgR1Q5NjEwMF9SRUFEKDB4OCksIEdUOTYxMDBfUkVBRCgweDEwKSk7CisJZGJnKDMsICIlczogc2NzMzJfbG89JTR4LCBzY3MzMl9oaT0lNHhcbiIsIF9fRlVOQ1RJT05fXywKKwkgICAgR1Q5NjEwMF9SRUFEKDB4MTgpLCBHVDk2MTAwX1JFQUQoMHgyMCkpOworICAgIAorCS8vIFN0b3AgYW5kIGRpc2FibGUgUG9ydAorCWhhcmRfc3RvcChkZXYpOworICAgIAorCS8vIFNldHVwIENJVSBBcmJpdGVyCisJdG1wID0gR1Q5NjEwMF9SRUFEKEdUOTYxMDBfQ0lVX0FSQklURVJfQ09ORklHKTsKKwl0bXAgfD0gKDB4MGMgPDwgKGdwLT5wb3J0X251bSoyKSk7IC8vIHNldCBFdGhlciBETUEgcmVxIHByaW9yaXR5IHRvIGhpCisjaWZuZGVmIERFU0NfQkUKKwl0bXAgJj0gfigxPDwzMSk7ICAgICAgICAgICAgICAgICAgIC8vIHNldCBkZXNjIGVuZGlhbmVzcyB0byBsaXR0bGUKKyNlbHNlCisJdG1wIHw9ICgxPDwzMSk7CisjZW5kaWYKKwlHVDk2MTAwX1dSSVRFKEdUOTYxMDBfQ0lVX0FSQklURVJfQ09ORklHLCB0bXApOworCWRiZygzLCAiJXM6IENJVSBDb25maWc9JXgvJXhcbiIsIF9fRlVOQ1RJT05fXywgCisJICAgIHRtcCwgR1Q5NjEwMF9SRUFEKEdUOTYxMDBfQ0lVX0FSQklURVJfQ09ORklHKSk7CisKKwkvLyBTZXQgcm91dGluZy4KKwl0bXAgPSBHVDk2MTAwX1JFQUQoR1Q5NjEwMF9ST1VURV9NQUlOKSAmICgweDNmIDw8IDE4KTsKKwl0bXAgfD0gKDB4MDcgPDwgKDE4ICsgZ3AtPnBvcnRfbnVtKjMpKTsKKwlHVDk2MTAwX1dSSVRFKEdUOTYxMDBfUk9VVEVfTUFJTiwgdG1wKTsKKworCS8qIHNldCBNSUkgYXMgcGVyaXBoZXJhbCBmdW5jICovCisJdG1wID0gR1Q5NjEwMF9SRUFEKEdUOTYxMDBfR1BQX0NPTkZJRzIpOworCXRtcCB8PSAweDdmZmYgPDwgKGdwLT5wb3J0X251bSoxNik7CisJR1Q5NjEwMF9XUklURShHVDk2MTAwX0dQUF9DT05GSUcyLCB0bXApOworCQorCS8qIFNldCB1cCBNSUkgcG9ydCBwaW4gZGlyZWN0aW9ucyAqLworCXRtcCA9IEdUOTYxMDBfUkVBRChHVDk2MTAwX0dQUF9JTzIpOworCXRtcCB8PSAweDAwM2QgPDwgKGdwLT5wb3J0X251bSoxNik7CisJR1Q5NjEwMF9XUklURShHVDk2MTAwX0dQUF9JTzIsIHRtcCk7CisKKwkvLyBTZXQtdXAgaGFzaCB0YWJsZQorCW1lbXNldChncC0+aGFzaF90YWJsZSwgMCwgUlhfSEFTSF9UQUJMRV9TSVpFKTsgLy8gY2xlYXIgaXQKKwlncC0+aGFzaF9tb2RlID0gMDsKKwkvLyBBZGQgYSBzaW5nbGUgZW50cnkgdG8gaGFzaCB0YWJsZSAtIG91ciBldGhlcm5ldCBhZGRyZXNzCisJZ3Q5NjEwMF9hZGRfaGFzaF9lbnRyeShkZXYsIGRldi0+ZGV2X2FkZHIpOworCS8vIFNldC11cCBETUEgcHRyIHRvIGhhc2ggdGFibGUKKwlHVDk2MTAwRVRIX1dSSVRFKGdwLCBHVDk2MTAwX0VUSF9IQVNIX1RCTF9QVFIsIGdwLT5oYXNoX3RhYmxlX2RtYSk7CisJZGJnKDMsICIlczogSGFzaCBUYmwgUHRyPSV4XG4iLCBfX0ZVTkNUSU9OX18sCisJICAgIEdUOTYxMDBFVEhfUkVBRChncCwgR1Q5NjEwMF9FVEhfSEFTSF9UQkxfUFRSKSk7CisKKwkvLyBTZXR1cCBUeAorCXJlc2V0X3R4KGRldik7CisKKwlkYmcoMywgIiVzOiBDdXJyIFR4IERlc2MgUHRyMD0leFxuIiwgX19GVU5DVElPTl9fLAorCSAgICBHVDk2MTAwRVRIX1JFQUQoZ3AsIEdUOTYxMDBfRVRIX0NVUlJfVFhfREVTQ19QVFIwKSk7CisKKwkvLyBTZXR1cCBSeAorCXJlc2V0X3J4KGRldik7CisKKwlkYmcoMywgIiVzOiAxc3QvQ3VyciBSeCBEZXNjIFB0cjA9JXgvJXhcbiIsIF9fRlVOQ1RJT05fXywKKwkgICAgR1Q5NjEwMEVUSF9SRUFEKGdwLCBHVDk2MTAwX0VUSF8xU1RfUlhfREVTQ19QVFIwKSwKKwkgICAgR1Q5NjEwMEVUSF9SRUFEKGdwLCBHVDk2MTAwX0VUSF9DVVJSX1JYX0RFU0NfUFRSMCkpOworCisJLy8gZXRoIHBvcnQgY29uZmlnIHJlZ2lzdGVyCisJR1Q5NjEwMEVUSF9XUklURShncCwgR1Q5NjEwMF9FVEhfUE9SVF9DT05GSUdfRVhULAorCQkJIHBjeHJGQ1RMIHwgcGN4ckZDVExlbiB8IHBjeHJGTFAgfCBwY3hyRFBMWGVuKTsKKworCW1paV9yZWcgPSByZWFkX01JSShncC0+cGh5X2FkZHIsIDB4MTEpOyAvKiBpbnQgZW5hYmxlIHJlZ2lzdGVyICovCisJbWlpX3JlZyB8PSAyOyAgLyogZW5hYmxlIG1paSBpbnRlcnJ1cHQgKi8KKwl3cml0ZV9NSUkoZ3AtPnBoeV9hZGRyLCAweDExLCBtaWlfcmVnKTsKKwkKKwlkYmcoMywgIiVzOiBQaHlBRD0leFxuIiwgX19GVU5DVElPTl9fLAorCSAgICBHVDk2MTAwX1JFQUQoR1Q5NjEwMF9FVEhfUEhZX0FERFJfUkVHKSk7CisKKwkvLyBzZXR1cCBETUEKKworCS8vIFdlIHdhbnQgdGhlIFJ4L1R4IERNQSB0byB3cml0ZS9yZWFkIGRhdGEgdG8vZnJvbSBtZW1vcnkgaW4KKwkvLyBCaWcgRW5kaWFuIG1vZGUuIEFsc28gc2V0IERNQSBCdXJzdCBTaXplIHRvIDggNjRCaXQgd29yZHMuCisjaWZkZWYgREVTQ19EQVRBX0JFCisJR1Q5NjEwMEVUSF9XUklURShncCwgR1Q5NjEwMF9FVEhfU0RNQV9DT05GSUcsCisJCQkgKDB4Zjw8c2RjclJDQml0KSB8IHNkY3JSSUZCIHwgKDM8PHNkY3JCU1pCaXQpKTsKKyNlbHNlCisJR1Q5NjEwMEVUSF9XUklURShncCwgR1Q5NjEwMF9FVEhfU0RNQV9DT05GSUcsCisJCQkgc2RjckJMTVIgfCBzZGNyQkxNVCB8CisJCQkgKDB4Zjw8c2RjclJDQml0KSB8IHNkY3JSSUZCIHwgKDM8PHNkY3JCU1pCaXQpKTsKKyNlbmRpZgorCWRiZygzLCAiJXM6IFNETUEgQ29uZmlnPSV4XG4iLCBfX0ZVTkNUSU9OX18sCisJICAgIEdUOTYxMDBFVEhfUkVBRChncCwgR1Q5NjEwMF9FVEhfU0RNQV9DT05GSUcpKTsKKworCS8vIHN0YXJ0IFJ4IERNQQorCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX1NETUFfQ09NTSwgc2RjbXJFUkQpOworCWRiZygzLCAiJXM6IFNETUEgQ29tbT0leFxuIiwgX19GVU5DVElPTl9fLAorCSAgICBHVDk2MTAwRVRIX1JFQUQoZ3AsIEdUOTYxMDBfRVRIX1NETUFfQ09NTSkpOworICAgIAorCS8vIGVuYWJsZSB0aGlzIHBvcnQgKHNldCBoYXNoIHNpemUgdG8gMS8ySykKKwlHVDk2MTAwRVRIX1dSSVRFKGdwLCBHVDk2MTAwX0VUSF9QT1JUX0NPTkZJRywgcGNyRU4gfCBwY3JIUyk7CisJZGJnKDMsICIlczogUG9ydCBDb25maWc9JXhcbiIsIF9fRlVOQ1RJT05fXywKKwkgICAgR1Q5NjEwMEVUSF9SRUFEKGdwLCBHVDk2MTAwX0VUSF9QT1JUX0NPTkZJRykpOworICAgIAorCS8qCisJICogRGlzYWJsZSBhbGwgVHlwZS1vZi1TZXJ2aWNlIHF1ZXVlaW5nLiBBbGwgUnggcGFja2V0cyB3aWxsIGJlCisJICogdHJlYXRlZCBub3JtYWxseSBhbmQgd2lsbCBiZSBzZW50IHRvIHRoZSBsb3dlc3QgcHJpb3JpdHkKKwkgKiBxdWV1ZS4KKwkgKgorCSAqIERpc2FibGUgZmxvdy1jb250cm9sIGZvciBub3cuIEZJWE1FOiBzdXBwb3J0IGZsb3cgY29udHJvbD8KKwkgKi8KKworCS8vIGNsZWFyIGFsbCB0aGUgTUlCIGN0ciByZWdzCisJR1Q5NjEwMEVUSF9XUklURShncCwgR1Q5NjEwMF9FVEhfUE9SVF9DT05GSUdfRVhULAorCQkJIHBjeHJGQ1RMIHwgcGN4ckZDVExlbiB8IHBjeHJGTFAgfAorCQkJIHBjeHJQUklPcnhPdmVycmlkZSk7CisJcmVhZF9taWJfY291bnRlcnMoZ3ApOworCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX1BPUlRfQ09ORklHX0VYVCwKKwkJCSBwY3hyRkNUTCB8IHBjeHJGQ1RMZW4gfCBwY3hyRkxQIHwKKwkJCSBwY3hyUFJJT3J4T3ZlcnJpZGUgfCBwY3hyTUlCY2xyTW9kZSk7CisgICAgCisJZGJnKDMsICIlczogUG9ydCBDb25maWcgRXh0PSV4XG4iLCBfX0ZVTkNUSU9OX18sCisJICAgIEdUOTYxMDBFVEhfUkVBRChncCwgR1Q5NjEwMF9FVEhfUE9SVF9DT05GSUdfRVhUKSk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJZHVtcF9NSUkoNCwgZGV2KTsKKworCS8vIGVuYWJsZSBpbnRlcnJ1cHRzCisJZW5hYmxlX2V0aGVyX2lycShkZXYpOworCisJLy8gd2Ugc2hvdWxkIG5vdyBiZSByZWNlaXZpbmcgZnJhbWVzCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorZ3Q5NjEwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJldHZhbDsKKyAgICAKKwlkYmcoMiwgIiVzOiBkZXY9JXBcbiIsIF9fRlVOQ1RJT05fXywgZGV2KTsKKworCS8vIEluaXRpYWxpemUgYW5kIHN0YXJ0dXAgdGhlIEdULTk2MTAwIGV0aGVybmV0IHBvcnQKKwlpZiAoKHJldHZhbCA9IGd0OTYxMDBfaW5pdChkZXYpKSkgeworCQllcnIoImVycm9yIGluIGd0OTYxMDBfaW5pdFxuIik7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZndDk2MTAwX2ludGVycnVwdCwKKwkJCQkgIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldikpKSB7CisJCWVycigidW5hYmxlIHRvIGdldCBJUlEgJWRcbiIsIGRldi0+aXJxKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJCisJZGJnKDIsICIlczogSW5pdGlhbGl6YXRpb24gZG9uZS5cbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZ3Q5NjEwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRiZygzLCAiJXM6IGRldj0lcFxuIiwgX19GVU5DVElPTl9fLCBkZXYpOworCisJLy8gc3RvcCB0aGUgZGV2aWNlCisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQloYXJkX3N0b3AoZGV2KTsKKwl9CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKyAgICAKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitndDk2MTAwX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG5leHRJbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOworCisJbmV4dEluID0gZ3AtPnR4X25leHRfaW47CisKKwlkYmcoMywgIiVzOiBuZXh0SW49JWRcbiIsIF9fRlVOQ1RJT05fXywgbmV4dEluKTsKKyAgICAKKwlpZiAoZ3AtPnR4X2NvdW50ID49IFRYX1JJTkdfU0laRSkgeworCQl3YXJuKCJUeCBSaW5nIGZ1bGwsIHBrdCBkcm9wcGVkLlxuIik7CisJCWdwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAxOworCX0KKyAgICAKKwlpZiAoIShncC0+bGFzdF9wc3IgJiBwc3JMaW5rKSkgeworCQllcnIoIiVzOiBMaW5rIGRvd24sIHBrdCBkcm9wcGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ3AtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorICAgIAorCWlmIChkbWEzMl90b19jcHUoZ3AtPnR4X3JpbmdbbmV4dEluXS5jbWRzdGF0KSAmIHR4T3duKSB7CisJCWVycigiJXM6IGRldmljZSBvd25zIGRlc2NyaXB0b3IsIHBrdCBkcm9wcGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ3AtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJLy8gc3RvcCB0aGUgcXVldWUsIHNvIFR4IHRpbWVvdXQgY2FuIGZpeCBpdAorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAxOworCX0KKyAgICAKKwkvLyBQcmVwYXJlIHRoZSBEZXNjcmlwdG9yIGF0IHR4X25leHRfaW4KKwlncC0+dHhfc2tidWZmW25leHRJbl0gPSBza2I7CisJZ3AtPnR4X3JpbmdbbmV4dEluXS5ieXRlX2NudCA9IGNwdV90b19kbWExNihza2ItPmxlbik7CisJZ3AtPnR4X3JpbmdbbmV4dEluXS5idWZmX3B0ciA9IGNwdV90b19kbWEzMih2aXJ0X3RvX3BoeXMoc2tiLT5kYXRhKSk7CisJLy8gbWFrZSBzdXJlIHBhY2tldCBnZXRzIHdyaXR0ZW4gYmFjayB0byBtZW1vcnkKKwlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKShza2ItPmRhdGEpLCBza2ItPmxlbik7CisJLy8gR2l2ZSBvd25lcnNoaXAgdG8gZGV2aWNlLCBzZXQgZmlyc3QgYW5kIGxhc3QgZGVzYywgZW5hYmxlIGludGVycnVwdAorCS8vIFNldHRpbmcgb2Ygb3duZXJzaGlwIGJpdCBtdXN0IGJlICpsYXN0KiEKKwlncC0+dHhfcmluZ1tuZXh0SW5dLmNtZHN0YXQgPQorCQljcHVfdG9fZG1hMzIoKHUzMikodHhPd24gfCB0eEdlbkNSQyB8IHR4RUkgfAorCQkJCSAgIHR4UGFkIHwgdHhGaXJzdCB8IHR4TGFzdCkpOworICAgIAorCWR1bXBfdHhfZGVzYyg0LCBkZXYsIG5leHRJbik7CisJZHVtcF9za2IoNCwgZGV2LCBza2IpOworCisJLy8gaW5jcmVtZW50IHR4X25leHRfaW4gd2l0aCB3cmFwCisJZ3AtPnR4X25leHRfaW4gPSAobmV4dEluICsgMSkgJSBUWF9SSU5HX1NJWkU7CisJLy8gSWYgRE1BIGlzIHN0b3BwZWQsIHJlc3RhcnQKKwlpZiAoIShHVDk2MTAwRVRIX1JFQUQoZ3AsIEdUOTYxMDBfRVRIX1BPUlRfU1RBVFVTKSAmIHBzclR4TG93KSkKKwkJR1Q5NjEwMEVUSF9XUklURShncCwgR1Q5NjEwMF9FVEhfU0RNQV9DT01NLAorCQkJCSBzZGNtckVSRCB8IHNkY21yVFhETCk7CisKKwkvLyBpbmNyZW1lbnQgY291bnQgYW5kIHN0b3AgcXVldWUgaWYgZnVsbAorCWlmICgrK2dwLT50eF9jb3VudCA9PSBUWF9SSU5HX1NJWkUpIHsKKwkJZ3AtPnR4X2Z1bGwgPSAxOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCWRiZygyLCAiVHggUmluZyBub3cgZnVsbCwgcXVldWUgc3RvcHBlZC5cbiIpOworCX0KKyAgICAKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorZ3Q5NjEwMF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RhdHVzKQoreworCXN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBwa3RfbGVuLCBuZXh0T3V0LCBjZHA7CisJZ3Q5NjEwMF9yZF90ICpyZDsKKwl1MzIgY21kc3RhdDsKKyAgICAKKwlkYmcoMywgIiVzOiBkZXY9JXAsIHN0YXR1cz0leFxuIiwgX19GVU5DVElPTl9fLCBkZXYsIHN0YXR1cyk7CisKKwljZHAgPSAoR1Q5NjEwMEVUSF9SRUFEKGdwLCBHVDk2MTAwX0VUSF8xU1RfUlhfREVTQ19QVFIwKQorCSAgICAgICAtIGdwLT5yeF9yaW5nX2RtYSkgLyBzaXplb2YoZ3Q5NjEwMF9yZF90KTsKKworCS8vIENvbnRpbnVlIHVudGlsIHdlIHJlYWNoIDFzdCBkZXNjcmlwdG9yIHBvaW50ZXIKKwlmb3IgKG5leHRPdXQgPSBncC0+cnhfbmV4dF9vdXQ7IG5leHRPdXQgIT0gY2RwOworCSAgICAgbmV4dE91dCA9IChuZXh0T3V0ICsgMSkgJSBSWF9SSU5HX1NJWkUpIHsKKwkKKwkJaWYgKC0tZ3AtPmludHJfd29ya19kb25lID09IDApCisJCQlicmVhazsKKworCQlyZCA9ICZncC0+cnhfcmluZ1tuZXh0T3V0XTsKKwkJY21kc3RhdCA9IGRtYTMyX3RvX2NwdShyZC0+Y21kc3RhdCk7CisJCisJCWRiZyg0LCAiJXM6IFJ4IGRlc2MgY21kc3RhdD0leCwgbmV4dE91dD0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICAgY21kc3RhdCwgbmV4dE91dCk7CisKKwkJaWYgKGNtZHN0YXQgJiAodTMyKXJ4T3duKSB7CisJCQkvL2VycigiJXM6IGRldmljZSBvd25zIGRlc2NyaXB0b3IhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJLy8gRE1BIGlzIG5vdCBmaW5pc2hlZCB1cGRhdGluZyBkZXNjcmlwdG9yPz8/CisJCQkvLyBMZWF2ZSBhbmQgY29tZSBiYWNrIGxhdGVyIHRvIHBpY2stdXAgd2hlcmUKKwkJCS8vIHdlIGxlZnQgb2ZmLgorCQkJYnJlYWs7CisJCX0KKworCQkvLyBEcm9wIHRoaXMgcmVjZWl2ZWQgcGt0IGlmIHRoZXJlIHdlcmUgYW55IGVycm9ycworCQlpZiAoKChjbWRzdGF0ICYgKHUzMikocnhFcnJvclN1bW1hcnkpKSAmJgorCQkgICAgIChjbWRzdGF0ICYgKHUzMikocnhGaXJzdCkpKSB8fCAoc3RhdHVzICYgaWNyUnhFcnJvcikpIHsKKwkJCS8vIHVwZGF0ZSB0aGUgZGV0YWlsZWQgcnggZXJyb3IgY291bnRlcnMgdGhhdAorCQkJLy8gYXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBNSUIgY291bnRlcnMuCisJCQlpZiAoY21kc3RhdCAmICh1MzIpcnhPdmVycnVuKQorCQkJCWdwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJY21kc3RhdCB8PSAodTMyKXJ4T3duOworCQkJcmQtPmNtZHN0YXQgPSBjcHVfdG9fZG1hMzIoY21kc3RhdCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIE11c3QgYmUgZmlyc3QgYW5kIGxhc3QgKGllIG9ubHkpIGRlc2NyaXB0b3Igb2YgcGFja2V0LiBXZQorCQkgKiBpZ25vcmUgKGRyb3ApIGFueSBwYWNrZXRzIHRoYXQgZG8gbm90IGZpdCBpbiBvbmUgZGVzY3JpcHRvci4KKwkJICogRXZlcnkgZGVzY3JpcHRvcidzIHJlY2VpdmUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byBob2xkCisJCSAqIHRoZSBtYXhpbXVtIDgwMi4zIGZyYW1lIHNpemUsIHNvIGEgbXVsdGktZGVzY3JpcHRvciBwYWNrZXQKKwkJICogaW5kaWNhdGVzIGFuIGVycm9yLiBNb3N0IGlmIG5vdCBhbGwgY29ycnVwdGVkIHBhY2tldHMgd2lsbAorCQkgKiBoYXZlIGFscmVhZHkgYmVlbiBkcm9wcGVkIGJ5IHRoZSBhYm92ZSBjaGVjayBmb3IgdGhlCisJCSAqIHJ4RXJyb3JTdW1tYXJ5IHN0YXR1cyBiaXQuCisJCSAqLworCQlpZiAoIShjbWRzdGF0ICYgKHUzMilyeEZpcnN0KSB8fCAhKGNtZHN0YXQgJiAodTMyKXJ4TGFzdCkpIHsKKwkJCWlmIChjbWRzdGF0ICYgKHUzMilyeEZpcnN0KSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIGlzIHRoZSBmaXJzdCBkZXNjcmlwdG9yIG9mIGEKKwkJCQkgKiBtdWx0aS1kZXNjcmlwdG9yIHBhY2tldC4gSXQgaXNuJ3QgY29ycnVwdGVkCisJCQkJICogYmVjYXVzZSB0aGUgYWJvdmUgY2hlY2sgZm9yIHJ4RXJyb3JTdW1tYXJ5CisJCQkJICogd291bGQgaGF2ZSBkcm9wcGVkIGl0IGFscmVhZHksIHNvIHdoYXQncworCQkJCSAqIHRoZSBkZWFsIHdpdGggdGhpcyBwYWNrZXQ/IEdvb2QgcXVlc3Rpb24sCisJCQkJICogbGV0J3MgZHVtcCBpdCBvdXQuCisJCQkJICovCisJCQkJZXJyKCIlczogZGVzYyBub3QgZmlyc3QgYW5kIGxhc3QhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCWR1bXBfcnhfZGVzYygwLCBkZXYsIG5leHRPdXQpOworCQkJfQorCQkJY21kc3RhdCB8PSAodTMyKXJ4T3duOworCQkJcmQtPmNtZHN0YXQgPSBjcHVfdG9fZG1hMzIoY21kc3RhdCk7CisJCQkvLyBjb250aW51ZSB0byBkcm9wIGV2ZXJ5IGRlc2NyaXB0b3Igb2YgdGhpcyBwYWNrZXQKKwkJCWNvbnRpbnVlOworCQl9CisJCisJCXBrdF9sZW4gPSBkbWExNl90b19jcHUocmQtPmJ5dGVfY250KTsKKwkKKwkJLyogQ3JlYXRlIG5ldyBza2IuICovCisJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbisyKTsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQllcnIoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWdwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQljbWRzdGF0IHw9ICh1MzIpcnhPd247CisJCQlyZC0+Y21kc3RhdCA9IGNwdV90b19kbWEzMihjbWRzdGF0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNrYi0+ZGV2ID0gZGV2OworCQlza2JfcmVzZXJ2ZShza2IsIDIpOyAgIC8qIDE2IGJ5dGUgSVAgaGVhZGVyIGFsaWduICovCisJCW1lbWNweShza2JfcHV0KHNrYiwgcGt0X2xlbiksCisJCSAgICAgICAmZ3AtPnJ4X2J1ZmZbbmV4dE91dCpQS1RfQlVGX1NaXSwgcGt0X2xlbik7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCWR1bXBfc2tiKDQsIGRldiwgc2tiKTsKKwkKKwkJbmV0aWZfcngoc2tiKTsgICAgICAgIC8qIHBhc3MgdGhlIHBhY2tldCB0byB1cHBlciBsYXllcnMgKi8KKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCQkvLyBub3cgd2UgY2FuIHJlbGVhc2Ugb3duZXJzaGlwIG9mIHRoaXMgZGVzYyBiYWNrIHRvIGRldmljZQorCQljbWRzdGF0IHw9ICh1MzIpcnhPd247CisJCXJkLT5jbWRzdGF0ID0gY3B1X3RvX2RtYTMyKGNtZHN0YXQpOworCX0KKyAgICAKKwlpZiAobmV4dE91dCA9PSBncC0+cnhfbmV4dF9vdXQpCisJCWRiZygzLCAiJXM6IFJ4Q0RQIGRpZCBub3QgaW5jcmVtZW50P1xuIiwgX19GVU5DVElPTl9fKTsKKworCWdwLT5yeF9uZXh0X291dCA9IG5leHRPdXQ7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK2d0OTYxMDBfdHhfY29tcGxldGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0YXR1cykKK3sKKwlzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IG5leHRPdXQsIGNkcDsKKwlndDk2MTAwX3RkX3QgKnRkOworCXUzMiBjbWRzdGF0OworCisJY2RwID0gKEdUOTYxMDBFVEhfUkVBRChncCwgR1Q5NjEwMF9FVEhfQ1VSUl9UWF9ERVNDX1BUUjApCisJICAgICAgIC0gZ3AtPnR4X3JpbmdfZG1hKSAvIHNpemVvZihndDk2MTAwX3RkX3QpOworICAgIAorCS8vIENvbnRpbnVlIHVudGlsIHdlIHJlYWNoIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgcG9pbnRlcgorCWZvciAobmV4dE91dCA9IGdwLT50eF9uZXh0X291dDsgbmV4dE91dCAhPSBjZHA7CisJICAgICBuZXh0T3V0ID0gKG5leHRPdXQgKyAxKSAlIFRYX1JJTkdfU0laRSkgeworCQorCQlpZiAoLS1ncC0+aW50cl93b3JrX2RvbmUgPT0gMCkKKwkJCWJyZWFrOworCisJCXRkID0gJmdwLT50eF9yaW5nW25leHRPdXRdOworCQljbWRzdGF0ID0gZG1hMzJfdG9fY3B1KHRkLT5jbWRzdGF0KTsKKwkKKwkJZGJnKDMsICIlczogVHggZGVzYyBjbWRzdGF0PSV4LCBuZXh0T3V0PSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgICBjbWRzdGF0LCBuZXh0T3V0KTsKKwkKKwkJaWYgKGNtZHN0YXQgJiAodTMyKXR4T3duKSB7CisJCQkvKgorCQkJICogRE1BIGlzIG5vdCBmaW5pc2hlZCB3cml0aW5nIGRlc2NyaXB0b3I/Pz8KKwkJCSAqIExlYXZlIGFuZCBjb21lIGJhY2sgbGF0ZXIgdG8gcGljay11cCB3aGVyZQorCQkJICogd2UgbGVmdCBvZmYuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisJCisJCS8vIGluY3JlbWVudCBUeCBlcnJvciBzdGF0cworCQlpZiAoY21kc3RhdCAmICh1MzIpdHhFcnJvclN1bW1hcnkpIHsKKwkJCWRiZygyLCAiJXM6IFR4IGVycm9yLCBjbWRzdGF0ID0gJXhcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgICBjbWRzdGF0KTsKKwkJCWdwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmIChjbWRzdGF0ICYgKHUzMil0eFJlVHhMaW1pdCkKKwkJCQlncC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmIChjbWRzdGF0ICYgKHUzMil0eFVuZGVycnVuKQorCQkJCWdwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJaWYgKGNtZHN0YXQgJiAodTMyKXR4TGF0ZUNvbGxpc2lvbikKKwkJCQlncC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQl9CisJCisJCWlmIChjbWRzdGF0ICYgKHUzMil0eENvbGxpc2lvbikKKwkJCWdwLT5zdGF0cy5jb2xsaXNpb25zICs9CisJCQkJKHUzMikoKGNtZHN0YXQgJiB0eFJlVHhDbnRNYXNrKSA+PgorCQkJCSAgICAgIHR4UmVUeENudEJpdCk7CisKKwkJLy8gV2FrZSB0aGUgcXVldWUgaWYgdGhlIHJpbmcgd2FzIGZ1bGwKKwkJaWYgKGdwLT50eF9mdWxsKSB7CisJCQlncC0+dHhfZnVsbCA9IDA7CisJCQlpZiAoZ3AtPmxhc3RfcHNyICYgcHNyTGluaykgeworCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCQlkYmcoMiwgIiVzOiBUeCBSaW5nIHdhcyBmdWxsLCBxdWV1ZSB3YWtlZFxuIiwKKwkJCQkgICAgX19GVU5DVElPTl9fKTsKKwkJCX0KKwkJfQorCQorCQkvLyBkZWNyZW1lbnQgdHggcmluZyBidWZmZXIgY291bnQKKwkJaWYgKGdwLT50eF9jb3VudCkgZ3AtPnR4X2NvdW50LS07CisJCisJCS8vIGZyZWUgdGhlIHNrYgorCQlpZiAoZ3AtPnR4X3NrYnVmZltuZXh0T3V0XSkgeworCQkJZGJnKDMsICIlczogZ29vZCBUeCwgc2tiPSVwXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgZ3AtPnR4X3NrYnVmZltuZXh0T3V0XSk7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShncC0+dHhfc2tidWZmW25leHRPdXRdKTsKKwkJCWdwLT50eF9za2J1ZmZbbmV4dE91dF0gPSBOVUxMOworCQl9IGVsc2UgeworCQkJZXJyKCIlczogbm8gc2tiIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJfQorCX0KKworCWdwLT50eF9uZXh0X291dCA9IG5leHRPdXQ7CisKKwlpZiAoZ3Q5NjEwMF9jaGVja190eF9jb25zaXN0ZW50KGdwKSkgeworCQllcnIoIiVzOiBUeCBxdWV1ZSBpbmNvbnNpc3RlbnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKyAgICAKKwlpZiAoKHN0YXR1cyAmIGljclR4RW5kTG93KSAmJiBncC0+dHhfY291bnQgIT0gMCkgeworCQkvLyB3ZSBtdXN0IHJlc3RhcnQgdGhlIERNQQorCQlkYmcoMywgIiVzOiBSZXN0YXJ0aW5nIFR4IERNQVxuIiwgX19GVU5DVElPTl9fKTsKKwkJR1Q5NjEwMEVUSF9XUklURShncCwgR1Q5NjEwMF9FVEhfU0RNQV9DT01NLAorCQkJCSBzZGNtckVSRCB8IHNkY21yVFhETCk7CisJfQorfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorZ3Q5NjEwMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgc3RhdHVzOworICAgIAlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJZXJyKCIlczogbnVsbCBkZXYgcHRyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJZGJnKDMsICIlczogZW50cnksIGljcj0leFxuIiwgX19GVU5DVElPTl9fLAorCSAgICBHVDk2MTAwRVRIX1JFQUQoZ3AsIEdUOTYxMDBfRVRIX0lOVF9DQVVTRSkpOworCisJc3Bpbl9sb2NrKCZncC0+bG9jayk7CisKKwlncC0+aW50cl93b3JrX2RvbmUgPSBtYXhfaW50ZXJydXB0X3dvcms7CisKKwl3aGlsZSAoZ3AtPmludHJfd29ya19kb25lID4gMCkgeworCisJCXN0YXR1cyA9IEdUOTYxMDBFVEhfUkVBRChncCwgR1Q5NjEwMF9FVEhfSU5UX0NBVVNFKTsKKwkJLy8gQUNLIGludGVycnVwdHMKKwkJR1Q5NjEwMEVUSF9XUklURShncCwgR1Q5NjEwMF9FVEhfSU5UX0NBVVNFLCB+c3RhdHVzKTsKKworCQlpZiAoKHN0YXR1cyAmIGljckV0aGVySW50U3VtKSA9PSAwICYmCisJCSAgICAhKHN0YXR1cyAmIChpY3JUeEJ1ZmZlckxvd3xpY3JUeEJ1ZmZlckhpZ2h8aWNyUnhCdWZmZXIpKSkKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisJCWlmIChzdGF0dXMgJiBpY3JNSUlQaHlTVEMpIHsKKwkJCXUzMiBwc3IgPSBHVDk2MTAwRVRIX1JFQUQoZ3AsIEdUOTYxMDBfRVRIX1BPUlRfU1RBVFVTKTsKKwkJCWlmIChncC0+bGFzdF9wc3IgIT0gcHNyKSB7CisJCQkJZGJnKDAsICJwb3J0IHN0YXR1czpcbiIpOworCQkJCWRiZygwLCAiICAgICVzIE1CaXQvcywgJXMtZHVwbGV4LCAiCisJCQkJICAgICJmbG93LWNvbnRyb2wgJXMsIGxpbmsgaXMgJXMsXG4iLAorCQkJCSAgICBwc3IgJiBwc3JTcGVlZCA/ICIxMDAiOiIxMCIsCisJCQkJICAgIHBzciAmIHBzckR1cGxleCA/ICJmdWxsIjoiaGFsZiIsCisJCQkJICAgIHBzciAmIHBzckZjdGwgPyAiZGlzYWJsZWQiOiJlbmFibGVkIiwKKwkJCQkgICAgcHNyICYgcHNyTGluayA/ICJ1cCI6ImRvd24iKTsKKwkJCQlkYmcoMCwgIiAgICBUeExvd1EgaXMgJXMsIFR4SGlnaFEgaXMgJXMsICIKKwkJCQkgICAgIlRyYW5zbWl0dGVyIGlzICVzXG4iLAorCQkJCSAgICBwc3IgJiBwc3JUeExvdyA/ICJydW5uaW5nIjoic3RvcHBlZCIsCisJCQkJICAgIHBzciAmIHBzclR4SGlnaCA/ICJydW5uaW5nIjoic3RvcHBlZCIsCisJCQkJICAgIHBzciAmIHBzclR4SW5Qcm9nID8gIm9uIjoib2ZmIik7CisJCQorCQkJCWlmICgocHNyICYgcHNyTGluaykgJiYgIWdwLT50eF9mdWxsICYmCisJCQkJICAgIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQkJCQlkYmcoMCwgIiVzOiBMaW5rIHVwLCB3YWtpbmcgcXVldWUuXG4iLAorCQkJCQkgICAgX19GVU5DVElPTl9fKTsKKwkJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCX0gZWxzZSBpZiAoIShwc3IgJiBwc3JMaW5rKSAmJgorCQkJCQkgICAhbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCQkJCWRiZygwLCAiJXM6IExpbmsgZG93biwgc3RvcHBpbmcgcXVldWUuXG4iLAorCQkJCQkgICAgX19GVU5DVElPTl9fKTsKKwkJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJCX0KKworCQkJCWdwLT5sYXN0X3BzciA9IHBzcjsKKwkJCX0KKworCQkJaWYgKC0tZ3AtPmludHJfd29ya19kb25lID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkKKwkJaWYgKHN0YXR1cyAmIChpY3JUeEJ1ZmZlckxvdyB8IGljclR4RW5kTG93KSkKKwkJCWd0OTYxMDBfdHhfY29tcGxldGUoZGV2LCBzdGF0dXMpOworCisJCWlmIChzdGF0dXMgJiAoaWNyUnhCdWZmZXIgfCBpY3JSeEVycm9yKSkgeworCQkJZ3Q5NjEwMF9yeChkZXYsIHN0YXR1cyk7CisJCX0KKwkKKwkJLy8gTm93IGNoZWNrIFRYIGVycm9ycyAoUlggZXJyb3JzIHdlcmUgaGFuZGxlZCBpbiBndDk2MTAwX3J4KQorCQlpZiAoc3RhdHVzICYgaWNyVHhFcnJvckxvdykgeworCQkJZXJyKCIlczogVHggcmVzb3VyY2UgZXJyb3JcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlpZiAoLS1ncC0+aW50cl93b3JrX2RvbmUgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQorCQlpZiAoc3RhdHVzICYgaWNyVHhVZHIpIHsKKwkJCWVycigiJXM6IFR4IHVuZGVycnVuIGVycm9yXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJaWYgKC0tZ3AtPmludHJfd29ya19kb25lID09IDApCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZ3AtPmludHJfd29ya19kb25lID09IDApIHsKKwkJLy8gQUNLIGFueSByZW1haW5pbmcgcGVuZGluZyBpbnRlcnJ1cHRzCisJCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX0lOVF9DQVVTRSwgMCk7CisJCWRiZygzLCAiJXM6IGhpdCBtYXggd29ya1xuIiwgX19GVU5DVElPTl9fKTsKKwl9CisgICAgCisJZGJnKDMsICIlczogZXhpdCwgaWNyPSV4XG4iLCBfX0ZVTkNUSU9OX18sCisJICAgIEdUOTYxMDBFVEhfUkVBRChncCwgR1Q5NjEwMF9FVEhfSU5UX0NBVVNFKSk7CisKKwlzcGluX3VubG9jaygmZ3AtPmxvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKK3N0YXRpYyB2b2lkCitndDk2MTAwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKyAgICAKKwlpZiAoIShncC0+bGFzdF9wc3IgJiBwc3JMaW5rKSkgeworCQllcnIoInR4X3RpbWVvdXQ6IGxpbmsgZG93bi5cbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCWlmIChndDk2MTAwX2NoZWNrX3R4X2NvbnNpc3RlbnQoZ3ApKQorCQkJZXJyKCJ0eF90aW1lb3V0OiBUeCByaW5nIGVycm9yLlxuIik7CisKKwkJZGlzYWJsZV9ldGhlcl9pcnEoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwkJcmVzZXRfdHgoZGV2KTsKKwkJZW5hYmxlX2V0aGVyX2lycShkZXYpOworCQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorfQorCisKK3N0YXRpYyB2b2lkCitndDk2MTAwX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLy9zdHJ1Y3QgZGV2X21jX2xpc3QgKm1jcHRyOworICAgIAorCWRiZygzLCAiJXM6IGRldj0lcCwgZmxhZ3M9JXhcbiIsIF9fRlVOQ1RJT05fXywgZGV2LCBkZXYtPmZsYWdzKTsKKworCS8vIHN0b3AgdGhlIFJlY2VpdmVyIERNQQorCWFib3J0KGRldiwgc2RjbXJBUik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJR1Q5NjEwMEVUSF9XUklURShncCwgR1Q5NjEwMF9FVEhfUE9SVF9DT05GSUcsCisJCQkJIHBjckVOIHwgcGNySFMgfCBwY3JQTSk7CisJfQorCisjaWYgMAorCS8qCisJICBGSVhNRTogY3VycmVudGx5IG11bHRpY2FzdCBkb2Vzbid0IHdvcmsgLSBuZWVkIHRvIGdldCBoYXNoIHRhYmxlCisJICB3b3JraW5nIGZpcnN0LgorCSovCisJaWYgKGRldi0+bWNfY291bnQpIHsKKwkJLy8gY2xlYXIgaGFzaCB0YWJsZQorCQltZW1zZXQoZ3AtPmhhc2hfdGFibGUsIDAsIFJYX0hBU0hfVEFCTEVfU0laRSk7CisJCS8vIEFkZCBvdXIgZXRoZXJuZXQgYWRkcmVzcworCQlndDk2MTAwX2FkZF9oYXNoX2VudHJ5KGRldiwgZGV2LT5kZXZfYWRkcik7CisKKwkJZm9yIChtY3B0ciA9IGRldi0+bWNfbGlzdDsgbWNwdHI7IG1jcHRyID0gbWNwdHItPm5leHQpIHsKKwkJCWR1bXBfaHdfYWRkcigyLCBkZXYsIF9fRlVOQ1RJT05fXyAiOiBhZGRyPSIsCisJCQkJICAgICBtY3B0ci0+ZG1pX2FkZHIpOworCQkJZ3Q5NjEwMF9hZGRfaGFzaF9lbnRyeShkZXYsIG1jcHRyLT5kbWlfYWRkcik7CisJCX0KKwl9CisjZW5kaWYKKyAgICAKKwkvLyByZXN0YXJ0IFJ4IERNQQorCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX1NETUFfQ09NTSwgc2RjbXJFUkQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK2d0OTYxMDBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYmcoMywgIiVzOiBkZXY9JXBcbiIsIF9fRlVOQ1RJT05fXywgZGV2KTsKKworCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlICgmZ3AtPmxvY2ssIGZsYWdzKTsKKwkJdXBkYXRlX3N0YXRzKGdwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmdwLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuICZncC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIGd0OTYxMDBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGk9MDsgaTxOVU1fSU5URVJGQUNFUzsgaSsrKSB7CisJCXN0cnVjdCBndDk2MTAwX2lmX3QgKmd0aWYgPSAmZ3Q5NjEwMF9pZmxpc3RbaV07CisJCWlmIChndGlmLT5kZXYgIT0gTlVMTCkgeworCQkJc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3AgPSAoc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqKQorCQkJCW5ldGRldl9wcml2KGd0aWYtPmRldik7CisJCQl1bnJlZ2lzdGVyX25ldGRldihndGlmLT5kZXYpOworCQkJZG1hZnJlZShSWF9IQVNIX1RBQkxFX1NJWkUsIGdwLT5oYXNoX3RhYmxlX2RtYSk7CisJCQlkbWFmcmVlKFBLVF9CVUZfU1oqUlhfUklOR19TSVpFLCBncC0+cnhfYnVmZik7CisJCQlkbWFmcmVlKHNpemVvZihndDk2MTAwX3JkX3QpICogUlhfUklOR19TSVpFCisJCQkJKyBzaXplb2YoZ3Q5NjEwMF90ZF90KSAqIFRYX1JJTkdfU0laRSwKKwkJCQlncC0+cnhfcmluZyk7CisJCQlmcmVlX25ldGRldihndGlmLT5kZXYpOworCQkJcmVsZWFzZV9yZWdpb24oZ3RpZi0+aW9iYXNlLCBncC0+aW9fc2l6ZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGd0OTYxMDBfc2V0dXAoY2hhciAqb3B0aW9ucykKK3sKKwljaGFyICp0aGlzX29wdDsKKworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJCXJldHVybiAwOworCisJd2hpbGUgKCh0aGlzX29wdCA9IHN0cnNlcCAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqdGhpc19vcHQpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibWFjMDoiLCA1KSkgeworCQkJbWVtY3B5KG1hYzAsIHRoaXNfb3B0KzUsIDE3KTsKKwkJCW1hYzBbMTddPSAnXDAnOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibWFjMToiLCA1KSkgeworCQkJbWVtY3B5KG1hYzEsIHRoaXNfb3B0KzUsIDE3KTsKKwkJCW1hYzFbMTddPSAnXDAnOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImd0OTYxMDBldGg9IiwgZ3Q5NjEwMF9zZXR1cCk7CisKK21vZHVsZV9pbml0KGd0OTYxMDBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZ3Q5NjEwMF9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIlN0ZXZlIExvbmdlcmJlYW0gPHN0ZXZlbEBtdmlzdGEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHVDk2MTAwIEV0aGVybmV0IGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ3Q5NjEwMGV0aC5oIGIvZHJpdmVycy9uZXQvZ3Q5NjEwMGV0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNGJmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ndDk2MTAwZXRoLmgKQEAgLTAsMCArMSwzNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICAJc3RldmVsQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20KKyAqCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKSBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqCisgKiBFdGhlcm5ldCBkcml2ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBNSVBTIEdUOTYxMDAgQWR2YW5jZWQKKyAqIENvbW11bmljYXRpb24gQ29udHJvbGxlci4KKyAqIAorICovCisjaWZuZGVmIF9HVDk2MTAwRVRIX0gKKyNkZWZpbmUgX0dUOTYxMDBFVEhfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2dhbGlsZW8tYm9hcmRzL2d0OTYxMDAuaD4KKworI2RlZmluZSBkYmcobHZsLCBmb3JtYXQsIGFyZy4uLikgXAorICAgIGlmIChsdmwgPD0gR1Q5NjEwMF9ERUJVRykgXAorICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm9ybWF0LCBkZXYtPm5hbWUgLCAjIyBhcmcpCisjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgXAorICAgIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm9ybWF0LCBkZXYtPm5hbWUgLCAjIyBhcmcpCisjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIFwKKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogIiBmb3JtYXQsIGRldi0+bmFtZSAsICMjIGFyZykKKyNkZWZpbmUgd2Fybihmb3JtYXQsIGFyZy4uLikgXAorICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAiIGZvcm1hdCwgZGV2LT5uYW1lICwgIyMgYXJnKQorCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBlZmZpY2llbmN5LiAqLworI2RlZmluZSBUWF9SSU5HX1NJWkUJMTYKKyNkZWZpbmUgUlhfUklOR19TSVpFCTMyCisjZGVmaW5lIFBLVF9CVUZfU1oJMTUzNgkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4qLworCisjZGVmaW5lIFJYX0hBU0hfVEFCTEVfU0laRSAxNjM4NAorI2RlZmluZSBIQVNIX0hPUF9OVU1CRVIgMTIKKworI2RlZmluZSBOVU1fSU5URVJGQUNFUyAyCisKKyNkZWZpbmUgR1Q5NjEwMEVUSF9UWF9USU1FT1VUIEhaLzQKKworI2RlZmluZSBHVDk2MTAwX0VUSDBfQkFTRSAoTUlQU19HVDk2MTAwX0JBU0UgKyBHVDk2MTAwX0VUSF9QT1JUX0NPTkZJRykKKyNkZWZpbmUgR1Q5NjEwMF9FVEgxX0JBU0UgKEdUOTYxMDBfRVRIMF9CQVNFICsgR1Q5NjEwMF9FVEhfSU9fU0laRSkKKworI2lmZGVmIENPTkZJR19NSVBTX0VWOTYxMDAKKyNkZWZpbmUgR1Q5NjEwMF9FVEhFUjBfSVJRIDMKKyNkZWZpbmUgR1Q5NjEwMF9FVEhFUjFfSVJRIDQKKyNlbHNlCisjZGVmaW5lIEdUOTYxMDBfRVRIRVIwX0lSUSAtMQorI2RlZmluZSBHVDk2MTAwX0VUSEVSMV9JUlEgLTEKKyNlbmRpZgorCisjZGVmaW5lIFJFVl9HVDk2MTAwICAxCisjZGVmaW5lIFJFVl9HVDk2MTAwQV8xIDIKKyNkZWZpbmUgUkVWX0dUOTYxMDBBIDMKKworI2RlZmluZSBHVDk2MTAwRVRIX1JFQUQoZ3AsIG9mZnNldCkgXAorICAgIEdUOTYxMDBfUkVBRCgoZ3AtPnBvcnRfb2Zmc2V0ICsgb2Zmc2V0KSkKKworI2RlZmluZSBHVDk2MTAwRVRIX1dSSVRFKGdwLCBvZmZzZXQsIGRhdGEpIFwKKyAgICBHVDk2MTAwX1dSSVRFKChncC0+cG9ydF9vZmZzZXQgKyBvZmZzZXQpLCBkYXRhKQorCisjZGVmaW5lIEdUOTYxMDBFVEhfU0VUQklUKGdwLCBvZmZzZXQsIGJpdHMpIHtcCisgICAgdTMyIHZhbCA9IEdUOTYxMDBFVEhfUkVBRChncCwgb2Zmc2V0KTsgdmFsIHw9ICh1MzIpKGJpdHMpOyBcCisgICAgR1Q5NjEwMEVUSF9XUklURShncCwgb2Zmc2V0LCB2YWwpOyB9CisKKyNkZWZpbmUgR1Q5NjEwMEVUSF9DTFJCSVQoZ3AsIG9mZnNldCwgYml0cykge1wKKyAgICB1MzIgdmFsID0gR1Q5NjEwMEVUSF9SRUFEKGdwLCBvZmZzZXQpOyB2YWwgJj0gKHUzMikofihiaXRzKSk7IFwKKyAgICBHVDk2MTAwRVRIX1dSSVRFKGdwLCBvZmZzZXQsIHZhbCk7IH0KKworCisvKiBCaXQgZGVmaW5pdGlvbnMgb2YgdGhlIFNNSSBSZWcgKi8KK2VudW0geworCXNtaXJEYXRhTWFzayA9IDB4ZmZmZiwKKwlzbWlyUGh5QWRNYXNrID0gMHgxZjw8MTYsCisJc21pclBoeUFkQml0ID0gMTYsCisJc21pclJlZ0FkTWFzayA9IDB4MWY8PDIxLAorCXNtaXJSZWdBZEJpdCA9IDIxLAorCXNtaXJPcENvZGUgPSAxPDwyNiwKKwlzbWlyUmVhZFZhbGlkID0gMTw8MjcsCisJc21pckJ1c3kgPSAxPDwyOAorfTsKKworLyogQml0IGRlZmluaXRpb25zIG9mIHRoZSBQb3J0IENvbmZpZyBSZWcgKi8KK2VudW0gcGNyX2JpdHMgeworCXBjclBNID0gMSwKKwlwY3JSQk0gPSAyLAorCXBjclBCRiA9IDQsCisJcGNyRU4gPSAxPDw3LAorCXBjckxQQktNYXNrID0gMHgzPDw4LAorCXBjckxQQktCaXQgPSA4LAorCXBjckZDID0gMTw8MTAsCisJcGNySFMgPSAxPDwxMiwKKwlwY3JITSA9IDE8PDEzLAorCXBjckhETSA9IDE8PDE0LAorCXBjckhEID0gMTw8MTUsCisJcGNySVNMTWFzayA9IDB4Nzw8MjgsCisJcGNySVNMQml0ID0gMjgsCisJcGNyQUNDUyA9IDE8PDMxCit9OworCisvKiBCaXQgZGVmaW5pdGlvbnMgb2YgdGhlIFBvcnQgQ29uZmlnIEV4dGVuZCBSZWcgKi8KK2VudW0gcGN4cl9iaXRzIHsKKwlwY3hySUdNUCA9IDEsCisJcGN4clNQQU4gPSAyLAorCXBjeHJQQVIgPSA0LAorCXBjeHJQUklPdHhNYXNrID0gMHg3PDwzLAorCXBjeHJQUklPdHhCaXQgPSAzLAorCXBjeHJQUklPcnhNYXNrID0gMHgzPDw2LAorCXBjeHJQUklPcnhCaXQgPSA2LAorCXBjeHJQUklPcnhPdmVycmlkZSA9IDE8PDgsCisJcGN4ckRQTFhlbiA9IDE8PDksCisJcGN4ckZDVExlbiA9IDE8PDEwLAorCXBjeHJGTFAgPSAxPDwxMSwKKwlwY3hyRkNUTCA9IDE8PDEyLAorCXBjeHJNRkxNYXNrID0gMHgzPDwxNCwKKwlwY3hyTUZMQml0ID0gMTQsCisJcGN4ck1JQmNsck1vZGUgPSAxPDwxNiwKKwlwY3hyU3BlZWQgPSAxPDwxOCwKKwlwY3hyU3BlZWRlbiA9IDE8PDE5LAorCXBjeHJSTUlJZW4gPSAxPDwyMCwKKwlwY3hyRFNDUGVuID0gMTw8MjEKK307CisKKy8qIEJpdCBkZWZpbml0aW9ucyBvZiB0aGUgUG9ydCBDb21tYW5kIFJlZyAqLworZW51bSBwY21yX2JpdHMgeworCXBjbXJGSiA9IDE8PDE1Cit9OworCisKKy8qIEJpdCBkZWZpbml0aW9ucyBvZiB0aGUgUG9ydCBTdGF0dXMgUmVnICovCitlbnVtIHBzcl9iaXRzIHsKKwlwc3JTcGVlZCA9IDEsCisJcHNyRHVwbGV4ID0gMiwKKwlwc3JGY3RsID0gNCwKKwlwc3JMaW5rID0gOCwKKwlwc3JQYXVzZSA9IDE8PDQsCisJcHNyVHhMb3cgPSAxPDw1LAorCXBzclR4SGlnaCA9IDE8PDYsCisJcHNyVHhJblByb2cgPSAxPDw3Cit9OworCisvKiBCaXQgZGVmaW5pdGlvbnMgb2YgdGhlIFNETUEgQ29uZmlnIFJlZyAqLworZW51bSBzZGNyX2JpdHMgeworCXNkY3JSQ01hc2sgPSAweGY8PDIsCisJc2RjclJDQml0ID0gMiwKKwlzZGNyQkxNUiA9IDE8PDYsCisJc2RjckJMTVQgPSAxPDw3LAorCXNkY3JQT1ZSID0gMTw8OCwKKwlzZGNyUklGQiA9IDE8PDksCisJc2RjckJTWk1hc2sgPSAweDM8PDEyLAorCXNkY3JCU1pCaXQgPSAxMgorfTsKKworLyogQml0IGRlZmluaXRpb25zIG9mIHRoZSBTRE1BIENvbW1hbmQgUmVnICovCitlbnVtIHNkY21yX2JpdHMgeworCXNkY21yRVJEID0gMTw8NywKKwlzZGNtckFSID0gMTw8MTUsCisJc2RjbXJTVERIID0gMTw8MTYsCisJc2RjbXJTVERMID0gMTw8MTcsCisJc2RjbXJUWERIID0gMTw8MjMsCisJc2RjbXJUWERMID0gMTw8MjQsCisJc2RjbXJBVCA9IDE8PDMxCit9OworCisvKiBCaXQgZGVmaW5pdGlvbnMgb2YgdGhlIEludGVycnVwdCBDYXVzZSBSZWcgKi8KK2VudW0gaWNyX2JpdHMgeworCWljclJ4QnVmZmVyID0gMSwKKwlpY3JUeEJ1ZmZlckhpZ2ggPSAxPDwyLAorCWljclR4QnVmZmVyTG93ID0gMTw8MywKKwlpY3JUeEVuZEhpZ2ggPSAxPDw2LAorCWljclR4RW5kTG93ID0gMTw8NywKKwlpY3JSeEVycm9yID0gMTw8OCwKKwlpY3JUeEVycm9ySGlnaCA9IDE8PDEwLAorCWljclR4RXJyb3JMb3cgPSAxPDwxMSwKKwlpY3JSeE9WUiA9IDE8PDEyLAorCWljclR4VWRyID0gMTw8MTMsCisJaWNyUnhCdWZmZXJRMCA9IDE8PDE2LAorCWljclJ4QnVmZmVyUTEgPSAxPDwxNywKKwlpY3JSeEJ1ZmZlclEyID0gMTw8MTgsCisJaWNyUnhCdWZmZXJRMyA9IDE8PDE5LAorCWljclJ4RXJyb3JRMCA9IDE8PDIwLAorCWljclJ4RXJyb3JRMSA9IDE8PDIxLAorCWljclJ4RXJyb3JRMiA9IDE8PDIyLAorCWljclJ4RXJyb3JRMyA9IDE8PDIzLAorCWljck1JSVBoeVNUQyA9IDE8PDI4LAorCWljclNNSWRvbmUgPSAxPDwyOSwKKwlpY3JFdGhlckludFN1bSA9IDE8PDMxCit9OworCisKKy8qIFRoZSBSeCBhbmQgVHggZGVzY3JpcHRvciBsaXN0cy4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyNpZmRlZiBERVNDX0JFCisJdTE2IGJ5dGVfY250OworCXUxNiByZXNlcnZlZDsKKyNlbHNlCisJdTE2IHJlc2VydmVkOworCXUxNiBieXRlX2NudDsKKyNlbmRpZgorCXUzMiBjbWRzdGF0OworCXUzMiBuZXh0OworCXUzMiBidWZmX3B0cjsKK30gZ3Q5NjEwMF90ZF90IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmZGVmIERFU0NfQkUKKwl1MTYgYnVmZl9zejsKKwl1MTYgYnl0ZV9jbnQ7CisjZWxzZQorCXUxNiBieXRlX2NudDsKKwl1MTYgYnVmZl9zejsKKyNlbmRpZgorCXUzMiBjbWRzdGF0OworCXUzMiBuZXh0OworCXUzMiBidWZmX3B0cjsKK30gZ3Q5NjEwMF9yZF90IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKiBWYWx1ZXMgZm9yIHRoZSBUeCBjb21tYW5kLXN0YXR1cyBkZXNjcmlwdG9yIGVudHJ5LiAqLworZW51bSB0ZF9jbWRzdGF0IHsKKwl0eE93biA9IDE8PDMxLAorCXR4QXV0b01vZGUgPSAxPDwzMCwKKwl0eEVJID0gMTw8MjMsCisJdHhHZW5DUkMgPSAxPDwyMiwKKwl0eFBhZCA9IDE8PDE4LAorCXR4Rmlyc3QgPSAxPDwxNywKKwl0eExhc3QgPSAxPDwxNiwKKwl0eEVycm9yU3VtbWFyeSA9IDE8PDE1LAorCXR4UmVUeENudE1hc2sgPSAweDBmPDwxMCwKKwl0eFJlVHhDbnRCaXQgPSAxMCwKKwl0eENvbGxpc2lvbiA9IDE8PDksCisJdHhSZVR4TGltaXQgPSAxPDw4LAorCXR4VW5kZXJydW4gPSAxPDw2LAorCXR4TGF0ZUNvbGxpc2lvbiA9IDE8PDUKK307CisKKworLyogVmFsdWVzIGZvciB0aGUgUnggY29tbWFuZC1zdGF0dXMgZGVzY3JpcHRvciBlbnRyeS4gKi8KK2VudW0gcmRfY21kc3RhdCB7CisJcnhPd24gPSAxPDwzMSwKKwlyeEF1dG9Nb2RlID0gMTw8MzAsCisJcnhFSSA9IDE8PDIzLAorCXJ4Rmlyc3QgPSAxPDwxNywKKwlyeExhc3QgPSAxPDwxNiwKKwlyeEVycm9yU3VtbWFyeSA9IDE8PDE1LAorCXJ4SUdNUCA9IDE8PDE0LAorCXJ4SGFzaEV4cGlyZWQgPSAxPDwxMywKKwlyeE1pc3NlZEZyYW1lID0gMTw8MTIsCisJcnhGcmFtZVR5cGUgPSAxPDwxMSwKKwlyeFNob3J0RnJhbWUgPSAxPDw4LAorCXJ4TWF4RnJhbWVMZW4gPSAxPDw3LAorCXJ4T3ZlcnJ1biA9IDE8PDYsCisJcnhDb2xsaXNpb24gPSAxPDw0LAorCXJ4Q1JDRXJyb3IgPSAxCit9OworCisvKiBCaXQgZmllbGRzIG9mIGEgSGFzaCBUYWJsZSBFbnRyeSAqLworZW51bSBoYXNoX3RhYmxlX2VudHJ5IHsKKwlodGVWYWxpZCA9IDEsCisJaHRlU2tpcCA9IDIsCisJaHRlUkQgPSA0Cit9OworCisvLyBUaGUgTUlCIGNvdW50ZXJzCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIGJ5dGVSZWNlaXZlZDsKKwl1MzIgYnl0ZVNlbnQ7CisJdTMyIGZyYW1lc1JlY2VpdmVkOworCXUzMiBmcmFtZXNTZW50OworCXUzMiB0b3RhbEJ5dGVSZWNlaXZlZDsKKwl1MzIgdG90YWxGcmFtZXNSZWNlaXZlZDsKKwl1MzIgYnJvYWRjYXN0RnJhbWVzUmVjZWl2ZWQ7CisJdTMyIG11bHRpY2FzdEZyYW1lc1JlY2VpdmVkOworCXUzMiBjUkNFcnJvcjsKKwl1MzIgb3ZlcnNpemVGcmFtZXM7CisJdTMyIGZyYWdtZW50czsKKwl1MzIgamFiYmVyOworCXUzMiBjb2xsaXNpb247CisJdTMyIGxhdGVDb2xsaXNpb247CisJdTMyIGZyYW1lczY0OworCXUzMiBmcmFtZXM2NV8xMjc7CisJdTMyIGZyYW1lczEyOF8yNTU7CisJdTMyIGZyYW1lczI1Nl81MTE7CisJdTMyIGZyYW1lczUxMl8xMDIzOworCXUzMiBmcmFtZXMxMDI0X01heFNpemU7CisJdTMyIG1hY1J4RXJyb3I7CisJdTMyIGRyb3BwZWRGcmFtZXM7CisJdTMyIG91dE11bHRpY2FzdEZyYW1lczsKKwl1MzIgb3V0QnJvYWRjYXN0RnJhbWVzOworCXUzMiB1bmRlcnNpemVGcmFtZXM7Cit9IG1pYl9jb3VudGVyc190OworCisKK3N0cnVjdCBndDk2MTAwX3ByaXZhdGUgeworCWd0OTYxMDBfcmRfdCogcnhfcmluZzsKKwlndDk2MTAwX3RkX3QqIHR4X3Jpbmc7CisJLy8gVGhlIFJ4IGFuZCBUeCByaW5ncyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAorCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKwljaGFyKiBoYXNoX3RhYmxlOworCS8vIFRoZSBIYXNoIFRhYmxlIG11c3QgYmUgOC1ieXRlIGFsaWduZWQKKwlkbWFfYWRkcl90IGhhc2hfdGFibGVfZG1hOworCWludCBoYXNoX21vZGU7CisgICAgCisJLy8gVGhlIFJ4IGJ1ZmZlcnMgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZAorCWNoYXIqIHJ4X2J1ZmY7CisJZG1hX2FkZHJfdCByeF9idWZmX2RtYTsKKwkvLyBUeCBidWZmZXJzICh0eF9za2J1ZmZbaV0tPmRhdGEpIHdpdGggbGVzcyB0aGFuIDggYnl0ZXMKKwkvLyBvZiBwYXlsb2FkIG11c3QgYmUgOC1ieXRlIGFsaWduZWQKKwlzdHJ1Y3Qgc2tfYnVmZiogdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisJaW50IHJ4X25leHRfb3V0OyAvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgdG8gcmVjZWl2ZSAqLworCWludCB0eF9uZXh0X2luOwkgLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5IHRvIHNlbmQgKi8KKwlpbnQgdHhfbmV4dF9vdXQ7IC8qIFRoZSBsYXN0IHJpbmcgZW50cnkgdGhlIElTUiBwcm9jZXNzZWQgKi8KKwlpbnQgdHhfY291bnQ7ICAgIC8qIGN1cnJlbnQgIyBvZiBwa3RzIHdhaXRpbmcgdG8gYmUgc2VudCBpbiBUeCByaW5nICovCisJaW50IGludHJfd29ya19kb25lOyAvKiBudW1iZXIgb2YgUnggYW5kIFR4IHBrdHMgcHJvY2Vzc2VkIGluIHRoZSBpc3IgKi8KKwlpbnQgdHhfZnVsbDsgICAgICAgIC8qIFR4IHJpbmcgaXMgZnVsbCAqLworICAgIAorCW1pYl9jb3VudGVyc190IG1pYjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCWludCBpb19zaXplOworCWludCBwb3J0X251bTsgIC8vIDAgb3IgMQorCWludCBjaGlwX3JldjsKKwl1MzIgcG9ydF9vZmZzZXQ7CisgICAgCisJaW50IHBoeV9hZGRyOyAvLyBQSFkgYWRkcmVzcworCXUzMiBsYXN0X3BzcjsgLy8gbGFzdCB2YWx1ZSBvZiB0aGUgcG9ydCBzdGF0dXMgcmVnaXN0ZXIKKworCWludCBvcHRpb25zOyAgICAgLyogVXNlci1zZXR0YWJsZSBtaXNjLiBkcml2ZXIgb3B0aW9ucy4gKi8KKwlpbnQgZHJ2X2ZsYWdzOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXNwaW5sb2NrX3QgbG9jazsgLyogU2VyaWFsaXNlIGFjY2VzcyB0byBkZXZpY2UgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtYWNoaS5jIGIvZHJpdmVycy9uZXQvaGFtYWNoaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOTY3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1hY2hpLmMKQEAgLTAsMCArMSwyMDI0IEBACisvKiBoYW1hY2hpLmM6IEEgUGFja2V0IEVuZ2luZXMgR05JQy1JSSBHaWdhYml0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguICovCisvKgorCVdyaXR0ZW4gMTk5OC0yMDAwIGJ5IERvbmFsZCBCZWNrZXIuCisJVXBkYXRlcyAyMDAwIGJ5IEtlaXRoIFVuZGVyd29vZC4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgCisJdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKwlEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisJcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorCWEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlUaGlzIGRyaXZlciBpcyBmb3IgdGhlIFBhY2tldCBFbmdpbmVzIEdOSUMtSUkgUENJIEdpZ2FiaXQgRXRoZXJuZXQKKwlhZGFwdGVyLgorCisJU3VwcG9ydCBhbmQgdXBkYXRlcyBhdmFpbGFibGUgYXQKKwlodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL2hhbWFjaGkuaHRtbAorCW9yCisJaHR0cDovL3d3dy5wYXJsLmNsZW1zb24uZWR1L35rZWl0aHUvaGFtYWNoaS5odG1sCisKKworCisJTGludXgga2VybmVsIGNoYW5nZWxvZzoKKworCUxLMS4wLjE6CisJLSBmaXggbGFjayBvZiBwY2lfZGV2PC0+ZGV2IGFzc29jaWF0aW9uCisJLSBldGh0b29sIHN1cHBvcnQgKGpnYXJ6aWspCisKKyovCisKKyNkZWZpbmUgRFJWX05BTUUJImhhbWFjaGkiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjAxK0xLMS4wLjEiCisjZGVmaW5lIERSVl9SRUxEQVRFCSI1LzE4LzIwMDEiCisKKworLyogQSBmZXcgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLiAqLworCitzdGF0aWMgaW50IGRlYnVnID0gMTsJCS8qIDEgbm9ybWFsIG1lc3NhZ2VzLCAwIHF1aWV0IC4uIDcgdmVyYm9zZS4gICovCisjZGVmaW5lIGZpbmFsX3ZlcnNpb24KKyNkZWZpbmUgaGFtYWNoaV9kZWJ1ZyBkZWJ1ZworLyogTWF4aW11bSBldmVudHMgKFJ4IHBhY2tldHMsIGV0Yy4pIHRvIGhhbmRsZSBhdCBlYWNoIGludGVycnVwdC4gKi8KK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gNDA7CitzdGF0aWMgaW50IG10dTsKKy8qIERlZmF1bHQgdmFsdWVzIHNlbGVjdGVkIGJ5IHRlc3Rpbmcgb24gYSBkdWFsIHByb2Nlc3NvciBQSUlJLTQ1MCAqLworLyogVGhlc2Ugc2l4IGludGVycnVwdCBjb250cm9sIHBhcmFtZXRlcnMgbWF5IGJlIHNldCBkaXJlY3RseSB3aGVuIGxvYWRpbmcgdGhlCisgKiBtb2R1bGUsIG9yIHRocm91Z2ggdGhlIHJ4X3BhcmFtcyBhbmQgdHhfcGFyYW1zIHZhcmlhYmxlcworICovCitzdGF0aWMgaW50IG1heF9yeF9sYXRlbmN5ID0gMHgxMTsKK3N0YXRpYyBpbnQgbWF4X3J4X2dhcCA9IDB4MDU7CitzdGF0aWMgaW50IG1pbl9yeF9wa3QgPSAweDE4Oworc3RhdGljIGludCBtYXhfdHhfbGF0ZW5jeSA9IDB4MDA7IAorc3RhdGljIGludCBtYXhfdHhfZ2FwID0gMHgwMDsKK3N0YXRpYyBpbnQgbWluX3R4X3BrdCA9IDB4MzA7CisKKy8qIFNldCB0aGUgY29weSBicmVha3BvaW50IGZvciB0aGUgY29weS1vbmx5LXRpbnktZnJhbWVzIHNjaGVtZS4KKyAgIC1TZXR0aW5nIHRvID4gMTUxOCBjYXVzZXMgYWxsIGZyYW1lcyB0byBiZSBjb3BpZWQKKwktU2V0dGluZyB0byAwIGRpc2FibGVzIGNvcGllcworKi8KK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrOworCisvKiBBbiBvdmVycmlkZSBmb3IgdGhlIGhhcmR3YXJlIGRldGVjdGlvbiBvZiBidXMgd2lkdGguCisJU2V0IHRvIDEgdG8gZm9yY2UgMzIgYml0IFBDSSBidXMgZGV0ZWN0aW9uLiAgU2V0IHRvIDQgdG8gZm9yY2UgNjQgYml0LgorCUFkZCAyIHRvIGRpc2FibGUgcGFyaXR5IGRldGVjdGlvbi4KKyovCitzdGF0aWMgaW50IGZvcmNlMzI7CisKKworLyogVXNlZCB0byBwYXNzIHRoZSBtZWRpYSB0eXBlLCBldGMuCisgICBUaGVzZSBleGlzdCBmb3IgZHJpdmVyIGludGVyb3BlcmFiaWxpdHkuCisgICBObyBtZWRpYSB0eXBlcyBhcmUgY3VycmVudGx5IGRlZmluZWQuCisJCS0gVGhlIGxvd2VyIDQgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIHRoZSBtZWRpYSB0eXBlLgorCQktIFRoZSBuZXh0IHRocmVlIGJpdHMgbWF5IGJlIHNldCB0byBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkJCTB4MDAwMDAwMDAgOiBBdXRvZGV0ZWN0IFBDSSBidXMKKwkJCTB4MDAwMDAwMTAgOiBGb3JjZSAzMiBiaXQgUENJIGJ1cworCQkJMHgwMDAwMDAyMCA6IERpc2FibGUgcGFyaXR5IGRldGVjdGlvbgorCQkJMHgwMDAwMDA0MCA6IEZvcmNlIDY0IGJpdCBQQ0kgYnVzCisJCQlEZWZhdWx0IGlzIGF1dG9kZXRlY3QKKwkJLSBUaGUgbmV4dCBiaXQgY2FuIGJlIHVzZWQgdG8gZm9yY2UgaGFsZi1kdXBsZXguICBUaGlzIGlzIGEgYmFkCisJCSAgaWRlYSBzaW5jZSBubyBrbm93biBpbXBsZW1lbnRhdGlvbnMgaW1wbGVtZW50IGhhbGYtZHVwbGV4LCBhbmQsCisJCSAgaW4gZ2VuZXJhbCwgaGFsZi1kdXBsZXggZm9yIGdpZ2FiaXQgZXRoZXJuZXQgaXMgYSBiYWQgaWRlYS4KKwkJCTB4MDAwMDAwODAgOiBGb3JjZSBoYWxmLWR1cGxleCAKKwkJCURlZmF1bHQgaXMgZnVsbC1kdXBsZXguCisJCS0gSW4gdGhlIG9yaWdpbmFsIGRyaXZlciwgdGhlIG5pbnRoIGJpdCBjb3VsZCBiZSB1c2VkIHRvIGZvcmNlCisJCSAgZnVsbC1kdXBsZXguICBNYWludGFpbiB0aGF0IGZvciBjb21wYXRpYmlsaXR5CisJCSAgIDB4MDAwMDAyMDAgOiBGb3JjZSBmdWxsLWR1cGxleAorKi8KKyNkZWZpbmUgTUFYX1VOSVRTIDgJCQkJLyogTW9yZSBhcmUgc3VwcG9ydGVkLCBsaW1pdCBvbmx5IG9uIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgb3B0aW9uc1tNQVhfVU5JVFNdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4W01BWF9VTklUU10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKKy8qIFRoZSBIYW1hY2hpIGNoaXBzZXQgc3VwcG9ydHMgMyBwYXJhbWV0ZXJzIGVhY2ggZm9yIFJ4IGFuZCBUeAorICogaW50ZXJydXB1dCBtYW5hZ2VtZW50LiAgUGFyYW1ldGVycyB3aWxsIGJlIGxvYWRlZCBhcyBzcGVjaWZpZWQgaW50bworICogdGhlIFR4SW50Q29udHJvbCBhbmQgUnhJbnRDb250cm9sIHJlZ2lzdGVycy4gIAorICoKKyAqIFRoZSByZWdpc3RlcnMgYXJlIGFycmFuZ2VkIGFzIGZvbGxvd3M6CisgKiAgICAgMjMgLSAxNiAgIDE1IC0gIDggICA3ICAgIC0gICAgMAorICogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiAgIHwgbWluX3BrdCB8IG1heF9nYXAgfCBtYXhfbGF0ZW5jeSB8CisgKiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgbWluX3BrdCAgICAgIDogVGhlIG1pbmltdW0gbnVtYmVyIG9mIHBhY2tldHMgcHJvY2Vzc2VkIGJldHdlZW4KKyAqICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cy4gCisgKiAgIG1heF9nYXAgICAgICA6IFRoZSBtYXhpbXVtIGludGVyLXBhY2tldCBnYXAgaW4gdW5pdHMgb2YgOC4xOTIgdXMKKyAqICAgbWF4X2xhdGVuY3kgIDogVGhlIGFic29sdXRlIHRpbWUgYmV0d2VlbiBpbnRlcnJ1cHRzIGluIHVuaXRzIG9mIDguMTkyIHVzCisgKiAKKyAqLworc3RhdGljIGludCByeF9wYXJhbXNbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9Oworc3RhdGljIGludCB0eF9wYXJhbXNbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNldCBhdCBjb21waWxlIHRpbWUuICovCisKKy8qIEtlZXAgdGhlIHJpbmcgc2l6ZXMgYSBwb3dlciBvZiB0d28gZm9yIGNvbXBpbGUgZWZmaWNpZW5jeS4KKwlUaGUgY29tcGlsZXIgd2lsbCBjb252ZXJ0IDx1bnNpZ25lZD4nJSc8Ml5OPiBpbnRvIGEgYml0IG1hc2suCisgICBNYWtpbmcgdGhlIFR4IHJpbmcgdG9vIGxhcmdlIGRlY3JlYXNlcyB0aGUgZWZmZWN0aXZlbmVzcyBvZiBjaGFubmVsCisgICBib25kaW5nIGFuZCBwYWNrZXQgcHJpb3JpdHkuCisgICBUaGVyZSBhcmUgbm8gaWxsIGVmZmVjdHMgZnJvbSB0b28tbGFyZ2UgcmVjZWl2ZSByaW5ncywgZXhjZXB0IGZvcgorCWV4Y2Vzc2l2ZSBtZW1vcnkgdXNhZ2UgKi8KKy8qIEVtcGlyaWNhbGx5IGl0IGFwcGVhcnMgdGhhdCB0aGUgVHggcmluZyBuZWVkcyB0byBiZSBhIGxpdHRsZSBiaWdnZXIKKyAgIGZvciB0aGVzZSBHYml0IGFkYXB0ZXJzIG9yIHlvdSBnZXQgaW50byBhbiBvdmVycnVuIGNvbmRpdGlvbiByZWFsbHkKKyAgIGVhc2lseS4gIEFsc28sIHRoaW5ncyBhcHBlYXIgdG8gd29yayBhIGJpdCBiZXR0ZXIgaW4gYmFjay10by1iYWNrCisgICBjb25maWd1cmF0aW9ucyBpZiB0aGUgUnggcmluZyBpcyA4IHRpbWVzIHRoZSBzaXplIG9mIHRoZSBUeCByaW5nCisqLworI2RlZmluZSBUWF9SSU5HX1NJWkUJNjQKKyNkZWZpbmUgUlhfUklOR19TSVpFCTUxMgorI2RlZmluZSBUWF9UT1RBTF9TSVpFCVRYX1JJTkdfU0laRSpzaXplb2Yoc3RydWN0IGhhbWFjaGlfZGVzYykKKyNkZWZpbmUgUlhfVE9UQUxfU0laRQlSWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCBoYW1hY2hpX2Rlc2MpCisKKy8qCisgKiBFbmFibGUgbmV0ZGV2X2lvY3RsLiAgQWRkZWQgaW50ZXJydXB0IGNvYWxlc2NpbmcgcGFyYW1ldGVyIGFkanVzdG1lbnQuCisgKiAyLzE5Lzk5IFBldGUgV3lja29mZiA8d3lja29mZkBjYS5zYW5kaWEuZ292PgorICovCisKKy8qIHBsYXkgd2l0aCA2NC1iaXQgYWRkcmxlbjsgc2VlbXMgdG8gYmUgYSB0ZWVuc3kgYml0IHNsb3dlciAgLS1wdyAqLworLyogI2RlZmluZSBBRERSTEVOIDY0ICovCisKKy8qCisgKiBSWF9DSEVDS1NVTSB0dXJucyBvbiBjYXJkLWdlbmVyYXRlZCByZWNlaXZlIGNoZWNrc3VtIGdlbmVyYXRpb24gZm9yCisgKiAgIFRDUCBhbmQgVURQIHBhY2tldHMuICBPdGhlcndpc2UgdGhlIHVwcGVyIGxheWVycyBkbyB0aGUgY2FsY3VsYXRpb24uCisgKiBUWF9DSEVDS1NVTSB3b24ndCBkbyBhbnl0aGluZyB0b28gdXNlZnVsLCBldmVuIGlmIGl0IHdvcmtzLiAgVGhlcmUncyBubworICogICBlYXN5IG1lY2hhbmlzbSBieSB3aGljaCB0byB0ZWxsIHRoZSBUQ1AvVURQIHN0YWNrIHRoYXQgaXQgbmVlZCBub3QKKyAqICAgZ2VuZXJhdGUgY2hlY2tzdW1zIGZvciB0aGlzIGRldmljZS4gIEJ1dCBpZiBzb21lYm9keSBjYW4gZmluZCBhIHdheQorICogICB0byBnZXQgdGhhdCB0byB3b3JrLCBtb3N0IG9mIHRoZSBjYXJkIHdvcmsgaXMgaW4gaGVyZSBhbHJlYWR5LgorICogMy8xMC8xOTk5IFBldGUgV3lja29mZiA8d3lja29mZkBjYS5zYW5kaWEuZ292PgorICovCisjdW5kZWYgIFRYX0NIRUNLU1VNCisjZGVmaW5lIFJYX0NIRUNLU1VNCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAgKDUqSFopCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CS8qIFByb2Nlc3NvciB0eXBlIGZvciBjYWNoZSBhbGlnbm1lbnQuICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiICBXcml0dGVuIGJ5IERvbmFsZCBCZWNrZXJcbiIKK0tFUk5fSU5GTyAiICAgU29tZSBtb2RpZmljYXRpb25zIGJ5IEVyaWMga2FzdGVuIDxrYXN0ZW5AbnNjbC5tc3UuZWR1PlxuIgorS0VSTl9JTkZPICIgICBGdXJ0aGVyIG1vZGlmaWNhdGlvbnMgYnkgS2VpdGggVW5kZXJ3b29kIDxrZWl0aHVAcGFybC5jbGVtc29uLmVkdT5cbiI7CisKKworLyogSVBfTUYgYXBwZWFycyB0byBiZSBvbmx5IGRlZmluZWQgaW4gPG5ldGluZXQvaXAuaD4sIGhvd2V2ZXIsCisgICB3ZSBuZWVkIGl0IGZvciBoYXJkd2FyZSBjaGVja3N1bW1pbmcgc3VwcG9ydC4gIEZZSS4uLiBzb21lIG9mCisgICB0aGUgZGVmaW5pdGlvbnMgaW4gPG5ldGluZXQvaXAuaD4gY29uZmxpY3QvZHVwbGljYXRlIHRob3NlIGluCisgICBvdGhlciBsaW51eCBoZWFkZXJzIGNhdXNpbmcgbWFueSBjb21waWxlciB3YXJuaW5ncy4KKyovCisjaWZuZGVmIElQX01GCisgICNkZWZpbmUgSVBfTUYgMHgyMDAwICAgLyogSVAgbW9yZSBmcmFncyBmcm9tIDxuZXRpbmV0L2lwLmg+ICovIAorI2VuZGlmCisKKy8qIERlZmluZSBJUF9PRkZTRVQgdG8gYmUgSVBPUFRfT0ZGU0VUICovCisjaWZuZGVmIElQX09GRlNFVAorICAjaWZkZWYgSVBPUFRfT0ZGU0VUCisgICAgI2RlZmluZSBJUF9PRkZTRVQgSVBPUFRfT0ZGU0VUCisgICNlbHNlCisgICAgI2RlZmluZSBJUF9PRkZTRVQgMgorICAjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFJVTl9BVCh4KSAoamlmZmllcyArICh4KSkKKworLyogQ29uZGVuc2VkIGJ1cytlbmRpYW4gcG9ydGFiaWxpdHkgb3BlcmF0aW9ucy4gKi8KKyNpZiBBRERSTEVOID09IDY0CisjZGVmaW5lIGNwdV90b19sZVhYKGFkZHIpCWNwdV90b19sZTY0KGFkZHIpCisjZWxzZSAKKyNkZWZpbmUgY3B1X3RvX2xlWFgoYWRkcikJY3B1X3RvX2xlMzIoYWRkcikKKyNlbmRpZiAgIAorCisKKy8qCisJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCitJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisKK1RoaXMgZGV2aWNlIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIFBhY2tldCBFbmdpbmVzICJIYW1hY2hpIgorR2lnYWJpdCBFdGhlcm5ldCBjaGlwLiAgVGhlIG9ubHkgUENBIGN1cnJlbnRseSBzdXBwb3J0ZWQgaXMgdGhlIEdOSUMtSUkgNjQtYml0Cis2Nk1oeiBQQ0kgY2FyZC4KKworSUkuIEJvYXJkLXNwZWNpZmljIHNldHRpbmdzCisKK05vIGp1bXBlcnMgZXhpc3Qgb24gdGhlIGJvYXJkLiAgVGhlIGNoaXAgc3VwcG9ydHMgc29mdHdhcmUgY29ycmVjdGlvbiBvZgordmFyaW91cyBtb3RoZXJib2FyZCB3aXJpbmcgZXJyb3JzLCBob3dldmVyIHRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQKK3RoYXQgZmVhdHVyZS4KKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK0lJSWEuIFJpbmcgYnVmZmVycworCitUaGUgSGFtYWNoaSB1c2VzIGEgdHlwaWNhbCBkZXNjcmlwdG9yIGJhc2VkIGJ1cy1tYXN0ZXIgYXJjaGl0ZWN0dXJlLgorVGhlIGRlc2NyaXB0b3IgbGlzdCBpcyBzaW1pbGFyIHRvIHRoYXQgdXNlZCBieSB0aGUgRGlnaXRhbCBUdWxpcC4KK1RoaXMgZHJpdmVyIHVzZXMgdHdvIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGZpeGVkLXNpemUgZGVzY3JpcHRvciBsaXN0cworZm9ybWVkIGludG8gcmluZ3MgYnkgYSBicmFuY2ggZnJvbSB0aGUgZmluYWwgZGVzY3JpcHRvciB0byB0aGUgYmVnaW5uaW5nIG9mCit0aGUgbGlzdC4gIFRoZSByaW5nIHNpemVzIGFyZSBzZXQgYXQgY29tcGlsZSB0aW1lIGJ5IFJYL1RYX1JJTkdfU0laRS4KKworVGhpcyBkcml2ZXIgdXNlcyBhIHplcm8tY29weSByZWNlaXZlIGFuZCB0cmFuc21pdCBzY2hlbWUgc2ltaWxhciBteSBvdGhlcgorbmV0d29yayBkcml2ZXJzLgorVGhlIGRyaXZlciBhbGxvY2F0ZXMgZnVsbCBmcmFtZSBzaXplIHNrYnVmZnMgZm9yIHRoZSBSeCByaW5nIGJ1ZmZlcnMgYXQKK29wZW4oKSB0aW1lIGFuZCBwYXNzZXMgdGhlIHNrYi0+ZGF0YSBmaWVsZCB0byB0aGUgSGFtYWNoaSBhcyByZWNlaXZlIGRhdGEKK2J1ZmZlcnMuICBXaGVuIGFuIGluY29taW5nIGZyYW1lIGlzIGxlc3MgdGhhbiBSWF9DT1BZQlJFQUsgYnl0ZXMgbG9uZywKK2EgZnJlc2ggc2tidWZmIGlzIGFsbG9jYXRlZCBhbmQgdGhlIGZyYW1lIGlzIGNvcGllZCB0byB0aGUgbmV3IHNrYnVmZi4KK1doZW4gdGhlIGluY29taW5nIGZyYW1lIGlzIGxhcmdlciwgdGhlIHNrYnVmZiBpcyBwYXNzZWQgZGlyZWN0bHkgdXAgdGhlCitwcm90b2NvbCBzdGFjayBhbmQgcmVwbGFjZWQgYnkgYSBuZXdseSBhbGxvY2F0ZWQgc2tidWZmLgorCitUaGUgUlhfQ09QWUJSRUFLIHZhbHVlIGlzIGNob3NlbiB0byB0cmFkZS1vZmYgdGhlIG1lbW9yeSB3YXN0ZWQgYnkKK3VzaW5nIGEgZnVsbC1zaXplZCBza2J1ZmYgZm9yIHNtYWxsIGZyYW1lcyB2cy4gdGhlIGNvcHlpbmcgY29zdHMgb2YgbGFyZ2VyCitmcmFtZXMuICBHaWdhYml0IGNhcmRzIGFyZSB0eXBpY2FsbHkgdXNlZCBvbiBnZW5lcm91c2x5IGNvbmZpZ3VyZWQgbWFjaGluZXMKK2FuZCB0aGUgdW5kZXJmaWxsZWQgYnVmZmVycyBoYXZlIG5lZ2xpZ2libGUgaW1wYWN0IGNvbXBhcmVkIHRvIHRoZSBiZW5lZml0IG9mCithIHNpbmdsZSBhbGxvY2F0aW9uIHNpemUsIHNvIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHplcm8gcmVzdWx0cyBpbiBuZXZlcgorY29weWluZyBwYWNrZXRzLgorCitJSUliL2MuIFRyYW5zbWl0L1JlY2VpdmUgU3RydWN0dXJlCisKK1RoZSBSeCBhbmQgVHggZGVzY3JpcHRvciBzdHJ1Y3R1cmUgYXJlIHN0cmFpZ2h0LWZvcndhcmQsIHdpdGggbm8gaGlzdG9yaWNhbAorYmFnZ2FnZSB0aGF0IG11c3QgYmUgZXhwbGFpbmVkLiAgVW5saWtlIHRoZSBhd2t3YXJkIERCRE1BIHN0cnVjdHVyZSwgdGhlcmUKK2FyZSBubyB1bnVzZWQgZmllbGRzIG9yIG9wdGlvbiBiaXRzIHRoYXQgaGFkIG9ubHkgb25lIGFsbG93YWJsZSBzZXR0aW5nLgorCitUd28gZGV0YWlscyBzaG91bGQgYmUgbm90ZWQgYWJvdXQgdGhlIGRlc2NyaXB0b3JzOiBUaGUgY2hpcCBzdXBwb3J0cyBib3RoIDMyCitiaXQgYW5kIDY0IGJpdCBhZGRyZXNzIHN0cnVjdHVyZXMsIGFuZCB0aGUgbGVuZ3RoIGZpZWxkIGlzIG92ZXJ3cml0dGVuIG9uCit0aGUgcmVjZWl2ZSBkZXNjcmlwdG9ycy4gIFRoZSBkZXNjcmlwdG9yIGxlbmd0aCBpcyBzZXQgaW4gdGhlIGNvbnRyb2wgd29yZAorZm9yIGVhY2ggY2hhbm5lbC4gVGhlIGRldmVsb3BtZW50IGRyaXZlciB1c2VzIDMyIGJpdCBhZGRyZXNzZXMgb25seSwgaG93ZXZlcgorNjQgYml0IGFkZHJlc3NlcyBtYXkgYmUgZW5hYmxlZCBmb3IgNjQgYml0IGFyY2hpdGVjdHVyZXMgZS5nLiB0aGUgQWxwaGEuCisKK0lJSWQuIFN5bmNocm9uaXphdGlvbgorCitUaGlzIGRyaXZlciBpcyB2ZXJ5IHNpbWlsYXIgdG8gbXkgb3RoZXIgbmV0d29yayBkcml2ZXJzLgorVGhlIGRyaXZlciBydW5zIGFzIHR3byBpbmRlcGVuZGVudCwgc2luZ2xlLXRocmVhZGVkIGZsb3dzIG9mIGNvbnRyb2wuICBPbmUKK2lzIHRoZSBzZW5kLXBhY2tldCByb3V0aW5lLCB3aGljaCBlbmZvcmNlcyBzaW5nbGUtdGhyZWFkZWQgdXNlIGJ5IHRoZQorZGV2LT50YnVzeSBmbGFnLiAgVGhlIG90aGVyIHRocmVhZCBpcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIHdoaWNoIGlzIHNpbmdsZQordGhyZWFkZWQgYnkgdGhlIGhhcmR3YXJlIGFuZCBvdGhlciBzb2Z0d2FyZS4KKworVGhlIHNlbmQgcGFja2V0IHRocmVhZCBoYXMgcGFydGlhbCBjb250cm9sIG92ZXIgdGhlIFR4IHJpbmcgYW5kICdkZXYtPnRidXN5JworZmxhZy4gIEl0IHNldHMgdGhlIHRidXN5IGZsYWcgd2hlbmV2ZXIgaXQncyBxdWV1aW5nIGEgVHggcGFja2V0LiBJZiB0aGUgbmV4dAorcXVldWUgc2xvdCBpcyBlbXB0eSwgaXQgY2xlYXJzIHRoZSB0YnVzeSBmbGFnIHdoZW4gZmluaXNoZWQgb3RoZXJ3aXNlIGl0IHNldHMKK3RoZSAnaG1wLT50eF9mdWxsJyBmbGFnLgorCitUaGUgaW50ZXJydXB0IGhhbmRsZXIgaGFzIGV4Y2x1c2l2ZSBjb250cm9sIG92ZXIgdGhlIFJ4IHJpbmcgYW5kIHJlY29yZHMgc3RhdHMKK2Zyb20gdGhlIFR4IHJpbmcuICBBZnRlciByZWFwaW5nIHRoZSBzdGF0cywgaXQgbWFya3MgdGhlIFR4IHF1ZXVlIGVudHJ5IGFzCitlbXB0eSBieSBpbmNyZW1lbnRpbmcgdGhlIGRpcnR5X3R4IG1hcmsuIElmZiB0aGUgJ2htcC0+dHhfZnVsbCcgZmxhZyBpcyBzZXQsIGl0CitjbGVhcnMgYm90aCB0aGUgdHhfZnVsbCBhbmQgdGJ1c3kgZmxhZ3MuCisKK0lWLiBOb3RlcworCitUaGFua3MgdG8gS2ltIFN0ZWFybnMgb2YgUGFja2V0IEVuZ2luZXMgZm9yIHByb3ZpZGluZyBhIHBhaXIgb2YgR05JQy1JSSBib2FyZHMuCisKK0lWYi4gUmVmZXJlbmNlcworCitIYW1hY2hpIEVuZ2luZWVyaW5nIERlc2lnbiBTcGVjaWZpY2F0aW9uLCA1LzE1Lzk3CisoTm90ZTogVGhpcyB2ZXJzaW9uIHdhcyBtYXJrZWQgIkNvbmZpZGVudGlhbCIuKQorCitJVmMuIEVycmF0YQorCitOb25lIG5vdGVkLiAgCisKK1YuICBSZWNlbnQgQ2hhbmdlcworCiswMS8xNS8xOTk5IEVQSyAgRW5sYXJnZW1lbnQgb2YgdGhlIFRYIGFuZCBSWCByaW5nIHNpemVzLiAgVGhpcyBhcHBlYXJzIAorICAgIHRvIGhlbHAgYXZvaWQgc29tZSBzdGFsbCBjb25kaXRpb25zIC0tIHRoaXMgbmVlZHMgZnVydGhlciByZXNlYXJjaC4KKworMDEvMTUvMTk5OSBFUEsgIENyZWF0aW9uIG9mIHRoZSBoYW1hY2hpX3R4IGZ1bmN0aW9uLiAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgCisgICAgdGhlIFR4IHJpbmcgYW5kIGlzIGNhbGxlZCBmcm9tIGhhbWFjaGlfc3RhcnRfeG1pdCAodGhpcyB1c2VkIHRvIGJlCisgICAgY2FsbGVkIGZyb20gaGFtYWNoaV9pbnRlcnJ1cHQgYnV0IGl0IHRlbmRzIHRvIGRlbGF5IGV4ZWN1dGlvbiBvZiB0aGUKKyAgICBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgdGh1cyByZWR1Y2UgYmFuZHdpZHRoIGJ5IHJlZHVjaW5nIHRoZSBsYXRlbmN5CisgICAgYmV0d2VlbiBoYW1hY2hpX3J4KCkncykuICBOb3RhYmx5LCBzb21lIG1vZGlmaWNhdGlvbiBoYXMgYmVlbiBtYWRlIHNvIAorICAgIHRoYXQgdGhlIGNsZWFuaW5nIGxvb3AgY2hlY2tzIG9ubHkgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIERlc2NPd24gYml0IAorICAgIGlzbid0IHNldCBpbiB0aGUgc3RhdHVzIGZsYWcgc2luY2UgdGhlIGNhcmQgaXMgbm90IHJlcXVpcmVkIAorICAgIHRvIHNldCB0aGUgZW50aXJlIGZsYWcgdG8gemVybyBhZnRlciBwcm9jZXNzaW5nLgorCiswMS8xNS8xOTk5IEVQSyBJbiB0aGUgaGFtYWNoaV9zdGFydF90eCBmdW5jdGlvbiwgdGhlIFR4IHJpbmcgZnVsbCBmbGFnIGlzIAorICAgIGNoZWNrZWQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gYWRkIGEgYnVmZmVyIHRvIHRoZSByaW5nLiAgSWYgdGhlIHJpbmcgaXMgZnVsbAorICAgIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBmcmVlIGFueSBkaXJ0eSBidWZmZXJzIGFuZCB0aHVzIGZpbmQgc3BhY2UgZm9yCisgICAgdGhlIG5ldyBidWZmZXIgb3IgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gd2hpY2ggc2hvdWxkIGNhc2UgdGhlCisgICAgc2NoZWR1bGVyIHRvIHJlc2NoZWR1bGUgdGhlIGJ1ZmZlciBsYXRlci4KKworMDEvMTUvMTk5OSBFUEsgU29tZSBhZGp1c3RtZW50cyB3ZXJlIG1hZGUgdG8gdGhlIGNoaXAgaW5pdGlhbGl6YXRpb24uICAKKyAgICBFbmQtdG8tZW5kIGZsb3cgY29udHJvbCBzaG91bGQgbm93IGJlIGZ1bGx5IGFjdGl2ZSBhbmQgdGhlIGludGVycnVwdCAKKyAgICBhbGdvcml0aG0gdmFycyBoYXZlIGJlZW4gY2hhbmdlZC4gIFRoZXNlIGNvdWxkIHByb2JhYmx5IHVzZSBmdXJ0aGVyIHR1bmluZy4KKworMDEvMTUvMTk5OSBFUEsgQWRkZWQgdGhlIG1heF97cngsdHh9X2xhdGVuY3kgb3B0aW9ucy4gIFRoZXNlIGFyZSB1c2VkIHRvCisgICAgc2V0IHRoZSByeCBhbmQgdHggbGF0ZW5jaWVzIGZvciB0aGUgSGFtYWNoaSBpbnRlcnJ1cHRzLiBJZiB5b3UncmUgaGF2aW5nCisgICAgcHJvYmxlbXMgd2l0aCBuZXR3b3JrIHN0YWxscywgdHJ5IHNldHRpbmcgdGhlc2UgdG8gaGlnaGVyIHZhbHVlcy4KKyAgICBWYWxpZCB2YWx1ZXMgYXJlIDB4MDAgdGhyb3VnaCAweGZmLgorCiswMS8xNS8xOTk5IEVQSyBJbiBnZW5lcmFsLCB0aGUgb3ZlcmFsbCBiYW5kd2lkdGggaGFzIGluY3JlYXNlZCBhbmQgCisgICAgbGF0ZW5jaWVzIGFyZSBiZXR0ZXIgKHNvbWV0aW1lcyBieSBhIGZhY3RvciBvZiAyKS4gIFN0YWxscyBhcmUgcmFyZSBhdAorICAgIHRoaXMgcG9pbnQsIGhvd2V2ZXIgdGhlcmUgc3RpbGwgYXBwZWFycyB0byBiZSBhIGJ1ZyBzb21ld2hlcmUgYmV0d2VlbiB0aGUKKyAgICBoYXJkd2FyZSBhbmQgZHJpdmVyLiAgVENQIGNoZWNrc3VtIGVycm9ycyB1bmRlciBsb2FkIGFsc28gYXBwZWFyIHRvIGJlCisgICAgZWxpbWluYXRlZCBhdCB0aGlzIHBvaW50LgorCiswMS8xOC8xOTk5IEVQSyBFbnN1cmVkIHRoYXQgdGhlIERlc2NFbmRSaW5nIGJpdCB3YXMgYmVpbmcgc2V0IG9uIGJvdGggdGhlCisgICAgUnggYW5kIFR4IHJpbmdzLiAgVGhpcyBhcHBlYXJzIHRvIGhhdmUgYmVlbiBhZmZlY3Rpbmcgd2hldGhlciBhIHBhcnRpY3VsYXIKKyAgICBwZWVyLXRvLXBlZXIgY29ubmVjdGlvbiB3b3VsZCBoYW5nIHVuZGVyIGhpZ2ggbG9hZC4gIEkgYmVsaWV2ZSB0aGUgUngKKyAgICByaW5ncyB3YXMgdHlwaWNhbGx5IGdldHRpbmcgc2V0IGNvcnJlY3RseSwgYnV0IHRoZSBUeCByaW5nIHdhc24ndCBnZXR0aW5nCisgICAgdGhlIERlc2NFbmRSaW5nIGJpdCBzZXQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiA/Pz8gRG9lcyB0aGlzIG1lYW4gdGhlCisgICAgaGFtYWNoaSBjYXJkIGlzIHVzaW5nIHRoZSBEZXNjRW5kUmluZyBpbiBwcm9jZXNzaW5nIGV2ZW4gaWYgYSBwYXJ0aWN1bGFyCisgICAgc2xvdCBpc24ndCBpbiB1c2UgLS0gaHlwb3RoZXRpY2FsbHksIHRoZSBjYXJkIG1pZ2h0IGJlIHNlYXJjaGluZyB0aGUgCisgICAgZW50aXJlIFR4IHJpbmcgZm9yIHNsb3RzIHdpdGggdGhlIERlc2NPd24gYml0IHNldCBhbmQgdGhlbiBwcm9jZXNzaW5nCisgICAgdGhlbS4gIElmIHRoZSBEZXNjRW5kUmluZyBiaXQgaXNuJ3Qgc2V0LCB0aGVuIGl0IG1pZ2h0IGp1c3Qgd2FuZGVyIG9mZgorICAgIHRocm91Z2ggbWVtb3J5IHVudGlsIGl0IGhpdHMgYSBjaHVuayBvZiBkYXRhIHdpdGggdGhhdCBiaXQgc2V0CisgICAgYW5kIHRoZW4gbG9vcGluZyBiYWNrLgorCiswMi8wOS8xOTk5IEVQSyBBZGRlZCBNaWNoZWwgTXVlbGxlcidzIFR4RE1BIEludGVycnVwdCBhbmQgVHgtdGltZW91dCAKKyAgICBwcm9ibGVtIChUeENtZCBhbmQgUnhDbWQgbmVlZCBvbmx5IHRvIGJlIHNldCB3aGVuIGlkbGUgb3Igc3RvcHBlZC4KKworMDIvMDkvMTk5OSBFUEsgQWRkZWQgY29kZSB0byBjaGVjay9yZXNldCBkZXYtPnRidXN5IGluIGhhbWFjaGlfaW50ZXJydXB0LgorICAgIChNaWNoZWwgTXVlbGxlciBwb2ludGVkIG91dCB0aGUgYGBwZXJtYW5lbnRseSBidXN5JycgcG90ZW50aWFsIAorICAgIHByb2JsZW0gaGVyZSkuCisKKzAyLzIyLzE5OTkgRVBLIEFkZGVkIFBldGUgV3lja29mZidzIGlvY3RsIHRvIGNvbnRyb2wgdGhlIFR4L1J4IGxhdGVuY2llcy4gCisKKzAyLzIzLzE5OTkgRVBLIFZlcmlmaWVkIHRoYXQgdGhlIGludGVycnVwdCBzdGF0dXMgZmllbGQgYml0cyBmb3IgVHggd2VyZQorICAgIGluY29ycmVjdGx5IGRlZmluZWQgYW5kIGNvcnJlY3RlZCAoYXMgcGVyIE1pY2hlbCBNdWVsbGVyKS4KKworMDIvMjMvMTk5OSBFUEsgQ29ycmVjdGVkIHRoZSBUeCBmdWxsIGNoZWNrIHRvIGNoZWNrIHRoYXQgYXQgbGVhc3QgNCBzbG90cworICAgIHdlcmUgYXZhaWxhYmxlIGJlZm9yZSByZXNldGluZyB0aGUgdGJ1c3kgYW5kIHR4X2Z1bGwgZmxhZ3MKKyAgICAoYXMgcGVyIE1pY2hlbCBNdWVsbGVyKS4KKworMDMvMTEvMTk5OSBFUEsgQWRkZWQgUGV0ZSBXeWNrb2ZmJ3MgaGFyZHdhcmUgY2hlY2tzdW1taW5nIHN1cHBvcnQuCisKKzEyLzMxLzE5OTkgS0RVIENsZWFuZWQgdXAgYXNzb3J0ZWQgdGhpbmdzIGFuZCBhZGRlZCBEb24ncyBjb2RlIHRvIGZvcmNlCiszMiBiaXQuCisKKzAyLzIwLzIwMDAgS0RVIFNvbWUgb2YgdGhlIGNvbnRyb2wgd2FzIGp1c3QgcGxhaW4gb2RkLiAgQ2xlYW5lZCB1cCB0aGUKK2hhbWFjaGlfc3RhcnRfeG1pdCgpIGFuZCBoYW1hY2hpX2ludGVycnVwdCgpIGNvZGUuICBUaGVyZSBpcyBzdGlsbCBzb21lCityZS1zdHJ1Y3R1cmluZyBJIHdvdWxkIGxpa2UgdG8gZG8uICAKKworMDMvMDEvMjAwMCBLRFUgRXhwZXJpbWVudGluZyB3aXRoIGEgV0lERSByYW5nZSBvZiBpbnRlcnJ1cHQgbWl0aWdhdGlvbgorcGFyYW1ldGVycyBvbiBhIGR1YWwgUDMtNDUwIHNldHVwIHlpZWxkZWQgdGhlIG5ldyBkZWZhdWx0IGludGVycnVwdAorbWl0aWdhdGlvbiBwYXJhbWV0ZXJzLiAgVHggc2hvdWxkIGludGVycnVwdCBWRVJZIGluZnJlcXVlbnRseSBkdWUgdG8KK0VyaWMncyBzY2hlbWUuICBSeCBzaG91bGQgYmUgbW9yZSBvZnRlbi4uLgorCiswMy8xMy8yMDAwIEtEVSBBZGRlZCBhIHBhdGNoIHRvIG1ha2UgdGhlIFJ4IENoZWNrc3VtIGNvZGUgaW50ZXJhY3QKK25pY2VseSB3aXRoIG5vbi1saW51eCBtYWNoaW5lcy4gIAorCiswMy8xMy8yMDAwIEtEVSBFeHBlcmltZW50ZWQgd2l0aCBzb21lIG9mIHRoZSBjb25maWd1cmF0aW9uIHZhbHVlczogIAorCisJLUl0IHNlZW1zIHRoYXQgZW5hYmxpbmcgUENJIHBlcmZvcm1hbmNlIGNvbW1hbmRzIGZvciBkZXNjcmlwdG9ycworCShjaGFuZ2luZyBSeERNQUN0cmwgYW5kIFR4RE1BQ3RybCBsb3dlciBuaWJibGUgZnJvbSA1IHRvIEQpIGhhcyBtaW5pbWFsIAorCXBlcmZvcm1hbmNlIGltcGFjdCBmb3IgYW55IG9mIG15IHRlc3RzLiAodHRjcCwgbmV0cGlwZSwgbmV0cGVyZikgIEkgd2lsbCAKKwlsZWF2ZSB0aGVtIHRoYXQgd2F5IHVudGlsIEkgaGVhciBmdXJ0aGVyIGZlZWRiYWNrLgorCisJLUluY3JlYXNpbmcgdGhlIFBDSV9MQVRFTkNZX1RJTUVSIHRvIDEzMCAKKwkoMiArIChidXJzdCBzaXplIG9mIDEyOCAqICgwIHdhaXQgc3RhdGVzICsgMSkpKSBzZWVtcyB0byBzbGlnaHRseQorCWRlZ3JhZGUgcGVyZm9ybWFuY2UuICBMZWF2aW5nIGRlZmF1bHQgYXQgNjQgcGVuZGluZyBmdXJ0aGVyIGluZm9ybWF0aW9uLgorCiswMy8xNC8yMDAwIEtEVSBGdXJ0aGVyIHR1bmluZzogIAorCisJLWFkanVzdGVkIGJvZ3VzY250IGluIGhhbWFjaGlfcngoKSB0byBkZXBlbmQgb24gaW50ZXJydXB0CisJbWl0aWdhdGlvbiBwYXJhbWV0ZXJzIGNob3Nlbi4KKworCS1TZWxlY3RlZCBhIHNldCBvZiBpbnRlcnJ1cHQgcGFyYW1ldGVycyBiYXNlZCBvbiBzb21lIGV4dGVuc2l2ZSB0ZXN0aW5nLiAgCisJVGhlc2UgbWF5IGNoYW5nZSB3aXRoIG1vcmUgdGVzdGluZy4KKworVE8gRE86CisKKy1Db25zaWRlciBib3Jyb3dpbmcgZnJvbSB0aGUgYWNlbmljIGRyaXZlciBjb2RlIHRvIGNoZWNrIFBDSV9DT01NQU5EIGZvcgorUENJX0NPTU1BTkRfSU5WQUxJREFURS4gIFNldCBtYXhpbXVtIGJ1cnN0IHNpemUgdG8gY2FjaGUgbGluZSBzaXplIGluCit0aGF0IGNhc2UuCisKKy1maXggdGhlIHJlc2V0IHByb2NlZHVyZS4gIEl0IGRvZXNuJ3QgcXVpdGUgd29yay4gIAorKi8KKworLyogQSBmZXcgdmFsdWVzIHRoYXQgbWF5IGJlIHR3ZWFrZWQuICovCisvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlciwgY2FsY3VsYXRlZCBhczoKKyAqIDE1MTggYnl0ZXMgKGV0aGVybmV0IHBhY2tldCkgKyAyIGJ5dGVzICh0byBnZXQgOCBieXRlIGFsaWdubWVudCBmb3IKKyAqIHRoZSBjYXJkKSArIDggYnl0ZXMgb2Ygc3RhdHVzIGluZm8gKyA4IGJ5dGVzIGZvciB0aGUgUnggQ2hlY2tzdW0gKworICogMiBtb3JlIGJlY2F1c2Ugd2UgdXNlIHNrYl9yZXNlcnZlLiAgCisgKi8KKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTUzOAorCisvKiBGb3Igbm93LCB0aGlzIGlzIGdvaW5nIHRvIGJlIHNldCB0byB0aGUgbWF4aW11bSBzaXplIG9mIGFuIGV0aGVybmV0CisgKiBwYWNrZXQuICBFdmVudHVhbGx5LCB3ZSBtYXkgd2FudCB0byBtYWtlIGl0IGEgdmFyaWFibGUgdGhhdCBpcworICogcmVsYXRlZCB0byB0aGUgTVRVCisgKi8KKyNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgIDE1MTgKKworLyogVGhlIHJlc3Qgb2YgdGhlc2UgdmFsdWVzIHNob3VsZCBuZXZlciBjaGFuZ2UuICovCisKK3N0YXRpYyB2b2lkIGhhbWFjaGlfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKKworZW51bSBjYXBhYmlsaXR5X2ZsYWdzIHtDYW5IYXZlTUlJPTEsIH07CitzdGF0aWMgc3RydWN0IGNoaXBfaW5mbyB7CisJdTE2CXZlbmRvcl9pZCwgZGV2aWNlX2lkLCBkZXZpY2VfaWRfbWFzaywgcGFkOworCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZCAoKm1lZGlhX3RpbWVyKSh1bnNpZ25lZCBsb25nIGRhdGEpOworCWludCBmbGFnczsKK30gY2hpcF90YmxbXSA9IHsKKwl7MHgxMzE4LCAweDA5MTEsIDB4ZmZmZiwgMCwgIkhhbWFjaGkgR05JQy1JSSIsIGhhbWFjaGlfdGltZXIsIDB9LAorCXswLH0sCit9OworCisvKiBPZmZzZXRzIHRvIHRoZSBIYW1hY2hpIHJlZ2lzdGVycy4gIFZhcmlvdXMgc2l6ZXMuICovCitlbnVtIGhhbWFjaGlfb2Zmc2V0cyB7CisJVHhETUFDdHJsPTB4MDAsIFR4Q21kPTB4MDQsIFR4U3RhdHVzPTB4MDYsIFR4UHRyPTB4MDgsIFR4Q3VyUHRyPTB4MTAsCisJUnhETUFDdHJsPTB4MjAsIFJ4Q21kPTB4MjQsIFJ4U3RhdHVzPTB4MjYsIFJ4UHRyPTB4MjgsIFJ4Q3VyUHRyPTB4MzAsCisJUENJQ2xrTWVhcz0weDA2MCwgTWlzY1N0YXR1cz0weDA2NiwgQ2hpcFJldj0weDY4LCBDaGlwUmVzZXQ9MHgwNkIsCisJTEVEQ3RybD0weDA2QywgVmlydHVhbEp1bXBlcnM9MHgwNkQsIEdQSU89MHg2RSwKKwlUeENoZWNrc3VtPTB4MDc0LCBSeENoZWNrc3VtPTB4MDc2LAorCVR4SW50ckN0cmw9MHgwNzgsIFJ4SW50ckN0cmw9MHgwN0MsCisJSW50ZXJydXB0RW5hYmxlPTB4MDgwLCBJbnRlcnJ1cHRDbGVhcj0weDA4NCwgSW50clN0YXR1cz0weDA4OCwKKwlFdmVudFN0YXR1cz0weDA4QywKKwlNQUNDbmZnPTB4MEEwLCBGcmFtZUdhcDA9MHgwQTIsIEZyYW1lR2FwMT0weDBBNCwKKwkvKiBTZWUgZW51bSBNSUlfb2Zmc2V0cyBiZWxvdy4gKi8KKwlNQUNDbmZnMj0weDBCMCwgUnhEZXB0aD0weDBCOCwgRmxvd0N0cmw9MHgwQkMsIE1heEZyYW1lU2l6ZT0weDBDRSwKKwlBZGRyTW9kZT0weDBEMCwgU3RhdGlvbkFkZHI9MHgwRDIsCisJLyogR2lnYWJpdCBBdXRvTmVnb3RpYXRpb24uICovCisJQU5DdHJsPTB4MEUwLCBBTlN0YXR1cz0weDBFMiwgQU5YY2huZ0N0cmw9MHgwRTQsIEFOQWR2ZXJ0aXNlPTB4MEU4LAorCUFOTGlua1BhcnRuZXJBYmlsaXR5PTB4MEVBLAorCUVFQ21kU3RhdHVzPTB4MEYwLCBFRURhdGE9MHgwRjEsIEVFQWRkcj0weDBGMiwKKwlGSUZPY2ZnPTB4MEY4LAorfTsKKworLyogT2Zmc2V0cyB0byB0aGUgTUlJLW1vZGUgcmVnaXN0ZXJzLiAqLworZW51bSBNSUlfb2Zmc2V0cyB7CisJTUlJX0NtZD0weEE2LCBNSUlfQWRkcj0weEE4LCBNSUlfV3JfRGF0YT0weEFBLCBNSUlfUmRfRGF0YT0weEFDLAorCU1JSV9TdGF0dXM9MHhBRSwKK307CisKKy8qIEJpdHMgaW4gdGhlIGludGVycnVwdCBzdGF0dXMvbWFzayByZWdpc3RlcnMuICovCitlbnVtIGludHJfc3RhdHVzX2JpdHMgeworCUludHJSeERvbmU9MHgwMSwgSW50clJ4UENJRmF1bHQ9MHgwMiwgSW50clJ4UENJRXJyPTB4MDQsCisJSW50clR4RG9uZT0weDEwMCwgSW50clR4UENJRmF1bHQ9MHgyMDAsIEludHJUeFBDSUVycj0weDQwMCwKKwlMaW5rQ2hhbmdlPTB4MTAwMDAsIE5lZ290aWF0aW9uQ2hhbmdlPTB4MjAwMDAsIFN0YXRzTWF4PTB4NDAwMDAsIH07CisKKy8qIFRoZSBIYW1hY2hpIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3QgaGFtYWNoaV9kZXNjIHsKKwl1MzIgc3RhdHVzX25fbGVuZ3RoOwkJCQorI2lmIEFERFJMRU4gPT0gNjQKKwl1MzIgcGFkOworCXU2NCBhZGRyOworI2Vsc2UKKwl1MzIgYWRkcjsKKyNlbmRpZgorfTsKKworLyogQml0cyBpbiBoYW1hY2hpX2Rlc2Muc3RhdHVzX25fbGVuZ3RoICovCitlbnVtIGRlc2Nfc3RhdHVzX2JpdHMgeworCURlc2NPd249MHg4MDAwMDAwMCwgRGVzY0VuZFBhY2tldD0weDQwMDAwMDAwLCBEZXNjRW5kUmluZz0weDIwMDAwMDAwLCAKKwlEZXNjSW50cj0weDEwMDAwMDAwLAorfTsKKworI2RlZmluZSBQUklWX0FMSUdOCTE1ICAJCQkvKiBSZXF1aXJlZCBhbGlnbm1lbnQgbWFzayAqLworI2RlZmluZSBNSUlfQ05UCQk0CitzdHJ1Y3QgaGFtYWNoaV9wcml2YXRlIHsKKwkvKiBEZXNjcmlwdG9yIHJpbmdzIGZpcnN0IGZvciBhbGlnbm1lbnQuICBUeCByZXF1aXJlcyBhIHNlY29uZCBkZXNjcmlwdG9yCisJICAgZm9yIHN0YXR1cy4gKi8KKwlzdHJ1Y3QgaGFtYWNoaV9kZXNjICpyeF9yaW5nOworCXN0cnVjdCBoYW1hY2hpX2Rlc2MgKnR4X3Jpbmc7CisJc3RydWN0IHNrX2J1ZmYqIHJ4X3NrYnVmZltSWF9SSU5HX1NJWkVdOworCXN0cnVjdCBza19idWZmKiB0eF9za2J1ZmZbVFhfUklOR19TSVpFXTsKKwlkbWFfYWRkcl90IHR4X3JpbmdfZG1hOworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CQkvKiBNZWRpYSBzZWxlY3Rpb24gdGltZXIuICovCisJLyogRnJlcXVlbnRseSB1c2VkIGFuZCBwYWlyZWQgdmFsdWU6IGtlZXAgYWRqYWNlbnQgZm9yIGNhY2hlIGVmZmVjdC4gKi8KKwlzcGlubG9ja190IGxvY2s7CisJaW50IGNoaXBfaWQ7CisJdW5zaWduZWQgaW50IGN1cl9yeCwgZGlydHlfcng7CQkvKiBQcm9kdWNlci9jb25zdW1lciByaW5nIGluZGljZXMgKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3R4LCBkaXJ0eV90eDsKKwl1bnNpZ25lZCBpbnQgcnhfYnVmX3N6OwkJCS8qIEJhc2VkIG9uIE1UVStzbGFjay4gKi8KKwl1bnNpZ25lZCBpbnQgdHhfZnVsbDoxOwkJCS8qIFRoZSBUeCBxdWV1ZSBpcyBmdWxsLiAqLworCXVuc2lnbmVkIGludCBkdXBsZXhfbG9jazoxOworCXVuc2lnbmVkIGludCBkZWZhdWx0X3BvcnQ6NDsJCS8qIExhc3QgZGV2LT5pZl9wb3J0IHZhbHVlLiAqLworCS8qIE1JSSB0cmFuc2NlaXZlciBzZWN0aW9uLiAqLworCWludCBtaWlfY250OwkJCQkJCQkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisJc3RydWN0IG1paV9pZl9pbmZvIG1paV9pZjsJCS8qIE1JSSBsaWIgaG9va3MvaW5mbyAqLworCXVuc2lnbmVkIGNoYXIgcGh5c1tNSUlfQ05UXTsJCS8qIE1JSSBkZXZpY2UgYWRkcmVzc2VzLCBvbmx5IGZpcnN0IG9uZSB1c2VkLiAqLworCXUzMiByeF9pbnRfdmFyLCB0eF9pbnRfdmFyOwkvKiBpbnRlcnJ1cHQgY29udHJvbCB2YXJpYWJsZXMgKi8KKwl1MzIgb3B0aW9uOwkJCQkJCQkvKiBIb2xkIG9uIHRvIGEgY29weSBvZiB0aGUgb3B0aW9ucyAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCXZvaWQgX19pb21lbSAqYmFzZTsKK307CisKK01PRFVMRV9BVVRIT1IoIkRvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+LCBFcmljIEthc3RlbiA8a2FzdGVuQG5zY2wubXN1LmVkdT4sIEtlaXRoIFVuZGVyd29vZCA8a2VpdGh1QHBhcmwuY2xlbXNvbi5lZHU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBhY2tldCBFbmdpbmVzICdIYW1hY2hpJyBHTklDLUlJIEdpZ2FiaXQgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShtYXhfaW50ZXJydXB0X3dvcmssIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXR1LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1pbl9yeF9wa3QsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWF4X3J4X2dhcCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtYXhfcnhfbGF0ZW5jeSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtaW5fdHhfcGt0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heF90eF9nYXAsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWF4X3R4X2xhdGVuY3ksIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHJ4X3BhcmFtcywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh0eF9wYXJhbXMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkob3B0aW9ucywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShmdWxsX2R1cGxleCwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShmb3JjZTMyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfaW50ZXJydXB0X3dvcmssICJHTklDLUlJIG1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworTU9EVUxFX1BBUk1fREVTQyhtdHUsICJHTklDLUlJIE1UVSAoYWxsIGJvYXJkcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJHTklDLUlJIGRlYnVnIGxldmVsICgwLTcpIik7CitNT0RVTEVfUEFSTV9ERVNDKG1pbl9yeF9wa3QsICJHTklDLUlJIG1pbmltdW0gUnggcGFja2V0cyBwcm9jZXNzZWQgYmV0d2VlbiBpbnRlcnJ1cHRzIik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9yeF9nYXAsICJHTklDLUlJIG1heGltdW0gUnggaW50ZXItcGFja2V0IGdhcCBpbiA4LjE5MiBtaWNyb3NlY29uZCB1bml0cyIpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfcnhfbGF0ZW5jeSwgIkdOSUMtSUkgdGltZSBiZXR3ZWVuIFJ4IGludGVycnVwdHMgaW4gOC4xOTIgbWljcm9zZWNvbmQgdW5pdHMiKTsKK01PRFVMRV9QQVJNX0RFU0MobWluX3R4X3BrdCwgIkdOSUMtSUkgbWluaW11bSBUeCBwYWNrZXRzIHByb2Nlc3NlZCBiZXR3ZWVuIGludGVycnVwdHMiKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3R4X2dhcCwgIkdOSUMtSUkgbWF4aW11bSBUeCBpbnRlci1wYWNrZXQgZ2FwIGluIDguMTkyIG1pY3Jvc2Vjb25kIHVuaXRzIik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF90eF9sYXRlbmN5LCAiR05JQy1JSSB0aW1lIGJldHdlZW4gVHggaW50ZXJydXB0cyBpbiA4LjE5MiBtaWNyb3NlY29uZCB1bml0cyIpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICJHTklDLUlJIGNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X3BhcmFtcywgIkdOSUMtSUkgbWluX3J4X3BrdCttYXhfcnhfZ2FwK21heF9yeF9sYXRlbmN5Iik7CitNT0RVTEVfUEFSTV9ERVNDKHR4X3BhcmFtcywgIkdOSUMtSUkgbWluX3R4X3BrdCttYXhfdHhfZ2FwK21heF90eF9sYXRlbmN5Iik7CitNT0RVTEVfUEFSTV9ERVNDKG9wdGlvbnMsICJHTklDLUlJIEJpdHMgMC0zOiBtZWRpYSB0eXBlLCBiaXRzIDQtNjogYXMgZm9yY2UzMiwgYml0IDc6IGhhbGYgZHVwbGV4LCBiaXQgOSBmdWxsIGR1cGxleCIpOworTU9EVUxFX1BBUk1fREVTQyhmdWxsX2R1cGxleCwgIkdOSUMtSUkgZnVsbCBkdXBsZXggc2V0dGluZyhzKSAoMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2UzMiwgIkdOSUMtSUk6IEJpdCAwOiAzMiBiaXQgUENJLCBiaXQgMTogZGlzYWJsZSBwYXJpdHksIGJpdCAyOiA2NCBiaXQgUENJIChhbGwgYm9hcmRzKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgbG9jYXRpb24pOworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworc3RhdGljIGludCBoYW1hY2hpX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyB2b2lkIGhhbWFjaGlfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGhhbWFjaGlfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGhhbWFjaGlfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBoYW1hY2hpX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgaGFtYWNoaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IGhhbWFjaGlfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW5saW5lIGludCBoYW1hY2hpX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaGFtYWNoaV9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpOworc3RhdGljIGludCBoYW1hY2hpX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpoYW1hY2hpX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBldGh0b29sX29wczsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHNfbm9fbWlpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBoYW1hY2hpX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgaGFtYWNoaV9wcml2YXRlICpobXA7CisJaW50IG9wdGlvbiwgaSwgcnhfaW50X3ZhciwgdHhfaW50X3ZhciwgYm9ndXNjbnQ7CisJaW50IGNoaXBfaWQgPSBlbnQtPmRyaXZlcl9kYXRhOworCWludCBpcnE7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCXN0YXRpYyBpbnQgY2FyZF9pZHg7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl2b2lkICpyaW5nX3NwYWNlOworCWRtYV9hZGRyX3QgcmluZ19kbWE7CisJaW50IHJldCA9IC1FTk9NRU07CisKKy8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwliYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworI2lmZGVmIF9fYWxwaGFfXwkJCQkvKiBSZWFsbHkgIjY0IGJpdCBhZGRycyIgKi8KKwliYXNlIHw9IChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSkgPDwgMzIpOworI2VuZGlmCisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWkgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAoaSkgcmV0dXJuIGk7CisKKwlpcnEgPSBwZGV2LT5pcnE7CisJaW9hZGRyID0gaW9yZW1hcChiYXNlLCAweDQwMCk7CisJaWYgKCFpb2FkZHIpCisJCWdvdG8gZXJyX291dF9yZWxlYXNlOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBoYW1hY2hpX3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworI2lmZGVmIFRYX0NIRUNLU1VNCisJcHJpbnRrKCJjaGVjayB0aGF0IHNrYmNvcHkgaW4gaXBfcXVldWVfeG1pdCBpc24ndCBoYXBwZW5pbmdcbiIpOworCWRldi0+aGFyZF9oZWFkZXJfbGVuICs9IDg7ICAvKiBmb3IgY2tzdW0gdGFnICovCisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSAxID8gcmVhZF9lZXByb20oaW9hZGRyLCA0ICsgaSkKKwkJCTogcmVhZGIoaW9hZGRyICsgU3RhdGlvbkFkZHIgKyBpKTsKKworI2lmICEgZGVmaW5lZChmaW5hbF92ZXJzaW9uKQorCWlmIChoYW1hY2hpX2RlYnVnID4gNCkKKwkJZm9yIChpID0gMDsgaSA8IDB4MTA7IGkrKykKKwkJCXByaW50aygiJTIuMnglcyIsCisJCQkJICAgcmVhZF9lZXByb20oaW9hZGRyLCBpKSwgaSAlIDE2ICE9IDE1ID8gIiAiIDogIlxuIik7CisjZW5kaWYKKworCWhtcCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2luaXQoJmhtcC0+bG9jayk7CisKKwlobXAtPm1paV9pZi5kZXYgPSBkZXY7CisJaG1wLT5taWlfaWYubWRpb19yZWFkID0gbWRpb19yZWFkOworCWhtcC0+bWlpX2lmLm1kaW9fd3JpdGUgPSBtZGlvX3dyaXRlOworCWhtcC0+bWlpX2lmLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlobXAtPm1paV9pZi5yZWdfbnVtX21hc2sgPSAweDFmOworCisJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CisJaWYgKCFyaW5nX3NwYWNlKQorCQlnb3RvIGVycl9vdXRfY2xlYXJkZXY7CisJaG1wLT50eF9yaW5nID0gKHN0cnVjdCBoYW1hY2hpX2Rlc2MgKilyaW5nX3NwYWNlOworCWhtcC0+dHhfcmluZ19kbWEgPSByaW5nX2RtYTsKKworCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCAmcmluZ19kbWEpOworCWlmICghcmluZ19zcGFjZSkKKwkJZ290byBlcnJfb3V0X3VubWFwX3R4OworCWhtcC0+cnhfcmluZyA9IChzdHJ1Y3QgaGFtYWNoaV9kZXNjICopcmluZ19zcGFjZTsKKwlobXAtPnJ4X3JpbmdfZG1hID0gcmluZ19kbWE7CisKKwkvKiBDaGVjayBmb3Igb3B0aW9ucyBiZWluZyBwYXNzZWQgaW4gKi8KKwlvcHRpb24gPSBjYXJkX2lkeCA8IE1BWF9VTklUUyA/IG9wdGlvbnNbY2FyZF9pZHhdIDogMDsKKwlpZiAoZGV2LT5tZW1fc3RhcnQpCisJCW9wdGlvbiA9IGRldi0+bWVtX3N0YXJ0OworCisJLyogSWYgdGhlIGJ1cyBzaXplIGlzIG1pc2lkZW50aWZpZWQsIGRvIHRoZSBmb2xsb3dpbmcuICovCisJZm9yY2UzMiA9IGZvcmNlMzIgPyBmb3JjZTMyIDogCisJCSgob3B0aW9uICA+PSAwKSA/ICgob3B0aW9uICYgMHgwMDAwMDA3MCkgPj4gNCkgOiAwICk7CisJaWYgKGZvcmNlMzIpCisJCXdyaXRlYihmb3JjZTMyLCBpb2FkZHIgKyBWaXJ0dWFsSnVtcGVycyk7CisKKwkvKiBIbW1tLCBkbyB3ZSByZWFsbHkgbmVlZCB0byByZXNldCB0aGUgY2hpcD8/Py4gKi8KKwl3cml0ZWIoMHgwMSwgaW9hZGRyICsgQ2hpcFJlc2V0KTsKKworCS8qIEFmdGVyIGEgcmVzZXQsIHRoZSBjbG9jayBzcGVlZCBtZWFzdXJlbWVudCBvZiB0aGUgUENJIGJ1cyB3aWxsIG5vdAorCSAqIGJlIHZhbGlkIGZvciBhIG1vbWVudC4gIFdhaXQgZm9yIGEgbGl0dGxlIHdoaWxlIHVudGlsIGl0IGlzLiAgSWYKKwkgKiBpdCB0YWtlcyBtb3JlIHRoYW4gMTBtcywgZm9yZ2V0IGl0LgorCSAqLworCXVkZWxheSgxMCk7CQorCWkgPSByZWFkYihpb2FkZHIgKyBQQ0lDbGtNZWFzKTsKKwlmb3IgKGJvZ3VzY250ID0gMDsgKCEoaSAmIDB4MDgwKSkgJiYgYm9ndXNjbnQgPCAxMDAwOyBib2d1c2NudCsrKXsKKwkJdWRlbGF5KDEwKTsJCisJCWkgPSByZWFkYihpb2FkZHIgKyBQQ0lDbGtNZWFzKTsJCisJfQorCisJaG1wLT5iYXNlID0gaW9hZGRyOworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9hZGRyOworCWRldi0+aXJxID0gaXJxOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJaG1wLT5jaGlwX2lkID0gY2hpcF9pZDsKKwlobXAtPnBjaV9kZXYgPSBwZGV2OworCisJLyogVGhlIGxvd2VyIGZvdXIgYml0cyBhcmUgdGhlIG1lZGlhIHR5cGUuICovCisJaWYgKG9wdGlvbiA+IDApIHsKKwkJaG1wLT5vcHRpb24gPSBvcHRpb247CisJCWlmIChvcHRpb24gJiAweDIwMCkKKwkJCWhtcC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKKwkJZWxzZSBpZiAob3B0aW9uICYgMHgwODApCisJCQlobXAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDA7CisJCWhtcC0+ZGVmYXVsdF9wb3J0ID0gb3B0aW9uICYgMTU7CisJCWlmIChobXAtPmRlZmF1bHRfcG9ydCkKKwkJCWhtcC0+bWlpX2lmLmZvcmNlX21lZGlhID0gMTsKKwl9CisJaWYgKGNhcmRfaWR4IDwgTUFYX1VOSVRTICAmJiAgZnVsbF9kdXBsZXhbY2FyZF9pZHhdID4gMCkKKwkJaG1wLT5taWlfaWYuZnVsbF9kdXBsZXggPSAxOworCisJLyogbG9jayB0aGUgZHVwbGV4IG1vZGUgaWYgc29tZW9uZSBzcGVjaWZpZWQgYSB2YWx1ZSAqLworCWlmIChobXAtPm1paV9pZi5mdWxsX2R1cGxleCB8fCAob3B0aW9uICYgMHgwODApKQorCQlobXAtPmR1cGxleF9sb2NrID0gMTsKKworCS8qIFNldCBpbnRlcnJ1cHQgdHVuaW5nIHBhcmFtZXRlcnMgKi8KKwltYXhfcnhfbGF0ZW5jeSA9IG1heF9yeF9sYXRlbmN5ICYgMHgwMGZmOworCW1heF9yeF9nYXAgPSBtYXhfcnhfZ2FwICYgMHgwMGZmOworCW1pbl9yeF9wa3QgPSBtaW5fcnhfcGt0ICYgMHgwMGZmOworCW1heF90eF9sYXRlbmN5ID0gbWF4X3R4X2xhdGVuY3kgJiAweDAwZmY7CisJbWF4X3R4X2dhcCA9IG1heF90eF9nYXAgJiAweDAwZmY7CisJbWluX3R4X3BrdCA9IG1pbl90eF9wa3QgJiAweDAwZmY7CisKKwlyeF9pbnRfdmFyID0gY2FyZF9pZHggPCBNQVhfVU5JVFMgPyByeF9wYXJhbXNbY2FyZF9pZHhdIDogLTE7CisJdHhfaW50X3ZhciA9IGNhcmRfaWR4IDwgTUFYX1VOSVRTID8gdHhfcGFyYW1zW2NhcmRfaWR4XSA6IC0xOworCWhtcC0+cnhfaW50X3ZhciA9IHJ4X2ludF92YXIgPj0gMCA/IHJ4X2ludF92YXIgOiAKKwkJKG1pbl9yeF9wa3QgPDwgMTYgfCBtYXhfcnhfZ2FwIDw8IDggfCBtYXhfcnhfbGF0ZW5jeSk7CisJaG1wLT50eF9pbnRfdmFyID0gdHhfaW50X3ZhciA+PSAwID8gdHhfaW50X3ZhciA6IAorCQkobWluX3R4X3BrdCA8PCAxNiB8IG1heF90eF9nYXAgPDwgOCB8IG1heF90eF9sYXRlbmN5KTsKKworCisJLyogVGhlIEhhbWFjaGktc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSAmaGFtYWNoaV9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmhhbWFjaGlfc3RhcnRfeG1pdDsKKwlkZXYtPnN0b3AgPSAmaGFtYWNoaV9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZoYW1hY2hpX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKwlkZXYtPmRvX2lvY3RsID0gJm5ldGRldl9pb2N0bDsKKwlpZiAoY2hpcF90YmxbaG1wLT5jaGlwX2lkXS5mbGFncyAmIENhbkhhdmVNSUkpCisJCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CisJZWxzZQorCQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHNfbm9fbWlpKTsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmaGFtYWNoaV90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCWlmIChtdHUpCisJCWRldi0+bXR1ID0gbXR1OworCisJaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChpKSB7CisJCXJldCA9IGk7CisJCWdvdG8gZXJyX291dF91bm1hcF9yeDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgdHlwZSAleCBhdCAlcCwgIiwKKwkJICAgZGV2LT5uYW1lLCBjaGlwX3RibFtjaGlwX2lkXS5uYW1lLCByZWFkbChpb2FkZHIgKyBDaGlwUmV2KSwKKwkJICAgaW9hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQkJcHJpbnRrKCIlMi4yeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiUyLjJ4LCBJUlEgJWQuXG4iLCBkZXYtPmRldl9hZGRyW2ldLCBpcnEpOworCWkgPSByZWFkYihpb2FkZHIgKyBQQ0lDbGtNZWFzKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogICVkLWJpdCAlZCBNaHogUENJIGJ1cyAoJWQpLCBWaXJ0dWFsIEp1bXBlcnMgIgorCQkgICAiJTIuMngsIExQQSAlNC40eC5cbiIsCisJCSAgIGRldi0+bmFtZSwgcmVhZHcoaW9hZGRyICsgTWlzY1N0YXR1cykgJiAxID8gNjQgOiAzMiwKKwkJICAgaSA/IDIwMDAvKGkmMHg3ZikgOiAwLCBpJjB4N2YsIChpbnQpcmVhZGIoaW9hZGRyICsgVmlydHVhbEp1bXBlcnMpLAorCQkgICByZWFkdyhpb2FkZHIgKyBBTkxpbmtQYXJ0bmVyQWJpbGl0eSkpOworCisJaWYgKGNoaXBfdGJsW2htcC0+Y2hpcF9pZF0uZmxhZ3MgJiBDYW5IYXZlTUlJKSB7CisJCWludCBwaHksIHBoeV9pZHggPSAwOworCQlmb3IgKHBoeSA9IDA7IHBoeSA8IDMyICYmIHBoeV9pZHggPCBNSUlfQ05UOyBwaHkrKykgeworCQkJaW50IG1paV9zdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9CTVNSKTsKKwkJCWlmIChtaWlfc3RhdHVzICE9IDB4ZmZmZiAgJiYKKwkJCQltaWlfc3RhdHVzICE9IDB4MDAwMCkgeworCQkJCWhtcC0+cGh5c1twaHlfaWR4KytdID0gcGh5OworCQkJCWhtcC0+bWlpX2lmLmFkdmVydGlzaW5nID0gbWRpb19yZWFkKGRldiwgcGh5LCBNSUlfQURWRVJUSVNFKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTUlJIFBIWSBmb3VuZCBhdCBhZGRyZXNzICVkLCBzdGF0dXMgIgorCQkJCQkgICAiMHglNC40eCBhZHZlcnRpc2luZyAlNC40eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcGh5LCBtaWlfc3RhdHVzLCBobXAtPm1paV9pZi5hZHZlcnRpc2luZyk7CisJCQl9CisJCX0KKwkJaG1wLT5taWlfY250ID0gcGh5X2lkeDsKKwkJaWYgKGhtcC0+bWlpX2NudCA+IDApCisJCQlobXAtPm1paV9pZi5waHlfaWQgPSBobXAtPnBoeXNbMF07CisJCWVsc2UKKwkJCW1lbXNldCgmaG1wLT5taWlfaWYsIDAsIHNpemVvZihobXAtPm1paV9pZikpOworCX0KKwkvKiBDb25maWd1cmUgZ2lnYWJpdCBhdXRvbmVnb3RpYXRpb24uICovCisJd3JpdGV3KDB4MDQwMCwgaW9hZGRyICsgQU5YY2huZ0N0cmwpOwkvKiBFbmFibGUgbGVnYWN5IGxpbmtzLiAqLworCXdyaXRldygweDA4ZTAsIGlvYWRkciArIEFOQWR2ZXJ0aXNlKTsJLyogU2V0IG91ciBhZHZlcnRpc2Ugd29yZC4gKi8KKwl3cml0ZXcoMHgxMDAwLCBpb2FkZHIgKyBBTkN0cmwpOwkJCS8qIEVuYWJsZSBuZWdvdGlhdGlvbiAqLworCisJY2FyZF9pZHgrKzsKKwlyZXR1cm4gMDsKKworZXJyX291dF91bm1hcF9yeDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFJYX1RPVEFMX1NJWkUsIGhtcC0+cnhfcmluZywgCisJCWhtcC0+cnhfcmluZ19kbWEpOworZXJyX291dF91bm1hcF90eDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsIGhtcC0+dHhfcmluZywgCisJCWhtcC0+dHhfcmluZ19kbWEpOworZXJyX291dF9jbGVhcmRldjoKKwlmcmVlX25ldGRldiAoZGV2KTsKK2Vycl9vdXRfaW91bm1hcDoKKwlpb3VubWFwKGlvYWRkcik7CitlcnJfb3V0X3JlbGVhc2U6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcmVhZF9lZXByb20odm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBsb2NhdGlvbikKK3sKKwlpbnQgYm9ndXNfY250ID0gMTAwMDsKKworCS8qIFdlIHNob3VsZCBjaGVjayBidXN5IGZpcnN0IC0gcGVyIGRvY3MgLUtEVSAqLworCXdoaWxlICgocmVhZGIoaW9hZGRyICsgRUVDbWRTdGF0dXMpICYgMHg0MCkgICYmIC0tYm9ndXNfY250ID4gMCk7CisJd3JpdGV3KGxvY2F0aW9uLCBpb2FkZHIgKyBFRUFkZHIpOworCXdyaXRlYigweDAyLCBpb2FkZHIgKyBFRUNtZFN0YXR1cyk7CisJYm9ndXNfY250ID0gMTAwMDsKKwl3aGlsZSAoKHJlYWRiKGlvYWRkciArIEVFQ21kU3RhdHVzKSAmIDB4NDApICAmJiAtLWJvZ3VzX2NudCA+IDApOworCWlmIChoYW1hY2hpX2RlYnVnID4gNSkKKwkJcHJpbnRrKCIgICBFRVBST00gc3RhdHVzIGlzICUyLjJ4IGFmdGVyICVkIHRpY2tzLlxuIiwKKwkJCSAgIChpbnQpcmVhZGIoaW9hZGRyICsgRUVDbWRTdGF0dXMpLCAxMDAwLSBib2d1c19jbnQpOworCXJldHVybiByZWFkYihpb2FkZHIgKyBFRURhdGEpOworfQorCisvKiBNSUkgTWFuYWdlbWVuIERhdGEgSS9PIGFjY2Vzc2VzLgorICAgVGhlc2Ugcm91dGluZXMgYXNzdW1lIHRoZSBNRElPIGNvbnRyb2xsZXIgaXMgaWRsZSwgYW5kIGRvIG5vdCBleGl0IHVudGlsCisgICB0aGUgY29tbWFuZCBpcyBmaW5pc2hlZC4gKi8KKworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKmhtcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBobXAtPmJhc2U7CisJaW50IGk7CisKKwkvKiBXZSBzaG91bGQgY2hlY2sgYnVzeSBmaXJzdCAtIHBlciBkb2NzIC1LRFUgKi8KKwlmb3IgKGkgPSAxMDAwMDsgaSA+PSAwOyBpLS0pCisJCWlmICgocmVhZHcoaW9hZGRyICsgTUlJX1N0YXR1cykgJiAxKSA9PSAwKQorCQkJYnJlYWs7CisJd3JpdGV3KChwaHlfaWQ8PDgpICsgbG9jYXRpb24sIGlvYWRkciArIE1JSV9BZGRyKTsKKwl3cml0ZXcoMHgwMDAxLCBpb2FkZHIgKyBNSUlfQ21kKTsKKwlmb3IgKGkgPSAxMDAwMDsgaSA+PSAwOyBpLS0pCisJCWlmICgocmVhZHcoaW9hZGRyICsgTUlJX1N0YXR1cykgJiAxKSA9PSAwKQorCQkJYnJlYWs7CisJcmV0dXJuIHJlYWR3KGlvYWRkciArIE1JSV9SZF9EYXRhKTsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgaGFtYWNoaV9wcml2YXRlICpobXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gaG1wLT5iYXNlOworCWludCBpOworCisJLyogV2Ugc2hvdWxkIGNoZWNrIGJ1c3kgZmlyc3QgLSBwZXIgZG9jcyAtS0RVICovCisJZm9yIChpID0gMTAwMDA7IGkgPj0gMDsgaS0tKQorCQlpZiAoKHJlYWR3KGlvYWRkciArIE1JSV9TdGF0dXMpICYgMSkgPT0gMCkKKwkJCWJyZWFrOworCXdyaXRldygocGh5X2lkPDw4KSArIGxvY2F0aW9uLCBpb2FkZHIgKyBNSUlfQWRkcik7CisJd3JpdGV3KHZhbHVlLCBpb2FkZHIgKyBNSUlfV3JfRGF0YSk7CisKKwkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBmaW5pc2guICovCisJZm9yIChpID0gMTAwMDA7IGkgPj0gMDsgaS0tKQorCQlpZiAoKHJlYWR3KGlvYWRkciArIE1JSV9TdGF0dXMpICYgMSkgPT0gMCkKKwkJCWJyZWFrOworCXJldHVybjsKK30KKworDAorc3RhdGljIGludCBoYW1hY2hpX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGFtYWNoaV9wcml2YXRlICpobXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gaG1wLT5iYXNlOworCWludCBpOworCXUzMiByeF9pbnRfdmFyLCB0eF9pbnRfdmFyOworCXUxNiBmaWZvX2luZm87CisKKwlpID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZoYW1hY2hpX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoaSkKKwkJcmV0dXJuIGk7CisKKwlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaGFtYWNoaV9vcGVuKCkgaXJxICVkLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCisJaGFtYWNoaV9pbml0X3JpbmcoZGV2KTsKKworI2lmIEFERFJMRU4gPT0gNjQKKwkvKiB3cml0ZWxsbGwgYW55b25lID8gKi8KKwl3cml0ZWwoY3B1X3RvX2xlNjQoaG1wLT5yeF9yaW5nX2RtYSksIGlvYWRkciArIFJ4UHRyKTsKKwl3cml0ZWwoY3B1X3RvX2xlNjQoaG1wLT5yeF9yaW5nX2RtYSkgPj4gMzIsIGlvYWRkciArIFJ4UHRyICsgNCk7CisJd3JpdGVsKGNwdV90b19sZTY0KGhtcC0+dHhfcmluZ19kbWEpLCBpb2FkZHIgKyBUeFB0cik7CisJd3JpdGVsKGNwdV90b19sZTY0KGhtcC0+dHhfcmluZ19kbWEpID4+IDMyLCBpb2FkZHIgKyBUeFB0ciArIDQpOworI2Vsc2UKKwl3cml0ZWwoY3B1X3RvX2xlMzIoaG1wLT5yeF9yaW5nX2RtYSksIGlvYWRkciArIFJ4UHRyKTsKKwl3cml0ZWwoY3B1X3RvX2xlMzIoaG1wLT50eF9yaW5nX2RtYSksIGlvYWRkciArIFR4UHRyKTsKKyNlbmRpZgorCisJLyogVE9ETzogIEl0IHdvdWxkIG1ha2Ugc2Vuc2UgdG8gb3JnYW5pemUgdGhpcyBhcyB3b3JkcyBzaW5jZSB0aGUgY2FyZCAKKwkgKiBkb2N1bWVudGF0aW9uIGRvZXMuIC1LRFUKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQl3cml0ZWIoZGV2LT5kZXZfYWRkcltpXSwgaW9hZGRyICsgU3RhdGlvbkFkZHIgKyBpKTsKKworCS8qIEluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzOiB3aXRoIHNvIG1hbnkgdGhpcyBldmVudHVhbGx5IHRoaXMgd2lsbAorCSAgIGNvbnZlcnRlZCB0byBhbiBvZmZzZXQvdmFsdWUgbGlzdC4gKi8KKworCS8qIENvbmZpZ3VyZSB0aGUgRklGTyAqLworCWZpZm9faW5mbyA9IChyZWFkdyhpb2FkZHIgKyBHUElPKSAmIDB4MDBDMCkgPj4gNjsKKwlzd2l0Y2ggKGZpZm9faW5mbyl7CisJCWNhc2UgMCA6IAorCQkJLyogTm8gRklGTyAqLworCQkJd3JpdGV3KDB4MDAwMCwgaW9hZGRyICsgRklGT2NmZyk7CisJCQlicmVhazsKKwkJY2FzZSAxIDogCisJCQkvKiBDb25maWd1cmUgdGhlIEZJRk8gZm9yIDUxMksgZXh0ZXJuYWwsIDE2SyB1c2VkIGZvciBUeC4gKi8KKwkJCXdyaXRldygweDAwMjgsIGlvYWRkciArIEZJRk9jZmcpOworCQkJYnJlYWs7CisJCWNhc2UgMiA6IAorCQkJLyogQ29uZmlndXJlIHRoZSBGSUZPIGZvciAxMDI0IGV4dGVybmFsLCAzMksgdXNlZCBmb3IgVHguICovCisJCQl3cml0ZXcoMHgwMDRDLCBpb2FkZHIgKyBGSUZPY2ZnKTsKKwkJCWJyZWFrOworCQljYXNlIDMgOiAKKwkJCS8qIENvbmZpZ3VyZSB0aGUgRklGTyBmb3IgMjA0OCBleHRlcm5hbCwgMzJLIHVzZWQgZm9yIFR4LiAqLworCQkJd3JpdGV3KDB4MDA2QywgaW9hZGRyICsgRklGT2NmZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdCA6IAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICBVbnN1cHBvcnRlZCBleHRlcm5hbCBtZW1vcnkgY29uZmlnIVxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJLyogRGVmYXVsdCB0byBubyBGSUZPICovCisJCQl3cml0ZXcoMHgwMDAwLCBpb2FkZHIgKyBGSUZPY2ZnKTsKKwkJCWJyZWFrOworCX0KKwkKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDApCisJCWRldi0+aWZfcG9ydCA9IGhtcC0+ZGVmYXVsdF9wb3J0OworCisKKwkvKiBTZXR0aW5nIHRoZSBSeCBtb2RlIHdpbGwgc3RhcnQgdGhlIFJ4IHByb2Nlc3MuICovCisJLyogSWYgc29tZW9uZSBkaWRuJ3QgY2hvb3NlIGEgZHVwbGV4LCBkZWZhdWx0IHRvIGZ1bGwtZHVwbGV4ICovIAorCWlmIChobXAtPmR1cGxleF9sb2NrICE9IDEpCisJCWhtcC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKKworCS8qIGFsd2F5cyAxLCB0YWtlcyBubyBtb3JlIHRpbWUgdG8gZG8gaXQgKi8KKwl3cml0ZXcoMHgwMDAxLCBpb2FkZHIgKyBSeENoZWNrc3VtKTsKKyNpZmRlZiBUWF9DSEVDS1NVTQorCXdyaXRldygweDAwMDEsIGlvYWRkciArIFR4Q2hlY2tzdW0pOworI2Vsc2UKKwl3cml0ZXcoMHgwMDAwLCBpb2FkZHIgKyBUeENoZWNrc3VtKTsKKyNlbmRpZgorCXdyaXRldygweDgwMDAsIGlvYWRkciArIE1BQ0NuZmcpOyAvKiBTb2Z0IHJlc2V0IHRoZSBNQUMgKi8KKwl3cml0ZXcoMHgyMTVGLCBpb2FkZHIgKyBNQUNDbmZnKTsKKwl3cml0ZXcoMHgwMDBDLCBpb2FkZHIgKyBGcmFtZUdhcDApOyAKKwkvKiBXSEFUPyE/IT8gIFdoeSBpc24ndCB0aGlzIGRvY3VtZW50ZWQgc29tZXdoZXJlPyAtS0RVICovCisJd3JpdGV3KDB4MTAxOCwgaW9hZGRyICsgRnJhbWVHYXAxKTsKKwkvKiBXaHkgZG8gd2UgZW5hYmxlIHJlY2VpdmVzL3RyYW5zbWl0cyBoZXJlPyAtS0RVICovCisJd3JpdGV3KDB4MDc4MCwgaW9hZGRyICsgTUFDQ25mZzIpOyAvKiBVcHBlciAxNiBiaXRzIGNvbnRyb2wgTEVEcy4gKi8KKwkvKiBFbmFibGUgYXV0b21hdGljIGdlbmVyYXRpb24gb2YgZmxvdyBjb250cm9sIGZyYW1lcywgcGVyaW9kIDB4ZmZmZi4gKi8KKwl3cml0ZWwoMHgwMDMwRkZGRiwgaW9hZGRyICsgRmxvd0N0cmwpOworCXdyaXRldyhNQVhfRlJBTUVfU0laRSwgaW9hZGRyICsgTWF4RnJhbWVTaXplKTsgCS8qIGRldi0+bXR1KzE0ID8/PyAqLworCisJLyogRW5hYmxlIGxlZ2FjeSBsaW5rcy4gKi8KKwl3cml0ZXcoMHgwNDAwLCBpb2FkZHIgKyBBTlhjaG5nQ3RybCk7CS8qIEVuYWJsZSBsZWdhY3kgbGlua3MuICovCisJLyogSW5pdGlhbCBMaW5rIExFRCB0byBibGlua2luZyByZWQuICovCisJd3JpdGViKDB4MDMsIGlvYWRkciArIExFREN0cmwpOworCisJLyogQ29uZmlndXJlIGludGVycnVwdCBtaXRpZ2F0aW9uLiAgVGhpcyBoYXMgYSBncmVhdCBlZmZlY3Qgb24KKwkgICBwZXJmb3JtYW5jZSwgc28gc3lzdGVtcyB0dW5pbmcgc2hvdWxkIHN0YXJ0IGhlcmUhLiAqLworCisJcnhfaW50X3ZhciA9IGhtcC0+cnhfaW50X3ZhcjsKKwl0eF9pbnRfdmFyID0gaG1wLT50eF9pbnRfdmFyOworCisJaWYgKGhhbWFjaGlfZGVidWcgPiAxKSB7CisJCXByaW50aygibWF4X3R4X2xhdGVuY3k6ICVkLCBtYXhfdHhfZ2FwOiAlZCwgbWluX3R4X3BrdDogJWRcbiIsCisJCQl0eF9pbnRfdmFyICYgMHgwMGZmLCAodHhfaW50X3ZhciAmIDB4MDBmZjAwKSA+PiA4LCAKKwkJCSh0eF9pbnRfdmFyICYgMHgwMGZmMDAwMCkgPj4gMTYpOworCQlwcmludGsoIm1heF9yeF9sYXRlbmN5OiAlZCwgbWF4X3J4X2dhcDogJWQsIG1pbl9yeF9wa3Q6ICVkXG4iLAorCQkJcnhfaW50X3ZhciAmIDB4MDBmZiwgKHJ4X2ludF92YXIgJiAweDAwZmYwMCkgPj4gOCwgCisJCQkocnhfaW50X3ZhciAmIDB4MDBmZjAwMDApID4+IDE2KTsKKwkJcHJpbnRrKCJyeF9pbnRfdmFyOiAleCwgdHhfaW50X3ZhcjogJXhcbiIsIHJ4X2ludF92YXIsIHR4X2ludF92YXIpOworCX0KKworCXdyaXRlbCh0eF9pbnRfdmFyLCBpb2FkZHIgKyBUeEludHJDdHJsKTsgCisJd3JpdGVsKHJ4X2ludF92YXIsIGlvYWRkciArIFJ4SW50ckN0cmwpOyAKKworCXNldF9yeF9tb2RlKGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJd3JpdGVsKDB4ODA4Nzg3ODcsIGlvYWRkciArIEludGVycnVwdEVuYWJsZSk7CisJd3JpdGV3KDB4MDAwMCwgaW9hZGRyICsgRXZlbnRTdGF0dXMpOwkvKiBDbGVhciBub24taW50ZXJydXB0aW5nIGV2ZW50cyAqLworCisJLyogQ29uZmlndXJlIGFuZCBzdGFydCB0aGUgRE1BIGNoYW5uZWxzLiAqLworCS8qIEJ1cnN0IHNpemVzIGFyZSBpbiB0aGUgbG93IHRocmVlIGJpdHM6IHNpemUgPSA0PDwodmFsJjcpICovCisjaWYgQUREUkxFTiA9PSA2NAorCXdyaXRldygweDAwNUQsIGlvYWRkciArIFJ4RE1BQ3RybCk7IAkJLyogMTI4IGR3b3JkIGJ1cnN0cyAqLworCXdyaXRldygweDAwNUQsIGlvYWRkciArIFR4RE1BQ3RybCk7CisjZWxzZQorCXdyaXRldygweDAwMUQsIGlvYWRkciArIFJ4RE1BQ3RybCk7CisJd3JpdGV3KDB4MDAxRCwgaW9hZGRyICsgVHhETUFDdHJsKTsKKyNlbmRpZgorCXdyaXRldygweDAwMDEsIGlvYWRkciArIFJ4Q21kKTsKKworCWlmIChoYW1hY2hpX2RlYnVnID4gMikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgaGFtYWNoaV9vcGVuKCksIHN0YXR1czogUnggJXggVHggJXguXG4iLAorCQkJICAgZGV2LT5uYW1lLCByZWFkdyhpb2FkZHIgKyBSeFN0YXR1cyksIHJlYWR3KGlvYWRkciArIFR4U3RhdHVzKSk7CisJfQorCS8qIFNldCB0aGUgdGltZXIgdG8gY2hlY2sgZm9yIGxpbmsgYmVhdC4gKi8KKwlpbml0X3RpbWVyKCZobXAtPnRpbWVyKTsKKwlobXAtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQoKDI0KkhaKS8xMCk7CQkJLyogMi40IHNlYy4gKi8KKwlobXAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJaG1wLT50aW1lci5mdW5jdGlvbiA9ICZoYW1hY2hpX3RpbWVyOwkJCQkvKiB0aW1lciBoYW5kbGVyICovCisJYWRkX3RpbWVyKCZobXAtPnRpbWVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBoYW1hY2hpX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqaG1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIFVwZGF0ZSB0aGUgZGlydHkgcG9pbnRlciB1bnRpbCB3ZSBmaW5kIGFuIGVudHJ5IHRoYXQgaXMKKwkJc3RpbGwgb3duZWQgYnkgdGhlIGNhcmQgKi8KKwlmb3IgKDsgaG1wLT5jdXJfdHggLSBobXAtPmRpcnR5X3R4ID4gMDsgaG1wLT5kaXJ0eV90eCsrKSB7CisJCWludCBlbnRyeSA9IGhtcC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJaWYgKGhtcC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzX25fbGVuZ3RoICYgY3B1X3RvX2xlMzIoRGVzY093bikpIAorCQkJYnJlYWs7CisJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KKwkJc2tiID0gaG1wLT50eF9za2J1ZmZbZW50cnldOworCQlpZiAoc2tiICE9IDApIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoaG1wLT5wY2lfZGV2LCAKKwkJCQlobXAtPnR4X3JpbmdbZW50cnldLmFkZHIsIHNrYi0+bGVuLCAKKwkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWhtcC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCX0KKwkJaG1wLT50eF9yaW5nW2VudHJ5XS5zdGF0dXNfbl9sZW5ndGggPSAwOworCQlpZiAoZW50cnkgPj0gVFhfUklOR19TSVpFLTEpIAorCQkJaG1wLT50eF9yaW5nW1RYX1JJTkdfU0laRS0xXS5zdGF0dXNfbl9sZW5ndGggfD0KKwkJCQljcHVfdG9fbGUzMihEZXNjRW5kUmluZyk7ICAgCisJCWhtcC0+c3RhdHMudHhfcGFja2V0cysrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoYW1hY2hpX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgaGFtYWNoaV9wcml2YXRlICpobXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gaG1wLT5iYXNlOworCWludCBuZXh0X3RpY2sgPSAxMCpIWjsKKworCWlmIChoYW1hY2hpX2RlYnVnID4gMikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogSGFtYWNoaSBBdXRvbmVnb3RpYXRpb24gc3RhdHVzICU0LjR4LCBMUEEgIgorCQkJICAgIiU0LjR4LlxuIiwgZGV2LT5uYW1lLCByZWFkdyhpb2FkZHIgKyBBTlN0YXR1cyksCisJCQkgICByZWFkdyhpb2FkZHIgKyBBTkxpbmtQYXJ0bmVyQWJpbGl0eSkpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogQXV0b25lZ290aWF0aW9uIHJlZ3MgJTQuNHggJTQuNHggJTQuNHggIgorCQkgICAgICAgIiU0LjR4ICU0LjR4ICU0LjR4LlxuIiwgZGV2LT5uYW1lLAorCQkgICAgICAgcmVhZHcoaW9hZGRyICsgMHgwZTApLAorCQkgICAgICAgcmVhZHcoaW9hZGRyICsgMHgwZTIpLAorCQkgICAgICAgcmVhZHcoaW9hZGRyICsgMHgwZTQpLAorCQkgICAgICAgcmVhZHcoaW9hZGRyICsgMHgwZTYpLAorCQkgICAgICAgcmVhZHcoaW9hZGRyICsgMHgwZTgpLAorCQkgICAgICAgcmVhZHcoaW9hZGRyICsgMHgwZUEpKTsKKwl9CisJLyogV2UgY291bGQgZG8gc29tZXRoaW5nIGhlcmUuLi4gbmFoLiAqLworCWhtcC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVChuZXh0X3RpY2spOworCWFkZF90aW1lcigmaG1wLT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIGhhbWFjaGlfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKmhtcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBobXAtPmJhc2U7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSGFtYWNoaSB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlOC44eCwiCisJCSAgICIgcmVzZXR0aW5nLi4uXG4iLCBkZXYtPm5hbWUsIChpbnQpcmVhZHcoaW9hZGRyICsgVHhTdGF0dXMpKTsKKworCXsKKwkJaW50IGk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgIFJ4IHJpbmcgJXA6ICIsIGhtcC0+cnhfcmluZyk7CisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykKKwkJCXByaW50aygiICU4Ljh4IiwgKHVuc2lnbmVkIGludClobXAtPnJ4X3JpbmdbaV0uc3RhdHVzX25fbGVuZ3RoKTsKKwkJcHJpbnRrKCJcbiJLRVJOX0RFQlVHIiAgVHggcmluZyAlcDogIiwgaG1wLT50eF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKCIgJTQuNHgiLCBobXAtPnR4X3JpbmdbaV0uc3RhdHVzX25fbGVuZ3RoKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKworCS8qIFJlaW5pdCB0aGUgaGFyZHdhcmUgYW5kIG1ha2Ugc3VyZSB0aGUgUnggYW5kIFR4IHByb2Nlc3NlcyAKKwkJYXJlIHVwIGFuZCBydW5uaW5nLgorCSAqLworCWRldi0+aWZfcG9ydCA9IDA7CisJLyogVGhlIHJpZ2h0IHdheSB0byBkbyBSZXNldC4gLUtEVQorCSAqCQktQ2xlYXIgT1dOIGJpdCBpbiBhbGwgUngvVHggZGVzY3JpcHRvcnMKKwkgKgkJLVdhaXQgNTAgdVMgZm9yIGNoYW5uZWxzIHRvIGdvIGlkbGUKKwkgKgkJLVR1cm4gb2ZmIE1BQyByZWNlaXZlcgorCSAqCQktSXNzdWUgUmVzZXQKKwkgKi8KKwkKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCWhtcC0+cnhfcmluZ1tpXS5zdGF0dXNfbl9sZW5ndGggJj0gY3B1X3RvX2xlMzIofkRlc2NPd24pOworCisJLyogUHJlc3VtZSB0aGF0IGFsbCBwYWNrZXRzIGluIHRoZSBUeCBxdWV1ZSBhcmUgZ29uZSBpZiB3ZSBoYXZlIHRvCisJICogcmUtaW5pdCB0aGUgaGFyZHdhcmUuCisJICovCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKXsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlpZiAoaSA+PSBUWF9SSU5HX1NJWkUgLSAxKQorCQkJaG1wLT50eF9yaW5nW2ldLnN0YXR1c19uX2xlbmd0aCA9IGNwdV90b19sZTMyKAorCQkJCURlc2NFbmRSaW5nIHwKKwkJCQkoaG1wLT50eF9yaW5nW2ldLnN0YXR1c19uX2xlbmd0aCAmIDB4MDAwMEZGRkYpKTsKKwkJZWxzZQkKKwkJCWhtcC0+dHhfcmluZ1tpXS5zdGF0dXNfbl9sZW5ndGggJj0gMHgwMDAwZmZmZjsKKwkJc2tiID0gaG1wLT50eF9za2J1ZmZbaV07CisJCWlmIChza2IpeworCQkJcGNpX3VubWFwX3NpbmdsZShobXAtPnBjaV9kZXYsIGhtcC0+dHhfcmluZ1tpXS5hZGRyLCAKKwkJCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlobXAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCX0KKwl9CisKKwl1ZGVsYXkoNjApOyAvKiBTbGVlcCA2MCB1cyBqdXN0IGZvciBzYWZldHkgc2FrZSAqLworCXdyaXRldygweDAwMDIsIGlvYWRkciArIFJ4Q21kKTsgLyogU1RPUCBSeCAqLworCQkKKwl3cml0ZWIoMHgwMSwgaW9hZGRyICsgQ2hpcFJlc2V0KTsgIC8qIFJlaW5pdCB0aGUgaGFyZHdhcmUgKi8gCisKKwlobXAtPnR4X2Z1bGwgPSAwOworCWhtcC0+Y3VyX3J4ID0gaG1wLT5jdXJfdHggPSAwOworCWhtcC0+ZGlydHlfcnggPSBobXAtPmRpcnR5X3R4ID0gMDsKKwkvKiBSeCBwYWNrZXRzIGFyZSBhbHNvIHByZXN1bWVkIGxvc3Q7IGhvd2V2ZXIsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGEKKwkgKiByaW5nIG9mIGJ1ZmZlcnMgaXMgaW4gdGFjdC4gLUtEVQorCSAqLyAKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gaG1wLT5yeF9za2J1ZmZbaV07CisKKwkJaWYgKHNrYil7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGhtcC0+cGNpX2RldiwgaG1wLT5yeF9yaW5nW2ldLmFkZHIsIAorCQkJCWhtcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJaG1wLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorCS8qIEZpbGwgaW4gdGhlIFJ4IGJ1ZmZlcnMuICBIYW5kbGUgYWxsb2NhdGlvbiBmYWlsdXJlIGdyYWNlZnVsbHkuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKGhtcC0+cnhfYnVmX3N6KTsKKwkJaG1wLT5yeF9za2J1ZmZbaV0gPSBza2I7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlza2ItPmRldiA9IGRldjsgICAgICAgICAvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlci4gKi8KKyAgICAgICAgICAgICAgICBobXAtPnJ4X3JpbmdbaV0uYWRkciA9IGNwdV90b19sZVhYKHBjaV9tYXBfc2luZ2xlKGhtcC0+cGNpX2RldiwgCisJCQlza2ItPnRhaWwsIGhtcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJaG1wLT5yeF9yaW5nW2ldLnN0YXR1c19uX2xlbmd0aCA9IGNwdV90b19sZTMyKERlc2NPd24gfCAKKwkJCURlc2NFbmRQYWNrZXQgfCBEZXNjSW50ciB8IChobXAtPnJ4X2J1Zl9zeiAtIDIpKTsKKwl9CisJaG1wLT5kaXJ0eV9yeCA9ICh1bnNpZ25lZCBpbnQpKGkgLSBSWF9SSU5HX1NJWkUpOworCS8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcuICovCisJaG1wLT5yeF9yaW5nW1JYX1JJTkdfU0laRS0xXS5zdGF0dXNfbl9sZW5ndGggfD0gY3B1X3RvX2xlMzIoRGVzY0VuZFJpbmcpOworCisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWhtcC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkvKiBSZXN0YXJ0IHRoZSBjaGlwJ3MgVHgvUnggcHJvY2Vzc2VzIC4gKi8KKwl3cml0ZXcoMHgwMDAyLCBpb2FkZHIgKyBUeENtZCk7IC8qIFNUT1AgVHggKi8KKwl3cml0ZXcoMHgwMDAxLCBpb2FkZHIgKyBUeENtZCk7IC8qIFNUQVJUIFR4ICovCisJd3JpdGV3KDB4MDAwMSwgaW9hZGRyICsgUnhDbWQpOyAvKiBTVEFSVCBSeCAqLworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisKKy8qIEluaXRpYWxpemUgdGhlIFJ4IGFuZCBUeCByaW5ncywgYWxvbmcgd2l0aCB2YXJpb3VzICdkZXYnIGJpdHMuICovCitzdGF0aWMgdm9pZCBoYW1hY2hpX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKmhtcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlobXAtPnR4X2Z1bGwgPSAwOworCWhtcC0+Y3VyX3J4ID0gaG1wLT5jdXJfdHggPSAwOworCWhtcC0+ZGlydHlfcnggPSBobXAtPmRpcnR5X3R4ID0gMDsKKworI2lmIDAKKwkvKiBUaGlzIGlzIHdyb25nLiAgSSdtIG5vdCBzdXJlIHdoYXQgdGhlIG9yaWdpbmFsIHBsYW4gd2FzLCBidXQgdGhpcworCSAqIGlzIHdyb25nLiAgQW4gTVRVIG9mIDEgZ2V0cyB5b3UgYSBidWZmZXIgb2YgMTUzNiwgd2hpbGUgYW4gTVRVCisJICogb2YgMTUwMSBnZXRzIGEgYnVmZmVyIG9mIDE1MzM/IC1LRFUKKwkgKi8KKwlobXAtPnJ4X2J1Zl9zeiA9IChkZXYtPm10dSA8PSAxNTAwID8gUEtUX0JVRl9TWiA6IGRldi0+bXR1ICsgMzIpOworI2VuZGlmCisJLyogTXkgYXR0ZW1wdCBhdCBhIHJlYXNvbmFibGUgY29ycmVjdGlvbiAqLworCS8qICsyNiBnZXRzIHRoZSBtYXhpbXVtIGV0aGVybmV0IGVuY2Fwc3VsYXRpb24sICs3ICYgfjcgYmVjYXVzZSB0aGUKKwkgKiBjYXJkIG5lZWRzIHJvb20gdG8gZG8gOCBieXRlIGFsaWdubWVudCwgKzIgc28gd2UgY2FuIHJlc2VydmUgCisJICogdGhlIGZpcnN0IDIgYnl0ZXMsIGFuZCArMTYgZ2V0cyByb29tIGZvciB0aGUgc3RhdHVzIHdvcmQgZnJvbSB0aGUgCisJICogY2FyZC4gIC1LRFUKKwkgKi8KKwlobXAtPnJ4X2J1Zl9zeiA9IChkZXYtPm10dSA8PSAxNDkyID8gUEtUX0JVRl9TWiA6IAorCQkoKChkZXYtPm10dSsyNis3KSAmIH43KSArIDIgKyAxNikpOworCisJLyogSW5pdGlhbGl6ZSBhbGwgUnggZGVzY3JpcHRvcnMuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCWhtcC0+cnhfcmluZ1tpXS5zdGF0dXNfbl9sZW5ndGggPSAwOworCQlobXAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJfQorCS8qIEZpbGwgaW4gdGhlIFJ4IGJ1ZmZlcnMuICBIYW5kbGUgYWxsb2NhdGlvbiBmYWlsdXJlIGdyYWNlZnVsbHkuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKGhtcC0+cnhfYnVmX3N6KTsKKwkJaG1wLT5yeF9za2J1ZmZbaV0gPSBza2I7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlza2ItPmRldiA9IGRldjsgICAgICAgICAvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlci4gKi8KKyAgICAgICAgICAgICAgICBobXAtPnJ4X3JpbmdbaV0uYWRkciA9IGNwdV90b19sZVhYKHBjaV9tYXBfc2luZ2xlKGhtcC0+cGNpX2RldiwgCisJCQlza2ItPnRhaWwsIGhtcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJLyogLTIgYmVjYXVzZSBpdCBkb2Vzbid0IFJFQUxMWSBoYXZlIHRoYXQgZmlyc3QgMiBieXRlcyAtS0RVICovCisJCWhtcC0+cnhfcmluZ1tpXS5zdGF0dXNfbl9sZW5ndGggPSBjcHVfdG9fbGUzMihEZXNjT3duIHwgCisJCQlEZXNjRW5kUGFja2V0IHwgRGVzY0ludHIgfCAoaG1wLT5yeF9idWZfc3ogLTIpKTsKKwl9CisJaG1wLT5kaXJ0eV9yeCA9ICh1bnNpZ25lZCBpbnQpKGkgLSBSWF9SSU5HX1NJWkUpOworCWhtcC0+cnhfcmluZ1tSWF9SSU5HX1NJWkUtMV0uc3RhdHVzX25fbGVuZ3RoIHw9IGNwdV90b19sZTMyKERlc2NFbmRSaW5nKTsKKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlobXAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCWhtcC0+dHhfcmluZ1tpXS5zdGF0dXNfbl9sZW5ndGggPSAwOworCX0KKwkvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IG9mIHRoZSByaW5nICovCisJaG1wLT50eF9yaW5nW1RYX1JJTkdfU0laRS0xXS5zdGF0dXNfbl9sZW5ndGggfD0gY3B1X3RvX2xlMzIoRGVzY0VuZFJpbmcpOworCisJcmV0dXJuOworfQorCisKKyNpZmRlZiBUWF9DSEVDS1NVTQorI2RlZmluZSBjc3VtX2FkZChpdCwgdmFsKSBcCitkbyB7IFwKKyAgICBpdCArPSAodTE2KSAodmFsKTsgXAorICAgIGlmIChpdCAmIDB4ZmZmZjAwMDApIHsgXAorCWl0ICY9IDB4ZmZmZjsgXAorCSsraXQ7IFwKKyAgICB9IFwKK30gd2hpbGUgKDApCisgICAgLyogcHJpbnRrKCJhZGQgJTA0eCAtLT4gJTA0eFxuIiwgdmFsLCBpdCk7IFwgKi8KKworLyogdWgtPmxlbiBhbHJlYWR5IG5ldHdvcmsgZm9ybWF0LCBkbyBub3Qgc3dhcCAqLworI2RlZmluZSBwc2V1ZG9fY3N1bV91ZHAoc3VtLGloLHVoKSBkbyB7IFwKKyAgICBzdW0gPSAwOyBcCisgICAgY3N1bV9hZGQoc3VtLCAoaWgpLT5zYWRkciA+PiAxNik7IFwKKyAgICBjc3VtX2FkZChzdW0sIChpaCktPnNhZGRyICYgMHhmZmZmKTsgXAorICAgIGNzdW1fYWRkKHN1bSwgKGloKS0+ZGFkZHIgPj4gMTYpOyBcCisgICAgY3N1bV9hZGQoc3VtLCAoaWgpLT5kYWRkciAmIDB4ZmZmZik7IFwKKyAgICBjc3VtX2FkZChzdW0sIF9fY29uc3RhbnRfaHRvbnMoSVBQUk9UT19VRFApKTsgXAorICAgIGNzdW1fYWRkKHN1bSwgKHVoKS0+bGVuKTsgXAorfSB3aGlsZSAoMCkKKworLyogc3dhcCBsZW4gKi8KKyNkZWZpbmUgcHNldWRvX2NzdW1fdGNwKHN1bSxpaCxsZW4pIGRvIHsgXAorICAgIHN1bSA9IDA7IFwKKyAgICBjc3VtX2FkZChzdW0sIChpaCktPnNhZGRyID4+IDE2KTsgXAorICAgIGNzdW1fYWRkKHN1bSwgKGloKS0+c2FkZHIgJiAweGZmZmYpOyBcCisgICAgY3N1bV9hZGQoc3VtLCAoaWgpLT5kYWRkciA+PiAxNik7IFwKKyAgICBjc3VtX2FkZChzdW0sIChpaCktPmRhZGRyICYgMHhmZmZmKTsgXAorICAgIGNzdW1fYWRkKHN1bSwgX19jb25zdGFudF9odG9ucyhJUFBST1RPX1RDUCkpOyBcCisgICAgY3N1bV9hZGQoc3VtLCBodG9ucyhsZW4pKTsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgaW50IGhhbWFjaGlfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKmhtcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgZW50cnk7CisJdTE2IHN0YXR1czsKKworCS8qIE9rLCBub3cgbWFrZSBzdXJlIHRoYXQgdGhlIHF1ZXVlIGhhcyBzcGFjZSBiZWZvcmUgdHJ5aW5nIHRvIAorCQlhZGQgYW5vdGhlciBza2J1ZmYuICBpZiB3ZSByZXR1cm4gbm9uLXplcm8gdGhlIHNjaGVkdWxlcgorCQlzaG91bGQgaW50ZXJwcmV0IHRoaXMgYXMgYSBxdWV1ZSBmdWxsIGFuZCByZXF1ZXVlIHRoZSBidWZmZXIKKwkJZm9yIGxhdGVyLgorCSAqLworCWlmIChobXAtPnR4X2Z1bGwpIHsKKwkJLyogV2Ugc2hvdWxkIE5FVkVSIHJlYWNoIHRoaXMgcG9pbnQgLUtEVSAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSGFtYWNoaSB0cmFuc21pdCBxdWV1ZSBmdWxsIGF0IHNsb3QgJWQuXG4iLGRldi0+bmFtZSwgaG1wLT5jdXJfdHgpOworCisJCS8qIFdha2UgdGhlIHBvdGVudGlhbGx5LWlkbGUgdHJhbnNtaXQgY2hhbm5lbC4gKi8KKwkJLyogSWYgd2UgZG9uJ3QgbmVlZCB0byByZWFkIHN0YXR1cywgRE9OJ1QgLUtEVSAqLworCQlzdGF0dXM9cmVhZHcoaG1wLT5iYXNlICsgVHhTdGF0dXMpOworCQlpZiggIShzdGF0dXMgJiAweDAwMDEpIHx8IChzdGF0dXMgJiAweDAwMDIpKQorCQkJd3JpdGV3KDB4MDAwMSwgaG1wLT5iYXNlICsgVHhDbWQpOworCQlyZXR1cm4gMTsKKwl9IAorCisJLyogQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLCBzZXQgdGhlIGZpZWxkCisJICAgd2l0aCB0aGUgIm93bmVyc2hpcCIgYml0cyBsYXN0LiAqLworCisJLyogQ2FsY3VsYXRlIHRoZSBuZXh0IFR4IGRlc2NyaXB0b3IgZW50cnkuICovCisJZW50cnkgPSBobXAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworCWhtcC0+dHhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKworI2lmZGVmIFRYX0NIRUNLU1VNCisJeworCSAgICAvKiB0YWNrIG9uIGNoZWNrc3VtIHRhZyAqLworCSAgICB1MzIgdGFndmFsID0gMDsKKwkgICAgc3RydWN0IGV0aGhkciAqZWggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKKwkgICAgaWYgKGVoLT5oX3Byb3RvID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApKSB7CisJCXN0cnVjdCBpcGhkciAqaWggPSAoc3RydWN0IGlwaGRyICopKChjaGFyICopZWggKyBFVEhfSExFTik7CisJCWlmIChpaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKKwkJICAgIHN0cnVjdCB1ZHBoZHIgKnVoCisJCSAgICAgID0gKHN0cnVjdCB1ZHBoZHIgKikoKGNoYXIgKilpaCArIGloLT5paGwqNCk7CisJCSAgICB1MzIgb2Zmc2V0ID0gKCh1bnNpZ25lZCBjaGFyICopdWggKyA2KSAtIHNrYi0+ZGF0YTsKKwkJICAgIHUzMiBwc2V1ZG87CisJCSAgICBwc2V1ZG9fY3N1bV91ZHAocHNldWRvLCBpaCwgdWgpOworCQkgICAgcHNldWRvID0gaHRvbnMocHNldWRvKTsKKwkJICAgIHByaW50aygidWRwIGNrc3VtIHdhcyAlMDR4LCBzZW5kaW5nIHBzZXVkbyAlMDR4XG4iLAorCQkgICAgICB1aC0+Y2hlY2ssIHBzZXVkbyk7CisJCSAgICB1aC0+Y2hlY2sgPSAwOyAgLyogemVybyBvdXQgdWgtPmNoZWNrIGJlZm9yZSBjYXJkIGNhbGMgKi8KKwkJICAgIC8qCisJCSAgICAgKiBzdGFydCBhdCAxNCAoc2tpcCBldGhoZHIpLCBzdG9yZSBhdCBvZmZzZXQgKHVoLT5jaGVjayksCisJCSAgICAgKiB1c2UgcHNldWRvIHZhbHVlIGdpdmVuLgorCQkgICAgICovCisJCSAgICB0YWd2YWwgPSAoMTQgPDwgMjQpIHwgKG9mZnNldCA8PCAxNikgfCBwc2V1ZG87CisJCX0gZWxzZSBpZiAoaWgtPnByb3RvY29sID09IElQUFJPVE9fVENQKSB7CisJCSAgICBwcmludGsoInRjcCwgbm8gYXV0byBja3N1bVxuIik7CisJCX0KKwkgICAgfQorCSAgICAqKHUzMiAqKXNrYl9wdXNoKHNrYiwgOCkgPSB0YWd2YWw7CisJfQorI2VuZGlmCisKKyAgICAgICAgaG1wLT50eF9yaW5nW2VudHJ5XS5hZGRyID0gY3B1X3RvX2xlWFgocGNpX21hcF9zaW5nbGUoaG1wLT5wY2lfZGV2LCAKKwkJc2tiLT5kYXRhLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSkpOworICAgIAorCS8qIEhtbW1tLCBjb3VsZCBwcm9iYWJseSBwdXQgYSBEZXNjSW50ciBvbiB0aGVzZSwgYnV0IHRoZSB3YXkKKwkJdGhlIGRyaXZlciBpcyBjdXJyZW50bHkgY29kZWQgbWFrZXMgVHggaW50ZXJydXB0cyB1bm5lY2Vzc2FyeQorCQlzaW5jZSB0aGUgY2xlYXJpbmcgb2YgdGhlIFR4IHJpbmcgaXMgaGFuZGxlZCBieSB0aGUgc3RhcnRfeG1pdAorCQlyb3V0aW5lLiAgVGhpcyBvcmdhbml6YXRpb24gaGVscHMgbWl0aWdhdGUgdGhlIGludGVycnVwdHMgYQorCQliaXQgYW5kIHByb2JhYmx5IHJlbmRlcnMgdGhlIG1heF90eF9sYXRlbmN5IHBhcmFtIHVzZWxlc3MuCisJCQorCQlVcGRhdGU6IFB1dHRpbmcgYSBEZXNjSW50ciBiaXQgb24gYWxsIG9mIHRoZSBkZXNjcmlwdG9ycyBhbmQKKwkJbWl0aWdhdGluZyBpbnRlcnJ1cHQgZnJlcXVlbmN5IHdpdGggdGhlIHR4X21pbl9wa3QgcGFyYW1ldGVyLiAtS0RVCisJKi8KKwlpZiAoZW50cnkgPj0gVFhfUklOR19TSVpFLTEpCQkgLyogV3JhcCByaW5nICovCisJCWhtcC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzX25fbGVuZ3RoID0gY3B1X3RvX2xlMzIoRGVzY093biB8CisJCQlEZXNjRW5kUGFja2V0IHwgRGVzY0VuZFJpbmcgfCBEZXNjSW50ciB8IHNrYi0+bGVuKTsKKwllbHNlCisJCWhtcC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzX25fbGVuZ3RoID0gY3B1X3RvX2xlMzIoRGVzY093biB8CisJCQlEZXNjRW5kUGFja2V0IHwgRGVzY0ludHIgfCBza2ItPmxlbik7CisJaG1wLT5jdXJfdHgrKzsKKworCS8qIE5vbi14ODYgVG9kbzogZXhwbGljaXRseSBmbHVzaCBjYWNoZSBsaW5lcyBoZXJlLiAqLworCisJLyogV2FrZSB0aGUgcG90ZW50aWFsbHktaWRsZSB0cmFuc21pdCBjaGFubmVsLiAqLworCS8qIElmIHdlIGRvbid0IG5lZWQgdG8gcmVhZCBzdGF0dXMsIERPTidUIC1LRFUgKi8KKwlzdGF0dXM9cmVhZHcoaG1wLT5iYXNlICsgVHhTdGF0dXMpOworCWlmKCAhKHN0YXR1cyAmIDB4MDAwMSkgfHwgKHN0YXR1cyAmIDB4MDAwMikpCisJCXdyaXRldygweDAwMDEsIGhtcC0+YmFzZSArIFR4Q21kKTsKKworCS8qIEltbWVkaWF0ZWx5IGJlZm9yZSByZXR1cm5pbmcsIGxldCdzIGNsZWFyIGFzIG1hbnkgZW50cmllcyBhcyB3ZSBjYW4uICovCisJaGFtYWNoaV90eChkZXYpOworCisJLyogV2Ugc2hvdWxkIGtpY2sgdGhlIGJvdHRvbSBoYWxmIGhlcmUsIHNpbmNlIHdlIGFyZSBub3QgYWNjZXB0aW5nCisJICogaW50ZXJydXB0cyB3aXRoIGV2ZXJ5IHBhY2tldC4gIGkuZS4gcmVhbGl6ZSB0aGF0IEdpZ2FiaXQgZXRoZXJuZXQKKwkgKiBjYW4gdHJhbnNtaXQgZmFzdGVyIHRoYW4gb3JkaW5hcnkgbWFjaGluZXMgY2FuIGxvYWQgcGFja2V0czsKKwkgKiBoZW5jZSwgYW55IHBhY2tldCB0aGF0IGdvdCBwdXQgb2ZmIGJlY2F1c2Ugd2Ugd2VyZSBpbiB0aGUgdHJhbnNtaXQKKwkgKiByb3V0aW5lIHNob3VsZCBJTU1FRElBVEVMWSBnZXQgYSBjaGFuY2UgdG8gYmUgcmUtcXVldWVkLiAtS0RVCisJICovCisJaWYgKChobXAtPmN1cl90eCAtIGhtcC0+ZGlydHlfdHgpIDwgKFRYX1JJTkdfU0laRSAtIDQpKSAKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOyAgLyogVHlwaWNhbCBwYXRoICovCisJZWxzZSB7CisJCWhtcC0+dHhfZnVsbCA9IDE7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl9CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBIYW1hY2hpIHRyYW5zbWl0IGZyYW1lICMlZCBxdWV1ZWQgaW4gc2xvdCAlZC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGhtcC0+Y3VyX3R4LCBlbnRyeSk7CisJfQorCXJldHVybiAwOworfQorCisvKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhbGwgb2YgdGhlIFJ4IHRocmVhZCB3b3JrIGFuZCBjbGVhbnMgdXAKKyAgIGFmdGVyIHRoZSBUeCB0aHJlYWQuICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaGFtYWNoaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqaG1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGhtcC0+YmFzZTsKKwlsb25nIGJvZ3VzY250ID0gbWF4X2ludGVycnVwdF93b3JrOworCWludCBoYW5kbGVkID0gMDsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCQkJLyogQ2FuIG5ldmVyIG9jY3VyLiAqLworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsgKEtFUk5fRVJSICJoYW1hY2hpX2ludGVycnVwdCgpOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKyNlbmRpZgorCisJc3Bpbl9sb2NrKCZobXAtPmxvY2spOworCisJZG8geworCQl1MzIgaW50cl9zdGF0dXMgPSByZWFkbChpb2FkZHIgKyBJbnRlcnJ1cHRDbGVhcik7CisKKwkJaWYgKGhhbWFjaGlfZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBIYW1hY2hpIGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKworCQlpZiAoaW50cl9zdGF0dXMgPT0gMCkKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisJCWlmIChpbnRyX3N0YXR1cyAmIEludHJSeERvbmUpCisJCQloYW1hY2hpX3J4KGRldik7CisKKwkJaWYgKGludHJfc3RhdHVzICYgSW50clR4RG9uZSl7CisJCQkvKiBUaGlzIGNvZGUgc2hvdWxkIFJBUkVMWSBuZWVkIHRvIGV4ZWN1dGUuIEFmdGVyIGFsbCwgdGhpcyBpcworCQkJICogYSBnaWdhYml0IGxpbmssIGl0IHNob3VsZCBjb25zdW1lIHBhY2tldHMgYXMgZmFzdCBhcyB3ZSBwdXQKKwkJCSAqIHRoZW0gaW4gQU5EIHdlIGNsZWFyIHRoZSBUeCByaW5nIGluIGhhbWFjaGlfc3RhcnRfeG1pdCgpLgorCQkJICovIAorCQkJaWYgKGhtcC0+dHhfZnVsbCl7CisJCQkJZm9yICg7IGhtcC0+Y3VyX3R4IC0gaG1wLT5kaXJ0eV90eCA+IDA7IGhtcC0+ZGlydHlfdHgrKyl7CisJCQkJCWludCBlbnRyeSA9IGhtcC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CisJCQkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCQkJaWYgKGhtcC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzX25fbGVuZ3RoICYgY3B1X3RvX2xlMzIoRGVzY093bikpIAorCQkJCQkJYnJlYWs7CisJCQkJCXNrYiA9IGhtcC0+dHhfc2tidWZmW2VudHJ5XTsKKwkJCQkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQkJCQlpZiAoc2tiKXsKKwkJCQkJCXBjaV91bm1hcF9zaW5nbGUoaG1wLT5wY2lfZGV2LCAKKwkJCQkJCQlobXAtPnR4X3JpbmdbZW50cnldLmFkZHIsIAorCQkJCQkJCXNrYi0+bGVuLAorCQkJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCQkJCWhtcC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQkJCX0KKwkJCQkJaG1wLT50eF9yaW5nW2VudHJ5XS5zdGF0dXNfbl9sZW5ndGggPSAwOworCQkJCQlpZiAoZW50cnkgPj0gVFhfUklOR19TSVpFLTEpICAKKwkJCQkJCWhtcC0+dHhfcmluZ1tUWF9SSU5HX1NJWkUtMV0uc3RhdHVzX25fbGVuZ3RoIHw9IAorCQkJCQkJCWNwdV90b19sZTMyKERlc2NFbmRSaW5nKTsKKwkJCQkJaG1wLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJfQorCQkJCWlmIChobXAtPmN1cl90eCAtIGhtcC0+ZGlydHlfdHggPCBUWF9SSU5HX1NJWkUgLSA0KXsKKwkJCQkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwgKi8KKwkJCQkJaG1wLT50eF9mdWxsID0gMDsKKwkJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJfQorCQl9CisKKworCQkvKiBBYm5vcm1hbCBlcnJvciBzdW1tYXJ5L3VuY29tbW9uIGV2ZW50cyBoYW5kbGVycy4gKi8KKwkJaWYgKGludHJfc3RhdHVzICYKKwkJCShJbnRyVHhQQ0lGYXVsdCB8IEludHJUeFBDSUVyciB8IEludHJSeFBDSUZhdWx0IHwgSW50clJ4UENJRXJyIHwKKwkJCSBMaW5rQ2hhbmdlIHwgTmVnb3RpYXRpb25DaGFuZ2UgfCBTdGF0c01heCkpCisJCQloYW1hY2hpX2Vycm9yKGRldiwgaW50cl9zdGF0dXMpOworCisJCWlmICgtLWJvZ3VzY250IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtdWNoIHdvcmsgYXQgaW50ZXJydXB0LCBzdGF0dXM9MHglNC40eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDEpOworCisJaWYgKGhhbWFjaGlfZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBzdGF0dXM9JSM0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgcmVhZGwoaW9hZGRyICsgSW50clN0YXR1cykpOworCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkvKiBDb2RlIHRoYXQgc2hvdWxkIG5ldmVyIGJlIHJ1biEgIFBlcmhhcHMgcmVtb3ZlIGFmdGVyIHRlc3RpbmcuLiAqLworCXsKKwkJc3RhdGljIGludCBzdG9waXQgPSAxMDsKKwkJaWYgKGRldi0+c3RhcnQgPT0gMCAgJiYgIC0tc3RvcGl0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRW1lcmdlbmN5IHN0b3AsIGxvb3Bpbmcgc3RhcnR1cCBpbnRlcnJ1cHQuXG4iLAorCQkJCSAgIGRldi0+bmFtZSk7CisJCQlmcmVlX2lycShpcnEsIGRldik7CisJCX0KKwl9CisjZW5kaWYKKworCXNwaW5fdW5sb2NrKCZobXAtPmxvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgbG9naWNhbGx5IHBhcnQgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyLCBidXQgc2VwYXJhdGVkCisgICBmb3IgY2xhcml0eSBhbmQgYmV0dGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uICovCitzdGF0aWMgaW50IGhhbWFjaGlfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGFtYWNoaV9wcml2YXRlICpobXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeSA9IGhtcC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCWludCBib2d1c2NudCA9IChobXAtPmRpcnR5X3J4ICsgUlhfUklOR19TSVpFKSAtIGhtcC0+Y3VyX3J4OworCisJaWYgKGhhbWFjaGlfZGVidWcgPiA0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIgSW4gaGFtYWNoaV9yeCgpLCBlbnRyeSAlZCBzdGF0dXMgJTQuNHguXG4iLAorCQkJICAgZW50cnksIGhtcC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzX25fbGVuZ3RoKTsKKwl9CisKKwkvKiBJZiBFT1AgaXMgc2V0IG9uIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgaGFtYWNoaV9kZXNjICpkZXNjID0gJihobXAtPnJ4X3JpbmdbZW50cnldKTsKKwkJdTMyIGRlc2Nfc3RhdHVzID0gbGUzMl90b19jcHUoZGVzYy0+c3RhdHVzX25fbGVuZ3RoKTsKKwkJdTE2IGRhdGFfc2l6ZSA9IGRlc2Nfc3RhdHVzOwkvKiBJbXBsaWNpdCB0cnVuY2F0ZSAqLworCQl1OCAqYnVmX2FkZHI7IAorCQlzMzIgZnJhbWVfc3RhdHVzOworCQkKKwkJaWYgKGRlc2Nfc3RhdHVzICYgRGVzY093bikKKwkJCWJyZWFrOworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoaG1wLT5wY2lfZGV2LAorCQkJCQkgICAgZGVzYy0+YWRkciwKKwkJCQkJICAgIGhtcC0+cnhfYnVmX3N6LAorCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJYnVmX2FkZHIgPSAodTggKikgaG1wLT5yeF9za2J1ZmZbZW50cnldLT50YWlsOworCQlmcmFtZV9zdGF0dXMgPSBsZTMyX3RvX2NwdShnZXRfdW5hbGlnbmVkKChzMzIqKSYoYnVmX2FkZHJbZGF0YV9zaXplIC0gMTJdKSkpOworCQlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiICBoYW1hY2hpX3J4KCkgc3RhdHVzIHdhcyAlOC44eC5cbiIsCisJCQkJZnJhbWVfc3RhdHVzKTsKKwkJaWYgKC0tYm9ndXNjbnQgPCAwKQorCQkJYnJlYWs7CisJCWlmICggISAoZGVzY19zdGF0dXMgJiBEZXNjRW5kUGFja2V0KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCBmcmFtZSBzcGFubmVkICIKKwkJCQkgICAibXVsdGlwbGUgYnVmZmVycywgZW50cnkgJSN4IGxlbmd0aCAlZCBzdGF0dXMgJTQuNHghXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgaG1wLT5jdXJfcngsIGRhdGFfc2l6ZSwgZGVzY19zdGF0dXMpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCBmcmFtZSAlcCB2cyAlcC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBkZXNjLCAmaG1wLT5yeF9yaW5nW2htcC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFXSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3ZlcnNpemVkIEV0aGVybmV0IGZyYW1lIC0tIG5leHQgc3RhdHVzICV4LyV4IGxhc3Qgc3RhdHVzICV4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsCisJCQkJICAgaG1wLT5yeF9yaW5nWyhobXAtPmN1cl9yeCsxKSAlIFJYX1JJTkdfU0laRV0uc3RhdHVzX25fbGVuZ3RoICYgMHhmZmZmMDAwMCwKKwkJCQkgICBobXAtPnJ4X3JpbmdbKGhtcC0+Y3VyX3J4KzEpICUgUlhfUklOR19TSVpFXS5zdGF0dXNfbl9sZW5ndGggJiAweDAwMDBmZmZmLAorCQkJCSAgIGhtcC0+cnhfcmluZ1soaG1wLT5jdXJfcngtMSkgJSBSWF9SSU5HX1NJWkVdLnN0YXR1c19uX2xlbmd0aCk7CisJCQlobXAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJfSAvKiBlbHNlICBPbWl0IGZvciBwcm90b3R5cGUgZXJyYXRhPz8/ICovCisJCWlmIChmcmFtZV9zdGF0dXMgJiAweDAwMzgwMDAwKSB7CisJCQkvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCisJCQlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDIpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgaGFtYWNoaV9yeCgpIFJ4IGVycm9yIHdhcyAlOC44eC5cbiIsCisJCQkJCSAgIGZyYW1lX3N0YXR1cyk7CisJCQlobXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDA2MDAwMDApIGhtcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAwODAwMDApIGhtcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDEwMDAwMCkgaG1wLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzIDwgMCkgaG1wLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJLyogT21pdCBDUkMgKi8KKwkJCXUxNiBwa3RfbGVuID0gKGZyYW1lX3N0YXR1cyAmIDB4MDdmZikgLSA0OwkKKyNpZmRlZiBSWF9DSEVDS1NVTQorCQkJdTMyIHBmY2sgPSAqKHUzMiAqKSAmYnVmX2FkZHJbZGF0YV9zaXplIC0gOF07CisjZW5kaWYKKworCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCWlmIChoYW1hY2hpX2RlYnVnID4gNCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiICBoYW1hY2hpX3J4KCkgbm9ybWFsIFJ4IHBrdCBsZW5ndGggJWQiCisJCQkJCSAgICIgb2YgJWQsIGJvZ3VzX2NudCAlZC5cbiIsCisJCQkJCSAgIHBrdF9sZW4sIGRhdGFfc2l6ZSwgYm9ndXNjbnQpOworCQkJaWYgKGhhbWFjaGlfZGVidWcgPiA1KQorCQkJCXByaW50ayhLRVJOX0RFQlVHIiVzOiAgcnggc3RhdHVzICU4Ljh4ICU4Ljh4ICU4Ljh4ICU4Ljh4ICU4Ljh4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLAorCQkJCQkgICAqKHMzMiopJihidWZfYWRkcltkYXRhX3NpemUgLSAyMF0pLAorCQkJCQkgICAqKHMzMiopJihidWZfYWRkcltkYXRhX3NpemUgLSAxNl0pLAorCQkJCQkgICAqKHMzMiopJihidWZfYWRkcltkYXRhX3NpemUgLSAxMl0pLAorCQkJCQkgICAqKHMzMiopJihidWZfYWRkcltkYXRhX3NpemUgLSA4XSksCisJCQkJCSAgICooczMyKikmKGJ1Zl9hZGRyW2RhdGFfc2l6ZSAtIDRdKSk7CisjZW5kaWYKKwkJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8gYWNjZXB0IHdpdGhvdXQgY29weWluZworCQkJICAgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLworCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKKwkJCQkmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKKyNpZmRlZiBSWF9DSEVDS1NVTQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJ4X2NvcHlicmVhayBub24temVybyAiCisJCQkJICAibm90IGdvb2Qgd2l0aCBSWF9DSEVDS1NVTVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShobXAtPnBjaV9kZXYsCisJCQkJCQkJICAgIGhtcC0+cnhfcmluZ1tlbnRyeV0uYWRkciwKKwkJCQkJCQkgICAgaG1wLT5yeF9idWZfc3osCisJCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJLyogQ2FsbCBjb3B5ICsgY2tzdW0gaWYgYXZhaWxhYmxlLiAqLworI2lmIDEgfHwgVVNFX0lQX0NPUFlTVU0KKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgCisJCQkJCWhtcC0+cnhfc2tidWZmW2VudHJ5XS0+ZGF0YSwgcGt0X2xlbiwgMCk7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworI2Vsc2UKKwkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLCBobXAtPnJ4X3JpbmdfZG1hCisJCQkJCSsgZW50cnkqc2l6ZW9mKCpkZXNjKSwgcGt0X2xlbik7CisjZW5kaWYKKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoaG1wLT5wY2lfZGV2LAorCQkJCQkJCSAgICAgICBobXAtPnJ4X3JpbmdbZW50cnldLmFkZHIsCisJCQkJCQkJICAgICAgIGhtcC0+cnhfYnVmX3N6LAorCQkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJfSBlbHNlIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKGhtcC0+cGNpX2RldiwgCisJCQkJCQkgaG1wLT5yeF9yaW5nW2VudHJ5XS5hZGRyLAorCQkJCQkJIGhtcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXNrYl9wdXQoc2tiID0gaG1wLT5yeF9za2J1ZmZbZW50cnldLCBwa3RfbGVuKTsKKwkJCQlobXAtPnJ4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCisjaWZkZWYgUlhfQ0hFQ0tTVU0KKwkJCS8qIFRDUCBvciBVRFAgb24gaXB2NCwgRElYIGVuY29kaW5nICovCisJCQlpZiAocGZjaz4+MjQgPT0gMHg5MSB8fCBwZmNrPj4yNCA9PSAweDUxKSB7CisJCQkJc3RydWN0IGlwaGRyICppaCA9IChzdHJ1Y3QgaXBoZHIgKikgc2tiLT5kYXRhOworCQkJCS8qIENoZWNrIHRoYXQgSVAgcGFja2V0IGlzIGF0IGxlYXN0IDQ2IGJ5dGVzLCBvdGhlcndpc2UsCisJCQkJICogdGhlcmUgbWF5IGJlIHBhZCBieXRlcyBpbmNsdWRlZCBpbiB0aGUgaGFyZHdhcmUgY2hlY2tzdW0uCisJCQkJICogVGhpcyB3b3VsZG4ndCBoYXBwZW4gaWYgZXZlcnlvbmUgcGFkZGVkIHdpdGggMC4KKwkJCQkgKi8KKwkJCQlpZiAobnRvaHMoaWgtPnRvdF9sZW4pID49IDQ2KXsKKwkJCQkJLyogZG9uJ3Qgd29ycnkgYWJvdXQgZnJhZ3MgKi8KKwkJCQkJaWYgKCEoaWgtPmZyYWdfb2ZmICYgX19jb25zdGFudF9odG9ucyhJUF9NRnxJUF9PRkZTRVQpKSkgeworCQkJCQkJdTMyIGludiA9ICoodTMyICopICZidWZfYWRkcltkYXRhX3NpemUgLSAxNl07CisJCQkJCQl1MzIgKnAgPSAodTMyICopICZidWZfYWRkcltkYXRhX3NpemUgLSAyMF07CisJCQkJCQlyZWdpc3RlciB1MzIgY3JjLCBwX3IsIHBfcjE7CisKKwkJCQkJCWlmIChpbnYgJiA0KSB7CisJCQkJCQkJaW52ICY9IH40OworCQkJCQkJCS0tcDsKKwkJCQkJCX0KKwkJCQkJCXBfciA9ICpwOworCQkJCQkJcF9yMSA9ICoocC0xKTsKKwkJCQkJCXN3aXRjaCAoaW52KSB7CisJCQkJCQkJY2FzZSAwOgkKKwkJCQkJCQkJY3JjID0gKHBfciAmIDB4ZmZmZikgKyAocF9yID4+IDE2KTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxOgkKKwkJCQkJCQkJY3JjID0gKHBfciA+PiAxNikgKyAocF9yICYgMHhmZmZmKQorCQkJCQkJCQkJKyAocF9yMSA+PiAxNiAmIDB4ZmYwMCk7IAorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDI6CQorCQkJCQkJCQljcmMgPSBwX3IgKyAocF9yMSA+PiAxNik7IAorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDM6CQorCQkJCQkJCQljcmMgPSBwX3IgKyAocF9yMSAmIDB4ZmYwMCkgKyAocF9yMSA+PiAxNik7IAorCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgkvKk5PVFJFQUNIRUQqLyBjcmMgPSAwOworCQkJCQkJfQorCQkJCQkJaWYgKGNyYyAmIDB4ZmZmZjAwMDApIHsKKwkJCQkJCQljcmMgJj0gMHhmZmZmOworCQkJCQkJCSsrY3JjOworCQkJCQkJfQorCQkJCQkJLyogdGNwL3VkcCB3aWxsIGFkZCBpbiBwc2V1ZG8gKi8KKwkJCQkJCXNrYi0+Y3N1bSA9IG50b2hzKHBmY2sgJiAweGZmZmYpOworCQkJCQkJaWYgKHNrYi0+Y3N1bSA+IGNyYykKKwkJCQkJCQlza2ItPmNzdW0gLT0gY3JjOworCQkJCQkJZWxzZQorCQkJCQkJCXNrYi0+Y3N1bSArPSAofmNyYyAmIDB4ZmZmZik7CisJCQkJCQkvKgorCQkJCQkJKiBjb3VsZCBkbyB0aGUgcHNldWRvIG15c2VsZiBhbmQgcmV0dXJuCisJCQkJCQkqIENIRUNLU1VNX1VOTkVDRVNTQVJZCisJCQkJCQkqLworCQkJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9IVzsKKwkJCQkJfQorCQkJCX0JCisJCQl9CisjZW5kaWYgIC8qIFJYX0NIRUNLU1VNICovCisKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJaG1wLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCX0KKwkJZW50cnkgPSAoKytobXAtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CisJfQorCisJLyogUmVmaWxsIHRoZSBSeCByaW5nIGJ1ZmZlcnMuICovCisJZm9yICg7IGhtcC0+Y3VyX3J4IC0gaG1wLT5kaXJ0eV9yeCA+IDA7IGhtcC0+ZGlydHlfcngrKykgeworCQlzdHJ1Y3QgaGFtYWNoaV9kZXNjICpkZXNjOworCisJCWVudHJ5ID0gaG1wLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwkJZGVzYyA9ICYoaG1wLT5yeF9yaW5nW2VudHJ5XSk7CisJCWlmIChobXAtPnJ4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoaG1wLT5yeF9idWZfc3opOworCisJCQlobXAtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CQkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kLiAqLworCQkJc2tiLT5kZXYgPSBkZXY7CQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KKyAgICAgICAgICAgICAgICAJZGVzYy0+YWRkciA9IGNwdV90b19sZVhYKHBjaV9tYXBfc2luZ2xlKGhtcC0+cGNpX2RldiwgCisJCQkJc2tiLT50YWlsLCBobXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCX0KKwkJZGVzYy0+c3RhdHVzX25fbGVuZ3RoID0gY3B1X3RvX2xlMzIoaG1wLT5yeF9idWZfc3opOworCQlpZiAoZW50cnkgPj0gUlhfUklOR19TSVpFLTEpCisJCQlkZXNjLT5zdGF0dXNfbl9sZW5ndGggfD0gY3B1X3RvX2xlMzIoRGVzY093biB8IAorCQkJCURlc2NFbmRQYWNrZXQgfCBEZXNjRW5kUmluZyB8IERlc2NJbnRyKTsKKwkJZWxzZQorCQkJZGVzYy0+c3RhdHVzX25fbGVuZ3RoIHw9IGNwdV90b19sZTMyKERlc2NPd24gfCAKKwkJCQlEZXNjRW5kUGFja2V0IHwgRGVzY0ludHIpOworCX0KKworCS8qIFJlc3RhcnQgUnggZW5naW5lIGlmIHN0b3BwZWQuICovCisJLyogSWYgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBzdGF0dXMsIGRvbid0LiAtS0RVICovCisJaWYgKHJlYWR3KGhtcC0+YmFzZSArIFJ4U3RhdHVzKSAmIDB4MDAwMikKKwkJd3JpdGV3KDB4MDAwMSwgaG1wLT5iYXNlICsgUnhDbWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgaXMgbW9yZSBwcm9wZXJseSBuYW1lZCAidW5jb21tb24gaW50ZXJydXB0IGV2ZW50cyIsIGFzIGl0IGNvdmVycyBtb3JlCisgICB0aGFuIGp1c3QgZXJyb3JzLiAqLworc3RhdGljIHZvaWQgaGFtYWNoaV9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpCit7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqaG1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGhtcC0+YmFzZTsKKworCWlmIChpbnRyX3N0YXR1cyAmIChMaW5rQ2hhbmdlfE5lZ290aWF0aW9uQ2hhbmdlKSkgeworCQlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBjaGFuZ2VkOiBBdXRvTmVnb3RpYXRpb24gQ3RybCIKKwkJCQkgICAiICU0LjR4LCBTdGF0dXMgJTQuNHggJTQuNHggSW50ciBzdGF0dXMgJTQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgcmVhZHcoaW9hZGRyICsgMHgwRTApLCByZWFkdyhpb2FkZHIgKyAweDBFMiksCisJCQkJICAgcmVhZHcoaW9hZGRyICsgQU5MaW5rUGFydG5lckFiaWxpdHkpLAorCQkJCSAgIHJlYWRsKGlvYWRkciArIEludHJTdGF0dXMpKTsKKwkJaWYgKHJlYWR3KGlvYWRkciArIEFOU3RhdHVzKSAmIDB4MjApCisJCQl3cml0ZWIoMHgwMSwgaW9hZGRyICsgTEVEQ3RybCk7CisJCWVsc2UKKwkJCXdyaXRlYigweDAzLCBpb2FkZHIgKyBMRURDdHJsKTsKKwl9CisJaWYgKGludHJfc3RhdHVzICYgU3RhdHNNYXgpIHsKKwkJaGFtYWNoaV9nZXRfc3RhdHMoZGV2KTsKKwkJLyogUmVhZCB0aGUgb3ZlcmZsb3cgYml0cyB0byBjbGVhci4gKi8KKwkJcmVhZGwoaW9hZGRyICsgMHgzNzApOworCQlyZWFkbChpb2FkZHIgKyAweDNGMCk7CisJfQorCWlmICgoaW50cl9zdGF0dXMgJiB+KExpbmtDaGFuZ2V8U3RhdHNNYXh8TmVnb3RpYXRpb25DaGFuZ2V8SW50clJ4RG9uZXxJbnRyVHhEb25lKSkKKwkJJiYgaGFtYWNoaV9kZWJ1ZykKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogU29tZXRoaW5nIFdpY2tlZCBoYXBwZW5lZCEgJTQuNHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisJLyogSG1tbW1tLCBpdCdzIG5vdCBjbGVhciBob3cgdG8gcmVjb3ZlciBmcm9tIFBDSSBmYXVsdHMuICovCisJaWYgKGludHJfc3RhdHVzICYgKEludHJUeFBDSUVyciB8IEludHJUeFBDSUZhdWx0KSkKKwkJaG1wLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyUnhQQ0lFcnIgfCBJbnRyUnhQQ0lGYXVsdCkpCisJCWhtcC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKK30KKworc3RhdGljIGludCBoYW1hY2hpX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqaG1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGhtcC0+YmFzZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKGhhbWFjaGlfZGVidWcgPiAxKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgVHggJTQuNHggUnggJTQuNHggSW50ICUyLjJ4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgcmVhZHcoaW9hZGRyICsgVHhTdGF0dXMpLAorCQkJICAgcmVhZHcoaW9hZGRyICsgUnhTdGF0dXMpLCByZWFkbChpb2FkZHIgKyBJbnRyU3RhdHVzKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUXVldWUgcG9pbnRlcnMgd2VyZSBUeCAlZCAvICVkLCAgUnggJWQgLyAlZC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGhtcC0+Y3VyX3R4LCBobXAtPmRpcnR5X3R4LCBobXAtPmN1cl9yeCwgaG1wLT5kaXJ0eV9yeCk7CisJfQorCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwl3cml0ZWwoMHgwMDAwLCBpb2FkZHIgKyBJbnRlcnJ1cHRFbmFibGUpOworCisJLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisJd3JpdGVsKDIsIGlvYWRkciArIFJ4Q21kKTsKKwl3cml0ZXcoMiwgaW9hZGRyICsgVHhDbWQpOworCisjaWZkZWYgX19pMzg2X18KKwlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDIpIHsKKwkJcHJpbnRrKCJcbiJLRVJOX0RFQlVHIiAgVHggcmluZyBhdCAlOC44eDpcbiIsCisJCQkgICAoaW50KWhtcC0+dHhfcmluZ19kbWEpOworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAlYyAjJWQgZGVzYy4gJTguOHggJTguOHguXG4iLAorCQkJCSAgIHJlYWRsKGlvYWRkciArIFR4Q3VyUHRyKSA9PSAobG9uZykmaG1wLT50eF9yaW5nW2ldID8gJz4nIDogJyAnLAorCQkJCSAgIGksIGhtcC0+dHhfcmluZ1tpXS5zdGF0dXNfbl9sZW5ndGgsIGhtcC0+dHhfcmluZ1tpXS5hZGRyKTsKKwkJcHJpbnRrKCJcbiJLRVJOX0RFQlVHICIgIFJ4IHJpbmcgJTguOHg6XG4iLAorCQkJICAgKGludClobXAtPnJ4X3JpbmdfZG1hKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiICVjICMlZCBkZXNjLiAlNC40eCAlOC44eFxuIiwKKwkJCQkgICByZWFkbChpb2FkZHIgKyBSeEN1clB0cikgPT0gKGxvbmcpJmhtcC0+cnhfcmluZ1tpXSA/ICc+JyA6ICcgJywKKwkJCQkgICBpLCBobXAtPnJ4X3JpbmdbaV0uc3RhdHVzX25fbGVuZ3RoLCBobXAtPnJ4X3JpbmdbaV0uYWRkcik7CisJCQlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDYpIHsKKwkJCQlpZiAoKih1OCopaG1wLT5yeF9za2J1ZmZbaV0tPnRhaWwgIT0gMHg2OSkgeworCQkJCQl1MTYgKmFkZHIgPSAodTE2ICopCisJCQkJCQlobXAtPnJ4X3NrYnVmZltpXS0+dGFpbDsKKwkJCQkJaW50IGo7CisKKwkJCQkJZm9yIChqID0gMDsgaiA8IDB4NTA7IGorKykKKwkJCQkJCXByaW50aygiICU0LjR4IiwgYWRkcltqXSk7CisJCQkJCXByaW50aygiXG4iKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLyogX19pMzg2X18gZGVidWdnaW5nIG9ubHkgKi8KKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJZGVsX3RpbWVyX3N5bmMoJmhtcC0+dGltZXIpOworCisJLyogRnJlZSBhbGwgdGhlIHNrYnVmZnMgaW4gdGhlIFJ4IHF1ZXVlLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlza2IgPSBobXAtPnJ4X3NrYnVmZltpXTsKKwkJaG1wLT5yeF9yaW5nW2ldLnN0YXR1c19uX2xlbmd0aCA9IDA7CisJCWhtcC0+cnhfcmluZ1tpXS5hZGRyID0gMHhCQURGMDBEMDsgLyogQW4gaW52YWxpZCBhZGRyZXNzLiAqLworCQlpZiAoc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGhtcC0+cGNpX2RldiwgCisJCQkJaG1wLT5yeF9yaW5nW2ldLmFkZHIsIGhtcC0+cnhfYnVmX3N6LCAKKwkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJaG1wLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlza2IgPSBobXAtPnR4X3NrYnVmZltpXTsKKwkJaWYgKHNrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZShobXAtPnBjaV9kZXYsIAorCQkJCWhtcC0+dHhfcmluZ1tpXS5hZGRyLCBza2ItPmxlbiwgCisJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlobXAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCX0KKwl9CisKKwl3cml0ZWIoMHgwMCwgaW9hZGRyICsgTEVEQ3RybCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpoYW1hY2hpX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKmhtcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBobXAtPmJhc2U7CisKKwkvKiBXZSBzaG91bGQgbG9jayB0aGlzIHNlZ21lbnQgb2YgY29kZSBmb3IgU01QIGV2ZW50dWFsbHksIGFsdGhvdWdoCisJICAgdGhlIHZ1bG5lcmFiaWxpdHkgd2luZG93IGlzIHZlcnkgc21hbGwgYW5kIHN0YXRpc3RpY3MgYXJlCisJICAgbm9uLWNyaXRpY2FsLiAqLworICAgICAgICAvKiBPaywgd2hhdCBnb2VzIGhlcmU/ICBUaGlzIGFwcGVhcnMgdG8gYmUgc3R1Y2sgYXQgMjEgcGFja2V0cworICAgICAgICAgICBhY2NvcmRpbmcgdG8gaWZjb25maWcuICBJdCBkb2VzIGdldCBpbmNyZW1lbnRlZCBpbiBoYW1hY2hpX3R4KCksCisgICAgICAgICAgIHNvIEkgdGhpbmsgSSdsbCBjb21tZW50IGl0IG91dCBoZXJlIGFuZCBzZWUgaWYgYmV0dGVyIHRoaW5ncworICAgICAgICAgICBoYXBwZW4uCisgICAgICAgICovIAorCS8qIGhtcC0+c3RhdHMudHhfcGFja2V0cwk9IHJlYWRsKGlvYWRkciArIDB4MDAwKTsgKi8KKworCWhtcC0+c3RhdHMucnhfYnl0ZXMgPSByZWFkbChpb2FkZHIgKyAweDMzMCk7IC8qIFRvdGFsIFVuaStCcmQrTXVsdGkgKi8KKwlobXAtPnN0YXRzLnR4X2J5dGVzID0gcmVhZGwoaW9hZGRyICsgMHgzQjApOyAvKiBUb3RhbCBVbmkrQnJkK011bHRpICovCisJaG1wLT5zdGF0cy5tdWx0aWNhc3QJCT0gcmVhZGwoaW9hZGRyICsgMHgzMjApOyAvKiBNdWx0aWNhc3QgUnggKi8KKworCWhtcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycwk9IHJlYWRsKGlvYWRkciArIDB4MzY4KTsgLyogT3ZlcitVbmRlcnNpemVkICovCisJaG1wLT5zdGF0cy5yeF9vdmVyX2Vycm9ycwk9IHJlYWRsKGlvYWRkciArIDB4MzVDKTsgLyogSmFiYmVyICovCisJaG1wLT5zdGF0cy5yeF9jcmNfZXJyb3JzCT0gcmVhZGwoaW9hZGRyICsgMHgzNjApOyAvKiBKYWJiZXIgKi8KKwlobXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycwk9IHJlYWRsKGlvYWRkciArIDB4MzY0KTsgLyogU3ltYm9sIEVycnMgKi8KKwlobXAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMJPSByZWFkbChpb2FkZHIgKyAweDM2Qyk7IC8qIERyb3BwZWQgKi8KKworCXJldHVybiAmaG1wLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGFtYWNoaV9wcml2YXRlICpobXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gaG1wLT5iYXNlOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkJCS8qIFNldCBwcm9taXNjdW91cy4gKi8KKwkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJd3JpdGV3KDB4MDAwRiwgaW9hZGRyICsgQWRkck1vZGUpOworCX0gZWxzZSBpZiAoKGRldi0+bWNfY291bnQgPiA2MykgIHx8ICAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJLyogVG9vIG1hbnkgdG8gbWF0Y2gsIG9yIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJd3JpdGV3KDB4MDAwQiwgaW9hZGRyICsgQWRkck1vZGUpOworCX0gZWxzZSBpZiAoZGV2LT5tY19jb3VudCA+IDApIHsgLyogTXVzdCB1c2UgdGhlIENBTSBmaWx0ZXIuICovCisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQlpbnQgaTsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCQkgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCXdyaXRlbCgqKHUzMiopKG1jbGlzdC0+ZG1pX2FkZHIpLCBpb2FkZHIgKyAweDEwMCArIGkqOCk7CisJCQl3cml0ZWwoMHgyMDAwMCB8ICgqKHUxNiopJm1jbGlzdC0+ZG1pX2FkZHJbNF0pLAorCQkJCSAgIGlvYWRkciArIDB4MTA0ICsgaSo4KTsKKwkJfQorCQkvKiBDbGVhciByZW1haW5pbmcgZW50cmllcy4gKi8KKwkJZm9yICg7IGkgPCA2NDsgaSsrKQorCQkJd3JpdGVsKDAsIGlvYWRkciArIDB4MTA0ICsgaSo4KTsKKwkJd3JpdGV3KDB4MDAwMywgaW9hZGRyICsgQWRkck1vZGUpOworCX0gZWxzZSB7CQkJCQkvKiBOb3JtYWwsIHVuaWNhc3QvYnJvYWRjYXN0LW9ubHkgbW9kZS4gKi8KKwkJd3JpdGV3KDB4MDAwMSwgaW9hZGRyICsgQWRkck1vZGUpOworCX0KK30KKworc3RhdGljIGludCBjaGVja19pZl9ydW5uaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoYW1hY2hpX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKK30KKworc3RhdGljIGludCBoYW1hY2hpX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwltaWlfZXRodG9vbF9nc2V0KCZucC0+bWlpX2lmLCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW1hY2hpX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXM7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXJlcyA9IG1paV9ldGh0b29sX3NzZXQoJm5wLT5taWlfaWYsIGVjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgaGFtYWNoaV9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBtaWlfbndheV9yZXN0YXJ0KCZucC0+bWlpX2lmKTsKK30KKworc3RhdGljIHUzMiBoYW1hY2hpX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBtaWlfbGlua19vaygmbnAtPm1paV9pZik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHMgPSB7CisJLmJlZ2luID0gY2hlY2tfaWZfcnVubmluZywKKwkuZ2V0X2RydmluZm8gPSBoYW1hY2hpX2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MgPSBoYW1hY2hpX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzID0gaGFtYWNoaV9zZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQgPSBoYW1hY2hpX253YXlfcmVzZXQsCisJLmdldF9saW5rID0gaGFtYWNoaV9nZXRfbGluaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHNfbm9fbWlpID0geworCS5iZWdpbiA9IGNoZWNrX2lmX3J1bm5pbmcsCisJLmdldF9kcnZpbmZvID0gaGFtYWNoaV9nZXRfZHJ2aW5mbywKK307CisKK3N0YXRpYyBpbnQgbmV0ZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShycSk7CisJaW50IHJjOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNtZCA9PSAoU0lPQ0RFVlBSSVZBVEUrMykpIHsgLyogc2V0IHJ4LHR4IGludHIgcGFyYW1zICovCisJCXUzMiAqZCA9ICh1MzIgKikmcnEtPmlmcl9pZnJ1OworCQkvKiBTaG91bGQgYWRkIHRoaXMgY2hlY2sgaGVyZSBvciBhbiBvcmRpbmFyeSB1c2VyIGNhbiBkbyBuYXN0eQorCQkgKiB0aGluZ3MuIC1LRFUKKwkJICoKKwkJICogVE9ETzogU2h1dCBkb3duIHRoZSBSeCBhbmQgVHggZW5naW5lcyB3aGlsZSBkb2luZyB0aGlzLgorCQkgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJd3JpdGVsKGRbMF0sIG5wLT5iYXNlICsgVHhJbnRyQ3RybCk7CisJCXdyaXRlbChkWzFdLCBucC0+YmFzZSArIFJ4SW50ckN0cmwpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB0eCAlMDh4LCByeCAlMDh4IGludHJcbiIsIGRldi0+bmFtZSwKKwkJICAodTMyKSByZWFkbChucC0+YmFzZSArIFR4SW50ckN0cmwpLAorCQkgICh1MzIpIHJlYWRsKG5wLT5iYXNlICsgUnhJbnRyQ3RybCkpOworCQlyYyA9IDA7CisJfQorCisJZWxzZSB7CisJCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJcmMgPSBnZW5lcmljX21paV9pb2N0bCgmbnAtPm1paV9pZiwgZGF0YSwgY21kLCBOVUxMKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJfQorCisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBoYW1hY2hpX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoZGV2KSB7CisJCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKmhtcCA9IG5ldGRldl9wcml2KGRldik7CisKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCBobXAtPnJ4X3JpbmcsIAorCQkJaG1wLT5yeF9yaW5nX2RtYSk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgaG1wLT50eF9yaW5nLCAKKwkJCWhtcC0+dHhfcmluZ19kbWEpOworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlpb3VubWFwKGhtcC0+YmFzZSk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBoYW1hY2hpX3BjaV90YmxbXSA9IHsKKwl7IDB4MTMxOCwgMHgwOTExLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBoYW1hY2hpX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaGFtYWNoaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0gaGFtYWNoaV9wY2lfdGJsLAorCS5wcm9iZQkJPSBoYW1hY2hpX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaGFtYWNoaV9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGhhbWFjaGlfaW5pdCAodm9pZCkKK3sKKy8qIHdoZW4gYSBtb2R1bGUsIHRoaXMgaXMgcHJpbnRlZCB3aGV0aGVyIG9yIG5vdCBkZXZpY2VzIGFyZSBmb3VuZCBpbiBwcm9iZSAqLworI2lmZGVmIE1PRFVMRQorCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZoYW1hY2hpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoYW1hY2hpX2V4aXQgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZoYW1hY2hpX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoaGFtYWNoaV9pbml0KTsKK21vZHVsZV9leGl0KGhhbWFjaGlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjdiMzUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYwpAQCAtMCwwICsxLDEwNTEgQEAKKy8qCisgKiA2cGFjay5jCVRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIDZwYWNrIHByb3RvY29sIGZvciBrZXJuZWwtYmFzZWQKKyAqCQlkZXZpY2VzIGxpa2UgVFRZLiBJdCBpbnRlcmZhY2VzIGJldHdlZW4gYSByYXcgVFRZIGFuZCB0aGUKKyAqCQlrZXJuZWwncyBBWC4yNSBwcm90b2NvbCBsYXllcnMuCisgKgorICogQXV0aG9yczoJQW5kcmVhcyBL9m5zZ2VuIDxhamtAaWVoay5yd3RoLWFhY2hlbi5kZT4KKyAqICAgICAgICAgICAgICBSYWxmIEJhZWNobGUgREw1UkIgPHJhbGZAbGludXgtbWlwcy5vcmc+CisgKgorICogUXVpdGUgYSBsb3Qgb2Ygc3R1ZmYgInN0b2xlbiIgYnkgSm9lcmcgUmV1dGVyIGZyb20gc2xpcC5jLCB3cml0dGVuIGJ5CisgKgorICoJCUxhdXJlbmNlIEN1bGhhbmUsIDxsb3pAaG9sbWVzLmRlbW9uLmNvLnVrPgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1d2FsdC5ubC5tdWduZXQub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKyNkZWZpbmUgU0lYUEFDS19WRVJTSU9OICAgICJSZXZpc2lvbjogMC4zLjAiCisKKy8qIHNpeHBhY2sgcHJpb3JpdHkgY29tbWFuZHMgKi8KKyNkZWZpbmUgU0lYUF9TRU9GCQkweDQwCS8qIHN0YXJ0IGFuZCBlbmQgb2YgYSA2cGFjayBmcmFtZSAqLworI2RlZmluZSBTSVhQX1RYX1VSVU4JCTB4NDgJLyogdHJhbnNtaXQgb3ZlcnJ1biAqLworI2RlZmluZSBTSVhQX1JYX09SVU4JCTB4NTAJLyogcmVjZWl2ZSBvdmVycnVuICovCisjZGVmaW5lIFNJWFBfUlhfQlVGX09WTAkJMHg1OAkvKiByZWNlaXZlIGJ1ZmZlciBvdmVyZmxvdyAqLworCisjZGVmaW5lIFNJWFBfQ0hLU1VNCQkweEZGCS8qIHZhbGlkIGNoZWNrc3VtIG9mIGEgNnBhY2sgZnJhbWUgKi8KKworLyogbWFza3MgdG8gZ2V0IGNlcnRhaW4gYml0cyBvdXQgb2YgdGhlIHN0YXR1cyBieXRlcyBzZW50IGJ5IHRoZSBUTkMgKi8KKworI2RlZmluZSBTSVhQX0NNRF9NQVNLCQkweEMwCisjZGVmaW5lIFNJWFBfQ0hOX01BU0sJCTB4MDcKKyNkZWZpbmUgU0lYUF9QUklPX0NNRF9NQVNLCTB4ODAKKyNkZWZpbmUgU0lYUF9TVERfQ01EX01BU0sJMHg0MAorI2RlZmluZSBTSVhQX1BSSU9fREFUQV9NQVNLCTB4MzgKKyNkZWZpbmUgU0lYUF9UWF9NQVNLCQkweDIwCisjZGVmaW5lIFNJWFBfUlhfTUFTSwkJMHgxMAorI2RlZmluZSBTSVhQX1JYX0RDRF9NQVNLCTB4MTgKKyNkZWZpbmUgU0lYUF9MRURTX09OCQkweDc4CisjZGVmaW5lIFNJWFBfTEVEU19PRkYJCTB4NjAKKyNkZWZpbmUgU0lYUF9DT04JCTB4MDgKKyNkZWZpbmUgU0lYUF9TVEEJCTB4MTAKKworI2RlZmluZSBTSVhQX0ZPVU5EX1ROQwkJMHhlOQorI2RlZmluZSBTSVhQX0NPTl9PTgkJMHg2OAorI2RlZmluZSBTSVhQX0RDRF9NQVNLCQkweDA4CisjZGVmaW5lIFNJWFBfREFNQV9PRkYJCTAKKworLyogZGVmYXVsdCBsZXZlbCAyIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgU0lYUF9UWERFTEFZCQkJKEhaLzQpCS8qIGluIDEgcyAqLworI2RlZmluZSBTSVhQX1BFUlNJU1QJCQk1MAkvKiBpbiAyNTZ0aHMgKi8KKyNkZWZpbmUgU0lYUF9TTE9UVElNRQkJCShIWi8xMCkJLyogaW4gMSBzICovCisjZGVmaW5lIFNJWFBfSU5JVF9SRVNZTkNfVElNRU9VVAkoMypIWi8yKSAvKiBpbiAxIHMgKi8KKyNkZWZpbmUgU0lYUF9SRVNZTkNfVElNRU9VVAkJNSpIWgkvKiBpbiAxIHMgKi8KKworLyogNnBhY2sgY29uZmlndXJhdGlvbi4gKi8KKyNkZWZpbmUgU0lYUF9OUlVOSVQJCQkzMSAgICAgIC8qIE1BWCBudW1iZXIgb2YgNnBhY2sgY2hhbm5lbHMgKi8KKyNkZWZpbmUgU0lYUF9NVFUJCQkyNTYJLyogRGVmYXVsdCBNVFUgKi8KKworZW51bSBzaXhwYWNrX2ZsYWdzIHsKKwlTSVhQRl9FUlJPUiwJLyogUGFyaXR5LCBldGMuIGVycm9yCSovCit9OworCitzdHJ1Y3Qgc2l4cGFjayB7CisJLyogVmFyaW91cyBmaWVsZHMuICovCisJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsJCS8qIHB0ciB0byBUVFkgc3RydWN0dXJlCSovCisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsJCS8qIGVhc3kgZm9yIGludHIgaGFuZGxpbmcgICovCisKKwkvKiBUaGVzZSBhcmUgcG9pbnRlcnMgdG8gdGhlIG1hbGxvYygpZWQgZnJhbWUgYnVmZmVycy4gKi8KKwl1bnNpZ25lZCBjaGFyCQkqcmJ1ZmY7CQkvKiByZWNlaXZlciBidWZmZXIJKi8KKwlpbnQJCQlyY291bnQ7ICAgICAgICAgLyogcmVjZWl2ZWQgY2hhcnMgY291bnRlciAgKi8KKwl1bnNpZ25lZCBjaGFyCQkqeGJ1ZmY7CQkvKiB0cmFuc21pdHRlciBidWZmZXIJKi8KKwl1bnNpZ25lZCBjaGFyCQkqeGhlYWQ7ICAgICAgICAgLyogbmV4dCBieXRlIHRvIFhNSVQgKi8KKwlpbnQJCQl4bGVmdDsgICAgICAgICAgLyogYnl0ZXMgbGVmdCBpbiBYTUlUIHF1ZXVlICAqLworCisJdW5zaWduZWQgY2hhcgkJcmF3X2J1Zls0XTsKKwl1bnNpZ25lZCBjaGFyCQljb29rZWRfYnVmWzQwMF07CisKKwl1bnNpZ25lZCBpbnQJCXJ4X2NvdW50OworCXVuc2lnbmVkIGludAkJcnhfY291bnRfY29va2VkOworCisJLyogNnBhY2sgaW50ZXJmYWNlIHN0YXRpc3RpY3MuICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKwlpbnQJCQltdHU7CQkvKiBPdXIgbXR1ICh0byBzcG90IGNoYW5nZXMhKSAqLworCWludAkJCWJ1ZmZzaXplOyAgICAgICAvKiBNYXggYnVmZmVycyBzaXplcyAqLworCisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBGbGFnIHZhbHVlcy8gbW9kZSBldGMgKi8KKwl1bnNpZ25lZCBjaGFyCQltb2RlOwkJLyogNnBhY2sgbW9kZSAqLworCisJLyogNnBhY2sgc3R1ZmYgKi8KKwl1bnNpZ25lZCBjaGFyCQl0eF9kZWxheTsKKwl1bnNpZ25lZCBjaGFyCQlwZXJzaXN0ZW5jZTsKKwl1bnNpZ25lZCBjaGFyCQlzbG90dGltZTsKKwl1bnNpZ25lZCBjaGFyCQlkdXBsZXg7CisJdW5zaWduZWQgY2hhcgkJbGVkX3N0YXRlOworCXVuc2lnbmVkIGNoYXIJCXN0YXR1czsKKwl1bnNpZ25lZCBjaGFyCQlzdGF0dXMxOworCXVuc2lnbmVkIGNoYXIJCXN0YXR1czI7CisJdW5zaWduZWQgY2hhcgkJdHhfZW5hYmxlOworCXVuc2lnbmVkIGNoYXIJCXRuY19zdGF0ZTsKKworCXN0cnVjdCB0aW1lcl9saXN0CXR4X3Q7CisJc3RydWN0IHRpbWVyX2xpc3QJcmVzeW5jX3Q7CisJYXRvbWljX3QJCXJlZmNudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlCWRlYWRfc2VtOworCXNwaW5sb2NrX3QJCWxvY2s7Cit9OworCisjZGVmaW5lIEFYMjVfNlBBQ0tfSEVBREVSX0xFTiAwCisKK3N0YXRpYyB2b2lkIHNwX3N0YXJ0X3R4X3RpbWVyKHN0cnVjdCBzaXhwYWNrICopOworc3RhdGljIHZvaWQgc2l4cGFja19kZWNvZGUoc3RydWN0IHNpeHBhY2sgKiwgdW5zaWduZWQgY2hhcltdLCBpbnQpOworc3RhdGljIGludCBlbmNvZGVfc2l4cGFjayh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgaW50LCB1bnNpZ25lZCBjaGFyKTsKKworLyoKKyAqIHBlcmZvcm0gdGhlIHBlcnNpc3RlbmNlL3Nsb3R0aW1lIGFsZ29yaXRobSBmb3IgQ1NNQSBhY2Nlc3MuIElmIHRoZQorICogcGVyc2lzdGVuY2UgY2hlY2sgd2FzIHN1Y2Nlc3NmdWwsIHdyaXRlIHRoZSBkYXRhIHRvIHRoZSBzZXJpYWwgZHJpdmVyLgorICogTm90ZSB0aGF0IGluIGNhc2Ugb2YgREFNQSBvcGVyYXRpb24sIHRoZSBkYXRhIGlzIG5vdCBzZW50IGhlcmUuCisgKi8KKworc3RhdGljIHZvaWQgc3BfeG1pdF9vbl9haXIodW5zaWduZWQgbG9uZyBjaGFubmVsKQoreworCXN0cnVjdCBzaXhwYWNrICpzcCA9IChzdHJ1Y3Qgc2l4cGFjayAqKSBjaGFubmVsOworCWludCBhY3R1YWw7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmFuZG9tOworCisJcmFuZG9tID0gcmFuZG9tICogMTcgKyA0MTsKKworCWlmICgoKHNwLT5zdGF0dXMxICYgU0lYUF9EQ0RfTUFTSykgPT0gMCkgJiYgKHJhbmRvbSA8IHNwLT5wZXJzaXN0ZW5jZSkpIHsKKwkJc3AtPmxlZF9zdGF0ZSA9IDB4NzA7CisJCXNwLT50dHktPmRyaXZlci0+d3JpdGUoc3AtPnR0eSwgJnNwLT5sZWRfc3RhdGUsIDEpOworCQlzcC0+dHhfZW5hYmxlID0gMTsKKwkJYWN0dWFsID0gc3AtPnR0eS0+ZHJpdmVyLT53cml0ZShzcC0+dHR5LCBzcC0+eGJ1ZmYsIHNwLT5zdGF0dXMyKTsKKwkJc3AtPnhsZWZ0IC09IGFjdHVhbDsKKwkJc3AtPnhoZWFkICs9IGFjdHVhbDsKKwkJc3AtPmxlZF9zdGF0ZSA9IDB4NjA7CisJCXNwLT50dHktPmRyaXZlci0+d3JpdGUoc3AtPnR0eSwgJnNwLT5sZWRfc3RhdGUsIDEpOworCQlzcC0+c3RhdHVzMiA9IDA7CisJfSBlbHNlCisJCXNwX3N0YXJ0X3R4X3RpbWVyKHNwKTsKK30KKworLyogLS0tLT4gNnBhY2sgdGltZXIgaW50ZXJydXB0IGhhbmRsZXIgYW5kIGZyaWVuZHMuIDwtLS0tICovCitzdGF0aWMgdm9pZCBzcF9zdGFydF90eF90aW1lcihzdHJ1Y3Qgc2l4cGFjayAqc3ApCit7CisJaW50IHdoZW4gPSBzcC0+c2xvdHRpbWU7CisKKwlkZWxfdGltZXIoJnNwLT50eF90KTsKKwlzcC0+dHhfdC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHNwOworCXNwLT50eF90LmZ1bmN0aW9uID0gc3BfeG1pdF9vbl9haXI7CisJc3AtPnR4X3QuZXhwaXJlcyA9IGppZmZpZXMgKyAoKHdoZW4gKyAxKSAqIEhaKSAvIDEwMDsKKwlhZGRfdGltZXIoJnNwLT50eF90KTsKK30KKworLyogRW5jYXBzdWxhdGUgb25lIEFYLjI1IGZyYW1lIGFuZCBzdHVmZiBpbnRvIGEgVFRZIHF1ZXVlLiAqLworc3RhdGljIHZvaWQgc3BfZW5jYXBzKHN0cnVjdCBzaXhwYWNrICpzcCwgdW5zaWduZWQgY2hhciAqaWNwLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKm1zZywgKnAgPSBpY3A7CisJaW50IGFjdHVhbCwgY291bnQ7CisKKwlpZiAobGVuID4gc3AtPm10dSkgewkvKiBzcC0+bXR1ID0gQVgyNV9NVFUgPSBtYXguIFBBQ0xFTiA9IDI1NiAqLworCQltc2cgPSAib3ZlcnNpemVkIHRyYW5zbWl0IHBhY2tldCEiOworCQlnb3RvIG91dF9kcm9wOworCX0KKworCWlmIChsZW4gPiBzcC0+bXR1KSB7CS8qIHNwLT5tdHUgPSBBWDI1X01UVSA9IG1heC4gUEFDTEVOID0gMjU2ICovCisJCW1zZyA9ICJvdmVyc2l6ZWQgdHJhbnNtaXQgcGFja2V0ISI7CisJCWdvdG8gb3V0X2Ryb3A7CisJfQorCisJaWYgKHBbMF0gPiA1KSB7CisJCW1zZyA9ICJpbnZhbGlkIEtJU1MgY29tbWFuZCI7CisJCWdvdG8gb3V0X2Ryb3A7CisJfQorCisJaWYgKChwWzBdICE9IDApICYmIChsZW4gPiAyKSkgeworCQltc2cgPSAiS0lTUyBjb250cm9sIHBhY2tldCB0b28gbG9uZyI7CisJCWdvdG8gb3V0X2Ryb3A7CisJfQorCisJaWYgKChwWzBdID09IDApICYmIChsZW4gPCAxNSkpIHsKKwkJbXNnID0gImJhZCBBWC4yNSBwYWNrZXQgdG8gdHJhbnNtaXQiOworCQlnb3RvIG91dF9kcm9wOworCX0KKworCWNvdW50ID0gZW5jb2RlX3NpeHBhY2socCwgc3AtPnhidWZmLCBsZW4sIHNwLT50eF9kZWxheSk7CisJc2V0X2JpdChUVFlfRE9fV1JJVEVfV0FLRVVQLCAmc3AtPnR0eS0+ZmxhZ3MpOworCisJc3dpdGNoIChwWzBdKSB7CisJY2FzZSAxOglzcC0+dHhfZGVsYXkgPSBwWzFdOworCQlyZXR1cm47CisJY2FzZSAyOglzcC0+cGVyc2lzdGVuY2UgPSBwWzFdOworCQlyZXR1cm47CisJY2FzZSAzOglzcC0+c2xvdHRpbWUgPSBwWzFdOworCQlyZXR1cm47CisJY2FzZSA0OgkvKiBpZ25vcmVkICovCisJCXJldHVybjsKKwljYXNlIDU6CXNwLT5kdXBsZXggPSBwWzFdOworCQlyZXR1cm47CisJfQorCisJaWYgKHBbMF0gIT0gMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJbiBjYXNlIG9mIGZ1bGxkdXBsZXggb3IgREFNQSBvcGVyYXRpb24sIHdlIGRvbid0IHRha2UgY2FyZSBhYm91dCB0aGUKKwkgKiBzdGF0ZSBvZiB0aGUgRENEIG9yIG9mIGFueSB0aW1lcnMsIGFzIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHRoZQorCSAqIGNvcnJlY3QgdGltZSB0byBzZW5kIGlzIHRoZSBqb2Igb2YgdGhlIEFYLjI1IGxheWVyLiBXZSBzZW5kCisJICogaW1tZWRpYXRlbHkgYWZ0ZXIgZGF0YSBoYXMgYXJyaXZlZC4KKwkgKi8KKwlpZiAoc3AtPmR1cGxleCA9PSAxKSB7CisJCXNwLT5sZWRfc3RhdGUgPSAweDcwOworCQlzcC0+dHR5LT5kcml2ZXItPndyaXRlKHNwLT50dHksICZzcC0+bGVkX3N0YXRlLCAxKTsKKwkJc3AtPnR4X2VuYWJsZSA9IDE7CisJCWFjdHVhbCA9IHNwLT50dHktPmRyaXZlci0+d3JpdGUoc3AtPnR0eSwgc3AtPnhidWZmLCBjb3VudCk7CisJCXNwLT54bGVmdCA9IGNvdW50IC0gYWN0dWFsOworCQlzcC0+eGhlYWQgPSBzcC0+eGJ1ZmYgKyBhY3R1YWw7CisJCXNwLT5sZWRfc3RhdGUgPSAweDYwOworCQlzcC0+dHR5LT5kcml2ZXItPndyaXRlKHNwLT50dHksICZzcC0+bGVkX3N0YXRlLCAxKTsKKwl9IGVsc2UgeworCQlzcC0+eGxlZnQgPSBjb3VudDsKKwkJc3AtPnhoZWFkID0gc3AtPnhidWZmOworCQlzcC0+c3RhdHVzMiA9IGNvdW50OworCQlpZiAoc3AtPmR1cGxleCA9PSAwKQorCQkJc3Bfc3RhcnRfdHhfdGltZXIoc3ApOworCX0KKworCXJldHVybjsKKworb3V0X2Ryb3A6CisJc3AtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwluZXRpZl9zdGFydF9xdWV1ZShzcC0+ZGV2KTsKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzIC0gZHJvcHBlZC5cbiIsIHNwLT5kZXYtPm5hbWUsIG1zZyk7Cit9CisKKy8qIEVuY2Fwc3VsYXRlIGFuIElQIGRhdGFncmFtIGFuZCBraWNrIGl0IGludG8gYSBUVFkgcXVldWUuICovCisKK3N0YXRpYyBpbnQgc3BfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXhwYWNrICpzcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfYmgoJnNwLT5sb2NrKTsKKwkvKiBXZSB3ZXJlIG5vdCBidXN5LCBzbyB3ZSBhcmUgbm93Li4uIDotKSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzcC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJc3BfZW5jYXBzKHNwLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlzcGluX3VubG9ja19iaCgmc3AtPmxvY2spOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3Bfb3Blbl9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2l4cGFjayAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHNwLT50dHkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKKy8qIENsb3NlIHRoZSBsb3ctbGV2ZWwgcGFydCBvZiB0aGUgNnBhY2sgY2hhbm5lbC4gKi8KK3N0YXRpYyBpbnQgc3BfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2l4cGFjayAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2JoKCZzcC0+bG9jayk7CisJaWYgKHNwLT50dHkpIHsKKwkJLyogVFRZIGRpc2NpcGxpbmUgaXMgcnVubmluZy4gKi8KKwkJY2xlYXJfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZzcC0+dHR5LT5mbGFncyk7CisJfQorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzcGluX3VubG9ja19iaCgmc3AtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB0aGUgZnJhbWUgdHlwZSBJRCAqLworc3RhdGljIGludCBzcF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGxlbikKK3sKKyNpZmRlZiBDT05GSUdfSU5FVAorCWlmICh0eXBlICE9IGh0b25zKEVUSF9QX0FYMjUpKQorCQlyZXR1cm4gYXgyNV9lbmNhcHN1bGF0ZShza2IsIGRldiwgdHlwZSwgZGFkZHIsIHNhZGRyLCBsZW4pOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3BfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpeHBhY2sgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJnNwLT5zdGF0czsKK30KKworc3RhdGljIGludCBzcF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfYXgyNSAqc2EgPSBhZGRyOworCisJaWYgKHNhLT5zYXgyNV9mYW1pbHkgIT0gQUZfQVgyNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXNhLT5zYXgyNV9uZGlnaXMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmZGV2LT54bWl0X2xvY2spOworCW1lbWNweShkZXYtPmRldl9hZGRyLCAmc2EtPnNheDI1X2NhbGwsIEFYMjVfQUREUl9MRU4pOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT54bWl0X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyNpZmRlZiBDT05GSUdfSU5FVAorCXJldHVybiBheDI1X3JlYnVpbGRfaGVhZGVyKHNrYik7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHNwX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RhdGljIGNoYXIgYXgyNV9iY2FzdFtBWDI1X0FERFJfTEVOXSA9CisJCXsnUSc8PDEsJ1MnPDwxLCdUJzw8MSwnICc8PDEsJyAnPDwxLCcgJzw8MSwnMCc8PDF9OworCXN0YXRpYyBjaGFyIGF4MjVfdGVzdFtBWDI1X0FERFJfTEVOXSA9CisJCXsnTCc8PDEsJ0knPDwxLCdOJzw8MSwnVSc8PDEsJ1gnPDwxLCcgJzw8MSwnMSc8PDF9OworCisJLyogRmluaXNoIHNldHRpbmcgdXAgdGhlIERFVklDRSBpbmZvLiAqLworCWRldi0+bXR1CQk9IFNJWFBfTVRVOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gc3BfeG1pdDsKKwlkZXYtPm9wZW4JCT0gc3Bfb3Blbl9kZXY7CisJZGV2LT5kZXN0cnVjdG9yCQk9IGZyZWVfbmV0ZGV2OworCWRldi0+c3RvcAkJPSBzcF9jbG9zZTsKKwlkZXYtPmhhcmRfaGVhZGVyCT0gc3BfaGVhZGVyOworCWRldi0+Z2V0X3N0YXRzCSAgICAgICAgPSBzcF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgICAgPSBzcF9zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSBBWDI1X01BWF9IRUFERVJfTEVOOworCWRldi0+YWRkcl9sZW4JCT0gQVgyNV9BRERSX0xFTjsKKwlkZXYtPnR5cGUJCT0gQVJQSFJEX0FYMjU7CisJZGV2LT50eF9xdWV1ZV9sZW4JPSAxMDsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyCT0gc3BfcmVidWlsZF9oZWFkZXI7CisJZGV2LT50eF90aW1lb3V0CQk9IE5VTEw7CisKKwkvKiBPbmx5IGFjdGl2YXRlZCBpbiBBWC4yNSBtb2RlICovCisJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCBheDI1X2JjYXN0LCBBWDI1X0FERFJfTEVOKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYXgyNV90ZXN0LCBBWDI1X0FERFJfTEVOKTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWRldi0+ZmxhZ3MJCT0gMDsKK30KKworLyogU2VuZCBvbmUgY29tcGxldGVseSBkZWNhcHN1bGF0ZWQgSVAgZGF0YWdyYW0gdG8gdGhlIElQIGxheWVyLiAqLworCisvKgorICogVGhpcyBpcyB0aGUgcm91dGluZSB0aGF0IHNlbmRzIHRoZSByZWNlaXZlZCBkYXRhIHRvIHRoZSBrZXJuZWwgQVguMjUuCisgKiAnY21kJyBpcyB0aGUgS0lTUyBjb21tYW5kLiBGb3IgQVguMjUgZGF0YSwgaXQgaXMgemVyby4KKyAqLworCitzdGF0aWMgdm9pZCBzcF9idW1wKHN0cnVjdCBzaXhwYWNrICpzcCwgY2hhciBjbWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgY2hhciAqcHRyOworCisJY291bnQgPSBzcC0+cmNvdW50ICsgMTsKKworCXNwLT5zdGF0cy5yeF9ieXRlcyArPSBjb3VudDsKKworCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYihjb3VudCkpID09IE5VTEwpCisJCWdvdG8gb3V0X21lbTsKKworCXNrYi0+ZGV2ID0gc3AtPmRldjsKKwlwdHIgPSBza2JfcHV0KHNrYiwgY291bnQpOworCSpwdHIrKyA9IGNtZDsJLyogS0lTUyBjb21tYW5kICovCisKKwltZW1jcHkocHRyLCBzcC0+Y29va2VkX2J1ZiArIDEsIGNvdW50KTsKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0FYMjUpOworCW5ldGlmX3J4KHNrYik7CisJc3AtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJc3AtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKworCXJldHVybjsKKworb3V0X21lbToKKwlzcC0+c3RhdHMucnhfZHJvcHBlZCsrOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBXZSBoYXZlIGEgcG90ZW50aWFsIHJhY2Ugb24gZGVyZWZlcmVuY2luZyB0dHktPmRpc2NfZGF0YSwgYmVjYXVzZSB0aGUgdHR5CisgKiBsYXllciBwcm92aWRlcyBubyBsb2NraW5nIGF0IGFsbCAtIHRodXMgb25lIGNwdSBjb3VsZCBiZSBydW5uaW5nCisgKiBzaXhwYWNrX3JlY2VpdmVfYnVmIHdoaWxlIGFub3RoZXIgY2FsbHMgc2l4cGFja19jbG9zZSwgd2hpY2ggemVyb2VzCisgKiB0dHktPmRpc2NfZGF0YSBhbmQgZnJlZXMgdGhlIG1lbW9yeSB0aGF0IHNpeHBhY2tfcmVjZWl2ZV9idWYgaXMgdXNpbmcuICBUaGUKKyAqIGJlc3Qgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHVzZSBhIHJ3bG9jayBpbiB0aGUgdHR5IHN0cnVjdCwgYnV0IGZvciBub3cgd2UKKyAqIHVzZSBhIHNpbmdsZSBnbG9iYWwgcndsb2NrIGZvciBhbGwgdHR5cyBpbiBwcHAgbGluZSBkaXNjaXBsaW5lLgorICovCitzdGF0aWMgREVGSU5FX1JXTE9DSyhkaXNjX2RhdGFfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorc3RhdGljIHN0cnVjdCBzaXhwYWNrICpzcF9nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc2l4cGFjayAqc3A7CisKKwlyZWFkX2xvY2soJmRpc2NfZGF0YV9sb2NrKTsKKwlzcCA9IHR0eS0+ZGlzY19kYXRhOworCWlmIChzcCkKKwkJYXRvbWljX2luYygmc3AtPnJlZmNudCk7CisJcmVhZF91bmxvY2soJmRpc2NfZGF0YV9sb2NrKTsKKworCXJldHVybiBzcDsKK30KKworc3RhdGljIHZvaWQgc3BfcHV0KHN0cnVjdCBzaXhwYWNrICpzcCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc3AtPnJlZmNudCkpCisJCXVwKCZzcC0+ZGVhZF9zZW0pOworfQorCisvKgorICogQ2FsbGVkIGJ5IHRoZSBUVFkgZHJpdmVyIHdoZW4gdGhlcmUncyByb29tIGZvciBtb3JlIGRhdGEuICBJZiB3ZSBoYXZlCisgKiBtb3JlIHBhY2tldHMgdG8gc2VuZCwgd2Ugc2VuZCB0aGVtIGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkIHNpeHBhY2tfd3JpdGVfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHNpeHBhY2sgKnNwID0gc3BfZ2V0KHR0eSk7CisJaW50IGFjdHVhbDsKKworCWlmICghc3ApCisJCXJldHVybjsKKwlpZiAoc3AtPnhsZWZ0IDw9IDApICB7CisJCS8qIE5vdyBzZXJpYWwgYnVmZmVyIGlzIGFsbW9zdCBmcmVlICYgd2UgY2FuIHN0YXJ0CisJCSAqIHRyYW5zbWlzc2lvbiBvZiBhbm90aGVyIHBhY2tldCAqLworCQlzcC0+c3RhdHMudHhfcGFja2V0cysrOworCQljbGVhcl9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnR0eS0+ZmxhZ3MpOworCQlzcC0+dHhfZW5hYmxlID0gMDsKKwkJbmV0aWZfd2FrZV9xdWV1ZShzcC0+ZGV2KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHNwLT50eF9lbmFibGUpIHsKKwkJYWN0dWFsID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgc3AtPnhoZWFkLCBzcC0+eGxlZnQpOworCQlzcC0+eGxlZnQgLT0gYWN0dWFsOworCQlzcC0+eGhlYWQgKz0gYWN0dWFsOworCX0KKworb3V0OgorCXNwX3B1dChzcCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgc2l4cGFja19yZWNlaXZlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm4gNjU1MzY7ICAvKiBXZSBjYW4gaGFuZGxlIGFuIGluZmluaXRlIGFtb3VudCBvZiBkYXRhLiA6LSkgKi8KK30KKworLyoKKyAqIEhhbmRsZSB0aGUgJ3JlY2VpdmVyIGRhdGEgcmVhZHknIGludGVycnVwdC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSAndHR5X2lvJyBtb2R1bGUgaW4gdGhlIGtlcm5lbCB3aGVuCisgKiBhIGJsb2NrIG9mIDZwYWNrIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQsIHdoaWNoIGNhbiBub3cgYmUgZGVjYXBzdWxhdGVkCisgKiBhbmQgc2VudCBvbiB0byBzb21lIElQIGxheWVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHNpeHBhY2tfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgY2hhciAqZnAsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2l4cGFjayAqc3A7CisJdW5zaWduZWQgY2hhciBidWZbNTEyXTsKKwlpbnQgY291bnQxOworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuOworCisJc3AgPSBzcF9nZXQodHR5KTsKKwlpZiAoIXNwKQorCQlyZXR1cm47CisKKwltZW1jcHkoYnVmLCBjcCwgY291bnQgPCBzaXplb2YoYnVmKSA/IGNvdW50IDogc2l6ZW9mKGJ1ZikpOworCisJLyogUmVhZCB0aGUgY2hhcmFjdGVycyBvdXQgb2YgdGhlIGJ1ZmZlciAqLworCisJY291bnQxID0gY291bnQ7CisJd2hpbGUgKGNvdW50KSB7CisJCWNvdW50LS07CisJCWlmIChmcCAmJiAqZnArKykgeworCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNJWFBGX0VSUk9SLCAmc3AtPmZsYWdzKSkKKwkJCQlzcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlzaXhwYWNrX2RlY29kZShzcCwgYnVmLCBjb3VudDEpOworCisJc3BfcHV0KHNwKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKQorCSAgICAmJiB0dHktPmRyaXZlci0+dW50aHJvdHRsZSkKKwkJdHR5LT5kcml2ZXItPnVudGhyb3R0bGUodHR5KTsKK30KKworLyoKKyAqIFRyeSB0byByZXN5bmMgdGhlIFROQy4gQ2FsbGVkIGJ5IHRoZSByZXN5bmMgdGltZXIgZGVmaW5lZCBpbgorICogZGVjb2RlX3ByaW9fY29tbWFuZAorICovCisKKyNkZWZpbmUgVE5DX1VOSU5JVElBTElaRUQJMAorI2RlZmluZSBUTkNfVU5TWU5DX1NUQVJUVVAJMQorI2RlZmluZSBUTkNfVU5TWU5DRUQJCTIKKyNkZWZpbmUgVE5DX0lOX1NZTkMJCTMKKworc3RhdGljIHZvaWQgX190bmNfc2V0X3N5bmNfc3RhdGUoc3RydWN0IHNpeHBhY2sgKnNwLCBpbnQgbmV3X3RuY19zdGF0ZSkKK3sKKwljaGFyICptc2c7CisKKwlzd2l0Y2ggKG5ld190bmNfc3RhdGUpIHsKKwlkZWZhdWx0OgkJCS8qIGdjYyBvaCBwaWVjZS1vLWNyYXAgLi4uICovCisJY2FzZSBUTkNfVU5TWU5DX1NUQVJUVVA6CisJCW1zZyA9ICJTeW5jaHJvbml6aW5nIHdpdGggVE5DIjsKKwkJYnJlYWs7CisJY2FzZSBUTkNfVU5TWU5DRUQ6CisJCW1zZyA9ICJMb3N0IHN5bmNocm9uaXphdGlvbiB3aXRoIFROQ1xuIjsKKwkJYnJlYWs7CisJY2FzZSBUTkNfSU5fU1lOQzoKKwkJbXNnID0gIkZvdW5kIFROQyI7CisJCWJyZWFrOworCX0KKworCXNwLT50bmNfc3RhdGUgPSBuZXdfdG5jX3N0YXRlOworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlc1xuIiwgc3AtPmRldi0+bmFtZSwgbXNnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRuY19zZXRfc3luY19zdGF0ZShzdHJ1Y3Qgc2l4cGFjayAqc3AsIGludCBuZXdfdG5jX3N0YXRlKQoreworCWludCBvbGRfdG5jX3N0YXRlID0gc3AtPnRuY19zdGF0ZTsKKworCWlmIChvbGRfdG5jX3N0YXRlICE9IG5ld190bmNfc3RhdGUpCisJCV9fdG5jX3NldF9zeW5jX3N0YXRlKHNwLCBuZXdfdG5jX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQgcmVzeW5jX3RuYyh1bnNpZ25lZCBsb25nIGNoYW5uZWwpCit7CisJc3RydWN0IHNpeHBhY2sgKnNwID0gKHN0cnVjdCBzaXhwYWNrICopIGNoYW5uZWw7CisJc3RhdGljIGNoYXIgcmVzeW5jX2NtZCA9IDB4ZTg7CisKKwkvKiBjbGVhciBhbnkgZGF0YSB0aGF0IG1pZ2h0IGhhdmUgYmVlbiByZWNlaXZlZCAqLworCisJc3AtPnJ4X2NvdW50ID0gMDsKKwlzcC0+cnhfY291bnRfY29va2VkID0gMDsKKworCS8qIHJlc2V0IHN0YXRlIG1hY2hpbmUgKi8KKworCXNwLT5zdGF0dXMgPSAxOworCXNwLT5zdGF0dXMxID0gMTsKKwlzcC0+c3RhdHVzMiA9IDA7CisKKwkvKiByZXN5bmMgdGhlIFROQyAqLworCisJc3AtPmxlZF9zdGF0ZSA9IDB4NjA7CisJc3AtPnR0eS0+ZHJpdmVyLT53cml0ZShzcC0+dHR5LCAmc3AtPmxlZF9zdGF0ZSwgMSk7CisJc3AtPnR0eS0+ZHJpdmVyLT53cml0ZShzcC0+dHR5LCAmcmVzeW5jX2NtZCwgMSk7CisKKworCS8qIFN0YXJ0IHJlc3luYyB0aW1lciBhZ2FpbiAtLSB0aGUgVE5DIG1pZ2h0IGJlIHN0aWxsIGFic2VudCAqLworCisJZGVsX3RpbWVyKCZzcC0+cmVzeW5jX3QpOworCXNwLT5yZXN5bmNfdC5kYXRhCT0gKHVuc2lnbmVkIGxvbmcpIHNwOworCXNwLT5yZXN5bmNfdC5mdW5jdGlvbgk9IHJlc3luY190bmM7CisJc3AtPnJlc3luY190LmV4cGlyZXMJPSBqaWZmaWVzICsgU0lYUF9SRVNZTkNfVElNRU9VVDsKKwlhZGRfdGltZXIoJnNwLT5yZXN5bmNfdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRuY19pbml0KHN0cnVjdCBzaXhwYWNrICpzcCkKK3sKKwl1bnNpZ25lZCBjaGFyIGluYnl0ZSA9IDB4ZTg7CisKKwl0bmNfc2V0X3N5bmNfc3RhdGUoc3AsIFROQ19VTlNZTkNfU1RBUlRVUCk7CisKKwlzcC0+dHR5LT5kcml2ZXItPndyaXRlKHNwLT50dHksICZpbmJ5dGUsIDEpOworCisJZGVsX3RpbWVyKCZzcC0+cmVzeW5jX3QpOworCXNwLT5yZXN5bmNfdC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHNwOworCXNwLT5yZXN5bmNfdC5mdW5jdGlvbiA9IHJlc3luY190bmM7CisJc3AtPnJlc3luY190LmV4cGlyZXMgPSBqaWZmaWVzICsgU0lYUF9SRVNZTkNfVElNRU9VVDsKKwlhZGRfdGltZXIoJnNwLT5yZXN5bmNfdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE9wZW4gdGhlIGhpZ2gtbGV2ZWwgcGFydCBvZiB0aGUgNnBhY2sgY2hhbm5lbC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBUVFkgbW9kdWxlIHdoZW4gdGhlCisgKiA2cGFjayBsaW5lIGRpc2NpcGxpbmUgaXMgY2FsbGVkIGZvci4gIEJlY2F1c2Ugd2UgYXJlCisgKiBzdXJlIHRoZSB0dHkgbGluZSBleGlzdHMsIHdlIG9ubHkgaGF2ZSB0byBsaW5rIGl0IHRvCisgKiBhIGZyZWUgNnBjYWNrIGNoYW5uZWwuLi4KKyAqLworc3RhdGljIGludCBzaXhwYWNrX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwljaGFyICpyYnVmZiA9IE5VTEwsICp4YnVmZiA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc2l4cGFjayAqc3A7CisJdW5zaWduZWQgbG9uZyBsZW47CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBzaXhwYWNrKSwgInNwJWQiLCBzcF9zZXR1cCk7CisJaWYgKCFkZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXNwLT5kZXYgPSBkZXY7CisKKwlzcGluX2xvY2tfaW5pdCgmc3AtPmxvY2spOworCWF0b21pY19zZXQoJnNwLT5yZWZjbnQsIDEpOworCWluaXRfTVVURVhfTE9DS0VEKCZzcC0+ZGVhZF9zZW0pOworCisJLyogISEhIGxlbmd0aCBvZiB0aGUgYnVmZmVycy4gTVRVIGlzIElQIE1UVSwgbm90IFBBQ0xFTiEgICovCisKKwlsZW4gPSBkZXYtPm10dSAqIDI7CisKKwlyYnVmZiA9IGttYWxsb2MobGVuICsgNCwgR0ZQX0tFUk5FTCk7CisJeGJ1ZmYgPSBrbWFsbG9jKGxlbiArIDQsIEdGUF9LRVJORUwpOworCisJaWYgKHJidWZmID09IE5VTEwgfHwgeGJ1ZmYgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PQlVGUzsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlzcGluX2xvY2tfYmgoJnNwLT5sb2NrKTsKKworCXNwLT50dHkgPSB0dHk7CisKKwlzcC0+cmJ1ZmYJPSByYnVmZjsKKwlzcC0+eGJ1ZmYJPSB4YnVmZjsKKworCXNwLT5tdHUJCT0gQVgyNV9NVFUgKyA3MzsKKwlzcC0+YnVmZnNpemUJPSBsZW47CisJc3AtPnJjb3VudAk9IDA7CisJc3AtPnJ4X2NvdW50CT0gMDsKKwlzcC0+cnhfY291bnRfY29va2VkID0gMDsKKwlzcC0+eGxlZnQJPSAwOworCisJc3AtPmZsYWdzCT0gMDsJCS8qIENsZWFyIEVTQ0FQRSAmIEVSUk9SIGZsYWdzICovCisKKwlzcC0+ZHVwbGV4CT0gMDsKKwlzcC0+dHhfZGVsYXkgICAgPSBTSVhQX1RYREVMQVk7CisJc3AtPnBlcnNpc3RlbmNlID0gU0lYUF9QRVJTSVNUOworCXNwLT5zbG90dGltZSAgICA9IFNJWFBfU0xPVFRJTUU7CisJc3AtPmxlZF9zdGF0ZSAgID0gMHg2MDsKKwlzcC0+c3RhdHVzICAgICAgPSAxOworCXNwLT5zdGF0dXMxICAgICA9IDE7CisJc3AtPnN0YXR1czIgICAgID0gMDsKKwlzcC0+dHhfZW5hYmxlICAgPSAwOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCWluaXRfdGltZXIoJnNwLT50eF90KTsKKwlpbml0X3RpbWVyKCZzcC0+cmVzeW5jX3QpOworCisJc3Bpbl91bmxvY2tfYmgoJnNwLT5sb2NrKTsKKworCS8qIERvbmUuICBXZSBoYXZlIGxpbmtlZCB0aGUgVFRZIGxpbmUgdG8gYSBjaGFubmVsLiAqLworCXR0eS0+ZGlzY19kYXRhID0gc3A7CisKKwkvKiBOb3cgd2UncmUgcmVhZHkgdG8gcmVnaXN0ZXIuICovCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKQorCQlnb3RvIG91dF9mcmVlOworCisJdG5jX2luaXQoc3ApOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlOgorCWtmcmVlKHhidWZmKTsKKwlrZnJlZShyYnVmZik7CisKKwlpZiAoZGV2KQorCQlmcmVlX25ldGRldihkZXYpOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworCisvKgorICogQ2xvc2UgZG93biBhIDZwYWNrIGNoYW5uZWwuCisgKiBUaGlzIG1lYW5zIGZsdXNoaW5nIG91dCBhbnkgcGVuZGluZyBxdWV1ZXMsIGFuZCB0aGVuIHJlc3RvcmluZyB0aGUKKyAqIFRUWSBsaW5lIGRpc2NpcGxpbmUgdG8gd2hhdCBpdCB3YXMgYmVmb3JlIGl0IGdvdCBob29rZWQgdG8gNnBhY2sKKyAqICh3aGljaCB1c3VhbGx5IGlzIFRUWSBhZ2FpbikuCisgKi8KK3N0YXRpYyB2b2lkIHNpeHBhY2tfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc2l4cGFjayAqc3A7CisKKwl3cml0ZV9sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisJc3AgPSB0dHktPmRpc2NfZGF0YTsKKwl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CisJd3JpdGVfdW5sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisJaWYgKHNwID09IDApCisJCXJldHVybjsKKworCS8qCisJICogV2UgaGF2ZSBub3cgZW5zdXJlZCB0aGF0IG5vYm9keSBjYW4gc3RhcnQgdXNpbmcgYXAgZnJvbSBub3cgb24sIGJ1dAorCSAqIHdlIGhhdmUgdG8gd2FpdCBmb3IgYWxsIGV4aXN0aW5nIHVzZXJzIHRvIGZpbmlzaC4KKwkgKi8KKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJnNwLT5yZWZjbnQpKQorCQlkb3duKCZzcC0+ZGVhZF9zZW0pOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoc3AtPmRldik7CisKKwlkZWxfdGltZXIoJnNwLT50eF90KTsKKwlkZWxfdGltZXIoJnNwLT5yZXN5bmNfdCk7CisKKwkvKiBGcmVlIGFsbCA2cGFjayBmcmFtZSBidWZmZXJzLiAqLworCWtmcmVlKHNwLT5yYnVmZik7CisJa2ZyZWUoc3AtPnhidWZmKTsKK30KKworLyogUGVyZm9ybSBJL08gY29udHJvbCBvbiBhbiBhY3RpdmUgNnBhY2sgY2hhbm5lbC4gKi8KK3N0YXRpYyBpbnQgc2l4cGFja19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc2l4cGFjayAqc3AgPSBzcF9nZXQodHR5KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3AtPmRldjsKKwl1bnNpZ25lZCBpbnQgdG1wLCBlcnI7CisKKwlpZiAoIXNwKQorCQlyZXR1cm4gLUVOWElPOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU0lPQ0dJRk5BTUU6CisJCWVyciA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgYXJnLCBkZXYtPm5hbWUsCisJCSAgICAgICAgICAgICAgICAgICBzdHJsZW4oZGV2LT5uYW1lKSArIDEpID8gLUVGQVVMVCA6IDA7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lGRU5DQVA6CisJCWVyciA9IHB1dF91c2VyKDAsIChpbnQgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lGRU5DQVA6CisJCWlmIChnZXRfdXNlcih0bXAsIChpbnQgX191c2VyICopIGFyZykpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXNwLT5tb2RlID0gdG1wOworCQlkZXYtPmFkZHJfbGVuICAgICAgICA9IEFYMjVfQUREUl9MRU47CisJCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gQVgyNV9LSVNTX0hFQURFUl9MRU4gKworCQkgICAgICAgICAgICAgICAgICAgICAgIEFYMjVfTUFYX0hFQURFUl9MRU4gKyAzOworCQlkZXYtPnR5cGUgICAgICAgICAgICA9IEFSUEhSRF9BWDI1OworCisJCWVyciA9IDA7CisJCWJyZWFrOworCisJIGNhc2UgU0lPQ1NJRkhXQUREUjogeworCQljaGFyIGFkZHJbQVgyNV9BRERSX0xFTl07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhZGRyLAorCQkgICAgICAgICAgICAgICAgICAgKHZvaWQgX191c2VyICopIGFyZywgQVgyNV9BRERSX0xFTikpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXNwaW5fbG9ja19pcnEoJmRldi0+eG1pdF9sb2NrKTsKKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICZhZGRyLCBBWDI1X0FERFJfTEVOKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnhtaXRfbG9jayk7CisKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJfQorCisJLyogQWxsb3cgc3R0eSB0byByZWFkLCBidXQgbm90IHNldCwgdGhlIHNlcmlhbCBwb3J0ICovCisJY2FzZSBUQ0dFVFM6CisJY2FzZSBUQ0dFVEE6CisJCWVyciA9IG5fdHR5X2lvY3RsKHR0eSwgKHN0cnVjdCBmaWxlICopIGZpbGUsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PSU9DVExDTUQ7CisJfQorCisJc3BfcHV0KHNwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2xkaXNjIHNwX2xkaXNjID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubWFnaWMJCT0gVFRZX0xESVNDX01BR0lDLAorCS5uYW1lCQk9ICI2cGFjayIsCisJLm9wZW4JCT0gc2l4cGFja19vcGVuLAorCS5jbG9zZQkJPSBzaXhwYWNrX2Nsb3NlLAorCS5pb2N0bAkJPSBzaXhwYWNrX2lvY3RsLAorCS5yZWNlaXZlX2J1Zgk9IHNpeHBhY2tfcmVjZWl2ZV9idWYsCisJLnJlY2VpdmVfcm9vbQk9IHNpeHBhY2tfcmVjZWl2ZV9yb29tLAorCS53cml0ZV93YWtldXAJPSBzaXhwYWNrX3dyaXRlX3dha2V1cCwKK307CisKKy8qIEluaXRpYWxpemUgNnBhY2sgY29udHJvbCBkZXZpY2UgLS0gcmVnaXN0ZXIgNnBhY2sgbGluZSBkaXNjaXBsaW5lICovCisKK3N0YXRpYyBjaGFyIG1zZ19iYW5uZXJbXSAgX19pbml0ZGF0YSA9IEtFUk5fSU5GTyBcCisJIkFYLjI1OiA2cGFjayBkcml2ZXIsICIgU0lYUEFDS19WRVJTSU9OICJcbiI7CitzdGF0aWMgY2hhciBtc2dfcmVnZmFpbFtdIF9faW5pdGRhdGEgPSBLRVJOX0VSUiAgXAorCSI2cGFjazogY2FuJ3QgcmVnaXN0ZXIgbGluZSBkaXNjaXBsaW5lIChlcnIgPSAlZClcbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IHNpeHBhY2tfaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCisJcHJpbnRrKG1zZ19iYW5uZXIpOworCisJLyogUmVnaXN0ZXIgdGhlIHByb3ZpZGVkIGxpbmUgcHJvdG9jb2wgZGlzY2lwbGluZSAqLworCWlmICgoc3RhdHVzID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fNlBBQ0ssICZzcF9sZGlzYykpICE9IDApCisJCXByaW50ayhtc2dfcmVnZmFpbCwgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIG1zZ191bnJlZ2ZhaWxbXSBfX2V4aXRkYXRhID0gS0VSTl9FUlIgXAorCSI2cGFjazogY2FuJ3QgdW5yZWdpc3RlciBsaW5lIGRpc2NpcGxpbmUgKGVyciA9ICVkKVxuIjsKKworc3RhdGljIHZvaWQgX19leGl0IHNpeHBhY2tfZXhpdF9kcml2ZXIodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKChyZXQgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl82UEFDSywgTlVMTCkpKQorCQlwcmludGsobXNnX3VucmVnZmFpbCwgcmV0KTsKK30KKworLyogZW5jb2RlIGFuIEFYLjI1IHBhY2tldCBpbnRvIDZwYWNrICovCisKK3N0YXRpYyBpbnQgZW5jb2RlX3NpeHBhY2sodW5zaWduZWQgY2hhciAqdHhfYnVmLCB1bnNpZ25lZCBjaGFyICp0eF9idWZfcmF3LAorCWludCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgdHhfZGVsYXkpCit7CisJaW50IGNvdW50ID0gMDsKKwl1bnNpZ25lZCBjaGFyIGNoZWNrc3VtID0gMCwgYnVmWzQwMF07CisJaW50IHJhd19jb3VudCA9IDA7CisKKwl0eF9idWZfcmF3W3Jhd19jb3VudCsrXSA9IFNJWFBfUFJJT19DTURfTUFTSyB8IFNJWFBfVFhfTUFTSzsKKwl0eF9idWZfcmF3W3Jhd19jb3VudCsrXSA9IFNJWFBfU0VPRjsKKworCWJ1ZlswXSA9IHR4X2RlbGF5OworCWZvciAoY291bnQgPSAxOyBjb3VudCA8IGxlbmd0aDsgY291bnQrKykKKwkJYnVmW2NvdW50XSA9IHR4X2J1Zltjb3VudF07CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBsZW5ndGg7IGNvdW50KyspCisJCWNoZWNrc3VtICs9IGJ1Zltjb3VudF07CisJYnVmW2xlbmd0aF0gPSAodW5zaWduZWQgY2hhcikgMHhmZiAtIGNoZWNrc3VtOworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDw9IGxlbmd0aDsgY291bnQrKykgeworCQlpZiAoKGNvdW50ICUgMykgPT0gMCkgeworCQkJdHhfYnVmX3Jhd1tyYXdfY291bnQrK10gPSAoYnVmW2NvdW50XSAmIDB4M2YpOworCQkJdHhfYnVmX3Jhd1tyYXdfY291bnRdID0gKChidWZbY291bnRdID4+IDIpICYgMHgzMCk7CisJCX0gZWxzZSBpZiAoKGNvdW50ICUgMykgPT0gMSkgeworCQkJdHhfYnVmX3Jhd1tyYXdfY291bnQrK10gfD0gKGJ1Zltjb3VudF0gJiAweDBmKTsKKwkJCXR4X2J1Zl9yYXdbcmF3X2NvdW50XSA9CSgoYnVmW2NvdW50XSA+PiAyKSAmIDB4M2MpOworCQl9IGVsc2UgeworCQkJdHhfYnVmX3Jhd1tyYXdfY291bnQrK10gfD0gKGJ1Zltjb3VudF0gJiAweDAzKTsKKwkJCXR4X2J1Zl9yYXdbcmF3X2NvdW50KytdID0gKGJ1Zltjb3VudF0gPj4gMik7CisJCX0KKwl9CisJaWYgKChsZW5ndGggJSAzKSAhPSAyKQorCQlyYXdfY291bnQrKzsKKwl0eF9idWZfcmF3W3Jhd19jb3VudCsrXSA9IFNJWFBfU0VPRjsKKwlyZXR1cm4gcmF3X2NvdW50OworfQorCisvKiBkZWNvZGUgNCBzaXhwYWNrLWVuY29kZWQgYnl0ZXMgaW50byAzIGRhdGEgYnl0ZXMgKi8KKworc3RhdGljIHZvaWQgZGVjb2RlX2RhdGEoc3RydWN0IHNpeHBhY2sgKnNwLCB1bnNpZ25lZCBjaGFyIGluYnl0ZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpidWY7CisKKwlpZiAoc3AtPnJ4X2NvdW50ICE9IDMpIHsKKwkJc3AtPnJhd19idWZbc3AtPnJ4X2NvdW50KytdID0gaW5ieXRlOworCisJCXJldHVybjsKKwl9CisKKwlidWYgPSBzcC0+cmF3X2J1ZjsKKwlzcC0+Y29va2VkX2J1ZltzcC0+cnhfY291bnRfY29va2VkKytdID0KKwkJYnVmWzBdIHwgKChidWZbMV0gPDwgMikgJiAweGMwKTsKKwlzcC0+Y29va2VkX2J1ZltzcC0+cnhfY291bnRfY29va2VkKytdID0KKwkJKGJ1ZlsxXSAmIDB4MGYpIHwgKChidWZbMl0gPDwgMikgJiAweGYwKTsKKwlzcC0+Y29va2VkX2J1ZltzcC0+cnhfY291bnRfY29va2VkKytdID0KKwkJKGJ1ZlsyXSAmIDB4MDMpIHwgKGluYnl0ZSA8PCAyKTsKKwlzcC0+cnhfY291bnQgPSAwOworfQorCisvKiBpZGVudGlmeSBhbmQgZXhlY3V0ZSBhIDZwYWNrIHByaW9yaXR5IGNvbW1hbmQgYnl0ZSAqLworCitzdGF0aWMgdm9pZCBkZWNvZGVfcHJpb19jb21tYW5kKHN0cnVjdCBzaXhwYWNrICpzcCwgdW5zaWduZWQgY2hhciBjbWQpCit7CisJdW5zaWduZWQgY2hhciBjaGFubmVsOworCWludCBhY3R1YWw7CisKKwljaGFubmVsID0gY21kICYgU0lYUF9DSE5fTUFTSzsKKwlpZiAoKGNtZCAmIFNJWFBfUFJJT19EQVRBX01BU0spICE9IDApIHsgICAgIC8qIGlkbGUgPyAqLworCisJLyogUlggYW5kIERDRCBmbGFncyBjYW4gb25seSBiZSBzZXQgaW4gdGhlIHNhbWUgcHJpbyBjb21tYW5kLAorCSAgIGlmIHRoZSBEQ0QgZmxhZyBoYXMgYmVlbiBzZXQgd2l0aG91dCB0aGUgUlggZmxhZyBpbiB0aGUgcHJldmlvdXMKKwkgICBwcmlvIGNvbW1hbmQuIElmIERDRCBoYXMgbm90IGJlZW4gc2V0IGJlZm9yZSwgc29tZXRoaW5nIGluIHRoZQorCSAgIHRyYW5zbWlzc2lvbiBoYXMgZ29uZSB3cm9uZy4gSW4gdGhpcyBjYXNlLCBSWCBhbmQgRENEIGFyZQorCSAgIGNsZWFyZWQgaW4gb3JkZXIgdG8gcHJldmVudCB0aGUgZGVjb2RlX2RhdGEgcm91dGluZSBmcm9tCisJICAgcmVhZGluZyBmdXJ0aGVyIGRhdGEgdGhhdCBtaWdodCBiZSBjb3JydXB0LiAqLworCisJCWlmICgoKHNwLT5zdGF0dXMgJiBTSVhQX0RDRF9NQVNLKSA9PSAwKSAmJgorCQkJKChjbWQgJiBTSVhQX1JYX0RDRF9NQVNLKSA9PSBTSVhQX1JYX0RDRF9NQVNLKSkgeworCQkJCWlmIChzcC0+c3RhdHVzICE9IDEpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICI2cGFjazogcHJvdG9jb2wgdmlvbGF0aW9uXG4iKTsKKwkJCQllbHNlCisJCQkJCXNwLT5zdGF0dXMgPSAwOworCQkJCWNtZCAmPSAhU0lYUF9SWF9EQ0RfTUFTSzsKKwkJfQorCQlzcC0+c3RhdHVzID0gY21kICYgU0lYUF9QUklPX0RBVEFfTUFTSzsKKwl9IGVsc2UgeyAvKiBvdXRwdXQgd2F0Y2hkb2cgY2hhciBpZiBpZGxlICovCisJCWlmICgoc3AtPnN0YXR1czIgIT0gMCkgJiYgKHNwLT5kdXBsZXggPT0gMSkpIHsKKwkJCXNwLT5sZWRfc3RhdGUgPSAweDcwOworCQkJc3AtPnR0eS0+ZHJpdmVyLT53cml0ZShzcC0+dHR5LCAmc3AtPmxlZF9zdGF0ZSwgMSk7CisJCQlzcC0+dHhfZW5hYmxlID0gMTsKKwkJCWFjdHVhbCA9IHNwLT50dHktPmRyaXZlci0+d3JpdGUoc3AtPnR0eSwgc3AtPnhidWZmLCBzcC0+c3RhdHVzMik7CisJCQlzcC0+eGxlZnQgLT0gYWN0dWFsOworCQkJc3AtPnhoZWFkICs9IGFjdHVhbDsKKwkJCXNwLT5sZWRfc3RhdGUgPSAweDYwOworCQkJc3AtPnN0YXR1czIgPSAwOworCisJCX0KKwl9CisKKwkvKiBuZWVkZWQgdG8gdHJpZ2dlciB0aGUgVE5DIHdhdGNoZG9nICovCisJc3AtPnR0eS0+ZHJpdmVyLT53cml0ZShzcC0+dHR5LCAmc3AtPmxlZF9zdGF0ZSwgMSk7CisKKyAgICAgICAgLyogaWYgdGhlIHN0YXRlIGJ5dGUgaGFzIGJlZW4gcmVjZWl2ZWQsIHRoZSBUTkMgaXMgcHJlc2VudCwKKyAgICAgICAgICAgc28gdGhlIHJlc3luYyB0aW1lciBjYW4gYmUgcmVzZXQuICovCisKKwlpZiAoc3AtPnRuY19zdGF0ZSA9PSBUTkNfSU5fU1lOQykgeworCQlkZWxfdGltZXIoJnNwLT5yZXN5bmNfdCk7CisJCXNwLT5yZXN5bmNfdC5kYXRhCT0gKHVuc2lnbmVkIGxvbmcpIHNwOworCQlzcC0+cmVzeW5jX3QuZnVuY3Rpb24JPSByZXN5bmNfdG5jOworCQlzcC0+cmVzeW5jX3QuZXhwaXJlcwk9IGppZmZpZXMgKyBTSVhQX0lOSVRfUkVTWU5DX1RJTUVPVVQ7CisJCWFkZF90aW1lcigmc3AtPnJlc3luY190KTsKKwl9CisKKwlzcC0+c3RhdHVzMSA9IGNtZCAmIFNJWFBfUFJJT19EQVRBX01BU0s7Cit9CisKKy8qIGlkZW50aWZ5IGFuZCBleGVjdXRlIGEgc3RhbmRhcmQgNnBhY2sgY29tbWFuZCBieXRlICovCisKK3N0YXRpYyB2b2lkIGRlY29kZV9zdGRfY29tbWFuZChzdHJ1Y3Qgc2l4cGFjayAqc3AsIHVuc2lnbmVkIGNoYXIgY21kKQoreworCXVuc2lnbmVkIGNoYXIgY2hlY2tzdW0gPSAwLCByZXN0ID0gMCwgY2hhbm5lbDsKKwlzaG9ydCBpOworCisJY2hhbm5lbCA9IGNtZCAmIFNJWFBfQ0hOX01BU0s7CisJc3dpdGNoIChjbWQgJiBTSVhQX0NNRF9NQVNLKSB7ICAgICAvKiBub3JtYWwgY29tbWFuZCAqLworCWNhc2UgU0lYUF9TRU9GOgorCQlpZiAoKHNwLT5yeF9jb3VudCA9PSAwKSAmJiAoc3AtPnJ4X2NvdW50X2Nvb2tlZCA9PSAwKSkgeworCQkJaWYgKChzcC0+c3RhdHVzICYgU0lYUF9SWF9EQ0RfTUFTSykgPT0KKwkJCQlTSVhQX1JYX0RDRF9NQVNLKSB7CisJCQkJc3AtPmxlZF9zdGF0ZSA9IDB4Njg7CisJCQkJc3AtPnR0eS0+ZHJpdmVyLT53cml0ZShzcC0+dHR5LCAmc3AtPmxlZF9zdGF0ZSwgMSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzcC0+bGVkX3N0YXRlID0gMHg2MDsKKwkJCS8qIGZpbGwgdHJhaWxpbmcgYnl0ZXMgd2l0aCB6ZXJvZXMgKi8KKwkJCXNwLT50dHktPmRyaXZlci0+d3JpdGUoc3AtPnR0eSwgJnNwLT5sZWRfc3RhdGUsIDEpOworCQkJcmVzdCA9IHNwLT5yeF9jb3VudDsKKwkJCWlmIChyZXN0ICE9IDApCisJCQkJIGZvciAoaSA9IHJlc3Q7IGkgPD0gMzsgaSsrKQorCQkJCQlkZWNvZGVfZGF0YShzcCwgMCk7CisJCQlpZiAocmVzdCA9PSAyKQorCQkJCXNwLT5yeF9jb3VudF9jb29rZWQgLT0gMjsKKwkJCWVsc2UgaWYgKHJlc3QgPT0gMykKKwkJCQlzcC0+cnhfY291bnRfY29va2VkIC09IDE7CisJCQlmb3IgKGkgPSAwOyBpIDwgc3AtPnJ4X2NvdW50X2Nvb2tlZDsgaSsrKQorCQkJCWNoZWNrc3VtICs9IHNwLT5jb29rZWRfYnVmW2ldOworCQkJaWYgKGNoZWNrc3VtICE9IFNJWFBfQ0hLU1VNKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIjZwYWNrOiBiYWQgY2hlY2tzdW0gJTIuMnhcbiIsIGNoZWNrc3VtKTsKKwkJCX0gZWxzZSB7CisJCQkJc3AtPnJjb3VudCA9IHNwLT5yeF9jb3VudF9jb29rZWQtMjsKKwkJCQlzcF9idW1wKHNwLCAwKTsKKwkJCX0KKwkJCXNwLT5yeF9jb3VudF9jb29rZWQgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgU0lYUF9UWF9VUlVOOiBwcmludGsoS0VSTl9ERUJVRyAiNnBhY2s6IFRYIHVuZGVycnVuXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBTSVhQX1JYX09SVU46IHByaW50ayhLRVJOX0RFQlVHICI2cGFjazogUlggb3ZlcnJ1blxuIik7CisJCWJyZWFrOworCWNhc2UgU0lYUF9SWF9CVUZfT1ZMOgorCQlwcmludGsoS0VSTl9ERUJVRyAiNnBhY2s6IFJYIGJ1ZmZlciBvdmVyZmxvd1xuIik7CisJfQorfQorCisvKiBkZWNvZGUgYSA2cGFjayBwYWNrZXQgKi8KKworc3RhdGljIHZvaWQKK3NpeHBhY2tfZGVjb2RlKHN0cnVjdCBzaXhwYWNrICpzcCwgdW5zaWduZWQgY2hhciAqcHJlX3JidWZmLCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgY2hhciBpbmJ5dGU7CisJaW50IGNvdW50MTsKKworCWZvciAoY291bnQxID0gMDsgY291bnQxIDwgY291bnQ7IGNvdW50MSsrKSB7CisJCWluYnl0ZSA9IHByZV9yYnVmZltjb3VudDFdOworCQlpZiAoaW5ieXRlID09IFNJWFBfRk9VTkRfVE5DKSB7CisJCQl0bmNfc2V0X3N5bmNfc3RhdGUoc3AsIFROQ19JTl9TWU5DKTsKKwkJCWRlbF90aW1lcigmc3AtPnJlc3luY190KTsKKwkJfQorCQlpZiAoKGluYnl0ZSAmIFNJWFBfUFJJT19DTURfTUFTSykgIT0gMCkKKwkJCWRlY29kZV9wcmlvX2NvbW1hbmQoc3AsIGluYnl0ZSk7CisJCWVsc2UgaWYgKChpbmJ5dGUgJiBTSVhQX1NURF9DTURfTUFTSykgIT0gMCkKKwkJCWRlY29kZV9zdGRfY29tbWFuZChzcCwgaW5ieXRlKTsKKwkJZWxzZSBpZiAoKHNwLT5zdGF0dXMgJiBTSVhQX1JYX0RDRF9NQVNLKSA9PSBTSVhQX1JYX0RDRF9NQVNLKQorCQkJZGVjb2RlX2RhdGEoc3AsIGluYnl0ZSk7CisJfQorfQorCitNT0RVTEVfQVVUSE9SKCJSYWxmIEJhZWNobGUgRE8xR1JCIDxyYWxmQGxpbnV4LW1pcHMub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCI2cGFjayBkcml2ZXIgZm9yIEFYLjI1Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTERJU0MoTl82UEFDSyk7CisKK21vZHVsZV9pbml0KHNpeHBhY2tfaW5pdF9kcml2ZXIpOworbW9kdWxlX2V4aXQoc2l4cGFja19leGl0X2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9LY29uZmlnIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDA2OGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vS2NvbmZpZwpAQCAtMCwwICsxLDE5MSBAQAorY29uZmlnIE1LSVNTCisJdHJpc3RhdGUgIlNlcmlhbCBwb3J0IEtJU1MgZHJpdmVyIgorCWRlcGVuZHMgb24gQVgyNSAmJiBCUk9LRU5fT05fU01QCisJLS0taGVscC0tLQorCSAgS0lTUyBpcyBhIHByb3RvY29sIHVzZWQgZm9yIHRoZSBleGNoYW5nZSBvZiBkYXRhIGJldHdlZW4gYSBjb21wdXRlcgorCSAgYW5kIGEgVGVybWluYWwgTm9kZSBDb250cm9sbGVyIChhIHNtYWxsIGVtYmVkZGVkIHN5c3RlbSBjb21tb25seQorCSAgdXNlZCBmb3IgbmV0d29ya2luZyBvdmVyIEFYLjI1IGFtYXRldXIgcmFkaW8gY29ubmVjdGlvbnM7IGl0CisJICBjb25uZWN0cyB0aGUgY29tcHV0ZXIncyBzZXJpYWwgcG9ydCB3aXRoIHRoZSByYWRpbydzIG1pY3JvcGhvbmUKKwkgIGlucHV0IGFuZCBzcGVha2VyIG91dHB1dCkuCisKKwkgIEFsdGhvdWdoIEtJU1MgaXMgbGVzcyBhZHZhbmNlZCB0aGFuIHRoZSA2cGFjayBwcm90b2NvbCwgaXQgaGFzCisJICB0aGUgYWR2YW50YWdlIHRoYXQgaXQgaXMgYWxyZWFkeSBzdXBwb3J0ZWQgYnkgbW9zdCBtb2Rlcm4gVE5DcworCSAgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBmaXJtd2FyZSB1cGdyYWRlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBta2lzcy4KKworY29uZmlnIDZQQUNLCisJdHJpc3RhdGUgIlNlcmlhbCBwb3J0IDZQQUNLIGRyaXZlciIKKwlkZXBlbmRzIG9uIEFYMjUgJiYgQlJPS0VOX09OX1NNUAorCS0tLWhlbHAtLS0KKwkgIDZwYWNrIGlzIGEgdHJhbnNtaXNzaW9uIHByb3RvY29sIGZvciB0aGUgZGF0YSBleGNoYW5nZSBiZXR3ZWVuIHlvdXIKKwkgIFBDIGFuZCB5b3VyIFROQyAodGhlIFRlcm1pbmFsIE5vZGUgQ29udHJvbGxlciBhY3RzIGFzIGEga2luZCBvZgorCSAgbW9kZW0gY29ubmVjdGluZyB5b3VyIGNvbXB1dGVyJ3Mgc2VyaWFsIHBvcnQgdG8geW91ciByYWRpbydzCisJICBtaWNyb3Bob25lIGlucHV0IGFuZCBzcGVha2VyIG91dHB1dCkuIFRoaXMgcHJvdG9jb2wgY2FuIGJlIHVzZWQgYXMKKwkgIGFuIGFsdGVybmF0aXZlIHRvIEtJU1MgZm9yIG5ldHdvcmtpbmcgb3ZlciBBWC4yNSBhbWF0ZXVyIHJhZGlvCisJICBjb25uZWN0aW9ucywgYnV0IGl0IGhhcyBzb21lIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHkuCisKKwkgIE5vdGUgdGhhdCB0aGlzIGRyaXZlciBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIG1pZ2h0IGNhdXNlCisJICBwcm9ibGVtcy4gRm9yIGRldGFpbHMgYWJvdXQgdGhlIGZlYXR1cmVzIGFuZCB0aGUgdXNhZ2Ugb2YgdGhlCisJICBkcml2ZXIsIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nLzZwYWNrLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDZwYWNrLgorCitjb25maWcgQlBRRVRIRVIKKwl0cmlzdGF0ZSAiQlBRIEV0aGVybmV0IGRyaXZlciIKKwlkZXBlbmRzIG9uIEFYMjUKKwloZWxwCisJICBBWC4yNSBpcyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgY29tcHV0ZXIgY29tbXVuaWNhdGlvbiBvdmVyIGFtYXRldXIKKwkgIHJhZGlvLiBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgYmUgYWJsZSB0byBzZW5kIGFuZCByZWNlaXZlIEFYLjI1CisJICB0cmFmZmljIG92ZXIgRXRoZXJuZXQgKGFsc28gY2FsbGVkICJCUFEgQVguMjUiKSwgd2hpY2ggY291bGQgYmUKKwkgIHVzZWZ1bCBpZiBzb21lIG90aGVyIGNvbXB1dGVyIG9uIHlvdXIgbG9jYWwgbmV0d29yayBoYXMgYSBkaXJlY3QKKwkgIGFtYXRldXIgcmFkaW8gY29ubmVjdGlvbi4KKworY29uZmlnIERNQVNDQworCXRyaXN0YXRlICJIaWdoLXNwZWVkIChETUEpIFNDQyBkcml2ZXIgZm9yIEFYLjI1IgorCWRlcGVuZHMgb24gSVNBICYmIEFYMjUgJiYgQlJPS0VOX09OX1NNUAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIGhpZ2gtc3BlZWQgU0NDIGJvYXJkcywgaS5lLiB0aG9zZSBzdXBwb3J0aW5nCisJICBETUEgb24gb25lIHBvcnQuIFlvdSB1c3VhbGx5IHVzZSB0aG9zZSBib2FyZHMgdG8gY29ubmVjdCB5b3VyCisJICBjb21wdXRlciB0byBhbiBhbWF0ZXVyIHJhZGlvIG1vZGVtIChzdWNoIGFzIHRoZSBXQTREU1kgNTZrYnBzCisJICBtb2RlbSksIGluIG9yZGVyIHRvIHNlbmQgYW5kIHJlY2VpdmUgQVguMjUgcGFja2V0IHJhZGlvIG5ldHdvcmsKKwkgIHRyYWZmaWMuCisKKwkgIEN1cnJlbnRseSwgdGhpcyBkcml2ZXIgc3VwcG9ydHMgT3R0YXdhIFBJL1BJMiwgUGFjY29tbS9HcmFjaWxpcworCSAgUGFja2VUd2luLCBhbmQgUzVTQ0MvRE1BIGJvYXJkcy4gVGhleSBhcmUgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS4KKwkgIElmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBjYXJkcywgc2F5IFkgaGVyZSBhbmQgcmVhZCB0aGUgQVgyNS1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBvcGVyYXRlIG11bHRpcGxlIGJvYXJkcyBzaW11bHRhbmVvdXNseS4gSWYgeW91CisJICBjb21waWxlIGl0IGFzIGEgbW9kdWxlIChieSBzYXlpbmcgTSBpbnN0ZWFkIG9mIFkpLCBpdCB3aWxsIGJlIGNhbGxlZAorCSAgZG1hc2NjLiBJZiB5b3UgZG9uJ3QgcGFzcyBhbnkgcGFyYW1ldGVyIHRvIHRoZSBkcml2ZXIsIGFsbAorCSAgcG9zc2libGUgSS9PIGFkZHJlc3NlcyBhcmUgcHJvYmVkLiBUaGlzIGNvdWxkIGlycml0YXRlIG90aGVyIGRldmljZXMKKwkgIHRoYXQgYXJlIGN1cnJlbnRseSBub3QgaW4gdXNlLiBZb3UgbWF5IHNwZWNpZnkgdGhlIGxpc3Qgb2YgYWRkcmVzc2VzCisJICB0byBiZSBwcm9iZWQgYnkgImRtYXNjYz1hZGRyMSxhZGRyMiwuLi4iICh3aGVuIGNvbXBpbGVkIGludG8gdGhlCisJICBrZXJuZWwgaW1hZ2UpIG9yICJpbz1hZGRyMSxhZGRyMiwuLi4iICh3aGVuIGxvYWRlZCBhcyBhIG1vZHVsZSkuIFRoZQorCSAgbmV0d29yayBpbnRlcmZhY2VzIHdpbGwgYmUgY2FsbGVkIGRtYXNjYzAgYW5kIGRtYXNjYzEgZm9yIHRoZSBib2FyZAorCSAgZGV0ZWN0ZWQgZmlyc3QsIGRtYXNjYzIgYW5kIGRtYXNjYzMgZm9yIHRoZSBzZWNvbmQgb25lLCBhbmQgc28gb24uCisKKwkgIEJlZm9yZSB5b3UgY29uZmlndXJlIGVhY2ggaW50ZXJmYWNlIHdpdGggaWZjb25maWcsIHlvdSBNVVNUIHNldAorCSAgY2VydGFpbiBwYXJhbWV0ZXJzLCBzdWNoIGFzIGNoYW5uZWwgYWNjZXNzIHRpbWluZywgY2xvY2sgbW9kZSwgYW5kCisJICBETUEgY2hhbm5lbC4gVGhpcyBpcyBhY2NvbXBsaXNoZWQgd2l0aCBhIHNtYWxsIHV0aWxpdHkgcHJvZ3JhbSwKKwkgIGRtYXNjY19jZmcsIGF2YWlsYWJsZSBhdAorCSAgPGh0dHA6Ly9jYWNvZm9uaXgubnQudHV3aWVuLmFjLmF0L35vZTFraWIvTGludXgvPi4gUGxlYXNlIGJlIHN1cmUgdG8KKwkgIGdldCBhdCBsZWFzdCB2ZXJzaW9uIDEuMjcgb2YgZG1hc2NjX2NmZywgYXMgb2xkZXIgdmVyc2lvbnMgd2lsbCBub3QKKwkgIHdvcmsgd2l0aCB0aGUgY3VycmVudCBkcml2ZXIuCisKK2NvbmZpZyBTQ0MKKwl0cmlzdGF0ZSAiWjg1MzAgU0NDIGRyaXZlciIKKwlkZXBlbmRzIG9uIElTQSAmJiBBWDI1CisJLS0taGVscC0tLQorCSAgVGhlc2UgY2FyZHMgYXJlIHVzZWQgdG8gY29ubmVjdCB5b3VyIExpbnV4IGJveCB0byBhbiBhbWF0ZXVyIHJhZGlvCisJICBpbiBvcmRlciB0byBjb21tdW5pY2F0ZSB3aXRoIG90aGVyIGNvbXB1dGVycy4gSWYgeW91IHdhbnQgdG8gdXNlCisJICB0aGlzLCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy96ODUzMGRydi50eHQ+IGFuZCB0aGUKKwkgIEFYMjUtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiBBbHNvIG1ha2Ugc3VyZSB0byBzYXkgWQorCSAgdG8gIkFtYXRldXIgUmFkaW8gQVguMjUgTGV2ZWwgMiIgc3VwcG9ydC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc2NjLgorCitjb25maWcgU0NDX0RFTEFZCisJYm9vbCAiYWRkaXRpb25hbCBkZWxheSBmb3IgUEEwSFpQIE9wdG9TQ0MgY29tcGF0aWJsZSBib2FyZHMiCisJZGVwZW5kcyBvbiBTQ0MKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zIHdpdGggdGhlIFNDQyBkcml2ZXIgbm90CisJICB3b3JraW5nIHByb3Blcmx5OyBwbGVhc2UgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3o4NTMwZHJ2LnR4dD4gZm9yIGRldGFpbHMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTQ0NfVFJYRUNITworCWJvb2wgInN1cHBvcnQgZm9yIFRSWCB0aGF0IGZlZWRiYWNrIHRoZSB0eCBzaWduYWwgdG8gcngiCisJZGVwZW5kcyBvbiBTQ0MKKwloZWxwCisJICBTb21lIHRyYW5zbWl0dGVycyBmZWVkIHRoZSB0cmFuc21pdHRlZCBzaWduYWwgYmFjayB0byB0aGUgcmVjZWl2ZQorCSAgbGluZS4gIFNheSBZIGhlcmUgdG8gZm9pbCB0aGlzIGJ5IGV4cGxpY2l0bHkgZGlzYWJsaW5nIHRoZSByZWNlaXZlcgorCSAgZHVyaW5nIGRhdGEgdHJhbnNtaXNzaW9uLgorCisJICBJZiBpbiBkb3VidCwgc2F5IFkuCisKK2NvbmZpZyBCQVlDT01fU0VSX0ZEWAorCXRyaXN0YXRlICJCQVlDT00gc2VyMTIgZnVsbGR1cGxleCBkcml2ZXIgZm9yIEFYLjI1IgorCWRlcGVuZHMgb24gQVgyNQorCXNlbGVjdCBDUkNfQ0NJVFQKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIG9uZSBvZiB0d28gZHJpdmVycyBmb3IgQmF5Y29tIHN0eWxlIHNpbXBsZSBhbWF0ZXVyIHJhZGlvCisJICBtb2RlbXMgdGhhdCBjb25uZWN0IHRvIGEgc2VyaWFsIGludGVyZmFjZS4gVGhlIGRyaXZlciBzdXBwb3J0cyB0aGUKKwkgIHNlcjEyIGRlc2lnbiBpbiBmdWxsLWR1cGxleCBtb2RlLiBJbiBhZGRpdGlvbiwgaXQgYWxsb3dzIHRoZQorCSAgYmF1ZHJhdGUgdG8gYmUgc2V0IGJldHdlZW4gMzAwIGFuZCA0ODAwIGJhdWQgKGhvd2V2ZXIgbm90IGFsbCBtb2RlbXMKKwkgIHN1cHBvcnQgYWxsIGJhdWRyYXRlcykuIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBkcml2ZXIuIFRoZSBuZXh0CisJICBkcml2ZXIsICJCQVlDT00gc2VyMTIgaGFsZi1kdXBsZXggZHJpdmVyIGZvciBBWC4yNSIgaXMgdGhlIG9sZAorCSAgZHJpdmVyIGFuZCBzdGlsbCBwcm92aWRlZCBpbiBjYXNlIHRoaXMgZHJpdmVyIGRvZXMgbm90IHdvcmsgd2l0aAorCSAgeW91ciBzZXJpYWwgaW50ZXJmYWNlIGNoaXAuIFRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyLCB1c2UgdGhlIHNldGhkbGMKKwkgIHV0aWxpdHkgYXZhaWxhYmxlIGluIHRoZSBzdGFuZGFyZCBheDI1IHV0aWxpdGllcyBwYWNrYWdlLiBGb3IKKwkgIGluZm9ybWF0aW9uIG9uIHRoZSBtb2RlbXMsIHNlZSA8aHR0cDovL3d3dy5iYXljb20uZGUvPiBhbmQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9iYXljb20udHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYmF5Y29tX3Nlcl9mZHguICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgQkFZQ09NX1NFUl9IRFgKKwl0cmlzdGF0ZSAiQkFZQ09NIHNlcjEyIGhhbGZkdXBsZXggZHJpdmVyIGZvciBBWC4yNSIKKwlkZXBlbmRzIG9uIEFYMjUKKwlzZWxlY3QgQ1JDX0NDSVRUCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBvbmUgb2YgdHdvIGRyaXZlcnMgZm9yIEJheWNvbSBzdHlsZSBzaW1wbGUgYW1hdGV1ciByYWRpbworCSAgbW9kZW1zIHRoYXQgY29ubmVjdCB0byBhIHNlcmlhbCBpbnRlcmZhY2UuIFRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlCisJICBzZXIxMiBkZXNpZ24gaW4gZnVsbC1kdXBsZXggbW9kZS4gVGhpcyBpcyB0aGUgb2xkIGRyaXZlci4gIEl0IGlzCisJICBzdGlsbCBwcm92aWRlZCBpbiBjYXNlIHlvdXIgc2VyaWFsIGludGVyZmFjZSBjaGlwIGRvZXMgbm90IHdvcmsgd2l0aAorCSAgdGhlIGZ1bGwtZHVwbGV4IGRyaXZlci4gVGhpcyBkcml2ZXIgaXMgZGVwcmVjaWF0ZWQuICBUbyBjb25maWd1cmUKKwkgIHRoZSBkcml2ZXIsIHVzZSB0aGUgc2V0aGRsYyB1dGlsaXR5IGF2YWlsYWJsZSBpbiB0aGUgc3RhbmRhcmQgYXgyNQorCSAgdXRpbGl0aWVzIHBhY2thZ2UuIEZvciBpbmZvcm1hdGlvbiBvbiB0aGUgbW9kZW1zLCBzZWUKKwkgIDxodHRwOi8vd3d3LmJheWNvbS5kZS8+IGFuZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JheWNvbS50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBiYXljb21fc2VyX2hkeC4gIFRoaXMgaXMgcmVjb21tZW5kZWQuCisKK2NvbmZpZyBCQVlDT01fUEFSCisJdHJpc3RhdGUgIkJBWUNPTSBwaWNwYXIgYW5kIHBhcjk2IGRyaXZlciBmb3IgQVguMjUiCisJZGVwZW5kcyBvbiBQQVJQT1JUICYmIEFYMjUKKwlzZWxlY3QgQ1JDX0NDSVRUCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgQmF5Y29tIHN0eWxlIHNpbXBsZSBhbWF0ZXVyIHJhZGlvIG1vZGVtcyB0aGF0CisJICBjb25uZWN0IHRvIGEgcGFyYWxsZWwgaW50ZXJmYWNlLiBUaGUgZHJpdmVyIHN1cHBvcnRzIHRoZSBwaWNwYXIgYW5kCisJICBwYXI5NiBkZXNpZ25zLiBUbyBjb25maWd1cmUgdGhlIGRyaXZlciwgdXNlIHRoZSBzZXRoZGxjIHV0aWxpdHkKKwkgIGF2YWlsYWJsZSBpbiB0aGUgc3RhbmRhcmQgYXgyNSB1dGlsaXRpZXMgcGFja2FnZS4gRm9yIGluZm9ybWF0aW9uIG9uCisJICB0aGUgbW9kZW1zLCBzZWUgPGh0dHA6Ly93d3cuYmF5Y29tLmRlLz4gYW5kIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYmF5Y29tLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGJheWNvbV9wYXIuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgQkFZQ09NX0VQUAorCXRyaXN0YXRlICJCQVlDT00gZXBwIGRyaXZlciBmb3IgQVguMjUiCisJZGVwZW5kcyBvbiBQQVJQT1JUICYmIEFYMjUgJiYgITY0QklUCisJc2VsZWN0IENSQ19DQ0lUVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIEJheWNvbSBzdHlsZSBzaW1wbGUgYW1hdGV1ciByYWRpbyBtb2RlbXMgdGhhdAorCSAgY29ubmVjdCB0byBhIHBhcmFsbGVsIGludGVyZmFjZS4gVGhlIGRyaXZlciBzdXBwb3J0cyB0aGUgRVBQCisJICBkZXNpZ25zLiBUbyBjb25maWd1cmUgdGhlIGRyaXZlciwgdXNlIHRoZSBzZXRoZGxjIHV0aWxpdHkgYXZhaWxhYmxlCisJICBpbiB0aGUgc3RhbmRhcmQgYXgyNSB1dGlsaXRpZXMgcGFja2FnZS4gRm9yIGluZm9ybWF0aW9uIG9uIHRoZQorCSAgbW9kZW1zLCBzZWUgPGh0dHA6Ly93d3cuYmF5Y29tLmRlLz4gYW5kIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYmF5Y29tLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGJheWNvbV9lcHAuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgWUFNCisJdHJpc3RhdGUgIllBTSBkcml2ZXIgZm9yIEFYLjI1IgorCWRlcGVuZHMgb24gQVgyNQorCWhlbHAKKwkgIFRoZSBZQU0gaXMgYSBtb2RlbSBmb3IgcGFja2V0IHJhZGlvIHdoaWNoIGNvbm5lY3RzIHRvIHRoZSBzZXJpYWwKKwkgIHBvcnQgYW5kIGluY2x1ZGVzIHNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBvZiBhIFRlcm1pbmFsIE5vZGUKKwkgIENvbnRyb2xsZXIuIElmIHlvdSBoYXZlIG9uZSBvZiB0aG9zZSwgc2F5IFkgaGVyZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgeWFtLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZWY4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9NYWtlZmlsZQpAQCAtMCwwICsxLDIyIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggQVguMjUgYW5kIEhGTU9ERU0gZGV2aWNlIGRyaXZlcnMuCisjCisjCisjIDE5OTcxMTMwIAlNb3ZlZCB0aGUgYW1hdGV1ciByYWRpbyByZWxhdGVkIG5ldHdvcmsgZHJpdmVycyBmcm9tIAorIwkJZHJpdmVycy9uZXQvIHRvIGRyaXZlcnMvaGFtcmFkaW8gZm9yIGVhc2llciBtYWludGFpbmFuY2UuCisjICAgICAgICAgICAgICAgSm9lcmcgUmV1dGVyIERMMUJLRSA8anJldXRlckB5YWluYS5kZT4KKyMKKyMgMjAwMDA4MDYJUmV3cml0dGVuIHRvIHVzZSBsaXN0cyBpbnN0ZWFkIG9mIGlmLXN0YXRlbWVudHMuCisjCQlDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGluZnJhZGVhZC5vcmc+CisjCisKK29iai0kKENPTkZJR19ETUFTQ0MpCQkrPSBkbWFzY2Mubworb2JqLSQoQ09ORklHX1NDQykJCSs9IHNjYy5vCitvYmotJChDT05GSUdfTUtJU1MpCQkrPSBta2lzcy5vCitvYmotJChDT05GSUdfNlBBQ0spCQkrPSA2cGFjay5vCitvYmotJChDT05GSUdfWUFNKQkJKz0geWFtLm8KK29iai0kKENPTkZJR19CUFFFVEhFUikJCSs9IGJwcWV0aGVyLm8KK29iai0kKENPTkZJR19CQVlDT01fU0VSX0ZEWCkJKz0gYmF5Y29tX3Nlcl9mZHgubwloZGxjZHJ2Lm8KK29iai0kKENPTkZJR19CQVlDT01fU0VSX0hEWCkJKz0gYmF5Y29tX3Nlcl9oZHgubwloZGxjZHJ2Lm8KK29iai0kKENPTkZJR19CQVlDT01fUEFSKQkrPSBiYXljb21fcGFyLm8JCWhkbGNkcnYubworb2JqLSQoQ09ORklHX0JBWUNPTV9FUFApCSs9IGJheWNvbV9lcHAubwkJaGRsY2Rydi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fZXBwLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fZXBwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThjYjg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9lcHAuYwpAQCAtMCwwICsxLDEzODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCWJheWNvbV9lcHAuYyAgLS0gYmF5Y29tIGVwcCByYWRpbyBtb2RlbSBkcml2ZXIuCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAKKyAqICAgICAgICAgIFRob21hcyBTYWlsZXIgKHNhaWxlckBpZmUuZWUuZXRoei5jaCkKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgR1BMIGFsbG93cyB5b3UgdG8gdXNlIHRoZSBkcml2ZXIsIE5PVCB0aGUgcmFkaW8uCisgKiAgSW4gb3JkZXIgdG8gdXNlIHRoZSByYWRpbywgeW91IG5lZWQgYSBsaWNlbnNlIGZyb20gdGhlIGNvbW11bmljYXRpb25zCisgKiAgYXV0aG9yaXR5IG9mIHlvdXIgY291bnRyeS4KKyAqCisgKgorICogIEhpc3Rvcnk6CisgKiAgIDAuMSAgeHgueHguMTk5OCAgSW5pdGlhbCB2ZXJzaW9uIGJ5IE1hdHRoaWFzIFdlbHdhcnNreSAoZGcyZmVmKQorICogICAwLjIgIDIxLjA0LjE5OTggIE1hc3NpdmUgcmV3b3JrIGJ5IFRob21hcyBTYWlsZXIKKyAqICAgICAgICAgICAgICAgICAgICBJbnRlZ3JhdGVkIEZQR0EgRVBQIG1vZGVtIGNvbmZpZ3VyYXRpb24gcm91dGluZXMKKyAqICAgMC4zICAxMS4wNS4xOTk4ICBUb29rIEZQR0EgY29uZmlnIG91dCBhbmQgbW92ZWQgaXQgaW50byBhIHNlcGFyYXRlIHByb2dyYW0KKyAqICAgMC40ICAyNi4wNy4xOTk5ICBBZGFwdGVkIHRvIG5ldyBsb3dsZXZlbCBwYXJwb3J0IGRyaXZlciBpbnRlcmZhY2UKKyAqICAgMC41ICAwMy4wOC4xOTk5ICBhZGFwdCB0byBMaW51cycgbmV3IF9fc2V0dXAvX19pbml0Y2FsbAorICogICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgc29tZSBwcmUtMi4yIGtlcm5lbCBjb21wYXRpYmlsaXR5IGNydWZ0CisgKiAgIDAuNiAgMTAuMDguMTk5OSAgQ2hlY2sgaWYgcGFycG9ydCBjYW4gZG8gU1BQIGFuZCBpcyBzYWZlIHRvIGFjY2VzcyBkdXJpbmcgaW50ZXJydXB0IGNvbnRleHRzCisgKiAgIDAuNyAgMTIuMDIuMjAwMCAgYWRhcHRlZCB0byBzb2Z0bmV0IGRyaXZlciBpbnRlcmZhY2UKKyAqCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvaGRsY2Rydi5oPgorI2luY2x1ZGUgPGxpbnV4L2JheWNvbS5oPgorI2lmIGRlZmluZWQoQ09ORklHX0FYMjUpIHx8IGRlZmluZWQoQ09ORklHX0FYMjVfTU9EVUxFKQorLyogcHJvdG90eXBlcyBmb3IgYXgyNV9lbmNhcHN1bGF0ZSBhbmQgYXgyNV9yZWJ1aWxkX2hlYWRlciAqLworI2luY2x1ZGUgPG5ldC9heDI1Lmg+IAorI2VuZGlmIC8qIENPTkZJR19BWDI1IHx8IENPTkZJR19BWDI1X01PRFVMRSAqLworI2luY2x1ZGUgPGxpbnV4L2NyYy1jY2l0dC5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBCQVlDT01fREVCVUcKKyNkZWZpbmUgQkFZQ09NX01BR0lDIDE5NzMwNTEwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciBwYXJhbm9pYV9zdHJbXSA9IEtFUk5fRVJSIAorCSJiYXljb21fZXBwOiBiYWQgbWFnaWMgbnVtYmVyIGZvciBoZGxjZHJ2X3N0YXRlIHN0cnVjdCBpbiByb3V0aW5lICVzXG4iOworCitzdGF0aWMgY29uc3QgY2hhciBiY19kcnZuYW1lW10gPSAiYmF5Y29tX2VwcCI7CitzdGF0aWMgY29uc3QgY2hhciBiY19kcnZpbmZvW10gPSBLRVJOX0lORk8gImJheWNvbV9lcHA6IChDKSAxOTk4LTIwMDAgVGhvbWFzIFNhaWxlciwgSEI5Sk5YL0FFNFdBXG4iCitLRVJOX0lORk8gImJheWNvbV9lcHA6IHZlcnNpb24gMC43IGNvbXBpbGVkICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE5SX1BPUlRTIDQKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpiYXljb21fZGV2aWNlW05SX1BPUlRTXTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEVQUCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVBQX0RDREJJVCAgICAgIDB4ODAKKyNkZWZpbmUgRVBQX1BUVEJJVCAgICAgIDB4MDgKKyNkZWZpbmUgRVBQX05SRUYgICAgICAgIDB4MDEKKyNkZWZpbmUgRVBQX05SQUVGICAgICAgIDB4MDIKKyNkZWZpbmUgRVBQX05SSEYgICAgICAgIDB4MDQKKyNkZWZpbmUgRVBQX05USEYgICAgICAgIDB4MjAKKyNkZWZpbmUgRVBQX05UQUVGICAgICAgIDB4MTAKKyNkZWZpbmUgRVBQX05URUYgICAgICAgIEVQUF9QVFRCSVQKKworLyogRVBQIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVBQX1RYX0ZJRk9fRU5BQkxFIDB4MTAKKyNkZWZpbmUgRVBQX1JYX0ZJRk9fRU5BQkxFIDB4MDgKKyNkZWZpbmUgRVBQX01PREVNX0VOQUJMRSAgIDB4MjAKKyNkZWZpbmUgRVBQX0xFRFMgICAgICAgICAgIDB4QzAKKyNkZWZpbmUgRVBQX0lSUV9FTkFCTEUgICAgIDB4MTAKKworLyogTFBUIHJlZ2lzdGVycyAqLworI2RlZmluZSBMUFRSRUdfRUNPTlRST0wgICAgICAgMHg0MDIKKyNkZWZpbmUgTFBUUkVHX0NPTkZJR0IgICAgICAgIDB4NDAxCisjZGVmaW5lIExQVFJFR19DT05GSUdBICAgICAgICAweDQwMAorI2RlZmluZSBMUFRSRUdfRVBQREFUQSAgICAgICAgMHgwMDQKKyNkZWZpbmUgTFBUUkVHX0VQUEFERFIgICAgICAgIDB4MDAzCisjZGVmaW5lIExQVFJFR19DT05UUk9MICAgICAgICAweDAwMgorI2RlZmluZSBMUFRSRUdfU1RBVFVTICAgICAgICAgMHgwMDEKKyNkZWZpbmUgTFBUUkVHX0RBVEEgICAgICAgICAgIDB4MDAwCisKKy8qIExQVCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIExQVENUUkxfUFJPR1JBTSAgICAgICAweDA0ICAgLyogMCB0byByZXByb2dyYW0gKi8KKyNkZWZpbmUgTFBUQ1RSTF9XUklURSAgICAgICAgIDB4MDEKKyNkZWZpbmUgTFBUQ1RSTF9BRERSU1RCICAgICAgIDB4MDgKKyNkZWZpbmUgTFBUQ1RSTF9EQVRBU1RCICAgICAgIDB4MDIKKyNkZWZpbmUgTFBUQ1RSTF9JTlRFTiAgICAgICAgIDB4MTAKKworLyogTFBUIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBMUFRTVEFUX1NISUZUX05JTlRSICAgNgorI2RlZmluZSBMUFRTVEFUX1dBSVQgICAgICAgICAgMHg4MAorI2RlZmluZSBMUFRTVEFUX05JTlRSICAgICAgICAgKDE8PExQVFNUQVRfU0hJRlRfTklOVFIpCisjZGVmaW5lIExQVFNUQVRfUEUgICAgICAgICAgICAweDIwCisjZGVmaW5lIExQVFNUQVRfRE9ORSAgICAgICAgICAweDEwCisjZGVmaW5lIExQVFNUQVRfTkVSUk9SICAgICAgICAweDA4CisjZGVmaW5lIExQVFNUQVRfRVBQVElNRU9VVCAgICAweDAxCisKKy8qIExQVCBkYXRhIHJlZ2lzdGVyICovCisjZGVmaW5lIExQVERBVEFfU0hJRlRfVERJICAgICAwCisjZGVmaW5lIExQVERBVEFfU0hJRlRfVE1TICAgICAyCisjZGVmaW5lIExQVERBVEFfVERJICAgICAgICAgICAoMTw8TFBUREFUQV9TSElGVF9UREkpCisjZGVmaW5lIExQVERBVEFfVENLICAgICAgICAgICAweDAyCisjZGVmaW5lIExQVERBVEFfVE1TICAgICAgICAgICAoMTw8TFBUREFUQV9TSElGVF9UTVMpCisjZGVmaW5lIExQVERBVEFfSU5JVEJJQVMgICAgICAweDgwCisKKworLyogRVBQIG1vZGVtIGNvbmZpZy9zdGF0dXMgYml0cyAqLworI2RlZmluZSBFUFBfRENEQklUICAgICAgICAgICAgMHg4MAorI2RlZmluZSBFUFBfUFRUQklUICAgICAgICAgICAgMHgwOAorI2RlZmluZSBFUFBfUlhFQklUICAgICAgICAgICAgMHgwMQorI2RlZmluZSBFUFBfUlhBRUJJVCAgICAgICAgICAgMHgwMgorI2RlZmluZSBFUFBfUlhIRlVMTCAgICAgICAgICAgMHgwNAorCisjZGVmaW5lIEVQUF9OVEhGICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIEVQUF9OVEFFRiAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEVQUF9OVEVGICAgICAgICAgICAgICBFUFBfUFRUQklUCisKKyNkZWZpbmUgRVBQX1RYX0ZJRk9fRU5BQkxFICAgIDB4MTAKKyNkZWZpbmUgRVBQX1JYX0ZJRk9fRU5BQkxFICAgIDB4MDgKKyNkZWZpbmUgRVBQX01PREVNX0VOQUJMRSAgICAgIDB4MjAKKyNkZWZpbmUgRVBQX0xFRFMgICAgICAgICAgICAgIDB4QzAKKyNkZWZpbmUgRVBQX0lSUV9FTkFCTEUgICAgICAgIDB4MTAKKworLyogWGlsaW54IDRrIEpUQUcgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFhDNEtfSVJMRU5HVEggICAzCisjZGVmaW5lIFhDNEtfRVhURVNUICAgICAwCisjZGVmaW5lIFhDNEtfUFJFTE9BRCAgICAxCisjZGVmaW5lIFhDNEtfQ09ORklHVVJFICA1CisjZGVmaW5lIFhDNEtfQllQQVNTICAgICA3CisKKyNkZWZpbmUgRVBQX0NPTlZFTlRJT05BTCAgMAorI2RlZmluZSBFUFBfRlBHQSAgICAgICAgICAxCisjZGVmaW5lIEVQUF9GUEdBRVhUU1RBVFVTIDIKKworI2RlZmluZSBUWEJVRkZFUl9TSVpFICAgICAoKEhETENEUlZfTUFYRkxFTio2LzUpKzgpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4KKyAqLworCitzdHJ1Y3QgYmF5Y29tX3N0YXRlIHsKKwlpbnQgbWFnaWM7CisKKyAgICAgICAgc3RydWN0IHBhcmRldmljZSAqcGRldjsKKwl1bnNpZ25lZCBpbnQgd29ya19ydW5uaW5nOworCXN0cnVjdCB3b3JrX3N0cnVjdCBydW5fd29yazsKKwl1bnNpZ25lZCBpbnQgbW9kZW07CisJdW5zaWduZWQgaW50IGJpdHJhdGU7CisJdW5zaWduZWQgY2hhciBzdGF0OworCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IGludGNsazsKKwkJdW5zaWduZWQgaW50IGZjbGs7CisJCXVuc2lnbmVkIGludCBicHM7CisJCXVuc2lnbmVkIGludCBleHRtb2RlbTsKKwkJdW5zaWduZWQgaW50IGxvb3BiYWNrOworCX0gY2ZnOworCisgICAgICAgIHN0cnVjdCBoZGxjZHJ2X2NoYW5uZWxfcGFyYW1zIGNoX3BhcmFtczsKKworICAgICAgICBzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgYml0YnVmLCBiaXRzdHJlYW0sIG51bWJpdHMsIHN0YXRlOworCQl1bnNpZ25lZCBjaGFyICpidWZwdHI7CisJCWludCBidWZjbnQ7CisJCXVuc2lnbmVkIGNoYXIgYnVmW1RYQlVGRkVSX1NJWkVdOworICAgICAgICB9IGhkbGNyeDsKKworICAgICAgICBzdHJ1Y3QgeworCQlpbnQgY2FsaWJyYXRlOworICAgICAgICAgICAgICAgIGludCBzbG90Y250OworCQlpbnQgZmxhZ3M7CisJCWVudW0geyB0eF9pZGxlID0gMCwgdHhfa2V5dXAsIHR4X2RhdGEsIHR4X3RhaWwgfSBzdGF0ZTsKKwkJdW5zaWduZWQgY2hhciAqYnVmcHRyOworCQlpbnQgYnVmY250OworCQl1bnNpZ25lZCBjaGFyIGJ1ZltUWEJVRkZFUl9TSVpFXTsKKyAgICAgICAgfSBoZGxjdHg7CisKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdW5zaWduZWQgaW50IHB0dF9rZXllZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOyAgLyogbmV4dCB0cmFuc21pdCBwYWNrZXQgICovCisKKyNpZmRlZiBCQVlDT01fREVCVUcKKwlzdHJ1Y3QgZGVidWdfdmFscyB7CisJCXVuc2lnbmVkIGxvbmcgbGFzdF9qaWZmaWVzOworCQl1bnNpZ25lZCBjdXJfaW50Y250OworCQl1bnNpZ25lZCBsYXN0X2ludGNudDsKKwkJaW50IGN1cl9wbGxjb3JyOworCQlpbnQgbGFzdF9wbGxjb3JyOworCQl1bnNpZ25lZCBpbnQgbW9kX2N5Y2xlczsKKwkJdW5zaWduZWQgaW50IGRlbW9kX2N5Y2xlczsKKwl9IGRlYnVnX3ZhbHM7CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLSVNTX1ZFUkJPU0UKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUEFSQU1fVFhERUxBWSAgIDEKKyNkZWZpbmUgUEFSQU1fUEVSU0lTVCAgIDIKKyNkZWZpbmUgUEFSQU1fU0xPVFRJTUUgIDMKKyNkZWZpbmUgUEFSQU1fVFhUQUlMICAgIDQKKyNkZWZpbmUgUEFSQU1fRlVMTERVUCAgIDUKKyNkZWZpbmUgUEFSQU1fSEFSRFdBUkUgIDYKKyNkZWZpbmUgUEFSQU1fUkVUVVJOICAgIDI1NQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiB0aGUgQ1JDIHJvdXRpbmVzIGFyZSBzdG9sZW4gZnJvbSBXQU1QRVMKKyAqIGJ5IERpZXRlciBEZXlrZQorICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgMAorc3RhdGljIGlubGluZSB2b2lkIGFwcGVuZF9jcmNfY2NpdHQodW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworIAl1bnNpZ25lZCBpbnQgY3JjID0gMHhmZmZmOworCisJZm9yICg7bGVuPjA7bGVuLS0pCisJCWNyYyA9IChjcmMgPj4gOCkgXiBjcmNfY2NpdHRfdGFibGVbKGNyYyBeICpidWZmZXIrKykgJiAweGZmXTsKKwljcmMgXj0gMHhmZmZmOworCSpidWZmZXIrKyA9IGNyYzsKKwkqYnVmZmVyKysgPSBjcmMgPj4gODsKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2NyY19jY2l0dChjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjbnQpCit7CisJcmV0dXJuIChjcmNfY2NpdHQoMHhmZmZmLCBidWYsIGNudCkgJiAweGZmZmYpID09IDB4ZjBiODsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIGludCBjYWxjX2NyY19jY2l0dChjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjbnQpCit7CisJcmV0dXJuIChjcmNfY2NpdHQoMHhmZmZmLCBidWYsIGNudCkgXiAweGZmZmYpICYgMHhmZmZmOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgdGVubXNfdG9fZmxhZ3MoYmMsdGVubXMpICgodGVubXMgKiBiYy0+Yml0cmF0ZSkgLyA4MDApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYmF5Y29tX2ludF9mcmVxKHN0cnVjdCBiYXljb21fc3RhdGUgKmJjKQoreworI2lmZGVmIEJBWUNPTV9ERUJVRworCXVuc2lnbmVkIGxvbmcgY3VyX2ppZmZpZXMgPSBqaWZmaWVzOworCS8qCisJICogbWVhc3VyZSB0aGUgaW50ZXJydXB0IGZyZXF1ZW5jeQorCSAqLworCWJjLT5kZWJ1Z192YWxzLmN1cl9pbnRjbnQrKzsKKwlpZiAoKGN1cl9qaWZmaWVzIC0gYmMtPmRlYnVnX3ZhbHMubGFzdF9qaWZmaWVzKSA+PSBIWikgeworCQliYy0+ZGVidWdfdmFscy5sYXN0X2ppZmZpZXMgPSBjdXJfamlmZmllczsKKwkJYmMtPmRlYnVnX3ZhbHMubGFzdF9pbnRjbnQgPSBiYy0+ZGVidWdfdmFscy5jdXJfaW50Y250OworCQliYy0+ZGVidWdfdmFscy5jdXJfaW50Y250ID0gMDsKKwkJYmMtPmRlYnVnX3ZhbHMubGFzdF9wbGxjb3JyID0gYmMtPmRlYnVnX3ZhbHMuY3VyX3BsbGNvcnI7CisJCWJjLT5kZWJ1Z192YWxzLmN1cl9wbGxjb3JyID0gMDsKKwl9CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiAgICBlcHBjb25maWdfcGF0aCBzaG91bGQgYmUgc2V0YWJsZSAgdmlhIC9wcm9jL3N5cy4KKyAqLworCitzdGF0aWMgY2hhciBlcHBjb25maWdfcGF0aFsyNTZdID0gIi91c3Ivc2Jpbi9lcHBmcGdhIjsKKworc3RhdGljIGNoYXIgKmVudnBbXSA9IHsgIkhPTUU9LyIsICJURVJNPWxpbnV4IiwgIlBBVEg9L3Vzci9iaW46L2JpbiIsIE5VTEwgfTsKKworLyogZXBwY29uZmlnOiBjYWxsZWQgZHVyaW5nIGlmY29uZmlnIHVwIHRvIGNvbmZpZ3VyZSB0aGUgbW9kZW0gKi8KK3N0YXRpYyBpbnQgZXBwY29uZmlnKHN0cnVjdCBiYXljb21fc3RhdGUgKmJjKQoreworCWNoYXIgbW9kZWFyZ1syNTZdOworCWNoYXIgcG9ydGFyZ1sxNl07CisgICAgICAgIGNoYXIgKmFyZ3ZbXSA9IHsgZXBwY29uZmlnX3BhdGgsICItcyIsICItcCIsIHBvcnRhcmcsICItbSIsIG1vZGVhcmcsCisJCQkgTlVMTCB9OworCisJLyogc2V0IHVwIGFyZ3VtZW50cyAqLworCXNwcmludGYobW9kZWFyZywgIiVzY2xrLCVzbW9kZW0sZmNsaz0lZCxicHM9JWQsZGl2aWRlcj0lZCVzLGV4dHN0YXQiLAorCQliYy0+Y2ZnLmludGNsayA/ICJpbnQiIDogImV4dCIsCisJCWJjLT5jZmcuZXh0bW9kZW0gPyAiZXh0IiA6ICJpbnQiLCBiYy0+Y2ZnLmZjbGssIGJjLT5jZmcuYnBzLAorCQkoYmMtPmNmZy5mY2xrICsgOCAqIGJjLT5jZmcuYnBzKSAvICgxNiAqIGJjLT5jZmcuYnBzKSwKKwkJYmMtPmNmZy5sb29wYmFjayA/ICIsbG9vcGJhY2siIDogIiIpOworCXNwcmludGYocG9ydGFyZywgIiVsZCIsIGJjLT5wZGV2LT5wb3J0LT5iYXNlKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzIC1zIC1wICVzIC1tICVzXG4iLCBiY19kcnZuYW1lLCBlcHBjb25maWdfcGF0aCwgcG9ydGFyZywgbW9kZWFyZyk7CisKKwlyZXR1cm4gY2FsbF91c2VybW9kZWhlbHBlcihlcHBjb25maWdfcGF0aCwgYXJndiwgZW52cCwgMSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgZXBwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19raXNzX3BhcmFtcyhzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYywKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCisjaWZkZWYgS0lTU19WRVJCT1NFCisjZGVmaW5lIFBLUChhLGIpIHByaW50ayhLRVJOX0lORk8gImJheWNvbW1fZXBwOiBjaGFubmVsIHBhcmFtczogIiBhICJcbiIsIGIpCisjZWxzZSAvKiBLSVNTX1ZFUkJPU0UgKi8JICAgICAgCisjZGVmaW5lIFBLUChhLGIpIAorI2VuZGlmIC8qIEtJU1NfVkVSQk9TRSAqLwkgICAgICAKKworCWlmIChsZW4gPCAyKQorCQlyZXR1cm47CisJc3dpdGNoKGRhdGFbMF0pIHsKKwljYXNlIFBBUkFNX1RYREVMQVk6CisJCWJjLT5jaF9wYXJhbXMudHhfZGVsYXkgPSBkYXRhWzFdOworCQlQS1AoIlRYIGRlbGF5ID0gJXVtcyIsIDEwICogYmMtPmNoX3BhcmFtcy50eF9kZWxheSk7CisJCWJyZWFrOworCWNhc2UgUEFSQU1fUEVSU0lTVDogICAKKwkJYmMtPmNoX3BhcmFtcy5wcGVyc2lzdCA9IGRhdGFbMV07CisJCVBLUCgicCBwZXJzaXN0ZW5jZSA9ICV1IiwgYmMtPmNoX3BhcmFtcy5wcGVyc2lzdCk7CisJCWJyZWFrOworCWNhc2UgUEFSQU1fU0xPVFRJTUU6ICAKKwkJYmMtPmNoX3BhcmFtcy5zbG90dGltZSA9IGRhdGFbMV07CisJCVBLUCgic2xvdCB0aW1lID0gJXVtcyIsIGJjLT5jaF9wYXJhbXMuc2xvdHRpbWUpOworCQlicmVhazsKKwljYXNlIFBBUkFNX1RYVEFJTDogICAgCisJCWJjLT5jaF9wYXJhbXMudHhfdGFpbCA9IGRhdGFbMV07CisJCVBLUCgiVFggdGFpbCA9ICV1bXMiLCBiYy0+Y2hfcGFyYW1zLnR4X3RhaWwpOworCQlicmVhazsKKwljYXNlIFBBUkFNX0ZVTExEVVA6ICAgCisJCWJjLT5jaF9wYXJhbXMuZnVsbGR1cCA9ICEhZGF0YVsxXTsKKwkJUEtQKCIlcyBkdXBsZXgiLCBiYy0+Y2hfcGFyYW1zLmZ1bGxkdXAgPyAiZnVsbCIgOiAiaGFsZiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisjdW5kZWYgUEtQCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIGhpZ2ggcGVyZm9ybWFuY2UgSERMQyBlbmNvZGVyCisgKiB5ZXMsIGl0J3MgdWdseSwgYnV0IGdlbmVyYXRlcyBwcmV0dHkgZ29vZCBjb2RlCisgKi8KKworI2RlZmluZSBFTkNPREVJVEVSQShqKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCEobm90Yml0c3RyZWFtICYgKDB4MWYwIDw8IGopKSkgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gc3R1ZmYjI2o7ICAgICAgICAgICAgICAgICBcCisgIGVuY29kZWVuZCMjajogICAgCTsgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworI2RlZmluZSBFTkNPREVJVEVSQihqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0dWZmIyNqOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiaXRzdHJlYW0gJj0gfigweDEwMCA8PCBqKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYml0YnVmID0gKGJpdGJ1ZiAmICgoKDIgPDwgaikgPDwgbnVtYml0KSAtIDEpKSB8ICAgICAgICBcCisgICAgICAgICAgICAgICAgKChiaXRidWYgJiB+KCgoMiA8PCBqKSA8PCBudW1iaXQpIC0gMSkpIDw8IDEpOyAgXAorICAgICAgICBudW1iaXQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbm90Yml0c3RyZWFtID0gfmJpdHN0cmVhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdvdG8gZW5jb2RlZW5kIyNqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworCitzdGF0aWMgdm9pZCBlbmNvZGVfaGRsYyhzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKndwLCAqYnA7CisJaW50IHBrdF9sZW47CisgICAgICAgIHVuc2lnbmVkIGJpdHN0cmVhbSwgbm90Yml0c3RyZWFtLCBiaXRidWYsIG51bWJpdCwgY3JjOworCXVuc2lnbmVkIGNoYXIgY3JjYXJyWzJdOworCQorCWlmIChiYy0+aGRsY3R4LmJ1ZmNudCA+IDApCisJCXJldHVybjsKKwlza2IgPSBiYy0+c2tiOworCWlmICghc2tiKQorCQlyZXR1cm47CisJYmMtPnNrYiA9IE5VTEw7CisJcGt0X2xlbiA9IHNrYi0+bGVuLTE7IC8qIHN0cmlwIEtJU1MgYnl0ZSAqLworCXdwID0gYmMtPmhkbGN0eC5idWY7CisJYnAgPSBza2ItPmRhdGErMTsKKwljcmMgPSBjYWxjX2NyY19jY2l0dChicCwgcGt0X2xlbik7CisJY3JjYXJyWzBdID0gY3JjOworCWNyY2FyclsxXSA9IGNyYyA+PiA4OworCSp3cCsrID0gMHg3ZTsKKwliaXRzdHJlYW0gPSBiaXRidWYgPSBudW1iaXQgPSAwOworCXdoaWxlIChwa3RfbGVuID4gLTIpIHsKKwkJYml0c3RyZWFtID4+PSA4OworCQliaXRzdHJlYW0gfD0gKCh1bnNpZ25lZCBpbnQpKmJwKSA8PCA4OworCQliaXRidWYgfD0gKCh1bnNpZ25lZCBpbnQpKmJwKSA8PCBudW1iaXQ7CisJCW5vdGJpdHN0cmVhbSA9IH5iaXRzdHJlYW07CisJCWJwKys7CisJCXBrdF9sZW4tLTsKKwkJaWYgKCFwa3RfbGVuKQorCQkJYnAgPSBjcmNhcnI7CisJCUVOQ09ERUlURVJBKDApOworCQlFTkNPREVJVEVSQSgxKTsKKwkJRU5DT0RFSVRFUkEoMik7CisJCUVOQ09ERUlURVJBKDMpOworCQlFTkNPREVJVEVSQSg0KTsKKwkJRU5DT0RFSVRFUkEoNSk7CisJCUVOQ09ERUlURVJBKDYpOworCQlFTkNPREVJVEVSQSg3KTsKKwkJZ290byBlbmRpdGVyOworCQlFTkNPREVJVEVSQigwKTsKKwkJRU5DT0RFSVRFUkIoMSk7CisJCUVOQ09ERUlURVJCKDIpOworCQlFTkNPREVJVEVSQigzKTsKKwkJRU5DT0RFSVRFUkIoNCk7CisJCUVOQ09ERUlURVJCKDUpOworCQlFTkNPREVJVEVSQig2KTsKKwkJRU5DT0RFSVRFUkIoNyk7CisJZW5kaXRlcjoKKwkJbnVtYml0ICs9IDg7CisJCXdoaWxlIChudW1iaXQgPj0gOCkgeworCQkJKndwKysgPSBiaXRidWY7CisJCQliaXRidWYgPj49IDg7CisJCQludW1iaXQgLT0gODsKKwkJfQorCX0KKwliaXRidWYgfD0gMHg3ZTdlIDw8IG51bWJpdDsKKwludW1iaXQgKz0gMTY7CisJd2hpbGUgKG51bWJpdCA+PSA4KSB7CisJCSp3cCsrID0gYml0YnVmOworCQliaXRidWYgPj49IDg7CisJCW51bWJpdCAtPSA4OworCX0KKwliYy0+aGRsY3R4LmJ1ZnB0ciA9IGJjLT5oZGxjdHguYnVmOworCWJjLT5oZGxjdHguYnVmY250ID0gd3AgLSBiYy0+aGRsY3R4LmJ1ZjsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJYmMtPnN0YXRzLnR4X3BhY2tldHMrKzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmFuZG9tX3NlZWQ7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgcmFuZG9tX251bSh2b2lkKQoreworCXJhbmRvbV9zZWVkID0gMjg2MjkgKiByYW5kb21fc2VlZCArIDE1NzsKKwlyZXR1cm4gcmFuZG9tX3NlZWQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCB0cmFuc21pdChzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYywgaW50IGNudCwgdW5zaWduZWQgY2hhciBzdGF0KQoreworCXN0cnVjdCBwYXJwb3J0ICpwcCA9IGJjLT5wZGV2LT5wb3J0OworCXVuc2lnbmVkIGNoYXIgdG1wWzEyOF07CisJaW50IGksIGo7CisKKwlpZiAoYmMtPmhkbGN0eC5zdGF0ZSA9PSB0eF90YWlsICYmICEoc3RhdCAmIEVQUF9QVFRCSVQpKQorCQliYy0+aGRsY3R4LnN0YXRlID0gdHhfaWRsZTsKKwlpZiAoYmMtPmhkbGN0eC5zdGF0ZSA9PSB0eF9pZGxlICYmIGJjLT5oZGxjdHguY2FsaWJyYXRlIDw9IDApIHsKKwkJaWYgKGJjLT5oZGxjdHguYnVmY250IDw9IDApCisJCQllbmNvZGVfaGRsYyhiYyk7CisJCWlmIChiYy0+aGRsY3R4LmJ1ZmNudCA8PSAwKQorCQkJcmV0dXJuIDA7CisJCWlmICghYmMtPmNoX3BhcmFtcy5mdWxsZHVwKSB7CisJCQlpZiAoIShzdGF0ICYgRVBQX0RDREJJVCkpIHsKKwkJCQliYy0+aGRsY3R4LnNsb3RjbnQgPSBiYy0+Y2hfcGFyYW1zLnNsb3R0aW1lOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKCgtLWJjLT5oZGxjdHguc2xvdGNudCkgPiAwKQorCQkJCXJldHVybiAwOworCQkJYmMtPmhkbGN0eC5zbG90Y250ID0gYmMtPmNoX3BhcmFtcy5zbG90dGltZTsKKwkJCWlmICgocmFuZG9tX251bSgpICUgMjU2KSA+IGJjLT5jaF9wYXJhbXMucHBlcnNpc3QpCisJCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKGJjLT5oZGxjdHguc3RhdGUgPT0gdHhfaWRsZSAmJiBiYy0+aGRsY3R4LmJ1ZmNudCA+IDApIHsKKwkJYmMtPmhkbGN0eC5zdGF0ZSA9IHR4X2tleXVwOworCQliYy0+aGRsY3R4LmZsYWdzID0gdGVubXNfdG9fZmxhZ3MoYmMsIGJjLT5jaF9wYXJhbXMudHhfZGVsYXkpOworCQliYy0+cHR0X2tleWVkKys7CisJfQorCXdoaWxlIChjbnQgPiAwKSB7CisJCXN3aXRjaCAoYmMtPmhkbGN0eC5zdGF0ZSkgeworCQljYXNlIHR4X2tleXVwOgorCQkJaSA9IG1pbl90KGludCwgY250LCBiYy0+aGRsY3R4LmZsYWdzKTsKKwkJCWNudCAtPSBpOworCQkJYmMtPmhkbGN0eC5mbGFncyAtPSBpOworCQkJaWYgKGJjLT5oZGxjdHguZmxhZ3MgPD0gMCkKKwkJCQliYy0+aGRsY3R4LnN0YXRlID0gdHhfZGF0YTsKKwkJCW1lbXNldCh0bXAsIDB4N2UsIHNpemVvZih0bXApKTsKKwkJCXdoaWxlIChpID4gMCkgeworCQkJCWogPSAoaSA+IHNpemVvZih0bXApKSA/IHNpemVvZih0bXApIDogaTsKKwkJCQlpZiAoaiAhPSBwcC0+b3BzLT5lcHBfd3JpdGVfZGF0YShwcCwgdG1wLCBqLCAwKSkKKwkJCQkJcmV0dXJuIC0xOworCQkJCWkgLT0gajsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgdHhfZGF0YToKKwkJCWlmIChiYy0+aGRsY3R4LmJ1ZmNudCA8PSAwKSB7CisJCQkJZW5jb2RlX2hkbGMoYmMpOworCQkJCWlmIChiYy0+aGRsY3R4LmJ1ZmNudCA8PSAwKSB7CisJCQkJCWJjLT5oZGxjdHguc3RhdGUgPSB0eF90YWlsOworCQkJCQliYy0+aGRsY3R4LmZsYWdzID0gdGVubXNfdG9fZmxhZ3MoYmMsIGJjLT5jaF9wYXJhbXMudHhfdGFpbCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWkgPSBtaW5fdChpbnQsIGNudCwgYmMtPmhkbGN0eC5idWZjbnQpOworCQkJYmMtPmhkbGN0eC5idWZjbnQgLT0gaTsKKwkJCWNudCAtPSBpOworCQkJaWYgKGkgIT0gcHAtPm9wcy0+ZXBwX3dyaXRlX2RhdGEocHAsIGJjLT5oZGxjdHguYnVmcHRyLCBpLCAwKSkKKwkJCQkJcmV0dXJuIC0xOworCQkJYmMtPmhkbGN0eC5idWZwdHIgKz0gaTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgdHhfdGFpbDoKKwkJCWVuY29kZV9oZGxjKGJjKTsKKwkJCWlmIChiYy0+aGRsY3R4LmJ1ZmNudCA+IDApIHsKKwkJCQliYy0+aGRsY3R4LnN0YXRlID0gdHhfZGF0YTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWkgPSBtaW5fdChpbnQsIGNudCwgYmMtPmhkbGN0eC5mbGFncyk7CisJCQlpZiAoaSkgeworCQkJCWNudCAtPSBpOworCQkJCWJjLT5oZGxjdHguZmxhZ3MgLT0gaTsKKwkJCQltZW1zZXQodG1wLCAweDdlLCBzaXplb2YodG1wKSk7CisJCQkJd2hpbGUgKGkgPiAwKSB7CisJCQkJCWogPSAoaSA+IHNpemVvZih0bXApKSA/IHNpemVvZih0bXApIDogaTsKKwkJCQkJaWYgKGogIT0gcHAtPm9wcy0+ZXBwX3dyaXRlX2RhdGEocHAsIHRtcCwgaiwgMCkpCisJCQkJCQlyZXR1cm4gLTE7CisJCQkJCWkgLT0gajsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJZGVmYXVsdDogIC8qIGZhbGwgdGhyb3VnaCAqLworCQkJaWYgKGJjLT5oZGxjdHguY2FsaWJyYXRlIDw9IDApCisJCQkJcmV0dXJuIDA7CisJCQlpID0gbWluX3QoaW50LCBjbnQsIGJjLT5oZGxjdHguY2FsaWJyYXRlKTsKKwkJCWNudCAtPSBpOworCQkJYmMtPmhkbGN0eC5jYWxpYnJhdGUgLT0gaTsKKwkJCW1lbXNldCh0bXAsIDAsIHNpemVvZih0bXApKTsKKwkJCXdoaWxlIChpID4gMCkgeworCQkJCWogPSAoaSA+IHNpemVvZih0bXApKSA/IHNpemVvZih0bXApIDogaTsKKwkJCQlpZiAoaiAhPSBwcC0+b3BzLT5lcHBfd3JpdGVfZGF0YShwcCwgdG1wLCBqLCAwKSkKKwkJCQkJcmV0dXJuIC0xOworCQkJCWkgLT0gajsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGRvX3J4cGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqY3A7CisJdW5zaWduZWQgcGt0bGVuOworCisJaWYgKGJjLT5oZGxjcnguYnVmY250IDwgNCkgCisJCXJldHVybjsKKwlpZiAoIWNoZWNrX2NyY19jY2l0dChiYy0+aGRsY3J4LmJ1ZiwgYmMtPmhkbGNyeC5idWZjbnQpKSAKKwkJcmV0dXJuOworCXBrdGxlbiA9IGJjLT5oZGxjcnguYnVmY250LTIrMTsgLyogS0lTUyBrbHVkZ2UgKi8KKwlpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdGxlbikpKSB7CisJCXByaW50aygiJXM6IG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXRcbiIsIGRldi0+bmFtZSk7CisJCWJjLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybjsKKwl9CisJc2tiLT5kZXYgPSBkZXY7CisJY3AgPSBza2JfcHV0KHNrYiwgcGt0bGVuKTsKKwkqY3ArKyA9IDA7IC8qIEtJU1Mga2x1ZGdlICovCisJbWVtY3B5KGNwLCBiYy0+aGRsY3J4LmJ1ZiwgcGt0bGVuIC0gMSk7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0FYMjUpOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJYmMtPnN0YXRzLnJ4X3BhY2tldHMrKzsKK30KKworI2RlZmluZSBERUNPREVJVEVSQShqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIShub3RiaXRzdHJlYW0gJiAoMHgwZmMgPDwgaikpKSAgICAgICAgICAgICAgLyogZmxhZyBvciBhYm9ydCAqLyAgXAorICAgICAgICAgICAgICAgIGdvdG8gZmxnYWJydCMjajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKGJpdHN0cmVhbSAmICgweDFmOCA8PCBqKSkgPT0gKDB4ZjggPDwgaikpICAgLyogc3R1ZmZlZCBiaXQgKi8gICAgXAorICAgICAgICAgICAgICAgIGdvdG8gc3R1ZmYjI2o7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbmRpdGVyIyNqOiAgICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKyNkZWZpbmUgREVDT0RFSVRFUkIoaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZmxnYWJydCMjajogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCEobm90Yml0c3RyZWFtICYgKDB4MWZjIDw8IGopKSkgeyAgICAgICAgICAgICAgLyogYWJvcnQgcmVjZWl2ZWQgKi8gICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBnb3RvIGVuZGl0ZXIjI2o7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChiaXRzdHJlYW0gJiAoMHgxZmUgPDwgaikpICE9ICgweDBmYyA8PCBqKSkgICAvKiBmbGFnIHJlY2VpdmVkICovICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBnb3RvIGVuZGl0ZXIjI2o7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHN0YXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkb19yeHBhY2tldChkZXYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmMtPmhkbGNyeC5idWZjbnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmMtPmhkbGNyeC5idWZwdHIgPSBiYy0+aGRsY3J4LmJ1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdGUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbnVtYml0cyA9IDctajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ290byBlbmRpdGVyIyNqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3R1ZmYjI2o6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbnVtYml0cy0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYml0YnVmID0gKGJpdGJ1ZiAmICgofjB4ZmYpIDw8IGopKSB8ICgoYml0YnVmICYgfigofjB4ZmYpIDw8IGopKSA8PCAxKTsgICAgICAgIFwKKyAgICAgICAgZ290byBlbmRpdGVyIyNqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisgICAgICAgIAorc3RhdGljIGludCByZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjbnQpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwYXJwb3J0ICpwcCA9IGJjLT5wZGV2LT5wb3J0OworICAgICAgICB1bnNpZ25lZCBpbnQgYml0YnVmLCBub3RiaXRzdHJlYW0sIGJpdHN0cmVhbSwgbnVtYml0cywgc3RhdGU7CisJdW5zaWduZWQgY2hhciB0bXBbMTI4XTsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqY3A7CisJaW50IGNudDIsIHJldCA9IDA7CisgICAgICAgIAorICAgICAgICBudW1iaXRzID0gYmMtPmhkbGNyeC5udW1iaXRzOworCXN0YXRlID0gYmMtPmhkbGNyeC5zdGF0ZTsKKwliaXRzdHJlYW0gPSBiYy0+aGRsY3J4LmJpdHN0cmVhbTsKKwliaXRidWYgPSBiYy0+aGRsY3J4LmJpdGJ1ZjsKKwl3aGlsZSAoY250ID4gMCkgeworCQljbnQyID0gKGNudCA+IHNpemVvZih0bXApKSA/IHNpemVvZih0bXApIDogY250OworCQljbnQgLT0gY250MjsKKwkJaWYgKGNudDIgIT0gcHAtPm9wcy0+ZXBwX3JlYWRfZGF0YShwcCwgdG1wLCBjbnQyLCAwKSkgeworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfQorCQljcCA9IHRtcDsKKwkJZm9yICg7IGNudDIgPiAwOyBjbnQyLS0sIGNwKyspIHsKKwkJCWJpdHN0cmVhbSA+Pj0gODsKKwkJCWJpdHN0cmVhbSB8PSAoKmNwKSA8PCA4OworCQkJYml0YnVmID4+PSA4OworCQkJYml0YnVmIHw9ICgqY3ApIDw8IDg7CisJCQludW1iaXRzICs9IDg7CisJCQlub3RiaXRzdHJlYW0gPSB+Yml0c3RyZWFtOworCQkJREVDT0RFSVRFUkEoMCk7CisJCQlERUNPREVJVEVSQSgxKTsKKwkJCURFQ09ERUlURVJBKDIpOworCQkJREVDT0RFSVRFUkEoMyk7CisJCQlERUNPREVJVEVSQSg0KTsKKwkJCURFQ09ERUlURVJBKDUpOworCQkJREVDT0RFSVRFUkEoNik7CisJCQlERUNPREVJVEVSQSg3KTsKKwkJCWdvdG8gZW5kZGVjOworCQkJREVDT0RFSVRFUkIoMCk7CisJCQlERUNPREVJVEVSQigxKTsKKwkJCURFQ09ERUlURVJCKDIpOworCQkJREVDT0RFSVRFUkIoMyk7CisJCQlERUNPREVJVEVSQig0KTsKKwkJCURFQ09ERUlURVJCKDUpOworCQkJREVDT0RFSVRFUkIoNik7CisJCQlERUNPREVJVEVSQig3KTsKKwkJZW5kZGVjOgorCQkJd2hpbGUgKHN0YXRlICYmIG51bWJpdHMgPj0gOCkgeworCQkJCWlmIChiYy0+aGRsY3J4LmJ1ZmNudCA+PSBUWEJVRkZFUl9TSVpFKSB7CisJCQkJCXN0YXRlID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQkqKGJjLT5oZGxjcnguYnVmcHRyKSsrID0gYml0YnVmID4+ICgxNi1udW1iaXRzKTsKKwkJCQkJYmMtPmhkbGNyeC5idWZjbnQrKzsKKwkJCQkJbnVtYml0cyAtPSA4OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyAgICAgICAgYmMtPmhkbGNyeC5udW1iaXRzID0gbnVtYml0czsKKwliYy0+aGRsY3J4LnN0YXRlID0gc3RhdGU7CisJYmMtPmhkbGNyeC5iaXRzdHJlYW0gPSBiaXRzdHJlYW07CisJYmMtPmhkbGNyeC5iaXRidWYgPSBiaXRidWY7CisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBfX2kzODZfXworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNkZWZpbmUgR0VUVElDSyh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoY3B1X2hhc190c2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlyZHRzY2woeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisjZWxzZSAvKiBfX2kzODZfXyAqLworI2RlZmluZSBHRVRUSUNLKHgpCisjZW5kaWYgLyogX19pMzg2X18gKi8KKworc3RhdGljIHZvaWQgZXBwX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmM7CisJc3RydWN0IHBhcnBvcnQgKnBwOworCXVuc2lnbmVkIGNoYXIgc3RhdDsKKwl1bnNpZ25lZCBjaGFyIHRtcFsyXTsKKwl1bnNpZ25lZCBpbnQgdGltZTEgPSAwLCB0aW1lMiA9IDAsIHRpbWUzID0gMDsKKwlpbnQgY250LCBjbnQyOworCQorCWJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAoIWJjLT53b3JrX3J1bm5pbmcpCisJCXJldHVybjsKKwliYXljb21faW50X2ZyZXEoYmMpOworCXBwID0gYmMtPnBkZXYtPnBvcnQ7CisJLyogdXBkYXRlIHN0YXR1cyAqLworCWlmIChwcC0+b3BzLT5lcHBfcmVhZF9hZGRyKHBwLCAmc3RhdCwgMSwgMCkgIT0gMSkKKwkJZ290byBlcHB0aW1lb3V0OworCWJjLT5zdGF0ID0gc3RhdDsKKwliYy0+ZGVidWdfdmFscy5sYXN0X3BsbGNvcnIgPSBzdGF0OworCUdFVFRJQ0sodGltZTEpOworCWlmIChiYy0+bW9kZW0gPT0gRVBQX0ZQR0FFWFRTVEFUVVMpIHsKKwkJLyogZ2V0IGlucHV0IGNvdW50ICovCisJCXRtcFswXSA9IEVQUF9UWF9GSUZPX0VOQUJMRXxFUFBfUlhfRklGT19FTkFCTEV8RVBQX01PREVNX0VOQUJMRXwxOworCQlpZiAocHAtPm9wcy0+ZXBwX3dyaXRlX2FkZHIocHAsIHRtcCwgMSwgMCkgIT0gMSkKKwkJCWdvdG8gZXBwdGltZW91dDsKKwkJaWYgKHBwLT5vcHMtPmVwcF9yZWFkX2FkZHIocHAsIHRtcCwgMiwgMCkgIT0gMikKKwkJCWdvdG8gZXBwdGltZW91dDsKKwkJY250ID0gdG1wWzBdIHwgKHRtcFsxXSA8PCA4KTsKKwkJY250ICY9IDB4N2ZmZjsKKwkJLyogZ2V0IG91dHB1dCBjb3VudCAqLworCQl0bXBbMF0gPSBFUFBfVFhfRklGT19FTkFCTEV8RVBQX1JYX0ZJRk9fRU5BQkxFfEVQUF9NT0RFTV9FTkFCTEV8MjsKKwkJaWYgKHBwLT5vcHMtPmVwcF93cml0ZV9hZGRyKHBwLCB0bXAsIDEsIDApICE9IDEpCisJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCWlmIChwcC0+b3BzLT5lcHBfcmVhZF9hZGRyKHBwLCB0bXAsIDIsIDApICE9IDIpCisJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCWNudDIgPSB0bXBbMF0gfCAodG1wWzFdIDw8IDgpOworCQljbnQyID0gMTYzODQgLSAoY250MiAmIDB4N2ZmZik7CisJCS8qIHJldHVybiB0byBub3JtYWwgKi8KKwkJdG1wWzBdID0gRVBQX1RYX0ZJRk9fRU5BQkxFfEVQUF9SWF9GSUZPX0VOQUJMRXxFUFBfTU9ERU1fRU5BQkxFOworCQlpZiAocHAtPm9wcy0+ZXBwX3dyaXRlX2FkZHIocHAsIHRtcCwgMSwgMCkgIT0gMSkKKwkJCWdvdG8gZXBwdGltZW91dDsKKwkJaWYgKHRyYW5zbWl0KGJjLCBjbnQyLCBzdGF0KSkKKwkJCWdvdG8gZXBwdGltZW91dDsKKwkJR0VUVElDSyh0aW1lMik7CisJCWlmIChyZWNlaXZlKGRldiwgY250KSkKKwkJCWdvdG8gZXBwdGltZW91dDsKKwkJaWYgKHBwLT5vcHMtPmVwcF9yZWFkX2FkZHIocHAsICZzdGF0LCAxLCAwKSAhPSAxKQorCQkJZ290byBlcHB0aW1lb3V0OworCQliYy0+c3RhdCA9IHN0YXQ7CisJfSBlbHNlIHsKKwkJLyogdHJ5IHRvIHR4ICovCisJCXN3aXRjaCAoc3RhdCAmIChFUFBfTlRBRUZ8RVBQX05USEYpKSB7CisJCWNhc2UgRVBQX05USEY6CisJCQljbnQgPSAyMDQ4IC0gMjU2OworCQkJYnJlYWs7CisJCQorCQljYXNlIEVQUF9OVEFFRjoKKwkJCWNudCA9IDIwNDggLSAxNzkzOworCQkJYnJlYWs7CisJCQorCQljYXNlIDA6CisJCQljbnQgPSAwOworCQkJYnJlYWs7CisJCQorCQlkZWZhdWx0OgorCQkJY250ID0gMjA0OCAtIDEwMjU7CisJCQlicmVhazsKKwkJfQorCQlpZiAodHJhbnNtaXQoYmMsIGNudCwgc3RhdCkpCisJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCUdFVFRJQ0sodGltZTIpOworCQkvKiBkbyByZWNlaXZlciAqLworCQl3aGlsZSAoKHN0YXQgJiAoRVBQX05SQUVGfEVQUF9OUkhGKSkgIT0gRVBQX05SSEYpIHsKKwkJCXN3aXRjaCAoc3RhdCAmIChFUFBfTlJBRUZ8RVBQX05SSEYpKSB7CisJCQljYXNlIEVQUF9OUkFFRjoKKwkJCQljbnQgPSAxMDI1OworCQkJCWJyZWFrOworCisJCQljYXNlIDA6CisJCQkJY250ID0gMTc5MzsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQljbnQgPSAyNTY7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocmVjZWl2ZShkZXYsIGNudCkpCisJCQkJZ290byBlcHB0aW1lb3V0OworCQkJaWYgKHBwLT5vcHMtPmVwcF9yZWFkX2FkZHIocHAsICZzdGF0LCAxLCAwKSAhPSAxKQorCQkJCWdvdG8gZXBwdGltZW91dDsKKwkJfQorCQljbnQgPSAwOworCQlpZiAoYmMtPmJpdHJhdGUgPCA1MDAwMCkKKwkJCWNudCA9IDI1NjsKKwkJZWxzZSBpZiAoYmMtPmJpdHJhdGUgPCAxMDAwMDApCisJCQljbnQgPSAxMjg7CisJCXdoaWxlIChjbnQgPiAwICYmIHN0YXQgJiBFUFBfTlJFRikgeworCQkJaWYgKHJlY2VpdmUoZGV2LCAxKSkKKwkJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCQljbnQtLTsKKwkJCWlmIChwcC0+b3BzLT5lcHBfcmVhZF9hZGRyKHBwLCAmc3RhdCwgMSwgMCkgIT0gMSkKKwkJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCX0KKwl9CisJR0VUVElDSyh0aW1lMyk7CisjaWZkZWYgQkFZQ09NX0RFQlVHCisJYmMtPmRlYnVnX3ZhbHMubW9kX2N5Y2xlcyA9IHRpbWUyIC0gdGltZTE7CisJYmMtPmRlYnVnX3ZhbHMuZGVtb2RfY3ljbGVzID0gdGltZTMgLSB0aW1lMjsKKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJjLT5ydW5fd29yaywgMSk7CisJaWYgKCFiYy0+c2tiKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJcmV0dXJuOworIGVwcHRpbWVvdXQ6CisJcHJpbnRrKEtFUk5fRVJSICIlczogRVBQIHRpbWVvdXQhXG4iLCBiY19kcnZuYW1lKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PSBuZXR3b3JrIGRyaXZlciBpbnRlcmZhY2UgPT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3N0YXRpYyBpbnQgYmF5Y29tX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHNrYi0+ZGF0YVswXSAhPSAwKSB7CisJCWRvX2tpc3NfcGFyYW1zKGJjLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGJjLT5za2IpCisJCXJldHVybiAtMTsKKwkvKiBzdHJpcCBLSVNTIGJ5dGUgKi8KKwlpZiAoc2tiLT5sZW4gPj0gSERMQ0RSVl9NQVhGTEVOKzEgfHwgc2tiLT5sZW4gPCAzKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwliYy0+c2tiID0gc2tiOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBiYXljb21fc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyOworCisJLyogYWRkciBpcyBhbiBBWC4yNSBzaGlmdGVkIEFTQ0lJIG1hYyBhZGRyZXNzICovCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHNhLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsgCisJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYmF5Y29tX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIAorCSAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLiAgVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlCisJICogY2FyZCBvcGVuIG9yIGNsb3NlZC4gCisJICovCisJcmV0dXJuICZiYy0+c3RhdHM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBlcHBfd2FrZXVwKHZvaWQgKmhhbmRsZSkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWhhbmRsZTsKKyAgICAgICAgc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJiYXljb21fZXBwOiAlczogd2h5IGFtIEkgYmVpbmcgd29rZW4gdXA/XG4iLCBkZXYtPm5hbWUpOworICAgICAgICBpZiAoIXBhcnBvcnRfY2xhaW0oYmMtPnBkZXYpKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJiYXljb21fZXBwOiAlczogSSdtIGJyb2tlbi5cbiIsIGRldi0+bmFtZSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKKyAqIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgKiByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICogdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworCitzdGF0aWMgaW50IGVwcF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBzdHJ1Y3QgcGFycG9ydCAqcHAgPSBwYXJwb3J0X2ZpbmRfYmFzZShkZXYtPmJhc2VfYWRkcik7CisJdW5zaWduZWQgaW50IGksIGo7CisJdW5zaWduZWQgY2hhciB0bXBbMTI4XTsKKwl1bnNpZ25lZCBjaGFyIHN0YXQ7CisJdW5zaWduZWQgbG9uZyB0c3RhcnQ7CisJCisgICAgICAgIGlmICghcHApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBwYXJwb3J0IGF0IDB4JWx4IHVua25vd25cbiIsIGJjX2Rydm5hbWUsIGRldi0+YmFzZV9hZGRyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOworICAgICAgICB9CisjaWYgMAorICAgICAgICBpZiAocHAtPmlycSA8IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBwYXJwb3J0IGF0IDB4JWx4IGhhcyBubyBpcnFcbiIsIGJjX2Rydm5hbWUsIHBwLT5iYXNlKTsKKwkJcGFycG9ydF9wdXRfcG9ydChwcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTlhJTzsKKyAgICAgICAgfQorI2VuZGlmCisJaWYgKCh+cHAtPm1vZGVzKSAmIChQQVJQT1JUX01PREVfVFJJU1RBVEUgfCBQQVJQT1JUX01PREVfUENTUFAgfCBQQVJQT1JUX01PREVfU0FGRUlOSU5UKSkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IHBhcnBvcnQgYXQgMHglbHggY2Fubm90IGJlIHVzZWRcbiIsCisJCSAgICAgICBiY19kcnZuYW1lLCBwcC0+YmFzZSk7CisJCXBhcnBvcnRfcHV0X3BvcnQocHApOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlPOworCX0KKwltZW1zZXQoJmJjLT5tb2RlbSwgMCwgc2l6ZW9mKGJjLT5tb2RlbSkpOworICAgICAgICBiYy0+cGRldiA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlKHBwLCBkZXYtPm5hbWUsIE5VTEwsIGVwcF93YWtldXAsIAorCQkJCQllcHBfaW50ZXJydXB0LCBQQVJQT1JUX0RFVl9FWENMLCBkZXYpOworCXBhcnBvcnRfcHV0X3BvcnQocHApOworICAgICAgICBpZiAoIWJjLT5wZGV2KSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IHJlZ2lzdGVyIHBhcnBvcnQgYXQgMHglbHhcbiIsIGJjX2Rydm5hbWUsIHBwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJwb3J0X2NsYWltKGJjLT5wZGV2KSkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IHBhcnBvcnQgYXQgMHglbHggYnVzeVxuIiwgYmNfZHJ2bmFtZSwgcHAtPmJhc2UpOworICAgICAgICAgICAgICAgIHBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoYmMtPnBkZXYpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgIH0KKyAgICAgICAgZGV2LT5pcnEgPSAvKnBwLT5pcnEqLyAwOworCUlOSVRfV09SSygmYmMtPnJ1bl93b3JrLCAodm9pZCAqKSh2b2lkICopZXBwX2JoLCBkZXYpOworCWJjLT53b3JrX3J1bm5pbmcgPSAxOworCWJjLT5tb2RlbSA9IEVQUF9DT05WRU5USU9OQUw7CisJaWYgKGVwcGNvbmZpZyhiYykpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBGUEdBIGRldGVjdGVkLCBhc3N1bWluZyBjb252ZW50aW9uYWwgRVBQIG1vZGVtXG4iLCBiY19kcnZuYW1lKTsKKwllbHNlCisJCWJjLT5tb2RlbSA9IC8qRVBQX0ZQR0EqLyBFUFBfRlBHQUVYVFNUQVRVUzsKKwlwYXJwb3J0X3dyaXRlX2NvbnRyb2wocHAsIExQVENUUkxfUFJPR1JBTSk7IC8qIHByZXBhcmUgRVBQIG1vZGU7IHdlIGFyZW4ndCB1c2luZyBpbnRlcnJ1cHRzICovCisJLyogcmVzZXQgdGhlIG1vZGVtICovCisJdG1wWzBdID0gMDsKKwl0bXBbMV0gPSBFUFBfVFhfRklGT19FTkFCTEV8RVBQX1JYX0ZJRk9fRU5BQkxFfEVQUF9NT0RFTV9FTkFCTEU7CisJaWYgKHBwLT5vcHMtPmVwcF93cml0ZV9hZGRyKHBwLCB0bXAsIDIsIDApICE9IDIpCisJCWdvdG8gZXBwdGltZW91dDsKKwkvKiBhdXRvcHJvYmUgYmF1ZCByYXRlICovCisJdHN0YXJ0ID0gamlmZmllczsKKwlpID0gMDsKKwl3aGlsZSAoKHNpZ25lZCkoamlmZmllcy10c3RhcnQtSFovMykgPCAwKSB7CisJCWlmIChwcC0+b3BzLT5lcHBfcmVhZF9hZGRyKHBwLCAmc3RhdCwgMSwgMCkgIT0gMSkKKwkJCWdvdG8gZXBwdGltZW91dDsKKwkJaWYgKChzdGF0ICYgKEVQUF9OUkFFRnxFUFBfTlJIRikpID09IEVQUF9OUkhGKSB7CisJCQlzY2hlZHVsZSgpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHBwLT5vcHMtPmVwcF9yZWFkX2RhdGEocHAsIHRtcCwgMTI4LCAwKSAhPSAxMjgpCisJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCWlmIChwcC0+b3BzLT5lcHBfcmVhZF9kYXRhKHBwLCB0bXAsIDEyOCwgMCkgIT0gMTI4KQorCQkJZ290byBlcHB0aW1lb3V0OworCQlpICs9IDI1NjsKKwl9CisJZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKSB7CisJCWlmIChwcC0+b3BzLT5lcHBfcmVhZF9hZGRyKHBwLCAmc3RhdCwgMSwgMCkgIT0gMSkKKwkJCWdvdG8gZXBwdGltZW91dDsKKwkJaWYgKCEoc3RhdCAmIEVQUF9OUkVGKSkKKwkJCWJyZWFrOworCQlpZiAocHAtPm9wcy0+ZXBwX3JlYWRfZGF0YShwcCwgdG1wLCAxLCAwKSAhPSAxKQorCQkJZ290byBlcHB0aW1lb3V0OworCQlpKys7CisJfQorCXRzdGFydCA9IGppZmZpZXMgLSB0c3RhcnQ7CisJYmMtPmJpdHJhdGUgPSBpICogKDggKiBIWikgLyB0c3RhcnQ7CisJaiA9IDE7CisJaSA9IGJjLT5iaXRyYXRlID4+IDM7CisJd2hpbGUgKGogPCA3ICYmIGkgPiAxNTApIHsKKwkJaisrOworCQlpID4+PSAxOworCX0KKwlwcmludGsoS0VSTl9JTkZPICIlczogYXV0b3Byb2JlZCBiaXRyYXRlOiAlZCAgaW50IGRpdmlkZXI6ICVkICBpbnQgcmF0ZTogJWRcbiIsIAorCSAgICAgICBiY19kcnZuYW1lLCBiYy0+Yml0cmF0ZSwgaiwgYmMtPmJpdHJhdGUgPj4gKGorMikpOworCXRtcFswXSA9IEVQUF9UWF9GSUZPX0VOQUJMRXxFUFBfUlhfRklGT19FTkFCTEV8RVBQX01PREVNX0VOQUJMRS8qfGoqLzsKKwlpZiAocHAtPm9wcy0+ZXBwX3dyaXRlX2FkZHIocHAsIHRtcCwgMSwgMCkgIT0gMSkKKwkJZ290byBlcHB0aW1lb3V0OworCS8qCisJICogaW5pdGlhbGlzZSBoZGxjIHZhcmlhYmxlcworCSAqLworCWJjLT5oZGxjcnguc3RhdGUgPSAwOworCWJjLT5oZGxjcngubnVtYml0cyA9IDA7CisJYmMtPmhkbGN0eC5zdGF0ZSA9IHR4X2lkbGU7CisJYmMtPmhkbGN0eC5idWZjbnQgPSAwOworCWJjLT5oZGxjdHguc2xvdGNudCA9IGJjLT5jaF9wYXJhbXMuc2xvdHRpbWU7CisJYmMtPmhkbGN0eC5jYWxpYnJhdGUgPSAwOworCS8qIHN0YXJ0IHRoZSBib3R0b20gaGFsZiBzdHVmZiAqLworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYmMtPnJ1bl93b3JrLCAxKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworCisgZXBwdGltZW91dDoKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBlcHAgdGltZW91dCBkdXJpbmcgYml0cmF0ZSBwcm9iZVxuIiwgYmNfZHJ2bmFtZSk7CisJcGFycG9ydF93cml0ZV9jb250cm9sKHBwLCAwKTsgLyogcmVzZXQgdGhlIGFkYXB0ZXIgKi8KKyAgICAgICAgcGFycG9ydF9yZWxlYXNlKGJjLT5wZGV2KTsKKyAgICAgICAgcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShiYy0+cGRldik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGVwcF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGFycG9ydCAqcHAgPSBiYy0+cGRldi0+cG9ydDsKKwl1bnNpZ25lZCBjaGFyIHRtcFsxXTsKKworCWJjLT53b3JrX3J1bm5pbmcgPSAwOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJYmMtPnN0YXQgPSBFUFBfRENEQklUOworCXRtcFswXSA9IDA7CisJcHAtPm9wcy0+ZXBwX3dyaXRlX2FkZHIocHAsIHRtcCwgMSwgMCk7CisJcGFycG9ydF93cml0ZV9jb250cm9sKHBwLCAwKTsgLyogcmVzZXQgdGhlIGFkYXB0ZXIgKi8KKyAgICAgICAgcGFycG9ydF9yZWxlYXNlKGJjLT5wZGV2KTsKKyAgICAgICAgcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShiYy0+cGRldik7CisJaWYgKGJjLT5za2IpCisJCWRldl9rZnJlZV9za2IoYmMtPnNrYik7CisJYmMtPnNrYiA9IE5VTEw7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNsb3NlIGVwcCBhdCBpb2Jhc2UgMHglbHggaXJxICV1XG4iLAorCSAgICAgICBiY19kcnZuYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBiYXljb21fc2V0bW9kZShzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYywgY29uc3QgY2hhciAqbW9kZXN0cikKK3sKKwljb25zdCBjaGFyICpjcDsKKworCWlmIChzdHJzdHIobW9kZXN0ciwiaW50Y2xrIikpCisJCWJjLT5jZmcuaW50Y2xrID0gMTsKKwlpZiAoc3Ryc3RyKG1vZGVzdHIsImV4dGNsayIpKQorCQliYy0+Y2ZnLmludGNsayA9IDA7CisJaWYgKHN0cnN0cihtb2Rlc3RyLCJpbnRtb2RlbSIpKQorCQliYy0+Y2ZnLmV4dG1vZGVtID0gMDsKKwlpZiAoc3Ryc3RyKG1vZGVzdHIsImV4dG1vZGVtIikpCisJCWJjLT5jZmcuZXh0bW9kZW0gPSAxOworCWlmIChzdHJzdHIobW9kZXN0ciwibm9sb29wYmFjayIpKQorCQliYy0+Y2ZnLmxvb3BiYWNrID0gMDsKKwlpZiAoc3Ryc3RyKG1vZGVzdHIsImxvb3BiYWNrIikpCisJCWJjLT5jZmcubG9vcGJhY2sgPSAxOworCWlmICgoY3AgPSBzdHJzdHIobW9kZXN0ciwiZmNsaz0iKSkpIHsKKwkJYmMtPmNmZy5mY2xrID0gc2ltcGxlX3N0cnRvdWwoY3ArNSwgTlVMTCwgMCk7CisJCWlmIChiYy0+Y2ZnLmZjbGsgPCAxMDAwMDAwKQorCQkJYmMtPmNmZy5mY2xrID0gMTAwMDAwMDsKKwkJaWYgKGJjLT5jZmcuZmNsayA+IDI1MDAwMDAwKQorCQkJYmMtPmNmZy5mY2xrID0gMjUwMDAwMDA7CisJfQorCWlmICgoY3AgPSBzdHJzdHIobW9kZXN0ciwiYnBzPSIpKSkgeworCQliYy0+Y2ZnLmJwcyA9IHNpbXBsZV9zdHJ0b3VsKGNwKzQsIE5VTEwsIDApOworCQlpZiAoYmMtPmNmZy5icHMgPCAxMDAwKQorCQkJYmMtPmNmZy5icHMgPSAxMDAwOworCQlpZiAoYmMtPmNmZy5icHMgPiAxNTAwMDAwKQorCQkJYmMtPmNmZy5icHMgPSAxNTAwMDAwOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYmF5Y29tX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaGRsY2Rydl9pb2N0bCBoaTsKKworCWlmIChjbWQgIT0gU0lPQ0RFVlBSSVZBVEUpCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmhpLCBpZnItPmlmcl9kYXRhLCBzaXplb2YoaGkpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc3dpdGNoIChoaS5jbWQpIHsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJY2FzZSBIRExDRFJWQ1RMX0dFVENIQU5ORUxQQVI6CisJCWhpLmRhdGEuY3AudHhfZGVsYXkgPSBiYy0+Y2hfcGFyYW1zLnR4X2RlbGF5OworCQloaS5kYXRhLmNwLnR4X3RhaWwgPSBiYy0+Y2hfcGFyYW1zLnR4X3RhaWw7CisJCWhpLmRhdGEuY3Auc2xvdHRpbWUgPSBiYy0+Y2hfcGFyYW1zLnNsb3R0aW1lOworCQloaS5kYXRhLmNwLnBwZXJzaXN0ID0gYmMtPmNoX3BhcmFtcy5wcGVyc2lzdDsKKwkJaGkuZGF0YS5jcC5mdWxsZHVwID0gYmMtPmNoX3BhcmFtcy5mdWxsZHVwOworCQlicmVhazsKKworCWNhc2UgSERMQ0RSVkNUTF9TRVRDSEFOTkVMUEFSOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJYmMtPmNoX3BhcmFtcy50eF9kZWxheSA9IGhpLmRhdGEuY3AudHhfZGVsYXk7CisJCWJjLT5jaF9wYXJhbXMudHhfdGFpbCA9IGhpLmRhdGEuY3AudHhfdGFpbDsKKwkJYmMtPmNoX3BhcmFtcy5zbG90dGltZSA9IGhpLmRhdGEuY3Auc2xvdHRpbWU7CisJCWJjLT5jaF9wYXJhbXMucHBlcnNpc3QgPSBoaS5kYXRhLmNwLnBwZXJzaXN0OworCQliYy0+Y2hfcGFyYW1zLmZ1bGxkdXAgPSBoaS5kYXRhLmNwLmZ1bGxkdXA7CisJCWJjLT5oZGxjdHguc2xvdGNudCA9IDE7CisJCXJldHVybiAwOworCQkKKwljYXNlIEhETENEUlZDVExfR0VUTU9ERU1QQVI6CisJCWhpLmRhdGEubXAuaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJCWhpLmRhdGEubXAuaXJxID0gZGV2LT5pcnE7CisJCWhpLmRhdGEubXAuZG1hID0gZGV2LT5kbWE7CisJCWhpLmRhdGEubXAuZG1hMiA9IDA7CisJCWhpLmRhdGEubXAuc2VyaW9iYXNlID0gMDsKKwkJaGkuZGF0YS5tcC5wYXJpb2Jhc2UgPSAwOworCQloaS5kYXRhLm1wLm1pZGlpb2Jhc2UgPSAwOworCQlicmVhazsKKworCWNhc2UgSERMQ0RSVkNUTF9TRVRNT0RFTVBBUjoKKwkJaWYgKCghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkgfHwgbmV0aWZfcnVubmluZyhkZXYpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWRldi0+YmFzZV9hZGRyID0gaGkuZGF0YS5tcC5pb2Jhc2U7CisJCWRldi0+aXJxID0gLypoaS5kYXRhLm1wLmlycSovMDsKKwkJZGV2LT5kbWEgPSAvKmhpLmRhdGEubXAuZG1hKi8wOworCQlyZXR1cm4gMDsJCisJCQorCWNhc2UgSERMQ0RSVkNUTF9HRVRTVEFUOgorCQloaS5kYXRhLmNzLnB0dCA9ICEhKGJjLT5zdGF0ICYgRVBQX1BUVEJJVCk7CisJCWhpLmRhdGEuY3MuZGNkID0gIShiYy0+c3RhdCAmIEVQUF9EQ0RCSVQpOworCQloaS5kYXRhLmNzLnB0dF9rZXllZCA9IGJjLT5wdHRfa2V5ZWQ7CisJCWhpLmRhdGEuY3MudHhfcGFja2V0cyA9IGJjLT5zdGF0cy50eF9wYWNrZXRzOworCQloaS5kYXRhLmNzLnR4X2Vycm9ycyA9IGJjLT5zdGF0cy50eF9lcnJvcnM7CisJCWhpLmRhdGEuY3MucnhfcGFja2V0cyA9IGJjLT5zdGF0cy5yeF9wYWNrZXRzOworCQloaS5kYXRhLmNzLnJ4X2Vycm9ycyA9IGJjLT5zdGF0cy5yeF9lcnJvcnM7CisJCWJyZWFrOwkJCisKKwljYXNlIEhETENEUlZDVExfT0xER0VUU1RBVDoKKwkJaGkuZGF0YS5vY3MucHR0ID0gISEoYmMtPnN0YXQgJiBFUFBfUFRUQklUKTsKKwkJaGkuZGF0YS5vY3MuZGNkID0gIShiYy0+c3RhdCAmIEVQUF9EQ0RCSVQpOworCQloaS5kYXRhLm9jcy5wdHRfa2V5ZWQgPSBiYy0+cHR0X2tleWVkOworCQlicmVhazsJCQorCisJY2FzZSBIRExDRFJWQ1RMX0NBTElCUkFURToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWJjLT5oZGxjdHguY2FsaWJyYXRlID0gaGkuZGF0YS5jYWxpYnJhdGUgKiBiYy0+Yml0cmF0ZSAvIDg7CisJCXJldHVybiAwOworCisJY2FzZSBIRExDRFJWQ1RMX0RSSVZFUk5BTUU6CisJCXN0cm5jcHkoaGkuZGF0YS5kcml2ZXJuYW1lLCAiYmF5Y29tX2VwcCIsIHNpemVvZihoaS5kYXRhLmRyaXZlcm5hbWUpKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgSERMQ0RSVkNUTF9HRVRNT0RFOgorCQlzcHJpbnRmKGhpLmRhdGEubW9kZW5hbWUsICIlc2Nsaywlc21vZGVtLGZjbGs9JWQsYnBzPSVkJXMiLCAKKwkJCWJjLT5jZmcuaW50Y2xrID8gImludCIgOiAiZXh0IiwKKwkJCWJjLT5jZmcuZXh0bW9kZW0gPyAiZXh0IiA6ICJpbnQiLCBiYy0+Y2ZnLmZjbGssIGJjLT5jZmcuYnBzLAorCQkJYmMtPmNmZy5sb29wYmFjayA/ICIsbG9vcGJhY2siIDogIiIpOworCQlicmVhazsKKworCWNhc2UgSERMQ0RSVkNUTF9TRVRNT0RFOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikgfHwgbmV0aWZfcnVubmluZyhkZXYpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWhpLmRhdGEubW9kZW5hbWVbc2l6ZW9mKGhpLmRhdGEubW9kZW5hbWUpLTFdID0gJ1wwJzsKKwkJcmV0dXJuIGJheWNvbV9zZXRtb2RlKGJjLCBoaS5kYXRhLm1vZGVuYW1lKTsKKworCWNhc2UgSERMQ0RSVkNUTF9NT0RFTElTVDoKKwkJc3RybmNweShoaS5kYXRhLm1vZGVuYW1lLCAiaW50Y2xrLGV4dGNsayxpbnRtb2RlbSxleHRtb2RlbSxkaXZpZGVyPXgiLAorCQkJc2l6ZW9mKGhpLmRhdGEubW9kZW5hbWUpKTsKKwkJYnJlYWs7CisKKwljYXNlIEhETENEUlZDVExfTU9ERU1QQVJNQVNLOgorCQlyZXR1cm4gSERMQ0RSVl9QQVJNQVNLX0lPQkFTRTsKKworCX0KKwlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsICZoaSwgc2l6ZW9mKGhpKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUsIGFuZCByZXR1cm4gJzAnIGlmIG9uZSBleGlzdHMuCisgKiBJZiBkZXYtPmJhc2VfYWRkciA9PSAwLCBwcm9iZSBhbGwgbGlrZWx5IGxvY2F0aW9ucy4KKyAqIElmIGRldi0+YmFzZV9hZGRyID09IDEsIGFsd2F5cyByZXR1cm4gZmFpbHVyZS4KKyAqIElmIGRldi0+YmFzZV9hZGRyID09IDIsIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZGV2aWNlIGFuZCByZXR1cm4gc3VjY2VzcworICogKGRldGFjaGFibGUgZGV2aWNlcyBvbmx5KS4KKyAqLworc3RhdGljIHZvaWQgYmF5Y29tX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RhdGljIGNoYXIgYXgyNV9iY2FzdFtBWDI1X0FERFJfTEVOXSA9IHsKKwkJJ1EnIDw8IDEsICdTJyA8PCAxLCAnVCcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnICcgPDwgMSwgJzAnIDw8IDEKKwl9OworCXN0YXRpYyBjaGFyIGF4MjVfbm9jYWxsW0FYMjVfQUREUl9MRU5dID0geworCQknTCcgPDwgMSwgJ0knIDw8IDEsICdOJyA8PCAxLCAnVScgPDwgMSwgJ1gnIDw8IDEsICcgJyA8PCAxLCAnMScgPDwgMQorCX07CisJY29uc3Qgc3RydWN0IGhkbGNkcnZfY2hhbm5lbF9wYXJhbXMgZGZsdF9jaF9wYXJhbXMgPSB7IAorCQkyMCwgMiwgMTAsIDQwLCAwIAorCX07CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmM7CisKKwkvKgorCSAqIG5vdCBhIHJlYWwgcHJvYmUhIG9ubHkgaW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMKKwkgKi8KKwliYyA9IG5ldGRldl9wcml2KGRldik7CisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSBiYXljb21fc3RhdGUgc3RydWN0CisJICovCisJYmMtPmNoX3BhcmFtcyA9IGRmbHRfY2hfcGFyYW1zOworCWJjLT5wdHRfa2V5ZWQgPSAwOworCisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RydWN0CisJICovCisJZGV2LT5vcGVuID0gZXBwX29wZW47CisJZGV2LT5zdG9wID0gZXBwX2Nsb3NlOworCWRldi0+ZG9faW9jdGwgPSBiYXljb21faW9jdGw7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBiYXljb21fc2VuZF9wYWNrZXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBiYXljb21fZ2V0X3N0YXRzOworCisJLyogRmlsbCBpbiB0aGUgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlICovCisJYmMtPnNrYiA9IE5VTEw7CisJCisjaWYgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCisJZGV2LT5oYXJkX2hlYWRlciA9IGF4MjVfZW5jYXBzdWxhdGU7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciA9IGF4MjVfcmVidWlsZF9oZWFkZXI7CisjZWxzZSAvKiBDT05GSUdfQVgyNSB8fCBDT05GSUdfQVgyNV9NT0RVTEUgKi8KKwlkZXYtPmhhcmRfaGVhZGVyID0gTlVMTDsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyID0gTlVMTDsKKyNlbmRpZiAvKiBDT05GSUdfQVgyNSB8fCBDT05GSUdfQVgyNV9NT0RVTEUgKi8KKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGJheWNvbV9zZXRfbWFjX2FkZHJlc3M7CisJCisJZGV2LT50eXBlID0gQVJQSFJEX0FYMjU7ICAgICAgICAgICAvKiBBRl9BWDI1IGRldmljZSAqLworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gQVgyNV9NQVhfSEVBREVSX0xFTiArIEFYMjVfQlBRX0hFQURFUl9MRU47CisJZGV2LT5tdHUgPSBBWDI1X0RFRl9QQUNMRU47ICAgICAgICAvKiBldGhfbXR1IGlzIHRoZSBkZWZhdWx0ICovCisJZGV2LT5hZGRyX2xlbiA9IEFYMjVfQUREUl9MRU47ICAgICAvKiBzaXplb2YgYW4gYXguMjUgYWRkcmVzcyAqLworCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgYXgyNV9iY2FzdCwgQVgyNV9BRERSX0xFTik7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGF4MjVfbm9jYWxsLCBBWDI1X0FERFJfTEVOKTsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDE2OworCisJLyogTmV3IHN0eWxlIGZsYWdzICovCisJZGV2LT5mbGFncyA9IDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogY29tbWFuZCBsaW5lIHNldHRhYmxlIHBhcmFtZXRlcnMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKm1vZGVbTlJfUE9SVFNdID0geyAiIiwgfTsKK3N0YXRpYyBpbnQgaW9iYXNlW05SX1BPUlRTXSA9IHsgMHgzNzgsIH07CisKK21vZHVsZV9wYXJhbV9hcnJheShtb2RlLCBjaGFycCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vZGUsICJiYXljb20gb3BlcmF0aW5nIG1vZGUiKTsKK21vZHVsZV9wYXJhbV9hcnJheShpb2Jhc2UsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvYmFzZSwgImJheWNvbSBpbyBiYXNlIGFkZHJlc3MiKTsKKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIE0uIFNhaWxlciwgc2FpbGVyQGlmZS5lZS5ldGh6LmNoLCBoYjlqbnhAaGI5dy5jaGUuZXUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmF5Y29tIGVwcCBhbWF0ZXVyIHJhZGlvIG1vZGVtIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgX19pbml0IGJheWNvbV9lcHBfZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyoKKwkgKiBpbml0aWFsaXplIHBhcnQgb2YgdGhlIGJheWNvbV9zdGF0ZSBzdHJ1Y3QKKwkgKi8KKwliYy0+bWFnaWMgPSBCQVlDT01fTUFHSUM7CisJYmMtPmNmZy5mY2xrID0gMTk2NjY2MDA7CisJYmMtPmNmZy5icHMgPSA5NjAwOworCS8qCisJICogaW5pdGlhbGl6ZSBwYXJ0IG9mIHRoZSBkZXZpY2Ugc3RydWN0CisJICovCisJYmF5Y29tX3Byb2JlKGRldik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYmF5Y29tZXBwKHZvaWQpCit7CisJaW50IGksIGZvdW5kID0gMDsKKwljaGFyIHNldF9odyA9IDE7CisKKwlwcmludGsoYmNfZHJ2aW5mbyk7CisJLyoKKwkgKiByZWdpc3RlciBuZXQgZGV2aWNlcworCSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCQorCQlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBiYXljb21fc3RhdGUpLCAiYmNlJWQiLAorCQkJCSAgIGJheWNvbV9lcHBfZGV2X3NldHVwKTsKKworCQlpZiAoIWRldikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYmNlJWQgOiBvdXQgb2YgbWVtb3J5XG4iLCBpKTsKKwkJCXJldHVybiBmb3VuZCA/IDAgOiAtRU5PTUVNOworCQl9CisJCQkKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJiY2UlZCIsIGkpOworCQlkZXYtPmJhc2VfYWRkciA9IGlvYmFzZVtpXTsKKworCQlpZiAoIW1vZGVbaV0pCisJCQlzZXRfaHcgPSAwOworCQlpZiAoIXNldF9odykKKwkJCWlvYmFzZVtpXSA9IDA7CisKKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UgJXNcbiIsIGJjX2Rydm5hbWUsIGRldi0+bmFtZSk7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNldF9odyAmJiBiYXljb21fc2V0bW9kZShuZXRkZXZfcHJpdihkZXYpLCBtb2RlW2ldKSkKKwkJCXNldF9odyA9IDA7CisJCWJheWNvbV9kZXZpY2VbaV0gPSBkZXY7CisJCWZvdW5kKys7CisJfQorCisJcmV0dXJuIGZvdW5kID8gMCA6IC1FTlhJTzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfYmF5Y29tZXBwKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBiYXljb21fZGV2aWNlW2ldOworCisJCWlmIChkZXYpIHsKKwkJCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJCWlmIChiYy0+bWFnaWMgPT0gQkFZQ09NX01BR0lDKSB7CisJCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCQlmcmVlX25ldGRldihkZXYpOworCQkJfSBlbHNlCisJCQkJcHJpbnRrKHBhcmFub2lhX3N0ciwgImNsZWFudXBfbW9kdWxlIik7CisJCX0KKwl9Cit9CisKK21vZHVsZV9pbml0KGluaXRfYmF5Y29tZXBwKTsKK21vZHVsZV9leGl0KGNsZWFudXBfYmF5Y29tZXBwKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTU9EVUxFCisKKy8qCisgKiBmb3JtYXQ6IGJheWNvbV9lcHA9aW8sbW9kZQorICogbW9kZTogZnBnYSBjb25maWcgb3B0aW9ucworICovCisKK3N0YXRpYyBpbnQgX19pbml0IGJheWNvbV9lcHBfc2V0dXAoY2hhciAqc3RyKQoreworICAgICAgICBzdGF0aWMgdW5zaWduZWQgX19pbml0ZGF0YSBucl9kZXYgPSAwOworCWludCBpbnRzWzJdOworCisgICAgICAgIGlmIChucl9kZXYgPj0gTlJfUE9SVFMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCAyLCBpbnRzKTsKKwlpZiAoaW50c1swXSA8IDEpCisJCXJldHVybiAwOworCW1vZGVbbnJfZGV2XSA9IHN0cjsKKwlpb2Jhc2VbbnJfZGV2XSA9IGludHNbMV07CisJbnJfZGV2Kys7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImJheWNvbV9lcHA9IiwgYmF5Y29tX2VwcF9zZXR1cCk7CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Bhci5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Bhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMmFkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fcGFyLmMKQEAgLTAsMCArMSw1NzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCWJheWNvbV9wYXIuYyAgLS0gYmF5Y29tIHBhcjk2IGFuZCBwaWNwYXIgcmFkaW8gbW9kZW0gZHJpdmVyLgorICoKKyAqCUNvcHlyaWdodCAoQykgMTk5Ni0yMDAwICBUaG9tYXMgU2FpbGVyIChzYWlsZXJAaWZlLmVlLmV0aHouY2gpCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogIFBsZWFzZSBub3RlIHRoYXQgdGhlIEdQTCBhbGxvd3MgeW91IHRvIHVzZSB0aGUgZHJpdmVyLCBOT1QgdGhlIHJhZGlvLgorICogIEluIG9yZGVyIHRvIHVzZSB0aGUgcmFkaW8sIHlvdSBuZWVkIGEgbGljZW5zZSBmcm9tIHRoZSBjb21tdW5pY2F0aW9ucworICogIGF1dGhvcml0eSBvZiB5b3VyIGNvdW50cnkuCisgKgorICoKKyAqICBTdXBwb3J0ZWQgbW9kZW1zCisgKgorICogIHBhcjk2OiAgVGhpcyBpcyBhIG1vZGVtIGZvciA5NjAwIGJhdWQgRlNLIGNvbXBhdGlibGUgdG8gdGhlIEczUlVIIHN0YW5kYXJkLgorICogICAgICAgICAgVGhlIG1vZGVtIGRvZXMgYWxsIHRoZSBmaWx0ZXJpbmcgYW5kIHJlZ2VuZXJhdGVzIHRoZSByZWNlaXZlciBjbG9jay4KKyAqICAgICAgICAgIERhdGEgaXMgdHJhbnNmZXJyZWQgZnJvbSBhbmQgdG8gdGhlIFBDIHZpYSBhIHNoaWZ0IHJlZ2lzdGVyLgorICogICAgICAgICAgVGhlIHNoaWZ0IHJlZ2lzdGVyIGlzIGZpbGxlZCB3aXRoIDE2IGJpdHMgYW5kIGFuIGludGVycnVwdCBpcworICogICAgICAgICAgc2lnbmFsbGVkLiBUaGUgUEMgdGhlbiBlbXB0aWVzIHRoZSBzaGlmdCByZWdpc3RlciBpbiBhIGJ1cnN0LiBUaGlzCisgKiAgICAgICAgICBtb2RlbSBjb25uZWN0cyB0byB0aGUgcGFyYWxsZWwgcG9ydCwgaGVuY2UgdGhlIG5hbWUuIFRoZSBtb2RlbQorICogICAgICAgICAgbGVhdmVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSERMQyBwcm90b2NvbCBhbmQgdGhlIHNjcmFtYmxlcgorICogICAgICAgICAgcG9seW5vbWlhbCB0byB0aGUgUEMuIFRoaXMgbW9kZW0gaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSAoYXQgbGVhc3QKKyAqICAgICAgICAgIGZyb20gQmF5Y29tKSBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIFBJQ1BBUiBtb2RlbSAoc2VlIGJlbG93KS4KKyAqICAgICAgICAgIFlvdSBtYXkgaG93ZXZlciBzdGlsbCBidWlsZCBvbmUgZnJvbSB0aGUgc2NoZW1hdGljcyBwdWJsaXNoZWQgaW4KKyAqICAgICAgICAgIGNxLURMIDotKS4KKyAqCisgKiAgcGljcGFyOiBUaGlzIGlzIGEgcmVkZXNpZ24gb2YgdGhlIHBhcjk2IG1vZGVtIGJ5IEhlbm5pbmcgUmVjaCwgREY5SUMuIFRoZQorICogICAgICAgICAgbW9kZW0gaXMgcHJvdG9jb2wgY29tcGF0aWJsZSB0byBwYXI5NiwgYnV0IHVzZXMgb25seSB0aHJlZSBsb3cKKyAqICAgICAgICAgIHBvd2VyIElDcyBhbmQgY2FuIHRoZXJlZm9yZSBiZSBmZWQgZnJvbSB0aGUgcGFyYWxsZWwgcG9ydCBhbmQKKyAqICAgICAgICAgIGRvZXMgbm90IHJlcXVpcmUgYW4gYWRkaXRpb25hbCBwb3dlciBzdXBwbHkuIEl0IGZlYXR1cmVzCisgKiAgICAgICAgICBidWlsdCBpbiBEQ0QgY2lyY3VpdHJ5LiBUaGUgZHJpdmVyIHNob3VsZCB0aGVyZWZvcmUgYmUgY29uZmlndXJlZAorICogICAgICAgICAgZm9yIGhhcmR3YXJlIERDRC4KKyAqCisgKgorICogIENvbW1hbmQgbGluZSBvcHRpb25zIChpbnNtb2QgY29tbWFuZCBsaW5lKQorICoKKyAqICBtb2RlICAgICBkcml2ZXIgbW9kZSBzdHJpbmcuIFZhbGlkIGNob2ljZXMgYXJlIHBhcjk2IGFuZCBwaWNwYXIuCisgKiAgaW9iYXNlICAgYmFzZSBhZGRyZXNzIG9mIHRoZSBwb3J0OyBjb21tb24gdmFsdWVzIGFyZSAweDM3OCwgMHgyNzgsIDB4M2JjCisgKgorICoKKyAqICBIaXN0b3J5OgorICogICAwLjEgIDI2LjA2LjE5OTYgIEFkYXB0ZWQgZnJvbSBiYXljb20uYyBhbmQgbWFkZSBuZXR3b3JrIGRyaXZlciBpbnRlcmZhY2UKKyAqICAgICAgICAxOC4xMC4xOTk2ICBDaGFuZ2VkIHRvIG5ldyB1c2VyIHNwYWNlIGFjY2VzcyByb3V0aW5lcyAoY29weV97dG8sZnJvbX1fdXNlcikKKyAqICAgMC4zICAyNi4wNC4xOTk3ICBpbml0IGNvZGUvZGF0YSB0YWdnZWQKKyAqICAgMC40ICAwOC4wNy4xOTk3ICBhbHRlcm5hdGl2ZSBzZXIxMiBkZWNvZGluZyBhbGdvcml0aG0gKHVzZXMgZGVsdGEgQ1RTIGludHMpCisgKiAgIDAuNSAgMTEuMTEuMTk5NyAgc3BsaXQgaW50byBzZXBhcmF0ZSBmaWxlcyBmb3Igc2VyMTIvcGFyOTYKKyAqICAgMC42ICAwMy4wOC4xOTk5ICBhZGFwdCB0byBMaW51cycgbmV3IF9fc2V0dXAvX19pbml0Y2FsbAorICogICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgc29tZSBwcmUtMi4yIGtlcm5lbCBjb21wYXRpYmlsaXR5IGNydWZ0CisgKiAgIDAuNyAgMTAuMDguMTk5OSAgQ2hlY2sgaWYgcGFycG9ydCBjYW4gZG8gU1BQIGFuZCBpcyBzYWZlIHRvIGFjY2VzcyBkdXJpbmcgaW50ZXJydXB0IGNvbnRleHRzCisgKiAgIDAuOCAgMTIuMDIuMjAwMCAgYWRhcHRlZCB0byBzb2Z0bmV0IGRyaXZlciBpbnRlcmZhY2UKKyAqICAgICAgICAgICAgICAgICAgICByZW1vdmVkIGRpcmVjdCBwYXJwb3J0IGFjY2VzcywgdXNlcyBwYXJwb3J0IGRyaXZlciBtZXRob2RzCisgKiAgIDAuOSAgMDMuMDcuMjAwMCAgZml4IGludGVyZmFjZSBuYW1lIGhhbmRsaW5nCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjZHJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYmF5Y29tLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2J1Zy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBCQVlDT01fREVCVUcKKworLyoKKyAqIG1vZGVtIG9wdGlvbnM7IGJpdCBtYXNrCisgKi8KKyNkZWZpbmUgQkFZQ09NX09QVElPTlNfU09GVERDRCAgMQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgYmNfZHJ2bmFtZVtdID0gImJheWNvbV9wYXIiOworc3RhdGljIGNvbnN0IGNoYXIgYmNfZHJ2aW5mb1tdID0gS0VSTl9JTkZPICJiYXljb21fcGFyOiAoQykgMTk5Ni0yMDAwIFRob21hcyBTYWlsZXIsIEhCOUpOWC9BRTRXQVxuIgorS0VSTl9JTkZPICJiYXljb21fcGFyOiB2ZXJzaW9uIDAuOSBjb21waWxlZCAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBOUl9QT1JUUyA0CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYmF5Y29tX2RldmljZVtOUl9QT1JUU107CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFBBUjk2X0JVUlNUQklUUyAxNgorI2RlZmluZSBQQVI5Nl9CVVJTVCAgICAgNAorI2RlZmluZSBQQVI5Nl9QVFQgICAgICAgMgorI2RlZmluZSBQQVI5Nl9UWEJJVCAgICAgMQorI2RlZmluZSBQQVI5Nl9BQ0sgICAgICAgMHg0MAorI2RlZmluZSBQQVI5Nl9SWEJJVCAgICAgMHgyMAorI2RlZmluZSBQQVI5Nl9EQ0QgICAgICAgMHgxMAorI2RlZmluZSBQQVI5N19QT1dFUiAgICAgMHhmOAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuCisgKi8KKworc3RydWN0IGJheWNvbV9zdGF0ZSB7CisJc3RydWN0IGhkbGNkcnZfc3RhdGUgaGRydjsKKworCXN0cnVjdCBwYXJkZXZpY2UgKnBkZXY7CisJdW5zaWduZWQgaW50IG9wdGlvbnM7CisKKwlzdHJ1Y3QgbW9kZW1fc3RhdGUgeworCQlzaG9ydCBhcmJfZGl2aWRlcjsKKwkJdW5zaWduZWQgY2hhciBmbGFnczsKKwkJdW5zaWduZWQgaW50IHNocmVnOworCQlzdHJ1Y3QgbW9kZW1fc3RhdGVfcGFyOTYgeworCQkJaW50IGRjZF9jb3VudDsKKwkJCXVuc2lnbmVkIGludCBkY2Rfc2hyZWc7CisJCQl1bnNpZ25lZCBsb25nIGRlc2NyYW07CisJCQl1bnNpZ25lZCBsb25nIHNjcmFtOworCQl9IHBhcjk2OworCX0gbW9kZW07CisKKyNpZmRlZiBCQVlDT01fREVCVUcKKwlzdHJ1Y3QgZGVidWdfdmFscyB7CisJCXVuc2lnbmVkIGxvbmcgbGFzdF9qaWZmaWVzOworCQl1bnNpZ25lZCBjdXJfaW50Y250OworCQl1bnNpZ25lZCBsYXN0X2ludGNudDsKKwkJaW50IGN1cl9wbGxjb3JyOworCQlpbnQgbGFzdF9wbGxjb3JyOworCX0gZGVidWdfdmFsczsKKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGJheWNvbV9pbnRfZnJlcShzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYykKK3sKKyNpZmRlZiBCQVlDT01fREVCVUcKKwl1bnNpZ25lZCBsb25nIGN1cl9qaWZmaWVzID0gamlmZmllczsKKwkvKgorCSAqIG1lYXN1cmUgdGhlIGludGVycnVwdCBmcmVxdWVuY3kKKwkgKi8KKwliYy0+ZGVidWdfdmFscy5jdXJfaW50Y250Kys7CisJaWYgKChjdXJfamlmZmllcyAtIGJjLT5kZWJ1Z192YWxzLmxhc3RfamlmZmllcykgPj0gSFopIHsKKwkJYmMtPmRlYnVnX3ZhbHMubGFzdF9qaWZmaWVzID0gY3VyX2ppZmZpZXM7CisJCWJjLT5kZWJ1Z192YWxzLmxhc3RfaW50Y250ID0gYmMtPmRlYnVnX3ZhbHMuY3VyX2ludGNudDsKKwkJYmMtPmRlYnVnX3ZhbHMuY3VyX2ludGNudCA9IDA7CisJCWJjLT5kZWJ1Z192YWxzLmxhc3RfcGxsY29yciA9IGJjLT5kZWJ1Z192YWxzLmN1cl9wbGxjb3JyOworCQliYy0+ZGVidWdfdmFscy5jdXJfcGxsY29yciA9IDA7CisJfQorI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT0gUEFSOTYgc3BlY2lmaWMgcm91dGluZXMgPT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNkZWZpbmUgUEFSOTZfREVTQ1JBTV9UQVAxIDB4MjAwMDAKKyNkZWZpbmUgUEFSOTZfREVTQ1JBTV9UQVAyIDB4MDEwMDAKKyNkZWZpbmUgUEFSOTZfREVTQ1JBTV9UQVAzIDB4MDAwMDEKKworI2RlZmluZSBQQVI5Nl9ERVNDUkFNX1RBUFNIMSAxNworI2RlZmluZSBQQVI5Nl9ERVNDUkFNX1RBUFNIMiAxMgorI2RlZmluZSBQQVI5Nl9ERVNDUkFNX1RBUFNIMyAwCisKKyNkZWZpbmUgUEFSOTZfU0NSQU1fVEFQMSAweDIwMDAwIC8qIFheMTcgKi8KKyNkZWZpbmUgUEFSOTZfU0NSQU1fVEFQTiAweDAwMDIxIC8qIFheMCtYXjUgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcGFyOTZfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGRhdGEgPSBoZGxjZHJ2X2dldGJpdHMoJmJjLT5oZHJ2KTsKKwlzdHJ1Y3QgcGFycG9ydCAqcHAgPSBiYy0+cGRldi0+cG9ydDsKKworCWZvcihpID0gMDsgaSA8IFBBUjk2X0JVUlNUQklUUzsgaSsrLCBkYXRhID4+PSAxKSB7CisJCXVuc2lnbmVkIGNoYXIgdmFsID0gUEFSOTdfUE9XRVI7CisJCWJjLT5tb2RlbS5wYXI5Ni5zY3JhbSA9ICgoYmMtPm1vZGVtLnBhcjk2LnNjcmFtIDw8IDEpIHwKKwkJCQkJIChiYy0+bW9kZW0ucGFyOTYuc2NyYW0gJiAxKSk7CisJCWlmICghKGRhdGEgJiAxKSkKKwkJCWJjLT5tb2RlbS5wYXI5Ni5zY3JhbSBePSAxOworCQlpZiAoYmMtPm1vZGVtLnBhcjk2LnNjcmFtICYgKFBBUjk2X1NDUkFNX1RBUDEgPDwgMSkpCisJCQliYy0+bW9kZW0ucGFyOTYuc2NyYW0gXj0KKwkJCQkoUEFSOTZfU0NSQU1fVEFQTiA8PCAxKTsKKwkJaWYgKGJjLT5tb2RlbS5wYXI5Ni5zY3JhbSAmIChQQVI5Nl9TQ1JBTV9UQVAxIDw8IDIpKQorCQkJdmFsIHw9IFBBUjk2X1RYQklUOworCQlwcC0+b3BzLT53cml0ZV9kYXRhKHBwLCB2YWwpOworCQlwcC0+b3BzLT53cml0ZV9kYXRhKHBwLCB2YWwgfCBQQVI5Nl9CVVJTVCk7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBwYXI5Nl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgZGF0YSwgbWFzaywgbWFzazIsIGRlc2N4OworCXN0cnVjdCBwYXJwb3J0ICpwcCA9IGJjLT5wZGV2LT5wb3J0OworCisJLyoKKwkgKiBkbyByZWNlaXZlcjsgZGlmZmVyZW50aWFsIGRlY29kZSBhbmQgZGVzY3JhbWJsZSBvbiB0aGUgZmx5CisJICovCisJZm9yKGRhdGEgPSBpID0gMDsgaSA8IFBBUjk2X0JVUlNUQklUUzsgaSsrKSB7CisJCWJjLT5tb2RlbS5wYXI5Ni5kZXNjcmFtID0gKGJjLT5tb2RlbS5wYXI5Ni5kZXNjcmFtIDw8IDEpOworCQlpZiAocHAtPm9wcy0+cmVhZF9zdGF0dXMocHApICYgUEFSOTZfUlhCSVQpCisJCQliYy0+bW9kZW0ucGFyOTYuZGVzY3JhbSB8PSAxOworCQlkZXNjeCA9IGJjLT5tb2RlbS5wYXI5Ni5kZXNjcmFtIF4KKwkJCShiYy0+bW9kZW0ucGFyOTYuZGVzY3JhbSA+PiAxKTsKKwkJLyogbm93IHRoZSBkaWZmIGRlY29kZWQgZGF0YSBpcyBpbnZlcnRlZCBpbiBkZXNjcmFtICovCisJCXBwLT5vcHMtPndyaXRlX2RhdGEocHAsIFBBUjk3X1BPV0VSIHwgUEFSOTZfUFRUKTsKKwkJZGVzY3ggXj0gKChkZXNjeCA+PiBQQVI5Nl9ERVNDUkFNX1RBUFNIMSkgXgorCQkJICAoZGVzY3ggPj4gUEFSOTZfREVTQ1JBTV9UQVBTSDIpKTsKKwkJZGF0YSA+Pj0gMTsKKwkJaWYgKCEoZGVzY3ggJiAxKSkKKwkJCWRhdGEgfD0gMHg4MDAwOworCQlwcC0+b3BzLT53cml0ZV9kYXRhKHBwLCBQQVI5N19QT1dFUiB8IFBBUjk2X1BUVCB8IFBBUjk2X0JVUlNUKTsKKwl9CisJaGRsY2Rydl9wdXRiaXRzKCZiYy0+aGRydiwgZGF0YSk7CisJLyoKKwkgKiBkbyBEQ0QgYWxnb3JpdGhtCisJICovCisJaWYgKGJjLT5vcHRpb25zICYgQkFZQ09NX09QVElPTlNfU09GVERDRCkgeworCQliYy0+bW9kZW0ucGFyOTYuZGNkX3NocmVnID0gKGJjLT5tb2RlbS5wYXI5Ni5kY2Rfc2hyZWcgPj4gMTYpCisJCQl8IChkYXRhIDw8IDE2KTsKKwkJLyogc2VhcmNoIGZvciBmbGFncyBhbmQgc2V0IHRoZSBkY2QgY291bnRlciBhcHByb3ByaWF0ZWx5ICovCisJCWZvcihtYXNrID0gMHgxZmUwMCwgbWFzazIgPSAweGZjMDAsIGkgPSAwOworCQkgICAgaSA8IFBBUjk2X0JVUlNUQklUUzsgaSsrLCBtYXNrIDw8PSAxLCBtYXNrMiA8PD0gMSkKKwkJCWlmICgoYmMtPm1vZGVtLnBhcjk2LmRjZF9zaHJlZyAmIG1hc2spID09IG1hc2syKQorCQkJCWJjLT5tb2RlbS5wYXI5Ni5kY2RfY291bnQgPSBIRExDRFJWX01BWEZMRU4rNDsKKwkJLyogY2hlY2sgZm9yIGFib3J0L25vaXNlIHNlcXVlbmNlcyAqLworCQlmb3IobWFzayA9IDB4MWZlMDAsIG1hc2syID0gMHgxZmUwMCwgaSA9IDA7CisJCSAgICBpIDwgUEFSOTZfQlVSU1RCSVRTOyBpKyssIG1hc2sgPDw9IDEsIG1hc2syIDw8PSAxKQorCQkJaWYgKCgoYmMtPm1vZGVtLnBhcjk2LmRjZF9zaHJlZyAmIG1hc2spID09IG1hc2syKSAmJgorCQkJICAgIChiYy0+bW9kZW0ucGFyOTYuZGNkX2NvdW50ID49IDApKQorCQkJCWJjLT5tb2RlbS5wYXI5Ni5kY2RfY291bnQgLT0gSERMQ0RSVl9NQVhGTEVOLTEwOworCQkvKiBkZWNyZW1lbnQgYW5kIHNldCB0aGUgZGNkIHZhcmlhYmxlICovCisJCWlmIChiYy0+bW9kZW0ucGFyOTYuZGNkX2NvdW50ID49IDApCisJCQliYy0+bW9kZW0ucGFyOTYuZGNkX2NvdW50IC09IDI7CisJCWhkbGNkcnZfc2V0ZGNkKCZiYy0+aGRydiwgYmMtPm1vZGVtLnBhcjk2LmRjZF9jb3VudCA+IDApOworCX0gZWxzZSB7CisJCWhkbGNkcnZfc2V0ZGNkKCZiYy0+aGRydiwgISEocHAtPm9wcy0+cmVhZF9zdGF0dXMocHApICYgUEFSOTZfRENEKSk7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcGFyOTZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisKKwliYXljb21faW50X2ZyZXEoYmMpOworCS8qCisJICogY2hlY2sgaWYgdHJhbnNtaXR0ZXIgYWN0aXZlCisJICovCisJaWYgKGhkbGNkcnZfcHR0KCZiYy0+aGRydikpCisJCXBhcjk2X3R4KGRldiwgYmMpOworCWVsc2UgeworCQlwYXI5Nl9yeChkZXYsIGJjKTsKKwkJaWYgKC0tYmMtPm1vZGVtLmFyYl9kaXZpZGVyIDw9IDApIHsKKwkJCWJjLT5tb2RlbS5hcmJfZGl2aWRlciA9IDY7CisJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCQloZGxjZHJ2X2FyYml0cmF0ZShkZXYsICZiYy0+aGRydik7CisJCX0KKwl9CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCWhkbGNkcnZfdHJhbnNtaXR0ZXIoZGV2LCAmYmMtPmhkcnYpOworCWhkbGNkcnZfcmVjZWl2ZXIoZGV2LCAmYmMtPmhkcnYpOworICAgICAgICBsb2NhbF9pcnFfZGlzYWJsZSgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgcGFyOTZfd2FrZXVwKHZvaWQgKmhhbmRsZSkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWhhbmRsZTsKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiYmF5Y29tX3BhcjogJXM6IHdoeSBhbSBJIGJlaW5nIHdva2VuIHVwP1xuIiwgZGV2LT5uYW1lKTsKKwlpZiAoIXBhcnBvcnRfY2xhaW0oYmMtPnBkZXYpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiYmF5Y29tX3BhcjogJXM6IEknbSBicm9rZW4uXG4iLCBkZXYtPm5hbWUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBwYXI5Nl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwYXJwb3J0ICpwcDsKKworCWlmICghZGV2IHx8ICFiYykKKwkJcmV0dXJuIC1FTlhJTzsKKwlwcCA9IHBhcnBvcnRfZmluZF9iYXNlKGRldi0+YmFzZV9hZGRyKTsKKwlpZiAoIXBwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYmF5Y29tX3BhcjogcGFycG9ydCBhdCAweCVseCB1bmtub3duXG4iLCBkZXYtPmJhc2VfYWRkcik7CisJCXJldHVybiAtRU5YSU87CisJfQorCWlmIChwcC0+aXJxIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImJheWNvbV9wYXI6IHBhcnBvcnQgYXQgMHglbHggaGFzIG5vIGlycVxuIiwgcHAtPmJhc2UpOworCQlwYXJwb3J0X3B1dF9wb3J0KHBwKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJaWYgKCh+cHAtPm1vZGVzKSAmIChQQVJQT1JUX01PREVfUENTUFAgfCBQQVJQT1JUX01PREVfU0FGRUlOSU5UKSkgeworCQlwcmludGsoS0VSTl9FUlIgImJheWNvbV9wYXI6IHBhcnBvcnQgYXQgMHglbHggY2Fubm90IGJlIHVzZWRcbiIsIHBwLT5iYXNlKTsKKwkJcGFycG9ydF9wdXRfcG9ydChwcCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCW1lbXNldCgmYmMtPm1vZGVtLCAwLCBzaXplb2YoYmMtPm1vZGVtKSk7CisJYmMtPmhkcnYucGFyLmJpdHJhdGUgPSA5NjAwOworCWJjLT5wZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocHAsIGRldi0+bmFtZSwgTlVMTCwgcGFyOTZfd2FrZXVwLCAKKwkJCQkgcGFyOTZfaW50ZXJydXB0LCBQQVJQT1JUX0RFVl9FWENMLCBkZXYpOworCXBhcnBvcnRfcHV0X3BvcnQocHApOworCWlmICghYmMtPnBkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXljb21fcGFyOiBjYW5ub3QgcmVnaXN0ZXIgcGFycG9ydCBhdCAweCVseFxuIiwgZGV2LT5iYXNlX2FkZHIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlpZiAocGFycG9ydF9jbGFpbShiYy0+cGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXljb21fcGFyOiBwYXJwb3J0IGF0IDB4JWx4IGJ1c3lcbiIsIHBwLT5iYXNlKTsKKwkJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShiYy0+cGRldik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXBwID0gYmMtPnBkZXYtPnBvcnQ7CisJZGV2LT5pcnEgPSBwcC0+aXJxOworCXBwLT5vcHMtPmRhdGFfZm9yd2FyZChwcCk7CisgICAgICAgIGJjLT5oZHJ2LnBhci5iaXRyYXRlID0gOTYwMDsKKwlwcC0+b3BzLT53cml0ZV9kYXRhKHBwLCBQQVI5Nl9QVFQgfCBQQVI5N19QT1dFUik7IC8qIHN3aXRjaCBvZmYgUFRUICovCisJcHAtPm9wcy0+ZW5hYmxlX2lycShwcCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBhcjk2IGF0IGlvYmFzZSAweCVseCBpcnEgJXUgb3B0aW9ucyAweCV4XG4iLAorCSAgICAgICBiY19kcnZuYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEsIGJjLT5vcHRpb25zKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgcGFyOTZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBhcnBvcnQgKnBwOworCisJaWYgKCFkZXYgfHwgIWJjKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwcCA9IGJjLT5wZGV2LT5wb3J0OworCS8qIGRpc2FibGUgaW50ZXJydXB0ICovCisJcHAtPm9wcy0+ZGlzYWJsZV9pcnEocHApOworCS8qIHN3aXRjaCBvZmYgUFRUICovCisJcHAtPm9wcy0+d3JpdGVfZGF0YShwcCwgUEFSOTZfUFRUIHwgUEFSOTdfUE9XRVIpOworCXBhcnBvcnRfcmVsZWFzZShiYy0+cGRldik7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShiYy0+cGRldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNsb3NlIHBhcjk2IGF0IGlvYmFzZSAweCVseCBpcnEgJXVcbiIsCisJICAgICAgIGJjX2Rydm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PSBoZGxjZHJ2IGRyaXZlciBpbnRlcmZhY2UgPT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3N0YXRpYyBpbnQgYmF5Y29tX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLAorCQkJc3RydWN0IGhkbGNkcnZfaW9jdGwgKmhpLCBpbnQgY21kKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgaGRsY2Rydl9vcHMgcGFyOTZfb3BzID0geworCS5kcnZuYW1lID0gYmNfZHJ2bmFtZSwKKwkuZHJ2aW5mbyA9IGJjX2RydmluZm8sCisJLm9wZW4gICAgPSBwYXI5Nl9vcGVuLAorCS5jbG9zZSAgID0gcGFyOTZfY2xvc2UsCisJLmlvY3RsICAgPSBiYXljb21faW9jdGwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJheWNvbV9zZXRtb2RlKHN0cnVjdCBiYXljb21fc3RhdGUgKmJjLCBjb25zdCBjaGFyICptb2Rlc3RyKQoreworCWlmICghc3RybmNtcChtb2Rlc3RyLCAicGljcGFyIiwgNikpCisJCWJjLT5vcHRpb25zID0gMDsKKwllbHNlIGlmICghc3RybmNtcChtb2Rlc3RyLCAicGFyOTYiLCA1KSkKKwkJYmMtPm9wdGlvbnMgPSBCQVlDT01fT1BUSU9OU19TT0ZURENEOworCWVsc2UKKwkJYmMtPm9wdGlvbnMgPSAhIXN0cmNocihtb2Rlc3RyLCAnKicpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBiYXljb21faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsCisJCQlzdHJ1Y3QgaGRsY2Rydl9pb2N0bCAqaGksIGludCBjbWQpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmM7CisJc3RydWN0IGJheWNvbV9pb2N0bCBiaTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlCVUdfT04oYmMtPmhkcnYubWFnaWMgIT0gSERMQ0RSVl9NQUdJQyk7CisKKwlpZiAoY21kICE9IFNJT0NERVZQUklWQVRFKQorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCXN3aXRjaCAoaGktPmNtZCkgeworCWRlZmF1bHQ6CisJCWJyZWFrOworCisJY2FzZSBIRExDRFJWQ1RMX0dFVE1PREU6CisJCXN0cmNweShoaS0+ZGF0YS5tb2RlbmFtZSwgYmMtPm9wdGlvbnMgPyAicGFyOTYiIDogInBpY3BhciIpOworCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsIGhpLCBzaXplb2Yoc3RydWN0IGhkbGNkcnZfaW9jdGwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgSERMQ0RSVkNUTF9TRVRNT0RFOgorCQlpZiAobmV0aWZfcnVubmluZyhkZXYpIHx8ICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWhpLT5kYXRhLm1vZGVuYW1lW3NpemVvZihoaS0+ZGF0YS5tb2RlbmFtZSktMV0gPSAnXDAnOworCQlyZXR1cm4gYmF5Y29tX3NldG1vZGUoYmMsIGhpLT5kYXRhLm1vZGVuYW1lKTsKKworCWNhc2UgSERMQ0RSVkNUTF9NT0RFTElTVDoKKwkJc3RyY3B5KGhpLT5kYXRhLm1vZGVuYW1lLCAicGFyOTYscGljcGFyIik7CisJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgaGksIHNpemVvZihzdHJ1Y3QgaGRsY2Rydl9pb2N0bCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBIRExDRFJWQ1RMX01PREVNUEFSTUFTSzoKKwkJcmV0dXJuIEhETENEUlZfUEFSTUFTS19JT0JBU0U7CisKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJpLCBpZnItPmlmcl9kYXRhLCBzaXplb2YoYmkpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc3dpdGNoIChiaS5jbWQpIHsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisjaWZkZWYgQkFZQ09NX0RFQlVHCisJY2FzZSBCQVlDT01DVExfR0VUREVCVUc6CisJCWJpLmRhdGEuZGJnLmRlYnVnMSA9IGJjLT5oZHJ2LnB0dF9rZXllZDsKKwkJYmkuZGF0YS5kYmcuZGVidWcyID0gYmMtPmRlYnVnX3ZhbHMubGFzdF9pbnRjbnQ7CisJCWJpLmRhdGEuZGJnLmRlYnVnMyA9IGJjLT5kZWJ1Z192YWxzLmxhc3RfcGxsY29ycjsKKwkJYnJlYWs7CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCisKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmYmksIHNpemVvZihiaSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKKworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGNvbW1hbmQgbGluZSBzZXR0YWJsZSBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICptb2RlW05SX1BPUlRTXSA9IHsgInBpY3BhciIsIH07CitzdGF0aWMgaW50IGlvYmFzZVtOUl9QT1JUU10gPSB7IDB4Mzc4LCB9OworCittb2R1bGVfcGFyYW1fYXJyYXkobW9kZSwgY2hhcnAsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhtb2RlLCAiYmF5Y29tIG9wZXJhdGluZyBtb2RlOyBlZy4gcGFyOTYgb3IgcGljcGFyIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaW9iYXNlLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpb2Jhc2UsICJiYXljb20gaW8gYmFzZSBhZGRyZXNzIik7CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBNLiBTYWlsZXIsIHNhaWxlckBpZmUuZWUuZXRoei5jaCwgaGI5am54QGhiOXcuY2hlLmV1Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJheWNvbSBwYXI5NiBhbmQgcGljcGFyIGFtYXRldXIgcmFkaW8gbW9kZW0gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2JheWNvbXBhcih2b2lkKQoreworCWludCBpLCBmb3VuZCA9IDA7CisJY2hhciBzZXRfaHcgPSAxOworCisJcHJpbnRrKGJjX2RydmluZm8pOworCS8qCisJICogcmVnaXN0ZXIgbmV0IGRldmljZXMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYzsKKwkJY2hhciBpZm5hbWVbSUZOQU1TSVpdOworCisJCXNwcmludGYoaWZuYW1lLCAiYmNwJWQiLCBpKTsKKworCQlpZiAoIW1vZGVbaV0pCisJCQlzZXRfaHcgPSAwOworCQlpZiAoIXNldF9odykKKwkJCWlvYmFzZVtpXSA9IDA7CisKKwkJZGV2ID0gaGRsY2Rydl9yZWdpc3RlcigmcGFyOTZfb3BzLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJheWNvbV9zdGF0ZSksCisJCQkJICAgICAgIGlmbmFtZSwgaW9iYXNlW2ldLCAwLCAwKTsKKwkJaWYgKElTX0VSUihkZXYpKSAKKwkJCWJyZWFrOworCisJCWJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJaWYgKHNldF9odyAmJiBiYXljb21fc2V0bW9kZShiYywgbW9kZVtpXSkpCisJCQlzZXRfaHcgPSAwOworCQlmb3VuZCsrOworCQliYXljb21fZGV2aWNlW2ldID0gZGV2OworCX0KKworCWlmICghZm91bmQpCisJCXJldHVybiAtRU5YSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2JheWNvbXBhcih2b2lkKQoreworCWludCBpOworCisJZm9yKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYmF5Y29tX2RldmljZVtpXTsKKworCQlpZiAoZGV2KQorCQkJaGRsY2Rydl91bnJlZ2lzdGVyKGRldik7CisJfQorfQorCittb2R1bGVfaW5pdChpbml0X2JheWNvbXBhcik7Cittb2R1bGVfZXhpdChjbGVhbnVwX2JheWNvbXBhcik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIE1PRFVMRQorCisvKgorICogZm9ybWF0OiBiYXljb21fcGFyPWlvLG1vZGUKKyAqIG1vZGU6IHBhcjk2LHBpY3BhcgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGJheWNvbV9wYXJfc2V0dXAoY2hhciAqc3RyKQoreworICAgICAgICBzdGF0aWMgdW5zaWduZWQgbnJfZGV2OworCWludCBpbnRzWzJdOworCisgICAgICAgIGlmIChucl9kZXYgPj0gTlJfUE9SVFMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHN0ciA9IGdldF9vcHRpb25zKHN0ciwgMiwgaW50cyk7CisgICAgICAgIGlmIChpbnRzWzBdIDwgMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbW9kZVtucl9kZXZdID0gc3RyOworICAgICAgICBpb2Jhc2VbbnJfZGV2XSA9IGludHNbMV07CisJbnJfZGV2Kys7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImJheWNvbV9wYXI9IiwgYmF5Y29tX3Bhcl9zZXR1cCk7CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Nlcl9mZHguYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9zZXJfZmR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVmMjcwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9zZXJfZmR4LmMKQEAgLTAsMCArMSw3MDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCWJheWNvbV9zZXJfZmR4LmMgIC0tIGJheWNvbSBzZXIxMiBmdWxsZHVwbGV4IHJhZGlvIG1vZGVtIGRyaXZlci4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCAgVGhvbWFzIFNhaWxlciAoc2FpbGVyQGlmZS5lZS5ldGh6LmNoKQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBHUEwgYWxsb3dzIHlvdSB0byB1c2UgdGhlIGRyaXZlciwgTk9UIHRoZSByYWRpby4KKyAqICBJbiBvcmRlciB0byB1c2UgdGhlIHJhZGlvLCB5b3UgbmVlZCBhIGxpY2Vuc2UgZnJvbSB0aGUgY29tbXVuaWNhdGlvbnMKKyAqICBhdXRob3JpdHkgb2YgeW91ciBjb3VudHJ5LgorICoKKyAqCisgKiAgU3VwcG9ydGVkIG1vZGVtcworICoKKyAqICBzZXIxMjogIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSAxMjAwIGJhdWQgQUZTSyBtb2RlbS4gVGhlIG1vZGVtIGNvbnNpc3RzIG9ubHkKKyAqICAgICAgICAgIG9mIGEgbW9kdWxhdG9yL2RlbW9kdWxhdG9yIGNoaXAsIHVzdWFsbHkgYSBUSSBUQ00zMTA1LiBUaGUgY29tcHV0ZXIKKyAqICAgICAgICAgIGlzIHJlc3BvbnNpYmxlIGZvciByZWdlbmVyYXRpbmcgdGhlIHJlY2VpdmVyIGJpdCBjbG9jaywgYXMgd2VsbCBhcworICogICAgICAgICAgZm9yIGhhbmRsaW5nIHRoZSBIRExDIHByb3RvY29sLiBUaGUgbW9kZW0gY29ubmVjdHMgdG8gYSBzZXJpYWwgcG9ydCwKKyAqICAgICAgICAgIGhlbmNlIHRoZSBuYW1lLiBTaW5jZSB0aGUgc2VyaWFsIHBvcnQgaXMgbm90IHVzZWQgYXMgYW4gYXN5bmMgc2VyaWFsCisgKiAgICAgICAgICBwb3J0LCB0aGUga2VybmVsIGRyaXZlciBmb3Igc2VyaWFsIHBvcnRzIGNhbm5vdCBiZSB1c2VkLCBhbmQgdGhpcworICogICAgICAgICAgZHJpdmVyIG9ubHkgc3VwcG9ydHMgc3RhbmRhcmQgc2VyaWFsIGhhcmR3YXJlICg4MjUwLCAxNjQ1MCwgMTY1NTBBKQorICoKKyAqICAgICAgICAgIFRoaXMgbW9kZW0gdXN1YWxseSBkcmF3cyBpdHMgc3VwcGx5IGN1cnJlbnQgb3V0IG9mIHRoZSBvdGhlcndpc2UgdW51c2VkCisgKiAgICAgICAgICBUWEQgcGluIG9mIHRoZSBzZXJpYWwgcG9ydC4gVGh1cyBhIGNvbnRpZ251b3VzIHN0cmVhbSBvZiAweDAwLWJ5dGVzCisgKiAgICAgICAgICBpcyB0cmFuc21pdHRlZCB0byBhY2hpZXZlIGEgcG9zaXRpdmUgc3VwcGx5IHZvbHRhZ2UuCisgKgorICogIGhzazogICAgVGhpcyBpcyBhIDQ4MDAgYmF1ZCBGU0sgbW9kZW0sIGRlc2lnbmVkIGZvciBUTkMgdXNlLiBJdCB3b3JrcyBmaW5lCisgKiAgICAgICAgICBpbiAnYmF5Y29tLW1vZGUnIDotKSAgSW4gY29udHJhc3QgdG8gdGhlIFRDTTMxMDUgbW9kZW0sIHBvd2VyIGlzCisgKiAgICAgICAgICBleHRlcm5hbGx5IHN1cHBsaWVkLiBTbyB0aGVyZSdzIG5vIG5lZWQgdG8gcHJvdmlkZSB0aGUgMHgwMC1ieXRlLXN0cmVhbQorICogICAgICAgICAgd2hlbiByZWNlaXZpbmcgb3IgaWRsZSwgd2hpY2ggZHJhc3RpY2FsbHkgcmVkdWNlcyBpbnRlcnJ1cHQgbG9hZC4KKyAqCisgKiAgQ29tbWFuZCBsaW5lIG9wdGlvbnMgKGluc21vZCBjb21tYW5kIGxpbmUpCisgKgorICogIG1vZGUgICAgIHNlciMgICAgaGFyZHdhcmUgRENECisgKiAgICAgICAgICAgc2VyIyogICBzb2Z0d2FyZSBEQ0QKKyAqICAgICAgICAgICBzZXIjKyAgIGhhcmR3YXJlIERDRCwgaW52ZXJ0ZWQgc2lnbmFsIGF0IERDRCBwaW4KKyAqICAgICAgICAgICAnIycgZGVub3RlcyB0aGUgYmF1ZCByYXRlIC8gMTAwLCBlZy4gc2VyMTIqIGlzICcxMjAwIGJhdWQsIHNvZnQgRENEJworICogIGlvYmFzZSAgIGJhc2UgYWRkcmVzcyBvZiB0aGUgcG9ydDsgY29tbW9uIHZhbHVlcyBhcmUgMHgzZjgsIDB4MmY4LCAweDNlOCwgMHgyZTgKKyAqICBiYXVkICAgICBiYXVkIHJhdGUgKGJldHdlZW4gMzAwIGFuZCA0ODAwKQorICogIGlycSAgICAgIGludGVycnVwdCBsaW5lIG9mIHRoZSBwb3J0OyBjb21tb24gdmFsdWVzIGFyZSA0LDMKKyAqCisgKgorICogIEhpc3Rvcnk6CisgKiAgIDAuMSAgMjYuMDYuMTk5NiAgQWRhcHRlZCBmcm9tIGJheWNvbS5jIGFuZCBtYWRlIG5ldHdvcmsgZHJpdmVyIGludGVyZmFjZQorICogICAgICAgIDE4LjEwLjE5OTYgIENoYW5nZWQgdG8gbmV3IHVzZXIgc3BhY2UgYWNjZXNzIHJvdXRpbmVzIChjb3B5X3t0byxmcm9tfV91c2VyKQorICogICAwLjMgIDI2LjA0LjE5OTcgIGluaXQgY29kZS9kYXRhIHRhZ2dlZAorICogICAwLjQgIDA4LjA3LjE5OTcgIGFsdGVybmF0aXZlIHNlcjEyIGRlY29kaW5nIGFsZ29yaXRobSAodXNlcyBkZWx0YSBDVFMgaW50cykKKyAqICAgMC41ICAxMS4xMS4xOTk3ICBzZXIxMi9wYXI5NiBzcGxpdCBpbnRvIHNlcGFyYXRlIGZpbGVzCisgKiAgIDAuNiAgMjQuMDEuMTk5OCAgVGhvcnN0ZW4gS3Jhbnprb3dza2ksIGRsOGJjdSBhbmQgVGhvbWFzIFNhaWxlcjoKKyAqICAgICAgICAgICAgICAgICAgICByZWR1Y2VkIGludGVycnVwdCBsb2FkIGluIHRyYW5zbWl0IGNhc2UKKyAqICAgICAgICAgICAgICAgICAgICByZXdvcmtlZCByZWNlaXZlcgorICogICAwLjcgIDAzLjA4LjE5OTkgIGFkYXB0IHRvIExpbnVzJyBuZXcgX19zZXR1cC9fX2luaXRjYWxsCisgKiAgIDAuOCAgMTAuMDguMTk5OSAgdXNlIG1vZHVsZV9pbml0L21vZHVsZV9leGl0CisgKiAgIDAuOSAgMTIuMDIuMjAwMCAgYWRhcHRlZCB0byBzb2Z0bmV0IGRyaXZlciBpbnRlcmZhY2UKKyAqICAgMC4xMCAwMy4wNy4yMDAwICBmaXggaW50ZXJmYWNlIG5hbWUgaGFuZGxpbmcKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjZHJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYmF5Y29tLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEJBWUNPTV9ERUJVRworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgYmNfZHJ2bmFtZVtdID0gImJheWNvbV9zZXJfZmR4IjsKK3N0YXRpYyBjb25zdCBjaGFyIGJjX2RydmluZm9bXSA9IEtFUk5fSU5GTyAiYmF5Y29tX3Nlcl9mZHg6IChDKSAxOTk2LTIwMDAgVGhvbWFzIFNhaWxlciwgSEI5Sk5YL0FFNFdBXG4iCitLRVJOX0lORk8gImJheWNvbV9zZXJfZmR4OiB2ZXJzaW9uIDAuMTAgY29tcGlsZWQgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTlJfUE9SVFMgNAorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmJheWNvbV9kZXZpY2VbTlJfUE9SVFNdOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBSQlIoaW9iYXNlKSAoaW9iYXNlKzApCisjZGVmaW5lIFRIUihpb2Jhc2UpIChpb2Jhc2UrMCkKKyNkZWZpbmUgSUVSKGlvYmFzZSkgKGlvYmFzZSsxKQorI2RlZmluZSBJSVIoaW9iYXNlKSAoaW9iYXNlKzIpCisjZGVmaW5lIEZDUihpb2Jhc2UpIChpb2Jhc2UrMikKKyNkZWZpbmUgTENSKGlvYmFzZSkgKGlvYmFzZSszKQorI2RlZmluZSBNQ1IoaW9iYXNlKSAoaW9iYXNlKzQpCisjZGVmaW5lIExTUihpb2Jhc2UpIChpb2Jhc2UrNSkKKyNkZWZpbmUgTVNSKGlvYmFzZSkgKGlvYmFzZSs2KQorI2RlZmluZSBTQ1IoaW9iYXNlKSAoaW9iYXNlKzcpCisjZGVmaW5lIERMTChpb2Jhc2UpIChpb2Jhc2UrMCkKKyNkZWZpbmUgRExNKGlvYmFzZSkgKGlvYmFzZSsxKQorCisjZGVmaW5lIFNFUjEyX0VYVEVOVCA4CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4KKyAqLworCitzdHJ1Y3QgYmF5Y29tX3N0YXRlIHsKKwlzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSBoZHJ2OworCisJdW5zaWduZWQgaW50IGJhdWQsIGJhdWRfdXMsIGJhdWRfYXJiZGl2LCBiYXVkX3VhcnRkaXYsIGJhdWRfZGNkdGltZW91dDsKKwlpbnQgb3B0X2RjZDsKKworCXN0cnVjdCBtb2RlbV9zdGF0ZSB7CisJCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CisJCXVuc2lnbmVkIGNoYXIgcHR0OworCQl1bnNpZ25lZCBpbnQgc2hyZWc7CisJCXN0cnVjdCBtb2RlbV9zdGF0ZV9zZXIxMiB7CisJCQl1bnNpZ25lZCBjaGFyIHR4X2JpdDsKKwkJCXVuc2lnbmVkIGNoYXIgbGFzdF9yeGJpdDsKKwkJCWludCBkY2Rfc3VtMCwgZGNkX3N1bTEsIGRjZF9zdW0yOworCQkJaW50IGRjZF90aW1lOworCQkJdW5zaWduZWQgaW50IHBsbF90aW1lOworCQkJdW5zaWduZWQgaW50IHR4c2hyZWc7CisJCX0gc2VyMTI7CisJfSBtb2RlbTsKKworI2lmZGVmIEJBWUNPTV9ERUJVRworCXN0cnVjdCBkZWJ1Z192YWxzIHsKKwkJdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM7CisJCXVuc2lnbmVkIGN1cl9pbnRjbnQ7CisJCXVuc2lnbmVkIGxhc3RfaW50Y250OworCQlpbnQgY3VyX3BsbGNvcnI7CisJCWludCBsYXN0X3BsbGNvcnI7CisJfSBkZWJ1Z192YWxzOworI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiYXljb21faW50X2ZyZXEoc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMpCit7CisjaWZkZWYgQkFZQ09NX0RFQlVHCisJdW5zaWduZWQgbG9uZyBjdXJfamlmZmllcyA9IGppZmZpZXM7CisJLyoKKwkgKiBtZWFzdXJlIHRoZSBpbnRlcnJ1cHQgZnJlcXVlbmN5CisJICovCisJYmMtPmRlYnVnX3ZhbHMuY3VyX2ludGNudCsrOworCWlmICgoY3VyX2ppZmZpZXMgLSBiYy0+ZGVidWdfdmFscy5sYXN0X2ppZmZpZXMpID49IEhaKSB7CisJCWJjLT5kZWJ1Z192YWxzLmxhc3RfamlmZmllcyA9IGN1cl9qaWZmaWVzOworCQliYy0+ZGVidWdfdmFscy5sYXN0X2ludGNudCA9IGJjLT5kZWJ1Z192YWxzLmN1cl9pbnRjbnQ7CisJCWJjLT5kZWJ1Z192YWxzLmN1cl9pbnRjbnQgPSAwOworCQliYy0+ZGVidWdfdmFscy5sYXN0X3BsbGNvcnIgPSBiYy0+ZGVidWdfdmFscy5jdXJfcGxsY29ycjsKKwkJYmMtPmRlYnVnX3ZhbHMuY3VyX3BsbGNvcnIgPSAwOworCX0KKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09IFNFUjEyIHNwZWNpZmljIHJvdXRpbmVzID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNlcjEyX3NldF9kaXZpc29yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRpdmlzb3IpCit7CisgICAgICAgIG91dGIoMHg4MSwgTENSKGRldi0+YmFzZV9hZGRyKSk7ICAgICAgICAvKiBETEFCID0gMSAqLworICAgICAgICBvdXRiKGRpdmlzb3IsIERMTChkZXYtPmJhc2VfYWRkcikpOworICAgICAgICBvdXRiKGRpdmlzb3IgPj4gOCwgRExNKGRldi0+YmFzZV9hZGRyKSk7CisgICAgICAgIG91dGIoMHgwMSwgTENSKGRldi0+YmFzZV9hZGRyKSk7ICAgICAgICAvKiB3b3JkIGxlbmd0aCA9IDYgKi8KKyAgICAgICAgLyoKKyAgICAgICAgICogbWFrZSBzdXJlIHRoZSBuZXh0IGludGVycnVwdCBpcyBnZW5lcmF0ZWQ7CisgICAgICAgICAqIDAgbXVzdCBiZSB1c2VkIHRvIHBvd2VyIHRoZSBtb2RlbTsgdGhlIG1vZGVtIGRyYXdzIGl0cworICAgICAgICAgKiBwb3dlciBmcm9tIHRoZSBUeEQgbGluZQorICAgICAgICAgKi8KKyAgICAgICAgb3V0YigweDAwLCBUSFIoZGV2LT5iYXNlX2FkZHIpKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogaXQgaXMgaW1wb3J0YW50IG5vdCB0byBzZXQgdGhlIGRpdmlkZXIgd2hpbGUgdHJhbnNtaXR0aW5nOworICAgICAgICAgKiB0aGlzIHJlcG9ydGVkbHkgbWFrZXMgc29tZSBVQVJUcyBnZW5lcmF0aW5nIGludGVycnVwdHMKKyAgICAgICAgICogaW4gdGhlIGh1bmRyZWR0aG91c2FuZHMgcGVyIHNlY29uZCByZWdpb24KKyAgICAgICAgICogUmVwb3J0ZWQgYnk6IElnbmFjaW8uQXJlbmF6YUBzdHVkaS5lcGZsLmNoIChJZ25hY2lvIEFyZW5hemEgTnVubykKKyAgICAgICAgICovCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgMAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaHdlaWdodDE2KHVuc2lnbmVkIGludCB3KQorICAgICAgICBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSk7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBod2VpZ2h0OCh1bnNpZ25lZCBpbnQgdykKKyAgICAgICAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBod2VpZ2h0MTYodW5zaWduZWQgaW50IHcpCit7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHJlcyA9ICh3ICYgMHg1NTU1KSArICgodyA+PiAxKSAmIDB4NTU1NSk7CisgICAgICAgIHJlcyA9IChyZXMgJiAweDMzMzMpICsgKChyZXMgPj4gMikgJiAweDMzMzMpOworICAgICAgICByZXMgPSAocmVzICYgMHgwRjBGKSArICgocmVzID4+IDQpICYgMHgwRjBGKTsKKyAgICAgICAgcmV0dXJuIChyZXMgJiAweDAwRkYpICsgKChyZXMgPj4gOCkgJiAweDAwRkYpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBod2VpZ2h0OCh1bnNpZ25lZCBpbnQgdykKK3sKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgcmVzID0gKHcgJiAweDU1KSArICgodyA+PiAxKSAmIDB4NTUpOworICAgICAgICByZXMgPSAocmVzICYgMHgzMykgKyAoKHJlcyA+PiAyKSAmIDB4MzMpOworICAgICAgICByZXR1cm4gKHJlcyAmIDB4MEYpICsgKChyZXMgPj4gNCkgJiAweDBGKTsKK30KKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXIxMl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYywgc3RydWN0IHRpbWV2YWwgKnR2LCB1bnNpZ25lZCBjaGFyIGN1cnMpCit7CisJaW50IHRpbWVkaWZmOworCWludCBiZHVzOCA9IGJjLT5iYXVkX3VzID4+IDM7CisJaW50IGJkdXM0ID0gYmMtPmJhdWRfdXMgPj4gMjsKKwlpbnQgYmR1czIgPSBiYy0+YmF1ZF91cyA+PiAxOworCisJdGltZWRpZmYgPSAxMDAwMDAwICsgdHYtPnR2X3VzZWMgLSBiYy0+bW9kZW0uc2VyMTIucGxsX3RpbWU7CisJd2hpbGUgKHRpbWVkaWZmID49IDUwMDAwMCkKKwkJdGltZWRpZmYgLT0gMTAwMDAwMDsKKwl3aGlsZSAodGltZWRpZmYgPj0gYmR1czIpIHsKKwkJdGltZWRpZmYgLT0gYmMtPmJhdWRfdXM7CisJCWJjLT5tb2RlbS5zZXIxMi5wbGxfdGltZSArPSBiYy0+YmF1ZF91czsKKwkJYmMtPm1vZGVtLnNlcjEyLmRjZF90aW1lLS07CisJCS8qIGZpcnN0IGNoZWNrIGlmIHRoZXJlIGlzIHJvb20gdG8gYWRkIGEgYml0ICovCisJCWlmIChiYy0+bW9kZW0uc2hyZWcgJiAxKSB7CisJCQloZGxjZHJ2X3B1dGJpdHMoJmJjLT5oZHJ2LCAoYmMtPm1vZGVtLnNocmVnID4+IDEpIF4gMHhmZmZmKTsKKwkJCWJjLT5tb2RlbS5zaHJlZyA9IDB4MTAwMDA7CisJCX0KKwkJLyogYWRkIGEgb25lIGJpdCAqLworCQliYy0+bW9kZW0uc2hyZWcgPj49IDE7CisJfQorCWlmIChiYy0+bW9kZW0uc2VyMTIuZGNkX3RpbWUgPD0gMCkgeworCQlpZiAoIWJjLT5vcHRfZGNkKQorCQkJaGRsY2Rydl9zZXRkY2QoJmJjLT5oZHJ2LCAoYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wICsgCisJCQkJCQkgICBiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTEgKyAKKwkJCQkJCSAgIGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMikgPCAwKTsKKwkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0yID0gYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0xOworCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTEgPSBiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTA7CisJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMCA9IDI7IC8qIHNsaWdodCBiaWFzICovCisJCWJjLT5tb2RlbS5zZXIxMi5kY2RfdGltZSArPSAxMjA7CisJfQorCWlmIChiYy0+bW9kZW0uc2VyMTIubGFzdF9yeGJpdCAhPSBjdXJzKSB7CisJCWJjLT5tb2RlbS5zZXIxMi5sYXN0X3J4Yml0ID0gY3VyczsKKwkJYmMtPm1vZGVtLnNocmVnIHw9IDB4MTAwMDA7CisJCS8qIGFkanVzdCB0aGUgUExMICovCisJCWlmICh0aW1lZGlmZiA+IDApCisJCQliYy0+bW9kZW0uc2VyMTIucGxsX3RpbWUgKz0gYmR1czg7CisJCWVsc2UKKwkJCWJjLT5tb2RlbS5zZXIxMi5wbGxfdGltZSArPSAxMDAwMDAwIC0gYmR1czg7CisJCS8qIHVwZGF0ZSBEQ0QgKi8KKwkJaWYgKGFicyh0aW1lZGlmZikgPiBiZHVzNCkKKwkJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMCArPSA0OworCQllbHNlCisJCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTAtLTsKKyNpZmRlZiBCQVlDT01fREVCVUcKKwkJYmMtPmRlYnVnX3ZhbHMuY3VyX3BsbGNvcnIgPSB0aW1lZGlmZjsKKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KKwl9CisJd2hpbGUgKGJjLT5tb2RlbS5zZXIxMi5wbGxfdGltZSA+PSAxMDAwMDAwKQorCQliYy0+bW9kZW0uc2VyMTIucGxsX3RpbWUgLT0gMTAwMDAwMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzZXIxMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwl1bnNpZ25lZCBjaGFyIGlpciwgbXNyOworCXVuc2lnbmVkIGludCB0eGNvdW50ID0gMDsKKworCWlmICghYmMgfHwgYmMtPmhkcnYubWFnaWMgIT0gSERMQ0RSVl9NQUdJQykKKwkJcmV0dXJuIElSUV9OT05FOworCS8qIGZhc3Qgd2F5IG91dCBmb3Igc2hhcmVkIGlycSAqLworCWlmICgoaWlyID0gaW5iKElJUihkZXYtPmJhc2VfYWRkcikpKSAmIDEpIAkKKwkJcmV0dXJuIElSUV9OT05FOworCS8qIGdldCBjdXJyZW50IHRpbWUgKi8KKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwltc3IgPSBpbmIoTVNSKGRldi0+YmFzZV9hZGRyKSk7CisJLyogZGVsdGEgRENEICovCisJaWYgKChtc3IgJiA4KSAmJiBiYy0+b3B0X2RjZCkKKwkJaGRsY2Rydl9zZXRkY2QoJmJjLT5oZHJ2LCAhKChtc3IgXiBiYy0+b3B0X2RjZCkgJiAweDgwKSk7CisJZG8geworCQlzd2l0Y2ggKGlpciAmIDYpIHsKKwkJY2FzZSA2OgorCQkJaW5iKExTUihkZXYtPmJhc2VfYWRkcikpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSA0OgorCQkJaW5iKFJCUihkZXYtPmJhc2VfYWRkcikpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSAyOgorCQkJLyoKKwkJCSAqIG1ha2Ugc3VyZSB0aGUgbmV4dCBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkOworCQkJICogMCBtdXN0IGJlIHVzZWQgdG8gcG93ZXIgdGhlIG1vZGVtOyB0aGUgbW9kZW0gZHJhd3MgaXRzCisJCQkgKiBwb3dlciBmcm9tIHRoZSBUeEQgbGluZQorCQkJICovCisJCQlvdXRiKDB4MDAsIFRIUihkZXYtPmJhc2VfYWRkcikpOworCQkJYmF5Y29tX2ludF9mcmVxKGJjKTsKKwkJCXR4Y291bnQrKzsKKwkJCS8qCisJCQkgKiBmaXJzdCBvdXRwdXQgdGhlIGxhc3QgYml0ICghKSB0aGVuIGNhbGwgSERMQyB0cmFuc21pdHRlciwKKwkJCSAqIHNpbmNlIHRoaXMgbWF5IHRha2UgcXVpdGUgbG9uZworCQkJICovCisJCQlpZiAoYmMtPm1vZGVtLnB0dCkKKwkJCQlvdXRiKDB4MGUgfCAoISFiYy0+bW9kZW0uc2VyMTIudHhfYml0KSwgTUNSKGRldi0+YmFzZV9hZGRyKSk7CisJCQllbHNlCisJCQkJb3V0YigweDBkLCBNQ1IoZGV2LT5iYXNlX2FkZHIpKTsgICAgICAgLyogdHJhbnNtaXR0ZXIgb2ZmICovCisJCQlicmVhazsKKwkJCQorCQlkZWZhdWx0OgorCQkJbXNyID0gaW5iKE1TUihkZXYtPmJhc2VfYWRkcikpOworCQkJLyogZGVsdGEgRENEICovCisJCQlpZiAoKG1zciAmIDgpICYmIGJjLT5vcHRfZGNkKSAKKwkJCQloZGxjZHJ2X3NldGRjZCgmYmMtPmhkcnYsICEoKG1zciBeIGJjLT5vcHRfZGNkKSAmIDB4ODApKTsKKwkJCWJyZWFrOworCQl9CisJCWlpciA9IGluYihJSVIoZGV2LT5iYXNlX2FkZHIpKTsKKwl9IHdoaWxlICghKGlpciAmIDEpKTsKKwlzZXIxMl9yeChkZXYsIGJjLCAmdHYsIG1zciAmIDB4MTApOyAvKiBDVFMgKi8KKwlpZiAoYmMtPm1vZGVtLnB0dCAmJiB0eGNvdW50KSB7CisJCWlmIChiYy0+bW9kZW0uc2VyMTIudHhzaHJlZyA8PSAxKSB7CisJCQliYy0+bW9kZW0uc2VyMTIudHhzaHJlZyA9IDB4MTAwMDAgfCBoZGxjZHJ2X2dldGJpdHMoJmJjLT5oZHJ2KTsKKwkJCWlmICghaGRsY2Rydl9wdHQoJmJjLT5oZHJ2KSkgeworCQkJCXNlcjEyX3NldF9kaXZpc29yKGRldiwgMTE1MjAwLzEwMC84KTsKKwkJCQliYy0+bW9kZW0ucHR0ID0gMDsKKwkJCQlnb3RvIGVuZF90cmFuc21pdDsKKwkJCX0KKwkJfQorCQliYy0+bW9kZW0uc2VyMTIudHhfYml0ID0gIShiYy0+bW9kZW0uc2VyMTIudHhfYml0IF4gKGJjLT5tb2RlbS5zZXIxMi50eHNocmVnICYgMSkpOworCQliYy0+bW9kZW0uc2VyMTIudHhzaHJlZyA+Pj0gMTsKKwl9CisgZW5kX3RyYW5zbWl0OgorCWxvY2FsX2lycV9lbmFibGUoKTsKKwlpZiAoIWJjLT5tb2RlbS5wdHQgJiYgdHhjb3VudCkgeworCQloZGxjZHJ2X2FyYml0cmF0ZShkZXYsICZiYy0+aGRydik7CisJCWlmIChoZGxjZHJ2X3B0dCgmYmMtPmhkcnYpKSB7CisJCQlzZXIxMl9zZXRfZGl2aXNvcihkZXYsIGJjLT5iYXVkX3VhcnRkaXYpOworCQkJYmMtPm1vZGVtLnNlcjEyLnR4c2hyZWcgPSAxOworCQkJYmMtPm1vZGVtLnB0dCA9IDE7CisJCX0KKwl9CisJaGRsY2Rydl90cmFuc21pdHRlcihkZXYsICZiYy0+aGRydik7CisJaGRsY2Rydl9yZWNlaXZlcihkZXYsICZiYy0+aGRydik7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbnVtIHVhcnQgeyBjX3VhcnRfdW5rbm93biwgY191YXJ0XzgyNTAsCisJICAgIGNfdWFydF8xNjQ1MCwgY191YXJ0XzE2NTUwLCBjX3VhcnRfMTY1NTBBfTsKK3N0YXRpYyBjb25zdCBjaGFyICp1YXJ0X3N0cltdID0geyAKKwkidW5rbm93biIsICI4MjUwIiwgIjE2NDUwIiwgIjE2NTUwIiwgIjE2NTUwQSIgCit9OworCitzdGF0aWMgZW51bSB1YXJ0IHNlcjEyX2NoZWNrX3VhcnQodW5zaWduZWQgaW50IGlvYmFzZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGIxLGIyLGIzOworCWVudW0gdWFydCB1OworCWVudW0gdWFydCB1YXJ0X3RhYltdID0KKwkJeyBjX3VhcnRfMTY0NTAsIGNfdWFydF91bmtub3duLCBjX3VhcnRfMTY1NTAsIGNfdWFydF8xNjU1MEEgfTsKKworCWIxID0gaW5iKE1DUihpb2Jhc2UpKTsKKwlvdXRiKGIxIHwgMHgxMCwgTUNSKGlvYmFzZSkpOwkvKiBsb29wYmFjayBtb2RlICovCisJYjIgPSBpbmIoTVNSKGlvYmFzZSkpOworCW91dGIoMHgxYSwgTUNSKGlvYmFzZSkpOworCWIzID0gaW5iKE1TUihpb2Jhc2UpKSAmIDB4ZjA7CisJb3V0YihiMSwgTUNSKGlvYmFzZSkpOwkJCS8qIHJlc3RvcmUgb2xkIHZhbHVlcyAqLworCW91dGIoYjIsIE1TUihpb2Jhc2UpKTsKKwlpZiAoYjMgIT0gMHg5MCkKKwkJcmV0dXJuIGNfdWFydF91bmtub3duOworCWluYihSQlIoaW9iYXNlKSk7CisJaW5iKFJCUihpb2Jhc2UpKTsKKwlvdXRiKDB4MDEsIEZDUihpb2Jhc2UpKTsJCS8qIGVuYWJsZSBGSUZPcyAqLworCXUgPSB1YXJ0X3RhYlsoaW5iKElJUihpb2Jhc2UpKSA+PiA2KSAmIDNdOworCWlmICh1ID09IGNfdWFydF8xNjQ1MCkgeworCQlvdXRiKDB4NWEsIFNDUihpb2Jhc2UpKTsKKwkJYjEgPSBpbmIoU0NSKGlvYmFzZSkpOworCQlvdXRiKDB4YTUsIFNDUihpb2Jhc2UpKTsKKwkJYjIgPSBpbmIoU0NSKGlvYmFzZSkpOworCQlpZiAoKGIxICE9IDB4NWEpIHx8IChiMiAhPSAweGE1KSkKKwkJCXUgPSBjX3VhcnRfODI1MDsKKwl9CisJcmV0dXJuIHU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHNlcjEyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisJZW51bSB1YXJ0IHU7CisKKwlpZiAoIWRldiB8fCAhYmMpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFkZXYtPmJhc2VfYWRkciB8fCBkZXYtPmJhc2VfYWRkciA+IDB4MTAwMC1TRVIxMl9FWFRFTlQgfHwKKwkgICAgZGV2LT5pcnEgPCAyIHx8IGRldi0+aXJxID4gMTUpCisJCXJldHVybiAtRU5YSU87CisJaWYgKGJjLT5iYXVkIDwgMzAwIHx8IGJjLT5iYXVkID4gNDgwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU0VSMTJfRVhURU5ULCAiYmF5Y29tX3Nlcl9mZHgiKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCQVlDT01fU0VSX0ZTWDogSS9PIHBvcnQgMHglMDRseCBidXN5IFxuIiwgCisJCSAgICAgICBkZXYtPmJhc2VfYWRkcik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKwltZW1zZXQoJmJjLT5tb2RlbSwgMCwgc2l6ZW9mKGJjLT5tb2RlbSkpOworCWJjLT5oZHJ2LnBhci5iaXRyYXRlID0gYmMtPmJhdWQ7CisJYmMtPmJhdWRfdXMgPSAxMDAwMDAwL2JjLT5iYXVkOworCWJjLT5iYXVkX3VhcnRkaXYgPSAoMTE1MjAwLzgpL2JjLT5iYXVkOworCWlmICgodSA9IHNlcjEyX2NoZWNrX3VhcnQoZGV2LT5iYXNlX2FkZHIpKSA9PSBjX3VhcnRfdW5rbm93bil7CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTRVIxMl9FWFRFTlQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJb3V0YigwLCBGQ1IoZGV2LT5iYXNlX2FkZHIpKTsgIC8qIGRpc2FibGUgRklGT3MgKi8KKwlvdXRiKDB4MGQsIE1DUihkZXYtPmJhc2VfYWRkcikpOworCW91dGIoMCwgSUVSKGRldi0+YmFzZV9hZGRyKSk7CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzZXIxMl9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorCQkJImJheWNvbV9zZXJfZmR4IiwgZGV2KSkgeworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU0VSMTJfRVhURU5UKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLyoKKwkgKiBzZXQgdGhlIFNJTyB0byA2IEJpdHMvY2hhcmFjdGVyOyBkdXJpbmcgcmVjZWl2ZSwKKwkgKiB0aGUgYmF1ZCByYXRlIGlzIHNldCB0byBwcm9kdWNlIDEwMCBpbnRzL3NlYworCSAqIHRvIGZlZWQgdGhlIGNoYW5uZWwgYXJiaXRyYXRpb24gcHJvY2VzcywKKwkgKiBkdXJpbmcgdHJhbnNtaXQgdG8gYmF1ZCBpbnRzL3NlYyB0byBydW4KKwkgKiB0aGUgdHJhbnNtaXR0ZXIKKwkgKi8KKwlzZXIxMl9zZXRfZGl2aXNvcihkZXYsIDExNTIwMC8xMDAvOCk7CisJLyoKKwkgKiBlbmFibGUgdHJhbnNtaXR0ZXIgZW1wdHkgaW50ZXJydXB0IGFuZCBtb2RlbSBzdGF0dXMgaW50ZXJydXB0CisJICovCisJb3V0YigweDBhLCBJRVIoZGV2LT5iYXNlX2FkZHIpKTsKKwkvKgorCSAqIG1ha2Ugc3VyZSB0aGUgbmV4dCBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkOworCSAqIDAgbXVzdCBiZSB1c2VkIHRvIHBvd2VyIHRoZSBtb2RlbTsgdGhlIG1vZGVtIGRyYXdzIGl0cworCSAqIHBvd2VyIGZyb20gdGhlIFR4RCBsaW5lCisJICovCisJb3V0YigweDAwLCBUSFIoZGV2LT5iYXNlX2FkZHIpKTsKKwloZGxjZHJ2X3NldGRjZCgmYmMtPmhkcnYsIDApOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBzZXJfZmR4IGF0IGlvYmFzZSAweCVseCBpcnEgJXUgYmF1ZCAldSB1YXJ0ICVzXG4iLAorCSAgICAgICBiY19kcnZuYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEsIGJjLT5iYXVkLCB1YXJ0X3N0clt1XSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHNlcjEyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCFkZXYgfHwgIWJjKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKgorCSAqIGRpc2FibGUgaW50ZXJydXB0cworCSAqLworCW91dGIoMCwgSUVSKGRldi0+YmFzZV9hZGRyKSk7CisJb3V0YigxLCBNQ1IoZGV2LT5iYXNlX2FkZHIpKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU0VSMTJfRVhURU5UKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogY2xvc2Ugc2VyX2ZkeCBhdCBpb2Jhc2UgMHglbHggaXJxICV1XG4iLAorCSAgICAgICBiY19kcnZuYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT0gaGRsY2RydiBkcml2ZXIgaW50ZXJmYWNlID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBiYXljb21faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsCisJCQlzdHJ1Y3QgaGRsY2Rydl9pb2N0bCAqaGksIGludCBjbWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBoZGxjZHJ2X29wcyBzZXIxMl9vcHMgPSB7CisJLmRydm5hbWUgPSBiY19kcnZuYW1lLAorCS5kcnZpbmZvID0gYmNfZHJ2aW5mbywKKwkub3BlbiAgICA9IHNlcjEyX29wZW4sCisJLmNsb3NlICAgPSBzZXIxMl9jbG9zZSwKKwkuaW9jdGwgICA9IGJheWNvbV9pb2N0bCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJheWNvbV9zZXRtb2RlKHN0cnVjdCBiYXljb21fc3RhdGUgKmJjLCBjb25zdCBjaGFyICptb2Rlc3RyKQoreworCXVuc2lnbmVkIGludCBiYXVkOworCisJaWYgKCFzdHJuY21wKG1vZGVzdHIsICJzZXIiLCAzKSkgeworCQliYXVkID0gc2ltcGxlX3N0cnRvdWwobW9kZXN0ciszLCBOVUxMLCAxMCk7CisJCWlmIChiYXVkID49IDMgJiYgYmF1ZCA8PSA0OCkKKwkJCWJjLT5iYXVkID0gYmF1ZCoxMDA7CisJfQorCWlmIChzdHJjaHIobW9kZXN0ciwgJyonKSkKKwkJYmMtPm9wdF9kY2QgPSAwOworCWVsc2UgaWYgKHN0cmNocihtb2Rlc3RyLCAnKycpKQorCQliYy0+b3B0X2RjZCA9IC0xOworCWVsc2UKKwkJYmMtPm9wdF9kY2QgPSAxOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBiYXljb21faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsCisJCQlzdHJ1Y3QgaGRsY2Rydl9pb2N0bCAqaGksIGludCBjbWQpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmM7CisJc3RydWN0IGJheWNvbV9pb2N0bCBiaTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlCVUdfT04oYmMtPmhkcnYubWFnaWMgIT0gSERMQ0RSVl9NQUdJQyk7CisKKwlpZiAoY21kICE9IFNJT0NERVZQUklWQVRFKQorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCXN3aXRjaCAoaGktPmNtZCkgeworCWRlZmF1bHQ6CisJCWJyZWFrOworCisJY2FzZSBIRExDRFJWQ1RMX0dFVE1PREU6CisJCXNwcmludGYoaGktPmRhdGEubW9kZW5hbWUsICJzZXIldSIsIGJjLT5iYXVkIC8gMTAwKTsKKwkJaWYgKGJjLT5vcHRfZGNkIDw9IDApCisJCQlzdHJjYXQoaGktPmRhdGEubW9kZW5hbWUsICghYmMtPm9wdF9kY2QpID8gIioiIDogIisiKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCBoaSwgc2l6ZW9mKHN0cnVjdCBoZGxjZHJ2X2lvY3RsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhETENEUlZDVExfU0VUTU9ERToKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSB8fCAhY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQloaS0+ZGF0YS5tb2RlbmFtZVtzaXplb2YoaGktPmRhdGEubW9kZW5hbWUpLTFdID0gJ1wwJzsKKwkJcmV0dXJuIGJheWNvbV9zZXRtb2RlKGJjLCBoaS0+ZGF0YS5tb2RlbmFtZSk7CisKKwljYXNlIEhETENEUlZDVExfTU9ERUxJU1Q6CisJCXN0cmNweShoaS0+ZGF0YS5tb2RlbmFtZSwgInNlcjEyLHNlcjMsc2VyMjQiKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCBoaSwgc2l6ZW9mKHN0cnVjdCBoZGxjZHJ2X2lvY3RsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhETENEUlZDVExfTU9ERU1QQVJNQVNLOgorCQlyZXR1cm4gSERMQ0RSVl9QQVJNQVNLX0lPQkFTRSB8IEhETENEUlZfUEFSTUFTS19JUlE7CisKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJpLCBpZnItPmlmcl9kYXRhLCBzaXplb2YoYmkpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc3dpdGNoIChiaS5jbWQpIHsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisjaWZkZWYgQkFZQ09NX0RFQlVHCisJY2FzZSBCQVlDT01DVExfR0VUREVCVUc6CisJCWJpLmRhdGEuZGJnLmRlYnVnMSA9IGJjLT5oZHJ2LnB0dF9rZXllZDsKKwkJYmkuZGF0YS5kYmcuZGVidWcyID0gYmMtPmRlYnVnX3ZhbHMubGFzdF9pbnRjbnQ7CisJCWJpLmRhdGEuZGJnLmRlYnVnMyA9IGJjLT5kZWJ1Z192YWxzLmxhc3RfcGxsY29ycjsKKwkJYnJlYWs7CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCisKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmYmksIHNpemVvZihiaSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKKworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGNvbW1hbmQgbGluZSBzZXR0YWJsZSBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyBjaGFyICptb2RlW05SX1BPUlRTXSA9IHsgInNlcjEyKiIsIH07CitzdGF0aWMgaW50IGlvYmFzZVtOUl9QT1JUU10gPSB7IDB4M2Y4LCB9Oworc3RhdGljIGludCBpcnFbTlJfUE9SVFNdID0geyA0LCB9Oworc3RhdGljIGludCBiYXVkW05SX1BPUlRTXSA9IHsgWzAgLi4uIE5SX1BPUlRTLTFdID0gMTIwMCB9OworCittb2R1bGVfcGFyYW1fYXJyYXkobW9kZSwgY2hhcnAsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhtb2RlLCAiYmF5Y29tIG9wZXJhdGluZyBtb2RlOyAqIGZvciBzb2Z0d2FyZSBEQ0QiKTsKK21vZHVsZV9wYXJhbV9hcnJheShpb2Jhc2UsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvYmFzZSwgImJheWNvbSBpbyBiYXNlIGFkZHJlc3MiKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgImJheWNvbSBpcnEgbnVtYmVyIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoYmF1ZCwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYmF1ZCwgImJheWNvbSBiYXVkIHJhdGUgKDMwMCB0byA0ODAwKSIpOworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgTS4gU2FpbGVyLCBzYWlsZXJAaWZlLmVlLmV0aHouY2gsIGhiOWpueEBoYjl3LmNoZS5ldSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCYXljb20gc2VyMTIgZnVsbCBkdXBsZXggYW1hdGV1ciByYWRpbyBtb2RlbSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYmF5Y29tc2VyZmR4KHZvaWQpCit7CisJaW50IGksIGZvdW5kID0gMDsKKwljaGFyIHNldF9odyA9IDE7CisKKwlwcmludGsoYmNfZHJ2aW5mbyk7CisJLyoKKwkgKiByZWdpc3RlciBuZXQgZGV2aWNlcworCSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjOworCQljaGFyIGlmbmFtZVtJRk5BTVNJWl07CisKKwkJc3ByaW50ZihpZm5hbWUsICJiY3NmJWQiLCBpKTsKKworCQlpZiAoIW1vZGVbaV0pCisJCQlzZXRfaHcgPSAwOworCQlpZiAoIXNldF9odykKKwkJCWlvYmFzZVtpXSA9IGlycVtpXSA9IDA7CisKKwkJZGV2ID0gaGRsY2Rydl9yZWdpc3Rlcigmc2VyMTJfb3BzLCAKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBiYXljb21fc3RhdGUpLAorCQkJCSAgICAgICBpZm5hbWUsIGlvYmFzZVtpXSwgaXJxW2ldLCAwKTsKKwkJaWYgKElTX0VSUihkZXYpKSAKKwkJCWJyZWFrOworCisJCWJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJaWYgKHNldF9odyAmJiBiYXljb21fc2V0bW9kZShiYywgbW9kZVtpXSkpCisJCQlzZXRfaHcgPSAwOworCQliYy0+YmF1ZCA9IGJhdWRbaV07CisJCWZvdW5kKys7CisJCWJheWNvbV9kZXZpY2VbaV0gPSBkZXY7CisJfQorCisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfYmF5Y29tc2VyZmR4KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBiYXljb21fZGV2aWNlW2ldOworCQlpZiAoZGV2KSAKKwkJCWhkbGNkcnZfdW5yZWdpc3RlcihkZXYpOworCX0KK30KKworbW9kdWxlX2luaXQoaW5pdF9iYXljb21zZXJmZHgpOworbW9kdWxlX2V4aXQoY2xlYW51cF9iYXljb21zZXJmZHgpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBNT0RVTEUKKworLyoKKyAqIGZvcm1hdDogYmF5Y29tX3Nlcl9mZHg9aW8saXJxLG1vZGUKKyAqIG1vZGU6IHNlciMgICAgaGFyZHdhcmUgRENECisgKiAgICAgICBzZXIjKiAgIHNvZnR3YXJlIERDRAorICogICAgICAgc2VyIysgICBoYXJkd2FyZSBEQ0QsIGludmVydGVkIHNpZ25hbCBhdCBEQ0QgcGluCisgKiAnIycgZGVub3RlcyB0aGUgYmF1ZCByYXRlIC8gMTAwLCBlZy4gc2VyMTIqIGlzICcxMjAwIGJhdWQsIHNvZnQgRENEJworICovCisKK3N0YXRpYyBpbnQgX19pbml0IGJheWNvbV9zZXJfZmR4X3NldHVwKGNoYXIgKnN0cikKK3sKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIG5yX2RldjsKKyAgICAgICAgaW50IGludHNbNF07CisKKyAgICAgICAgaWYgKG5yX2RldiA+PSBOUl9QT1JUUykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3RyID0gZ2V0X29wdGlvbnMoc3RyLCA0LCBpbnRzKTsKKyAgICAgICAgaWYgKGludHNbMF0gPCAyKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBtb2RlW25yX2Rldl0gPSBzdHI7CisgICAgICAgIGlvYmFzZVtucl9kZXZdID0gaW50c1sxXTsKKyAgICAgICAgaXJxW25yX2Rldl0gPSBpbnRzWzJdOworCWlmIChpbnRzWzBdID49IDMpCisJCWJhdWRbbnJfZGV2XSA9IGludHNbM107CisJbnJfZGV2Kys7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImJheWNvbV9zZXJfZmR4PSIsIGJheWNvbV9zZXJfZmR4X3NldHVwKTsKKworI2VuZGlmIC8qIE1PRFVMRSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2hkeC5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Nlcl9oZHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWFkODVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Nlcl9oZHguYwpAQCAtMCwwICsxLDc0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJYmF5Y29tX3Nlcl9oZHguYyAgLS0gYmF5Y29tIHNlcjEyIGhhbGZkdXBsZXggcmFkaW8gbW9kZW0gZHJpdmVyLgorICoKKyAqCUNvcHlyaWdodCAoQykgMTk5Ni0yMDAwICBUaG9tYXMgU2FpbGVyIChzYWlsZXJAaWZlLmVlLmV0aHouY2gpCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogIFBsZWFzZSBub3RlIHRoYXQgdGhlIEdQTCBhbGxvd3MgeW91IHRvIHVzZSB0aGUgZHJpdmVyLCBOT1QgdGhlIHJhZGlvLgorICogIEluIG9yZGVyIHRvIHVzZSB0aGUgcmFkaW8sIHlvdSBuZWVkIGEgbGljZW5zZSBmcm9tIHRoZSBjb21tdW5pY2F0aW9ucworICogIGF1dGhvcml0eSBvZiB5b3VyIGNvdW50cnkuCisgKgorICoKKyAqICBTdXBwb3J0ZWQgbW9kZW1zCisgKgorICogIHNlcjEyOiAgVGhpcyBpcyBhIHZlcnkgc2ltcGxlIDEyMDAgYmF1ZCBBRlNLIG1vZGVtLiBUaGUgbW9kZW0gY29uc2lzdHMgb25seQorICogICAgICAgICAgb2YgYSBtb2R1bGF0b3IvZGVtb2R1bGF0b3IgY2hpcCwgdXN1YWxseSBhIFRJIFRDTTMxMDUuIFRoZSBjb21wdXRlcgorICogICAgICAgICAgaXMgcmVzcG9uc2libGUgZm9yIHJlZ2VuZXJhdGluZyB0aGUgcmVjZWl2ZXIgYml0IGNsb2NrLCBhcyB3ZWxsIGFzCisgKiAgICAgICAgICBmb3IgaGFuZGxpbmcgdGhlIEhETEMgcHJvdG9jb2wuIFRoZSBtb2RlbSBjb25uZWN0cyB0byBhIHNlcmlhbCBwb3J0LAorICogICAgICAgICAgaGVuY2UgdGhlIG5hbWUuIFNpbmNlIHRoZSBzZXJpYWwgcG9ydCBpcyBub3QgdXNlZCBhcyBhbiBhc3luYyBzZXJpYWwKKyAqICAgICAgICAgIHBvcnQsIHRoZSBrZXJuZWwgZHJpdmVyIGZvciBzZXJpYWwgcG9ydHMgY2Fubm90IGJlIHVzZWQsIGFuZCB0aGlzCisgKiAgICAgICAgICBkcml2ZXIgb25seSBzdXBwb3J0cyBzdGFuZGFyZCBzZXJpYWwgaGFyZHdhcmUgKDgyNTAsIDE2NDUwLCAxNjU1MEEpCisgKgorICoKKyAqICBDb21tYW5kIGxpbmUgb3B0aW9ucyAoaW5zbW9kIGNvbW1hbmQgbGluZSkKKyAqCisgKiAgbW9kZSAgICAgc2VyMTIgICAgaGFyZHdhcmUgRENECisgKiAgICAgICAgICAgc2VyMTIqICAgc29mdHdhcmUgRENECisgKiAgICAgICAgICAgc2VyMTJAICAgaGFyZHdhcmUvc29mdHdhcmUgRENELCBpLmUuIG5vIGV4cGxpY2l0IERDRCBzaWduYWwgYnV0IGhhcmR3YXJlCisgKiAgICAgICAgICAgICAgICAgICAgbXV0ZXMgYXVkaW8gaW5wdXQgdG8gdGhlIG1vZGVtCisgKiAgICAgICAgICAgc2VyMTIrICAgaGFyZHdhcmUgRENELCBpbnZlcnRlZCBzaWduYWwgYXQgRENEIHBpbgorICogIGlvYmFzZSAgIGJhc2UgYWRkcmVzcyBvZiB0aGUgcG9ydDsgY29tbW9uIHZhbHVlcyBhcmUgMHgzZjgsIDB4MmY4LCAweDNlOCwgMHgyZTgKKyAqICBpcnEgICAgICBpbnRlcnJ1cHQgbGluZSBvZiB0aGUgcG9ydDsgY29tbW9uIHZhbHVlcyBhcmUgNCwzCisgKgorICoKKyAqICBIaXN0b3J5OgorICogICAwLjEgIDI2LjA2LjE5OTYgIEFkYXB0ZWQgZnJvbSBiYXljb20uYyBhbmQgbWFkZSBuZXR3b3JrIGRyaXZlciBpbnRlcmZhY2UKKyAqICAgICAgICAxOC4xMC4xOTk2ICBDaGFuZ2VkIHRvIG5ldyB1c2VyIHNwYWNlIGFjY2VzcyByb3V0aW5lcyAoY29weV97dG8sZnJvbX1fdXNlcikKKyAqICAgMC4zICAyNi4wNC4xOTk3ICBpbml0IGNvZGUvZGF0YSB0YWdnZWQKKyAqICAgMC40ICAwOC4wNy4xOTk3ICBhbHRlcm5hdGl2ZSBzZXIxMiBkZWNvZGluZyBhbGdvcml0aG0gKHVzZXMgZGVsdGEgQ1RTIGludHMpCisgKiAgIDAuNSAgMTEuMTEuMTk5NyAgc2VyMTIvcGFyOTYgc3BsaXQgaW50byBzZXBhcmF0ZSBmaWxlcworICogICAwLjYgIDE0LjA0LjE5OTggIGNsZWFudXBzCisgKiAgIDAuNyAgMDMuMDguMTk5OSAgYWRhcHQgdG8gTGludXMnIG5ldyBfX3NldHVwL19faW5pdGNhbGwKKyAqICAgMC44ICAxMC4wOC4xOTk5ICB1c2UgbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQKKyAqICAgMC45ICAxMi4wMi4yMDAwICBhZGFwdGVkIHRvIHNvZnRuZXQgZHJpdmVyIGludGVyZmFjZQorICogICAwLjEwIDAzLjA3LjIwMDAgIGZpeCBpbnRlcmZhY2UgbmFtZSBoYW5kbGluZworICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGNkcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9iYXljb20uaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQkFZQ09NX0RFQlVHCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciBiY19kcnZuYW1lW10gPSAiYmF5Y29tX3Nlcl9oZHgiOworc3RhdGljIGNvbnN0IGNoYXIgYmNfZHJ2aW5mb1tdID0gS0VSTl9JTkZPICJiYXljb21fc2VyX2hkeDogKEMpIDE5OTYtMjAwMCBUaG9tYXMgU2FpbGVyLCBIQjlKTlgvQUU0V0FcbiIKK0tFUk5fSU5GTyAiYmF5Y29tX3Nlcl9oZHg6IHZlcnNpb24gMC4xMCBjb21waWxlZCAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBOUl9QT1JUUyA0CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYmF5Y29tX2RldmljZVtOUl9QT1JUU107CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJCUihpb2Jhc2UpIChpb2Jhc2UrMCkKKyNkZWZpbmUgVEhSKGlvYmFzZSkgKGlvYmFzZSswKQorI2RlZmluZSBJRVIoaW9iYXNlKSAoaW9iYXNlKzEpCisjZGVmaW5lIElJUihpb2Jhc2UpIChpb2Jhc2UrMikKKyNkZWZpbmUgRkNSKGlvYmFzZSkgKGlvYmFzZSsyKQorI2RlZmluZSBMQ1IoaW9iYXNlKSAoaW9iYXNlKzMpCisjZGVmaW5lIE1DUihpb2Jhc2UpIChpb2Jhc2UrNCkKKyNkZWZpbmUgTFNSKGlvYmFzZSkgKGlvYmFzZSs1KQorI2RlZmluZSBNU1IoaW9iYXNlKSAoaW9iYXNlKzYpCisjZGVmaW5lIFNDUihpb2Jhc2UpIChpb2Jhc2UrNykKKyNkZWZpbmUgRExMKGlvYmFzZSkgKGlvYmFzZSswKQorI2RlZmluZSBETE0oaW9iYXNlKSAoaW9iYXNlKzEpCisKKyNkZWZpbmUgU0VSMTJfRVhURU5UIDgKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLgorICovCisKK3N0cnVjdCBiYXljb21fc3RhdGUgeworCXN0cnVjdCBoZGxjZHJ2X3N0YXRlIGhkcnY7CisKKwlpbnQgb3B0X2RjZDsKKworCXN0cnVjdCBtb2RlbV9zdGF0ZSB7CisJCXNob3J0IGFyYl9kaXZpZGVyOworCQl1bnNpZ25lZCBjaGFyIGZsYWdzOworCQl1bnNpZ25lZCBpbnQgc2hyZWc7CisJCXN0cnVjdCBtb2RlbV9zdGF0ZV9zZXIxMiB7CisJCQl1bnNpZ25lZCBjaGFyIHR4X2JpdDsKKwkJCWludCBkY2Rfc3VtMCwgZGNkX3N1bTEsIGRjZF9zdW0yOworCQkJdW5zaWduZWQgY2hhciBsYXN0X3NhbXBsZTsKKwkJCXVuc2lnbmVkIGNoYXIgbGFzdF9yeGJpdDsKKwkJCXVuc2lnbmVkIGludCBkY2Rfc2hyZWc7CisJCQl1bnNpZ25lZCBpbnQgZGNkX3RpbWU7CisJCQl1bnNpZ25lZCBpbnQgYml0X3BsbDsKKwkJCXVuc2lnbmVkIGNoYXIgaW50ZXJtX3NhbXBsZTsKKwkJfSBzZXIxMjsKKwl9IG1vZGVtOworCisjaWZkZWYgQkFZQ09NX0RFQlVHCisJc3RydWN0IGRlYnVnX3ZhbHMgeworCQl1bnNpZ25lZCBsb25nIGxhc3RfamlmZmllczsKKwkJdW5zaWduZWQgY3VyX2ludGNudDsKKwkJdW5zaWduZWQgbGFzdF9pbnRjbnQ7CisJCWludCBjdXJfcGxsY29ycjsKKwkJaW50IGxhc3RfcGxsY29ycjsKKwl9IGRlYnVnX3ZhbHM7CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIGJheWNvbV9pbnRfZnJlcShzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYykKK3sKKyNpZmRlZiBCQVlDT01fREVCVUcKKwl1bnNpZ25lZCBsb25nIGN1cl9qaWZmaWVzID0gamlmZmllczsKKwkvKgorCSAqIG1lYXN1cmUgdGhlIGludGVycnVwdCBmcmVxdWVuY3kKKwkgKi8KKwliYy0+ZGVidWdfdmFscy5jdXJfaW50Y250Kys7CisJaWYgKChjdXJfamlmZmllcyAtIGJjLT5kZWJ1Z192YWxzLmxhc3RfamlmZmllcykgPj0gSFopIHsKKwkJYmMtPmRlYnVnX3ZhbHMubGFzdF9qaWZmaWVzID0gY3VyX2ppZmZpZXM7CisJCWJjLT5kZWJ1Z192YWxzLmxhc3RfaW50Y250ID0gYmMtPmRlYnVnX3ZhbHMuY3VyX2ludGNudDsKKwkJYmMtPmRlYnVnX3ZhbHMuY3VyX2ludGNudCA9IDA7CisJCWJjLT5kZWJ1Z192YWxzLmxhc3RfcGxsY29yciA9IGJjLT5kZWJ1Z192YWxzLmN1cl9wbGxjb3JyOworCQliYy0+ZGVidWdfdmFscy5jdXJfcGxsY29yciA9IDA7CisJfQorI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT0gU0VSMTIgc3BlY2lmaWMgcm91dGluZXMgPT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXIxMl9zZXRfZGl2aXNvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgdW5zaWduZWQgY2hhciBkaXZpc29yKQoreworCW91dGIoMHg4MSwgTENSKGRldi0+YmFzZV9hZGRyKSk7CS8qIERMQUIgPSAxICovCisJb3V0YihkaXZpc29yLCBETEwoZGV2LT5iYXNlX2FkZHIpKTsKKwlvdXRiKDAsIERMTShkZXYtPmJhc2VfYWRkcikpOworCW91dGIoMHgwMSwgTENSKGRldi0+YmFzZV9hZGRyKSk7CS8qIHdvcmQgbGVuZ3RoID0gNiAqLworCS8qCisJICogbWFrZSBzdXJlIHRoZSBuZXh0IGludGVycnVwdCBpcyBnZW5lcmF0ZWQ7CisJICogMCBtdXN0IGJlIHVzZWQgdG8gcG93ZXIgdGhlIG1vZGVtOyB0aGUgbW9kZW0gZHJhd3MgaXRzCisJICogcG93ZXIgZnJvbSB0aGUgVHhEIGxpbmUKKwkgKi8KKwlvdXRiKDB4MDAsIFRIUihkZXYtPmJhc2VfYWRkcikpOworCS8qCisJICogaXQgaXMgaW1wb3J0YW50IG5vdCB0byBzZXQgdGhlIGRpdmlkZXIgd2hpbGUgdHJhbnNtaXR0aW5nOworCSAqIHRoaXMgcmVwb3J0ZWRseSBtYWtlcyBzb21lIFVBUlRzIGdlbmVyYXRpbmcgaW50ZXJydXB0cworCSAqIGluIHRoZSBodW5kcmVkdGhvdXNhbmRzIHBlciBzZWNvbmQgcmVnaW9uCisJICogUmVwb3J0ZWQgYnk6IElnbmFjaW8uQXJlbmF6YUBzdHVkaS5lcGZsLmNoIChJZ25hY2lvIEFyZW5hemEgTnVubykKKwkgKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBtdXN0IGNhbGwgdGhlIFRYIGFyYml0cmF0b3IgZXZlcnkgMTBtcworICovCisjZGVmaW5lIFNFUjEyX0FSQl9ESVZJREVSKGJjKSAgKGJjLT5vcHRfZGNkID8gMjQgOiAzNikKKwkJCSAgICAgICAKKyNkZWZpbmUgU0VSMTJfRENEX0lOVEVSVkFMKGJjKSAoYmMtPm9wdF9kY2QgPyAxMiA6IDI0MCkKKworc3RhdGljIGlubGluZSB2b2lkIHNlcjEyX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBiYXljb21fc3RhdGUgKmJjKQoreworCS8qIG9uZSBpbnRlcnJ1cHQgcGVyIGNoYW5uZWwgYml0ICovCisJc2VyMTJfc2V0X2Rpdmlzb3IoZGV2LCAxMik7CisJLyoKKwkgKiBmaXJzdCBvdXRwdXQgdGhlIGxhc3QgYml0ICghKSB0aGVuIGNhbGwgSERMQyB0cmFuc21pdHRlciwKKwkgKiBzaW5jZSB0aGlzIG1heSB0YWtlIHF1aXRlIGxvbmcKKwkgKi8KKwlvdXRiKDB4MGUgfCAoISFiYy0+bW9kZW0uc2VyMTIudHhfYml0KSwgTUNSKGRldi0+YmFzZV9hZGRyKSk7CisJaWYgKGJjLT5tb2RlbS5zaHJlZyA8PSAxKQorCQliYy0+bW9kZW0uc2hyZWcgPSAweDEwMDAwIHwgaGRsY2Rydl9nZXRiaXRzKCZiYy0+aGRydik7CisJYmMtPm1vZGVtLnNlcjEyLnR4X2JpdCA9ICEoYmMtPm1vZGVtLnNlcjEyLnR4X2JpdCBeCisJCQkJICAgKGJjLT5tb2RlbS5zaHJlZyAmIDEpKTsKKwliYy0+bW9kZW0uc2hyZWcgPj49IDE7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc2VyMTJfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMpCit7CisJdW5zaWduZWQgY2hhciBjdXJfczsKKwkvKgorCSAqIGRvIGRlbW9kdWxhdG9yCisJICovCisJY3VyX3MgPSBpbmIoTVNSKGRldi0+YmFzZV9hZGRyKSkgJiAweDEwOwkvKiB0aGUgQ1RTIGxpbmUgKi8KKwloZGxjZHJ2X2NoYW5uZWxiaXQoJmJjLT5oZHJ2LCBjdXJfcyk7CisJYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyA9IChiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnIDw8IDEpIHwKKwkJKGN1cl9zICE9IGJjLT5tb2RlbS5zZXIxMi5sYXN0X3NhbXBsZSk7CisJYmMtPm1vZGVtLnNlcjEyLmxhc3Rfc2FtcGxlID0gY3VyX3M7CisJaWYoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyAmIDEpIHsKKwkJaWYgKCFiYy0+b3B0X2RjZCkgeworCQkJdW5zaWduZWQgaW50IGRjZHNwb3MsIGRjZHNuZWc7CisKKwkJCWRjZHNwb3MgPSBkY2RzbmVnID0gMDsKKwkJCWRjZHNwb3MgKz0gKChiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnID4+IDEpICYgMSk7CisJCQlpZiAoIShiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnICYgMHg3ZmZmZmZmZSkpCisJCQkJZGNkc3BvcyArPSAyOworCQkJZGNkc25lZyArPSAoKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgPj4gMikgJiAxKTsKKwkJCWRjZHNuZWcgKz0gKChiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnID4+IDMpICYgMSk7CisJCQlkY2RzbmVnICs9ICgoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyA+PiA0KSAmIDEpOworCisJCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTAgKz0gMTYqZGNkc3BvcyAtIGRjZHNuZWc7CisJCX0gZWxzZQorCQkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wLS07CisJfQorCWlmKCFiYy0+bW9kZW0uc2VyMTIuZGNkX3RpbWUpIHsKKwkJaGRsY2Rydl9zZXRkY2QoJmJjLT5oZHJ2LCAoYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wICsKKwkJCQkJICAgYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0xICsKKwkJCQkJICAgYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0yKSA8IDApOworCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTIgPSBiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTE7CisJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMSA9IGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMDsKKwkJLyogb2Zmc2V0IHRvIGVuc3VyZSBEQ0Qgb2ZmIG9uIHNpbGVudCBpbnB1dCAqLworCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTAgPSAyOworCQliYy0+bW9kZW0uc2VyMTIuZGNkX3RpbWUgPSBTRVIxMl9EQ0RfSU5URVJWQUwoYmMpOworCX0KKwliYy0+bW9kZW0uc2VyMTIuZGNkX3RpbWUtLTsKKwlpZiAoIWJjLT5vcHRfZGNkKSB7CisJCS8qCisJCSAqIFBMTCBjb2RlIGZvciB0aGUgaW1wcm92ZWQgc29mdHdhcmUgRENEIGFsZ29yaXRobQorCQkgKi8KKwkJaWYgKGJjLT5tb2RlbS5zZXIxMi5pbnRlcm1fc2FtcGxlKSB7CisJCQkvKgorCQkJICogaW50ZXJtZWRpYXRlIHNhbXBsZTsgc2V0IHRpbWluZyBjb3JyZWN0aW9uIHRvIG5vcm1hbAorCQkJICovCisJCQlzZXIxMl9zZXRfZGl2aXNvcihkZXYsIDQpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIGRvIFBMTCBjb3JyZWN0aW9uIGFuZCBjYWxsIEhETEMgcmVjZWl2ZXIKKwkJCSAqLworCQkJc3dpdGNoIChiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnICYgNykgeworCQkJY2FzZSAxOiAvKiB0cmFuc2l0aW9uIHRvbyBsYXRlICovCisJCQkJc2VyMTJfc2V0X2Rpdmlzb3IoZGV2LCA1KTsKKyNpZmRlZiBCQVlDT01fREVCVUcKKwkJCQliYy0+ZGVidWdfdmFscy5jdXJfcGxsY29ycisrOworI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworCQkJCWJyZWFrOworCQkJY2FzZSA0OgkvKiB0cmFuc2l0aW9uIHRvbyBlYXJseSAqLworCQkJCXNlcjEyX3NldF9kaXZpc29yKGRldiwgMyk7CisjaWZkZWYgQkFZQ09NX0RFQlVHCisJCQkJYmMtPmRlYnVnX3ZhbHMuY3VyX3BsbGNvcnItLTsKKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJc2VyMTJfc2V0X2Rpdmlzb3IoZGV2LCA0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJjLT5tb2RlbS5zaHJlZyA+Pj0gMTsKKwkJCWlmIChiYy0+bW9kZW0uc2VyMTIubGFzdF9zYW1wbGUgPT0KKwkJCSAgICBiYy0+bW9kZW0uc2VyMTIubGFzdF9yeGJpdCkKKwkJCQliYy0+bW9kZW0uc2hyZWcgfD0gMHgxMDAwMDsKKwkJCWJjLT5tb2RlbS5zZXIxMi5sYXN0X3J4Yml0ID0KKwkJCQliYy0+bW9kZW0uc2VyMTIubGFzdF9zYW1wbGU7CisJCX0KKwkJaWYgKCsrYmMtPm1vZGVtLnNlcjEyLmludGVybV9zYW1wbGUgPj0gMykKKwkJCWJjLT5tb2RlbS5zZXIxMi5pbnRlcm1fc2FtcGxlID0gMDsKKwkJLyoKKwkJICogRENEIHN0dWZmCisJCSAqLworCQlpZiAoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyAmIDEpIHsKKwkJCXVuc2lnbmVkIGludCBkY2RzcG9zLCBkY2RzbmVnOworCisJCQlkY2RzcG9zID0gZGNkc25lZyA9IDA7CisJCQlkY2RzcG9zICs9ICgoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyA+PiAxKSAmIDEpOworCQkJZGNkc3BvcyArPSAoIShiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnICYgMHg3ZmZmZmZmZSkpCisJCQkJPDwgMTsKKwkJCWRjZHNuZWcgKz0gKChiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnID4+IDIpICYgMSk7CisJCQlkY2RzbmVnICs9ICgoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyA+PiAzKSAmIDEpOworCQkJZGNkc25lZyArPSAoKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgPj4gNCkgJiAxKTsKKworCQkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wICs9IDE2KmRjZHNwb3MgLSBkY2RzbmVnOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUExMIGFsZ29yaXRobSBmb3IgdGhlIGhhcmR3YXJlIHNxdWVsY2ggRENEIGFsZ29yaXRobQorCQkgKi8KKwkJaWYgKGJjLT5tb2RlbS5zZXIxMi5pbnRlcm1fc2FtcGxlKSB7CisJCQkvKgorCQkJICogaW50ZXJtZWRpYXRlIHNhbXBsZTsgc2V0IHRpbWluZyBjb3JyZWN0aW9uIHRvIG5vcm1hbAorCQkJICovCisJCQlzZXIxMl9zZXRfZGl2aXNvcihkZXYsIDYpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIGRvIFBMTCBjb3JyZWN0aW9uIGFuZCBjYWxsIEhETEMgcmVjZWl2ZXIKKwkJCSAqLworCQkJc3dpdGNoIChiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnICYgMykgeworCQkJY2FzZSAxOiAvKiB0cmFuc2l0aW9uIHRvbyBsYXRlICovCisJCQkJc2VyMTJfc2V0X2Rpdmlzb3IoZGV2LCA3KTsKKyNpZmRlZiBCQVlDT01fREVCVUcKKwkJCQliYy0+ZGVidWdfdmFscy5jdXJfcGxsY29ycisrOworI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworCQkJCWJyZWFrOworCQkJY2FzZSAyOgkvKiB0cmFuc2l0aW9uIHRvbyBlYXJseSAqLworCQkJCXNlcjEyX3NldF9kaXZpc29yKGRldiwgNSk7CisjaWZkZWYgQkFZQ09NX0RFQlVHCisJCQkJYmMtPmRlYnVnX3ZhbHMuY3VyX3BsbGNvcnItLTsKKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJc2VyMTJfc2V0X2Rpdmlzb3IoZGV2LCA2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJjLT5tb2RlbS5zaHJlZyA+Pj0gMTsKKwkJCWlmIChiYy0+bW9kZW0uc2VyMTIubGFzdF9zYW1wbGUgPT0KKwkJCSAgICBiYy0+bW9kZW0uc2VyMTIubGFzdF9yeGJpdCkKKwkJCQliYy0+bW9kZW0uc2hyZWcgfD0gMHgxMDAwMDsKKwkJCWJjLT5tb2RlbS5zZXIxMi5sYXN0X3J4Yml0ID0KKwkJCQliYy0+bW9kZW0uc2VyMTIubGFzdF9zYW1wbGU7CisJCX0KKwkJYmMtPm1vZGVtLnNlcjEyLmludGVybV9zYW1wbGUgPSAhYmMtPm1vZGVtLnNlcjEyLmludGVybV9zYW1wbGU7CisJCS8qCisJCSAqIERDRCBzdHVmZgorCQkgKi8KKwkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wIC09IChiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnICYgMSk7CisJfQorCW91dGIoMHgwZCwgTUNSKGRldi0+YmFzZV9hZGRyKSk7CQkvKiB0cmFuc21pdHRlciBvZmYgKi8KKwlpZiAoYmMtPm1vZGVtLnNocmVnICYgMSkgeworCQloZGxjZHJ2X3B1dGJpdHMoJmJjLT5oZHJ2LCBiYy0+bW9kZW0uc2hyZWcgPj4gMSk7CisJCWJjLT5tb2RlbS5zaHJlZyA9IDB4MTAwMDA7CisJfQorCWlmKCFiYy0+bW9kZW0uc2VyMTIuZGNkX3RpbWUpIHsKKwkJaWYgKGJjLT5vcHRfZGNkICYgMSkgCisJCQloZGxjZHJ2X3NldGRjZCgmYmMtPmhkcnYsICEoKGluYihNU1IoZGV2LT5iYXNlX2FkZHIpKSBeIGJjLT5vcHRfZGNkKSAmIDB4ODApKTsKKwkJZWxzZQorCQkJaGRsY2Rydl9zZXRkY2QoJmJjLT5oZHJ2LCAoYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wICsKKwkJCQkJCSAgIGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMSArCisJCQkJCQkgICBiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTIpIDwgMCk7CisJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMiA9IGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMTsKKwkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0xID0gYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wOworCQkvKiBvZmZzZXQgdG8gZW5zdXJlIERDRCBvZmYgb24gc2lsZW50IGlucHV0ICovCisJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMCA9IDI7CisJCWJjLT5tb2RlbS5zZXIxMi5kY2RfdGltZSA9IFNFUjEyX0RDRF9JTlRFUlZBTChiYyk7CisJfQorCWJjLT5tb2RlbS5zZXIxMi5kY2RfdGltZS0tOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlycXJldHVybl90IHNlcjEyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgaWlyOworCisJaWYgKCFkZXYgfHwgIWJjIHx8IGJjLT5oZHJ2Lm1hZ2ljICE9IEhETENEUlZfTUFHSUMpCisJCXJldHVybiBJUlFfTk9ORTsKKwkvKiBmYXN0IHdheSBvdXQgKi8KKwlpZiAoKGlpciA9IGluYihJSVIoZGV2LT5iYXNlX2FkZHIpKSkgJiAxKQorCQlyZXR1cm4gSVJRX05PTkU7CisJYmF5Y29tX2ludF9mcmVxKGJjKTsKKwlkbyB7CisJCXN3aXRjaCAoaWlyICYgNikgeworCQljYXNlIDY6CisJCQlpbmIoTFNSKGRldi0+YmFzZV9hZGRyKSk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIDQ6CisJCQlpbmIoUkJSKGRldi0+YmFzZV9hZGRyKSk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIDI6CisJCQkvKgorCQkJICogY2hlY2sgaWYgdHJhbnNtaXR0ZXIgYWN0aXZlCisJCQkgKi8KKwkJCWlmIChoZGxjZHJ2X3B0dCgmYmMtPmhkcnYpKQorCQkJCXNlcjEyX3R4KGRldiwgYmMpOworCQkJZWxzZSB7CisJCQkJc2VyMTJfcngoZGV2LCBiYyk7CisJCQkJYmMtPm1vZGVtLmFyYl9kaXZpZGVyLS07CisJCQl9CisJCQlvdXRiKDB4MDAsIFRIUihkZXYtPmJhc2VfYWRkcikpOworCQkJYnJlYWs7CisJCQkKKwkJZGVmYXVsdDoKKwkJCWluYihNU1IoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCWJyZWFrOworCQl9CisJCWlpciA9IGluYihJSVIoZGV2LT5iYXNlX2FkZHIpKTsKKwl9IHdoaWxlICghKGlpciAmIDEpKTsKKwlpZiAoYmMtPm1vZGVtLmFyYl9kaXZpZGVyIDw9IDApIHsKKwkJYmMtPm1vZGVtLmFyYl9kaXZpZGVyID0gU0VSMTJfQVJCX0RJVklERVIoYmMpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCWhkbGNkcnZfYXJiaXRyYXRlKGRldiwgJmJjLT5oZHJ2KTsKKwl9CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCWhkbGNkcnZfdHJhbnNtaXR0ZXIoZGV2LCAmYmMtPmhkcnYpOworCWhkbGNkcnZfcmVjZWl2ZXIoZGV2LCAmYmMtPmhkcnYpOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSB1YXJ0IHsgY191YXJ0X3Vua25vd24sIGNfdWFydF84MjUwLAorCSAgICBjX3VhcnRfMTY0NTAsIGNfdWFydF8xNjU1MCwgY191YXJ0XzE2NTUwQX07CitzdGF0aWMgY29uc3QgY2hhciAqdWFydF9zdHJbXSA9IHsgCisJInVua25vd24iLCAiODI1MCIsICIxNjQ1MCIsICIxNjU1MCIsICIxNjU1MEEiIAorfTsKKworc3RhdGljIGVudW0gdWFydCBzZXIxMl9jaGVja191YXJ0KHVuc2lnbmVkIGludCBpb2Jhc2UpCit7CisJdW5zaWduZWQgY2hhciBiMSxiMixiMzsKKwllbnVtIHVhcnQgdTsKKwllbnVtIHVhcnQgdWFydF90YWJbXSA9CisJCXsgY191YXJ0XzE2NDUwLCBjX3VhcnRfdW5rbm93biwgY191YXJ0XzE2NTUwLCBjX3VhcnRfMTY1NTBBIH07CisKKwliMSA9IGluYihNQ1IoaW9iYXNlKSk7CisJb3V0YihiMSB8IDB4MTAsIE1DUihpb2Jhc2UpKTsJLyogbG9vcGJhY2sgbW9kZSAqLworCWIyID0gaW5iKE1TUihpb2Jhc2UpKTsKKwlvdXRiKDB4MWEsIE1DUihpb2Jhc2UpKTsKKwliMyA9IGluYihNU1IoaW9iYXNlKSkgJiAweGYwOworCW91dGIoYjEsIE1DUihpb2Jhc2UpKTsJCQkvKiByZXN0b3JlIG9sZCB2YWx1ZXMgKi8KKwlvdXRiKGIyLCBNU1IoaW9iYXNlKSk7CisJaWYgKGIzICE9IDB4OTApCisJCXJldHVybiBjX3VhcnRfdW5rbm93bjsKKwlpbmIoUkJSKGlvYmFzZSkpOworCWluYihSQlIoaW9iYXNlKSk7CisJb3V0YigweDAxLCBGQ1IoaW9iYXNlKSk7CQkvKiBlbmFibGUgRklGT3MgKi8KKwl1ID0gdWFydF90YWJbKGluYihJSVIoaW9iYXNlKSkgPj4gNikgJiAzXTsKKwlpZiAodSA9PSBjX3VhcnRfMTY0NTApIHsKKwkJb3V0YigweDVhLCBTQ1IoaW9iYXNlKSk7CisJCWIxID0gaW5iKFNDUihpb2Jhc2UpKTsKKwkJb3V0YigweGE1LCBTQ1IoaW9iYXNlKSk7CisJCWIyID0gaW5iKFNDUihpb2Jhc2UpKTsKKwkJaWYgKChiMSAhPSAweDVhKSB8fCAoYjIgIT0gMHhhNSkpCisJCQl1ID0gY191YXJ0XzgyNTA7CisJfQorCXJldHVybiB1OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBzZXIxMl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCWVudW0gdWFydCB1OworCisJaWYgKCFkZXYgfHwgIWJjKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghZGV2LT5iYXNlX2FkZHIgfHwgZGV2LT5iYXNlX2FkZHIgPiAweDEwMDAtU0VSMTJfRVhURU5UIHx8CisJICAgIGRldi0+aXJxIDwgMiB8fCBkZXYtPmlycSA+IDE1KQorCQlyZXR1cm4gLUVOWElPOworCWlmICghcmVxdWVzdF9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNFUjEyX0VYVEVOVCwgImJheWNvbV9zZXIxMiIpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKwltZW1zZXQoJmJjLT5tb2RlbSwgMCwgc2l6ZW9mKGJjLT5tb2RlbSkpOworCWJjLT5oZHJ2LnBhci5iaXRyYXRlID0gMTIwMDsKKwlpZiAoKHUgPSBzZXIxMl9jaGVja191YXJ0KGRldi0+YmFzZV9hZGRyKSkgPT0gY191YXJ0X3Vua25vd24pIHsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNFUjEyX0VYVEVOVCk7ICAgICAgIAorCQlyZXR1cm4gLUVJTzsKKwl9CisJb3V0YigwLCBGQ1IoZGV2LT5iYXNlX2FkZHIpKTsgIC8qIGRpc2FibGUgRklGT3MgKi8KKwlvdXRiKDB4MGQsIE1DUihkZXYtPmJhc2VfYWRkcikpOworCW91dGIoMCwgSUVSKGRldi0+YmFzZV9hZGRyKSk7CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzZXIxMl9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorCQkJImJheWNvbV9zZXIxMiIsIGRldikpIHsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNFUjEyX0VYVEVOVCk7ICAgICAgIAorCQlyZXR1cm4gLUVCVVNZOworCX0KKwkvKgorCSAqIGVuYWJsZSB0cmFuc21pdHRlciBlbXB0eSBpbnRlcnJ1cHQKKwkgKi8KKwlvdXRiKDIsIElFUihkZXYtPmJhc2VfYWRkcikpOworCS8qCisJICogc2V0IHRoZSBTSU8gdG8gNiBCaXRzL2NoYXJhY3RlciBhbmQgMTkyMDAgb3IgMjg4MDAgYmF1ZCwgc28gdGhhdAorCSAqIHdlIGdldCBleGFjdGx5IChob3BlZnVsbHkpIDIgb3IgMyBpbnRlcnJ1cHRzIHBlciByYWRpbyBzeW1ib2wsCisJICogZGVwZW5kaW5nIG9uIHRoZSB1c2FnZSBvZiB0aGUgc29mdHdhcmUgRENEIHJvdXRpbmUKKwkgKi8KKwlzZXIxMl9zZXRfZGl2aXNvcihkZXYsIGJjLT5vcHRfZGNkID8gNiA6IDQpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBzZXIxMiBhdCBpb2Jhc2UgMHglbHggaXJxICV1IHVhcnQgJXNcbiIsIAorCSAgICAgICBiY19kcnZuYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEsIHVhcnRfc3RyW3VdKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgc2VyMTJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIWRldiB8fCAhYmMpCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICogZGlzYWJsZSBpbnRlcnJ1cHRzCisJICovCisJb3V0YigwLCBJRVIoZGV2LT5iYXNlX2FkZHIpKTsKKwlvdXRiKDEsIE1DUihkZXYtPmJhc2VfYWRkcikpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTRVIxMl9FWFRFTlQpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBjbG9zZSBzZXIxMiBhdCBpb2Jhc2UgMHglbHggaXJxICV1XG4iLAorCSAgICAgICBiY19kcnZuYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT0gaGRsY2RydiBkcml2ZXIgaW50ZXJmYWNlID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBiYXljb21faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsCisJCQlzdHJ1Y3QgaGRsY2Rydl9pb2N0bCAqaGksIGludCBjbWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBoZGxjZHJ2X29wcyBzZXIxMl9vcHMgPSB7CisJLmRydm5hbWUgPSBiY19kcnZuYW1lLAorCS5kcnZpbmZvID0gYmNfZHJ2aW5mbywKKwkub3BlbiAgICA9IHNlcjEyX29wZW4sCisJLmNsb3NlICAgPSBzZXIxMl9jbG9zZSwKKwkuaW9jdGwgICA9IGJheWNvbV9pb2N0bCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJheWNvbV9zZXRtb2RlKHN0cnVjdCBiYXljb21fc3RhdGUgKmJjLCBjb25zdCBjaGFyICptb2Rlc3RyKQoreworCWlmIChzdHJjaHIobW9kZXN0ciwgJyonKSkKKwkJYmMtPm9wdF9kY2QgPSAwOworCWVsc2UgaWYgKHN0cmNocihtb2Rlc3RyLCAnKycpKQorCQliYy0+b3B0X2RjZCA9IC0xOworCWVsc2UgaWYgKHN0cmNocihtb2Rlc3RyLCAnQCcpKQorCQliYy0+b3B0X2RjZCA9IC0yOworCWVsc2UKKwkJYmMtPm9wdF9kY2QgPSAxOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBiYXljb21faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsCisJCQlzdHJ1Y3QgaGRsY2Rydl9pb2N0bCAqaGksIGludCBjbWQpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmM7CisJc3RydWN0IGJheWNvbV9pb2N0bCBiaTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlCVUdfT04oYmMtPmhkcnYubWFnaWMgIT0gSERMQ0RSVl9NQUdJQyk7CisKKwlpZiAoY21kICE9IFNJT0NERVZQUklWQVRFKQorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCXN3aXRjaCAoaGktPmNtZCkgeworCWRlZmF1bHQ6CisJCWJyZWFrOworCisJY2FzZSBIRExDRFJWQ1RMX0dFVE1PREU6CisJCXN0cmNweShoaS0+ZGF0YS5tb2RlbmFtZSwgInNlcjEyIik7CisJCWlmIChiYy0+b3B0X2RjZCA8PSAwKQorCQkJc3RyY2F0KGhpLT5kYXRhLm1vZGVuYW1lLCAoIWJjLT5vcHRfZGNkKSA/ICIqIiA6IChiYy0+b3B0X2RjZCA9PSAtMikgPyAiQCIgOiAiKyIpOworCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsIGhpLCBzaXplb2Yoc3RydWN0IGhkbGNkcnZfaW9jdGwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgSERMQ0RSVkNUTF9TRVRNT0RFOgorCQlpZiAobmV0aWZfcnVubmluZyhkZXYpIHx8ICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWhpLT5kYXRhLm1vZGVuYW1lW3NpemVvZihoaS0+ZGF0YS5tb2RlbmFtZSktMV0gPSAnXDAnOworCQlyZXR1cm4gYmF5Y29tX3NldG1vZGUoYmMsIGhpLT5kYXRhLm1vZGVuYW1lKTsKKworCWNhc2UgSERMQ0RSVkNUTF9NT0RFTElTVDoKKwkJc3RyY3B5KGhpLT5kYXRhLm1vZGVuYW1lLCAic2VyMTIiKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCBoaSwgc2l6ZW9mKHN0cnVjdCBoZGxjZHJ2X2lvY3RsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhETENEUlZDVExfTU9ERU1QQVJNQVNLOgorCQlyZXR1cm4gSERMQ0RSVl9QQVJNQVNLX0lPQkFTRSB8IEhETENEUlZfUEFSTUFTS19JUlE7CisKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJpLCBpZnItPmlmcl9kYXRhLCBzaXplb2YoYmkpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc3dpdGNoIChiaS5jbWQpIHsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisjaWZkZWYgQkFZQ09NX0RFQlVHCisJY2FzZSBCQVlDT01DVExfR0VUREVCVUc6CisJCWJpLmRhdGEuZGJnLmRlYnVnMSA9IGJjLT5oZHJ2LnB0dF9rZXllZDsKKwkJYmkuZGF0YS5kYmcuZGVidWcyID0gYmMtPmRlYnVnX3ZhbHMubGFzdF9pbnRjbnQ7CisJCWJpLmRhdGEuZGJnLmRlYnVnMyA9IGJjLT5kZWJ1Z192YWxzLmxhc3RfcGxsY29ycjsKKwkJYnJlYWs7CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCisKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmYmksIHNpemVvZihiaSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKKworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGNvbW1hbmQgbGluZSBzZXR0YWJsZSBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyBjaGFyICptb2RlW05SX1BPUlRTXSA9IHsgInNlcjEyKiIsIH07CitzdGF0aWMgaW50IGlvYmFzZVtOUl9QT1JUU10gPSB7IDB4M2Y4LCB9Oworc3RhdGljIGludCBpcnFbTlJfUE9SVFNdID0geyA0LCB9OworCittb2R1bGVfcGFyYW1fYXJyYXkobW9kZSwgY2hhcnAsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhtb2RlLCAiYmF5Y29tIG9wZXJhdGluZyBtb2RlOyAqIGZvciBzb2Z0d2FyZSBEQ0QiKTsKK21vZHVsZV9wYXJhbV9hcnJheShpb2Jhc2UsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvYmFzZSwgImJheWNvbSBpbyBiYXNlIGFkZHJlc3MiKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgImJheWNvbSBpcnEgbnVtYmVyIik7CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBNLiBTYWlsZXIsIHNhaWxlckBpZmUuZWUuZXRoei5jaCwgaGI5am54QGhiOXcuY2hlLmV1Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJheWNvbSBzZXIxMiBoYWxmIGR1cGxleCBhbWF0ZXVyIHJhZGlvIG1vZGVtIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9iYXljb21zZXJoZHgodm9pZCkKK3sKKwlpbnQgaSwgZm91bmQgPSAwOworCWNoYXIgc2V0X2h3ID0gMTsKKworCXByaW50ayhiY19kcnZpbmZvKTsKKwkvKgorCSAqIHJlZ2lzdGVyIG5ldCBkZXZpY2VzCisJICovCisJZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwkJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmM7CisJCWNoYXIgaWZuYW1lW0lGTkFNU0laXTsKKworCQlzcHJpbnRmKGlmbmFtZSwgImJjc2glZCIsIGkpOworCisJCWlmICghbW9kZVtpXSkKKwkJCXNldF9odyA9IDA7CisJCWlmICghc2V0X2h3KQorCQkJaW9iYXNlW2ldID0gaXJxW2ldID0gMDsKKworCQlkZXYgPSBoZGxjZHJ2X3JlZ2lzdGVyKCZzZXIxMl9vcHMsIAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJheWNvbV9zdGF0ZSksCisJCQkJICAgICAgIGlmbmFtZSwgaW9iYXNlW2ldLCBpcnFbaV0sIDApOworCQlpZiAoSVNfRVJSKGRldikpIAorCQkJYnJlYWs7CisKKwkJYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCQlpZiAoc2V0X2h3ICYmIGJheWNvbV9zZXRtb2RlKGJjLCBtb2RlW2ldKSkKKwkJCXNldF9odyA9IDA7CisJCWZvdW5kKys7CisJCWJheWNvbV9kZXZpY2VbaV0gPSBkZXY7CisJfQorCisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfYmF5Y29tc2VyaGR4KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBiYXljb21fZGV2aWNlW2ldOworCisJCWlmIChkZXYpCisJCQloZGxjZHJ2X3VucmVnaXN0ZXIoZGV2KTsKKwl9Cit9CisKK21vZHVsZV9pbml0KGluaXRfYmF5Y29tc2VyaGR4KTsKK21vZHVsZV9leGl0KGNsZWFudXBfYmF5Y29tc2VyaGR4KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTU9EVUxFCisKKy8qCisgKiBmb3JtYXQ6IGJheWNvbV9zZXJfaGR4PWlvLGlycSxtb2RlCisgKiBtb2RlOiBzZXIxMiAgICBoYXJkd2FyZSBEQ0QKKyAqICAgICAgIHNlcjEyKiAgIHNvZnR3YXJlIERDRAorICogICAgICAgc2VyMTJAICAgaGFyZHdhcmUvc29mdHdhcmUgRENELCBpLmUuIG5vIGV4cGxpY2l0IERDRCBzaWduYWwgYnV0IGhhcmR3YXJlCisgKiAgICAgICAgICAgICAgICBtdXRlcyBhdWRpbyBpbnB1dCB0byB0aGUgbW9kZW0KKyAqICAgICAgIHNlcjEyKyAgIGhhcmR3YXJlIERDRCwgaW52ZXJ0ZWQgc2lnbmFsIGF0IERDRCBwaW4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBiYXljb21fc2VyX2hkeF9zZXR1cChjaGFyICpzdHIpCit7CisgICAgICAgIHN0YXRpYyB1bnNpZ25lZCBucl9kZXY7CisJaW50IGludHNbM107CisKKyAgICAgICAgaWYgKG5yX2RldiA+PSBOUl9QT1JUUykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIDMsIGludHMpOworCWlmIChpbnRzWzBdIDwgMikKKwkJcmV0dXJuIDA7CisJbW9kZVtucl9kZXZdID0gc3RyOworCWlvYmFzZVtucl9kZXZdID0gaW50c1sxXTsKKwlpcnFbbnJfZGV2XSA9IGludHNbMl07CisJbnJfZGV2Kys7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImJheWNvbV9zZXJfaGR4PSIsIGJheWNvbV9zZXJfaGR4X3NldHVwKTsKKworI2VuZGlmIC8qIE1PRFVMRSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9icHFldGhlci5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYnBxZXRoZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjFhMzU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYnBxZXRoZXIuYwpAQCAtMCwwICsxLDY0MyBAQAorLyoKKyAqCUc4QlBRIGNvbXBhdGlibGUgIkFYLjI1IHZpYSBldGhlcm5ldCIgZHJpdmVyIHJlbGVhc2UgMDA0CisgKgorICoJVGhpcyBjb2RlIFJFUVVJUkVTIDIuMC4wIG9yIGhpZ2hlci8gTkVUMy4wMjkKKyAqCisgKglUaGlzIG1vZHVsZToKKyAqCQlUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBpcyBhICJwc2V1ZG8iIG5ldHdvcmsgZHJpdmVyIHRvIGFsbG93IEFYLjI1IG92ZXIgRXRoZXJuZXQKKyAqCXVzaW5nIEc4QlBRIGVuY2Fwc3VsYXRpb24uIEl0IGhhcyBiZWVuIGV4dHJhY3RlZCBmcm9tIHRoZSBwcm90b2NvbAorICoJaW1wbGVtZW50YXRpb24gYmVjYXVzZQorICoKKyAqCQktIHRoaW5ncyBnb3QgdW5yZWFkYWJsZSB3aXRoaW4gdGhlIHByb3RvY29sIHN0YWNrCisgKgkJLSB0byBjdXJlIHRoZSBwcm90b2NvbCBzdGFjayBmcm9tICJmZWF0dXJlLWlzbSIKKyAqCQktIGEgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gc2hvdWxkbid0IG5lZWQgdG8ga25vdyBvbgorICoJCSAgd2hpY2ggaGFyZHdhcmUgaXQgaXMgcnVubmluZworICoJCS0gdXNlci1sZXZlbCBwcm9ncmFtcyBsaWtlIHRoZSBBWC4yNSB1dGlsaXRpZXMgc2hvdWxkbid0CisgKgkJICBuZWVkIHRvIGtub3cgYWJvdXQgdGhlIGhhcmR3YXJlLgorICoJCS0gSVAgb3ZlciBldGhlcm5ldCBlbmNhcHN1bGF0ZWQgQVguMjUgd2FzIGltcG9zc2libGUKKyAqCQktIHJ4ZWNoby5jIGRpZCBub3Qgd29yaworICoJCS0gdG8gaGF2ZSByb29tIGZvciBleHRlbnNpb25zCisgKgkJLSBpdCBqdXN0IGRlc2VydmVzIHRvICJsaXZlIiBhcyBhbiBvd24gZHJpdmVyCisgKgorICoJVGhpcyBkcml2ZXIgY2FuIHVzZSBhbnkgZXRoZXJuZXQgZGVzdGluYXRpb24gYWRkcmVzcywgYW5kIGNhbiBiZQorICoJbGltaXRlZCB0byBhY2NlcHQgZnJhbWVzIGZyb20gb25lIGRlZGljYXRlZCBldGhlcm5ldCBjYXJkIG9ubHkuCisgKgorICoJTm90ZSB0aGF0IHRoZSBkcml2ZXIgc2V0cyB1cCB0aGUgQlBRIGRldmljZXMgYXV0b21hZ2ljYWxseSBvbgorICoJc3RhcnR1cCBvciAoaWYgc3RhcnRlZCBiZWZvcmUgdGhlICJpbnNtb2QiIG9mIGFuIGV0aGVybmV0IGRldmljZSkKKyAqCW9uICJpZmNvbmZpZyB1cCIuIEl0IGhvcGVmdWxseSB3aWxsIHJlbW92ZSB0aGUgQlBRIG9uICJybW1vZCJpbmcKKyAqCXRoZSBldGhlcm5ldCBkZXZpY2UgKGluIGZhY3Q6IGFzIHNvb24gYXMgYW5vdGhlciBldGhlcm5ldCBvciBicHEKKyAqCWRldmljZSBnZXRzICJpZmNvbmZpZyJ1cmVkKS4KKyAqCisgKglJIGhhdmUgaGVhcmQgdGhhdCBzZXZlcmFsIHBlb3BsZSBhcmUgdGhpbmtpbmcgb2YgZXhwZXJpbWVudHMKKyAqCXdpdGggaGlnaHNwZWVkIHBhY2tldCByYWRpbyB1c2luZyBleGlzdGluZyBldGhlcm5ldCBjYXJkcy4KKyAqCVdlbGwsIHRoaXMgZHJpdmVyIGlzIHByZXBhcmVkIGZvciB0aGlzIHB1cnBvc2UsIGp1c3QgYWRkCisgKgl5b3VyIHR4IGtleSBjb250cm9sIGFuZCBhIHR4ZGVsYXkgLyB0YWlsdGltZSBhbGdvcml0aG0sCisgKglwcm9iYWJseSBzb21lIGJ1ZmZlcmluZywgYW5kIC92b2lsYS8uLi4KKyAqCisgKglIaXN0b3J5CisgKglCUFEgICAwMDEJSm9lcmcoREwxQktFKQkJRXh0cmFjdGVkIEJQUSBjb2RlIGZyb20gQVguMjUKKyAqCQkJCQkJcHJvdG9jb2wgc3RhY2sgYW5kIGFkZGVkIG15IG93bgorICoJCQkJCQl5ZXQgZXhpc3RpbmcgcGF0Y2hlcworICoJQlBRICAgMDAyCUpvZXJnKERMMUJLRSkJCVNjYW4gbmV0d29yayBkZXZpY2UgbGlzdCBvbgorICoJCQkJCQlzdGFydHVwLgorICoJQlBRICAgMDAzCUpvZXJnKERMMUJLRSkJCUV0aGVybmV0IGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqCQkJCQkJYW5kIGFjY2VwdGVkIHNvdXJjZSBhZGRyZXNzCisgKgkJCQkJCWNhbiBiZSBjb25maWd1cmVkIGJ5IGFuIGlvY3RsKCkKKyAqCQkJCQkJY2FsbC4KKyAqCQkJCQkJRml4ZWQgdG8gbWF0Y2ggTGludXggbmV0d29ya2luZworICoJCQkJCQljaGFuZ2VzIC0gMi4xLjE1LgorICoJQlBRICAgMDA0CUpvZXJnKERMMUJLRSkJCUZpeGVkIHRvIG5vdCBsb2NrIHVwIG9uIGlmY29uZmlnLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisKKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9icHFldGhlci5oPgorCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICJBWC4yNTogYnBxZXRoZXIgZHJpdmVyIHZlcnNpb24gMDA0XG4iOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBheDI1X2JjYXN0W0FYMjVfQUREUl9MRU5dID0KKwl7J1EnIDw8IDEsICdTJyA8PCAxLCAnVCcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnICcgPDwgMSwgJzAnIDw8IDF9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXgyNV9kZWZhZGRyW0FYMjVfQUREUl9MRU5dID0KKwl7J0wnIDw8IDEsICdJJyA8PCAxLCAnTicgPDwgMSwgJ1UnIDw8IDEsICdYJyA8PCAxLCAnICcgPDwgMSwgJzEnIDw8IDF9OworCitzdGF0aWMgY2hhciBiY2FzdF9hZGRyWzZdPXsweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRn07CisKK3N0YXRpYyBjaGFyIGJwcV9ldGhfYWRkcls2XTsKKworc3RhdGljIGludCBicHFfcmN2KHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBwYWNrZXRfdHlwZSAqKTsKK3N0YXRpYyBpbnQgYnBxX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZywgdm9pZCAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpicHFfcHJpbnRfZXRoYWRkcihjb25zdCB1bnNpZ25lZCBjaGFyICopOworCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGJwcV9wYWNrZXRfdHlwZSA9IHsKKwkudHlwZQk9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQlBRKSwKKwkuZnVuYwk9IGJwcV9yY3YsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGJwcV9kZXZfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPWJwcV9kZXZpY2VfZXZlbnQsCit9OworCisKK3N0cnVjdCBicHFkZXYgeworCXN0cnVjdCBsaXN0X2hlYWQgYnBxX2xpc3Q7CS8qIGxpc3Qgb2YgYnBxIGRldmljZXMgY2hhaW4gKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZXRoZGV2OwkvKiBsaW5rIHRvIGV0aGVybmV0IGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpheGRldjsJLyogYnBxIGRldmljZSAoYnBxIykgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogc29tZSBzdGF0aXN0aWNzICovCisJY2hhciAgIGRlc3RfYWRkcls2XTsJCS8qIGV0aGVyIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwljaGFyICAgYWNwdF9hZGRyWzZdOwkJLyogYWNjZXB0IGV0aGVyIGZyYW1lcyBmcm9tIHRoaXMgYWRkcmVzcyBvbmx5ICovCit9OworCitzdGF0aWMgTElTVF9IRUFEKGJwcV9kZXZpY2VzKTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKgorICoJR2V0IHRoZSBldGhlcm5ldCBkZXZpY2UgZm9yIGEgQlBRIGRldmljZQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlICpicHFfZ2V0X2V0aGVyX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBicHFkZXYgKmJwcSA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gYnBxID8gYnBxLT5ldGhkZXYgOiBOVUxMOworfQorCisvKgorICoJR2V0IHRoZSBCUFEgZGV2aWNlIGZvciB0aGUgZXRoZXJuZXQgZGV2aWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UgKmJwcV9nZXRfYXgyNV9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYnBxZGV2ICpicHE7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJwcSwgJmJwcV9kZXZpY2VzLCBicHFfbGlzdCkgeworCQlpZiAoYnBxLT5ldGhkZXYgPT0gZGV2KQorCQkJcmV0dXJuIGJwcS0+YXhkZXY7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZXZfaXNfZXRoZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICgKKwkJCWRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIKKwkJCSYmIHN0cm5jbXAoZGV2LT5uYW1lLCAiZHVtbXkiLCA1KQorCSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qCisgKglSZWNlaXZlIGFuIEFYLjI1IGZyYW1lIHZpYSBhbiBldGhlcm5ldCBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyBpbnQgYnBxX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlKQoreworCWludCBsZW47CisJY2hhciAqIHB0cjsKKwlzdHJ1Y3QgZXRoaGRyICpldGg7CisJc3RydWN0IGJwcWRldiAqYnBxOworCisJaWYgKChza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJcmV0dXJuIE5FVF9SWF9EUk9QOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKSkKKwkJZ290byBkcm9wOworCisJcmN1X3JlYWRfbG9jaygpOworCWRldiA9IGJwcV9nZXRfYXgyNV9kZXYoZGV2KTsKKworCWlmIChkZXYgPT0gTlVMTCB8fCAhbmV0aWZfcnVubmluZyhkZXYpKSAKKwkJZ290byBkcm9wX3VubG9jazsKKworCS8qCisJICogaWYgd2Ugd2FudCB0byBhY2NlcHQgZnJhbWVzIGZyb20ganVzdCBvbmUgZXRoZXJuZXQgZGV2aWNlCisJICogd2UgY2hlY2sgdGhlIHNvdXJjZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIuCisJICovCisKKwlicHEgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZXRoID0gZXRoX2hkcihza2IpOworCisJaWYgKCEoYnBxLT5hY3B0X2FkZHJbMF0gJiAweDAxKSAmJgorCSAgICBtZW1jbXAoZXRoLT5oX3NvdXJjZSwgYnBxLT5hY3B0X2FkZHIsIEVUSF9BTEVOKSkKKwkJZ290byBkcm9wX3VubG9jazsKKworCWlmIChza2JfY293KHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKSkKKwkJZ290byBkcm9wX3VubG9jazsKKworCWxlbiA9IHNrYi0+ZGF0YVswXSArIHNrYi0+ZGF0YVsxXSAqIDI1NiAtIDU7CisKKwlza2JfcHVsbChza2IsIDIpOwkvKiBSZW1vdmUgdGhlIGxlbmd0aCBieXRlcyAqLworCXNrYl90cmltKHNrYiwgbGVuKTsJLyogU2V0IHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgKi8KKworCWJwcS0+c3RhdHMucnhfcGFja2V0cysrOworCWJwcS0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCisJcHRyID0gc2tiX3B1c2goc2tiLCAxKTsKKwkqcHRyID0gMDsKKworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BWDI1KTsKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOworCisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwordW5sb2NrOgorCisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gMDsKK2Ryb3BfdW5sb2NrOgorCWtmcmVlX3NrYihza2IpOworCWdvdG8gdW5sb2NrOworCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisvKgorICogCVNlbmQgYW4gQVguMjUgZnJhbWUgdmlhIGFuIGV0aGVybmV0IGludGVyZmFjZQorICovCitzdGF0aWMgaW50IGJwcV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYjsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisJc3RydWN0IGJwcWRldiAqYnBxOworCWludCBzaXplOworCisJLyoKKwkgKiBKdXN0IHRvIGJlICpyZWFsbHkqIHN1cmUgbm90IHRvIHNlbmQgYW55dGhpbmcgaWYgdGhlIGludGVyZmFjZQorCSAqIGlzIGRvd24sIHRoZSBldGhlcm5ldCBkZXZpY2UgbWF5IGhhdmUgZ29uZS4KKwkgKi8KKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc2tiX3B1bGwoc2tiLCAxKTsKKwlzaXplID0gc2tiLT5sZW47CisKKwkvKgorCSAqIFRoZSBBWC4yNSBjb2RlIGxlYXZlcyBlbm91Z2ggcm9vbSBmb3IgdGhlIGV0aGVybmV0IGhlYWRlciwgYnV0CisJICogc2VuZHRvKCkgZG9lcyBub3QuCisJICovCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgQVgyNV9CUFFfSEVBREVSX0xFTikgewkvKiBPdWdoISAqLworCQlpZiAoKG5ld3NrYiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgQVgyNV9CUFFfSEVBREVSX0xFTikpID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJwcWV0aGVyOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlpZiAoc2tiLT5zayAhPSBOVUxMKQorCQkJc2tiX3NldF9vd25lcl93KG5ld3NrYiwgc2tiLT5zayk7CisKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXNrYiA9IG5ld3NrYjsKKwl9CisKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVgyNSk7CisKKwlwdHIgPSBza2JfcHVzaChza2IsIDIpOworCisJKnB0cisrID0gKHNpemUgKyA1KSAlIDI1NjsKKwkqcHRyKysgPSAoc2l6ZSArIDUpIC8gMjU2OworCisJYnBxID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICgoZGV2ID0gYnBxX2dldF9ldGhlcl9kZXYoZGV2KSkgPT0gTlVMTCkgeworCQlicHEtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCWRldi0+aGFyZF9oZWFkZXIoc2tiLCBkZXYsIEVUSF9QX0JQUSwgYnBxLT5kZXN0X2FkZHIsIE5VTEwsIDApOworCWJwcS0+c3RhdHMudHhfcGFja2V0cysrOworCWJwcS0+c3RhdHMudHhfYnl0ZXMrPXNrYi0+bGVuOworICAKKwlkZXZfcXVldWVfeG1pdChza2IpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVN0YXRpc3RpY3MKKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpicHFfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJwcWRldiAqYnBxID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAmYnBxLT5zdGF0czsKK30KKworLyoKKyAqCVNldCBBWC4yNSBjYWxsc2lnbgorICovCitzdGF0aWMgaW50IGJwcV9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKWFkZHI7CisKKyAgICBtZW1jcHkoZGV2LT5kZXZfYWRkciwgc2EtPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCUlvY3RsIGNvbW1hbmRzCisgKgorICoJCVNJT0NTQlBRRVRIT1BUCQlyZXNlcnZlZCBmb3IgZW5oYW5jZW1lbnRzCisgKgkJU0lPQ1NCUFFFVEhBRERSCQlzZXQgdGhlIGRlc3RpbmF0aW9uIGFuZCBhY2NlcHRlZAorICoJCQkJCXNvdXJjZSBldGhlcm5ldCBhZGRyZXNzIChicm9hZGNhc3QKKyAqCQkJCQlvciBtdWx0aWNhc3Q6IGFjY2VwdCBhbGwpCisgKi8KK3N0YXRpYyBpbnQgYnBxX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBicHFfZXRoYWRkciBfX3VzZXIgKmV0aGFkZHIgPSBpZnItPmlmcl9kYXRhOworCXN0cnVjdCBicHFkZXYgKmJwcSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGJwcV9yZXEgcmVxOworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBTSU9DU0JQUUVUSE9QVDoKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxLCBpZnItPmlmcl9kYXRhLCBzaXplb2Yoc3RydWN0IGJwcV9yZXEpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXN3aXRjaCAocmVxLmNtZCkgeworCQkJCWNhc2UgU0lPQ0dCUFFFVEhQQVJBTToKKwkJCQljYXNlIFNJT0NTQlBRRVRIUEFSQU06CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgU0lPQ1NCUFFFVEhBRERSOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKGJwcS0+ZGVzdF9hZGRyLCBldGhhZGRyLT5kZXN0aW5hdGlvbiwgRVRIX0FMRU4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGJwcS0+YWNwdF9hZGRyLCBldGhhZGRyLT5hY2NlcHQsIEVUSF9BTEVOKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG9wZW4vY2xvc2UgYSBkZXZpY2UKKyAqLworc3RhdGljIGludCBicHFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnBxX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qCisgKglQcm9jIGZpbGVzeXN0ZW0KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBicHFfcHJpbnRfZXRoYWRkcihjb25zdCB1bnNpZ25lZCBjaGFyICplKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsxOF07CisKKwlzcHJpbnRmKGJ1ZiwgIiUyLjJYOiUyLjJYOiUyLjJYOiUyLjJYOiUyLjJYOiUyLjJYIiwKKwkJZVswXSwgZVsxXSwgZVsyXSwgZVszXSwgZVs0XSwgZVs1XSk7CisKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgdm9pZCAqYnBxX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJaW50IGkgPSAxOworCXN0cnVjdCBicHFkZXYgKmJwcWRldjsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCWlmICgqcG9zID09IDApCisJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CisJCisJbGlzdF9mb3JfZWFjaF9lbnRyeShicHFkZXYsICZicHFfZGV2aWNlcywgYnBxX2xpc3QpIHsKKwkJaWYgKGkgPT0gKnBvcykKKwkJCXJldHVybiBicHFkZXY7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqYnBxX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJKysqcG9zOworCisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlwID0gYnBxX2RldmljZXMubmV4dDsKKwllbHNlCisJCXAgPSAoKHN0cnVjdCBicHFkZXYgKil2KS0+YnBxX2xpc3QubmV4dDsKKworCXJldHVybiAocCA9PSAmYnBxX2RldmljZXMpID8gTlVMTCAKKwkJOiBsaXN0X2VudHJ5KHAsIHN0cnVjdCBicHFkZXYsIGJwcV9saXN0KTsKK30KKworc3RhdGljIHZvaWQgYnBxX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXJjdV9yZWFkX3VubG9jaygpOworfQorCisKK3N0YXRpYyBpbnQgYnBxX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3B1dHMoc2VxLCAKKwkJCSAiZGV2ICAgZXRoZXIgICAgICBkZXN0aW5hdGlvbiAgICAgICAgYWNjZXB0IGZyb21cbiIpOworCWVsc2UgeworCQljb25zdCBzdHJ1Y3QgYnBxZGV2ICpicHFkZXYgPSB2OworCisJCXNlcV9wcmludGYoc2VxLCAiJS01cyAlLTEwcyAlcyAgIiwKKwkJCWJwcWRldi0+YXhkZXYtPm5hbWUsIGJwcWRldi0+ZXRoZGV2LT5uYW1lLAorCQkJYnBxX3ByaW50X2V0aGFkZHIoYnBxZGV2LT5kZXN0X2FkZHIpKTsKKworCQlzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLAorCQkJKGJwcWRldi0+YWNwdF9hZGRyWzBdICYgMHgwMSkgPyAiKiIgCisJCQkgICA6IGJwcV9wcmludF9ldGhhZGRyKGJwcWRldi0+YWNwdF9hZGRyKSk7CisKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYnBxX3NlcW9wcyA9IHsKKwkuc3RhcnQgPSBicHFfc2VxX3N0YXJ0LAorCS5uZXh0ID0gYnBxX3NlcV9uZXh0LAorCS5zdG9wID0gYnBxX3NlcV9zdG9wLAorCS5zaG93ID0gYnBxX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBicHFfaW5mb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmYnBxX3NlcW9wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJwcV9pbmZvX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBicHFfaW5mb19vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCitzdGF0aWMgdm9pZCBicHFfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYnBxX3htaXQ7CisJZGV2LT5vcGVuCSAgICAgPSBicHFfb3BlbjsKKwlkZXYtPnN0b3AJICAgICA9IGJwcV9jbG9zZTsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGJwcV9zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5nZXRfc3RhdHMJICAgICA9IGJwcV9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bAkgICAgID0gYnBxX2lvY3RsOworCWRldi0+ZGVzdHJ1Y3RvcgkgICAgID0gZnJlZV9uZXRkZXY7CisKKwltZW1jcHkoZGV2LT5icm9hZGNhc3QsIGF4MjVfYmNhc3QsIEFYMjVfQUREUl9MRU4pOworCW1lbWNweShkZXYtPmRldl9hZGRyLCAgYXgyNV9kZWZhZGRyLCBBWDI1X0FERFJfTEVOKTsKKworCWRldi0+ZmxhZ3MgICAgICA9IDA7CisKKyNpZiBkZWZpbmVkKENPTkZJR19BWDI1KSB8fCBkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkKKwlkZXYtPmhhcmRfaGVhZGVyICAgICA9IGF4MjVfZW5jYXBzdWxhdGU7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciAgPSBheDI1X3JlYnVpbGRfaGVhZGVyOworI2VuZGlmCisKKwlkZXYtPnR5cGUgICAgICAgICAgICA9IEFSUEhSRF9BWDI1OworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gQVgyNV9NQVhfSEVBREVSX0xFTiArIEFYMjVfQlBRX0hFQURFUl9MRU47CisJZGV2LT5tdHUgICAgICAgICAgICAgPSBBWDI1X0RFRl9QQUNMRU47CisJZGV2LT5hZGRyX2xlbiAgICAgICAgPSBBWDI1X0FERFJfTEVOOworCit9CisKKy8qCisgKglTZXR1cCBhIG5ldyBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgYnBxX25ld19kZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmVkZXYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3QgYnBxZGV2ICpicHE7CisKKwluZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgYnBxZGV2KSwgImJwcSVkIiwKKwkJCSAgIGJwcV9zZXR1cCk7CisJaWYgKCFuZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCQkKKwlicHEgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlkZXZfaG9sZChlZGV2KTsKKwlicHEtPmV0aGRldiA9IGVkZXY7CisJYnBxLT5heGRldiA9IG5kZXY7CisKKwltZW1jcHkoYnBxLT5kZXN0X2FkZHIsIGJjYXN0X2FkZHIsIHNpemVvZihicHFfZXRoX2FkZHIpKTsKKwltZW1jcHkoYnBxLT5hY3B0X2FkZHIsIGJjYXN0X2FkZHIsIHNpemVvZihicHFfZXRoX2FkZHIpKTsKKworCWVyciA9IGRldl9hbGxvY19uYW1lKG5kZXYsIG5kZXYtPm5hbWUpOworCWlmIChlcnIgPCAwKSAKKwkJZ290byBlcnJvcjsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldmljZShuZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJLyogTGlzdCBwcm90ZWN0ZWQgYnkgUlROTCAqLworCWxpc3RfYWRkX3JjdSgmYnBxLT5icHFfbGlzdCwgJmJwcV9kZXZpY2VzKTsKKwlyZXR1cm4gMDsKKworIGVycm9yOgorCWRldl9wdXQoZWRldik7CisJZnJlZV9uZXRkZXYobmRldik7CisJcmV0dXJuIGVycjsKKwkKK30KKworc3RhdGljIHZvaWQgYnBxX2ZyZWVfZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBicHFkZXYgKmJwcSA9IG5ldGRldl9wcml2KG5kZXYpOworCisJZGV2X3B1dChicHEtPmV0aGRldik7CisJbGlzdF9kZWxfcmN1KCZicHEtPmJwcV9saXN0KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKG5kZXYpOworfQorCisvKgorICoJSGFuZGxlIGRldmljZSBzdGF0dXMgY2hhbmdlcy4KKyAqLworc3RhdGljIGludCBicHFfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcyx1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXB0cjsKKworCWlmICghZGV2X2lzX2V0aGRldihkZXYpKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRERVZfVVA6CQkvKiBuZXcgZXRoZXJuZXQgZGV2aWNlIC0+IG5ldyBCUFEgaW50ZXJmYWNlICovCisJCWlmIChicHFfZ2V0X2F4MjVfZGV2KGRldikgPT0gTlVMTCkKKwkJCWJwcV9uZXdfZGV2aWNlKGRldik7CisJCWJyZWFrOworCisJY2FzZSBORVRERVZfRE9XTjoJLyogZXRoZXJuZXQgZGV2aWNlIGNsb3NlZCAtPiBjbG9zZSBCUFEgaW50ZXJmYWNlICovCisJCWlmICgoZGV2ID0gYnBxX2dldF9heDI1X2RldihkZXYpKSAhPSBOVUxMKQorCQkJZGV2X2Nsb3NlKGRldik7CisJCWJyZWFrOworCisJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoJLyogZXRoZXJuZXQgZGV2aWNlIHJlbW92ZWQgLT4gZnJlZSBCUFEgaW50ZXJmYWNlICovCisJCWlmICgoZGV2ID0gYnBxX2dldF9heDI1X2RldihkZXYpKSAhPSBOVUxMKQorCQkJYnBxX2ZyZWVfZGV2aWNlKGRldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEluaXRpYWxpemUgZHJpdmVyLiBUbyBiZSBjYWxsZWQgZnJvbSBhZl9heDI1IGlmIG5vdCBjb21waWxlZCBhcyBhCisgKiBtb2R1bGUKKyAqLworc3RhdGljIGludCBfX2luaXQgYnBxX2luaXRfZHJpdmVyKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlpZiAoIXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJicHFldGhlciIsIFNfSVJVR08sICZicHFfaW5mb19mb3BzKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJicHE6IGNhbm5vdCBjcmVhdGUgL3Byb2MvbmV0L2JwcWV0aGVyIGVudHJ5LlxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKyNlbmRpZiAgLyogQ09ORklHX1BST0NfRlMgKi8KKworCWRldl9hZGRfcGFjaygmYnBxX3BhY2tldF90eXBlKTsKKworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmYnBxX2Rldl9ub3RpZmllcik7CisKKwlwcmludGsoYmFubmVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYnBxX2NsZWFudXBfZHJpdmVyKHZvaWQpCit7CisJc3RydWN0IGJwcWRldiAqYnBxOworCisJZGV2X3JlbW92ZV9wYWNrKCZicHFfcGFja2V0X3R5cGUpOworCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmJwcV9kZXZfbm90aWZpZXIpOworCisJcHJvY19uZXRfcmVtb3ZlKCJicHFldGhlciIpOworCisJcnRubF9sb2NrKCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZicHFfZGV2aWNlcykpIHsKKwkJYnBxID0gbGlzdF9lbnRyeShicHFfZGV2aWNlcy5uZXh0LCBzdHJ1Y3QgYnBxZGV2LCBicHFfbGlzdCk7CisJCWJwcV9mcmVlX2RldmljZShicHEtPmF4ZGV2KTsKKwl9CisJcnRubF91bmxvY2soKTsKK30KKworTU9EVUxFX0FVVEhPUigiSm9lcmcgUmV1dGVyIERMMUJLRSA8anJldXRlckB5YWluYS5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVHJhbnNtaXQgYW5kIHJlY2VpdmUgQVguMjUgcGFja2V0cyBvdmVyIEV0aGVybmV0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfaW5pdChicHFfaW5pdF9kcml2ZXIpOworbW9kdWxlX2V4aXQoYnBxX2NsZWFudXBfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2RtYXNjYy5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vZG1hc2NjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyNjliNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2RtYXNjYy5jCkBAIC0wLDAgKzEsMTQ5MyBAQAorLyoKKyAqIERyaXZlciBmb3IgaGlnaC1zcGVlZCBTQ0MgYm9hcmRzICh0aG9zZSB3aXRoIERNQSBzdXBwb3J0KQorICogQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgS2xhdXMgS3VkaWVsa2EKKyAqCisgKiBTNVNDQy9ETUEgc3VwcG9ydCBieSBKYW5rbyBLb2xlem5payBTNTJISQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2luY2x1ZGUgIno4NTMwLmgiCisKKworLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcGVyIGNoYW5uZWwgKi8KKworI2RlZmluZSBOVU1fVFhfQlVGICAgICAgMgkvKiBOVU1fVFhfQlVGID49IDEgKG1pbi4gMiByZWNvbW1lbmRlZCkgKi8KKyNkZWZpbmUgTlVNX1JYX0JVRiAgICAgIDYJLyogTlVNX1JYX0JVRiA+PSAxIChtaW4uIDIgcmVjb21tZW5kZWQpICovCisjZGVmaW5lIEJVRl9TSVpFICAgICAgICAxNTc2CS8qIEJVRl9TSVpFID49IG10dSArIGhhcmRfaGVhZGVyX2xlbiAqLworCisKKy8qIENhcmRzIHN1cHBvcnRlZCAqLworCisjZGVmaW5lIEhXX1BJICAgICAgICAgICB7ICJPdHRhd2EgUEkiLCAweDMwMCwgMHgyMCwgMHgxMCwgOCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDgsIDE4NDMyMDAsIDM2ODY0MDAgfQorI2RlZmluZSBIV19QSTIgICAgICAgICAgeyAiT3R0YXdhIFBJMiIsIDB4MzAwLCAweDIwLCAweDEwLCA4LCBcCisJCQkgICAgMCwgOCwgMzY4NjQwMCwgNzM3MjgwMCB9CisjZGVmaW5lIEhXX1RXSU4gICAgICAgICB7ICJHcmFjaWxpcyBQYWNrZVR3aW4iLCAweDIwMCwgMHgxMCwgMHgxMCwgMzIsIFwKKwkJCSAgICAwLCA0LCA2MTQ0MDAwLCA2MTQ0MDAwIH0KKyNkZWZpbmUgSFdfUzUgICAgICAgICAgIHsgIlM1U0NDL0RNQSIsIDB4MjAwLCAweDEwLCAweDEwLCAzMiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA4LCA0OTE1MjAwLCA5ODMwNDAwIH0KKworI2RlZmluZSBIQVJEV0FSRSAgICAgICAgeyBIV19QSSwgSFdfUEkyLCBIV19UV0lOLCBIV19TNSB9CisKKyNkZWZpbmUgVE1SXzBfSFogICAgICAgIDI1NjAwCS8qIEZyZXF1ZW5jeSBvZiB0aW1lciAwICovCisKKyNkZWZpbmUgVFlQRV9QSSAgICAgICAgIDAKKyNkZWZpbmUgVFlQRV9QSTIgICAgICAgIDEKKyNkZWZpbmUgVFlQRV9UV0lOICAgICAgIDIKKyNkZWZpbmUgVFlQRV9TNSAgICAgICAgIDMKKyNkZWZpbmUgTlVNX1RZUEVTICAgICAgIDQKKworI2RlZmluZSBNQVhfTlVNX0RFVlMgICAgMzIKKworCisvKiBTQ0MgY2hpcHMgc3VwcG9ydGVkICovCisKKyNkZWZpbmUgWjg1MzAgICAgICAgICAgIDAKKyNkZWZpbmUgWjg1QzMwICAgICAgICAgIDEKKyNkZWZpbmUgWjg1MjMwICAgICAgICAgIDIKKworI2RlZmluZSBDSElQTkFNRVMgICAgICAgeyAiWjg1MzAiLCAiWjg1QzMwIiwgIlo4NTIzMCIgfQorCisKKy8qIEkvTyByZWdpc3RlcnMgKi8KKworLyogODUzMCByZWdpc3RlcnMgcmVsYXRpdmUgdG8gY2FyZCBiYXNlICovCisjZGVmaW5lIFNDQ0JfQ01EICAgICAgICAweDAwCisjZGVmaW5lIFNDQ0JfREFUQSAgICAgICAweDAxCisjZGVmaW5lIFNDQ0FfQ01EICAgICAgICAweDAyCisjZGVmaW5lIFNDQ0FfREFUQSAgICAgICAweDAzCisKKy8qIDgyNTMvODI1NCByZWdpc3RlcnMgcmVsYXRpdmUgdG8gY2FyZCBiYXNlICovCisjZGVmaW5lIFRNUl9DTlQwICAgICAgICAweDAwCisjZGVmaW5lIFRNUl9DTlQxICAgICAgICAweDAxCisjZGVmaW5lIFRNUl9DTlQyICAgICAgICAweDAyCisjZGVmaW5lIFRNUl9DVFJMICAgICAgICAweDAzCisKKy8qIEFkZGl0aW9uYWwgUEkvUEkyIHJlZ2lzdGVycyByZWxhdGl2ZSB0byBjYXJkIGJhc2UgKi8KKyNkZWZpbmUgUElfRFJFUV9NQVNLICAgIDB4MDQKKworLyogQWRkaXRpb25hbCBQYWNrZVR3aW4gcmVnaXN0ZXJzIHJlbGF0aXZlIHRvIGNhcmQgYmFzZSAqLworI2RlZmluZSBUV0lOX0lOVF9SRUcgICAgMHgwOAorI2RlZmluZSBUV0lOX0NMUl9UTVIxICAgMHgwOQorI2RlZmluZSBUV0lOX0NMUl9UTVIyICAgMHgwYQorI2RlZmluZSBUV0lOX1NQQVJFXzEgICAgMHgwYgorI2RlZmluZSBUV0lOX0RNQV9DRkcgICAgMHgwOAorI2RlZmluZSBUV0lOX1NFUklBTF9DRkcgMHgwOQorI2RlZmluZSBUV0lOX0RNQV9DTFJfRkYgMHgwYQorI2RlZmluZSBUV0lOX1NQQVJFXzIgICAgMHgwYgorCisKKy8qIFBhY2tlVHdpbiBJL08gcmVnaXN0ZXIgdmFsdWVzICovCisKKy8qIElOVF9SRUcgKi8KKyNkZWZpbmUgVFdJTl9TQ0NfTVNLICAgICAgIDB4MDEKKyNkZWZpbmUgVFdJTl9UTVIxX01TSyAgICAgIDB4MDIKKyNkZWZpbmUgVFdJTl9UTVIyX01TSyAgICAgIDB4MDQKKyNkZWZpbmUgVFdJTl9JTlRfTVNLICAgICAgIDB4MDcKKworLyogU0VSSUFMX0NGRyAqLworI2RlZmluZSBUV0lOX0RUUkFfT04gICAgICAgMHgwMQorI2RlZmluZSBUV0lOX0RUUkJfT04gICAgICAgMHgwMgorI2RlZmluZSBUV0lOX0VYVENMS0EgICAgICAgMHgwNAorI2RlZmluZSBUV0lOX0VYVENMS0IgICAgICAgMHgwOAorI2RlZmluZSBUV0lOX0xPT1BBX09OICAgICAgMHgxMAorI2RlZmluZSBUV0lOX0xPT1BCX09OICAgICAgMHgyMAorI2RlZmluZSBUV0lOX0VJICAgICAgICAgICAgMHg4MAorCisvKiBETUFfQ0ZHICovCisjZGVmaW5lIFRXSU5fRE1BX0hEWF9UMSAgICAweDA4CisjZGVmaW5lIFRXSU5fRE1BX0hEWF9SMSAgICAweDBhCisjZGVmaW5lIFRXSU5fRE1BX0hEWF9UMyAgICAweDE0CisjZGVmaW5lIFRXSU5fRE1BX0hEWF9SMyAgICAweDE2CisjZGVmaW5lIFRXSU5fRE1BX0ZEWF9UM1IxICAweDFiCisjZGVmaW5lIFRXSU5fRE1BX0ZEWF9UMVIzICAweDFkCisKKworLyogU3RhdHVzIHZhbHVlcyAqLworCisjZGVmaW5lIElETEUgICAgICAwCisjZGVmaW5lIFRYX0hFQUQgICAxCisjZGVmaW5lIFRYX0RBVEEgICAyCisjZGVmaW5lIFRYX1BBVVNFICAzCisjZGVmaW5lIFRYX1RBSUwgICA0CisjZGVmaW5lIFJUU19PRkYgICA1CisjZGVmaW5lIFdBSVQgICAgICA2CisjZGVmaW5lIERDRF9PTiAgICA3CisjZGVmaW5lIFJYX09OICAgICA4CisjZGVmaW5lIERDRF9PRkYgICA5CisKKworLyogSW9jdGxzICovCisKKyNkZWZpbmUgU0lPQ0dTQ0NQQVJBTSBTSU9DREVWUFJJVkFURQorI2RlZmluZSBTSU9DU1NDQ1BBUkFNIChTSU9DREVWUFJJVkFURSsxKQorCisKKy8qIERhdGEgdHlwZXMgKi8KKworc3RydWN0IHNjY19wYXJhbSB7CisJaW50IHBjbGtfaHo7CQkvKiBmcmVxdWVuY3kgb2YgQlJHIGlucHV0IChkb24ndCBjaGFuZ2UpICovCisJaW50IGJyZ190YzsJCS8qIEJSRyB0ZXJtaW5hbCBjb3VudDsgQlJHIGRpc2FibGVkIGlmIDwgMCAqLworCWludCBucnppOwkJLyogMCAobnJ6KSwgMSAobnJ6aSkgKi8KKwlpbnQgY2xvY2tzOwkJLyogc2VlIGRtYXNjY19jZmcgZG9jdW1lbnRhdGlvbiAqLworCWludCB0eGRlbGF5OwkJLyogWzEvVE1SXzBfSFpdICovCisJaW50IHR4dGltZW91dDsJCS8qIFsxL0haXSAqLworCWludCB0eHRhaWw7CQkvKiBbMS9UTVJfMF9IWl0gKi8KKwlpbnQgd2FpdHRpbWU7CQkvKiBbMS9UTVJfMF9IWl0gKi8KKwlpbnQgc2xvdHRpbWU7CQkvKiBbMS9UTVJfMF9IWl0gKi8KKwlpbnQgcGVyc2lzdDsJCS8qIDEgLi4uIDI1NiAqLworCWludCBkbWE7CQkvKiAtMSAoZGlzYWJsZSksIDAsIDEsIDMgKi8KKwlpbnQgdHhwYXVzZTsJCS8qIFsxL1RNUl8wX0haXSAqLworCWludCBydHNvZmY7CQkvKiBbMS9UTVJfMF9IWl0gKi8KKwlpbnQgZGNkb247CQkvKiBbMS9UTVJfMF9IWl0gKi8KKwlpbnQgZGNkb2ZmOwkJLyogWzEvVE1SXzBfSFpdICovCit9OworCitzdHJ1Y3Qgc2NjX2hhcmR3YXJlIHsKKwljaGFyICpuYW1lOworCWludCBpb19yZWdpb247CisJaW50IGlvX2RlbHRhOworCWludCBpb19zaXplOworCWludCBudW1fZGV2czsKKwlpbnQgc2NjX29mZnNldDsKKwlpbnQgdG1yX29mZnNldDsKKwlpbnQgdG1yX2h6OworCWludCBwY2xrX2h6OworfTsKKworc3RydWN0IHNjY19wcml2IHsKKwlpbnQgdHlwZTsKKwlpbnQgY2hpcDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBzY2NfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgY2FyZF9iYXNlLCBzY2NfY21kLCBzY2NfZGF0YTsKKwlpbnQgdG1yX2NudCwgdG1yX2N0cmwsIHRtcl9tb2RlOworCXN0cnVjdCBzY2NfcGFyYW0gcGFyYW07CisJY2hhciByeF9idWZbTlVNX1JYX0JVRl1bQlVGX1NJWkVdOworCWludCByeF9sZW5bTlVNX1JYX0JVRl07CisJaW50IHJ4X3B0cjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgcnhfd29yazsKKwlpbnQgcnhfaGVhZCwgcnhfdGFpbCwgcnhfY291bnQ7CisJaW50IHJ4X292ZXI7CisJY2hhciB0eF9idWZbTlVNX1RYX0JVRl1bQlVGX1NJWkVdOworCWludCB0eF9sZW5bTlVNX1RYX0JVRl07CisJaW50IHR4X3B0cjsKKwlpbnQgdHhfaGVhZCwgdHhfdGFpbCwgdHhfY291bnQ7CisJaW50IHN0YXRlOworCXVuc2lnbmVkIGxvbmcgdHhfc3RhcnQ7CisJaW50IHJyMDsKKwlzcGlubG9ja190ICpyZWdpc3Rlcl9sb2NrOwkvKiBQZXIgc2NjX2luZm8gKi8KKwlzcGlubG9ja190IHJpbmdfbG9jazsKK307CisKK3N0cnVjdCBzY2NfaW5mbyB7CisJaW50IGlycV91c2VkOworCWludCB0d2luX3NlcmlhbF9jZmc7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldlsyXTsKKwlzdHJ1Y3Qgc2NjX3ByaXYgcHJpdlsyXTsKKwlzdHJ1Y3Qgc2NjX2luZm8gKm5leHQ7CisJc3BpbmxvY2tfdCByZWdpc3Rlcl9sb2NrOwkvKiBQZXIgZGV2aWNlIHJlZ2lzdGVyIGxvY2sgKi8KK307CisKKworLyogRnVuY3Rpb24gZGVjbGFyYXRpb25zICovCitzdGF0aWMgaW50IHNldHVwX2FkYXB0ZXIoaW50IGNhcmRfYmFzZSwgaW50IHR5cGUsIGludCBuKSBfX2luaXQ7CisKK3N0YXRpYyB2b2lkIHdyaXRlX3NjYyhzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCByZWcsIGludCB2YWwpOworc3RhdGljIHZvaWQgd3JpdGVfc2NjX2RhdGEoc3RydWN0IHNjY19wcml2ICpwcml2LCBpbnQgdmFsLCBpbnQgZmFzdCk7CitzdGF0aWMgaW50IHJlYWRfc2NjKHN0cnVjdCBzY2NfcHJpdiAqcHJpdiwgaW50IHJlZyk7CitzdGF0aWMgaW50IHJlYWRfc2NjX2RhdGEoc3RydWN0IHNjY19wcml2ICpwcml2KTsKKworc3RhdGljIGludCBzY2Nfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2NjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzY2NfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworc3RhdGljIGludCBzY2Nfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNjY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNjY19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqc2EpOworCitzdGF0aWMgaW5saW5lIHZvaWQgdHhfb24oc3RydWN0IHNjY19wcml2ICpwcml2KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCByeF9vbihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpOworc3RhdGljIGlubGluZSB2b2lkIHJ4X29mZihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpOworc3RhdGljIHZvaWQgc3RhcnRfdGltZXIoc3RydWN0IHNjY19wcml2ICpwcml2LCBpbnQgdCwgaW50IHIxNSk7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmFuZG9tKHZvaWQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgejg1MzBfaXNyKHN0cnVjdCBzY2NfaW5mbyAqaW5mbyk7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NjX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHJ4X2lzcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpOworc3RhdGljIHZvaWQgc3BlY2lhbF9jb25kaXRpb24oc3RydWN0IHNjY19wcml2ICpwcml2LCBpbnQgcmMpOworc3RhdGljIHZvaWQgcnhfYmgodm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkIHR4X2lzcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpOworc3RhdGljIHZvaWQgZXNfaXNyKHN0cnVjdCBzY2NfcHJpdiAqcHJpdik7CitzdGF0aWMgdm9pZCB0bV9pc3Ioc3RydWN0IHNjY19wcml2ICpwcml2KTsKKworCisvKiBJbml0aWFsaXphdGlvbiB2YXJpYWJsZXMgKi8KKworc3RhdGljIGludCBpb1tNQVhfTlVNX0RFVlNdIF9faW5pdGRhdGEgPSB7IDAsIH07CisKKy8qIEJld2FyZSEgaHdbXSBpcyBhbHNvIHVzZWQgaW4gY2xlYW51cF9tb2R1bGUoKS4gKi8KK3N0YXRpYyBzdHJ1Y3Qgc2NjX2hhcmR3YXJlIGh3W05VTV9UWVBFU10gX19pbml0ZGF0YV9vcl9tb2R1bGUgPSBIQVJEV0FSRTsKK3N0YXRpYyBjaGFyIGF4MjVfYnJvYWRjYXN0WzddIF9faW5pdGRhdGEgPQorICAgIHsgJ1EnIDw8IDEsICdTJyA8PCAxLCAnVCcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnICcgPDwgMSwKKycwJyA8PCAxIH07CitzdGF0aWMgY2hhciBheDI1X3Rlc3RbN10gX19pbml0ZGF0YSA9CisgICAgeyAnTCcgPDwgMSwgJ0knIDw8IDEsICdOJyA8PCAxLCAnVScgPDwgMSwgJ1gnIDw8IDEsICcgJyA8PCAxLAorJzEnIDw8IDEgfTsKKworCisvKiBHbG9iYWwgdmFyaWFibGVzICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2NjX2luZm8gKmZpcnN0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZDsKKworCitNT0RVTEVfQVVUSE9SKCJLbGF1cyBLdWRpZWxrYSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIGhpZ2gtc3BlZWQgU0NDIGJvYXJkcyIpOworTU9EVUxFX1BBUk0oaW8sICIxLSIgX19NT0RVTEVfU1RSSU5HKE1BWF9OVU1fREVWUykgImkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHZvaWQgX19leGl0IGRtYXNjY19leGl0KHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IHNjY19pbmZvICppbmZvOworCisJd2hpbGUgKGZpcnN0KSB7CisJCWluZm8gPSBmaXJzdDsKKworCQkvKiBVbnJlZ2lzdGVyIGRldmljZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGluZm8tPmRldltpXSk7CisKKwkJLyogUmVzZXQgYm9hcmQgKi8KKwkJaWYgKGluZm8tPnByaXZbMF0udHlwZSA9PSBUWVBFX1RXSU4pCisJCQlvdXRiKDAsIGluZm8tPmRldlswXS0+YmFzZV9hZGRyICsgVFdJTl9TRVJJQUxfQ0ZHKTsKKwkJd3JpdGVfc2NjKCZpbmZvLT5wcml2WzBdLCBSOSwgRkhXUkVTKTsKKwkJcmVsZWFzZV9yZWdpb24oaW5mby0+ZGV2WzBdLT5iYXNlX2FkZHIsCisJCQkgICAgICAgaHdbaW5mby0+cHJpdlswXS50eXBlXS5pb19zaXplKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJZnJlZV9uZXRkZXYoaW5mby0+ZGV2W2ldKTsKKworCQkvKiBGcmVlIG1lbW9yeSAqLworCQlmaXJzdCA9IGluZm8tPm5leHQ7CisJCWtmcmVlKGluZm8pOworCX0KK30KKworI2lmbmRlZiBNT0RVTEUKK3ZvaWQgX19pbml0IGRtYXNjY19zZXR1cChjaGFyICpzdHIsIGludCAqaW50cykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0RFVlMgJiYgaSA8IGludHNbMF07IGkrKykKKwkJaW9baV0gPSBpbnRzW2kgKyAxXTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBkbWFzY2NfaW5pdCh2b2lkKQoreworCWludCBoLCBpLCBqLCBuOworCWludCBiYXNlW01BWF9OVU1fREVWU10sIHRjbWRbTUFYX05VTV9ERVZTXSwgdDBbTUFYX05VTV9ERVZTXSwKKwkgICAgdDFbTUFYX05VTV9ERVZTXTsKKwl1bnNpZ25lZCB0X3ZhbDsKKwl1bnNpZ25lZCBsb25nIHRpbWUsIHN0YXJ0W01BWF9OVU1fREVWU10sIGRlbGF5W01BWF9OVU1fREVWU10sCisJICAgIGNvdW50aW5nW01BWF9OVU1fREVWU107CisKKwkvKiBJbml0aWFsaXplIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yICovCisJcmFuZCA9IGppZmZpZXM7CisJLyogQ2FyZHMgZm91bmQgPSAwICovCisJbiA9IDA7CisJLyogV2FybmluZyBtZXNzYWdlICovCisJaWYgKCFpb1swXSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZG1hc2NjOiBhdXRvcHJvYmluZyAoZGFuZ2Vyb3VzKVxuIik7CisKKwkvKiBSdW4gYXV0b2RldGVjdGlvbiBmb3IgZWFjaCBjYXJkIHR5cGUgKi8KKwlmb3IgKGggPSAwOyBoIDwgTlVNX1RZUEVTOyBoKyspIHsKKworCQlpZiAoaW9bMF0pIHsKKwkJCS8qIFVzZXItc3BlY2lmaWVkIEkvTyBhZGRyZXNzIHJlZ2lvbnMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBod1toXS5udW1fZGV2czsgaSsrKQorCQkJCWJhc2VbaV0gPSAwOworCQkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fREVWUyAmJiBpb1tpXTsgaSsrKSB7CisJCQkJaiA9IChpb1tpXSAtCisJCQkJICAgICBod1toXS5pb19yZWdpb24pIC8gaHdbaF0uaW9fZGVsdGE7CisJCQkJaWYgKGogPj0gMCAmJiBqIDwgaHdbaF0ubnVtX2RldnMKKwkJCQkgICAgJiYgaHdbaF0uaW9fcmVnaW9uICsKKwkJCQkgICAgaiAqIGh3W2hdLmlvX2RlbHRhID09IGlvW2ldKSB7CisJCQkJCWJhc2Vbal0gPSBpb1tpXTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBEZWZhdWx0IEkvTyBhZGRyZXNzIHJlZ2lvbnMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBod1toXS5udW1fZGV2czsgaSsrKSB7CisJCQkJYmFzZVtpXSA9CisJCQkJICAgIGh3W2hdLmlvX3JlZ2lvbiArIGkgKiBod1toXS5pb19kZWx0YTsKKwkJCX0KKwkJfQorCisJCS8qIENoZWNrIHZhbGlkIEkvTyBhZGRyZXNzIHJlZ2lvbnMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGh3W2hdLm51bV9kZXZzOyBpKyspCisJCQlpZiAoYmFzZVtpXSkgeworCQkJCWlmICghcmVxdWVzdF9yZWdpb24KKwkJCQkgICAgKGJhc2VbaV0sIGh3W2hdLmlvX3NpemUsICJkbWFzY2MiKSkKKwkJCQkJYmFzZVtpXSA9IDA7CisJCQkJZWxzZSB7CisJCQkJCXRjbWRbaV0gPQorCQkJCQkgICAgYmFzZVtpXSArIGh3W2hdLnRtcl9vZmZzZXQgKworCQkJCQkgICAgVE1SX0NUUkw7CisJCQkJCXQwW2ldID0KKwkJCQkJICAgIGJhc2VbaV0gKyBod1toXS50bXJfb2Zmc2V0ICsKKwkJCQkJICAgIFRNUl9DTlQwOworCQkJCQl0MVtpXSA9CisJCQkJCSAgICBiYXNlW2ldICsgaHdbaF0udG1yX29mZnNldCArCisJCQkJCSAgICBUTVJfQ05UMTsKKwkJCQl9CisJCQl9CisKKwkJLyogU3RhcnQgdGltZXJzICovCisJCWZvciAoaSA9IDA7IGkgPCBod1toXS5udW1fZGV2czsgaSsrKQorCQkJaWYgKGJhc2VbaV0pIHsKKwkJCQkvKiBUaW1lciAwOiBMU0IrTVNCLCBNb2RlIDMsIFRNUl8wX0haICovCisJCQkJb3V0YigweDM2LCB0Y21kW2ldKTsKKwkJCQlvdXRiKChod1toXS50bXJfaHogLyBUTVJfMF9IWikgJiAweEZGLAorCQkJCSAgICAgdDBbaV0pOworCQkJCW91dGIoKGh3W2hdLnRtcl9oeiAvIFRNUl8wX0haKSA+PiA4LAorCQkJCSAgICAgdDBbaV0pOworCQkJCS8qIFRpbWVyIDE6IExTQitNU0IsIE1vZGUgMCwgSFovMTAgKi8KKwkJCQlvdXRiKDB4NzAsIHRjbWRbaV0pOworCQkJCW91dGIoKFRNUl8wX0haIC8gSFogKiAxMCkgJiAweEZGLCB0MVtpXSk7CisJCQkJb3V0YigoVE1SXzBfSFogLyBIWiAqIDEwKSA+PiA4LCB0MVtpXSk7CisJCQkJc3RhcnRbaV0gPSBqaWZmaWVzOworCQkJCWRlbGF5W2ldID0gMDsKKwkJCQljb3VudGluZ1tpXSA9IDE7CisJCQkJLyogVGltZXIgMjogTFNCK01TQiwgTW9kZSAwICovCisJCQkJb3V0YigweGIwLCB0Y21kW2ldKTsKKwkJCX0KKwkJdGltZSA9IGppZmZpZXM7CisJCS8qIFdhaXQgdW50aWwgY291bnRlciByZWdpc3RlcnMgYXJlIGxvYWRlZCAqLworCQl1ZGVsYXkoMjAwMDAwMCAvIFRNUl8wX0haKTsKKworCQkvKiBUaW1pbmcgbG9vcCAqLworCQl3aGlsZSAoamlmZmllcyAtIHRpbWUgPCAxMykgeworCQkJZm9yIChpID0gMDsgaSA8IGh3W2hdLm51bV9kZXZzOyBpKyspCisJCQkJaWYgKGJhc2VbaV0gJiYgY291bnRpbmdbaV0pIHsKKwkJCQkJLyogUmVhZCBiYWNrIFRpbWVyIDE6IGxhdGNoOyByZWFkIExTQjsgcmVhZCBNU0IgKi8KKwkJCQkJb3V0YigweDQwLCB0Y21kW2ldKTsKKwkJCQkJdF92YWwgPQorCQkJCQkgICAgaW5iKHQxW2ldKSArIChpbmIodDFbaV0pIDw8IDgpOworCQkJCQkvKiBBbHNvIGNoZWNrIHdoZXRoZXIgY291bnRlciBkaWQgd3JhcCAqLworCQkJCQlpZiAodF92YWwgPT0gMAorCQkJCQkgICAgfHwgdF92YWwgPiBUTVJfMF9IWiAvIEhaICogMTApCisJCQkJCQljb3VudGluZ1tpXSA9IDA7CisJCQkJCWRlbGF5W2ldID0gamlmZmllcyAtIHN0YXJ0W2ldOworCQkJCX0KKwkJfQorCisJCS8qIEV2YWx1YXRlIG1lYXN1cmVtZW50cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgaHdbaF0ubnVtX2RldnM7IGkrKykKKwkJCWlmIChiYXNlW2ldKSB7CisJCQkJaWYgKChkZWxheVtpXSA+PSA5ICYmIGRlbGF5W2ldIDw9IDExKSAmJgorCQkJCSAgICAvKiBPaywgd2UgaGF2ZSBmb3VuZCBhbiBhZGFwdGVyICovCisJCQkJICAgIChzZXR1cF9hZGFwdGVyKGJhc2VbaV0sIGgsIG4pID09IDApKQorCQkJCQluKys7CisJCQkJZWxzZQorCQkJCQlyZWxlYXNlX3JlZ2lvbihiYXNlW2ldLAorCQkJCQkJICAgICAgIGh3W2hdLmlvX3NpemUpOworCQkJfQorCisJfQkJCS8qIE5VTV9UWVBFUyAqLworCisJLyogSWYgYW55IGFkYXB0ZXIgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCwgcmV0dXJuIG9rICovCisJaWYgKG4pCisJCXJldHVybiAwOworCisJLyogSWYgbm8gYWRhcHRlciBmb3VuZCwgcmV0dXJuIGVycm9yICovCisJcHJpbnRrKEtFUk5fSU5GTyAiZG1hc2NjOiBubyBhZGFwdGVycyBmb3VuZFxuIik7CisJcmV0dXJuIC1FSU87Cit9CisKK21vZHVsZV9pbml0KGRtYXNjY19pbml0KTsKK21vZHVsZV9leGl0KGRtYXNjY19leGl0KTsKKworc3RhdGljIHZvaWQgZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGV2LT50eXBlID0gQVJQSFJEX0FYMjU7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSA3MzsKKwlkZXYtPm10dSA9IDE1MDA7CisJZGV2LT5hZGRyX2xlbiA9IDc7CisJZGV2LT50eF9xdWV1ZV9sZW4gPSA2NDsKKwltZW1jcHkoZGV2LT5icm9hZGNhc3QsIGF4MjVfYnJvYWRjYXN0LCA3KTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYXgyNV90ZXN0LCA3KTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2V0dXBfYWRhcHRlcihpbnQgY2FyZF9iYXNlLCBpbnQgdHlwZSwgaW50IG4pCit7CisJaW50IGksIGlycSwgY2hpcDsKKwlzdHJ1Y3Qgc2NjX2luZm8gKmluZm87CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc2NjX3ByaXYgKnByaXY7CisJdW5zaWduZWQgbG9uZyB0aW1lOworCXVuc2lnbmVkIGludCBpcnFzOworCWludCB0bXJfYmFzZSA9IGNhcmRfYmFzZSArIGh3W3R5cGVdLnRtcl9vZmZzZXQ7CisJaW50IHNjY19iYXNlID0gY2FyZF9iYXNlICsgaHdbdHlwZV0uc2NjX29mZnNldDsKKwljaGFyICpjaGlwbmFtZXNbXSA9IENISVBOQU1FUzsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSAqLworCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NjX2luZm8pLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCFpbmZvKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hc2NjOiAiCisJCSAgICAgICAiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgJXMgYXQgJSMzeFxuIiwKKwkJICAgICAgIGh3W3R5cGVdLm5hbWUsIGNhcmRfYmFzZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEluaXRpYWxpemUgd2hhdCBpcyBuZWNlc3NhcnkgZm9yIHdyaXRlX3NjYyBhbmQgd3JpdGVfc2NjX2RhdGEgKi8KKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBzY2NfaW5mbykpOworCisJaW5mby0+ZGV2WzBdID0gYWxsb2NfbmV0ZGV2KDAsICIiLCBkZXZfc2V0dXApOworCWlmICghaW5mby0+ZGV2WzBdKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hc2NjOiAiCisJCSAgICAgICAiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgJXMgYXQgJSMzeFxuIiwKKwkJICAgICAgIGh3W3R5cGVdLm5hbWUsIGNhcmRfYmFzZSk7CisJCWdvdG8gb3V0MTsKKwl9CisKKwlpbmZvLT5kZXZbMV0gPSBhbGxvY19uZXRkZXYoMCwgIiIsIGRldl9zZXR1cCk7CisJaWYgKCFpbmZvLT5kZXZbMV0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzY2M6ICIKKwkJICAgICAgICJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciAlcyBhdCAlIzN4XG4iLAorCQkgICAgICAgaHdbdHlwZV0ubmFtZSwgY2FyZF9iYXNlKTsKKwkJZ290byBvdXQyOworCX0KKwlzcGluX2xvY2tfaW5pdCgmaW5mby0+cmVnaXN0ZXJfbG9jayk7CisKKwlwcml2ID0gJmluZm8tPnByaXZbMF07CisJcHJpdi0+dHlwZSA9IHR5cGU7CisJcHJpdi0+Y2FyZF9iYXNlID0gY2FyZF9iYXNlOworCXByaXYtPnNjY19jbWQgPSBzY2NfYmFzZSArIFNDQ0FfQ01EOworCXByaXYtPnNjY19kYXRhID0gc2NjX2Jhc2UgKyBTQ0NBX0RBVEE7CisJcHJpdi0+cmVnaXN0ZXJfbG9jayA9ICZpbmZvLT5yZWdpc3Rlcl9sb2NrOworCisJLyogUmVzZXQgU0NDICovCisJd3JpdGVfc2NjKHByaXYsIFI5LCBGSFdSRVMgfCBNSUUgfCBOVik7CisKKwkvKiBEZXRlcm1pbmUgdHlwZSBvZiBjaGlwIGJ5IGVuYWJsaW5nIFNETEMvSERMQyBlbmhhbmNlbWVudHMgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjE1LCBTSERMQ0UpOworCWlmICghcmVhZF9zY2MocHJpdiwgUjE1KSkgeworCQkvKiBXUjcnIG5vdCBwcmVzZW50LiBUaGlzIGlzIGFuIG9yZGluYXJ5IFo4NTMwIFNDQy4gKi8KKwkJY2hpcCA9IFo4NTMwOworCX0gZWxzZSB7CisJCS8qIFB1dCBvbmUgY2hhcmFjdGVyIGluIFRYIEZJRk8gKi8KKwkJd3JpdGVfc2NjX2RhdGEocHJpdiwgMCwgMCk7CisJCWlmIChyZWFkX3NjYyhwcml2LCBSMCkgJiBUeF9CVUZfRU1QKSB7CisJCQkvKiBUWCBGSUZPIG5vdCBmdWxsLiBUaGlzIGlzIGEgWjg1MjMwIEVTQ0Mgd2l0aCBhIDQtYnl0ZSBGSUZPLiAqLworCQkJY2hpcCA9IFo4NTIzMDsKKwkJfSBlbHNlIHsKKwkJCS8qIFRYIEZJRk8gZnVsbC4gVGhpcyBpcyBhIFo4NUMzMCBTQ0Mgd2l0aCBhIDEtYnl0ZSBGSUZPLiAqLworCQkJY2hpcCA9IFo4NUMzMDsKKwkJfQorCX0KKwl3cml0ZV9zY2MocHJpdiwgUjE1LCAwKTsKKworCS8qIFN0YXJ0IElSUSBhdXRvLWRldGVjdGlvbiAqLworCWlycXMgPSBwcm9iZV9pcnFfb24oKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJaWYgKHR5cGUgPT0gVFlQRV9UV0lOKSB7CisJCW91dGIoMCwgY2FyZF9iYXNlICsgVFdJTl9ETUFfQ0ZHKTsKKwkJaW5iKGNhcmRfYmFzZSArIFRXSU5fQ0xSX1RNUjEpOworCQlpbmIoY2FyZF9iYXNlICsgVFdJTl9DTFJfVE1SMik7CisJCWluZm8tPnR3aW5fc2VyaWFsX2NmZyA9IFRXSU5fRUk7CisJCW91dGIoaW5mby0+dHdpbl9zZXJpYWxfY2ZnLCBjYXJkX2Jhc2UgKyBUV0lOX1NFUklBTF9DRkcpOworCX0gZWxzZSB7CisJCXdyaXRlX3NjYyhwcml2LCBSMTUsIENUU0lFKTsKKwkJd3JpdGVfc2NjKHByaXYsIFIwLCBSRVNfRVhUX0lOVCk7CisJCXdyaXRlX3NjYyhwcml2LCBSMSwgRVhUX0lOVF9FTkFCKTsKKwl9CisKKwkvKiBTdGFydCB0aW1lciAqLworCW91dGIoMSwgdG1yX2Jhc2UgKyBUTVJfQ05UMSk7CisJb3V0YigwLCB0bXJfYmFzZSArIFRNUl9DTlQxKTsKKworCS8qIFdhaXQgYW5kIGRldGVjdCBJUlEgKi8KKwl0aW1lID0gamlmZmllczsKKwl3aGlsZSAoamlmZmllcyAtIHRpbWUgPCAyICsgSFogLyBUTVJfMF9IWik7CisJaXJxID0gcHJvYmVfaXJxX29mZihpcnFzKTsKKworCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0LCBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlpZiAodHlwZSA9PSBUWVBFX1RXSU4pIHsKKwkJaW5iKGNhcmRfYmFzZSArIFRXSU5fQ0xSX1RNUjEpOworCX0gZWxzZSB7CisJCXdyaXRlX3NjYyhwcml2LCBSMSwgMCk7CisJCXdyaXRlX3NjYyhwcml2LCBSMTUsIDApOworCQl3cml0ZV9zY2MocHJpdiwgUjAsIFJFU19FWFRfSU5UKTsKKwl9CisKKwlpZiAoaXJxIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiZG1hc2NjOiBjb3VsZCBub3QgZmluZCBpcnEgb2YgJXMgYXQgJSMzeCAoaXJxPSVkKVxuIiwKKwkJICAgICAgIGh3W3R5cGVdLm5hbWUsIGNhcmRfYmFzZSwgaXJxKTsKKwkJZ290byBvdXQzOworCX0KKworCS8qIFNldCB1cCBkYXRhIHN0cnVjdHVyZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWRldiA9IGluZm8tPmRldltpXTsKKwkJcHJpdiA9ICZpbmZvLT5wcml2W2ldOworCQlwcml2LT50eXBlID0gdHlwZTsKKwkJcHJpdi0+Y2hpcCA9IGNoaXA7CisJCXByaXYtPmRldiA9IGRldjsKKwkJcHJpdi0+aW5mbyA9IGluZm87CisJCXByaXYtPmNoYW5uZWwgPSBpOworCQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cmluZ19sb2NrKTsKKwkJcHJpdi0+cmVnaXN0ZXJfbG9jayA9ICZpbmZvLT5yZWdpc3Rlcl9sb2NrOworCQlwcml2LT5jYXJkX2Jhc2UgPSBjYXJkX2Jhc2U7CisJCXByaXYtPnNjY19jbWQgPSBzY2NfYmFzZSArIChpID8gU0NDQl9DTUQgOiBTQ0NBX0NNRCk7CisJCXByaXYtPnNjY19kYXRhID0gc2NjX2Jhc2UgKyAoaSA/IFNDQ0JfREFUQSA6IFNDQ0FfREFUQSk7CisJCXByaXYtPnRtcl9jbnQgPSB0bXJfYmFzZSArIChpID8gVE1SX0NOVDIgOiBUTVJfQ05UMSk7CisJCXByaXYtPnRtcl9jdHJsID0gdG1yX2Jhc2UgKyBUTVJfQ1RSTDsKKwkJcHJpdi0+dG1yX21vZGUgPSBpID8gMHhiMCA6IDB4NzA7CisJCXByaXYtPnBhcmFtLnBjbGtfaHogPSBod1t0eXBlXS5wY2xrX2h6OworCQlwcml2LT5wYXJhbS5icmdfdGMgPSAtMTsKKwkJcHJpdi0+cGFyYW0uY2xvY2tzID0gVENUUnhDUCB8IFJDUlR4Q1A7CisJCXByaXYtPnBhcmFtLnBlcnNpc3QgPSAyNTY7CisJCXByaXYtPnBhcmFtLmRtYSA9IC0xOworCQlJTklUX1dPUksoJnByaXYtPnJ4X3dvcmssIHJ4X2JoLCBwcml2KTsKKwkJZGV2LT5wcml2ID0gcHJpdjsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJkbWFzY2MlaSIsIDIgKiBuICsgaSk7CisJCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBjYXJkX2Jhc2U7CisJCWRldi0+aXJxID0gaXJxOworCQlkZXYtPm9wZW4gPSBzY2Nfb3BlbjsKKwkJZGV2LT5zdG9wID0gc2NjX2Nsb3NlOworCQlkZXYtPmRvX2lvY3RsID0gc2NjX2lvY3RsOworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHNjY19zZW5kX3BhY2tldDsKKwkJZGV2LT5nZXRfc3RhdHMgPSBzY2NfZ2V0X3N0YXRzOworCQlkZXYtPmhhcmRfaGVhZGVyID0gYXgyNV9lbmNhcHN1bGF0ZTsKKwkJZGV2LT5yZWJ1aWxkX2hlYWRlciA9IGF4MjVfcmVidWlsZF9oZWFkZXI7CisJCWRldi0+c2V0X21hY19hZGRyZXNzID0gc2NjX3NldF9tYWNfYWRkcmVzczsKKwl9CisJaWYgKHJlZ2lzdGVyX25ldGRldihpbmZvLT5kZXZbMF0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hc2NjOiBjb3VsZCBub3QgcmVnaXN0ZXIgJXNcbiIsCisJCSAgICAgICBpbmZvLT5kZXZbMF0tPm5hbWUpOworCQlnb3RvIG91dDM7CisJfQorCWlmIChyZWdpc3Rlcl9uZXRkZXYoaW5mby0+ZGV2WzFdKSkgeworCQlwcmludGsoS0VSTl9FUlIgImRtYXNjYzogY291bGQgbm90IHJlZ2lzdGVyICVzXG4iLAorCQkgICAgICAgaW5mby0+ZGV2WzFdLT5uYW1lKTsKKwkJZ290byBvdXQ0OworCX0KKworCisJaW5mby0+bmV4dCA9IGZpcnN0OworCWZpcnN0ID0gaW5mbzsKKwlwcmludGsoS0VSTl9JTkZPICJkbWFzY2M6IGZvdW5kICVzICglcykgYXQgJSMzeCwgaXJxICVkXG4iLAorCSAgICAgICBod1t0eXBlXS5uYW1lLCBjaGlwbmFtZXNbY2hpcF0sIGNhcmRfYmFzZSwgaXJxKTsKKwlyZXR1cm4gMDsKKworICAgICAgb3V0NDoKKwl1bnJlZ2lzdGVyX25ldGRldihpbmZvLT5kZXZbMF0pOworICAgICAgb3V0MzoKKwlpZiAoaW5mby0+cHJpdlswXS50eXBlID09IFRZUEVfVFdJTikKKwkJb3V0YigwLCBpbmZvLT5kZXZbMF0tPmJhc2VfYWRkciArIFRXSU5fU0VSSUFMX0NGRyk7CisJd3JpdGVfc2NjKCZpbmZvLT5wcml2WzBdLCBSOSwgRkhXUkVTKTsKKwlmcmVlX25ldGRldihpbmZvLT5kZXZbMV0pOworICAgICAgb3V0MjoKKwlmcmVlX25ldGRldihpbmZvLT5kZXZbMF0pOworICAgICAgb3V0MToKKwlrZnJlZShpbmZvKTsKKyAgICAgIG91dDoKKwlyZXR1cm4gLTE7Cit9CisKKworLyogRHJpdmVyIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZCB3cml0ZV9zY2Moc3RydWN0IHNjY19wcml2ICpwcml2LCBpbnQgcmVnLCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3dpdGNoIChwcml2LT50eXBlKSB7CisJY2FzZSBUWVBFX1M1OgorCQlpZiAocmVnKQorCQkJb3V0YihyZWcsIHByaXYtPnNjY19jbWQpOworCQlvdXRiKHZhbCwgcHJpdi0+c2NjX2NtZCk7CisJCXJldHVybjsKKwljYXNlIFRZUEVfVFdJTjoKKwkJaWYgKHJlZykKKwkJCW91dGJfcChyZWcsIHByaXYtPnNjY19jbWQpOworCQlvdXRiX3AodmFsLCBwcml2LT5zY2NfY21kKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCXNwaW5fbG9ja19pcnFzYXZlKHByaXYtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwkJb3V0Yl9wKDAsIHByaXYtPmNhcmRfYmFzZSArIFBJX0RSRVFfTUFTSyk7CisJCWlmIChyZWcpCisJCQlvdXRiX3AocmVnLCBwcml2LT5zY2NfY21kKTsKKwkJb3V0Yl9wKHZhbCwgcHJpdi0+c2NjX2NtZCk7CisJCW91dGIoMSwgcHJpdi0+Y2FyZF9iYXNlICsgUElfRFJFUV9NQVNLKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwcml2LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgd3JpdGVfc2NjX2RhdGEoc3RydWN0IHNjY19wcml2ICpwcml2LCBpbnQgdmFsLCBpbnQgZmFzdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN3aXRjaCAocHJpdi0+dHlwZSkgeworCWNhc2UgVFlQRV9TNToKKwkJb3V0Yih2YWwsIHByaXYtPnNjY19kYXRhKTsKKwkJcmV0dXJuOworCWNhc2UgVFlQRV9UV0lOOgorCQlvdXRiX3AodmFsLCBwcml2LT5zY2NfZGF0YSk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlpZiAoZmFzdCkKKwkJCW91dGJfcCh2YWwsIHByaXYtPnNjY19kYXRhKTsKKwkJZWxzZSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZShwcml2LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisJCQlvdXRiX3AoMCwgcHJpdi0+Y2FyZF9iYXNlICsgUElfRFJFUV9NQVNLKTsKKwkJCW91dGJfcCh2YWwsIHByaXYtPnNjY19kYXRhKTsKKwkJCW91dGIoMSwgcHJpdi0+Y2FyZF9iYXNlICsgUElfRFJFUV9NQVNLKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocHJpdi0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOworCQl9CisJCXJldHVybjsKKwl9Cit9CisKKworc3RhdGljIGludCByZWFkX3NjYyhzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCByZWcpCit7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3dpdGNoIChwcml2LT50eXBlKSB7CisJY2FzZSBUWVBFX1M1OgorCQlpZiAocmVnKQorCQkJb3V0YihyZWcsIHByaXYtPnNjY19jbWQpOworCQlyZXR1cm4gaW5iKHByaXYtPnNjY19jbWQpOworCWNhc2UgVFlQRV9UV0lOOgorCQlpZiAocmVnKQorCQkJb3V0Yl9wKHJlZywgcHJpdi0+c2NjX2NtZCk7CisJCXJldHVybiBpbmJfcChwcml2LT5zY2NfY21kKTsKKwlkZWZhdWx0OgorCQlzcGluX2xvY2tfaXJxc2F2ZShwcml2LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisJCW91dGJfcCgwLCBwcml2LT5jYXJkX2Jhc2UgKyBQSV9EUkVRX01BU0spOworCQlpZiAocmVnKQorCQkJb3V0Yl9wKHJlZywgcHJpdi0+c2NjX2NtZCk7CisJCXJjID0gaW5iX3AocHJpdi0+c2NjX2NtZCk7CisJCW91dGIoMSwgcHJpdi0+Y2FyZF9iYXNlICsgUElfRFJFUV9NQVNLKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwcml2LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisJCXJldHVybiByYzsKKwl9Cit9CisKKworc3RhdGljIGludCByZWFkX3NjY19kYXRhKHN0cnVjdCBzY2NfcHJpdiAqcHJpdikKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzd2l0Y2ggKHByaXYtPnR5cGUpIHsKKwljYXNlIFRZUEVfUzU6CisJCXJldHVybiBpbmIocHJpdi0+c2NjX2RhdGEpOworCWNhc2UgVFlQRV9UV0lOOgorCQlyZXR1cm4gaW5iX3AocHJpdi0+c2NjX2RhdGEpOworCWRlZmF1bHQ6CisJCXNwaW5fbG9ja19pcnFzYXZlKHByaXYtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwkJb3V0Yl9wKDAsIHByaXYtPmNhcmRfYmFzZSArIFBJX0RSRVFfTUFTSyk7CisJCXJjID0gaW5iX3AocHJpdi0+c2NjX2RhdGEpOworCQlvdXRiKDEsIHByaXYtPmNhcmRfYmFzZSArIFBJX0RSRVFfTUFTSyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocHJpdi0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmM7CisJfQorfQorCisKK3N0YXRpYyBpbnQgc2NjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJc3RydWN0IHNjY19pbmZvICppbmZvID0gcHJpdi0+aW5mbzsKKwlpbnQgY2FyZF9iYXNlID0gcHJpdi0+Y2FyZF9iYXNlOworCisJLyogUmVxdWVzdCBJUlEgaWYgbm90IGFscmVhZHkgdXNlZCBieSBvdGhlciBjaGFubmVsICovCisJaWYgKCFpbmZvLT5pcnFfdXNlZCkgeworCQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIHNjY19pc3IsIDAsICJkbWFzY2MiLCBpbmZvKSkgeworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisJaW5mby0+aXJxX3VzZWQrKzsKKworCS8qIFJlcXVlc3QgRE1BIGlmIHJlcXVpcmVkICovCisJaWYgKHByaXYtPnBhcmFtLmRtYSA+PSAwKSB7CisJCWlmIChyZXF1ZXN0X2RtYShwcml2LT5wYXJhbS5kbWEsICJkbWFzY2MiKSkgeworCQkJaWYgKC0taW5mby0+aXJxX3VzZWQgPT0gMCkKKwkJCQlmcmVlX2lycShkZXYtPmlycSwgaW5mbyk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCQkJY2xlYXJfZG1hX2ZmKHByaXYtPnBhcmFtLmRtYSk7CisJCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkJfQorCX0KKworCS8qIEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzICovCisJcHJpdi0+cnhfcHRyID0gMDsKKwlwcml2LT5yeF9vdmVyID0gMDsKKwlwcml2LT5yeF9oZWFkID0gcHJpdi0+cnhfdGFpbCA9IHByaXYtPnJ4X2NvdW50ID0gMDsKKwlwcml2LT5zdGF0ZSA9IElETEU7CisJcHJpdi0+dHhfaGVhZCA9IHByaXYtPnR4X3RhaWwgPSBwcml2LT50eF9jb3VudCA9IDA7CisJcHJpdi0+dHhfcHRyID0gMDsKKworCS8qIFJlc2V0IGNoYW5uZWwgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjksIChwcml2LT5jaGFubmVsID8gQ0hSQiA6IENIUkEpIHwgTUlFIHwgTlYpOworCS8qIFgxIGNsb2NrLCBTRExDIG1vZGUgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjQsIFNETEMgfCBYMUNMSyk7CisJLyogRE1BICovCisJd3JpdGVfc2NjKHByaXYsIFIxLCBFWFRfSU5UX0VOQUIgfCBXVF9GTl9SRFlGTik7CisJLyogOCBiaXQgUlggY2hhciwgUlggZGlzYWJsZSAqLworCXdyaXRlX3NjYyhwcml2LCBSMywgUng4KTsKKwkvKiA4IGJpdCBUWCBjaGFyLCBUWCBkaXNhYmxlICovCisJd3JpdGVfc2NjKHByaXYsIFI1LCBUeDgpOworCS8qIFNETEMgYWRkcmVzcyBmaWVsZCAqLworCXdyaXRlX3NjYyhwcml2LCBSNiwgMCk7CisJLyogU0RMQyBmbGFnICovCisJd3JpdGVfc2NjKHByaXYsIFI3LCBGTEFHKTsKKwlzd2l0Y2ggKHByaXYtPmNoaXApIHsKKwljYXNlIFo4NUMzMDoKKwkJLyogU2VsZWN0IFdSNycgKi8KKwkJd3JpdGVfc2NjKHByaXYsIFIxNSwgU0hETENFKTsKKwkJLyogQXV0byBFT00gcmVzZXQgKi8KKwkJd3JpdGVfc2NjKHByaXYsIFI3LCBBVVRPRU9NKTsKKwkJd3JpdGVfc2NjKHByaXYsIFIxNSwgMCk7CisJCWJyZWFrOworCWNhc2UgWjg1MjMwOgorCQkvKiBTZWxlY3QgV1I3JyAqLworCQl3cml0ZV9zY2MocHJpdiwgUjE1LCBTSERMQ0UpOworCQkvKiBUaGUgZm9sbG93aW5nIGJpdHMgYXJlIHNldCAoc2VlIDIuNS4yLjEpOgorCQkgICAtIEF1dG9tYXRpYyBFT00gcmVzZXQKKwkJICAgLSBJbnRlcnJ1cHQgcmVxdWVzdCBpZiBSWCBGSUZPIGlzIGhhbGYgZnVsbAorCQkgICBUaGlzIGJpdCBzaG91bGQgYmUgaWdub3JlZCBpbiBETUEgbW9kZSAoYWNjb3JkaW5nIHRvIHRoZQorCQkgICBkb2N1bWVudGF0aW9uKSwgYnV0IGFjdHVhbGx5IGlzbid0LiBUaGUgcmVjZWl2ZXIgZG9lc24ndCB3b3JrIGlmCisJCSAgIGl0IGlzIHNldC4gVGh1cywgd2UgaGF2ZSB0byBjbGVhciBpdCBpbiBETUEgbW9kZS4KKwkJICAgLSBJbnRlcnJ1cHQvRE1BIHJlcXVlc3QgaWYgVFggRklGTyBpcyBjb21wbGV0ZWx5IGVtcHR5CisJCSAgIGEpIElmIHNldCwgdGhlIEVTQ0MgYmVoYXZlcyBhcyBpZiBpdCBoYWQgbm8gVFggRklGTyAoWjg1QzMwCisJCSAgIGNvbXBhdGliaWxpdHkpLgorCQkgICBiKSBJZiBjbGVhcmVkLCBETUEgcmVxdWVzdHMgbWF5IGZvbGxvdyBlYWNoIG90aGVyIHZlcnkgcXVpY2tseSwKKwkJICAgZmlsbGluZyB1cCB0aGUgVFggRklGTy4KKwkJICAgQWR2YW50YWdlOiBUWCB3b3JrcyBldmVuIGluIGNhc2Ugb2YgaGlnaCBidXMgbGF0ZW5jeS4KKwkJICAgRGlzYWR2YW50YWdlOiBFZGdlLXRyaWdnZXJlZCBETUEgcmVxdWVzdCBjaXJjdWl0cnkgbWF5IG1pc3MKKwkJICAgYSByZXF1ZXN0LiBObyBtb3JlIGRhdGEgaXMgZGVsaXZlcmVkLCByZXN1bHRpbmcKKwkJICAgaW4gYSBUWCBGSUZPIHVuZGVycnVuLgorCQkgICBCb3RoIFBJMiBhbmQgUzVTQ0MvRE1BIHNlZW0gdG8gd29yayBmaW5lIHdpdGggVFhGSUZPRSBjbGVhcmVkLgorCQkgICBUaGUgUGFja2VUd2luIGRvZXNuJ3QuIEkgZG9uJ3Qga25vdyBhYm91dCB0aGUgUEksIGJ1dCBsZXQncworCQkgICBhc3N1bWUgaXQgYmVoYXZlcyBsaWtlIHRoZSBQSTIuCisJCSAqLworCQlpZiAocHJpdi0+cGFyYW0uZG1hID49IDApIHsKKwkJCWlmIChwcml2LT50eXBlID09IFRZUEVfVFdJTikKKwkJCQl3cml0ZV9zY2MocHJpdiwgUjcsIEFVVE9FT00gfCBUWEZJRk9FKTsKKwkJCWVsc2UKKwkJCQl3cml0ZV9zY2MocHJpdiwgUjcsIEFVVE9FT00pOworCQl9IGVsc2UgeworCQkJd3JpdGVfc2NjKHByaXYsIFI3LCBBVVRPRU9NIHwgUlhGSUZPSCk7CisJCX0KKwkJd3JpdGVfc2NjKHByaXYsIFIxNSwgMCk7CisJCWJyZWFrOworCX0KKwkvKiBQcmVzZXQgQ1JDLCBOUlooSSkgZW5jb2RpbmcgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjEwLCBDUkNQUyB8IChwcml2LT5wYXJhbS5ucnppID8gTlJaSSA6IE5SWikpOworCisJLyogQ29uZmlndXJlIGJhdWQgcmF0ZSBnZW5lcmF0b3IgKi8KKwlpZiAocHJpdi0+cGFyYW0uYnJnX3RjID49IDApIHsKKwkJLyogUHJvZ3JhbSBCUiBnZW5lcmF0b3IgKi8KKwkJd3JpdGVfc2NjKHByaXYsIFIxMiwgcHJpdi0+cGFyYW0uYnJnX3RjICYgMHhGRik7CisJCXdyaXRlX3NjYyhwcml2LCBSMTMsIChwcml2LT5wYXJhbS5icmdfdGMgPj4gOCkgJiAweEZGKTsKKwkJLyogQlJHIHNvdXJjZSA9IFNZUyBDTEs7IGVuYWJsZSBCUkc7IERUUiBSRVEgZnVuY3Rpb24gKHJlcXVpcmVkIGJ5CisJCSAgIFBhY2tlVHdpbiwgbm90IGNvbm5lY3RlZCBvbiB0aGUgUEkyKTsgc2V0IERQTEwgc291cmNlIHRvIEJSRyAqLworCQl3cml0ZV9zY2MocHJpdiwgUjE0LCBTU0JSIHwgRFRSUkVRIHwgQlJTUkMgfCBCUkVOQUJMKTsKKwkJLyogRW5hYmxlIERQTEwgKi8KKwkJd3JpdGVfc2NjKHByaXYsIFIxNCwgU0VBUkNIIHwgRFRSUkVRIHwgQlJTUkMgfCBCUkVOQUJMKTsKKwl9IGVsc2UgeworCQkvKiBEaXNhYmxlIEJSIGdlbmVyYXRvciAqLworCQl3cml0ZV9zY2MocHJpdiwgUjE0LCBEVFJSRVEgfCBCUlNSQyk7CisJfQorCisJLyogQ29uZmlndXJlIGNsb2NrcyAqLworCWlmIChwcml2LT50eXBlID09IFRZUEVfVFdJTikgeworCQkvKiBEaXNhYmxlIGV4dGVybmFsIFRYIGNsb2NrIHJlY2VpdmVyICovCisJCW91dGIoKGluZm8tPnR3aW5fc2VyaWFsX2NmZyAmPQorCQkgICAgICB+KHByaXYtPmNoYW5uZWwgPyBUV0lOX0VYVENMS0IgOiBUV0lOX0VYVENMS0EpKSwKKwkJICAgICBjYXJkX2Jhc2UgKyBUV0lOX1NFUklBTF9DRkcpOworCX0KKwl3cml0ZV9zY2MocHJpdiwgUjExLCBwcml2LT5wYXJhbS5jbG9ja3MpOworCWlmICgocHJpdi0+dHlwZSA9PSBUWVBFX1RXSU4pICYmICEocHJpdi0+cGFyYW0uY2xvY2tzICYgVFJ4Q09JKSkgeworCQkvKiBFbmFibGUgZXh0ZXJuYWwgVFggY2xvY2sgcmVjZWl2ZXIgKi8KKwkJb3V0YigoaW5mby0+dHdpbl9zZXJpYWxfY2ZnIHw9CisJCSAgICAgIChwcml2LT5jaGFubmVsID8gVFdJTl9FWFRDTEtCIDogVFdJTl9FWFRDTEtBKSksCisJCSAgICAgY2FyZF9iYXNlICsgVFdJTl9TRVJJQUxfQ0ZHKTsKKwl9CisKKwkvKiBDb25maWd1cmUgUGFja2VUd2luICovCisJaWYgKHByaXYtPnR5cGUgPT0gVFlQRV9UV0lOKSB7CisJCS8qIEFzc2VydCBEVFIsIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCW91dGIoKGluZm8tPnR3aW5fc2VyaWFsX2NmZyB8PSBUV0lOX0VJIHwKKwkJICAgICAgKHByaXYtPmNoYW5uZWwgPyBUV0lOX0RUUkJfT04gOiBUV0lOX0RUUkFfT04pKSwKKwkJICAgICBjYXJkX2Jhc2UgKyBUV0lOX1NFUklBTF9DRkcpOworCX0KKworCS8qIFJlYWQgY3VycmVudCBzdGF0dXMgKi8KKwlwcml2LT5ycjAgPSByZWFkX3NjYyhwcml2LCBSMCk7CisJLyogRW5hYmxlIERDRCBpbnRlcnJ1cHQgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjE1LCBEQ0RJRSk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzY2NfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJc3RydWN0IHNjY19pbmZvICppbmZvID0gcHJpdi0+aW5mbzsKKwlpbnQgY2FyZF9iYXNlID0gcHJpdi0+Y2FyZF9iYXNlOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKHByaXYtPnR5cGUgPT0gVFlQRV9UV0lOKSB7CisJCS8qIERyb3AgRFRSICovCisJCW91dGIoKGluZm8tPnR3aW5fc2VyaWFsX2NmZyAmPQorCQkgICAgICAocHJpdi0+Y2hhbm5lbCA/IH5UV0lOX0RUUkJfT04gOiB+VFdJTl9EVFJBX09OKSksCisJCSAgICAgY2FyZF9iYXNlICsgVFdJTl9TRVJJQUxfQ0ZHKTsKKwl9CisKKwkvKiBSZXNldCBjaGFubmVsLCBmcmVlIERNQSBhbmQgSVJRICovCisJd3JpdGVfc2NjKHByaXYsIFI5LCAocHJpdi0+Y2hhbm5lbCA/IENIUkIgOiBDSFJBKSB8IE1JRSB8IE5WKTsKKwlpZiAocHJpdi0+cGFyYW0uZG1hID49IDApIHsKKwkJaWYgKHByaXYtPnR5cGUgPT0gVFlQRV9UV0lOKQorCQkJb3V0YigwLCBjYXJkX2Jhc2UgKyBUV0lOX0RNQV9DRkcpOworCQlmcmVlX2RtYShwcml2LT5wYXJhbS5kbWEpOworCX0KKwlpZiAoLS1pbmZvLT5pcnFfdXNlZCA9PSAwKQorCQlmcmVlX2lycShkZXYtPmlycSwgaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNjY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dTQ0NQQVJBTToKKwkJaWYgKGNvcHlfdG9fdXNlcgorCQkgICAgKGlmci0+aWZyX2RhdGEsICZwcml2LT5wYXJhbSwKKwkJICAgICBzaXplb2Yoc3RydWN0IHNjY19wYXJhbSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgU0lPQ1NTQ0NQQVJBTToKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXJldHVybiAtRUFHQUlOOworCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJICAgICgmcHJpdi0+cGFyYW0sIGlmci0+aWZyX2RhdGEsCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBzY2NfcGFyYW0pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKworc3RhdGljIGludCBzY2Nfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCS8qIFRlbXBvcmFyaWx5IHN0b3AgdGhlIHNjaGVkdWxlciBmZWVkaW5nIHVzIHBhY2tldHMgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBUcmFuc2ZlciBkYXRhIHRvIERNQSBidWZmZXIgKi8KKwlpID0gcHJpdi0+dHhfaGVhZDsKKwltZW1jcHkocHJpdi0+dHhfYnVmW2ldLCBza2ItPmRhdGEgKyAxLCBza2ItPmxlbiAtIDEpOworCXByaXYtPnR4X2xlbltpXSA9IHNrYi0+bGVuIC0gMTsKKworCS8qIENsZWFyIGludGVycnVwdHMgd2hpbGUgd2UgdG91Y2ggb3VyIGNpcmN1bGFyIGJ1ZmZlcnMgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yaW5nX2xvY2ssIGZsYWdzKTsKKwkvKiBNb3ZlIHRoZSByaW5nIGJ1ZmZlcidzIGhlYWQgKi8KKwlwcml2LT50eF9oZWFkID0gKGkgKyAxKSAlIE5VTV9UWF9CVUY7CisJcHJpdi0+dHhfY291bnQrKzsKKworCS8qIElmIHdlIGp1c3QgZmlsbGVkIHVwIHRoZSBsYXN0IGJ1ZmZlciwgbGVhdmUgcXVldWUgc3RvcHBlZC4KKwkgICBUaGUgaGlnaGVyIGxheWVycyBtdXN0IHdhaXQgdW50aWwgd2UgaGF2ZSBhIERNQSBidWZmZXIKKwkgICB0byBhY2NlcHQgdGhlIGRhdGEuICovCisJaWYgKHByaXYtPnR4X2NvdW50IDwgTlVNX1RYX0JVRikKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJLyogU2V0IG5ldyBUWCBzdGF0ZSAqLworCWlmIChwcml2LT5zdGF0ZSA9PSBJRExFKSB7CisJCS8qIEFzc2VydCBSVFMsIHN0YXJ0IHRpbWVyICovCisJCXByaXYtPnN0YXRlID0gVFhfSEVBRDsKKwkJcHJpdi0+dHhfc3RhcnQgPSBqaWZmaWVzOworCQl3cml0ZV9zY2MocHJpdiwgUjUsIFR4Q1JDX0VOQUIgfCBSVFMgfCBUeEVOQUIgfCBUeDgpOworCQl3cml0ZV9zY2MocHJpdiwgUjE1LCAwKTsKKwkJc3RhcnRfdGltZXIocHJpdiwgcHJpdi0+cGFyYW0udHhkZWxheSwgMCk7CisJfQorCisJLyogVHVybiBpbnRlcnJ1cHRzIGJhY2sgb24gYW5kIGZyZWUgYnVmZmVyICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmluZ19sb2NrLCBmbGFncyk7CisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzY2NfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjY19wcml2ICpwcml2ID0gZGV2LT5wcml2OworCisJcmV0dXJuICZwcml2LT5zdGF0czsKK30KKworCitzdGF0aWMgaW50IHNjY19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqc2EpCit7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICgoc3RydWN0IHNvY2thZGRyICopIHNhKS0+c2FfZGF0YSwKKwkgICAgICAgZGV2LT5hZGRyX2xlbik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHR4X29uKHN0cnVjdCBzY2NfcHJpdiAqcHJpdikKK3sKKwlpbnQgaSwgbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHByaXYtPnBhcmFtLmRtYSA+PSAwKSB7CisJCW4gPSAocHJpdi0+Y2hpcCA9PSBaODUyMzApID8gMyA6IDE7CisJCS8qIFByb2dyYW0gRE1BIGNvbnRyb2xsZXIgKi8KKwkJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCQlzZXRfZG1hX21vZGUocHJpdi0+cGFyYW0uZG1hLCBETUFfTU9ERV9XUklURSk7CisJCXNldF9kbWFfYWRkcihwcml2LT5wYXJhbS5kbWEsCisJCQkgICAgIChpbnQpIHByaXYtPnR4X2J1Zltwcml2LT50eF90YWlsXSArIG4pOworCQlzZXRfZG1hX2NvdW50KHByaXYtPnBhcmFtLmRtYSwKKwkJCSAgICAgIHByaXYtPnR4X2xlbltwcml2LT50eF90YWlsXSAtIG4pOworCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkJLyogRW5hYmxlIFRYIHVuZGVycnVuIGludGVycnVwdCAqLworCQl3cml0ZV9zY2MocHJpdiwgUjE1LCBUeFVJRSk7CisJCS8qIENvbmZpZ3VyZSBEUkVRICovCisJCWlmIChwcml2LT50eXBlID09IFRZUEVfVFdJTikKKwkJCW91dGIoKHByaXYtPnBhcmFtLmRtYSA9PQorCQkJICAgICAgMSkgPyBUV0lOX0RNQV9IRFhfVDEgOiBUV0lOX0RNQV9IRFhfVDMsCisJCQkgICAgIHByaXYtPmNhcmRfYmFzZSArIFRXSU5fRE1BX0NGRyk7CisJCWVsc2UKKwkJCXdyaXRlX3NjYyhwcml2LCBSMSwKKwkJCQkgIEVYVF9JTlRfRU5BQiB8IFdUX0ZOX1JEWUZOIHwKKwkJCQkgIFdUX1JEWV9FTkFCKTsKKwkJLyogV3JpdGUgZmlyc3QgYnl0ZShzKSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZShwcml2LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCQl3cml0ZV9zY2NfZGF0YShwcml2LAorCQkJCSAgICAgICBwcml2LT50eF9idWZbcHJpdi0+dHhfdGFpbF1baV0sIDEpOworCQllbmFibGVfZG1hKHByaXYtPnBhcmFtLmRtYSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocHJpdi0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCXdyaXRlX3NjYyhwcml2LCBSMTUsIFR4VUlFKTsKKwkJd3JpdGVfc2NjKHByaXYsIFIxLAorCQkJICBFWFRfSU5UX0VOQUIgfCBXVF9GTl9SRFlGTiB8IFR4SU5UX0VOQUIpOworCQl0eF9pc3IocHJpdik7CisJfQorCS8qIFJlc2V0IEVPTSBsYXRjaCBpZiB3ZSBkbyBub3QgaGF2ZSB0aGUgQVVUT0VPTSBmZWF0dXJlICovCisJaWYgKHByaXYtPmNoaXAgPT0gWjg1MzApCisJCXdyaXRlX3NjYyhwcml2LCBSMCwgUkVTX0VPTV9MKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgcnhfb24oc3RydWN0IHNjY19wcml2ICpwcml2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBDbGVhciBSWCBGSUZPICovCisJd2hpbGUgKHJlYWRfc2NjKHByaXYsIFIwKSAmIFJ4X0NIX0FWKQorCQlyZWFkX3NjY19kYXRhKHByaXYpOworCXByaXYtPnJ4X292ZXIgPSAwOworCWlmIChwcml2LT5wYXJhbS5kbWEgPj0gMCkgeworCQkvKiBQcm9ncmFtIERNQSBjb250cm9sbGVyICovCisJCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwkJc2V0X2RtYV9tb2RlKHByaXYtPnBhcmFtLmRtYSwgRE1BX01PREVfUkVBRCk7CisJCXNldF9kbWFfYWRkcihwcml2LT5wYXJhbS5kbWEsCisJCQkgICAgIChpbnQpIHByaXYtPnJ4X2J1Zltwcml2LT5yeF9oZWFkXSk7CisJCXNldF9kbWFfY291bnQocHJpdi0+cGFyYW0uZG1hLCBCVUZfU0laRSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQllbmFibGVfZG1hKHByaXYtPnBhcmFtLmRtYSk7CisJCS8qIENvbmZpZ3VyZSBQYWNrZVR3aW4gRE1BICovCisJCWlmIChwcml2LT50eXBlID09IFRZUEVfVFdJTikgeworCQkJb3V0YigocHJpdi0+cGFyYW0uZG1hID09CisJCQkgICAgICAxKSA/IFRXSU5fRE1BX0hEWF9SMSA6IFRXSU5fRE1BX0hEWF9SMywKKwkJCSAgICAgcHJpdi0+Y2FyZF9iYXNlICsgVFdJTl9ETUFfQ0ZHKTsKKwkJfQorCQkvKiBTcC4gY29uZC4gaW50ci4gb25seSwgZXh0IGludCBlbmFibGUsIFJYIERNQSBlbmFibGUgKi8KKwkJd3JpdGVfc2NjKHByaXYsIFIxLCBFWFRfSU5UX0VOQUIgfCBJTlRfRVJSX1J4IHwKKwkJCSAgV1RfUkRZX1JUIHwgV1RfRk5fUkRZRk4gfCBXVF9SRFlfRU5BQik7CisJfSBlbHNlIHsKKwkJLyogUmVzZXQgY3VycmVudCBmcmFtZSAqLworCQlwcml2LT5yeF9wdHIgPSAwOworCQkvKiBJbnRyLiBvbiBhbGwgUnggY2hhcmFjdGVycyBhbmQgU3AuIGNvbmQuLCBleHQgaW50IGVuYWJsZSAqLworCQl3cml0ZV9zY2MocHJpdiwgUjEsIEVYVF9JTlRfRU5BQiB8IElOVF9BTExfUnggfCBXVF9SRFlfUlQgfAorCQkJICBXVF9GTl9SRFlGTik7CisJfQorCXdyaXRlX3NjYyhwcml2LCBSMCwgRVJSX1JFUyk7CisJd3JpdGVfc2NjKHByaXYsIFIzLCBSeEVOQUJMRSB8IFJ4OCB8IFJ4Q1JDX0VOQUIpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByeF9vZmYoc3RydWN0IHNjY19wcml2ICpwcml2KQoreworCS8qIERpc2FibGUgcmVjZWl2ZXIgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjMsIFJ4OCk7CisJLyogRGlzYWJsZSBEUkVRIC8gUlggaW50ZXJydXB0ICovCisJaWYgKHByaXYtPnBhcmFtLmRtYSA+PSAwICYmIHByaXYtPnR5cGUgPT0gVFlQRV9UV0lOKQorCQlvdXRiKDAsIHByaXYtPmNhcmRfYmFzZSArIFRXSU5fRE1BX0NGRyk7CisJZWxzZQorCQl3cml0ZV9zY2MocHJpdiwgUjEsIEVYVF9JTlRfRU5BQiB8IFdUX0ZOX1JEWUZOKTsKKwkvKiBEaXNhYmxlIERNQSAqLworCWlmIChwcml2LT5wYXJhbS5kbWEgPj0gMCkKKwkJZGlzYWJsZV9kbWEocHJpdi0+cGFyYW0uZG1hKTsKK30KKworCitzdGF0aWMgdm9pZCBzdGFydF90aW1lcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCB0LCBpbnQgcjE1KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlvdXRiKHByaXYtPnRtcl9tb2RlLCBwcml2LT50bXJfY3RybCk7CisJaWYgKHQgPT0gMCkgeworCQl0bV9pc3IocHJpdik7CisJfSBlbHNlIGlmICh0ID4gMCkgeworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJY2xpKCk7CisJCW91dGIodCAmIDB4RkYsIHByaXYtPnRtcl9jbnQpOworCQlvdXRiKCh0ID4+IDgpICYgMHhGRiwgcHJpdi0+dG1yX2NudCk7CisJCWlmIChwcml2LT50eXBlICE9IFRZUEVfVFdJTikgeworCQkJd3JpdGVfc2NjKHByaXYsIFIxNSwgcjE1IHwgQ1RTSUUpOworCQkJcHJpdi0+cnIwIHw9IENUUzsKKwkJfQorCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwl9Cit9CisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJhbmRvbSh2b2lkKQoreworCS8qIFNlZSAiTnVtZXJpY2FsIFJlY2lwZXMgaW4gQyIsIHNlY29uZCBlZGl0aW9uLCBwLiAyODQgKi8KKwlyYW5kID0gcmFuZCAqIDE2NjQ1MjVMICsgMTAxMzkwNDIyM0w7CisJcmV0dXJuICh1bnNpZ25lZCBjaGFyKSAocmFuZCA+PiAyNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB6ODUzMF9pc3Ioc3RydWN0IHNjY19pbmZvICppbmZvKQoreworCWludCBpcywgaSA9IDEwMDsKKworCXdoaWxlICgoaXMgPSByZWFkX3NjYygmaW5mby0+cHJpdlswXSwgUjMpKSAmJiBpLS0pIHsKKwkJaWYgKGlzICYgQ0hBUnhJUCkgeworCQkJcnhfaXNyKCZpbmZvLT5wcml2WzBdKTsKKwkJfSBlbHNlIGlmIChpcyAmIENIQVR4SVApIHsKKwkJCXR4X2lzcigmaW5mby0+cHJpdlswXSk7CisJCX0gZWxzZSBpZiAoaXMgJiBDSEFFWFQpIHsKKwkJCWVzX2lzcigmaW5mby0+cHJpdlswXSk7CisJCX0gZWxzZSBpZiAoaXMgJiBDSEJSeElQKSB7CisJCQlyeF9pc3IoJmluZm8tPnByaXZbMV0pOworCQl9IGVsc2UgaWYgKGlzICYgQ0hCVHhJUCkgeworCQkJdHhfaXNyKCZpbmZvLT5wcml2WzFdKTsKKwkJfSBlbHNlIHsKKwkJCWVzX2lzcigmaW5mby0+cHJpdlsxXSk7CisJCX0KKwkJd3JpdGVfc2NjKCZpbmZvLT5wcml2WzBdLCBSMCwgUkVTX0hfSVVTKTsKKwkJaSsrOworCX0KKwlpZiAoaSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzY2M6IHN0dWNrIGluIElTUiB3aXRoIFJSMz0weCUwMnguXG4iLAorCQkgICAgICAgaXMpOworCX0KKwkvKiBPaywgbm8gaW50ZXJydXB0cyBwZW5kaW5nIGZyb20gdGhpcyA4NTMwLiBUaGUgSU5UIGxpbmUgc2hvdWxkCisJICAgYmUgaW5hY3RpdmUgbm93LiAqLworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzY2NfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHNjY19pbmZvICppbmZvID0gZGV2X2lkOworCisJc3Bpbl9sb2NrKGluZm8tPnByaXZbMF0ucmVnaXN0ZXJfbG9jayk7CisJLyogQXQgdGhpcyBwb2ludCBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLCBhbmQgdGhlIGludGVycnVwdCB1bmRlciBzZXJ2aWNlCisJICAgaXMgYWxyZWFkeSBhY2tub3dsZWRnZWQsIGJ1dCBtYXNrZWQgb2ZmLgorCisJICAgSW50ZXJydXB0IHByb2Nlc3Npbmc6IFdlIGxvb3AgdW50aWwgd2Uga25vdyB0aGF0IHRoZSBJUlEgbGluZSBpcworCSAgIGxvdy4gSWYgYW5vdGhlciBwb3NpdGl2ZSBlZGdlIG9jY3VycyBhZnRlcndhcmRzIGR1cmluZyB0aGUgSVNSLAorCSAgIGFub3RoZXIgaW50ZXJydXB0IHdpbGwgYmUgdHJpZ2dlcmVkIGJ5IHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgorCSAgIGFzIHNvb24gYXMgdGhlIElSUSBsZXZlbCBpcyBlbmFibGVkIGFnYWluIChzZWUgYXNtL2lycS5oKS4KKworCSAgIEJvdHRvbS1oYWxmIGhhbmRsZXJzIHdpbGwgYmUgcHJvY2Vzc2VkIGFmdGVyIHNjY19pc3IoKS4gVGhpcyBpcworCSAgIGltcG9ydGFudCwgc2luY2Ugd2Ugb25seSBoYXZlIHNtYWxsIHJpbmdidWZmZXJzIGFuZCB3YW50IG5ldyBkYXRhCisJICAgdG8gYmUgZmV0Y2hlZC9kZWxpdmVyZWQgaW1tZWRpYXRlbHkuICovCisKKwlpZiAoaW5mby0+cHJpdlswXS50eXBlID09IFRZUEVfVFdJTikgeworCQlpbnQgaXMsIGNhcmRfYmFzZSA9IGluZm8tPnByaXZbMF0uY2FyZF9iYXNlOworCQl3aGlsZSAoKGlzID0gfmluYihjYXJkX2Jhc2UgKyBUV0lOX0lOVF9SRUcpKSAmCisJCSAgICAgICBUV0lOX0lOVF9NU0spIHsKKwkJCWlmIChpcyAmIFRXSU5fU0NDX01TSykgeworCQkJCXo4NTMwX2lzcihpbmZvKTsKKwkJCX0gZWxzZSBpZiAoaXMgJiBUV0lOX1RNUjFfTVNLKSB7CisJCQkJaW5iKGNhcmRfYmFzZSArIFRXSU5fQ0xSX1RNUjEpOworCQkJCXRtX2lzcigmaW5mby0+cHJpdlswXSk7CisJCQl9IGVsc2UgeworCQkJCWluYihjYXJkX2Jhc2UgKyBUV0lOX0NMUl9UTVIyKTsKKwkJCQl0bV9pc3IoJmluZm8tPnByaXZbMV0pOworCQkJfQorCQl9CisJfSBlbHNlCisJCXo4NTMwX2lzcihpbmZvKTsKKwlzcGluX3VubG9jayhpbmZvLT5wcml2WzBdLnJlZ2lzdGVyX2xvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgdm9pZCByeF9pc3Ioc3RydWN0IHNjY19wcml2ICpwcml2KQoreworCWlmIChwcml2LT5wYXJhbS5kbWEgPj0gMCkgeworCQkvKiBDaGVjayBzcGVjaWFsIGNvbmRpdGlvbiBhbmQgcGVyZm9ybSBlcnJvciByZXNldC4gU2VlIDIuNC43LjUuICovCisJCXNwZWNpYWxfY29uZGl0aW9uKHByaXYsIHJlYWRfc2NjKHByaXYsIFIxKSk7CisJCXdyaXRlX3NjYyhwcml2LCBSMCwgRVJSX1JFUyk7CisJfSBlbHNlIHsKKwkJLyogQ2hlY2sgc3BlY2lhbCBjb25kaXRpb24gZm9yIGVhY2ggY2hhcmFjdGVyLiBFcnJvciByZXNldCBub3QgbmVjZXNzYXJ5LgorCQkgICBTYW1lIGFsZ29yaXRobSBmb3IgU0NDIGFuZCBFU0NDLiBTZWUgMi40LjcuMSBhbmQgMi40LjcuNC4gKi8KKwkJaW50IHJjOworCQl3aGlsZSAocmVhZF9zY2MocHJpdiwgUjApICYgUnhfQ0hfQVYpIHsKKwkJCXJjID0gcmVhZF9zY2MocHJpdiwgUjEpOworCQkJaWYgKHByaXYtPnJ4X3B0ciA8IEJVRl9TSVpFKQorCQkJCXByaXYtPnJ4X2J1Zltwcml2LT5yeF9oZWFkXVtwcml2LT4KKwkJCQkJCQkgICAgcnhfcHRyKytdID0KKwkJCQkgICAgcmVhZF9zY2NfZGF0YShwcml2KTsKKwkJCWVsc2UgeworCQkJCXByaXYtPnJ4X292ZXIgPSAyOworCQkJCXJlYWRfc2NjX2RhdGEocHJpdik7CisJCQl9CisJCQlzcGVjaWFsX2NvbmRpdGlvbihwcml2LCByYyk7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQgc3BlY2lhbF9jb25kaXRpb24oc3RydWN0IHNjY19wcml2ICpwcml2LCBpbnQgcmMpCit7CisJaW50IGNiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBTZWUgRmlndXJlIDItMTUuIE9ubHkgb3ZlcnJ1biBhbmQgRU9GIG5lZWQgdG8gYmUgY2hlY2tlZC4gKi8KKworCWlmIChyYyAmIFJ4X09WUikgeworCQkvKiBSZWNlaXZlciBvdmVycnVuICovCisJCXByaXYtPnJ4X292ZXIgPSAxOworCQlpZiAocHJpdi0+cGFyYW0uZG1hIDwgMCkKKwkJCXdyaXRlX3NjYyhwcml2LCBSMCwgRVJSX1JFUyk7CisJfSBlbHNlIGlmIChyYyAmIEVORF9GUikgeworCQkvKiBFbmQgb2YgZnJhbWUuIEdldCBieXRlIGNvdW50ICovCisJCWlmIChwcml2LT5wYXJhbS5kbWEgPj0gMCkgeworCQkJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCQkJY2IgPSBCVUZfU0laRSAtIGdldF9kbWFfcmVzaWR1ZShwcml2LT5wYXJhbS5kbWEpIC0KKwkJCSAgICAyOworCQkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCX0gZWxzZSB7CisJCQljYiA9IHByaXYtPnJ4X3B0ciAtIDI7CisJCX0KKwkJaWYgKHByaXYtPnJ4X292ZXIpIHsKKwkJCS8qIFdlIGhhZCBhbiBvdmVycnVuICovCisJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChwcml2LT5yeF9vdmVyID09IDIpCisJCQkJcHJpdi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJZWxzZQorCQkJCXByaXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQlwcml2LT5yeF9vdmVyID0gMDsKKwkJfSBlbHNlIGlmIChyYyAmIENSQ19FUlIpIHsKKwkJCS8qIENvdW50IGludmFsaWQgQ1JDIG9ubHkgaWYgcGFja2V0IGxlbmd0aCA+PSBtaW5pbXVtICovCisJCQlpZiAoY2IgPj0gMTUpIHsKKwkJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoY2IgPj0gMTUpIHsKKwkJCQlpZiAocHJpdi0+cnhfY291bnQgPCBOVU1fUlhfQlVGIC0gMSkgeworCQkJCQkvKiBQdXQgZ29vZCBmcmFtZSBpbiBGSUZPICovCisJCQkJCXByaXYtPnJ4X2xlbltwcml2LT5yeF9oZWFkXSA9IGNiOworCQkJCQlwcml2LT5yeF9oZWFkID0KKwkJCQkJICAgIChwcml2LT5yeF9oZWFkICsKKwkJCQkJICAgICAxKSAlIE5VTV9SWF9CVUY7CisJCQkJCXByaXYtPnJ4X2NvdW50Kys7CisJCQkJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJ4X3dvcmspOworCQkJCX0gZWxzZSB7CisJCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQlwcml2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBHZXQgcmVhZHkgZm9yIG5ldyBmcmFtZSAqLworCQlpZiAocHJpdi0+cGFyYW0uZG1hID49IDApIHsKKwkJCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwkJCXNldF9kbWFfYWRkcihwcml2LT5wYXJhbS5kbWEsCisJCQkJICAgICAoaW50KSBwcml2LT5yeF9idWZbcHJpdi0+cnhfaGVhZF0pOworCQkJc2V0X2RtYV9jb3VudChwcml2LT5wYXJhbS5kbWEsIEJVRl9TSVpFKTsKKwkJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQl9IGVsc2UgeworCQkJcHJpdi0+cnhfcHRyID0gMDsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCByeF9iaCh2b2lkICphcmcpCit7CisJc3RydWN0IHNjY19wcml2ICpwcml2ID0gYXJnOworCWludCBpID0gcHJpdi0+cnhfdGFpbDsKKwlpbnQgY2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmluZ19sb2NrLCBmbGFncyk7CisJd2hpbGUgKHByaXYtPnJ4X2NvdW50KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJpbmdfbG9jaywgZmxhZ3MpOworCQljYiA9IHByaXYtPnJ4X2xlbltpXTsKKwkJLyogQWxsb2NhdGUgYnVmZmVyICovCisJCXNrYiA9IGRldl9hbGxvY19za2IoY2IgKyAxKTsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkvKiBEcm9wIHBhY2tldCAqLworCQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQl9IGVsc2UgeworCQkJLyogRmlsbCBidWZmZXIgKi8KKwkJCWRhdGEgPSBza2JfcHV0KHNrYiwgY2IgKyAxKTsKKwkJCWRhdGFbMF0gPSAwOworCQkJbWVtY3B5KCZkYXRhWzFdLCBwcml2LT5yeF9idWZbaV0sIGNiKTsKKwkJCXNrYi0+ZGV2ID0gcHJpdi0+ZGV2OworCQkJc2tiLT5wcm90b2NvbCA9IG50b2hzKEVUSF9QX0FYMjUpOworCQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCXByaXYtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBjYjsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmluZ19sb2NrLCBmbGFncyk7CisJCS8qIE1vdmUgdGFpbCAqLworCQlwcml2LT5yeF90YWlsID0gaSA9IChpICsgMSkgJSBOVU1fUlhfQlVGOworCQlwcml2LT5yeF9jb3VudC0tOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yaW5nX2xvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZCB0eF9pc3Ioc3RydWN0IHNjY19wcml2ICpwcml2KQoreworCWludCBpID0gcHJpdi0+dHhfdGFpbCwgcCA9IHByaXYtPnR4X3B0cjsKKworCS8qIFN1c3BlbmQgVFggaW50ZXJydXB0cyBpZiB3ZSBkb24ndCB3YW50IHRvIHNlbmQgYW55dGhpbmcuCisJICAgU2VlIEZpZ3VyZSAyLTIyLiAqLworCWlmIChwID09IHByaXYtPnR4X2xlbltpXSkgeworCQl3cml0ZV9zY2MocHJpdiwgUjAsIFJFU19UeF9QKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdyaXRlIGNoYXJhY3RlcnMgKi8KKwl3aGlsZSAoKHJlYWRfc2NjKHByaXYsIFIwKSAmIFR4X0JVRl9FTVApICYmIHAgPCBwcml2LT50eF9sZW5baV0pIHsKKwkJd3JpdGVfc2NjX2RhdGEocHJpdiwgcHJpdi0+dHhfYnVmW2ldW3ArK10sIDApOworCX0KKworCS8qIFJlc2V0IEVPTSBsYXRjaCBvZiBaODUzMCAqLworCWlmICghcHJpdi0+dHhfcHRyICYmIHAgJiYgcHJpdi0+Y2hpcCA9PSBaODUzMCkKKwkJd3JpdGVfc2NjKHByaXYsIFIwLCBSRVNfRU9NX0wpOworCisJcHJpdi0+dHhfcHRyID0gcDsKK30KKworCitzdGF0aWMgdm9pZCBlc19pc3Ioc3RydWN0IHNjY19wcml2ICpwcml2KQoreworCWludCBpLCBycjAsIGRycjAsIHJlczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogUmVhZCBzdGF0dXMsIHJlc2V0IGludGVycnVwdCBiaXQgKG9wZW4gbGF0Y2hlcykgKi8KKwlycjAgPSByZWFkX3NjYyhwcml2LCBSMCk7CisJd3JpdGVfc2NjKHByaXYsIFIwLCBSRVNfRVhUX0lOVCk7CisJZHJyMCA9IHByaXYtPnJyMCBeIHJyMDsKKwlwcml2LT5ycjAgPSBycjA7CisKKwkvKiBUcmFuc21pdCB1bmRlcnJ1biAoMi40LjkuNikuIFdlIGNhbid0IGNoZWNrIHRoZSBUeEVPTSBmbGFnLCBzaW5jZQorCSAgIGl0IG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIGNsZWFyZWQgYWdhaW4gYnkgQVVUT0VPTS4gKi8KKwlpZiAocHJpdi0+c3RhdGUgPT0gVFhfREFUQSkgeworCQkvKiBHZXQgcmVtYWluaW5nIGJ5dGVzICovCisJCWkgPSBwcml2LT50eF90YWlsOworCQlpZiAocHJpdi0+cGFyYW0uZG1hID49IDApIHsKKwkJCWRpc2FibGVfZG1hKHByaXYtPnBhcmFtLmRtYSk7CisJCQlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJCQlyZXMgPSBnZXRfZG1hX3Jlc2lkdWUocHJpdi0+cGFyYW0uZG1hKTsKKwkJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQl9IGVsc2UgeworCQkJcmVzID0gcHJpdi0+dHhfbGVuW2ldIC0gcHJpdi0+dHhfcHRyOworCQkJcHJpdi0+dHhfcHRyID0gMDsKKwkJfQorCQkvKiBEaXNhYmxlIERSRVEgLyBUWCBpbnRlcnJ1cHQgKi8KKwkJaWYgKHByaXYtPnBhcmFtLmRtYSA+PSAwICYmIHByaXYtPnR5cGUgPT0gVFlQRV9UV0lOKQorCQkJb3V0YigwLCBwcml2LT5jYXJkX2Jhc2UgKyBUV0lOX0RNQV9DRkcpOworCQllbHNlCisJCQl3cml0ZV9zY2MocHJpdiwgUjEsIEVYVF9JTlRfRU5BQiB8IFdUX0ZOX1JEWUZOKTsKKwkJaWYgKHJlcykgeworCQkJLyogVXBkYXRlIHBhY2tldCBzdGF0aXN0aWNzICovCisJCQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCXByaXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkvKiBPdGhlciB1bmRlcnJ1biBpbnRlcnJ1cHRzIG1heSBhbHJlYWR5IGJlIHdhaXRpbmcgKi8KKwkJCXdyaXRlX3NjYyhwcml2LCBSMCwgUkVTX0VYVF9JTlQpOworCQkJd3JpdGVfc2NjKHByaXYsIFIwLCBSRVNfRVhUX0lOVCk7CisJCX0gZWxzZSB7CisJCQkvKiBVcGRhdGUgcGFja2V0IHN0YXRpc3RpY3MgKi8KKwkJCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IHByaXYtPnR4X2xlbltpXTsKKwkJCS8qIFJlbW92ZSBmcmFtZSBmcm9tIEZJRk8gKi8KKwkJCXByaXYtPnR4X3RhaWwgPSAoaSArIDEpICUgTlVNX1RYX0JVRjsKKwkJCXByaXYtPnR4X2NvdW50LS07CisJCQkvKiBJbmZvcm0gdXBwZXIgbGF5ZXJzICovCisJCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPmRldik7CisJCX0KKwkJLyogU3dpdGNoIHN0YXRlICovCisJCXdyaXRlX3NjYyhwcml2LCBSMTUsIDApOworCQlpZiAocHJpdi0+dHhfY291bnQgJiYKKwkJICAgIChqaWZmaWVzIC0gcHJpdi0+dHhfc3RhcnQpIDwgcHJpdi0+cGFyYW0udHh0aW1lb3V0KSB7CisJCQlwcml2LT5zdGF0ZSA9IFRYX1BBVVNFOworCQkJc3RhcnRfdGltZXIocHJpdiwgcHJpdi0+cGFyYW0udHhwYXVzZSwgMCk7CisJCX0gZWxzZSB7CisJCQlwcml2LT5zdGF0ZSA9IFRYX1RBSUw7CisJCQlzdGFydF90aW1lcihwcml2LCBwcml2LT5wYXJhbS50eHRhaWwsIDApOworCQl9CisJfQorCisJLyogRENEIHRyYW5zaXRpb24gKi8KKwlpZiAoZHJyMCAmIERDRCkgeworCQlpZiAocnIwICYgRENEKSB7CisJCQlzd2l0Y2ggKHByaXYtPnN0YXRlKSB7CisJCQljYXNlIElETEU6CisJCQljYXNlIFdBSVQ6CisJCQkJcHJpdi0+c3RhdGUgPSBEQ0RfT047CisJCQkJd3JpdGVfc2NjKHByaXYsIFIxNSwgMCk7CisJCQkJc3RhcnRfdGltZXIocHJpdiwgcHJpdi0+cGFyYW0uZGNkb24sIDApOworCQkJfQorCQl9IGVsc2UgeworCQkJc3dpdGNoIChwcml2LT5zdGF0ZSkgeworCQkJY2FzZSBSWF9PTjoKKwkJCQlyeF9vZmYocHJpdik7CisJCQkJcHJpdi0+c3RhdGUgPSBEQ0RfT0ZGOworCQkJCXdyaXRlX3NjYyhwcml2LCBSMTUsIDApOworCQkJCXN0YXJ0X3RpbWVyKHByaXYsIHByaXYtPnBhcmFtLmRjZG9mZiwgMCk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDVFMgdHJhbnNpdGlvbiAqLworCWlmICgoZHJyMCAmIENUUykgJiYgKH5ycjAgJiBDVFMpICYmIHByaXYtPnR5cGUgIT0gVFlQRV9UV0lOKQorCQl0bV9pc3IocHJpdik7CisKK30KKworCitzdGF0aWMgdm9pZCB0bV9pc3Ioc3RydWN0IHNjY19wcml2ICpwcml2KQoreworCXN3aXRjaCAocHJpdi0+c3RhdGUpIHsKKwljYXNlIFRYX0hFQUQ6CisJY2FzZSBUWF9QQVVTRToKKwkJdHhfb24ocHJpdik7CisJCXByaXYtPnN0YXRlID0gVFhfREFUQTsKKwkJYnJlYWs7CisJY2FzZSBUWF9UQUlMOgorCQl3cml0ZV9zY2MocHJpdiwgUjUsIFR4Q1JDX0VOQUIgfCBUeDgpOworCQlwcml2LT5zdGF0ZSA9IFJUU19PRkY7CisJCWlmIChwcml2LT50eXBlICE9IFRZUEVfVFdJTikKKwkJCXdyaXRlX3NjYyhwcml2LCBSMTUsIDApOworCQlzdGFydF90aW1lcihwcml2LCBwcml2LT5wYXJhbS5ydHNvZmYsIDApOworCQlicmVhazsKKwljYXNlIFJUU19PRkY6CisJCXdyaXRlX3NjYyhwcml2LCBSMTUsIERDRElFKTsKKwkJcHJpdi0+cnIwID0gcmVhZF9zY2MocHJpdiwgUjApOworCQlpZiAocHJpdi0+cnIwICYgRENEKSB7CisJCQlwcml2LT5zdGF0cy5jb2xsaXNpb25zKys7CisJCQlyeF9vbihwcml2KTsKKwkJCXByaXYtPnN0YXRlID0gUlhfT047CisJCX0gZWxzZSB7CisJCQlwcml2LT5zdGF0ZSA9IFdBSVQ7CisJCQlzdGFydF90aW1lcihwcml2LCBwcml2LT5wYXJhbS53YWl0dGltZSwgRENESUUpOworCQl9CisJCWJyZWFrOworCWNhc2UgV0FJVDoKKwkJaWYgKHByaXYtPnR4X2NvdW50KSB7CisJCQlwcml2LT5zdGF0ZSA9IFRYX0hFQUQ7CisJCQlwcml2LT50eF9zdGFydCA9IGppZmZpZXM7CisJCQl3cml0ZV9zY2MocHJpdiwgUjUsCisJCQkJICBUeENSQ19FTkFCIHwgUlRTIHwgVHhFTkFCIHwgVHg4KTsKKwkJCXdyaXRlX3NjYyhwcml2LCBSMTUsIDApOworCQkJc3RhcnRfdGltZXIocHJpdiwgcHJpdi0+cGFyYW0udHhkZWxheSwgMCk7CisJCX0gZWxzZSB7CisJCQlwcml2LT5zdGF0ZSA9IElETEU7CisJCQlpZiAocHJpdi0+dHlwZSAhPSBUWVBFX1RXSU4pCisJCQkJd3JpdGVfc2NjKHByaXYsIFIxNSwgRENESUUpOworCQl9CisJCWJyZWFrOworCWNhc2UgRENEX09OOgorCWNhc2UgRENEX09GRjoKKwkJd3JpdGVfc2NjKHByaXYsIFIxNSwgRENESUUpOworCQlwcml2LT5ycjAgPSByZWFkX3NjYyhwcml2LCBSMCk7CisJCWlmIChwcml2LT5ycjAgJiBEQ0QpIHsKKwkJCXJ4X29uKHByaXYpOworCQkJcHJpdi0+c3RhdGUgPSBSWF9PTjsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnN0YXRlID0gV0FJVDsKKwkJCXN0YXJ0X3RpbWVyKHByaXYsCisJCQkJICAgIHJhbmRvbSgpIC8gcHJpdi0+cGFyYW0ucGVyc2lzdCAqCisJCQkJICAgIHByaXYtPnBhcmFtLnNsb3R0aW1lLCBEQ0RJRSk7CisJCX0KKwkJYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vaGRsY2Rydi5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vaGRsY2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTk1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9oZGxjZHJ2LmMKQEAgLTAsMCArMSw4MTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCWhkbGNkcnYuYyAgLS0gSERMQyBwYWNrZXQgcmFkaW8gbmV0d29yayBkcml2ZXIuCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk2LTIwMDAgIFRob21hcyBTYWlsZXIgKHNhaWxlckBpZmUuZWUuZXRoei5jaCkKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgR1BMIGFsbG93cyB5b3UgdG8gdXNlIHRoZSBkcml2ZXIsIE5PVCB0aGUgcmFkaW8uCisgKiAgSW4gb3JkZXIgdG8gdXNlIHRoZSByYWRpbywgeW91IG5lZWQgYSBsaWNlbnNlIGZyb20gdGhlIGNvbW11bmljYXRpb25zCisgKiAgYXV0aG9yaXR5IG9mIHlvdXIgY291bnRyeS4KKyAqCisgKiAgVGhlIGRyaXZlciB3YXMgZGVyaXZlZCBmcm9tIERvbmFsZCBCZWNrZXJzIHNrZWxldG9uLmMKKyAqCVdyaXR0ZW4gMTk5My05NCBieSBEb25hbGQgQmVja2VyLgorICoKKyAqICBIaXN0b3J5OgorICogICAwLjEgIDIxLjA5LjE5OTYgIFN0YXJ0ZWQKKyAqICAgICAgICAxOC4xMC4xOTk2ICBDaGFuZ2VkIHRvIG5ldyB1c2VyIHNwYWNlIGFjY2VzcyByb3V0aW5lcyAKKyAqICAgICAgICAgICAgICAgICAgICAoY29weV97dG8sZnJvbX1fdXNlcikKKyAqICAgMC4yICAyMS4xMS4xOTk2ICB2YXJpb3VzIHNtYWxsIGNoYW5nZXMKKyAqICAgMC4zICAwMy4wMy4xOTk3ICBmaXhlZCAoaG9wZWZ1bGx5KSBJUCBub3Qgd29ya2luZyB3aXRoIGF4LjI1IGFzIGEgbW9kdWxlCisgKiAgIDAuNCAgMTYuMDQuMTk5NyAgaW5pdCBjb2RlL2RhdGEgdGFnZ2VkCisgKiAgIDAuNSAgMzAuMDcuMTk5NyAgbWFkZSBIRExDIGJ1ZmZlcnMgYmlnZ2VyIChzb2x2ZXMgYSBwcm9ibGVtIHdpdGggdGhlCisgKiAgICAgICAgICAgICAgICAgICAgc291bmRtb2RlbSBkcml2ZXIpCisgKiAgIDAuNiAgMDUuMDQuMTk5OCAgYWRkIHNwaW5sb2NrcworICogICAwLjcgIDAzLjA4LjE5OTkgIHJlbW92ZWQgc29tZSBvbGQgY29tcGF0aWJpbGl0eSBjcnVmdAorICogICAwLjggIDEyLjAyLjIwMDAgIGFkYXB0ZWQgdG8gc29mdG5ldCBkcml2ZXIgaW50ZXJmYWNlCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGNkcnYuaD4KKy8qIHByb3RvdHlwZXMgZm9yIGF4MjVfZW5jYXBzdWxhdGUgYW5kIGF4MjVfcmVidWlsZF9oZWFkZXIgKi8KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPiAKKworLyogbWFrZSBnZW5rc3ltcyBoYXBweSAqLworI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvY3JjLWNjaXR0Lmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogVGhlIG5hbWUgb2YgdGhlIGNhcmQuIElzIHVzZWQgZm9yIG1lc3NhZ2VzIGFuZCBpbiB0aGUgcmVxdWVzdHMgZm9yCisgKiBpbyByZWdpb25zLCBpcnFzIGFuZCBkbWEgY2hhbm5lbHMKKyAqLworCitzdGF0aWMgY2hhciBheDI1X2JjYXN0W0FYMjVfQUREUl9MRU5dID0KK3snUScgPDwgMSwgJ1MnIDw8IDEsICdUJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnMCcgPDwgMX07CitzdGF0aWMgY2hhciBheDI1X25vY2FsbFtBWDI1X0FERFJfTEVOXSA9Cit7J0wnIDw8IDEsICdJJyA8PCAxLCAnTicgPDwgMSwgJ1UnIDw8IDEsICdYJyA8PCAxLCAnICcgPDwgMSwgJzEnIDw8IDF9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLSVNTX1ZFUkJPU0UKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUEFSQU1fVFhERUxBWSAgIDEKKyNkZWZpbmUgUEFSQU1fUEVSU0lTVCAgIDIKKyNkZWZpbmUgUEFSQU1fU0xPVFRJTUUgIDMKKyNkZWZpbmUgUEFSQU1fVFhUQUlMICAgIDQKKyNkZWZpbmUgUEFSQU1fRlVMTERVUCAgIDUKKyNkZWZpbmUgUEFSQU1fSEFSRFdBUkUgIDYKKyNkZWZpbmUgUEFSQU1fUkVUVVJOICAgIDI1NQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiB0aGUgQ1JDIHJvdXRpbmVzIGFyZSBzdG9sZW4gZnJvbSBXQU1QRVMKKyAqIGJ5IERpZXRlciBEZXlrZQorICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIHZvaWQgYXBwZW5kX2NyY19jY2l0dCh1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisgCXVuc2lnbmVkIGludCBjcmMgPSBjcmNfY2NpdHQoMHhmZmZmLCBidWZmZXIsIGxlbikgXiAweGZmZmY7CisJKmJ1ZmZlcisrID0gY3JjOworCSpidWZmZXIrKyA9IGNyYyA+PiA4OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2NyY19jY2l0dChjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjbnQpCit7CisJcmV0dXJuIChjcmNfY2NpdHQoMHhmZmZmLCBidWYsIGNudCkgJiAweGZmZmYpID09IDB4ZjBiODsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgMAorc3RhdGljIGludCBjYWxjX2NyY19jY2l0dChjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjbnQpCit7CisJdW5zaWduZWQgaW50IGNyYyA9IDB4ZmZmZjsKKworCWZvciAoOyBjbnQgPiAwOyBjbnQtLSkKKwkJY3JjID0gKGNyYyA+PiA4KSBeIGNyY19jY2l0dF90YWJsZVsoY3JjIF4gKmJ1ZisrKSAmIDB4ZmZdOworCWNyYyBePSAweGZmZmY7CisJcmV0dXJuIChjcmMgJiAweGZmZmYpOworfQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSB0ZW5tc190b18yZmxhZ3Mocyx0ZW5tcykgKCh0ZW5tcyAqIHMtPnBhci5iaXRyYXRlKSAvIDEwMCAvIDE2KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVGhlIEhETEMgcm91dGluZXMKKyAqLworCitzdGF0aWMgaW50IGhkbGNfcnhfYWRkX2J5dGVzKHN0cnVjdCBoZGxjZHJ2X3N0YXRlICpzLCB1bnNpZ25lZCBpbnQgYml0cywgCisJCQkgICAgIGludCBudW0pCit7CisJaW50IGFkZGVkID0gMDsKKwkKKwl3aGlsZSAocy0+aGRsY3J4LnJ4X3N0YXRlICYmIG51bSA+PSA4KSB7CisJCWlmIChzLT5oZGxjcngubGVuID49IHNpemVvZihzLT5oZGxjcnguYnVmZmVyKSkgeworCQkJcy0+aGRsY3J4LnJ4X3N0YXRlID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJCSpzLT5oZGxjcnguYnArKyA9IGJpdHMgPj4gKDMyLW51bSk7CisJCXMtPmhkbGNyeC5sZW4rKzsKKwkJbnVtIC09IDg7CisJCWFkZGVkICs9IDg7CisJfQorCXJldHVybiBhZGRlZDsKK30KKworc3RhdGljIHZvaWQgaGRsY19yeF9mbGFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBoZGxjZHJ2X3N0YXRlICpzKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHBrdF9sZW47CisJdW5zaWduZWQgY2hhciAqY3A7CisKKwlpZiAocy0+aGRsY3J4LmxlbiA8IDQpIAorCQlyZXR1cm47CisJaWYgKCFjaGVja19jcmNfY2NpdHQocy0+aGRsY3J4LmJ1ZmZlciwgcy0+aGRsY3J4LmxlbikpIAorCQlyZXR1cm47CisJcGt0X2xlbiA9IHMtPmhkbGNyeC5sZW4gLSAyICsgMTsgLyogS0lTUyBrbHVkZ2UgKi8KKwlpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4pKSkgeworCQlwcmludGsoIiVzOiBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0XG4iLCBkZXYtPm5hbWUpOworCQlzLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybjsKKwl9CisJc2tiLT5kZXYgPSBkZXY7CisJY3AgPSBza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJKmNwKysgPSAwOyAvKiBLSVNTIGtsdWRnZSAqLworCW1lbWNweShjcCwgcy0+aGRsY3J4LmJ1ZmZlciwgcGt0X2xlbiAtIDEpOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BWDI1KTsKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXMtPnN0YXRzLnJ4X3BhY2tldHMrKzsKK30KKwordm9pZCBoZGxjZHJ2X3JlY2VpdmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBoZGxjZHJ2X3N0YXRlICpzKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIG1hc2s2LCB3b3JkOworCQorCWlmICghcyB8fCBzLT5tYWdpYyAhPSBIRExDRFJWX01BR0lDKSAKKwkJcmV0dXJuOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZzLT5oZGxjcnguaW5faGRsY19yeCkpCisJCXJldHVybjsKKworCXdoaWxlICghaGRsY2Rydl9oYnVmX2VtcHR5KCZzLT5oZGxjcnguaGJ1ZikpIHsKKwkJd29yZCA9IGhkbGNkcnZfaGJ1Zl9nZXQoJnMtPmhkbGNyeC5oYnVmKTsJCisKKyNpZmRlZiBIRExDRFJWX0RFQlVHCisJCWhkbGNkcnZfYWRkX2JpdGJ1ZmZlcl93b3JkKCZzLT5iaXRidWZfaGRsYywgd29yZCk7CisjZW5kaWYgLyogSERMQ0RSVl9ERUJVRyAqLworCSAgICAgICAJcy0+aGRsY3J4LmJpdHN0cmVhbSA+Pj0gMTY7CisJCXMtPmhkbGNyeC5iaXRzdHJlYW0gfD0gd29yZCA8PCAxNjsKKwkJcy0+aGRsY3J4LmJpdGJ1ZiA+Pj0gMTY7CisJCXMtPmhkbGNyeC5iaXRidWYgfD0gd29yZCA8PCAxNjsKKwkJcy0+aGRsY3J4Lm51bWJpdHMgKz0gMTY7CisJCWZvcihpID0gMTUsIG1hc2sxID0gMHgxZmMwMCwgbWFzazIgPSAweDFmZTAwLCBtYXNrMyA9IDB4MGZjMDAsCisJCSAgICBtYXNrNCA9IDB4MWY4MDAsIG1hc2s1ID0gMHhmODAwLCBtYXNrNiA9IDB4ZmZmZjsgCisJCSAgICBpID49IDA7IAorCQkgICAgaS0tLCBtYXNrMSA8PD0gMSwgbWFzazIgPDw9IDEsIG1hc2szIDw8PSAxLCBtYXNrNCA8PD0gMSwgCisJCSAgICBtYXNrNSA8PD0gMSwgbWFzazYgPSAobWFzazYgPDwgMSkgfCAxKSB7CisJCQlpZiAoKHMtPmhkbGNyeC5iaXRzdHJlYW0gJiBtYXNrMSkgPT0gbWFzazEpCisJCQkJcy0+aGRsY3J4LnJ4X3N0YXRlID0gMDsgLyogYWJvcnQgcmVjZWl2ZWQgKi8KKwkJCWVsc2UgaWYgKChzLT5oZGxjcnguYml0c3RyZWFtICYgbWFzazIpID09IG1hc2szKSB7CisJCQkJLyogZmxhZyByZWNlaXZlZCAqLworCQkJCWlmIChzLT5oZGxjcngucnhfc3RhdGUpIHsKKwkJCQkJaGRsY19yeF9hZGRfYnl0ZXMocywgcy0+aGRsY3J4LmJpdGJ1ZiAKKwkJCQkJCQkgIDw8ICg4K2kpLAorCQkJCQkJCSAgcy0+aGRsY3J4Lm51bWJpdHMKKwkJCQkJCQkgIC04LWkpOworCQkJCQloZGxjX3J4X2ZsYWcoZGV2LCBzKTsKKwkJCQl9CisJCQkJcy0+aGRsY3J4LmxlbiA9IDA7CisJCQkJcy0+aGRsY3J4LmJwID0gcy0+aGRsY3J4LmJ1ZmZlcjsKKwkJCQlzLT5oZGxjcngucnhfc3RhdGUgPSAxOworCQkJCXMtPmhkbGNyeC5udW1iaXRzID0gaTsKKwkJCX0gZWxzZSBpZiAoKHMtPmhkbGNyeC5iaXRzdHJlYW0gJiBtYXNrNCkgPT0gbWFzazUpIHsKKwkJCQkvKiBzdHVmZmVkIGJpdCAqLworCQkJCXMtPmhkbGNyeC5udW1iaXRzLS07CisJCQkJcy0+aGRsY3J4LmJpdGJ1ZiA9IChzLT5oZGxjcnguYml0YnVmICYgKH5tYXNrNikpIHwKKwkJCQkJKChzLT5oZGxjcnguYml0YnVmICYgbWFzazYpIDw8IDEpOworCQkJfQorCQl9CisJCXMtPmhkbGNyeC5udW1iaXRzIC09IGhkbGNfcnhfYWRkX2J5dGVzKHMsIHMtPmhkbGNyeC5iaXRidWYsCisJCQkJCQkgICAgICAgcy0+aGRsY3J4Lm51bWJpdHMpOworCX0KKwljbGVhcl9iaXQoMCwgJnMtPmhkbGNyeC5pbl9oZGxjX3J4KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fa2lzc19wYXJhbXMoc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMsCisJCQkJICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKworI2lmZGVmIEtJU1NfVkVSQk9TRQorI2RlZmluZSBQS1AoYSxiKSBwcmludGsoS0VSTl9JTkZPICJoZGxjZHJ2LmM6IGNoYW5uZWwgcGFyYW1zOiAiIGEgIlxuIiwgYikKKyNlbHNlIC8qIEtJU1NfVkVSQk9TRSAqLwkgICAgICAKKyNkZWZpbmUgUEtQKGEsYikgCisjZW5kaWYgLyogS0lTU19WRVJCT1NFICovCSAgICAgIAorCisJaWYgKGxlbiA8IDIpCisJCXJldHVybjsKKwlzd2l0Y2goZGF0YVswXSkgeworCWNhc2UgUEFSQU1fVFhERUxBWToKKwkJcy0+Y2hfcGFyYW1zLnR4X2RlbGF5ID0gZGF0YVsxXTsKKwkJUEtQKCJUWCBkZWxheSA9ICV1bXMiLCAxMCAqIHMtPmNoX3BhcmFtcy50eF9kZWxheSk7CisJCWJyZWFrOworCWNhc2UgUEFSQU1fUEVSU0lTVDogICAKKwkJcy0+Y2hfcGFyYW1zLnBwZXJzaXN0ID0gZGF0YVsxXTsKKwkJUEtQKCJwIHBlcnNpc3RlbmNlID0gJXUiLCBzLT5jaF9wYXJhbXMucHBlcnNpc3QpOworCQlicmVhazsKKwljYXNlIFBBUkFNX1NMT1RUSU1FOiAgCisJCXMtPmNoX3BhcmFtcy5zbG90dGltZSA9IGRhdGFbMV07CisJCVBLUCgic2xvdCB0aW1lID0gJXVtcyIsIHMtPmNoX3BhcmFtcy5zbG90dGltZSk7CisJCWJyZWFrOworCWNhc2UgUEFSQU1fVFhUQUlMOiAgICAKKwkJcy0+Y2hfcGFyYW1zLnR4X3RhaWwgPSBkYXRhWzFdOworCQlQS1AoIlRYIHRhaWwgPSAldW1zIiwgcy0+Y2hfcGFyYW1zLnR4X3RhaWwpOworCQlicmVhazsKKwljYXNlIFBBUkFNX0ZVTExEVVA6ICAgCisJCXMtPmNoX3BhcmFtcy5mdWxsZHVwID0gISFkYXRhWzFdOworCQlQS1AoIiVzIGR1cGxleCIsIHMtPmNoX3BhcmFtcy5mdWxsZHVwID8gImZ1bGwiIDogImhhbGYiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorI3VuZGVmIFBLUAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgaGRsY2Rydl90cmFuc21pdHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBpbnQgbWFzazEsIG1hc2syLCBtYXNrMzsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBwa3RfbGVuOworCisJaWYgKCFzIHx8IHMtPm1hZ2ljICE9IEhETENEUlZfTUFHSUMpIAorCQlyZXR1cm47CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnMtPmhkbGN0eC5pbl9oZGxjX3R4KSkKKwkJcmV0dXJuOworCWZvciAoOzspIHsKKwkJaWYgKHMtPmhkbGN0eC5udW1iaXRzID49IDE2KSB7CisJCQlpZiAoaGRsY2Rydl9oYnVmX2Z1bGwoJnMtPmhkbGN0eC5oYnVmKSkgeworCQkJCWNsZWFyX2JpdCgwLCAmcy0+aGRsY3R4LmluX2hkbGNfdHgpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWhkbGNkcnZfaGJ1Zl9wdXQoJnMtPmhkbGN0eC5oYnVmLCBzLT5oZGxjdHguYml0YnVmKTsKKwkJCXMtPmhkbGN0eC5iaXRidWYgPj49IDE2OworCQkJcy0+aGRsY3R4Lm51bWJpdHMgLT0gMTY7CisJCX0KKwkJc3dpdGNoIChzLT5oZGxjdHgudHhfc3RhdGUpIHsKKwkJZGVmYXVsdDoKKwkJCWNsZWFyX2JpdCgwLCAmcy0+aGRsY3R4LmluX2hkbGNfdHgpOworCQkJcmV0dXJuOworCQljYXNlIDA6CisJCWNhc2UgMToKKwkJCWlmIChzLT5oZGxjdHgubnVtZmxhZ3MpIHsKKwkJCQlzLT5oZGxjdHgubnVtZmxhZ3MtLTsKKwkJCQlzLT5oZGxjdHguYml0YnVmIHw9IAorCQkJCQkweDdlN2UgPDwgcy0+aGRsY3R4Lm51bWJpdHM7CisJCQkJcy0+aGRsY3R4Lm51bWJpdHMgKz0gMTY7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocy0+aGRsY3R4LnR4X3N0YXRlID09IDEpIHsKKwkJCQljbGVhcl9iaXQoMCwgJnMtPmhkbGN0eC5pbl9oZGxjX3R4KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoIShza2IgPSBzLT5za2IpKSB7CisJCQkJaW50IGZsZ3MgPSB0ZW5tc190b18yZmxhZ3Mocywgcy0+Y2hfcGFyYW1zLnR4X3RhaWwpOworCQkJCWlmIChmbGdzIDwgMikKKwkJCQkJZmxncyA9IDI7CisJCQkJcy0+aGRsY3R4LnR4X3N0YXRlID0gMTsKKwkJCQlzLT5oZGxjdHgubnVtZmxhZ3MgPSBmbGdzOworCQkJCWJyZWFrOworCQkJfQorCQkJcy0+c2tiID0gTlVMTDsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCXBrdF9sZW4gPSBza2ItPmxlbi0xOyAvKiBzdHJpcCBLSVNTIGJ5dGUgKi8KKwkJCWlmIChwa3RfbGVuID49IEhETENEUlZfTUFYRkxFTiB8fCBwa3RfbGVuIDwgMikgeworCQkJCXMtPmhkbGN0eC50eF9zdGF0ZSA9IDA7CisJCQkJcy0+aGRsY3R4Lm51bWZsYWdzID0gMTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWVtY3B5KHMtPmhkbGN0eC5idWZmZXIsIHNrYi0+ZGF0YSsxLCBwa3RfbGVuKTsKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQlzLT5oZGxjdHguYnAgPSBzLT5oZGxjdHguYnVmZmVyOworCQkJYXBwZW5kX2NyY19jY2l0dChzLT5oZGxjdHguYnVmZmVyLCBwa3RfbGVuKTsKKwkJCXMtPmhkbGN0eC5sZW4gPSBwa3RfbGVuKzI7IC8qIHRoZSBhcHBlbmRlZCBDUkMgKi8KKwkJCXMtPmhkbGN0eC50eF9zdGF0ZSA9IDI7CisJCQlzLT5oZGxjdHguYml0c3RyZWFtID0gMDsKKwkJCXMtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlpZiAoIXMtPmhkbGN0eC5sZW4pIHsKKwkJCQlzLT5oZGxjdHgudHhfc3RhdGUgPSAwOworCQkJCXMtPmhkbGN0eC5udW1mbGFncyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzLT5oZGxjdHgubGVuLS07CisJCQlzLT5oZGxjdHguYml0YnVmIHw9ICpzLT5oZGxjdHguYnAgPDwKKwkJCQlzLT5oZGxjdHgubnVtYml0czsKKwkJCXMtPmhkbGN0eC5iaXRzdHJlYW0gPj49IDg7CisJCQlzLT5oZGxjdHguYml0c3RyZWFtIHw9ICgqcy0+aGRsY3R4LmJwKyspIDw8IDE2OworCQkJbWFzazEgPSAweDFmMDAwOworCQkJbWFzazIgPSAweDEwMDAwOworCQkJbWFzazMgPSAweGZmZmZmZmZmID4+ICgzMS1zLT5oZGxjdHgubnVtYml0cyk7CisJCQlzLT5oZGxjdHgubnVtYml0cyArPSA4OworCQkJZm9yKGkgPSAwOyBpIDwgODsgaSsrLCBtYXNrMSA8PD0gMSwgbWFzazIgPDw9IDEsIAorCQkJICAgIG1hc2szID0gKG1hc2szIDw8IDEpIHwgMSkgeworCQkJCWlmICgocy0+aGRsY3R4LmJpdHN0cmVhbSAmIG1hc2sxKSAhPSBtYXNrMSkgCisJCQkJCWNvbnRpbnVlOworCQkJCXMtPmhkbGN0eC5iaXRzdHJlYW0gJj0gfm1hc2syOworCQkJCXMtPmhkbGN0eC5iaXRidWYgPSAKKwkJCQkJKHMtPmhkbGN0eC5iaXRidWYgJiBtYXNrMykgfAorCQkJCQkJKChzLT5oZGxjdHguYml0YnVmICYgCisJCQkJCQkgKH5tYXNrMykpIDw8IDEpOworCQkJCXMtPmhkbGN0eC5udW1iaXRzKys7CisJCQkJbWFzazMgPSAobWFzazMgPDwgMSkgfCAxOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgc3RhcnRfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMpCit7CisJcy0+aGRsY3R4LnR4X3N0YXRlID0gMDsKKwlzLT5oZGxjdHgubnVtZmxhZ3MgPSB0ZW5tc190b18yZmxhZ3Mocywgcy0+Y2hfcGFyYW1zLnR4X2RlbGF5KTsKKwlzLT5oZGxjdHguYml0YnVmID0gcy0+aGRsY3R4LmJpdHN0cmVhbSA9IHMtPmhkbGN0eC5udW1iaXRzID0gMDsKKwloZGxjZHJ2X3RyYW5zbWl0dGVyKGRldiwgcyk7CisJcy0+aGRsY3R4LnB0dCA9IDE7CisJcy0+cHR0X2tleWVkKys7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJhbmRvbV9zZWVkOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHJhbmRvbV9udW0odm9pZCkKK3sKKwlyYW5kb21fc2VlZCA9IDI4NjI5ICogcmFuZG9tX3NlZWQgKyAxNTc7CisJcmV0dXJuIHJhbmRvbV9zZWVkOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgaGRsY2Rydl9hcmJpdHJhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMpCit7CisJaWYgKCFzIHx8IHMtPm1hZ2ljICE9IEhETENEUlZfTUFHSUMgfHwgcy0+aGRsY3R4LnB0dCB8fCAhcy0+c2tiKSAKKwkJcmV0dXJuOworCWlmIChzLT5jaF9wYXJhbXMuZnVsbGR1cCkgeworCQlzdGFydF90eChkZXYsIHMpOworCQlyZXR1cm47CisJfQorCWlmIChzLT5oZGxjcnguZGNkKSB7CisJCXMtPmhkbGN0eC5zbG90Y250ID0gcy0+Y2hfcGFyYW1zLnNsb3R0aW1lOworCQlyZXR1cm47CisJfQorCWlmICgoLS1zLT5oZGxjdHguc2xvdGNudCkgPiAwKQorCQlyZXR1cm47CisJcy0+aGRsY3R4LnNsb3RjbnQgPSBzLT5jaF9wYXJhbXMuc2xvdHRpbWU7CisJaWYgKChyYW5kb21fbnVtKCkgJSAyNTYpID4gcy0+Y2hfcGFyYW1zLnBwZXJzaXN0KQorCQlyZXR1cm47CisJc3RhcnRfdHgoZGV2LCBzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09IG5ldHdvcmsgZHJpdmVyIGludGVyZmFjZSA9PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworc3RhdGljIGludCBoZGxjZHJ2X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhkbGNkcnZfc3RhdGUgKnNtID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChza2ItPmRhdGFbMF0gIT0gMCkgeworCQlkb19raXNzX3BhcmFtcyhzbSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzbS0+c2tiKQorCQlyZXR1cm4gLTE7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNtLT5za2IgPSBza2I7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGhkbGNkcnZfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyOworCisJLyogYWRkciBpcyBhbiBBWC4yNSBzaGlmdGVkIEFTQ0lJIG1hYyBhZGRyZXNzICovCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHNhLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsgCisJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaGRsY2Rydl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqc20gPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogCisJICogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuICBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUKKwkgKiBjYXJkIG9wZW4gb3IgY2xvc2VkLiAKKwkgKi8KKwlyZXR1cm4gJnNtLT5zdGF0czsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKKyAqIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgKiByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICogdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworCitzdGF0aWMgaW50IGhkbGNkcnZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoZGxjZHJ2X3N0YXRlICpzID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWlmICghcy0+b3BzIHx8ICFzLT5vcHMtPm9wZW4pCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiBpbml0aWFsaXNlIHNvbWUgdmFyaWFibGVzCisJICovCisJcy0+b3BlbmVkID0gMTsKKwlzLT5oZGxjcnguaGJ1Zi5yZCA9IHMtPmhkbGNyeC5oYnVmLndyID0gMDsKKwlzLT5oZGxjcnguaW5faGRsY19yeCA9IDA7CisJcy0+aGRsY3J4LnJ4X3N0YXRlID0gMDsKKwkKKwlzLT5oZGxjdHguaGJ1Zi5yZCA9IHMtPmhkbGN0eC5oYnVmLndyID0gMDsKKwlzLT5oZGxjdHguaW5faGRsY190eCA9IDA7CisJcy0+aGRsY3R4LnR4X3N0YXRlID0gMTsKKwlzLT5oZGxjdHgubnVtZmxhZ3MgPSAwOworCXMtPmhkbGN0eC5iaXRzdHJlYW0gPSBzLT5oZGxjdHguYml0YnVmID0gcy0+aGRsY3R4Lm51bWJpdHMgPSAwOworCXMtPmhkbGN0eC5wdHQgPSAwOworCXMtPmhkbGN0eC5zbG90Y250ID0gcy0+Y2hfcGFyYW1zLnNsb3R0aW1lOworCXMtPmhkbGN0eC5jYWxpYnJhdGUgPSAwOworCisJaSA9IHMtPm9wcy0+b3BlbihkZXYpOworCWlmIChpKQorCQlyZXR1cm4gaTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIAorICogVGhlIGludmVyc2Ugcm91dGluZSB0byBoZGxjZHJ2X29wZW4oKS4gCisgKi8KKworc3RhdGljIGludCBoZGxjZHJ2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpID0gMDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChzLT5vcHMgJiYgcy0+b3BzLT5jbG9zZSkKKwkJaSA9IHMtPm9wcy0+Y2xvc2UoZGV2KTsKKwlpZiAocy0+c2tiKQorCQlkZXZfa2ZyZWVfc2tiKHMtPnNrYik7CisJcy0+c2tiID0gTlVMTDsKKwlzLT5vcGVuZWQgPSAwOworCXJldHVybiBpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBoZGxjZHJ2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBoZGxjZHJ2X3N0YXRlICpzID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaGRsY2Rydl9pb2N0bCBiaTsKKworCWlmIChjbWQgIT0gU0lPQ0RFVlBSSVZBVEUpIHsKKwkJaWYgKHMtPm9wcyAmJiBzLT5vcHMtPmlvY3RsKQorCQkJcmV0dXJuIHMtPm9wcy0+aW9jdGwoZGV2LCBpZnIsICZiaSwgY21kKTsKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCZiaSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKGJpKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChiaS5jbWQpIHsKKwlkZWZhdWx0OgorCQlpZiAocy0+b3BzICYmIHMtPm9wcy0+aW9jdGwpCisJCQlyZXR1cm4gcy0+b3BzLT5pb2N0bChkZXYsIGlmciwgJmJpLCBjbWQpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJY2FzZSBIRExDRFJWQ1RMX0dFVENIQU5ORUxQQVI6CisJCWJpLmRhdGEuY3AudHhfZGVsYXkgPSBzLT5jaF9wYXJhbXMudHhfZGVsYXk7CisJCWJpLmRhdGEuY3AudHhfdGFpbCA9IHMtPmNoX3BhcmFtcy50eF90YWlsOworCQliaS5kYXRhLmNwLnNsb3R0aW1lID0gcy0+Y2hfcGFyYW1zLnNsb3R0aW1lOworCQliaS5kYXRhLmNwLnBwZXJzaXN0ID0gcy0+Y2hfcGFyYW1zLnBwZXJzaXN0OworCQliaS5kYXRhLmNwLmZ1bGxkdXAgPSBzLT5jaF9wYXJhbXMuZnVsbGR1cDsKKwkJYnJlYWs7CisKKwljYXNlIEhETENEUlZDVExfU0VUQ0hBTk5FTFBBUjoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCXMtPmNoX3BhcmFtcy50eF9kZWxheSA9IGJpLmRhdGEuY3AudHhfZGVsYXk7CisJCXMtPmNoX3BhcmFtcy50eF90YWlsID0gYmkuZGF0YS5jcC50eF90YWlsOworCQlzLT5jaF9wYXJhbXMuc2xvdHRpbWUgPSBiaS5kYXRhLmNwLnNsb3R0aW1lOworCQlzLT5jaF9wYXJhbXMucHBlcnNpc3QgPSBiaS5kYXRhLmNwLnBwZXJzaXN0OworCQlzLT5jaF9wYXJhbXMuZnVsbGR1cCA9IGJpLmRhdGEuY3AuZnVsbGR1cDsKKwkJcy0+aGRsY3R4LnNsb3RjbnQgPSAxOworCQlyZXR1cm4gMDsKKwkJCisJY2FzZSBIRExDRFJWQ1RMX0dFVE1PREVNUEFSOgorCQliaS5kYXRhLm1wLmlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCQliaS5kYXRhLm1wLmlycSA9IGRldi0+aXJxOworCQliaS5kYXRhLm1wLmRtYSA9IGRldi0+ZG1hOworCQliaS5kYXRhLm1wLmRtYTIgPSBzLT5wdHRfb3V0LmRtYTI7CisJCWJpLmRhdGEubXAuc2VyaW9iYXNlID0gcy0+cHR0X291dC5zZXJpb2Jhc2U7CisJCWJpLmRhdGEubXAucGFyaW9iYXNlID0gcy0+cHR0X291dC5wYXJpb2Jhc2U7CisJCWJpLmRhdGEubXAubWlkaWlvYmFzZSA9IHMtPnB0dF9vdXQubWlkaWlvYmFzZTsKKwkJYnJlYWs7CisKKwljYXNlIEhETENEUlZDVExfU0VUTU9ERU1QQVI6CisJCWlmICgoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpIHx8IG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlkZXYtPmJhc2VfYWRkciA9IGJpLmRhdGEubXAuaW9iYXNlOworCQlkZXYtPmlycSA9IGJpLmRhdGEubXAuaXJxOworCQlkZXYtPmRtYSA9IGJpLmRhdGEubXAuZG1hOworCQlzLT5wdHRfb3V0LmRtYTIgPSBiaS5kYXRhLm1wLmRtYTI7CisJCXMtPnB0dF9vdXQuc2VyaW9iYXNlID0gYmkuZGF0YS5tcC5zZXJpb2Jhc2U7CisJCXMtPnB0dF9vdXQucGFyaW9iYXNlID0gYmkuZGF0YS5tcC5wYXJpb2Jhc2U7CisJCXMtPnB0dF9vdXQubWlkaWlvYmFzZSA9IGJpLmRhdGEubXAubWlkaWlvYmFzZTsKKwkJcmV0dXJuIDA7CQorCQorCWNhc2UgSERMQ0RSVkNUTF9HRVRTVEFUOgorCQliaS5kYXRhLmNzLnB0dCA9IGhkbGNkcnZfcHR0KHMpOworCQliaS5kYXRhLmNzLmRjZCA9IHMtPmhkbGNyeC5kY2Q7CisJCWJpLmRhdGEuY3MucHR0X2tleWVkID0gcy0+cHR0X2tleWVkOworCQliaS5kYXRhLmNzLnR4X3BhY2tldHMgPSBzLT5zdGF0cy50eF9wYWNrZXRzOworCQliaS5kYXRhLmNzLnR4X2Vycm9ycyA9IHMtPnN0YXRzLnR4X2Vycm9yczsKKwkJYmkuZGF0YS5jcy5yeF9wYWNrZXRzID0gcy0+c3RhdHMucnhfcGFja2V0czsKKwkJYmkuZGF0YS5jcy5yeF9lcnJvcnMgPSBzLT5zdGF0cy5yeF9lcnJvcnM7CisJCWJyZWFrOwkJCisKKwljYXNlIEhETENEUlZDVExfT0xER0VUU1RBVDoKKwkJYmkuZGF0YS5vY3MucHR0ID0gaGRsY2Rydl9wdHQocyk7CisJCWJpLmRhdGEub2NzLmRjZCA9IHMtPmhkbGNyeC5kY2Q7CisJCWJpLmRhdGEub2NzLnB0dF9rZXllZCA9IHMtPnB0dF9rZXllZDsKKwkJYnJlYWs7CQkKKworCWNhc2UgSERMQ0RSVkNUTF9DQUxJQlJBVEU6CisJCWlmKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJcy0+aGRsY3R4LmNhbGlicmF0ZSA9IGJpLmRhdGEuY2FsaWJyYXRlICogcy0+cGFyLmJpdHJhdGUgLyAxNjsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhETENEUlZDVExfR0VUU0FNUExFUzoKKyNpZm5kZWYgSERMQ0RSVl9ERUJVRworCQlyZXR1cm4gLUVQRVJNOworI2Vsc2UgLyogSERMQ0RSVl9ERUJVRyAqLworCQlpZiAocy0+Yml0YnVmX2NoYW5uZWwucmQgPT0gcy0+Yml0YnVmX2NoYW5uZWwud3IpIAorCQkJcmV0dXJuIC1FQUdBSU47CisJCWJpLmRhdGEuYml0cyA9IAorCQkJcy0+Yml0YnVmX2NoYW5uZWwuYnVmZmVyW3MtPmJpdGJ1Zl9jaGFubmVsLnJkXTsKKwkJcy0+Yml0YnVmX2NoYW5uZWwucmQgPSAocy0+Yml0YnVmX2NoYW5uZWwucmQrMSkgJQorCQkJc2l6ZW9mKHMtPmJpdGJ1Zl9jaGFubmVsLmJ1ZmZlcik7CisJCWJyZWFrOworI2VuZGlmIC8qIEhETENEUlZfREVCVUcgKi8KKwkJCQkKKwljYXNlIEhETENEUlZDVExfR0VUQklUUzoKKyNpZm5kZWYgSERMQ0RSVl9ERUJVRworCQlyZXR1cm4gLUVQRVJNOworI2Vsc2UgLyogSERMQ0RSVl9ERUJVRyAqLworCQlpZiAocy0+Yml0YnVmX2hkbGMucmQgPT0gcy0+Yml0YnVmX2hkbGMud3IpIAorCQkJcmV0dXJuIC1FQUdBSU47CisJCWJpLmRhdGEuYml0cyA9IAorCQkJcy0+Yml0YnVmX2hkbGMuYnVmZmVyW3MtPmJpdGJ1Zl9oZGxjLnJkXTsKKwkJcy0+Yml0YnVmX2hkbGMucmQgPSAocy0+Yml0YnVmX2hkbGMucmQrMSkgJQorCQkJc2l6ZW9mKHMtPmJpdGJ1Zl9oZGxjLmJ1ZmZlcik7CisJCWJyZWFrOwkJCisjZW5kaWYgLyogSERMQ0RSVl9ERUJVRyAqLworCisJY2FzZSBIRExDRFJWQ1RMX0RSSVZFUk5BTUU6CisJCWlmIChzLT5vcHMgJiYgcy0+b3BzLT5kcnZuYW1lKSB7CisJCQlzdHJuY3B5KGJpLmRhdGEuZHJpdmVybmFtZSwgcy0+b3BzLT5kcnZuYW1lLCAKKwkJCQlzaXplb2YoYmkuZGF0YS5kcml2ZXJuYW1lKSk7CisJCQlicmVhazsKKwkJfQorCQliaS5kYXRhLmRyaXZlcm5hbWVbMF0gPSAnXDAnOworCQlicmVhazsKKwkJCisJfQorCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJmJpLCBzaXplb2YoYmkpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7CisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBJbml0aWFsaXplIGZpZWxkcyBpbiBoZGxjZHJ2CisgKi8KK3N0YXRpYyB2b2lkIGhkbGNkcnZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGhkbGNkcnZfY2hhbm5lbF9wYXJhbXMgZGZsdF9jaF9wYXJhbXMgPSB7IAorCQkyMCwgMiwgMTAsIDQwLCAwIAorCX07CisJc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSBoZGxjZHJ2X3N0YXRlIHN0cnVjdAorCSAqLworCXMtPmNoX3BhcmFtcyA9IGRmbHRfY2hfcGFyYW1zOworCXMtPnB0dF9rZXllZCA9IDA7CisKKwlzcGluX2xvY2tfaW5pdCgmcy0+aGRsY3J4LmhidWYubG9jayk7CisJcy0+aGRsY3J4LmhidWYucmQgPSBzLT5oZGxjcnguaGJ1Zi53ciA9IDA7CisJcy0+aGRsY3J4LmluX2hkbGNfcnggPSAwOworCXMtPmhkbGNyeC5yeF9zdGF0ZSA9IDA7CisJCisJc3Bpbl9sb2NrX2luaXQoJnMtPmhkbGN0eC5oYnVmLmxvY2spOworCXMtPmhkbGN0eC5oYnVmLnJkID0gcy0+aGRsY3R4LmhidWYud3IgPSAwOworCXMtPmhkbGN0eC5pbl9oZGxjX3R4ID0gMDsKKwlzLT5oZGxjdHgudHhfc3RhdGUgPSAxOworCXMtPmhkbGN0eC5udW1mbGFncyA9IDA7CisJcy0+aGRsY3R4LmJpdHN0cmVhbSA9IHMtPmhkbGN0eC5iaXRidWYgPSBzLT5oZGxjdHgubnVtYml0cyA9IDA7CisJcy0+aGRsY3R4LnB0dCA9IDA7CisJcy0+aGRsY3R4LnNsb3RjbnQgPSBzLT5jaF9wYXJhbXMuc2xvdHRpbWU7CisJcy0+aGRsY3R4LmNhbGlicmF0ZSA9IDA7CisKKyNpZmRlZiBIRExDRFJWX0RFQlVHCisJcy0+Yml0YnVmX2NoYW5uZWwucmQgPSBzLT5iaXRidWZfY2hhbm5lbC53ciA9IDA7CisJcy0+Yml0YnVmX2NoYW5uZWwuc2hyZWcgPSAweDgwOworCisJcy0+Yml0YnVmX2hkbGMucmQgPSBzLT5iaXRidWZfaGRsYy53ciA9IDA7CisJcy0+Yml0YnVmX2hkbGMuc2hyZWcgPSAweDgwOworI2VuZGlmIC8qIEhETENEUlZfREVCVUcgKi8KKworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdAorCSAqLworCWRldi0+b3BlbiA9IGhkbGNkcnZfb3BlbjsKKwlkZXYtPnN0b3AgPSBoZGxjZHJ2X2Nsb3NlOworCWRldi0+ZG9faW9jdGwgPSBoZGxjZHJ2X2lvY3RsOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaGRsY2Rydl9zZW5kX3BhY2tldDsKKwlkZXYtPmdldF9zdGF0cyA9IGhkbGNkcnZfZ2V0X3N0YXRzOworCisJLyogRmlsbCBpbiB0aGUgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlICovCisKKwlzLT5za2IgPSBOVUxMOworCQorI2lmIGRlZmluZWQoQ09ORklHX0FYMjUpIHx8IGRlZmluZWQoQ09ORklHX0FYMjVfTU9EVUxFKQorCWRldi0+aGFyZF9oZWFkZXIgPSBheDI1X2VuY2Fwc3VsYXRlOworCWRldi0+cmVidWlsZF9oZWFkZXIgPSBheDI1X3JlYnVpbGRfaGVhZGVyOworI2Vsc2UgLyogQ09ORklHX0FYMjUgfHwgQ09ORklHX0FYMjVfTU9EVUxFICovCisJZGV2LT5oYXJkX2hlYWRlciA9IE5VTEw7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciA9IE5VTEw7CisjZW5kaWYgLyogQ09ORklHX0FYMjUgfHwgQ09ORklHX0FYMjVfTU9EVUxFICovCisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBoZGxjZHJ2X3NldF9tYWNfYWRkcmVzczsKKwkKKwlkZXYtPnR5cGUgPSBBUlBIUkRfQVgyNTsgICAgICAgICAgIC8qIEFGX0FYMjUgZGV2aWNlICovCisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBBWDI1X01BWF9IRUFERVJfTEVOICsgQVgyNV9CUFFfSEVBREVSX0xFTjsKKwlkZXYtPm10dSA9IEFYMjVfREVGX1BBQ0xFTjsgICAgICAgIC8qIGV0aF9tdHUgaXMgdGhlIGRlZmF1bHQgKi8KKwlkZXYtPmFkZHJfbGVuID0gQVgyNV9BRERSX0xFTjsgICAgIC8qIHNpemVvZiBhbiBheC4yNSBhZGRyZXNzICovCisJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCBheDI1X2JjYXN0LCBBWDI1X0FERFJfTEVOKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYXgyNV9ub2NhbGwsIEFYMjVfQUREUl9MRU4pOworCWRldi0+dHhfcXVldWVfbGVuID0gMTY7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RydWN0IG5ldF9kZXZpY2UgKmhkbGNkcnZfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IGhkbGNkcnZfb3BzICpvcHMsCisJCQkJICAgIHVuc2lnbmVkIGludCBwcml2c2l6ZSwgY29uc3QgY2hhciAqaWZuYW1lLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgYmFzZWFkZHIsIHVuc2lnbmVkIGludCBpcnEsIAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZG1hKSAKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBoZGxjZHJ2X3N0YXRlICpzOworCWludCBlcnI7CisKKwlCVUdfT04ob3BzID09IE5VTEwpOworCisJaWYgKHByaXZzaXplIDwgc2l6ZW9mKHN0cnVjdCBoZGxjZHJ2X3N0YXRlKSkKKwkJcHJpdnNpemUgPSBzaXplb2Yoc3RydWN0IGhkbGNkcnZfc3RhdGUpOworCisJZGV2ID0gYWxsb2NfbmV0ZGV2KHByaXZzaXplLCBpZm5hbWUsIGhkbGNkcnZfc2V0dXApOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCS8qCisJICogaW5pdGlhbGl6ZSBwYXJ0IG9mIHRoZSBoZGxjZHJ2X3N0YXRlIHN0cnVjdAorCSAqLworCXMgPSBuZXRkZXZfcHJpdihkZXYpOworCXMtPm1hZ2ljID0gSERMQ0RSVl9NQUdJQzsKKwlzLT5vcHMgPSBvcHM7CisJZGV2LT5iYXNlX2FkZHIgPSBiYXNlYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKwlkZXYtPmRtYSA9IGRtYTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhkbGNkcnY6IGNhbm5vdCByZWdpc3RlciBuZXQgIgorCQkgICAgICAgImRldmljZSAlc1xuIiwgZGV2LT5uYW1lKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJZGV2ID0gRVJSX1BUUihlcnIpOworCX0KKwlyZXR1cm4gZGV2OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBoZGxjZHJ2X3VucmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMgPSBuZXRkZXZfcHJpdihkZXYpOworCisJQlVHX09OKHMtPm1hZ2ljICE9IEhETENEUlZfTUFHSUMpOworCisJaWYgKHMtPm9wZW5lZCAmJiBzLT5vcHMtPmNsb3NlKQorCQlzLT5vcHMtPmNsb3NlKGRldik7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkKKwlmcmVlX25ldGRldihkZXYpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworRVhQT1JUX1NZTUJPTChoZGxjZHJ2X3JlY2VpdmVyKTsKK0VYUE9SVF9TWU1CT0woaGRsY2Rydl90cmFuc21pdHRlcik7CitFWFBPUlRfU1lNQk9MKGhkbGNkcnZfYXJiaXRyYXRlKTsKK0VYUE9SVF9TWU1CT0woaGRsY2Rydl9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGhkbGNkcnZfdW5yZWdpc3Rlcik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9faW5pdCBoZGxjZHJ2X2luaXRfZHJpdmVyKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiaGRsY2RydjogKEMpIDE5OTYtMjAwMCBUaG9tYXMgU2FpbGVyIEhCOUpOWC9BRTRXQVxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiaGRsY2RydjogdmVyc2lvbiAwLjggY29tcGlsZWQgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgaGRsY2Rydl9jbGVhbnVwX2RyaXZlcih2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImhkbGNkcnY6IGNsZWFudXBcbiIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIE0uIFNhaWxlciwgc2FpbGVyQGlmZS5lZS5ldGh6LmNoLCBoYjlqbnhAaGI5dy5jaGUuZXUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUGFja2V0IFJhZGlvIG5ldHdvcmsgaW50ZXJmYWNlIEhETEMgZW5jb2Rlci9kZWNvZGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfaW5pdChoZGxjZHJ2X2luaXRfZHJpdmVyKTsKK21vZHVsZV9leGl0KGhkbGNkcnZfY2xlYW51cF9kcml2ZXIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9ta2lzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZWEwODAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9ta2lzcy5jCkBAIC0wLDAgKzEsOTUxIEBACisvKgorICoJTUtJU1MgRHJpdmVyCisgKgorICoJVGhpcyBtb2R1bGU6CisgKgkJVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIAkJVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgQVguMjUgcHJvdG9jb2wgZm9yIGtlcm5lbC1iYXNlZAorICoJCWRldmljZXMgbGlrZSBUVFlzLiBJdCBpbnRlcmZhY2VzIGJldHdlZW4gYSByYXcgVFRZLCBhbmQgdGhlCisgKgkJa2VybmVsJ3MgQVguMjUgcHJvdG9jb2wgbGF5ZXJzLCBqdXN0IGxpa2Ugc2xpcC5jLgorICoJCUFYLjI1IG5lZWRzIHRvIGJlIHNlcGFyYXRlZCBmcm9tIHNsaXAuYyB3aGlsZSBzbGlwLmMgaXMgbm8KKyAqCQlsb25nZXIgYSBzdGF0aWMga2VybmVsIGRldmljZSBzaW5jZSBpdCBpcyBhIG1vZHVsZS4KKyAqCQlUaGlzIG1ldGhvZCBjbGVhcnMgdGhlIHdheSB0byBpbXBsZW1lbnQgb3RoZXIga2lzcyBwcm90b2NvbHMKKyAqCQlsaWtlIG1raXNzIHNtYWNrIGc4YnBxIC4uLi4uIHNvIGZhciBvbmx5IG1raXNzIGlzIGltcGxlbWVudGVkLgorICoKKyAqIEhhbnMgQWxibGFzIDxoYW5zQGVzcmFjLmVsZS50dWUubmw+CisgKgorICoJSGlzdG9yeQorICoJSm9uYXRoYW4gKEc0S0xYKQlGaXhlZCB0byBtYXRjaCBMaW51eCBuZXR3b3JraW5nIGNoYW5nZXMgLSAyLjEuMTUuCisgKglNYXR0aGlhcyAoREcyRkVGKSAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBGbGV4TmV0IENSQyAob24gc3BlY2lhbCByZXF1ZXN0KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZCBidWcgaW4gYXgyNV9jbG9zZSgpOiBkZXZfbG9ja193YWl0KCkgd2FzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCB0d2ljZSwgY2F1c2luZyBhIGRlYWRsb2NrLgorICoJSmVyb2VuIChQRTFSWFEpCQlSZW1vdmVkIG9sZCBNS0lTU19NQUdJQyBzdHVmZiBhbmQgY2FsbHMgdG8KKyAqCQkJCU1PRF8qX1VTRV9DT1VOVAorICoJCQkJUmVtb3ZlIGNsaSgpIGFuZCBmaXggcnRubCBsb2NrIHVzYWdlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKworI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisKKyNpbmNsdWRlICJta2lzcy5oIgorCisjaWZkZWYgQ09ORklHX0lORVQKKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2VuZGlmCisKK3N0YXRpYyBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPSBLRVJOX0lORk8gIm1raXNzOiBBWC4yNSBNdWx0aWtpc3MsIEhhbnMgQWxiYXMgUEUxQVlYXG4iOworCit0eXBlZGVmIHN0cnVjdCBheDI1X2N0cmwgeworCXN0cnVjdCBheF9kaXNwIGN0cmw7CS8qIAkJCQkqLworCXN0cnVjdCBuZXRfZGV2aWNlICBkZXY7CS8qIHRoZSBkZXZpY2UJCQkqLworfSBheDI1X2N0cmxfdDsKKworc3RhdGljIGF4MjVfY3RybF90ICoqYXgyNV9jdHJsczsKKworaW50IGF4MjVfbWF4ZGV2ID0gQVgyNV9NQVhERVY7CQkvKiBDYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIGluc21vZCEgKi8KKworc3RhdGljIHN0cnVjdCB0dHlfbGRpc2MJYXhfbGRpc2M7CisKK3N0YXRpYyBpbnQgYXgyNV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBraXNzX2VzYyh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQga2lzc19lc2NfY3JjKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBzaG9ydCwgaW50KTsKK3N0YXRpYyB2b2lkIGtpc3NfdW5lc2Moc3RydWN0IGF4X2Rpc3AgKiwgdW5zaWduZWQgY2hhcik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IENyY19mbGV4X3RhYmxlW10gPSB7CisgIDB4MGY4NywgMHgxZTBlLCAweDJjOTUsIDB4M2QxYywgMHg0OWEzLCAweDU4MmEsIDB4NmFiMSwgMHg3YjM4LAorICAweDgzY2YsIDB4OTI0NiwgMHhhMGRkLCAweGIxNTQsIDB4YzVlYiwgMHhkNDYyLCAweGU2ZjksIDB4Zjc3MCwKKyAgMHgxZjA2LCAweDBlOGYsIDB4M2MxNCwgMHgyZDlkLCAweDU5MjIsIDB4NDhhYiwgMHg3YTMwLCAweDZiYjksCisgIDB4OTM0ZSwgMHg4MmM3LCAweGIwNWMsIDB4YTFkNSwgMHhkNTZhLCAweGM0ZTMsIDB4ZjY3OCwgMHhlN2YxLAorICAweDJlODUsIDB4M2YwYywgMHgwZDk3LCAweDFjMWUsIDB4NjhhMSwgMHg3OTI4LCAweDRiYjMsIDB4NWEzYSwKKyAgMHhhMmNkLCAweGIzNDQsIDB4ODFkZiwgMHg5MDU2LCAweGU0ZTksIDB4ZjU2MCwgMHhjN2ZiLCAweGQ2NzIsCisgIDB4M2UwNCwgMHgyZjhkLCAweDFkMTYsIDB4MGM5ZiwgMHg3ODIwLCAweDY5YTksIDB4NWIzMiwgMHg0YWJiLAorICAweGIyNGMsIDB4YTNjNSwgMHg5MTVlLCAweDgwZDcsIDB4ZjQ2OCwgMHhlNWUxLCAweGQ3N2EsIDB4YzZmMywKKyAgMHg0ZDgzLCAweDVjMGEsIDB4NmU5MSwgMHg3ZjE4LCAweDBiYTcsIDB4MWEyZSwgMHgyOGI1LCAweDM5M2MsCisgIDB4YzFjYiwgMHhkMDQyLCAweGUyZDksIDB4ZjM1MCwgMHg4N2VmLCAweDk2NjYsIDB4YTRmZCwgMHhiNTc0LAorICAweDVkMDIsIDB4NGM4YiwgMHg3ZTEwLCAweDZmOTksIDB4MWIyNiwgMHgwYWFmLCAweDM4MzQsIDB4MjliZCwKKyAgMHhkMTRhLCAweGMwYzMsIDB4ZjI1OCwgMHhlM2QxLCAweDk3NmUsIDB4ODZlNywgMHhiNDdjLCAweGE1ZjUsCisgIDB4NmM4MSwgMHg3ZDA4LCAweDRmOTMsIDB4NWUxYSwgMHgyYWE1LCAweDNiMmMsIDB4MDliNywgMHgxODNlLAorICAweGUwYzksIDB4ZjE0MCwgMHhjM2RiLCAweGQyNTIsIDB4YTZlZCwgMHhiNzY0LCAweDg1ZmYsIDB4OTQ3NiwKKyAgMHg3YzAwLCAweDZkODksIDB4NWYxMiwgMHg0ZTliLCAweDNhMjQsIDB4MmJhZCwgMHgxOTM2LCAweDA4YmYsCisgIDB4ZjA0OCwgMHhlMWMxLCAweGQzNWEsIDB4YzJkMywgMHhiNjZjLCAweGE3ZTUsIDB4OTU3ZSwgMHg4NGY3LAorICAweDhiOGYsIDB4OWEwNiwgMHhhODlkLCAweGI5MTQsIDB4Y2RhYiwgMHhkYzIyLCAweGVlYjksIDB4ZmYzMCwKKyAgMHgwN2M3LCAweDE2NGUsIDB4MjRkNSwgMHgzNTVjLCAweDQxZTMsIDB4NTA2YSwgMHg2MmYxLCAweDczNzgsCisgIDB4OWIwZSwgMHg4YTg3LCAweGI4MWMsIDB4YTk5NSwgMHhkZDJhLCAweGNjYTMsIDB4ZmUzOCwgMHhlZmIxLAorICAweDE3NDYsIDB4MDZjZiwgMHgzNDU0LCAweDI1ZGQsIDB4NTE2MiwgMHg0MGViLCAweDcyNzAsIDB4NjNmOSwKKyAgMHhhYThkLCAweGJiMDQsIDB4ODk5ZiwgMHg5ODE2LCAweGVjYTksIDB4ZmQyMCwgMHhjZmJiLCAweGRlMzIsCisgIDB4MjZjNSwgMHgzNzRjLCAweDA1ZDcsIDB4MTQ1ZSwgMHg2MGUxLCAweDcxNjgsIDB4NDNmMywgMHg1MjdhLAorICAweGJhMGMsIDB4YWI4NSwgMHg5OTFlLCAweDg4OTcsIDB4ZmMyOCwgMHhlZGExLCAweGRmM2EsIDB4Y2ViMywKKyAgMHgzNjQ0LCAweDI3Y2QsIDB4MTU1NiwgMHgwNGRmLCAweDcwNjAsIDB4NjFlOSwgMHg1MzcyLCAweDQyZmIsCisgIDB4Yzk4YiwgMHhkODAyLCAweGVhOTksIDB4ZmIxMCwgMHg4ZmFmLCAweDllMjYsIDB4YWNiZCwgMHhiZDM0LAorICAweDQ1YzMsIDB4NTQ0YSwgMHg2NmQxLCAweDc3NTgsIDB4MDNlNywgMHgxMjZlLCAweDIwZjUsIDB4MzE3YywKKyAgMHhkOTBhLCAweGM4ODMsIDB4ZmExOCwgMHhlYjkxLCAweDlmMmUsIDB4OGVhNywgMHhiYzNjLCAweGFkYjUsCisgIDB4NTU0MiwgMHg0NGNiLCAweDc2NTAsIDB4NjdkOSwgMHgxMzY2LCAweDAyZWYsIDB4MzA3NCwgMHgyMWZkLAorICAweGU4ODksIDB4ZjkwMCwgMHhjYjliLCAweGRhMTIsIDB4YWVhZCwgMHhiZjI0LCAweDhkYmYsIDB4OWMzNiwKKyAgMHg2NGMxLCAweDc1NDgsIDB4NDdkMywgMHg1NjVhLCAweDIyZTUsIDB4MzM2YywgMHgwMWY3LCAweDEwN2UsCisgIDB4ZjgwOCwgMHhlOTgxLCAweGRiMWEsIDB4Y2E5MywgMHhiZTJjLCAweGFmYTUsIDB4OWQzZSwgMHg4Y2I3LAorICAweDc0NDAsIDB4NjVjOSwgMHg1NzUyLCAweDQ2ZGIsIDB4MzI2NCwgMHgyM2VkLCAweDExNzYsIDB4MDBmZgorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgY2FsY19jcmNfZmxleCh1bnNpZ25lZCBjaGFyICpjcCwgaW50IHNpemUpCit7CisgICAgdW5zaWduZWQgc2hvcnQgY3JjID0gMHhmZmZmOworICAgIAorICAgIHdoaWxlIChzaXplLS0pCisJY3JjID0gKGNyYyA8PCA4KSBeIENyY19mbGV4X3RhYmxlWygoY3JjID4+IDgpIF4gKmNwKyspICYgMHhmZl07CisKKyAgICByZXR1cm4gY3JjOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgY2hlY2tfY3JjX2ZsZXgodW5zaWduZWQgY2hhciAqY3AsIGludCBzaXplKQoreworICB1bnNpZ25lZCBzaG9ydCBjcmMgPSAweGZmZmY7CisKKyAgaWYgKHNpemUgPCAzKQorICAgICAgcmV0dXJuIC0xOworCisgIHdoaWxlIChzaXplLS0pCisgICAgICBjcmMgPSAoY3JjIDw8IDgpIF4gQ3JjX2ZsZXhfdGFibGVbKChjcmMgPj4gOCkgXiAqY3ArKykgJiAweGZmXTsKKworICBpZiAoKGNyYyAmIDB4ZmZmZikgIT0gMHg3MDcwKSAKKyAgICAgIHJldHVybiAtMTsKKworICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBGaW5kIGEgZnJlZSBjaGFubmVsLCBhbmQgbGluayBpbiB0aGlzIGB0dHknIGxpbmUuICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBheF9kaXNwICpheF9hbGxvYyh2b2lkKQoreworCWF4MjVfY3RybF90ICpheHA9TlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBheDI1X21heGRldjsgaSsrKSB7CisJCWF4cCA9IGF4MjVfY3RybHNbaV07CisKKwkJLyogTm90IGFsbG9jYXRlZCA/ICovCisJCWlmIChheHAgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCS8qIE5vdCBpbiB1c2UgPyAqLworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoQVhGX0lOVVNFLCAmYXhwLT5jdHJsLmZsYWdzKSkKKwkJCWJyZWFrOworCX0KKworCS8qIFNvcnJ5LCB0b28gbWFueSwgYWxsIHNsb3RzIGluIHVzZSAqLworCWlmIChpID49IGF4MjVfbWF4ZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIElmIG5vIGNoYW5uZWxzIGFyZSBhdmFpbGFibGUsIGFsbG9jYXRlIG9uZSAqLworCWlmIChheHAgPT0gTlVMTCAmJiAoYXgyNV9jdHJsc1tpXSA9IGttYWxsb2Moc2l6ZW9mKGF4MjVfY3RybF90KSwgR0ZQX0tFUk5FTCkpICE9IE5VTEwpIHsKKwkJYXhwID0gYXgyNV9jdHJsc1tpXTsKKwl9CisJbWVtc2V0KGF4cCwgMCwgc2l6ZW9mKGF4MjVfY3RybF90KSk7CisKKwkvKiBJbml0aWFsaXplIGNoYW5uZWwgY29udHJvbCBkYXRhICovCisJc2V0X2JpdChBWEZfSU5VU0UsICZheHAtPmN0cmwuZmxhZ3MpOworCXNwcmludGYoYXhwLT5kZXYubmFtZSwgImF4JWQiLCBpKyspOworCWF4cC0+Y3RybC50dHkgICAgICA9IE5VTEw7CisJYXhwLT5kZXYuYmFzZV9hZGRyID0gaTsKKwlheHAtPmRldi5wcml2ICAgICAgPSAodm9pZCAqKSZheHAtPmN0cmw7CisJYXhwLT5kZXYubmV4dCAgICAgID0gTlVMTDsKKwlheHAtPmRldi5pbml0ICAgICAgPSBheDI1X2luaXQ7CisKKwlpZiAoYXhwICE9IE5VTEwpIHsKKwkJLyoKKwkJICogcmVnaXN0ZXIgZGV2aWNlIHNvIHRoYXQgaXQgY2FuIGJlIGlmY29uZmlnJ2VkCisJCSAqIGF4MjVfaW5pdCgpIHdpbGwgYmUgY2FsbGVkIGFzIGEgc2lkZS1lZmZlY3QKKwkJICogU0lERS1FRkZFQ1QgV0FSTklORzogYXgyNV9pbml0KCkgQ0xFQVJTIGF4cC0+Y3RybCAhCisJCSAqLworCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KCZheHAtPmRldikgPT0gMCkgeworCQkJLyogKFJlLSlTZXQgdGhlIElOVVNFIGJpdC4gICBWZXJ5IEltcG9ydGFudCEgKi8KKwkJCXNldF9iaXQoQVhGX0lOVVNFLCAmYXhwLT5jdHJsLmZsYWdzKTsKKwkJCWF4cC0+Y3RybC5kZXYgPSAmYXhwLT5kZXY7CisJCQlheHAtPmRldi5wcml2ID0gKHZvaWQgKikgJmF4cC0+Y3RybDsKKworCQkJcmV0dXJuICZheHAtPmN0cmw7CisJCX0gZWxzZSB7CisJCQljbGVhcl9iaXQoQVhGX0lOVVNFLCZheHAtPmN0cmwuZmxhZ3MpOworCQkJcHJpbnRrKEtFUk5fRVJSICJta2lzczogYXhfYWxsb2MoKSAtIHJlZ2lzdGVyX25ldGRldigpIGZhaWx1cmUuXG4iKTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBGcmVlIGFuIEFYMjUgY2hhbm5lbC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBheF9mcmVlKHN0cnVjdCBheF9kaXNwICpheCkKK3sKKwkvKiBGcmVlIGFsbCBBWDI1IGZyYW1lIGJ1ZmZlcnMuICovCisJaWYgKGF4LT5yYnVmZikKKwkJa2ZyZWUoYXgtPnJidWZmKTsKKwlheC0+cmJ1ZmYgPSBOVUxMOworCWlmIChheC0+eGJ1ZmYpCisJCWtmcmVlKGF4LT54YnVmZik7CisJYXgtPnhidWZmID0gTlVMTDsKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChBWEZfSU5VU0UsICZheC0+ZmxhZ3MpKQorCQlwcmludGsoS0VSTl9FUlIgIm1raXNzOiAlczogYXhfZnJlZSBmb3IgYWxyZWFkeSBmcmVlIHVuaXQuXG4iLCBheC0+ZGV2LT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgYXhfY2hhbmdlZG10dShzdHJ1Y3QgYXhfZGlzcCAqYXgpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGF4LT5kZXY7CisJdW5zaWduZWQgY2hhciAqeGJ1ZmYsICpyYnVmZiwgKm94YnVmZiwgKm9yYnVmZjsKKwlpbnQgbGVuOworCisJbGVuID0gZGV2LT5tdHUgKiAyOworCisJLyoKKwkgKiBhbGxvdyBmb3IgYXJyaXZhbCBvZiBsYXJnZXIgVURQIHBhY2tldHMsIGV2ZW4gaWYgd2Ugc2F5IG5vdCB0bworCSAqIGFsc28gZml4ZXMgYSBidWcgaW4gd2hpY2ggU3VuT1Mgc2VuZHMgNTEyLWJ5dGUgcGFja2V0cyBldmVuIHdpdGgKKwkgKiBhbiBNU1Mgb2YgMTI4CisJICovCisJaWYgKGxlbiA8IDU3NiAqIDIpCisJCWxlbiA9IDU3NiAqIDI7CisKKwl4YnVmZiA9IGttYWxsb2MobGVuICsgNCwgR0ZQX0FUT01JQyk7CisJcmJ1ZmYgPSBrbWFsbG9jKGxlbiArIDQsIEdGUF9BVE9NSUMpOworCisJaWYgKHhidWZmID09IE5VTEwgfHwgcmJ1ZmYgPT0gTlVMTCkgIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJta2lzczogJXM6IHVuYWJsZSB0byBncm93IGF4MjUgYnVmZmVycywgTVRVIGNoYW5nZSBjYW5jZWxsZWQuXG4iLAorCQkgICAgICAgYXgtPmRldi0+bmFtZSk7CisJCWRldi0+bXR1ID0gYXgtPm10dTsKKwkJaWYgKHhidWZmICE9IE5VTEwpCisJCQlrZnJlZSh4YnVmZik7CisJCWlmIChyYnVmZiAhPSBOVUxMKQorCQkJa2ZyZWUocmJ1ZmYpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2JoKCZheC0+YnVmbG9jayk7CisKKwlveGJ1ZmYgICAgPSBheC0+eGJ1ZmY7CisJYXgtPnhidWZmID0geGJ1ZmY7CisJb3JidWZmICAgID0gYXgtPnJidWZmOworCWF4LT5yYnVmZiA9IHJidWZmOworCisJaWYgKGF4LT54bGVmdCkgeworCQlpZiAoYXgtPnhsZWZ0IDw9IGxlbikgeworCQkJbWVtY3B5KGF4LT54YnVmZiwgYXgtPnhoZWFkLCBheC0+eGxlZnQpOworCQl9IGVsc2UgIHsKKwkJCWF4LT54bGVmdCA9IDA7CisJCQlheC0+dHhfZHJvcHBlZCsrOworCQl9CisJfQorCisJYXgtPnhoZWFkID0gYXgtPnhidWZmOworCisJaWYgKGF4LT5yY291bnQpIHsKKwkJaWYgKGF4LT5yY291bnQgPD0gbGVuKSB7CisJCQltZW1jcHkoYXgtPnJidWZmLCBvcmJ1ZmYsIGF4LT5yY291bnQpOworCQl9IGVsc2UgIHsKKwkJCWF4LT5yY291bnQgPSAwOworCQkJYXgtPnJ4X292ZXJfZXJyb3JzKys7CisJCQlzZXRfYml0KEFYRl9FUlJPUiwgJmF4LT5mbGFncyk7CisJCX0KKwl9CisKKwlheC0+bXR1ICAgICAgPSBkZXYtPm10dSArIDczOworCWF4LT5idWZmc2l6ZSA9IGxlbjsKKworCXNwaW5fdW5sb2NrX2JoKCZheC0+YnVmbG9jayk7CisKKwlpZiAob3hidWZmICE9IE5VTEwpCisJCWtmcmVlKG94YnVmZik7CisJaWYgKG9yYnVmZiAhPSBOVUxMKQorCQlrZnJlZShvcmJ1ZmYpOworfQorCisKKy8qIFNldCB0aGUgInNlbmRpbmciIGZsYWcuICBUaGlzIG11c3QgYmUgYXRvbWljLiAqLworc3RhdGljIGlubGluZSB2b2lkIGF4X2xvY2soc3RydWN0IGF4X2Rpc3AgKmF4KQoreworCW5ldGlmX3N0b3BfcXVldWUoYXgtPmRldik7Cit9CisKKworLyogQ2xlYXIgdGhlICJzZW5kaW5nIiBmbGFnLiAgVGhpcyBtdXN0IGJlIGF0b21pYy4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBheF91bmxvY2soc3RydWN0IGF4X2Rpc3AgKmF4KQoreworCW5ldGlmX3N0YXJ0X3F1ZXVlKGF4LT5kZXYpOworfQorCisvKiBTZW5kIG9uZSBjb21wbGV0ZWx5IGRlY2Fwc3VsYXRlZCBBWC4yNSBwYWNrZXQgdG8gdGhlIEFYLjI1IGxheWVyLiAqLworc3RhdGljIHZvaWQgYXhfYnVtcChzdHJ1Y3QgYXhfZGlzcCAqYXgpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgY291bnQ7CisKKwlzcGluX2xvY2tfYmgoJmF4LT5idWZsb2NrKTsKKwlpZiAoYXgtPnJidWZmWzBdID4gMHgwZikgeworCQlpZiAoYXgtPnJidWZmWzBdICYgMHgyMCkgeworCQkgICAgICAgIGF4LT5jcmNtb2RlID0gQ1JDX01PREVfRkxFWDsKKwkJCWlmIChjaGVja19jcmNfZmxleChheC0+cmJ1ZmYsIGF4LT5yY291bnQpIDwgMCkgeworCQkJICAgICAgICBheC0+cnhfZXJyb3JzKys7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYXgtPnJjb3VudCAtPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgLyogZGw5c2F1IGJ1Z2ZpeDogdGhlIHRyYWlsbGluZyB0d28gYnl0ZXMgZmxleG5ldCBjcmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHdpbGwgbm90IGJlIHBhc3NlZCB0byB0aGUga2VybmVsLiB0aHVzIHdlIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGNvcnJlY3QgdGhlIGtpc3NwYXJtIHNpZ25hdHVyZSwgYmVjYXVzZSBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICogaW5kaWNhdGVzIGEgY3JjIGJ1dCB0aGVyZSdzIG5vbmUKKwkJCSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKmF4LT5yYnVmZiAmPSB+MHgyMDsKKwkJfQorIAl9CisJc3Bpbl91bmxvY2tfYmgoJmF4LT5idWZsb2NrKTsKKworCWNvdW50ID0gYXgtPnJjb3VudDsKKworCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYihjb3VudCkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJta2lzczogJXM6IG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBheC0+ZGV2LT5uYW1lKTsKKwkJYXgtPnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKworCXNrYi0+ZGV2ICAgICAgPSBheC0+ZGV2OworCXNwaW5fbG9ja19iaCgmYXgtPmJ1ZmxvY2spOworCW1lbWNweShza2JfcHV0KHNrYixjb3VudCksIGF4LT5yYnVmZiwgY291bnQpOworCXNwaW5fdW5sb2NrX2JoKCZheC0+YnVmbG9jayk7CisJc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVgyNSk7CisJbmV0aWZfcngoc2tiKTsKKwlheC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlheC0+cnhfcGFja2V0cysrOworCWF4LT5yeF9ieXRlcys9Y291bnQ7Cit9CisKKy8qIEVuY2Fwc3VsYXRlIG9uZSBBWC4yNSBwYWNrZXQgYW5kIHN0dWZmIGludG8gYSBUVFkgcXVldWUuICovCitzdGF0aWMgdm9pZCBheF9lbmNhcHMoc3RydWN0IGF4X2Rpc3AgKmF4LCB1bnNpZ25lZCBjaGFyICppY3AsIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgYWN0dWFsLCBjb3VudDsKKworCWlmIChheC0+bXR1ICE9IGF4LT5kZXYtPm10dSArIDczKQkvKiBTb21lb25lIGhhcyBiZWVuIGlmY29uZmlnZ2luZyAqLworCQlheF9jaGFuZ2VkbXR1KGF4KTsKKworCWlmIChsZW4gPiBheC0+bXR1KSB7CQkvKiBTaWdoLCBzaG91bGRuJ3Qgb2NjdXIgQlVUIC4uLiAqLworCQlsZW4gPSBheC0+bXR1OworCQlwcmludGsoS0VSTl9FUlIgIm1raXNzOiAlczogdHJ1bmNhdGluZyBvdmVyc2l6ZWQgdHJhbnNtaXQgcGFja2V0IVxuIiwgYXgtPmRldi0+bmFtZSk7CisJCWF4LT50eF9kcm9wcGVkKys7CisJCWF4X3VubG9jayhheCk7CisJCXJldHVybjsKKwl9CisKKwlwID0gaWNwOworCisJc3Bpbl9sb2NrX2JoKCZheC0+YnVmbG9jayk7CisgICAgICAgIHN3aXRjaCAoYXgtPmNyY21vZGUpIHsKKwkgICAgICAgICB1bnNpZ25lZCBzaG9ydCBjcmM7CisKKwljYXNlIENSQ19NT0RFX0ZMRVg6CisJICAgICAgICAgKnAgfD0gMHgyMDsKKwkgICAgICAgICBjcmMgPSBjYWxjX2NyY19mbGV4KHAsIGxlbik7CisJCSBjb3VudCA9IGtpc3NfZXNjX2NyYyhwLCAodW5zaWduZWQgY2hhciAqKWF4LT54YnVmZiwgY3JjLCBsZW4rMik7CisJCSBicmVhazsKKworCWRlZmF1bHQ6CisJICAgICAgICAgY291bnQgPSBraXNzX2VzYyhwLCAodW5zaWduZWQgY2hhciAqKWF4LT54YnVmZiwgbGVuKTsKKwkJIGJyZWFrOworCX0KKwkKKwlheC0+dHR5LT5mbGFncyB8PSAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwlhY3R1YWwgPSBheC0+dHR5LT5kcml2ZXItPndyaXRlKGF4LT50dHksIGF4LT54YnVmZiwgY291bnQpOworCWF4LT50eF9wYWNrZXRzKys7CisJYXgtPnR4X2J5dGVzKz1hY3R1YWw7CisJYXgtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWF4LT54bGVmdCA9IGNvdW50IC0gYWN0dWFsOworCWF4LT54aGVhZCA9IGF4LT54YnVmZiArIGFjdHVhbDsKKworCXNwaW5fdW5sb2NrX2JoKCZheC0+YnVmbG9jayk7Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgdGhlIGRyaXZlciB3aGVuIHRoZXJlJ3Mgcm9vbSBmb3IgbW9yZSBkYXRhLiAgSWYgd2UgaGF2ZQorICogbW9yZSBwYWNrZXRzIHRvIHNlbmQsIHdlIHNlbmQgdGhlbSBoZXJlLgorICovCitzdGF0aWMgdm9pZCBheDI1X3dyaXRlX3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludCBhY3R1YWw7CisJc3RydWN0IGF4X2Rpc3AgKmF4ID0gKHN0cnVjdCBheF9kaXNwICopIHR0eS0+ZGlzY19kYXRhOworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIGNvbm5lY3RlZC4gKi8KKwlpZiAoYXggPT0gTlVMTCB8fCBheC0+bWFnaWMgIT0gQVgyNV9NQUdJQyB8fCAhbmV0aWZfcnVubmluZyhheC0+ZGV2KSkKKwkJcmV0dXJuOworCWlmIChheC0+eGxlZnQgPD0gMCkgIHsKKwkJLyogTm93IHNlcmlhbCBidWZmZXIgaXMgYWxtb3N0IGZyZWUgJiB3ZSBjYW4gc3RhcnQKKwkJICogdHJhbnNtaXNzaW9uIG9mIGFub3RoZXIgcGFja2V0CisJCSAqLworCQl0dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKworCQluZXRpZl93YWtlX3F1ZXVlKGF4LT5kZXYpOworCQlyZXR1cm47CisJfQorCisJYWN0dWFsID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgYXgtPnhoZWFkLCBheC0+eGxlZnQpOworCWF4LT54bGVmdCAtPSBhY3R1YWw7CisJYXgtPnhoZWFkICs9IGFjdHVhbDsKK30KKworLyogRW5jYXBzdWxhdGUgYW4gQVguMjUgcGFja2V0IGFuZCBraWNrIGl0IGludG8gYSBUVFkgcXVldWUuICovCitzdGF0aWMgaW50IGF4X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXhfZGlzcCAqYXggPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpICB7CisJCXByaW50ayhLRVJOX0VSUiAibWtpc3M6ICVzOiB4bWl0IGNhbGwgd2hlbiBpZmFjZSBpcyBkb3duXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCS8qCisJCSAqIE1heSBiZSB3ZSBtdXN0IGNoZWNrIHRyYW5zbWl0dGVyIHRpbWVvdXQgaGVyZSA/CisJCSAqICAgICAgMTQgT2N0IDE5OTQgRG1pdHJ5IEdvcm9kY2hhbmluLgorCQkgKi8KKwkJaWYgKGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0ICA8IDIwICogSFopIHsKKwkJCS8qIDIwIHNlYyB0aW1lb3V0IG5vdCByZWFjaGVkICovCisJCQlyZXR1cm4gMTsKKwkJfQorCisJCXByaW50ayhLRVJOX0VSUiAibWtpc3M6ICVzOiB0cmFuc21pdCB0aW1lZCBvdXQsICVzP1xuIiwgZGV2LT5uYW1lLAorCQkgICAgICAgKGF4LT50dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKGF4LT50dHkpIHx8IGF4LT54bGVmdCkgPworCQkgICAgICAgImJhZCBsaW5lIHF1YWxpdHkiIDogImRyaXZlciBlcnJvciIpOworCisJCWF4LT54bGVmdCA9IDA7CisJCWF4LT50dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwkJYXhfdW5sb2NrKGF4KTsKKwl9CisKKwkvKiBXZSB3ZXJlIG5vdCBidXN5LCBzbyB3ZSBhcmUgbm93Li4uIDotKSAqLworCWlmIChza2IgIT0gTlVMTCkgeworCQlheF9sb2NrKGF4KTsKKwkJYXhfZW5jYXBzKGF4LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19BWDI1KSB8fCBkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkKKworLyogUmV0dXJuIHRoZSBmcmFtZSB0eXBlIElEICovCitzdGF0aWMgaW50IGF4X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB0eXBlLAorCSAgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisjaWZkZWYgQ09ORklHX0lORVQKKwlpZiAodHlwZSAhPSBodG9ucyhFVEhfUF9BWDI1KSkKKwkJcmV0dXJuIGF4MjVfZW5jYXBzdWxhdGUoc2tiLCBkZXYsIHR5cGUsIGRhZGRyLCBzYWRkciwgbGVuKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXhfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyNpZmRlZiBDT05GSUdfSU5FVAorCXJldHVybiBheDI1X3JlYnVpbGRfaGVhZGVyKHNrYik7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKKyNlbmRpZgkvKiBDT05GSUdfe0FYMjUsQVgyNV9NT0RVTEV9ICovCisKKy8qIE9wZW4gdGhlIGxvdy1sZXZlbCBwYXJ0IG9mIHRoZSBBWDI1IGNoYW5uZWwuIEVhc3khICovCitzdGF0aWMgaW50IGF4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXhfZGlzcCAqYXggPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgbGVuOworCisJaWYgKGF4LT50dHkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBmcmFtZSBidWZmZXJzOgorCSAqCisJICogcmJ1ZmYJUmVjZWl2ZSBidWZmZXIuCisJICogeGJ1ZmYJVHJhbnNtaXQgYnVmZmVyLgorCSAqLworCWxlbiA9IGRldi0+bXR1ICogMjsKKworCS8qCisJICogYWxsb3cgZm9yIGFycml2YWwgb2YgbGFyZ2VyIFVEUCBwYWNrZXRzLCBldmVuIGlmIHdlIHNheSBub3QgdG8KKwkgKiBhbHNvIGZpeGVzIGEgYnVnIGluIHdoaWNoIFN1bk9TIHNlbmRzIDUxMi1ieXRlIHBhY2tldHMgZXZlbiB3aXRoCisJICogYW4gTVNTIG9mIDEyOAorCSAqLworCWlmIChsZW4gPCA1NzYgKiAyKQorCQlsZW4gPSA1NzYgKiAyOworCisJaWYgKChheC0+cmJ1ZmYgPSBrbWFsbG9jKGxlbiArIDQsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlnb3RvIG5vcmJ1ZmY7CisKKwlpZiAoKGF4LT54YnVmZiA9IGttYWxsb2MobGVuICsgNCwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCWdvdG8gbm94YnVmZjsKKworCWF4LT5tdHUJICAgICA9IGRldi0+bXR1ICsgNzM7CisJYXgtPmJ1ZmZzaXplID0gbGVuOworCWF4LT5yY291bnQgICA9IDA7CisJYXgtPnhsZWZ0ICAgID0gMDsKKworCWF4LT5mbGFncyAgICY9ICgxIDw8IEFYRl9JTlVTRSk7ICAgICAgLyogQ2xlYXIgRVNDQVBFICYgRVJST1IgZmxhZ3MgKi8KKworCXNwaW5fbG9ja19pbml0KCZheC0+YnVmbG9jayk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworCitub3hidWZmOgorCWtmcmVlKGF4LT5yYnVmZik7CisKK25vcmJ1ZmY6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKworLyogQ2xvc2UgdGhlIGxvdy1sZXZlbCBwYXJ0IG9mIHRoZSBBWDI1IGNoYW5uZWwuIEVhc3khICovCitzdGF0aWMgaW50IGF4X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF4X2Rpc3AgKmF4ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChheC0+dHR5ID09IE5VTEwpCisJCXJldHVybiAtRUJVU1k7CisKKwlheC0+dHR5LT5mbGFncyAmPSB+KDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBheDI1X3JlY2VpdmVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJldHVybiA2NTUzNjsgIC8qIFdlIGNhbiBoYW5kbGUgYW4gaW5maW5pdGUgYW1vdW50IG9mIGRhdGEuIDotKSAqLworfQorCisvKgorICogSGFuZGxlIHRoZSAncmVjZWl2ZXIgZGF0YSByZWFkeScgaW50ZXJydXB0LgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlICd0dHlfaW8nIG1vZHVsZSBpbiB0aGUga2VybmVsIHdoZW4KKyAqIGEgYmxvY2sgb2YgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCwgd2hpY2ggY2FuIG5vdyBiZSBkZWNhcHN1bGF0ZWQKKyAqIGFuZCBzZW50IG9uIHRvIHRoZSBBWC4yNSBsYXllciBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgorICovCitzdGF0aWMgdm9pZCBheDI1X3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQoreworCXN0cnVjdCBheF9kaXNwICpheCA9IChzdHJ1Y3QgYXhfZGlzcCAqKSB0dHktPmRpc2NfZGF0YTsKKworCWlmIChheCA9PSBOVUxMIHx8IGF4LT5tYWdpYyAhPSBBWDI1X01BR0lDIHx8ICFuZXRpZl9ydW5uaW5nKGF4LT5kZXYpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIEFyZ2ghIG10dSBjaGFuZ2UgdGltZSEgLSBjb3N0cyB1cyB0aGUgcGFja2V0IHBhcnQgcmVjZWl2ZWQKKwkgKiBhdCB0aGUgY2hhbmdlCisJICovCisJaWYgKGF4LT5tdHUgIT0gYXgtPmRldi0+bXR1ICsgNzMpCisJCWF4X2NoYW5nZWRtdHUoYXgpOworCisJLyogUmVhZCB0aGUgY2hhcmFjdGVycyBvdXQgb2YgdGhlIGJ1ZmZlciAqLworCXdoaWxlIChjb3VudC0tKSB7CisJCWlmIChmcCAhPSBOVUxMICYmICpmcCsrKSB7CisJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoQVhGX0VSUk9SLCAmYXgtPmZsYWdzKSkKKwkJCQlheC0+cnhfZXJyb3JzKys7CisJCQljcCsrOworCQkJY29udGludWU7CisJCX0KKworCQlraXNzX3VuZXNjKGF4LCAqY3ArKyk7CisJfQorfQorCitzdGF0aWMgaW50IGF4MjVfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBheF9kaXNwICpheCA9IChzdHJ1Y3QgYXhfZGlzcCAqKSB0dHktPmRpc2NfZGF0YTsKKwlpbnQgZXJyOworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIG5vdCBhbHJlYWR5IGNvbm5lY3RlZC4gKi8KKwlpZiAoYXggJiYgYXgtPm1hZ2ljID09IEFYMjVfTUFHSUMpCisJCXJldHVybiAtRUVYSVNUOworCisJLyogT0suICBGaW5kIGEgZnJlZSBBWDI1IGNoYW5uZWwgdG8gdXNlLiAqLworCWlmICgoYXggPSBheF9hbGxvYygpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVORklMRTsKKworCWF4LT50dHkgPSB0dHk7CisJdHR5LT5kaXNjX2RhdGEgPSBheDsKKworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisKKwkvKiBSZXN0b3JlIGRlZmF1bHQgc2V0dGluZ3MgKi8KKwlheC0+ZGV2LT50eXBlID0gQVJQSFJEX0FYMjU7CisKKwkvKiBQZXJmb3JtIHRoZSBsb3ctbGV2ZWwgQVgyNSBpbml0aWFsaXphdGlvbi4gKi8KKwlpZiAoKGVyciA9IGF4X29wZW4oYXgtPmRldikpKQorCQlyZXR1cm4gZXJyOworCisJLyogRG9uZS4gIFdlIGhhdmUgbGlua2VkIHRoZSBUVFkgbGluZSB0byBhIGNoYW5uZWwuICovCisJcmV0dXJuIGF4LT5kZXYtPmJhc2VfYWRkcjsKK30KKworc3RhdGljIHZvaWQgYXgyNV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBheF9kaXNwICpheCA9IChzdHJ1Y3QgYXhfZGlzcCAqKSB0dHktPmRpc2NfZGF0YTsKKworCS8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuICovCisJaWYgKGF4ID09IE5VTEwgfHwgYXgtPm1hZ2ljICE9IEFYMjVfTUFHSUMpCisJCXJldHVybjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGF4LT5kZXYpOworCisJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOworCWF4LT50dHkgICAgICAgID0gTlVMTDsKKworCWF4X2ZyZWUoYXgpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXhfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBheF9kaXNwICpheCA9IG5ldGRldl9wcml2KGRldik7CisKKwltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKworCXN0YXRzLnJ4X3BhY2tldHMgICAgID0gYXgtPnJ4X3BhY2tldHM7CisJc3RhdHMudHhfcGFja2V0cyAgICAgPSBheC0+dHhfcGFja2V0czsKKwlzdGF0cy5yeF9ieXRlcwkgICAgID0gYXgtPnJ4X2J5dGVzOworCXN0YXRzLnR4X2J5dGVzICAgICAgID0gYXgtPnR4X2J5dGVzOworCXN0YXRzLnJ4X2Ryb3BwZWQgICAgID0gYXgtPnJ4X2Ryb3BwZWQ7CisJc3RhdHMudHhfZHJvcHBlZCAgICAgPSBheC0+dHhfZHJvcHBlZDsKKwlzdGF0cy50eF9lcnJvcnMgICAgICA9IGF4LT50eF9lcnJvcnM7CisJc3RhdHMucnhfZXJyb3JzICAgICAgPSBheC0+cnhfZXJyb3JzOworCXN0YXRzLnJ4X292ZXJfZXJyb3JzID0gYXgtPnJ4X292ZXJfZXJyb3JzOworCisJcmV0dXJuICZzdGF0czsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCSAgIFNUQU5EQVJEIEVOQ0FQU1VMQVRJT04JICAgICAgICAJICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQga2lzc19lc2ModW5zaWduZWQgY2hhciAqcywgdW5zaWduZWQgY2hhciAqZCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSBkOworCXVuc2lnbmVkIGNoYXIgYzsKKworCS8qCisJICogU2VuZCBhbiBpbml0aWFsIEVORCBjaGFyYWN0ZXIgdG8gZmx1c2ggb3V0IGFueQorCSAqIGRhdGEgdGhhdCBtYXkgaGF2ZSBhY2N1bXVsYXRlZCBpbiB0aGUgcmVjZWl2ZXIKKwkgKiBkdWUgdG8gbGluZSBub2lzZS4KKwkgKi8KKworCSpwdHIrKyA9IEVORDsKKworCXdoaWxlIChsZW4tLSA+IDApIHsKKwkJc3dpdGNoIChjID0gKnMrKykgeworCQkJY2FzZSBFTkQ6CisJCQkJKnB0cisrID0gRVNDOworCQkJCSpwdHIrKyA9IEVTQ19FTkQ7CisJCQkJYnJlYWs7CisJCQljYXNlIEVTQzoKKwkJCQkqcHRyKysgPSBFU0M7CisJCQkJKnB0cisrID0gRVNDX0VTQzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJKnB0cisrID0gYzsKKwkJCQlicmVhazsKKwkJfQorCX0KKworCSpwdHIrKyA9IEVORDsKKworCXJldHVybiBwdHIgLSBkOworfQorCisvKgorICogTVc6CisgKiBPSyBpdHMgdWdseSwgYnV0IHRlbGwgbWUgYSBiZXR0ZXIgc29sdXRpb24gd2l0aG91dCBjb3B5aW5nIHRoZQorICogcGFja2V0IHRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciA6LSkKKyAqLworc3RhdGljIGludCBraXNzX2VzY19jcmModW5zaWduZWQgY2hhciAqcywgdW5zaWduZWQgY2hhciAqZCwgdW5zaWduZWQgc2hvcnQgY3JjLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IGQ7CisJdW5zaWduZWQgY2hhciBjPTA7CisKKwkqcHRyKysgPSBFTkQ7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJaWYgKGxlbiA+IDIpIAorCQkJYyA9ICpzKys7CisJCWVsc2UgaWYgKGxlbiA+IDEpCisJCQljID0gY3JjID4+IDg7CisJCWVsc2UgaWYgKGxlbiA+IDApCisJCQljID0gY3JjICYgMHhmZjsKKworCQlsZW4tLTsKKworCQlzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSBFU0M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9IEVTQ19FTkQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFU0M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9IEVTQzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gRVNDX0VTQzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJfQorCX0KKwkqcHRyKysgPSBFTkQ7CisJcmV0dXJuIHB0ciAtIGQ7CQkKK30KKworc3RhdGljIHZvaWQga2lzc191bmVzYyhzdHJ1Y3QgYXhfZGlzcCAqYXgsIHVuc2lnbmVkIGNoYXIgcykKK3sKKwlzd2l0Y2ggKHMpIHsKKwkJY2FzZSBFTkQ6CisJCQkvKiBkcm9wIGtlZXB0ZXN0IGJpdCA9IFZTViAqLworCQkJaWYgKHRlc3RfYml0KEFYRl9LRUVQVEVTVCwgJmF4LT5mbGFncykpCisJCQkJY2xlYXJfYml0KEFYRl9LRUVQVEVTVCwgJmF4LT5mbGFncyk7CisKKwkJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEFYRl9FUlJPUiwgJmF4LT5mbGFncykgJiYgKGF4LT5yY291bnQgPiAyKSkKKwkJCQlheF9idW1wKGF4KTsKKworCQkJY2xlYXJfYml0KEFYRl9FU0NBUEUsICZheC0+ZmxhZ3MpOworCQkJYXgtPnJjb3VudCA9IDA7CisJCQlyZXR1cm47CisKKwkJY2FzZSBFU0M6CisJCQlzZXRfYml0KEFYRl9FU0NBUEUsICZheC0+ZmxhZ3MpOworCQkJcmV0dXJuOworCQljYXNlIEVTQ19FU0M6CisJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFYRl9FU0NBUEUsICZheC0+ZmxhZ3MpKQorCQkJCXMgPSBFU0M7CisJCQlicmVhazsKKwkJY2FzZSBFU0NfRU5EOgorCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChBWEZfRVNDQVBFLCAmYXgtPmZsYWdzKSkKKwkJCQlzID0gRU5EOworCQkJYnJlYWs7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZheC0+YnVmbG9jayk7CisJaWYgKCF0ZXN0X2JpdChBWEZfRVJST1IsICZheC0+ZmxhZ3MpKSB7CisJCWlmIChheC0+cmNvdW50IDwgYXgtPmJ1ZmZzaXplKSB7CisJCQlheC0+cmJ1ZmZbYXgtPnJjb3VudCsrXSA9IHM7CisJCQlzcGluX3VubG9ja19iaCgmYXgtPmJ1ZmxvY2spOworCQkJcmV0dXJuOworCQl9CisKKwkJYXgtPnJ4X292ZXJfZXJyb3JzKys7CisJCXNldF9iaXQoQVhGX0VSUk9SLCAmYXgtPmZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmF4LT5idWZsb2NrKTsKK30KKworCitzdGF0aWMgaW50IGF4X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkIF9fdXNlciAqYWRkcikKK3sKKwlpZiAoY29weV9mcm9tX3VzZXIoZGV2LT5kZXZfYWRkciwgYWRkciwgQVgyNV9BRERSX0xFTikpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF4X3NldF9kZXZfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gYWRkcjsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBzYS0+c2FfZGF0YSwgQVgyNV9BRERSX0xFTik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBQZXJmb3JtIEkvTyBjb250cm9sIG9uIGFuIGFjdGl2ZSBheDI1IGNoYW5uZWwuICovCitzdGF0aWMgaW50IGF4MjVfZGlzcF9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB2b2lkICpmaWxlLCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBheF9kaXNwICpheCA9IChzdHJ1Y3QgYXhfZGlzcCAqKSB0dHktPmRpc2NfZGF0YTsKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIGNvbm5lY3RlZC4gKi8KKwlpZiAoYXggPT0gTlVMTCB8fCBheC0+bWFnaWMgIT0gQVgyNV9NQUdJQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNtZCkgeworCSAJY2FzZSBTSU9DR0lGTkFNRToKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBheC0+ZGV2LT5uYW1lLCBzdHJsZW4oYXgtPmRldi0+bmFtZSkgKyAxKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU0lPQ0dJRkVOQ0FQOgorCQkJcmV0dXJuIHB1dF91c2VyKDQsIChpbnQgX191c2VyICopYXJnKTsKKworCQljYXNlIFNJT0NTSUZFTkNBUDoKKwkJCWlmIChnZXRfdXNlcih0bXAsIChpbnQgX191c2VyICopYXJnKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWF4LT5tb2RlID0gdG1wOworCQkJYXgtPmRldi0+YWRkcl9sZW4gICAgICAgID0gQVgyNV9BRERSX0xFTjsJICAvKiBzaXplb2YgYW4gQVguMjUgYWRkciAqLworCQkJYXgtPmRldi0+aGFyZF9oZWFkZXJfbGVuID0gQVgyNV9LSVNTX0hFQURFUl9MRU4gKyBBWDI1X01BWF9IRUFERVJfTEVOICsgMzsKKwkJCWF4LT5kZXYtPnR5cGUgICAgICAgICAgICA9IEFSUEhSRF9BWDI1OworCQkJcmV0dXJuIDA7CisKKwkJIGNhc2UgU0lPQ1NJRkhXQUREUjoKKwkJCXJldHVybiBheF9zZXRfbWFjX2FkZHJlc3MoYXgtPmRldiwgYXJnKTsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXhfb3Blbl9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXhfZGlzcCAqYXggPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGF4LT50dHkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBJbml0aWFsaXplIHRoZSBkcml2ZXIuICBDYWxsZWQgYnkgbmV0d29yayBzdGFydHVwLiAqLworc3RhdGljIGludCBheDI1X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXhfZGlzcCAqYXggPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RhdGljIGNoYXIgYXgyNV9iY2FzdFtBWDI1X0FERFJfTEVOXSA9CisJCXsnUSc8PDEsJ1MnPDwxLCdUJzw8MSwnICc8PDEsJyAnPDwxLCcgJzw8MSwnMCc8PDF9OworCXN0YXRpYyBjaGFyIGF4MjVfdGVzdFtBWDI1X0FERFJfTEVOXSA9CisJCXsnTCc8PDEsJ0knPDwxLCdOJzw8MSwnVSc8PDEsJ1gnPDwxLCcgJzw8MSwnMSc8PDF9OworCisJaWYgKGF4ID09IE5VTEwpCQkvKiBBbGxvY2F0aW9uIGZhaWxlZCA/PyAqLworCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFNldCB1cCB0aGUgIkFYMjUgQ29udHJvbCBCbG9jayIuIChBbmQgY2xlYXIgc3RhdGlzdGljcykgKi8KKwltZW1zZXQoYXgsIDAsIHNpemVvZiAoc3RydWN0IGF4X2Rpc3ApKTsKKwlheC0+bWFnaWMgID0gQVgyNV9NQUdJQzsKKwlheC0+ZGV2CSAgID0gZGV2OworCisJLyogRmluaXNoIHNldHRpbmcgdXAgdGhlIERFVklDRSBpbmZvLiAqLworCWRldi0+bXR1ICAgICAgICAgICAgID0gQVhfTVRVOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYXhfeG1pdDsKKwlkZXYtPm9wZW4gICAgICAgICAgICA9IGF4X29wZW5fZGV2OworCWRldi0+c3RvcCAgICAgICAgICAgID0gYXhfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMJICAgICA9IGF4X2dldF9zdGF0czsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGF4X3NldF9kZXZfbWFjX2FkZHJlc3M7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSAwOworCWRldi0+YWRkcl9sZW4gICAgICAgID0gMDsKKwlkZXYtPnR5cGUgICAgICAgICAgICA9IEFSUEhSRF9BWDI1OworCWRldi0+dHhfcXVldWVfbGVuICAgID0gMTA7CisJZGV2LT5oYXJkX2hlYWRlciAgICAgPSBheF9oZWFkZXI7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciAgPSBheF9yZWJ1aWxkX2hlYWRlcjsKKworCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgYXgyNV9iY2FzdCwgQVgyNV9BRERSX0xFTik7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICBheDI1X3Rlc3QsICBBWDI1X0FERFJfTEVOKTsKKworCS8qIE5ldy1zdHlsZSBmbGFncy4gKi8KKwlkZXYtPmZsYWdzICAgICAgPSBJRkZfQlJPQURDQVNUIHwgSUZGX01VTFRJQ0FTVDsKKworCXJldHVybiAwOworfQorCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqCQkJSW5pdCBNS0lTUyBkcml2ZXIJCQkgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgaW50IF9faW5pdCBta2lzc19pbml0X2RyaXZlcih2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlwcmludGsoYmFubmVyKTsKKworCWlmIChheDI1X21heGRldiA8IDQpCisJICBheDI1X21heGRldiA9IDQ7IC8qIFNhbml0eSAqLworCisJaWYgKChheDI1X2N0cmxzID0ga21hbGxvYyhzaXplb2Yodm9pZCAqKSAqIGF4MjVfbWF4ZGV2LCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1raXNzOiBDYW4ndCBhbGxvY2F0ZSBheDI1X2N0cmxzW10gYXJyYXkhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogQ2xlYXIgdGhlIHBvaW50ZXIgYXJyYXksIHdlIGFsbG9jYXRlIGRldmljZXMgd2hlbiB3ZSBuZWVkIHRoZW0gKi8KKwltZW1zZXQoYXgyNV9jdHJscywgMCwgc2l6ZW9mKHZvaWQqKSAqIGF4MjVfbWF4ZGV2KTsgLyogUG9pbnRlcnMgKi8KKworCS8qIEZpbGwgaW4gb3VyIGxpbmUgcHJvdG9jb2wgZGlzY2lwbGluZSwgYW5kIHJlZ2lzdGVyIGl0ICovCisJYXhfbGRpc2MubWFnaWMJCT0gVFRZX0xESVNDX01BR0lDOworCWF4X2xkaXNjLm5hbWUJCT0gIm1raXNzIjsKKwlheF9sZGlzYy5vcGVuCQk9IGF4MjVfb3BlbjsKKwlheF9sZGlzYy5jbG9zZQkJPSBheDI1X2Nsb3NlOworCWF4X2xkaXNjLmlvY3RsCQk9IChpbnQgKCopKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICosCisJCQkJCXVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZykpYXgyNV9kaXNwX2lvY3RsOworCWF4X2xkaXNjLnJlY2VpdmVfYnVmCT0gYXgyNV9yZWNlaXZlX2J1ZjsKKwlheF9sZGlzYy5yZWNlaXZlX3Jvb20JPSBheDI1X3JlY2VpdmVfcm9vbTsKKwlheF9sZGlzYy53cml0ZV93YWtldXAJPSBheDI1X3dyaXRlX3dha2V1cDsKKworCWlmICgoc3RhdHVzID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fQVgyNSwgJmF4X2xkaXNjKSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1raXNzOiBjYW4ndCByZWdpc3RlciBsaW5lIGRpc2NpcGxpbmUgKGVyciA9ICVkKVxuIiwgc3RhdHVzKTsKKwkJa2ZyZWUoYXgyNV9jdHJscyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBta2lzc19leGl0X2RyaXZlcih2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGF4MjVfbWF4ZGV2OyBpKyspIHsKKwkJaWYgKGF4MjVfY3RybHNbaV0pIHsKKwkJCS8qCisJCQkqIFZTViA9IGlmIGRldi0+c3RhcnQ9PTAsIHRoZW4gZGV2aWNlCisJCQkqIHVucmVnaXN0ZXJlZCB3aGlsZSBjbG9zZSBwcm9jLgorCQkJKi8KKwkJCWlmIChuZXRpZl9ydW5uaW5nKCZheDI1X2N0cmxzW2ldLT5kZXYpKQorCQkJCXVucmVnaXN0ZXJfbmV0ZGV2KCZheDI1X2N0cmxzW2ldLT5kZXYpOworCQkJa2ZyZWUoYXgyNV9jdHJsc1tpXSk7CisJCX0KKwl9CisKKwlrZnJlZShheDI1X2N0cmxzKTsKKwlheDI1X2N0cmxzID0gTlVMTDsKKworCWlmICgoaSA9IHR0eV9yZWdpc3Rlcl9sZGlzYyhOX0FYMjUsIE5VTEwpKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJta2lzczogY2FuJ3QgdW5yZWdpc3RlciBsaW5lIGRpc2NpcGxpbmUgKGVyciA9ICVkKVxuIiwgaSk7Cit9CisKK01PRFVMRV9BVVRIT1IoIkhhbnMgQWxiYXMgUEUxQVlYIDxoYW5zQGVzcmFjLmVsZS50dWUubmw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIktJU1MgZHJpdmVyIGZvciBBWC4yNSBvdmVyIFRUWXMiKTsKK01PRFVMRV9QQVJNKGF4MjVfbWF4ZGV2LCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhheDI1X21heGRldiwgIm51bWJlciBvZiBNS0lTUyBkZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTERJU0MoTl9BWDI1KTsKK21vZHVsZV9pbml0KG1raXNzX2luaXRfZHJpdmVyKTsKK21vZHVsZV9leGl0KG1raXNzX2V4aXRfZHJpdmVyKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuaCBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiNzAwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmgKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCURlZmluZXMgZm9yIHRoZSBNdWx0aS1LSVNTIGRyaXZlci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEFYMjVfTUFYREVWCTE2CQkvKiBNQVggbnVtYmVyIG9mIEFYMjUgY2hhbm5lbHM7CisJCQkJCSAgIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aAorCQkJCQkgICBpbnNtb2QgLW9heDI1X21heGRldj1ubm4JKi8KKyNkZWZpbmUgQVhfTVRVCQkyMzYJCisKKy8qIFNMSVAvS0lTUyBwcm90b2NvbCBjaGFyYWN0ZXJzLiAqLworI2RlZmluZSBFTkQgICAgICAgICAgICAgMDMwMAkJLyogaW5kaWNhdGVzIGVuZCBvZiBmcmFtZQkqLworI2RlZmluZSBFU0MgICAgICAgICAgICAgMDMzMwkJLyogaW5kaWNhdGVzIGJ5dGUgc3R1ZmZpbmcJKi8KKyNkZWZpbmUgRVNDX0VORCAgICAgICAgIDAzMzQJCS8qIEVTQyBFU0NfRU5EIG1lYW5zIEVORCAnZGF0YScJKi8KKyNkZWZpbmUgRVNDX0VTQyAgICAgICAgIDAzMzUJCS8qIEVTQyBFU0NfRVNDIG1lYW5zIEVTQyAnZGF0YScJKi8KKworc3RydWN0IGF4X2Rpc3AgeworCWludCAgICAgICAgICAgICAgICBtYWdpYzsKKworCS8qIFZhcmlvdXMgZmllbGRzLiAqLworCXN0cnVjdCB0dHlfc3RydWN0ICAqdHR5OwkJLyogcHRyIHRvIFRUWSBzdHJ1Y3R1cmUJCSovCisJc3RydWN0IG5ldF9kZXZpY2UgICAgICAqZGV2OwkJLyogZWFzeSBmb3IgaW50ciBoYW5kbGluZwkqLworCisJLyogVGhlc2UgYXJlIHBvaW50ZXJzIHRvIHRoZSBtYWxsb2MoKWVkIGZyYW1lIGJ1ZmZlcnMuICovCisJdW5zaWduZWQgY2hhciAgICAgICpyYnVmZjsJCS8qIHJlY2VpdmVyIGJ1ZmZlcgkJKi8KKwlpbnQgICAgICAgICAgICAgICAgcmNvdW50OwkJLyogcmVjZWl2ZWQgY2hhcnMgY291bnRlciAgICAgICAqLworCXVuc2lnbmVkIGNoYXIgICAgICAqeGJ1ZmY7CQkvKiB0cmFuc21pdHRlciBidWZmZXIJCSovCisJdW5zaWduZWQgY2hhciAgICAgICp4aGVhZDsJCS8qIHBvaW50ZXIgdG8gbmV4dCBieXRlIHRvIFhNSVQgKi8KKwlpbnQgICAgICAgICAgICAgICAgeGxlZnQ7CQkvKiBieXRlcyBsZWZ0IGluIFhNSVQgcXVldWUgICAgICovCisKKwkvKiBTTElQIGludGVyZmFjZSBzdGF0aXN0aWNzLiAqLworCXVuc2lnbmVkIGxvbmcgICAgICByeF9wYWNrZXRzOwkJLyogaW5ib3VuZCBmcmFtZXMgY291bnRlcgkqLworCXVuc2lnbmVkIGxvbmcgICAgICB0eF9wYWNrZXRzOwkJLyogb3V0Ym91bmQgZnJhbWVzIGNvdW50ZXIgICAgICAqLworCXVuc2lnbmVkIGxvbmcgICAgICByeF9ieXRlczsJCS8qIGluYm91bmQgYnl0ZXMgY291bnRlciAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nICAgICAgdHhfYnl0ZXM7CQkvKiBvdXRib3VuZCBieXRlcyBjb3VudGVyICAgICAgICovCisJdW5zaWduZWQgbG9uZyAgICAgIHJ4X2Vycm9yczsJCS8qIFBhcml0eSwgZXRjLiBlcnJvcnMgICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nICAgICAgdHhfZXJyb3JzOwkJLyogUGxhbm5lZCBzdHVmZiAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgICAgICByeF9kcm9wcGVkOwkJLyogTm8gbWVtb3J5IGZvciBza2IgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgICAgICB0eF9kcm9wcGVkOwkJLyogV2hlbiBNVFUgY2hhbmdlICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgICAgICByeF9vdmVyX2Vycm9yczsJLyogRnJhbWUgYmlnZ2VyIHRoZW4gU0xJUCBidWYuICAqLworCisJLyogRGV0YWlsZWQgU0xJUCBzdGF0aXN0aWNzLiAqLworCWludCAgICAgICAgICAgICAgICAgbXR1OwkJLyogT3VyIG10dSAodG8gc3BvdCBjaGFuZ2VzISkgICAqLworCWludCAgICAgICAgICAgICAgICAgYnVmZnNpemU7CQkvKiBNYXggYnVmZmVycyBzaXplcyAgICAgICAgICAgICovCisKKworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsJCS8qIEZsYWcgdmFsdWVzLyBtb2RlIGV0YwkqLworCQkJCQkvKiBsb25nIHJlcSdkOiB1c2VkIGJ5IHNldF9iaXQgLS1SUiAqLworI2RlZmluZSBBWEZfSU5VU0UJMAkJLyogQ2hhbm5lbCBpbiB1c2UgICAgICAgICAgICAgICAqLworI2RlZmluZSBBWEZfRVNDQVBFCTEgICAgICAgICAgICAgICAvKiBFU0MgcmVjZWl2ZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFYRl9FUlJPUgkyICAgICAgICAgICAgICAgLyogUGFyaXR5LCBldGMuIGVycm9yICAgICAgICAgICAqLworI2RlZmluZSBBWEZfS0VFUFRFU1QJMwkJLyogS2VlcGFsaXZlIHRlc3QgZmxhZwkJKi8KKyNkZWZpbmUgQVhGX09VVFdBSVQJNAkJLyogaXMgb3V0cGFja2V0IHdhcyBmbGFnCSovCisKKwlpbnQgICAgICAgICAgICAgICAgIG1vZGU7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgY3JjbW9kZTsgICAgLyogTVc6IGZvciBGbGV4TmV0LCBTTUFDSyBldGMuICAqLyAKKyNkZWZpbmUgQ1JDX01PREVfTk9ORSAgIDAKKyNkZWZpbmUgQ1JDX01PREVfRkxFWCAgIDEKKyNkZWZpbmUgQ1JDX01PREVfU01BQ0sgIDIKKwlzcGlubG9ja190ICAgICAgICAgIGJ1ZmxvY2s7CS8qIGxvY2sgZm9yIHJidWYgYW5kIHhidWYgKi8KK307CisKKyNkZWZpbmUgQVgyNV9NQUdJQwkJMHg1MzE2CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9zY2MuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3NjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOWU3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9zY2MuYwpAQCAtMCwwICsxLDIxOTEgQEAKKyNkZWZpbmUgUkNTX0lEICIkSWQ6IHNjYy5jLHYgMS43NSAxOTk4LzExLzA0IDE1OjE1OjAxIGpyZXV0ZXIgRXhwIGpyZXV0ZXIgJCIKKworI2RlZmluZSBWRVJTSU9OICIzLjAiCisKKy8qCisgKiBQbGVhc2UgdXNlIHo4NTMwZHJ2LXV0aWxzLTMuMCB3aXRoIHRoaXMgdmVyc2lvbi4KKyAqICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogWW91IGNhbiBmaW5kIGEgc3Vic2V0IG9mIHRoZSBkb2N1bWVudGF0aW9uIGluIAorICogRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3o4NTMwZHJ2LnR4dC4KKyAqLworCisvKgorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICogICBTQ0MuQyAtIExpbnV4IGRyaXZlciBmb3IgWjg1MzAgYmFzZWQgSERMQyBjYXJkcyBmb3IgQVguMjUgICAgICAqCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlDb3B5cmlnaHQgKGMpIDE5OTMsIDIwMDAgSm9lcmcgUmV1dGVyIERMMUJLRQorCisJcG9ydGlvbnMgKGMpIDE5OTMgR3VpZG8gdGVuIERvbGxlIFBFMU5OWgorCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgCisgICBUaGUgZHJpdmVyIGFuZCB0aGUgcHJvZ3JhbXMgaW4gdGhlIGFyY2hpdmUgYXJlIFVOREVSIENPTlNUUlVDVElPTi4KKyAgIFRoZSBjb2RlIGlzIGxpa2VseSB0byBmYWlsLCBhbmQgc28geW91ciBrZXJuZWwgY291bGQgLS0tIGV2ZW4gCisgICBhIHdob2xlIG5ldHdvcmsuIAorCisgICBUaGlzIGRyaXZlciBpcyBpbnRlbmRlZCBmb3IgQW1hdGV1ciBSYWRpbyB1c2UuIElmIHlvdSBhcmUgcnVubmluZyBpdAorICAgZm9yIGNvbW1lcmNpYWwgcHVycG9zZXMsIHBsZWFzZSBkcm9wIG1lIGEgbm90ZS4gSSBhbSBub3N5Li4uCisKKyAgIC4uLkJVVDoKKyAKKyAgICEgWW91ICBtIHUgcyB0ICByZWNvZ25pemUgdGhlIGFwcHJvcHJpYXRlIGxlZ2lzbGF0aW9ucyBvZiB5b3VyIGNvdW50cnkgIQorICAgISBiZWZvcmUgeW91IGNvbm5lY3QgYSByYWRpbyB0byB0aGUgU0NDIGJvYXJkIGFuZCBzdGFydCB0byB0cmFuc21pdCBvciAhCisgICAhIHJlY2VpdmUuIFRoZSBHUEwgYWxsb3dzIHlvdSB0byB1c2UgdGhlICBkIHIgaSB2IGUgciwgIE5PVCB0aGUgUkFESU8hICEKKworICAgRm9yIG5vbi1BbWF0ZXVyLVJhZGlvIHVzZSBwbGVhc2Ugbm90ZSB0aGF0IHlvdSBtaWdodCBuZWVkIGEgc3BlY2lhbAorICAgYWxsb3dhbmNlL2xpY2VuY2UgZnJvbSB0aGUgZGVzaWduZXIgb2YgdGhlIFNDQyBCb2FyZCBhbmQvb3IgdGhlCisgICBNT0RFTS4gCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IAorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSAobW9kaWZpZWQpIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICAgZGVsaXZlcmVkIHdpdGggdGhlIExpbnV4IGtlcm5lbCBzb3VyY2UuCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgZmluZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluIAorICAgL3Vzci9zcmMvbGludXgvQ09QWUlORzsgCisgICAKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorCisJCQorICAgSW5jb21wbGV0ZSBoaXN0b3J5IG9mIHo4NTMwZHJ2OgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAxOTk0LTA5LTEzCXN0YXJ0ZWQgdG8gd3JpdGUgdGhlIGRyaXZlciwgcmVzY3VlZCBtb3N0IG9mIG15IG93bgorCQljb2RlIChhbmQgSGFucyBBbGJsYXMnIG1lbW9yeSBidWZmZXIgcG9vbCBjb25jZXB0KSBmcm9tIAorCQlhbiBlYXJsaWVyIHByb2plY3QgInNjY2RydiIgd2hpY2ggd2FzIGluaXRpYXRlZCBieSAKKwkJR3VpZG8gdGVuIERvbGxlLiBOb3QgbXVjaCBvZiB0aGUgb2xkIGRyaXZlciBzdXJ2aXZlZCwgCisJCXRob3VnaC4gVGhlIGZpcnN0IHZlcnNpb24gSSBwdXQgbXkgaGFuZHMgb24gd2FzIHNjY2RydjEuMworCQlmcm9tIEF1Z3VzdCAxOTkzLiBUaGUgbWVtb3J5IGJ1ZmZlciBwb29sIGNvbmNlcHQKKwkJYXBwZWFyZWQgaW4gYW4gdW5hdXRob3JpemVkIHNjY2RydiB2ZXJzaW9uICgxLjUpIGZyb20KKwkJQXVndXN0IDE5OTQuCisKKyAgIDE5OTUtMDEtMzEJY2hhbmdlZCBjb3B5cmlnaHQgbm90aWNlIHRvIEdQTCB3aXRob3V0IGxpbWl0YXRpb25zLgorICAgCisgICAgIC4KKyAgICAgLgk8U05JUD4KKyAgICAgLgorICAgCQkgIAorICAgMTk5Ni0xMC0wNQlOZXcgc2VtZXN0ZXIsIG5ldyBkcml2ZXIuLi4gCisKKyAgIAkJICAqIEtJU1MgVE5DIGVtdWxhdG9yIHJlbW92ZWQgKFRUWSBkcml2ZXIpCisgICAJCSAgKiBTb3VyY2UgbW92ZWQgdG8gZHJpdmVycy9uZXQvCisgICAJCSAgKiBJbmNsdWRlcyBaODUzMCBkZWZpbmVzIGZyb20gZHJpdmVycy9uZXQvejg1MzAuaAorICAgCQkgICogVXNlcyBza19idWZmZXIgbWVtb3J5IG1hbmFnZW1lbnQKKyAgIAkJICAqIFJlZHVjZWQgb3ZlcmhlYWQgb2YgL3Byb2MvbmV0L3o4NTMwZHJ2IG91dHB1dAorICAgCQkgICogU3RyZWFtbGluZWQgcXVpdGUgYSBsb3QgdGhpbmdzCisgICAJCSAgKiBJbnZlbnRzIGJyYW5kIG5ldyBidWdzLi4uIDstKQorCisgICAJCSAgVGhlIG1vdmUgdG8gdmVyc2lvbiBudW1iZXIgMy4wIHJlZmxlY3RzIHRoZXNlcyBjaGFuZ2VzLgorICAgCQkgIFlvdSBjYW4gdXNlICdraXNzYnJpZGdlJyBpZiB5b3UgbmVlZCBhIEtJU1MgVE5DIGVtdWxhdG9yLgorCisgICAxOTk2LTEyLTEzCUZpeGVkIGZvciBMaW51eCBuZXR3b3JraW5nIGNoYW5nZXMuIChHNEtMWCkKKyAgIDE5OTctMDEtMDgJRml4ZWQgdGhlIHJlbWFpbmluZyBwcm9ibGVtcy4KKyAgIDE5OTctMDQtMDIJSG9wZWZ1bGx5IGZpeGVkIHRoZSBwcm9ibGVtcyB3aXRoIHRoZSBuZXcgKl90aW1lcigpCisgICAJCXJvdXRpbmVzLCBhZGRlZCBjYWxpYnJhdGlvbiBjb2RlLgorICAgMTk5Ny0xMC0xMglNYWRlIFNDQ19ERUxBWSBhIENPTkZJRyBvcHRpb24sIGFkZGVkIENPTkZJR19TQ0NfVFJYRUNITworICAgMTk5OC0wMS0yOQlTbWFsbCBmaXggdG8gYXZvaWQgbG9jay11cCBvbiBpbml0aWFsaXphdGlvbgorICAgMTk5OC0wOS0yOQlGaXhlZCB0aGUgImdyb3VwaW5nIiBidWdzLCB0eF9pbmhpYml0IHdvcmtzIGFnYWluLAorICAgCQl1c2luZyBkZXYtPnR4X3F1ZXVlX2xlbiBub3cgaW5zdGVhZCBvZiBNQVhRVUVVRSBub3cuCisgICAxOTk4LTEwLTIxCVBvc3Rwb25lZCB0aGUgc3BpbmxvY2sgY2hhbmdlcywgd291bGQgbmVlZCBhIGxvdCBvZgorICAgCQl0ZXN0aW5nIEkgY3VycmVudGx5IGRvbid0IGhhdmUgdGhlIHRpbWUgdG8uIFNvZnRkY2QgZG9lc24ndAorICAgCQl3b3JrLgorICAgMTk5OC0xMS0wNAlTb2Z0ZGNkIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IGluIERQTEwgbW9kZSwgaW4gZmFjdCBpdCAKKyAgIAkJbmV2ZXIgZGlkLiBUaGUgRFBMTCBsb2NrcyBvbiBub2lzZSwgdGhlIFNZTkMgdW5pdCBzZWVzCisgICAJCWZsYWdzIHRoYXQgYXJlbid0Li4uIFJlc3RhcnRpbmcgdGhlIERQTEwgZG9lcyBub3QgaGVscAorICAgCQllaXRoZXIsIGl0IHJlc3luY2hyb25pemVzIHRvbyBzbG93IGFuZCB0aGUgZmlyc3QgcmVjZWl2ZWQKKyAgIAkJZnJhbWUgZ2V0cyBsb3N0LgorICAgMjAwMC0wMi0xMwlGaXhlZCBmb3IgbmV3IG5ldHdvcmsgZHJpdmVyIGludGVyZmFjZSBjaGFuZ2VzLCBzdGlsbAorICAgCQlkb2VzIFRYIHRpbWVvdXRzIGl0c2VsZiBzaW5jZSBpdCB1c2VzIGl0cyBvd24gcXVldWUKKyAgIAkJc2NoZW1lLgorCisgICBUaGFua3MgdG8gYWxsIHdobyBjb250cmlidXRlZCB0byB0aGlzIGRyaXZlciB3aXRoIGlkZWFzIGFuZCBidWcKKyAgIHJlcG9ydHMhCisgICAKKyAgIE5CIC0tIGlmIHlvdSBmaW5kIGVycm9ycywgY2hhbmdlIHNvbWV0aGluZywgcGxlYXNlIGxldCBtZSBrbm93CisgICAgICAJIGZpcnN0IGJlZm9yZSB5b3UgZGlzdHJpYnV0ZSBpdC4uLiBBbmQgcGxlYXNlIGRvbid0IHRvdWNoCisgICAJIHRoZSB2ZXJzaW9uIG51bWJlci4gSnVzdCByZXBsYWNlIG15IGNhbGxzaWduIGluCisgICAJICJ2My4wLmRsMWJrZSIgd2l0aCB5b3VyIG93bi4gSnVzdCB0byBhdm9pZCBjb25mdXNpb24uLi4KKworICAgSWYgeW91IHdhbnQgdG8gYWRkIHlvdXIgbW9kaWZpY2F0aW9uIHRvIHRoZSBsaW51eCBkaXN0cmlidXRpb24KKyAgIHBsZWFzZSAoISkgY29udGFjdCBtZSBmaXJzdC4KKyAgIAorICAgTmV3IHZlcnNpb25zIG9mIHRoZSBkcml2ZXIgd2lsbCBiZSBhbm5vdW5jZWQgb24gdGhlIGxpbnV4LWhhbXMKKyAgIG1haWxpbmcgbGlzdCBvbiB2Z2VyLmtlcm5lbC5vcmcuIFRvIHN1YnNjcmliZSBzZW5kIGFuIGUtbWFpbAorICAgdG8gbWFqb3Jkb21vQHZnZXIua2VybmVsLm9yZyB3aXRoIHRoZSBmb2xsb3dpbmcgbGluZSBpbgorICAgdGhlIGJvZHkgb2YgdGhlIG1haWw6CisgICAKKwkgICBzdWJzY3JpYmUgbGludXgtaGFtcworCSAgIAorICAgVGhlIGNvbnRlbnQgb2YgdGhlICJTdWJqZWN0IiBmaWVsZCB3aWxsIGJlIGlnbm9yZWQuCisKKyAgIHZ5IDczLAorICAgSm9lcmcgUmV1dGVyCWFtcHItbmV0OiBkbDFia2VAZGIwcHJhLmFtcHIub3JnCisJCUFYLTI1ICAgOiBETDFCS0UgQCBEQjBBQkguI0JBWS5ERVUuRVUKKwkJSW50ZXJuZXQ6IGpyZXV0ZXJAeWFpbmEuZGUKKwkJd3d3ICAgICA6IGh0dHA6Ly95YWluYS5kZS9qcmV1dGVyCisqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjdW5kZWYgIFNDQ19MREVMQVkJCS8qIHNsb3cgaXQgZXZlbiBhIGJpdCBtb3JlIGRvd24gKi8KKyN1bmRlZiAgU0NDX0RPTlRfQ0hFQ0sJCS8qIGRvbid0IGxvb2sgaWYgdGhlIFNDQ3MgeW91IHNwZWNpZmllZCBhcmUgYXZhaWxhYmxlICovCisKKyNkZWZpbmUgU0NDX01BWENISVBTCTQgICAgICAgLyogbnVtYmVyIG9mIG1heC4gc3VwcG9ydGVkIGNoaXBzICovCisjZGVmaW5lIFNDQ19CVUZTSVpFCTM4NCAgICAgLyogbXVzdCBub3QgZXhjZWVkIDQwOTYgKi8KKyN1bmRlZglTQ0NfREVCVUcKKworI2RlZmluZSBTQ0NfREVGQVVMVF9DTE9DSwk0OTE1MjAwIAorCQkJCS8qIGRlZmF1bHQgcGNsb2NrIGlmIG5vdGhpbmcgaXMgc3BlY2lmaWVkICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiejg1MzAuaCIKKworc3RhdGljIGNoYXIgYmFubmVyW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAiQVguMjU6IFo4NTMwIFNDQyBkcml2ZXIgdmVyc2lvbiAiVkVSU0lPTiIuZGwxYmtlXG4iOworCitzdGF0aWMgdm9pZCB0X2R3YWl0KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgdF90eGRlbGF5KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgdF90YWlsKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgdF9idXN5KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgdF9tYXhrZXl1cCh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIHRfaWRsZSh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIHNjY190eF9kb25lKHN0cnVjdCBzY2NfY2hhbm5lbCAqKTsKK3N0YXRpYyB2b2lkIHNjY19zdGFydF90eF90aW1lcihzdHJ1Y3Qgc2NjX2NoYW5uZWwgKiwgdm9pZCAoKikodW5zaWduZWQgbG9uZyksIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgc2NjX3N0YXJ0X21heGtleXVwKHN0cnVjdCBzY2NfY2hhbm5lbCAqKTsKK3N0YXRpYyB2b2lkIHNjY19zdGFydF9kZWZlcihzdHJ1Y3Qgc2NjX2NoYW5uZWwgKik7CisKK3N0YXRpYyB2b2lkIHo4NTMwX2luaXQodm9pZCk7CisKK3N0YXRpYyB2b2lkIGluaXRfY2hhbm5lbChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyk7CitzdGF0aWMgdm9pZCBzY2Nfa2V5X3RyeCAoc3RydWN0IHNjY19jaGFubmVsICpzY2MsIGNoYXIgdHgpOworc3RhdGljIGlycXJldHVybl90IHNjY19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBzY2NfaW5pdF90aW1lcihzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyk7CisKK3N0YXRpYyBpbnQgc2NjX25ldF9hbGxvYyhjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyk7CitzdGF0aWMgdm9pZCBzY2NfbmV0X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzY2NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzY2NfbmV0X3J4KHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgc2NjX25ldF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2NjX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CitzdGF0aWMgaW50IHNjY19uZXRfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogc2NjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFNDQ19Ecml2ZXJOYW1lW10gPSAic2NjIjsKKworc3RhdGljIHN0cnVjdCBpcnFmbGFncyB7IHVuc2lnbmVkIGNoYXIgdXNlZCA6IDE7IH0gSXZlY1tOUl9JUlFTXTsKKwkKK3N0YXRpYyBzdHJ1Y3Qgc2NjX2NoYW5uZWwgU0NDX0luZm9bMiAqIFNDQ19NQVhDSElQU107CS8qIGluZm9ybWF0aW9uIHBlciBjaGFubmVsICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2NjX2N0cmwgeworCWlvX3BvcnQgY2hhbl9BOworCWlvX3BvcnQgY2hhbl9COworCWludCBpcnE7Cit9IFNDQ19jdHJsW1NDQ19NQVhDSElQUysxXTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgRHJpdmVyX0luaXRpYWxpemVkOworc3RhdGljIGludCBOY2hpcHM7CitzdGF0aWMgaW9fcG9ydCBWZWN0b3JfTGF0Y2g7CisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoJCQlQb3J0IEFjY2VzcyBGdW5jdGlvbnMJCQkgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBUaGVzZSBwcm92aWRlIGludGVycnVwdCBzYXZlIDItc3RlcCBhY2Nlc3MgdG8gdGhlIFo4NTMwIHJlZ2lzdGVycyAqLworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlvbG9jayk7CS8qIEd1YXJkcyBwYWlyZWQgYWNjZXNzZXMgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIEluUmVnKGlvX3BvcnQgcG9ydCwgdW5zaWduZWQgY2hhciByZWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9sb2NrLCBmbGFncyk7CQorI2lmZGVmIFNDQ19MREVMQVkKKwlPdXRiKHBvcnQsIHJlZyk7CisJdWRlbGF5KFNDQ19MREVMQVkpOworCXI9SW5iKHBvcnQpOworCXVkZWxheShTQ0NfTERFTEFZKTsKKyNlbHNlCisJT3V0Yihwb3J0LCByZWcpOworCXI9SW5iKHBvcnQpOworI2VuZGlmCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBPdXRSZWcoaW9fcG9ydCBwb3J0LCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2xvY2ssIGZsYWdzKTsKKyNpZmRlZiBTQ0NfTERFTEFZCisJT3V0Yihwb3J0LCByZWcpOyB1ZGVsYXkoU0NDX0xERUxBWSk7CisJT3V0Yihwb3J0LCB2YWwpOyB1ZGVsYXkoU0NDX0xERUxBWSk7CisjZWxzZQorCU91dGIocG9ydCwgcmVnKTsKKwlPdXRiKHBvcnQsIHZhbCk7CisjZW5kaWYKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCB1bnNpZ25lZCBjaGFyIHJlZywKKwl1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlPdXRSZWcoc2NjLT5jdHJsLCByZWcsIChzY2MtPndyZWdbcmVnXSA9IHZhbCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3Ioc3RydWN0IHNjY19jaGFubmVsICpzY2MsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlPdXRSZWcoc2NjLT5jdHJsLCByZWcsIChzY2MtPndyZWdbcmVnXSB8PSB2YWwpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWwpCit7CisJT3V0UmVnKHNjYy0+Y3RybCwgcmVnLCAoc2NjLT53cmVnW3JlZ10gJj0gfnZhbCkpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJCVNvbWUgdXNlZnVsIG1hY3JvcwkJCSAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2NfZGlzY2FyZF9idWZmZXJzKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYy0+bG9jaywgZmxhZ3MpOwkKKwlpZiAoc2NjLT50eF9idWZmICE9IE5VTEwpCisJeworCQlkZXZfa2ZyZWVfc2tiKHNjYy0+dHhfYnVmZik7CisJCXNjYy0+dHhfYnVmZiA9IE5VTEw7CisJfQorCQorCXdoaWxlIChza2JfcXVldWVfbGVuKCZzY2MtPnR4X3F1ZXVlKSkKKwkJZGV2X2tmcmVlX3NrYihza2JfZGVxdWV1ZSgmc2NjLT50eF9xdWV1ZSkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NjLT5sb2NrLCBmbGFncyk7Cit9CisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJCUludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmVzCQkgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKKy8qIC0tLS0+IHN1YnJvdXRpbmVzIGZvciB0aGUgaW50ZXJydXB0IGhhbmRsZXJzIDwtLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2Nfbm90aWZ5KHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwljaGFyICpicDsKKwkKKyAgICAgICAgaWYgKHNjYy0+a2lzcy5mdWxsZHVwICE9IEtJU1NfRFVQTEVYX09QVElNQSkKKwkJcmV0dXJuOworCisJc2tiID0gZGV2X2FsbG9jX3NrYigyKTsKKwlpZiAoc2tiICE9IE5VTEwpCisJeworCQlicCA9IHNrYl9wdXQoc2tiLCAyKTsKKwkJKmJwKysgPSBQQVJBTV9IV0VWRU5UOworCQkqYnArKyA9IGV2ZW50OworCQlzY2NfbmV0X3J4KHNjYywgc2tiKTsKKwl9IGVsc2UKKwkJc2NjLT5zdGF0Lm5vc3BhY2UrKzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3J4X0ZJRk8oc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJaW50IGs7CisJCisJZm9yIChrPTA7IGs8MzsgaysrKQorCQlJbmIoc2NjLT5kYXRhKTsKKwkJCisJaWYoc2NjLT5yeF9idWZmICE9IE5VTEwpCQkvKiBkaWQgd2UgcmVjZWl2ZSBzb21ldGhpbmc/ICovCisJeworCQlzY2MtPnN0YXQucnhlcnJzKys7ICAvKiB0aGVuIGNvdW50IGl0IGFzIGFuIGVycm9yICovCisJCWRldl9rZnJlZV9za2JfaXJxKHNjYy0+cnhfYnVmZik7CisJCXNjYy0+cnhfYnVmZiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9odW50KHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCWlmICgoc2NjLT5tb2RlbS5jbG9ja3NyYyAhPSBDTEtfRVhURVJOQUwpKQorCQlPdXRSZWcoc2NjLT5jdHJsLFIxNCxTRUFSQ0h8c2NjLT53cmVnW1IxNF0pOyAvKiBEUExMOiBlbnRlciBzZWFyY2ggbW9kZSAqLworCW9yKHNjYyxSMyxFTlRfSE18UnhFTkFCTEUpOyAgLyogZW5hYmxlIHRoZSByZWNlaXZlciwgaHVudCBtb2RlICovCit9CisKKy8qIC0tLS0+IGZvdXIgZGlmZmVyZW50IGludGVycnVwdCBoYW5kbGVycyBmb3IgVHgsIFJ4LCBjaGFuZ2luZyBvZgkqLworLyogICAgICAgRENEL0NUUyBhbmQgUngvVHggZXJyb3JzCQkJCQkqLworCisvKiBUcmFuc21pdHRlciBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIGlubGluZSB2b2lkIHNjY190eGludChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2NjLT5zdGF0LnR4aW50cysrOworCXNrYiA9IHNjYy0+dHhfYnVmZjsKKwkKKwkvKiBzZW5kIGZpcnN0IG9jdGV0ICovCisJCisJaWYgKHNrYiA9PSBOVUxMKQorCXsKKwkJc2tiID0gc2tiX2RlcXVldWUoJnNjYy0+dHhfcXVldWUpOworCQlzY2MtPnR4X2J1ZmYgPSBza2I7CisJCW5ldGlmX3dha2VfcXVldWUoc2NjLT5kZXYpOworCisJCWlmIChza2IgPT0gTlVMTCkKKwkJeworCQkJc2NjX3R4X2RvbmUoc2NjKTsKKwkJCU91dGIoc2NjLT5jdHJsLCBSRVNfVHhfUCk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmIChza2ItPmxlbiA9PSAwKQkJLyogUGFyYW5vaWEuLi4gKi8KKwkJeworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCXNjYy0+dHhfYnVmZiA9IE5VTEw7CisJCQlzY2NfdHhfZG9uZShzY2MpOworCQkJT3V0YihzY2MtPmN0cmwsIFJFU19UeF9QKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19BQ1RJVkU7CisKKwkJT3V0UmVnKHNjYy0+Y3RybCwgUjAsIFJFU19UeF9DUkMpOworCQkJCQkJLyogcmVzZXQgQ1JDIGdlbmVyYXRvciAqLworCQlvcihzY2MsUjEwLEFCVU5ERVIpOwkJLyogcmUtaW5zdGFsbCB1bmRlcnJ1biBwcm90ZWN0aW9uICovCisJCU91dGIoc2NjLT5kYXRhLCpza2ItPmRhdGEpOwkvKiBzZW5kIGJ5dGUgKi8KKwkJc2tiX3B1bGwoc2tiLCAxKTsKKworCQlpZiAoIXNjYy0+ZW5oYW5jZWQpCQkvKiByZXNldCBFT00gbGF0Y2ggKi8KKwkJCU91dGIoc2NjLT5jdHJsLFJFU19FT01fTCk7CisJCXJldHVybjsKKwl9CisJCisJLyogRW5kIE9mIEZyYW1lLi4uICovCisJCisJaWYgKHNrYi0+bGVuID09IDApCisJeworCQlPdXRiKHNjYy0+Y3RybCwgUkVTX1R4X1ApOwkvKiByZXNldCBwZW5kaW5nIGludCAqLworCQljbChzY2MsIFIxMCwgQUJVTkRFUik7CQkvKiBzZW5kIENSQyAqLworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQlzY2MtPnR4X2J1ZmYgPSBOVUxMOworCQlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfTkVXRlJBTUU7IC8qIG5leHQgZnJhbWUuLi4gKi8KKwkJcmV0dXJuOworCX0gCisJCisJLyogc2VuZCBvY3RldCAqLworCQorCU91dGIoc2NjLT5kYXRhLCpza2ItPmRhdGEpOwkJCisJc2tiX3B1bGwoc2tiLCAxKTsKK30KKworCisvKiBFeHRlcm5hbC9TdGF0dXMgaW50ZXJydXB0IGhhbmRsZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2NfZXhpbnQoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXMsY2hhbmdlcyxjaGdfYW5kX3N0YXQ7CisKKwlzY2MtPnN0YXQuZXhpbnRzKys7CisKKwlzdGF0dXMgPSBJblJlZyhzY2MtPmN0cmwsUjApOworCWNoYW5nZXMgPSBzdGF0dXMgXiBzY2MtPnN0YXR1czsKKwljaGdfYW5kX3N0YXQgPSBjaGFuZ2VzICYgc3RhdHVzOworCQorCS8qIEFCT1JUOiBnZW5lcmF0ZWQgd2hlbmV2ZXIgRENEIGRyb3BzIHdoaWxlIHJlY2VpdmluZyAqLworCisJaWYgKGNoZ19hbmRfc3RhdCAmIEJSS19BQlJUKQkJLyogUmVjZWl2ZWQgYW4gQUJPUlQgKi8KKwkJZmx1c2hfcnhfRklGTyhzY2MpOworCisJLyogSFVOVDogc29mdHdhcmUgRENEOyBvbiA9IHdhaXRpbmcgZm9yIFNZTkMsIG9mZiA9IHJlY2VpdmluZyBmcmFtZSAqLworCisJaWYgKChjaGFuZ2VzICYgU1lOQ19IVU5UKSAmJiBzY2MtPmtpc3Muc29mdGRjZCkKKwl7CisJCWlmIChzdGF0dXMgJiBTWU5DX0hVTlQpCisJCXsKKwkJCXNjYy0+ZGNkID0gMDsKKwkJCWZsdXNoX3J4X0ZJRk8oc2NjKTsKKwkJCWlmICgoc2NjLT5tb2RlbS5jbG9ja3NyYyAhPSBDTEtfRVhURVJOQUwpKQorCQkJCU91dFJlZyhzY2MtPmN0cmwsUjE0LFNFQVJDSHxzY2MtPndyZWdbUjE0XSk7IC8qIERQTEw6IGVudGVyIHNlYXJjaCBtb2RlICovCisJCX0gZWxzZSB7CisJCQlzY2MtPmRjZCA9IDE7CisJCX0KKworCQlzY2Nfbm90aWZ5KHNjYywgc2NjLT5kY2Q/IEhXRVZfRENEX09GRjpIV0VWX0RDRF9PTik7CisJfQorCisJLyogRENEOiBvbiA9IHN0YXJ0IHRvIHJlY2VpdmUgcGFja2V0LCBvZmYgPSBBQk9SVCBjb25kaXRpb24gKi8KKwkvKiAoYSBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgcGFja2V0IGdlbmVyYXRlcyBhIHNwZWNpYWwgY29uZGl0aW9uIGludCkgKi8KKwkKKwlpZigoY2hhbmdlcyAmIERDRCkgJiYgIXNjYy0+a2lzcy5zb2Z0ZGNkKSAvKiBEQ0QgaW5wdXQgY2hhbmdlZCBzdGF0ZSAqLworCXsKKwkJaWYoc3RhdHVzICYgRENEKSAgICAgICAgICAgICAgICAvKiBEQ0QgaXMgbm93IE9OICovCisJCXsKKwkJCXN0YXJ0X2h1bnQoc2NjKTsKKwkJCXNjYy0+ZGNkID0gMTsKKwkJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBEQ0QgaXMgbm93IE9GRiAqLworCQkJY2woc2NjLFIzLEVOVF9ITXxSeEVOQUJMRSk7IC8qIGRpc2FibGUgdGhlIHJlY2VpdmVyICovCisJCQlmbHVzaF9yeF9GSUZPKHNjYyk7CisJCQlzY2MtPmRjZCA9IDA7CisJCX0KKwkJCisJCXNjY19ub3RpZnkoc2NjLCBzY2MtPmRjZD8gSFdFVl9EQ0RfT046SFdFVl9EQ0RfT0ZGKTsKKwl9CisKKyNpZmRlZiBub3RkZWYKKwkvKiBDVFM6IHVzZSBleHRlcm5hbCBUeERlbGF5ICh3aGF0J3MgdGhhdCBnb29kIGZvcj8hKQorCSAqIEFueXdheTogSWYgd2UgX2NvdWxkXyB1c2UgaXQgKEJheUNvbSBVU0NDIHVzZXMgQ1RTIGZvcgorCSAqIG93biBwdXJwb3Nlcykgd2UgX3Nob3VsZF8gdXNlIHRoZSAiYXV0b2VuYWJsZSIgZmVhdHVyZQorCSAqIG9mIHRoZSBaODUzMCBhbmQgbm90IHRoaXMgaW50ZXJydXB0Li4uCisJICovCisJIAorCWlmIChjaGdfYW5kX3N0YXQgJiBDVFMpCQkJLyogQ1RTIGlzIG5vdyBPTiAqLworCXsKKwkJaWYgKHNjYy0+a2lzcy50eGRlbGF5ID09IDApCS8qIHplcm8gVFhERUxBWSA9IHdhaXQgZm9yIENUUyAqLworCQkJc2NjX3N0YXJ0X3R4X3RpbWVyKHNjYywgdF90eGRlbGF5LCAwKTsKKwl9CisjZW5kaWYKKwkKKwlpZiAoc2NjLT5zdGF0LnR4X3N0YXRlID09IFRYU19BQ1RJVkUgJiYgKHN0YXR1cyAmIFR4RU9NKSkKKwl7CisJCXNjYy0+c3RhdC50eF91bmRlcisrOwkgIC8qIG9vcHMsIGFuIHVuZGVycnVuISBjb3VudCAnZW0gKi8KKwkJT3V0YihzY2MtPmN0cmwsIFJFU19FWFRfSU5UKTsJLyogcmVzZXQgZXh0L3N0YXR1cyBpbnRlcnJ1cHRzICovCisKKwkJaWYgKHNjYy0+dHhfYnVmZiAhPSBOVUxMKQorCQl7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShzY2MtPnR4X2J1ZmYpOworCQkJc2NjLT50eF9idWZmID0gTlVMTDsKKwkJfQorCQkKKwkJb3Ioc2NjLFIxMCxBQlVOREVSKTsKKwkJc2NjX3N0YXJ0X3R4X3RpbWVyKHNjYywgdF90eGRlbGF5LCAwKTsJLyogcmVzdGFydCB0cmFuc21pc3Npb24gKi8KKwl9CisJCQorCXNjYy0+c3RhdHVzID0gc3RhdHVzOworCU91dGIoc2NjLT5jdHJsLFJFU19FWFRfSU5UKTsKK30KKworCisvKiBSZWNlaXZlciBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIGlubGluZSB2b2lkIHNjY19yeGludChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2NjLT5zdGF0LnJ4aW50cysrOworCisJaWYoKHNjYy0+d3JlZ1s1XSAmIFJUUykgJiYgc2NjLT5raXNzLmZ1bGxkdXAgPT0gS0lTU19EVVBMRVhfSEFMRikKKwl7CisJCUluYihzY2MtPmRhdGEpOwkJLyogZGlzY2FyZCBjaGFyICovCisJCW9yKHNjYyxSMyxFTlRfSE0pOwkvKiBlbnRlciBodW50IG1vZGUgZm9yIG5leHQgZmxhZyAqLworCQlyZXR1cm47CisJfQorCisJc2tiID0gc2NjLT5yeF9idWZmOworCQorCWlmIChza2IgPT0gTlVMTCkKKwl7CisJCXNrYiA9IGRldl9hbGxvY19za2Ioc2NjLT5zdGF0LmJ1ZnNpemUpOworCQlpZiAoc2tiID09IE5VTEwpCisJCXsKKwkJCXNjYy0+ZGV2X3N0YXQucnhfZHJvcHBlZCsrOworCQkJc2NjLT5zdGF0Lm5vc3BhY2UrKzsKKwkJCUluYihzY2MtPmRhdGEpOworCQkJb3Ioc2NjLCBSMywgRU5UX0hNKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJc2NjLT5yeF9idWZmID0gc2tiOworCQkqKHNrYl9wdXQoc2tiLCAxKSkgPSAwOwkvKiBLSVNTIGRhdGEgKi8KKwl9CisJCisJaWYgKHNrYi0+bGVuID49IHNjYy0+c3RhdC5idWZzaXplKQorCXsKKyNpZmRlZiBub3RkZWYKKwkJcHJpbnRrKEtFUk5fREVCVUcgIno4NTMwZHJ2OiBvb3BzLCBzY2NfcnhpbnQoKSByZWNlaXZlZCBodWdlIGZyYW1lLi4uXG4iKTsKKyNlbmRpZgorCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQlzY2MtPnJ4X2J1ZmYgPSBOVUxMOworCQlJbmIoc2NjLT5kYXRhKTsKKwkJb3Ioc2NjLCBSMywgRU5UX0hNKTsKKwkJcmV0dXJuOworCX0KKworCSooc2tiX3B1dChza2IsIDEpKSA9IEluYihzY2MtPmRhdGEpOworfQorCisKKy8qIFJlY2VpdmUgU3BlY2lhbCBDb25kaXRpb24gaW50ZXJydXB0IGhhbmRsZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2Nfc3BpbnQoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNjYy0+c3RhdC5zcGludHMrKzsKKworCXN0YXR1cyA9IEluUmVnKHNjYy0+Y3RybCxSMSk7CQkvKiByZWFkIHJlY2VpdmVyIHN0YXR1cyAqLworCQorCUluYihzY2MtPmRhdGEpOwkJCQkvKiB0aHJvdyBhd2F5IFJ4IGJ5dGUgKi8KKwlza2IgPSBzY2MtPnJ4X2J1ZmY7CisKKwlpZihzdGF0dXMgJiBSeF9PVlIpCQkJLyogcmVjZWl2ZXIgb3ZlcnJ1biAqLworCXsKKwkJc2NjLT5zdGF0LnJ4X292ZXIrKzsgICAgICAgICAgICAgLyogY291bnQgdGhlbSAqLworCQlvcihzY2MsUjMsRU5UX0hNKTsgICAgICAgICAgICAgICAvKiBlbnRlciBodW50IG1vZGUgZm9yIG5leHQgZmxhZyAqLworCQkKKwkJaWYgKHNrYiAhPSBOVUxMKSAKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCXNjYy0+cnhfYnVmZiA9IHNrYiA9IE5VTEw7CisJfQorCisJaWYoc3RhdHVzICYgRU5EX0ZSICYmIHNrYiAhPSBOVUxMKQkvKiBlbmQgb2YgZnJhbWUgKi8KKwl7CisJCS8qIENSQyBva2F5LCBmcmFtZSBlbmRzIG9uIDggYml0IGJvdW5kYXJ5IGFuZCByZWNlaXZlZCBzb21ldGhpbmcgPyAqLworCQkKKwkJaWYgKCEoc3RhdHVzICYgQ1JDX0VSUikgJiYgKHN0YXR1cyAmIDB4ZSkgPT0gUkVTOCAmJiBza2ItPmxlbiA+IDApCisJCXsKKwkJCS8qIGlnbm9yZSBsYXN0IHJlY2VpdmVkIGJ5dGUgKGZpcnN0IG9mIHRoZSBDUkMgYnl0ZXMpICovCisJCQlza2JfdHJpbShza2IsIHNrYi0+bGVuLTEpOworCQkJc2NjX25ldF9yeChzY2MsIHNrYik7CisJCQlzY2MtPnJ4X2J1ZmYgPSBOVUxMOworCQkJc2NjLT5zdGF0LnJ4ZnJhbWVzKys7CisJCX0gZWxzZSB7CQkJCS8qIGEgYmFkIGZyYW1lICovCisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJc2NjLT5yeF9idWZmID0gTlVMTDsKKwkJCXNjYy0+c3RhdC5yeGVycnMrKzsKKwkJfQorCX0gCisKKwlPdXRiKHNjYy0+Y3RybCxFUlJfUkVTKTsKK30KKworCisvKiAtLS0tPiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciB0aGUgWjg1MzAgPC0tLS0gKi8KKworc3RhdGljIHZvaWQgc2NjX2lzcl9kaXNwYXRjaChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYywgaW50IHZlY3RvcikKK3sKKwlzcGluX2xvY2soJnNjYy0+bG9jayk7CisJc3dpdGNoICh2ZWN0b3IgJiBWRUNUT1JfTUFTSykKKwl7CisJCWNhc2UgVFhJTlQ6IHNjY190eGludChzY2MpOyBicmVhazsKKwkJY2FzZSBFWElOVDogc2NjX2V4aW50KHNjYyk7IGJyZWFrOworCQljYXNlIFJYSU5UOiBzY2NfcnhpbnQoc2NjKTsgYnJlYWs7CisJCWNhc2UgU1BJTlQ6IHNjY19zcGludChzY2MpOyBicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJnNjYy0+bG9jayk7Cit9CisKKy8qIElmIHRoZSBjYXJkIGhhcyBhIGxhdGNoIGZvciB0aGUgaW50ZXJydXB0IHZlY3RvciAobGlrZSB0aGUgUEEwSFpQIGNhcmQpCisgICB1c2UgaXQgdG8gZ2V0IHRoZSBudW1iZXIgb2YgdGhlIGNoaXAgdGhhdCBnZW5lcmF0ZWQgdGhlIGludC4KKyAgIElmIG5vdDogcG9sbCBhbGwgZGVmaW5lZCBjaGlwcy4KKyAqLworCisjZGVmaW5lIFNDQ19JUlFUSU1FT1VUIDMwMDAwCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzY2NfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgY2hhciB2ZWN0b3I7CQorCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjOworCXN0cnVjdCBzY2NfY3RybCAqY3RybDsKKwlpbnQgazsKKwkKKwlpZiAoVmVjdG9yX0xhdGNoKQorCXsKKwkgICAgCWZvcihrPTA7IGsgPCBTQ0NfSVJRVElNRU9VVDsgaysrKQorICAgIAkJeworCQkJT3V0YihWZWN0b3JfTGF0Y2gsIDApOyAgICAgIC8qIEdlbmVyYXRlIElOVEFDSyAqLworICAgICAgICAKKwkJCS8qIFJlYWQgdGhlIHZlY3RvciAqLworCQkJaWYoKHZlY3Rvcj1JbmIoVmVjdG9yX0xhdGNoKSkgPj0gMTYgKiBOY2hpcHMpIGJyZWFrOyAKKwkJCWlmICh2ZWN0b3IgJiAweDAxKSBicmVhazsKKyAgICAgICAgCSAKKwkJICAgICAgICBzY2M9JlNDQ19JbmZvW3ZlY3RvciA+PiAzIF4gMHgwMV07CisJCQlpZiAoIXNjYy0+ZGV2KSBicmVhazsKKworCQkJc2NjX2lzcl9kaXNwYXRjaChzY2MsIHZlY3Rvcik7CisKKwkJCU91dFJlZyhzY2MtPmN0cmwsUjAsUkVTX0hfSVVTKTsgICAgICAgICAgICAgIC8qIFJlc2V0IEhpZ2hlc3QgSVVTICovCisJCX0gIAorCisJCWlmIChrID09IFNDQ19JUlFUSU1FT1VUKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiejg1MzBkcnY6IGVuZGxlc3MgbG9vcCBpbiBzY2NfaXNyKCk/XG4iKTsKKworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJLyogRmluZCB0aGUgU0NDIGdlbmVyYXRpbmcgdGhlIGludGVycnVwdCBieSBwb2xsaW5nIGFsbCBhdHRhY2hlZCBTQ0NzCisJICogcmVhZGluZyBSUjNBICh0aGUgaW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXIpCisJICovCisKKwljdHJsID0gU0NDX2N0cmw7CisJd2hpbGUgKGN0cmwtPmNoYW5fQSkKKwl7CisJCWlmIChjdHJsLT5pcnEgIT0gaXJxKQorCQl7CisJCQljdHJsKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCXNjYyA9IE5VTEw7CisJCWZvciAoayA9IDA7IEluUmVnKGN0cmwtPmNoYW5fQSxSMykgJiYgayA8IFNDQ19JUlFUSU1FT1VUOyBrKyspCisJCXsKKwkJCXZlY3Rvcj1JblJlZyhjdHJsLT5jaGFuX0IsUjIpOwkvKiBSZWFkIHRoZSB2ZWN0b3IgKi8KKwkJCWlmICh2ZWN0b3IgJiAweDAxKSBicmVhazsgCisKKwkJCXNjYyA9ICZTQ0NfSW5mb1t2ZWN0b3IgPj4gMyBeIDB4MDFdOworCQkgICAgICAgIGlmICghc2NjLT5kZXYpIGJyZWFrOworCisJCQlzY2NfaXNyX2Rpc3BhdGNoKHNjYywgdmVjdG9yKTsKKwkJfQorCisJCWlmIChrID09IFNDQ19JUlFUSU1FT1VUKQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ6ODUzMGRydjogZW5kbGVzcyBsb29wIGluIHNjY19pc3IoKT8hXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogVGhpcyBsb29rcyB3ZWlyZCBhbmQgaXQgaXMuIEF0IGxlYXN0IHRoZSBCYXlDb20gVVNDQyBkb2Vzbid0CisJCSAqIHVzZSB0aGUgSW50ZXJydXB0IERhaXN5IENoYWluLCB0aHVzIHdlJ2xsIGhhdmUgdG8gc3RhcnQKKwkJICogYWxsIG92ZXIgYWdhaW4gdG8gYmUgc3VyZSBub3QgdG8gbWlzcyBhbiBpbnRlcnJ1cHQgZnJvbSAKKwkJICogKGFueSBvZikgdGhlIG90aGVyIGNoaXAocykuLi4KKwkJICogSG9uZXN0bHksIHRoZSBzaXR1YXRpb24gKmlzKiBicmFpbmRhbWFnZWQuLi4KKwkJICovCisKKwkJaWYgKHNjYyAhPSBOVUxMKQorCQl7CisJCQlPdXRSZWcoc2NjLT5jdHJsLFIwLFJFU19IX0lVUyk7CisJCQljdHJsID0gU0NDX2N0cmw7IAorCQl9IGVsc2UKKwkJCWN0cmwrKzsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoJCQlJbml0IENoYW5uZWwJCQkJCSovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKKy8qIC0tLS0+IHNldCBTQ0MgY2hhbm5lbCBzcGVlZCA8LS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JyZyhzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYywgdW5zaWduZWQgaW50IHRjKQoreworCWNsKHNjYyxSMTQsQlJFTkFCTCk7CQkvKiBkaXNhYmxlIGJhdWRyYXRlIGdlbmVyYXRvciAqLworCXdyKHNjYyxSMTIsdGMgJiAyNTUpOwkJLyogYnJnIHJhdGUgTE9XICovCisJd3Ioc2NjLFIxMyx0YyA+PiA4KTsgICAJCS8qIGJyZyByYXRlIEhJR0ggKi8KKwlvcihzY2MsUjE0LEJSRU5BQkwpOwkJLyogZW5hYmxlIGJhdWRyYXRlIGdlbmVyYXRvciAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NwZWVkKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYy0+bG9jaywgZmxhZ3MpOworCisJaWYgKHNjYy0+bW9kZW0uc3BlZWQgPiAwKQkvKiBwYXJhbm9pYS4uLiAqLworCQlzZXRfYnJnKHNjYywgKHVuc2lnbmVkKSAoc2NjLT5jbG9jayAvIChzY2MtPm1vZGVtLnNwZWVkICogNjQpKSAtIDIpOworCQkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKK30KKworCisvKiAtLS0tPiBpbml0aWFsaXplIGEgU0NDIGNoYW5uZWwgPC0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfYnJnKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCXdyKHNjYywgUjE0LCBCUlNSQyk7CQkJCS8qIEJSRyBzb3VyY2UgPSBQQ0xLICovCisJT3V0UmVnKHNjYy0+Y3RybCwgUjE0LCBTU0JSfHNjYy0+d3JlZ1tSMTRdKTsJLyogRFBMTCBzb3VyY2UgPSBCUkcgKi8KKwlPdXRSZWcoc2NjLT5jdHJsLCBSMTQsIFNOUlpJfHNjYy0+d3JlZ1tSMTRdKTsJLyogRFBMTCBOUlpJIG1vZGUgKi8KK30KKworLyoKKyAqIEluaXRpYWxpemF0aW9uIGFjY29yZGluZyB0byB0aGUgWjg1MzAgbWFudWFsIChTR1MtVGhvbXNvbidzIHZlcnNpb24pOgorICoKKyAqIDEuIE1vZGVzIGFuZCBjb25zdGFudHMKKyAqCisgKiBXUjkJMTEwMDAwMDAJY2hpcCByZXNldAorICogV1I0CVhYWFhYWFhYCVR4L1J4IGNvbnRyb2wsIGFzeW5jIG9yIHN5bmMgbW9kZQorICogV1IxCTBYWDAwWDAwCXNlbGVjdCBXL1JFUSAob3B0aW9uYWwpCisgKiBXUjIJWFhYWFhYWFgJcHJvZ3JhbSBpbnRlcnJ1cHQgdmVjdG9yCisgKiBXUjMJWFhYWFhYWDAJc2VsZWN0IFJ4IGNvbnRyb2wKKyAqIFdSNQlYWFhYMFhYWAlzZWxlY3QgVHggY29udHJvbAorICogV1I2CVhYWFhYWFhYCXN5bmMgY2hhcmFjdGVyCisgKiBXUjcJWFhYWFhYWFgJc3luYyBjaGFyYWN0ZXIKKyAqIFdSOQkwMDBYMFhYWAlzZWxlY3QgaW50ZXJydXB0IGNvbnRyb2wKKyAqIFdSMTAJWFhYWFhYWFgJbWlzY2VsbGFuZW91cyBjb250cm9sIChvcHRpb25hbCkKKyAqIFdSMTEJWFhYWFhYWFgJY2xvY2sgY29udHJvbAorICogV1IxMglYWFhYWFhYWAl0aW1lIGNvbnN0YW50IGxvd2VyIGJ5dGUgKG9wdGlvbmFsKQorICogV1IxMwlYWFhYWFhYWAl0aW1lIGNvbnN0YW50IHVwcGVyIGJ5dGUgKG9wdGlvbmFsKQorICogV1IxNAlYWFhYWFhYMAltaXNjZWxsYW5lb3VzIGNvbnRyb2wKKyAqIFdSMTQJWFhYU1NTU1MJY29tbWFuZHMgKG9wdGlvbmFsKQorICoKKyAqIDIuIEVuYWJsZXMKKyAqCisgKiBXUjE0CTAwMFNTU1MxCWJhdWQgcmF0ZSBlbmFibGUKKyAqIFdSMwlTU1NTU1NTMQlSeCBlbmFibGUKKyAqIFdSNQlTU1NTMVNTUwlUeCBlbmFibGUKKyAqIFdSMAkxMDAwMDAwMAlyZXNldCBUeCBDUkcgKG9wdGlvbmFsKQorICogV1IxCVhTUzAwUzAwCURNQSBlbmFibGUgKG9wdGlvbmFsKQorICoKKyAqIDMuIEludGVycnVwdCBzdGF0dXMKKyAqCisgKiBXUjE1CVhYWFhYWFhYCWVuYWJsZSBleHRlcm5hbC9zdGF0dXMKKyAqIFdSMAkwMDAxMDAwMAlyZXNldCBleHRlcm5hbCBzdGF0dXMKKyAqIFdSMAkwMDAxMDAwMAlyZXNldCBleHRlcm5hbCBzdGF0dXMgdHdpY2UKKyAqIFdSMQlTU1NYWFNYWAllbmFibGUgUngsIFR4IGFuZCBFeHQvc3RhdHVzCisgKiBXUjkJMDAwU1hTU1MJZW5hYmxlIG1hc3RlciBpbnRlcnJ1cHQgZW5hYmxlCisgKgorICogMSA9IHNldCB0byBvbmUsIDAgPSByZXNldCB0byB6ZXJvCisgKiBYID0gdXNlciBkZWZpbmVkLCBTID0gc2FtZSBhcyBwcmV2aW91cyBpbml0CisgKgorICoKKyAqIE5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gZGlmZmVycyBpbiBzb21lIHBvaW50cyBmcm9tIGFib3ZlIHNjaGVtZS4KKyAqCisgKi8KKyAKK3N0YXRpYyB2b2lkIGluaXRfY2hhbm5lbChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwlkZWxfdGltZXIoJnNjYy0+dHhfdCk7CisJZGVsX3RpbWVyKCZzY2MtPnR4X3dkb2cpOworCisJZGlzYWJsZV9pcnEoc2NjLT5pcnEpOworCisJd3Ioc2NjLFI0LFgxQ0xLfFNETEMpOwkJLyogKjEgY2xvY2ssIFNETEMgbW9kZSAqLworCXdyKHNjYyxSMSwwKTsJCQkvKiBubyBXL1JFUSBvcGVyYXRpb24gKi8KKwl3cihzY2MsUjMsUng4fFJ4Q1JDX0VOQUIpOwkvKiBSWCA4IGJpdHMvY2hhciwgQ1JDLCBkaXNhYmxlZCAqLwkKKwl3cihzY2MsUjUsVHg4fERUUnxUeENSQ19FTkFCKTsJLyogVFggOCBiaXRzL2NoYXIsIGRpc2FibGVkLCBEVFIgKi8KKwl3cihzY2MsUjYsMCk7CQkJLyogU0RMQyBhZGRyZXNzIHplcm8gKG5vdCB1c2VkKSAqLworCXdyKHNjYyxSNyxGTEFHKTsJCS8qIFNETEMgZmxhZyB2YWx1ZSAqLworCXdyKHNjYyxSOSxWSVMpOwkJCS8qIHZlY3RvciBpbmNsdWRlcyBzdGF0dXMgKi8KKwl3cihzY2MsUjEwLChzY2MtPm1vZGVtLm5yej8gTlJaIDogTlJaSSl8Q1JDUFN8QUJVTkRFUik7IC8qIGFib3J0IG9uIHVuZGVycnVuLCBwcmVzZXQgQ1JDIGdlbmVyYXRvciwgTlJaKEkpICovCisJd3Ioc2NjLFIxNCwgMCk7CisKKworLyogc2V0IGNsb2NrIHNvdXJjZXM6CisKKyAgIENMS19EUExMOiBub3JtYWwgaGFsZmR1cGxleCBvcGVyYXRpb24KKyAgIAorCQlSeENsazogdXNlIERQTEwKKwkJVHhDbGs6IHVzZSBEUExMCisJCVRSeEMgbW9kZSBEUExMIG91dHB1dAorCQkKKyAgIENMS19FWFRFUk5BTDogZXh0ZXJuYWwgY2xvY2tpbmcgKEczUlVIIG9yIERGOUlDIG1vZGVtKQorICAgCisgIAkgICAgICAgIEJheUNvbTogCQlvdGhlcnM6CisgIAkgICAgICAgIAorICAJICAgICAgICBUeENsayA9IHBpbiBSVHhDCVR4Q2xrID0gcGluIFRSeEMKKyAgCSAgICAgICAgUnhDbGsgPSBwaW4gVFJ4QyAJUnhDbGsgPSBwaW4gUlR4QworICAJICAgICAKKworICAgQ0xLX0RJVklERVI6CisgICAJCVJ4Q2xrID0gdXNlIERQTEwKKyAgIAkJVHhDbGsgPSBwaW4gUlR4QworICAgCQkKKyAgIAkJQmF5Q29tOgkJCW90aGVyczoKKyAgIAkJcGluIFRSeEMgPSBEUExMCQlwaW4gVFJ4QyA9IEJSRworICAgCQkoUnhDbGsgKiAxKQkJKFJ4Q2xrICogMzIpCisqLyAgCisKKyAgIAkJCisJc3dpdGNoKHNjYy0+bW9kZW0uY2xvY2tzcmMpCisJeworCQljYXNlIENMS19EUExMOgorCQkJd3Ioc2NjLCBSMTEsIFJDRFBMTHxUQ0RQTEx8VFJ4Q09JfFRSeENEUCk7CisJCQlpbml0X2JyZyhzY2MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBDTEtfRElWSURFUjoKKwkJCXdyKHNjYywgUjExLCAoKHNjYy0+YnJhbmQgJiBCQVlDT00pPyBUUnhDRFAgOiBUUnhDQlIpIHwgUkNEUExMfFRDUlR4Q1B8VFJ4Q09JKTsKKwkJCWluaXRfYnJnKHNjYyk7CisJCQlicmVhazsKKworCQljYXNlIENMS19FWFRFUk5BTDoKKwkJCXdyKHNjYywgUjExLCAoc2NjLT5icmFuZCAmIEJBWUNPTSk/IFJDVFJ4Q1B8VENSVHhDUCA6IFJDUlR4Q1B8VENUUnhDUCk7CisJCQlPdXRSZWcoc2NjLT5jdHJsLCBSMTQsIERJU0RQTEwpOworCQkJYnJlYWs7CisKKwl9CisJCisJc2V0X3NwZWVkKHNjYyk7CQkJLyogc2V0IGJhdWRyYXRlICovCisJCisJaWYoc2NjLT5lbmhhbmNlZCkKKwl7CisJCW9yKHNjYyxSMTUsU0hETENFfEZJRk9FKTsJLyogZW5hYmxlIEZJRk8sIFNETEMvSERMQyBFbmhhbmNlbWVudHMgKEZyb20gbm93IFI3IGlzIFI3JykgKi8KKwkJd3Ioc2NjLFI3LEFVVE9FT00pOworCX0KKworCWlmKHNjYy0+a2lzcy5zb2Z0ZGNkIHx8IChJblJlZyhzY2MtPmN0cmwsUjApICYgRENEKSkKKwkJCQkJCS8qIERDRCBpcyBub3cgT04gKi8KKwl7CisJCXN0YXJ0X2h1bnQoc2NjKTsKKwl9CisJCisJLyogZW5hYmxlIEFCT1JULCBEQ0QgJiBTWU5DL0hVTlQgaW50ZXJydXB0cyAqLworCisJd3Ioc2NjLFIxNSwgQlJLSUV8VHhVSUV8KHNjYy0+a2lzcy5zb2Z0ZGNkPyBTWU5DSUU6RENESUUpKTsKKworCU91dGIoc2NjLT5jdHJsLFJFU19FWFRfSU5UKTsJLyogcmVzZXQgZXh0L3N0YXR1cyBpbnRlcnJ1cHRzICovCisJT3V0YihzY2MtPmN0cmwsUkVTX0VYVF9JTlQpOwkvKiBtdXN0IGJlIGRvbmUgdHdpY2UgKi8KKworCW9yKHNjYyxSMSxJTlRfQUxMX1J4fFR4SU5UX0VOQUJ8RVhUX0lOVF9FTkFCKTsgLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwkKKwlzY2MtPnN0YXR1cyA9IEluUmVnKHNjYy0+Y3RybCxSMCk7CS8qIHJlYWQgaW5pdGlhbCBzdGF0dXMgKi8KKwkKKwlvcihzY2MsUjksTUlFKTsJCQkvKiBtYXN0ZXIgaW50ZXJydXB0IGVuYWJsZSAqLworCQorCXNjY19pbml0X3RpbWVyKHNjYyk7CisJCQkKKwllbmFibGVfaXJxKHNjYy0+aXJxKTsKK30KKworCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoJCQlTQ0MgdGltZXIgZnVuY3Rpb25zCQkJICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworCisvKiAtLS0tPiBzY2Nfa2V5X3RyeCBzZXRzIHRoZSB0aW1lIGNvbnN0YW50IGZvciB0aGUgYmF1ZHJhdGUgCisgICAgICAgICBnZW5lcmF0b3IgYW5kIGtleXMgdGhlIHRyYW5zbWl0dGVyCQkgICAgIDwtLS0tICovCisKK3N0YXRpYyB2b2lkIHNjY19rZXlfdHJ4KHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCBjaGFyIHR4KQoreworCXVuc2lnbmVkIGludCB0aW1lX2NvbnN0OworCQkKKwlpZiAoc2NjLT5icmFuZCAmIFBSSU1VUykKKwkJT3V0YihzY2MtPmN0cmwgKyA0LCBzY2MtPm9wdGlvbiB8ICh0eD8gMHg4MCA6IDApKTsKKworCWlmIChzY2MtPm1vZGVtLnNwZWVkIDwgMzAwKSAKKwkJc2NjLT5tb2RlbS5zcGVlZCA9IDEyMDA7CisKKwl0aW1lX2NvbnN0ID0gKHVuc2lnbmVkKSAoc2NjLT5jbG9jayAvIChzY2MtPm1vZGVtLnNwZWVkICogKHR4PyAyOjY0KSkpIC0gMjsKKworCWRpc2FibGVfaXJxKHNjYy0+aXJxKTsKKworCWlmICh0eCkKKwl7CisJCW9yKHNjYywgUjEsIFR4SU5UX0VOQUIpOwkvKiB0X21heGtleXVwIG1heSBoYXZlIHJlc2V0IHRoZXNlICovCisJCW9yKHNjYywgUjE1LCBUeFVJRSk7CisJfQorCisJaWYgKHNjYy0+bW9kZW0uY2xvY2tzcmMgPT0gQ0xLX0RQTEwpCisJewkJCQkvKiBmb3JjZSBzaW1wbGV4IG9wZXJhdGlvbiAqLworCQlpZiAodHgpCisJCXsKKyNpZmRlZiBDT05GSUdfU0NDX1RSWEVDSE8KKwkJCWNsKHNjYywgUjMsIFJ4RU5BQkxFfEVOVF9ITSk7CS8qIHN3aXRjaCBvZmYgcmVjZWl2ZXIgKi8KKwkJCWNsKHNjYywgUjE1LCBEQ0RJRXxTWU5DSUUpOwkvKiBObyBEQ0QgY2hhbmdlcywgcGxlYXNlICovCisjZW5kaWYKKwkJCXNldF9icmcoc2NjLCB0aW1lX2NvbnN0KTsJLyogcmVwcm9ncmFtIGJhdWRyYXRlIGdlbmVyYXRvciAqLworCisJCQkvKiBEUExMIC0+IFJ4IGNsaywgQlJHIC0+IFR4IENMSywgVFJ4QyBtb2RlIG91dHB1dCwgVFJ4QyA9IEJSRyAqLworCQkJd3Ioc2NjLCBSMTEsIFJDRFBMTHxUQ0JSfFRSeENPSXxUUnhDQlIpOworCQkJCisJCQkvKiBCeSBwb3B1bGFyIGRlbWFuZDogdHhfaW5oaWJpdCAqLworCQkJaWYgKHNjYy0+a2lzcy50eF9pbmhpYml0KQorCQkJeworCQkJCW9yKHNjYyxSNSwgVHhFTkFCKTsKKwkJCQlzY2MtPndyZWdbUjVdIHw9IFJUUzsKKwkJCX0gZWxzZSB7CisJCQkJb3Ioc2NjLFI1LFJUU3xUeEVOQUIpOwkvKiBzZXQgdGhlIFJUUyBsaW5lIGFuZCBlbmFibGUgVFggKi8KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNsKHNjYyxSNSxSVFN8VHhFTkFCKTsKKwkJCQorCQkJc2V0X2JyZyhzY2MsIHRpbWVfY29uc3QpOwkvKiByZXByb2dyYW0gYmF1ZHJhdGUgZ2VuZXJhdG9yICovCisJCQkKKwkJCS8qIERQTEwgLT4gUnggY2xrLCBEUExMIC0+IFR4IENMSywgVFJ4QyBtb2RlIG91dHB1dCwgVFJ4QyA9IERQTEwgKi8KKwkJCXdyKHNjYywgUjExLCBSQ0RQTEx8VENEUExMfFRSeENPSXxUUnhDRFApOworCisjaWZuZGVmIENPTkZJR19TQ0NfVFJYRUNITworCQkJaWYgKHNjYy0+a2lzcy5zb2Z0ZGNkKQorI2VuZGlmCisJCQl7CisJCQkJb3Ioc2NjLFIxNSwgc2NjLT5raXNzLnNvZnRkY2Q/IFNZTkNJRTpEQ0RJRSk7CisJCQkJc3RhcnRfaHVudChzY2MpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKHR4KQorCQl7CisjaWZkZWYgQ09ORklHX1NDQ19UUlhFQ0hPCisJCQlpZiAoc2NjLT5raXNzLmZ1bGxkdXAgPT0gS0lTU19EVVBMRVhfSEFMRikKKwkJCXsKKwkJCQljbChzY2MsIFIzLCBSeEVOQUJMRSk7CisJCQkJY2woc2NjLCBSMTUsIERDRElFfFNZTkNJRSk7CisJCQl9CisjZW5kaWYKKwkJCQkKKwkJCWlmIChzY2MtPmtpc3MudHhfaW5oaWJpdCkKKwkJCXsKKwkJCQlvcihzY2MsUjUsIFR4RU5BQik7CisJCQkJc2NjLT53cmVnW1I1XSB8PSBSVFM7CisJCQl9IGVsc2UgewkKKwkJCQlvcihzY2MsUjUsUlRTfFR4RU5BQik7CS8qIGVuYWJsZSB0eCAqLworCQkJfQorCQl9IGVsc2UgeworCQkJY2woc2NjLFI1LFJUU3xUeEVOQUIpOwkJLyogZGlzYWJsZSB0eCAqLworCisJCQlpZiAoKHNjYy0+a2lzcy5mdWxsZHVwID09IEtJU1NfRFVQTEVYX0hBTEYpICYmCisjaWZuZGVmIENPTkZJR19TQ0NfVFJYRUNITworCQkJICAgIHNjYy0+a2lzcy5zb2Z0ZGNkKQorI2Vsc2UKKwkJCSAgICAxKQorI2VuZGlmCisJCQl7CisJCQkJb3Ioc2NjLCBSMTUsIHNjYy0+a2lzcy5zb2Z0ZGNkPyBTWU5DSUU6RENESUUpOworCQkJCXN0YXJ0X2h1bnQoc2NjKTsKKwkJCX0KKwkJfQorCX0KKworCWVuYWJsZV9pcnEoc2NjLT5pcnEpOworfQorCisKKy8qIC0tLS0+IFNDQyB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgZnJpZW5kcy4gPC0tLS0gKi8KKworc3RhdGljIHZvaWQgX19zY2Nfc3RhcnRfdHhfdGltZXIoc3RydWN0IHNjY19jaGFubmVsICpzY2MsIHZvaWQgKCpoYW5kbGVyKSh1bnNpZ25lZCBsb25nKSwgdW5zaWduZWQgbG9uZyB3aGVuKQoreworCWRlbF90aW1lcigmc2NjLT50eF90KTsKKworCWlmICh3aGVuID09IDApCisJeworCQloYW5kbGVyKCh1bnNpZ25lZCBsb25nKSBzY2MpOworCX0gZWxzZSAKKwlpZiAod2hlbiAhPSBUSU1FUl9PRkYpCisJeworCQlzY2MtPnR4X3QuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzY2M7CisJCXNjYy0+dHhfdC5mdW5jdGlvbiA9IGhhbmRsZXI7CisJCXNjYy0+dHhfdC5leHBpcmVzID0gamlmZmllcyArICh3aGVuKkhaKS8xMDA7CisJCWFkZF90aW1lcigmc2NjLT50eF90KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjY19zdGFydF90eF90aW1lcihzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYywgdm9pZCAoKmhhbmRsZXIpKHVuc2lnbmVkIGxvbmcpLCB1bnNpZ25lZCBsb25nIHdoZW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CisJX19zY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCBoYW5kbGVyLCB3aGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2NjX3N0YXJ0X2RlZmVyKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYy0+bG9jaywgZmxhZ3MpOworCWRlbF90aW1lcigmc2NjLT50eF93ZG9nKTsKKwkKKwlpZiAoc2NjLT5raXNzLm1heGRlZmVyICE9IDAgJiYgc2NjLT5raXNzLm1heGRlZmVyICE9IFRJTUVSX09GRikKKwl7CisJCXNjYy0+dHhfd2RvZy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHNjYzsKKwkJc2NjLT50eF93ZG9nLmZ1bmN0aW9uID0gdF9idXN5OworCQlzY2MtPnR4X3dkb2cuZXhwaXJlcyA9IGppZmZpZXMgKyBIWipzY2MtPmtpc3MubWF4ZGVmZXI7CisJCWFkZF90aW1lcigmc2NjLT50eF93ZG9nKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NjLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNjY19zdGFydF9tYXhrZXl1cChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZzY2MtPmxvY2ssIGZsYWdzKTsKKwlkZWxfdGltZXIoJnNjYy0+dHhfd2RvZyk7CisJCisJaWYgKHNjYy0+a2lzcy5tYXhrZXl1cCAhPSAwICYmIHNjYy0+a2lzcy5tYXhrZXl1cCAhPSBUSU1FUl9PRkYpCisJeworCQlzY2MtPnR4X3dkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzY2M7CisJCXNjYy0+dHhfd2RvZy5mdW5jdGlvbiA9IHRfbWF4a2V5dXA7CisJCXNjYy0+dHhfd2RvZy5leHBpcmVzID0gamlmZmllcyArIEhaKnNjYy0+a2lzcy5tYXhrZXl1cDsKKwkJYWRkX3RpbWVyKCZzY2MtPnR4X3dkb2cpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKK30KKworLyogCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHNjY190eGludCgpIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgZnJhbWVzIHRvIHNlbmQuCisgKiBOb3QgZXhhY3RseSBhIHRpbWVyIGZ1bmN0aW9uLCBidXQgaXQgaXMgYSBjbG9zZSBmcmllbmQgb2YgdGhlIGZhbWlseS4uLgorICovCisKK3N0YXRpYyB2b2lkIHNjY190eF9kb25lKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCS8qIAorCSAqIHRyeCByZW1haW5zIGtleWVkIGluIGZ1bGxkdXAgbW9kZSAyIHVudGlsIHRfaWRsZSBleHBpcmVzLgorCSAqLworCQkJCSAKKwlzd2l0Y2ggKHNjYy0+a2lzcy5mdWxsZHVwKQorCXsKKwkJY2FzZSBLSVNTX0RVUExFWF9MSU5LOgorCQkJc2NjLT5zdGF0LnR4X3N0YXRlID0gVFhTX0lETEUyOworCQkJaWYgKHNjYy0+a2lzcy5pZGxldGltZSAhPSBUSU1FUl9PRkYpCisJCQlzY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X2lkbGUsIHNjYy0+a2lzcy5pZGxldGltZSoxMDApOworCQkJYnJlYWs7CisJCWNhc2UgS0lTU19EVVBMRVhfT1BUSU1BOgorCQkJc2NjX25vdGlmeShzY2MsIEhXRVZfQUxMX1NFTlQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfQlVTWTsKKwkJCXNjY19zdGFydF90eF90aW1lcihzY2MsIHRfdGFpbCwgc2NjLT5raXNzLnRhaWx0aW1lKTsKKwl9CisKKwluZXRpZl93YWtlX3F1ZXVlKHNjYy0+ZGV2KTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgY2hhciBSYW5kID0gMTc7CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2dyb3VwZWQoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJaW50IGs7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2MyOworCXVuc2lnbmVkIGNoYXIgZ3JwMSwgZ3JwMjsKKworCWdycDEgPSBzY2MtPmtpc3MuZ3JvdXA7CisJCisJZm9yIChrID0gMDsgayA8IChOY2hpcHMgKiAyKTsgaysrKQorCXsKKwkJc2NjMiA9ICZTQ0NfSW5mb1trXTsKKwkJZ3JwMiA9IHNjYzItPmtpc3MuZ3JvdXA7CisJCQorCQlpZiAoc2NjMiA9PSBzY2MgfHwgIShzY2MyLT5kZXYgJiYgZ3JwMikpCisJCQljb250aW51ZTsKKwkJCisJCWlmICgoZ3JwMSAmIDB4M2YpID09IChncnAyICYgMHgzZikpCisJCXsKKwkJCWlmICggKGdycDEgJiBUWEdST1VQKSAmJiAoc2NjMi0+d3JlZ1tSNV0gJiBSVFMpICkKKwkJCQlyZXR1cm4gMTsKKwkJCQorCQkJaWYgKCAoZ3JwMSAmIFJYR1JPVVApICYmIHNjYzItPmRjZCApCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIERXQUlUIGFuZCBTTE9UVElNRSBleHBpcmVkCisgKgorICogZnVsbGR1cCA9PSAwOiAgRENEIGlzIGFjdGl2ZSBvciBSYW5kID4gUC1wZXJzaXN0ZW5jZTogc3RhcnQgdF9idXN5IHRpbWVyCisgKiAgICAgICAgICAgICAgICBlbHNlIGtleSB0cnggYW5kIHN0YXJ0IHR4ZGVsYXkKKyAqIGZ1bGxkdXAgPT0gMTogIGtleSB0cnggYW5kIHN0YXJ0IHR4ZGVsYXkKKyAqIGZ1bGxkdXAgPT0gMjogIG1pbnRpbWUgZXhwaXJlZCwgcmVzZXQgc3RhdHVzIG9yIGtleSB0cnggYW5kIHN0YXJ0IHR4ZGVsYXkKKyAqLworCitzdGF0aWMgdm9pZCB0X2R3YWl0KHVuc2lnbmVkIGxvbmcgY2hhbm5lbCkKK3sKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKikgY2hhbm5lbDsKKwkKKwlpZiAoc2NjLT5zdGF0LnR4X3N0YXRlID09IFRYU19XQUlUKQkvKiBtYXhrZXl1cCBvciBpZGxlIHRpbWVvdXQgKi8KKwl7CisJCWlmIChza2JfcXVldWVfbGVuKCZzY2MtPnR4X3F1ZXVlKSA9PSAwKQkvKiBub3RoaW5nIHRvIHNlbmQgKi8KKwkJeworCQkJc2NjLT5zdGF0LnR4X3N0YXRlID0gVFhTX0lETEU7CisJCQluZXRpZl93YWtlX3F1ZXVlKHNjYy0+ZGV2KTsJLyogdF9tYXhrZXl1cCBsb2NrZWQgaXQuICovCisJCQlyZXR1cm47CisJCX0KKworCQlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfQlVTWTsKKwl9CisKKwlpZiAoc2NjLT5raXNzLmZ1bGxkdXAgPT0gS0lTU19EVVBMRVhfSEFMRikKKwl7CisJCVJhbmQgPSBSYW5kICogMTcgKyAzMTsKKwkJCisJCWlmIChzY2MtPmRjZCB8fCAoc2NjLT5raXNzLnBlcnNpc3QpIDwgUmFuZCB8fCAoc2NjLT5raXNzLmdyb3VwICYmIGlzX2dyb3VwZWQoc2NjKSkgKQorCQl7CisJCQlzY2Nfc3RhcnRfZGVmZXIoc2NjKTsKKwkJCXNjY19zdGFydF90eF90aW1lcihzY2MsIHRfZHdhaXQsIHNjYy0+a2lzcy5zbG90dGltZSk7CisJCQlyZXR1cm4gOworCQl9CisJfQorCisJaWYgKCAhKHNjYy0+d3JlZ1tSNV0gJiBSVFMpICkKKwl7CisJCXNjY19rZXlfdHJ4KHNjYywgVFhfT04pOworCQlzY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X3R4ZGVsYXksIHNjYy0+a2lzcy50eGRlbGF5KTsKKwl9IGVsc2UgeworCQlzY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X3R4ZGVsYXksIDApOworCX0KK30KKworCisvKiBUWERFTEFZIGV4cGlyZWQKKyAqCisgKiBraWNrIHRyYW5zbWlzc2lvbiBieSBhIGZha2Ugc2NjX3R4aW50KHNjYyksIHN0YXJ0ICdtYXhrZXl1cCcgd2F0Y2hkb2cuCisgKi8KKworc3RhdGljIHZvaWQgdF90eGRlbGF5KHVuc2lnbmVkIGxvbmcgY2hhbm5lbCkKK3sKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKikgY2hhbm5lbDsKKworCXNjY19zdGFydF9tYXhrZXl1cChzY2MpOworCisJaWYgKHNjYy0+dHhfYnVmZiA9PSBOVUxMKQorCXsKKwkJZGlzYWJsZV9pcnEoc2NjLT5pcnEpOworCQlzY2NfdHhpbnQoc2NjKTsJCisJCWVuYWJsZV9pcnEoc2NjLT5pcnEpOworCX0KK30KKwkKKworLyogVEFJTFRJTUUgZXhwaXJlZAorICoKKyAqIHN3aXRjaCBvZmYgdHJhbnNtaXR0ZXIuIElmIHdlIHdlcmUgc3RvcHBlZCBieSBNYXhrZXl1cCByZXN0YXJ0CisgKiB0cmFuc21pc3Npb24gYWZ0ZXIgJ21pbnRpbWUnIHNlY29uZHMKKyAqLworCitzdGF0aWMgdm9pZCB0X3RhaWwodW5zaWduZWQgbG9uZyBjaGFubmVsKQoreworCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjID0gKHN0cnVjdCBzY2NfY2hhbm5lbCAqKSBjaGFubmVsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYy0+bG9jaywgZmxhZ3MpOyAKKyAJZGVsX3RpbWVyKCZzY2MtPnR4X3dkb2cpOwkKKyAJc2NjX2tleV90cngoc2NjLCBUWF9PRkYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOworCisgCWlmIChzY2MtPnN0YXQudHhfc3RhdGUgPT0gVFhTX1RJTUVPVVQpCQkvKiB3ZSBoYWQgYSB0aW1lb3V0PyAqLworIAl7CisgCQlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfV0FJVDsKKwkJc2NjX3N0YXJ0X3R4X3RpbWVyKHNjYywgdF9kd2FpdCwgc2NjLT5raXNzLm1pbnRpbWUqMTAwKTsKKyAJCXJldHVybjsKKyAJfQorIAkKKyAJc2NjLT5zdGF0LnR4X3N0YXRlID0gVFhTX0lETEU7CisJbmV0aWZfd2FrZV9xdWV1ZShzY2MtPmRldik7Cit9CisKKworLyogQlVTWSB0aW1lb3V0CisgKgorICogdGhyb3cgYXdheSBzZW5kIGJ1ZmZlcnMgaWYgRENEIHJlbWFpbnMgYWN0aXZlIHRvbyBsb25nLgorICovCisKK3N0YXRpYyB2b2lkIHRfYnVzeSh1bnNpZ25lZCBsb25nIGNoYW5uZWwpCit7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2MgPSAoc3RydWN0IHNjY19jaGFubmVsICopIGNoYW5uZWw7CisKKwlkZWxfdGltZXIoJnNjYy0+dHhfdCk7CisJbmV0aWZfc3RvcF9xdWV1ZShzY2MtPmRldik7CS8qIGRvbid0IHBpbGUgb24gdGhlIHdhYmJpdCEgKi8KKworCXNjY19kaXNjYXJkX2J1ZmZlcnMoc2NjKTsKKwlzY2MtPnN0YXQudHhlcnJzKys7CisJc2NjLT5zdGF0LnR4X3N0YXRlID0gVFhTX0lETEU7CisKKwluZXRpZl93YWtlX3F1ZXVlKHNjYy0+ZGV2KTsJCit9CisKKy8qIE1BWEtFWVVQIHRpbWVvdXQKKyAqCisgKiB0aGlzIGlzIG91ciB3YXRjaGRvZy4KKyAqLworCitzdGF0aWMgdm9pZCB0X21heGtleXVwKHVuc2lnbmVkIGxvbmcgY2hhbm5lbCkKK3sKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKikgY2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYy0+bG9jaywgZmxhZ3MpOworCS8qIAorCSAqIGxldCB0aGluZ3Mgc2V0dGxlIGRvd24gYmVmb3JlIHdlIHN0YXJ0IHRvCisJICogYWNjZXB0IG5ldyBkYXRhLgorCSAqLworCisJbmV0aWZfc3RvcF9xdWV1ZShzY2MtPmRldik7CisJc2NjX2Rpc2NhcmRfYnVmZmVycyhzY2MpOworCisJZGVsX3RpbWVyKCZzY2MtPnR4X3QpOworCisJY2woc2NjLCBSMSwgVHhJTlRfRU5BQik7CS8qIGZvcmNlIGFuIEFCT1JULCBidXQgZG9uJ3QgKi8KKwljbChzY2MsIFIxNSwgVHhVSUUpOwkJLyogY291bnQgaXQuICovCisJT3V0UmVnKHNjYy0+Y3RybCwgUjAsIFJFU19UeF9QKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOworCisJc2NjLT5zdGF0LnR4ZXJycysrOworCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19USU1FT1VUOworCXNjY19zdGFydF90eF90aW1lcihzY2MsIHRfdGFpbCwgc2NjLT5raXNzLnRhaWx0aW1lKTsKK30KKworLyogSURMRSB0aW1lb3V0CisgKgorICogaW4gZnVsbGR1cCBtb2RlIDIgaXQga2V5cyBkb3duIHRoZSB0cmFuc21pdHRlciBhZnRlciAnaWRsZScgc2Vjb25kcworICogb2YgaW5hY3Rpdml0eS4gV2Ugd2lsbCBub3QgcmVzdGFydCB0cmFuc21pc3Npb24gYmVmb3JlICdtaW50aW1lJworICogZXhwaXJlcy4KKyAqLworCitzdGF0aWMgdm9pZCB0X2lkbGUodW5zaWduZWQgbG9uZyBjaGFubmVsKQoreworCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjID0gKHN0cnVjdCBzY2NfY2hhbm5lbCAqKSBjaGFubmVsOworCQorCWRlbF90aW1lcigmc2NjLT50eF93ZG9nKTsKKworCXNjY19rZXlfdHJ4KHNjYywgVFhfT0ZGKTsKKwlpZihzY2MtPmtpc3MubWludGltZSkKKwkJc2NjX3N0YXJ0X3R4X3RpbWVyKHNjYywgdF9kd2FpdCwgc2NjLT5raXNzLm1pbnRpbWUqMTAwKTsKKwlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfV0FJVDsKK30KKworc3RhdGljIHZvaWQgc2NjX2luaXRfdGltZXIoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzY2MtPmxvY2ssIGZsYWdzKTsJCisJc2NjLT5zdGF0LnR4X3N0YXRlID0gVFhTX0lETEU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NjLT5sb2NrLCBmbGFncyk7Cit9CisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoJCQlTZXQvZ2V0IEwxIHBhcmFtZXRlcnMJCQkgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKKy8qCisgKiB0aGlzIHdpbGwgc2V0IHRoZSAiaGFyZHdhcmUiIHBhcmFtZXRlcnMgdGhyb3VnaCBLSVNTIGNvbW1hbmRzIG9yIGlvY3RsKCkKKyAqLworCisjZGVmaW5lIENBU1QoeCkgKHVuc2lnbmVkIGxvbmcpKHgpCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2NjX3NldF9wYXJhbShzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgaW50IGFyZykKK3sKKwlzd2l0Y2ggKGNtZCkKKwl7CisJCWNhc2UgUEFSQU1fVFhERUxBWToJc2NjLT5raXNzLnR4ZGVsYXk9YXJnOwkJYnJlYWs7CisJCWNhc2UgUEFSQU1fUEVSU0lTVDoJc2NjLT5raXNzLnBlcnNpc3Q9YXJnOwkJYnJlYWs7CisJCWNhc2UgUEFSQU1fU0xPVFRJTUU6CXNjYy0+a2lzcy5zbG90dGltZT1hcmc7CQlicmVhazsKKwkJY2FzZSBQQVJBTV9UWFRBSUw6CXNjYy0+a2lzcy50YWlsdGltZT1hcmc7CQlicmVhazsKKwkJY2FzZSBQQVJBTV9GVUxMRFVQOglzY2MtPmtpc3MuZnVsbGR1cD1hcmc7CQlicmVhazsKKwkJY2FzZSBQQVJBTV9EVFI6CQlicmVhazsgLyogZG9lcyBzb21lb25lIG5lZWQgdGhpcz8gKi8KKwkJY2FzZSBQQVJBTV9HUk9VUDoJc2NjLT5raXNzLmdyb3VwPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX0lETEU6CXNjYy0+a2lzcy5pZGxldGltZT1hcmc7CQlicmVhazsKKwkJY2FzZSBQQVJBTV9NSU46CQlzY2MtPmtpc3MubWludGltZT1hcmc7CQlicmVhazsKKwkJY2FzZSBQQVJBTV9NQVhLRVk6CXNjYy0+a2lzcy5tYXhrZXl1cD1hcmc7CQlicmVhazsKKwkJY2FzZSBQQVJBTV9XQUlUOglzY2MtPmtpc3Mud2FpdHRpbWU9YXJnOwkJYnJlYWs7CisJCWNhc2UgUEFSQU1fTUFYREVGRVI6CXNjYy0+a2lzcy5tYXhkZWZlcj1hcmc7CQlicmVhazsKKwkJY2FzZSBQQVJBTV9UWDoJCXNjYy0+a2lzcy50eF9pbmhpYml0PWFyZzsJYnJlYWs7CisKKwkJY2FzZSBQQVJBTV9TT0ZURENEOgkKKwkJCXNjYy0+a2lzcy5zb2Z0ZGNkPWFyZzsKKwkJCWlmIChhcmcpCisJCQl7CisJCQkJb3Ioc2NjLCBSMTUsIFNZTkNJRSk7CisJCQkJY2woc2NjLCBSMTUsIERDRElFKTsKKwkJCQlzdGFydF9odW50KHNjYyk7CisJCQl9IGVsc2UgeworCQkJCW9yKHNjYywgUjE1LCBEQ0RJRSk7CisJCQkJY2woc2NjLCBSMTUsIFNZTkNJRSk7CisJCQl9CisJCQlicmVhazsKKwkJCQkKKwkJY2FzZSBQQVJBTV9TUEVFRDoKKwkJCWlmIChhcmcgPCAyNTYpCisJCQkJc2NjLT5tb2RlbS5zcGVlZD1hcmcqMTAwOworCQkJZWxzZQorCQkJCXNjYy0+bW9kZW0uc3BlZWQ9YXJnOworCisJCQlpZiAoc2NjLT5zdGF0LnR4X3N0YXRlID09IDApCS8qIG9ubHkgc3dpdGNoIGJhdWRyYXRlIG9uIHJ4Li4uIDstKSAqLworCQkJCXNldF9zcGVlZChzY2MpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBQQVJBTV9SVFM6CQorCQkJaWYgKCAhKHNjYy0+d3JlZ1tSNV0gJiBSVFMpICkKKwkJCXsKKwkJCQlpZiAoYXJnICE9IFRYX09GRikKKwkJCQkJc2NjX2tleV90cngoc2NjLCBUWF9PTik7CisJCQkJCXNjY19zdGFydF90eF90aW1lcihzY2MsIHRfdHhkZWxheSwgc2NjLT5raXNzLnR4ZGVsYXkpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYXJnID09IFRYX09GRikKKwkJCQl7CisJCQkJCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19CVVNZOworCQkJCQlzY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X3RhaWwsIHNjYy0+a2lzcy50YWlsdGltZSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBQQVJBTV9IV0VWRU5UOgorCQkJc2NjX25vdGlmeShzY2MsIHNjYy0+ZGNkPyBIV0VWX0RDRF9PTjpIV0VWX0RDRF9PRkYpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworCisgCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzY2NfZ2V0X3BhcmFtKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCB1bnNpZ25lZCBpbnQgY21kKQoreworCXN3aXRjaCAoY21kKQorCXsKKwkJY2FzZSBQQVJBTV9UWERFTEFZOglyZXR1cm4gQ0FTVChzY2MtPmtpc3MudHhkZWxheSk7CisJCWNhc2UgUEFSQU1fUEVSU0lTVDoJcmV0dXJuIENBU1Qoc2NjLT5raXNzLnBlcnNpc3QpOworCQljYXNlIFBBUkFNX1NMT1RUSU1FOglyZXR1cm4gQ0FTVChzY2MtPmtpc3Muc2xvdHRpbWUpOworCQljYXNlIFBBUkFNX1RYVEFJTDoJcmV0dXJuIENBU1Qoc2NjLT5raXNzLnRhaWx0aW1lKTsKKwkJY2FzZSBQQVJBTV9GVUxMRFVQOglyZXR1cm4gQ0FTVChzY2MtPmtpc3MuZnVsbGR1cCk7CisJCWNhc2UgUEFSQU1fU09GVERDRDoJcmV0dXJuIENBU1Qoc2NjLT5raXNzLnNvZnRkY2QpOworCQljYXNlIFBBUkFNX0RUUjoJCXJldHVybiBDQVNUKChzY2MtPndyZWdbUjVdICYgRFRSKT8gMTowKTsKKwkJY2FzZSBQQVJBTV9SVFM6CQlyZXR1cm4gQ0FTVCgoc2NjLT53cmVnW1I1XSAmIFJUUyk/IDE6MCk7CisJCWNhc2UgUEFSQU1fU1BFRUQ6CXJldHVybiBDQVNUKHNjYy0+bW9kZW0uc3BlZWQpOworCQljYXNlIFBBUkFNX0dST1VQOglyZXR1cm4gQ0FTVChzY2MtPmtpc3MuZ3JvdXApOworCQljYXNlIFBBUkFNX0lETEU6CXJldHVybiBDQVNUKHNjYy0+a2lzcy5pZGxldGltZSk7CisJCWNhc2UgUEFSQU1fTUlOOgkJcmV0dXJuIENBU1Qoc2NjLT5raXNzLm1pbnRpbWUpOworCQljYXNlIFBBUkFNX01BWEtFWToJcmV0dXJuIENBU1Qoc2NjLT5raXNzLm1heGtleXVwKTsKKwkJY2FzZSBQQVJBTV9XQUlUOglyZXR1cm4gQ0FTVChzY2MtPmtpc3Mud2FpdHRpbWUpOworCQljYXNlIFBBUkFNX01BWERFRkVSOglyZXR1cm4gQ0FTVChzY2MtPmtpc3MubWF4ZGVmZXIpOworCQljYXNlIFBBUkFNX1RYOgkJcmV0dXJuIENBU1Qoc2NjLT5raXNzLnR4X2luaGliaXQpOworCQlkZWZhdWx0OgkJcmV0dXJuIE5PX1NVQ0hfUEFSQU07CisJfQorCit9CisKKyN1bmRlZiBDQVNUCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoJCQlTZW5kIGNhbGlicmF0aW9uIHBhdHRlcm4JCSAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdm9pZCBzY2Nfc3RvcF9jYWxpYnJhdGUodW5zaWduZWQgbG9uZyBjaGFubmVsKQoreworCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjID0gKHN0cnVjdCBzY2NfY2hhbm5lbCAqKSBjaGFubmVsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYy0+bG9jaywgZmxhZ3MpOworCWRlbF90aW1lcigmc2NjLT50eF93ZG9nKTsKKwlzY2Nfa2V5X3RyeChzY2MsIFRYX09GRik7CisJd3Ioc2NjLCBSNiwgMCk7CisJd3Ioc2NjLCBSNywgRkxBRyk7CisJT3V0YihzY2MtPmN0cmwsUkVTX0VYVF9JTlQpOwkvKiByZXNldCBleHQvc3RhdHVzIGludGVycnVwdHMgKi8KKwlPdXRiKHNjYy0+Y3RybCxSRVNfRVhUX0lOVCk7CisKKwluZXRpZl93YWtlX3F1ZXVlKHNjYy0+ZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZAorc2NjX3N0YXJ0X2NhbGlicmF0ZShzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYywgaW50IGR1cmF0aW9uLCB1bnNpZ25lZCBjaGFyIHBhdHRlcm4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CisJbmV0aWZfc3RvcF9xdWV1ZShzY2MtPmRldik7CisJc2NjX2Rpc2NhcmRfYnVmZmVycyhzY2MpOworCisJZGVsX3RpbWVyKCZzY2MtPnR4X3dkb2cpOworCisJc2NjLT50eF93ZG9nLmRhdGEgPSAodW5zaWduZWQgbG9uZykgc2NjOworCXNjYy0+dHhfd2RvZy5mdW5jdGlvbiA9IHNjY19zdG9wX2NhbGlicmF0ZTsKKwlzY2MtPnR4X3dkb2cuZXhwaXJlcyA9IGppZmZpZXMgKyBIWipkdXJhdGlvbjsKKwlhZGRfdGltZXIoJnNjYy0+dHhfd2RvZyk7CisKKwkvKiBUaGlzIGRvZXNuJ3Qgc2VlbSB0byB3b3JrLiBXaHkgbm90PyAqLwkKKwl3cihzY2MsIFI2LCAwKTsKKwl3cihzY2MsIFI3LCBwYXR0ZXJuKTsKKworCS8qIAorCSAqIERvbid0IGtub3cgaWYgdGhpcyB3b3Jrcy4gCisJICogRGFtbiwgd2hlcmUgaXMgbXkgWjg1MzAgcHJvZ3JhbW1pbmcgbWFudWFsLi4uPyAKKwkgKi8KKworCU91dGIoc2NjLT5jdHJsLFJFU19FWFRfSU5UKTsJLyogcmVzZXQgZXh0L3N0YXR1cyBpbnRlcnJ1cHRzICovCisJT3V0YihzY2MtPmN0cmwsUkVTX0VYVF9JTlQpOworCisJc2NjX2tleV90cngoc2NjLCBUWF9PTik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NjLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoJCUluaXQgY2hhbm5lbCBzdHJ1Y3R1cmVzLCBzcGVjaWFsIEhXLCBldGMuLi4JICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qCisgKiBSZXNldCB0aGUgWjg1MzBzIGFuZCBzZXR1cCBzcGVjaWFsIGhhcmR3YXJlCisgKi8KKworc3RhdGljIHZvaWQgejg1MzBfaW5pdCh2b2lkKQoreworCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjOworCWludCBjaGlwLCBrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciAqZmxhZzsKKworCisJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdCBaODUzMCBkcml2ZXI6ICV1IGNoYW5uZWxzLCBJUlEiLCBOY2hpcHMqMik7CisJCisJZmxhZz0iICI7CisJZm9yIChrID0gMDsgayA8IE5SX0lSUVM7IGsrKykKKwkJaWYgKEl2ZWNba10udXNlZCkgCisJCXsKKwkJCXByaW50aygiJXMlZCIsIGZsYWcsIGspOworCQkJZmxhZz0iLCI7CisJCX0KKwlwcmludGsoIlxuIik7CisKKworCS8qIHJlc2V0IGFuZCBwcmUtaW5pdCBhbGwgY2hpcHMgaW4gdGhlIHN5c3RlbSAqLworCWZvciAoY2hpcCA9IDA7IGNoaXAgPCBOY2hpcHM7IGNoaXArKykKKwl7CisJCXNjYz0mU0NDX0luZm9bMipjaGlwXTsKKwkJaWYgKCFzY2MtPmN0cmwpIGNvbnRpbnVlOworCisJCS8qIFNwZWNpYWwgU0NDIGNhcmRzICovCisKKwkJaWYoc2NjLT5icmFuZCAmIEVBR0xFKQkJCS8qIHRoaXMgaXMgYW4gRUFHTEUgY2FyZCAqLworCQkJT3V0YihzY2MtPnNwZWNpYWwsMHgwOCk7CS8qIGVuYWJsZSBpbnRlcnJ1cHQgb24gdGhlIGJvYXJkICovCisJCQkKKwkJaWYoc2NjLT5icmFuZCAmIChQQzEwMCB8IFBSSU1VUykpCS8qIHRoaXMgaXMgYSBQQzEwMC9QUklNVVMgY2FyZCAqLworCQkJT3V0YihzY2MtPnNwZWNpYWwsc2NjLT5vcHRpb24pOwkvKiBzZXQgdGhlIE1PREVNIG1vZGUgKDB4MjIpICovCisKKwkJCQorCQkvKiBSZXNldCBhbmQgcHJlLWluaXQgWjg1MzAgKi8KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CisJCQkJCisJCU91dGIoc2NjLT5jdHJsLCAwKTsKKwkJT3V0UmVnKHNjYy0+Y3RybCxSOSxGSFdSRVMpOwkJLyogZm9yY2UgaGFyZHdhcmUgcmVzZXQgKi8KKwkJdWRlbGF5KDEwMCk7CQkJCS8qIGdpdmUgaXQgJ2EgYml0JyBtb3JlIHRpbWUgdGhhbiByZXF1aXJlZCAqLworCQl3cihzY2MsIFIyLCBjaGlwKjE2KTsJCQkvKiBpbnRlcnJ1cHQgdmVjdG9yICovCisJCXdyKHNjYywgUjksIFZJUyk7CQkJLyogdmVjdG9yIGluY2x1ZGVzIHN0YXR1cyAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsJCQorICAgICAgICB9CisKKyAKKwlEcml2ZXJfSW5pdGlhbGl6ZWQgPSAxOworfQorCisvKgorICogQWxsb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSwgZXJyLCBpbnN0YW5jZSwgYW5kIHJlZ2lzdGVyIGRyaXZlcgorICovCisKK3N0YXRpYyBpbnQgc2NjX25ldF9hbGxvYyhjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlkZXYgPSBhbGxvY19uZXRkZXYoMCwgbmFtZSwgc2NjX25ldF9zZXR1cCk7CisJaWYgKCFkZXYpIAorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldi0+cHJpdiA9IHNjYzsKKwlzY2MtPmRldiA9IGRldjsKKwlzcGluX2xvY2tfaW5pdCgmc2NjLT5sb2NrKTsKKwlpbml0X3RpbWVyKCZzY2MtPnR4X3QpOworCWluaXRfdGltZXIoJnNjYy0+dHhfd2RvZyk7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IHJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlICglZClcbiIsIAorCQkgICAgICAgbmFtZSwgZXJyKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJc2NjLT5kZXYgPSBOVUxMOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoJCQkgICAgTmV0d29yayBkcml2ZXIgbWV0aG9kcwkJICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXgyNV9iY2FzdFtBWDI1X0FERFJfTEVOXSA9Cit7J1EnIDw8IDEsICdTJyA8PCAxLCAnVCcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnICcgPDwgMSwgJzAnIDw8IDF9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXgyNV9ub2NhbGxbQVgyNV9BRERSX0xFTl0gPQoreydMJyA8PCAxLCAnSScgPDwgMSwgJ04nIDw8IDEsICdVJyA8PCAxLCAnWCcgPDwgMSwgJyAnIDw8IDEsICcxJyA8PCAxfTsKKworLyogLS0tLT4gSW5pdGlhbGl6ZSBkZXZpY2UgPC0tLS0tICovCisKK3N0YXRpYyB2b2lkIHNjY19uZXRfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJZGV2LT50eF9xdWV1ZV9sZW4gICAgPSAxNjsJLyogc2hvdWxkIGJlIGVub3VnaC4uLiAqLworCisJZGV2LT5vcGVuICAgICAgICAgICAgPSBzY2NfbmV0X29wZW47CisJZGV2LT5zdG9wCSAgICAgPSBzY2NfbmV0X2Nsb3NlOworCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzY2NfbmV0X3R4OworCWRldi0+aGFyZF9oZWFkZXIgICAgID0gYXgyNV9lbmNhcHN1bGF0ZTsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyICA9IGF4MjVfcmVidWlsZF9oZWFkZXI7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBzY2NfbmV0X3NldF9tYWNfYWRkcmVzczsKKwlkZXYtPmdldF9zdGF0cyAgICAgICA9IHNjY19uZXRfZ2V0X3N0YXRzOworCWRldi0+ZG9faW9jdGwgICAgICAgID0gc2NjX25ldF9pb2N0bDsKKwlkZXYtPnR4X3RpbWVvdXQgICAgICA9IE5VTEw7CisKKwltZW1jcHkoZGV2LT5icm9hZGNhc3QsIGF4MjVfYmNhc3QsICBBWDI1X0FERFJfTEVOKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgIGF4MjVfbm9jYWxsLCBBWDI1X0FERFJfTEVOKTsKKyAKKwlkZXYtPmZsYWdzICAgICAgPSAwOworCisJZGV2LT50eXBlID0gQVJQSFJEX0FYMjU7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBBWDI1X01BWF9IRUFERVJfTEVOICsgQVgyNV9CUFFfSEVBREVSX0xFTjsKKwlkZXYtPm10dSA9IEFYMjVfREVGX1BBQ0xFTjsKKwlkZXYtPmFkZHJfbGVuID0gQVgyNV9BRERSX0xFTjsKKworfQorCisvKiAtLS0tPiBvcGVuIG5ldHdvcmsgZGV2aWNlIDwtLS0tICovCisKK3N0YXRpYyBpbnQgc2NjX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2MgPSAoc3RydWN0IHNjY19jaGFubmVsICopIGRldi0+cHJpdjsKKworIAlpZiAoIXNjYy0+aW5pdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzY2MtPnR4X2J1ZmYgPSBOVUxMOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNjYy0+dHhfcXVldWUpOworIAorCWluaXRfY2hhbm5lbChzY2MpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLT4gY2xvc2UgbmV0d29yayBkZXZpY2UgPC0tLS0gKi8KKworc3RhdGljIGludCBzY2NfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2MgPSAoc3RydWN0IHNjY19jaGFubmVsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYy0+bG9jaywgZmxhZ3MpOwkKKwlPdXRiKHNjYy0+Y3RybCwwKTsJCS8qIE1ha2Ugc3VyZSBwb2ludGVyIGlzIHdyaXR0ZW4gKi8KKwl3cihzY2MsUjEsMCk7CQkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJd3Ioc2NjLFIzLDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOworCisJZGVsX3RpbWVyX3N5bmMoJnNjYy0+dHhfdCk7CisJZGVsX3RpbWVyX3N5bmMoJnNjYy0+dHhfd2RvZyk7CisJCisJc2NjX2Rpc2NhcmRfYnVmZmVycyhzY2MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0+IHJlY2VpdmUgZnJhbWUsIGNhbGxlZCBmcm9tIHNjY19yeGludCgpIDwtLS0tICovCisKK3N0YXRpYyB2b2lkIHNjY19uZXRfcngoc3RydWN0IHNjY19jaGFubmVsICpzY2MsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHNrYi0+bGVuID09IDApIHsKKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJcmV0dXJuOworCX0KKwkJCisJc2NjLT5kZXZfc3RhdC5yeF9wYWNrZXRzKys7CisJc2NjLT5kZXZfc3RhdC5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworCXNrYi0+ZGV2ICAgICAgPSBzY2MtPmRldjsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVgyNSk7CisJc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisJCisJbmV0aWZfcngoc2tiKTsKKwlzY2MtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJcmV0dXJuOworfQorCisvKiAtLS0tPiB0cmFuc21pdCBmcmFtZSA8LS0tLSAqLworCitzdGF0aWMgaW50IHNjY19uZXRfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciBraXNzY21kOworCisJaWYgKHNrYi0+bGVuID4gc2NjLT5zdGF0LmJ1ZnNpemUgfHwgc2tiLT5sZW4gPCAyKSB7CisJCXNjYy0+ZGV2X3N0YXQudHhfZHJvcHBlZCsrOwkvKiBib2d1cyBmcmFtZSAqLworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKwkKKwlzY2MtPmRldl9zdGF0LnR4X3BhY2tldHMrKzsKKwlzY2MtPmRldl9zdGF0LnR4X2J5dGVzICs9IHNrYi0+bGVuOworCXNjYy0+c3RhdC50eGZyYW1lcysrOworCQorCWtpc3NjbWQgPSAqc2tiLT5kYXRhICYgMHgxZjsKKwlza2JfcHVsbChza2IsIDEpOworCisJaWYgKGtpc3NjbWQpIHsKKwkJc2NjX3NldF9wYXJhbShzY2MsIGtpc3NjbWQsICpza2ItPmRhdGEpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzY2MtPmxvY2ssIGZsYWdzKTsKKwkJCisJaWYgKHNrYl9xdWV1ZV9sZW4oJnNjYy0+dHhfcXVldWUpID4gc2NjLT5kZXYtPnR4X3F1ZXVlX2xlbikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2RlbDsKKwkJc2tiX2RlbCA9IHNrYl9kZXF1ZXVlKCZzY2MtPnR4X3F1ZXVlKTsKKwkJZGV2X2tmcmVlX3NrYihza2JfZGVsKTsKKwl9CisJc2tiX3F1ZXVlX3RhaWwoJnNjYy0+dHhfcXVldWUsIHNrYik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCisKKwkvKgorCSAqIFN0YXJ0IHRyYW5zbWlzc2lvbiBpZiB0aGUgdHJ4IHN0YXRlIGlzIGlkbGUgb3IKKwkgKiB0X2lkbGUgaGFzbid0IGV4cGlyZWQgeWV0LiBVc2UgZHdhaXQvcGVyc2lzdGVuY2Uvc2xvdHRpbWUKKwkgKiBhbGdvcml0aG0gZm9yIG5vcm1hbCBoYWxmZHVwbGV4IG9wZXJhdGlvbi4KKwkgKi8KKworCWlmKHNjYy0+c3RhdC50eF9zdGF0ZSA9PSBUWFNfSURMRSB8fCBzY2MtPnN0YXQudHhfc3RhdGUgPT0gVFhTX0lETEUyKSB7CisJCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19CVVNZOworCQlpZiAoc2NjLT5raXNzLmZ1bGxkdXAgPT0gS0lTU19EVVBMRVhfSEFMRikKKwkJCV9fc2NjX3N0YXJ0X3R4X3RpbWVyKHNjYywgdF9kd2FpdCwgc2NjLT5raXNzLndhaXR0aW1lKTsKKwkJZWxzZQorCQkJX19zY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X2R3YWl0LCAwKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NjLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0+IGlvY3RsIGZ1bmN0aW9ucyA8LS0tLSAqLworCisvKgorICogU0lPQ1NDQ0NGRwkJLSBjb25maWd1cmUgZHJpdmVyCWFyZzogKHN0cnVjdCBzY2NfaHdfY29uZmlnICopIGFyZworICogU0lPQ1NDQ0lOSQkJLSBpbml0aWFsaXplIGRyaXZlcglhcmc6IC0tLQorICogU0lPQ1NDQ0NIQU5JTkkJLSBpbml0aWFsaXplIGNoYW5uZWwJYXJnOiAoc3RydWN0IHNjY19tb2RlbSAqKSBhcmcKKyAqIFNJT0NTQ0NTTUVNCQktIHNldCBtZW1vcnkJCWFyZzogKHN0cnVjdCBzY2NfbWVtX2NvbmZpZyAqKSBhcmcKKyAqIFNJT0NTQ0NHS0lTUwkJLSBnZXQgbGV2ZWwgMSBwYXJhbWV0ZXIJYXJnOiAoc3RydWN0IHNjY19raXNzX2NtZCAqKSBhcmcKKyAqIFNJT0NTQ0NTS0lTUwkJLSBzZXQgbGV2ZWwgMSBwYXJhbWV0ZXIgYXJnOiAoc3RydWN0IHNjY19raXNzX2NtZCAqKSBhcmcKKyAqIFNJT0NTQ0NHU1RBVAkJLSBnZXQgZHJpdmVyIHN0YXR1cwlhcmc6IChzdHJ1Y3Qgc2NjX3N0YXQgKikgYXJnCisgKiBTSU9DU0NDQ0FMCQktIHNlbmQgY2FsaWIuIHBhdHRlcm4JYXJnOiAoc3RydWN0IHNjY19jYWxpYnJhdGUgKikgYXJnCisgKi8KKworc3RhdGljIGludCBzY2NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBzY2Nfa2lzc19jbWQga2lzc19jbWQ7CisJc3RydWN0IHNjY19tZW1fY29uZmlnIG1lbWNmZzsKKwlzdHJ1Y3Qgc2NjX2h3X2NvbmZpZyBod2NmZzsKKwlzdHJ1Y3Qgc2NjX2NhbGlicmF0ZSBjYWw7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2MgPSAoc3RydWN0IHNjY19jaGFubmVsICopIGRldi0+cHJpdjsKKwlpbnQgY2hhbjsKKwl1bnNpZ25lZCBjaGFyIGRldmljZV9uYW1lW0lGTkFNU0laXTsKKwl2b2lkIF9fdXNlciAqYXJnID0gaWZyLT5pZnJfZGF0YTsKKwkKKwkKKwlpZiAoIURyaXZlcl9Jbml0aWFsaXplZCkKKwl7CisJCWlmIChjbWQgPT0gU0lPQ1NDQ0NGRykKKwkJeworCQkJaW50IGZvdW5kID0gMTsKKworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKSByZXR1cm4gLUVQRVJNOworCQkJaWYgKCFhcmcpIHJldHVybiAtRUZBVUxUOworCisJCQlpZiAoTmNoaXBzID49IFNDQ19NQVhDSElQUykgCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmaHdjZmcsIGFyZywgc2l6ZW9mKGh3Y2ZnKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChod2NmZy5pcnEgPT0gMikgaHdjZmcuaXJxID0gOTsKKworCQkJaWYgKGh3Y2ZnLmlycSA8IDAgfHwgaHdjZmcuaXJxID49IE5SX0lSUVMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCisJCQlpZiAoIUl2ZWNbaHdjZmcuaXJxXS51c2VkICYmIGh3Y2ZnLmlycSkKKwkJCXsKKwkJCQlpZiAocmVxdWVzdF9pcnEoaHdjZmcuaXJxLCBzY2NfaXNyLCBTQV9JTlRFUlJVUFQsICJBWC4yNSBTQ0MiLCBOVUxMKSkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiejg1MzBkcnY6IHdhcm5pbmcsIGNhbm5vdCBnZXQgSVJRICVkXG4iLCBod2NmZy5pcnEpOworCQkJCWVsc2UKKwkJCQkJSXZlY1tod2NmZy5pcnFdLnVzZWQgPSAxOworCQkJfQorCisJCQlpZiAoaHdjZmcudmVjdG9yX2xhdGNoICYmICFWZWN0b3JfTGF0Y2gpIHsKKwkJCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGh3Y2ZnLnZlY3Rvcl9sYXRjaCwgMSwgInNjYyB2ZWN0b3IgbGF0Y2giKSkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiejg1MzBkcnY6IHdhcm5pbmcsIGNhbm5vdCByZXNlcnZlIHZlY3RvciBsYXRjaCBwb3J0IDB4JWx4XG4sIGRpc2FibGVkLiIsIGh3Y2ZnLnZlY3Rvcl9sYXRjaCk7CisJCQkJZWxzZQorCQkJCQlWZWN0b3JfTGF0Y2ggPSBod2NmZy52ZWN0b3JfbGF0Y2g7CisJCQl9CisKKwkJCWlmIChod2NmZy5jbG9jayA9PSAwKQorCQkJCWh3Y2ZnLmNsb2NrID0gU0NDX0RFRkFVTFRfQ0xPQ0s7CisKKyNpZm5kZWYgU0NDX0RPTlRfQ0hFQ0sKKworCQkJaWYocmVxdWVzdF9yZWdpb24oaHdjZmcuY3RybF9hLCAxLCAic2NjLXByb2JlIikpCisJCQl7CisJCQkJZGlzYWJsZV9pcnEoaHdjZmcuaXJxKTsKKwkJCQlPdXRiKGh3Y2ZnLmN0cmxfYSwgMCk7CisJCQkJT3V0UmVnKGh3Y2ZnLmN0cmxfYSwgUjksIEZIV1JFUyk7CisJCQkJdWRlbGF5KDEwMCk7CisJCQkJT3V0UmVnKGh3Y2ZnLmN0cmxfYSxSMTMsMHg1NSk7CQkvKiBpcyB0aGlzIGNoaXAgcmVhbGx5IHRoZXJlPyAqLworCQkJCXVkZWxheSg1KTsKKworCQkJCWlmIChJblJlZyhod2NmZy5jdHJsX2EsUjEzKSAhPSAweDU1KQorCQkJCQlmb3VuZCA9IDA7CisJCQkJZW5hYmxlX2lycShod2NmZy5pcnEpOworCQkJCXJlbGVhc2VfcmVnaW9uKGh3Y2ZnLmN0cmxfYSwgMSk7CisJCQl9CisJCQllbHNlCisJCQkJZm91bmQgPSAwOworI2VuZGlmCisKKwkJCWlmIChmb3VuZCkKKwkJCXsKKwkJCQlTQ0NfSW5mb1syKk5jaGlwcyAgXS5jdHJsID0gaHdjZmcuY3RybF9hOworCQkJCVNDQ19JbmZvWzIqTmNoaXBzICBdLmRhdGEgPSBod2NmZy5kYXRhX2E7CisJCQkJU0NDX0luZm9bMipOY2hpcHMgIF0uaXJxICA9IGh3Y2ZnLmlycTsKKwkJCQlTQ0NfSW5mb1syKk5jaGlwcysxXS5jdHJsID0gaHdjZmcuY3RybF9iOworCQkJCVNDQ19JbmZvWzIqTmNoaXBzKzFdLmRhdGEgPSBod2NmZy5kYXRhX2I7CisJCQkJU0NDX0luZm9bMipOY2hpcHMrMV0uaXJxICA9IGh3Y2ZnLmlycTsKKwkJCQorCQkJCVNDQ19jdHJsW05jaGlwc10uY2hhbl9BID0gaHdjZmcuY3RybF9hOworCQkJCVNDQ19jdHJsW05jaGlwc10uY2hhbl9CID0gaHdjZmcuY3RybF9iOworCQkJCVNDQ19jdHJsW05jaGlwc10uaXJxICAgID0gaHdjZmcuaXJxOworCQkJfQorCisKKwkJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCAyOyBjaGFuKyspCisJCQl7CisJCQkJc3ByaW50ZihkZXZpY2VfbmFtZSwgIiVzJWkiLCBTQ0NfRHJpdmVyTmFtZSwgMipOY2hpcHMrY2hhbik7CisKKwkJCQlTQ0NfSW5mb1syKk5jaGlwcytjaGFuXS5zcGVjaWFsID0gaHdjZmcuc3BlY2lhbDsKKwkJCQlTQ0NfSW5mb1syKk5jaGlwcytjaGFuXS5jbG9jayA9IGh3Y2ZnLmNsb2NrOworCQkJCVNDQ19JbmZvWzIqTmNoaXBzK2NoYW5dLmJyYW5kID0gaHdjZmcuYnJhbmQ7CisJCQkJU0NDX0luZm9bMipOY2hpcHMrY2hhbl0ub3B0aW9uID0gaHdjZmcub3B0aW9uOworCQkJCVNDQ19JbmZvWzIqTmNoaXBzK2NoYW5dLmVuaGFuY2VkID0gaHdjZmcuZXNjYzsKKworI2lmZGVmIFNDQ19ET05UX0NIRUNLCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGRhdGEgcG9ydCA9IDB4JTMuM3ggIGNvbnRyb2wgcG9ydCA9IDB4JTMuM3hcbiIsCisJCQkJCWRldmljZV9uYW1lLCAKKwkJCQkJU0NDX0luZm9bMipOY2hpcHMrY2hhbl0uZGF0YSwgCisJCQkJCVNDQ19JbmZvWzIqTmNoaXBzK2NoYW5dLmN0cmwpOworCisjZWxzZQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBkYXRhIHBvcnQgPSAweCUzLjNseCAgY29udHJvbCBwb3J0ID0gMHglMy4zbHggLS0gJXNcbiIsCisJCQkJCWRldmljZV9uYW1lLAorCQkJCQljaGFuPyBod2NmZy5kYXRhX2IgOiBod2NmZy5kYXRhX2EsIAorCQkJCQljaGFuPyBod2NmZy5jdHJsX2IgOiBod2NmZy5jdHJsX2EsCisJCQkJCWZvdW5kPyAiZm91bmQiIDogIm1pc3NpbmciKTsKKyNlbmRpZgorCisJCQkJaWYgKGZvdW5kKQorCQkJCXsKKwkJCQkJcmVxdWVzdF9yZWdpb24oU0NDX0luZm9bMipOY2hpcHMrY2hhbl0uY3RybCwgMSwgInNjYyBjdHJsIik7CisJCQkJCXJlcXVlc3RfcmVnaW9uKFNDQ19JbmZvWzIqTmNoaXBzK2NoYW5dLmRhdGEsIDEsICJzY2MgZGF0YSIpOworCQkJCQlpZiAoTmNoaXBzK2NoYW4gIT0gMCAmJgorCQkJCQkgICAgc2NjX25ldF9hbGxvYyhkZXZpY2VfbmFtZSwgCisJCQkJCQkJICAmU0NDX0luZm9bMipOY2hpcHMrY2hhbl0pKQorCQkJCQkgICAgcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfQorCQkJCisJCQlpZiAoZm91bmQpIE5jaGlwcysrOworCQkJCisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJaWYgKGNtZCA9PSBTSU9DU0NDSU5JKQorCQl7CisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCQkKKwkJCWlmIChOY2hpcHMgPT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJejg1MzBfaW5pdCgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJCisJCXJldHVybiAtRUlOVkFMOwkvKiBjb25mdXNlIHRoZSB1c2VyICovCisJfQorCQorCWlmICghc2NjLT5pbml0KQorCXsKKwkJaWYgKGNtZCA9PSBTSU9DU0NDQ0hBTklOSSkKKwkJeworCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSByZXR1cm4gLUVQRVJNOworCQkJaWYgKCFhcmcpIHJldHVybiAtRUlOVkFMOworCQkJCisJCQlzY2MtPnN0YXQuYnVmc2l6ZSAgID0gU0NDX0JVRlNJWkU7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmc2NjLT5tb2RlbSwgYXJnLCBzaXplb2Yoc3RydWN0IHNjY19tb2RlbSkpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJCisJCQkvKiBkZWZhdWx0IEtJU1MgUGFyYW1zICovCisJCQorCQkJaWYgKHNjYy0+bW9kZW0uc3BlZWQgPCA0ODAwKQorCQkJeworCQkJCXNjYy0+a2lzcy50eGRlbGF5ID0gMzY7CQkvKiAzNjAgbXMgKi8KKwkJCQlzY2MtPmtpc3MucGVyc2lzdCA9IDQyOwkJLyogMjUlIHBlcnNpc3RlbmNlICovCQkJLyogd2FzIDI1ICovCisJCQkJc2NjLT5raXNzLnNsb3R0aW1lID0gMTY7CS8qIDE2MCBtcyAqLworCQkJCXNjYy0+a2lzcy50YWlsdGltZSA9IDQ7CQkvKiBtaW5pbWFsIHJlYXNvbmFibGUgdmFsdWUgKi8KKwkJCQlzY2MtPmtpc3MuZnVsbGR1cCA9IDA7CQkvKiBDU01BICovCisJCQkJc2NjLT5raXNzLndhaXR0aW1lID0gNTA7CS8qIDUwMCBtcyAqLworCQkJCXNjYy0+a2lzcy5tYXhrZXl1cCA9IDEwOwkvKiAxMCBzICovCisJCQkJc2NjLT5raXNzLm1pbnRpbWUgPSAzOwkJLyogMyBzICovCisJCQkJc2NjLT5raXNzLmlkbGV0aW1lID0gMzA7CS8qIDMwIHMgKi8KKwkJCQlzY2MtPmtpc3MubWF4ZGVmZXIgPSAxMjA7CS8qIDIgbWluICovCisJCQkJc2NjLT5raXNzLnNvZnRkY2QgPSAwOwkJLyogaGFyZHdhcmUgZGNkICovCisJCQl9IGVsc2UgeworCQkJCXNjYy0+a2lzcy50eGRlbGF5ID0gMTA7CQkvKiAxMDAgbXMgKi8KKwkJCQlzY2MtPmtpc3MucGVyc2lzdCA9IDY0OwkJLyogMjUlIHBlcnNpc3RlbmNlICovCQkJLyogd2FzIDI1ICovCisJCQkJc2NjLT5raXNzLnNsb3R0aW1lID0gODsJCS8qIDE2MCBtcyAqLworCQkJCXNjYy0+a2lzcy50YWlsdGltZSA9IDE7CQkvKiBtaW5pbWFsIHJlYXNvbmFibGUgdmFsdWUgKi8KKwkJCQlzY2MtPmtpc3MuZnVsbGR1cCA9IDA7CQkvKiBDU01BICovCisJCQkJc2NjLT5raXNzLndhaXR0aW1lID0gNTA7CS8qIDUwMCBtcyAqLworCQkJCXNjYy0+a2lzcy5tYXhrZXl1cCA9IDc7CQkvKiA3IHMgKi8KKwkJCQlzY2MtPmtpc3MubWludGltZSA9IDM7CQkvKiAzIHMgKi8KKwkJCQlzY2MtPmtpc3MuaWRsZXRpbWUgPSAzMDsJLyogMzAgcyAqLworCQkJCXNjYy0+a2lzcy5tYXhkZWZlciA9IDEyMDsJLyogMiBtaW4gKi8KKwkJCQlzY2MtPmtpc3Muc29mdGRjZCA9IDA7CQkvKiBoYXJkd2FyZSBkY2QgKi8KKwkJCX0KKwkJCQorCQkJc2NjLT50eF9idWZmID0gTlVMTDsKKwkJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNjYy0+dHhfcXVldWUpOworCQkJc2NjLT5pbml0ID0gMTsKKwkJCQorCQkJcmV0dXJuIDA7CisJCX0KKwkJCisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwlzd2l0Y2goY21kKQorCXsKKwkJY2FzZSBTSU9DU0NDUkVTRVJWRUQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJCWNhc2UgU0lPQ1NDQ1NNRU06CisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpIHJldHVybiAtRVBFUk07CisJCQlpZiAoIWFyZyB8fCBjb3B5X2Zyb21fdXNlcigmbWVtY2ZnLCBhcmcsIHNpemVvZihtZW1jZmcpKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXNjYy0+c3RhdC5idWZzaXplICAgPSBtZW1jZmcuYnVmc2l6ZTsKKwkJCXJldHVybiAwOworCQkKKwkJY2FzZSBTSU9DU0NDR1NUQVQ6CisJCQlpZiAoIWFyZyB8fCBjb3B5X3RvX3VzZXIoYXJnLCAmc2NjLT5zdGF0LCBzaXplb2Yoc2NjLT5zdGF0KSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gMDsKKwkJCisJCWNhc2UgU0lPQ1NDQ0dLSVNTOgorCQkJaWYgKCFhcmcgfHwgY29weV9mcm9tX3VzZXIoJmtpc3NfY21kLCBhcmcsIHNpemVvZihraXNzX2NtZCkpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJa2lzc19jbWQucGFyYW0gPSBzY2NfZ2V0X3BhcmFtKHNjYywga2lzc19jbWQuY29tbWFuZCk7CisJCQlpZiAoY29weV90b191c2VyKGFyZywgJmtpc3NfY21kLCBzaXplb2Yoa2lzc19jbWQpKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCQkKKwkJY2FzZSBTSU9DU0NDU0tJU1M6CisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldHVybiAtRVBFUk07CisJCQlpZiAoIWFyZyB8fCBjb3B5X2Zyb21fdXNlcigma2lzc19jbWQsIGFyZywgc2l6ZW9mKGtpc3NfY21kKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gc2NjX3NldF9wYXJhbShzY2MsIGtpc3NfY21kLmNvbW1hbmQsIGtpc3NfY21kLnBhcmFtKTsKKwkJCisJCWNhc2UgU0lPQ1NDQ0NBTDoKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkgcmV0dXJuIC1FUEVSTTsKKwkJCWlmICghYXJnIHx8IGNvcHlfZnJvbV91c2VyKCZjYWwsIGFyZywgc2l6ZW9mKGNhbCkpIHx8IGNhbC50aW1lID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXNjY19zdGFydF9jYWxpYnJhdGUoc2NjLCBjYWwudGltZSwgY2FsLnBhdHRlcm4pOworCQkJcmV0dXJuIDA7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJCQorCX0KKwkKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogLS0tLT4gc2V0IGludGVyZmFjZSBjYWxsc2lnbiA8LS0tLSAqLworCitzdGF0aWMgaW50IHNjY19uZXRfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkcjsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2EtPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCXJldHVybiAwOworfQorCisvKiAtLS0tPiBnZXQgc3RhdGlzdGljcyA8LS0tLSAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2MgPSAoc3RydWN0IHNjY19jaGFubmVsICopIGRldi0+cHJpdjsKKwkKKwlzY2MtPmRldl9zdGF0LnJ4X2Vycm9ycyA9IHNjYy0+c3RhdC5yeGVycnMgKyBzY2MtPnN0YXQucnhfb3ZlcjsKKwlzY2MtPmRldl9zdGF0LnR4X2Vycm9ycyA9IHNjYy0+c3RhdC50eGVycnMgKyBzY2MtPnN0YXQudHhfdW5kZXI7CisJc2NjLT5kZXZfc3RhdC5yeF9maWZvX2Vycm9ycyA9IHNjYy0+c3RhdC5yeF9vdmVyOworCXNjYy0+ZGV2X3N0YXQudHhfZmlmb19lcnJvcnMgPSBzY2MtPnN0YXQudHhfdW5kZXI7CisKKwlyZXR1cm4gJnNjYy0+ZGV2X3N0YXQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqCQlkdW1wIHN0YXRpc3RpY3MgdG8gL3Byb2MvbmV0L3o4NTMwZHJ2CQkgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjY19uZXRfc2VxX2lkeChsb2ZmX3QgcG9zKQoreworCWludCBrOworCisJZm9yIChrID0gMDsgayA8IE5jaGlwcyoyOyArK2spIHsKKwkJaWYgKCFTQ0NfSW5mb1trXS5pbml0KSAKKwkJCWNvbnRpbnVlOworCQlpZiAocG9zLS0gPT0gMCkKKwkJCXJldHVybiAmU0NDX0luZm9ba107CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqc2NjX25ldF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXJldHVybiAqcG9zID8gc2NjX25ldF9zZXFfaWR4KCpwb3MgLSAxKSA6IFNFUV9TVEFSVF9UT0tFTjsKKwkKK30KKworc3RhdGljIHZvaWQgKnNjY19uZXRfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXVuc2lnbmVkIGs7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2MgPSB2OworCSsrKnBvczsKKwkKKwlmb3IgKGsgPSAodiA9PSBTRVFfU1RBUlRfVE9LRU4pID8gMCA6IChzY2MgLSBTQ0NfSW5mbykrMTsKKwkgICAgIGsgPCBOY2hpcHMqMjsgKytrKSB7CisJCWlmIChTQ0NfSW5mb1trXS5pbml0KSAKKwkJCXJldHVybiAmU0NDX0luZm9ba107CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzY2NfbmV0X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworfQorCitzdGF0aWMgaW50IHNjY19uZXRfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXNlcV9wdXRzKHNlcSwgIno4NTMwZHJ2LSJWRVJTSU9OIlxuIik7CisJfSBlbHNlIGlmICghRHJpdmVyX0luaXRpYWxpemVkKSB7CisJCXNlcV9wdXRzKHNlcSwgIm5vdCBpbml0aWFsaXplZFxuIik7CisJfSBlbHNlIGlmICghTmNoaXBzKSB7CisJCXNlcV9wdXRzKHNlcSwgImNoaXBzIG1pc3NpbmdcbiIpOworCX0gZWxzZSB7CisJCWNvbnN0IHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjID0gdjsKKwkJY29uc3Qgc3RydWN0IHNjY19zdGF0ICpzdGF0ID0gJnNjYy0+c3RhdDsKKwkJY29uc3Qgc3RydWN0IHNjY19raXNzICpraXNzID0gJnNjYy0+a2lzczsKKworCisJCS8qIGRldglkYXRhIGN0cmwgaXJxIGNsb2NrIGJyYW5kIGVuaCB2ZWN0b3Igc3BlY2lhbCBvcHRpb24gCisJCSAqCWJhdWQgbnJ6IGNsb2Nrc3JjIHNvZnRkY2QgYnVmc2l6ZQorCQkgKglyeGludHMgdHhpbnRzIGV4aW50cyBzcGludHMKKwkJICoJcmN2ZCByeGVycnMgb3ZlciAvIHhtaXQgdHhlcnJzIHVuZGVyIC8gbm9zcGFjZSBidWZzaXplCisJCSAqCXR4ZCBwZXJzIHNsb3QgdGFpbCBmdWwgd2FpdCBtaW4gbWF4ayBpZGwgZGVmciB0eG9mIGdycAorCQkgKglXICMjICMjICMjICMjICMjICMjICMjICMjICMjICMjICMjICMjICMjICMjICMjICMjCisJCSAqCVIgIyMgIyMgWFggIyMgIyMgIyMgIyMgIyMgWFggIyMgIyMgIyMgIyMgIyMgIyMgIyMKKwkJICovCisKKwkJc2VxX3ByaW50ZihzZXEsICIlc1x0JTMuM2x4ICUzLjNseCAlZCAlbHUgJTIuMnggJWQgJTMuM2x4ICUzLjNseCAlZFxuIiwKKwkJCQlzY2MtPmRldi0+bmFtZSwKKwkJCQlzY2MtPmRhdGEsIHNjYy0+Y3RybCwgc2NjLT5pcnEsIHNjYy0+Y2xvY2ssIHNjYy0+YnJhbmQsCisJCQkJc2NjLT5lbmhhbmNlZCwgVmVjdG9yX0xhdGNoLCBzY2MtPnNwZWNpYWwsCisJCQkJc2NjLT5vcHRpb24pOworCQlzZXFfcHJpbnRmKHNlcSwgIlx0JWx1ICVkICVkICVkICVkXG4iLAorCQkJCXNjYy0+bW9kZW0uc3BlZWQsIHNjYy0+bW9kZW0ubnJ6LAorCQkJCXNjYy0+bW9kZW0uY2xvY2tzcmMsIGtpc3MtPnNvZnRkY2QsCisJCQkJc3RhdC0+YnVmc2l6ZSk7CisJCXNlcV9wcmludGYoc2VxLCAiXHQlbHUgJWx1ICVsdSAlbHVcbiIsCisJCQkJc3RhdC0+cnhpbnRzLCBzdGF0LT50eGludHMsIHN0YXQtPmV4aW50cywgc3RhdC0+c3BpbnRzKTsKKwkJc2VxX3ByaW50ZihzZXEsICJcdCVsdSAlbHUgJWQgLyAlbHUgJWx1ICVkIC8gJWQgJWRcbiIsCisJCQkJc3RhdC0+cnhmcmFtZXMsIHN0YXQtPnJ4ZXJycywgc3RhdC0+cnhfb3ZlciwKKwkJCQlzdGF0LT50eGZyYW1lcywgc3RhdC0+dHhlcnJzLCBzdGF0LT50eF91bmRlciwKKwkJCQlzdGF0LT5ub3NwYWNlLCAgc3RhdC0+dHhfc3RhdGUpOworCisjZGVmaW5lIEsoeCkga2lzcy0+eAorCQlzZXFfcHJpbnRmKHNlcSwgIlx0JWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCisJCQkJSyh0eGRlbGF5KSwgSyhwZXJzaXN0KSwgSyhzbG90dGltZSksIEsodGFpbHRpbWUpLAorCQkJCUsoZnVsbGR1cCksIEsod2FpdHRpbWUpLCBLKG1pbnRpbWUpLCBLKG1heGtleXVwKSwKKwkJCQlLKGlkbGV0aW1lKSwgSyhtYXhkZWZlciksIEsodHhfaW5oaWJpdCksIEsoZ3JvdXApKTsKKyN1bmRlZiBLCisjaWZkZWYgU0NDX0RFQlVHCisJCXsKKwkJCWludCByZWc7CisKKwkJc2VxX3ByaW50ZihzZXEsICJcdFcgIik7CisJCQlmb3IgKHJlZyA9IDA7IHJlZyA8IDE2OyByZWcrKykKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiUyLjJ4ICIsIHNjYy0+d3JlZ1tyZWddKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKwkJCQorCQlzZXFfcHJpbnRmKHNlcSwgIlx0UiAlMi4yeCAlMi4yeCBYWCAiLCBJblJlZyhzY2MtPmN0cmwsUjApLCBJblJlZyhzY2MtPmN0cmwsUjEpKTsKKwkJCWZvciAocmVnID0gMzsgcmVnIDwgODsgcmVnKyspCisJCQkJc2VxX3ByaW50ZihzZXEsICIlMi4yeCAiLCBJblJlZyhzY2MtPmN0cmwsIHJlZykpOworCQkJc2VxX3ByaW50ZihzZXEsICJYWCAiKTsKKwkJCWZvciAocmVnID0gOTsgcmVnIDwgMTY7IHJlZysrKQorCQkJCXNlcV9wcmludGYoc2VxLCAiJTIuMnggIiwgSW5SZWcoc2NjLT5jdHJsLCByZWcpKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKwkJfQorI2VuZGlmCisJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CisJfQorCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHNjY19uZXRfc2VxX29wcyA9IHsKKwkuc3RhcnQgID0gc2NjX25ldF9zZXFfc3RhcnQsCisJLm5leHQgICA9IHNjY19uZXRfc2VxX25leHQsCisJLnN0b3AgICA9IHNjY19uZXRfc2VxX3N0b3AsCisJLnNob3cgICA9IHNjY19uZXRfc2VxX3Nob3csCit9OworCisKK3N0YXRpYyBpbnQgc2NjX25ldF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnNjY19uZXRfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNjY19uZXRfc2VxX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuCSA9IHNjY19uZXRfc2VxX29wZW4sCisJLnJlYWQJID0gc2VxX3JlYWQsCisJLmxsc2VlawkgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKKyAKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqIAkJCUluaXQgU0NDIGRyaXZlciAJCQkgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgaW50IF9faW5pdCBzY2NfaW5pdF9kcml2ZXIgKHZvaWQpCit7CisJY2hhciBkZXZuYW1lW0lGTkFNU0laXTsKKwkKKwlwcmludGsoYmFubmVyKTsKKwkKKwlzcHJpbnRmKGRldm5hbWUsIiVzMCIsIFNDQ19Ecml2ZXJOYW1lKTsKKwkKKwlydG5sX2xvY2soKTsKKwlpZiAoc2NjX25ldF9hbGxvYyhkZXZuYW1lLCBTQ0NfSW5mbykpIHsKKwkJcnRubF91bmxvY2soKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJ6ODUzMGRydjogY2Fubm90IGluaXRpYWxpemUgbW9kdWxlXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJ0bmxfdW5sb2NrKCk7CisKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgiejg1MzBkcnYiLCAwLCAmc2NjX25ldF9zZXFfZm9wcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNjY19jbGVhbnVwX2RyaXZlcih2b2lkKQoreworCWlvX3BvcnQgY3RybDsKKwlpbnQgazsKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQorCWlmIChOY2hpcHMgPT0gMCAmJiAoZGV2ID0gU0NDX0luZm9bMF0uZGV2KSkgCisJeworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlmcmVlX25ldGRldihkZXYpOworCX0KKworCS8qIEd1YXJkIGFnYWluc3QgY2hpcCBwcmF0dGxlICovCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkKKwlmb3IgKGsgPSAwOyBrIDwgTmNoaXBzOyBrKyspCisJCWlmICggKGN0cmwgPSBTQ0NfY3RybFtrXS5jaGFuX0EpICkKKwkJeworCQkJT3V0YihjdHJsLCAwKTsKKwkJCU91dFJlZyhjdHJsLFI5LEZIV1JFUyk7CS8qIGZvcmNlIGhhcmR3YXJlIHJlc2V0ICovCisJCQl1ZGVsYXkoNTApOworCQl9CisJCQorCS8qIFRvIHVubG9hZCB0aGUgcG9ydCBtdXN0IGJlIGNsb3NlZCBzbyBubyByZWFsIElSUSBwZW5kaW5nICovCisJZm9yIChrPTA7IGsgPCBOUl9JUlFTIDsgaysrKQorCQlpZiAoSXZlY1trXS51c2VkKSBmcmVlX2lycShrLCBOVUxMKTsKKwkJCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCQkKKwkvKiBOb3cgY2xlYW4gdXAgKi8KKwlmb3IgKGsgPSAwOyBrIDwgTmNoaXBzKjI7IGsrKykKKwl7CisJCXNjYyA9ICZTQ0NfSW5mb1trXTsKKwkJaWYgKHNjYy0+Y3RybCkKKwkJeworCQkJcmVsZWFzZV9yZWdpb24oc2NjLT5jdHJsLCAxKTsKKwkJCXJlbGVhc2VfcmVnaW9uKHNjYy0+ZGF0YSwgMSk7CisJCX0KKwkJaWYgKHNjYy0+ZGV2KQorCQl7CisJCQl1bnJlZ2lzdGVyX25ldGRldihzY2MtPmRldik7CisJCQlmcmVlX25ldGRldihzY2MtPmRldik7CisJCX0KKwl9CisJCisJCQorCWlmIChWZWN0b3JfTGF0Y2gpCisJCXJlbGVhc2VfcmVnaW9uKFZlY3Rvcl9MYXRjaCwgMSk7CisKKwlwcm9jX25ldF9yZW1vdmUoIno4NTMwZHJ2Iik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkpvZXJnIFJldXRlciA8anJldXRlckB5YWluYS5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQVguMjUgRGV2aWNlIERyaXZlciBmb3IgWjg1MzAgYmFzZWQgSERMQyBjYXJkcyIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIlo4NTMwIGJhc2VkIFNDQyBjYXJkcyBmb3IgQW1hdGV1ciBSYWRpbyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX2luaXQoc2NjX2luaXRfZHJpdmVyKTsKK21vZHVsZV9leGl0KHNjY19jbGVhbnVwX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0uYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3lhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkN2IwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0uYwpAQCAtMCwwICsxLDEyMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICAgIHlhbS5jICAtLSBZQU0gcmFkaW8gbW9kZW0gZHJpdmVyLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWRlcmljIFJpYmxlIEYxT0FUIChmcmlibGVAdGVhc2VyLmZyKQorICogICAgICBBZGFwdGVkIGZyb20gYmF5Y29tLmMgZHJpdmVyIHdyaXR0ZW4gYnkgVGhvbWFzIFNhaWxlciAoc2FpbGVyQGlmZS5lZS5ldGh6LmNoKQorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgR1BMIGFsbG93cyB5b3UgdG8gdXNlIHRoZSBkcml2ZXIsIE5PVCB0aGUgcmFkaW8uCisgKiAgSW4gb3JkZXIgdG8gdXNlIHRoZSByYWRpbywgeW91IG5lZWQgYSBsaWNlbnNlIGZyb20gdGhlIGNvbW11bmljYXRpb25zCisgKiAgYXV0aG9yaXR5IG9mIHlvdXIgY291bnRyeS4KKyAqCisgKgorICogIEhpc3Rvcnk6CisgKiAgIDAuMCBGMU9BVCAwNi4wNi45OCAgQmVnaW4gb2Ygd29yayB3aXRoIGJheWNvbS5jIHNvdXJjZSBjb2RlIFYgMC4zCisgKiAgIDAuMSBGMU9BVCAwNy4wNi45OCAgQWRkIHRpbWVyIHBvbGxpbmcgcm91dGluZSBmb3IgY2hhbm5lbCBhcmJpdHJhdGlvbgorICogICAwLjIgRjZGQkIgMDguMDYuOTggIEFkZGVkIGRlbGF5IGFmdGVyIEZQR0EgcHJvZ3JhbW1pbmcKKyAqICAgMC4zIEY2RkJCIDI5LjA3Ljk4ICBEZWxheWVkIFBUVCBpbXBsZW1lbnRhdGlvbiBmb3IgZHVwbW9kZT0yCisgKiAgIDAuNCBGNkZCQiAzMC4wNy45OCAgQWRkZWQgVHhUYWlsLCBTbG90dGltZSBhbmQgUGVyc2lzdGFuY2UKKyAqICAgMC41IEY2RkJCIDAxLjA4Ljk4ICBTaGFyZWQgSVJRcywgL3Byb2MvbmV0IGFuZCBuZXR3b3JrIHN0YXRpc3RpY3MKKyAqICAgMC42IEY2RkJCIDI1LjA4Ljk4ICBBZGRlZCAxMjAwQmRzIGZvcm1hdAorICogICAwLjcgRjZGQkIgMTIuMDkuOTggIEFkZGVkIHRvIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbgorICogICAwLjggRjZGQkIgMTQuMTAuOTggIEZpeGVkIHNsb3R0aW1lL3BlcnNpc3RlbmNlIHRpbWluZyBidWcKKyAqICAgICAgIE9LMVpJQSAyLjA5LjAxICBGaXhlZCAia2ZyZWVfc2tiIG9uIGhhcmQgSVJRIiAKKyAqICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBkZXZfa2ZyZWVfc2tiX2FueSgpLiAoaW1wb3J0YW50IGluIDIuNCBrZXJuZWwpCisgKiAgIAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaWYgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCisvKiBwcm90b3R5cGVzIGZvciBheDI1X2VuY2Fwc3VsYXRlIGFuZCBheDI1X3JlYnVpbGRfaGVhZGVyICovCisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNlbmRpZgkvKiBDT05GSUdfQVgyNSB8fCBDT05GSUdfQVgyNV9NT0RVTEUgKi8KKworLyogbWFrZSBnZW5rc3ltcyBoYXBweSAqLworI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgveWFtLmg+CisjaW5jbHVkZSAieWFtOTYwMC5oIgorI2luY2x1ZGUgInlhbTEyMDAuaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyIHlhbV9kcnZuYW1lW10gPSAieWFtIjsKK3N0YXRpYyBjaGFyIHlhbV9kcnZpbmZvW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAiWUFNIGRyaXZlciB2ZXJzaW9uIDAuOCBieSBGMU9BVC9GNkZCQlxuIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgWUFNXzk2MDAJMQorI2RlZmluZSBZQU1fMTIwMAkyCisKKyNkZWZpbmUgTlJfUE9SVFMJNAorI2RlZmluZSBZQU1fTUFHSUMJMHhGMTBBNzY1NAorCisvKiBUcmFuc21pdHRlciBzdGF0ZXMgKi8KKworI2RlZmluZSBUWF9PRkYJCTAKKyNkZWZpbmUgVFhfSEVBRAkJMQorI2RlZmluZSBUWF9EQVRBCQkyCisjZGVmaW5lIFRYX0NSQzEJCTMKKyNkZWZpbmUgVFhfQ1JDMgkJNAorI2RlZmluZSBUWF9UQUlMCQk1CisKKyNkZWZpbmUgWUFNX01BWF9GUkFNRQkxMDI0CisKKyNkZWZpbmUgREVGQVVMVF9CSVRSQVRFCTk2MDAJCQkvKiBicHMgKi8KKyNkZWZpbmUgREVGQVVMVF9IT0xERAkxMAkJCS8qIHNlYyAqLworI2RlZmluZSBERUZBVUxUX1RYRAkzMDAJCQkvKiBtcyAqLworI2RlZmluZSBERUZBVUxUX1RYVEFJTAkxMAkJCS8qIG1zICovCisjZGVmaW5lIERFRkFVTFRfU0xPVAkxMDAJCQkvKiBtcyAqLworI2RlZmluZSBERUZBVUxUX1BFUlMJNjQJCQkvKiAwLT4yNTUgKi8KKworc3RydWN0IHlhbV9wb3J0IHsKKwlpbnQgbWFnaWM7CisJaW50IGJpdHJhdGU7CisJaW50IGJhdWRyYXRlOworCWludCBpb2Jhc2U7CisJaW50IGlycTsKKwlpbnQgZHVwbW9kZTsKKworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkvKiBTdGF0cyBzZWN0aW9uICovCisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCWludCBuYl9yeGludDsKKwlpbnQgbmJfbWRpbnQ7CisKKwkvKiBQYXJhbWV0ZXJzIHNlY3Rpb24gKi8KKworCWludCB0eGQ7CQkJCS8qIHR4IGRlbGF5ICovCisJaW50IGhvbGRkOwkJCQkvKiBkdXBsZXggcHR0IGRlbGF5ICovCisJaW50IHR4dGFpbDsJCQkJLyogdHh0YWlsIGRlbGF5ICovCisJaW50IHNsb3Q7CQkJCS8qIHNsb3R0aW1lICovCisJaW50IHBlcnM7CQkJCS8qIHBlcnNpc3RlbmNlICovCisKKwkvKiBUeCBzZWN0aW9uICovCisKKwlpbnQgdHhfc3RhdGU7CisJaW50IHR4X2NvdW50OworCWludCBzbG90Y250OworCXVuc2lnbmVkIGNoYXIgdHhfYnVmW1lBTV9NQVhfRlJBTUVdOworCWludCB0eF9sZW47CisJaW50IHR4X2NyY2wsIHR4X2NyY2g7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBzZW5kX3F1ZXVlOwkJLyogUGFja2V0cyBhd2FpdGluZyB0cmFuc21pc3Npb24gKi8KKworCS8qIFJ4IHNlY3Rpb24gKi8KKworCWludCBkY2Q7CisJdW5zaWduZWQgY2hhciByeF9idWZbWUFNX01BWF9GUkFNRV07CisJaW50IHJ4X2xlbjsKKwlpbnQgcnhfY3JjbCwgcnhfY3JjaDsKK307CisKK3N0cnVjdCB5YW1fbWNzIHsKKwl1bnNpZ25lZCBjaGFyIGJpdHNbWUFNX0ZQR0FfU0laRV07CisJaW50IGJpdHJhdGU7CisJc3RydWN0IHlhbV9tY3MgKm5leHQ7Cit9OworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnlhbV9kZXZzW05SX1BPUlRTXTsKKworc3RhdGljIHN0cnVjdCB5YW1fbWNzICp5YW1fZGF0YTsKKworc3RhdGljIGNoYXIgYXgyNV9iY2FzdFs3XSA9Cit7J1EnIDw8IDEsICdTJyA8PCAxLCAnVCcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnICcgPDwgMSwgJzAnIDw8IDF9Oworc3RhdGljIGNoYXIgYXgyNV90ZXN0WzddID0KK3snTCcgPDwgMSwgJ0knIDw8IDEsICdOJyA8PCAxLCAnVScgPDwgMSwgJ1gnIDw8IDEsICcgJyA8PCAxLCAnMScgPDwgMX07CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB5YW1fdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUkJSKGlvYmFzZSkJKGlvYmFzZSswKQorI2RlZmluZSBUSFIoaW9iYXNlKQkoaW9iYXNlKzApCisjZGVmaW5lIElFUihpb2Jhc2UpCShpb2Jhc2UrMSkKKyNkZWZpbmUgSUlSKGlvYmFzZSkJKGlvYmFzZSsyKQorI2RlZmluZSBGQ1IoaW9iYXNlKQkoaW9iYXNlKzIpCisjZGVmaW5lIExDUihpb2Jhc2UpCShpb2Jhc2UrMykKKyNkZWZpbmUgTUNSKGlvYmFzZSkJKGlvYmFzZSs0KQorI2RlZmluZSBMU1IoaW9iYXNlKQkoaW9iYXNlKzUpCisjZGVmaW5lIE1TUihpb2Jhc2UpCShpb2Jhc2UrNikKKyNkZWZpbmUgU0NSKGlvYmFzZSkJKGlvYmFzZSs3KQorI2RlZmluZSBETEwoaW9iYXNlKQkoaW9iYXNlKzApCisjZGVmaW5lIERMTShpb2Jhc2UpCShpb2Jhc2UrMSkKKworI2RlZmluZSBZQU1fRVhURU5UCTgKKworLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyIEJpdCBNYXNrcyAqLworI2RlZmluZSBJSVJfTk9QRU5ECTEKKyNkZWZpbmUgSUlSX01TUgkJMAorI2RlZmluZSBJSVJfVFgJCTIKKyNkZWZpbmUgSUlSX1JYCQk0CisjZGVmaW5lIElJUl9MU1IJCTYKKyNkZWZpbmUgSUlSX1RJTUVPVVQJMTIJCQkvKiBGaWZvIG1vZGUgb25seSAqLworCisjZGVmaW5lIElJUl9NQVNLCTB4MEYKKworLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciBCaXQgTWFza3MgKi8KKyNkZWZpbmUgSUVSX1JYCQkxCQkJLyogZW5hYmxlIHJ4IGludGVycnVwdCAqLworI2RlZmluZSBJRVJfVFgJCTIJCQkvKiBlbmFibGUgdHggaW50ZXJydXB0ICovCisjZGVmaW5lIElFUl9MU1IJCTQJCQkvKiBlbmFibGUgbGluZSBzdGF0dXMgaW50ZXJydXB0cyAqLworI2RlZmluZSBJRVJfTVNSCQk4CQkJLyogZW5hYmxlIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRzICovCisKKy8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgQml0IE1hc2tzICovCisjZGVmaW5lIE1DUl9EVFIJCTB4MDEJCQkvKiBEVFIgb3V0cHV0ICovCisjZGVmaW5lIE1DUl9SVFMJCTB4MDIJCQkvKiBSVFMgb3V0cHV0ICovCisjZGVmaW5lIE1DUl9PVVQxCTB4MDQJCQkvKiBPVVQxIG91dHB1dCAobm90IGFjY2Vzc2libGUgaW4gUlMyMzIpICovCisjZGVmaW5lIE1DUl9PVVQyCTB4MDgJCQkvKiBNYXN0ZXIgSW50ZXJydXB0IGVuYWJsZSAobXVzdCBiZSBzZXQgb24gUENzKSAqLworI2RlZmluZSBNQ1JfTE9PUAkweDEwCQkJLyogTG9vcGJhY2sgZW5hYmxlICovCisKKy8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlciBCaXQgTWFza3MgKi8KKyNkZWZpbmUgTVNSX0RDVFMJMHgwMQkJCS8qIERlbHRhIENUUyBpbnB1dCAqLworI2RlZmluZSBNU1JfRERTUgkweDAyCQkJLyogRGVsdGEgRFNSICovCisjZGVmaW5lIE1TUl9EUklOCTB4MDQJCQkvKiBEZWx0YSBSSSAqLworI2RlZmluZSBNU1JfRERDRAkweDA4CQkJLyogRGVsdGEgRENEICovCisjZGVmaW5lIE1TUl9DVFMJCTB4MTAJCQkvKiBDVFMgaW5wdXQgKi8KKyNkZWZpbmUgTVNSX0RTUgkJMHgyMAkJCS8qIERTUiBpbnB1dCAqLworI2RlZmluZSBNU1JfUklORwkweDQwCQkJLyogUkkgIGlucHV0ICovCisjZGVmaW5lIE1TUl9EQ0QJCTB4ODAJCQkvKiBEQ0QgaW5wdXQgKi8KKworLyogbGluZSBzdGF0dXMgcmVnaXN0ZXIgYml0IG1hc2sgKi8KKyNkZWZpbmUgTFNSX1JYQwkJMHgwMQorI2RlZmluZSBMU1JfT0UJCTB4MDIKKyNkZWZpbmUgTFNSX1BFCQkweDA0CisjZGVmaW5lIExTUl9GRQkJMHgwOAorI2RlZmluZSBMU1JfQlJFQUsJMHgxMAorI2RlZmluZSBMU1JfVEhSRQkweDIwCisjZGVmaW5lIExTUl9UU1JFCTB4NDAKKworLyogTGluZSBDb250cm9sIFJlZ2lzdGVyIEJpdCBNYXNrcyAqLworI2RlZmluZSBMQ1JfRExBQgkweDgwCisjZGVmaW5lIExDUl9CUkVBSwkweDQwCisjZGVmaW5lIExDUl9QWkVSTwkweDI4CisjZGVmaW5lIExDUl9QRVZFTgkweDE4CisjZGVmaW5lIExDUl9QT0RECTB4MDgKKyNkZWZpbmUgTENSX1NUT1AxCTB4MDAKKyNkZWZpbmUgTENSX1NUT1AyCTB4MDQKKyNkZWZpbmUgTENSX0JJVDUJMHgwMAorI2RlZmluZSBMQ1JfQklUNgkweDAyCisjZGVmaW5lIExDUl9CSVQ3CTB4MDEKKyNkZWZpbmUgTENSX0JJVDgJMHgwMworCisvKiBZQU0gTW9kZW0gPC0+IFVBUlQgUG9ydCBtYXBwaW5nICovCisKKyNkZWZpbmUgVFhfUkRZCQlNU1JfRENUUwkJLyogdHJhbnNtaXR0ZXIgcmVhZHkgdG8gc2VuZCAqLworI2RlZmluZSBSWF9EQ0QJCU1TUl9EQ0QJCQkvKiBjYXJyaWVyIGRldGVjdCAqLworI2RlZmluZSBSWF9GTEFHCQlNU1JfUklORwkJLyogaGRsYyBmbGFnIHJlY2VpdmVkICovCisjZGVmaW5lIEZQR0FfRE9ORQlNU1JfRFNSCQkJLyogRlBHQSBpcyBjb25maWd1cmVkICovCisjZGVmaW5lIFBUVF9PTgkJKE1DUl9SVFN8TUNSX09VVDIpCS8qIGFjdGl2YXRlIFBUVCAqLworI2RlZmluZSBQVFRfT0ZGCQkoTUNSX0RUUnxNQ1JfT1VUMikJLyogcmVsZWFzZSBQVFQgKi8KKworI2RlZmluZSBFTkFCTEVfUlhJTlQJSUVSX1JYCQkJLyogZW5hYmxlIHVhcnQgcnggaW50ZXJydXB0IGR1cmluZyByeCAqLworI2RlZmluZSBFTkFCTEVfVFhJTlQJSUVSX01TUgkJCS8qIGVuYWJsZSB1YXJ0IG1zIGludGVycnVwdCBkdXJpbmcgdHggKi8KKyNkZWZpbmUgRU5BQkxFX1JUWElOVAkoSUVSX1JYfElFUl9NU1IpCS8qIGZ1bGwgZHVwbGV4IG9wZXJhdGlvbnMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDUkMgVGFibGVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGNoa3RhYmxbMjU2XSA9Cit7MHgwMCwgMHg4OSwgMHgxMiwgMHg5YiwgMHgyNCwgMHhhZCwgMHgzNiwgMHhiZiwgMHg0OCwgMHhjMSwgMHg1YSwgMHhkMywgMHg2YywgMHhlNSwgMHg3ZSwKKyAweGY3LCAweDgxLCAweDA4LCAweDkzLCAweDFhLCAweGE1LCAweDJjLCAweGI3LCAweDNlLCAweGM5LCAweDQwLCAweGRiLCAweDUyLCAweGVkLCAweDY0LAorIDB4ZmYsIDB4NzYsIDB4MDIsIDB4OGIsIDB4MTAsIDB4OTksIDB4MjYsIDB4YWYsIDB4MzQsIDB4YmQsIDB4NGEsIDB4YzMsIDB4NTgsIDB4ZDEsIDB4NmUsCisgMHhlNywgMHg3YywgMHhmNSwgMHg4MywgMHgwYSwgMHg5MSwgMHgxOCwgMHhhNywgMHgyZSwgMHhiNSwgMHgzYywgMHhjYiwgMHg0MiwgMHhkOSwgMHg1MCwKKyAweGVmLCAweDY2LCAweGZkLCAweDc0LCAweDA0LCAweDhkLCAweDE2LCAweDlmLCAweDIwLCAweGE5LCAweDMyLCAweGJiLCAweDRjLCAweGM1LCAweDVlLAorIDB4ZDcsIDB4NjgsIDB4ZTEsIDB4N2EsIDB4ZjMsIDB4ODUsIDB4MGMsIDB4OTcsIDB4MWUsIDB4YTEsIDB4MjgsIDB4YjMsIDB4M2EsIDB4Y2QsIDB4NDQsCisgMHhkZiwgMHg1NiwgMHhlOSwgMHg2MCwgMHhmYiwgMHg3MiwgMHgwNiwgMHg4ZiwgMHgxNCwgMHg5ZCwgMHgyMiwgMHhhYiwgMHgzMCwgMHhiOSwgMHg0ZSwKKyAweGM3LCAweDVjLCAweGQ1LCAweDZhLCAweGUzLCAweDc4LCAweGYxLCAweDg3LCAweDBlLCAweDk1LCAweDFjLCAweGEzLCAweDJhLCAweGIxLCAweDM4LAorIDB4Y2YsIDB4NDYsIDB4ZGQsIDB4NTQsIDB4ZWIsIDB4NjIsIDB4ZjksIDB4NzAsIDB4MDgsIDB4ODEsIDB4MWEsIDB4OTMsIDB4MmMsIDB4YTUsIDB4M2UsCisgMHhiNywgMHg0MCwgMHhjOSwgMHg1MiwgMHhkYiwgMHg2NCwgMHhlZCwgMHg3NiwgMHhmZiwgMHg4OSwgMHgwMCwgMHg5YiwgMHgxMiwgMHhhZCwgMHgyNCwKKyAweGJmLCAweDM2LCAweGMxLCAweDQ4LCAweGQzLCAweDVhLCAweGU1LCAweDZjLCAweGY3LCAweDdlLCAweDBhLCAweDgzLCAweDE4LCAweDkxLCAweDJlLAorIDB4YTcsIDB4M2MsIDB4YjUsIDB4NDIsIDB4Y2IsIDB4NTAsIDB4ZDksIDB4NjYsIDB4ZWYsIDB4NzQsIDB4ZmQsIDB4OGIsIDB4MDIsIDB4OTksIDB4MTAsCisgMHhhZiwgMHgyNiwgMHhiZCwgMHgzNCwgMHhjMywgMHg0YSwgMHhkMSwgMHg1OCwgMHhlNywgMHg2ZSwgMHhmNSwgMHg3YywgMHgwYywgMHg4NSwgMHgxZSwKKyAweDk3LCAweDI4LCAweGExLCAweDNhLCAweGIzLCAweDQ0LCAweGNkLCAweDU2LCAweGRmLCAweDYwLCAweGU5LCAweDcyLCAweGZiLCAweDhkLCAweDA0LAorIDB4OWYsIDB4MTYsIDB4YTksIDB4MjAsIDB4YmIsIDB4MzIsIDB4YzUsIDB4NGMsIDB4ZDcsIDB4NWUsIDB4ZTEsIDB4NjgsIDB4ZjMsIDB4N2EsIDB4MGUsCisgMHg4NywgMHgxYywgMHg5NSwgMHgyYSwgMHhhMywgMHgzOCwgMHhiMSwgMHg0NiwgMHhjZiwgMHg1NCwgMHhkZCwgMHg2MiwgMHhlYiwgMHg3MCwgMHhmOSwKKyAweDhmLCAweDA2LCAweDlkLCAweDE0LCAweGFiLCAweDIyLCAweGI5LCAweDMwLCAweGM3LCAweDRlLCAweGQ1LCAweDVjLCAweGUzLCAweDZhLCAweGYxLAorIDB4Nzh9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2hrdGFiaFsyNTZdID0KK3sweDAwLCAweDExLCAweDIzLCAweDMyLCAweDQ2LCAweDU3LCAweDY1LCAweDc0LCAweDhjLCAweDlkLCAweGFmLCAweGJlLCAweGNhLCAweGRiLCAweGU5LAorIDB4ZjgsIDB4MTAsIDB4MDEsIDB4MzMsIDB4MjIsIDB4NTYsIDB4NDcsIDB4NzUsIDB4NjQsIDB4OWMsIDB4OGQsIDB4YmYsIDB4YWUsIDB4ZGEsIDB4Y2IsCisgMHhmOSwgMHhlOCwgMHgyMSwgMHgzMCwgMHgwMiwgMHgxMywgMHg2NywgMHg3NiwgMHg0NCwgMHg1NSwgMHhhZCwgMHhiYywgMHg4ZSwgMHg5ZiwgMHhlYiwKKyAweGZhLCAweGM4LCAweGQ5LCAweDMxLCAweDIwLCAweDEyLCAweDAzLCAweDc3LCAweDY2LCAweDU0LCAweDQ1LCAweGJkLCAweGFjLCAweDllLCAweDhmLAorIDB4ZmIsIDB4ZWEsIDB4ZDgsIDB4YzksIDB4NDIsIDB4NTMsIDB4NjEsIDB4NzAsIDB4MDQsIDB4MTUsIDB4MjcsIDB4MzYsIDB4Y2UsIDB4ZGYsIDB4ZWQsCisgMHhmYywgMHg4OCwgMHg5OSwgMHhhYiwgMHhiYSwgMHg1MiwgMHg0MywgMHg3MSwgMHg2MCwgMHgxNCwgMHgwNSwgMHgzNywgMHgyNiwgMHhkZSwgMHhjZiwKKyAweGZkLCAweGVjLCAweDk4LCAweDg5LCAweGJiLCAweGFhLCAweDYzLCAweDcyLCAweDQwLCAweDUxLCAweDI1LCAweDM0LCAweDA2LCAweDE3LCAweGVmLAorIDB4ZmUsIDB4Y2MsIDB4ZGQsIDB4YTksIDB4YjgsIDB4OGEsIDB4OWIsIDB4NzMsIDB4NjIsIDB4NTAsIDB4NDEsIDB4MzUsIDB4MjQsIDB4MTYsIDB4MDcsCisgMHhmZiwgMHhlZSwgMHhkYywgMHhjZCwgMHhiOSwgMHhhOCwgMHg5YSwgMHg4YiwgMHg4NCwgMHg5NSwgMHhhNywgMHhiNiwgMHhjMiwgMHhkMywgMHhlMSwKKyAweGYwLCAweDA4LCAweDE5LCAweDJiLCAweDNhLCAweDRlLCAweDVmLCAweDZkLCAweDdjLCAweDk0LCAweDg1LCAweGI3LCAweGE2LCAweGQyLCAweGMzLAorIDB4ZjEsIDB4ZTAsIDB4MTgsIDB4MDksIDB4M2IsIDB4MmEsIDB4NWUsIDB4NGYsIDB4N2QsIDB4NmMsIDB4YTUsIDB4YjQsIDB4ODYsIDB4OTcsIDB4ZTMsCisgMHhmMiwgMHhjMCwgMHhkMSwgMHgyOSwgMHgzOCwgMHgwYSwgMHgxYiwgMHg2ZiwgMHg3ZSwgMHg0YywgMHg1ZCwgMHhiNSwgMHhhNCwgMHg5NiwgMHg4NywKKyAweGYzLCAweGUyLCAweGQwLCAweGMxLCAweDM5LCAweDI4LCAweDFhLCAweDBiLCAweDdmLCAweDZlLCAweDVjLCAweDRkLCAweGM2LCAweGQ3LCAweGU1LAorIDB4ZjQsIDB4ODAsIDB4OTEsIDB4YTMsIDB4YjIsIDB4NGEsIDB4NWIsIDB4NjksIDB4NzgsIDB4MGMsIDB4MWQsIDB4MmYsIDB4M2UsIDB4ZDYsIDB4YzcsCisgMHhmNSwgMHhlNCwgMHg5MCwgMHg4MSwgMHhiMywgMHhhMiwgMHg1YSwgMHg0YiwgMHg3OSwgMHg2OCwgMHgxYywgMHgwZCwgMHgzZiwgMHgyZSwgMHhlNywKKyAweGY2LCAweGM0LCAweGQ1LCAweGExLCAweGIwLCAweDgyLCAweDkzLCAweDZiLCAweDdhLCAweDQ4LCAweDU5LCAweDJkLCAweDNjLCAweDBlLCAweDFmLAorIDB4ZjcsIDB4ZTYsIDB4ZDQsIDB4YzUsIDB4YjEsIDB4YTAsIDB4OTIsIDB4ODMsIDB4N2IsIDB4NmEsIDB4NTgsIDB4NDksIDB4M2QsIDB4MmMsIDB4MWUsCisgMHgwZn07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZQR0EgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGRlbGF5KGludCBtcykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgKChtcyAqIEhaKSAvIDEwMDApOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKKwkJY3B1X3JlbGF4KCk7Cit9CisKKy8qCisgKiByZXNldCBGUEdBCisgKi8KKworc3RhdGljIHZvaWQgZnBnYV9yZXNldChpbnQgaW9iYXNlKQoreworCW91dGIoMCwgSUVSKGlvYmFzZSkpOworCW91dGIoTENSX0RMQUIgfCBMQ1JfQklUNSwgTENSKGlvYmFzZSkpOworCW91dGIoMSwgRExMKGlvYmFzZSkpOworCW91dGIoMCwgRExNKGlvYmFzZSkpOworCisJb3V0YihMQ1JfQklUNSwgTENSKGlvYmFzZSkpOworCWluYihMU1IoaW9iYXNlKSk7CisJaW5iKE1TUihpb2Jhc2UpKTsKKwkvKiB0dXJuIG9mZiBGUEdBIHN1cHBseSB2b2x0YWdlICovCisJb3V0YihNQ1JfT1VUMSB8IE1DUl9PVVQyLCBNQ1IoaW9iYXNlKSk7CisJZGVsYXkoMTAwKTsKKwkvKiB0dXJuIG9uIEZQR0Egc3VwcGx5IHZvbHRhZ2UgYWdhaW4gKi8KKwlvdXRiKE1DUl9EVFIgfCBNQ1JfUlRTIHwgTUNSX09VVDEgfCBNQ1JfT1VUMiwgTUNSKGlvYmFzZSkpOworCWRlbGF5KDEwMCk7Cit9CisKKy8qCisgKiBzZW5kIG9uZSBieXRlIHRvIEZQR0EKKyAqLworCitzdGF0aWMgaW50IGZwZ2Ffd3JpdGUoaW50IGlvYmFzZSwgdW5zaWduZWQgY2hhciB3cmQpCit7CisJdW5zaWduZWQgY2hhciBiaXQ7CisJaW50IGs7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaIC8gMTA7CisKKwlmb3IgKGsgPSAwOyBrIDwgODsgaysrKSB7CisJCWJpdCA9ICh3cmQgJiAweDgwKSA/IChNQ1JfUlRTIHwgTUNSX0RUUikgOiBNQ1JfRFRSOworCQlvdXRiKGJpdCB8IE1DUl9PVVQxIHwgTUNSX09VVDIsIE1DUihpb2Jhc2UpKTsKKwkJd3JkIDw8PSAxOworCQlvdXRiKDB4ZmMsIFRIUihpb2Jhc2UpKTsKKwkJd2hpbGUgKChpbmIoTFNSKGlvYmFzZSkpICYgTFNSX1RTUkUpID09IDApCisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICphZGRfbWNzKHVuc2lnbmVkIGNoYXIgKmJpdHMsIGludCBiaXRyYXRlKQoreworCXN0cnVjdCB5YW1fbWNzICpwOworCisJLyogSWYgaXQgYWxyZWFkeSBleGlzdHMsIHJlcGxhY2UgdGhlIGJpdCBkYXRhICovCisJcCA9IHlhbV9kYXRhOworCXdoaWxlIChwKSB7CisJCWlmIChwLT5iaXRyYXRlID09IGJpdHJhdGUpIHsKKwkJCW1lbWNweShwLT5iaXRzLCBiaXRzLCBZQU1fRlBHQV9TSVpFKTsKKwkJCXJldHVybiBwLT5iaXRzOworCQl9CisJCXAgPSBwLT5uZXh0OworCX0KKworCS8qIEFsbG9jYXRlIGEgbmV3IG1jcyAqLworCWlmICgocCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB5YW1fbWNzKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiWUFNOiBubyBtZW1vcnkgdG8gYWxsb2NhdGUgbWNzXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbWNweShwLT5iaXRzLCBiaXRzLCBZQU1fRlBHQV9TSVpFKTsKKwlwLT5iaXRyYXRlID0gYml0cmF0ZTsKKwlwLT5uZXh0ID0geWFtX2RhdGE7CisJeWFtX2RhdGEgPSBwOworCisJcmV0dXJuIHAtPmJpdHM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpnZXRfbWNzKGludCBiaXRyYXRlKQoreworCXN0cnVjdCB5YW1fbWNzICpwOworCisJcCA9IHlhbV9kYXRhOworCXdoaWxlIChwKSB7CisJCWlmIChwLT5iaXRyYXRlID09IGJpdHJhdGUpCisJCQlyZXR1cm4gcC0+Yml0czsKKwkJcCA9IHAtPm5leHQ7CisJfQorCisJLyogTG9hZCBwcmVkZWZpbmVkIG1jcyBkYXRhICovCisJc3dpdGNoIChiaXRyYXRlKSB7CisJY2FzZSAxMjAwOgorCQlyZXR1cm4gYWRkX21jcyhiaXRzXzEyMDAsIGJpdHJhdGUpOworCWRlZmF1bHQ6CisJCXJldHVybiBhZGRfbWNzKGJpdHNfOTYwMCwgYml0cmF0ZSk7CisJfQorfQorCisvKgorICogZG93bmxvYWQgYml0c3RyZWFtIHRvIEZQR0EKKyAqIGRhdGEgaXMgY29udGFpbmVkIGluIGJpdHNbXSBhcnJheSBpbiB5YW0xMjAwLmggcmVzcC4geWFtOTYwMC5oCisgKi8KKworc3RhdGljIGludCBmcGdhX2Rvd25sb2FkKGludCBpb2Jhc2UsIGludCBiaXRyYXRlKQoreworCWludCBpLCByYzsKKwl1bnNpZ25lZCBjaGFyICpwYml0czsKKworCXBiaXRzID0gZ2V0X21jcyhiaXRyYXRlKTsKKwlpZiAocGJpdHMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJZnBnYV9yZXNldChpb2Jhc2UpOworCWZvciAoaSA9IDA7IGkgPCBZQU1fRlBHQV9TSVpFOyBpKyspIHsKKwkJaWYgKGZwZ2Ffd3JpdGUoaW9iYXNlLCBwYml0c1tpXSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAieWFtOiBlcnJvciBpbiB3cml0ZSBjeWNsZVxuIik7CisJCQlyZXR1cm4gLTE7CQkJLyogd3JpdGUuLi4gKi8KKwkJfQorCX0KKworCWZwZ2Ffd3JpdGUoaW9iYXNlLCAweEZGKTsKKwlyYyA9IGluYihNU1IoaW9iYXNlKSk7CQkvKiBjaGVjayBET05FIHNpZ25hbCAqLworCisJLyogTmVlZGVkIGZvciBzb21lIGhhcmR3YXJlcyAqLworCWRlbGF5KDUwKTsKKworCXJldHVybiAocmMgJiBNU1JfRFNSKSA/IDAgOiAtMTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNlcmlhbCBwb3J0IGluaXQgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHlhbV9zZXRfdWFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB5YW1fcG9ydCAqeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBkaXZpc29yID0gMTE1MjAwIC8geXAtPmJhdWRyYXRlOworCisJb3V0YigwLCBJRVIoZGV2LT5iYXNlX2FkZHIpKTsKKwlvdXRiKExDUl9ETEFCIHwgTENSX0JJVDgsIExDUihkZXYtPmJhc2VfYWRkcikpOworCW91dGIoZGl2aXNvciwgRExMKGRldi0+YmFzZV9hZGRyKSk7CisJb3V0YigwLCBETE0oZGV2LT5iYXNlX2FkZHIpKTsKKwlvdXRiKExDUl9CSVQ4LCBMQ1IoZGV2LT5iYXNlX2FkZHIpKTsKKwlvdXRiKFBUVF9PRkYsIE1DUihkZXYtPmJhc2VfYWRkcikpOworCW91dGIoMHgwMCwgRkNSKGRldi0+YmFzZV9hZGRyKSk7CisKKwkvKiBGbHVzaCBwZW5kaW5nIGlycSAqLworCisJaW5iKFJCUihkZXYtPmJhc2VfYWRkcikpOworCWluYihNU1IoZGV2LT5iYXNlX2FkZHIpKTsKKworCS8qIEVuYWJsZSByeCBpcnEgKi8KKworCW91dGIoRU5BQkxFX1JUWElOVCwgSUVSKGRldi0+YmFzZV9hZGRyKSk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0gdWFydCB7CisJY191YXJ0X3Vua25vd24sIGNfdWFydF84MjUwLAorCWNfdWFydF8xNjQ1MCwgY191YXJ0XzE2NTUwLCBjX3VhcnRfMTY1NTBBCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqdWFydF9zdHJbXSA9Cit7InVua25vd24iLCAiODI1MCIsICIxNjQ1MCIsICIxNjU1MCIsICIxNjU1MEEifTsKKworc3RhdGljIGVudW0gdWFydCB5YW1fY2hlY2tfdWFydCh1bnNpZ25lZCBpbnQgaW9iYXNlKQoreworCXVuc2lnbmVkIGNoYXIgYjEsIGIyLCBiMzsKKwllbnVtIHVhcnQgdTsKKwllbnVtIHVhcnQgdWFydF90YWJbXSA9CisJe2NfdWFydF8xNjQ1MCwgY191YXJ0X3Vua25vd24sIGNfdWFydF8xNjU1MCwgY191YXJ0XzE2NTUwQX07CisKKwliMSA9IGluYihNQ1IoaW9iYXNlKSk7CisJb3V0YihiMSB8IDB4MTAsIE1DUihpb2Jhc2UpKTsJLyogbG9vcGJhY2sgbW9kZSAqLworCWIyID0gaW5iKE1TUihpb2Jhc2UpKTsKKwlvdXRiKDB4MWEsIE1DUihpb2Jhc2UpKTsKKwliMyA9IGluYihNU1IoaW9iYXNlKSkgJiAweGYwOworCW91dGIoYjEsIE1DUihpb2Jhc2UpKTsJCS8qIHJlc3RvcmUgb2xkIHZhbHVlcyAqLworCW91dGIoYjIsIE1TUihpb2Jhc2UpKTsKKwlpZiAoYjMgIT0gMHg5MCkKKwkJcmV0dXJuIGNfdWFydF91bmtub3duOworCWluYihSQlIoaW9iYXNlKSk7CisJaW5iKFJCUihpb2Jhc2UpKTsKKwlvdXRiKDB4MDEsIEZDUihpb2Jhc2UpKTsJLyogZW5hYmxlIEZJRk9zICovCisJdSA9IHVhcnRfdGFiWyhpbmIoSUlSKGlvYmFzZSkpID4+IDYpICYgM107CisJaWYgKHUgPT0gY191YXJ0XzE2NDUwKSB7CisJCW91dGIoMHg1YSwgU0NSKGlvYmFzZSkpOworCQliMSA9IGluYihTQ1IoaW9iYXNlKSk7CisJCW91dGIoMHhhNSwgU0NSKGlvYmFzZSkpOworCQliMiA9IGluYihTQ1IoaW9iYXNlKSk7CisJCWlmICgoYjEgIT0gMHg1YSkgfHwgKGIyICE9IDB4YTUpKQorCQkJdSA9IGNfdWFydF84MjUwOworCX0KKwlyZXR1cm4gdTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSeCBTZWN0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgeWFtX3J4X2ZsYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHlhbV9wb3J0ICp5cCkKK3sKKwlpZiAoeXAtPmRjZCAmJiB5cC0+cnhfbGVuID49IDMgJiYgeXAtPnJ4X2xlbiA8IFlBTV9NQVhfRlJBTUUpIHsKKwkJaW50IHBrdF9sZW4gPSB5cC0+cnhfbGVuIC0gMiArIDE7CS8qIC1DUkMgKyBraXNzICovCisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJaWYgKCh5cC0+cnhfY3JjaCAmIHlwLT5yeF9jcmNsKSAhPSAweEZGKSB7CisJCQkvKiBCYWQgY3JjICovCisJCX0gZWxzZSB7CisJCQlpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4pKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0XG4iLCBkZXYtPm5hbWUpOworCQkJCSsreXAtPnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQl9IGVsc2UgeworCQkJCXVuc2lnbmVkIGNoYXIgKmNwOworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCWNwID0gc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCSpjcCsrID0gMDsJCS8qIEtJU1Mga2x1ZGdlICovCisJCQkJbWVtY3B5KGNwLCB5cC0+cnhfYnVmLCBwa3RfbGVuIC0gMSk7CisJCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0FYMjUpOworCQkJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJKyt5cC0+c3RhdHMucnhfcGFja2V0czsKKwkJCX0KKwkJfQorCX0KKwl5cC0+cnhfbGVuID0gMDsKKwl5cC0+cnhfY3JjbCA9IDB4MjE7CisJeXAtPnJ4X2NyY2ggPSAweGYzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeWFtX3J4X2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHlhbV9wb3J0ICp5cCwgdW5zaWduZWQgY2hhciByeGIpCit7CisJaWYgKHlwLT5yeF9sZW4gPCBZQU1fTUFYX0ZSQU1FKSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9IHlwLT5yeF9jcmNsOworCQl5cC0+cnhfY3JjbCA9IChjaGt0YWJsW2NdIF4geXAtPnJ4X2NyY2gpOworCQl5cC0+cnhfY3JjaCA9IChjaGt0YWJoW2NdIF4gcnhiKTsKKwkJeXAtPnJ4X2J1Zlt5cC0+cnhfbGVuKytdID0gcnhiOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRYIFNlY3Rpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBwdHRfb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlvdXRiKFBUVF9PTiwgTUNSKGRldi0+YmFzZV9hZGRyKSk7Cit9CisKK3N0YXRpYyB2b2lkIHB0dF9vZmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlvdXRiKFBUVF9PRkYsIE1DUihkZXYtPmJhc2VfYWRkcikpOworfQorCitzdGF0aWMgaW50IHlhbV9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB5YW1fcG9ydCAqeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc2tiX3F1ZXVlX3RhaWwoJnlwLT5zZW5kX3F1ZXVlLCBza2IpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB5YW1fc3RhcnRfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHlhbV9wb3J0ICp5cCkKK3sKKwlpZiAoKHlwLT50eF9zdGF0ZSA9PSBUWF9UQUlMKSB8fCAoeXAtPnR4ZCA9PSAwKSkKKwkJeXAtPnR4X2NvdW50ID0gMTsKKwllbHNlCisJCXlwLT50eF9jb3VudCA9ICh5cC0+Yml0cmF0ZSAqIHlwLT50eGQpIC8gODAwMDsKKwl5cC0+dHhfc3RhdGUgPSBUWF9IRUFEOworCXB0dF9vbihkZXYpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmFuZG9tX3NlZWQ7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgcmFuZG9tX251bSh2b2lkKQoreworCXJhbmRvbV9zZWVkID0gMjg2MjkgKiByYW5kb21fc2VlZCArIDE1NzsKKwlyZXR1cm4gcmFuZG9tX3NlZWQ7Cit9CisKK3N0YXRpYyB2b2lkIHlhbV9hcmJpdHJhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeWFtX3BvcnQgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICh5cC0+bWFnaWMgIT0gWUFNX01BR0lDIHx8IHlwLT50eF9zdGF0ZSAhPSBUWF9PRkYgfHwKKwkgICAgc2tiX3F1ZXVlX2VtcHR5KCZ5cC0+c2VuZF9xdWV1ZSkpCisJCXJldHVybjsKKwkvKiB0eF9zdGF0ZSBpcyBUWF9PRkYgYW5kIHRoZXJlIGlzIGRhdGEgdG8gc2VuZCAqLworCisJaWYgKHlwLT5kdXBtb2RlKSB7CisJCS8qIEZ1bGwgZHVwbGV4IG1vZGUsIGRvbid0IHdhaXQgKi8KKwkJeWFtX3N0YXJ0X3R4KGRldiwgeXApOworCQlyZXR1cm47CisJfQorCWlmICh5cC0+ZGNkKSB7CisJCS8qIERDRCBvbiwgd2FpdCBzbG90aW1lIC4uLiAqLworCQl5cC0+c2xvdGNudCA9IHlwLT5zbG90IC8gMTA7CisJCXJldHVybjsKKwl9CisJLyogSXMgc2xvdHRpbWUgcGFzc2VkID8gKi8KKwlpZiAoKC0teXAtPnNsb3RjbnQpID4gMCkKKwkJcmV0dXJuOworCisJeXAtPnNsb3RjbnQgPSB5cC0+c2xvdCAvIDEwOworCisJLyogaXMgcmFuZG9tID4gcGVyc2lzdCA/ICovCisJaWYgKChyYW5kb21fbnVtKCkgJSAyNTYpID4geXAtPnBlcnMpCisJCXJldHVybjsKKworCXlhbV9zdGFydF90eChkZXYsIHlwKTsKK30KKworc3RhdGljIHZvaWQgeWFtX2RvdGltZXIodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB5YW1fZGV2c1tpXTsKKwkJaWYgKGRldiAmJiBuZXRpZl9ydW5uaW5nKGRldikpCisJCQl5YW1fYXJiaXRyYXRlKGRldik7CisJfQorCXlhbV90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaIC8gMTAwOworCWFkZF90aW1lcigmeWFtX3RpbWVyKTsKK30KKworc3RhdGljIHZvaWQgeWFtX3R4X2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHlhbV9wb3J0ICp5cCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgYiwgdGVtcDsKKworCXN3aXRjaCAoeXAtPnR4X3N0YXRlKSB7CisJY2FzZSBUWF9PRkY6CisJCWJyZWFrOworCWNhc2UgVFhfSEVBRDoKKwkJaWYgKC0teXAtPnR4X2NvdW50IDw9IDApIHsKKwkJCWlmICghKHNrYiA9IHNrYl9kZXF1ZXVlKCZ5cC0+c2VuZF9xdWV1ZSkpKSB7CisJCQkJcHR0X29mZihkZXYpOworCQkJCXlwLT50eF9zdGF0ZSA9IFRYX09GRjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXlwLT50eF9zdGF0ZSA9IFRYX0RBVEE7CisJCQlpZiAoc2tiLT5kYXRhWzBdICE9IDApIHsKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fa2lzc19wYXJhbXMocywgc2tiLT5kYXRhLCBza2ItPmxlbik7ICovCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXlwLT50eF9sZW4gPSBza2ItPmxlbiAtIDE7CS8qIHN0cmlwIEtJU1MgYnl0ZSAqLworCQkJaWYgKHlwLT50eF9sZW4gPj0gWUFNX01BWF9GUkFNRSB8fCB5cC0+dHhfbGVuIDwgMikgeworICAgICAgICAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWVtY3B5KHlwLT50eF9idWYsIHNrYi0+ZGF0YSArIDEsIHlwLT50eF9sZW4pOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCXlwLT50eF9jb3VudCA9IDA7CisJCQl5cC0+dHhfY3JjbCA9IDB4MjE7CisJCQl5cC0+dHhfY3JjaCA9IDB4ZjM7CisJCQl5cC0+dHhfc3RhdGUgPSBUWF9EQVRBOworCQl9CisJCWJyZWFrOworCWNhc2UgVFhfREFUQToKKwkJYiA9IHlwLT50eF9idWZbeXAtPnR4X2NvdW50KytdOworCQlvdXRiKGIsIFRIUihkZXYtPmJhc2VfYWRkcikpOworCQl0ZW1wID0geXAtPnR4X2NyY2w7CisJCXlwLT50eF9jcmNsID0gY2hrdGFibFt0ZW1wXSBeIHlwLT50eF9jcmNoOworCQl5cC0+dHhfY3JjaCA9IGNoa3RhYmhbdGVtcF0gXiBiOworCQlpZiAoeXAtPnR4X2NvdW50ID49IHlwLT50eF9sZW4pIHsKKwkJCXlwLT50eF9zdGF0ZSA9IFRYX0NSQzE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUWF9DUkMxOgorCQl5cC0+dHhfY3JjaCA9IGNoa3RhYmxbeXAtPnR4X2NyY2xdIF4geXAtPnR4X2NyY2g7CisJCXlwLT50eF9jcmNsID0gY2hrdGFiaFt5cC0+dHhfY3JjbF0gXiBjaGt0YWJsW3lwLT50eF9jcmNoXSBeIDB4ZmY7CisJCW91dGIoeXAtPnR4X2NyY2wsIFRIUihkZXYtPmJhc2VfYWRkcikpOworCQl5cC0+dHhfc3RhdGUgPSBUWF9DUkMyOworCQlicmVhazsKKwljYXNlIFRYX0NSQzI6CisJCW91dGIoY2hrdGFiaFt5cC0+dHhfY3JjaF0gXiAweEZGLCBUSFIoZGV2LT5iYXNlX2FkZHIpKTsKKwkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmeXAtPnNlbmRfcXVldWUpKSB7CisJCQl5cC0+dHhfY291bnQgPSAoeXAtPmJpdHJhdGUgKiB5cC0+dHh0YWlsKSAvIDgwMDA7CisJCQlpZiAoeXAtPmR1cG1vZGUgPT0gMikKKwkJCQl5cC0+dHhfY291bnQgKz0gKHlwLT5iaXRyYXRlICogeXAtPmhvbGRkKSAvIDg7CisJCQlpZiAoeXAtPnR4X2NvdW50ID09IDApCisJCQkJeXAtPnR4X2NvdW50ID0gMTsKKwkJCXlwLT50eF9zdGF0ZSA9IFRYX1RBSUw7CisJCX0gZWxzZSB7CisJCQl5cC0+dHhfY291bnQgPSAxOworCQkJeXAtPnR4X3N0YXRlID0gVFhfSEVBRDsKKwkJfQorCQkrK3lwLT5zdGF0cy50eF9wYWNrZXRzOworCQlicmVhazsKKwljYXNlIFRYX1RBSUw6CisJCWlmICgtLXlwLT50eF9jb3VudCA8PSAwKSB7CisJCQl5cC0+dHhfc3RhdGUgPSBUWF9PRkY7CisJCQlwdHRfb2ZmKGRldik7CisJCX0KKwkJYnJlYWs7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSVNSIHJvdXRpbmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlycXJldHVybl90IHlhbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCB5YW1fcG9ydCAqeXA7CisJdW5zaWduZWQgY2hhciBpaXI7CisJaW50IGNvdW50ZXIgPSAxMDA7CisJaW50IGk7CisJaW50IGhhbmRsZWQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKKwkJZGV2ID0geWFtX2RldnNbaV07CisJCXlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCWNvbnRpbnVlOworCisJCXdoaWxlICgoaWlyID0gSUlSX01BU0sgJiBpbmIoSUlSKGRldi0+YmFzZV9hZGRyKSkpICE9IElJUl9OT1BFTkQpIHsKKwkJCXVuc2lnbmVkIGNoYXIgbXNyID0gaW5iKE1TUihkZXYtPmJhc2VfYWRkcikpOworCQkJdW5zaWduZWQgY2hhciBsc3IgPSBpbmIoTFNSKGRldi0+YmFzZV9hZGRyKSk7CisJCQl1bnNpZ25lZCBjaGFyIHJ4YjsKKworCQkJaGFuZGxlZCA9IDE7CisKKwkJCWlmIChsc3IgJiBMU1JfT0UpCisJCQkJKyt5cC0+c3RhdHMucnhfZmlmb19lcnJvcnM7CisKKwkJCXlwLT5kY2QgPSAobXNyICYgUlhfRENEKSA/IDEgOiAwOworCisJCQlpZiAoLS1jb3VudGVyIDw9IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0b28gbWFueSBpcnEgaWlyPSVkXG4iLAorCQkJCQkJZGV2LT5uYW1lLCBpaXIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKG1zciAmIFRYX1JEWSkgeworCQkJCSsreXAtPm5iX21kaW50OworCQkJCXlhbV90eF9ieXRlKGRldiwgeXApOworCQkJfQorCQkJaWYgKGxzciAmIExTUl9SWEMpIHsKKwkJCQkrK3lwLT5uYl9yeGludDsKKwkJCQlyeGIgPSBpbmIoUkJSKGRldi0+YmFzZV9hZGRyKSk7CisJCQkJaWYgKG1zciAmIFJYX0ZMQUcpCisJCQkJCXlhbV9yeF9mbGFnKGRldiwgeXApOworCQkJCWVsc2UKKwkJCQkJeWFtX3J4X2J5dGUoZGV2LCB5cCwgcnhiKTsKKwkJCX0KKwkJfQorCX0KK291dDoKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyB2b2lkICp5YW1fc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlyZXR1cm4gKCpwb3MgPCBOUl9QT1JUUykgPyB5YW1fZGV2c1sqcG9zXSA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICp5YW1fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCSsrKnBvczsKKwlyZXR1cm4gKCpwb3MgPCBOUl9QT1JUUykgPyB5YW1fZGV2c1sqcG9zXSA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHlhbV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKK30KKworc3RhdGljIGludCB5YW1fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHY7CisJY29uc3Qgc3RydWN0IHlhbV9wb3J0ICp5cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzZXFfcHJpbnRmKHNlcSwgIkRldmljZSAlc1xuIiwgZGV2LT5uYW1lKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgVXAgICAgICAgJWRcbiIsIG5ldGlmX3J1bm5pbmcoZGV2KSk7CisJc2VxX3ByaW50ZihzZXEsICIgIFNwZWVkICAgICV1XG4iLCB5cC0+Yml0cmF0ZSk7CisJc2VxX3ByaW50ZihzZXEsICIgIElvQmFzZSAgIDB4JXhcbiIsIHlwLT5pb2Jhc2UpOworCXNlcV9wcmludGYoc2VxLCAiICBCYXVkUmF0ZSAldVxuIiwgeXAtPmJhdWRyYXRlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgSVJRICAgICAgJXVcbiIsIHlwLT5pcnEpOworCXNlcV9wcmludGYoc2VxLCAiICBUeFN0YXRlICAldVxuIiwgeXAtPnR4X3N0YXRlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgRHVwbGV4ICAgJXVcbiIsIHlwLT5kdXBtb2RlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgSG9sZERseSAgJXVcbiIsIHlwLT5ob2xkZCk7CisJc2VxX3ByaW50ZihzZXEsICIgIFR4RGVsYXkgICV1XG4iLCB5cC0+dHhkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgVHhUYWlsICAgJXVcbiIsIHlwLT50eHRhaWwpOworCXNlcV9wcmludGYoc2VxLCAiICBTbG90VGltZSAldVxuIiwgeXAtPnNsb3QpOworCXNlcV9wcmludGYoc2VxLCAiICBQZXJzaXN0ICAldVxuIiwgeXAtPnBlcnMpOworCXNlcV9wcmludGYoc2VxLCAiICBUeEZyYW1lcyAlbHVcbiIsIHlwLT5zdGF0cy50eF9wYWNrZXRzKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgUnhGcmFtZXMgJWx1XG4iLCB5cC0+c3RhdHMucnhfcGFja2V0cyk7CisJc2VxX3ByaW50ZihzZXEsICIgIFR4SW50ICAgICV1XG4iLCB5cC0+bmJfbWRpbnQpOworCXNlcV9wcmludGYoc2VxLCAiICBSeEludCAgICAldVxuIiwgeXAtPm5iX3J4aW50KTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgUnhPdmVyICAgJWx1XG4iLCB5cC0+c3RhdHMucnhfZmlmb19lcnJvcnMpOworCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB5YW1fc2Vxb3BzID0geworCS5zdGFydCA9IHlhbV9zZXFfc3RhcnQsCisJLm5leHQgPSB5YW1fc2VxX25leHQsCisJLnN0b3AgPSB5YW1fc2VxX3N0b3AsCisJLnNob3cgPSB5YW1fc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IHlhbV9pbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZ5YW1fc2Vxb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeWFtX2luZm9fZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHlhbV9pbmZvX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp5YW1fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHlhbV9wb3J0ICp5cDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCXlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAoeXAtPm1hZ2ljICE9IFlBTV9NQUdJQykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiAKKwkgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4gIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZQorCSAqIGNhcmQgb3BlbiBvciBjbG9zZWQuIAorCSAqLworCXJldHVybiAmeXAtPnN0YXRzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCB5YW1fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB5YW1fcG9ydCAqeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWVudW0gdWFydCB1OworCWludCBpOworCWludCByZXQ9MDsKKworCXByaW50ayhLRVJOX0lORk8gIlRyeWluZyAlcyBhdCBpb2Jhc2UgMHglbHggaXJxICV1XG4iLCBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisKKwlpZiAoIWRldiB8fCAheXAtPmJpdHJhdGUpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFkZXYtPmJhc2VfYWRkciB8fCBkZXYtPmJhc2VfYWRkciA+IDB4MTAwMCAtIFlBTV9FWFRFTlQgfHwKKwkJZGV2LT5pcnEgPCAyIHx8IGRldi0+aXJxID4gMTUpIHsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgWUFNX0VYVEVOVCwgZGV2LT5uYW1lKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCAweCVseCBidXN5XG4iLCBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCWlmICgodSA9IHlhbV9jaGVja191YXJ0KGRldi0+YmFzZV9hZGRyKSkgPT0gY191YXJ0X3Vua25vd24pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGZpbmQgdWFydCB0eXBlXG4iLCBkZXYtPm5hbWUpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF9yZWxlYXNlX2Jhc2U7CisJfQorCWlmIChmcGdhX2Rvd25sb2FkKGRldi0+YmFzZV9hZGRyLCB5cC0+Yml0cmF0ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGluaXQgRlBHQVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXRfcmVsZWFzZV9iYXNlOworCX0KKwlvdXRiKDAsIElFUihkZXYtPmJhc2VfYWRkcikpOworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgeWFtX2ludGVycnVwdCwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpcnEgJWQgYnVzeVxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXRfcmVsZWFzZV9iYXNlOworCX0KKworCXlhbV9zZXRfdWFydChkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkKKwl5cC0+c2xvdGNudCA9IHlwLT5zbG90IC8gMTA7CisKKwkvKiBSZXNldCBvdmVycnVucyBmb3IgYWxsIHBvcnRzIC0gRlBHQSBwcm9ncmFtbWluZyBtYWtlcyBvdmVycnVucyAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB5YW1fZGV2c1tpXTsKKwkJc3RydWN0IHlhbV9wb3J0ICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJCWluYihMU1IoZGV2LT5iYXNlX2FkZHIpKTsKKwkJeXAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gMDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlcyBhdCBpb2Jhc2UgMHglbHggaXJxICV1IHVhcnQgJXNcbiIsIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLAorCQkgICB1YXJ0X3N0clt1XSk7CisJcmV0dXJuIDA7CisKK291dF9yZWxlYXNlX2Jhc2U6CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFlBTV9FWFRFTlQpOworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHlhbV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHlhbV9wb3J0ICp5cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIGRpc2FibGUgaW50ZXJydXB0cworCSAqLworCW91dGIoMCwgSUVSKGRldi0+YmFzZV9hZGRyKSk7CisJb3V0YigxLCBNQ1IoZGV2LT5iYXNlX2FkZHIpKTsKKwkvKiBSZW1vdmUgSVJRIGhhbmRsZXIgaWYgbGFzdCAqLworCWZyZWVfaXJxKGRldi0+aXJxLGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFlBTV9FWFRFTlQpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZ5cC0+c2VuZF9xdWV1ZSkpKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogY2xvc2UgeWFtIGF0IGlvYmFzZSAweCVseCBpcnEgJXVcbiIsCisJCSAgIHlhbV9kcnZuYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCB5YW1faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IHlhbV9wb3J0ICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHlhbWRydl9pb2N0bF9jZmcgeWk7CisJc3RydWN0IHlhbWRydl9pb2N0bF9tY3MgKnltOworCWludCBpb2N0bF9jbWQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlvY3RsX2NtZCwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKGludCkpKQorCQkgcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoeXAtPm1hZ2ljICE9IFlBTV9NQUdJQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoY21kICE9IFNJT0NERVZQUklWQVRFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoaW9jdGxfY21kKSB7CisKKwljYXNlIFNJT0NZQU1SRVNFUlZFRDoKKwkJcmV0dXJuIC1FSU5WQUw7CQkJLyogdW51c2VkICovCisKKwljYXNlIFNJT0NZQU1TTUNTOgorCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQkJcmV0dXJuIC1FSU5WQUw7CQkvKiBDYW5ub3QgY2hhbmdlIHRoaXMgcGFyYW1ldGVyIHdoZW4gdXAgKi8KKwkJaWYgKCh5bSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB5YW1kcnZfaW9jdGxfbWNzKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCXltLT5iaXRyYXRlID0gOTYwMDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHltLCBpZnItPmlmcl9kYXRhLCBzaXplb2Yoc3RydWN0IHlhbWRydl9pb2N0bF9tY3MpKSkgeworCQkJa2ZyZWUoeW0pOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKHltLT5iaXRyYXRlID4gWUFNX01BWEJJVFJBVEUpIHsKKwkJCWtmcmVlKHltKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWFkZF9tY3MoeW0tPmJpdHMsIHltLT5iaXRyYXRlKTsKKwkJa2ZyZWUoeW0pOworCQlicmVhazsKKworCWNhc2UgU0lPQ1lBTVNDRkc6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmeWksIGlmci0+aWZyX2RhdGEsIHNpemVvZihzdHJ1Y3QgeWFtZHJ2X2lvY3RsX2NmZykpKQorCQkJIHJldHVybiAtRUZBVUxUOworCisJCWlmICgoeWkuY2ZnLm1hc2sgJiBZQU1fSU9CQVNFKSAmJiBuZXRpZl9ydW5uaW5nKGRldikpCisJCQlyZXR1cm4gLUVJTlZBTDsJCS8qIENhbm5vdCBjaGFuZ2UgdGhpcyBwYXJhbWV0ZXIgd2hlbiB1cCAqLworCQlpZiAoKHlpLmNmZy5tYXNrICYgWUFNX0lSUSkgJiYgbmV0aWZfcnVubmluZyhkZXYpKQorCQkJcmV0dXJuIC1FSU5WQUw7CQkvKiBDYW5ub3QgY2hhbmdlIHRoaXMgcGFyYW1ldGVyIHdoZW4gdXAgKi8KKwkJaWYgKCh5aS5jZmcubWFzayAmIFlBTV9CSVRSQVRFKSAmJiBuZXRpZl9ydW5uaW5nKGRldikpCisJCQlyZXR1cm4gLUVJTlZBTDsJCS8qIENhbm5vdCBjaGFuZ2UgdGhpcyBwYXJhbWV0ZXIgd2hlbiB1cCAqLworCQlpZiAoKHlpLmNmZy5tYXNrICYgWUFNX0JBVURSQVRFKSAmJiBuZXRpZl9ydW5uaW5nKGRldikpCisJCQlyZXR1cm4gLUVJTlZBTDsJCS8qIENhbm5vdCBjaGFuZ2UgdGhpcyBwYXJhbWV0ZXIgd2hlbiB1cCAqLworCisJCWlmICh5aS5jZmcubWFzayAmIFlBTV9JT0JBU0UpIHsKKwkJCXlwLT5pb2Jhc2UgPSB5aS5jZmcuaW9iYXNlOworCQkJZGV2LT5iYXNlX2FkZHIgPSB5aS5jZmcuaW9iYXNlOworCQl9CisJCWlmICh5aS5jZmcubWFzayAmIFlBTV9JUlEpIHsKKwkJCWlmICh5aS5jZmcuaXJxID4gMTUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl5cC0+aXJxID0geWkuY2ZnLmlycTsKKwkJCWRldi0+aXJxID0geWkuY2ZnLmlycTsKKwkJfQorCQlpZiAoeWkuY2ZnLm1hc2sgJiBZQU1fQklUUkFURSkgeworCQkJaWYgKHlpLmNmZy5iaXRyYXRlID4gWUFNX01BWEJJVFJBVEUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl5cC0+Yml0cmF0ZSA9IHlpLmNmZy5iaXRyYXRlOworCQl9CisJCWlmICh5aS5jZmcubWFzayAmIFlBTV9CQVVEUkFURSkgeworCQkJaWYgKHlpLmNmZy5iYXVkcmF0ZSA+IFlBTV9NQVhCQVVEUkFURSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXlwLT5iYXVkcmF0ZSA9IHlpLmNmZy5iYXVkcmF0ZTsKKwkJfQorCQlpZiAoeWkuY2ZnLm1hc2sgJiBZQU1fTU9ERSkgeworCQkJaWYgKHlpLmNmZy5tb2RlID4gWUFNX01BWE1PREUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl5cC0+ZHVwbW9kZSA9IHlpLmNmZy5tb2RlOworCQl9CisJCWlmICh5aS5jZmcubWFzayAmIFlBTV9IT0xERExZKSB7CisJCQlpZiAoeWkuY2ZnLmhvbGRkbHkgPiBZQU1fTUFYSE9MRERMWSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXlwLT5ob2xkZCA9IHlpLmNmZy5ob2xkZGx5OworCQl9CisJCWlmICh5aS5jZmcubWFzayAmIFlBTV9UWERFTEFZKSB7CisJCQlpZiAoeWkuY2ZnLnR4ZGVsYXkgPiBZQU1fTUFYVFhERUxBWSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXlwLT50eGQgPSB5aS5jZmcudHhkZWxheTsKKwkJfQorCQlpZiAoeWkuY2ZnLm1hc2sgJiBZQU1fVFhUQUlMKSB7CisJCQlpZiAoeWkuY2ZnLnR4dGFpbCA+IFlBTV9NQVhUWFRBSUwpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl5cC0+dHh0YWlsID0geWkuY2ZnLnR4dGFpbDsKKwkJfQorCQlpZiAoeWkuY2ZnLm1hc2sgJiBZQU1fUEVSU0lTVCkgeworCQkJaWYgKHlpLmNmZy5wZXJzaXN0ID4gWUFNX01BWFBFUlNJU1QpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl5cC0+cGVycyA9IHlpLmNmZy5wZXJzaXN0OworCQl9CisJCWlmICh5aS5jZmcubWFzayAmIFlBTV9TTE9UVElNRSkgeworCQkJaWYgKHlpLmNmZy5zbG90dGltZSA+IFlBTV9NQVhTTE9UVElNRSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXlwLT5zbG90ID0geWkuY2ZnLnNsb3R0aW1lOworCQkJeXAtPnNsb3RjbnQgPSB5cC0+c2xvdCAvIDEwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTSU9DWUFNR0NGRzoKKwkJeWkuY2ZnLm1hc2sgPSAweGZmZmZmZmZmOworCQl5aS5jZmcuaW9iYXNlID0geXAtPmlvYmFzZTsKKwkJeWkuY2ZnLmlycSA9IHlwLT5pcnE7CisJCXlpLmNmZy5iaXRyYXRlID0geXAtPmJpdHJhdGU7CisJCXlpLmNmZy5iYXVkcmF0ZSA9IHlwLT5iYXVkcmF0ZTsKKwkJeWkuY2ZnLm1vZGUgPSB5cC0+ZHVwbW9kZTsKKwkJeWkuY2ZnLnR4ZGVsYXkgPSB5cC0+dHhkOworCQl5aS5jZmcuaG9sZGRseSA9IHlwLT5ob2xkZDsKKwkJeWkuY2ZnLnR4dGFpbCA9IHlwLT50eHRhaWw7CisJCXlpLmNmZy5wZXJzaXN0ID0geXAtPnBlcnM7CisJCXlpLmNmZy5zbG90dGltZSA9IHlwLT5zbG90OworCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsICZ5aSwgc2l6ZW9mKHN0cnVjdCB5YW1kcnZfaW9jdGxfY2ZnKSkpCisJCQkgcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgeWFtX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzb2NrYWRkciAqc2EgPSAoc3RydWN0IHNvY2thZGRyICopIGFkZHI7CisKKwkvKiBhZGRyIGlzIGFuIEFYLjI1IHNoaWZ0ZWQgQVNDSUkgbWFjIGFkZHJlc3MgKi8KKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2EtPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgeWFtX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHlhbV9wb3J0ICp5cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl5cC0+bWFnaWMgPSBZQU1fTUFHSUM7CisJeXAtPmJpdHJhdGUgPSBERUZBVUxUX0JJVFJBVEU7CisJeXAtPmJhdWRyYXRlID0gREVGQVVMVF9CSVRSQVRFICogMjsKKwl5cC0+aW9iYXNlID0gMDsKKwl5cC0+aXJxID0gMDsKKwl5cC0+ZHVwbW9kZSA9IDA7CisJeXAtPmhvbGRkID0gREVGQVVMVF9IT0xERDsKKwl5cC0+dHhkID0gREVGQVVMVF9UWEQ7CisJeXAtPnR4dGFpbCA9IERFRkFVTFRfVFhUQUlMOworCXlwLT5zbG90ID0gREVGQVVMVF9TTE9UOworCXlwLT5wZXJzID0gREVGQVVMVF9QRVJTOworCXlwLT5kZXYgPSBkZXY7CisKKwlkZXYtPmJhc2VfYWRkciA9IHlwLT5pb2Jhc2U7CisJZGV2LT5pcnEgPSB5cC0+aXJxOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWRldi0+b3BlbiA9IHlhbV9vcGVuOworCWRldi0+c3RvcCA9IHlhbV9jbG9zZTsKKwlkZXYtPmRvX2lvY3RsID0geWFtX2lvY3RsOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0geWFtX3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzID0geWFtX2dldF9zdGF0czsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnlwLT5zZW5kX3F1ZXVlKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0FYMjUpIHx8IGRlZmluZWQoQ09ORklHX0FYMjVfTU9EVUxFKQorCWRldi0+aGFyZF9oZWFkZXIgPSBheDI1X2VuY2Fwc3VsYXRlOworCWRldi0+cmVidWlsZF9oZWFkZXIgPSBheDI1X3JlYnVpbGRfaGVhZGVyOworI2Vsc2UJCQkJCQkJLyogQ09ORklHX0FYMjUgfHwgQ09ORklHX0FYMjVfTU9EVUxFICovCisJZGV2LT5oYXJkX2hlYWRlciA9IE5VTEw7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciA9IE5VTEw7CisjZW5kaWYJCQkJCQkJLyogQ09ORklHX0FYMjUgfHwgQ09ORklHX0FYMjVfTU9EVUxFICovCisKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IHlhbV9zZXRfbWFjX2FkZHJlc3M7CisKKwlkZXYtPnR5cGUgPSBBUlBIUkRfQVgyNTsJLyogQUZfQVgyNSBkZXZpY2UgKi8KKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IDczOwkvKiBXZSBkbyBkaWdpcGVhdGVycyBub3cgKi8KKwlkZXYtPm10dSA9IDI1NjsJCQkJLyogQVgyNSBpcyB0aGUgZGVmYXVsdCAqLworCWRldi0+YWRkcl9sZW4gPSA3OwkJCS8qIHNpemVvZiBhbiBheC4yNSBhZGRyZXNzICovCisJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCBheDI1X2JjYXN0LCA3KTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYXgyNV90ZXN0LCA3KTsKKworfQorCitzdGF0aWMgaW50IF9faW5pdCB5YW1faW5pdF9kcml2ZXIodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpLCBlcnI7CisJY2hhciBuYW1lW0lGTkFNU0laXTsKKworCXByaW50ayh5YW1fZHJ2aW5mbyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgeworCQlzcHJpbnRmKG5hbWUsICJ5YW0lZCIsIGkpOworCQkKKwkJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgeWFtX3BvcnQpLCBuYW1lLAorCQkJCSAgIHlhbV9zZXR1cCk7CisJCWlmICghZGV2KSB7CisJCQlwcmludGsoS0VSTl9FUlIgInlhbTogY2Fubm90IGFsbG9jYXRlIG5ldCBkZXZpY2UgJXNcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisJCQorCQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAieWFtOiBjYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSAlc1xuIiwgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJeWFtX2RldnNbaV0gPSBkZXY7CisKKwl9CisKKwl5YW1fdGltZXIuZnVuY3Rpb24gPSB5YW1fZG90aW1lcjsKKwl5YW1fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAvIDEwMDsKKwlhZGRfdGltZXIoJnlhbV90aW1lcik7CisKKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgieWFtIiwgU19JUlVHTywgJnlhbV9pbmZvX2ZvcHMpOworCXJldHVybiAwOworIGVycm9yOgorCXdoaWxlICgtLWkgPj0gMCkgeworCQl1bnJlZ2lzdGVyX25ldGRldih5YW1fZGV2c1tpXSk7CisJCWZyZWVfbmV0ZGV2KHlhbV9kZXZzW2ldKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCB5YW1fY2xlYW51cF9kcml2ZXIodm9pZCkKK3sKKwlzdHJ1Y3QgeWFtX21jcyAqcDsKKwlpbnQgaTsKKworCWRlbF90aW1lcigmeWFtX3RpbWVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0geWFtX2RldnNbaV07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorCisJd2hpbGUgKHlhbV9kYXRhKSB7CisJCXAgPSB5YW1fZGF0YTsKKwkJeWFtX2RhdGEgPSB5YW1fZGF0YS0+bmV4dDsKKwkJa2ZyZWUocCk7CisJfQorCisJcHJvY19uZXRfcmVtb3ZlKCJ5YW0iKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK01PRFVMRV9BVVRIT1IoIkZyZWRlcmljIFJpYmxlIEYxT0FUIGZyaWJsZUB0ZWFzZXIuZnIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiWWFtIGFtYXRldXIgcmFkaW8gbW9kZW0gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHlhbV9pbml0X2RyaXZlcik7Cittb2R1bGVfZXhpdCh5YW1fY2xlYW51cF9kcml2ZXIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtMTIwMC5oIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtMTIwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzY2E4YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0xMjAwLmgKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKgorICogRmlsZSB5YW0xazJiNS5tY3MgY29udmVydGVkIHRvIGggZm9ybWF0IGJ5IG1jczJoCisgKgorICogKEMpIEY2RkJCIDE5OTgKKyAqCisgKiBUdWUgQXVnIDI1IDIwOjI0OjA4IDE5OTgKKyAqCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYml0c18xMjAwW109IHsKKzB4ZmYsMHhmMiwweDAwLDB4YTUsMHhhZCwweGZmLDB4ZmUsMHg5ZiwweGZmLDB4ZWYsMHhmMywweGNiLDB4ZmYsMHhkYiwweGZjLDB4ZjIsCisweGZmLDB4ZjYsMHhmZiwweDNjLDB4YmYsMHhmZCwweGJmLDB4ZGYsMHg2ZSwweDNmLDB4NmYsMHhmMSwweDdkLDB4YjQsMHhmZCwweGJmLAorMHhkZiwweDZmLDB4M2YsMHg2ZiwweGY3LDB4MGIsMHhmZiwweGRiLDB4ZmQsMHhmMiwweGZmLDB4ZjYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmZiwweGZmLDB4ZmYsCisweGZkLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGJmLAorMHhmZiwweGZmLDB4ZjcsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGZmLDB4ZmYsMHhmYywweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmMCwKKzB4NWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNywweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZlLDB4N2YsMHhiZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhmZiwweGZiLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg5ZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsCisweGZmLDB4ZmYsMHhmYiwweGZmLDB4ZmIsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmNywweGZmLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmZiwweGYwLDB4NWYsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4YmYsMHhmZiwweGZmLDB4ZGYsMHhmNywweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZWIsCisweGZmLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhiZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZiLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg2ZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmNywweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmNywweGJmLDB4ZTcsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZiLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg3NywweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhkYiwKKzB4ZmYsMHhmZiwweGY1LDB4YTUsMHhmZCwweDRiLDB4NmUsMHhlZiwweDMzLDB4MzIsMHhkZCwweGQzLDB4NGEsMHhkNiwweDkyLDB4ZmUsCisweGIzLDB4M2YsMHhiZCwweGYxLDB4ZmEsMHhkYiwweGZlLDB4ZjcsMHhmNiwweDk2LDB4YmQsMHhiZCwweGZmLDB4YmQsMHhmZiwweGVkLAorMHg3ZiwweDZiLDB4N2YsMHhmYiwweGRmLDB4ZmUsMHhmYiwweGZlLDB4OTAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4YmUsMHhlZiwKKzB4ZmYsMHhmZiwweGRiLDB4NWYsMHhmNiwweGZmLDB4ZjYsMHg4ZiwweGZkLDB4YTUsMHhkZCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4NmYsCisweDdmLDB4ZGIsMHhmMSwweGZjLDB4YmYsMHhmZiwweDZmLDB4ZmYsMHhlZiwweGZjLDB4NWIsMHg1ZCwweGRhLDB4ZGYsMHhmNCwweGZmLAorMHhmMiwweGZmLDB4ZmQsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGQwLDB4MWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmYiwweGVmLDB4YjcsMHhmYywweDMzLDB4ZmYsMHhmYiwweGZmLDB4MDQsMHg2YSwweGYzLDB4M2MsMHgzNiwweGZmLDB4ZjAsCisweDBmLDB4ZjEsMHgwZiwweGZmLDB4ZmYsMHhmZiwweGYzLDB4MTUsMHg3MiwweDBmLDB4ZjEsMHg2ZiwweGZmLDB4ZmUsMHg5NCwweDNmLAorMHhmZiwweGZmLDB4ZmYsMHg3YiwweGZmLDB4ZmYsMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmMCwKKzB4ZjcsMHhlZiwweGI3LDB4ZmMsMHgzMywweGZmLDB4ZmYsMHhmZiwweDA0LDB4NmEsMHhmMywweDNjLDB4MzYsMHhmZiwweGYwLDB4MGYsCisweGYxLDB4MGYsMHhmZiwweGZmLDB4ZmYsMHhmMywweDE1LDB4NzMsMHg4ZiwweGYyLDB4NmYsMHhmZiwweGZlLDB4OTQsMHgzZiwweGZmLAorMHhmZiwweGZmLDB4N2QsMHg5ZiwweGZmLDB4ZjAsMHgwZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg5ZSwKKzB4ZmYsMHhmYywweGVmLDB4ZDMsMHhmYiwweGZmLDB4N2YsMHhmNSwweDVmLDB4ZmUsMHg1OSwweGZmLDB4ZmYsMHhmZiwweGZjLDB4ZjEsCisweGZlLDB4N2YsMHhmZiwweGZmLDB4ZmEsMHgxNywweGZmLDB4ZTcsMHhlZiwweGVmLDB4ZmYsMHhmZiwweDNmLDB4ZjEsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY1LDB4ZmYsMHhiZiwweGZmLDB4ZmMsMHhlYSwKKzB4ZmYsMHhmMCwweGZmLDB4ZmYsMHhiZiwweGY5LDB4M2YsMHhiMSwweGVmLDB4ZmYsMHhkNywweGZmLDB4ZmIsMHhmZiwweGYwLDB4ZmYsCisweGZmLDB4ZjMsMHhmZiwweGRmLDB4ZmYsMHg3YiwweGZmLDB4ZmQsMHhmZiwweGY2LDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhiZiwweGZmLAorMHhmZiwweGZmLDB4ZGEsMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMiwweGMwLDB4MDEsMHgwMCwweDAwLDB4MDIsMHgwMiwKKzB4MDIsMHgwMiwweDAwLDB4NDAsMHg0MCwweDQwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTksMHgwMCwweDA0LDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLAorMHgwMCwweDNjLDB4ZjAsMHhhZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmQsMHhiZiwweGZmLDB4ZmYsMHhmYiwweGZmLDB4ZmQsMHhmZiwKKzB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhiZiwweGZmLDB4ZWYsMHhmZiwweGZmLDB4ZmQsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGRmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhiZiwweGZlLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLAorMHhkYiwweGYwLDB4NmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYwLDB4YmYsMHhkZiwweGZmLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZGYsMHhkZiwweGZmLDB4ZWYsMHhmZiwweDllLDB4ZWYsMHhmZiwweGZmLDB4N2YsMHhmZiwweGYxLDB4ZWYsMHhmZiwweGZmLDB4ZmYsCisweGY3LDB4ZmEsMHhiZiwweGZmLDB4ZmYsMHhmZSwweDQ3LDB4ZWYsMHhmZiwweGJkLDB4ZjYsMHhmZiwweGZmLDB4ZGYsMHhmNSwweGYwLAorMHhmMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmOCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAxLDB4MDIsMHgwOCwKKzB4MTYsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDEsMHgwMiwweDAwLDB4ODAsMHgwMSwweDBjLDB4MDIsMHgwMCwweDAwLDB4MDEsCisweDAwLDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwNiwweDAwLDB4MjAsMHgwMCwweDEwLDB4MDAsMHgxNCwweDAwLDB4MDQsMHhjMSwweGYwLAorMHgyZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHg3ZiwKKzB4ZWMsMHhmZiwweGZmLDB4ZmEsMHhmZiwweGJmLDB4ZmYsMHg2ZiwweGZmLDB4ZTEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGJkLDB4ZmUsCisweDQ2LDB4ZmYsMHhlZiwweDdmLDB4Y2QsMHhkZiwweGZmLDB4ZmYsMHhmZCwweGZmLDB4YmQsMHhmZiwweDdmLDB4N2YsMHhmMCwweDRmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgwZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZCwweGE0LDB4YmMsMHhjZCwweDZkLDB4NmIsMHg2ZiwweDViLDB4ZGMsMHgzMywKKzB4NWEsMHhmNiwweGY3LDB4ZjYsMHhiMywweDNmLDB4YmQsMHhjMSwweGZhLDB4NWEsMHhmNiwweGY2LDB4YjYsMHhmNywweGZmLDB4YmQsCisweGJiLDB4M2MsMHhjZSwweGNmLDB4MzQsMHhlZiwweDMzLDB4YmIsMHhjYywweGZmLDB4ZmYsMHhmZiwweGYwLDB4NGYsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGZmLDB4ZjYsMHhkNiwweGZmLDB4ZmQsMHhmZCwweGJmLDB4ZmYsMHhhZCwKKzB4YmYsMHhmOSwweDdmLDB4NmYsMHhmYywweGRiLDB4ZjEsMHhmZCwweGJmLDB4ZmYsMHg2ZiwweGZmLDB4ZmYsMHhkYSwweGRiLDB4ZmMsCisweGRiLDB4ZmYsMHg3NiwweDhmLDB4ZjYsMHhmZiwweGNkLDB4YWIsMHhmZSwweGZiLDB4ZmYsMHhkMCwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZSwweGZmLDB4OWYsMHhmZiwweGY0LDB4MjAsMHhhZiwweDZkLDB4MGIsMHhjMSwweDdiLDB4ZmYsMHhmZiwweGZmLDB4Y2IsMHhmZiwKKzB4M2YsMHhmMCwweGVmLDB4N2YsMHgwZiwweGYxLDB4YzMsMHgzYywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY4LDB4MGIsCisweDFkLDB4NmEsMHg2NCwweDA1LDB4NmIsMHg5OSwweDAxLDB4ZmYsMHhmZCwweGVmLDB4ZjAsMHgyZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZiwweGZmLDB4ZmYsMHhmNCwweDAwLDB4MmYsMHhjYywweDBiLDB4YzMsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweDBhLDB4ZGYsMHhiZiwKKzB4ZmQsMHg3ZiwweGZmLDB4ZmYsMHhmMSwweGMzLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDRhLDB4MGUsCisweDk2LDB4NjQsMHgwMiwweDk3LDB4OTksMHgxMCwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHg4NCwweGY5LDB4ZDUsMHgyNywweGYxLDB4N2YsMHhmZiwweGY4LDB4ZWIsMHhkZiwweGYzLDB4Y2YsMHgzZiwKKzB4MWYsMHhmZiwweGY3LDB4MTEsMHhmZiwweGNmLDB4ZmYsMHhmZSwweDY3LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhjNCwweGZmLDB4ZmYsCisweGIzLDB4YTEsMHhmZiwweGY5LDB4ZTAsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNSwweGZmLAorMHhmZiwweGZiLDB4N2YsMHhlMCwweGZmLDB4YzcsMHhmZSwweDdmLDB4M2YsMHhmZiwweGZkLDB4NzcsMHg4ZCwweDdmLDB4MGYsMHhmZiwKKzB4YzMsMHhmZiwweGYxLDB4YmYsMHg4ZiwweGNmLDB4ZmYsMHhmZiwweGRkLDB4N2IsMHhmZiwweGY2LDB4ZmEsMHhmNywweGZmLDB4NDAsCisweDlmLDB4ZjksMHg3ZiwweGQ4LDB4ZmYsMHhmZiwweGZhLDB4ZjAsMHgxZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjEsMHhjMCwweDAwLAorMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgxMCwKKzB4MDAsMHgwMSwweDAwLDB4MTAsMHgyMCwweDIwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwNCwweDAxLDB4MDUsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4NDAsMHg0MCwweDAwLDB4MDAsMHgzYywweGYwLDB4MWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZkLDB4YmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHg3ZiwweDdmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZWYsMHhmNywKKzB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLDB4ZmMsMHhmZCwweGZmLDB4N2YsCisweDdlLDB4ZmYsMHhmZiwweGZmLDB4ZGIsMHhmMCwweDZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMCwweGJiLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhlYiwweGZkLDB4NmYsMHhmZiwweGY3LDB4ZmUsMHhmNSwweDdmLDB4ZmYsMHhmZiwweDdmLDB4YmYsMHhiMSwKKzB4ZmYsMHhmZiwweDlmLDB4YmYsMHhmYiwweGZmLDB4ZmUsMHhmZiwweGZlLDB4ZmYsMHhmNywweGViLDB4ZGYsMHhiZiwweDVmLDB4ZGQsCisweGZmLDB4ZGIsMHhmZCwweGQwLDB4ZjAsMHg2ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjgsMHgzMCwweDIwLDB4MDAsMHg0MiwweDAwLAorMHgwMCwweDAwLDB4MzAsMHgxOCwweDA0LDB4MDgsMHgwOSwweDIxLDB4ODIsMHg4MCwweDAyLDB4MDAsMHgwOCwweDAwLDB4MDEsMHgwMCwKKzB4MDAsMHgwMCwweDBjLDB4MjAsMHgxMCwweDAwLDB4MTEsMHgwMCwweDQ0LDB4ODQsMHgwMCwweDIwLDB4MjAsMHg4NCwweDgwLDB4MDAsCisweDAwLDB4MDAsMHhjMSwweGYwLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZjcsMHhmZiwweGZiLDB4ZGQsMHhmOSwweGZmLAorMHhkYSwweGZmLDB4ZGMsMHhkZCwweGZjLDB4ZmIsMHhmZiwweGJmLDB4ZmIsMHgzZSwweGQ3LDB4OTYsMHhmZSwweDYxLDB4ZjcsMHhmZiwKKzB4N2YsMHhmZiwweDNmLDB4ZmQsMHhmZiwweGRmLDB4Y2YsMHhmNywweGRmLDB4ZjcsMHhiZiwweGZkLDB4ZmYsMHhmZSwweGVmLDB4ZWYsCisweGZlLDB4ZmYsMHhmMCwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZjAsMHgyZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZjMsMHhiZCwweGZkLDB4NGIsMHg3NCwweGNmLAorMHg3MywweDViLDB4Y2IsMHgzYiwweGRmLDB4ZmUsMHhmNywweGZlLDB4ZDMsMHg3NSwweGFjLDB4YTEsMHhmYiwweGRmLDB4ZmUsMHhmNywKKzB4NzYsMHg5NiwweGI1LDB4MjQsMHhiZCwweGE1LDB4YWQsMHg0OSwweDJmLDB4NjksMHgyYiwweDUyLDB4NWIsMHhiZCwweGZmLDB4ZmYsCisweGYwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZGIsMHhmZiwweGY2LDB4ZmUsMHhmZiwweGNjLAorMHhhNywweGZiLDB4YWQsMHhmZiwweDdmLDB4NmYsMHhmZiwweDZkLDB4N2YsMHhkYiwweGYxLDB4ZmQsMHhiZiwweGZmLDB4NmYsMHhmZiwKKzB4NmYsMHhmZiwweGRiLDB4ZmYsMHhkYiwweGZmLDB4ZjYsMHg5NywweGY2LDB4ZmYsMHhiNSwweGI1LDB4ZmYsMHhmZiwweGZmLDB4ZDAsCisweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZCwweGE1LDB4YmMsMHg0MywweGZjLDB4N2MsMHgwMywweGU3LAorMHhmZiwweGZmLDB4MjAsMHhmZiwweGZmLDB4ZmYsMHhjYywweGZkLDB4N2QsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZDUsMHg1OSwKKzB4YmEsMHg1NiwweDY2LDB4NmEsMHhhZCwweDlhLDB4YTksMHg5YSwweDk3LDB4YTUsMHhhYSwweGJiLDB4ZmYsMHhmZiwweGYwLDB4MGYsCisweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmUsMHhmYiwweGZmLDB4ZmQsMHhmNywweGZkLDB4NDMsMHhmZiwweGZkLDB4NmIsMHhlNywweGZmLAorMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDNmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGQ1LDB4NTksMHhiNSwKKzB4YTYsMHg2NiwweDZhLDB4YWQsMHg5YSwweGE5LDB4OTksMHg2YiwweDVhLDB4YWEsMHhmZiwweGZmLDB4YjcsMHhmMCwweDNmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZlLDB4OWMsMHhmNywweGZkLDB4ZDIsMHg0MSwweGZmLDB4ZmYsMHhmMiwweDdmLAorMHg4ZiwweGZmLDB4ZmYsMHgzZCwweGYzLDB4ZmYsMHgxNywweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZGYsMHhmYywKKzB4OGYsMHgzOCwweGZmLDB4ZWYsMHgyMywweGZmLDB4ZmIsMHhmNywweGM4LDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg5ZiwweGZmLDB4ZmYsCisweGZmLDB4ZmUsMHhmNSwweDdmLDB4ZmYsMHhmZCwweGZmLDB4ZTQsMHhmZiwweGViLDB4ZmYsMHhjZiwweGJmLDB4ZmEsMHhmZiwweGFiLAorMHhlZiwweGZmLDB4ZmIsMHhmZiwweGYzLDB4ZmQsMHg2MSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmEsMHhmZiwweGZiLDB4ZmQsMHgwZCwKKzB4ZmYsMHhmZSwweGZmLDB4NDMsMHg3ZiwweGZlLDB4YmYsMHhkMCwweGZkLDB4ZmYsMHhmYSwweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmYsCisweGZlLDB4ZjMsMHhjMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMiwweDAxLDB4MDAsMHg2MCwweGMwLDB4NDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MzQsMHgwNCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4ODgsMHgwMCwKKzB4MDAsMHgwMywweDAwLDB4MDAsMHg0MCwweDAwLDB4NDAsMHgwMCwweDAwLDB4M2MsMHhmMCwweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsCisweGZkLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweDdmLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmNywweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLDB4ZmQsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZSwweDVmLDB4ZmYsMHhmZiwweGNiLDB4ZjAsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjAsCisweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZWYsMHhlMywweGRlLDB4ZWUsMHhkOSwweGM1LDB4OTMsMHhmZiwweGZmLDB4ZmUsMHhmZSwweGZmLAorMHhmYiwweGVlLDB4ZmUsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZCwweGZmLDB4YmYsMHhmNywweGZmLDB4ZmYsMHg3ZiwKKzB4YWYsMHhiZCwweGRmLDB4ZGYsMHhmYiwweGYzLDB4ZjMsMHhmMCwweGYwLDB4YWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY4LDB4MzQsCisweDAwLDB4MDYsMHg2MSwweDAwLDB4MTgsMHgwMSwweGEwLDB4MDUsMHgxNywweDAwLDB4MjAsMHgwNSwweDI4LDB4MjAsMHgwMCwweDAwLAorMHgwNSwweDAwLDB4NDEsMHgwMCwweDAwLDB4NDAsMHgwMCwweDA5LDB4MDAsMHgwMSwweDIwLDB4ODYsMHg4MiwweDA4LDB4NDAsMHgwMywKKzB4ODAsMHgzMCwweDcwLDB4MDgsMHgxNCwweDAyLDB4YzEsMHhmMCwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhiZCwweGVmLDB4ZmIsMHhmZiwweGZmLDB4ZmIsMHg5YywweDdmLDB4ZWYsMHhkZiwweGZmLDB4YmYsMHhlYiwweGRlLAorMHhmZiwweGMxLDB4N2YsMHhmZiwweGZiLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHg1ZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4YmYsMHhlZiwKKzB4M2YsMHhmNywweDhmLDB4ZWYsMHg3ZiwweGZmLDB4ZjAsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YmQsCisweGRmLDB4ZWYsMHg3ZCwweDZkLDB4MmIsMHg1YSwweDVkLDB4ZDIsMHhkZiwweGY2LDB4OTIsMHhiNiwweGIyLDB4YjMsMHhhYywweGExLAorMHhmYiwweGRmLDB4ZmUsMHhmMSwweGVlLDB4ZjUsMHhmNiwweGJjLDB4NmIsMHhiZCwweDdkLDB4YWYsMHgxYSwweGVmLDB4NWYsMHg2YiwKKzB4YzYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZmYsCisweGY2LDB4ZmYsMHhmNiwweGI3LDB4ZmQsMHhhZCwweGZkLDB4YmYsMHhmMywweDZmLDB4ZmYsMHg2ZiwweGZmLDB4ZGIsMHhkMSwweGZkLAorMHhiZiwweGZmLDB4NmYsMHhmNSwweDZiLDB4YmMsMHg1YiwweDNjLDB4ZGEsMHhlZiwweDE2LDB4YWYsMHgxNiwweGZmLDB4Y2QsMHhhYiwKKzB4ZmYsMHg2ZiwweGZmLDB4ZDAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmMsMHhiZiwweGZmLDB4ZmYsCisweGZmLDB4NmMsMHgwMywweDEwLDB4YzEsMHhmMywweGZmLDB4ZjMsMHgzYSwweGYzLDB4Y2EsMHhmZiwweGFmLDB4ZjEsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZDksMHg5NiwweGE2LDB4NjUsMHhhNiwweDY2LDB4NmEsMHg5NSwweDY5LDB4NjksMHg2YSwweDVhLDB4NWEsMHhmZiwKKzB4ZmYsMHg1ZiwweGYwLDB4MWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YmYsMHhmZiwweGZmLDB4ZmYsCisweGVhLDB4MGYsMHg1MCwweGMzLDB4ZjMsMHg3ZiwweGZmLDB4ZjMsMHhmMywweGMzLDB4ZmYsMHhhZiwweGYxLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGQ5LDB4OTYsMHhhNiwweDY1LDB4YTYsMHg2NiwweDZhLDB4OTUsMHg2OSwweDY5LDB4NmEsMHg1YSwweDVhLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmMCwweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGQ3LDB4ZmYsMHhmZiwweDVmLDB4YzEsCisweDNmLDB4ZjcsMHg1ZSwweGY1LDB4Y2UsMHg5ZSwweDVmLDB4M2YsMHgxNywweGZmLDB4ZjMsMHhlMSwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhkOCwweGZmLDB4ZmEsMHhmZSwweDY3LDB4ZmYsMHhmZSwweGJmLDB4NWEsMHhmZiwweGZmLDB4YWYsMHhmNSwweGZmLDB4ZmYsMHhmZiwKKzB4ZjAsMHgyZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjUsMHhmZiwweGZmLDB4ZmQsMHhmZiwweGY3LDB4ZmYsMHhmZCwweDRlLDB4M2QsCisweDNmLDB4ZTcsMHgwYiwweGJmLDB4OGYsMHhmOSwweGZmLDB4ZWIsMHhlMywweGZmLDB4ZTEsMHhmZiwweGZmLDB4ZmMsMHhmZiwweGM3LAorMHg5ZiwweGZmLDB4M2UsMHgzOSwweGU1LDB4ZmYsMHhjZiwweDliLDB4ZjksMHhmZiwweGZmLDB4YzUsMHhmZiwweGZmLDB4ZmEsMHhmMCwKKzB4NWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYzLDB4YzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDIwLAorMHgwMCwweDAxLDB4MTAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4ZjAsMHg0ZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4YmYsCisweDNmLDB4ZmYsMHhmZiwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhmZiwweGY3LAorMHhmZiwweGVkLDB4ZmYsMHhmYiwweGZlLDB4ZmYsMHg3ZiwweGZmLDB4N2YsMHhkZiwweGZmLDB4ZmYsMHhkZCwweGYwLDB4M2YsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZjAsMHhmZiwweGZmLDB4ZjMsMHhmZiwweGY3LDB4ZmYsMHhmZSwweDVmLDB4ZmYsMHhmNywweGZmLDB4ZmYsCisweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhmZSwweDdiLDB4ZjEsMHhmZiwweGZkLDB4ZmQsMHhmZiwweGRmLDB4ZGYsMHhmZiwweDdkLAorMHg3MywweGY5LDB4ZmYsMHhjMywweDdlLDB4ZmUsMHhmZiwweGVmLDB4ZDcsMHhmZiwweGNmLDB4ZDAsMHhmMCwweDZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGY4LDB4MzAsMHgwMCwweDAwLDB4NDAsMHgwNCwweDAwLDB4MDEsMHg0MSwweDIwLDB4MDAsMHgwNCwweDAwLDB4MDIsCisweGQ1LDB4MDksMHgwMCwweDAyLDB4ODAsMHgwMiwweDAxLDB4MDAsMHgwMCwweDAwLDB4MGEsMHgwNCwweDAwLDB4MDcsMHgwMCwweDAxLAorMHg1MCwweDAxLDB4ODAsMHgwMiwweDYxLDB4NDAsMHg0MSwweDBjLDB4MTQsMHgwOCwweGMxLDB4ZjAsMHg5ZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZGYsMHhjYiwweDVmLDB4ZmUsMHhlZiwweGZmLDB4ZmUsCisweGZmLDB4M2YsMHhmZiwweDdmLDB4ZmQsMHhjMSwweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZGYsMHhmZCwweGZjLDB4ZmQsMHhmNywweGVlLAorMHhmZiwweGZmLDB4NGUsMHhmZiwweGRmLDB4Y2YsMHhkYiwweGViLDB4ZmYsMHhmZiwweGYwLDB4MWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHg3ZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmQsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsCisweGY3LDB4ZmIsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZjAsMHgxZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZGQsMHhmZiwKKzB4ZmYsMHhmZiwweGE1LDB4ZmYsMHg2ZiwweDZiLDB4ZTksMHg2ZiwweGRhLDB4Y2EsMHhmYiwweGRkLDB4ZWUsMHhmNywweGY2LDB4YjIsCisweGIzLDB4YTQsMHhhMSwweDViLDB4NWIsMHhmNiwweGQ3LDB4ZjQsMHhmNywweDdiLDB4YmQsMHhiZCwweGFkLDB4Y2YsMHhlZiwweDdmLAorMHg2YiwweDdmLDB4M2IsMHhkZiwweGRiLDB4ZmYsMHhmZiwweDMwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGJmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZjYsMHhmZSwweDk2LDB4ZmYsMHhmZCwweGI1LDB4ZmQsMHhiZiwweGFkLDB4N2YsMHhmZiwweDZmLDB4ZmYsCisweGRlLDB4ZDEsMHhhZCwweGFkLDB4ZTksMHhmZiwweGYxLDB4ZWMsMHhlZiwweGRlLDB4M2YsMHhjYiwweGZmLDB4ZjYsMHhmZiwweDMyLAorMHhmZiwweGM1LDB4YmQsMHhmZiwweGZmLDB4ZmYsMHhkMCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZSwweGZiLDB4ZmYsMHhmNCwKKzB4MjgsMHhiZiwweGZmLDB4ZmQsMHhmYiwweGQzLDB4ZmYsMHhmZiwweDQyLDB4ZmYsMHhmZiwweGZmLDB4ZWEsMHhiMywweGZjLDB4YzMsCisweGMxLDB4ZmYsMHgzMywweGZmLDB4YzAsMHgxNSwweDZiLDB4NzAsMHhmZiwweGYwLDB4ZjIsMHg0ZiwweGZmLDB4ZmMsMHgzZSwweDk3LAorMHgzYywweGZmLDB4ZmYsMHhmZCwweGVmLDB4ZjAsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHg3OCwKKzB4YmYsMHhmZiwweGZkLDB4ZjMsMHhlZiwweDU1LDB4ZmYsMHg3ZSwweGZmLDB4ZmYsMHhmZiwweGVhLDB4YjMsMHhmYywweGMzLDB4YzEsCisweGZmLDB4MzMsMHhmZiwweGMwLDB4MTUsMHg2ZiwweGZmLDB4MGYsMHhmMCwweGYwLDB4MGYsMHhmZiwweGZjLDB4M2QsMHg2YiwweGMzLAorMHhmZiwweGZmLDB4ZmUsMHhmNywweGYwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmMsMHhmZiwKKzB4ZmYsMHgyMywweGY4LDB4N2YsMHhmZiwweDRlLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmOSwweDE3LDB4ZmYsMHhmNiwweGYxLDB4ZmYsCisweGNmLDB4ZWYsMHhmZiwweGZmLDB4MTMsMHhkZiwweGU2LDB4MmYsMHhjNywweGZmLDB4ZmYsMHhlNywweGMxLDB4ZmQsMHhmZiwweGZlLAorMHhmZiwweGZmLDB4ZmYsMHhmMCwweDRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNSwweGZmLDB4ZmYsMHhmZiwweGZlLDB4YWUsMHhmZiwKKzB4ZmYsMHg3ZiwweDNiLDB4M2YsMHhmYywweDdmLDB4ZmMsMHhlZiwweGZmLDB4ZmMsMHhlMiwweDdiLDB4ZmYsMHhmMSwweGZkLDB4ZWQsCisweGVmLDB4ZmYsMHhmZiwweDM1LDB4NzMsMHhmZiwweGZmLDB4ZmUsMHhmYSwweGZmLDB4ZmYsMHhmZiwweGZlLDB4YmYsMHhmZiwweGZmLAorMHhmZiwweGZhLDB4ZjAsMHg4ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjEsMHhjMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDA0LDB4MDEsMHg0MCwweDQwLDB4MDAsCisweDAwLDB4MzAsMHgyOCwweDA0LDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzOCwweGYwLDB4MGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZkLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHg3ZiwKKzB4ZmYsMHhmZiwweDlmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhkZiwweGRmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGVkLDB4ZmYsMHhmZCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhiZiwweGJmLDB4ZmYsMHhmZiwweGMzLAorMHhmMCwweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMCwweGJmLDB4ZmQsMHhmZiwweGJmLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmQsMHg3YiwweGZmLDB4N2YsMHhmZiwweGJkLDB4ZmYsMHhmMSwweGVmLDB4ZmYsMHhmZiwweGZkLDB4ZGYsCisweGZkLDB4ZmIsMHhmZiwweGZmLDB4YmYsMHhiZSwweGZmLDB4Y2QsMHg3ZiwweGZjLDB4ZjcsMHhmNywweDZmLDB4YmYsMHhkOCwweGYwLAorMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjgsMHgzMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweGEwLDB4MDAsMHgwMCwKKzB4YzAsMHgwMCwweDAwLDB4MjAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDBjLDB4ODEsMHgwMCwweDIwLDB4YTQsMHgyMCwweDAwLDB4MTAsCisweDA4LDB4MDQsMHg0OCwweDA4LDB4MDAsMHg0MCwweDkzLDB4MDAsMHgxMCwweDAwLDB4MzgsMHgxOCwweDIwLDB4YzEsMHhmMCwweDNmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmIsMHhmZiwweGZmLDB4YjksMHhkZiwweGZlLDB4YjMsMHhmZiwweGZmLDB4ZTcsMHhmZCwKKzB4ZmYsMHhmZiwweDNiLDB4ZmYsMHg3ZiwweGZmLDB4YmYsMHhmZiwweGMxLDB4ZmYsMHhmYywweGZmLDB4ZmYsMHgzZiwweDc3LDB4ZmUsCisweGZlLDB4Y2YsMHhmZiwweGJmLDB4ZmQsMHhiZiwweGZmLDB4ZmUsMHhlZCwweGYyLDB4ZmQsMHhmNywweGZmLDB4ZjAsMHgyZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4YmYsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZjMsMHhhZCwweGNmLDB4ZWYsMHg3MCwweGM5LDB4NzMsMHgzYiwweGRmLDB4NWIsMHg0YSwKKzB4ZjYsMHhiNywweGZlLDB4ZDcsMHhmNSwweGJjLDB4YzEsMHgzMywweGNhLDB4ZDYsMHhiNywweDZlLDB4ZjcsMHhmYiwweGJkLDB4YzUsCisweDI0LDB4Y2YsMHg2ZiwweDJmLDB4NGQsMHgyYiwweGJhLDB4NWEsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGFmLDB4ZmYsMHhmZiwweGZmLAorMHhmZSwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNiwweGY2LDB4ZDcsMHhmZiwweGZmLDB4YWQsMHhiZCwweGZmLDB4ZmYsMHhmZiwKKzB4ZWYsMHhmNywweDdmLDB4ZmMsMHg1YiwweGIxLDB4ZmQsMHhiZCwweDc1LDB4NmYsMHhlZiwweDZhLDB4ZmQsMHg1YiwweGZiLDB4ZGIsCisweDNhLDB4YmYsMHg4ZSwweDlmLDB4ZmYsMHhiZiwweGZkLDB4ZmYsMHg2ZiwweGZmLDB4ZDAsMHg2ZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZiwweGJiLDB4ZmYsMHhmMCwweDNmLDB4ZmYsMHhmZiwweGZkLDB4ZmIsMHg3ZiwweGRlLDB4ZmYsMHhmZiwweDVhLDB4ZDYsMHhiZiwKKzB4ZDgsMHgyYSwweGJmLDB4YmYsMHhmMSwweGU1LDB4ZmYsMHhjYywweGMwLDB4YTksMHg3MCwweGZmLDB4ZjMsMHgzYywweDNjLDB4ZmQsCisweDU3LDB4ZmQsMHg5OCwweDAzLDB4MDAsMHhjMywweGZmLDB4ZmYsMHhmZiwweGYwLDB4YWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHgzZCwweGJmLDB4ZmYsMHhmZCwweGZiLDB4ZmYsMHhkYiwweGZmLDB4ZmYsMHgwZiwweGZjLDB4M2YsMHhkOCwKKzB4MmEsMHhiZiwweGJmLDB4ZjEsMHhlZiwweGZmLDB4Y2MsMHhjMCwweDk2LDB4YmUsMHhmZiwweGYzLDB4M2YsMHhmZiwweGZkLDB4NTcsCisweGZkLDB4OTksMHgwZiwweGZmLDB4YzMsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLAorMHhmZiwweGYxLDB4ZTcsMHhmZiwweGZmLDB4ZjMsMHg4ZSwweDdiLDB4ZmYsMHhhOCwweGZmLDB4ZGYsMHg3ZiwweDhlLDB4NzgsMHg3MywKKzB4ZmYsMHhmMSwweDUxLDB4NjIsMHhmZiwweGZjLDB4NGIsMHhmZiwweGYzLDB4ZmYsMHg3ZSwweGNmLDB4ZjksMHhmZiwweGZkLDB4ZmYsCisweGZmLDB4N2YsMHhmZiwweGUwLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjUsMHhmZiwweGZmLAorMHhmYiwweGZkLDB4YWUsMHhmZiwweGZjLDB4ZmUsMHg2ZiwweDNmLDB4ZjgsMHhmZCwweDc3LDB4YWYsMHhmZSwweDM3LDB4ZmUsMHg3YiwKKzB4ZmYsMHhiMSwweDhjLDB4ZmYsMHhlZiwweGZkLDB4ZjgsMHhlNywweGJmLDB4ZmYsMHhmMSwweGZlLDB4M2UsMHhmNywweGZlLDB4OTUsCisweDNlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmYSwweGYwLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYxLDB4YzAsMHgwMCwweDAwLAorMHgwMSwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAyLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgxMCwweDAwLDB4MTAsMHgwOCwKKzB4NDEsMHg4MCwweDEwLDB4MDAsMHgwMCwweDA4LDB4MTAsMHg4NCwweDAwLDB4MGMsMHgwNCwweDAyLDB4NjEsMHgwMCwweDAwLDB4ODEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2QsMHhmMCwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4N2YsMHhmZiwweGZlLDB4ZmQsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwKKzB4N2YsMHhiZiwweGY3LDB4N2YsMHhlZiwweGZmLDB4ZWYsMHhmZiwweGY3LDB4ZmQsMHhmZiwweGZmLDB4ZmQsMHg3ZiwweGZmLDB4YmUsCisweGRmLDB4ZmYsMHhmZiwweGQ5LDB4ZjAsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjAsMHhiYiwweGZmLDB4N2YsMHhmYiwweGZmLAorMHhmYiwweGZmLDB4YmYsMHhmZiwweGYzLDB4N2YsMHhmYiwweGZkLDB4ZWIsMHg3ZiwweGRmLDB4ZmEsMHhmZiwweGRlLDB4ZjAsMHhlZCwKKzB4ZmYsMHhiMSwweGY3LDB4ZjksMHgxZiwweGI1LDB4NWIsMHhmZSwweDdlLDB4ZjcsMHhiZSwweGZkLDB4N2YsMHg1ZiwweGI1LDB4ZjcsCisweGZmLDB4ZmYsMHhkMCwweGYwLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY4LDB4MzAsMHgwMSwweDAwLDB4MDcsMHg0MiwweDAxLAorMHgwMCwweDZhLDB4MTgsMHg1MCwweDgwLDB4MDAsMHgwMCwweDAyLDB4NDAsMHgwMSwweDAxLDB4MjAsMHgwMSwweDAxLDB4MjQsMHgxNCwKKzB4MjEsMHgxMCwweDAyLDB4MDgsMHgwNywweDA4LDB4MDAsMHg0MCwweDEwLDB4ODAsMHg1OCwweDAwLDB4ODQsMHg4MCwweDE4LDB4MTAsCisweDQwLDB4YzEsMHhmMCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmNywweGZmLDB4ZGIsMHhiNywweGYzLAorMHhkZiwweDdjLDB4ZjgsMHg3NCwweGZmLDB4ZmYsMHg2ZiwweDdkLDB4M2YsMHg3ZSwweGVjLDB4N2YsMHhjMSwweGY1LDB4ZmYsMHhjZiwKKzB4NmYsMHg5ZiwweGY5LDB4ZGYsMHhiZSwweGU1LDB4ZTcsMHhmZiwweGQ3LDB4ZjMsMHhkZCwweGZiLDB4ZmYsMHhmYywweGZmLDB4YmYsCisweGZmLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGQ3LDB4ZmYsMHhmZiwweGZmLDB4YjQsMHhjZiwweGVmLDB4NzcsMHg2ZiwweDczLAorMHgzYSwweDRhLDB4M2EsMHhjYiwweGQ0LDB4ZjcsMHgyZSwweGQ2LDB4YmQsMHhiZCwweGExLDB4M2IsMHhkZiwweGQ2LDB4ZjcsMHhlZSwKKzB4ZDMsMHgzNSwweGJkLDB4ZmIsMHhiZCwweGNlLDB4ZWIsMHgyYiwweDRkLDB4MmYsMHhiYiwweGRhLDB4ZmYsMHhmZiwweGZlLDB4YjAsCisweDVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4NWYsMHgzNiwweGFmLDB4M2YsMHhlZCwweGI3LAorMHhmNSwweGZkLDB4ZjMsMHgyYiwweGVmLDB4NzcsMHhmZiwweGZiLDB4ZGEsMHhiMSwweGJkLDB4YTMsMHg3NywweDY5LDB4N2YsMHg0ZiwKKzB4ZmYsMHhkYiwweGZhLDB4NWIsMHhmZiwweGYyLDB4ZmUsMHhmZiwweDk2LDB4ZmYsMHhmZiwweGZlLDB4ZGYsMHhmZiwweGQwLDB4YWYsCisweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmQsMHg4ZiwweGZkLDB4NDAsMHg2ZiwweDllLDB4ODMsMHg1YSwweDBmLAorMHhmYSwweGMzLDB4ZmYsMHhmZiwweGZjLDB4ZTksMHg3ZiwweGYzLDB4MDEsMHhkMCwweDAwLDB4ZmUsMHhiZiwweGNkLDB4M2YsMHhmMCwKKzB4ZWYsMHhmYywweGM1LDB4MGMsMHgzZiwweGZkLDB4NjgsMHgwYiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZGYsMHhmMCwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGZmLDB4YmIsMHhmZiwweGZkLDB4ODUsMHhmZiwweGQ0LDB4NmYsMHg5ZiwweGMzLDB4NWEsMHgwZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmYywweGU5LDB4N2YsMHhmMywweDAxLDB4ZjAsMHhmYiwweGMyLDB4YmYsMHhmYywweDAwLDB4MzcsMHhlZiwKKzB4ZmMsMHhjZCwweGJjLDB4M2YsMHhmZiwweDBjLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg1ZiwweGZmLDB4ZmYsCisweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGQ5LDB4ZjcsMHhkMSwweGI3LDB4N2UsMHg3ZiwweGYxLDB4ZTQsMHhmZCwweGZmLAorMHhmYiwweGZiLDB4ZmYsMHg1ZiwweGZmLDB4N2YsMHhiMSwweGJjLDB4MGYsMHg2NywweGViLDB4YjgsMHgzZiwweGZmLDB4ZTIsMHhmZiwKKzB4ZTksMHhmZiwweGZkLDB4ZTMsMHhmZiwweDNmLDB4OWYsMHhjMiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4OWYsMHhmZiwweGZmLDB4ZmYsCisweGZlLDB4ZjUsMHg3ZiwweGZmLDB4ZjAsMHgzZiwweGJjLDB4ZmYsMHhkNSwweGY1LDB4Y2UsMHgzZiwweGZlLDB4ZmYsMHhmZSwweDZkLAorMHhmZiwweGYxLDB4YmYsMHg3YiwweGZmLDB4ZjEsMHhmZCwweGZmLDB4NGYsMHhmZiwweDg3LDB4ZmYsMHhhZSwweGZmLDB4YjEsMHhmOCwKKzB4ZmUsMHhmZiwweGZmLDB4NzgsMHgwMSwweGI5LDB4ZmYsMHhmZiwweGZmLDB4ZmEsMHhmMCwweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsCisweGYzLDB4YzAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAyLDB4MTMsMHgwMiwweDAwLDB4ODAsMHg0MCwweDAwLDB4OTAsMHgxMCwweDAwLAorMHgxMCwweDAwLDB4MDIsMHgwMCwweDAxLDB4MjAsMHg4MCwweDEyLDB4MTAsMHgwMCwweDQwLDB4MDgsMHgwMCwweDA0LDB4MDAsMHgwMCwKKzB4MDIsMHgwMCwweDAxLDB4NDAsMHgwMCwweDgwLDB4MDAsMHgwMCwweDNjLDB4ZjAsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmQsCisweDFmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsMHg3ZiwweGY3LDB4ZGYsMHhmNywweGZmLAorMHhmNywweGZiLDB4ZWIsMHhkMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmNywweGZmLDB4ZmYsMHhmYiwweGZmLDB4ZmUsMHhmZiwKKzB4ZmYsMHg3ZSwweGZmLDB4ZmIsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYwLDB4ZmYsCisweGZmLDB4YjcsMHhlYiwweGY3LDB4ZGYsMHhmZiwweGZlLDB4ZjUsMHg2YiwweGU3LDB4ZWQsMHhmNywweDNlLDB4ZWMsMHhmZiwweDU0LAorMHhlZiwweDZmLDB4ZjEsMHhmNSwweGFmLDB4NmYsMHhmNiwweGZkLDB4ZmYsMHhkZCwweDdiLDB4ZmYsMHhlZiwweGJmLDB4N2YsMHhmZiwKKzB4ZmYsMHhmNywweGZmLDB4ZjMsMHg1ZiwweGY3LDB4ZDAsMHhmMCwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmOCwweDMwLDB4MDAsCisweDgwLDB4NDAsMHgwNCwweDAwLDB4ODEsMHgyYywweDA0LDB4MjQsMHgwMCwweDAyLDB4MDEsMHhjOCwweDAyLDB4MDAsMHgwMiwweDI0LAorMHgwMCwweDAxLDB4YjQsMHg0MiwweGRjLDB4NDQsMHgwMiwweDE1LDB4OTAsMHgwMiwweDAzLDB4NDgsMHgzOSwweDEwLDB4MDIsMHgyNCwKKzB4YTAsMHhiYSwweDAwLDB4MDAsMHg0MCwweGMxLDB4ZjAsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZlLDB4ZmMsMHhmNywweGYwLDB4ZWUsMHhiNiwweDVkLDB4ZmQsMHhmNSwweGZmLDB4ZGIsMHhmNywweDdmLDB4N2YsMHhiZSwweGZmLAorMHhjMSwweGZlLDB4YmYsMHhmYSwweGZhLDB4NWYsMHhmZiwweGFkLDB4ZmYsMHhlZiwweGZmLDB4N2YsMHhkZiwweDdmLDB4ZmUsMHhiZiwKKzB4YjcsMHg5NCwweGJmLDB4ZmYsMHhmZiwweGYwLDB4OWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDhmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhkNywweGZmLDB4ZmYsMHhmYiwweGI1LDB4ZmYsCisweGVmLDB4N2MsMHhlYiwweDJiLDB4NTIsMHg1YiwweDNiLDB4ZGEsMHhkNCwweGYzLDB4MzYsMHg5NiwweGI1LDB4YmQsMHhmMSwweGZiLAorMHhkYSwweGVlLDB4ZjYsMHhmZSwweGQzLDB4MzUsMHhiZCwweGRmLDB4YWQsMHhjZiwweGVmLDB4N2UsMHhjZCwweDZiLDB4YmIsMHhkZiwKKzB4ZmYsMHhmZiwweGZkLDB4YjAsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhkMywweDVmLDB4ZjYsCisweGZmLDB4ZjYsMHhmZiwweGZkLDB4YWQsMHhmZCwweGZmLDB4N2YsMHhlZiwweGZmLDB4NmYsMHg3ZiwweGRiLDB4ZjEsMHhhNSwweGEzLAorMHg3ZiwweDZmLDB4NmIsMHg0ZiwweGZmLDB4ZGIsMHhmYiwweGNiLDB4ZmYsMHhmNiwweGZmLDB4ZjQsMHhkNywweGZkLDB4YmYsMHhmZSwKKzB4ZGYsMHhmZiwweGQwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZGYsMHhmZiwweGZmLDB4ZmYsCisweDNmLDB4N2YsMHhmYywweGU1LDB4ZmYsMHgyMCwweGZlLDB4ZmYsMHhmZiwweGRmLDB4N2YsMHhmZiwweGYxLDB4N2YsMHhmZiwweGZlLAorMHhmZiwweGYwLDB4N2MsMHgzZCwweDRmLDB4ZjMsMHhjMywweDNmLDB4ZmYsMHhmZiwweDZmLDB4YzMsMHhmZiwweDBmLDB4ZmYsMHhmZiwKKzB4YWYsMHhmMCwweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmIsMHhiNywweGUwLDB4MGYsMHhmZiwweGZmLDB4MmIsCisweGZmLDB4N2QsMHhiZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZjgsMHg5ZiwweDdmLDB4ZmYsMHhmMSwweDU1LDB4ZmYsMHhmZiwweGZmLAorMHhmZCwweDdjLDB4M2MsMHhmZiwweGYzLDB4YzMsMHgzZiwweGZmLDB4ZmYsMHhlZiwweGMzLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZjAsMHg5ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHg5ZiwweGJmLDB4N2YsCisweGY5LDB4MTksMHg0NywweDhlLDB4ZTcsMHg5ZiwweDNmLDB4MTcsMHhmZiwweGZjLDB4ODEsMHhjMSwweDdlLDB4ZjMsMHhkOSwweGY5LAorMHg3MywweGRmLDB4ZjQsMHg3ZiwweGZhLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHg3ZiwweDc3LDB4YzcsMHhmZiwweGZmLDB4ZmYsMHhmMCwKKzB4MmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY1LDB4ZjcsMHhmZiwweGZiLDB4ZmYsMHhmNywweDNmLDB4ZmMsMHhiZiwweDNlLDB4M2YsCisweGVjLDB4ZmYsMHg4MSwweGFmLDB4ZmUsMHg0ZiwweGYzLDB4YmIsMHhmZiwweGYwLDB4N2UsMHhmZiwweDZmLDB4ZmYsMHg4NywweGZmLAorMHhiYiwweGZmLDB4ZDUsMHhmYywweGZmLDB4N2YsMHhmYywweDZmLDB4ZmYsMHhlZiwweGU3LDB4ZmYsMHhmZiwweGZhLDB4ZjAsMHgzZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMywweGMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsCisweDAwLDB4MzAsMHgxMCwweDYwLDB4MjAsMHgwMCwweDA4LDB4MDAsMHgwMSwweDIwLDB4ODAsMHgwMCwweDEwLDB4MDAsMHgwNCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDgwLDB4NDAsMHgwMCwweDA4LDB4MjAsMHgzYywweGYwLDB4NmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZjUsMHhiZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZSwweDNmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmZiwweGZmLDB4ZjEsMHhkZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhkZiwweGZmLAorMHhmZCwweGJkLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4NWIsMHhmMCwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGYwLDB4YmYsMHhiZiwweGJmLDB4ZmYsMHhmNywweGZiLDB4ZmYsMHhmZSwweGVlLDB4ZmEsMHhmZiwweGZmLDB4ZmYsCisweDNkLDB4M2IsMHhmZiwweGZmLDB4ZmUsMHhmYiwweGYxLDB4ZmYsMHhiZiwweDdiLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHhiZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmNywweGVmLDB4ZmYsMHhmYiwweGQwLDB4ZjAsMHhkZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmOCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBiLDB4MTAsMHgwNSwweDAxLDB4MDAsMHgwOCwweDAwLDB4MDIsCisweDAxLDB4MDEsMHgwMCwweDAwLDB4MTAsMHgwMSwweGM4LDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQyLDB4MDIsMHgwMCwweDAwLAorMHgwMCwweDgwLDB4MDIsMHgwMCwweDAwLDB4NDAsMHgyNCwweDgwLDB4MDAsMHhjMSwweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNywweGZkLDB4ZjcsMHhmYSwweGVmLDB4ZWUsMHhmOSwweGZkLDB4ZmYsMHhmNywweGZlLDB4YmYsCisweDFmLDB4ZmQsMHg5ZSwweGZkLDB4ZDEsMHhlZiwweGZmLDB4ZjcsMHg3ZiwweDlmLDB4ZmYsMHhlZiwweGZmLDB4ZjYsMHhmZiwweGZlLAorMHhmZSwweDdiLDB4ZmYsMHhiZCwweGZmLDB4N2UsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhhZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmNywweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZkLDB4ZmYsMHhmZiwweGRmLDB4ZmYsCisweGZmLDB4NWYsMHhmMSwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZWYsMHhmZiwKKzB4ZjcsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4M2YsMHhmYiwweGZmLDB4ZmYsMHhlZiwweGZiLDB4ZmQsCisweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNywweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsMHhmZiwweGU3LDB4ZmYsCisweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhjZiwweGZmLDB4ZmIsMHhmZiwweGZiLDB4ZjEsCisweGZmLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDdiLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweGYxLDB4ZmYsCisweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmMCwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkZiwweDU3LDB4ZmYsMHhmZSwweGJmLDB4ZmIsMHhmMSwweGZmLDB4ZmYsCisweGZkLDB4ZjcsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhkNywweGZmLDB4ZjAsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhkYiwweGZmLDB4ZGIsMHhmZCwKKzB4ZjYsMHhmZiwweGY2LDB4ZmYsMHgzYywweGJjLDB4YmMsMHhiZiwweGRmLDB4NmYsMHhlZiwweDJmLDB4ZjEsMHgzYywweGJmLDB4YmMsCisweGJmLDB4ZGYsMHg2ZiwweGZmLDB4NmYsMHhmNywweGRiLDB4ZmYsMHhkYiwweGZkLDB4ZjYsMHhmZiwweGY2LDB4ZmYsMHhmZiwweGZmLAorMHgwMSwweGUyLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtOTYwMC5oIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtOTYwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZDFmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby95YW05NjAwLmgKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKgorICogRmlsZSB5YW0xMTEubWNzIGNvbnZlcnRlZCB0byBoIGZvcm1hdCBieSBtY3MyaAorICoKKyAqIChDKSBGNkZCQiAxOTk4CisgKgorICogVHVlIEF1ZyAyNSAyMDoyMzowMyAxOTk4CisgKgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJpdHNfOTYwMFtdPSB7CisweGZmLDB4ZjIsMHgwMCwweGE1LDB4YWQsMHhmZiwweGZlLDB4OWYsMHhmZiwweGVmLDB4ZmIsMHhjYiwweGZmLDB4ZGIsMHhmZSwweGYyLAorMHhmZiwweGY2LDB4ZmYsMHg5YywweGJmLDB4ZmQsMHhiZiwweGVmLDB4MmUsMHgzZiwweDZmLDB4ZjEsMHhmZCwweGI0LDB4ZmQsMHhiZiwKKzB4ZmYsMHg2ZiwweGZmLDB4NmYsMHhmZiwweDBiLDB4ZmYsMHhkYiwweGZmLDB4ZjIsMHhmZiwweGY2LDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGYwLDB4NmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmQsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLAorMHhmYiwweGZmLDB4ZmYsMHhmNywweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHg3ZiwweGYxLDB4ZmYsMHhmZSwweGZmLDB4YmYsMHhiZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZjAsCisweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGY3LAorMHhmZiwweGZmLDB4ZjcsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweDdlLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZGYsCisweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZWYsMHhmZiwweGYzLDB4ZmIsMHhmZSwweGZmLDB4ZjEsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmMCwweDdmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmNywweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgwZiwweGZmLDB4ZmYsCisweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNSwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsCisweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4N2YsMHhmZiwweGVmLAorMHhmZiwweGVmLDB4ZmYsMHg3ZiwweGVmLDB4ZjEsMHhmZiwweGVmLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDlmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGJkLDB4ZmYsMHhlZiwweDdmLDB4ZWYsMHg3ZiwweGZiLDB4ZGYsMHhkMywweDVhLDB4ZmUsMHhkNywweGQ2LAorMHhmNywweDdmLDB4YmQsMHhmMSwweGJiLDB4NWQsMHhkNiwweGY3LDB4ZmUsMHg5NiwweGZmLDB4YmQsMHhhZiwweGFkLDB4YmYsMHhlZiwKKzB4N2YsMHg2YiwweDdmLDB4ZmIsMHhkNiwweGZlLDB4ZjcsMHhmZiwweDEwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGJlLDB4ZWYsCisweGZmLDB4ZmYsMHhkYiwweGZmLDB4ZjYsMHhmZiwweGY2LDB4ZmYsMHhmZCwweGJmLDB4ZmQsMHhiZiwweGZmLDB4N2YsMHhmZiwweDdmLAorMHhkZiwweGRiLDB4ZjEsMHhmZCwweDM1LDB4ZmYsMHg2ZiwweGZmLDB4NmYsMHhmZiwweGRiLDB4ZmYsMHhjYiwweGZmLDB4ZjYsMHhmZiwKKzB4ZjIsMHhmZCwweGZkLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhkMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4NTUsMHhmZiwweGNjLDB4YzAsMHgzZiwweGZmLAorMHhmZiwweGYxLDB4MjQsMHhmMCwweGZmLDB4ZmYsMHhjZiwweGVmLDB4M2YsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmMsMHgzZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDU1LDB4ZmYsMHhjYywweGMwLDB4M2YsMHhmZiwweGZmLAorMHhmMSwweDAwLDB4ZjAsMHhmZiwweGZmLDB4Y2YsMHhkZiwweGZmLDB4ZmYsMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZjLDB4M2YsMHhmZiwKKzB4ZmYsMHhmZiwweDdkLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZlLDB4N2YsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGYxLAorMHhmZiwweGNmLDB4ZmYsMHhmMywweGZmLDB4OTcsMHhmZiwweGZmLDB4OGYsMHhlNywweGZmLDB4ZmYsMHhmYywweDcxLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNSwweGZmLDB4YmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGUzLDB4ZjcsMHhlZiwweGZmLDB4ZmYsMHhmYywweDdiLDB4ZmYsMHhmMSwweDNmLAorMHhmZiwweGVmLDB4ZmYsMHhjZiwweGUzLDB4ZTMsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDNmLDB4ZmYsMHhmZiwweGZmLDB4YmYsMHhmZiwKKzB4YmYsMHhmZiwweGRhLDB4ZjAsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjIsMHhjMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDEsMHgzYywweGYwLDB4YWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZkLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHg5ZiwweGZmLAorMHhmZiwweGZmLDB4ZjcsMHhmZiwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZGIsMHhmMCwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMCwweGJiLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmYiwweGRmLDB4YmYsMHhmMSwweGZlLDB4ZmQsMHhmNywweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDc3LDB4ZmQsMHhmMiwKKzB4ZjAsMHgxZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjgsMHgzOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsCisweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHg5MCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDEsMHgwMCwweDAwLDB4MDQsMHgyNCwweDAwLAorMHg0MCwweDAxLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAxLDB4YzAsMHhmMCwKKzB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHg2ZiwweGZmLDB4ZGYsMHhmZiwweGQxLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZiLDB4ZmYsMHhmYiwweGVmLDB4ZmYsMHhmZiwweGVlLDB4ZmYsMHhmZiwweDdmLDB4ZjAsMHhkZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4OGYsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZjUsMHhhZCwweGZmLDB4NjksMHgyYSwweGVkLDB4NmIsMHhmYiwweGRmLDB4M2EsCisweGRjLDB4ZjQsMHg5NiwweGVlLDB4YjMsMHgzZCwweDM1LDB4YzEsMHhiYiwweGRkLDB4ZmUsMHhmNiwweGZlLDB4ZDYsMHhiNSwweGFkLAorMHhiZiwweGE1LDB4YWQsMHg0OSwweDJmLDB4NGYsMHgyYiwweGRhLDB4NWYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDJmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGJmLDB4ZmYsMHhmZiwweGZiLDB4NWIsMHhmNywweGY2LDB4ZmYsMHhmNiwweGZmLDB4ZmQsMHhiZiwweGZkLDB4YTUsCisweGYzLDB4NmYsMHhmMywweDZlLDB4ZmEsMHg3YiwweGQxLDB4ZmQsMHhiNSwweDc3LDB4NmYsMHhlOSwweDZmLDB4ZmYsMHhkYiwweGZiLAorMHhkYiwweGRmLDB4ZjYsMHhmZiwweGY2LDB4ZmYsMHhmZCwweDNmLDB4ZmUsMHhmNywweGZmLDB4ZDAsMHg0ZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmZiwweDlmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHhjMCwweDNmLDB4OWMsMHgwMywweGZmLDB4ZmYsMHg4YiwweGE1LDB4ZmUsCisweDgwLDB4M2UsMHhjMiwweGJmLDB4YWMsMHhiMSwweDI0LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweGEzLAorMHhmZiwweGZkLDB4NmIsMHhmZiwweGZmLDB4ZjAsMHhhNSwweGZmLDB4ZmYsMHhmZiwweGYwLDB4YWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4YzAsMHgzZiwweGQ0LDB4NmIsMHhmZiwweGZmLDB4ZGIsMHhmZiwweGZlLDB4ODYsCisweGJmLDB4YzIsMHhiZiwweDMwLDB4YTEsMHgyNCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4Y2MsMHhmZiwweDBmLDB4ZmYsMHhhMywweGZmLAorMHgwNSwweDZiLDB4ZmYsMHhmZiwweGYwLDB4YTUsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwKKzB4ZmYsMHhmZiwweGZiLDB4YzcsMHhmZiwweGM0LDB4ZmYsMHhmZiwweDdmLDB4ZmYsMHhlYywweGZlLDB4N2YsMHhkZiwweGQ4LDB4YjksCisweDQ3LDB4ZmMsMHgzNiwweGMxLDB4ZGYsMHhmZiwweGZmLDB4ZjksMHhmZiwweGYzLDB4ZmYsMHhmNywweGZmLDB4ZmMsMHhmZiwweGZkLAorMHgzZiwweGZmLDB4ZmYsMHhmZiwweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjUsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4N2UsMHhiZCwweDNmLDB4ZmYsMHgyYiwweGZlLDB4MmYsMHhmNSwweGEzLDB4ZmMsCisweDViLDB4ZmUsMHg2MSwweDlmLDB4N2YsMHhlZiwweGZmLDB4ZmYsMHhhNywweGZiLDB4ZmYsMHhmZiwweGZhLDB4ZmUsMHhmZiwweDMzLAorMHhmMSwweGZmLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmYSwweGYwLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYxLDB4YzAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQwLDB4MDAsMHgzMCwweDI0LDB4MDQsCisweDAwLDB4MDEsMHgwMCwweDgwLDB4NDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMSwweDAxLDB4MDAsMHgwMiwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4M2QsMHhmMCwweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZCwweGJkLDB4ZmYsMHhmZCwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmZiwweDdmLDB4ZjYsMHhlZiwweGJmLDB4ZjcsMHhmZiwweDczLDB4ZWIsCisweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjksMHhmZiwweGZkLDB4ZmUsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGQ5LDB4ZjAsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjAsMHhiZiwweDdmLDB4ZmYsMHhmZiwKKzB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhkZSwweGZmLDB4ZmYsMHhlZiwweGRkLDB4ZGUsMHg3NywweGYyLDB4ZmIsMHhlZCwweGU3LDB4ZjEsCisweDczLDB4ZmQsMHhmZCwweGRmLDB4ZmYsMHg3ZCwweGJlLDB4ZGYsMHhmZiwweGZiLDB4ZmYsMHhlZiwweGZmLDB4ZWYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhkMCwweGYwLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY4LDB4MzAsMHgyMCwweDAyLDB4MDAsMHgyMiwKKzB4NDAsMHhjMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMiwweDQxLDB4MDIsMHgxMiwweDAwLDB4MjEsMHg4NywweDgxLDB4MDAsCisweDAwLDB4ODAsMHgwNCwweDBiLDB4MjgsMHgwMSwweGIwLDB4MDAsMHg4MiwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4YzEsMHhmMCwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmQsMHhmZiwKKzB4ZjcsMHhmZiwweGZlLDB4N2YsMHhlZCwweDc5LDB4ZmYsMHhkZSwweGViLDB4N2YsMHg3NCwweGY3LDB4ZjcsMHhlMSwweGY5LDB4ZmYsCisweGY2LDB4NWYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGQ3LDB4ZGIsMHhlZiwweGZmLDB4YmIsMHhmZiwweGZmLDB4ZmYsMHhjYywweGZmLAorMHhmZiwweGZmLDB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGYwLDB4MGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZkLDB4M2QsMHhjZCwweDQ5LDB4N2YsMHg2ZiwKKzB4MmIsMHhiYSwweDVjLDB4ZDIsMHhkYSwweGY2LDB4ZjMsMHgzZSwweGY3LDB4ZmYsMHhiZCwweGYxLDB4ZmEsMHhkZiwweGZlLDB4ZjcsCisweGNjLDB4ZjYsMHhiYiwweGE1LDB4YjMsMHhhZCwweGJmLDB4NmYsMHg3ZCwweDZmLDB4NmIsMHhkYiwweGRmLDB4YmQsMHhmZiwweGZlLAorMHhiMCwweDVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhiZiwweGZmLDB4ZmYsMHhmYiwweGRiLDB4NTcsMHhmNiwweGZlLDB4OWYsMHhkNSwKKzB4YjcsMHhmZiwweGFmLDB4ZTUsMHgzZiwweGZmLDB4ZmYsMHg2ZiwweGZmLDB4ZGIsMHhmMSwweGZkLDB4YmYsMHhmZiwweDZmLDB4NjksCisweDZjLDB4ZGYsMHhkYSwweGRmLDB4Y2IsMHhmZiwweGY2LDB4ZmYsMHg3NiwweGZkLDB4ZmQsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGQwLAorMHgzZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZCwweGJkLDB4MDgsMHgwMywweDg5LDB4NGYsMHg1YSwKKzB4MGYsMHhmMCwweGZmLDB4ZjgsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHg1YSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjMsCisweGZhLDB4YTAsMHhmMCwweGYyLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmMsMHhmZCwweDAwLDB4NmIsMHhmZiwweGZmLDB4NWEsMHgwZiwKKzB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4NWEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGIzLDB4ZjUsCisweDUwLDB4ZjAsMHhmMCwweGZmLDB4ZmYsMHhmZiwweGQ3LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg3ZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZCwweGJjLDB4ZmYsMHhlNCwweGU3LDB4NzEsMHhmZiwweGY5LDB4YzQsMHhmNCwKKzB4N2YsMHg3ZiwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZiLDB4ZjcsMHg3MywweGJmLDB4MTQsCisweGZmLDB4ZTYsMHhmZiwweGZmLDB4ZTEsMHg3ZCwweGZmLDB4ZmYsMHhlNywweGZmLDB4ZmYsMHhmZiwweGYwLDB4M2YsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4ZjUsMHhmZiwweGZmLDB4ZmUsMHhkMiwweGZhLDB4ZmYsMHhjNCwweGY0LDB4NWMsMHhiZiwweGZhLDB4ZmYsMHhmZiwKKzB4ZWMsMHg3ZSwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZWYsMHhmZiwweGZmLDB4NmIsMHhkYiwweGZmLDB4ZGYsCisweGY5LDB4ZmIsMHhiZiwweGZmLDB4ZjEsMHhmZiwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmMCwweGJmLDB4ZmYsMHhmZiwweGZmLAorMHhmZSwweGYzLDB4YzAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwOCwweDIwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAxLDB4MDAsMHgwMSwweDAwLDB4MDAsMHg4MCwweDAyLDB4MDAsMHgwMSwweDNjLDB4ZjAsMHg1ZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsMHhkZiwweGZmLDB4ZWYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNywweGZmLDB4ZmIsMHhmZiwweGZkLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZmYsMHhjMywweGYwLDB4YWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYwLAorMHhmZiwweGRmLDB4ZmYsMHhmZiwweGY3LDB4MjMsMHhmZiwweGZmLDB4ZmQsMHhmZiwweGVmLDB4ZmYsMHhmZSwweDdmLDB4N2QsMHhmNywKKzB4ZmUsMHhmZiwweDdmLDB4NzEsMHhmZiwweGZiLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHg2ZSwweGZkLDB4ZjcsMHhmZCwweGZmLDB4YmYsCisweGZmLDB4YmYsMHhmOSwweGZkLDB4ZmYsMHhkZiwweGVmLDB4ZjAsMHhmMCwweGFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmOCwweDMwLAorMHg0MCwweDAxLDB4MDAsMHg4MywweDAwLDB4MDAsMHgwMCwweDBjLDB4MDYsMHgwOCwweDA0LDB4MjYsMHgyNiwweDAwLDB4MDAsMHgwNiwKKzB4MDMsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4NzAsMHgwOCwweDgwLDB4MDAsMHgyMCwweDAxLDB4MjAsCisweDAwLDB4MDIsMHgwMCwweDMwLDB4MDAsMHgwMCwweGMxLDB4ZjAsMHg1ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4N2IsMHgzZiwweGY3LDB4ZmYsMHhkNywweGZlLDB4ZmUsMHhmYiwweGZlLDB4M2IsMHhmZSwweGJkLDB4ZmYsMHgyZiwKKzB4ZmYsMHg3MSwweGZmLDB4ZmIsMHg3ZiwweGU3LDB4ZmYsMHhmOSwweGVmLDB4ZmYsMHhkNywweGZhLDB4ZmYsMHhiNywweGJiLDB4ZmUsCisweGZmLDB4ZmYsMHg3NCwweGZmLDB4ZjcsMHhmZiwweGYwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDhmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGI1LAorMHhiZCwweDZmLDB4N2MsMHhlYiwweDdmLDB4ZmIsMHhkYiwweGQzLDB4NGIsMHhlZSwweGQ2LDB4ZjYsMHhiNywweGZkLDB4YWMsMHhhMSwKKzB4ZmIsMHhkZiwweGZlLDB4ZjcsMHhmNCwweDk2LDB4YmQsMHhiNCwweGM1LDB4YTUsMHhhZiwweDZmLDB4NjksMHg0ZiwweDdmLDB4YmEsCisweGRiLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgzZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGZmLAorMHhmNiwweGZmLDB4ZjYsMHhmZiwweGJkLDB4YmYsMHhhNSwweGJmLDB4ZmYsMHg3ZCwweDdmLDB4ZWYsMHhmZiwweGZiLDB4ZjEsMHhmZCwKKzB4YmYsMHhmZiwweDZmLDB4ZmYsMHg2YiwweDdhLDB4ZGIsMHhmZiwweGRiLDB4ZGYsMHhmNiwweGZlLDB4YjYsMHhmZCwweGZkLDB4YmYsCisweGZlLDB4ZjcsMHhmZiwweGQwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjQsMHgyZiwweGZmLAorMHhmYywweDQzLDB4NmIsMHhmZiwweGZmLDB4ZmYsMHgwZCwweGZmLDB4ZmMsMHgzMywweDNmLDB4ZjAsMHg1ZiwweGYxLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGY5LDB4ZGUsMHhmMCwweDRjLDB4ZmUsMHg3NywweGFmLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHhmMCwweGZmLDB4ZGIsCisweGZmLDB4NWYsMHhmMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZlLDB4ZjcsMHhmZiwweGYwLDB4MmYsMHhmZiwweGZkLAorMHg0MywweDdmLDB4ZmYsMHhmZiwweGYxLDB4MGYsMHhmZiwweGZjLDB4MzMsMHgzZiwweGZmLDB4YWYsMHhmMSwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmNiwweGQ3LDB4ZmYsMHhiYywweGZkLDB4YmQsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZjAsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmYywweGZmLDB4ZmYsMHhmYiwweGYxLAorMHhiZiwweGZmLDB4ZjksMHhmZCwweGNmLDB4ZjIsMHg3MCwweGZmLDB4MWYsMHg5ZiwweGYzLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmMsMHhmNywweGZmLDB4MTMsMHg5ZiwweGZjLDB4ZmYsMHhmZiwweDg0LDB4ZjcsMHhmZiwweGZmLDB4NDcsMHhmZiwweGZmLDB4ZmYsCisweGYwLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY1LDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmYywweGZmLDB4ZmUsMHhmZSwweDc5LAorMHgzZiwweGZmLDB4MWQsMHg0NiwweGNmLDB4ZmYsMHhjZiwweGZjLDB4N2IsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlZCwKKzB4ZjMsMHhhYiwweGZmLDB4Y2IsMHhmZiwweGY4LDB4ZmYsMHhmYywweGY1LDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZhLDB4ZjAsCisweDhmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMywweGMyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLAorMHgwMCwweDAwLDB4MjAsMHgwMCwweDIwLDB4MDAsMHgwMCwweDA0LDB4MDgsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyMCwKKzB4MGMsMHgwMCwweDAwLDB4MDQsMHgwMSwweDAwLDB4MDEsMHgwMCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDEsMHgzYywweGYwLDB4N2YsCisweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmQsMHhiZiwweGZmLDB4ZmYsMHhmZCwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLAorMHhkZiwweGZmLDB4ZmYsMHhmNywweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlYiwKKzB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmYiwweGY3LDB4N2YsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGJmLDB4ZGIsMHhmMCwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmNywweGZmLAorMHhiZiwweGJmLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHgzZSwweGYxLDB4N2YsMHhmZiwweGZmLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZmYsMHhmZCwweGZmLDB4YmYsMHhiZCwweGZlLDB4ZmYsMHhmYiwweGY3LDB4ZGYsMHhmYiwweGQwLDB4ZjAsMHg5ZiwweGZmLDB4ZmYsCisweGZmLDB4ZmUsMHhmOCwweDMwLDB4MjAsMHgwMCwweDQwLDB4MDEsMHg4MCwweGMwLDB4MzAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDEwLAorMHg1MCwweDg4LDB4MjAsMHgwMCwweDAwLDB4MTMsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAxLDB4ODAsMHgwOCwweDAwLDB4MDAsMHhhMCwweDAwLDB4MTAsMHhjMSwweGYwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsCisweGZlLDB4ZmQsMHhlZiwweDdmLDB4ZmYsMHhmZiwweGJmLDB4ZmYsMHhmNywweGZmLDB4ZWYsMHhmYiwweGZkLDB4NzcsMHhlZiwweGJmLAorMHhmNywweDdmLDB4ZmYsMHhmZiwweGJmLDB4ZDEsMHg3ZiwweGZmLDB4ZmYsMHhmNywweGZmLDB4ZmYsMHhmZiwweGZmLDB4YWYsMHhmZiwKKzB4ZGYsMHhmNywweGZiLDB4ZmYsMHhmZCwweGZmLDB4ZmMsMHhmZiwweGZkLDB4ZmYsMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg1ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGUwLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGRkLDB4ZmYsCisweGZmLDB4ZmYsMHhhNSwweGZkLDB4NmYsMHg3ZCwweDZkLDB4N2YsMHg1MiwweGRmLDB4NWEsMHg0YiwweGVlLDB4YjYsMHhlZSwweGYyLAorMHhiYiwweGFjLDB4YTEsMHg1YiwweDRkLDB4ZDYsMHhmNywweGZlLDB4YjIsMHhiZCwweDM1LDB4YjUsMHhiNSwweGRkLDB4NmYsMHg3ZiwKKzB4ZTksMHg1ZiwweDUyLDB4ZGYsMHhiZCwweGZmLDB4ZmYsMHhmMCwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhiZiwweGZmLDB4ZmYsCisweGZmLDB4ZGIsMHhmZSwweGY2LDB4ZmYsMHhmNiwweGZmLDB4ZmQsMHhiZiwweGZkLDB4YjUsMHhiZiwweGY5LDB4N2YsMHg2ZiwweGZmLAorMHhkYiwweGYxLDB4ZmQsMHhiZiwweGZmLDB4NmYsMHhmZiwweDY5LDB4N2YsMHhkYiwweGZmLDB4ZDMsMHhmZiwweGY2LDB4ZmUsMHhmMiwKKzB4ZmYsMHhhZCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZDAsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZjUsCisweDMwLDB4MGYsMHhmZiwweGZmLDB4ZmQsMHg2YiwweGNhLDB4ZmYsMHhmMCwweDBmLDB4ZDYsMHhiZiwweGNmLDB4M2YsMHhmZiwweGZmLAorMHhmMSwweGZmLDB4ZmYsMHhmZiwweGNhLDB4ZmUsMHhiZiwweGZmLDB4ZjAsMHgwNSwweGFmLDB4MGYsMHhmZiwweGZjLDB4ZjAsMHhjZiwKKzB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGY1LDB4MzAsCisweDBmLDB4ZmYsMHhmZiwweGZjLDB4M2YsMHhjYSwweGZmLDB4MGYsMHgwZiwweGQ2LDB4YmYsMHhmZiwweGZmLDB4ZjUsMHg1ZiwweGYxLAorMHhmZiwweDhiLDB4ZmYsMHhjMywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHhmYywweGYwLDB4Y2YsMHhmMCwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGNmLDB4ZmYsCisweGZmLDB4YmYsMHg5ZiwweDNmLDB4ZmUsMHhmYywweGZmLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhmMSwweGZmLAorMHhkZiwweGZlLDB4N2UsMHgzZiwweDlmLDB4ZjQsMHhmYywweDdmLDB4ZmMsMHhmZiwweGZmLDB4M2YsMHhmZiwweDNmLDB4ZmUsMHgzZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjUsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGZlLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGJmLDB4ZmIsMHhmZiwweGY4LDB4ZWQsMHhmZiwweDhmLDB4ZmYsMHhiYiwweGZmLDB4YjEsMHhmMywweGVmLAorMHg4ZiwweGY3LDB4ZmYsMHhmZiwweGRiLDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhiZiwweGZkLDB4NzksMHhiZiwweGJmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmYiwweGYwLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYzLDB4YzAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDA0LDB4MDgsMHgwOCwweDAxLDB4MDEsMHgwMCwweDkwLAorMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMSwKKzB4M2MsMHhmMCwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4OWYsMHhmZiwweGFmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhiZiwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZWQsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhjMywKKzB4ZjAsMHgzZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjAsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGJiLDB4ZmYsCisweGZmLDB4ZmYsMHg3ZiwweGY2LDB4ZmYsMHg3ZiwweGZiLDB4ZmQsMHhlZCwweGZmLDB4ZjEsMHhmZiwweGZlLDB4N2YsMHhmZiwweGZmLAorMHhmZiwweDVmLDB4ZmYsMHhmNywweGZmLDB4N2UsMHhmZiwweGZkLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZjAsMHhmMCwKKzB4OGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY4LDB4MzAsMHg4MCwweDAwLDB4MDQsMHgwMCwweDAwLDB4NDAsMHgwMiwweDAwLDB4MDMsCisweDAwLDB4MDUsMHgwNCwweDIwLDB4MDAsMHgwMCwweDAxLDB4ZDAsMHgwMCwweDgxLDB4MDAsMHgyMCwweDA0LDB4MDQsMHgwMCwweDAwLAorMHg4MSwweDA0LDB4MDgsMHg4MCwweDEwLDB4MDAsMHhjMCwweDAwLDB4MDAsMHgwMCwweDIwLDB4MDAsMHgwOCwweGMxLDB4ZjAsMHg2ZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYzLDB4ZmQsMHhmZiwweGVkLDB4ZmMsCisweGZmLDB4ZmYsMHg5ZiwweGZiLDB4ZmQsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHg3ZiwweGZiLDB4M2UsMHhmZiwweDlmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZkLDB4ZjksMHhmZiwweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZmYsMHhmZiwweGYwLDB4NmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGNmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZkLDB4YmQsMHhmZiwweGVmLDB4N2MsMHhlYiwweDdmLDB4ZmIsMHhkYiwweGZhLDB4ZGMsCisweGVlLDB4ZjcsMHhmNiwweGQ3LDB4ZjUsMHgyZCwweGExLDB4YmIsMHhkZCwweGVlLDB4ZjcsMHg1NCwweGY3LDB4ZmIsMHgyYywweGI1LAorMHhiNCwweGJkLDB4NmIsMHg2ZiwweGVmLDB4NmYsMHhiYiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgxZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmNiwweGZmLDB4ZjYsMHhmZiwweGZkLDB4YmYsMHhmZiwweGJmLDB4ZWYsCisweDZmLDB4ZmYsMHg2ZiwweGZhLDB4ZGIsMHhmMSwweGM1LDB4YmQsMHhmNSwweDZmLDB4ZmYsMHg2ZiwweGNhLDB4ZGIsMHhmZiwweGRiLAorMHhmYiwweGY2LDB4OTcsMHhmNiwweGZmLDB4ZmQsMHhiZiwweGZlLDB4ZjcsMHhmZiwweGQwLDB4OWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDhiLDB4N2YsMHhmZiwweGZmLDB4ZTcsMHg2MywweGZmLDB4ZmYsCisweGZmLDB4ZmMsMHg3NywweGRmLDB4ZjEsMHhkYiwweGZmLDB4ZDYsMHhhOCwweDNmLDB4ZmYsMHhmZiwweDA4LDB4MmYsMHhmMCwweGZmLAorMHhjMywweGZmLDB4ZWIsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4NWYsMHhmMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg4YiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZjLDB4ZmYsMHhjZiwweGYxLDB4ZGIsMHhmZiwweGQ2LDB4YTgsMHgzZiwweGZmLDB4ZmYsMHgwOCwweDJmLDB4ZjAsMHhmZiwweGMzLAorMHhmZiwweGViLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg1ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjUsMHhiZiwweGZmLDB4Y2EsMHhmZiwweDlmLDB4ZmYsMHhmYSwweGI5LDB4ZTcsCisweDlmLDB4ZjMsMHg4MSwweGZmLDB4ZmYsMHhmYywweDczLDB4ZDcsMHhmZiwweGZmLDB4NzcsMHhmZiwweGZkLDB4ZmYsMHhmYywweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4MWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY1LDB4ZmYsMHhmZiwKKzB4ZmYsMHhmNywweGRlLDB4ZmYsMHhmZSwweDdlLDB4ZmYsMHhiZiwweGZmLDB4YmYsMHhmMSwweGIzLDB4ZmYsMHhmZiwweGUzLDB4ZmIsCisweGZmLDB4ZTEsMHgxZiwweDdmLDB4ZmYsMHhmOCwweDc4LDB4ZmYsMHhmYiwweDFlLDB4ZmYsMHhmNywweGZlLDB4ZTcsMHhmZiwweGZmLAorMHhmZiwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmEsMHhmMCwweDRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMywweGMwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsCisweDAxLDB4ODAsMHg0MCwweDQwLDB4MjAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLAorMHg4MCwweDAwLDB4MDAsMHgwMSwweDNjLDB4ZjAsMHhhZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmQsMHhiZiwweGZmLDB4ZmIsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGY3LDB4ZjEsCisweGZkLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhkYiwweGYwLDB4OGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYwLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHg3ZiwKKzB4ZmYsMHhmZiwweGZmLDB4YmUsMHhkNywweGZmLDB4ZWQsMHhiZCwweDdlLDB4YmYsMHhmZSwweGY2LDB4N2YsMHhiZiwweDcxLDB4ZmYsCisweGZmLDB4ZGEsMHhmZiwweGY5LDB4ZmYsMHhiZiwweDdmLDB4ZmUsMHhmZiwweDZmLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHg3ZiwweGZmLDB4ZDAsMHhmMCwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmOCwweDMwLDB4NDIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4ODAsMHhjMSwweDAwLDB4MDAsMHg5MCwweDAwLDB4YzQsMHgwMCwweDAwLDB4MTIsMHgyMCwweDQzLDB4MjIsMHg4MSwweDg0LDB4MDAsCisweDAwLDB4MTQsMHgwMCwweDAxLDB4MDAsMHgwOCwweDgwLDB4MDAsMHgwMiwweDAwLDB4MDIsMHgwMCwweDA0LDB4MDIsMHgwMCwweDAwLAorMHgxMCwweGMxLDB4ZjAsMHgxZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGRkLDB4ZmUsMHhmZiwKKzB4YjYsMHg3NiwweGU1LDB4YmMsMHhmOSwweGY3LDB4YWYsMHg1ZiwweGJmLDB4ZmMsMHhkZiwweGNmLDB4ZjEsMHhmZiwweGVmLDB4NzksCisweGZmLDB4YmQsMHhmZiwweGVmLDB4ZmYsMHhmZiwweGY3LDB4NmYsMHg1ZiwweGZmLDB4ZmYsMHhmZCwweGVmLDB4ZWYsMHhiZiwweGZmLAorMHhmZiwweGYwLDB4OWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhkYiwweGZmLDB4ZmYsMHhmZCwweDJkLDB4ZmYsMHg2OSwweDJhLDB4ZWYsMHg3NywKKzB4YmIsMHhkZCwweDVhLDB4ZGYsMHhmNiwweGY2LDB4ZDYsMHhmNywweDdkLDB4YmQsMHhkMSwweGIyLDB4NGEsMHhkNiwweGIyLDB4YmUsCisweDk3LDB4ZjUsMHhiZCwweGIzLDB4YWQsMHhmZiwweGVmLDB4N2YsMHg2OSwweDZiLDB4ZmIsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGYwLAorMHgyZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGZmLDB4ZjYsMHhmZSwweDlmLDB4ZDQsMHhiZiwKKzB4ZWQsMHhhZiwweGZmLDB4NmIsMHg2ZiwweGY3LDB4ZmYsMHhkZCwweGRiLDB4MzEsMHhmZCwweGJmLDB4ZmYsMHg2ZiwweDdmLDB4ZmYsCisweGZmLDB4ZGIsMHhmZiwweGNiLDB4ZGYsMHhmNiwweGZmLDB4ZjYsMHhmZiwweGZkLDB4YmYsMHhmZSwweGY3LDB4ZmYsMHhkMCwweDhmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZkLDB4MWYsMHhmZiwweDQ2LDB4MmYsMHg5ZiwweGZmLDB4ZmYsMHhmZiwKKzB4YTUsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGI3LDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhlOSwweDZhLDB4YmYsCisweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZmYsMHhmZCwweDU1LDB4NTcsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGFmLDB4ZjAsMHg0ZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhmZSwweGRmLDB4ZmYsMHhmZCwweDFmLDB4ZmYsMHg0NiwweDJmLDB4OWYsMHhmZiwweGZmLDB4ZmYsMHhhNSwKKzB4ZmYsMHhmZiwweGZmLDB4YzAsMHgzNywweGZmLDB4ZmYsMHhmMSwweDk5LDB4OGUsMHhkYywweDdmLDB4ZTksMHg2YSwweGJmLDB4ZmYsCisweGYwLDB4MGYsMHhmZiwweGZmLDB4ZmQsMHg1NSwweDU3LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4MGYsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwNywweGZmLDB4YzAsMHhiZSwweGZmLDB4ZmYsMHhjZiwweGVmLDB4OWYsMHhmZiwKKzB4ZmYsMHhmYiwweGZmLDB4ZTcsMHhmZiwweGZmLDB4YTEsMHhlMywweGNlLDB4M2MsMHg1OCwweDNmLDB4ZjMsMHhmZiwweGZkLDB4ZWYsCisweGY5LDB4ZmYsMHhmZiwweGY3LDB4ZjEsMHg3ZiwweGZmLDB4Y2IsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDJmLDB4ZmYsMHhmZiwweGZmLAorMHhmZSwweGY1LDB4N2YsMHhmZiwweGYwLDB4ZmYsMHhmZSwweGZmLDB4YzQsMHg3NSwweGU3LDB4YjksMHhmZiwweGZmLDB4ZmYsMHhlZiwKKzB4ZmYsMHhjNywweDM3LDB4M2IsMHhmZiwweGYwLDB4MTMsMHg5ZSwweDBmLDB4ZjQsMHhmZiwweGZlLDB4ZmIsMHhmZiwweGZmLDB4ZjksCisweGZjLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZhLDB4ZjAsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmMywweGMwLDB4MDEsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAyLDB4MjIsMHgwMCwweDAwLDB4YzAsMHg0MCwweDAwLDB4NDAsMHgwMCwKKzB4MDQsMHgwOCwweDA0LDB4MGEsMHgwMSwweDAxLDB4MTAsMHgyMCwweDIwLDB4MDAsMHgwMCwweDA0LDB4MDgsMHgwOCwweDA0LDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDEsMHgzYywweGYwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZkLAorMHgzZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsMHg3ZiwweGZmLDB4N2YsMHhmZiwweGNmLDB4OWQsMHhmZiwKKzB4ZmYsMHhmNywweGZkLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhlZSwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGIsMHhmMCwweDZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMCwweGZmLAorMHhmZiwweGZmLDB4ZjcsMHhmNywweGZmLDB4ZmYsMHhmZSwweGJmLDB4ZjcsMHhmZiwweGZmLDB4NWIsMHhmZiwweGJmLDB4ZjcsMHhmZiwKKzB4ZmQsMHg3ZiwweDcxLDB4ZmQsMHhmZiwweGVkLDB4ZjcsMHhmZSwweGVmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhlZiwweGZmLDB4N2YsMHhmZiwweGQwLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjgsMHgzMCwweDExLAorMHgwMCwweDQ4LDB4NjAsMHg0MCwweDgyLDB4NjAsMHgyNCwweDYwLDB4MDAsMHhjYywweDAwLDB4ODAsMHgwNCwweDAxLDB4MDAsMHgwMCwKKzB4MTQsMHgwMSwweDBjLDB4MDQsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwOCwweDAwLDB4MDEsMHgwMCwweGMyLDB4MDAsCisweDAwLDB4MDIsMHgwMCwweDgwLDB4MDAsMHhjMSwweGYwLDB4NWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmNywweDdiLDB4ZmYsMHhmMywweGViLDB4YmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLDB4ZTcsMHg1ZCwweDNmLDB4ZmYsMHhmNiwKKzB4ZDEsMHhmZCwweGZmLDB4ZWIsMHhmNywweDNkLDB4ZmYsMHhmZiwweGZmLDB4NWYsMHhmZiwweDdmLDB4N2YsMHhmMywweGZmLDB4ZmYsCisweGVmLDB4ZmQsMHhiZiwweGZmLDB4ZmYsMHhmMCwweDVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZjUsMHhiNSwweGRmLAorMHg2ZiwweDdkLDB4NjksMHg3ZiwweGZiLDB4ZGYsMHg1MiwweDVmLDB4ZjYsMHhmNywweGZlLDB4ZjYsMHhmMywweGJkLDB4YjEsMHhkYSwKKzB4Y2QsMHhmZSwweGY2LDB4ZWUsMHhkMiwweGJkLDB4YTUsMHhhZiwweGJkLDB4ZmYsMHg2ZiwweDdjLDB4ZWIsMHgyYiwweGZhLDB4ZGEsCisweGZmLDB4ZmUsMHhkZiwweGYwLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZGIsMHhmZiwweGY2LAorMHhmZiwweGY2LDB4ZmYsMHhiZCwweGJmLDB4Y2QsMHhiZiwweGViLDB4NmYsMHhmNywweDZmLDB4ZGYsMHhkYiwweDUxLDB4ZmQsMHhiZCwKKzB4ZmYsMHg2ZiwweGZmLDB4NmYsMHhmYiwweDViLDB4ZmYsMHhkYiwweGZmLDB4ZjYsMHhmZSwweGY2LDB4ZmQsMHhmZCwweGJmLDB4ZmUsCisweGY3LDB4ZmYsMHhkMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmYSwweDUwLDB4ZmYsMHhmZiwweGZmLAorMHhmMCwweDZmLDB4ZmYsMHhmZiwweGYwLDB4OTYsMHhmZiwweGZmLDB4YzYsMHgyYiwweGZmLDB4ZmYsMHhmMSwweGZjLDB4ZmYsMHhmZiwKKzB4ZjcsMHhkYiwweGMzLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhjMSwweDRmLDB4YzMsMHhmZiwweGZmLDB4ZmYsCisweGFmLDB4ZjAsMHg5ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZjUsMHhhMCwweGZmLDB4ZmYsMHhmZiwweGYwLAorMHg2ZiwweGZmLDB4ZmYsMHhmMCwweDk2LDB4ZmYsMHhmZiwweGM2LDB4MmIsMHhmZiwweGZmLDB4ZjEsMHg1YSwweGZmLDB4ZmYsMHhmZiwKKzB4ZjMsMHhjMywweGZmLDB4MDAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YzEsMHg0ZiwweGMzLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGYwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmMsMHhmZiwweGZmLDB4OWYsMHhmMCwweDdmLAorMHhmZiwweGY5LDB4ZmMsMHg0ZiwweGYzLDB4ZmYsMHgyNywweGViLDB4ZmYsMHhmYywweDgxLDB4ZmMsMHg3ZiwweGZlLDB4N2IsMHhmZiwKKzB4ZjcsMHhmZiwweDEyLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDE4LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsCisweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNSwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmUsMHhmZiwweGZjLDB4N2UsMHg3ZiwweGJmLAorMHhmZiwweGZmLDB4YWYsMHhlZiwweGZmLDB4ZGYsMHhkZiwweGZiLDB4ZmYsMHhmMSwweGMzLDB4ZmUsMHg2ZiwweGYxLDB4Y2YsMHgzZiwKKzB4ZmIsMHhmZiwweGZmLDB4Y2YsMHhmZSwweGZmLDB4ZmYsMHhmZSwweDdmLDB4YmYsMHhmZiwweGZmLDB4YmYsMHhmYSwweGYwLDB4ZGYsCisweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjMsMHhjMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLAorMHgyMCwweDAwLDB4MDEsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4ODAsMHgwMCwweDAyLDB4ODAsMHgwMCwweDAyLDB4M2MsMHhmMCwweDJmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGZkLDB4YmYsMHhmZiwweGZiLDB4ZmQsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNSwweGYxLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZjAsMHgyZiwweGZmLDB4ZmYsCisweGZmLDB4ZmUsMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhiZiwweGZiLAorMHhmZiwweGZmLDB4ZmYsMHhkZiwweGY3LDB4ZmYsMHhmMSwweGY3LDB4YmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZGUsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGVkLDB4ZjcsMHhmZiwweGZmLDB4N2YsMHhkMCwweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmYsCisweGZlLDB4ZjgsMHgzMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGUwLDB4MDAsMHgwMCwweDgwLAorMHgyMCwweDAxLDB4MDEsMHg5MiwweDAwLDB4MDEsMHgwMSwweDAwLDB4ZTAsMHgxYywweDYwLDB4MjAsMHgzMCwweDA4LDB4MDgsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4YzEsMHhmMCwweDZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGZlLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmYywweDdmLDB4ZmIsMHhiZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZjYsMHhmZiwweGY3LDB4N2UsMHgzZiwweGZmLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmNywKKzB4ZmYsMHhmZiwweGZmLDB4ZWQsMHhmZiwweGRmLDB4ZmYsMHhiNywweGZmLDB4ZjAsMHgzZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YmYsMHhmZiwweGRmLAorMHg1NywweGVmLDB4ZjEsMHhmZCwweGZlLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmIsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhkZiwweGZmLAorMHhmZiwweGYxLDB4ZmQsMHhmZiwweDdmLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg5ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjcsMHhmZCwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4NmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLAorMHhmZiwweGZmLDB4ZmQsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmIsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmYiwweDZmLDB4ZmYsMHhmZSwweGJmLDB4ZmYsMHhmMSwweGZmLAorMHhmNywweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZCwKKzB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZiLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHg1NywweGZmLDB4ZmQsMHhiZiwweGZmLDB4ZjEsMHhmZiwweGVmLAorMHhmZSwweGZmLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwKKzB4ZGUsMHhmZiwweGYwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZGIsMHhmZiwweGRiLDB4ZmQsCisweGY2LDB4ZmYsMHhmNiwweGZmLDB4M2MsMHhiYywweGJjLDB4YmYsMHhkZiwweDZmLDB4ZTcsMHgyZiwweGYxLDB4M2MsMHhiZiwweGZkLAorMHhiZiwweGRmLDB4NmYsMHhmZiwweDZmLDB4ZjcsMHhkYiwweGZmLDB4ZGIsMHhmZCwweGY2LDB4ZmYsMHhmNiwweGZmLDB4ZmYsMHhmZiwKKzB4MDIsMHgwMSwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYgfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3o4NTMwLmggYi9kcml2ZXJzL25ldC9oYW1yYWRpby96ODUzMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZWY1NDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby96ODUzMC5oCkBAIC0wLDAgKzEsMjQ1IEBACisKKy8qIDg1MzAgU2VyaWFsIENvbW11bmljYXRpb25zIENvbnRyb2xsZXIgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJRkxBRwkweDdlCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJUjAJMAkJLyogUmVnaXN0ZXIgc2VsZWN0cyAqLworI2RlZmluZQlSMQkxCisjZGVmaW5lCVIyCTIKKyNkZWZpbmUJUjMJMworI2RlZmluZQlSNAk0CisjZGVmaW5lCVI1CTUKKyNkZWZpbmUJUjYJNgorI2RlZmluZQlSNwk3CisjZGVmaW5lCVI4CTgKKyNkZWZpbmUJUjkJOQorI2RlZmluZQlSMTAJMTAKKyNkZWZpbmUJUjExCTExCisjZGVmaW5lCVIxMgkxMgorI2RlZmluZQlSMTMJMTMKKyNkZWZpbmUJUjE0CTE0CisjZGVmaW5lCVIxNQkxNQorCisjZGVmaW5lCU5VTExDT0RFCTAJLyogTnVsbCBDb2RlICovCisjZGVmaW5lCVBPSU5UX0hJR0gJMHg4CS8qIFNlbGVjdCB1cHBlciBoYWxmIG9mIHJlZ2lzdGVycyAqLworI2RlZmluZQlSRVNfRVhUX0lOVAkweDEwCS8qIFJlc2V0IEV4dC4gU3RhdHVzIEludGVycnVwdHMgKi8KKyNkZWZpbmUJU0VORF9BQk9SVAkweDE4CS8qIEhETEMgQWJvcnQgKi8KKyNkZWZpbmUJUkVTX1J4SU5UX0ZDCTB4MjAJLyogUmVzZXQgUnhJTlQgb24gRmlyc3QgQ2hhcmFjdGVyICovCisjZGVmaW5lCVJFU19UeF9QCTB4MjgJLyogUmVzZXQgVHhJTlQgUGVuZGluZyAqLworI2RlZmluZQlFUlJfUkVTCQkweDMwCS8qIEVycm9yIFJlc2V0ICovCisjZGVmaW5lCVJFU19IX0lVUwkweDM4CS8qIFJlc2V0IGhpZ2hlc3QgSVVTICovCisKKyNkZWZpbmUJUkVTX1J4X0NSQwkweDQwCS8qIFJlc2V0IFJ4IENSQyBDaGVja2VyICovCisjZGVmaW5lCVJFU19UeF9DUkMJMHg4MAkvKiBSZXNldCBUeCBDUkMgQ2hlY2tlciAqLworI2RlZmluZQlSRVNfRU9NX0wJMHhDMAkvKiBSZXNldCBFT00gbGF0Y2ggKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMSAqLworCisjZGVmaW5lCUVYVF9JTlRfRU5BQgkweDEJLyogRXh0IEludCBFbmFibGUgKi8KKyNkZWZpbmUJVHhJTlRfRU5BQgkweDIJLyogVHggSW50IEVuYWJsZSAqLworI2RlZmluZQlQQVJfU1BFQwkweDQJLyogUGFyaXR5IGlzIHNwZWNpYWwgY29uZGl0aW9uICovCisKKyNkZWZpbmUJUnhJTlRfRElTQUIJMAkvKiBSeCBJbnQgRGlzYWJsZSAqLworI2RlZmluZQlSeElOVF9GQ0VSUgkweDgJLyogUnggSW50IG9uIEZpcnN0IENoYXJhY3RlciBPbmx5IG9yIEVycm9yICovCisjZGVmaW5lCUlOVF9BTExfUngJMHgxMAkvKiBJbnQgb24gYWxsIFJ4IENoYXJhY3RlcnMgb3IgZXJyb3IgKi8KKyNkZWZpbmUJSU5UX0VSUl9SeAkweDE4CS8qIEludCBvbiBlcnJvciBvbmx5ICovCisKKyNkZWZpbmUJV1RfUkRZX1JUCTB4MjAJLyogV2FpdC9SZWFkeSBvbiBSL1QgKi8KKyNkZWZpbmUJV1RfRk5fUkRZRk4JMHg0MAkvKiBXYWl0L0ZOL1JlYWR5IEZOICovCisjZGVmaW5lCVdUX1JEWV9FTkFCCTB4ODAJLyogV2FpdC9SZWFkeSBFbmFibGUgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgIzIgKEludGVycnVwdCBWZWN0b3IpICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDMgKi8KKworI2RlZmluZQlSeEVOQUJMRQkweDEJLyogUnggRW5hYmxlICovCisjZGVmaW5lCVNZTkNfTF9JTkgJMHgyCS8qIFN5bmMgQ2hhcmFjdGVyIExvYWQgSW5oaWJpdCAqLworI2RlZmluZQlBRERfU00JCTB4NAkvKiBBZGRyZXNzIFNlYXJjaCBNb2RlIChTRExDKSAqLworI2RlZmluZQlSeENSQ19FTkFCCTB4OAkvKiBSeCBDUkMgRW5hYmxlICovCisjZGVmaW5lCUVOVF9ITQkJMHgxMAkvKiBFbnRlciBIdW50IE1vZGUgKi8KKyNkZWZpbmUJQVVUT19FTkFCCTB4MjAJLyogQXV0byBFbmFibGVzICovCisjZGVmaW5lCVJ4NQkJMHgwCS8qIFJ4IDUgQml0cy9DaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUng3CQkweDQwCS8qIFJ4IDcgQml0cy9DaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUng2CQkweDgwCS8qIFJ4IDYgQml0cy9DaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUng4CQkweGMwCS8qIFJ4IDggQml0cy9DaGFyYWN0ZXIgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgNCAqLworCisjZGVmaW5lCVBBUl9FTkEJCTB4MQkvKiBQYXJpdHkgRW5hYmxlICovCisjZGVmaW5lCVBBUl9FVkVOCTB4MgkvKiBQYXJpdHkgRXZlbi9PZGQqICovCisKKyNkZWZpbmUJU1lOQ19FTkFCCTAJLyogU3luYyBNb2RlcyBFbmFibGUgKi8KKyNkZWZpbmUJU0IxCQkweDQJLyogMSBzdG9wIGJpdC9jaGFyICovCisjZGVmaW5lCVNCMTUJCTB4OAkvKiAxLjUgc3RvcCBiaXRzL2NoYXIgKi8KKyNkZWZpbmUJU0IyCQkweGMJLyogMiBzdG9wIGJpdHMvY2hhciAqLworCisjZGVmaW5lCU1PTlNZTkMJCTAJLyogOCBCaXQgU3luYyBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUJQklTWU5DCQkweDEwCS8qIDE2IGJpdCBzeW5jIGNoYXJhY3RlciAqLworI2RlZmluZQlTRExDCQkweDIwCS8qIFNETEMgTW9kZSAoMDExMTExMTAgU3luYyBGbGFnKSAqLworI2RlZmluZQlFWFRTWU5DCQkweDMwCS8qIEV4dGVybmFsIFN5bmMgTW9kZSAqLworCisjZGVmaW5lCVgxQ0xLCQkweDAJLyogeDEgY2xvY2sgbW9kZSAqLworI2RlZmluZQlYMTZDTEsJCTB4NDAJLyogeDE2IGNsb2NrIG1vZGUgKi8KKyNkZWZpbmUJWDMyQ0xLCQkweDgwCS8qIHgzMiBjbG9jayBtb2RlICovCisjZGVmaW5lCVg2NENMSwkJMHhDMAkvKiB4NjQgY2xvY2sgbW9kZSAqLworCisvKiBXcml0ZSBSZWdpc3RlciA1ICovCisKKyNkZWZpbmUJVHhDUkNfRU5BQgkweDEJLyogVHggQ1JDIEVuYWJsZSAqLworI2RlZmluZQlSVFMJCTB4MgkvKiBSVFMgKi8KKyNkZWZpbmUJU0RMQ19DUkMJMHg0CS8qIFNETEMvQ1JDLTE2ICovCisjZGVmaW5lCVR4RU5BQgkJMHg4CS8qIFR4IEVuYWJsZSAqLworI2RlZmluZQlTTkRfQlJLCQkweDEwCS8qIFNlbmQgQnJlYWsgKi8KKyNkZWZpbmUJVHg1CQkweDAJLyogVHggNSBiaXRzIChvciBsZXNzKS9jaGFyYWN0ZXIgKi8KKyNkZWZpbmUJVHg3CQkweDIwCS8qIFR4IDcgYml0cy9jaGFyYWN0ZXIgKi8KKyNkZWZpbmUJVHg2CQkweDQwCS8qIFR4IDYgYml0cy9jaGFyYWN0ZXIgKi8KKyNkZWZpbmUJVHg4CQkweDYwCS8qIFR4IDggYml0cy9jaGFyYWN0ZXIgKi8KKyNkZWZpbmUJRFRSCQkweDgwCS8qIERUUiAqLworCisvKiBXcml0ZSBSZWdpc3RlciA2IChTeW5jIGJpdHMgMC03L1NETEMgQWRkcmVzcyBGaWVsZCkgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgNyAoU3luYyBiaXRzIDgtMTUvU0RMQyAwMTExMTExMCkgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgOCAodHJhbnNtaXQgYnVmZmVyKSAqLworCisvKiBXcml0ZSBSZWdpc3RlciA5IChNYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wpICovCisjZGVmaW5lCVZJUwkxCS8qIFZlY3RvciBJbmNsdWRlcyBTdGF0dXMgKi8KKyNkZWZpbmUJTlYJMgkvKiBObyBWZWN0b3IgKi8KKyNkZWZpbmUJRExDCTQJLyogRGlzYWJsZSBMb3dlciBDaGFpbiAqLworI2RlZmluZQlNSUUJOAkvKiBNYXN0ZXIgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZQlTVEFUSEkJMHgxMAkvKiBTdGF0dXMgaGlnaCAqLworI2RlZmluZQlOT1JFU0VUCTAJLyogTm8gcmVzZXQgb24gd3JpdGUgdG8gUjkgKi8KKyNkZWZpbmUJQ0hSQgkweDQwCS8qIFJlc2V0IGNoYW5uZWwgQiAqLworI2RlZmluZQlDSFJBCTB4ODAJLyogUmVzZXQgY2hhbm5lbCBBICovCisjZGVmaW5lCUZIV1JFUwkweGMwCS8qIEZvcmNlIGhhcmR3YXJlIHJlc2V0ICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDEwIChtaXNjIGNvbnRyb2wgYml0cykgKi8KKyNkZWZpbmUJQklUNgkxCS8qIDYgYml0LzhiaXQgc3luYyAqLworI2RlZmluZQlMT09QTU9ERSAyCS8qIFNETEMgTG9vcCBtb2RlICovCisjZGVmaW5lCUFCVU5ERVIJNAkvKiBBYm9ydC9mbGFnIG9uIFNETEMgeG1pdCB1bmRlcnJ1biAqLworI2RlZmluZQlNQVJLSURMRSA4CS8qIE1hcmsvZmxhZyBvbiBpZGxlICovCisjZGVmaW5lCUdBT1AJMHgxMAkvKiBHbyBhY3RpdmUgb24gcG9sbCAqLworI2RlZmluZQlOUloJMAkvKiBOUlogbW9kZSAqLworI2RlZmluZQlOUlpJCTB4MjAJLyogTlJaSSBtb2RlICovCisjZGVmaW5lCUZNMQkweDQwCS8qIEZNMSAodHJhbnNpdGlvbiA9IDEpICovCisjZGVmaW5lCUZNMAkweDYwCS8qIEZNMCAodHJhbnNpdGlvbiA9IDApICovCisjZGVmaW5lCUNSQ1BTCTB4ODAJLyogQ1JDIFByZXNldCBJL08gKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMTEgKENsb2NrIE1vZGUgY29udHJvbCkgKi8KKyNkZWZpbmUJVFJ4Q1hUCTAJLyogVFJ4QyA9IFh0YWwgb3V0cHV0ICovCisjZGVmaW5lCVRSeENUQwkxCS8qIFRSeEMgPSBUcmFuc21pdCBjbG9jayAqLworI2RlZmluZQlUUnhDQlIJMgkvKiBUUnhDID0gQlIgR2VuZXJhdG9yIE91dHB1dCAqLworI2RlZmluZQlUUnhDRFAJMwkvKiBUUnhDID0gRFBMTCBvdXRwdXQgKi8KKyNkZWZpbmUJVFJ4Q09JCTQJLyogVFJ4QyBPL0kgKi8KKyNkZWZpbmUJVENSVHhDUAkwCS8qIFRyYW5zbWl0IGNsb2NrID0gUlR4QyBwaW4gKi8KKyNkZWZpbmUJVENUUnhDUAk4CS8qIFRyYW5zbWl0IGNsb2NrID0gVFJ4QyBwaW4gKi8KKyNkZWZpbmUJVENCUgkweDEwCS8qIFRyYW5zbWl0IGNsb2NrID0gQlIgR2VuZXJhdG9yIG91dHB1dCAqLworI2RlZmluZQlUQ0RQTEwJMHgxOAkvKiBUcmFuc21pdCBjbG9jayA9IERQTEwgb3V0cHV0ICovCisjZGVmaW5lCVJDUlR4Q1AJMAkvKiBSZWNlaXZlIGNsb2NrID0gUlR4QyBwaW4gKi8KKyNkZWZpbmUJUkNUUnhDUAkweDIwCS8qIFJlY2VpdmUgY2xvY2sgPSBUUnhDIHBpbiAqLworI2RlZmluZQlSQ0JSCTB4NDAJLyogUmVjZWl2ZSBjbG9jayA9IEJSIEdlbmVyYXRvciBvdXRwdXQgKi8KKyNkZWZpbmUJUkNEUExMCTB4NjAJLyogUmVjZWl2ZSBjbG9jayA9IERQTEwgb3V0cHV0ICovCisjZGVmaW5lCVJUeENYCTB4ODAJLyogUlR4QyBYdGFsL05vIFh0YWwgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMTIgKGxvd2VyIGJ5dGUgb2YgYmF1ZCByYXRlIGdlbmVyYXRvciB0aW1lIGNvbnN0YW50KSAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxMyAodXBwZXIgYnl0ZSBvZiBiYXVkIHJhdGUgZ2VuZXJhdG9yIHRpbWUgY29uc3RhbnQpICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDE0IChNaXNjIGNvbnRyb2wgYml0cykgKi8KKyNkZWZpbmUJQlJFTkFCTAkxCS8qIEJhdWQgcmF0ZSBnZW5lcmF0b3IgZW5hYmxlICovCisjZGVmaW5lCUJSU1JDCTIJLyogQmF1ZCByYXRlIGdlbmVyYXRvciBzb3VyY2UgKi8KKyNkZWZpbmUJRFRSUkVRCTQJLyogRFRSL1JlcXVlc3QgZnVuY3Rpb24gKi8KKyNkZWZpbmUJQVVUT0VDSE8gOAkvKiBBdXRvIEVjaG8gKi8KKyNkZWZpbmUJTE9PUEJBSwkweDEwCS8qIExvY2FsIGxvb3BiYWNrICovCisjZGVmaW5lCVNFQVJDSAkweDIwCS8qIEVudGVyIHNlYXJjaCBtb2RlICovCisjZGVmaW5lCVJNQwkweDQwCS8qIFJlc2V0IG1pc3NpbmcgY2xvY2sgKi8KKyNkZWZpbmUJRElTRFBMTAkweDYwCS8qIERpc2FibGUgRFBMTCAqLworI2RlZmluZQlTU0JSCTB4ODAJLyogU2V0IERQTEwgc291cmNlID0gQlIgZ2VuZXJhdG9yICovCisjZGVmaW5lCVNTUlR4QwkweGEwCS8qIFNldCBEUExMIHNvdXJjZSA9IFJUeEMgKi8KKyNkZWZpbmUJU0ZNTQkweGMwCS8qIFNldCBGTSBtb2RlICovCisjZGVmaW5lCVNOUlpJCTB4ZTAJLyogU2V0IE5SWkkgbW9kZSAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxNSAoZXh0ZXJuYWwvc3RhdHVzIGludGVycnVwdCBjb250cm9sKSAqLworI2RlZmluZQlaQ0lFCTIJLyogWmVybyBjb3VudCBJRSAqLworI2RlZmluZQlEQ0RJRQk4CS8qIERDRCBJRSAqLworI2RlZmluZQlTWU5DSUUJMHgxMAkvKiBTeW5jL2h1bnQgSUUgKi8KKyNkZWZpbmUJQ1RTSUUJMHgyMAkvKiBDVFMgSUUgKi8KKyNkZWZpbmUJVHhVSUUJMHg0MAkvKiBUeCBVbmRlcnJ1bi9FT00gSUUgKi8KKyNkZWZpbmUJQlJLSUUJMHg4MAkvKiBCcmVhay9BYm9ydCBJRSAqLworCisKKy8qIFJlYWQgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlSeF9DSF9BVgkweDEJLyogUnggQ2hhcmFjdGVyIEF2YWlsYWJsZSAqLworI2RlZmluZQlaQ09VTlQJCTB4MgkvKiBaZXJvIGNvdW50ICovCisjZGVmaW5lCVR4X0JVRl9FTVAJMHg0CS8qIFR4IEJ1ZmZlciBlbXB0eSAqLworI2RlZmluZQlEQ0QJCTB4OAkvKiBEQ0QgKi8KKyNkZWZpbmUJU1lOQ19IVU5UCTB4MTAJLyogU3luYy9odW50ICovCisjZGVmaW5lCUNUUwkJMHgyMAkvKiBDVFMgKi8KKyNkZWZpbmUJVHhFT00JCTB4NDAJLyogVHggdW5kZXJydW4gKi8KKyNkZWZpbmUJQlJLX0FCUlQJMHg4MAkvKiBCcmVhay9BYm9ydCAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJQUxMX1NOVAkJMHgxCS8qIEFsbCBzZW50ICovCisvKiBSZXNpZHVlIERhdGEgZm9yIDggUnggYml0cy9jaGFyIHByb2dyYW1tZWQgKi8KKyNkZWZpbmUJUkVTMwkJMHg4CS8qIDAvMyAqLworI2RlZmluZQlSRVM0CQkweDQJLyogMC80ICovCisjZGVmaW5lCVJFUzUJCTB4YwkvKiAwLzUgKi8KKyNkZWZpbmUJUkVTNgkJMHgyCS8qIDAvNiAqLworI2RlZmluZQlSRVM3CQkweGEJLyogMC83ICovCisjZGVmaW5lCVJFUzgJCTB4NgkvKiAwLzggKi8KKyNkZWZpbmUJUkVTMTgJCTB4ZQkvKiAxLzggKi8KKyNkZWZpbmUJUkVTMjgJCTB4MAkvKiAyLzggKi8KKy8qIFNwZWNpYWwgUnggQ29uZGl0aW9uIEludGVycnVwdHMgKi8KKyNkZWZpbmUJUEFSX0VSUgkJMHgxMAkvKiBQYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUJUnhfT1ZSCQkweDIwCS8qIFJ4IE92ZXJydW4gRXJyb3IgKi8KKyNkZWZpbmUJQ1JDX0VSUgkJMHg0MAkvKiBDUkMvRnJhbWluZyBFcnJvciAqLworI2RlZmluZQlFTkRfRlIJCTB4ODAJLyogRW5kIG9mIEZyYW1lIChTRExDKSAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDIgKGNoYW5uZWwgYiBvbmx5KSAtIEludGVycnVwdCB2ZWN0b3IgKi8KKworLyogUmVhZCBSZWdpc3RlciAzIChpbnRlcnJ1cHQgcGVuZGluZyByZWdpc3RlcikgY2ggYSBvbmx5ICovCisjZGVmaW5lCUNIQkVYVAkweDEJCS8qIENoYW5uZWwgQiBFeHQvU3RhdCBJUCAqLworI2RlZmluZQlDSEJUeElQCTB4MgkJLyogQ2hhbm5lbCBCIFR4IElQICovCisjZGVmaW5lCUNIQlJ4SVAJMHg0CQkvKiBDaGFubmVsIEIgUnggSVAgKi8KKyNkZWZpbmUJQ0hBRVhUCTB4OAkJLyogQ2hhbm5lbCBBIEV4dC9TdGF0IElQICovCisjZGVmaW5lCUNIQVR4SVAJMHgxMAkJLyogQ2hhbm5lbCBBIFR4IElQICovCisjZGVmaW5lCUNIQVJ4SVAJMHgyMAkJLyogQ2hhbm5lbCBBIFJ4IElQICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgOCAocmVjZWl2ZSBkYXRhIHJlZ2lzdGVyKSAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDEwICAobWlzYyBzdGF0dXMgYml0cykgKi8KKyNkZWZpbmUJT05MT09QCTIJCS8qIE9uIGxvb3AgKi8KKyNkZWZpbmUJTE9PUFNFTkQgMHgxMAkJLyogTG9vcCBzZW5kaW5nICovCisjZGVmaW5lCUNMSzJNSVMJMHg0MAkJLyogVHdvIGNsb2NrcyBtaXNzaW5nICovCisjZGVmaW5lCUNMSzFNSVMJMHg4MAkJLyogT25lIGNsb2NrIG1pc3NpbmcgKi8KKworLyogUmVhZCBSZWdpc3RlciAxMiAobG93ZXIgYnl0ZSBvZiBiYXVkIHJhdGUgZ2VuZXJhdG9yIGNvbnN0YW50KSAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDEzICh1cHBlciBieXRlIG9mIGJhdWQgcmF0ZSBnZW5lcmF0b3IgY29uc3RhbnQpICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgMTUgKHZhbHVlIG9mIFdSIDE1KSAqLworCisvKiBaODVDMzAvWjg1MjMwIEVuaGFuY2VkIFNDQyByZWdpc3RlciBkZWZpbml0aW9ucyAqLworCisvKiBXcml0ZSBSZWdpc3RlciA3JyAoU0RMQy9IRExDIFByb2dyYW1tYWJsZSBFbmhhbmNlbWVudHMpICovCisjZGVmaW5lIEFVVE9UWEYJMHgwMQkJLyogQXV0byBUeCBGbGFnICovCisjZGVmaW5lIEFVVE9FT00gMHgwMgkJLyogQXV0byBFT00gTGF0Y2ggUmVzZXQgKi8KKyNkZWZpbmUgQVVUT1JUUwkweDA0CQkvKiBBdXRvIFJUUyAqLworI2RlZmluZSBUWEROUlpJIDB4MDgJCS8qIFR4RCBQdWxsZWQgSGlnaCBpbiBTRExDIE5SWkkgbW9kZSAqLworI2RlZmluZSBSWEZJRk9IIDB4MDgJCS8qIFo4NTIzMDogSW50IG9uIFJYIEZJRk8gaGFsZiBmdWxsICovCisjZGVmaW5lIEZBU1REVFIgMHgxMAkJLyogRmFzdCBEVFIvUkVRIE1vZGUgKi8KKyNkZWZpbmUgQ1JDQ0JDUgkweDIwCQkvKiBDUkMgQ2hlY2sgQnl0ZXMgQ29tcGxldGVseSBSZWNlaXZlZCAqLworI2RlZmluZSBUWEZJRk9FIDB4MjAJCS8qIFo4NTIzMDogSW50IG9uIFRYIEZJRk8gY29tcGxldGVseSBlbXB0eSAqLworI2RlZmluZSBFWFRSREVOCTB4NDAJCS8qIEV4dGVuZGVkIFJlYWQgRW5hYmxlZCAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxNSAoZXh0ZXJuYWwvc3RhdHVzIGludGVycnVwdCBjb250cm9sKSAqLworI2RlZmluZSBTSERMQ0UJMQkJLyogU0RMQy9IRExDIEVuaGFuY2VtZW50cyBFbmFibGUgKi8KKyNkZWZpbmUgRklGT0UJNAkJLyogRklGTyBFbmFibGUgKi8KKworLyogUmVhZCBSZWdpc3RlciA2IChmcmFtZSBzdGF0dXMgRklGTykgKi8KKyNkZWZpbmUgQkNMU0IJMHhmZgkJLyogTFNCIG9mIDE0IGJpdHMgY291bnQgKi8KKworLyogUmVhZCBSZWdpc3RlciA3IChmcmFtZSBzdGF0dXMgRklGTykgKi8KKyNkZWZpbmUgQkNNU0IJMHgzZgkJLyogTVNCIG9mIDE0IGJpdHMgY291bnQgKi8KKyNkZWZpbmUgRkRBCTB4NDAJCS8qIEZJRk8gRGF0YSBBdmFpbGFibGUgU3RhdHVzICovCisjZGVmaW5lIEZPUwkweDgwCQkvKiBGSUZPIE92ZXJmbG93IFN0YXR1cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAtcGx1cy5jIGIvZHJpdmVycy9uZXQvaHAtcGx1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzQzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ocC1wbHVzLmMKQEAgLTAsMCArMSw0OTUgQEAKKy8qIGhwLXBsdXMuYzogQSBIUCBQQ0xBTi9wbHVzIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguICovCisvKgorCVdyaXR0ZW4gMTk5NCBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBIZXdsZXR0IFBhY2thcmQgUEMgTEFOICgyNyoqKikgcGx1cyBldGhlcmNhcmRzLgorCVRoZXNlIGNhcmRzIGFyZSBzb2xkIHVuZGVyIHNldmVyYWwgbW9kZWwgbnVtYmVycywgdXN1YWxseSAyNzI0Ki4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJQXMgaXMgb2Z0ZW4gdGhlIGNhc2UsIGEgZ3JlYXQgZGVhbCBvZiBjcmVkaXQgaXMgb3dlZCB0byBSdXNzIE5lbHNvbi4KKwlUaGUgQ3J5bndyIHBhY2tldCBkcml2ZXIgd2FzIG15IHByaW1hcnkgc291cmNlIG9mIEhQLXNwZWNpZmljCisJcHJvZ3JhbW1pbmcgaW5mb3JtYXRpb24uCisqLworCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQorImhwLXBsdXMuYzp2MS4xMCA5LzI0Lzk0IERvbmFsZCBCZWNrZXIgKGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdilcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkJLyogSW1wb3J0YW50IC0tIHRoaXMgaW5saW5lcyB3b3JkIG1vdmVzLiAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworI2RlZmluZSBEUlZfTkFNRSAiaHAtcGx1cyIKKworLyogQSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBJL08gYWRkcmVzc2VzIHRvIGJlIHByb2JlZC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHBwbHVzX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9Cit7MHgyMDAsIDB4MjQwLCAweDI4MCwgMHgyQzAsIDB4MzAwLCAweDMyMCwgMHgzNDAsIDB9OworCisvKgorICAgVGhlIEhQIEV0aGVyVHdpc3QgY2hpcCBpbXBsZW1lbnRhdGlvbiBpcyBhIGZhaXJseSByb3V0aW5lIERQODM5MAorICAgaW1wbGVtZW50YXRpb24uICBJdCBhbGxvd3MgYm90aCBzaGFyZWQgbWVtb3J5IGFuZCBwcm9ncmFtbWVkLUkvTyBidWZmZXIKKyAgIGFjY2VzcywgdXNpbmcgYSBjdXN0b20gaW50ZXJmYWNlIGZvciBib3RoLiAgVGhlIHByb2dyYW1tZWQtSS9PIG1vZGUgaXMKKyAgIGVudGlyZWx5IGltcGxlbWVudGVkIGluIHRoZSBIUCBFdGhlclR3aXN0IGNoaXAsIGJ5cGFzc2luZyB0aGUgcHJvYmxlbQorICAgcmlkZGVuIGJ1aWx0LWluIDgzOTAgZmFjaWxpdGllcyB1c2VkIG9uIE5FMjAwMCBkZXNpZ25zLiAgVGhlIHNoYXJlZAorICAgbWVtb3J5IG1vZGUgaXMgbGlrZXdpc2Ugc3BlY2lhbCwgd2l0aCBhbiBvZmZzZXQgcmVnaXN0ZXIgdXNlZCB0byBtYWtlCisgICBwYWNrZXRzIGFwcGVhciBhdCB0aGUgc2hhcmVkIG1lbW9yeSBiYXNlLiAgQm90aCBtb2RlcyB1c2UgYSBiYXNlIGFuZCBib3VuZHMKKyAgIHBhZ2UgcmVnaXN0ZXIgdG8gaGlkZSB0aGUgUnggcmluZyBidWZmZXIgd3JhcCAtLSBhIHBhY2tldCB0aGF0IHNwYW5zIHRoZQorICAgZW5kIG9mIHBoeXNpY2FsIGJ1ZmZlciBtZW1vcnkgYXBwZWFycyBjb250aW51b3VzIHRvIHRoZSBkcml2ZXIuIChjLmYuIHRoZQorICAgM2M1MDMgYW5kIENhYmxldHJvbiBFMjEwMCkKKworICAgQSBzcGVjaWFsIG5vdGU6IHRoZSBpbnRlcm5hbCBidWZmZXIgb2YgdGhlIGJvYXJkIGlzIG9ubHkgOCBiaXRzIHdpZGUuCisgICBUaGlzIGxheXMgc2V2ZXJhbCBuYXN0eSB0cmFwcyBmb3IgdGhlIHVuYXdhcmU6CisgICAtIHRoZSA4MzkwIG11c3QgYmUgcHJvZ3JhbW1lZCBmb3IgYnl0ZS13aWRlIG9wZXJhdGlvbnMKKyAgIC0gYWxsIEkvTyBhbmQgbWVtb3J5IG9wZXJhdGlvbnMgbXVzdCB3b3JrIG9uIHdob2xlIHdvcmRzICh0aGUgYWNjZXNzCisgICAgIGxhdGNoZXMgYXJlIHNlcmlhbGx5IHByZWxvYWRlZCBhbmQgaGF2ZSBubyBieXRlLXN3YXBwaW5nIGFiaWxpdHkpLgorCisgICBUaGlzIGJvYXJkIGlzIGxhaWQgb3V0IGluIEkvTyBzcGFjZSBtdWNoIGxpa2UgdGhlIGVhcmxpZXIgSFAgYm9hcmRzOgorICAgdGhlIGZpcnN0IDE2IGxvY2F0aW9ucyBhcmUgZm9yIHRoZSBib2FyZCByZWdpc3RlcnMsIGFuZCB0aGUgc2Vjb25kIDE2IGFyZQorICAgZm9yIHRoZSA4MzkwLiAgVGhlIGJvYXJkIGlzIGVhc3kgdG8gaWRlbnRpZnksIHdpdGggYm90aCBhIGRlZGljYXRlZCAxNiBiaXQKKyAgIElEIHJlZ2lzdGVyIGFuZCBhIGNvbnN0YW50IDB4NTMwKiB2YWx1ZSBpbiB0aGUgdXBwZXIgYml0cyBvZiB0aGUgcGFnaW5nCisgICByZWdpc3Rlci4KKyovCisKKyNkZWZpbmUgSFBfSUQJCQkweDAwCS8qIElEIHJlZ2lzdGVyLCBhbHdheXMgMHg0ODUwLiAqLworI2RlZmluZSBIUF9QQUdJTkcJCTB4MDIJLyogUmVnaXN0ZXJzIHZpc2libGUgQCA4LWYsIHNlZSBQYWdlTmFtZS4gKi8KKyNkZWZpbmUgSFBQX09QVElPTgkJMHgwNAkvKiBCaXRtYXBwZWQgb3B0aW9ucywgc2VlIEhQX09wdGlvbi4JKi8KKyNkZWZpbmUgSFBQX09VVF9BRERSCTB4MDgJLyogSS9PIG91dHB1dCBsb2NhdGlvbiBpbiBQZXJmX1BhZ2UuCSovCisjZGVmaW5lIEhQUF9JTl9BRERSCQkweDBBCS8qIEkvTyBpbnB1dCBsb2NhdGlvbiBpbiBQZXJmX1BhZ2UuCQkqLworI2RlZmluZSBIUF9EQVRBUE9SVAkJMHgwYwkvKiBJL08gZGF0YSB0cmFuc2ZlciBpbiBQZXJmX1BhZ2UuCQkqLworI2RlZmluZSBOSUNfT0ZGU0VUCQkweDEwCS8qIE9mZnNldCB0byB0aGUgODM5MCByZWdpc3RlcnMuCQkqLworI2RlZmluZSBIUF9JT19FWFRFTlQJMzIKKworI2RlZmluZSBIUF9TVEFSVF9QRwkJMHgwMAkvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlciAqLworI2RlZmluZSBIUF9TVE9QX1BHCQkweDgwCS8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nICovCisKKy8qIFRoZSByZWdpc3RlciBzZXQgc2VsZWN0ZWQgaW4gSFBfUEFHSU5HLiAqLworZW51bSBQYWdlTmFtZSB7CisJUGVyZl9QYWdlID0gMCwJCQkJLyogTm9ybWFsIG9wZXJhdGlvbi4gKi8KKwlNQUNfUGFnZSA9IDEsCQkJCS8qIFRoZSBldGhlcm5ldCBhZGRyZXNzICgrY2hlY2tzdW0pLiAqLworCUhXX1BhZ2UgPSAyLAkJCQkvKiBFRVBST00tbG9hZGVkIGhhcmR3YXJlIHBhcmFtZXRlcnMuICovCisJTEFOX1BhZ2UgPSA0LAkJCQkvKiBUcmFuc2NlaXZlciBzZWxlY3Rpb24sIHRlc3RpbmcsIGV0Yy4gKi8KKwlJRF9QYWdlID0gNiB9OworCisvKiBUaGUgYml0IGRlZmluaXRpb25zIGZvciB0aGUgSFBQX09QVElPTiByZWdpc3Rlci4gKi8KK2VudW0gSFBfT3B0aW9uIHsKKwlOSUNSZXNldCA9IDEsIENoaXBSZXNldCA9IDIsIAkvKiBBY3RpdmUgbG93LCByZWFsbHkgVU5yZXNldC4gKi8KKwlFbmFibGVJUlEgPSA0LCBGYWtlSW50ciA9IDgsIEJvb3RST01FbmIgPSAweDEwLCBJT0VuYiA9IDB4MjAsCisJTWVtRW5hYmxlID0gMHg0MCwgWmVyb1dhaXQgPSAweDgwLCBNZW1EaXNhYmxlID0gMHgxMDAwLCB9OworCitzdGF0aWMgaW50IGhwcF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcik7CisKK3N0YXRpYyB2b2lkIGhwcF9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBocHBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaHBwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaHBwX21lbV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCBocHBfbWVtX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSk7CitzdGF0aWMgdm9pZCBocHBfbWVtX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJCQkJICBpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIGhwcF9pb19ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCBocHBfaW9fYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIGhwcF9pb19nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCQkJCSAgaW50IHJpbmdfcGFnZSk7CisKKwwKKy8qCVByb2JlIGEgbGlzdCBvZiBhZGRyZXNzZXMgZm9yIGFuIEhQIExBTisgYWRhcHRvci4KKwlUaGlzIHJvdXRpbmUgaXMgYWxtb3N0IGJvaWxlcnBsYXRlLiAqLworCitzdGF0aWMgaW50IF9faW5pdCBkb19ocHBfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlpbnQgYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGlycSA9IGRldi0+aXJxOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKGJhc2VfYWRkciA+IDB4MWZmKQkJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQlyZXR1cm4gaHBwX3Byb2JlMShkZXYsIGJhc2VfYWRkcik7CisJZWxzZSBpZiAoYmFzZV9hZGRyICE9IDApCS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJcmV0dXJuIC1FTlhJTzsKKworCWZvciAoaSA9IDA7IGhwcGx1c19wb3J0bGlzdFtpXTsgaSsrKSB7CisJCWlmIChocHBfcHJvYmUxKGRldiwgaHBwbHVzX3BvcnRsaXN0W2ldKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJCWRldi0+aXJxID0gaXJxOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBOQjogaHBwX2Nsb3NlKCkgaGFuZGxlcyBmcmVlX2lycSAqLworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyIC0gTklDX09GRlNFVCwgSFBfSU9fRVhURU5UKTsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGhwX3BsdXNfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2VpX25ldGRldigpOworCWludCBlcnI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCWVyciA9IGRvX2hwcF9wcm9iZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwljbGVhbnVwX2NhcmQoZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworLyogRG8gdGhlIGludGVyZXN0aW5nIHBhcnQgb2YgdGhlIHByb2JlIGF0IGEgc2luZ2xlIGFkZHJlc3MuICovCitzdGF0aWMgaW50IF9faW5pdCBocHBfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJaW50IGksIHJldHZhbDsKKwl1bnNpZ25lZCBjaGFyIGNoZWNrc3VtID0gMDsKKwljb25zdCBjaGFyIG5hbWVbXSA9ICJIUC1QQy1MQU4rIjsKKwlpbnQgbWVtX3N0YXJ0OworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgSFBfSU9fRVhURU5ULCBEUlZfTkFNRSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBDaGVjayBmb3IgdGhlIEhQKyBzaWduYXR1cmUsIDUwIDQ4IDB4IDUzLiAqLworCWlmIChpbncoaW9hZGRyICsgSFBfSUQpICE9IDB4NDg1MAorCQl8fCAoaW53KGlvYWRkciArIEhQX1BBR0lORykgJiAweGZmZjApICE9IDB4NTMwMCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZWlfZGVidWcgICYmICB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwlwcmludGsoIiVzOiAlcyBhdCAlIzN4LCIsIGRldi0+bmFtZSwgbmFtZSwgaW9hZGRyKTsKKworCS8qIFJldHJpZXZlIGFuZCBjaGVja3N1bSB0aGUgc3RhdGlvbiBhZGRyZXNzLiAqLworCW91dHcoTUFDX1BhZ2UsIGlvYWRkciArIEhQX1BBR0lORyk7CisKKwlmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgaW52YWwgPSBpbmIoaW9hZGRyICsgOCArIGkpOworCQlkZXYtPmRldl9hZGRyW2ldID0gaW52YWw7CisJCWNoZWNrc3VtICs9IGludmFsOworCQlwcmludGsoIiAlMi4yeCIsIGludmFsKTsKKwl9CisJY2hlY2tzdW0gKz0gaW5iKGlvYWRkciArIDE0KTsKKworCWlmIChjaGVja3N1bSAhPSAweGZmKSB7CisJCXByaW50aygiIGJhZCBjaGVja3N1bSAlMi4yeC5cbiIsIGNoZWNrc3VtKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJLyogUG9pbnQgYXQgdGhlIFNvZnR3YXJlIENvbmZpZ3VyYXRpb24gRmxhZ3MuICovCisJCW91dHcoSURfUGFnZSwgaW9hZGRyICsgSFBfUEFHSU5HKTsKKwkJcHJpbnRrKCIgSUQgJTQuNHgiLCBpbncoaW9hZGRyICsgMTIpKTsKKwl9CisKKwkvKiBSZWFkIHRoZSBJUlEgbGluZS4gKi8KKwlvdXR3KEhXX1BhZ2UsIGlvYWRkciArIEhQX1BBR0lORyk7CisJeworCQlpbnQgaXJxID0gaW5iKGlvYWRkciArIDEzKSAmIDB4MGY7CisJCWludCBvcHRpb24gPSBpbncoaW9hZGRyICsgSFBQX09QVElPTik7CisKKwkJZGV2LT5pcnEgPSBpcnE7CisJCWlmIChvcHRpb24gJiBNZW1FbmFibGUpIHsKKwkJCW1lbV9zdGFydCA9IGludyhpb2FkZHIgKyA5KSA8PCA4OworCQkJcHJpbnRrKCIsIElSUSAlZCwgbWVtb3J5IGFkZHJlc3MgJSN4LlxuIiwgaXJxLCBtZW1fc3RhcnQpOworCQl9IGVsc2UgeworCQkJbWVtX3N0YXJ0ID0gMDsKKwkJCXByaW50aygiLCBJUlEgJWQsIHByb2dyYW1tZWQtSS9PIG1vZGUuXG4iLCBpcnEpOworCQl9CisJfQorCisJLyogU2V0IHRoZSB3cmFwIHJlZ2lzdGVycyBmb3Igc3RyaW5nIEkvTyByZWFkcy4gICAqLworCW91dHcoKEhQX1NUQVJUX1BHICsgVFhfUEFHRVMvMikgfCAoKEhQX1NUT1BfUEcgLSAxKSA8PCA4KSwgaW9hZGRyICsgMTQpOworCisJLyogU2V0IHRoZSBiYXNlIGFkZHJlc3MgdG8gcG9pbnQgdG8gdGhlIE5JQywgbm90IHRoZSAicmVhbCIgYmFzZSEgKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkciArIE5JQ19PRkZTRVQ7CisKKwlkZXYtPm9wZW4gPSAmaHBwX29wZW47CisJZGV2LT5zdG9wID0gJmhwcF9jbG9zZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCisJZWlfc3RhdHVzLm5hbWUgPSBuYW1lOworCWVpX3N0YXR1cy53b3JkMTYgPSAwOwkJLyogQWdnZ2doaGhoaCEgRGVidWcgdGltZTogMiBkYXlzISAqLworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gSFBfU1RBUlRfUEc7CisJZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBIUF9TVEFSVF9QRyArIFRYX1BBR0VTLzI7CisJZWlfc3RhdHVzLnN0b3BfcGFnZSA9IEhQX1NUT1BfUEc7CisKKwllaV9zdGF0dXMucmVzZXRfODM5MCA9ICZocHBfcmVzZXRfODM5MDsKKwllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmaHBwX2lvX2Jsb2NrX2lucHV0OworCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmaHBwX2lvX2Jsb2NrX291dHB1dDsKKwllaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJmhwcF9pb19nZXRfODM5MF9oZHI7CisKKwkvKiBDaGVjayBpZiB0aGUgbWVtb3J5X2VuYWJsZSBmbGFnIGlzIHNldCBpbiB0aGUgb3B0aW9uIHJlZ2lzdGVyLiAqLworCWlmIChtZW1fc3RhcnQpIHsKKwkJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJmhwcF9tZW1fYmxvY2tfaW5wdXQ7CisJCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmaHBwX21lbV9ibG9ja19vdXRwdXQ7CisJCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmaHBwX21lbV9nZXRfODM5MF9oZHI7CisJCWRldi0+bWVtX3N0YXJ0ID0gbWVtX3N0YXJ0OworCQllaV9zdGF0dXMucm1lbV9zdGFydCA9IGRldi0+bWVtX3N0YXJ0ICsgVFhfUEFHRVMvMioyNTY7CisJCWRldi0+bWVtX2VuZCA9IGVpX3N0YXR1cy5ybWVtX2VuZAorCQkJPSBkZXYtPm1lbV9zdGFydCArIChIUF9TVE9QX1BHIC0gSFBfU1RBUlRfUEcpKjI1NjsKKwl9CisKKwlvdXR3KFBlcmZfUGFnZSwgaW9hZGRyICsgSFBfUEFHSU5HKTsKKwlOUzgzOTBfaW5pdChkZXYsIDApOworCS8qIExlYXZlIHRoZSA4MzkwIGFuZCBIUCBjaGlwIHJlc2V0LiAqLworCW91dHcoaW53KGlvYWRkciArIEhQUF9PUFRJT04pICYgfkVuYWJsZUlSUSwgaW9hZGRyICsgSFBQX09QVElPTik7CisKKwlyZXR1cm4gMDsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEhQX0lPX0VYVEVOVCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAoraHBwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBOSUNfT0ZGU0VUOworCWludCBvcHRpb25fcmVnOworCWludCByZXR2YWw7CisKKwlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkpIHsKKwkgICAgcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKiBSZXNldCB0aGUgODM5MCBhbmQgSFAgY2hpcC4gKi8KKwlvcHRpb25fcmVnID0gaW53KGlvYWRkciArIEhQUF9PUFRJT04pOworCW91dHcob3B0aW9uX3JlZyAmIH4oTklDUmVzZXQgKyBDaGlwUmVzZXQpLCBpb2FkZHIgKyBIUFBfT1BUSU9OKTsKKwl1ZGVsYXkoNSk7CisJLyogVW5yZXNldCB0aGUgYm9hcmQgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLiAqLworCW91dHcob3B0aW9uX3JlZyB8IChFbmFibGVJUlEgKyBOSUNSZXNldCArIENoaXBSZXNldCksIGlvYWRkciArIEhQUF9PUFRJT04pOworCisJLyogU2V0IHRoZSB3cmFwIHJlZ2lzdGVycyBmb3IgcHJvZ3JhbW1lZC1JL08gb3BlcmF0aW9uLiAgICovCisJb3V0dyhIV19QYWdlLCBpb2FkZHIgKyBIUF9QQUdJTkcpOworCW91dHcoKEhQX1NUQVJUX1BHICsgVFhfUEFHRVMvMikgfCAoKEhQX1NUT1BfUEcgLSAxKSA8PCA4KSwgaW9hZGRyICsgMTQpOworCisJLyogU2VsZWN0IHRoZSBvcGVyYXRpb25hbCBwYWdlLiAqLworCW91dHcoUGVyZl9QYWdlLCBpb2FkZHIgKyBIUF9QQUdJTkcpOworCisJZWlfb3BlbihkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitocHBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBOSUNfT0ZGU0VUOworCWludCBvcHRpb25fcmVnID0gaW53KGlvYWRkciArIEhQUF9PUFRJT04pOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJZWlfY2xvc2UoZGV2KTsKKwlvdXR3KChvcHRpb25fcmVnICYgfkVuYWJsZUlSUSkgfCBNZW1EaXNhYmxlIHwgTklDUmVzZXQgfCBDaGlwUmVzZXQsCisJCSBpb2FkZHIgKyBIUFBfT1BUSU9OKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraHBwX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBOSUNfT0ZGU0VUOworCWludCBvcHRpb25fcmVnID0gaW53KGlvYWRkciArIEhQUF9PUFRJT04pOworCisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldHRpbmcgdGhlIDgzOTAgdGltZT0lbGQuLi4iLCBqaWZmaWVzKTsKKworCW91dHcob3B0aW9uX3JlZyAmIH4oTklDUmVzZXQgKyBDaGlwUmVzZXQpLCBpb2FkZHIgKyBIUFBfT1BUSU9OKTsKKwkvKiBQYXVzZSBhIGZldyBjeWNsZXMgZm9yIHRoZSBoYXJkd2FyZSByZXNldCB0byB0YWtlIHBsYWNlLiAqLworCXVkZWxheSg1KTsKKwllaV9zdGF0dXMudHhpbmcgPSAwOworCW91dHcob3B0aW9uX3JlZyB8IChFbmFibGVJUlEgKyBOSUNSZXNldCArIENoaXBSZXNldCksIGlvYWRkciArIEhQUF9PUFRJT04pOworCisJdWRlbGF5KDUpOworCisKKwlpZiAoKGluYl9wKGlvYWRkcitOSUNfT0ZGU0VUK0VOMF9JU1IpICYgRU5JU1JfUkVTRVQpID09IDApCisJCXByaW50aygiJXM6IGhwX3Jlc2V0XzgzOTAoKSBkaWQgbm90IGNvbXBsZXRlLlxuIiwgZGV2LT5uYW1lKTsKKworCWlmIChlaV9kZWJ1ZyA+IDEpIHByaW50aygiODM5MCByZXNldCBkb25lICglbGQpLiIsIGppZmZpZXMpOworCXJldHVybjsKK30KKworLyogVGhlIHByb2dyYW1tZWQtSS9PIHZlcnNpb24gb2YgcmVhZGluZyB0aGUgNCBieXRlIDgzOTAgc3BlY2lmaWMgaGVhZGVyLgorICAgTm90ZSB0aGF0IHRyYW5zZmVyIHdpdGggdGhlIEV0aGVyVHdpc3QrIG11c3QgYmUgb24gd29yZCBib3VuZGFyaWVzLiAqLworCitzdGF0aWMgdm9pZAoraHBwX2lvX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIE5JQ19PRkZTRVQ7CisKKwlvdXR3KChyaW5nX3BhZ2U8PDgpLCBpb2FkZHIgKyBIUFBfSU5fQUREUik7CisJaW5zdyhpb2FkZHIgKyBIUF9EQVRBUE9SVCwgaGRyLCBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpPj4xKTsKK30KKworLyogQmxvY2sgaW5wdXQgYW5kIG91dHB1dCwgc2ltaWxhciB0byB0aGUgQ3J5bndyIHBhY2tldCBkcml2ZXIuICovCisKK3N0YXRpYyB2b2lkCitocHBfaW9fYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyIC0gTklDX09GRlNFVDsKKwljaGFyICpidWYgPSBza2ItPmRhdGE7CisKKwlvdXR3KHJpbmdfb2Zmc2V0LCBpb2FkZHIgKyBIUFBfSU5fQUREUik7CisJaW5zdyhpb2FkZHIgKyBIUF9EQVRBUE9SVCwgYnVmLCBjb3VudD4+MSk7CisJaWYgKGNvdW50ICYgMHgwMSkKKyAgICAgICAgYnVmW2NvdW50LTFdID0gaW53KGlvYWRkciArIEhQX0RBVEFQT1JUKTsKK30KKworLyogVGhlIGNvcnJlc3BvbmRpbmcgc2hhcmVkIG1lbW9yeSB2ZXJzaW9ucyBvZiB0aGUgYWJvdmUgMiBmdW5jdGlvbnMuICovCisKK3N0YXRpYyB2b2lkCitocHBfbWVtX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIE5JQ19PRkZTRVQ7CisJaW50IG9wdGlvbl9yZWcgPSBpbncoaW9hZGRyICsgSFBQX09QVElPTik7CisKKwlvdXR3KChyaW5nX3BhZ2U8PDgpLCBpb2FkZHIgKyBIUFBfSU5fQUREUik7CisJb3V0dyhvcHRpb25fcmVnICYgfihNZW1EaXNhYmxlICsgQm9vdFJPTUVuYiksIGlvYWRkciArIEhQUF9PUFRJT04pOworCWlzYV9tZW1jcHlfZnJvbWlvKGhkciwgZGV2LT5tZW1fc3RhcnQsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworCW91dHcob3B0aW9uX3JlZywgaW9hZGRyICsgSFBQX09QVElPTik7CisJaGRyLT5jb3VudCA9IChsZTE2X3RvX2NwdShoZHItPmNvdW50KSArIDMpICYgfjM7CS8qIFJvdW5kIHVwIGFsbG9jYXRpb24uICovCit9CisKK3N0YXRpYyB2b2lkCitocHBfbWVtX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIE5JQ19PRkZTRVQ7CisJaW50IG9wdGlvbl9yZWcgPSBpbncoaW9hZGRyICsgSFBQX09QVElPTik7CisKKwlvdXR3KHJpbmdfb2Zmc2V0LCBpb2FkZHIgKyBIUFBfSU5fQUREUik7CisKKwlvdXR3KG9wdGlvbl9yZWcgJiB+KE1lbURpc2FibGUgKyBCb290Uk9NRW5iKSwgaW9hZGRyICsgSFBQX09QVElPTik7CisKKwkvKiBDYXV0aW9uOiB0aGlzIHJlbGllcyBvbiBnZXRfODM5MF9oZHIoKSByb3VuZGluZyB1cCBjb3VudCEKKwkgICBBbHNvIG5vdGUgdGhhdCB3ZSAqY2FuJ3QqIHVzZSBldGhfaW9fY29weV9hbmRfc3VtKCkgYmVjYXVzZQorCSAgIGl0IHdpbGwgbm90IGFsd2F5cyBjb3B5ICJjb3VudCIgYnl0ZXMgKGUuZy4gcGFkZGVkIElQKS4gICovCisKKwlpc2FfbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIGRldi0+bWVtX3N0YXJ0LCBjb3VudCk7CisJb3V0dyhvcHRpb25fcmVnLCBpb2FkZHIgKyBIUFBfT1BUSU9OKTsKK30KKworLyogQSBzcGVjaWFsIG5vdGU6IHdlICptdXN0KiBhbHdheXMgdHJhbnNmZXIgPj0xNiBiaXQgd29yZHMuCisgICBJdCdzIGFsd2F5cyBzYWZlIHRvIHJvdW5kIHVwLCBzbyB3ZSBkby4gKi8KK3N0YXRpYyB2b2lkCitocHBfaW9fYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSkKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBOSUNfT0ZGU0VUOworCW91dHcoc3RhcnRfcGFnZSA8PCA4LCBpb2FkZHIgKyBIUFBfT1VUX0FERFIpOworCW91dHNsKGlvYWRkciArIEhQX0RBVEFQT1JULCBidWYsIChjb3VudCszKT4+Mik7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAoraHBwX21lbV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHN0YXJ0X3BhZ2UpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyIC0gTklDX09GRlNFVDsKKwlpbnQgb3B0aW9uX3JlZyA9IGludyhpb2FkZHIgKyBIUFBfT1BUSU9OKTsKKworCW91dHcoc3RhcnRfcGFnZSA8PCA4LCBpb2FkZHIgKyBIUFBfT1VUX0FERFIpOworCW91dHcob3B0aW9uX3JlZyAmIH4oTWVtRGlzYWJsZSArIEJvb3RST01FbmIpLCBpb2FkZHIgKyBIUFBfT1BUSU9OKTsKKwlpc2FfbWVtY3B5X3RvaW8oZGV2LT5tZW1fc3RhcnQsIGJ1ZiwgKGNvdW50ICsgMykgJiB+Myk7CisJb3V0dyhvcHRpb25fcmVnLCBpb2FkZHIgKyBIUFBfT1BUSU9OKTsKKworCXJldHVybjsKK30KKworDAorI2lmZGVmIE1PRFVMRQorI2RlZmluZSBNQVhfSFBQX0NBUkRTCTQJLyogTWF4IG51bWJlciBvZiBIUFAgY2FyZHMgcGVyIG1vZHVsZSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfaHBwW01BWF9IUFBfQ0FSRFNdOworc3RhdGljIGludCBpb1tNQVhfSFBQX0NBUkRTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF9IUFBfQ0FSRFNdOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBwb3J0IGFkZHJlc3MoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBudW1iZXIocyk7IGlnbm9yZWQgaWYgcHJvcGVybHkgZGV0ZWN0ZWQiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSFAgUEMtTEFOKyBJU0EgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFRoaXMgaXMgc2V0IHVwIHNvIHRoYXQgb25seSBhIHNpbmdsZSBhdXRvcHJvYmUgdGFrZXMgcGxhY2UgcGVyIGNhbGwuCitJU0EgZGV2aWNlIGF1dG9wcm9iZXMgb24gYSBydW5uaW5nIG1hY2hpbmUgYXJlIG5vdCByZWNvbW1lbmRlZC4gKi8KK2ludAoraW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0hQUF9DQVJEUzsgdGhpc19kZXYrKykgeworCQlpZiAoaW9bdGhpc19kZXZdID09IDApICB7CisJCQlpZiAodGhpc19kZXYgIT0gMCkgYnJlYWs7IC8qIG9ubHkgYXV0b3Byb2JlIDFzdCBvbmUgKi8KKwkJCXByaW50ayhLRVJOX05PVElDRSAiaHAtcGx1cy5jOiBQcmVzZW50bHkgYXV0b3Byb2JpbmcgKG5vdCByZWNvbW1lbmRlZCkgZm9yIGEgc2luZ2xlIGNhcmQuXG4iKTsKKwkJfQorCQlkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwkJaWYgKCFkZXYpCisJCQlicmVhazsKKwkJZGV2LT5pcnEgPSBpcnFbdGhpc19kZXZdOworCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKKwkJaWYgKGRvX2hwcF9wcm9iZShkZXYpID09IDApIHsKKwkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7CisJCQkJZGV2X2hwcFtmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhwLXBsdXMuYzogTm8gSFAtUGx1cyBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsIGlvW3RoaXNfZGV2XSk7CisJCWJyZWFrOworCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiAtRU5YSU87Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0hQUF9DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2hwcFt0aGlzX2Rldl07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ocC5jIGIvZHJpdmVycy9uZXQvaHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjY4ODg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaHAuYwpAQCAtMCwwICsxLDQ2NCBAQAorLyogaHAuYzogQSBIUCBMQU4gZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisKKwlDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisJRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIEhQIFBDLUxBTiBhZGFwdG9ycy4KKworCVNvdXJjZXM6CisJICBUaGUgQ3J5bndyIHBhY2tldCBkcml2ZXIuCisqLworCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQorCSJocC5jOnYxLjEwIDkvMjMvOTQgRG9uYWxkIEJlY2tlciAoYmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292KVxuIjsKKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiODM5MC5oIgorCisjZGVmaW5lIERSVl9OQU1FICJocCIKKworLyogQSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBJL08gYWRkcmVzc2VzIHRvIGJlIHByb2JlZC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHBwY2xhbl9wb3J0bGlzdFtdIF9faW5pdGRhdGEgPQoreyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDI4MCwgMHgyQzAsIDB4MjAwLCAweDI0MCwgMH07CisKKyNkZWZpbmUgSFBfSU9fRVhURU5UCTMyCisKKyNkZWZpbmUgSFBfREFUQVBPUlQJCTB4MGMJLyogIlJlbW90ZSBETUEiIGRhdGEgcG9ydC4gKi8KKyNkZWZpbmUgSFBfSUQJCQkweDA3CisjZGVmaW5lIEhQX0NPTkZJR1VSRQkweDA4CS8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuICovCisjZGVmaW5lCSBIUF9SVU4JCQkweDAxCS8qIDEgPT0gUnVuLCAwID09IHJlc2V0LiAqLworI2RlZmluZQkgSFBfSVJRCQkJMHgwRQkvKiBNYXNrIGZvciBzb2Z0d2FyZS1jb25maWd1cmVkIElSUSBsaW5lLiAqLworI2RlZmluZQkgSFBfREFUQU9OCQkweDEwCS8qIFR1cm4gb24gZGF0YXBvcnQgKi8KKyNkZWZpbmUgTklDX09GRlNFVAkJMHgxMAkvKiBPZmZzZXQgdGhlIDgzOTAgcmVnaXN0ZXJzLiAqLworCisjZGVmaW5lIEhQX1NUQVJUX1BHCQkweDAwCS8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyICovCisjZGVmaW5lIEhQXzhCU1RPUF9QRwkweDgwCS8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nICovCisjZGVmaW5lIEhQXzE2QlNUT1BfUEcJMHhGRgkvKiBTYW1lLCBmb3IgMTYgYml0IGNhcmRzLiAqLworCitzdGF0aWMgaW50IGhwX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKKworc3RhdGljIGludCBocF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBocF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGhwX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBocF9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCQkJaW50IHJpbmdfcGFnZSk7CitzdGF0aWMgdm9pZCBocF9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJCXN0cnVjdCBza19idWZmICpza2IgLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgaHBfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKKworc3RhdGljIHZvaWQgaHBfaW5pdF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBUaGUgbWFwIGZyb20gSVJRIG51bWJlciB0byBIUF9DT05GSUdVUkUgcmVnaXN0ZXIgc2V0dGluZy4gKi8KKy8qIE15IGRlZmF1bHQgaXMgSVJRNQkgICAgICAgICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAxMCAxMSAqLworc3RhdGljIGNoYXIgaXJxbWFwWzE2XSBfX2luaXRkYXRhPSB7IDAsIDAsIDQsIDYsIDgsMTAsIDAsMTQsIDAsIDQsIDIsMTIsMCwwLDAsMH07CisKKwwKKy8qCVByb2JlIGZvciBhbiBIUCBMQU4gYWRhcHRvci4KKwlBbHNvIGluaXRpYWxpemUgdGhlIGNhcmQgYW5kIGZpbGwgaW4gU1RBVElPTl9BRERSIHdpdGggdGhlIHN0YXRpb24KKwlhZGRyZXNzLiAqLworCitzdGF0aWMgaW50IF9faW5pdCBkb19ocF9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCWludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaXJxID0gZGV2LT5pcnE7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoYmFzZV9hZGRyID4gMHgxZmYpCQkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCXJldHVybiBocF9wcm9iZTEoZGV2LCBiYXNlX2FkZHIpOworCWVsc2UgaWYgKGJhc2VfYWRkciAhPSAwKQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisKKwlmb3IgKGkgPSAwOyBocHBjbGFuX3BvcnRsaXN0W2ldOyBpKyspIHsKKwkJaWYgKGhwX3Byb2JlMShkZXYsIGhwcGNsYW5fcG9ydGxpc3RbaV0pID09IDApCisJCQlyZXR1cm4gMDsKKwkJZGV2LT5pcnEgPSBpcnE7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyIC0gTklDX09GRlNFVCwgSFBfSU9fRVhURU5UKTsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGhwX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwlpbnQgZXJyOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwllcnIgPSBkb19ocF9wcm9iZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwljbGVhbnVwX2NhcmQoZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgaHBfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJaW50IGksIHJldHZhbCwgYm9hcmRfaWQsIHdvcmRtb2RlOworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBIUF9JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIENoZWNrIGZvciB0aGUgSFAgcGh5c2ljYWwgYWRkcmVzcywgMDggMDAgMDkgeHggeHggeHguICovCisJLyogVGhpcyByZWFsbHkgaXNuJ3QgZ29vZCBlbm91Z2g6IHdlIG1heSBwaWNrIHVwIEhQIExBTkNFIGJvYXJkcworCSAgIGFsc28hICBBdm9pZCB0aGUgbGFuY2UgMHg1NzU3IHNpZ25hdHVyZS4gKi8KKwlpZiAoaW5iKGlvYWRkcikgIT0gMHgwOAorCQl8fCBpbmIoaW9hZGRyKzEpICE9IDB4MDAKKwkJfHwgaW5iKGlvYWRkcisyKSAhPSAweDA5CisJCXx8IGluYihpb2FkZHIrMTQpID09IDB4NTcpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU2V0IHVwIHRoZSBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZSBib2FyZCBJRC4KKwkgICBJZiB5b3UgaGF2ZSBhZGRpdGlvbmFsIG1hcHBpbmdzLCBwbGVhc2UgbWFpbCB0aGVtIHRvIG1lIC1kamIuICovCisJaWYgKChib2FyZF9pZCA9IGluYihpb2FkZHIgKyBIUF9JRCkpICYgMHg4MCkgeworCQluYW1lID0gIkhQMjcyNDciOworCQl3b3JkbW9kZSA9IDE7CisJfSBlbHNlIHsKKwkJbmFtZSA9ICJIUDI3MjUwIjsKKwkJd29yZG1vZGUgPSAwOworCX0KKworCWlmIChlaV9kZWJ1ZyAgJiYgIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayh2ZXJzaW9uKTsKKworCXByaW50aygiJXM6ICVzIChJRCAlMDJ4KSBhdCAlIzN4LCIsIGRldi0+bmFtZSwgbmFtZSwgYm9hcmRfaWQsIGlvYWRkcik7CisKKwlmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKQorCQlwcmludGsoIiAlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgaSkpOworCisJLyogU25hcmYgdGhlIGludGVycnVwdCBub3cuICBTb21lZGF5IHRoaXMgY291bGQgYmUgbW92ZWQgdG8gb3BlbigpLiAqLworCWlmIChkZXYtPmlycSA8IDIpIHsKKwkJaW50IGlycV8xNmxpc3RbXSA9IHsgMTEsIDEwLCA1LCAzLCA0LCA3LCA5LCAwfTsKKwkJaW50IGlycV84bGlzdFtdID0geyA3LCA1LCAzLCA0LCA5LCAwfTsKKwkJaW50ICppcnFwID0gd29yZG1vZGUgPyBpcnFfMTZsaXN0IDogaXJxXzhsaXN0OworCQlkbyB7CisJCQlpbnQgaXJxID0gKmlycXA7CisJCQlpZiAocmVxdWVzdF9pcnEgKGlycSwgTlVMTCwgMCwgImJvZ3VzIiwgTlVMTCkgIT0gLUVCVVNZKSB7CisJCQkJdW5zaWduZWQgbG9uZyBjb29raWUgPSBwcm9iZV9pcnFfb24oKTsKKwkJCQkvKiBUd2lua2xlIHRoZSBpbnRlcnJ1cHQsIGFuZCBjaGVjayBpZiBpdCdzIHNlZW4uICovCisJCQkJb3V0Yl9wKGlycW1hcFtpcnFdIHwgSFBfUlVOLCBpb2FkZHIgKyBIUF9DT05GSUdVUkUpOworCQkJCW91dGJfcCggMHgwMCB8IEhQX1JVTiwgaW9hZGRyICsgSFBfQ09ORklHVVJFKTsKKwkJCQlpZiAoaXJxID09IHByb2JlX2lycV9vZmYoY29va2llKQkJIC8qIEl0J3MgYSBnb29kIElSUSBsaW5lISAqLworCQkJCQkmJiByZXF1ZXN0X2lycSAoaXJxLCBlaV9pbnRlcnJ1cHQsIDAsIERSVl9OQU1FLCBkZXYpID09IDApIHsKKwkJCQkJcHJpbnRrKCIgc2VsZWN0aW5nIElSUSAlZC5cbiIsIGlycSk7CisJCQkJCWRldi0+aXJxID0gKmlycXA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoKisraXJxcCk7CisJCWlmICgqaXJxcCA9PSAwKSB7CisJCQlwcmludGsoIiBubyBmcmVlIElSUSBsaW5lcy5cbiIpOworCQkJcmV0dmFsID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZGV2LT5pcnEgPT0gMikKKwkJCWRldi0+aXJxID0gOTsKKwkJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCAwLCBEUlZfTkFNRSwgZGV2KSkpIHsKKwkJCXByaW50ayAoIiB1bmFibGUgdG8gZ2V0IElSUSAlZC5cbiIsIGRldi0+aXJxKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogU2V0IHRoZSBiYXNlIGFkZHJlc3MgdG8gcG9pbnQgdG8gdGhlIE5JQywgbm90IHRoZSAicmVhbCIgYmFzZSEgKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkciArIE5JQ19PRkZTRVQ7CisJZGV2LT5vcGVuID0gJmhwX29wZW47CisJZGV2LT5zdG9wID0gJmhwX2Nsb3NlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworI2VuZGlmCisKKwllaV9zdGF0dXMubmFtZSA9IG5hbWU7CisJZWlfc3RhdHVzLndvcmQxNiA9IHdvcmRtb2RlOworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gSFBfU1RBUlRfUEc7CisJZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBIUF9TVEFSVF9QRyArIFRYX1BBR0VTOworCWVpX3N0YXR1cy5zdG9wX3BhZ2UgPSB3b3JkbW9kZSA/IEhQXzE2QlNUT1BfUEcgOiBIUF84QlNUT1BfUEc7CisKKwllaV9zdGF0dXMucmVzZXRfODM5MCA9ICZocF9yZXNldF84MzkwOworCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmaHBfZ2V0XzgzOTBfaGRyOworCWVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZocF9ibG9ja19pbnB1dDsKKwllaV9zdGF0dXMuYmxvY2tfb3V0cHV0ID0gJmhwX2Jsb2NrX291dHB1dDsKKwlocF9pbml0X2NhcmQoZGV2KTsKKworCXJldHVybiAwOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgSFBfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitocF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZWlfb3BlbihkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitocF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVpX2Nsb3NlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitocF9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGhwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkciAtIE5JQ19PRkZTRVQ7CisJaW50IHNhdmVkX2NvbmZpZyA9IGluYl9wKGhwX2Jhc2UgKyBIUF9DT05GSUdVUkUpOworCisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldHRpbmcgdGhlIDgzOTAgdGltZT0lbGQuLi4iLCBqaWZmaWVzKTsKKwlvdXRiX3AoMHgwMCwgaHBfYmFzZSArIEhQX0NPTkZJR1VSRSk7CisJZWlfc3RhdHVzLnR4aW5nID0gMDsKKwkvKiBQYXVzZSBqdXN0IGEgZmV3IGN5Y2xlcyBmb3IgdGhlIGhhcmR3YXJlIHJlc2V0IHRvIHRha2UgcGxhY2UuICovCisJdWRlbGF5KDUpOworCisJb3V0Yl9wKHNhdmVkX2NvbmZpZywgaHBfYmFzZSArIEhQX0NPTkZJR1VSRSk7CisJdWRlbGF5KDUpOworCisJaWYgKChpbmJfcChocF9iYXNlK05JQ19PRkZTRVQrRU4wX0lTUikgJiBFTklTUl9SRVNFVCkgPT0gMCkKKwkJcHJpbnRrKCIlczogaHBfcmVzZXRfODM5MCgpIGRpZCBub3QgY29tcGxldGUuXG4iLCBkZXYtPm5hbWUpOworCisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCI4MzkwIHJlc2V0IGRvbmUgKCVsZCkuIiwgamlmZmllcyk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAoraHBfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpCit7CisJaW50IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHNhdmVkX2NvbmZpZyA9IGluYl9wKG5pY19iYXNlIC0gTklDX09GRlNFVCArIEhQX0NPTkZJR1VSRSk7CisKKwlvdXRiX3Aoc2F2ZWRfY29uZmlnIHwgSFBfREFUQU9OLCBuaWNfYmFzZSAtIE5JQ19PRkZTRVQgKyBIUF9DT05GSUdVUkUpOworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UpOworCW91dGJfcChzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpLCBuaWNfYmFzZSArIEVOMF9SQ05UTE8pOworCW91dGJfcCgwLCBuaWNfYmFzZSArIEVOMF9SQ05USEkpOworCW91dGJfcCgwLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOwkvKiBPbiBwYWdlIGJvdW5kYXJ5ICovCisJb3V0Yl9wKHJpbmdfcGFnZSwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19iYXNlKTsKKworCWlmIChlaV9zdGF0dXMud29yZDE2KQorCSAgaW5zdyhuaWNfYmFzZSAtIE5JQ19PRkZTRVQgKyBIUF9EQVRBUE9SVCwgaGRyLCBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpPj4xKTsKKwllbHNlCisJICBpbnNiKG5pY19iYXNlIC0gTklDX09GRlNFVCArIEhQX0RBVEFQT1JULCBoZHIsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworCisJb3V0Yl9wKHNhdmVkX2NvbmZpZyAmICh+SFBfREFUQU9OKSwgbmljX2Jhc2UgLSBOSUNfT0ZGU0VUICsgSFBfQ09ORklHVVJFKTsKK30KKworLyogQmxvY2sgaW5wdXQgYW5kIG91dHB1dCwgc2ltaWxhciB0byB0aGUgQ3J5bndyIHBhY2tldCBkcml2ZXIuIElmIHlvdSBhcmUKKyAgIHBvcnRpbmcgdG8gYSBuZXcgZXRoZXJjYXJkIGxvb2sgYXQgdGhlIHBhY2tldCBkcml2ZXIgc291cmNlIGZvciBoaW50cy4KKyAgIFRoZSBIUCBMQU4gZG9lc24ndCB1c2Ugc2hhcmVkIG1lbW9yeSAtLSB3ZSBwdXQgdGhlIHBhY2tldAorICAgb3V0IHRocm91Z2ggdGhlICJyZW1vdGUgRE1BIiBkYXRhcG9ydC4gKi8KKworc3RhdGljIHZvaWQKK2hwX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworCWludCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCWludCBzYXZlZF9jb25maWcgPSBpbmJfcChuaWNfYmFzZSAtIE5JQ19PRkZTRVQgKyBIUF9DT05GSUdVUkUpOworCWludCB4ZmVyX2NvdW50ID0gY291bnQ7CisJY2hhciAqYnVmID0gc2tiLT5kYXRhOworCisJb3V0Yl9wKHNhdmVkX2NvbmZpZyB8IEhQX0RBVEFPTiwgbmljX2Jhc2UgLSBOSUNfT0ZGU0VUICsgSFBfQ09ORklHVVJFKTsKKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIG5pY19iYXNlKTsKKwlvdXRiX3AoY291bnQgJiAweGZmLCBuaWNfYmFzZSArIEVOMF9SQ05UTE8pOworCW91dGJfcChjb3VudCA+PiA4LCBuaWNfYmFzZSArIEVOMF9SQ05USEkpOworCW91dGJfcChyaW5nX29mZnNldCAmIDB4ZmYsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisJb3V0Yl9wKHJpbmdfb2Zmc2V0ID4+IDgsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJb3V0Yl9wKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSk7CisJaWYgKGVpX3N0YXR1cy53b3JkMTYpIHsKKwkgIGluc3cobmljX2Jhc2UgLSBOSUNfT0ZGU0VUICsgSFBfREFUQVBPUlQsYnVmLGNvdW50Pj4xKTsKKwkgIGlmIChjb3VudCAmIDB4MDEpCisJCWJ1Zltjb3VudC0xXSA9IGluYihuaWNfYmFzZSAtIE5JQ19PRkZTRVQgKyBIUF9EQVRBUE9SVCksIHhmZXJfY291bnQrKzsKKwl9IGVsc2UgeworCQlpbnNiKG5pY19iYXNlIC0gTklDX09GRlNFVCArIEhQX0RBVEFQT1JULCBidWYsIGNvdW50KTsKKwl9CisJLyogVGhpcyBpcyBmb3IgdGhlIEFMUEhBIHZlcnNpb24gb25seSwgcmVtb3ZlIGZvciBsYXRlciByZWxlYXNlcy4gKi8KKwlpZiAoZWlfZGVidWcgPiAwKSB7CQkJLyogRE1BIHRlcm1pbmF0aW9uIGFkZHJlc3MgY2hlY2suLi4gKi8KKwkgIGludCBoaWdoID0gaW5iX3AobmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKwkgIGludCBsb3cgPSBpbmJfcChuaWNfYmFzZSArIEVOMF9SU0FSTE8pOworCSAgaW50IGFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkgIC8qIENoZWNrIG9ubHkgdGhlIGxvd2VyIDggYml0cyBzbyB3ZSBjYW4gaWdub3JlIHJpbmcgd3JhcC4gKi8KKwkgIGlmICgoKHJpbmdfb2Zmc2V0ICsgeGZlcl9jb3VudCkgJiAweGZmKSAhPSAoYWRkciAmIDB4ZmYpKQorCQlwcmludGsoIiVzOiBSWCB0cmFuc2ZlciBhZGRyZXNzIG1pc21hdGNoLCAlIzQuNHggdnMuICUjNC40eCAoYWN0dWFsKS5cbiIsCisJCQkgICBkZXYtPm5hbWUsIHJpbmdfb2Zmc2V0ICsgeGZlcl9jb3VudCwgYWRkcik7CisJfQorCW91dGJfcChzYXZlZF9jb25maWcgJiAofkhQX0RBVEFPTiksIG5pY19iYXNlIC0gTklDX09GRlNFVCArIEhQX0NPTkZJR1VSRSk7Cit9CisKK3N0YXRpYyB2b2lkCitocF9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHN0YXJ0X3BhZ2UpCit7CisJaW50IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHNhdmVkX2NvbmZpZyA9IGluYl9wKG5pY19iYXNlIC0gTklDX09GRlNFVCArIEhQX0NPTkZJR1VSRSk7CisKKwlvdXRiX3Aoc2F2ZWRfY29uZmlnIHwgSFBfREFUQU9OLCBuaWNfYmFzZSAtIE5JQ19PRkZTRVQgKyBIUF9DT05GSUdVUkUpOworCS8qIFJvdW5kIHRoZSBjb3VudCB1cCBmb3Igd29yZCB3cml0ZXMuCURvIHdlIG5lZWQgdG8gZG8gdGhpcz8KKwkgICBXaGF0IGVmZmVjdCB3aWxsIGFuIG9kZCBieXRlIGNvdW50IGhhdmUgb24gdGhlIDgzOTA/CisJICAgSSBzaG91bGQgY2hlY2sgc29tZWRheS4gKi8KKwlpZiAoZWlfc3RhdHVzLndvcmQxNiAmJiAoY291bnQgJiAweDAxKSkKKwkgIGNvdW50Kys7CisJLyogV2Ugc2hvdWxkIGFscmVhZHkgYmUgaW4gcGFnZSAwLCBidXQgdG8gYmUgc2FmZS4uLiAqLworCW91dGJfcChFODM5MF9QQUdFMCtFODM5MF9TVEFSVCtFODM5MF9OT0RNQSwgbmljX2Jhc2UpOworCisjaWZkZWYgTkU4MzkwX1JXX0JVR0ZJWAorCS8qIEhhbmRsZSB0aGUgcmVhZC1iZWZvcmUtd3JpdGUgYnVnIHRoZSBzYW1lIHdheSBhcyB0aGUKKwkgICBDcnlud3IgcGFja2V0IGRyaXZlciAtLSB0aGUgTmF0U2VtaSBtZXRob2QgZG9lc24ndCB3b3JrLiAqLworCW91dGJfcCgweDQyLCBuaWNfYmFzZSArIEVOMF9SQ05UTE8pOworCW91dGJfcCgwLAluaWNfYmFzZSArIEVOMF9SQ05USEkpOworCW91dGJfcCgweGZmLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOworCW91dGJfcCgweDAwLCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworI2RlZmluZSBORV9DTUQJIAkweDAwCisJb3V0Yl9wKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisJLyogTWFrZSBjZXJ0YWluIHRoYXQgdGhlIGR1bW15IHJlYWQgaGFzIG9jY3VycmVkLiAqLworCWluYl9wKDB4NjEpOworCWluYl9wKDB4NjEpOworI2VuZGlmCisKKwlvdXRiX3AoY291bnQgJiAweGZmLCBuaWNfYmFzZSArIEVOMF9SQ05UTE8pOworCW91dGJfcChjb3VudCA+PiA4LAkgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AoMHgwMCwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwlvdXRiX3Aoc3RhcnRfcGFnZSwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKworCW91dGJfcChFODM5MF9SV1JJVEUrRTgzOTBfU1RBUlQsIG5pY19iYXNlKTsKKwlpZiAoZWlfc3RhdHVzLndvcmQxNikgeworCQkvKiBVc2UgdGhlICdyZXAnIHNlcXVlbmNlIGZvciAxNiBiaXQgYm9hcmRzLiAqLworCQlvdXRzdyhuaWNfYmFzZSAtIE5JQ19PRkZTRVQgKyBIUF9EQVRBUE9SVCwgYnVmLCBjb3VudD4+MSk7CisJfSBlbHNlIHsKKwkJb3V0c2IobmljX2Jhc2UgLSBOSUNfT0ZGU0VUICsgSFBfREFUQVBPUlQsIGJ1ZiwgY291bnQpOworCX0KKworCS8qIERPTidUIGNoZWNrIGZvciAnaW5iX3AoRU4wX0lTUikgJiBFTklTUl9SREMnIGhlcmUgLS0gaXQncyBicm9rZW4hICovCisKKwkvKiBUaGlzIGlzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCByZW1vdmUgZm9yIGxhdGVyIHJlbGVhc2VzLiAqLworCWlmIChlaV9kZWJ1ZyA+IDApIHsJCQkvKiBETUEgdGVybWluYXRpb24gYWRkcmVzcyBjaGVjay4uLiAqLworCSAgaW50IGhpZ2ggPSBpbmJfcChuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCSAgaW50IGxvdyAgPSBpbmJfcChuaWNfYmFzZSArIEVOMF9SU0FSTE8pOworCSAgaW50IGFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkgIGlmICgoc3RhcnRfcGFnZSA8PCA4KSArIGNvdW50ICE9IGFkZHIpCisJCXByaW50aygiJXM6IFRYIFRyYW5zZmVyIGFkZHJlc3MgbWlzbWF0Y2gsICUjNC40eCB2cy4gJSM0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgKHN0YXJ0X3BhZ2UgPDwgOCkgKyBjb3VudCwgYWRkcik7CisJfQorCW91dGJfcChzYXZlZF9jb25maWcgJiAofkhQX0RBVEFPTiksIG5pY19iYXNlIC0gTklDX09GRlNFVCArIEhQX0NPTkZJR1VSRSk7CisJcmV0dXJuOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgZXRoZXJjYXJkIGlmIHNvbWV0aGluZyBzY3Jld3MgdXAuICovCitzdGF0aWMgdm9pZAoraHBfaW5pdF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlycSA9IGRldi0+aXJxOworCU5TODM5MF9pbml0KGRldiwgMCk7CisJb3V0Yl9wKGlycW1hcFtpcnEmMHgwZl0gfCBIUF9SVU4sCisJCSAgIGRldi0+YmFzZV9hZGRyIC0gTklDX09GRlNFVCArIEhQX0NPTkZJR1VSRSk7CisJcmV0dXJuOworfQorCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIE1BWF9IUF9DQVJEUwk0CS8qIE1heCBudW1iZXIgb2YgSFAgY2FyZHMgcGVyIG1vZHVsZSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfaHBbTUFYX0hQX0NBUkRTXTsKK3N0YXRpYyBpbnQgaW9bTUFYX0hQX0NBUkRTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF9IUF9DQVJEU107CisKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGJhc2UgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIG51bWJlcihzKSAoYXNzaWduZWQpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhQIFBDLUxBTiBJU0EgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFRoaXMgaXMgc2V0IHVwIHNvIHRoYXQgb25seSBhIHNpbmdsZSBhdXRvcHJvYmUgdGFrZXMgcGxhY2UgcGVyIGNhbGwuCitJU0EgZGV2aWNlIGF1dG9wcm9iZXMgb24gYSBydW5uaW5nIG1hY2hpbmUgYXJlIG5vdCByZWNvbW1lbmRlZC4gKi8KK2ludAoraW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0hQX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCWlmIChpb1t0aGlzX2Rldl0gPT0gMCkgIHsKKwkJCWlmICh0aGlzX2RldiAhPSAwKSBicmVhazsgLyogb25seSBhdXRvcHJvYmUgMXN0IG9uZSAqLworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJocC5jOiBQcmVzZW50bHkgYXV0b3Byb2JpbmcgKG5vdCByZWNvbW1lbmRlZCkgZm9yIGEgc2luZ2xlIGNhcmQuXG4iKTsKKwkJfQorCQlkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwkJaWYgKCFkZXYpCisJCQlicmVhazsKKwkJZGV2LT5pcnEgPSBpcnFbdGhpc19kZXZdOworCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKKwkJaWYgKGRvX2hwX3Byb2JlKGRldikgPT0gMCkgeworCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCQlkZXZfaHBbZm91bmQrK10gPSBkZXY7CisJCQkJY29udGludWU7CisJCQl9CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJfQorCQlmcmVlX25ldGRldihkZXYpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJocC5jOiBObyBIUCBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsIGlvW3RoaXNfZGV2XSk7CisJCWJyZWFrOworCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiAtRU5YSU87Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0hQX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaHBbdGhpc19kZXZdOworCQlpZiAoZGV2KSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorfQorI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAxMDAuYyBiL2RyaXZlcnMvbmV0L2hwMTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiMTcwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hwMTAwLmMKQEAgLTAsMCArMSwzMTE1IEBACisvKgorKiogaHAxMDAuYyAKKyoqIEhQIENBU0NBREUgQXJjaGl0ZWN0dXJlIERyaXZlciBmb3IgMTAwVkctQW55TGFuIE5ldHdvcmsgQWRhcHRlcnMKKyoqCisqKiAkSWQ6IGhwMTAwLmMsdiAxLjU4IDIwMDEvMDkvMjQgMTg6MDM6MDEgcGVyZXggRXhwIHBlcmV4ICQKKyoqCisqKiBCYXNlZCBvbiB0aGUgSFAxMDAgZHJpdmVyIHdyaXR0ZW4gYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBqY3UuY3o+CisqKiBFeHRlbmRlZCBmb3IgbmV3IGJ1c21hc3RlciBjYXBhYmxlIGNoaXBzZXRzIGJ5IAorKiogU2llZ2ZyaWVkICJGcmllZGVyIiBMb2VmZmxlciAoZGcxc2VrKSA8ZmxvZWZmQG1hdGhlbWF0aWsudW5pLXN0dXR0Z2FydC5kZT4KKyoqCisqKiBNYWludGFpbmVkIGJ5OiBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisqKiAKKyoqIFRoaXMgZHJpdmVyIGhhcyBvbmx5IGJlZW4gdGVzdGVkIHdpdGgKKyoqIC0tIEhQIEoyNTg1QiAxMC8xMDAgTWJpdC9zIFBDSSBCdXNtYXN0ZXIKKyoqIC0tIEhQIEoyNTg1QSAxMC8xMDAgTWJpdC9zIFBDSSAKKyoqIC0tIEhQIEoyOTcwICAxMCBNYml0L3MgUENJIENvbWJvIDEwYmFzZS1UL0JOQworKiogLS0gSFAgSjI5NzMgIDEwIE1iaXQvcyBQQ0kgMTBiYXNlLVQKKyoqIC0tIEhQIEoyNTczICAxMC8xMDAgSVNBCisqKiAtLSBDb21wZXggUmVhZHlMaW5rIEVORVQxMDAtVkc0ICAxMC8xMDAgTWJpdC9zIFBDSSAvIEVJU0EKKyoqIC0tIENvbXBleCBGcmVlZG9tTGluZSAxMDAvVkcgIDEwLzEwMCBNYml0L3MgSVNBIC8gRUlTQSAvIFBDSQorKiogCisqKiBidXQgaXQgc2hvdWxkIGFsc28gd29yayB3aXRoIHRoZSBvdGhlciBDQVNDQURFIGJhc2VkIGFkYXB0ZXJzLgorKioKKyoqIFRPRE86CisqKiAgICAgICAtICBKMjU3MyBzZWVtcyB0byBoYW5nIHNvbWV0aW1lcyB3aGVuIGluIHNoYXJlZCBtZW1vcnkgbW9kZS4KKyoqICAgICAgIC0gIE1vZGUgZm9yIFByaW9yaXR5IFRYCisqKiAgICAgICAtICBDaGVjayBQQ0kgcmVnaXN0ZXJzLCBwZXJmb3JtYW5jZSBtaWdodCBiZSBpbXByb3ZlZD8KKyoqICAgICAgIC0gIFRvIHJlZHVjZSBpbnRlcnJ1cHQgbG9hZCBpbiBidXNtYXN0ZXIsIG9uZSBjb3VsZCBzd2l0Y2ggb2ZmCisqKiAgICAgICAgICB0aGUgaW50ZXJydXB0cyB0aGF0IGFyZSB1c2VkIHRvIHJlZmlsbCB0aGUgcXVldWVzIHdoZW5ldmVyIHRoZQorKiogICAgICAgICAgcXVldWVzIGFyZSBmaWxsZWQgdXAgdG8gbW9yZSB0aGFuIGEgY2VydGFpbiB0aHJlc2hvbGQuCisqKiAgICAgICAtICBzb21lIHVwZGF0ZXMgZm9yIEVJU0EgdmVyc2lvbiBvZiBjYXJkCisqKgorKioKKyoqICAgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyoqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyoqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyoqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoqCisqKiAgIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqKgorKiogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKiAxLjU3YyAtPiAxLjU4CisqKiAgIC0gdXNlZCBpbmRlbnQgdG8gY2hhbmdlIGNvZGluZy1zdHlsZQorKiogICAtIGFkZGVkIEtUSSBEUC0yMDAgRUlTQSBJRAorKiogICAtIGlvcmVtYXAgaXMgYWxzbyB1c2VkIGZvciBsb3cgKDwxTUIpIG1lbW9yeSAobXVsdGktYXJjaGl0ZWN0dXJlIHN1cHBvcnQpCisqKgorKiogMS41N2IgLT4gMS41N2MgLSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyoqICAgLSByZWxlYXNlIHJlc291cmNlcyBvbiBmYWlsdXJlIGluIGluaXRfbW9kdWxlCisqKgorKiogMS41NyAtPiAxLjU3YiAtIEplYW4gSUkKKyoqICAgLSBmaXggc3BpbmxvY2tzLCBTTVAgaXMgbm93IHdvcmtpbmcgIQorKioKKyoqIDEuNTYgLT4gMS41NworKiogICAtIHVwZGF0ZXMgZm9yIG5ldyBQQ0kgaW50ZXJmYWNlIGZvciAyLjEga2VybmVscworKioKKyoqIDEuNTUgLT4gMS41NgorKiogICAtIHJlbW92ZWQgcHJpbnRrIGluIG1pc2MuIGludGVycnVwdCBhbmQgdXBkYXRlIHN0YXRpc3RpY3MgdG8gYWxsb3cKKyoqICAgICBtb25pdG9yaW5nIG9mIGNhcmQgc3RhdHVzCisqKiAgIC0gdGltaW5nIGNoYW5nZXMgaW4geG1pdCByb3V0aW5lcywgcmVsb2dpbiB0byAxMDBWRyBodWIgYWRkZWQgd2hlbgorKiogICAgIGRyaXZlciBkb2VzIHJlc2V0CisqKiAgIC0gaW5jbHVkZWQgZml4IGZvciBDb21wZXggRnJlZWRvbUxpbmUgUENJIGFkYXB0ZXIKKyoqIAorKiogMS41NCAtPiAxLjU1CisqKiAgIC0gZml4ZWQgYmFkIGluaXRpYWxpemF0aW9uIGluIGluaXRfbW9kdWxlCisqKiAgIC0gYWRkZWQgQ29tcGV4IEZyZWVkb21MaW5lIGFkYXB0ZXIKKyoqICAgLSBzb21lIGZpeGVzIGluIGNhcmQgaW5pdGlhbGl6YXRpb24KKyoqCisqKiAxLjUzIC0+IDEuNTQKKyoqICAgLSBhZGRlZCBoYXJkd2FyZSBtdWx0aWNhc3QgZmlsdGVyIHN1cHBvcnQgKGRvZXNuJ3Qgd29yaykKKyoqICAgLSBsaXR0bGUgY2hhbmdlcyBpbiBocDEwMF9zZW5zZV9sYW4gcm91dGluZSAKKyoqICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIENvYXggYW5kIEFVSSAoSjI5NzApCisqKiAgIC0gZml4IGZvciBtdWx0aXBsZSBjYXJkcyBhbmQgaHAxMDBfbW9kZSBwYXJhbWV0ZXIgKGluc21vZCkKKyoqICAgLSBmaXggZm9yIHNoYXJlZCBJUlEgCisqKgorKiogMS41MiAtPiAxLjUzCisqKiAgIC0gZml4ZWQgYnVnIGluIG11bHRpY2FzdCBzdXBwb3J0CisqKgorKi8KKworI2RlZmluZSBIUDEwMF9ERUZBVUxUX1BSSU9SSVRZX1RYIDAKKworI3VuZGVmIEhQMTAwX0RFQlVHCisjdW5kZWYgSFAxMDBfREVCVUdfQgkJLyogVHJhY2UgICovCisjdW5kZWYgSFAxMDBfREVCVUdfQk0JCS8qIERlYnVnIGJ1c21hc3RlciBjb2RlIChQREwgc3R1ZmYpICovCisKKyN1bmRlZiBIUDEwMF9ERUJVR19UUkFJTklORwkvKiBEZWJ1ZyBsb2dpbi10by1odWIgcHJvY2VkdXJlICovCisjdW5kZWYgSFAxMDBfREVCVUdfVFgKKyN1bmRlZiBIUDEwMF9ERUJVR19JUlEKKyN1bmRlZiBIUDEwMF9ERUJVR19SWAorCisjdW5kZWYgSFAxMDBfTVVMVElDQVNUX0ZJTFRFUgkvKiBOZWVkIHRvIGJlIGRlYnVnZ2VkLi4uICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZWlzYS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgkvKiBmb3IgQ09ORklHX1BDSSAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJocDEwMC5oIgorCisvKgorICogIGRlZmluZXMKKyAqLworCisjZGVmaW5lIEhQMTAwX0JVU19JU0EgICAgIDAKKyNkZWZpbmUgSFAxMDBfQlVTX0VJU0EgICAgMQorI2RlZmluZSBIUDEwMF9CVVNfUENJICAgICAyCisKKyNkZWZpbmUgSFAxMDBfUkVHSU9OX1NJWkUJMHgyMAkvKiBmb3IgaW9wb3J0cyAqLworI2RlZmluZSBIUDEwMF9TSUdfTEVOCQk4CS8qIHNhbWUgYXMgRUlTQV9TSUdfTEVOICovCisKKyNkZWZpbmUgSFAxMDBfTUFYX1BBQ0tFVF9TSVpFCSgxNTM2KzQpCisjZGVmaW5lIEhQMTAwX01JTl9QQUNLRVRfU0laRQk2MAorCisjaWZuZGVmIEhQMTAwX0RFRkFVTFRfUlhfUkFUSU8KKy8qIGRlZmF1bHQgLSA3NSUgb25ib2FyZCBtZW1vcnkgb24gdGhlIGNhcmQgYXJlIHVzZWQgZm9yIFJYIHBhY2tldHMgKi8KKyNkZWZpbmUgSFAxMDBfREVGQVVMVF9SWF9SQVRJTwk3NQorI2VuZGlmCisKKyNpZm5kZWYgSFAxMDBfREVGQVVMVF9QUklPUklUWV9UWAorLyogZGVmYXVsdCAtIGRvbid0IGVuYWJsZSB0cmFuc21pdCBvdXRnb2luZyBwYWNrZXRzIGFzIHByaW9yaXR5ICovCisjZGVmaW5lIEhQMTAwX0RFRkFVTFRfUFJJT1JJVFlfVFggMAorI2VuZGlmCisKKy8qCisgKiAgc3RydWN0dXJlcworICovCisKK3N0cnVjdCBocDEwMF9wcml2YXRlIHsKKwlzcGlubG9ja190IGxvY2s7CisJY2hhciBpZFtIUDEwMF9TSUdfTEVOXTsKKwl1X3Nob3J0IGNoaXA7CisJdV9zaG9ydCBzb2Z0X21vZGVsOworCXVfaW50IG1lbW9yeV9zaXplOworCXVfaW50IHZpcnRfbWVtb3J5X3NpemU7CisJdV9zaG9ydCByeF9yYXRpbzsJLyogMSAtIDk5ICovCisJdV9zaG9ydCBwcmlvcml0eV90eDsJLyogIT0gMCAtIHByaW9yaXR5IHR4ICovCisJdV9zaG9ydCBtb2RlOwkJLyogUElPLCBTaGFyZWQgTWVtIG9yIEJ1c21hc3RlciAqLworCXVfY2hhciBidXM7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJc2hvcnQgbWVtX21hcHBlZDsJLyogbWVtb3J5IG1hcHBlZCBhY2Nlc3MgKi8KKwl2b2lkIF9faW9tZW0gKm1lbV9wdHJfdmlydDsJLyogdmlydHVhbCBtZW1vcnkgbWFwcGVkIGFyZWEsIG1heWJlIE5VTEwgKi8KKwl1bnNpZ25lZCBsb25nIG1lbV9wdHJfcGh5czsJLyogcGh5c2ljYWwgbWVtb3J5IG1hcHBlZCBhcmVhICovCisJc2hvcnQgbGFuX3R5cGU7CQkvKiAxME1iL3MsIDEwME1iL3Mgb3IgLTEgKGVycm9yKSAqLworCWludCBodWJfc3RhdHVzOwkJLyogd2FzIGxvZ2luIHRvIGh1YiBzdWNjZXNzZnVsPyAqLworCXVfY2hhciBtYWMxX21vZGU7CisJdV9jaGFyIG1hYzJfbW9kZTsKKwl1X2NoYXIgaGFzaF9ieXRlc1s4XTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCS8qIFJpbmdzIGZvciBidXNtYXN0ZXIgbW9kZTogKi8KKwlocDEwMF9yaW5nX3QgKnJ4cmhlYWQ7CS8qIEhlYWQgKG9sZGVzdCkgaW5kZXggaW50byByeHJpbmcgKi8KKwlocDEwMF9yaW5nX3QgKnJ4cnRhaWw7CS8qIFRhaWwgKG5ld2VzdCkgaW5kZXggaW50byByeHJpbmcgKi8KKwlocDEwMF9yaW5nX3QgKnR4cmhlYWQ7CS8qIEhlYWQgKG9sZGVzdCkgaW5kZXggaW50byB0eHJpbmcgKi8KKwlocDEwMF9yaW5nX3QgKnR4cnRhaWw7CS8qIFRhaWwgKG5ld2VzdCkgaW5kZXggaW50byB0eHJpbmcgKi8KKworCWhwMTAwX3JpbmdfdCByeHJpbmdbTUFYX1JYX1BETF07CisJaHAxMDBfcmluZ190IHR4cmluZ1tNQVhfVFhfUERMXTsKKworCXVfaW50ICpwYWdlX3ZhZGRyX2FsZ247CS8qIEFsaWduZWQgdmlydHVhbCBhZGRyZXNzIG9mIGFsbG9jYXRlZCBwYWdlICovCisJdV9sb25nIHdoYXRldmVyX29mZnNldDsJLyogT2Zmc2V0IHRvIGJ1cy9waHlzL2RtYSBhZGRyZXNzICovCisJaW50IHJ4cmNvbW1pdDsJCS8qICMgUnggUERMcyBjb21taXRlZCB0byBhZGFwdGVyICovCisJaW50IHR4cmNvbW1pdDsJCS8qICMgVHggUERMcyBjb21taXRlZCB0byBhZGFwdGVyICovCit9OworCisvKgorICogIHZhcmlhYmxlcworICovCitzdGF0aWMgY29uc3QgY2hhciAqaHAxMDBfaXNhX3RibFtdID0geworCSJIV1BGMTUwIiwgLyogSFAgSjI1NzMgcmV2IEEgKi8KKwkiSFdQMTk1MCIsIC8qIEhQIEoyNTczICovCit9OworCisjaWZkZWYgQ09ORklHX0VJU0EKK3N0YXRpYyBzdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgaHAxMDBfZWlzYV90YmxbXSA9IHsKKwl7ICJIV1BGMTgwIiB9LCAvKiBIUCBKMjU3NyByZXYgQSAqLworCXsgIkhXUDE5MjAiIH0sIC8qIEhQIDI3MjQ4QiAqLworCXsgIkhXUDE5NDAiIH0sIC8qIEhQIEoyNTc3ICovCisJeyAiSFdQMTk5MCIgfSwgLyogSFAgSjI1NzcgKi8KKwl7ICJDUFgwMzAxIiB9LCAvKiBSZWFkeUxpbmsgRU5FVDEwMC1WRzQgKi8KKwl7ICJDUFgwNDAxIiB9LCAvKiBGcmVlZG9tTGluZSAxMDAvVkcgKi8KKwl7ICIiIH0JICAgICAgIC8qIE1hbmRhdG9yeSBmaW5hbCBlbnRyeSAhICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShlaXNhLCBocDEwMF9laXNhX3RibCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBocDEwMF9wY2lfdGJsW10gPSB7CisJe1BDSV9WRU5ET1JfSURfSFAsIFBDSV9ERVZJQ0VfSURfSFBfSjI1ODVBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCisJe1BDSV9WRU5ET1JfSURfSFAsIFBDSV9ERVZJQ0VfSURfSFBfSjI1ODVCLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCisJe1BDSV9WRU5ET1JfSURfSFAsIFBDSV9ERVZJQ0VfSURfSFBfSjI5NzBBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCisJe1BDSV9WRU5ET1JfSURfSFAsIFBDSV9ERVZJQ0VfSURfSFBfSjI5NzNBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCisJe1BDSV9WRU5ET1JfSURfQ09NUEVYLCBQQ0lfREVWSUNFX0lEX0NPTVBFWF9FTkVUMTAwVkc0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCisJe1BDSV9WRU5ET1JfSURfQ09NUEVYMiwgUENJX0RFVklDRV9JRF9DT01QRVgyXzEwMFZHLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCisvKgl7UENJX1ZFTkRPUl9JRF9LVEksIFBDSV9ERVZJQ0VfSURfS1RJX0RQMjAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sICovCisJe30JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBocDEwMF9wY2lfdGJsKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGhwMTAwX3J4X3JhdGlvID0gSFAxMDBfREVGQVVMVF9SWF9SQVRJTzsKK3N0YXRpYyBpbnQgaHAxMDBfcHJpb3JpdHlfdHggPSBIUDEwMF9ERUZBVUxUX1BSSU9SSVRZX1RYOworc3RhdGljIGludCBocDEwMF9tb2RlID0gMTsKKworbW9kdWxlX3BhcmFtKGhwMTAwX3J4X3JhdGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGhwMTAwX3ByaW9yaXR5X3R4LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGhwMTAwX21vZGUsIGludCwgMCk7CisKKy8qCisgKiAgcHJvdG90eXBlcworICovCisKK3N0YXRpYyBpbnQgaHAxMDBfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIsIHVfY2hhciBidXMsCisJCQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7CisKKworc3RhdGljIGludCBocDEwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBocDEwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaHAxMDBfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaHAxMDBfc3RhcnRfeG1pdF9ibShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaHAxMDBfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmhwMTAwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGhwMTAwX21pc2NfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaHAxMDBfdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaHAxMDBfY2xlYXJfc3RhdHMoc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwLCBpbnQgaW9hZGRyKTsKK3N0YXRpYyB2b2lkIGhwMTAwX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBocDEwMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBocDEwMF9zdGFydF9pbnRlcmZhY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBocDEwMF9zdG9wX2ludGVyZmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGhwMTAwX2xvYWRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfc2hvcnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQgaHAxMDBfc2Vuc2VfbGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBocDEwMF9sb2dpbl90b192Z19odWIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgdV9zaG9ydCBmb3JjZV9yZWxvZ2luKTsKK3N0YXRpYyBpbnQgaHAxMDBfZG93bl92Z19saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaHAxMDBfY2FzY2FkZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X3Nob3J0IGVuYWJsZSk7CitzdGF0aWMgdm9pZCBocDEwMF9CTV9zaHV0ZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGhwMTAwX21tdWluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBocDEwMF9pbml0X3BkbHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGhwMTAwX2luaXRfcnhwZGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICByZWdpc3RlciBocDEwMF9yaW5nX3QgKiByaW5ncHRyLAorCQkJICAgIHJlZ2lzdGVyIHVfaW50ICogcGRscHRyKTsKK3N0YXRpYyBpbnQgaHAxMDBfaW5pdF90eHBkbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHJlZ2lzdGVyIGhwMTAwX3JpbmdfdCAqIHJpbmdwdHIsCisJCQkgICAgcmVnaXN0ZXIgdV9pbnQgKiBwZGxwdHIpOworc3RhdGljIHZvaWQgaHAxMDBfcnhmaWxsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaHAxMDBfaHdpbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaHAxMDBfY2xlYW5fdHhyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2lmZGVmIEhQMTAwX0RFQlVHCitzdGF0aWMgdm9pZCBocDEwMF9SZWdpc3RlckR1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKworLyogQ29udmVyc2lvbiB0byBuZXcgUENJIEFQSSA6CisgKiBDb252ZXJ0IGFuIGFkZHJlc3MgaW4gYSBrZXJuZWwgYnVmZmVyIHRvIGEgYnVzL3BoeXMvZG1hIGFkZHJlc3MuCisgKiBUaGlzIHdvcmsgKm9ubHkqIGZvciBtZW1vcnkgZnJhZ21lbnRzIHBhcnQgb2YgbHAtPnBhZ2VfdmFkZHIsCisgKiBiZWNhdXNlIGl0IHdhcyBwcm9wZXJseSBETUEgYWxsb2NhdGVkIHZpYSBwY2lfYWxsb2NfY29uc2lzdGVudCgpLAorICogc28gd2UganVzdCBuZWVkIHRvICJyZXRyZWl2ZSIgdGhlIG9yaWdpbmFsIG1hcHBpbmcgdG8gYnVzL3BoeXMvZG1hCisgKiBhZGRyZXNzIC0gSmVhbiBJSSAqLworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IHZpcnRfdG9fd2hhdGV2ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyICogcHRyKQoreworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICgodV9sb25nKSBwdHIpICsgbHAtPndoYXRldmVyX29mZnNldDsKK30KKworc3RhdGljIGlubGluZSB1X2ludCBwZGxfbWFwX2RhdGEoc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwLCB2b2lkICpkYXRhKQoreworCXJldHVybiBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2RldiwgZGF0YSwgCisJCQkgICAgICBNQVhfRVRIRVJfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKK30KKworLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IHJlYWxseSBiZSBuZWVkZWQgaW4gYSBnb29kIGRlc2lnbi4uLiAqLworc3RhdGljIHZvaWQgd2FpdCh2b2lkKQoreworCW1kZWxheSgxKTsKK30KKworLyoKKyAqICBwcm9iZSBmdW5jdGlvbnMKKyAqICBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIC0gaWYgcG9zc2libGUgLSBhdm9pZCBkb2luZyB3cml0ZSBvcGVyYXRpb25zCisgKiAgc2luY2UgdGhpcyBjb3VsZCBjYXVzZSBwcm9ibGVtcyB3aGVuIHRoZSBjYXJkIGlzIG5vdCBpbnN0YWxsZWQuCisgKi8KKworLyoKKyAqIFJlYWQgYm9hcmQgaWQgYW5kIGNvbnZlcnQgdG8gc3RyaW5nLgorICogRWZmZWN0aXZlbHkgc2FtZSBjb2RlIGFzIGRlY29kZV9laXNhX3NpZworICovCitzdGF0aWMgX19kZXZpbml0IGNvbnN0IGNoYXIgKmhwMTAwX3JlYWRfaWQoaW50IGlvYWRkcikKK3sKKwlpbnQgaTsKKwlzdGF0aWMgY2hhciBzdHJbSFAxMDBfU0lHX0xFTl07CisJdW5zaWduZWQgY2hhciBzaWdbNF0sIHN1bTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgcmV2OworCisJaHAxMDBfcGFnZShJRF9NQUNfQUREUik7CisJc3VtID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXNpZ1tpXSA9IGhwMTAwX2luYihCT0FSRF9JRCArIGkpOworCQlzdW0gKz0gc2lnW2ldOworCX0KKworCXN1bSArPSBocDEwMF9pbmIoQk9BUkRfSUQgKyBpKTsKKwlpZiAoc3VtICE9IDB4ZmYpCisJCXJldHVybiBOVUxMOwkvKiBiYWQgY2hlY2tzdW0gKi8KKworICAgICAgICBzdHJbMF0gPSAoKHNpZ1swXSA+PiAyKSAmIDB4MWYpICsgKCdBJyAtIDEpOworICAgICAgICBzdHJbMV0gPSAoKChzaWdbMF0gJiAzKSA8PCAzKSB8IChzaWdbMV0gPj4gNSkpICsgKCdBJyAtIDEpOworICAgICAgICBzdHJbMl0gPSAoc2lnWzFdICYgMHgxZikgKyAoJ0EnIC0gMSk7CisgICAgICAgIHJldiA9IChzaWdbMl0gPDwgOCkgfCBzaWdbM107CisgICAgICAgIHNwcmludGYoc3RyICsgMywgIiUwNFgiLCByZXYpOworCisJcmV0dXJuIHN0cjsKK30KKworc3RhdGljIF9faW5pdCBpbnQgaHAxMDBfaXNhX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKQoreworCWNvbnN0IGNoYXIgKnNpZzsKKwlpbnQgaTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBIUDEwMF9SRUdJT05fU0laRSwgImhwMTAwIikpCisJCWdvdG8gZXJyOworCisJaWYgKGhwMTAwX2ludyhIV19JRCkgIT0gSFAxMDBfSFdfSURfQ0FTQ0FERSkgeworCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEhQMTAwX1JFR0lPTl9TSVpFKTsKKwkJZ290byBlcnI7CisJfQorCisJc2lnID0gaHAxMDBfcmVhZF9pZChpb2FkZHIpOworCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgSFAxMDBfUkVHSU9OX1NJWkUpOworCisJaWYgKHNpZyA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhwMTAwX2lzYV90YmwpOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoaHAxMDBfaXNhX3RibFtpXSwgc2lnKSkgCisJCQlicmVhazsKKworCX0KKworCWlmIChpIDwgQVJSQVlfU0laRShocDEwMF9pc2FfdGJsKSkKKwkJcmV0dXJuIGhwMTAwX3Byb2JlMShkZXYsIGlvYWRkciwgSFAxMDBfQlVTX0lTQSwgTlVMTCk7CisgZXJyOgorCXJldHVybiAtRU5PREVWOworCit9CisvKgorICogUHJvYmUgZm9yIElTQSBib2FyZC4KKyAqIEVJU0EgYW5kIFBDSSBhcmUgaGFuZGxlZCBieSBkZXZpY2UgaW5mcmFzdHJ1Y3R1cmUuCisgKi8KKworc3RhdGljIGludCAgX19pbml0IGhwMTAwX2lzYV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWRkcikKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCS8qIFByb2JlIGZvciBhIHNwZWNpZmljIElTQSBhZGRyZXNzICovCQkKKwlpZiAoYWRkciA+IDB4ZmYgJiYgYWRkciA8IDB4NDAwKQorCQllcnIgPSBocDEwMF9pc2FfcHJvYmUxKGRldiwgYWRkcik7CisKKwllbHNlIGlmIChhZGRyICE9IDApIAorCQllcnIgPSAtRU5YSU87CisKKwllbHNlIHsKKwkJLyogUHJvYmUgYWxsIElTQSBwb3NzaWJsZSBwb3J0IHJlZ2lvbnMgKi8KKwkJZm9yIChhZGRyID0gMHgxMDA7IGFkZHIgPCAweDQwMDsgYWRkciArPSAweDIwKSB7CisJCQllcnIgPSBocDEwMF9pc2FfcHJvYmUxKGRldiwgYWRkcik7CisJCQlpZiAoIWVycikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gZXJyOworfQorCisKKyNpZm5kZWYgTU9EVUxFCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBocDEwMF9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBocDEwMF9wcml2YXRlKSk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIwMCwgVFJBQ0UpOworCXByaW50aygiaHAxMDA6ICVzOiBwcm9iZVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfQorCisJZXJyID0gaHAxMDBfaXNhX3Byb2JlKGRldiwgZGV2LT5iYXNlX2FkZHIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7Cisgb3V0MToKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgSFAxMDBfUkVHSU9OX1NJWkUpOworIG91dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgaHAxMDBfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIsCisJCQkJICB1X2NoYXIgYnVzLCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKwljb25zdCBjaGFyICplaWQ7CisJdV9pbnQgY2hpcDsKKwl1X2NoYXIgdWM7CisJdV9pbnQgbWVtb3J5X3NpemUgPSAwLCB2aXJ0X21lbW9yeV9zaXplID0gMDsKKwl1X3Nob3J0IGxvY2FsX21vZGUsIGxzdzsKKwlzaG9ydCBtZW1fbWFwcGVkOworCXVuc2lnbmVkIGxvbmcgbWVtX3B0cl9waHlzOworCXZvaWQgX19pb21lbSAqbWVtX3B0cl92aXJ0OworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscDsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIwMSwgVFJBQ0UpOworCXByaW50aygiaHAxMDA6ICVzOiBwcm9iZTFcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qIG1lbW9yeSByZWdpb24gZm9yIHByb2dyYW1tZWQgaS9vICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEhQMTAwX1JFR0lPTl9TSVpFLCAiaHAxMDAiKSkKKwkJZ290byBvdXQxOworCisJaWYgKGhwMTAwX2ludyhIV19JRCkgIT0gSFAxMDBfSFdfSURfQ0FTQ0FERSkgCisJCWdvdG8gb3V0MjsKKworCWNoaXAgPSBocDEwMF9pbncoUEFHSU5HKSAmIEhQMTAwX0NISVBJRF9NQVNLOworI2lmZGVmIEhQMTAwX0RFQlVHCisJaWYgKGNoaXAgPT0gSFAxMDBfQ0hJUElEX1NIQVNUQSkKKwkJcHJpbnRrKCJocDEwMDogJXM6IFNoYXN0YSBDaGlwIGRldGVjdGVkLiAoVGhpcyBpcyBhIHByZSA4MDIuMTIgY2hpcClcbiIsIGRldi0+bmFtZSk7CisJZWxzZSBpZiAoY2hpcCA9PSBIUDEwMF9DSElQSURfUkFJTklFUikKKwkJcHJpbnRrKCJocDEwMDogJXM6IFJhaW5pZXIgQ2hpcCBkZXRlY3RlZC4gKFRoaXMgaXMgYSBwcmUgODAyLjEyIGNoaXApXG4iLCBkZXYtPm5hbWUpOworCWVsc2UgaWYgKGNoaXAgPT0gSFAxMDBfQ0hJUElEX0xBU1NFTikKKwkJcHJpbnRrKCJocDEwMDogJXM6IExhc3NlbiBDaGlwIGRldGVjdGVkLlxuIiwgZGV2LT5uYW1lKTsKKwllbHNlCisJCXByaW50aygiaHAxMDA6ICVzOiBXYXJuaW5nOiBVbmtub3duIENBU0NBREUgY2hpcCAoaWQ9MHglLjR4KS5cbiIsIGRldi0+bmFtZSwgY2hpcCk7CisjZW5kaWYKKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJZWlkID0gaHAxMDBfcmVhZF9pZChpb2FkZHIpOworCWlmIChlaWQgPT0gTlVMTCkgewkvKiBiYWQgY2hlY2tzdW0/ICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhwMTAwX3Byb2JlOiBiYWQgSUQgY2hlY2tzdW0gYXQgYmFzZSBwb3J0IDB4JXhcbiIsIGlvYWRkcik7CisJCWdvdG8gb3V0MjsKKwl9CisKKwlocDEwMF9wYWdlKElEX01BQ19BRERSKTsKKwlmb3IgKGkgPSB1YyA9IDA7IGkgPCA3OyBpKyspCisJCXVjICs9IGhwMTAwX2luYihMQU5fQUREUiArIGkpOworCWlmICh1YyAhPSAweGZmKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhwMTAwX3Byb2JlOiBiYWQgbGFuIGFkZHJlc3MgY2hlY2tzdW0gYXQgcG9ydCAweCV4KVxuIiwgaW9hZGRyKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBvdXQyOworCX0KKworCS8qIE1ha2Ugc3VyZSwgdGhhdCBhbGwgcmVnaXN0ZXJzIGFyZSBjb3JyZWN0bHkgdXBkYXRlZC4uLiAqLworCisJaHAxMDBfbG9hZF9lZXByb20oZGV2LCBpb2FkZHIpOworCXdhaXQoKTsKKworCS8qCisJICogRGV0ZXJtaW5lIGRyaXZlciBvcGVyYXRpb24gbW9kZQorCSAqCisJICogVXNlIHRoZSB2YXJpYWJsZSAiaHAxMDBfbW9kZSIgdXBvbiBpbnNtb2Qgb3IgYXMga2VybmVsIHBhcmFtZXRlciB0bworCSAqIGZvcmNlIGRyaXZlciBtb2RlczoKKwkgKiBocDEwMF9tb2RlPTEgLT4gZGVmYXVsdCwgdXNlIGJ1c21hc3RlciBtb2RlIGlmIGNvbmZpZ3VyZWQuCisJICogaHAxMDBfbW9kZT0yIC0+IGVuYWJsZSBzaGFyZWQgbWVtb3J5IG1vZGUgCisJICogaHAxMDBfbW9kZT0zIC0+IGZvcmNlIHVzZSBvZiBpL28gbWFwcGVkIG1vZGUuCisJICogaHAxMDBfbW9kZT00IC0+IHNhbWUgYXMgMSwgYnV0IHJlLXNldCB0aGUgZW5hYmxlIGJpdCBvbiB0aGUgY2FyZC4KKwkgKi8KKworCS8qCisJICogTFNXIHZhbHVlczoKKwkgKiAgIDB4MjI3OCAtPiBKMjU4NUIsIFBuUCBzaGFyZWQgbWVtb3J5IG1vZGUKKwkgKiAgIDB4MjI3MCAtPiBKMjU4NUIsIHNoYXJlZCBtZW1vcnkgbW9kZSwgMHhkYzAwMAorCSAqICAgMHhhMjNjIC0+IEoyNTg1QiwgSS9PIG1hcHBlZCBtb2RlCisJICogICAweDIyNDAgLT4gRUlTQSBDT01QRVgsIEJ1c01hc3RlciAoU2hhc3RhIENoaXApCisJICogICAweDIyMjAgLT4gRUlTQSBIUCwgSS9PIChTaGFzdGEgQ2hpcCkKKwkgKiAgIDB4MjI2MCAtPiBFSVNBIEhQLCBCdXNNYXN0ZXIgKFNoYXN0YSBDaGlwKQorCSAqLworCisjaWYgMAorCWxvY2FsX21vZGUgPSAweDIyNzA7CisJaHAxMDBfb3V0dygweGZlZmUsIE9QVElPTl9MU1cpOworCWhwMTAwX291dHcobG9jYWxfbW9kZSB8IEhQMTAwX1NFVF9MQiB8IEhQMTAwX1NFVF9IQiwgT1BUSU9OX0xTVyk7CisjZW5kaWYKKworCS8qIGhwMTAwX21vZGUgdmFsdWUgbWF5YmUgdXNlZCBpbiBmdXR1cmUgYnkgYW5vdGhlciBjYXJkICovCisJbG9jYWxfbW9kZSA9IGhwMTAwX21vZGU7CisJaWYgKGxvY2FsX21vZGUgPCAxIHx8IGxvY2FsX21vZGUgPiA0KQorCQlsb2NhbF9tb2RlID0gMTsJLyogZGVmYXVsdCAqLworI2lmZGVmIEhQMTAwX0RFQlVHCisJcHJpbnRrKCJocDEwMDogJXM6IG9yaWdpbmFsIExTVyA9IDB4JXhcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgaHAxMDBfaW53KE9QVElPTl9MU1cpKTsKKyNlbmRpZgorCisJaWYgKGxvY2FsX21vZGUgPT0gMykgeworCQlocDEwMF9vdXR3KEhQMTAwX01FTV9FTiB8IEhQMTAwX1JFU0VUX0xCLCBPUFRJT05fTFNXKTsKKwkJaHAxMDBfb3V0dyhIUDEwMF9JT19FTiB8IEhQMTAwX1NFVF9MQiwgT1BUSU9OX0xTVyk7CisJCWhwMTAwX291dHcoSFAxMDBfQk1fV1JJVEUgfCBIUDEwMF9CTV9SRUFEIHwgSFAxMDBfUkVTRVRfSEIsIE9QVElPTl9MU1cpOworCQlwcmludGsoImhwMTAwOiBJTyBtYXBwZWQgbW9kZSBmb3JjZWQuXG4iKTsKKwl9IGVsc2UgaWYgKGxvY2FsX21vZGUgPT0gMikgeworCQlocDEwMF9vdXR3KEhQMTAwX01FTV9FTiB8IEhQMTAwX1NFVF9MQiwgT1BUSU9OX0xTVyk7CisJCWhwMTAwX291dHcoSFAxMDBfSU9fRU4gfCBIUDEwMF9TRVRfTEIsIE9QVElPTl9MU1cpOworCQlocDEwMF9vdXR3KEhQMTAwX0JNX1dSSVRFIHwgSFAxMDBfQk1fUkVBRCB8IEhQMTAwX1JFU0VUX0hCLCBPUFRJT05fTFNXKTsKKwkJcHJpbnRrKCJocDEwMDogU2hhcmVkIG1lbW9yeSBtb2RlIHJlcXVlc3RlZC5cbiIpOworCX0gZWxzZSBpZiAobG9jYWxfbW9kZSA9PSA0KSB7CisJCWlmIChjaGlwID09IEhQMTAwX0NISVBJRF9MQVNTRU4pIHsKKwkJCWhwMTAwX291dHcoSFAxMDBfQk1fV1JJVEUgfCBIUDEwMF9CTV9SRUFEIHwgSFAxMDBfU0VUX0hCLCBPUFRJT05fTFNXKTsKKwkJCWhwMTAwX291dHcoSFAxMDBfSU9fRU4gfCBIUDEwMF9NRU1fRU4gfCBIUDEwMF9SRVNFVF9MQiwgT1BUSU9OX0xTVyk7CisJCQlwcmludGsoImhwMTAwOiBCdXNtYXN0ZXIgbW9kZSByZXF1ZXN0ZWQuXG4iKTsKKwkJfQorCQlsb2NhbF9tb2RlID0gMTsKKwl9CisKKwlpZiAobG9jYWxfbW9kZSA9PSAxKSB7CS8qIGRlZmF1bHQgYmVoYXZpb3VyICovCisJCWxzdyA9IGhwMTAwX2ludyhPUFRJT05fTFNXKTsKKworCQlpZiAoKGxzdyAmIEhQMTAwX0lPX0VOKSAmJiAofmxzdyAmIEhQMTAwX01FTV9FTikgJiYKKwkJICAgICh+bHN3ICYgKEhQMTAwX0JNX1dSSVRFIHwgSFAxMDBfQk1fUkVBRCkpKSB7CisjaWZkZWYgSFAxMDBfREVCVUcKKwkJCXByaW50aygiaHAxMDA6ICVzOiBJT19FTiBiaXQgaXMgc2V0IG9uIGNhcmQuXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCQlsb2NhbF9tb2RlID0gMzsKKwkJfSBlbHNlIGlmIChjaGlwID09IEhQMTAwX0NISVBJRF9MQVNTRU4gJiYKKwkJCSAgIChsc3cgJiAoSFAxMDBfQk1fV1JJVEUgfCBIUDEwMF9CTV9SRUFEKSkgPT0gKEhQMTAwX0JNX1dSSVRFIHwgSFAxMDBfQk1fUkVBRCkpIHsKKwkJCS8qIENvbnZlcnNpb24gdG8gbmV3IFBDSSBBUEkgOgorCQkJICogSSBkb24ndCBoYXZlIHRoZSBkb2MsIGJ1dCBJIGFzc3VtZSB0aGF0IHRoZSBjYXJkCisJCQkgKiBjYW4gbWFwIHRoZSBmdWxsIDMyYml0IGFkZHJlc3Mgc3BhY2UuCisJCQkgKiBBbHNvLCB3ZSBjYW4gaGF2ZSBFSVNBIEJ1c21hc3RlciBjYXJkcyAobm90IHRlc3RlZCksCisJCQkgKiBzbyBiZXdhcmUgISEhIC0gSmVhbiBJSSAqLworCQkJaWYoKGJ1cyA9PSBIUDEwMF9CVVNfUENJKSAmJgorCQkJICAgKHBjaV9zZXRfZG1hX21hc2socGNpX2RldiwgMHhmZmZmZmZmZikpKSB7CisJCQkJLyogR3JhY2VmdWxseSBmYWxsYmFjayB0byBzaGFyZWQgbWVtb3J5ICovCisJCQkJZ290byBidXNtYXN0ZXJmYWlsOworCQkJfQorCQkJcHJpbnRrKCJocDEwMDogQnVzbWFzdGVyIG1vZGUgZW5hYmxlZC5cbiIpOworCQkJaHAxMDBfb3V0dyhIUDEwMF9NRU1fRU4gfCBIUDEwMF9JT19FTiB8IEhQMTAwX1JFU0VUX0xCLCBPUFRJT05fTFNXKTsKKwkJfSBlbHNlIHsKKwkJYnVzbWFzdGVyZmFpbDoKKyNpZmRlZiBIUDEwMF9ERUJVRworCQkJcHJpbnRrKCJocDEwMDogJXM6IENhcmQgbm90IGNvbmZpZ3VyZWQgZm9yIEJNIG9yIEJNIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzIGNhcmQuXG4iLCBkZXYtPm5hbWUpOworCQkJcHJpbnRrKCJocDEwMDogJXM6IFRyeWluZyBzaGFyZWQgbWVtb3J5IG1vZGUuXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCQkvKiBJbiB0aGlzIGNhc2UsIHRyeSBzaGFyZWQgbWVtb3J5IG1vZGUgKi8KKwkJCWxvY2FsX21vZGUgPSAyOworCQkJaHAxMDBfb3V0dyhIUDEwMF9NRU1fRU4gfCBIUDEwMF9TRVRfTEIsIE9QVElPTl9MU1cpOworCQkJLyogaHAxMDBfb3V0dyhIUDEwMF9JT19FTnxIUDEwMF9SRVNFVF9MQiwgT1BUSU9OX0xTVyk7ICovCisJCX0KKwl9CisjaWZkZWYgSFAxMDBfREVCVUcKKwlwcmludGsoImhwMTAwOiAlczogbmV3IExTVyA9IDB4JXhcbiIsIGRldi0+bmFtZSwgaHAxMDBfaW53KE9QVElPTl9MU1cpKTsKKyNlbmRpZgorCisJLyogQ2hlY2sgZm9yIHNoYXJlZCBtZW1vcnkgb24gdGhlIGNhcmQsIGV2ZW50dWFsbHkgcmVtYXAgaXQgKi8KKwlocDEwMF9wYWdlKEhXX01BUCk7CisJbWVtX21hcHBlZCA9ICgoaHAxMDBfaW53KE9QVElPTl9MU1cpICYgKEhQMTAwX01FTV9FTikpICE9IDApOworCW1lbV9wdHJfcGh5cyA9IDBVTDsKKwltZW1fcHRyX3ZpcnQgPSBOVUxMOworCW1lbW9yeV9zaXplID0gKDgxOTIgPDwgKChocDEwMF9pbmIoU1JBTSkgPj4gNSkgJiAweDA3KSk7CisJdmlydF9tZW1vcnlfc2l6ZSA9IDA7CisKKwkvKiBGb3IgbWVtb3J5IG1hcHBlZCBvciBidXNtYXN0ZXIgbW9kZSwgd2Ugd2FudCB0aGUgbWVtb3J5IGFkZHJlc3MgKi8KKwlpZiAobWVtX21hcHBlZCB8fCAobG9jYWxfbW9kZSA9PSAxKSkgeworCQltZW1fcHRyX3BoeXMgPSAoaHAxMDBfaW53KE1FTV9NQVBfTFNXKSB8IChocDEwMF9pbncoTUVNX01BUF9NU1cpIDw8IDE2KSk7CisJCW1lbV9wdHJfcGh5cyAmPSB+MHgxZmZmOwkvKiA4ayBhbGlnbm1lbnQgKi8KKworCQlpZiAoYnVzID09IEhQMTAwX0JVU19JU0EgJiYgKG1lbV9wdHJfcGh5cyAmIH4weGZmZmZmKSAhPSAwKSB7CisJCQlwcmludGsoImhwMTAwOiBDYW4gb25seSB1c2UgcHJvZ3JhbW1lZCBpL28gbW9kZS5cbiIpOworCQkJbWVtX3B0cl9waHlzID0gMDsKKwkJCW1lbV9tYXBwZWQgPSAwOworCQkJbG9jYWxfbW9kZSA9IDM7CS8qIFVzZSBwcm9ncmFtbWVkIGkvbyAqLworCQl9CisKKwkJLyogV2UgZG8gbm90IG5lZWQgYWNjZXNzIHRvIHNoYXJlZCBtZW1vcnkgaW4gYnVzbWFzdGVyIG1vZGUgKi8KKwkJLyogSG93ZXZlciBpbiBzbGF2ZSBtb2RlIHdlIG5lZWQgdG8gcmVtYXAgaGlnaCAoPjFHQikgY2FyZCBtZW1vcnkgICovCisJCWlmIChsb2NhbF9tb2RlICE9IDEpIHsJLyogPSBub3QgYnVzbWFzdGVyICovCisJCQkvKiBXZSB0cnkgd2l0aCBzbWFsbGVyIG1lbW9yeSBzaXplcywgaWYgaW9yZW1hcCBmYWlscyAqLworCQkJZm9yICh2aXJ0X21lbW9yeV9zaXplID0gbWVtb3J5X3NpemU7IHZpcnRfbWVtb3J5X3NpemUgPiAxNjM4MzsgdmlydF9tZW1vcnlfc2l6ZSA+Pj0gMSkgeworCQkJCWlmICgobWVtX3B0cl92aXJ0ID0gaW9yZW1hcCgodV9sb25nKSBtZW1fcHRyX3BoeXMsIHZpcnRfbWVtb3J5X3NpemUpKSA9PSBOVUxMKSB7CisjaWZkZWYgSFAxMDBfREVCVUcKKwkJCQkJcHJpbnRrKCJocDEwMDogJXM6IGlvcmVtYXAgZm9yIDB4JXggYnl0ZXMgaGlnaCBQQ0kgbWVtb3J5IGF0IDB4JWx4IGZhaWxlZFxuIiwgZGV2LT5uYW1lLCB2aXJ0X21lbW9yeV9zaXplLCBtZW1fcHRyX3BoeXMpOworI2VuZGlmCisJCQkJfSBlbHNlIHsKKyNpZmRlZiBIUDEwMF9ERUJVRworCQkJCQlwcmludGsoImhwMTAwOiAlczogcmVtYXBwZWQgMHgleCBieXRlcyBoaWdoIFBDSSBtZW1vcnkgYXQgMHglbHggdG8gJXAuXG4iLCBkZXYtPm5hbWUsIHZpcnRfbWVtb3J5X3NpemUsIG1lbV9wdHJfcGh5cywgbWVtX3B0cl92aXJ0KTsKKyNlbmRpZgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChtZW1fcHRyX3ZpcnQgPT0gTlVMTCkgewkvKiBhbGwgaW9yZW1hcCB0cmllcyBmYWlsZWQgKi8KKwkJCQlwcmludGsoImhwMTAwOiBGYWlsZWQgdG8gaW9yZW1hcCB0aGUgUENJIGNhcmQgbWVtb3J5LiBXaWxsIGhhdmUgdG8gdXNlIGkvbyBtYXBwZWQgbW9kZS5cbiIpOworCQkJCWxvY2FsX21vZGUgPSAzOworCQkJCXZpcnRfbWVtb3J5X3NpemUgPSAwOworCQkJfQorCQl9CisJfQorCisJaWYgKGxvY2FsX21vZGUgPT0gMykgewkvKiBpbyBtYXBwZWQgZm9yY2VkICovCisJCW1lbV9tYXBwZWQgPSAwOworCQltZW1fcHRyX3BoeXMgPSAwOworCQltZW1fcHRyX3ZpcnQgPSBOVUxMOworCQlwcmludGsoImhwMTAwOiBVc2luZyAoc2xvdykgcHJvZ3JhbW1lZCBpL28gbW9kZS5cbiIpOworCX0KKworCS8qIEluaXRpYWxpc2UgdGhlICJwcml2YXRlIiBkYXRhIHN0cnVjdHVyZSBmb3IgdGhpcyBjYXJkLiAqLworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisJc3RybGNweShscC0+aWQsIGVpZCwgSFAxMDBfU0lHX0xFTik7CisJbHAtPmNoaXAgPSBjaGlwOworCWxwLT5tb2RlID0gbG9jYWxfbW9kZTsKKwlscC0+YnVzID0gYnVzOworCWxwLT5wY2lfZGV2ID0gcGNpX2RldjsKKwlscC0+cHJpb3JpdHlfdHggPSBocDEwMF9wcmlvcml0eV90eDsKKwlscC0+cnhfcmF0aW8gPSBocDEwMF9yeF9yYXRpbzsKKwlscC0+bWVtX3B0cl9waHlzID0gbWVtX3B0cl9waHlzOworCWxwLT5tZW1fcHRyX3ZpcnQgPSBtZW1fcHRyX3ZpcnQ7CisJaHAxMDBfcGFnZShJRF9NQUNfQUREUik7CisJbHAtPnNvZnRfbW9kZWwgPSBocDEwMF9pbmIoU09GVF9NT0RFTCk7CisJbHAtPm1hYzFfbW9kZSA9IEhQMTAwX01BQzFNT0RFMzsKKwlscC0+bWFjMl9tb2RlID0gSFAxMDBfTUFDMk1PREUzOworCW1lbXNldCgmbHAtPmhhc2hfYnl0ZXMsIDB4MDAsIDgpOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKwlscC0+bWVtb3J5X3NpemUgPSBtZW1vcnlfc2l6ZTsKKwlscC0+dmlydF9tZW1vcnlfc2l6ZSA9IHZpcnRfbWVtb3J5X3NpemU7CisJbHAtPnJ4X3JhdGlvID0gaHAxMDBfcnhfcmF0aW87CS8qIGNhbiBiZSBjb25mJ2Qgd2l0aCBpbnNtb2QgKi8KKworCWRldi0+b3BlbiA9IGhwMTAwX29wZW47CisJZGV2LT5zdG9wID0gaHAxMDBfY2xvc2U7CisKKwlpZiAobHAtPm1vZGUgPT0gMSkJLyogYnVzbWFzdGVyICovCisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaHAxMDBfc3RhcnRfeG1pdF9ibTsKKwllbHNlCisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaHAxMDBfc3RhcnRfeG1pdDsKKworCWRldi0+Z2V0X3N0YXRzID0gaHAxMDBfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmhwMTAwX3NldF9tdWx0aWNhc3RfbGlzdDsKKworCS8qIEFzayB0aGUgY2FyZCBmb3Igd2hpY2ggSVJRIGxpbmUgaXQgaXMgY29uZmlndXJlZCAqLworCWlmIChidXMgPT0gSFAxMDBfQlVTX1BDSSkgeworCQlkZXYtPmlycSA9IHBjaV9kZXYtPmlycTsKKwl9IGVsc2UgeworCQlocDEwMF9wYWdlKEhXX01BUCk7CisJCWRldi0+aXJxID0gaHAxMDBfaW5iKElSUV9DSEFOTkVMKSAmIEhQMTAwX0lSUU1BU0s7CisJCWlmIChkZXYtPmlycSA9PSAyKQorCQkJZGV2LT5pcnEgPSA5OworCX0KKworCWlmIChscC0+bW9kZSA9PSAxKQkvKiBidXNtYXN0ZXIgKi8KKwkJZGV2LT5kbWEgPSA0OworCisJLyogQXNrIHRoZSBjYXJkIGZvciBpdHMgTUFDIGFkZHJlc3MgYW5kIHN0b3JlIGl0IGZvciBsYXRlciB1c2UuICovCisJaHAxMDBfcGFnZShJRF9NQUNfQUREUik7CisJZm9yIChpID0gdWMgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gaHAxMDBfaW5iKExBTl9BRERSICsgaSk7CisKKwkvKiBSZXNldCBzdGF0aXN0aWNzIChjb3VudGVycykgKi8KKwlocDEwMF9jbGVhcl9zdGF0cyhscCwgaW9hZGRyKTsKKworCS8qIElmIGJ1c21hc3RlciBtb2RlIGlzIHdhbnRlZCwgYSBkbWEtY2FwYWJsZSBtZW1vcnkgYXJlYSBpcyBuZWVkZWQgZm9yCisJICogdGhlIHJ4IGFuZCB0eCBQRExzIAorCSAqIFBDSSBjYXJkcyBjYW4gYWNjZXNzIHRoZSB3aG9sZSBQQyBtZW1vcnkuIFRoZXJlZm9yZSBHRlBfRE1BIGlzIG5vdAorCSAqIG5lZWRlZCBmb3IgdGhlIGFsbG9jYXRpb24gb2YgdGhlIG1lbW9yeSBhcmVhLiAKKwkgKi8KKworCS8qIFRPRE86IFdlIGRvIG5vdCBuZWVkIHRoaXMgd2l0aCBvbGQgY2FyZHMsIHdoZXJlIFBETHMgYXJlIHN0b3JlZAorCSAqIGluIHRoZSBjYXJkcyBzaGFyZWQgbWVtb3J5IGFyZWEuIEJ1dCBjdXJyZW50bHksIGJ1c21hc3RlciBoYXMgYmVlbgorCSAqIGltcGxlbWVudGVkL3Rlc3RlZCBvbmx5IHdpdGggdGhlIGxhc3NlbiBjaGlwIGFueXdheS4uLiAqLworCWlmIChscC0+bW9kZSA9PSAxKSB7CS8qIGJ1c21hc3RlciAqLworCQlkbWFfYWRkcl90IHBhZ2VfYmFkZHI7CisJCS8qIEdldCBwaHlzaWNhbGx5IGNvbnRpbm91cyBtZW1vcnkgZm9yIFRYICYgUlggUERMcyAgICAqLworCQkvKiBDb252ZXJzaW9uIHRvIG5ldyBQQ0kgQVBJIDoKKwkJICogUGFnZXMgYXJlIGFsd2F5cyBhbGlnbmVkIGFuZCB6ZXJvZWQsIG5vIG5lZWQgdG8gaXQgb3Vyc2VsZi4KKwkJICogRG9jIHNheXMgc2hvdWxkIGJlIE9LIGZvciBFSVNBIGJ1cyBhcyB3ZWxsIC0gSmVhbiBJSSAqLworCQlpZiAoKGxwLT5wYWdlX3ZhZGRyX2FsZ24gPSBwY2lfYWxsb2NfY29uc2lzdGVudChscC0+cGNpX2RldiwgTUFYX1JJTkdTSVpFLCAmcGFnZV9iYWRkcikpID09IE5VTEwpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dDI7CisJCX0KKwkJbHAtPndoYXRldmVyX29mZnNldCA9ICgodV9sb25nKSBwYWdlX2JhZGRyKSAtICgodV9sb25nKSBscC0+cGFnZV92YWRkcl9hbGduKTsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0JNCisJCXByaW50aygiaHAxMDA6ICVzOiBSZXNlcnZlZCBETUEgbWVtb3J5IGZyb20gMHgleCB0byAweCV4XG4iLCBkZXYtPm5hbWUsICh1X2ludCkgbHAtPnBhZ2VfdmFkZHJfYWxnbiwgKHVfaW50KSBscC0+cGFnZV92YWRkcl9hbGduICsgTUFYX1JJTkdTSVpFKTsKKyNlbmRpZgorCQlscC0+cnhyY29tbWl0ID0gbHAtPnR4cmNvbW1pdCA9IDA7CisJCWxwLT5yeHJoZWFkID0gbHAtPnJ4cnRhaWwgPSAmKGxwLT5yeHJpbmdbMF0pOworCQlscC0+dHhyaGVhZCA9IGxwLT50eHJ0YWlsID0gJihscC0+dHhyaW5nWzBdKTsKKwl9CisKKwkvKiBJbml0aWFsaXNlIHRoZSBjYXJkLiAqLworCS8qIChJJ20gbm90IHJlYWxseSBzdXJlIGlmIGl0J3MgYSBnb29kIGlkZWEgdG8gZG8gdGhpcyBkdXJpbmcgcHJvYmluZywgYnV0IAorCSAqIGxpa2UgdGhpcyBpdCdzIGFzc3VyZWQgdGhhdCB0aGUgbGFuIGNvbm5lY3Rpb24gdHlwZSBjYW4gYmUgc2Vuc2VkCisJICogY29ycmVjdGx5KQorCSAqLworCWhwMTAwX2h3aW5pdChkZXYpOworCisJLyogVHJ5IHRvIGZpbmQgb3V0IHdoaWNoIGtpbmQgb2YgTEFOIHRoZSBjYXJkIGlzIGNvbm5lY3RlZCB0by4gKi8KKwlscC0+bGFuX3R5cGUgPSBocDEwMF9zZW5zZV9sYW4oZGV2KTsKKworCS8qIFByaW50IG91dCBhIG1lc3NhZ2Ugd2hhdCBhYm91dCB3aGF0IHdlIHRoaW5rIHdlIGhhdmUgcHJvYmVkLiAqLworCXByaW50aygiaHAxMDA6IGF0IDB4JXgsIElSUSAlZCwgIiwgaW9hZGRyLCBkZXYtPmlycSk7CisJc3dpdGNoIChidXMpIHsKKwljYXNlIEhQMTAwX0JVU19FSVNBOgorCQlwcmludGsoIkVJU0EiKTsKKwkJYnJlYWs7CisJY2FzZSBIUDEwMF9CVVNfUENJOgorCQlwcmludGsoIlBDSSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoIklTQSIpOworCQlicmVhazsKKwl9CisJcHJpbnRrKCIgYnVzLCAlZGsgU1JBTSAocngvdHggJWQlJSkuXG4iLCBscC0+bWVtb3J5X3NpemUgPj4gMTAsIGxwLT5yeF9yYXRpbyk7CisKKwlpZiAobHAtPm1vZGUgPT0gMikgewkvKiBtZW1vcnkgbWFwcGVkICovCisJCXByaW50aygiaHAxMDA6IE1lbW9yeSBhcmVhIGF0IDB4JWx4LTB4JWx4IiwgbWVtX3B0cl9waHlzLAorCQkJCShtZW1fcHRyX3BoeXMgKyAobWVtX3B0cl9waHlzID4gMHgxMDAwMDAgPyAodV9sb25nKSBscC0+bWVtb3J5X3NpemUgOiAxNiAqIDEwMjQpKSAtIDEpOworCQlpZiAobWVtX3B0cl92aXJ0KQorCQkJcHJpbnRrKCIgKHZpcnR1YWwgYmFzZSAlcCkiLCBtZW1fcHRyX3ZpcnQpOworCQlwcmludGsoIi5cbiIpOworCisJCS8qIFNldCBmb3IgaW5mbyB3aGVuIGRvaW5nIGlmY29uZmlnICovCisJCWRldi0+bWVtX3N0YXJ0ID0gbWVtX3B0cl9waHlzOworCQlkZXYtPm1lbV9lbmQgPSBtZW1fcHRyX3BoeXMgKyBscC0+bWVtb3J5X3NpemU7CisJfQorCisJcHJpbnRrKCJocDEwMDogIik7CisJaWYgKGxwLT5sYW5fdHlwZSAhPSBIUDEwMF9MQU5fRVJSKQorCQlwcmludGsoIkFkYXB0ZXIgaXMgYXR0YWNoZWQgdG8gIik7CisJc3dpdGNoIChscC0+bGFuX3R5cGUpIHsKKwljYXNlIEhQMTAwX0xBTl8xMDA6CisJCXByaW50aygiMTAwTWIvcyBWb2ljZSBHcmFkZSBBbnlMQU4gbmV0d29yay5cbiIpOworCQlicmVhazsKKwljYXNlIEhQMTAwX0xBTl8xMDoKKwkJcHJpbnRrKCIxME1iL3MgbmV0d29yayAoMTBiYXNlVCkuXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBIUDEwMF9MQU5fQ09BWDoKKwkJcHJpbnRrKCIxME1iL3MgbmV0d29yayAoY29heCkuXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJXYXJuaW5nISBMaW5rIGRvd24uXG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK291dDI6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBIUDEwMF9SRUdJT05fU0laRSk7CitvdXQxOgorCXJldHVybiAtRU5PREVWOworfQorCisvKiBUaGlzIHByb2NlZHVyZSBwdXRzIHRoZSBjYXJkIGludG8gYSBzdGFibGUgaW5pdCBzdGF0ZSAqLworc3RhdGljIHZvaWQgaHAxMDBfaHdpbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMDIsIFRSQUNFKTsKKwlwcmludGsoImhwMTAwOiAlczogaHdpbml0XG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKiBJbml0aWFsaXNlIHRoZSBjYXJkLiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogQ2xlYXIgYWxsIHBlbmRpbmcgSW50cyBhbmQgZGlzYWJsZSBJbnRzICovCisJaHAxMDBfcGFnZShQRVJGT1JNQU5DRSk7CisJaHAxMDBfb3V0dygweGZlZmUsIElSUV9NQVNLKTsJLyogbWFzayBvZmYgYWxsIGludHMgKi8KKwlocDEwMF9vdXR3KDB4ZmZmZiwgSVJRX1NUQVRVUyk7CS8qIGNsZWFyIGFsbCBwZW5kaW5nIGludHMgKi8KKworCWhwMTAwX291dHcoSFAxMDBfSU5UX0VOIHwgSFAxMDBfUkVTRVRfTEIsIE9QVElPTl9MU1cpOworCWhwMTAwX291dHcoSFAxMDBfVFJJX0lOVCB8IEhQMTAwX1NFVF9IQiwgT1BUSU9OX0xTVyk7CisKKwlpZiAobHAtPm1vZGUgPT0gMSkgeworCQlocDEwMF9CTV9zaHV0ZG93bihkZXYpOwkvKiBkaXNhYmxlcyBCTSwgcHV0cyBjYXNjYWRlIGluIHJlc2V0ICovCisJCXdhaXQoKTsKKwl9IGVsc2UgeworCQlocDEwMF9vdXR3KEhQMTAwX0lOVF9FTiB8IEhQMTAwX1JFU0VUX0xCLCBPUFRJT05fTFNXKTsKKwkJaHAxMDBfY2FzY2FkZV9yZXNldChkZXYsIDEpOworCQlocDEwMF9wYWdlKE1BQ19DVFJMKTsKKwkJaHAxMDBfYW5kYih+KEhQMTAwX1JYX0VOIHwgSFAxMDBfVFhfRU4pLCBNQUNfQ0ZHXzEpOworCX0KKworCS8qIEluaXRpYXRlIEVFUFJPTSByZWxvYWQgKi8KKwlocDEwMF9sb2FkX2VlcHJvbShkZXYsIDApOworCisJd2FpdCgpOworCisJLyogR28gaW50byByZXNldCBhZ2Fpbi4gKi8KKwlocDEwMF9jYXNjYWRlX3Jlc2V0KGRldiwgMSk7CisKKwkvKiBTZXQgT3B0aW9uIFJlZ2lzdGVycyB0byBhIHNhZmUgc3RhdGUgICovCisJaHAxMDBfb3V0dyhIUDEwMF9ERUJVR19FTiB8CisJCSAgIEhQMTAwX1JYX0hEUiB8CisJCSAgIEhQMTAwX0VFX0VOIHwKKwkJICAgSFAxMDBfQk1fV1JJVEUgfAorCQkgICBIUDEwMF9CTV9SRUFEIHwgSFAxMDBfUkVTRVRfSEIgfAorCQkgICBIUDEwMF9GQUtFX0lOVCB8CisJCSAgIEhQMTAwX0lOVF9FTiB8CisJCSAgIEhQMTAwX01FTV9FTiB8CisJCSAgIEhQMTAwX0lPX0VOIHwgSFAxMDBfUkVTRVRfTEIsIE9QVElPTl9MU1cpOworCisJaHAxMDBfb3V0dyhIUDEwMF9UUklfSU5UIHwKKwkJICAgSFAxMDBfTU1BUF9ESVMgfCBIUDEwMF9TRVRfSEIsIE9QVElPTl9MU1cpOworCisJaHAxMDBfb3V0YihIUDEwMF9QUklPUklUWV9UWCB8CisJCSAgIEhQMTAwX0FEVl9OWFRfUEtUIHwKKwkJICAgSFAxMDBfVFhfQ01EIHwgSFAxMDBfUkVTRVRfTEIsIE9QVElPTl9NU1cpOworCisJLyogVE9ETzogQ29uZmlndXJlIE1NVSBmb3IgUmFtIFRlc3QuICovCisJLyogVE9ETzogUmFtIFRlc3QuICovCisKKwkvKiBSZS1jaGVjayBpZiBhZGFwdGVyIGlzIHN0aWxsIGF0IHNhbWUgaS9vIGxvY2F0aW9uICAgICAgKi8KKwkvKiAoSWYgdGhlIGJhc2UgaS9vIGluIGVlcHJvbSBoYXMgYmVlbiBjaGFuZ2VkIGJ1dCB0aGUgICAgKi8KKwkvKiByZWdpc3RlcnMgaGFkIG5vdCBiZWVuIGNoYW5nZWQsIGEgcmVsb2FkIG9mIHRoZSBlZXByb20gKi8KKwkvKiB3b3VsZCBtb3ZlIHRoZSBhZGFwdGVyIHRvIHRoZSBhZGRyZXNzIHN0b3JlZCBpbiBlZXByb20gKi8KKworCS8qIFRPRE86IENvZGUgdG8gaW1wbGVtZW50LiAqLworCisJLyogVW50aWwgaGVyZSBpdCB3YXMgY29kZSBmcm9tIEhXZGlzY292ZXIgcHJvY2VkdXJlLiAqLworCS8qIE5leHQgY29tZXMgY29kZSBmcm9tIG1tdWluaXQgcHJvY2VkdXJlIG9mIFNDTyBCTSBkcml2ZXIgd2hpY2ggaXMKKwkgKiBjYWxsZWQgZnJvbSBIV2NvbmZpZ3VyZSBpbiB0aGUgU0NPIGRyaXZlci4gICovCisKKwkvKiBJbml0aWFsaXNlIE1NVSwgZXZlbnR1YWxseSBzd2l0Y2ggb24gQnVzbWFzdGVyIE1vZGUsIGluaXRpYWxpc2UgCisJICogbXVsdGljYXN0IGZpbHRlci4uLgorCSAqLworCWhwMTAwX21tdWluaXQoZGV2KTsKKworCS8qIFdlIGRvbid0IHR1cm4gdGhlIGludGVycnVwdHMgb24gaGVyZSAtIHRoaXMgaXMgZG9uZSBieSBzdGFydF9pbnRlcmZhY2UuICovCisJd2FpdCgpOwkJCS8qIFRPRE86IERvIHdlIHJlYWxseSBuZWVkIHRoaXM/ICovCisKKwkvKiBFbmFibGUgSGFyZHdhcmUgKGUuZy4gdW5yZXNldCkgKi8KKwlocDEwMF9jYXNjYWRlX3Jlc2V0KGRldiwgMCk7CisKKwkvKiAtLS0tLS0tIGluaXRpYWxpc2F0aW9uIGNvbXBsZXRlIC0tLS0tLS0tLS0tICovCisKKwkvKiBGaW5hbGx5IHRyeSB0byBsb2cgaW4gdGhlIEh1YiBpZiB0aGVyZSBtYXkgYmUgYSBWRyBjb25uZWN0aW9uLiAqLworCWlmICgobHAtPmxhbl90eXBlID09IEhQMTAwX0xBTl8xMDApIHx8IChscC0+bGFuX3R5cGUgPT0gSFAxMDBfTEFOX0VSUikpCisJCWhwMTAwX2xvZ2luX3RvX3ZnX2h1YihkZXYsIDApOwkvKiByZWxvZ2luICovCisKK30KKwwKKworLyogCisgKiBtbXVpbml0IC0gUmVpbml0aWFsaXNlIENhc2NhZGUgTU1VIGFuZCBNQUMgc2V0dGluZ3MuCisgKiBOb3RlOiBNdXN0IGFscmVhZHkgYmUgaW4gcmVzZXQgYW5kIGxlYXZlcyBjYXJkIGluIHJlc2V0LiAKKyAqLworc3RhdGljIHZvaWQgaHAxMDBfbW11aW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjAzLCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IG1tdWluaXRcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworI2lmZGVmIEhQMTAwX0RFQlVHCisJaWYgKDAgIT0gKGhwMTAwX2ludyhPUFRJT05fTFNXKSAmIEhQMTAwX0hXX1JTVCkpIHsKKwkJcHJpbnRrKCJocDEwMDogJXM6IE5vdCBpbiByZXNldCB3aGVuIGVudGVyaW5nIG1tdWluaXQuIEZpeCBtZS5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCS8qIE1ha2Ugc3VyZSBJUlFzIGFyZSBtYXNrZWQgb2ZmIGFuZCBhY2snZWQuICovCisJaHAxMDBfcGFnZShQRVJGT1JNQU5DRSk7CisJaHAxMDBfb3V0dygweGZlZmUsIElSUV9NQVNLKTsJLyogbWFzayBvZmYgYWxsIGludHMgKi8KKwlocDEwMF9vdXR3KDB4ZmZmZiwgSVJRX1NUQVRVUyk7CS8qIGFjayBJUlEgKi8KKworCS8qCisJICogRW5hYmxlIEhhcmR3YXJlIAorCSAqIC0gQ2xlYXIgRGVidWcgRW4sIFJ4IEhkciBQaXBlLCBFRSBFbiwgSS9PIEVuLCBGYWtlIEludCBhbmQgSW50ciBFbgorCSAqIC0gU2V0IFRyaS1TdGF0ZSBJbnQsIEJ1cyBNYXN0ZXIgUmQvV3IsIGFuZCBNZW0gTWFwIERpc2FibGUKKwkgKiAtIENsZWFyIFByaW9yaXR5LCBBZHZhbmNlIFBrdCBhbmQgWG1pdCBDbWQKKwkgKi8KKworCWhwMTAwX291dHcoSFAxMDBfREVCVUdfRU4gfAorCQkgICBIUDEwMF9SWF9IRFIgfAorCQkgICBIUDEwMF9FRV9FTiB8IEhQMTAwX1JFU0VUX0hCIHwKKwkJICAgSFAxMDBfSU9fRU4gfAorCQkgICBIUDEwMF9GQUtFX0lOVCB8CisJCSAgIEhQMTAwX0lOVF9FTiB8IEhQMTAwX1JFU0VUX0xCLCBPUFRJT05fTFNXKTsKKworCWhwMTAwX291dHcoSFAxMDBfVFJJX0lOVCB8IEhQMTAwX1NFVF9IQiwgT1BUSU9OX0xTVyk7CisKKwlpZiAobHAtPm1vZGUgPT0gMSkgewkvKiBidXNtYXN0ZXIgKi8KKwkJaHAxMDBfb3V0dyhIUDEwMF9CTV9XUklURSB8CisJCQkgICBIUDEwMF9CTV9SRUFEIHwKKwkJCSAgIEhQMTAwX01NQVBfRElTIHwgSFAxMDBfU0VUX0hCLCBPUFRJT05fTFNXKTsKKwl9IGVsc2UgaWYgKGxwLT5tb2RlID09IDIpIHsJLyogbWVtb3J5IG1hcHBlZCAqLworCQlocDEwMF9vdXR3KEhQMTAwX0JNX1dSSVRFIHwKKwkJCSAgIEhQMTAwX0JNX1JFQUQgfCBIUDEwMF9SRVNFVF9IQiwgT1BUSU9OX0xTVyk7CisJCWhwMTAwX291dHcoSFAxMDBfTU1BUF9ESVMgfCBIUDEwMF9SRVNFVF9IQiwgT1BUSU9OX0xTVyk7CisJCWhwMTAwX291dHcoSFAxMDBfTUVNX0VOIHwgSFAxMDBfU0VUX0xCLCBPUFRJT05fTFNXKTsKKwkJaHAxMDBfb3V0dyhIUDEwMF9JT19FTiB8IEhQMTAwX1NFVF9MQiwgT1BUSU9OX0xTVyk7CisJfSBlbHNlIGlmIChscC0+bW9kZSA9PSAzKSB7CS8qIGkvbyBtYXBwZWQgbW9kZSAqLworCQlocDEwMF9vdXR3KEhQMTAwX01NQVBfRElTIHwgSFAxMDBfU0VUX0hCIHwKKwkJCSAgIEhQMTAwX0lPX0VOIHwgSFAxMDBfU0VUX0xCLCBPUFRJT05fTFNXKTsKKwl9CisKKwlocDEwMF9wYWdlKEhXX01BUCk7CisJaHAxMDBfb3V0YigwLCBFQVJMWVJYQ0ZHKTsKKwlocDEwMF9vdXR3KDAsIEVBUkxZVFhDRkcpOworCisJLyoKKwkgKiBFbmFibGUgQnVzIE1hc3RlciBtb2RlCisJICovCisJaWYgKGxwLT5tb2RlID09IDEpIHsJLyogYnVzbWFzdGVyICovCisJCS8qIEV4cGVyaW1lbnRhbDogU2V0IHNvbWUgUENJIGNvbmZpZ3VyYXRpb24gYml0cyAqLworCQlocDEwMF9wYWdlKEhXX01BUCk7CisJCWhwMTAwX2FuZGIofkhQMTAwX1BETF9VU0UzLCBNT0RFQ1RSTDEpOwkvKiBCTSBlbmdpbmUgcmVhZCBtYXhpbXVtICovCisJCWhwMTAwX2FuZGIofkhQMTAwX1RYX0RVQUxRLCBNT0RFQ1RSTDEpOwkvKiBObyBRdWV1ZSBmb3IgUHJpb3JpdHkgVFggKi8KKworCQkvKiBQQ0kgQnVzIGZhaWx1cmVzIHNob3VsZCByZXN1bHQgaW4gYSBNaXNjLiBJbnRlcnJ1cHQgKi8KKwkJaHAxMDBfb3JiKEhQMTAwX0VOX0JVU19GQUlMLCBNT0RFQ1RSTDIpOworCisJCWhwMTAwX291dHcoSFAxMDBfQk1fUkVBRCB8IEhQMTAwX0JNX1dSSVRFIHwgSFAxMDBfU0VUX0hCLCBPUFRJT05fTFNXKTsKKwkJaHAxMDBfcGFnZShIV19NQVApOworCQkvKiBVc2UgQnVyc3QgTW9kZSBhbmQgc3dpdGNoIG9uIFBBR0VfQ0sgKi8KKwkJaHAxMDBfb3JiKEhQMTAwX0JNX0JVUlNUX1JEIHwgSFAxMDBfQk1fQlVSU1RfV1IsIEJNKTsKKwkJaWYgKChscC0+Y2hpcCA9PSBIUDEwMF9DSElQSURfUkFJTklFUikgfHwgKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9TSEFTVEEpKQorCQkJaHAxMDBfb3JiKEhQMTAwX0JNX1BBR0VfQ0ssIEJNKTsKKwkJaHAxMDBfb3JiKEhQMTAwX0JNX01BU1RFUiwgQk0pOworCX0gZWxzZSB7CQkvKiBub3QgYnVzbWFzdGVyICovCisKKwkJaHAxMDBfcGFnZShIV19NQVApOworCQlocDEwMF9hbmRiKH5IUDEwMF9CTV9NQVNURVIsIEJNKTsKKwl9CisKKwkvKgorCSAqIERpdmlkZSBjYXJkIG1lbW9yeSBpbnRvIHJlZ2lvbnMgZm9yIFJ4LCBUeCBhbmQsIGlmIG5vbi1FVFIgY2hpcCwgUERMcworCSAqLworCWhwMTAwX3BhZ2UoTU1VX0NGRyk7CisJaWYgKGxwLT5tb2RlID09IDEpIHsJLyogb25seSBuZWVkZWQgZm9yIEJ1c21hc3RlciAqLworCQlpbnQgeG1pdF9zdG9wLCByZWN2X3N0b3A7CisKKwkJaWYgKChscC0+Y2hpcCA9PSBIUDEwMF9DSElQSURfUkFJTklFUikKKwkJICAgIHx8IChscC0+Y2hpcCA9PSBIUDEwMF9DSElQSURfU0hBU1RBKSkgeworCQkJaW50IHBkbF9zdG9wOworCisJCQkvKgorCQkJICogRWFjaCBwZGwgaXMgNTA4IGJ5dGVzIGxvbmcuICg2MyBmcmFncyAqIDQgYnl0ZXMgZm9yIGFkZHJlc3MgYW5kCisJCQkgKiA0IGJ5dGVzIGZvciBoZWFkZXIpLiBXZSB3aWxsIGxlYXZlIE5VTV9SWFBETFMgKiA1MDggKHJvdW5kZWQKKwkJCSAqIHRvIHRoZSBuZXh0IGhpZ2hlciAxayBib3VuZGFyeSkgYnl0ZXMgZm9yIHRoZSByeC1wZGwncworCQkJICogTm90ZTogRm9yIG5vbi1ldHIgY2hpcHMgdGhlIHRyYW5zbWl0IHN0b3AgcmVnaXN0ZXIgbXVzdCBiZQorCQkJICogcHJvZ3JhbW1lZCBvbiBhIDFrIGJvdW5kYXJ5LCBpLmUuIGJpdHMgOTowIG11c3QgYmUgemVyby4gCisJCQkgKi8KKwkJCXBkbF9zdG9wID0gbHAtPm1lbW9yeV9zaXplOworCQkJeG1pdF9zdG9wID0gKHBkbF9zdG9wIC0gNTA4ICogKE1BWF9SWF9QREwpIC0gMTYpICYgfigweDAzZmYpOworCQkJcmVjdl9zdG9wID0gKHhtaXRfc3RvcCAqIChscC0+cnhfcmF0aW8pIC8gMTAwKSAmIH4oMHgwM2ZmKTsKKwkJCWhwMTAwX291dHcoKHBkbF9zdG9wID4+IDQpIC0gMSwgUERMX01FTV9TVE9QKTsKKyNpZmRlZiBIUDEwMF9ERUJVR19CTQorCQkJcHJpbnRrKCJocDEwMDogJXM6IFBETF9TVE9QID0gMHgleFxuIiwgZGV2LT5uYW1lLCBwZGxfc3RvcCk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCS8qIEVUUiBjaGlwIChMYXNzZW4pIGluIGJ1c21hc3RlciBtb2RlICovCisJCQl4bWl0X3N0b3AgPSAobHAtPm1lbW9yeV9zaXplKSAtIDE7CisJCQlyZWN2X3N0b3AgPSAoKGxwLT5tZW1vcnlfc2l6ZSAqIGxwLT5yeF9yYXRpbykgLyAxMDApICYgfigweDAzZmYpOworCQl9CisKKwkJaHAxMDBfb3V0dyh4bWl0X3N0b3AgPj4gNCwgVFhfTUVNX1NUT1ApOworCQlocDEwMF9vdXR3KHJlY3Zfc3RvcCA+PiA0LCBSWF9NRU1fU1RPUCk7CisjaWZkZWYgSFAxMDBfREVCVUdfQk0KKwkJcHJpbnRrKCJocDEwMDogJXM6IFRYX1NUT1AgID0gMHgleFxuIiwgZGV2LT5uYW1lLCB4bWl0X3N0b3AgPj4gNCk7CisJCXByaW50aygiaHAxMDA6ICVzOiBSWF9TVE9QICA9IDB4JXhcbiIsIGRldi0+bmFtZSwgcmVjdl9zdG9wID4+IDQpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJLyogU2xhdmUgbW9kZXMgKG1lbW9yeSBtYXBwZWQgYW5kIHByb2dyYW1tZWQgaW8pICAqLworCQlocDEwMF9vdXR3KCgoKGxwLT5tZW1vcnlfc2l6ZSAqIGxwLT5yeF9yYXRpbykgLyAxMDApID4+IDQpLCBSWF9NRU1fU1RPUCk7CisJCWhwMTAwX291dHcoKChscC0+bWVtb3J5X3NpemUgLSAxKSA+PiA0KSwgVFhfTUVNX1NUT1ApOworI2lmZGVmIEhQMTAwX0RFQlVHCisJCXByaW50aygiaHAxMDA6ICVzOiBUWF9NRU1fU1RPUDogMHgleFxuIiwgZGV2LT5uYW1lLCBocDEwMF9pbncoVFhfTUVNX1NUT1ApKTsKKwkJcHJpbnRrKCJocDEwMDogJXM6IFJYX01FTV9TVE9QOiAweCV4XG4iLCBkZXYtPm5hbWUsIGhwMTAwX2ludyhSWF9NRU1fU1RPUCkpOworI2VuZGlmCisJfQorCisJLyogV3JpdGUgTUFDIGFkZHJlc3MgaW50byBwYWdlIDEgKi8KKwlocDEwMF9wYWdlKE1BQ19BRERSRVNTKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlocDEwMF9vdXRiKGRldi0+ZGV2X2FkZHJbaV0sIE1BQ19BRERSICsgaSk7CisKKwkvKiBaZXJvIHRoZSBtdWx0aWNhc3QgaGFzaCByZWdpc3RlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlocDEwMF9vdXRiKDB4MCwgSEFTSF9CWVRFMCArIGkpOworCisJLyogU2V0IHVwIE1BQyBkZWZhdWx0cyAqLworCWhwMTAwX3BhZ2UoTUFDX0NUUkwpOworCisJLyogR28gdG8gTEFOIFBhZ2UgYW5kIHplcm8gYWxsIGZpbHRlciBiaXRzICovCisJLyogWmVybyBhY2NlcHQgZXJyb3IsIGFjY2VwdCBtdWx0aWNhc3QsIGFjY2VwdCBicm9hZGNhc3QgYW5kIGFjY2VwdCAqLworCS8qIGFsbCBkaXJlY3RlZCBwYWNrZXQgYml0cyAqLworCWhwMTAwX2FuZGIofihIUDEwMF9SWF9FTiB8CisJCSAgICAgSFAxMDBfVFhfRU4gfAorCQkgICAgIEhQMTAwX0FDQ19FUlJPUkVEIHwKKwkJICAgICBIUDEwMF9BQ0NfTUMgfAorCQkgICAgIEhQMTAwX0FDQ19CQyB8IEhQMTAwX0FDQ19QSFkpLCBNQUNfQ0ZHXzEpOworCisJaHAxMDBfb3V0YigweDAwLCBNQUNfQ0ZHXzIpOworCisJLyogWmVybyB0aGUgZnJhbWUgZm9ybWF0IGJpdC4gVGhpcyB3b3JrcyBhcm91bmQgYSB0cmFpbmluZyBidWcgaW4gdGhlICovCisJLyogbmV3IGh1YnMuICovCisJaHAxMDBfb3V0YigweDAwLCBWR19MQU5fQ0ZHXzIpOwkvKiAodXNlIDgwMi4zKSAqLworCisJaWYgKGxwLT5wcmlvcml0eV90eCkKKwkJaHAxMDBfb3V0YihIUDEwMF9QUklPUklUWV9UWCB8IEhQMTAwX1NFVF9MQiwgT1BUSU9OX01TVyk7CisJZWxzZQorCQlocDEwMF9vdXRiKEhQMTAwX1BSSU9SSVRZX1RYIHwgSFAxMDBfUkVTRVRfTEIsIE9QVElPTl9NU1cpOworCisJaHAxMDBfb3V0YihIUDEwMF9BRFZfTlhUX1BLVCB8CisJCSAgIEhQMTAwX1RYX0NNRCB8IEhQMTAwX1JFU0VUX0xCLCBPUFRJT05fTVNXKTsKKworCS8qIElmIGJ1c21hc3RlciwgaW5pdGlhbGl6ZSB0aGUgUERMcyAqLworCWlmIChscC0+bW9kZSA9PSAxKQorCQlocDEwMF9pbml0X3BkbHMoZGV2KTsKKworCS8qIEdvIHRvIHBlcmZvcm1hbmNlIHBhZ2UgYW5kIGluaXRhbGl6ZSBpc3IgYW5kIGltciByZWdpc3RlcnMgKi8KKwlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKKwlocDEwMF9vdXR3KDB4ZmVmZSwgSVJRX01BU0spOwkvKiBtYXNrIG9mZiBhbGwgaW50cyAqLworCWhwMTAwX291dHcoMHhmZmZmLCBJUlFfU1RBVFVTKTsJLyogYWNrIElSUSAqLworfQorCisvKgorICogIG9wZW4vY2xvc2UgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBocDEwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworI2VuZGlmCisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMDQsIFRSQUNFKTsKKwlwcmludGsoImhwMTAwOiAlczogb3BlblxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogTmV3OiBpZiBidXMgaXMgUENJIG9yIEVJU0EsIGludGVycnVwdHMgbWlnaHQgYmUgc2hhcmVkIGludGVycnVwdHMgKi8KKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGhwMTAwX2ludGVycnVwdCwKKwkJCWxwLT5idXMgPT0gSFAxMDBfQlVTX1BDSSB8fCBscC0+YnVzID09CisJCQlIUDEwMF9CVVNfRUlTQSA/IFNBX1NISVJRIDogU0FfSU5URVJSVVBULAorCQkJImhwMTAwIiwgZGV2KSkgeworCQlwcmludGsoImhwMTAwOiAlczogdW5hYmxlIHRvIGdldCBJUlEgJWRcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJbHAtPmxhbl90eXBlID0gaHAxMDBfc2Vuc2VfbGFuKGRldik7CisJbHAtPm1hYzFfbW9kZSA9IEhQMTAwX01BQzFNT0RFMzsKKwlscC0+bWFjMl9tb2RlID0gSFAxMDBfTUFDMk1PREUzOworCW1lbXNldCgmbHAtPmhhc2hfYnl0ZXMsIDB4MDAsIDgpOworCisJaHAxMDBfc3RvcF9pbnRlcmZhY2UoZGV2KTsKKworCWhwMTAwX2h3aW5pdChkZXYpOworCisJaHAxMDBfc3RhcnRfaW50ZXJmYWNlKGRldik7CS8qIHNldHMgbWFjIG1vZGVzLCBlbmFibGVzIGludGVycnVwdHMgKi8KKworCXJldHVybiAwOworfQorCisvKiBUaGUgY2xvc2UgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGludGVyZmFjZSBpcyB0byBiZSBicm91Z2h0IGRvd24gKi8KK3N0YXRpYyBpbnQgaHAxMDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIwNSwgVFJBQ0UpOworCXByaW50aygiaHAxMDA6ICVzOiBjbG9zZVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJaHAxMDBfcGFnZShQRVJGT1JNQU5DRSk7CisJaHAxMDBfb3V0dygweGZlZmUsIElSUV9NQVNLKTsJLyogbWFzayBvZmYgYWxsIElSUXMgKi8KKworCWhwMTAwX3N0b3BfaW50ZXJmYWNlKGRldik7CisKKwlpZiAobHAtPmxhbl90eXBlID09IEhQMTAwX0xBTl8xMDApCisJCWxwLT5odWJfc3RhdHVzID0gaHAxMDBfbG9naW5fdG9fdmdfaHViKGRldiwgMCk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworI2lmZGVmIEhQMTAwX0RFQlVHCisJcHJpbnRrKCJocDEwMDogJXM6IGNsb3NlIExTVyA9IDB4JXhcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgaHAxMDBfaW53KE9QVElPTl9MU1cpKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisMCisKKy8qCisgKiBDb25maWd1cmUgdGhlIFBETCBSeCByaW5ncyBhbmQgTEFOIAorICovCitzdGF0aWMgdm9pZCBocDEwMF9pbml0X3BkbHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWhwMTAwX3JpbmdfdCAqcmluZ3B0cjsKKwl1X2ludCAqcGFnZXB0cjsJCS8qIFdhcm5pbmcgOiBpbmNyZW1lbnQgYnkgNCAtIEplYW4gSUkgKi8KKwlpbnQgaTsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisjZW5kaWYKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIwNiwgVFJBQ0UpOworCXByaW50aygiaHAxMDA6ICVzOiBpbml0IHBkbHNcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCWlmICgwID09IGxwLT5wYWdlX3ZhZGRyX2FsZ24pCisJCXByaW50aygiaHAxMDA6ICVzOiBXYXJuaW5nOiBscC0+cGFnZV92YWRkcl9hbGduIG5vdCBpbml0aWFsaXNlZCFcbiIsIGRldi0+bmFtZSk7CisJZWxzZSB7CisJCS8qIHBhZ2VwdHIgc2hhbGwgcG9pbnQgaW50byB0aGUgRE1BIGFjY2Vzc2libGUgbWVtb3J5IHJlZ2lvbiAgKi8KKwkJLyogd2UgdXNlIHRoaXMgcG9pbnRlciB0byBzdGF0dXMgdGhlIHVwcGVyIGxpbWl0IG9mIGFsbG9jYXRlZCAqLworCQkvKiBtZW1vcnkgaW4gdGhlIGFsbG9jYXRlZCBwYWdlLiAqLworCQkvKiBub3RlOiBhbGlnbiB0aGUgcG9pbnRlcnMgdG8gdGhlIHBjaSBjYWNoZSBsaW5lIHNpemUgKi8KKwkJbWVtc2V0KGxwLT5wYWdlX3ZhZGRyX2FsZ24sIDAsIE1BWF9SSU5HU0laRSk7CS8qIFplcm8gIFJ4L1R4IHJpbmcgcGFnZSAqLworCQlwYWdlcHRyID0gbHAtPnBhZ2VfdmFkZHJfYWxnbjsKKworCQlscC0+cnhyY29tbWl0ID0gMDsKKwkJcmluZ3B0ciA9IGxwLT5yeHJoZWFkID0gbHAtPnJ4cnRhaWwgPSAmKGxwLT5yeHJpbmdbMF0pOworCisJCS8qIEluaXRpYWxpc2UgUnggUmluZyAqLworCQlmb3IgKGkgPSBNQVhfUlhfUERMIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCWxwLT5yeHJpbmdbaV0ubmV4dCA9IHJpbmdwdHI7CisJCQlyaW5ncHRyID0gJihscC0+cnhyaW5nW2ldKTsKKwkJCXBhZ2VwdHIgKz0gaHAxMDBfaW5pdF9yeHBkbChkZXYsIHJpbmdwdHIsIHBhZ2VwdHIpOworCQl9CisKKwkJLyogSW5pdGlhbGlzZSBUeCBSaW5nICovCisJCWxwLT50eHJjb21taXQgPSAwOworCQlyaW5ncHRyID0gbHAtPnR4cmhlYWQgPSBscC0+dHhydGFpbCA9ICYobHAtPnR4cmluZ1swXSk7CisJCWZvciAoaSA9IE1BWF9UWF9QREwgLSAxOyBpID49IDA7IGktLSkgeworCQkJbHAtPnR4cmluZ1tpXS5uZXh0ID0gcmluZ3B0cjsKKwkJCXJpbmdwdHIgPSAmKGxwLT50eHJpbmdbaV0pOworCQkJcGFnZXB0ciArPSBocDEwMF9pbml0X3R4cGRsKGRldiwgcmluZ3B0ciwgcGFnZXB0cik7CisJCX0KKwl9Cit9CisMCisKKy8qIFRoZXNlIGZ1bmN0aW9ucyAiZm9ybWF0IiB0aGUgZW50cmllcyBpbiB0aGUgcGRsIHN0cnVjdHVyZSAgICovCisvKiBUaGV5IHJldHVybiBob3cgbXVjaCBtZW1vcnkgdGhlIGZyYWdtZW50cyBuZWVkLiAgICAgICAgICAgICovCitzdGF0aWMgaW50IGhwMTAwX2luaXRfcnhwZGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICByZWdpc3RlciBocDEwMF9yaW5nX3QgKiByaW5ncHRyLAorCQkJICAgIHJlZ2lzdGVyIHUzMiAqIHBkbHB0cikKK3sKKwkvKiBwZGxwdHIgaXMgc3RhcnRpbmcgYWRkcmVzcyBmb3IgdGhpcyBwZGwgKi8KKworCWlmICgwICE9ICgoKHVuc2lnbmVkIGxvbmcpIHBkbHB0cikgJiAweGYpKQorCQlwcmludGsoImhwMTAwOiAlczogSW5pdCByeHBkbDogVW5hbGlnbmVkIHBkbHB0ciAweCVseC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsICh1bnNpZ25lZCBsb25nKSBwZGxwdHIpOworCisJcmluZ3B0ci0+cGRsID0gcGRscHRyICsgMTsKKwlyaW5ncHRyLT5wZGxfcGFkZHIgPSB2aXJ0X3RvX3doYXRldmVyKGRldiwgcGRscHRyICsgMSk7CisJcmluZ3B0ci0+c2tiID0gKHZvaWQgKikgTlVMTDsKKworCS8qIAorCSAqIFdyaXRlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiBmaXJzdCBQREwgRnJhZ21lbnQgKHdoaWNoIGlzIHVzZWQgZm9yCisJICogc3RvcmluZyB0aGUgUlgtSGVhZGVyCisJICogV2UgdXNlIHRoZSA0IGJ5dGVzIF9iZWZvcmVfIHRoZSBQREggaW4gdGhlIHBkbCBtZW1vcnkgYXJlYSB0byAKKwkgKiBzdG9yZSB0aGlzIGluZm9ybWF0aW9uLiAoUERIIGlzIGF0IG9mZnNldCAweDA0KQorCSAqLworCS8qIE5vdGUgdGhhdCBwZGxwdHIrMSBhbmQgbm90IHBkbHB0ciBpcyB0aGUgcG9pbnRlciB0byB0aGUgUERIICovCisKKwkqKHBkbHB0ciArIDIpID0gKHVfaW50KSB2aXJ0X3RvX3doYXRldmVyKGRldiwgcGRscHRyKTsJLyogQWRkcmVzcyBGcmFnIDEgKi8KKwkqKHBkbHB0ciArIDMpID0gNDsJLyogTGVuZ3RoICBGcmFnIDEgKi8KKworCXJldHVybiAoKCgoTUFYX1JYX0ZSQUcgKiAyICsgMikgKyAzKSAvIDQpICogNCk7Cit9CisKKworc3RhdGljIGludCBocDEwMF9pbml0X3R4cGRsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgcmVnaXN0ZXIgaHAxMDBfcmluZ190ICogcmluZ3B0ciwKKwkJCSAgICByZWdpc3RlciB1MzIgKiBwZGxwdHIpCit7CisJaWYgKDAgIT0gKCgodW5zaWduZWQgbG9uZykgcGRscHRyKSAmIDB4ZikpCisJCXByaW50aygiaHAxMDA6ICVzOiBJbml0IHR4cGRsOiBVbmFsaWduZWQgcGRscHRyIDB4JWx4LlxuIiwgZGV2LT5uYW1lLCAodW5zaWduZWQgbG9uZykgcGRscHRyKTsKKworCXJpbmdwdHItPnBkbCA9IHBkbHB0cjsJLyogKzE7ICovCisJcmluZ3B0ci0+cGRsX3BhZGRyID0gdmlydF90b193aGF0ZXZlcihkZXYsIHBkbHB0cik7CS8qICsxICovCisJcmluZ3B0ci0+c2tiID0gKHZvaWQgKikgTlVMTDsKKworCXJldHVybiAoKCgoTUFYX1RYX0ZSQUcgKiAyICsgMikgKyAzKSAvIDQpICogNCk7Cit9CisKKy8qCisgKiBocDEwMF9idWlsZF9yeF9wZGwgYWxsb2NhdGVzIGFuIHNrYl9idWZmIG9mIG1heGltdW0gc2l6ZSBwbHVzIHR3byBieXRlcyAKKyAqIGZvciBwb3NzaWJsZSBvZGQgd29yZCBhbGlnbm1lbnQgcm91bmRpbmcgdXAgdG8gbmV4dCBkd29yZCBhbmQgc2V0IFBETAorICogYWRkcmVzcyBmb3IgZnJhZ21lbnQjMiAKKyAqIFJldHVybnM6IDAgaWYgdW5hYmxlIHRvIGFsbG9jYXRlIHNrYl9idWZmCisgKiAgICAgICAgICAxIGlmIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGludCBocDEwMF9idWlsZF9yeF9wZGwoaHAxMDBfcmluZ190ICogcmluZ3B0ciwKKwkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyNlbmRpZgorI2lmZGVmIEhQMTAwX0RFQlVHX0JNCisJdV9pbnQgKnA7CisjZW5kaWYKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIwNywgVFJBQ0UpOworCXByaW50aygiaHAxMDA6ICVzOiBidWlsZCByeCBwZGxcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qIEFsbG9jYXRlIHNrYiBidWZmZXIgb2YgbWF4aW11bSBzaXplICovCisJLyogTm90ZTogVGhpcyBkZXBlbmRzIG9uIHRoZSBhbGxvY19za2IgZnVuY3Rpb25zIGFsbG9jYXRpbmcgbW9yZSAKKwkgKiBzcGFjZSB0aGFuIHJlcXVlc3RlZCwgaS5lLiBhbGlnbmluZyB0byAxNmJ5dGVzICovCisKKwlyaW5ncHRyLT5za2IgPSBkZXZfYWxsb2Nfc2tiKCgoTUFYX0VUSEVSX1NJWkUgKyAyICsgMykgLyA0KSAqIDQpOworCisJaWYgKE5VTEwgIT0gcmluZ3B0ci0+c2tiKSB7CisJCS8qIAorCQkgKiBSZXNlcnZlIDIgYnl0ZXMgYXQgdGhlIGhlYWQgb2YgdGhlIGJ1ZmZlciB0byBsYW5kIHRoZSBJUCBoZWFkZXIKKwkJICogb24gYSBsb25nIHdvcmQgYm91bmRhcnkgKEFjY29yZGluZyB0byB0aGUgTmV0d29yayBEcml2ZXIgc2VjdGlvbgorCQkgKiBpbiB0aGUgTGludXggS0hHLCB0aGlzIHNob3VsZCBoZWxwIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlLikKKwkJICovCisJCXNrYl9yZXNlcnZlKHJpbmdwdHItPnNrYiwgMik7CisKKwkJcmluZ3B0ci0+c2tiLT5kZXYgPSBkZXY7CisJCXJpbmdwdHItPnNrYi0+ZGF0YSA9ICh1X2NoYXIgKikgc2tiX3B1dChyaW5ncHRyLT5za2IsIE1BWF9FVEhFUl9TSVpFKTsKKworCQkvKiByaW5ncHRyLT5wZGwgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFBETCwgaS5lLiB0aGUgUERIICovCisJCS8qIE5vdGU6IDFzdCBGcmFnbWVudCBpcyB1c2VkIGZvciB0aGUgNCBieXRlIHBhY2tldCBzdGF0dXMKKwkJICogKHJlY2VpdmUgaGVhZGVyKS4gSXRzIFBETCBlbnRyaWVzIGFyZSBzZXQgdXAgYnkgaW5pdF9yeHBkbC4gU28gCisJCSAqIGhlcmUgd2Ugb25seSBoYXZlIHRvIHNldCB1cCB0aGUgUERMIGZyYWdtZW50IGVudHJpZXMgZm9yIHRoZSBkYXRhCisJCSAqIHBhcnQuIFRob3NlIDQgYnl0ZXMgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIERNQSBtZW1vcnkgcmVnaW9uIAorCQkgKiBkaXJlY3RseSBiZWZvcmUgdGhlIFBETC4gCisJCSAqLworI2lmZGVmIEhQMTAwX0RFQlVHX0JNCisJCXByaW50aygiaHAxMDA6ICVzOiBidWlsZF9yeF9wZGw6IFBESEAweCV4LCBza2ItPmRhdGEgKGxlbiAlZCkgYXQgMHgleFxuIiwKKwkJCQkgICAgIGRldi0+bmFtZSwgKHVfaW50KSByaW5ncHRyLT5wZGwsCisJCQkJICAgICAoKE1BWF9FVEhFUl9TSVpFICsgMiArIDMpIC8gNCkgKiA0LAorCQkJCSAgICAgKHVuc2lnbmVkIGludCkgcmluZ3B0ci0+c2tiLT5kYXRhKTsKKyNlbmRpZgorCisJCS8qIENvbnZlcnNpb24gdG8gbmV3IFBDSSBBUEkgOiBtYXAgc2tidWYgZGF0YSB0byBQQ0kgYnVzLgorCQkgKiBEb2Mgc2F5cyBpdCdzIE9LIGZvciBFSVNBIGFzIHdlbGwgLSBKZWFuIElJICovCisJCXJpbmdwdHItPnBkbFswXSA9IDB4MDAwMjAwMDA7CS8qIFdyaXRlIFBESCAqLworCQlyaW5ncHRyLT5wZGxbM10gPSBwZGxfbWFwX2RhdGEobmV0ZGV2X3ByaXYoZGV2KSwgCisJCQkJCSAgICAgICByaW5ncHRyLT5za2ItPmRhdGEpOworCQlyaW5ncHRyLT5wZGxbNF0gPSBNQVhfRVRIRVJfU0laRTsJLyogTGVuZ3RoIG9mIERhdGEgKi8KKworI2lmZGVmIEhQMTAwX0RFQlVHX0JNCisJCWZvciAocCA9IChyaW5ncHRyLT5wZGwpOyBwIDwgKHJpbmdwdHItPnBkbCArIDUpOyBwKyspCisJCQlwcmludGsoImhwMTAwOiAlczogQWRyIDB4JS44eCA9IDB4JS44eFxuIiwgZGV2LT5uYW1lLCAodV9pbnQpIHAsICh1X2ludCkgKiBwKTsKKyNlbmRpZgorCQlyZXR1cm4gKDEpOworCX0KKwkvKiBlbHNlOiAqLworCS8qIGFsbG9jX3NrYiBmYWlsZWQgKG5vIG1lbW9yeSkgLT4gc3RpbGwgY2FuIHJlY2VpdmUgdGhlIGhlYWRlcgorCSAqIGZyYWdtZW50IGludG8gUERMIG1lbW9yeS4gbWFrZSBQREwgc2FmZSBieSBjbGVhcmluZyBtc2dwdHIgYW5kCisJICogbWFraW5nIHRoZSBQREwgb25seSAxIGZyYWdtZW50IChpLmUuIHRoZSA0IGJ5dGUgcGFja2V0IHN0YXR1cykKKwkgKi8KKyNpZmRlZiBIUDEwMF9ERUJVR19CTQorCXByaW50aygiaHAxMDA6ICVzOiBidWlsZF9yeF9wZGw6IFBESEAweCV4LCBObyBzcGFjZSBmb3Igc2tiLlxuIiwgZGV2LT5uYW1lLCAodV9pbnQpIHJpbmdwdHItPnBkbCk7CisjZW5kaWYKKworCXJpbmdwdHItPnBkbFswXSA9IDB4MDAwMTAwMDA7CS8qIFBESDogQ291bnQ9MSBGcmFnbWVudCAqLworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqICBocDEwMF9yeGZpbGwgLSBhdHRlbXB0IHRvIGZpbGwgdGhlIFJ4IFJpbmcgd2lsbCBlbXB0eSBza2IncworICoKKyAqIE1ha2VzIGFzc3VtcHRpb24gdGhhdCBza2IncyBhcmUgYWx3YXlzIGNvbnRpZ3VvdXMgbWVtb3J5IGFyZWFzIGFuZAorICogdGhlcmVmb3JlIFBETHMgY29udGFpbiBvbmx5IDIgcGh5c2ljYWwgZnJhZ21lbnRzLgorICogLSAgV2hpbGUgdGhlIG51bWJlciBvZiBSeCBQRExzIHdpdGggYnVmZmVycyBpcyBsZXNzIHRoYW4gbWF4aW11bQorICogICAgICBhLiAgR2V0IGEgbWF4aW11bSBwYWNrZXQgc2l6ZSBza2IKKyAqICAgICAgYi4gIFB1dCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGludG8gdGhlIFBETC4KKyAqICAgICAgYy4gIE91dHB1dCBwaHlzaWNhbCBhZGRyZXNzIG9mIFBETCB0byBhZGFwdGVyLgorICovCitzdGF0aWMgdm9pZCBocDEwMF9yeGZpbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWhwMTAwX3JpbmdfdCAqcmluZ3B0cjsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIwOCwgVFJBQ0UpOworCXByaW50aygiaHAxMDA6ICVzOiByeGZpbGxcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCWhwMTAwX3BhZ2UoUEVSRk9STUFOQ0UpOworCisJd2hpbGUgKGxwLT5yeHJjb21taXQgPCBNQVhfUlhfUERMKSB7CisJCS8qCisJCSAgICoqIEF0dGVtcHQgdG8gZ2V0IGEgYnVmZmVyIGFuZCBidWlsZCBhIFJ4IFBETC4KKwkJICovCisJCXJpbmdwdHIgPSBscC0+cnhydGFpbDsKKwkJaWYgKDAgPT0gaHAxMDBfYnVpbGRfcnhfcGRsKHJpbmdwdHIsIGRldikpIHsKKwkJCXJldHVybjsJLyogTm9uZSBhdmFpbGFibGUsIHJldHVybiAqLworCQl9CisKKwkJLyogSGFuZCB0aGlzIFBETCBvdmVyIHRvIHRoZSBjYXJkICovCisJCS8qIE5vdGU6IFRoaXMgbmVlZHMgcGVyZm9ybWFuY2UgcGFnZSBzZWxlY3RlZCEgKi8KKyNpZmRlZiBIUDEwMF9ERUJVR19CTQorCQlwcmludGsoImhwMTAwOiAlczogcnhmaWxsOiBIYW5kIHRvIGNhcmQ6IHBkbCAjJWQgQDB4JXggcGh5czoweCV4LCBidWZmZXI6IDB4JXhcbiIsCisJCQkJICAgICBkZXYtPm5hbWUsIGxwLT5yeHJjb21taXQsICh1X2ludCkgcmluZ3B0ci0+cGRsLAorCQkJCSAgICAgKHVfaW50KSByaW5ncHRyLT5wZGxfcGFkZHIsICh1X2ludCkgcmluZ3B0ci0+cGRsWzNdKTsKKyNlbmRpZgorCisJCWhwMTAwX291dGwoKHUzMikgcmluZ3B0ci0+cGRsX3BhZGRyLCBSWF9QREEpOworCisJCWxwLT5yeHJjb21taXQgKz0gMTsKKwkJbHAtPnJ4cnRhaWwgPSByaW5ncHRyLT5uZXh0OworCX0KK30KKworLyoKKyAqIEJNX3NodXRkb3duIC0gc2h1dGRvd24gYnVzIG1hc3RlcmluZyBhbmQgbGVhdmUgY2hpcCBpbiByZXNldCBzdGF0ZQorICovCisKK3N0YXRpYyB2b2lkIGhwMTAwX0JNX3NodXRkb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyB0aW1lOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjA5LCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IGJtIHNodXRkb3duXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKKwlocDEwMF9vdXR3KDB4ZmVmZSwgSVJRX01BU0spOwkvKiBtYXNrIG9mZiBhbGwgaW50cyAqLworCWhwMTAwX291dHcoMHhmZmZmLCBJUlFfU1RBVFVTKTsJLyogQWNrIGFsbCBpbnRzICovCisKKwkvKiBFbnN1cmUgSW50ZXJydXB0cyBhcmUgb2ZmICovCisJaHAxMDBfb3V0dyhIUDEwMF9JTlRfRU4gfCBIUDEwMF9SRVNFVF9MQiwgT1BUSU9OX0xTVyk7CisKKwkvKiBEaXNhYmxlIGFsbCBNQUMgYWN0aXZpdHkgKi8KKwlocDEwMF9wYWdlKE1BQ19DVFJMKTsKKwlocDEwMF9hbmRiKH4oSFAxMDBfUlhfRU4gfCBIUDEwMF9UWF9FTiksIE1BQ19DRkdfMSk7CS8qIHN0b3AgcngvdHggKi8KKworCS8qIElmIGNhc2NhZGUgTU1VIGlzIG5vdCBhbHJlYWR5IGluIHJlc2V0ICovCisJaWYgKDAgIT0gKGhwMTAwX2ludyhPUFRJT05fTFNXKSAmIEhQMTAwX0hXX1JTVCkpIHsKKwkJLyogV2FpdCAxLjNtcyAoMTBNYiBtYXggcGFja2V0IHRpbWUpIHRvIGVuc3VyZSBNQUMgaXMgaWRsZSBzbworCQkgKiBNTVUgcG9pbnRlcnMgd2lsbCBub3QgYmUgcmVzZXQgb3V0IGZyb20gdW5kZXJuZWF0aAorCQkgKi8KKwkJaHAxMDBfcGFnZShNQUNfQ1RSTCk7CisJCWZvciAodGltZSA9IDA7IHRpbWUgPCA1MDAwOyB0aW1lKyspIHsKKwkJCWlmICgoaHAxMDBfaW5iKE1BQ19DRkdfMSkgJiAoSFAxMDBfVFhfSURMRSB8IEhQMTAwX1JYX0lETEUpKSA9PSAoSFAxMDBfVFhfSURMRSB8IEhQMTAwX1JYX0lETEUpKQorCQkJCWJyZWFrOworCQl9CisKKwkJLyogU2h1dGRvd24gYWxnb3JpdGhtIGRlcGVuZHMgb24gdGhlIGdlbmVyYXRpb24gb2YgQ2FzY2FkZSAqLworCQlpZiAobHAtPmNoaXAgPT0gSFAxMDBfQ0hJUElEX0xBU1NFTikgewkvKiBFVFIgc2h1dGRvd24vcmVzZXQgKi8KKwkJCS8qIERpc2FibGUgQnVzbWFzdGVyIG1vZGUgYW5kIHdhaXQgZm9yIGJpdCB0byBnbyB0byB6ZXJvLiAqLworCQkJaHAxMDBfcGFnZShIV19NQVApOworCQkJaHAxMDBfYW5kYih+SFAxMDBfQk1fTUFTVEVSLCBCTSk7CisJCQkvKiAxMDAgbXMgdGltZW91dCAqLworCQkJZm9yICh0aW1lID0gMDsgdGltZSA8IDMyMDAwOyB0aW1lKyspIHsKKwkJCQlpZiAoMCA9PSAoaHAxMDBfaW5iKEJNKSAmIEhQMTAwX0JNX01BU1RFUikpCisJCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgewkvKiBTaGFzdGEgb3IgUmFpbmllciBTaHV0ZG93bi9SZXNldCAqLworCQkJLyogVG8gZW5zdXJlIGFsbCBidXMgbWFzdGVyIGlubG9hZGluZyBhY3Rpdml0eSBoYXMgY2Vhc2VkLAorCQkJICogd2FpdCBmb3Igbm8gUnggUERBcyBvciBubyBSeCBwYWNrZXRzIG9uIGNhcmQuIAorCQkJICovCisJCQlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKKwkJCS8qIDEwMCBtcyB0aW1lb3V0ICovCisJCQlmb3IgKHRpbWUgPSAwOyB0aW1lIDwgMTAwMDA7IHRpbWUrKykgeworCQkJCS8qIFJYX1BETDogUERMcyBub3QgZXhlY3V0ZWQuICovCisJCQkJLyogUlhfUEtUX0NOVDogUlgnZCBwYWNrZXRzIG9uIGNhcmQuICovCisJCQkJaWYgKChocDEwMF9pbmIoUlhfUERMKSA9PSAwKSAmJiAoaHAxMDBfaW5iKFJYX1BLVF9DTlQpID09IDApKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHRpbWUgPj0gMTAwMDApCisJCQkJcHJpbnRrKCJocDEwMDogJXM6IEJNIHNodXRkb3duIGVycm9yLlxuIiwgZGV2LT5uYW1lKTsKKworCQkJLyogVG8gZW5zdXJlIGFsbCBidXMgbWFzdGVyIG91dGxvYWRpbmcgYWN0aXZpdHkgaGFzIGNlYXNlZCwKKwkJCSAqIHdhaXQgdW50aWwgdGhlIFR4IFBEQSBjb3VudCBnb2VzIHRvIHplcm8gb3Igbm8gbW9yZSBUeCBzcGFjZQorCQkJICogYXZhaWxhYmxlIGluIHRoZSBUeCByZWdpb24gb2YgdGhlIGNhcmQuIAorCQkJICovCisJCQkvKiAxMDAgbXMgdGltZW91dCAqLworCQkJZm9yICh0aW1lID0gMDsgdGltZSA8IDEwMDAwOyB0aW1lKyspIHsKKwkJCQlpZiAoKDAgPT0gaHAxMDBfaW5iKFRYX1BLVF9DTlQpKSAmJgorCQkJCSAgICAoMCAhPSAoaHAxMDBfaW5iKFRYX01FTV9GUkVFKSAmIEhQMTAwX0FVVE9fQ09NUEFSRSkpKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJLyogRGlzYWJsZSBCdXNtYXN0ZXIgbW9kZSAqLworCQkJaHAxMDBfcGFnZShIV19NQVApOworCQkJaHAxMDBfYW5kYih+SFAxMDBfQk1fTUFTVEVSLCBCTSk7CisJCX0JLyogZW5kIG9mIHNodXRkb3duIHByb2NlZHVyZSBmb3Igbm9uLWV0ciBwYXJ0cyAqLworCisJCWhwMTAwX2Nhc2NhZGVfcmVzZXQoZGV2LCAxKTsKKwl9CisJaHAxMDBfcGFnZShQRVJGT1JNQU5DRSk7CisJLyogaHAxMDBfb3V0dyggSFAxMDBfQk1fUkVBRCB8IEhQMTAwX0JNX1dSSVRFIHwgSFAxMDBfUkVTRVRfSEIsIE9QVElPTl9MU1cgKTsgKi8KKwkvKiBCdXNtYXN0ZXIgbW9kZSBzaG91bGQgYmUgc2h1dCBkb3duIG5vdy4gKi8KK30KKworc3RhdGljIGludCBocDEwMF9jaGVja19sYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGxwLT5sYW5fdHlwZSA8IDApIHsJLyogbm8gTEFOIHR5cGUgZGV0ZWN0ZWQgeWV0PyAqLworCQlocDEwMF9zdG9wX2ludGVyZmFjZShkZXYpOworCQlpZiAoKGxwLT5sYW5fdHlwZSA9IGhwMTAwX3NlbnNlX2xhbihkZXYpKSA8IDApIHsKKwkJCXByaW50aygiaHAxMDA6ICVzOiBubyBjb25uZWN0aW9uIGZvdW5kIC0gY2hlY2sgd2lyZVxuIiwgZGV2LT5uYW1lKTsKKwkJCWhwMTAwX3N0YXJ0X2ludGVyZmFjZShkZXYpOwkvKiAxME1iL3MgUlggcGFja2V0cyBtYXliZSBoYW5kbGVkICovCisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAobHAtPmxhbl90eXBlID09IEhQMTAwX0xBTl8xMDApCisJCQlscC0+aHViX3N0YXR1cyA9IGhwMTAwX2xvZ2luX3RvX3ZnX2h1YihkZXYsIDApOwkvKiByZWxvZ2luICovCisJCWhwMTAwX3N0YXJ0X2ludGVyZmFjZShkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogCisgKiAgdHJhbnNtaXQgZnVuY3Rpb25zCisgKi8KKworLyogdHggZnVuY3Rpb24gZm9yIGJ1c21hc3RlciBtb2RlICovCitzdGF0aWMgaW50IGhwMTAwX3N0YXJ0X3htaXRfYm0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLCBva19mbGFnOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWhwMTAwX3JpbmdfdCAqcmluZ3B0cjsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIxMCwgVFJBQ0UpOworCXByaW50aygiaHAxMDA6ICVzOiBzdGFydF94bWl0X2JtXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNrYi0+bGVuIDw9IDApCisJCXJldHVybiAwOworCQkKKwlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTiAmJiBscC0+Y2hpcCA9PSBIUDEwMF9DSElQSURfU0hBU1RBKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogR2V0IFR4IHJpbmcgdGFpbCBwb2ludGVyICovCisJaWYgKGxwLT50eHJ0YWlsLT5uZXh0ID09IGxwLT50eHJoZWFkKSB7CisJCS8qIE5vIG1lbW9yeS4gKi8KKyNpZmRlZiBIUDEwMF9ERUJVRworCQlwcmludGsoImhwMTAwOiAlczogc3RhcnRfeG1pdF9ibTogTm8gVFggUERMIGF2YWlsYWJsZS5cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJLyogbm90IHdhaXRlZCBsb25nIGVub3VnaCBzaW5jZSBsYXN0IHR4PyAqLworCQlpZiAoamlmZmllcyAtIGRldi0+dHJhbnNfc3RhcnQgPCBIWikKKwkJCXJldHVybiAtRUFHQUlOOworCisJCWlmIChocDEwMF9jaGVja19sYW4oZGV2KSkKKwkJCXJldHVybiAtRUlPOworCisJCWlmIChscC0+bGFuX3R5cGUgPT0gSFAxMDBfTEFOXzEwMCAmJiBscC0+aHViX3N0YXR1cyA8IDApIHsKKwkJCS8qIHdlIGhhdmUgYSAxMDBNYi9zIGFkYXB0ZXIgYnV0IGl0IGlzbid0IGNvbm5lY3RlZCB0byBodWIgKi8KKwkJCXByaW50aygiaHAxMDA6ICVzOiBsb2dpbiB0byAxMDBNYi9zIGh1YiByZXRyeVxuIiwgZGV2LT5uYW1lKTsKKwkJCWhwMTAwX3N0b3BfaW50ZXJmYWNlKGRldik7CisJCQlscC0+aHViX3N0YXR1cyA9IGhwMTAwX2xvZ2luX3RvX3ZnX2h1YihkZXYsIDApOworCQkJaHAxMDBfc3RhcnRfaW50ZXJmYWNlKGRldik7CisJCX0gZWxzZSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkJCWhwMTAwX2ludHNfb2ZmKCk7CS8qIFVzZWZ1bCA/IEplYW4gSUkgKi8KKwkJCWkgPSBocDEwMF9zZW5zZV9sYW4oZGV2KTsKKwkJCWhwMTAwX2ludHNfb24oKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoaSA9PSBIUDEwMF9MQU5fRVJSKQorCQkJCXByaW50aygiaHAxMDA6ICVzOiBsaW5rIGRvd24gZGV0ZWN0ZWRcbiIsIGRldi0+bmFtZSk7CisJCQllbHNlIGlmIChscC0+bGFuX3R5cGUgIT0gaSkgewkvKiBjYWJsZSBjaGFuZ2UhICovCisJCQkJLyogaXQncyB2ZXJ5IGhhcmQgLSBhbGwgbmV0d29yayBzZXR0aW5ncyBtdXN0IGJlIGNoYW5nZWQhISEgKi8KKwkJCQlwcmludGsoImhwMTAwOiAlczogY2FibGUgY2hhbmdlIDEwTWIvcyA8LT4gMTAwTWIvcyBkZXRlY3RlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCQlscC0+bGFuX3R5cGUgPSBpOworCQkJCWhwMTAwX3N0b3BfaW50ZXJmYWNlKGRldik7CisJCQkJaWYgKGxwLT5sYW5fdHlwZSA9PSBIUDEwMF9MQU5fMTAwKQorCQkJCQlscC0+aHViX3N0YXR1cyA9IGhwMTAwX2xvZ2luX3RvX3ZnX2h1YihkZXYsIDApOworCQkJCWhwMTAwX3N0YXJ0X2ludGVyZmFjZShkZXYpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoImhwMTAwOiAlczogaW50ZXJmYWNlIHJlc2V0XG4iLCBkZXYtPm5hbWUpOworCQkJCWhwMTAwX3N0b3BfaW50ZXJmYWNlKGRldik7CisJCQkJaWYgKGxwLT5sYW5fdHlwZSA9PSBIUDEwMF9MQU5fMTAwKQorCQkJCQlscC0+aHViX3N0YXR1cyA9IGhwMTAwX2xvZ2luX3RvX3ZnX2h1YihkZXYsIDApOworCQkJCWhwMTAwX3N0YXJ0X2ludGVyZmFjZShkZXYpOworCQkJfQorCQl9CisKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCS8qCisJICogd2UgaGF2ZSB0byB0dXJuIGludCdzIG9mZiBiZWZvcmUgbW9kaWZ5aW5nIHRoaXMsIG90aGVyd2lzZQorCSAqIGEgdHhfcGRsX2NsZWFudXAgY291bGQgb2NjdXIgYXQgdGhlIHNhbWUgdGltZQorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCXJpbmdwdHIgPSBscC0+dHhydGFpbDsKKwlscC0+dHhydGFpbCA9IHJpbmdwdHItPm5leHQ7CisKKwkvKiBDaGVjayB3aGV0aGVyIHBhY2tldCBoYXMgbWluaW1hbCBwYWNrZXQgc2l6ZSAqLworCW9rX2ZsYWcgPSBza2ItPmxlbiA+PSBIUDEwMF9NSU5fUEFDS0VUX1NJWkU7CisJaSA9IG9rX2ZsYWcgPyBza2ItPmxlbiA6IEhQMTAwX01JTl9QQUNLRVRfU0laRTsKKworCXJpbmdwdHItPnNrYiA9IHNrYjsKKwlyaW5ncHRyLT5wZGxbMF0gPSAoKDEgPDwgMTYpIHwgaSk7CS8qIFBESDogMSBGcmFnbWVudCAmIGxlbmd0aCAqLworCWlmIChscC0+Y2hpcCA9PSBIUDEwMF9DSElQSURfU0hBU1RBKSB7CisJCS8qIFRPRE86Q291bGQgc29tZW9uZSB3aG8gaGFzIHRoZSBFSVNBIGNhcmQgcGxlYXNlIGNoZWNrIGlmIHRoaXMgd29ya3M/ICovCisJCXJpbmdwdHItPnBkbFsyXSA9IGk7CisJfSBlbHNlIHsJCS8qIExhc3NlbiAqLworCQkvKiBJbiB0aGUgUERMLCBkb24ndCB1c2UgdGhlIHBhZGRlZCBzaXplIGJ1dCB0aGUgcmVhbCBwYWNrZXQgc2l6ZTogKi8KKwkJcmluZ3B0ci0+cGRsWzJdID0gc2tiLT5sZW47CS8qIDFzdCBGcmFnOiBMZW5ndGggb2YgZnJhZyAqLworCX0KKwkvKiBDb252ZXJzaW9uIHRvIG5ldyBQQ0kgQVBJIDogbWFwIHNrYnVmIGRhdGEgdG8gUENJIGJ1cy4KKwkgKiBEb2Mgc2F5cyBpdCdzIE9LIGZvciBFSVNBIGFzIHdlbGwgLSBKZWFuIElJICovCisJcmluZ3B0ci0+cGRsWzFdID0gKCh1MzIpIHBjaV9tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCBza2ItPmRhdGEsIHJpbmdwdHItPnBkbFsyXSwgUENJX0RNQV9UT0RFVklDRSkpOwkvKiAxc3QgRnJhZzogQWRyLiBvZiBkYXRhICovCisKKwkvKiBIYW5kIHRoaXMgUERMIHRvIHRoZSBjYXJkLiAqLworCWhwMTAwX291dGwocmluZ3B0ci0+cGRsX3BhZGRyLCBUWF9QREFfTCk7CS8qIExvdyBQcmlvLiBRdWV1ZSAqLworCisJbHAtPnR4cmNvbW1pdCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBVcGRhdGUgc3RhdGlzdGljcyAqLworCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJbHAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisMCisKKy8qIGNsZWFuX3R4cmluZyBjaGVja3MgaWYgcGFja2V0cyBoYXZlIGJlZW4gc2VudCBieSB0aGUgY2FyZCBieSByZWFkaW5nCisgKiB0aGUgVFhfUERMIHJlZ2lzdGVyIGZyb20gdGhlIHBlcmZvcm1hbmNlIHBhZ2UgYW5kIGNvbXBhcmluZyBpdCB0byB0aGUKKyAqIG51bWJlciBvZiBjb21taXRlZCBwYWNrZXRzLiBJdCB0aGVuIGZyZWVzIHRoZSBza2IncyBvZiB0aGUgcGFja2V0cyB0aGF0CisgKiBvYnZpb3VzbHkgaGF2ZSBiZWVuIHNlbnQgdG8gdGhlIG5ldHdvcmsuCisgKgorICogTmVlZHMgdGhlIFBFUkZPUk1BTkNFIHBhZ2Ugc2VsZWN0ZWQuIAorICovCitzdGF0aWMgdm9pZCBocDEwMF9jbGVhbl90eHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgZG9uZWNvdW50OworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjExLCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IGNsZWFuIHR4cmluZ1xuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogSG93IG1hbnkgUERMcyBoYXZlIGJlZW4gdHJhbnNtaXR0ZWQ/ICovCisJZG9uZWNvdW50ID0gKGxwLT50eHJjb21taXQpIC0gaHAxMDBfaW5iKFRYX1BETCk7CisKKyNpZmRlZiBIUDEwMF9ERUJVRworCWlmIChkb25lY291bnQgPiBNQVhfVFhfUERMKQorCQlwcmludGsoImhwMTAwOiAlczogV2FybmluZzogTW9yZSBQRExzIHRyYW5zbWl0dGVkIHRoYW4gY29tbWl0ZWQgdG8gY2FyZD8/P1xuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJZm9yICg7IDAgIT0gZG9uZWNvdW50OyBkb25lY291bnQtLSkgeworI2lmZGVmIEhQMTAwX0RFQlVHX0JNCisJCXByaW50aygiaHAxMDA6ICVzOiBGcmVlIHNrYjogZGF0YSBAMHglLjh4IHR4cmNvbW1pdD0weCV4IFRYUERMPTB4JXgsIGRvbmU9MHgleFxuIiwKKwkJCQlkZXYtPm5hbWUsICh1X2ludCkgbHAtPnR4cmhlYWQtPnNrYi0+ZGF0YSwKKwkJCQlscC0+dHhyY29tbWl0LCBocDEwMF9pbmIoVFhfUERMKSwgZG9uZWNvdW50KTsKKyNlbmRpZgorCQkvKiBDb252ZXJzaW9uIHRvIG5ldyBQQ0kgQVBJIDogTk9QICovCisJCXBjaV91bm1hcF9zaW5nbGUobHAtPnBjaV9kZXYsIChkbWFfYWRkcl90KSBscC0+dHhyaGVhZC0+cGRsWzFdLCBscC0+dHhyaGVhZC0+cGRsWzJdLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkobHAtPnR4cmhlYWQtPnNrYik7CisJCWxwLT50eHJoZWFkLT5za2IgPSAodm9pZCAqKSBOVUxMOworCQlscC0+dHhyaGVhZCA9IGxwLT50eHJoZWFkLT5uZXh0OworCQlscC0+dHhyY29tbWl0LS07CisJfQorfQorCisvKiB0eCBmdW5jdGlvbiBmb3Igc2xhdmUgbW9kZXMgKi8KK3N0YXRpYyBpbnQgaHAxMDBfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIG9rX2ZsYWc7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVfc2hvcnQgdmFsOworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMTIsIFRSQUNFKTsKKwlwcmludGsoImhwMTAwOiAlczogc3RhcnRfeG1pdFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXJldHVybiAwOworCX0KKworCWlmIChza2ItPmxlbiA8PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChocDEwMF9jaGVja19sYW4oZGV2KSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGZyZWUgbWVtb3J5IG9uIHRoZSBjYXJkLi4uICovCisJaSA9IGhwMTAwX2lubChUWF9NRU1fRlJFRSkgJiAweDdmZmZmZmZmOworCWlmICghKCgoaSAvIDIpIC0gNTM5KSA+IChza2ItPmxlbiArIDE2KSAmJiAoaHAxMDBfaW5iKFRYX1BLVF9DTlQpIDwgMjU1KSkpIHsKKyNpZmRlZiBIUDEwMF9ERUJVRworCQlwcmludGsoImhwMTAwOiAlczogc3RhcnRfeG1pdDogdHggZnJlZSBtZW0gPSAweCV4XG4iLCBkZXYtPm5hbWUsIGkpOworI2VuZGlmCisJCS8qIG5vdCB3YWl0ZWQgbG9uZyBlbm91Z2ggc2luY2UgbGFzdCBmYWlsZWQgdHggdHJ5PyAqLworCQlpZiAoamlmZmllcyAtIGRldi0+dHJhbnNfc3RhcnQgPCBIWikgeworI2lmZGVmIEhQMTAwX0RFQlVHCisJCQlwcmludGsoImhwMTAwOiAlczogdHJhbnNfc3RhcnQgdGltaW5nIHByb2JsZW1cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJaWYgKGxwLT5sYW5fdHlwZSA9PSBIUDEwMF9MQU5fMTAwICYmIGxwLT5odWJfc3RhdHVzIDwgMCkgeworCQkJLyogd2UgaGF2ZSBhIDEwME1iL3MgYWRhcHRlciBidXQgaXQgaXNuJ3QgY29ubmVjdGVkIHRvIGh1YiAqLworCQkJcHJpbnRrKCJocDEwMDogJXM6IGxvZ2luIHRvIDEwME1iL3MgaHViIHJldHJ5XG4iLCBkZXYtPm5hbWUpOworCQkJaHAxMDBfc3RvcF9pbnRlcmZhY2UoZGV2KTsKKwkJCWxwLT5odWJfc3RhdHVzID0gaHAxMDBfbG9naW5fdG9fdmdfaHViKGRldiwgMCk7CisJCQlocDEwMF9zdGFydF9pbnRlcmZhY2UoZGV2KTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCQkJaHAxMDBfaW50c19vZmYoKTsJLyogVXNlZnVsID8gSmVhbiBJSSAqLworCQkJaSA9IGhwMTAwX3NlbnNlX2xhbihkZXYpOworCQkJaHAxMDBfaW50c19vbigpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChpID09IEhQMTAwX0xBTl9FUlIpCisJCQkJcHJpbnRrKCJocDEwMDogJXM6IGxpbmsgZG93biBkZXRlY3RlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCWVsc2UgaWYgKGxwLT5sYW5fdHlwZSAhPSBpKSB7CS8qIGNhYmxlIGNoYW5nZSEgKi8KKwkJCQkvKiBpdCdzIHZlcnkgaGFyZCAtIGFsbCBuZXR3b3JrIHNldHRpbmcgbXVzdCBiZSBjaGFuZ2VkISEhICovCisJCQkJcHJpbnRrKCJocDEwMDogJXM6IGNhYmxlIGNoYW5nZSAxME1iL3MgPC0+IDEwME1iL3MgZGV0ZWN0ZWRcbiIsIGRldi0+bmFtZSk7CisJCQkJbHAtPmxhbl90eXBlID0gaTsKKwkJCQlocDEwMF9zdG9wX2ludGVyZmFjZShkZXYpOworCQkJCWlmIChscC0+bGFuX3R5cGUgPT0gSFAxMDBfTEFOXzEwMCkKKwkJCQkJbHAtPmh1Yl9zdGF0dXMgPSBocDEwMF9sb2dpbl90b192Z19odWIoZGV2LCAwKTsKKwkJCQlocDEwMF9zdGFydF9pbnRlcmZhY2UoZGV2KTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKCJocDEwMDogJXM6IGludGVyZmFjZSByZXNldFxuIiwgZGV2LT5uYW1lKTsKKwkJCQlocDEwMF9zdG9wX2ludGVyZmFjZShkZXYpOworCQkJCWlmIChscC0+bGFuX3R5cGUgPT0gSFAxMDBfTEFOXzEwMCkKKwkJCQkJbHAtPmh1Yl9zdGF0dXMgPSBocDEwMF9sb2dpbl90b192Z19odWIoZGV2LCAwKTsKKwkJCQlocDEwMF9zdGFydF9pbnRlcmZhY2UoZGV2KTsKKwkJCQltZGVsYXkoMSk7CisJCQl9CisJCX0KKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA2MDAwICYmIChocDEwMF9pbmIoT1BUSU9OX01TVykgJiBIUDEwMF9UWF9DTUQpOyBpKyspIHsKKyNpZmRlZiBIUDEwMF9ERUJVR19UWAorCQlwcmludGsoImhwMTAwOiAlczogc3RhcnRfeG1pdDogYnVzeVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCWhwMTAwX2ludHNfb2ZmKCk7CisJdmFsID0gaHAxMDBfaW53KElSUV9TVEFUVVMpOworCS8qIEFjayAvIGNsZWFyIHRoZSBpbnRlcnJ1cHQgVFhfQ09NUExFVEUgaW50ZXJydXB0IC0gdGhpcyBpbnRlcnJ1cHQgaXMgc2V0CisJICogd2hlbiB0aGUgY3VycmVudCBwYWNrZXQgYmVpbmcgdHJhbnNtaXR0ZWQgb24gdGhlIHdpcmUgaXMgY29tcGxldGVkLiAqLworCWhwMTAwX291dHcoSFAxMDBfVFhfQ09NUExFVEUsIElSUV9TVEFUVVMpOworI2lmZGVmIEhQMTAwX0RFQlVHX1RYCisJcHJpbnRrKCJocDEwMDogJXM6IHN0YXJ0X3htaXQ6IGlycV9zdGF0dXM9MHglLjR4LCBpcnFtYXNrPTB4JS40eCwgbGVuPSVkXG4iLAorCQkJZGV2LT5uYW1lLCB2YWwsIGhwMTAwX2ludyhJUlFfTUFTSyksIChpbnQpIHNrYi0+bGVuKTsKKyNlbmRpZgorCisJb2tfZmxhZyA9IHNrYi0+bGVuID49IEhQMTAwX01JTl9QQUNLRVRfU0laRTsKKwlpID0gb2tfZmxhZyA/IHNrYi0+bGVuIDogSFAxMDBfTUlOX1BBQ0tFVF9TSVpFOworCisJaHAxMDBfb3V0dyhpLCBEQVRBMzIpOwkvKiB0ZWxsIGNhcmQgdGhlIHRvdGFsIHBhY2tldCBsZW5ndGggKi8KKwlocDEwMF9vdXR3KGksIEZSQUdNRU5UX0xFTik7CS8qIGFuZCBmaXJzdC9vbmx5IGZyYWdtZW50IGxlbmd0aCAgICAqLworCisJaWYgKGxwLT5tb2RlID09IDIpIHsJLyogbWVtb3J5IG1hcHBlZCAqLworCQlpZiAobHAtPm1lbV9wdHJfdmlydCkgewkvKiBoaWdoIHBjaSBtZW1vcnkgd2FzIHJlbWFwcGVkICovCisJCQkvKiBOb3RlOiBUaGUgSjI1ODVCIG5lZWRzIGFsaWdubWVudCB0byAzMmJpdHMgaGVyZSEgICovCisJCQltZW1jcHlfdG9pbyhscC0+bWVtX3B0cl92aXJ0LCBza2ItPmRhdGEsIChza2ItPmxlbiArIDMpICYgfjMpOworCQkJaWYgKCFva19mbGFnKQorCQkJCW1lbXNldF9pbyhscC0+bWVtX3B0cl92aXJ0LCAwLCBIUDEwMF9NSU5fUEFDS0VUX1NJWkUgLSBza2ItPmxlbik7CisJCX0gZWxzZSB7CisJCQkvKiBOb3RlOiBUaGUgSjI1ODVCIG5lZWRzIGFsaWdubWVudCB0byAzMmJpdHMgaGVyZSEgICovCisJCQlpc2FfbWVtY3B5X3RvaW8obHAtPm1lbV9wdHJfcGh5cywgc2tiLT5kYXRhLCAoc2tiLT5sZW4gKyAzKSAmIH4zKTsKKwkJCWlmICghb2tfZmxhZykKKwkJCQlpc2FfbWVtc2V0X2lvKGxwLT5tZW1fcHRyX3BoeXMsIDAsIEhQMTAwX01JTl9QQUNLRVRfU0laRSAtIHNrYi0+bGVuKTsKKwkJfQorCX0gZWxzZSB7CQkvKiBwcm9ncmFtbWVkIGkvbyAqLworCQlvdXRzbChpb2FkZHIgKyBIUDEwMF9SRUdfREFUQTMyLCBza2ItPmRhdGEsCisJCSAgICAgIChza2ItPmxlbiArIDMpID4+IDIpOworCQlpZiAoIW9rX2ZsYWcpCisJCQlmb3IgKGkgPSAoc2tiLT5sZW4gKyAzKSAmIH4zOyBpIDwgSFAxMDBfTUlOX1BBQ0tFVF9TSVpFOyBpICs9IDQpCisJCQkJaHAxMDBfb3V0bCgwLCBEQVRBMzIpOworCX0KKworCWhwMTAwX291dGIoSFAxMDBfVFhfQ01EIHwgSFAxMDBfU0VUX0xCLCBPUFRJT05fTVNXKTsJLyogc2VuZCBwYWNrZXQgKi8KKworCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJbHAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWhwMTAwX2ludHNfb24oKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworI2lmZGVmIEhQMTAwX0RFQlVHX1RYCisJcHJpbnRrKCJocDEwMDogJXM6IHN0YXJ0X3htaXQ6IGVuZFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisMCisKKy8qCisgKiBSZWNlaXZlIEZ1bmN0aW9uIChOb24tQnVzbWFzdGVyIG1vZGUpCisgKiBDYWxsZWQgd2hlbiBhbiAiUmVjZWl2ZSBQYWNrZXQiIGludGVycnVwdCBvY2N1cnMsIGkuZS4gdGhlIHJlY2VpdmUgCisgKiBwYWNrZXQgY291bnRlciBpcyBub24temVyby4KKyAqIEZvciBub24tYnVzbWFzdGVyLCB0aGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHdob2xlIHdvcmsgb2YgdHJhbnNmZXJpbmcKKyAqIHRoZSBwYWNrZXQgdG8gdGhlIGhvc3QgbWVtb3J5IGFuZCB0aGVuIHVwIHRvIGhpZ2hlciBsYXllcnMgdmlhIHNrYgorICogYW5kIG5ldGlmX3J4LiAKKyAqLworCitzdGF0aWMgdm9pZCBocDEwMF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBwYWNrZXRzLCBwa3RfbGVuOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVfaW50IGhlYWRlcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisjaWZkZWYgREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjEzLCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IHJ4XG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKiBGaXJzdCBnZXQgaW5kaWNhdGlvbiBvZiByZWNlaXZlZCBsYW4gcGFja2V0ICovCisJLyogUlhfUEtUX0NORCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBwYWNrZXRzIHdoaWNoIGhhdmUgYmVlbiBmdWxseSAqLworCS8qIHJlY2VpdmVkIG9udG8gdGhlIGNhcmQgYnV0IGhhdmUgbm90IGJlZW4gZnVsbHkgdHJhbnNmZXJyZWQgb2YgdGhlIGNhcmQgKi8KKwlwYWNrZXRzID0gaHAxMDBfaW5iKFJYX1BLVF9DTlQpOworI2lmZGVmIEhQMTAwX0RFQlVHX1JYCisJaWYgKHBhY2tldHMgPiAxKQorCQlwcmludGsoImhwMTAwOiAlczogcng6IHdhaXRpbmcgcGFja2V0cyA9ICVkXG4iLCBkZXYtPm5hbWUsIHBhY2tldHMpOworI2VuZGlmCisKKwl3aGlsZSAocGFja2V0cy0tID4gMCkgeworCQkvKiBJZiBBRFZfTlhUX1BLVCBpcyBzdGlsbCBzZXQsIHdlIGhhdmUgdG8gd2FpdCB1bnRpbCB0aGUgY2FyZCBoYXMgKi8KKwkJLyogcmVhbGx5IGFkdmFuY2VkIHRvIHRoZSBuZXh0IHBhY2tldC4gKi8KKwkJZm9yIChwa3RfbGVuID0gMDsgcGt0X2xlbiA8IDYwMDAgJiYgKGhwMTAwX2luYihPUFRJT05fTVNXKSAmIEhQMTAwX0FEVl9OWFRfUEtUKTsgcGt0X2xlbisrKSB7CisjaWZkZWYgSFAxMDBfREVCVUdfUlgKKwkJCXByaW50ayAoImhwMTAwOiAlczogcng6IGJ1c3ksIHJlbWFpbmluZyBwYWNrZXRzID0gJWRcbiIsIGRldi0+bmFtZSwgcGFja2V0cyk7CisjZW5kaWYKKwkJfQorCisJCS8qIEZpcnN0IHdlIGdldCB0aGUgaGVhZGVyLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgKi8KKwkJLyogYWN0dWFsIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGFja2V0LiAqLworCQlpZiAobHAtPm1vZGUgPT0gMikgewkvKiBtZW1vcnkgbWFwcGVkIG1vZGUgKi8KKwkJCWlmIChscC0+bWVtX3B0cl92aXJ0KQkvKiBpZiBtZW1vcnkgd2FzIHJlbWFwcGVkICovCisJCQkJaGVhZGVyID0gcmVhZGwobHAtPm1lbV9wdHJfdmlydCk7CisJCQllbHNlCisJCQkJaGVhZGVyID0gaXNhX3JlYWRsKGxwLT5tZW1fcHRyX3BoeXMpOworCQl9IGVsc2UJCS8qIHByb2dyYW1tZWQgaS9vICovCisJCQloZWFkZXIgPSBocDEwMF9pbmwoREFUQTMyKTsKKworCQlwa3RfbGVuID0gKChoZWFkZXIgJiBIUDEwMF9QS1RfTEVOX01BU0spICsgMykgJiB+MzsKKworI2lmZGVmIEhQMTAwX0RFQlVHX1JYCisJCXByaW50aygiaHAxMDA6ICVzOiByeDogbmV3IHBhY2tldCAtIGxlbmd0aD0lZCwgZXJyb3JzPTB4JXgsIGRlc3Q9MHgleFxuIiwKKwkJCQkgICAgIGRldi0+bmFtZSwgaGVhZGVyICYgSFAxMDBfUEtUX0xFTl9NQVNLLAorCQkJCSAgICAgKGhlYWRlciA+PiAxNikgJiAweGZmZjgsIChoZWFkZXIgPj4gMTYpICYgNyk7CisjZW5kaWYKKworCQkvKiBOb3cgd2UgYWxsb2NhdGUgdGhlIHNrYiBhbmQgdHJhbnNmZXIgdGhlIGRhdGEgaW50byBpdC4gKi8KKwkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzIpOworCQlpZiAoc2tiID09IE5VTEwpIHsJLyogTm90IGVub3VnaCBtZW1vcnktPmRyb3AgcGFja2V0ICovCisjaWZkZWYgSFAxMDBfREVCVUcKKwkJCXByaW50aygiaHAxMDA6ICVzOiByeDogY291bGRuJ3QgYWxsb2NhdGUgYSBza19idWZmIG9mIHNpemUgJWRcbiIsCisJCQkJCSAgICAgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKyNlbmRpZgorCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJfSBlbHNlIHsJLyogc2tiIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgKi8KKworCQkJdV9jaGFyICpwdHI7CisKKwkJCXNrYl9yZXNlcnZlKHNrYiwyKTsKKwkJCXNrYi0+ZGV2ID0gZGV2OworCisJCQkvKiBwdHIgdG8gc3RhcnQgb2YgdGhlIHNrX2J1ZmYgZGF0YSBhcmVhICovCisJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQlwdHIgPSBza2ItPmRhdGE7CisKKwkJCS8qIE5vdyB0cmFuc2ZlciB0aGUgZGF0YSBmcm9tIHRoZSBjYXJkIGludG8gdGhhdCBhcmVhICovCisJCQlpZiAobHAtPm1vZGUgPT0gMikgeworCQkJCWlmIChscC0+bWVtX3B0cl92aXJ0KQorCQkJCQltZW1jcHlfZnJvbWlvKHB0ciwgbHAtPm1lbV9wdHJfdmlydCxwa3RfbGVuKTsKKwkJCQkvKiBOb3RlIGFsaWdubWVudCB0byAzMmJpdCB0cmFuc2ZlcnMgKi8KKwkJCQllbHNlCisJCQkJCWlzYV9tZW1jcHlfZnJvbWlvKHB0ciwgbHAtPm1lbV9wdHJfcGh5cywgcGt0X2xlbik7CisJCQl9IGVsc2UJLyogaW8gbWFwcGVkICovCisJCQkJaW5zbChpb2FkZHIgKyBIUDEwMF9SRUdfREFUQTMyLCBwdHIsIHBrdF9sZW4gPj4gMik7CisKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19SWAorCQkJcHJpbnRrKCJocDEwMDogJXM6IHJ4OiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQkJZGV2LT5uYW1lLCBwdHJbMF0sIHB0clsxXSwgcHRyWzJdLCBwdHJbM10sCisJCSAJCQlwdHJbNF0sIHB0cls1XSwgcHRyWzZdLCBwdHJbN10sIHB0cls4XSwKKwkJCQkJcHRyWzldLCBwdHJbMTBdLCBwdHJbMTFdKTsKKyNlbmRpZgorCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0KKworCQkvKiBJbmRpY2F0ZSB0aGUgY2FyZCB0aGF0IHdlIGhhdmUgZ290IHRoZSBwYWNrZXQgKi8KKwkJaHAxMDBfb3V0YihIUDEwMF9BRFZfTlhUX1BLVCB8IEhQMTAwX1NFVF9MQiwgT1BUSU9OX01TVyk7CisKKwkJc3dpdGNoIChoZWFkZXIgJiAweDAwMDcwMDAwKSB7CisJCWNhc2UgKEhQMTAwX01VTFRJX0FERFJfSEFTSCA8PCAxNik6CisJCWNhc2UgKEhQMTAwX01VTFRJX0FERFJfTk9fSEFTSCA8PCAxNik6CisJCQlscC0+c3RhdHMubXVsdGljYXN0Kys7CisJCQlicmVhazsKKwkJfQorCX0JCQkvKiBlbmQgb2Ygd2hpbGUodGhlcmUgYXJlIHBhY2tldHMpIGxvb3AgKi8KKyNpZmRlZiBIUDEwMF9ERUJVR19SWAorCXByaW50aygiaHAxMDBfcng6ICVzOiBlbmRcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKK30KKworLyogCisgKiBSZWNlaXZlIEZ1bmN0aW9uIGZvciBCdXNtYXN0ZXIgTW9kZQorICovCitzdGF0aWMgdm9pZCBocDEwMF9yeF9ibShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWhwMTAwX3JpbmdfdCAqcHRyOworCXVfaW50IGhlYWRlcjsKKwlpbnQgcGt0X2xlbjsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIxNCwgVFJBQ0UpOworCXByaW50aygiaHAxMDA6ICVzOiByeF9ibVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisjaWZkZWYgSFAxMDBfREVCVUcKKwlpZiAoMCA9PSBscC0+cnhyY29tbWl0KSB7CisJCXByaW50aygiaHAxMDA6ICVzOiByeF9ibSBjYWxsZWQgYWx0aG91Z2ggbm8gUERMcyB3ZXJlIGNvbW1pdHRlZCB0byBhZGFwdGVyP1xuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0gZWxzZQorCQkvKiBSWF9QS1RfQ05UIHN0YXRlcyBob3cgbWFueSBQRExzIGFyZSBjdXJyZW50bHkgZm9ybWF0dGVkIGFuZCBhdmFpbGFibGUgdG8gCisJCSAqIHRoZSBjYXJkcyBCTSBlbmdpbmUgKi8KKwlpZiAoKGhwMTAwX2ludyhSWF9QS1RfQ05UKSAmIDB4MDBmZikgPj0gbHAtPnJ4cmNvbW1pdCkgeworCQlwcmludGsoImhwMTAwOiAlczogTW9yZSBwYWNrZXRzIHJlY2VpdmVkIHRoYW4gY29tbWl0ZWQ/IFJYX1BLVF9DTlQ9MHgleCwgY29tbWl0PTB4JXhcbiIsCisJCQkJICAgICBkZXYtPm5hbWUsIGhwMTAwX2ludyhSWF9QS1RfQ05UKSAmIDB4MDBmZiwKKwkJCQkgICAgIGxwLT5yeHJjb21taXQpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKwl3aGlsZSAoKGxwLT5yeHJjb21taXQgPiBocDEwMF9pbmIoUlhfUERMKSkpIHsKKwkJLyoKKwkJICogVGhlIHBhY2tldCB3YXMgcmVjZWl2ZWQgaW50byB0aGUgcGRsIHBvaW50ZWQgdG8gYnkgbHAtPnJ4cmhlYWQgKAorCQkgKiB0aGUgb2xkZXN0IHBkbCBpbiB0aGUgcmluZyAKKwkJICovCisKKwkJLyogRmlyc3Qgd2UgZ2V0IHRoZSBoZWFkZXIsIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSAqLworCQkvKiBhY3R1YWwgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwYWNrZXQuICovCisKKwkJcHRyID0gbHAtPnJ4cmhlYWQ7CisKKwkJaGVhZGVyID0gKihwdHItPnBkbCAtIDEpOworCQlwa3RfbGVuID0gKGhlYWRlciAmIEhQMTAwX1BLVF9MRU5fTUFTSyk7CisKKwkJLyogQ29udmVyc2lvbiB0byBuZXcgUENJIEFQSSA6IE5PUCAqLworCQlwY2lfdW5tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCAoZG1hX2FkZHJfdCkgcHRyLT5wZGxbM10sIE1BWF9FVEhFUl9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisjaWZkZWYgSFAxMDBfREVCVUdfQk0KKwkJcHJpbnRrKCJocDEwMDogJXM6IHJ4X2JtOiBoZWFkZXJAMHgleD0weCV4IGxlbmd0aD0lZCwgZXJyb3JzPTB4JXgsIGRlc3Q9MHgleFxuIiwKKwkJCQlkZXYtPm5hbWUsICh1X2ludCkgKHB0ci0+cGRsIC0gMSksICh1X2ludCkgaGVhZGVyLAorCQkJCXBrdF9sZW4sIChoZWFkZXIgPj4gMTYpICYgMHhmZmY4LCAoaGVhZGVyID4+IDE2KSAmIDcpOworCQlwcmludGsoImhwMTAwOiAlczogUlhfUERMX0NPVU5UOjB4JXggVFhfUERMX0NPVU5UOjB4JXgsIFJYX1BLVF9DTlQ9MHgleCBQREg9MHgleCwgRGF0YUAweCV4IGxlbj0weCV4XG4iLAorCQkgICAJCWRldi0+bmFtZSwgaHAxMDBfaW5iKFJYX1BETCksIGhwMTAwX2luYihUWF9QREwpLAorCQkJCWhwMTAwX2luYihSWF9QS1RfQ05UKSwgKHVfaW50KSAqIChwdHItPnBkbCksCisJCQkJKHVfaW50KSAqIChwdHItPnBkbCArIDMpLCAodV9pbnQpICogKHB0ci0+cGRsICsgNCkpOworI2VuZGlmCisKKwkJaWYgKChwa3RfbGVuID49IE1JTl9FVEhFUl9TSVpFKSAmJgorCQkgICAgKHBrdF9sZW4gPD0gTUFYX0VUSEVSX1NJWkUpKSB7CisJCQlpZiAocHRyLT5za2IgPT0gTlVMTCkgeworCQkJCXByaW50aygiaHAxMDA6ICVzOiByeF9ibTogc2tiIG51bGxcbiIsIGRldi0+bmFtZSk7CisJCQkJLyogY2FuIGhhcHBlbiBpZiB3ZSBvbmx5IGFsbG9jYXRlZCByb29tIGZvciB0aGUgcGRoIGR1ZSB0byBtZW1vcnkgc2hvcnRhZ2UuICovCisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCX0gZWxzZSB7CisJCQkJc2tiX3RyaW0ocHRyLT5za2IsIHBrdF9sZW4pOwkvKiBTaG9ydGVuIGl0ICovCisJCQkJcHRyLT5za2ItPnByb3RvY29sID0KKwkJCQkgICAgZXRoX3R5cGVfdHJhbnMocHRyLT5za2IsIGRldik7CisKKwkJCQluZXRpZl9yeChwdHItPnNrYik7CS8qIFVwIGFuZCBhd2F5Li4uICovCisKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQl9CisKKwkJCXN3aXRjaCAoaGVhZGVyICYgMHgwMDA3MDAwMCkgeworCQkJY2FzZSAoSFAxMDBfTVVMVElfQUREUl9IQVNIIDw8IDE2KToKKwkJCWNhc2UgKEhQMTAwX01VTFRJX0FERFJfTk9fSEFTSCA8PCAxNik6CisJCQkJbHAtPnN0YXRzLm11bHRpY2FzdCsrOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworI2lmZGVmIEhQMTAwX0RFQlVHCisJCQlwcmludGsoImhwMTAwOiAlczogcnhfYm06IFJlY2VpdmVkIGJhZCBwYWNrZXQgKGxlbmd0aD0lZClcbiIsIGRldi0+bmFtZSwgcGt0X2xlbik7CisjZW5kaWYKKwkJCWlmIChwdHItPnNrYiAhPSBOVUxMKQorCQkJCWRldl9rZnJlZV9za2JfYW55KHB0ci0+c2tiKTsKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJfQorCisJCWxwLT5yeHJoZWFkID0gbHAtPnJ4cmhlYWQtPm5leHQ7CisKKwkJLyogQWxsb2NhdGUgYSBuZXcgcnggUERMIChzbyBscC0+cnhyY29tbWl0IHN0YXlzIHRoZSBzYW1lKSAqLworCQlpZiAoMCA9PSBocDEwMF9idWlsZF9yeF9wZGwobHAtPnJ4cnRhaWwsIGRldikpIHsKKwkJCS8qIE5vIHNwYWNlIGZvciBza2IsIGhlYWRlciBjYW4gc3RpbGwgYmUgcmVjZWl2ZWQuICovCisjaWZkZWYgSFAxMDBfREVCVUcKKwkJCXByaW50aygiaHAxMDA6ICVzOiByeF9ibTogTm8gc3BhY2UgZm9yIG5ldyBQREwuXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCQlyZXR1cm47CisJCX0gZWxzZSB7CS8qIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgbmV3IFBETCAtIHB1dCBpdCBpbiByaW5nbGlzdCBhdCB0YWlsLiAqLworCQkJaHAxMDBfb3V0bCgodTMyKSBscC0+cnhydGFpbC0+cGRsX3BhZGRyLCBSWF9QREEpOworCQkJbHAtPnJ4cnRhaWwgPSBscC0+cnhydGFpbC0+bmV4dDsKKwkJfQorCisJfQorfQorCisvKgorICogIHN0YXRpc3RpY3MKKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpocDEwMF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjE1LCBUUkFDRSk7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCWhwMTAwX2ludHNfb2ZmKCk7CS8qIFVzZWZ1bCA/IEplYW4gSUkgKi8KKwlocDEwMF91cGRhdGVfc3RhdHMoZGV2KTsKKwlocDEwMF9pbnRzX29uKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gJihscC0+c3RhdHMpOworfQorCitzdGF0aWMgdm9pZCBocDEwMF91cGRhdGVfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdV9zaG9ydCB2YWw7CisJc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIxNiwgVFJBQ0UpOworCXByaW50aygiaHAxMDA6ICVzOiB1cGRhdGUtc3RhdHNcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qIE5vdGU6IFN0YXRpc3RpY3MgY291bnRlcnMgY2xlYXIgd2hlbiByZWFkLiAqLworCWhwMTAwX3BhZ2UoTUFDX0NUUkwpOworCXZhbCA9IGhwMTAwX2ludyhEUk9QUEVEKSAmIDB4MGZmZjsKKwlscC0+c3RhdHMucnhfZXJyb3JzICs9IHZhbDsKKwlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgKz0gdmFsOworCXZhbCA9IGhwMTAwX2luYihDUkMpOworCWxwLT5zdGF0cy5yeF9lcnJvcnMgKz0gdmFsOworCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9IHZhbDsKKwl2YWwgPSBocDEwMF9pbmIoQUJPUlQpOworCWxwLT5zdGF0cy50eF9lcnJvcnMgKz0gdmFsOworCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyArPSB2YWw7CisJaHAxMDBfcGFnZShQRVJGT1JNQU5DRSk7Cit9CisKK3N0YXRpYyB2b2lkIGhwMTAwX21pc2NfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyNlbmRpZgorCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWhwMTAwX291dHcoMHg0MjE2LCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IG1pc2NfaW50ZXJydXB0XG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKiBOb3RlOiBTdGF0aXN0aWNzIGNvdW50ZXJzIGNsZWFyIHdoZW4gcmVhZC4gKi8KKwlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworfQorCitzdGF0aWMgdm9pZCBocDEwMF9jbGVhcl9zdGF0cyhzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAsIGludCBpb2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIxNywgVFJBQ0UpOworCXByaW50aygiaHAxMDA6ICVzOiBjbGVhcl9zdGF0c1xuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJaHAxMDBfcGFnZShNQUNfQ1RSTCk7CS8qIGdldCBhbGwgc3RhdGlzdGljcyBieXRlcyAqLworCWhwMTAwX2ludyhEUk9QUEVEKTsKKwlocDEwMF9pbmIoQ1JDKTsKKwlocDEwMF9pbmIoQUJPUlQpOworCWhwMTAwX3BhZ2UoUEVSRk9STUFOQ0UpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7Cit9CisMCisKKy8qCisgKiAgbXVsdGljYXN0IHNldHVwCisgKi8KKworLyoKKyAqICBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRlci4KKyAqLworCitzdGF0aWMgdm9pZCBocDEwMF9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjE4LCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IHNldF9tY19saXN0XG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlocDEwMF9pbnRzX29mZigpOworCWhwMTAwX3BhZ2UoTUFDX0NUUkwpOworCWhwMTAwX2FuZGIofihIUDEwMF9SWF9FTiB8IEhQMTAwX1RYX0VOKSwgTUFDX0NGR18xKTsJLyogc3RvcCByeC90eCAqLworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlscC0+bWFjMl9tb2RlID0gSFAxMDBfTUFDMk1PREU2OwkvKiBwcm9taXNjdW91cyBtb2RlID0gZ2V0IGFsbCBnb29kICovCisJCWxwLT5tYWMxX21vZGUgPSBIUDEwMF9NQUMxTU9ERTY7CS8qIHBhY2tldHMgb24gdGhlIG5ldCAqLworCQltZW1zZXQoJmxwLT5oYXNoX2J5dGVzLCAweGZmLCA4KTsKKwl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCWxwLT5tYWMyX21vZGUgPSBIUDEwMF9NQUMyTU9ERTU7CS8qIG11bHRpY2FzdCBtb2RlID0gZ2V0IHBhY2tldHMgZm9yICovCisJCWxwLT5tYWMxX21vZGUgPSBIUDEwMF9NQUMxTU9ERTU7CS8qIG1lLCBicm9hZGNhc3RzIGFuZCBhbGwgbXVsdGljYXN0cyAqLworI2lmZGVmIEhQMTAwX01VTFRJQ0FTVF9GSUxURVIJLyogZG9lc24ndCB3b3JrISEhICovCisJCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCQkvKiBzZXQgaGFzaCBmaWx0ZXIgdG8gcmVjZWl2ZSBhbGwgbXVsdGljYXN0IHBhY2tldHMgKi8KKwkJCW1lbXNldCgmbHAtPmhhc2hfYnl0ZXMsIDB4ZmYsIDgpOworCQl9IGVsc2UgeworCQkJaW50IGksIGosIGlkeDsKKwkJCXVfY2hhciAqYWRkcnM7CisJCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaTsKKworCQkJbWVtc2V0KCZscC0+aGFzaF9ieXRlcywgMHgwMCwgOCk7CisjaWZkZWYgSFAxMDBfREVCVUcKKwkJCXByaW50aygiaHAxMDA6ICVzOiBjb21wdXRpbmcgaGFzaCBmaWx0ZXIgLSBtY19jb3VudCA9ICVpXG4iLCBkZXYtPm5hbWUsIGRldi0+bWNfY291bnQpOworI2VuZGlmCisJCQlmb3IgKGkgPSAwLCBkbWkgPSBkZXYtPm1jX2xpc3Q7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyssIGRtaSA9IGRtaS0+bmV4dCkgeworCQkJCWFkZHJzID0gZG1pLT5kbWlfYWRkcjsKKwkJCQlpZiAoKCphZGRycyAmIDB4MDEpID09IDB4MDEpIHsJLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCisjaWZkZWYgSFAxMDBfREVCVUcKKwkJCQkJcHJpbnRrKCJocDEwMDogJXM6IG11bHRpY2FzdCA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LCAiLAorCQkJCQkJICAgICBkZXYtPm5hbWUsIGFkZHJzWzBdLCBhZGRyc1sxXSwgYWRkcnNbMl0sCisJCQkJCQkgICAgIGFkZHJzWzNdLCBhZGRyc1s0XSwgYWRkcnNbNV0pOworI2VuZGlmCisJCQkJCWZvciAoaiA9IGlkeCA9IDA7IGogPCA2OyBqKyspIHsKKwkJCQkJCWlkeCBePSAqYWRkcnMrKyAmIDB4M2Y7CisJCQkJCQlwcmludGsoIjolMDJ4OiIsIGlkeCk7CisJCQkJCX0KKyNpZmRlZiBIUDEwMF9ERUJVRworCQkJCQlwcmludGsoImlkeCA9ICVpXG4iLCBpZHgpOworI2VuZGlmCisJCQkJCWxwLT5oYXNoX2J5dGVzW2lkeCA+PiAzXSB8PSAoMSA8PCAoaWR4ICYgNykpOworCQkJCX0KKwkJCX0KKwkJfQorI2Vsc2UKKwkJbWVtc2V0KCZscC0+aGFzaF9ieXRlcywgMHhmZiwgOCk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlscC0+bWFjMl9tb2RlID0gSFAxMDBfTUFDMk1PREUzOwkvKiBub3JtYWwgbW9kZSA9IGdldCBwYWNrZXRzIGZvciBtZSAqLworCQlscC0+bWFjMV9tb2RlID0gSFAxMDBfTUFDMU1PREUzOwkvKiBhbmQgYnJvYWRjYXN0cyAqLworCQltZW1zZXQoJmxwLT5oYXNoX2J5dGVzLCAweDAwLCA4KTsKKwl9CisKKwlpZiAoKChocDEwMF9pbmIoTUFDX0NGR18xKSAmIDB4MGYpICE9IGxwLT5tYWMxX21vZGUpIHx8CisJICAgIChocDEwMF9pbmIoTUFDX0NGR18yKSAhPSBscC0+bWFjMl9tb2RlKSkgeworCQlpbnQgaTsKKworCQlocDEwMF9vdXRiKGxwLT5tYWMyX21vZGUsIE1BQ19DRkdfMik7CisJCWhwMTAwX2FuZGIoSFAxMDBfTUFDMU1PREVNQVNLLCBNQUNfQ0ZHXzEpOwkvKiBjbGVhciBtYWMxIG1vZGUgYml0cyAqLworCQlocDEwMF9vcmIobHAtPm1hYzFfbW9kZSwgTUFDX0NGR18xKTsJLyogYW5kIHNldCB0aGUgbmV3IG1vZGUgKi8KKworCQlocDEwMF9wYWdlKE1BQ19BRERSRVNTKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCWhwMTAwX291dGIobHAtPmhhc2hfYnl0ZXNbaV0sIEhBU0hfQllURTAgKyBpKTsKKyNpZmRlZiBIUDEwMF9ERUJVRworCQlwcmludGsoImhwMTAwOiAlczogbWFjMSA9IDB4JXgsIG1hYzIgPSAweCV4LCBtdWx0aWNhc3QgaGFzaCA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkgICAgIGRldi0+bmFtZSwgbHAtPm1hYzFfbW9kZSwgbHAtPm1hYzJfbW9kZSwKKwkJCQkgICAgIGxwLT5oYXNoX2J5dGVzWzBdLCBscC0+aGFzaF9ieXRlc1sxXSwKKwkJCQkgICAgIGxwLT5oYXNoX2J5dGVzWzJdLCBscC0+aGFzaF9ieXRlc1szXSwKKwkJCQkgICAgIGxwLT5oYXNoX2J5dGVzWzRdLCBscC0+aGFzaF9ieXRlc1s1XSwKKwkJCQkgICAgIGxwLT5oYXNoX2J5dGVzWzZdLCBscC0+aGFzaF9ieXRlc1s3XSk7CisjZW5kaWYKKworCQlpZiAobHAtPmxhbl90eXBlID09IEhQMTAwX0xBTl8xMDApIHsKKyNpZmRlZiBIUDEwMF9ERUJVRworCQkJcHJpbnRrKCJocDEwMDogJXM6IDEwMFZHIE1BQyBzZXR0aW5ncyBoYXZlIGNoYW5nZWQgLSByZWxvZ2luLlxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJbHAtPmh1Yl9zdGF0dXMgPSBocDEwMF9sb2dpbl90b192Z19odWIoZGV2LCAxKTsJLyogZm9yY2UgYSByZWxvZ2luIHRvIHRoZSBodWIgKi8KKwkJfQorCX0gZWxzZSB7CisJCWludCBpOworCQl1X2NoYXIgb2xkX2hhc2hfYnl0ZXNbOF07CisKKwkJaHAxMDBfcGFnZShNQUNfQUREUkVTUyk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlvbGRfaGFzaF9ieXRlc1tpXSA9IGhwMTAwX2luYihIQVNIX0JZVEUwICsgaSk7CisJCWlmIChtZW1jbXAob2xkX2hhc2hfYnl0ZXMsICZscC0+aGFzaF9ieXRlcywgOCkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQkJaHAxMDBfb3V0YihscC0+aGFzaF9ieXRlc1tpXSwgSEFTSF9CWVRFMCArIGkpOworI2lmZGVmIEhQMTAwX0RFQlVHCisJCQlwcmludGsoImhwMTAwOiAlczogbXVsdGljYXN0IGhhc2ggPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCWRldi0+bmFtZSwgbHAtPmhhc2hfYnl0ZXNbMF0sCisJCQkJCWxwLT5oYXNoX2J5dGVzWzFdLCBscC0+aGFzaF9ieXRlc1syXSwKKwkJCQkJbHAtPmhhc2hfYnl0ZXNbM10sIGxwLT5oYXNoX2J5dGVzWzRdLAorCQkJCQlscC0+aGFzaF9ieXRlc1s1XSwgbHAtPmhhc2hfYnl0ZXNbNl0sCisJCQkJCWxwLT5oYXNoX2J5dGVzWzddKTsKKyNlbmRpZgorCisJCQlpZiAobHAtPmxhbl90eXBlID09IEhQMTAwX0xBTl8xMDApIHsKKyNpZmRlZiBIUDEwMF9ERUJVRworCQkJCXByaW50aygiaHAxMDA6ICVzOiAxMDBWRyBNQUMgc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkIC0gcmVsb2dpbi5cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCQlscC0+aHViX3N0YXR1cyA9IGhwMTAwX2xvZ2luX3RvX3ZnX2h1YihkZXYsIDEpOwkvKiBmb3JjZSBhIHJlbG9naW4gdG8gdGhlIGh1YiAqLworCQkJfQorCQl9CisJfQorCisJaHAxMDBfcGFnZShNQUNfQ1RSTCk7CisJaHAxMDBfb3JiKEhQMTAwX1JYX0VOIHwgSFAxMDBfUlhfSURMRSB8CS8qIGVuYWJsZSByeCAqLworCQkgIEhQMTAwX1RYX0VOIHwgSFAxMDBfVFhfSURMRSwgTUFDX0NGR18xKTsJLyogZW5hYmxlIHR4ICovCisKKwlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKKwlocDEwMF9pbnRzX29uKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqICBoYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgaHAxMDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWludCBpb2FkZHI7CisJdV9pbnQgdmFsOworCisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gSVJRX05PTkU7CisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKworCWhwMTAwX2ludHNfb2ZmKCk7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMTksIFRSQUNFKTsKKyNlbmRpZgorCisJLyogIGhwMTAwX3BhZ2UoIFBFUkZPUk1BTkNFICk7ICovCisJdmFsID0gaHAxMDBfaW53KElSUV9TVEFUVVMpOworI2lmZGVmIEhQMTAwX0RFQlVHX0lSUQorCXByaW50aygiaHAxMDA6ICVzOiBtb2RlPSV4LElSUV9TVEFUPTB4JS40eCxSWFBLVENOVD0weCUuMnggUlhQREw9MHglLjJ4IFRYUEtUQ05UPTB4JS4yeCBUWFBETD0weCUuMnhcbiIsCisJCQkgICAgIGRldi0+bmFtZSwgbHAtPm1vZGUsICh1X2ludCkgdmFsLCBocDEwMF9pbmIoUlhfUEtUX0NOVCksCisJCQkgICAgIGhwMTAwX2luYihSWF9QREwpLCBocDEwMF9pbmIoVFhfUEtUX0NOVCksIGhwMTAwX2luYihUWF9QREwpKTsKKyNlbmRpZgorCisJaWYgKHZhbCA9PSAwKSB7CQkvKiBtaWdodCBiZSBhIHNoYXJlZCBpbnRlcnJ1cHQgKi8KKwkJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKwkJaHAxMDBfaW50c19vbigpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCS8qIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aG9zZSBpbnRlcnJ1cHRzIHdlIHJlYWxseSBlbmFibGVkLiAqLworCS8qIHZhbCAmPSBocDEwMF9pbncoIElSUV9NQVNLICk7ICovCisKKwkvKiAKKwkgKiBSWF9QRExfRklMTF9DT01QTCBpcyBzZXQgd2hlbmV2ZXIgYSBSWF9QREwgaGFzIGJlZW4gZXhlY3V0ZWQuIEEgUlhfUERMIAorCSAqIGlzIGNvbnNpZGVyZWQgZXhlY3V0ZWQgd2hlbmV2ZXIgdGhlIFJYX1BETCBkYXRhIHN0cnVjdHVyZSBpcyBubyBsb25nZXIgCisJICogbmVlZGVkLgorCSAqLworCWlmICh2YWwgJiBIUDEwMF9SWF9QRExfRklMTF9DT01QTCkgeworCQlpZiAobHAtPm1vZGUgPT0gMSkKKwkJCWhwMTAwX3J4X2JtKGRldik7CisJCWVsc2UgeworCQkJcHJpbnRrKCJocDEwMDogJXM6IHJ4X3BkbF9maWxsX2NvbXBsIGludGVycnVwdCBhbHRob3VnaCBub3QgYnVzbWFzdGVyP1xuIiwgZGV2LT5uYW1lKTsKKwkJfQorCX0KKworCS8qIAorCSAqIFRoZSBSWF9QQUNLRVQgaW50ZXJydXB0IGlzIHNldCwgd2hlbiB0aGUgcmVjZWl2ZSBwYWNrZXQgY291bnRlciBpcworCSAqIG5vbiB6ZXJvLiBXZSB1c2UgdGhpcyBpbnRlcnJ1cHQgZm9yIHJlY2VpdmluZyBpbiBzbGF2ZSBtb2RlLiBJbgorCSAqIGJ1c21hc3RlciBtb2RlLCB3ZSB1c2UgaXQgdG8gbWFrZSBzdXJlIHdlIGRpZCBub3QgbWlzcyBhbnkgcnhfcGRsX2ZpbGwKKwkgKiBpbnRlcnJ1cHRzLiBJZiByeF9wZGxfZmlsbF9jb21wbCBpcyBub3Qgc2V0IGFuZCByeF9wYWNrZXQgaXMgc2V0LCB0aGVuCisJICogd2Ugc29tZWhvdyBoYXZlIG1pc3NlZCBhIHJ4X3BkbF9maWxsX2NvbXBsIGludGVycnVwdC4KKwkgKi8KKworCWlmICh2YWwgJiBIUDEwMF9SWF9QQUNLRVQpIHsJLyogUmVjZWl2ZSBQYWNrZXQgQ291bnRlciBpcyBub24gemVybyAqLworCQlpZiAobHAtPm1vZGUgIT0gMSkJLyogbm9uIGJ1c21hc3RlciAqLworCQkJaHAxMDBfcngoZGV2KTsKKwkJZWxzZSBpZiAoISh2YWwgJiBIUDEwMF9SWF9QRExfRklMTF9DT01QTCkpIHsKKwkJCS8qIFNob3VsZG50IGhhcHBlbiAtIG1heWJlIHdlIG1pc3NlZCBhIFJYX1BETF9GSUxMIEludGVycnVwdD8gICovCisJCQlocDEwMF9yeF9ibShkZXYpOworCQl9CisJfQorCisJLyoKKwkgKiBBY2suIHRoYXQgd2UgaGF2ZSBub3RpY2VkIHRoZSBpbnRlcnJ1cHQgYW5kIHRoZXJlYnkgYWxsb3cgbmV4dCBvbmUuCisJICogTm90ZSB0aGF0IHRoaXMgaXMgbm93IGRvbmUgYWZ0ZXIgdGhlIHNsYXZlIHJ4IGZ1bmN0aW9uLCBzaW5jZSBmaXJzdAorCSAqIGFja25vd2xlZGdpbmcgYW5kIHRoZW4gc2V0dGluZyBBRFZfTlhUX1BLVCBjYXVzZWQgYW4gZXh0cmEgaW50ZXJydXB0CisJICogb24gdGhlIEoyNTczLgorCSAqLworCWhwMTAwX291dHcodmFsLCBJUlFfU1RBVFVTKTsKKworCS8qCisJICogUlhfRVJST1IgaXMgc2V0IHdoZW4gYSBwYWNrZXQgaXMgZHJvcHBlZCBkdWUgdG8gbm8gbWVtb3J5IHJlc291cmNlcyBvbiAKKwkgKiB0aGUgY2FyZCBvciB3aGVuIGEgUkNWX0VSUiBvY2N1cnMuIAorCSAqIFRYX0VSUk9SIGlzIHNldCB3aGVuIGEgVFhfQUJPUlQgY29uZGl0aW9uIG9jY3VycyBpbiB0aGUgTUFDLT5leGlzdHMgIAorCSAqIG9ubHkgaW4gdGhlIDgwMi4zIE1BQyBhbmQgaGFwcGVucyB3aGVuIDE2IGNvbGxpc2lvbnMgb2NjdXIgZHVyaW5nIGEgVFggCisJICovCisJaWYgKHZhbCAmIChIUDEwMF9UWF9FUlJPUiB8IEhQMTAwX1JYX0VSUk9SKSkgeworI2lmZGVmIEhQMTAwX0RFQlVHX0lSUQorCQlwcmludGsoImhwMTAwOiAlczogVFgvUlggRXJyb3IgSVJRXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCWhwMTAwX3VwZGF0ZV9zdGF0cyhkZXYpOworCQlpZiAobHAtPm1vZGUgPT0gMSkgeworCQkJaHAxMDBfcnhmaWxsKGRldik7CisJCQlocDEwMF9jbGVhbl90eHJpbmcoZGV2KTsKKwkJfQorCX0KKworCS8qIAorCSAqIFJYX1BEQV9aRVJPIGlzIHNldCB3aGVuIHRoZSBQREEgY291bnQgZ29lcyBmcm9tIG5vbi16ZXJvIHRvIHplcm8uIAorCSAqLworCWlmICgobHAtPm1vZGUgPT0gMSkgJiYgKHZhbCAmIChIUDEwMF9SWF9QREFfWkVSTykpKQorCQlocDEwMF9yeGZpbGwoZGV2KTsKKworCS8qIAorCSAqIEhQMTAwX1RYX0NPTVBMRVRFIGludGVycnVwdCBvY2N1cnMgd2hlbiBwYWNrZXQgdHJhbnNtaXR0ZWQgb24gd2lyZSAKKwkgKiBpcyBjb21wbGV0ZWQgCisJICovCisJaWYgKChscC0+bW9kZSA9PSAxKSAmJiAodmFsICYgKEhQMTAwX1RYX0NPTVBMRVRFKSkpCisJCWhwMTAwX2NsZWFuX3R4cmluZyhkZXYpOworCisJLyogCisJICogTUlTQ19FUlJPUiBpcyBzZXQgd2hlbiBlaXRoZXIgdGhlIExBTiBsaW5rIGdvZXMgZG93biBvciBhIGRldGVjdGVkCisJICogYnVzIGVycm9yIG9jY3Vycy4KKwkgKi8KKwlpZiAodmFsICYgSFAxMDBfTUlTQ19FUlJPUikgewkvKiBOZXcgZm9yIEoyNTg1QiAqLworI2lmZGVmIEhQMTAwX0RFQlVHX0lSUQorCQlwcmludGsKKwkJICAgICgiaHAxMDA6ICVzOiBNaXNjLiBFcnJvciBJbnRlcnJ1cHQgLSBDaGVjayBjYWJsaW5nLlxuIiwKKwkJICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCWlmIChscC0+bW9kZSA9PSAxKSB7CisJCQlocDEwMF9jbGVhbl90eHJpbmcoZGV2KTsKKwkJCWhwMTAwX3J4ZmlsbChkZXYpOworCQl9CisJCWhwMTAwX21pc2NfaW50ZXJydXB0KGRldik7CisJfQorCisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKwlocDEwMF9pbnRzX29uKCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogIHNvbWUgbWlzYyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCBocDEwMF9zdGFydF9pbnRlcmZhY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjIwLCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IGhwMTAwX3N0YXJ0X2ludGVyZmFjZVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBFbnN1cmUgdGhlIGFkYXB0ZXIgZG9lcyBub3Qgd2FudCB0byByZXF1ZXN0IGFuIGludGVycnVwdCB3aGVuICovCisJLyogZW5hYmxpbmcgdGhlIElSUSBsaW5lIHRvIGJlIGFjdGl2ZSBvbiB0aGUgYnVzIChpLmUuIG5vdCB0cmktc3RhdGVkKSAqLworCWhwMTAwX3BhZ2UoUEVSRk9STUFOQ0UpOworCWhwMTAwX291dHcoMHhmZWZlLCBJUlFfTUFTSyk7CS8qIG1hc2sgb2ZmIGFsbCBpbnRzICovCisJaHAxMDBfb3V0dygweGZmZmYsIElSUV9TVEFUVVMpOwkvKiBhY2sgYWxsIElSUXMgKi8KKwlocDEwMF9vdXR3KEhQMTAwX0ZBS0VfSU5UIHwgSFAxMDBfSU5UX0VOIHwgSFAxMDBfUkVTRVRfTEIsCisJCSAgIE9QVElPTl9MU1cpOworCS8qIFVuIFRyaS1zdGF0ZSBpbnQuIFRPRE86IENoZWNrIGlmIHNoYXJlZCBpbnRlcnJ1cHRzIGNhbiBiZSByZWFsaXNlZD8gKi8KKwlocDEwMF9vdXR3KEhQMTAwX1RSSV9JTlQgfCBIUDEwMF9SRVNFVF9IQiwgT1BUSU9OX0xTVyk7CisKKwlpZiAobHAtPm1vZGUgPT0gMSkgeworCQkvKiBNYWtlIHN1cmUgQk0gYml0IGlzIHNldC4uLiAqLworCQlocDEwMF9wYWdlKEhXX01BUCk7CisJCWhwMTAwX29yYihIUDEwMF9CTV9NQVNURVIsIEJNKTsKKwkJaHAxMDBfcnhmaWxsKGRldik7CisJfSBlbHNlIGlmIChscC0+bW9kZSA9PSAyKSB7CisJCS8qIEVuYWJsZSBtZW1vcnkgbWFwcGluZy4gTm90ZTogRG9uJ3QgZG8gdGhpcyB3aGVuIGJ1c21hc3Rlci4gKi8KKwkJaHAxMDBfb3V0dyhIUDEwMF9NTUFQX0RJUyB8IEhQMTAwX1JFU0VUX0hCLCBPUFRJT05fTFNXKTsKKwl9CisKKwlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKKwlocDEwMF9vdXR3KDB4ZmVmZSwgSVJRX01BU0spOwkvKiBtYXNrIG9mZiBhbGwgaW50cyAqLworCWhwMTAwX291dHcoMHhmZmZmLCBJUlFfU1RBVFVTKTsJLyogYWNrIElSUSAqLworCisJLyogZW5hYmxlIGEgZmV3IGludGVycnVwdHM6ICovCisJaWYgKGxwLT5tb2RlID09IDEpIHsJLyogYnVzbWFzdGVyIG1vZGUgKi8KKwkJaHAxMDBfb3V0dyhIUDEwMF9SWF9QRExfRklMTF9DT01QTCB8CisJCQkgICBIUDEwMF9SWF9QREFfWkVSTyB8IEhQMTAwX1JYX0VSUk9SIHwKKwkJCSAgIC8qIEhQMTAwX1JYX1BBQ0tFVCAgICB8ICovCisJCQkgICAvKiBIUDEwMF9SWF9FQVJMWV9JTlQgfCAgKi8gSFAxMDBfU0VUX0hCIHwKKwkJCSAgIC8qIEhQMTAwX1RYX1BEQV9aRVJPICB8ICAqLworCQkJICAgSFAxMDBfVFhfQ09NUExFVEUgfAorCQkJICAgLyogSFAxMDBfTUlTQ19FUlJPUiAgIHwgICovCisJCQkgICBIUDEwMF9UWF9FUlJPUiB8IEhQMTAwX1NFVF9MQiwgSVJRX01BU0spOworCX0gZWxzZSB7CisJCWhwMTAwX291dHcoSFAxMDBfUlhfUEFDS0VUIHwKKwkJCSAgIEhQMTAwX1JYX0VSUk9SIHwgSFAxMDBfU0VUX0hCIHwKKwkJCSAgIEhQMTAwX1RYX0VSUk9SIHwgSFAxMDBfU0VUX0xCLCBJUlFfTUFTSyk7CisJfQorCisJLyogTm90ZSA6IGJlZm9yZSBocDEwMF9zZXRfbXVsdGljYXN0X2xpc3QoKSwgYmVjYXVzZSBpdCB3aWxsIHBsYXkgd2l0aAorCSAqIHNwaW5sb2NrIGl0c2VsZi4uLiBKZWFuIElJICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIEVuYWJsZSBNQUMgVHggYW5kIFJYLCBzZXQgTUFDIG1vZGVzLCAuLi4gKi8KKwlocDEwMF9zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKK30KKworc3RhdGljIHZvaWQgaHAxMDBfc3RvcF9pbnRlcmZhY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1X2ludCB2YWw7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJcHJpbnRrKCJocDEwMDogJXM6IGhwMTAwX3N0b3BfaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOworCWhwMTAwX291dHcoMHg0MjIxLCBUUkFDRSk7CisjZW5kaWYKKworCWlmIChscC0+bW9kZSA9PSAxKQorCQlocDEwMF9CTV9zaHV0ZG93bihkZXYpOworCWVsc2UgeworCQkvKiBOb3RlOiBNTUFQX0RJUyB3aWxsIGJlIHJlZW5hYmxlZCBieSBzdGFydF9pbnRlcmZhY2UgKi8KKwkJaHAxMDBfb3V0dyhIUDEwMF9JTlRfRU4gfCBIUDEwMF9SRVNFVF9MQiB8CisJCQkgICBIUDEwMF9UUklfSU5UIHwgSFAxMDBfTU1BUF9ESVMgfCBIUDEwMF9TRVRfSEIsCisJCQkgICBPUFRJT05fTFNXKTsKKwkJdmFsID0gaHAxMDBfaW53KE9QVElPTl9MU1cpOworCisJCWhwMTAwX3BhZ2UoTUFDX0NUUkwpOworCQlocDEwMF9hbmRiKH4oSFAxMDBfUlhfRU4gfCBIUDEwMF9UWF9FTiksIE1BQ19DRkdfMSk7CisKKwkJaWYgKCEodmFsICYgSFAxMDBfSFdfUlNUKSkKKwkJCXJldHVybjsJLyogSWYgcmVzZXQsIGltbS4gcmV0dXJuIC4uLiAqLworCQkvKiAuLi4gZWxzZTogYnVzeSB3YWl0IHVudGlsIGlkbGUgKi8KKwkJZm9yICh2YWwgPSAwOyB2YWwgPCA2MDAwOyB2YWwrKykKKwkJCWlmICgoaHAxMDBfaW5iKE1BQ19DRkdfMSkgJiAoSFAxMDBfVFhfSURMRSB8IEhQMTAwX1JYX0lETEUpKSA9PSAoSFAxMDBfVFhfSURMRSB8IEhQMTAwX1JYX0lETEUpKSB7CisJCQkJaHAxMDBfcGFnZShQRVJGT1JNQU5DRSk7CisJCQkJcmV0dXJuOworCQkJfQorCQlwcmludGsoImhwMTAwOiAlczogaHAxMDBfc3RvcF9pbnRlcmZhY2UgLSB0aW1lb3V0XG4iLCBkZXYtPm5hbWUpOworCQlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhwMTAwX2xvYWRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfc2hvcnQgcHJvYmVfaW9hZGRyKQoreworCWludCBpOworCWludCBpb2FkZHIgPSBwcm9iZV9pb2FkZHIgPiAwID8gcHJvYmVfaW9hZGRyIDogZGV2LT5iYXNlX2FkZHI7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMjIsIFRSQUNFKTsKKyNlbmRpZgorCisJaHAxMDBfcGFnZShFRVBST01fQ1RSTCk7CisJaHAxMDBfYW5kdyh+SFAxMDBfRUVQUk9NX0xPQUQsIEVFUFJPTV9DVFJMKTsKKwlocDEwMF9vcncoSFAxMDBfRUVQUk9NX0xPQUQsIEVFUFJPTV9DVFJMKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykKKwkJaWYgKCEoaHAxMDBfaW5iKE9QVElPTl9NU1cpICYgSFAxMDBfRUVfTE9BRCkpCisJCQlyZXR1cm47CisJcHJpbnRrKCJocDEwMDogJXM6IGhwMTAwX2xvYWRfZWVwcm9tIC0gdGltZW91dFxuIiwgZGV2LT5uYW1lKTsKK30KKworLyogIFNlbnNlIGNvbm5lY3Rpb24gc3RhdHVzLgorICogIHJldHVybiB2YWx1ZXM6IExBTl8xMCAgLSBDb25uZWN0ZWQgdG8gMTBNYml0L3MgbmV0d29yaworICogICAgICAgICAgICAgICAgIExBTl8xMDAgLSBDb25uZWN0ZWQgdG8gMTAwTWJpdC9zIG5ldHdvcmsKKyAqICAgICAgICAgICAgICAgICBMQU5fRVJSIC0gbm90IGNvbm5lY3RlZCBvciAxMDBNYml0L3MgSHViIGRvd24KKyAqLworc3RhdGljIGludCBocDEwMF9zZW5zZV9sYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdV9zaG9ydCB2YWxfVkcsIHZhbF8xMDsKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjIzLCBUUkFDRSk7CisjZW5kaWYKKworCWhwMTAwX3BhZ2UoTUFDX0NUUkwpOworCXZhbF8xMCA9IGhwMTAwX2luYigxMF9MQU5fQ0ZHXzEpOworCXZhbF9WRyA9IGhwMTAwX2luYihWR19MQU5fQ0ZHXzEpOworCWhwMTAwX3BhZ2UoUEVSRk9STUFOQ0UpOworI2lmZGVmIEhQMTAwX0RFQlVHCisJcHJpbnRrKCJocDEwMDogJXM6IHNlbnNlX2xhbjogdmFsX1ZHID0gMHglMDR4LCB2YWxfMTAgPSAweCUwNHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgdmFsX1ZHLCB2YWxfMTApOworI2VuZGlmCisKKwlpZiAodmFsXzEwICYgSFAxMDBfTElOS19CRUFUX1NUKQkvKiAxME1iIGNvbm5lY3Rpb24gaXMgYWN0aXZlICovCisJCXJldHVybiBIUDEwMF9MQU5fMTA7CisKKwlpZiAodmFsXzEwICYgSFAxMDBfQVVJX1NUKSB7CS8qIGhhdmUgd2UgQk5DIG9yIEFVSSBvbmJvYXJkPyAqLworCQkvKgorCQkgKiBUaGlzIGNhbiBiZSBvdmVycmlkZW4gYnkgZG9zIHV0aWxpdHksIHNvIGlmIHRoaXMgaGFzIG5vIGVmZmVjdCwKKwkJICogcGVyaGFwcyB5b3UgbmVlZCB0byBkb3dubG9hZCB0aGF0IHV0aWxpdHkgZnJvbSBIUCBhbmQgc2V0IGNhcmQKKwkJICogYmFjayB0byAiYXV0byBkZXRlY3QiLgorCQkgKi8KKwkJdmFsXzEwIHw9IEhQMTAwX0FVSV9TRUwgfCBIUDEwMF9MT1dfVEg7CisJCWhwMTAwX3BhZ2UoTUFDX0NUUkwpOworCQlocDEwMF9vdXRiKHZhbF8xMCwgMTBfTEFOX0NGR18xKTsKKwkJaHAxMDBfcGFnZShQRVJGT1JNQU5DRSk7CisJCXJldHVybiBIUDEwMF9MQU5fQ09BWDsKKwl9CisKKwkvKiBUaG9zZSBjYXJkcyBkb24ndCBoYXZlIGEgMTAwIE1iaXQgY29ubmVjdG9yICovCisJaWYgKCAhc3RyY21wKGxwLT5pZCwgIkhXUDE5MjAiKSAgfHwKKwkgICAgIChscC0+cGNpX2RldiAmJiAKKwkgICAgICBscC0+cGNpX2Rldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSUQgJiYgCisJICAgICAgKGxwLT5wY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9IUF9KMjk3MEEgfHwKKwkgICAgICAgbHAtPnBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0hQX0oyOTczQSkpKQorCQlyZXR1cm4gSFAxMDBfTEFOX0VSUjsKKwkKKwlpZiAodmFsX1ZHICYgSFAxMDBfTElOS19DQUJMRV9TVCkJLyogQ2FuIGhlYXIgdGhlIEhVQnMgdG9uZS4gKi8KKwkJcmV0dXJuIEhQMTAwX0xBTl8xMDA7CisJcmV0dXJuIEhQMTAwX0xBTl9FUlI7Cit9CisKK3N0YXRpYyBpbnQgaHAxMDBfZG93bl92Z19saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyB0aW1lOworCWxvbmcgc2F2ZWxhbiwgbmV3bGFuOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjI0LCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IGRvd25fdmdfbGlua1xuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJaHAxMDBfcGFnZShNQUNfQ1RSTCk7CisJdGltZSA9IGppZmZpZXMgKyAoSFogLyA0KTsKKwlkbyB7CisJCWlmIChocDEwMF9pbmIoVkdfTEFOX0NGR18xKSAmIEhQMTAwX0xJTktfQ0FCTEVfU1QpCisJCQlicmVhazsKKwkJaWYgKCFpbl9pbnRlcnJ1cHQoKSkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0KKwl9IHdoaWxlICh0aW1lX2FmdGVyKHRpbWUsIGppZmZpZXMpKTsKKworCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWUpKQkvKiBubyBzaWduYWwtPm5vIGxvZ291dCAqLworCQlyZXR1cm4gMDsKKworCS8qIERyb3AgdGhlIFZHIExpbmsgYnkgY2xlYXJpbmcgdGhlIGxpbmsgdXAgY21kIGFuZCBsb2FkIGFkZHIuICovCisKKwlocDEwMF9hbmRiKH4oSFAxMDBfTE9BRF9BRERSIHwgSFAxMDBfTElOS19DTUQpLCBWR19MQU5fQ0ZHXzEpOworCWhwMTAwX29yYihIUDEwMF9WR19TRUwsIFZHX0xBTl9DRkdfMSk7CisKKwkvKiBDb25kaXRpb25hbGx5IHN0YWxsIGZvciA+MjUwbXMgb24gTGluay1VcCBTdGF0dXMgKHRvIGdvIGRvd24pICovCisJdGltZSA9IGppZmZpZXMgKyAoSFogLyAyKTsKKwlkbyB7CisJCWlmICghKGhwMTAwX2luYihWR19MQU5fQ0ZHXzEpICYgSFAxMDBfTElOS19VUF9TVCkpCisJCQlicmVhazsKKwkJaWYgKCFpbl9pbnRlcnJ1cHQoKSkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0KKwl9IHdoaWxlICh0aW1lX2FmdGVyKHRpbWUsIGppZmZpZXMpKTsKKworI2lmZGVmIEhQMTAwX0RFQlVHCisJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZSkpCisJCXByaW50aygiaHAxMDA6ICVzOiBkb3duX3ZnX2xpbms6IExpbmsgZG9lcyBub3QgZ28gZG93bj9cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qIFRvIHByZXZlbnQgY29uZGl0aW9uIHdoZXJlIFJldiAxIFZHIE1BQyBhbmQgb2xkIGh1YnMgZG8gbm90IGNvbXBsZXRlICovCisJLyogbG9nb3V0IHVuZGVyIHRyYWZmaWMgKGV2ZW4gdGhvdWdoIGFsbCB0aGUgc3RhdHVzIGJpdHMgYXJlIGNsZWFyZWQpLCAgKi8KKwkvKiBkbyB0aGlzIHdvcmthcm91bmQgdG8gZ2V0IHRoZSBSZXYgMSBNQUMgaW4gaXRzIGlkbGUgc3RhdGUgKi8KKwlpZiAobHAtPmNoaXAgPT0gSFAxMDBfQ0hJUElEX0xBU1NFTikgeworCQkvKiBSZXNldCBWRyBNQUMgdG8gaW5zdXJlIGl0IGxlYXZlcyB0aGUgbG9nb2ZmIHN0YXRlIGV2ZW4gaWYgKi8KKwkJLyogdGhlIEh1YiBpcyBzdGlsbCBlbWl0dGluZyB0b25lcyAqLworCQlocDEwMF9hbmRiKH5IUDEwMF9WR19SRVNFVCwgVkdfTEFOX0NGR18xKTsKKwkJdWRlbGF5KDE1MDApOwkvKiB3YWl0IGZvciA+MW1zICovCisJCWhwMTAwX29yYihIUDEwMF9WR19SRVNFVCwgVkdfTEFOX0NGR18xKTsJLyogUmVsZWFzZSBSZXNldCAqLworCQl1ZGVsYXkoMTUwMCk7CisJfQorCisJLyogTmV3OiBGb3IgbGFzc2VuLCBzd2l0Y2ggdG8gMTAgTWJwcyBtYWMgYnJpZWZseSB0byBjbGVhciB0cmFpbmluZyBBQ0sgKi8KKwkvKiB0byBnZXQgdGhlIFZHIG1hYyB0byBmdWxsIHJlc2V0LiBUaGlzIGlzIG5vdCByZXEuZCB3aXRoIGxhdGVyIGNoaXBzICovCisJLyogTm90ZTogSXQgd2lsbCB0YWtlIHRoZSBiZXR3ZWVuIDEgYW5kIDIgc2Vjb25kcyBmb3IgdGhlIFZHIG1hYyB0byBiZSAqLworCS8qIHNlbGVjdGVkIGFnYWluISBUaGlzIHdpbGwgYmUgbGVmdCB0byB0aGUgY29ubmVjdCBodWIgZnVuY3Rpb24gdG8gKi8KKwkvKiBwZXJmb3JtIGlmIGRlc2lyZWQuICAqLworCWlmIChscC0+Y2hpcCA9PSBIUDEwMF9DSElQSURfTEFTU0VOKSB7CisJCS8qIEhhdmUgdG8gd3JpdGUgdG8gMTAgYW5kIDEwMFZHIGNvbnRyb2wgcmVnaXN0ZXJzIHNpbXVsdGFuZW91c2x5ICovCisJCXNhdmVsYW4gPSBuZXdsYW4gPSBocDEwMF9pbmwoMTBfTEFOX0NGR18xKTsJLyogcmVhZCAxMCsxMDAgTEFOX0NGRyByZWdzICovCisJCW5ld2xhbiAmPSB+KEhQMTAwX1ZHX1NFTCA8PCAxNik7CisJCW5ld2xhbiB8PSAoSFAxMDBfRE9UM19NQUMpIDw8IDg7CisJCWhwMTAwX2FuZGIofkhQMTAwX0FVVE9fTU9ERSwgTUFDX0NGR18zKTsJLyogQXV0b3NlbCBvZmYgKi8KKwkJaHAxMDBfb3V0bChuZXdsYW4sIDEwX0xBTl9DRkdfMSk7CisKKwkJLyogQ29uZGl0aW9uYWxseSBzdGFsbCBmb3IgNXNlYyBvbiBWRyBzZWxlY3RlZC4gKi8KKwkJdGltZSA9IGppZmZpZXMgKyAoSFogKiA1KTsKKwkJZG8geworCQkJaWYgKCEoaHAxMDBfaW5iKE1BQ19DRkdfNCkgJiBIUDEwMF9NQUNfU0VMX1NUKSkKKwkJCQlicmVhazsKKwkJCWlmICghaW5faW50ZXJydXB0KCkpIHsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCQl9CisJCX0gd2hpbGUgKHRpbWVfYWZ0ZXIodGltZSwgamlmZmllcykpOworCisJCWhwMTAwX29yYihIUDEwMF9BVVRPX01PREUsIE1BQ19DRkdfMyk7CS8qIEF1dG9zZWwgYmFjayBvbiAqLworCQlocDEwMF9vdXRsKHNhdmVsYW4sIDEwX0xBTl9DRkdfMSk7CisJfQorCisJdGltZSA9IGppZmZpZXMgKyAoMyAqIEhaKTsJLyogVGltZW91dCAzcyAqLworCWRvIHsKKwkJaWYgKChocDEwMF9pbmIoVkdfTEFOX0NGR18xKSAmIEhQMTAwX0xJTktfQ0FCTEVfU1QpID09IDApCisJCQlicmVhazsKKwkJaWYgKCFpbl9pbnRlcnJ1cHQoKSkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0KKwl9IHdoaWxlICh0aW1lX2FmdGVyKHRpbWUsIGppZmZpZXMpKTsKKworCWlmICh0aW1lX2JlZm9yZV9lcSh0aW1lLCBqaWZmaWVzKSkgeworI2lmZGVmIEhQMTAwX0RFQlVHCisJCXByaW50aygiaHAxMDA6ICVzOiBkb3duX3ZnX2xpbms6IHRpbWVvdXRcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuIC1FSU87CisJfQorCisJdGltZSA9IGppZmZpZXMgKyAoMiAqIEhaKTsJLyogVGhpcyBzZWVtcyB0byB0YWtlIGEgd2hpbGUuLi4uICovCisJZG8geworCQlpZiAoIWluX2ludGVycnVwdCgpKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJfQorCX0gd2hpbGUgKHRpbWVfYWZ0ZXIodGltZSwgamlmZmllcykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHAxMDBfbG9naW5fdG9fdmdfaHViKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfc2hvcnQgZm9yY2VfcmVsb2dpbikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1X3Nob3J0IHZhbCA9IDA7CisJdW5zaWduZWQgbG9uZyB0aW1lOworCWludCBzdGFydHN0OworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjI1LCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IGxvZ2luX3RvX3ZnX2h1YlxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogSW5pdGlhdGUgYSBsb2dpbiBzZXF1ZW5jZSBpZmYgVkcgTUFDIGlzIGVuYWJsZWQgYW5kIGVpdGhlciBMb2FkIEFkZHJlc3MKKwkgKiBiaXQgaXMgemVybyBvciB0aGUgZm9yY2UgcmVsb2dpbiBmbGFnIGlzIHNldCAoZS5nLiBkdWUgdG8gTUFDIGFkZHJlc3Mgb3IKKwkgKiBwcm9taXNjdW91cyBtb2RlIGNoYW5nZSkKKwkgKi8KKwlocDEwMF9wYWdlKE1BQ19DVFJMKTsKKwlzdGFydHN0ID0gaHAxMDBfaW5iKFZHX0xBTl9DRkdfMSk7CisJaWYgKChmb3JjZV9yZWxvZ2luID09IDEpIHx8IChocDEwMF9pbmIoTUFDX0NGR180KSAmIEhQMTAwX01BQ19TRUxfU1QpKSB7CisjaWZkZWYgSFAxMDBfREVCVUdfVFJBSU5JTkcKKwkJcHJpbnRrKCJocDEwMDogJXM6IFN0YXJ0IHRyYWluaW5nXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkJLyogRW5zdXJlIFZHIFJlc2V0IGJpdCBpcyAxIChpLmUuLCBkbyBub3QgcmVzZXQpICovCisJCWhwMTAwX29yYihIUDEwMF9WR19SRVNFVCwgVkdfTEFOX0NGR18xKTsKKworCQkvKiBJZiBMYXNzZW4gQU5EIGF1dG8tc2VsZWN0LW1vZGUgQU5EIFZHIHRvbmVzIHdlcmUgc2Vuc2VkIG9uICovCisJCS8qIGVudHJ5IHRoZW4gdGVtcG9yYXJpbHkgcHV0IHRoZW0gaW50byBmb3JjZSAxMDBNYml0IG1vZGUgKi8KKwkJaWYgKChscC0+Y2hpcCA9PSBIUDEwMF9DSElQSURfTEFTU0VOKSAmJiAoc3RhcnRzdCAmIEhQMTAwX0xJTktfQ0FCTEVfU1QpKQorCQkJaHAxMDBfYW5kYih+SFAxMDBfRE9UM19NQUMsIDEwX0xBTl9DRkdfMik7CisKKwkJLyogRHJvcCB0aGUgVkcgbGluayBieSB6ZXJvaW5nIExpbmsgVXAgQ29tbWFuZCBhbmQgTG9hZCBBZGRyZXNzICAqLworCQlocDEwMF9hbmRiKH4oSFAxMDBfTElOS19DTUQgLyogfEhQMTAwX0xPQURfQUREUiAqLyApLCBWR19MQU5fQ0ZHXzEpOworCisjaWZkZWYgSFAxMDBfREVCVUdfVFJBSU5JTkcKKwkJcHJpbnRrKCJocDEwMDogJXM6IEJyaW5nIGRvd24gdGhlIGxpbmtcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCQkvKiBXYWl0IGZvciBsaW5rIHRvIGRyb3AgKi8KKwkJdGltZSA9IGppZmZpZXMgKyAoSFogLyAxMCk7CisJCWRvIHsKKwkJCWlmICh+KGhwMTAwX2luYihWR19MQU5fQ0ZHXzEpICYgSFAxMDBfTElOS19VUF9TVCkpCisJCQkJYnJlYWs7CisJCQlpZiAoIWluX2ludGVycnVwdCgpKSB7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQkJfQorCQl9IHdoaWxlICh0aW1lX2FmdGVyKHRpbWUsIGppZmZpZXMpKTsKKworCQkvKiBTdGFydCBhbiBhZGRyZXNzZWQgdHJhaW5pbmcgYW5kIG9wdGlvbmFsbHkgcmVxdWVzdCBwcm9taXNjdW91cyBwb3J0ICovCisJCWlmICgoZGV2LT5mbGFncykgJiBJRkZfUFJPTUlTQykgeworCQkJaHAxMDBfb3JiKEhQMTAwX1BST01fTU9ERSwgVkdfTEFOX0NGR18yKTsKKwkJCWlmIChscC0+Y2hpcCA9PSBIUDEwMF9DSElQSURfTEFTU0VOKQorCQkJCWhwMTAwX29ydyhIUDEwMF9NQUNSUV9QUk9NU0MsIFRSQUlOX1JFUVVFU1QpOworCQl9IGVsc2UgeworCQkJaHAxMDBfYW5kYih+SFAxMDBfUFJPTV9NT0RFLCBWR19MQU5fQ0ZHXzIpOworCQkJLyogRm9yIEVUUiBwYXJ0cyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBwcm9tLiBiaXQgaW4gdGhlIHRyYWluaW5nCisJCQkgKiByZWdpc3Rlciwgb3RoZXJ3aXNlIHByb21pc2Npb3VzIG1vZGUgd29uJ3QgYmUgZGlzYWJsZWQuCisJCQkgKi8KKwkJCWlmIChscC0+Y2hpcCA9PSBIUDEwMF9DSElQSURfTEFTU0VOKSB7CisJCQkJaHAxMDBfYW5kdyh+SFAxMDBfTUFDUlFfUFJPTVNDLCBUUkFJTl9SRVFVRVNUKTsKKwkJCX0KKwkJfQorCisJCS8qIFdpdGggRVRSIHBhcnRzLCBmcmFtZSBmb3JtYXQgcmVxdWVzdCBiaXRzIGNhbiBiZSBzZXQuICovCisJCWlmIChscC0+Y2hpcCA9PSBIUDEwMF9DSElQSURfTEFTU0VOKQorCQkJaHAxMDBfb3JiKEhQMTAwX01BQ1JRX0ZSQU1FRk1UX0VJVEhFUiwgVFJBSU5fUkVRVUVTVCk7CisKKwkJaHAxMDBfb3JiKEhQMTAwX0xJTktfQ01EIHwgSFAxMDBfTE9BRF9BRERSIHwgSFAxMDBfVkdfUkVTRVQsIFZHX0xBTl9DRkdfMSk7CisKKwkJLyogTm90ZTogTmV4dCB3YWl0IGNvdWxkIGJlIG9taXR0ZWQgZm9yIEhvb2QgYW5kIGVhcmxpZXIgY2hpcHMgdW5kZXIgKi8KKwkJLyogY2VydGFpbiBjaXJjdW1zdGFuY2VzICovCisJCS8qIFRPRE86IGNoZWNrIGlmIGhvb2QvZWFybGllciBhbmQgc2tpcCB3YWl0LiAqLworCisJCS8qIFdhaXQgZm9yIGVpdGhlciBzaG9ydCB0aW1lb3V0IGZvciBWRyB0b25lcyBvciBsb25nIGZvciBsb2dpbiAgICAqLworCQkvKiBXYWl0IGZvciB0aGUgY2FyZCBoYXJkd2FyZSB0byBzaWduYWxpc2UgbGluayBjYWJsZSBzdGF0dXMgb2suLi4gKi8KKwkJaHAxMDBfcGFnZShNQUNfQ1RSTCk7CisJCXRpbWUgPSBqaWZmaWVzICsgKDEgKiBIWik7CS8qIDEgc2VjIHRpbWVvdXQgZm9yIGNhYmxlIHN0ICovCisJCWRvIHsKKwkJCWlmIChocDEwMF9pbmIoVkdfTEFOX0NGR18xKSAmIEhQMTAwX0xJTktfQ0FCTEVfU1QpCisJCQkJYnJlYWs7CisJCQlpZiAoIWluX2ludGVycnVwdCgpKSB7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQkJfQorCQl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lKSk7CisKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZSkpIHsKKyNpZmRlZiBIUDEwMF9ERUJVR19UUkFJTklORworCQkJcHJpbnRrKCJocDEwMDogJXM6IExpbmsgY2FibGUgc3RhdHVzIG5vdCBvaz8gVHJhaW5pbmcgYWJvcnRlZC5cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKyNpZmRlZiBIUDEwMF9ERUJVR19UUkFJTklORworCQkJcHJpbnRrCisJCQkgICAgKCJocDEwMDogJXM6IEhVQiB0b25lcyBkZXRlY3RlZC4gVHJ5aW5nIHRvIHRyYWluLlxuIiwKKwkJCSAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJCQl0aW1lID0gamlmZmllcyArICgyICogSFopOwkvKiBhZ2FpbiBhIHRpbWVvdXQgKi8KKwkJCWRvIHsKKwkJCQl2YWwgPSBocDEwMF9pbmIoVkdfTEFOX0NGR18xKTsKKwkJCQlpZiAoKHZhbCAmIChIUDEwMF9MSU5LX1VQX1NUKSkpIHsKKyNpZmRlZiBIUDEwMF9ERUJVR19UUkFJTklORworCQkJCQlwcmludGsoImhwMTAwOiAlczogUGFzc2VkIHRyYWluaW5nLlxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCFpbl9pbnRlcnJ1cHQoKSkgeworCQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQkJCX0KKwkJCX0gd2hpbGUgKHRpbWVfYWZ0ZXIodGltZSwgamlmZmllcykpOworCQl9CisKKwkJLyogSWYgTElOS19VUF9TVCBpcyBzZXQsIHRoZW4gd2UgYXJlIGxvZ2dlZCBpbnRvIHRoZSBodWIuICovCisJCWlmICh0aW1lX2JlZm9yZV9lcShqaWZmaWVzLCB0aW1lKSAmJiAodmFsICYgSFAxMDBfTElOS19VUF9TVCkpIHsKKyNpZmRlZiBIUDEwMF9ERUJVR19UUkFJTklORworCQkJcHJpbnRrKCJocDEwMDogJXM6IFN1Y2Nlc3NmdWxseSBsb2dnZWQgaW50byB0aGUgSFVCLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChscC0+Y2hpcCA9PSBIUDEwMF9DSElQSURfTEFTU0VOKSB7CisJCQkJdmFsID0gaHAxMDBfaW53KFRSQUlOX0FMTE9XKTsKKwkJCQlwcmludGsoImhwMTAwOiAlczogQ2FyZCBzdXBwb3J0cyAxMDBWRyBNQUMgVmVyc2lvbiBcIiVzXCIgIiwKKwkJCQkJICAgICBkZXYtPm5hbWUsIChocDEwMF9pbncoVFJBSU5fUkVRVUVTVCkgJiBIUDEwMF9DQVJEX01BQ1ZFUikgPyAiODAyLjEyIiA6ICJQcmUiKTsKKwkJCQlwcmludGsoIkRyaXZlciB3aWxsIHVzZSBNQUMgVmVyc2lvbiBcIiVzXCJcbiIsICh2YWwgJiBIUDEwMF9IVUJfTUFDVkVSKSA/ICI4MDIuMTIiIDogIlByZSIpOworCQkJCXByaW50aygiaHAxMDA6ICVzOiBGcmFtZSBmb3JtYXQgaXMgJXMuXG4iLCBkZXYtPm5hbWUsICh2YWwgJiBIUDEwMF9NQUxMT1dfRlJBTUVGTVQpID8gIjgwMi41IiA6ICI4MDIuMyIpOworCQkJfQorI2VuZGlmCisJCX0gZWxzZSB7CisJCQkvKiBJZiBMSU5LX1VQX1NUIGlzIG5vdCBzZXQsIGxvZ2luIHdhcyBub3Qgc3VjY2Vzc2Z1bCAqLworCQkJcHJpbnRrKCJocDEwMDogJXM6IFByb2JsZW0gbG9nZ2luZyBpbnRvIHRoZSBIVUIuXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9MQVNTRU4pIHsKKwkJCQkvKiBDaGVjayBhbGxvd2VkIFJlZ2lzdGVyIHRvIGZpbmQgb3V0IHdoeSB0aGVyZSBpcyBhIHByb2JsZW0uICovCisJCQkJdmFsID0gaHAxMDBfaW53KFRSQUlOX0FMTE9XKTsJLyogd29uJ3Qgd29yayBvbiBub24tRVRSIGNhcmQgKi8KKyNpZmRlZiBIUDEwMF9ERUJVR19UUkFJTklORworCQkJCXByaW50aygiaHAxMDA6ICVzOiBNQUMgQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWQ6IDB4JTA0eCwgSFVCIGFsbG93ZWQ6IDB4JTA0eFxuIiwgZGV2LT5uYW1lLCBocDEwMF9pbncoVFJBSU5fUkVRVUVTVCksIHZhbCk7CisjZW5kaWYKKwkJCQlpZiAodmFsICYgSFAxMDBfTUFMTE9XX0FDQ0RFTklFRCkKKwkJCQkJcHJpbnRrKCJocDEwMDogJXM6IEhVQiBhY2Nlc3MgZGVuaWVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlpZiAodmFsICYgSFAxMDBfTUFMTE9XX0NPTkZJR1VSRSkKKwkJCQkJcHJpbnRrKCJocDEwMDogJXM6IE1BQyBDb25maWd1cmF0aW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBOZXR3b3JrLlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlpZiAodmFsICYgSFAxMDBfTUFMTE9XX0RVUEFERFIpCisJCQkJCXByaW50aygiaHAxMDA6ICVzOiBEdXBsaWNhdGUgTUFDIEFkZHJlc3Mgb24gdGhlIE5ldHdvcmsuXG4iLCBkZXYtPm5hbWUpOworCQkJfQorCQl9CisKKwkJLyogSWYgd2UgaGF2ZSBwdXQgdGhlIGNoaXAgaW50byBmb3JjZWQgMTAwIE1iaXQgbW9kZSBlYXJsaWVyLCBnbyBiYWNrICovCisJCS8qIHRvIGF1dG8tc2VsZWN0IG1vZGUgKi8KKworCQlpZiAoKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9MQVNTRU4pICYmIChzdGFydHN0ICYgSFAxMDBfTElOS19DQUJMRV9TVCkpIHsKKwkJCWhwMTAwX3BhZ2UoTUFDX0NUUkwpOworCQkJaHAxMDBfb3JiKEhQMTAwX0RPVDNfTUFDLCAxMF9MQU5fQ0ZHXzIpOworCQl9CisKKwkJdmFsID0gaHAxMDBfaW5iKFZHX0xBTl9DRkdfMSk7CisKKwkJLyogQ2xlYXIgdGhlIE1JU0NfRVJST1IgSW50ZXJydXB0LCB3aGljaCBtaWdodCBiZSBnZW5lcmF0ZWQgd2hlbiBkb2luZyB0aGUgcmVsb2dpbiAqLworCQlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKKwkJaHAxMDBfb3V0dyhIUDEwMF9NSVNDX0VSUk9SLCBJUlFfU1RBVFVTKTsKKworCQlpZiAodmFsICYgSFAxMDBfTElOS19VUF9TVCkKKwkJCXJldHVybiAoMCk7CS8qIGxvZ2luIHdhcyBvayAqLworCQllbHNlIHsKKwkJCXByaW50aygiaHAxMDA6ICVzOiBUcmFpbmluZyBmYWlsZWQuXG4iLCBkZXYtPm5hbWUpOworCQkJaHAxMDBfZG93bl92Z19saW5rKGRldik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwkvKiBubyBmb3JjZWQgcmVsb2dpbiAmIGFscmVhZHkgbGluayB0aGVyZS0+bm8gdHJhaW5pbmcuICovCisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyB2b2lkIGhwMTAwX2Nhc2NhZGVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9zaG9ydCBlbmFibGUpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMjYsIFRSQUNFKTsKKwlwcmludGsoImhwMTAwOiAlczogY2FzY2FkZV9yZXNldFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJaWYgKGVuYWJsZSkgeworCQlocDEwMF9vdXR3KEhQMTAwX0hXX1JTVCB8IEhQMTAwX1JFU0VUX0xCLCBPUFRJT05fTFNXKTsKKwkJaWYgKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9MQVNTRU4pIHsKKwkJCS8qIExhc3NlbiByZXF1aXJlcyBhIFBDSSB0cmFuc21pdCBmaWZvIHJlc2V0ICovCisJCQlocDEwMF9wYWdlKEhXX01BUCk7CisJCQlocDEwMF9hbmRiKH5IUDEwMF9QQ0lfUkVTRVQsIFBDSUNUUkwyKTsKKwkJCWhwMTAwX29yYihIUDEwMF9QQ0lfUkVTRVQsIFBDSUNUUkwyKTsKKwkJCS8qIFdhaXQgZm9yIG1pbi4gMzAwIG5zICovCisJCQkvKiB3ZSBjYW4ndCB1c2UgamlmZmllcyBoZXJlLCBiZWNhdXNlIGl0IG1heSBiZSAqLworCQkJLyogdGhhdCB3ZSBoYXZlIGRpc2FibGVkIHRoZSB0aW1lci4uLiAqLworCQkJdWRlbGF5KDQwMCk7CisJCQlocDEwMF9hbmRiKH5IUDEwMF9QQ0lfUkVTRVQsIFBDSUNUUkwyKTsKKwkJCWhwMTAwX3BhZ2UoUEVSRk9STUFOQ0UpOworCQl9CisJfSBlbHNlIHsJCS8qIGJyaW5nIG91dCBvZiByZXNldCAqLworCQlocDEwMF9vdXR3KEhQMTAwX0hXX1JTVCB8IEhQMTAwX1NFVF9MQiwgT1BUSU9OX0xTVyk7CisJCXVkZWxheSg0MDApOworCQlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKKwl9Cit9CisKKyNpZmRlZiBIUDEwMF9ERUJVRwordm9pZCBocDEwMF9SZWdpc3RlckR1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IFBhZ2U7CisJaW50IFJlZ2lzdGVyOworCisJLyogRHVtcCBjb21tb24gcmVnaXN0ZXJzICovCisJcHJpbnRrKCJocDEwMDogJXM6IENhc2NhZGUgUmVnaXN0ZXIgRHVtcFxuIiwgZGV2LT5uYW1lKTsKKwlwcmludGsoImhhcmR3YXJlIGlkICMxOiAweCUuMnhcbiIsIGhwMTAwX2luYihIV19JRCkpOworCXByaW50aygiaGFyZHdhcmUgaWQgIzIvcGFnaW5nOiAweCUuMnhcbiIsIGhwMTAwX2luYihQQUdJTkcpKTsKKwlwcmludGsoIm9wdGlvbiAjMTogMHglLjR4XG4iLCBocDEwMF9pbncoT1BUSU9OX0xTVykpOworCXByaW50aygib3B0aW9uICMyOiAweCUuNHhcbiIsIGhwMTAwX2ludyhPUFRJT05fTVNXKSk7CisKKwkvKiBEdW1wIHBhZ2VkIHJlZ2lzdGVycyAqLworCWZvciAoUGFnZSA9IDA7IFBhZ2UgPCA4OyBQYWdlKyspIHsKKwkJLyogRHVtcCByZWdpc3RlcnMgKi8KKwkJcHJpbnRrKCJwYWdlOiAweCUuMnhcbiIsIFBhZ2UpOworCQlvdXR3KFBhZ2UsIGlvYWRkciArIDB4MDIpOworCQlmb3IgKFJlZ2lzdGVyID0gMHg4OyBSZWdpc3RlciA8IDB4MjI7IFJlZ2lzdGVyICs9IDIpIHsKKwkJCS8qIERpc3BsYXkgUmVnaXN0ZXIgY29udGVudHMgZXhjZXB0IGRhdGEgcG9ydCAqLworCQkJaWYgKCgoUmVnaXN0ZXIgIT0gMHgxMCkgJiYgKFJlZ2lzdGVyICE9IDB4MTIpKSB8fCAoUGFnZSA+IDApKSB7CisJCQkJcHJpbnRrKCIweCUuMnggPSAweCUuNHhcbiIsIFJlZ2lzdGVyLCBpbncoaW9hZGRyICsgUmVnaXN0ZXIpKTsKKwkJCX0KKwkJfQorCX0KKwlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIGNsZWFudXBfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkKQoreworCXN0cnVjdCBocDEwMF9wcml2YXRlICpwID0gbmV0ZGV2X3ByaXYoZCk7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkKTsKKwlyZWxlYXNlX3JlZ2lvbihkLT5iYXNlX2FkZHIsIEhQMTAwX1JFR0lPTl9TSVpFKTsKKworCWlmIChwLT5tb2RlID09IDEpCS8qIGJ1c21hc3RlciAqLworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHAtPnBjaV9kZXYsIE1BWF9SSU5HU0laRSArIDB4MGYsIAorCQkJCSAgICBwLT5wYWdlX3ZhZGRyX2FsZ24sIAorCQkJCSAgICB2aXJ0X3RvX3doYXRldmVyKGQsIHAtPnBhZ2VfdmFkZHJfYWxnbikpOworCWlmIChwLT5tZW1fcHRyX3ZpcnQpCisJCWlvdW5tYXAocC0+bWVtX3B0cl92aXJ0KTsKKworCWZyZWVfbmV0ZGV2KGQpOworfQorCisjaWZkZWYgQ09ORklHX0VJU0EKK3N0YXRpYyBpbnQgX19pbml0IGhwMTAwX2Vpc2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmdlbmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBocDEwMF9wcml2YXRlKSk7CisJc3RydWN0IGVpc2FfZGV2aWNlICplZGV2ID0gdG9fZWlzYV9kZXZpY2UoZ2VuZGV2KTsKKwlpbnQgZXJyOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJmVkZXYtPmRldik7CisKKwllcnIgPSBocDEwMF9wcm9iZTEoZGV2LCBlZGV2LT5iYXNlX2FkZHIgKyAweEMzOCwgSFAxMDBfQlVTX0VJU0EsIE5VTEwpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MjsKKwkKKyNpZmRlZiBIUDEwMF9ERUJVRworCXByaW50aygiaHAxMDA6ICVzOiBFSVNBIGFkYXB0ZXIgZm91bmQgYXQgMHgleFxuIiwgZGV2LT5uYW1lLCAKKwkgICAgICAgZGV2LT5iYXNlX2FkZHIpOworI2VuZGlmCisJZ2VuZGV2LT5kcml2ZXJfZGF0YSA9IGRldjsKKwlyZXR1cm4gMDsKKyBvdXQyOgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBIUDEwMF9SRUdJT05fU0laRSk7Cisgb3V0MToKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGhwMTAwX2Vpc2FfcmVtb3ZlIChzdHJ1Y3QgZGV2aWNlICpnZW5kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGdlbmRldi0+ZHJpdmVyX2RhdGE7CisJY2xlYW51cF9kZXYoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlaXNhX2RyaXZlciBocDEwMF9laXNhX2RyaXZlciA9IHsKKyAgICAgICAgLmlkX3RhYmxlID0gaHAxMDBfZWlzYV90YmwsCisgICAgICAgIC5kcml2ZXIgICA9IHsKKyAgICAgICAgICAgICAgICAubmFtZSAgICA9ICJocDEwMCIsCisgICAgICAgICAgICAgICAgLnByb2JlICAgPSBocDEwMF9laXNhX3Byb2JlLAorICAgICAgICAgICAgICAgIC5yZW1vdmUgID0gX19kZXZleGl0X3AgKGhwMTAwX2Vpc2FfcmVtb3ZlKSwKKyAgICAgICAgfQorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGludCBfX2RldmluaXQgaHAxMDBfcGNpX3Byb2JlIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaW9hZGRyOworCXVfc2hvcnQgcGNpX2NvbW1hbmQ7CisJaW50IGVycjsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGhwMTAwX3ByaXZhdGUpKTsKKwlpZiAoIWRldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDA7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jb21tYW5kKTsKKwlpZiAoIShwY2lfY29tbWFuZCAmIFBDSV9DT01NQU5EX0lPKSkgeworI2lmZGVmIEhQMTAwX0RFQlVHCisJCXByaW50aygiaHAxMDA6ICVzOiBQQ0kgSS9PIEJpdCBoYXMgbm90IGJlZW4gc2V0LiBTZXR0aW5nLi4uXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCXBjaV9jb21tYW5kIHw9IFBDSV9DT01NQU5EX0lPOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIHBjaV9jb21tYW5kKTsKKwl9CisKKwlpZiAoIShwY2lfY29tbWFuZCAmIFBDSV9DT01NQU5EX01BU1RFUikpIHsKKyNpZmRlZiBIUDEwMF9ERUJVRworCQlwcmludGsoImhwMTAwOiAlczogUENJIE1hc3RlciBCaXQgaGFzIG5vdCBiZWVuIHNldC4gU2V0dGluZy4uLlxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlwY2lfY29tbWFuZCB8PSBQQ0lfQ09NTUFORF9NQVNURVI7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NvbW1hbmQpOworCX0KKwkKKwlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJZXJyID0gaHAxMDBfcHJvYmUxKGRldiwgaW9hZGRyLCBIUDEwMF9CVVNfUENJLCBwZGV2KTsKKwlpZiAoZXJyKSAKKwkJZ290byBvdXQxOworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MjsKKwkKKyNpZmRlZiBIUDEwMF9ERUJVRworCXByaW50aygiaHAxMDA6ICVzOiBQQ0kgYWRhcHRlciBmb3VuZCBhdCAweCV4XG4iLCBkZXYtPm5hbWUsIGlvYWRkcik7CisjZW5kaWYKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlyZXR1cm4gMDsKKyBvdXQyOgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBIUDEwMF9SRUdJT05fU0laRSk7Cisgb3V0MToKKwlmcmVlX25ldGRldihkZXYpOworIG91dDA6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBocDEwMF9wY2lfcmVtb3ZlIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJY2xlYW51cF9kZXYoZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGhwMTAwX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImhwMTAwIiwKKwkuaWRfdGFibGUJPSBocDEwMF9wY2lfdGJsLAorCS5wcm9iZQkJPSBocDEwMF9wY2lfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChocDEwMF9wY2lfcmVtb3ZlKSwKK307CisjZW5kaWYKKworLyoKKyAqICBtb2R1bGUgc2VjdGlvbgorICovCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4sICIKKyAgICAgICAgICAgICAgIlNpZWdmcmllZCBcIkZyaWVkZXJcIiBMb2VmZmxlciAoZGcxc2VrKSA8ZmxvZWZmQG1hdGhlbWF0aWsudW5pLXN0dXR0Z2FydC5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSFAgQ0FTQ0FERSBBcmNoaXRlY3R1cmUgRHJpdmVyIGZvciAxMDBWRy1BbnlMYW4gTmV0d29yayBBZGFwdGVycyIpOworCisvKgorICogTm90ZTogdG8gcmVnaXN0ZXIgdGhyZWUgaXNhIGRldmljZXMsIHVzZToKKyAqIG9wdGlvbiBocDEwMCBocDEwMF9wb3J0PTAsMCwwCisgKiAgICAgICAgdG8gcmVnaXN0ZXIgb25lIGNhcmQgYXQgaW8gMHgyODAgYXMgZXRoMjM5LCB1c2U6CisgKiBvcHRpb24gaHAxMDAgaHAxMDBfcG9ydD0weDI4MAorICovCisjaWYgZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0lTQSkKKyNkZWZpbmUgSFAxMDBfREVWSUNFUyA1CisvKiBQYXJhbWV0ZXJzIHNldCBieSBpbnNtb2QgKi8KK3N0YXRpYyBpbnQgaHAxMDBfcG9ydFtIUDEwMF9ERVZJQ0VTXSA9IHsgMCwgWzEgLi4uIChIUDEwMF9ERVZJQ0VTLTEpXSA9IC0xIH07Cittb2R1bGVfcGFyYW1fYXJyYXkoaHAxMDBfcG9ydCwgaW50LCBOVUxMLCAwKTsKKworLyogTGlzdCBvZiBkZXZpY2VzICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmhwMTAwX2Rldmxpc3RbSFAxMDBfREVWSUNFU107CisKK3N0YXRpYyBpbnQgX19pbml0IGhwMTAwX2lzYV9pbml0KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaSwgZXJyLCBjYXJkcyA9IDA7CisKKwkvKiBEb24ndCBhdXRvcHJvYmUgSVNBIGJ1cyAqLworCWlmIChocDEwMF9wb3J0WzBdID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogTG9vcCBvbiBhbGwgcG9zc2libGUgYmFzZSBhZGRyZXNzZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSFAxMDBfREVWSUNFUyAmJiBocDEwMF9wb3J0W2ldICE9IC0xOyArK2kpIHsKKwkJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBocDEwMF9wcml2YXRlKSk7CisJCWlmICghZGV2KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJocDEwMDogbm8gbWVtb3J5IGZvciBuZXR3b3JrIGRldmljZVxuIik7CisJCQl3aGlsZSAoY2FyZHMgPiAwKQorCQkJCWNsZWFudXBfZGV2KGhwMTAwX2Rldmxpc3RbLS1jYXJkc10pOworCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkJZXJyID0gaHAxMDBfaXNhX3Byb2JlKGRldiwgaHAxMDBfcG9ydFtpXSk7CisJCWlmICghZXJyKSB7CisJCQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWlmICghZXJyKSAKKwkJCQlocDEwMF9kZXZsaXN0W2NhcmRzKytdID0gZGV2OworCQkJZWxzZQorCQkJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBIUDEwMF9SRUdJT05fU0laRSk7CisJCX0KKworCQlpZiAoZXJyKQorCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisKKwlyZXR1cm4gY2FyZHMgPiAwID8gMCA6IC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBocDEwMF9pc2FfY2xlYW51cCh2b2lkKSAKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBIUDEwMF9ERVZJQ0VTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGhwMTAwX2Rldmxpc3RbaV07CisJCWlmIChkZXYpCisJCQljbGVhbnVwX2RldihkZXYpOworCX0KK30KKyNlbHNlCisjZGVmaW5lIGhwMTAwX2lzYV9pbml0KCkJKDApCisjZGVmaW5lIGhwMTAwX2lzYV9jbGVhbnVwKCkJZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgaHAxMDBfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gaHAxMDBfaXNhX2luaXQoKTsKKwlpZiAoZXJyICYmIGVyciAhPSAtRU5PREVWKQorCQlnb3RvIG91dDsKKyNpZmRlZiBDT05GSUdfRUlTQQorCWVyciA9IGVpc2FfZHJpdmVyX3JlZ2lzdGVyKCZocDEwMF9laXNhX2RyaXZlcik7CisJaWYgKGVyciAmJiBlcnIgIT0gLUVOT0RFVikgCisJCWdvdG8gb3V0MjsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0kKKwllcnIgPSBwY2lfbW9kdWxlX2luaXQoJmhwMTAwX3BjaV9kcml2ZXIpOworCWlmIChlcnIgJiYgZXJyICE9IC1FTk9ERVYpIAorCQlnb3RvIG91dDM7CisjZW5kaWYKKyBvdXQ6CisJcmV0dXJuIGVycjsKKyBvdXQzOgorI2lmZGVmIENPTkZJR19FSVNBCisJZWlzYV9kcml2ZXJfdW5yZWdpc3RlciAoJmhwMTAwX2Vpc2FfZHJpdmVyKTsKKyBvdXQyOgorI2VuZGlmCisJaHAxMDBfaXNhX2NsZWFudXAoKTsKKwlnb3RvIG91dDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgaHAxMDBfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlocDEwMF9pc2FfY2xlYW51cCgpOworI2lmZGVmIENPTkZJR19FSVNBCisJZWlzYV9kcml2ZXJfdW5yZWdpc3RlciAoJmhwMTAwX2Vpc2FfZHJpdmVyKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0kKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZocDEwMF9wY2lfZHJpdmVyKTsKKyNlbmRpZgorfQorCittb2R1bGVfaW5pdChocDEwMF9tb2R1bGVfaW5pdCkKK21vZHVsZV9leGl0KGhwMTAwX21vZHVsZV9leGl0KQorCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSS91c3Ivc3JjL2xpbnV4L25ldC9pbmV0IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1tNDg2IC1jIGhwMTAwLmMiCisgKiAgYy1pbmRlbnQtbGV2ZWw6IDIKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAxMDAuaCBiL2RyaXZlcnMvbmV0L2hwMTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2ZDk0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hwMTAwLmgKQEAgLTAsMCArMSw2MTUgQEAKKy8qCisgKiBocDEwMC5oOiBIZXdsZXR0IFBhY2thcmQgSFAxMC8xMDBWRyBBTlkgTEFOIGV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCisgKgorICogJElkOiBocDEwMC5oLHYgMS41MSAxOTk3LzA0LzA4IDE0OjI2OjQyIGZsb2VmZiBFeHAgZmxvZWZmICQKKyAqCisgKiBBdXRob3JzOiAgSmFyb3NsYXYgS3lzZWxhLCA8cGVyZXhAcGYuamN1LmN6PgorICogICAgICAgICAgIFNpZWdmcmllZCBMb2VmZmxlciA8ZmxvZWZmQHR1bml4Lm1hdGhlbWF0aWsudW5pLXN0dXR0Z2FydC5kZT4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgJ2hwZmVwa3QnIGNyeW53ciBwYWNrZXQgZHJpdmVyLgorICoKKyAqIFRoaXMgc291cmNlL2NvZGUgaXMgcHVibGljIGZyZWU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IAorICogaXQgdW5kZXIgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24pIGVpdGhlciB2ZXJzaW9uIHR3byBvZiB0aGlzIExpY2Vuc2UsIG9yIGFueSAKKyAqIGxhdGVyIHZlcnNpb24uCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBIYXJkd2FyZSBDb25zdGFudHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAKKyAqIFBhZ2UgSWRlbnRpZmllcnMKKyAqIChTd2FwIFBhZ2luZyBSZWdpc3RlciwgUEFHSU5HLCBiaXRzIDM6MCwgT2Zmc2V0IDB4MDIpCisgKi8KKworI2RlZmluZSBIUDEwMF9QQUdFX1BFUkZPUk1BTkNFCTB4MAkvKiBQYWdlIDAgKi8KKyNkZWZpbmUgSFAxMDBfUEFHRV9NQUNfQUREUkVTUwkweDEJLyogUGFnZSAxICovCisjZGVmaW5lIEhQMTAwX1BBR0VfSFdfTUFQCTB4MgkvKiBQYWdlIDIgKi8KKyNkZWZpbmUgSFAxMDBfUEFHRV9FRVBST01fQ1RSTAkweDMJLyogUGFnZSAzICovCisjZGVmaW5lIEhQMTAwX1BBR0VfTUFDX0NUUkwJMHg0CS8qIFBhZ2UgNCAqLworI2RlZmluZSBIUDEwMF9QQUdFX01NVV9DRkcJMHg1CS8qIFBhZ2UgNSAqLworI2RlZmluZSBIUDEwMF9QQUdFX0lEX01BQ19BRERSCTB4NgkvKiBQYWdlIDYgKi8KKyNkZWZpbmUgSFAxMDBfUEFHRV9NTVVfUE9JTlRFUgkweDcJLyogUGFnZSA3ICovCisKKworLyogUmVnaXN0ZXJzIHRoYXQgYXJlIHByZXNlbnQgb24gYWxsIHBhZ2VzICAqLworCisjZGVmaW5lIEhQMTAwX1JFR19IV19JRAkJMHgwMAkvKiBSOiAgKDE2KSBVbmlxdWUgY2FyZCBJRCAgICAgICAgICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1RSQUNFCQkweDAwCS8qIFc6ICAoMTYpIFVzZWQgZm9yIGRlYnVnIG91dHB1dCAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfUEFHSU5HCTB4MDIJLyogUjogICgxNiksMTU6NCBDYXJkIElEICAgICAgICAgICAgICovCisJCQkJCS8qIFc6ICAoMTYpLDM6MCBTd2l0Y2ggcGFnZXMgICAgICAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfT1BUSU9OX0xTVwkweDA0CS8qIFJXOiAoMTYpIFNlbGVjdCBjYXJkIGZ1bmN0aW9ucyAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfT1BUSU9OX01TVwkweDA2CS8qIFJXOiAoMTYpIFNlbGVjdCBjYXJkIGZ1bmN0aW9ucyAgICAqLworCisvKiAgUGFnZSAwIC0gUGVyZm9ybWFuY2UgICovCisKKyNkZWZpbmUgSFAxMDBfUkVHX0lSUV9TVEFUVVMJMHgwOAkvKiBSVzogKDE2KSBXaGljaCBpbnRzIGFyZSBwZW5kaW5nICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0lSUV9NQVNLCTB4MGEJLyogUlc6ICgxNikgU2VsZWN0IGludHMgdG8gYWxsb3cgICAgICovCisjZGVmaW5lIEhQMTAwX1JFR19GUkFHTUVOVF9MRU4JMHgwYwkvKiBXOiAoMTYpMTI6MCBDdXJyZW50IGZyYWdtZW50IGxlbiAqLworLyogTm90ZTogRm9yIDMyIGJpdCBzeXN0ZW1zLCBmcmFnbWVudCBsZW4gYW5kIG9mZnNldCByZWdpc3RlcnMgYXJlIGF2YWlsYWJsZSAqLworLyogICAgICAgYXQgb2Zmc2V0IDB4MjggYW5kIDB4MmMsIHdoZXJlIHRoZXkgY2FuIGJlIHdyaXR0ZW4gYXMgMzJiaXQgdmFsdWVzLiAqLworI2RlZmluZSBIUDEwMF9SRUdfT0ZGU0VUCTB4MGUJLyogUlc6ICgxNikxMjowIE9mZnNldCB0byBzdGFydCByZWFkICovCisjZGVmaW5lIEhQMTAwX1JFR19EQVRBMzIJMHgxMAkvKiBSVzogKDMyKSBJL08gbW9kZSBkYXRhIHBvcnQgICAgICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0RBVEExNgkweDEyCS8qIFJXOiBXT1JEcyBtdXN0IGJlIHJlYWQgZnJvbSBoZXJlICAqLworI2RlZmluZSBIUDEwMF9SRUdfVFhfTUVNX0ZSRUUJMHgxNAkvKiBSRDogKDMyKSBBbW91bnQgb2YgZnJlZSBUeCBtZW0gICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1RYX1BEQV9MICAgICAgMHgxNAkvKiBXOiAoMzIpIEJNOiBQdHIgdG8gUERMLCBMb3cgUHJpICAqLworI2RlZmluZSBIUDEwMF9SRUdfVFhfUERBX0ggICAgICAweDFjCS8qIFc6ICgzMikgQk06IFB0ciB0byBQREwsIEhpZ2ggUHJpICovCisjZGVmaW5lIEhQMTAwX1JFR19SWF9QS1RfQ05UCTB4MTgJLyogUkQ6ICg4KSBSeCBjb3VudCBvZiBwa3RzIG9uIGNhcmQgICovCisjZGVmaW5lIEhQMTAwX1JFR19UWF9QS1RfQ05UCTB4MTkJLyogUkQ6ICg4KSBUeCBjb3VudCBvZiBwa3RzIG9uIGNhcmQgICovCisjZGVmaW5lIEhQMTAwX1JFR19SWF9QREwgICAgICAgIDB4MWEJLyogUjogKDgpIEJNOiAjIHJ4IHBkbCBub3QgZXhlY3V0ZWQgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1RYX1BETCAgICAgICAgMHgxYgkvKiBSOiAoOCkgQk06ICMgdHggcGRsIG5vdCBleGVjdXRlZCAqLworI2RlZmluZSBIUDEwMF9SRUdfUlhfUERBICAgICAgICAweDE4CS8qIFc6ICgzMikgQk06IFVwIHRvIDMxIGFkZHJlc3NlcyAqLworCQkJCQkvKiAgICAgICAgICAgICB3aGljaCBwb2ludCB0byBhIFBETCAqLworI2RlZmluZSBIUDEwMF9SRUdfU0xfRUFSTFkgICAgICAweDFjCS8qICAgICgzMikgRW5oYW5jZWQgU2xhdmUgRWFybHkgUnggKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1NUQVRfRFJPUFBFRCAgMHgyMAkvKiBSICgxMikgRHJvcHBlZCBQYWNrZXQgQ291bnRlciAqLworI2RlZmluZSBIUDEwMF9SRUdfU1RBVF9FUlJPUkVEICAweDIyCS8qIFIgKDgpIEVycm9yZWQgUGFja2V0IENvdW50ZXIgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1NUQVRfQUJPUlQgICAgMHgyMwkvKiBSICg4KSBBYm9ydCBDb3VudGVyL09XIENvbGwuIEZsYWcgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1JYX1JJTkcgICAgICAgMHgyNAkvKiBXICgzMikgU2xhdmU6IFJYIFJpbmcgUG9pbnRlcnMgKi8KKyNkZWZpbmUgSFAxMDBfUkVHXzMyX0ZSQUdNRU5UX0xFTiAweDI4CS8qIFcgKDEzKSBTbGF2ZTogRnJhZ21lbnQgTGVuZ3RoIFJlZyAqLworI2RlZmluZSBIUDEwMF9SRUdfMzJfT0ZGU0VUICAgICAweDJjCS8qIFcgKDE2KSBTbGF2ZTogT2Zmc2V0IFJlZ2lzdGVyICovCisKKy8qICBQYWdlIDEgLSBNQUMgQWRkcmVzcy9IYXNoIFRhYmxlICAqLworCisjZGVmaW5lIEhQMTAwX1JFR19NQUNfQUREUgkweDA4CS8qIFJXOiAoOCkgQ2FyZHMgTUFDIGFkZHJlc3MgICAgICAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfSEFTSF9CWVRFMAkweDEwCS8qIFJXOiAoOCkgQ2FyZHMgbXVsdGljYXN0IGZpbHRlciAgICAqLworCisvKiAgUGFnZSAyIC0gSGFyZHdhcmUgTWFwcGluZyAgKi8KKworI2RlZmluZSBIUDEwMF9SRUdfTUVNX01BUF9MU1cJMHgwOAkvKiBSVzogKDE2KSBMU1cgb2YgY2FyZHMgbWVtIGFkZHIgICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX01FTV9NQVBfTVNXCTB4MGEJLyogUlc6ICgxNikgTVNXIG9mIGNhcmRzIG1lbSBhZGRyICAgICovCisjZGVmaW5lIEhQMTAwX1JFR19JT19NQVAJMHgwYwkvKiBSVzogKDgpIENhcmRzIEkvTyBhZGRyZXNzICAgICAgICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0lSUV9DSEFOTkVMCTB4MGQJLyogUlc6ICg4KSBJUlEgYW5kIGVkZ2UvbGV2ZWwgaW50ICAgICovCisjZGVmaW5lIEhQMTAwX1JFR19TUkFNCQkweDBlCS8qIFJXOiAoOCkgSG93IG11Y2ggUkFNIG9uIGNhcmQgICAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfQk0JCTB4MGYJLyogUlc6ICg4KSBDb250cm9scyBCTSBmdW5jdGlvbnMgICAgICovCisKKy8qIE5ldyBvbiBQYWdlIDIgZm9yIEVUUiBjaGlwczogKi8KKyNkZWZpbmUgSFAxMDBfUkVHX01PREVDVFJMMSAgICAgMHgxMAkvKiBSVzogKDgpIE1vZGUgQ29udHJvbCAxICovCisjZGVmaW5lIEhQMTAwX1JFR19NT0RFQ1RSTDIgICAgIDB4MTEJLyogUlc6ICg4KSBNb2RlIENvbnRyb2wgMiAqLworI2RlZmluZSBIUDEwMF9SRUdfUENJQ1RSTDEgICAgICAweDEyCS8qIFJXOiAoOCkgUENJIENmZyAxICovCisjZGVmaW5lIEhQMTAwX1JFR19QQ0lDVFJMMiAgICAgIDB4MTMJLyogUlc6ICg4KSBQQ0kgQ2ZnIDIgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1BDSUJVU01MQVQgICAgMHgxNQkvKiBSVzogKDgpIFBDSSBCdXMgTWFzdGVyIExhdGVuY3kgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0VBUkxZVFhDRkcgICAgMHgxNgkvKiBSVzogKDE2KSBFYXJseSBUWCBDZmcvQ250cmwgUmVnICovCisjZGVmaW5lIEhQMTAwX1JFR19FQVJMWVJYQ0ZHICAgIDB4MTgJLyogUlc6ICg4KSBFYXJseSBSWCBDZmcvQ250cmwgUmVnICovCisjZGVmaW5lIEhQMTAwX1JFR19JU0FQTlBDRkcxICAgIDB4MWEJLyogUlc6ICg4KSBJU0EgUG5QIENmZy9DbnRybCBSZWcgMSAqLworI2RlZmluZSBIUDEwMF9SRUdfSVNBUE5QQ0ZHMiAgICAweDFiCS8qIFJXOiAoOCkgSVNBIFBuUCBDZmcvQ250cmwgUmVnIDIgKi8KKworLyogIFBhZ2UgMyAtIEVFUFJPTS9Cb290IFJPTSAgKi8KKworI2RlZmluZSBIUDEwMF9SRUdfRUVQUk9NX0NUUkwJMHgwOAkvKiBSVzogKDE2KSBVc2VkIHRvIGxvYWQgRUVQUk9NICAgICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0JPT1RST01fQ1RSTCAgMHgwYQorCisvKiAgUGFnZSA0IC0gTEFOIENvbmZpZ3VyYXRpb24gIChNQUNfQ1RSTCkgKi8KKworI2RlZmluZSBIUDEwMF9SRUdfMTBfTEFOX0NGR18xCTB4MDgJLyogUlc6ICg4KSBTZXQgMTBNIFhDVlIgZnVuY3Rpb25zICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHXzEwX0xBTl9DRkdfMiAgMHgwOQkvKiBSVzogKDgpICAgICAxME0gWENWUiBmdW5jdGlvbnMgICAqLworI2RlZmluZSBIUDEwMF9SRUdfVkdfTEFOX0NGR18xCTB4MGEJLyogUlc6ICg4KSBTZXQgMTAwTSBYQ1ZSIGZ1bmN0aW9ucyAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1ZHX0xBTl9DRkdfMiAgMHgwYgkvKiBSVzogKDgpIDEwME0gTEFOIFRyYWluaW5nIGNmZ3JlZ3MgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX01BQ19DRkdfMQkweDBjCS8qIFJXOiAoOCkgVHlwZXMgb2YgcGt0cyB0byBhY2NlcHQgICAqLworI2RlZmluZSBIUDEwMF9SRUdfTUFDX0NGR18yCTB4MGQJLyogUlc6ICg4KSBNaXNjIE1BQyBmdW5jdGlvbnMgICAgICAgICovCisjZGVmaW5lIEhQMTAwX1JFR19NQUNfQ0ZHXzMgICAgIDB4MGUJLyogUlc6ICg4KSBNaXNjIE1BQyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX01BQ19DRkdfNCAgICAgMHgwZgkvKiBSOiAgKDgpIE1pc2MgTUFDIHN0YXRlcyAqLworI2RlZmluZSBIUDEwMF9SRUdfRFJPUFBFRAkweDEwCS8qIFI6ICAoMTYpLDExOjAgUGt0cyBjYW50IGZpdCBpbiBtZW0gKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0NSQwkJMHgxMgkvKiBSOiAgKDgpIFBrdHMgd2l0aCBDUkMgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0FCT1JUCQkweDEzCS8qIFI6ICAoOCkgQWJvcnRlZCBUeCBwa3RzICAgICAgICAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfVFJBSU5fUkVRVUVTVCAweDE0CS8qIFJXOiAoMTYpIEVuZG5vZGUgTUFDIHJlZ2lzdGVyLiAqLworI2RlZmluZSBIUDEwMF9SRUdfVFJBSU5fQUxMT1cgICAweDE2CS8qIFI6ICAoMTYpIEh1YiBhbGxvd2VkIHJlZ2lzdGVyICovCisKKy8qICBQYWdlIDUgLSBNTVUgICovCisKKyNkZWZpbmUgSFAxMDBfUkVHX1JYX01FTV9TVE9QCTB4MGMJLyogUlc6ICgxNikgRW5kIG9mIFJ4IHJpbmcgYWRkciAgICAgICovCisjZGVmaW5lIEhQMTAwX1JFR19UWF9NRU1fU1RPUAkweDBlCS8qIFJXOiAoMTYpIEVuZCBvZiBUeCByaW5nIGFkZHIgICAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfUERMX01FTV9TVE9QICAweDEwCS8qIE5vdCB1c2VkIGJ5IDgwMi4xMiBkZXZpY2VzICovCisjZGVmaW5lIEhQMTAwX1JFR19FQ0JfTUVNX1NUT1AgIDB4MTQJLyogSSd2ZSBubyBpZGVhIHdoYXQgdGhpcyBpcyAqLworCisvKiAgUGFnZSA2IC0gQ2FyZCBJRC9QaHlzaWNhbCBMQU4gQWRkcmVzcyAgKi8KKworI2RlZmluZSBIUDEwMF9SRUdfQk9BUkRfSUQJMHgwOAkvKiBSOiAgKDgpIEVJU0EvSVNBIGNhcmQgSUQgICAgICAgICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0JPQVJEX0lPX0NIQ0sgMHgwYwkvKiBSOiAgKDgpIEFkZGVkIHRvIElEIHRvIGdldCBGRmggICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1NPRlRfTU9ERUwJMHgwZAkvKiBSOiAgKDgpIENvbmZpZyBwcm9ncmFtIGRlZmluZWQgICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0xBTl9BRERSCTB4MTAJLyogUjogICg4KSBNQUMgYWRkciBvZiBjYXJkICAgICAgICAgICovCisjZGVmaW5lIEhQMTAwX1JFR19MQU5fQUREUl9DSENLIDB4MTYJLyogUjogICg4KSBBZGRlZCB0byBhZGRyIHRvIGdldCBGRmggICovCisKKy8qICBQYWdlIDcgLSBNTVUgQ3VycmVudCBQb2ludGVycyAgKi8KKworI2RlZmluZSBIUDEwMF9SRUdfUFRSX1JYU1RBUlQJMHgwOAkvKiBSOiAgKDE2KSBDdXJyZW50IGJlZ2luIG9mIFJ4IHJpbmcgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1BUUl9SWEVORAkweDBhCS8qIFI6ICAoMTYpIEN1cnJlbnQgZW5kIG9mIFJ4IHJpbmcgICAqLworI2RlZmluZSBIUDEwMF9SRUdfUFRSX1RYU1RBUlQJMHgwYwkvKiBSOiAgKDE2KSBDdXJyZW50IGJlZ2luIG9mIFR4IHJpbmcgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1BUUl9UWEVORAkweDBlCS8qIFI6ICAoMTYpIEN1cnJlbnQgZW5kIG9mIFJ4IHJpbmcgICAqLworI2RlZmluZSBIUDEwMF9SRUdfUFRSX1JQRExTVEFSVCAweDEwCisjZGVmaW5lIEhQMTAwX1JFR19QVFJfUlBETEVORCAgIDB4MTIKKyNkZWZpbmUgSFAxMDBfUkVHX1BUUl9SSU5HUFRSUyAgMHgxNAorI2RlZmluZSBIUDEwMF9SRUdfUFRSX01FTURFQlVHICAweDFhCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiAKKyAqIEhhcmR3YXJlIElEIFJlZ2lzdGVyIEkgKEFsd2F5cyBhdmFpbGFibGUsIEhXX0lELCBPZmZzZXQgMHgwMCkKKyAqLworI2RlZmluZSBIUDEwMF9IV19JRF9DQVNDQURFICAgICAweDQ4NTAJLyogSWRlbnRpZmllcyBDYXNjYWRlIENoaXAgKi8KKworLyogCisgKiBIYXJkd2FyZSBJRCBSZWdpc3RlciAyICYgUGFnaW5nIFJlZ2lzdGVyCisgKiAoQWx3YXlzIGF2YWlsYWJsZSwgUEFHSU5HLCBPZmZzZXQgMHgwMikKKyAqIEJpdHMgMTU6NCBhcmUgZm9yIHRoZSBDaGlwIElEIAorICovCisjZGVmaW5lIEhQMTAwX0NISVBJRF9NQVNLICAgICAgICAweEZGRjAKKyNkZWZpbmUgSFAxMDBfQ0hJUElEX1NIQVNUQSAgICAgIDB4NTM1MAkvKiBOb3QgODAyLjEyIGNvbXBsaWFudCAqLworCQkJCQkgLyogRUlTQSBCTS9TTCwgTUNBMTYvMzIgU0wsIElTQSBTTCAqLworI2RlZmluZSBIUDEwMF9DSElQSURfUkFJTklFUiAgICAgMHg1MzYwCS8qIE5vdCA4MDIuMTIgY29tcGxpYW50IEVJU0EgQk0sICovCisJCQkJCSAvKiBQQ0kgU0wsIE1DQTE2LzMyIFNMLCBJU0EgU0wgKi8KKyNkZWZpbmUgSFAxMDBfQ0hJUElEX0xBU1NFTiAgICAgIDB4NTM3MAkvKiA4MDIuMTIgY29tcGxpYW50IFBDSSBCTSwgUENJIFNMICovCisJCQkJCSAvKiBMUkYgc3VwcG9ydGVkICovCisKKy8qCisgKiAgT3B0aW9uIFJlZ2lzdGVycyBJIGFuZCBJSSAKKyAqIChBbHdheXMgYXZhaWxhYmxlLCBPUFRJT05fTFNXLCBPZmZzZXQgMHgwNC0weDA1KQorICovCisjZGVmaW5lIEhQMTAwX0RFQlVHX0VOCQkweDgwMDAJLyogMDpEaXMuLCAxOkVuYWJsZSBEZWJ1ZyBEdW1wIFB0ci4gKi8KKyNkZWZpbmUgSFAxMDBfUlhfSERSCQkweDQwMDAJLyogMDpEaXMuLCAxOkVuYWJsZSBwdXR0aW5nIHBrdCBpbnRvICovCisJCQkJCS8qICAgc3lzdGVtIG1lbS4gYmVmb3JlIFJ4IGludGVycnVwdCAqLworI2RlZmluZSBIUDEwMF9NTUFQX0RJUwkJMHgyMDAwCS8qIDA6RW5hYmxlLCAxOkRpc2FibGUgbWVtLm1hcHBpbmcuICovCisJCQkJCS8qICAgTU1BUF9ESVMgbXVzdCBiZSAwIGFuZCBNRU1fRU4gKi8KKwkJCQkJLyogICBtdXN0IGJlIDEgZm9yIG1lbW9yeS1tYXBwZWQgKi8KKwkJCQkJLyogICBtb2RlIHRvIGJlIGVuYWJsZWQgKi8KKyNkZWZpbmUgSFAxMDBfRUVfRU4JCTB4MTAwMAkvKiAwOkRpc2FibGUsMTpFbmFibGUgRUVQUk9NIHdyaXRpbmcgKi8KKyNkZWZpbmUgSFAxMDBfQk1fV1JJVEUJCTB4MDgwMAkvKiAwOlNsYXZlLCAxOkJ1cyBNYXN0ZXIgZm9yIFR4IGRhdGEgKi8KKyNkZWZpbmUgSFAxMDBfQk1fUkVBRAkJMHgwNDAwCS8qIDA6U2xhdmUsIDE6QnVzIE1hc3RlciBmb3IgUnggZGF0YSAqLworI2RlZmluZSBIUDEwMF9UUklfSU5UCQkweDAyMDAJLyogMDpEb24ndCwgMTpEbyB0cmktc3RhdGUgdGhlIGludCAqLworI2RlZmluZSBIUDEwMF9NRU1fRU4JCTB4MDA0MAkvKiBDb25maWcgcHJvZ3JhbSBzZXQgdGhpcyB0byAqLworCQkJCQkvKiAgIDA6RGlzYWJsZSwgMTpFbmFibGUgbWVtIG1hcC4gKi8KKwkJCQkJLyogICBTZWUgTU1BUF9ESVMuICovCisjZGVmaW5lIEhQMTAwX0lPX0VOCQkweDAwMjAJLyogMTpFbmFibGUgSS9PIHRyYW5zZmVycyAqLworI2RlZmluZSBIUDEwMF9CT09UX0VOCQkweDAwMTAJLyogMTpFbmFibGUgYm9vdCBST00gYWNjZXNzICovCisjZGVmaW5lIEhQMTAwX0ZBS0VfSU5UCQkweDAwMDgJLyogMTppbnQgKi8KKyNkZWZpbmUgSFAxMDBfSU5UX0VOCQkweDAwMDQJLyogMTpFbmFibGUgaW50cyBmcm9tIGNhcmQgKi8KKyNkZWZpbmUgSFAxMDBfSFdfUlNUCQkweDAwMDIJLyogMDpSZXNldCwgMTpPdXQgb2YgcmVzZXQgKi8KKwkJCQkJLyogTklDIHJlc2V0IG9uIDAgdG8gMSB0cmFuc2l0aW9uICovCisKKy8qCisgKiAgT3B0aW9uIFJlZ2lzdGVyIElJSSAKKyAqIChBbHdheXMgYXZhaWxhYmxlLCBPUFRJT05fTVNXLCBPZmZzZXQgMHgwNikKKyAqLworI2RlZmluZSBIUDEwMF9QUklPUklUWV9UWAkweDAwODAJLyogMTpEbyBhbGwgVHggcGt0cyBhcyBwcmlvcml0eSAqLworI2RlZmluZSBIUDEwMF9FRV9MT0FECQkweDAwNDAJLyogMTpFRVBST00gbG9hZGluZywgMCB3aGVuIGRvbmUgKi8KKyNkZWZpbmUgSFAxMDBfQURWX05YVF9QS1QJMHgwMDA0CS8qIDE6QWR2YW5jZSB0byBuZXh0IHBrdCBpbiBSeCBxdWV1ZSAqLworCQkJCQkvKiAgIGgvdyB3aWxsIHNldCB0byAwIHdoZW4gZG9uZSAqLworI2RlZmluZSBIUDEwMF9UWF9DTUQJCTB4MDAwMgkvKiAxOlRlbGwgaC93IGRvd25sb2FkIGRvbmUsIGgvdyAqLworCQkJCQkvKiAgIHdpbGwgc2V0IHRvIDAgd2hlbiBkb25lICovCisKKy8qCisgKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVycyBJIGFuZCBJSQorICogKFBhZ2UgUEVSRk9STUFOQ0UsIElSUV9TVEFUVVMsIE9mZnNldCAweDA4LTB4MDkpCisgKiBOb3RlOiBXaXRoIG9sZCBjaGlwcywgdGhlc2UgUmVnaXN0ZXJzIHdpbGwgY2xlYXIgd2hlbiAxIGlzIHdyaXR0ZW4gdG8gdGhlbQorICogICAgICAgd2l0aCBuZXcgY2hpcHMgdGhpcyBkZXBlbmRzIG9uIHNldHRpbmcgb2YgQ0xSX0lTTU9ERQorICovCisjZGVmaW5lIEhQMTAwX1JYX0VBUkxZX0lOVCAgICAgIDB4MjAwMAorI2RlZmluZSBIUDEwMF9SWF9QREFfWkVSTyAgICAgICAweDEwMDAKKyNkZWZpbmUgSFAxMDBfUlhfUERMX0ZJTExfQ09NUEwgMHgwODAwCisjZGVmaW5lIEhQMTAwX1JYX1BBQ0tFVAkJMHgwNDAwCS8qIDA6Tm8sIDE6WWVzIHBrdCBoYXMgYmVlbiBSeCAqLworI2RlZmluZSBIUDEwMF9SWF9FUlJPUgkJMHgwMjAwCS8qIDA6Tm8sIDE6WWVzIFJ4IHBrdCBoYWQgZXJyb3IgKi8KKyNkZWZpbmUgSFAxMDBfVFhfUERBX1pFUk8gICAgICAgMHgwMDIwCS8qIDEgd2hlbiBQREEgY291bnQgZ29lcyB0byB6ZXJvICovCisjZGVmaW5lIEhQMTAwX1RYX1NQQUNFX0FWQUlMCTB4MDAxMAkvKiAwOjw4MTkyLCAxOj49ODE5MiBUeCBmcmVlIGJ5dGVzICovCisjZGVmaW5lIEhQMTAwX1RYX0NPTVBMRVRFCTB4MDAwOAkvKiAwOk5vLCAxOlllcyBhIFR4IGhhcyBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgSFAxMDBfTUlTQ19FUlJPUiAgICAgICAgMHgwMDA0CS8qIDA6Tm8sIDE6TGFuIExpbmsgZG93biBvciBidXMgZXJyb3IgKi8KKyNkZWZpbmUgSFAxMDBfVFhfRVJST1IJCTB4MDAwMgkvKiAwOk5vLCAxOlllcyBUeCBwa3QgaGFkIGVycm9yICovCisKKy8qCisgKiBYbWl0IE1lbW9yeSBGcmVlIENvdW50CisgKiAoUGFnZSBQRVJGT1JNQU5DRSwgVFhfTUVNX0ZSRUUsIE9mZnNldCAweDE0KSAoUmVhZCBvbmx5LCAzMmJpdCkKKyAqLworI2RlZmluZSBIUDEwMF9BVVRPX0NPTVBBUkUJMHg4MDAwMDAwMAkvKiBUeCBTcGFjZSBhdmFpbCAmIHBrdHM8MjU1ICovCisjZGVmaW5lIEhQMTAwX0ZSRUVfU1BBQ0UJMHg3ZmZmZmZlMAkvKiBUeCBmcmVlIG1lbW9yeSAqLworCisvKgorICogIElSUSBDaGFubmVsCisgKiAoUGFnZSBIV19NQVAsIElSUV9DSEFOTkVMLCBPZmZzZXQgMHgwZCkKKyAqLworI2RlZmluZSBIUDEwMF9aRVJPX1dBSVRfRU4JMHg4MAkvKiAwOk5vLCAxOlllcyBhc3NlcnRzIE5PV1Mgc2lnbmFsICovCisjZGVmaW5lIEhQMTAwX0lSUV9TQ1JBTUJMRSAgICAgIDB4NDAKKyNkZWZpbmUgSFAxMDBfQk9ORF9IUCAgICAgICAgICAgMHgyMAorI2RlZmluZSBIUDEwMF9MRVZFTF9JUlEJCTB4MTAJLyogMDpFZGdlLCAxOkxldmVsIHR5cGUgaW50ZXJydXB0cy4gKi8KKwkJCQkJLyogKE9ubHkgdmFsaWQgb24gRUlTQSBjYXJkcykgKi8KKyNkZWZpbmUgSFAxMDBfSVJRTUFTSwkJMHgwRgkvKiBJc29sYXRlIHRoZSBJUlEgYml0cyAqLworCisvKgorICogU1JBTSBQYXJhbWV0ZXJzCisgKiAoUGFnZSBIV19NQVAsIFNSQU0sIE9mZnNldCAweDBlKQorICovCisjZGVmaW5lIEhQMTAwX1JBTV9TSVpFX01BU0sJMHhlMAkvKiBBTkQgdG8gZ2V0IFNSQU0gc2l6ZSBpbmRleCAqLworI2RlZmluZSBIUDEwMF9SQU1fU0laRV9TSElGVAkweDA1CS8qIFNoaWZ0IGNvdW50KHB1dCBpbmRleCBpbiBsd3IgYml0cykgKi8KKworLyoKKyAqIEJ1cyBNYXN0ZXIgUmVnaXN0ZXIKKyAqIChQYWdlIEhXX01BUCwgQk0sIE9mZnNldCAweDBmKQorICovCisjZGVmaW5lIEhQMTAwX0JNX0JVUlNUX1JEICAgICAgIDB4MDEJLyogRUlTQSBvbmx5OiAxPVVzZSBidXJzdCB0cmFucy4gZm0gc3lzdGVtICovCisJCQkJCS8qIG1lbW9yeSB0byBjaGlwICh0eCkgKi8KKyNkZWZpbmUgSFAxMDBfQk1fQlVSU1RfV1IgICAgICAgMHgwMgkvKiBFSVNBIG9ubHk6IDE9VXNlIGJ1cnN0IHRyYW5zLiBmbSBzeXN0ZW0gKi8KKwkJCQkJLyogbWVtb3J5IHRvIGNoaXAgKHJ4KSAqLworI2RlZmluZSBIUDEwMF9CTV9NQVNURVIJCTB4MDQJLyogMDpTbGF2ZSwgMTpCTSBtb2RlICovCisjZGVmaW5lIEhQMTAwX0JNX1BBR0VfQ0sgICAgICAgIDB4MDgJLyogVGhpcyBiaXQgc2hvdWxkIGJlIHNldCB3aGVuZXZlciBpbiAqLworCQkJCQkvKiBhbiBFSVNBIHN5c3RlbSAqLworI2RlZmluZSBIUDEwMF9CTV9QQ0lfOENMSyAgICAgICAweDQwCS8qIC4uLiBjeWNsZXMgOCBjbG9ja3MgYXBhcnQgKi8KKworCisvKiAKKyAqIE1vZGUgQ29udHJvbCBSZWdpc3RlciBJCisgKiAoUGFnZSBIV19NQVAsIE1PREVDVFJMMSwgT2Zmc2V0MHgxMCkKKyAqLworI2RlZmluZSBIUDEwMF9UWF9EVUFMUSAgICAgICAgICAweDEwCisgICAvKiBJZiBzZXQgYW5kIEJNIC0+IGR1YWwgdHggcGRhIHF1ZXVlcyAqLworI2RlZmluZSBIUDEwMF9JU1JfQ0xSTU9ERSAgICAgICAweDAyCS8qIElmIHNldCBJU1Igd2lsbCBjbGVhciBhbGwgcGVuZGluZyAqLworCQkJCSAgICAgICAvKiBpbnRlcnJ1cHRzIG9uIHJlYWQgKGV0ciBvbmx5PykgKi8KKyNkZWZpbmUgSFAxMDBfRUVfTk9MT0FEICAgICAgICAgMHgwNAkvKiBTdGF0dXMgd2hldGhlciByZXMgd2lsbCBiZSBsb2FkZWQgKi8KKwkJCQkgICAgICAgLyogZnJvbSB0aGUgZWVwcm9tICovCisjZGVmaW5lIEhQMTAwX1RYX0NOVF9GTEcgICAgICAgIDB4MDgJLyogQ29udHJvbHMgRWFybHkgVFggUmVnIENudCBGaWVsZCAqLworI2RlZmluZSBIUDEwMF9QRExfVVNFMyAgICAgICAgICAweDEwCS8qIElmIHNldCBCTSBlbmdpbmUgd2lsbCByZWFkIG9ubHkgKi8KKwkJCQkgICAgICAgLyogZmlyc3QgdGhyZWUgZGF0YSBlbGVtZW50cyBvZiBhIFBETCAqLworCQkJCSAgICAgICAvKiBvbiB0aGUgZmlyc3QgYWNjZXNzLiAqLworI2RlZmluZSBIUDEwMF9CVVNUWVBFX01BU0sgICAgICAweGUwCS8qIFRocmVlIGJpdCBidXMgdHlwZSBpbmZvICovCisKKy8qCisgKiBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgSUkKKyAqIChQYWdlIEhXX01BUCwgTU9ERUNUUkwyLCBPZmZzZXQweDExKQorICovCisjZGVmaW5lIEhQMTAwX0VFX01BU0sgICAgICAgICAgIDB4MGYJLyogVGVsbCBFRVBST00gY2lyY3VpdCBub3QgdG8gbG9hZCAqLworCQkJCSAgICAgICAvKiBjZXJ0YWluIHJlc291cmNlcyAqLworI2RlZmluZSBIUDEwMF9ESVNfQ0FOQ0VMICAgICAgICAweDIwCS8qIEZvciB0eCBkdWFscSBtb2RlIG9wZXJhdGlvbiAqLworI2RlZmluZSBIUDEwMF9FTl9QRExfV0IgICAgICAgICAweDQwCS8qIDE6IFN0YXR1cyBvZiBQREwgY29tcGxldGlvbiBtYXkgYmUgKi8KKwkJCQkgICAgICAgLyogd3JpdHRlbiBiYWNrIHRvIHN5c3RlbSBtZW0gKi8KKyNkZWZpbmUgSFAxMDBfRU5fQlVTX0ZBSUwgICAgICAgMHg4MAkvKiBFbmFibGVzIGJ1cy1mYWlsIHBvcnRpb24gb2YgbWlzYyAqLworCQkJCSAgICAgICAvKiBpbnRlcnJ1cHQgKi8KKworLyogCisgKiBQQ0kgQ29uZmlndXJhdGlvbiBhbmQgQ29udHJvbCBSZWdpc3RlciBJCisgKiAoUGFnZSBIV19NQVAsIFBDSUNUUkwxLCBPZmZzZXQgMHgxMikKKyAqLworI2RlZmluZSBIUDEwMF9MT19NRU0gICAgICAgICAgICAweDAxCS8qIDE6IE1hcHBlZCBNZW0gcmVxdWVzdGVkIGJlbG93IDFNQiAqLworI2RlZmluZSBIUDEwMF9OT19NRU0gICAgICAgICAgICAweDAyCS8qIDE6IERpc2FibGVzIFJlcSBmb3Igc3lzbWVtIHRvIFBDSSAqLworCQkJCSAgICAgICAvKiBiaW9zICovCisjZGVmaW5lIEhQMTAwX1VTRV9JU0EgICAgICAgICAgIDB4MDQJLyogMTogaXNhIHR5cGUgZGVjb2RlcyB3aWxsIG9jY3VyICovCisJCQkJICAgICAgIC8qIHNpbXVsdGFuZW91c2x5IHdpdGggUENJIGRlY29kZXMgKi8KKyNkZWZpbmUgSFAxMDBfSVJRX0hJX01BU0sgICAgICAgMHhmMAkvKiBwZ21lZCBieSBwY2kgYmlvcyAqLworI2RlZmluZSBIUDEwMF9QQ0lfSVJRX0hJX01BU0sgICAweDc4CS8qIElzb2xhdGUgNCBiaXRzIGZvciBQQ0kgSVJRICAqLworCisvKgorICogUENJIENvbmZpZ3VyYXRpb24gYW5kIENvbnRyb2wgUmVnaXN0ZXIgSUkKKyAqIChQYWdlIEhXX01BUCwgUENJQ1RSTDIsIE9mZnNldCAweDEzKQorICovCisjZGVmaW5lIEhQMTAwX1JEX0xJTkVfUERMICAgICAgIDB4MDEJLyogMTogUENJIGNvbW1hbmQgTWVtb3J5IFJlYWQgTGluZSBlbiAqLworI2RlZmluZSBIUDEwMF9SRF9UWF9EQVRBX01BU0sgICAweDA2CS8qIGNob29zZSBQQ0kgbWVtcmVhZCBjbWRzIGZvciBUWCAqLworI2RlZmluZSBIUDEwMF9NV0kgICAgICAgICAgICAgICAweDA4CS8qIDE6IGVuLiBQQ0kgbWVtb3J5IHdyaXRlIGludmFsaWRhdGUgKi8KKyNkZWZpbmUgSFAxMDBfQVJCX01PREUgICAgICAgICAgMHgxMAkvKiBTZWxlY3QgUENJIGFyYml0b3IgdHlwZSAqLworI2RlZmluZSBIUDEwMF9TVE9QX0VOICAgICAgICAgICAweDIwCS8qIEVuYWJsZXMgUENJIHN0YXRlIG1hY2hpbmUgdG8gaXNzdWUgKi8KKwkJCQkgICAgICAgLyogcGNpIHN0b3AgaWYgY2FzY2FkZSBub3QgcmVhZHkgKi8KKyNkZWZpbmUgSFAxMDBfSUdOT1JFX1BBUiAgICAgICAgMHg0MAkvKiAxOiBQQ0kgc3RhdGUgbWFjaGluZSBpZ25vcmVzIHBhcml0eSAqLworI2RlZmluZSBIUDEwMF9QQ0lfUkVTRVQgICAgICAgICAweDgwCS8qIDAtPjE6IFJlc2V0IFBDSSBibG9jayAqLworCisvKgorICogRWFybHkgVFggQ29uZmlndXJhdGlvbiBhbmQgQ29udHJvbCBSZWdpc3RlcgorICogKFBhZ2UgSFdfTUFQLCBFQVJMWVRYQ0ZHLCBPZmZzZXQgMHgxNikKKyAqLworI2RlZmluZSBIUDEwMF9FTl9FQVJMWV9UWCAgICAgICAweDgwMDAJLyogMT1FbmFibGUgRWFybHkgVFggKi8KKyNkZWZpbmUgSFAxMDBfRU5fQURBUFRJVkUgICAgICAgMHg0MDAwCS8qIDE9RW5hYmxlIGFkYXB0aXZlIG1vZGUgKi8KKyNkZWZpbmUgSFAxMDBfRU5fVFhfVVJfSVJRICAgICAgMHgyMDAwCS8qIHJlc2VydmVkLCBtdXN0IGJlIDAgKi8KKyNkZWZpbmUgSFAxMDBfRU5fTE9XX1RYICAgICAgICAgMHgxMDAwCS8qIHJlc2VydmVkLCBtdXN0IGJlIDAgKi8KKyNkZWZpbmUgSFAxMDBfRVRfQ05UX01BU0sgICAgICAgMHgwZmZmCS8qIGJpdHMgMTEuLjA6IEVUIGNvdW50ZXJzICovCisKKy8qCisgKiBFYXJseSBSWCBDb25maWd1cmF0aW9uIGFuZCBDb250cm9sIFJlZ2lzdGVyCisgKiAoUGFnZSBIV19NQVAsIEVBUkxZUlhDRkcsIE9mZnNldCAweDE4KQorICovCisjZGVmaW5lIEhQMTAwX0VOX0VBUkxZX1JYICAgICAgIDB4ODAJLyogMT1FbmFibGUgRWFybHkgUlggKi8KKyNkZWZpbmUgSFAxMDBfRU5fTE9XX1JYICAgICAgICAgMHg0MAkvKiByZXNlcnZlZCwgbXVzdCBiZSAwICovCisjZGVmaW5lIEhQMTAwX1JYX1RSSVBfTUFTSyAgICAgIDB4MWYJLyogYml0cyA0Li4wOiB0aHJlc2hvbGQgYXQgd2hpY2ggdGhlCisJCQkJCSAqIGVhcmx5IHJ4IGNpcmN1aXQgd2lsbCBzdGFydCB0aGUKKwkJCQkJICogZG1hIG9mIHJlY2VpdmVkIHBhY2tldCBpbnRvIHN5c3RlbQorCQkJCQkgKiBtZW1vcnkgZm9yIEJNICovCisKKy8qCisgKiAgU2VyaWFsIERldmljZXMgQ29udHJvbCBSZWdpc3RlcgorICogKFBhZ2UgRUVQUk9NX0NUUkwsIEVFUFJPTV9DVFJMLCBPZmZzZXQgMHgwOCkKKyAqLworI2RlZmluZSBIUDEwMF9FRVBST01fTE9BRAkweDAwMDEJLyogMC0+MSBsb2FkcyBFRVBST00gaW50byByZWdpc3RlcnMuICovCisJCQkJCS8qIFdoZW4gaXQgZ29lcyBiYWNrIHRvIDAsIGxvYWQgaXMgICAqLworCQkJCQkvKiBjb21wbGV0ZS4gVGhpcyBzaG91bGQgdGFrZSB+NjAwdXMuICovCisKKy8qCisgKiAxME1CIExBTiBDb250cm9sIGFuZCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIEkKKyAqIChQYWdlIE1BQ19DVFJMLCAxMF9MQU5fQ0ZHXzEsIE9mZnNldCAweDA4KQorICovCisjZGVmaW5lIEhQMTAwX01BQzEwX1NFTAkJMHhjMAkvKiBHZXQgYml0cyB0byBpbmRpY2F0ZSBNQUMgKi8KKyNkZWZpbmUgSFAxMDBfQVVJX1NFTAkJMHgyMAkvKiBTdGF0dXMgb2YgQVVJIHNlbGVjdGlvbiAqLworI2RlZmluZSBIUDEwMF9MT1dfVEgJCTB4MTAJLyogMDpObywgMTpZZXMgYWxsb3cgYmV0dGVyIGNhYmxpbmcgKi8KKyNkZWZpbmUgSFAxMDBfTElOS19CRUFUX0RJUwkweDA4CS8qIDA6RW5hYmxlLCAxOkRpc2FibGUgbGluayBiZWF0ICovCisjZGVmaW5lIEhQMTAwX0xJTktfQkVBVF9TVAkweDA0CS8qIDA6Tm8sIDE6WWVzIGxpbmsgYmVhdCBiZWluZyBSeCAqLworI2RlZmluZSBIUDEwMF9SX1JPTF9TVAkJMHgwMgkvKiAwOk5vLCAxOlllcyBSeCB0d2lzdGVkIHBhaXIgaGFzICovCisJCQkJCS8qICAgICAgICAgICAgIGJlZW4gcmV2ZXJzZWQgKi8KKyNkZWZpbmUgSFAxMDBfQVVJX1NUCQkweDAxCS8qIDA6Tm8sIDE6WWVzIHVzZSBBVUkgb24gVFAgY2FyZCAqLworCisvKgorICogMTAgTUIgTEFOIENvbnRyb2wgYW5kIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgSUkKKyAqIChQYWdlIE1BQ19DVFJMLCAxMF9MQU5fQ0ZHXzIsIE9mZnNldCAweDA5KQorICovCisjZGVmaW5lIEhQMTAwX1NRVV9TVAkJMHgwMQkvKiAwOk5vLCAxOlllcyBjb2xsaXNpb24gc2lnbmFsIHNlbnQgKi8KKwkJCQkJLyogICAgICAgYWZ0ZXIgVHguT25seSB1c2VkIGZvciBBVUkuICovCisjZGVmaW5lIEhQMTAwX0ZVTExEVVAgICAgICAgICAgIDB4MDIJLyogMTogTFhUOTAxIFhDVlIgZnVsbGR1cGx4IGVuYWJsZWQgKi8KKyNkZWZpbmUgSFAxMDBfRE9UM19NQUMgICAgICAgICAgMHgwNAkvKiAxOiBET1QgMyBNYWMgc2VsLiB1bmxlc3MgQXV0b3NlbCAqLworCisvKgorICogTUFDIFNlbGVjdGlvbiwgdXNlIHdpdGggTUFDMTBfU0VMIGJpdHMKKyAqLworI2RlZmluZSBIUDEwMF9BVVRPX1NFTF8xMAkweDAJLyogQXV0byBzZWxlY3QgKi8KKyNkZWZpbmUgSFAxMDBfWENWUl9MWFQ5MDFfMTAJMHgxCS8qIExYVDkwMSAxMEJhc2VUIHRyYW5zY2VpdmVyICovCisjZGVmaW5lIEhQMTAwX1hDVlJfNzIxMwkJMHgyCS8qIDcyMTMgdHJhbnNjZWl2ZXIgKi8KKyNkZWZpbmUgSFAxMDBfWENWUl84MjUwMwkweDMJLyogODI1MDMgdHJhbnNjZWl2ZXIgKi8KKworLyoKKyAqICAxMDBNQiBMQU4gVHJhaW5pbmcgUmVnaXN0ZXIKKyAqIChQYWdlIE1BQ19DVFJMLCBWR19MQU5fQ0ZHXzIsIE9mZnNldCAweDBiKSAob2xkLCBwcmUgODAyLjEyKQorICovCisjZGVmaW5lIEhQMTAwX0ZSQU1FX0ZPUk1BVAkweDA4CS8qIDA6ODAyLjMsIDE6ODAyLjUgZnJhbWVzICovCisjZGVmaW5lIEhQMTAwX0JSSURHRQkJMHgwNAkvKiAwOk5vLCAxOlllcyB0ZWxsIGh1YiBpIGFtIGEgYnJpZGdlICovCisjZGVmaW5lIEhQMTAwX1BST01fTU9ERQkJMHgwMgkvKiAwOk5vLCAxOlllcyB0ZWxsIGh1YiBjYXJkIGlzICovCisJCQkJCS8qICAgICAgICAgcHJvbWlzY3VvdXMgKi8KKyNkZWZpbmUgSFAxMDBfUkVQRUFURVIJCTB4MDEJLyogMDpObywgMTpZZXMgdGVsbCBodWIgTUFDIHdhbnRzIHRvICovCisJCQkJCS8qICAgICAgICAgYmUgYSBjYXNjYWRlZCByZXBlYXRlciAqLworCisvKgorICogMTAwTUIgTEFOIENvbnRyb2wgYW5kIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAqIChQYWdlIE1BQ19DVFJMLCBWR19MQU5fQ0ZHXzEsIE9mZnNldCAweDBhKSAKKyAqLworI2RlZmluZSBIUDEwMF9WR19TRUwJICAgICAgICAweDgwCS8qIDA6Tm8sIDE6WWVzIHVzZSAxMDAgTWJpdCBNQUMgKi8KKyNkZWZpbmUgSFAxMDBfTElOS19VUF9TVAkweDQwCS8qIDA6Tm8sIDE6WWVzIGVuZG5vZGUgbG9nZ2VkIGluICovCisjZGVmaW5lIEhQMTAwX0xJTktfQ0FCTEVfU1QJMHgyMAkvKiAwOk5vLCAxOlllcyBjYWJsZSBjYW4gaGVhciB0b25lcyAqLworCQkJCQkvKiAgICAgICAgIGZyb20gIGh1YiAqLworI2RlZmluZSBIUDEwMF9MT0FEX0FERFIJCTB4MTAJLyogMC0+MSBjYXJkIGFkZHIgd2lsbCBiZSBzZW50ICAqLworCQkJCQkvKiAxMDBtcyBsYXRlciB0aGUgbGluayBzdGF0dXMgICovCisJCQkJCS8qIGJpdHMgYXJlIHZhbGlkICovCisjZGVmaW5lIEhQMTAwX0xJTktfQ01ECQkweDA4CS8qIDAtPjEgbGluayB3aWxsIGF0dGVtcHQgdG8gbG9nIGluLiAqLworCQkJCQkvKiAxMDBtcyBsYXRlciB0aGUgbGluayBzdGF0dXMgKi8KKwkJCQkJLyogYml0cyBhcmUgdmFsaWQgKi8KKyNkZWZpbmUgSFAxMDBfVFJOX0RPTkUgICAgICAgICAgMHgwNAkvKiBORVcgRVRSLUNoaXBzIG9ubHk6IFdpbGwgYmUgcmVzZXQgKi8KKwkJCQkJLyogYWZ0ZXIgTGlua1VwIENtZCBpcyBnaXZlbiBhbmQgc2V0ICovCisJCQkJCS8qIHdoZW4gdHJhaW5pbmcgaGFzIGNvbXBsZXRlZC4gKi8KKyNkZWZpbmUgSFAxMDBfTElOS19HT09EX1NUCTB4MDIJLyogMDpObywgMTpZZXMgY2FibGUgcGFzc2VkIHRyYWluaW5nICovCisjZGVmaW5lIEhQMTAwX1ZHX1JFU0VUCQkweDAxCS8qIDA6WWVzLCAxOk5vIHJlc2V0IHRoZSAxMDBWRyBNQUMgKi8KKworCisvKgorICogIE1BQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIEkKKyAqIChQYWdlIE1BQ19DVFJMLCBNQUNfQ0ZHXzEsIE9mZnNldCAweDBjKQorICovCisjZGVmaW5lIEhQMTAwX1JYX0lETEUJCTB4ODAJLyogMDpZZXMsIDE6Tm8gY3VycmVudGx5IHJlY2VpdmluZyBwa3RzICovCisjZGVmaW5lIEhQMTAwX1RYX0lETEUJCTB4NDAJLyogMDpZZXMsIDE6Tm8gY3VycmVudGx5IFR4aW5nIHBrdHMgKi8KKyNkZWZpbmUgSFAxMDBfUlhfRU4JCTB4MjAJLyogMTogYWxsb3cgcmVjZWl2aW5nIG9mIHBrdHMgKi8KKyNkZWZpbmUgSFAxMDBfVFhfRU4JCTB4MTAJLyogMTogYWxsb3cgdHJhbnNtaXR0aW5nIG9mIHBrdHMgKi8KKyNkZWZpbmUgSFAxMDBfQUNDX0VSUk9SRUQJMHgwOAkvKiAwOk5vLCAxOlllcyBhbGxvdyBSeCBvZiBlcnJvcmVkIHBrdHMgKi8KKyNkZWZpbmUgSFAxMDBfQUNDX01DCQkweDA0CS8qIDA6Tm8sIDE6WWVzIGFsbG93IFJ4IG9mIG11bHRpY2FzdCBwa3RzICovCisjZGVmaW5lIEhQMTAwX0FDQ19CQwkJMHgwMgkvKiAwOk5vLCAxOlllcyBhbGxvdyBSeCBvZiBicm9hZGNhc3QgcGt0cyAqLworI2RlZmluZSBIUDEwMF9BQ0NfUEhZCQkweDAxCS8qIDA6Tm8sIDE6WWVzIGFsbG93IFJ4IG9mIEFMTCBwaHlzLiBwa3RzICovCisjZGVmaW5lIEhQMTAwX01BQzFNT0RFTUFTSwkweGYwCS8qIEhpZGUgQUNDIGJpdHMgKi8KKyNkZWZpbmUgSFAxMDBfTUFDMU1PREUxCQkweDAwCS8qIFJlY2VpdmUgbm90aGluZywgbXVzdCBhbHNvIGRpc2FibGUgUlggKi8KKyNkZWZpbmUgSFAxMDBfTUFDMU1PREUyCQkweDAwCisjZGVmaW5lIEhQMTAwX01BQzFNT0RFMwkJSFAxMDBfTUFDMU1PREUyIHwgSFAxMDBfQUNDX0JDCisjZGVmaW5lIEhQMTAwX01BQzFNT0RFNAkJSFAxMDBfTUFDMU1PREUzIHwgSFAxMDBfQUNDX01DCisjZGVmaW5lIEhQMTAwX01BQzFNT0RFNQkJSFAxMDBfTUFDMU1PREU0CS8qIHNldCBtYyBoYXNoIHRvIGFsbCBvbmVzIGFsc28gKi8KKyNkZWZpbmUgSFAxMDBfTUFDMU1PREU2CQlIUDEwMF9NQUMxTU9ERTUgfCBIUDEwMF9BQ0NfUEhZCS8qIFByb21pc2N1b3VzICovCisvKiBOb3RlIE1PREU2IHdpbGwgcmVjZWl2ZSBhbGwgR09PRCBwYWNrZXRzIG9uIHRoZSBMQU4uIFRoaXMgcmVhbGx5IG5lZWRzCisgICBhIG1vZGUgNyBkZWZpbmVkIHRvIGJlIExBTiBBbmFseXplciBtb2RlLCB3aGljaCB3aWxsIHJlY2VpdmUgZXJyb3JlZCBhbmQKKyAgIHJ1bnQgcGFja2V0cywgYW5kIGtlZXAgdGhlIENSQyBieXRlcy4gKi8KKyNkZWZpbmUgSFAxMDBfTUFDMU1PREU3CQlIUDEwMF9NQUMxTU9ERTYgfCBIUDEwMF9BQ0NfRVJST1JFRAorCisvKgorICogIE1BQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIElJIAorICogKFBhZ2UgTUFDX0NUUkwsIE1BQ19DRkdfMiwgT2Zmc2V0IDB4MGQpCisgKi8KKyNkZWZpbmUgSFAxMDBfVFJfTU9ERQkJMHg4MAkvKiAwOk5vLCAxOlllcyBzdXBwb3J0IFRva2VuIFJpbmcgZm9ybWF0cyAqLworI2RlZmluZSBIUDEwMF9UWF9TQU1FCQkweDQwCS8qIDA6Tm8sIDE6WWVzIFR4IHNhbWUgcGFja2V0IGNvbnRpbnVvdXMgKi8KKyNkZWZpbmUgSFAxMDBfTEJLX1hDVlIJCTB4MjAJLyogMDpObywgMTpZZXMgbG9vcGJhY2sgdGhyb3VnaCBNQUMgJiAqLworCQkJCQkvKiAgIHRyYW5zY2VpdmVyICovCisjZGVmaW5lIEhQMTAwX0xCS19NQUMJCTB4MTAJLyogMDpObywgMTpZZXMgbG9vcGJhY2sgdGhyb3VnaCBNQUMgKi8KKyNkZWZpbmUgSFAxMDBfQ1JDX0kJCTB4MDgJLyogMDpObywgMTpZZXMgaW5oaWJpdCBDUkMgb24gVHggcGFja2V0cyAqLworI2RlZmluZSBIUDEwMF9BQ0NOQSAgICAgICAgICAgICAweDA0CS8qIDE6IEZvciA4MDIuNTogQWNjZXB0IG9ubHkgdG9rZW4gcmluZworCQkJCQkgKiBncm91cCBhZGRyIHRoYXQgbWFjaGVzIE5BIG1hc2sgKi8KKyNkZWZpbmUgSFAxMDBfS0VFUF9DUkMJCTB4MDIJLyogMDpObywgMTpZZXMga2VlcCBDUkMgb24gUnggcGFja2V0cy4gKi8KKwkJCQkJLyogICBUaGUgbGVuZ3RoIHdpbGwgcmVmbGVjdCB0aGlzLiAqLworI2RlZmluZSBIUDEwMF9BQ0NGQSAgICAgICAgICAgICAweDAxCS8qIDE6IEZvciA4MDIuNTogQWNjZXB0IG9ubHkgZnVuY3Rpb25hbAorCQkJCQkgKiBhZGRycyB0aGF0IG1hdGNoIEZBIG1hc2sgKHBhZ2UxKSAqLworI2RlZmluZSBIUDEwMF9NQUMyTU9ERU1BU0sJMHgwMgorI2RlZmluZSBIUDEwMF9NQUMyTU9ERTEJCTB4MDAKKyNkZWZpbmUgSFAxMDBfTUFDMk1PREUyCQkweDAwCisjZGVmaW5lIEhQMTAwX01BQzJNT0RFMwkJMHgwMAorI2RlZmluZSBIUDEwMF9NQUMyTU9ERTQJCTB4MDAKKyNkZWZpbmUgSFAxMDBfTUFDMk1PREU1CQkweDAwCisjZGVmaW5lIEhQMTAwX01BQzJNT0RFNgkJMHgwMAorI2RlZmluZSBIUDEwMF9NQUMyTU9ERTcJCUtFRVBfQ1JDCisKKy8qCisgKiBNQUMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBJSUkgCisgKiAoUGFnZSBNQUNfQ1RSTCwgTUFDX0NGR18zLCBPZmZzZXQgMHgwZSkgCisgKi8KKyNkZWZpbmUgSFAxMDBfUEFDS0VUX1BBQ0UgICAgICAgMHgwMwkvKiBQYWNrZXQgUGFjaW5nOgorCQkJCQkgKiAwMDogTm8gcGFja2V0IHBhY2luZworCQkJCQkgKiAwMTogOCB0byAxNiB1UyBkZWxheQorCQkJCQkgKiAxMDogMTYgdG8gMzIgdVMgZGVsYXkKKwkJCQkJICogMTE6IDMyIHRvIDY0IHVTIGRlbGF5CisJCQkJCSAqLworI2RlZmluZSBIUDEwMF9MUkZfRU4gICAgICAgICAgICAweDA0CS8qIDE6IEV4dGVybmFsIExBTiBSY3YgRmlsdGVyIGFuZAorCQkJCQkgKiBUQ1AvSVAgQ2hlY2tzdW1taW5nIGVuYWJsZWQuICovCisjZGVmaW5lIEhQMTAwX0FVVE9fTU9ERSAgICAgICAgIDB4MTAJLyogMTogQXV0b1NlbGVjdCBiZXR3ZWVuIDEwLzEwMCAqLworCisvKgorICogTUFDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgSVYgCisgKiAoUGFnZSBNQUNfQ1RSTCwgTUFDX0NGR180LCBPZmZzZXQgMHgwZikKKyAqLworI2RlZmluZSBIUDEwMF9NQUNfU0VMX1NUICAgICAgICAweDAxCS8qIChSKTogU3RhdHVzIG9mIGV4dGVybmFsIFZHU0VMCisJCQkJCSAqIFNpZ25hbCwgMT0xMDBWRywgMD0xME1iaXQgc2VsLiAqLworI2RlZmluZSBIUDEwMF9MSU5LX0ZBSUxfU1QgICAgICAweDAyCS8qIChSKTogU3RhdHVzIG9mIExpbmsgRmFpbCBwb3J0aW9uCisJCQkJCSAqIG9mIHRoZSBNaXNjLiBJbnRlcnJ1cHQgKi8KKworLyogCisgKiAgMTAwIE1CIExBTiBUcmFpbmluZyBSZXF1ZXN0L0FsbG93ZWQgUmVnaXN0ZXJzIAorICogKFBhZ2UgTUFDX0NUUkwsIFRSQUlOX1JFUVVFU1QgYW5kIFRSQUlOX0FMTE9XLCBPZmZzZXQgMHgxNC0weDE2KShFVFIgcGFydHMgb25seSkKKyAqLworI2RlZmluZSBIUDEwMF9NQUNSUV9SRVBFQVRFUiAgICAgICAgIDB4MDAwMQkvKiAxOiBNQUMgdGVsbHMgSFVCIGl0IHdhbnRzIHRvIGJlIAorCQkJCQkJICogICAgYSBjYXNjYWRlZCByZXBlYXRlcgorCQkJCQkJICogMDogLi4uIHdhbnRzIHRvIGJlIGEgRFRFICovCisjZGVmaW5lIEhQMTAwX01BQ1JRX1BST01TQyAgICAgICAgICAgMHgwMDA2CS8qIDIgYml0czogUHJvbWlzY2lvdXMgbW9kZQorCQkJCQkJICogMDA6IFJjdiBvbmx5IHVuaWNhc3QgcGFja2V0cworCQkJCQkJICogICAgIHNwZWNpZmljYWxseSBhZGRyIHRvIHRoaXMKKwkJCQkJCSAqICAgICBlbmRub2RlCisJCQkJCQkgKiAxMDogUmN2IGFsbCBwY2t0cyBmd2RlZCBieSAKKwkJCQkJCSAqICAgICB0aGUgbG9jYWwgcmVwZWF0ZXIgKi8KKyNkZWZpbmUgSFAxMDBfTUFDUlFfRlJBTUVGTVRfRUlUSEVSICAweDAwMTgJLyogMTE6IGVpdGhlciBmb3JtYXQgYWxsb3dlZCAqLworI2RlZmluZSBIUDEwMF9NQUNSUV9GUkFNRUZNVF84MDJfMyAgIDB4MDAwMAkvKiAwMDogODAyLjMgaXMgcmVxdWVzdGVkICovCisjZGVmaW5lIEhQMTAwX01BQ1JRX0ZSQU1FRk1UXzgwMl81ICAgMHgwMDEwCS8qIDEwOiA4MDIuNSBmb3JtYXQgaXMgcmVxdWVzdGVkICovCisjZGVmaW5lIEhQMTAwX0NBUkRfTUFDVkVSICAgICAgICAgICAgMHhlMDAwCS8qIFI6IDMgYml0IENhcmRzIDEwMFZHIE1BQyB2ZXJzaW9uICovCisjZGVmaW5lIEhQMTAwX01BTExPV19SRVBFQVRFUiAgICAgICAgMHgwMDAxCS8qIElmIHJlc2V0LCByZXF1ZXN0ZWQgYWNjZXNzIGFzIGFuCisJCQkJCQkgKiBlbmQgbm9kZSBpcyBhbGxvd2VkICovCisjZGVmaW5lIEhQMTAwX01BTExPV19QUk9NU0MgICAgICAgICAgMHgwMDA0CS8qIDIgYml0czogUHJvbWlzY2lvdXMgbW9kZQorCQkJCQkJICogMDA6IFJjdiBvbmx5IHVuaWNhc3QgcGFja2V0cworCQkJCQkJICogICAgIHNwZWNpZmljYWxseSBhZGRyIHRvIHRoaXMKKwkJCQkJCSAqICAgICBlbmRub2RlCisJCQkJCQkgKiAxMDogUmN2IGFsbCBwY2t0cyBmd2RlZCBieSAKKwkJCQkJCSAqICAgICB0aGUgbG9jYWwgcmVwZWF0ZXIgKi8KKyNkZWZpbmUgSFAxMDBfTUFMTE9XX0ZSQU1FRk1UICAgICAgICAweDAwZTAJLyogMiBiaXRzOiBGcmFtZSBGb3JtYXQKKwkJCQkJCSAqIDAwOiA4MDIuMyBmb3JtYXQgd2lsbCBiZSB1c2VkCisJCQkJCQkgKiAxMDogODAyLjUgZm9ybWF0IHdpbGwgYmUgdXNlZCAqLworI2RlZmluZSBIUDEwMF9NQUxMT1dfQUNDREVOSUVEICAgICAgIDB4MDQwMAkvKiBOIGJpdCAqLworI2RlZmluZSBIUDEwMF9NQUxMT1dfQ09ORklHVVJFICAgICAgIDB4MGYwMAkvKiBDIGJpdCAqLworI2RlZmluZSBIUDEwMF9NQUxMT1dfRFVQQUREUiAgICAgICAgIDB4MTAwMAkvKiBEIGJpdCAqLworI2RlZmluZSBIUDEwMF9IVUJfTUFDVkVSICAgICAgICAgICAgIDB4ZTAwMAkvKiBSOiAzIGJpdCA4MDIuMTIgTUFDL1JNQUMgdHJhaW5pbmcgKi8KKwkJCQkJICAgICAvKiAgICBwcm90b2NvbCBvZiByZXBlYXRlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyoKKyAqICBTZXQvUmVzZXQgYml0cworICovCisjZGVmaW5lIEhQMTAwX1NFVF9IQgkJMHgwMTAwCS8qIDA6U2V0IGZpZWxkcyB0byAwIHdob3NlIG1hc2sgaXMgMSAqLworI2RlZmluZSBIUDEwMF9TRVRfTEIJCTB4MDAwMQkvKiBIQiBzZXRzIHVwcGVyIGJ5dGUsIExCIHNldHMgbG93ZXIgYnl0ZSAqLworI2RlZmluZSBIUDEwMF9SRVNFVF9IQgkJMHgwMDAwCS8qIEZvciByZWFkYWJpbGl0eSB3aGVuIHJlc2V0dGluZyBiaXRzICovCisjZGVmaW5lIEhQMTAwX1JFU0VUX0xCCQkweDAwMDAJLyogRm9yIHJlYWRhYmlsaXR5IHdoZW4gcmVzZXR0aW5nIGJpdHMgKi8KKworLyoKKyAqICBNaXNjLiBDb25zdGFudHMKKyAqLworI2RlZmluZSBIUDEwMF9MQU5fMTAwCQkxMDAJLyogbGFuX3R5cGUgdmFsdWUgZm9yIFZHICovCisjZGVmaW5lIEhQMTAwX0xBTl8xMAkJMTAJLyogbGFuX3R5cGUgdmFsdWUgZm9yIDEwQmFzZVQgKi8KKyNkZWZpbmUgSFAxMDBfTEFOX0NPQVgJCTkJLyogbGFuX3R5cGUgdmFsdWUgZm9yIENvYXggKi8KKyNkZWZpbmUgSFAxMDBfTEFOX0VSUgkJKC0xKQkvKiBsYW5fdHlwZSB2YWx1ZSBmb3IgbGluayBkb3duICovCisKKy8qIAorICogQnVzIE1hc3RlciBEYXRhIFN0cnVjdHVyZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIE1BWF9SWF9QREwgICAgICAgICAgICAgIDMwCS8qIENhcmQgbGltaXQgPSAzMSAqLworI2RlZmluZSBNQVhfUlhfRlJBRyAgICAgICAgICAgICAyCS8qIERvbid0IG5lZWQgbW9yZS4uLiAqLworI2RlZmluZSBNQVhfVFhfUERMICAgICAgICAgICAgICAyOQorI2RlZmluZSBNQVhfVFhfRlJBRyAgICAgICAgICAgICAyCS8qIExpbWl0ID0gMzEgKi8KKworLyogRGVmaW5lIHRvdGFsIFBETCBhcmVhIHNpemUgaW4gYnl0ZXMgKHNob3VsZCBiZSA0MDk2KSAqLworLyogVGhpcyBpcyB0aGUgc2l6ZSBvZiBrZXJuZWwgKGRtYSkgbWVtb3J5IHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQuICovCisjZGVmaW5lIE1BWF9SSU5HU0laRSAoKE1BWF9SWF9GUkFHKjgrNCs0KSpNQVhfUlhfUERMKyhNQVhfVFhfRlJBRyo4KzQrNCkqTUFYX1RYX1BETCkrMTYKKworLyogRXRoZXJuZXQgUGFja2V0IFNpemVzICovCisjZGVmaW5lIE1JTl9FVEhFUl9TSVpFICAgICAgICAgIDYwCisjZGVmaW5lIE1BWF9FVEhFUl9TSVpFICAgICAgICAgIDE1MTQJLyogTmVlZGVkIGZvciBwcmVhbGxvY2F0aW9uIG9mICovCisJCQkJCS8qIHNrYiBidWZmZXIgd2hlbiBidXNtYXN0ZXJpbmcgKi8KKworLyogVHggb3IgUnggUmluZyBFbnRyeSAqLwordHlwZWRlZiBzdHJ1Y3QgaHAxMDBfcmluZyB7CisJdV9pbnQgKnBkbDsJCS8qIEFkZHJlc3Mgb2YgUERMcyBQREgsIGR3b3JkIGJlZm9yZQorCQkJCSAqIHRoaXMgYWRkcmVzcyBpcyB1c2VkIGZvciByeCBoZHIgKi8KKwl1X2ludCBwZGxfcGFkZHI7CS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgUERMICovCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaHAxMDBfcmluZyAqbmV4dDsKK30gaHAxMDBfcmluZ190OworCisKKworLyogTWFzayBmb3IgSGVhZGVyIERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgSFAxMDBfUEtUX0xFTl9NQVNLCTB4MUZGRgkvKiBBTkQgd2l0aCBSeExlbmd0aCB0byBnZXQgbGVuZ3RoICovCisKKworLyogUmVjZWl2ZSBQYWNrZXQgU3RhdHVzLiAgTm90ZSwgdGhlIGVycm9yIGJpdHMgYXJlIG9ubHkgdmFsaWQgaWYgQUNDX0VSUk9SRUQgCisgICBiaXQgaW4gdGhlIE1BQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgaXMgc2V0LiAqLworI2RlZmluZSBIUDEwMF9SWF9QUkkJCTB4ODAwMAkvKiAwOk5vLCAxOlllcyBwYWNrZXQgaXMgcHJpb3JpdHkgKi8KKyNkZWZpbmUgSFAxMDBfU0RGX0VSUgkJMHg0MDAwCS8qIDA6Tm8sIDE6WWVzIHN0YXJ0IG9mIGZyYW1lIGVycm9yICovCisjZGVmaW5lIEhQMTAwX1NLRVdfRVJSCQkweDIwMDAJLyogMDpObywgMTpZZXMgc2tldyBvdXQgb2YgcmFuZ2UgKi8KKyNkZWZpbmUgSFAxMDBfQkFEX1NZTUJPTF9FUlIJMHgxMDAwCS8qIDA6Tm8sIDE6WWVzIGludmFsaWQgc3ltYm9sIHJlY2VpdmVkICovCisjZGVmaW5lIEhQMTAwX1JDVl9JUE1fRVJSCTB4MDgwMAkvKiAwOk5vLCAxOlllcyBwa3QgaGFkIGFuIGludmFsaWQgcGFja2V0ICovCisJCQkJCS8qICAgbWFya2VyICovCisjZGVmaW5lIEhQMTAwX1NZTUJPTF9CQUxfRVJSCTB4MDQwMAkvKiAwOk5vLCAxOlllcyBzeW1ib2wgYmFsYW5jZSBlcnJvciAqLworI2RlZmluZSBIUDEwMF9WR19BTE5fRVJSCTB4MDIwMAkvKiAwOk5vLCAxOlllcyBub24tb2N0ZXQgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgSFAxMDBfVFJVTkNfRVJSCQkweDAxMDAJLyogMDpObywgMTpZZXMgdGhlIHBhY2tldCB3YXMgdHJ1bmNhdGVkICovCisjZGVmaW5lIEhQMTAwX1JVTlRfRVJSCQkweDAwNDAJLyogMDpObywgMTpZZXMgcGt0IGxlbmd0aCA8IE1pbiBQa3QgKi8KKwkJCQkJLyogICBMZW5ndGggUmVnLiAqLworI2RlZmluZSBIUDEwMF9BTE5fRVJSCQkweDAwMTAJLyogMDpObywgMTpZZXMgYWxpZ24gZXJyb3IuICovCisjZGVmaW5lIEhQMTAwX0NSQ19FUlIJCTB4MDAwOAkvKiAwOk5vLCAxOlllcyBDUkMgb2NjdXJyZWQuICovCisKKy8qIFRoZSBsYXN0IHRocmVlIGJpdHMgaW5kaWNhdGUgdGhlIHR5cGUgb2YgZGVzdGluYXRpb24gYWRkcmVzcyAqLworCisjZGVmaW5lIEhQMTAwX01VTFRJX0FERFJfSEFTSAkweDAwMDYJLyogMTEwOiBBZGRyIG11bHRpY2FzdCwgbWF0Y2hlZCBoYXNoICovCisjZGVmaW5lIEhQMTAwX0JST0FEQ0FTVF9BRERSCTB4MDAwMwkvKiB4MTE6IEFkZHIgYnJvYWRjYXN0ICovCisjZGVmaW5lIEhQMTAwX01VTFRJX0FERFJfTk9fSEFTSCAweDAwMDIJLyogMDEwOiBBZGRyIG11bHRpY2FzdCwgZGlkbid0IG1hdGNoIGhhc2ggKi8KKyNkZWZpbmUgSFAxMDBfUEhZU19BRERSX01BVENICTB4MDAwMQkvKiB4MDE6IEFkZHIgd2FzIHBoeXNpY2FsIGFuZCBtaW5lICovCisjZGVmaW5lIEhQMTAwX1BIWVNfQUREUl9OT19NQVRDSCAweDAwMDAJLyogeDAwOiBBZGRyIHdhcyBwaHlzaWNhbCBidXQgbm90IG1pbmUgKi8KKworLyoKKyAqICBtYWNyb3MKKyAqLworCisjZGVmaW5lIGhwMTAwX2luYiggcmVnICkgXAorICAgICAgICBpbmIoIGlvYWRkciArIEhQMTAwX1JFR18jI3JlZyApCisjZGVmaW5lIGhwMTAwX2ludyggcmVnICkgXAorCWludyggaW9hZGRyICsgSFAxMDBfUkVHXyMjcmVnICkKKyNkZWZpbmUgaHAxMDBfaW5sKCByZWcgKSBcCisJaW5sKCBpb2FkZHIgKyBIUDEwMF9SRUdfIyNyZWcgKQorI2RlZmluZSBocDEwMF9vdXRiKCBkYXRhLCByZWcgKSBcCisJb3V0YiggZGF0YSwgaW9hZGRyICsgSFAxMDBfUkVHXyMjcmVnICkKKyNkZWZpbmUgaHAxMDBfb3V0dyggZGF0YSwgcmVnICkgXAorCW91dHcoIGRhdGEsIGlvYWRkciArIEhQMTAwX1JFR18jI3JlZyApCisjZGVmaW5lIGhwMTAwX291dGwoIGRhdGEsIHJlZyApIFwKKwlvdXRsKCBkYXRhLCBpb2FkZHIgKyBIUDEwMF9SRUdfIyNyZWcgKQorI2RlZmluZSBocDEwMF9vcmIoIGRhdGEsIHJlZyApIFwKKwlvdXRiKCBpbmIoIGlvYWRkciArIEhQMTAwX1JFR18jI3JlZyApIHwgKGRhdGEpLCBpb2FkZHIgKyBIUDEwMF9SRUdfIyNyZWcgKQorI2RlZmluZSBocDEwMF9vcncoIGRhdGEsIHJlZyApIFwKKwlvdXR3KCBpbncoIGlvYWRkciArIEhQMTAwX1JFR18jI3JlZyApIHwgKGRhdGEpLCBpb2FkZHIgKyBIUDEwMF9SRUdfIyNyZWcgKQorI2RlZmluZSBocDEwMF9hbmRiKCBkYXRhLCByZWcgKSBcCisJb3V0YiggaW5iKCBpb2FkZHIgKyBIUDEwMF9SRUdfIyNyZWcgKSAmIChkYXRhKSwgaW9hZGRyICsgSFAxMDBfUkVHXyMjcmVnICkKKyNkZWZpbmUgaHAxMDBfYW5kdyggZGF0YSwgcmVnICkgXAorCW91dHcoIGludyggaW9hZGRyICsgSFAxMDBfUkVHXyMjcmVnICkgJiAoZGF0YSksIGlvYWRkciArIEhQMTAwX1JFR18jI3JlZyApCisKKyNkZWZpbmUgaHAxMDBfcGFnZSggcGFnZSApIFwKKwlvdXR3KCBIUDEwMF9QQUdFXyMjcGFnZSwgaW9hZGRyICsgSFAxMDBfUkVHX1BBR0lORyApCisjZGVmaW5lIGhwMTAwX2ludHNfb2ZmKCkgXAorCW91dHcoIEhQMTAwX0lOVF9FTiB8IEhQMTAwX1JFU0VUX0xCLCBpb2FkZHIgKyBIUDEwMF9SRUdfT1BUSU9OX0xTVyApCisjZGVmaW5lIGhwMTAwX2ludHNfb24oKSBcCisJb3V0dyggSFAxMDBfSU5UX0VOIHwgSFAxMDBfU0VUX0xCLCBpb2FkZHIgKyBIUDEwMF9SRUdfT1BUSU9OX0xTVyApCisjZGVmaW5lIGhwMTAwX21lbV9tYXBfZW5hYmxlKCkgXAorCW91dHcoIEhQMTAwX01NQVBfRElTIHwgSFAxMDBfUkVTRVRfSEIsIGlvYWRkciArIEhQMTAwX1JFR19PUFRJT05fTFNXICkKKyNkZWZpbmUgaHAxMDBfbWVtX21hcF9kaXNhYmxlKCkgXAorCW91dHcoIEhQMTAwX01NQVBfRElTIHwgSFAxMDBfU0VUX0hCLCBpb2FkZHIgKyBIUDEwMF9SRUdfT1BUSU9OX0xTVyApCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ocGxhbmNlLmMgYi9kcml2ZXJzL25ldC9ocGxhbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3MDNkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hwbGFuY2UuYwpAQCAtMCwwICsxLDIzMSBAQAorLyogaHBsYW5jZS5jICA6IHRoZSAgTGludXgvaHAzMDAvbGFuY2UgZXRoZXJuZXQgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAwNS8xOTk4IFBldGVyIE1heWRlbGwgPHBtYXlkZWxsQGNoaWFyay5ncmVlbmVuZC5vcmcudWs+CisgKiBCYXNlZCBvbiB0aGUgU3VuIExhbmNlIGRyaXZlciBhbmQgdGhlIE5ldEJTRCBIUCBMYW5jZSBkcml2ZXIKKyAqIFVzZXMgdGhlIGdlbmVyaWMgNzk5MC5jIExBTkNFIGNvZGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisvKiBVc2VkIGZvciB0aGUgdGVtcG9yYWwgaW5ldCBlbnRyaWVzIGFuZCByb3V0aW5nICovCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKyNpbmNsdWRlICJocGxhbmNlLmgiCisKKy8qIFdlIGhhdmUgMTY4MzQgYnl0ZXMgb2YgUkFNIGZvciB0aGUgaW5pdCBibG9jayBhbmQgYnVmZmVycy4gVGhpcyBwbGFjZXMKKyAqIGFuIHVwcGVyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgYnVmZmVycyB3ZSBjYW4gdXNlLiBOZXRCU0QgdXNlcyA4IFJ4CisgKiBidWZmZXJzIGFuZCAyIFR4IGJ1ZmZlcnMuCisgKi8KKyNkZWZpbmUgTEFOQ0VfTE9HX1RYX0JVRkZFUlMgMQorI2RlZmluZSBMQU5DRV9MT0dfUlhfQlVGRkVSUyAzCisKKyNpbmNsdWRlICI3OTkwLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIGdlbmVyaWMgTEFOQ0UgY29kZSAqLworCisvKiBPdXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IGhwbGFuY2VfcHJpdmF0ZSB7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgbGFuY2U7Cit9OworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzLi4uIFRoaXMgaXMgZWFzeSBiZWNhdXNlIGFsbCB0aGUgZ3JvdCBpcyBpbiB0aGUKKyAqIGdlbmVyaWMgTEFOQ0Ugc3VwcG9ydC4gQWxsIHdlIGhhdmUgdG8gc3VwcG9ydCBpcyBwcm9iaW5nIGZvciBib2FyZHMsCisgKiBwbHVzIGJvYXJkLXNwZWNpZmljIGluaXQsIG9wZW4gYW5kIGNsb3NlIGFjdGlvbnMuIAorICogT2gsIGFuZCB3ZSBuZWVkIHRvIHRlbGwgdGhlIGdlbmVyaWMgY29kZSBob3cgdG8gcmVhZCBhbmQgd3JpdGUgTEFOQ0UgcmVnaXN0ZXJzLi4uCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGhwbGFuY2VfaW5pdF9vbmUoc3RydWN0IGRpb19kZXYgKmQsCisJCQkJY29uc3Qgc3RydWN0IGRpb19kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgdm9pZCBfX2RldmluaXQgaHBsYW5jZV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAorCQkJCXN0cnVjdCBkaW9fZGV2ICpkKTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBocGxhbmNlX3JlbW92ZV9vbmUoc3RydWN0IGRpb19kZXYgKmQpOworc3RhdGljIHZvaWQgaHBsYW5jZV93cml0ZXJhcCh2b2lkICpwcml2LCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSk7CitzdGF0aWMgdm9pZCBocGxhbmNlX3dyaXRlcmRwKHZvaWQgKnByaXYsIHVuc2lnbmVkIHNob3J0IHZhbHVlKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBocGxhbmNlX3JlYWRyZHAodm9pZCAqcHJpdik7CitzdGF0aWMgaW50IGhwbGFuY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaHBsYW5jZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHN0cnVjdCBkaW9fZGV2aWNlX2lkIGhwbGFuY2VfZGlvX3RibFtdID0geworCXsgRElPX0lEX0xBTiB9LAorCXsgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IGRpb19kcml2ZXIgaHBsYW5jZV9kcml2ZXIgPSB7CisJLm5hbWUgICAgICA9ICJocGxhbmNlIiwKKwkuaWRfdGFibGUgID0gaHBsYW5jZV9kaW9fdGJsLAorCS5wcm9iZSAgICAgPSBocGxhbmNlX2luaXRfb25lLAorCS5yZW1vdmUgICAgPSBfX2RldmV4aXRfcChocGxhbmNlX3JlbW92ZV9vbmUpLAorfTsKKworLyogRmluZCBhbGwgdGhlIEhQIExhbmNlIGJvYXJkcyBhbmQgaW5pdGlhbGlzZSB0aGVtLi4uICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBocGxhbmNlX2luaXRfb25lKHN0cnVjdCBkaW9fZGV2ICpkLAorCQkJCWNvbnN0IHN0cnVjdCBkaW9fZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgaHBsYW5jZV9wcml2YXRlKSk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVCVVNZOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGRpb19yZXNvdXJjZV9zdGFydChkKSwKKwkJCQlkaW9fcmVzb3VyY2VfbGVuKGQpLCBkLT5uYW1lKSkKKwkJZ290byBvdXRfZnJlZV9uZXRkZXY7CisKKwlocGxhbmNlX2luaXQoZGV2LCBkKTsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9yZWxlYXNlX21lbV9yZWdpb247CisKKwlkaW9fc2V0X2RydmRhdGEoZCwgZGV2KTsKKwlyZXR1cm4gMDsKKworIG91dF9yZWxlYXNlX21lbV9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKGRpb19yZXNvdXJjZV9zdGFydChkKSwgZGlvX3Jlc291cmNlX2xlbihkKSk7Cisgb3V0X2ZyZWVfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7Cisgb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBocGxhbmNlX3JlbW92ZV9vbmUoc3RydWN0IGRpb19kZXYgKmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRpb19nZXRfZHJ2ZGF0YShkKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGRpb19yZXNvdXJjZV9zdGFydChkKSwgZGlvX3Jlc291cmNlX2xlbihkKSk7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworLyogSW5pdGlhbGlzZSBhIHNpbmdsZSBsYW5jZSBib2FyZCBhdCB0aGUgZ2l2ZW4gRElPIGRldmljZSAqLworc3RhdGljIHZvaWQgX19pbml0IGhwbGFuY2VfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZGlvX2RldiAqZCkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyB2YSA9IChkLT5yZXNvdXJjZS5zdGFydCArIERJT19WSVJBRERSQkFTRSk7CisgICAgICAgIHN0cnVjdCBocGxhbmNlX3ByaXZhdGUgKmxwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgCisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiAlczsgc2VsZWN0IGNvZGUgJWQsIGFkZHIiLCBkZXYtPm5hbWUsIGQtPm5hbWUsIGQtPnNjb2RlKTsKKworICAgICAgICAvKiByZXNldCB0aGUgYm9hcmQgKi8KKyAgICAgICAgb3V0XzgodmErRElPX0lET0ZGLCAweGZmKTsKKyAgICAgICAgdWRlbGF5KDEwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJpYmEhIGFyaWJhISB1ZGVsYXkhIHVkZWxheSEgKi8KKworICAgICAgICAvKiBGaWxsIHRoZSBkZXYgZmllbGRzICovCisgICAgICAgIGRldi0+YmFzZV9hZGRyID0gdmE7CisgICAgICAgIGRldi0+b3BlbiA9ICZocGxhbmNlX29wZW47CisgICAgICAgIGRldi0+c3RvcCA9ICZocGxhbmNlX2Nsb3NlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisgICAgICAgIGRldi0+cG9sbF9jb250cm9sbGVyID0gbGFuY2VfcG9sbDsKKyNlbmRpZgorICAgICAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZsYW5jZV9zdGFydF94bWl0OworICAgICAgICBkZXYtPmdldF9zdGF0cyA9ICZsYW5jZV9nZXRfc3RhdHM7CisgICAgICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmxhbmNlX3NldF9tdWx0aWNhc3Q7CisgICAgICAgIGRldi0+ZG1hID0gMDsKKyAgICAgICAgCisgICAgICAgIGZvciAoaT0wOyBpPDY7IGkrKykgeworICAgICAgICAgICAgICAgIC8qIFRoZSBOVlJBTSBob2xkcyBvdXIgZXRoZXJuZXQgYWRkcmVzcywgb25lIG5pYmJsZSBwZXIgYnl0ZSwKKyAgICAgICAgICAgICAgICAgKiBhdCBieXRlcyBOVlJBTU9GRisxLDMsNSw3LDkuLi4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBkZXYtPmRldl9hZGRyW2ldID0gKChpbl84KHZhICsgSFBMQU5DRV9OVlJBTU9GRiArIGkqNCArIDEpICYgMHhGKSA8PCA0KQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoaW5fOCh2YSArIEhQTEFOQ0VfTlZSQU1PRkYgKyBpKjQgKyAzKSAmIDB4Rik7CisgICAgICAgICAgICAgICAgcHJpbnRrKCIlYyUyLjJ4IiwgaSA9PSAwID8gJyAnIDogJzonLCBkZXYtPmRldl9hZGRyW2ldKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBscC0+bGFuY2UubmFtZSA9IChjaGFyKilkLT5uYW1lOyAgICAgICAgICAgICAgICAvKiBkaXNjYXJkcyBjb25zdCwgc2h1dCB1cCBnY2MgKi8KKyAgICAgICAgbHAtPmxhbmNlLmJhc2UgPSB2YTsKKyAgICAgICAgbHAtPmxhbmNlLmluaXRfYmxvY2sgPSAoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKikodmEgKyBIUExBTkNFX01FTU9GRik7IC8qIENQVSBhZGRyICovCisgICAgICAgIGxwLT5sYW5jZS5sYW5jZV9pbml0X2Jsb2NrID0gMDsgICAgICAgICAgICAgICAgIC8qIExBTkNFIGFkZHIgb2Ygc2FtZSBSQU0gKi8KKyAgICAgICAgbHAtPmxhbmNlLmJ1c21hc3Rlcl9yZWd2YWwgPSBMRV9DM19CU1dQOyAgICAgICAgLyogd2UncmUgYmlnZW5kaWFuICovCisgICAgICAgIGxwLT5sYW5jZS5pcnEgPSBkLT5pcGw7CisgICAgICAgIGxwLT5sYW5jZS53cml0ZXJhcCA9IGhwbGFuY2Vfd3JpdGVyYXA7CisgICAgICAgIGxwLT5sYW5jZS53cml0ZXJkcCA9IGhwbGFuY2Vfd3JpdGVyZHA7CisgICAgICAgIGxwLT5sYW5jZS5yZWFkcmRwID0gaHBsYW5jZV9yZWFkcmRwOworICAgICAgICBscC0+bGFuY2UubGFuY2VfbG9nX3J4X2J1ZnMgPSBMQU5DRV9MT0dfUlhfQlVGRkVSUzsKKyAgICAgICAgbHAtPmxhbmNlLmxhbmNlX2xvZ190eF9idWZzID0gTEFOQ0VfTE9HX1RYX0JVRkZFUlM7CisgICAgICAgIGxwLT5sYW5jZS5yeF9yaW5nX21vZF9tYXNrID0gUlhfUklOR19NT0RfTUFTSzsKKyAgICAgICAgbHAtPmxhbmNlLnR4X3JpbmdfbW9kX21hc2sgPSBUWF9SSU5HX01PRF9NQVNLOworCXByaW50aygiLCBpcnEgJWRcbiIsIGxwLT5sYW5jZS5pcnEpOworfQorCisvKiBUaGlzIGlzIGRpc2d1c3RpbmcuIFdlIGhhdmUgdG8gY2hlY2sgdGhlIERJTyBzdGF0dXMgcmVnaXN0ZXIgZm9yIGFjayBldmVyeQorICogdGltZSB3ZSByZWFkIG9yIHdyaXRlIHRoZSBMQU5DRSByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGhwbGFuY2Vfd3JpdGVyYXAodm9pZCAqcHJpdiwgdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopcHJpdjsKKwlkbyB7CisJCW91dF9iZTE2KGxwLT5iYXNlICsgSFBMQU5DRV9SRUdPRkYgKyBMQU5DRV9SQVAsIHZhbHVlKTsKKwl9IHdoaWxlICgoaW5fOChscC0+YmFzZSArIEhQTEFOQ0VfU1RBVFVTKSAmIExFX0FDSykgPT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhwbGFuY2Vfd3JpdGVyZHAodm9pZCAqcHJpdiwgdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopcHJpdjsKKwlkbyB7CisJCW91dF9iZTE2KGxwLT5iYXNlICsgSFBMQU5DRV9SRUdPRkYgKyBMQU5DRV9SRFAsIHZhbHVlKTsKKwl9IHdoaWxlICgoaW5fOChscC0+YmFzZSArIEhQTEFOQ0VfU1RBVFVTKSAmIExFX0FDSykgPT0gMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBocGxhbmNlX3JlYWRyZHAodm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGxhbmNlX3ByaXZhdGUgKilwcml2OworCV9fdTE2IHZhbHVlOworCWRvIHsKKwkJdmFsdWUgPSBpbl9iZTE2KGxwLT5iYXNlICsgSFBMQU5DRV9SRUdPRkYgKyBMQU5DRV9SRFApOworCX0gd2hpbGUgKChpbl84KGxwLT5iYXNlICsgSFBMQU5DRV9TVEFUVVMpICYgTEVfQUNLKSA9PSAwKTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgaHBsYW5jZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIAorICAgICAgICBzdGF0dXMgPSBsYW5jZV9vcGVuKGRldik7ICAgICAgICAgICAgICAgICAvKiBjYWxsIGdlbmVyaWMgbGFuY2Ugb3BlbiBjb2RlICovCisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgLyogZW5hYmxlIGludGVycnVwdHMgYXQgYm9hcmQgbGV2ZWwuICovCisgICAgICAgIG91dF84KGxwLT5iYXNlICsgSFBMQU5DRV9TVEFUVVMsIExFX0lFKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBocGxhbmNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgb3V0XzgobHAtPmJhc2UgKyBIUExBTkNFX1NUQVRVUywgMCk7CS8qIGRpc2FibGUgaW50ZXJydXB0cyBhdCBib2FyZGxldmVsICovCisgICAgICAgIGxhbmNlX2Nsb3NlKGRldik7CisgICAgICAgIHJldHVybiAwOworfQorCitpbnQgX19pbml0IGhwbGFuY2VfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gZGlvX21vZHVsZV9pbml0KCZocGxhbmNlX2RyaXZlcik7Cit9CisKK3ZvaWQgX19leGl0IGhwbGFuY2VfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKyAgICAgICAgZGlvX3VucmVnaXN0ZXJfZHJpdmVyKCZocGxhbmNlX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGhwbGFuY2VfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoaHBsYW5jZV9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hwbGFuY2UuaCBiL2RyaXZlcnMvbmV0L2hwbGFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGFlZTllCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaHBsYW5jZS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIFJhbmRvbSBkZWZpbmVzIGFuZCBzdHJ1Y3R1cmVzIGZvciB0aGUgSFAgTGFuY2UgZHJpdmVyLgorICogQ29weXJpZ2h0IChDKSAwNS8xOTk4IFBldGVyIE1heWRlbGwgPHBtYXlkZWxsQGNoaWFyay5ncmVlbmVuZC5vcmcudWs+CisgKiBCYXNlZCBvbiB0aGUgU3VuIExhbmNlIGRyaXZlciBhbmQgdGhlIE5ldEJTRCBIUCBMYW5jZSBkcml2ZXIKKyAqLworCisvKiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgSFBMQU5DRV9JRAkJMHgwMQkJLyogRElPIHJlZ2lzdGVyOiBJRCBieXRlICovCisjZGVmaW5lIEhQTEFOQ0VfU1RBVFVTCQkweDAzCQkvKiBESU8gcmVnaXN0ZXI6IGludGVycnVwdCBlbmFibGUvc3RhdHVzICovCisKKy8qIENvbnRyb2wgYW5kIHN0YXR1cyBiaXRzIGZvciB0aGUgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIExFX0lFIDB4ODAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTEVfSVIgMHg0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJydXB0IHJlcXVlc3RlZCAqLworI2RlZmluZSBMRV9MT0NLIDB4MDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2NrIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBMRV9BQ0sgMHgwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhY2sgb2YgbG9jayAqLworI2RlZmluZSBMRV9KQUIgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb3NzIG9mIHR4IGNsb2NrICg/Pz8pICovCisvKiBXZSBjYW4gYWxzbyBleHRyYWN0IHRoZSBJUEwgZnJvbSB0aGUgc3RhdHVzIHJlZ2lzdGVyIHdpdGggdGhlIHN0YW5kYXJkCisgKiBESU9fSVBMKGhwbGFuY2UpIG1hY3JvLCBvciB1c2luZyBkaW9fc2NvZGV0b2lwbCgpCisgKi8KKworLyogVGhlc2UgYXJlIHRoZSBvZmZzZXRzIGZvciB0aGUgRElPIHJlZ3MgKGhwbGFuY2VfcmVnKSwgbGFuY2VfaW9yZWcsCisgKiBtZW1vcnkgYW5kIE5WUkFNOgorICovCisjZGVmaW5lIEhQTEFOQ0VfSURPRkYgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJvYXJkIGJhc2VhZGRyICovCisjZGVmaW5lIEhQTEFOQ0VfUkVHT0ZGIDB4NDAwMCAgICAgICAgICAgICAgICAgICAgIC8qIGxhbmNlIHJlZ2lzdGVycyAqLworI2RlZmluZSBIUExBTkNFX01FTU9GRiAweDgwMDAgICAgICAgICAgICAgICAgICAgICAvKiBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqLworI2RlZmluZSBIUExBTkNFX05WUkFNT0ZGIDB4QzAwOCAgICAgICAgICAgICAgICAgICAvKiBldGhlcmFkZHJlc3MgYXMgb25lICpuaWJibGUqIHBlciBieXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oeWRyYS5jIGIvZHJpdmVycy9uZXQvaHlkcmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTBjYTczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaHlkcmEuYwpAQCAtMCwwICsxLDI1NiBAQAorLyogTmV3IEh5ZHJhIGRyaXZlciB1c2luZyBnZW5lcmljIDgzOTAgY29yZSAqLworLyogQmFzZWQgb24gb2xkIGh5ZHJhIGRyaXZlciBieSBUb3BpIEthbmVydmEgKHRvcGlAc3VzYW5uYS5vdWx1LmZpKSAqLworCisvKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsICAgICAgKi8KKy8qIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSAgICAgICAqLworLyogTGludXggZGlzdHJpYnV0aW9uIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIFBldGVyIERlIFNjaHJpanZlciAocDJAbWluZC5iZSkgKi8KKy8qIE9sZGVuYnVyZyAyMDAwICovCisKKy8qIFRoZSBBbWlnYW5ldCBpcyBhIFpvcnJvLUlJIGJvYXJkIG1hZGUgYnkgSHlkcmEgU3lzdGVtcy4gSXQgY29udGFpbnMgYSAgICAqLworLyogTlM4MzkwIE5JQyAobmV0d29yayBpbnRlcmZhY2UgY29udHJvbGxlcikgY2xvbmUsIDE2IG9yIDY0SyBvbi1ib2FyZCBSQU0gICovCisvKiBhbmQgMTBCQVNFLTIgKHRoaW4gY29heCkgYW5kIEFVSSBjb25uZWN0b3JzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKyNkZWZpbmUgTkVfRU4wX0RDRkcgICAgICgweDBlKjIpCisKKyNkZWZpbmUgTkVTTV9TVEFSVF9QRyAgIDB4MCAgICAvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlciAqLworI2RlZmluZSBORVNNX1NUT1BfUEcgICAgMHg0MCAgICAvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworCisjZGVmaW5lIEhZRFJBX05JQ19CQVNFIDB4ZmZlMQorI2RlZmluZSBIWURSQV9BRERSUFJPTSAweGZmYzAKKyNkZWZpbmUgSFlEUkFfVkVSU0lPTiAidjMuMGFscGhhIgorCisjZGVmaW5lIFdPUkRTV0FQKGEpICAgICAoKCgoYSk+PjgpJjB4ZmYpIHwgKChhKTw8OCkpCisKKworc3RhdGljIGludCBfX2RldmluaXQgaHlkcmFfaW5pdF9vbmUoc3RydWN0IHpvcnJvX2RldiAqeiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHpvcnJvX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IGh5ZHJhX2luaXQoc3RydWN0IHpvcnJvX2RldiAqeik7CitzdGF0aWMgaW50IGh5ZHJhX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGh5ZHJhX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaHlkcmFfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGh5ZHJhX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgaHlkcmFfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIGh5ZHJhX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSk7CitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaHlkcmFfcmVtb3ZlX29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6KTsKKworc3RhdGljIHN0cnVjdCB6b3Jyb19kZXZpY2VfaWQgaHlkcmFfem9ycm9fdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKyAgICB7IFpPUlJPX1BST0RfSFlEUkFfU1lTVEVNU19BTUlHQU5FVCB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHpvcnJvX2RyaXZlciBoeWRyYV9kcml2ZXIgPSB7CisgICAgLm5hbWUJPSAiaHlkcmEiLAorICAgIC5pZF90YWJsZQk9IGh5ZHJhX3pvcnJvX3RibCwKKyAgICAucHJvYmUJPSBoeWRyYV9pbml0X29uZSwKKyAgICAucmVtb3ZlCT0gX19kZXZleGl0X3AoaHlkcmFfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBoeWRyYV9pbml0X29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6LAorCQkJCSAgICBjb25zdCBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkICplbnQpCit7CisgICAgaW50IGVycjsKKworICAgIGlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHotPnJlc291cmNlLnN0YXJ0LCAweDEwMDAwLCAiSHlkcmEiKSkKKwlyZXR1cm4gLUVCVVNZOworICAgIGlmICgoZXJyID0gaHlkcmFfaW5pdCh6KSkpIHsKKwlyZWxlYXNlX21lbV9yZWdpb24oei0+cmVzb3VyY2Uuc3RhcnQsIDB4MTAwMDApOworCXJldHVybiAtRUJVU1k7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBoeWRyYV9pbml0KHN0cnVjdCB6b3Jyb19kZXYgKnopCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICB1bnNpZ25lZCBsb25nIGJvYXJkID0gWlRXT19WQUREUih6LT5yZXNvdXJjZS5zdGFydCk7CisgICAgdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBib2FyZCtIWURSQV9OSUNfQkFTRTsKKyAgICBjb25zdCBjaGFyIG5hbWVbXSA9ICJORTIwMDAiOworICAgIGludCBzdGFydF9wYWdlLCBzdG9wX3BhZ2U7CisgICAgaW50IGo7CisgICAgaW50IGVycjsKKworICAgIHN0YXRpYyB1MzIgaHlkcmFfb2Zmc2V0c1sxNl0gPSB7CisJMHgwMCwgMHgwMiwgMHgwNCwgMHgwNiwgMHgwOCwgMHgwYSwgMHgwYywgMHgwZSwKKwkweDEwLCAweDEyLCAweDE0LCAweDE2LCAweDE4LCAweDFhLCAweDFjLCAweDFlLAorICAgIH07CisKKyAgICBkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKyAgICBpZiAoIWRldikKKwlyZXR1cm4gLUVOT01FTTsKKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKyAgICBmb3IoaiA9IDA7IGogPCBFVEhFUl9BRERSX0xFTjsgaisrKQorCWRldi0+ZGV2X2FkZHJbal0gPSAqKCh1OCAqKShib2FyZCArIEhZRFJBX0FERFJQUk9NICsgMipqKSk7CisKKyAgICAvKiBXZSBtdXN0IHNldCB0aGUgODM5MCBmb3Igd29yZCBtb2RlLiAqLworICAgIHpfd3JpdGViKDB4NGIsIGlvYWRkciArIE5FX0VOMF9EQ0ZHKTsKKyAgICBzdGFydF9wYWdlID0gTkVTTV9TVEFSVF9QRzsKKyAgICBzdG9wX3BhZ2UgPSBORVNNX1NUT1BfUEc7CisKKyAgICBkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKyAgICBkZXYtPmlycSA9IElSUV9BTUlHQV9QT1JUUzsKKworICAgIC8qIEluc3RhbGwgdGhlIEludGVycnVwdCBoYW5kbGVyICovCisgICAgaWYgKHJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgZWlfaW50ZXJydXB0LCBTQV9TSElSUSwgIkh5ZHJhIEV0aGVybmV0IiwKKwkJICAgIGRldikpIHsKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiAtRUFHQUlOOworICAgIH0KKworICAgIGVpX3N0YXR1cy5uYW1lID0gbmFtZTsKKyAgICBlaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA9IHN0YXJ0X3BhZ2U7CisgICAgZWlfc3RhdHVzLnN0b3BfcGFnZSA9IHN0b3BfcGFnZTsKKyAgICBlaV9zdGF0dXMud29yZDE2ID0gMTsKKyAgICBlaV9zdGF0dXMuYmlnZW5kaWFuID0gMTsKKworICAgIGVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZSArIFRYX1BBR0VTOworCisgICAgZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmaHlkcmFfcmVzZXRfODM5MDsKKyAgICBlaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmaHlkcmFfYmxvY2tfaW5wdXQ7CisgICAgZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZoeWRyYV9ibG9ja19vdXRwdXQ7CisgICAgZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZoeWRyYV9nZXRfODM5MF9oZHI7CisgICAgZWlfc3RhdHVzLnJlZ19vZmZzZXQgPSBoeWRyYV9vZmZzZXRzOworICAgIGRldi0+b3BlbiA9ICZoeWRyYV9vcGVuOworICAgIGRldi0+c3RvcCA9ICZoeWRyYV9jbG9zZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorICAgIGRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCisgICAgTlM4MzkwX2luaXQoZGV2LCAwKTsKKworICAgIGVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworICAgIGlmIChlcnIpIHsKKwlmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGRldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gZXJyOworICAgIH0KKworICAgIHpvcnJvX3NldF9kcnZkYXRhKHosIGRldik7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogSHlkcmEgYXQgMHglMDhseCwgYWRkcmVzcyAiCisJICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IChoeWRyYS5jICIgSFlEUkFfVkVSU0lPTiAiKVxuIiwKKwkgICBkZXYtPm5hbWUsIHotPnJlc291cmNlLnN0YXJ0LCBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLAorCSAgIGRldi0+ZGV2X2FkZHJbMl0sIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sCisJICAgZGV2LT5kZXZfYWRkcls1XSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoeWRyYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgZWlfb3BlbihkZXYpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh5ZHJhX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaWYgKGVpX2RlYnVnID4gMSkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKyAgICBlaV9jbG9zZShkZXYpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoeWRyYV9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiSHlkcmEgaHcgcmVzZXQgbm90IHRoZXJlXG4iKTsKK30KKworc3RhdGljIHZvaWQgaHlkcmFfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKyAgICBpbnQgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzaG9ydCAqcHRyczsKKyAgICB1bnNpZ25lZCBsb25nIGhkcl9zdGFydD0gKG5pY19iYXNlLUhZRFJBX05JQ19CQVNFKSArCisJCQkgICAgICgocmluZ19wYWdlIC0gTkVTTV9TVEFSVF9QRyk8PDgpOworICAgIHB0cnMgPSAoc2hvcnQgKiloZHI7CisKKyAgICAqKHB0cnMrKykgPSB6X3JlYWR3KGhkcl9zdGFydCk7CisgICAgKigoc2hvcnQgKiloZHIpID0gV09SRFNXQVAoKigoc2hvcnQgKiloZHIpKTsKKyAgICBoZHJfc3RhcnQgKz0gMjsKKyAgICAqKHB0cnMrKykgPSB6X3JlYWR3KGhkcl9zdGFydCk7CisgICAgKigoc2hvcnQgKiloZHIrMSkgPSBXT1JEU1dBUCgqKChzaG9ydCAqKWhkcisxKSk7Cit9CisKK3N0YXRpYyB2b2lkIGh5ZHJhX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdW5zaWduZWQgbG9uZyBtZW1fYmFzZSA9IG5pY19iYXNlIC0gSFlEUkFfTklDX0JBU0U7CisgICAgdW5zaWduZWQgbG9uZyB4ZmVyX3N0YXJ0ID0gbWVtX2Jhc2UgKyByaW5nX29mZnNldCAtIChORVNNX1NUQVJUX1BHPDw4KTsKKworICAgIGlmIChjb3VudCYxKQorCWNvdW50Kys7CisKKyAgICBpZiAoeGZlcl9zdGFydCtjb3VudCA+ICBtZW1fYmFzZSArIChORVNNX1NUT1BfUEc8PDgpKSB7CisJaW50IHNlbWlfY291bnQgPSAobWVtX2Jhc2UgKyAoTkVTTV9TVE9QX1BHPDw4KSkgLSB4ZmVyX3N0YXJ0OworCisJel9tZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSx4ZmVyX3N0YXJ0LHNlbWlfY291bnQpOworCWNvdW50IC09IHNlbWlfY291bnQ7CisJel9tZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YStzZW1pX2NvdW50LCBtZW1fYmFzZSwgY291bnQpOworICAgIH0gZWxzZQorCXpfbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIHhmZXJfc3RhcnQsY291bnQpOworCit9CisKK3N0YXRpYyB2b2lkIGh5ZHJhX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdW5zaWduZWQgbG9uZyBtZW1fYmFzZSA9IG5pY19iYXNlIC0gSFlEUkFfTklDX0JBU0U7CisKKyAgICBpZiAoY291bnQmMSkKKwljb3VudCsrOworCisgICAgel9tZW1jcHlfdG9pbyhtZW1fYmFzZSsoKHN0YXJ0X3BhZ2UgLSBORVNNX1NUQVJUX1BHKTw8OCksIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaHlkcmFfcmVtb3ZlX29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6KQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB6b3Jyb19nZXRfZHJ2ZGF0YSh6KTsKKworICAgIHVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBkZXYpOworICAgIHJlbGVhc2VfbWVtX3JlZ2lvbihaVFdPX1BBRERSKGRldi0+YmFzZV9hZGRyKS1IWURSQV9OSUNfQkFTRSwgMHgxMDAwMCk7CisgICAgZnJlZV9uZXRkZXYoZGV2KTsKK30KKworc3RhdGljIGludCBfX2luaXQgaHlkcmFfaW5pdF9tb2R1bGUodm9pZCkKK3sKKyAgICByZXR1cm4gem9ycm9fbW9kdWxlX2luaXQoJmh5ZHJhX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoeWRyYV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworICAgIHpvcnJvX3VucmVnaXN0ZXJfZHJpdmVyKCZoeWRyYV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChoeWRyYV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChoeWRyYV9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2h5ZHJhLmggYi9kcml2ZXJzL25ldC9oeWRyYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NDE0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oeWRyYS5oCkBAIC0wLDAgKzEsMTc3IEBACisvKgkkTGludXg6IGh5ZHJhLmgsdiAxLjAgMTk5NC8xMC8yNiAwMjowMzo0NyBjZ2QgRXhwICQJKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NCBUaW1vIFJvc3NpCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgIFRpbW8gUm9zc2kKKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFRoZSBIeWRyYSBTeXN0ZW1zIGNhcmQgdXNlcyB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcgorICogODM5MCBOSUMgKE5ldHdvcmsgSW50ZXJmYWNlIENvbnRyb2xsZXIpIGNoaXAsIGxvY2F0ZWQKKyAqIGF0IGNhcmQgYmFzZSBhZGRyZXNzICsgMHhmZmUxLiBOSUMgcmVnaXN0ZXJzIGFyZSBhY2Nlc3NpYmxlCisgKiBvbmx5IGF0IG9kZCBieXRlIGFkZHJlc3Nlcywgc28gdGhlIHJlZ2lzdGVyIG9mZnNldHMgbXVzdAorICogYmUgbXVsdGlwbGllZCBieSB0d28uCisgKgorICogQ2FyZCBhZGRyZXNzIFBST00gaXMgbG9jYXRlZCBhdCBjYXJkIGJhc2UgKyAweGZmYzAgKGV2ZW4gYnl0ZSBhZGRyZXNzZXMpCisgKgorICogUkFNIHN0YXJ0cyBhdCB0aGUgY2FyZCBiYXNlIGFkZHJlc3MsIGFuZCBpcyAxNksgb3IgNjRLLgorICogVGhlIGN1cnJlbnQgQW1pZ2EgTmV0QlNEIGh5ZHJhIGRyaXZlciBpcyBoYXJkd2lyZWQgZm9yIDE2Sy4KKyAqIEl0IHNlZW1zIHRoYXQgdGhlIFJBTSBzaG91bGQgYmUgYWNjZXNzZWQgYXMgd29yZHMgb3IgbG9uZ3dvcmRzIG9ubHkuCisgKgorICovCisKKy8qIGFkYXB0ZWQgZm9yIExpbnV4IGJ5IFRvcGkgS2FuZXJ2YSAwMy8yOS85NQorICAgd2l0aCBvcmlnaW5hbCBhdXRob3IncyBwZXJtaXNzaW9uICAgICAgICAgICovCisKKyNkZWZpbmUgSFlEUkFfTklDX0JBU0UgMHhmZmUxCisKKy8qIFBhZ2UwIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIE5JQ19DUiAgICAgMCAgICAgICAvKiBDb21tYW5kIHJlZ2lzdGVyICAgKi8KKyNkZWZpbmUgTklDX1BTVEFSVCAoMSoyKSAgIC8qIFBhZ2Ugc3RhcnQgKHdyaXRlKSAqLworI2RlZmluZSBOSUNfUFNUT1AgICgyKjIpICAgLyogUGFnZSBzdG9wICh3cml0ZSkgICovCisjZGVmaW5lIE5JQ19CTkRSWSAgKDMqMikgICAvKiBCb3VuZGFyeSBwb2ludGVyICAgKi8KKyNkZWZpbmUgTklDX1RTUiAgICAoNCoyKSAgIC8qIFRyYW5zbWl0IHN0YXR1cyAocmVhZCkgKi8KKyNkZWZpbmUgTklDX1RQU1IgICAoNCoyKSAgIC8qIFRyYW5zbWl0IHBhZ2Ugc3RhcnQgKHdyaXRlKSAqLworI2RlZmluZSBOSUNfTkNSICAgICg1KjIpICAgLyogTnVtYmVyIG9mIGNvbGxpc2lvbnMsIHJlYWQgICovCisjZGVmaW5lIE5JQ19UQkNSMCAgKDUqMikgICAvKiBUcmFuc21pdCBieXRlIGNvdW50IGxvdyAod3JpdGUpICAqLworI2RlZmluZSBOSUNfRklGTyAgICg2KjIpICAgLyogRklGTyByZWcuIChyZWFkKSAgICovCisjZGVmaW5lIE5JQ19UQkNSMSAgKDYqMikgICAvKiBUcmFuc21pdCBieXRlIGNvdW50IGhpZ2ggKHdyaXRlKSAqLworI2RlZmluZSBOSUNfSVNSICAgICg3KjIpICAgLyogSW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBOSUNfUkJDUjAgICgweGEqMikgLyogUmVtb3RlIGJ5dGUgY291bnQgbG93ICh3cml0ZSkgICovCisjZGVmaW5lIE5JQ19SQkNSMSAgKDB4YioyKSAvKiBSZW1vdGUgYnl0ZSBjb3VudCBoaWdoICh3cml0ZSkgKi8KKyNkZWZpbmUgTklDX1JTUiAgICAoMHhjKjIpIC8qIFJlY2VpdmUgc3RhdHVzIChyZWFkKSAgKi8KKyNkZWZpbmUgTklDX1JDUiAgICAoMHhjKjIpIC8qIFJlY2VpdmUgY29uZmlnICh3cml0ZSkgKi8KKyNkZWZpbmUgTklDX0NOVFIwICAoMHhkKjIpIC8qIEZyYW1lIGFsaWdubWVudCBlcnJvciBjb3VudCAocmVhZCkgKi8KKyNkZWZpbmUgTklDX1RDUiAgICAoMHhkKjIpIC8qIFRyYW5zbWl0IGNvbmZpZyAod3JpdGUpICAqLworI2RlZmluZSBOSUNfQ05UUjEgICgweGUqMikgLyogQ1JDIGVycm9yIGNvdW50ZXIgKHJlYWQpICovCisjZGVmaW5lIE5JQ19EQ1IgICAgKDB4ZSoyKSAvKiBEYXRhIGNvbmZpZyAod3JpdGUpICovCisjZGVmaW5lIE5JQ19DTlRSMiAgKDB4ZioyKSAvKiBtaXNzZWQgcGFja2V0IGNvdW50ZXIgKHJlYWQpICovCisjZGVmaW5lIE5JQ19JTVIgICAgKDB4ZioyKSAvKiBJbnRlcnJ1cHQgbWFzayByZWcuICh3cml0ZSkgICovCisKKy8qIFBhZ2UxIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIE5JQ19QQVIwICAgKDEqMikgICAvKiBQaHlzaWNhbCBhZGRyZXNzICovCisjZGVmaW5lIE5JQ19QQVIxICAgKDIqMikKKyNkZWZpbmUgTklDX1BBUjIgICAoMyoyKQorI2RlZmluZSBOSUNfUEFSMyAgICg0KjIpCisjZGVmaW5lIE5JQ19QQVI0ICAgKDUqMikKKyNkZWZpbmUgTklDX1BBUjUgICAoNioyKQorI2RlZmluZSBOSUNfQ1VSUiAgICg3KjIpICAgLyogQ3VycmVudCBSWCByaW5nLWJ1ZmZlciBwYWdlICovCisjZGVmaW5lIE5JQ19NQVIwICAgKDgqMikgICAvKiBNdWx0aWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBOSUNfTUFSMSAgICg5KjIpCisjZGVmaW5lIE5JQ19NQVIyICAgKDB4YSoyKQorI2RlZmluZSBOSUNfTUFSMyAgICgweGIqMikKKyNkZWZpbmUgTklDX01BUjQgICAoMHhjKjIpCisjZGVmaW5lIE5JQ19NQVI1ICAgKDB4ZCoyKQorI2RlZmluZSBOSUNfTUFSNiAgICgweGUqMikKKyNkZWZpbmUgTklDX01BUjcgICAoMHhmKjIpCisKKy8qIENvbW1hbmQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBDUl9TVE9QICAgMHgwMSAvKiBTdG9wIC0tIHNvZnR3YXJlIHJlc2V0IGNvbW1hbmQgKi8KKyNkZWZpbmUgQ1JfU1RBUlQgIDB4MDIgLyogU3RhcnQgKi8KKyNkZWZpbmUgQ1JfVFhQICAgMHgwNCAvKiBUcmFuc21pdCBwYWNrZXQgKi8KKworI2RlZmluZSBDUl9SRDAgICAgMHgwOCAvKiBSZW1vdGUgRE1BIGNtZCAqLworI2RlZmluZSBDUl9SRDEgICAgMHgxMAorI2RlZmluZSBDUl9SRDIgICAgMHgyMAorCisjZGVmaW5lIENSX05PRE1BICBDUl9SRDIKKworI2RlZmluZSBDUl9QUzAgICAgMHg0MCAvKiBQYWdlIHNlbGVjdCAqLworI2RlZmluZSBDUl9QUzEgICAgMHg4MAorCisjZGVmaW5lIENSX1BBR0UwICAwCisjZGVmaW5lIENSX1BBR0UxICBDUl9QUzAKKyNkZWZpbmUgQ1JfUEFHRTIgIENSX1BTMQorCisvKiBJbnRlcnJ1cHQgc3RhdHVzIHJlZy4gZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBJU1JfUFJYICAgMHgwMSAvKiBQYWNrZXQgcmVjZWl2ZWQgd2l0aG91dCBlcnJvcnMgKi8KKyNkZWZpbmUgSVNSX1BUWCAgIDB4MDIgLyogUGFja2V0IHRyYW5zbWl0dGVkIHdpdGhvdXQgZXJyb3JzICovCisjZGVmaW5lIElTUl9SWEUgICAweDA0IC8qIFJlY2VpdmUgZXJyb3IgICovCisjZGVmaW5lIElTUl9UWEUgICAweDA4IC8qIFRyYW5zbWl0IGVycm9yICovCisjZGVmaW5lIElTUl9PVlcgICAweDEwIC8qIFJpbmcgYnVmZmVyIG92ZXJydW4gKi8KKyNkZWZpbmUgSVNSX0NOVCAgIDB4MjAgLyogQ291bnRlciBvdmVyZmxvdyAgICAqLworI2RlZmluZSBJU1JfUkRDICAgMHg0MCAvKiBSZW1vdGUgRE1BIGNvbXBpbGUgKi8KKyNkZWZpbmUgSVNSX1JTVCAgIDB4ODAgLyogUmVzZXQgc3RhdHVzICAgICAgKi8KKworLyogRGF0YSBjb25maWcgcmVnLiBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIERDUl9XVFMgICAweDAxIC8qIFdvcmQgdHJhbnNmZXIgc2VsZWN0ICAqLworI2RlZmluZSBEQ1JfQk9TICAgMHgwMiAvKiBCeXRlIG9yZGVyIHNlbGVjdCAgICAgKi8KKyNkZWZpbmUgRENSX0xBUyAgIDB4MDQgLyogTG9uZyBhZGRyZXNzIHNlbGVjdCAgICovCisjZGVmaW5lIERDUl9MUyAgICAweDA4IC8qIExvb3BiYWNrIHNlbGVjdCAgICAgICAqLworI2RlZmluZSBEQ1JfQVIgICAgMHgxMCAvKiBBdXRvLWluaXQgcmVtb3RlICAgICAgKi8KKyNkZWZpbmUgRENSX0ZUMCAgIDB4MjAgLyogRklGTyB0aHJlc2hvbGQgc2VsZWN0ICovCisjZGVmaW5lIERDUl9GVDEgICAweDQwCisKKy8qIFRyYW5zbWl0IGNvbmZpZyByZWcuIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgVENSX0NSQyAgMHgwMSAvKiBJbmhpYml0IENSQyAqLworI2RlZmluZSBUQ1JfTEIwICAweDAyIC8qIExvb3BiYWNrIGNvbnRyb2wgKi8KKyNkZWZpbmUgVENSX0xCMSAgMHgwNAorI2RlZmluZSBUQ1JfQVREICAweDA4IC8qIEF1dG8gdHJhbnNtaXQgZGlzYWJsZSAqLworI2RlZmluZSBUQ1JfT0ZTVCAweDEwIC8qIENvbGxpc2lvbiBvZmZzZXQgZW5hYmxlICovCisKKy8qIFRyYW5zbWl0IHN0YXR1cyByZWcuIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgVFNSX1BUWCAgMHgwMSAvKiBQYWNrZXQgdHJhbnNtaXR0ZWQgKi8KKyNkZWZpbmUgVFNSX0NPTCAgMHgwNCAvKiBUcmFuc21pdCBjb2xsaWRlZCAqLworI2RlZmluZSBUU1JfQUJUICAweDA4IC8qIFRyYW5zbWl0IGFib3J0ZWQgKi8KKyNkZWZpbmUgVFNSX0NSUyAgMHgxMCAvKiBDYXJyaWVyIHNlbnNlIGxvc3QgKi8KKyNkZWZpbmUgVFNSX0ZVICAgMHgyMCAvKiBGSUZPIHVuZGVycnVuICovCisjZGVmaW5lIFRTUl9DREggIDB4NDAgLyogQ0QgSGVhcnRiZWF0ICovCisjZGVmaW5lIFRTUl9PV0MgIDB4ODAgLyogT3V0IG9mIFdpbmRvdyBDb2xsaXNpb24gKi8KKworLyogUmVjZWl2ZXIgY29uZmlnIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgUkNSX1NFUCAgMHgwMSAvKiBTYXZlIGVycm9yZWQgcGFja2V0cyAqLworI2RlZmluZSBSQ1JfQVIgICAweDAyIC8qIEFjY2VwdCBydW50IHBhY2tldHMgKi8KKyNkZWZpbmUgUkNSX0FCICAgMHgwNCAvKiBBY2NlcHQgYnJvYWRjYXN0ICovCisjZGVmaW5lIFJDUl9BTSAgIDB4MDggLyogQWNjZXB0IG11bHRpY2FzdCAqLworI2RlZmluZSBSQ1JfUFJPICAweDEwIC8qIFByb21pc2N1b3VzIG1vZGUgKi8KKyNkZWZpbmUgUkNSX01PTiAgMHgyMCAvKiBNb25pdG9yIG1vZGUgKi8KKworLyogUmVjZWl2ZXIgc3RhdHVzIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgUlNSX1BSWCAgMHgwMSAvKiBQYWNrZXQgcmVjZWl2ZWQgd2l0aG91dCBlcnJvciAqLworI2RlZmluZSBSU1JfQ1JDICAweDAyIC8qIENSQyBlcnJvciAqLworI2RlZmluZSBSU1JfRkFFICAweDA0IC8qIEZyYW1lIGFsaWdubWVudCBlcnJvciAqLworI2RlZmluZSBSU1JfRk8gICAweDA4IC8qIEZJRk8gb3ZlcnJ1biAqLworI2RlZmluZSBSU1JfTVBBICAweDEwIC8qIE1pc3NlZCBwYWNrZXQgKi8KKyNkZWZpbmUgUlNSX1BIWSAgMHgyMCAvKiBQaHlzaWNhbCBhZGRyZXNzICovCisjZGVmaW5lIFJTUl9ESVMgIDB4NDAgLyogUmVjZWl2ZWQgZGlzYWJsZWQgKi8KKyNkZWZpbmUgUlNSX0RGUiAgMHg4MCAvKiBEZWZlcnJpbmcgKGphYmJlcikgKi8KKworLyogSHlkcmEgU3lzdGVtIGNhcmQgYWRkcmVzcyBQUk9NIG9mZnNldCAqLworCisjZGVmaW5lIEhZRFJBX0FERFJQUk9NIDB4ZmZjMAorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libV9lbWFjL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1ODNhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBJQk0gUFBDNHh4IEVNQUMgY29udHJvbGxlcnMKKyMKKworb2JqLSQoQ09ORklHX0lCTV9FTUFDKSArPSBpYm1fZW1hYy5vCisKK2libV9lbWFjLW9ianMgOj0gaWJtX2VtYWNfbWFsLm8gaWJtX2VtYWNfY29yZS5vIGlibV9lbWFjX3BoeS5vCisKKyMgT25seSBuZWVkIHRoaXMgaWYgeW91IHdhbnQgdG8gc2VlIGFkZGl0aW9uYWwgZGVidWcgbWVzc2FnZXMKK2lmZXEgKCQoQ09ORklHX0lCTV9FTUFDX0VSUk1TRyksIHkpCitpYm1fZW1hYy1vYmpzICs9IGlibV9lbWFjX2RlYnVnLm8KK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hYy5oIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWQ1YTBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWMuaApAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIGlibV9lbWFjLmgKKyAqCisgKgorICogICAgICBBcm1pbiBLdXN0ZXIgYWt1c3RlckBtdmlzdGEuY29tCisgKiAgICAgIEp1bmUsIDIwMDIKKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBNb250YVZpc3RhIFNvZnRhcmUgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfSUJNX0VNQUNfSF8KKyNkZWZpbmUgX0lCTV9FTUFDX0hfCisvKiBHZW5lcmFsIGRlZmluZXMgbmVlZGVkIGZvciB0aGUgZHJpdmVyICovCisKKy8qIEVtYWMgKi8KK3R5cGVkZWYgc3RydWN0IGVtYWNfcmVncyB7CisJdTMyIGVtMG1yMDsKKwl1MzIgZW0wbXIxOworCXUzMiBlbTB0bXIwOworCXUzMiBlbTB0bXIxOworCXUzMiBlbTBybXI7CisJdTMyIGVtMGlzcjsKKwl1MzIgZW0waXNlcjsKKwl1MzIgZW0waWFocjsKKwl1MzIgZW0waWFscjsKKwl1MzIgZW0wdnRwaWQ7CisJdTMyIGVtMHZ0Y2k7CisJdTMyIGVtMHB0cjsKKwl1MzIgZW0waWFodDE7CisJdTMyIGVtMGlhaHQyOworCXUzMiBlbTBpYWh0MzsKKwl1MzIgZW0waWFodDQ7CisJdTMyIGVtMGdhaHQxOworCXUzMiBlbTBnYWh0MjsKKwl1MzIgZW0wZ2FodDM7CisJdTMyIGVtMGdhaHQ0OworCXUzMiBlbTBsc2FoOworCXUzMiBlbTBsc2FsOworCXUzMiBlbTBpcGd2cjsKKwl1MzIgZW0wc3RhY3I7CisJdTMyIGVtMHRydHI7CisJdTMyIGVtMHJ3bXI7Cit9IGVtYWNfdDsKKworLyogTU9ERSBSRUcgMCAqLworI2RlZmluZSBFTUFDX00wX1JYSQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgRU1BQ19NMF9UWEkJCQkweDQwMDAwMDAwCisjZGVmaW5lIEVNQUNfTTBfU1JTVAkJCTB4MjAwMDAwMDAKKyNkZWZpbmUgRU1BQ19NMF9UWEUJCQkweDEwMDAwMDAwCisjZGVmaW5lIEVNQUNfTTBfUlhFCQkJMHgwODAwMDAwMAorI2RlZmluZSBFTUFDX00wX1dLRQkJCTB4MDQwMDAwMDAKKworLyogTU9ERSBSZWcgMSAqLworI2RlZmluZSBFTUFDX00xX0ZERQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgRU1BQ19NMV9JTEUJCQkweDQwMDAwMDAwCisjZGVmaW5lIEVNQUNfTTFfVkxFCQkJMHgyMDAwMDAwMAorI2RlZmluZSBFTUFDX00xX0VJRkMJCQkweDEwMDAwMDAwCisjZGVmaW5lIEVNQUNfTTFfQVBQCQkJMHgwODAwMDAwMAorI2RlZmluZSBFTUFDX00xX0FFTUkJCQkweDAyMDAwMDAwCisjZGVmaW5lIEVNQUNfTTFfSVNUCQkJMHgwMTAwMDAwMAorI2RlZmluZSBFTUFDX00xX01GXzEwMDBHUENTCQkweDAwYzAwMDAwCS8qIEludGVybmFsIEdQQ1MgKi8KKyNkZWZpbmUgRU1BQ19NMV9NRl8xMDAwTUJQUwkJMHgwMDgwMDAwMAkvKiBFeHRlcm5hbCBHUENTICovCisjZGVmaW5lIEVNQUNfTTFfTUZfMTAwTUJQUwkJMHgwMDQwMDAwMAorI2RlZmluZSBFTUFDX00xX1JGU18xNksgICAgICAgICAgICAgICAgIDB4MDAyODAwMDAJLyogMDAwIGZvciA1MTIgYnl0ZSAqLworI2RlZmluZSBFTUFDX00xX1RSCQkJMHgwMDAwODAwMAorI2lmZGVmIENPTkZJR19JQk1fRU1BQzQKKyNkZWZpbmUgRU1BQ19NMV9SRlNfOEsgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIEVNQUNfTTFfUkZTXzRLICAgICAgICAgICAgICAgICAgMHgwMDE4MDAwMAorI2RlZmluZSBFTUFDX00xX1JGU18ySyAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgRU1BQ19NMV9SRlNfMUsgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEVNQUNfTTFfVFhfRklGT18xNksgICAgICAgICAgICAgMHgwMDA1MDAwMAkvKiAwJ3MgZm9yIDUxMiBieXRlICovCisjZGVmaW5lIEVNQUNfTTFfVFhfRklGT184SyAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBFTUFDX00xX1RYX0ZJRk9fNEsgICAgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgRU1BQ19NMV9UWF9GSUZPXzJLICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEVNQUNfTTFfVFhfRklGT18xSyAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBFTUFDX00xX1RYX1RSICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgRU1BQ19NMV9UWF9NV1NXICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCS8qIDAgd2FpdCBmb3Igc3RhdHVzICovCisjZGVmaW5lIEVNQUNfTTFfSlVNQk9fRU5BQkxFICAgICAgICAgICAgMHgwMDAwMDgwMAkvKiBVcHQgdG8gOUtyIHN0YXR1cyAqLworI2RlZmluZSBFTUFDX00xX09QQl9DTEtfNjYgICAgICAgICAgICAgIDB4MDAwMDAwMDgJLyogNjZNaHogKi8KKyNkZWZpbmUgRU1BQ19NMV9PUEJfQ0xLXzgzICAgICAgICAgICAgICAweDAwMDAwMDEwCS8qIDgzTWh6ICovCisjZGVmaW5lIEVNQUNfTTFfT1BCX0NMS18xMDAgICAgICAgICAgICAgMHgwMDAwMDAxOAkvKiAxMDBNaHogKi8KKyNkZWZpbmUgRU1BQ19NMV9PUEJfQ0xLXzEwMFAgICAgICAgICAgICAweDAwMDAwMDIwCS8qIDEwME1oeisgKi8KKyNlbHNlCQkJCS8qIENPTkZJR19JQk1fRU1BQzQgKi8KKyNkZWZpbmUgRU1BQ19NMV9SRlNfNEsJCQkweDAwMzAwMDAwCS8qIH40ayBmb3IgNTEyIGJ5dGUgKi8KKyNkZWZpbmUgRU1BQ19NMV9SRlNfMksJCQkweDAwMjAwMDAwCisjZGVmaW5lIEVNQUNfTTFfUkZTXzFLCQkJMHgwMDEwMDAwMAorI2RlZmluZSBFTUFDX00xX1RYX0ZJRk9fMksJCTB4MDAwODAwMDAJLyogMCdzIGZvciA1MTIgYnl0ZSAqLworI2RlZmluZSBFTUFDX00xX1RYX0ZJRk9fMUsJCTB4MDAwNDAwMDAKKyNkZWZpbmUgRU1BQ19NMV9UUjBfREVQRU5ECQkweDAwMDEwMDAwCS8qIDAneCBmb3Igc2luZ2xlIHBhY2tldCAqLworI2RlZmluZSBFTUFDX00xX1RSMV9ERVBFTkQJCTB4MDAwMDQwMDAKKyNkZWZpbmUgRU1BQ19NMV9UUjFfTVVMVEkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgRU1BQ19NMV9KVU1CT19FTkFCTEUJCTB4MDAwMDEwMDAKKyNlbmRpZgkJCQkvKiBDT05GSUdfSUJNX0VNQUM0ICovCisjZGVmaW5lIEVNQUNfTTFfQkFTRQkJCShFTUFDX00xX1RYX0ZJRk9fMksgfCBcCisJCQkJCUVNQUNfTTFfQVBQIHwgXAorCQkJCQlFTUFDX00xX1RSIHwgRU1BQ19NMV9WTEUpCisKKy8qIFRyYW5zbWl0IE1vZGUgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBFTUFDX1RNUjBfR05QMAkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgRU1BQ19UTVIwX0dOUDEJCQkweDQwMDAwMDAwCisjZGVmaW5lIEVNQUNfVE1SMF9HTlBECQkJMHgyMDAwMDAwMAorI2RlZmluZSBFTUFDX1RNUjBfRkMJCQkweDEwMDAwMDAwCisjZGVmaW5lIEVNQUNfVE1SMF9URkFFXzJfMzIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRU1BQ19UTVIwX1RGQUVfNF82NAkJMHgwMDAwMDAwMgorI2RlZmluZSBFTUFDX1RNUjBfVEZBRV84XzEyOAkJMHgwMDAwMDAwMworI2RlZmluZSBFTUFDX1RNUjBfVEZBRV8xNl8yNTYJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRU1BQ19UTVIwX1RGQUVfMzJfNTEyCQkweDAwMDAwMDA1CisjZGVmaW5lIEVNQUNfVE1SMF9URkFFXzY0XzEwMjQJCTB4MDAwMDAwMDYKKyNkZWZpbmUgRU1BQ19UTVIwX1RGQUVfMTI4XzIwNDgJCTB4MDAwMDAwMDcKKworLyogUmVjZWl2ZSBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIEVNQUNfUk1SX1NQCQkJMHg4MDAwMDAwMAorI2RlZmluZSBFTUFDX1JNUl9TRkNTCQkJMHg0MDAwMDAwMAorI2RlZmluZSBFTUFDX1JNUl9BUlJQCQkJMHgyMDAwMDAwMAorI2RlZmluZSBFTUFDX1JNUl9BUlAJCQkweDEwMDAwMDAwCisjZGVmaW5lIEVNQUNfUk1SX0FST1AJCQkweDA4MDAwMDAwCisjZGVmaW5lIEVNQUNfUk1SX0FSUEkJCQkweDA0MDAwMDAwCisjZGVmaW5lIEVNQUNfUk1SX1BQUAkJCTB4MDIwMDAwMDAKKyNkZWZpbmUgRU1BQ19STVJfUE1FCQkJMHgwMTAwMDAwMAorI2RlZmluZSBFTUFDX1JNUl9QTU1FCQkJMHgwMDgwMDAwMAorI2RlZmluZSBFTUFDX1JNUl9JQUUJCQkweDAwNDAwMDAwCisjZGVmaW5lIEVNQUNfUk1SX01JQUUJCQkweDAwMjAwMDAwCisjZGVmaW5lIEVNQUNfUk1SX0JBRQkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgRU1BQ19STVJfTUFFCQkJMHgwMDA4MDAwMAorI2RlZmluZSBFTUFDX1JNUl9SRkFGXzJfMzIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRU1BQ19STVJfUkZBRl80XzY0CQkweDAwMDAwMDAyCisjZGVmaW5lIEVNQUNfUk1SX1JGQUZfOF8xMjgJCTB4MDAwMDAwMDMKKyNkZWZpbmUgRU1BQ19STVJfUkZBRl8xNl8yNTYJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRU1BQ19STVJfUkZBRl8zMl81MTIJCTB4MDAwMDAwMDUKKyNkZWZpbmUgRU1BQ19STVJfUkZBRl82NF8xMDI0CQkweDAwMDAwMDA2CisjZGVmaW5lIEVNQUNfUk1SX1JGQUZfMTI4XzIwNDgJCTB4MDAwMDAwMDcKKyNkZWZpbmUgRU1BQ19STVJfQkFTRQkJCShFTUFDX1JNUl9JQUUgfCBFTUFDX1JNUl9CQUUpCisKKy8qIEludGVycnVwdCBTdGF0dXMgJiBlbmFibGUgUmVncyAqLworI2RlZmluZSBFTUFDX0lTUl9PVlIJCQkweDAyMDAwMDAwCisjZGVmaW5lIEVNQUNfSVNSX1BQCQkJMHgwMTAwMDAwMAorI2RlZmluZSBFTUFDX0lTUl9CUAkJCTB4MDA4MDAwMDAKKyNkZWZpbmUgRU1BQ19JU1JfUlAJCQkweDAwNDAwMDAwCisjZGVmaW5lIEVNQUNfSVNSX1NFCQkJMHgwMDIwMDAwMAorI2RlZmluZSBFTUFDX0lTUl9BTEUJCQkweDAwMTAwMDAwCisjZGVmaW5lIEVNQUNfSVNSX0JGQ1MJCQkweDAwMDgwMDAwCisjZGVmaW5lIEVNQUNfSVNSX1BUTEUJCQkweDAwMDQwMDAwCisjZGVmaW5lIEVNQUNfSVNSX09SRQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgRU1BQ19JU1JfSVJFCQkJMHgwMDAxMDAwMAorI2RlZmluZSBFTUFDX0lTUl9EQkRNCQkJMHgwMDAwMDIwMAorI2RlZmluZSBFTUFDX0lTUl9EQjAJCQkweDAwMDAwMTAwCisjZGVmaW5lIEVNQUNfSVNSX1NFMAkJCTB4MDAwMDAwODAKKyNkZWZpbmUgRU1BQ19JU1JfVEUwCQkJMHgwMDAwMDA0MAorI2RlZmluZSBFTUFDX0lTUl9EQjEJCQkweDAwMDAwMDIwCisjZGVmaW5lIEVNQUNfSVNSX1NFMQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRU1BQ19JU1JfVEUxCQkJMHgwMDAwMDAwOAorI2RlZmluZSBFTUFDX0lTUl9NT1MJCQkweDAwMDAwMDAyCisjZGVmaW5lIEVNQUNfSVNSX01PRgkJCTB4MDAwMDAwMDEKKworLyogU1RBIENPTlRST0wgUkVHICovCisjZGVmaW5lIEVNQUNfU1RBQ1JfT0MJCQkweDAwMDA4MDAwCisjZGVmaW5lIEVNQUNfU1RBQ1JfUEhZRQkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgRU1BQ19TVEFDUl9XUklURQkJMHgwMDAwMjAwMAorI2RlZmluZSBFTUFDX1NUQUNSX1JFQUQJCQkweDAwMDAxMDAwCisjZGVmaW5lIEVNQUNfU1RBQ1JfQ0xLXzgzTUhaCQkweDAwMDAwODAwCS8qIDAncyBmb3IgNTBNaHogKi8KKyNkZWZpbmUgRU1BQ19TVEFDUl9DTEtfNjZNSFoJCTB4MDAwMDA0MDAKKyNkZWZpbmUgRU1BQ19TVEFDUl9DTEtfMTAwTUhaCQkweDAwMDAwQzAwCisKKy8qIFRyYW5zbWl0IFJlcXVlc3QgVGhyZXNob2xkIFJlZ2lzdGVyICovCisjZGVmaW5lIEVNQUNfVFJUUl8xNjAwCQkJMHgxODAwMDAwMAkvKiAwJ3MgZm9yIDY0IEJ5dGVzICovCisjZGVmaW5lIEVNQUNfVFJUUl8xMDI0CQkJMHgwZjAwMDAwMAorI2RlZmluZSBFTUFDX1RSVFJfNTEyCQkJMHgwNzAwMDAwMAorI2RlZmluZSBFTUFDX1RSVFJfMjU2CQkJMHgwMzAwMDAwMAorI2RlZmluZSBFTUFDX1RSVFJfMTkyCQkJMHgxMDAwMDAwMAorI2RlZmluZSBFTUFDX1RSVFJfMTI4CQkJMHgwMTAwMDAwMAorCisjZGVmaW5lIEVNQUNfVFhfQ1RSTF9HRkNTCQkweDAyMDAKKyNkZWZpbmUgRU1BQ19UWF9DVFJMX0dQCQkJMHgwMTAwCisjZGVmaW5lIEVNQUNfVFhfQ1RSTF9JU0EJCTB4MDA4MAorI2RlZmluZSBFTUFDX1RYX0NUUkxfUlNBCQkweDAwNDAKKyNkZWZpbmUgRU1BQ19UWF9DVFJMX0lWVAkJMHgwMDIwCisjZGVmaW5lIEVNQUNfVFhfQ1RSTF9SVlQJCTB4MDAxMAorI2RlZmluZSBFTUFDX1RYX0NUUkxfVEFIX0NTVU0JCTB4MDAwZQkvKiBUQUggb25seSAqLworI2RlZmluZSBFTUFDX1RYX0NUUkxfVEFIX1NFRzQJCTB4MDAwYQkvKiBUQUggb25seSAqLworI2RlZmluZSBFTUFDX1RYX0NUUkxfVEFIX1NFRzMJCTB4MDAwOAkvKiBUQUggb25seSAqLworI2RlZmluZSBFTUFDX1RYX0NUUkxfVEFIX1NFRzIJCTB4MDAwNgkvKiBUQUggb25seSAqLworI2RlZmluZSBFTUFDX1RYX0NUUkxfVEFIX1NFRzEJCTB4MDAwNAkvKiBUQUggb25seSAqLworI2RlZmluZSBFTUFDX1RYX0NUUkxfVEFIX1NFRzAJCTB4MDAwMgkvKiBUQUggb25seSAqLworI2RlZmluZSBFTUFDX1RYX0NUUkxfVEFIX0RJUwkJMHgwMDAwCS8qIFRBSCBvbmx5ICovCisKKyNkZWZpbmUgRU1BQ19UWF9DVFJMX0RGTFQgKCBcCisJTUFMX1RYX0NUUkxfSU5UUiB8IEVNQUNfVFhfQ1RSTF9HRkNTIHwgRU1BQ19UWF9DVFJMX0dQICkKKworLyogbWFkbWFsIHRyYW5zbWl0IHN0YXR1cyAvIENvbnRyb2wgYml0cyAqLworI2RlZmluZSBFTUFDX1RYX1NUX0JGQ1MJCQkweDAyMDAKKyNkZWZpbmUgRU1BQ19UWF9TVF9CUFAJCQkweDAxMDAKKyNkZWZpbmUgRU1BQ19UWF9TVF9MQ1MJCQkweDAwODAKKyNkZWZpbmUgRU1BQ19UWF9TVF9FRAkJCTB4MDA0MAorI2RlZmluZSBFTUFDX1RYX1NUX0VDCQkJMHgwMDIwCisjZGVmaW5lIEVNQUNfVFhfU1RfTEMJCQkweDAwMTAKKyNkZWZpbmUgRU1BQ19UWF9TVF9NQwkJCTB4MDAwOAorI2RlZmluZSBFTUFDX1RYX1NUX1NDCQkJMHgwMDA0CisjZGVmaW5lIEVNQUNfVFhfU1RfVVIJCQkweDAwMDIKKyNkZWZpbmUgRU1BQ19UWF9TVF9TUUUJCQkweDAwMDEKKworLyogbWFkbWFsIHJlY2VpdmUgc3RhdHVzIC8gQ29udHJvbCBiaXRzICovCisjZGVmaW5lIEVNQUNfUlhfU1RfT0UJCQkweDAyMDAKKyNkZWZpbmUgRU1BQ19SWF9TVF9QUAkJCTB4MDEwMAorI2RlZmluZSBFTUFDX1JYX1NUX0JQCQkJMHgwMDgwCisjZGVmaW5lIEVNQUNfUlhfU1RfUlAJCQkweDAwNDAKKyNkZWZpbmUgRU1BQ19SWF9TVF9TRQkJCTB4MDAyMAorI2RlZmluZSBFTUFDX1JYX1NUX0FFCQkJMHgwMDEwCisjZGVmaW5lIEVNQUNfUlhfU1RfQkZDUwkJCTB4MDAwOAorI2RlZmluZSBFTUFDX1JYX1NUX1BUTAkJCTB4MDAwNAorI2RlZmluZSBFTUFDX1JYX1NUX09SRQkJCTB4MDAwMgorI2RlZmluZSBFTUFDX1JYX1NUX0lSRQkJCTB4MDAwMQorI2RlZmluZSBFTUFDX0JBRF9SWF9QQUNLRVQJCTB4MDJmZgorI2RlZmluZSBFTUFDX0NTVU1fVkVSX0VSUk9SCQkweDAwMDMKKworLyogaWRlbnRpZnkgYSBiYWQgcnggcGFja2V0IGRlcGVuZGVudCBvbiBlbWFjIGZlYXR1cmVzICovCisjaWZkZWYgQ09ORklHX0lCTV9FTUFDNAorI2RlZmluZSBFTUFDX0lTX0JBRF9SWF9QQUNLRVQoZGVzYykgXAorCSgoKGRlc2MgJiAoRU1BQ19CQURfUlhfUEFDS0VUICYgfkVNQUNfQ1NVTV9WRVJfRVJST1IpKSB8fCBcCisJKChkZXNjICYgRU1BQ19DU1VNX1ZFUl9FUlJPUikgPT0gRU1BQ19SWF9TVF9PUkUpIHx8IFwKKwkoKGRlc2MgJiBFTUFDX0NTVU1fVkVSX0VSUk9SKSA9PSBFTUFDX1JYX1NUX0lSRSkpKQorI2Vsc2UKKyNkZWZpbmUgRU1BQ19JU19CQURfUlhfUEFDS0VUKGRlc2MpIFwKKwkgKGRlc2MgJiBFTUFDX0JBRF9SWF9QQUNLRVQpCisjZW5kaWYKKworLyogU29DIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIEVNQUMgcmVnaXN0ZXIgZGVmYXVsdHMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR180NDBHUCkKKyNkZWZpbmUgRU1BQ19SV01SX0RFRkFVTFQJCTB4ODAwMDkwMDAKKyNkZWZpbmUgRU1BQ19UTVIwX0RFRkFVTFQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRU1BQ19UTVIxX0RFRkFVTFQJCTB4Zjg2NDAwMDAKKyNlbGlmIGRlZmluZWQoQ09ORklHXzQ0MEdYKQorI2RlZmluZSBFTUFDX1JXTVJfREVGQVVMVAkJMHgxMDAwYTIwMAorI2RlZmluZSBFTUFDX1RNUjBfREVGQVVMVAkJRU1BQ19UTVIwX1RGQUVfMl8zMgorI2RlZmluZSBFTUFDX1RNUjFfREVGQVVMVAkJMHhhMDBmMDAwMAorI2VsaWYgZGVmaW5lZChDT05GSUdfNDQwU1ApCisjZGVmaW5lIEVNQUNfUldNUl9ERUZBVUxUCQkweDA4MDAyMDAwCisjZGVmaW5lIEVNQUNfVE1SMF9ERUZBVUxUCQlFTUFDX1RNUjBfVEZBRV8xMjhfMjA0OAorI2RlZmluZSBFTUFDX1RNUjFfREVGQVVMVAkJMHhmODIwMDAwMAorI2Vsc2UKKyNkZWZpbmUgRU1BQ19SV01SX0RFRkFVTFQJCTB4MGYwMDIwMDAKKyNkZWZpbmUgRU1BQ19UTVIwX0RFRkFVTFQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRU1BQ19UTVIxX0RFRkFVTFQJCTB4MzgwZjAwMDAKKyNlbmRpZgkJCQkvKiBDT05GSUdfNDQwR1AgKi8KKworLyogUmV2aXNpb24gc3BlY2lmaWMgRU1BQyByZWdpc3RlciBkZWZhdWx0cyAqLworI2lmZGVmIENPTkZJR19JQk1fRU1BQzQKKyNkZWZpbmUgRU1BQ19NMV9ERUZBVUxUCQkJKEVNQUNfTTFfQkFTRSB8IFwKKwkJCQkJRU1BQ19NMV9PUEJfQ0xLXzgzIHwgXAorCQkJCQlFTUFDX00xX1RYX01XU1cpCisjZGVmaW5lIEVNQUNfUk1SX0RFRkFVTFQJCShFTUFDX1JNUl9CQVNFIHwgXAorCQkJCQlFTUFDX1JNUl9SRkFGXzEyOF8yMDQ4KQorI2RlZmluZSBFTUFDX1RNUjBfWE1JVAkJCShFTUFDX1RNUjBfR05QMCB8IFwKKwkJCQkJRU1BQ19UTVIwX0RFRkFVTFQpCisjZGVmaW5lIEVNQUNfVFJUUl9ERUZBVUxUCQlFTUFDX1RSVFJfMTAyNAorI2Vsc2UJCQkJLyogIUNPTkZJR19JQk1fRU1BQzQgKi8KKyNkZWZpbmUgRU1BQ19NMV9ERUZBVUxUCQkJRU1BQ19NMV9CQVNFCisjZGVmaW5lIEVNQUNfUk1SX0RFRkFVTFQJCUVNQUNfUk1SX0JBU0UKKyNkZWZpbmUgRU1BQ19UTVIwX1hNSVQJCQlFTUFDX1RNUjBfR05QMAorI2RlZmluZSBFTUFDX1RSVFJfREVGQVVMVAkJRU1BQ19UUlRSXzE2MDAKKyNlbmRpZgkJCQkvKiBDT05GSUdfSUJNX0VNQUM0ICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfY29yZS5jIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDQzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmMKQEAgLTAsMCArMSwyMDEyIEBACisvKgorICogaWJtX2VtYWNfY29yZS5jCisgKgorICogRXRoZXJuZXQgZHJpdmVyIGZvciB0aGUgYnVpbHQgaW4gZXRoZXJuZXQgb24gdGhlIElCTSA0eHggUG93ZXJQQworICogcHJvY2Vzc29ycy4KKyAqIAorICogKGMpIDIwMDMgQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICoKKyAqIEJhc2VkIG9uIG9yaWdpbmFsIHdvcmsgYnkKKyAqCisgKiAgICAgIEFybWluIEt1c3RlciA8YWt1c3RlckBtdmlzdGEuY29tPgorICogCUpvaG5uaWUgUGV0ZXJzIDxqcGV0ZXJzQG12aXN0YS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRPRE8KKyAqICAgICAgIC0gQ2hlY2sgZm9yIHJhY2VzIGluIHRoZSAicmVtb3ZlIiBjb2RlIHBhdGgKKyAqICAgICAgIC0gQWRkIHNvbWUgUG93ZXIgTWFuYWdlbWVudCB0byB0aGUgTUFDIGFuZCB0aGUgUEhZCisgKiAgICAgICAtIEF1ZGl0IHJlbWFpbmluZyBvZiBub24tcmV3cml0dGVuIGNvZGUgKC0tQmVuSCkKKyAqICAgICAgIC0gQ2xlYW51cCBtZXNzYWdlIGRpc3BsYXkgdXNpbmcgbXNnbGV2ZWwgbWVjYW5pc20KKyAqICAgICAgIC0gQWRkcmVzcyBhbGwgZXJyYXRhCisgKiAgICAgICAtIEF1ZGl0IGFsbCByZWdpc3RlciB1cGRhdGUgcGF0aHMgdG8gZW5zdXJlIHRoZXkKKyAqICAgICAgICAgYXJlIGJlaW5nIHdyaXR0ZW4gcG9zdCBzb2Z0IHJlc2V0IGlmIHJlcXVpcmVkLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9vY3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgImlibV9lbWFjX2NvcmUuaCIKKworLy8jZGVmaW5lIE1ESU9fREVCVUcoZm10KSBwcmludGsgZm10CisjZGVmaW5lIE1ESU9fREVCVUcoZm10KQorCisvLyNkZWZpbmUgTElOS19ERUJVRyhmbXQpIHByaW50ayBmbXQKKyNkZWZpbmUgTElOS19ERUJVRyhmbXQpCisKKy8vI2RlZmluZSBQS1RfREVCVUcoZm10KSBwcmludGsgZm10CisjZGVmaW5lIFBLVF9ERUJVRyhmbXQpCisKKyNkZWZpbmUgRFJWX05BTUUgICAgICAgICJlbWFjIgorI2RlZmluZSBEUlZfVkVSU0lPTiAgICAgIjIuMCIKKyNkZWZpbmUgRFJWX0FVVEhPUiAgICAgICJCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+IgorI2RlZmluZSBEUlZfREVTQyAgICAgICAgIklCTSBFTUFDIEV0aGVybmV0IGRyaXZlciIKKworLyoKKyAqIFdoZW4gbWRpb19pZHggPj0gMCwgY29udGFpbnMgYSBsaXN0IG9mIGVtYWMgb2NwX2RldnMKKyAqIHRoYXQgaGF2ZSBoYWQgdGhlaXIgaW5pdGlhbGl6YXRpb24gZGVmZXJyZWQgdW50aWwgdGhlCisgKiBjb21tb24gTURJTyBjb250cm9sbGVyIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICovCitMSVNUX0hFQUQoZW1hY19pbml0X2xpc3QpOworCitNT0RVTEVfQVVUSE9SKERSVl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBza2JfcmVzID0gU0tCX1JFUzsKK21vZHVsZV9wYXJhbShza2JfcmVzLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhza2JfcmVzLCAiQW1vdW50IG9mIGRhdGEgdG8gcmVzZXJ2ZSBvbiBza2IgYnVmZnNcbiIKKwkJICJUaGUgNDA1IGhhbmRsZXMgYSBtaXNhbGlnbmVkIElQIGhlYWRlciBmaW5lIGJ1dFxuIgorCQkgInRoaXMgY2FuIGhlbHAgaWYgeW91IGFyZSByb3V0aW5nIHRvIGEgdHVubmVsIG9yIGFcbiIKKwkJICJkZXZpY2UgdGhhdCBuZWVkcyBhbGlnbmVkIGRhdGEuIDAuLjIiKTsKKworI2RlZmluZSBSR01JSV9QUklWKG9jcGRldikgKChzdHJ1Y3QgaWJtX29jcF9yZ21paSopb2NwX2dldF9kcnZkYXRhKG9jcGRldikpCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmdtaWlfZW5hYmxlW10gPSB7CisJUkdNSUlfUlRCSSwKKwlSR01JSV9SR01JSSwKKwlSR01JSV9UQkksCisJUkdNSUlfR01JSQorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCByZ21paV9zcGVlZF9tYXNrW10gPSB7CisJUkdNSUlfTUlJMl9TUERNQVNLLAorCVJHTUlJX01JSTNfU1BETUFTSworfTsKKworc3RhdGljIHVuc2lnbmVkIGludCByZ21paV9zcGVlZDEwMFtdID0geworCVJHTUlJX01JSTJfMTAwTUIsCisJUkdNSUlfTUlJM18xMDBNQgorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCByZ21paV9zcGVlZDEwMDBbXSA9IHsKKwlSR01JSV9NSUkyXzEwMDBNQiwKKwlSR01JSV9NSUkzXzEwMDBNQgorfTsKKworI2RlZmluZSBaTUlJX1BSSVYob2NwZGV2KSAoKHN0cnVjdCBpYm1fb2NwX3ptaWkqKW9jcF9nZXRfZHJ2ZGF0YShvY3BkZXYpKQorCitzdGF0aWMgdW5zaWduZWQgaW50IHptaWlfZW5hYmxlW11bNF0gPSB7CisJe1pNSUlfU01JSTAsIFpNSUlfUk1JSTAsIFpNSUlfTUlJMCwKKwkgfihaTUlJX01ESTEgfCBaTUlJX01ESTIgfCBaTUlJX01ESTMpfSwKKwl7Wk1JSV9TTUlJMSwgWk1JSV9STUlJMSwgWk1JSV9NSUkxLAorCSB+KFpNSUlfTURJMCB8IFpNSUlfTURJMiB8IFpNSUlfTURJMyl9LAorCXtaTUlJX1NNSUkyLCBaTUlJX1JNSUkyLCBaTUlJX01JSTIsCisJIH4oWk1JSV9NREkwIHwgWk1JSV9NREkxIHwgWk1JSV9NREkzKX0sCisJe1pNSUlfU01JSTMsIFpNSUlfUk1JSTMsIFpNSUlfTUlJMywgfihaTUlJX01ESTAgfCBaTUlJX01ESTEgfCBaTUlJX01ESTIpfQorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBtZGlfZW5hYmxlW10gPSB7CisJWk1JSV9NREkwLAorCVpNSUlfTURJMSwKKwlaTUlJX01ESTIsCisJWk1JSV9NREkzCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHptaWlfc3BlZWQgPSAweDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHptaWlfc3BlZWQxMDBbXSA9IHsKKwlaTUlJX01JSTBfMTAwTUIsCisJWk1JSV9NSUkxXzEwME1CLAorCVpNSUlfTUlJMl8xMDBNQiwKKwlaTUlJX01JSTNfMTAwTUIKK307CisKKy8qIFNpbmNlIG11bHRpcGxlIEVNQUNzIHNoYXJlIE1ESU8gbGluZXMgaW4gdmFyaW91cyB3YXlzLCB3ZSBuZWVkCisgKiB0byBhdm9pZCByZS11c2luZyB0aGUgc2FtZSBQSFkgSUQgaW4gY2FzZXMgd2hlcmUgdGhlIGFyY2ggZGlkbid0CisgKiBzZXR1cCBwcmVjaXNlIHBoeV9tYXAgZW50cmllcworICovCitzdGF0aWMgdTMyIGJ1c3lfcGh5X21hcCA9IDA7CisKKy8qIElmIEVNQUNzIHNoYXJlIGEgY29tbW9uIE1ESU8gZGV2aWNlLCB0aGlzIHBvaW50cyB0byBpdCAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICptZGlvX25kZXYgPSBOVUxMOworCitzdHJ1Y3QgZW1hY19kZWZfZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisJc3RydWN0IG9jcF9kZXZpY2UgKm9jcGRldjsKKwlzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZW1hY19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBkZXYtPnByaXY7CisJcmV0dXJuICZmZXAtPnN0YXRzOworfTsKKworc3RhdGljIGludAorZW1hY19pbml0X3JnbWlpKHN0cnVjdCBvY3BfZGV2aWNlICpyZ21paV9kZXYsIGludCBpbnB1dCwgaW50IHBoeV9tb2RlKQoreworCXN0cnVjdCBpYm1fb2NwX3JnbWlpICpyZ21paSA9IFJHTUlJX1BSSVYocmdtaWlfZGV2KTsKKwljb25zdCBjaGFyICptb2RlX25hbWVbXSA9IHsgIlJUQkkiLCAiUkdNSUkiLCAiVEJJIiwgIkdNSUkiIH07CisJaW50IG1vZGUgPSAtMTsKKworCWlmICghcmdtaWkpIHsKKwkJcmdtaWkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWJtX29jcF9yZ21paSksIEdGUF9LRVJORUwpOworCisJCWlmIChyZ21paSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAicmdtaWklZDogT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIFJHTUlJIHN0cnVjdHVyZSFcbiIsCisJCQkgICAgICAgcmdtaWlfZGV2LT5kZWYtPmluZGV4KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJbWVtc2V0KHJnbWlpLCAwLCBzaXplb2YoKnJnbWlpKSk7CisKKwkJcmdtaWktPmJhc2UgPQorCQkgICAgKHN0cnVjdCByZ21paV9yZWdzICopaW9yZW1hcChyZ21paV9kZXYtPmRlZi0+cGFkZHIsCisJCQkJCQkgc2l6ZW9mKCpyZ21paS0+YmFzZSkpOworCQlpZiAocmdtaWktPmJhc2UgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgInJnbWlpJWQ6IENhbm5vdCBpb3JlbWFwIGJyaWRnZSByZWdpc3RlcnMhXG4iLAorCQkJICAgICAgIHJnbWlpX2Rldi0+ZGVmLT5pbmRleCk7CisKKwkJCWtmcmVlKHJnbWlpKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW9jcF9zZXRfZHJ2ZGF0YShyZ21paV9kZXYsIHJnbWlpKTsKKwl9CisKKwlpZiAocGh5X21vZGUpIHsKKwkJc3dpdGNoIChwaHlfbW9kZSkgeworCQljYXNlIFBIWV9NT0RFX0dNSUk6CisJCQltb2RlID0gR01JSTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV9NT0RFX1RCSToKKwkJCW1vZGUgPSBUQkk7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfTU9ERV9SVEJJOgorCQkJbW9kZSA9IFJUQkk7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfTU9ERV9SR01JSToKKwkJZGVmYXVsdDoKKwkJCW1vZGUgPSBSR01JSTsKKwkJfQorCQlyZ21paS0+YmFzZS0+ZmVyICY9IH5SR01JSV9GRVJfTUFTSyhpbnB1dCk7CisJCXJnbWlpLT5iYXNlLT5mZXIgfD0gcmdtaWlfZW5hYmxlW21vZGVdIDw8ICg0ICogaW5wdXQpOworCX0gZWxzZSB7CisJCXN3aXRjaCAoKHJnbWlpLT5iYXNlLT5mZXIgJiBSR01JSV9GRVJfTUFTSyhpbnB1dCkpID4+ICg0ICoKKwkJCQkJCQkJICAgICAgIGlucHV0KSkgeworCQljYXNlIFJHTUlJX1JUQkk6CisJCQltb2RlID0gUlRCSTsKKwkJCWJyZWFrOworCQljYXNlIFJHTUlJX1JHTUlJOgorCQkJbW9kZSA9IFJHTUlJOworCQkJYnJlYWs7CisJCWNhc2UgUkdNSUlfVEJJOgorCQkJbW9kZSA9IFRCSTsKKwkJCWJyZWFrOworCQljYXNlIFJHTUlJX0dNSUk6CisJCQltb2RlID0gR01JSTsKKwkJfQorCX0KKworCS8qIFNldCBtb2RlIHRvIFJHTUlJIGlmIG5vdGhpbmcgdmFsaWQgaXMgZGV0ZWN0ZWQgKi8KKwlpZiAobW9kZSA8IDApCisJCW1vZGUgPSBSR01JSTsKKworCXByaW50ayhLRVJOX05PVElDRSAicmdtaWklZDogaW5wdXQgJWQgaW4gJXMgbW9kZVxuIiwKKwkgICAgICAgcmdtaWlfZGV2LT5kZWYtPmluZGV4LCBpbnB1dCwgbW9kZV9uYW1lW21vZGVdKTsKKworCXJnbWlpLT5tb2RlW2lucHV0XSA9IG1vZGU7CisJcmdtaWktPnVzZXJzKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2VtYWNfcmdtaWlfcG9ydF9zcGVlZChzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwZGV2LCBpbnQgaW5wdXQsIGludCBzcGVlZCkKK3sKKwlzdHJ1Y3QgaWJtX29jcF9yZ21paSAqcmdtaWkgPSBSR01JSV9QUklWKG9jcGRldik7CisJdW5zaWduZWQgaW50IHJnbWlpX3NwZWVkOworCisJcmdtaWlfc3BlZWQgPSBpbl9iZTMyKCZyZ21paS0+YmFzZS0+c3NyKTsKKworCXJnbWlpX3NwZWVkICY9IH5yZ21paV9zcGVlZF9tYXNrW2lucHV0XTsKKworCWlmIChzcGVlZCA9PSAxMDAwKQorCQlyZ21paV9zcGVlZCB8PSByZ21paV9zcGVlZDEwMDBbaW5wdXRdOworCWVsc2UgaWYgKHNwZWVkID09IDEwMCkKKwkJcmdtaWlfc3BlZWQgfD0gcmdtaWlfc3BlZWQxMDBbaW5wdXRdOworCisJb3V0X2JlMzIoJnJnbWlpLT5iYXNlLT5zc3IsIHJnbWlpX3NwZWVkKTsKK30KKworc3RhdGljIHZvaWQgZW1hY19jbG9zZV9yZ21paShzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwZGV2KQoreworCXN0cnVjdCBpYm1fb2NwX3JnbWlpICpyZ21paSA9IFJHTUlJX1BSSVYob2NwZGV2KTsKKwlCVUdfT04oIXJnbWlpIHx8IHJnbWlpLT51c2VycyA9PSAwKTsKKworCWlmICghLS1yZ21paS0+dXNlcnMpIHsKKwkJb2NwX3NldF9kcnZkYXRhKG9jcGRldiwgTlVMTCk7CisJCWlvdW5tYXAoKHZvaWQgKilyZ21paS0+YmFzZSk7CisJCWtmcmVlKHJnbWlpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZW1hY19pbml0X3ptaWkoc3RydWN0IG9jcF9kZXZpY2UgKnptaWlfZGV2LCBpbnQgaW5wdXQsIGludCBwaHlfbW9kZSkKK3sKKwlzdHJ1Y3QgaWJtX29jcF96bWlpICp6bWlpID0gWk1JSV9QUklWKHptaWlfZGV2KTsKKwljb25zdCBjaGFyICptb2RlX25hbWVbXSA9IHsgIlNNSUkiLCAiUk1JSSIsICJNSUkiIH07CisJaW50IG1vZGUgPSAtMTsKKworCWlmICghem1paSkgeworCQl6bWlpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlibV9vY3Bfem1paSksIEdGUF9LRVJORUwpOworCQlpZiAoem1paSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiem1paSVkOiBPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgWk1JSSBzdHJ1Y3R1cmUhXG4iLAorCQkJICAgICAgIHptaWlfZGV2LT5kZWYtPmluZGV4KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldCh6bWlpLCAwLCBzaXplb2YoKnptaWkpKTsKKworCQl6bWlpLT5iYXNlID0KKwkJICAgIChzdHJ1Y3Qgem1paV9yZWdzICopaW9yZW1hcCh6bWlpX2Rldi0+ZGVmLT5wYWRkciwKKwkJCQkJCXNpemVvZigqem1paS0+YmFzZSkpOworCQlpZiAoem1paS0+YmFzZSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiem1paSVkOiBDYW5ub3QgaW9yZW1hcCBicmlkZ2UgcmVnaXN0ZXJzIVxuIiwKKwkJCSAgICAgICB6bWlpX2Rldi0+ZGVmLT5pbmRleCk7CisKKwkJCWtmcmVlKHptaWkpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJb2NwX3NldF9kcnZkYXRhKHptaWlfZGV2LCB6bWlpKTsKKwl9CisKKwlpZiAocGh5X21vZGUpIHsKKwkJc3dpdGNoIChwaHlfbW9kZSkgeworCQljYXNlIFBIWV9NT0RFX01JSToKKwkJCW1vZGUgPSBNSUk7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfTU9ERV9STUlJOgorCQkJbW9kZSA9IFJNSUk7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfTU9ERV9TTUlJOgorCQlkZWZhdWx0OgorCQkJbW9kZSA9IFNNSUk7CisJCX0KKwkJem1paS0+YmFzZS0+ZmVyICY9IH5aTUlJX0ZFUl9NQVNLKGlucHV0KTsKKwkJem1paS0+YmFzZS0+ZmVyIHw9IHptaWlfZW5hYmxlW2lucHV0XVttb2RlXTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKCh6bWlpLT5iYXNlLT5mZXIgJiBaTUlJX0ZFUl9NQVNLKGlucHV0KSkgPDwgKDQgKiBpbnB1dCkpIHsKKwkJY2FzZSBaTUlJX01JSTA6CisJCQltb2RlID0gTUlJOworCQkJYnJlYWs7CisJCWNhc2UgWk1JSV9STUlJMDoKKwkJCW1vZGUgPSBSTUlJOworCQkJYnJlYWs7CisJCWNhc2UgWk1JSV9TTUlJMDoKKwkJCW1vZGUgPSBTTUlJOworCQl9CisJfQorCisJLyogU2V0IG1vZGUgdG8gU01JSSBpZiBub3RoaW5nIHZhbGlkIGlzIGRldGVjdGVkICovCisJaWYgKG1vZGUgPCAwKQorCQltb2RlID0gU01JSTsKKworCXByaW50ayhLRVJOX05PVElDRSAiem1paSVkOiBpbnB1dCAlZCBpbiAlcyBtb2RlXG4iLAorCSAgICAgICB6bWlpX2Rldi0+ZGVmLT5pbmRleCwgaW5wdXQsIG1vZGVfbmFtZVttb2RlXSk7CisKKwl6bWlpLT5tb2RlW2lucHV0XSA9IG1vZGU7CisJem1paS0+dXNlcnMrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbWFjX2VuYWJsZV96bWlpX3BvcnQoc3RydWN0IG9jcF9kZXZpY2UgKm9jcGRldiwgaW50IGlucHV0KQoreworCXUzMiBtYXNrOworCXN0cnVjdCBpYm1fb2NwX3ptaWkgKnptaWkgPSBaTUlJX1BSSVYob2NwZGV2KTsKKworCW1hc2sgPSBpbl9iZTMyKCZ6bWlpLT5iYXNlLT5mZXIpOworCW1hc2sgJj0gem1paV9lbmFibGVbaW5wdXRdW01ESV07CS8qIHR1cm4gYWxsIG5vbiBlbmFibGVkIE1ESSdzIG9mZiAqLworCW1hc2sgfD0gem1paV9lbmFibGVbaW5wdXRdW3ptaWktPm1vZGVbaW5wdXRdXSB8IG1kaV9lbmFibGVbaW5wdXRdOworCW91dF9iZTMyKCZ6bWlpLT5iYXNlLT5mZXIsIG1hc2spOworfQorCitzdGF0aWMgdm9pZAorZW1hY196bWlpX3BvcnRfc3BlZWQoc3RydWN0IG9jcF9kZXZpY2UgKm9jcGRldiwgaW50IGlucHV0LCBpbnQgc3BlZWQpCit7CisJc3RydWN0IGlibV9vY3Bfem1paSAqem1paSA9IFpNSUlfUFJJVihvY3BkZXYpOworCisJaWYgKHNwZWVkID09IDEwMCkKKwkJem1paV9zcGVlZCB8PSB6bWlpX3NwZWVkMTAwW2lucHV0XTsKKwllbHNlCisJCXptaWlfc3BlZWQgJj0gfnptaWlfc3BlZWQxMDBbaW5wdXRdOworCisJb3V0X2JlMzIoJnptaWktPmJhc2UtPnNzciwgem1paV9zcGVlZCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtYWNfY2xvc2Vfem1paShzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwZGV2KQoreworCXN0cnVjdCBpYm1fb2NwX3ptaWkgKnptaWkgPSBaTUlJX1BSSVYob2NwZGV2KTsKKwlCVUdfT04oIXptaWkgfHwgem1paS0+dXNlcnMgPT0gMCk7CisKKwlpZiAoIS0tem1paS0+dXNlcnMpIHsKKwkJb2NwX3NldF9kcnZkYXRhKG9jcGRldiwgTlVMTCk7CisJCWlvdW5tYXAoKHZvaWQgKil6bWlpLT5iYXNlKTsKKwkJa2ZyZWUoem1paSk7CisJfQorfQorCitpbnQgZW1hY19waHlfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnKQoreworCWludCBjb3VudDsKKwl1aW50MzJfdCBzdGFjcjsKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gZGV2LT5wcml2OworCWVtYWNfdCAqZW1hY3AgPSBmZXAtPmVtYWNwOworCisJTURJT19ERUJVRygoIiVzOiBwaHlfcmVhZCwgaWQ6IDB4JXgsIHJlZzogMHgleFxuIiwgZGV2LT5uYW1lLCBtaWlfaWQsCisJCSAgICByZWcpKTsKKworCS8qIEVuYWJsZSBwcm9wZXIgWk1JSSBwb3J0ICovCisJaWYgKGZlcC0+em1paV9kZXYpCisJCWVtYWNfZW5hYmxlX3ptaWlfcG9ydChmZXAtPnptaWlfZGV2LCBmZXAtPnptaWlfaW5wdXQpOworCisJLyogVXNlIHRoZSBFTUFDIHRoYXQgaGFzIHRoZSBNRElPIHBvcnQgKi8KKwlpZiAoZmVwLT5tZGlvX2RldikgeworCQlkZXYgPSBmZXAtPm1kaW9fZGV2OworCQlmZXAgPSBkZXYtPnByaXY7CisJCWVtYWNwID0gZmVwLT5lbWFjcDsKKwl9CisKKwljb3VudCA9IDA7CisJd2hpbGUgKCgoKHN0YWNyID0gaW5fYmUzMigmZW1hY3AtPmVtMHN0YWNyKSkgJiBFTUFDX1NUQUNSX09DKSA9PSAwKQorCQkJCQkmJiAoY291bnQrKyA8IE1ESU9fREVMQVkpKQorCQl1ZGVsYXkoMSk7CisJTURJT19ERUJVRygoIiAoY291bnQgd2FzICVkKVxuIiwgY291bnQpKTsKKworCWlmICgoc3RhY3IgJiBFTUFDX1NUQUNSX09DKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQSFkgcmVhZCB0aW1lb3V0ICMxIVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIENsZWFyIHRoZSBzcGVlZCBiaXRzIGFuZCBtYWtlIGEgcmVhZCByZXF1ZXN0IHRvIHRoZSBQSFkgKi8KKwlzdGFjciA9ICgoRU1BQ19TVEFDUl9SRUFEIHwgKHJlZyAmIDB4MWYpKSAmIH5FTUFDX1NUQUNSX0NMS18xMDBNSFopOworCXN0YWNyIHw9ICgobWlpX2lkICYgMHgxRikgPDwgNSk7CisKKwlvdXRfYmUzMigmZW1hY3AtPmVtMHN0YWNyLCBzdGFjcik7CisKKwljb3VudCA9IDA7CisJd2hpbGUgKCgoKHN0YWNyID0gaW5fYmUzMigmZW1hY3AtPmVtMHN0YWNyKSkgJiBFTUFDX1NUQUNSX09DKSA9PSAwKQorCQkJCQkmJiAoY291bnQrKyA8IE1ESU9fREVMQVkpKQorCQl1ZGVsYXkoMSk7CisJTURJT19ERUJVRygoIiAoY291bnQgd2FzICVkKVxuIiwgY291bnQpKTsKKworCWlmICgoc3RhY3IgJiBFTUFDX1NUQUNSX09DKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQSFkgcmVhZCB0aW1lb3V0ICMyIVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIENoZWNrIGZvciBhIHJlYWQgZXJyb3IgKi8KKwlpZiAoc3RhY3IgJiBFTUFDX1NUQUNSX1BIWUUpIHsKKwkJTURJT19ERUJVRygoIkVNQUMgTURJTyBQSFkgZXJyb3IgIVxuIikpOworCQlyZXR1cm4gLTE7CisJfQorCisJTURJT19ERUJVRygoIiAtPiAweCV4XG4iLCBzdGFjciA+PiAxNikpOworCisJcmV0dXJuIChzdGFjciA+PiAxNik7Cit9CisKK3ZvaWQgZW1hY19waHlfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZywgaW50IGRhdGEpCit7CisJaW50IGNvdW50OworCXVpbnQzMl90IHN0YWNyOworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBkZXYtPnByaXY7CisJZW1hY190ICplbWFjcCA9IGZlcC0+ZW1hY3A7CisKKwlNRElPX0RFQlVHKCgiJXMgcGh5X3dyaXRlLCBpZDogMHgleCwgcmVnOiAweCV4LCBkYXRhOiAweCV4XG4iLAorCQkgICAgZGV2LT5uYW1lLCBtaWlfaWQsIHJlZywgZGF0YSkpOworCisJLyogRW5hYmxlIHByb3BlciBaTUlJIHBvcnQgKi8KKwlpZiAoZmVwLT56bWlpX2RldikKKwkJZW1hY19lbmFibGVfem1paV9wb3J0KGZlcC0+em1paV9kZXYsIGZlcC0+em1paV9pbnB1dCk7CisKKwkvKiBVc2UgdGhlIEVNQUMgdGhhdCBoYXMgdGhlIE1ESU8gcG9ydCAqLworCWlmIChmZXAtPm1kaW9fZGV2KSB7CisJCWRldiA9IGZlcC0+bWRpb19kZXY7CisJCWZlcCA9IGRldi0+cHJpdjsKKwkJZW1hY3AgPSBmZXAtPmVtYWNwOworCX0KKworCWNvdW50ID0gMDsKKwl3aGlsZSAoKCgoc3RhY3IgPSBpbl9iZTMyKCZlbWFjcC0+ZW0wc3RhY3IpKSAmIEVNQUNfU1RBQ1JfT0MpID09IDApCisJCQkJCSYmIChjb3VudCsrIDwgTURJT19ERUxBWSkpCisJCXVkZWxheSgxKTsKKwlNRElPX0RFQlVHKCgiIChjb3VudCB3YXMgJWQpXG4iLCBjb3VudCkpOworCisJaWYgKChzdGFjciAmIEVNQUNfU1RBQ1JfT0MpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBIWSB3cml0ZSB0aW1lb3V0ICMyIVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENsZWFyIHRoZSBzcGVlZCBiaXRzIGFuZCBtYWtlIGEgcmVhZCByZXF1ZXN0IHRvIHRoZSBQSFkgKi8KKworCXN0YWNyID0gKChFTUFDX1NUQUNSX1dSSVRFIHwgKHJlZyAmIDB4MWYpKSAmIH5FTUFDX1NUQUNSX0NMS18xMDBNSFopOworCXN0YWNyIHw9ICgobWlpX2lkICYgMHgxZikgPDwgNSkgfCAoKGRhdGEgJiAweGZmZmYpIDw8IDE2KTsKKworCW91dF9iZTMyKCZlbWFjcC0+ZW0wc3RhY3IsIHN0YWNyKTsKKworCWNvdW50ID0gMDsKKwl3aGlsZSAoKCgoc3RhY3IgPSBpbl9iZTMyKCZlbWFjcC0+ZW0wc3RhY3IpKSAmIEVNQUNfU1RBQ1JfT0MpID09IDApCisJCQkJCSYmIChjb3VudCsrIDwgTURJT19ERUxBWSkpCisJCXVkZWxheSgxKTsKKwlNRElPX0RFQlVHKCgiIChjb3VudCB3YXMgJWQpXG4iLCBjb3VudCkpOworCisJaWYgKChzdGFjciAmIEVNQUNfU1RBQ1JfT0MpID09IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQSFkgd3JpdGUgdGltZW91dCAjMiFcbiIsIGRldi0+bmFtZSk7CisKKwkvKiBDaGVjayBmb3IgYSB3cml0ZSBlcnJvciAqLworCWlmICgoc3RhY3IgJiBFTUFDX1NUQUNSX1BIWUUpICE9IDApIHsKKwkJTURJT19ERUJVRygoIkVNQUMgTURJTyBQSFkgZXJyb3IgIVxuIikpOworCX0KK30KKworc3RhdGljIHZvaWQgZW1hY190eGVvYl9kZXYodm9pZCAqcGFyYW0sIHUzMiBjaGFubWFzaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGFyYW07CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCisJUEtUX0RFQlVHKCgiZW1hY190eGVvYl9kZXYoKSBlbnRyeSwgdHhfY250OiAlZFxuIiwgZmVwLT50eF9jbnQpKTsKKworCXdoaWxlIChmZXAtPnR4X2NudCAmJgorCSAgICAgICAhKGZlcC0+dHhfZGVzY1tmZXAtPmFja19zbG90XS5jdHJsICYgTUFMX1RYX0NUUkxfUkVBRFkpKSB7CisKKwkJaWYgKGZlcC0+dHhfZGVzY1tmZXAtPmFja19zbG90XS5jdHJsICYgTUFMX1RYX0NUUkxfTEFTVCkgeworCQkJLyogVGVsbCB0aGUgc3lzdGVtIHRoZSB0cmFuc21pdCBjb21wbGV0ZWQuICovCisJCQlkbWFfdW5tYXBfc2luZ2xlKCZmZXAtPm9jcGRldi0+ZGV2LAorCQkJCQkgZmVwLT50eF9kZXNjW2ZlcC0+YWNrX3Nsb3RdLmRhdGFfcHRyLAorCQkJCQkgZmVwLT50eF9kZXNjW2ZlcC0+YWNrX3Nsb3RdLmRhdGFfbGVuLAorCQkJCQkgRE1BX1RPX0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShmZXAtPnR4X3NrYltmZXAtPmFja19zbG90XSk7CisKKwkJCWlmIChmZXAtPnR4X2Rlc2NbZmVwLT5hY2tfc2xvdF0uY3RybCAmCisJCQkgICAgKEVNQUNfVFhfU1RfRUMgfCBFTUFDX1RYX1NUX01DIHwgRU1BQ19UWF9TVF9TQykpCisJCQkJZmVwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCX0KKworCQlmZXAtPnR4X3NrYltmZXAtPmFja19zbG90XSA9IChzdHJ1Y3Qgc2tfYnVmZiAqKU5VTEw7CisJCWlmICgrK2ZlcC0+YWNrX3Nsb3QgPT0gTlVNX1RYX0JVRkYpCisJCQlmZXAtPmFja19zbG90ID0gMDsKKworCQlmZXAtPnR4X2NudC0tOworCX0KKwlpZiAoZmVwLT50eF9jbnQgPCBOVU1fVFhfQlVGRikKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJUEtUX0RFQlVHKCgiZW1hY190eGVvYl9kZXYoKSBleGl0LCB0eF9jbnQ6ICVkXG4iLCBmZXAtPnR4X2NudCkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgIEZpbGwvUmUtZmlsbCB0aGUgcnggY2hhaW4gd2l0aCB2YWxpZCBjdHJsL3B0cnMuCisgIFRoaXMgZnVuY3Rpb24gd2lsbCBmaWxsIGZyb20gcnhfc2xvdCB1cCB0byB0aGUgcGFybSBlbmQuCisgIFNvIHRvIGNvbXBsZXRlbHkgZmlsbCB0aGUgY2hhaW4gcHJlLXNldCByeF9zbG90IHRvIDAgYW5kCisgIHBhc3MgaW4gYW4gZW5kIG9mIDAuCisgKi8KK3N0YXRpYyB2b2lkIGVtYWNfcnhfZmlsbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZW5kKQoreworCWludCBpOworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBkZXYtPnByaXY7CisKKwlpID0gZmVwLT5yeF9zbG90OworCWRvIHsKKwkJLyogV2UgZG9uJ3Qgd2FudCB0aGUgMTYgYnl0ZXMgc2tiX3Jlc2VydmUgZG9uZSBieSBkZXZfYWxsb2Nfc2tiLAorCQkgKiBpdCBicmVha3Mgb3VyIGNhY2hlIGxpbmUgYWxpZ25lbWVudC4gSG93ZXZlciwgd2Ugc3RpbGwgYWxsb2NhdGUKKwkJICogKzE2IHNvIHRoYXQgd2UgZW5kIHVwIGFsbG9jYXRpbmcgdGhlIGV4YWN0IHNhbWUgc2l6ZSBhcworCQkgKiBkZXZfYWxsb2Nfc2tiKCkgd291bGQgZG8uCisJCSAqIEFsc28sIGJlY2F1c2Ugb2YgdGhlIHNrYl9yZXMsIHRoZSBtYXggRE1BIHNpemUgd2UgZ2l2ZSB0byBFTUFDCisJCSAqIGlzIHNsaWdobHkgd3JvbmcsIGNhdXNpbmcgaXQgdG8gcG90ZW50aWFsbHkgRE1BIDIgbW9yZSBieXRlcworCQkgKiBmcm9tIGEgYnJva2VuL292ZXJzaXplZCBwYWNrZXQuIFRoZXNlIDE2IGJ5dGVzIHdpbGwgdGFrZSBjYXJlCisJCSAqIHRoYXQgd2UgZG9uJ3Qgd2FsayBvbiBzb21lYm9keSBlbHNlIHRvZXMgd2l0aCB0aGF0LgorCQkgKi8KKwkJZmVwLT5yeF9za2JbaV0gPQorCQkgICAgYWxsb2Nfc2tiKGZlcC0+cnhfYnVmZmVyX3NpemUgKyAxNiwgR0ZQX0FUT01JQyk7CisKKwkJaWYgKGZlcC0+cnhfc2tiW2ldID09IE5VTEwpIHsKKwkJCS8qIEtlZXAgcnhfc2xvdCBoZXJlLCB0aGUgbmV4dCB0aW1lIGNsZWFuL2ZpbGwgaXMgY2FsbGVkCisJCQkgKiB3ZSB3aWxsIHRyeSBhZ2FpbiBiZWZvcmUgdGhlIE1BTCB3cmFwcyBiYWNrIGhlcmUKKwkJCSAqIElmIHRoZSBNQUwgdHJpZXMgdG8gdXNlIHRoaXMgZGVzY3JpcHRvciB3aXRoCisJCQkgKiB0aGUgRU1QVFkgYml0IG9mZiBpdCB3aWxsIGNhdXNlIHRoZQorCQkJICogcnhkZSBpbnRlcnJ1cHQuICBUaGF0IGlzIHdoZXJlIHdlIHdpbGwKKwkJCSAqIHRyeSBhZ2FpbiB0byBhbGxvY2F0ZSBhbiBza19idWZmLgorCQkJICovCisJCQlicmVhazsKKworCQl9CisKKwkJaWYgKHNrYl9yZXMpCisJCQlza2JfcmVzZXJ2ZShmZXAtPnJ4X3NrYltpXSwgc2tiX3Jlcyk7CisKKwkJLyogV2UgbXVzdCBOT1QgZG1hX21hcF9zaW5nbGUgdGhlIGNhY2hlIGxpbmUgcmlnaHQgYWZ0ZXIgdGhlCisJCSAqIGJ1ZmZlciwgc28gd2UgbXVzdCBjcm9wIG91ciBzeW5jIHNpemUgdG8gYWNjb3VudCBmb3IgdGhlCisJCSAqIHJlc2VydmVkIHNwYWNlCisJCSAqLworCQlmZXAtPnJ4X2Rlc2NbaV0uZGF0YV9wdHIgPQorCQkgICAgKHVuc2lnbmVkIGNoYXIgKilkbWFfbWFwX3NpbmdsZSgmZmVwLT5vY3BkZXYtPmRldiwKKwkJCQkJCSAgICAodm9pZCAqKWZlcC0+cnhfc2tiW2ldLT4KKwkJCQkJCSAgICBkYXRhLAorCQkJCQkJICAgIGZlcC0+cnhfYnVmZmVyX3NpemUgLQorCQkJCQkJICAgIHNrYl9yZXMsIERNQV9GUk9NX0RFVklDRSk7CisKKwkJLyoKKwkJICogU29tZSA0eHggaW1wbGVtZW50YXRpb25zIHVzZSB0aGUgcHJldmlvdXNseQorCQkgKiByZXNlcnZlZCBiaXRzIGluIGRhdGFfbGVuIHRvIGVuY29kZSB0aGUgTVMKKwkJICogNC1iaXRzIG9mIGEgMzYtYml0IHBoeXNpY2FsIGFkZHJlc3MgKEVSUE4pCisJCSAqIFRoaXMgbXVzdCBiZSBpbml0aWFsaXplZC4KKwkJICovCisJCWZlcC0+cnhfZGVzY1tpXS5kYXRhX2xlbiA9IDA7CisJCWZlcC0+cnhfZGVzY1tpXS5jdHJsID0gTUFMX1JYX0NUUkxfRU1QVFkgfCBNQUxfUlhfQ1RSTF9JTlRSIHwKKwkJICAgIChpID09IChOVU1fUlhfQlVGRiAtIDEpID8gTUFMX1JYX0NUUkxfV1JBUCA6IDApOworCisJfSB3aGlsZSAoKGkgPSAoaSArIDEpICUgTlVNX1JYX0JVRkYpICE9IGVuZCk7CisKKwlmZXAtPnJ4X3Nsb3QgPSBpOworfQorCitzdGF0aWMgdm9pZAorZW1hY19yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IGN0cmwsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKworCS8qIEV4aXQgaWYgaW50ZXJmYWNlIGhhcyBubyBUQUggZW5naW5lICovCisJaWYgKCFmZXAtPnRhaF9kZXYpIHsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgZm9yIFRDUC9VRFAvSVAgY3N1bSBlcnJvciAqLworCWlmIChjdHJsICYgRU1BQ19DU1VNX1ZFUl9FUlJPUikgeworCQkvKiBMZXQgdGhlIHN0YWNrIHZlcmlmeSBjaGVja3N1bSBlcnJvcnMgKi8KKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworLyoJCWFkYXB0ZXItPmh3X2NzdW1fZXJyKys7ICovCisJfSBlbHNlIHsKKwkJLyogQ3N1bSBpcyBnb29kICovCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisvKgkJYWRhcHRlci0+aHdfY3N1bV9nb29kKys7ICovCisJfQorfQorCitzdGF0aWMgaW50IGVtYWNfcnhfY2xlYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaSwgYiwgYm51bSA9IDAsIGJ1Zls2XTsKKwlpbnQgZXJyb3IsIGZyYW1lX2xlbmd0aDsKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIHNob3J0IGN0cmw7CisKKwlpID0gZmVwLT5yeF9zbG90OworCisJUEtUX0RFQlVHKCgiZW1hY19yeF9jbGVhbigpIGVudHJ5LCByeF9zbG90OiAlZFxuIiwgZmVwLT5yeF9zbG90KSk7CisKKwlkbyB7CisJCWlmIChmZXAtPnJ4X3NrYltpXSA9PSBOVUxMKQorCQkJY29udGludWU7CS8qd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIHBhY2tldCBidXQgaGF2ZWQgZmFpbGVkIHRvIGFsbG9jICovCisJCS8qIAorCQkgICBzaW5jZSByeF9kZXNjIGlzIGluIHVuY2FjaGVkIG1lbSB3ZSBkb24ndCBrZWVwIHJlYWRpbmcgaXQgZGlyZWN0bHkgCisJCSAgIHdlIHB1bGwgb3V0IGEgbG9jYWwgY29weSBvZiBjdHJsIGFuZCBkbyB0aGUgY2hlY2tzIG9uIHRoZSBjb3B5LgorCQkgKi8KKwkJY3RybCA9IGZlcC0+cnhfZGVzY1tpXS5jdHJsOworCQlpZiAoY3RybCAmIE1BTF9SWF9DVFJMX0VNUFRZKQorCQkJYnJlYWs7CS8qd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSByZWFkeSBwYWNrZXRzICovCisKKwkJaWYgKEVNQUNfSVNfQkFEX1JYX1BBQ0tFVChjdHJsKSkgeworCQkJZmVwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWZlcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCisJCQlpZiAoY3RybCAmIEVNQUNfUlhfU1RfT0UpCisJCQkJZmVwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJaWYgKGN0cmwgJiBFTUFDX1JYX1NUX0FFKQorCQkJCWZlcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoY3RybCAmIEVNQUNfUlhfU1RfQkZDUykKKwkJCQlmZXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChjdHJsICYgKEVNQUNfUlhfU1RfUlAgfCBFTUFDX1JYX1NUX1BUTCB8CisJCQkJICAgIEVNQUNfUlhfU1RfT1JFIHwgRU1BQ19SWF9TVF9JUkUpKQorCQkJCWZlcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJaWYgKChjdHJsICYgKE1BTF9SWF9DVFJMX0ZJUlNUIHwgTUFMX1JYX0NUUkxfTEFTVCkpID09CisJCQkgICAgKE1BTF9SWF9DVFJMX0ZJUlNUIHwgTUFMX1JYX0NUUkxfTEFTVCkpIHsKKwkJCQkvKiBTaW5nbGUgZGVzY3JpcHRvciBwYWNrZXQgKi8KKwkJCQllbWFjX3J4X2NzdW0oZGV2LCBjdHJsLCBmZXAtPnJ4X3NrYltpXSk7CisJCQkJLyogU2VuZCB0aGUgc2tiIHVwIHRoZSBjaGFpbi4gKi8KKwkJCQlmcmFtZV9sZW5ndGggPSBmZXAtPnJ4X2Rlc2NbaV0uZGF0YV9sZW4gLSA0OworCQkJCXNrYl9wdXQoZmVwLT5yeF9za2JbaV0sIGZyYW1lX2xlbmd0aCk7CisJCQkJZmVwLT5yeF9za2JbaV0tPmRldiA9IGRldjsKKwkJCQlmZXAtPnJ4X3NrYltpXS0+cHJvdG9jb2wgPQorCQkJCSAgICBldGhfdHlwZV90cmFucyhmZXAtPnJ4X3NrYltpXSwgZGV2KTsKKwkJCQllcnJvciA9IG5ldGlmX3J4KGZlcC0+cnhfc2tiW2ldKTsKKworCQkJCWlmICgoZXJyb3IgPT0gTkVUX1JYX0RST1ApIHx8CisJCQkJICAgIChlcnJvciA9PSBORVRfUlhfQkFEKSkgeworCQkJCQlmZXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQl9IGVsc2UgeworCQkJCQlmZXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQkJZmVwLT5zdGF0cy5yeF9ieXRlcyArPSBmcmFtZV9sZW5ndGg7CisJCQkJfQorCQkJCWZlcC0+cnhfc2tiW2ldID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJLyogTXVsdGlwbGUgZGVzY3JpcHRvciBwYWNrZXQgKi8KKwkJCQlpZiAoY3RybCAmIE1BTF9SWF9DVFJMX0ZJUlNUKSB7CisJCQkJCWlmIChmZXAtPnJ4X2Rlc2NbKGkgKyAxKSAlIE5VTV9SWF9CVUZGXS4KKwkJCQkJICAgIGN0cmwgJiBNQUxfUlhfQ1RSTF9FTVBUWSkKKwkJCQkJCWJyZWFrOworCQkJCQlibnVtID0gMDsKKwkJCQkJYnVmW2JudW1dID0gaTsKKwkJCQkJKytibnVtOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCgoY3RybCAmIE1BTF9SWF9DVFJMX0ZJUlNUKSAhPQorCQkJCSAgICAgTUFMX1JYX0NUUkxfRklSU1QpICYmCisJCQkJICAgICgoY3RybCAmIE1BTF9SWF9DVFJMX0xBU1QpICE9CisJCQkJICAgICBNQUxfUlhfQ1RSTF9MQVNUKSkgeworCQkJCQlpZiAoZmVwLT5yeF9kZXNjWyhpICsgMSkgJQorCQkJCQkJCSBOVU1fUlhfQlVGRl0uY3RybCAmCisJCQkJCSAgICBNQUxfUlhfQ1RSTF9FTVBUWSkgeworCQkJCQkJaSA9IGJ1ZlswXTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWJ1ZltibnVtXSA9IGk7CisJCQkJCSsrYm51bTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChjdHJsICYgTUFMX1JYX0NUUkxfTEFTVCkgeworCQkJCQlidWZbYm51bV0gPSBpOworCQkJCQkrK2JudW07CisJCQkJCXNrYl9wdXQoZmVwLT5yeF9za2JbYnVmWzBdXSwKKwkJCQkJCWZlcC0+cnhfZGVzY1tidWZbMF1dLmRhdGFfbGVuKTsKKwkJCQkJZm9yIChiID0gMTsgYiA8IGJudW07IGIrKykgeworCQkJCQkJLyoKKwkJCQkJCSAqIE1BTCBpcyBicmFpbmRlYWQsIHdlIG5lZWQKKwkJCQkJCSAqIHRvIGNvcHkgdGhlIHJlbWFpbmRlcgorCQkJCQkJICogb2YgdGhlIHBhY2tldCBmcm9tIHRoZQorCQkJCQkJICogbGF0dGVyIGRlc2NyaXB0b3IgYnVmZmVycworCQkJCQkJICogdG8gdGhlIGZpcnN0IHNrYi4gVGhlbgorCQkJCQkJICogZGlzcG9zZSBvZiB0aGUgc291cmNlCisJCQkJCQkgKiBza2JzLgorCQkJCQkJICoKKwkJCQkJCSAqIE9uY2UgdGhlIHN0YWNrIGlzIGZpeGVkCisJCQkJCQkgKiB0byBoYW5kbGUgZnJhZ3Mgb24gbW9zdAorCQkJCQkJICogcHJvdG9jb2xzIHdlIGNhbiBnZW5lcmF0ZQorCQkJCQkJICogYSBmcmFnbWVudGVkIHNrYiB3aXRoCisJCQkJCQkgKiBubyBjb3BpZXMuCisJCQkJCQkgKi8KKwkJCQkJCW1lbWNweShmZXAtPnJ4X3NrYltidWZbMF1dLT4KKwkJCQkJCSAgICAgICBkYXRhICsKKwkJCQkJCSAgICAgICBmZXAtPnJ4X3NrYltidWZbMF1dLT5sZW4sCisJCQkJCQkgICAgICAgZmVwLT5yeF9za2JbYnVmW2JdXS0+CisJCQkJCQkgICAgICAgZGF0YSwKKwkJCQkJCSAgICAgICBmZXAtPnJ4X2Rlc2NbYnVmW2JdXS4KKwkJCQkJCSAgICAgICBkYXRhX2xlbik7CisJCQkJCQlza2JfcHV0KGZlcC0+cnhfc2tiW2J1ZlswXV0sCisJCQkJCQkJZmVwLT5yeF9kZXNjW2J1ZltiXV0uCisJCQkJCQkJZGF0YV9sZW4pOworCQkJCQkJZG1hX3VubWFwX3NpbmdsZSgmZmVwLT5vY3BkZXYtPgorCQkJCQkJCQkgZGV2LAorCQkJCQkJCQkgZmVwLT4KKwkJCQkJCQkJIHJ4X2Rlc2NbYnVmCisJCQkJCQkJCQkgW2JdXS4KKwkJCQkJCQkJIGRhdGFfcHRyLAorCQkJCQkJCQkgZmVwLT4KKwkJCQkJCQkJIHJ4X2Rlc2NbYnVmCisJCQkJCQkJCQkgW2JdXS4KKwkJCQkJCQkJIGRhdGFfbGVuLAorCQkJCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwkJCQkJCWRldl9rZnJlZV9za2IoZmVwLT4KKwkJCQkJCQkgICAgICByeF9za2JbYnVmW2JdXSk7CisJCQkJCX0KKwkJCQkJZW1hY19yeF9jc3VtKGRldiwgY3RybCwKKwkJCQkJCSAgICAgZmVwLT5yeF9za2JbYnVmWzBdXSk7CisKKwkJCQkJZmVwLT5yeF9za2JbYnVmWzBdXS0+ZGV2ID0gZGV2OworCQkJCQlmZXAtPnJ4X3NrYltidWZbMF1dLT5wcm90b2NvbCA9CisJCQkJCSAgICBldGhfdHlwZV90cmFucyhmZXAtPnJ4X3NrYltidWZbMF1dLAorCQkJCQkJCSAgIGRldik7CisJCQkJCWVycm9yID0gbmV0aWZfcngoZmVwLT5yeF9za2JbYnVmWzBdXSk7CisKKwkJCQkJaWYgKChlcnJvciA9PSBORVRfUlhfRFJPUCkKKwkJCQkJICAgIHx8IChlcnJvciA9PSBORVRfUlhfQkFEKSkgeworCQkJCQkJZmVwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmZXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQkJCWZlcC0+c3RhdHMucnhfYnl0ZXMgKz0KKwkJCQkJCSAgICBmZXAtPnJ4X3NrYltidWZbMF1dLT5sZW47CisJCQkJCX0KKwkJCQkJZm9yIChiID0gMDsgYiA8IGJudW07IGIrKykKKwkJCQkJCWZlcC0+cnhfc2tiW2J1ZltiXV0gPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKChpID0gKGkgKyAxKSAlIE5VTV9SWF9CVUZGKSAhPSBmZXAtPnJ4X3Nsb3QpOworCisJUEtUX0RFQlVHKCgiZW1hY19yeF9jbGVhbigpIGV4aXQsIHJ4X3Nsb3Q6ICVkXG4iLCBmZXAtPnJ4X3Nsb3QpKTsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBlbWFjX3J4ZW9iX2Rldih2b2lkICpwYXJhbSwgdTMyIGNoYW5tYXNrKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwYXJhbTsKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmVwLT5sb2NrLCBmbGFncyk7CisJaWYgKChuID0gZW1hY19yeF9jbGVhbihkZXYpKSAhPSBmZXAtPnJ4X3Nsb3QpCisJCWVtYWNfcnhfZmlsbChkZXYsIG4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlcC0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogVGhpcyBpbnRlcnJ1cHQgc2hvdWxkIG5ldmVyIG9jY3Vyciwgd2UgZG9uJ3QgcHJvZ3JhbQorICogdGhlIE1BTCBmb3IgY29udGl1bm91cyBtb2RlLgorICovCitzdGF0aWMgdm9pZCBlbWFjX3R4ZGVfZGV2KHZvaWQgKnBhcmFtLCB1MzIgY2hhbm1hc2spCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBhcmFtOworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBkZXYtPnByaXY7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgZGVzY3JpcHRvciBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKworCWVtYWNfbWFjX2R1bXAoZGV2KTsKKwllbWFjX21hbF9kdW1wKGRldik7CisKKwkvKiBSZWVuYWJsZSB0aGUgdHJhbnNtaXQgY2hhbm5lbCAqLworCW1hbF9lbmFibGVfdHhfY2hhbm5lbHMoZmVwLT5tYWwsIGZlcC0+Y29tbWFjLnR4X2NoYW5fbWFzayk7Cit9CisKKy8qCisgKiBUaGlzIGludGVycnVwdCBzaG91bGQgYmUgdmVyeSByYXJlIGF0IGJlc3QuICBUaGlzIG9jY3VycyB3aGVuCisgKiB0aGUgaGFyZHdhcmUgaGFzIGEgcHJvYmxlbSB3aXRoIHRoZSByZWNlaXZlIGRlc2NyaXB0b3JzLiAgVGhlIG1hbnVhbAorICogc3RhdGVzIHRoYXQgaXQgb2NjdXJzIHdoZW4gdGhlIGhhcmR3YXJlIGNhbm5vdCB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yCisgKiBlbXB0eSBiaXQgaXMgbm90IHNldC4gIFRoZSByZWNvdmVyeSBtZWNoYW5pc20gd2lsbCBiZSB0bworICogdHJhdmVyc2UgdGhyb3VnaCB0aGUgZGVzY3JpcHRvcnMsIGhhbmRsZSBhbnkgdGhhdCBhcmUgbWFya2VkIHRvIGJlCisgKiBoYW5kbGVkIGFuZCByZWluaXRpYWxpemUgZWFjaCBhbG9uZyB0aGUgd2F5LiAgQXQgdGhhdCBwb2ludCB0aGUgZHJpdmVyCisgKiB3aWxsIGJlIHJlc3RhcnRlZC4KKyAqLworc3RhdGljIHZvaWQgZW1hY19yeGRlX2Rldih2b2lkICpwYXJhbSwgdTMyIGNoYW5tYXNrKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwYXJhbTsKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZWNlaXZlIGRlc2NyaXB0b3IgZXJyb3JcbiIsCisJCSAgICAgICBmZXAtPm5kZXYtPm5hbWUpOworCisJCWVtYWNfbWFjX2R1bXAoZGV2KTsKKwkJZW1hY19tYWxfZHVtcChkZXYpOworCQllbWFjX2Rlc2NfZHVtcChkZXYpOworCX0KKworCS8qIERpc2FibGUgUlggY2hhbm5lbCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKwltYWxfZGlzYWJsZV9yeF9jaGFubmVscyhmZXAtPm1hbCwgZmVwLT5jb21tYWMucnhfY2hhbl9tYXNrKTsKKworCS8qIEZvciBub3csIGNoYXJnZSB0aGUgZXJyb3IgYWdhaW5zdCBhbGwgZW1hY3MgKi8KKwlmZXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCisJLyogc28gZG8gd2UgaGF2ZSBhbnkgZ29vZCBwYWNrZXRzIHN0aWxsPyAqLworCWVtYWNfcnhfY2xlYW4oZGV2KTsKKworCS8qIFdoZW4gdGhlIGludGVyZmFjZSBpcyByZXN0YXJ0ZWQgaXQgcmVzZXRzIHByb2Nlc3NpbmcgdG8gdGhlCisJICogIGZpcnN0IGRlc2NyaXB0b3IgaW4gdGhlIHRhYmxlLgorCSAqLworCisJZmVwLT5yeF9zbG90ID0gMDsKKwllbWFjX3J4X2ZpbGwoZGV2LCAwKTsKKworCXNldF9tYWxfZGNybihmZXAtPm1hbCwgRENSTl9NQUxSWEVPQklTUiwgZmVwLT5jb21tYWMucnhfY2hhbl9tYXNrKTsKKwlzZXRfbWFsX2Rjcm4oZmVwLT5tYWwsIERDUk5fTUFMUlhERUlSLCBmZXAtPmNvbW1hYy5yeF9jaGFuX21hc2spOworCisJLyogUmVlbmFibGUgdGhlIHJlY2VpdmUgY2hhbm5lbHMgKi8KKwltYWxfZW5hYmxlX3J4X2NoYW5uZWxzKGZlcC0+bWFsLCBmZXAtPmNvbW1hYy5yeF9jaGFuX21hc2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlcC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK2VtYWNfbWFjX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwllbWFjX3QgKmVtYWNwID0gZmVwLT5lbWFjcDsKKwl1bnNpZ25lZCBsb25nIHRtcF9lbTBpc3I7CisKKwkvKiBFTUFDIGludGVycnVwdCAqLworCXRtcF9lbTBpc3IgPSBpbl9iZTMyKCZlbWFjcC0+ZW0waXNyKTsKKwlpZiAodG1wX2VtMGlzciAmIChFTUFDX0lTUl9URTAgfCBFTUFDX0lTUl9URTEpKSB7CisJCS8qIFRoaXMgZXJyb3IgaXMgYSBoYXJkIHRyYW5zbWl0IGVycm9yIC0gY291bGQgcmV0cmFuc21pdCAqLworCQlmZXAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJCS8qIFJlZW5hYmxlIHRoZSB0cmFuc21pdCBjaGFubmVsICovCisJCW1hbF9lbmFibGVfdHhfY2hhbm5lbHMoZmVwLT5tYWwsIGZlcC0+Y29tbWFjLnR4X2NoYW5fbWFzayk7CisKKwl9IGVsc2UgeworCQlmZXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCX0KKworCWlmICh0bXBfZW0waXNyICYgRU1BQ19JU1JfUlApCisJCWZlcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCWlmICh0bXBfZW0waXNyICYgRU1BQ19JU1JfQUxFKQorCQlmZXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCWlmICh0bXBfZW0waXNyICYgRU1BQ19JU1JfQkZDUykKKwkJZmVwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJaWYgKHRtcF9lbTBpc3IgJiBFTUFDX0lTUl9QVExFKQorCQlmZXAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwlpZiAodG1wX2VtMGlzciAmIEVNQUNfSVNSX09SRSkKKwkJZmVwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJaWYgKHRtcF9lbTBpc3IgJiBFTUFDX0lTUl9URTApCisJCWZlcC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKworCWVtYWNfZXJyX2R1bXAoZGV2LCB0bXBfZW0waXNyKTsKKworCW91dF9iZTMyKCZlbWFjcC0+ZW0waXNyLCB0bXBfZW0waXNyKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBlbWFjX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBzaG9ydCBjdHJsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwllbWFjX3QgKmVtYWNwID0gZmVwLT5lbWFjcDsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisJdW5zaWduZWQgaW50IG9mZnNldCA9IDAsIHNpemUsIGYsIHR4X3Nsb3RfZmlyc3Q7CisJdW5zaWduZWQgaW50IG5yX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKworCWxlbiAtPSBza2ItPmRhdGFfbGVuOworCisJaWYgKChmZXAtPnR4X2NudCArIG5yX2ZyYWdzICsgbGVuIC8gREVTQ19CVUZfU0laRSArIDEpID4gTlVNX1RYX0JVRkYpIHsKKwkJUEtUX0RFQlVHKCgiZW1hY19zdGFydF94bWl0KCkgc3RvcHBpbmcgcXVldWVcbiIpKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwl0eF9zbG90X2ZpcnN0ID0gZmVwLT50eF9zbG90OworCisJd2hpbGUgKGxlbikgeworCQlzaXplID0gbWluKGxlbiwgREVTQ19CVUZfU0laRSk7CisKKwkJZmVwLT50eF9kZXNjW2ZlcC0+dHhfc2xvdF0uZGF0YV9sZW4gPSAoc2hvcnQpc2l6ZTsKKwkJZmVwLT50eF9kZXNjW2ZlcC0+dHhfc2xvdF0uZGF0YV9wdHIgPQorCQkgICAgKHVuc2lnbmVkIGNoYXIgKilkbWFfbWFwX3NpbmdsZSgmZmVwLT5vY3BkZXYtPmRldiwKKwkJCQkJCSAgICAodm9pZCAqKSgodW5zaWduZWQgaW50KXNrYi0+CisJCQkJCQkJICAgICBkYXRhICsgb2Zmc2V0KSwKKwkJCQkJCSAgICBzaXplLCBETUFfVE9fREVWSUNFKTsKKworCQljdHJsID0gRU1BQ19UWF9DVFJMX0RGTFQ7CisJCWlmIChmZXAtPnR4X3Nsb3QgIT0gdHhfc2xvdF9maXJzdCkKKwkJCWN0cmwgfD0gTUFMX1RYX0NUUkxfUkVBRFk7CisJCWlmICgoTlVNX1RYX0JVRkYgLSAxKSA9PSBmZXAtPnR4X3Nsb3QpCisJCQljdHJsIHw9IE1BTF9UWF9DVFJMX1dSQVA7CisJCWlmICghbnJfZnJhZ3MgJiYgKGxlbiA9PSBzaXplKSkgeworCQkJY3RybCB8PSBNQUxfVFhfQ1RSTF9MQVNUOworCQkJZmVwLT50eF9za2JbZmVwLT50eF9zbG90XSA9IHNrYjsKKwkJfQorCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCisJCQljdHJsIHw9IEVNQUNfVFhfQ1RSTF9UQUhfQ1NVTTsKKworCQlmZXAtPnR4X2Rlc2NbZmVwLT50eF9zbG90XS5jdHJsID0gY3RybDsKKworCQlsZW4gLT0gc2l6ZTsKKwkJb2Zmc2V0ICs9IHNpemU7CisKKwkJLyogQnVtcCB0eCBjb3VudCAqLworCQlpZiAoKytmZXAtPnR4X2NudCA9PSBOVU1fVFhfQlVGRikKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQkvKiBOZXh0IGRlc2NyaXB0b3IgKi8KKwkJaWYgKCsrZmVwLT50eF9zbG90ID09IE5VTV9UWF9CVUZGKQorCQkJZmVwLT50eF9zbG90ID0gMDsKKwl9CisKKwlmb3IgKGYgPSAwOyBmIDwgbnJfZnJhZ3M7IGYrKykgeworCQlzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFnOworCisJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmXTsKKwkJbGVuID0gZnJhZy0+c2l6ZTsKKwkJb2Zmc2V0ID0gMDsKKworCQl3aGlsZSAobGVuKSB7CisJCQlzaXplID0gbWluKGxlbiwgREVTQ19CVUZfU0laRSk7CisKKwkJCWRtYV9tYXBfcGFnZSgmZmVwLT5vY3BkZXYtPmRldiwKKwkJCQkgICAgIGZyYWctPnBhZ2UsCisJCQkJICAgICBmcmFnLT5wYWdlX29mZnNldCArIG9mZnNldCwKKwkJCQkgICAgIHNpemUsIERNQV9UT19ERVZJQ0UpOworCisJCQljdHJsID0gRU1BQ19UWF9DVFJMX0RGTFQgfCBNQUxfVFhfQ1RSTF9SRUFEWTsKKwkJCWlmICgoTlVNX1RYX0JVRkYgLSAxKSA9PSBmZXAtPnR4X3Nsb3QpCisJCQkJY3RybCB8PSBNQUxfVFhfQ1RSTF9XUkFQOworCQkJaWYgKChmID09IChucl9mcmFncyAtIDEpKSAmJiAobGVuID09IHNpemUpKSB7CisJCQkJY3RybCB8PSBNQUxfVFhfQ1RSTF9MQVNUOworCQkJCWZlcC0+dHhfc2tiW2ZlcC0+dHhfc2xvdF0gPSBza2I7CisJCQl9CisKKwkJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKKwkJCQljdHJsIHw9IEVNQUNfVFhfQ1RSTF9UQUhfQ1NVTTsKKworCQkJZmVwLT50eF9kZXNjW2ZlcC0+dHhfc2xvdF0uZGF0YV9sZW4gPSAoc2hvcnQpc2l6ZTsKKwkJCWZlcC0+dHhfZGVzY1tmZXAtPnR4X3Nsb3RdLmRhdGFfcHRyID0KKwkJCSAgICAoY2hhciAqKSgocGFnZV90b19wZm4oZnJhZy0+cGFnZSkgPDwgUEFHRV9TSElGVCkgKworCQkJCSAgICAgZnJhZy0+cGFnZV9vZmZzZXQgKyBvZmZzZXQpOworCQkJZmVwLT50eF9kZXNjW2ZlcC0+dHhfc2xvdF0uY3RybCA9IGN0cmw7CisKKwkJCWxlbiAtPSBzaXplOworCQkJb2Zmc2V0ICs9IHNpemU7CisKKwkJCS8qIEJ1bXAgdHggY291bnQgKi8KKwkJCWlmICgrK2ZlcC0+dHhfY250ID09IE5VTV9UWF9CVUZGKQorCQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQkJLyogTmV4dCBkZXNjcmlwdG9yICovCisJCQlpZiAoKytmZXAtPnR4X3Nsb3QgPT0gTlVNX1RYX0JVRkYpCisJCQkJZmVwLT50eF9zbG90ID0gMDsKKwkJfQorCX0KKworCS8qCisJICogRGVmZXJyZWQgc2V0IFJFQURZIG9uIGZpcnN0IGRlc2NyaXB0b3Igb2YgcGFja2V0IHRvCisJICogYXZvaWQgVFggTUFMIHJhY2UuCisJICovCisJZmVwLT50eF9kZXNjW3R4X3Nsb3RfZmlyc3RdLmN0cmwgfD0gTUFMX1RYX0NUUkxfUkVBRFk7CisKKwkvKiBTZW5kIHRoZSBwYWNrZXQgb3V0LiAqLworCW91dF9iZTMyKCZlbWFjcC0+ZW0wdG1yMCwgRU1BQ19UTVIwX1hNSVQpOworCisJZmVwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJZmVwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCVBLVF9ERUJVRygoImVtYWNfc3RhcnRfeG1pdCgpIGV4aXRuIikpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbWFjX2FkanVzdF90b19saW5rKHN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXApCit7CisJZW1hY190ICplbWFjcCA9IGZlcC0+ZW1hY3A7CisJdW5zaWduZWQgbG9uZyBtb2RlX3JlZzsKKwlpbnQgZnVsbF9kdXBsZXgsIHNwZWVkOworCisJZnVsbF9kdXBsZXggPSAwOworCXNwZWVkID0gU1BFRURfMTA7CisKKwkvKiBzZXQgbW9kZSByZWdpc3RlciAxIGRlZmF1bHRzICovCisJbW9kZV9yZWcgPSBFTUFDX00xX0RFRkFVTFQ7CisKKwkvKiBSZWFkIGxpbmsgbW9kZSBvbiBQSFkgKi8KKwlpZiAoZmVwLT5waHlfbWlpLmRlZi0+b3BzLT5yZWFkX2xpbmsoJmZlcC0+cGh5X21paSkgPT0gMCkgeworCQkvKiBJZiBhbiBlcnJvciBvY2N1cnJlZCwgd2UgZG9uJ3QgZGVhbCB3aXRoIGl0IHlldCAqLworCQlmdWxsX2R1cGxleCA9IChmZXAtPnBoeV9taWkuZHVwbGV4ID09IERVUExFWF9GVUxMKTsKKwkJc3BlZWQgPSBmZXAtPnBoeV9taWkuc3BlZWQ7CisJfQorCisKKwkvKiBzZXQgc3BlZWQgKGRlZmF1bHQgaXMgMTBNYikgKi8KKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSBTUEVFRF8xMDAwOgorCQltb2RlX3JlZyB8PSBFTUFDX00xX1JGU18xNks7CisJCWlmIChmZXAtPnJnbWlpX2RldikgeworCQkJc3RydWN0IGlibV9vY3BfcmdtaWkgKnJnbWlpID0gUkdNSUlfUFJJVihmZXAtPnJnbWlpX2Rldik7CisKKwkJCWlmICgocmdtaWktPm1vZGVbZmVwLT5yZ21paV9pbnB1dF0gPT0gUlRCSSkKKwkJCSAgICB8fCAocmdtaWktPm1vZGVbZmVwLT5yZ21paV9pbnB1dF0gPT0gVEJJKSkKKwkJCQltb2RlX3JlZyB8PSBFTUFDX00xX01GXzEwMDBHUENTOworCQkJZWxzZQorCQkJCW1vZGVfcmVnIHw9IEVNQUNfTTFfTUZfMTAwME1CUFM7CisKKwkJCWVtYWNfcmdtaWlfcG9ydF9zcGVlZChmZXAtPnJnbWlpX2RldiwgZmVwLT5yZ21paV9pbnB1dCwKKwkJCQkJICAgICAgMTAwMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDA6CisJCW1vZGVfcmVnIHw9IEVNQUNfTTFfTUZfMTAwTUJQUyB8IEVNQUNfTTFfUkZTXzRLOworCQlpZiAoZmVwLT5yZ21paV9kZXYpCisJCQllbWFjX3JnbWlpX3BvcnRfc3BlZWQoZmVwLT5yZ21paV9kZXYsIGZlcC0+cmdtaWlfaW5wdXQsCisJCQkJCSAgICAgIDEwMCk7CisJCWlmIChmZXAtPnptaWlfZGV2KQorCQkJZW1hY196bWlpX3BvcnRfc3BlZWQoZmVwLT56bWlpX2RldiwgZmVwLT56bWlpX2lucHV0LAorCQkJCQkgICAgIDEwMCk7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTA6CisJZGVmYXVsdDoKKwkJbW9kZV9yZWcgPSAobW9kZV9yZWcgJiB+RU1BQ19NMV9NRl8xMDBNQlBTKSB8IEVNQUNfTTFfUkZTXzRLOworCQlpZiAoZmVwLT5yZ21paV9kZXYpCisJCQllbWFjX3JnbWlpX3BvcnRfc3BlZWQoZmVwLT5yZ21paV9kZXYsIGZlcC0+cmdtaWlfaW5wdXQsCisJCQkJCSAgICAgIDEwKTsKKwkJaWYgKGZlcC0+em1paV9kZXYpCisJCQllbWFjX3ptaWlfcG9ydF9zcGVlZChmZXAtPnptaWlfZGV2LCBmZXAtPnptaWlfaW5wdXQsCisJCQkJCSAgICAgMTApOworCX0KKworCWlmIChmdWxsX2R1cGxleCkKKwkJbW9kZV9yZWcgfD0gRU1BQ19NMV9GREUgfCBFTUFDX00xX0VJRkMgfCBFTUFDX00xX0lTVDsKKwllbHNlCisJCW1vZGVfcmVnICY9IH4oRU1BQ19NMV9GREUgfCBFTUFDX00xX0VJRkMgfCBFTUFDX00xX0lMRSk7CisKKwlMSU5LX0RFQlVHKCgiJXM6IGFkanVzdCB0byBsaW5rLCBzcGVlZDogJWQsIGR1cGxleDogJWQsIG9wZW5lZDogJWRcbiIsCisJCSAgICBmZXAtPm5kZXYtPm5hbWUsIHNwZWVkLCBmdWxsX2R1cGxleCwgZmVwLT5vcGVuZWQpKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBTcGVlZDogJWQsICVzIGR1cGxleC5cbiIsCisJICAgICAgIGZlcC0+bmRldi0+bmFtZSwgc3BlZWQsIGZ1bGxfZHVwbGV4ID8gIkZ1bGwiIDogIkhhbGYiKTsKKwlpZiAoZmVwLT5vcGVuZWQpCisJCW91dF9iZTMyKCZlbWFjcC0+ZW0wbXIxLCBtb2RlX3JlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbWFjX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmRldi0+cHJpdjsKKwllbWFjX3QgKmVtYWNwID0gZmVwLT5lbWFjcDsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwltZW1jcHkobmRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIG5kZXYtPmFkZHJfbGVuKTsKKworCS8qIHNldCB0aGUgaGlnaCBhZGRyZXNzICovCisJb3V0X2JlMzIoJmVtYWNwLT5lbTBpYWhyLAorCQkgKGZlcC0+bmRldi0+ZGV2X2FkZHJbMF0gPDwgOCkgfCBmZXAtPm5kZXYtPmRldl9hZGRyWzFdKTsKKworCS8qIHNldCB0aGUgbG93IGFkZHJlc3MgKi8KKwlvdXRfYmUzMigmZW1hY3AtPmVtMGlhbHIsCisJCSAoZmVwLT5uZGV2LT5kZXZfYWRkclsyXSA8PCAyNCkgfCAoZmVwLT5uZGV2LT5kZXZfYWRkclszXSA8PCAxNikKKwkJIHwgKGZlcC0+bmRldi0+ZGV2X2FkZHJbNF0gPDwgOCkgfCBmZXAtPm5kZXYtPmRldl9hZGRyWzVdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtYWNfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gZGV2LT5wcml2OworCWludCBvbGRfbXR1ID0gZGV2LT5tdHU7CisJdW5zaWduZWQgbG9uZyBtb2RlX3JlZzsKKwllbWFjX3QgKmVtYWNwID0gZmVwLT5lbWFjcDsKKwl1MzIgZW0wbXIwOworCWludCBpLCBmdWxsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKG5ld19tdHUgPCBFTUFDX01JTl9NVFUpIHx8IChuZXdfbXR1ID4gRU1BQ19NQVhfTVRVKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJlbWFjOiBJbnZhbGlkIE1UVSBzZXR0aW5nLCBNVFUgbXVzdCBiZSBiZXR3ZWVuICVkIGFuZCAlZFxuIiwKKwkJICAgICAgIEVNQUNfTUlOX01UVSwgRU1BQ19NQVhfTVRVKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG9sZF9tdHUgIT0gbmV3X210dSAmJiBuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJLyogU3RvcCByeCBlbmdpbmUgKi8KKwkJZW0wbXIwID0gaW5fYmUzMigmZW1hY3AtPmVtMG1yMCk7CisJCW91dF9iZTMyKCZlbWFjcC0+ZW0wbXIwLCBlbTBtcjAgJiB+RU1BQ19NMF9SWEUpOworCisJCS8qIFdhaXQgZm9yIGRlc2NyaXB0b3JzIHRvIGJlIGVtcHR5ICovCisJCWRvIHsKKwkJCWZ1bGwgPSAwOworCQkJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9CVUZGOyBpKyspCisJCQkJaWYgKCEoZmVwLT5yeF9kZXNjW2ldLmN0cmwgJiBNQUxfUlhfQ1RSTF9FTVBUWSkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fTk9USUNFCisJCQkJCSAgICAgICAiZW1hYzogUlggcmluZyBpcyBzdGlsbCBmdWxsXG4iKTsKKwkJCQkJZnVsbCA9IDE7CisJCQkJfQorCQl9IHdoaWxlIChmdWxsKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZmVwLT5sb2NrLCBmbGFncyk7CisKKwkJbWFsX2Rpc2FibGVfcnhfY2hhbm5lbHMoZmVwLT5tYWwsIGZlcC0+Y29tbWFjLnJ4X2NoYW5fbWFzayk7CisKKwkJLyogRGVzdHJveSBhbGwgb2xkIHJ4IHNrYnMgKi8KKwkJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9CVUZGOyBpKyspIHsKKwkJCWRtYV91bm1hcF9zaW5nbGUoJmZlcC0+b2NwZGV2LT5kZXYsCisJCQkJCSBmZXAtPnJ4X2Rlc2NbaV0uZGF0YV9wdHIsCisJCQkJCSBmZXAtPnJ4X2Rlc2NbaV0uZGF0YV9sZW4sCisJCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihmZXAtPnJ4X3NrYltpXSk7CisJCQlmZXAtPnJ4X3NrYltpXSA9IE5VTEw7CisJCX0KKworCQkvKiBTZXQgbmV3IHJ4X2J1ZmZlcl9zaXplLCBqdW1ibyBjYXAsIGFuZCBhZHZlcnRpc2UgbmV3IG10dSAqLworCQltb2RlX3JlZyA9IGluX2JlMzIoJmVtYWNwLT5lbTBtcjEpOworCQlpZiAobmV3X210dSA+IEVORVRfREVGX01UVV9TSVpFKSB7CisJCQltb2RlX3JlZyB8PSBFTUFDX00xX0pVTUJPX0VOQUJMRTsKKwkJCWZlcC0+cnhfYnVmZmVyX3NpemUgPSBFTUFDX01BWF9GUkFNRTsKKwkJfSBlbHNlIHsKKwkJCW1vZGVfcmVnICY9IH5FTUFDX00xX0pVTUJPX0VOQUJMRTsKKwkJCWZlcC0+cnhfYnVmZmVyX3NpemUgPSBFTkVUX0RFRl9CVUZfU0laRTsKKwkJfQorCQlkZXYtPm10dSA9IG5ld19tdHU7CisJCW91dF9iZTMyKCZlbWFjcC0+ZW0wbXIxLCBtb2RlX3JlZyk7CisKKwkJLyogUmUtaW5pdCByeCBza2JzICovCisJCWZlcC0+cnhfc2xvdCA9IDA7CisJCWVtYWNfcnhfZmlsbChkZXYsIDApOworCisJCS8qIFJlc3RhcnQgdGhlIHJ4IGVuZ2luZSAqLworCQltYWxfZW5hYmxlX3J4X2NoYW5uZWxzKGZlcC0+bWFsLCBmZXAtPmNvbW1hYy5yeF9jaGFuX21hc2spOworCQlvdXRfYmUzMigmZW1hY3AtPmVtMG1yMCwgZW0wbXIwIHwgRU1BQ19NMF9SWEUpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2VtYWNfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwllbWFjX3QgKmVtYWNwID0gZmVwLT5lbWFjcDsKKwl1MzIgcm1yID0gaW5fYmUzMigmZW1hY3AtPmVtMHJtcik7CisKKwkvKiBGaXJzdCBjbGVhciBhbGwgc3BlY2lhbCBiaXRzLCB0aGV5IGNhbiBiZSBzZXQgbGF0ZXIgKi8KKwlybXIgJj0gfihFTUFDX1JNUl9QTUUgfCBFTUFDX1JNUl9QTU1FIHwgRU1BQ19STVJfTUFFKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJcm1yIHw9IEVNQUNfUk1SX1BNRTsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgfHwgMzIgPCBkZXYtPm1jX2NvdW50KSB7CisJCS8qCisJCSAqIE11c3QgYmUgc2V0dGluZyB1cCB0byB1c2UgbXVsdGljYXN0CisJCSAqIE5vdyBjaGVjayBmb3IgcHJvbWlzY3VvdXMgbXVsdGljYXN0CisJCSAqLworCQlybXIgfD0gRU1BQ19STVJfUE1NRTsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfTVVMVElDQVNUICYmIDAgPCBkZXYtPm1jX2NvdW50KSB7CisJCXVuc2lnbmVkIHNob3J0IGVtMGdhaHRbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKwkJc3RydWN0IGRldl9tY19saXN0ICpkbWk7CisKKwkJLyogTmVlZCB0byBoYXNoIG9uIHRoZSBtdWx0aWNhc3QgYWRkcmVzcy4gKi8KKwkJZm9yIChkbWkgPSBkZXYtPm1jX2xpc3Q7IGRtaTsgZG1pID0gZG1pLT5uZXh0KSB7CisJCQl1bnNpZ25lZCBsb25nIG1jX2NyYzsKKwkJCXVuc2lnbmVkIGludCBiaXRfbnVtYmVyOworCisJCQltY19jcmMgPSBldGhlcl9jcmMoNiwgKGNoYXIgKilkbWktPmRtaV9hZGRyKTsKKwkJCWJpdF9udW1iZXIgPSA2MyAtIChtY19jcmMgPj4gMjYpOwkvKiBNU0I6IDAgTFNCOiA2MyAqLworCQkJZW0wZ2FodFtiaXRfbnVtYmVyID4+IDRdIHw9CisJCQkgICAgMHg4MDAwID4+IChiaXRfbnVtYmVyICYgMHgwZik7CisJCX0KKwkJZW1hY3AtPmVtMGdhaHQxID0gZW0wZ2FodFswXTsKKwkJZW1hY3AtPmVtMGdhaHQyID0gZW0wZ2FodFsxXTsKKwkJZW1hY3AtPmVtMGdhaHQzID0gZW0wZ2FodFsyXTsKKwkJZW1hY3AtPmVtMGdhaHQ0ID0gZW0wZ2FodFszXTsKKworCQkvKiBUdXJuIG9uIG11bHRpY2FzdCBhZGRyZXNzaW5nICovCisJCXJtciB8PSBFTUFDX1JNUl9NQUU7CisJfQorCW91dF9iZTMyKCZlbWFjcC0+ZW0wcm1yLCBybXIpOworfQorCitzdGF0aWMgaW50IGVtYWNfaW5pdF90YWgoc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCkKK3sKKwl0YWhfdCAqdGFocDsKKworCS8qIEluaXRpYWxpemUgVEFIIGFuZCBlbmFibGUgY2hlY2tzdW0gdmVyaWZpY2F0aW9uICovCisJdGFocCA9ICh0YWhfdCAqKSBpb3JlbWFwKGZlcC0+dGFoX2Rldi0+ZGVmLT5wYWRkciwgc2l6ZW9mKCp0YWhwKSk7CisKKwlpZiAodGFocCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAidGFoJWQ6IENhbm5vdCBpb3JlbWFwIFRBSCByZWdpc3RlcnMhXG4iLAorCQkgICAgICAgZmVwLT50YWhfZGV2LT5kZWYtPmluZGV4KTsKKworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlvdXRfYmUzMigmdGFocC0+dGFoX21yLCBUQUhfTVJfU1IpOworCisJLyogd2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUgKi8KKwl3aGlsZSAoaW5fYmUzMigmdGFocC0+dGFoX21yKSAmIFRBSF9NUl9TUikgOworCisJLyogMTBLQiBUQUggVFggRklGTyBhY2NvbW9kYXRlcyB0aGUgbWF4IE1UVSBvZiA5MDAwICovCisJb3V0X2JlMzIoJnRhaHAtPnRhaF9tciwKKwkJIFRBSF9NUl9DVlIgfCBUQUhfTVJfU1RfNzY4IHwgVEFIX01SX1RGU18xMEtCIHwgVEFIX01SX0RURlAgfAorCQkgVEFIX01SX0RJRyk7CisKKwlpb3VubWFwKCZ0YWhwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbWFjX2luaXRfcmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZXAgPSBkZXYtPnByaXY7CisJaW50IGxvb3A7CisKKwllcC0+dHhfZGVzYyA9IChzdHJ1Y3QgbWFsX2Rlc2NyaXB0b3IgKikoKGNoYXIgKillcC0+bWFsLT50eF92aXJ0X2FkZHIgKworCQkJCQkJKGVwLT5tYWxfdHhfY2hhbiAqCisJCQkJCQkgTUFMX0RUX0FMSUdOKSk7CisJZXAtPnJ4X2Rlc2MgPQorCSAgICAoc3RydWN0IG1hbF9kZXNjcmlwdG9yICopKChjaGFyICopZXAtPm1hbC0+cnhfdmlydF9hZGRyICsKKwkJCQkgICAgICAoZXAtPm1hbF9yeF9jaGFuICogTUFMX0RUX0FMSUdOKSk7CisKKwkvKiBGaWxsIGluIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmcuICovCisJZm9yIChsb29wID0gMDsgbG9vcCA8IE5VTV9UWF9CVUZGOyBsb29wKyspIHsKKwkJaWYgKGVwLT50eF9za2JbbG9vcF0pIHsKKwkJCWRtYV91bm1hcF9zaW5nbGUoJmVwLT5vY3BkZXYtPmRldiwKKwkJCQkJIGVwLT50eF9kZXNjW2xvb3BdLmRhdGFfcHRyLAorCQkJCQkgZXAtPnR4X2Rlc2NbbG9vcF0uZGF0YV9sZW4sCisJCQkJCSBETUFfVE9fREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfaXJxKGVwLT50eF9za2JbbG9vcF0pOworCQl9CisJCWVwLT50eF9za2JbbG9vcF0gPSBOVUxMOworCQllcC0+dHhfZGVzY1tsb29wXS5jdHJsID0gMDsKKwkJZXAtPnR4X2Rlc2NbbG9vcF0uZGF0YV9sZW4gPSAwOworCQllcC0+dHhfZGVzY1tsb29wXS5kYXRhX3B0ciA9IE5VTEw7CisJfQorCWVwLT50eF9kZXNjW2xvb3AgLSAxXS5jdHJsIHw9IE1BTF9UWF9DVFJMX1dSQVA7CisKKwkvKiBGb3JtYXQgdGhlIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nLiAqLworCWVwLT5yeF9zbG90ID0gMDsKKwkvKiBEZWZhdWx0IGlzIE1UVT0xNTAwICsgRXRoZXJuZXQgb3ZlcmhlYWQgKi8KKwllcC0+cnhfYnVmZmVyX3NpemUgPSBkZXYtPm10dSArIEVORVRfSEVBREVSX1NJWkUgKyBFTkVUX0ZDU19TSVpFOworCWVtYWNfcnhfZmlsbChkZXYsIDApOworCWlmIChlcC0+cnhfc2xvdCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBOb3QgZW5vdWdoIG1lbSBmb3IgUnhDaGFpbiBkdXJuaW5nIE9wZW4/XG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJLypXZSBjb3VsZG4ndCBmaWxsIHRoZSByaW5nIGF0IHN0YXJ0dXA/CisJCSAqV2UgY291bGQgY2xlYW4gdXAgYW5kIGZhaWwgdG8gb3BlbiBidXQgcmlnaHQgbm93IHdlIHdpbGwgdHJ5IHRvCisJCSAqY2Fycnkgb24uIEl0IG1heSBiZSBhIHNpZ24gb2YgYSBiYWQgTlVNX1JYX0JVRkYgdmFsdWUKKwkJICovCisJfQorCisJZXAtPnR4X2NudCA9IDA7CisJZXAtPnR4X3Nsb3QgPSAwOworCWVwLT5hY2tfc2xvdCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGVtYWNfcmVzZXRfY29uZmlndXJlKHN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXApCit7CisJZW1hY190ICplbWFjcCA9IGZlcC0+ZW1hY3A7CisJaW50IGk7CisKKwltYWxfZGlzYWJsZV90eF9jaGFubmVscyhmZXAtPm1hbCwgZmVwLT5jb21tYWMudHhfY2hhbl9tYXNrKTsKKwltYWxfZGlzYWJsZV9yeF9jaGFubmVscyhmZXAtPm1hbCwgZmVwLT5jb21tYWMucnhfY2hhbl9tYXNrKTsKKworCS8qCisJICogQ2hlY2sgZm9yIGEgbGluaywgc29tZSBQSFlzIGRvbid0IHByb3ZpZGUgYSBjbG9jayBpZgorCSAqIG5vIGxpbmsgaXMgcHJlc2VudC4gIFNvbWUgRU1BQ3Mgd2lsbCBub3QgY29tZSBvdXQgb2YKKwkgKiBzb2Z0IHJlc2V0IHdpdGhvdXQgYSBQSFkgY2xvY2sgcHJlc2VudC4KKwkgKi8KKwlpZiAoZmVwLT5waHlfbWlpLmRlZi0+b3BzLT5wb2xsX2xpbmsoJmZlcC0+cGh5X21paSkpIHsKKwkJLyogUmVzZXQgdGhlIEVNQUMgKi8KKwkJb3V0X2JlMzIoJmVtYWNwLT5lbTBtcjAsIEVNQUNfTTBfU1JTVCk7CisJCXVkZWxheSgyMCk7CisJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQkJaWYgKChpbl9iZTMyKCZlbWFjcC0+ZW0wbXIwKSAmIEVNQUNfTTBfU1JTVCkgPT0gMCkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxMCk7CisJCX0KKworCQlpZiAoaSA+PSAxMDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCByZXNldCBFTUFDXG4iLAorCQkJICAgICAgIGZlcC0+bmRldi0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBTd2l0Y2ggSVJRcyBvZmYgZm9yIG5vdyAqLworCW91dF9iZTMyKCZlbWFjcC0+ZW0waXNlciwgMCk7CisKKwkvKiBDb25maWd1cmUgTUFMIHJ4IGNoYW5uZWwgKi8KKwltYWxfc2V0X3JjYnMoZmVwLT5tYWwsIGZlcC0+bWFsX3J4X2NoYW4sIERFU0NfQlVGX1NJWkVfUkVHKTsKKworCS8qIHNldCB0aGUgaGlnaCBhZGRyZXNzICovCisJb3V0X2JlMzIoJmVtYWNwLT5lbTBpYWhyLAorCQkgKGZlcC0+bmRldi0+ZGV2X2FkZHJbMF0gPDwgOCkgfCBmZXAtPm5kZXYtPmRldl9hZGRyWzFdKTsKKworCS8qIHNldCB0aGUgbG93IGFkZHJlc3MgKi8KKwlvdXRfYmUzMigmZW1hY3AtPmVtMGlhbHIsCisJCSAoZmVwLT5uZGV2LT5kZXZfYWRkclsyXSA8PCAyNCkgfCAoZmVwLT5uZGV2LT5kZXZfYWRkclszXSA8PCAxNikKKwkJIHwgKGZlcC0+bmRldi0+ZGV2X2FkZHJbNF0gPDwgOCkgfCBmZXAtPm5kZXYtPmRldl9hZGRyWzVdKTsKKworCS8qIEFkanVzdCB0byBsaW5rICovCisJaWYgKG5ldGlmX2NhcnJpZXJfb2soZmVwLT5uZGV2KSkKKwkJZW1hY19hZGp1c3RfdG9fbGluayhmZXApOworCisJLyogZW5hYmxlIGJyb2FkY2FzdC9pbmRpdmlkdWFsIGFkZHJlc3MgYW5kIFJYIEZJRk8gZGVmYXVsdHMgKi8KKwlvdXRfYmUzMigmZW1hY3AtPmVtMHJtciwgRU1BQ19STVJfREVGQVVMVCk7CisKKwkvKiBzZXQgdHJhbnNtaXQgcmVxdWVzdCB0aHJlc2hvbGQgcmVnaXN0ZXIgKi8KKwlvdXRfYmUzMigmZW1hY3AtPmVtMHRydHIsIEVNQUNfVFJUUl9ERUZBVUxUKTsKKworCS8qIFJlY29uZmlndXJlIG11bHRpY2FzdCAqLworCV9fZW1hY19zZXRfbXVsdGljYXN0X2xpc3QoZmVwLT5uZGV2KTsKKworCS8qIFNldCByZWNlaXZlci90cmFuc21pdHRlciBkZWZhdWx0cyAqLworCW91dF9iZTMyKCZlbWFjcC0+ZW0wcndtciwgRU1BQ19SV01SX0RFRkFVTFQpOworCW91dF9iZTMyKCZlbWFjcC0+ZW0wdG1yMCwgRU1BQ19UTVIwX0RFRkFVTFQpOworCW91dF9iZTMyKCZlbWFjcC0+ZW0wdG1yMSwgRU1BQ19UTVIxX0RFRkFVTFQpOworCisJLyogc2V0IGZyYW1lIGdhcCAqLworCW91dF9iZTMyKCZlbWFjcC0+ZW0waXBndnIsIENPTkZJR19JQk1fRU1BQ19GR0FQKTsKKwkKKwkvKiBzZXQgVkxBTiBUYWcgUHJvdG9jb2wgSWRlbnRpZmllciAqLworCW91dF9iZTMyKCZlbWFjcC0+ZW0wdnRwaWQsIDB4ODEwMCk7CisKKwkvKiBJbml0IHJpbmcgYnVmZmVycyAqLworCWVtYWNfaW5pdF9yaW5ncyhmZXAtPm5kZXYpOworfQorCitzdGF0aWMgdm9pZCBlbWFjX2tpY2soc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCkKK3sKKwllbWFjX3QgKmVtYWNwID0gZmVwLT5lbWFjcDsKKwl1bnNpZ25lZCBsb25nIGVtYWNfaWVyOworCisJZW1hY19pZXIgPSBFTUFDX0lTUl9QUCB8IEVNQUNfSVNSX0JQIHwgRU1BQ19JU1JfUlAgfAorCSAgICBFTUFDX0lTUl9TRSB8IEVNQUNfSVNSX1BUTEUgfCBFTUFDX0lTUl9BTEUgfAorCSAgICBFTUFDX0lTUl9CRkNTIHwgRU1BQ19JU1JfT1JFIHwgRU1BQ19JU1JfSVJFOworCisJb3V0X2JlMzIoJmVtYWNwLT5lbTBpc2VyLCBlbWFjX2llcik7CisKKwkvKiBlbmFibGUgYWxsIE1BTCB0cmFuc21pdCBhbmQgcmVjZWl2ZSBjaGFubmVscyAqLworCW1hbF9lbmFibGVfdHhfY2hhbm5lbHMoZmVwLT5tYWwsIGZlcC0+Y29tbWFjLnR4X2NoYW5fbWFzayk7CisJbWFsX2VuYWJsZV9yeF9jaGFubmVscyhmZXAtPm1hbCwgZmVwLT5jb21tYWMucnhfY2hhbl9tYXNrKTsKKworCS8qIHNldCB0cmFuc21pdCBhbmQgcmVjZWl2ZSBlbmFibGUgKi8KKwlvdXRfYmUzMigmZW1hY3AtPmVtMG1yMCwgRU1BQ19NMF9UWEUgfCBFTUFDX00wX1JYRSk7Cit9CisKK3N0YXRpYyB2b2lkCitlbWFjX3N0YXJ0X2xpbmsoc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCwgc3RydWN0IGV0aHRvb2xfY21kICplcCkKK3sKKwl1MzIgYWR2ZXJ0aXNlOworCWludCBhdXRvbmVnOworCWludCBmb3JjZWRfc3BlZWQ7CisJaW50IGZvcmNlZF9kdXBsZXg7CisKKwkvKiBEZWZhdWx0IGFkdmVydGlzZSAqLworCWFkdmVydGlzZSA9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAorCSAgICBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAorCSAgICBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbDsKKwlhdXRvbmVnID0gZmVwLT53YW50X2F1dG9uZWc7CisJZm9yY2VkX3NwZWVkID0gZmVwLT5waHlfbWlpLnNwZWVkOworCWZvcmNlZF9kdXBsZXggPSBmZXAtPnBoeV9taWkuZHVwbGV4OworCisJLyogU2V0dXAgbGluayBwYXJhbWV0ZXJzICovCisJaWYgKGVwKSB7CisJCWlmIChlcC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkJYWR2ZXJ0aXNlID0gZXAtPmFkdmVydGlzaW5nOworCQkJYXV0b25lZyA9IDE7CisJCX0gZWxzZSB7CisJCQlhdXRvbmVnID0gMDsKKwkJCWZvcmNlZF9zcGVlZCA9IGVwLT5zcGVlZDsKKwkJCWZvcmNlZF9kdXBsZXggPSBlcC0+ZHVwbGV4OworCQl9CisJfQorCisJLyogQ29uZmlndXJlIFBIWSAmIHN0YXJ0IGFuZWcgKi8KKwlmZXAtPndhbnRfYXV0b25lZyA9IGF1dG9uZWc7CisJaWYgKGF1dG9uZWcpIHsKKwkJTElOS19ERUJVRygoIiVzOiBzdGFydCBsaW5rIGFuZWcsIGFkdmVydGlzZTogMHgleFxuIiwKKwkJCSAgICBmZXAtPm5kZXYtPm5hbWUsIGFkdmVydGlzZSkpOworCQlmZXAtPnBoeV9taWkuZGVmLT5vcHMtPnNldHVwX2FuZWcoJmZlcC0+cGh5X21paSwgYWR2ZXJ0aXNlKTsKKwl9IGVsc2UgeworCQlMSU5LX0RFQlVHKCgiJXM6IHN0YXJ0IGxpbmsgZm9yY2VkLCBzcGVlZDogJWQsIGR1cGxleDogJWRcbiIsCisJCQkgICAgZmVwLT5uZGV2LT5uYW1lLCBmb3JjZWRfc3BlZWQsIGZvcmNlZF9kdXBsZXgpKTsKKwkJZmVwLT5waHlfbWlpLmRlZi0+b3BzLT5zZXR1cF9mb3JjZWQoJmZlcC0+cGh5X21paSwgZm9yY2VkX3NwZWVkLAorCQkJCQkJICAgIGZvcmNlZF9kdXBsZXgpOworCX0KKwlmZXAtPnRpbWVyX3RpY2tzID0gMDsKKwltb2RfdGltZXIoJmZlcC0+bGlua190aW1lciwgamlmZmllcyArIEhaKTsKK30KKworc3RhdGljIHZvaWQgZW1hY19saW5rX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gKHN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICopZGF0YTsKKwlpbnQgbGluazsKKworCWlmIChmZXAtPmdvaW5nX2F3YXkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnEoJmZlcC0+bG9jayk7CisKKwlsaW5rID0gZmVwLT5waHlfbWlpLmRlZi0+b3BzLT5wb2xsX2xpbmsoJmZlcC0+cGh5X21paSk7CisJTElOS19ERUJVRygoIiVzOiBwb2xsX2xpbms6ICVkXG4iLCBmZXAtPm5kZXYtPm5hbWUsIGxpbmspKTsKKworCWlmIChsaW5rID09IG5ldGlmX2NhcnJpZXJfb2soZmVwLT5uZGV2KSkgeworCQlpZiAoIWxpbmsgJiYgZmVwLT53YW50X2F1dG9uZWcgJiYgKCsrZmVwLT50aW1lcl90aWNrcykgPiAxMCkKKwkJCWVtYWNfc3RhcnRfbGluayhmZXAsIE5VTEwpOworCQlnb3RvIG91dDsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgaXMgJXNcbiIsIGZlcC0+bmRldi0+bmFtZSwKKwkgICAgICAgbGluayA/ICJVcCIgOiAiRG93biIpOworCWlmIChsaW5rKSB7CisJCW5ldGlmX2NhcnJpZXJfb24oZmVwLT5uZGV2KTsKKwkJLyogQ2hpcCBuZWVkcyBhIGZ1bGwgcmVzZXQgb24gY29uZmlnIGNoYW5nZS4gVGhhdCBzdWNrcywgc28gSQorCQkgKiBzaG91bGQgdWx0aW1hdGVseSBtb3ZlIHRoYXQgdG8gc29tZSB0YXNrbGV0IHRvIGxpbWl0CisJCSAqIGxhdGVuY3kgcGVha3MgY2F1c2VkIGJ5IHRoaXMgY29kZQorCQkgKi8KKwkJZW1hY19yZXNldF9jb25maWd1cmUoZmVwKTsKKwkJaWYgKGZlcC0+b3BlbmVkKQorCQkJZW1hY19raWNrKGZlcCk7CisJfSBlbHNlIHsKKwkJZmVwLT50aW1lcl90aWNrcyA9IDA7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGZlcC0+bmRldik7CisJfQorICAgICAgb3V0OgorCW1vZF90aW1lcigmZmVwLT5saW5rX3RpbWVyLCBqaWZmaWVzICsgSFopOworCXNwaW5fdW5sb2NrX2lycSgmZmVwLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZW1hY19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gZGV2LT5wcml2OworCisJc3Bpbl9sb2NrX2lycSgmZmVwLT5sb2NrKTsKKwlfX2VtYWNfc2V0X211bHRpY2FzdF9saXN0KGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZmZXAtPmxvY2spOworfQorCitzdGF0aWMgaW50IGVtYWNfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmRldi0+cHJpdjsKKworCWNtZC0+c3VwcG9ydGVkID0gZmVwLT5waHlfbWlpLmRlZi0+ZmVhdHVyZXM7CisJY21kLT5wb3J0ID0gUE9SVF9NSUk7CisJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisJY21kLT5waHlfYWRkcmVzcyA9IGZlcC0+bWlpX3BoeV9hZGRyOworCXNwaW5fbG9ja19pcnEoJmZlcC0+bG9jayk7CisJY21kLT5hdXRvbmVnID0gZmVwLT53YW50X2F1dG9uZWc7CisJY21kLT5zcGVlZCA9IGZlcC0+cGh5X21paS5zcGVlZDsKKwljbWQtPmR1cGxleCA9IGZlcC0+cGh5X21paS5kdXBsZXg7CisJc3Bpbl91bmxvY2tfaXJxKCZmZXAtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtYWNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZlYXR1cmVzID0gZmVwLT5waHlfbWlpLmRlZi0+ZmVhdHVyZXM7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRU5BQkxFICYmIGNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0RJU0FCTEUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUgJiYgY21kLT5hZHZlcnRpc2luZyA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY21kLT5kdXBsZXggIT0gRFVQTEVYX0hBTEYgJiYgY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKQorCQlzd2l0Y2ggKGNtZC0+c3BlZWQpIHsKKwkJY2FzZSBTUEVFRF8xMDoKKwkJCWlmIChjbWQtPmR1cGxleCA9PSBEVVBMRVhfSEFMRiAmJgorCQkJICAgIChmZWF0dXJlcyAmIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYpID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwgJiYKKwkJCSAgICAoZmVhdHVyZXMgJiBTVVBQT1JURURfMTBiYXNlVF9GdWxsKSA9PSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMTAwOgorCQkJaWYgKGNtZC0+ZHVwbGV4ID09IERVUExFWF9IQUxGICYmCisJCQkgICAgKGZlYXR1cmVzICYgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYpID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwgJiYKKwkJCSAgICAoZmVhdHVyZXMgJiBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCkgPT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMDA6CisJCQlpZiAoY21kLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYgJiYKKwkJCSAgICAoZmVhdHVyZXMgJiBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYpID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwgJiYKKwkJCSAgICAoZmVhdHVyZXMgJiBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoKGZlYXR1cmVzICYgU1VQUE9SVEVEX0F1dG9uZWcpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCXNwaW5fbG9ja19pcnEoJmZlcC0+bG9jayk7CisJZW1hY19zdGFydF9saW5rKGZlcCwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJmZlcC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitlbWFjX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBuZGV2LT5wcml2OworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJaW5mby0+ZndfdmVyc2lvblswXSA9ICdcMCc7CisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIklCTSBFTUFDICVkIiwgZmVwLT5vY3BkZXYtPmRlZi0+aW5kZXgpOworCWluZm8tPnJlZ2R1bXBfbGVuID0gMDsKK30KKworc3RhdGljIGludCBlbWFjX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IG5kZXYtPnByaXY7CisKKwlpZiAoIWZlcC0+d2FudF9hdXRvbmVnKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzcGluX2xvY2tfaXJxKCZmZXAtPmxvY2spOworCWVtYWNfc3RhcnRfbGluayhmZXAsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycSgmZmVwLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBlbWFjX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXJldHVybiBuZXRpZl9jYXJyaWVyX29rKG5kZXYpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGVtYWNfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncyA9IGVtYWNfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBlbWFjX3NldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8gPSBlbWFjX2dldF9kcnZpbmZvLAorCS5ud2F5X3Jlc2V0ID0gZW1hY19ud2F5X3Jlc2V0LAorCS5nZXRfbGluayA9IGVtYWNfZ2V0X2xpbmsKK307CisKK3N0YXRpYyBpbnQgZW1hY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBkZXYtPnByaXY7CisJdWludCAqZGF0YSA9ICh1aW50ICopICYgcnEtPmlmcl9pZnJ1OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCQlkYXRhWzBdID0gZmVwLT5taWlfcGh5X2FkZHI7CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCWNhc2UgU0lPQ0dNSUlSRUc6CisJCWRhdGFbM10gPSBlbWFjX3BoeV9yZWFkKGRldiwgZmVwLT5taWlfcGh5X2FkZHIsIGRhdGFbMV0pOworCQlyZXR1cm4gMDsKKwljYXNlIFNJT0NTTUlJUkVHOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWVtYWNfcGh5X3dyaXRlKGRldiwgZmVwLT5taWlfcGh5X2FkZHIsIGRhdGFbMV0sIGRhdGFbMl0pOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgaW50IGVtYWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBkZXYtPnByaXY7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmZmVwLT5sb2NrKTsKKworCWZlcC0+b3BlbmVkID0gMTsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJLyogUmVzZXQgJiBjb25maWd1cmUgdGhlIGNoaXAgKi8KKwllbWFjX3Jlc2V0X2NvbmZpZ3VyZShmZXApOworCisJc3Bpbl91bmxvY2tfaXJxKCZmZXAtPmxvY2spOworCisJLyogUmVxdWVzdCBvdXIgaW50ZXJydXB0IGxpbmVzICovCisJcmMgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZW1hY19tYWNfaXJxLCAwLCAiSUJNIEVNQUMgTUFDIiwgZGV2KTsKKwlpZiAocmMgIT0gMCkgeworCQlwcmludGsoImRldi0+aXJxICVkIGZhaWxlZFxuIiwgZGV2LT5pcnEpOworCQlnb3RvIGJhaWw7CisJfQorCS8qIEtpY2sgdGhlIGNoaXAgcnggJiB0eCBjaGFubmVscyBpbnRvIGxpZmUgKi8KKwlzcGluX2xvY2tfaXJxKCZmZXAtPmxvY2spOworCWVtYWNfa2ljayhmZXApOworCXNwaW5fdW5sb2NrX2lycSgmZmVwLT5sb2NrKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgICBiYWlsOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbWFjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwllbWFjX3QgKmVtYWNwID0gZmVwLT5lbWFjcDsKKworCS8qIFhYWCBTdG9wIElSUSBlbWl0dGluZyBoZXJlICovCisJc3Bpbl9sb2NrX2lycSgmZmVwLT5sb2NrKTsKKwlmZXAtPm9wZW5lZCA9IDA7CisJbWFsX2Rpc2FibGVfdHhfY2hhbm5lbHMoZmVwLT5tYWwsIGZlcC0+Y29tbWFjLnR4X2NoYW5fbWFzayk7CisJbWFsX2Rpc2FibGVfcnhfY2hhbm5lbHMoZmVwLT5tYWwsIGZlcC0+Y29tbWFjLnJ4X2NoYW5fbWFzayk7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKgorCSAqIENoZWNrIGZvciBhIGxpbmssIHNvbWUgUEhZcyBkb24ndCBwcm92aWRlIGEgY2xvY2sgaWYKKwkgKiBubyBsaW5rIGlzIHByZXNlbnQuICBTb21lIEVNQUNzIHdpbGwgbm90IGNvbWUgb3V0IG9mCisJICogc29mdCByZXNldCB3aXRob3V0IGEgUEhZIGNsb2NrIHByZXNlbnQuCisJICovCisJaWYgKGZlcC0+cGh5X21paS5kZWYtPm9wcy0+cG9sbF9saW5rKCZmZXAtPnBoeV9taWkpKSB7CisJCW91dF9iZTMyKCZlbWFjcC0+ZW0wbXIwLCBFTUFDX00wX1NSU1QpOworCQl1ZGVsYXkoMTApOworCisJCWlmIChlbWFjcC0+ZW0wbXIwICYgRU1BQ19NMF9TUlNUKSB7CisJCQkvKm5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZSBob3BlZnVsbHkgaXQgY2xlYXJzIGJlZm9yZSBhbm90aGVyIG9wZW4gKi8KKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogUGh5IFNvZnRSZXNldCBkaWRuJ3QgY2xlYXIsIG5vIGxpbms/XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCX0KKwl9CisKKwkvKiBGcmVlIHRoZSBpcnEncyAqLworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZmZXAtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVtYWNfcmVtb3ZlKHN0cnVjdCBvY3BfZGV2aWNlICpvY3BkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG9jcF9nZXRfZHJ2ZGF0YShvY3BkZXYpOworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICplcCA9IGRldi0+cHJpdjsKKworCS8qIEZJWE1FOiBsb2NraW5nLCByYWNlcywgLi4uICovCisJZXAtPmdvaW5nX2F3YXkgPSAxOworCW9jcF9zZXRfZHJ2ZGF0YShvY3BkZXYsIE5VTEwpOworCWlmIChlcC0+cmdtaWlfZGV2KQorCQllbWFjX2Nsb3NlX3JnbWlpKGVwLT5yZ21paV9kZXYpOworCWlmIChlcC0+em1paV9kZXYpCisJCWVtYWNfY2xvc2Vfem1paShlcC0+em1paV9kZXYpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlkZWxfdGltZXJfc3luYygmZXAtPmxpbmtfdGltZXIpOworCW1hbF91bnJlZ2lzdGVyX2NvbW1hYyhlcC0+bWFsLCAmZXAtPmNvbW1hYyk7CisJaW91bm1hcCgodm9pZCAqKWVwLT5lbWFjcCk7CisJa2ZyZWUoZGV2KTsKK30KKworc3RydWN0IG1hbF9jb21tYWNfb3BzIGVtYWNfY29tbWFjX29wcyA9IHsKKwkudHhlb2IgPSAmZW1hY190eGVvYl9kZXYsCisJLnR4ZGUgPSAmZW1hY190eGRlX2RldiwKKwkucnhlb2IgPSAmZW1hY19yeGVvYl9kZXYsCisJLnJ4ZGUgPSAmZW1hY19yeGRlX2RldiwKK307CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIGludCBlbWFjX25ldHBvbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJZW1hY19yeGVvYl9kZXYoKHZvaWQgKiluZGV2LCAwKTsKKwllbWFjX3R4ZW9iX2Rldigodm9pZCAqKW5kZXYsIDApOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZW1hY19pbml0X2RldmljZShzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwZGV2LCBzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbCkKK3sKKwlpbnQgZGVmZXJyZWRfaW5pdCA9IDA7CisJaW50IHJjID0gMCwgaTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZXA7CisJc3RydWN0IG9jcF9mdW5jX2VtYWNfZGF0YSAqZW1hY2RhdGE7CisJaW50IGNvbW1hY19yZWcgPSAwOworCXUzMiBwaHlfbWFwOworCisJZW1hY2RhdGEgPSAoc3RydWN0IG9jcF9mdW5jX2VtYWNfZGF0YSAqKW9jcGRldi0+ZGVmLT5hZGRpdGlvbnM7CisJaWYgKCFlbWFjZGF0YSkgeworCQlwcmludGsoS0VSTl9FUlIgImVtYWMlZDogTWlzc2luZyBhZGRpdGlvbmFsIGRhdGEhXG4iLAorCQkgICAgICAgb2NwZGV2LT5kZWYtPmluZGV4KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogQWxsb2NhdGUgb3VyIG5ldF9kZXZpY2Ugc3RydWN0dXJlICovCisJbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSkpOworCWlmIChuZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiZW1hYyVkOiBDb3VsZCBub3QgYWxsb2NhdGUgZXRoZXJuZXQgZGV2aWNlLlxuIiwKKwkJICAgICAgIG9jcGRldi0+ZGVmLT5pbmRleCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwllcCA9IG5kZXYtPnByaXY7CisJZXAtPm5kZXYgPSBuZGV2OworCWVwLT5vY3BkZXYgPSBvY3BkZXY7CisJbmRldi0+aXJxID0gb2NwZGV2LT5kZWYtPmlycTsKKwllcC0+d29sX2lycSA9IGVtYWNkYXRhLT53b2xfaXJxOworCWlmIChlbWFjZGF0YS0+bWRpb19pZHggPj0gMCkgeworCQlpZiAoZW1hY2RhdGEtPm1kaW9faWR4ID09IG9jcGRldi0+ZGVmLT5pbmRleCkgeworCQkJLyogU2V0IHRoZSBjb21tb24gTURJTyBuZXRfZGV2aWNlICovCisJCQltZGlvX25kZXYgPSBuZGV2OworCQkJZGVmZXJyZWRfaW5pdCA9IDE7CisJCX0KKwkJZXAtPm1kaW9fZGV2ID0gbWRpb19uZGV2OworCX0gZWxzZSB7CisJCWVwLT5tZGlvX2RldiA9IG5kZXY7CisJfQorCisJb2NwX3NldF9kcnZkYXRhKG9jcGRldiwgbmRldik7CisKKwlzcGluX2xvY2tfaW5pdCgmZXAtPmxvY2spOworCisJLyogRmlsbCBvdXQgTUFMIGluZm9ybWF0aW9ucyBhbmQgcmVnaXN0ZXIgY29tbWFjICovCisJZXAtPm1hbCA9IG1hbDsKKwllcC0+bWFsX3R4X2NoYW4gPSBlbWFjZGF0YS0+bWFsX3R4X2NoYW47CisJZXAtPm1hbF9yeF9jaGFuID0gZW1hY2RhdGEtPm1hbF9yeF9jaGFuOworCWVwLT5jb21tYWMub3BzID0gJmVtYWNfY29tbWFjX29wczsKKwllcC0+Y29tbWFjLmRldiA9IG5kZXY7CisJZXAtPmNvbW1hYy50eF9jaGFuX21hc2sgPSBNQUxfQ0hBTl9NQVNLKGVwLT5tYWxfdHhfY2hhbik7CisJZXAtPmNvbW1hYy5yeF9jaGFuX21hc2sgPSBNQUxfQ0hBTl9NQVNLKGVwLT5tYWxfcnhfY2hhbik7CisJcmMgPSBtYWxfcmVnaXN0ZXJfY29tbWFjKGVwLT5tYWwsICZlcC0+Y29tbWFjKTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBiYWlsOworCWNvbW1hY19yZWcgPSAxOworCisJLyogTWFwIG91ciBNTUlPcyAqLworCWVwLT5lbWFjcCA9IChlbWFjX3QgKikgaW9yZW1hcChvY3BkZXYtPmRlZi0+cGFkZHIsIHNpemVvZihlbWFjX3QpKTsKKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gYXR0YWNoIHRvIGEgWk1JSSAqLworCWlmIChlbWFjZGF0YS0+em1paV9pZHggPj0gMCkgeworCQllcC0+em1paV9pbnB1dCA9IGVtYWNkYXRhLT56bWlpX211eDsKKwkJZXAtPnptaWlfZGV2ID0KKwkJICAgIG9jcF9maW5kX2RldmljZShPQ1BfQU5ZX0lELCBPQ1BfRlVOQ19aTUlJLAorCQkJCSAgICBlbWFjZGF0YS0+em1paV9pZHgpOworCQlpZiAoZXAtPnptaWlfZGV2ID09IE5VTEwpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImVtYWMlZDogWk1JSSAlZCByZXF1ZXN0ZWQgYnV0IG5vdCBmb3VuZCAhXG4iLAorCQkJICAgICAgIG9jcGRldi0+ZGVmLT5pbmRleCwgZW1hY2RhdGEtPnptaWlfaWR4KTsKKwkJZWxzZSBpZiAoKHJjID0KKwkJCSAgZW1hY19pbml0X3ptaWkoZXAtPnptaWlfZGV2LCBlcC0+em1paV9pbnB1dCwKKwkJCQkJIGVtYWNkYXRhLT5waHlfbW9kZSkpICE9IDApCisJCQlnb3RvIGJhaWw7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBhdHRhY2ggdG8gYSBSR01JSSAqLworCWlmIChlbWFjZGF0YS0+cmdtaWlfaWR4ID49IDApIHsKKwkJZXAtPnJnbWlpX2lucHV0ID0gZW1hY2RhdGEtPnJnbWlpX211eDsKKwkJZXAtPnJnbWlpX2RldiA9CisJCSAgICBvY3BfZmluZF9kZXZpY2UoT0NQX0FOWV9JRCwgT0NQX0ZVTkNfUkdNSUksCisJCQkJICAgIGVtYWNkYXRhLT5yZ21paV9pZHgpOworCQlpZiAoZXAtPnJnbWlpX2RldiA9PSBOVUxMKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJlbWFjJWQ6IFJHTUlJICVkIHJlcXVlc3RlZCBidXQgbm90IGZvdW5kICFcbiIsCisJCQkgICAgICAgb2NwZGV2LT5kZWYtPmluZGV4LCBlbWFjZGF0YS0+cmdtaWlfaWR4KTsKKwkJZWxzZSBpZiAoKHJjID0KKwkJCSAgZW1hY19pbml0X3JnbWlpKGVwLT5yZ21paV9kZXYsIGVwLT5yZ21paV9pbnB1dCwKKwkJCQkJICBlbWFjZGF0YS0+cGh5X21vZGUpKSAhPSAwKQorCQkJZ290byBiYWlsOworCX0KKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gYXR0YWNoIHRvIGEgVEFIICovCisJaWYgKGVtYWNkYXRhLT50YWhfaWR4ID49IDApIHsKKwkJZXAtPnRhaF9kZXYgPQorCQkgICAgb2NwX2ZpbmRfZGV2aWNlKE9DUF9BTllfSUQsIE9DUF9GVU5DX1RBSCwKKwkJCQkgICAgZW1hY2RhdGEtPnRhaF9pZHgpOworCQlpZiAoZXAtPnRhaF9kZXYgPT0gTlVMTCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiZW1hYyVkOiBUQUggJWQgcmVxdWVzdGVkIGJ1dCBub3QgZm91bmQgIVxuIiwKKwkJCSAgICAgICBvY3BkZXYtPmRlZi0+aW5kZXgsIGVtYWNkYXRhLT50YWhfaWR4KTsKKwkJZWxzZSBpZiAoKHJjID0gZW1hY19pbml0X3RhaChlcCkpICE9IDApCisJCQlnb3RvIGJhaWw7CisJfQorCisJaWYgKGRlZmVycmVkX2luaXQpIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZlbWFjX2luaXRfbGlzdCkpIHsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCQkJc3RydWN0IGVtYWNfZGVmX2RldiAqZGRldjsKKworCQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmVtYWNfaW5pdF9saXN0KSB7CisJCQkJZGRldiA9CisJCQkJICAgIGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbWFjX2RlZl9kZXYsCisJCQkJCSAgICAgICBsaW5rKTsKKwkJCQllbWFjX2luaXRfZGV2aWNlKGRkZXYtPm9jcGRldiwgZGRldi0+bWFsKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIEluaXQgbGluayBtb25pdG9yaW5nIHRpbWVyICovCisJaW5pdF90aW1lcigmZXAtPmxpbmtfdGltZXIpOworCWVwLT5saW5rX3RpbWVyLmZ1bmN0aW9uID0gZW1hY19saW5rX3RpbWVyOworCWVwLT5saW5rX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyllcDsKKwllcC0+dGltZXJfdGlja3MgPSAwOworCisJLyogRmlsbCB1cCB0aGUgbWlpX3BoeSBzdHJ1Y3R1cmUgKi8KKwllcC0+cGh5X21paS5kZXYgPSBuZGV2OworCWVwLT5waHlfbWlpLm1kaW9fcmVhZCA9IGVtYWNfcGh5X3JlYWQ7CisJZXAtPnBoeV9taWkubWRpb193cml0ZSA9IGVtYWNfcGh5X3dyaXRlOworCWVwLT5waHlfbWlpLm1vZGUgPSBlbWFjZGF0YS0+cGh5X21vZGU7CisKKwkvKiBGaW5kIFBIWSAqLworCXBoeV9tYXAgPSBlbWFjZGF0YS0+cGh5X21hcCB8IGJ1c3lfcGh5X21hcDsKKwlmb3IgKGkgPSAwOyBpIDw9IDB4MWY7IGkrKywgcGh5X21hcCA+Pj0gMSkgeworCQlpZiAoKHBoeV9tYXAgJiAweDEpID09IDApIHsKKwkJCWludCB2YWwgPSBlbWFjX3BoeV9yZWFkKG5kZXYsIGksIE1JSV9CTUNSKTsKKwkJCWlmICh2YWwgIT0gMHhmZmZmICYmIHZhbCAhPSAtMSkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSAweDIwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVtYWMlZDogQ2FuJ3QgZmluZCBQSFkuXG4iLAorCQkgICAgICAgb2NwZGV2LT5kZWYtPmluZGV4KTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGJhaWw7CisJfQorCWJ1c3lfcGh5X21hcCB8PSAxIDw8IGk7CisJZXAtPm1paV9waHlfYWRkciA9IGk7CisJcmMgPSBtaWlfcGh5X3Byb2JlKCZlcC0+cGh5X21paSwgaSk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVtYWMlZDogRmFpbGVkIHRvIHByb2JlIFBIWSB0eXBlLlxuIiwKKwkJICAgICAgIG9jcGRldi0+ZGVmLT5pbmRleCk7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBiYWlsOworCX0KKworCS8qIFNldHVwIGluaXRpYWwgUEhZIGNvbmZpZyAmIHN0YXJ0dXAgYW5lZyAqLworCWlmIChlcC0+cGh5X21paS5kZWYtPm9wcy0+aW5pdCkKKwkJZXAtPnBoeV9taWkuZGVmLT5vcHMtPmluaXQoJmVwLT5waHlfbWlpKTsKKwluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKKwlpZiAoZXAtPnBoeV9taWkuZGVmLT5mZWF0dXJlcyAmIFNVUFBPUlRFRF9BdXRvbmVnKQorCQllcC0+d2FudF9hdXRvbmVnID0gMTsKKwllbWFjX3N0YXJ0X2xpbmsoZXAsIE5VTEwpOworCisJLyogcmVhZCB0aGUgTUFDIEFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQluZGV2LT5kZXZfYWRkcltpXSA9IGVtYWNkYXRhLT5tYWNfYWRkcltpXTsKKworCS8qIEZpbGwgaW4gdGhlIGRyaXZlciBmdW5jdGlvbiB0YWJsZSAqLworCW5kZXYtPm9wZW4gPSAmZW1hY19vcGVuOworCW5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZlbWFjX3N0YXJ0X3htaXQ7CisJbmRldi0+c3RvcCA9ICZlbWFjX2Nsb3NlOworCW5kZXYtPmdldF9zdGF0cyA9ICZlbWFjX3N0YXRzOworCWlmIChlbWFjZGF0YS0+anVtYm8pCisJCW5kZXYtPmNoYW5nZV9tdHUgPSAmZW1hY19jaGFuZ2VfbXR1OworCW5kZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZlbWFjX3NldF9tYWNfYWRkcmVzczsKKwluZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmZW1hY19zZXRfbXVsdGljYXN0X2xpc3Q7CisJbmRldi0+ZG9faW9jdGwgPSAmZW1hY19pb2N0bDsKKwlTRVRfRVRIVE9PTF9PUFMobmRldiwgJmVtYWNfZXRodG9vbF9vcHMpOworCWlmIChlbWFjZGF0YS0+dGFoX2lkeCA+PSAwKQorCQluZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfU0c7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwluZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlbWFjX25ldHBvbGw7CisjZW5kaWYKKworCVNFVF9NT0RVTEVfT1dORVIobmRldik7CisKKwlyYyA9IHJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBiYWlsOworCisJcHJpbnRrKCIlczogSUJNIGVtYWMsIE1BQyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgbmRldi0+bmFtZSwKKwkgICAgICAgbmRldi0+ZGV2X2FkZHJbMF0sIG5kZXYtPmRldl9hZGRyWzFdLCBuZGV2LT5kZXZfYWRkclsyXSwKKwkgICAgICAgbmRldi0+ZGV2X2FkZHJbM10sIG5kZXYtPmRldl9hZGRyWzRdLCBuZGV2LT5kZXZfYWRkcls1XSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZvdW5kICVzIFBIWSAoMHglMDJ4KVxuIiwKKwkgICAgICAgbmRldi0+bmFtZSwgZXAtPnBoeV9taWkuZGVmLT5uYW1lLCBlcC0+bWlpX3BoeV9hZGRyKTsKKworICAgICAgYmFpbDoKKwlpZiAocmMgJiYgY29tbWFjX3JlZykKKwkJbWFsX3VucmVnaXN0ZXJfY29tbWFjKGVwLT5tYWwsICZlcC0+Y29tbWFjKTsKKwlpZiAocmMgJiYgbmRldikKKwkJa2ZyZWUobmRldik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZW1hY19wcm9iZShzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwZGV2KQoreworCXN0cnVjdCBvY3BfZGV2aWNlICptYWxkZXY7CisJc3RydWN0IGlibV9vY3BfbWFsICptYWw7CisJc3RydWN0IG9jcF9mdW5jX2VtYWNfZGF0YSAqZW1hY2RhdGE7CisKKwllbWFjZGF0YSA9IChzdHJ1Y3Qgb2NwX2Z1bmNfZW1hY19kYXRhICopb2NwZGV2LT5kZWYtPmFkZGl0aW9uczsKKwlpZiAoZW1hY2RhdGEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImVtYWMlZDogTWlzc2luZyBhZGRpdGlvbmFsIGRhdGFzICFcbiIsCisJCSAgICAgICBvY3BkZXYtPmRlZi0+aW5kZXgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBHZXQgdGhlIE1BTCBkZXZpY2UgICovCisJbWFsZGV2ID0gb2NwX2ZpbmRfZGV2aWNlKE9DUF9BTllfSUQsIE9DUF9GVU5DX01BTCwgZW1hY2RhdGEtPm1hbF9pZHgpOworCWlmIChtYWxkZXYgPT0gTlVMTCkgeworCQlwcmludGsoIk5vIG1hbGRldlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKgorCSAqIEdldCBNQUwgZHJpdmVyIGRhdGEsIGl0IG11c3QgYmUgaGVyZSBkdWUgdG8gbGluayBvcmRlci4KKwkgKiBXaGVuIHRoZSBkcml2ZXIgaXMgbW9kdWxhcml6ZWQsIHN5bWJvbCBkZXBlbmRlbmNpZXMgd2lsbAorCSAqIGVuc3VyZSB0aGUgTUFMIGRyaXZlciBpcyBhbHJlYWR5IHByZXNlbnQgaWYgYnVpbHQgYXMgYQorCSAqIG1vZHVsZS4KKwkgKi8KKwltYWwgPSAoc3RydWN0IGlibV9vY3BfbWFsICopb2NwX2dldF9kcnZkYXRhKG1hbGRldik7CisJaWYgKG1hbCA9PSBOVUxMKSB7CisJCXByaW50aygiTm8gbWFsZHJ2XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogSWYgd2UgZGVwZW5kIG9uIGFub3RoZXIgRU1BQyBmb3IgTURJTywgd2FpdCBmb3IgaXQgdG8gc2hvdyB1cCAqLworCWlmIChlbWFjZGF0YS0+bWRpb19pZHggPj0gMCAmJgorCSAgICAoZW1hY2RhdGEtPm1kaW9faWR4ICE9IG9jcGRldi0+ZGVmLT5pbmRleCkgJiYgIW1kaW9fbmRldikgeworCQlzdHJ1Y3QgZW1hY19kZWZfZGV2ICpkZGV2OworCQkvKiBBZGQgdGhpcyBpbmRleCB0byB0aGUgZGVmZXJyZWQgaW5pdCB0YWJsZSAqLworCQlkZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVtYWNfZGVmX2RldiksIEdGUF9LRVJORUwpOworCQlkZGV2LT5vY3BkZXYgPSBvY3BkZXY7CisJCWRkZXYtPm1hbCA9IG1hbDsKKwkJbGlzdF9hZGRfdGFpbCgmZGRldi0+bGluaywgJmVtYWNfaW5pdF9saXN0KTsKKwl9IGVsc2UgeworCQllbWFjX2luaXRfZGV2aWNlKG9jcGRldiwgbWFsKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogU3RydWN0dXJlIGZvciBhIGRldmljZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2NwX2RldmljZV9pZCBlbWFjX2lkc1tdID0geworCXsudmVuZG9yID0gT0NQX0FOWV9JRCwuZnVuY3Rpb24gPSBPQ1BfRlVOQ19FTUFDfSwKKwl7LnZlbmRvciA9IE9DUF9WRU5ET1JfSU5WQUxJRH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2NwX2RyaXZlciBlbWFjX2RyaXZlciA9IHsKKwkubmFtZSA9ICJlbWFjIiwKKwkuaWRfdGFibGUgPSBlbWFjX2lkcywKKworCS5wcm9iZSA9IGVtYWNfcHJvYmUsCisJLnJlbW92ZSA9IGVtYWNfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZW1hY19pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiAiIERSVl9ERVNDICIsIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJNYWludGFpbmVkIGJ5ICIgRFJWX0FVVEhPUiAiXG4iKTsKKworCWlmIChza2JfcmVzID4gMikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbnZhbGlkIHNrYl9yZXM6ICVkLCBjcm9wcGluZyB0byAyXG4iLAorCQkgICAgICAgc2tiX3Jlcyk7CisJCXNrYl9yZXMgPSAyOworCX0KKworCXJldHVybiBvY3BfcmVnaXN0ZXJfZHJpdmVyKCZlbWFjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlbWFjX2V4aXQodm9pZCkKK3sKKwlvY3BfdW5yZWdpc3Rlcl9kcml2ZXIoJmVtYWNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZW1hY19pbml0KTsKK21vZHVsZV9leGl0KGVtYWNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmggYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlNmUxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX2NvcmUuaApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIGlibV9lbWFjX2NvcmUuaAorICoKKyAqIEV0aGVybmV0IGRyaXZlciBmb3IgdGhlIGJ1aWx0IGluIGV0aGVybmV0IG9uIHRoZSBJQk0gNDA1IFBvd2VyUEMKKyAqIHByb2Nlc3Nvci4KKyAqCisgKiAgICAgIEFybWluIEt1c3RlciBha3VzdGVyQG12aXN0YS5jb20KKyAqICAgICAgU2VwdCwgMjAwMQorICoKKyAqICAgICAgT3JpZ25pYWwgZHJpdmVyCisgKiAgICAgICAgIEpvaG5uaWUgUGV0ZXJzCisgKiAgICAgICAgIGpwZXRlcnNAbXZpc3RhLmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAwIE1vbnRhVmlzdGEgU29mdGFyZSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9JQk1fRU1BQ19DT1JFX0hfCisjZGVmaW5lIF9JQk1fRU1BQ19DT1JFX0hfCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vb2NwLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgkJLyogRm9yIHBoeXNfYWRkcl90ICovCisKKyNpbmNsdWRlICJpYm1fZW1hYy5oIgorI2luY2x1ZGUgImlibV9lbWFjX3BoeS5oIgorI2luY2x1ZGUgImlibV9lbWFjX3JnbWlpLmgiCisjaW5jbHVkZSAiaWJtX2VtYWNfem1paS5oIgorI2luY2x1ZGUgImlibV9lbWFjX21hbC5oIgorI2luY2x1ZGUgImlibV9lbWFjX3RhaC5oIgorCisjaWZuZGVmIENPTkZJR19JQk1fRU1BQ19UWEIKKyNkZWZpbmUgTlVNX1RYX0JVRkYJCTY0CisjZGVmaW5lIE5VTV9SWF9CVUZGCQk2NAorI2Vsc2UKKyNkZWZpbmUgTlVNX1RYX0JVRkYJCUNPTkZJR19JQk1fRU1BQ19UWEIKKyNkZWZpbmUgTlVNX1JYX0JVRkYJCUNPTkZJR19JQk1fRU1BQ19SWEIKKyNlbmRpZgorCisvKiBUaGlzIGRvZXMgMTYgYnl0ZSBhbGlnbm1lbnQsIGV4YWN0bHkgd2hhdCB3ZSBuZWVkLgorICogVGhlIHBhY2tldCBsZW5ndGggaW5jbHVkZXMgRkNTLCBidXQgd2UgZG9uJ3Qgd2FudCB0bworICogaW5jbHVkZSB0aGF0IHdoZW4gcGFzc2luZyB1cHN0cmVhbSBhcyBpdCBtZXNzZXMgdXAKKyAqIGJyaWRnaW5nIGFwcGxpY2F0aW9ucy4KKyAqLworI2lmbmRlZiBDT05GSUdfSUJNX0VNQUNfU0tCUkVTCisjZGVmaW5lIFNLQl9SRVMgMgorI2Vsc2UKKyNkZWZpbmUgU0tCX1JFUyBDT05GSUdfSUJNX0VNQUNfU0tCUkVTCisjZW5kaWYKKworLyogTm90ZSBhYm91dCBhbGlnbmVtZW50LiBhbGxvY19za2IoKSByZXR1cm5zIGEgY2FjaGUgbGluZQorICogYWxpZ25lZCBidWZmZXIuIEhvd2V2ZXIsIGRldl9hbGxvY19za2IoKSB3aWxsIGFkZCAxNiBtb3JlCisgKiBieXRlcyBhbmQgInJlc2VydmUiIHRoZW0sIHNvIG91ciBidWZmZXIgd2lsbCBhY3R1YWxseSBlbmQKKyAqIG9uIGEgaGFsZiBjYWNoZSBsaW5lLiBXaGF0IHdlIGRvIGlzIHRvIHVzZSBkaXJlY3RseQorICogYWxsb2Nfc2tiLCBhbGxvY2F0ZSAxNiBtb3JlIGJ5dGVzIHRvIG1hdGNoIHRoZSB0b3RhbCBhbW91bnQKKyAqIGFsbG9jYXRlZCBieSBkZXZfYWxsb2Nfc2tiKCksIGJ1dCB3ZSBkb24ndCByZXNlcnZlLgorICovCisjZGVmaW5lIE1BWF9OVU1fQlVGX0RFU0MJMjU1CisjZGVmaW5lIERFU0NfQlVGX1NJWkUJCTQwODAJLyogbWF4IDQwOTYtMTYgKi8KKyNkZWZpbmUgREVTQ19CVUZfU0laRV9SRUcJKERFU0NfQlVGX1NJWkUgLyAxNikKKworLyogVHJhbnNtaXR0ZXIgdGltZW91dC4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVAkJKDIqSFopCisKKy8qIE1ESU8gbGF0ZW5jeSBkZWxheSAqLworI2RlZmluZSBNRElPX0RFTEFZCQkyNTAKKworLyogUG93ZXIgbWFuYWdtZW50IHNoaWZ0IHJlZ2lzdGVycyAqLworI2RlZmluZSBJQk1fQ1BNX0VNTUlJCTAJLyogU2hpZnQgdmFsdWUgZm9yIE1JSSAqLworI2RlZmluZSBJQk1fQ1BNX0VNUlgJMQkvKiBTaGlmdCB2YWx1ZSBmb3IgcmVjdiAqLworI2RlZmluZSBJQk1fQ1BNX0VNVFgJMgkvKiBTaGlmdCB2YWx1ZSBmb3IgTUFDICovCisjZGVmaW5lIElCTV9DUE1fRU1BQyh4KQkoKCh4KT4+SUJNX0NQTV9FTU1JSSkgfCAoKHgpPj5JQk1fQ1BNX0VNUlgpIHwgKCh4KT4+SUJNX0NQTV9FTVRYKSkKKworI2RlZmluZSBFTkVUX0hFQURFUl9TSVpFCTE0CisjZGVmaW5lIEVORVRfRkNTX1NJWkUJCTQKKyNkZWZpbmUgRU5FVF9ERUZfTVRVX1NJWkUJMTUwMAorI2RlZmluZSBFTkVUX0RFRl9CVUZfU0laRQkoRU5FVF9ERUZfTVRVX1NJWkUgKyBFTkVUX0hFQURFUl9TSVpFICsgRU5FVF9GQ1NfU0laRSkKKyNkZWZpbmUgRU1BQ19NSU5fRlJBTUUJCTY0CisjZGVmaW5lIEVNQUNfTUFYX0ZSQU1FCQk5MDE4CisjZGVmaW5lIEVNQUNfTUlOX01UVQkJKEVNQUNfTUlOX0ZSQU1FIC0gRU5FVF9IRUFERVJfU0laRSAtIEVORVRfRkNTX1NJWkUpCisjZGVmaW5lIEVNQUNfTUFYX01UVQkJKEVNQUNfTUFYX0ZSQU1FIC0gRU5FVF9IRUFERVJfU0laRSAtIEVORVRfRkNTX1NJWkUpCisKKyNpZmRlZiBDT05GSUdfSUJNX0VNQUNfRVJSTVNHCit2b2lkIGVtYWNfc2Vycl9kdW1wXzAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGVtYWNfc2Vycl9kdW1wXzEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGVtYWNfZXJyX2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGVtMGlzcik7Cit2b2lkIGVtYWNfcGh5X2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIGVtYWNfZGVzY19kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBlbWFjX21hY19kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBlbWFjX21hbF9kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICopOworI2Vsc2UKKyNkZWZpbmUgZW1hY19zZXJyX2R1bXBfMChkZXYpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZW1hY19zZXJyX2R1bXBfMShkZXYpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZW1hY19lcnJfZHVtcChkZXYseCkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBlbWFjX3BoeV9kdW1wKGRldikgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBlbWFjX2Rlc2NfZHVtcChkZXYpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZW1hY19tYWNfZHVtcChkZXYpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZW1hY19tYWxfZHVtcChkZXYpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSB7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYltOVU1fVFhfQlVGRl07CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYltOVU1fUlhfQlVGRl07CisJc3RydWN0IG1hbF9kZXNjcmlwdG9yICp0eF9kZXNjOworCXN0cnVjdCBtYWxfZGVzY3JpcHRvciAqcnhfZGVzYzsKKwlzdHJ1Y3QgbWFsX2Rlc2NyaXB0b3IgKnJ4X2RpcnR5OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWludCB0eF9jbnQ7CisJaW50IHJ4X3Nsb3Q7CisJaW50IGRpcnR5X3J4OworCWludCB0eF9zbG90OworCWludCBhY2tfc2xvdDsKKwlpbnQgcnhfYnVmZmVyX3NpemU7CisKKwlzdHJ1Y3QgbWlpX3BoeSBwaHlfbWlpOworCWludCBtaWlfcGh5X2FkZHI7CisJaW50IHdhbnRfYXV0b25lZzsKKwlpbnQgdGltZXJfdGlja3M7CisJc3RydWN0IHRpbWVyX2xpc3QgbGlua190aW1lcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbWRpb19kZXY7CisKKwlzdHJ1Y3Qgb2NwX2RldmljZSAqcmdtaWlfZGV2OworCWludCByZ21paV9pbnB1dDsKKworCXN0cnVjdCBvY3BfZGV2aWNlICp6bWlpX2RldjsKKwlpbnQgem1paV9pbnB1dDsKKworCXN0cnVjdCBpYm1fb2NwX21hbCAqbWFsOworCWludCBtYWxfdHhfY2hhbiwgbWFsX3J4X2NoYW47CisJc3RydWN0IG1hbF9jb21tYWMgY29tbWFjOworCisJc3RydWN0IG9jcF9kZXZpY2UgKnRhaF9kZXY7CisKKwlpbnQgb3BlbmVkOworCWludCBnb2luZ19hd2F5OworCWludCB3b2xfaXJxOworCWVtYWNfdCAqZW1hY3A7CisJc3RydWN0IG9jcF9kZXZpY2UgKm9jcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzcGlubG9ja190IGxvY2s7Cit9OworI2VuZGlmCQkJCS8qIF9JQk1fRU1BQ19DT1JFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODUxMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfZGVidWcuYwpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIGlibV9vY3BfZGVidWcuYworICoKKyAqIFRoaXMgaGFzIGFsbCB0aGUgZGVidWcgcm91dGluZXMgdGhhdCB3aGVyZSBpbiAqX2VuZXQuYworICoKKyAqICAgICAgQXJtaW4gS3VzdGVyIGFrdXN0ZXJAbXZpc3RhLmNvbQorICogICAgICBBcHJpbCAsIDIwMDIKKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBNb250YVZpc3RhIFNvZnRhcmUgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgImlibV9vY3BfbWFsLmgiCisjaW5jbHVkZSAiaWJtX29jcF96bWlpLmgiCisjaW5jbHVkZSAiaWJtX29jcF9lbmV0LmgiCisKK2V4dGVybiBpbnQgZW1hY19waHlfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnKTsKKwordm9pZCBlbWFjX3BoeV9kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGk7CisJdWludCBkYXRhOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiBQcmVwYXJlIGZvciBQaHkgZHVtcC4uLi5cbiIpOworCWZvciAoaSA9IDA7IGkgPCAweDFBOyBpKyspIHsKKwkJZGF0YSA9IGVtYWNfcGh5X3JlYWQoZGV2LCBmZXAtPm1paV9waHlfYWRkciwgaSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJQaHkgcmVnIDB4JWx4ID09PiAlNHhcbiIsIGksIGRhdGEpOworCQlpZiAoaSA9PSAweDA3KQorCQkJaSA9IDB4MGY7CisJfQorfQorCit2b2lkIGVtYWNfZGVzY19kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwlpbnQgY3Vycl9zbG90OworCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgImR1bXBpbmcgdGhlIHJlY2VpdmUgZGVzY3JpcHRvcnM6ICBjdXJyZW50IHNsb3QgaXMgJWRcbiIsCisJICAgICAgIGZlcC0+cnhfc2xvdCk7CisJZm9yIChjdXJyX3Nsb3QgPSAwOyBjdXJyX3Nsb3QgPCBOVU1fUlhfQlVGRjsgY3Vycl9zbG90KyspIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJEZXNjICUwMmQ6IHN0YXR1cyAweCUwNHgsIGxlbmd0aCAlM2QsIGFkZHIgMHgleFxuIiwKKwkJICAgICAgIGN1cnJfc2xvdCwgZmVwLT5yeF9kZXNjW2N1cnJfc2xvdF0uY3RybCwKKwkJICAgICAgIGZlcC0+cnhfZGVzY1tjdXJyX3Nsb3RdLmRhdGFfbGVuLAorCQkgICAgICAgKHVuc2lnbmVkIGludClmZXAtPnJ4X2Rlc2NbY3Vycl9zbG90XS5kYXRhX3B0cik7CisJfQorfQorCit2b2lkIGVtYWNfbWFjX2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gZGV2LT5wcml2OworCXZvbGF0aWxlIGVtYWNfdCAqZW1hY3AgPSBmZXAtPmVtYWNwOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkVNQUMgREVCVUcgKioqKioqKioqKiBcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJFTUFDX00wICA9PT4gMHgleFxuIiwgaW5fYmUzMigmZW1hY3AtPmVtMG1yMCkpOworCXByaW50ayhLRVJOX0RFQlVHICJFTUFDX00xICA9PT4gMHgleFxuIiwgaW5fYmUzMigmZW1hY3AtPmVtMG1yMSkpOworCXByaW50ayhLRVJOX0RFQlVHICJFTUFDX1RYTTA9PT4gMHgleFxuIiwgaW5fYmUzMigmZW1hY3AtPmVtMHRtcjApKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiRU1BQ19UWE0xPT0+IDB4JXhcbiIsIGluX2JlMzIoJmVtYWNwLT5lbTB0bXIxKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkVNQUNfUlhNID09PiAweCV4XG4iLCBpbl9iZTMyKCZlbWFjcC0+ZW0wcm1yKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkVNQUNfSVNSID09PiAweCV4XG4iLCBpbl9iZTMyKCZlbWFjcC0+ZW0waXNyKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkVNQUNfSUVSID09PiAweCV4XG4iLCBpbl9iZTMyKCZlbWFjcC0+ZW0waXNlcikpOworCXByaW50ayhLRVJOX0RFQlVHICJFTUFDX0lBSCA9PT4gMHgleFxuIiwgaW5fYmUzMigmZW1hY3AtPmVtMGlhaHIpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiRU1BQ19JQUwgPT0+IDB4JXhcbiIsIGluX2JlMzIoJmVtYWNwLT5lbTBpYWxyKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkVNQUNfVkxBTl9UUElEX1JFRyA9PT4gMHgleFxuIiwKKwkgICAgICAgaW5fYmUzMigmZW1hY3AtPmVtMHZ0cGlkKSk7Cit9CisKK3ZvaWQgZW1hY19tYWxfZHVtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpYm1fb2NwX21hbCAqbWFsID0gKChzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqKWRldi0+cHJpdiktPm1hbDsKKworCXByaW50ayhLRVJOX0RFQlVHICIgTUFMIERFQlVHICoqKioqKioqKiogXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIE1DUiAgICAgID09PiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMQ1IpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIEVTUiAgICAgID09PiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMRVNSKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBJRVIgICAgICA9PT4gMHgleFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClnZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTElFUikpOworI2lmZGVmIENPTkZJR180MHgKKwlwcmludGsoS0VSTl9ERUJVRyAiIERCUiAgICAgID09PiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMREJSKSk7CisjZW5kaWYJCQkJLyogQ09ORklHXzQweCAqLworCXByaW50ayhLRVJOX0RFQlVHICIgVFhDQVNSICAgPT0+IDB4JXhcbiIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWENBU1IpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIFRYQ0FSUiAgID09PiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhDQVJSKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBUWEVPQklTUiA9PT4gMHgleFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClnZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFRYRU9CSVNSKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBUWERFSVIgICA9PT4gMHgleFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClnZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFRYREVJUikpOworCXByaW50ayhLRVJOX0RFQlVHICIgUlhDQVNSICAgPT0+IDB4JXhcbiIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSWENBU1IpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIFJYQ0FSUiAgID09PiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUlhDQVJSKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBSWEVPQklTUiA9PT4gMHgleFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClnZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFJYRU9CSVNSKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBSWERFSVIgICA9PT4gMHgleFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClnZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFJYREVJUikpOworCXByaW50ayhLRVJOX0RFQlVHICIgVFhDVFAwUiAgPT0+IDB4JXhcbiIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWENUUDBSKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBUWENUUDFSICA9PT4gMHgleFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClnZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFRYQ1RQMVIpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIFRYQ1RQMlIgID09PiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhDVFAyUikpOworCXByaW50ayhLRVJOX0RFQlVHICIgVFhDVFAzUiAgPT0+IDB4JXhcbiIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWENUUDNSKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBSWENUUDBSICA9PT4gMHgleFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClnZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFJYQ1RQMFIpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIFJYQ1RQMVIgID09PiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUlhDVFAxUikpOworCXByaW50ayhLRVJOX0RFQlVHICIgUkNCUzAgICAgPT0+IDB4JXhcbiIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSQ0JTMCkpOworCXByaW50ayhLRVJOX0RFQlVHICIgUkNCUzEgICAgPT0+IDB4JXhcbiIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSQ0JTMSkpOworfQorCit2b2lkIGVtYWNfc2Vycl9kdW1wXzAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbCA9ICgoc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKilkZXYtPnByaXYpLT5tYWw7CisJdW5zaWduZWQgbG9uZyBpbnQgbWFsX2Vycm9yLCBwbGJfZXJyb3IsIHBsYl9hZGRyOworCisJbWFsX2Vycm9yID0gZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxFU1IpOworCXByaW50ayhLRVJOX0RFQlVHICJwcGM0MDVfZXRoX3NlcnI6ICVzIGNoYW5uZWwgJWxkIFxuIiwKKwkgICAgICAgKG1hbF9lcnJvciAmIDB4NDAwMDAwMDApID8gIlJlY2VpdmUiIDoKKwkgICAgICAgIlRyYW5zbWl0IiwgKG1hbF9lcnJvciAmIDB4M2UwMDAwMDApID4+IDI1KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICAtLS0tLSAgbGF0Y2hlZCBlcnJvciAgLS0tLS1cbiIpOworCWlmIChtYWxfZXJyb3IgJiBNQUxFU1JfREUpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIERFOiBkZXNjcmlwdG9yIGVycm9yXG4iKTsKKwlpZiAobWFsX2Vycm9yICYgTUFMRVNSX09FTikKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgT05FOiBPUEIgbm9uLWZ1bGx3b3JkIGVycm9yXG4iKTsKKwlpZiAobWFsX2Vycm9yICYgTUFMRVNSX09URSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgT1RFOiBPUEIgdGltZW91dCBlcnJvclxuIik7CisJaWYgKG1hbF9lcnJvciAmIE1BTEVTUl9PU0UpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIE9TRTogT1BCIHNsYXZlIGVycm9yXG4iKTsKKworCWlmIChtYWxfZXJyb3IgJiBNQUxFU1JfUEVJTikgeworCQlwbGJfZXJyb3IgPSBtZmRjcihEQ1JOX1BMQjBfQkVTUik7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiICBQRUlOOiBQTEIgZXJyb3IsIFBMQjBfQkVTUiBpcyAweCV4XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGludClwbGJfZXJyb3IpOworCQlwbGJfYWRkciA9IG1mZGNyKERDUk5fUExCMF9CRUFSKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIgIFBFSU46IFBMQiBlcnJvciwgUExCMF9CRUFSIGlzIDB4JXhcbiIsCisJCSAgICAgICAodW5zaWduZWQgaW50KXBsYl9hZGRyKTsKKwl9Cit9CisKK3ZvaWQgZW1hY19zZXJyX2R1bXBfMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpYm1fb2NwX21hbCAqbWFsID0gKChzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqKWRldi0+cHJpdiktPm1hbDsKKwlpbnQgbWFsX2Vycm9yID0gZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxFU1IpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiAgLS0tLS0gIGN1bXVsYXRpdmUgZXJyb3JzICAtLS0tLVxuIik7CisJaWYgKG1hbF9lcnJvciAmIE1BTEVTUl9ERUkpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIERFSTogZGVzY3JpcHRvciBlcnJvciBpbnRlcnJ1cHRcbiIpOworCWlmIChtYWxfZXJyb3IgJiBNQUxFU1JfT05FSSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgT1BCIG5vbi1mdWxsd29yZCBlcnJvciBpbnRlcnJ1cHRcbiIpOworCWlmIChtYWxfZXJyb3IgJiBNQUxFU1JfT1RFSSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgT1RFSTogdGltZW91dCBlcnJvciBpbnRlcnJ1cHRcbiIpOworCWlmIChtYWxfZXJyb3IgJiBNQUxFU1JfT1NFSSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgT1NFSTogc2xhdmUgZXJyb3IgaW50ZXJydXB0XG4iKTsKKwlpZiAobWFsX2Vycm9yICYgTUFMRVNSX1BCRUkpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIFBCRUk6IFBMQiBidXMgZXJyb3IgaW50ZXJydXB0XG4iKTsKK30KKwordm9pZCBlbWFjX2Vycl9kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBlbTBpc3IpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBvbi1jaGlwIGV0aGVybmV0IGVycm9yOlxuIiwgZGV2LT5uYW1lKTsKKworCWlmIChlbTBpc3IgJiBFTUFDX0lTUl9PVlIpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIE9WUjogb3ZlcnJ1blxuIik7CisJaWYgKGVtMGlzciAmIEVNQUNfSVNSX1BQKQorCQlwcmludGsoS0VSTl9ERUJVRyAiICBQUDogY29udHJvbCBwYXVzZSBwYWNrZXRcbiIpOworCWlmIChlbTBpc3IgJiBFTUFDX0lTUl9CUCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgQlA6IHBhY2tldCBlcnJvclxuIik7CisJaWYgKGVtMGlzciAmIEVNQUNfSVNSX1JQKQorCQlwcmludGsoS0VSTl9ERUJVRyAiICBSUDogcnVudCBwYWNrZXRcbiIpOworCWlmIChlbTBpc3IgJiBFTUFDX0lTUl9TRSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgU0U6IHNob3J0IGV2ZW50XG4iKTsKKwlpZiAoZW0waXNyICYgRU1BQ19JU1JfQUxFKQorCQlwcmludGsoS0VSTl9ERUJVRyAiICBBTEU6IG9kZCBudW1iZXIgb2YgbmliYmxlcyBpbiBwYWNrZXRcbiIpOworCWlmIChlbTBpc3IgJiBFTUFDX0lTUl9CRkNTKQorCQlwcmludGsoS0VSTl9ERUJVRyAiICBCRkNTOiBiYWQgRkNTXG4iKTsKKwlpZiAoZW0waXNyICYgRU1BQ19JU1JfUFRMRSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgUFRMRTogb3ZlcnNpemVkIHBhY2tldFxuIik7CisJaWYgKGVtMGlzciAmIEVNQUNfSVNSX09SRSkKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIgIE9SRTogcGFja2V0IGxlbmd0aCBmaWVsZCA+IG1heCBhbGxvd2VkIExMQ1xuIik7CisJaWYgKGVtMGlzciAmIEVNQUNfSVNSX0lSRSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgSVJFOiBJbiBSYW5nZSBlcnJvclxuIik7CisJaWYgKGVtMGlzciAmIEVNQUNfSVNSX0RCRE0pCisJCXByaW50ayhLRVJOX0RFQlVHICIgIERCRE06IHhtaXQgZXJyb3Igb3IgU1FFXG4iKTsKKwlpZiAoZW0waXNyICYgRU1BQ19JU1JfREIwKQorCQlwcmludGsoS0VSTl9ERUJVRyAiICBEQjA6IHhtaXQgZXJyb3Igb3IgU1FFIG9uIFRYIGNoYW5uZWwgMFxuIik7CisJaWYgKGVtMGlzciAmIEVNQUNfSVNSX1NFMCkKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIgIFNFMDogU2lnbmFsIFF1YWxpdHkgRXJyb3IgdGVzdCBmYWlsdXJlIGZyb20gVFggY2hhbm5lbCAwXG4iKTsKKwlpZiAoZW0waXNyICYgRU1BQ19JU1JfVEUwKQorCQlwcmludGsoS0VSTl9ERUJVRyAiICBURTA6IHhtaXQgY2hhbm5lbCAwIGFib3J0ZWRcbiIpOworCWlmIChlbTBpc3IgJiBFTUFDX0lTUl9EQjEpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIERCMTogeG1pdCBlcnJvciBvciBTUUUgb24gVFggY2hhbm5lbCBcbiIpOworCWlmIChlbTBpc3IgJiBFTUFDX0lTUl9TRTEpCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiICBTRTE6IFNpZ25hbCBRdWFsaXR5IEVycm9yIHRlc3QgZmFpbHVyZSBmcm9tIFRYIGNoYW5uZWwgMVxuIik7CisJaWYgKGVtMGlzciAmIEVNQUNfSVNSX1RFMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgVEUxOiB4bWl0IGNoYW5uZWwgMSBhYm9ydGVkXG4iKTsKKwlpZiAoZW0waXNyICYgRU1BQ19JU1JfTU9TKQorCQlwcmludGsoS0VSTl9ERUJVRyAiICBNT1NcbiIpOworCWlmIChlbTBpc3IgJiBFTUFDX0lTUl9NT0YpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIE1PRlxuIik7CisKKwllbWFjX21hY19kdW1wKGRldik7CisJZW1hY19tYWxfZHVtcChkZXYpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfbWFsLmMgYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19tYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTlmNTdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfbWFsLmMKQEAgLTAsMCArMSw0NjMgQEAKKy8qCisgKiBpYm1fb2NwX21hbC5jCisgKgorICogICAgICBBcm1pbiBLdXN0ZXIgYWt1c3RlckBtdmlzdGEuY29tCisgKiAgICAgIEp1ZW4sIDIwMDIKKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBNb250YVZpc3RhIFNvZnRhcmUgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL29jcC5oPgorCisjaW5jbHVkZSAiaWJtX2VtYWNfbWFsLmgiCisKKy8vIExvY2tpbmc6IFNob3VsZCB3ZSBzaGFyZSBhIGxvY2sgd2l0aCB0aGUgY2xpZW50ID8gVGhlIGNsaWVudCBjb3VsZCBwcm92aWRlCisvLyBhIGxvY2sgcG9pbnRlciAob3B0aW9uYWxseSkgaW4gdGhlIGNvbW1hYyBzdHJ1Y3R1cmUuLi4gSSBkb24ndCB0aGluayB0aGlzIGlzCisvLyByZWFsbHkgbmVjZXNzYXJ5IHRob3VnaAorCisvKiBUaGlzIGxvY2sgcHJvdGVjdHMgdGhlIGNvbW1hYyBsaXN0LiBPbiB0b2RheSBVUCBpbXBsZW1lbnRhdGlvbnMsIGl0J3MKKyAqIHJlYWxseSBvbmx5IHVzZWQgYXMgSVJRIHByb3RlY3Rpb24gaW4gbWFsX3tyZWdpc3Rlcix1bnJlZ2lzdGVyfV9jb21tYWMoKQorICovCitzdGF0aWMgREVGSU5FX1JXTE9DSyhtYWxfbGlzdF9sb2NrKTsKKworaW50IG1hbF9yZWdpc3Rlcl9jb21tYWMoc3RydWN0IGlibV9vY3BfbWFsICptYWwsIHN0cnVjdCBtYWxfY29tbWFjICpjb21tYWMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmbWFsX2xpc3RfbG9jaywgZmxhZ3MpOworCisJLyogRG9uJ3QgbGV0IG11bHRpcGxlIGNvbW1hY3MgY2xhaW0gdGhlIHNhbWUgY2hhbm5lbCAqLworCWlmICgobWFsLT50eF9jaGFuX21hc2sgJiBjb21tYWMtPnR4X2NoYW5fbWFzaykgfHwKKwkgICAgKG1hbC0+cnhfY2hhbl9tYXNrICYgY29tbWFjLT5yeF9jaGFuX21hc2spKSB7CisJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZtYWxfbGlzdF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJbWFsLT50eF9jaGFuX21hc2sgfD0gY29tbWFjLT50eF9jaGFuX21hc2s7CisJbWFsLT5yeF9jaGFuX21hc2sgfD0gY29tbWFjLT5yeF9jaGFuX21hc2s7CisKKwlsaXN0X2FkZCgmY29tbWFjLT5saXN0LCAmbWFsLT5jb21tYWMpOworCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm1hbF9saXN0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFsX3VucmVnaXN0ZXJfY29tbWFjKHN0cnVjdCBpYm1fb2NwX21hbCAqbWFsLCBzdHJ1Y3QgbWFsX2NvbW1hYyAqY29tbWFjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJm1hbF9saXN0X2xvY2ssIGZsYWdzKTsKKworCW1hbC0+dHhfY2hhbl9tYXNrICY9IH5jb21tYWMtPnR4X2NoYW5fbWFzazsKKwltYWwtPnJ4X2NoYW5fbWFzayAmPSB+Y29tbWFjLT5yeF9jaGFuX21hc2s7CisKKwlsaXN0X2RlbF9pbml0KCZjb21tYWMtPmxpc3QpOworCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm1hbF9saXN0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFsX3NldF9yY2JzKHN0cnVjdCBpYm1fb2NwX21hbCAqbWFsLCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN3aXRjaCAoY2hhbm5lbCkgeworCWNhc2UgMDoKKwkJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSQ0JTMCwgc2l6ZSk7CisJCWJyZWFrOworI2lmZGVmIERDUk5fTUFMUkNCUzEKKwljYXNlIDE6CisJCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUkNCUzEsIHNpemUpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIERDUk5fTUFMUkNCUzIKKwljYXNlIDI6CisJCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUkNCUzIsIHNpemUpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIERDUk5fTUFMUkNCUzMKKwljYXNlIDM6CisJCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUkNCUzMsIHNpemUpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFsX3NlcnIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbCA9IGRldl9pbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIG1hbF9lcnJvcjsKKworCS8qCisJICogVGhpcyBTRVJSIGFwcGxpZXMgdG8gb25lIG9mIHRoZSBkZXZpY2VzIG9uIHRoZSBNQUwsIGhlcmUgd2UgY2hhcmdlCisJICogaXQgYWdhaW5zdCB0aGUgZmlyc3QgRU1BQyByZWdpc3RlcmVkIGZvciB0aGUgTUFMLgorCSAqLworCisJbWFsX2Vycm9yID0gZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxFU1IpOworCisJcHJpbnRrKEtFUk5fRVJSICIlczogU3lzdGVtIEVycm9yIChNQUxFU1I9JWx4KVxuIiwKKwkgICAgICAgIk1BTCIgLyogRklYTUU6IGdldCB0aGUgbmFtZSByaWdodCAqLyAsIG1hbF9lcnJvcik7CisKKwkvKiBGSVhNRTogZGVjaXBoZXIgZXJyb3IgKi8KKwkvKiBESVhNRTogZGlzdHJpYnV0ZSB0byBjb21tYWNzLCBpZiBwb3NzaWJsZSAqLworCisJLyogQ2xlYXIgdGhlIGVycm9yIHN0YXR1cyByZWdpc3RlciAqLworCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMRVNSLCBtYWxfZXJyb3IpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFsX3R4ZW9iKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlibV9vY3BfbWFsICptYWwgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwl1bnNpZ25lZCBsb25nIGlzcjsKKworCWlzciA9IGdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhFT0JJU1IpOworCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhFT0JJU1IsIGlzcik7CisKKwlyZWFkX2xvY2soJm1hbF9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2gobCwgJm1hbC0+Y29tbWFjKSB7CisJCXN0cnVjdCBtYWxfY29tbWFjICptYyA9IGxpc3RfZW50cnkobCwgc3RydWN0IG1hbF9jb21tYWMsIGxpc3QpOworCisJCWlmIChpc3IgJiBtYy0+dHhfY2hhbl9tYXNrKSB7CisJCQltYy0+b3BzLT50eGVvYihtYy0+ZGV2LCBpc3IgJiBtYy0+dHhfY2hhbl9tYXNrKTsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmbWFsX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYWxfcnhlb2IoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbCA9IGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCXVuc2lnbmVkIGxvbmcgaXNyOworCisJaXNyID0gZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSWEVPQklTUik7CisJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSWEVPQklTUiwgaXNyKTsKKworCXJlYWRfbG9jaygmbWFsX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaChsLCAmbWFsLT5jb21tYWMpIHsKKwkJc3RydWN0IG1hbF9jb21tYWMgKm1jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgbWFsX2NvbW1hYywgbGlzdCk7CisKKwkJaWYgKGlzciAmIG1jLT5yeF9jaGFuX21hc2spIHsKKwkJCW1jLT5vcHMtPnJ4ZW9iKG1jLT5kZXYsIGlzciAmIG1jLT5yeF9jaGFuX21hc2spOworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZtYWxfbGlzdF9sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IG1hbF90eGRlKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlibV9vY3BfbWFsICptYWwgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwl1bnNpZ25lZCBsb25nIGRlaXI7CisKKwlkZWlyID0gZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWERFSVIpOworCisJLyogRklYTUU6IHByaW50IHdoaWNoIE1BTCBjb3JyZWN0bHkgKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHggZGVzY3JpcHRvciBlcnJvciAoTUFMVFhERUlSPSVseClcbiIsCisJICAgICAgICJNQUwiLCBkZWlyKTsKKworCXJlYWRfbG9jaygmbWFsX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaChsLCAmbWFsLT5jb21tYWMpIHsKKwkJc3RydWN0IG1hbF9jb21tYWMgKm1jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgbWFsX2NvbW1hYywgbGlzdCk7CisKKwkJaWYgKGRlaXIgJiBtYy0+dHhfY2hhbl9tYXNrKSB7CisJCQltYy0+b3BzLT50eGRlKG1jLT5kZXYsIGRlaXIgJiBtYy0+dHhfY2hhbl9tYXNrKTsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmbWFsX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBUaGlzIGludGVycnVwdCBzaG91bGQgYmUgdmVyeSByYXJlIGF0IGJlc3QuICBUaGlzIG9jY3VycyB3aGVuCisgKiB0aGUgaGFyZHdhcmUgaGFzIGEgcHJvYmxlbSB3aXRoIHRoZSByZWNlaXZlIGRlc2NyaXB0b3JzLiAgVGhlIG1hbnVhbAorICogc3RhdGVzIHRoYXQgaXQgb2NjdXJzIHdoZW4gdGhlIGhhcmR3YXJlIGNhbm5vdCB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yCisgKiBlbXB0eSBiaXQgaXMgbm90IHNldC4gIFRoZSByZWNvdmVyeSBtZWNoYW5pc20gd2lsbCBiZSB0bworICogdHJhdmVyc2UgdGhyb3VnaCB0aGUgZGVzY3JpcHRvcnMsIGhhbmRsZSBhbnkgdGhhdCBhcmUgbWFya2VkIHRvIGJlCisgKiBoYW5kbGVkIGFuZCByZWluaXRpYWxpemUgZWFjaCBhbG9uZyB0aGUgd2F5LiAgQXQgdGhhdCBwb2ludCB0aGUgZHJpdmVyCisgKiB3aWxsIGJlIHJlc3RhcnRlZC4KKyAqLworc3RhdGljIGlycXJldHVybl90IG1hbF9yeGRlKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlibV9vY3BfbWFsICptYWwgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwl1bnNpZ25lZCBsb25nIGRlaXI7CisKKwlkZWlyID0gZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSWERFSVIpOworCisJLyoKKwkgKiBUaGlzIHJlYWxseSBpcyBuZWVkZWQuICBUaGlzIGNhc2UgZW5jb3VudGVyZWQgaW4gc3RyZXNzIHRlc3RpbmcuCisJICovCisJaWYgKGRlaXIgPT0gMCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJLyogRklYTUU6IHByaW50IHdoaWNoIE1BTCBjb3JyZWN0bHkgKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUnggZGVzY3JpcHRvciBlcnJvciAoTUFMUlhERUlSPSVseClcbiIsCisJICAgICAgICJNQUwiLCBkZWlyKTsKKworCXJlYWRfbG9jaygmbWFsX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaChsLCAmbWFsLT5jb21tYWMpIHsKKwkJc3RydWN0IG1hbF9jb21tYWMgKm1jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgbWFsX2NvbW1hYywgbGlzdCk7CisKKwkJaWYgKGRlaXIgJiBtYy0+cnhfY2hhbl9tYXNrKSB7CisJCQltYy0+b3BzLT5yeGRlKG1jLT5kZXYsIGRlaXIgJiBtYy0+cnhfY2hhbl9tYXNrKTsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmbWFsX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1hbF9wcm9iZShzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwZGV2KQoreworCXN0cnVjdCBpYm1fb2NwX21hbCAqbWFsID0gTlVMTDsKKwlzdHJ1Y3Qgb2NwX2Z1bmNfbWFsX2RhdGEgKm1hbGRhdGE7CisJaW50IGVyciA9IDA7CisKKwltYWxkYXRhID0gKHN0cnVjdCBvY3BfZnVuY19tYWxfZGF0YSAqKW9jcGRldi0+ZGVmLT5hZGRpdGlvbnM7CisJaWYgKG1hbGRhdGEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1hbCVkOiBNaXNzaW5nIGFkZGl0aW9uYWwgZGF0YXMgIVxuIiwKKwkJICAgICAgIG9jcGRldi0+ZGVmLT5pbmRleCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW1hbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYm1fb2NwX21hbCksIEdGUF9LRVJORUwpOworCWlmIChtYWwgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJtYWwlZDogT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIE1BTCBzdHJ1Y3R1cmUgIVxuIiwKKwkJICAgICAgIG9jcGRldi0+ZGVmLT5pbmRleCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQobWFsLCAwLCBzaXplb2YoKm1hbCkpOworCisJc3dpdGNoIChvY3BkZXYtPmRlZi0+aW5kZXgpIHsKKwljYXNlIDA6CisJCW1hbC0+ZGNyYmFzZSA9IERDUk5fTUFMX0JBU0U7CisJCWJyZWFrOworI2lmZGVmIERDUk5fTUFMMV9CQVNFCisJY2FzZSAxOgorCQltYWwtPmRjcmJhc2UgPSBEQ1JOX01BTDFfQkFTRTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlJTklUX0xJU1RfSEVBRCgmbWFsLT5jb21tYWMpOworCisJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSWENBUlIsIDB4RkZGRkZGRkYpOworCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhDQVJSLCAweEZGRkZGRkZGKTsKKworCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMQ1IsIE1BTENSX01NU1IpOwkvKiAzODQgKi8KKwkvKiBGSVhNRTogQWRkIGRlbGF5ICovCisKKwkvKiBTZXQgdGhlIE1BTCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxDUiwKKwkJICAgICBNQUxDUl9QTEJCIHwgTUFMQ1JfT1BCQkwgfCBNQUxDUl9MRUEgfAorCQkgICAgIE1BTENSX1BMQkxUX0RFRkFVTFQpOworCisJLyogSXQgd291bGQgYmUgbmljZSB0byBhbGxvY2F0ZSBidWZmZXJzIHNlcGFyYXRlbHkgZm9yIGVhY2gKKwkgKiBjaGFubmVsLCBidXQgd2UgY2FuJ3QgYmVjYXVzZSB0aGUgY2hhbm5lbHMgc2hhcmUgdGhlIHVwcGVyCisJICogMTMgYml0cyBvZiBhZGRyZXNzIGxpbmVzLiAgRWFjaCBjaGFubmVscyBidWZmZXIgbXVzdCBhbHNvCisJICogYmUgNGsgYWxpZ25lZCwgc28gd2UgYWxsb2NhdGUgNGsgZm9yIGVhY2ggY2hhbm5lbC4gIFRoaXMgaXMKKwkgKiBpbmVmZmljaWVudCBGSVhNRTogZG8gYmV0dGVyLCBpZiBwb3NzaWJsZSAqLworCW1hbC0+dHhfdmlydF9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZvY3BkZXYtPmRldiwKKwkJCQkJICAgICAgIE1BTF9EVF9BTElHTiAqCisJCQkJCSAgICAgICBtYWxkYXRhLT5udW1fdHhfY2hhbnMsCisJCQkJCSAgICAgICAmbWFsLT50eF9waHlzX2FkZHIsIEdGUF9LRVJORUwpOworCWlmIChtYWwtPnR4X3ZpcnRfYWRkciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIm1hbCVkOiBPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgTUFMIGRlc2NyaXB0b3JzICFcbiIsCisJCSAgICAgICBvY3BkZXYtPmRlZi0+aW5kZXgpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogR29kLCBvaCwgZ29kLCBJIGhhdGUgRENScyAqLworCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhDVFAwUiwgbWFsLT50eF9waHlzX2FkZHIpOworI2lmZGVmIERDUk5fTUFMVFhDVFAxUgorCWlmIChtYWxkYXRhLT5udW1fdHhfY2hhbnMgPiAxKQorCQlzZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFRYQ1RQMVIsCisJCQkgICAgIG1hbC0+dHhfcGh5c19hZGRyICsgTUFMX0RUX0FMSUdOKTsKKyNlbmRpZgkJCQkvKiBEQ1JOX01BTFRYQ1RQMVIgKi8KKyNpZmRlZiBEQ1JOX01BTFRYQ1RQMlIKKwlpZiAobWFsZGF0YS0+bnVtX3R4X2NoYW5zID4gMikKKwkJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWENUUDJSLAorCQkJICAgICBtYWwtPnR4X3BoeXNfYWRkciArIDIgKiBNQUxfRFRfQUxJR04pOworI2VuZGlmCQkJCS8qIERDUk5fTUFMVFhDVFAyUiAqLworI2lmZGVmIERDUk5fTUFMVFhDVFAzUgorCWlmIChtYWxkYXRhLT5udW1fdHhfY2hhbnMgPiAzKQorCQlzZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFRYQ1RQM1IsCisJCQkgICAgIG1hbC0+dHhfcGh5c19hZGRyICsgMyAqIE1BTF9EVF9BTElHTik7CisjZW5kaWYJCQkJLyogRENSTl9NQUxUWENUUDNSICovCisjaWZkZWYgRENSTl9NQUxUWENUUDRSCisJaWYgKG1hbGRhdGEtPm51bV90eF9jaGFucyA+IDQpCisJCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhDVFA0UiwKKwkJCSAgICAgbWFsLT50eF9waHlzX2FkZHIgKyA0ICogTUFMX0RUX0FMSUdOKTsKKyNlbmRpZgkJCQkvKiBEQ1JOX01BTFRYQ1RQNFIgKi8KKyNpZmRlZiBEQ1JOX01BTFRYQ1RQNVIKKwlpZiAobWFsZGF0YS0+bnVtX3R4X2NoYW5zID4gNSkKKwkJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWENUUDVSLAorCQkJICAgICBtYWwtPnR4X3BoeXNfYWRkciArIDUgKiBNQUxfRFRfQUxJR04pOworI2VuZGlmCQkJCS8qIERDUk5fTUFMVFhDVFA1UiAqLworI2lmZGVmIERDUk5fTUFMVFhDVFA2UgorCWlmIChtYWxkYXRhLT5udW1fdHhfY2hhbnMgPiA2KQorCQlzZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFRYQ1RQNlIsCisJCQkgICAgIG1hbC0+dHhfcGh5c19hZGRyICsgNiAqIE1BTF9EVF9BTElHTik7CisjZW5kaWYJCQkJLyogRENSTl9NQUxUWENUUDZSICovCisjaWZkZWYgRENSTl9NQUxUWENUUDdSCisJaWYgKG1hbGRhdGEtPm51bV90eF9jaGFucyA+IDcpCisJCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhDVFA3UiwKKwkJCSAgICAgbWFsLT50eF9waHlzX2FkZHIgKyA3ICogTUFMX0RUX0FMSUdOKTsKKyNlbmRpZgkJCQkvKiBEQ1JOX01BTFRYQ1RQN1IgKi8KKworCW1hbC0+cnhfdmlydF9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZvY3BkZXYtPmRldiwKKwkJCQkJICAgICAgIE1BTF9EVF9BTElHTiAqCisJCQkJCSAgICAgICBtYWxkYXRhLT5udW1fcnhfY2hhbnMsCisJCQkJCSAgICAgICAmbWFsLT5yeF9waHlzX2FkZHIsIEdGUF9LRVJORUwpOworCisJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSWENUUDBSLCBtYWwtPnJ4X3BoeXNfYWRkcik7CisjaWZkZWYgRENSTl9NQUxSWENUUDFSCisJaWYgKG1hbGRhdGEtPm51bV9yeF9jaGFucyA+IDEpCisJCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUlhDVFAxUiwKKwkJCSAgICAgbWFsLT5yeF9waHlzX2FkZHIgKyBNQUxfRFRfQUxJR04pOworI2VuZGlmCQkJCS8qIERDUk5fTUFMUlhDVFAxUiAqLworI2lmZGVmIERDUk5fTUFMUlhDVFAyUgorCWlmIChtYWxkYXRhLT5udW1fcnhfY2hhbnMgPiAyKQorCQlzZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFJYQ1RQMlIsCisJCQkgICAgIG1hbC0+cnhfcGh5c19hZGRyICsgMiAqIE1BTF9EVF9BTElHTik7CisjZW5kaWYJCQkJLyogRENSTl9NQUxSWENUUDJSICovCisjaWZkZWYgRENSTl9NQUxSWENUUDNSCisJaWYgKG1hbGRhdGEtPm51bV9yeF9jaGFucyA+IDMpCisJCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUlhDVFAzUiwKKwkJCSAgICAgbWFsLT5yeF9waHlzX2FkZHIgKyAzICogTUFMX0RUX0FMSUdOKTsKKyNlbmRpZgkJCQkvKiBEQ1JOX01BTFJYQ1RQM1IgKi8KKworCWVyciA9IHJlcXVlc3RfaXJxKG1hbGRhdGEtPnNlcnJfaXJxLCBtYWxfc2VyciwgMCwgIk1BTCBTRVJSIiwgbWFsKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWw7CisJZXJyID0gcmVxdWVzdF9pcnEobWFsZGF0YS0+dHhkZV9pcnEsIG1hbF90eGRlLCAwLCAiTUFMIFRYIERFICIsIG1hbCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCWVyciA9IHJlcXVlc3RfaXJxKG1hbGRhdGEtPnR4ZW9iX2lycSwgbWFsX3R4ZW9iLCAwLCAiTUFMIFRYIEVPQiIsIG1hbCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCWVyciA9IHJlcXVlc3RfaXJxKG1hbGRhdGEtPnJ4ZGVfaXJxLCBtYWxfcnhkZSwgMCwgIk1BTCBSWCBERSIsIG1hbCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCWVyciA9IHJlcXVlc3RfaXJxKG1hbGRhdGEtPnJ4ZW9iX2lycSwgbWFsX3J4ZW9iLCAwLCAiTUFMIFJYIEVPQiIsIG1hbCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCisJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxJRVIsCisJCSAgICAgTUFMSUVSX0RFIHwgTUFMSUVSX05FIHwgTUFMSUVSX1RFIHwKKwkJICAgICBNQUxJRVJfT1BCRSB8IE1BTElFUl9QTEJFKTsKKworCS8qIEFkdmVydGlzZSBtZSB0byB0aGUgcmVzdCBvZiB0aGUgd29ybGQgKi8KKwlvY3Bfc2V0X2RydmRhdGEob2NwZGV2LCBtYWwpOworCisJcHJpbnRrKEtFUk5fSU5GTyAibWFsJWQ6IEluaXRpYWxpemVkLCAlZCB0eCBjaGFubmVscywgJWQgcnggY2hhbm5lbHNcbiIsCisJICAgICAgIG9jcGRldi0+ZGVmLT5pbmRleCwgbWFsZGF0YS0+bnVtX3R4X2NoYW5zLAorCSAgICAgICBtYWxkYXRhLT5udW1fcnhfY2hhbnMpOworCisJcmV0dXJuIDA7CisKKyAgICAgIGZhaWw6CisJLyogRklYTUU6IGRpc3Bvc2UgcmVxdWVzdGVkIElSUXMgISAqLworCWlmIChlcnIgJiYgbWFsKQorCQlrZnJlZShtYWwpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtYWxfcmVtb3ZlKHN0cnVjdCBvY3BfZGV2aWNlICpvY3BkZXYpCit7CisJc3RydWN0IGlibV9vY3BfbWFsICptYWwgPSBvY3BfZ2V0X2RydmRhdGEob2NwZGV2KTsKKwlzdHJ1Y3Qgb2NwX2Z1bmNfbWFsX2RhdGEgKm1hbGRhdGEgPSBvY3BkZXYtPmRlZi0+YWRkaXRpb25zOworCisJQlVHX09OKCFtYWxkYXRhKTsKKworCW9jcF9zZXRfZHJ2ZGF0YShvY3BkZXYsIE5VTEwpOworCisJLyogRklYTUU6IHNodXQgZG93biB0aGUgTUFMLCBkZWFsIHdpdGggZGVwZW5kZW5jeSB3aXRoIGVtYWMgKi8KKwlmcmVlX2lycShtYWxkYXRhLT5zZXJyX2lycSwgbWFsKTsKKwlmcmVlX2lycShtYWxkYXRhLT50eGRlX2lycSwgbWFsKTsKKwlmcmVlX2lycShtYWxkYXRhLT50eGVvYl9pcnEsIG1hbCk7CisJZnJlZV9pcnEobWFsZGF0YS0+cnhkZV9pcnEsIG1hbCk7CisJZnJlZV9pcnEobWFsZGF0YS0+cnhlb2JfaXJxLCBtYWwpOworCisJaWYgKG1hbC0+dHhfdmlydF9hZGRyKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmb2NwZGV2LT5kZXYsCisJCQkJICBNQUxfRFRfQUxJR04gKiBtYWxkYXRhLT5udW1fdHhfY2hhbnMsCisJCQkJICBtYWwtPnR4X3ZpcnRfYWRkciwgbWFsLT50eF9waHlzX2FkZHIpOworCisJaWYgKG1hbC0+cnhfdmlydF9hZGRyKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmb2NwZGV2LT5kZXYsCisJCQkJICBNQUxfRFRfQUxJR04gKiBtYWxkYXRhLT5udW1fcnhfY2hhbnMsCisJCQkJICBtYWwtPnJ4X3ZpcnRfYWRkciwgbWFsLT5yeF9waHlzX2FkZHIpOworCisJa2ZyZWUobWFsKTsKK30KKworLyogU3RydWN0dXJlIGZvciBhIGRldmljZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2NwX2RldmljZV9pZCBtYWxfaWRzW10gPSB7CisJey52ZW5kb3IgPSBPQ1BfQU5ZX0lELC5mdW5jdGlvbiA9IE9DUF9GVU5DX01BTH0sCisJey52ZW5kb3IgPSBPQ1BfVkVORE9SX0lOVkFMSUR9Cit9OworCitzdGF0aWMgc3RydWN0IG9jcF9kcml2ZXIgbWFsX2RyaXZlciA9IHsKKwkubmFtZSA9ICJtYWwiLAorCS5pZF90YWJsZSA9IG1hbF9pZHMsCisKKwkucHJvYmUgPSBtYWxfcHJvYmUsCisJLnJlbW92ZSA9IG1hbF9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X21hbHModm9pZCkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IG9jcF9yZWdpc3Rlcl9kcml2ZXIoJm1hbF9kcml2ZXIpOworCWlmIChyYyA8IDApIHsKKwkJb2NwX3VucmVnaXN0ZXJfZHJpdmVyKCZtYWxfZHJpdmVyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X21hbHModm9pZCkKK3sKKwlvY3BfdW5yZWdpc3Rlcl9kcml2ZXIoJm1hbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X21hbHMpOworbW9kdWxlX2V4aXQoZXhpdF9tYWxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX21hbC5oIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfbWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5ZjBkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX21hbC5oCkBAIC0wLDAgKzEsMTMxIEBACisjaWZuZGVmIF9JQk1fRU1BQ19NQUxfSAorI2RlZmluZSBfSUJNX0VNQUNfTUFMX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2RlZmluZSBNQUxfRFRfQUxJR04JKDQwOTYpCS8qIEFsaWdubWVudCBmb3IgZWFjaCBjaGFubmVsJ3MgZGVzY3JpcHRvciB0YWJsZSAqLworCisjZGVmaW5lIE1BTF9DSEFOX01BU0soY2hhbikJKDB4ODAwMDAwMDAgPj4gKGNoYW4pKQorCisvKiBNQUwgQnVmZmVyIERlc2NyaXB0b3Igc3RydWN0dXJlICovCitzdHJ1Y3QgbWFsX2Rlc2NyaXB0b3IgeworCXVuc2lnbmVkIHNob3J0IGN0cmw7CS8qIE1BTCAvIENvbW1hYyBzdGF0dXMgY29udHJvbCBiaXRzICovCisJc2hvcnQgZGF0YV9sZW47CQkvKiBNYXggbGVuZ3RoIGlzIDRLLTEgKDEyIGJpdHMpICAgICAqLworCXVuc2lnbmVkIGNoYXIgKmRhdGFfcHRyOwkvKiBwb2ludGVyIHRvIGFjdHVhbCBkYXRhIGJ1ZmZlciAgICAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIHRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBNYWRNQUwgc3RhdHVzIGFuZCBjb250cm9sIHJlZ2lzdGVycy4gKi8KKy8qIE1BRE1BTCB0cmFuc21pdCBhbmQgcmVjZWl2ZSBzdGF0dXMvY29udHJvbCBiaXRzICAqLworI2RlZmluZSBNQUxfUlhfQ1RSTF9FTVBUWQkJMHg4MDAwCisjZGVmaW5lIE1BTF9SWF9DVFJMX1dSQVAJCTB4NDAwMAorI2RlZmluZSBNQUxfUlhfQ1RSTF9DTQkJCTB4MjAwMAorI2RlZmluZSBNQUxfUlhfQ1RSTF9MQVNUCQkweDEwMDAKKyNkZWZpbmUgTUFMX1JYX0NUUkxfRklSU1QJCTB4MDgwMAorI2RlZmluZSBNQUxfUlhfQ1RSTF9JTlRSCQkweDA0MDAKKworI2RlZmluZSBNQUxfVFhfQ1RSTF9SRUFEWQkJMHg4MDAwCisjZGVmaW5lIE1BTF9UWF9DVFJMX1dSQVAJCTB4NDAwMAorI2RlZmluZSBNQUxfVFhfQ1RSTF9DTQkJCTB4MjAwMAorI2RlZmluZSBNQUxfVFhfQ1RSTF9MQVNUCQkweDEwMDAKKyNkZWZpbmUgTUFMX1RYX0NUUkxfSU5UUgkJMHgwNDAwCisKK3N0cnVjdCBtYWxfY29tbWFjX29wcyB7CisJdm9pZCAoKnR4ZW9iKSAodm9pZCAqZGV2LCB1MzIgY2hhbm1hc2spOworCXZvaWQgKCp0eGRlKSAodm9pZCAqZGV2LCB1MzIgY2hhbm1hc2spOworCXZvaWQgKCpyeGVvYikgKHZvaWQgKmRldiwgdTMyIGNoYW5tYXNrKTsKKwl2b2lkICgqcnhkZSkgKHZvaWQgKmRldiwgdTMyIGNoYW5tYXNrKTsKK307CisKK3N0cnVjdCBtYWxfY29tbWFjIHsKKwlzdHJ1Y3QgbWFsX2NvbW1hY19vcHMgKm9wczsKKwl2b2lkICpkZXY7CisJdTMyIHR4X2NoYW5fbWFzaywgcnhfY2hhbl9tYXNrOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBpYm1fb2NwX21hbCB7CisJaW50IGRjcmJhc2U7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvbW1hYzsKKwl1MzIgdHhfY2hhbl9tYXNrLCByeF9jaGFuX21hc2s7CisKKwlkbWFfYWRkcl90IHR4X3BoeXNfYWRkcjsKKwlzdHJ1Y3QgbWFsX2Rlc2NyaXB0b3IgKnR4X3ZpcnRfYWRkcjsKKworCWRtYV9hZGRyX3QgcnhfcGh5c19hZGRyOworCXN0cnVjdCBtYWxfZGVzY3JpcHRvciAqcnhfdmlydF9hZGRyOworfTsKKworI2RlZmluZSBHRVRfTUFMX1NUQU5aQShiYXNlLGRjcm4pIFwKKwljYXNlIGJhc2U6IFwKKwkJeCA9IG1mZGNyKGRjcm4oYmFzZSkpOyBcCisJCWJyZWFrOworCisjZGVmaW5lIFNFVF9NQUxfU1RBTlpBKGJhc2UsZGNybiwgdmFsKSBcCisJY2FzZSBiYXNlOiBcCisJCW10ZGNyKGRjcm4oYmFzZSksICh2YWwpKTsgXAorCQlicmVhazsKKworI2RlZmluZSBHRVRfTUFMMF9TVEFOWkEoZGNybikgR0VUX01BTF9TVEFOWkEoRENSTl9NQUxfQkFTRSxkY3JuKQorI2RlZmluZSBTRVRfTUFMMF9TVEFOWkEoZGNybix2YWwpIFNFVF9NQUxfU1RBTlpBKERDUk5fTUFMX0JBU0UsZGNybix2YWwpCisKKyNpZmRlZiBEQ1JOX01BTDFfQkFTRQorI2RlZmluZSBHRVRfTUFMMV9TVEFOWkEoZGNybikgR0VUX01BTF9TVEFOWkEoRENSTl9NQUwxX0JBU0UsZGNybikKKyNkZWZpbmUgU0VUX01BTDFfU1RBTlpBKGRjcm4sdmFsKSBTRVRfTUFMX1NUQU5aQShEQ1JOX01BTDFfQkFTRSxkY3JuLHZhbCkKKyNlbHNlCQkJCS8qICEgRENSTl9NQUwxX0JBU0UgKi8KKyNkZWZpbmUgR0VUX01BTDFfU1RBTlpBKGRjcm4pCisjZGVmaW5lIFNFVF9NQUwxX1NUQU5aQShkY3JuLHZhbCkKKyNlbmRpZgorCisjZGVmaW5lIGdldF9tYWxfZGNybihtYWwsIGRjcm4pICh7IFwKKwl1MzIgeDsgXAorCXN3aXRjaCAoKG1hbCktPmRjcmJhc2UpIHsgXAorCQlHRVRfTUFMMF9TVEFOWkEoZGNybikgXAorCQlHRVRfTUFMMV9TVEFOWkEoZGNybikgXAorCWRlZmF1bHQ6IFwKKwkJeCA9IDA7IFwKKwkJQlVHKCk7IFwKKwl9IFwKK3g7IH0pCisKKyNkZWZpbmUgc2V0X21hbF9kY3JuKG1hbCwgZGNybiwgdmFsKSBkbyB7IFwKKwlzd2l0Y2ggKChtYWwpLT5kY3JiYXNlKSB7IFwKKwkJU0VUX01BTDBfU1RBTlpBKGRjcm4sdmFsKSBcCisJCVNFVF9NQUwxX1NUQU5aQShkY3JuLHZhbCkgXAorCWRlZmF1bHQ6IFwKKwkJQlVHKCk7IFwKKwl9IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWxfZW5hYmxlX3R4X2NoYW5uZWxzKHN0cnVjdCBpYm1fb2NwX21hbCAqbWFsLCB1MzIgY2hhbm1hc2spCit7CisJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWENBU1IsCisJCSAgICAgZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWENBU1IpIHwgY2hhbm1hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWFsX2Rpc2FibGVfdHhfY2hhbm5lbHMoc3RydWN0IGlibV9vY3BfbWFsICptYWwsCisJCQkJCSAgIHUzMiBjaGFubWFzaykKK3sKKwlzZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFRYQ0FSUiwgY2hhbm1hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWFsX2VuYWJsZV9yeF9jaGFubmVscyhzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbCwgdTMyIGNoYW5tYXNrKQoreworCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUlhDQVNSLAorCQkgICAgIGdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUlhDQVNSKSB8IGNoYW5tYXNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1hbF9kaXNhYmxlX3J4X2NoYW5uZWxzKHN0cnVjdCBpYm1fb2NwX21hbCAqbWFsLAorCQkJCQkgICB1MzIgY2hhbm1hc2spCit7CisJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSWENBUlIsIGNoYW5tYXNrKTsKK30KKworZXh0ZXJuIGludCBtYWxfcmVnaXN0ZXJfY29tbWFjKHN0cnVjdCBpYm1fb2NwX21hbCAqbWFsLAorCQkJICAgICAgIHN0cnVjdCBtYWxfY29tbWFjICpjb21tYWMpOworZXh0ZXJuIGludCBtYWxfdW5yZWdpc3Rlcl9jb21tYWMoc3RydWN0IGlibV9vY3BfbWFsICptYWwsCisJCQkJIHN0cnVjdCBtYWxfY29tbWFjICpjb21tYWMpOworCitleHRlcm4gaW50IG1hbF9zZXRfcmNicyhzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbCwgaW50IGNoYW5uZWwsCisJCQl1bnNpZ25lZCBsb25nIHNpemUpOworCisjZW5kaWYJCQkJLyogX0lCTV9FTUFDX01BTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19waHkuYyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX3BoeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MjEzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19waHkuYwpAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIGlibV9vY3BfcGh5LmMKKyAqCisgKiBQSFkgZHJpdmVycyBmb3IgdGhlIGlibSBvY3AgZXRoZXJuZXQgZHJpdmVyLiBCb3Jyb3dlZAorICogZnJvbSBzdW5nZW1fcGh5LmMsIHRob3VnaCBJIG9ubHkga2VwdCB0aGUgZ2VuZXJpYyBNSUkKKyAqIGRyaXZlciBmb3Igbm93LgorICogCisgKiBUaGlzIGZpbGUgc2hvdWxkIGJlIHNoYXJlZCB3aXRoIG90aGVyIGRyaXZlcnMgb3IgZXZlbnR1YWxseQorICogbWVyZ2VkIGFzIHRoZSAibG93IGxldmVsIiBwYXJ0IG9mIG1paWxpYgorICogCisgKiAoYykgMjAwMywgQmVuamFtaW4gSGVycmVuc2NtaWR0IChiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmcpCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJpYm1fZW1hY19waHkuaCIKKworc3RhdGljIGludCByZXNldF9vbmVfbWlpX3BoeShzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgcGh5X2lkKQoreworCXUxNiB2YWw7CisJaW50IGxpbWl0ID0gMTAwMDA7CisKKwl2YWwgPSBfX3BoeV9yZWFkKHBoeSwgcGh5X2lkLCBNSUlfQk1DUik7CisJdmFsICY9IH5CTUNSX0lTT0xBVEU7CisJdmFsIHw9IEJNQ1JfUkVTRVQ7CisJX19waHlfd3JpdGUocGh5LCBwaHlfaWQsIE1JSV9CTUNSLCB2YWwpOworCisJdWRlbGF5KDEwMCk7CisKKwl3aGlsZSAobGltaXQtLSkgeworCQl2YWwgPSBfX3BoeV9yZWFkKHBoeSwgcGh5X2lkLCBNSUlfQk1DUik7CisJCWlmICgodmFsICYgQk1DUl9SRVNFVCkgPT0gMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoKHZhbCAmIEJNQ1JfSVNPTEFURSkgJiYgbGltaXQgPiAwKQorCQlfX3BoeV93cml0ZShwaHksIHBoeV9pZCwgTUlJX0JNQ1IsIHZhbCAmIH5CTUNSX0lTT0xBVEUpOworCisJcmV0dXJuIChsaW1pdCA8PSAwKTsKK30KKworc3RhdGljIGludCBjaXM4MjAxX2luaXQoc3RydWN0IG1paV9waHkgKnBoeSkKK3sKKwl1MTYgZXBjcjsKKworCWVwY3IgPSBwaHlfcmVhZChwaHksIE1JSV9DSVM4MjAxX0VQQ1IpOworCWVwY3IgJj0gfkVQQ1JfTU9ERV9NQVNLOworCisJc3dpdGNoIChwaHktPm1vZGUpIHsKKwljYXNlIFBIWV9NT0RFX1RCSToKKwkJZXBjciB8PSBFUENSX1RCSV9NT0RFOworCQlicmVhazsKKwljYXNlIFBIWV9NT0RFX1JUQkk6CisJCWVwY3IgfD0gRVBDUl9SVEJJX01PREU7CisJCWJyZWFrOworCWNhc2UgUEhZX01PREVfR01JSToKKwkJZXBjciB8PSBFUENSX0dNSUlfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBQSFlfTU9ERV9SR01JSToKKwlkZWZhdWx0OgorCQllcGNyIHw9IEVQQ1JfUkdNSUlfTU9ERTsKKwl9CisKKwlwaHlfd3JpdGUocGh5LCBNSUlfQ0lTODIwMV9FUENSLCBlcGNyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbm1paV9zZXR1cF9hbmVnKHN0cnVjdCBtaWlfcGh5ICpwaHksIHUzMiBhZHZlcnRpc2UpCit7CisJdTE2IGN0bCwgYWR2OworCisJcGh5LT5hdXRvbmVnID0gMTsKKwlwaHktPnNwZWVkID0gU1BFRURfMTA7CisJcGh5LT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwlwaHktPnBhdXNlID0gMDsKKwlwaHktPmFkdmVydGlzaW5nID0gYWR2ZXJ0aXNlOworCisJLyogU2V0dXAgc3RhbmRhcmQgYWR2ZXJ0aXNlICovCisJYWR2ID0gcGh5X3JlYWQocGh5LCBNSUlfQURWRVJUSVNFKTsKKwlhZHYgJj0gfihBRFZFUlRJU0VfQUxMIHwgQURWRVJUSVNFXzEwMEJBU0U0KTsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJYWR2IHw9IEFEVkVSVElTRV8xMEZVTEw7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQURWRVJUSVNFLCBhZHYpOworCisJLyogU3RhcnQvUmVzdGFydCBhbmVnICovCisJY3RsID0gcGh5X3JlYWQocGh5LCBNSUlfQk1DUik7CisJY3RsIHw9IChCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpOworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBjdGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VubWlpX3NldHVwX2ZvcmNlZChzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgc3BlZWQsIGludCBmZCkKK3sKKwl1MTYgY3RsOworCisJcGh5LT5hdXRvbmVnID0gMDsKKwlwaHktPnNwZWVkID0gc3BlZWQ7CisJcGh5LT5kdXBsZXggPSBmZDsKKwlwaHktPnBhdXNlID0gMDsKKworCWN0bCA9IHBoeV9yZWFkKHBoeSwgTUlJX0JNQ1IpOworCWN0bCAmPSB+KEJNQ1JfRlVMTERQTFggfCBCTUNSX1NQRUVEMTAwIHwgQk1DUl9BTkVOQUJMRSk7CisKKwkvKiBGaXJzdCByZXNldCB0aGUgUEhZICovCisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIGN0bCB8IEJNQ1JfUkVTRVQpOworCisJLyogU2VsZWN0IHNwZWVkICYgZHVwbGV4ICovCisJc3dpdGNoIChzcGVlZCkgeworCWNhc2UgU1BFRURfMTA6CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwOgorCQljdGwgfD0gQk1DUl9TUEVFRDEwMDsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDAwOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZmQgPT0gRFVQTEVYX0ZVTEwpCisJCWN0bCB8PSBCTUNSX0ZVTExEUExYOworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBjdGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VubWlpX3BvbGxfbGluayhzdHJ1Y3QgbWlpX3BoeSAqcGh5KQoreworCXUxNiBzdGF0dXM7CisKKwkodm9pZClwaHlfcmVhZChwaHksIE1JSV9CTVNSKTsKKwlzdGF0dXMgPSBwaHlfcmVhZChwaHksIE1JSV9CTVNSKTsKKwlpZiAoKHN0YXR1cyAmIEJNU1JfTFNUQVRVUykgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHBoeS0+YXV0b25lZyAmJiAhKHN0YXR1cyAmIEJNU1JfQU5FR0NPTVBMRVRFKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUJTUlJX0NJUzgyMDFfQUNTUgkweDFjCisjZGVmaW5lICBBQ1NSX0RVUExFWF9TVEFUVVMJMHgwMDIwCisjZGVmaW5lICBBQ1NSX1NQRUVEXzEwMDBCQVNFVAkweDAwMTAKKyNkZWZpbmUgIEFDU1JfU1BFRURfMTAwQkFTRVQJMHgwMDA4CisKK3N0YXRpYyBpbnQgY2lzODIwMV9yZWFkX2xpbmsoc3RydWN0IG1paV9waHkgKnBoeSkKK3sKKwl1MTYgYWNzcjsKKworCWlmIChwaHktPmF1dG9uZWcpIHsKKwkJYWNzciA9IHBoeV9yZWFkKHBoeSwgTUlJX0NJUzgyMDFfQUNTUik7CisKKwkJaWYgKGFjc3IgJiBBQ1NSX0RVUExFWF9TVEFUVVMpCisJCQlwaHktPmR1cGxleCA9IERVUExFWF9GVUxMOworCQllbHNlCisJCQlwaHktPmR1cGxleCA9IERVUExFWF9IQUxGOworCQlpZiAoYWNzciAmIEFDU1JfU1BFRURfMTAwMEJBU0VUKSB7CisJCQlwaHktPnNwZWVkID0gU1BFRURfMTAwMDsKKwkJfSBlbHNlIGlmIChhY3NyICYgQUNTUl9TUEVFRF8xMDBCQVNFVCkKKwkJCXBoeS0+c3BlZWQgPSBTUEVFRF8xMDA7CisJCWVsc2UKKwkJCXBoeS0+c3BlZWQgPSBTUEVFRF8xMDsKKwkJcGh5LT5wYXVzZSA9IDA7CisJfQorCS8qIE9uIG5vbi1hbmVnLCB3ZSBhc3N1bWUgd2hhdCB3ZSBwdXQgaW4gQk1DUiBpcyB0aGUgc3BlZWQsCisJICogdGhvdWdoIG1hZ2ljLWFuZWcgc2hvdWxkbid0IHByZXZlbnQgdGhpcyBjYXNlIGZyb20gb2NjdXJyaW5nCisJICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW5taWlfcmVhZF9saW5rKHN0cnVjdCBtaWlfcGh5ICpwaHkpCit7CisJdTE2IGxwYTsKKworCWlmIChwaHktPmF1dG9uZWcpIHsKKwkJbHBhID0gcGh5X3JlYWQocGh5LCBNSUlfTFBBKSAmIHBoeV9yZWFkKHBoeSwgTUlJX0FEVkVSVElTRSk7CisKKwkJcGh5LT5zcGVlZCA9IFNQRUVEXzEwOworCQlwaHktPmR1cGxleCA9IERVUExFWF9IQUxGOworCQlwaHktPnBhdXNlID0gMDsKKworCQlpZiAobHBhICYgKExQQV8xMDBGVUxMIHwgTFBBXzEwMEhBTEYpKSB7CisJCQlwaHktPnNwZWVkID0gU1BFRURfMTAwOworCQkJaWYgKGxwYSAmIExQQV8xMDBGVUxMKQorCQkJCXBoeS0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCX0gZWxzZSBpZiAobHBhICYgTFBBXzEwRlVMTCkKKwkJCXBoeS0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJfQorCS8qIE9uIG5vbi1hbmVnLCB3ZSBhc3N1bWUgd2hhdCB3ZSBwdXQgaW4gQk1DUiBpcyB0aGUgc3BlZWQsCisJICogdGhvdWdoIG1hZ2ljLWFuZWcgc2hvdWxkbid0IHByZXZlbnQgdGhpcyBjYXNlIGZyb20gb2NjdXJyaW5nCisJICovCisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNSUlfQkFTSUNfRkVBVFVSRVMJKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwgXAorCQkJCSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwgXAorCQkJCSBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF9NSUkpCisjZGVmaW5lIE1JSV9HQklUX0ZFQVRVUkVTCShNSUlfQkFTSUNfRkVBVFVSRVMgfCBcCisJCQkJIFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkKKworLyogQ0lTODIwMSBwaHkgb3BzICovCitzdGF0aWMgc3RydWN0IG1paV9waHlfb3BzIGNpczgyMDFfcGh5X29wcyA9IHsKKwlpbml0OmNpczgyMDFfaW5pdCwKKwlzZXR1cF9hbmVnOmdlbm1paV9zZXR1cF9hbmVnLAorCXNldHVwX2ZvcmNlZDpnZW5taWlfc2V0dXBfZm9yY2VkLAorCXBvbGxfbGluazpnZW5taWlfcG9sbF9saW5rLAorCXJlYWRfbGluazpjaXM4MjAxX3JlYWRfbGluaworfTsKKworLyogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgbW9zdCAxMC8xMDAgUEhZcyAqLworc3RhdGljIHN0cnVjdCBtaWlfcGh5X29wcyBnZW5lcmljX3BoeV9vcHMgPSB7CisJc2V0dXBfYW5lZzpnZW5taWlfc2V0dXBfYW5lZywKKwlzZXR1cF9mb3JjZWQ6Z2VubWlpX3NldHVwX2ZvcmNlZCwKKwlwb2xsX2xpbms6Z2VubWlpX3BvbGxfbGluaywKKwlyZWFkX2xpbms6Z2VubWlpX3JlYWRfbGluaworfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5X2RlZiBjaXM4MjAxX3BoeV9kZWYgPSB7CisJcGh5X2lkOjB4MDAwZmM0MTAsCisJcGh5X2lkX21hc2s6MHgwMDBmZmZmMCwKKwluYW1lOiJDSVM4MjAxIEdpZ2FiaXQgRXRoZXJuZXQiLAorCWZlYXR1cmVzOk1JSV9HQklUX0ZFQVRVUkVTLAorCW1hZ2ljX2FuZWc6MCwKKwlvcHM6JmNpczgyMDFfcGh5X29wcworfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5X2RlZiBnZW5taWlfcGh5X2RlZiA9IHsKKwlwaHlfaWQ6MHgwMDAwMDAwMCwKKwlwaHlfaWRfbWFzazoweDAwMDAwMDAwLAorCW5hbWU6IkdlbmVyaWMgTUlJIiwKKwlmZWF0dXJlczpNSUlfQkFTSUNfRkVBVFVSRVMsCisJbWFnaWNfYW5lZzowLAorCW9wczomZ2VuZXJpY19waHlfb3BzCit9OworCitzdGF0aWMgc3RydWN0IG1paV9waHlfZGVmICptaWlfcGh5X3RhYmxlW10gPSB7CisJJmNpczgyMDFfcGh5X2RlZiwKKwkmZ2VubWlpX3BoeV9kZWYsCisJTlVMTAorfTsKKworaW50IG1paV9waHlfcHJvYmUoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IG1paV9pZCkKK3sKKwlpbnQgcmM7CisJdTMyIGlkOworCXN0cnVjdCBtaWlfcGh5X2RlZiAqZGVmOworCWludCBpOworCisJcGh5LT5hdXRvbmVnID0gMDsKKwlwaHktPmFkdmVydGlzaW5nID0gMDsKKwlwaHktPm1paV9pZCA9IG1paV9pZDsKKwlwaHktPnNwZWVkID0gMDsKKwlwaHktPmR1cGxleCA9IDA7CisJcGh5LT5wYXVzZSA9IDA7CisKKwkvKiBUYWtlIFBIWSBvdXQgb2YgaXNsb2F0ZSBtb2RlIGFuZCByZXNldCBpdC4gKi8KKwlyYyA9IHJlc2V0X29uZV9taWlfcGh5KHBoeSwgbWlpX2lkKTsKKwlpZiAocmMpCisJCXJldHVybiAtRU5PREVWOworCisJLyogUmVhZCBJRCBhbmQgZmluZCBtYXRjaGluZyBlbnRyeSAqLworCWlkID0gKHBoeV9yZWFkKHBoeSwgTUlJX1BIWVNJRDEpIDw8IDE2IHwgcGh5X3JlYWQocGh5LCBNSUlfUEhZU0lEMikpCisJICAgICYgMHhmZmZmZmZmMDsKKwlmb3IgKGkgPSAwOyAoZGVmID0gbWlpX3BoeV90YWJsZVtpXSkgIT0gTlVMTDsgaSsrKQorCQlpZiAoKGlkICYgZGVmLT5waHlfaWRfbWFzaykgPT0gZGVmLT5waHlfaWQpCisJCQlicmVhazsKKwkvKiBTaG91bGQgbmV2ZXIgYmUgTlVMTCAod2UgaGF2ZSBhIGdlbmVyaWMgZW50cnkpLCBidXQuLi4gKi8KKwlpZiAoZGVmID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJcGh5LT5kZWYgPSBkZWY7CisKKwkvKiBTZXR1cCBkZWZhdWx0IGFkdmVydGlzaW5nICovCisJcGh5LT5hZHZlcnRpc2luZyA9IGRlZi0+ZmVhdHVyZXM7CisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfcGh5LmggYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19waHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWFmYmVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfcGh5LmgKQEAgLTAsMCArMSwxMzcgQEAKKworLyoKKyAqIGlibV9lbWFjX3BoeS5oCisgKgorICoKKyAqICAgICAgQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICogICAgICBGZWJydWFyeSAyMDAzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgICBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCisgKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCAgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoKKyAqIFRoaXMgZmlsZSBiYXNpY2FsbHkgZHVwbGljYXRlcyBzdW5nZW1fcGh5LntjLGh9IHdpdGggZGlmZmVyZW50IFBIWXMKKyAqIHN1cHBvcnRlZC4gSSdtIGxvb2tpbmcgaW50byBtZXJnaW5nIHRoYXQgaW4gYSBzaW5nbGUgbWlpIGxheWVyIG1vcmUKKyAqIGZsZXhpYmxlIHRoYW4gbWlpLmMgCisgKi8KKworI2lmbmRlZiBfSUJNX0VNQUNfUEhZX0hfCisjZGVmaW5lIF9JQk1fRU1BQ19QSFlfSF8KKworLyoKKyAqIFBIWSBtb2RlIHNldHRpbmdzCisgKiBVc2VkIGZvciBtdWx0aS1tb2RlIGNhcGFibGUgUEhZcworICovCisjZGVmaW5lIFBIWV9NT0RFX05BCTAKKyNkZWZpbmUgUEhZX01PREVfTUlJCTEKKyNkZWZpbmUgUEhZX01PREVfUk1JSQkyCisjZGVmaW5lIFBIWV9NT0RFX1NNSUkJMworI2RlZmluZSBQSFlfTU9ERV9SR01JSQk0CisjZGVmaW5lIFBIWV9NT0RFX1RCSQk1CisjZGVmaW5lIFBIWV9NT0RFX0dNSUkJNgorI2RlZmluZSBQSFlfTU9ERV9SVEJJCTcKKyNkZWZpbmUgUEhZX01PREVfU0dNSUkJOAorCisvKgorICogUEhZIHNwZWNpZmljIHJlZ2lzdGVycy92YWx1ZXMKKyAqLworCisvKiBDSVM4MjAxICovCisjZGVmaW5lIE1JSV9DSVM4MjAxX0VQQ1IJMHgxNworI2RlZmluZSBFUENSX01PREVfTUFTSwkJMHgzMDAwCisjZGVmaW5lIEVQQ1JfR01JSV9NT0RFCQkweDAwMDAKKyNkZWZpbmUgRVBDUl9SR01JSV9NT0RFCQkweDEwMDAKKyNkZWZpbmUgRVBDUl9UQklfTU9ERQkJMHgyMDAwCisjZGVmaW5lIEVQQ1JfUlRCSV9NT0RFCQkweDMwMDAKKworc3RydWN0IG1paV9waHk7CisKKy8qIE9wZXJhdGlvbnMgc3VwcG9ydGVkIGJ5IGFueSBraW5kIG9mIFBIWSAqLworc3RydWN0IG1paV9waHlfb3BzIHsKKwlpbnQgKCppbml0KSAoc3RydWN0IG1paV9waHkgKiBwaHkpOworCWludCAoKnN1c3BlbmQpIChzdHJ1Y3QgbWlpX3BoeSAqIHBoeSwgaW50IHdvbF9vcHRpb25zKTsKKwlpbnQgKCpzZXR1cF9hbmVnKSAoc3RydWN0IG1paV9waHkgKiBwaHksIHUzMiBhZHZlcnRpc2UpOworCWludCAoKnNldHVwX2ZvcmNlZCkgKHN0cnVjdCBtaWlfcGh5ICogcGh5LCBpbnQgc3BlZWQsIGludCBmZCk7CisJaW50ICgqcG9sbF9saW5rKSAoc3RydWN0IG1paV9waHkgKiBwaHkpOworCWludCAoKnJlYWRfbGluaykgKHN0cnVjdCBtaWlfcGh5ICogcGh5KTsKK307CisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIHN0YXRpY2FsbHkgZGVmaW5lIGFuIG1paS9naWkgYmFzZWQgUEhZICovCitzdHJ1Y3QgbWlpX3BoeV9kZWYgeworCXUzMiBwaHlfaWQ7CQkvKiBDb25jYXRlbmF0ZWQgSUQxIDw8IDE2IHwgSUQyICovCisJdTMyIHBoeV9pZF9tYXNrOwkvKiBTaWduaWZpY2FudCBiaXRzICovCisJdTMyIGZlYXR1cmVzOwkJLyogRXRodG9vbCBTVVBQT1JURURfKiBkZWZpbmVzICovCisJaW50IG1hZ2ljX2FuZWc7CQkvKiBBdXRvbmVnIGRvZXMgYWxsIHNwZWVkIHRlc3QgZm9yIHVzICovCisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBzdHJ1Y3QgbWlpX3BoeV9vcHMgKm9wczsKK307CisKKy8qIEFuIGluc3RhbmNlIG9mIGEgUEhZLCBwYXJ0aWFsbHkgYm9ycm93ZWQgZnJvbSBtaWlfaWZfaW5mbyAqLworc3RydWN0IG1paV9waHkgeworCXN0cnVjdCBtaWlfcGh5X2RlZiAqZGVmOworCWludCBhZHZlcnRpc2luZzsKKwlpbnQgbWlpX2lkOworCisJLyogMTogYXV0b25lZyBlbmFibGVkLCAwOiBkaXNhYmxlZCAqLworCWludCBhdXRvbmVnOworCisJLyogZm9yY2VkIHNwZWVkICYgZHVwbGV4IChubyBhdXRvbmVnKQorCSAqIHBhcnRuZXIgc3BlZWQgJiBkdXBsZXggJiBwYXVzZSAoYXV0b25lZykKKwkgKi8KKwlpbnQgc3BlZWQ7CisJaW50IGR1cGxleDsKKwlpbnQgcGF1c2U7CisKKwkvKiBQSFkgbW9kZSAtIGlmIG5lZWRlZCAqLworCWludCBtb2RlOworCisJLyogUHJvdmlkZWQgYnkgaG9zdCBjaGlwICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgKCptZGlvX3JlYWQpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IG1paV9pZCwgaW50IHJlZyk7CisJdm9pZCAoKm1kaW9fd3JpdGUpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IG1paV9pZCwgaW50IHJlZywKKwkJCSAgICBpbnQgdmFsKTsKK307CisKKy8qIFBhc3MgaW4gYSBzdHJ1Y3QgbWlpX3BoeSB3aXRoIGRldiwgbWRpb19yZWFkIGFuZCBtZGlvX3dyaXRlCisgKiBmaWxsZWQsIHRoZSByZW1haW5pbmcgZmllbGRzIHdpbGwgYmUgZmlsbGVkIG9uIHJldHVybgorICovCitleHRlcm4gaW50IG1paV9waHlfcHJvYmUoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IG1paV9pZCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcGh5X3JlYWQoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IGlkLCBpbnQgcmVnKQoreworCXJldHVybiBwaHktPm1kaW9fcmVhZChwaHktPmRldiwgaWQsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3BoeV93cml0ZShzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgaWQsIGludCByZWcsIGludCB2YWwpCit7CisJcGh5LT5tZGlvX3dyaXRlKHBoeS0+ZGV2LCBpZCwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwaHlfcmVhZChzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgcmVnKQoreworCXJldHVybiBwaHktPm1kaW9fcmVhZChwaHktPmRldiwgcGh5LT5taWlfaWQsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwaHlfd3JpdGUoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IHJlZywgaW50IHZhbCkKK3sKKwlwaHktPm1kaW9fd3JpdGUocGh5LT5kZXYsIHBoeS0+bWlpX2lkLCByZWcsIHZhbCk7Cit9CisKKyNlbmRpZgkJCQkvKiBfSUJNX0VNQUNfUEhZX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19yZ21paS5oIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfcmdtaWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWYxODhmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfcmdtaWkuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogRGVmaW5lcyBmb3IgdGhlIElCTSBSR01JSSBicmlkZ2UKKyAqCisgKiBCYXNlZCBvbiBvY3Bfem1paS5oL2libV9lbWFjX3ptaWkuaAorICogQXJtaW4gS3VzdGVyIGFrdXN0ZXJAbXZpc3RhLmNvbQorICoKKyAqIENvcHlyaWdodCAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqIE1hdHQgUG9ydGVyIDxtcG9ydGVyQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9JQk1fRU1BQ19SR01JSV9IXworI2RlZmluZSBfSUJNX0VNQUNfUkdNSUlfSF8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisvKiBSR01JSSBicmlkZ2UgKi8KK3R5cGVkZWYgc3RydWN0IHJnbWlpX3JlZ3MgeworCXUzMiBmZXI7CQkvKiBGdW5jdGlvbiBlbmFibGUgcmVnaXN0ZXIgKi8KKwl1MzIgc3NyOwkJLyogU3BlZWQgc2VsZWN0IHJlZ2lzdGVyICovCit9IHJnbWlpX3Q7CisKKyNkZWZpbmUgUkdNSUlfSU5QVVRTCQkJNAorCisvKiBSR01JSSBkZXZpY2UgKi8KK3N0cnVjdCBpYm1fb2NwX3JnbWlpIHsKKwlzdHJ1Y3QgcmdtaWlfcmVncyAqYmFzZTsKKwlpbnQgbW9kZVtSR01JSV9JTlBVVFNdOworCWludCB1c2VyczsJCS8qIG51bWJlciBvZiBFTUFDcyB1c2luZyB0aGlzIFJHTUlJIGJyaWRnZSAqLworfTsKKworLyogRnVjdGlvbmFsIEVuYWJsZSBSZWcgKi8KKyNkZWZpbmUgUkdNSUlfRkVSX01BU0soeCkJCSgweDAwMDAwMDA3IDw8ICg0KngpKQorI2RlZmluZSBSR01JSV9SVEJJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBSR01JSV9SR01JSQkJCTB4MDAwMDAwMDUKKyNkZWZpbmUgUkdNSUlfVEJJICAJCQkweDAwMDAwMDA2CisjZGVmaW5lIFJHTUlJX0dNSUkgCQkJMHgwMDAwMDAwNworCisvKiBTcGVlZCBTZWxlY3Rpb24gcmVnICovCisKKyNkZWZpbmUgUkdNSUlfU1AyXzEwMAkweDAwMDAwMDAyCisjZGVmaW5lIFJHTUlJX1NQMl8xMDAwCTB4MDAwMDAwMDQKKyNkZWZpbmUgUkdNSUlfU1AzXzEwMAkweDAwMDAwMjAwCisjZGVmaW5lIFJHTUlJX1NQM18xMDAwCTB4MDAwMDA0MDAKKworI2RlZmluZSBSR01JSV9NSUkyX1NQRE1BU0sJIDB4MDAwMDAwMDcKKyNkZWZpbmUgUkdNSUlfTUlJM19TUERNQVNLCSAweDAwMDAwNzAwCisKKyNkZWZpbmUgUkdNSUlfTUlJMl8xMDBNQgkgUkdNSUlfU1AyXzEwMCAmIH5SR01JSV9TUDJfMTAwMAorI2RlZmluZSBSR01JSV9NSUkyXzEwMDBNQiAJIFJHTUlJX1NQMl8xMDAwICYgflJHTUlJX1NQMl8xMDAKKyNkZWZpbmUgUkdNSUlfTUlJMl8xME1CCQkgfihSR01JSV9TUDJfMTAwIHwgUkdNSUlfU1AyXzEwMDApCisjZGVmaW5lIFJHTUlJX01JSTNfMTAwTUIJIFJHTUlJX1NQM18xMDAgJiB+UkdNSUlfU1AzXzEwMDAKKyNkZWZpbmUgUkdNSUlfTUlJM18xMDAwTUIgCSBSR01JSV9TUDNfMTAwMCAmIH5SR01JSV9TUDNfMTAwCisjZGVmaW5lIFJHTUlJX01JSTNfMTBNQgkJIH4oUkdNSUlfU1AzXzEwMCB8IFJHTUlJX1NQM18xMDAwKQorCisjZGVmaW5lIFJUQkkJCTAKKyNkZWZpbmUgUkdNSUkJCTEKKyNkZWZpbmUgVEJJCQkyCisjZGVmaW5lIEdNSUkJCTMKKworI2VuZGlmCQkJCS8qIF9JQk1fRU1BQ19SR01JSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfdGFoLmggYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY190YWguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2ZjNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfdGFoLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIERlZmluZXMgZm9yIHRoZSBJQk0gVEFICisgKgorICogQ29weXJpZ2h0IDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0lCTV9FTUFDX1RBSF9ICisjZGVmaW5lIF9JQk1fRU1BQ19UQUhfSAorCisvKiBUQUggKi8KK3R5cGVkZWYgc3RydWN0IHRhaF9yZWdzIHsKKwl1MzIgdGFoX3JldmlkOworCXUzMiBwYWRbM107CisJdTMyIHRhaF9tcjsKKwl1MzIgdGFoX3NzcjA7CisJdTMyIHRhaF9zc3IxOworCXUzMiB0YWhfc3NyMjsKKwl1MzIgdGFoX3NzcjM7CisJdTMyIHRhaF9zc3I0OworCXUzMiB0YWhfc3NyNTsKKwl1MzIgdGFoX3RzcjsKK30gdGFoX3Q7CisKKy8qIFRBSCBlbmdpbmUgKi8KKyNkZWZpbmUgVEFIX01SX0NWUgkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgVEFIX01SX1NSCQkJMHg0MDAwMDAwMAorI2RlZmluZSBUQUhfTVJfU1RfMjU2CQkJMHgwMTAwMDAwMAorI2RlZmluZSBUQUhfTVJfU1RfNTEyCQkJMHgwMjAwMDAwMAorI2RlZmluZSBUQUhfTVJfU1RfNzY4CQkJMHgwMzAwMDAwMAorI2RlZmluZSBUQUhfTVJfU1RfMTAyNAkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgVEFIX01SX1NUXzEyODAJCQkweDA1MDAwMDAwCisjZGVmaW5lIFRBSF9NUl9TVF8xNTM2CQkJMHgwNjAwMDAwMAorI2RlZmluZSBUQUhfTVJfVEZTXzE2S0IJCQkweDAwMDAwMDAwCisjZGVmaW5lIFRBSF9NUl9URlNfMktCCQkJMHgwMDIwMDAwMAorI2RlZmluZSBUQUhfTVJfVEZTXzRLQgkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgVEFIX01SX1RGU182S0IJCQkweDAwNjAwMDAwCisjZGVmaW5lIFRBSF9NUl9URlNfOEtCCQkJMHgwMDgwMDAwMAorI2RlZmluZSBUQUhfTVJfVEZTXzEwS0IJCQkweDAwYTAwMDAwCisjZGVmaW5lIFRBSF9NUl9EVEZQCQkJMHgwMDEwMDAwMAorI2RlZmluZSBUQUhfTVJfRElHCQkJMHgwMDA4MDAwMAorCisjZW5kaWYJCQkJLyogX0lCTV9FTUFDX1RBSF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY196bWlpLmggYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY196bWlpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2Y2QyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX3ptaWkuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogb2NwX3ptaWkuaAorICoKKyAqIERlZmluZXMgZm9yIHRoZSBJQk0gWk1JSSBicmlkZ2UKKyAqCisgKiAgICAgIEFybWluIEt1c3RlciBha3VzdGVyQG12aXN0YS5jb20KKyAqICAgICAgRGVjLCAyMDAxCisgKgorICogQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0YXJlIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0lCTV9FTUFDX1pNSUlfSF8KKyNkZWZpbmUgX0lCTV9FTUFDX1pNSUlfSF8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisvKiBaTUlJIGJyaWRnZSByZWdpc3RlcnMgKi8KK3N0cnVjdCB6bWlpX3JlZ3MgeworCXUzMiBmZXI7CQkvKiBGdW5jdGlvbiBlbmFibGUgcmVnICovCisJdTMyIHNzcjsJCS8qIFNwZWVkIHNlbGVjdCByZWcgKi8KKwl1MzIgc21paXJzOwkJLyogU01JSSBzdGF0dXMgcmVnICovCit9OworCisjZGVmaW5lIFpNSUlfSU5QVVRTCTQKKworLyogWk1JSSBkZXZpY2UgKi8KK3N0cnVjdCBpYm1fb2NwX3ptaWkgeworCXN0cnVjdCB6bWlpX3JlZ3MgKmJhc2U7CisJaW50IG1vZGVbWk1JSV9JTlBVVFNdOworCWludCB1c2VyczsJCS8qIG51bWJlciBvZiBFTUFDcyB1c2luZyB0aGlzIFpNSUkgYnJpZGdlICovCit9OworCisvKiBGdWN0aW9uYWwgRW5hYmxlIFJlZyAqLworCisjZGVmaW5lIFpNSUlfRkVSX01BU0soeCkJKDB4ZjAwMDAwMDAgPj4gKDQqeCkpCisKKyNkZWZpbmUgWk1JSV9NREkwCTB4ODAwMDAwMDAKKyNkZWZpbmUgWk1JSV9TTUlJMAkweDQwMDAwMDAwCisjZGVmaW5lIFpNSUlfUk1JSTAJMHgyMDAwMDAwMAorI2RlZmluZSBaTUlJX01JSTAJMHgxMDAwMDAwMAorI2RlZmluZSBaTUlJX01ESTEJMHgwODAwMDAwMAorI2RlZmluZSBaTUlJX1NNSUkxCTB4MDQwMDAwMDAKKyNkZWZpbmUgWk1JSV9STUlJMQkweDAyMDAwMDAwCisjZGVmaW5lIFpNSUlfTUlJMQkweDAxMDAwMDAwCisjZGVmaW5lIFpNSUlfTURJMgkweDAwODAwMDAwCisjZGVmaW5lIFpNSUlfU01JSTIJMHgwMDQwMDAwMAorI2RlZmluZSBaTUlJX1JNSUkyCTB4MDAyMDAwMDAKKyNkZWZpbmUgWk1JSV9NSUkyCTB4MDAxMDAwMDAKKyNkZWZpbmUgWk1JSV9NREkzCTB4MDAwODAwMDAKKyNkZWZpbmUgWk1JSV9TTUlJMwkweDAwMDQwMDAwCisjZGVmaW5lIFpNSUlfUk1JSTMJMHgwMDAyMDAwMAorI2RlZmluZSBaTUlJX01JSTMJMHgwMDAxMDAwMAorCisvKiBTcGVlZCBTZWxlY3Rpb24gcmVnICovCisKKyNkZWZpbmUgWk1JSV9TQ0kwCTB4NDAwMDAwMDAKKyNkZWZpbmUgWk1JSV9GU1MwCTB4MjAwMDAwMDAKKyNkZWZpbmUgWk1JSV9TUDAJMHgxMDAwMDAwMAorI2RlZmluZSBaTUlJX1NDSTEJMHgwNDAwMDAwMAorI2RlZmluZSBaTUlJX0ZTUzEJMHgwMjAwMDAwMAorI2RlZmluZSBaTUlJX1NQMQkweDAxMDAwMDAwCisjZGVmaW5lIFpNSUlfU0NJMgkweDAwNDAwMDAwCisjZGVmaW5lIFpNSUlfRlNTMgkweDAwMjAwMDAwCisjZGVmaW5lIFpNSUlfU1AyCTB4MDAxMDAwMDAKKyNkZWZpbmUgWk1JSV9TQ0kzCTB4MDAwNDAwMDAKKyNkZWZpbmUgWk1JSV9GU1MzCTB4MDAwMjAwMDAKKyNkZWZpbmUgWk1JSV9TUDMJMHgwMDAxMDAwMAorCisjZGVmaW5lIFpNSUlfTUlJMF8xMDBNQglaTUlJX1NQMAorI2RlZmluZSBaTUlJX01JSTBfMTBNQgl+Wk1JSV9TUDAKKyNkZWZpbmUgWk1JSV9NSUkxXzEwME1CCVpNSUlfU1AxCisjZGVmaW5lIFpNSUlfTUlJMV8xME1CCX5aTUlJX1NQMQorI2RlZmluZSBaTUlJX01JSTJfMTAwTUIJWk1JSV9TUDIKKyNkZWZpbmUgWk1JSV9NSUkyXzEwTUIJflpNSUlfU1AyCisjZGVmaW5lIFpNSUlfTUlJM18xMDBNQglaTUlJX1NQMworI2RlZmluZSBaTUlJX01JSTNfMTBNQgl+Wk1JSV9TUDMKKworLyogU01JSSBTdGF0dXMgcmVnICovCisKKyNkZWZpbmUgWk1JSV9TVFMwIDB4RkYwMDAwMDAJLyogRU1BQzAgc21paSBzdGF0dXMgbWFzayAqLworI2RlZmluZSBaTUlJX1NUUzEgMHgwMEZGMDAwMAkvKiBFTUFDMSBzbWlpIHN0YXR1cyBtYXNrICovCisKKyNkZWZpbmUgU01JSQkwCisjZGVmaW5lIFJNSUkJMQorI2RlZmluZSBNSUkJMgorI2RlZmluZSBNREkJMworCisjZW5kaWYJCQkJLyogX0lCTV9FTUFDX1pNSUlfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libWxhbmEuYyBiL2RyaXZlcnMvbmV0L2libWxhbmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWFkOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtbGFuYS5jCkBAIC0wLDAgKzEsMTA4MCBAQAorLyogCituZXQtMy1kcml2ZXIgZm9yIHRoZSBJQk0gTEFOIEFkYXB0ZXIvQQorCitUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGlzIGNvdmVyZWQgYnkgdGhlCitzYW1lIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoYXQgY292ZXJzIHRoYXQgd29yay4KKworQ29weXJpZ2h0IDE5OTkgYnkgQWxmcmVkIEFybm9sZCAoYWxmcmVkQGNjYWMucnd0aC1hYWNoZW4uZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGZyZWQuYXJub2xkQGxhbmNvbS5kZSkKKworVGhpcyBkcml2ZXIgaXMgYmFzZWQgYm90aCBvbiB0aGUgU0tfTUNBIGRyaXZlciwgd2hpY2ggaXMgaXRzZWxmIGJhc2VkIG9uIHRoZQorU0tfRzE2IGFuZCAzQzUyMyBkcml2ZXIuCisKK3BhcGVyIHNvdXJjZXM6CisgICdQQyBIYXJkd2FyZTogQXVmYmF1LCBGdW5rdGlvbnN3ZWlzZSwgUHJvZ3JhbW1pZXJ1bmcnIGJ5IAorICBIYW5zLVBldGVyIE1lc3NtZXIgZm9yIHRoZSBiYXNpYyBNaWNyb2NoYW5uZWwgc3R1ZmYKKyAgCisgICdMaW51eCBHZXJhZXRldHJlaWJlcicgYnkgQWxsZXNhbmRybyBSdWJpbmksIEthbGxlIERhbGhlaW1lcgorICBmb3IgaGVscCBvbiBFdGhlcm5ldCBkcml2ZXIgcHJvZ3JhbW1pbmcKKworICAnRFA4MzkzNENWVUwtMjAvMjUgTUh6IFNPTklDLVQgRXRoZXJuZXQgQ29udHJvbGxlciBEYXRhc2hlZXQnIGJ5IE5hdGlvbmFsCisgIFNlbWljb25kdWN0b3IgZm9yIGluZm8gb24gdGhlIE1BQyBjaGlwCisKKyAgJ0xBTiBUZWNobmljYWwgUmVmZXJlbmNlIEV0aGVybmV0IEFkYXB0ZXIgSW50ZXJmYWNlIFZlcnNpb24gMSBSZWxlYXNlIDEuMAorICAgRG9jdW1lbnQgTnVtYmVyIFNDMzAtMzY2MS0wMCcgYnkgSUJNIGZvciBpbmZvIG9uIHRoZSBhZGFwdGVyIGl0c2VsZgorCisgIEFsc28gc2VlIGh0dHA6Ly93d3cubmF0c2VtaS5jb20vCisKK3NwZWNpYWwgYWNrbm93bGVkZ2VtZW50cyB0bzoKKyAgLSBCb2IgRWFnZXIgZm9yIGhlbHBpbmcgbWUgb3V0IHdpdGggZG9jdW1lbnRhdGlvbiBmcm9tIElCTQorICAtIEppbSBTaG9ybmV5IGZvciBoaXMgZW5kbGVzcyBwYXRpZW5jZSB3aXRoIG1lIHdoaWxlIEkgd2FzIHVzaW5nIAorICAgIGhpbSBhcyBhIGJldGEgdGVzdGVyIHRvIHRyYWNlIGRvd24gdGhlIGFkZHJlc3MgZmlsdGVyIGJ1ZyA7LSkKKworICBNaXNzaW5nIHRoaW5nczoKKworICAtPiBzZXQgZGVidWcgbGV2ZWwgdmlhIGlvY3RsIGluc3RlYWQgb2YgY29tcGlsZS10aW1lIHN3aXRjaGVzCisgIC0+IEkgZGlkbid0IGZvbGxvdyB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIDIuMS54IGtlcm5lbHMsIHNvIG15CisgICAgIGFzc3VtcHRpb25zIGFib3V0IHdoaWNoIHRoaW5ncyBjaGFuZ2VkIHdpdGggd2hpY2gga2VybmVsIHZlcnNpb24gCisgICAgIGFyZSBwcm9iYWJseSBub25zZW5zZQorCitIaXN0b3J5OgorICBOb3YgNnRoLCAxOTk5CisgIAlzdGFydHVwIGZyb20gU0tfTUNBIGRyaXZlcgorICBEZWMgNnRoLCAxOTk5CisJZmluYWxseSBnb3QgZG9jcyBhYm91dCB0aGUgY2FyZC4gIEEgYmlnIHRoYW5rIHlvdSB0byBCb2IgRWFnZXIhCisgIERlYyAxMnRoLCAxOTk5CisJZmlyc3QgcGFja2V0IHJlY2VpdmVkCisgIERlYyAxM3RoLCAxOTk5CisJcmVjdiBxdWV1ZSBkb25lLCB0Y3BkdW1wIHdvcmtzCisgIERlYyAxNXRoLCAxOTk5CisJdHJhbnNtaXNzaW9uIHBhcnQgd29ya3MKKyAgRGVjIDI4dGgsIDE5OTkKKwlhZGRlZCB1c2FnZSBvZiB0aGUgaXNhX2Z1bmN0aW9ucyBmb3IgTGludXggMi4zIC4gIFRoaW5ncyBzaG91bGQKKwlzdGlsbCB3b3JrIHdpdGggMi4wLnguLi4uCisgIEphbiAyOHRoLCAyMDAwCisJaW4gTGludXggMi4yLjEzLCB0aGUgdmVyc2lvbi5oIGZpbGUgbXlzdGVyaW91c2x5IGRpZG4ndCBnZXQKKwlpbmNsdWRlZC4gIEFkZGVkIGEgd29ya2Fyb3VuZCBmb3IgdGhpcy4gIEZ1dGhlcm1vcmUsIGl0IG5vdworCW5vdCBvbmx5IGNvbXBpbGVzIGFzIGEgbW9kdWxlcyA7LSkKKyAgSmFuIDMwdGgsIDIwMDAKKwluZXdlciBrZXJuZWxzIGF1dG9tYXRpY2FsbHkgcHJvYmUgbW9yZSB0aGFuIG9uZSBib2FyZCwgc28gdGhlCisJJ3N0YXJ0c2xvdCcgYXMgYSB2YXJpYWJsZSBpcyBhbHNvIG5lZWRlZCBoZXJlCisgIEFwciAxMnRoLCAyMDAwCisJdGhlIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyIGlzIG5vdCBzZXQgJ2hhcmQnIGluc3RlYWQgb2YgaW5kaXZpZHVhbGx5CisJc2V0dGluZyByZWdpc3RlcnMsIHNpbmNlIHRoaXMgc2VlbXMgdG8gc2V0IGJpdHMgdGhhdCBzaG91bGRuJ3QgYmUKKwlzZXQKKyAgTWF5IDIxc3QsIDIwMDAKKwlyZXNldCBpbnRlcnJ1cHQgc3RhdHVzIGltbWVkaWF0ZWx5IGFmdGVyIENBTSBsb2FkCisJYWRkIGEgcmVjb3ZlcnkgZGVsYXkgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBjaGlwJ3MgcmVzZXQgbGluZQorICBNYXkgMjR0aCwgMjAwMAorCWZpbmFsbHkgZm91bmQgdGhlIGJ1ZyBpbiB0aGUgYWRkcmVzcyBmaWx0ZXIgc2V0dXAgLSBkYW1uZWQgc2lnbmVkCisgICAgICAgIGNoYXJzIQorICBKdW5lIDFzdCwgMjAwMAorCWNvcnJlY3RlZCB2ZXJzaW9uIGNvZGVzLCBhZGRlZCBzdXBwb3J0IGZvciB0aGUgbGF0ZXN0IDIuMyBjaGFuZ2VzCisgIE9jdCAyOHRoLCAyMDAyCisgIAljbGVhbmVkIHVwIGZvciB0aGUgMi41IHRyZWUgPGFsYW5AcmVkaGF0LmNvbT4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EtbGVnYWN5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBfSUJNX0xBTkFfRFJJVkVSXworI2luY2x1ZGUgImlibWxhbmEuaCIKKworI3VuZGVmIERFQlVHCisKKyNkZWZpbmUgRFJWX05BTUUgImlibWxhbmEiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZ2xvYmFsIHN0YXRpYyBkYXRhIC0gbm90IG1vcmUgc2luY2Ugd2UgY2FuIGhhbmRsZSBtdWx0aXBsZSBib2FyZHMgYW5kCisgKiBoYXZlIHRvIHBhY2sgYWxsIHN0YXRlIGluZm8gaW50byB0aGUgZGV2aWNlIHN0cnVjdCEKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY2hhciAqTWVkaWFOYW1lc1tNZWRpYV9Db3VudF0gPSB7CisJIjEwQmFzZVQiLCAiMTBCYXNlNSIsICJVbmtub3duIiwgIjEwQmFzZTIiCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHByaXZhdGUgc3ViZnVuY3Rpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIERFQlVHCisgIC8qIGR1bXAgYWxsIHJlZ2lzdGVycyAqLworCitzdGF0aWMgdm9pZCBkdW1wcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCB6OworCisJZm9yICh6ID0gMDsgeiA8IDE2MDsgeiArPSAyKSB7CisJCWlmICghKHogJiAxNSkpCisJCQlwcmludGsoIlJFR1M6ICUwNHg6Iiwgeik7CisJCXByaW50aygiICUwNHgiLCBpbncoZGV2LT5iYXNlX2FkZHIgKyB6KSk7CisJCWlmICgoeiAmIDE1KSA9PSAxNCkKKwkJCXByaW50aygiXG4iKTsKKwl9Cit9CisKKy8qIGR1bXAgcGFydHMgb2Ygc2hhcmVkIG1lbW9yeSAtIG9ubHkgbmVlZGVkIGR1cmluZyBkZWJ1Z2dpbmcgKi8KKworc3RhdGljIHZvaWQgZHVtcG1lbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RhcnQsIHUzMiBsZW4pCit7CisJaWJtbGFuYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgejsKKworCXByaW50aygiQWRkcmVzcyAlMDR4OlxuIiwgc3RhcnQpOworCWZvciAoeiA9IDA7IHogPCBsZW47IHorKykgeworCQlpZiAoKHogJiAxNSkgPT0gMCkKKwkJCXByaW50aygiJTA0eDoiLCB6KTsKKwkJcHJpbnRrKCIgJTAyeCIsIHJlYWRiKHByaXYtPmJhc2UgKyBzdGFydCArIHopKTsKKwkJaWYgKCh6ICYgMTUpID09IDE1KQorCQkJcHJpbnRrKCJcbiIpOworCX0KKwlpZiAoKHogJiAxNSkgIT0gMCkKKwkJcHJpbnRrKCJcbiIpOworfQorCisvKiBwcmludCBleGFjdCB0aW1lIC0gZGl0dG8gKi8KKworc3RhdGljIHZvaWQgUHJUaW1lKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwlwcmludGsoIiU5ZDolMDZkOiAiLCAoaW50KSB0di50dl9zZWMsIChpbnQpIHR2LnR2X3VzZWMpOworfQorI2VuZGlmCQkJCS8qIERFQlVHICovCisKKy8qIGRlZHVjZSByZXNvdXJjZXMgb3V0IG9mIFBPUyByZWdpc3RlcnMgKi8KKworc3RhdGljIHZvaWQgZ2V0YWRkcnMoaW50IHNsb3QsIGludCAqYmFzZSwgaW50ICptZW1sZW4sIGludCAqaW9iYXNlLAorCQkgICAgIGludCAqaXJxLCBpYm1sYW5hX21lZGl1bSAqIG1lZGl1bSkKK3sKKwl1X2NoYXIgcG9zMCwgcG9zMTsKKworCXBvczAgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDIpOworCXBvczEgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDMpOworCisJKmJhc2UgPSAweGMwMDAwICsgKChwb3MxICYgMHhmMCkgPDwgOSk7CisJKm1lbWxlbiA9IChwb3MxICYgMHgwMSkgPyAweDgwMDAgOiAweDQwMDA7CisJKmlvYmFzZSA9IChwb3MwICYgMHhlMCkgPDwgNzsKKwlzd2l0Y2ggKHBvczAgJiAweDA2KSB7CisJY2FzZSAwOgorCQkqaXJxID0gNTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqaXJxID0gMTU7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJKmlycSA9IDEwOworCQlicmVhazsKKwljYXNlIDY6CisJCSppcnEgPSAxMTsKKwkJYnJlYWs7CisJfQorCSptZWRpdW0gPSAocG9zMCAmIDB4MTgpID4+IDM7Cit9CisKKy8qIHdhaXQgb24gcmVnaXN0ZXIgdmFsdWUgd2l0aCBtYXNrIGFuZCB0aW1lb3V0ICovCisKK3N0YXRpYyBpbnQgd2FpdF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWdvZmZzLCB1MTYgbWFzaywKKwkJCXUxNiB2YWx1ZSwgaW50IHRpbWVvdXQpCit7CisJdW5zaWduZWQgbG9uZyBmaW4gPSBqaWZmaWVzICsgdGltZW91dDsKKworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLGZpbikpCisJCWlmICgoaW53KGRldi0+YmFzZV9hZGRyICsgcmVnb2ZmcykgJiBtYXNrKSA9PSB2YWx1ZSkKKwkJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKworLyogcmVzZXQgdGhlIHdob2xlIGJvYXJkICovCisKK3N0YXRpYyB2b2lkIFJlc2V0Qm9hcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBjaGFyIGJjbXZhbDsKKworCS8qIHJlYWQgb3JpZ2luYWwgYm9hcmQgY29udHJvbCB2YWx1ZSAqLworCisJYmNtdmFsID0gaW5iKGRldi0+YmFzZV9hZGRyICsgQkNNUkVHKTsKKworCS8qIHNldCByZXNldCBiaXQgZm9yIGEgd2hpbGUgKi8KKworCWJjbXZhbCB8PSBCQ01SRUdfUkVTRVQ7CisJb3V0YihiY212YWwsIGRldi0+YmFzZV9hZGRyICsgQkNNUkVHKTsKKwl1ZGVsYXkoMTApOworCWJjbXZhbCAmPSB+QkNNUkVHX1JFU0VUOworCW91dGIoYmNtdmFsLCBkZXYtPmJhc2VfYWRkciArIEJDTVJFRyk7CisKKwkvKiBzd2l0Y2ggb3ZlciB0byBSQU0gYWdhaW4gKi8KKworCWJjbXZhbCB8PSBCQ01SRUdfUkFNRU4gfCBCQ01SRUdfUkFNV0lOOworCW91dGIoYmNtdmFsLCBkZXYtPmJhc2VfYWRkciArIEJDTVJFRyk7Cit9CisKKy8qIGNhbGN1bGF0ZSBSQU0gbGF5b3V0ICYgc2V0IHVwIGRlc2NyaXB0b3JzIGluIFJBTSAqLworCitzdGF0aWMgdm9pZCBJbml0RHNjcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpYm1sYW5hX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBhZGRyLCBiYWRkciwgcmFkZHI7CisJaW50IHo7CisJdGRhX3QgdGRhOworCXJkYV90IHJkYTsKKwlycmFfdCBycmE7CisKKwkvKiBpbml0aWFsaXplIFJBTSAqLworCisJbWVtc2V0X2lvKHByaXYtPmJhc2UsIDB4YWEsCisJCSAgICAgIGRldi0+bWVtX3N0YXJ0IC0gZGV2LT5tZW1fc3RhcnQpOwkvKiBYWFg6IHR5cG8/ICovCisKKwkvKiBzZXR1cCBuIFRYIGRlc2NyaXB0b3JzIC0gaW5kZXBlbmRlbnQgb2YgUkFNIHNpemUgKi8KKworCXByaXYtPnRkYXN0YXJ0ID0gYWRkciA9IDA7CisJcHJpdi0+dHhidWZzdGFydCA9IGJhZGRyID0gc2l6ZW9mKHRkYV90KSAqIFRYQlVGQ05UOworCWZvciAoeiA9IDA7IHogPCBUWEJVRkNOVDsgeisrKSB7CisJCXRkYS5zdGF0dXMgPSAwOworCQl0ZGEuY29uZmlnID0gMDsKKwkJdGRhLmxlbmd0aCA9IDA7CisJCXRkYS5mcmFnY291bnQgPSAxOworCQl0ZGEuc3RhcnRsbyA9IGJhZGRyOworCQl0ZGEuc3RhcnRoaSA9IDA7CisJCXRkYS5mcmFnbGVuZ3RoID0gMDsKKwkJaWYgKHogPT0gVFhCVUZDTlQgLSAxKQorCQkJdGRhLmxpbmsgPSBwcml2LT50ZGFzdGFydDsKKwkJZWxzZQorCQkJdGRhLmxpbmsgPSBhZGRyICsgc2l6ZW9mKHRkYV90KTsKKwkJdGRhLmxpbmsgfD0gMTsKKwkJbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIGFkZHIsICZ0ZGEsIHNpemVvZih0ZGFfdCkpOworCQlhZGRyICs9IHNpemVvZih0ZGFfdCk7CisJCWJhZGRyICs9IFBLVFNJWkU7CisJfQorCisJLyogY2FsY3VsYXRlIGhvdyBtYW55IHJlY2VpdmUgYnVmZmVycyBmaXQgaW50byByZW1haW5pbmcgbWVtb3J5ICovCisKKwlwcml2LT5yeGJ1ZmNudCA9IChkZXYtPm1lbV9lbmQgLSBkZXYtPm1lbV9zdGFydCAtIGJhZGRyKSAvIChzaXplb2YocnJhX3QpICsgc2l6ZW9mKHJkYV90KSArIFBLVFNJWkUpOworCisJLyogY2FsY3VsYXRlIHJlY2VpdmUgYWRkcmVzc2VzICovCisKKwlwcml2LT5ycmFzdGFydCA9IHJhZGRyID0gcHJpdi0+dHhidWZzdGFydCArIChUWEJVRkNOVCAqIFBLVFNJWkUpOworCXByaXYtPnJkYXN0YXJ0ID0gYWRkciA9IHByaXYtPnJyYXN0YXJ0ICsgKHByaXYtPnJ4YnVmY250ICogc2l6ZW9mKHJyYV90KSk7CisJcHJpdi0+cnhidWZzdGFydCA9IGJhZGRyID0gcHJpdi0+cmRhc3RhcnQgKyAocHJpdi0+cnhidWZjbnQgKiBzaXplb2YocmRhX3QpKTsKKwkKKwlmb3IgKHogPSAwOyB6IDwgcHJpdi0+cnhidWZjbnQ7IHorKykgeworCQlycmEuc3RhcnRsbyA9IGJhZGRyOworCQlycmEuc3RhcnRoaSA9IDA7CisJCXJyYS5jbnRsbyA9IFBLVFNJWkUgPj4gMTsKKwkJcnJhLmNudGhpID0gMDsKKwkJbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIHJhZGRyLCAmcnJhLCBzaXplb2YocnJhX3QpKTsKKworCQlyZGEuc3RhdHVzID0gMDsKKwkJcmRhLmxlbmd0aCA9IDA7CisJCXJkYS5zdGFydGxvID0gMDsKKwkJcmRhLnN0YXJ0aGkgPSAwOworCQlyZGEuc2Vxbm8gPSAwOworCQlpZiAoeiA8IHByaXYtPnJ4YnVmY250IC0gMSkKKwkJCXJkYS5saW5rID0gYWRkciArIHNpemVvZihyZGFfdCk7CisJCWVsc2UKKwkJCXJkYS5saW5rID0gMTsKKwkJcmRhLmludXNlID0gMTsKKwkJbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIGFkZHIsICZyZGEsIHNpemVvZihyZGFfdCkpOworCisJCWJhZGRyICs9IFBLVFNJWkU7CisJCXJhZGRyICs9IHNpemVvZihycmFfdCk7CisJCWFkZHIgKz0gc2l6ZW9mKHJkYV90KTsKKwl9CisKKwkvKiBpbml0aWFsaXplIGN1cnJlbnQgcG9pbnRlcnMgKi8KKworCXByaXYtPm5leHRyeGRlc2NyID0gMDsKKwlwcml2LT5sYXN0cnhkZXNjciA9IHByaXYtPnJ4YnVmY250IC0gMTsKKwlwcml2LT5uZXh0dHhkZXNjciA9IDA7CisJcHJpdi0+Y3VycnR4ZGVzY3IgPSAwOworCXByaXYtPnR4dXNlZGNudCA9IDA7CisJbWVtc2V0KHByaXYtPnR4dXNlZCwgMCwgc2l6ZW9mKHByaXYtPnR4dXNlZCkpOworfQorCisvKiBzZXQgdXAgUnggKyBUeCBkZXNjcmlwdG9ycyBpbiBTT05JQyAqLworCitzdGF0aWMgaW50IEluaXRTT05JQyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlibWxhbmFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBzZXQgdXAgc3RhcnQgJiBlbmQgb2YgcmVzb3VyY2UgYXJlYSAqLworCisJb3V0dygwLCBTT05JQ19VUlJBKTsKKwlvdXR3KHByaXYtPnJyYXN0YXJ0LCBkZXYtPmJhc2VfYWRkciArIFNPTklDX1JTQSk7CisJb3V0dyhwcml2LT5ycmFzdGFydCArIChwcml2LT5yeGJ1ZmNudCAqIHNpemVvZihycmFfdCkpLCBkZXYtPmJhc2VfYWRkciArIFNPTklDX1JFQSk7CisJb3V0dyhwcml2LT5ycmFzdGFydCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19SUlApOworCW91dHcocHJpdi0+cnJhc3RhcnQsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfUldQKTsKKworCS8qIHNldCBFT0JDIHNvIHRoYXQgb25seSBvbmUgcGFja2V0IGdvZXMgaW50byBvbmUgYnVmZmVyICovCisKKwlvdXR3KChQS1RTSVpFIC0gNCkgPj4gMSwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19FT0JDKTsKKworCS8qIGxldCBTT05JQyByZWFkIHRoZSBmaXJzdCBSUkEgZGVzY3JpcHRvciAqLworCisJb3V0dyhDTURSRUdfUlJSQSwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DTURSRUcpOworCWlmICghd2FpdF90aW1lb3V0KGRldiwgU09OSUNfQ01EUkVHLCBDTURSRUdfUlJSQSwgMCwgMikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogU09OSUMgZGlkIG5vdCByZXNwb25kIG9uIFJSUkEgY29tbWFuZCAtIGdpdmluZyB1cC4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBwb2ludCBTT05JQyB0byB0aGUgZmlyc3QgUkRBICovCisKKwlvdXR3KDAsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfVVJEQSk7CisJb3V0dyhwcml2LT5yZGFzdGFydCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DUkRBKTsKKworCS8qIHNldCB1cHBlciBoYWxmIG9mIFREQSBhZGRyZXNzICovCisKKwlvdXR3KDAsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfVVREQSk7CisKKwlyZXR1cm4gMTsKK30KKworLyogc3RvcCBTT05JQyBzbyB3ZSBjYW4gcmVpbml0aWFsaXplIGl0ICovCisKK3N0YXRpYyB2b2lkIFN0b3BTT05JQyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCisJb3V0YihpbmIoZGV2LT5iYXNlX2FkZHIgKyBCQ01SRUcpICYgKH5CQ01SRUdfSUVOKSwgZGV2LT5iYXNlX2FkZHIgKyBCQ01SRUcpOworCW91dGIoMCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19JTVJFRyk7CisKKwkvKiByZXNldCB0aGUgU09OSUMgKi8KKworCW91dHcoQ01EUkVHX1JTVCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DTURSRUcpOworCXVkZWxheSgxMCk7CisJb3V0dyhDTURSRUdfUlNULCBkZXYtPmJhc2VfYWRkciArIFNPTklDX0NNRFJFRyk7Cit9CisKKy8qIGluaXRpYWxpemUgY2FyZCBhbmQgU09OSUMgZm9yIHByb3BlciBvcGVyYXRpb24gKi8KKworc3RhdGljIHZvaWQgcHV0Y2FtKGNhbWVudHJ5X3QgKiBjYW1zLCBpbnQgKmNhbWNudCwgY2hhciAqYWRkcikKK3sKKwljYW1lbnRyeV90ICpwY2FtID0gY2FtcyArICgqY2FtY250KTsKKwl1OCAqdWFkZHIgPSAodTggKikgYWRkcjsKKworCXBjYW0tPmluZGV4ID0gKmNhbWNudDsKKwlwY2FtLT5hZGRyMCA9ICgoKHUxNikgdWFkZHJbMV0pIDw8IDgpIHwgdWFkZHJbMF07CisJcGNhbS0+YWRkcjEgPSAoKCh1MTYpIHVhZGRyWzNdKSA8PCA4KSB8IHVhZGRyWzJdOworCXBjYW0tPmFkZHIyID0gKCgodTE2KSB1YWRkcls1XSkgPDwgOCkgfCB1YWRkcls0XTsKKwkoKmNhbWNudCkrKzsKK30KKworc3RhdGljIHZvaWQgSW5pdEJvYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWJtbGFuYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgY2FtY250OworCWNhbWVudHJ5X3QgY2Ftc1sxNl07CisJdTMyIGNhbW1hc2s7CisJc3RydWN0IGRldl9tY19saXN0ICptY3B0cjsKKwl1MTYgcmNydmFsOworCisJLyogcmVzZXQgdGhlIFNPTklDICovCisKKwlvdXR3KENNRFJFR19SU1QsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfQ01EUkVHKTsKKwl1ZGVsYXkoMTApOworCisJLyogY2xlYXIgYWxsIHNwdXJpb3VzIGludGVycnVwdHMgKi8KKworCW91dHcoaW53KGRldi0+YmFzZV9hZGRyICsgU09OSUNfSVNSRUcpLCBkZXYtPmJhc2VfYWRkciArIFNPTklDX0lTUkVHKTsKKworCS8qIHNldCB1cCB0aGUgU09OSUMncyBidXMgaW50ZXJmYWNlIC0gY29uc3RhbnQgZm9yIHRoaXMgYWRhcHRlciAtCisJICAgbXVzdCBiZSBkb25lIHdoaWxlIHRoZSBTT05JQyBpcyBpbiByZXNldCAqLworCisJb3V0dyhEQ1JFR19VU1IxIHwgRENSRUdfVVNSMCB8IERDUkVHX1dDMSB8IERDUkVHX0RXMzIsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfRENSRUcpOworCW91dHcoMCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19EQ1JFRzIpOworCisJLyogcmVtb3ZlIHJlc2V0IGZvcm0gdGhlIFNPTklDICovCisKKwlvdXR3KDAsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfQ01EUkVHKTsKKwl1ZGVsYXkoMTApOworCisJLyogZGF0YSBzaGVldCByZXF1aXJlcyBVUlJBIHRvIGJlIHByb2dyYW1tZWQgYmVmb3JlIHNldHRpbmcgdXAgdGhlIENBTSBjb250ZW50cyAqLworCisJb3V0dygwLCBkZXYtPmJhc2VfYWRkciArIFNPTklDX1VSUkEpOworCisJLyogcHJvZ3JhbSB0aGUgQ0FNIGVudHJ5IDAgdG8gdGhlIGRldmljZSBhZGRyZXNzICovCisKKwljYW1jbnQgPSAwOworCXB1dGNhbShjYW1zLCAmY2FtY250LCBkZXYtPmRldl9hZGRyKTsKKworCS8qIHN0YXJ0IHB1dHRpbmcgdGhlIG11bHRpY2FzdCBhZGRyZXNzZXMgaW50byB0aGUgQ0FNIGxpc3QuICBTdG9wIGlmCisJICAgaXQgaXMgZnVsbC4gKi8KKworCWZvciAobWNwdHIgPSBkZXYtPm1jX2xpc3Q7IG1jcHRyICE9IE5VTEw7IG1jcHRyID0gbWNwdHItPm5leHQpIHsKKwkJcHV0Y2FtKGNhbXMsICZjYW1jbnQsIG1jcHRyLT5kbWlfYWRkcik7CisJCWlmIChjYW1jbnQgPT0gMTYpCisJCQlicmVhazsKKwl9CisKKwkvKiBjYWxjdWxhdGUgQ0FNIG1hc2sgKi8KKworCWNhbW1hc2sgPSAoMSA8PCBjYW1jbnQpIC0gMTsKKworCS8qIGZlZWQgQ0RBIGludG8gU09OSUMsIGluaXRpYWxpemUgUkNSIHZhbHVlIChhbHdheXMgZ2V0IGJyb2FkY2FzdHMpICovCisKKwltZW1jcHlfdG9pbyhwcml2LT5iYXNlLCBjYW1zLCBzaXplb2YoY2FtZW50cnlfdCkgKiBjYW1jbnQpOworCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyAoc2l6ZW9mKGNhbWVudHJ5X3QpICogY2FtY250KSwgJmNhbW1hc2ssIHNpemVvZihjYW1tYXNrKSk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiQ0FNIHNldHVwOlxuIik7CisJZHVtcG1lbShkZXYsIDAsIHNpemVvZihjYW1lbnRyeV90KSAqIGNhbWNudCArIHNpemVvZihjYW1tYXNrKSk7CisjZW5kaWYKKworCW91dHcoMCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DQU1QVFIpOworCW91dHcoY2FtY250LCBkZXYtPmJhc2VfYWRkciArIFNPTklDX0NBTUNOVCk7CisJb3V0dyhDTURSRUdfTENBTSwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DTURSRUcpOworCWlmICghd2FpdF90aW1lb3V0KGRldiwgU09OSUNfQ01EUkVHLCBDTURSRUdfTENBTSwgMCwgMikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczpTT05JQyBkaWQgbm90IHJlc3BvbmQgb24gTENBTSBjb21tYW5kIC0gZ2l2aW5nIHVwLiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQkvKiBjbGVhciBpbnRlcnJ1cHQgY29uZGl0aW9uICovCisKKwkJb3V0dyhJU1JFR19MQ0QsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfSVNSRUcpOworCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJMb2FkaW5nIENBTSBkb25lLCBhZGRyZXNzIHBvaW50ZXJzICUwNHg6JTA0eFxuIiwKKwkJICAgICAgIGludyhkZXYtPmJhc2VfYWRkciArIFNPTklDX1VSUkEpLAorCQkgICAgICAgaW53KGRldi0+YmFzZV9hZGRyICsgU09OSUNfQ0FNUFRSKSk7CisJCXsKKwkJCWludCB6OworCisJCQlwcmludGsoIlxuLS0+Q0FNOiBQVFIgJTA0eCBDTlQgJTA0eFxuIiwKKwkJCSAgICAgICBpbncoZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DQU1QVFIpLAorCQkJICAgICAgIGludyhkZXYtPmJhc2VfYWRkciArIFNPTklDX0NBTUNOVCkpOworCQkJb3V0dyhDTURSRUdfUlNULCBkZXYtPmJhc2VfYWRkciArIFNPTklDX0NNRFJFRyk7CisJCQlmb3IgKHogPSAwOyB6IDwgY2FtY250OyB6KyspIHsKKwkJCQlvdXR3KHosIGRldi0+YmFzZV9hZGRyICsgU09OSUNfQ0FNRVBUUik7CisJCQkJcHJpbnRrKCJFbnRyeSAlZDogJTA0eCAlMDR4ICUwNHhcbiIsIHosCisJCQkJICAgICAgIGludyhkZXYtPmJhc2VfYWRkciArIFNPTklDX0NBTUFERFIwKSwKKwkJCQkgICAgICAgaW53KGRldi0+YmFzZV9hZGRyICsgU09OSUNfQ0FNQUREUjEpLAorCQkJCSAgICAgICBpbncoZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DQU1BRERSMikpOworCQkJfQorCQkJb3V0dygwLCBkZXYtPmJhc2VfYWRkciArIFNPTklDX0NNRFJFRyk7CisJCX0KKyNlbmRpZgorCX0KKworCXJjcnZhbCA9IFJDUkVHX0JSRCB8IFJDUkVHX0xCX05PTkU7CisKKwkvKiBpZiBzdGlsbCBtdWx0aWNhc3QgYWRkcmVzc2VzIGxlZnQgb3IgQUxMTVVMVEkgaXMgc2V0LCBzZXQgdGhlIG11bHRpY2FzdAorCSAgIGVuYWJsZSBiaXQgKi8KKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwgKG1jcHRyICE9IE5VTEwpKQorCQlyY3J2YWwgfD0gUkNSRUdfQU1DOworCisJLyogcHJvbWlzY291cyBtb2RlID8gKi8KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCXJjcnZhbCB8PSBSQ1JFR19QUk87CisKKwkvKiBwcm9ncmFtIHJlY2VpdmUgbW9kZSAqLworCisJb3V0dyhyY3J2YWwsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfUkNSRUcpOworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJcblJDUlZBTDogJTA0eFxuIiwgcmNydmFsKTsKKyNlbmRpZgorCisJLyogc2V0IHVwIGRlc2NyaXB0b3JzIGluIHNoYXJlZCBtZW1vcnkgKyBmZWVkIHRoZW0gaW50byBTT05JQyByZWdpc3RlcnMgKi8KKworCUluaXREc2NycyhkZXYpOworCWlmICghSW5pdFNPTklDKGRldikpCisJCXJldHVybjsKKworCS8qIHJlc2V0IGFsbCBwZW5kaW5nIGludGVycnVwdHMgKi8KKworCW91dHcoMHhmZmZmLCBkZXYtPmJhc2VfYWRkciArIFNPTklDX0lTUkVHKTsKKworCS8qIGVuYWJsZSB0cmFuc21pdHRlciArIHJlY2VpdmVyIGludGVycnVwdHMgKi8KKworCW91dHcoQ01EUkVHX1JYRU4sIGRldi0+YmFzZV9hZGRyICsgU09OSUNfQ01EUkVHKTsKKwlvdXR3KElNUkVHX1BSWEVOIHwgSU1SRUdfUkJFRU4gfCBJTVJFR19QVFhFTiB8IElNUkVHX1RYRVJFTiwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19JTVJFRyk7CisKKwkvKiB0dXJuIG9uIGNhcmQgaW50ZXJydXB0cyAqLworCisJb3V0YihpbmIoZGV2LT5iYXNlX2FkZHIgKyBCQ01SRUcpIHwgQkNNUkVHX0lFTiwgZGV2LT5iYXNlX2FkZHIgKyBCQ01SRUcpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoIlJlZ2lzdGVyIGR1bXAgYWZ0ZXIgaW5pdGlhbGl6YXRpb246XG4iKTsKKwlkdW1wcmVncyhkZXYpOworI2VuZGlmCit9CisKKy8qIHN0YXJ0IHRyYW5zbWlzc2lvbiBvZiBhIGRlc2NyaXB0b3IgKi8KKworc3RhdGljIHZvaWQgU3RhcnRUeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZGVzY3IpCit7CisJaWJtbGFuYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgYWRkcjsKKworCWFkZHIgPSBwcml2LT50ZGFzdGFydCArIChkZXNjciAqIHNpemVvZih0ZGFfdCkpOworCisJLyogcHV0IGRlc2NyaXB0b3IgYWRkcmVzcyBpbnRvIFNPTklDICovCisKKwlvdXR3KGFkZHIsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfQ1REQSk7CisKKwkvKiB0cmlnZ2VyIHRyYW5zbWl0dGVyICovCisKKwlwcml2LT5jdXJydHhkZXNjciA9IGRlc2NyOworCW91dHcoQ01EUkVHX1RYUCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DTURSRUcpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGludGVycnVwdCBoYW5kbGVyKHMpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogcmVjZWl2ZSBidWZmZXIgYXJlYSBleGhhdXN0ZWQgKi8KKworc3RhdGljIHZvaWQgaXJxcmJlX2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpYm1sYW5hX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogcG9pbnQgdGhlIFNPTklDIGJhY2sgdG8gdGhlIFJSQSBzdGFydCAqLworCisJb3V0dyhwcml2LT5ycmFzdGFydCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19SUlApOworCW91dHcocHJpdi0+cnJhc3RhcnQsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfUldQKTsKK30KKworLyogcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KKworc3RhdGljIHZvaWQgaXJxcnhfaGFuZGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlibWxhbmFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmRhX3QgcmRhOworCXUzMiByZGFhZGRyLCBscmRhYWRkcjsKKworCS8qIGxvb3AgdW50aWwgLi4uICovCisKKwl3aGlsZSAoMSkgeworCQkvKiByZWFkIGRlc2NyaXB0b3IgdGhhdCB3YXMgbmV4dCB0byBiZSBmaWxsZWQgYnkgU09OSUMgKi8KKworCQlyZGFhZGRyID0gcHJpdi0+cmRhc3RhcnQgKyAocHJpdi0+bmV4dHJ4ZGVzY3IgKiBzaXplb2YocmRhX3QpKTsKKwkJbHJkYWFkZHIgPSBwcml2LT5yZGFzdGFydCArIChwcml2LT5sYXN0cnhkZXNjciAqIHNpemVvZihyZGFfdCkpOworCQltZW1jcHlfZnJvbWlvKCZyZGEsIHByaXYtPmJhc2UgKyByZGFhZGRyLCBzaXplb2YocmRhX3QpKTsKKworCQkvKiBpcm9uIG91dCB1cHBlciB3b3JkIGhhbHZlcyBvZiBmaWVsZHMgd2UgdXNlIC0gU09OSUMgd2lsbCBkdXBsaWNhdGUgCisJCSAgIGJpdHMgMC4uMTUgdG8gMTYuLjMxICovCisKKwkJcmRhLnN0YXR1cyAmPSAweGZmZmY7CisJCXJkYS5sZW5ndGggJj0gMHhmZmZmOworCQlyZGEuc3RhcnRsbyAmPSAweGZmZmY7CisKKwkJLyogc3RvcCBpZiB0aGUgU09OSUMgc3RpbGwgb3ducyBpdCwgaS5lLiB0aGVyZSBpcyBubyBkYXRhIGZvciB1cyAqLworCisJCWlmIChyZGEuaW51c2UpCisJCQlicmVhazsKKworCQkvKiBnb29kIHBhY2tldD8gKi8KKworCQllbHNlIGlmIChyZGEuc3RhdHVzICYgUkNSRUdfUFJYKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQkvKiBmZXRjaCBidWZmZXIgKi8KKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihyZGEubGVuZ3RoICsgMik7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJcHJpdi0+c3RhdC5yeF9kcm9wcGVkKys7CisJCQllbHNlIHsKKwkJCQkvKiBjb3B5IG91dCBkYXRhICovCisKKwkJCQltZW1jcHlfZnJvbWlvKHNrYl9wdXQoc2tiLCByZGEubGVuZ3RoKSwKKwkJCQkJICAgICAgIHByaXYtPmJhc2UgKworCQkJCQkgICAgICAgcmRhLnN0YXJ0bG8sIHJkYS5sZW5ndGgpOworCisJCQkJLyogc2V0IHVwIHNrYiBmaWVsZHMgKi8KKworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJCQkJLyogYm9va2tlZXBpbmcgKi8KKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCXByaXYtPnN0YXQucnhfcGFja2V0cysrOworCQkJCXByaXYtPnN0YXQucnhfYnl0ZXMgKz0gcmRhLmxlbmd0aDsKKworCQkJCS8qIHBhc3MgdG8gdGhlIHVwcGVyIGxheWVycyAqLworCQkJCW5ldGlmX3J4KHNrYik7CisJCQl9CisJCX0KKworCQkvKiBvdGhlcndpc2UgY2hlY2sgZXJyb3Igc3RhdHVzIGJpdHMgYW5kIGluY3JlYXNlIHN0YXRpc3RpY3MgKi8KKworCQllbHNlIHsKKwkJCXByaXYtPnN0YXQucnhfZXJyb3JzKys7CisJCQlpZiAocmRhLnN0YXR1cyAmIFJDUkVHX0ZBRVIpCisJCQkJcHJpdi0+c3RhdC5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChyZGEuc3RhdHVzICYgUkNSRUdfQ1JDUikKKwkJCQlwcml2LT5zdGF0LnJ4X2NyY19lcnJvcnMrKzsKKwkJfQorCisJCS8qIGRlc2NyaXB0b3IgcHJvY2Vzc2VkLCB3aWxsIGJlY29tZSBuZXcgbGFzdCBkZXNjcmlwdG9yIGluIHF1ZXVlICovCisKKwkJcmRhLmxpbmsgPSAxOworCQlyZGEuaW51c2UgPSAxOworCQltZW1jcHlfdG9pbyhwcml2LT5iYXNlICsgcmRhYWRkciwgJnJkYSwKKwkJCSAgICAgc2l6ZW9mKHJkYV90KSk7CisKKwkJLyogc2V0IHVwIGxpbmsgYW5kIEVPTCA9IDAgaW4gY3VycmVudGx5IGxhc3QgZGVzY3JpcHRvci4gT25seSB3cml0ZQorCQkgICB0aGUgbGluayBmaWVsZCBzaW5jZSB0aGUgU09OSUMgbWF5IGN1cnJlbnRseSBhbHJlYWR5IGFjY2VzcyB0aGUKKwkJICAgb3RoZXIgZmllbGRzLiAqLworCisJCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBscmRhYWRkciArIDIwLCAmcmRhYWRkciwgNCk7CisKKwkJLyogYWR2YW5jZSBpbmRpY2VzICovCisKKwkJcHJpdi0+bGFzdHJ4ZGVzY3IgPSBwcml2LT5uZXh0cnhkZXNjcjsKKwkJaWYgKCgrK3ByaXYtPm5leHRyeGRlc2NyKSA+PSBwcml2LT5yeGJ1ZmNudCkKKwkJCXByaXYtPm5leHRyeGRlc2NyID0gMDsKKwl9Cit9CisKKy8qIHRyYW5zbWl0IGludGVycnVwdCAqLworCitzdGF0aWMgdm9pZCBpcnF0eF9oYW5kbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWJtbGFuYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl0ZGFfdCB0ZGE7CisKKwkvKiBmZXRjaCBkZXNjcmlwdG9yICh3ZSBmb3Jnb3QgdGhlIHNpemUgOy0pICovCisJbWVtY3B5X2Zyb21pbygmdGRhLCBwcml2LT5iYXNlICsgcHJpdi0+dGRhc3RhcnQgKyAocHJpdi0+Y3VycnR4ZGVzY3IgKiBzaXplb2YodGRhX3QpKSwgc2l6ZW9mKHRkYV90KSk7CisKKwkvKiB1cGRhdGUgc3RhdGlzdGljcyAqLworCXByaXYtPnN0YXQudHhfcGFja2V0cysrOworCXByaXYtPnN0YXQudHhfYnl0ZXMgKz0gdGRhLmxlbmd0aDsKKworCS8qIHVwZGF0ZSBvdXIgcG9pbnRlcnMgKi8KKwlwcml2LT50eHVzZWRbcHJpdi0+Y3VycnR4ZGVzY3JdID0gMDsKKwlwcml2LT50eHVzZWRjbnQtLTsKKworCS8qIGlmIHRoZXJlIGFyZSBtb3JlIGRlc2NyaXB0b3JzIHByZXNlbnQgaW4gUkFNLCBzdGFydCB0aGVtICovCisJaWYgKHByaXYtPnR4dXNlZGNudCA+IDApCisJCVN0YXJ0VHgoZGV2LCAocHJpdi0+Y3VycnR4ZGVzY3IgKyAxKSAlIFRYQlVGQ05UKTsKKworCS8qIHRlbGwgdGhlIHVwcGVyIGxheWVyIHdlIGNhbiBnbyBvbiB0cmFuc21pdHRpbmcgKi8KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGlycXR4ZXJyX2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpYm1sYW5hX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXRkYV90IHRkYTsKKworCS8qIGZldGNoIGRlc2NyaXB0b3IgdG8gY2hlY2sgc3RhdHVzICovCisJbWVtY3B5X2Zyb21pbygmdGRhLCBwcml2LT5iYXNlICsgcHJpdi0+dGRhc3RhcnQgKyAocHJpdi0+Y3VycnR4ZGVzY3IgKiBzaXplb2YodGRhX3QpKSwgc2l6ZW9mKHRkYV90KSk7CisKKwkvKiB1cGRhdGUgc3RhdGlzdGljcyAqLworCXByaXYtPnN0YXQudHhfZXJyb3JzKys7CisJaWYgKHRkYS5zdGF0dXMgJiAoVENSRUdfTkNSUyB8IFRDUkVHX0NSU0wpKQorCQlwcml2LT5zdGF0LnR4X2NhcnJpZXJfZXJyb3JzKys7CisJaWYgKHRkYS5zdGF0dXMgJiBUQ1JFR19FWEMpCisJCXByaXYtPnN0YXQudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwlpZiAodGRhLnN0YXR1cyAmIFRDUkVHX09XQykKKwkJcHJpdi0+c3RhdC50eF93aW5kb3dfZXJyb3JzKys7CisJaWYgKHRkYS5zdGF0dXMgJiBUQ1JFR19GVSkKKwkJcHJpdi0+c3RhdC50eF9maWZvX2Vycm9ycysrOworCisJLyogdXBkYXRlIG91ciBwb2ludGVycyAqLworCXByaXYtPnR4dXNlZFtwcml2LT5jdXJydHhkZXNjcl0gPSAwOworCXByaXYtPnR4dXNlZGNudC0tOworCisJLyogaWYgdGhlcmUgYXJlIG1vcmUgZGVzY3JpcHRvcnMgcHJlc2VudCBpbiBSQU0sIHN0YXJ0IHRoZW0gKi8KKwlpZiAocHJpdi0+dHh1c2VkY250ID4gMCkKKwkJU3RhcnRUeChkZXYsIChwcml2LT5jdXJydHhkZXNjciArIDEpICUgVFhCVUZDTlQpOworCisJLyogdGVsbCB0aGUgdXBwZXIgbGF5ZXIgd2UgY2FuIGdvIG9uIHRyYW5zbWl0dGluZyAqLworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyogZ2VuZXJhbCBpbnRlcnJ1cHQgZW50cnkgKi8KKworc3RhdGljIGlycXJldHVybl90IGlycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldmljZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZpY2U7CisJdTE2IGl2YWw7CisKKwkvKiBpbiBjYXNlIHdlJ3JlIG5vdCBtZWFudC4uLiAqLworCWlmICghKGluYihkZXYtPmJhc2VfYWRkciArIEJDTVJFRykgJiBCQ01SRUdfSVBFTkQpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBsb29wIHRocm91Z2ggdGhlIGludGVycnVwdCBiaXRzIHVudGlsIGV2ZXJ5dGhpbmcgaXMgY2xlYXIgKi8KKwl3aGlsZSAoMSkgeworCQlpdmFsID0gaW53KGRldi0+YmFzZV9hZGRyICsgU09OSUNfSVNSRUcpOworCisJCWlmIChpdmFsICYgSVNSRUdfUkJFKSB7CisJCQlpcnFyYmVfaGFuZGxlcihkZXYpOworCQkJb3V0dyhJU1JFR19SQkUsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfSVNSRUcpOworCQl9CisJCWlmIChpdmFsICYgSVNSRUdfUEtUUlgpIHsKKwkJCWlycXJ4X2hhbmRsZXIoZGV2KTsKKwkJCW91dHcoSVNSRUdfUEtUUlgsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfSVNSRUcpOworCQl9CisJCWlmIChpdmFsICYgSVNSRUdfVFhETikgeworCQkJaXJxdHhfaGFuZGxlcihkZXYpOworCQkJb3V0dyhJU1JFR19UWEROLCBkZXYtPmJhc2VfYWRkciArIFNPTklDX0lTUkVHKTsKKwkJfQorCQlpZiAoaXZhbCAmIElTUkVHX1RYRVIpIHsKKwkJCWlycXR4ZXJyX2hhbmRsZXIoZGV2KTsKKwkJCW91dHcoSVNSRUdfVFhFUiwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19JU1JFRyk7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBkcml2ZXIgbWV0aG9kcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIE1DQSBpbmZvICovCisKK3N0YXRpYyBpbnQgaWJtbGFuYV9nZXRpbmZvKGNoYXIgKmJ1ZiwgaW50IHNsb3QsIHZvaWQgKmQpCit7CisJaW50IGxlbiA9IDAsIGk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkOworCWlibWxhbmFfcHJpdiAqcHJpdjsKKworCS8qIGNhbid0IHNheSBhbnl0aGluZyBhYm91dCBhbiB1bmluaXRpYWxpemVkIGRldmljZS4uLiAqLworCisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gbGVuOworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogcHJpbnQgaW5mbyAqLworCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSVJROiAlZFxuIiwgcHJpdi0+cmVhbGlycSk7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSS9POiAlI2x4XG4iLCBkZXYtPmJhc2VfYWRkcik7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiTWVtb3J5OiAlI2x4LSUjbHhcbiIsIGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQgLSAxKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJUcmFuc2NlaXZlcjogJXNcbiIsIE1lZGlhTmFtZXNbcHJpdi0+bWVkaXVtXSk7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiRGV2aWNlOiAlc1xuIiwgZGV2LT5uYW1lKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJNQUMgYWRkcmVzczoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIgJTAyeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCWJ1ZltsZW4rK10gPSAnXG4nOworCWJ1ZltsZW5dID0gMDsKKworCXJldHVybiBsZW47Cit9CisKKy8qIG9wZW4gZHJpdmVyLiAgTWVhbnMgYWxzbyBpbml0aWFsaXphdGlvbiBhbmQgc3RhcnQgb2YgTEFOQ0UgKi8KKworc3RhdGljIGludCBpYm1sYW5hX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmVzdWx0OworCWlibWxhbmFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiByZWdpc3RlciByZXNvdXJjZXMgLSBvbmx5IG5lY2Vzc2FyeSBmb3IgSVJRICovCisKKwlyZXN1bHQgPSByZXF1ZXN0X2lycShwcml2LT5yZWFsaXJxLCBpcnFfaGFuZGxlciwgU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJlc3VsdCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBpcnEgJWRcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlkZXYtPmlycSA9IHByaXYtPnJlYWxpcnE7CisKKwkvKiBzZXQgdXAgdGhlIGNhcmQgYW5kIFNPTklDICovCisJSW5pdEJvYXJkKGRldik7CisKKwkvKiBpbml0aWFsaXplIG9wZXJhdGlvbmFsIGZsYWdzICovCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogY2xvc2UgZHJpdmVyLiAgU2h1dCBkb3duIGJvYXJkIGFuZCBmcmVlIGFsbG9jYXRlZCByZXNvdXJjZXMgKi8KKworc3RhdGljIGludCBpYm1sYW5hX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogdHVybiBvZmYgYm9hcmQgKi8KKworCS8qIHJlbGVhc2UgcmVzb3VyY2VzICovCisJaWYgKGRldi0+aXJxICE9IDApCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCWRldi0+aXJxID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyogdHJhbnNtaXQgYSBibG9jay4gKi8KKworc3RhdGljIGludCBpYm1sYW5hX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWJtbGFuYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0dmFsID0gMCwgdG1wbGVuLCBhZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdGRhX3QgdGRhOworCWludCBiYWRkcjsKKworCS8qIGZpbmQgb3V0IGlmIHRoZXJlIGFyZSBmcmVlIHNsb3RzIGZvciBhIGZyYW1lIHRvIHRyYW5zbWl0LiBJZiBub3QsCisJICAgdGhlIHVwcGVyIGxheWVyIGlzIGluIGRlZXAgZGVzcGVyYXRpb24gYW5kIHdlIHNpbXBseSBpZ25vcmUgdGhlIGZyYW1lLiAqLworCisJaWYgKHByaXYtPnR4dXNlZGNudCA+PSBUWEJVRkNOVCkgeworCQlyZXR2YWwgPSAtRUlPOworCQlwcml2LT5zdGF0LnR4X2Ryb3BwZWQrKzsKKwkJZ290byB0eF9kb25lOworCX0KKworCS8qIGNvcHkgdGhlIGZyYW1lIGRhdGEgaW50byB0aGUgbmV4dCBmcmVlIHRyYW5zbWl0IGJ1ZmZlciAtIGZpbGx1cCBtaXNzaW5nICovCisJdG1wbGVuID0gc2tiLT5sZW47CisJaWYgKHRtcGxlbiA8IDYwKQorCQl0bXBsZW4gPSA2MDsKKwliYWRkciA9IHByaXYtPnR4YnVmc3RhcnQgKyAocHJpdi0+bmV4dHR4ZGVzY3IgKiBQS1RTSVpFKTsKKwltZW1jcHlfdG9pbyhwcml2LT5iYXNlICsgYmFkZHIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJLyogY29weSBmaWxsZXIgaW50byBSQU0gLSBpbiBjYXNlIHdlJ3JlIGZpbGxpbmcgdXAuLi4gCisJICAgd2UncmUgZmlsbGluZyBhIGJpdCBtb3JlIHRoYW4gbmVjZXNzYXJ5LCBidXQgdGhhdCBkb2Vzbid0IGhhcm0KKwkgICBzaW5jZSB0aGUgYnVmZmVyIGlzIGZhciBsYXJnZXIuLi4gCisJICAgU29ycnkgTGludXMgZm9yIHRoZSBmaWxsZXIgc3RyaW5nIGJ1dCBJIGNvdWxkbid0IHJlc2lzdCA7LSkgKi8KKworCWlmICh0bXBsZW4gPiBza2ItPmxlbikgeworCQljaGFyICpmaWxsID0gIk5ldEJTRCBpcyBhIG5pY2UgT1MgdG9vISAiOworCQl1bnNpZ25lZCBpbnQgZGVzdG9mZnMgPSBza2ItPmxlbiwgbCA9IHN0cmxlbihmaWxsKTsKKworCQl3aGlsZSAoZGVzdG9mZnMgPCB0bXBsZW4pIHsKKwkJCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBiYWRkciArIGRlc3RvZmZzLCBmaWxsLCBsKTsKKwkJCWRlc3RvZmZzICs9IGw7CisJCX0KKwl9CisKKwkvKiBzZXQgdXAgdGhlIG5ldyBmcmFtZSBkZXNjcmlwdG9yICovCisJYWRkciA9IHByaXYtPnRkYXN0YXJ0ICsgKHByaXYtPm5leHR0eGRlc2NyICogc2l6ZW9mKHRkYV90KSk7CisJbWVtY3B5X2Zyb21pbygmdGRhLCBwcml2LT5iYXNlICsgYWRkciwgc2l6ZW9mKHRkYV90KSk7CisJdGRhLmxlbmd0aCA9IHRkYS5mcmFnbGVuZ3RoID0gdG1wbGVuOworCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBhZGRyLCAmdGRhLCBzaXplb2YodGRhX3QpKTsKKworCS8qIGlmIHRoZXJlIHdlcmUgbm8gYWN0aXZlIGRlc2NyaXB0b3JzLCB0cmlnZ2VyIHRoZSBTT05JQyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlwcml2LT50eHVzZWRjbnQrKzsKKwlwcml2LT50eHVzZWRbcHJpdi0+bmV4dHR4ZGVzY3JdID0gMTsKKworCS8qIGFyZSBhbGwgdHJhbnNtaXNzaW9uIHNsb3RzIHVzZWQgdXAgPyAqLworCWlmIChwcml2LT50eHVzZWRjbnQgPj0gVFhCVUZDTlQpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChwcml2LT50eHVzZWRjbnQgPT0gMSkKKwkJU3RhcnRUeChkZXYsIHByaXYtPm5leHR0eGRlc2NyKTsKKwlwcml2LT5uZXh0dHhkZXNjciA9IChwcml2LT5uZXh0dHhkZXNjciArIDEpICUgVFhCVUZDTlQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit0eF9kb25lOgorCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiByZXR1cm4gcG9pbnRlciB0byBFdGhlcm5ldCBzdGF0aXN0aWNzICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaWJtbGFuYV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlibWxhbmFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZwcml2LT5zdGF0OworfQorCisvKiBzd2l0Y2ggcmVjZWl2ZXIgbW9kZS4gKi8KKworc3RhdGljIHZvaWQgaWJtbGFuYV9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBmaXJzdCBzdG9wIHRoZSBTT05JQy4uLiAqLworCVN0b3BTT05JQyhkZXYpOworCS8qIC4uLnRoZW4gcmVpbml0IGl0IHdpdGggdGhlIG5ldyBmbGFncyAqLworCUluaXRCb2FyZChkZXYpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGhhcmR3YXJlIGNoZWNrCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBzdGFydHNsb3Q7CQkvKiBjb3VudHMgdGhyb3VnaCBzbG90cyB3aGVuIHByb2JpbmcgbXVsdGlwbGUgZGV2aWNlcyAqLworCitzdGF0aWMgaW50IGlibWxhbmFfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc2xvdCwgejsKKwlpbnQgYmFzZSA9IDAsIGlycSA9IDAsIGlvYmFzZSA9IDAsIG1lbWxlbiA9IDA7CisJaWJtbGFuYV9wcml2ICpwcml2OworCWlibWxhbmFfbWVkaXVtIG1lZGl1bTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIGNhbid0IHdvcmsgd2l0aG91dCBhbiBNQ0EgYnVzIDstKSAqLworCWlmIChNQ0FfYnVzID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJYmFzZSA9IGRldi0+bWVtX3N0YXJ0OworCWlycSA9IGRldi0+aXJxOworCisJZm9yIChzbG90ID0gc3RhcnRzbG90OyAoc2xvdCA9IG1jYV9maW5kX2FkYXB0ZXIoSUJNX0xBTkFfSUQsIHNsb3QpKSAhPSAtMTsgc2xvdCsrKSB7CisJCS8qIGRlZHVjZSBjYXJkIGFkZHJlc3NlcyAqLworCQlnZXRhZGRycyhzbG90LCAmYmFzZSwgJm1lbWxlbiwgJmlvYmFzZSwgJmlycSwgJm1lZGl1bSk7CisKKwkJLyogc2xvdCBhbHJlYWR5IGluIHVzZSA/ICovCisJCWlmIChtY2FfaXNfYWRhcHRlcl91c2VkKHNsb3QpKQorCQkJY29udGludWU7CisJCS8qIHdlcmUgd2UgbG9va2luZyBmb3Igc29tZXRoaW5nIGRpZmZlcmVudCA/ICovCisJCWlmIChkZXYtPmlycSAmJiBkZXYtPmlycSAhPSBpcnEpCisJCQljb250aW51ZTsKKwkJaWYgKGRldi0+bWVtX3N0YXJ0ICYmIGRldi0+bWVtX3N0YXJ0ICE9IGJhc2UpCisJCQljb250aW51ZTsKKwkJLyogZm91bmQgc29tZXRoaW5nIHRoYXQgbWF0Y2hlcyAqLworCQlicmVhazsKKwl9CisKKwkvKiBub3RoaW5nIGZvdW5kID8gKi8KKwlpZiAoc2xvdCA9PSAtMSkKKwkJcmV0dXJuIChiYXNlICE9IDAgfHwgaXJxICE9IDApID8gLUVOWElPIDogLUVOT0RFVjsKKworCS8qIGFubm91bmNlIHN1Y2Nlc3MgKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogSUJNIExBTiBBZGFwdGVyL0EgZm91bmQgaW4gc2xvdCAlZFxuIiwgZGV2LT5uYW1lLCBzbG90ICsgMSk7CisKKwkvKiB0cnkgdG8gb2J0YWluIEkvTyByYW5nZSAqLworCWlmICghcmVxdWVzdF9yZWdpb24oaW9iYXNlLCBJQk1fTEFOQV9JT1JBTkdFLCBEUlZfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGFsbG9jYXRlIEkvTyByYW5nZSBhdCAlI3ghXG4iLCBEUlZfTkFNRSwgaW9iYXNlKTsKKwkJc3RhcnRzbG90ID0gc2xvdCArIDE7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcHJpdi0+c2xvdCA9IHNsb3Q7CisJcHJpdi0+cmVhbGlycSA9IGlycTsKKwlwcml2LT5tZWRpdW0gPSBtZWRpdW07CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOworCQkKKworCS8qIHNldCBiYXNlICsgaXJxIGZvciB0aGlzIGRldmljZSAoaXJxIG5vdCBhbGxvY2F0ZWQgc28gZmFyKSAqLworCisJZGV2LT5pcnEgPSAwOworCWRldi0+bWVtX3N0YXJ0ID0gYmFzZTsKKwlkZXYtPm1lbV9lbmQgPSBiYXNlICsgbWVtbGVuOworCWRldi0+YmFzZV9hZGRyID0gaW9iYXNlOworCisJcHJpdi0+YmFzZSA9IGlvcmVtYXAoYmFzZSwgbWVtbGVuKTsKKwlpZiAoIXByaXYtPmJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IHJlbWFwIG1lbW9yeSFcbiIsIERSVl9OQU1FKTsKKwkJc3RhcnRzbG90ID0gc2xvdCArIDE7CisJCXJlbGVhc2VfcmVnaW9uKGlvYmFzZSwgSUJNX0xBTkFfSU9SQU5HRSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogbWFrZSBwcm9jZnMgZW50cmllcyAqLworCW1jYV9zZXRfYWRhcHRlcl9uYW1lKHNsb3QsICJJQk0gTEFOIEFkYXB0ZXIvQSIpOworCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oc2xvdCwgKE1DQV9Qcm9jRm4pIGlibWxhbmFfZ2V0aW5mbywgZGV2KTsKKworCW1jYV9tYXJrX2FzX3VzZWQoc2xvdCk7CisKKwkvKiBzZXQgbWV0aG9kcyAqLworCisJZGV2LT5vcGVuID0gaWJtbGFuYV9vcGVuOworCWRldi0+c3RvcCA9IGlibWxhbmFfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpYm1sYW5hX3R4OworCWRldi0+ZG9faW9jdGwgPSBOVUxMOworCWRldi0+Z2V0X3N0YXRzID0gaWJtbGFuYV9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGlibWxhbmFfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+ZmxhZ3MgfD0gSUZGX01VTFRJQ0FTVDsKKworCS8qIGNvcHkgb3V0IE1BQyBhZGRyZXNzICovCisKKwlmb3IgKHogPSAwOyB6IDwgc2l6ZW9mKGRldi0+ZGV2X2FkZHIpOyB6KyspCisJCWRldi0+ZGV2X2FkZHJbel0gPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBNQUNBRERSUFJPTSArIHopOworCisJLyogcHJpbnQgY29uZmlnICovCisKKwlwcmludGsoS0VSTl9JTkZPICIlczogSVJRICVkLCBJL08gJSNseCwgbWVtb3J5ICUjbHgtJSNseCwgIgorCSAgICAgICAiTUFDIGFkZHJlc3MgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHByaXYtPnJlYWxpcnEsIGRldi0+YmFzZV9hZGRyLAorCSAgICAgICBkZXYtPm1lbV9zdGFydCwgZGV2LT5tZW1fZW5kIC0gMSwKKwkgICAgICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkgICAgICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIG1lZGl1bVxuIiwgZGV2LT5uYW1lLCBNZWRpYU5hbWVzW3ByaXYtPm1lZGl1bV0pOworCisJLyogcmVzZXQgYm9hcmQgKi8KKworCVJlc2V0Qm9hcmQoZGV2KTsKKworCS8qIG5leHQgcHJvYmUgd2lsbCBzdGFydCBhdCBuZXh0IHNsb3QgKi8KKworCXN0YXJ0c2xvdCA9IHNsb3QgKyAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogbW9kdWxhcml6YXRpb24gc3VwcG9ydAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBNT0RVTEUKKworI2RlZmluZSBERVZNQVggNQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKm1vZGRldnNbREVWTUFYXTsKK3N0YXRpYyBpbnQgaXJxOworc3RhdGljIGludCBpbzsKKworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSUJNIExBTi9BIElSUSBudW1iZXIiKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJJQk0gTEFOL0EgSS9PIGJhc2UgYWRkcmVzcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgejsKKworCXN0YXJ0c2xvdCA9IDA7CisJZm9yICh6ID0gMDsgeiA8IERFVk1BWDsgeisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoaWJtbGFuYV9wcml2KSk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxOworCQlkZXYtPmJhc2VfYWRkciA9IGlvOworCQlpZiAoaWJtbGFuYV9wcm9iZShkZXYpKSB7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCQlpYm1sYW5hX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIElCTV9MQU5BX0lPUkFOR0UpOworCQkJbWNhX21hcmtfYXNfdW51c2VkKHByaXYtPnNsb3QpOworCQkJbWNhX3NldF9hZGFwdGVyX25hbWUocHJpdi0+c2xvdCwgIiIpOworCQkJbWNhX3NldF9hZGFwdGVyX3Byb2Nmbihwcml2LT5zbG90LCBOVUxMLCBOVUxMKTsKKwkJCWlvdW5tYXAocHJpdi0+YmFzZSk7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJYnJlYWs7CisJCX0KKwkJbW9kZGV2c1t6XSA9IGRldjsKKwl9CisJcmV0dXJuICh6ID4gMCkgPyAwIDogLUVJTzsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCB6OworCWZvciAoeiA9IDA7IHogPCBERVZNQVg7IHorKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbW9kZGV2c1t6XTsKKwkJaWYgKGRldikgeworCQkJaWJtbGFuYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQkvKkRlaW5pdEJvYXJkKGRldik7ICovCisJCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgSUJNX0xBTkFfSU9SQU5HRSk7CisJCQltY2FfbWFya19hc191bnVzZWQocHJpdi0+c2xvdCk7CisJCQltY2Ffc2V0X2FkYXB0ZXJfbmFtZShwcml2LT5zbG90LCAiIik7CisJCQltY2Ffc2V0X2FkYXB0ZXJfcHJvY2ZuKHByaXYtPnNsb3QsIE5VTEwsIE5VTEwpOworCQkJaW91bm1hcChwcml2LT5iYXNlKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYJCQkJLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1sYW5hLmggYi9kcml2ZXJzL25ldC9pYm1sYW5hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4ZWUyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2libWxhbmEuaApAQCAtMCwwICsxLDI3OSBAQAorI2lmbmRlZiBfSUJNX0xBTkFfSU5DTFVERV8KKyNkZWZpbmUgX0lCTV9MQU5BX0lOQ0xVREVfCisKKyNpZmRlZiBfSUJNX0xBTkFfRFJJVkVSXworCisvKiBtYXhpbXVtIHBhY2tldCBzaXplICovCisKKyNkZWZpbmUgUEtUU0laRSAxNTI0CisKKy8qIG51bWJlciBvZiB0cmFuc21pdCBidWZmZXJzICovCisKKyNkZWZpbmUgVFhCVUZDTlQgNAorCisvKiBBZGFwdGVyIElEJ3MgKi8KKyNkZWZpbmUgSUJNX0xBTkFfSUQgMHhmZmUwCisKKy8qIG1lZGlhIGVudW1lcmF0aW9uIC0gZGVmaW5lZCBpbiBhIHdheSB0aGF0IGl0IGZpdHMgb250byB0aGUgTEFOL0EncworICAgUE9TIHJlZ2lzdGVycy4uLiAqLworCit0eXBlZGVmIGVudW0geyAKKwlNZWRpYV8xMEJhc2VULCBNZWRpYV8xMEJhc2U1LAorCU1lZGlhX1Vua25vd24sIE1lZGlhXzEwQmFzZTIsIE1lZGlhX0NvdW50Cit9IGlibWxhbmFfbWVkaXVtOworCisvKiBwcml2YXRlIHN0cnVjdHVyZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHNsb3Q7CQkvKiBNQ0EtU2xvdC0jICAgICAgICAgICAgICAgICAgICAgICAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXQ7CS8qIHBhY2tldCBzdGF0aXN0aWNzICAgICAgICAgICAgKi8KKwlpbnQgcmVhbGlycTsJCQkvKiBtZW1vcml6ZXMgYWN0dWFsIElSUSwgZXZlbiB3aGVuIAorCQkJCQkgICBjdXJyZW50bHkgbm90IGFsbG9jYXRlZCAgICAgICAgICAqLworCWlibWxhbmFfbWVkaXVtIG1lZGl1bTsJCS8qIHBoeXNpY2FsIGNhbm5lY3RvciAgICAgICAgICAgICAgICovCisJdTMyIAl0ZGFzdGFydCwgdHhidWZzdGFydCwJLyogYWRkcmVzc2VzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJcnJhc3RhcnQsIHJ4YnVmc3RhcnQsIHJkYXN0YXJ0LCByeGJ1ZmNudCwgdHh1c2VkY250OworCWludCAJbmV4dHJ4ZGVzY3IsCQkvKiBuZXh0IHJ4IGRlc2NyaXB0b3IgdG8gYmUgdXNlZCAgICAqLworCQlsYXN0cnhkZXNjciwJCS8qIGxhc3QgZnJlZSByeCBkZXNjcmlwdG9yICAgICAgICAgICovCisJCW5leHR0eGRlc2NyLAkJLyogbGFzdCB0eCBkZXNjcmlwdG9yIHRvIGJlIHVzZWQgICAgKi8KKwkJY3VycnR4ZGVzY3IsCQkvKiB0eCBkZXNjcmlwdG9yIGN1cnJlbnRseSB0eCdlZCAgICAqLworCQl0eHVzZWRbVFhCVUZDTlRdOwkvKiBidXN5IGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAqLworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzcGlubG9ja190IGxvY2s7Cit9IGlibWxhbmFfcHJpdjsKKworLyogdGhpcyBjYXJkIHVzZXMgcXVpdGUgYSBsb3Qgb2YgSS9PIHBvcnRzLi4ubHVja2lseSB0aGUgTUNBIGJ1cyBkZWNvZGVzIAorICAgYSBmdWxsIDY0SyBJL08gcmFuZ2UuLi4gKi8KKworI2RlZmluZSBJQk1fTEFOQV9JT1JBTkdFIDB4YTAKKworLyogQ29tbWFuZCBSZWdpc3RlcjogKi8KKworI2RlZmluZSBTT05JQ19DTURSRUcgICAgIDB4MDAKKyNkZWZpbmUgQ01EUkVHX0hUWCAgICAgICAweDAwMDEJLyogaGFsdCB0cmFuc21pc3Npb24gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EUkVHX1RYUCAgICAgICAweDAwMDIJLyogc3RhcnQgdHJhbnNtaXNzaW9uICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EUkVHX1JYRElTICAgICAweDAwMDQJLyogZGlzYWJsZSByZWNlaXZlciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EUkVHX1JYRU4gICAgICAweDAwMDgJLyogZW5hYmxlIHJlY2VpdmVyICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EUkVHX1NUUCAgICAgICAweDAwMTAJLyogc3RvcCB0aW1lciAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EUkVHX1NUICAgICAgICAweDAwMjAJLyogc3RhcnQgdGltZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EUkVHX1JTVCAgICAgICAweDAwODAJLyogc29mdHdhcmUgcmVzZXQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EUkVHX1JSUkEgICAgICAweDAxMDAJLyogZm9yY2UgU09OSUMgdG8gcmVhZCBmaXJzdCBSUkEgICAgKi8KKyNkZWZpbmUgQ01EUkVHX0xDQU0gICAgICAweDAyMDAJLyogZm9yY2UgU09OSUMgdG8gcmVhZCBDQU0gZGVzY3JzICAgKi8KKworLyogRGF0YSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgU09OSUNfRENSRUcgICAgICAweDAyCisjZGVmaW5lIERDUkVHX0VYQlVTICAgICAgMHg4MDAwCS8qIEV4dGVuZGVkIEJ1cyBNb2RlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX0xCUiAgICAgICAgMHgyMDAwCS8qIExhdGNoZWQgQnVzIFJldHJ5ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX1BPMSAgICAgICAgMHgxMDAwCS8qIFByb2dyYW1tYWJsZSBPdXRwdXRzICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX1BPMCAgICAgICAgMHgwODAwCisjZGVmaW5lIERDUkVHX1NCVVMgICAgICAgMHgwNDAwCS8qIFN5bmNocm9ub3VzIEJ1cyBNb2RlICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX1VTUjEgICAgICAgMHgwMjAwCS8qIFVzZXIgRGVmaW5hYmxlIFBpbnMgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX1VTUjAgICAgICAgMHgwMTAwCisjZGVmaW5lIERDUkVHX1dDMCAgICAgICAgMHgwMDAwCS8qIDAuLjMgV2FpdCBTdGF0ZXMgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX1dDMSAgICAgICAgMHgwMDQwCisjZGVmaW5lIERDUkVHX1dDMiAgICAgICAgMHgwMDgwCisjZGVmaW5lIERDUkVHX1dDMyAgICAgICAgMHgwMGMwCisjZGVmaW5lIERDUkVHX0RXMTYgICAgICAgMHgwMDAwCS8qIDE2IGJpdCBCdXMgTW9kZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX0RXMzIgICAgICAgMHgwMDIwCS8qIDMyIGJpdCBCdXMgTW9kZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX0JNUyAgICAgICAgMHgwMDEwCS8qIEJsb2NrIE1vZGUgU2VsZWN0ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX1JGVDQgICAgICAgMHgwMDAwCS8qIDQvOC8xNi8yNCBieXRlcyBSWCAgVGhyZXNob2xkICAgICovCisjZGVmaW5lIERDUkVHX1JGVDggICAgICAgMHgwMDA0CisjZGVmaW5lIERDUkVHX1JGVDE2ICAgICAgMHgwMDA4CisjZGVmaW5lIERDUkVHX1JGVDI0ICAgICAgMHgwMDBjCisjZGVmaW5lIERDUkVHX1RGVDggICAgICAgMHgwMDAwCS8qIDgvMTYvMjQvMjggYnl0ZXMgVFggVGhyZXNob2xkICAgICovCisjZGVmaW5lIERDUkVHX1RGVDE2ICAgICAgMHgwMDAxCisjZGVmaW5lIERDUkVHX1RGVDI0ICAgICAgMHgwMDAyCisjZGVmaW5lIERDUkVHX1RGVDI4ICAgICAgMHgwMDAzCisKKy8qIFJlY2VpdmUgQ29udHJvbCBSZWdpc3RlciAqLworCisjZGVmaW5lIFNPTklDX1JDUkVHICAgICAgMHgwNAorI2RlZmluZSBSQ1JFR19FUlIgICAgICAgIDB4ODAwMAkvKiBhY2NlcHQgZGFtYWdlZCBhbmQgY29sbGlkZWQgcGt0cyAqLworI2RlZmluZSBSQ1JFR19STlQgICAgICAgIDB4NDAwMAkvKiBhY2NlcHQgcGFja2V0cyB0aGF0IGFyZSA8IDY0ICAgICAqLworI2RlZmluZSBSQ1JFR19CUkQgICAgICAgIDB4MjAwMAkvKiBhY2NlcHQgYnJvYWRjYXN0cyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19QUk8gICAgICAgIDB4MTAwMAkvKiBwcm9taXNjb3VzIG1vZGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19BTUMgICAgICAgIDB4MDgwMAkvKiBhY2NlcHQgYWxsIG11bHRpY2FzdHMgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19MQl9OT05FICAgIDB4MDAwMAkvKiBubyBsb29wYmFjayAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19MQl9NQUMgICAgIDB4MDIwMAkvKiBNQUMgbG9vcGJhY2sgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19MQl9FTkRFQyAgIDB4MDQwMAkvKiBFTkRFQyBsb29wYmFjayAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19MQl9YVlIgICAgIDB4MDYwMAkvKiBUcmFuc2NlaXZlciBsb29wYmFjayAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19NQyAgICAgICAgIDB4MDEwMAkvKiBNdWx0aWNhc3QgcmVjZWl2ZWQgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19CQyAgICAgICAgIDB4MDA4MAkvKiBCcm9hZGNhc3QgcmVjZWl2ZWQgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19MUEtUICAgICAgIDB4MDA0MAkvKiBsYXN0IHBhY2tldCBpbiBSQkEgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19DUlMgICAgICAgIDB4MDAyMAkvKiBjYXJyaWVyIHNlbnNlIHByZXNlbnQgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19DT0wgICAgICAgIDB4MDAxMAkvKiByZWN2J2QgcGFja2V0IHdpdGggY29sbGlzaW9uICAgICAqLworI2RlZmluZSBSQ1JFR19DUkNSICAgICAgIDB4MDAwOAkvKiByZWN2J2QgcGFja2V0IHdpdGggQ1JDIGVycm9yICAgICAqLworI2RlZmluZSBSQ1JFR19GQUVSICAgICAgIDB4MDAwNAkvKiByZWN2J2QgcGFja2V0IHdpdGggaW52LiBmcmFtaW5nICAqLworI2RlZmluZSBSQ1JFR19MQksgICAgICAgIDB4MDAwMgkvKiByZWN2J2QgbG9vcGJhY2sgcGFja2V0ICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19QUlggICAgICAgIDB4MDAwMQkvKiByZWN2J2QgcGFja2V0IGlzIE9LICAgICAgICAgICAgICAqLworCisvKiBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgU09OSUNfVENSRUcgICAgICAweDA2CisjZGVmaW5lIFRDUkVHX1BJTlQgICAgICAgMHg4MDAwCS8qIGdlbmVyYXRlIGludGVycnVwdCBhZnRlciBUREEgcmVhZCAqLworI2RlZmluZSBUQ1JFR19QT1dDICAgICAgIDB4NDAwMAkvKiB0aW1lciBzdGFydCBvdXQgb2Ygd2luZG93IGRldGVjdCAqLworI2RlZmluZSBUQ1JFR19DUkNJICAgICAgIDB4MjAwMAkvKiBpbmhpYml0IENSQyBnZW5lcmF0aW9uICAgICAgICAgICAqLworI2RlZmluZSBUQ1JFR19FWERJUyAgICAgIDB4MTAwMAkvKiBkaXNhYmxlIGV4Y2Vzc2l2ZSBkZWZlcnJhbCB0aW1lciAqLworI2RlZmluZSBUQ1JFR19FWEQgICAgICAgIDB4MDQwMAkvKiBleGNlc3NpdmUgZGVmZXJyYWwgb2NjdXJyZWQgICAgICAgKi8KKyNkZWZpbmUgVENSRUdfREVGICAgICAgICAweDAyMDAJLyogc2luZ2xlIGRlZmVycmFsIG9jY3VycmVkICAgICAgICAgICovCisjZGVmaW5lIFRDUkVHX05DUlMgICAgICAgMHgwMTAwCS8qIG5vIGNhcnJpZXIgZGV0ZWN0ZWQgICAgICAgICAgICAgICovCisjZGVmaW5lIFRDUkVHX0NSU0wgICAgICAgMHgwMDgwCS8qIGNhcnJpZXIgbG9zdCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRDUkVHX0VYQyAgICAgICAgMHgwMDQwCS8qIGV4Y2Vzc2l2ZSBjb2xsaXNpb25zIG9jY3VycmVkICAgICAqLworI2RlZmluZSBUQ1JFR19PV0MgICAgICAgIDB4MDAyMAkvKiBvdXQgb2Ygd2luZG93IGNvbGxpc2lvbiBvY2N1cnJlZCAgKi8KKyNkZWZpbmUgVENSRUdfUE1CICAgICAgICAweDAwMDgJLyogcGFja2V0IG1vbml0b3JlZCBiYWQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENSRUdfRlUgICAgICAgICAweDAwMDQJLyogRklGTyB1bmRlcnJ1biAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENSRUdfQkNNICAgICAgICAweDAwMDIJLyogYnl0ZSBjb3VudCBtaXNtYXRjaCBvZiBmcmFnbWVudHMgKi8KKyNkZWZpbmUgVENSRUdfUFRYICAgICAgICAweDAwMDEJLyogcGFja2V0IHRyYW5zbWl0dGVkIE9LICAgICAgICAgICAgKi8KKworLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBTT05JQ19JTVJFRyAgICAgIDB4MDgKKyNkZWZpbmUgSU1SRUdfQlJFTiAgICAgICAweDQwMDAJLyogaW50ZXJydXB0IHdoZW4gYnVzIHJldHJ5IG9jY3VycmVkICovCisjZGVmaW5lIElNUkVHX0hCTEVOICAgICAgMHgyMDAwCS8qIGludGVycnVwdCB3aGVuIGhlYXJ0YmVhdCBsb3N0ICAgICovCisjZGVmaW5lIElNUkVHX0xDREVOICAgICAgMHgxMDAwCS8qIGludGVycnVwdCB3aGVuIENBTSBsb2FkZWQgICAgICAgICovCisjZGVmaW5lIElNUkVHX1BJTlRFTiAgICAgMHgwODAwCS8qIGludGVycnVwdCB3aGVuIFBJTlQgaW4gVERBIHNldCAgICovCisjZGVmaW5lIElNUkVHX1BSWEVOICAgICAgMHgwNDAwCS8qIGludGVycnVwdCB3aGVuIHBhY2tldCByZWNlaXZlZCAgICovCisjZGVmaW5lIElNUkVHX1BUWEVOICAgICAgMHgwMjAwCS8qIGludGVycnVwdCB3aGVuIHBhY2tldCB3YXMgc2VudCAgICovCisjZGVmaW5lIElNUkVHX1RYRVJFTiAgICAgMHgwMTAwCS8qIGludGVycnVwdCB3aGVuIHNlbmQgZmFpbGVkICAgICAgICovCisjZGVmaW5lIElNUkVHX1RDRU4gICAgICAgMHgwMDgwCS8qIGludGVycnVwdCB3aGVuIHRpbWVyIGNvbXBsZXRlZCAgICovCisjZGVmaW5lIElNUkVHX1JERUVOICAgICAgMHgwMDQwCS8qIGludGVycnVwdCB3aGVuIFJEQSBleGhhdXN0ZWQgICAgICovCisjZGVmaW5lIElNUkVHX1JCRUVOICAgICAgMHgwMDIwCS8qIGludGVycnVwdCB3aGVuIFJCQSBleGhhdXN0ZWQgICAgICovCisjZGVmaW5lIElNUkVHX1JCQUVFTiAgICAgMHgwMDEwCS8qIGludGVycnVwdCB3aGVuIFJCQSB0b28gc2hvcnQgICAgICovCisjZGVmaW5lIElNUkVHX0NSQ0VOICAgICAgMHgwMDA4CS8qIGludGVycnVwdCB3aGVuIENSQyBjb3VudGVyIHJvbGxzICovCisjZGVmaW5lIElNUkVHX0ZBRUVOICAgICAgMHgwMDA0CS8qIGludGVycnVwdCB3aGVuIEZBRSBjb3VudGVyIHJvbGxzICovCisjZGVmaW5lIElNUkVHX01QRU4gICAgICAgMHgwMDAyCS8qIGludGVycnVwdCB3aGVuIE1QIGNvdW50ZXIgcm9sbHMgICovCisjZGVmaW5lIElNUkVHX1JGT0VOICAgICAgMHgwMDAxCS8qIGludGVycnVwdCB3aGVuIFJ4IEZJRk8gb3ZlcmZsb3dzICovCisKKy8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBTT05JQ19JU1JFRyAgICAgIDB4MGEKKyNkZWZpbmUgSVNSRUdfQlIgICAgICAgICAweDQwMDAJLyogYnVzIHJldHJ5IG9jY3VycmVkICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX0hCTCAgICAgICAgMHgyMDAwCS8qIGhlYXJ0YmVhdCBsb3N0ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX0xDRCAgICAgICAgMHgxMDAwCS8qIENBTSBsb2FkZWQgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1BJTlQgICAgICAgMHgwODAwCS8qIFBJTlQgaW4gVERBIHNldCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1BLVFJYICAgICAgMHgwNDAwCS8qIHBhY2tldCByZWNlaXZlZCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1RYRE4gICAgICAgMHgwMjAwCS8qIHBhY2tldCB3YXMgc2VudCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1RYRVIgICAgICAgMHgwMTAwCS8qIHNlbmQgZmFpbGVkICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1RDICAgICAgICAgMHgwMDgwCS8qIHRpbWVyIGNvbXBsZXRlZCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1JERSAgICAgICAgMHgwMDQwCS8qIFJEQSBleGhhdXN0ZWQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1JCRSAgICAgICAgMHgwMDIwCS8qIFJCQSBleGhhdXN0ZWQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1JCQUUgICAgICAgMHgwMDEwCS8qIFJCQSB0b28gc2hvcnQgZm9yIHJlY2VpdmVkIGZyYW1lICovCisjZGVmaW5lIElTUkVHX0NSQyAgICAgICAgMHgwMDA4CS8qIENSQyBjb3VudGVyIHJvbGxzIG92ZXIgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX0ZBRSAgICAgICAgMHgwMDA0CS8qIEZBRSBjb3VudGVyIHJvbGxzIG92ZXIgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX01QICAgICAgICAgMHgwMDAyCS8qIE1QIGNvdW50ZXIgcm9sbHMgIG92ZXIgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1JGTyAgICAgICAgMHgwMDAxCS8qIFJ4IEZJRk8gb3ZlcmZsb3dzICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgU09OSUNfVVREQSAgICAgICAweDBjCS8qIGN1cnJlbnQgdHJhbnNtaXQgZGVzY3IgYWRkcmVzcyAgICovCisjZGVmaW5lIFNPTklDX0NUREEgICAgICAgMHgwZQorCisjZGVmaW5lIFNPTklDX1VSREEgICAgICAgMHgxYQkvKiBjdXJyZW50IHJlY2VpdmUgZGVzY3IgYWRkcmVzcyAgICAqLworI2RlZmluZSBTT05JQ19DUkRBICAgICAgIDB4MWMKKworI2RlZmluZSBTT05JQ19DUkJBMCAgICAgIDB4MWUJLyogY3VycmVudCByZWNlaXZlIGJ1ZmZlciBhZGRyZXNzICAgKi8KKyNkZWZpbmUgU09OSUNfQ1JCQTEgICAgICAweDIwCisKKyNkZWZpbmUgU09OSUNfUkJXQzAgICAgICAweDIyCS8qIHdvcmQgY291bnQgaW4gcmVjZWl2ZSBidWZmZXIgICAgICovCisjZGVmaW5lIFNPTklDX1JCV0MxICAgICAgMHgyNAorCisjZGVmaW5lIFNPTklDX0VPQkMgICAgICAgMHgyNgkvKiBtaW5pbXVtIHNwYWNlIHRvIGJlIGZyZWUgaW4gUkJBICAqLworCisjZGVmaW5lIFNPTklDX1VSUkEgICAgICAgMHgyOAkvKiB1cHBlciBhZGRyZXNzIG9mIENEQSAmIFJlY3YgQXJlYSAqLworCisjZGVmaW5lIFNPTklDX1JTQSAgICAgICAgMHgyYQkvKiBzdGFydCBvZiByZWNlaXZlIHJlc291cmNlIGFyZWEgICAqLworCisjZGVmaW5lIFNPTklDX1JFQSAgICAgICAgMHgyYwkvKiBlbmQgb2YgcmVjZWl2ZSByZXNvdXJjZSBhcmVhICAgICAqLworCisjZGVmaW5lIFNPTklDX1JSUCAgICAgICAgMHgyZQkvKiByZXNvdXJjZSByZWFkIHBvaW50ZXIgICAgICAgICAgICAqLworCisjZGVmaW5lIFNPTklDX1JXUCAgICAgICAgMHgzMAkvKiByZXNvdXJjZSB3cml0ZSBwb2ludGVyICAgICAgICAgICAqLworCisjZGVmaW5lIFNPTklDX0NBTUVQVFIgICAgMHg0MgkvKiBDQU0gZW50cnkgcG9pbnRlciAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFNPTklDX0NBTUFERFIyICAgMHg0NAkvKiBDQU0gYWRkcmVzcyBwb3J0cyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTT05JQ19DQU1BRERSMSAgIDB4NDYKKyNkZWZpbmUgU09OSUNfQ0FNQUREUjAgICAweDQ4CisKKyNkZWZpbmUgU09OSUNfQ0FNUFRSICAgICAweDRjCS8qIGxvd2VyIGFkZHJlc3Mgb2YgQ0RBICAgICAgICAgICAgICovCisKKyNkZWZpbmUgU09OSUNfQ0FNQ05UICAgICAweDRlCS8qICMgb2YgQ0FNIGRlc2NyaXB0b3JzIHRvIGxvYWQgICAgICovCisKKy8qIERhdGEgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICAgICovCisKKyNkZWZpbmUgU09OSUNfRENSRUcyICAgICAweDdlCisjZGVmaW5lIERDUkVHMl9FWFBPMyAgICAgMHg4MDAwCS8qIGV4dGVuZGVkIHByb2dyYW1tYWJsZSBvdXRwdXRzICAgICovCisjZGVmaW5lIERDUkVHMl9FWFBPMiAgICAgMHg0MDAwCisjZGVmaW5lIERDUkVHMl9FWFBPMSAgICAgMHgyMDAwCisjZGVmaW5lIERDUkVHMl9FWFBPMCAgICAgMHgxMDAwCisjZGVmaW5lIERDUkVHMl9IRCAgICAgICAgMHgwODAwCS8qIGhlYXJ0YmVhdCBkaXNhYmxlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHMl9KRCAgICAgICAgMHgwMjAwCS8qIGphYmJlciB0aW1lciBkaXNhYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHMl9BVVRPICAgICAgMHgwMTAwCS8qIGVuYWJsZSBBVUkvVFAgYXV0byBzZWxlY3Rpb24gICAgICovCisjZGVmaW5lIERDUkVHMl9YV1JBUCAgICAgMHgwMDQwCS8qIFRQIHRyYW5zY2VpdmVyIGxvb3BiYWNrICAgICAgICAgICovCisjZGVmaW5lIERDUkVHMl9QSCAgICAgICAgMHgwMDEwCS8qIEhPTEQgcmVxdWVzdCB0aW1pbmcgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHMl9QQ00gICAgICAgMHgwMDA0CS8qIHBhY2tldCBjb21wcmVzcyB3aGVuIG1hdGNoZWQgICAgICovCisjZGVmaW5lIERDUkVHMl9QQ05NICAgICAgMHgwMDAyCS8qIHBhY2tldCBjb21wcmVzcyB3aGVuIG5vdCBtYXRjaGVkICovCisjZGVmaW5lIERDUkVHMl9SSkNNICAgICAgMHgwMDAxCS8qIGludmVyc2UgcGFja2V0IG1hdGNoIHZpYSBDQU0gICAgICovCisKKy8qIEJvYXJkIENvbnRyb2wgUmVnaXN0ZXI6IEVuYWJsZSBSQU0sIEludGVycnVwdHMuLi4gKi8KKworI2RlZmluZSBCQ01SRUcgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQkNNUkVHX1JBTUVOICAgICAweDgwCS8qIHN3aXRjaCBvdmVyIHRvIFJBTSAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJDTVJFR19JUEVORCAgICAgMHg0MAkvKiBpbnRlcnJ1cHQgcGVuZGluZyA/ICAgICAgICAgICAgICAqLworI2RlZmluZSBCQ01SRUdfUkVTRVQgICAgIDB4MDgJLyogcmVzZXQgYm9hcmQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQkNNUkVHXzE2QklUICAgICAweDA0CS8qIGFkYXB0ZXIgaW4gMTYtYml0IHNsb3QgICAgICAgICAgICovCisjZGVmaW5lIEJDTVJFR19SQU1XSU4gICAgMHgwMgkvKiBlbmFibGUgUkFNIHdpbmRvdyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCQ01SRUdfSUVOICAgICAgIDB4MDEJLyogaW50ZXJydXB0IGVuYWJsZSAgICAgICAgICAgICAgICAgKi8KKworLyogTUFDIEFkZHJlc3MgUFJPTSAqLworCisjZGVmaW5lIE1BQ0FERFJQUk9NICAgICAgMHg5MgorCisvKiBzdHJ1Y3R1cmUgb2YgYSBDQU0gZW50cnkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBpbmRleDsJCS8qIHBvaW50ZXIgaW50byBDQU0gYXJlYSAgICAgICAgICAgICovCisJdTMyIGFkZHIwOwkJLyogYWRkcmVzcyBwYXJ0IChiaXRzIDAuLjE1IHVzZWQpICAgKi8KKwl1MzIgYWRkcjE7CisJdTMyIGFkZHIyOworfSBjYW1lbnRyeV90OworCisvKiBzdHJ1Y3R1cmUgb2YgYSByZWNlaXZlIHJlc291cmNlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgc3RhcnRsbzsJCS8qIHN0YXJ0IGFkZHJlc3MgKGJpdHMgMC4uMTUgdXNlZCkgICovCisJdTMyIHN0YXJ0aGk7CisJdTMyIGNudGxvOwkJLyogc2l6ZSBpbiAxNi1iaXQgcXVhbnRpdGllcyAgICAgICAgKi8KKwl1MzIgY250aGk7Cit9IHJyYV90OworCisvKiBzdHJ1Y3R1cmUgb2YgYSByZWNlaXZlIGRlc2NyaXB0b3IgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBzdGF0dXM7CQkvKiBwYWNrZXQgc3RhdHVzICAgICAgICAgICAgICAgICAgICAqLworCXUzMiBsZW5ndGg7CQkvKiBsZW5ndGggaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAqLworCXUzMiBzdGFydGxvOwkJLyogc3RhcnQgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgc3RhcnRoaTsKKwl1MzIgc2Vxbm87CQkvKiBmcmFtZSBzZXF1ZW5jZSAgICAgICAgICAgICAgICAgICAqLworCXUzMiBsaW5rOwkJLyogcG9pbnRlciB0byBuZXh0IGRlc2NyaXB0b3IgICAgICAgKi8KKwkvKiBiaXQgMCA9IEVPTCAgICAgICAgICAgICAgICAgICAgICAqLworCXUzMiBpbnVzZTsJCS8qICE9MCAtLT4gZnJlZSBmb3IgU09OSUMgdG8gd3JpdGUgICovCit9IHJkYV90OworCisvKiBzdHJ1Y3R1cmUgb2YgYSB0cmFuc21pdCBkZXNjcmlwdG9yICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgc3RhdHVzOwkJLyogdHJhbnNtaXQgc3RhdHVzICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgY29uZmlnOwkJLyogdmFsdWUgZm9yIFRDUiAgICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgbGVuZ3RoOwkJLyogdG90YWwgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgZnJhZ2NvdW50OwkJLyogbnVtYmVyIG9mIGZyYWdtZW50cyAgICAgICAgICAgICAgKi8KKwl1MzIgc3RhcnRsbzsJCS8qIHN0YXJ0IGFkZHJlc3Mgb2YgZnJhZ21lbnQgICAgICAgICovCisJdTMyIHN0YXJ0aGk7CisJdTMyIGZyYWdsZW5ndGg7CQkvKiBsZW5ndGggb2YgdGhpcyBmcmFnbWVudCAgICAgICAgICAqLworCS8qIG1vcmUgYWRkcmVzcy9sZW5ndGggdHJpcGxldHMgbWF5ICovCisJLyogZm9sbG93IGhlcmUgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgbGluazsJCS8qIHBvaW50ZXIgdG8gbmV4dCBkZXNjcmlwdG9yICAgICAgICovCisJLyogYml0IDAgPSBFT0wgICAgICAgICAgICAgICAgICAgICAgKi8KK30gdGRhX3Q7CisKKyNlbmRpZgkJCQkvKiBfSUJNX0xBTkFfRFJJVkVSXyAqLworCisjZW5kaWYJLyogX0lCTV9MQU5BX0lOQ0xVREVfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm12ZXRoLmMgYi9kcml2ZXJzL25ldC9pYm12ZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM5YjA2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2libXZldGguYwpAQCAtMCwwICsxLDExNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIElCTSBlU2VydmVyIGkvcFNlcmllcyBWaXJ0dWFsIEV0aGVybmV0IERldmljZSBEcml2ZXIgICAgICAgICAgICAgICAgICAgKi8KKy8qIENvcHlyaWdodCAoQykgMjAwMyBJQk0gQ29ycC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgRGF2ZSBMYXJzb24gKGxhcnNvbjFAdXMuaWJtLmNvbSkgICAgICAgICAgICAgICAgKi8KKy8qICBNYWludGFpbmVkIGJ5IFNhbnRpYWdvIExlb24gKHNhbnRpbEB1cy5pYm0uY29tKSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKi8KKy8qICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKi8KKy8qICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKi8KKy8qICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKi8KKy8qICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKi8KKy8qICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKi8KKy8qICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKi8KKy8qICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgKi8KKy8qICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQSAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHZpcnR1YWwgZXRoZXJuZXQgZGV2aWNlICAgKi8KKy8qIGZvciB1c2Ugd2l0aCBJQk0gaS9wU2VyaWVzIExQQVIgTGludXguICBJdCB1dGlsaXplcyB0aGUgbG9naWNhbCBMQU4gICAgKi8KKy8qIG9wdGlvbiBvZiB0aGUgUlMvNjAwMCBQbGF0Zm9ybSBBcmNoaXRlY2h0dXJlIHRvIGludGVyZmFjZSB3aXRoIHZpcnR1YWwgKi8KKy8qIGV0aGVybmV0IE5JQ3MgdGhhdCBhcmUgcHJlc2VudGVkIHRvIHRoZSBwYXJ0aXRpb24gYnkgdGhlIGh5cGVydmlzb3IuICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICBUT0RPOgorICAtIHJlbW92ZSBmcmFnIHByb2Nlc3NpbmcgY29kZSAtIG5vIGxvbmdlciBuZWVkZWQKKyAgLSBhZGQgc3VwcG9ydCBmb3Igc3lzZnMKKyAgLSBwb3NzaWJseSByZW1vdmUgcHJvY2ZzIHN1cHBvcnQKKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CisjaW5jbHVkZSA8YXNtL3Zpby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgImlibXZldGguaCIKKworI2RlZmluZSBERUJVRyAxCisKKyNkZWZpbmUgaWJtdmV0aF9wcmludGsoZm10LCBhcmdzLi4uKSBcCisgIHByaW50ayhLRVJOX0lORk8gIiVzOiAiIGZtdCwgX19GSUxFX18sICMjIGFyZ3MpCisKKyNkZWZpbmUgaWJtdmV0aF9lcnJvcl9wcmludGsoZm10LCBhcmdzLi4uKSBcCisgIHByaW50ayhLRVJOX0VSUiAiKCVzOiUzLjNkIHVhOiV4KSBFUlJPUjogIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXyAsIGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcywgIyMgYXJncykKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIGlibXZldGhfZGVidWdfcHJpbnRrX25vX2FkYXB0ZXIoZm10LCBhcmdzLi4uKSBcCisgIHByaW50ayhLRVJOX0RFQlVHICIoJXM6JTMuM2QpOiAiIGZtdCwgX19GSUxFX18sIF9fTElORV9fICwgIyMgYXJncykKKyNkZWZpbmUgaWJtdmV0aF9kZWJ1Z19wcmludGsoZm10LCBhcmdzLi4uKSBcCisgIHByaW50ayhLRVJOX0RFQlVHICIoJXM6JTMuM2QgdWE6JXgpOiAiIGZtdCwgX19GSUxFX18sIF9fTElORV9fICwgYWRhcHRlci0+dmRldi0+dW5pdF9hZGRyZXNzLCAjIyBhcmdzKQorI2RlZmluZSBpYm12ZXRoX2Fzc2VydChleHByKSBcCisgIGlmKCEoZXhwcikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsoS0VSTl9ERUJVRyAiYXNzZXJ0aW9uIGZhaWxlZCAoJXM6JTMuM2QgdWE6JXgpOiAlc1xuIiwgX19GSUxFX18sIF9fTElORV9fLCBhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MsICNleHByKTsgXAorICAgIEJVRygpOyBcCisgIH0KKyNlbHNlCisjZGVmaW5lIGlibXZldGhfZGVidWdfcHJpbnRrX25vX2FkYXB0ZXIoZm10LCBhcmdzLi4uKQorI2RlZmluZSBpYm12ZXRoX2RlYnVnX3ByaW50ayhmbXQsIGFyZ3MuLi4pCisjZGVmaW5lIGlibXZldGhfYXNzZXJ0KGV4cHIpIAorI2VuZGlmCisKK3N0YXRpYyBpbnQgaWJtdmV0aF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpYm12ZXRoX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpYm12ZXRoX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgaWJtdmV0aF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KTsKK3N0YXRpYyBpbnQgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppYm12ZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGlibXZldGhfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpYm12ZXRoX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpOworc3RhdGljIHZvaWQgaWJtdmV0aF9wcm9jX3JlZ2lzdGVyX2RyaXZlcih2b2lkKTsKK3N0YXRpYyB2b2lkIGlibXZldGhfcHJvY191bnJlZ2lzdGVyX2RyaXZlcih2b2lkKTsKK3N0YXRpYyB2b2lkIGlibXZldGhfcHJvY19yZWdpc3Rlcl9hZGFwdGVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgaWJtdmV0aF9wcm9jX3VucmVnaXN0ZXJfYWRhcHRlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBpYm12ZXRoX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBpYm12ZXRoX3NjaGVkdWxlX3JlcGxlbmlzaGluZyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyKik7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworI2RlZmluZSBJQk1WRVRIX1BST0NfRElSICJpYm12ZXRoIgorc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaWJtdmV0aF9wcm9jX2RpcjsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBpYm12ZXRoX2RyaXZlcl9uYW1lW10gPSAiaWJtdmV0aCI7CitzdGF0aWMgY29uc3QgY2hhciBpYm12ZXRoX2RyaXZlcl9zdHJpbmdbXSA9ICJJQk0gaS9wU2VyaWVzIFZpcnR1YWwgRXRoZXJuZXQgRHJpdmVyIjsKKyNkZWZpbmUgaWJtdmV0aF9kcml2ZXJfdmVyc2lvbiAiMS4wMyIKKworTU9EVUxFX0FVVEhPUigiU2FudGlhZ28gTGVvbiA8c2FudGlsQHVzLmlibS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklCTSBpL3BTZXJpZXMgVmlydHVhbCBFdGhlcm5ldCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKGlibXZldGhfZHJpdmVyX3ZlcnNpb24pOworCisvKiBzaW1wbGUgbWV0aG9kcyBvZiBnZXR0aW5nIGRhdGEgZnJvbSB0aGUgY3VycmVudCByeHEgZW50cnkgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIChhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyW2FkYXB0ZXItPnJ4X3F1ZXVlLmluZGV4XS50b2dnbGUgPT0gYWRhcHRlci0+cnhfcXVldWUudG9nZ2xlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfYnVmZmVyX3ZhbGlkKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIChhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyW2FkYXB0ZXItPnJ4X3F1ZXVlLmluZGV4XS52YWxpZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2ZyYW1lX29mZnNldChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiAoYWRhcHRlci0+cnhfcXVldWUucXVldWVfYWRkclthZGFwdGVyLT5yeF9xdWV1ZS5pbmRleF0ub2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfZnJhbWVfbGVuZ3RoKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIChhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyW2FkYXB0ZXItPnJ4X3F1ZXVlLmluZGV4XS5sZW5ndGgpOworfQorCisvKiBzZXR1cCB0aGUgaW5pdGlhbCBzZXR0aW5ncyBmb3IgYSBidWZmZXIgcG9vbCAqLworc3RhdGljIHZvaWQgaWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCwgdTMyIHBvb2xfaW5kZXgsIHUzMiBwb29sX3NpemUsIHUzMiBidWZmX3NpemUpCit7CisJcG9vbC0+c2l6ZSA9IHBvb2xfc2l6ZTsKKwlwb29sLT5pbmRleCA9IHBvb2xfaW5kZXg7CisJcG9vbC0+YnVmZl9zaXplID0gYnVmZl9zaXplOworCXBvb2wtPnRocmVzaG9sZCA9IHBvb2xfc2l6ZSAvIDI7Cit9CisKKy8qIGFsbG9jYXRlIGFuZCBzZXR1cCBhbiBidWZmZXIgcG9vbCAtIGNhbGxlZCBkdXJpbmcgb3BlbiAqLworc3RhdGljIGludCBpYm12ZXRoX2FsbG9jX2J1ZmZlcl9wb29sKHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCkKK3sKKwlpbnQgaTsKKworCXBvb2wtPmZyZWVfbWFwID0ga21hbGxvYyhzaXplb2YodTE2KSAqIHBvb2wtPnNpemUsIEdGUF9LRVJORUwpOyAKKworCWlmKCFwb29sLT5mcmVlX21hcCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJcG9vbC0+ZG1hX2FkZHIgPSBrbWFsbG9jKHNpemVvZihkbWFfYWRkcl90KSAqIHBvb2wtPnNpemUsIEdGUF9LRVJORUwpOyAKKwlpZighcG9vbC0+ZG1hX2FkZHIpIHsKKwkJa2ZyZWUocG9vbC0+ZnJlZV9tYXApOworCQlwb29sLT5mcmVlX21hcCA9IE5VTEw7CisJCXJldHVybiAtMTsKKwl9CisKKwlwb29sLT5za2J1ZmYgPSBrbWFsbG9jKHNpemVvZih2b2lkKikgKiBwb29sLT5zaXplLCBHRlBfS0VSTkVMKTsKKworCWlmKCFwb29sLT5za2J1ZmYpIHsKKwkJa2ZyZWUocG9vbC0+ZG1hX2FkZHIpOworCQlwb29sLT5kbWFfYWRkciA9IE5VTEw7CisKKwkJa2ZyZWUocG9vbC0+ZnJlZV9tYXApOworCQlwb29sLT5mcmVlX21hcCA9IE5VTEw7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQocG9vbC0+c2tidWZmLCAwLCBzaXplb2Yodm9pZCopICogcG9vbC0+c2l6ZSk7CisJbWVtc2V0KHBvb2wtPmRtYV9hZGRyLCAwLCBzaXplb2YoZG1hX2FkZHJfdCkgKiBwb29sLT5zaXplKTsKKworCWZvcihpID0gMDsgaSA8IHBvb2wtPnNpemU7ICsraSkgeworCQlwb29sLT5mcmVlX21hcFtpXSA9IGk7CisJfQorCisJYXRvbWljX3NldCgmcG9vbC0+YXZhaWxhYmxlLCAwKTsKKwlwb29sLT5wcm9kdWNlcl9pbmRleCA9IDA7CisJcG9vbC0+Y29uc3VtZXJfaW5kZXggPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlcGxlbmlzaCB0aGUgYnVmZmVycyBmb3IgYSBwb29sLiAgbm90ZSB0aGF0IHdlIGRvbid0IG5lZWQgdG8KKyAqIHNrYl9yZXNlcnZlIHRoZXNlIHNpbmNlIHRoZXkgYXJlIHVzZWQgZm9yIGluY29taW5nLi4uCisgKi8KK3N0YXRpYyB2b2lkIGlibXZldGhfcmVwbGVuaXNoX2J1ZmZlcl9wb29sKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCkKK3sKKwl1MzIgaTsKKwl1MzIgY291bnQgPSBwb29sLT5zaXplIC0gYXRvbWljX3JlYWQoJnBvb2wtPmF2YWlsYWJsZSk7CisJdTMyIGJ1ZmZlcnNfYWRkZWQgPSAwOworCisJbWIoKTsKKworCWZvcihpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdW5zaWduZWQgaW50IGZyZWVfaW5kZXgsIGluZGV4OworCQl1NjQgY29ycmVsYXRvcjsKKwkJdW5pb24gaWJtdmV0aF9idWZfZGVzYyBkZXNjOworCQl1bnNpZ25lZCBsb25nIGxwYXJfcmM7CisJCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisKKwkJc2tiID0gYWxsb2Nfc2tiKHBvb2wtPmJ1ZmZfc2l6ZSwgR0ZQX0FUT01JQyk7CisKKwkJaWYoIXNrYikgeworCQkJaWJtdmV0aF9kZWJ1Z19wcmludGsoInJlcGxlbmlzaDogdW5hYmxlIHRvIGFsbG9jYXRlIHNrYlxuIik7CisJCQlhZGFwdGVyLT5yZXBsZW5pc2hfbm9fbWVtKys7CisJCQlicmVhazsKKwkJfQorCisJCWZyZWVfaW5kZXggPSBwb29sLT5jb25zdW1lcl9pbmRleCsrICUgcG9vbC0+c2l6ZTsKKwkJaW5kZXggPSBwb29sLT5mcmVlX21hcFtmcmVlX2luZGV4XTsKKwkKKwkJaWJtdmV0aF9hc3NlcnQoaW5kZXggIT0gSUJNX1ZFVEhfSU5WQUxJRF9NQVApOworCQlpYm12ZXRoX2Fzc2VydChwb29sLT5za2J1ZmZbaW5kZXhdID09IE5VTEwpOworCisJCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoJmFkYXB0ZXItPnZkZXYtPmRldiwgc2tiLT5kYXRhLAorCQkJCXBvb2wtPmJ1ZmZfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKworCQlwb29sLT5mcmVlX21hcFtmcmVlX2luZGV4XSA9IElCTV9WRVRIX0lOVkFMSURfTUFQOworCQlwb29sLT5kbWFfYWRkcltpbmRleF0gPSBkbWFfYWRkcjsKKwkJcG9vbC0+c2tidWZmW2luZGV4XSA9IHNrYjsKKworCQljb3JyZWxhdG9yID0gKCh1NjQpcG9vbC0+aW5kZXggPDwgMzIpIHwgaW5kZXg7CisJCSoodTY0Kilza2ItPmRhdGEgPSBjb3JyZWxhdG9yOworCisJCWRlc2MuZGVzYyA9IDA7CisJCWRlc2MuZmllbGRzLnZhbGlkID0gMTsKKwkJZGVzYy5maWVsZHMubGVuZ3RoID0gcG9vbC0+YnVmZl9zaXplOworCQlkZXNjLmZpZWxkcy5hZGRyZXNzID0gZG1hX2FkZHI7IAorCisJCWxwYXJfcmMgPSBoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXIoYWRhcHRlci0+dmRldi0+dW5pdF9hZGRyZXNzLCBkZXNjLmRlc2MpOworCQkgICAgCisJCWlmKGxwYXJfcmMgIT0gSF9TdWNjZXNzKSB7CisJCQlwb29sLT5mcmVlX21hcFtmcmVlX2luZGV4XSA9IElCTV9WRVRIX0lOVkFMSURfTUFQOworCQkJcG9vbC0+c2tidWZmW2luZGV4XSA9IE5VTEw7CisJCQlwb29sLT5jb25zdW1lcl9pbmRleC0tOworCQkJZG1hX3VubWFwX3NpbmdsZSgmYWRhcHRlci0+dmRldi0+ZGV2LAorCQkJCQlwb29sLT5kbWFfYWRkcltpbmRleF0sIHBvb2wtPmJ1ZmZfc2l6ZSwKKwkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlhZGFwdGVyLT5yZXBsZW5pc2hfYWRkX2J1ZmZfZmFpbHVyZSsrOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlidWZmZXJzX2FkZGVkKys7CisJCQlhZGFwdGVyLT5yZXBsZW5pc2hfYWRkX2J1ZmZfc3VjY2VzcysrOworCQl9CisJfQorICAgIAorCW1iKCk7CisJYXRvbWljX2FkZChidWZmZXJzX2FkZGVkLCAmKHBvb2wtPmF2YWlsYWJsZSkpOworfQorCisvKiBjaGVjayBpZiByZXBsZW5pc2hpbmcgaXMgbmVlZGVkLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfaXNfcmVwbGVuaXNoaW5nX25lZWRlZChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiAoKGF0b21pY19yZWFkKCZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMF0uYXZhaWxhYmxlKSA8IGFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFswXS50aHJlc2hvbGQpIHx8CisJCShhdG9taWNfcmVhZCgmYWRhcHRlci0+cnhfYnVmZl9wb29sWzFdLmF2YWlsYWJsZSkgPCBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMV0udGhyZXNob2xkKSB8fAorCQkoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFsyXS5hdmFpbGFibGUpIDwgYWRhcHRlci0+cnhfYnVmZl9wb29sWzJdLnRocmVzaG9sZCkpOworfQorCisvKiBraWNrIHRoZSByZXBsZW5pc2ggdGFza2xldCBpZiB3ZSBuZWVkIHJlcGxlbmlzaGluZyBhbmQgaXQgaXNuJ3QgYWxyZWFkeSBydW5uaW5nICovCitzdGF0aWMgaW5saW5lIHZvaWQgaWJtdmV0aF9zY2hlZHVsZV9yZXBsZW5pc2hpbmcoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZihpYm12ZXRoX2lzX3JlcGxlbmlzaGluZ19uZWVkZWQoYWRhcHRlcikgJiYKKwkgICAoYXRvbWljX2RlY19pZl9wb3NpdGl2ZSgmYWRhcHRlci0+bm90X3JlcGxlbmlzaGluZykgPT0gMCkpIHsKKwkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+cmVwbGVuaXNoX3Rhc2spOworCX0KK30KKworLyogcmVwbGVuaXNoIHRhc2tsZXQgcm91dGluZSAqLworc3RhdGljIHZvaWQgaWJtdmV0aF9yZXBsZW5pc2hfdGFzayhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKSAKK3sKKwlhZGFwdGVyLT5yZXBsZW5pc2hfdGFza19jeWNsZXMrKzsKKworCWlibXZldGhfcmVwbGVuaXNoX2J1ZmZlcl9wb29sKGFkYXB0ZXIsICZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMF0pOworCWlibXZldGhfcmVwbGVuaXNoX2J1ZmZlcl9wb29sKGFkYXB0ZXIsICZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMV0pOworCWlibXZldGhfcmVwbGVuaXNoX2J1ZmZlcl9wb29sKGFkYXB0ZXIsICZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMl0pOworCisJYWRhcHRlci0+cnhfbm9fYnVmZmVyID0gKih1NjQqKSgoKGNoYXIqKWFkYXB0ZXItPmJ1ZmZlcl9saXN0X2FkZHIpICsgNDA5NiAtIDgpOworCisJYXRvbWljX2luYygmYWRhcHRlci0+bm90X3JlcGxlbmlzaGluZyk7CisKKwlpYm12ZXRoX3NjaGVkdWxlX3JlcGxlbmlzaGluZyhhZGFwdGVyKTsKK30KKworLyogZW1wdHkgYW5kIGZyZWUgYW5hIGJ1ZmZlciBwb29sIC0gYWxzbyB1c2VkIHRvIGRvIGNsZWFudXAgaW4gZXJyb3IgcGF0aHMgKi8KK3N0YXRpYyB2b2lkIGlibXZldGhfZnJlZV9idWZmZXJfcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgKnBvb2wpCit7CisJaW50IGk7CisKKwlpZihwb29sLT5mcmVlX21hcCkgeworCQlrZnJlZShwb29sLT5mcmVlX21hcCk7CisJCXBvb2wtPmZyZWVfbWFwICA9IE5VTEw7CisJfQorCisJaWYocG9vbC0+c2tidWZmICYmIHBvb2wtPmRtYV9hZGRyKSB7CisJCWZvcihpID0gMDsgaSA8IHBvb2wtPnNpemU7ICsraSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHBvb2wtPnNrYnVmZltpXTsKKwkJCWlmKHNrYikgeworCQkJCWRtYV91bm1hcF9zaW5nbGUoJmFkYXB0ZXItPnZkZXYtPmRldiwKKwkJCQkJCSBwb29sLT5kbWFfYWRkcltpXSwKKwkJCQkJCSBwb29sLT5idWZmX3NpemUsCisJCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJCXBvb2wtPnNrYnVmZltpXSA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwlpZihwb29sLT5kbWFfYWRkcikgeworCQlrZnJlZShwb29sLT5kbWFfYWRkcik7CisJCXBvb2wtPmRtYV9hZGRyID0gTlVMTDsKKwl9CisKKwlpZihwb29sLT5za2J1ZmYpIHsKKwkJa2ZyZWUocG9vbC0+c2tidWZmKTsKKwkJcG9vbC0+c2tidWZmID0gTlVMTDsKKwl9Cit9CisKKy8qIHJlbW92ZSBhIGJ1ZmZlciBmcm9tIGEgcG9vbCAqLworc3RhdGljIHZvaWQgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCB1NjQgY29ycmVsYXRvcikKK3sKKwl1bnNpZ25lZCBpbnQgcG9vbCAgPSBjb3JyZWxhdG9yID4+IDMyOworCXVuc2lnbmVkIGludCBpbmRleCA9IGNvcnJlbGF0b3IgJiAweGZmZmZmZmZmVUw7CisJdW5zaWduZWQgaW50IGZyZWVfaW5kZXg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlibXZldGhfYXNzZXJ0KHBvb2wgPCBJYm1WZXRoTnVtQnVmZmVyUG9vbHMpOworCWlibXZldGhfYXNzZXJ0KGluZGV4IDwgYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLnNpemUpOworCisJc2tiID0gYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLnNrYnVmZltpbmRleF07CisKKwlpYm12ZXRoX2Fzc2VydChza2IgIT0gTlVMTCk7CisKKwlhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uc2tidWZmW2luZGV4XSA9IE5VTEw7CisKKwlkbWFfdW5tYXBfc2luZ2xlKCZhZGFwdGVyLT52ZGV2LT5kZXYsCisJCQkgYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLmRtYV9hZGRyW2luZGV4XSwKKwkJCSBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uYnVmZl9zaXplLAorCQkJIERNQV9GUk9NX0RFVklDRSk7CisKKwlmcmVlX2luZGV4ID0gYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLnByb2R1Y2VyX2luZGV4KysgJSBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uc2l6ZTsKKwlhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uZnJlZV9tYXBbZnJlZV9pbmRleF0gPSBpbmRleDsKKworCW1iKCk7CisKKwlhdG9taWNfZGVjKCYoYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLmF2YWlsYWJsZSkpOworfQorCisvKiBnZXQgdGhlIGN1cnJlbnQgYnVmZmVyIG9uIHRoZSByeCBxdWV1ZSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQoreworCXU2NCBjb3JyZWxhdG9yID0gYWRhcHRlci0+cnhfcXVldWUucXVldWVfYWRkclthZGFwdGVyLT5yeF9xdWV1ZS5pbmRleF0uY29ycmVsYXRvcjsKKwl1bnNpZ25lZCBpbnQgcG9vbCA9IGNvcnJlbGF0b3IgPj4gMzI7CisJdW5zaWduZWQgaW50IGluZGV4ID0gY29ycmVsYXRvciAmIDB4ZmZmZmZmZmZVTDsKKworCWlibXZldGhfYXNzZXJ0KHBvb2wgPCBJYm1WZXRoTnVtQnVmZmVyUG9vbHMpOworCWlibXZldGhfYXNzZXJ0KGluZGV4IDwgYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLnNpemUpOworCisJcmV0dXJuIGFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFtwb29sXS5za2J1ZmZbaW5kZXhdOworfQorCisvKiByZWN5Y2xlIHRoZSBjdXJyZW50IGJ1ZmZlciBvbiB0aGUgcnggcXVldWUgKi8KK3N0YXRpYyB2b2lkIGlibXZldGhfcnhxX3JlY3ljbGVfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHFfaW5kZXggPSBhZGFwdGVyLT5yeF9xdWV1ZS5pbmRleDsKKwl1NjQgY29ycmVsYXRvciA9IGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2FkZHJbcV9pbmRleF0uY29ycmVsYXRvcjsKKwl1bnNpZ25lZCBpbnQgcG9vbCA9IGNvcnJlbGF0b3IgPj4gMzI7CisJdW5zaWduZWQgaW50IGluZGV4ID0gY29ycmVsYXRvciAmIDB4ZmZmZmZmZmZVTDsKKwl1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIGRlc2M7CisJdW5zaWduZWQgbG9uZyBscGFyX3JjOworCisJaWJtdmV0aF9hc3NlcnQocG9vbCA8IElibVZldGhOdW1CdWZmZXJQb29scyk7CisJaWJtdmV0aF9hc3NlcnQoaW5kZXggPCBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uc2l6ZSk7CisKKwlkZXNjLmRlc2MgPSAwOworCWRlc2MuZmllbGRzLnZhbGlkID0gMTsKKwlkZXNjLmZpZWxkcy5sZW5ndGggPSBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uYnVmZl9zaXplOworCWRlc2MuZmllbGRzLmFkZHJlc3MgPSBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uZG1hX2FkZHJbaW5kZXhdOworCisJbHBhcl9yYyA9IGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcihhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MsIGRlc2MuZGVzYyk7CisJCSAgICAKKwlpZihscGFyX3JjICE9IEhfU3VjY2VzcykgeworCQlpYm12ZXRoX2RlYnVnX3ByaW50aygiaF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyIGZhaWxlZCBkdXJpbmcgcmVjeWNsZSByYz0lbGQiLCBscGFyX3JjKTsKKwkJaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyW2FkYXB0ZXItPnJ4X3F1ZXVlLmluZGV4XS5jb3JyZWxhdG9yKTsKKwl9CisKKwlpZigrK2FkYXB0ZXItPnJ4X3F1ZXVlLmluZGV4ID09IGFkYXB0ZXItPnJ4X3F1ZXVlLm51bV9zbG90cykgeworCQlhZGFwdGVyLT5yeF9xdWV1ZS5pbmRleCA9IDA7CisJCWFkYXB0ZXItPnJ4X3F1ZXVlLnRvZ2dsZSA9ICFhZGFwdGVyLT5yeF9xdWV1ZS50b2dnbGU7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWJtdmV0aF9yeHFfaGFydmVzdF9idWZmZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKGFkYXB0ZXIsIGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2FkZHJbYWRhcHRlci0+cnhfcXVldWUuaW5kZXhdLmNvcnJlbGF0b3IpOworCisJaWYoKythZGFwdGVyLT5yeF9xdWV1ZS5pbmRleCA9PSBhZGFwdGVyLT5yeF9xdWV1ZS5udW1fc2xvdHMpIHsKKwkJYWRhcHRlci0+cnhfcXVldWUuaW5kZXggPSAwOworCQlhZGFwdGVyLT5yeF9xdWV1ZS50b2dnbGUgPSAhYWRhcHRlci0+cnhfcXVldWUudG9nZ2xlOworCX0KK30KKworc3RhdGljIHZvaWQgaWJtdmV0aF9jbGVhbnVwKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYoYWRhcHRlci0+YnVmZmVyX2xpc3RfYWRkciAhPSBOVUxMKSB7CisJCWlmKCFkbWFfbWFwcGluZ19lcnJvcihhZGFwdGVyLT5idWZmZXJfbGlzdF9kbWEpKSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKCZhZGFwdGVyLT52ZGV2LT5kZXYsCisJCQkJCWFkYXB0ZXItPmJ1ZmZlcl9saXN0X2RtYSwgNDA5NiwKKwkJCQkJRE1BX0JJRElSRUNUSU9OQUwpOworCQkJYWRhcHRlci0+YnVmZmVyX2xpc3RfZG1hID0gRE1BX0VSUk9SX0NPREU7CisJCX0KKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItPmJ1ZmZlcl9saXN0X2FkZHIpOworCQlhZGFwdGVyLT5idWZmZXJfbGlzdF9hZGRyID0gTlVMTDsKKwl9IAorCisJaWYoYWRhcHRlci0+ZmlsdGVyX2xpc3RfYWRkciAhPSBOVUxMKSB7CisJCWlmKCFkbWFfbWFwcGluZ19lcnJvcihhZGFwdGVyLT5maWx0ZXJfbGlzdF9kbWEpKSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKCZhZGFwdGVyLT52ZGV2LT5kZXYsCisJCQkJCWFkYXB0ZXItPmZpbHRlcl9saXN0X2RtYSwgNDA5NiwKKwkJCQkJRE1BX0JJRElSRUNUSU9OQUwpOworCQkJYWRhcHRlci0+ZmlsdGVyX2xpc3RfZG1hID0gRE1BX0VSUk9SX0NPREU7CisJCX0KKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItPmZpbHRlcl9saXN0X2FkZHIpOworCQlhZGFwdGVyLT5maWx0ZXJfbGlzdF9hZGRyID0gTlVMTDsKKwl9CisKKwlpZihhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyICE9IE5VTEwpIHsKKwkJaWYoIWRtYV9tYXBwaW5nX2Vycm9yKGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2RtYSkpIHsKKwkJCWRtYV91bm1hcF9zaW5nbGUoJmFkYXB0ZXItPnZkZXYtPmRldiwKKwkJCQkJYWRhcHRlci0+cnhfcXVldWUucXVldWVfZG1hLAorCQkJCQlhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9sZW4sCisJCQkJCURNQV9CSURJUkVDVElPTkFMKTsKKwkJCWFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2RtYSA9IERNQV9FUlJPUl9DT0RFOworCQl9CisJCWtmcmVlKGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2FkZHIpOworCQlhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyID0gTlVMTDsKKwl9CisKKwlpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2woYWRhcHRlciwgJmFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFswXSk7CisJaWJtdmV0aF9mcmVlX2J1ZmZlcl9wb29sKGFkYXB0ZXIsICZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMV0pOworCWlibXZldGhfZnJlZV9idWZmZXJfcG9vbChhZGFwdGVyLCAmYWRhcHRlci0+cnhfYnVmZl9wb29sWzJdKTsKK30KKworc3RhdGljIGludCBpYm12ZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXU2NCBtYWNfYWRkcmVzcyA9IDA7CisJaW50IHJ4cV9lbnRyaWVzOworCXVuc2lnbmVkIGxvbmcgbHBhcl9yYzsKKwlpbnQgcmM7CisJdW5pb24gaWJtdmV0aF9idWZfZGVzYyByeHFfZGVzYzsKKworCWlibXZldGhfZGVidWdfcHJpbnRrKCJvcGVuIHN0YXJ0aW5nXG4iKTsKKworCXJ4cV9lbnRyaWVzID0KKwkJYWRhcHRlci0+cnhfYnVmZl9wb29sWzBdLnNpemUgKworCQlhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMV0uc2l6ZSArCisJCWFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFsyXS5zaXplICsgMTsKKyAgICAKKwlhZGFwdGVyLT5idWZmZXJfbGlzdF9hZGRyID0gKHZvaWQqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJYWRhcHRlci0+ZmlsdGVyX2xpc3RfYWRkciA9ICh2b2lkKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworIAorCWlmKCFhZGFwdGVyLT5idWZmZXJfbGlzdF9hZGRyIHx8ICFhZGFwdGVyLT5maWx0ZXJfbGlzdF9hZGRyKSB7CisJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJ1bmFibGUgdG8gYWxsb2NhdGUgZmlsdGVyIG9yIGJ1ZmZlciBsaXN0IHBhZ2VzXG4iKTsKKwkJaWJtdmV0aF9jbGVhbnVwKGFkYXB0ZXIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9sZW4gPSBzaXplb2Yoc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSkgKiByeHFfZW50cmllczsKKwlhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyID0ga21hbGxvYyhhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9sZW4sIEdGUF9LRVJORUwpOworCisJaWYoIWFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2FkZHIpIHsKKwkJaWJtdmV0aF9lcnJvcl9wcmludGsoInVuYWJsZSB0byBhbGxvY2F0ZSByeCBxdWV1ZSBwYWdlc1xuIik7CisJCWlibXZldGhfY2xlYW51cChhZGFwdGVyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYWRhcHRlci0+YnVmZmVyX2xpc3RfZG1hID0gZG1hX21hcF9zaW5nbGUoJmFkYXB0ZXItPnZkZXYtPmRldiwKKwkJCWFkYXB0ZXItPmJ1ZmZlcl9saXN0X2FkZHIsIDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTsKKwlhZGFwdGVyLT5maWx0ZXJfbGlzdF9kbWEgPSBkbWFfbWFwX3NpbmdsZSgmYWRhcHRlci0+dmRldi0+ZGV2LAorCQkJYWRhcHRlci0+ZmlsdGVyX2xpc3RfYWRkciwgNDA5NiwgRE1BX0JJRElSRUNUSU9OQUwpOworCWFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2RtYSA9IGRtYV9tYXBfc2luZ2xlKCZhZGFwdGVyLT52ZGV2LT5kZXYsCisJCQlhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyLAorCQkJYWRhcHRlci0+cnhfcXVldWUucXVldWVfbGVuLCBETUFfQklESVJFQ1RJT05BTCk7CisKKwlpZigoZG1hX21hcHBpbmdfZXJyb3IoYWRhcHRlci0+YnVmZmVyX2xpc3RfZG1hKSApIHx8CisJICAgKGRtYV9tYXBwaW5nX2Vycm9yKGFkYXB0ZXItPmZpbHRlcl9saXN0X2RtYSkpIHx8CisJICAgKGRtYV9tYXBwaW5nX2Vycm9yKGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2RtYSkpKSB7CisJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJ1bmFibGUgdG8gbWFwIGZpbHRlciBvciBidWZmZXIgbGlzdCBwYWdlc1xuIik7CisJCWlibXZldGhfY2xlYW51cChhZGFwdGVyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYWRhcHRlci0+cnhfcXVldWUuaW5kZXggPSAwOworCWFkYXB0ZXItPnJ4X3F1ZXVlLm51bV9zbG90cyA9IHJ4cV9lbnRyaWVzOworCWFkYXB0ZXItPnJ4X3F1ZXVlLnRvZ2dsZSA9IDE7CisKKwlpZihpYm12ZXRoX2FsbG9jX2J1ZmZlcl9wb29sKCZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMF0pIHx8CisJICAgaWJtdmV0aF9hbGxvY19idWZmZXJfcG9vbCgmYWRhcHRlci0+cnhfYnVmZl9wb29sWzFdKSB8fAorCSAgIGlibXZldGhfYWxsb2NfYnVmZmVyX3Bvb2woJmFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFsyXSkpCisJeworCQlpYm12ZXRoX2Vycm9yX3ByaW50aygidW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciBwb29sc1xuIik7CisJCWlibXZldGhfY2xlYW51cChhZGFwdGVyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtY3B5KCZtYWNfYWRkcmVzcywgbmV0ZGV2LT5kZXZfYWRkciwgbmV0ZGV2LT5hZGRyX2xlbik7CisJbWFjX2FkZHJlc3MgPSBtYWNfYWRkcmVzcyA+PiAxNjsKKworCXJ4cV9kZXNjLmRlc2MgPSAwOworCXJ4cV9kZXNjLmZpZWxkcy52YWxpZCA9IDE7CisJcnhxX2Rlc2MuZmllbGRzLmxlbmd0aCA9IGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2xlbjsKKwlyeHFfZGVzYy5maWVsZHMuYWRkcmVzcyA9IGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2RtYTsKKworCWlibXZldGhfZGVidWdfcHJpbnRrKCJidWZmZXIgbGlzdCBAIDB4JXBcbiIsIGFkYXB0ZXItPmJ1ZmZlcl9saXN0X2FkZHIpOworCWlibXZldGhfZGVidWdfcHJpbnRrKCJmaWx0ZXIgbGlzdCBAIDB4JXBcbiIsIGFkYXB0ZXItPmZpbHRlcl9saXN0X2FkZHIpOworCWlibXZldGhfZGVidWdfcHJpbnRrKCJyZWNlaXZlIHEgICBAIDB4JXBcbiIsIGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2FkZHIpOworCisgICAgCisJbHBhcl9yYyA9IGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4oYWRhcHRlci0+dmRldi0+dW5pdF9hZGRyZXNzLAorCQkJCQkgYWRhcHRlci0+YnVmZmVyX2xpc3RfZG1hLAorCQkJCQkgcnhxX2Rlc2MuZGVzYywKKwkJCQkJIGFkYXB0ZXItPmZpbHRlcl9saXN0X2RtYSwKKwkJCQkJIG1hY19hZGRyZXNzKTsKKworCWlmKGxwYXJfcmMgIT0gSF9TdWNjZXNzKSB7CisJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuIGZhaWxlZCB3aXRoICVsZFxuIiwgbHBhcl9yYyk7CisJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJidWZmZXIgVENFOjB4JXggZmlsdGVyIFRDRToweCV4IHJ4cSBkZXNjOjB4JWx4IE1BQzoweCVseFxuIiwKKwkJCQkgICAgIGFkYXB0ZXItPmJ1ZmZlcl9saXN0X2RtYSwKKwkJCQkgICAgIGFkYXB0ZXItPmZpbHRlcl9saXN0X2RtYSwKKwkJCQkgICAgIHJ4cV9kZXNjLmRlc2MsCisJCQkJICAgICBtYWNfYWRkcmVzcyk7CisJCWlibXZldGhfY2xlYW51cChhZGFwdGVyKTsKKwkJcmV0dXJuIC1FTk9ORVQ7IAorCX0KKworCWlibXZldGhfZGVidWdfcHJpbnRrKCJyZWdpc3RlcmluZyBpcnEgMHgleFxuIiwgbmV0ZGV2LT5pcnEpOworCWlmKChyYyA9IHJlcXVlc3RfaXJxKG5ldGRldi0+aXJxLCAmaWJtdmV0aF9pbnRlcnJ1cHQsIDAsIG5ldGRldi0+bmFtZSwgbmV0ZGV2KSkgIT0gMCkgeworCQlpYm12ZXRoX2Vycm9yX3ByaW50aygidW5hYmxlIHRvIHJlcXVlc3QgaXJxIDB4JXgsIHJjICVkXG4iLCBuZXRkZXYtPmlycSwgcmMpOworCQlkbyB7CisJCQlyYyA9IGhfZnJlZV9sb2dpY2FsX2xhbihhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MpOworCQl9IHdoaWxlIChIX2lzTG9uZ0J1c3kocmMpIHx8IChyYyA9PSBIX0J1c3kpKTsKKworCQlpYm12ZXRoX2NsZWFudXAoYWRhcHRlcik7CisJCXJldHVybiByYzsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOworCisJaWJtdmV0aF9kZWJ1Z19wcmludGsoInNjaGVkdWxpbmcgaW5pdGlhbCByZXBsZW5pc2ggY3ljbGVcbiIpOworCWlibXZldGhfc2NoZWR1bGVfcmVwbGVuaXNoaW5nKGFkYXB0ZXIpOworCisJaWJtdmV0aF9kZWJ1Z19wcmludGsoIm9wZW4gY29tcGxldGVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWJtdmV0aF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJbG9uZyBscGFyX3JjOworICAgIAorCWlibXZldGhfZGVidWdfcHJpbnRrKCJjbG9zZSBzdGFydGluZ1xuIik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwlmcmVlX2lycShuZXRkZXYtPmlycSwgbmV0ZGV2KTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFkYXB0ZXItPnJlcGxlbmlzaF90YXNrKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJZG8geworCQlscGFyX3JjID0gaF9mcmVlX2xvZ2ljYWxfbGFuKGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcyk7CisJfSB3aGlsZSAoSF9pc0xvbmdCdXN5KGxwYXJfcmMpIHx8IChscGFyX3JjID09IEhfQnVzeSkpOworCisJaWYobHBhcl9yYyAhPSBIX1N1Y2Nlc3MpCisJeworCQlpYm12ZXRoX2Vycm9yX3ByaW50aygiaF9mcmVlX2xvZ2ljYWxfbGFuIGZhaWxlZCB3aXRoICVseCwgY29udGludWluZyB3aXRoIGNsb3NlXG4iLAorCQkJCSAgICAgbHBhcl9yYyk7CisJfQorCisJYWRhcHRlci0+cnhfbm9fYnVmZmVyID0gKih1NjQqKSgoKGNoYXIqKWFkYXB0ZXItPmJ1ZmZlcl9saXN0X2FkZHIpICsgNDA5NiAtIDgpOworCisJaWJtdmV0aF9jbGVhbnVwKGFkYXB0ZXIpOworCisJaWJtdmV0aF9kZWJ1Z19wcmludGsoImNsb3NlIGNvbXBsZXRlXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldGRldl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpIHsKKwljbWQtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9GSUJSRSk7CisJY21kLT5hZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwgQURWRVJUSVNFRF9BdXRvbmVnIHwgQURWRVJUSVNFRF9GSUJSRSk7CisJY21kLT5zcGVlZCA9IFNQRUVEXzEwMDA7CisJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwljbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCWNtZC0+cGh5X2FkZHJlc3MgPSAwOworCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCWNtZC0+bWF4dHhwa3QgPSAwOworCWNtZC0+bWF4cnhwa3QgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pIHsKKwlzdHJuY3B5KGluZm8tPmRyaXZlciwgaWJtdmV0aF9kcml2ZXJfbmFtZSwgc2l6ZW9mKGluZm8tPmRyaXZlcikgLSAxKTsKKwlzdHJuY3B5KGluZm8tPnZlcnNpb24sIGlibXZldGhfZHJpdmVyX3ZlcnNpb24sIHNpemVvZihpbmZvLT52ZXJzaW9uKSAtIDEpOworfQorCitzdGF0aWMgdTMyIG5ldGRldl9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisJLmdldF9zZXR0aW5ncwkJPSBuZXRkZXZfZ2V0X3NldHRpbmdzLAorCS5nZXRfbGluawkJPSBuZXRkZXZfZ2V0X2xpbmssCisJLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLmdldF90eF9jc3VtCQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCit9OworCitzdGF0aWMgaW50IGlibXZldGhfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisjZGVmaW5lIHBhZ2Vfb2Zmc2V0KHYpICgodW5zaWduZWQgbG9uZykodikgJiAoKDEgPDwgMTIpIC0gMSkpCisKK3N0YXRpYyBpbnQgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwl1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIGRlc2NbSWJtVmV0aE1heFNlbmRGcmFnc107CisJdW5zaWduZWQgbG9uZyBscGFyX3JjOworCWludCBuZnJhZ3MgPSAwLCBjdXJmcmFnOworCXVuc2lnbmVkIGxvbmcgY29ycmVsYXRvcjsKKwl1bnNpZ25lZCBpbnQgcmV0cnlfY291bnQ7CisKKwlpZiAoKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxKSA+IElibVZldGhNYXhTZW5kRnJhZ3MpIHsKKwkJYWRhcHRlci0+c3RhdHMudHhfZHJvcHBlZCsrOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKKworCS8qIG5mcmFncyA9IG51bWJlciBvZiBmcmFncyBhZnRlciB0aGUgaW5pdGlhbCBmcmFnbWVudCAqLworCW5mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisKKwlpZihuZnJhZ3MpCisJCWFkYXB0ZXItPnR4X211bHRpZGVzY19zZW5kKys7CisKKwkvKiBtYXAgdGhlIGluaXRpYWwgZnJhZ21lbnQgKi8KKwlkZXNjWzBdLmZpZWxkcy5sZW5ndGggID0gbmZyYWdzID8gc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuIDogc2tiLT5sZW47CisJZGVzY1swXS5maWVsZHMuYWRkcmVzcyA9IGRtYV9tYXBfc2luZ2xlKCZhZGFwdGVyLT52ZGV2LT5kZXYsIHNrYi0+ZGF0YSwKKwkJCQkJZGVzY1swXS5maWVsZHMubGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKKwlkZXNjWzBdLmZpZWxkcy52YWxpZCAgID0gMTsKKworCWlmKGRtYV9tYXBwaW5nX2Vycm9yKGRlc2NbMF0uZmllbGRzLmFkZHJlc3MpKSB7CisJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJ0eDogdW5hYmxlIHRvIG1hcCBpbml0aWFsIGZyYWdtZW50XG4iKTsKKwkJYWRhcHRlci0+dHhfbWFwX2ZhaWxlZCsrOworCQlhZGFwdGVyLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY3VyZnJhZyA9IG5mcmFnczsKKworCS8qIG1hcCBmcmFnbWVudHMgcGFzdCB0aGUgaW5pdGlhbCBwb3J0aW9uIGlmIHRoZXJlIGFyZSBhbnkgKi8KKwl3aGlsZShjdXJmcmFnLS0pIHsKKwkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2N1cmZyYWddOworCQlkZXNjW2N1cmZyYWcrMV0uZmllbGRzLmFkZHJlc3MKKwkJCT0gZG1hX21hcF9zaW5nbGUoJmFkYXB0ZXItPnZkZXYtPmRldiwKKwkJCQlwYWdlX2FkZHJlc3MoZnJhZy0+cGFnZSkgKyBmcmFnLT5wYWdlX29mZnNldCwKKwkJCQlmcmFnLT5zaXplLCBETUFfVE9fREVWSUNFKTsKKwkJZGVzY1tjdXJmcmFnKzFdLmZpZWxkcy5sZW5ndGggPSBmcmFnLT5zaXplOworCQlkZXNjW2N1cmZyYWcrMV0uZmllbGRzLnZhbGlkICA9IDE7CisKKwkJaWYoZG1hX21hcHBpbmdfZXJyb3IoZGVzY1tjdXJmcmFnKzFdLmZpZWxkcy5hZGRyZXNzKSkgeworCQkJaWJtdmV0aF9lcnJvcl9wcmludGsoInR4OiB1bmFibGUgdG8gbWFwIGZyYWdtZW50ICVkXG4iLCBjdXJmcmFnKTsKKwkJCWFkYXB0ZXItPnR4X21hcF9mYWlsZWQrKzsKKwkJCWFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCS8qIEZyZWUgYWxsIHRoZSBtYXBwaW5ncyB3ZSBqdXN0IGNyZWF0ZWQgKi8KKwkJCXdoaWxlKGN1cmZyYWcgPCBuZnJhZ3MpIHsKKwkJCQlkbWFfdW5tYXBfc2luZ2xlKCZhZGFwdGVyLT52ZGV2LT5kZXYsCisJCQkJCQkgZGVzY1tjdXJmcmFnKzFdLmZpZWxkcy5hZGRyZXNzLAorCQkJCQkJIGRlc2NbY3VyZnJhZysxXS5maWVsZHMubGVuZ3RoLAorCQkJCQkJIERNQV9UT19ERVZJQ0UpOworCQkJCWN1cmZyYWcrKzsKKwkJCX0KKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogc2VuZCB0aGUgZnJhbWUuIEFyYml0cmFyaWx5IHNldCByZXRyeWNvdW50IHRvIDEwMjQgKi8KKwljb3JyZWxhdG9yID0gMDsKKwlyZXRyeV9jb3VudCA9IDEwMjQ7CisJZG8geworCQlscGFyX3JjID0gaF9zZW5kX2xvZ2ljYWxfbGFuKGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcywKKwkJCQkJICAgICBkZXNjWzBdLmRlc2MsCisJCQkJCSAgICAgZGVzY1sxXS5kZXNjLAorCQkJCQkgICAgIGRlc2NbMl0uZGVzYywKKwkJCQkJICAgICBkZXNjWzNdLmRlc2MsCisJCQkJCSAgICAgZGVzY1s0XS5kZXNjLAorCQkJCQkgICAgIGRlc2NbNV0uZGVzYywKKwkJCQkJICAgICBjb3JyZWxhdG9yKTsKKwl9IHdoaWxlICgobHBhcl9yYyA9PSBIX0J1c3kpICYmIChyZXRyeV9jb3VudC0tKSk7CisgICAgCisJaWYobHBhcl9yYyAhPSBIX1N1Y2Nlc3MgJiYgbHBhcl9yYyAhPSBIX0Ryb3BwZWQpIHsKKwkJaW50IGk7CisJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJ0eDogaF9zZW5kX2xvZ2ljYWxfbGFuIGZhaWxlZCB3aXRoIHJjPSVsZFxuIiwgbHBhcl9yYyk7CisJCWZvcihpID0gMDsgaSA8IDY7IGkrKykgeworCQkJaWJtdmV0aF9lcnJvcl9wcmludGsoInR4OiBkZXNjWyVpXSB2YWxpZD0lZCwgbGVuPSVkLCBhZGRyZXNzPTB4JWRcbiIsIGksCisJCQkJCSAgICAgZGVzY1tpXS5maWVsZHMudmFsaWQsIGRlc2NbaV0uZmllbGRzLmxlbmd0aCwgZGVzY1tpXS5maWVsZHMuYWRkcmVzcyk7CisJCX0KKwkJYWRhcHRlci0+dHhfc2VuZF9mYWlsZWQrKzsKKwkJYWRhcHRlci0+c3RhdHMudHhfZHJvcHBlZCsrOworCX0gZWxzZSB7CisJCWFkYXB0ZXItPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJYWRhcHRlci0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJfQorCisJZG8geworCQlkbWFfdW5tYXBfc2luZ2xlKCZhZGFwdGVyLT52ZGV2LT5kZXYsCisJCQkJZGVzY1tuZnJhZ3NdLmZpZWxkcy5hZGRyZXNzLAorCQkJCWRlc2NbbmZyYWdzXS5maWVsZHMubGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKKwl9IHdoaWxlKC0tbmZyYWdzID49IDApOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlibXZldGhfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWludCBtYXhfZnJhbWVzX3RvX3Byb2Nlc3MgPSBuZXRkZXYtPnF1b3RhOworCWludCBmcmFtZXNfcHJvY2Vzc2VkID0gMDsKKwlpbnQgbW9yZV93b3JrID0gMTsKKwl1bnNpZ25lZCBsb25nIGxwYXJfcmM7CisKKyByZXN0YXJ0X3BvbGw6CisJZG8geworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJCWlmKGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIpKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlybWIoKTsKKworCQkJaWYoIWlibXZldGhfcnhxX2J1ZmZlcl92YWxpZChhZGFwdGVyKSkgeworCQkJCXdtYigpOyAvKiBzdWdnZXN0ZWQgYnkgbGFyc29uMSAqLworCQkJCWFkYXB0ZXItPnJ4X2ludmFsaWRfYnVmZmVyKys7CisJCQkJaWJtdmV0aF9kZWJ1Z19wcmludGsoInJlY3ljbGluZyBpbnZhbGlkIGJ1ZmZlclxuIik7CisJCQkJaWJtdmV0aF9yeHFfcmVjeWNsZV9idWZmZXIoYWRhcHRlcik7CisJCQl9IGVsc2UgeworCQkJCWludCBsZW5ndGggPSBpYm12ZXRoX3J4cV9mcmFtZV9sZW5ndGgoYWRhcHRlcik7CisJCQkJaW50IG9mZnNldCA9IGlibXZldGhfcnhxX2ZyYW1lX29mZnNldChhZGFwdGVyKTsKKwkJCQlza2IgPSBpYm12ZXRoX3J4cV9nZXRfYnVmZmVyKGFkYXB0ZXIpOworCisJCQkJaWJtdmV0aF9yeHFfaGFydmVzdF9idWZmZXIoYWRhcHRlcik7CisKKwkJCQlza2JfcmVzZXJ2ZShza2IsIG9mZnNldCk7CisJCQkJc2tiX3B1dChza2IsIGxlbmd0aCk7CisJCQkJc2tiLT5kZXYgPSBuZXRkZXY7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmV0ZGV2KTsKKworCQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CS8qIHNlbmQgaXQgdXAgKi8KKworCQkJCWFkYXB0ZXItPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlhZGFwdGVyLT5zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7CisJCQkJZnJhbWVzX3Byb2Nlc3NlZCsrOworCQkJfQorCQl9IGVsc2UgeworCQkJbW9yZV93b3JrID0gMDsKKwkJfQorCX0gd2hpbGUobW9yZV93b3JrICYmIChmcmFtZXNfcHJvY2Vzc2VkIDwgbWF4X2ZyYW1lc190b19wcm9jZXNzKSk7CisKKwlpYm12ZXRoX3NjaGVkdWxlX3JlcGxlbmlzaGluZyhhZGFwdGVyKTsKKworCWlmKG1vcmVfd29yaykgeworCQkvKiBtb3JlIHdvcmsgdG8gZG8gLSByZXR1cm4gdGhhdCB3ZSBhcmUgbm90IGRvbmUgeWV0ICovCisJCW5ldGRldi0+cXVvdGEgLT0gZnJhbWVzX3Byb2Nlc3NlZDsKKwkJKmJ1ZGdldCAtPSBmcmFtZXNfcHJvY2Vzc2VkOworCQlyZXR1cm4gMTsgCisJfQorCisJLyogd2UgdGhpbmsgd2UgYXJlIGRvbmUgLSByZWVuYWJsZSBpbnRlcnJ1cHRzLCB0aGVuIGNoZWNrIG9uY2UgbW9yZSB0byBtYWtlIHN1cmUgd2UgYXJlIGRvbmUgKi8KKwlscGFyX3JjID0gaF92aW9fc2lnbmFsKGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcywgVklPX0lSUV9FTkFCTEUpOworCisJaWJtdmV0aF9hc3NlcnQobHBhcl9yYyA9PSBIX1N1Y2Nlc3MpOworCisJbmV0aWZfcnhfY29tcGxldGUobmV0ZGV2KTsKKworCWlmKGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIpICYmIG5ldGlmX3J4X3Jlc2NoZWR1bGUobmV0ZGV2LCBmcmFtZXNfcHJvY2Vzc2VkKSkKKwl7CisJCWxwYXJfcmMgPSBoX3Zpb19zaWduYWwoYWRhcHRlci0+dmRldi0+dW5pdF9hZGRyZXNzLCBWSU9fSVJRX0RJU0FCTEUpOworCQlpYm12ZXRoX2Fzc2VydChscGFyX3JjID09IEhfU3VjY2Vzcyk7CisJCW1vcmVfd29yayA9IDE7CisJCWdvdG8gcmVzdGFydF9wb2xsOworCX0KKworCW5ldGRldi0+cXVvdGEgLT0gZnJhbWVzX3Byb2Nlc3NlZDsKKwkqYnVkZ2V0IC09IGZyYW1lc19wcm9jZXNzZWQ7CisKKwkvKiB3ZSByZWFsbHkgYXJlIGRvbmUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGlibXZldGhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7ICAgCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgbHBhcl9yYzsKKworCWlmKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAobmV0ZGV2KSkgeworCQlscGFyX3JjID0gaF92aW9fc2lnbmFsKGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcywgVklPX0lSUV9ESVNBQkxFKTsKKwkJaWJtdmV0aF9hc3NlcnQobHBhcl9yYyA9PSBIX1N1Y2Nlc3MpOworCQlfX25ldGlmX3J4X3NjaGVkdWxlKG5ldGRldik7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppYm12ZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJcmV0dXJuICZhZGFwdGVyLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgaWJtdmV0aF9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgbHBhcl9yYzsKKworCWlmKChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHx8IChuZXRkZXYtPm1jX2NvdW50ID4gYWRhcHRlci0+bWNhc3RGaWx0ZXJTaXplKSkgeworCQlscGFyX3JjID0gaF9tdWx0aWNhc3RfY3RybChhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MsCisJCQkJCSAgIElibVZldGhNY2FzdEVuYWJsZVJlY3YgfAorCQkJCQkgICBJYm1WZXRoTWNhc3REaXNhYmxlRmlsdGVyaW5nLAorCQkJCQkgICAwKTsKKwkJaWYobHBhcl9yYyAhPSBIX1N1Y2Nlc3MpIHsKKwkJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJoX211bHRpY2FzdF9jdHJsIHJjPSVsZCB3aGVuIGVudGVyaW5nIHByb21pc2MgbW9kZVxuIiwgbHBhcl9yYyk7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdCA9IG5ldGRldi0+bWNfbGlzdDsKKwkJaW50IGk7CisJCS8qIGNsZWFyIHRoZSBmaWx0ZXIgdGFibGUgJiBkaXNhYmxlIGZpbHRlcmluZyAqLworCQlscGFyX3JjID0gaF9tdWx0aWNhc3RfY3RybChhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MsCisJCQkJCSAgIElibVZldGhNY2FzdEVuYWJsZVJlY3YgfAorCQkJCQkgICBJYm1WZXRoTWNhc3REaXNhYmxlRmlsdGVyaW5nIHwKKwkJCQkJICAgSWJtVmV0aE1jYXN0Q2xlYXJGaWx0ZXJUYWJsZSwKKwkJCQkJICAgMCk7CisJCWlmKGxwYXJfcmMgIT0gSF9TdWNjZXNzKSB7CisJCQlpYm12ZXRoX2Vycm9yX3ByaW50aygiaF9tdWx0aWNhc3RfY3RybCByYz0lbGQgd2hlbiBhdHRlbXB0aW5nIHRvIGNsZWFyIGZpbHRlciB0YWJsZVxuIiwgbHBhcl9yYyk7CisJCX0KKwkJLyogYWRkIHRoZSBhZGRyZXNzZXMgdG8gdGhlIGZpbHRlciB0YWJsZSAqLworCQlmb3IoaSA9IDA7IGkgPCBuZXRkZXYtPm1jX2NvdW50OyArK2ksIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJLy8gYWRkIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyB0byB0aGUgZmlsdGVyIHRhYmxlCisJCQl1bnNpZ25lZCBsb25nIG1jYXN0X2FkZHIgPSAwOworCQkJbWVtY3B5KCgoY2hhciAqKSZtY2FzdF9hZGRyKSsyLCBtY2xpc3QtPmRtaV9hZGRyLCA2KTsKKwkJCWxwYXJfcmMgPSBoX211bHRpY2FzdF9jdHJsKGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcywKKwkJCQkJCSAgIElibVZldGhNY2FzdEFkZEZpbHRlciwKKwkJCQkJCSAgIG1jYXN0X2FkZHIpOworCQkJaWYobHBhcl9yYyAhPSBIX1N1Y2Nlc3MpIHsKKwkJCQlpYm12ZXRoX2Vycm9yX3ByaW50aygiaF9tdWx0aWNhc3RfY3RybCByYz0lbGQgd2hlbiBhZGRpbmcgYW4gZW50cnkgdG8gdGhlIGZpbHRlciB0YWJsZVxuIiwgbHBhcl9yYyk7CisJCQl9CisJCX0KKwkKKwkJLyogcmUtZW5hYmxlIGZpbHRlcmluZyAqLworCQlscGFyX3JjID0gaF9tdWx0aWNhc3RfY3RybChhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MsCisJCQkJCSAgIElibVZldGhNY2FzdEVuYWJsZUZpbHRlcmluZywKKwkJCQkJICAgMCk7CisJCWlmKGxwYXJfcmMgIT0gSF9TdWNjZXNzKSB7CisJCQlpYm12ZXRoX2Vycm9yX3ByaW50aygiaF9tdWx0aWNhc3RfY3RybCByYz0lbGQgd2hlbiBlbmFibGluZyBmaWx0ZXJpbmdcbiIsIGxwYXJfcmMpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGlibXZldGhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiAoMTw8MjApKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOwkKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaWJtdmV0aF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJjOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcjsKKworCXVuc2lnbmVkIGNoYXIgKm1hY19hZGRyX3A7CisJdW5zaWduZWQgaW50ICptY2FzdEZpbHRlclNpemVfcDsKKworCisJaWJtdmV0aF9kZWJ1Z19wcmludGtfbm9fYWRhcHRlcigiZW50ZXJpbmcgaWJtdmV0aF9wcm9iZSBmb3IgVUEgMHgleFxuIiwgCisJCQkJCWRldi0+dW5pdF9hZGRyZXNzKTsKKworCW1hY19hZGRyX3AgPSAodW5zaWduZWQgY2hhciAqKSB2aW9fZ2V0X2F0dHJpYnV0ZShkZXYsIFZFVEhfTUFDX0FERFIsIDApOworCWlmKCFtYWNfYWRkcl9wKSB7CisJCXByaW50ayhLRVJOX0VSUiAiKCVzOiUzLjNkKSBFUlJPUjogQ2FuJ3QgZmluZCBWRVRIX01BQ19BRERSICIKKwkJCQkiYXR0cmlidXRlXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQlyZXR1cm4gMDsKKwl9CisJCisJbWNhc3RGaWx0ZXJTaXplX3A9ICh1bnNpZ25lZCBpbnQgKikgdmlvX2dldF9hdHRyaWJ1dGUoZGV2LCBWRVRIX01DQVNUX0ZJTFRFUl9TSVpFLCAwKTsKKwlpZighbWNhc3RGaWx0ZXJTaXplX3ApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIoJXM6JTMuM2QpIEVSUk9SOiBDYW4ndCBmaW5kICIKKwkJCQkiVkVUSF9NQ0FTVF9GSUxURVJfU0laRSBhdHRyaWJ1dGVcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyKSk7CisKKwlpZighbmV0ZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCVNFVF9NT0RVTEVfT1dORVIobmV0ZGV2KTsKKworCWFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJbWVtc2V0KGFkYXB0ZXIsIDAsIHNpemVvZihhZGFwdGVyKSk7CisJZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSBuZXRkZXY7CisKKwlhZGFwdGVyLT52ZGV2ID0gZGV2OworCWFkYXB0ZXItPm5ldGRldiA9IG5ldGRldjsKKwlhZGFwdGVyLT5tY2FzdEZpbHRlclNpemU9ICptY2FzdEZpbHRlclNpemVfcDsKKwkKKwkvKiAJU29tZSBvbGRlciBib3hlcyBydW5uaW5nIFBIWVAgbm9uLW5hdGl2ZWx5IGhhdmUgYW4gT0YgdGhhdAorCQlyZXR1cm5zIGEgOC1ieXRlIGxvY2FsLW1hYy1hZGRyZXNzIGZpZWxkIChhbmQgdGhlIGZpcnN0IAorCQkyIGJ5dGVzIGhhdmUgdG8gYmUgaWdub3JlZCkgd2hpbGUgbmV3ZXIgYm94ZXMnIE9GIHJldHVybgorCQlhIDYtYnl0ZSBmaWVsZC4gTm90ZSB0aGF0IElFRUUgMTI3NSBzcGVjaWZpZXMgdGhhdCAKKwkJbG9jYWwtbWFjLWFkZHJlc3MgbXVzdCBiZSBhIDYtYnl0ZSBmaWVsZC4KKwkJVGhlIFJQQSBkb2Mgc3BlY2lmaWVzIHRoYXQgdGhlIGZpcnN0IGJ5dGUgbXVzdCBiZSAxMGIsIHNvIAorCQl3ZSdsbCBqdXN0IGxvb2sgZm9yIGl0IHRvIHNvbHZlIHRoaXMgOCB2cy4gNiBieXRlIGZpZWxkIGlzc3VlICovCisKKwlpZiAoKCptYWNfYWRkcl9wICYgMHgzKSAhPSAweDAyKQorCQltYWNfYWRkcl9wICs9IDI7CisKKwlhZGFwdGVyLT5tYWNfYWRkciA9IDA7CisJbWVtY3B5KCZhZGFwdGVyLT5tYWNfYWRkciwgbWFjX2FkZHJfcCwgNik7CisKKwlhZGFwdGVyLT5saW9ibiA9IGRldi0+aW9tbXVfdGFibGUtPml0X2luZGV4OworCQorCW5ldGRldi0+aXJxID0gZGV2LT5pcnE7CisJbmV0ZGV2LT5vcGVuICAgICAgICAgICAgICAgPSBpYm12ZXRoX29wZW47CisJbmV0ZGV2LT5wb2xsICAgICAgICAgICAgICAgPSBpYm12ZXRoX3BvbGw7CisJbmV0ZGV2LT53ZWlnaHQgICAgICAgICAgICAgPSAxNjsKKwluZXRkZXYtPnN0b3AgICAgICAgICAgICAgICA9IGlibXZldGhfY2xvc2U7CisJbmV0ZGV2LT5oYXJkX3N0YXJ0X3htaXQgICAgPSBpYm12ZXRoX3N0YXJ0X3htaXQ7CisJbmV0ZGV2LT5nZXRfc3RhdHMgICAgICAgICAgPSBpYm12ZXRoX2dldF9zdGF0czsKKwluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGlibXZldGhfc2V0X211bHRpY2FzdF9saXN0OworCW5ldGRldi0+ZG9faW9jdGwgICAgICAgICAgID0gaWJtdmV0aF9pb2N0bDsKKwluZXRkZXYtPmV0aHRvb2xfb3BzICAgICAgICAgICA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CisJbmV0ZGV2LT5jaGFuZ2VfbXR1ICAgICAgICAgPSBpYm12ZXRoX2NoYW5nZV9tdHU7CisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmZGV2LT5kZXYpOworCisJbWVtY3B5KCZuZXRkZXYtPmRldl9hZGRyLCAmYWRhcHRlci0+bWFjX2FkZHIsIG5ldGRldi0+YWRkcl9sZW4pOworCisJaWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKCZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMF0sIDAsIElibVZldGhQb29sMERmdENudCwgSWJtVmV0aFBvb2wwRGZ0U2l6ZSk7CisJaWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKCZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMV0sIDEsIElibVZldGhQb29sMURmdENudCwgSWJtVmV0aFBvb2wxRGZ0U2l6ZSk7CisJaWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKCZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMl0sIDIsIElibVZldGhQb29sMkRmdENudCwgSWJtVmV0aFBvb2wyRGZ0U2l6ZSk7CisKKwlpYm12ZXRoX2RlYnVnX3ByaW50aygiYWRhcHRlciBAIDB4JXBcbiIsIGFkYXB0ZXIpOworCisJSU5JVF9XT1JLKCZhZGFwdGVyLT5yZXBsZW5pc2hfdGFzaywgKHZvaWQqKWlibXZldGhfcmVwbGVuaXNoX3Rhc2ssICh2b2lkKilhZGFwdGVyKTsKKworCWFkYXB0ZXItPmJ1ZmZlcl9saXN0X2RtYSA9IERNQV9FUlJPUl9DT0RFOworCWFkYXB0ZXItPmZpbHRlcl9saXN0X2RtYSA9IERNQV9FUlJPUl9DT0RFOworCWFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2RtYSA9IERNQV9FUlJPUl9DT0RFOworCisJYXRvbWljX3NldCgmYWRhcHRlci0+bm90X3JlcGxlbmlzaGluZywgMSk7CisKKwlpYm12ZXRoX2RlYnVnX3ByaW50aygicmVnaXN0ZXJpbmcgbmV0ZGV2Li4uXG4iKTsKKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisKKwlpZihyYykgeworCQlpYm12ZXRoX2RlYnVnX3ByaW50aygiZmFpbGVkIHRvIHJlZ2lzdGVyIG5ldGRldiByYz0lZFxuIiwgcmMpOworCQlmcmVlX25ldGRldihuZXRkZXYpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWJtdmV0aF9kZWJ1Z19wcmludGsoInJlZ2lzdGVyZWRcbiIpOworCisJaWJtdmV0aF9wcm9jX3JlZ2lzdGVyX2FkYXB0ZXIoYWRhcHRlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgaWJtdmV0aF9yZW1vdmUoc3RydWN0IHZpb19kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2LT5kZXYuZHJpdmVyX2RhdGE7CisJc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisKKwlpYm12ZXRoX3Byb2NfdW5yZWdpc3Rlcl9hZGFwdGVyKGFkYXB0ZXIpOworCisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgdm9pZCBpYm12ZXRoX3Byb2NfcmVnaXN0ZXJfZHJpdmVyKHZvaWQpCit7CisJaWJtdmV0aF9wcm9jX2RpciA9IGNyZWF0ZV9wcm9jX2VudHJ5KElCTVZFVEhfUFJPQ19ESVIsIFNfSUZESVIsIHByb2NfbmV0KTsKKwlpZiAoaWJtdmV0aF9wcm9jX2RpcikgeworCQlTRVRfTU9EVUxFX09XTkVSKGlibXZldGhfcHJvY19kaXIpOworCX0KK30KKworc3RhdGljIHZvaWQgaWJtdmV0aF9wcm9jX3VucmVnaXN0ZXJfZHJpdmVyKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoSUJNVkVUSF9QUk9DX0RJUiwgcHJvY19uZXQpOworfQorCitzdGF0aWMgdm9pZCAqaWJtdmV0aF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKSAKK3sKKwlpZiAoKnBvcyA9PSAwKSB7CisJCXJldHVybiAodm9pZCAqKTE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCAqaWJtdmV0aF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpYm12ZXRoX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KSAKK3sKK30KKworc3RhdGljIGludCBpYm12ZXRoX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KSAKK3sKKwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gc2VxLT5wcml2YXRlOworCWNoYXIgKmN1cnJlbnRfbWFjID0gKChjaGFyKikgJmFkYXB0ZXItPm5ldGRldi0+ZGV2X2FkZHIpOworCWNoYXIgKmZpcm13YXJlX21hYyA9ICgoY2hhciopICZhZGFwdGVyLT5tYWNfYWRkcikgOworCisJc2VxX3ByaW50ZihzZXEsICIlcyAlc1xuXG4iLCBpYm12ZXRoX2RyaXZlcl9zdHJpbmcsIGlibXZldGhfZHJpdmVyX3ZlcnNpb24pOworCQorCXNlcV9wcmludGYoc2VxLCAiVW5pdCBBZGRyZXNzOiAgICAweCV4XG4iLCBhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MpOworCXNlcV9wcmludGYoc2VxLCAiTElPQk46ICAgICAgICAgICAweCVseFxuIiwgYWRhcHRlci0+bGlvYm4pOworCXNlcV9wcmludGYoc2VxLCAiQ3VycmVudCBNQUM6ICAgICAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkJICAgY3VycmVudF9tYWNbMF0sIGN1cnJlbnRfbWFjWzFdLCBjdXJyZW50X21hY1syXSwKKwkJICAgY3VycmVudF9tYWNbM10sIGN1cnJlbnRfbWFjWzRdLCBjdXJyZW50X21hY1s1XSk7CisJc2VxX3ByaW50ZihzZXEsICJGaXJtd2FyZSBNQUM6ICAgICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCQkgICBmaXJtd2FyZV9tYWNbMF0sIGZpcm13YXJlX21hY1sxXSwgZmlybXdhcmVfbWFjWzJdLAorCQkgICBmaXJtd2FyZV9tYWNbM10sIGZpcm13YXJlX21hY1s0XSwgZmlybXdhcmVfbWFjWzVdKTsKKwkKKwlzZXFfcHJpbnRmKHNlcSwgIlxuQWRhcHRlciBTdGF0aXN0aWNzOlxuIik7CisJc2VxX3ByaW50ZihzZXEsICIgIFRYOiAgc2tidWZmcyBsaW5lYXJpemVkOiAgICAgICAgICAlbGRcbiIsIGFkYXB0ZXItPnR4X2xpbmVhcml6ZWQpOworCXNlcV9wcmludGYoc2VxLCAiICAgICAgIG11bHRpLWRlc2NyaXB0b3Igc2VuZHM6ICAgICAgJWxkXG4iLCBhZGFwdGVyLT50eF9tdWx0aWRlc2Nfc2VuZCk7CisJc2VxX3ByaW50ZihzZXEsICIgICAgICAgc2tiX2xpbmVhcml6ZSBmYWlsdXJlczogICAgICAlbGRcbiIsIGFkYXB0ZXItPnR4X2xpbmVhcml6ZV9mYWlsZWQpOworCXNlcV9wcmludGYoc2VxLCAiICAgICAgIHZpb19tYXBfc2luZ2xlIGZhaWxyZXM6ICAgICAgJWxkXG4iLCBhZGFwdGVyLT50eF9tYXBfZmFpbGVkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgICAgICBzZW5kIGZhaWx1cmVzOiAgICAgICAgICAgICAgICVsZFxuIiwgYWRhcHRlci0+dHhfc2VuZF9mYWlsZWQpOworCXNlcV9wcmludGYoc2VxLCAiICBSWDogIHJlcGxlbmlzaCB0YXNrIGN5Y2xlczogICAgICAgJWxkXG4iLCBhZGFwdGVyLT5yZXBsZW5pc2hfdGFza19jeWNsZXMpOworCXNlcV9wcmludGYoc2VxLCAiICAgICAgIGFsbG9jX3NrYl9mYWlsdXJlczogICAgICAgICAgJWxkXG4iLCBhZGFwdGVyLT5yZXBsZW5pc2hfbm9fbWVtKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgICAgICBhZGQgYnVmZmVyIGZhaWx1cmVzOiAgICAgICAgICVsZFxuIiwgYWRhcHRlci0+cmVwbGVuaXNoX2FkZF9idWZmX2ZhaWx1cmUpOworCXNlcV9wcmludGYoc2VxLCAiICAgICAgIGludmFsaWQgYnVmZmVyczogICAgICAgICAgICAgJWxkXG4iLCBhZGFwdGVyLT5yeF9pbnZhbGlkX2J1ZmZlcik7CisJc2VxX3ByaW50ZihzZXEsICIgICAgICAgbm8gYnVmZmVyczogICAgICAgICAgICAgICAgICAlbGRcbiIsIGFkYXB0ZXItPnJ4X25vX2J1ZmZlcik7CisJCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlibXZldGhfc2VxX29wcyA9IHsKKwkuc3RhcnQgPSBpYm12ZXRoX3NlcV9zdGFydCwKKwkubmV4dCAgPSBpYm12ZXRoX3NlcV9uZXh0LAorCS5zdG9wICA9IGlibXZldGhfc2VxX3N0b3AsCisJLnNob3cgID0gaWJtdmV0aF9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgaWJtdmV0aF9wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOworCWludCByYzsKKworCXJjID0gc2VxX29wZW4oZmlsZSwgJmlibXZldGhfc2VxX29wcyk7CisJaWYgKCFyYykgeworCQkvKiByZWNvdmVyIHRoZSBwb2ludGVyIGJ1cmllZCBpbiBwcm9jX2Rpcl9lbnRyeSBkYXRhICovCisJCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJcHJvYyA9IFBERShpbm9kZSk7CisJCXNlcS0+cHJpdmF0ZSA9IHByb2MtPmRhdGE7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaWJtdmV0aF9wcm9jX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gaWJtdmV0aF9wcm9jX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIHZvaWQgaWJtdmV0aF9wcm9jX3JlZ2lzdGVyX2FkYXB0ZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCWlmIChpYm12ZXRoX3Byb2NfZGlyKSB7CisJCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoYWRhcHRlci0+bmV0ZGV2LT5uYW1lLCBTX0lGUkVHLCBpYm12ZXRoX3Byb2NfZGlyKTsKKwkJaWYgKCFlbnRyeSkgeworCQkJaWJtdmV0aF9lcnJvcl9wcmludGsoIkNhbm5vdCBjcmVhdGUgYWRhcHRlciBwcm9jIGVudHJ5Iik7CisJCX0gZWxzZSB7CisJCQllbnRyeS0+ZGF0YSA9ICh2b2lkICopIGFkYXB0ZXI7CisJCQllbnRyeS0+cHJvY19mb3BzID0gJmlibXZldGhfcHJvY19mb3BzOworCQkJU0VUX01PRFVMRV9PV05FUihlbnRyeSk7CisJCX0KKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBpYm12ZXRoX3Byb2NfdW5yZWdpc3Rlcl9hZGFwdGVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKGlibXZldGhfcHJvY19kaXIpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoYWRhcHRlci0+bmV0ZGV2LT5uYW1lLCBpYm12ZXRoX3Byb2NfZGlyKTsKKwl9Cit9CisKKyNlbHNlIC8qIENPTkZJR19QUk9DX0ZTICovCitzdGF0aWMgdm9pZCBpYm12ZXRoX3Byb2NfcmVnaXN0ZXJfYWRhcHRlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKSAKK3sKK30KKworc3RhdGljIHZvaWQgaWJtdmV0aF9wcm9jX3VucmVnaXN0ZXJfYWRhcHRlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKSAKK3sKK30KK3N0YXRpYyB2b2lkIGlibXZldGhfcHJvY19yZWdpc3Rlcl9kcml2ZXIodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgaWJtdmV0aF9wcm9jX3VucmVnaXN0ZXJfZHJpdmVyKHZvaWQpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIGlibXZldGhfZGV2aWNlX3RhYmxlW10gX19kZXZpbml0ZGF0YT0geworCXsgIm5ldHdvcmsiLCAiSUJNLGwtbGFuIn0sCisJeyAwLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCBpYm12ZXRoX2RldmljZV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciBpYm12ZXRoX2RyaXZlciA9IHsKKwkubmFtZSAgICAgICAgPSAoY2hhciAqKWlibXZldGhfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlICAgID0gaWJtdmV0aF9kZXZpY2VfdGFibGUsCisJLnByb2JlICAgICAgID0gaWJtdmV0aF9wcm9iZSwKKwkucmVtb3ZlICAgICAgPSBpYm12ZXRoX3JlbW92ZQorfTsKKworc3RhdGljIGludCBfX2luaXQgaWJtdmV0aF9tb2R1bGVfaW5pdCh2b2lkKQoreworCWlibXZldGhfcHJpbnRrKCIlczogJXMgJXNcbiIsIGlibXZldGhfZHJpdmVyX25hbWUsIGlibXZldGhfZHJpdmVyX3N0cmluZywgaWJtdmV0aF9kcml2ZXJfdmVyc2lvbik7CisKKwlpYm12ZXRoX3Byb2NfcmVnaXN0ZXJfZHJpdmVyKCk7CisKKwlyZXR1cm4gdmlvX3JlZ2lzdGVyX2RyaXZlcigmaWJtdmV0aF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaWJtdmV0aF9tb2R1bGVfZXhpdCh2b2lkKQoreworCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmaWJtdmV0aF9kcml2ZXIpOworCWlibXZldGhfcHJvY191bnJlZ2lzdGVyX2RyaXZlcigpOworfQkKKworbW9kdWxlX2luaXQoaWJtdmV0aF9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChpYm12ZXRoX21vZHVsZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libXZldGguaCBiL2RyaXZlcnMvbmV0L2libXZldGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWE0NzBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtdmV0aC5oCkBAIC0wLDAgKzEsMTU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJQk0gZVNlcnZlciBpL1tTZXJpZXMgVmlydHVhbCBFdGhlcm5ldCBEZXZpY2UgRHJpdmVyICAgICAgICAgICAgICAgICAgICovCisvKiBDb3B5cmlnaHQgKEMpIDIwMDMgSUJNIENvcnAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2ZSBMYXJzb24gKGxhcnNvbjFAdXMuaWJtLmNvbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2FudGlhZ28gTGVvbiAoc2FudGlsQHVzLmlibS5jb20pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICovCisvKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICovCisvKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICovCisvKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICovCisvKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICovCisvKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICovCisvKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICovCisvKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICovCisvKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0EgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0lCTVZFVEhfSAorI2RlZmluZSBfSUJNVkVUSF9ICisKKyNkZWZpbmUgSWJtVmV0aE1heFNlbmRGcmFncyA2CisKKy8qIGNvbnN0YW50cyBmb3IgSF9NVUxUSUNBU1RfQ1RSTCAqLworI2RlZmluZSBJYm1WZXRoTWNhc3RSZWNlcHRpb25Nb2RpZnlCaXQgICAgIDB4ODAwMDBVTAorI2RlZmluZSBJYm1WZXRoTWNhc3RSZWNlcHRpb25FbmFibGVCaXQgICAgIDB4MjAwMDBVTAorI2RlZmluZSBJYm1WZXRoTWNhc3RGaWx0ZXJNb2RpZnlCaXQgICAgICAgIDB4NDAwMDBVTAorI2RlZmluZSBJYm1WZXRoTWNhc3RGaWx0ZXJFbmFibGVCaXQgICAgICAgIDB4MTAwMDBVTAorCisjZGVmaW5lIElibVZldGhNY2FzdEVuYWJsZVJlY3YgICAgICAgKElibVZldGhNY2FzdFJlY2VwdGlvbk1vZGlmeUJpdCB8IElibVZldGhNY2FzdFJlY2VwdGlvbkVuYWJsZUJpdCkKKyNkZWZpbmUgSWJtVmV0aE1jYXN0RGlzYWJsZVJlY3YgICAgICAoSWJtVmV0aE1jYXN0UmVjZXB0aW9uTW9kaWZ5Qml0KQorI2RlZmluZSBJYm1WZXRoTWNhc3RFbmFibGVGaWx0ZXJpbmcgIChJYm1WZXRoTWNhc3RGaWx0ZXJNb2RpZnlCaXQgfCBJYm1WZXRoTWNhc3RGaWx0ZXJFbmFibGVCaXQpCisjZGVmaW5lIElibVZldGhNY2FzdERpc2FibGVGaWx0ZXJpbmcgKElibVZldGhNY2FzdEZpbHRlck1vZGlmeUJpdCkKKyNkZWZpbmUgSWJtVmV0aE1jYXN0QWRkRmlsdGVyICAgICAgICAweDFVTAorI2RlZmluZSBJYm1WZXRoTWNhc3RSZW1vdmVGaWx0ZXIgICAgIDB4MlVMCisjZGVmaW5lIElibVZldGhNY2FzdENsZWFyRmlsdGVyVGFibGUgMHgzVUwKKworLyogaGNhbGwgbnVtYmVycyAqLworI2RlZmluZSBIX1ZJT19TSUdOQUwgICAgICAgICAgICAgMHgxMDQKKyNkZWZpbmUgSF9SRUdJU1RFUl9MT0dJQ0FMX0xBTiAgIDB4MTE0CisjZGVmaW5lIEhfRlJFRV9MT0dJQ0FMX0xBTiAgICAgICAweDExOAorI2RlZmluZSBIX0FERF9MT0dJQ0FMX0xBTl9CVUZGRVIgMHgxMUMKKyNkZWZpbmUgSF9TRU5EX0xPR0lDQUxfTEFOICAgICAgIDB4MTIwCisjZGVmaW5lIEhfTVVMVElDQVNUX0NUUkwgICAgICAgICAweDEzMAorI2RlZmluZSBIX0NIQU5HRV9MT0dJQ0FMX0xBTl9NQUMgMHgxNEMKKworLyogaGNhbGwgbWFjcm9zICovCisjZGVmaW5lIGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4odWEsIGJ1ZmxzdCwgcnhxLCBmbHRsc3QsIG1hYykgXAorICBwbHBhcl9oY2FsbF9ub3JldHMoSF9SRUdJU1RFUl9MT0dJQ0FMX0xBTiwgdWEsIGJ1ZmxzdCwgcnhxLCBmbHRsc3QsIG1hYykKKworI2RlZmluZSBoX2ZyZWVfbG9naWNhbF9sYW4odWEpIFwKKyAgcGxwYXJfaGNhbGxfbm9yZXRzKEhfRlJFRV9MT0dJQ0FMX0xBTiwgdWEpCisKKyNkZWZpbmUgaF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyKHVhLCBidWYpIFwKKyAgcGxwYXJfaGNhbGxfbm9yZXRzKEhfQUREX0xPR0lDQUxfTEFOX0JVRkZFUiwgdWEsIGJ1ZikKKworI2RlZmluZSBoX3NlbmRfbG9naWNhbF9sYW4odWEsIGJ1ZjEsIGJ1ZjIsIGJ1ZjMsIGJ1ZjQsIGJ1ZjUsIGJ1ZjYsIGNvcnJlbGF0b3IpIFwKKyAgcGxwYXJfaGNhbGxfOGFyZ18ycmV0KEhfU0VORF9MT0dJQ0FMX0xBTiwgdWEsIGJ1ZjEsIGJ1ZjIsIGJ1ZjMsIGJ1ZjQsIGJ1ZjUsIGJ1ZjYsIGNvcnJlbGF0b3IsICZjb3JyZWxhdG9yKQorCisjZGVmaW5lIGhfbXVsdGljYXN0X2N0cmwodWEsIGNtZCwgbWFjKSBcCisgIHBscGFyX2hjYWxsX25vcmV0cyhIX01VTFRJQ0FTVF9DVFJMLCB1YSwgY21kLCBtYWMpCisKKyNkZWZpbmUgaF9jaGFuZ2VfbG9naWNhbF9sYW5fbWFjKHVhLCBtYWMpIFwKKyAgcGxwYXJfaGNhbGxfbm9yZXRzKEhfQ0hBTkdFX0xPR0lDQUxfTEFOX01BQywgdWEsIG1hYykKKworI2RlZmluZSBJYm1WZXRoTnVtQnVmZmVyUG9vbHMgMworI2RlZmluZSBJYm1WZXRoUG9vbDBEZnRTaXplICgxMDI0ICogMikKKyNkZWZpbmUgSWJtVmV0aFBvb2wxRGZ0U2l6ZSAoMTAyNCAqIDQpCisjZGVmaW5lIElibVZldGhQb29sMkRmdFNpemUgKDEwMjQgKiAxMCkKKyNkZWZpbmUgSWJtVmV0aFBvb2wwRGZ0Q250ICAyNTYKKyNkZWZpbmUgSWJtVmV0aFBvb2wxRGZ0Q250ICAyNTYKKyNkZWZpbmUgSWJtVmV0aFBvb2wyRGZ0Q250ICAyNTYKKworI2RlZmluZSBJQk1fVkVUSF9JTlZBTElEX01BUCAoKHUxNikweGZmZmYpCisKK3N0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCB7CisgICAgdTMyIHNpemU7CisgICAgdTMyIGluZGV4OworICAgIHUzMiBidWZmX3NpemU7CisgICAgdTMyIHRocmVzaG9sZDsKKyAgICBhdG9taWNfdCBhdmFpbGFibGU7CisgICAgdTMyIGNvbnN1bWVyX2luZGV4OworICAgIHUzMiBwcm9kdWNlcl9pbmRleDsKKyAgICB1MTYgKmZyZWVfbWFwOworICAgIGRtYV9hZGRyX3QgKmRtYV9hZGRyOworICAgIHN0cnVjdCBza19idWZmICoqc2tidWZmOworfTsKKworc3RydWN0IGlibXZldGhfcnhfcSB7CisgICAgdTY0ICAgICAgICBpbmRleDsKKyAgICB1NjQgICAgICAgIG51bV9zbG90czsKKyAgICB1NjQgICAgICAgIHRvZ2dsZTsKKyAgICBkbWFfYWRkcl90IHF1ZXVlX2RtYTsKKyAgICB1MzIgICAgICAgIHF1ZXVlX2xlbjsKKyAgICBzdHJ1Y3QgaWJtdmV0aF9yeF9xX2VudHJ5ICpxdWV1ZV9hZGRyOworfTsKKworc3RydWN0IGlibXZldGhfYWRhcHRlciB7CisgICAgc3RydWN0IHZpb19kZXYgKnZkZXY7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyAgICB1bnNpZ25lZCBpbnQgbWNhc3RGaWx0ZXJTaXplOworICAgIHVuc2lnbmVkIGxvbmcgbWFjX2FkZHI7CisgICAgdW5zaWduZWQgbG9uZyBsaW9ibjsKKyAgICB2b2lkICogYnVmZmVyX2xpc3RfYWRkcjsKKyAgICB2b2lkICogZmlsdGVyX2xpc3RfYWRkcjsKKyAgICBkbWFfYWRkcl90IGJ1ZmZlcl9saXN0X2RtYTsKKyAgICBkbWFfYWRkcl90IGZpbHRlcl9saXN0X2RtYTsKKyAgICBzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgcnhfYnVmZl9wb29sW0libVZldGhOdW1CdWZmZXJQb29sc107CisgICAgc3RydWN0IGlibXZldGhfcnhfcSByeF9xdWV1ZTsKKyAgICBhdG9taWNfdCBub3RfcmVwbGVuaXNoaW5nOworCisgICAgLyogaGVscGVyIHRhc2tzICovCisgICAgc3RydWN0IHdvcmtfc3RydWN0IHJlcGxlbmlzaF90YXNrOworCisgICAgLyogYWRhcHRlciBzcGVjaWZpYyBzdGF0cyAqLworICAgIHU2NCByZXBsZW5pc2hfdGFza19jeWNsZXM7CisgICAgdTY0IHJlcGxlbmlzaF9ub19tZW07CisgICAgdTY0IHJlcGxlbmlzaF9hZGRfYnVmZl9mYWlsdXJlOworICAgIHU2NCByZXBsZW5pc2hfYWRkX2J1ZmZfc3VjY2VzczsKKyAgICB1NjQgcnhfaW52YWxpZF9idWZmZXI7CisgICAgdTY0IHJ4X25vX2J1ZmZlcjsKKyAgICB1NjQgdHhfbXVsdGlkZXNjX3NlbmQ7CisgICAgdTY0IHR4X2xpbmVhcml6ZWQ7CisgICAgdTY0IHR4X2xpbmVhcml6ZV9mYWlsZWQ7CisgICAgdTY0IHR4X21hcF9mYWlsZWQ7CisgICAgdTY0IHR4X3NlbmRfZmFpbGVkOworfTsKKworc3RydWN0IGlibXZldGhfYnVmX2Rlc2NfZmllbGRzIHsJCisgICAgdTMyIHZhbGlkIDogMTsKKyAgICB1MzIgdG9nZ2xlIDogMTsKKyAgICB1MzIgcmVzZXJ2ZWQgOiA2OworICAgIHUzMiBsZW5ndGggOiAyNDsKKyAgICB1MzIgYWRkcmVzczsKK307CisKK3VuaW9uIGlibXZldGhfYnVmX2Rlc2MgeworICAgIHU2NCBkZXNjOwkKKyAgICBzdHJ1Y3QgaWJtdmV0aF9idWZfZGVzY19maWVsZHMgZmllbGRzOworfTsKKworc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSB7CisgICAgdTE2IHRvZ2dsZSA6IDE7CisgICAgdTE2IHZhbGlkIDogMTsKKyAgICB1MTYgcmVzZXJ2ZWQgOiAxNDsKKyAgICB1MTYgb2Zmc2V0OworICAgIHUzMiBsZW5ndGg7CisgICAgdTY0IGNvcnJlbGF0b3I7Cit9OworCisjZW5kaWYgLyogX0lCTVZFVEhfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaW9jMy1ldGguYyBiL2RyaXZlcnMvbmV0L2lvYzMtZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyMGI1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lvYzMtZXRoLmMKQEAgLTAsMCArMSwxNjUzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogRHJpdmVyIGZvciBTR0kncyBJT0MzIGJhc2VkIEV0aGVybmV0IGNhcmRzIGFzIGZvdW5kIGluIHRoZSBQQ0kgY2FyZC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMgUmFsZiBCYWVjaGxlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTksIDIwMDAsIDIwMDEgYnkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFJlZmVyZW5jZXM6CisgKiAgbyBJT0MzIEFTSUMgc3BlY2lmaWNhdGlvbiA0LjUxLCAxOTk2LTA0LTE4CisgKiAgbyBJRUVFIDgwMi4zIHNwZWNpZmljYXRpb24sIDIwMDAgZWRpdGlvbgorICogIG8gRFAzODg0MEEgU3BlY2lmaWNhdGlvbiwgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciwgTWFyY2ggMTk5NworICoKKyAqIFRvIGRvOgorICoKKyAqICBvIEhhbmRsZSBhbGxvY2F0aW9uIGZhaWx1cmVzIGluIGlvYzNfYWxsb2Nfc2tiKCkgbW9yZSBncmFjZWZ1bGx5LgorICogIG8gSGFuZGxlIGFsbG9jYXRpb24gZmFpbHVyZXMgaW4gaW9jM19pbml0X3JpbmdzKCkuCisgKiAgbyBVc2UgcHJlZmV0Y2hpbmcgZm9yIGxhcmdlIHBhY2tldHMuICBXaGF0IGlzIGEgZ29vZCBsb3dlciBsaW1pdCBmb3IKKyAqICAgIHByZWZldGNoaW5nPworICogIG8gV2UncmUgcHJvYmFibHkgYWxsb2NhdGluZyBhIGJpdCB0b28gbXVjaCBtZW1vcnkuCisgKiAgbyBVc2UgaGFyZHdhcmUgY2hlY2tzdW1zLgorICogIG8gQ29udmVydCB0byB1c2luZyBhIElPQzMgbWV0YSBkcml2ZXIuCisgKiAgbyBXaGljaCBQSFlzIG1pZ2h0IHBvc3NpYmx5IGJlIGF0dGFjaGVkIHRvIHRoZSBJT0MzIGluIHJlYWwgbGl2ZSwKKyAqICAgIHdoaWNoIHdvcmthcm91bmRzIGFyZSByZXF1aXJlZCBmb3IgdGhlbT8gIERvIHdlIGV2ZXIgaGF2ZSBMdWNlbnQncz8KKyAqICBvIEZvciB0aGUgMi41IGJyYW5jaCBraWxsIHRoZSBtaWktdG9vbCBpb2N0bHMuCisgKi8KKworI2RlZmluZSBJT0MzX05BTUUJImlvYzMtZXRoIgorI2RlZmluZSBJT0MzX1ZFUlNJT04JIjIuNi4zLTMiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vc2VyaWFsLmg+CisjZGVmaW5lIElPQzNfQkFVRCAoMjIwMDAwMDAgLyAoMyoxNikpCisjZGVmaW5lIElPQzNfQ09NX0ZMQUdTIChBU1lOQ19CT09UX0FVVE9DT05GIHwgQVNZTkNfU0tJUF9URVNUKQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3NuL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3NuL3NuMC9hZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbjAvaHVibmkuaD4KKyNpbmNsdWRlIDxhc20vc24vc24wL2h1YmlvLmg+CisjaW5jbHVkZSA8YXNtL3NuL2tsY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3NuL2lvYzMuaD4KKyNpbmNsdWRlIDxhc20vc24vc24wL2lwMjcuaD4KKyNpbmNsdWRlIDxhc20vcGNpL2JyaWRnZS5oPgorCisvKgorICogNjQgUlggYnVmZmVycy4gIFRoaXMgaXMgdHVuYWJsZSBpbiB0aGUgcmFuZ2Ugb2YgMTYgPD0geCA8IDUxMi4gIFRoZQorICogdmFsdWUgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4KKyAqLworI2RlZmluZSBSWF9CVUZGUyA2NAorCisjZGVmaW5lIEVUQ1NSX0ZECSgoMTc8PEVUQ1NSX0lQR1IyX1NISUZUKSB8ICgxMTw8RVRDU1JfSVBHUjFfU0hJRlQpIHwgMjEpCisjZGVmaW5lIEVUQ1NSX0hECSgoMjE8PEVUQ1NSX0lQR1IyX1NISUZUKSB8ICgyMTw8RVRDU1JfSVBHUjFfU0hJRlQpIHwgMjEpCisKKy8qIFByaXZhdGUgcGVyIE5JQyBkYXRhIG9mIHRoZSBkcml2ZXIuICAqLworc3RydWN0IGlvYzNfcHJpdmF0ZSB7CisJc3RydWN0IGlvYzMgKnJlZ3M7CisJdW5zaWduZWQgbG9uZyAqcnhyOwkJLyogcG9pbnRlciB0byByZWNlaXZlciByaW5nICovCisJc3RydWN0IGlvYzNfZXR4ZCAqdHhyOworCXN0cnVjdCBza19idWZmICpyeF9za2JzWzUxMl07CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnNbMTI4XTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlpbnQgcnhfY2k7CQkJLyogUlggY29uc3VtZXIgaW5kZXggKi8KKwlpbnQgcnhfcGk7CQkJLyogUlggcHJvZHVjZXIgaW5kZXggKi8KKwlpbnQgdHhfY2k7CQkJLyogVFggY29uc3VtZXIgaW5kZXggKi8KKwlpbnQgdHhfcGk7CQkJLyogVFggcHJvZHVjZXIgaW5kZXggKi8KKwlpbnQgdHhxbGVuOworCXUzMiBlbWNyLCBlaGFyX2gsIGVoYXJfbDsKKwlzcGlubG9ja190IGlvYzNfbG9jazsKKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJLyogTWVtYmVycyB1c2VkIGJ5IGF1dG9uZWdvdGlhdGlvbiAgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBpb2MzX3RpbWVyOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqcHJpdl9uZXRkZXYoc3RydWN0IGlvYzNfcHJpdmF0ZSAqZGV2KQoreworCXJldHVybiAodm9pZCAqKWRldiAtICgoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlKSArIDMxKSAmIH4zMSk7Cit9CisKK3N0YXRpYyBpbnQgaW9jM19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyB2b2lkIGlvYzNfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpb2MzX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpb2MzX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpb2MzX2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcik7CitzdGF0aWMgaW5saW5lIHZvaWQgaW9jM19zdG9wKHN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwKTsKK3N0YXRpYyB2b2lkIGlvYzNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGNvbnN0IGNoYXIgaW9jM19zdHJbXSA9ICJJT0MzIEV0aGVybmV0IjsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgaW9jM19ldGh0b29sX29wczsKKworLyogV2UgdXNlIHRoaXMgdG8gYWNxdWlyZSByZWNlaXZlIHNrYidzIHRoYXQgd2UgY2FuIERNQSBkaXJlY3RseSBpbnRvLiAqLworCisjZGVmaW5lIElPQzNfQ0FDSEVMSU5FCTEyOFVMCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhbGlnbmVkX3J4X3NrYl9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gKH5hZGRyICsgMSkgJiAoSU9DM19DQUNIRUxJTkUgLSAxVUwpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICogaW9jM19hbGxvY19za2IodW5zaWduZWQgbG9uZyBsZW5ndGgsCisJdW5zaWduZWQgaW50IGdmcF9tYXNrKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBhbGxvY19za2IobGVuZ3RoICsgSU9DM19DQUNIRUxJTkUgLSAxLCBnZnBfbWFzayk7CisJaWYgKGxpa2VseShza2IpKSB7CisJCWludCBvZmZzZXQgPSBhbGlnbmVkX3J4X3NrYl9hZGRyKCh1bnNpZ25lZCBsb25nKSBza2ItPmRhdGEpOworCQlpZiAob2Zmc2V0KQorCQkJc2tiX3Jlc2VydmUoc2tiLCBvZmZzZXQpOworCX0KKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpb2MzX21hcCh2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgdmRldikKK3sKKyNpZmRlZiBDT05GSUdfU0dJX0lQMjcKKwl2ZGV2IDw8PSA1ODsgICAvKiBTaGlmdCB0byBQQ0k2NF9BVFRSX1ZJUlRVQUwgKi8KKworCXJldHVybiB2ZGV2IHwgKDB4YVVMIDw8IFBDSTY0X0FUVFJfVEFSR19TSEZUKSB8IFBDSTY0X0FUVFJfUFJFRiB8CisJICAgICAgICgodW5zaWduZWQgbG9uZylwdHIgJiBUT19QSFlTX01BU0spOworI2Vsc2UKKwlyZXR1cm4gdmlydF90b19idXMocHRyKTsKKyNlbmRpZgorfQorCisvKiBCRVdBUkU6IFRoZSBJT0MzIGRvY3VtZW50YXRpb24gZG9jdW1lbnRzIHRoZSBzaXplIG9mIHJ4IGJ1ZmZlcnMgYXMKKyAgIDE2NDQgd2hpbGUgaXQncyBhY3R1YWxseSAxNjY0LiAgVGhpcyBvbmUgd2FzIG5hc3R5IHRvIHRyYWNrIGRvd24gLi4uICAqLworI2RlZmluZSBSWF9PRkZTRVQJCTEwCisjZGVmaW5lIFJYX0JVRl9BTExPQ19TSVpFCSgxNjY0ICsgUlhfT0ZGU0VUICsgSU9DM19DQUNIRUxJTkUpCisKKy8qIERNQSBiYXJyaWVyIHRvIHNlcGFyYXRlIGNhY2hlZCBhbmQgdW5jYWNoZWQgYWNjZXNzZXMuICAqLworI2RlZmluZSBCQVJSSUVSKCkJCQkJCQkJXAorCV9fYXNtX18oInN5bmMiIDo6OiAibWVtb3J5IikKKworCisjZGVmaW5lIElPQzNfU0laRSAweDEwMDAwMAorCisvKgorICogSU9DMyBpcyBhIGJpZyBlbmRpYW4gZGV2aWNlCisgKgorICogVW5vcnRob2RveCBidXQgbWFrZXMgdGhlIHVzZXJzIG9mIHRoZXNlIG1hY3JvcyBtb3JlIHJlYWRhYmxlIC0gdGhlIHBvaW50ZXIKKyAqIHRvIHRoZSBJT0MzJ3MgbWVtb3J5IG1hcHBlZCByZWdpc3RlcnMgaXMgZXhwZWN0ZWQgYXMgc3RydWN0IGlvYzMgKiBpb2MzCisgKiBpbiB0aGUgZW52aXJvbm1lbnQuCisgKi8KKyNkZWZpbmUgaW9jM19yX21jcigpCQliZTMyX3RvX2NwdShpb2MzLT5tY3IpCisjZGVmaW5lIGlvYzNfd19tY3IodikJCWRvIHsgaW9jMy0+bWNyID0gY3B1X3RvX2JlMzIodik7IH0gd2hpbGUgKDApCisjZGVmaW5lIGlvYzNfd19ncGNyX3ModikJZG8geyBpb2MzLT5ncGNyX3MgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VtY3IoKQkJYmUzMl90b19jcHUoaW9jMy0+ZW1jcikKKyNkZWZpbmUgaW9jM193X2VtY3IodikJCWRvIHsgaW9jMy0+ZW1jciA9IGNwdV90b19iZTMyKHYpOyB9IHdoaWxlICgwKQorI2RlZmluZSBpb2MzX3JfZWlzcigpCQliZTMyX3RvX2NwdShpb2MzLT5laXNyKQorI2RlZmluZSBpb2MzX3dfZWlzcih2KQkJZG8geyBpb2MzLT5laXNyID0gY3B1X3RvX2JlMzIodik7IH0gd2hpbGUgKDApCisjZGVmaW5lIGlvYzNfcl9laWVyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmVpZXIpCisjZGVmaW5lIGlvYzNfd19laWVyKHYpCQlkbyB7IGlvYzMtPmVpZXIgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VyY3NyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmVyY3NyKQorI2RlZmluZSBpb2MzX3dfZXJjc3IodikJCWRvIHsgaW9jMy0+ZXJjc3IgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VyYnJfaCgpCQliZTMyX3RvX2NwdShpb2MzLT5lcmJyX2gpCisjZGVmaW5lIGlvYzNfd19lcmJyX2godikJZG8geyBpb2MzLT5lcmJyX2ggPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VyYnJfbCgpCQliZTMyX3RvX2NwdShpb2MzLT5lcmJyX2wpCisjZGVmaW5lIGlvYzNfd19lcmJyX2wodikJZG8geyBpb2MzLT5lcmJyX2wgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VyYmFyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmVyYmFyKQorI2RlZmluZSBpb2MzX3dfZXJiYXIodikJCWRvIHsgaW9jMy0+ZXJiYXIgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VyY2lyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmVyY2lyKQorI2RlZmluZSBpb2MzX3dfZXJjaXIodikJCWRvIHsgaW9jMy0+ZXJjaXIgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VycGlyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmVycGlyKQorI2RlZmluZSBpb2MzX3dfZXJwaXIodikJCWRvIHsgaW9jMy0+ZXJwaXIgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VydHIoKQkJYmUzMl90b19jcHUoaW9jMy0+ZXJ0cikKKyNkZWZpbmUgaW9jM193X2VydHIodikJCWRvIHsgaW9jMy0+ZXJ0ciA9IGNwdV90b19iZTMyKHYpOyB9IHdoaWxlICgwKQorI2RlZmluZSBpb2MzX3JfZXRjc3IoKQkJYmUzMl90b19jcHUoaW9jMy0+ZXRjc3IpCisjZGVmaW5lIGlvYzNfd19ldGNzcih2KQkJZG8geyBpb2MzLT5ldGNzciA9IGNwdV90b19iZTMyKHYpOyB9IHdoaWxlICgwKQorI2RlZmluZSBpb2MzX3JfZXJzcigpCQliZTMyX3RvX2NwdShpb2MzLT5lcnNyKQorI2RlZmluZSBpb2MzX3dfZXJzcih2KQkJZG8geyBpb2MzLT5lcnNyID0gY3B1X3RvX2JlMzIodik7IH0gd2hpbGUgKDApCisjZGVmaW5lIGlvYzNfcl9ldGNkYygpCQliZTMyX3RvX2NwdShpb2MzLT5ldGNkYykKKyNkZWZpbmUgaW9jM193X2V0Y2RjKHYpCQlkbyB7IGlvYzMtPmV0Y2RjID0gY3B1X3RvX2JlMzIodik7IH0gd2hpbGUgKDApCisjZGVmaW5lIGlvYzNfcl9lYmlyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmViaXIpCisjZGVmaW5lIGlvYzNfd19lYmlyKHYpCQlkbyB7IGlvYzMtPmViaXIgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2V0YnJfaCgpCQliZTMyX3RvX2NwdShpb2MzLT5ldGJyX2gpCisjZGVmaW5lIGlvYzNfd19ldGJyX2godikJZG8geyBpb2MzLT5ldGJyX2ggPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2V0YnJfbCgpCQliZTMyX3RvX2NwdShpb2MzLT5ldGJyX2wpCisjZGVmaW5lIGlvYzNfd19ldGJyX2wodikJZG8geyBpb2MzLT5ldGJyX2wgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2V0Y2lyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmV0Y2lyKQorI2RlZmluZSBpb2MzX3dfZXRjaXIodikJCWRvIHsgaW9jMy0+ZXRjaXIgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2V0cGlyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmV0cGlyKQorI2RlZmluZSBpb2MzX3dfZXRwaXIodikJCWRvIHsgaW9jMy0+ZXRwaXIgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VtYXJfaCgpCQliZTMyX3RvX2NwdShpb2MzLT5lbWFyX2gpCisjZGVmaW5lIGlvYzNfd19lbWFyX2godikJZG8geyBpb2MzLT5lbWFyX2ggPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VtYXJfbCgpCQliZTMyX3RvX2NwdShpb2MzLT5lbWFyX2wpCisjZGVmaW5lIGlvYzNfd19lbWFyX2wodikJZG8geyBpb2MzLT5lbWFyX2wgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VoYXJfaCgpCQliZTMyX3RvX2NwdShpb2MzLT5laGFyX2gpCisjZGVmaW5lIGlvYzNfd19laGFyX2godikJZG8geyBpb2MzLT5laGFyX2ggPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VoYXJfbCgpCQliZTMyX3RvX2NwdShpb2MzLT5laGFyX2wpCisjZGVmaW5lIGlvYzNfd19laGFyX2wodikJZG8geyBpb2MzLT5laGFyX2wgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX21pY3IoKQkJYmUzMl90b19jcHUoaW9jMy0+bWljcikKKyNkZWZpbmUgaW9jM193X21pY3IodikJCWRvIHsgaW9jMy0+bWljciA9IGNwdV90b19iZTMyKHYpOyB9IHdoaWxlICgwKQorI2RlZmluZSBpb2MzX3JfbWlkcl9yKCkJCWJlMzJfdG9fY3B1KGlvYzMtPm1pZHJfcikKKyNkZWZpbmUgaW9jM193X21pZHJfcih2KQlkbyB7IGlvYzMtPm1pZHJfciA9IGNwdV90b19iZTMyKHYpOyB9IHdoaWxlICgwKQorI2RlZmluZSBpb2MzX3JfbWlkcl93KCkJCWJlMzJfdG9fY3B1KGlvYzMtPm1pZHJfdykKKyNkZWZpbmUgaW9jM193X21pZHJfdyh2KQlkbyB7IGlvYzMtPm1pZHJfdyA9IGNwdV90b19iZTMyKHYpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHUzMiBtY3JfcGFjayh1MzIgcHVsc2UsIHUzMiBzYW1wbGUpCit7CisJcmV0dXJuIChwdWxzZSA8PCAxMCkgfCAoc2FtcGxlIDw8IDIpOworfQorCitzdGF0aWMgaW50IG5pY193YWl0KHN0cnVjdCBpb2MzICppb2MzKQoreworCXUzMiBtY3I7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG1jciA9IGlvYzNfcl9tY3IoKTsKKyAgICAgICAgfSB3aGlsZSAoIShtY3IgJiAyKSk7CisKKyAgICAgICAgcmV0dXJuIG1jciAmIDE7Cit9CisKK3N0YXRpYyBpbnQgbmljX3Jlc2V0KHN0cnVjdCBpb2MzICppb2MzKQoreworICAgICAgICBpbnQgcHJlc2VuY2U7CisKKwlpb2MzX3dfbWNyKG1jcl9wYWNrKDUwMCwgNjUpKTsKKwlwcmVzZW5jZSA9IG5pY193YWl0KGlvYzMpOworCisJaW9jM193X21jcihtY3JfcGFjaygwLCA1MDApKTsKKwluaWNfd2FpdChpb2MzKTsKKworICAgICAgICByZXR1cm4gcHJlc2VuY2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5pY19yZWFkX2JpdChzdHJ1Y3QgaW9jMyAqaW9jMykKK3sKKwlpbnQgcmVzdWx0OworCisJaW9jM193X21jcihtY3JfcGFjayg2LCAxMykpOworCXJlc3VsdCA9IG5pY193YWl0KGlvYzMpOworCWlvYzNfd19tY3IobWNyX3BhY2soMCwgMTAwKSk7CisJbmljX3dhaXQoaW9jMyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmljX3dyaXRlX2JpdChzdHJ1Y3QgaW9jMyAqaW9jMywgaW50IGJpdCkKK3sKKwlpZiAoYml0KQorCQlpb2MzX3dfbWNyKG1jcl9wYWNrKDYsIDExMCkpOworCWVsc2UKKwkJaW9jM193X21jcihtY3JfcGFjayg4MCwgMzApKTsKKworCW5pY193YWl0KGlvYzMpOworfQorCisvKgorICogUmVhZCBhIGJ5dGUgZnJvbSBhbiBpQnV0dG9uIGRldmljZQorICovCitzdGF0aWMgdTMyIG5pY19yZWFkX2J5dGUoc3RydWN0IGlvYzMgKmlvYzMpCit7CisJdTMyIHJlc3VsdCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlyZXN1bHQgPSAocmVzdWx0ID4+IDEpIHwgKG5pY19yZWFkX2JpdChpb2MzKSA8PCA3KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBXcml0ZSBhIGJ5dGUgdG8gYW4gaUJ1dHRvbiBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgbmljX3dyaXRlX2J5dGUoc3RydWN0IGlvYzMgKmlvYzMsIGludCBieXRlKQoreworCWludCBpLCBiaXQ7CisKKwlmb3IgKGkgPSA4OyBpOyBpLS0pIHsKKwkJYml0ID0gYnl0ZSAmIDE7CisJCWJ5dGUgPj49IDE7CisKKwkJbmljX3dyaXRlX2JpdChpb2MzLCBiaXQpOworCX0KK30KKworc3RhdGljIHU2NCBuaWNfZmluZChzdHJ1Y3QgaW9jMyAqaW9jMywgaW50ICpsYXN0KQoreworCWludCBhLCBiLCBpbmRleCwgZGlzYzsKKwl1NjQgYWRkcmVzcyA9IDA7CisKKwluaWNfcmVzZXQoaW9jMyk7CisJLyogU2VhcmNoIFJPTS4gICovCisJbmljX3dyaXRlX2J5dGUoaW9jMywgMHhmMCk7CisKKwkvKiBBbGdvcml0aG0gZnJvbSBgYEJvb2sgb2YgaUJ1dHRvbiBTdGFuZGFyZHMnJy4gICovCisJZm9yIChpbmRleCA9IDAsIGRpc2MgPSAwOyBpbmRleCA8IDY0OyBpbmRleCsrKSB7CisJCWEgPSBuaWNfcmVhZF9iaXQoaW9jMyk7CisJCWIgPSBuaWNfcmVhZF9iaXQoaW9jMyk7CisKKwkJaWYgKGEgJiYgYikgeworCQkJcHJpbnRrKCJOSUMgc2VhcmNoIGZhaWxlZCAobm90IGZhdGFsKS5cbiIpOworCQkJKmxhc3QgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIWEgJiYgIWIpIHsKKwkJCWlmIChpbmRleCA9PSAqbGFzdCkgeworCQkJCWFkZHJlc3MgfD0gMVVMIDw8IGluZGV4OworCQkJfSBlbHNlIGlmIChpbmRleCA+ICpsYXN0KSB7CisJCQkJYWRkcmVzcyAmPSB+KDFVTCA8PCBpbmRleCk7CisJCQkJZGlzYyA9IGluZGV4OworCQkJfSBlbHNlIGlmICgoYWRkcmVzcyAmICgxVUwgPDwgaW5kZXgpKSA9PSAwKQorCQkJCWRpc2MgPSBpbmRleDsKKwkJCW5pY193cml0ZV9iaXQoaW9jMywgYWRkcmVzcyAmICgxVUwgPDwgaW5kZXgpKTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJaWYgKGEpCisJCQkJYWRkcmVzcyB8PSAxVUwgPDwgaW5kZXg7CisJCQllbHNlCisJCQkJYWRkcmVzcyAmPSB+KDFVTCA8PCBpbmRleCk7CisJCQluaWNfd3JpdGVfYml0KGlvYzMsIGEpOworCQkJY29udGludWU7CisJCX0KKwl9CisKKwkqbGFzdCA9IGRpc2M7CisKKwlyZXR1cm4gYWRkcmVzczsKK30KKworc3RhdGljIGludCBuaWNfaW5pdChzdHJ1Y3QgaW9jMyAqaW9jMykKK3sKKwljb25zdCBjaGFyICp0eXBlOworCXU4IGNyYzsKKwl1OCBzZXJpYWxbNl07CisJaW50IHNhdmUgPSAwLCBpOworCisJdHlwZSA9ICJ1bmtub3duIjsKKworCXdoaWxlICgxKSB7CisJCXU2NCByZWc7CisJCXJlZyA9IG5pY19maW5kKGlvYzMsICZzYXZlKTsKKworCQlzd2l0Y2ggKHJlZyAmIDB4ZmYpIHsKKwkJY2FzZSAweDkxOgorCQkJdHlwZSA9ICJEUzE5ODFVIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKHNhdmUgPT0gMCkgeworCQkJCS8qIExldCB0aGUgY2FsbGVyIHRyeSBhZ2Fpbi4gICovCisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQluaWNfcmVzZXQoaW9jMyk7CisKKwkJLyogTWF0Y2ggUk9NLiAgKi8KKwkJbmljX3dyaXRlX2J5dGUoaW9jMywgMHg1NSk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQluaWNfd3JpdGVfYnl0ZShpb2MzLCAocmVnID4+IChpIDw8IDMpKSAmIDB4ZmYpOworCisJCXJlZyA+Pj0gODsgLyogU2hpZnQgb3V0IHR5cGUuICAqLworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQlzZXJpYWxbaV0gPSByZWcgJiAweGZmOworCQkJcmVnID4+PSA4OworCQl9CisJCWNyYyA9IHJlZyAmIDB4ZmY7CisJCWJyZWFrOworCX0KKworCXByaW50aygiRm91bmQgJXMgTklDIiwgdHlwZSk7CisJaWYgKHR5cGUgIT0gInVua25vd24iKSB7CisJCXByaW50ayAoIiByZWdpc3RyYXRpb24gbnVtYmVyICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LCIKKwkJCSIgQ1JDICUwMngiLCBzZXJpYWxbMF0sIHNlcmlhbFsxXSwgc2VyaWFsWzJdLAorCQkJc2VyaWFsWzNdLCBzZXJpYWxbNF0sIHNlcmlhbFs1XSwgY3JjKTsKKwl9CisJcHJpbnRrKCIuXG4iKTsKKworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCB0aGUgTklDIChOdW1iZXItSW4tYS1DYW4pIGRldmljZSB1c2VkIHRvIHN0b3JlIHRoZSBNQUMgYWRkcmVzcyBvbgorICogU04wIC8gU04wMCBub2RlYm9hcmRzIGFuZCBQQ0kgY2FyZHMuCisgKi8KK3N0YXRpYyB2b2lkIGlvYzNfZ2V0X2VhZGRyX25pYyhzdHJ1Y3QgaW9jM19wcml2YXRlICppcCkKK3sKKwlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOworCXU4IG5pY1sxNF07CisJaW50IHRyaWVzID0gMjsgLyogVGhlcmUgbWF5IGJlIHNvbWUgcHJvYmxlbSB3aXRoIHRoZSBiYXR0ZXJ5PyAgKi8KKwlpbnQgaTsKKworCWlvYzNfd19ncGNyX3MoMSA8PCAyMSk7CisKKwl3aGlsZSAodHJpZXMtLSkgeworCQlpZiAoIW5pY19pbml0KGlvYzMpKQorCQkJYnJlYWs7CisJCXVkZWxheSg1MDApOworCX0KKworCWlmICh0cmllcyA8IDApIHsKKwkJcHJpbnRrKCJGYWlsZWQgdG8gcmVhZCBNQUMgYWRkcmVzc1xuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZWFkIE1lbW9yeS4gICovCisJbmljX3dyaXRlX2J5dGUoaW9jMywgMHhmMCk7CisJbmljX3dyaXRlX2J5dGUoaW9jMywgMHgwMCk7CisJbmljX3dyaXRlX2J5dGUoaW9jMywgMHgwMCk7CisKKwlmb3IgKGkgPSAxMzsgaSA+PSAwOyBpLS0pCisJCW5pY1tpXSA9IG5pY19yZWFkX2J5dGUoaW9jMyk7CisKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQlwcml2X25ldGRldihpcCktPmRldl9hZGRyW2kgLSAyXSA9IG5pY1tpXTsKK30KKworLyoKKyAqIE9rLCB0aGlzIGlzIGhvc2VkIGJ5IGRlc2lnbi4gIEl0J3MgbmVjZXNzYXJ5IHRvIGtub3cgd2hhdCBtYWNoaW5lIHRoZQorICogTklDIGlzIGluIGluIG9yZGVyIHRvIGtub3cgaG93IHRvIHJlYWQgdGhlIE5JQyBhZGRyZXNzLiAgV2UgYWxzbyBoYXZlCisgKiB0byBrbm93IGlmIGl0J3MgYSBQQ0kgY2FyZCBvciBhIE5JQyBpbiBvbiB0aGUgbm9kZSBib2FyZCAuLi4KKyAqLworc3RhdGljIHZvaWQgaW9jM19nZXRfZWFkZHIoc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXApCit7CisJaW50IGk7CisKKworCWlvYzNfZ2V0X2VhZGRyX25pYyhpcCk7CisKKwlwcmludGsoIkV0aGVybmV0IGFkZHJlc3MgaXMgIik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlwcmludGsoIiUwMngiLCBwcml2X25ldGRldihpcCktPmRldl9hZGRyW2ldKTsKKwkJaWYgKGkgPCA1KQorCQkJcHJpbnRrKCI6Iik7CisJfQorCXByaW50aygiLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW9jM19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGlvYzMgKmlvYzMgPSBpcC0+cmVnczsKKworCWlvYzNfd19lbWFyX2goKGRldi0+ZGV2X2FkZHJbNV0gPDwgIDgpIHwgZGV2LT5kZXZfYWRkcls0XSk7CisJaW9jM193X2VtYXJfbCgoZGV2LT5kZXZfYWRkclszXSA8PCAyNCkgfCAoZGV2LT5kZXZfYWRkclsyXSA8PCAxNikgfAorCSAgICAgICAgICAgICAgKGRldi0+ZGV2X2FkZHJbMV0gPDwgIDgpIHwgZGV2LT5kZXZfYWRkclswXSk7Cit9CisKK3N0YXRpYyBpbnQgaW9jM19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IGFkZHI7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2EtPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCisJc3Bpbl9sb2NrX2lycSgmaXAtPmlvYzNfbG9jayk7CisJX19pb2MzX3NldF9tYWNfYWRkcmVzcyhkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmaXAtPmlvYzNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlciBtdXN0IGhvbGQgdGhlIGlvYzNfbG9jayBldmVyIGZvciBNSUkgcmVhZGVycy4gIFRoaXMgaXMgYWxzbworICogdXNlZCB0byBwcm90ZWN0IHRoZSB0cmFuc21pdHRlciBzaWRlIGJ1dCBpdCdzIGxvdyBjb250ZW50aW9uLgorICovCitzdGF0aWMgaW50IGlvYzNfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHksIGludCByZWcpCit7CisJc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpb2MzICppb2MzID0gaXAtPnJlZ3M7CisKKwl3aGlsZSAoaW9jM19yX21pY3IoKSAmIE1JQ1JfQlVTWSk7CisJaW9jM193X21pY3IoKHBoeSA8PCBNSUNSX1BIWUFERFJfU0hJRlQpIHwgcmVnIHwgTUlDUl9SRUFEVFJJRyk7CisJd2hpbGUgKGlvYzNfcl9taWNyKCkgJiBNSUNSX0JVU1kpOworCisJcmV0dXJuIGlvYzNfcl9taWNyKCkgJiBNSURSX0RBVEFfTUFTSzsKK30KKworc3RhdGljIHZvaWQgaW9jM19tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHksIGludCByZWcsIGludCBkYXRhKQoreworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOworCisJd2hpbGUgKGlvYzNfcl9taWNyKCkgJiBNSUNSX0JVU1kpOworCWlvYzNfd19taWRyX3coZGF0YSk7CisJaW9jM193X21pY3IoKHBoeSA8PCBNSUNSX1BIWUFERFJfU0hJRlQpIHwgcmVnKTsKKwl3aGlsZSAoaW9jM19yX21pY3IoKSAmIE1JQ1JfQlVTWSk7Cit9CisKK3N0YXRpYyBpbnQgaW9jM19taWlfaW5pdChzdHJ1Y3QgaW9jM19wcml2YXRlICppcCk7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaW9jM19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGlvYzMgKmlvYzMgPSBpcC0+cmVnczsKKworCWlwLT5zdGF0cy5jb2xsaXNpb25zICs9IChpb2MzX3JfZXRjZGMoKSAmIEVUQ0RDX0NPTExDTlRfTUFTSyk7CisJcmV0dXJuICZpcC0+c3RhdHM7Cit9CisKKyNpZmRlZiBDT05GSUdfU0dJX0lPQzNfRVRIX0hXX1JYX0NTVU0KKworc3RhdGljIHZvaWQgaW9jM190Y3B1ZHBfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdWludDMyX3QgaHdzdW0sIGludCBsZW4pCit7CisJc3RydWN0IGV0aGhkciAqZWggPSBldGhfaGRyKHNrYik7CisJdWludDMyX3QgY3N1bSwgZWhzdW07CisJdW5zaWduZWQgaW50IHByb3RvOworCXN0cnVjdCBpcGhkciAqaWg7CisJdWludDE2X3QgKmV3OworCXVuc2lnbmVkIGNoYXIgKmNwOworCisJLyoKKwkgKiBEaWQgaGFyZHdhcmUgaGFuZGxlIHRoZSBjaGVja3N1bSBhdCBhbGw/ICBUaGUgY2FzZXMgd2UgY2FuIGhhbmRsZQorCSAqIGFyZToKKwkgKgorCSAqIC0gVENQIGFuZCBVRFAgY2hlY2tzdW1zIG9mIElQdjQgb25seS4KKwkgKiAtIElQdjYgd291bGQgYmUgZG9hYmxlIGJ1dCB3ZSBrZWVwIHRoYXQgZm9yIGxhdGVyIC4uLgorCSAqIC0gT25seSB1bmZyYWdtZW50ZWQgcGFja2V0cy4gIERpZCBzb21lYm9keSBhbHJlYWR5IHRlbGwgeW91CisJICogICBmcmFnbWVudGF0aW9uIGlzIGV2aWw/CisJICogLSBkb24ndCBjYXJlIGFib3V0IHBhY2tldCBzaXplLiAgV29yc3QgY2FzZSB3aGVuIHByb2Nlc3NpbmcgYQorCSAqICAgbWFsZm9ybWVkIHBhY2tldCB3ZSdsbCB0cnkgdG8gYWNjZXNzIHRoZSBwYWNrZXQgYXQgaXAgaGVhZGVyICsKKwkgKiAgIDY0IGJ5dGVzIHdoaWNoIGlzIHN0aWxsIGluc2lkZSB0aGUgc2tiLiAgRXZlbiBpbiB0aGUgdW5saWtlbHkKKwkgKiAgIGNhc2Ugd2hlcmUgdGhlIGNoZWNrc3VtIGlzIHJpZ2h0IHRoZSBoaWdoZXIgbGF5ZXJzIHdpbGwgc3RpbGwKKwkgKiAgIGRyb3AgdGhlIHBhY2tldCBhcyBhcHByb3ByaWF0ZS4KKwkgKi8KKwlpZiAoZWgtPmhfcHJvdG8gIT0gbnRvaHMoRVRIX1BfSVApKQorCQlyZXR1cm47CisKKwlpaCA9IChzdHJ1Y3QgaXBoZHIgKikgKChjaGFyICopZWggKyBFVEhfSExFTik7CisJaWYgKGloLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkKKwkJcmV0dXJuOworCisJcHJvdG8gPSBpaC0+cHJvdG9jb2w7CisJaWYgKHByb3RvICE9IElQUFJPVE9fVENQICYmIHByb3RvICE9IElQUFJPVE9fVURQKQorCQlyZXR1cm47CisKKwkvKiBTYW1lIGFzIHR4IC0gY29tcHV0ZSBjc3VtIG9mIHBzZXVkbyBoZWFkZXIgICovCisJY3N1bSA9IGh3c3VtICsKKwkgICAgICAgKGloLT50b3RfbGVuIC0gKGloLT5paGwgPDwgMikpICsKKwkgICAgICAgaHRvbnMoKHVpbnQxNl90KWloLT5wcm90b2NvbCkgKworCSAgICAgICAoaWgtPnNhZGRyID4+IDE2KSArIChpaC0+c2FkZHIgJiAweGZmZmYpICsKKwkgICAgICAgKGloLT5kYWRkciA+PiAxNikgKyAoaWgtPmRhZGRyICYgMHhmZmZmKTsKKworCS8qIFN1bSB1cCBldGhlcm5ldCBkZXN0IGFkZHIsIHNyYyBhZGRyIGFuZCBwcm90b2NvbCAgKi8KKwlldyA9ICh1aW50MTZfdCAqKSBlaDsKKwllaHN1bSA9IGV3WzBdICsgZXdbMV0gKyBld1syXSArIGV3WzNdICsgZXdbNF0gKyBld1s1XSArIGV3WzZdOworCisJZWhzdW0gPSAoZWhzdW0gJiAweGZmZmYpICsgKGVoc3VtID4+IDE2KTsKKwllaHN1bSA9IChlaHN1bSAmIDB4ZmZmZikgKyAoZWhzdW0gPj4gMTYpOworCisJY3N1bSArPSAweGZmZmYgXiBlaHN1bTsKKworCS8qIEluIHRoZSBuZXh0IHN0ZXAgd2UgYWxzbyBzdWJ0cmFjdCB0aGUgMSdzIGNvbXBsZW1lbnQKKwkgICBjaGVja3N1bSBvZiB0aGUgdHJhaWxpbmcgZXRoZXJuZXQgQ1JDLiAgKi8KKwljcCA9IChjaGFyICopZWggKyBsZW47CS8qIHBvaW50cyBhdCB0cmFpbGluZyBDUkMgKi8KKwlpZiAobGVuICYgMSkgeworCQljc3VtICs9IDB4ZmZmZiBeICh1aW50MTZfdCkgKChjcFsxXSA8PCA4KSB8IGNwWzBdKTsKKwkJY3N1bSArPSAweGZmZmYgXiAodWludDE2X3QpICgoY3BbM10gPDwgOCkgfCBjcFsyXSk7CisJfSBlbHNlIHsKKwkJY3N1bSArPSAweGZmZmYgXiAodWludDE2X3QpICgoY3BbMF0gPDwgOCkgfCBjcFsxXSk7CisJCWNzdW0gKz0gMHhmZmZmIF4gKHVpbnQxNl90KSAoKGNwWzJdIDw8IDgpIHwgY3BbM10pOworCX0KKworCWNzdW0gPSAoY3N1bSAmIDB4ZmZmZikgKyAoY3N1bSA+PiAxNik7CisJY3N1bSA9IChjc3VtICYgMHhmZmZmKSArIChjc3VtID4+IDE2KTsKKworCWlmIChjc3VtID09IDB4ZmZmZikKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU0dJX0lPQzNfRVRIX0hXX1JYX0NTVU0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIGlvYzNfcngoc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5ld19za2I7CisJc3RydWN0IGlvYzMgKmlvYzMgPSBpcC0+cmVnczsKKwlpbnQgcnhfZW50cnksIG5fZW50cnksIGxlbjsKKwlzdHJ1Y3QgaW9jM19lcnhidWYgKnJ4YjsKKwl1bnNpZ25lZCBsb25nICpyeHI7CisJdTMyIHcwLCBlcnI7CisKKwlyeHIgPSAodW5zaWduZWQgbG9uZyAqKSBpcC0+cnhyOwkJLyogUmluZyBiYXNlICovCisJcnhfZW50cnkgPSBpcC0+cnhfY2k7CQkJCS8qIFJYIGNvbnN1bWUgaW5kZXggKi8KKwluX2VudHJ5ID0gaXAtPnJ4X3BpOworCisJc2tiID0gaXAtPnJ4X3NrYnNbcnhfZW50cnldOworCXJ4YiA9IChzdHJ1Y3QgaW9jM19lcnhidWYgKikgKHNrYi0+ZGF0YSAtIFJYX09GRlNFVCk7CisJdzAgPSBiZTMyX3RvX2NwdShyeGItPncwKTsKKworCXdoaWxlICh3MCAmIEVSWEJVRl9WKSB7CisJCWVyciA9IGJlMzJfdG9fY3B1KHJ4Yi0+ZXJyKTsJCS8qIEl0J3MgdmFsaWQgLi4uICAqLworCQlpZiAoZXJyICYgRVJYQlVGX0dPT0RQS1QpIHsKKwkJCWxlbiA9ICgodzAgPj4gRVJYQlVGX0JZVEVDTlRfU0hJRlQpICYgMHg3ZmYpIC0gNDsKKwkJCXNrYl90cmltKHNrYiwgbGVuKTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHByaXZfbmV0ZGV2KGlwKSk7CisKKwkJCW5ld19za2IgPSBpb2MzX2FsbG9jX3NrYihSWF9CVUZfQUxMT0NfU0laRSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIW5ld19za2IpIHsKKwkJCQkvKiBPdWNoLCBkcm9wIHBhY2tldCBhbmQganVzdCByZWN5Y2xlIHBhY2tldAorCQkJCSAgIHRvIGtlZXAgdGhlIHJpbmcgZmlsbGVkLiAgKi8KKwkJCQlpcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCW5ld19za2IgPSBza2I7CisJCQkJZ290byBuZXh0OworCQkJfQorCisjaWZkZWYgQ09ORklHX1NHSV9JT0MzX0VUSF9IV19SWF9DU1VNCisJCQlpb2MzX3RjcHVkcF9jaGVja3N1bShza2IsIHcwICYgRVJYQlVGX0lQQ0tTVU1fTUFTSyxsZW4pOworI2VuZGlmCisKKwkJCW5ldGlmX3J4KHNrYik7CisKKwkJCWlwLT5yeF9za2JzW3J4X2VudHJ5XSA9IE5VTEw7CS8qIFBvaXNvbiAgKi8KKworCQkJbmV3X3NrYi0+ZGV2ID0gcHJpdl9uZXRkZXYoaXApOworCisJCQkvKiBCZWNhdXNlIHdlIHJlc2VydmUgYWZ0ZXJ3YXJkcy4gKi8KKwkJCXNrYl9wdXQobmV3X3NrYiwgKDE2NjQgKyBSWF9PRkZTRVQpKTsKKwkJCXJ4YiA9IChzdHJ1Y3QgaW9jM19lcnhidWYgKikgbmV3X3NrYi0+ZGF0YTsKKwkJCXNrYl9yZXNlcnZlKG5ld19za2IsIFJYX09GRlNFVCk7CisKKwkJCXByaXZfbmV0ZGV2KGlwKS0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlpcC0+c3RhdHMucnhfcGFja2V0cysrOwkJLyogU3RhdGlzdGljcyAqLworCQkJaXAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJfSBlbHNlIHsKKyAJCQkvKiBUaGUgZnJhbWUgaXMgaW52YWxpZCBhbmQgdGhlIHNrYiBuZXZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhY2hlZCB0aGUgbmV0d29yayBsYXllciBzbyB3ZSBjYW4ganVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjeWNsZSBpdC4gICovCisgCQkJbmV3X3NrYiA9IHNrYjsKKyAJCQlpcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCX0KKwkJaWYgKGVyciAmIEVSWEJVRl9DUkNFUlIpCS8qIFN0YXRpc3RpY3MgKi8KKwkJCWlwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCWlmIChlcnIgJiBFUlhCVUZfRlJBTUVSUikKKwkJCWlwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKK25leHQ6CisJCWlwLT5yeF9za2JzW25fZW50cnldID0gbmV3X3NrYjsKKwkJcnhyW25fZW50cnldID0gY3B1X3RvX2JlNjQoaW9jM19tYXAocnhiLCAxKSk7CisJCXJ4Yi0+dzAgPSAwOwkJCQkvKiBDbGVhciB2YWxpZCBmbGFnICovCisJCW5fZW50cnkgPSAobl9lbnRyeSArIDEpICYgNTExOwkJLyogVXBkYXRlIGVycGlyICovCisKKwkJLyogTm93IGdvIG9uIHRvIHRoZSBuZXh0IHJpbmcgZW50cnkuICAqLworCQlyeF9lbnRyeSA9IChyeF9lbnRyeSArIDEpICYgNTExOworCQlza2IgPSBpcC0+cnhfc2tic1tyeF9lbnRyeV07CisJCXJ4YiA9IChzdHJ1Y3QgaW9jM19lcnhidWYgKikgKHNrYi0+ZGF0YSAtIFJYX09GRlNFVCk7CisJCXcwID0gYmUzMl90b19jcHUocnhiLT53MCk7CisJfQorCWlvYzNfd19lcnBpcigobl9lbnRyeSA8PCAzKSB8IEVSUElSX0FSTSk7CisJaXAtPnJ4X3BpID0gbl9lbnRyeTsKKwlpcC0+cnhfY2kgPSByeF9lbnRyeTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvYzNfdHgoc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXApCit7CisJdW5zaWduZWQgbG9uZyBwYWNrZXRzLCBieXRlczsKKwlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOworCWludCB0eF9lbnRyeSwgb19lbnRyeTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiBldGNpcjsKKworCXNwaW5fbG9jaygmaXAtPmlvYzNfbG9jayk7CisJZXRjaXIgPSBpb2MzX3JfZXRjaXIoKTsKKworCXR4X2VudHJ5ID0gKGV0Y2lyID4+IDcpICYgMTI3OworCW9fZW50cnkgPSBpcC0+dHhfY2k7CisJcGFja2V0cyA9IDA7CisJYnl0ZXMgPSAwOworCisJd2hpbGUgKG9fZW50cnkgIT0gdHhfZW50cnkpIHsKKwkJcGFja2V0cysrOworCQlza2IgPSBpcC0+dHhfc2tic1tvX2VudHJ5XTsKKwkJYnl0ZXMgKz0gc2tiLT5sZW47CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCWlwLT50eF9za2JzW29fZW50cnldID0gTlVMTDsKKworCQlvX2VudHJ5ID0gKG9fZW50cnkgKyAxKSAmIDEyNzsJCS8qIE5leHQgKi8KKworCQlldGNpciA9IGlvYzNfcl9ldGNpcigpOwkJCS8qIE1vcmUgcGt0cyBzZW50PyAgKi8KKwkJdHhfZW50cnkgPSAoZXRjaXIgPj4gNykgJiAxMjc7CisJfQorCisJaXAtPnN0YXRzLnR4X3BhY2tldHMgKz0gcGFja2V0czsKKwlpcC0+c3RhdHMudHhfYnl0ZXMgKz0gYnl0ZXM7CisJaXAtPnR4cWxlbiAtPSBwYWNrZXRzOworCisJaWYgKGlwLT50eHFsZW4gPCAxMjgpCisJCW5ldGlmX3dha2VfcXVldWUocHJpdl9uZXRkZXYoaXApKTsKKworCWlwLT50eF9jaSA9IG9fZW50cnk7CisJc3Bpbl91bmxvY2soJmlwLT5pb2MzX2xvY2spOworfQorCisvKgorICogRGVhbCB3aXRoIGZhdGFsIElPQzMgZXJyb3JzLiAgVGhpcyBjb25kaXRpb24gbWlnaHQgYmUgY2F1c2VkIGJ5IGEgaGFyZCBvcgorICogc29mdHdhcmUgcHJvYmxlbXMsIHNvIHdlIHNob3VsZCB0cnkgdG8gcmVjb3ZlcgorICogbW9yZSBncmFjZWZ1bGx5IGlmIHRoaXMgZXZlciBoYXBwZW5zLiAgSW4gdGhlb3J5IHdlIG1pZ2h0IGJlIGZsb29kZWQKKyAqIHdpdGggc3VjaCBlcnJvciBpbnRlcnJ1cHRzIGlmIHNvbWV0aGluZyByZWFsbHkgZ29lcyB3cm9uZywgc28gd2UgbWlnaHQKKyAqIGFsc28gY29uc2lkZXIgdG8gdGFrZSB0aGUgaW50ZXJmYWNlIGRvd24uCisgKi8KK3N0YXRpYyB2b2lkIGlvYzNfZXJyb3Ioc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAsIHUzMiBlaXNyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2X25ldGRldihpcCk7CisJdW5zaWduZWQgY2hhciAqaWZhY2UgPSBkZXYtPm5hbWU7CisKKwlzcGluX2xvY2soJmlwLT5pb2MzX2xvY2spOworCisJaWYgKGVpc3IgJiBFSVNSX1JYT0ZMTykKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlggb3ZlcmZsb3cuXG4iLCBpZmFjZSk7CisJaWYgKGVpc3IgJiBFSVNSX1JYQlVGT0ZMTykKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlggYnVmZmVyIG92ZXJmbG93LlxuIiwgaWZhY2UpOworCWlmIChlaXNyICYgRUlTUl9SWE1FTUVSUikKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlggUENJIGVycm9yLlxuIiwgaWZhY2UpOworCWlmIChlaXNyICYgRUlTUl9SWFBBUkVSUikKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlggU1NSQU0gcGFyaXR5IGVycm9yLlxuIiwgaWZhY2UpOworCWlmIChlaXNyICYgRUlTUl9UWEJVRlVGTE8pCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRYIGJ1ZmZlciB1bmRlcmZsb3cuXG4iLCBpZmFjZSk7CisJaWYgKGVpc3IgJiBFSVNSX1RYTUVNRVJSKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUWCBQQ0kgZXJyb3IuXG4iLCBpZmFjZSk7CisKKwlpb2MzX3N0b3AoaXApOworCWlvYzNfaW5pdChkZXYpOworCWlvYzNfbWlpX2luaXQoaXApOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2soJmlwLT5pb2MzX2xvY2spOworfQorCisvKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhbGwgb2YgdGhlIFJ4IHRocmVhZCB3b3JrIGFuZCBjbGVhbnMgdXAKKyAgIGFmdGVyIHRoZSBUeCB0aHJlYWQuICAqLworc3RhdGljIGlycXJldHVybl90IGlvYzNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKl9kZXYsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilfZGV2OworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOworCWNvbnN0IHUzMiBlbmFibGVkID0gRUlTUl9SWFRJTUVSSU5UIHwgRUlTUl9SWE9GTE8gfCBFSVNSX1JYQlVGT0ZMTyB8CisJICAgICAgICAgICAgICAgICAgICBFSVNSX1JYTUVNRVJSIHwgRUlTUl9SWFBBUkVSUiB8IEVJU1JfVFhCVUZVRkxPIHwKKwkgICAgICAgICAgICAgICAgICAgIEVJU1JfVFhFWFBMSUNJVCB8IEVJU1JfVFhNRU1FUlI7CisJdTMyIGVpc3I7CisKKwllaXNyID0gaW9jM19yX2Vpc3IoKSAmIGVuYWJsZWQ7CisKKwlpb2MzX3dfZWlzcihlaXNyKTsKKwkodm9pZCkgaW9jM19yX2Vpc3IoKTsJCQkJLyogRmx1c2ggKi8KKworCWlmIChlaXNyICYgKEVJU1JfUlhPRkxPIHwgRUlTUl9SWEJVRk9GTE8gfCBFSVNSX1JYTUVNRVJSIHwKKwkgICAgICAgICAgICBFSVNSX1JYUEFSRVJSIHwgRUlTUl9UWEJVRlVGTE8gfCBFSVNSX1RYTUVNRVJSKSkKKwkJaW9jM19lcnJvcihpcCwgZWlzcik7CisJaWYgKGVpc3IgJiBFSVNSX1JYVElNRVJJTlQpCisJCWlvYzNfcngoaXApOworCWlmIChlaXNyICYgRUlTUl9UWEVYUExJQ0lUKQorCQlpb2MzX3R4KGlwKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvYzNfc2V0dXBfZHVwbGV4KHN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwKQoreworCXN0cnVjdCBpb2MzICppb2MzID0gaXAtPnJlZ3M7CisKKwlpZiAoaXAtPm1paS5mdWxsX2R1cGxleCkgeworCQlpb2MzX3dfZXRjc3IoRVRDU1JfRkQpOworCQlpcC0+ZW1jciB8PSBFTUNSX0RVUExFWDsKKwl9IGVsc2UgeworCQlpb2MzX3dfZXRjc3IoRVRDU1JfSEQpOworCQlpcC0+ZW1jciAmPSB+RU1DUl9EVVBMRVg7CisJfQorCWlvYzNfd19lbWNyKGlwLT5lbWNyKTsKK30KKworc3RhdGljIHZvaWQgaW9jM190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAgPSAoc3RydWN0IGlvYzNfcHJpdmF0ZSAqKSBkYXRhOworCisJLyogUHJpbnQgdGhlIGxpbmsgc3RhdHVzIGlmIGl0IGhhcyBjaGFuZ2VkICovCisJbWlpX2NoZWNrX21lZGlhKCZpcC0+bWlpLCAxLCAwKTsKKwlpb2MzX3NldHVwX2R1cGxleChpcCk7CisKKwlpcC0+aW9jM190aW1lci5leHBpcmVzID0gamlmZmllcyArICgoMTIgKiBIWikvMTApOyAvKiAxLjJzICovCisJYWRkX3RpbWVyKCZpcC0+aW9jM190aW1lcik7Cit9CisKKy8qCisgKiBUcnkgdG8gZmluZCBhIFBIWS4gIFRoZXJlIGlzIG5vIGFwcGFyZW50IHJlbGF0aW9uIGJldHdlZW4gdGhlIE1JSSBhZGRyZXNzZXMKKyAqIGluIHRoZSBTR0kgZG9jdW1lbnRhdGlvbiBhbmQgd2hhdCB3ZSBmaW5kIGluIHJlYWxpdHksIHNvIHdlIHNpbXBseSBwcm9iZQorICogZm9yIHRoZSBQSFkuICBJdCBzZWVtcyBJT0MzIFBIWXMgdXN1YWxseSBsaXZlIG9uIGFkZHJlc3MgMzEuICBPbmUgb2YgbXkKKyAqIG9uYm9hcmQgSU9DM3MgaGFzIHRoZSBzcGVjaWFsIG9kZGl0eSB0aGF0IHByb2JpbmcgZG9lc24ndCBzZWVtIHRvIGZpbmQgaXQKKyAqIHlldCB0aGUgaW50ZXJmYWNlIHNlZW1zIHRvIHdvcmsgZmluZSwgc28gaWYgcHJvYmluZyBmYWlscyB3ZSBmb3Igbm93IHdpbGwKKyAqIHNpbXBseSBkZWZhdWx0IHRvIFBIWSAzMSBpbnN0ZWFkIG9mIGJhaWxpbmcgb3V0LgorICovCitzdGF0aWMgaW50IGlvYzNfbWlpX2luaXQoc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXZfbmV0ZGV2KGlwKTsKKwlpbnQgaSwgZm91bmQgPSAwLCByZXMgPSAwOworCWludCBpb2MzX3BoeV93b3JrYXJvdW5kID0gMTsKKwl1MTYgd29yZDsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCXdvcmQgPSBpb2MzX21kaW9fcmVhZChkZXYsIGksIE1JSV9QSFlTSUQxKTsKKworCQlpZiAod29yZCAhPSAweGZmZmYgJiYgd29yZCAhPSAweDAwMDApIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOwkJCS8qIEZvdW5kIGEgUEhZCQkqLworCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQlpZiAoaW9jM19waHlfd29ya2Fyb3VuZCkKKwkJCWkgPSAzMTsKKwkJZWxzZSB7CisJCQlpcC0+bWlpLnBoeV9pZCA9IC0xOworCQkJcmVzID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaXAtPm1paS5waHlfaWQgPSBpOworCWlwLT5pb2MzX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKDEyICogSFopLzEwOyAgLyogMS4yIHNlYy4gKi8KKwlpcC0+aW9jM190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGlwOworCWlwLT5pb2MzX3RpbWVyLmZ1bmN0aW9uID0gJmlvYzNfdGltZXI7CisJYWRkX3RpbWVyKCZpcC0+aW9jM190aW1lcik7CisKK291dDoKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW9jM19jbGVhbl9yeF9yaW5nKHN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGk7CisKKwlmb3IgKGkgPSBpcC0+cnhfY2k7IGkgJiAxNTsgaSsrKSB7CisJCWlwLT5yeF9za2JzW2lwLT5yeF9waV0gPSBpcC0+cnhfc2tic1tpcC0+cnhfY2ldOworCQlpcC0+cnhyW2lwLT5yeF9waSsrXSA9IGlwLT5yeHJbaXAtPnJ4X2NpKytdOworCX0KKwlpcC0+cnhfcGkgJj0gNTExOworCWlwLT5yeF9jaSAmPSA1MTE7CisKKwlmb3IgKGkgPSBpcC0+cnhfY2k7IGkgIT0gaXAtPnJ4X3BpOyBpID0gKGkrMSkgJiA1MTEpIHsKKwkJc3RydWN0IGlvYzNfZXJ4YnVmICpyeGI7CisJCXNrYiA9IGlwLT5yeF9za2JzW2ldOworCQlyeGIgPSAoc3RydWN0IGlvYzNfZXJ4YnVmICopIChza2ItPmRhdGEgLSBSWF9PRkZTRVQpOworCQlyeGItPncwID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb2MzX2NsZWFuX3R4X3Jpbmcoc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpIDwgMTI4OyBpKyspIHsKKwkJc2tiID0gaXAtPnR4X3NrYnNbaV07CisJCWlmIChza2IpIHsKKwkJCWlwLT50eF9za2JzW2ldID0gTlVMTDsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCX0KKwkJaXAtPnR4cltpXS5jbWQgPSAwOworCX0KKwlpcC0+dHhfcGkgPSAwOworCWlwLT50eF9jaSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGlvYzNfZnJlZV9yaW5ncyhzdHJ1Y3QgaW9jM19wcml2YXRlICppcCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCByeF9lbnRyeSwgbl9lbnRyeTsKKworCWlmIChpcC0+dHhyKSB7CisJCWlvYzNfY2xlYW5fdHhfcmluZyhpcCk7CisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaXAtPnR4ciwgMik7CisJCWlwLT50eHIgPSBOVUxMOworCX0KKworCWlmIChpcC0+cnhyKSB7CisJCW5fZW50cnkgPSBpcC0+cnhfY2k7CisJCXJ4X2VudHJ5ID0gaXAtPnJ4X3BpOworCisJCXdoaWxlIChuX2VudHJ5ICE9IHJ4X2VudHJ5KSB7CisJCQlza2IgPSBpcC0+cnhfc2tic1tuX2VudHJ5XTsKKwkJCWlmIChza2IpCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCQkJbl9lbnRyeSA9IChuX2VudHJ5ICsgMSkgJiA1MTE7CisJCX0KKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWlwLT5yeHIpOworCQlpcC0+cnhyID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlvYzNfYWxsb2NfcmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGlvYzNfZXJ4YnVmICpyeGI7CisJdW5zaWduZWQgbG9uZyAqcnhyOworCWludCBpOworCisJaWYgKGlwLT5yeHIgPT0gTlVMTCkgeworCQkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSByeCByaW5nLiAgNGtiID0gNTEyIGVudHJpZXMgICovCisJCWlwLT5yeHIgPSAodW5zaWduZWQgbG9uZyAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7CisJCXJ4ciA9ICh1bnNpZ25lZCBsb25nICopIGlwLT5yeHI7CisJCWlmICghcnhyKQorCQkJcHJpbnRrKCJpb2MzX2FsbG9jX3JpbmdzKCk6IGdldF96ZXJvZWRfcGFnZSgpIGZhaWxlZCFcbiIpOworCisJCS8qIE5vdyB0aGUgcnggYnVmZmVycy4gIFRoZSBSWCByaW5nIG1heSBiZSBsYXJnZXIgYnV0CisJCSAgIHdlIG9ubHkgYWxsb2NhdGUgMTYgYnVmZmVycyBmb3Igbm93LiAgTmVlZCB0byB0dW5lCisJCSAgIHRoaXMgZm9yIHBlcmZvcm1hbmNlIGFuZCBtZW1vcnkgbGF0ZXIuICAqLworCQlmb3IgKGkgPSAwOyBpIDwgUlhfQlVGRlM7IGkrKykgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJc2tiID0gaW9jM19hbGxvY19za2IoUlhfQlVGX0FMTE9DX1NJWkUsIEdGUF9BVE9NSUMpOworCQkJaWYgKCFza2IpIHsKKwkJCQlzaG93X2ZyZWVfYXJlYXMoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaXAtPnJ4X3NrYnNbaV0gPSBza2I7CisJCQlza2ItPmRldiA9IGRldjsKKworCQkJLyogQmVjYXVzZSB3ZSByZXNlcnZlIGFmdGVyd2FyZHMuICovCisJCQlza2JfcHV0KHNrYiwgKDE2NjQgKyBSWF9PRkZTRVQpKTsKKwkJCXJ4YiA9IChzdHJ1Y3QgaW9jM19lcnhidWYgKikgc2tiLT5kYXRhOworCQkJcnhyW2ldID0gY3B1X3RvX2JlNjQoaW9jM19tYXAocnhiLCAxKSk7CisJCQlza2JfcmVzZXJ2ZShza2IsIFJYX09GRlNFVCk7CisJCX0KKwkJaXAtPnJ4X2NpID0gMDsKKwkJaXAtPnJ4X3BpID0gUlhfQlVGRlM7CisJfQorCisJaWYgKGlwLT50eHIgPT0gTlVMTCkgeworCQkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0eCByaW5ncy4gIDE2a2IgPSAxMjggYnVmcy4gICovCisJCWlwLT50eHIgPSAoc3RydWN0IGlvYzNfZXR4ZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgMik7CisJCWlmICghaXAtPnR4cikKKwkJCXByaW50aygiaW9jM19hbGxvY19yaW5ncygpOiBfX2dldF9mcmVlX3BhZ2VzKCkgZmFpbGVkIVxuIik7CisJCWlwLT50eF9waSA9IDA7CisJCWlwLT50eF9jaSA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBpb2MzX2luaXRfcmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGlvYzMgKmlvYzMgPSBpcC0+cmVnczsKKwl1bnNpZ25lZCBsb25nIHJpbmc7CisKKwlpb2MzX2ZyZWVfcmluZ3MoaXApOworCWlvYzNfYWxsb2NfcmluZ3MoZGV2KTsKKworCWlvYzNfY2xlYW5fcnhfcmluZyhpcCk7CisJaW9jM19jbGVhbl90eF9yaW5nKGlwKTsKKworCS8qIE5vdyB0aGUgcnggcmluZyBiYXNlLCBjb25zdW1lICYgcHJvZHVjZSByZWdpc3RlcnMuICAqLworCXJpbmcgPSBpb2MzX21hcChpcC0+cnhyLCAwKTsKKwlpb2MzX3dfZXJicl9oKHJpbmcgPj4gMzIpOworCWlvYzNfd19lcmJyX2wocmluZyAmIDB4ZmZmZmZmZmYpOworCWlvYzNfd19lcmNpcihpcC0+cnhfY2kgPDwgMyk7CisJaW9jM193X2VycGlyKChpcC0+cnhfcGkgPDwgMykgfCBFUlBJUl9BUk0pOworCisJcmluZyA9IGlvYzNfbWFwKGlwLT50eHIsIDApOworCisJaXAtPnR4cWxlbiA9IDA7CQkJCQkvKiBub3RoaW5nIHF1ZXVlZCAgKi8KKworCS8qIE5vdyB0aGUgdHggcmluZyBiYXNlLCBjb25zdW1lICYgcHJvZHVjZSByZWdpc3RlcnMuICAqLworCWlvYzNfd19ldGJyX2gocmluZyA+PiAzMik7CisJaW9jM193X2V0YnJfbChyaW5nICYgMHhmZmZmZmZmZik7CisJaW9jM193X2V0cGlyKGlwLT50eF9waSA8PCA3KTsKKwlpb2MzX3dfZXRjaXIoaXAtPnR4X2NpIDw8IDcpOworCSh2b2lkKSBpb2MzX3JfZXRjaXIoKTsJCQkJLyogRmx1c2ggKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvYzNfc3NyYW1fZGlzYyhzdHJ1Y3QgaW9jM19wcml2YXRlICppcCkKK3sKKwlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOworCXZvbGF0aWxlIHUzMiAqc3NyYW0wID0gJmlvYzMtPnNzcmFtWzB4MDAwMF07CisJdm9sYXRpbGUgdTMyICpzc3JhbTEgPSAmaW9jMy0+c3NyYW1bMHg0MDAwXTsKKwl1bnNpZ25lZCBpbnQgcGF0dGVybiA9IDB4NTU1NTsKKworCS8qIEFzc3VtZSB0aGUgbGFyZ2VyIHNpemUgU1NSQU0gYW5kIGVuYWJsZSBwYXJpdHkgY2hlY2tpbmcgKi8KKwlpb2MzX3dfZW1jcihpb2MzX3JfZW1jcigpIHwgKEVNQ1JfQlVGU0laIHwgRU1DUl9SQU1QQVIpKTsKKworCSpzc3JhbTAgPSBwYXR0ZXJuOworCSpzc3JhbTEgPSB+cGF0dGVybiAmIElPQzNfU1NSQU1fRE07CisKKwlpZiAoKCpzc3JhbTAgJiBJT0MzX1NTUkFNX0RNKSAhPSBwYXR0ZXJuIHx8CisJICAgICgqc3NyYW0xICYgSU9DM19TU1JBTV9ETSkgIT0gKH5wYXR0ZXJuICYgSU9DM19TU1JBTV9ETSkpIHsKKwkJLyogc2V0IHNzcmFtIHNpemUgdG8gNjQgS0IgKi8KKwkJaXAtPmVtY3IgPSBFTUNSX1JBTVBBUjsKKwkJaW9jM193X2VtY3IoaW9jM19yX2VtY3IoKSAmIH5FTUNSX0JVRlNJWik7CisJfSBlbHNlCisJCWlwLT5lbWNyID0gRU1DUl9CVUZTSVogfCBFTUNSX1JBTVBBUjsKK30KKworc3RhdGljIHZvaWQgaW9jM19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpb2MzICppb2MzID0gaXAtPnJlZ3M7CisKKwlkZWxfdGltZXIoJmlwLT5pb2MzX3RpbWVyKTsJCS8qIEtpbGwgaWYgcnVubmluZwkqLworCisJaW9jM193X2VtY3IoRU1DUl9SU1QpOwkJCS8qIFJlc2V0CQkqLworCSh2b2lkKSBpb2MzX3JfZW1jcigpOwkJCS8qIEZsdXNoIFdCCQkqLworCXVkZWxheSg0KTsJCQkJLyogR2l2ZSBpdCB0aW1lIC4uLgkqLworCWlvYzNfd19lbWNyKDApOworCSh2b2lkKSBpb2MzX3JfZW1jcigpOworCisJLyogTWlzYyByZWdpc3RlcnMgICovCisjaWZkZWYgQ09ORklHX1NHSV9JUDI3CisJaW9jM193X2VyYmFyKFBDSTY0X0FUVFJfQkFSID4+IDMyKTsJLyogQmFycmllciBvbiBsYXN0IHN0b3JlICovCisjZWxzZQorCWlvYzNfd19lcmJhcigwKTsJCQkvKiBMZXQgUENJIEFQSSBnZXQgaXQgcmlnaHQgKi8KKyNlbmRpZgorCSh2b2lkKSBpb2MzX3JfZXRjZGMoKTsJCQkvKiBDbGVhciBvbiByZWFkICovCisJaW9jM193X2VyY3NyKDE1KTsJCQkvKiBSWCBsb3cgd2F0ZXJtYXJrICAqLworCWlvYzNfd19lcnRyKDApOwkJCQkvKiBJbnRlcnJ1cHQgaW1tZWRpYXRlbHkgKi8KKwlfX2lvYzNfc2V0X21hY19hZGRyZXNzKGRldik7CisJaW9jM193X2VoYXJfaChpcC0+ZWhhcl9oKTsKKwlpb2MzX3dfZWhhcl9sKGlwLT5laGFyX2wpOworCWlvYzNfd19lcnNyKDQyKTsJCQkvKiBYWFggc2hvdWxkIGJlIHJhbmRvbSAqLworCisJaW9jM19pbml0X3JpbmdzKGRldik7CisKKwlpcC0+ZW1jciB8PSAoKFJYX09GRlNFVCAvIDIpIDw8IEVNQ1JfUlhPRkZfU0hJRlQpIHwgRU1DUl9UWERNQUVOIHwKKwkgICAgICAgICAgICAgRU1DUl9UWEVOIHwgRU1DUl9SWERNQUVOIHwgRU1DUl9SWEVOIHwgRU1DUl9QQURFTjsKKwlpb2MzX3dfZW1jcihpcC0+ZW1jcik7CisJaW9jM193X2VpZXIoRUlTUl9SWFRJTUVSSU5UIHwgRUlTUl9SWE9GTE8gfCBFSVNSX1JYQlVGT0ZMTyB8CisJICAgICAgICAgICAgRUlTUl9SWE1FTUVSUiB8IEVJU1JfUlhQQVJFUlIgfCBFSVNSX1RYQlVGVUZMTyB8CisJICAgICAgICAgICAgRUlTUl9UWEVYUExJQ0lUIHwgRUlTUl9UWE1FTUVSUik7CisJKHZvaWQpIGlvYzNfcl9laWVyKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb2MzX3N0b3Aoc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXApCit7CisJc3RydWN0IGlvYzMgKmlvYzMgPSBpcC0+cmVnczsKKworCWlvYzNfd19lbWNyKDApOwkJCQkvKiBTaHV0dXAgKi8KKwlpb2MzX3dfZWllcigwKTsJCQkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJKHZvaWQpIGlvYzNfcl9laWVyKCk7CQkJLyogRmx1c2ggKi8KK30KKworc3RhdGljIGludCBpb2MzX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGlvYzNfaW50ZXJydXB0LCBTQV9TSElSUSwgaW9jM19zdHIsIGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgZ2V0IGlycSAlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJaXAtPmVoYXJfaCA9IDA7CisJaXAtPmVoYXJfbCA9IDA7CisJaW9jM19pbml0KGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvYzNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlkZWxfdGltZXIoJmlwLT5pb2MzX3RpbWVyKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlvYzNfc3RvcChpcCk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlpb2MzX2ZyZWVfcmluZ3MoaXApOworCXJldHVybiAwOworfQorCisvKgorICogTUVORVQgY2FyZHMgaGF2ZSBmb3VyIElPQzMgY2hpcHMsIHdoaWNoIGFyZSBhdHRhY2hlZCB0byB0d28gc2V0cyBvZgorICogUENJIHNsb3QgcmVzb3VyY2VzIGVhY2g6IHRoZSBwcmltYXJ5IGNvbm5lY3Rpb25zIGFyZSBvbiBzbG90cworICogMC4uMyBhbmQgdGhlIHNlY29uZGFyaWVzIGFyZSBvbiA0Li43CisgKgorICogQWxsIGZvdXIgZXRoZXJuZXRzIGFyZSBicm91Z2h0IG91dCB0byBjb25uZWN0b3JzOyBzaXggc2VyaWFsIHBvcnRzCisgKiAoYSBwYWlyIGZyb20gZWFjaCBvZiB0aGUgZmlyc3QgdGhyZWUgSU9DM3MpIGFyZSBicm91Z2h0IG91dCB0bworICogTWluaURJTnM7IGFsbCBvdGhlciBzdWJkZXZpY2VzIGFyZSBsZWZ0IHN3aW5naW5nIGluIHRoZSB3aW5kLCBsZWF2ZQorICogdGhlbSBkaXNhYmxlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaW9jM19pc19tZW5ldChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCisJcmV0dXJuIHBkZXYtPmJ1cy0+cGFyZW50ID09IE5VTEwKKwkgICAgICAgJiYgKGRldiA9IHBjaV9maW5kX3Nsb3QocGRldi0+YnVzLT5udW1iZXIsIFBDSV9ERVZGTigwLCAwKSkpCisJICAgICAgICYmIGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU0dJCisJICAgICAgICYmIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0dJX0lPQzMKKwkgICAgICAgJiYgKGRldiA9IHBjaV9maW5kX3Nsb3QocGRldi0+YnVzLT5udW1iZXIsIFBDSV9ERVZGTigxLCAwKSkpCisJICAgICAgICYmIGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU0dJCisJICAgICAgICYmIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0dJX0lPQzMKKwkgICAgICAgJiYgKGRldiA9IHBjaV9maW5kX3Nsb3QocGRldi0+YnVzLT5udW1iZXIsIFBDSV9ERVZGTigyLCAwKSkpCisJICAgICAgICYmIGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU0dJCisJICAgICAgICYmIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0dJX0lPQzM7Cit9CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKKy8qCisgKiBOb3RlIGFib3V0IHNlcmlhbCBwb3J0cyBhbmQgY29uc29sZXM6CisgKiBGb3IgY29uc29sZSBvdXRwdXQsIGV2ZXJ5b25lIHVzZXMgdGhlIElPQzMgVUFSVEEgKG9mZnNldCAweDE3OCkKKyAqIGNvbm5lY3RlZCB0byB0aGUgbWFzdGVyIG5vZGUgKGxvb2sgaW4gaXAyN19zZXR1cF9jb25zb2xlKCkgYW5kCisgKiBpcDI3cHJvbV9jb25zb2xlX3dyaXRlKCkpLgorICoKKyAqIEZvciBzZXJpYWwgKC9kZXYvdHR5UzAgZXRjKSwgd2UgY2FuIG5vdCBoYXZlIGhhcmRjb2RlZCBzZXJpYWwgcG9ydAorICogYWRkcmVzc2VzIG9uIGEgcGFydGl0aW9uZWQgbWFjaGluZS4gU2luY2Ugd2UgY3VycmVudGx5IHVzZSB0aGUgaW9jMworICogc2VyaWFsIHBvcnRzLCB3ZSB1c2UgZHluYW1pYyBzZXJpYWwgcG9ydCBkaXNjb3ZlcnkgdGhhdCB0aGUgc2VyaWFsLmMKKyAqIGRyaXZlciB1c2VzIGZvciBwY2kvcG5wIHBvcnRzICh0aGVyZSBpcyBhbiBlbnRyeSBmb3IgdGhlIFNHSSBpb2MzCisgKiBib2FyZHMgaW4gcGNpX2JvYXJkc1tdKS4gVW5mb3J0dW5hdGVseSwgVUFSVEEncyBwaW8gYWRkcmVzcyBpcyBncmVhdGVyCisgKiB0aGFuIFVBUlRCJ3MsIGFsdGhvdWdoIFVBUlRBIG9uIG8yMDBzIGhhcyB0cmFkaXRpb25hbGx5IGJlZW4ga25vd24gYXMKKyAqIHBvcnQgMC4gU28sIHdlIGp1c3QgdXNlIG9uZSBzZXJpYWwgcG9ydCBmcm9tIGVhY2ggaW9jMyAoc2luY2UgdGhlCisgKiBzZXJpYWwgZHJpdmVyIGFkZHMgYWRkcmVzc2VzIHRvIGdldCB0byBoaWdoZXIgcG9ydHMpLgorICoKKyAqIFRoZSBmaXJzdCBvbmUgdG8gZG8gYSByZWdpc3Rlcl9jb25zb2xlIGJlY29tZXMgdGhlIHByZWZlcnJlZCBjb25zb2xlCisgKiAoaWYgdGhlcmUgaXMgbm8ga2VybmVsIGNvbW1hbmQgbGluZSBjb25zb2xlPSBkaXJlY3RpdmUpLiAvZGV2L2NvbnNvbGUKKyAqIChpZSA1LCAxKSBpcyB0aGVuICJhbGlhc2VkIiBpbnRvIHRoZSBkZXZpY2UgbnVtYmVyIHJldHVybmVkIGJ5IHRoZQorICogImRldmljZSIgcm91dGluZSByZWZlcnJlZCB0byBpbiB0aGlzIGNvbnNvbGUgc3RydWN0dXJlCisgKiAoaXAyN3Byb21fY29uc29sZV9kZXYpLgorICoKKyAqIEFsc28gbG9vayBpbiBpcDI3LXBjaS5jOnBjaV9maXh1cF9pb2MzKCkgZm9yIHNvbWUgY29tbWVudHMgb24gd29ya2luZworICogYXJvdW5kIGlvYzMgb2RkaXRpZXMgaW4gdGhpcyByZXNwZWN0LgorICoKKyAqIFRoZSBJT0MzIHNlcmlhbHMgdXNlIGEgMjJNSHogY2xvY2sgcmF0ZSB3aXRoIGFuIGFkZGl0aW9uYWwgZGl2aWRlciBieSAzLgorICogKElPQzNfQkFVRCA9ICgyMjAwMDAwMCAvICgzKjE2KSkpCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGlvYzNfc2VyaWFsX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgaW9jMyAqaW9jMykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCByZXE7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gcmVjb2duaWNlIGFuZCB0cmVhdCB0aGUgZm91cnRoIE1FTkVUIHNlcmlhbCBhcyBpdAorCSAqIGRvZXMgbm90IGhhdmUgYW4gU3VwZXJJTyBjaGlwIGF0dGFjaGVkIHRvIGl0LCB0aGVyZWZvcmUgYXR0ZW1wdGluZworCSAqIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCBpbiBidXMgZXJyb3JzLiAgV2UgY2FsbCBzb21ldGhpbmcgYW4KKwkgKiBNRU5FVCBpZiBQQ0kgc2xvdCAwLCAxLCAyIGFuZCAzIG9mIGEgbWFzdGVyIFBDSSBidXMgYWxsIGhhdmUgYW4gSU9DMworCSAqIGluIGl0LiAgVGhpcyBpcyBwYXJhbm9pZCBidXQgd2Ugd2FudCB0byBhdm9pZCBibG93aW5nIHVwIG9uIGEKKwkgKiBzaG93aG9ybiBQQ0kgYm94IHRoYXQgaGFwcGVucyB0byBoYXZlIDQgSU9DMyBjYXJkcyBpbiBpdCBzbyBpdCdzCisJICogbm90IHBhcmFub2lkIGVub3VnaCAuLi4KKwkgKi8KKwlpZiAoaW9jM19pc19tZW5ldChwZGV2KSAmJiBQQ0lfU0xPVChwZGV2LT5kZXZmbikgPT0gMykKKwkJcmV0dXJuOworCisJLyogUmVnaXN0ZXIgdG8gaW50ZXJydXB0IHplcm8gYmVjYXVzZSB3ZSBzaGFyZSB0aGUgaW50ZXJydXB0IHdpdGgKKwkgICB0aGUgc2VyaWFsIGRyaXZlciB3aGljaCB3ZSBkb24ndCBwcm9wZXJseSBzdXBwb3J0IHlldC4gICovCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwlyZXEuaXJxICAgICAgICAgICAgID0gMDsKKwlyZXEuZmxhZ3MgICAgICAgICAgID0gSU9DM19DT01fRkxBR1M7CisJcmVxLmlvX3R5cGUgICAgICAgICA9IFNFUklBTF9JT19NRU07CisJcmVxLmlvbWVtX3JlZ19zaGlmdCA9IDA7CisJcmVxLmJhdWRfYmFzZSAgICAgICA9IElPQzNfQkFVRDsKKworCXJlcS5pb21lbV9iYXNlICAgICAgPSAodW5zaWduZWQgY2hhciAqKSAmaW9jMy0+c3JlZ3MudWFydGE7CisJcmVnaXN0ZXJfc2VyaWFsKCZyZXEpOworCisJcmVxLmlvbWVtX2Jhc2UgICAgICA9ICh1bnNpZ25lZCBjaGFyICopICZpb2MzLT5zcmVncy51YXJ0YjsKKwlyZWdpc3Rlcl9zZXJpYWwoJnJlcSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBpb2MzX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXVuc2lnbmVkIGludCBzd19waHlzaWQxLCBzd19waHlzaWQyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwOworCXN0cnVjdCBpb2MzICppb2MzOworCXVuc2lnbmVkIGxvbmcgaW9jM19iYXNlLCBpb2MzX3NpemU7CisJdTMyIHZlbmRvciwgbW9kZWwsIHJldjsKKwlpbnQgZXJyLCBwY2lfdXNpbmdfZGFjOworCisJLyogQ29uZmlndXJlIERNQSBhdHRyaWJ1dGVzLiAqLworCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKTsKKwlpZiAoIWVycikgeworCQlwY2lfdXNpbmdfZGFjID0gMTsKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gb2J0YWluIDY0IGJpdCBETUEgIgorCQkJICAgICAgICJmb3IgY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIiwgcGNpX25hbWUocGRldikpOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZVTEwpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb24sICIKKwkJCSAgICAgICAiYWJvcnRpbmcuXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlwY2lfdXNpbmdfZGFjID0gMDsKKwl9CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBpb2MzX3ByaXZhdGUpKTsKKwlpZiAoIWRldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9kaXNhYmxlOworCX0KKworCWlmIChwY2lfdXNpbmdfZGFjKQorCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgImlvYzMiKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlpcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKworCWlvYzNfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlpb2MzX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCWlvYzMgPSAoc3RydWN0IGlvYzMgKikgaW9yZW1hcChpb2MzX2Jhc2UsIGlvYzNfc2l6ZSk7CisJaWYgKCFpb2MzKSB7CisJCXByaW50ayhLRVJOX0NSSVQgImlvYzNldGgoJXMpOiBpb3JlbWFwIGZhaWxlZCwgZ29vZGJ5ZS5cbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlczsKKwl9CisJaXAtPnJlZ3MgPSBpb2MzOworCisjaWZkZWYgQ09ORklHX1NFUklBTF84MjUwCisJaW9jM19zZXJpYWxfcHJvYmUocGRldiwgaW9jMyk7CisjZW5kaWYKKworCXNwaW5fbG9ja19pbml0KCZpcC0+aW9jM19sb2NrKTsKKwlpbml0X3RpbWVyKCZpcC0+aW9jM190aW1lcik7CisKKwlpb2MzX3N0b3AoaXApOworCWlvYzNfaW5pdChkZXYpOworCisJaXAtPnBkZXYgPSBwZGV2OworCisJaXAtPm1paS5waHlfaWRfbWFzayA9IDB4MWY7CisJaXAtPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOworCWlwLT5taWkuZGV2ID0gZGV2OworCWlwLT5taWkubWRpb19yZWFkID0gaW9jM19tZGlvX3JlYWQ7CisJaXAtPm1paS5tZGlvX3dyaXRlID0gaW9jM19tZGlvX3dyaXRlOworCisJaW9jM19taWlfaW5pdChpcCk7CisKKwlpZiAoaXAtPm1paS5waHlfaWQgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiaW9jMy1ldGgoJXMpOiBEaWRuJ3QgZmluZCBhIFBIWSwgZ29vZGJ5ZS5cbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3N0b3A7CisJfQorCisJaW9jM19zc3JhbV9kaXNjKGlwKTsKKwlpb2MzX2dldF9lYWRkcihpcCk7CisKKwkvKiBUaGUgSU9DMy1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbgkJPSBpb2MzX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBpb2MzX3N0YXJ0X3htaXQ7CisJZGV2LT50eF90aW1lb3V0CQk9IGlvYzNfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gNSAqIEhaOworCWRldi0+c3RvcAkJPSBpb2MzX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzCQk9IGlvYzNfZ2V0X3N0YXRzOworCWRldi0+ZG9faW9jdGwJCT0gaW9jM19pb2N0bDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdAk9IGlvYzNfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzCT0gaW9jM19zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5ldGh0b29sX29wcwk9ICZpb2MzX2V0aHRvb2xfb3BzOworI2lmZGVmIENPTkZJR19TR0lfSU9DM19FVEhfSFdfVFhfQ1NVTQorCWRldi0+ZmVhdHVyZXMJCT0gTkVUSUZfRl9JUF9DU1VNOworI2VuZGlmCisKKwlpb2MzX3NldHVwX2R1cGxleChpcCk7CisJc3dfcGh5c2lkMSA9IGlvYzNfbWRpb19yZWFkKGRldiwgaXAtPm1paS5waHlfaWQsIE1JSV9QSFlTSUQxKTsKKwlzd19waHlzaWQyID0gaW9jM19tZGlvX3JlYWQoZGV2LCBpcC0+bWlpLnBoeV9pZCwgTUlJX1BIWVNJRDIpOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXRfc3RvcDsKKworCW1paV9jaGVja19tZWRpYSgmaXAtPm1paSwgMSwgMSk7CisKKwl2ZW5kb3IgPSAoc3dfcGh5c2lkMSA8PCAxMikgfCAoc3dfcGh5c2lkMiA+PiA0KTsKKwltb2RlbCAgPSAoc3dfcGh5c2lkMiA+PiA0KSAmIDB4M2Y7CisJcmV2ICAgID0gc3dfcGh5c2lkMiAmIDB4ZjsKKwlwcmludGsoS0VSTl9JTkZPICIlczogVXNpbmcgUEhZICVkLCB2ZW5kb3IgMHgleCwgbW9kZWwgJWQsICIKKwkgICAgICAgInJldiAlZC5cbiIsIGRldi0+bmFtZSwgaXAtPm1paS5waHlfaWQsIHZlbmRvciwgbW9kZWwsIHJldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElPQzMgU1NSQU0gaGFzICVkIGtieXRlLlxuIiwgZGV2LT5uYW1lLAorCSAgICAgICBpcC0+ZW1jciAmIEVNQ1JfQlVGU0laID8gMTI4IDogNjQpOworCisJcmV0dXJuIDA7CisKK291dF9zdG9wOgorCWlvYzNfc3RvcChpcCk7CisJaW9jM19mcmVlX3JpbmdzKGlwKTsKK291dF9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK291dF9mcmVlOgorCWZyZWVfbmV0ZGV2KGRldik7CitvdXRfZGlzYWJsZToKKwkvKgorCSAqIFdlIHNob3VsZCBjYWxsIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsgaGVyZSBpZiB0aGUgSU9DMyB3YXNuJ3QKKwkgKiBzdWNoIGEgd2VpcmQgZGV2aWNlIC4uLgorCSAqLworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpb2MzX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpb2MzICppb2MzID0gaXAtPnJlZ3M7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCWlvdW5tYXAoaW9jMyk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworCS8qCisJICogV2Ugc2hvdWxkIGNhbGwgcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOyBoZXJlIGlmIHRoZSBJT0MzIHdhc24ndAorCSAqIHN1Y2ggYSB3ZWlyZCBkZXZpY2UgLi4uCisJICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpb2MzX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfU0dJLCBQQ0lfREVWSUNFX0lEX1NHSV9JT0MzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCisJeyAwIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaW9jM19wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGlvYzNfZHJpdmVyID0geworCS5uYW1lCQk9ICJpb2MzLWV0aCIsCisJLmlkX3RhYmxlCT0gaW9jM19wY2lfdGJsLAorCS5wcm9iZQkJPSBpb2MzX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaW9jM19yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlvYzNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZpb2MzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpb2MzX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpb2MzX2RyaXZlcik7Cit9CisKK3N0YXRpYyBpbnQgaW9jM19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOworCXVuc2lnbmVkIGludCBsZW47CisJc3RydWN0IGlvYzNfZXR4ZCAqZGVzYzsKKwl1aW50MzJfdCB3MCA9IDA7CisJaW50IHByb2R1Y2U7CisKKyNpZmRlZiBDT05GSUdfU0dJX0lPQzNfRVRIX0hXX1RYX0NTVU0KKwkvKgorCSAqIElPQzMgaGFzIGEgZmFpcmx5IHNpbXBsZSBtaW5kZWQgY2hlY2tzdW1taW5nIGhhcmR3YXJlIHdoaWNoIHNpbXBseQorCSAqIGFkZHMgdXAgdGhlIDEncyBjb21wbGVtZW50IGNoZWNrc3VtIGZvciB0aGUgZW50aXJlIHBhY2tldCBhbmQKKwkgKiBpbnNlcnRzIGl0IGF0IGFuIG9mZnNldCB3aGljaCBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yCisJICogaW50byB0aGUgdHJhbnNtaXQgcGFja2V0LiAgVGhpcyBtZWFucyB3ZSBoYXZlIHRvIGNvbXBlbnNhdGUgZm9yIHRoZQorCSAqIE1BQyBoZWFkZXIgd2hpY2ggc2hvdWxkIG5vdCBiZSBzdW1tZWQgYW5kIHRoZSBUQ1AvVURQIHBzZXVkbyBoZWFkZXJzCisJICogbWFudWFsbHkuCisJICovCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCWludCBwcm90byA9IG50b2hzKHNrYi0+bmguaXBoLT5wcm90b2NvbCk7CisJCXVuc2lnbmVkIGludCBjc29mZjsKKwkJc3RydWN0IGlwaGRyICppaCA9IHNrYi0+bmguaXBoOworCQl1aW50MzJfdCBjc3VtLCBlaHN1bTsKKwkJdWludDE2X3QgKmVoOworCisJCS8qIFRoZSBNQUMgaGVhZGVyLiAgc2tiLT5tYWMgc2VlbSB0aGUgbG9naWMgYXBwcm9hY2gKKwkJICAgdG8gZmluZCB0aGUgTUFDIGhlYWRlciAtIGV4Y2VwdCBpdCdzIGEgTlVMTCBwb2ludGVyIC4uLiAgKi8KKwkJZWggPSAodWludDE2X3QgKikgc2tiLT5kYXRhOworCisJCS8qIFN1bSB1cCBkZXN0IGFkZHIsIHNyYyBhZGRyIGFuZCBwcm90b2NvbCAgKi8KKwkJZWhzdW0gPSBlaFswXSArIGVoWzFdICsgZWhbMl0gKyBlaFszXSArIGVoWzRdICsgZWhbNV0gKyBlaFs2XTsKKworCQkvKiBGb2xkIGVoc3VtLiAgY2FuJ3QgdXNlIGNzdW1fZm9sZCB3aGljaCBuZWdhdGVzIGFsc28gLi4uICAqLworCQllaHN1bSA9IChlaHN1bSAmIDB4ZmZmZikgKyAoZWhzdW0gPj4gMTYpOworCQllaHN1bSA9IChlaHN1bSAmIDB4ZmZmZikgKyAoZWhzdW0gPj4gMTYpOworCisJCS8qIFNraXAgSVAgaGVhZGVyOyBpdCdzIHN1bSBpcyBhbHdheXMgemVybyBhbmQgd2FzCisJCSAgIGFscmVhZHkgZmlsbGVkIGluIGJ5IGlwX291dHB1dC5jICovCisJCWNzdW0gPSBjc3VtX3RjcHVkcF9ub2ZvbGQoaWgtPnNhZGRyLCBpaC0+ZGFkZHIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgaWgtPnRvdF9sZW4gLSAoaWgtPmlobCA8PCAyKSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90bywgMHhmZmZmIF4gZWhzdW0pOworCisJCWNzdW0gPSAoY3N1bSAmIDB4ZmZmZikgKyAoY3N1bSA+PiAxNik7CS8qIEZvbGQgYWdhaW4gKi8KKwkJY3N1bSA9IChjc3VtICYgMHhmZmZmKSArIChjc3VtID4+IDE2KTsKKworCQljc29mZiA9IEVUSF9ITEVOICsgKGloLT5paGwgPDwgMik7CisJCWlmIChwcm90byA9PSBJUFBST1RPX1VEUCkgeworCQkJY3NvZmYgKz0gb2Zmc2V0b2Yoc3RydWN0IHVkcGhkciwgY2hlY2spOworCQkJc2tiLT5oLnVoLT5jaGVjayA9IGNzdW07CisJCX0KKwkJaWYgKHByb3RvID09IElQUFJPVE9fVENQKSB7CisJCQljc29mZiArPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CisJCQlza2ItPmgudGgtPmNoZWNrID0gY3N1bTsKKwkJfQorCisJCXcwID0gRVRYRF9ET0NIRUNLU1VNIHwgKGNzb2ZmIDw8IEVUWERfQ0hLT0ZGX1NISUZUKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX1NHSV9JT0MzX0VUSF9IV19UWF9DU1VNICovCisKKwlzcGluX2xvY2tfaXJxKCZpcC0+aW9jM19sb2NrKTsKKworCWRhdGEgPSAodW5zaWduZWQgbG9uZykgc2tiLT5kYXRhOworCWxlbiA9IHNrYi0+bGVuOworCisJcHJvZHVjZSA9IGlwLT50eF9waTsKKwlkZXNjID0gJmlwLT50eHJbcHJvZHVjZV07CisKKwlpZiAobGVuIDw9IDEwNCkgeworCQkvKiBTaG9ydCBwYWNrZXQsIGxldCdzIGNvcHkgaXQgZGlyZWN0bHkgaW50byB0aGUgcmluZy4gICovCisJCW1lbWNweShkZXNjLT5kYXRhLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJaWYgKGxlbiA8IEVUSF9aTEVOKSB7CisJCQkvKiBWZXJ5IHNob3J0IHBhY2tldCwgcGFkIHdpdGggemVyb3MgYXQgdGhlIGVuZC4gKi8KKwkJCW1lbXNldChkZXNjLT5kYXRhICsgbGVuLCAwLCBFVEhfWkxFTiAtIGxlbik7CisJCQlsZW4gPSBFVEhfWkxFTjsKKwkJfQorCQlkZXNjLT5jbWQgPSBjcHVfdG9fYmUzMihsZW4gfCBFVFhEX0lOVFdIRU5ET05FIHwgRVRYRF9EMFYgfCB3MCk7CisJCWRlc2MtPmJ1ZmNudCA9IGNwdV90b19iZTMyKGxlbik7CisJfSBlbHNlIGlmICgoZGF0YSBeIChkYXRhICsgbGVuIC0gMSkpICYgMHg0MDAwKSB7CisJCXVuc2lnbmVkIGxvbmcgYjIgPSAoZGF0YSB8IDB4M2ZmZlVMKSArIDFVTDsKKwkJdW5zaWduZWQgbG9uZyBzMSA9IGIyIC0gZGF0YTsKKwkJdW5zaWduZWQgbG9uZyBzMiA9IGRhdGEgKyBsZW4gLSBiMjsKKworCQlkZXNjLT5jbWQgICAgPSBjcHVfdG9fYmUzMihsZW4gfCBFVFhEX0lOVFdIRU5ET05FIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgRVRYRF9CMVYgfCBFVFhEX0IyViB8IHcwKTsKKwkJZGVzYy0+YnVmY250ID0gY3B1X3RvX2JlMzIoKHMxIDw8IEVUWERfQjFDTlRfU0hJRlQpIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMyIDw8IEVUWERfQjJDTlRfU0hJRlQpKTsKKwkJZGVzYy0+cDEgICAgID0gY3B1X3RvX2JlNjQoaW9jM19tYXAoc2tiLT5kYXRhLCAxKSk7CisJCWRlc2MtPnAyICAgICA9IGNwdV90b19iZTY0KGlvYzNfbWFwKCh2b2lkICopIGIyLCAxKSk7CisJfSBlbHNlIHsKKwkJLyogTm9ybWFsIHNpemVkIHBhY2tldCB0aGF0IGRvZXNuJ3QgY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5LiAqLworCQlkZXNjLT5jbWQgPSBjcHVfdG9fYmUzMihsZW4gfCBFVFhEX0lOVFdIRU5ET05FIHwgRVRYRF9CMVYgfCB3MCk7CisJCWRlc2MtPmJ1ZmNudCA9IGNwdV90b19iZTMyKGxlbiA8PCBFVFhEX0IxQ05UX1NISUZUKTsKKwkJZGVzYy0+cDEgICAgID0gY3B1X3RvX2JlNjQoaW9jM19tYXAoc2tiLT5kYXRhLCAxKSk7CisJfQorCisJQkFSUklFUigpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJaXAtPnR4X3NrYnNbcHJvZHVjZV0gPSBza2I7CQkJLyogUmVtZW1iZXIgc2tiICovCisJcHJvZHVjZSA9IChwcm9kdWNlICsgMSkgJiAxMjc7CisJaXAtPnR4X3BpID0gcHJvZHVjZTsKKwlpb2MzX3dfZXRwaXIocHJvZHVjZSA8PCA3KTsJCQkvKiBGaXJlIC4uLiAqLworCisJaXAtPnR4cWxlbisrOworCisJaWYgKGlwLT50eHFsZW4gPj0gMTI3KQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnEoJmlwLT5pb2MzX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlvYzNfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgcmVzZXR0aW5nXG4iLCBkZXYtPm5hbWUpOworCisJc3Bpbl9sb2NrX2lycSgmaXAtPmlvYzNfbG9jayk7CisKKwlpb2MzX3N0b3AoaXApOworCWlvYzNfaW5pdChkZXYpOworCWlvYzNfbWlpX2luaXQoaXApOworCisJc3Bpbl91bmxvY2tfaXJxKCZpcC0+aW9jM19sb2NrKTsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoKKyAqIEdpdmVuIGEgbXVsdGljYXN0IGV0aGVybmV0IGFkZHJlc3MsIHRoaXMgcm91dGluZSBjYWxjdWxhdGVzIHRoZQorICogYWRkcmVzcydzIGJpdCBpbmRleCBpbiB0aGUgbG9naWNhbCBhZGRyZXNzIGZpbHRlciBtYXNrCisgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaW9jM19oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJdW5zaWduZWQgaW50IHRlbXAgPSAwOworCXUzMiBjcmM7CisJaW50IGJpdHM7CisKKwljcmMgPSBldGhlcl9jcmNfbGUoRVRIX0FMRU4sIGFkZHIpOworCisJY3JjICY9IDB4M2Y7ICAgIC8qIGJpdCByZXZlcnNlIGxvd2VzdCA2IGJpdHMgZm9yIGhhc2ggaW5kZXggKi8KKwlmb3IgKGJpdHMgPSA2OyAtLWJpdHMgPj0gMDsgKSB7CisJCXRlbXAgPDw9IDE7CisJCXRlbXAgfD0gKGNyYyAmIDB4MSk7CisJCWNyYyA+Pj0gMTsKKwl9CisKKwlyZXR1cm4gdGVtcDsKK30KKworc3RhdGljIHZvaWQgaW9jM19nZXRfZHJ2aW5mbyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHN0cmNweSAoaW5mby0+ZHJpdmVyLCBJT0MzX05BTUUpOworICAgICAgICBzdHJjcHkgKGluZm8tPnZlcnNpb24sIElPQzNfVkVSU0lPTik7CisgICAgICAgIHN0cmNweSAoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGlwLT5wZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgaW9jM19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByYzsKKworCXNwaW5fbG9ja19pcnEoJmlwLT5pb2MzX2xvY2spOworCXJjID0gbWlpX2V0aHRvb2xfZ3NldCgmaXAtPm1paSwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJmlwLT5pb2MzX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGlvYzNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxKCZpcC0+aW9jM19sb2NrKTsKKwlyYyA9IG1paV9ldGh0b29sX3NzZXQoJmlwLT5taWksIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZpcC0+aW9jM19sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBpb2MzX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmaXAtPmlvYzNfbG9jayk7CisJcmMgPSBtaWlfbndheV9yZXN0YXJ0KCZpcC0+bWlpKTsKKwlzcGluX3VubG9ja19pcnEoJmlwLT5pb2MzX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdTMyIGlvYzNfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmaXAtPmlvYzNfbG9jayk7CisJcmMgPSBtaWlfbGlua19vaygmaXAtPm1paSk7CisJc3Bpbl91bmxvY2tfaXJxKCZpcC0+aW9jM19sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBpb2MzX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBpb2MzX2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MJCT0gaW9jM19nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBpb2MzX3NldF9zZXR0aW5ncywKKwkubndheV9yZXNldAkJPSBpb2MzX253YXlfcmVzZXQsCisJLmdldF9saW5rCQk9IGlvYzNfZ2V0X2xpbmssCit9OworCitzdGF0aWMgaW50IGlvYzNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmaXAtPmlvYzNfbG9jayk7CisJcmMgPSBnZW5lcmljX21paV9pb2N0bCgmaXAtPm1paSwgaWZfbWlpKHJxKSwgY21kLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnEoJmlwLT5pb2MzX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBpb2MzX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOworCXU2NCBlaGFyID0gMDsKKwlpbnQgaTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsJCQkJLyogTG9jayBvdXQgb3RoZXJzLiAqLworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkJCS8qIFNldCBwcm9taXNjdW91cy4gICovCisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJaXAtPmVtY3IgfD0gRU1DUl9QUk9NSVNDOworCQlpb2MzX3dfZW1jcihpcC0+ZW1jcik7CisJCSh2b2lkKSBpb2MzX3JfZW1jcigpOworCX0gZWxzZSB7CisJCWlwLT5lbWNyICY9IH5FTUNSX1BST01JU0M7CisJCWlvYzNfd19lbWNyKGlwLT5lbWNyKTsJCQkvKiBDbGVhciBwcm9taXNjdW91cy4gKi8KKwkJKHZvaWQpIGlvYzNfcl9lbWNyKCk7CisKKwkJaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCAoZGV2LT5tY19jb3VudCA+IDY0KSkgeworCQkJLyogVG9vIG1hbnkgZm9yIGhhc2hpbmcgdG8gbWFrZSBzZW5zZSBvciB3ZSB3YW50IGFsbAorCQkJICAgbXVsdGljYXN0IHBhY2tldHMgYW55d2F5LCAgc28gc2tpcCBjb21wdXRpbmcgYWxsIHRoZQorCQkJICAgaGFzaGVzIGFuZCBqdXN0IGFjY2VwdCBhbGwgcGFja2V0cy4gICovCisJCQlpcC0+ZWhhcl9oID0gMHhmZmZmZmZmZjsKKwkJCWlwLT5laGFyX2wgPSAweGZmZmZmZmZmOworCQl9IGVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgeworCQkJCWNoYXIgKmFkZHIgPSBkbWktPmRtaV9hZGRyOworCQkJCWRtaSA9IGRtaS0+bmV4dDsKKworCQkJCWlmICghKCphZGRyICYgMSkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJZWhhciB8PSAoMVVMIDw8IGlvYzNfaGFzaChhZGRyKSk7CisJCQl9CisJCQlpcC0+ZWhhcl9oID0gZWhhciA+PiAzMjsKKwkJCWlwLT5laGFyX2wgPSBlaGFyICYgMHhmZmZmZmZmZjsKKwkJfQorCQlpb2MzX3dfZWhhcl9oKGlwLT5laGFyX2gpOworCQlpb2MzX3dfZWhhcl9sKGlwLT5laGFyX2wpOworCX0KKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsJCQkvKiBMZXQgdXMgZ2V0IGdvaW5nIGFnYWluLiAqLworfQorCitNT0RVTEVfQVVUSE9SKCJSYWxmIEJhZWNobGUgPHJhbGZAbGludXgtbWlwcy5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNHSSBJT0MzIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpb2MzX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGlvYzNfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9LY29uZmlnIGIvZHJpdmVycy9uZXQvaXJkYS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NjQ4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL0tjb25maWcKQEAgLTAsMCArMSw0MDQgQEAKKworbWVudSAiSW5mcmFyZWQtcG9ydCBkZXZpY2UgZHJpdmVycyIKKwlkZXBlbmRzIG9uIElSREEhPW4KKworY29tbWVudCAiU0lSIGRldmljZSBkcml2ZXJzIgorCitjb25maWcgSVJUVFlfU0lSCisJdHJpc3RhdGUgIklyVFRZICh1c2VzIExpbnV4IHNlcmlhbCBkcml2ZXIpIgorCWRlcGVuZHMgb24gSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIElyVFRZIGxpbmUKKwkgIGRpc2NpcGxpbmUuICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpcnR0eS1zaXIuIElyVFRZIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBMaW51eCdzCisJICBvd24gc2VyaWFsIGRyaXZlciBmb3IgYWxsIElyREEgcG9ydHMgdGhhdCBhcmUgMTY1NTAgY29tcGF0aWJsZS4KKwkgIE1vc3QgSXJEQSBjaGlwcyBhcmUgMTY1NTAgY29tcGF0aWJsZSBzbyB5b3Ugc2hvdWxkIHByb2JhYmx5IHNheSBZCisJICB0byB0aGlzIG9wdGlvbi4gIFVzaW5nIElyVFRZIHdpbGwgaG93ZXZlciBsaW1pdCB0aGUgc3BlZWQgb2YgdGhlCisJICBjb25uZWN0aW9uIHRvIDExNTIwMCBicHMgKElyREEgU0lSIG1vZGUpLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb21tZW50ICJEb25nbGUgc3VwcG9ydCIKKworY29uZmlnIERPTkdMRQorCWJvb2wgIlNlcmlhbCBkb25nbGUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElSVFRZX1NJUgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gaW5mcmFyZWQgZGV2aWNlIHRoYXQgY29ubmVjdHMgdG8geW91cgorCSAgY29tcHV0ZXIncyBzZXJpYWwgcG9ydC4gVGhlc2UgZGV2aWNlcyBhcmUgY2FsbGVkIGRvbmdsZXMuIFRoZW4gc2F5IFkKKwkgIG9yIE0gdG8gdGhlIGRyaXZlciBmb3IgeW91ciBwYXJ0aWN1bGFyIGRvbmdsZSBiZWxvdy4KKworCSAgTm90ZSB0aGF0IHRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiB3b24ndCBkaXJlY3RseSBhZmZlY3QgdGhlCisJICBrZXJuZWw6IHNheWluZyBOIHdpbGwganVzdCBjYXVzZSB0aGUgY29uZmlndXJhdG9yIHRvIHNraXAgYWxsCisJICB0aGUgcXVlc3Rpb25zIGFib3V0IHNlcmlhbCBkb25nbGVzLgorCitjb25maWcgRVNJX0RPTkdMRQorCXRyaXN0YXRlICJFU0kgSmV0RXllIFBDIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRSAmJiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgRXh0ZW5kZWQgU3lzdGVtcworCSAgSmV0RXllIFBDIGRvbmdsZS4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZSBFU0kKKwkgIGRvbmdsZSBhdHRhY2hlcyB0byB0aGUgbm9ybWFsIDktcGluIHNlcmlhbCBwb3J0IGNvbm5lY3RvciwgYW5kIGNhbgorCSAgY3VycmVudGx5IG9ubHkgYmUgdXNlZCBieSBJclRUWS4gIFRvIGFjdGl2YXRlIHN1cHBvcnQgZm9yIEVTSQorCSAgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIHN0YXJ0IGlyYXR0YWNoIGxpa2UgdGhpczoKKwkgICJpcmF0dGFjaCAtZCBlc2kiLgorCitjb25maWcgQUNUSVNZU19ET05HTEUKKwl0cmlzdGF0ZSAiQUNUaVNZUyBJUi0yMjBMIGFuZCBJUjIyMEwrIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRSAmJiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgQUNUaVNZUyBJUi0yMjBMIGFuZAorCSAgSVIyMjBMKyBkb25nbGVzLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlCisJICBBQ1RpU1lTIGRvbmdsZXMgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydCBjb25uZWN0b3IsCisJICBhbmQgY2FuIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuICBUbyBhY3RpdmF0ZSBzdXBwb3J0IGZvcgorCSAgQUNUaVNZUyBkb25nbGVzIHlvdSB3aWxsIGhhdmUgdG8gc3RhcnQgaXJhdHRhY2ggbGlrZSB0aGlzOgorCSAgImlyYXR0YWNoIC1kIGFjdGlzeXMiIG9yICJpcmF0dGFjaCAtZCBhY3Rpc3lzKyIuCisKK2NvbmZpZyBURUtSQU1fRE9OR0xFCisJdHJpc3RhdGUgIlRla3JhbSBJck1hdGUgMjEwQiBkb25nbGUiCisJZGVwZW5kcyBvbiBET05HTEUgJiYgSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFRla3JhbSBJck1hdGUgMjEwQgorCSAgZG9uZ2xlLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIFRla3JhbSBkb25nbGUKKwkgIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLCBhbmQgY2FuCisJICBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IgVGVrcmFtCisJICBkb25nbGVzIHlvdSB3aWxsIGhhdmUgdG8gc3RhcnQgaXJhdHRhY2ggbGlrZSB0aGlzOgorCSAgImlyYXR0YWNoIC1kIHRla3JhbSIuCisKK2NvbmZpZyBMSVRFTElOS19ET05HTEUKKwl0cmlzdGF0ZSAiUGFyYWxsYXggTGl0ZUxpbmsgZG9uZ2xlIgorCWRlcGVuZHMgb24gRE9OR0xFICYmIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBQYXJhbGxheCBMaXRlbGluaworCSAgZG9uZ2xlLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIFRoZSBQYXJhbGxheAorCSAgZG9uZ2xlIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLCBhbmQgY2FuCisJICBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IgUGFyYWxsYXgKKwkgIGRvbmdsZXMgeW91IHdpbGwgaGF2ZSB0byBzdGFydCBpcmF0dGFjaCBsaWtlIHRoaXM6CisJICAiaXJhdHRhY2ggLWQgbGl0ZWxpbmsiLgorCitjb25maWcgTUE2MDBfRE9OR0xFCisJdHJpc3RhdGUgIk1vYmlsZSBBY3Rpb24gTUE2MDAgZG9uZ2xlIgorCWRlcGVuZHMgb24gRE9OR0xFICYmIElSREEgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgTW9iaWxlIEFjdGlvbiBNQTYwMAorCSAgZG9uZ2xlLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIE1BNjAwIGRvbmdsZQorCSAgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydCBjb25uZWN0b3IsIGFuZCBjYW4KKwkgIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuICBUaGUgZHJpdmVyIHNob3VsZCBhbHNvIHN1cHBvcnQKKwkgIHRoZSBNQTYyMCBVU0IgdmVyc2lvbiBvZiB0aGUgZG9uZ2xlLCBpZiB0aGUgaW50ZWdyYXRlZCBVU0ItdG8tUlMyMzIKKwkgIGNvbnZlcnRlciBpcyBzdXBwb3J0ZWQgYnkgdXNic2VyaWFsLiBUbyBhY3RpdmF0ZSBzdXBwb3J0IGZvcgorCSAgTUE2MDAgZG9uZ2xlIHlvdSB3aWxsIGhhdmUgdG8gc3RhcnQgaXJhdHRhY2ggbGlrZSB0aGlzOgorCSAgImlyYXR0YWNoIC1kIG1hNjAwIi4KKworY29uZmlnIEdJUkJJTF9ET05HTEUKKwl0cmlzdGF0ZSAiR3JlZW53aWNoIEdJckJJTCBkb25nbGUiCisJZGVwZW5kcyBvbiBET05HTEUgJiYgSVJEQSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBHcmVlbndpY2ggR0lyQklMCisJICBkb25nbGUuICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLgorCSAgVGhlIEdyZWVud2ljaCBkb25nbGUgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydAorCSAgY29ubmVjdG9yLCBhbmQgY2FuIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuICBUbyBhY3RpdmF0ZQorCSAgc3VwcG9ydCBmb3IgR3JlZW53aWNoIGRvbmdsZXMgeW91IHdpbGwgaGF2ZSB0byBzdGFydCBpcmF0dGFjaAorCSAgbGlrZSB0aGlzOiAiaXJhdHRhY2ggLWQgZ2lyYmlsIi4KKworY29uZmlnIE1DUDIxMjBfRE9OR0xFCisJdHJpc3RhdGUgIk1pY3JvY2hpcCBNQ1AyMTIwIgorCWRlcGVuZHMgb24gRE9OR0xFICYmIElSREEgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgTWljcm9jaGlwIE1DUDIxMjAKKwkgIGRvbmdsZS4gIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCisJICBUaGUgTUNQMjEyMCBkb25nbGUgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydAorCSAgY29ubmVjdG9yLCBhbmQgY2FuIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuICBUbyBhY3RpdmF0ZQorCSAgc3VwcG9ydCBmb3IgTUNQMjEyMCBkb25nbGVzIHlvdSB3aWxsIGhhdmUgdG8gc3RhcnQgaXJhdHRhY2gKKwkgIGxpa2UgdGhpczogImlyYXR0YWNoIC1kIG1jcDIxMjAiLgorCisJICBZb3UgbXVzdCBidWlsZCB0aGlzIGRvbmdsZSB5b3Vyc2VsZi4gIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZToKKwkgIDxodHRwOi8vd3d3LmV5ZXRhcC5vcmcvfnRhbmdmL2lyZGFfc2lyX2xpbnV4Lmh0bWw+CisKK2NvbmZpZyBPTERfQkVMS0lOX0RPTkdMRQorCXRyaXN0YXRlICJPbGQgQmVsa2luIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRSAmJiBJUkRBICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIEFkYXB0ZWMgQWlycG9ydCAxMDAwCisJICBhbmQgMjAwMCBkb25nbGVzLiAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlCisJICBNIGhlcmUuIFNvbWUgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIGluIHRoZSBjb21tZW50cworCSAgYXQgdGhlIHRvcCBvZiA8ZmlsZTpkcml2ZXJzL25ldC9pcmRhL29sZF9iZWxraW4uYz4uCisKK2NvbmZpZyBBQ1QyMDBMX0RPTkdMRQorCXRyaXN0YXRlICJBQ1RpU1lTIElSLTIwMEwgZG9uZ2xlIgorCWRlcGVuZHMgb24gRE9OR0xFICYmIElSREEgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgQUNUaVNZUyBJUi0yMDBMCisJICBkb25nbGUuIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCisJICBUaGUgQUNUaVNZUyBJUi0yMDBMIGRvbmdsZSBhdHRhY2hlcyB0byB0aGUgbm9ybWFsIDktcGluIHNlcmlhbAorCSAgcG9ydCBjb25uZWN0b3IsIGFuZCBjYW4gY3VycmVudGx5IG9ubHkgYmUgdXNlZCBieSBJclRUWS4KKwkgIFRvIGFjdGl2YXRlIHN1cHBvcnQgZm9yIEFDVGlTWVMgSVItMjAwTCBkb25nbGUgeW91IHdpbGwgaGF2ZSB0bworCSAgc3RhcnQgaXJhdHRhY2ggbGlrZSB0aGlzOiAiaXJhdHRhY2ggLWQgYWN0MjAwbCIuCisKK2NvbW1lbnQgIk9sZCBTSVIgZGV2aWNlIGRyaXZlcnMiCisKK2NvbmZpZyBJUlBPUlRfU0lSCisJdHJpc3RhdGUgIklyUE9SVCAoSXJEQSBzZXJpYWwgZHJpdmVyKSIKKwlkZXBlbmRzIG9uIElSREEgJiYgQlJPS0VOX09OX1NNUAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIElyUE9SVCBJckRBIGRldmljZQorCSAgZHJpdmVyLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgaXJwb3J0LiBJclBPUlQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBJclRUWSBhbmQgc29tZXRpbWVzCisJICB0aGlzIGNhbiBiZSBiZXR0ZXIuICBPbmUgZXhhbXBsZSBpcyBpZiB5b3VyIElyREEgcG9ydCBkb2VzIG5vdAorCSAgaGF2ZSBlY2hvLWNhbmNlbGluZywgd2hpY2ggd2lsbCB3b3JrIE9LIHdpdGggSXJQT1JUIHNpbmNlIHRoaXMKKwkgIGRyaXZlciBpcyB3b3JraW5nIGluIGhhbGYtZHVwbGV4IG1vZGUgb25seS4gIFlvdSBkb24ndCBuZWVkIHRvIHVzZQorCSAgaXJhdHRhY2ggd2l0aCBJclBPUlQsIGJ1dCB5b3UganVzdCBpbnNlcnQgaXQgdGhlIHNhbWUgd2F5IGFzIEZJUgorCSAgZHJpdmVycyAoaW5zbW9kIGlycG9ydCBpbz0weDNlOCBpcnE9MTEpLiAgTm90aWNlIHRoYXQgSXJQT1JUIGlzIGEKKwkgIFNJUiBkZXZpY2UgZHJpdmVyIHdoaWNoIG1lYW5zIHRoYXQgc3BlZWQgaXMgbGltaXRlZCB0byAxMTUyMDAgYnBzLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb21tZW50ICJPbGQgU2VyaWFsIGRvbmdsZSBzdXBwb3J0IgorCitjb25maWcgRE9OR0xFX09MRAorCWJvb2wgIk9sZCBTZXJpYWwgZG9uZ2xlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoSVJUVFlfT0xEIHx8IElSUE9SVF9TSVIpICYmIEJST0tFTl9PTl9TTVAKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIGluZnJhcmVkIGRldmljZSB0aGF0IGNvbm5lY3RzIHRvIHlvdXIKKwkgIGNvbXB1dGVyJ3Mgc2VyaWFsIHBvcnQuIFRoZXNlIGRldmljZXMgYXJlIGNhbGxlZCBkb25nbGVzLiBUaGVuIHNheSBZCisJICBvciBNIHRvIHRoZSBkcml2ZXIgZm9yIHlvdXIgcGFydGljdWxhciBkb25nbGUgYmVsb3cuCisKKwkgIE5vdGUgdGhhdCB0aGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBzZXJpYWwgZG9uZ2xlcy4KKworY29uZmlnIEVTSV9ET05HTEVfT0xECisJdHJpc3RhdGUgIkVTSSBKZXRFeWUgUEMgZG9uZ2xlIgorCWRlcGVuZHMgb24gRE9OR0xFX09MRCAmJiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgRXh0ZW5kZWQgU3lzdGVtcworCSAgSmV0RXllIFBDIGRvbmdsZS4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBUaGUgRVNJCisJICBkb25nbGUgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydCBjb25uZWN0b3IsIGFuZCBjYW4KKwkgIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuICBUbyBhY3RpdmF0ZSBzdXBwb3J0IGZvciBFU0kKKwkgIGRvbmdsZXMgeW91IHdpbGwgaGF2ZSB0byBzdGFydCBpcmF0dGFjaCBsaWtlIHRoaXM6CisJICAiaXJhdHRhY2ggLWQgZXNpIi4KKworY29uZmlnIEFDVElTWVNfRE9OR0xFX09MRAorCXRyaXN0YXRlICJBQ1RpU1lTIElSLTIyMEwgYW5kIElSMjIwTCsgZG9uZ2xlIgorCWRlcGVuZHMgb24gRE9OR0xFX09MRCAmJiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgQUNUaVNZUyBJUi0yMjBMIGFuZAorCSAgSVIyMjBMKyBkb25nbGVzLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIFRoZQorCSAgQUNUaVNZUyBkb25nbGVzIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLAorCSAgYW5kIGNhbiBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IKKwkgIEFDVGlTWVMgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIHN0YXJ0IGlyYXR0YWNoIGxpa2UgdGhpczoKKwkgICJpcmF0dGFjaCAtZCBhY3Rpc3lzIiBvciAiaXJhdHRhY2ggLWQgYWN0aXN5cysiLgorCitjb25maWcgVEVLUkFNX0RPTkdMRV9PTEQKKwl0cmlzdGF0ZSAiVGVrcmFtIElyTWF0ZSAyMTBCIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRV9PTEQgJiYgSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFRla3JhbSBJck1hdGUgMjEwQgorCSAgZG9uZ2xlLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIFRoZSBUZWtyYW0gZG9uZ2xlCisJICBhdHRhY2hlcyB0byB0aGUgbm9ybWFsIDktcGluIHNlcmlhbCBwb3J0IGNvbm5lY3RvciwgYW5kIGNhbgorCSAgY3VycmVudGx5IG9ubHkgYmUgdXNlZCBieSBJclRUWS4gIFRvIGFjdGl2YXRlIHN1cHBvcnQgZm9yIFRla3JhbQorCSAgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIHN0YXJ0IGlyYXR0YWNoIGxpa2UgdGhpczoKKwkgICJpcmF0dGFjaCAtZCB0ZWtyYW0iLgorCitjb25maWcgR0lSQklMX0RPTkdMRV9PTEQKKwl0cmlzdGF0ZSAiR3JlZW53aWNoIEdJckJJTCBkb25nbGUiCisJZGVwZW5kcyBvbiBET05HTEVfT0xEICYmIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBHcmVlbndpY2ggR0lyQklMCisJICBkb25nbGUuICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgVGhlIEdyZWVud2ljaAorCSAgZG9uZ2xlIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLCBhbmQgY2FuCisJICBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IgR3JlZW53aWNoCisJICBkb25nbGVzIHlvdSB3aWxsIGhhdmUgdG8gaW5zZXJ0ICJpcmF0dGFjaCAtZCBnaXJiaWwiIGluIHRoZQorCSAgL2V0Yy9pcmRhL2RyaXZlcnMgc2NyaXB0LgorCitjb25maWcgTElURUxJTktfRE9OR0xFX09MRAorCXRyaXN0YXRlICJQYXJhbGxheCBMaXRlTGluayBkb25nbGUiCisJZGVwZW5kcyBvbiBET05HTEVfT0xEICYmIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBQYXJhbGxheCBMaXRlbGluaworCSAgZG9uZ2xlLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIFRoZSBQYXJhbGxheAorCSAgZG9uZ2xlIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLCBhbmQgY2FuCisJICBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IgUGFyYWxsYXgKKwkgIGRvbmdsZXMgeW91IHdpbGwgaGF2ZSB0byBzdGFydCBpcmF0dGFjaCBsaWtlIHRoaXM6CisJICAiaXJhdHRhY2ggLWQgbGl0ZWxpbmsiLgorCitjb25maWcgTUNQMjEyMF9ET05HTEVfT0xECisJdHJpc3RhdGUgIk1pY3JvY2hpcCBNQ1AyMTIwIgorCWRlcGVuZHMgb24gRE9OR0xFX09MRCAmJiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgTWljcm9jaGlwIE1DUDIxMjAKKwkgIGRvbmdsZS4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBUaGUgTUNQMjEyMCBkb25nbGUKKwkgIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLCBhbmQgY2FuCisJICBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IgTUNQMjEyMAorCSAgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIGluc2VydCAiaXJhdHRhY2ggLWQgbWNwMjEyMCIgaW4gdGhlCisJICAvZXRjL2lyZGEvZHJpdmVycyBzY3JpcHQuCisKKwkgIFlvdSBtdXN0IGJ1aWxkIHRoaXMgZG9uZ2xlIHlvdXJzZWxmLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlOgorCSAgPGh0dHA6Ly93d3cuZXlldGFwLm9yZy9+dGFuZ2YvaXJkYV9zaXJfbGludXguaHRtbD4KKworY29uZmlnIE9MRF9CRUxLSU5fRE9OR0xFX09MRAorCXRyaXN0YXRlICJPbGQgQmVsa2luIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRV9PTEQgJiYgSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIEFkYXB0ZWMgQWlycG9ydCAxMDAwCisJICBhbmQgMjAwMCBkb25nbGVzLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgb2xkX2JlbGtpbi4gIFNvbWUgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIGluIHRoZQorCSAgY29tbWVudHMgYXQgdGhlIHRvcCBvZiA8ZmlsZTpkcml2ZXJzL25ldC9pcmRhL29sZF9iZWxraW4uYz4uCisKK2NvbmZpZyBBQ1QyMDBMX0RPTkdMRV9PTEQKKwl0cmlzdGF0ZSAiQUNUaVNZUyBJUi0yMDBMIGRvbmdsZSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIERPTkdMRV9PTEQgJiYgRVhQRVJJTUVOVEFMICYmIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBBQ1RpU1lTIElSLTIwMEwKKwkgIGRvbmdsZS4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBUaGUgQUNUaVNZUworCSAgSVItMjAwTCBkb25nbGUgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydCBjb25uZWN0b3IsCisJICBhbmQgY2FuIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuIFRvIGFjdGl2YXRlIHN1cHBvcnQgZm9yCisJICBBQ1RpU1lTIElSLTIwMEwgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIHN0YXJ0IGlyYXR0YWNoIGxpa2UgdGhpczoKKwkgICJpcmF0dGFjaCAtZCBhY3QyMDBsIi4KKworY29uZmlnIE1BNjAwX0RPTkdMRV9PTEQKKwl0cmlzdGF0ZSAiTW9iaWxlIEFjdGlvbiBNQTYwMCBkb25nbGUgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBET05HTEVfT0xEICYmIEVYUEVSSU1FTlRBTCAmJiBJUkRBCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgTW9iaWxlIEFjdGlvbiBNQTYwMAorCSAgZG9uZ2xlLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIE1BNjAwIGRvbmdsZQorCSAgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydCBjb25uZWN0b3IsIGFuZCBjYW4KKwkgIGN1cnJlbnRseSBvbmx5IGJlIHRlc3RlZCBvbiBJckNPTU0uICBUbyBhY3RpdmF0ZSBzdXBwb3J0IGZvciBNQTYwMAorCSAgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIGluc2VydCAiaXJhdHRhY2ggLWQgbWE2MDAiIGluIHRoZQorCSAgL2V0Yy9pcmRhL2RyaXZlcnMgc2NyaXB0LiAgTm90ZTogaXJ1dGlscyAwLjkuMTUgcmVxdWlyZXMgbm8KKwkgIG1vZGlmaWNhdGlvbi4gaXJ1dGlscyAwLjkuOSBuZWVkcyBtb2RpZmljYXRpb24uIEZvciBtb3JlCisJICBpbmZvcm1hdGlvbiwgZG93bmxvYWQgdGhlIGZvbGxvd2luZyB0YXIgZ3ppcCBmaWxlLgorCisJICBUaGVyZSBpcyBhIHByZS1jb21waWxlZCBtb2R1bGUgb24KKwkgIDxodHRwOi8vZW5nc3ZyLnVzdC5oay9+ZWV0d2w5NS9tYTYwMC5odG1sPgorCitjb25maWcgRVA3MjExX0lSCisJdHJpc3RhdGUgIkVQNzIxMSBJL1Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERPTkdMRV9PTEQgJiYgQVJDSF9FUDcyMTEgJiYgSVJEQQorCitjb21tZW50ICJGSVIgZGV2aWNlIGRyaXZlcnMiCisKK2NvbmZpZyBVU0JfSVJEQQorCXRyaXN0YXRlICJJckRBIFVTQiBkb25nbGVzIgorCWRlcGVuZHMgb24gSVJEQSAmJiBVU0IKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBVU0IgSXJEQSBGSVIgRG9uZ2xlCisJICBkZXZpY2UgZHJpdmVyLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaXJkYS11c2IuICBJckRBLVVTQiBzdXBwb3J0IHRoZSB2YXJpb3VzIElyREEgVVNCCisJICBkb25nbGVzIGF2YWlsYWJsZSBhbmQgbW9zdCBvZiB0aGVpciBwZWN1bGFyaXRpZXMuICBUaG9zZSBkb25nbGVzCisJICBwbHVnIGluIHRoZSBVU0IgcG9ydCBvZiB5b3VyIGNvbXB1dGVyLCBhcmUgcGx1ZyBhbmQgcGxheSwgYW5kCisJICBzdXBwb3J0IFNJUiBhbmQgRklSICg0TWJwcykgc3BlZWRzLiAgT24gdGhlIG90aGVyIGhhbmQsIHRob3NlCisJICBkb25nbGVzIHRlbmQgdG8gYmUgbGVzcyBlZmZpY2llbnQgdGhhbiBhIEZJUiBjaGlwc2V0LgorCisJICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBkcml2ZXIgaXMgc3RpbGwgZXhwZXJpbWVudGFsLiAgQW5kIG9mIGNvdXJzZSwKKwkgIHlvdSB3aWxsIG5lZWQgYm90aCBVU0IgYW5kIElyREEgc3VwcG9ydCBpbiB5b3VyIGtlcm5lbC4uLgorCitjb25maWcgU0lHTUFURUxfRklSCisJdHJpc3RhdGUgIlNpZ21hVGVsIFNUSXI0MjAwIGJyaWRnZSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIElSREEgJiYgVVNCICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFNpZ21hVGVsIFNUSXI0MjAwCisJICBVU0IgSXJEQSBGSVIgYnJpZGdlIGRldmljZSBkcml2ZXIuICAKKworCSAgVVNCIGJyaWRnZSBiYXNlZCBvbiB0aGUgU2lnbWFUZWwgU1RJcjQyMDAgZG9uJ3QgY29uZm9ybSB0byB0aGUKKwkgIElyREEtVVNCIGRldmljZSBjbGFzcyBzcGVjaWZpY2F0aW9uLCBhbmQgdGhlcmVmb3JlIG5lZWQgdGhlaXIKKwkgIG93biBzcGVjaWZpYyBkcml2ZXIuIFRob3NlIGRvbmdsZXMgc3VwcG9ydCBTSVIgYW5kIEZJUiAoNE1icHMpCisJICBzcGVlZHMuIAorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCisJICBzdGlyNDIwMC4KKworY29uZmlnIE5TQ19GSVIKKwl0cmlzdGF0ZSAiTlNDIFBDODcxMDgvUEM4NzMzOCIKKwlkZXBlbmRzIG9uIElSREEgJiYgSVNBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgTlNDIFBDODcxMDggYW5kCisJICBQQzg3MzM4IElyREEgY2hpcHNldHMuICBUaGlzIGRyaXZlciBzdXBwb3J0cyBTSVIsCisJICBNSVIgYW5kIEZJUiAoNE1icHMpIHNwZWVkcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgbnNjLWlyY2MuCisKK2NvbmZpZyBXSU5CT05EX0ZJUgorCXRyaXN0YXRlICJXaW5ib25kIFc4Mzk3N0FGIChJUikiCisJZGVwZW5kcyBvbiBJUkRBICYmIElTQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgSXJEQSBzdXBwb3J0IGZvciB0aGUgV2luYm9uZAorCSAgVzgzOTc3QUYgc3VwZXItaW8gY2hpcHNldC4gIFRoaXMgZHJpdmVyIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgSXJEQQorCSAgY2hpcHNldCBpbiB0aGUgQ29yZWwgTmV0V2luZGVyLiAgVGhlIGRyaXZlciBzdXBwb3J0cyBTSVIsIE1JUiBhbmQKKwkgIEZJUiAoNE1icHMpIHNwZWVkcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgdzgzOTc3YWZfaXIuCisKK2NvbmZpZyBUT1NISUJBX0ZJUgorCXRyaXN0YXRlICJUb3NoaWJhIFR5cGUtTyBJUiBQb3J0IgorCWRlcGVuZHMgb24gSVJEQSAmJiBQQ0kgJiYgITY0QklUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgVG9zaGliYSBUeXBlLU8gSVIKKwkgIGFuZCBEb25hdSBvYm9lIGNoaXBzZXRzLiBUaGVzZSBjaGlwc2V0cyBhcmUgdXNlZCBieSB0aGUgVG9zaGliYQorCSAgTGlicmV0dG8gMTAwLzExMENULCBUZWNyYSA4MTAwLCBQb3J0ZWdlIDcwMjAgYW5kIG1hbnkgbW9yZSBsYXB0b3BzLgorCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgZG9uYXVib2UuCisKK2NvbmZpZyBBVTEwMDBfRklSCisJdHJpc3RhdGUgIkFsY2hlbXkgQXUxMDAwIFNJUi9GSVIiCisJZGVwZW5kcyBvbiBNSVBTX0FVMTAwMCAmJiBJUkRBCisKK2NvbmZpZyBTTUNfSVJDQ19GSVIKKwl0cmlzdGF0ZSAiU01TQyBJckNDIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIElSREEgJiYgSVNBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgU01DIEluZnJhcmVkCisJICBDb21tdW5pY2F0aW9ucyBDb250cm9sbGVyLiAgSXQgaXMgdXNlZCBpbiBhIHdpZGUgdmFyaWV0eSBvZgorCSAgbGFwdG9wcyAoRnVqaXRzdSwgU29ueSwgQ29tcGFxIGFuZCBzb21lIFRvc2hpYmEpLgorCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgc21zYy1pcmNjMi5vLgorCitjb25maWcgQUxJX0ZJUgorCXRyaXN0YXRlICJBTGkgTTUxMjMgRklSIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIElSREEgJiYgSVNBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgQUxpIE01MTIzIEZJUgorCSAgQ29udHJvbGxlci4gIFRoZSBBTGkgTTUxMjMgRklSIENvbnRyb2xsZXIgaXMgZW1iZWRkZWQgaW4gQUxpIE0xNTQzQywKKwkgIE0xNTM1LCBNMTUzNUQsIE0xNTM1KywgTTE1MzVEIFNvdXJ0aCBCcmlkZ2UuICBUaGlzIGRyaXZlciBzdXBwb3J0cworCSAgU0lSLCBNSVIgYW5kIEZJUiAoNE1icHMpIHNwZWVkcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgYWxpLWlyY2MuCisKK2NvbmZpZyBWTFNJX0ZJUgorCXRyaXN0YXRlICJWTFNJIDgyQzE0NyBTSVIvTUlSL0ZJUiAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBJUkRBICYmIFBDSQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFZMU0kgODJDMTQ3CisJICBQQ0ktSXJEQSBDb250cm9sbGVyLiBUaGlzIGNvbnRyb2xsZXIgaXMgdXNlZCBieSB0aGUgSFAgT21uaUJvb2sgODAwCisJICBhbmQgNTUwMCBub3RlYm9va3MuIFRoZSBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgU0lSLCBNSVIgYW5kCisJICBGSVIgKDRNYnBzKSBzcGVlZHMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIHZsc2lfaXIuCisKK2NvbmZpZyBTQTExMDBfRklSCisJdHJpc3RhdGUgIlNBMTEwMCBJbnRlcm5hbCBJUiIKKwlkZXBlbmRzIG9uIEFSQ0hfU0ExMTAwICYmIElSREEKKworY29uZmlnIFZJQV9GSVIKKwl0cmlzdGF0ZSAiVklBIFZUODIzMS9WVDEyMTEgU0lSL01JUi9GSVIiCisJZGVwZW5kcyBvbiBJUkRBICYmIElTQSAmJiBQQ0kKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBWSUEgVlQ4MjMxCisJICBhbmQgVklBIFZUMTIxMSBJckRBIGNvbnRyb2xsZXJzLCBmb3VuZCBvbiB0aGUgbW90aGVyYm9hcmRzIHVzaW5nCisJICB0aG9zZSB0aG9zZSBWSUEgY2hpcHNldHMuIFRvIHVzZSB0aGlzIGNvbnRyb2xsZXIsIHlvdSB3aWxsIG5lZWQKKwkgIHRvIHBsdWcgYSBzcGVjaWZpYyA1IHBpbnMgRklSIElyREEgZG9uZ2xlIGluIHRoZSBzcGVjaWZpYworCSAgbW90aGVyYm9hcmQgY29ubmVjdG9yLiBUaGUgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIFNJUiwgTUlSCisJICBhbmQgRklSICg0TWJwcykgc3BlZWRzLgorCisJICBZb3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgdGhlICdkb25nbGVfaWQnIG1vZHVsZSBwYXJhbWV0ZXIgdG8KKwkgIGluZGljYXRlIHRoZSBGSVIgZG9uZ2xlIGF0dGFjaGVkIHRvIHRoZSBjb250cm9sbGVyLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCisJICB2aWEtaXJjYy4KKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvaXJkYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWE4YmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggSXJEQSBpbmZyYXJlZCBwb3J0IGRldmljZSBkcml2ZXJzLgorIworIyA5IEF1ZyAyMDAwLCBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGluZnJhZGVhZC5vcmc+CisjIFJld3JpdHRlbiB0byB1c2UgbGlzdHMgaW5zdGVhZCBvZiBpZi1zdGF0ZW1lbnRzLgorIworCisjIE9sZCBTSVIgZHJpdmVycyAKK29iai0kKENPTkZJR19JUlBPUlRfU0lSKQkrPSAJCWlycG9ydC5vCisjIEZJUiBkcml2ZXJzCitvYmotJChDT05GSUdfVVNCX0lSREEpCQkrPSBpcmRhLXVzYi5vCitvYmotJChDT05GSUdfU0lHTUFURUxfRklSKQkrPSBzdGlyNDIwMC5vCitvYmotJChDT05GSUdfTlNDX0ZJUikJCSs9IG5zYy1pcmNjLm8KK29iai0kKENPTkZJR19XSU5CT05EX0ZJUikJKz0gdzgzOTc3YWZfaXIubworb2JqLSQoQ09ORklHX1NBMTEwMF9GSVIpCSs9IHNhMTEwMF9pci5vCitvYmotJChDT05GSUdfVE9TSElCQV9GSVIpCSs9IGRvbmF1Ym9lLm8KK29iai0kKENPTkZJR19TTUNfSVJDQ19GSVIpCSs9IHNtc2MtaXJjYzIubworb2JqLSQoQ09ORklHX0FMSV9GSVIpCQkrPSBhbGktaXJjYy5vCitvYmotJChDT05GSUdfVkxTSV9GSVIpCQkrPSB2bHNpX2lyLm8KK29iai0kKENPTkZJR19WSUFfRklSKQkJKz0gdmlhLWlyY2MubworIyBPbGQgZG9uZ2xlIGRyaXZlcnMgZm9yIG9sZCBTSVIgZHJpdmVycworb2JqLSQoQ09ORklHX0VTSV9ET05HTEVfT0xEKQkJKz0gZXNpLm8KK29iai0kKENPTkZJR19URUtSQU1fRE9OR0xFX09MRCkJKz0gdGVrcmFtLm8KK29iai0kKENPTkZJR19BQ1RJU1lTX0RPTkdMRV9PTEQpCSs9IGFjdGlzeXMubworb2JqLSQoQ09ORklHX0dJUkJJTF9ET05HTEVfT0xEKQkrPSBnaXJiaWwubworb2JqLSQoQ09ORklHX0xJVEVMSU5LX0RPTkdMRV9PTEQpCSs9IGxpdGVsaW5rLm8KK29iai0kKENPTkZJR19PTERfQkVMS0lOX0RPTkdMRV9PTEQpCSs9IG9sZF9iZWxraW4ubworb2JqLSQoQ09ORklHX01DUDIxMjBfRE9OR0xFX09MRCkJKz0gbWNwMjEyMC5vCitvYmotJChDT05GSUdfQUNUMjAwTF9ET05HTEVfT0xEKQkrPSBhY3QyMDBsLm8KK29iai0kKENPTkZJR19NQTYwMF9ET05HTEVfT0xEKQkrPSBtYTYwMC5vCitvYmotJChDT05GSUdfRVA3MjExX0lSKQkJKz0gZXA3MjExX2lyLm8KK29iai0kKENPTkZJR19BVTEwMDBfRklSKQkrPSBhdTFrX2lyLm8KKyMgTmV3IFNJUiBkcml2ZXJzCitvYmotJChDT05GSUdfSVJUVFlfU0lSKQkJKz0gaXJ0dHktc2lyLm8Jc2lyLWRldi5vCisjIE5ldyBkb25nbGVzIGRyaXZlcnMgZm9yIG5ldyBTSVIgZHJpdmVycworb2JqLSQoQ09ORklHX0VTSV9ET05HTEUpCSs9IGVzaS1zaXIubworb2JqLSQoQ09ORklHX1RFS1JBTV9ET05HTEUpCSs9IHRla3JhbS1zaXIubworb2JqLSQoQ09ORklHX0FDVElTWVNfRE9OR0xFKQkrPSBhY3Rpc3lzLXNpci5vCitvYmotJChDT05GSUdfTElURUxJTktfRE9OR0xFKQkrPSBsaXRlbGluay1zaXIubworb2JqLSQoQ09ORklHX0dJUkJJTF9ET05HTEUpCSs9IGdpcmJpbC1zaXIubworb2JqLSQoQ09ORklHX09MRF9CRUxLSU5fRE9OR0xFKQkrPSBvbGRfYmVsa2luLXNpci5vCitvYmotJChDT05GSUdfTUNQMjEyMF9ET05HTEUpCSs9IG1jcDIxMjAtc2lyLm8KK29iai0kKENPTkZJR19BQ1QyMDBMX0RPTkdMRSkJKz0gYWN0MjAwbC1zaXIubworb2JqLSQoQ09ORklHX01BNjAwX0RPTkdMRSkJKz0gbWE2MDAtc2lyLm8KKworIyBUaGUgU0lSIGhlbHBlciBtb2R1bGUKK3Npci1kZXYtb2JqcyA6PSBzaXJfY29yZS5vIHNpcl9kZXYubyBzaXJfZG9uZ2xlLm8gc2lyX2t0aHJlYWQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9hY3QyMDBsLXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS9hY3QyMDBsLXNpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Yjg5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2FjdDIwMGwtc2lyLmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgICBhY3QyMDBsLmMKKyAqIFZlcnNpb246ICAgICAgIDAuOAorICogRGVzY3JpcHRpb246ICAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBBQ1RpU1lTIEFDVC1JUjIwMEwgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBTSElNSVpVIFRha3V5YSA8dHNoaW1penVAZ2EyLnNvLW5ldC5uZS5qcD4KKyAqIENyZWF0ZWQgYXQ6ICAgIEZyaSBBdWcgIDMgMTc6MzU6NDIgMjAwMQorICogTW9kaWZpZWQgYXQ6ICAgRnJpIEF1ZyAxNyAxMDoyMjo0MCAyMDAxCisgKiBNb2RpZmllZCBieTogICBTSElNSVpVIFRha3V5YSA8dHNoaW1penVAZ2EyLnNvLW5ldC5uZS5qcD4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAxIFNISU1JWlUgVGFrdXlhLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorCisjaW5jbHVkZSAic2lyLWRldi5oIgorCitzdGF0aWMgaW50IGFjdDIwMGxfcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldik7CitzdGF0aWMgaW50IGFjdDIwMGxfb3BlbihzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgYWN0MjAwbF9jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgYWN0MjAwbF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpOworCisvKiBSZWdzaXRlciAwOiBDb250cm9sIHJlZ2lzdGVyICMxICovCisjZGVmaW5lIEFDVDIwMExfUkVHMCAgICAweDAwCisjZGVmaW5lIEFDVDIwMExfVFhFTiAgICAweDAxIC8qIEVuYWJsZSB0cmFuc21pdHRlciAqLworI2RlZmluZSBBQ1QyMDBMX1JYRU4gICAgMHgwMiAvKiBFbmFibGUgcmVjZWl2ZXIgKi8KKworLyogUmVnaXN0ZXIgMTogQ29udHJvbCByZWdpc3RlciAjMiAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzEgICAgMHgxMAorI2RlZmluZSBBQ1QyMDBMX0xPREIgICAgMHgwMSAvKiBMb2FkIG5ldyBiYXVkIHJhdGUgY291bnQgdmFsdWUgKi8KKyNkZWZpbmUgQUNUMjAwTF9XSURFICAgIDB4MDQgLyogRXhwYW5kIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBwdWxzZSAqLworCisvKiBSZWdpc3RlciA0OiBPdXRwdXQgUG93ZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc0ICAgIDB4NDAKKyNkZWZpbmUgQUNUMjAwTF9PUDAgICAgIDB4MDEgLyogRW5hYmxlIExFRDFDIG91dHB1dCAqLworI2RlZmluZSBBQ1QyMDBMX09QMSAgICAgMHgwMiAvKiBFbmFibGUgTEVEMkMgb3V0cHV0ICovCisjZGVmaW5lIEFDVDIwMExfQkxLUiAgICAweDA0CisKKy8qIFJlZ2lzdGVyIDU6IFJlY2VpdmUgTW9kZSByZWdpc3RlciAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzUgICAgMHg1MAorI2RlZmluZSBBQ1QyMDBMX1JXSURMICAgMHgwMSAvKiBmaXhlZCAxLjZ1cyBwdWxzZSBtb2RlICovCisKKy8qIFJlZ2lzdGVyIDY6IFJlY2VpdmUgU2Vuc2l0aXZpdHkgcmVnaXN0ZXIgIzEgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc2ICAgIDB4NjAKKyNkZWZpbmUgQUNUMjAwTF9SUzAgICAgIDB4MDEgLyogcmVjZWl2ZSB0aHJlc2hvbGQgYml0IDAgKi8KKyNkZWZpbmUgQUNUMjAwTF9SUzEgICAgIDB4MDIgLyogcmVjZWl2ZSB0aHJlc2hvbGQgYml0IDEgKi8KKworLyogUmVnaXN0ZXIgNzogUmVjZWl2ZSBTZW5zaXRpdml0eSByZWdpc3RlciAjMiAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzcgICAgMHg3MAorI2RlZmluZSBBQ1QyMDBMX0VOUE9TICAgMHgwNCAvKiBJZ25vcmUgdGhlIGZhbGxpbmcgZWRnZSAqLworCisvKiBSZWdpc3RlciA4LDk6IEJhdWQgUmF0ZSBEdmlkZXIgcmVnaXN0ZXIgIzEsIzIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc4ICAgIDB4ODAKKyNkZWZpbmUgQUNUMjAwTF9SRUc5ICAgIDB4OTAKKworI2RlZmluZSBBQ1QyMDBMXzI0MDAgICAgMHg1ZgorI2RlZmluZSBBQ1QyMDBMXzk2MDAgICAgMHgxNworI2RlZmluZSBBQ1QyMDBMXzE5MjAwICAgMHgwYgorI2RlZmluZSBBQ1QyMDBMXzM4NDAwICAgMHgwNQorI2RlZmluZSBBQ1QyMDBMXzU3NjAwICAgMHgwMworI2RlZmluZSBBQ1QyMDBMXzExNTIwMCAgMHgwMQorCisvKiBSZWdpc3RlciAxMzogQ29udHJvbCByZWdpc3RlciAjMyAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzEzICAgMHhkMAorI2RlZmluZSBBQ1QyMDBMX1NIRFcgICAgMHgwMSAvKiBFbmFibGUgYWNjZXNzIHRvIHNoYWRvdyByZWdpc3RlcnMgKi8KKworLyogUmVnaXN0ZXIgMTU6IFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzE1ICAgMHhmMAorCisvKiBSZWdpc3RlciAyMTogQ29udHJvbCByZWdpc3RlciAjNCAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzIxICAgMHg1MAorI2RlZmluZSBBQ1QyMDBMX0VYQ0sgICAgMHgwMiAvKiBEaXNhYmxlIGNsb2NrIG91dHB1dCBkcml2ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9PU0NMICAgIDB4MDQgLyogb3NjaWxsYXRvciBpbiBsb3cgcG93ZXIsIG1lZGl1bSBhY2N1cmFjeSBtb2RlICovCisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX2RyaXZlciBhY3QyMDBsID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJPSAiQUNUaVNZUyBBQ1QtSVIyMDBMIiwKKwkudHlwZQkJPSBJUkRBX0FDVDIwMExfRE9OR0xFLAorCS5vcGVuCQk9IGFjdDIwMGxfb3BlbiwKKwkuY2xvc2UJCT0gYWN0MjAwbF9jbG9zZSwKKwkucmVzZXQJCT0gYWN0MjAwbF9yZXNldCwKKwkuc2V0X3NwZWVkCT0gYWN0MjAwbF9jaGFuZ2Vfc3BlZWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhY3QyMDBsX3Npcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKCZhY3QyMDBsKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFjdDIwMGxfc2lyX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZhY3QyMDBsKTsKK30KKworc3RhdGljIGludCBhY3QyMDBsX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcW9zX2luZm8gKnFvcyA9ICZkZXYtPnFvczsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogUG93ZXIgb24gdGhlIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCisJLyogU2V0IHRoZSBzcGVlZHMgd2UgY2FuIGFjY2VwdCAqLworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAzOworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUocW9zKTsKKworCS8qIGlyZGEgdGhyZWFkIHdhaXRzIDUwIG1zZWMgZm9yIHBvd2VyIHNldHRsaW5nICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY3QyMDBsX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBQb3dlciBvZmYgdGhlIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFjdDIwMGxfY2hhbmdlX3NwZWVkIChkZXYsIHNwZWVkKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBBQ1RpU1lTIEFDVC1JUjIwMEwgdHlwZSBkb25nbGUuCisgKgorICovCitzdGF0aWMgaW50IGFjdDIwMGxfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKQoreworCXU4IGNvbnRyb2xbM107CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIENsZWFyIERUUiBhbmQgc2V0IFJUUyB0byBlbnRlciBjb21tYW5kIG1vZGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgVFJVRSk7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSA5NjAwOgorCQljb250cm9sWzBdID0gQUNUMjAwTF9SRUc4IHwgIChBQ1QyMDBMXzk2MDAgICAgICAgJiAweDBmKTsKKwkJY29udHJvbFsxXSA9IEFDVDIwMExfUkVHOSB8ICgoQUNUMjAwTF85NjAwID4+IDQpICYgMHgwZik7CisJCWJyZWFrOworCWNhc2UgMTkyMDA6CisJCWNvbnRyb2xbMF0gPSBBQ1QyMDBMX1JFRzggfCAgKEFDVDIwMExfMTkyMDAgICAgICAgJiAweDBmKTsKKwkJY29udHJvbFsxXSA9IEFDVDIwMExfUkVHOSB8ICgoQUNUMjAwTF8xOTIwMCA+PiA0KSAmIDB4MGYpOworCQlicmVhazsKKwljYXNlIDM4NDAwOgorCQljb250cm9sWzBdID0gQUNUMjAwTF9SRUc4IHwgIChBQ1QyMDBMXzM4NDAwICAgICAgICYgMHgwZik7CisJCWNvbnRyb2xbMV0gPSBBQ1QyMDBMX1JFRzkgfCAoKEFDVDIwMExfMzg0MDAgPj4gNCkgJiAweDBmKTsKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDoKKwkJY29udHJvbFswXSA9IEFDVDIwMExfUkVHOCB8ICAoQUNUMjAwTF81NzYwMCAgICAgICAmIDB4MGYpOworCQljb250cm9sWzFdID0gQUNUMjAwTF9SRUc5IHwgKChBQ1QyMDBMXzU3NjAwID4+IDQpICYgMHgwZik7CisJCWJyZWFrOworCWNhc2UgMTE1MjAwOgorCQljb250cm9sWzBdID0gQUNUMjAwTF9SRUc4IHwgIChBQ1QyMDBMXzExNTIwMCAgICAgICAmIDB4MGYpOworCQljb250cm9sWzFdID0gQUNUMjAwTF9SRUc5IHwgKChBQ1QyMDBMXzExNTIwMCA+PiA0KSAmIDB4MGYpOworCQlicmVhazsKKwl9CisJY29udHJvbFsyXSA9IEFDVDIwMExfUkVHMSB8IEFDVDIwMExfTE9EQiB8IEFDVDIwMExfV0lERTsKKworCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZXMgKi8KKwlzaXJkZXZfcmF3X3dyaXRlKGRldiwgY29udHJvbCwgMyk7CisJbXNsZWVwKDUpOworCisJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCisJZGV2LT5zcGVlZCA9IHNwZWVkOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhY3QyMDBsX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgUmVzZXQgdGhlIEFDVGlTWVMgQUNULUlSMjAwTCB0eXBlIGRvbmdsZS4KKyAqLworCisjZGVmaW5lIEFDVDIwMExfU1RBVEVfV0FJVDFfUkVTRVQJKFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQrMSkKKyNkZWZpbmUgQUNUMjAwTF9TVEFURV9XQUlUMl9SRVNFVAkoU0lSREVWX1NUQVRFX0RPTkdMRV9SRVNFVCsyKQorCitzdGF0aWMgaW50IGFjdDIwMGxfcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBzdGF0ZSA9IGRldi0+ZnNtLnN1YnN0YXRlOworCXVuc2lnbmVkIGRlbGF5ID0gMDsKKwl1OCBjb250cm9sWzldID0geworCQlBQ1QyMDBMX1JFRzE1LAorCQlBQ1QyMDBMX1JFRzEzIHwgQUNUMjAwTF9TSERXLAorCQlBQ1QyMDBMX1JFRzIxIHwgQUNUMjAwTF9FWENLIHwgQUNUMjAwTF9PU0NMLAorCQlBQ1QyMDBMX1JFRzEzLAorCQlBQ1QyMDBMX1JFRzcgIHwgQUNUMjAwTF9FTlBPUywKKwkJQUNUMjAwTF9SRUc2ICB8IEFDVDIwMExfUlMwICB8IEFDVDIwMExfUlMxLAorCQlBQ1QyMDBMX1JFRzUgIHwgQUNUMjAwTF9SV0lETCwKKwkJQUNUMjAwTF9SRUc0ICB8IEFDVDIwMExfT1AwICB8IEFDVDIwMExfT1AxIHwgQUNUMjAwTF9CTEtSLAorCQlBQ1QyMDBMX1JFRzAgIHwgQUNUMjAwTF9UWEVOIHwgQUNUMjAwTF9SWEVOCisJfTsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0lSREVWX1NUQVRFX0RPTkdMRV9SRVNFVDoKKwkJLyogUmVzZXQgdGhlIGRvbmdsZSA6IHNldCBSVFMgbG93IGZvciAyNSBtcyAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBGQUxTRSk7CisJCXN0YXRlID0gQUNUMjAwTF9TVEFURV9XQUlUMV9SRVNFVDsKKwkJZGVsYXkgPSA1MDsKKwkJYnJlYWs7CisKKwljYXNlIEFDVDIwMExfU1RBVEVfV0FJVDFfUkVTRVQ6CisJCS8qIENsZWFyIERUUiBhbmQgc2V0IFJUUyB0byBlbnRlciBjb21tYW5kIG1vZGUgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIFRSVUUpOworCisJCXVkZWxheSgyNSk7CQkJLyogYmV0dGVyIHdhaXQgZm9yIHNvbWUgc2hvcnQgd2hpbGUgKi8KKworCQkvKiBXcml0ZSBjb250cm9sIGJ5dGVzICovCisJCXNpcmRldl9yYXdfd3JpdGUoZGV2LCBjb250cm9sLCBzaXplb2YoY29udHJvbCkpOworCQlzdGF0ZSA9IEFDVDIwMExfU1RBVEVfV0FJVDJfUkVTRVQ7CisJCWRlbGF5ID0gMTU7CisJCWJyZWFrOworCisJY2FzZSBBQ1QyMDBMX1NUQVRFX1dBSVQyX1JFU0VUOgorCQkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCQlkZXYtPnNwZWVkID0gOTYwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0ZSk7CisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJZGV2LT5mc20uc3Vic3RhdGUgPSBzdGF0ZTsKKwlyZXR1cm4gKGRlbGF5ID4gMCkgPyBkZWxheSA6IHJldDsKK30KKworTU9EVUxFX0FVVEhPUigiU0hJTUlaVSBUYWt1eWEgPHRzaGltaXp1QGdhMi5zby1uZXQubmUuanA+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDVGlTWVMgQUNULUlSMjAwTCBkb25nbGUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTEwIik7IC8qIElSREFfQUNUMjAwTF9ET05HTEUgKi8KKworbW9kdWxlX2luaXQoYWN0MjAwbF9zaXJfaW5pdCk7Cittb2R1bGVfZXhpdChhY3QyMDBsX3Npcl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYWN0MjAwbC5jIGIvZHJpdmVycy9uZXQvaXJkYS9hY3QyMDBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2Y2Q0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYWN0MjAwbC5jCkBAIC0wLDAgKzEsMjk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgYWN0MjAwbC5jCisgKiBWZXJzaW9uOiAgICAgICAwLjgKKyAqIERlc2NyaXB0aW9uOiAgIEltcGxlbWVudGF0aW9uIGZvciB0aGUgQUNUaVNZUyBBQ1QtSVIyMDBMIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgU0hJTUlaVSBUYWt1eWEgPHRzaGltaXp1QGdhMi5zby1uZXQubmUuanA+CisgKiBDcmVhdGVkIGF0OiAgICBGcmkgQXVnICAzIDE3OjM1OjQyIDIwMDEKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBBdWcgMTcgMTA6MjI6NDAgMjAwMQorICogTW9kaWZpZWQgYnk6ICAgU0hJTUlaVSBUYWt1eWEgPHRzaGltaXp1QGdhMi5zby1uZXQubmUuanA+CisgKgorICogICAgIENvcHlyaWdodCAoYykgMjAwMSBTSElNSVpVIFRha3V5YSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCitzdGF0aWMgaW50ICBhY3QyMDBsX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworc3RhdGljIHZvaWQgYWN0MjAwbF9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CitzdGF0aWMgdm9pZCBhY3QyMDBsX2Nsb3NlKGRvbmdsZV90ICpzZWxmKTsKK3N0YXRpYyBpbnQgIGFjdDIwMGxfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworCisvKiBSZWdzaXRlciAwOiBDb250cm9sIHJlZ2lzdGVyICMxICovCisjZGVmaW5lIEFDVDIwMExfUkVHMCAgICAweDAwCisjZGVmaW5lIEFDVDIwMExfVFhFTiAgICAweDAxIC8qIEVuYWJsZSB0cmFuc21pdHRlciAqLworI2RlZmluZSBBQ1QyMDBMX1JYRU4gICAgMHgwMiAvKiBFbmFibGUgcmVjZWl2ZXIgKi8KKworLyogUmVnaXN0ZXIgMTogQ29udHJvbCByZWdpc3RlciAjMiAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzEgICAgMHgxMAorI2RlZmluZSBBQ1QyMDBMX0xPREIgICAgMHgwMSAvKiBMb2FkIG5ldyBiYXVkIHJhdGUgY291bnQgdmFsdWUgKi8KKyNkZWZpbmUgQUNUMjAwTF9XSURFICAgIDB4MDQgLyogRXhwYW5kIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBwdWxzZSAqLworCisvKiBSZWdpc3RlciA0OiBPdXRwdXQgUG93ZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc0ICAgIDB4NDAKKyNkZWZpbmUgQUNUMjAwTF9PUDAgICAgIDB4MDEgLyogRW5hYmxlIExFRDFDIG91dHB1dCAqLworI2RlZmluZSBBQ1QyMDBMX09QMSAgICAgMHgwMiAvKiBFbmFibGUgTEVEMkMgb3V0cHV0ICovCisjZGVmaW5lIEFDVDIwMExfQkxLUiAgICAweDA0CisKKy8qIFJlZ2lzdGVyIDU6IFJlY2VpdmUgTW9kZSByZWdpc3RlciAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzUgICAgMHg1MAorI2RlZmluZSBBQ1QyMDBMX1JXSURMICAgMHgwMSAvKiBmaXhlZCAxLjZ1cyBwdWxzZSBtb2RlICovCisKKy8qIFJlZ2lzdGVyIDY6IFJlY2VpdmUgU2Vuc2l0aXZpdHkgcmVnaXN0ZXIgIzEgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc2ICAgIDB4NjAKKyNkZWZpbmUgQUNUMjAwTF9SUzAgICAgIDB4MDEgLyogcmVjZWl2ZSB0aHJlc2hvbGQgYml0IDAgKi8KKyNkZWZpbmUgQUNUMjAwTF9SUzEgICAgIDB4MDIgLyogcmVjZWl2ZSB0aHJlc2hvbGQgYml0IDEgKi8KKworLyogUmVnaXN0ZXIgNzogUmVjZWl2ZSBTZW5zaXRpdml0eSByZWdpc3RlciAjMiAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzcgICAgMHg3MAorI2RlZmluZSBBQ1QyMDBMX0VOUE9TICAgMHgwNCAvKiBJZ25vcmUgdGhlIGZhbGxpbmcgZWRnZSAqLworCisvKiBSZWdpc3RlciA4LDk6IEJhdWQgUmF0ZSBEdmlkZXIgcmVnaXN0ZXIgIzEsIzIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc4ICAgIDB4ODAKKyNkZWZpbmUgQUNUMjAwTF9SRUc5ICAgIDB4OTAKKworI2RlZmluZSBBQ1QyMDBMXzI0MDAgICAgMHg1ZgorI2RlZmluZSBBQ1QyMDBMXzk2MDAgICAgMHgxNworI2RlZmluZSBBQ1QyMDBMXzE5MjAwICAgMHgwYgorI2RlZmluZSBBQ1QyMDBMXzM4NDAwICAgMHgwNQorI2RlZmluZSBBQ1QyMDBMXzU3NjAwICAgMHgwMworI2RlZmluZSBBQ1QyMDBMXzExNTIwMCAgMHgwMQorCisvKiBSZWdpc3RlciAxMzogQ29udHJvbCByZWdpc3RlciAjMyAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzEzICAgMHhkMAorI2RlZmluZSBBQ1QyMDBMX1NIRFcgICAgMHgwMSAvKiBFbmFibGUgYWNjZXNzIHRvIHNoYWRvdyByZWdpc3RlcnMgKi8KKworLyogUmVnaXN0ZXIgMTU6IFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzE1ICAgMHhmMAorCisvKiBSZWdpc3RlciAyMTogQ29udHJvbCByZWdpc3RlciAjNCAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzIxICAgMHg1MAorI2RlZmluZSBBQ1QyMDBMX0VYQ0sgICAgMHgwMiAvKiBEaXNhYmxlIGNsb2NrIG91dHB1dCBkcml2ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9PU0NMICAgIDB4MDQgLyogb3NjaWxsYXRvciBpbiBsb3cgcG93ZXIsIG1lZGl1bSBhY2N1cmFjeSBtb2RlICovCisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX3JlZyBkb25nbGUgPSB7CisJLnR5cGUgPSBJUkRBX0FDVDIwMExfRE9OR0xFLAorCS5vcGVuID0gYWN0MjAwbF9vcGVuLAorCS5jbG9zZSA9IGFjdDIwMGxfY2xvc2UsCisJLnJlc2V0ID0gYWN0MjAwbF9yZXNldCwKKwkuY2hhbmdlX3NwZWVkID0gYWN0MjAwbF9jaGFuZ2Vfc3BlZWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhY3QyMDBsX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWN0MjAwbF9jbGVhbnVwKHZvaWQpCit7CisJaXJkYV9kZXZpY2VfdW5yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFjdDIwMGxfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBQb3dlciBvbiB0aGUgZG9uZ2xlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKworCS8qIFNldCB0aGUgc3BlZWRzIHdlIGNhbiBhY2NlcHQgKi8KKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMzsKK30KKworc3RhdGljIHZvaWQgYWN0MjAwbF9jbG9zZShkb25nbGVfdCAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIFBvd2VyIG9mZiB0aGUgZG9uZ2xlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworfQorCisvKgorICogRnVuY3Rpb24gYWN0MjAwbF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIEFDVGlTWVMgQUNULUlSMjAwTCB0eXBlIGRvbmdsZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgYWN0MjAwbF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwlfX3UzMiBzcGVlZCA9IChfX3UzMikgdGFzay0+cGFyYW07CisJX191OCBjb250cm9sWzNdOworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlzZWxmLT5zcGVlZF90YXNrID0gdGFzazsKKworCXN3aXRjaCAodGFzay0+c3RhdGUpIHsKKwljYXNlIElSREFfVEFTS19JTklUOgorCQlpZiAoaXJkYV90YXNrX2V4ZWN1dGUoc2VsZiwgYWN0MjAwbF9yZXNldCwgTlVMTCwgdGFzaywKKwkJCQkodm9pZCAqKSBzcGVlZCkpCisJCXsKKwkJCS8qIERvbmdsZSBuZWVkIG1vcmUgdGltZSB0byByZXNldCAqLworCQkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0NISUxEX1dBSVQpOworCisJCQkvKiBHaXZlIHJlc2V0IDEgc2VjIHRvIGZpbmlzaCAqLworCQkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxMDAwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIElSREFfVEFTS19DSElMRF9XQUlUOgorCQlJUkRBX1dBUk5JTkcoIiVzKCksIHJlc2V0dGluZyBkb25nbGUgdGltZWQgb3V0IVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX0NISUxEX0RPTkU6CisJCS8qIENsZWFyIERUUiBhbmQgc2V0IFJUUyB0byBlbnRlciBjb21tYW5kIG1vZGUgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgVFJVRSk7CisKKwkJc3dpdGNoIChzcGVlZCkgeworCQljYXNlIDk2MDA6CisJCWRlZmF1bHQ6CisJCQljb250cm9sWzBdID0gQUNUMjAwTF9SRUc4IHwgIChBQ1QyMDBMXzk2MDAgICAgICAgJiAweDBmKTsKKwkJCWNvbnRyb2xbMV0gPSBBQ1QyMDBMX1JFRzkgfCAoKEFDVDIwMExfOTYwMCA+PiA0KSAmIDB4MGYpOworCQkJYnJlYWs7CisJCWNhc2UgMTkyMDA6CisJCQljb250cm9sWzBdID0gQUNUMjAwTF9SRUc4IHwgIChBQ1QyMDBMXzE5MjAwICAgICAgICYgMHgwZik7CisJCQljb250cm9sWzFdID0gQUNUMjAwTF9SRUc5IHwgKChBQ1QyMDBMXzE5MjAwID4+IDQpICYgMHgwZik7CisJCQlicmVhazsKKwkJY2FzZSAzODQwMDoKKwkJCWNvbnRyb2xbMF0gPSBBQ1QyMDBMX1JFRzggfCAgKEFDVDIwMExfMzg0MDAgICAgICAgJiAweDBmKTsKKwkJCWNvbnRyb2xbMV0gPSBBQ1QyMDBMX1JFRzkgfCAoKEFDVDIwMExfMzg0MDAgPj4gNCkgJiAweDBmKTsKKwkJCWJyZWFrOworCQljYXNlIDU3NjAwOgorCQkJY29udHJvbFswXSA9IEFDVDIwMExfUkVHOCB8ICAoQUNUMjAwTF81NzYwMCAgICAgICAmIDB4MGYpOworCQkJY29udHJvbFsxXSA9IEFDVDIwMExfUkVHOSB8ICgoQUNUMjAwTF81NzYwMCA+PiA0KSAmIDB4MGYpOworCQkJYnJlYWs7CisJCWNhc2UgMTE1MjAwOgorCQkJY29udHJvbFswXSA9IEFDVDIwMExfUkVHOCB8ICAoQUNUMjAwTF8xMTUyMDAgICAgICAgJiAweDBmKTsKKwkJCWNvbnRyb2xbMV0gPSBBQ1QyMDBMX1JFRzkgfCAoKEFDVDIwMExfMTE1MjAwID4+IDQpICYgMHgwZik7CisJCQlicmVhazsKKwkJfQorCQljb250cm9sWzJdID0gQUNUMjAwTF9SRUcxIHwgQUNUMjAwTF9MT0RCIHwgQUNUMjAwTF9XSURFOworCisJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZXMgKi8KKwkJc2VsZi0+d3JpdGUoc2VsZi0+ZGV2LCBjb250cm9sLCAzKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQpOworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDUpOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19XQUlUOgorCQkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5zcGVlZF90YXNrID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgdGFzay0+c3RhdGUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnNwZWVkX3Rhc2sgPSBOVUxMOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhY3QyMDBsX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgUmVzZXQgdGhlIEFDVGlTWVMgQUNULUlSMjAwTCB0eXBlIGRvbmdsZS4KKyAqLworc3RhdGljIGludCBhY3QyMDBsX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJX191OCBjb250cm9sWzldID0geworCQlBQ1QyMDBMX1JFRzE1LAorCQlBQ1QyMDBMX1JFRzEzIHwgQUNUMjAwTF9TSERXLAorCQlBQ1QyMDBMX1JFRzIxIHwgQUNUMjAwTF9FWENLIHwgQUNUMjAwTF9PU0NMLAorCQlBQ1QyMDBMX1JFRzEzLAorCQlBQ1QyMDBMX1JFRzcgIHwgQUNUMjAwTF9FTlBPUywKKwkJQUNUMjAwTF9SRUc2ICB8IEFDVDIwMExfUlMwICB8IEFDVDIwMExfUlMxLAorCQlBQ1QyMDBMX1JFRzUgIHwgQUNUMjAwTF9SV0lETCwKKwkJQUNUMjAwTF9SRUc0ICB8IEFDVDIwMExfT1AwICB8IEFDVDIwMExfT1AxIHwgQUNUMjAwTF9CTEtSLAorCQlBQ1QyMDBMX1JFRzAgIHwgQUNUMjAwTF9UWEVOIHwgQUNUMjAwTF9SWEVOCisJfTsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJc2VsZi0+cmVzZXRfdGFzayA9IHRhc2s7CisKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwkJLyogUG93ZXIgb24gdGhlIGRvbmdsZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUMSk7CisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoNTApOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19XQUlUMToKKwkJLyogUmVzZXQgdGhlIGRvbmdsZSA6IHNldCBSVFMgbG93IGZvciAyNSBtcyAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIEZBTFNFKTsKKworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDIpOworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDUwKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDI6CisJCS8qIENsZWFyIERUUiBhbmQgc2V0IFJUUyB0byBlbnRlciBjb21tYW5kIG1vZGUgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgVFJVRSk7CisKKwkJLyogV3JpdGUgY29udHJvbCBieXRlcyAqLworCQlzZWxmLT53cml0ZShzZWxmLT5kZXYsIGNvbnRyb2wsIDkpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDMpOworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDE1KTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDM6CisJCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCB0YXNrLT5zdGF0ZSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworTU9EVUxFX0FVVEhPUigiU0hJTUlaVSBUYWt1eWEgPHRzaGltaXp1QGdhMi5zby1uZXQubmUuanA+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDVGlTWVMgQUNULUlSMjAwTCBkb25nbGUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTEwIik7IC8qIElSREFfQUNUMjAwTF9ET05HTEUgKi8KKworLyoKKyAqIEZ1bmN0aW9uIGluaXRfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIEluaXRpYWxpemUgQUNUaVNZUyBBQ1QtSVIyMDBMIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2luaXQoYWN0MjAwbF9pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgQUNUaVNZUyBBQ1QtSVIyMDBMIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2V4aXQoYWN0MjAwbF9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYWN0aXN5cy1zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvYWN0aXN5cy1zaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzE1YWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9hY3Rpc3lzLXNpci5jCkBAIC0wLDAgKzEsMjQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGFjdGlzeXMuYworICogVmVyc2lvbjogICAgICAgMS4xCisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEFDVGlTWVMgSVItMjIwTCBhbmQgSVItMjIwTCsgCisgKiAgICAgICAgICAgICAgICBkb25nbGVzCisgKiBTdGF0dXM6ICAgICAgICBCZXRhLgorICogQXV0aG9yczogICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiAoaW5pdGlhbGx5KQorICoJCSAgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPiAobmV3IHZlcnNpb24pCisgKgkJICBNYXJ0aW4gRGllaGwgPG1hZEBtZGllaGwuZGU+IChuZXcgdmVyc2lvbiBmb3Igc2lyX2RldikKKyAqIENyZWF0ZWQgYXQ6ICAgIFdlZCBPY3QgMjEgMjA6MDI6MzUgMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgU3VuIE9jdCAyNyAyMjowMjoxMyAyMDAyCisgKiBNb2RpZmllZCBieTogICBNYXJ0aW4gRGllaGwgPG1hZEBtZGllaGwuZGU+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgSmVhbiBUb3VycmlsaGVzCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAyIE1hcnRpbiBEaWVobAorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDaGFuZ2Vsb2cKKyAqCisgKiAwLjggLT4gMC45OTk5IC0gSmVhbgorICoJbyBOZXcgaW5pdGlhbGlzYXRpb24gcHJvY2VkdXJlIDogbXVjaCBzYWZlciBhbmQgY29ycmVjdAorICoJbyBOZXcgcHJvY2VkdXJlIHRoZSBjaGFuZ2Ugc3BlZWQgOiBtdWNoIGZhc3RlciBhbmQgc2ltcGxlcgorICoJbyBPdGhlciBjbGVhbnVwcyAmIGNvbW1lbnRzCisgKglUaGFua3MgdG8gTGljaGVuIFdhbmcgQCBBY3Rpc3lzIGZvciBoaXMgZXhjZWxsZW50IGhlbHAuLi4KKyAqCisgKiAxLjAgLT4gMS4xIC0gTWFydGluIERpZWhsCisgKgltb2RpZmllZCBmb3IgbmV3IHNpciBpbmZyYXN0cnVjdHVyZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKworI2luY2x1ZGUgInNpci1kZXYuaCIKKworLyogCisgKiBEZWZpbmUgdGhlIHRpbWluZyBvZiB0aGUgcHVsc2VzIHdlIHNlbmQgdG8gdGhlIGRvbmdsZSAodG8gcmVzZXQgaXQsIGFuZAorICogdG8gdG9nZ2xlIHNwZWVkcykuIEJhc2ljYWxseSwgdGhlIGxpbWl0IGhlcmUgaXMgdGhlIHByb3BhZ2F0aW9uIHNwZWVkIG9mCisgKiB0aGUgc2lnbmFscyB0aHJvdWdoIHRoZSBzZXJpYWwgcG9ydCwgdGhlIGRvbmdsZSBiZWluZyBtdWNoIGZhc3Rlci4gIEFueQorICogc2VyaWFsIHBvcnQgc3VwcG9ydCAxMTUga2Ivcywgc28gd2UgYXJlIHN1cmUgdGhhdCBwdWxzZXMgOC41IHVzIHdpZGUgY2FuCisgKiBnbyB0aHJvdWdoIGNsZWFubHkgLiBJZiB5b3UgYXJlIG9uIHRoZSB3aWxkIHNpZGUsIHlvdSBjYW4gdHJ5IHRvIGxvd2VyCisgKiB0aGlzIHZhbHVlIChBY3Rpc3lzIHJlY29tbWVuZGVkIG1lIDIgdXMsIGFuZCAwIHVzIHdvcmsgZm9yIG1lIG9uIGEgUDIzMyEpCisgKi8KKyNkZWZpbmUgTUlOX0RFTEFZIDEwCS8qIDEwIHVzIHRvIGJlIG9uIHRoZSBjb25zZXJ2YXRpdmUgc2lkZSAqLworCitzdGF0aWMgaW50IGFjdGlzeXNfb3BlbihzdHJ1Y3Qgc2lyX2RldiAqKTsKK3N0YXRpYyBpbnQgYWN0aXN5c19jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqKTsKK3N0YXRpYyBpbnQgYWN0aXN5c19jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKiwgdW5zaWduZWQpOworc3RhdGljIGludCBhY3Rpc3lzX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICopOworCisvKiBUaGVzZSBhcmUgdGhlIGJhdWRyYXRlcyBzdXBwb3J0ZWQsIGluIHRoZSBvcmRlciBhdmFpbGFibGUgKi8KKy8qIE5vdGUgOiB0aGUgMjIwTCBkb2Vzbid0IHN1cHBvcnQgMzg0MDAsIGJ1dCB3ZSB3aWxsIGZpeCB0aGF0IGJlbG93ICovCitzdGF0aWMgdW5zaWduZWQgYmF1ZF9yYXRlc1tdID0geyA5NjAwLCAxOTIwMCwgNTc2MDAsIDExNTIwMCwgMzg0MDAgfTsKKworI2RlZmluZSBNQVhfU1BFRURTIChzaXplb2YoYmF1ZF9yYXRlcykvc2l6ZW9mKGJhdWRfcmF0ZXNbMF0pKQorCitzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgYWN0MjIwbCA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCT0gIkFjdGlzeXMgQUNULTIyMEwiLAorCS50eXBlCQk9IElSREFfQUNUSVNZU19ET05HTEUsCisJLm9wZW4JCT0gYWN0aXN5c19vcGVuLAorCS5jbG9zZQkJPSBhY3Rpc3lzX2Nsb3NlLAorCS5yZXNldAkJPSBhY3Rpc3lzX3Jlc2V0LAorCS5zZXRfc3BlZWQJPSBhY3Rpc3lzX2NoYW5nZV9zcGVlZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX2RyaXZlciBhY3QyMjBsX3BsdXMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZQk9ICJBY3Rpc3lzIEFDVC0yMjBMKyIsCisJLnR5cGUJCT0gSVJEQV9BQ1RJU1lTX1BMVVNfRE9OR0xFLAorCS5vcGVuCQk9IGFjdGlzeXNfb3BlbiwKKwkuY2xvc2UJCT0gYWN0aXN5c19jbG9zZSwKKwkucmVzZXQJCT0gYWN0aXN5c19yZXNldCwKKwkuc2V0X3NwZWVkCT0gYWN0aXN5c19jaGFuZ2Vfc3BlZWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhY3Rpc3lzX3Npcl9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCS8qIEZpcnN0LCByZWdpc3RlciBhbiBBY3Rpc3lzIDIyMEwgZG9uZ2xlICovCisJcmV0ID0gaXJkYV9yZWdpc3Rlcl9kb25nbGUoJmFjdDIyMGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogTm93LCByZWdpc3RlciBhbiBBY3Rpc3lzIDIyMEwrIGRvbmdsZSAqLworCXJldCA9IGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKCZhY3QyMjBsX3BsdXMpOworCWlmIChyZXQgPCAwKSB7CisJCWlyZGFfdW5yZWdpc3Rlcl9kb25nbGUoJmFjdDIyMGwpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFjdGlzeXNfc2lyX2NsZWFudXAodm9pZCkKK3sKKwkvKiBXZSBoYXZlIHRvIHJlbW92ZSBib3RoIGRvbmdsZXMgKi8KKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZhY3QyMjBsX3BsdXMpOworCWlyZGFfdW5yZWdpc3Rlcl9kb25nbGUoJmFjdDIyMGwpOworfQorCitzdGF0aWMgaW50IGFjdGlzeXNfb3BlbihzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCXN0cnVjdCBxb3NfaW5mbyAqcW9zID0gJmRldi0+cW9zOworCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisKKwkvKiBTZXQgdGhlIHNwZWVkcyB3ZSBjYW4gYWNjZXB0ICovCisJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfElSXzExNTIwMDsKKworCS8qIFJlbW92ZSBzdXBwb3J0IGZvciAzODQwMCBpZiB0aGlzIGlzIG5vdCBhIDIyMEwrIGRvbmdsZSAqLworCWlmIChkZXYtPmRvbmdsZV9kcnYtPnR5cGUgPT0gSVJEQV9BQ1RJU1lTX0RPTkdMRSkKKwkJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSB+SVJfMzg0MDA7CisKKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4N2Y7IC8qIE5lZWRzIDAuMDEgbXMgKi8KKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7CisKKwkvKiBpcmRhIHRocmVhZCB3YWl0cyA1MCBtc2VjIGZvciBwb3dlciBzZXR0bGluZyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWN0aXN5c19jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCS8qIFBvd2VyIG9mZiB0aGUgZG9uZ2xlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIEZBTFNFKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gYWN0aXN5c19jaGFuZ2Vfc3BlZWQgKHRhc2spCisgKgorICogICAgQ2hhbmdlIHNwZWVkIG9mIHRoZSBBQ1RpU1lTIElSLTIyMEwgYW5kIElSLTIyMEwrIHR5cGUgSXJEQSBkb25nbGVzLgorICogICAgVG8gY3ljbGUgdGhyb3VnaCB0aGUgYXZhaWxhYmxlIGJhdWQgcmF0ZXMsIHB1bHNlIFJUUyBsb3cgZm9yIGEgZmV3IHVzLgorICoKKyAqCUZpcnN0LCB3ZSByZXNldCB0aGUgZG9uZ2xlIHRvIGFsd2F5cyBzdGFydCBmcm9tIGEga25vd24gc3RhdGUuCisgKglUaGVuLCB3ZSBjeWNsZSB0aHJvdWdoIHRoZSBzcGVlZHMgYnkgcHVsc2luZyBSVFMgbG93IGFuZCB0aGVuIHVwLgorICoJVGhlIGRvbmdsZSBhbGxvdyB1cyB0byBwdWxzZSBxdWl0ZSBmYXN0LCBzZSB3ZSBjYW4gc2V0IHNwZWVkIGluIG9uZSBnbywKKyAqIHdoaWNoIGlzIG11c3QgZmFzdGVyICggPCAxMDAgdXMpIGFuZCBsZXNzIGNvbXBsZXggdGhhbiB3aGF0IGlzIGZvdW5kCisgKiBpbiBzb21lIG90aGVyIGRvbmdsZSBkcml2ZXJzLi4uCisgKglOb3RlIHRoYXQgZXZlbiBpZiB0aGUgbmV3IHNwZWVkIGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHNwZWVkLAorICogd2UgcmVhc3NlcnQgdGhlIHNwZWVkLiBUaGlzIG1ha2Ugc3VyZSB0aGF0IHRoaW5ncyBhcmUgYWxsIHJpZ2h0LAorICogYW5kIGl0J3MgZmFzdCBhbnl3YXkuLi4KKyAqCUJ5IHRoZSB3YXksIHRoaXMgZnVuY3Rpb24gd2lsbCB3b3JrIGZvciBib3RoIHR5cGUgb2YgZG9uZ2xlcywKKyAqIGJlY2F1c2UgdGhlIGFkZGl0aW9uYWwgc3BlZWQgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuLi4KKyAqLworc3RhdGljIGludCBhY3Rpc3lzX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCB1bnNpZ25lZCBzcGVlZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaSA9IDA7CisKKyAgICAgICAgSVJEQV9ERUJVRyg0LCAiJXMoKSwgc3BlZWQ9JWQgKHdhcyAlZClcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgCXNwZWVkLCBkZXYtPnNwZWVkKTsKKworCS8qIGRvbmdsZSB3YXMgYWxyZWFkeSByZXNldHRlZCBmcm9tIGlyZGFfcmVxdWVzdCBzdGF0ZSBtYWNoaW5lLAorCSAqIHdlIGFyZSBpbiBrbm93biBzdGF0ZSAoZG9uZ2xlIGRlZmF1bHQpCisJICovCisKKwkvKiAKKwkgKiBOb3csIHdlIGNhbiBzZXQgdGhlIHNwZWVkIHJlcXVlc3RlZC4gU2VuZCBSVFMgcHVsc2VzIHVudGlsIHdlCisgICAgICAgICAqIHJlYWNoIHRoZSB0YXJnZXQgc3BlZWQgCisJICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9TUEVFRFM7IGkrKykgeworCQlpZiAoc3BlZWQgPT0gYmF1ZF9yYXRlc1tpXSkgeworCQkJZGV2LT5zcGVlZCA9IHNwZWVkOworCQkJYnJlYWs7CisJCX0KKwkJLyogU2V0IFJUUyBsb3cgZm9yIDEwIHVzICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIEZBTFNFKTsKKwkJdWRlbGF5KE1JTl9ERUxBWSk7CisKKwkJLyogU2V0IFJUUyBoaWdoIGZvciAxMCB1cyAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKwkJdWRlbGF5KE1JTl9ERUxBWSk7CisJfQorCisJLyogQ2hlY2sgaWYgbGlmZSBpcyBzd2VldC4uLiAqLworCWlmIChpID49IE1BWF9TUEVFRFMpIHsKKwkJYWN0aXN5c19yZXNldChkZXYpOworCQlyZXQgPSAtRUlOVkFMOyAgLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLworCX0KKworCS8qIEJhc3RhIGxhdm9ybywgb24gc2UgY2Fzc2UgZCdpY2kuLi4gKi8KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gYWN0aXN5c19yZXNldCAodGFzaykKKyAqCisgKiAgICAgIFJlc2V0IHRoZSBBY3Rpc3lzIHR5cGUgZG9uZ2xlLiBXYXJuaW5nLCB0aGlzIGZ1bmN0aW9uIG11c3Qgb25seSBiZQorICogICAgICBjYWxsZWQgd2l0aCBhIHByb2Nlc3MgY29udGV4dCEKKyAqCisgKiBXZSBuZWVkIHRvIGRvIHR3byB0aGluZ3MgaW4gdGhpcyBmdW5jdGlvbiA6CisgKglvIGZpcnN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBkb25nbGUgaXMgaW4gYSBzdGF0ZSB3aGVyZSBpdCBjYW4gb3BlcmF0ZQorICoJbyBzZWNvbmQgcHV0IHRoZSBkb25nbGUgaW4gYSBrbm93IHN0YXRlCisgKgorICoJVGhlIGRvbmdsZSBpcyBwb3dlcmVkIG9mIHRoZSBSVFMgYW5kIERUUiBsaW5lcy4gSW4gdGhlIGRvbmdsZSwgdGhlcmUKKyAqIGlzIGEgYmlnIGNhcGFjaXRvciB0byBhY2NvbW1vZGF0ZSB0aGUgY3VycmVudCBzcGlrZXMuIFRoaXMgY2FwYWNpdG9yCisgKiB0YWtlcyBhIGxlYXN0IDUwIG1zIHRvIGJlIGNoYXJnZWQuIEluIHRoZW9yeSwgdGhlIEJpb3Mgc2V0IHRob3NlIGxpbmVzCisgKiB1cCwgc28gYnkgdGhlIHRpbWUgd2UgYXJyaXZlIGhlcmUgd2Ugc2hvdWxkIGJlIHNldC4gSXQgZG9lc24ndCBodXJ0CisgKiB0byBiZSBvbiB0aGUgY29uc2VydmF0aXZlIHNpZGUsIHNvIHdlIHdpbGwgd2FpdC4uLgorICogPE1hcnRpbiA6IG1vdmUgYWJvdmUgY29tbWVudCB0byBpcmRhX2NvbmZpZ19mc20+CisgKglUaGVuLCB3ZSBzZXQgdGhlIHNwZWVkIHRvIDk2MDAgYi9zIHRvIGdldCBpbiBhIGtub3duIHN0YXRlIChzZWUgaW4KKyAqIGNoYW5nZV9zcGVlZCBmb3IgZGV0YWlscykuIEl0IGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBJckRBIHN0YWNrCisgKiBoYXMgdHJpZWQgdG8gc2V0IHRoZSBzcGVlZCBpbW1lZGlhdGVseSBhZnRlciBvdXIgZmlyc3QgcmV0dXJuLAorICogc28gYmVmb3JlIHdlIGNhbiBiZSBzdXJlIHRoZSBkb25nbGUgaXMgdXAgYW5kIHJ1bm5pbmcuCisgKi8KKworc3RhdGljIGludCBhY3Rpc3lzX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJLyogUmVzZXQgdGhlIGRvbmdsZSA6IHNldCBEVFIgbG93IGZvciAxMCB1cyAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBUUlVFKTsKKwl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKwkKKwlkZXYtPnNwZWVkID0gOTYwMDsJLyogVGhhdCdzIHRoZSBkZWZhdWx0ICovCisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiAtIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUNUaVNZUyBJUi0yMjBMIGFuZCBJUi0yMjBMKyBkb25nbGUgZHJpdmVyIik7CQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS0yIik7IC8qIElSREFfQUNUSVNZU19ET05HTEUgKi8KK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtMyIpOyAvKiBJUkRBX0FDVElTWVNfUExVU19ET05HTEUgKi8KKworbW9kdWxlX2luaXQoYWN0aXN5c19zaXJfaW5pdCk7Cittb2R1bGVfZXhpdChhY3Rpc3lzX3Npcl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYWN0aXN5cy5jIGIvZHJpdmVycy9uZXQvaXJkYS9hY3Rpc3lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlMzFmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYWN0aXN5cy5jCkBAIC0wLDAgKzEsMjg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGFjdGlzeXMuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEFDVGlTWVMgSVItMjIwTCBhbmQgSVItMjIwTCsgCisgKiAgICAgICAgICAgICAgICBkb25nbGVzCisgKiBTdGF0dXM6ICAgICAgICBCZXRhLgorICogQXV0aG9yczogICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiAoaW5pdGlhbGx5KQorICoJCSAgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPiAobmV3IHZlcnNpb24pCisgKiBDcmVhdGVkIGF0OiAgICBXZWQgT2N0IDIxIDIwOjAyOjM1IDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBEZWMgMTcgMDk6MTA6NDMgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IEplYW4gVG91cnJpbGhlcworICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDaGFuZ2Vsb2cKKyAqCisgKiAwLjggLT4gMC45OTk5IC0gSmVhbgorICoJbyBOZXcgaW5pdGlhbGlzYXRpb24gcHJvY2VkdXJlIDogbXVjaCBzYWZlciBhbmQgY29ycmVjdAorICoJbyBOZXcgcHJvY2VkdXJlIHRoZSBjaGFuZ2Ugc3BlZWQgOiBtdWNoIGZhc3RlciBhbmQgc2ltcGxlcgorICoJbyBPdGhlciBjbGVhbnVwcyAmIGNvbW1lbnRzCisgKglUaGFua3MgdG8gTGljaGVuIFdhbmcgQCBBY3Rpc3lzIGZvciBoaXMgZXhjZWxsZW50IGhlbHAuLi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworLyogCisgKiBEZWZpbmUgdGhlIHRpbWluZyBvZiB0aGUgcHVsc2VzIHdlIHNlbmQgdG8gdGhlIGRvbmdsZSAodG8gcmVzZXQgaXQsIGFuZAorICogdG8gdG9nZ2xlIHNwZWVkcykuIEJhc2ljYWxseSwgdGhlIGxpbWl0IGhlcmUgaXMgdGhlIHByb3BhZ2F0aW9uIHNwZWVkIG9mCisgKiB0aGUgc2lnbmFscyB0aHJvdWdoIHRoZSBzZXJpYWwgcG9ydCwgdGhlIGRvbmdsZSBiZWluZyBtdWNoIGZhc3Rlci4gIEFueQorICogc2VyaWFsIHBvcnQgc3VwcG9ydCAxMTUga2Ivcywgc28gd2UgYXJlIHN1cmUgdGhhdCBwdWxzZXMgOC41IHVzIHdpZGUgY2FuCisgKiBnbyB0aHJvdWdoIGNsZWFubHkgLiBJZiB5b3UgYXJlIG9uIHRoZSB3aWxkIHNpZGUsIHlvdSBjYW4gdHJ5IHRvIGxvd2VyCisgKiB0aGlzIHZhbHVlIChBY3Rpc3lzIHJlY29tbWVuZGVkIG1lIDIgdXMsIGFuZCAwIHVzIHdvcmsgZm9yIG1lIG9uIGEgUDIzMyEpCisgKi8KKyNkZWZpbmUgTUlOX0RFTEFZIDEwCS8qIDEwIHVzIHRvIGJlIG9uIHRoZSBjb25zZXJ2YXRpdmUgc2lkZSAqLworCitzdGF0aWMgaW50ICBhY3Rpc3lzX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKK3N0YXRpYyBpbnQgIGFjdGlzeXNfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgdm9pZCBhY3Rpc3lzX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKTsKK3N0YXRpYyB2b2lkIGFjdGlzeXNfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpOworCisvKiBUaGVzZSBhcmUgdGhlIGJhdWRyYXRlcyBzdXBwb3J0ZWQsIGluIHRoZSBvcmRlciBhdmFpbGFibGUgKi8KKy8qIE5vdGUgOiB0aGUgMjIwTCBkb2Vzbid0IHN1cHBvcnQgMzg0MDAsIGJ1dCB3ZSB3aWxsIGZpeCB0aGF0IGJlbG93ICovCitzdGF0aWMgX191MzIgYmF1ZF9yYXRlc1tdID0geyA5NjAwLCAxOTIwMCwgNTc2MDAsIDExNTIwMCwgMzg0MDAgfTsKKyNkZWZpbmUgTUFYX1NQRUVEUyA1CisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX3JlZyBkb25nbGUgPSB7CisJLnR5cGUgPSBJUkRBX0FDVElTWVNfRE9OR0xFLAorCS5vcGVuID0gYWN0aXN5c19vcGVuLAorCS5jbG9zZSA9IGFjdGlzeXNfY2xvc2UsCisJLnJlc2V0ID0gYWN0aXN5c19yZXNldCwKKwkuY2hhbmdlX3NwZWVkID0gYWN0aXN5c19jaGFuZ2Vfc3BlZWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9yZWcgZG9uZ2xlX3BsdXMgPSB7CisJLnR5cGUgPSBJUkRBX0FDVElTWVNfUExVU19ET05HTEUsCisJLm9wZW4gPSBhY3Rpc3lzX29wZW4sCisJLmNsb3NlID0gYWN0aXN5c19jbG9zZSwKKwkucmVzZXQgPSBhY3Rpc3lzX3Jlc2V0LAorCS5jaGFuZ2Vfc3BlZWQgPSBhY3Rpc3lzX2NoYW5nZV9zcGVlZCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKKy8qCisgKiBGdW5jdGlvbiBhY3Rpc3lzX2NoYW5nZV9zcGVlZCAodGFzaykKKyAqCisgKglUaGVyZSBpcyB0d28gbW9kZWwgb2YgQWN0aXN5cyBkb25nbGUgd2UgYXJlIGRlYWxpbmcgd2l0aCwKKyAqIHRoZSAyMjBMIGFuZCAyMjBMKy4gQXQgdGhpcyBwb2ludCwgb25seSBpcmF0dGFjaCBrbm93cyB3aXRoCisgKiBraW5kIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgKGl0IHdhcyBhbiBhcmd1bWVudCBvbiBpcmF0dGFjaAorICogY29tbWFuZCBsaW5lKS4KKyAqCVNvLCB3ZSByZWdpc3RlciBhIGRvbmdsZSBvZiBlYWNoIHNvcnQgYW5kIGxldCBpcmF0dGFjaAorICogcGljayB0aGUgcmlnaHQgb25lLi4uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFjdGlzeXNfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwkvKiBGaXJzdCwgcmVnaXN0ZXIgYW4gQWN0aXN5cyAyMjBMIGRvbmdsZSAqLworCXJldCA9IGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkvKiBOb3csIHJlZ2lzdGVyIGFuIEFjdGlzeXMgMjIwTCsgZG9uZ2xlICovCisJcmV0ID0gaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGVfcGx1cyk7CisJaWYgKHJldCA8IDApIHsKKwkJaXJkYV9kZXZpY2VfdW5yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7CisJCXJldHVybiByZXQ7CisJfQkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFjdGlzeXNfY2xlYW51cCh2b2lkKQoreworCS8qIFdlIGhhdmUgdG8gcmVtb3ZlIGJvdGggZG9uZ2xlcyAqLworCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGVfcGx1cyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjdGlzeXNfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpCit7CisJLyogUG93ZXIgb24gdGhlIGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisKKwkvKiBTZXQgdGhlIHNwZWVkcyB3ZSBjYW4gYWNjZXB0ICovCisJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfElSXzExNTIwMDsKKworCS8qIFJlbW92ZSBzdXBwb3J0IGZvciAzODQwMCBpZiB0aGlzIGlzIG5vdCBhIDIyMEwrIGRvbmdsZSAqLworCWlmIChzZWxmLT5pc3N1ZS0+dHlwZSA9PSBJUkRBX0FDVElTWVNfRE9OR0xFKQorCQlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IH5JUl8zODQwMDsKKwkKKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4N2Y7IC8qIE5lZWRzIDAuMDEgbXMgKi8KK30KKworc3RhdGljIHZvaWQgYWN0aXN5c19jbG9zZShkb25nbGVfdCAqc2VsZikKK3sKKwkvKiBQb3dlciBvZmYgdGhlIGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFjdGlzeXNfY2hhbmdlX3NwZWVkICh0YXNrKQorICoKKyAqICAgIENoYW5nZSBzcGVlZCBvZiB0aGUgQUNUaVNZUyBJUi0yMjBMIGFuZCBJUi0yMjBMKyB0eXBlIElyREEgZG9uZ2xlcy4KKyAqICAgIFRvIGN5Y2xlIHRocm91Z2ggdGhlIGF2YWlsYWJsZSBiYXVkIHJhdGVzLCBwdWxzZSBSVFMgbG93IGZvciBhIGZldyB1cy4KKyAqCisgKglGaXJzdCwgd2UgcmVzZXQgdGhlIGRvbmdsZSB0byBhbHdheXMgc3RhcnQgZnJvbSBhIGtub3duIHN0YXRlLgorICoJVGhlbiwgd2UgY3ljbGUgdGhyb3VnaCB0aGUgc3BlZWRzIGJ5IHB1bHNpbmcgUlRTIGxvdyBhbmQgdGhlbiB1cC4KKyAqCVRoZSBkb25nbGUgYWxsb3cgdXMgdG8gcHVsc2UgcXVpdGUgZmFzdCwgc2Ugd2UgY2FuIHNldCBzcGVlZCBpbiBvbmUgZ28sCisgKiB3aGljaCBpcyBtdXN0IGZhc3RlciAoIDwgMTAwIHVzKSBhbmQgbGVzcyBjb21wbGV4IHRoYW4gd2hhdCBpcyBmb3VuZAorICogaW4gc29tZSBvdGhlciBkb25nbGUgZHJpdmVycy4uLgorICoJTm90ZSB0aGF0IGV2ZW4gaWYgdGhlIG5ldyBzcGVlZCBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBzcGVlZCwKKyAqIHdlIHJlYXNzZXJ0IHRoZSBzcGVlZC4gVGhpcyBtYWtlIHN1cmUgdGhhdCB0aGluZ3MgYXJlIGFsbCByaWdodCwKKyAqIGFuZCBpdCdzIGZhc3QgYW55d2F5Li4uCisgKglCeSB0aGUgd2F5LCB0aGlzIGZ1bmN0aW9uIHdpbGwgd29yayBmb3IgYm90aCB0eXBlIG9mIGRvbmdsZXMsCisgKiBiZWNhdXNlIHRoZSBhZGRpdGlvbmFsIHNwZWVkIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLi4uCisgKi8KK3N0YXRpYyBpbnQgYWN0aXN5c19jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwlfX3UzMiBzcGVlZCA9IChfX3UzMikgdGFzay0+cGFyYW07CS8qIFRhcmdldCBzcGVlZCAqLworCWludCByZXQgPSAwOworCWludCBpID0gMDsKKworICAgICAgICBJUkRBX0RFQlVHKDQsICIlcygpLCBzcGVlZD0lZCAod2FzICVkKVxuIiwgX19GVU5DVElPTl9fLCBzcGVlZCwgCisJCSAgIHNlbGYtPnNwZWVkKTsKKworCS8qIEdvIHRvIGEga25vd24gc3RhdGUgYnkgcmVzZXRpbmcgdGhlIGRvbmdsZSAqLworCisJLyogUmVzZXQgdGhlIGRvbmdsZSA6IHNldCBEVFIgbG93IGZvciAxMCB1cyAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIFRSVUUpOworCXVkZWxheShNSU5fREVMQVkpOworCisJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAod2UgYXJlIG5vdyBhdCA5NjAwIGIvcykgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworIAorCS8qIAorCSAqIE5vdywgd2UgY2FuIHNldCB0aGUgc3BlZWQgcmVxdWVzdGVkLiBTZW5kIFJUUyBwdWxzZXMgdW50aWwgd2UKKyAgICAgICAgICogcmVhY2ggdGhlIHRhcmdldCBzcGVlZCAKKwkgKi8KKwlmb3IgKGk9MDsgaTxNQVhfU1BFRURTOyBpKyspIHsKKwkJaWYgKHNwZWVkID09IGJhdWRfcmF0ZXNbaV0pIHsKKwkJCXNlbGYtPnNwZWVkID0gYmF1ZF9yYXRlc1tpXTsKKwkJCWJyZWFrOworCQl9CisJCS8qIE1ha2Ugc3VyZSBwcmV2aW91cyBwdWxzZSBpcyBmaW5pc2hlZCAqLworCQl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCQkvKiBTZXQgUlRTIGxvdyBmb3IgMTAgdXMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBGQUxTRSk7CisJCXVkZWxheShNSU5fREVMQVkpOworCisJCS8qIFNldCBSVFMgaGlnaCBmb3IgMTAgdXMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwl9CisKKwkvKiBDaGVjayBpZiBsaWZlIGlzIHN3ZWV0Li4uICovCisJaWYgKGkgPj0gTUFYX1NQRUVEUykKKwkJcmV0ID0gLTE7ICAvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuICovCisKKwkvKiBCYXN0YSBsYXZvcm8sIG9uIHNlIGNhc3NlIGQnaWNpLi4uICovCisJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFjdGlzeXNfcmVzZXQgKHRhc2spCisgKgorICogICAgICBSZXNldCB0aGUgQWN0aXN5cyB0eXBlIGRvbmdsZS4gV2FybmluZywgdGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkgYmUKKyAqICAgICAgY2FsbGVkIHdpdGggYSBwcm9jZXNzIGNvbnRleHQhCisgKgorICogV2UgbmVlZCB0byBkbyB0d28gdGhpbmdzIGluIHRoaXMgZnVuY3Rpb24gOgorICoJbyBmaXJzdCBtYWtlIHN1cmUgdGhhdCB0aGUgZG9uZ2xlIGlzIGluIGEgc3RhdGUgd2hlcmUgaXQgY2FuIG9wZXJhdGUKKyAqCW8gc2Vjb25kIHB1dCB0aGUgZG9uZ2xlIGluIGEga25vdyBzdGF0ZQorICoKKyAqCVRoZSBkb25nbGUgaXMgcG93ZXJlZCBvZiB0aGUgUlRTIGFuZCBEVFIgbGluZXMuIEluIHRoZSBkb25nbGUsIHRoZXJlCisgKiBpcyBhIGJpZyBjYXBhY2l0b3IgdG8gYWNjb21tb2RhdGUgdGhlIGN1cnJlbnQgc3Bpa2VzLiBUaGlzIGNhcGFjaXRvcgorICogdGFrZXMgYSBsZWFzdCA1MCBtcyB0byBiZSBjaGFyZ2VkLiBJbiB0aGVvcnksIHRoZSBCaW9zIHNldCB0aG9zZSBsaW5lcworICogdXAsIHNvIGJ5IHRoZSB0aW1lIHdlIGFycml2ZSBoZXJlIHdlIHNob3VsZCBiZSBzZXQuIEl0IGRvZXNuJ3QgaHVydAorICogdG8gYmUgb24gdGhlIGNvbnNlcnZhdGl2ZSBzaWRlLCBzbyB3ZSB3aWxsIHdhaXQuLi4KKyAqCVRoZW4sIHdlIHNldCB0aGUgc3BlZWQgdG8gOTYwMCBiL3MgdG8gZ2V0IGluIGEga25vd24gc3RhdGUgKHNlZSBpbgorICogY2hhbmdlX3NwZWVkIGZvciBkZXRhaWxzKS4gSXQgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIElyREEgc3RhY2sKKyAqIGhhcyB0cmllZCB0byBzZXQgdGhlIHNwZWVkIGltbWVkaWF0ZWx5IGFmdGVyIG91ciBmaXJzdCByZXR1cm4sCisgKiBzbyBiZWZvcmUgd2UgY2FuIGJlIHN1cmUgdGhlIGRvbmdsZSBpcyB1cCBhbmQgcnVubmluZy4KKyAqLworc3RhdGljIGludCBhY3Rpc3lzX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0FTU0VSVCh0YXNrICE9IE5VTEwsIHJldHVybiAtMTspOworCisJc2VsZi0+cmVzZXRfdGFzayA9IHRhc2s7CisKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwkJLyogU2V0IGJvdGggRFRSICYgUlRTIHRvIHBvd2VyIHVwIHRoZSBkb25nbGUgKi8KKwkJLyogSW4gdGhlb3J5IHJlZHVuZGFudCB3aXRoIHBvd2VyIHVwIGluIGFjdGlzeXNfb3BlbigpICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisJCQorCQkvKiBTbGVlcCA1MCBtcyB0byBtYWtlIHN1cmUgY2FwYWNpdG9yIGlzIGNoYXJnZWQgKi8KKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcyg1MCk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDoJCQkKKwkJLyogUmVzZXQgdGhlIGRvbmdsZSA6IHNldCBEVFIgbG93IGZvciAxMCB1cyAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBUUlVFKTsKKwkJdWRlbGF5KE1JTl9ERUxBWSk7CisKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCQorCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOworCQlzZWxmLT5zcGVlZCA9IDk2MDA7CS8qIFRoYXQncyB0aGUgZGVmYXVsdCAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCB0YXNrLT5zdGF0ZSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiAtIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUNUaVNZUyBJUi0yMjBMIGFuZCBJUi0yMjBMKyBkb25nbGUgZHJpdmVyIik7CQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS0yIik7IC8qIElSREFfQUNUSVNZU19ET05HTEUgKi8KK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtMyIpOyAvKiBJUkRBX0FDVElTWVNfUExVU19ET05HTEUgKi8KKworCQkKKy8qCisgKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplIEFjdGlzeXMgbW9kdWxlCisgKgorICovCittb2R1bGVfaW5pdChhY3Rpc3lzX2luaXQpOworCisvKgorICogRnVuY3Rpb24gY2xlYW51cF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgQ2xlYW51cCBBY3Rpc3lzIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2V4aXQoYWN0aXN5c19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYyBiL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmYzNDY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5jCkBAIC0wLDAgKzEsMjI3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBhbGktaXJjYy5oCisgKiBWZXJzaW9uOiAgICAgICAwLjUKKyAqIERlc2NyaXB0aW9uOiAgIERyaXZlciBmb3IgdGhlIEFMSSBNMTUzNUQgYW5kIE0xNTQzQyBGSVIgQ29udHJvbGxlcgorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgQmVuamFtaW4gS29uZyA8YmVuamFtaW5fa29uZ0BhbGkuY29tLnR3PgorICogQ3JlYXRlZCBhdDogICAgMjAwMC8xMC8xNiAwMzo0NlBNCisgKiBNb2RpZmllZCBhdDogICAyMDAxLzEvMyAwMjo1NVBNCisgKiBNb2RpZmllZCBieTogICBCZW5qYW1pbiBLb25nIDxiZW5qYW1pbl9rb25nQGFsaS5jb20udHc+CisgKiBNb2RpZmllZCBhdDogICAyMDAzLzExLzYgYW5kIHN1cHBvcnQgZm9yIEFMaSBzb3V0aC1icmlkZ2UgY2hpcHNldHMgTTE1NjMKKyAqIE1vZGlmaWVkIGJ5OiAgIENsZWFyIFpoYW5nIDxjbGVhcl96aGFuZ0BhbGkuY29tLnR3PgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwIEJlbmphbWluIEtvbmcgPGJlbmphbWluX2tvbmdAYWxpLmNvbS50dz4KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS93cmFwcGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKKyNpbmNsdWRlICJhbGktaXJjYy5oIgorCisjZGVmaW5lIENISVBfSU9fRVhURU5UIDgKKyNkZWZpbmUgQlJPS0VOX0RPTkdMRV9JRAorCitzdGF0aWMgY2hhciAqZHJpdmVyX25hbWUgPSAiYWxpLWlyY2MiOworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBxb3NfbXR0X2JpdHMgPSAweDA3OyAgLyogMSBtcyBvciBtb3JlICovCisKKy8qIFVzZSBCSU9TIHNldHRpb25zIGJ5IGRlZmF1bHQsIGJ1dCB1c2VyIG1heSBzdXBwbHkgbW9kdWxlIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW9bXSAgPSB7IH4wLCB+MCwgfjAsIH4wIH07CitzdGF0aWMgdW5zaWduZWQgaW50IGlycVtdID0geyAwLCAwLCAwLCAwIH07CitzdGF0aWMgdW5zaWduZWQgaW50IGRtYVtdID0geyAwLCAwLCAwLCAwIH07CisKK3N0YXRpYyBpbnQgIGFsaV9pcmNjX3Byb2JlXzUzKGFsaV9jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKTsKK3N0YXRpYyBpbnQgIGFsaV9pcmNjX2luaXRfNDMoYWxpX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOworc3RhdGljIGludCAgYWxpX2lyY2NfaW5pdF81MyhhbGlfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbyk7CisKKy8qIFRoZXNlIGFyZSB0aGUgY3VycmVudGx5IGtub3duIEFMaSBzb3VydGgtYnJpZGdlIGNoaXBzZXRzLCB0aGUgb25seSBvbmUgZGlmZmVyZW5jZQorICogaXMgdGhhdCBNMTU0M0MgZG9lc24ndCBzdXBwb3J0IEhQIEhEU0wtMzYwMAorICovCitzdGF0aWMgYWxpX2NoaXBfdCBjaGlwc1tdID0KK3sKKwl7ICJNMTU0MyIsIHsgMHgzZjAsIDB4MzcwIH0sIDB4NTEsIDB4MjMsIDB4MjAsIDB4NDMsIGFsaV9pcmNjX3Byb2JlXzUzLCBhbGlfaXJjY19pbml0XzQzIH0sCisJeyAiTTE1MzUiLCB7IDB4M2YwLCAweDM3MCB9LCAweDUxLCAweDIzLCAweDIwLCAweDUzLCBhbGlfaXJjY19wcm9iZV81MywgYWxpX2lyY2NfaW5pdF81MyB9LAorCXsgIk0xNTYzIiwgeyAweDNmMCwgMHgzNzAgfSwgMHg1MSwgMHgyMywgMHgyMCwgMHg2MywgYWxpX2lyY2NfcHJvYmVfNTMsIGFsaV9pcmNjX2luaXRfNTMgfSwKKwl7IE5VTEwgfQorfTsKKworLyogTWF4IDQgaW5zdGFuY2VzIGZvciBub3cgKi8KK3N0YXRpYyBzdHJ1Y3QgYWxpX2lyY2NfY2IgKmRldl9zZWxmW10gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKworLyogRG9uZ2xlIFR5cGVzICovCitzdGF0aWMgY2hhciAqZG9uZ2xlX3R5cGVzW10gPSB7CisJIlRGRFM2MDAwIiwKKwkiSFAgSFNETC0zNjAwIiwKKwkiSFAgSFNETC0xMTAwIiwJCisJIk5vIGRvbmdsZSBjb25uZWN0ZWQiLAorfTsKKworLyogU29tZSBwcm90b3R5cGVzICovCitzdGF0aWMgaW50ICBhbGlfaXJjY19vcGVuKGludCBpLCBjaGlwaW9fdCAqaW5mbyk7CisKK3N0YXRpYyBpbnQgIGFsaV9pcmNjX2Nsb3NlKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZik7CisKK3N0YXRpYyBpbnQgIGFsaV9pcmNjX3NldHVwKGNoaXBpb190ICppbmZvKTsKK3N0YXRpYyBpbnQgIGFsaV9pcmNjX2lzX3JlY2VpdmluZyhzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCAgYWxpX2lyY2NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBhbGlfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBhbGlfaXJjY19uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgaW50ICBhbGlfaXJjY19wbXByb2Moc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBhbGlfaXJjY19jaGFuZ2Vfc3BlZWQoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmLCBfX3UzMiBiYXVkKTsKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX3N1c3BlbmQoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX3dha2V1cChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphbGlfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBTSVIgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgIGFsaV9pcmNjX3Npcl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgYWxpX2lyY2Nfc2lyX2ludGVycnVwdChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIHZvaWQgYWxpX2lyY2Nfc2lyX3JlY2VpdmUoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX3Npcl93cml0ZV93YWtldXAoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgIGFsaV9pcmNjX3Npcl93cml0ZShpbnQgaW9iYXNlLCBpbnQgZmlmb19zaXplLCBfX3U4ICpidWYsIGludCBsZW4pOworc3RhdGljIHZvaWQgYWxpX2lyY2Nfc2lyX2NoYW5nZV9zcGVlZChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnByaXYsIF9fdTMyIHNwZWVkKTsKKworLyogRklSIGZ1bmN0aW9uICovCitzdGF0aWMgaW50ICBhbGlfaXJjY19maXJfaGFyZF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYWxpX2lyY2NfZmlyX2NoYW5nZV9zcGVlZChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnByaXYsIF9fdTMyIHNwZWVkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBhbGlfaXJjY19maXJfaW50ZXJydXB0KHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50ICBhbGlfaXJjY19kbWFfcmVjZWl2ZShzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpOyAKK3N0YXRpYyBpbnQgIGFsaV9pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50ICBhbGlfaXJjY19kbWFfeG1pdF9jb21wbGV0ZShzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIHZvaWQgYWxpX2lyY2NfZG1hX3htaXQoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKTsKKworLyogTXkgRnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgIGFsaV9pcmNjX3JlYWRfZG9uZ2xlX2lkIChpbnQgaSwgY2hpcGlvX3QgKmluZm8pOworc3RhdGljIHZvaWQgYWxpX2lyY2NfY2hhbmdlX2RvbmdsZV9zcGVlZChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnByaXYsIGludCBzcGVlZCk7CisKKy8qIEFMaSBjaGlwIGZ1bmN0aW9uICovCitzdGF0aWMgdm9pZCBTSVIyRklSKGludCBpb2Jhc2UpOworc3RhdGljIHZvaWQgRklSMlNJUihpbnQgaW9iYXNlKTsKK3N0YXRpYyB2b2lkIFNldENPTUludGVycnVwdHMoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmICwgdW5zaWduZWQgY2hhciBlbmFibGUpOworCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfaW5pdCAoKQorICoKKyAqICAgIEluaXRpYWxpemUgY2hpcC4gRmluZCBvdXQgd2hheSBraW5kcyBvZiBjaGlwcyB3ZSBhcmUgZGVhbGluZyB3aXRoCisgKiAgICBhbmQgdGhlaXIgY29uZmlndWF0aW9uIHJlZ2lzdGVycyBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFsaV9pcmNjX2luaXQodm9pZCkKK3sKKwlhbGlfY2hpcF90ICpjaGlwOworCWNoaXBpb190IGluZm87CisJaW50IHJldCA9IC1FTk9ERVY7CisJaW50IGNmZywgY2ZnX2Jhc2U7CisJaW50IHJlZywgcmV2aXNpb247CisJaW50IGkgPSAwOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsKKwkKKwkvKiBQcm9iZSBmb3IgYWxsIHRoZSBBTGkgY2hpcHNldHMgd2Uga25vdyBhYm91dCAqLworCWZvciAoY2hpcD0gY2hpcHM7IGNoaXAtPm5hbWU7IGNoaXArKywgaSsrKSAKKwl7CisJCUlSREFfREVCVUcoMiwgIiVzKCksIFByb2JpbmcgZm9yICVzIC4uLlxuIiwgX19GVU5DVElPTl9fLCBjaGlwLT5uYW1lKTsKKwkJCQkKKwkJLyogVHJ5IGFsbCBjb25maWcgcmVnaXN0ZXJzIGZvciB0aGlzIGNoaXAgKi8KKwkJZm9yIChjZmc9MDsgY2ZnPDI7IGNmZysrKQorCQl7CisJCQljZmdfYmFzZSA9IGNoaXAtPmNmZ1tjZmddOworCQkJaWYgKCFjZmdfYmFzZSkKKwkJCQljb250aW51ZTsKKwkJCQkKKwkJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGNoaXBpb190KSk7CisJCQlpbmZvLmNmZ19iYXNlID0gY2ZnX2Jhc2U7CisJCQlpbmZvLmZpcl9iYXNlID0gaW9baV07CisJCQlpbmZvLmRtYSA9IGRtYVtpXTsKKwkJCWluZm8uaXJxID0gaXJxW2ldOworCQkJCisJCQkKKwkJCS8qIEVudGVyIENvbmZpZ3VyYXRpb24gKi8KKwkJCW91dGIoY2hpcC0+ZW50cjEsIGNmZ19iYXNlKTsKKwkJCW91dGIoY2hpcC0+ZW50cjIsIGNmZ19iYXNlKTsKKwkJCQorCQkJLyogU2VsZWN0IExvZ2ljYWwgRGV2aWNlIDUgUmVnaXN0ZXJzIChVQVJUMikgKi8KKwkJCW91dGIoMHgwNywgY2ZnX2Jhc2UpOworCQkJb3V0YigweDA1LCBjZmdfYmFzZSsxKTsKKwkJCQorCQkJLyogUmVhZCBDaGlwIElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyICovCisJCQlvdXRiKGNoaXAtPmNpZF9pbmRleCwgY2ZnX2Jhc2UpOwkKKwkJCXJlZyA9IGluYihjZmdfYmFzZSsxKTsJCisJCQkJCisJCQlpZiAocmVnID09IGNoaXAtPmNpZF92YWx1ZSkKKwkJCXsKKwkJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBDaGlwIGZvdW5kIGF0IDB4JTAzeFxuIiwgX19GVU5DVElPTl9fLCBjZmdfYmFzZSk7CisJCQkJCSAgIAorCQkJCW91dGIoMHgxRiwgY2ZnX2Jhc2UpOworCQkJCXJldmlzaW9uID0gaW5iKGNmZ19iYXNlKzEpOworCQkJCUlSREFfREVCVUcoMiwgIiVzKCksIEZvdW5kICVzIGNoaXAsIHJldmlzaW9uPSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJCSAgIGNoaXAtPm5hbWUsIHJldmlzaW9uKTsJCQkJCQorCQkJCQorCQkJCS8qIAorCQkJCSAqIElmIHRoZSB1c2VyIHN1cHBsaWVzIHRoZSBiYXNlIGFkZHJlc3MsIHRoZW4KKwkJCQkgKiB3ZSBpbml0IHRoZSBjaGlwLCBpZiBub3Qgd2UgcHJvYmUgdGhlIHZhbHVlcworCQkJCSAqIHNldCBieSB0aGUgQklPUworCQkJCSAqLwkJCQkKKwkJCQlpZiAoaW9baV0gPCAyMDAwKQorCQkJCXsKKwkJCQkJY2hpcC0+aW5pdChjaGlwLCAmaW5mbyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWNoaXAtPnByb2JlKGNoaXAsICZpbmZvKTsJCisJCQkJfQorCQkJCQorCQkJCWlmIChhbGlfaXJjY19vcGVuKGksICZpbmZvKSA9PSAwKQorCQkJCQlyZXQgPSAwOworCQkJCWkrKzsJCQkJCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgTm8gJXMgY2hpcCBhdCAweCUwM3hcbiIsIF9fRlVOQ1RJT05fXywgY2hpcC0+bmFtZSwgY2ZnX2Jhc2UpOworCQkJfQorCQkJLyogRXhpdCBjb25maWd1cmF0aW9uICovCisJCQlvdXRiKDB4YmIsIGNmZ19iYXNlKTsKKwkJfQorCX0JCQorCQkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CQkJCQkgICAJCQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19jbGVhbnVwICgpCisgKgorICogICAgQ2xvc2UgYWxsIGNvbmZpZ3VyZWQgY2hpcHMKKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBhbGlfaXJjY19jbGVhbnVwKHZvaWQpCit7CisJaW50IGk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CQorCQorCXBtX3VucmVnaXN0ZXJfYWxsKGFsaV9pcmNjX3BtcHJvYyk7CisKKwlmb3IgKGk9MDsgaSA8IDQ7IGkrKykgeworCQlpZiAoZGV2X3NlbGZbaV0pCisJCQlhbGlfaXJjY19jbG9zZShkZXZfc2VsZltpXSk7CisJfQorCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX29wZW4gKGludCBpLCBjaGlwaW9fdCAqaW5mKQorICoKKyAqICAgIE9wZW4gZHJpdmVyIGluc3RhbmNlCisgKgorICovCitzdGF0aWMgaW50IGFsaV9pcmNjX29wZW4oaW50IGksIGNoaXBpb190ICppbmZvKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmOworCXN0cnVjdCBwbV9kZXYgKnBtZGV2OworCWludCBkb25nbGVfaWQ7CisJaW50IGVycjsKKwkJCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsJCisJCisJLyogU2V0IEZJUiBGSUZPIGFuZCBETUEgVGhyZXNob2xkICovCisJaWYgKChhbGlfaXJjY19zZXR1cChpbmZvKSkgPT0gLTEpCisJCXJldHVybiAtMTsKKwkJCisJZGV2ID0gYWxsb2NfaXJkYWRldihzaXplb2YoKnNlbGYpKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgY2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb250cm9sIGJsb2NrIVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNlbGYgPSBkZXYtPnByaXY7CisJc2VsZi0+bmV0ZGV2ID0gZGV2OworCXNwaW5fbG9ja19pbml0KCZzZWxmLT5sb2NrKTsKKyAgIAorCS8qIE5lZWQgdG8gc3RvcmUgc2VsZiBzb21ld2hlcmUgKi8KKwlkZXZfc2VsZltpXSA9IHNlbGY7CisJc2VsZi0+aW5kZXggPSBpOworCisJLyogSW5pdGlhbGl6ZSBJTyAqLworCXNlbGYtPmlvLmNmZ19iYXNlICA9IGluZm8tPmNmZ19iYXNlOwkvKiBJbiBhbGlfaXJjY19wcm9iZV81MyBhc3NpZ24gCQkqLworCXNlbGYtPmlvLmZpcl9iYXNlICA9IGluZm8tPmZpcl9iYXNlOwkvKiBpbmZvLT5zaXJfYmFzZSA9IGluZm8tPmZpcl9iYXNlIAkqLworCXNlbGYtPmlvLnNpcl9iYXNlICA9IGluZm8tPnNpcl9iYXNlOyAJLyogQUxpIFNJUiBhbmQgRklSIHVzZSB0aGUgc2FtZSBhZGRyZXNzICovCisgICAgICAgIHNlbGYtPmlvLmlycSAgICAgICA9IGluZm8tPmlycTsKKyAgICAgICAgc2VsZi0+aW8uZmlyX2V4dCAgID0gQ0hJUF9JT19FWFRFTlQ7CisgICAgICAgIHNlbGYtPmlvLmRtYSAgICAgICA9IGluZm8tPmRtYTsKKyAgICAgICAgc2VsZi0+aW8uZmlmb19zaXplID0gMTY7CQkvKiBTSVI6IDE2LCBGSVI6IDMyIEJlbmphbWluIDIwMDAvMTEvMSAqLworCQorCS8qIFJlc2VydmUgdGhlIGlvcG9ydHMgdGhhdCB3ZSBuZWVkICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzZWxmLT5pby5maXJfYmFzZSwgc2VsZi0+aW8uZmlyX2V4dCwgZHJpdmVyX25hbWUpKSB7CisJCUlSREFfV0FSTklORygiJXMoKSwgY2FuJ3QgZ2V0IGlvYmFzZSBvZiAweCUwM3hcbiIsIF9fRlVOQ1RJT05fXywKKwkJCXNlbGYtPmlvLmZpcl9iYXNlKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0MTsKKwl9CisKKwkvKiBJbml0aWFsaXplIFFvUyBmb3IgdGhpcyBkZXZpY2UgKi8KKwlpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKCZzZWxmLT5xb3MpOworCQorCS8qIFRoZSBvbmx5IHZhbHVlIHdlIG11c3Qgb3ZlcnJpZGUgaXQgdGhlIGJhdWRyYXRlICovCisJc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzID0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHwKKwkJSVJfMTE1MjAwfElSXzU3NjAwMHxJUl8xMTUyMDAwfChJUl80MDAwMDAwIDw8IDgpOyAvLyBiZW5qYW1pbiAyMDAwLzExLzggMDU6MjdQTQorCQkJCisJc2VsZi0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyA9IHFvc19tdHRfYml0czsKKwkJCQorCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoJnNlbGYtPnFvcyk7CisJCisJLyogTWF4IERNQSBidWZmZXIgc2l6ZSBuZWVkZWQgPSAoZGF0YV9zaXplICsgNikgKiAod2luZG93X3NpemUpICsgNjsgKi8KKwlzZWxmLT5yeF9idWZmLnRydWVzaXplID0gMTQzODQ7IAorCXNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUgPSAxNDM4NDsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBpZiBuZWVkZWQgKi8KKwlzZWxmLT5yeF9idWZmLmhlYWQgPQorCQlkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgICAmc2VsZi0+cnhfYnVmZl9kbWEsIEdGUF9LRVJORUwpOworCWlmIChzZWxmLT5yeF9idWZmLmhlYWQgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQyOworCX0KKwltZW1zZXQoc2VsZi0+cnhfYnVmZi5oZWFkLCAwLCBzZWxmLT5yeF9idWZmLnRydWVzaXplKTsKKwkKKwlzZWxmLT50eF9idWZmLmhlYWQgPQorCQlkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgICAmc2VsZi0+dHhfYnVmZl9kbWEsIEdGUF9LRVJORUwpOworCWlmIChzZWxmLT50eF9idWZmLmhlYWQgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQzOworCX0KKwltZW1zZXQoc2VsZi0+dHhfYnVmZi5oZWFkLCAwLCBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKKworCXNlbGYtPnJ4X2J1ZmYuaW5fZnJhbWUgPSBGQUxTRTsKKwlzZWxmLT5yeF9idWZmLnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisJc2VsZi0+cnhfYnVmZi5kYXRhID0gc2VsZi0+cnhfYnVmZi5oZWFkOworCQorCS8qIFJlc2V0IFR4IHF1ZXVlIGluZm8gKi8KKwlzZWxmLT50eF9maWZvLmxlbiA9IHNlbGYtPnR4X2ZpZm8ucHRyID0gc2VsZi0+dHhfZmlmby5mcmVlID0gMDsKKwlzZWxmLT50eF9maWZvLnRhaWwgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisKKwkKKwkvKiBLZWVwIHRyYWNrIG9mIG1vZHVsZSB1c2FnZSAqLworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIE92ZXJyaWRlIHRoZSBuZXR3b3JrIGZ1bmN0aW9ucyB3ZSBuZWVkIHRvIHVzZSAqLworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYWxpX2lyY2Nfc2lyX2hhcmRfeG1pdDsKKwlkZXYtPm9wZW4gICAgICAgICAgICA9IGFsaV9pcmNjX25ldF9vcGVuOworCWRldi0+c3RvcCAgICAgICAgICAgID0gYWxpX2lyY2NfbmV0X2Nsb3NlOworCWRldi0+ZG9faW9jdGwgICAgICAgID0gYWxpX2lyY2NfbmV0X2lvY3RsOworCWRldi0+Z2V0X3N0YXRzCSAgICAgPSBhbGlfaXJjY19uZXRfZ2V0X3N0YXRzOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlJUkRBX0VSUk9SKCIlcygpLCByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGVycl9vdXQ0OworCX0KKwlJUkRBX01FU1NBR0UoIklyREE6IFJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCisJLyogQ2hlY2sgZG9uZ2xlIGlkICovCisJZG9uZ2xlX2lkID0gYWxpX2lyY2NfcmVhZF9kb25nbGVfaWQoaSwgaW5mbyk7CisJSVJEQV9NRVNTQUdFKCIlcygpLCAlcywgRm91bmQgZG9uZ2xlOiAlc1xuIiwgX19GVU5DVElPTl9fLCBkcml2ZXJfbmFtZSwgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOworCQkKKwlzZWxmLT5pby5kb25nbGVfaWQgPSBkb25nbGVfaWQ7CisJCisgICAgICAgIHBtZGV2ID0gcG1fcmVnaXN0ZXIoUE1fU1lTX0RFViwgUE1fU1lTX0lSREEsIGFsaV9pcmNjX3BtcHJvYyk7CisgICAgICAgIGlmIChwbWRldikKKyAgICAgICAgICAgICAgICBwbWRldi0+ZGF0YSA9IHNlbGY7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCisJcmV0dXJuIDA7CisKKyBlcnJfb3V0NDoKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT50eF9idWZmLnRydWVzaXplLAorCQkJICBzZWxmLT50eF9idWZmLmhlYWQsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKKyBlcnJfb3V0MzoKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKKyBlcnJfb3V0MjoKKwlyZWxlYXNlX3JlZ2lvbihzZWxmLT5pby5maXJfYmFzZSwgc2VsZi0+aW8uZmlyX2V4dCk7CisgZXJyX291dDE6CisJZGV2X3NlbGZbaV0gPSBOVUxMOworCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIGVycjsKK30KKworCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfY2xvc2UgKHNlbGYpCisgKgorICogICAgQ2xvc2UgZHJpdmVyIGluc3RhbmNlCisgKgorICovCitzdGF0aWMgaW50IF9fZXhpdCBhbGlfaXJjY19jbG9zZShzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZTsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKyAgICAgICAgaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBSZW1vdmUgbmV0ZGV2aWNlICovCisJdW5yZWdpc3Rlcl9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKworCS8qIFJlbGVhc2UgdGhlIFBPUlQgdGhhdCB0aGlzIGRyaXZlciBpcyB1c2luZyAqLworCUlSREFfREVCVUcoNCwgIiVzKCksIFJlbGVhc2luZyBSZWdpb24gJTAzeFxuIiwgX19GVU5DVElPTl9fLCBzZWxmLT5pby5maXJfYmFzZSk7CisJcmVsZWFzZV9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQpOworCisJaWYgKHNlbGYtPnR4X2J1ZmYuaGVhZCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgIHNlbGYtPnR4X2J1ZmYuaGVhZCwgc2VsZi0+dHhfYnVmZl9kbWEpOworCQorCWlmIChzZWxmLT5yeF9idWZmLmhlYWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKKworCWRldl9zZWxmW3NlbGYtPmluZGV4XSA9IE5VTEw7CisJZnJlZV9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19pbml0XzQzIChjaGlwLCBpbmZvKQorICoKKyAqICAgIEluaXRpYWxpemUgdGhlIEFMaSBNMTU0MyBjaGlwLiAKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19pbml0XzQzKGFsaV9jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKSAKK3sKKwkvKiBBbGwgY29udHJvbGxlciBpbmZvcm1hdGlvbiBsaWtlIEkvTyBhZGRyZXNzLCBETUEgY2hhbm5lbCwgSVJRCisJICogYXJlIHNldCBieSBCSU9TCisJICovCisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19pbml0XzUzIChjaGlwLCBpbmZvKQorICoKKyAqICAgIEluaXRpYWxpemUgdGhlIEFMaSBNMTUzNSBjaGlwLiAKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19pbml0XzUzKGFsaV9jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKSAKK3sKKwkvKiBBbGwgY29udHJvbGxlciBpbmZvcm1hdGlvbiBsaWtlIEkvTyBhZGRyZXNzLCBETUEgY2hhbm5lbCwgSVJRCisJICogYXJlIHNldCBieSBCSU9TCisJICovCisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19wcm9iZV81MyAoY2hpcCwgaW5mbykKKyAqICAgIAkKKyAqCVByb2JlcyBmb3IgdGhlIEFMaSBNMTUzNUQgb3IgTTE1MzUKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19wcm9iZV81MyhhbGlfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbykKK3sKKwlpbnQgY2ZnX2Jhc2UgPSBpbmZvLT5jZmdfYmFzZTsKKwlpbnQgaGksIGxvdywgcmVnOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsKKwkKKwkvKiBFbnRlciBDb25maWd1cmF0aW9uICovCisJb3V0YihjaGlwLT5lbnRyMSwgY2ZnX2Jhc2UpOworCW91dGIoY2hpcC0+ZW50cjIsIGNmZ19iYXNlKTsKKwkKKwkvKiBTZWxlY3QgTG9naWNhbCBEZXZpY2UgNSBSZWdpc3RlcnMgKFVBUlQyKSAqLworCW91dGIoMHgwNywgY2ZnX2Jhc2UpOworCW91dGIoMHgwNSwgY2ZnX2Jhc2UrMSk7CisJCisJLyogUmVhZCBhZGRyZXNzIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlvdXRiKDB4NjAsIGNmZ19iYXNlKTsKKwloaSA9IGluYihjZmdfYmFzZSsxKTsJCisJb3V0YigweDYxLCBjZmdfYmFzZSk7CisJbG93ID0gaW5iKGNmZ19iYXNlKzEpOworCWluZm8tPmZpcl9iYXNlID0gKGhpPDw4KSArIGxvdzsKKwkKKwlpbmZvLT5zaXJfYmFzZSA9IGluZm8tPmZpcl9iYXNlOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIHByb2JpbmcgZmlyX2Jhc2U9MHglMDN4XG4iLCBfX0ZVTkNUSU9OX18sIGluZm8tPmZpcl9iYXNlKTsKKwkJCisJLyogUmVhZCBJUlEgY29udHJvbCByZWdpc3RlciAqLworCW91dGIoMHg3MCwgY2ZnX2Jhc2UpOworCXJlZyA9IGluYihjZmdfYmFzZSsxKTsKKwlpbmZvLT5pcnEgPSByZWcgJiAweDBmOworCUlSREFfREVCVUcoMiwgIiVzKCksIHByb2JpbmcgaXJxPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGluZm8tPmlycSk7CisJCisJLyogUmVhZCBETUEgY2hhbm5lbCAqLworCW91dGIoMHg3NCwgY2ZnX2Jhc2UpOworCXJlZyA9IGluYihjZmdfYmFzZSsxKTsKKwlpbmZvLT5kbWEgPSByZWcgJiAweDA3OworCQorCWlmKGluZm8tPmRtYSA9PSAweDA0KQorCQlJUkRBX1dBUk5JTkcoIiVzKCksIE5vIERNQSBjaGFubmVsIGFzc2lnbmVkICFcbiIsIF9fRlVOQ1RJT05fXyk7CisJZWxzZQorCQlJUkRBX0RFQlVHKDIsICIlcygpLCBwcm9iaW5nIGRtYT0lZFxuIiwgX19GVU5DVElPTl9fLCBpbmZvLT5kbWEpOworCQorCS8qIFJlYWQgRW5hYmxlZCBTdGF0dXMgKi8KKwlvdXRiKDB4MzAsIGNmZ19iYXNlKTsKKwlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJaW5mby0+ZW5hYmxlZCA9IChyZWcgJiAweDgwKSAmJiAocmVnICYgMHgwMSk7CisJSVJEQV9ERUJVRygyLCAiJXMoKSwgcHJvYmluZyBlbmFibGVkPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGluZm8tPmVuYWJsZWQpOworCQorCS8qIFJlYWQgUG93ZXIgU3RhdHVzICovCisJb3V0YigweDIyLCBjZmdfYmFzZSk7CisJcmVnID0gaW5iKGNmZ19iYXNlKzEpOworCWluZm8tPnN1c3BlbmRlZCA9IChyZWcgJiAweDIwKTsKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBwcm9iaW5nIHN1c3BlbmRlZD0lZFxuIiwgX19GVU5DVElPTl9fLCBpbmZvLT5zdXNwZW5kZWQpOworCQorCS8qIEV4aXQgY29uZmlndXJhdGlvbiAqLworCW91dGIoMHhiYiwgY2ZnX2Jhc2UpOworCQkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CQorCQorCXJldHVybiAwOwkKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX3NldHVwIChpbmZvKQorICoKKyAqICAgIAlTZXQgRklSIEZJRk8gYW5kIERNQSBUaHJlc2hvbGQKKyAqCVJldHVybnMgbm9uLW5lZ2F0aXZlIG9uIHN1Y2Nlc3MuCisgKgorICovCitzdGF0aWMgaW50IGFsaV9pcmNjX3NldHVwKGNoaXBpb190ICppbmZvKQoreworCXVuc2lnbmVkIGNoYXIgdG1wOworCWludCB2ZXJzaW9uOworCWludCBpb2Jhc2UgPSBpbmZvLT5maXJfYmFzZTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCisJLyogTG9ja2luZyBjb21tZW50cyA6CisJICogTW9zdCBvcGVyYXRpb25zIGhlcmUgbmVlZCB0byBiZSBwcm90ZWN0ZWQuIFdlIGFyZSBjYWxsZWQgYmVmb3JlCisJICogdGhlIGRldmljZSBpbnN0YW5jZSBpcyBjcmVhdGVkIGluIGFsaV9pcmNjX29wZW4oKSwgdGhlcmVmb3JlIAorCSAqIG5vYm9keSBjYW4gYm90aGVyIHVzIC0gSmVhbiBJSSAqLworCisJLyogU3dpdGNoIHRvIEZJUiBzcGFjZSAqLworCVNJUjJGSVIoaW9iYXNlKTsKKwkKKwkvKiBNYXN0ZXIgUmVzZXQgKi8KKwlvdXRiKDB4NDAsIGlvYmFzZStGSVJfTUNSKTsgLy8gYmVuamFtaW4gMjAwMC8xMS8zMCAxMTo0NUFNCisJCisJLyogUmVhZCBGSVIgSUQgVmVyc2lvbiBSZWdpc3RlciAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzMpOworCXZlcnNpb24gPSBpbmIoaW9iYXNlK0ZJUl9JRF9WUik7CisJCisJLyogU2hvdWxkIGJlIDB4MDAgaW4gdGhlIE0xNTM1L00xNTM1RCAqLworCWlmKHZlcnNpb24gIT0gMHgwMCkKKwl7CisJCUlSREFfRVJST1IoIiVzLCBXcm9uZyBjaGlwIHZlcnNpb24gJTAyeFxuIiwgZHJpdmVyX25hbWUsIHZlcnNpb24pOworCQlyZXR1cm4gLTE7CisJfQorCQorCS8vIElSREFfTUVTU0FHRSgiJXMsIEZvdW5kIGNoaXAgYXQgYmFzZT0weCUwM3hcbiIsIGRyaXZlcl9uYW1lLCBpbmZvLT5jZmdfYmFzZSk7CisJCisJLyogU2V0IEZJUiBGSUZPIFRocmVzaG9sZCBSZWdpc3RlciAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCW91dGIoUlhfRklGT19UaHJlc2hvbGQsIGlvYmFzZStGSVJfRklGT19UUik7CisJCisJLyogU2V0IEZJUiBETUEgVGhyZXNob2xkIFJlZ2lzdGVyICovCisJb3V0YihSWF9ETUFfVGhyZXNob2xkLCBpb2Jhc2UrRklSX0RNQV9UUik7CisJCisJLyogQ1JDIGVuYWJsZSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworCW91dGIoaW5iKGlvYmFzZStGSVJfSVJEQV9DUikgfCBJUkRBX0NSX0NSQywgaW9iYXNlK0ZJUl9JUkRBX0NSKTsKKwkKKwkvKiBORElTIGRyaXZlciBzZXQgVFggTGVuZ3RoIGhlcmUgQkFOSzIgQWxpYXMgMywgQWxpYXM0Ki8KKwkKKwkvKiBTd2l0Y2ggdG8gQmFuayAwICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJCisJdG1wID0gaW5iKGlvYmFzZStGSVJfTENSX0IpOworCXRtcCAmPX4weDIwOyAvLyBkaXNhYmxlIFNJUAorCXRtcCB8PSAweDgwOyAvLyB0aGVzZSB0d28gc3RlcHMgbWFrZSBSWCBtb2RlCisJdG1wICY9IDB4YmY7CQorCW91dGIodG1wLCBpb2Jhc2UrRklSX0xDUl9CKTsKKwkJCisJLyogRGlzYWJsZSBJbnRlcnJ1cHQgKi8KKwlvdXRiKDB4MDAsIGlvYmFzZStGSVJfSUVSKTsKKwkKKwkKKwkvKiBTd2l0Y2ggdG8gU0lSIHNwYWNlICovCisJRklSMlNJUihpb2Jhc2UpOworCQorCUlSREFfTUVTU0FHRSgiJXMsIGRyaXZlciBsb2FkZWQgKEJlbmphbWluIEtvbmcpXG4iLCBkcml2ZXJfbmFtZSk7CisJCisJLyogRW5hYmxlIHJlY2VpdmUgaW50ZXJydXB0cyAqLyAKKwkvLyBvdXRiKFVBUlRfSUVSX1JESSwgaW9iYXNlK1VBUlRfSUVSKTsgLy9iZW5qYW1pbiAyMDAwLzExLzIzIDAxOjI1UE0KKwkvLyBUdXJuIG9uIHRoZSBpbnRlcnJ1cHRzIGluIGFsaV9pcmNjX25ldF9vcGVuCisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsJCisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19yZWFkX2RvbmdsZV9pZCAoaW50IGluZGV4LCBpbmZvKQorICoKKyAqIFRyeSB0byByZWFkIGRvbmdsZSBpbmRlbnRpZmljYXRpb24uIFRoaXMgcHJvY2VkdXJlIG5lZWRzIHRvIGJlIGV4ZWN1dGVkCisgKiBvbmNlIGFmdGVyIHBvd2VyLW9uL3Jlc2V0LiBJdCBhbHNvIG5lZWRzIHRvIGJlIHVzZWQgd2hlbmV2ZXIgeW91IHN1c3BlY3QKKyAqIHRoYXQgdGhlIHVzZXIgbWF5IGhhdmUgcGx1Z2dlZC91bnBsdWdnZWQgdGhlIElyREEgRG9uZ2xlLgorICovCitzdGF0aWMgaW50IGFsaV9pcmNjX3JlYWRfZG9uZ2xlX2lkIChpbnQgaSwgY2hpcGlvX3QgKmluZm8pCit7CisJaW50IGRvbmdsZV9pZCwgcmVnOworCWludCBjZmdfYmFzZSA9IGluZm8tPmNmZ19iYXNlOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCisJLyogRW50ZXIgQ29uZmlndXJhdGlvbiAqLworCW91dGIoY2hpcHNbaV0uZW50cjEsIGNmZ19iYXNlKTsKKwlvdXRiKGNoaXBzW2ldLmVudHIyLCBjZmdfYmFzZSk7CisJCisJLyogU2VsZWN0IExvZ2ljYWwgRGV2aWNlIDUgUmVnaXN0ZXJzIChVQVJUMikgKi8KKwlvdXRiKDB4MDcsIGNmZ19iYXNlKTsKKwlvdXRiKDB4MDUsIGNmZ19iYXNlKzEpOworCQorCS8qIFJlYWQgRG9uZ2xlIElEICovCisJb3V0YigweGYwLCBjZmdfYmFzZSk7CisJcmVnID0gaW5iKGNmZ19iYXNlKzEpOwkKKwlkb25nbGVfaWQgPSAoKHJlZz4+NikmMHgwMikgfCAoKHJlZz4+NSkmMHgwMSk7CisJSVJEQV9ERUJVRygyLCAiJXMoKSwgcHJvYmluZyBkb25nbGVfaWQ9JWQsIGRvbmdsZV90eXBlcz0lc1xuIiwgX19GVU5DVElPTl9fLCAKKwkJZG9uZ2xlX2lkLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7CisJCisJLyogRXhpdCBjb25maWd1cmF0aW9uICovCisJb3V0YigweGJiLCBjZmdfYmFzZSk7CisJCQkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOwkKKwkKKwlyZXR1cm4gZG9uZ2xlX2lkOworfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfaW50ZXJydXB0IChpcnEsIGRldl9pZCwgcmVncykKKyAqCisgKiAgICBBbiBpbnRlcnJ1cHQgZnJvbSB0aGUgY2hpcCBoYXMgYXJyaXZlZC4gVGltZSB0byBkbyBzb21lIHdvcmsKKyAqCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhbGlfaXJjY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGY7CisJaW50IHJldDsKKwkJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOworCQkKKyAJaWYgKCFkZXYpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGRyaXZlcl9uYW1lLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQkKKwkKKwlzZWxmID0gKHN0cnVjdCBhbGlfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJCisJc3Bpbl9sb2NrKCZzZWxmLT5sb2NrKTsKKwkKKwkvKiBEaXNwYXRjaCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIGN1cnJlbnQgc3BlZWQgKi8KKwlpZiAoc2VsZi0+aW8uc3BlZWQgPiAxMTUyMDApCisJCXJldCA9IGFsaV9pcmNjX2Zpcl9pbnRlcnJ1cHQoc2VsZik7CisJZWxzZQorCQlyZXQgPSBhbGlfaXJjY19zaXJfaW50ZXJydXB0KHNlbGYpOworCQkKKwlzcGluX3VubG9jaygmc2VsZi0+bG9jayk7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gcmV0OworfQorLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX2Zpcl9pbnRlcnJ1cHQoaXJxLCBzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpCisgKgorICogICAgSGFuZGxlIE1JUi9GSVIgaW50ZXJydXB0CisgKgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWxpX2lyY2NfZmlyX2ludGVycnVwdChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpCit7CisJX191OCBlaXIsIE9sZE1lc3NhZ2VDb3VudDsKKwlpbnQgaW9iYXNlLCB0bXA7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCQorCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOwkKKwlzZWxmLT5JbnRlcnJ1cHRJRCA9IGluYihpb2Jhc2UrRklSX0lJUik7CQkKKwlzZWxmLT5CdXNTdGF0dXMgPSBpbmIoaW9iYXNlK0ZJUl9CU1IpOwkKKwkKKwlPbGRNZXNzYWdlQ291bnQgPSAoc2VsZi0+TGluZVN0YXR1cyArIDEpICYgMHgwNzsKKwlzZWxmLT5MaW5lU3RhdHVzID0gaW5iKGlvYmFzZStGSVJfTFNSKTsJCisJLy9zZWxmLT5pZXIgPSBpbmIoaW9iYXNlK0ZJUl9JRVIpOyAJCTIwMDAvMTIvMSAwNDozMlBNCisJZWlyID0gc2VsZi0+SW50ZXJydXB0SUQgJiBzZWxmLT5pZXI7IC8qIE1hc2sgb3V0IHRoZSBpbnRlcmVzdGluZyBvbmVzICovIAorCQorCUlSREFfREVCVUcoMSwgIiVzKCksIHNlbGYtPkludGVycnVwdElEID0gJXhcbiIsIF9fRlVOQ1RJT05fXyxzZWxmLT5JbnRlcnJ1cHRJRCk7CisJSVJEQV9ERUJVRygxLCAiJXMoKSwgc2VsZi0+TGluZVN0YXR1cyA9ICV4XG4iLCBfX0ZVTkNUSU9OX18sc2VsZi0+TGluZVN0YXR1cyk7CisJSVJEQV9ERUJVRygxLCAiJXMoKSwgc2VsZi0+aWVyID0gJXhcbiIsIF9fRlVOQ1RJT05fXyxzZWxmLT5pZXIpOworCUlSREFfREVCVUcoMSwgIiVzKCksIGVpciA9ICV4XG4iLCBfX0ZVTkNUSU9OX18sZWlyKTsKKwkKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwkgU2V0Q09NSW50ZXJydXB0cyhzZWxmLCBGQUxTRSk7CisJCisJLyogVHggb3IgUnggSW50ZXJydXB0ICovCisJCisJaWYgKGVpciAmIElJUl9FT00pIAorCXsJCQorCQlpZiAoc2VsZi0+aW8uZGlyZWN0aW9uID09IElPX1hNSVQpIC8qIFRYICovCisJCXsKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksICoqKioqKiogSUlSX0VPTSAoVHgpICoqKioqKipcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkKKwkJCWlmKGFsaV9pcmNjX2RtYV94bWl0X2NvbXBsZXRlKHNlbGYpKQorCQkJeworCQkJCWlmIChpcmRhX2RldmljZV90eHF1ZXVlX2VtcHR5KHNlbGYtPm5ldGRldikpIAorCQkJCXsKKwkJCQkJLyogUHJlcGFyZSBmb3IgcmVjZWl2ZSAqLworCQkJCQlhbGlfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsJCQkJCQorCQkJCQlzZWxmLT5pZXIgPSBJRVJfRU9NOwkJCQkJCQkJCQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzZWxmLT5pZXIgPSBJRVJfRU9NOyAJCQkJCQorCQkJfQorCQkJCQkJCQkJCisJCX0JCisJCWVsc2UgLyogUlggKi8KKwkJeworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgKioqKioqKiBJSVJfRU9NIChSeCkgKioqKioqKlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQorCQkJaWYoT2xkTWVzc2FnZUNvdW50ID4gKChzZWxmLT5MaW5lU3RhdHVzKzEpICYgMHgwNykpCisJCQl7CisJCQkJc2VsZi0+cmN2RnJhbWVzT3ZlcmZsb3cgPSBUUlVFOwkKKwkJCQlJUkRBX0RFQlVHKDEsICIlcygpLCAqKioqKioqIHNlbGYtPnJjdkZyYW1lc092ZXJmbG93ID0gVFJVRSAqKioqKioqKiBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQl9CisJCQkJCQkKKwkJCWlmIChhbGlfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzZWxmKSkKKwkJCXsKKwkJCQlJUkRBX0RFQlVHKDEsICIlcygpLCAqKioqKioqIHJlY2VpdmUgY29tcGxldGUgKioqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCQorCQkJCXNlbGYtPmllciA9IElFUl9FT007CQkJCQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUlSREFfREVCVUcoMSwgIiVzKCksICoqKioqKiogTm90IHJlY2VpdmUgY29tcGxldGUgKioqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCQorCQkJCXNlbGYtPmllciA9IElFUl9FT00gfCBJRVJfVElNRVI7CQkJCQkJCQkKKwkJCX0JCisJCQorCQl9CQkKKwl9CisJLyogVGltZXIgSW50ZXJydXB0ICovCisJZWxzZSBpZiAoZWlyICYgSUlSX1RJTUVSKQorCXsJCisJCWlmKE9sZE1lc3NhZ2VDb3VudCA+ICgoc2VsZi0+TGluZVN0YXR1cysxKSAmIDB4MDcpKQorCQl7CisJCQlzZWxmLT5yY3ZGcmFtZXNPdmVyZmxvdyA9IFRSVUU7CQorCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgKioqKioqKiBzZWxmLT5yY3ZGcmFtZXNPdmVyZmxvdyA9IFRSVUUgKioqKioqKiBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCX0KKwkJLyogRGlzYWJsZSBUaW1lciAqLworCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksxKTsKKwkJdG1wID0gaW5iKGlvYmFzZStGSVJfQ1IpOworCQlvdXRiKCB0bXAmIH5DUl9USU1FUl9FTiwgaW9iYXNlK0ZJUl9DUik7CisJCQorCQkvKiBDaGVjayBpZiB0aGlzIGlzIGEgVHggdGltZXIgaW50ZXJydXB0ICovCisJCWlmIChzZWxmLT5pby5kaXJlY3Rpb24gPT0gSU9fWE1JVCkKKwkJeworCQkJYWxpX2lyY2NfZG1hX3htaXQoc2VsZik7CisJCQkKKwkJCS8qIEludGVycnVwdCBvbiBFT00gKi8KKwkJCXNlbGYtPmllciA9IElFUl9FT007CisJCQkJCQkJCQkKKwkJfQorCQllbHNlIC8qIFJ4ICovCisJCXsKKwkJCWlmKGFsaV9pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHNlbGYpKSAKKwkJCXsKKwkJCQlzZWxmLT5pZXIgPSBJRVJfRU9NOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXNlbGYtPmllciA9IElFUl9FT00gfCBJRVJfVElNRVI7CisJCQl9CQorCQl9CQkKKwl9CisJCisJLyogUmVzdG9yZSBJbnRlcnJ1cHQgKi8JCisJU2V0Q09NSW50ZXJydXB0cyhzZWxmLCBUUlVFKTsJCisJCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIElSUV9SRVRWQUwoZWlyKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX3Npcl9pbnRlcnJ1cHQgKGlycSwgc2VsZiwgZWlyKQorICoKKyAqICAgIEhhbmRsZSBTSVIgaW50ZXJydXB0CisgKgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWxpX2lyY2Nfc2lyX2ludGVycnVwdChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZTsKKwlpbnQgaWlyLCBsc3I7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJaWlyID0gaW5iKGlvYmFzZStVQVJUX0lJUikgJiBVQVJUX0lJUl9JRDsKKwlpZiAoaWlyKSB7CQorCQkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKwkJbHNyID0gaW5iKGlvYmFzZStVQVJUX0xTUik7CisKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgaWlyPSUwMngsIGxzcj0lMDJ4LCBpb2Jhc2U9JSN4XG4iLCBfX0ZVTkNUSU9OX18sIAorCQkJICAgaWlyLCBsc3IsIGlvYmFzZSk7CisKKwkJc3dpdGNoIChpaXIpIAorCQl7CisJCQljYXNlIFVBUlRfSUlSX1JMU0k6CisJCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgUkxTSVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVUFSVF9JSVJfUkRJOgorCQkJCS8qIFJlY2VpdmUgaW50ZXJydXB0ICovCisJCQkJYWxpX2lyY2Nfc2lyX3JlY2VpdmUoc2VsZik7CisJCQkJYnJlYWs7CisJCQljYXNlIFVBUlRfSUlSX1RIUkk6CisJCQkJaWYgKGxzciAmIFVBUlRfTFNSX1RIUkUpCisJCQkJeworCQkJCQkvKiBUcmFuc21pdHRlciByZWFkeSBmb3IgZGF0YSAqLworCQkJCQlhbGlfaXJjY19zaXJfd3JpdGVfd2FrZXVwKHNlbGYpOwkJCQkKKwkJCQl9CQkJCQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmhhbmRsZWQgSUlSPSUjeFxuIiwgX19GVU5DVElPTl9fLCBpaXIpOworCQkJCWJyZWFrOworCQl9IAorCQkKKwl9CisJCisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsJCisKKwlyZXR1cm4gSVJRX1JFVFZBTChpaXIpOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19zaXJfcmVjZWl2ZSAoc2VsZikKKyAqCisgKiAgICBSZWNlaXZlIG9uZSBmcmFtZSBmcm9tIHRoZSBpbmZyYXJlZCBwb3J0CisgKgorICovCitzdGF0aWMgdm9pZCBhbGlfaXJjY19zaXJfcmVjZWl2ZShzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpIAoreworCWludCBib2d1c2NvdW50ID0gMDsKKwlpbnQgaW9iYXNlOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwkvKiAgCisJICogUmVjZWl2ZSBhbGwgY2hhcmFjdGVycyBpbiBSeCBGSUZPLCB1bndyYXAgYW5kIHVuc3R1ZmYgdGhlbS4gCisgICAgICAgICAqIGFzeW5jX3Vud3JhcF9jaGFyIHdpbGwgZGVsaXZlciBhbGwgZm91bmQgZnJhbWVzICAKKwkgKi8KKwlkbyB7CisJCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPnN0YXRzLCAmc2VsZi0+cnhfYnVmZiwgCisJCQkJICBpbmIoaW9iYXNlK1VBUlRfUlgpKTsKKworCQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3Qgc3RheSBoZXJlIHRvbyBsb25nICovCisJCWlmIChib2d1c2NvdW50KysgPiAzMikgeworCQkJSVJEQV9ERUJVRygyLCIlcygpLCBicmVha2luZyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKGluYihpb2Jhc2UrVUFSVF9MU1IpICYgVUFSVF9MU1JfRFIpOwkKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19zaXJfd3JpdGVfd2FrZXVwICh0dHkpCisgKgorICogICAgQ2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZGF0YS4gIElmIHdlIGhhdmUKKyAqICAgIG1vcmUgcGFja2V0cyB0byBzZW5kLCB3ZSBzZW5kIHRoZW0gaGVyZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGFsaV9pcmNjX3Npcl93cml0ZV93YWtldXAoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCWludCBhY3R1YWwgPSAwOworCWludCBpb2Jhc2U7CQorCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwkvKiBGaW5pc2hlZCB3aXRoIGZyYW1lPyAgKi8KKwlpZiAoc2VsZi0+dHhfYnVmZi5sZW4gPiAwKSAgCisJeworCQkvKiBXcml0ZSBkYXRhIGxlZnQgaW4gdHJhbnNtaXQgYnVmZmVyICovCisJCWFjdHVhbCA9IGFsaV9pcmNjX3Npcl93cml0ZShpb2Jhc2UsIHNlbGYtPmlvLmZpZm9fc2l6ZSwgCisJCQkJICAgICAgc2VsZi0+dHhfYnVmZi5kYXRhLCBzZWxmLT50eF9idWZmLmxlbik7CisJCXNlbGYtPnR4X2J1ZmYuZGF0YSArPSBhY3R1YWw7CisJCXNlbGYtPnR4X2J1ZmYubGVuICAtPSBhY3R1YWw7CisJfSAKKwllbHNlIAorCXsKKwkJaWYgKHNlbGYtPm5ld19zcGVlZCkgCisJCXsKKwkJCS8qIFdlIG11c3Qgd2FpdCB1bnRpbCBhbGwgZGF0YSBhcmUgZ29uZSAqLworCQkJd2hpbGUoIShpbmIoaW9iYXNlK1VBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpKQorCQkJCUlSREFfREVCVUcoMSwgIiVzKCksIFVBUlRfTFNSX1RIUkVcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJCisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBDaGFuZ2luZyBzcGVlZCEgc2VsZi0+bmV3X3NwZWVkID0gJWRcbiIsIF9fRlVOQ1RJT05fXyAsIHNlbGYtPm5ld19zcGVlZCk7CisJCQlhbGlfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+bmV3X3NwZWVkKTsKKwkJCXNlbGYtPm5ld19zcGVlZCA9IDA7CQkJCisJCQkKKwkJCS8vIGJlbmphbWluIDIwMDAvMTEvMTAgMDY6MzJQTQorCQkJaWYgKHNlbGYtPmlvLnNwZWVkID4gMTE1MjAwKQorCQkJeworCQkJCUlSREFfREVCVUcoMiwgIiVzKCksIGFsaV9pcmNjX2NoYW5nZV9zcGVlZCBmcm9tIFVBUlRfTFNSX1RFTVQgXG4iLCBfX0ZVTkNUSU9OX18gKTsJCQkJCisJCQkJCQorCQkJCXNlbGYtPmllciA9IElFUl9FT007CisJCQkJLy8gU2V0Q09NSW50ZXJydXB0cyhzZWxmLCBUUlVFKTsJCQkJCQkJCisJCQkJcmV0dXJuOwkJCQkJCQkKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsJCisJCX0KKwkJCQorCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQorCQkvKiBUdXJuIG9uIHJlY2VpdmUgaW50ZXJydXB0cyAqLworCQlvdXRiKFVBUlRfSUVSX1JESSwgaW9iYXNlK1VBUlRfSUVSKTsKKwl9CisJCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKK30KKworc3RhdGljIHZvaWQgYWxpX2lyY2NfY2hhbmdlX3NwZWVkKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZiwgX191MzIgYmF1ZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2VsZi0+bmV0ZGV2OworCWludCBpb2Jhc2U7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBzZXR0aW5nIHNwZWVkID0gJWQgXG4iLCBfX0ZVTkNUSU9OX18gLCBiYXVkKTsKKwkKKwkvKiBUaGlzIGZ1bmN0aW9uICptdXN0KiBiZSBjYWxsZWQgd2l0aCBpcnEgb2ZmIGFuZCBzcGluLWxvY2suCisJICogLSBKZWFuIElJICovCisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkKKwlTZXRDT01JbnRlcnJ1cHRzKHNlbGYsIEZBTFNFKTsgLy8gMjAwMC8xMS8yNCAxMTo0M0FNCisJCisJLyogR28gdG8gTUlSLCBGSVIgU3BlZWQgKi8KKwlpZiAoYmF1ZCA+IDExNTIwMCkKKwl7CisJCQorCQkJCQkKKwkJYWxpX2lyY2NfZmlyX2NoYW5nZV9zcGVlZChzZWxmLCBiYXVkKTsJCQkKKwkJCisJCS8qIEluc3RhbGwgRklSIHhtaXQgaGFuZGxlciovCisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYWxpX2lyY2NfZmlyX2hhcmRfeG1pdDsJCQorCQkJCQorCQkvKiBFbmFibGUgSW50ZXJ1dXB0ICovCisJCXNlbGYtPmllciA9IElFUl9FT007IC8vIGJlbmphbWluIDIwMDAvMTEvMjAgMDc6MjRQTQkJCQkJCisJCQkJCisJCS8qIEJlIHJlYWR5IGZvciBpbmNvbW1pbmcgZnJhbWVzICovCisJCWFsaV9pcmNjX2RtYV9yZWNlaXZlKHNlbGYpOwkvLyBiZW5ham1pbiAyMDAwLzExLzggMDc6NDZQTSBub3QgY29tcGxldGUKKwl9CQorCS8qIEdvIHRvIFNJUiBTcGVlZCAqLworCWVsc2UKKwl7CisJCWFsaV9pcmNjX3Npcl9jaGFuZ2Vfc3BlZWQoc2VsZiwgYmF1ZCk7CisJCQkJCisJCS8qIEluc3RhbGwgU0lSIHhtaXQgaGFuZGxlciovCisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYWxpX2lyY2Nfc2lyX2hhcmRfeG1pdDsKKwl9CisJCisJCQorCVNldENPTUludGVycnVwdHMoc2VsZiwgVFJVRSk7CS8vIDIwMDAvMTEvMjQgMTE6NDNBTQorCQkKKwluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CQorCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKK30KKworc3RhdGljIHZvaWQgYWxpX2lyY2NfZmlyX2NoYW5nZV9zcGVlZChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnByaXYsIF9fdTMyIGJhdWQpCit7CisJCQorCWludCBpb2Jhc2U7IAorCXN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZiA9IChzdHJ1Y3QgYWxpX2lyY2NfY2IgKikgcHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCWRldiA9IHNlbGYtPm5ldGRldjsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCBzZWxmLT5pby5zcGVlZCA9ICVkLCBjaGFuZ2UgdG8gc3BlZWQgPSAlZFxuIiwgX19GVU5DVElPTl9fICxzZWxmLT5pby5zcGVlZCxiYXVkKTsKKwkKKwkvKiBDb21lIGZyb20gU0lSIHNwZWVkICovCisJaWYoc2VsZi0+aW8uc3BlZWQgPD0xMTUyMDApCisJeworCQlTSVIyRklSKGlvYmFzZSk7CisJfQorCQkKKwkvKiBVcGRhdGUgYWNjb3VudGluZyBmb3IgbmV3IHNwZWVkICovCisJc2VsZi0+aW8uc3BlZWQgPSBiYXVkOworCQkKKwkvLyBTZXQgRG9uZ2xlIFNwZWVkIG1vZGUKKwlhbGlfaXJjY19jaGFuZ2VfZG9uZ2xlX3NwZWVkKHNlbGYsIGJhdWQpOworCQkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfc2lyX2NoYW5nZV9zcGVlZCAoc2VsZiwgc3BlZWQpCisgKgorICogICAgU2V0IHNwZWVkIG9mIElyREEgcG9ydCB0byBzcGVjaWZpZWQgYmF1ZHJhdGUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGFsaV9pcmNjX3Npcl9jaGFuZ2Vfc3BlZWQoc3RydWN0IGFsaV9pcmNjX2NiICpwcml2LCBfX3UzMiBzcGVlZCkKK3sKKwlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IGFsaV9pcmNjX2NiICopIHByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaW9iYXNlOyAKKwlpbnQgZmNyOyAgICAvKiBGSUZPIGNvbnRyb2wgcmVnICovCisJaW50IGxjcjsgICAgLyogTGluZSBjb250cm9sIHJlZyAqLworCWludCBkaXZpc29yOworCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCBTZXR0aW5nIHNwZWVkIHRvOiAlZFxuIiwgX19GVU5DVElPTl9fICwgc3BlZWQpOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCQorCS8qIENvbWUgZnJvbSBNSVIgb3IgRklSIHNwZWVkICovCisJaWYoc2VsZi0+aW8uc3BlZWQgPjExNTIwMCkKKwl7CQorCQkvLyBTZXQgRG9uZ2xlIFNwZWVkIG1vZGUgZmlyc3QKKwkJYWxpX2lyY2NfY2hhbmdlX2RvbmdsZV9zcGVlZChzZWxmLCBzcGVlZCk7CisJCQkKKwkJRklSMlNJUihpb2Jhc2UpOworCX0KKwkJCisJLy8gQ2xlYXIgTGluZSBhbmQgQXV4aWx1YXJ5IHN0YXR1cyByZWdpc3RlcnMgMjAwMC8xMS8yNCAxMTo0N0FNCisJCQorCWluYihpb2Jhc2UrVUFSVF9MU1IpOworCWluYihpb2Jhc2UrVUFSVF9TQ1IpOworCQkKKwkvKiBVcGRhdGUgYWNjb3VudGluZyBmb3IgbmV3IHNwZWVkICovCisJc2VsZi0+aW8uc3BlZWQgPSBzcGVlZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwlkaXZpc29yID0gMTE1MjAwL3NwZWVkOworCQorCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPOworCisJLyogCisJICogVXNlIHRyaWdnZXIgbGV2ZWwgMSB0byBhdm9pZCAzIG1zLiB0aW1lb3V0IGRlbGF5IGF0IDk2MDAgYnBzLCBhbmQKKwkgKiBhbG1vc3QgMSw3IG1zIGF0IDE5MjAwIGJwcy4gQXQgc3BlZWRzIGFib3ZlIHRoYXQgd2UgY2FuIGp1c3QgZm9yZ2V0CisJICogYWJvdXQgdGhpcyB0aW1lb3V0IHNpbmNlIGl0IHdpbGwgYWx3YXlzIGJlIGZhc3QgZW5vdWdoLiAKKwkgKi8KKwlpZiAoc2VsZi0+aW8uc3BlZWQgPCAzODQwMCkKKwkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTsKKwllbHNlIAorCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xNDsKKyAgICAgICAgCisJLyogSXJEQSBwb3J0cyB1c2UgOE4xICovCisJbGNyID0gVUFSVF9MQ1JfV0xFTjg7CisJCisJb3V0YihVQVJUX0xDUl9ETEFCIHwgbGNyLCBpb2Jhc2UrVUFSVF9MQ1IpOyAvKiBTZXQgRExBQiAqLworCW91dGIoZGl2aXNvciAmIDB4ZmYsICAgICAgaW9iYXNlK1VBUlRfRExMKTsgLyogU2V0IHNwZWVkICovCisJb3V0YihkaXZpc29yID4+IDgsCSAgaW9iYXNlK1VBUlRfRExNKTsKKwlvdXRiKGxjciwJCSAgaW9iYXNlK1VBUlRfTENSKTsgLyogU2V0IDhOMQkqLworCW91dGIoZmNyLAkJICBpb2Jhc2UrVUFSVF9GQ1IpOyAvKiBFbmFibGUgRklGTydzICovCisKKwkvKiB3aXRob3V0IHRoaXMsIHRoZSBjb25lY3Rpb24gd2lsbCBiZSBicm9rZW4gYWZ0ZXIgY29tZSBiYWNrIGZyb20gRklSIHNwZWVkLAorCSAgIGJ1dCB3aXRoIHRoaXMsIHRoZSBTSVIgY29ubmVjdGlvbiBpcyBoYXJkZXIgdG8gZXN0YWJsaXNoZWQgKi8KKwlvdXRiKChVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMgfCBVQVJUX01DUl9PVVQyKSwgaW9iYXNlK1VBUlRfTUNSKTsKKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorfQorCitzdGF0aWMgdm9pZCBhbGlfaXJjY19jaGFuZ2VfZG9uZ2xlX3NwZWVkKHN0cnVjdCBhbGlfaXJjY19jYiAqcHJpdiwgaW50IHNwZWVkKQoreworCQorCXN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZiA9IChzdHJ1Y3QgYWxpX2lyY2NfY2IgKikgcHJpdjsKKwlpbnQgaW9iYXNlLGRvbmdsZV9pZDsKKwlpbnQgdG1wID0gMDsKKwkJCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCQorCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOyAJLyogb3IgaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7ICovCisJZG9uZ2xlX2lkID0gc2VsZi0+aW8uZG9uZ2xlX2lkOworCQorCS8qIFdlIGFyZSBhbHJlYWR5IGxvY2tlZCwgbm8gbmVlZCB0byBkbyBpdCBhZ2FpbiAqLworCQkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCBTZXQgU3BlZWQgZm9yICVzICwgU3BlZWQgPSAlZFxuIiwgX19GVU5DVElPTl9fICwgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0sIHNwZWVkKTsJCQorCQorCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworCXRtcCA9IGluYihpb2Jhc2UrRklSX0lSREFfQ1IpOworCQkKKwkvKiBJQk0gdHlwZSBkb25nbGUgKi8KKwlpZihkb25nbGVfaWQgPT0gMCkKKwl7CQkJCQorCQlpZihzcGVlZCA9PSA0MDAwMDAwKQorCQl7CisJCQkvLwkgICAgICBfXyBfXwkKKwkJCS8vIFNEL01PREUgX198ICAgICB8X18gX18KKwkJCS8vICAgICAgICAgICAgICAgX18gX18gCisJCQkvLyBJUlRYICAgIF9fIF9ffCAgICAgfF9fCisJCQkvLyAgICAgICAgIFQxIFQyIFQzIFQ0IFQ1CisJCQkKKwkJCXRtcCAmPSAgfklSREFfQ1JfSERMQzsJCS8vIEhETEM9MAorCQkJdG1wIHw9IElSREFfQ1JfQ1JDOwkgICAJLy8gQ1JDPTEKKwkJCQorCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMik7CisJCQlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsKKwkJCQorICAgICAgCQkJLy8gVDEgLT4gU0QvTU9ERTowIElSVFg6MAorICAgICAgCQkJdG1wICY9IH4weDA5OworICAgICAgCQkJdG1wIHw9IDB4MDI7CisgICAgICAJCQlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsKKyAgICAgIAkJCXVkZWxheSgyKTsKKyAgICAgIAkJCQorICAgICAgCQkJLy8gVDIgLT4gU0QvTU9ERToxIElSVFg6MAorICAgICAgCQkJdG1wICY9IH4weDAxOworICAgICAgCQkJdG1wIHw9IDB4MGE7CisgICAgICAJCQlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsKKyAgICAgIAkJCXVkZWxheSgyKTsKKyAgICAgIAkJCQorICAgICAgCQkJLy8gVDMgLT4gU0QvTU9ERToxIElSVFg6MQorICAgICAgCQkJdG1wIHw9IDB4MGI7CisgICAgICAJCQlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsKKyAgICAgIAkJCXVkZWxheSgyKTsKKyAgICAgIAkJCQorICAgICAgCQkJLy8gVDQgLT4gU0QvTU9ERTowIElSVFg6MQorICAgICAgCQkJdG1wICY9IH4weDA4OworICAgICAgCQkJdG1wIHw9IDB4MDM7CisgICAgICAJCQlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsKKyAgICAgIAkJCXVkZWxheSgyKTsKKyAgICAgIAkJCQorICAgICAgCQkJLy8gVDUgLT4gU0QvTU9ERTowIElSVFg6MAorICAgICAgCQkJdG1wICY9IH4weDA5OworICAgICAgCQkJdG1wIHw9IDB4MDI7CisgICAgICAJCQlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsKKyAgICAgIAkJCXVkZWxheSgyKTsKKyAgICAgIAkJCQorICAgICAgCQkJLy8gcmVzZXQgLT4gTm9ybWFsIFRYIG91dHB1dCBTaWduYWwKKyAgICAgIAkJCW91dGIodG1wICYgfjB4MDIsIGlvYmFzZStGSVJfSVJEQV9DUik7ICAgICAgCQkJCisJCX0KKwkJZWxzZSAvKiBzcGVlZCA8PTExNTIwMDAgKi8KKwkJewkKKwkJCS8vCSAgICAgIF9fCQorCQkJLy8gU0QvTU9ERSBfX3wgIHxfXworCQkJLy8KKwkJCS8vIElSVFggICAgX19fX19fX18KKwkJCS8vICAgICAgICAgVDEgVDIgVDMgIAorCQkJCisJCQkvKiBNSVIgMTE1MjAwLCA1NzYwMCAqLworCQkJaWYgKHNwZWVkPT0xMTUyMDAwKQorCQkJeworCQkJCXRtcCB8PSAweEEwOwkgICAvL0hETEM9MSwgMS4xNTJNYnBzPTEKKyAgICAgIAkJCX0KKyAgICAgIAkJCWVsc2UKKyAgICAgIAkJCXsKKwkJCQl0bXAgJj1+MHg4MDsJICAgLy9IRExDIDAuNTc2TWJwcworCQkJCXRtcCB8PSAweDIwOwkgICAvL0hETEM9MSwKKyAgICAgIAkJCX0JCQkKKyAgICAgIAkJCQorICAgICAgCQkJdG1wIHw9IElSREFfQ1JfQ1JDOwkgICAJLy8gQ1JDPTEKKyAgICAgIAkJCQorICAgICAgCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMik7CisgICAgICAJCQlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsKKwkJCQkJCQorCQkJLyogTUlSIDExNTIwMCwgNTc2MDAgKi8JCisJCQkJCQkKKwkJCS8vc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMik7CQkJCisJCQkvLyBUMSAtPiBTRC9NT0RFOjAgSVJUWDowCisgICAgICAJCQl0bXAgJj0gfjB4MDk7CisgICAgICAJCQl0bXAgfD0gMHgwMjsKKyAgICAgIAkJCW91dGIodG1wLCBpb2Jhc2UrRklSX0lSREFfQ1IpOworICAgICAgCQkJdWRlbGF5KDIpOworICAgICAgCQkJCisgICAgICAJCQkvLyBUMiAtPiBTRC9NT0RFOjEgSVJUWDowCisgICAgICAJCQl0bXAgJj0gfjB4MDE7ICAgICAKKyAgICAgIAkJCXRtcCB8PSAweDBhOyAgICAgIAorICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisgICAgICAJCQkKKyAgICAgIAkJCS8vIFQzIC0+IFNEL01PREU6MCBJUlRYOjAKKyAgICAgIAkJCXRtcCAmPSB+MHgwOTsKKyAgICAgIAkJCXRtcCB8PSAweDAyOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisgICAgICAJCQl1ZGVsYXkoMik7CisgICAgICAJCQkKKyAgICAgIAkJCS8vIHJlc2V0IC0+IE5vcm1hbCBUWCBvdXRwdXQgU2lnbmFsCisgICAgICAJCQlvdXRiKHRtcCAmIH4weDAyLCBpb2Jhc2UrRklSX0lSREFfQ1IpOyAgICAgIAkJCQkJCQorCQl9CQkKKwl9CisJZWxzZSBpZiAoZG9uZ2xlX2lkID09IDEpIC8qIEhQIEhEU0wtMzYwMCAqLworCXsKKwkJc3dpdGNoKHNwZWVkKQorCQl7CisJCWNhc2UgNDAwMDAwMDoKKwkJCXRtcCAmPSAgfklSREFfQ1JfSERMQzsJLy8gSERMQz0wCisJCQlicmVhazsJCisJCQkKKwkJY2FzZSAxMTUyMDAwOgorCQkJdG1wIHw9IDB4QTA7CSAgIAkvLyBIRExDPTEsIDEuMTUyTWJwcz0xCisgICAgICAJCQlicmVhazsKKyAgICAgIAkJCQorICAgICAgCQljYXNlIDU3NjAwMDoKKyAgICAgIAkJCXRtcCAmPX4weDgwOwkgICAJLy8gSERMQyAwLjU3Nk1icHMKKwkJCXRtcCB8PSAweDIwOwkgICAJLy8gSERMQz0xLAorCQkJYnJlYWs7CisgICAgICAJCX0JCQkKKwkJCQorCQl0bXAgfD0gSVJEQV9DUl9DUkM7CSAgIAkvLyBDUkM9MQorCQkJCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworICAgICAgCQlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsJCQorCX0KKwllbHNlIC8qIEhQIEhEU0wtMTEwMCAqLworCXsKKwkJaWYoc3BlZWQgPD0gMTE1MjAwKSAvKiBTSVIgKi8KKwkJeworCQkJCisJCQl0bXAgJj0gfklSREFfQ1JfRklSX1NJTjsJLy8gSFAgc2luIHNlbGVjdCA9IDAKKwkJCQorCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMik7CisgICAgICAJCQlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsJCQkKKwkJfQorCQllbHNlIC8qIE1JUiBGSVIgKi8KKwkJewkKKwkJCQorCQkJc3dpdGNoKHNwZWVkKQorCQkJeworCQkJY2FzZSA0MDAwMDAwOgorCQkJCXRtcCAmPSAgfklSREFfQ1JfSERMQzsJLy8gSERMQz0wCisJCQkJYnJlYWs7CQorCQkJCisJCQljYXNlIDExNTIwMDA6CisJCQkJdG1wIHw9IDB4QTA7CSAgIAkvLyBIRExDPTEsIDEuMTUyTWJwcz0xCisgICAgICAJCQkJYnJlYWs7CisgICAgICAJCQkKKyAgICAgIAkJCWNhc2UgNTc2MDAwOgorICAgICAgCQkJCXRtcCAmPX4weDgwOwkgICAJLy8gSERMQyAwLjU3Nk1icHMKKwkJCQl0bXAgfD0gMHgyMDsJICAgCS8vIEhETEM9MSwKKwkJCQlicmVhazsKKyAgICAgIAkJCX0JCQkKKwkJCQorCQkJdG1wIHw9IElSREFfQ1JfQ1JDOwkgICAJLy8gQ1JDPTEKKwkJCXRtcCB8PSBJUkRBX0NSX0ZJUl9TSU47CQkvLyBIUCBzaW4gc2VsZWN0ID0gMQorCQkJCisJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKyAgICAgIAkJCW91dGIodG1wLCBpb2Jhc2UrRklSX0lSREFfQ1IpOwkJCQorCQl9CisJfQorCQkJCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQkKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX3Npcl93cml0ZSAoZHJpdmVyKQorICoKKyAqICAgIEZpbGwgVHggRklGTyB3aXRoIHRyYW5zbWl0IGRhdGEKKyAqCisgKi8KK3N0YXRpYyBpbnQgYWxpX2lyY2Nfc2lyX3dyaXRlKGludCBpb2Jhc2UsIGludCBmaWZvX3NpemUsIF9fdTggKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgYWN0dWFsID0gMDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOworCQkKKwkvKiBUeCBGSUZPIHNob3VsZCBiZSBlbXB0eSEgKi8KKwlpZiAoIShpbmIoaW9iYXNlK1VBUlRfTFNSKSAmIFVBUlRfTFNSX1RIUkUpKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGZhaWxlZCwgZmlmbyBub3QgZW1wdHkhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIDA7CisJfQorICAgICAgICAKKwkvKiBGaWxsIEZJRk8gd2l0aCBjdXJyZW50IGZyYW1lICovCisJd2hpbGUgKChmaWZvX3NpemUtLSA+IDApICYmIChhY3R1YWwgPCBsZW4pKSB7CisJCS8qIFRyYW5zbWl0IG5leHQgYnl0ZSAqLworCQlvdXRiKGJ1ZlthY3R1YWxdLCBpb2Jhc2UrVUFSVF9UWCk7CisKKwkJYWN0dWFsKys7CisJfQorCQorICAgICAgICBJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisJcmV0dXJuIGFjdHVhbDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX25ldF9vcGVuIChkZXYpCisgKgorICogICAgU3RhcnQgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZjsKKwlpbnQgaW9iYXNlOworCWNoYXIgaHduYW1lWzMyXTsKKwkJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJCisJc2VsZiA9IChzdHJ1Y3QgYWxpX2lyY2NfY2IgKikgZGV2LT5wcml2OworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkKKwkvKiBSZXF1ZXN0IElSUSBhbmQgaW5zdGFsbCBJbnRlcnJ1cHQgSGFuZGxlciAqLworCWlmIChyZXF1ZXN0X2lycShzZWxmLT5pby5pcnEsIGFsaV9pcmNjX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpKSAKKwl7CisJCUlSREFfV0FSTklORygiJXMsIHVuYWJsZSB0byBhbGxvY2F0ZSBpcnE9JWRcbiIsIGRyaXZlcl9uYW1lLAorCQkJICAgICBzZWxmLT5pby5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJCisJLyoKKwkgKiBBbHdheXMgYWxsb2NhdGUgdGhlIERNQSBjaGFubmVsIGFmdGVyIHRoZSBJUlEsIGFuZCBjbGVhbiB1cCBvbiAKKwkgKiBmYWlsdXJlLgorCSAqLworCWlmIChyZXF1ZXN0X2RtYShzZWxmLT5pby5kbWEsIGRldi0+bmFtZSkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcywgdW5hYmxlIHRvIGFsbG9jYXRlIGRtYT0lZFxuIiwgZHJpdmVyX25hbWUsCisJCQkgICAgIHNlbGYtPmlvLmRtYSk7CisJCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgc2VsZik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkKKwkvKiBUdXJuIG9uIGludGVycnVwcyAqLworCW91dGIoVUFSVF9JRVJfUkRJICwgaW9iYXNlK1VBUlRfSUVSKTsKKworCS8qIFJlYWR5IHRvIHBsYXkhICovCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsgLy9iZW5qYW1pbiBieSBpcnBvcnQKKwkKKwkvKiBHaXZlIHNlbGYgYSBoYXJkd2FyZSBuYW1lICovCisJc3ByaW50Zihod25hbWUsICJBTEktRklSIEAgMHglMDN4Iiwgc2VsZi0+aW8uZmlyX2Jhc2UpOworCisJLyogCisJICogT3BlbiBuZXcgSXJMQVAgbGF5ZXIgaW5zdGFuY2UsIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgc2hvdWxkIGJlCisJICogaW5pdGlhbGl6ZWQgcHJvcGVybHkgCisJICovCisJc2VsZi0+aXJsYXAgPSBpcmxhcF9vcGVuKGRldiwgJnNlbGYtPnFvcywgaHduYW1lKTsKKwkJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfbmV0X2Nsb3NlIChkZXYpCisgKgorICogICAgU3RvcCB0aGUgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IGFsaV9pcmNjX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorewkKKworCXN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZjsKKwkvL2ludCBpb2Jhc2U7CisJCQkKKwlJUkRBX0RFQlVHKDQsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOworCQkKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlzZWxmID0gKHN0cnVjdCBhbGlfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOworCisJLyogU3RvcCBkZXZpY2UgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyogU3RvcCBhbmQgcmVtb3ZlIGluc3RhbmNlIG9mIElyTEFQICovCisJaWYgKHNlbGYtPmlybGFwKQorCQlpcmxhcF9jbG9zZShzZWxmLT5pcmxhcCk7CisJc2VsZi0+aXJsYXAgPSBOVUxMOworCQkKKwlkaXNhYmxlX2RtYShzZWxmLT5pby5kbWEpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJU2V0Q09NSW50ZXJydXB0cyhzZWxmLCBGQUxTRSk7CisJICAgICAgIAorCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgZGV2KTsKKwlmcmVlX2RtYShzZWxmLT5pby5kbWEpOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfZmlyX2hhcmRfeG1pdCAoc2tiLCBkZXYpCisgKgorICogICAgVHJhbnNtaXQgdGhlIGZyYW1lCisgKgorICovCitzdGF0aWMgaW50IGFsaV9pcmNjX2Zpcl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaW9iYXNlOworCV9fdTMyIHNwZWVkOworCWludCBtdHQsIGRpZmY7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCQorCXNlbGYgPSAoc3RydWN0IGFsaV9pcmNjX2NiICopIGRldi0+cHJpdjsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKiBNYWtlIHN1cmUgdGVzdHMgKiYgc3BlZWQgY2hhbmdlIGFyZSBhdG9taWMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQorCS8qIE5vdGUgOiB5b3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHNwZWVkIGNoYW5nZXMgYXJlIG5vdCBnb2luZworCSAqIHRvIGNvcnJ1cHQgYW55IG91dGdvaW5nIGZyYW1lLiBMb29rIGF0IG5zYy1pcmNjIGZvciB0aGUgZ29yeQorCSAqIGRldGFpbHMgLSBKZWFuIElJICovCisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlpZiAoKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJCS8qIENoZWNrIGZvciBlbXB0eSBmcmFtZSAqLworCQlpZiAoIXNrYi0+bGVuKSB7CisJCQlhbGlfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc3BlZWQpOyAKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJfQorCisJLyogUmVnaXN0ZXIgYW5kIGNvcHkgdGhpcyBmcmFtZSB0byBETUEgbWVtb3J5ICovCisJc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0ID0gc2VsZi0+dHhfZmlmby50YWlsOworCXNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5sZW4gPSBza2ItPmxlbjsKKwlzZWxmLT50eF9maWZvLnRhaWwgKz0gc2tiLT5sZW47CisKKwlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCW1lbWNweShzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0uc3RhcnQsIHNrYi0+ZGF0YSwgCisJICAgICAgIHNrYi0+bGVuKTsKKwkKKwlzZWxmLT50eF9maWZvLmxlbisrOworCXNlbGYtPnR4X2ZpZm8uZnJlZSsrOworCisJLyogU3RhcnQgdHJhbnNtaXQgb25seSBpZiB0aGVyZSBpcyBjdXJyZW50bHkgbm8gdHJhbnNtaXQgZ29pbmcgb24gKi8KKwlpZiAoc2VsZi0+dHhfZmlmby5sZW4gPT0gMSkgCisJeworCQkvKiBDaGVjayBpZiB3ZSBtdXN0IHdhaXQgdGhlIG1pbiB0dXJuIHRpbWUgb3Igbm90ICovCisJCW10dCA9IGlyZGFfZ2V0X210dChza2IpOworCQkJCQorCQlpZiAobXR0KSAKKwkJeworCQkJLyogQ2hlY2sgaG93IG11Y2ggdGltZSB3ZSBoYXZlIHVzZWQgYWxyZWFkeSAqLworCQkJZG9fZ2V0dGltZW9mZGF5KCZzZWxmLT5ub3cpOworCQkJCisJCQlkaWZmID0gc2VsZi0+bm93LnR2X3VzZWMgLSBzZWxmLT5zdGFtcC50dl91c2VjOworCQkJLyogc2VsZi0+c3RhbXAgaXMgc2V0IGZyb20gYWxpX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoKSAqLworCQkJCQkJCQorCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgKioqKioqKiBkaWZmID0gJWQgKioqKioqKiBcbiIsIF9fRlVOQ1RJT05fXyAsIGRpZmYpOwkKKwkJCQorCQkJaWYgKGRpZmYgPCAwKSAKKwkJCQlkaWZmICs9IDEwMDAwMDA7CisJCQkKKwkJCS8qIENoZWNrIGlmIHRoZSBtdHQgaXMgbGFyZ2VyIHRoYW4gdGhlIHRpbWUgd2UgaGF2ZQorCQkJICogYWxyZWFkeSB1c2VkIGJ5IGFsbCB0aGUgcHJvdG9jb2wgcHJvY2Vzc2luZworCQkJICovCisJCQlpZiAobXR0ID4gZGlmZikKKwkJCXsJCQkJCisJCQkJbXR0IC09IGRpZmY7CisJCQkJCQkJCQorCQkJCS8qIAorCQkJCSAqIFVzZSB0aW1lciBpZiBkZWxheSBsYXJnZXIgdGhhbiAxMDAwIHVzLCBhbmQKKwkJCQkgKiB1c2UgdWRlbGF5IGZvciBzbWFsbGVyIHZhbHVlcyB3aGljaCBzaG91bGQKKwkJCQkgKiBiZSBhY2NlcHRhYmxlCisJCQkJICovCisJCQkJaWYgKG10dCA+IDUwMCkgCisJCQkJeworCQkJCQkvKiBBZGp1c3QgZm9yIHRpbWVyIHJlc29sdXRpb24gKi8KKwkJCQkJbXR0ID0gKG10dCsyNTApIC8gNTAwOyAJLyogNCBkaXNjYXJkLCA1IGdldCBhZHZhbmNlZCwgTGV0J3Mgcm91bmQgb2ZmICovCisJCQkJCQorCQkJCQlJUkRBX0RFQlVHKDEsICIlcygpLCAqKioqKioqKioqKioqKiBtdHQgPSAlZCAqKioqKioqKioqKlxuIiwgX19GVU5DVElPTl9fICwgbXR0KTsJCisJCQkJCQorCQkJCQkvKiBTZXR1cCB0aW1lciAqLworCQkJCQlpZiAobXR0ID09IDEpIC8qIDUwMCB1cyAqLworCQkJCQl7CisJCQkJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksxKTsKKwkJCQkJCW91dGIoVElNRVJfSUlSXzUwMCwgaW9iYXNlK0ZJUl9USU1FUl9JSVIpOworCQkJCQl9CQorCQkJCQllbHNlIGlmIChtdHQgPT0gMikgLyogMSBtcyAqLworCQkJCQl7CisJCQkJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksxKTsKKwkJCQkJCW91dGIoVElNRVJfSUlSXzFtcywgaW9iYXNlK0ZJUl9USU1FUl9JSVIpOworCQkJCQl9CQkJCQkKKwkJCQkJZWxzZSAvKiA+IDJtcyAtPiA0bXMgKi8KKwkJCQkJeworCQkJCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMSk7CisJCQkJCQlvdXRiKFRJTUVSX0lJUl8ybXMsIGlvYmFzZStGSVJfVElNRVJfSUlSKTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJCisJCQkJCS8qIFN0YXJ0IHRpbWVyICovCisJCQkJCW91dGIoaW5iKGlvYmFzZStGSVJfQ1IpIHwgQ1JfVElNRVJfRU4sIGlvYmFzZStGSVJfQ1IpOworCQkJCQlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19YTUlUOworCQkJCQkKKwkJCQkJLyogRW5hYmxlIHRpbWVyIGludGVycnVwdCAqLworCQkJCQlzZWxmLT5pZXIgPSBJRVJfVElNRVI7CisJCQkJCVNldENPTUludGVycnVwdHMoc2VsZiwgVFJVRSk7CQkJCQkKKwkJCQkJCisJCQkJCS8qIFRpbWVyIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSByZXN0ICovCisJCQkJCWdvdG8gb3V0OyAKKwkJCQl9IAorCQkJCWVsc2UKKwkJCQkJdWRlbGF5KG10dCk7CisJCQl9IC8vIGlmIChpZiAobXR0ID4gZGlmZikKKwkJfS8vIGlmIChtdHQpIAorCQkJCQorCQkvKiBFbmFibGUgRU9NIGludGVycnVwdCAqLworCQlzZWxmLT5pZXIgPSBJRVJfRU9NOworCQlTZXRDT01JbnRlcnJ1cHRzKHNlbGYsIFRSVUUpOworCQkKKwkJLyogVHJhbnNtaXQgZnJhbWUgKi8KKwkJYWxpX2lyY2NfZG1hX3htaXQoc2VsZik7CisJfSAvLyBpZiAoc2VsZi0+dHhfZmlmby5sZW4gPT0gMSkgCisJCisgb3V0OgorIAkKKwkvKiBOb3QgYnVzeSB0cmFuc21pdHRpbmcgYW55bW9yZSBpZiB3aW5kb3cgaXMgbm90IGZ1bGwgKi8KKwlpZiAoc2VsZi0+dHhfZmlmby5mcmVlIDwgTUFYX1RYX1dJTkRPVykKKwkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQorCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwlyZXR1cm4gMDsJCit9CisKKworc3RhdGljIHZvaWQgYWxpX2lyY2NfZG1hX3htaXQoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2UsIHRtcDsKKwl1bnNpZ25lZCBjaGFyIEZJRk9fT1BUSSwgSGksIExvOworCQorCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkKKwkvKiBGSUZPIHRocmVzaG9sZCAsIHRoaXMgbWV0aG9kIGNvbWVzIGZyb20gTkRJUzUgY29kZSAqLworCQorCWlmKHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5wdHJdLmxlbiA8IFRYX0ZJRk9fVGhyZXNob2xkKQorCQlGSUZPX09QVEkgPSBzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5sZW4tMTsKKwllbHNlCisJCUZJRk9fT1BUSSA9IFRYX0ZJRk9fVGhyZXNob2xkOworCQorCS8qIERpc2FibGUgRE1BICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMSk7CisJb3V0YihpbmIoaW9iYXNlK0ZJUl9DUikgJiB+Q1JfRE1BX0VOLCBpb2Jhc2UrRklSX0NSKTsKKwkKKwlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19YTUlUOworCQorCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYSwgCisJCSAgICAgICAoKHU4ICopc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLnB0cl0uc3RhcnQgLQorCQkJc2VsZi0+dHhfYnVmZi5oZWFkKSArIHNlbGYtPnR4X2J1ZmZfZG1hLAorCQkgICAgICAgc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLnB0cl0ubGVuLCAKKwkJICAgICAgIERNQV9UWF9NT0RFKTsKKwkJCisJLyogUmVzZXQgVHggRklGTyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCW91dGIoTENSX0FfRklGT19SRVNFVCwgaW9iYXNlK0ZJUl9MQ1JfQSk7CisJCisJLyogU2V0IFR4IEZJRk8gdGhyZXNob2xkICovCisJaWYgKHNlbGYtPmZpZm9fb3B0aV9idWYhPUZJRk9fT1BUSSkgCisJeworCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksxKTsKKwkgICAgCW91dGIoRklGT19PUFRJLCBpb2Jhc2UrRklSX0ZJRk9fVFIpIDsKKwkgICAgCXNlbGYtPmZpZm9fb3B0aV9idWY9RklGT19PUFRJOworCX0KKwkKKwkvKiBTZXQgVHggRE1BIHRocmVzaG9sZCAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCW91dGIoVFhfRE1BX1RocmVzaG9sZCwgaW9iYXNlK0ZJUl9ETUFfVFIpOworCQorCS8qIFNldCBtYXggVHggZnJhbWUgc2l6ZSAqLworCUhpID0gKHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5wdHJdLmxlbiA+PiA4KSAmIDB4MGY7CisJTG8gPSBzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5sZW4gJiAweGZmOworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworCW91dGIoSGksIGlvYmFzZStGSVJfVFhfRFNSX0hJKTsKKwlvdXRiKExvLCBpb2Jhc2UrRklSX1RYX0RTUl9MTyk7CisJCisJLyogRGlzYWJsZSBTSVAgLCBEaXNhYmxlIEJyaWNrIFdhbGwgKHdlIGRvbid0IHN1cHBvcnQgaW4gVFggbW9kZSksIENoYW5nZSB0byBUWCBtb2RlICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CQorCXRtcCA9IGluYihpb2Jhc2UrRklSX0xDUl9CKTsKKwl0bXAgJj0gfjB4MjA7IC8vIERpc2FibGUgU0lQCisJb3V0YigoKHVuc2lnbmVkIGNoYXIpKHRtcCAmIDB4M2YpIHwgTENSX0JfVFhfTU9ERSkgJiB+TENSX0JfQlcsIGlvYmFzZStGSVJfTENSX0IpOworCUlSREFfREVCVUcoMSwgIiVzKCksICoqKioqKiogQ2hhbmdlIHRvIFRYIG1vZGU6IEZJUl9MQ1JfQiA9IDB4JXggKioqKioqKiBcbiIsIF9fRlVOQ1RJT05fXyAsIGluYihpb2Jhc2UrRklSX0xDUl9CKSk7CisJCisJb3V0YigwLCBpb2Jhc2UrRklSX0xTUik7CisJCQkKKwkvKiBFbmFibGUgRE1BIGFuZCBCdXJzdCBNb2RlICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMSk7CisJb3V0YihpbmIoaW9iYXNlK0ZJUl9DUikgfCBDUl9ETUFfRU4gfCBDUl9ETUFfQlVSU1QsIGlvYmFzZStGSVJfQ1IpOworCQorCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOyAKKwkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKK30KKworc3RhdGljIGludCAgYWxpX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisJaW50IHJldCA9IFRSVUU7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCQorCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCQorCS8qIERpc2FibGUgRE1BICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMSk7CisJb3V0YihpbmIoaW9iYXNlK0ZJUl9DUikgJiB+Q1JfRE1BX0VOLCBpb2Jhc2UrRklSX0NSKTsKKwkKKwkvKiBDaGVjayBmb3IgdW5kZXJydW4hICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJaWYoKGluYihpb2Jhc2UrRklSX0xTUikgJiBMU1JfRlJBTUVfQUJPUlQpID09IExTUl9GUkFNRV9BQk9SVCkKKwkKKwl7CisJCUlSREFfRVJST1IoIiVzKCksICoqKioqKioqKiBMU1JfRlJBTUVfQUJPUlQgKioqKioqKioqXG4iLCBfX0ZVTkNUSU9OX18pOwkKKwkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7CisJCXNlbGYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CQkKKwl9CisJZWxzZSAKKwl7CisJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KKwlpZiAoc2VsZi0+bmV3X3NwZWVkKSAKKwl7CisJCWFsaV9pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzZWxmLT5uZXdfc3BlZWQpOworCQlzZWxmLT5uZXdfc3BlZWQgPSAwOworCX0KKworCS8qIEZpbmlzaGVkIHdpdGggdGhpcyBmcmFtZSwgc28gcHJlcGFyZSBmb3IgbmV4dCAqLworCXNlbGYtPnR4X2ZpZm8ucHRyKys7CisJc2VsZi0+dHhfZmlmby5sZW4tLTsKKworCS8qIEFueSBmcmFtZXMgdG8gYmUgc2VudCBiYWNrLXRvLWJhY2s/ICovCisJaWYgKHNlbGYtPnR4X2ZpZm8ubGVuKSAKKwl7CisJCWFsaV9pcmNjX2RtYV94bWl0KHNlbGYpOworCQkKKwkJLyogTm90IGZpbmlzaGVkIHlldCEgKi8KKwkJcmV0ID0gRkFMU0U7CisJfSAKKwllbHNlIAorCXsJLyogUmVzZXQgVHggRklGTyBpbmZvICovCisJCXNlbGYtPnR4X2ZpZm8ubGVuID0gc2VsZi0+dHhfZmlmby5wdHIgPSBzZWxmLT50eF9maWZvLmZyZWUgPSAwOworCQlzZWxmLT50eF9maWZvLnRhaWwgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisJfQorCisJLyogTWFrZSBzdXJlIHdlIGhhdmUgcm9vbSBmb3IgbW9yZSBmcmFtZXMgKi8KKwlpZiAoc2VsZi0+dHhfZmlmby5mcmVlIDwgTUFYX1RYX1dJTkRPVykgeworCQkvKiBOb3QgYnVzeSB0cmFuc21pdHRpbmcgYW55bW9yZSAqLworCQkvKiBUZWxsIHRoZSBuZXR3b3JrIGxheWVyLCB0aGF0IHdlIGNhbiBhY2NlcHQgbW9yZSBmcmFtZXMgKi8KKwkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCX0KKwkJCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7IAorCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfZG1hX3JlY2VpdmUgKHNlbGYpCisgKgorICogICAgR2V0IHJlYWR5IGZvciByZWNlaXZpbmcgYSBmcmFtZS4gVGhlIGRldmljZSB3aWxsIGluaXRpYXRlIGEgRE1BCisgKiAgICBpZiBpdCBzdGFydHMgdG8gcmVjZWl2ZSBhIGZyYW1lLgorICoKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19kbWFfcmVjZWl2ZShzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpIAoreworCWludCBpb2Jhc2UsIHRtcDsKKwkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJCisJLyogUmVzZXQgVHggRklGTyBpbmZvICovCisJc2VsZi0+dHhfZmlmby5sZW4gPSBzZWxmLT50eF9maWZvLnB0ciA9IHNlbGYtPnR4X2ZpZm8uZnJlZSA9IDA7CisJc2VsZi0+dHhfZmlmby50YWlsID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCQkKKwkvKiBEaXNhYmxlIERNQSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCW91dGIoaW5iKGlvYmFzZStGSVJfQ1IpICYgfkNSX0RNQV9FTiwgaW9iYXNlK0ZJUl9DUik7CisJCisJLyogUmVzZXQgTWVzc2FnZSBDb3VudCAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCW91dGIoMHgwNywgaW9iYXNlK0ZJUl9MU1IpOworCQkKKwlzZWxmLT5yY3ZGcmFtZXNPdmVyZmxvdyA9IEZBTFNFOwkKKwkKKwlzZWxmLT5MaW5lU3RhdHVzID0gaW5iKGlvYmFzZStGSVJfTFNSKSA7CisJCisJLyogUmVzZXQgUnggRklGTyBpbmZvICovCisJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fUkVDVjsKKwlzZWxmLT5yeF9idWZmLmRhdGEgPSBzZWxmLT5yeF9idWZmLmhlYWQ7CisJCQorCS8qIFJlc2V0IFJ4IEZJRk8gKi8KKwkvLyBzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKExDUl9BX0ZJRk9fUkVTRVQsIGlvYmFzZStGSVJfTENSX0EpOyAKKwkKKwlzZWxmLT5zdF9maWZvLmxlbiA9IHNlbGYtPnN0X2ZpZm8ucGVuZGluZ19ieXRlcyA9IDA7CisJc2VsZi0+c3RfZmlmby50YWlsID0gc2VsZi0+c3RfZmlmby5oZWFkID0gMDsKKwkJCisJaXJkYV9zZXR1cF9kbWEoc2VsZi0+aW8uZG1hLCBzZWxmLT5yeF9idWZmX2RtYSwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJICAgICAgIERNQV9SWF9NT0RFKTsKKwkgCisJLyogU2V0IFJlY2VpdmUgTW9kZSxCcmljayBXYWxsICovCisJLy9zd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwl0bXAgPSBpbmIoaW9iYXNlK0ZJUl9MQ1JfQik7CisJb3V0YigodW5zaWduZWQgY2hhcikodG1wICYweDNmKSB8IExDUl9CX1JYX01PREUgfCBMQ1JfQl9CVyAsIGlvYmFzZSArIEZJUl9MQ1JfQik7IC8vIDIwMDAvMTIvMSAwNToxNlBNCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgKioqIENoYW5nZSBUbyBSWCBtb2RlOiBGSVJfTENSX0IgPSAweCV4ICoqKiBcbiIsIF9fRlVOQ1RJT05fXyAsIGluYihpb2Jhc2UrRklSX0xDUl9CKSk7CisJCQkKKwkvKiBTZXQgUnggVGhyZXNob2xkICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMSk7CisJb3V0YihSWF9GSUZPX1RocmVzaG9sZCwgaW9iYXNlK0ZJUl9GSUZPX1RSKTsKKwlvdXRiKFJYX0RNQV9UaHJlc2hvbGQsIGlvYmFzZStGSVJfRE1BX1RSKTsKKwkJCisJLyogRW5hYmxlIERNQSBhbmQgQnVyc3QgTW9kZSAqLworCS8vIHN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCW91dGIoQ1JfRE1BX0VOIHwgQ1JfRE1BX0JVUlNULCBpb2Jhc2UrRklSX0NSKTsKKwkJCQkKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsgCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50ICBhbGlfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpCit7CisJc3RydWN0IHN0X2ZpZm8gKnN0X2ZpZm87CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlfX3U4IHN0YXR1cywgTWVzc2FnZUNvdW50OworCWludCBsZW4sIGksIGlvYmFzZSwgdmFsOwkKKworCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKworCXN0X2ZpZm8gPSAmc2VsZi0+c3RfZmlmbzsJCQorCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOwkKKwkJCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJTWVzc2FnZUNvdW50ID0gaW5iKGlvYmFzZSsgRklSX0xTUikmMHgwNzsKKwkKKwlpZiAoTWVzc2FnZUNvdW50ID4gMCkJCisJCUlSREFfREVCVUcoMCwgIiVzKCksIE1lc3NzYWdlIGNvdW50ID0gJWQsXG4iLCBfX0ZVTkNUSU9OX18gLCBNZXNzYWdlQ291bnQpOwkKKwkJCisJZm9yIChpPTA7IGk8PU1lc3NhZ2VDb3VudDsgaSsrKQorCXsKKwkJLyogQmFuayAwICovCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQlzdGF0dXMgPSBpbmIoaW9iYXNlK0ZJUl9MU1IpOworCQkKKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMik7CisJCWxlbiA9IGluYihpb2Jhc2UrRklSX1JYX0RTUl9ISSkgJiAweDBmOworCQlsZW4gPSBsZW4gPDwgODsgCisJCWxlbiB8PSBpbmIoaW9iYXNlK0ZJUl9SWF9EU1JfTE8pOworCQkKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgUlggTGVuZ3RoID0gMHglLjJ4LFxuIiwgX19GVU5DVElPTl9fICwgbGVuKTsJCisJCUlSREFfREVCVUcoMSwgIiVzKCksIFJYIFN0YXR1cyA9IDB4JS4yeCxcbiIsIF9fRlVOQ1RJT05fXyAsIHN0YXR1cyk7CisJCQorCQlpZiAoc3RfZmlmby0+dGFpbCA+PSBNQVhfUlhfV0lORE9XKSB7CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCB3aW5kb3cgaXMgZnVsbCFcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJY29udGludWU7CisJCX0KKwkJCQorCQlzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPnRhaWxdLnN0YXR1cyA9IHN0YXR1czsKKwkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT50YWlsXS5sZW4gPSBsZW47CisJCXN0X2ZpZm8tPnBlbmRpbmdfYnl0ZXMgKz0gbGVuOworCQlzdF9maWZvLT50YWlsKys7CisJCXN0X2ZpZm8tPmxlbisrOworCX0KKwkJCQorCWZvciAoaT0wOyBpPD1NZXNzYWdlQ291bnQ7IGkrKykKKwl7CQorCQkvKiBHZXQgZmlyc3QgZW50cnkgKi8KKwkJc3RhdHVzID0gc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT5oZWFkXS5zdGF0dXM7CisJCWxlbiAgICA9IHN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0ubGVuOworCQlzdF9maWZvLT5wZW5kaW5nX2J5dGVzIC09IGxlbjsKKwkJc3RfZmlmby0+aGVhZCsrOworCQlzdF9maWZvLT5sZW4tLTsJCQkKKwkJCisJCS8qIENoZWNrIGZvciBlcnJvcnMgKi8KKwkJaWYgKChzdGF0dXMgJiAweGQ4KSB8fCBzZWxmLT5yY3ZGcmFtZXNPdmVyZmxvdyB8fCAobGVuPT0wKSkgCQkKKwkJeworCQkJSVJEQV9ERUJVRygwLCIlcygpLCAqKioqKioqKioqKioqIFJYIEVycm9ycyAqKioqKioqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisJCQkKKwkJCS8qIFNraXAgZnJhbWUgKi8KKwkJCXNlbGYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCisJCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOworCQkJCisJCQlpZiAoc3RhdHVzICYgTFNSX0ZJRk9fVVIpIAorCQkJeworCQkJCXNlbGYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCUlSREFfREVCVUcoMCwiJXMoKSwgKioqKioqKioqKioqKiBGSUZPIEVycm9ycyAqKioqKioqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCX0JCisJCQlpZiAoc3RhdHVzICYgTFNSX0ZSQU1FX0VSUk9SKQorCQkJeworCQkJCXNlbGYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCUlSREFfREVCVUcoMCwiJXMoKSwgKioqKioqKioqKioqKiBGUkFNRSBFcnJvcnMgKioqKioqKioqKioqIFxuIiwgX19GVU5DVElPTl9fICk7CisJCQl9CisJCQkJCQkJCisJCQlpZiAoc3RhdHVzICYgTFNSX0NSQ19FUlJPUikgCisJCQl7CisJCQkJc2VsZi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCUlSREFfREVCVUcoMCwiJXMoKSwgKioqKioqKioqKioqKiBDUkMgRXJyb3JzICoqKioqKioqKioqKiBcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJfQorCQkJCisJCQlpZihzZWxmLT5yY3ZGcmFtZXNPdmVyZmxvdykKKwkJCXsKKwkJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKioqKiogT3ZlcnJhbiBETUEgYnVmZmVyICoqKioqKioqKioqKiBcbiIsIF9fRlVOQ1RJT05fXyApOwkJCQkJCQkJCisJCQl9CisJCQlpZihsZW4gPT0gMCkKKwkJCXsKKwkJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKiogUmVjZWl2ZSBGcmFtZSBTaXplID0gMCAqKioqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCX0KKwkJfQkgCisJCWVsc2UgCisJCXsKKwkJCQorCQkJaWYgKHN0X2ZpZm8tPnBlbmRpbmdfYnl0ZXMgPCAzMikgCisJCQl7CisJCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJCQkJdmFsID0gaW5iKGlvYmFzZStGSVJfQlNSKTsJCisJCQkJaWYgKCh2YWwmIEJTUl9GSUZPX05PVF9FTVBUWSk9PSAweDgwKSAKKwkJCQl7CisJCQkJCUlSREFfREVCVUcoMCwgIiVzKCksICoqKioqKioqKioqKiogQlNSX0ZJRk9fTk9UX0VNUFRZICoqKioqKioqKioqKiBcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJCQkKKwkJCQkJLyogUHV0IHRoaXMgZW50cnkgYmFjayBpbiBmaWZvICovCisJCQkJCXN0X2ZpZm8tPmhlYWQtLTsKKwkJCQkJc3RfZmlmby0+bGVuKys7CisJCQkJCXN0X2ZpZm8tPnBlbmRpbmdfYnl0ZXMgKz0gbGVuOworCQkJCQlzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLnN0YXR1cyA9IHN0YXR1czsKKwkJCQkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT5oZWFkXS5sZW4gPSBsZW47CisJCQkJCQkKKwkJCQkJLyogIAorCQkgCQkJKiBETUEgbm90IGZpbmlzaGVkIHlldCwgc28gdHJ5IGFnYWluIAorCQkgCQkJKiBsYXRlciwgc2V0IHRpbWVyIHZhbHVlLCByZXNvbHV0aW9uIAorCQkgCQkJKiA1MDAgdXMgCisJCSAJCQkqLworCQkJCQkgCisJCQkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCQkJCQlvdXRiKFRJTUVSX0lJUl81MDAsIGlvYmFzZStGSVJfVElNRVJfSUlSKTsgLy8gMjAwMS8xLzIgMDU6MDdQTQorCQkJCQkKKwkJCQkJLyogRW5hYmxlIFRpbWVyICovCisJCQkJCW91dGIoaW5iKGlvYmFzZStGSVJfQ1IpIHwgQ1JfVElNRVJfRU4sIGlvYmFzZStGSVJfQ1IpOworCQkJCQkJCisJCQkJCXJldHVybiBGQUxTRTsgLyogSSdsbCBiZSBiYWNrISAqLworCQkJCX0KKwkJCX0JCQorCQkJCisJCQkvKiAKKwkJCSAqIFJlbWVtYmVyIHRoZSB0aW1lIHdlIHJlY2VpdmVkIHRoaXMgZnJhbWUsIHNvIHdlIGNhbgorCQkJICogcmVkdWNlIHRoZSBtaW4gdHVybiB0aW1lIGEgYml0IHNpbmNlIHdlIHdpbGwga25vdworCQkJICogaG93IG11Y2ggdGltZSB3ZSBoYXZlIHVzZWQgZm9yIHByb3RvY29sIHByb2Nlc3NpbmcKKwkJCSAqLworCQkJZG9fZ2V0dGltZW9mZGF5KCZzZWxmLT5zdGFtcCk7CisKKwkJCXNrYiA9IGRldl9hbGxvY19za2IobGVuKzEpOworCQkJaWYgKHNrYiA9PSBOVUxMKSAgCisJCQl7CisJCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBtZW1vcnkgc3F1ZWV6ZSwgIgorCQkJCQkgICAgICJkcm9wcGluZyBmcmFtZS5cbiIsCisJCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCQlzZWxmLT5zdGF0cy5yeF9kcm9wcGVkKys7CisKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQkKKwkJCS8qIE1ha2Ugc3VyZSBJUCBoZWFkZXIgZ2V0cyBhbGlnbmVkICovCisJCQlza2JfcmVzZXJ2ZShza2IsIDEpOyAKKwkJCQorCQkJLyogQ29weSBmcmFtZSB3aXRob3V0IENSQywgQ1JDIGlzIHJlbW92ZWQgYnkgaGFyZHdhcmUqLworCQkJc2tiX3B1dChza2IsIGxlbik7CisJCQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbik7CisKKwkJCS8qIE1vdmUgdG8gbmV4dCBmcmFtZSAqLworCQkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKKwkJCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKworCQkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CisJCQlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCXNlbGYtPm5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCX0KKwl9CisJCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CQorCQkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisJcmV0dXJuIFRSVUU7Cit9CisKKworCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2Nfc2lyX2hhcmRfeG1pdCAoc2tiLCBkZXYpCisgKgorICogICAgVHJhbnNtaXQgdGhlIGZyYW1lIQorICoKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19zaXJfaGFyZF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlvYmFzZTsKKwlfX3UzMiBzcGVlZDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOworCQorCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gMDspOworCQorCXNlbGYgPSAoc3RydWN0IGFsaV9pcmNjX2NiICopIGRldi0+cHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKiBNYWtlIHN1cmUgdGVzdHMgKiYgc3BlZWQgY2hhbmdlIGFyZSBhdG9taWMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogTm90ZSA6IHlvdSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgc3BlZWQgY2hhbmdlcyBhcmUgbm90IGdvaW5nCisJICogdG8gY29ycnVwdCBhbnkgb3V0Z29pbmcgZnJhbWUuIExvb2sgYXQgbnNjLWlyY2MgZm9yIHRoZSBnb3J5CisJICogZGV0YWlscyAtIEplYW4gSUkgKi8KKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZCAqLworCXNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCWlmICgoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQpICYmIChzcGVlZCAhPSAtMSkpIHsKKwkJLyogQ2hlY2sgZm9yIGVtcHR5IGZyYW1lICovCisJCWlmICghc2tiLT5sZW4pIHsKKwkJCWFsaV9pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzcGVlZCk7IAorCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKwl9CisKKwkvKiBJbml0IHR4IGJ1ZmZlciAqLworCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKworICAgICAgICAvKiBDb3B5IHNrYiB0byB0eF9idWZmIHdoaWxlIHdyYXBwaW5nLCBzdHVmZmluZyBhbmQgbWFraW5nIENSQyAqLworCXNlbGYtPnR4X2J1ZmYubGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCBzZWxmLT50eF9idWZmLmRhdGEsIAorCQkJCQkgICBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKKwkKKwlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKKworCS8qIFR1cm4gb24gdHJhbnNtaXQgZmluaXNoZWQgaW50ZXJydXB0LiBXaWxsIGZpcmUgaW1tZWRpYXRlbHkhICAqLworCW91dGIoVUFSVF9JRVJfVEhSSSwgaW9iYXNlK1VBUlRfSUVSKTsgCisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCQorCXJldHVybiAwOwkKK30KKworCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfbmV0X2lvY3RsIChkZXYsIHJxLCBjbWQpCisgKgorICogICAgUHJvY2VzcyBJT0NUTCBjb21tYW5kcyBmb3IgdGhpcyBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgYWxpX2lyY2NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IGlmX2lyZGFfcmVxICppcnEgPSAoc3RydWN0IGlmX2lyZGFfcmVxICopIHJxOworCXN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJc2VsZiA9IGRldi0+cHJpdjsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAlcywgKGNtZD0weCVYKVxuIiwgX19GVU5DVElPTl9fICwgZGV2LT5uYW1lLCBjbWQpOworCQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DU0JBTkRXSURUSDogLyogU2V0IGJhbmR3aWR0aCAqLworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBTSU9DU0JBTkRXSURUSFxuIiwgX19GVU5DVElPTl9fICk7CisJCS8qCisJCSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGJlIHVzZWQgYnkgSXJMQVAgdG8gY2hhbmdlIHRoZQorCQkgKiBzcGVlZCwgc28gd2Ugc3RpbGwgbXVzdCBhbGxvdyBmb3Igc3BlZWQgY2hhbmdlIHdpdGhpbgorCQkgKiBpbnRlcnJ1cHQgY29udGV4dC4KKwkJICovCisJCWlmICghaW5faW50ZXJydXB0KCkgJiYgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJYWxpX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIGlycS0+aWZyX2JhdWRyYXRlKTsJCQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NNRURJQUJVU1k6IC8qIFNldCBtZWRpYSBidXN5ICovCisJCUlSREFfREVCVUcoMSwgIiVzKCksIFNJT0NTTUVESUFCVVNZXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koc2VsZi0+bmV0ZGV2LCBUUlVFKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DR1JFQ0VJVklORzogLyogQ2hlY2sgaWYgd2UgYXJlIHJlY2VpdmluZyByaWdodCBub3cgKi8KKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgU0lPQ0dSRUNFSVZJTkdcbiIsIF9fRlVOQ1RJT05fXyApOworCQkvKiBUaGlzIGlzIHByb3RlY3RlZCAqLworCQlpcnEtPmlmcl9yZWNlaXZpbmcgPSBhbGlfaXJjY19pc19yZWNlaXZpbmcoc2VsZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisJCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX2lzX3JlY2VpdmluZyAoc2VsZikKKyAqCisgKiAgICBSZXR1cm4gVFJVRSBpcyB3ZSBhcmUgY3VycmVudGx5IHJlY2VpdmluZyBhIGZyYW1lCisgKgorICovCitzdGF0aWMgaW50IGFsaV9pcmNjX2lzX3JlY2VpdmluZyhzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhdHVzID0gRkFMU0U7CisJaW50IGlvYmFzZTsJCQorCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIEZBTFNFOyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJaWYgKHNlbGYtPmlvLnNwZWVkID4gMTE1MjAwKSAKKwl7CisJCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCQkKKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMSk7CisJCWlmKChpbmIoaW9iYXNlK0ZJUl9GSUZPX0ZSKSAmIDB4M2YpICE9IDApIAkJCisJCXsKKwkJCS8qIFdlIGFyZSByZWNlaXZpbmcgc29tZXRoaW5nICovCisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBXZSBhcmUgcmVjZWl2aW5nIHNvbWV0aGluZ1xuIiwgX19GVU5DVElPTl9fICk7CisJCQlzdGF0dXMgPSBUUlVFOworCQl9CisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOwkJCisJfSAKKwllbHNlCisJeyAKKwkJc3RhdHVzID0gKHNlbGYtPnJ4X2J1ZmYuc3RhdGUgIT0gT1VUU0lERV9GUkFNRSk7CisJfQorCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFsaV9pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IGFsaV9pcmNjX2NiICopIGRldi0+cHJpdjsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOworCQkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisJCisJcmV0dXJuICZzZWxmLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgYWxpX2lyY2Nfc3VzcGVuZChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX01FU1NBR0UoIiVzLCBTdXNwZW5kaW5nXG4iLCBkcml2ZXJfbmFtZSk7CisKKwlpZiAoc2VsZi0+aW8uc3VzcGVuZGVkKQorCQlyZXR1cm47CisKKwlhbGlfaXJjY19uZXRfY2xvc2Uoc2VsZi0+bmV0ZGV2KTsKKworCXNlbGYtPmlvLnN1c3BlbmRlZCA9IDE7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorfQorCitzdGF0aWMgdm9pZCBhbGlfaXJjY193YWtldXAoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJaWYgKCFzZWxmLT5pby5zdXNwZW5kZWQpCisJCXJldHVybjsKKwkKKwlhbGlfaXJjY19uZXRfb3BlbihzZWxmLT5uZXRkZXYpOworCQorCUlSREFfTUVTU0FHRSgiJXMsIFdha2luZyB1cFxuIiwgZHJpdmVyX25hbWUpOworCisJc2VsZi0+aW8uc3VzcGVuZGVkID0gMDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCit9CisKK3N0YXRpYyBpbnQgYWxpX2lyY2NfcG1wcm9jKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpCit7CisgICAgICAgIHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZiA9IChzdHJ1Y3QgYWxpX2lyY2NfY2IqKSBkZXYtPmRhdGE7CisgICAgICAgIAorICAgICAgICBJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOworCQorICAgICAgICBpZiAoc2VsZikgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocnFzdCkgeworICAgICAgICAgICAgICAgIGNhc2UgUE1fU1VTUEVORDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaV9pcmNjX3N1c3BlbmQoc2VsZik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBNX1JFU1VNRToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaV9pcmNjX3dha2V1cChzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorICAgICAgICAKKwlyZXR1cm4gMDsKK30KKworCisvKiBBTGkgQ2hpcCBGdW5jdGlvbiAqLworCitzdGF0aWMgdm9pZCBTZXRDT01JbnRlcnJ1cHRzKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZiAsIHVuc2lnbmVkIGNoYXIgZW5hYmxlKQoreworCQorCXVuc2lnbmVkIGNoYXIgbmV3TWFzazsKKwkKKwlpbnQgaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7IC8qIG9yIHNpcl9iYXNlICovCisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLSBTdGFydCAtLS0tLS0tLSAoIEVuYWJsZSA9ICVkIClcbiIsIF9fRlVOQ1RJT05fXyAsIGVuYWJsZSk7CQorCQorCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0IHdoaWNoIHdlIHdpc2ggdG8gKi8KKwlpZiAoZW5hYmxlKXsKKwkJaWYgKHNlbGYtPmlvLmRpcmVjdGlvbiA9PSBJT19YTUlUKQorCQl7CisJCQlpZiAoc2VsZi0+aW8uc3BlZWQgPiAxMTUyMDApIC8qIEZJUiwgTUlSICovCisJCQl7CisJCQkJbmV3TWFzayA9IHNlbGYtPmllcjsKKwkJCX0KKwkJCWVsc2UgLyogU0lSICovCisJCQl7CisJCQkJbmV3TWFzayA9IFVBUlRfSUVSX1RIUkkgfCBVQVJUX0lFUl9SREk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoc2VsZi0+aW8uc3BlZWQgPiAxMTUyMDApIC8qIEZJUiwgTUlSICovCisJCQl7CisJCQkJbmV3TWFzayA9IHNlbGYtPmllcjsKKwkJCX0KKwkJCWVsc2UgLyogU0lSICovCisJCQl7CisJCQkJbmV3TWFzayA9IFVBUlRfSUVSX1JESTsKKwkJCX0KKwkJfQorCX0KKwllbHNlIC8qIERpc2FibGUgYWxsIHRoZSBpbnRlcnJ1cHRzICovCisJeworCQluZXdNYXNrID0gMHgwMDsKKworCX0KKworCS8vU0lSIGFuZCBGSVIgaGFzIGRpZmZlcmVudCByZWdpc3RlcnMKKwlpZiAoc2VsZi0+aW8uc3BlZWQgPiAxMTUyMDApCisJewkKKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJCW91dGIobmV3TWFzaywgaW9iYXNlK0ZJUl9JRVIpOworCX0KKwllbHNlCisJCW91dGIobmV3TWFzaywgaW9iYXNlK1VBUlRfSUVSKTsKKwkJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorfQorCitzdGF0aWMgdm9pZCBTSVIyRklSKGludCBpb2Jhc2UpCit7CisJLy91bnNpZ25lZCBjaGFyIHRtcDsKKwkJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwkvKiBBbHJlYWR5IHByb3RlY3RlZCAoY2hhbmdlX3NwZWVkKCkgb3Igc2V0dXAoKSksIG5vIG5lZWQgdG8gbG9jay4KKwkgKiBKZWFuIElJICovCisJCisJb3V0YigweDI4LCBpb2Jhc2UrVUFSVF9NQ1IpOworCW91dGIoMHg2OCwgaW9iYXNlK1VBUlRfTUNSKTsKKwlvdXRiKDB4ODgsIGlvYmFzZStVQVJUX01DUik7CQkKKwkKKwlvdXRiKDB4NjAsIGlvYmFzZStGSVJfTUNSKTsgCS8qICBNYXN0ZXIgUmVzZXQgKi8KKwlvdXRiKDB4MjAsIGlvYmFzZStGSVJfTUNSKTsgCS8qICBNYXN0ZXIgSW50ZXJydXB0IEVuYWJsZSAqLworCQorCS8vdG1wID0gaW5iKGlvYmFzZStGSVJfTENSX0IpOwkvKiBTSVAgZW5hYmxlICovCisJLy90bXAgfD0gMHgyMDsKKwkvL291dGIodG1wLCBpb2Jhc2UrRklSX0xDUl9CKTsJCisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorfQorCitzdGF0aWMgdm9pZCBGSVIyU0lSKGludCBpb2Jhc2UpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwkvKiBBbHJlYWR5IHByb3RlY3RlZCAoY2hhbmdlX3NwZWVkKCkgb3Igc2V0dXAoKSksIG5vIG5lZWQgdG8gbG9jay4KKwkgKiBKZWFuIElJICovCisJCisJb3V0YigweDIwLCBpb2Jhc2UrRklSX01DUik7IAkvKiBJUlEgdG8gbG93ICovCisJb3V0YigweDAwLCBpb2Jhc2UrVUFSVF9JRVIpOyAJCisJCQorCW91dGIoMHhBMCwgaW9iYXNlK0ZJUl9NQ1IpOyAJLyogRG9uJ3Qgc2V0IG1hc3RlciByZXNldCAqLworCW91dGIoMHgwMCwgaW9iYXNlK1VBUlRfRkNSKTsKKwlvdXRiKDB4MDcsIGlvYmFzZStVQVJUX0ZDUik7CQkKKwkKKwl2YWwgPSBpbmIoaW9iYXNlK1VBUlRfUlgpOworCXZhbCA9IGluYihpb2Jhc2UrVUFSVF9MU1IpOworCXZhbCA9IGluYihpb2Jhc2UrVUFSVF9NU1IpOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOworfQorCitNT0RVTEVfQVVUSE9SKCJCZW5qYW1pbiBLb25nIDxiZW5qYW1pbl9rb25nQGFsaS5jb20udHc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMaSBGSVIgQ29udHJvbGxlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiQmFzZSBJL08gYWRkcmVzc2VzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgbGluZXMiKTsKK21vZHVsZV9wYXJhbV9hcnJheShkbWEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRtYSwgIkRNQSBjaGFubmVscyIpOworCittb2R1bGVfaW5pdChhbGlfaXJjY19pbml0KTsKK21vZHVsZV9leGl0KGFsaV9pcmNjX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5oIGIvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODljNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgYWxpLWlyY2MuaAorICogVmVyc2lvbjogICAgICAgMC41CisgKiBEZXNjcmlwdGlvbjogICBEcml2ZXIgZm9yIHRoZSBBTEkgTTE1MzVEIGFuZCBNMTU0M0MgRklSIENvbnRyb2xsZXIKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIEJlbmphbWluIEtvbmcgPGJlbmphbWluX2tvbmdAYWxpLmNvbS50dz4KKyAqIENyZWF0ZWQgYXQ6ICAgIDIwMDAvMTAvMTYgMDM6NDZQTQorICogTW9kaWZpZWQgYXQ6ICAgMjAwMS8xLzMgMDI6NTZQTQorICogTW9kaWZpZWQgYnk6ICAgQmVuamFtaW4gS29uZyA8YmVuamFtaW5fa29uZ0BhbGkuY29tLnR3PgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwIEJlbmphbWluIEtvbmcgPGJlbmphbWluX2tvbmdAYWxpLmNvbS50dz4KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQUxJX0lSQ0NfSAorI2RlZmluZSBBTElfSVJDQ19ICisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogU0lSIFJlZ2lzdGVyICovCisvKiBVc3IgZGVmaW5pdGlvbiBvZiBsaW51eC9zZXJpYWxfcmVnLmggKi8KKworLyogRklSIFJlZ2lzdGVyICovCisjZGVmaW5lIEJBTkswCQkweDIwCisjZGVmaW5lIEJBTksxCQkweDIxCisjZGVmaW5lIEJBTksyCQkweDIyCisjZGVmaW5lIEJBTkszCQkweDIzCisKKyNkZWZpbmUgRklSX01DUgkJMHgwNwkvKiBNYXN0ZXIgQ29udHJvbCBSZWdpc3RlciAqLworCisvKiBCYW5rIDAgKi8KKyNkZWZpbmUgRklSX0RSCQkweDAwCS8qIEFsaWFzIDAsIEZJUiBEYXRhIFJlZ2lzdGVyIChSL1cpICovIAorI2RlZmluZSBGSVJfSUVSCQkweDAxCS8qIEFsaWFzIDEsIEZJUiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIChSL1cpICovCisjZGVmaW5lIEZJUl9JSVIJCTB4MDIJLyogQWxpYXMgMiwgRklSIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAoUmVhZCBvbmx5KSAqLworI2RlZmluZSBGSVJfTENSX0EJMHgwMwkvKiBBbGlhcyAzLCBGSVIgTGluZSBDb250cm9sIFJlZ2lzdGVyIEEgKFIvVykgKi8KKyNkZWZpbmUgRklSX0xDUl9CCTB4MDQJLyogQWxpYXMgNCwgRklSIExpbmUgQ29udHJvbCBSZWdpc3RlciBCIChSL1cpICovCisjZGVmaW5lIEZJUl9MU1IJCTB4MDUJLyogQWxpYXMgNSwgRklSIExpbmUgU3RhdHVzIFJlZ2lzdGVyIChSL1cpICovCisjZGVmaW5lIEZJUl9CU1IJCTB4MDYJLyogQWxpYXMgNiwgRklSIEJ1cyBTdGF0dXMgUmVnaXN0ZXIgKFJlYWQgb25seSkgKi8KKworCisJLyogQWxpYXMgMSAqLworCSNkZWZpbmUJSUVSX0ZJRk8JMHgxMAkvKiBGSVIgRklGTyBJbnRlcnJ1cHQgRW5hYmxlICovCQorCSNkZWZpbmUJSUVSX1RJTUVSCTB4MjAgCS8qIFRpbWVyIEludGVycnVwdCBFbmFibGUgKi8gCisJI2RlZmluZQlJRVJfRU9NCQkweDQwCS8qIEVuZCBvZiBNZXNzYWdlIEludGVycnVwdCBFbmFibGUgKi8KKwkjZGVmaW5lIElFUl9BQ1QJCTB4ODAJLyogQWN0aXZlIEZyYW1lIEludGVycnVwdCBFbmFibGUgKi8KKwkKKwkvKiBBbGlhcyAyICovCisJI2RlZmluZSBJSVJfRklGTwkweDEwCS8qIEZJUiBGSUZPIEludGVycnVwdCAqLworCSNkZWZpbmUgSUlSX1RJTUVSCTB4MjAJLyogVGltZXIgSW50ZXJydXB0ICovCisJI2RlZmluZSBJSVJfRU9NCQkweDQwCS8qIEVuZCBvZiBNZXNzYWdlIEludGVycnVwdCAqLworCSNkZWZpbmUgSUlSX0FDVAkJMHg4MAkvKiBBY3RpdmUgRnJhbWUgSW50ZXJydXB0ICovCQorCQorCS8qIEFsaWFzIDMgKi8KKwkjZGVmaW5lIExDUl9BX0ZJRk9fUkVTRVQgMHg4MAkvKiBGSUZPIFJlc2V0ICovCisKKwkvKiBBbGlhcyA0ICovCisJI2RlZmluZQlMQ1JfQl9CVwkweDEwCS8qIEJyaWNrIFdhbGwgKi8KKwkjZGVmaW5lIExDUl9CX1NJUAkweDIwCS8qIFNJUCBFbmFibGUgKi8KKwkjZGVmaW5lCUxDUl9CX1RYX01PREUgCTB4NDAJLyogVHJhbnNtaXQgTW9kZSAqLworCSNkZWZpbmUgTENSX0JfUlhfTU9ERQkweDgwCS8qIFJlY2VpdmUgTW9kZSAqLworCQorCS8qIEFsaWFzIDUgKi8JCisJI2RlZmluZSBMU1JfRklSX0xTQQkweDAwCS8qIEZJUiBMaW5lIFN0YXR1cyBBZGRyZXNzICovCisJI2RlZmluZSBMU1JfRlJBTUVfQUJPUlQJMHgwOAkvKiBGcmFtZSBBYm9ydCAqLworCSNkZWZpbmUgTFNSX0NSQ19FUlJPUgkweDEwCS8qIENSQyBFcnJvciAqLworCSNkZWZpbmUgTFNSX1NJWkVfRVJST1IJMHgyMAkvKiBTaXplIEVycm9yICovCisJI2RlZmluZSBMU1JfRlJBTUVfRVJST1IJMHg0MAkvKiBGcmFtZSBFcnJvciAqLworCSNkZWZpbmUgTFNSX0ZJRk9fVVIJMHg4MAkvKiBGSUZPIFVuZGVycnVuICovCisJI2RlZmluZSBMU1JfRklGT19PUgkweDgwCS8qIEZJRk8gT3ZlcnJ1biAqLworCQkKKwkvKiBBbGlhcyA2ICovCisJI2RlZmluZSBCU1JfRklGT19OT1RfRU1QVFkJMHg4MAkvKiBGSUZPIE5vdCBFbXB0eSAqLworCQorLyogQmFuayAxICovCisjZGVmaW5lCUZJUl9DUgkJMHgwMCAJLyogQWxpYXMgMCwgRklSIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKFIvVykgKi8KKyNkZWZpbmUgRklSX0ZJRk9fVFIJMHgwMSAgIAkvKiBBbGlhcyAxLCBGSVIgRklGTyBUaHJlc2hvbGQgUmVnaXN0ZXIgKFIvVykgKi8KKyNkZWZpbmUgRklSX0RNQV9UUgkweDAyCS8qIEFsaWFzIDIsIEZJUiBETUEgVGhyZXNob2xkIFJlZ2lzdGVyIChSL1cpICovCisjZGVmaW5lIEZJUl9USU1FUl9JSVIJMHgwMwkvKiBBbGlhcyAzLCBGSVIgVGltZXIgaW50ZXJydXB0IGludGVydmFsIHJlZ2lzdGVyIChXL08pICovCisjZGVmaW5lIEZJUl9GSUZPX0ZSCTB4MDMJLyogQWxpYXMgMywgRklSIEZJRk8gRmxhZyByZWdpc3RlciAoUi9PKSAqLworI2RlZmluZSBGSVJfRklGT19SQVIJMHgwNCAJLyogQWxpYXMgNCwgRklSIEZJRk8gUmVhZCBBZGRyZXNzIHJlZ2lzdGVyIChSL08pICovCisjZGVmaW5lIEZJUl9GSUZPX1dBUgkweDA1CS8qIEFsaWFzIDUsIEZJUiBGSUZPIFdyaXRlIEFkZHJlc3MgcmVnaXN0ZXIgKFIvTykgKi8KKyNkZWZpbmUgRklSX1RSCQkweDA2CS8qIEFsaWFzIDYsIFRlc3QgUkVnaXN0ZXIgKFcvTykgKi8KKworCS8qIEFsaWFzIDAgKi8KKwkjZGVmaW5lIENSX0RNQV9FTgkweDAxCS8qIERNQSBFbmFibGUgKi8KKwkjZGVmaW5lIENSX0RNQV9CVVJTVAkweDAyCS8qIERNQSBCdXJzdCBNb2RlICovCisJI2RlZmluZSBDUl9USU1FUl9FTiAJMHgwOAkvKiBUaW1lciBFbmFibGUgKi8KKwkKKwkvKiBBbGlhcyAzICovCisJI2RlZmluZSBUSU1FUl9JSVJfNTAwCTB4MDAJLyogNTAwIHVzICovCisJI2RlZmluZSBUSU1FUl9JSVJfMW1zCTB4MDEJLyogMSAgIG1zICovCisJI2RlZmluZSBUSU1FUl9JSVJfMm1zCTB4MDIJLyogMiAgIG1zICovCisJI2RlZmluZSBUSU1FUl9JSVJfNG1zCTB4MDMJLyogNCAgIG1zICovCisJCisvKiBCYW5rIDIgKi8KKyNkZWZpbmUgRklSX0lSREFfQ1IJMHgwMAkvKiBBbGlhcyAwLCBJckRBIENvbnRyb2wgUmVnaXN0ZXIgKFIvVykgKi8KKyNkZWZpbmUgRklSX0JPRl9DUgkweDAxCS8qIEFsaWFzIDEsIEJPRiBDb3VudCBSZWdpc3RlciAoUi9XKSAqLworI2RlZmluZSBGSVJfQldfQ1IJMHgwMgkvKiBBbGlhcyAyLCBCcmljayBXYWxsIENvdW50IFJlZ2lzdGVyIChSL1cpICovCisjZGVmaW5lIEZJUl9UWF9EU1JfSEkJMHgwMwkvKiBBbGlhcyAzLCBUWCBEYXRhIFNpemUgUmVnaXN0ZXIgKGhpZ2gpIChSL1cpICovCisjZGVmaW5lIEZJUl9UWF9EU1JfTE8JMHgwNAkvKiBBbGlhcyA0LCBUWCBEYXRhIFNpemUgUmVnaXN0ZXIgKGxvdykgKFIvVykgKi8KKyNkZWZpbmUgRklSX1JYX0RTUl9ISQkweDA1CS8qIEFsaWFzIDUsIFJYIERhdGEgU2l6ZSBSZWdpc3RlciAoaGlnaCkgKFIvVykgKi8KKyNkZWZpbmUgRklSX1JYX0RTUl9MTwkweDA2CS8qIEFsaWFzIDYsIFJYIERhdGEgU2l6ZSBSZWdpc3RlciAobG93KSAoUi9XKSAqLworCQorCS8qIEFsaWFzIDAgKi8KKwkjZGVmaW5lIElSREFfQ1JfSERMQzExNTIgMHg4MAkvKiAxLjE1Mk1icHMgSERMQyBTZWxlY3QgKi8KKwkjZGVmaW5lIElSREFfQ1JfQ1JDCTBYNDAJLyogQ1JDIFNlbGVjdC4gKi8KKwkjZGVmaW5lIElSREFfQ1JfSERMQwkweDIwCS8qIEhETEMgc2VsZWN0LiAqLworCSNkZWZpbmUgSVJEQV9DUl9IUF9NT0RFIDB4MTAJLyogSFAgbW9kZSAocmVhZCBvbmx5KSAqLworCSNkZWZpbmUgSVJEQV9DUl9TRF9TVAkweDA4CS8qIFNEL01PREUgU3RhdGUuICAqLworCSNkZWZpbmUgSVJEQV9DUl9GSVJfU0lOIDB4MDQJLyogRklSIFNJTiBTZWxlY3QuICovCisJI2RlZmluZSBJUkRBX0NSX0lUVFhfMAkweDAyCS8qIFNPVVQgU3RhdGUuIElSVFggZm9yY2UgdG8gMCAqLworCSNkZWZpbmUgSVJEQV9DUl9JVFRYXzEJMHgwMwkvKiBTT1VUIFN0YXRlLiBJUlRYIGZvcmNlIHRvIDEgKi8KKwkKKy8qIEJhbmsgMyAqLworI2RlZmluZSBGSVJfSURfVlIJMHgwMAkvKiBBbGlhcyAwLCBGSVIgSUQgVmVyc2lvbiBSZWdpc3RlciAoUi9PKSAqLworI2RlZmluZSBGSVJfTU9EVUxFX0NSCTB4MDEJLyogQWxpYXMgMSwgRklSIE1vZHVsZSBDb250cm9sIFJlZ2lzdGVyIChSL1cpICovCisjZGVmaW5lIEZJUl9JT19CQVNFX0hJCTB4MDIJLyogQWxpYXMgMiwgRklSIEhpZ2hlciBJL08gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIChSL08pICovCisjZGVmaW5lIEZJUl9JT19CQVNFX0xPCTB4MDMJLyogQWxpYXMgMywgRklSIExvd2VyIEkvTyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgKFIvTykgKi8KKyNkZWZpbmUgRklSX0lSUV9DUgkweDA0CS8qIEFsaWFzIDQsIEZJUiBJUlEgQ2hhbm5lbCBSZWdpc3RlciAoUi9PKSAqLworI2RlZmluZSBGSVJfRE1BX0NSCTB4MDUJLyogQWxpYXMgNSwgRklSIERNQSBDaGFubmVsIFJlZ2lzdGVyIChSL08pICovCisKK3N0cnVjdCBhbGlfY2hpcCB7CisJY2hhciAqbmFtZTsKKwlpbnQgY2ZnWzJdOworCXVuc2lnbmVkIGNoYXIgZW50cjE7CisJdW5zaWduZWQgY2hhciBlbnRyMjsKKwl1bnNpZ25lZCBjaGFyIGNpZF9pbmRleDsKKwl1bnNpZ25lZCBjaGFyIGNpZF92YWx1ZTsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IGFsaV9jaGlwICpjaGlwLCBjaGlwaW9fdCAqaW5mbyk7CisJaW50ICgqaW5pdCkoc3RydWN0IGFsaV9jaGlwICpjaGlwLCBjaGlwaW9fdCAqaW5mbyk7IAorfTsKK3R5cGVkZWYgc3RydWN0IGFsaV9jaGlwIGFsaV9jaGlwX3Q7CisKKworLyogRE1BIG1vZGVzIG5lZWRlZCAqLworI2RlZmluZSBETUFfVFhfTU9ERSAgICAgMHgwOCAgICAvKiBNZW0gdG8gSS9PLCArKywgZGVtYW5kLiAqLworI2RlZmluZSBETUFfUlhfTU9ERSAgICAgMHgwNCAgICAvKiBJL08gdG8gbWVtLCArKywgZGVtYW5kLiAqLworCisjZGVmaW5lIE1BWF9UWF9XSU5ET1cgCTcKKyNkZWZpbmUgTUFYX1JYX1dJTkRPVyAJNworCisjZGVmaW5lIFRYX0ZJRk9fVGhyZXNob2xkCTgKKyNkZWZpbmUgUlhfRklGT19UaHJlc2hvbGQJMQorI2RlZmluZSBUWF9ETUFfVGhyZXNob2xkCTEKKyNkZWZpbmUgUlhfRE1BX1RocmVzaG9sZAkxCisKKy8qIEZvciBzdG9yaW5nIGVudHJpZXMgaW4gdGhlIHN0YXR1cyBGSUZPICovCisKK3N0cnVjdCBzdF9maWZvX2VudHJ5IHsKKwlpbnQgc3RhdHVzOworCWludCBsZW47Cit9OworCitzdHJ1Y3Qgc3RfZmlmbyB7CisJc3RydWN0IHN0X2ZpZm9fZW50cnkgZW50cmllc1tNQVhfUlhfV0lORE9XXTsKKwlpbnQgcGVuZGluZ19ieXRlczsKKwlpbnQgaGVhZDsKKwlpbnQgdGFpbDsKKwlpbnQgbGVuOworfTsKKworc3RydWN0IGZyYW1lX2NiIHsKKwl2b2lkICpzdGFydDsgLyogU3RhcnQgb2YgZnJhbWUgaW4gRE1BIG1lbSAqLworCWludCBsZW47ICAgICAvKiBMZW5naHQgb2YgZnJhbWUgaW4gRE1BIG1lbSAqLworfTsKKworc3RydWN0IHR4X2ZpZm8geworCXN0cnVjdCBmcmFtZV9jYiBxdWV1ZVtNQVhfVFhfV0lORE9XXTsgLyogSW5mbyBhYm91dCBmcmFtZXMgaW4gcXVldWUgKi8KKwlpbnQgICAgICAgICAgICAgcHRyOyAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnRseSBiZWluZyBzZW50ICovCisJaW50ICAgICAgICAgICAgIGxlbjsgICAgICAgICAgICAgICAgICAvKiBMZW5naHQgb2YgcXVldWUgKi8KKwlpbnQgICAgICAgICAgICAgZnJlZTsgICAgICAgICAgICAgICAgIC8qIE5leHQgZnJlZSBzbG90ICovCisJdm9pZCAgICAgICAgICAgKnRhaWw7ICAgICAgICAgICAgICAgICAvKiBOZXh0IGZyZWUgc3RhcnQgaW4gRE1BIG1lbSAqLworfTsKKworLyogUHJpdmF0ZSBkYXRhIGZvciBlYWNoIGluc3RhbmNlICovCitzdHJ1Y3QgYWxpX2lyY2NfY2IgeworCisJc3RydWN0IHN0X2ZpZm8gc3RfZmlmbzsgICAgLyogSW5mbyBhYm91dCByZWNlaXZlZCBmcmFtZXMgKi8KKwlzdHJ1Y3QgdHhfZmlmbyB0eF9maWZvOyAgICAvKiBJbmZvIGFib3V0IGZyYW1lcyB0byBiZSB0cmFuc21pdHRlZCAqLworCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsgICAgIC8qIFllcyEgd2UgYXJlIHNvbWUga2luZCBvZiBuZXRkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwkKKwlzdHJ1Y3QgaXJsYXBfY2IgKmlybGFwOyAgICAvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYmluZGVkIHRvICovCisJc3RydWN0IHFvc19pbmZvIHFvczsgICAgICAgLyogUW9TIGNhcGFiaWxpdGllcyBmb3IgdGhpcyBkZXZpY2UgKi8KKwkKKwljaGlwaW9fdCBpbzsgICAgICAgICAgICAgICAvKiBJckRBIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KKwlpb2J1ZmZfdCB0eF9idWZmOyAgICAgICAgICAvKiBUcmFuc21pdCBidWZmZXIgKi8KKwlpb2J1ZmZfdCByeF9idWZmOyAgICAgICAgICAvKiBSZWNlaXZlIGJ1ZmZlciAqLworCWRtYV9hZGRyX3QgdHhfYnVmZl9kbWE7CisJZG1hX2FkZHJfdCByeF9idWZmX2RtYTsKKworCV9fdTggaWVyOyAgICAgICAgICAgICAgICAgIC8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKwkKKwlfX3U4IEludGVycnVwdElEOwkgICAvKiBJbnRlcnJ1cHQgSUQgKi8JCisJX191OCBCdXNTdGF0dXM7CQkgICAvKiBCdXMgU3RhdHVzICovCQorCV9fdTggTGluZVN0YXR1czsJICAgLyogTGluZSBTdGF0dXMgKi8JCisJCisJdW5zaWduZWQgY2hhciByY3ZGcmFtZXNPdmVyZmxvdzsKKwkJCisJc3RydWN0IHRpbWV2YWwgc3RhbXA7CisJc3RydWN0IHRpbWV2YWwgbm93OworCisJc3BpbmxvY2tfdCBsb2NrOyAgICAgICAgICAgLyogRm9yIHNlcmlhbGl6aW5nIG9wZXJhdGlvbnMgKi8KKwkKKwlfX3UzMiBuZXdfc3BlZWQ7CisJaW50IGluZGV4OyAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaW5kZXggKi8KKwkKKwl1bnNpZ25lZCBjaGFyIGZpZm9fb3B0aV9idWY7CisKKyAgICAgICAgc3RydWN0IHBtX2RldiAqZGV2OworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHN3aXRjaF9iYW5rKGludCBpb2Jhc2UsIGludCBiYW5rKQoreworCQlvdXRiKGJhbmssIGlvYmFzZStGSVJfTUNSKTsKK30KKworI2VuZGlmIC8qIEFMSV9JUkNDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYXUxMDAwX2lyY2MuaCBiL2RyaXZlcnMvbmV0L2lyZGEvYXUxMDAwX2lyY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTMxZDQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYXUxMDAwX2lyY2MuaApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqCisgKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KKyAqCUF1MTAwMCBJckRBIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICAJcHBvcG92QG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBBVTEwMDBfSVJDQ19ICisjZGVmaW5lIEFVMTAwMF9JUkNDX0gKKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBOVU1fSVJfSUZGICAgICAgICAgIDEKKyNkZWZpbmUgTlVNX0lSX0RFU0MgICAgICAgIDY0CisjZGVmaW5lIFJJTkdfU0laRV80ICAgICAgIDB4MAorI2RlZmluZSBSSU5HX1NJWkVfMTYgICAgICAweDMKKyNkZWZpbmUgUklOR19TSVpFXzY0ICAgICAgMHhGCisjZGVmaW5lIE1BWF9OVU1fSVJfREVTQyAgICA2NAorI2RlZmluZSBNQVhfQlVGX1NJWkUgICAgIDIwNDgKKworI2RlZmluZSBCUFNfMTE1MjAwICAgICAgICAgIDAKKyNkZWZpbmUgQlBTXzU3NjAwICAgICAgICAgICAxCisjZGVmaW5lIEJQU18zODQwMCAgICAgICAgICAgMgorI2RlZmluZSBCUFNfMTkyMDAgICAgICAgICAgIDUKKyNkZWZpbmUgQlBTXzk2MDAgICAgICAgICAgIDExCisjZGVmaW5lIEJQU18yNDAwICAgICAgICAgICA0NworCisvKiBSaW5nIGRlc2NyaXB0b3IgZmxhZ3MgKi8KKyNkZWZpbmUgQVVfT1dOICAgICAgICAgICAoMTw8NykgLyogdHgscnggKi8KKworI2RlZmluZSBJUl9ESVNfQ1JDICAgICAgICgxPDw2KSAvKiB0eCAqLworI2RlZmluZSBJUl9CQURfQ1JDICAgICAgICgxPDw1KSAvKiB0eCAqLworI2RlZmluZSBJUl9ORUVEX1BVTFNFICAgICgxPDw0KSAvKiB0eCAqLworI2RlZmluZSBJUl9GT1JDRV9VTkRFUiAgICgxPDwzKSAvKiB0eCAqLworI2RlZmluZSBJUl9ESVNBQkxFX1RYICAgICgxPDwyKSAvKiB0eCAqLworI2RlZmluZSBJUl9IV19VTkRFUiAgICAgICgxPDwwKSAvKiB0eCAqLworI2RlZmluZSBJUl9UWF9FUlJPUiAgICAgIChJUl9ESVNfQ1JDfElSX0JBRF9DUkN8SVJfSFdfVU5ERVIpCisKKyNkZWZpbmUgSVJfUEhZX0VSUk9SICAgICAoMTw8NikgLyogcnggKi8KKyNkZWZpbmUgSVJfQ1JDX0VSUk9SICAgICAoMTw8NSkgLyogcnggKi8KKyNkZWZpbmUgSVJfTUFYX0xFTiAgICAgICAoMTw8NCkgLyogcnggKi8KKyNkZWZpbmUgSVJfRklGT19PVkVSICAgICAoMTw8MykgLyogcnggKi8KKyNkZWZpbmUgSVJfU0lSX0VSUk9SICAgICAoMTw8MikgLyogcnggKi8KKyNkZWZpbmUgSVJfUlhfRVJST1IgICAgICAoSVJfUEhZX0VSUk9SfElSX0NSQ19FUlJPUnwgXAorCQlJUl9NQVhfTEVOfElSX0ZJRk9fT1ZFUnxJUl9TSVJfRVJST1IpCisKK3R5cGVkZWYgc3RydWN0IGRiX2Rlc3QgeworCXN0cnVjdCBkYl9kZXN0ICpwbmV4dDsKKwl2b2xhdGlsZSB1MzIgKnZhZGRyOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7Cit9IGRiX2Rlc3RfdDsKKworCit0eXBlZGVmIHN0cnVjdCByaW5nX2Rlc2MgeworCXU4IGNvdW50XzA7ICAgICAgICAgICAgICAgLyogNzowICAqLworCXU4IGNvdW50XzE7ICAgICAgICAgICAgICAgLyogMTI6OCAqLworCXU4IHJlc2VydmVkOworCXU4IGZsYWdzOworCXU4IGFkZHJfMDsgICAgICAgICAgICAgICAgLyogNzowICAgKi8KKwl1OCBhZGRyXzE7ICAgICAgICAgICAgICAgIC8qIDE1OjggICovCisJdTggYWRkcl8yOyAgICAgICAgICAgICAgICAvKiAyMzoxNiAqLworCXU4IGFkZHJfMzsgICAgICAgICAgICAgICAgLyogMzE6MjQgKi8KK30gcmluZ19kZXN0X3Q7CisKKworLyogUHJpdmF0ZSBkYXRhIGZvciBlYWNoIGluc3RhbmNlICovCitzdHJ1Y3QgYXUxa19wcml2YXRlIHsKKworCWRiX2Rlc3RfdCAqcERCZnJlZTsKKwlkYl9kZXN0X3QgZGJbMipOVU1fSVJfREVTQ107CisJdm9sYXRpbGUgcmluZ19kZXN0X3QgKnJ4X3JpbmdbTlVNX0lSX0RFU0NdOworCXZvbGF0aWxlIHJpbmdfZGVzdF90ICp0eF9yaW5nW05VTV9JUl9ERVNDXTsKKwlkYl9kZXN0X3QgKnJ4X2RiX2ludXNlW05VTV9JUl9ERVNDXTsKKwlkYl9kZXN0X3QgKnR4X2RiX2ludXNlW05VTV9JUl9ERVNDXTsKKwl1MzIgcnhfaGVhZDsKKwl1MzIgdHhfaGVhZDsKKwl1MzIgdHhfdGFpbDsKKwl1MzIgdHhfZnVsbDsKKworCWlvYnVmZl90IHJ4X2J1ZmY7CisKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCQorCXN0cnVjdCB0aW1ldmFsIHN0YW1wOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwlzdHJ1Y3QgcW9zX2luZm8JCXFvczsKKwlzdHJ1Y3QgaXJsYXBfY2IJCSppcmxhcDsKKwkKKwl1OCBvcGVuOworCXUzMiBzcGVlZDsKKwl1MzIgbmV3c3BlZWQ7CisJCisJdTMyIGludHJfd29ya19kb25lOyAvKiBudW1iZXIgb2YgUnggYW5kIFR4IHBrdHMgcHJvY2Vzc2VkIGluIHRoZSBpc3IgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKworCXNwaW5sb2NrX3QgbG9jazsgICAgICAgICAgIC8qIEZvciBzZXJpYWxpemluZyBvcGVyYXRpb25zICovCisgICAgICAgIHN0cnVjdCBwbV9kZXYgKmRldjsKK307CisjZW5kaWYgLyogQVUxMDAwX0lSQ0NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9hdTFrX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2F1MWtfaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmIxOTg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9hdTFrX2lyLmMKQEAgLTAsMCArMSw4NTEgQEAKKy8qCisgKiBBbGNoZW15IFNlbWkgQXUxMDAwIElyREEgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgCXBwb3BvdkBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKFZlcnNpb24gMikgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hdTEwMDAuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX1BCMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19QQjExMDApCisjaW5jbHVkZSA8YXNtL3BiMTAwMC5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfTUlQU19EQjEwMDApIHx8IGRlZmluZWQoQ09ORklHX01JUFNfREIxMTAwKQorI2luY2x1ZGUgPGFzbS9kYjF4MDAuaD4KKyNlbHNlIAorI2Vycm9yIGF1MWtfaXI6IHVuc3VwcG9ydGVkIGJvYXJkCisjZW5kaWYKKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcm1vZC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorI2luY2x1ZGUgImF1MTAwMF9pcmNjLmgiCisKK3N0YXRpYyBpbnQgYXUxa19pcmRhX25ldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBhdTFrX2lyZGFfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IGF1MWtfaXJkYV9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhdTFrX2lyZGFfaGFyZF94bWl0KHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBhdTFrX2lyZGFfcngoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBhdTFrX2lyZGFfaW50ZXJydXB0KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyB2b2lkIGF1MWtfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXUxa19pcmRhX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBhdTFrX2lyZGFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCk7CitzdGF0aWMgaW50IGF1MWtfaXJkYV9zZXRfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNwZWVkKTsKKworc3RhdGljIHZvaWQgKmRtYV9hbGxvYyhzaXplX3QsIGRtYV9hZGRyX3QgKik7CitzdGF0aWMgdm9pZCBkbWFfZnJlZSh2b2lkICosIHNpemVfdCk7CisKK3N0YXRpYyBpbnQgcW9zX210dF9iaXRzID0gMHgwNzsgIC8qIDEgbXMgb3IgbW9yZSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICppcl9kZXZzW05VTV9JUl9JRkZdOworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorICAgICJhdTFrX2lyY2M6MS4yIHBwb3BvdkBtdmlzdGEuY29tXG4iOworCisjZGVmaW5lIFJVTl9BVCh4KSAoamlmZmllcyArICh4KSkKKworI2lmIGRlZmluZWQoQ09ORklHX01JUFNfREIxMDAwKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTEwMCkKK3N0YXRpYyBCQ1NSICogY29uc3QgYmNzciA9IChCQ1NSICopMHhBRTAwMDAwMDsKKyNlbmRpZgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlyX2xvY2spOworCisvKgorICogSXJEQSBwZXJpcGhlcmFsIGJ1Zy4gWW91IGhhdmUgdG8gcmVhZCB0aGUgcmVnaXN0ZXIKKyAqIHR3aWNlIHRvIGdldCB0aGUgcmlnaHQgdmFsdWUuCisgKi8KK3UzMiByZWFkX2lyX3JlZyh1MzIgYWRkcikgCit7IAorCXJlYWRsKGFkZHIpOworCXJldHVybiByZWFkbChhZGRyKTsKK30KKworCisvKgorICogQnVmZmVyIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIHJvdXRpbmVzLiBUaGUgYnVmZmVyIGRlc2NyaXB0b3IgcmV0dXJuZWQKKyAqIGhhcyB0aGUgdmlydHVhbCBhbmQgZG1hIGFkZHJlc3Mgb2YgYSBidWZmZXIgc3VpdGFibGUgZm9yIAorICogYm90aCwgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIGRiX2Rlc3RfdCAqR2V0RnJlZURCKHN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCkKK3sKKwlkYl9kZXN0X3QgKnBEQjsKKwlwREIgPSBhdXAtPnBEQmZyZWU7CisKKwlpZiAocERCKSB7CisJCWF1cC0+cERCZnJlZSA9IHBEQi0+cG5leHQ7CisJfQorCXJldHVybiBwREI7Cit9CisKK3N0YXRpYyB2b2lkIFJlbGVhc2VEQihzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAsIGRiX2Rlc3RfdCAqcERCKQoreworCWRiX2Rlc3RfdCAqcERCZnJlZSA9IGF1cC0+cERCZnJlZTsKKwlpZiAocERCZnJlZSkKKwkJcERCZnJlZS0+cG5leHQgPSBwREI7CisJYXVwLT5wREJmcmVlID0gcERCOworfQorCisKKy8qCisgIERNQSBtZW1vcnkgYWxsb2NhdGlvbiwgZGVyaXZlZCBmcm9tIHBjaV9hbGxvY19jb25zaXN0ZW50LgorICBIb3dldmVyLCB0aGUgQXUxMDAwIGRhdGEgY2FjaGUgaXMgY29oZXJlbnQgKHdoZW4gcHJvZ3JhbW1lZAorICBzbyksIHRoZXJlZm9yZSB3ZSByZXR1cm4gS1NFRzAgYWRkcmVzcywgbm90IEtTRUcxLgorKi8KK3N0YXRpYyB2b2lkICpkbWFfYWxsb2Moc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKiBkbWFfaGFuZGxlKQoreworCXZvaWQgKnJldDsKKwlpbnQgZ2ZwID0gR0ZQX0FUT01JQyB8IEdGUF9ETUE7CisKKwlyZXQgPSAodm9pZCAqKSBfX2dldF9mcmVlX3BhZ2VzKGdmcCwgZ2V0X29yZGVyKHNpemUpKTsKKworCWlmIChyZXQgIT0gTlVMTCkgeworCQltZW1zZXQocmV0LCAwLCBzaXplKTsKKwkJKmRtYV9oYW5kbGUgPSB2aXJ0X3RvX2J1cyhyZXQpOworCQlyZXQgPSAodm9pZCAqKUtTRUcwQUREUihyZXQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIGRtYV9mcmVlKHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSkKK3sKKwl2YWRkciA9ICh2b2lkICopS1NFRzBBRERSKHZhZGRyKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSB2YWRkciwgZ2V0X29yZGVyKHNpemUpKTsKK30KKworCitzdGF0aWMgdm9pZCAKK3NldHVwX2h3X3JpbmdzKHN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCwgdTMyIHJ4X2Jhc2UsIHUzMiB0eF9iYXNlKQoreworCWludCBpOworCWZvciAoaT0wOyBpPE5VTV9JUl9ERVNDOyBpKyspIHsKKwkJYXVwLT5yeF9yaW5nW2ldID0gKHZvbGF0aWxlIHJpbmdfZGVzdF90ICopIAorCQkJKHJ4X2Jhc2UgKyBzaXplb2YocmluZ19kZXN0X3QpKmkpOworCX0KKwlmb3IgKGk9MDsgaTxOVU1fSVJfREVTQzsgaSsrKSB7CisJCWF1cC0+dHhfcmluZ1tpXSA9ICh2b2xhdGlsZSByaW5nX2Rlc3RfdCAqKSAKKwkJCSh0eF9iYXNlICsgc2l6ZW9mKHJpbmdfZGVzdF90KSppKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXUxa19pcmRhX2luaXQodm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkID0gMDsKKwlzdHJ1Y3QgYXUxa19wcml2YXRlICphdXA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyOworCisJaWYgKHZlcnNpb25fcHJpbnRlZCsrID09IDApIHByaW50ayh2ZXJzaW9uKTsKKworCWRldiA9IGFsbG9jX2lyZGFkZXYoc2l6ZW9mKHN0cnVjdCBhdTFrX3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXYtPmlycSA9IEFVMTAwMF9JUkRBX1JYX0lOVDsgLyogVFggaGFzIGl0cyBvd24gaW50ZXJydXB0ICovCisJZXJyID0gYXUxa19pcmRhX25ldF9pbml0KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCWlyX2RldnNbMF0gPSBkZXY7CisJcHJpbnRrKEtFUk5fSU5GTyAiSXJEQTogUmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsIGRldi0+bmFtZSk7CisJcmV0dXJuIDA7CisKK291dDE6CisJYXVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlkbWFfZnJlZSgodm9pZCAqKWF1cC0+ZGJbMF0udmFkZHIsCisJCU1BWF9CVUZfU0laRSAqIDIqTlVNX0lSX0RFU0MpOworCWRtYV9mcmVlKCh2b2lkICopYXVwLT5yeF9yaW5nWzBdLAorCQkyICogTUFYX05VTV9JUl9ERVNDKihzaXplb2YocmluZ19kZXN0X3QpKSk7CisJa2ZyZWUoYXVwLT5yeF9idWZmLmhlYWQpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhdTFrX2lyZGFfaW5pdF9pb2J1Zihpb2J1ZmZfdCAqaW8sIGludCBzaXplKQoreworCWlvLT5oZWFkID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW8tPmhlYWQgIT0gTlVMTCkgeworCQlpby0+dHJ1ZXNpemUgPSBzaXplOworCQlpby0+aW5fZnJhbWUgPSBGQUxTRTsKKwkJaW8tPnN0YXRlICAgID0gT1VUU0lERV9GUkFNRTsKKwkJaW8tPmRhdGEgICAgID0gaW8tPmhlYWQ7CisJfQorCXJldHVybiBpby0+aGVhZCA/IDAgOiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IGF1MWtfaXJkYV9uZXRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGksIHJldHZhbCA9IDAsIGVycjsKKwlkYl9kZXN0X3QgKnBEQiwgKnBEQmZyZWU7CisJZG1hX2FkZHJfdCB0ZW1wOworCisJZXJyID0gYXUxa19pcmRhX2luaXRfaW9idWYoJmF1cC0+cnhfYnVmZiwgMTQzODQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKworCWRldi0+b3BlbiA9IGF1MWtfaXJkYV9zdGFydDsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGF1MWtfaXJkYV9oYXJkX3htaXQ7CisJZGV2LT5zdG9wID0gYXUxa19pcmRhX3N0b3A7CisJZGV2LT5nZXRfc3RhdHMgPSBhdTFrX2lyZGFfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9IGF1MWtfaXJkYV9pb2N0bDsKKwlkZXYtPnR4X3RpbWVvdXQgPSBhdTFrX3R4X3RpbWVvdXQ7CisKKwlpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKCZhdXAtPnFvcyk7CisKKwkvKiBUaGUgb25seSB2YWx1ZSB3ZSBtdXN0IG92ZXJyaWRlIGl0IHRoZSBiYXVkcmF0ZSAqLworCWF1cC0+cW9zLmJhdWRfcmF0ZS5iaXRzID0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHwKKwkJSVJfMTE1MjAwfElSXzU3NjAwMCB8KElSXzQwMDAwMDAgPDwgOCk7CisJCisJYXVwLT5xb3MubWluX3R1cm5fdGltZS5iaXRzID0gcW9zX210dF9iaXRzOworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoJmF1cC0+cW9zKTsKKworCXJldHZhbCA9IC1FTk9NRU07CisKKwkvKiBUeCByaW5nIGZvbGxvd3MgcnggcmluZyArIDUxMiBieXRlcyAqLworCS8qIHdlIG5lZWQgYSAxayBhbGlnbmVkIGJ1ZmZlciAqLworCWF1cC0+cnhfcmluZ1swXSA9IChyaW5nX2Rlc3RfdCAqKQorCQlkbWFfYWxsb2MoMipNQVhfTlVNX0lSX0RFU0MqKHNpemVvZihyaW5nX2Rlc3RfdCkpLCAmdGVtcCk7CisJaWYgKCFhdXAtPnJ4X3JpbmdbMF0pCisJCWdvdG8gb3V0MjsKKworCS8qIGFsbG9jYXRlIHRoZSBkYXRhIGJ1ZmZlcnMgKi8KKwlhdXAtPmRiWzBdLnZhZGRyID0gCisJCSh2b2lkICopZG1hX2FsbG9jKE1BWF9CVUZfU0laRSAqIDIqTlVNX0lSX0RFU0MsICZ0ZW1wKTsKKwlpZiAoIWF1cC0+ZGJbMF0udmFkZHIpCisJCWdvdG8gb3V0MzsKKworCXNldHVwX2h3X3JpbmdzKGF1cCwgKHUzMilhdXAtPnJ4X3JpbmdbMF0sICh1MzIpYXVwLT5yeF9yaW5nWzBdICsgNTEyKTsKKworCXBEQmZyZWUgPSBOVUxMOworCXBEQiA9IGF1cC0+ZGI7CisJZm9yIChpPTA7IGk8KDIqTlVNX0lSX0RFU0MpOyBpKyspIHsKKwkJcERCLT5wbmV4dCA9IHBEQmZyZWU7CisJCXBEQmZyZWUgPSBwREI7CisJCXBEQi0+dmFkZHIgPSAKKwkJCSh1MzIgKikoKHVuc2lnbmVkKWF1cC0+ZGJbMF0udmFkZHIgKyBNQVhfQlVGX1NJWkUqaSk7CisJCXBEQi0+ZG1hX2FkZHIgPSAoZG1hX2FkZHJfdCl2aXJ0X3RvX2J1cyhwREItPnZhZGRyKTsKKwkJcERCKys7CisJfQorCWF1cC0+cERCZnJlZSA9IHBEQmZyZWU7CisKKwkvKiBhdHRhY2ggYSBkYXRhIGJ1ZmZlciB0byBlYWNoIGRlc2NyaXB0b3IgKi8KKwlmb3IgKGk9MDsgaTxOVU1fSVJfREVTQzsgaSsrKSB7CisJCXBEQiA9IEdldEZyZWVEQihhdXApOworCQlpZiAoIXBEQikgZ290byBvdXQ7CisJCWF1cC0+cnhfcmluZ1tpXS0+YWRkcl8wID0gKHU4KShwREItPmRtYV9hZGRyICYgMHhmZik7CisJCWF1cC0+cnhfcmluZ1tpXS0+YWRkcl8xID0gKHU4KSgocERCLT5kbWFfYWRkcj4+OCkgJiAweGZmKTsKKwkJYXVwLT5yeF9yaW5nW2ldLT5hZGRyXzIgPSAodTgpKChwREItPmRtYV9hZGRyPj4xNikgJiAweGZmKTsKKwkJYXVwLT5yeF9yaW5nW2ldLT5hZGRyXzMgPSAodTgpKChwREItPmRtYV9hZGRyPj4yNCkgJiAweGZmKTsKKwkJYXVwLT5yeF9kYl9pbnVzZVtpXSA9IHBEQjsKKwl9CisJZm9yIChpPTA7IGk8TlVNX0lSX0RFU0M7IGkrKykgeworCQlwREIgPSBHZXRGcmVlREIoYXVwKTsKKwkJaWYgKCFwREIpIGdvdG8gb3V0OworCQlhdXAtPnR4X3JpbmdbaV0tPmFkZHJfMCA9ICh1OCkocERCLT5kbWFfYWRkciAmIDB4ZmYpOworCQlhdXAtPnR4X3JpbmdbaV0tPmFkZHJfMSA9ICh1OCkoKHBEQi0+ZG1hX2FkZHI+PjgpICYgMHhmZik7CisJCWF1cC0+dHhfcmluZ1tpXS0+YWRkcl8yID0gKHU4KSgocERCLT5kbWFfYWRkcj4+MTYpICYgMHhmZik7CisJCWF1cC0+dHhfcmluZ1tpXS0+YWRkcl8zID0gKHU4KSgocERCLT5kbWFfYWRkcj4+MjQpICYgMHhmZik7CisJCWF1cC0+dHhfcmluZ1tpXS0+Y291bnRfMCA9IDA7CisJCWF1cC0+dHhfcmluZ1tpXS0+Y291bnRfMSA9IDA7CisJCWF1cC0+dHhfcmluZ1tpXS0+ZmxhZ3MgPSAwOworCQlhdXAtPnR4X2RiX2ludXNlW2ldID0gcERCOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX01JUFNfREIxMDAwKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTEwMCkKKwkvKiBwb3dlciBvbiAqLworCWJjc3ItPnJlc2V0cyAmPSB+QkNTUl9SRVNFVFNfSVJEQV9NT0RFX01BU0s7CisJYmNzci0+cmVzZXRzIHw9IEJDU1JfUkVTRVRTX0lSREFfTU9ERV9GVUxMOworCWF1X3N5bmMoKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7CisKK291dDM6CisJZG1hX2ZyZWUoKHZvaWQgKilhdXAtPnJ4X3JpbmdbMF0sCisJCTIgKiBNQVhfTlVNX0lSX0RFU0MqKHNpemVvZihyaW5nX2Rlc3RfdCkpKTsKK291dDI6CisJa2ZyZWUoYXVwLT5yeF9idWZmLmhlYWQpOworb3V0MToKKwlwcmludGsoS0VSTl9FUlIgImF1MWtfaW5pdF9tb2R1bGUgZmFpbGVkLiAgUmV0dXJucyAlZFxuIiwgcmV0dmFsKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyBpbnQgYXUxa19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF1MWtfcHJpdmF0ZSAqYXVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwl1MzIgY29udHJvbDsKKwl1MzIgcmluZ19hZGRyZXNzOworCisJLyogYnJpbmcgdGhlIGRldmljZSBvdXQgb2YgcmVzZXQgKi8KKwljb250cm9sID0gMHhlOyAvKiBjb2hlcmVudCwgY2xvY2sgZW5hYmxlLCBvbmUgaGFsZiBzeXN0ZW0gY2xvY2sgKi8KKwkJCSAgCisjaWZuZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgorCWNvbnRyb2wgfD0gMTsKKyNlbmRpZgorCWF1cC0+dHhfaGVhZCA9IDA7CisJYXVwLT50eF90YWlsID0gMDsKKwlhdXAtPnJ4X2hlYWQgPSAwOworCisJZm9yIChpPTA7IGk8TlVNX0lSX0RFU0M7IGkrKykgeworCQlhdXAtPnJ4X3JpbmdbaV0tPmZsYWdzID0gQVVfT1dOOworCX0KKworCXdyaXRlbChjb250cm9sLCBJUl9JTlRFUkZBQ0VfQ09ORklHKTsKKwlhdV9zeW5jX2RlbGF5KDEwKTsKKworCXdyaXRlbChyZWFkX2lyX3JlZyhJUl9FTkFCTEUpICYgfjB4ODAwMCwgSVJfRU5BQkxFKTsgLyogZGlzYWJsZSBQSFkgKi8KKwlhdV9zeW5jX2RlbGF5KDEpOworCisJd3JpdGVsKE1BWF9CVUZfU0laRSwgSVJfTUFYX1BLVF9MRU4pOworCisJcmluZ19hZGRyZXNzID0gKHUzMil2aXJ0X3RvX3BoeXMoKHZvaWQgKilhdXAtPnJ4X3JpbmdbMF0pOworCXdyaXRlbChyaW5nX2FkZHJlc3MgPj4gMjYsIElSX1JJTkdfQkFTRV9BRERSX0gpOworCXdyaXRlbCgocmluZ19hZGRyZXNzID4+IDEwKSAmIDB4ZmZmZiwgSVJfUklOR19CQVNFX0FERFJfTCk7CisKKwl3cml0ZWwoUklOR19TSVpFXzY0PDw4IHwgUklOR19TSVpFXzY0PDwxMiwgSVJfUklOR19TSVpFKTsKKworCXdyaXRlbCgxPDwyIHwgSVJfT05FX1BJTiwgSVJfQ09ORklHXzIpOyAvKiA0OE1IeiAqLworCXdyaXRlbCgwLCBJUl9SSU5HX0FERFJfQ01QUik7CisKKwlhdTFrX2lyZGFfc2V0X3NwZWVkKGRldiwgOTYwMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXUxa19pcmRhX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJldHZhbDsKKwljaGFyIGh3bmFtZVszMl07CisJc3RydWN0IGF1MWtfcHJpdmF0ZSAqYXVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICgocmV0dmFsID0gYXUxa19pbml0KGRldikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yIGluIGF1MWtfaW5pdFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKEFVMTAwMF9JUkRBX1RYX0lOVCwgJmF1MWtfaXJkYV9pbnRlcnJ1cHQsIAorCQkJCQkwLCBkZXYtPm5hbWUsIGRldikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkXG4iLCAKKwkJCQlkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShBVTEwMDBfSVJEQV9SWF9JTlQsICZhdTFrX2lyZGFfaW50ZXJydXB0LCAKKwkJCQkJMCwgZGV2LT5uYW1lLCBkZXYpKSkgeworCQlmcmVlX2lycShBVTEwMDBfSVJEQV9UWF9JTlQsIGRldik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkXG4iLCAKKwkJCQlkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKiBHaXZlIHNlbGYgYSBoYXJkd2FyZSBuYW1lICovCisJc3ByaW50Zihod25hbWUsICJBdTEwMDAgU0lSL0ZJUiIpOworCWF1cC0+aXJsYXAgPSBpcmxhcF9vcGVuKGRldiwgJmF1cC0+cW9zLCBod25hbWUpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwl3cml0ZWwocmVhZF9pcl9yZWcoSVJfQ09ORklHXzIpIHwgMTw8OCwgSVJfQ09ORklHXzIpOyAvKiBpbnQgZW5hYmxlICovCisKKwlhdXAtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQoKDMqSFopKTsgCisJYXVwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1MWtfaXJkYV9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF1MWtfcHJpdmF0ZSAqYXVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCXdyaXRlbChyZWFkX2lyX3JlZyhJUl9DT05GSUdfMikgJiB+KDE8PDgpLCBJUl9DT05GSUdfMik7CisJd3JpdGVsKDAsIElSX0NPTkZJR18xKTsgCisJd3JpdGVsKDAsIElSX0lOVEVSRkFDRV9DT05GSUcpOyAvKiBkaXNhYmxlIGNsb2NrICovCisJYXVfc3luYygpOworCisJaWYgKGF1cC0+aXJsYXApIHsKKwkJaXJsYXBfY2xvc2UoYXVwLT5pcmxhcCk7CisJCWF1cC0+aXJsYXAgPSBOVUxMOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlkZWxfdGltZXIoJmF1cC0+dGltZXIpOworCisJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCisJZnJlZV9pcnEoQVUxMDAwX0lSREFfVFhfSU5ULCBkZXYpOworCWZyZWVfaXJxKEFVMTAwMF9JUkRBX1JYX0lOVCwgZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF1MWtfaXJkYV9leGl0KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGlyX2RldnNbMF07CisJc3RydWN0IGF1MWtfcHJpdmF0ZSAqYXVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwlkbWFfZnJlZSgodm9pZCAqKWF1cC0+ZGJbMF0udmFkZHIsCisJCU1BWF9CVUZfU0laRSAqIDIqTlVNX0lSX0RFU0MpOworCWRtYV9mcmVlKCh2b2lkICopYXVwLT5yeF9yaW5nWzBdLAorCQkyICogTUFYX05VTV9JUl9ERVNDKihzaXplb2YocmluZ19kZXN0X3QpKSk7CisJa2ZyZWUoYXVwLT5yeF9idWZmLmhlYWQpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIAordXBkYXRlX3R4X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdGF0dXMsIHUzMiBwa3RfbGVuKQoreworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBzID0gJmF1cC0+c3RhdHM7CisKKwlwcy0+dHhfcGFja2V0cysrOworCXBzLT50eF9ieXRlcyArPSBwa3RfbGVuOworCisJaWYgKHN0YXR1cyAmIElSX1RYX0VSUk9SKSB7CisJCXBzLT50eF9lcnJvcnMrKzsKKwkJcHMtPnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGF1MWtfdHhfYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF1MWtfcHJpdmF0ZSAqYXVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSByaW5nX2Rlc3RfdCAqcHR4ZDsKKworCXB0eGQgPSBhdXAtPnR4X3JpbmdbYXVwLT50eF90YWlsXTsKKwl3aGlsZSAoIShwdHhkLT5mbGFncyAmIEFVX09XTikgJiYgKGF1cC0+dHhfdGFpbCAhPSBhdXAtPnR4X2hlYWQpKSB7CisJCXVwZGF0ZV90eF9zdGF0cyhkZXYsIHB0eGQtPmZsYWdzLCAKKwkJCQlwdHhkLT5jb3VudF8xPDw4IHwgcHR4ZC0+Y291bnRfMCk7CisJCXB0eGQtPmNvdW50XzAgPSAwOworCQlwdHhkLT5jb3VudF8xID0gMDsKKwkJYXVfc3luYygpOworCisJCWF1cC0+dHhfdGFpbCA9IChhdXAtPnR4X3RhaWwgKyAxKSAmIChOVU1fSVJfREVTQyAtIDEpOworCQlwdHhkID0gYXVwLT50eF9yaW5nW2F1cC0+dHhfdGFpbF07CisKKwkJaWYgKGF1cC0+dHhfZnVsbCkgeworCQkJYXVwLT50eF9mdWxsID0gMDsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCX0KKworCWlmIChhdXAtPnR4X3RhaWwgPT0gYXVwLT50eF9oZWFkKSB7CisJCWlmIChhdXAtPm5ld3NwZWVkKSB7CisJCQlhdTFrX2lyZGFfc2V0X3NwZWVkKGRldiwgYXVwLT5uZXdzcGVlZCk7CisJCQlhdXAtPm5ld3NwZWVkID0gMDsKKwkJfQorCQllbHNlIHsKKwkJCXdyaXRlbChyZWFkX2lyX3JlZyhJUl9DT05GSUdfMSkgJiB+SVJfVFhfRU5BQkxFLCAKKwkJCQkJSVJfQ09ORklHXzEpOyAKKwkJCWF1X3N5bmMoKTsKKwkJCXdyaXRlbChyZWFkX2lyX3JlZyhJUl9DT05GSUdfMSkgfCBJUl9SWF9FTkFCTEUsIAorCQkJCQlJUl9DT05GSUdfMSk7IAorCQkJd3JpdGVsKDAsIElSX1JJTkdfUFJPTVBUKTsKKwkJCWF1X3N5bmMoKTsKKwkJfQorCX0KK30KKworCisvKgorICogQXUxMDAwIHRyYW5zbWl0IHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQgYXUxa19pcmRhX2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCXZvbGF0aWxlIHJpbmdfZGVzdF90ICpwdHhkOworCXUzMiBsZW47CisKKwl1MzIgZmxhZ3M7CisJZGJfZGVzdF90ICpwREI7CisKKwlpZiAoc3BlZWQgIT0gYXVwLT5zcGVlZCAmJiBzcGVlZCAhPSAtMSkgeworCQlhdXAtPm5ld3NwZWVkID0gc3BlZWQ7CisJfQorCisJaWYgKChza2ItPmxlbiA9PSAwKSAmJiAoYXVwLT5uZXdzcGVlZCkpIHsKKwkJaWYgKGF1cC0+dHhfdGFpbCA9PSBhdXAtPnR4X2hlYWQpIHsKKwkJCWF1MWtfaXJkYV9zZXRfc3BlZWQoZGV2LCBzcGVlZCk7CisJCQlhdXAtPm5ld3NwZWVkID0gMDsKKwkJfQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCXB0eGQgPSBhdXAtPnR4X3JpbmdbYXVwLT50eF9oZWFkXTsKKwlmbGFncyA9IHB0eGQtPmZsYWdzOworCisJaWYgKGZsYWdzICYgQVVfT1dOKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHhfZnVsbFxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlhdXAtPnR4X2Z1bGwgPSAxOworCQlyZXR1cm4gMTsKKwl9CisJZWxzZSBpZiAoKChhdXAtPnR4X2hlYWQgKyAxKSAmIChOVU1fSVJfREVTQyAtIDEpKSA9PSBhdXAtPnR4X3RhaWwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eF9mdWxsXG4iLCBkZXYtPm5hbWUpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCWF1cC0+dHhfZnVsbCA9IDE7CisJCXJldHVybiAxOworCX0KKworCXBEQiA9IGF1cC0+dHhfZGJfaW51c2VbYXVwLT50eF9oZWFkXTsKKworI2lmIDAKKwlpZiAocmVhZF9pcl9yZWcoSVJfUlhfQllURV9DTlQpICE9IDApIHsKKwkJcHJpbnRrKCJ0eCB3YXJuaW5nOiByeCBieXRlIGNudCAleFxuIiwgCisJCQkJcmVhZF9pcl9yZWcoSVJfUlhfQllURV9DTlQpKTsKKwl9CisjZW5kaWYKKwkKKwlpZiAoYXVwLT5zcGVlZCA9PSA0MDAwMDAwKSB7CisJCS8qIEZJUiAqLworCQltZW1jcHkoKHZvaWQgKilwREItPnZhZGRyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJcHR4ZC0+Y291bnRfMCA9IHNrYi0+bGVuICYgMHhmZjsKKwkJcHR4ZC0+Y291bnRfMSA9IChza2ItPmxlbiA+PiA4KSAmIDB4ZmY7CisKKwl9CisJZWxzZSB7CisJCS8qIFNJUiAqLworCQlsZW4gPSBhc3luY193cmFwX3NrYihza2IsICh1OCAqKXBEQi0+dmFkZHIsIE1BWF9CVUZfU0laRSk7CisJCXB0eGQtPmNvdW50XzAgPSBsZW4gJiAweGZmOworCQlwdHhkLT5jb3VudF8xID0gKGxlbiA+PiA4KSAmIDB4ZmY7CisJCXB0eGQtPmZsYWdzIHw9IElSX0RJU19DUkM7CisJCWF1X3dyaXRlbChhdV9yZWFkbCgweGFlMDAwMDBjKSAmIH4oMTw8MTMpLCAweGFlMDAwMDBjKTsKKwl9CisJcHR4ZC0+ZmxhZ3MgfD0gQVVfT1dOOworCWF1X3N5bmMoKTsKKworCXdyaXRlbChyZWFkX2lyX3JlZyhJUl9DT05GSUdfMSkgfCBJUl9UWF9FTkFCTEUsIElSX0NPTkZJR18xKTsgCisJd3JpdGVsKDAsIElSX1JJTkdfUFJPTVBUKTsKKwlhdV9zeW5jKCk7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJYXVwLT50eF9oZWFkID0gKGF1cC0+dHhfaGVhZCArIDEpICYgKE5VTV9JUl9ERVNDIC0gMSk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIAordXBkYXRlX3J4X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdGF0dXMsIHUzMiBjb3VudCkKK3sKKwlzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwcyA9ICZhdXAtPnN0YXRzOworCisJcHMtPnJ4X3BhY2tldHMrKzsKKworCWlmIChzdGF0dXMgJiBJUl9SWF9FUlJPUikgeworCQlwcy0+cnhfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiAoSVJfUEhZX0VSUk9SfElSX0ZJRk9fT1ZFUikpCisJCQlwcy0+cnhfbWlzc2VkX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgSVJfTUFYX0xFTikKKwkJCXBzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBJUl9DUkNfRVJST1IpCisJCQlwcy0+cnhfY3JjX2Vycm9ycysrOworCX0KKwllbHNlIAorCQlwcy0+cnhfYnl0ZXMgKz0gY291bnQ7Cit9CisKKy8qCisgKiBBdTEwMDAgcmVjZWl2ZSByb3V0aW5lLgorICovCitzdGF0aWMgaW50IGF1MWtfaXJkYV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl2b2xhdGlsZSByaW5nX2Rlc3RfdCAqcHJ4ZDsKKwl1MzIgZmxhZ3MsIGNvdW50OworCWRiX2Rlc3RfdCAqcERCOworCisJcHJ4ZCA9IGF1cC0+cnhfcmluZ1thdXAtPnJ4X2hlYWRdOworCWZsYWdzID0gcHJ4ZC0+ZmxhZ3M7CisKKwl3aGlsZSAoIShmbGFncyAmIEFVX09XTikpICB7CisJCXBEQiA9IGF1cC0+cnhfZGJfaW51c2VbYXVwLT5yeF9oZWFkXTsKKwkJY291bnQgPSBwcnhkLT5jb3VudF8xPDw4IHwgcHJ4ZC0+Y291bnRfMDsKKwkJaWYgKCEoZmxhZ3MgJiBJUl9SWF9FUlJPUikpICB7CisJCQkvKiBnb29kIGZyYW1lICovCisJCQl1cGRhdGVfcnhfc3RhdHMoZGV2LCBmbGFncywgY291bnQpOworCQkJc2tiPWFsbG9jX3NrYihjb3VudCsxLEdGUF9BVE9NSUMpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJYXVwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlza2JfcmVzZXJ2ZShza2IsIDEpOworCQkJaWYgKGF1cC0+c3BlZWQgPT0gNDAwMDAwMCkKKwkJCQlza2JfcHV0KHNrYiwgY291bnQpOworCQkJZWxzZQorCQkJCXNrYl9wdXQoc2tiLCBjb3VudC0yKTsKKwkJCW1lbWNweShza2ItPmRhdGEsICh2b2lkICopcERCLT52YWRkciwgY291bnQtMik7CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlwcnhkLT5jb3VudF8wID0gMDsKKwkJCXByeGQtPmNvdW50XzEgPSAwOworCQl9CisJCXByeGQtPmZsYWdzIHw9IEFVX09XTjsKKwkJYXVwLT5yeF9oZWFkID0gKGF1cC0+cnhfaGVhZCArIDEpICYgKE5VTV9JUl9ERVNDIC0gMSk7CisJCXdyaXRlbCgwLCBJUl9SSU5HX1BST01QVCk7CisJCWF1X3N5bmMoKTsKKworCQkvKiBuZXh0IGRlc2NyaXB0b3IgKi8KKwkJcHJ4ZCA9IGF1cC0+cnhfcmluZ1thdXAtPnJ4X2hlYWRdOworCQlmbGFncyA9IHByeGQtPmZsYWdzOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisJfQorCXJldHVybiAwOworfQorCisKK3ZvaWQgYXUxa19pcmRhX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlzcjogbnVsbCBkZXYgcHRyXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJd3JpdGVsKDAsIElSX0lOVF9DTEVBUik7IC8qIGFjayBpcmRhIGludGVycnVwdHMgKi8KKworCWF1MWtfaXJkYV9yeChkZXYpOworCWF1MWtfdHhfYWNrKGRldik7Cit9CisKKworLyoKKyAqIFRoZSBUeCByaW5nIGhhcyBiZWVuIGZ1bGwgbG9uZ2VyIHRoYW4gdGhlIHdhdGNoZG9nIHRpbWVvdXQKKyAqIHZhbHVlLiBUaGUgdHJhbnNtaXR0ZXIgbXVzdCBiZSBodW5nPworICovCitzdGF0aWMgdm9pZCBhdTFrX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MzIgc3BlZWQ7CisJc3RydWN0IGF1MWtfcHJpdmF0ZSAqYXVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHR4IHRpbWVvdXRcbiIsIGRldi0+bmFtZSk7CisJc3BlZWQgPSBhdXAtPnNwZWVkOworCWF1cC0+c3BlZWQgPSAwOworCWF1MWtfaXJkYV9zZXRfc3BlZWQoZGV2LCBzcGVlZCk7CisJYXVwLT50eF9mdWxsID0gMDsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKworLyoKKyAqIFNldCB0aGUgSXJEQSBjb21tdW5pY2F0aW9ucyBzcGVlZC4KKyAqLworc3RhdGljIGludCAKK2F1MWtfaXJkYV9zZXRfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNwZWVkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGF1MWtfcHJpdmF0ZSAqYXVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgY29udHJvbDsKKwlpbnQgcmV0ID0gMCwgdGltZW91dCA9IDEwLCBpOworCXZvbGF0aWxlIHJpbmdfZGVzdF90ICpwdHhkOworI2lmIGRlZmluZWQoQ09ORklHX01JUFNfREIxMDAwKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTEwMCkKKwl1bnNpZ25lZCBsb25nIGlyZGFfcmVzZXRzOworI2VuZGlmCisKKwlpZiAoc3BlZWQgPT0gYXVwLT5zcGVlZCkKKwkJcmV0dXJuIHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpcl9sb2NrLCBmbGFncyk7CisKKwkvKiBkaXNhYmxlIFBIWSBmaXJzdCAqLworCXdyaXRlbChyZWFkX2lyX3JlZyhJUl9FTkFCTEUpICYgfjB4ODAwMCwgSVJfRU5BQkxFKTsKKworCS8qIGRpc2FibGUgUlgvVFggKi8KKwl3cml0ZWwocmVhZF9pcl9yZWcoSVJfQ09ORklHXzEpICYgfihJUl9SWF9FTkFCTEV8SVJfVFhfRU5BQkxFKSwgCisJCQlJUl9DT05GSUdfMSk7CisJYXVfc3luY19kZWxheSgxKTsKKwl3aGlsZSAocmVhZF9pcl9yZWcoSVJfRU5BQkxFKSAmIChJUl9SWF9TVEFUVVMgfCBJUl9UWF9TVEFUVVMpKSB7CisJCW1kZWxheSgxKTsKKwkJaWYgKCF0aW1lb3V0LS0pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJ4L3R4IGRpc2FibGUgdGltZW91dFxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogZGlzYWJsZSBETUEgKi8KKwl3cml0ZWwocmVhZF9pcl9yZWcoSVJfQ09ORklHXzEpICYgfklSX0RNQV9FTkFCTEUsIElSX0NPTkZJR18xKTsKKwlhdV9zeW5jX2RlbGF5KDEpOworCisJLyogCisJICogIEFmdGVyIHdlIGRpc2FibGUgdHgvcnguIHRoZSBpbmRleCBwb2ludGVycworIAkgKiBnbyBiYWNrIHRvIHplcm8uCisJICovCisJYXVwLT50eF9oZWFkID0gYXVwLT50eF90YWlsID0gYXVwLT5yeF9oZWFkID0gMDsKKwlmb3IgKGk9MDsgaTxOVU1fSVJfREVTQzsgaSsrKSB7CisJCXB0eGQgPSBhdXAtPnR4X3JpbmdbaV07CisJCXB0eGQtPmZsYWdzID0gMDsKKwkJcHR4ZC0+Y291bnRfMCA9IDA7CisJCXB0eGQtPmNvdW50XzEgPSAwOworCX0KKworCWZvciAoaT0wOyBpPE5VTV9JUl9ERVNDOyBpKyspIHsKKwkJcHR4ZCA9IGF1cC0+cnhfcmluZ1tpXTsKKwkJcHR4ZC0+Y291bnRfMCA9IDA7CisJCXB0eGQtPmNvdW50XzEgPSAwOworCQlwdHhkLT5mbGFncyA9IEFVX09XTjsKKwl9CisKKwlpZiAoc3BlZWQgPT0gNDAwMDAwMCkgeworI2lmIGRlZmluZWQoQ09ORklHX01JUFNfREIxMDAwKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTEwMCkKKwkJYmNzci0+cmVzZXRzIHw9IEJDU1JfUkVTRVRTX0ZJUl9TRUw7CisjZWxzZSAvKiBQYjEwMDAgYW5kIFBiMTEwMCAqLworCQl3cml0ZWwoMTw8MTMsIENQTERfQVVYMSk7CisjZW5kaWYKKwl9CisJZWxzZSB7CisjaWYgZGVmaW5lZChDT05GSUdfTUlQU19EQjEwMDApIHx8IGRlZmluZWQoQ09ORklHX01JUFNfREIxMTAwKQorCQliY3NyLT5yZXNldHMgJj0gfkJDU1JfUkVTRVRTX0ZJUl9TRUw7CisjZWxzZSAvKiBQYjEwMDAgYW5kIFBiMTEwMCAqLworCQl3cml0ZWwocmVhZGwoQ1BMRF9BVVgxKSAmIH4oMTw8MTMpLCBDUExEX0FVWDEpOworI2VuZGlmCisJfQorCisJc3dpdGNoIChzcGVlZCkgeworCWNhc2UgOTYwMDoJCisJCXdyaXRlbCgxMTw8MTAgfCAxMjw8NSwgSVJfV1JJVEVfUEhZX0NPTkZJRyk7IAorCQl3cml0ZWwoSVJfU0lSX01PREUsIElSX0NPTkZJR18xKTsgCisJCWJyZWFrOworCWNhc2UgMTkyMDA6CQorCQl3cml0ZWwoNTw8MTAgfCAxMjw8NSwgSVJfV1JJVEVfUEhZX0NPTkZJRyk7IAorCQl3cml0ZWwoSVJfU0lSX01PREUsIElSX0NPTkZJR18xKTsgCisJCWJyZWFrOworCWNhc2UgMzg0MDA6CisJCXdyaXRlbCgyPDwxMCB8IDEyPDw1LCBJUl9XUklURV9QSFlfQ09ORklHKTsgCisJCXdyaXRlbChJUl9TSVJfTU9ERSwgSVJfQ09ORklHXzEpOyAKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDoJCisJCXdyaXRlbCgxPDwxMCB8IDEyPDw1LCBJUl9XUklURV9QSFlfQ09ORklHKTsgCisJCXdyaXRlbChJUl9TSVJfTU9ERSwgSVJfQ09ORklHXzEpOyAKKwkJYnJlYWs7CisJY2FzZSAxMTUyMDA6IAorCQl3cml0ZWwoMTI8PDUsIElSX1dSSVRFX1BIWV9DT05GSUcpOyAKKwkJd3JpdGVsKElSX1NJUl9NT0RFLCBJUl9DT05GSUdfMSk7IAorCQlicmVhazsKKwljYXNlIDQwMDAwMDA6CisJCXdyaXRlbCgweEYsIElSX1dSSVRFX1BIWV9DT05GSUcpOworCQl3cml0ZWwoSVJfRklSfElSX0RNQV9FTkFCTEV8SVJfUlhfRU5BQkxFLCBJUl9DT05GSUdfMSk7IAorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIiVzIHVuc3VwcG9ydGVkIHNwZWVkICV4XG4iLCBkZXYtPm5hbWUsIHNwZWVkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJYXVwLT5zcGVlZCA9IHNwZWVkOworCXdyaXRlbChyZWFkX2lyX3JlZyhJUl9FTkFCTEUpIHwgMHg4MDAwLCBJUl9FTkFCTEUpOworCWF1X3N5bmMoKTsKKworCWNvbnRyb2wgPSByZWFkX2lyX3JlZyhJUl9FTkFCTEUpOworCXdyaXRlbCgwLCBJUl9SSU5HX1BST01QVCk7CisJYXVfc3luYygpOworCisJaWYgKGNvbnRyb2wgJiAoMTw8MTQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbmZpZ3VyYXRpb24gZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJfQorCWVsc2UgeworCQlpZiAoY29udHJvbCAmICgxPDwxMSkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgVmFsaWQgU0lSIGNvbmZpZ1xuIiwgZGV2LT5uYW1lKTsKKwkJaWYgKGNvbnRyb2wgJiAoMTw8MTIpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIFZhbGlkIE1JUiBjb25maWdcbiIsIGRldi0+bmFtZSk7CisJCWlmIChjb250cm9sICYgKDE8PDEzKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlcyBWYWxpZCBGSVIgY29uZmlnXG4iLCBkZXYtPm5hbWUpOworCQlpZiAoY29udHJvbCAmICgxPDwxMCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgVFggZW5hYmxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJaWYgKGNvbnRyb2wgJiAoMTw8OSkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgUlggZW5hYmxlZFxuIiwgZGV2LT5uYW1lKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCAKK2F1MWtfaXJkYV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmcmVxLCBpbnQgY21kKQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSAqcnEgPSAoc3RydWN0IGlmX2lyZGFfcmVxICopaWZyZXE7CisJc3RydWN0IGF1MWtfcHJpdmF0ZSAqYXVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ1NCQU5EV0lEVEg6CisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQkvKgorCQkJICogV2UgYXJlIHVuYWJsZSB0byBzZXQgdGhlIHNwZWVkIGlmIHRoZQorCQkJICogZGV2aWNlIGlzIG5vdCBydW5uaW5nLgorCQkJICovCisJCQlpZiAoYXVwLT5vcGVuKQorCQkJCXJldCA9IGF1MWtfaXJkYV9zZXRfc3BlZWQoZGV2LAorCQkJCQkJcnEtPmlmcl9iYXVkcmF0ZSk7CisJCQllbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzIGlvY3RsOiAhbmV0aWZfcnVubmluZ1xuIiwKKwkJCQkJCWRldi0+bmFtZSk7CisJCQkJcmV0ID0gMDsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgU0lPQ1NNRURJQUJVU1k6CisJCXJldCA9IC1FUEVSTTsKKwkJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KGRldiwgVFJVRSk7CisJCQlyZXQgPSAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTSU9DR1JFQ0VJVklORzoKKwkJcnEtPmlmcl9yZWNlaXZpbmcgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmF1MWtfaXJkYV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZhdXAtPnN0YXRzOworfQorCitNT0RVTEVfQVVUSE9SKCJQZXRlIFBvcG92IDxwcG9wb3ZAbXZpc3RhLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQXUxMDAwIElyREEgRGV2aWNlIERyaXZlciIpOworCittb2R1bGVfaW5pdChhdTFrX2lyZGFfaW5pdCk7Cittb2R1bGVfZXhpdChhdTFrX2lyZGFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmMgYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwOGM1MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvZG9uYXVib2UuYwpAQCAtMCwwICsxLDE3ODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOgkJZG9uYXVib2UuYworICogVmVyc2lvbjogCQkyLjE3CisgKiBEZXNjcmlwdGlvbjogICBEcml2ZXIgZm9yIHRoZSBUb3NoaWJhIE9CT0UgKG9yIHR5cGUtTyBvciA3MDEpCisgKiAgICAgICAgICAgICAgICBGSVIgQ2hpcHNldCwgYWxzbyBzdXBwb3J0cyB0aGUgRE9OQVVPQk9FICh0eXBlLURPCisgKiAgICAgICAgICAgICAgICBvciBkMDEpIEZJUiBjaGlwc2V0IHdoaWNoIGFzIGZhciBhcyBJIGtub3cgaXMKKyAqICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbXBhdGlibGUuCisgKiBEb2N1bWVudGF0aW9uOiBodHRwOi8vbGlieGcuZnJlZS5mci9pcmRhL2xpYi1pcmRhLmh0bWwKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIEphbWVzIE1jS2VuemllIDxqYW1lc0BmaXNoc291cC5kaHMub3JnPgorICogQ3JlYXRlZCBhdDogICAgU2F0IE1heSA4ICAxMjozNToyNyAxOTk5CisgKiBNb2RpZmllZDogICAgICBQYXVsIEJyaXN0b3cgPHBhdWwuYnJpc3Rvd0B0ZWNobm9sb2dpc3QuY29tPgorICogTW9kaWZpZWQ6ICAgICAgTW9uIE5vdiAxMSAxOToxMDowNSAxOTk5CisgKiBNb2RpZmllZDogICAgICBKYW1lcyBNY0tlbnppZSA8amFtZXNAZmlzaHNvdXAuZGhzLm9yZz4KKyAqIE1vZGlmaWVkOiAgICAgIFRodSBNYXIgMTYgMTI6NDk6MDAgMjAwMCAoU3Vic3RhbnRpYWwgcmV3cml0ZSkKKyAqIE1vZGlmaWVkOiAgICAgIFNhdCBBcHIgMjkgMDA6MjM6MDMgMjAwMCAoQWRkZWQgRE9OQVVPQk9FIHN1cHBvcnQpCisgKiBNb2RpZmllZDogICAgICBXZWQgTWF5IDI0IDIzOjQ1OjAyIDIwMDAgKEZpeGVkIGNoaXBpb190IHN0cnVjdHVyZSkKKyAqIE1vZGlmaWVkOiAyLjEzIENocmlzdGlhbiBHZW5uZXJhdCA8Y2hyaXN0aWFuLmdlbm5lcmF0QHBvbHl0ZWNobmlxdWUub3JnPgorICogTW9kaWZpZWQ6IDIuMTMgZGltIGphbiAwNyAyMTo1NzozOSAyMDAxICh0ZXN0ZWQgd2l0aCBrZXJuZWwgMi40ICYgaXJuZXQvcHBwKQorICogTW9kaWZpZWQ6IDIuMTQgQ2hyaXN0aWFuIEdlbm5lcmF0IDxjaHJpc3RpYW4uZ2VubmVyYXRAcG9seXRlY2huaXF1ZS5vcmc+CisgKiBNb2RpZmllZDogMi4xNCBsdW4gZmV2IDA1IDE3OjU1OjU5IDIwMDEgKGFkYXB0ZWQgdG8gcGF0Y2gtMi40LjEtcHJlOC1pcmRhMSkKKyAqIE1vZGlmaWVkOiAyLjE1IE1hcnRpbiBMdWNpbmEgPG1hdG9Aa290ZWxuYS5zaz4KKyAqIE1vZGlmaWVkOiAyLjE1IEZyaSBKdW4gMjEgMjA6NDA6NTkgMjAwMiAoc3luYyB3aXRoIDIuNC4xOCwgc3Vic3RhbnRpYWwgZml4ZXMpCisgKiBNb2RpZmllZDogMi4xNiBNYXJ0aW4gTHVjaW5hIDxtYXRvQGtvdGVsbmEuc2s+CisgKiBNb2RpZmllZDogMi4xNiBTYXQgSnVuIDIyIDE4OjU0OjI5IDIwMDIgKGZpeCBmcmVlcmVnaW9uLCBkZWZhdWx0IHRvIHZlcmJvc2UpCisgKiBNb2RpZmllZDogMi4xNyBDaHJpc3RpYW4gR2VubmVyYXQgPGNocmlzdGlhbi5nZW5uZXJhdEBwb2x5dGVjaG5pcXVlLm9yZz4KKyAqIE1vZGlmaWVkOiAyLjE3IGpldSBzZXAgMTIgMDg6NTA6MjAgMjAwMiAoc2F2ZV9mbGFncygpO2NsaSgpOyByZXBsYWNlZCBieSBzcGlubG9ja3MpCisgKiBNb2RpZmllZDogMi4xOCBDaHJpc3RpYW4gR2VubmVyYXQgPGNocmlzdGlhbi5nZW5uZXJhdEBwb2x5dGVjaG5pcXVlLm9yZz4KKyAqIE1vZGlmaWVkOiAyLjE4IHZlbiBqYW4gMTAgMDM6MTQ6MTYgMjAwMyBDaGFuZ2UgcHJvYmUgZGVmYXVsdCBvcHRpb25zCisgKgorICogICAgIENvcHlyaWdodCAoYykgMTk5OSBKYW1lcyBNY0tlbnppZSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgTmVpdGhlciBKYW1lcyBNY0tlbnppZSBub3IgQ2FtYnJpZGdlIFVuaXZlcnNpdHkgYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqICAgICBBcHBsaWNhYmxlIE1vZGVscyA6IExpYnJldHRvIDEwMC8xMTBDVCBhbmQgbWFueSBtb3JlLgorICogICAgIFRvc2hpYmEgcmVmZXJzIHRvIHRoaXMgY2hpcCBhcyB0aGUgdHlwZS1PIElSIHBvcnQsCisgKiAgICAgb3IgdGhlIHR5cGUtRE8gSVIgcG9ydC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIExvb2sgYXQgdG9zaG9ib2UuaCAoY3VycmVudGx5IGluIGluY2x1ZGUvbmV0L2lyZGEpIGZvciBkZXRhaWxzIG9mICovCisvKiBXaGVyZSB0byBnZXQgZG9jdW1lbnRhdGlvbiBvbiB0aGUgY2hpcCAgICAgICAgICovCisKKworc3RhdGljIGNoYXIgKnJjc2lkID0KKyAgIiRJZDogZG9uYXVib2UuYyBWMi4xOCB2ZW4gamFuIDEwIDAzOjE0OjE2IDIwMDMkIjsKKworLyogU2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsb2dpYyBpbiB0aGlzIGRyaXZlciAqLworCisvKiBVc2VyIHNlcnZpY2FibGUgcGFydHMgKi8KKy8qIFVTRV9QUk9CRSBDcmVhdGUgdGhlIGNvZGUgd2hpY2ggcHJvYmVzIHRoZSBjaGlwIGFuZCBkb2VzIGEgZmV3IHRlc3RzICovCisvKiBkb19wcm9iZSBtb2R1bGUgcGFyYW1ldGVyIEVuYWJsZSB0aGlzIGNvZGUgKi8KKy8qIFByb2JlIGNvZGUgaXMgdmVyeSB1c2VmdWwgZm9yIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBoYXJkd2FyZSB3b3JrcyAqLworLyogVXNlIGl0IHdpdGggdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgVFRfTEVOLCBSWF9MRU4gKi8KKy8qIFN0cm9uZ2x5IHJlY29tZW5kZWQsIGRpc2FibGUgaWYgdGhlIHByb2JlIGZhaWxzIG9uIHlvdXIgbWFjaGluZSAqLworLyogYW5kIHNlbmQgbWUgPGphbWVzQGZpc2hzb3VwLmRocy5vcmc+IHRoZSBvdXRwdXQgb2YgZG1lc2cgKi8KKyNkZWZpbmUgVVNFX1BST0JFIDEKKyN1bmRlZiAgVVNFX1BST0JFCisKKy8qIFRyYWNlIFRyYW5zbWl0IHJpbmcsIGludGVycnVwdHMsIFJlY2VpdmUgcmluZyBvciBub3QgPyAqLworI2RlZmluZSBQUk9CRV9WRVJCT1NFIDEKKworLyogRGVidWcgb3B0aW9uLCBleGFtaW5lIHNlbnQgYW5kIHJlY2VpdmVkIHJhdyBkYXRhICovCisvKiBJcmRhZHVtcCBpcyBiZXR0ZXIsIGJ1dCBkb2VzIG5vdCBzZWUgYWxsIHBhY2tldHMuIGVuYWJsZSBpdCBpZiB5b3Ugd2FudC4gKi8KKyN1bmRlZiBEVU1QX1BBQ0tFVFMKKworLyogTUlSIG1vZGUgaGFzIG5vdCBiZWVuIHRlc3RlZC4gU29tZSBiZWhhdmlvdXIgaXMgZGlmZmVyZW50ICovCisvKiBTZWVtcyB0byB3b3JrIGFnYWluc3QgYW4gRXJpY3Nzb24gUjUyMCBmb3IgbWUuIC1NYXJ0aW4gKi8KKyNkZWZpbmUgVVNFX01JUgorCisvKiBTY2hlZHVsZSBiYWNrIHRvIGJhY2sgaGFyZHdhcmUgdHJhbnNtaXRzIHdoZXJldmVyIHBvc3NpYmxlLCBvdGhlcndpc2UgKi8KKy8qIHdlIG5lZWQgYW4gaW50ZXJydXB0IGZvciBldmVyeSBmcmFtZSwgdW5zZXQgaWYgb2JvZSB3b3JrcyBmb3IgYSBiaXQgYW5kICovCisvKiB0aGVuIGhhbmdzICovCisjZGVmaW5lIE9QVElNSVpFX1RYCisKKy8qIFNldCB0aGUgbnVtYmVyIG9mIHNsb3RzIGluIHRoZSByaW5ncyAqLworLyogSWYgeW91IGdldCByeC90eCBmaWZvIG92ZXJmbG93cyBhdCBoaWdoIGJpdHJhdGVzLCB5b3UgY2FuIHRyeSBpbmNyZWFzaW5nICovCisvKiB0aGVzZSAqLworCisjZGVmaW5lIFJJTkdfU0laRSAoT0JPRV9SSU5HX1NJWkVfUlg4IHwgT0JPRV9SSU5HX1NJWkVfVFg4KQorI2RlZmluZSBUWF9TTE9UUyAgICA4CisjZGVmaW5lIFJYX1NMT1RTICAgIDgKKworCisvKiBMZXNzIHVzZXIgc2VydmljYWJsZSBwYXJ0cyBiZWxvdyBoZXJlICovCisKKy8qIFRlc3QsIFRyYW5zbWl0IGFuZCByZWNlaXZlIGJ1ZmZlciBzaXplcywgYWRqdXN0IGF0IHlvdXIgcGVyaWwgKi8KKy8qIHJlbWFya3M6IG5mcyB1c3VhbGx5IG5lZWRzIDFrIGJsb2NrcyAqLworLyogcmVtYXJrczogaW4gU0lSIG1vZGUsIENSQyBpcyByZWNlaXZlZCwgLT4gUlhfTEVOPVRYX0xFTisyICovCisvKiByZW1hcmtzOiB0ZXN0IGFjY2VwdHMgbGFyZ2UgYmxvY2tzLiBTdGFuZGFyZCBpcyAweDgwICovCisvKiBXaGVuIFRUX0xFTiA+IFJYX0xFTiAoU0lSIG1vZGUpIGRhdGEgaXMgc3RvcmVkIGluIHN1Y2Nlc3NpdmUgc2xvdHMuICovCisvKiBXaGVuIDMgb3IgbW9yZSBzbG90cyBhcmUgbmVlZGVkIGZvciBlYWNoIHRlc3QgcGFja2V0LCAqLworLyogZGF0YSByZWNlaXZlZCBpbiB0aGUgZmlyc3Qgc2xvdHMgaXMgb3ZlcndyaXR0ZW4sIGV2ZW4gKi8KKy8qIGlmIE9CT0VfQ1RMX1JYX0hXX09XTlMgaXMgbm90IHNldCwgd2l0aG91dCBhbnkgZXJyb3IhICovCisjZGVmaW5lIFRUX0xFTiAgICAgIDB4ODAKKyNkZWZpbmUgVFhfTEVOICAgICAgMHhjMDAKKyNkZWZpbmUgUlhfTEVOICAgICAgMHhjMDQKKy8qIFJlYWwgdHJhbnNtaXR0ZWQgbGVuZ3RoIChTSVIgbW9kZSkgaXMgYWJvdXQgMTQrKDIlKlRYX0xFTikgbW9yZSAqLworLyogbG9uZyB0aGFuIHVzZXItZGVmaW5lZCBsZW5ndGggKHNlZSBhc3luY193cmFwX3NrYikgYW5kIGlzIGxlc3MgdGhlbiA0SyAqLworLyogUmVhbCByZWNlaXZlZCBsZW5ndGggaXMgKG1heCBSWF9MRU4pIGRpZmZlcnMgZnJvbSB1c2VyLWRlZmluZWQgKi8KKy8qIGxlbmd0aCBvbmx5IGIgdGhlIENSQyAoMiBvciA0IGJ5dGVzKSAqLworI2RlZmluZSBCVUZfU0FGRVRZICAweDdhCisjZGVmaW5lIFJYX0JVRl9TWiAgIChSWF9MRU4pCisjZGVmaW5lIFRYX0JVRl9TWiAgIChUWF9MRU4rQlVGX1NBRkVUWSkKKworCisvKiBMb2dpYyBvZiB0aGUgbmV0ZGV2IHBhcnQgb2YgdGhpcyBkcml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIFRoZSBSWCByaW5nIGlzIGZpbGxlZCB3aXRoIGJ1ZmZlcnMsIHdoZW4gYSBwYWNrZXQgYXJyaXZlcyAgICAgICAgICAgKi8KKy8qIGl0IGlzIERNQSdkIGludG8gdGhlIGJ1ZmZlciB3aGljaCBpcyBtYXJrZWQgdXNlZCBhbmQgUnhEb25lIGNhbGxlZCAgKi8KKy8qIFJ4RG9uZSBmb3JtcyBhbiBza2IgKGFuZCBjaGVja3MgdGhlIENSQyBpZiBpbiBTSVIgbW9kZSkgYW5kIHNoaXBzICAgKi8KKy8qIHRoZSBwYWNrZXQgb2ZmIHVwc3RhaXJzICovCisKKy8qIFRoZSB0cmFuc21pdHRlciBvbiB0aGUgb2JvZSBjaGlwIGNhbiB3b3JrIGluIG9uZSBvZiB0d28gbW9kZXMgICAgICAgKi8KKy8qIGZvciBlYWNoIHJpbmctPnR4W10gdGhlIHRyYW5zbWl0dGVyIGNhbiBlaXRoZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGEpIHRyYW5zbWl0IHRoZSBwYWNrZXQsIGxlYXZlIHRoZSB0cmFzbWl0dGVyIGVuYWJsZWQgYW5kIHByb2NlZWQgdG8gKi8KKy8qICAgIHRoZSBuZXh0IHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGIpIHRyYW5zbWl0IHRoZSBwYWNrZXQsIHN3aXRjaCBvZmYgdGhlIHRyYW5zbWl0dGVyIGFuZCBpc3N1ZSBUeERvbmUgKi8KKworLyogQWxsIHBhY2tldHMgYXJlIGVudGVyZWQgaW50byB0aGUgcmluZyBpbiBtb2RlIGIpLCBpZiB0aGUgcmluZyB3YXMgICAqLworLyogZW1wdHkgdGhlIHRyYW5zbWl0dGVyIGlzIHN0YXJ0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBJZiBPUFRJTUlaRV9UWCBpcyBkZWZpbmVkIHRoZW4gaW4gVHhEb25lIGlmIHRoZSByaW5nIGNvbnRhaW5zICAgICAgICovCisvKiBtb3JlIHRoYW4gb25lIHBhY2tldCwgYWxsIGJ1dCB0aGUgbGFzdCBhcmUgc2V0IHRvIG1vZGUgYSkgW0hPV0VWRVIgICovCisvKiB0aGUgaGFyZHdhcmUgbWF5IG5vdCBub3RpY2UgdGhpcywgdGhpcyBpcyB3aHkgd2Ugc3RhcnQgaW4gbW9kZSBiKSBdICovCisvKiB0aGVuIHJlc3RhcnQgdGhlIHRyYW5zbWl0dGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIElmIE9QVElNSVpFX1RYIGlzIG5vdCBkZWZpbmVkIHRoZW4gd2UganVzdCByZXN0YXJ0IHRoZSB0cmFuc21pdHRlciAgKi8KKy8qIGlmIHRoZSByaW5nIGlzbid0IGVtcHR5ICovCisKKy8qIFNwZWVkIGNoYW5nZXMgYXJlIGRlbGF5ZWQgdW50aWwgdGhlIFR4UmluZyBpcyBlbXB0eSAgICAgICAgICAgICAgICAgKi8KKy8qIG10dCBpcyBoYW5kbGVkIGJ5IGdlbmVyYXRpbmcgcGFja2V0cyB3aXRoIGJhZCBDUkNzLCBiZWZvcmUgdGhlIGRhdGEgKi8KKworLyogVE9ETzogKi8KKy8qIGNoZWNrIHRoZSBtdHQgd29ya3Mgb2sgICAgICAqLworLyogZmluaXNoIHRoZSB3YXRjaGRvZyAgICAgICAgICovCisKKy8qIE5vIHVzZXIgc2VydmljYWJsZSBwYXJ0cyBiZWxvdyBoZXJlICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKy8vI2luY2x1ZGUgPG5ldC9pcmRhL2lybW9kLmg+CisvLyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcF9mcmFtZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvY3JjLmg+CisKKyNpbmNsdWRlICJkb25hdWJvZS5oIgorCisjZGVmaW5lIElOQihwb3J0KSAgICAgICBpbmJfcChwb3J0KQorI2RlZmluZSBPVVRCKHZhbCxwb3J0KSAgb3V0Yl9wKHZhbCxwb3J0KQorI2RlZmluZSBPVVRCUCh2YWwscG9ydCkgb3V0Yl9wKHZhbCxwb3J0KQorCisjZGVmaW5lIFBST01QVCAgT1VUQihPQk9FX1BST01QVF9CSVQsT0JPRV9QUk9NUFQpOworCisjaWYgUFJPQkVfVkVSQk9TRQorI2RlZmluZSBQUk9CRV9ERUJVRyhhcmdzLi4uKSAocHJpbnRrIChhcmdzKSkKKyNlbHNlCisjZGVmaW5lIFBST0JFX0RFQlVHKGFyZ3MuLi4pIDsKKyNlbmRpZgorCisvKiBTZXQgdGhlIERNQSB0byBiZSBieXRlIGF0IGEgdGltZSAqLworI2RlZmluZSBDT05GSUcwSF9ETUFfT0ZGIE9CT0VfQ09ORklHMEhfUkNWQU5ZCisjZGVmaW5lIENPTkZJRzBIX0RNQV9PTl9OT1JYIENPTkZJRzBIX0RNQV9PRkZ8IE9CT0VfQ09ORklHMEhfRU5ETUFDCisjZGVmaW5lIENPTkZJRzBIX0RNQV9PTiBDT05GSUcwSF9ETUFfT05fTk9SWCB8IE9CT0VfQ09ORklHMEhfRU5SWAorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdG9zaG9ib2VfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9UT1NISUJBLCBQQ0lfREVWSUNFX0lEX0ZJUjcwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfVE9TSElCQSwgUENJX0RFVklDRV9JRF9GSVJEMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyB9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdG9zaG9ib2VfcGNpX3RibCk7CisKKyNkZWZpbmUgRFJJVkVSX05BTUUgInRvc2hvYm9lIgorc3RhdGljIGNoYXIgKmRyaXZlcl9uYW1lID0gRFJJVkVSX05BTUU7CisKK3N0YXRpYyBpbnQgbWF4X2JhdWQgPSA0MDAwMDAwOworI2lmZGVmIFVTRV9QUk9CRQorc3RhdGljIGludCBkb19wcm9iZSA9IDA7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK3Rvc2hvYm9lX2NoZWNrZmNzICh1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisgIGludCBpOworICB1bmlvbgorICB7CisgICAgX191MTYgdmFsdWU7CisgICAgX191OCBieXRlc1syXTsKKyAgfQorICBmY3M7CisKKyAgZmNzLnZhbHVlID0gSU5JVF9GQ1M7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgIGZjcy52YWx1ZSA9IGlyZGFfZmNzIChmY3MudmFsdWUsICooYnVmKyspKTsKKworICByZXR1cm4gKGZjcy52YWx1ZSA9PSBHT09EX0ZDUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEdlbmVyaWMgY2hpcCBoYW5kbGluZyBjb2RlICovCisjaWZkZWYgRFVNUF9QQUNLRVRTCitzdGF0aWMgdW5zaWduZWQgY2hhciBkdW1wWzUwXTsKK3N0YXRpYyB2b2lkCitfZHVtcGJ1ZnMgKHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4sIGNoYXIgdGV0ZSkKK3sKK2ludCBpLGo7CitjaGFyIGhlYWQ9dGV0ZTsKK2ZvciAoaT0wO2k8bGVuO2krPTE2KSB7CisgICAgZm9yIChqPTA7ajwxNiAmJiBpK2o8bGVuO2orKykgeyBzcHJpbnRmKCZkdW1wWzMqal0sIiUwMnguIixkYXRhW2kral0pOyB9CisgICAgZHVtcCBbMypqXT0wOworICAgIElSREFfREVCVUcgKDIsICIlYyVzXG4iLGhlYWQgLCBkdW1wKTsKKyAgICBoZWFkPScrJzsKKyAgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIFVTRV9QUk9CRQorLyogRHVtcCB0aGUgcmVnaXN0ZXJzICovCitzdGF0aWMgdm9pZAordG9zaG9ib2VfZHVtcHJlZ3MgKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZikKK3sKKyAgX191MzIgcmluZ2Jhc2U7CisKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgcmluZ2Jhc2UgPSBJTkIgKE9CT0VfUklOR19CQVNFMCkgPDwgMTA7CisgIHJpbmdiYXNlIHw9IElOQiAoT0JPRV9SSU5HX0JBU0UxKSA8PCAxODsKKyAgcmluZ2Jhc2UgfD0gSU5CIChPQk9FX1JJTkdfQkFTRTIpIDw8IDI2OworCisgIHByaW50ayAoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogUmVnaXN0ZXIgZHVtcDpcbiIpOworICBwcmludGsgKEtFUk5fRVJSICJJbnRlcnJ1cHRzOiBUeDolZCBSeDolZCBUeFVuZGVyOiVkIFJ4T3ZlcjolZCBTaXA6JWRcbiIsCisgICAgICAgICAgc2VsZi0+aW50X3R4LCBzZWxmLT5pbnRfcngsIHNlbGYtPmludF90eHVuZGVyLCBzZWxmLT5pbnRfcnhvdmVyLAorICAgICAgICAgIHNlbGYtPmludF9zaXApOworICBwcmludGsgKEtFUk5fRVJSICJSWCAlMDJ4IFRYICUwMnggUmluZ0Jhc2UgJTA4eFxuIiwKKyAgICAgICAgICBJTkIgKE9CT0VfUlhTTE9UKSwgSU5CIChPQk9FX1RYU0xPVCksIHJpbmdiYXNlKTsKKyAgcHJpbnRrIChLRVJOX0VSUiAiUklOR19TSVpFICUwMnggSUVSICUwMnggSVNSICUwMnhcbiIsCisgICAgICAgICAgSU5CIChPQk9FX1JJTkdfU0laRSksIElOQiAoT0JPRV9JRVIpLCBJTkIgKE9CT0VfSVNSKSk7CisgIHByaW50ayAoS0VSTl9FUlIgIkNPTkZJRzEgJTAyeCBTVEFUVVMgJTAyeFxuIiwKKyAgICAgICAgICBJTkIgKE9CT0VfQ09ORklHMSksIElOQiAoT0JPRV9TVEFUVVMpKTsKKyAgcHJpbnRrIChLRVJOX0VSUiAiQ09ORklHMCAlMDJ4JTAyeCBFTkFCTEUgJTAyeCUwMnhcbiIsCisgICAgICAgICAgSU5CIChPQk9FX0NPTkZJRzBIKSwgSU5CIChPQk9FX0NPTkZJRzBMKSwKKyAgICAgICAgICBJTkIgKE9CT0VfRU5BQkxFSCksIElOQiAoT0JPRV9FTkFCTEVMKSk7CisgIHByaW50ayAoS0VSTl9FUlIgIk5FV19QQ09ORklHICUwMnglMDJ4IENVUlJfUENPTkZJRyAlMDJ4JTAyeFxuIiwKKyAgICAgICAgICBJTkIgKE9CT0VfTkVXX1BDT05GSUdIKSwgSU5CIChPQk9FX05FV19QQ09ORklHTCksCisgICAgICAgICAgSU5CIChPQk9FX0NVUlJfUENPTkZJR0gpLCBJTkIgKE9CT0VfQ1VSUl9QQ09ORklHTCkpOworICBwcmludGsgKEtFUk5fRVJSICJNQVhMRU4gJTAyeCUwMnggUlhDT1VOVCAlMDJ4JTAyeFxuIiwKKyAgICAgICAgICBJTkIgKE9CT0VfTUFYTEVOSCksIElOQiAoT0JPRV9NQVhMRU5MKSwKKyAgICAgICAgICBJTkIgKE9CT0VfUlhDT1VOVEwpLCBJTkIgKE9CT0VfUlhDT1VOVEgpKTsKKworICBpZiAoc2VsZi0+cmluZykKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIHJpbmdiYXNlID0gdmlydF90b19idXMgKHNlbGYtPnJpbmcpOworICAgICAgcHJpbnRrIChLRVJOX0VSUiAiUmluZyBhdCAlMDh4OlxuIiwgcmluZ2Jhc2UpOworICAgICAgcHJpbnRrIChLRVJOX0VSUiAiUlg6Iik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgUlhfU0xPVFM7ICsraSkKKyAgICAgICAgcHJpbnRrICgiICglZCwlMDJ4KSIsc2VsZi0+cmluZy0+cnhbaV0ubGVuLHNlbGYtPnJpbmctPnJ4W2ldLmNvbnRyb2wpOworICAgICAgcHJpbnRrICgiXG4iKTsKKyAgICAgIHByaW50ayAoS0VSTl9FUlIgIlRYOiIpOworICAgICAgZm9yIChpID0gMDsgaSA8IFJYX1NMT1RTOyArK2kpCisgICAgICAgIHByaW50ayAoIiAoJWQsJTAyeCkiLHNlbGYtPnJpbmctPnR4W2ldLmxlbixzZWxmLT5yaW5nLT50eFtpXS5jb250cm9sKTsKKyAgICAgIHByaW50ayAoIlxuIik7CisgICAgfQorfQorI2VuZGlmCisKKy8qRG9uJ3QgbGV0IHRoZSBjaGlwIGxvb2sgYXQgbWVtb3J5ICovCitzdGF0aWMgdm9pZAordG9zaG9ib2VfZGlzYWJsZWJtIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIF9fdTggY29tbWFuZDsKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgcGNpX3JlYWRfY29uZmlnX2J5dGUgKHNlbGYtPnBkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7CisgIGNvbW1hbmQgJj0gflBDSV9DT01NQU5EX01BU1RFUjsKKyAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlIChzZWxmLT5wZGV2LCBQQ0lfQ09NTUFORCwgY29tbWFuZCk7CisKK30KKworLyogU2h1dGRvd24gdGhlIGNoaXAgYW5kIHBvaW50IHRoZSB0YXNrZmlsZSByZWcgc29tZXdoZXJlIGVsc2UgKi8KK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9zdG9wY2hpcCAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmKQoreworICBJUkRBX0RFQlVHICg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworICAvKkRpc2FibGUgaW50ZXJydXB0cyAqLworICBPVVRCICgweDAsIE9CT0VfSUVSKTsKKyAgLypEaXNhYmxlIERNQSwgRGlzYWJsZSBSeCwgRGlzYWJsZSBUeCAqLworICBPVVRCIChDT05GSUcwSF9ETUFfT0ZGLCBPQk9FX0NPTkZJRzBIKTsKKyAgLypEaXNhYmxlIFNJUiBNSVIgRklSLCBUeCBhbmQgUnggKi8KKyAgT1VUQiAoMHgwMCwgT0JPRV9FTkFCTEVIKTsKKyAgLypQb2ludCB0aGUgcmluZyBzb21ld2hlcmUgc2FmZSAqLworICBPVVRCICgweDNmLCBPQk9FX1JJTkdfQkFTRTIpOworICBPVVRCICgweGZmLCBPQk9FX1JJTkdfQkFTRTEpOworICBPVVRCICgweGZmLCBPQk9FX1JJTkdfQkFTRTApOworCisgIE9VVEIgKFJYX0xFTiA+PiA4LCBPQk9FX01BWExFTkgpOworICBPVVRCIChSWF9MRU4gJiAweGZmLCBPQk9FX01BWExFTkwpOworCisgIC8qQWNrbm9sZWRnZSBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzICovCisgIE9VVEIgKDB4ZmYsIE9CT0VfSVNSKTsKKworICAvKldoeSAqLworICBPVVRCIChPQk9FX0VOQUJMRUhfUEhZQU5EQ0xPQ0ssIE9CT0VfRU5BQkxFSCk7CisKKyAgLypzd2l0Y2ggaXQgb2ZmICovCisgIE9VVEIgKE9CT0VfQ09ORklHMV9PRkYsIE9CT0VfQ09ORklHMSk7CisKKyAgdG9zaG9ib2VfZGlzYWJsZWJtIChzZWxmKTsKK30KKworLyogVHJhbnNtaXR0ZXIgaW5pdGlhbGl6YXRpb24gKi8KK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9zdGFydF9ETUEgKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZiwgaW50IG9wdHMpCit7CisgIE9VVEIgKDB4MCwgT0JPRV9FTkFCTEVIKTsKKyAgT1VUQiAoQ09ORklHMEhfRE1BX09OIHwgb3B0cywgIE9CT0VfQ09ORklHMEgpOworICBPVVRCIChPQk9FX0VOQUJMRUhfUEhZQU5EQ0xPQ0ssIE9CT0VfRU5BQkxFSCk7CisgIFBST01QVDsKK30KKworLypTZXQgdGhlIGJhdWQgcmF0ZSAqLworc3RhdGljIHZvaWQKK3Rvc2hvYm9lX3NldGJhdWQgKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZikKK3sKKyAgX191MTYgcGNvbmZpZyA9IDA7CisgIF9fdTggY29uZmlnMGwgPSAwOworCisgIElSREFfREVCVUcgKDIsICIlcyglZC8lZClcbiIsIF9fRlVOQ1RJT05fXywgc2VsZi0+c3BlZWQsIHNlbGYtPmlvLnNwZWVkKTsKKworICBzd2l0Y2ggKHNlbGYtPnNwZWVkKQorICAgIHsKKyAgICBjYXNlIDI0MDA6CisgICAgY2FzZSA0ODAwOgorICAgIGNhc2UgOTYwMDoKKyAgICBjYXNlIDE5MjAwOgorICAgIGNhc2UgMzg0MDA6CisgICAgY2FzZSA1NzYwMDoKKyAgICBjYXNlIDExNTIwMDoKKyNpZmRlZiBVU0VfTUlSCisgICAgY2FzZSAxMTUyMDAwOgorI2VuZGlmCisgICAgY2FzZSA0MDAwMDAwOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKworICAgICAgcHJpbnRrIChLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBzd2l0Y2ggdG8gdW5zdXBwb3J0ZWQgYmF1ZHJhdGUgJWRcbiIsCisgICAgICAgICAgICAgIHNlbGYtPnNwZWVkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc3dpdGNoIChzZWxmLT5zcGVlZCkKKyAgICB7CisgICAgICAvKiBGb3IgU0lSIHRoZSBwcmVhbWJsZSBpcyBkb25lIGJ5IGFkZGluZyBYQk9GcyAqLworICAgICAgLyogdG8gdGhlIHBhY2tldCAqLworICAgICAgLyogc2V0IHRvIGZpbHRlcmVkIFNJUiBtb2RlLCBmaWx0ZXIgbG9va3MgZm9yIEJPRiBhbmQgRU9GICovCisgICAgY2FzZSAyNDAwOgorICAgICAgcGNvbmZpZyB8PSA0NyA8PCBPQk9FX1BDT05GSUdfQkFVRFNISUZUOworICAgICAgcGNvbmZpZyB8PSAyNSA8PCBPQk9FX1BDT05GSUdfV0lEVEhTSElGVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDgwMDoKKyAgICAgIHBjb25maWcgfD0gMjMgPDwgT0JPRV9QQ09ORklHX0JBVURTSElGVDsKKyAgICAgIHBjb25maWcgfD0gMjUgPDwgT0JPRV9QQ09ORklHX1dJRFRIU0hJRlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDk2MDA6CisgICAgICBwY29uZmlnIHw9IDExIDw8IE9CT0VfUENPTkZJR19CQVVEU0hJRlQ7CisgICAgICBwY29uZmlnIHw9IDI1IDw8IE9CT0VfUENPTkZJR19XSURUSFNISUZUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOTIwMDoKKyAgICAgIHBjb25maWcgfD0gNSA8PCBPQk9FX1BDT05GSUdfQkFVRFNISUZUOworICAgICAgcGNvbmZpZyB8PSAyNSA8PCBPQk9FX1BDT05GSUdfV0lEVEhTSElGVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzg0MDA6CisgICAgICBwY29uZmlnIHw9IDIgPDwgT0JPRV9QQ09ORklHX0JBVURTSElGVDsKKyAgICAgIHBjb25maWcgfD0gMjUgPDwgT0JPRV9QQ09ORklHX1dJRFRIU0hJRlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU3NjAwOgorICAgICAgcGNvbmZpZyB8PSAxIDw8IE9CT0VfUENPTkZJR19CQVVEU0hJRlQ7CisgICAgICBwY29uZmlnIHw9IDI1IDw8IE9CT0VfUENPTkZJR19XSURUSFNISUZUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTUyMDA6CisgICAgICBwY29uZmlnIHw9IDAgPDwgT0JPRV9QQ09ORklHX0JBVURTSElGVDsKKyAgICAgIHBjb25maWcgfD0gMjUgPDwgT0JPRV9QQ09ORklHX1dJRFRIU0hJRlQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLypTZXQgdG8gcGFja2V0IGJhc2VkIHJlY2VwdGlvbiAqLworICAgICAgT1VUQiAoUlhfTEVOID4+IDgsIE9CT0VfTUFYTEVOSCk7CisgICAgICBPVVRCIChSWF9MRU4gJiAweGZmLCBPQk9FX01BWExFTkwpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHN3aXRjaCAoc2VsZi0+c3BlZWQpCisgICAgeworICAgIGNhc2UgMjQwMDoKKyAgICBjYXNlIDQ4MDA6CisgICAgY2FzZSA5NjAwOgorICAgIGNhc2UgMTkyMDA6CisgICAgY2FzZSAzODQwMDoKKyAgICBjYXNlIDU3NjAwOgorICAgIGNhc2UgMTE1MjAwOgorICAgICAgY29uZmlnMGwgPSBPQk9FX0NPTkZJRzBMX0VOU0lSOworICAgICAgaWYgKHNlbGYtPmFzeW5jKQorICAgICAgICB7CisgICAgICAgICAgLypTZXQgdG8gY2hhcmFjdGVyIGJhc2VkIHJlY2VwdGlvbiAqLworICAgICAgICAgIC8qU3lzdGVtIHdpbGwgbG9jayBpZiBNQVhMRU49MCAqLworICAgICAgICAgIC8qc28gaGF2ZSB0byBiZSBjYXJlZnVsICovCisgICAgICAgICAgT1VUQiAoMHgwMSwgT0JPRV9NQVhMRU5IKTsKKyAgICAgICAgICBPVVRCICgweDAxLCBPQk9FX01BWExFTkwpOworICAgICAgICAgIE9VVEIgKDB4MDAsIE9CT0VfTUFYTEVOSCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qU2V0IHRvIHBhY2tldCBiYXNlZCByZWNlcHRpb24gKi8KKyAgICAgICAgICBjb25maWcwbCB8PSBPQk9FX0NPTkZJRzBMX0VOU0lSRjsKKyAgICAgICAgICBPVVRCIChSWF9MRU4gPj4gOCwgT0JPRV9NQVhMRU5IKTsKKyAgICAgICAgICBPVVRCIChSWF9MRU4gJiAweGZmLCBPQk9FX01BWExFTkwpOworICAgICAgICB9CisgICAgICBicmVhazsKKworI2lmZGVmIFVTRV9NSVIKKyAgICAgIC8qIE1JUiBtb2RlICovCisgICAgICAvKiBTZXQgZm9yIDE2IGJpdCBDUkMgYW5kIGVuYWJsZSBNSVIgKi8KKyAgICAgIC8qIFByZWFtYmxlIG5vdyBoYW5kbGVkIGJ5IHRoZSBjaGlwICovCisgICAgY2FzZSAxMTUyMDAwOgorICAgICAgcGNvbmZpZyB8PSAwIDw8IE9CT0VfUENPTkZJR19CQVVEU0hJRlQ7CisgICAgICBwY29uZmlnIHw9IDggPDwgT0JPRV9QQ09ORklHX1dJRFRIU0hJRlQ7CisgICAgICBwY29uZmlnIHw9IDEgPDwgT0JPRV9QQ09ORklHX1BSRUFNQkxFU0hJRlQ7CisgICAgICBjb25maWcwbCA9IE9CT0VfQ09ORklHMExfQ1JDMTYgfCBPQk9FX0NPTkZJRzBMX0VOTUlSOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgIC8qIEZJUiBtb2RlICovCisgICAgICAvKiBTZXQgZm9yIDMyIGJpdCBDUkMgYW5kIGVuYWJsZSBGSVIgKi8KKyAgICAgIC8qIFByZWFtYmxlIGhhbmRsZWQgYnkgdGhlIGNoaXAgKi8KKyAgICBjYXNlIDQwMDAwMDA6CisgICAgICBwY29uZmlnIHw9IDAgPDwgT0JPRV9QQ09ORklHX0JBVURTSElGVDsKKyAgICAgIC8qIERvY3VtZW50YXRpb24gc2F5cyAxNCwgYnV0IHRvc2hpYmEgdXNlIDE1IGluIHRoZWlyIGRyaXZlcnMgKi8KKyAgICAgIHBjb25maWcgfD0gMTUgPDwgT0JPRV9QQ09ORklHX1BSRUFNQkxFU0hJRlQ7CisgICAgICBjb25maWcwbCA9IE9CT0VfQ09ORklHMExfRU5GSVI7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogQ29weSBpbnRvIG5ldyBQSFkgY29uZmlnIGJ1ZmZlciAqLworICBPVVRCUCAocGNvbmZpZyA+PiA4LCBPQk9FX05FV19QQ09ORklHSCk7CisgIE9VVEIgKHBjb25maWcgJiAweGZmLCBPQk9FX05FV19QQ09ORklHTCk7CisgIE9VVEIgKGNvbmZpZzBsLCBPQk9FX0NPTkZJRzBMKTsKKworICAvKiBOb3cgbWFrZSBPQk9FIGNvcHkgZnJvbSBuZXcgUEhZIHRvIGN1cnJlbnQgUEhZICovCisgIE9VVEIgKDB4MCwgT0JPRV9FTkFCTEVIKTsKKyAgT1VUQiAoT0JPRV9FTkFCTEVIX1BIWUFORENMT0NLLCBPQk9FX0VOQUJMRUgpOworICBQUk9NUFQ7CisKKyAgLyogc3BlZWQgY2hhbmdlIGV4ZWN1dGVkICovCisgIHNlbGYtPm5ld19zcGVlZCA9IDA7CisgIHNlbGYtPmlvLnNwZWVkID0gc2VsZi0+c3BlZWQ7Cit9CisKKy8qTGV0IHRoZSBjaGlwIGxvb2sgYXQgbWVtb3J5ICovCitzdGF0aWMgdm9pZAordG9zaG9ib2VfZW5hYmxlYm0gKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZikKK3sKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisgIHBjaV9zZXRfbWFzdGVyIChzZWxmLT5wZGV2KTsKK30KKworLypzZXR1cCB0aGUgcmluZyAqLworc3RhdGljIHZvaWQKK3Rvc2hvYm9lX2luaXRyaW5nIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIGludCBpOworCisgIElSREFfREVCVUcgKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisgIGZvciAoaSA9IDA7IGkgPCBUWF9TTE9UUzsgKytpKQorICAgIHsKKyAgICAgIHNlbGYtPnJpbmctPnR4W2ldLmxlbiA9IDA7CisgICAgICBzZWxmLT5yaW5nLT50eFtpXS5jb250cm9sID0gMHgwMDsKKyAgICAgIHNlbGYtPnJpbmctPnR4W2ldLmFkZHJlc3MgPSB2aXJ0X3RvX2J1cyAoc2VsZi0+dHhfYnVmc1tpXSk7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBSWF9TTE9UUzsgKytpKQorICAgIHsKKyAgICAgIHNlbGYtPnJpbmctPnJ4W2ldLmxlbiA9IFJYX0xFTjsKKyAgICAgIHNlbGYtPnJpbmctPnJ4W2ldLmxlbiA9IDA7CisgICAgICBzZWxmLT5yaW5nLT5yeFtpXS5hZGRyZXNzID0gdmlydF90b19idXMgKHNlbGYtPnJ4X2J1ZnNbaV0pOworICAgICAgc2VsZi0+cmluZy0+cnhbaV0uY29udHJvbCA9IE9CT0VfQ1RMX1JYX0hXX09XTlM7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordG9zaG9ib2VfcmVzZXRwdHJzIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIC8qIENhbiByZXNldCBwb2ludGVycyBieSB0d2lkbGluZyBETUEgKi8KKyAgT1VUQiAoMHgwLCBPQk9FX0VOQUJMRUgpOworICBPVVRCUCAoQ09ORklHMEhfRE1BX09GRiwgT0JPRV9DT05GSUcwSCk7CisgIE9VVEIgKE9CT0VfRU5BQkxFSF9QSFlBTkRDTE9DSywgT0JPRV9FTkFCTEVIKTsKKworICBzZWxmLT5yeHMgPSBpbmJfcCAoT0JPRV9SWFNMT1QpICYgT0JPRV9TTE9UX01BU0s7CisgIHNlbGYtPnR4cyA9IGluYl9wIChPQk9FX1RYU0xPVCkgJiBPQk9FX1NMT1RfTUFTSzsKK30KKworLyogQ2FsbGVkIGluIGxvY2tlZCBzdGF0ZSAqLworc3RhdGljIHZvaWQKK3Rvc2hvYm9lX2luaXRwdHJzIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisKKyAgLyogc3Bpbl9sb2NrX2lycXNhdmUoc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsgKi8KKyAgLyogc2F2ZV9mbGFncyAoZmxhZ3MpOyAqLworCisgIC8qIENhbiByZXNldCBwb2ludGVycyBieSB0d2lkbGluZyBETUEgKi8KKyAgdG9zaG9ib2VfcmVzZXRwdHJzIChzZWxmKTsKKworICBPVVRCICgweDAsIE9CT0VfRU5BQkxFSCk7CisgIE9VVEIgKENPTkZJRzBIX0RNQV9PTiwgT0JPRV9DT05GSUcwSCk7CisgIE9VVEIgKE9CT0VfRU5BQkxFSF9QSFlBTkRDTE9DSywgT0JPRV9FTkFCTEVIKTsKKworICBzZWxmLT50eHBlbmRpbmcgPSAwOworCisgIC8qIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsgKi8KKyAgLyogcmVzdG9yZV9mbGFncyAoZmxhZ3MpOyAqLworfQorCisvKiBXYWtlIHRoZSBjaGlwIHVwIGFuZCBnZXQgaXQgbG9va2luZyBhdCB0aGUgcmluZ3MgKi8KKy8qIENhbGxlZCBpbiBsb2NrZWQgc3RhdGUgKi8KK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9zdGFydGNoaXAgKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZikKK3sKKyAgX191MzIgcGh5c2FkZHI7CisKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgdG9zaG9ib2VfaW5pdHJpbmcgKHNlbGYpOworICB0b3Nob2JvZV9lbmFibGVibSAoc2VsZik7CisgIE9VVEJQIChPQk9FX0NPTkZJRzFfUkVTRVQsIE9CT0VfQ09ORklHMSk7CisgIE9VVEJQIChPQk9FX0NPTkZJRzFfT04sIE9CT0VfQ09ORklHMSk7CisKKyAgLyogU3RvcCB0aGUgY2xvY2tzICovCisgIE9VVEIgKDAsIE9CT0VfRU5BQkxFSCk7CisKKyAgLypTZXQgc2l6ZSBvZiByaW5ncyAqLworICBPVVRCIChSSU5HX1NJWkUsIE9CT0VfUklOR19TSVpFKTsKKworICAvKkFja25vbGVkZ2UgYW55IHBlbmRpbmcgaW50ZXJydXB0cyAqLworICBPVVRCICgweGZmLCBPQk9FX0lTUik7CisKKyAgLypFbmFibGUgaW50cyAqLworICBPVVRCIChPQk9FX0lOVF9UWERPTkUgIHwgT0JPRV9JTlRfUlhET05FIHwKKyAgICAgICAgT0JPRV9JTlRfVFhVTkRFUiB8IE9CT0VfSU5UX1JYT1ZFUiB8IE9CT0VfSU5UX1NJUCAsIE9CT0VfSUVSKTsKKworICAvKkFja25vbGVkZ2UgYW55IHBlbmRpbmcgaW50ZXJydXB0cyAqLworICBPVVRCICgweGZmLCBPQk9FX0lTUik7CisKKyAgLypTZXQgdGhlIG1heGltdW0gcGFja2V0IGxlbmd0aCB0byAweGZmZiAoNDA5NSkgKi8KKyAgT1VUQiAoUlhfTEVOID4+IDgsIE9CT0VfTUFYTEVOSCk7CisgIE9VVEIgKFJYX0xFTiAmIDB4ZmYsIE9CT0VfTUFYTEVOTCk7CisKKyAgLypTaHV0ZG93biBETUEgKi8KKyAgT1VUQiAoQ09ORklHMEhfRE1BX09GRiwgT0JPRV9DT05GSUcwSCk7CisKKyAgLypGaW5kIG91dCB3aGVyZSB0aGUgcmluZ3MgbGl2ZSAqLworICBwaHlzYWRkciA9IHZpcnRfdG9fYnVzIChzZWxmLT5yaW5nKTsKKworICBJUkRBX0FTU0VSVCAoKHBoeXNhZGRyICYgMHgzZmYpID09IDAsCisJICAgICAgIHByaW50ayAoS0VSTl9FUlIgRFJJVkVSX05BTUUgInJpbmcgbm90IGNvcnJlY3RseSBhbGlnbmVkXG4iKTsKKwkgICAgICAgcmV0dXJuOyk7CisKKyAgT1VUQiAoKHBoeXNhZGRyID4+IDEwKSAmIDB4ZmYsIE9CT0VfUklOR19CQVNFMCk7CisgIE9VVEIgKChwaHlzYWRkciA+PiAxOCkgJiAweGZmLCBPQk9FX1JJTkdfQkFTRTEpOworICBPVVRCICgocGh5c2FkZHIgPj4gMjYpICYgMHgzZiwgT0JPRV9SSU5HX0JBU0UyKTsKKworICAvKkVuYWJsZSBETUEgY29udHJvbGVyIGluIGJ5dGUgbW9kZSBhbmQgUlggKi8KKyAgT1VUQiAoQ09ORklHMEhfRE1BX09OLCBPQk9FX0NPTkZJRzBIKTsKKworICAvKiBTdGFydCB1cCB0aGUgY2xvY2tzICovCisgIE9VVEIgKE9CT0VfRU5BQkxFSF9QSFlBTkRDTE9DSywgT0JPRV9FTkFCTEVIKTsKKworICAvKnNldCB0byBzZW5zaWJsZSBzcGVlZCAqLworICBzZWxmLT5zcGVlZCA9IDk2MDA7CisgIHRvc2hvYm9lX3NldGJhdWQgKHNlbGYpOworICB0b3Nob2JvZV9pbml0cHRycyAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9pc250c3R1Y2sgKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZikKK3sKK30KKworc3RhdGljIHZvaWQKK3Rvc2hvYm9lX2NoZWNrc3R1Y2sgKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZikKK3sKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICBpZiAoMCkKKyAgICB7CisgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAgICAgLyogVGhpcyB3aWxsIHJlc2V0IHRoZSBjaGlwIGNvbXBsZXRlbHkgKi8KKyAgICAgIHByaW50ayAoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogUmVzZXR0aW5nIGNoaXBcbiIpOworCisgICAgICB0b3Nob2JvZV9zdG9wY2hpcCAoc2VsZik7CisgICAgICB0b3Nob2JvZV9zdGFydGNoaXAgKHNlbGYpOworICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgICB9Cit9CisKKy8qR2VuZXJhdGUgcGFja2V0IG9mIGFib3V0IG10dCB1cyBsb25nICovCitzdGF0aWMgaW50Cit0b3Nob2JvZV9tYWtlbXR0cGFja2V0IChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYsIHZvaWQgKmJ1ZiwgaW50IG10dCkKK3sKKyAgaW50IHhib2ZzOworCisgIHhib2ZzID0gKChpbnQpIChtdHQvMTAwKSkgKiAoaW50KSAoc2VsZi0+c3BlZWQpOworICB4Ym9mcz14Ym9mcy84MDAwMDsgLypFaWdodCBiaXRzIHBlciBieXRlLCBhbmQgbXR0IGlzIGluIHVzKi8KKyAgeGJvZnMrKzsKKworICBJUkRBX0RFQlVHICgyLCBEUklWRVJfTkFNRQorICAgICAgIjogZ2VuZXJhdGVkIG10dCBvZiAlZCBieXRlcyBmb3IgJWQgdXMgYXQgJWQgYmF1ZFxuIgorCSAgLCB4Ym9mcyxtdHQsc2VsZi0+c3BlZWQpOworCisgIGlmICh4Ym9mcyA+IFRYX0xFTikKKyAgICB7CisgICAgICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IHdhbnRlZCAlZCBieXRlcyBNVFQgYnV0IFRYX0xFTiBpcyAlZFxuIiwKKyAgICAgICAgICAgICAgeGJvZnMsIFRYX0xFTik7CisgICAgICB4Ym9mcyA9IFRYX0xFTjsKKyAgICB9CisKKyAgLyp4Ym9mcyB3aWxsIGRvIGZvciBTSVIsIE1JUiBhbmQgRklSLFNJUiBtb2RlIGRvZXNuJ3QgZ2VuZXJhdGUgYSBjaGVja3N1bSBhbnl3YXkgKi8KKyAgbWVtc2V0IChidWYsIFhCT0YsIHhib2ZzKTsKKworICByZXR1cm4geGJvZnM7Cit9CisKK3N0YXRpYyBpbnQgdG9zaG9ib2VfaW52YWxpZF9kZXYoaW50IGlycSkKK3sKKyAgcHJpbnRrIChLRVJOX1dBUk5JTkcgRFJJVkVSX05BTUUgIjogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisgIHJldHVybiAxOworfQorCisjaWZkZWYgVVNFX1BST0JFCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQcm9iZSBjb2RlICovCisKK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9kdW1wdHggKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZikKK3sKKyAgaW50IGk7CisgIFBST0JFX0RFQlVHKEtFUk5fV0FSTklORyAiVFg6Iik7CisgIGZvciAoaSA9IDA7IGkgPCBSWF9TTE9UUzsgKytpKQorICAgIFBST0JFX0RFQlVHKCIgKCVkLCUwMngpIixzZWxmLT5yaW5nLT50eFtpXS5sZW4sc2VsZi0+cmluZy0+dHhbaV0uY29udHJvbCk7CisgIFBST0JFX0RFQlVHKCIgWyVkXVxuIixzZWxmLT5zcGVlZCk7Cit9CisKK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9kdW1wcnggKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZiwgaW50IHNjb3JlKQoreworICBpbnQgaTsKKyAgUFJPQkVfREVCVUcoIiAlZFxuUlg6IixzY29yZSk7CisgIGZvciAoaSA9IDA7IGkgPCBSWF9TTE9UUzsgKytpKQorICAgIFBST0JFX0RFQlVHKCIgKCVkLCUwMngpIixzZWxmLT5yaW5nLT5yeFtpXS5sZW4sc2VsZi0+cmluZy0+cnhbaV0uY29udHJvbCk7CisgIFBST0JFX0RFQlVHKCJcbiIpOworfQorCitzdGF0aWMgaW5saW5lIGludAorc3R1ZmZfYnl0ZSAoX191OCBieXRlLCBfX3U4ICogYnVmKQoreworICBzd2l0Y2ggKGJ5dGUpCisgICAgeworICAgIGNhc2UgQk9GOiAgICAgICAgICAgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSBFT0Y6ICAgICAgICAgICAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICBjYXNlIENFOgorICAgICAgLyogSW5zZXJ0IHRyYW5zcGFyZW50bHkgY29kZWQgKi8KKyAgICAgIGJ1ZlswXSA9IENFOyAgICAgICAgICAgICAgLyogU2VuZCBsaW5rIGVzY2FwZSAqLworICAgICAgYnVmWzFdID0gYnl0ZSBeIElSREFfVFJBTlM7IC8qIENvbXBsZW1lbnQgYml0IDUgKi8KKyAgICAgIHJldHVybiAyOworICAgICAgLyogYnJlYWs7ICovCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIE5vbi1zcGVjaWFsIHZhbHVlLCBubyB0cmFuc3BhcmVuY3kgcmVxdWlyZWQgKi8KKyAgICAgIGJ1ZlswXSA9IGJ5dGU7CisgICAgICByZXR1cm4gMTsKKyAgICAgIC8qIGJyZWFrOyAqLworICAgIH0KK30KKworc3RhdGljIGlycXJldHVybl90Cit0b3Nob2JvZV9wcm9iZWludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmID0gKHN0cnVjdCB0b3Nob2JvZV9jYiAqKSBkZXZfaWQ7CisgIF9fdTggaXJxc3RhdDsKKworICBpZiAoc2VsZiA9PSBOVUxMICYmIHRvc2hvYm9lX2ludmFsaWRfZGV2KGlycSkpCisgICAgcmV0dXJuIElSUV9OT05FOworCisgIGlycXN0YXQgPSBJTkIgKE9CT0VfSVNSKTsKKworLyogd2FzIGl0IHVzICovCisgIGlmICghKGlycXN0YXQgJiBPQk9FX0lOVF9NQVNLKSkKKyAgICByZXR1cm4gSVJRX05PTkU7CisKKy8qIEFjayBhbGwgdGhlIGludGVycnVwdHMgKi8KKyAgT1VUQiAoaXJxc3RhdCwgT0JPRV9JU1IpOworCisgIGlmIChpcnFzdGF0ICYgT0JPRV9JTlRfVFhET05FKQorICAgIHsKKyAgICAgIGludCB0eHA7CisKKyAgICAgIHNlbGYtPmludF90eCsrOworICAgICAgUFJPQkVfREVCVUcoIlQiKTsKKworICAgICAgdHhwID0gSU5CIChPQk9FX1RYU0xPVCkgJiBPQk9FX1NMT1RfTUFTSzsKKyAgICAgIGlmIChzZWxmLT5yaW5nLT50eFt0eHBdLmNvbnRyb2wgJiBPQk9FX0NUTF9UWF9IV19PV05TKQorICAgICAgICB7CisgICAgICAgICAgc2VsZi0+aW50X3R4Kz0xMDA7CisgICAgICAgICAgUFJPQkVfREVCVUcoIlMiKTsKKyAgICAgICAgICB0b3Nob2JvZV9zdGFydF9ETUEoc2VsZiwgT0JPRV9DT05GSUcwSF9FTlRYIHwgT0JPRV9DT05GSUcwSF9MT09QKTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAoaXJxc3RhdCAmIE9CT0VfSU5UX1JYRE9ORSkgeworICAgIHNlbGYtPmludF9yeCsrOworICAgIFBST0JFX0RFQlVHKCJSIik7IH0KKyAgaWYgKGlycXN0YXQgJiBPQk9FX0lOVF9UWFVOREVSKSB7CisgICAgc2VsZi0+aW50X3R4dW5kZXIrKzsKKyAgICBQUk9CRV9ERUJVRygiVSIpOyB9CisgIGlmIChpcnFzdGF0ICYgT0JPRV9JTlRfUlhPVkVSKSB7CisgICAgc2VsZi0+aW50X3J4b3ZlcisrOworICAgIFBST0JFX0RFQlVHKCJPIik7IH0KKyAgaWYgKGlycXN0YXQgJiBPQk9FX0lOVF9TSVApIHsKKyAgICBzZWxmLT5pbnRfc2lwKys7CisgICAgUFJPQkVfREVCVUcoIkkiKTsgfQorICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQKK3Rvc2hvYm9lX21ha2V0ZXN0cGFja2V0ICh1bnNpZ25lZCBjaGFyICpidWYsIGludCBiYWRjcmMsIGludCBmaXIpCit7CisgIGludCBpOworICBpbnQgbGVuID0gMDsKKyAgdW5pb24KKyAgeworICAgIF9fdTE2IHZhbHVlOworICAgIF9fdTggYnl0ZXNbMl07CisgIH0KKyAgZmNzOworCisgIGlmIChmaXIpCisgICAgeworICAgICAgbWVtc2V0IChidWYsIDAsIFRUX0xFTik7CisgICAgICByZXR1cm4gKFRUX0xFTik7CisgICAgfQorCisgIGZjcy52YWx1ZSA9IElOSVRfRkNTOworCisgIG1lbXNldCAoYnVmLCBYQk9GLCAxMCk7CisgIGxlbiArPSAxMDsKKyAgYnVmW2xlbisrXSA9IEJPRjsKKworICBmb3IgKGkgPSAwOyBpIDwgVFRfTEVOOyArK2kpCisgICAgeworICAgICAgbGVuICs9IHN0dWZmX2J5dGUgKGksIGJ1ZiArIGxlbik7CisgICAgICBmY3MudmFsdWUgPSBpcmRhX2ZjcyAoZmNzLnZhbHVlLCBpKTsKKyAgICB9CisKKyAgbGVuICs9IHN0dWZmX2J5dGUgKGZjcy5ieXRlc1swXSBeIGJhZGNyYywgYnVmICsgbGVuKTsKKyAgbGVuICs9IHN0dWZmX2J5dGUgKGZjcy5ieXRlc1sxXSBeIGJhZGNyYywgYnVmICsgbGVuKTsKKyAgYnVmW2xlbisrXSA9IEVPRjsKKyAgbGVuKys7CisgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQKK3Rvc2hvYm9lX3Byb2JlZmFpbCAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmLCBjaGFyICptc2cpCit7CisgIHByaW50ayAoS0VSTl9FUlIgRFJJVkVSX05BTUUgInByb2JlKCVkKSBmYWlsZWQgJXNcbiIsc2VsZi0+IHNwZWVkLCBtc2cpOworICB0b3Nob2JvZV9kdW1wcmVncyAoc2VsZik7CisgIHRvc2hvYm9lX3N0b3BjaGlwIChzZWxmKTsKKyAgZnJlZV9pcnEgKHNlbGYtPmlvLmlycSwgKHZvaWQgKikgc2VsZik7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0b3Nob2JvZV9udW12YWxpZHJjdnMgKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZikKK3sKKyAgaW50IGksIHJldCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBSWF9TTE9UUzsgKytpKQorICAgIGlmICgoc2VsZi0+cmluZy0+cnhbaV0uY29udHJvbCAmIDB4ZTApID09IDApCisgICAgICByZXQrKzsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Cit0b3Nob2JvZV9udW1yY3ZzIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIGludCBpLCByZXQgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgUlhfU0xPVFM7ICsraSkKKyAgICBpZiAoIShzZWxmLT5yaW5nLT5yeFtpXS5jb250cm9sICYgT0JPRV9DVExfUlhfSFdfT1dOUykpCisgICAgICByZXQrKzsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Cit0b3Nob2JvZV9wcm9iZSAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmKQoreworICBpbnQgaSwgaiwgbjsKKyNpZmRlZiBVU0VfTUlSCisgIGludCBiYXVkc1tdID0geyA5NjAwLCAxMTUyMDAsIDQwMDAwMDAsIDExNTIwMDAgfTsKKyNlbHNlCisgIGludCBiYXVkc1tdID0geyA5NjAwLCAxMTUyMDAsIDQwMDAwMDAgfTsKKyNlbmRpZgorICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgIElSREFfREVCVUcgKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisgIGlmIChyZXF1ZXN0X2lycSAoc2VsZi0+aW8uaXJxLCB0b3Nob2JvZV9wcm9iZWludGVycnVwdCwKKyAgICAgICAgICAgICAgICAgICBzZWxmLT5pby5pcnFmbGFncywgInRvc2hvYm9lIiwgKHZvaWQgKikgc2VsZikpCisgICAgeworICAgICAgcHJpbnRrIChLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBwcm9iZSBmYWlsZWQgdG8gYWxsb2NhdGUgaXJxICVkXG4iLAorICAgICAgICAgICAgICBzZWxmLT5pby5pcnEpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIHRlc3QgMTogU0lSIGZpbHRlciBhbmQgYmFjayB0byBiYWNrICovCisKKyAgZm9yIChqID0gMDsgaiA8IChzaXplb2YgKGJhdWRzKSAvIHNpemVvZiAoaW50KSk7ICsraikKKyAgICB7CisgICAgICBpbnQgZmlyID0gKGogPiAxKTsKKyAgICAgIHRvc2hvYm9lX3N0b3BjaGlwIChzZWxmKTsKKworCisgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgICAgIC8qQWRkcmVzcyBpcyBhbHJlYWR5IHNldHVwICovCisgICAgICB0b3Nob2JvZV9zdGFydGNoaXAgKHNlbGYpOworICAgICAgc2VsZi0+aW50X3J4ID0gc2VsZi0+aW50X3R4ID0gMDsKKyAgICAgIHNlbGYtPnNwZWVkID0gYmF1ZHNbal07CisgICAgICB0b3Nob2JvZV9zZXRiYXVkIChzZWxmKTsKKyAgICAgIHRvc2hvYm9lX2luaXRwdHJzIChzZWxmKTsKKyAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgICAgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10uY29udHJvbCA9CisvKiAgIChGSVIgb25seSkgT0JPRV9DVExfVFhfU0lQIG5lZWRlZCBmb3Igc3dpdGNoaW5nIHRvIG5leHQgc2xvdCAqLworLyogICAgTUlSOiBhbGwgcmVjZWl2ZWQgZGF0YSBpcyBzdG9yZWQgaW4gb25lIHNsb3QgKi8KKyAgICAgICAgKGZpcikgPyBPQk9FX0NUTF9UWF9IV19PV05TIHwgT0JPRV9DVExfVFhfUlRDRU5UWAorICAgICAgICAgICAgICA6IE9CT0VfQ1RMX1RYX0hXX09XTlMgOworICAgICAgc2VsZi0+cmluZy0+dHhbc2VsZi0+dHhzXS5sZW4gPQorICAgICAgICB0b3Nob2JvZV9tYWtldGVzdHBhY2tldCAoc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdLCAwLCBmaXIpOworICAgICAgc2VsZi0+dHhzKys7CisgICAgICBzZWxmLT50eHMgJT0gVFhfU0xPVFM7CisKKyAgICAgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10uY29udHJvbCA9CisgICAgICAgIChmaXIpID8gT0JPRV9DVExfVFhfSFdfT1dOUyB8IE9CT0VfQ1RMX1RYX1NJUAorICAgICAgICAgICAgICA6IE9CT0VfQ1RMX1RYX0hXX09XTlMgfCBPQk9FX0NUTF9UWF9SVENFTlRYIDsKKyAgICAgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10ubGVuID0KKyAgICAgICAgdG9zaG9ib2VfbWFrZXRlc3RwYWNrZXQgKHNlbGYtPnR4X2J1ZnNbc2VsZi0+dHhzXSwgMCwgZmlyKTsKKyAgICAgIHNlbGYtPnR4cysrOworICAgICAgc2VsZi0+dHhzICU9IFRYX1NMT1RTOworCisgICAgICBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmNvbnRyb2wgPQorICAgICAgICAoZmlyKSA/IE9CT0VfQ1RMX1RYX0hXX09XTlMgfCBPQk9FX0NUTF9UWF9SVENFTlRYCisgICAgICAgICAgICAgIDogT0JPRV9DVExfVFhfSFdfT1dOUyA7CisgICAgICBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmxlbiA9CisgICAgICAgIHRvc2hvYm9lX21ha2V0ZXN0cGFja2V0IChzZWxmLT50eF9idWZzW3NlbGYtPnR4c10sIDAsIGZpcik7CisgICAgICBzZWxmLT50eHMrKzsKKyAgICAgIHNlbGYtPnR4cyAlPSBUWF9TTE9UUzsKKworICAgICAgc2VsZi0+cmluZy0+dHhbc2VsZi0+dHhzXS5jb250cm9sID0KKyAgICAgICAgKGZpcikgPyBPQk9FX0NUTF9UWF9IV19PV05TIHwgT0JPRV9DVExfVFhfUlRDRU5UWAorICAgICAgICAgICAgICB8IE9CT0VfQ1RMX1RYX1NJUCAgICAgfCBPQk9FX0NUTF9UWF9CQURfQ1JDCisgICAgICAgICAgICAgIDogT0JPRV9DVExfVFhfSFdfT1dOUyB8IE9CT0VfQ1RMX1RYX1JUQ0VOVFggOworICAgICAgc2VsZi0+cmluZy0+dHhbc2VsZi0+dHhzXS5sZW4gPQorICAgICAgICB0b3Nob2JvZV9tYWtldGVzdHBhY2tldCAoc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdLCAwLCBmaXIpOworICAgICAgc2VsZi0+dHhzKys7CisgICAgICBzZWxmLT50eHMgJT0gVFhfU0xPVFM7CisKKyAgICAgIHRvc2hvYm9lX2R1bXB0eCAoc2VsZik7CisgICAgICAvKiBUdXJuIG9uIFRYIGFuZCBSWCBhbmQgbG9vcGJhY2sgKi8KKyAgICAgIHRvc2hvYm9lX3N0YXJ0X0RNQShzZWxmLCBPQk9FX0NPTkZJRzBIX0VOVFggfCBPQk9FX0NPTkZJRzBIX0xPT1ApOworCisgICAgICBpID0gMDsKKyAgICAgIG4gPSBmaXIgPyAxIDogNDsKKyAgICAgIHdoaWxlICh0b3Nob2JvZV9udW12YWxpZHJjdnMgKHNlbGYpICE9IG4pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaSA+IDQ4MDApCisgICAgICAgICAgICAgIHJldHVybiB0b3Nob2JvZV9wcm9iZWZhaWwgKHNlbGYsICJmaWx0ZXIgdGVzdCIpOworICAgICAgICAgIHVkZWxheSAoKDk2MDAqKFRUX0xFTisxNikpL3NlbGYtPnNwZWVkKTsKKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKworICAgICAgbiA9IGZpciA/IDIwMyA6IDEwMjsKKyAgICAgIHdoaWxlICgodG9zaG9ib2VfbnVtcmN2cyhzZWxmKSAhPSBzZWxmLT5pbnRfcngpIHx8IChzZWxmLT5pbnRfdHggIT0gbikpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaSA+IDQ4MDApCisgICAgICAgICAgICAgIHJldHVybiB0b3Nob2JvZV9wcm9iZWZhaWwgKHNlbGYsICJpbnRlcnJ1cHQgdGVzdCIpOworICAgICAgICAgIHVkZWxheSAoKDk2MDAqKFRUX0xFTisxNikpL3NlbGYtPnNwZWVkKTsKKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgdG9zaG9ib2VfZHVtcHJ4IChzZWxmLGkpOworCisgICAgIH0KKworICAvKiB0ZXN0IDI6IFNJUiBpbiBjaGFyIGF0IGEgdGltZSAqLworCisgIHRvc2hvYm9lX3N0b3BjaGlwIChzZWxmKTsKKyAgc2VsZi0+aW50X3J4ID0gc2VsZi0+aW50X3R4ID0gMDsKKworICBzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgdG9zaG9ib2Vfc3RhcnRjaGlwIChzZWxmKTsKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworICBzZWxmLT5hc3luYyA9IDE7CisgIHNlbGYtPnNwZWVkID0gMTE1MjAwOworICB0b3Nob2JvZV9zZXRiYXVkIChzZWxmKTsKKyAgc2VsZi0+cmluZy0+dHhbc2VsZi0+dHhzXS5jb250cm9sID0KKyAgICBPQk9FX0NUTF9UWF9SVENFTlRYIHwgT0JPRV9DVExfVFhfSFdfT1dOUzsKKyAgc2VsZi0+cmluZy0+dHhbc2VsZi0+dHhzXS5sZW4gPSA0OworCisgICgodW5zaWduZWQgY2hhciAqKSBzZWxmLT50eF9idWZzW3NlbGYtPnR4c10pWzBdID0gJ2YnOworICAoKHVuc2lnbmVkIGNoYXIgKikgc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdKVsxXSA9ICdpJzsKKyAgKCh1bnNpZ25lZCBjaGFyICopIHNlbGYtPnR4X2J1ZnNbc2VsZi0+dHhzXSlbMl0gPSAncyc7CisgICgodW5zaWduZWQgY2hhciAqKSBzZWxmLT50eF9idWZzW3NlbGYtPnR4c10pWzNdID0gJ2gnOworICB0b3Nob2JvZV9kdW1wdHggKHNlbGYpOworICB0b3Nob2JvZV9zdGFydF9ETUEoc2VsZiwgT0JPRV9DT05GSUcwSF9FTlRYIHwgT0JPRV9DT05GSUcwSF9MT09QKTsKKworICBpID0gMDsKKyAgd2hpbGUgKHRvc2hvYm9lX251bXZhbGlkcmN2cyAoc2VsZikgIT0gNCkKKyAgICB7CisgICAgICBpZiAoaSA+IDEwMCkKKyAgICAgICAgICByZXR1cm4gdG9zaG9ib2VfcHJvYmVmYWlsIChzZWxmLCAiQXN5bmMgdGVzdCIpOworICAgICAgdWRlbGF5ICgxMDApOworICAgICAgaSsrOworICAgIH0KKworICB3aGlsZSAoKHRvc2hvYm9lX251bXJjdnMgKHNlbGYpICE9IHNlbGYtPmludF9yeCkgfHwgKHNlbGYtPmludF90eCAhPSAxKSkKKyAgICB7CisgICAgICBpZiAoaSA+IDEwMCkKKyAgICAgICAgICByZXR1cm4gdG9zaG9ib2VfcHJvYmVmYWlsIChzZWxmLCAiQXN5bmMgaW50ZXJydXB0IHRlc3QiKTsKKyAgICAgIHVkZWxheSAoMTAwKTsKKyAgICAgIGkrKzsKKyAgICB9CisgIHRvc2hvYm9lX2R1bXByeCAoc2VsZixpKTsKKworICBzZWxmLT5hc3luYyA9IDA7CisgIHNlbGYtPnNwZWVkID0gOTYwMDsKKyAgdG9zaG9ib2Vfc2V0YmF1ZCAoc2VsZik7CisgIHRvc2hvYm9lX3N0b3BjaGlwIChzZWxmKTsKKworICBmcmVlX2lycSAoc2VsZi0+aW8uaXJxLCAodm9pZCAqKSBzZWxmKTsKKworICBwcmludGsgKEtFUk5fV0FSTklORyBEUklWRVJfTkFNRSAiOiBTZWxmIHRlc3QgcGFzc2VkIG9rXG4iKTsKKworICByZXR1cm4gMTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTmV0ZGV2IHN0eWxlIGNvZGUgKi8KKworLyogVHJhbnNtaXQgc29tZXRoaW5nICovCitzdGF0aWMgaW50Cit0b3Nob2JvZV9oYXJkX3htaXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZjsKKyAgX19zMzIgc3BlZWQ7CisgIGludCBtdHQsIGxlbiwgY3RsOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICBzdHJ1Y3QgaXJkYV9za2JfY2IgKmNiID0gKHN0cnVjdCBpcmRhX3NrYl9jYiAqKSBza2ItPmNiOworCisgIHNlbGYgPSAoc3RydWN0IHRvc2hvYm9lX2NiICopIGRldi0+cHJpdjsKKworICBJUkRBX0FTU0VSVCAoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDsgKTsKKworICBJUkRBX0RFQlVHICgxLCAiJXMudHg6JXgoJXgpJXhcbiIsIF9fRlVOQ1RJT05fXworICAgICAgLHNrYi0+bGVuLHNlbGYtPnR4cGVuZGluZyxJTkIgKE9CT0VfRU5BQkxFSCkpOworICBpZiAoIWNiLT5tYWdpYykgeworICAgICAgSVJEQV9ERUJVRyAoMiwgIiVzLk5vdCBJckxBUDoleFxuIiwgX19GVU5DVElPTl9fLCBjYi0+bWFnaWMpOworI2lmZGVmIERVTVBfUEFDS0VUUworICAgICAgX2R1bXBidWZzKHNrYi0+ZGF0YSxza2ItPmxlbiwnPicpOworI2VuZGlmCisgICAgfQorCisgIC8qIGNoYW5nZSBzcGVlZCBwZW5kaW5nLCB3YWl0IGZvciBpdHMgZXhlY3V0aW9uICovCisgIGlmIChzZWxmLT5uZXdfc3BlZWQpCisgICAgICByZXR1cm4gLUVCVVNZOworCisgIC8qIGRldmljZSBzdG9wcGVkIChhcG0pIHdhaXQgZm9yIHJlc3RhcnQgKi8KKyAgaWYgKHNlbGYtPnN0b3BwZWQpCisgICAgICByZXR1cm4gLUVCVVNZOworCisgIHRvc2hvYm9lX2NoZWNrc3R1Y2sgKHNlbGYpOworCisgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisgLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisgIC8qIEJ1dCBub3Qgbm93LiBXYWl0IGFmdGVyIHRyYW5zbWlzc2lvbiBpZiBtdHQgbm90IHJlcXVpcmVkICovCisgIHNwZWVkPWlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKyAgaWYgKChzcGVlZCAhPSBzZWxmLT5pby5zcGVlZCkgJiYgKHNwZWVkICE9IC0xKSkKKyAgICB7CisgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAgICAgaWYgKHNlbGYtPnR4cGVuZGluZyB8fCBza2ItPmxlbikKKyAgICAgICAgeworICAgICAgICAgIHNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOworICAgICAgICAgIElSREFfREVCVUcgKDEsICIlczogUXVldWVkIFR4RG9uZSBzY2hlZHVsZWQgc3BlZWQgY2hhbmdlICVkXG4iICwKKwkJICAgICAgX19GVU5DVElPTl9fLCBzcGVlZCk7CisgICAgICAgICAgLyogaWYgbm8gZGF0YSwgdGhhdCdzIGFsbCEgKi8KKyAgICAgICAgICBpZiAoIXNrYi0+bGVuKQorICAgICAgICAgICAgeworCSAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgIGRldl9rZnJlZV9za2IgKHNrYik7CisgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgIC8qIFRydWUgcGFja2V0LCBnbyBvbiwgYnV0ICovCisgICAgICAgICAgLyogZG8gbm90IGFjY2VwdCBhbnl0aGluZyBiZWZvcmUgY2hhbmdlIHNwZWVkIGV4ZWN1dGlvbiAqLworICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICAgICAgICAvKiByZWFkeSB0byBwcm9jZXNzIFR4RG9uZSBpbnRlcnJ1cHQgKi8KKwkgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIGlkbGUgYW5kIG5vIGRhdGEsIGNoYW5nZSBzcGVlZCBub3cgKi8KKyAgICAgICAgICBzZWxmLT5zcGVlZCA9IHNwZWVkOworICAgICAgICAgIHRvc2hvYm9lX3NldGJhdWQgKHNlbGYpOworCSAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICBkZXZfa2ZyZWVfc2tiIChza2IpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICB9CisKKyAgaWYgKChtdHQgPSBpcmRhX2dldF9tdHQoc2tiKSkpCisgICAgeworICAgICAgLyogVGhpcyBpcyBmYWlyIHNpbmNlIHRoZSBxdWV1ZSBzaG91bGQgYmUgZW1wdHkgYW55d2F5ICovCisgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAgICAgaWYgKHNlbGYtPnR4cGVuZGluZykKKyAgICAgICAgeworCSAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICB9CisKKyAgICAgIC8qIElmIGluIFNJUiBtb2RlIHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBzdHJpbmcgb2YgWEJPRnMgKi8KKyAgICAgIC8qIEluIE1JUiBhbmQgRklSIHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBzdHJpbmcgb2YgZGF0YSAqLworICAgICAgLyogd2hpY2ggd2Ugd2lsbCBhZGQgYSB3cm9uZyBjaGVja3N1bSB0byAqLworCisgICAgICBtdHQgPSB0b3Nob2JvZV9tYWtlbXR0cGFja2V0IChzZWxmLCBzZWxmLT50eF9idWZzW3NlbGYtPnR4c10sIG10dCk7CisgICAgICBJUkRBX0RFQlVHICgxLCAiJXMubXR0OiV4KCV4KSVkXG4iLCBfX0ZVTkNUSU9OX18KKyAgICAgICAgICAsc2tiLT5sZW4sbXR0LHNlbGYtPnR4cGVuZGluZyk7CisgICAgICBpZiAobXR0KQorICAgICAgICB7CisgICAgICAgICAgc2VsZi0+cmluZy0+dHhbc2VsZi0+dHhzXS5sZW4gPSBtdHQgJiAweGZmZjsKKworICAgICAgICAgIGN0bCA9IE9CT0VfQ1RMX1RYX0hXX09XTlMgfCBPQk9FX0NUTF9UWF9SVENFTlRYOworICAgICAgICAgIGlmIChJTkIgKE9CT0VfRU5BQkxFSCkgJiBPQk9FX0VOQUJMRUhfRklST04pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGN0bCB8PSBPQk9FX0NUTF9UWF9CQURfQ1JDIHwgT0JPRV9DVExfVFhfU0lQIDsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBVU0VfTUlSCisgICAgICAgICAgZWxzZSBpZiAoSU5CIChPQk9FX0VOQUJMRUgpICYgT0JPRV9FTkFCTEVIX01JUk9OKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjdGwgfD0gT0JPRV9DVExfVFhfQkFEX0NSQzsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10uY29udHJvbCA9IGN0bDsKKworICAgICAgICAgIE9VVEIgKDB4MCwgT0JPRV9FTkFCTEVIKTsKKyAgICAgICAgICAvKiBJdCBpcyBvbmx5IGEgdGltZXIuIERvIG5vdCBzZW5kIG10dCBwYWNrZXQgb3V0c2lkZSEgKi8KKyAgICAgICAgICB0b3Nob2JvZV9zdGFydF9ETUEoc2VsZiwgT0JPRV9DT05GSUcwSF9FTlRYIHwgT0JPRV9DT05GSUcwSF9MT09QKTsKKworICAgICAgICAgIHNlbGYtPnR4cGVuZGluZysrOworCisgICAgICAgICAgc2VsZi0+dHhzKys7CisgICAgICAgICAgc2VsZi0+dHhzICU9IFRYX1NMT1RTOworCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBwcm9ibGVtIHdpdGggbXR0IHBhY2tldCAtIGlnbm9yZWRcbiIpOworICAgICAgICB9CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworICAgIH0KKworI2lmZGVmIERVTVBfUEFDS0VUUworZHVtcGJ1ZnMoc2tiLT5kYXRhLHNrYi0+bGVuLCc+Jyk7CisjZW5kaWYKKworICBzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworICBpZiAoc2VsZi0+cmluZy0+dHhbc2VsZi0+dHhzXS5jb250cm9sICYgT0JPRV9DVExfVFhfSFdfT1dOUykKKyAgICB7CisgICAgICBJUkRBX0RFQlVHICgwLCAiJXMuZnVsOiV4KCV4KSV4XG4iLCBfX0ZVTkNUSU9OX18KKyAgICAgICAgICAsc2tiLT5sZW4sIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10uY29udHJvbCwgc2VsZi0+dHhwZW5kaW5nKTsKKyAgICAgIHRvc2hvYm9lX3N0YXJ0X0RNQShzZWxmLCBPQk9FX0NPTkZJRzBIX0VOVFgpOworICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgICAgIHJldHVybiAtRUJVU1k7CisgICAgfQorCisgIGlmIChJTkIgKE9CT0VfRU5BQkxFSCkgJiBPQk9FX0VOQUJMRUhfU0lST04pCisgICAgeworICAgICAgbGVuID0gYXN5bmNfd3JhcF9za2IgKHNrYiwgc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdLCBUWF9CVUZfU1opOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxlbiA9IHNrYi0+bGVuOworICAgICAgbWVtY3B5IChzZWxmLT50eF9idWZzW3NlbGYtPnR4c10sIHNrYi0+ZGF0YSwgbGVuKTsKKyAgICB9CisgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10ubGVuID0gbGVuICYgMHgwZmZmOworCisgIC8qU29tZXRpbWVzIHRoZSBIVyBkb2Vzbid0IHNlZSB1cyBhc3NlcnQgUlRDRU5UWCBpbiB0aGUgaW50ZXJydXB0IGNvZGUgKi8KKyAgLypsYXRlciB0aGlzIHBsYXlzIHNhZmUsIHdlIGdhcnVudGVlIHRoZSBsYXN0IHBhY2tldCB0byBiZSB0cmFuc21pdHRlZCAqLworICAvKmhhcyBSVENFTlRYIHNldCAqLworCisgIGN0bCA9IE9CT0VfQ1RMX1RYX0hXX09XTlMgfCBPQk9FX0NUTF9UWF9SVENFTlRYOworICBpZiAoSU5CIChPQk9FX0VOQUJMRUgpICYgT0JPRV9FTkFCTEVIX0ZJUk9OKQorICAgIHsKKyAgICAgIGN0bCB8PSBPQk9FX0NUTF9UWF9TSVAgOworICAgIH0KKyAgc2VsZi0+cmluZy0+dHhbc2VsZi0+dHhzXS5jb250cm9sID0gY3RsOworCisgIC8qIElmIHRyYW5zbWl0dGVyIGlzIGlkbGUgc3RhcnQgaW4gb25lLXNob3QgbW9kZSAqLworCisgIGlmICghc2VsZi0+dHhwZW5kaW5nKQorICAgICAgdG9zaG9ib2Vfc3RhcnRfRE1BKHNlbGYsIE9CT0VfQ09ORklHMEhfRU5UWCk7CisKKyAgc2VsZi0+dHhwZW5kaW5nKys7CisKKyAgc2VsZi0+dHhzKys7CisgIHNlbGYtPnR4cyAlPSBUWF9TTE9UUzsKKworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworICBkZXZfa2ZyZWVfc2tiIChza2IpOworCisgIHJldHVybiAwOworfQorCisvKmludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK3Rvc2hvYm9lX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmID0gKHN0cnVjdCB0b3Nob2JvZV9jYiAqKSBkZXZfaWQ7CisgIF9fdTggaXJxc3RhdDsKKyAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisKKyAgaWYgKHNlbGYgPT0gTlVMTCAmJiB0b3Nob2JvZV9pbnZhbGlkX2RldihpcnEpKQorICAgIHJldHVybiBJUlFfTk9ORTsKKworICBpcnFzdGF0ID0gSU5CIChPQk9FX0lTUik7CisKKy8qIHdhcyBpdCB1cyAqLworICBpZiAoIShpcnFzdGF0ICYgT0JPRV9JTlRfTUFTSykpCisgICAgICByZXR1cm4gSVJRX05PTkU7CisKKy8qIEFjayBhbGwgdGhlIGludGVycnVwdHMgKi8KKyAgT1VUQiAoaXJxc3RhdCwgT0JPRV9JU1IpOworCisgIHRvc2hvYm9lX2lzbnRzdHVjayAoc2VsZik7CisKKy8qIFR4ZG9uZSAqLworICBpZiAoaXJxc3RhdCAmIE9CT0VfSU5UX1RYRE9ORSkKKyAgICB7CisgICAgICBpbnQgdHhwLCB0eHBjOworICAgICAgaW50IGk7CisKKyAgICAgIHR4cCA9IHNlbGYtPnR4cGVuZGluZzsKKyAgICAgIHNlbGYtPnR4cGVuZGluZyA9IDA7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBUWF9TTE9UUzsgKytpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHNlbGYtPnJpbmctPnR4W2ldLmNvbnRyb2wgJiBPQk9FX0NUTF9UWF9IV19PV05TKQorICAgICAgICAgICAgICBzZWxmLT50eHBlbmRpbmcrKzsKKyAgICAgICAgfQorICAgICAgSVJEQV9ERUJVRyAoMSwgIiVzLnR4ZCgleCkleC8leFxuIiwgX19GVU5DVElPTl9fCisgICAgICAgICAgLGlycXN0YXQsdHhwLHNlbGYtPnR4cGVuZGluZyk7CisKKyAgICAgIHR4cCA9IElOQiAoT0JPRV9UWFNMT1QpICYgT0JPRV9TTE9UX01BU0s7CisKKyAgICAgIC8qIEdvdCBhbnl0aGluZyBxdWV1ZWQgPyBzdGFydCBpdCB0b2dldGhlciAqLworICAgICAgaWYgKHNlbGYtPnJpbmctPnR4W3R4cF0uY29udHJvbCAmIE9CT0VfQ1RMX1RYX0hXX09XTlMpCisgICAgICAgIHsKKyAgICAgICAgICB0eHBjID0gdHhwOworI2lmZGVmIE9QVElNSVpFX1RYCisgICAgICAgICAgd2hpbGUgKHNlbGYtPnJpbmctPnR4W3R4cGNdLmNvbnRyb2wgJiBPQk9FX0NUTF9UWF9IV19PV05TKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB0eHAgPSB0eHBjOworICAgICAgICAgICAgICB0eHBjKys7CisgICAgICAgICAgICAgIHR4cGMgJT0gVFhfU0xPVFM7CisgICAgICAgICAgICAgIHNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgaWYgKHNlbGYtPnJpbmctPnR4W3R4cGNdLmNvbnRyb2wgJiBPQk9FX0NUTF9UWF9IV19PV05TKQorICAgICAgICAgICAgICAgICAgc2VsZi0+cmluZy0+dHhbdHhwXS5jb250cm9sICY9IH5PQk9FX0NUTF9UWF9SVENFTlRYOworICAgICAgICAgICAgfQorICAgICAgICAgIHNlbGYtPnN0YXRzLnR4X3BhY2tldHMtLTsKKyNlbHNlCisgICAgICAgICAgc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworI2VuZGlmCisgICAgICAgICAgdG9zaG9ib2Vfc3RhcnRfRE1BKHNlbGYsIE9CT0VfQ09ORklHMEhfRU5UWCk7CisgICAgICAgIH0KKworICAgICAgaWYgKCghc2VsZi0+dHhwZW5kaW5nKSAmJiAoc2VsZi0+bmV3X3NwZWVkKSkKKyAgICAgICAgeworICAgICAgICAgIHNlbGYtPnNwZWVkID0gc2VsZi0+bmV3X3NwZWVkOworICAgICAgICAgIElSREFfREVCVUcgKDEsICIlczogRXhlY3V0ZWQgVHhEb25lIHNjaGVkdWxlZCBzcGVlZCBjaGFuZ2UgJWRcbiIsCisJCSAgICAgIF9fRlVOQ1RJT05fXywgc2VsZi0+c3BlZWQpOworICAgICAgICAgIHRvc2hvYm9lX3NldGJhdWQgKHNlbGYpOworICAgICAgICB9CisKKyAgICAgIC8qIFRlbGwgbmV0d29yayBsYXllciB0aGF0IHdlIHdhbnQgbW9yZSBmcmFtZXMgKi8KKyAgICAgIGlmICghc2VsZi0+bmV3X3NwZWVkKQorICAgICAgICAgIG5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKyAgICB9CisKKyAgaWYgKGlycXN0YXQgJiBPQk9FX0lOVF9SWERPTkUpCisgICAgeworICAgICAgd2hpbGUgKCEoc2VsZi0+cmluZy0+cnhbc2VsZi0+cnhzXS5jb250cm9sICYgT0JPRV9DVExfUlhfSFdfT1dOUykpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgbGVuID0gc2VsZi0+cmluZy0+cnhbc2VsZi0+cnhzXS5sZW47CisgICAgICAgICAgc2tiID0gTlVMTDsKKyAgICAgICAgICBJUkRBX0RFQlVHICgzLCAiJXMucmN2OiV4KCV4KVxuIiwgX19GVU5DVElPTl9fCisJCSAgICAgICxsZW4sc2VsZi0+cmluZy0+cnhbc2VsZi0+cnhzXS5jb250cm9sKTsKKworI2lmZGVmIERVTVBfUEFDS0VUUworZHVtcGJ1ZnMoc2VsZi0+cnhfYnVmc1tzZWxmLT5yeHNdLGxlbiwnPCcpOworI2VuZGlmCisKKyAgICAgICAgICBpZiAoc2VsZi0+cmluZy0+cnhbc2VsZi0+cnhzXS5jb250cm9sID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fdTggZW5hYmxlID0gSU5CIChPQk9FX0VOQUJMRUgpOworCisgICAgICAgICAgICAgIC8qIEluIFNJUiBtb2RlIHdlIG5lZWQgdG8gY2hlY2sgdGhlIENSQyBhcyB0aGlzICovCisgICAgICAgICAgICAgIC8qIGhhc24ndCBiZWVuIGRvbmUgYnkgdGhlIGhhcmR3YXJlICovCisgICAgICAgICAgICAgIGlmIChlbmFibGUgJiBPQk9FX0VOQUJMRUhfU0lST04pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKCF0b3Nob2JvZV9jaGVja2ZjcyAoc2VsZi0+cnhfYnVmc1tzZWxmLT5yeHNdLCBsZW4pKQorICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAvKlRyaW0gb2ZmIHRoZSBDUkMgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKQorICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSAyOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICBJUkRBX0RFQlVHICgxLCAiJXMuU0lSOiV4KCV4KVxuIiwgX19GVU5DVElPTl9fLCBsZW4sZW5hYmxlKTsKKyAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBVU0VfTUlSCisgICAgICAgICAgICAgIGVsc2UgaWYgKGVuYWJsZSAmIE9CT0VfRU5BQkxFSF9NSVJPTikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMjsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgSVJEQV9ERUJVRyAoMiwgIiVzLk1JUjoleCgleClcbiIsIF9fRlVOQ1RJT05fXywgbGVuLGVuYWJsZSk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgIGVsc2UgaWYgKGVuYWJsZSAmIE9CT0VfRU5BQkxFSF9GSVJPTikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMykKKyAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gNDsgICAvKkZJWE1FOiBjaGVjayB0aGlzICovCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgIElSREFfREVCVUcgKDEsICIlcy5GSVI6JXgoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIGxlbixlbmFibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgSVJEQV9ERUJVRyAoMCwgIiVzLj9JUjoleCgleClcbiIsIF9fRlVOQ1RJT05fXywgbGVuLGVuYWJsZSk7CisKKyAgICAgICAgICAgICAgaWYgKGxlbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBza2IgPSBkZXZfYWxsb2Nfc2tiIChsZW4gKyAxKTsKKyAgICAgICAgICAgICAgICAgIGlmIChza2IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBza2JfcmVzZXJ2ZSAoc2tiLCAxKTsKKworICAgICAgICAgICAgICAgICAgICAgIHNrYl9wdXQgKHNrYiwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkgKHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmc1tzZWxmLT5yeHNdLCBsZW4pOworCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OworICAgICAgICAgICAgICAgICAgICAgIHNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICBza2ItPnByb3RvY29sID0gaHRvbnMgKEVUSF9QX0lSREEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGsgKEtFUk5fSU5GTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCksIG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBmcmFtZS5cbiIsCisJCQkgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRPRE86ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyAgICAgICAgICAgIC8qICBpZiBPQk9FX0NUTF9SWF9MRU5HVEgsIG91ciBidWZmZXJzIGFyZSB0b28gc21hbGwgKi8KKyAgICAgICAgICAgIC8qIChNSVIgb3IgRklSKSBkYXRhIGlzIGxvc3QuICovCisgICAgICAgICAgICAvKiAoU0lSKSBkYXRhIGlzIHNwbGl0dGVkIGluIHNldmVyYWwgc2xvdHMuICovCisgICAgICAgICAgICAvKiB3ZSBoYXZlIHRvIGpvaW4gYWxsIHRoZSByZWNlaXZlZCBidWZmZXJzIHJlY2VpdmVkICovCisgICAgICAgICAgICAvKmluIGEgbGFyZ2UgYnVmZmVyIGJlZm9yZSBjaGVja2luZyBDUkMuICovCisgICAgICAgICAgICBJUkRBX0RFQlVHICgwLCAiJXMuZXJyOiV4KCV4KVxuIiwgX19GVU5DVElPTl9fCisgICAgICAgICAgICAgICAgLGxlbixzZWxmLT5yaW5nLT5yeFtzZWxmLT5yeHNdLmNvbnRyb2wpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgc2VsZi0+cmluZy0+cnhbc2VsZi0+cnhzXS5sZW4gPSAweDA7CisgICAgICAgICAgc2VsZi0+cmluZy0+cnhbc2VsZi0+cnhzXS5jb250cm9sID0gT0JPRV9DVExfUlhfSFdfT1dOUzsKKworICAgICAgICAgIHNlbGYtPnJ4cysrOworICAgICAgICAgIHNlbGYtPnJ4cyAlPSBSWF9TTE9UUzsKKworICAgICAgICAgIGlmIChza2IpCisgICAgICAgICAgICAgIG5ldGlmX3J4IChza2IpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGlycXN0YXQgJiBPQk9FX0lOVF9UWFVOREVSKQorICAgIHsKKyAgICAgIHByaW50ayAoS0VSTl9XQVJOSU5HIERSSVZFUl9OQU1FICI6IHR4IGZpZm8gdW5kZXJmbG93XG4iKTsKKyAgICB9CisgIGlmIChpcnFzdGF0ICYgT0JPRV9JTlRfUlhPVkVSKQorICAgIHsKKyAgICAgIHByaW50ayAoS0VSTl9XQVJOSU5HIERSSVZFUl9OQU1FICI6IHJ4IGZpZm8gb3ZlcmZsb3dcbiIpOworICAgIH0KKy8qIFRoaXMgbXVzdCBiZSB1c2VmdWwgZm9yIHNvbWV0aGluZy4uLiAqLworICBpZiAoaXJxc3RhdCAmIE9CT0VfSU5UX1NJUCkKKyAgICB7CisgICAgICBzZWxmLT5pbnRfc2lwKys7CisgICAgICBJUkRBX0RFQlVHICgxLCAiJXMuc2lwOiV4KCV4KSV4XG4iLCBfX0ZVTkNUSU9OX18KKwkgICAgICAsc2VsZi0+aW50X3NpcCxpcnFzdGF0LHNlbGYtPnR4cGVuZGluZyk7CisgICAgfQorICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworc3RhdGljIGludAordG9zaG9ib2VfbmV0X29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZjsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICBJUkRBX0RFQlVHICg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworICBJUkRBX0FTU0VSVCAoZGV2ICE9IE5VTEwsIHJldHVybiAtMTsgKTsKKyAgc2VsZiA9IChzdHJ1Y3QgdG9zaG9ib2VfY2IgKikgZGV2LT5wcml2OworCisgIElSREFfQVNTRVJUIChzZWxmICE9IE5VTEwsIHJldHVybiAwOyApOworCisgIGlmIChzZWxmLT5hc3luYykKKyAgICByZXR1cm4gLUVCVVNZOworCisgIGlmIChzZWxmLT5zdG9wcGVkKQorICAgIHJldHVybiAwOworCisgIGlmIChyZXF1ZXN0X2lycSAoc2VsZi0+aW8uaXJxLCB0b3Nob2JvZV9pbnRlcnJ1cHQsCisgICAgICAgICAgICAgICAgICAgU0FfU0hJUlEgfCBTQV9JTlRFUlJVUFQsIGRldi0+bmFtZSwgKHZvaWQgKikgc2VsZikpCisgICAgeworICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgIHNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworICB0b3Nob2JvZV9zdGFydGNoaXAgKHNlbGYpOworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisgIC8qIFJlYWR5IHRvIHBsYXkhICovCisgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKyAgLyoKKyAgICogT3BlbiBuZXcgSXJMQVAgbGF5ZXIgaW5zdGFuY2UsIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgc2hvdWxkIGJlCisgICAqIGluaXRpYWxpemVkIHByb3Blcmx5CisgICAqLworICBzZWxmLT5pcmxhcCA9IGlybGFwX29wZW4gKGRldiwgJnNlbGYtPnFvcywgZHJpdmVyX25hbWUpOworCisgIHNlbGYtPmlyZGFkID0gMTsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAordG9zaG9ib2VfbmV0X2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGY7CisKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgSVJEQV9BU1NFUlQgKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7ICk7CisgIHNlbGYgPSAoc3RydWN0IHRvc2hvYm9lX2NiICopIGRldi0+cHJpdjsKKworICAvKiBTdG9wIGRldmljZSAqLworICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgLyogU3RvcCBhbmQgcmVtb3ZlIGluc3RhbmNlIG9mIElyTEFQICovCisgIGlmIChzZWxmLT5pcmxhcCkKKyAgICBpcmxhcF9jbG9zZSAoc2VsZi0+aXJsYXApOworICBzZWxmLT5pcmxhcCA9IE5VTEw7CisKKyAgc2VsZi0+aXJkYWQgPSAwOworCisgIGZyZWVfaXJxIChzZWxmLT5pby5pcnEsICh2b2lkICopIHNlbGYpOworCisgIGlmICghc2VsZi0+c3RvcHBlZCkKKyAgICB7CisgICAgICB0b3Nob2JvZV9zdG9wY2hpcCAoc2VsZik7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gdG9zaG9ib2VfbmV0X2lvY3RsIChkZXYsIHJxLCBjbWQpCisgKgorICogICAgUHJvY2VzcyBJT0NUTCBjb21tYW5kcyBmb3IgdGhpcyBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQKK3Rvc2hvYm9lX25ldF9pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKyAgc3RydWN0IGlmX2lyZGFfcmVxICppcnEgPSAoc3RydWN0IGlmX2lyZGFfcmVxICopIHJxOworICBzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGY7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIGludCByZXQgPSAwOworCisgIElSREFfQVNTRVJUIChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyApOworCisgIHNlbGYgPSBkZXYtPnByaXY7CisKKyAgSVJEQV9BU1NFUlQgKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyApOworCisgIElSREFfREVCVUcgKDUsICIlcygpLCAlcywgKGNtZD0weCVYKVxuIiwgX19GVU5DVElPTl9fLCBkZXYtPm5hbWUsIGNtZCk7CisKKyAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLworICBzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworICBzd2l0Y2ggKGNtZCkKKyAgICB7CisgICAgY2FzZSBTSU9DU0JBTkRXSURUSDogICAgICAgLyogU2V0IGJhbmR3aWR0aCAqLworICAgICAgLyogVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gYmUgdXNlZCBieSBJckxBUCB0byBjaGFuZ2UgdGhlCisgICAgICAgKiBzcGVlZCwgc28gd2Ugc3RpbGwgbXVzdCBhbGxvdyBmb3Igc3BlZWQgY2hhbmdlIHdpdGhpbgorICAgICAgICogaW50ZXJydXB0IGNvbnRleHQuCisgICAgICAgKi8KKyAgICAgIElSREFfREVCVUcgKDEsICIlcyhCQU5EV0lEVEgpLCAlcywgKCVYLyVsZFxuIiwgX19GVU5DVElPTl9fCisgICAgICAgICAgLGRldi0+bmFtZSwgSU5CIChPQk9FX1NUQVRVUyksIGlycS0+aWZyX2JhdWRyYXRlICk7CisgICAgICBpZiAoIWluX2ludGVycnVwdCAoKSAmJiAhY2FwYWJsZSAoQ0FQX05FVF9BRE1JTikpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKyAgICAgIC8qIHNlbGYtPnNwZWVkPWlycS0+aWZyX2JhdWRyYXRlOyAqLworICAgICAgLyogdG9zaG9ib2Vfc2V0YmF1ZChzZWxmKTsgKi8KKyAgICAgIC8qIEp1c3QgY2hhbmdlIHNwZWVkIG9uY2UgLSBpbnNlcnRlZCBieSBQYXVsIEJyaXN0b3cgKi8KKyAgICAgIHNlbGYtPm5ld19zcGVlZCA9IGlycS0+aWZyX2JhdWRyYXRlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSU9DU01FRElBQlVTWTogICAgICAgLyogU2V0IG1lZGlhIGJ1c3kgKi8KKyAgICAgIElSREFfREVCVUcgKDEsICIlcyhNRURJQUJVU1kpLCAlcywgKCVYLyV4KVxuIiwgX19GVU5DVElPTl9fCisgICAgICAgICAgLGRldi0+bmFtZSwgSU5CIChPQk9FX1NUQVRVUyksIGNhcGFibGUgKENBUF9ORVRfQURNSU4pICk7CisgICAgICBpZiAoIWNhcGFibGUgKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3kgKHNlbGYtPm5ldGRldiwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNJT0NHUkVDRUlWSU5HOiAgICAgICAvKiBDaGVjayBpZiB3ZSBhcmUgcmVjZWl2aW5nIHJpZ2h0IG5vdyAqLworICAgICAgaXJxLT5pZnJfcmVjZWl2aW5nID0gKElOQiAoT0JPRV9TVEFUVVMpICYgT0JPRV9TVEFUVVNfUlhCVVNZKSA/IDEgOiAwOworICAgICAgSVJEQV9ERUJVRyAoMywgIiVzKFJFQ0VJVklORyksICVzLCAoJVgvJXgpXG4iLCBfX0ZVTkNUSU9OX18KKyAgICAgICAgICAsZGV2LT5uYW1lLCBJTkIgKE9CT0VfU1RBVFVTKSwgaXJxLT5pZnJfcmVjZWl2aW5nICk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgSVJEQV9ERUJVRyAoMSwgIiVzKD8pLCAlcywgKGNtZD0weCVYKVxuIiwgX19GVU5DVElPTl9fLCBkZXYtPm5hbWUsIGNtZCk7CisgICAgICByZXQgPSAtRU9QTk9UU1VQUDsKKyAgICB9CisKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgcmV0dXJuIHJldDsKKworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIlRvc2hpYmEgT0JPRSBJckRBIERldmljZSBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkphbWVzIE1jS2VuemllIDxqYW1lc0BmaXNoc291cC5kaHMub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0gKG1heF9iYXVkLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfYmF1ZCwgIk1heGltdW0gYmF1ZCByYXRlIik7CisKKyNpZmRlZiBVU0VfUFJPQkUKK21vZHVsZV9wYXJhbSAoZG9fcHJvYmUsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhkb19wcm9iZSwgIkVuYWJsZS9kaXNhYmxlIGNoaXAgcHJvYmluZyBhbmQgc2VsZi10ZXN0Iik7CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3Rvc2hvYm9lX2Nsb3NlIChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKyAgaW50IGk7CisgIHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZiA9IChzdHJ1Y3QgdG9zaG9ib2VfY2IqKXBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKworICBJUkRBX0RFQlVHICg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworICBJUkRBX0FTU0VSVCAoc2VsZiAhPSBOVUxMLCByZXR1cm47ICk7CisKKyAgaWYgKCFzZWxmLT5zdG9wcGVkKQorICAgIHsKKyAgICAgIHRvc2hvYm9lX3N0b3BjaGlwIChzZWxmKTsKKyAgICB9CisKKyAgcmVsZWFzZV9yZWdpb24gKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0KTsKKworICBmb3IgKGkgPSAwOyBpIDwgVFhfU0xPVFM7ICsraSkKKyAgICB7CisgICAgICBrZnJlZSAoc2VsZi0+dHhfYnVmc1tpXSk7CisgICAgICBzZWxmLT50eF9idWZzW2ldID0gTlVMTDsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IFJYX1NMT1RTOyArK2kpCisgICAgeworICAgICAga2ZyZWUgKHNlbGYtPnJ4X2J1ZnNbaV0pOworICAgICAgc2VsZi0+cnhfYnVmc1tpXSA9IE5VTEw7CisgICAgfQorCisgIHVucmVnaXN0ZXJfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisKKyAga2ZyZWUgKHNlbGYtPnJpbmdidWYpOworICBzZWxmLT5yaW5nYnVmID0gTlVMTDsKKyAgc2VsZi0+cmluZyA9IE5VTEw7CisKKyAgZnJlZV9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKK30KKworc3RhdGljIGludAordG9zaG9ib2Vfb3BlbiAoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwZGlkKQoreworICBzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGY7CisgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgIGludCBpID0gMDsKKyAgaW50IG9rID0gMDsKKyAgaW50IGVycjsKKworICBJUkRBX0RFQlVHICg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworICBpZiAoKGVycj1wY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkpCisgICAgcmV0dXJuIGVycjsKKworICBkZXYgPSBhbGxvY19pcmRhZGV2KHNpemVvZiAoc3RydWN0IHRvc2hvYm9lX2NiKSk7CisgIGlmIChkZXYgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IGNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgIgorICAgICAgICAgICAgICAiSXJEQSBjb250cm9sIGJsb2NrXG4iKTsKKyAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKworICBzZWxmID0gZGV2LT5wcml2OworICBzZWxmLT5uZXRkZXYgPSBkZXY7CisgIHNlbGYtPnBkZXYgPSBwY2lfZGV2OworICBzZWxmLT5iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsMCk7CisKKyAgc2VsZi0+aW8uZmlyX2Jhc2UgPSBzZWxmLT5iYXNlOworICBzZWxmLT5pby5maXJfZXh0ID0gT0JPRV9JT19FWFRFTlQ7CisgIHNlbGYtPmlvLmlycSA9IHBjaV9kZXYtPmlycTsKKyAgc2VsZi0+aW8uaXJxZmxhZ3MgPSBTQV9TSElSUSB8IFNBX0lOVEVSUlVQVDsKKworICBzZWxmLT5zcGVlZCA9IHNlbGYtPmlvLnNwZWVkID0gOTYwMDsKKyAgc2VsZi0+YXN5bmMgPSAwOworCisgIC8qIExvY2sgdGhlIHBvcnQgdGhhdCB3ZSBuZWVkICovCisgIGlmIChOVUxMPT1yZXF1ZXN0X3JlZ2lvbiAoc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQsIGRyaXZlcl9uYW1lKSkKKyAgICB7CisgICAgICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IGNhbid0IGdldCBpb2Jhc2Ugb2YgMHglMDN4XG4iCisJICAgICAgLHNlbGYtPmlvLmZpcl9iYXNlKTsKKyAgICAgIGVyciA9IC1FQlVTWTsKKyAgICAgIGdvdG8gZnJlZXNlbGY7CisgICAgfQorCisgIHNwaW5fbG9ja19pbml0KCZzZWxmLT5zcGlubG9jayk7CisKKyAgaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcyAoJnNlbGYtPnFvcyk7CisgIHNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyA9IDA7CisKKyAgaWYgKG1heF9iYXVkID49IDI0MDApCisgICAgc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzIHw9IElSXzI0MDA7CisgIC8qaWYgKG1heF9iYXVkPj00ODAwKSBpZGV2LT5xb3MuYmF1ZF9yYXRlLmJpdHN8PUlSXzQ4MDA7ICovCisgIGlmIChtYXhfYmF1ZCA+PSA5NjAwKQorICAgIHNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyB8PSBJUl85NjAwOworICBpZiAobWF4X2JhdWQgPj0gMTkyMDApCisgICAgc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzIHw9IElSXzE5MjAwOworICBpZiAobWF4X2JhdWQgPj0gMTE1MjAwKQorICAgIHNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyB8PSBJUl8xMTUyMDA7CisjaWZkZWYgVVNFX01JUgorICBpZiAobWF4X2JhdWQgPj0gMTE1MjAwMCkKKyAgICB7CisgICAgICBzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgfD0gSVJfMTE1MjAwMDsKKyAgICB9CisjZW5kaWYKKyAgaWYgKG1heF9iYXVkID49IDQwMDAwMDApCisgICAgeworICAgICAgc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzIHw9IChJUl80MDAwMDAwIDw8IDgpOworICAgIH0KKworICAvKkZJWE1FOiB3b3JrIHRoaXMgb3V0Li4uICovCisgIHNlbGYtPnFvcy5taW5fdHVybl90aW1lLmJpdHMgPSAweGZmOworCisgIGlyZGFfcW9zX2JpdHNfdG9fdmFsdWUgKCZzZWxmLT5xb3MpOworCisgIC8qIEFsbG9jYXRlIHR3aWNlIHRoZSBzaXplIHRvIGd1YXJhbnRlZSBhbGlnbm1lbnQgKi8KKyAgc2VsZi0+cmluZ2J1ZiA9ICh2b2lkICopIGttYWxsb2MgKE9CT0VfUklOR19MRU4gPDwgMSwgR0ZQX0tFUk5FTCk7CisgIGlmICghc2VsZi0+cmluZ2J1ZikKKyAgICB7CisgICAgICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IGNhbid0IGFsbG9jYXRlIERNQSBidWZmZXJzXG4iKTsKKyAgICAgIGVyciA9IC1FTk9NRU07CisgICAgICBnb3RvIGZyZWVyZWdpb247CisgICAgfQorCisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCisjZXJyb3IgYnJva2VuIG9uIDY0LWJpdDogIGNhc3RzIHBvaW50ZXIgdG8gMzItYml0LCBhbmQgdGhlbiBiYWNrIHRvIHBvaW50ZXIuCisjZW5kaWYKKworICAvKldlIG5lZWQgdG8gYWxpZ24gdGhlIHRhc2tmaWxlIG9uIGEgdGFza2ZpbGUgc2l6ZSBib3VuZGFyeSAqLworICB7CisgICAgdW5zaWduZWQgbG9uZyBhZGRyOworCisgICAgYWRkciA9IChfX3UzMikgc2VsZi0+cmluZ2J1ZjsKKyAgICBhZGRyICY9IH4oT0JPRV9SSU5HX0xFTiAtIDEpOworICAgIGFkZHIgKz0gT0JPRV9SSU5HX0xFTjsKKyAgICBzZWxmLT5yaW5nID0gKHN0cnVjdCBPYm9lUmluZyAqKSBhZGRyOworICB9CisKKyAgbWVtc2V0IChzZWxmLT5yaW5nLCAwLCBPQk9FX1JJTkdfTEVOKTsKKyAgc2VsZi0+aW8ubWVtX2Jhc2UgPSAoX191MzIpIHNlbGYtPnJpbmc7CisKKyAgb2sgPSAxOworICBmb3IgKGkgPSAwOyBpIDwgVFhfU0xPVFM7ICsraSkKKyAgICB7CisgICAgICBzZWxmLT50eF9idWZzW2ldID0ga21hbGxvYyAoVFhfQlVGX1NaLCBHRlBfS0VSTkVMKTsKKyAgICAgIGlmICghc2VsZi0+dHhfYnVmc1tpXSkKKyAgICAgICAgb2sgPSAwOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgUlhfU0xPVFM7ICsraSkKKyAgICB7CisgICAgICBzZWxmLT5yeF9idWZzW2ldID0ga21hbGxvYyAoUlhfQlVGX1NaLCBHRlBfS0VSTkVMKTsKKyAgICAgIGlmICghc2VsZi0+cnhfYnVmc1tpXSkKKyAgICAgICAgb2sgPSAwOworICAgIH0KKworICBpZiAoIW9rKQorICAgIHsKKyAgICAgIHByaW50ayAoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogY2FuJ3QgYWxsb2NhdGUgcngvdHggYnVmZmVyc1xuIik7CisgICAgICBlcnIgPSAtRU5PTUVNOworICAgICAgZ290byBmcmVlYnVmczsKKyAgICB9CisKKworI2lmZGVmIFVTRV9QUk9CRQorICBpZiAoZG9fcHJvYmUpCisgICAgaWYgKCF0b3Nob2JvZV9wcm9iZSAoc2VsZikpCisgICAgICB7CisgICAgICAgIGVyciA9IC1FTk9ERVY7CisgICAgICAgIGdvdG8gZnJlZWJ1ZnM7CisgICAgICB9CisjZW5kaWYKKworICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgIFNFVF9ORVRERVZfREVWKGRldiwgJnBjaV9kZXYtPmRldik7CisgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gdG9zaG9ib2VfaGFyZF94bWl0OworICBkZXYtPm9wZW4gPSB0b3Nob2JvZV9uZXRfb3BlbjsKKyAgZGV2LT5zdG9wID0gdG9zaG9ib2VfbmV0X2Nsb3NlOworICBkZXYtPmRvX2lvY3RsID0gdG9zaG9ib2VfbmV0X2lvY3RsOworCisgIGVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIHByaW50ayAoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKyAgICAgIGVyciA9IC1FTk9NRU07CisgICAgICBnb3RvIGZyZWVidWZzOworICAgIH0KKyAgcHJpbnRrIChLRVJOX0lORk8gIklyREE6IFJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCisgIHBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LHNlbGYpOworCisgIHByaW50ayAoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IFVzaW5nIG11bHRpcGxlIHRhc2tzLCB2ZXJzaW9uICVzXG4iLCByY3NpZCk7CisKKyAgcmV0dXJuIDA7CisKK2ZyZWVidWZzOgorICBmb3IgKGkgPSAwOyBpIDwgVFhfU0xPVFM7ICsraSkKKyAgICBpZiAoc2VsZi0+dHhfYnVmc1tpXSkKKyAgICAgIGtmcmVlIChzZWxmLT50eF9idWZzW2ldKTsKKyAgZm9yIChpID0gMDsgaSA8IFJYX1NMT1RTOyArK2kpCisgICAgaWYgKHNlbGYtPnJ4X2J1ZnNbaV0pCisgICAgICBrZnJlZSAoc2VsZi0+cnhfYnVmc1tpXSk7CisgIGtmcmVlKHNlbGYtPnJpbmdidWYpOworCitmcmVlcmVnaW9uOgorICByZWxlYXNlX3JlZ2lvbiAoc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQpOworCitmcmVlc2VsZjoKKyAgZnJlZV9uZXRkZXYoZGV2KTsKKworICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50Cit0b3Nob2JvZV9nb3Rvc2xlZXAgKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBwbV9tZXNzYWdlX3QgY3JhcCkKK3sKKyAgc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmID0gKHN0cnVjdCB0b3Nob2JvZV9jYiopcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICBpbnQgaSA9IDEwOworCisgIElSREFfREVCVUcgKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisgIGlmICghc2VsZiB8fCBzZWxmLT5zdG9wcGVkKQorICAgIHJldHVybiAwOworCisgIGlmICgoIXNlbGYtPmlyZGFkKSAmJiAoIXNlbGYtPmFzeW5jKSkKKyAgICByZXR1cm4gMDsKKworLyogRmx1c2ggYWxsIHBhY2tldHMgKi8KKyAgd2hpbGUgKChpLS0pICYmIChzZWxmLT50eHBlbmRpbmcpKQorICAgIHVkZWxheSAoMTAwMDApOworCisgIHNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisgIHRvc2hvYm9lX3N0b3BjaGlwIChzZWxmKTsKKyAgc2VsZi0+c3RvcHBlZCA9IDE7CisgIHNlbGYtPnR4cGVuZGluZyA9IDA7CisKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Rvc2hvYm9lX3dha2V1cCAoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisgIHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZiA9IChzdHJ1Y3QgdG9zaG9ib2VfY2IqKXBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICBJUkRBX0RFQlVHICg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworICBpZiAoIXNlbGYgfHwgIXNlbGYtPnN0b3BwZWQpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCghc2VsZi0+aXJkYWQpICYmICghc2VsZi0+YXN5bmMpKQorICAgIHJldHVybiAwOworCisgIHNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisgIHRvc2hvYm9lX3N0YXJ0Y2hpcCAoc2VsZik7CisgIHNlbGYtPnN0b3BwZWQgPSAwOworCisgIG5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkb25hdWJvZV9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJkb25hdWJvZSIsCisJLmlkX3RhYmxlCT0gdG9zaG9ib2VfcGNpX3RibCwKKwkucHJvYmUJCT0gdG9zaG9ib2Vfb3BlbiwKKwkucmVtb3ZlCQk9IHRvc2hvYm9lX2Nsb3NlLAorCS5zdXNwZW5kCT0gdG9zaG9ib2VfZ290b3NsZWVwLAorCS5yZXN1bWUJCT0gdG9zaG9ib2Vfd2FrZXVwIAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2RvbmF1Ym9lX2luaXQgKHZvaWQpCit7CisgIHJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRvbmF1Ym9lX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2RvbmF1Ym9lX2NsZWFudXAgKHZvaWQpCit7CisgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZG9uYXVib2VfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGRvbmF1Ym9lX2luaXQpOworbW9kdWxlX2V4aXQoZG9uYXVib2VfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmggYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiMTczZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvZG9uYXVib2UuaApAQCAtMCwwICsxLDM2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICB0b3Nob2JvZS5oCisgKiBWZXJzaW9uOiAgICAgICAyLjE2CisgKiBEZXNjcmlwdGlvbjogICBEcml2ZXIgZm9yIHRoZSBUb3NoaWJhIE9CT0UgKG9yIHR5cGUtTyBvciA3MDEpCisgKiAgICAgICAgICAgICAgICBGSVIgQ2hpcHNldCwgYWxzbyBzdXBwb3J0cyB0aGUgRE9OQVVPQk9FICh0eXBlLURPCisgKiAgICAgICAgICAgICAgICBvciBkMDEpIEZJUiBjaGlwc2V0IHdoaWNoIGFzIGZhciBhcyBJIGtub3cgaXMKKyAqICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbXBhdGlibGUuCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBKYW1lcyBNY0tlbnppZSA8amFtZXNAZmlzaHNvdXAuZGhzLm9yZz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFNhdCBNYXkgOCAgMTI6MzU6MjcgMTk5OQorICogTW9kaWZpZWQ6IDIuMTYgTWFydGluIEx1Y2luYSA8bWF0b0Brb3RlbG5hLnNrPgorICogTW9kaWZpZWQ6IDIuMTYgU2F0IEp1biAyMiAxODo1NDoyOSAyMDAyIChzeW5jIGhlYWRlcnMpCisgKiBNb2RpZmllZDogMi4xNyBDaHJpc3RpYW4gR2VubmVyYXQgPGNocmlzdGlhbi5nZW5uZXJhdEBwb2x5dGVjaG5pcXVlLm9yZz4KKyAqIE1vZGlmaWVkOiAyLjE3IGpldSBzZXAgMTIgMDg6NTA6MjAgMjAwMiAoYWRkIGxvY2sgdG8gYmUgdXNlZCBieSBzcGlubG9ja3MpCisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgSmFtZXMgTWNLZW56aWUsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgTmVpdGhlciBKYW1lcyBNY0tlbnppZSBub3IgQ2FtYnJpZGdlIFVuaXZlcnNpdHkgYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqIAorICogICAgIEFwcGxpY2FibGUgTW9kZWxzIDogTGlicmV0dG8gMTAwLzExMENUIGFuZCBtYW55IG1vcmUuCisgKiAgICAgVG9zaGliYSByZWZlcnMgdG8gdGhpcyBjaGlwIGFzIHRoZSB0eXBlLU8gSVIgcG9ydCwKKyAqICAgICBvciB0aGUgdHlwZS1ETyBJUiBwb3J0LgorICoKKyAqIElyREEgY2hpcCBzZXQgbGlzdCBmcm9tIFRvc2hpYmEgQ29tcHV0ZXIgRW5naW5lZXJpbmcgQ29ycC4KKyAqIG1vZGVsCQkJbWV0aG9kCW1ha2VyCWNvbnRyb2xlcgkJVmVyc2lvbiAKKyAqIFBvcnRlZ2UgMzIwQ1QJRklSLFNJUiBUb3NoaWJhIE9ib2UoVHJpYW5nbGUpIAorICogUG9ydGVnZSAzMDEwQ1QJRklSLFNJUiBUb3NoaWJhIE9ib2UoU3lkbmV5KSAKKyAqIFBvcnRlZ2UgMzAxNUNUCUZJUixTSVIgVG9zaGliYSBPYm9lKFN5ZG5leSkgCisgKiBQb3J0ZWdlIDMwMjBDVAlGSVIsU0lSIFRvc2hpYmEgT2JvZShTeWRuZXkpIAorICogUG9ydGVnZSA3MDIwQ1QJRklSLFNJUiA/CQk/CisgKiAKKyAqIFNhdGVsbC4gNDA5MFhDRFQJRklSLFNJUiA/CQk/CisgKiAKKyAqIExpYnJldHRvIDEwMENUCUZJUixTSVIgVG9zaGliYSBPYm9lIAorICogTGlicmV0dG8gMTAwMENUCUZJUixTSVIgVG9zaGliYSBPYm9lIAorICogCisgKiBURUNSQTc1MERWRAkJRklSLFNJUiBUb3NoaWJhIE9ib2UoVHJpYW5nbGUpCVJFViBJRD0xNGggCisgKiBURUNSQTc4MAkJCUZJUixTSVIgVG9zaGliYSBPYm9lKFNhbmRsb3QpCVJFViBJRD0zMmgsMzNoIAorICogVEVDUkE3NTBDRFQJCUZJUixTSVIgVG9zaGliYSBPYm9lKFRyaWFuZ2xlKQlSRVYgSUQ9MTNoLDE0aCAKKyAqIFRFQ1JBODAwMAkJRklSLFNJUiBUb3NoaWJhIE9ib2UoSVNLVVIpCQlSRVYgSUQ9MjNoIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNoaXAgaXMgYWxsZWdlZGx5IHJlbGVhc2VkICAgICAgICAgKi8KKy8qIEhvd2V2ZXIgSSBoYXZlIG5vdCBzZWVuIGl0LCBub3QgaGF2ZSBJIG1hbmFnZWQgdG8gY29udGFjdCAgICAgKi8KKy8qIGFueW9uZSB3aG8gaGFzLiBIT1dFVkVSIHRoZSBjaGlwIGJlYXJzIGEgc3RyaWtpbmcgcmVzZW1ibGVuY2UgKi8KKy8qIHRvIHRoZSBJckRBIGNvbnRyb2xsZXIgaW4gdGhlIFRvc2hpYmEgUklTQyBUTVBSMzkyMiBjaGlwICAgICAgKi8KKy8qIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGlzIGZyZWVseSBhdmFpbGFibGUgYXQgICAgICAgICAgICAgKi8KKy8qIGh0dHA6Ly93d3cudG9zaGliYS5jb20vdGFlYy9jb21wb25lbnRzL0dlbmVyaWMvVE1QUjM5MjIuc2h0bWwgKi8KKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gdGhlIHJlZ2lzdGVycyBpbiB0aGF0IGRvY3VtZW50IGFuZCB0aGUgICAgKi8KKy8qIFJlZ2lzdGVycyBpbiB0aGUgNzAxIG9ib2UgY2hpcCBhcmUgYXMgZm9sbG93cyAgICAqLworCisKKy8qIDM5MjIgcmVnICAgICA3MDEgcmVncywgYnkgYml0IG51bWJlcnMgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICA3LSAwICAxNS0gOCAgMjQtMTYgIDMxLTI1ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAkMjggICAgICAgICAgICAweDAgICAgMHgxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICQyYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUUgTk9URSAxICAgICAgICAgICAqLworLyogJDMwICAgICAgICAgICAgMHg2ICAgIDB4NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAkMzQgICAgICAgICAgICAweDggICAgMHg5ICAgICAgICAgICAgICAgU0VFIE5PVEUgMiAgICAgICAgICAgKi8KKy8qICQzOCAgICAgICAgICAgMHgxMCAgIDB4MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogJDNDICAgICAgICAgICAgICAgICAgIDB4ZSAgICAgICAgICAgICAgIFNFRSBOT1RFIDMgICAgICAgICAgICovCisvKiAkNDAgICAgICAgICAgIDB4MTIgICAweDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICQ0NCAgICAgICAgICAgMHgxNCAgIDB4MTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogJDQ4ICAgICAgICAgICAweDE2ICAgMHgxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAkNGMgICAgICAgICAgIDB4MTggICAweDE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICQ1MCAgICAgICAgICAgMHgxYSAgIDB4MWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBGSVhNRTogY291bGQgYmUgMHgxYiAweDFhIGhlcmUgKi8KKworLyogJDU0ICAgICAgICAgICAweDFkICAgMHgxYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAkNUMgICAgICAgICAgIDB4ZiAgICAgICAgICAgICAgICAgICAgICAgU0VFIE5PVEUgNCAgICAgICAgICAgKi8KKy8qICQxMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUUgTk9URSA1ICAgICAgICAgICAqLworLyogJDEzNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFRSBOT1RFIDYgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogMS4gVGhlIHBvaW50ZXIgdG8gcmluZyBpcyBwYWNrZWQgaW4gbW9zdCB1bmNlcmVtb25pdXNseSAgICAgICovCisvKiAgICA3MDEgUmVnaXN0ZXIgICAgICBBZGRyZXNzIGJpdHMgICAgKEE5LUEwIG11c3QgYmUgemVybykgICAgKi8KKy8qICAgICAgICAgICAgMHg0OiAgICAgIEExNyBBMTYgQTE1IEExNCBBMTMgQTEyIEExMSBBMTAgICAgICAgICAqLworLyogICAgICAgICAgICAweDU6ICAgICAgQTI1IEEyNCBBMjMgQTIyIEEyMSBBMjAgQTE5IEExOCAgICAgICAgICovCisvKiAgICAgICAgICAgIDB4MjogICAgICAgIDAgICAwIEEzMSBBMzAgQTI5IEEyOCBBMjcgQTI2ICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogMi4gVGhlIE0kIGRyaXZlcnMgZG8gYSB3cml0ZSAweDEgdG8gMHg5LCBob3dldmVyIHRoZSAzOTIyICAgICovCisvKiAgICBkb2N1bWVudGF0aW9uIHdvdWxkIHN1Z2dlc3QgdGhhdCBhIHdyaXRlIG9mIDB4MSB0byAweDggICAgKi8KKy8qICAgIHdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAzLiBUaGlzIGFzc2lnbm1lbnQgaXMgdGVudW91cyBhdCBiZXN0LCByZWdpc3RlciAweGUgc2VlbXMgdG8gKi8KKy8qICAgIGhhdmUgYml0cyBhcnJhbmdlZCAwIDAgMCBSL1cgUi9XIFIvVyBSL1cgUi9XICAgICAgICAgICAgICAqLworLyogICAgaWYgZWl0aGVyIG9mIHRoZSBsb3dlciB0d28gYml0cyBhcmUgc2V0IHRoZSBjaGlwIHNlZW1zIHRvICovCisvKiAgICBzd2l0Y2ggb2ZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogNC4gQml0cyA3LTQgc2VlbSB0byBiZSBkaWZmZXJlbnQgNCBzZWVtcyBqdXN0IHRvIGJlIGdlbmVyaWMgICovCisvKiAgICByZWNlaXZlciBidXN5IGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogNS4gYW5kIDYuIFRoZSBJRVIgYW5kIElTUiBoYXZlIGEgZGlmZmVyZW50IGJpdCBhc3NpZ25tZW50ICAgICovCisvKiAgICBUaGUgbG93ZXIgdGhyZWUgYml0cyBvZiBib3RoIHJlYWQgYmFjayBhcyBvbmVzICAgICAgICAgICAgKi8KKy8qIElTUiBpcyByZWdpc3RlciAweGMsIElFUiBpcyByZWdpc3RlciAweGQgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgIDcgICAgICA2ICAgICAgNSAgICAgIDQgICAgICAzICAgICAgMiAgICAgIDEgICAgICAwICovCisvKiAweGM6IFR4RG9uZSBSeERvbmUgVHhVbmRyIFJ4T3ZlciBTaXBSY3YgICAgICAxICAgICAgMSAgICAgIDEgKi8KKy8qIDB4ZDogVHhEb25lIFJ4RG9uZSBUeFVuZHIgUnhPdmVyIFNpcFJjdiAgICAgIDEgICAgICAxICAgICAgMSAqLworLyogVHhEb25lIHhtaXR0IGRvbmUgKGdlbmVyYXRlZCBvbmx5IGlmIGdlbmVyYXRlIGludGVycnVwdCBiaXQgICovCisvKiAgIGlzIHNldCBpbiB0aGUgcmluZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJ4RG9uZSByZWN2IGNvbXBsZXRlZCAob3Igb3RoZXIgcmVjdiBjb25kaXRpb24gaWYgeW91IHNldCBpdCAqLworLyogICB1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUeFVuZGVyIHVuZGVyZmxvdyBpbiBUcmFuc21pdCBGSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJ4T3ZlciAgb3ZlcmZsb3cgaW4gUmVjdiBGSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogU2lwUmN2ICByZWNlaXZlZCBzZXJpYWwgZ2FwICAob3Igb3RoZXIgY29uZGl0aW9uIHlvdSBzZXQpICAgICovCisvKiBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGJ5IHdyaXRpbmcgYSBvbmUgdG8gdGhlIElFUiByZWdpc3RlciAgKi8KKy8qIEludGVycnVwdHMgYXJlIGNsZWFyZWQgYnkgd3JpdHRpbmcgYSBvbmUgdG8gdGhlIElTUiByZWdpc3RlciAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA2LiBUaGUgcmVtYWluaW5nIHJlZ2lzdGVyczogMHg2IGFuZCAweDMgYXBwZWFyIHRvIGJlICAgICAgICAgKi8KKy8qICAgIHJlc2VydmVkIHBhcnRzIG9mIDE2IG9yIDMyIGJpdCByZWdpc3RlcnN0aGUgcmVtYWluZGVyICAgICAqLworLyogICAgMHhhIDB4YiAweDFlIDB4MWYgY291bGQgcG9zc2libHkgYmUgKGJ5IHRoZWlyIGJlaGF2aW91cikgICovCisvKiAgICB0aGUgVW5pY2FzdCBGaWx0ZXIgcmVnaXN0ZXIgYXQgJDU4LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogNy4gV2hpbGUgdGhlIGNvcmUgb2J2aW91c2x5IGV4cGVjdHMgMzIgYml0IGFjY2Vzc2VzIGFsbCB0aGUgICovCisvKiAgICBNJCBkcml2ZXJzIGRvIDggYml0IGFjY2Vzc2VzLCBpbmZhY3QgdGhlIE1pbmlwb3J0IG9uZXMgICAgKi8KKy8qICAgIHdyaXRlIGFuZCByZWFkIGJhY2sgdGhlIGJ5dGUgc2VydmVyYWwgdGltZXMgKHdoeT8pICAgICAgICAqLworCisKKyNpZm5kZWYgVE9TSE9CT0VfSAorI2RlZmluZSBUT1NIT0JPRV9ICisKKy8qIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIE9CT0VfSU9fRVhURU5UCTB4MWYKKworLypSZWNlaXZlIGFuZCB0cmFuc21pdCBzbG90IHBvaW50ZXJzICovCisjZGVmaW5lIE9CT0VfUkVHKGkpCShpKyhzZWxmLT5iYXNlKSkKKyNkZWZpbmUgT0JPRV9SWFNMT1QJT0JPRV9SRUcoMHgwKQorI2RlZmluZSBPQk9FX1RYU0xPVAlPQk9FX1JFRygweDEpCisjZGVmaW5lIE9CT0VfU0xPVF9NQVNLCTB4M2YKKworI2RlZmluZSBPQk9FX1RYUklOR19PRkZTRVQJCTB4MjAwCisjZGVmaW5lIE9CT0VfVFhSSU5HX09GRlNFVF9JTl9TTE9UUwkweDQwCisKKy8qcG9pbnRlciB0byB0aGUgcmluZyAqLworI2RlZmluZSBPQk9FX1JJTkdfQkFTRTAJT0JPRV9SRUcoMHg0KQorI2RlZmluZSBPQk9FX1JJTkdfQkFTRTEJT0JPRV9SRUcoMHg1KQorI2RlZmluZSBPQk9FX1JJTkdfQkFTRTIJT0JPRV9SRUcoMHgyKQorI2RlZmluZSBPQk9FX1JJTkdfQkFTRTMJT0JPRV9SRUcoMHgzKQorCisvKk51bWJlciBvZiBzbG90cyBpbiB0aGUgcmluZyAqLworI2RlZmluZSBPQk9FX1JJTkdfU0laRSAgT0JPRV9SRUcoMHg3KQorI2RlZmluZSBPQk9FX1JJTkdfU0laRV9SWDQJMHgwMAorI2RlZmluZSBPQk9FX1JJTkdfU0laRV9SWDgJMHgwMQorI2RlZmluZSBPQk9FX1JJTkdfU0laRV9SWDE2CTB4MDMKKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkVfUlgzMgkweDA3CisjZGVmaW5lIE9CT0VfUklOR19TSVpFX1JYNjQJMHgwZgorI2RlZmluZSBPQk9FX1JJTkdfU0laRV9UWDQJMHgwMAorI2RlZmluZSBPQk9FX1JJTkdfU0laRV9UWDgJMHgxMAorI2RlZmluZSBPQk9FX1JJTkdfU0laRV9UWDE2CTB4MzAKKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkVfVFgzMgkweDcwCisjZGVmaW5lIE9CT0VfUklOR19TSVpFX1RYNjQJMHhmMAorCisjZGVmaW5lIE9CT0VfUklOR19NQVhfU0laRQk2NAorCisvKkNhdXNlcyB0aGUgZ3ViYmlucyB0byByZS1leGFtaW5lIHRoZSByaW5nICovCisjZGVmaW5lIE9CT0VfUFJPTVBUCU9CT0VfUkVHKDB4OSkKKyNkZWZpbmUgT0JPRV9QUk9NUFRfQklUCQkweDEKKworLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBPQk9FX0lTUglPQk9FX1JFRygweGMpCisvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIE9CT0VfSUVSCU9CT0VfUkVHKDB4ZCkKKy8qIEludGVycnVwdCBiaXRzIGZvciBJRVIgYW5kIElTUiAqLworI2RlZmluZSBPQk9FX0lOVF9UWERPTkUJCTB4ODAKKyNkZWZpbmUgT0JPRV9JTlRfUlhET05FCQkweDQwCisjZGVmaW5lIE9CT0VfSU5UX1RYVU5ERVIJMHgyMAorI2RlZmluZSBPQk9FX0lOVF9SWE9WRVIJCTB4MTAKKyNkZWZpbmUgT0JPRV9JTlRfU0lQCQkweDA4CisjZGVmaW5lIE9CT0VfSU5UX01BU0sJCTB4ZjgKKworLypSZXNldCBSZWdpc3RlciAqLworI2RlZmluZSBPQk9FX0NPTkZJRzEJT0JPRV9SRUcoMHhlKQorI2RlZmluZSBPQk9FX0NPTkZJRzFfUlNUCTB4MDEKKyNkZWZpbmUgT0JPRV9DT05GSUcxX0RJU0FCTEUJMHgwMgorI2RlZmluZSBPQk9FX0NPTkZJRzFfNAkJMHgwOAorI2RlZmluZSBPQk9FX0NPTkZJRzFfOAkJMHgwOAorCisjZGVmaW5lIE9CT0VfQ09ORklHMV9PTgkJMHg4CisjZGVmaW5lIE9CT0VfQ09ORklHMV9SRVNFVAkweGYKKyNkZWZpbmUgT0JPRV9DT05GSUcxX09GRgkweGUKKworI2RlZmluZSBPQk9FX1NUQVRVUwlPQk9FX1JFRygweGYpCisjZGVmaW5lIE9CT0VfU1RBVFVTX1JYQlVTWQkweDEwCisjZGVmaW5lIE9CT0VfU1RBVFVTX0ZJUlJYCTB4MDQKKyNkZWZpbmUgT0JPRV9TVEFUVVNfTUlSUlgJMHgwMgorI2RlZmluZSBPQk9FX1NUQVRVU19TSVJSWAkweDAxCisKKworLypTcGVlZCBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBMCU9CT0VfUkVHKDB4MTApCisjZGVmaW5lIE9CT0VfQ09ORklHMEgJT0JPRV9SRUcoMHgxMSkKKworI2RlZmluZSBPQk9FX0NPTkZJRzBIX1RYT05MT09QICAweDgwIC8qVHJhbnNtaXQgd2hlbiBsb29waW5nIChkYW5nZXJvdXMpICovCisjZGVmaW5lIE9CT0VfQ09ORklHMEhfTE9PUAkweDQwIC8qTG9vcGJhY2sgVHgtPlJ4ICovCisjZGVmaW5lIE9CT0VfQ09ORklHMEhfRU5UWAkweDEwIC8qRW5hYmxlIFR4ICovCisjZGVmaW5lIE9CT0VfQ09ORklHMEhfRU5SWAkweDA4IC8qRW5hYmxlIFJ4ICovCisjZGVmaW5lIE9CT0VfQ09ORklHMEhfRU5ETUFDCTB4MDQgLypFbmFibGUvcmVzZXQqIHRoZSBETUEgY29udHJvbGxlciAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBIX1JDVkFOWQkweDAyIC8qRE1BIG1vZGUgMT1ieXRlcywgMD1kd29yZHMgKi8KKworI2RlZmluZSBPQk9FX0NPTkZJRzBMX0NSQzE2CTB4ODAgLypDUkMgMT0xNiBiaXQgMD0zMiBiaXQgKi8KKyNkZWZpbmUgT0JPRV9DT05GSUcwTF9FTkZJUgkweDQwIC8qRW5hYmxlIEZJUiAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBMX0VOTUlSCTB4MjAgLypFbmFibGUgTUlSICovCisjZGVmaW5lIE9CT0VfQ09ORklHMExfRU5TSVIJMHgxMCAvKkVuYWJsZSBTSVIgKi8KKyNkZWZpbmUgT0JPRV9DT05GSUcwTF9FTlNJUkYJMHgwOCAvKkVuYWJsZSBTSVIgZnJhbWVyICovCisjZGVmaW5lIE9CT0VfQ09ORklHMExfU0lSVEVTVAkweDA0IC8qRW5hYmxlIFNJUiBmcmFtZXIgaW4gTUlSIGFuZCBGSVIgKi8KKyNkZWZpbmUgT0JPRV9DT05GSUcwTF9JTlZFUlRUWCAgMHgwMiAvKkludmVydCBUeCBMaW5lICovCisjZGVmaW5lIE9CT0VfQ09ORklHMExfSU5WRVJUUlggIDB4MDEgLypJbnZlcnQgUnggTGluZSAqLworCisjZGVmaW5lIE9CT0VfQk9GCU9CT0VfUkVHKDB4MTIpCisjZGVmaW5lIE9CT0VfRU9GCU9CT0VfUkVHKDB4MTMpCisKKyNkZWZpbmUgT0JPRV9FTkFCTEVMCU9CT0VfUkVHKDB4MTQpCisjZGVmaW5lIE9CT0VfRU5BQkxFSAlPQk9FX1JFRygweDE1KQorCisjZGVmaW5lIE9CT0VfRU5BQkxFSF9QSFlBTkRDTE9DSwkweDgwIC8qVG9nZ2xlIGxvdyB0byBjb3B5IGNvbmZpZyBpbiAqLworI2RlZmluZSBPQk9FX0VOQUJMRUhfQ09ORklHRVJSCQkweDQwCisjZGVmaW5lIE9CT0VfRU5BQkxFSF9GSVJPTgkJMHgyMAorI2RlZmluZSBPQk9FX0VOQUJMRUhfTUlST04JCTB4MTAKKyNkZWZpbmUgT0JPRV9FTkFCTEVIX1NJUk9OCQkweDA4CisjZGVmaW5lIE9CT0VfRU5BQkxFSF9FTlRYCQkweDA0CisjZGVmaW5lIE9CT0VfRU5BQkxFSF9FTlJYCQkweDAyCisjZGVmaW5lIE9CT0VfRU5BQkxFSF9DUkMxNgkJMHgwMQorCisjZGVmaW5lIE9CT0VfRU5BQkxFTF9CUk9BRENBU1QJCTB4MDEKKworI2RlZmluZSBPQk9FX0NVUlJfUENPTkZJR0wJCU9CT0VfUkVHKDB4MTYpIC8qQ3VycmVudCBjb25maWcgKi8KKyNkZWZpbmUgT0JPRV9DVVJSX1BDT05GSUdICQlPQk9FX1JFRygweDE3KQorCisjZGVmaW5lIE9CT0VfTkVXX1BDT05GSUdMCQlPQk9FX1JFRygweDE4KQorI2RlZmluZSBPQk9FX05FV19QQ09ORklHSAkJT0JPRV9SRUcoMHgxOSkKKworI2RlZmluZSBPQk9FX1BDT05GSUdIX0JBVURNQVNLCQkweGZjCisjZGVmaW5lIE9CT0VfUENPTkZJR0hfV0lEVEhNQVNLCQkweDA0CisjZGVmaW5lIE9CT0VfUENPTkZJR0xfV0lEVEhNQVNLCQkweGUwCisjZGVmaW5lIE9CT0VfUENPTkZJR0xfUFJFQU1CTEVNQVNLCTB4MWYKKworI2RlZmluZSBPQk9FX1BDT05GSUdfQkFVRE1BU0sJCTB4ZmMwMAorI2RlZmluZSBPQk9FX1BDT05GSUdfQkFVRFNISUZUCQkxMAorI2RlZmluZSBPQk9FX1BDT05GSUdfV0lEVEhNQVNLCQkweDA0ZTAKKyNkZWZpbmUgT0JPRV9QQ09ORklHX1dJRFRIU0hJRlQJCTUKKyNkZWZpbmUgT0JPRV9QQ09ORklHX1BSRUFNQkxFTUFTSwkweDAwMWYKKyNkZWZpbmUgT0JPRV9QQ09ORklHX1BSRUFNQkxFU0hJRlQJMAorCisjZGVmaW5lIE9CT0VfTUFYTEVOTAkJCU9CT0VfUkVHKDB4MWEpCisjZGVmaW5lIE9CT0VfTUFYTEVOSAkJCU9CT0VfUkVHKDB4MWIpCisKKyNkZWZpbmUgT0JPRV9SWENPVU5USAkJCU9CT0VfUkVHKDB4MWMpIC8qUmVzZXQgb24gcmVjaXB0ICovCisjZGVmaW5lIE9CT0VfUlhDT1VOVEwJCQlPQk9FX1JFRygweDFkKSAvKm9mIHdob2xlIHBhY2tldCAqLworCisvKiBUaGUgUENJIElEIG9mIHRoZSBPQk9FIGNoaXAgKi8KKyNpZm5kZWYgUENJX0RFVklDRV9JRF9GSVI3MDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9GSVI3MDEgCTB4MDcwMQorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9GSVJEMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9GSVJEMDEgCTB4MGQwMQorI2VuZGlmCisKK3N0cnVjdCBPYm9lU2xvdAoreworICBfX3UxNiBsZW47ICAgICAgICAgICAgICAgICAgICAvKlR3ZWxldmUgYml0cyBvZiBwYWNrZXQgbGVuZ3RoICovCisgIF9fdTggdW51c2VkOworICBfX3U4IGNvbnRyb2w7ICAgICAgICAgICAgICAgICAvKlNsb3QgY29udHJvbC9zdGF0dXMgc2VlIGJlbG93ICovCisgIF9fdTMyIGFkZHJlc3M7ICAgICAgICAgICAgICAgIC8qU2xvdCBidWZmZXIgYWRkcmVzcyAqLworfQorX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIE9CT0VfTlRBU0tTIE9CT0VfVFhSSU5HX09GRlNFVF9JTl9TTE9UUworCitzdHJ1Y3QgT2JvZVJpbmcKK3sKKyAgc3RydWN0IE9ib2VTbG90IHJ4W09CT0VfTlRBU0tTXTsKKyAgc3RydWN0IE9ib2VTbG90IHR4W09CT0VfTlRBU0tTXTsKK307CisKKyNkZWZpbmUgT0JPRV9SSU5HX0xFTiAoc2l6ZW9mKHN0cnVjdCBPYm9lUmluZykpCisKKworI2RlZmluZSBPQk9FX0NUTF9UWF9IV19PV05TCTB4ODAgLypXL1IgVGhpcyBzbG90IG93bmVkIGJ5IHRoZSBoYXJkd2FyZSAqLworI2RlZmluZSBPQk9FX0NUTF9UWF9ESVNUWF9DUkMJMHg0MCAvKlcgRGlzYWJsZSBDUkMgZ2VuZXJhdGlvbiBmb3IgW0ZNXUlSICovCisjZGVmaW5lIE9CT0VfQ1RMX1RYX0JBRF9DUkMgICAgIDB4MjAgLypXIEdlbmVyYXRlIGJhZCBDUkMgKi8KKyNkZWZpbmUgT0JPRV9DVExfVFhfU0lQCQkweDEwICAgLypXIEdlbmVyYXRlIGFuIFNJUCBhZnRlciB4bWl0dGlvbiAqLworI2RlZmluZSBPQk9FX0NUTF9UWF9NS1VOREVSCTB4MDggLypXIEdlbmVyYXRlIGFuIHVuZGVycnVuIGVycm9yICovCisjZGVmaW5lIE9CT0VfQ1RMX1RYX1JUQ0VOVFgJMHgwNCAvKlcgRW5hYmxlIHJlY2VpdmVyIGFuZCBnZW5lcmF0ZSBUWGRvbmUgKi8KKyAgICAgLyogIEFmdGVyIHRoaXMgc2xvdCBpcyBwcm9jZXNzZWQgICAgICAgICovCisjZGVmaW5lIE9CT0VfQ1RMX1RYX1VOREVSCTB4MDEgIC8qUiBTZXQgYnkgaGFyZHdhcmUgdG8gaW5kaWNhdGUgdW5kZXJydW4gKi8KKworCisjZGVmaW5lIE9CT0VfQ1RMX1JYX0hXX09XTlMJMHg4MCAvKlcvUiBUaGlzIHNsb3Qgb3duZWQgYnkgaGFyZHdhcmUgKi8KKyNkZWZpbmUgT0JPRV9DVExfUlhfUEhZRVJSCTB4NDAgLypSIERlY29kZXIgZXJyb3Igb24gcmVjZWlwdGlvbiAqLworI2RlZmluZSBPQk9FX0NUTF9SWF9DUkNFUlIJMHgyMCAvKlIgQ1JDIGVycm9yIG9ubHkgc2V0IGZvciBbRk1dSVIgKi8KKyNkZWZpbmUgT0JPRV9DVExfUlhfTEVOR1RICTB4MTAgLypSIFBhY2tldCA+IG1heCBSeCBsZW5ndGggICovCisjZGVmaW5lIE9CT0VfQ1RMX1JYX09WRVIJMHgwOCAgIC8qUiBzZXQgdG8gaW5kaWNhdGUgYW4gb3ZlcmZsb3cgKi8KKyNkZWZpbmUgT0JPRV9DVExfUlhfU0lSQkFECTB4MDQgLypSIFNJUiBoYWQgQk9GIGluIHBhY2tldCBvciBBQk9SVCBzZXF1ZW5jZSAqLworI2RlZmluZSBPQk9FX0NUTF9SWF9SWEVPRgkweDAyICAvKlIgRmluaXNoZWQgcmVjZWl2aW5nIG9uIHRoaXMgc2xvdCAqLworCisKK3N0cnVjdCB0b3Nob2JvZV9jYgoreworICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAgICAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCisgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworICBzdHJ1Y3QgdHR5X2RyaXZlciB0dHlkZXY7CisKKyAgc3RydWN0IGlybGFwX2NiICppcmxhcDsgICAgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLworCisgIGNoaXBpb190IGlvOyAgICAgICAgICAgICAgICAgIC8qIElyREEgY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLworICBzdHJ1Y3QgcW9zX2luZm8gcW9zOyAgICAgICAgICAvKiBRb1MgY2FwYWJpbGl0aWVzIGZvciB0aGlzIGRldmljZSAqLworCisgIF9fdTMyIGZsYWdzOyAgICAgICAgICAgICAgICAgIC8qIEludGVyZmFjZSBmbGFncyAqLworCisgIHN0cnVjdCBwY2lfZGV2ICpwZGV2OyAgICAgICAgIC8qUENJIGRldmljZSAqLworICBpbnQgYmFzZTsgICAgICAgICAgICAgICAgICAgICAvKklPIGJhc2UgKi8KKworCisgIGludCB0eHBlbmRpbmc7ICAgICAgICAgICAgICAgIC8qaG93IG1hbnkgdHgncyBhcmUgcGVuZGluZyAqLworICBpbnQgdHhzLCByeHM7ICAgICAgICAgICAgICAgICAvKldoaWNoIHNsb3RzIGFyZSB3ZSBhdCAgKi8KKworICBpbnQgaXJkYWQ7ICAgICAgICAgICAgICAgICAgICAvKkRyaXZlciB1bmRlciBjb250cm9sIG9mIG5ldGRldiBlbmQgICovCisgIGludCBhc3luYzsgICAgICAgICAgICAgICAgICAgIC8qRHJpdmVyIHVuZGVyIGNvbnRyb2wgb2YgYXN5bmMgZW5kICAgKi8KKworCisgIGludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgIC8qU3RvcHBlZCBieSBzb21lIG9yIG90aGVyIEFQTSBzdHVmZiAqLworCisgIGludCBmaWx0ZXI7ICAgICAgICAgICAgICAgICAgIC8qSW4gU0lSIG1vZGUgZG8gd2Ugd2FudCB0byByZWNlaXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcyBvciBieXRlIHJhbmdlcyAqLworCisgIHZvaWQgKnJpbmdidWY7ICAgICAgICAgICAgICAgIC8qVGhlIHJpbmcgYnVmZmVyICovCisgIHN0cnVjdCBPYm9lUmluZyAqcmluZzsgICAgICAgIC8qVGhlIHJpbmcgKi8KKworICB2b2lkICp0eF9idWZzW09CT0VfUklOR19NQVhfU0laRV07IC8qVGhlIGJ1ZmZlcnMgICAqLworICB2b2lkICpyeF9idWZzW09CT0VfUklOR19NQVhfU0laRV07CisKKworICBpbnQgc3BlZWQ7ICAgICAgICAgICAgICAgICAgICAvKkN1cnJlbnQgc2V0dGluZyBvZiB0aGUgc3BlZWQgKi8KKyAgaW50IG5ld19zcGVlZDsgICAgICAgICAgICAgICAgLypTZXQgdG8gcmVxdWVzdCBhIHNwZWVkIGNoYW5nZSAqLworCisvKiBUaGUgc3BpbmxvY2sgcHJvdGVjdCBjcml0aWNhbCBwYXJ0cyBvZiB0aGUgZHJpdmVyLgorICoJTG9ja2luZyBpcyBkb25lIGxpa2UgdGhpcyA6CisgKgkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgKglSZWxlYXNpbmcgdGhlIGxvY2sgOgorICoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgKi8KKyAgc3BpbmxvY2tfdCBzcGlubG9jazsJCQorICAvKiBVc2VkIGZvciB0aGUgcHJvYmUgYW5kIGRpYWdub3N0aWNzIGNvZGUgKi8KKyAgaW50IGludF9yeDsKKyAgaW50IGludF90eDsKKyAgaW50IGludF90eHVuZGVyOworICBpbnQgaW50X3J4b3ZlcjsKKyAgaW50IGludF9zaXA7Cit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9lcDcyMTFfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvZXA3MjExX2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4OTYyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvZXA3MjExX2lyLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBJUiBwb3J0IGRyaXZlciBmb3IgdGhlIENpcnJ1cyBMb2dpYyBFUDcyMTEgcHJvY2Vzc29yLgorICoKKyAqIENvcHlyaWdodCAyMDAxLCBCbHVlIE11ZyBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisKKyNkZWZpbmUgTUlOX0RFTEFZIDI1ICAgICAgLyogMTUgdXMsIGJ1dCB3YWl0IGEgbGl0dGxlIG1vcmUgdG8gYmUgc3VyZSAqLworI2RlZmluZSBNQVhfREVMQVkgMTAwMDAgICAvKiAxIG1zICovCisKK3N0YXRpYyB2b2lkIGVwNzIxMV9pcl9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CitzdGF0aWMgdm9pZCBlcDcyMTFfaXJfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpOworc3RhdGljIGludCAgZXA3MjExX2lyX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKK3N0YXRpYyBpbnQgIGVwNzIxMV9pcl9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKKworc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZSA9IHsKKwkudHlwZSA9IElSREFfRVA3MjExX0lSLAorCS5vcGVuID0gZXA3MjExX2lyX29wZW4sCisJLmNsb3NlID0gZXA3MjExX2lyX2Nsb3NlLAorCS5yZXNldCA9IGVwNzIxMV9pcl9yZXNldCwKKwkuY2hhbmdlX3NwZWVkID0gZXA3MjExX2lyX2NoYW5nZV9zcGVlZCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyB2b2lkIGVwNzIxMV9pcl9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcykKK3sKKwl1bnNpZ25lZCBpbnQgc3lzY29uMSwgZmxhZ3M7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisKKwkvKiBUdXJuIG9uIHRoZSBTSVIgZW5jb2Rlci4gKi8KKwlzeXNjb24xID0gY2xwc19yZWFkbChTWVNDT04xKTsKKwlzeXNjb24xIHw9IFNZU0NPTjFfU0lSRU47CisJY2xwc193cml0ZWwoc3lzY29uMSwgU1lTQ09OMSk7CisKKwkvKiBYWFg6IFdlIHNob3VsZCBkaXNhYmxlIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRzIG9uIHRoZSBmaXJzdAorCQlVQVJUIChpbnRlcnJ1cHQgIzE0KS4gKi8KKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBlcDcyMTFfaXJfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpCit7CisJdW5zaWduZWQgaW50IHN5c2NvbjEsIGZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCisJLyogVHVybiBvZmYgdGhlIFNJUiBlbmNvZGVyLiAqLworCXN5c2NvbjEgPSBjbHBzX3JlYWRsKFNZU0NPTjEpOworCXN5c2NvbjEgJj0gflNZU0NPTjFfU0lSRU47CisJY2xwc193cml0ZWwoc3lzY29uMSwgU1lTQ09OMSk7CisKKwkvKiBYWFg6IElmIHdlJ3ZlIGRpc2FibGVkIHRoZSBtb2RlbSBzdGF0dXMgaW50ZXJydXB0cywgd2Ugc2hvdWxkCisJCXJlc2V0IHRoZW0gYmFjayB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZS4gKi8KKworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKgorICogRnVuY3Rpb24gZXA3MjExX2lyX2NoYW5nZV9zcGVlZCAodGFzaykKKyAqCisgKiAgICBDaGFuZ2Ugc3BlZWQgb2YgdGhlIEVQNzIxMSBJL1IgcG9ydC4gV2UgZG9uJ3QgcmVhbGx5IGhhdmUgdG8gZG8gYW55dGhpbmcKKyAqICAgIGZvciB0aGUgRVA3MjExIGFzIGxvbmcgYXMgdGhlIHJhdGUgaXMgYmVpbmcgY2hhbmdlZCBhdCB0aGUgc2VyaWFsIHBvcnQKKyAqICAgIGxldmVsLgorICovCitzdGF0aWMgaW50IGVwNzIxMV9pcl9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBlcDcyMTFfaXJfcmVzZXQgKHRhc2spCisgKgorICogICAgICBSZXNldCB0aGUgRVA3MjExIEkvUi4gV2UgZG9uJ3QgcmVhbGx5IGhhdmUgdG8gZG8gYW55dGhpbmcuCisgKgorICovCitzdGF0aWMgaW50IGVwNzIxMV9pcl9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGVwNzIxMV9pcl9pbml0KHZvaWQpCisgKgorICogICAgSW5pdGlhbGl6ZSBFUDcyMTEgSS9SIG1vZHVsZQorICoKKyAqLworc3RhdGljIGludCBfX2luaXQgZXA3MjExX2lyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCisvKgorICogRnVuY3Rpb24gZXA3MjExX2lyX2NsZWFudXAodm9pZCkKKyAqCisgKiAgICBDbGVhbnVwIEVQNzIxMSBJL1IgbW9kdWxlCisgKgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgZXA3MjExX2lyX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworTU9EVUxFX0FVVEhPUigiSm9uIE1jQ2xpbnRvY2sgPGpvbm1AYmx1ZW11Zy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVQNzIxMSBJL1IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTgiKTsgLyogSVJEQV9FUDcyMTFfSVIgKi8KKwkJCittb2R1bGVfaW5pdChlcDcyMTFfaXJfaW5pdCk7Cittb2R1bGVfZXhpdChlcDcyMTFfaXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2VzaS1zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvZXNpLXNpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MDhkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2VzaS1zaXIuYwpAQCAtMCwwICsxLDE1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBlc2kuYworICogVmVyc2lvbjogICAgICAgMS42CisgKiBEZXNjcmlwdGlvbjogICBEcml2ZXIgZm9yIHRoZSBFeHRlbmRlZCBTeXN0ZW1zIEpldEV5ZSBQQyBkb25nbGUKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFNhdCBGZWIgMjEgMTg6NTQ6MzggMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgU3VuIE9jdCAyNyAyMjowMTowNCAyMDAyCisgKiBNb2RpZmllZCBieTogICBNYXJ0aW4gRGllaGwgPG1hZEBtZGllaGwuZGU+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgRGFnIEJyYXR0bGksIDxkYWdiQGNzLnVpdC5ubz4sCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4IFRob21hcyBEYXZpcywgPHJhdGJlcnRAcmFkaWtzLm5ldD4sCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAyIE1hcnRpbiBEaWVobCwgPG1hZEBtZGllaGwuZGU+LAorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKworI2luY2x1ZGUgInNpci1kZXYuaCIKKworc3RhdGljIGludCBlc2lfb3BlbihzdHJ1Y3Qgc2lyX2RldiAqKTsKK3N0YXRpYyBpbnQgZXNpX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICopOworc3RhdGljIGludCBlc2lfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICosIHVuc2lnbmVkKTsKK3N0YXRpYyBpbnQgZXNpX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICopOworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgZXNpID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJPSAiSmV0RXllIFBDIEVTSS05NjgwIFBDIiwKKwkudHlwZQkJPSBJUkRBX0VTSV9ET05HTEUsCisJLm9wZW4JCT0gZXNpX29wZW4sCisJLmNsb3NlCQk9IGVzaV9jbG9zZSwKKwkucmVzZXQJCT0gZXNpX3Jlc2V0LAorCS5zZXRfc3BlZWQJPSBlc2lfY2hhbmdlX3NwZWVkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZXNpX3Npcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKCZlc2kpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXNpX3Npcl9jbGVhbnVwKHZvaWQpCit7CisJaXJkYV91bnJlZ2lzdGVyX2RvbmdsZSgmZXNpKTsKK30KKworc3RhdGljIGludCBlc2lfb3BlbihzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCXN0cnVjdCBxb3NfaW5mbyAqcW9zID0gJmRldi0+cW9zOworCisJLyogUG93ZXIgdXAgYW5kIHNldCBkb25nbGUgdG8gOTYwMCBiYXVkICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIFRSVUUpOworCisJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwfElSXzE5MjAwfElSXzExNTIwMDsKKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4MDE7IC8qIE5lZWRzIGF0IGxlYXN0IDEwIG1zICovCisJaXJkYV9xb3NfYml0c190b192YWx1ZShxb3MpOworCisJLyogaXJkYSB0aHJlYWQgd2FpdHMgNTAgbXNlYyBmb3IgcG93ZXIgc2V0dGxpbmcgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVzaV9jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgRkFMU0UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBlc2lfY2hhbmdlX3NwZWVkICh0YXNrKQorICoKKyAqIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBFeHRlbmRlZCBTeXN0ZW1zIEpldEV5ZSBQQyBFU0ktOTY4MCB0eXBlIGRvbmdsZQorICogQXBwYXJlbnRseSAoc2VlIG9sZCBlc2ktZHJpdmVyKSBubyBkZWxheXMgYXJlIG5lZWRlZCBoZXJlLi4uCisgKgorICovCitzdGF0aWMgaW50IGVzaV9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCit7CisJaW50IHJldCA9IDA7CisJaW50IGR0ciwgcnRzOworCQorCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIDE5MjAwOgorCQlkdHIgPSBUUlVFOworCQlydHMgPSBGQUxTRTsKKwkJYnJlYWs7CisJY2FzZSAxMTUyMDA6CisJCWR0ciA9IHJ0cyA9IFRSVUU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCXNwZWVkID0gOTYwMDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSA5NjAwOgorCQlkdHIgPSBGQUxTRTsKKwkJcnRzID0gVFJVRTsKKwkJYnJlYWs7CisJfQorCisJLyogQ2hhbmdlIHNwZWVkIG9mIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIGR0ciwgcnRzKTsKKwlkZXYtPnNwZWVkID0gc3BlZWQ7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gZXNpX3Jlc2V0ICh0YXNrKQorICoKKyAqICAgIFJlc2V0IGRvbmdsZTsKKyAqCisgKi8KK3N0YXRpYyBpbnQgZXNpX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIEZBTFNFKTsKKworCS8qIEhtLCB0aGUgb2xkIGVzaS1kcml2ZXIgbGVmdCB0aGUgZG9uZ2xlIHVucG93ZXJlZCByZWx5aW5nIG9uCisJICogdGhlIGZvbGxvd2luZyBzcGVlZCBjaGFuZ2UgdG8gcmVwb3dlci4gVGhpcyBtaWdodCB3b3JrIGZvcgorCSAqIHRoZSBlc2kgYmVjYXVzZSB3ZSBvbmx5IG5lZWQgdGhlIG1vZGVtIGxpbmVzLiBIb3dldmVyLCBub3cgdGhlCisJICogZ2VuZXJhbCBydWxlIGlzIHJlc2V0IG11c3QgYnJpbmcgdGhlIGRvbmdsZSB0byBzb21lIHdvcmtpbmcKKwkgKiB3ZWxsLWtub3duIHN0YXRlIGJlY2F1c2Ugc3BlZWQgY2hhbmdlIG1pZ2h0IHdyaXRlIHRvIHJlZ2lzdGVycy4KKwkgKiBUaGUgb2xkIGVzaS1kcml2ZXIgZGlkbid0IGFueSBkZWxheSBoZXJlIC0gbGV0J3MgaG9wZSBpdCcgZmluZS4KKwkgKi8KKworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBUUlVFKTsKKwlkZXYtPnNwZWVkID0gOTYwMDsKKworCXJldHVybiAwOworfQorCitNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkV4dGVuZGVkIFN5c3RlbXMgSmV0RXllIFBDIGRvbmdsZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtMSIpOyAvKiBJUkRBX0VTSV9ET05HTEUgKi8KKworbW9kdWxlX2luaXQoZXNpX3Npcl9pbml0KTsKK21vZHVsZV9leGl0KGVzaV9zaXJfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvZXNpLmMgYi9kcml2ZXJzL25ldC9pcmRhL2VzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYTYxYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2VzaS5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGVzaS5jCisgKiBWZXJzaW9uOiAgICAgICAxLjUKKyAqIERlc2NyaXB0aW9uOiAgIERyaXZlciBmb3IgdGhlIEV4dGVuZGVkIFN5c3RlbXMgSmV0RXllIFBDIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgU2F0IEZlYiAyMSAxODo1NDozOCAxOTk4CisgKiBNb2RpZmllZCBhdDogICBGcmkgRGVjIDE3IDA5OjE0OjA0IDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OSBEYWcgQnJhdHRsaSwgPGRhZ2JAY3MudWl0Lm5vPiwKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTggVGhvbWFzIERhdmlzLCA8cmF0YmVydEByYWRpa3MubmV0PiwKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworc3RhdGljIHZvaWQgZXNpX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKTsKK3N0YXRpYyB2b2lkIGVzaV9jbG9zZShkb25nbGVfdCAqc2VsZik7CitzdGF0aWMgaW50ICBlc2lfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworc3RhdGljIGludCAgZXNpX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9yZWcgZG9uZ2xlID0geworCS50eXBlID0gSVJEQV9FU0lfRE9OR0xFLAorCS5vcGVuID0gZXNpX29wZW4sCisJLmNsb3NlID0gZXNpX2Nsb3NlLAorCS5yZXNldCA9IGVzaV9yZXNldCwKKwkuY2hhbmdlX3NwZWVkID0gZXNpX2NoYW5nZV9zcGVlZCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVzaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVzaV9jbGVhbnVwKHZvaWQpCit7CisJaXJkYV9kZXZpY2VfdW5yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK3N0YXRpYyB2b2lkIGVzaV9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcykKK3sKKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMTE1MjAwOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMTsgLyogTmVlZHMgYXQgbGVhc3QgMTAgbXMgKi8KK30KKworc3RhdGljIHZvaWQgZXNpX2Nsb3NlKGRvbmdsZV90ICpkb25nbGUpCit7CQkKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJZG9uZ2xlLT5zZXRfZHRyX3J0cyhkb25nbGUtPmRldiwgRkFMU0UsIEZBTFNFKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGVzaV9jaGFuZ2Vfc3BlZWQgKHRhc2spCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIEV4dGVuZGVkIFN5c3RlbXMgSmV0RXllIFBDIEVTSS05NjgwIHR5cGUgZG9uZ2xlCisgKgorICovCitzdGF0aWMgaW50IGVzaV9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwlfX3UzMiBzcGVlZCA9IChfX3UzMikgdGFzay0+cGFyYW07CisJaW50IGR0ciwgcnRzOworCQorCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIDE5MjAwOgorCQlkdHIgPSBUUlVFOworCQlydHMgPSBGQUxTRTsKKwkJYnJlYWs7CisJY2FzZSAxMTUyMDA6CisJCWR0ciA9IHJ0cyA9IFRSVUU7CisJCWJyZWFrOworCWNhc2UgOTYwMDoKKwlkZWZhdWx0OgorCQlkdHIgPSBGQUxTRTsKKwkJcnRzID0gVFJVRTsKKwkJYnJlYWs7CisJfQorCisJLyogQ2hhbmdlIHNwZWVkIG9mIGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgZHRyLCBydHMpOworCXNlbGYtPnNwZWVkID0gc3BlZWQ7CisKKwlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGVzaV9yZXNldCAodGFzaykKKyAqCisgKiAgICBSZXNldCBkb25nbGU7CisgKgorICovCitzdGF0aWMgaW50IGVzaV9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCQorCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKKwlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFeHRlbmRlZCBTeXN0ZW1zIEpldEV5ZSBQQyBkb25nbGUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTEiKTsgLyogSVJEQV9FU0lfRE9OR0xFICovCisKKy8qCisgKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplIEVTSSBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9pbml0KGVzaV9pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgRVNJIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2V4aXQoZXNpX2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2dpcmJpbC1zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvZ2lyYmlsLXNpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMmZlODdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9naXJiaWwtc2lyLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgICBnaXJiaWwuYworICogVmVyc2lvbjogICAgICAgMS4yCisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEdyZWVud2ljaCBHSXJCSUwgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTYXQgRmViICA2IDIxOjAyOjMzIDE5OTkKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBEZWMgMTcgMDk6MTM6MjAgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcworICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKworI2luY2x1ZGUgInNpci1kZXYuaCIKKworc3RhdGljIGludCBnaXJiaWxfcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldik7CitzdGF0aWMgaW50IGdpcmJpbF9vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBnaXJiaWxfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldik7CitzdGF0aWMgaW50IGdpcmJpbF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpOworCisvKiBDb250cm9sIHJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgR0lSQklMX1RYRU4gICAgMHgwMSAvKiBFbmFibGUgdHJhbnNtaXR0ZXIgKi8KKyNkZWZpbmUgR0lSQklMX1JYRU4gICAgMHgwMiAvKiBFbmFibGUgcmVjZWl2ZXIgKi8KKyNkZWZpbmUgR0lSQklMX0VDQU4gICAgMHgwNCAvKiBDYW5jZWwgc2VsZiBlbW1pdGVkIGRhdGEgKi8KKyNkZWZpbmUgR0lSQklMX0VDSE8gICAgMHgwOCAvKiBFY2hvIGNvbnRyb2wgY2hhcmFjdGVycyAqLworCisvKiBMRUQgQ3VycmVudCBSZWdpc3RlciAoMHgyKSAqLworI2RlZmluZSBHSVJCSUxfSElHSCAgICAweDIwCisjZGVmaW5lIEdJUkJJTF9NRURJVU0gIDB4MjEKKyNkZWZpbmUgR0lSQklMX0xPVyAgICAgMHgyMgorCisvKiBCYXVkIHJlZ2lzdGVyICgweDMpICovCisjZGVmaW5lIEdJUkJJTF8yNDAwICAgIDB4MzAKKyNkZWZpbmUgR0lSQklMXzQ4MDAgICAgMHgzMQorI2RlZmluZSBHSVJCSUxfOTYwMCAgICAweDMyCisjZGVmaW5lIEdJUkJJTF8xOTIwMCAgIDB4MzMKKyNkZWZpbmUgR0lSQklMXzM4NDAwICAgMHgzNAorI2RlZmluZSBHSVJCSUxfNTc2MDAgICAweDM1CisjZGVmaW5lIEdJUkJJTF8xMTUyMDAgIDB4MzYKKworLyogTW9kZSByZWdpc3RlciAoMHg0KSAqLworI2RlZmluZSBHSVJCSUxfSVJEQSAgICAweDQwCisjZGVmaW5lIEdJUkJJTF9BU0sgICAgIDB4NDEKKworLyogQ29udHJvbCByZWdpc3RlciAyICgweDUpICovCisjZGVmaW5lIEdJUkJJTF9MT0FEICAgIDB4NTEgLyogTG9hZCB0aGUgbmV3IGJhdWQgcmF0ZSB2YWx1ZSAqLworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgZ2lyYmlsID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJPSAiR3JlZW53aWNoIEdJckJJTCIsCisJLnR5cGUJCT0gSVJEQV9HSVJCSUxfRE9OR0xFLAorCS5vcGVuCQk9IGdpcmJpbF9vcGVuLAorCS5jbG9zZQkJPSBnaXJiaWxfY2xvc2UsCisJLnJlc2V0CQk9IGdpcmJpbF9yZXNldCwKKwkuc2V0X3NwZWVkCT0gZ2lyYmlsX2NoYW5nZV9zcGVlZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGdpcmJpbF9zaXJfaW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX3JlZ2lzdGVyX2RvbmdsZSgmZ2lyYmlsKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGdpcmJpbF9zaXJfY2xlYW51cCh2b2lkKQoreworCWlyZGFfdW5yZWdpc3Rlcl9kb25nbGUoJmdpcmJpbCk7Cit9CisKK3N0YXRpYyBpbnQgZ2lyYmlsX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcW9zX2luZm8gKnFvcyA9ICZkZXYtPnFvczsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBQb3dlciBvbiBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAzOworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUocW9zKTsKKworCS8qIGlyZGEgdGhyZWFkIHdhaXRzIDUwIG1zZWMgZm9yIHBvd2VyIHNldHRsaW5nICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXJiaWxfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGdpcmJpbF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIEdpcmJpbCB0eXBlIGRvbmdsZS4KKyAqCisgKi8KKworI2RlZmluZSBHSVJCSUxfU1RBVEVfV0FJVF9TUEVFRAkoU0lSREVWX1NUQVRFX0RPTkdMRV9TUEVFRCArIDEpCisKK3N0YXRpYyBpbnQgZ2lyYmlsX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCB1bnNpZ25lZCBzcGVlZCkKK3sKKwl1bnNpZ25lZCBzdGF0ZSA9IGRldi0+ZnNtLnN1YnN0YXRlOworCXVuc2lnbmVkIGRlbGF5ID0gMDsKKwl1OCBjb250cm9sWzJdOworCXN0YXRpYyBpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBkb25nbGUgYWxyZWFkIHJlc2V0IC0gcG9ydCBhbmQgZG9uZ2xlIGF0IGRlZmF1bHQgc3BlZWQgKi8KKworCXN3aXRjaChzdGF0ZSkgeworCisJY2FzZSBTSVJERVZfU1RBVEVfRE9OR0xFX1NQRUVEOgorCisJCS8qIFNldCBEVFIgYW5kIENsZWFyIFJUUyB0byBlbnRlciBjb21tYW5kIG1vZGUgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIFRSVUUpOworCisJCXVkZWxheSgyNSk7CQkvKiBiZXR0ZXIgd2FpdCBhIGxpdHRsZSB3aGlsZSAqLworCisJCXJldCA9IDA7CisJCXN3aXRjaCAoc3BlZWQpIHsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSA5NjAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF85NjAwOworCQkJYnJlYWs7CisJCWNhc2UgMTkyMDA6CisJCQljb250cm9sWzBdID0gR0lSQklMXzE5MjAwOworCQkJYnJlYWs7CisJCWNhc2UgMzQ4MDA6CisJCQljb250cm9sWzBdID0gR0lSQklMXzM4NDAwOworCQkJYnJlYWs7CisJCWNhc2UgNTc2MDA6CisJCQljb250cm9sWzBdID0gR0lSQklMXzU3NjAwOworCQkJYnJlYWs7CisJCWNhc2UgMTE1MjAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF8xMTUyMDA7CisJCQlicmVhazsKKwkJfQorCQljb250cm9sWzFdID0gR0lSQklMX0xPQUQ7CisJCisJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZXMgKi8KKwkJc2lyZGV2X3Jhd193cml0ZShkZXYsIGNvbnRyb2wsIDIpOworCisJCWRldi0+c3BlZWQgPSBzcGVlZDsKKworCQlzdGF0ZSA9IEdJUkJJTF9TVEFURV9XQUlUX1NQRUVEOworCQlkZWxheSA9IDEwMDsKKwkJYnJlYWs7CisKKwljYXNlIEdJUkJJTF9TVEFURV9XQUlUX1NQRUVEOgorCQkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCisJCXVkZWxheSgyNSk7CQkvKiBiZXR0ZXIgd2FpdCBhIGxpdHRsZSB3aGlsZSAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzIC0gdW5kZWZpbmVkIHN0YXRlICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXRlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWRldi0+ZnNtLnN1YnN0YXRlID0gc3RhdGU7CisJcmV0dXJuIChkZWxheSA+IDApID8gZGVsYXkgOiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBnaXJiaWxfcmVzZXQgKGRyaXZlcikKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBnaXJiaWwgZG9uZ2xlLgorICoKKyAqICAgICAgQWxnb3JpdGhtOgorICogICAgCSAgMC4gc2V0IFJUUywgYW5kIHdhaXQgYXQgbGVhc3QgNSBtcworICogICAgICAgIDEuIGNsZWFyIFJUUworICovCisKKworI2RlZmluZSBHSVJCSUxfU1RBVEVfV0FJVDFfUkVTRVQJKFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQgKyAxKQorI2RlZmluZSBHSVJCSUxfU1RBVEVfV0FJVDJfUkVTRVQJKFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQgKyAyKQorI2RlZmluZSBHSVJCSUxfU1RBVEVfV0FJVDNfUkVTRVQJKFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQgKyAzKQorCitzdGF0aWMgaW50IGdpcmJpbF9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCXVuc2lnbmVkIHN0YXRlID0gZGV2LT5mc20uc3Vic3RhdGU7CisJdW5zaWduZWQgZGVsYXkgPSAwOworCXU4IGNvbnRyb2wgPSBHSVJCSUxfVFhFTiB8IEdJUkJJTF9SWEVOOworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQ6CisJCS8qIFJlc2V0IGRvbmdsZSAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBGQUxTRSk7CisJCS8qIFNsZWVwIGF0IGxlYXN0IDUgbXMgKi8KKwkJZGVsYXkgPSAyMDsKKwkJc3RhdGUgPSBHSVJCSUxfU1RBVEVfV0FJVDFfUkVTRVQ7CisJCWJyZWFrOworCisJY2FzZSBHSVJCSUxfU1RBVEVfV0FJVDFfUkVTRVQ6CisJCS8qIFNldCBEVFIgYW5kIGNsZWFyIFJUUyB0byBlbnRlciBjb21tYW5kIG1vZGUgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIFRSVUUpOworCQlkZWxheSA9IDIwOworCQlzdGF0ZSA9IEdJUkJJTF9TVEFURV9XQUlUMl9SRVNFVDsKKwkJYnJlYWs7CisKKwljYXNlIEdJUkJJTF9TVEFURV9XQUlUMl9SRVNFVDoKKwkJLyogV3JpdGUgY29udHJvbCBieXRlICovCisJCXNpcmRldl9yYXdfd3JpdGUoZGV2LCAmY29udHJvbCwgMSk7CisJCWRlbGF5ID0gMjA7CisJCXN0YXRlID0gR0lSQklMX1NUQVRFX1dBSVQzX1JFU0VUOworCQlicmVhazsKKworCWNhc2UgR0lSQklMX1NUQVRFX1dBSVQzX1JFU0VUOgorCQkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCQlkZXYtPnNwZWVkID0gOTYwMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCB1bmRlZmluZWQgc3RhdGUgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdGUpOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCWRldi0+ZnNtLnN1YnN0YXRlID0gc3RhdGU7CisJcmV0dXJuIChkZWxheSA+IDApID8gZGVsYXkgOiByZXQ7Cit9CisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR3JlZW53aWNoIEdJckJJTCBkb25nbGUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTQiKTsgLyogSVJEQV9HSVJCSUxfRE9OR0xFICovCisKK21vZHVsZV9pbml0KGdpcmJpbF9zaXJfaW5pdCk7Cittb2R1bGVfZXhpdChnaXJiaWxfc2lyX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9naXJiaWwuYyBiL2RyaXZlcnMvbmV0L2lyZGEvZ2lyYmlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4YWViMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2dpcmJpbC5jCkBAIC0wLDAgKzEsMjUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGdpcmJpbC5jCisgKiBWZXJzaW9uOiAgICAgICAxLjIKKyAqIERlc2NyaXB0aW9uOiAgIEltcGxlbWVudGF0aW9uIGZvciB0aGUgR3JlZW53aWNoIEdJckJJTCBkb25nbGUKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFNhdCBGZWIgIDYgMjE6MDI6MzMgMTk5OQorICogTW9kaWZpZWQgYXQ6ICAgRnJpIERlYyAxNyAwOToxMzoyMCAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKK3N0YXRpYyBpbnQgIGdpcmJpbF9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKK3N0YXRpYyB2b2lkIGdpcmJpbF9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CitzdGF0aWMgdm9pZCBnaXJiaWxfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpOworc3RhdGljIGludCAgZ2lyYmlsX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKKworLyogQ29udHJvbCByZWdpc3RlciAxICovCisjZGVmaW5lIEdJUkJJTF9UWEVOICAgIDB4MDEgLyogRW5hYmxlIHRyYW5zbWl0dGVyICovCisjZGVmaW5lIEdJUkJJTF9SWEVOICAgIDB4MDIgLyogRW5hYmxlIHJlY2VpdmVyICovCisjZGVmaW5lIEdJUkJJTF9FQ0FOICAgIDB4MDQgLyogQ2FuY2VsIHNlbGYgZW1taXRlZCBkYXRhICovCisjZGVmaW5lIEdJUkJJTF9FQ0hPICAgIDB4MDggLyogRWNobyBjb250cm9sIGNoYXJhY3RlcnMgKi8KKworLyogTEVEIEN1cnJlbnQgUmVnaXN0ZXIgKDB4MikgKi8KKyNkZWZpbmUgR0lSQklMX0hJR0ggICAgMHgyMAorI2RlZmluZSBHSVJCSUxfTUVESVVNICAweDIxCisjZGVmaW5lIEdJUkJJTF9MT1cgICAgIDB4MjIKKworLyogQmF1ZCByZWdpc3RlciAoMHgzKSAqLworI2RlZmluZSBHSVJCSUxfMjQwMCAgICAweDMwCisjZGVmaW5lIEdJUkJJTF80ODAwICAgIDB4MzEJCisjZGVmaW5lIEdJUkJJTF85NjAwICAgIDB4MzIKKyNkZWZpbmUgR0lSQklMXzE5MjAwICAgMHgzMworI2RlZmluZSBHSVJCSUxfMzg0MDAgICAweDM0CQorI2RlZmluZSBHSVJCSUxfNTc2MDAgICAweDM1CQorI2RlZmluZSBHSVJCSUxfMTE1MjAwICAweDM2CisKKy8qIE1vZGUgcmVnaXN0ZXIgKDB4NCkgKi8KKyNkZWZpbmUgR0lSQklMX0lSREEgICAgMHg0MAorI2RlZmluZSBHSVJCSUxfQVNLICAgICAweDQxCisKKy8qIENvbnRyb2wgcmVnaXN0ZXIgMiAoMHg1KSAqLworI2RlZmluZSBHSVJCSUxfTE9BRCAgICAweDUxIC8qIExvYWQgdGhlIG5ldyBiYXVkIHJhdGUgdmFsdWUgKi8KKworc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZSA9IHsKKwkudHlwZSA9IElSREFfR0lSQklMX0RPTkdMRSwKKwkub3BlbiA9IGdpcmJpbF9vcGVuLAorCS5jbG9zZSA9IGdpcmJpbF9jbG9zZSwKKwkucmVzZXQgPSBnaXJiaWxfcmVzZXQsCisJLmNoYW5nZV9zcGVlZCA9IGdpcmJpbF9jaGFuZ2Vfc3BlZWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBnaXJiaWxfaW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX2RldmljZV9yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBnaXJiaWxfY2xlYW51cCh2b2lkKQoreworCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBnaXJiaWxfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpCit7CisJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfElSXzExNTIwMDsKKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4MDM7Cit9CisKK3N0YXRpYyB2b2lkIGdpcmJpbF9jbG9zZShkb25nbGVfdCAqc2VsZikKK3sKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworfQorCisvKgorICogRnVuY3Rpb24gZ2lyYmlsX2NoYW5nZV9zcGVlZCAoZGV2LCBzcGVlZCkKKyAqCisgKiAgICBTZXQgdGhlIHNwZWVkIGZvciB0aGUgR2lyYmlsIHR5cGUgZG9uZ2xlLgorICoKKyAqLworc3RhdGljIGludCBnaXJiaWxfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJX191MzIgc3BlZWQgPSAoX191MzIpIHRhc2stPnBhcmFtOworCV9fdTggY29udHJvbFsyXTsKKwlpbnQgcmV0ID0gMDsKKworCXNlbGYtPnNwZWVkX3Rhc2sgPSB0YXNrOworCisJc3dpdGNoICh0YXNrLT5zdGF0ZSkgeworCWNhc2UgSVJEQV9UQVNLX0lOSVQ6CisJCS8qIE5lZWQgdG8gcmVzZXQgdGhlIGRvbmdsZSBhbmQgZ28gdG8gOTYwMCBicHMgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgcHJvZ3JhbW1pbmcgKi8KKwkJaWYgKGlyZGFfdGFza19leGVjdXRlKHNlbGYsIGdpcmJpbF9yZXNldCwgTlVMTCwgdGFzaywgCisJCQkJICAgICAgKHZvaWQgKikgc3BlZWQpKQorCQl7CisJCQkvKiBEb25nbGUgbmVlZCBtb3JlIHRpbWUgdG8gcmVzZXQgKi8KKwkJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19DSElMRF9XQUlUKTsKKworCQkJLyogR2l2ZSByZXNldCAxIHNlYyB0byBmaW5pc2ggKi8KKwkJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfV0FJVDoKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCByZXNldHRpbmcgZG9uZ2xlIHRpbWVkIG91dCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldCA9IC0xOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19DSElMRF9ET05FOgorCQkvKiBTZXQgRFRSIGFuZCBDbGVhciBSVFMgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIFRSVUUpOworCisJCXN3aXRjaCAoc3BlZWQpIHsKKwkJY2FzZSA5NjAwOgorCQlkZWZhdWx0OgorCQkJY29udHJvbFswXSA9IEdJUkJJTF85NjAwOworCQkJYnJlYWs7CisJCWNhc2UgMTkyMDA6CisJCQljb250cm9sWzBdID0gR0lSQklMXzE5MjAwOworCQkJYnJlYWs7CisJCWNhc2UgMzQ4MDA6CisJCQljb250cm9sWzBdID0gR0lSQklMXzM4NDAwOworCQkJYnJlYWs7CisJCWNhc2UgNTc2MDA6CisJCQljb250cm9sWzBdID0gR0lSQklMXzU3NjAwOworCQkJYnJlYWs7CisJCWNhc2UgMTE1MjAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF8xMTUyMDA7CisJCQlicmVhazsKKwkJfQorCQljb250cm9sWzFdID0gR0lSQklMX0xPQUQ7CisJCQorCQkvKiBXcml0ZSBjb250cm9sIGJ5dGVzICovCisJCXNlbGYtPndyaXRlKHNlbGYtPmRldiwgY29udHJvbCwgMik7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUKTsKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxMDApOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19XQUlUOgorCQkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+c3BlZWRfdGFzayA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5zcGVlZF90YXNrID0gTlVMTDsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gZ2lyYmlsX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgZ2lyYmlsIGRvbmdsZS4KKyAqCisgKiAgICAgIEFsZ29yaXRobToKKyAqICAgIAkgIDAuIHNldCBSVFMsIGFuZCB3YWl0IGF0IGxlYXN0IDUgbXMgCisgKiAgICAgICAgMS4gY2xlYXIgUlRTIAorICovCitzdGF0aWMgaW50IGdpcmJpbF9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCV9fdTggY29udHJvbCA9IEdJUkJJTF9UWEVOIHwgR0lSQklMX1JYRU47CisJaW50IHJldCA9IDA7CisKKwlzZWxmLT5yZXNldF90YXNrID0gdGFzazsKKworCXN3aXRjaCAodGFzay0+c3RhdGUpIHsKKwljYXNlIElSREFfVEFTS19JTklUOgorCQkvKiBSZXNldCBkb25nbGUgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBGQUxTRSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUMSk7CisJCS8qIFNsZWVwIGF0IGxlYXN0IDUgbXMgKi8KKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygyMCk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQxOgorCQkvKiBTZXQgRFRSIGFuZCBjbGVhciBSVFMgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIFRSVUUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDIpOworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDIwKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDI6CisJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZSAqLworCQlzZWxmLT53cml0ZShzZWxmLT5kZXYsICZjb250cm9sLCAxKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQzKTsKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygyMCk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQzOgorCQkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdyZWVud2ljaCBHSXJCSUwgZG9uZ2xlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS00Iik7IC8qIElSREFfR0lSQklMX0RPTkdMRSAqLworCQorLyoKKyAqIEZ1bmN0aW9uIGluaXRfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIEluaXRpYWxpemUgR2lyYmlsIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2luaXQoZ2lyYmlsX2luaXQpOworCisvKgorICogRnVuY3Rpb24gY2xlYW51cF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgQ2xlYW51cCBHaXJiaWwgbW9kdWxlCisgKgorICovCittb2R1bGVfZXhpdChnaXJiaWxfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmUwMDIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jCkBAIC0wLDAgKzEsMTYwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgaXJkYS11c2IuYworICogVmVyc2lvbjogICAgICAgMC45YgorICogRGVzY3JpcHRpb246ICAgSXJEQS1VU0IgRHJpdmVyCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwgCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnQGJyYXR0bGkubmV0PgorICoKKyAqCUNvcHlyaWdodCAoQykgMjAwMCwgUm9tYW4gV2Vpc3NnYWVyYmVyIDx3ZWlzc2dAdmllbm5hLmF0PgorICogICAgICBDb3B5cmlnaHQgKEMpIDIwMDEsIERhZyBCcmF0dGxpIDxkYWdAYnJhdHRsaS5uZXQ+CisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwMSwgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICogICAgICAgICAgCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKgkJCSAgICBJTVBPUlRBTlQgTk9URQorICoJCQkgICAgLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBBcyBvZiBrZXJuZWwgMi41LjIwLCB0aGlzIGlzIHRoZSBzdGF0ZSBvZiBjb21wbGlhbmNlIGFuZCB0ZXN0aW5nIG9mCisgKiB0aGlzIGRyaXZlciAoaXJkYS11c2IpIHdpdGggcmVnYXJkcyB0byB0aGUgVVNCIGxvdyBsZXZlbCBkcml2ZXJzLi4uCisgKgorICogVGhpcyBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIFNVQ0NFU1NGVUxMWSB3aXRoIHRoZSBmb2xsb3dpbmcgZHJpdmVycyA6CisgKglvIHVzYi11aGNpLWhjZAkoRm9yIEludGVsL1ZpYSBVU0IgY29udHJvbGxlcnMpCisgKglvIHVoY2ktaGNkCShBbHRlcm5hdGUvSkUgZHJpdmVyIGZvciBJbnRlbC9WaWEgVVNCIGNvbnRyb2xsZXJzKQorICoJbyBvaGNpLWhjZAkoRm9yIG90aGVyIFVTQiBjb250cm9sbGVycykKKyAqCisgKiBUaGlzIGRyaXZlciBoYXMgTk9UIGJlZW4gdGVzdGVkIHdpdGggdGhlIGZvbGxvd2luZyBkcml2ZXJzIDoKKyAqCW8gZWhjaS1oY2QJKFVTQiAyLjAgY29udHJvbGxlcnMpCisgKgorICogTm90ZSB0aGF0IGFsbCBIQ0QgZHJpdmVycyBkbyBVUkJfWkVST19QQUNLRVQgYW5kIHRpbWVvdXQgcHJvcGVybHksCisgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoYXQgYW55bW9yZS4KKyAqIE9uZSBjb21tb24gcHJvYmxlbSBpcyB0aGUgZmFpbHVyZSB0byBzZXQgdGhlIGFkZHJlc3Mgb24gdGhlIGRvbmdsZSwKKyAqIGJ1dCB0aGlzIGhhcHBlbnMgYmVmb3JlIHRoZSBkcml2ZXIgZ2V0cyBsb2FkZWQuLi4KKyAqCisgKiBKZWFuIElJCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJpcmRhLXVzYi5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgcW9zX210dF9iaXRzID0gMDsKKworLyogVGhlc2UgYXJlIHRoZSBjdXJyZW50bHkga25vd24gSXJEQSBVU0IgZG9uZ2xlcy4gQWRkIG5ldyBkb25nbGVzIGhlcmUgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkb25nbGVzW10gPSB7CisJLyogQUNUaVNZUyBDb3JwLiwgIEFDVC1JUjIwMDBVIEZJUi1VU0IgQWRhcHRlciAqLworCXsgVVNCX0RFVklDRSgweDljNCwgMHgwMTEpLCAuZHJpdmVyX2luZm8gPSBJVUNfU1BFRURfQlVHIHwgSVVDX05PX1dJTkRPVyB9LAorCS8qIExvb2sgbGlrZSBBQ1RpU1lTLCBSZXBvcnQgOiBJQk0gQ29ycC4sIElCTSBVbHRyYVBvcnQgSXJEQSAqLworCXsgVVNCX0RFVklDRSgweDQ0MjgsIDB4MDEyKSwgLmRyaXZlcl9pbmZvID0gSVVDX1NQRUVEX0JVRyB8IElVQ19OT19XSU5ET1cgfSwKKwkvKiBLQyBUZWNobm9sb2d5IEluYy4sICBLQy0xODAgVVNCIElyREEgRGV2aWNlICovCisJeyBVU0JfREVWSUNFKDB4NTBmLCAweDE4MCksIC5kcml2ZXJfaW5mbyA9IElVQ19TUEVFRF9CVUcgfCBJVUNfTk9fV0lORE9XIH0sCisJLyogRXh0ZW5kZWQgU3lzdGVtcywgSW5jLiwgIFhUTkRBY2Nlc3MgSXJEQSBVU0IgKEVTSS05Njg1KSAqLworCXsgVVNCX0RFVklDRSgweDhlOSwgMHgxMDApLCAuZHJpdmVyX2luZm8gPSBJVUNfU1BFRURfQlVHIHwgSVVDX05PX1dJTkRPVyB9LAorCXsgLm1hdGNoX2ZsYWdzID0gVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfQ0xBU1MgfAorCSAgICAgICAgICAgICAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX1NVQkNMQVNTLAorCSAgLmJJbnRlcmZhY2VDbGFzcyA9IFVTQl9DTEFTU19BUFBfU1BFQywKKwkgIC5iSW50ZXJmYWNlU3ViQ2xhc3MgPSBVU0JfQ0xBU1NfSVJEQSwKKwkgIC5kcml2ZXJfaW5mbyA9IElVQ19ERUZBVUxULCB9LAorCXsgfSwgLyogVGhlIGVuZCAqLworfTsKKworLyoKKyAqIEltcG9ydGFudCBub3RlIDoKKyAqIERldmljZXMgYmFzZWQgb24gdGhlIFNpZ21hVGVsIGNoaXBzZXQgKDB4NjZmLCAweDQyMDApIGFyZSBub3QgZGVzaWduZWQKKyAqIHVzaW5nIHRoZSAiVVNCLUlyREEgc3BlY2lmaWNhdGlvbiIgKHllcywgdGhlcmUgZXhpc3Qgc3VjaCBhIHRoaW5nKSwgYW5kCisgKiB0aGVyZWZvcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciAoZG9uJ3QgYWRkIHRoZW0gYWJvdmUpLgorICogVGhlcmUgaXMgYSBMaW51eCBkcml2ZXIsIHN0aXI0MjAwLCB0aGF0IHN1cHBvcnQgdGhvc2UgVVNCIGRldmljZXMuCisgKiBKZWFuIElJCisgKi8KKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRvbmdsZXMpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgaXJkYV9jbGFzc19kZXNjICppcmRhX3VzYl9maW5kX2NsYXNzX2Rlc2Moc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworc3RhdGljIHZvaWQgaXJkYV91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CitzdGF0aWMgdm9pZCBpcmRhX3VzYl9jaGFuZ2Vfc3BlZWRfeGJvZnMoc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgaXJkYV91c2JfaGFyZF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpcmRhX3VzYl9vcGVuKHN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBpcmRhX3VzYl9jbG9zZShzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYpOworc3RhdGljIHZvaWQgc3BlZWRfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHdyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBpcmRhX3VzYl9yZWNlaXZlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBpcmRhX3VzYl9uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaXJkYV91c2JfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpcmRhX3VzYl9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZCBpcmRhX3VzYl9uZXRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXJkYV91c2JfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBUUkFOU01JVCBST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUmVjZWl2ZSBwYWNrZXRzIGZyb20gdGhlIElyREEgc3RhY2sgYW5kIHNlbmQgdGhlbSBvbiB0aGUgVVNCIHBpcGUuCisgKiBIYW5kbGUgc3BlZWQgY2hhbmdlLCB0aW1lb3V0IGFuZCBsb3QncyBvZiB1Z2xpbmVzcy4uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcmRhX3VzYl9idWlsZF9oZWFkZXIoc2VsZiwgc2tiLCBoZWFkZXIpCisgKgorICogICBCdWlsZHMgVVNCLUlyREEgb3V0Ym91bmQgaGVhZGVyCisgKgorICogV2hlbiB3ZSBzZW5kIGFuIElyREEgZnJhbWUgb3ZlciBhbiBVU0IgcGlwZSwgd2UgYWRkIHRvIGl0IGEgMSBieXRlCisgKiBoZWFkZXIuIFRoaXMgZnVuY3Rpb24gY3JlYXRlIHRoaXMgaGVhZGVyIHdpdGggdGhlIHByb3BlciB2YWx1ZXMuCisgKgorICogSW1wb3J0YW50IG5vdGUgOiB0aGUgVVNCLUlyREEgc3BlYyAxLjAgc2F5IHZlcnkgY2xlYXJseSBpbiBjaGFwdGVyIDUuNC4yLjIKKyAqIHRoYXQgdGhlIHNldHRpbmcgb2YgdGhlIGxpbmsgc3BlZWQgYW5kIHhib2YgbnVtYmVyIGluIHRoaXMgb3V0Ym91bmQgaGVhZGVyCisgKiBzaG91bGQgYmUgYXBwbGllZCAqQUZURVIqIHRoZSBmcmFtZSBoYXMgYmVlbiBzZW50LgorICogVW5mb3J0dW5hdGVseSwgc29tZSBkZXZpY2VzIGFyZSBub3QgY29tcGxpYW50IHdpdGggdGhhdC4uLiBJdCBzZWVtcyB0aGF0CisgKiByZWFkaW5nIHRoZSBzcGVjIGlzIGZhciB0b28gZGlmZmljdWx0Li4uCisgKiBKZWFuIElJCisgKi8KK3N0YXRpYyB2b2lkIGlyZGFfdXNiX2J1aWxkX2hlYWRlcihzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYsCisJCQkJICBfX3U4ICpoZWFkZXIsCisJCQkJICBpbnQJZm9yY2UpCit7CisJLyogU2V0IHRoZSBuZWdvdGlhdGVkIGxpbmsgc3BlZWQgKi8KKwlpZiAoc2VsZi0+bmV3X3NwZWVkICE9IC0xKSB7CisJCS8qIEh1bS4uLiBVZ2x5IGhhY2sgOi0oCisJCSAqIFNvbWUgZGV2aWNlIGFyZSBub3QgY29tcGxpYW50IHdpdGggdGhlIHNwZWMgYW5kIGNoYW5nZQorCQkgKiBwYXJhbWV0ZXJzICpiZWZvcmUqIHNlbmRpbmcgdGhlIGZyYW1lLiAtIEplYW4gSUkKKwkJICovCisJCWlmICgoc2VsZi0+Y2FwYWJpbGl0eSAmIElVQ19TUEVFRF9CVUcpICYmCisJCSAgICAoIWZvcmNlKSAmJiAoc2VsZi0+c3BlZWQgIT0gLTEpKSB7CisJCQkvKiBObyBzcGVlZCBhbmQgeGJvZnMgY2hhbmdlIGhlcmUKKwkJCSAqICh3ZSdsbCBkbyBpdCBsYXRlciBpbiB0aGUgd3JpdGUgY2FsbGJhY2spICovCisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBub3QgY2hhbmdpbmcgc3BlZWQgeWV0XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJKmhlYWRlciA9IDA7CisJCQlyZXR1cm47CisJCX0KKworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBjaGFuZ2luZyBzcGVlZCB0byAlZFxuIiwgX19GVU5DVElPTl9fLCBzZWxmLT5uZXdfc3BlZWQpOworCQlzZWxmLT5zcGVlZCA9IHNlbGYtPm5ld19zcGVlZDsKKwkJLyogV2Ugd2lsbCBkbyBgIHNlbGYtPm5ld19zcGVlZCA9IC0xOyAnIGluIHRoZSBjb21wbGV0aW9uCisJCSAqIGhhbmRsZXIganVzdCBpbiBjYXNlIHRoZSBjdXJyZW50IFVSQiBmYWlsIC0gSmVhbiBJSSAqLworCisJCXN3aXRjaCAoc2VsZi0+c3BlZWQpIHsKKwkJY2FzZSAyNDAwOgorCQkgICAgICAgICpoZWFkZXIgPSBTUEVFRF8yNDAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgOTYwMDoKKwkJCSpoZWFkZXIgPSBTUEVFRF85NjAwOworCQkJYnJlYWs7CisJCWNhc2UgMTkyMDA6CisJCQkqaGVhZGVyID0gU1BFRURfMTkyMDA7CisJCQlicmVhazsKKwkJY2FzZSAzODQwMDoKKwkJCSpoZWFkZXIgPSBTUEVFRF8zODQwMDsKKwkJCWJyZWFrOworCQljYXNlIDU3NjAwOgorCQkgICAgICAgICpoZWFkZXIgPSBTUEVFRF81NzYwMDsKKwkJCWJyZWFrOworCQljYXNlIDExNTIwMDoKKwkJICAgICAgICAqaGVhZGVyID0gU1BFRURfMTE1MjAwOworCQkJYnJlYWs7CisJCWNhc2UgNTc2MDAwOgorCQkgICAgICAgICpoZWFkZXIgPSBTUEVFRF81NzYwMDA7CisJCQlicmVhazsKKwkJY2FzZSAxMTUyMDAwOgorCQkgICAgICAgICpoZWFkZXIgPSBTUEVFRF8xMTUyMDAwOworCQkJYnJlYWs7CisJCWNhc2UgNDAwMDAwMDoKKwkJICAgICAgICAqaGVhZGVyID0gU1BFRURfNDAwMDAwMDsKKwkJCXNlbGYtPm5ld194Ym9mcyA9IDA7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZQorCQkvKiBObyBjaGFuZ2UgKi8KKwkJKmhlYWRlciA9IDA7CisJCisJLyogU2V0IHRoZSBuZWdvdGlhdGVkIGFkZGl0aW9uYWwgWEJPRlMgKi8KKwlpZiAoc2VsZi0+bmV3X3hib2ZzICE9IC0xKSB7CisJCUlSREFfREVCVUcoMiwgIiVzKCksIGNoYW5naW5nIHhib2ZzIHRvICVkXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYtPm5ld194Ym9mcyk7CisJCXNlbGYtPnhib2ZzID0gc2VsZi0+bmV3X3hib2ZzOworCQkvKiBXZSB3aWxsIGRvIGAgc2VsZi0+bmV3X3hib2ZzID0gLTE7ICcgaW4gdGhlIGNvbXBsZXRpb24KKwkJICogaGFuZGxlciBqdXN0IGluIGNhc2UgdGhlIGN1cnJlbnQgVVJCIGZhaWwgLSBKZWFuIElJICovCisKKwkJc3dpdGNoIChzZWxmLT54Ym9mcykgeworCQljYXNlIDQ4OgorCQkJKmhlYWRlciB8PSAweDEwOworCQkJYnJlYWs7CisJCWNhc2UgMjg6CisJCWNhc2UgMjQ6CS8qIFVTQiBzcGVjIDEuMCBzYXlzIDI0ICovCisJCQkqaGVhZGVyIHw9IDB4MjA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSAxMjoKKwkJCSpoZWFkZXIgfD0gMHgzMDsKKwkJCWJyZWFrOworCQljYXNlIDU6IC8qIEJ1ZyBpbiBJckxBUCBzcGVjPyAoc2hvdWxkIGJlIDYpICovCisJCWNhc2UgNjoKKwkJCSpoZWFkZXIgfD0gMHg0MDsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQkqaGVhZGVyIHw9IDB4NTA7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJKmhlYWRlciB8PSAweDYwOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCSpoZWFkZXIgfD0gMHg3MDsKKwkJCWJyZWFrOworCQljYXNlIDA6CisJCQkqaGVhZGVyIHw9IDB4ODA7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNlbmQgYSBjb21tYW5kIHRvIGNoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIGRvbmdsZQorICogTmVlZCB0byBiZSBjYWxsZWQgd2l0aCBzcGlubG9jayBvbi4KKyAqLworc3RhdGljIHZvaWQgaXJkYV91c2JfY2hhbmdlX3NwZWVkX3hib2ZzKHN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZikKK3sKKwlfX3U4ICpmcmFtZTsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJaW50IHJldDsKKworCUlSREFfREVCVUcoMiwgIiVzKCksIHNwZWVkPSVkLCB4Ym9mcz0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICBzZWxmLT5uZXdfc3BlZWQsIHNlbGYtPm5ld194Ym9mcyk7CisKKwkvKiBHcmFiIHRoZSBzcGVlZCBVUkIgKi8KKwl1cmIgPSBzZWxmLT5zcGVlZF91cmI7CisJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBVUkIgc3RpbGwgaW4gdXNlIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBmYWtlIGZyYW1lICovCisJZnJhbWUgPSBzZWxmLT5zcGVlZF9idWZmOworCisJLyogU2V0IHRoZSBuZXcgc3BlZWQgYW5kIHhib2ZzIGluIHRoaXMgZmFrZSBmcmFtZSAqLworCWlyZGFfdXNiX2J1aWxkX2hlYWRlcihzZWxmLCBmcmFtZSwgMSk7CisKKwkvKiBTdWJtaXQgdGhlIDAgbGVuZ3RoIElyREEgZnJhbWUgdG8gdHJpZ2dlciBuZXcgc3BlZWQgc2V0dGluZ3MgKi8KKyAgICAgICAgdXNiX2ZpbGxfYnVsa191cmIodXJiLCBzZWxmLT51c2JkZXYsCisJCSAgICAgIHVzYl9zbmRidWxrcGlwZShzZWxmLT51c2JkZXYsIHNlbGYtPmJ1bGtfb3V0X2VwKSwKKyAgICAgICAgICAgICAgICAgICAgICBmcmFtZSwgSVJEQV9VU0JfU1BFRURfTVRVLAorICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2J1bGtfY2FsbGJhY2ssIHNlbGYpOworCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IFVTQl9JUkRBX0hFQURFUjsKKwl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0FTWU5DX1VOTElOSzsKKworCS8qIElycSBkaXNhYmxlZCAtPiBHRlBfQVRPTUlDICovCisJaWYgKChyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIGZhaWxlZCBTcGVlZCBVUkJcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3BlZWQgVVJCIGNhbGxiYWNrCisgKiBOb3csIHdlIGNhbiBvbmx5IGdldCBjYWxsZWQgZm9yIHRoZSBzcGVlZCBVUkIuCisgKi8KK3N0YXRpYyB2b2lkIHNwZWVkX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYgPSB1cmItPmNvbnRleHQ7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFdlIHNob3VsZCBhbHdheXMgaGF2ZSBhIGNvbnRleHQgKi8KKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCS8qIFdlIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIGZvciB0aGUgc3BlZWQgVVJCICovCisJSVJEQV9BU1NFUlQodXJiID09IHNlbGYtPnNwZWVkX3VyYiwgcmV0dXJuOyk7CisKKwkvKiBDaGVjayBmb3IgdGltZW91dCBhbmQgb3RoZXIgVVNCIG5hc3RpZXMgKi8KKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkgeworCQkvKiBJIGdldCBhIGxvdCBvZiAtRUNPTk5BQk9SVEVEID0gLTEwMyBoZXJlIC0gSmVhbiBJSSAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVUkIgY29tcGxldGUgc3RhdHVzICVkLCB0cmFuc2Zlcl9mbGFncyAweCUwNFhcbiIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMsIHVyYi0+dHJhbnNmZXJfZmxhZ3MpOworCisJCS8qIERvbid0IGRvIGFueXRoaW5nIGhlcmUsIHRoYXQgbWlnaHQgY29uZnVzZSB0aGUgVVNCIGxheWVyLgorCQkgKiBJbnN0ZWFkLCB3ZSB3aWxsIHdhaXQgZm9yIGlyZGFfdXNiX25ldF90aW1lb3V0KCksIHRoZQorCQkgKiBuZXR3b3JrIGxheWVyIHdhdGNoZG9nLCB0byBmaXggdGhlIHNpdHVhdGlvbi4KKwkJICogSmVhbiBJSSAqLworCQkvKiBBIHJlc2V0IG9mIHRoZSBkb25nbGUgbWlnaHQgYmUgd2VsY29tZWQgaGVyZSAtIEplYW4gSUkgKi8KKwkJcmV0dXJuOworCX0KKworCS8qIHVyYiBpcyBub3cgYXZhaWxhYmxlICovCisJLy91cmItPnN0YXR1cyA9IDA7IC0+IHRlc3RlZCBhYm92ZQorCisJLyogTmV3IHNwZWVkIGFuZCB4Ym9mIGlzIG5vdyBjb21taXRlZCBpbiBoYXJkd2FyZSAqLworCXNlbGYtPm5ld19zcGVlZCA9IC0xOworCXNlbGYtPm5ld194Ym9mcyA9IC0xOworCisJLyogQWxsb3cgdGhlIHN0YWNrIHRvIHNlbmQgbW9yZSBwYWNrZXRzICovCisJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU2VuZCBhbiBJckRBIGZyYW1lIHRvIHRoZSBVU0IgZG9uZ2xlIChmb3IgdHJhbnNtaXNzaW9uKQorICovCitzdGF0aWMgaW50IGlyZGFfdXNiX2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZiA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgdXJiICp1cmIgPSBzZWxmLT50eF91cmI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzMzIgc3BlZWQ7CisJczE2IHhib2ZzOworCWludCByZXMsIG10dDsKKwlpbnQJZXJyID0gMTsJLyogRmFpbGVkICovCisKKwlJUkRBX0RFQlVHKDQsICIlcygpIG9uICVzXG4iLCBfX0ZVTkNUSU9OX18sIG5ldGRldi0+bmFtZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwkvKiBQcm90ZWN0IHVzIGZyb20gVVNCIGNhbGxiYWNrcywgbmV0IHdhdGNoZG9nIGFuZCBlbHNlLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIHN0aWxsIHRoZXJlLgorCSAqIFdlIG5lZWQgdG8gY2hlY2sgc2VsZi0+cHJlc2VudCB1bmRlciB0aGUgc3BpbmxvY2sgYmVjYXVzZQorCSAqIG9mIGlyZGFfdXNiX2Rpc2Nvbm5lY3QoKSBpcyBzeW5jaHJvbm91cyAtIEplYW4gSUkgKi8KKwlpZiAoIXNlbGYtPnByZXNlbnQpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgRGV2aWNlIGlzIGdvbmUuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZHJvcDsKKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIHhib2ZzICovCisgICAgICAgIHhib2ZzID0gaXJkYV9nZXRfbmV4dF94Ym9mcyhza2IpOworICAgICAgICBpZiAoKHhib2ZzICE9IHNlbGYtPnhib2ZzKSAmJiAoeGJvZnMgIT0gLTEpKSB7CisJCXNlbGYtPm5ld194Ym9mcyA9IHhib2ZzOworCX0KKworICAgICAgICAvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlpZiAoKHNwZWVkICE9IHNlbGYtPnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJCS8qIFNldCB0aGUgZGVzaXJlZCBzcGVlZCAqLworCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKworCQkvKiBDaGVjayBmb3IgZW1wdHkgZnJhbWUgKi8KKwkJaWYgKCFza2ItPmxlbikgeworCQkJLyogSXJMQVAgc2VuZCB1cyBhbiBlbXB0eSBmcmFtZSB0byBtYWtlIHVzIGNoYW5nZSB0aGUKKwkJCSAqIHNwZWVkLiBDaGFuZ2luZyBzcGVlZCB3aXRoIHRoZSBVU0IgYWRhcHRlciBpcyBpbgorCQkJICogZmFjdCBzZW5kaW5nIGFuIGVtcHR5IGZyYW1lIHRvIHRoZSBhZGFwdGVyLCBzbyB3ZQorCQkJICogY291bGQganVzdCBsZXQgdGhlIHByZXNlbnQgZnVuY3Rpb24gZG8gaXRzIGpvYi4KKwkJCSAqIEhvd2V2ZXIsIHdlIHdvdWxkIHdhaXQgZm9yIG1pbiB0dXJuIHRpbWUsCisJCQkgKiBkbyBhbiBleHRyYSBtZW1jcHkgYW5kIGluY3JlbWVudCBwYWNrZXQgY291bnRlcnMuLi4KKwkJCSAqIEplYW4gSUkgKi8KKwkJCWlyZGFfdXNiX2NoYW5nZV9zcGVlZF94Ym9mcyhzZWxmKTsKKwkJCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJLyogV2lsbCBuZXRpZl93YWtlX3F1ZXVlKCkgaW4gY2FsbGJhY2sgKi8KKwkJCWVyciA9IDA7CS8qIE5vIGVycm9yICovCisJCQlnb3RvIGRyb3A7CisJCX0KKwl9CisKKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIFVSQiBzdGlsbCBpbiB1c2UhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGRyb3A7CisJfQorCisJLyogTWFrZSBzdXJlIHRoZXJlIGlzIHJvb20gZm9yIElyREEtVVNCIGhlYWRlci4gVGhlIGFjdHVhbAorCSAqIGFsbG9jYXRpb24gd2lsbCBiZSBkb25lIGxvd2VyIGluIHNrYl9wdXNoKCkuCisJICogQWxzbywgd2UgZG9uJ3QgdXNlIGRpcmVjdGx5IHNrYl9jb3coKSwgYmVjYXVzZSBpdCByZXF1aXJlCisJICogaGVhZHJvb20gPj0gMTYsIHdoaWNoIGZvcmNlIHVubmVjZXNzYXJ5IGNvcGllcyAtIEplYW4gSUkgKi8KKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBVU0JfSVJEQV9IRUFERVIpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgSW5zdWZpY2llbnQgc2tiIGhlYWRyb29tLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKHNrYl9jb3coc2tiLCBVU0JfSVJEQV9IRUFERVIpKSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzKCksIGZhaWxlZCBza2JfY293KCkgISEhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZ290byBkcm9wOworCQl9CisJfQorCisJLyogQ2hhbmdlIHNldHRpbmcgZm9yIG5leHQgZnJhbWUgKi8KKwlpcmRhX3VzYl9idWlsZF9oZWFkZXIoc2VsZiwgc2tiX3B1c2goc2tiLCBVU0JfSVJEQV9IRUFERVIpLCAwKTsKKworCS8qIEZJWE1FOiBNYWtlIG1hY3JvIG91dCBvZiB0aGlzIG9uZSAqLworCSgoc3RydWN0IGlyZGFfc2tiX2NiICopc2tiLT5jYiktPmNvbnRleHQgPSBzZWxmOworCisgICAgICAgIHVzYl9maWxsX2J1bGtfdXJiKHVyYiwgc2VsZi0+dXNiZGV2LCAKKwkJICAgICAgdXNiX3NuZGJ1bGtwaXBlKHNlbGYtPnVzYmRldiwgc2VsZi0+YnVsa19vdXRfZXApLAorICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGF0YSwgSVJEQV9TS0JfTUFYX01UVSwKKyAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWxrX2NhbGxiYWNrLCBza2IpOworCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHNrYi0+bGVuOworCS8qIE5vdGUgOiB1bmxpbmsgKm11c3QqIGJlIEFzeW5jaHJvbm91cyBiZWNhdXNlIG9mIHRoZSBjb2RlIGluIAorCSAqIGlyZGFfdXNiX25ldF90aW1lb3V0KCkgLT4gY2FsbCBpbiBpcnEgLSBKZWFuIElJICovCisJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9BU1lOQ19VTkxJTks7CisJLyogVGhpcyBmbGFnIChVUkJfWkVST19QQUNLRVQpIGluZGljYXRlcyB0aGF0IHdoYXQgd2Ugc2VuZCBpcyBub3QKKwkgKiBhIGNvbnRpbnVvdXMgc3RyZWFtIG9mIGRhdGEgYnV0IHNlcGFyYXRlIHBhY2tldHMuCisJICogSW4gdGhpcyBjYXNlLCB0aGUgVVNCIGxheWVyIHdpbGwgaW5zZXJ0IGFuIGVtcHR5IFVTQiBmcmFtZSAoVEQpCisJICogYWZ0ZXIgZWFjaCBvZiBvdXIgcGFja2V0cyB0aGF0IGlzIGV4YWN0IG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLgorCSAqIFRoaXMgaXMgaG93IHRoZSBkb25nbGUgd2lsbCBkZXRlY3QgdGhlIGVuZCBvZiBwYWNrZXQgLSBKZWFuIElJICovCisJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfWkVST19QQUNLRVQ7CisKKwkvKiBHZW5lcmF0ZSBtaW4gdHVybiB0aW1lLiBGSVhNRTogY2FuIHdlIGRvIGJldHRlciB0aGFuIHRoaXM/ICovCisJLyogVHJ5aW5nIHRvIGEgdHVybmFyb3VuZCB0aW1lIGF0IHRoaXMgbGV2ZWwgaXMgdHJ5aW5nIHRvIG1lYXN1cmUKKwkgKiBwcm9jZXNzb3IgY2xvY2sgY3ljbGUgd2l0aCBhIHdyaXN0LXdhdGNoLCBhcHByb3hpbWF0ZSBhdCBiZXN0Li4uCisJICoKKwkgKiBXaGF0IHdlIGtub3cgaXMgdGhlIGxhc3QgdGltZSB3ZSByZWNlaXZlZCBhIGZyYW1lIG92ZXIgVVNCLgorCSAqIER1ZSB0byBsYXRlbmN5IG92ZXIgVVNCIHRoYXQgZGVwZW5kIG9uIHRoZSBVU0IgbG9hZCwgd2UgZG9uJ3QKKwkgKiBrbm93IHdoZW4gdGhpcyBmcmFtZSB3YXMgcmVjZWl2ZWQgb3ZlciBJckRBIChhIGZldyBtcyBiZWZvcmUgPykKKwkgKiBUaGVuLCBzYW1lIHN0b3J5IGZvciBvdXIgb3V0Z29pbmcgZnJhbWUuLi4KKwkgKgorCSAqIEluIHRoZW9yeSwgdGhlIFVTQiBkb25nbGUgaXMgc3VwcG9zZWQgdG8gaGFuZGxlIHRoZSB0dXJuYXJvdW5kCisJICogYnkgaXRzZWxmIChzcGVjIDEuMCwgY2hhdGVyIDQsIHBhZ2UgNikuIFdobyBrbm93cyA/Pz8gVGhhdCdzCisJICogd2h5IHRoaXMgY29kZSBpcyBlbmFibGVkIG9ubHkgZm9yIGRvbmdsZXMgdGhhdCBkb2Vzbid0IG1lZXQKKwkgKiB0aGUgc3BlYy4KKwkgKiBKZWFuIElJICovCisJaWYgKHNlbGYtPmNhcGFiaWxpdHkgJiBJVUNfTk9fVFVSTikgeworCQltdHQgPSBpcmRhX2dldF9tdHQoc2tiKTsKKwkJaWYgKG10dCkgeworCQkJaW50IGRpZmY7CisJCQlkb19nZXR0aW1lb2ZkYXkoJnNlbGYtPm5vdyk7CisJCQlkaWZmID0gc2VsZi0+bm93LnR2X3VzZWMgLSBzZWxmLT5zdGFtcC50dl91c2VjOworI2lmZGVmIElVX1VTQl9NSU5fUlRUCisJCQkvKiBGYWN0b3IgaW4gVVNCIGRlbGF5cyAtPiBHZXQgcmlkIG9mIHVkZWxheSgpIHRoYXQKKwkJCSAqIHdvdWxkIGJlIGxvc3QgaW4gdGhlIG5vaXNlIC0gSmVhbiBJSSAqLworCQkJZGlmZiArPSBJVV9VU0JfTUlOX1JUVDsKKyNlbmRpZiAvKiBJVV9VU0JfTUlOX1JUVCAqLworCQkJLyogSWYgdGhlIHVzZWMgY291bnRlciBkaWQgd3JhcGFyb3VuZCwgdGhlIGRpZmYgd2lsbAorCQkJICogZ28gbmVnYXRpdmUgKHR2X3VzZWMgaXMgYSBsb25nKSwgc28gd2UgbmVlZCB0bworCQkJICogY29ycmVjdCBpdCBieSBvbmUgc2Vjb25kLiBKZWFuIElJICovCisJCQlpZiAoZGlmZiA8IDApCisJCQkJZGlmZiArPSAxMDAwMDAwOworCisJCSAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG10dCBpcyBsYXJnZXIgdGhhbiB0aGUgdGltZSB3ZSBoYXZlCisJCQkgKiBhbHJlYWR5IHVzZWQgYnkgYWxsIHRoZSBwcm90b2NvbCBwcm9jZXNzaW5nCisJCQkgKi8KKwkJCWlmIChtdHQgPiBkaWZmKSB7CisJCQkJbXR0IC09IGRpZmY7CisJCQkJaWYgKG10dCA+IDEwMDApCisJCQkJCW1kZWxheShtdHQvMTAwMCk7CisJCQkJZWxzZQorCQkJCQl1ZGVsYXkobXR0KTsKKwkJCX0KKwkJfQorCX0KKwkKKwkvKiBBc2sgVVNCIHRvIHNlbmQgdGhlIHBhY2tldCAtIElycSBkaXNhYmxlZCAtPiBHRlBfQVRPTUlDICovCisJaWYgKChyZXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIGZhaWxlZCBUeCBVUkJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkvKiBMZXQgVVNCIHJlY292ZXIgOiBXZSB3aWxsIGNhdGNoIHRoYXQgaW4gdGhlIHdhdGNoZG9nICovCisJCS8qbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsqLworCX0gZWxzZSB7CisJCS8qIEluY3JlbWVudCBwYWNrZXQgc3RhdHMgKi8KKwkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworICAgICAgICAgICAgICAgIHNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQkKKwkJbmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkKKwlyZXR1cm4gMDsKKworZHJvcDoKKwkvKiBEcm9wIHNpbGVudGx5IHRoZSBza2IgYW5kIGV4aXQgKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCXJldHVybiBlcnI7CQkvKiBVc3VhbGx5IDEgKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIE5vdGUgOiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIG9ubHkgZm9yIHR4X3VyYi4uLgorICovCitzdGF0aWMgdm9pZCB3cml0ZV9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZiA9ICgoc3RydWN0IGlyZGFfc2tiX2NiICopIHNrYi0+Y2IpLT5jb250ZXh0OworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBXZSBzaG91bGQgYWx3YXlzIGhhdmUgYSBjb250ZXh0ICovCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwkvKiBXZSBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCBmb3IgdGhlIHNwZWVkIFVSQiAqLworCUlSREFfQVNTRVJUKHVyYiA9PSBzZWxmLT50eF91cmIsIHJldHVybjspOworCisJLyogRnJlZSB1cCB0aGUgc2tiICovCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl1cmItPmNvbnRleHQgPSBOVUxMOworCisJLyogQ2hlY2sgZm9yIHRpbWVvdXQgYW5kIG90aGVyIFVTQiBuYXN0aWVzICovCisJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKKwkJLyogSSBnZXQgYSBsb3Qgb2YgLUVDT05OQUJPUlRFRCA9IC0xMDMgaGVyZSAtIEplYW4gSUkgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVVJCIGNvbXBsZXRlIHN0YXR1cyAlZCwgdHJhbnNmZXJfZmxhZ3MgMHglMDRYXG4iLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzLCB1cmItPnRyYW5zZmVyX2ZsYWdzKTsKKworCQkvKiBEb24ndCBkbyBhbnl0aGluZyBoZXJlLCB0aGF0IG1pZ2h0IGNvbmZ1c2UgdGhlIFVTQiBsYXllciwKKwkJICogYW5kIHdlIGNvdWxkIGdvIGluIHJlY3Vyc2lvbiBhbmQgYmxvdyB0aGUga2VybmVsIHN0YWNrLi4uCisJCSAqIEluc3RlYWQsIHdlIHdpbGwgd2FpdCBmb3IgaXJkYV91c2JfbmV0X3RpbWVvdXQoKSwgdGhlCisJCSAqIG5ldHdvcmsgbGF5ZXIgd2F0Y2hkb2csIHRvIGZpeCB0aGUgc2l0dWF0aW9uLgorCQkgKiBKZWFuIElJICovCisJCS8qIEEgcmVzZXQgb2YgdGhlIGRvbmdsZSBtaWdodCBiZSB3ZWxjb21lZCBoZXJlIC0gSmVhbiBJSSAqLworCQlyZXR1cm47CisJfQorCisJLyogdXJiIGlzIG5vdyBhdmFpbGFibGUgKi8KKwkvL3VyYi0+c3RhdHVzID0gMDsgLT4gdGVzdGVkIGFib3ZlCisKKwkvKiBNYWtlIHN1cmUgd2UgcmVhZCBzZWxmLT5wcmVzZW50IHByb3Blcmx5ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qIElmIHRoZSBuZXR3b3JrIGlzIGNsb3NlZCwgc3RvcCBldmVyeXRoaW5nICovCisJaWYgKCghc2VsZi0+bmV0b3BlbikgfHwgKCFzZWxmLT5wcmVzZW50KSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBOZXR3b3JrIGlzIGdvbmUuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIElmIGNoYW5nZXMgdG8gc3BlZWQgb3IgeGJvZnMgaXMgcGVuZGluZy4uLiAqLworCWlmICgoc2VsZi0+bmV3X3NwZWVkICE9IC0xKSB8fCAoc2VsZi0+bmV3X3hib2ZzICE9IC0xKSkgeworCQlpZiAoKHNlbGYtPm5ld19zcGVlZCAhPSBzZWxmLT5zcGVlZCkgfHwKKwkJICAgIChzZWxmLT5uZXdfeGJvZnMgIT0gc2VsZi0+eGJvZnMpKSB7CisJCQkvKiBXZSBoYXZlbid0IGNoYW5nZWQgc3BlZWQgeWV0IChiZWNhdXNlIG9mCisJCQkgKiBJVUNfU1BFRURfQlVHKSwgc28gZG8gaXQgbm93IC0gSmVhbiBJSSAqLworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgQ2hhbmdpbmcgc3BlZWQgbm93Li4uXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJaXJkYV91c2JfY2hhbmdlX3NwZWVkX3hib2ZzKHNlbGYpOworCQl9IGVsc2UgeworCQkJLyogTmV3IHNwZWVkIGFuZCB4Ym9mIGlzIG5vdyBjb21taXRlZCBpbiBoYXJkd2FyZSAqLworCQkJc2VsZi0+bmV3X3NwZWVkID0gLTE7CisJCQlzZWxmLT5uZXdfeGJvZnMgPSAtMTsKKwkJCS8qIERvbmUsIHdhaXRpbmcgZm9yIG5leHQgcGFja2V0ICovCisJCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisJCX0KKwl9IGVsc2UgeworCQkvKiBPdGhlcndpc2UsIGFsbG93IHRoZSBzdGFjayB0byBzZW5kIG1vcmUgcGFja2V0cyAqLworCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdhdGNoZG9nIHRpbWVyIGZyb20gdGhlIG5ldHdvcmsgbGF5ZXIuCisgKiBBZnRlciBhIHByZWRldGVybWluZWQgdGltZW91dCwgaWYgd2UgZG9uJ3QgZ2l2ZSBjb25maXJtYXRpb24gdGhhdAorICogdGhlIHBhY2tldCBoYXMgYmVlbiBzZW50IChpLmUuIG5vIGNhbGwgdG8gbmV0aWZfd2FrZV9xdWV1ZSgpKSwKKyAqIHRoZSBuZXR3b3JrIGxheWVyIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uLgorICogTm90ZSB0aGF0IFVSQiB0aGF0IHdlIHN1Ym1pdCBoYXZlIGFsc28gYSB0aW1lb3V0LiBXaGVuIHRoZSBVUkIgdGltZW91dAorICogZXhwaXJlLCB0aGUgbm9ybWFsIFVSQiBjYWxsYmFjayBpcyBjYWxsZWQgKHdyaXRlX2J1bGtfY2FsbGJhY2soKSkuCisgKi8KK3N0YXRpYyB2b2lkIGlyZGFfdXNiX25ldF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IHVyYiAqdXJiOworCWludAlkb25lID0gMDsJLyogSWYgd2UgaGF2ZSBtYWRlIGFueSBwcm9ncmVzcyAqLworCisJSVJEQV9ERUJVRygwLCAiJXMoKSwgTmV0d29yayBsYXllciB0aGlua3Mgd2UgdGltZWQgb3V0IVxuIiwgX19GVU5DVElPTl9fKTsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJLyogUHJvdGVjdCB1cyBmcm9tIFVTQiBjYWxsYmFja3MsIG5ldCBUeCBhbmQgZWxzZS4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogc2VsZi0+cHJlc2VudCAqTVVTVCogYmUgcmVhZCB1bmRlciBzcGlubG9jayAqLworCWlmICghc2VsZi0+cHJlc2VudCkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIGRldmljZSBub3QgcHJlc2VudCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgc3BlZWQgVVJCICovCisJdXJiID0gc2VsZi0+c3BlZWRfdXJiOworCWlmICh1cmItPnN0YXR1cyAhPSAwKSB7CisJCUlSREFfREVCVUcoMCwgIiVzOiBTcGVlZCBjaGFuZ2UgdGltZWQgb3V0LCB1cmItPnN0YXR1cz0lZCwgdXJiLT50cmFuc2Zlcl9mbGFncz0weCUwNFhcbiIsIG5ldGRldi0+bmFtZSwgdXJiLT5zdGF0dXMsIHVyYi0+dHJhbnNmZXJfZmxhZ3MpOworCisJCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwkJY2FzZSAtRUlOUFJPR1JFU1M6CisJCQl1c2JfdW5saW5rX3VyYih1cmIpOworCQkJLyogTm90ZSA6IGFib3ZlIHdpbGwgICpOT1QqIGNhbGwgbmV0aWZfd2FrZV9xdWV1ZSgpCisJCQkgKiBpbiBjb21wbGV0aW9uIGhhbmRsZXIsIHdlIHdpbGwgY29tZSBiYWNrIGhlcmUuCisJCQkgKiBKZWFuIElJICovCisJCQlkb25lID0gMTsKKwkJCWJyZWFrOworCQljYXNlIC1FQ09OTkFCT1JURUQ6CQkvKiAtMTAzICovCisJCWNhc2UgLUVDT05OUkVTRVQ6CQkvKiAtMTA0ICovCisJCWNhc2UgLUVUSU1FRE9VVDoJCS8qIC0xMTAgKi8KKwkJY2FzZSAtRU5PRU5UOgkJCS8qIC0yICh1cmIgdW5saW5rZWQgYnkgdXMpICAqLworCQlkZWZhdWx0OgkJCS8qID8/PyAtIFBsYXkgc2FmZSAqLworCQkJdXJiLT5zdGF0dXMgPSAwOworCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQkJZG9uZSA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIENoZWNrIFR4IFVSQiAqLworCXVyYiA9IHNlbGYtPnR4X3VyYjsKKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdXJiLT5jb250ZXh0OworCisJCUlSREFfREVCVUcoMCwgIiVzOiBUeCB0aW1lZCBvdXQsIHVyYi0+c3RhdHVzPSVkLCB1cmItPnRyYW5zZmVyX2ZsYWdzPTB4JTA0WFxuIiwgbmV0ZGV2LT5uYW1lLCB1cmItPnN0YXR1cywgdXJiLT50cmFuc2Zlcl9mbGFncyk7CisKKwkJLyogSW5jcmVhc2UgZXJyb3IgY291bnQgKi8KKwkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7CisKKyNpZmRlZiBJVV9CVUdfS0lDS19USU1FT1VUCisJCS8qIENhbid0IGJlIGEgYmFkIGlkZWEgdG8gcmVzZXQgdGhlIHNwZWVkIDstKSAtIEplYW4gSUkgKi8KKwkJaWYoc2VsZi0+bmV3X3NwZWVkID09IC0xKQorCQkJc2VsZi0+bmV3X3NwZWVkID0gc2VsZi0+c3BlZWQ7CisJCWlmKHNlbGYtPm5ld194Ym9mcyA9PSAtMSkKKwkJCXNlbGYtPm5ld194Ym9mcyA9IHNlbGYtPnhib2ZzOworCQlpcmRhX3VzYl9jaGFuZ2Vfc3BlZWRfeGJvZnMoc2VsZik7CisjZW5kaWYgLyogSVVfQlVHX0tJQ0tfVElNRU9VVCAqLworCisJCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwkJY2FzZSAtRUlOUFJPR1JFU1M6CisJCQl1c2JfdW5saW5rX3VyYih1cmIpOworCQkJLyogTm90ZSA6IGFib3ZlIHdpbGwgICpOT1QqIGNhbGwgbmV0aWZfd2FrZV9xdWV1ZSgpCisJCQkgKiBpbiBjb21wbGV0aW9uIGhhbmRsZXIsIGJlY2F1c2UgdXJiLT5zdGF0dXMgd2lsbAorCQkJICogYmUgLUVOT0VOVC4gV2Ugd2lsbCBmaXggdGhhdCBhdCB0aGUgbmV4dCB3YXRjaGRvZywKKwkJCSAqIGxlYXZpbmcgbW9yZSB0aW1lIHRvIFVTQiB0byByZWNvdmVyLi4uCisJCQkgKiBBbHNvLCB3ZSBhcmUgaW4gaW50ZXJydXB0LCBzbyB3ZSBuZWVkIHRvIGhhdmUKKwkJCSAqIFVSQl9BU1lOQ19VTkxJTksgdG8gd29yayBwcm9wZXJseS4uLgorCQkJICogSmVhbiBJSSAqLworCQkJZG9uZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAtRUNPTk5BQk9SVEVEOgkJLyogLTEwMyAqLworCQljYXNlIC1FQ09OTlJFU0VUOgkJLyogLTEwNCAqLworCQljYXNlIC1FVElNRURPVVQ6CQkvKiAtMTEwICovCisJCWNhc2UgLUVOT0VOVDoJCQkvKiAtMiAodXJiIHVubGlua2VkIGJ5IHVzKSAgKi8KKwkJZGVmYXVsdDoJCQkvKiA/Pz8gLSBQbGF5IHNhZmUgKi8KKwkJCWlmKHNrYiAhPSBOVUxMKSB7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQl1cmItPmNvbnRleHQgPSBOVUxMOworCQkJfQorCQkJdXJiLT5zdGF0dXMgPSAwOworCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQkJZG9uZSA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwkvKiBNYXliZSB3ZSBuZWVkIGEgcmVzZXQgKi8KKwkvKiBOb3RlIDogU29tZSBkcml2ZXJzIHNlZW0gdG8gdXNlIGEgdXNiX3NldF9pbnRlcmZhY2UoKSB3aGVuIHRoZXkKKwkgKiBuZWVkIHRvIHJlc2V0IHRoZSBoYXJkd2FyZS4gSHVtLi4uCisJICovCisKKwkvKiBpZihkb25lID09IDApICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFJFQ0VJVkUgUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBSZWNlaXZlIHBhY2tldHMgZnJvbSB0aGUgVVNCIGxheWVyIHN0YWNrIGFuZCBwYXNzIHRoZW0gdG8gdGhlIElyREEgc3RhY2suCisgKiBUcnkgdG8gd29yayBhcm91bmQgVVNCIGZhaWx1cmVzLi4uCisgKi8KKworLyoKKyAqIE5vdGUgOgorICogU29tZSBvZiB5b3UgbWF5IGhhdmUgbm90aWNlZCB0aGF0IG1vc3QgZG9uZ2xlIGhhdmUgYW4gaW50ZXJydXB0IGluIHBpcGUKKyAqIHRoYXQgd2UgZG9uJ3QgdXNlLiBIZXJlIGlzIHRoZSBsaXR0bGUgc2VjcmV0Li4uCisgKiBXaGVuIHdlIGhhbmcgYSBSeCBVUkIgb24gdGhlIGJ1bGsgaW4gcGlwZSwgaXQgZ2VuZXJhdGVzIHNvbWUgVVNCIHRyYWZmaWMKKyAqIGluIGV2ZXJ5IFVTQiBmcmFtZS4gVGhpcyBpcyB1bm5lY2Vzc2FyeSBvdmVyaGVhZC4KKyAqIFRoZSBpbnRlcnJ1cHQgaW4gcGlwZSB3aWxsIGdlbmVyYXRlIGFuIGV2ZW50IGV2ZXJ5IHRpbWUgYSBwYWNrZXQgaXMKKyAqIHJlY2VpdmVkLiBSZWFkaW5nIGFuIGludGVycnVwdCBwaXBlIGFkZHMgbWluaW1hbCBvdmVyaGVhZCwgYnV0IGhhcyBzb21lCisgKiBsYXRlbmN5ICh+MW1zKS4KKyAqIElmIHdlIGFyZSBjb25uZWN0ZWQgKHNwZWVkICE9IDk2MDApLCB3ZSB3YW50IHRvIG1pbmltaXNlIGxhdGVuY3ksIHNvCisgKiB3ZSBqdXN0IGFsd2F5cyBoYW5nIHRoZSBSeCBVUkIgYW5kIGlnbm9yZSB0aGUgaW50ZXJydXB0LgorICogSWYgd2UgYXJlIG5vdCBjb25uZWN0ZWQgKHNwZWVkID09IDk2MDApLCB0aGVyZSBpcyB1c3VhbGx5IG5vIFJ4IHRyYWZmaWMsCisgKiBhbmQgd2Ugd2FudCB0byBtaW5pbWlzZSB0aGUgVVNCIG92ZXJoZWFkLiBJbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkIHdhaXQKKyAqIG9uIHRoZSBpbnRlcnJ1cHQgcGlwZSBhbmQgaGFuZyB0aGUgUnggVVJCIG9ubHkgd2hlbiBhbiBpbnRlcnJ1cHQgaXMKKyAqIHJlY2VpdmVkLgorICogSmVhbiBJSQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTdWJtaXQgYSBSeCBVUkIgdG8gdGhlIFVTQiBsYXllciB0byBoYW5kbGUgcmVjZXB0aW9uIG9mIGEgZnJhbWUKKyAqIE1vc3RseSBjYWxsZWQgYnkgdGhlIGNvbXBsZXRpb24gY2FsbGJhY2sgb2YgdGhlIHByZXZpb3VzIFVSQi4KKyAqCisgKiBKZWFuIElJCisgKi8KK3N0YXRpYyB2b2lkIGlyZGFfdXNiX3N1Ym1pdChzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgaXJkYV9za2JfY2IgKmNiOworCWludCByZXQ7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHVyYiAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIFNhdmUgb3Vyc2VsdmVzIGluIHRoZSBza2IgKi8KKwljYiA9IChzdHJ1Y3QgaXJkYV9za2JfY2IgKikgc2tiLT5jYjsKKwljYi0+Y29udGV4dCA9IHNlbGY7CisKKwkvKiBSZWluaXRpYWxpemUgVVJCICovCisJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBzZWxmLT51c2JkZXYsIAorCQkgICAgICB1c2JfcmN2YnVsa3BpcGUoc2VsZi0+dXNiZGV2LCBzZWxmLT5idWxrX2luX2VwKSwgCisJCSAgICAgIHNrYi0+ZGF0YSwgc2tiLT50cnVlc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpcmRhX3VzYl9yZWNlaXZlLCBza2IpOworCS8qIE5vdGUgOiB1bmxpbmsgKm11c3QqIGJlIHN5bmNocm9ub3VzIGJlY2F1c2Ugb2YgdGhlIGNvZGUgaW4gCisJICogaXJkYV91c2JfbmV0X2Nsb3NlKCkgLT4gZnJlZSB0aGUgc2tiIC0gSmVhbiBJSSAqLworCXVyYi0+c3RhdHVzID0gMDsKKworCS8qIENhbiBiZSBjYWxsZWQgZnJvbSBpcmRhX3VzYl9yZWNlaXZlIChpcnEgaGFuZGxlcikgLT4gR0ZQX0FUT01JQyAqLworCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldCkgeworCQkvKiBJZiB0aGlzIGV2ZXIgaGFwcGVuLCB3ZSBhcmUgaW4gZGVlcCBzKioqLgorCQkgKiBCYXNpY2FsbHksIHRoZSBSeCBwYXRoIHdpbGwgc3RvcC4uLiAqLworCQlJUkRBX1dBUk5JTkcoIiVzKCksIEZhaWxlZCB0byBzdWJtaXQgUnggVVJCICVkXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIHJldCk7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJkYV91c2JfcmVjZWl2ZSh1cmIpCisgKgorICogICAgIENhbGxlZCBieSB0aGUgVVNCIHN1YnN5c3RlbSB3aGVuIGEgZnJhbWUgaGFzIGJlZW4gcmVjZWl2ZWQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlyZGFfdXNiX3JlY2VpdmUoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGY7IAorCXN0cnVjdCBpcmRhX3NrYl9jYiAqY2I7CisJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZGF0YXNrYjsKKwlpbnQJCWRvY29weTsKKworCUlSREFfREVCVUcoMiwgIiVzKCksIGxlbj0lZFxuIiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQorCS8qIEZpbmQgb3Vyc2VsdmVzICovCisJY2IgPSAoc3RydWN0IGlyZGFfc2tiX2NiICopIHNrYi0+Y2I7CisJSVJEQV9BU1NFUlQoY2IgIT0gTlVMTCwgcmV0dXJuOyk7CisJc2VsZiA9IChzdHJ1Y3QgaXJkYV91c2JfY2IgKikgY2ItPmNvbnRleHQ7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIElmIHRoZSBuZXR3b3JrIGlzIGNsb3NlZCBvciB0aGUgZGV2aWNlIGdvbmUsIHN0b3AgZXZlcnl0aGluZyAqLworCWlmICgoIXNlbGYtPm5ldG9wZW4pIHx8ICghc2VsZi0+cHJlc2VudCkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgTmV0d29yayBpcyBnb25lIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJLyogRG9uJ3QgcmUtc3VibWl0IHRoZSBVUkIgOiB3aWxsIHN0YWxsIHRoZSBSeCBwYXRoICovCisJCXJldHVybjsKKwl9CisJCisJLyogQ2hlY2sgdGhlIHN0YXR1cyAqLworCWlmICh1cmItPnN0YXR1cyAhPSAwKSB7CisJCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwkJY2FzZSAtRUlMU0VROgorCQkJc2VsZi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlzZWxmLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CQorCQkJYnJlYWs7CisJCWNhc2UgLUVDT05OUkVTRVQ6CQkvKiAtMTA0ICovCisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBDb25uZWN0aW9uIFJlc2V0ICgtMTA0KSwgdHJhbnNmZXJfZmxhZ3MgMHglMDRYIFxuIiwgX19GVU5DVElPTl9fLCB1cmItPnRyYW5zZmVyX2ZsYWdzKTsKKwkJCS8qIHVoY2lfY2xlYW51cF91bmxpbmsoKSBpcyBnb2luZyB0byBraWxsIHRoZSBSeAorCQkJICogVVJCIGp1c3QgYWZ0ZXIgd2UgcmV0dXJuLiBObyBwcm9ibGVtLCBhdCB0aGlzCisJCQkgKiBwb2ludCB0aGUgVVJCIHdpbGwgYmUgaWRsZSA7LSkgLSBKZWFuIElJICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIFJYIHN0YXR1cyAlZCx0cmFuc2Zlcl9mbGFncyAweCUwNFggXG4iLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzLCB1cmItPnRyYW5zZmVyX2ZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisJCWdvdG8gZG9uZTsKKwl9CisJCisJLyogQ2hlY2sgZm9yIGVtcHR5IGZyYW1lcyAqLworCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPD0gVVNCX0lSREFfSEVBREVSKSB7CisJCUlSREFfV0FSTklORygiJXMoKSwgZW1wdHkgZnJhbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogIAorCSAqIFJlbWVtYmVyIHRoZSB0aW1lIHdlIHJlY2VpdmVkIHRoaXMgZnJhbWUsIHNvIHdlIGNhbgorCSAqIHJlZHVjZSB0aGUgbWluIHR1cm4gdGltZSBhIGJpdCBzaW5jZSB3ZSB3aWxsIGtub3cKKwkgKiBob3cgbXVjaCB0aW1lIHdlIGhhdmUgdXNlZCBmb3IgcHJvdG9jb2wgcHJvY2Vzc2luZworCSAqLworICAgICAgICBkb19nZXR0aW1lb2ZkYXkoJnNlbGYtPnN0YW1wKTsKKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY29weSB0aGUgZGF0YSB0byBhIG5ldyBza2Igb3Igbm90LgorCSAqIEZvciBtb3N0IGZyYW1lcywgd2UgdXNlIFplcm9Db3B5IGFuZCBwYXNzIHRoZSBhbHJlYWR5CisJICogYWxsb2NhdGVkIHNrYiB1cCB0aGUgc3RhY2suCisJICogSWYgdGhlIGZyYW1lIGlzIHNtYWxsLCBpdCBpcyBtb3JlIGVmZmljaWVudCB0byBjb3B5IGl0CisJICogdG8gc2F2ZSBtZW1vcnkgKGNvcHkgd2lsbCBiZSBmYXN0IGFueXdheSAtIHRoYXQncworCSAqIGNhbGxlZCBSeC1jb3B5LWJyZWFrKS4gSmVhbiBJSSAqLworCWRvY29weSA9ICh1cmItPmFjdHVhbF9sZW5ndGggPCBJUkRBX1JYX0NPUFlfVEhSRVNIT0xEKTsKKworCS8qIEFsbG9jYXRlIGEgbmV3IHNrYiAqLworCW5ld3NrYiA9IGRldl9hbGxvY19za2IoZG9jb3B5ID8gdXJiLT5hY3R1YWxfbGVuZ3RoIDogSVJEQV9TS0JfTUFYX01UVSk7CisJaWYgKCFuZXdza2IpICB7CisJCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJLyogV2UgY291bGQgZGVsaXZlciB0aGUgY3VycmVudCBza2IsIGJ1dCB0aGlzIHdvdWxkIHN0YWxsCisJCSAqIHRoZSBSeCBwYXRoLiBCZXR0ZXIgZHJvcCB0aGUgcGFja2V0Li4uIEplYW4gSUkgKi8KKwkJZ290byBkb25lOyAgCisJfQorCisJLyogTWFrZSBzdXJlIElQIGhlYWRlciBnZXQgYWxpZ25lZCAoSXJEQSBoZWFkZXIgaXMgNSBieXRlcykgKi8KKwkvKiBCdXQgSXJEQS1VU0IgaGVhZGVyIGlzIDEgYnl0ZS4gSmVhbiBJSSAqLworCS8vc2tiX3Jlc2VydmUobmV3c2tiLCBVU0JfSVJEQV9IRUFERVIgLSAxKTsKKworCWlmKGRvY29weSkgeworCQkvKiBDb3B5IHBhY2tldCwgc28gd2UgY2FuIHJlY3ljbGUgdGhlIG9yaWdpbmFsICovCisJCW1lbWNweShuZXdza2ItPmRhdGEsIHNrYi0+ZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJLyogRGVsaXZlciB0aGlzIG5ldyBza2IgKi8KKwkJZGF0YXNrYiA9IG5ld3NrYjsKKwkJLyogQW5kIGhvb2sgdGhlIG9sZCBza2IgdG8gdGhlIFVSQgorCQkgKiBOb3RlIDogd2UgZG9uJ3QgbmVlZCB0byAiY2xlYW4gdXAiIHRoZSBvbGQgc2tiLAorCQkgKiBhcyB3ZSBuZXZlciB0b3VjaGVkIGl0LiBKZWFuIElJICovCisJfSBlbHNlIHsKKwkJLyogV2UgYXJlIHVzaW5nIFplcm9Db3B5LiBEZWxpdmVyIG9sZCBza2IgKi8KKwkJZGF0YXNrYiA9IHNrYjsKKwkJLyogQW5kIGhvb2sgdGhlIG5ldyBza2IgdG8gdGhlIFVSQiAqLworCQlza2IgPSBuZXdza2I7CisJfQorCisJLyogU2V0IHByb3BlciBsZW5ndGggb24gc2tiICYgcmVtb3ZlIFVTQi1JckRBIGhlYWRlciAqLworCXNrYl9wdXQoZGF0YXNrYiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlza2JfcHVsbChkYXRhc2tiLCBVU0JfSVJEQV9IRUFERVIpOworCisJLyogQXNrIHRoZSBuZXR3b3JraW5nIGxheWVyIHRvIHF1ZXVlIHRoZSBwYWNrZXQgZm9yIHRoZSBJckRBIHN0YWNrICovCisJZGF0YXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OworCWRhdGFza2ItPm1hYy5yYXcgID0gZGF0YXNrYi0+ZGF0YTsKKwlkYXRhc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOworCW5ldGlmX3J4KGRhdGFza2IpOworCisJLyogS2VlcCBzdGF0cyB1cCB0byBkYXRlICovCisJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gZGF0YXNrYi0+bGVuOworCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlzZWxmLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCitkb25lOgorCS8qIE5vdGUgOiBhdCB0aGlzIHBvaW50LCB0aGUgVVJCIHdlJ3ZlIGp1c3QgcmVjZWl2ZWQgKHVyYikKKwkgKiBpcyBzdGlsbCByZWZlcmVuY2VkIGJ5IHRoZSBVU0IgbGF5ZXIuIEZvciBleGFtcGxlLCBpZiB3ZQorCSAqIGhhdmUgcmVjZWl2ZWQgYSAtRUNPTk5SRVNFVCwgdWhjaV9jbGVhbnVwX3VubGluaygpIHdpbGwKKwkgKiBjb250aW51ZSB0byBwcm9jZXNzIGl0IChpbiBmYWN0LCBjbGVhbmluZyBpdCB1cCkuCisJICogSWYgd2Ugd2VyZSB0byBzdWJtaXQgdGhpcyBVUkIsIGRpc2FzdGVyIHdvdWxkIGVuc3VlLgorCSAqIFRoZXJlZm9yZSwgd2Ugc3VibWl0IG91ciBpZGxlIFVSQiwgYW5kIHB1dCB0aGlzIFVSQiBpbiBvdXIKKwkgKiBpZGxlIHNsb3QuLi4uCisJICogSmVhbiBJSSAqLworCS8qIE5vdGUgOiB3aXRoIHRoaXMgc2NoZW1lLCB3ZSBjb3VsZCBzdWJtaXQgdGhlIGlkbGUgVVJCIGJlZm9yZQorCSAqIHByb2Nlc3NpbmcgdGhlIFJ4IFVSQi4gQW5vdGhlciB0aW1lLi4uIEplYW4gSUkgKi8KKworCS8qIFN1Ym1pdCB0aGUgaWRsZSBVUkIgdG8gcmVwbGFjZSB0aGUgVVJCIHdlJ3ZlIGp1c3QgcmVjZWl2ZWQgKi8KKwlpcmRhX3VzYl9zdWJtaXQoc2VsZiwgc2tiLCBzZWxmLT5pZGxlX3J4X3VyYik7CisJLyogUmVjeWNsZSBSeCBVUkIgOiBOb3csIHRoZSBpZGxlIFVSQiBpcyB0aGUgcHJlc2VudCBvbmUgKi8KKwl1cmItPmNvbnRleHQgPSBOVUxMOworCXNlbGYtPmlkbGVfcnhfdXJiID0gdXJiOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ2FsbGJhayBmcm9tIElyREEgbGF5ZXIuIElyREEgd2FudHMgdG8ga25vdyBpZiB3ZSBoYXZlCisgKiBzdGFydGVkIHJlY2VpdmluZyBhbnl0aGluZy4KKyAqLworc3RhdGljIGludCBpcmRhX3VzYl9pc19yZWNlaXZpbmcoc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmKQoreworCS8qIE5vdGUgOiBiZWNhdXNlIG9mIHRoZSB3YXkgVUhDSSB3b3JrcywgaXQncyBhbG1vc3QgaW1wb3NzaWJsZQorCSAqIHRvIGdldCB0aGlzIGluZm8uIFRoZSBDb250cm9sbGVyIERNQSBkaXJlY3RseSB0byBtZW1vcnkgYW5kCisJICogc2lnbmFsIG9ubHkgd2hlbiB0aGUgd2hvbGUgZnJhbWUgaXMgZmluaXNoZWQuIFRvIGtub3cgaWYgdGhlCisJICogZmlyc3QgVEQgb2YgdGhlIFVSQiBoYXMgYmVlbiBmaWxsZWQgb3Igbm90IHNlZW1zIGhhcmQgd29yay4uLgorCSAqCisJICogVGhlIG90aGVyIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSB0aGUgInJlY2VpdmluZyIgY29tbWFuZAorCSAqIG9uIHRoZSBkZWZhdWx0IGRlY3JpcHRvciB3aXRoIGEgdXNiX2NvbnRyb2xfbXNnKCksIGJ1dCB0aGF0CisJICogd291bGQgYWRkIFVTQiB0cmFmZmljIGFuZCB3b3VsZCByZXR1cm4gcmVzdWx0IG9ubHkgaW4gdGhlCisJICogbmV4dCBVU0IgZnJhbWUgKH4xbXMpLgorCSAqCisJICogSSd2ZSBiZWVuIHRvbGQgdGhhdCBjdXJyZW50IGRvbmdsZXMgc2VuZCBzdGF0dXMgaW5mbyBvbiB0aGVpcgorCSAqIGludGVycnVwdCBlbmRwb2ludCwgYW5kIHRoYXQncyB3aGF0IHRoZSBXaW5kb3dzIGRyaXZlciB1c2VzCisJICogdG8ga25vdyB0aGlzIGluZm8uIFVuZm9ydHVuYXRlbHksIHRoaXMgaXMgbm90IHlldCBpbiB0aGUgc3BlYy4uLgorCSAqCisJICogSmVhbiBJSQorCSAqLworCisJcmV0dXJuIDA7IC8qIEZvciBub3cgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKiogSVJEQSBERVZJQ0UgQ0FMTEJBQ0tTICoqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogTWFpbiBjYWxscyBmcm9tIHRoZSBJckRBL05ldHdvcmsgc3Vic3lzdGVtLgorICogTW9zdGx5IHJlZ2lzdGVyaW5nIGEgbmV3IGlyZGEtdXNiIGRldmljZSBhbmQgcmVtb3ZpbmcgaXQuLi4uCisgKiBXZSBvbmx5IGRlYWwgd2l0aCB0aGUgSXJEQSBzaWRlIG9mIHRoZSBidXNpbmVzcywgdGhlIFVTQiBzaWRlIHdpbGwKKyAqIGJlIGRlYWx0IHdpdGggYmVsb3cuLi4KKyAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcmRhX3VzYl9uZXRfb3BlbiAoZGV2KQorICoKKyAqICAgIE5ldHdvcmsgZGV2aWNlIGlzIHRha2VuIHVwLiBVc3VhbGx5IHRoaXMgaXMgZG9uZSBieSAiaWZjb25maWcgaXJkYTAgdXAiIAorICogICAKKyAqIE5vdGUgOiBkb24ndCBtZXNzIHdpdGggc2VsZi0+bmV0b3BlbiAtIEplYW4gSUkKKyAqLworc3RhdGljIGludCBpcmRhX3VzYl9uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZjsKKwljaGFyCWh3bmFtZVsxNl07CisJaW50IGk7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKG5ldGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlzZWxmID0gKHN0cnVjdCBpcmRhX3VzYl9jYiAqKSBuZXRkZXYtPnByaXY7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCS8qIENhbiBvbmx5IG9wZW4gdGhlIGRldmljZSBpZiBpdCdzIHRoZXJlICovCisJaWYoIXNlbGYtPnByZXNlbnQpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBkZXZpY2Ugbm90IHByZXNlbnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogSW5pdGlhbGlzZSBkZWZhdWx0IHNwZWVkIGFuZCB4Ym9mcyB2YWx1ZQorCSAqIChJckxBUCB3aWxsIGNoYW5nZSB0aGF0IHNvb24pICovCisJc2VsZi0+c3BlZWQgPSAtMTsKKwlzZWxmLT54Ym9mcyA9IC0xOworCXNlbGYtPm5ld19zcGVlZCA9IC0xOworCXNlbGYtPm5ld194Ym9mcyA9IC0xOworCisJLyogVG8gZG8gKmJlZm9yZSogc3VibWl0dGluZyBSeCB1cmJzIGFuZCBzdGFydGluZyBuZXQgVHggcXVldWUKKwkgKiBKZWFuIElJICovCisJc2VsZi0+bmV0b3BlbiA9IDE7CisKKwkvKiAKKwkgKiBOb3cgdGhhdCBldmVyeXRoaW5nIHNob3VsZCBiZSBpbml0aWFsaXplZCBwcm9wZXJseSwKKwkgKiBPcGVuIG5ldyBJckxBUCBsYXllciBpbnN0YW5jZSB0byB0YWtlIGNhcmUgb2YgdXMuLi4KKwkgKiBOb3RlIDogd2lsbCBzZW5kIGltbWVkaWF0ZWx5IGEgc3BlZWQgY2hhbmdlLi4uCisJICovCisJc3ByaW50Zihod25hbWUsICJ1c2IjJWQiLCBzZWxmLT51c2JkZXYtPmRldm51bSk7CisJc2VsZi0+aXJsYXAgPSBpcmxhcF9vcGVuKG5ldGRldiwgJnNlbGYtPnFvcywgaHduYW1lKTsKKwlJUkRBX0FTU0VSVChzZWxmLT5pcmxhcCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCS8qIEFsbG93IElyTEFQIHRvIHNlbmQgZGF0YSB0byB1cyAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisKKwkvKiBXZSBzdWJtaXQgYWxsIHRoZSBSeCBVUkIgZXhjZXB0IGZvciBvbmUgdGhhdCB3ZSBrZWVwIGlkbGUuCisJICogTmVlZCB0byBiZSBpbml0aWFsaXNlZCBiZWZvcmUgc3VibWl0dGluZyBvdGhlciBVU0JzLCBiZWNhdXNlCisJICogaW4gc29tZSBjYXNlcyBhcyBzb29uIGFzIHdlIHN1Ym1pdCB0aGUgVVJCcyB0aGUgVVNCIGxheWVyCisJICogd2lsbCB0cmlnZ2VyIGEgZHVtbXkgcmVjZWl2ZSAtIEplYW4gSUkgKi8KKwlzZWxmLT5pZGxlX3J4X3VyYiA9IHNlbGYtPnJ4X3VyYltJVV9NQVhfQUNUSVZFX1JYX1VSQlNdOworCXNlbGYtPmlkbGVfcnhfdXJiLT5jb250ZXh0ID0gTlVMTDsKKworCS8qIE5vdyB0aGF0IHdlIGNhbiBwYXNzIGRhdGEgdG8gSXJMQVAsIGFsbG93IHRoZSBVU0IgbGF5ZXIKKwkgKiB0byBzZW5kIHVzIHNvbWUgZGF0YS4uLiAqLworCWZvciAoaSA9IDA7IGkgPCBJVV9NQVhfQUNUSVZFX1JYX1VSQlM7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihJUkRBX1NLQl9NQVhfTVRVKTsKKwkJaWYgKCFza2IpIHsKKwkJCS8qIElmIHRoaXMgZXZlciBoYXBwZW4sIHdlIGFyZSBpbiBkZWVwIHMqKiouCisJCQkgKiBCYXNpY2FsbHksIHdlIGNhbid0IHN0YXJ0IHRoZSBSeCBwYXRoLi4uICovCisJCQlJUkRBX1dBUk5JTkcoIiVzKCksIEZhaWxlZCB0byBhbGxvY2F0ZSBSeCBza2JcbiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJCS8vc2tiX3Jlc2VydmUobmV3c2tiLCBVU0JfSVJEQV9IRUFERVIgLSAxKTsKKwkJaXJkYV91c2Jfc3VibWl0KHNlbGYsIHNrYiwgc2VsZi0+cnhfdXJiW2ldKTsKKwl9CisKKwkvKiBSZWFkeSB0byBwbGF5ICEhISAqLworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJkYV91c2JfbmV0X2Nsb3NlIChzZWxmKQorICoKKyAqICAgIE5ldHdvcmsgZGV2aWNlIGlzIHRha2VuIGRvd24uIFVzdWFsbHkgdGhpcyBpcyBkb25lIGJ5IAorICogICAgImlmY29uZmlnIGlyZGEwIGRvd24iIAorICovCitzdGF0aWMgaW50IGlyZGFfdXNiX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZjsKKwlpbnQJaTsKKworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChuZXRkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IChzdHJ1Y3QgaXJkYV91c2JfY2IgKikgbmV0ZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkvKiBDbGVhciB0aGlzIGZsYWcgKmJlZm9yZSogdW5saW5raW5nIHRoZSB1cmJzIGFuZCAqYmVmb3JlKgorCSAqIHN0b3BwaW5nIHRoZSBuZXR3b3JrIFR4IHF1ZXVlIC0gSmVhbiBJSSAqLworCXNlbGYtPm5ldG9wZW4gPSAwOworCisJLyogU3RvcCBuZXR3b3JrIFR4IHF1ZXVlICovCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJLyogRGVhbGxvY2F0ZSBhbGwgdGhlIFJ4IHBhdGggYnVmZmVycyAoVVJCcyBhbmQgc2tiKSAqLworCWZvciAoaSA9IDA7IGkgPCBJVV9NQVhfUlhfVVJCUzsgaSsrKSB7CisJCXN0cnVjdCB1cmIgKnVyYiA9IHNlbGYtPnJ4X3VyYltpXTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSB1cmItPmNvbnRleHQ7CisJCS8qIENhbmNlbCB0aGUgcmVjZWl2ZSBjb21tYW5kICovCisJCXVzYl9raWxsX3VyYih1cmIpOworCQkvKiBUaGUgc2tiIGlzIG91cnMsIGZyZWUgaXQgKi8KKwkJaWYoc2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQl1cmItPmNvbnRleHQgPSBOVUxMOworCQl9CisJfQorCS8qIENhbmNlbCBUeCBhbmQgc3BlZWQgVVJCIC0gbmVlZCB0byBiZSBzeW5jaHJvbm91cyB0byBhdm9pZCByYWNlcyAqLworCXNlbGYtPnR4X3VyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CisJdXNiX2tpbGxfdXJiKHNlbGYtPnR4X3VyYik7CisJc2VsZi0+c3BlZWRfdXJiLT50cmFuc2Zlcl9mbGFncyAmPSB+VVJCX0FTWU5DX1VOTElOSzsKKwl1c2Jfa2lsbF91cmIoc2VsZi0+c3BlZWRfdXJiKTsKKworCS8qIFN0b3AgYW5kIHJlbW92ZSBpbnN0YW5jZSBvZiBJckxBUCAqLworCWlmIChzZWxmLT5pcmxhcCkKKwkJaXJsYXBfY2xvc2Uoc2VsZi0+aXJsYXApOworCXNlbGYtPmlybGFwID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogSU9DVExzIDogRXh0cmEgb3V0LW9mLWJhbmQgbmV0d29yayBjb21tYW5kcy4uLgorICovCitzdGF0aWMgaW50IGlyZGFfdXNiX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlmX2lyZGFfcmVxICppcnEgPSAoc3RydWN0IGlmX2lyZGFfcmVxICopIHJxOworCXN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZjsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlzZWxmID0gZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAlcywgKGNtZD0weCVYKVxuIiwgX19GVU5DVElPTl9fLCBkZXYtPm5hbWUsIGNtZCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ1NCQU5EV0lEVEg6IC8qIFNldCBiYW5kd2lkdGggKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJLyogUHJvdGVjdCB1cyBmcm9tIFVTQiBjYWxsYmFja3MsIG5ldCB3YXRjaGRvZyBhbmQgZWxzZS4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJLyogQ2hlY2sgaWYgdGhlIGRldmljZSBpcyBzdGlsbCB0aGVyZSAqLworCQlpZihzZWxmLT5wcmVzZW50KSB7CisJCQkvKiBTZXQgdGhlIGRlc2lyZWQgc3BlZWQgKi8KKwkJCXNlbGYtPm5ld19zcGVlZCA9IGlycS0+aWZyX2JhdWRyYXRlOworCQkJaXJkYV91c2JfY2hhbmdlX3NwZWVkX3hib2ZzKHNlbGYpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU01FRElBQlVTWTogLyogU2V0IG1lZGlhIGJ1c3kgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJLyogQ2hlY2sgaWYgdGhlIElyREEgc3RhY2sgaXMgc3RpbGwgdGhlcmUgKi8KKwkJaWYoc2VsZi0+bmV0b3BlbikKKwkJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KHNlbGYtPm5ldGRldiwgVFJVRSk7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dSRUNFSVZJTkc6IC8qIENoZWNrIGlmIHdlIGFyZSByZWNlaXZpbmcgcmlnaHQgbm93ICovCisJCWlycS0+aWZyX3JlY2VpdmluZyA9IGlyZGFfdXNiX2lzX3JlY2VpdmluZyhzZWxmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCQorCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBHZXQgZGV2aWNlIHN0YXRzIChmb3IgL3Byb2MvbmV0L2RldiBhbmQgaWZjb25maWcpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXJkYV91c2JfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZiA9IGRldi0+cHJpdjsKKwlyZXR1cm4gJnNlbGYtPnN0YXRzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqIElSREEgQ09ORklHIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBWYXJpb3VzIHN1YnJvdXRpbmVzIGRlYWxpbmcgd2l0aCBJckRBIGFuZCBuZXR3b3JrIHN0dWZmIHdlIHVzZSB0bworICogY29uZmlndXJlIGFuZCBpbml0aWFsaXNlIGVhY2ggaXJkYS11c2IgaW5zdGFuY2UuCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgYmVsb3cgaW4gdGhlIG1haW4gY2FsbHMgb2YgdGhlIGRyaXZlci4uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTZXQgcHJvcGVyIHZhbHVlcyBpbiB0aGUgSXJEQSBRT1Mgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcmRhX3VzYl9pbml0X3FvcyhzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYpCit7CisJc3RydWN0IGlyZGFfY2xhc3NfZGVzYyAqZGVzYzsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJCisJZGVzYyA9IHNlbGYtPmlyZGFfZGVzYzsKKwkKKwkvKiBJbml0aWFsaXplIFFvUyBmb3IgdGhpcyBkZXZpY2UgKi8KKwlpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKCZzZWxmLT5xb3MpOworCisJLyogU2VlIHNwZWMgc2VjdGlvbiA3LjIgZm9yIG1lYW5pbmcuCisJICogVmFsdWVzIGFyZSBsaXR0bGUgZW5kaWFuIChhcyBtb3N0IFVTQiBzdHVmZiksIHRoZSBJckRBIHN0YWNrCisJICogdXNlIGl0IGluIG5hdGl2ZSBvcmRlciAoc2VlIHBhcmFtZXRlcnMuYykuIC0gSmVhbiBJSSAqLworCXNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyAgICAgICA9IGxlMTZfdG9fY3B1KGRlc2MtPndCYXVkUmF0ZSk7CisJc2VsZi0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyAgID0gZGVzYy0+Ym1NaW5UdXJuYXJvdW5kVGltZTsKKwlzZWxmLT5xb3MuYWRkaXRpb25hbF9ib2ZzLmJpdHMgPSBkZXNjLT5ibUFkZGl0aW9uYWxCT0ZzOworCXNlbGYtPnFvcy53aW5kb3dfc2l6ZS5iaXRzICAgICA9IGRlc2MtPmJtV2luZG93U2l6ZTsKKwlzZWxmLT5xb3MuZGF0YV9zaXplLmJpdHMgICAgICAgPSBkZXNjLT5ibURhdGFTaXplOworCisJSVJEQV9ERUJVRygwLCAiJXMoKSwgZG9uZ2xlIHNheXMgc3BlZWQ9MHglWCwgc2l6ZT0weCVYLCB3aW5kb3c9MHglWCwgYm9mcz0weCVYLCB0dXJuPTB4JVhcbiIsIAorCQlfX0ZVTkNUSU9OX18sIHNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cywgc2VsZi0+cW9zLmRhdGFfc2l6ZS5iaXRzLCBzZWxmLT5xb3Mud2luZG93X3NpemUuYml0cywgc2VsZi0+cW9zLmFkZGl0aW9uYWxfYm9mcy5iaXRzLCBzZWxmLT5xb3MubWluX3R1cm5fdGltZS5iaXRzKTsKKworCS8qIERvbid0IGFsd2F5cyB0cnVzdCB3aGF0IHRoZSBkb25nbGUgdGVsbCB1cyAqLworCWlmKHNlbGYtPmNhcGFiaWxpdHkgJiBJVUNfU0lSX09OTFkpCisJCXNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cwkmPSAweDAwZmY7CisJaWYoc2VsZi0+Y2FwYWJpbGl0eSAmIElVQ19TTUFMTF9QS1QpCisJCXNlbGYtPnFvcy5kYXRhX3NpemUuYml0cwkgPSAweDA3OworCWlmKHNlbGYtPmNhcGFiaWxpdHkgJiBJVUNfTk9fV0lORE9XKQorCQlzZWxmLT5xb3Mud2luZG93X3NpemUuYml0cwkgPSAweDAxOworCWlmKHNlbGYtPmNhcGFiaWxpdHkgJiBJVUNfTUFYX1dJTkRPVykKKwkJc2VsZi0+cW9zLndpbmRvd19zaXplLmJpdHMJID0gMHg3ZjsKKwlpZihzZWxmLT5jYXBhYmlsaXR5ICYgSVVDX01BWF9YQk9GUykKKwkJc2VsZi0+cW9zLmFkZGl0aW9uYWxfYm9mcy5iaXRzCSA9IDB4MDE7CisKKyNpZiAxCisJLyogTW9kdWxlIHBhcmFtZXRlciBjYW4gb3ZlcnJpZGUgdGhlIHJ4IHdpbmRvdyBzaXplICovCisJaWYgKHFvc19tdHRfYml0cykKKwkJc2VsZi0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyA9IHFvc19tdHRfYml0czsKKyNlbmRpZgkgICAgCisJLyogCisJICogTm90ZSA6IG1vc3Qgb2YgdGhvc2UgdmFsdWVzIGFwcGx5IG9ubHkgZm9yIHRoZSByZWNlaXZlIHBhdGgsCisJICogdGhlIHRyYW5zbWl0IHBhdGggd2lsbCBiZSBzZXQgZGlmZmVyZW50bHkgLSBKZWFuIElJIAorCSAqLworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoJnNlbGYtPnFvcyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBJbml0aWFsaXNlIHRoZSBuZXR3b3JrIHNpZGUgb2YgdGhlIGlyZGEtdXNiIGluc3RhbmNlCisgKiBDYWxsZWQgd2hlbiBhIG5ldyBVU0IgaW5zdGFuY2UgaXMgcmVnaXN0ZXJlZCBpbiBpcmRhX3VzYl9wcm9iZSgpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlyZGFfdXNiX29wZW4oc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBzZWxmLT5uZXRkZXY7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaXJkYV91c2JfaW5pdF9xb3Moc2VsZik7CisKKwkvKiBPdmVycmlkZSB0aGUgbmV0d29yayBmdW5jdGlvbnMgd2UgbmVlZCB0byB1c2UgKi8KKwluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGlyZGFfdXNiX2hhcmRfeG1pdDsKKwluZXRkZXYtPnR4X3RpbWVvdXQJPSBpcmRhX3VzYl9uZXRfdGltZW91dDsKKwluZXRkZXYtPndhdGNoZG9nX3RpbWVvICA9IDI1MCpIWi8xMDAwOwkvKiAyNTAgbXMgPiBVU0IgdGltZW91dCAqLworCW5ldGRldi0+b3BlbiAgICAgICAgICAgID0gaXJkYV91c2JfbmV0X29wZW47CisJbmV0ZGV2LT5zdG9wICAgICAgICAgICAgPSBpcmRhX3VzYl9uZXRfY2xvc2U7CisJbmV0ZGV2LT5nZXRfc3RhdHMJPSBpcmRhX3VzYl9uZXRfZ2V0X3N0YXRzOworCW5ldGRldi0+ZG9faW9jdGwgICAgICAgID0gaXJkYV91c2JfbmV0X2lvY3RsOworCisJcmV0dXJuIHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ2xlYW51cCB0aGUgbmV0d29yayBzaWRlIG9mIHRoZSBpcmRhLXVzYiBpbnN0YW5jZQorICogQ2FsbGVkIHdoZW4gYSBVU0IgaW5zdGFuY2UgaXMgcmVtb3ZlZCBpbiBpcmRhX3VzYl9kaXNjb25uZWN0KCkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlyZGFfdXNiX2Nsb3NlKHN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUmVtb3ZlIG5ldGRldmljZSAqLworCXVucmVnaXN0ZXJfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisKKwkvKiBSZW1vdmUgdGhlIHNwZWVkIGJ1ZmZlciAqLworCWlmIChzZWxmLT5zcGVlZF9idWZmICE9IE5VTEwpIHsKKwkJa2ZyZWUoc2VsZi0+c3BlZWRfYnVmZik7CisJCXNlbGYtPnNwZWVkX2J1ZmYgPSBOVUxMOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKiogVVNCIENPTkZJRyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFZhcmlvdXMgc3Vicm91dGluZXMgZGVhbGluZyB3aXRoIFVTQiBzdHVmZiB3ZSB1c2UgdG8gY29uZmlndXJlIGFuZAorICogaW5pdGlhbGlzZSBlYWNoIGlyZGEtdXNiIGluc3RhbmNlLgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGJlbG93IGluIHRoZSBtYWluIGNhbGxzIG9mIHRoZSBkcml2ZXIuLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJkYV91c2JfcGFyc2VfZW5kcG9pbnRzKGRldiwgaWZudW0pCisgKgorICogICAgUGFyc2UgdGhlIHZhcmlvdXMgZW5kcG9pbnRzIGFuZCBmaW5kIHRoZSBvbmUgd2UgbmVlZC4KKyAqCisgKiBUaGUgZW5kcG9pbnQgYXJlIHRoZSBwaXBlcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIFVTQiBkZXZpY2UuCisgKiBUaGUgc3BlYyBkZWZpbmVzIDIgZW5kcG9pbnRzIG9mIHR5cGUgYnVsayB0cmFuc2Zlciwgb25lIGluLCBhbmQgb25lIG91dC4KKyAqIFRoZXNlIGFyZSB1c2VkIHRvIHBhc3MgZnJhbWVzIGJhY2sgYW5kIGZvcnRoIHdpdGggdGhlIGRvbmdsZS4KKyAqIE1vc3QgZG9uZ2xlIGhhdmUgYWxzbyBhbiBpbnRlcnJ1cHQgZW5kcG9pbnQsIHRoYXQgd2lsbCBiZSBwcm9iYWJseQorICogZG9jdW1lbnRlZCBpbiB0aGUgbmV4dCBzcGVjLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlyZGFfdXNiX3BhcnNlX2VuZHBvaW50cyhzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYsIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZW5kcG9pbnQsIGludCBlbm51bSkKK3sKKwlpbnQgaTsJCS8qIEVuZHBvaW50IGluZGV4IGluIHRhYmxlICovCisJCQorCS8qIEluaXQgOiBubyBlbmRwb2ludHMgKi8KKwlzZWxmLT5idWxrX2luX2VwID0gMDsKKwlzZWxmLT5idWxrX291dF9lcCA9IDA7CisJc2VsZi0+YnVsa19pbnRfZXAgPSAwOworCisJLyogTGV0J3MgbG9vayBhdCBhbGwgdGhvc2UgZW5kcG9pbnRzICovCisJZm9yKGkgPSAwOyBpIDwgZW5udW07IGkrKykgeworCQkvKiBBbGwgdGhvc2UgdmFyaWFibGVzIHdpbGwgZ2V0IG9wdGltaXNlZCBieSB0aGUgY29tcGlsZXIsCisJCSAqIHNvIGxldCdzIGFpbSBmb3IgY2xhcml0eS4uLiAtIEplYW4gSUkgKi8KKwkJX191OCBlcDsJLyogRW5kcG9pbnQgYWRkcmVzcyAqLworCQlfX3U4IGRpcjsJLyogRW5kcG9pbnQgZGlyZWN0aW9uICovCisJCV9fdTggYXR0cjsJLyogRW5kcG9pbnQgYXR0cmlidXRlICovCisJCV9fdTE2IHBzaXplOwkvKiBFbmRwb2ludCBtYXggcGFja2V0IHNpemUgaW4gYnl0ZXMgKi8KKworCQkvKiBHZXQgZW5kcG9pbnQgYWRkcmVzcywgZGlyZWN0aW9uIGFuZCBhdHRyaWJ1dGUgKi8KKwkJZXAgPSBlbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7CisJCWRpciA9IGVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSzsKKwkJYXR0ciA9IGVuZHBvaW50W2ldLmRlc2MuYm1BdHRyaWJ1dGVzOworCQlwc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50W2ldLmRlc2Mud01heFBhY2tldFNpemUpOworCisJCS8qIElzIGl0IGEgYnVsayBlbmRwb2ludCA/Pz8gKi8KKwkJaWYoYXR0ciA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSB7CisJCQkvKiBXZSBuZWVkIHRvIGZpbmQgYW4gSU4gYW5kIGFuIE9VVCAqLworCQkJaWYoZGlyID09IFVTQl9ESVJfSU4pIHsKKwkJCQkvKiBUaGlzIGlzIG91ciBSeCBlbmRwb2ludCAqLworCQkJCXNlbGYtPmJ1bGtfaW5fZXAgPSBlcDsKKwkJCX0gZWxzZSB7CisJCQkJLyogVGhpcyBpcyBvdXIgVHggZW5kcG9pbnQgKi8KKwkJCQlzZWxmLT5idWxrX291dF9lcCA9IGVwOworCQkJCXNlbGYtPmJ1bGtfb3V0X210dSA9IHBzaXplOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYoKGF0dHIgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSAmJgorCQkJICAgKGRpciA9PSBVU0JfRElSX0lOKSkgeworCQkJCS8qIFRoaXMgaXMgb3VyIGludGVycnVwdCBlbmRwb2ludCAqLworCQkJCXNlbGYtPmJ1bGtfaW50X2VwID0gZXA7CisJCQl9IGVsc2UgeworCQkJCUlSREFfRVJST1IoIiVzKCksIFVucmVjb2duaXNlZCBlbmRwb2ludCAlMDJYLlxuIiwgX19GVU5DVElPTl9fLCBlcCk7CisJCQl9CisJCX0KKwl9CisKKwlJUkRBX0RFQlVHKDAsICIlcygpLCBBbmQgb3VyIGVuZHBvaW50cyBhcmUgOiBpbj0lMDJYLCBvdXQ9JTAyWCAoJWQpLCBpbnQ9JTAyWFxuIiwKKwkJX19GVU5DVElPTl9fLCBzZWxmLT5idWxrX2luX2VwLCBzZWxmLT5idWxrX291dF9lcCwgc2VsZi0+YnVsa19vdXRfbXR1LCBzZWxmLT5idWxrX2ludF9lcCk7CisJLyogU2hvdWxkIGJlIDgsIDE2LCAzMiBvciA2NCBieXRlcyAqLworCUlSREFfQVNTRVJUKHNlbGYtPmJ1bGtfb3V0X210dSA9PSA2NCwgOyk7CisKKwlyZXR1cm4oKHNlbGYtPmJ1bGtfaW5fZXAgIT0gMCkgJiYgKHNlbGYtPmJ1bGtfb3V0X2VwICE9IDApKTsKK30KKworI2lmZGVmIElVX0RVTVBfQ0xBU1NfREVTQworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIHVzYl9pcmRhX2R1bXBfY2xhc3NfZGVzYyhkZXNjKQorICoKKyAqICAgIFByaW50cyBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBJckRBIGNsYXNzIGRlc2NyaXB0b3IKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcmRhX3VzYl9kdW1wX2NsYXNzX2Rlc2Moc3RydWN0IGlyZGFfY2xhc3NfZGVzYyAqZGVzYykKK3sKKwkvKiBWYWx1ZXMgYXJlIGxpdHRsZSBlbmRpYW4gKi8KKwlwcmludGsoImJMZW5ndGg9JXhcbiIsIGRlc2MtPmJMZW5ndGgpOworCXByaW50aygiYkRlc2NyaXB0b3JUeXBlPSV4XG4iLCBkZXNjLT5iRGVzY3JpcHRvclR5cGUpOworCXByaW50aygiYmNkU3BlY1JldmlzaW9uPSV4XG4iLCBsZTE2X3RvX2NwdShkZXNjLT5iY2RTcGVjUmV2aXNpb24pKTsgCisJcHJpbnRrKCJibURhdGFTaXplPSV4XG4iLCBkZXNjLT5ibURhdGFTaXplKTsKKwlwcmludGsoImJtV2luZG93U2l6ZT0leFxuIiwgZGVzYy0+Ym1XaW5kb3dTaXplKTsKKwlwcmludGsoImJtTWluVHVybmFyb3VuZFRpbWU9JWRcbiIsIGRlc2MtPmJtTWluVHVybmFyb3VuZFRpbWUpOworCXByaW50aygid0JhdWRSYXRlPSV4XG4iLCBsZTE2X3RvX2NwdShkZXNjLT53QmF1ZFJhdGUpKTsKKwlwcmludGsoImJtQWRkaXRpb25hbEJPRnM9JXhcbiIsIGRlc2MtPmJtQWRkaXRpb25hbEJPRnMpOworCXByaW50aygiYklyZGFSYXRlU25pZmY9JXhcbiIsIGRlc2MtPmJJcmRhUmF0ZVNuaWZmKTsKKwlwcmludGsoImJNYXhVbmljYXN0TGlzdD0leFxuIiwgZGVzYy0+Yk1heFVuaWNhc3RMaXN0KTsKK30KKyNlbmRpZiAvKiBJVV9EVU1QX0NMQVNTX0RFU0MgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfdXNiX2ZpbmRfY2xhc3NfZGVzYyhpbnRmKQorICoKKyAqICAgIFJldHVybnMgaW5zdGFuY2Ugb2YgSXJEQSBjbGFzcyBkZXNjcmlwdG9yLCBvciBOVUxMIGlmIG5vdCBmb3VuZAorICoKKyAqIFRoZSBjbGFzcyBkZXNjcmlwdG9yIGlzIHNvbWUgZXh0cmEgaW5mbyB0aGF0IElyREEgVVNCIGRldmljZXMgd2lsbAorICogb2ZmZXIgdG8gdXMsIGRlc2NyaWJpbmcgdGhlaXIgSXJEQSBjaGFyYWN0ZXJpc3RpY3MuIFdlIHdpbGwgdXNlIHRoYXQgaW4KKyAqIGlyZGFfdXNiX2luaXRfcW9zKCkKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXJkYV9jbGFzc19kZXNjICppcmRhX3VzYl9maW5kX2NsYXNzX2Rlc2Moc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYgKGludGYpOworCXN0cnVjdCBpcmRhX2NsYXNzX2Rlc2MgKmRlc2M7CisJaW50IHJldDsKKworCWRlc2MgPSBrbWFsbG9jKHNpemVvZiAoKmRlc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGVzYyA9PSBOVUxMKSAKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOworCisJLyogVVNCLUlyREEgY2xhc3Mgc3BlYyAxLjA6CisJICoJNi4xLjM6IFN0YW5kYXJkICJHZXQgRGVzY3JpcHRvciIgRGV2aWNlIFJlcXVlc3QgaXMgbm90CisJICoJICAgICAgIGFwcHJvcHJpYXRlIHRvIHJldHJpZXZlIGNsYXNzLXNwZWNpZmljIGRlc2NyaXB0b3IKKwkgKgk2LjIuNTogQ2xhc3MgU3BlY2lmaWMgIkdldCBDbGFzcyBEZXNjcmlwdG9yIiBJbnRlcmZhY2UgUmVxdWVzdAorCSAqCSAgICAgICBpcyBtYW5kYXRvcnkgYW5kIHJldHVybnMgdGhlIFVTQi1JckRBIGNsYXNzIGRlc2NyaXB0b3IKKwkgKi8KKworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsMCksCisJCUlVX1JFUV9HRVRfQ0xBU1NfREVTQywKKwkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJMCwgaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCBkZXNjLAorCQlzaXplb2YoKmRlc2MpLCA1MDApOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIHJldD0lZFxuIiwgX19GVU5DVElPTl9fLCByZXQpOworCWlmIChyZXQgPCBzaXplb2YoKmRlc2MpKSB7CisJCUlSREFfV0FSTklORygidXNiLWlyZGE6IGNsYXNzX2Rlc2NyaXB0b3IgcmVhZCAlcyAoJWQpXG4iLAorCQkJICAgICAocmV0PDApID8gImZhaWxlZCIgOiAidG9vIHNob3J0IiwgcmV0KTsKKwl9CisJZWxzZSBpZiAoZGVzYy0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9JUkRBKSB7CisJCUlSREFfV0FSTklORygidXNiLWlyZGE6IGJhZCBjbGFzc19kZXNjcmlwdG9yIHR5cGVcbiIpOworCX0KKwllbHNlIHsKKyNpZmRlZiBJVV9EVU1QX0NMQVNTX0RFU0MKKwkJaXJkYV91c2JfZHVtcF9jbGFzc19kZXNjKGRlc2MpOworI2VuZGlmCS8qIElVX0RVTVBfQ0xBU1NfREVTQyAqLworCisJCXJldHVybiBkZXNjOworCX0KKwlrZnJlZShkZXNjKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqIFVTQiBERVZJQ0UgQ0FMTEJBQ0tTICoqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIE1haW4gY2FsbHMgZnJvbSB0aGUgVVNCIHN1YnN5c3RlbS4KKyAqIE1vc3RseSByZWdpc3RlcmluZyBhIG5ldyBpcmRhLXVzYiBkZXZpY2UgYW5kIHJlbW92aW5nIGl0Li4uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBVU0Igc3Vic3lzdGVtIGZvciBlYWNoIG5ldyBkZXZpY2UKKyAqIGluIHRoZSBzeXN0ZW0uIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGRldmljZSBpcyBvdXJzLCBhbmQgaW4KKyAqIHRoaXMgY2FzZSBzdGFydCBoYW5kbGluZyBpdC4KKyAqIFRoZSBVU0IgbGF5ZXIgcHJvdGVjdCB1cyBmcm9tIHJlZW50cmFuY3kgKHZpYSBCS0wpLCBzbyB3ZSBkb24ndCBuZWVkCisgKiB0byBzcGlubG9jayBpbiB0aGVyZS4uLiBKZWFuIElJCisgKi8KK3N0YXRpYyBpbnQgaXJkYV91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0OworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZiA9IE5VTEw7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCBpcmRhX2NsYXNzX2Rlc2MgKmlyZGFfZGVzYzsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwlpbnQgaTsJCS8qIERyaXZlciBpbnN0YW5jZSBpbmRleCAvIFJ4IFVSQiBpbmRleCAqLworCisJLyogTm90ZSA6IHRoZSBwcm9iZSBtYWtlIHN1cmUgdG8gY2FsbCB1cyBvbmx5IGZvciBkZXZpY2VzIHRoYXQKKwkgKiBtYXRjaGVzIHRoZSBsaXN0IG9mIGRvbmdsZSAodG9wIG9mIHRoZSBmaWxlKS4gU28sIHdlCisJICogZG9uJ3QgbmVlZCB0byBjaGVjayBpZiB0aGUgZG9uZ2xlIGlzIHJlYWxseSBvdXJzLgorCSAqIEplYW4gSUkgKi8KKworCUlSREFfTUVTU0FHRSgiSVJEQS1VU0IgZm91bmQgYXQgYWRkcmVzcyAlZCwgVmVuZG9yOiAleCwgUHJvZHVjdDogJXhcbiIsCisJCSAgICAgZGV2LT5kZXZudW0sIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCSAgICAgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOworCisJbmV0ID0gYWxsb2NfaXJkYWRldihzaXplb2YoKnNlbGYpKTsKKwlpZiAoIW5ldCkgCisJCWdvdG8gZXJyX291dDsKKworCVNFVF9NT0RVTEVfT1dORVIobmV0KTsKKwlTRVRfTkVUREVWX0RFVihuZXQsICZpbnRmLT5kZXYpOworCXNlbGYgPSBuZXQtPnByaXY7CisJc2VsZi0+bmV0ZGV2ID0gbmV0OworCXNwaW5fbG9ja19pbml0KCZzZWxmLT5sb2NrKTsKKworCS8qIENyZWF0ZSBhbGwgb2YgdGhlIG5lZWRlZCB1cmJzICovCisJZm9yIChpID0gMDsgaSA8IElVX01BWF9SWF9VUkJTOyBpKyspIHsKKwkJc2VsZi0+cnhfdXJiW2ldID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzZWxmLT5yeF91cmJbaV0pIHsKKwkJCWdvdG8gZXJyX291dF8xOworCQl9CisJfQorCXNlbGYtPnR4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZWxmLT50eF91cmIpIHsKKwkJZ290byBlcnJfb3V0XzE7CisJfQorCXNlbGYtPnNwZWVkX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZWxmLT5zcGVlZF91cmIpIHsKKwkJZ290byBlcnJfb3V0XzI7CisJfQorCisJLyogSXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyAobm8sIGV4Y2VwdCBtYXliZSBmb3IgYnJva2VuIGRldmljZXMpICovCisJaWYgKHVzYl9yZXNldF9jb25maWd1cmF0aW9uIChkZXYpIDwgMCkgeworCQllcnIoInJlc2V0X2NvbmZpZ3VyYXRpb24gZmFpbGVkIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX291dF8zOworCX0KKworCS8qIElzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gKi8KKwkvKiBOb3RlIDogc29tZSBkcml2ZXIgZG8gaGFyZGNvZGUgdGhlIGludGVyZmFjZSBudW1iZXIsIHNvbWUgb3RoZXJzCisJICogc3BlY2lmeSBhbiBhbHRlcm5hdGUsIGJ1dCB2ZXJ5IGZldyBkcml2ZXIgZG8gbGlrZSB0aGlzLgorCSAqIEplYW4gSUkgKi8KKwlyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZShkZXYsIGludGYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlciwgMCk7CisJSVJEQV9ERUJVRygxLCAidXNiLWlyZGE6IHNldCBpbnRlcmZhY2UgJWQgcmVzdWx0ICVkXG4iLCBpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIHJldCk7CisJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisJCWNhc2UgLUVQSVBFOgkJLyogLUVQSVBFID0gLTMyICovCisJCQkvKiBNYXJ0aW4gRGllaGwgc2F5cyBpZiB3ZSBnZXQgYSAtRVBJUEUgd2Ugc2hvdWxkCisJCQkgKiBiZSBmaW5lIGFuZCB3ZSBkb24ndCBuZWVkIHRvIGRvIGEgdXNiX2NsZWFyX2hhbHQoKS4KKwkJCSAqIC0gSmVhbiBJSSAqLworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgUmVjZWl2ZWQgLUVQSVBFLCBpZ25vcmluZy4uLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXQpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZXJyX291dF8zOworCX0KKworCS8qIEZpbmQgb3VyIGVuZHBvaW50cyAqLworCWludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCWlmKCFpcmRhX3VzYl9wYXJzZV9lbmRwb2ludHMoc2VsZiwgaW50ZXJmYWNlLT5lbmRwb2ludCwKKwkJCQkgICAgIGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzKSkgeworCQlJUkRBX0VSUk9SKCIlcygpLCBCb2d1cyBlbmRwb2ludHMuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX291dF8zOworCX0KKworCS8qIEZpbmQgSXJEQSBjbGFzcyBkZXNjcmlwdG9yICovCisJaXJkYV9kZXNjID0gaXJkYV91c2JfZmluZF9jbGFzc19kZXNjKGludGYpOworCXJldCA9IC1FTk9ERVY7CisJaWYgKGlyZGFfZGVzYyA9PSBOVUxMKQorCQlnb3RvIGVycl9vdXRfMzsKKworCXNlbGYtPmlyZGFfZGVzYyA9ICBpcmRhX2Rlc2M7CisJc2VsZi0+cHJlc2VudCA9IDE7CisJc2VsZi0+bmV0b3BlbiA9IDA7CisJc2VsZi0+Y2FwYWJpbGl0eSA9IGlkLT5kcml2ZXJfaW5mbzsKKwlzZWxmLT51c2JkZXYgPSBkZXY7CisJc2VsZi0+dXNiaW50ZiA9IGludGY7CisKKwkvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyIGZvciBzcGVlZCBjaGFuZ2VzICovCisJLyogRG9uJ3QgY2hhbmdlIHRoaXMgYnVmZmVyIHNpemUgYW5kIGFsbG9jYXRpb24gd2l0aG91dCBkb2luZworCSAqIHNvbWUgaGVhdnkgYW5kIGNvbXBsZXRlIHRlc3RpbmcuIERvbid0IGFzayB3aHkgOi0oCisJICogSmVhbiBJSSAqLworCXNlbGYtPnNwZWVkX2J1ZmYgPSAoY2hhciAqKSBrbWFsbG9jKElSREFfVVNCX1NQRUVEX01UVSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNlbGYtPnNwZWVkX2J1ZmYgPT0gTlVMTCkgCisJCWdvdG8gZXJyX291dF8zOworCisJbWVtc2V0KHNlbGYtPnNwZWVkX2J1ZmYsIDAsIElSREFfVVNCX1NQRUVEX01UVSk7CisKKwlyZXQgPSBpcmRhX3VzYl9vcGVuKHNlbGYpOworCWlmIChyZXQpIAorCQlnb3RvIGVycl9vdXRfNDsKKworCUlSREFfTUVTU0FHRSgiSXJEQTogUmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsIG5ldC0+bmFtZSk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBzZWxmKTsKKwlyZXR1cm4gMDsKKworZXJyX291dF80OgorCWtmcmVlKHNlbGYtPnNwZWVkX2J1ZmYpOworZXJyX291dF8zOgorCS8qIEZyZWUgYWxsIHVyYnMgdGhhdCB3ZSBtYXkgaGF2ZSBjcmVhdGVkICovCisJdXNiX2ZyZWVfdXJiKHNlbGYtPnNwZWVkX3VyYik7CitlcnJfb3V0XzI6CisJdXNiX2ZyZWVfdXJiKHNlbGYtPnR4X3VyYik7CitlcnJfb3V0XzE6CisJZm9yIChpID0gMDsgaSA8IElVX01BWF9SWF9VUkJTOyBpKyspIHsKKwkJaWYgKHNlbGYtPnJ4X3VyYltpXSkKKwkJCXVzYl9mcmVlX3VyYihzZWxmLT5yeF91cmJbaV0pOworCX0KKwlmcmVlX25ldGRldihuZXQpOworZXJyX291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhlIGN1cnJlbnQgaXJkYS11c2IgZGV2aWNlIGlzIHJlbW92ZWQsIHRoZSBVU0IgbGF5ZXIgdGVsbCB1cworICogdG8gc2h1dCBpdCBkb3duLi4uCisgKiBPbmUgb2YgdGhlIGNvbnN0cmFpbnRzIGlzIHRoYXQgd2hlbiB3ZSBleGl0IHRoaXMgZnVuY3Rpb24sCisgKiB3ZSBjYW5ub3QgdXNlIHRoZSB1c2JfZGV2aWNlIG5vIG1vcmUuIEdvbmUuIERlc3Ryb3llZC4ga2ZyZWUoKS4KKyAqIE1vc3Qgb3RoZXIgc3Vic3lzdGVtIGFsbG93IHlvdSB0byBkZXN0cm95IHRoZSBpbnN0YW5jZSBhdCBhIHRpbWUKKyAqIHdoZW4gaXQncyBjb252ZW5pZW50IHRvIHlvdSwgdG8gcG9zdHBvbmUgaXQgdG8gYSBsYXRlciBkYXRlLCBidXQKKyAqIG5vdCB0aGUgVVNCIHN1YnN5c3RlbS4KKyAqIFNvLCB3ZSBtdXN0IG1ha2UgYmxvb2R5IHN1cmUgdGhhdCBldmVyeXRoaW5nIGdldHMgZGVhY3RpdmF0ZWQuCisgKiBKZWFuIElJCisgKi8KK3N0YXRpYyB2b2lkIGlyZGFfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCWludCBpOworCisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJaWYgKCFzZWxmKQorCQlyZXR1cm47CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgVHggcGF0aCBpcyBub3QgZXhlY3V0aW5nLiAtIEplYW4gSUkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogT3VwcyAhIFdlIGFyZSBub3QgdGhlcmUgYW55IG1vcmUuCisJICogVGhpcyB3aWxsIHN0b3AvZGVzYWN0aXZhdGUgdGhlIFR4IHBhdGguIC0gSmVhbiBJSSAqLworCXNlbGYtPnByZXNlbnQgPSAwOworCisJLyogV2UgbmVlZCB0byBoYXZlIGlycSBlbmFibGVkIHRvIHVubGluayB0aGUgVVJCcy4gVGhhdCdzIE9LLAorCSAqIGF0IHRoaXMgcG9pbnQgdGhlIFR4IHBhdGggaXMgZ29uZSAtIEplYW4gSUkgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwkvKiBIdW0uLi4gQ2hlY2sgaWYgbmV0d29ya2luZyBpcyBzdGlsbCBhY3RpdmUgKGF2b2lkIHJhY2VzKSAqLworCWlmKChzZWxmLT5uZXRvcGVuKSB8fCAoc2VsZi0+aXJsYXApKSB7CisJCS8qIEFjY2VwdCBubyBtb3JlIHRyYW5zbWlzc2lvbnMgKi8KKwkJLypuZXRpZl9kZXZpY2VfZGV0YWNoKHNlbGYtPm5ldGRldik7Ki8KKwkJbmV0aWZfc3RvcF9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQkvKiBTdG9wIGFsbCB0aGUgcmVjZWl2ZSBVUkJzICovCisJCWZvciAoaSA9IDA7IGkgPCBJVV9NQVhfUlhfVVJCUzsgaSsrKQorCQkJdXNiX2tpbGxfdXJiKHNlbGYtPnJ4X3VyYltpXSk7CisJCS8qIENhbmNlbCBUeCBhbmQgc3BlZWQgVVJCLgorCQkgKiBUb2dnbGUgZmxhZ3MgdG8gbWFrZSBzdXJlIGl0J3Mgc3luY2hyb25vdXMuICovCisJCXNlbGYtPnR4X3VyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CisJCXVzYl9raWxsX3VyYihzZWxmLT50eF91cmIpOworCQlzZWxmLT5zcGVlZF91cmItPnRyYW5zZmVyX2ZsYWdzICY9IH5VUkJfQVNZTkNfVU5MSU5LOworCQl1c2Jfa2lsbF91cmIoc2VsZi0+c3BlZWRfdXJiKTsKKwl9CisKKwkvKiBDbGVhbnVwIHRoZSBkZXZpY2Ugc3R1ZmYgKi8KKwlpcmRhX3VzYl9jbG9zZShzZWxmKTsKKwkvKiBObyBsb25nZXIgYXR0YWNoZWQgdG8gVVNCIGJ1cyAqLworCXNlbGYtPnVzYmRldiA9IE5VTEw7CisJc2VsZi0+dXNiaW50ZiA9IE5VTEw7CisKKwkvKiBDbGVhbiB1cCBvdXIgdXJicyAqLworCWZvciAoaSA9IDA7IGkgPCBJVV9NQVhfUlhfVVJCUzsgaSsrKQorCQl1c2JfZnJlZV91cmIoc2VsZi0+cnhfdXJiW2ldKTsKKwkvKiBDbGVhbiB1cCBUeCBhbmQgc3BlZWQgVVJCICovCisJdXNiX2ZyZWVfdXJiKHNlbGYtPnR4X3VyYik7CisJdXNiX2ZyZWVfdXJiKHNlbGYtPnNwZWVkX3VyYik7CisKKwkvKiBGcmVlIHNlbGYgYW5kIG5ldHdvcmsgZGV2aWNlICovCisJZnJlZV9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKwlJUkRBX0RFQlVHKDAsICIlcygpLCBVU0IgSXJEQSBEaXNjb25uZWN0ZWRcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBVU0IgZGV2aWNlIGNhbGxiYWNrcworICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgaXJkYV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJpcmRhLXVzYiIsCisJLnByb2JlCQk9IGlyZGFfdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gaXJkYV91c2JfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUJPSBkb25nbGVzLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTU9EVUxFIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIERlYWwgd2l0aCBtb2R1bGUgaW5zZXJ0aW9uL3JlbW92YWwKKyAqIE1vc3RseSB0ZWxsIFVTQiBhYm91dCBvdXIgZXhpc3RlbmNlCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIE1vZHVsZSBpbnNlcnRpb24KKyAqLworc3RhdGljIGludCBfX2luaXQgdXNiX2lyZGFfaW5pdCh2b2lkKQoreworCWludAlyZXQ7CisKKwlyZXQgPSB1c2JfcmVnaXN0ZXIoJmlyZGFfZHJpdmVyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCUlSREFfTUVTU0FHRSgiVVNCIElyREEgc3VwcG9ydCByZWdpc3RlcmVkXG4iKTsKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KHVzYl9pcmRhX2luaXQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogTW9kdWxlIHJlbW92YWwKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHVzYl9pcmRhX2NsZWFudXAodm9pZCkKK3sKKwkvKiBEZXJlZ2lzdGVyIHRoZSBkcml2ZXIgYW5kIHJlbW92ZSBhbGwgcGVuZGluZyBpbnN0YW5jZXMgKi8KKwl1c2JfZGVyZWdpc3RlcigmaXJkYV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQodXNiX2lyZGFfY2xlYW51cCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBNb2R1bGUgcGFyYW1ldGVycworICovCittb2R1bGVfcGFyYW0ocW9zX210dF9iaXRzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhxb3NfbXR0X2JpdHMsICJNaW5pbXVtIFR1cm4gVGltZSIpOworTU9EVUxFX0FVVEhPUigiUm9tYW4gV2Vpc3NnYWVyYmVyIDx3ZWlzc2dAdmllbm5hLmF0PiwgRGFnIEJyYXR0bGkgPGRhZ0BicmF0dGxpLm5ldD4gYW5kIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSXJEQS1VU0IgRG9uZ2xlIERyaXZlciIpOyAKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuaCBiL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDhmNjY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5oCkBAIC0wLDAgKzEsMTYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgICBpcmRhLXVzYi5oCisgKiBWZXJzaW9uOiAgICAgICAwLjliCisgKiBEZXNjcmlwdGlvbjogICBJckRBLVVTQiBEcml2ZXIKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbCAKKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdAYnJhdHRsaS5uZXQ+CisgKgorICoJQ29weXJpZ2h0IChDKSAyMDAxLCBSb21hbiBXZWlzc2dhZXJiZXIgPHdlaXNzZ0B2aWVubmEuYXQ+CisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwMCwgRGFnIEJyYXR0bGkgPGRhZ0BicmF0dGxpLm5ldD4KKyAqICAgICAgQ29weXJpZ2h0IChDKSAyMDAxLCBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKiAgICAgICAgICAKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPiAgICAgIC8qIHN0cnVjdCBpcmxhcF9jYiAqLworCisjZGVmaW5lIFJYX0NPUFlfVEhSRVNIT0xEIDIwMAorI2RlZmluZSBJUkRBX1VTQl9NQVhfTVRVIDIwNTEKKyNkZWZpbmUgSVJEQV9VU0JfU1BFRURfTVRVIDY0CQkvKiBXZWlyZCwgYnV0IHdvcmsgbGlrZSB0aGlzICovCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBVUkIgb24gdGhlIFJ4IHBhdGgKKyAqIFRoaXMgaXMgdGhlIGFtb3VudCBvZiBidWZmZXJzIHRoZSB3ZSBrZWVwIGJldHdlZW4gdGhlIFVTQiBoYXJ3YXJlIGFuZCB0aGUKKyAqIElyREEgc3RhY2suCisgKgorICogTm90ZSA6IHRoZSBuZXR3b3JrIGxheWVyIGRvZXMgYWxzbyBxdWV1ZSB0aGUgcGFja2V0cyBiZXR3ZWVuIHVzIGFuZCB0aGUKKyAqIElyREEgc3RhY2ssIGFuZCBpcyBhY3R1YWxseSBwcmV0dHkgZmFzdCBhbmQgZWZmaWNpZW50IGluIGRvaW5nIHRoYXQuCisgKiBUaGVyZWZvcmUsIHdlIGRvbid0IG5lZWQgdG8gaGF2ZSBhIGxhcmdlIG51bWJlciBvZiBVUkJzLCBhbmQgd2UgY2FuCisgKiBwZXJmZWN0bHkgbGl2ZSBoYXBweSB3aXRoIG9ubHkgb25lLiBXZSBjZXJ0YWlubHkgZG9uJ3QgbmVlZCB0byBrZWVwIHRoZQorICogZnVsbCBJclRUUCB3aW5kb3cgYXJvdW5kIGhlcmUuLi4KKyAqIEkgcmVwZWF0IGZvciB0aG9zZSB3aG8gaGF2ZSB0cm91YmxlIHRvIHVuZGVyc3RhbmQgOiAxIFVSQiBpcyBwbGVudHkKKyAqIGdvb2QgZW5vdWdoIHRvIGhhbmRsZSBiYWNrLXRvLWJhY2sgKGJyaWNrd2FsbGVkKSBmcmFtZXMuIEkgdHJpZWQgaXQsCisgKiBpdCB3b3JrcyAoaXQncyB0aGUgaGFyZHdhcmUgdGhhdCBoYXMgdHJvdWJsZSBkb2luZyBpdCkuCisgKgorICogSGF2aW5nIDIgVVJCcyB3b3VsZCBhbGxvdyB0aGUgVVNCIHN0YWNrIHRvIHByb2Nlc3Mgb25lIFVSQiB3aGlsZSB3ZSB0YWtlCisgKiBjYXJlIG9mIHRoZSBvdGhlciBhbmQgdGhlbiBzd2FwIHRoZSBVUkJzLi4uCisgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaW5jcmVhc2luZyB0aGUgbnVtYmVyIG9mIFVSQiB3aWxsIGhhdmUgcGVuYWxpdGllcworICogaW4gdGVybSBvZiBsYXRlbmN5IGFuZCB3aWxsIGludGVyYWN0IHdpdGggdGhlIGxpbmsgbWFuYWdlbWVudCBpbiBJckxBUC4uLgorICogSmVhbiBJSSAqLworI2RlZmluZSBJVV9NQVhfQUNUSVZFX1JYX1VSQlMJMQkvKiBEb24ndCB0b3VjaCAhISEgKi8KKworLyogV2hlbiBhIFJ4IFVSQiBpcyBwYXNzZWQgYmFjayB0byB1cywgd2UgY2FuJ3QgcmV1c2UgaXQgaW1tZWRpYXRlbHksCisgKiBiZWNhdXNlIGl0IG1heSBzdGlsbCBiZSByZWZlcmVuY2VkIGJ5IHRoZSBVU0IgbGF5ZXIuIFRoZXJlZm9yZSB3ZQorICogbmVlZCB0byBrZWVwIG9uZSBleHRyYSBVUkIgaW4gdGhlIFJ4IHBhdGguCisgKiBKZWFuIElJICovCisjZGVmaW5lIElVX01BWF9SWF9VUkJTCShJVV9NQVhfQUNUSVZFX1JYX1VSQlMgKyAxKQorCisvKiBWYXJpb3VzIHVnbHkgc3R1ZmYgdG8gdHJ5IHRvIHdvcmthcm91bmQgZ2VuZXJpYyBwcm9ibGVtcyAqLworLyogU2VuZCBzcGVlZCBjb21tYW5kIGluIGNhc2Ugb2YgdGltZW91dCwganVzdCBmb3IgdHJ5aW5nIHRvIGdldCB0aGluZ3Mgc2FuZSAqLworI2RlZmluZSBJVV9CVUdfS0lDS19USU1FT1VUCisvKiBTaG93IHRoZSBVU0IgY2xhc3MgZGVzY3JpcHRvciAqLworI3VuZGVmIElVX0RVTVBfQ0xBU1NfREVTQyAKKy8qIEFzc3VtZSBhIG1pbmltdW0gcm91bmQgdHJpcCBsYXRlbmN5IGZvciBVU0IgdHJhbnNmZXIgKGluIHVzKS4uLgorICogVVNCIHRyYW5zZmVyIGFyZSBkb25lIGluIHRoZSBuZXh0IFVTQiBzbG90IGlmIHRoZXJlIGlzIG5vIHRyYWZmaWMKKyAqICgxLzE5IG1zZWMpIGFuZCBpcyBkb25lIGF0IDEyIE1iL3MgOgorICogV2FpdGluZyBmb3Igc2xvdCArIHR4ID0gKDUzdXMgKyAxNnVzKSAqIDIgPSAxMzd1cyBtaW5pbXVtLgorICogUnggbm90aWZpY2F0aW9uIHdpbGwgb25seSBiZSBkb25lIGF0IHRoZSBlbmQgb2YgdGhlIFVTQiBmcmFtZSBwZXJpb2QgOgorICogT0hDSSA6IGZyYW1lIHBlcmlvZCA9IDFtcworICogVUhDSSA6IGZyYW1lIHBlcmlvZCA9IDFtcywgYnV0IG5vdGlmaWNhdGlvbiBjYW4gdGFrZSAyIG9yIDMgbXMgOi0oCisgKiBFSENJIDogZnJhbWUgcGVyaW9kID0gMTI1dXMgKi8KKyNkZWZpbmUgSVVfVVNCX01JTl9SVFQJCTUwMAkvKiBUaGlzIHNob3VsZCBiZSBzYWZlIGluIG1vc3QgY2FzZXMgKi8KKworLyogSW5ib3VuZCBoZWFkZXIgKi8KKyNkZWZpbmUgTUVESUFfQlVTWSAgICAweDgwCisKKyNkZWZpbmUgU1BFRURfMjQwMCAgICAweDAxCisjZGVmaW5lIFNQRUVEXzk2MDAgICAgMHgwMgorI2RlZmluZSBTUEVFRF8xOTIwMCAgIDB4MDMKKyNkZWZpbmUgU1BFRURfMzg0MDAgICAweDA0CisjZGVmaW5lIFNQRUVEXzU3NjAwICAgMHgwNQorI2RlZmluZSBTUEVFRF8xMTUyMDAgIDB4MDYKKyNkZWZpbmUgU1BFRURfNTc2MDAwICAweDA3CisjZGVmaW5lIFNQRUVEXzExNTIwMDAgMHgwOAorI2RlZmluZSBTUEVFRF80MDAwMDAwIDB4MDkKKworLyogQmFzaWMgY2FwYWJpbGl0aWVzICovCisjZGVmaW5lIElVQ19ERUZBVUxUCTB4MDAJLyogQmFzaWMgZGV2aWNlIGNvbXBsaWFudCB3aXRoIDEuMCBzcGVjICovCisvKiBNYWluIGJ1Z3MgKi8KKyNkZWZpbmUgSVVDX1NQRUVEX0JVRwkweDAxCS8qIERldmljZSBkb2Vzbid0IHNldCBzcGVlZCBhZnRlciB0aGUgZnJhbWUgKi8KKyNkZWZpbmUgSVVDX05PX1dJTkRPVwkweDAyCS8qIERldmljZSBkb2Vzbid0IGJlaGF2ZSB3aXRoIGJpZyBSeCB3aW5kb3cgKi8KKyNkZWZpbmUgSVVDX05PX1RVUk4JMHgwNAkvKiBEZXZpY2UgZG9lc24ndCBkbyB0dXJuYXJvdW5kIGJ5IGl0c2VsZiAqLworLyogTm90IGN1cnJlbnRseSB1c2VkICovCisjZGVmaW5lIElVQ19TSVJfT05MWQkweDA4CS8qIERldmljZSBkb2Vzbid0IGJlaGF2ZSBhdCBGSVIgc3BlZWRzICovCisjZGVmaW5lIElVQ19TTUFMTF9QS1QJMHgxMAkvKiBEZXZpY2UgZG9lc24ndCBiZWhhdmUgd2l0aCBiaWcgUnggcGFja2V0cyAqLworI2RlZmluZSBJVUNfTUFYX1dJTkRPVwkweDIwCS8qIERldmljZSB1bmRlcmVzdGltYXRlIHRoZSBSeCB3aW5kb3cgKi8KKyNkZWZpbmUgSVVDX01BWF9YQk9GUwkweDQwCS8qIERldmljZSBuZWVkIG1vcmUgeGJvZnMgdGhhbiBhZHZlcnRpc2VkICovCisKKy8qIFVTQiBjbGFzcyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBVU0JfSVJEQV9IRUFERVIgICAweDAxCisjZGVmaW5lIFVTQl9DTEFTU19JUkRBICAgIDB4MDIgLyogVVNCX0NMQVNTX0FQUF9TUEVDIHN1YmNsYXNzICovIAorI2RlZmluZSBVU0JfRFRfSVJEQSAgICAgICAweDIxCisKK3N0cnVjdCBpcmRhX2NsYXNzX2Rlc2MgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTE2IGJjZFNwZWNSZXZpc2lvbjsKKwlfX3U4ICBibURhdGFTaXplOworCV9fdTggIGJtV2luZG93U2l6ZTsKKwlfX3U4ICBibU1pblR1cm5hcm91bmRUaW1lOworCV9fdTE2IHdCYXVkUmF0ZTsKKwlfX3U4ICBibUFkZGl0aW9uYWxCT0ZzOworCV9fdTggIGJJcmRhUmF0ZVNuaWZmOworCV9fdTggIGJNYXhVbmljYXN0TGlzdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBjbGFzcyBzcGVjaWZpYyBpbnRlcmZhY2UgcmVxdWVzdCB0byBnZXQgdGhlIElyREEtVVNCIGNsYXNzIGRlc2NyaXB0b3IKKyAqICg2LjIuNSwgVVNCLUlyREEgY2xhc3Mgc3BlYyAxLjApICovCisKKyNkZWZpbmUgSVVfUkVRX0dFVF9DTEFTU19ERVNDCTB4MDYKKworc3RydWN0IGlyZGFfdXNiX2NiIHsKKwlzdHJ1Y3QgaXJkYV9jbGFzc19kZXNjICppcmRhX2Rlc2M7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsJLyogaW5pdDogcHJvYmVfaXJkYSAqLworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICp1c2JpbnRmOwkvKiBpbml0OiBwcm9iZV9pcmRhICovCisJaW50IG5ldG9wZW47CQkJLyogRGV2aWNlIGlzIGFjdGl2ZSBmb3IgbmV0d29yayAqLworCWludCBwcmVzZW50OwkJCS8qIERldmljZSBpcyBwcmVzZW50IG9uIHRoZSBidXMgKi8KKwlfX3UzMiBjYXBhYmlsaXR5OwkJLyogQ2FwYWJpbGl0eSBvZiB0aGUgaGFyZHdhcmUgKi8KKwlfX3U4ICBidWxrX2luX2VwOwkJLyogUnggRW5kcG9pbnQgYXNzaWdubWVudHMgKi8KKwlfX3U4ICBidWxrX291dF9lcDsJCS8qIFR4IEVuZHBvaW50IGFzc2lnbm1lbnRzICovCisJX191MTYgYnVsa19vdXRfbXR1OwkJLyogTWF4IFR4IHBhY2tldCBzaXplIGluIGJ5dGVzICovCisJX191OCAgYnVsa19pbnRfZXA7CQkvKiBJbnRlcnJ1cHQgRW5kcG9pbnQgYXNzaWdubWVudHMgKi8KKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcTsJLyogZm9yIHRpbWVvdXRzICovCisKKwlzdHJ1Y3QgdXJiICpyeF91cmJbSVVfTUFYX1JYX1VSQlNdOwkvKiBVUkJzIHVzZWQgdG8gcmVjZWl2ZSBkYXRhIGZyYW1lcyAqLworCXN0cnVjdCB1cmIgKmlkbGVfcnhfdXJiOwkvKiBQb2ludGVyIHRvIGlkbGUgVVJCIGluIFJ4IHBhdGggKi8KKwlzdHJ1Y3QgdXJiICp0eF91cmI7CQkvKiBVUkIgdXNlZCB0byBzZW5kIGRhdGEgZnJhbWVzICovCisJc3RydWN0IHVyYiAqc3BlZWRfdXJiOwkJLyogVVJCIHVzZWQgdG8gc2VuZCBzcGVlZCBjb21tYW5kcyAqLworCQorCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CS8qIFllcyEgd2UgYXJlIHNvbWUga2luZCBvZiBuZXRkZXYuICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGlybGFwX2NiICAgKmlybGFwOwkvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYmluZGVkIHRvICovCisJc3RydWN0IHFvc19pbmZvIHFvczsKKwloYXNoYmluX3QgKnR4X2xpc3Q7CQkvKiBRdWV1ZWQgdHJhbnNtaXQgc2tiJ3MgKi8KKwljaGFyICpzcGVlZF9idWZmOwkJLyogQnVmZmVyIGZvciBzcGVlZCBjaGFuZ2VzICovCisKKwlzdHJ1Y3QgdGltZXZhbCBzdGFtcDsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisKKwlzcGlubG9ja190IGxvY2s7CQkvKiBGb3Igc2VyaWFsaXppbmcgb3BlcmF0aW9ucyAqLworCisJX191MTYgeGJvZnM7CQkJLyogQ3VycmVudCB4Ym9mcyBzZXR0aW5nICovCisJX19zMTYgbmV3X3hib2ZzOwkJLyogeGJvZnMgd2UgbmVlZCB0byBzZXQgKi8KKwlfX3UzMiBzcGVlZDsJCQkvKiBDdXJyZW50IHNwZWVkICovCisJX19zMzIgbmV3X3NwZWVkOwkJLyogc3BlZWQgd2UgbmVlZCB0byBzZXQgKi8KK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvaXJwb3J0LmMgYi9kcml2ZXJzL25ldC9pcmRhL2lycG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NzEzMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2lycG9ydC5jCkBAIC0wLDAgKzEsMTE0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBGaWxlbmFtZToJICBpcnBvcnQuYworICogVmVyc2lvbjoJICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIEhhbGYgZHVwbGV4IHNlcmlhbCBwb3J0IFNJUiBkcml2ZXIgZm9yIElyREEuIAorICogU3RhdHVzOgkgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjoJICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OgkgIFN1biBBdWcgIDMgMTM6NDk6NTkgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgRnJpIEphbiAyOCAyMDoyMjozOCAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBTb3VyY2VzOgkgIHNlcmlhbC5jIGJ5IExpbnVzIFRvcnZhbGRzIAorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk4LCAxOTk5LTIwMDAgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgICBUaGlzIGRyaXZlciBpcyBtZW50IHRvIGJlIGEgc21hbGwgaGFsZiBkdXBsZXggc2VyaWFsIGRyaXZlciB0byBiZQorICogICAgIHVzZWQgZm9yIElSLWNoaXBzZXRzIHRoYXQgaGFzIGEgVUFSVCAoMTY1NTApIGNvbXBhdGliaWxpdHkgbW9kZS4gCisgKiAgICAgRXZlbnR1YWxseSBpdCB3aWxsIHJlcGxhY2UgaXJ0dHksIGJlY2F1c2Ugb2YgaXJ0dHkgaGFzIHNvbWUgCisgKiAgICAgcHJvYmxlbXMgdGhhdCBpcyBoYXJkIHRvIGdldCBhcm91bmQgd2hlbiB3ZSBkb24ndCBoYXZlIGNvbnRyb2wKKyAqICAgICBvdmVyIHRoZSBzZXJpYWwgZHJpdmVyLiBUaGlzIGRyaXZlciBtYXkgYWxzbyBiZSB1c2VkIGJ5IEZJUiAKKyAqICAgICBkcml2ZXJzIHRvIGhhbmRsZSBTSVIgbW9kZSBmb3IgdGhlbS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgImlycG9ydC5oIgorCisjZGVmaW5lIElPX0VYVEVOVCA4CisKKy8qIAorICogQ3VycmVudGx5IHlvdSdsbCBuZWVkIHRvIHNldCB0aGVzZSB2YWx1ZXMgdXNpbmcgaW5zbW9kIGxpa2UgdGhpczoKKyAqIGluc21vZCBpcnBvcnQgaW89MHgzZTggaXJxPTExCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW9bXSAgPSB7IH4wLCB+MCwgfjAsIH4wIH07CitzdGF0aWMgdW5zaWduZWQgaW50IGlycVtdID0geyAwLCAwLCAwLCAwIH07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcW9zX210dF9iaXRzID0gMHgwMzsKKworc3RhdGljIHN0cnVjdCBpcnBvcnRfY2IgKmRldl9zZWxmW10gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9Oworc3RhdGljIGNoYXIgKmRyaXZlcl9uYW1lID0gImlycG9ydCI7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnBvcnRfd3JpdGVfd2FrZXVwKHN0cnVjdCBpcnBvcnRfY2IgKnNlbGYpOworc3RhdGljIGlubGluZSBpbnQgIGlycG9ydF93cml0ZShpbnQgaW9iYXNlLCBpbnQgZmlmb19zaXplLCBfX3U4ICpidWYsIGludCBsZW4pOworc3RhdGljIGlubGluZSB2b2lkIGlycG9ydF9yZWNlaXZlKHN0cnVjdCBpcnBvcnRfY2IgKnNlbGYpOworCitzdGF0aWMgaW50ICBpcnBvcnRfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIAorCQkJICAgICBpbnQgY21kKTsKK3N0YXRpYyBpbmxpbmUgaW50ICBpcnBvcnRfaXNfcmVjZWl2aW5nKHN0cnVjdCBpcnBvcnRfY2IgKnNlbGYpOworc3RhdGljIGludCAgaXJwb3J0X3NldF9kdHJfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBkdHIsIGludCBydHMpOworc3RhdGljIGludCAgaXJwb3J0X3Jhd193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3U4ICpidWYsIGludCBsZW4pOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppcnBvcnRfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaXJwb3J0X2NoYW5nZV9zcGVlZF9jb21wbGV0ZShzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKK3N0YXRpYyB2b2lkIGlycG9ydF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgaXJwb3J0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgaXJwb3J0X2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGlycG9ydF9jaGFuZ2Vfc3BlZWQodm9pZCAqcHJpdiwgX191MzIgc3BlZWQpOworc3RhdGljIGludCBpcnBvcnRfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlycG9ydF9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBzdHJ1Y3QgaXJwb3J0X2NiICoKK2lycG9ydF9vcGVuKGludCBpLCB1bnNpZ25lZCBpbnQgaW9iYXNlLCB1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGlycG9ydF9jYiAqc2VsZjsKKworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBMb2NrIHRoZSBwb3J0IHRoYXQgd2UgbmVlZCAqLworCWlmICghcmVxdWVzdF9yZWdpb24oaW9iYXNlLCBJT19FWFRFTlQsIGRyaXZlcl9uYW1lKSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBjYW4ndCBnZXQgaW9iYXNlIG9mIDB4JTAzeFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgaW9iYXNlKTsKKwkJZ290byBlcnJfb3V0MTsKKwl9CisKKwkvKgorCSAqICBBbGxvY2F0ZSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGRyaXZlcgorCSAqLworCWRldiA9IGFsbG9jX2lyZGFkZXYoc2l6ZW9mKHN0cnVjdCBpcnBvcnRfY2IpKTsKKwlpZiAoIWRldikgeworCQlJUkRBX0VSUk9SKCIlcygpLCBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKwkJCSAgICJpcmRhIGRldmljZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXJyX291dDI7CisJfQorCisJc2VsZiA9IGRldi0+cHJpdjsKKwlzcGluX2xvY2tfaW5pdCgmc2VsZi0+bG9jayk7CisKKwkvKiBOZWVkIHRvIHN0b3JlIHNlbGYgc29tZXdoZXJlICovCisJZGV2X3NlbGZbaV0gPSBzZWxmOworCXNlbGYtPnByaXYgPSBzZWxmOworCXNlbGYtPmluZGV4ID0gaTsKKworCS8qIEluaXRpYWxpemUgSU8gKi8KKwlzZWxmLT5pby5zaXJfYmFzZSAgPSBpb2Jhc2U7CisgICAgICAgIHNlbGYtPmlvLnNpcl9leHQgICA9IElPX0VYVEVOVDsKKyAgICAgICAgc2VsZi0+aW8uaXJxICAgICAgID0gaXJxOworICAgICAgICBzZWxmLT5pby5maWZvX3NpemUgPSAxNjsJCS8qIDE2NTUwQSBhbmQgY29tcGF0aWJsZSAqLworCisJLyogSW5pdGlhbGl6ZSBRb1MgZm9yIHRoaXMgZGV2aWNlICovCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc2VsZi0+cW9zKTsKKwkKKwlzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfAorCQlJUl8xMTUyMDA7CisKKwlzZWxmLT5xb3MubWluX3R1cm5fdGltZS5iaXRzID0gcW9zX210dF9iaXRzOworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoJnNlbGYtPnFvcyk7CisJCisJLyogQm9vdHN0cmFwIFplcm9Db3B5IFJ4ICovCisJc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSA9IElSREFfU0tCX01BWF9NVFU7CisJc2VsZi0+cnhfYnVmZi5za2IgPSBfX2Rldl9hbGxvY19za2Ioc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCWlmIChzZWxmLT5yeF9idWZmLnNrYiA9PSBOVUxMKSB7CisJCUlSREFfRVJST1IoIiVzKCksIGNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgIgorCQkJICAgInJlY2VpdmUgYnVmZmVyIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBlcnJfb3V0MzsKKwl9CisJc2tiX3Jlc2VydmUoc2VsZi0+cnhfYnVmZi5za2IsIDEpOworCXNlbGYtPnJ4X2J1ZmYuaGVhZCA9IHNlbGYtPnJ4X2J1ZmYuc2tiLT5kYXRhOworCS8qIE5vIG5lZWQgdG8gbWVtc2V0IHRoZSBidWZmZXIsIHVubGVzcyB5b3UgYXJlIHJlYWxseSBwZWRhbnRpYyAqLworCisJLyogRmluaXNoIHNldHVwIHRoZSBSeCBidWZmZXIgZGVzY3JpcHRvciAqLworCXNlbGYtPnJ4X2J1ZmYuaW5fZnJhbWUgPSBGQUxTRTsKKwlzZWxmLT5yeF9idWZmLnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwlzZWxmLT5yeF9idWZmLmRhdGEgPSBzZWxmLT5yeF9idWZmLmhlYWQ7CisKKwkvKiBTcGVjaWZ5IGhvdyBtdWNoIG1lbW9yeSB3ZSB3YW50ICovCisJc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSA9IDQwMDA7CisJCisJLyogQWxsb2NhdGUgbWVtb3J5IGlmIG5lZWRlZCAqLworCWlmIChzZWxmLT50eF9idWZmLnRydWVzaXplID4gMCkgeworCQlzZWxmLT50eF9idWZmLmhlYWQgPSAoX191OCAqKSBrbWFsbG9jKHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsIAorCQkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmIChzZWxmLT50eF9idWZmLmhlYWQgPT0gTlVMTCkgeworCQkJSVJEQV9FUlJPUigiJXMoKSwgY2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciAiCisJCQkJICAgInRyYW5zbWl0IGJ1ZmZlciFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlnb3RvIGVycl9vdXQ0OworCQl9CisJCW1lbXNldChzZWxmLT50eF9idWZmLmhlYWQsIDAsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOworCX0JCisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCisJc2VsZi0+bmV0ZGV2ID0gZGV2OworCS8qIEtlZXAgdHJhY2sgb2YgbW9kdWxlIHVzYWdlICovCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJLyogTWF5IGJlIG92ZXJyaWRkZW4gYnkgcGlnZ3liYWNrIGRyaXZlcnMgKi8KKwlzZWxmLT5pbnRlcnJ1cHQgICAgPSBpcnBvcnRfaW50ZXJydXB0OworCXNlbGYtPmNoYW5nZV9zcGVlZCA9IGlycG9ydF9jaGFuZ2Vfc3BlZWQ7CisKKwkvKiBPdmVycmlkZSB0aGUgbmV0d29yayBmdW5jdGlvbnMgd2UgbmVlZCB0byB1c2UgKi8KKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGlycG9ydF9oYXJkX3htaXQ7CisJZGV2LT50eF90aW1lb3V0CSAgICAgPSBpcnBvcnRfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvICA9IEhaOyAgLyogQWxsb3cgdGltZSBlbm91Z2ggZm9yIHNwZWVkIGNoYW5nZSAqLworCWRldi0+b3BlbiAgICAgICAgICAgID0gaXJwb3J0X25ldF9vcGVuOworCWRldi0+c3RvcCAgICAgICAgICAgID0gaXJwb3J0X25ldF9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cwkgICAgID0gaXJwb3J0X25ldF9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCAgICAgICAgPSBpcnBvcnRfbmV0X2lvY3RsOworCisJLyogTWFrZSBpZmNvbmZpZyBkaXNwbGF5IHNvbWUgZGV0YWlscyAqLworCWRldi0+YmFzZV9hZGRyID0gaW9iYXNlOworCWRldi0+aXJxID0gaXJxOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCUlSREFfRVJST1IoIiVzKCksIHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXJyX291dDU7CisJfQorCUlSREFfTUVTU0FHRSgiSXJEQTogUmVnaXN0ZXJlZCBkZXZpY2UgJXMgKGlycG9ydCBpbz0weCVYIGlycT0lZClcbiIsCisJCWRldi0+bmFtZSwgaW9iYXNlLCBpcnEpOworCisJcmV0dXJuIHNlbGY7CisgZXJyX291dDU6CisJa2ZyZWUoc2VsZi0+dHhfYnVmZi5oZWFkKTsKKyBlcnJfb3V0NDoKKwlrZnJlZV9za2Ioc2VsZi0+cnhfYnVmZi5za2IpOworIGVycl9vdXQzOgorCWZyZWVfbmV0ZGV2KGRldik7CisJZGV2X3NlbGZbaV0gPSBOVUxMOworIGVycl9vdXQyOgorCXJlbGVhc2VfcmVnaW9uKGlvYmFzZSwgSU9fRVhURU5UKTsKKyBlcnJfb3V0MToKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBpcnBvcnRfY2xvc2Uoc3RydWN0IGlycG9ydF9jYiAqc2VsZikKK3sKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJLyogV2UgYXJlIG5vdCB1c2luZyBhbnkgZG9uZ2xlIGFueW1vcmUhICovCisJaWYgKHNlbGYtPmRvbmdsZSkKKwkJaXJkYV9kZXZpY2VfZG9uZ2xlX2NsZWFudXAoc2VsZi0+ZG9uZ2xlKTsKKwlzZWxmLT5kb25nbGUgPSBOVUxMOworCQorCS8qIFJlbW92ZSBuZXRkZXZpY2UgKi8KKwl1bnJlZ2lzdGVyX25ldGRldihzZWxmLT5uZXRkZXYpOworCisJLyogUmVsZWFzZSB0aGUgSU8tcG9ydCB0aGF0IHRoaXMgZHJpdmVyIGlzIHVzaW5nICovCisJSVJEQV9ERUJVRygwICwgIiVzKCksIFJlbGVhc2luZyBSZWdpb24gJTAzeFxuIiwgCisJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+aW8uc2lyX2Jhc2UpOworCXJlbGVhc2VfcmVnaW9uKHNlbGYtPmlvLnNpcl9iYXNlLCBzZWxmLT5pby5zaXJfZXh0KTsKKworCWlmIChzZWxmLT50eF9idWZmLmhlYWQpCisJCWtmcmVlKHNlbGYtPnR4X2J1ZmYuaGVhZCk7CisJCisJaWYgKHNlbGYtPnJ4X2J1ZmYuc2tiKQorCQlrZnJlZV9za2Ioc2VsZi0+cnhfYnVmZi5za2IpOworCXNlbGYtPnJ4X2J1ZmYuc2tiID0gTlVMTDsKKwkKKwkvKiBSZW1vdmUgb3Vyc2VsdmVzICovCisJZGV2X3NlbGZbc2VsZi0+aW5kZXhdID0gTlVMTDsKKwlmcmVlX25ldGRldihzZWxmLT5uZXRkZXYpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpcnBvcnRfc3RvcChzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCS8qIFdlIGNhbid0IGxvY2ssIHdlIG1heSBiZSBjYWxsZWQgZnJvbSBhIEZJUiBkcml2ZXIgLSBKZWFuIElJICovCisKKwkvKiBXZSBhcmUgbm90IHRyYW5zbWl0dGluZyBhbnkgbW9yZSAqLworCXNlbGYtPnRyYW5zbWl0dGluZyA9IDA7CisKKwkvKiBSZXNldCBVQVJUICovCisJb3V0YigwLCBpb2Jhc2UrVUFSVF9NQ1IpOworCQorCS8qIFR1cm4gb2ZmIGludGVycnVwdHMgKi8KKwlvdXRiKDAsIGlvYmFzZStVQVJUX0lFUik7Cit9CisKK3N0YXRpYyB2b2lkIGlycG9ydF9zdGFydChzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCWlycG9ydF9zdG9wKHNlbGYpOworCQorCS8qIFdlIGNhbid0IGxvY2ssIHdlIG1heSBiZSBjYWxsZWQgZnJvbSBhIEZJUiBkcml2ZXIgLSBKZWFuIElJICovCisKKwkvKiBJbml0aWFsaXplIFVBUlQgKi8KKwlvdXRiKFVBUlRfTENSX1dMRU44LCBpb2Jhc2UrVUFSVF9MQ1IpOyAgLyogUmVzZXQgRExBQiAqLworCW91dGIoKFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyB8IFVBUlRfTUNSX09VVDIpLCBpb2Jhc2UrVUFSVF9NQ1IpOworCQorCS8qIFR1cm4gb24gaW50ZXJydXBzICovCisJb3V0YihVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJIHxVQVJUX0lFUl9USFJJLCBpb2Jhc2UrVUFSVF9JRVIpOworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X3Byb2JlICh2b2lkKQorICoKKyAqICAgIFN0YXJ0IElPIHBvcnQgCisgKgorICovCitpbnQgaXJwb3J0X3Byb2JlKGludCBpb2Jhc2UpCit7CisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgaW9iYXNlPSUjeFxuIiwgX19GVU5DVElPTl9fLCBpb2Jhc2UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfZ2V0X2ZjciAoc3BlZWQpCisgKgorICogICAgQ29tcHV0ZSB2YWx1ZSBvZiBmY3IKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGlycG9ydF9nZXRfZmNyKF9fdTMyIHNwZWVkKQoreworCXVuc2lnbmVkIGludCBmY3I7ICAgIC8qIEZJRk8gY29udHJvbCByZWcgKi8KKworCS8qIEVuYWJsZSBmaWZvcyAqLworCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPOworCisJLyogCisJICogVXNlIHRyaWdnZXIgbGV2ZWwgMSB0byBhdm9pZCAzIG1zLiB0aW1lb3V0IGRlbGF5IGF0IDk2MDAgYnBzLCBhbmQKKwkgKiBhbG1vc3QgMSw3IG1zIGF0IDE5MjAwIGJwcy4gQXQgc3BlZWRzIGFib3ZlIHRoYXQgd2UgY2FuIGp1c3QgZm9yZ2V0CisJICogYWJvdXQgdGhpcyB0aW1lb3V0IHNpbmNlIGl0IHdpbGwgYWx3YXlzIGJlIGZhc3QgZW5vdWdoLiAKKwkgKi8KKwlpZiAoc3BlZWQgPCAzODQwMCkKKwkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTsKKwllbHNlIAorCQkvL2ZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzE0OworCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl84OworCisJcmV0dXJuKGZjcik7Cit9CisgCisvKgorICogRnVuY3Rpb24gaXJwb3J0X2NoYW5nZV9zcGVlZCAoc2VsZiwgc3BlZWQpCisgKgorICogICAgU2V0IHNwZWVkIG9mIElyREEgcG9ydCB0byBzcGVjaWZpZWQgYmF1ZHJhdGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBpcnEgb2ZmIGFuZCBzcGluLWxvY2suCisgKi8KK3N0YXRpYyB2b2lkIGlycG9ydF9jaGFuZ2Vfc3BlZWQodm9pZCAqcHJpdiwgX191MzIgc3BlZWQpCit7CisJc3RydWN0IGlycG9ydF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJwb3J0X2NiICopIHByaXY7CisJaW50IGlvYmFzZTsgCisJdW5zaWduZWQgaW50IGZjcjsgICAgLyogRklGTyBjb250cm9sIHJlZyAqLworCXVuc2lnbmVkIGludCBsY3I7ICAgIC8qIExpbmUgY29udHJvbCByZWcgKi8KKwlpbnQgZGl2aXNvcjsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc3BlZWQgIT0gMCwgcmV0dXJuOyk7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpLCBTZXR0aW5nIHNwZWVkIHRvOiAlZCAtIGlvYmFzZT0lI3hcbiIsCisJCSAgICBfX0ZVTkNUSU9OX18sIHNwZWVkLCBzZWxmLT5pby5zaXJfYmFzZSk7CisKKwkvKiBXZSBjYW4ndCBsb2NrLCB3ZSBtYXkgYmUgY2FsbGVkIGZyb20gYSBGSVIgZHJpdmVyIC0gSmVhbiBJSSAqLworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisJCisJLyogVXBkYXRlIGFjY291bnRpbmcgZm9yIG5ldyBzcGVlZCAqLworCXNlbGYtPmlvLnNwZWVkID0gc3BlZWQ7CisKKwkvKiBUdXJuIG9mZiBpbnRlcnJ1cHRzICovCisJb3V0YigwLCBpb2Jhc2UrVUFSVF9JRVIpOyAKKworCWRpdmlzb3IgPSBTUEVFRF9NQVgvc3BlZWQ7CisJCisJLyogR2V0IHByb3BlciBmaWZvIGNvbmZpZ3VyYXRpb24gKi8KKwlmY3IgPSBpcnBvcnRfZ2V0X2ZjcihzcGVlZCk7CisKKwkvKiBJckRBIHBvcnRzIHVzZSA4TjEgKi8KKwlsY3IgPSBVQVJUX0xDUl9XTEVOODsKKwkKKwlvdXRiKFVBUlRfTENSX0RMQUIgfCBsY3IsIGlvYmFzZStVQVJUX0xDUik7IC8qIFNldCBETEFCICovCisJb3V0YihkaXZpc29yICYgMHhmZiwgICAgICBpb2Jhc2UrVUFSVF9ETEwpOyAvKiBTZXQgc3BlZWQgKi8KKwlvdXRiKGRpdmlzb3IgPj4gOCwJICBpb2Jhc2UrVUFSVF9ETE0pOworCW91dGIobGNyLAkJICBpb2Jhc2UrVUFSVF9MQ1IpOyAvKiBTZXQgOE4xCSovCisJb3V0YihmY3IsCQkgIGlvYmFzZStVQVJUX0ZDUik7IC8qIEVuYWJsZSBGSUZPJ3MgKi8KKworCS8qIFR1cm4gb24gaW50ZXJydXBzICovCisJLyogVGhpcyB3aWxsIGdlbmVyYXRlIGEgZmF0YWwgaW50ZXJydXB0IHN0b3JtLgorCSAqIFBlb3BsZSBjYWxsaW5nIHVzIHdpbGwgZG8gdGhhdCBwcm9wZXJseSAtIEplYW4gSUkgKi8KKwkvL291dGIoLypVQVJUX0lFUl9STFNJfCovVUFSVF9JRVJfUkRJLyp8VUFSVF9JRVJfVEhSSSovLCBpb2Jhc2UrVUFSVF9JRVIpOworfQorCisvKgorICogRnVuY3Rpb24gX19pcnBvcnRfY2hhbmdlX3NwZWVkIChpbnN0YW5jZSwgc3RhdGUsIHBhcmFtKQorICoKKyAqICAgIFN0YXRlIG1hY2hpbmUgZm9yIGNoYW5naW5nIHNwZWVkIG9mIHRoZSBkZXZpY2UuIFdlIGRvIGl0IHRoaXMgd2F5IHNpbmNlCisgKiAgICB3ZSBjYW5ub3QgdXNlIHNjaGVkdWxlX3RpbWVvdXQoKSB3aGVuIHdlIGFyZSBpbiBpbnRlcnJ1cHQgY29udGV4dAorICoKKyAqLworaW50IF9faXJwb3J0X2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCXN0cnVjdCBpcnBvcnRfY2IgKnNlbGY7CisJX191MzIgc3BlZWQgPSAoX191MzIpIHRhc2stPnBhcmFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWludCB3YXN1bmxvY2tlZCA9IDA7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCA8JWxkPlxuIiwgX19GVU5DVElPTl9fLCBqaWZmaWVzKTsgCisKKwlzZWxmID0gKHN0cnVjdCBpcnBvcnRfY2IgKikgdGFzay0+aW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJLyogTG9ja2luZyBub3RlcyA6IHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIGlycSBjb250ZXh0IHdpdGgKKwkgKiBzcGlubG9jaywgdmlhIGlycG9ydF93cml0ZV93YWtldXAoKSwgb3IgZnJvbSBub24taW50ZXJydXB0IHdpdGhvdXQKKwkgKiBzcGlubG9jayAoZnJvbSB0aGUgdGFzayB0aW1lcikuIFl1Y2sgIQorCSAqIFRoaXMgaXMgdWdseSwgYW5kIHVuc2FmZSBpcyB0aGUgc3BpbmxvY2sgaXMgbm90IGFscmVhZHkgYXF1aXJlZC4KKwkgKiBUaGlzIHdpbGwgYmUgZml4ZWQgd2hlbiBpcmRhLXRhc2sgZ2V0IHJld3JpdHRlbi4KKwkgKiBKZWFuIElJICovCisJaWYgKCFzcGluX2lzX2xvY2tlZCgmc2VsZi0+bG9jaykpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJd2FzdW5sb2NrZWQgPSAxOworCX0KKworCXN3aXRjaCAodGFzay0+c3RhdGUpIHsKKwljYXNlIElSREFfVEFTS19JTklUOgorCWNhc2UgSVJEQV9UQVNLX1dBSVQ6CisJCS8qIEFyZSB3ZSByZWFkeSB0byBjaGFuZ2Ugc3BlZWQgeWV0PyAqLworCQlpZiAoc2VsZi0+dHhfYnVmZi5sZW4gPiAwKSB7CisJCQl0YXNrLT5zdGF0ZSA9IElSREFfVEFTS19XQUlUOworCisJCQkvKiBUcnkgYWdhaW4gbGF0ZXIgKi8KKwkJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMjApOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2VsZi0+ZG9uZ2xlKQorCQkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0NISUxEX0lOSVQpOworCQllbHNlCisJCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfQ0hJTERfRE9ORSk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX0NISUxEX0lOSVQ6CisJCS8qIEdvIHRvIGRlZmF1bHQgc3BlZWQgKi8KKwkJc2VsZi0+Y2hhbmdlX3NwZWVkKHNlbGYtPnByaXYsIDk2MDApOworCisJCS8qIENoYW5nZSBzcGVlZCBvZiBkb25nbGUgKi8KKwkJaWYgKGlyZGFfdGFza19leGVjdXRlKHNlbGYtPmRvbmdsZSwKKwkJCQkgICAgICBzZWxmLT5kb25nbGUtPmlzc3VlLT5jaGFuZ2Vfc3BlZWQsIAorCQkJCSAgICAgIE5VTEwsIHRhc2ssICh2b2lkICopIHNwZWVkKSkKKwkJeworCQkJLyogRG9uZ2xlIG5lZWQgbW9yZSB0aW1lIHRvIGNoYW5nZSBpdHMgc3BlZWQgKi8KKwkJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19DSElMRF9XQUlUKTsKKworCQkJLyogR2l2ZSBkb25nbGUgMSBzZWMgdG8gZmluaXNoICovCisJCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCQl9IGVsc2UKKwkJCS8qIENoaWxkIGZpbmlzaGVkIGltbWVkaWF0ZWx5ICovCisJCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfQ0hJTERfRE9ORSk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX0NISUxEX1dBSVQ6CisJCUlSREFfV0FSTklORygiJXMoKSwgY2hhbmdpbmcgc3BlZWQgb2YgZG9uZ2xlIHRpbWVkIG91dCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldCA9IC0xOwkJCisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX0NISUxEX0RPTkU6CisJCS8qIEZpbmFsbHkgd2UgYXJlIHJlYWR5IHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KKwkJc2VsZi0+Y2hhbmdlX3NwZWVkKHNlbGYtPnByaXYsIHNwZWVkKTsKKwkJCisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgdGFzay0+c3RhdGUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJLyogUHV0IHN0dWZmIGluIHRoZSBzdGF0ZSB3ZSBmb3VuZCB0aGVtIC0gSmVhbiBJSSAqLworCWlmKHdhc3VubG9ja2VkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X2NoYW5nZV9zcGVlZF9jb21wbGV0ZSAodGFzaykKKyAqCisgKiAgICBDYWxsZWQgd2hlbiB0aGUgY2hhbmdlIHNwZWVkIG9wZXJhdGlvbiBjb21wbGV0ZXMKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJwb3J0X2NoYW5nZV9zcGVlZF9jb21wbGV0ZShzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCXN0cnVjdCBpcnBvcnRfY2IgKnNlbGY7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2VsZiA9IChzdHJ1Y3QgaXJwb3J0X2NiICopIHRhc2stPmluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5uZXRkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkvKiBGaW5pc2hlZCBjaGFuZ2luZyBzcGVlZCwgc28gd2UgYXJlIG5vdCBidXN5IGFueSBsb25nZXIgKi8KKwkvKiBTaWduYWwgbmV0d29yayBsYXllciBzbyBpdCBjYW4gdHJ5IHRvIHNlbmQgdGhlIGZyYW1lICovCisKKwluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKyAqCisgKiAgICBUaGUgbmV0d29ya2luZyBsYXllciB0aGlua3Mgd2UgdGltZWQgb3V0LgorICoKKyAqLworCitzdGF0aWMgdm9pZCBpcnBvcnRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcnBvcnRfY2IgKnNlbGY7CisJaW50IGlvYmFzZTsKKwlpbnQgaWlyLCBsc3I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNlbGYgPSAoc3RydWN0IGlycG9ydF9jYiAqKSBkZXYtPnByaXY7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKwkKKwlJUkRBX1dBUk5JTkcoIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIGppZmZpZXMgPSAlbGQsIHRyYW5zX3N0YXJ0ID0gJWxkXG4iLAorCQlkZXYtPm5hbWUsIGppZmZpZXMsIGRldi0+dHJhbnNfc3RhcnQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwkvKiBEZWJ1ZyB3aGF0J3MgaGFwcGVuaW5nLi4uICovCisKKwkvKiBHZXQgaW50ZXJydXB0IHN0YXR1cyAqLworCWxzciA9IGluYihpb2Jhc2UrVUFSVF9MU1IpOworCS8qIFJlYWQgaW50ZXJydXB0IHJlZ2lzdGVyICovCisJaWlyID0gaW5iKGlvYmFzZStVQVJUX0lJUik7CisJSVJEQV9ERUJVRygwLCAiJXMoKSwgaWlyPSUwMngsIGxzcj0lMDJ4LCBpb2Jhc2U9JSN4XG4iLCAKKwkJICAgX19GVU5DVElPTl9fLCBpaXIsIGxzciwgaW9iYXNlKTsKKworCUlSREFfREVCVUcoMCwgIiVzKCksIHRyYW5zbWl0dGluZz0lZCwgcmVtYWluPSVkLCBkb25lPSVkXG4iLCAKKwkJICAgX19GVU5DVElPTl9fLCBzZWxmLT50cmFuc21pdHRpbmcsIHNlbGYtPnR4X2J1ZmYubGVuLAorCQkgICBzZWxmLT50eF9idWZmLmRhdGEgLSBzZWxmLT50eF9idWZmLmhlYWQpOworCisJLyogTm93LCByZXN0YXJ0IHRoZSBwb3J0ICovCisJaXJwb3J0X3N0YXJ0KHNlbGYpOworCXNlbGYtPmNoYW5nZV9zcGVlZChzZWxmLT5wcml2LCBzZWxmLT5pby5zcGVlZCk7CisJLyogVGhpcyB3aWxsIHJlLWVuYWJsZSBpcnFzICovCisJb3V0YigvKlVBUlRfSUVSX1JMU0l8Ki9VQVJUX0lFUl9SREkvKnxVQVJUX0lFUl9USFJJKi8sIGlvYmFzZStVQVJUX0lFUik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorIAorLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF93YWl0X2h3X3RyYW5zbWl0dGVyX2ZpbmlzaCAoKQorICoKKyAqICAgIFdhaXQgZm9yIHRoZSByZWFsIGVuZCBvZiBIVyB0cmFuc21pc3Npb24KKyAqCisgKiBUaGUgVUFSVCBpcyBhIHN0cmljdCBGSUZPLCBhbmQgd2UgZ2V0IGNhbGxlZCBvbmx5IHdoZW4gd2UgaGF2ZSBmaW5pc2hlZAorICogcHVzaGluZyBkYXRhIHRvIHRoZSBGSUZPLCBzbyB0aGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB3ZSBtdXN0IHdhaXQKKyAqIGlzIG9ubHkgZm9yIHRoZSBGSUZPIHRvIGRyYWluIG91dC4KKyAqCisgKiBXZSB1c2UgYSBzaW1wbGUgY2FsaWJyYXRlZCBsb29wLiBXZSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlIGxvb3AKKyAqIGRlbGF5ICh1ZGVsYXkpIHRvIGJhbGFuY2UgSS9PIHRyYWZmaWMgYW5kIGxhdGVuY3kuIEFuZCB3ZSBhbHNvIG5lZWQgdG8KKyAqIGFkanVzdCB0aGUgbWF4aW11bSB0aW1lb3V0LgorICogSXQgd291bGQgcHJvYmFibHkgYmUgYmV0dGVyIHRvIHdhaXQgZm9yIHRoZSBwcm9wZXIgaW50ZXJydXB0LAorICogYnV0IGl0IGRvZXNuJ3Qgc2VlbSB0byBiZSBhdmFpbGFibGUuCisgKgorICogV2UgY2FuJ3QgdXNlIGppZmZpZXMgb3Iga2VybmVsIHRpbWVycyBiZWNhdXNlIDoKKyAqIDEpIFdlIGFyZSBjYWxsZWQgZnJvbSB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIHdoaWNoIGRpc2FibGUgc29mdGlycXMsCisgKiBzbyBqaWZmaWVzIHdvbid0IGJlIGluY3JlYXNlZAorICogMikgSmlmZmllcyBncmFudWxhcml0eSBpcyB1c3VhbGx5IHZlcnkgY29hcnNlICgxMG1zKSwgYW5kIHdlIGRvbid0CisgKiB3YW50IHRvIHdhaXQgdGhhdCBsb25nIHRvIGRldGVjdCBzdHVjayBoYXJkd2FyZS4KKyAqIEplYW4gSUkKKyAqLworCitzdGF0aWMgdm9pZCBpcnBvcnRfd2FpdF9od190cmFuc21pdHRlcl9maW5pc2goc3RydWN0IGlycG9ydF9jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCWludCBjb3VudCA9IDEwMDA7CS8qIDEgbXMgKi8KKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCS8qIENhbGlicmF0ZWQgYnVzeSBsb29wICovCisJd2hpbGUoKGNvdW50LS0gPiAwKSAmJiAhKGluYihpb2Jhc2UrVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVCkpCisJCXVkZWxheSgxKTsKKworCWlmKGNvdW50ID09IDApCisJCUlSREFfREVCVUcoMCwgIiVzKCk6IHN0dWNrIHRyYW5zbWl0dGVyXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X2hhcmRfc3RhcnRfeG1pdCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKyAqCisgKiAgICBUcmFuc21pdHMgdGhlIGN1cnJlbnQgZnJhbWUgdW50aWwgRklGTyBpcyBmdWxsLCB0aGVuCisgKiAgICB3YWl0cyB1bnRpbCB0aGUgbmV4dCB0cmFuc21pdHQgaW50ZXJydXB0LCBhbmQgY29udGludWVzIHVudGlsIHRoZQorICogICAgZnJhbWUgaXMgdHJhbnNtaXR0ZWQuCisgKi8KK3N0YXRpYyBpbnQgaXJwb3J0X2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcnBvcnRfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaW9iYXNlOworCXMzMiBzcGVlZDsKKworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwkKKwlzZWxmID0gKHN0cnVjdCBpcnBvcnRfY2IgKikgZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogTWFrZSBzdXJlIHRlc3RzICYgc3BlZWQgY2hhbmdlIGFyZSBhdG9taWMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisJaWYgKChzcGVlZCAhPSBzZWxmLT5pby5zcGVlZCkgJiYgKHNwZWVkICE9IC0xKSkgeworCQkvKiBDaGVjayBmb3IgZW1wdHkgZnJhbWUgKi8KKwkJaWYgKCFza2ItPmxlbikgeworCQkJLyoKKwkJCSAqIFdlIHNlbmQgZnJhbWVzIG9uZSBieSBvbmUgaW4gU0lSIG1vZGUgKG5vCisJCQkgKiBwaXBlbGluaW5nKSwgc28gYXQgdGhpcyBwb2ludCwgaWYgd2Ugd2VyZSBzZW5kaW5nCisJCQkgKiBhIHByZXZpb3VzIGZyYW1lLCB3ZSBqdXN0IHJlY2VpdmVkIHRoZSBpbnRlcnJ1cHQKKwkJCSAqIHRlbGxpbmcgdXMgaXQgaXMgZmluaXNoZWQgKFVBUlRfSUlSX1RIUkkpLgorCQkJICogVGhlcmVmb3JlLCB3YWl0aW5nIGZvciB0aGUgdHJhbnNtaXR0ZXIgdG8gcmVhbGx5CisJCQkgKiBmaW5pc2ggZHJhaW5pbmcgdGhlIGZpZm8gd29uJ3QgdGFrZSB0b28gbG9uZy4KKwkJCSAqIEFuZCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaXMgbm90IGV4cGVjdGVkIHRvIHJ1bi4KKwkJCSAqIC0gSmVhbiBJSSAqLworCQkJaXJwb3J0X3dhaXRfaHdfdHJhbnNtaXR0ZXJfZmluaXNoKHNlbGYpOworCQkJLyogQmV0dGVyIGdvIHRoZXJlIGFscmVhZHkgbG9ja2VkIC0gSmVhbiBJSSAqLworCQkJaXJkYV90YXNrX2V4ZWN1dGUoc2VsZiwgX19pcnBvcnRfY2hhbmdlX3NwZWVkLCAKKwkJCQkJICBpcnBvcnRfY2hhbmdlX3NwZWVkX2NvbXBsZXRlLCAKKwkJCQkJICBOVUxMLCAodm9pZCAqKSBzcGVlZCk7CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOworCX0KKworCS8qIEluaXQgdHggYnVmZmVyICovCisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCisgICAgICAgIC8qIENvcHkgc2tiIHRvIHR4X2J1ZmYgd2hpbGUgd3JhcHBpbmcsIHN0dWZmaW5nIGFuZCBtYWtpbmcgQ1JDICovCisJc2VsZi0+dHhfYnVmZi5sZW4gPSBhc3luY193cmFwX3NrYihza2IsIHNlbGYtPnR4X2J1ZmYuZGF0YSwgCisJCQkJCSAgIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOworCQorCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOworCisJLyogV2UgYXJlIHRyYW5zbWl0dGluZyAqLworCXNlbGYtPnRyYW5zbWl0dGluZyA9IDE7CisKKwkvKiBUdXJuIG9uIHRyYW5zbWl0IGZpbmlzaGVkIGludGVycnVwdC4gV2lsbCBmaXJlIGltbWVkaWF0ZWx5ISAgKi8KKwlvdXRiKFVBUlRfSUVSX1RIUkksIGlvYmFzZStVQVJUX0lFUik7IAorCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCQorCXJldHVybiAwOworfQorICAgICAgICAKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfd3JpdGUgKGRyaXZlcikKKyAqCisgKiAgICBGaWxsIFR4IEZJRk8gd2l0aCB0cmFuc21pdCBkYXRhCisgKgorICogQ2FsbGVkIG9ubHkgZnJvbSBpcnBvcnRfd3JpdGVfd2FrZXVwKCkKKyAqLworc3RhdGljIGlubGluZSBpbnQgaXJwb3J0X3dyaXRlKGludCBpb2Jhc2UsIGludCBmaWZvX3NpemUsIF9fdTggKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgYWN0dWFsID0gMDsKKworCS8qIEZpbGwgRklGTyB3aXRoIGN1cnJlbnQgZnJhbWUgKi8KKwl3aGlsZSAoKGFjdHVhbCA8IGZpZm9fc2l6ZSkgJiYgKGFjdHVhbCA8IGxlbikpIHsKKwkJLyogVHJhbnNtaXQgbmV4dCBieXRlICovCisJCW91dGIoYnVmW2FjdHVhbF0sIGlvYmFzZStVQVJUX1RYKTsKKworCQlhY3R1YWwrKzsKKwl9CisgICAgICAgIAorCXJldHVybiBhY3R1YWw7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfd3JpdGVfd2FrZXVwICh0dHkpCisgKgorICogICAgQ2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZGF0YS4gIElmIHdlIGhhdmUKKyAqICAgIG1vcmUgcGFja2V0cyB0byBzZW5kLCB3ZSBzZW5kIHRoZW0gaGVyZS4KKyAqCisgKiBDYWxsZWQgb25seSBmcm9tIGlycG9ydF9pbnRlcnJ1cHQoKQorICogTWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gaXMgKm5vdCogY2FsbGVkIHdoaWxlIHdlIGFyZSByZWNlaXZpbmcsCisgKiBvdGhlcndpc2Ugd2Ugd2lsbCByZXNldCBmaWZvIGFuZCBsb29zZSBkYXRhIDotKAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJwb3J0X3dyaXRlX3dha2V1cChzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmKQoreworCWludCBhY3R1YWwgPSAwOworCWludCBpb2Jhc2U7CisJdW5zaWduZWQgaW50IGZjcjsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwkvKiBGaW5pc2hlZCB3aXRoIGZyYW1lPyAgKi8KKwlpZiAoc2VsZi0+dHhfYnVmZi5sZW4gPiAwKSAgeworCQkvKiBXcml0ZSBkYXRhIGxlZnQgaW4gdHJhbnNtaXQgYnVmZmVyICovCisJCWFjdHVhbCA9IGlycG9ydF93cml0ZShpb2Jhc2UsIHNlbGYtPmlvLmZpZm9fc2l6ZSwgCisJCQkJICAgICAgc2VsZi0+dHhfYnVmZi5kYXRhLCBzZWxmLT50eF9idWZmLmxlbik7CisJCXNlbGYtPnR4X2J1ZmYuZGF0YSArPSBhY3R1YWw7CisJCXNlbGYtPnR4X2J1ZmYubGVuICAtPSBhY3R1YWw7CisJfSBlbHNlIHsKKwkJLyogCisJCSAqICBOb3cgc2VyaWFsIGJ1ZmZlciBpcyBhbG1vc3QgZnJlZSAmIHdlIGNhbiBzdGFydCAKKwkJICogIHRyYW5zbWlzc2lvbiBvZiBhbm90aGVyIHBhY2tldC4gQnV0IGZpcnN0IHdlIG11c3QgY2hlY2sKKwkJICogIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZCBvZiB0aGUgaGFyZHdhcmUKKwkJICovCisJCWlmIChzZWxmLT5uZXdfc3BlZWQpIHsKKwkJCWlycG9ydF93YWl0X2h3X3RyYW5zbWl0dGVyX2ZpbmlzaChzZWxmKTsKKwkJCWlyZGFfdGFza19leGVjdXRlKHNlbGYsIF9faXJwb3J0X2NoYW5nZV9zcGVlZCwgCisJCQkJCSAgaXJwb3J0X2NoYW5nZV9zcGVlZF9jb21wbGV0ZSwgCisJCQkJCSAgTlVMTCwgKHZvaWQgKikgc2VsZi0+bmV3X3NwZWVkKTsKKwkJCXNlbGYtPm5ld19zcGVlZCA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBUZWxsIG5ldHdvcmsgbGF5ZXIgdGhhdCB3ZSB3YW50IG1vcmUgZnJhbWVzICovCisJCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisJCX0KKwkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCisJCS8qIAorCQkgKiBSZXNldCBSeCBGSUZPIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCByZWZsZWN0ZWQgdHJhbnNtaXQgZGF0YQorCQkgKiBpcyBkaXNjYXJkZWQuIFRoaXMgaXMgbmVlZGVkIGZvciBoYWxmIGR1cGxleCBvcGVyYXRpb24KKwkJICovCisJCWZjciA9IGlycG9ydF9nZXRfZmNyKHNlbGYtPmlvLnNwZWVkKTsKKwkJZmNyIHw9IFVBUlRfRkNSX0NMRUFSX1JDVlI7CisJCW91dGIoZmNyLCBpb2Jhc2UrVUFSVF9GQ1IpOworCisJCS8qIEZpbmlzaGVkIHRyYW5zbWl0dGluZyAqLworCQlzZWxmLT50cmFuc21pdHRpbmcgPSAwOworCisJCS8qIFR1cm4gb24gcmVjZWl2ZSBpbnRlcnJ1cHRzICovCisJCW91dGIoVUFSVF9JRVJfUkRJLCBpb2Jhc2UrVUFSVF9JRVIpOworCisJCUlSREFfREVCVUcoMSwgIiVzKCkgOiBmaW5pc2hlZCBUeFxuIiwgX19GVU5DVElPTl9fKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfcmVjZWl2ZSAoc2VsZikKKyAqCisgKiAgICBSZWNlaXZlIG9uZSBmcmFtZSBmcm9tIHRoZSBpbmZyYXJlZCBwb3J0CisgKgorICogQ2FsbGVkIG9ubHkgZnJvbSBpcnBvcnRfaW50ZXJydXB0KCkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlycG9ydF9yZWNlaXZlKHN0cnVjdCBpcnBvcnRfY2IgKnNlbGYpIAoreworCWludCBib2d1c2NvdW50ID0gMDsKKwlpbnQgaW9iYXNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJLyogIAorCSAqIFJlY2VpdmUgYWxsIGNoYXJhY3RlcnMgaW4gUnggRklGTywgdW53cmFwIGFuZCB1bnN0dWZmIHRoZW0uIAorICAgICAgICAgKiBhc3luY191bndyYXBfY2hhciB3aWxsIGRlbGl2ZXIgYWxsIGZvdW5kIGZyYW1lcyAgCisJICovCisJZG8geworCQlhc3luY191bndyYXBfY2hhcihzZWxmLT5uZXRkZXYsICZzZWxmLT5zdGF0cywgJnNlbGYtPnJ4X2J1ZmYsIAorCQkJCSAgaW5iKGlvYmFzZStVQVJUX1JYKSk7CisKKwkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHN0YXkgaGVyZSB0b28gbG9uZyAqLworCQlpZiAoYm9ndXNjb3VudCsrID4gMzIpIHsKKwkJCUlSREFfREVCVUcoMiwiJXMoKSwgYnJlYWtpbmchXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChpbmIoaW9iYXNlK1VBUlRfTFNSKSAmIFVBUlRfTFNSX0RSKTsJCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfaW50ZXJydXB0IChpcnEsIGRldl9pZCwgcmVncykKKyAqCisgKiAgICBJbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaXJwb3J0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKSAKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmOworCWludCBib2d1c2NvdW50ID0gMDsKKwlpbnQgaW9iYXNlOworCWludCBpaXIsIGxzcjsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAoIWRldikgeworCQlJUkRBX1dBUk5JTkcoIiVzKCkgaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIF9fRlVOQ1RJT05fXywgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwlzZWxmID0gKHN0cnVjdCBpcnBvcnRfY2IgKikgZGV2LT5wcml2OworCisJc3Bpbl9sb2NrKCZzZWxmLT5sb2NrKTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJLyogQ3V0J24ncGFzdGUgaW50ZXJydXB0IHJvdXRpbmUgZnJvbSBzZXJpYWwuYworCSAqIFRoaXMgdmVyc2lvbiB0cnkgdG8gbWluaW1pc2UgbGF0ZW5jeSBhbmQgSS9PIG9wZXJhdGlvbnMuCisJICogU2ltcGxpZmllZCBhbmQgbW9kaWZpZWQgdG8gZW5mb3JjZSBoYWxmIGR1cGxleCBvcGVyYXRpb24uCisJICogLSBKZWFuIElJICovCisKKwkvKiBDaGVjayBzdGF0dXMgZXZlbiBpcyBpaXIgcmVnIGlzIGNsZWFyZWQsIG1vcmUgcm9idXN0IGFuZAorCSAqIGVsaW1pbmF0ZSBhIHJlYWQgb24gdGhlIEkvTyBidXMgLSBKZWFuIElJICovCisJZG8geworCQkvKiBHZXQgaW50ZXJydXB0IHN0YXR1cyA7IENsZWFyIGludGVycnVwdCAqLworCQlsc3IgPSBpbmIoaW9iYXNlK1VBUlRfTFNSKTsKKwkJCisJCS8qIEFyZSB3ZSByZWNlaXZpbmcgb3IgdHJhbnNtaXR0aW5nID8gKi8KKwkJaWYoIXNlbGYtPnRyYW5zbWl0dGluZykgeworCQkJLyogUmVjZWl2ZWQgc29tZXRoaW5nID8gKi8KKwkJCWlmIChsc3IgJiBVQVJUX0xTUl9EUikKKwkJCQlpcnBvcnRfcmVjZWl2ZShzZWxmKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFJvb20gaW4gVHggZmlmbyA/ICovCisJCQlpZiAobHNyICYgKFVBUlRfTFNSX1RIUkUgfCBVQVJUX0xTUl9URU1UKSkKKwkJCQlpcnBvcnRfd3JpdGVfd2FrZXVwKHNlbGYpOworCQl9CisKKwkJLyogQSBiaXQgaGFja2lzaCwgYnV0IHdvcmtpbmcgYXMgZXhwZWN0ZWQuLi4gSmVhbiBJSSAqLworCQlpZihsc3IgJiAoVUFSVF9MU1JfVEhSRSB8IFVBUlRfTFNSX1RFTVQgfCBVQVJUX0xTUl9EUikpCisJCQloYW5kbGVkID0gMTsKKworCQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3Qgc3RheSBoZXJlIHRvIGxvbmcgKi8KKwkJaWYgKGJvZ3VzY291bnQrKyA+IDEwKSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzKCkgaXJxIGhhbmRsZXIgbG9vcGluZyA6IGxzcj0lMDJ4XG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fLCBsc3IpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBSZWFkIGludGVycnVwdCByZWdpc3RlciAqLworIAkgICAgICAgIGlpciA9IGluYihpb2Jhc2UrVUFSVF9JSVIpOworCisJCS8qIEVuYWJsZSB0aGlzIGRlYnVnIG9ubHkgd2hlbiBubyBvdGhlciBvcHRpb25zIGFuZCBhdCBsb3cKKwkJICogYml0IHJhdGVzLCBvdGhlcndpc2UgaXQgbWF5IGNhdXNlIFJ4IG92ZXJydW5zIChsc3I9NjMpLgorCQkgKiAtIEplYW4gSUkgKi8KKwkJSVJEQV9ERUJVRyg2LCAiJXMoKSwgaWlyPSUwMngsIGxzcj0lMDJ4LCBpb2Jhc2U9JSN4XG4iLCAKKwkJCSAgICBfX0ZVTkNUSU9OX18sIGlpciwgbHNyLCBpb2Jhc2UpOworCisJCS8qIEFzIGxvbmcgYXMgaW50ZXJydXB0IHBlbmRpbmcuLi4gKi8KKwl9IHdoaWxlICgoaWlyICYgVUFSVF9JSVJfTk9fSU5UKSA9PSAwKTsKKworCXNwaW5fdW5sb2NrKCZzZWxmLT5sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF9uZXRfb3BlbiAoZGV2KQorICoKKyAqICAgIE5ldHdvcmsgZGV2aWNlIGlzIHRha2VuIHVwLiBVc3VhbGx5IHRoaXMgaXMgZG9uZSBieSAiaWZjb25maWcgaXJkYTAgdXAiIAorICogICAKKyAqLworc3RhdGljIGludCBpcnBvcnRfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmOworCWludCBpb2Jhc2U7CisJY2hhciBod25hbWVbMTZdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSAoc3RydWN0IGlycG9ydF9jYiAqKSBkZXYtPnByaXY7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCWlmIChyZXF1ZXN0X2lycShzZWxmLT5pby5pcnEsIHNlbGYtPmludGVycnVwdCwgMCwgZGV2LT5uYW1lLCAKKwkJCSh2b2lkICopIGRldikpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5hYmxlIHRvIGFsbG9jYXRlIGlycT0lZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+aW8uaXJxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkvKiBJbml0IHVhcnQgKi8KKwlpcnBvcnRfc3RhcnQoc2VsZik7CisJLyogU2V0IDk2MDAgYmF1ZHMgcGVyIGRlZmF1bHQsIGluY2x1ZGluZyBhdCB0aGUgZG9uZ2xlICovCisJaXJkYV90YXNrX2V4ZWN1dGUoc2VsZiwgX19pcnBvcnRfY2hhbmdlX3NwZWVkLCAKKwkJCSAgaXJwb3J0X2NoYW5nZV9zcGVlZF9jb21wbGV0ZSwgCisJCQkgIE5VTEwsICh2b2lkICopIDk2MDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCisJLyogR2l2ZSBzZWxmIGEgaGFyZHdhcmUgbmFtZSAqLworCXNwcmludGYoaHduYW1lLCAiU0lSIEAgMHglMDN4Iiwgc2VsZi0+aW8uc2lyX2Jhc2UpOworCisJLyogCisJICogT3BlbiBuZXcgSXJMQVAgbGF5ZXIgaW5zdGFuY2UsIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgc2hvdWxkIGJlCisJICogaW5pdGlhbGl6ZWQgcHJvcGVybHkgCisJICovCisJc2VsZi0+aXJsYXAgPSBpcmxhcF9vcGVuKGRldiwgJnNlbGYtPnFvcywgaHduYW1lKTsKKworCS8qIFJlYWR5IHRvIHBsYXkhICovCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfbmV0X2Nsb3NlIChzZWxmKQorICoKKyAqICAgIE5ldHdvcmsgZGV2aWNlIGlzIHRha2VuIGRvd24uIFVzdWFsbHkgdGhpcyBpcyBkb25lIGJ5IAorICogICAgImlmY29uZmlnIGlyZGEwIGRvd24iIAorICovCitzdGF0aWMgaW50IGlycG9ydF9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmOworCWludCBpb2Jhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IChzdHJ1Y3QgaXJwb3J0X2NiICopIGRldi0+cHJpdjsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCS8qIFN0b3AgZGV2aWNlICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCS8qIFN0b3AgYW5kIHJlbW92ZSBpbnN0YW5jZSBvZiBJckxBUCAqLworCWlmIChzZWxmLT5pcmxhcCkKKwkJaXJsYXBfY2xvc2Uoc2VsZi0+aXJsYXApOworCXNlbGYtPmlybGFwID0gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJaXJwb3J0X3N0b3Aoc2VsZik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJZnJlZV9pcnEoc2VsZi0+aW8uaXJxLCBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfaXNfcmVjZWl2aW5nIChzZWxmKQorICoKKyAqICAgIFJldHVybnMgdHJ1ZSBpcyB3ZSBhcmUgY3VycmVudGx5IHJlY2VpdmluZyBkYXRhCisgKgorICovCitzdGF0aWMgaW5saW5lIGludCBpcnBvcnRfaXNfcmVjZWl2aW5nKHN0cnVjdCBpcnBvcnRfY2IgKnNlbGYpCit7CisJcmV0dXJuIChzZWxmLT5yeF9idWZmLnN0YXRlICE9IE9VVFNJREVfRlJBTUUpOworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X3NldF9kdHJfcnRzICh0dHksIGR0ciwgcnRzKQorICoKKyAqICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkgZG9uZ2xlcyBldGMuIHRvIHNldCBvciByZXNldCB0aGUgc3RhdHVzCisgKiAgICBvZiB0aGUgZHRyIGFuZCBydHMgbGluZXMKKyAqLworc3RhdGljIGludCBpcnBvcnRfc2V0X2R0cl9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGR0ciwgaW50IHJ0cykKK3sKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmID0gZGV2LT5wcml2OworCWludCBpb2Jhc2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwlpZiAoZHRyKQorCQlkdHIgPSBVQVJUX01DUl9EVFI7CisJaWYgKHJ0cykKKwkJcnRzID0gVUFSVF9NQ1JfUlRTOworCisJb3V0YihkdHJ8cnRzfFVBUlRfTUNSX09VVDIsIGlvYmFzZStVQVJUX01DUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcnBvcnRfcmF3X3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTggKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmID0gKHN0cnVjdCBpcnBvcnRfY2IgKikgZGV2LT5wcml2OworCWludCBhY3R1YWwgPSAwOworCWludCBpb2Jhc2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwkvKiBUeCBGSUZPIHNob3VsZCBiZSBlbXB0eSEgKi8KKwlpZiAoIShpbmIoaW9iYXNlK1VBUlRfTFNSKSAmIFVBUlRfTFNSX1RIUkUpKSB7CisJCUlSREFfREVCVUcoIDAsICIlcygpLCBmYWlsZWQsIGZpZm8gbm90IGVtcHR5IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKyAgICAgICAgCisJLyogRmlsbCBGSUZPIHdpdGggY3VycmVudCBmcmFtZSAqLworCXdoaWxlIChhY3R1YWwgPCBsZW4pIHsKKwkJLyogVHJhbnNtaXQgbmV4dCBieXRlICovCisJCW91dGIoYnVmW2FjdHVhbF0sIGlvYmFzZStVQVJUX1RYKTsKKwkJYWN0dWFsKys7CisJfQorCisJcmV0dXJuIGFjdHVhbDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF9uZXRfaW9jdGwgKGRldiwgcnEsIGNtZCkKKyAqCisgKiAgICBQcm9jZXNzIElPQ1RMIGNvbW1hbmRzIGZvciB0aGlzIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBpcnBvcnRfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IGlmX2lyZGFfcmVxICppcnEgPSAoc3RydWN0IGlmX2lyZGFfcmVxICopIHJxOworCXN0cnVjdCBpcnBvcnRfY2IgKnNlbGY7CisJZG9uZ2xlX3QgKmRvbmdsZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJc2VsZiA9IGRldi0+cHJpdjsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAlcywgKGNtZD0weCVYKVxuIiwgX19GVU5DVElPTl9fLCBkZXYtPm5hbWUsIGNtZCk7CisJCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFORFdJRFRIOiAvKiBTZXQgYmFuZHdpZHRoICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldCA9IC1FUEVSTTsKKyAgICAgICAgICAgICAgICBlbHNlCisJCQlpcmRhX3Rhc2tfZXhlY3V0ZShzZWxmLCBfX2lycG9ydF9jaGFuZ2Vfc3BlZWQsIE5VTEwsIAorCQkJCQkgIE5VTEwsICh2b2lkICopIGlycS0+aWZyX2JhdWRyYXRlKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU0RPTkdMRTogLyogU2V0IGRvbmdsZSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTG9ja2luZyA6CisJCSAqIGlyZGFfZGV2aWNlX2RvbmdsZV9pbml0KCkgY2FuJ3QgYmUgbG9ja2VkLgorCQkgKiBpcmRhX3Rhc2tfZXhlY3V0ZSgpIGRvZXNuJ3QgbmVlZCB0byBiZSBsb2NrZWQuCisJCSAqIEplYW4gSUkKKwkJICovCisKKwkJLyogSW5pdGlhbGl6ZSBkb25nbGUgKi8KKwkJZG9uZ2xlID0gaXJkYV9kZXZpY2VfZG9uZ2xlX2luaXQoZGV2LCBpcnEtPmlmcl9kb25nbGUpOworCQlpZiAoIWRvbmdsZSkKKwkJCWJyZWFrOworCQkKKwkJZG9uZ2xlLT5zZXRfbW9kZSAgICA9IE5VTEw7CisJCWRvbmdsZS0+cmVhZCAgICAgICAgPSBOVUxMOworCQlkb25nbGUtPndyaXRlICAgICAgID0gaXJwb3J0X3Jhd193cml0ZTsKKwkJZG9uZ2xlLT5zZXRfZHRyX3J0cyA9IGlycG9ydF9zZXRfZHRyX3J0czsKKwkJCisJCS8qIE5vdyBpbml0aWFsaXplIHRoZSBkb25nbGUhICAqLworCQlkb25nbGUtPmlzc3VlLT5vcGVuKGRvbmdsZSwgJnNlbGYtPnFvcyk7CisJCQorCQkvKiBSZXNldCBkb25nbGUgKi8KKwkJaXJkYV90YXNrX2V4ZWN1dGUoZG9uZ2xlLCBkb25nbGUtPmlzc3VlLT5yZXNldCwgTlVMTCwgTlVMTCwgCisJCQkJICBOVUxMKTsJCisKKwkJLyogTWFrZSBkb25nbGUgYXZhaWxhYmxlIHRvIGRyaXZlciBvbmx5IG5vdyB0byBhdm9pZAorCQkgKiByYWNlIGNvbmRpdGlvbnMgLSBKZWFuIElJICovCisJCXNlbGYtPmRvbmdsZSA9IGRvbmdsZTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU01FRElBQlVTWTogLyogU2V0IG1lZGlhIGJ1c3kgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCisJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KHNlbGYtPm5ldGRldiwgVFJVRSk7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dSRUNFSVZJTkc6IC8qIENoZWNrIGlmIHdlIGFyZSByZWNlaXZpbmcgcmlnaHQgbm93ICovCisJCWlycS0+aWZyX3JlY2VpdmluZyA9IGlycG9ydF9pc19yZWNlaXZpbmcoc2VsZik7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NEVFJSVFM6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBObyByZWFsIG5lZWQgdG8gbG9jay4uLiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQlpcnBvcnRfc2V0X2R0cl9ydHMoZGV2LCBpcnEtPmlmcl9kdHIsIGlycS0+aWZyX3J0cyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXJwb3J0X25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmID0gKHN0cnVjdCBpcnBvcnRfY2IgKikgZGV2LT5wcml2OworCQorCXJldHVybiAmc2VsZi0+c3RhdHM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGlycG9ydF9pbml0KHZvaWQpCit7CisgCWludCBpOworCisgCWZvciAoaT0wOyAoaW9baV0gPCAyMDAwKSAmJiAoaSA8IDQpOyBpKyspIHsKKyAJCWlmIChpcnBvcnRfb3BlbihpLCBpb1tpXSwgaXJxW2ldKSAhPSBOVUxMKQorIAkJCXJldHVybiAwOworIAl9CisJLyogCisJICogTWF5YmUgc29tZXRoaW5nIGZhaWxlZCwgYnV0IHdlIGNhbiBzdGlsbCBiZSB1c2FibGUgZm9yIEZJUiBkcml2ZXJzIAorCSAqLworIAlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF9jbGVhbnVwICgpCisgKgorICogICAgQ2xvc2UgYWxsIGNvbmZpZ3VyZWQgcG9ydHMKKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBpcnBvcnRfY2xlYW51cCh2b2lkKQoreworIAlpbnQgaTsKKworICAgICAgICBJUkRBX0RFQlVHKCA0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWZvciAoaT0wOyBpIDwgNDsgaSsrKSB7CisgCQlpZiAoZGV2X3NlbGZbaV0pCisgCQkJaXJwb3J0X2Nsb3NlKGRldl9zZWxmW2ldKTsKKyAJfQorfQorCitNT0RVTEVfUEFSTShpbywgIjEtNGkiKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJCYXNlIEkvTyBhZGRyZXNzZXMiKTsKK01PRFVMRV9QQVJNKGlycSwgIjEtNGkiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIGxpbmVzIik7CisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSGFsZiBkdXBsZXggc2VyaWFsIGRyaXZlciBmb3IgSXJEQSBTSVIgbW9kZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpcnBvcnRfaW5pdCk7Cittb2R1bGVfZXhpdChpcnBvcnRfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvaXJwb3J0LmggYi9kcml2ZXJzL25ldC9pcmRhL2lycG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjODljOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2lycG9ydC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJwb3J0LmgKKyAqIFZlcnNpb246ICAgICAgIDAuMQorICogRGVzY3JpcHRpb246ICAgU2VyaWFsIGRyaXZlciBmb3IgSXJEQQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgU3VuIEF1ZyAgMyAxMzo0OTo1OSAxOTk3CisgKiBNb2RpZmllZCBhdDogICBGcmkgSmFuIDE0IDEwOjIxOjEwIDIwMDAKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5NywgMTk5OC0yMDAwIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIElSUE9SVF9ICisjZGVmaW5lIElSUE9SVF9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjZGVmaW5lIFNQRUVEX0RFRkFVTFQgOTYwMAorI2RlZmluZSBTUEVFRF9NQVggICAgIDExNTIwMAorCisvKgorICogVGhlc2UgYXJlIHRoZSBzdXBwb3J0ZWQgc2VyaWFsIHR5cGVzLgorICovCisjZGVmaW5lIFBPUlRfVU5LTk9XTiAgICAwCisjZGVmaW5lIFBPUlRfODI1MCAgICAgICAxCisjZGVmaW5lIFBPUlRfMTY0NTAgICAgICAyCisjZGVmaW5lIFBPUlRfMTY1NTAgICAgICAzCisjZGVmaW5lIFBPUlRfMTY1NTBBICAgICA0CisjZGVmaW5lIFBPUlRfQ0lSUlVTICAgICA1CisjZGVmaW5lIFBPUlRfMTY2NTAgICAgICA2CisjZGVmaW5lIFBPUlRfTUFYICAgICAgICA2ICAKKworI2RlZmluZSBGUkFNRV9NQVhfU0laRSAyMDQ4CisKK3N0cnVjdCBpcnBvcnRfY2IgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7IC8qIFllcyEgd2UgYXJlIHNvbWUga2luZCBvZiBuZXRkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCXN0cnVjdCBpcmxhcF9jYiAqaXJsYXA7ICAgIC8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBhdHRhY2hlZCB0byAqLworCisJY2hpcGlvX3QgaW87ICAgICAgICAgICAgICAgLyogSXJEQSBjb250cm9sbGVyIGluZm9ybWF0aW9uICovCisJaW9idWZmX3QgdHhfYnVmZjsgICAgICAgICAgLyogVHJhbnNtaXQgYnVmZmVyICovCisJaW9idWZmX3QgcnhfYnVmZjsgICAgICAgICAgLyogUmVjZWl2ZSBidWZmZXIgKi8KKworCXN0cnVjdCBxb3NfaW5mbyBxb3M7ICAgICAgIC8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCisJZG9uZ2xlX3QgKmRvbmdsZTsgICAgICAgICAgLyogRG9uZ2xlIGRyaXZlciAqLworCisgCV9fdTMyIGZsYWdzOyAgICAgICAgICAgICAgIC8qIEludGVyZmFjZSBmbGFncyAqLworCV9fdTMyIG5ld19zcGVlZDsKKwlpbnQgbW9kZTsKKwlpbnQgaW5kZXg7ICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBpbmRleCAqLworCWludCB0cmFuc21pdHRpbmc7CSAgIC8qIEFyZSB3ZSB0cmFuc21pdHRpbmcgPyAqLworCisJc3BpbmxvY2tfdCBsb2NrOyAgICAgICAgICAgLyogRm9yIHNlcmlhbGl6aW5nIG9wZXJhdGlvbnMgKi8KKworCS8qIEZvciBwaWdneWJhY2sgZHJpdmVycyAqLworCXZvaWQgKnByaXY7ICAgICAgICAgICAgICAgIAorCXZvaWQgKCpjaGFuZ2Vfc3BlZWQpKHZvaWQgKnByaXYsIF9fdTMyIHNwZWVkKTsKKwlpbnQgKCppbnRlcnJ1cHQpKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworfTsKKworI2VuZGlmIC8qIElSUE9SVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2lydHR5LXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS9pcnR0eS1zaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDIzYWEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcnR0eS1zaXIuYwpAQCAtMCwwICsxLDY0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcnR0eS1zaXIuYworICogVmVyc2lvbjogICAgICAgMi4wCisgKiBEZXNjcmlwdGlvbjogICBJckRBIGxpbmUgZGlzY2lwbGluZSBpbXBsZW1lbnRhdGlvbgorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgVHVlIERlYyAgOSAyMToxODozOCAxOTk3CisgKiBNb2RpZmllZCBhdDogICBTdW4gT2N0IDI3IDIyOjEzOjMwIDIwMDIKKyAqIE1vZGlmaWVkIGJ5OiAgIE1hcnRpbiBEaWVobCA8bWFkQG1kaWVobC5kZT4KKyAqIFNvdXJjZXM6ICAgICAgIHNsaXAuYyBieSBMYXVyZW5jZSBDdWxoYW5lLCAgIDxsb3pAaG9sbWVzLmRlbW9uLmNvLnVrPgorICogICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1d2FsdC5ubC5tdWduZXQub3JnPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgRGFnIEJyYXR0bGksCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAyIE1hcnRpbiBEaWVobCwKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisjaW5jbHVkZSAiaXJ0dHktc2lyLmgiCisKK3N0YXRpYyBpbnQgcW9zX210dF9iaXRzID0gMHgwMzsgICAgICAvKiA1IG1zIG9yIG1vcmUgKi8KKworbW9kdWxlX3BhcmFtKHFvc19tdHRfYml0cywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocW9zX210dF9iaXRzLCAiTWluaW11bSBUdXJuIFRpbWUiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBkZXZpY2UgY29uZmlndXJhdGlvbiBjYWxsYmFja3MgYWx3YXlzIGludm9rZWQgd2l0aCBpcmRhLXRocmVhZCBjb250ZXh0ICovCisKKy8qIGZpbmQgb3V0LCBob3cgbWFueSBjaGFycyB3ZSBoYXZlIGluIGJ1ZmZlcnMgYmVsb3cgdXMKKyAqIHRoaXMgaXMgYWxsb3dlZCB0byBsaWUsIGkuZS4gcmV0dXJuIGxlc3MgY2hhcnMgdGhhbiB3ZQorICogYWN0dWFsbHkgaGF2ZS4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCisgKiBob3cgbG9uZyB0aGUgaXJkYXRocmVhZCBzaG91bGQgd2FpdCBiZWZvcmUgZG9pbmcgdGhlCisgKiByZWFsIGJsb2NraW5nIHdhaXRfdW50aWxfc2VudCgpCisgKi8KKworc3RhdGljIGludCBpcnR0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2ID0gZGV2LT5wcml2OworCisJSVJEQV9BU1NFUlQocHJpdiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChwcml2LT5tYWdpYyA9PSBJUlRUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlyZXR1cm4gcHJpdi0+dHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlcihwcml2LT50dHkpOworfQorCisvKiBXYWl0IChzbGVlcCkgdW50aWwgdW5kZXJsYXlpbmcgaGFyZHdhcmUgZmluaXNoZWQgdHJhbnNtaXNzaW9uCisgKiBpLmUuIGhhcmR3YXJlIGJ1ZmZlcnMgYXJlIGRyYWluZWQKKyAqIHRoaXMgbXVzdCBibG9jayBhbmQgbm90IHJldHVybiBiZWZvcmUgYWxsIGNoYXJhY3RlcnMgYXJlIHJlYWxseSBzZW50CisgKgorICogSWYgdGhlIHR0eSBzaXRzIG9uIHRvcCBvZiBhIDE2NTUwQS1saWtlIHVhcnQsIHRoZXJlIGFyZSB0eXBpY2FsbHkKKyAqIHVwIHRvIDE2IGJ5dGVzIGluIHRoZSBmaWZvIC0gZi5lLiA5NjAwIGJwcyA4TjEgbmVlZHMgMTYuNyBtc2VjCisgKgorICogV2l0aCB1c2JzZXJpYWwgdGhlIHVhcnQtZmlmbyBpcyBiYXNpY2FsbHkgcmVwbGFjZWQgYnkgdGhlIGNvbnZlcnRlcidzCisgKiBvdXRnb2luZyBlbmRwb2ludCBidWZmZXIsIHdoaWNoIGNhbiB1c3VhbGx5IGhvbGQgNjQgYnl0ZXMgKGF0IGxlYXN0KS4KKyAqIFdpdGggcGwyMzAzIGl0IGFwcGVhcnMgd2UgYXJlIHNhZmUgd2l0aCA2MG1zZWMgaGVyZS4KKyAqCisgKiBJIHJlYWxseSB3aXNoIGFsbCBzZXJpYWwgZHJpdmVycyB3b3VsZCBwcm92aWRlCisgKiBjb3JyZWN0IGltcGxlbWVudGF0aW9uIG9mIHdhaXRfdW50aWxfc2VudCgpCisgKi8KKworI2RlZmluZSBVU0JTRVJJQUxfVFhfRE9ORV9ERUxBWQk2MAorCitzdGF0aWMgdm9pZCBpcnR0eV93YWl0X3VudGlsX3NlbnQoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwlJUkRBX0FTU0VSVChwcml2ICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDLCByZXR1cm47KTsKKworCXR0eSA9IHByaXYtPnR0eTsKKwlpZiAodHR5LT5kcml2ZXItPndhaXRfdW50aWxfc2VudCkgeworCQlsb2NrX2tlcm5lbCgpOworCQl0dHktPmRyaXZlci0+d2FpdF91bnRpbF9zZW50KHR0eSwgbXNlY3NfdG9famlmZmllcygxMDApKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0KKwllbHNlIHsKKwkJbXNsZWVwKFVTQlNFUklBTF9UWF9ET05FX0RFTEFZKTsKKwl9Cit9CisKKy8qIAorICogIEZ1bmN0aW9uIGlydHR5X2NoYW5nZV9zcGVlZCAoZGV2LCBzcGVlZCkKKyAqCisgKiAgICBDaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBzZXJpYWwgcG9ydC4KKyAqCisgKiBUaGlzIG1heSBzbGVlcCBpbiBzZXRfdGVybWlvcyAodXNic2VyaWFsIGRyaXZlciBmLmUuKSBhbmQgbXVzdAorICogbm90IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdC90aW1lci90YXNrbGV0IHRoZXJlZm9yZS4KKyAqIEFsbCBzdWNoIGludm9jYXRpb25zIGFyZSBkZWZlcnJlZCB0byBrSXJEQWQgbm93IHNvIHdlIGNhbiBzbGVlcCB0aGVyZS4KKyAqLworCitzdGF0aWMgaW50IGlydHR5X2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCB1bnNpZ25lZCBzcGVlZCkKK3sKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisgICAgICAgIHN0cnVjdCB0ZXJtaW9zIG9sZF90ZXJtaW9zOworCWludCBjZmxhZzsKKworCUlSREFfQVNTRVJUKHByaXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQocHJpdi0+bWFnaWMgPT0gSVJUVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJdHR5ID0gcHJpdi0+dHR5OworCisJbG9ja19rZXJuZWwoKTsKKwlvbGRfdGVybWlvcyA9ICoodHR5LT50ZXJtaW9zKTsKKwljZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKworCWNmbGFnICY9IH5DQkFVRDsKKworCUlSREFfREVCVUcoMiwgIiVzKCksIFNldHRpbmcgc3BlZWQgdG8gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3BlZWQpOworCisJc3dpdGNoIChzcGVlZCkgeworCWNhc2UgMTIwMDoKKwkJY2ZsYWcgfD0gQjEyMDA7CisJCWJyZWFrOworCWNhc2UgMjQwMDoKKwkJY2ZsYWcgfD0gQjI0MDA7CisJCWJyZWFrOworCWNhc2UgNDgwMDoKKwkJY2ZsYWcgfD0gQjQ4MDA7CisJCWJyZWFrOworCWNhc2UgMTkyMDA6CisJCWNmbGFnIHw9IEIxOTIwMDsKKwkJYnJlYWs7CisJY2FzZSAzODQwMDoKKwkJY2ZsYWcgfD0gQjM4NDAwOworCQlicmVhazsKKwljYXNlIDU3NjAwOgorCQljZmxhZyB8PSBCNTc2MDA7CisJCWJyZWFrOworCWNhc2UgMTE1MjAwOgorCQljZmxhZyB8PSBCMTE1MjAwOworCQlicmVhazsKKwljYXNlIDk2MDA6CisJZGVmYXVsdDoKKwkJY2ZsYWcgfD0gQjk2MDA7CisJCWJyZWFrOworCX0JCisKKwl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSBjZmxhZzsKKwlpZiAodHR5LT5kcml2ZXItPnNldF90ZXJtaW9zKQorCQl0dHktPmRyaXZlci0+c2V0X3Rlcm1pb3ModHR5LCAmb2xkX3Rlcm1pb3MpOworCXVubG9ja19rZXJuZWwoKTsKKworCXByaXYtPmlvLnNwZWVkID0gc3BlZWQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlydHR5X3NldF9kdHJfcnRzIChkZXYsIGR0ciwgcnRzKQorICoKKyAqICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkgZG9uZ2xlcyBldGMuIHRvIHNldCBvciByZXNldCB0aGUgc3RhdHVzCisgKiAgICBvZiB0aGUgZHRyIGFuZCBydHMgbGluZXMKKyAqLworCitzdGF0aWMgaW50IGlydHR5X3NldF9kdHJfcnRzKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGludCBkdHIsIGludCBydHMpCit7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdiA9IGRldi0+cHJpdjsKKwlpbnQgc2V0ID0gMDsKKwlpbnQgY2xlYXIgPSAwOworCisJSVJEQV9BU1NFUlQocHJpdiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChwcml2LT5tYWdpYyA9PSBJUlRUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwlpZiAocnRzKQorCQlzZXQgfD0gVElPQ01fUlRTOworCWVsc2UKKwkJY2xlYXIgfD0gVElPQ01fUlRTOworCWlmIChkdHIpCisJCXNldCB8PSBUSU9DTV9EVFI7CisJZWxzZQorCQljbGVhciB8PSBUSU9DTV9EVFI7CisKKwkvKgorCSAqIFdlIGNhbid0IHVzZSBpb2N0bCgpIGJlY2F1c2UgaXQgZXhwZWN0cyBhIG5vbi1udWxsIGZpbGUgc3RydWN0dXJlLAorCSAqIGFuZCB3ZSBkb24ndCBoYXZlIHRoYXQgaGVyZS4KKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB5ZXQgZGVmaW5lZCBmb3IgYWxsIHR0eSBkcml2ZXIsIHNvCisJICogbGV0J3MgYmUgY2FyZWZ1bC4uLiBKZWFuIElJCisJICovCisJSVJEQV9BU1NFUlQocHJpdi0+dHR5LT5kcml2ZXItPnRpb2Ntc2V0ICE9IE5VTEwsIHJldHVybiAtMTspOworCXByaXYtPnR0eS0+ZHJpdmVyLT50aW9jbXNldChwcml2LT50dHksIE5VTEwsIHNldCwgY2xlYXIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogY2FsbGVkIGZyb20gc2lyX2RldiB3aGVuIHRoZXJlIGlzIG1vcmUgZGF0YSB0byBzZW5kCisgKiBjb250ZXh0IGlzIGVpdGhlciBuZXRkZXYtPmhhcmRfeG1pdCBvciBzb21lIHRyYW5zbWl0LWNvbXBsZXRpb24gYmgKKyAqIGkuZS4gd2UgYXJlIHVuZGVyIHNwaW5sb2NrIGhlcmUgYW5kIG11c3Qgbm90IHNsZWVwLgorICovCisKK3N0YXRpYyBpbnQgaXJ0dHlfZG9fd3JpdGUoc3RydWN0IHNpcl9kZXYgKmRldiwgY29uc3QgdW5zaWduZWQgY2hhciAqcHRyLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzaXJ0dHlfY2IgKnByaXYgPSBkZXYtPnByaXY7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgd3JpdGVsZW47CisKKwlJUkRBX0FTU0VSVChwcml2ICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKworCXR0eSA9IHByaXYtPnR0eTsKKwlpZiAoIXR0eS0+ZHJpdmVyLT53cml0ZSkKKwkJcmV0dXJuIDA7CisJdHR5LT5mbGFncyB8PSAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwlpZiAodHR5LT5kcml2ZXItPndyaXRlX3Jvb20pIHsKKwkJd3JpdGVsZW4gPSB0dHktPmRyaXZlci0+d3JpdGVfcm9vbSh0dHkpOworCQlpZiAod3JpdGVsZW4gPiBsZW4pCisJCQl3cml0ZWxlbiA9IGxlbjsKKwl9CisJZWxzZQorCQl3cml0ZWxlbiA9IGxlbjsKKwlyZXR1cm4gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgcHRyLCB3cml0ZWxlbik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogaXJkYSBsaW5lIGRpc2NpcGxpbmUgY2FsbGJhY2tzICovCisKKy8qIAorICogIEZ1bmN0aW9uIGlydHR5X3JlY2VpdmVfYnVmKCB0dHksIGNwLCBjb3VudCkKKyAqCisgKiAgICBIYW5kbGUgdGhlICdyZWNlaXZlciBkYXRhIHJlYWR5JyBpbnRlcnJ1cHQuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogICAgYnkgdGhlICd0dHlfaW8nIG1vZHVsZSBpbiB0aGUga2VybmVsIHdoZW4gYSBibG9jayBvZiBJckRBIGRhdGEgaGFzCisgKiAgICBiZWVuIHJlY2VpdmVkLCB3aGljaCBjYW4gbm93IGJlIGRlY2Fwc3VsYXRlZCBhbmQgZGVsaXZlcmVkIGZvcgorICogICAgZnVydGhlciBwcm9jZXNzaW5nIAorICoKKyAqIGNhbGxpbmcgY29udGV4dCBkZXBlbmRzIG9uIHVuZGVybHlpbmcgZHJpdmVyIGFuZCB0dHktPmxvd19sYXRlbmN5IQorICogZm9yIGV4YW1wbGUgKGxvd19sYXRlbmN5OiAxIC8gMCk6CisgKiBzZXJpYWwuYzoJdWFydC1pbnRlcnJ1cHQgLyBzb2Z0aW50CisgKiB1c2JzZXJpYWw6CXVyYi1jb21wbGV0ZS1pbnRlcnJ1cHQgLyBzb2Z0aW50CisgKi8KKworc3RhdGljIHZvaWQgaXJ0dHlfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisJCQkgICAgICBjaGFyICpmcCwgaW50IGNvdW50KSAKK3sKKwlzdHJ1Y3Qgc2lyX2RldiAqZGV2OworCXN0cnVjdCBzaXJ0dHlfY2IgKnByaXYgPSB0dHktPmRpc2NfZGF0YTsKKwlpbnQJaTsKKworCUlSREFfQVNTRVJUKHByaXYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQocHJpdi0+bWFnaWMgPT0gSVJUVFlfTUFHSUMsIHJldHVybjspOworCisJaWYgKHVubGlrZWx5KGNvdW50PT0wKSkJCS8qIHllcywgdGhpcyBoYXBwZW5zICovCisJCXJldHVybjsKKworCWRldiA9IHByaXYtPmRldjsKKwlpZiAoIWRldikgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIG5vdCByZWFkeSB5ZXQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJLyogCisJCSAqICBDaGFyYWN0ZXJzIHJlY2VpdmVkIHdpdGggYSBwYXJpdHkgZXJyb3IsIGV0Yz8KKwkJICovCisgCQlpZiAoZnAgJiYgKmZwKyspIHsgCisJCQlJUkRBX0RFQlVHKDAsICJGcmFtaW5nIG9yIHBhcml0eSBlcnJvciFcbiIpOworCQkJc2lyZGV2X3JlY2VpdmUoZGV2LCBOVUxMLCAwKTsJLyogbm90aWZ5IHNpcl9kZXYgKHVwZGF0aW5nIHN0YXRzKSAqLworCQkJcmV0dXJuOworIAkJfQorCX0KKworCXNpcmRldl9yZWNlaXZlKGRldiwgY3AsIGNvdW50KTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlydHR5X3JlY2VpdmVfcm9vbSAodHR5KQorICoKKyAqICAgIFVzZWQgYnkgdGhlIFRUWSB0byBmaW5kIG91dCBob3cgbXVjaCBkYXRhIHdlIGNhbiByZWNlaXZlIGF0IGEgdGltZQorICogCisqLworc3RhdGljIGludCBpcnR0eV9yZWNlaXZlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkgCit7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdiA9IHR0eS0+ZGlzY19kYXRhOworCisJSVJEQV9BU1NFUlQocHJpdiAhPSBOVUxMLCByZXR1cm4gMDspOworCUlSREFfQVNTRVJUKHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDLCByZXR1cm4gMDspOworCisJcmV0dXJuIDY1NTM2OyAgLyogV2UgY2FuIGhhbmRsZSBhbiBpbmZpbml0ZSBhbW91bnQgb2YgZGF0YS4gOi0pICovCit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0eV93cml0ZV93YWtldXAgKHR0eSkKKyAqCisgKiAgICBDYWxsZWQgYnkgdGhlIGRyaXZlciB3aGVuIHRoZXJlJ3Mgcm9vbSBmb3IgbW9yZSBkYXRhLiAgSWYgd2UgaGF2ZQorICogICAgbW9yZSBwYWNrZXRzIHRvIHNlbmQsIHdlIHNlbmQgdGhlbSBoZXJlLgorICoKKyAqLworc3RhdGljIHZvaWQgaXJ0dHlfd3JpdGVfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpIAoreworCXN0cnVjdCBzaXJ0dHlfY2IgKnByaXYgPSB0dHktPmRpc2NfZGF0YTsKKworCUlSREFfQVNTRVJUKHByaXYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQocHJpdi0+bWFnaWMgPT0gSVJUVFlfTUFHSUMsIHJldHVybjspOworCisJdHR5LT5mbGFncyAmPSB+KDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisKKwlpZiAocHJpdi0+ZGV2KQorCQlzaXJkZXZfd3JpdGVfY29tcGxldGUocHJpdi0+ZGV2KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogRnVuY3Rpb24gaXJ0dHlfc3RvcF9yZWNlaXZlciAodHR5LCBzdG9wKQorICoKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgaXJ0dHlfc3RvcF9yZWNlaXZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgc3RvcCkKK3sKKwlzdHJ1Y3QgdGVybWlvcyBvbGRfdGVybWlvczsKKwlpbnQgY2ZsYWc7CisKKwlsb2NrX2tlcm5lbCgpOworCW9sZF90ZXJtaW9zID0gKih0dHktPnRlcm1pb3MpOworCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCQorCWlmIChzdG9wKQorCQljZmxhZyAmPSB+Q1JFQUQ7CisJZWxzZQorCQljZmxhZyB8PSBDUkVBRDsKKworCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9IGNmbGFnOworCWlmICh0dHktPmRyaXZlci0+c2V0X3Rlcm1pb3MpCisJCXR0eS0+ZHJpdmVyLT5zZXRfdGVybWlvcyh0dHksICZvbGRfdGVybWlvcyk7CisJdW5sb2NrX2tlcm5lbCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHNlcmlhbGl6ZSBsZGlzYyBvcGVuL2Nsb3NlIHdpdGggc2lyX2RldiAqLworc3RhdGljIERFQ0xBUkVfTVVURVgoaXJ0dHlfc2VtKTsKKworLyogbm90aWZpZXIgZnJvbSBzaXJfZGV2IHdoZW4gaXJkYSUgZGV2aWNlIGdldHMgb3BlbmVkIChpZnVwKSAqLworCitzdGF0aWMgaW50IGlydHR5X3N0YXJ0X2RldihzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCXN0cnVjdCBzaXJ0dHlfY2IgKnByaXY7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKworCS8qIHNlcmlhbGl6ZSB3aXRoIGxkaXNjIG9wZW4vY2xvc2UgKi8KKwlkb3duKCZpcnR0eV9zZW0pOworCisJcHJpdiA9IGRldi0+cHJpdjsKKwlpZiAodW5saWtlbHkoIXByaXYgfHwgcHJpdi0+bWFnaWMhPUlSVFRZX01BR0lDKSkgeworCQl1cCgmaXJ0dHlfc2VtKTsKKwkJcmV0dXJuIC1FU1RBTEU7CisJfQorCisJdHR5ID0gcHJpdi0+dHR5OworCisJaWYgKHR0eS0+ZHJpdmVyLT5zdGFydCkKKwkJdHR5LT5kcml2ZXItPnN0YXJ0KHR0eSk7CisJLyogTWFrZSBzdXJlIHdlIGNhbiByZWNlaXZlIG1vcmUgZGF0YSAqLworCWlydHR5X3N0b3BfcmVjZWl2ZXIodHR5LCBGQUxTRSk7CisKKwl1cCgmaXJ0dHlfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworLyogbm90aWZpZXIgZnJvbSBzaXJfZGV2IHdoZW4gaXJkYSUgZGV2aWNlIGdldHMgY2xvc2VkIChpZmRvd24pICovCisKK3N0YXRpYyBpbnQgaXJ0dHlfc3RvcF9kZXYoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwkvKiBzZXJpYWxpemUgd2l0aCBsZGlzYyBvcGVuL2Nsb3NlICovCisJZG93bigmaXJ0dHlfc2VtKTsKKworCXByaXYgPSBkZXYtPnByaXY7CisJaWYgKHVubGlrZWx5KCFwcml2IHx8IHByaXYtPm1hZ2ljIT1JUlRUWV9NQUdJQykpIHsKKwkJdXAoJmlydHR5X3NlbSk7CisJCXJldHVybiAtRVNUQUxFOworCX0KKworCXR0eSA9IHByaXYtPnR0eTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCByZWNlaXZlIG1vcmUgZGF0YSAqLworCWlydHR5X3N0b3BfcmVjZWl2ZXIodHR5LCBUUlVFKTsKKwlpZiAodHR5LT5kcml2ZXItPnN0b3ApCisJCXR0eS0+ZHJpdmVyLT5zdG9wKHR0eSk7CisKKwl1cCgmaXJ0dHlfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2lyX2RyaXZlciBzaXJfdHR5X2RydiA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZQkJPSAic2lyX3R0eSIsCisJLnN0YXJ0X2RldgkJPSBpcnR0eV9zdGFydF9kZXYsCisJLnN0b3BfZGV2CQk9IGlydHR5X3N0b3BfZGV2LAorCS5kb193cml0ZQkJPSBpcnR0eV9kb193cml0ZSwKKwkuY2hhcnNfaW5fYnVmZmVyCT0gaXJ0dHlfY2hhcnNfaW5fYnVmZmVyLAorCS53YWl0X3VudGlsX3NlbnQJPSBpcnR0eV93YWl0X3VudGlsX3NlbnQsCisJLnNldF9zcGVlZAkJPSBpcnR0eV9jaGFuZ2Vfc3BlZWQsCisJLnNldF9kdHJfcnRzCQk9IGlydHR5X3NldF9kdHJfcnRzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogRnVuY3Rpb24gaXJ0dHlfaW9jdGwgKHR0eSwgZmlsZSwgY21kLCBhcmcpCisgKgorICogICAgIFRoZSBTd2lzcyBhcm15IGtuaWZlIG9mIHN5c3RlbSBjYWxscyA6LSkKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJ0dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpcnR0eV9pbmZvIHsgY2hhciBuYW1lWzZdOyB9IGluZm87CisJc3RydWN0IHNpcl9kZXYgKmRldjsKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2ID0gdHR5LT5kaXNjX2RhdGE7CisJaW50IGVyciA9IDA7CisKKwlJUkRBX0FTU0VSVChwcml2ICE9IE5VTEwsIHJldHVybiAtRU5PREVWOyk7CisJSVJEQV9BU1NFUlQocHJpdi0+bWFnaWMgPT0gSVJUVFlfTUFHSUMsIHJldHVybiAtRUJBRFI7KTsKKworCUlSREFfREVCVUcoMywgIiVzKGNtZD0weCVYKVxuIiwgX19GVU5DVElPTl9fLCBjbWQpOworCisJZGV2ID0gcHJpdi0+ZGV2OworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUQ0dFVFM6CisJY2FzZSBUQ0dFVEE6CisJCWVyciA9IG5fdHR5X2lvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKworCWNhc2UgSVJUVFlfSU9DVERPTkdMRToKKwkJLyogdGhpcyBjYWxsIGJsb2NrcyBmb3IgY29tcGxldGlvbiAqLworCQllcnIgPSBzaXJkZXZfc2V0X2RvbmdsZShkZXYsIChJUkRBX0RPTkdMRSkgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIElSVFRZX0lPQ0dFVDoKKwkJSVJEQV9BU1NFUlQoZGV2LT5uZXRkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOyAKKwkJc3RybmNweShpbmZvLm5hbWUsIGRldi0+bmV0ZGV2LT5uYW1lLCBzaXplb2YoaW5mby5uYW1lKS0xKTsKKworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQllcnIgPSAtRUZBVUxUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfQorCisKKy8qIAorICogIEZ1bmN0aW9uIGlydHR5X29wZW4odHR5KQorICoKKyAqICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBUVFkgbW9kdWxlIHdoZW4gdGhlIElyREEgbGluZQorICogICAgZGlzY2lwbGluZSBpcyBjYWxsZWQgZm9yLiAgQmVjYXVzZSB3ZSBhcmUgc3VyZSB0aGUgdHR5IGxpbmUgZXhpc3RzLAorICogICAgd2Ugb25seSBoYXZlIHRvIGxpbmsgaXQgdG8gYSBmcmVlIElyREEgY2hhbm5lbC4gIAorICovCitzdGF0aWMgaW50IGlydHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkgCit7CisJc3RydWN0IHNpcl9kZXYgKmRldjsKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2OworCWludCByZXQgPSAwOworCisJLyogTW9kdWxlIHN0dWZmIGhhbmRsZWQgdmlhIGlyZGFfbGRpc2Mub3duZXIgLSBKZWFuIElJICovCisKKwkvKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgbm90IGFscmVhZHkgY29ubmVjdGVkLiAqLworCWlmICh0dHktPmRpc2NfZGF0YSAhPSBOVUxMKSB7CisJCXByaXYgPSB0dHktPmRpc2NfZGF0YTsKKwkJaWYgKHByaXYgJiYgcHJpdi0+bWFnaWMgPT0gSVJUVFlfTUFHSUMpIHsKKwkJCXJldCA9IC1FRVhJU1Q7CisJCQlnb3RvIG91dDsKKwkJfQorCQl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CQkvKiAjIyMgKi8KKwl9CisKKwkvKiBzdG9wIHRoZSB1bmRlcmx5aW5nICBkcml2ZXIgKi8KKwlpcnR0eV9zdG9wX3JlY2VpdmVyKHR0eSwgVFJVRSk7CisJaWYgKHR0eS0+ZHJpdmVyLT5zdG9wKQorCQl0dHktPmRyaXZlci0+c3RvcCh0dHkpOworCisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwkKKwkvKiBhcHBseSBtdHQgb3ZlcnJpZGUgKi8KKwlzaXJfdHR5X2Rydi5xb3NfbXR0X2JpdHMgPSBxb3NfbXR0X2JpdHM7CisKKwkvKiBnZXQgYSBzaXIgZGV2aWNlIGluc3RhbmNlIGZvciB0aGlzIGRyaXZlciAqLworCWRldiA9IHNpcmRldl9nZXRfaW5zdGFuY2UoJnNpcl90dHlfZHJ2LCB0dHktPm5hbWUpOworCWlmICghZGV2KSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGFsbG9jYXRlIHByaXZhdGUgZGV2aWNlIGluZm8gYmxvY2sgKi8KKwlwcml2ID0ga21hbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCWdvdG8gb3V0X3B1dDsKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CisKKwlwcml2LT5tYWdpYyA9IElSVFRZX01BR0lDOworCXByaXYtPnR0eSA9IHR0eTsKKwlwcml2LT5kZXYgPSBkZXY7CisKKwkvKiBzZXJpYWxpemUgd2l0aCBzdGFydF9kZXYgLSBpbiBjYXNlIHdlIHdlcmUgcmFjaW5nIHdpdGggaWZ1cCAqLworCWRvd24oJmlydHR5X3NlbSk7CisKKwlkZXYtPnByaXYgPSBwcml2OworCXR0eS0+ZGlzY19kYXRhID0gcHJpdjsKKworCXVwKCZpcnR0eV9zZW0pOworCisJSVJEQV9ERUJVRygwLCAiJXMgLSAlczogaXJkYSBsaW5lIGRpc2NpcGxpbmUgb3BlbmVkXG4iLCBfX0ZVTkNUSU9OX18sIHR0eS0+bmFtZSk7CisKKwlyZXR1cm4gMDsKKworb3V0X3B1dDoKKwlzaXJkZXZfcHV0X2luc3RhbmNlKGRldik7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogCisgKiAgRnVuY3Rpb24gaXJ0dHlfY2xvc2UgKHR0eSkKKyAqCisgKiAgICBDbG9zZSBkb3duIGEgSXJEQSBjaGFubmVsLiBUaGlzIG1lYW5zIGZsdXNoaW5nIG91dCBhbnkgcGVuZGluZyBxdWV1ZXMsCisgKiAgICBhbmQgdGhlbiByZXN0b3JpbmcgdGhlIFRUWSBsaW5lIGRpc2NpcGxpbmUgdG8gd2hhdCBpdCB3YXMgYmVmb3JlIGl0IGdvdAorICogICAgaG9va2VkIHRvIElyREEgKHdoaWNoIHVzdWFsbHkgaXMgVFRZIGFnYWluKS4gIAorICovCitzdGF0aWMgdm9pZCBpcnR0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKK3sKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2ID0gdHR5LT5kaXNjX2RhdGE7CisKKwlJUkRBX0FTU0VSVChwcml2ICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDLCByZXR1cm47KTsKKworCS8qIEhtLCB3aXRoIGEgZG9uZ2xlIGF0dGFjaGVkIHRoZSBkb25nbGUgZHJpdmVyIHdhbnRzCisJICogdG8gY2xvc2UgdGhlIGRvbmdsZSAtIHdoaWNoIHJlcXVpcmVzIHRoZSB1c2Ugb2YKKwkgKiBzb21lIHR0eSB3cml0ZSBhbmQvb3IgdGVybWlvcyBvciBpb2N0bCBvcGVyYXRpb25zLgorCSAqIEFyZSB3ZSBhbGxvd2VkIHRvIGNhbGwgdGhvc2Ugd2hlbiBhbHJlYWR5IHJlcXVlc3RlZAorCSAqIHRvIHNodXRkb3duIHRoZSBsZGlzYz8KKwkgKiBJZiBub3QsIHdlIHNob3VsZCBzb21laG93IG1hcmsgdGhlIGRldiBiZWluZyBzdGFsZWQuCisJICogUXVlc3Rpb24gcmVtYWlucywgaG93IHRvIGNsb3NlIHRoZSBkb25nbGUgaW4gdGhpcyBjYXNlLi4uCisJICogRm9yIG5vdyBsZXQncyBhc3N1bWUgd2UgYXJlIGdyYW50ZWQgdG8gaXNzdWUgdHR5IGRyaXZlciBjYWxscworCSAqIHVudGlsIHdlIHJldHVybiBoZXJlIGZyb20gdGhlIGxkaXNjIGNsb3NlLiBJJ20ganVzdCB3b25kZXJpbmcKKwkgKiBob3cgdGhpcyBiZWhhdmVzIHdpdGggaG90cGx1Z2dhYmxlIHNlcmlhbCBoYXJkd2FyZSBsaWtlCisJICogcnMyMzItcGNtY2lhIGNhcmQgb3IgdXNiLXNlcmlhbC4uLgorCSAqCisJICogcHJpdi0+dHR5ID0gTlVMTD87CisJICovCisKKwkvKiB3ZSBhcmUgZGVhZCBub3cgKi8KKwl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CisKKwlzaXJkZXZfcHV0X2luc3RhbmNlKHByaXYtPmRldik7CisKKwkvKiBTdG9wIHR0eSAqLworCWlydHR5X3N0b3BfcmVjZWl2ZXIodHR5LCBUUlVFKTsKKwl0dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwlpZiAodHR5LT5kcml2ZXItPnN0b3ApCisJCXR0eS0+ZHJpdmVyLT5zdG9wKHR0eSk7CisKKwlrZnJlZShwcml2KTsKKworCUlSREFfREVCVUcoMCwgIiVzIC0gJXM6IGlyZGEgbGluZSBkaXNjaXBsaW5lIGNsb3NlZFxuIiwgX19GVU5DVElPTl9fLCB0dHktPm5hbWUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2xkaXNjIGlyZGFfbGRpc2MgPSB7CisJLm1hZ2ljCQk9IFRUWV9MRElTQ19NQUdJQywKKyAJLm5hbWUJCT0gImlyZGEiLAorCS5mbGFncwkJPSAwLAorCS5vcGVuCQk9IGlydHR5X29wZW4sCisJLmNsb3NlCQk9IGlydHR5X2Nsb3NlLAorCS5yZWFkCQk9IE5VTEwsCisJLndyaXRlCQk9IE5VTEwsCisJLmlvY3RsCQk9IGlydHR5X2lvY3RsLAorIAkucG9sbAkJPSBOVUxMLAorCS5yZWNlaXZlX2J1Zgk9IGlydHR5X3JlY2VpdmVfYnVmLAorCS5yZWNlaXZlX3Jvb20JPSBpcnR0eV9yZWNlaXZlX3Jvb20sCisJLndyaXRlX3dha2V1cAk9IGlydHR5X3dyaXRlX3dha2V1cCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19pbml0IGlydHR5X3Npcl9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fSVJEQSwgJmlyZGFfbGRpc2MpKSAhPSAwKQorCQlJUkRBX0VSUk9SKCJJckRBOiBjYW4ndCByZWdpc3RlciBsaW5lIGRpc2NpcGxpbmUgKGVyciA9ICVkKVxuIiwKKwkJCSAgIGVycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlydHR5X3Npcl9jbGVhbnVwKHZvaWQpIAoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHR0eV9yZWdpc3Rlcl9sZGlzYyhOX0lSREEsIE5VTEwpKSkgeworCQlJUkRBX0VSUk9SKCIlcygpLCBjYW4ndCB1bnJlZ2lzdGVyIGxpbmUgZGlzY2lwbGluZSAoZXJyID0gJWQpXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBlcnIpOworCX0KK30KKworbW9kdWxlX2luaXQoaXJ0dHlfc2lyX2luaXQpOworbW9kdWxlX2V4aXQoaXJ0dHlfc2lyX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklyREEgVFRZIGRldmljZSBkcml2ZXIiKTsKK01PRFVMRV9BTElBU19MRElTQyhOX0lSREEpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2lydHR5LXNpci5oIGIvZHJpdmVycy9uZXQvaXJkYS9pcnR0eS1zaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTMyZDhmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcnR0eS1zaXIuaApAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJc2lyX3R0eS5oOglkZWZpbml0aW9ucyBmb3IgdGhlIGlydHR5X3NpciBjbGllbnQgZHJpdmVyIChmb3JtZXIgaXJ0dHkpCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAyIE1hcnRpbiBEaWVobAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqCXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICoJdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIElSVFRZU0lSX0gKKyNkZWZpbmUgSVJUVFlTSVJfSAorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CQkvLyBjaGlwaW9fdAorCisjZGVmaW5lIElSVFRZX0lPQ19NQUdJQyAnZScKKyNkZWZpbmUgSVJUVFlfSU9DVERPTkdMRSAgX0lPKElSVFRZX0lPQ19NQUdJQywgMSkKKyNkZWZpbmUgSVJUVFlfSU9DR0VUICAgICBfSU9SKElSVFRZX0lPQ19NQUdJQywgMiwgc3RydWN0IGlydHR5X2luZm8pCisjZGVmaW5lIElSVFRZX0lPQ19NQVhOUiAgIDIKKworc3RydWN0IHNpcnR0eV9jYiB7CisJbWFnaWNfdCBtYWdpYzsKKworCXN0cnVjdCBzaXJfZGV2ICpkZXY7CisJc3RydWN0IHR0eV9zdHJ1Y3QgICp0dHk7CisKKwljaGlwaW9fdCBpbzsgICAgICAgICAgICAgICAvKiBJckRBIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9saXRlbGluay1zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvbGl0ZWxpbmstc2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyNjFjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbGl0ZWxpbmstc2lyLmMKQEAgLTAsMCArMSwyMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgbGl0ZWxpbmsuYworICogVmVyc2lvbjogICAgICAgMS4xCisgKiBEZXNjcmlwdGlvbjogICBEcml2ZXIgZm9yIHRoZSBQYXJhbGxheCBMaXRlTGluayBkb25nbGUKKyAqIFN0YXR1czogICAgICAgIFN0YWJsZQorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgRnJpIE1heSAgNyAxMjo1MDozMyAxOTk5CisgKiBNb2RpZmllZCBhdDogICBGcmkgRGVjIDE3IDA5OjE0OjIzIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE1vZGlmaWVkIGF0OiAgIFRodSBKYW4gMTUgMjAwMworICogTW9kaWZpZWQgYnk6ICAgRXVnZW5lIENyb3NzZXIgPGNyb3NzZXJAYXZlcmFnZS5vcmc+CisgKgorICogQ29udmVydCB0byAibmV3IiBJUkRBIGluZnJhc3RydWN0dXJlIGZvciBrZXJuZWwgMi42CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorCisjaW5jbHVkZSAic2lyLWRldi5oIgorCisjZGVmaW5lIE1JTl9ERUxBWSAyNSAgICAgIC8qIDE1IHVzLCBidXQgd2FpdCBhIGxpdHRsZSBtb3JlIHRvIGJlIHN1cmUgKi8KKyNkZWZpbmUgTUFYX0RFTEFZIDEwMDAwICAgLyogMSBtcyAqLworCitzdGF0aWMgaW50IGxpdGVsaW5rX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldik7CitzdGF0aWMgaW50IGxpdGVsaW5rX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBsaXRlbGlua19jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpOworc3RhdGljIGludCBsaXRlbGlua19yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKKworLyogVGhlc2UgYXJlIHRoZSBiYXVkcmF0ZXMgc3VwcG9ydGVkIC0gOTYwMCBtdXN0IGJlIGxhc3Qgb25lISAqLworc3RhdGljIHVuc2lnbmVkIGJhdWRfcmF0ZXNbXSA9IHsgMTE1MjAwLCA1NzYwMCwgMzg0MDAsIDE5MjAwLCA5NjAwIH07CisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX2RyaXZlciBsaXRlbGluayA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCT0gIlBhcmFsbGF4IExpdGVMaW5rIiwKKwkudHlwZQkJPSBJUkRBX0xJVEVMSU5LX0RPTkdMRSwKKwkub3BlbgkJPSBsaXRlbGlua19vcGVuLAorCS5jbG9zZQkJPSBsaXRlbGlua19jbG9zZSwKKwkucmVzZXQJCT0gbGl0ZWxpbmtfcmVzZXQsCisJLnNldF9zcGVlZAk9IGxpdGVsaW5rX2NoYW5nZV9zcGVlZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGxpdGVsaW5rX3Npcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKCZsaXRlbGluayk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsaXRlbGlua19zaXJfY2xlYW51cCh2b2lkKQoreworCWlyZGFfdW5yZWdpc3Rlcl9kb25nbGUoJmxpdGVsaW5rKTsKK30KKworc3RhdGljIGludCBsaXRlbGlua19vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHFvc19pbmZvICpxb3MgPSAmZGV2LT5xb3M7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUG93ZXIgdXAgZG9uZ2xlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisKKwkvKiBTZXQgdGhlIHNwZWVkcyB3ZSBjYW4gYWNjZXB0ICovCisJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl8xMTUyMDB8SVJfNTc2MDB8SVJfMzg0MDB8SVJfMTkyMDB8SVJfOTYwMDsKKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4N2Y7IC8qIE5lZWRzIDAuMDEgbXMgKi8KKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7CisKKwkvKiBpcmRhIHRocmVhZCB3YWl0cyA1MCBtc2VjIGZvciBwb3dlciBzZXR0bGluZyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGl0ZWxpbmtfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGxpdGVsaW5rX2NoYW5nZV9zcGVlZCAodGFzaykKKyAqCisgKiAgICBDaGFuZ2Ugc3BlZWQgb2YgdGhlIExpdGVsaW5rIGRvbmdsZS4gVG8gY3ljbGUgdGhyb3VnaCB0aGUgYXZhaWxhYmxlIAorICogICAgYmF1ZCByYXRlcywgcHVsc2UgUlRTIGxvdyBmb3IgYSBmZXcgbXMuICAKKyAqLworc3RhdGljIGludCBsaXRlbGlua19jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCit7CisgICAgICAgIGludCBpOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIGRvbmdsZSBhbHJlYWR5IHJlc2V0IGJ5IGlyZGEtdGhyZWFkIC0gY3VycmVudCBzcGVlZCAoZG9uZ2xlIGFuZAorCSAqIHBvcnQpIGlzIHRoZSBkZWZhdWx0IHNwZWVkICgxMTUyMDAgZm9yIGxpdGVsaW5rISkKKwkgKi8KKworCS8qIEN5Y2xlIHRocm91Z2ggYXZhaWFibGUgYmF1ZHJhdGVzIHVudGlsIHdlIHJlYWNoIHRoZSBjb3JyZWN0IG9uZSAqLworCWZvciAoaSA9IDA7IGJhdWRfcmF0ZXNbaV0gIT0gc3BlZWQ7IGkrKykgeworCisJCS8qIGVuZC1vZi1saXN0IHJlYWNoZWQgZHVlIHRvIGludmFsaWQgc3BlZWQgcmVxdWVzdCAqLworCQlpZiAoYmF1ZF9yYXRlc1tpXSA9PSA5NjAwKQorCQkJYnJlYWs7CisKKwkJLyogU2V0IERUUiwgY2xlYXIgUlRTICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBUUlVFKTsKKworCQkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwkJdWRlbGF5KE1JTl9ERUxBWSk7CisKKwkJLyogU2V0IERUUiwgU2V0IFJUUyAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKworCQkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwkJdWRlbGF5KE1JTl9ERUxBWSk7CisgICAgICAgIH0KKworCWRldi0+c3BlZWQgPSBiYXVkX3JhdGVzW2ldOworCisJLyogaW52YWxpZCBiYXVkcmF0ZSBzaG91bGQgbm90IGhhcHBlbiAtIGJ1dCBpZiwgd2UgcmV0dXJuIC1FSU5WQUwgYW5kCisJICogdGhlIGRvbmdsZSBjb25maWd1cmVkIGZvciA5NjAwIHNvIHRoZSBzdGFjayBoYXMgYSBjaGFuY2UgdG8gcmVjb3ZlcgorCSAqLworCisJcmV0dXJuIChkZXYtPnNwZWVkID09IHNwZWVkKSA/IDAgOiAtRUlOVkFMOworfQorCisvKgorICogRnVuY3Rpb24gbGl0ZWxpbmtfcmVzZXQgKHRhc2spCisgKgorICogICAgICBSZXNldCB0aGUgTGl0ZWxpbmsgdHlwZSBkb25nbGUuCisgKgorICovCitzdGF0aWMgaW50IGxpdGVsaW5rX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIHByb2JhYmx5IHRoZSBwb3dlci11cCBjYW4gYmUgZHJvcHBlZCBoZXJlLCBidXQgd2l0aCBvbmx5CisJICogMTUgdXNlYyBkZWxheSBpdCdzIG5vdCB3b3J0aCB0aGUgcmlzayB1bmxlc3Mgc29tZWJvZHkgd2l0aAorCSAqIHRoZSBoYXJkd2FyZSBjb25maXJtcyBpdCBkb2Vzbid0IGJyZWFrIGFueXRoaW5nLi4uCisJICovCisKKwkvKiBQb3dlciBvbiBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKworCS8qIFNsZWVwIGEgbWluaW11bSBvZiAxNSB1cyAqLworCXVkZWxheShNSU5fREVMQVkpOworCisJLyogQ2xlYXIgUlRTIHRvIHJlc2V0IGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIEZBTFNFKTsKKworCS8qIFNsZWVwIGEgbWluaW11bSBvZiAxNSB1cyAqLworCXVkZWxheShNSU5fREVMQVkpOworCisJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCisJLyogU2xlZXAgYSBtaW5pbXVtIG9mIDE1IHVzICovCisJdWRlbGF5KE1JTl9ERUxBWSk7CisKKwkvKiBUaGlzIGRvbmdsZXMgc3BlZWQgZGVmYXVsdHMgdG8gMTE1MjAwIGJwcyAqLworCWRldi0+c3BlZWQgPSAxMTUyMDA7CisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQYXJhbGxheCBMaXRlbGluayBkb25nbGUgZHJpdmVyIik7CQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS01Iik7IC8qIElSREFfTElURUxJTktfRE9OR0xFICovCisKKy8qCisgKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplIExpdGVsaW5rIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2luaXQobGl0ZWxpbmtfc2lyX2luaXQpOworCisvKgorICogRnVuY3Rpb24gY2xlYW51cF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgQ2xlYW51cCBMaXRlbGluayBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9leGl0KGxpdGVsaW5rX3Npcl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvbGl0ZWxpbmsuYyBiL2RyaXZlcnMvbmV0L2lyZGEvbGl0ZWxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGIxMTQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9saXRlbGluay5jCkBAIC0wLDAgKzEsMTc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGxpdGVsaW5rLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMQorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgUGFyYWxsYXggTGl0ZUxpbmsgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBTdGFibGUKKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIEZyaSBNYXkgIDcgMTI6NTA6MzMgMTk5OQorICogTW9kaWZpZWQgYXQ6ICAgRnJpIERlYyAxNyAwOToxNDoyMyAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjZGVmaW5lIE1JTl9ERUxBWSAyNSAgICAgIC8qIDE1IHVzLCBidXQgd2FpdCBhIGxpdHRsZSBtb3JlIHRvIGJlIHN1cmUgKi8KKyNkZWZpbmUgTUFYX0RFTEFZIDEwMDAwICAgLyogMSBtcyAqLworCitzdGF0aWMgdm9pZCBsaXRlbGlua19vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CitzdGF0aWMgdm9pZCBsaXRlbGlua19jbG9zZShkb25nbGVfdCAqc2VsZik7CitzdGF0aWMgaW50ICBsaXRlbGlua19jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgaW50ICBsaXRlbGlua19yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKKworLyogVGhlc2UgYXJlIHRoZSBiYXVkcmF0ZXMgc3VwcG9ydGVkICovCitzdGF0aWMgX191MzIgYmF1ZF9yYXRlc1tdID0geyAxMTUyMDAsIDU3NjAwLCAzODQwMCwgMTkyMDAsIDk2MDAgfTsKKworc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZSA9IHsKKwkudHlwZSA9IElSREFfTElURUxJTktfRE9OR0xFLAorCS5vcGVuID0gbGl0ZWxpbmtfb3BlbiwKKwkuY2xvc2UgPSBsaXRlbGlua19jbG9zZSwKKwkucmVzZXQgPSBsaXRlbGlua19yZXNldCwKKwkuY2hhbmdlX3NwZWVkID0gbGl0ZWxpbmtfY2hhbmdlX3NwZWVkLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbGl0ZWxpbmtfaW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX2RldmljZV9yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsaXRlbGlua19jbGVhbnVwKHZvaWQpCit7CisJaXJkYV9kZXZpY2VfdW5yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK3N0YXRpYyB2b2lkIGxpdGVsaW5rX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDdmOyAvKiBOZWVkcyAwLjAxIG1zICovCit9CisKK3N0YXRpYyB2b2lkIGxpdGVsaW5rX2Nsb3NlKGRvbmdsZV90ICpzZWxmKQoreworCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBsaXRlbGlua19jaGFuZ2Vfc3BlZWQgKHRhc2spCisgKgorICogICAgQ2hhbmdlIHNwZWVkIG9mIHRoZSBMaXRlbGluayBkb25nbGUuIFRvIGN5Y2xlIHRocm91Z2ggdGhlIGF2YWlsYWJsZSAKKyAqICAgIGJhdWQgcmF0ZXMsIHB1bHNlIFJUUyBsb3cgZm9yIGEgZmV3IG1zLiAgCisgKi8KK3N0YXRpYyBpbnQgbGl0ZWxpbmtfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJX191MzIgc3BlZWQgPSAoX191MzIpIHRhc2stPnBhcmFtOworICAgICAgICBpbnQgaTsKKwkKKwkvKiBDbGVhciBSVFMgdG8gcmVzZXQgZG9uZ2xlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBGQUxTRSk7CisKKwkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCQorCS8qIFNsZWVwIGEgbWluaW11bSBvZiAxNSB1cyAqLworCXVkZWxheShNSU5fREVMQVkpOworCQorCS8qIEN5Y2xlIHRocm91Z2ggYXZhaWFibGUgYmF1ZHJhdGVzIHVudGlsIHdlIHJlYWNoIHRoZSBjb3JyZWN0IG9uZSAqLworCWZvciAoaT0wOyBpPDUgJiYgYmF1ZF9yYXRlc1tpXSAhPSBzcGVlZDsgaSsrKSB7CisJCS8qIFNldCBEVFIsIGNsZWFyIFJUUyAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBUUlVFKTsKKwkJCisJCS8qIFNsZWVwIGEgbWluaW11bSBvZiAxNSB1cyAqLworCQl1ZGVsYXkoTUlOX0RFTEFZKTsKKwkJCisJCS8qIFNldCBEVFIsIFNldCBSVFMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkJCisJCS8qIFNsZWVwIGEgbWluaW11bSBvZiAxNSB1cyAqLworCQl1ZGVsYXkoTUlOX0RFTEFZKTsKKyAgICAgICAgfQorCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbGl0ZWxpbmtfcmVzZXQgKHRhc2spCisgKgorICogICAgICBSZXNldCB0aGUgTGl0ZWxpbmsgdHlwZSBkb25nbGUuCisgKgorICovCitzdGF0aWMgaW50IGxpdGVsaW5rX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisKKwkvKiBQb3dlciBvbiBkb25nbGUgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCisJLyogU2xlZXAgYSBtaW5pbXVtIG9mIDE1IHVzICovCisJdWRlbGF5KE1JTl9ERUxBWSk7CisKKwkvKiBDbGVhciBSVFMgdG8gcmVzZXQgZG9uZ2xlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBGQUxTRSk7CisKKwkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCQorCS8qIFNsZWVwIGEgbWluaW11bSBvZiAxNSB1cyAqLworCXVkZWxheShNSU5fREVMQVkpOworCisJLyogVGhpcyBkb25nbGVzIHNwZWVkIGRlZmF1bHRzIHRvIDExNTIwMCBicHMgKi8KKwlzZWxmLT5zcGVlZCA9IDExNTIwMDsKKworCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKworCXJldHVybiAwOworfQorCitNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBhcmFsbGF4IExpdGVsaW5rIGRvbmdsZSBkcml2ZXIiKTsJCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTUiKTsgLyogSVJEQV9MSVRFTElOS19ET05HTEUgKi8KKwkJCisvKgorICogRnVuY3Rpb24gaW5pdF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgSW5pdGlhbGl6ZSBMaXRlbGluayBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9pbml0KGxpdGVsaW5rX2luaXQpOworCisvKgorICogRnVuY3Rpb24gY2xlYW51cF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgQ2xlYW51cCBMaXRlbGluayBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9leGl0KGxpdGVsaW5rX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9tYTYwMC1zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvbWE2MDAtc2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlZDE2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbWE2MDAtc2lyLmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgbWE2MDAuYworICogVmVyc2lvbjogICAgICAgMC4xCisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUE2MDAgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBMZXVuZyA8OTVFdHdsQGFsdW1uaS5lZS51c3QuaGs+IGh0dHA6Ly93d3cuZW5nc3ZyLnVzdC9+ZWV0d2w5NQorICogQ3JlYXRlZCBhdDogICAgU2F0IEp1biAxMCAyMDowMjozNSAyMDAwCisgKiBNb2RpZmllZCBhdDogICBTYXQgQXVnIDE2IDA5OjM0OjEzIDIwMDMKKyAqIE1vZGlmaWVkIGJ5OiAgIE1hcnRpbiBEaWVobCA8bWFkQG1kaWVobC5kZT4gKG1vZGlmaWVkIGZvciBuZXcgc2lyX2RldikKKyAqCisgKiBOb3RlOiB2ZXJ5IHRoYW5rcyB0byBNci4gTWFydSBXYW5nIDxtYXJ1QG1vYmlsZWFjdGlvbi5jb20udHc+IGZvciBwcm92aWRpbmcgCisgKiAgICAgICBpbmZvcm1hdGlvbiBvbiB0aGUgTUE2MDAgZG9uZ2xlCisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAgTGV1bmcsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKK3N0YXRpYyBpbnQgbWE2MDBfb3BlbihzdHJ1Y3Qgc2lyX2RldiAqKTsKK3N0YXRpYyBpbnQgbWE2MDBfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKik7CitzdGF0aWMgaW50IG1hNjAwX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqLCB1bnNpZ25lZCk7CitzdGF0aWMgaW50IG1hNjAwX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICopOworCisvKiBjb250cm9sIGJ5dGUgZm9yIE1BNjAwICovCisjZGVmaW5lIE1BNjAwXzk2MDAJMHgwMAorI2RlZmluZSBNQTYwMF8xOTIwMAkweDAxCisjZGVmaW5lIE1BNjAwXzM4NDAwCTB4MDIKKyNkZWZpbmUgTUE2MDBfNTc2MDAJMHgwMworI2RlZmluZSBNQTYwMF8xMTUyMDAJMHgwNAorI2RlZmluZSBNQTYwMF9ERVZfSUQxCTB4MDUKKyNkZWZpbmUgTUE2MDBfREVWX0lEMgkweDA2CisjZGVmaW5lIE1BNjAwXzI0MDAJMHgwOAorCitzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgbWE2MDAgPSB7CisJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lICAgID0gIk1BNjAwIiwKKwkudHlwZSAgICAgICAgICAgPSBJUkRBX01BNjAwX0RPTkdMRSwKKwkub3BlbiAgICAgICAgICAgPSBtYTYwMF9vcGVuLAorCS5jbG9zZSAgICAgICAgICA9IG1hNjAwX2Nsb3NlLAorCS5yZXNldCAgICAgICAgICA9IG1hNjAwX3Jlc2V0LAorCS5zZXRfc3BlZWQgICAgICA9IG1hNjAwX2NoYW5nZV9zcGVlZCwKK307CisKKworc3RhdGljIGludCBfX2luaXQgbWE2MDBfc2lyX2luaXQodm9pZCkKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiBpcmRhX3JlZ2lzdGVyX2RvbmdsZSgmbWE2MDApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWE2MDBfc2lyX2NsZWFudXAodm9pZCkKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCWlyZGFfdW5yZWdpc3Rlcl9kb25nbGUoJm1hNjAwKTsKK30KKworLyoKKwlQb3dlciBvbjoKKwkJKDApIENsZWFyIFJUUyBhbmQgRFRSIGZvciAxIHNlY29uZAorCQkoMSkgU2V0IFJUUyBhbmQgRFRSIGZvciAxIHNlY29uZAorCQkoMikgOTYwMCBicHMgbm93CisJTm90ZTogYXNzdW1lIFJUUywgRFRSIGFyZSBjbGVhciBiZWZvcmUKKyovCitzdGF0aWMgaW50IG1hNjAwX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcW9zX2luZm8gKnFvcyA9ICZkZXYtPnFvczsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKworCS8qIEV4cGxpY2l0bHkgc2V0IHRoZSBzcGVlZHMgd2UgY2FuIGFjY2VwdCAqLworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfMjQwMHxJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwCisJCQkJfElSXzU3NjAwfElSXzExNTIwMDsKKwkvKiBIbSwgMHgwMSBtZWFucyAxMG1zIC0gZm9yID49IDFtcyB3ZSB3b3VsZCBuZWVkIDB4MDcgKi8KKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4MDE7CQkvKiBOZWVkcyBhdCBsZWFzdCAxIG1zICovCQorCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUocW9zKTsKKworCS8qIGlyZGEgdGhyZWFkIHdhaXRzIDUwIG1zZWMgZm9yIHBvd2VyIHNldHRsaW5nICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYTYwMF9jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIEZBTFNFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX191OCBnZXRfY29udHJvbF9ieXRlKF9fdTMyIHNwZWVkKQoreworCV9fdTggYnl0ZTsKKworCXN3aXRjaCAoc3BlZWQpIHsKKwlkZWZhdWx0OgorCWNhc2UgMTE1MjAwOgorCQlieXRlID0gTUE2MDBfMTE1MjAwOworCQlicmVhazsKKwljYXNlIDU3NjAwOgorCQlieXRlID0gTUE2MDBfNTc2MDA7CisJCWJyZWFrOworCWNhc2UgMzg0MDA6CisJCWJ5dGUgPSBNQTYwMF8zODQwMDsKKwkJYnJlYWs7CisJY2FzZSAxOTIwMDoKKwkJYnl0ZSA9IE1BNjAwXzE5MjAwOworCQlicmVhazsKKwljYXNlIDk2MDA6CisJCWJ5dGUgPSBNQTYwMF85NjAwOworCQlicmVhazsKKwljYXNlIDI0MDA6CisJCWJ5dGUgPSBNQTYwMF8yNDAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gYnl0ZTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG1hNjAwX2NoYW5nZV9zcGVlZCAoZGV2LCBzcGVlZCkKKyAqCisgKiAgICBTZXQgdGhlIHNwZWVkIGZvciB0aGUgTUE2MDAgdHlwZSBkb25nbGUuCisgKgorICogICAgVGhlIGRvbmdsZSBoYXMgYWxyZWFkeSBiZWVuIHJlc2V0IHRvIGEga25vd24gc3RhdGUgKGRvbmdsZSBkZWZhdWx0KQorICogICAgV2UgY3ljbGUgdGhyb3VnaCBzcGVlZHMgYnkgcHVsc2luZyBSVFMgbG93IGFuZCB0aGVuIGhpZ2guCisgKi8KKworLyoKKyAqIEZ1bmN0aW9uIG1hNjAwX2NoYW5nZV9zcGVlZCAoZGV2LCBzcGVlZCkKKyAqCisgKiAgICBTZXQgdGhlIHNwZWVkIGZvciB0aGUgTUE2MDAgdHlwZSBkb25nbGUuCisgKgorICogICAgQWxnb3JpdGhtCisgKiAgICAxLiBSZXNldCAoYWxyZWFkeSBkb25lIGJ5IGlyZGEgdGhyZWFkIHN0YXRlIG1hY2hpbmUpCisgKiAgICAyLiBjbGVhciBSVFMsIHNldCBEVFIgYW5kIHdhaXQgZm9yIDFtcworICogICAgMy4gc2VuZCBDb250cm9sIEJ5dGUgdG8gdGhlIE1BNjAwIHRocm91Z2ggVFhEIHRvIHNldCBuZXcgYmF1ZCByYXRlCisgKiAgICAgICB3YWl0IHVudGlsIHRoZSBzdG9wIGJpdCBvZiBDb250cm9sIEJ5dGUgaXMgc2VudCAoZm9yIDk2MDAgYmF1ZCByYXRlLCAKKyAqICAgICAgIGl0IHRha2VzIGFib3V0IDEwIG1zZWMpCisgKiAgICA0LiBzZXQgUlRTLCBzZXQgRFRSIChyZXR1cm4gdG8gTk9STUFMIE9wZXJhdGlvbikKKyAqICAgIDUuIHdhaXQgYXQgbGVhc3QgMTAgbXMsIG5ldyBzZXR0aW5nIChiYXVkIHJhdGUsIGV0YykgdGFrZXMgZWZmZWN0IGhlcmUgCisgKiAgICAgICBhZnRlcgorICovCisKKy8qIHRvdGFsIGRlbGF5cyBhcmUgb25seSBhYm91dCAyMG1zIC0gbGV0J3MganVzdCBzbGVlcCBmb3Igbm93IHRvCisgKiBhdm9pZCB0aGUgc3RhdGUgbWFjaGluZSBjb21wbGV4aXR5IGJlZm9yZSB3ZSBnZXQgdGhpbmdzIHdvcmtpbmcKKyAqLworCitzdGF0aWMgaW50IG1hNjAwX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCB1bnNpZ25lZCBzcGVlZCkKK3sKKwl1OAlieXRlOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIHNwZWVkPSVkICh3YXMgJWQpXG4iLCBfX0ZVTkNUSU9OX18sCisJCXNwZWVkLCBkZXYtPnNwZWVkKTsKKworCS8qIGRvbmdsZSBhbHJlYWR5IHJlc2V0LCBkb25nbGUgYW5kIHBvcnQgYXQgZGVmYXVsdCBzcGVlZCAoOTYwMCkgKi8KKworCS8qIFNldCBSVFMgbG93IGZvciAxIG1zICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgRkFMU0UpOworCW1kZWxheSgxKTsKKworCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZSAqLworCWJ5dGUgPSBnZXRfY29udHJvbF9ieXRlKHNwZWVkKTsKKwlzaXJkZXZfcmF3X3dyaXRlKGRldiwgJmJ5dGUsIHNpemVvZihieXRlKSk7CisKKwkvKiBXYWl0IGF0IGxlYXN0IDEwbXM6IGZha2Ugd2FpdF91bnRpbF9zZW50IC0gMTAgYml0cyBhdCA5NjAwIGJhdWQqLworCW1zbGVlcCgxNSk7CQkJCQkvKiBvbGQgbWE2MDAgdXNlcyAxNW1zICovCisKKyNpZiAxCisJLyogcmVhZC1iYWNrIG9mIHRoZSBjb250cm9sIGJ5dGUuIG1hNjAwIGlzIHRoZSBmaXJzdCBkb25nbGUgZHJpdmVyCisJICogd2hpY2ggdXNlcyB0aGlzIHNvIHRoZXJlIG1pZ2h0IGJlIHNvbWUgdW5pZGVudGlmaWVkIGlzc3Vlcy4KKwkgKiBEaXNhYmxlIHRoaXMgaW4gY2FzZSBvZiBwcm9ibGVtcyB3aXRoIHJlYWRiYWNrLgorCSAqLworCisJc2lyZGV2X3Jhd19yZWFkKGRldiwgJmJ5dGUsIHNpemVvZihieXRlKSk7CisJaWYgKGJ5dGUgIT0gZ2V0X2NvbnRyb2xfYnl0ZShzcGVlZCkpICB7CisJCUlSREFfV0FSTklORygiJXMoKTogYmFkIGNvbnRyb2wgYnl0ZSByZWFkLWJhY2sgJTAyeCAhPSAlMDJ4XG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCkgYnl0ZSwKKwkJCSAgICAgKHVuc2lnbmVkKSBnZXRfY29udHJvbF9ieXRlKHNwZWVkKSk7CisJCXJldHVybiAtMTsKKwl9CisJZWxzZQorCQlJUkRBX0RFQlVHKDIsICIlcygpIGNvbnRyb2wgYnl0ZSB3cml0ZSByZWFkIE9LXG4iLCBfX0ZVTkNUSU9OX18pOworI2VuZGlmCisKKwkvKiBTZXQgRFRSLCBTZXQgUlRTICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisKKwkvKiBXYWl0IGF0IGxlYXN0IDEwbXMgKi8KKwltc2xlZXAoMTApOworCisJLyogZG9uZ2xlIGlzIG5vdyBzd2l0Y2hlZCB0byB0aGUgbmV3IHNwZWVkICovCisJZGV2LT5zcGVlZCA9IHNwZWVkOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBtYTYwMF9yZXNldCAoZGV2KQorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIG1hNjAwIGRvbmdsZS4KKyAqCisgKiAgICAgIEFsZ29yaXRobToKKyAqICAgIAkgIDAuIERUUj0wLCBSVFM9MSBhbmQgd2FpdCAxMCBtcworICogICAgCSAgMS4gRFRSPTEsIFJUUz0xIGFuZCB3YWl0IDEwIG1zCisgKiAgICAgICAgMi4gOTYwMCBicHMgbm93CisgKi8KKworLyogdG90YWwgZGVsYXlzIGFyZSBvbmx5IGFib3V0IDIwbXMgLSBsZXQncyBqdXN0IHNsZWVwIGZvciBub3cgdG8KKyAqIGF2b2lkIHRoZSBzdGF0ZSBtYWNoaW5lIGNvbXBsZXhpdHkgYmVmb3JlIHdlIGdldCB0aGluZ3Mgd29ya2luZworICovCisKK2ludCBtYTYwMF9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBSZXNldCB0aGUgZG9uZ2xlIDogc2V0IERUUiBsb3cgZm9yIDEwIG1zICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIFRSVUUpOworCW1zbGVlcCgxMCk7CisKKwkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisJbXNsZWVwKDEwKTsKKworCWRldi0+c3BlZWQgPSA5NjAwOyAgICAgIC8qIFRoYXQncyB0aGUgZG9uZ2xlLWRlZmF1bHQgKi8KKworCXJldHVybiAwOworfQorCitNT0RVTEVfQVVUSE9SKCJMZXVuZyA8OTVFdHdsQGFsdW1uaS5lZS51c3QuaGs+IGh0dHA6Ly93d3cuZW5nc3ZyLnVzdC9+ZWV0d2w5NSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQTYwMCBkb25nbGUgZHJpdmVyIHZlcnNpb24gMC4xIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTExIik7IC8qIElSREFfTUE2MDBfRE9OR0xFICovCisJCQorbW9kdWxlX2luaXQobWE2MDBfc2lyX2luaXQpOworbW9kdWxlX2V4aXQobWE2MDBfc2lyX2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL21hNjAwLmMgYi9kcml2ZXJzL25ldC9pcmRhL21hNjAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlNjgzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbWE2MDAuYwpAQCAtMCwwICsxLDM1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBtYTYwMC5jCisgKiBWZXJzaW9uOiAgICAgICAwLjEKKyAqIERlc2NyaXB0aW9uOiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBNQTYwMCBkb25nbGUKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIExldW5nIDw5NUV0d2xAYWx1bW5pLmVlLnVzdC5oaz4gaHR0cDovL3d3dy5lbmdzdnIudXN0L35lZXR3bDk1CisgKiBDcmVhdGVkIGF0OiAgICBTYXQgSnVuIDEwIDIwOjAyOjM1IDIwMDAKKyAqIE1vZGlmaWVkIGF0OiAgIAorICogTW9kaWZpZWQgYnk6ICAgCisgKgorICogTm90ZTogdmVyeSB0aGFua3MgdG8gTXIuIE1hcnUgV2FuZyA8bWFydUBtb2JpbGVhY3Rpb24uY29tLnR3PiBmb3IgcHJvdmlkaW5nIAorICogICAgICAgaW5mb3JtYXRpb24gb24gdGhlIE1BNjAwIGRvbmdsZQorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwIExldW5nLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRlZmluZSB0aGlzIG1hY3JvIGZvciByZWxlYXNlIHZlcnNpb24gKi8KKy8vI2RlZmluZSBOREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKKyNpZm5kZWYgTkRFQlVHCisJI3VuZGVmIElSREFfREVCVUcKKwkjZGVmaW5lIElSREFfREVCVUcobiwgYXJncy4uLikgKHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpKQorCisJI3VuZGVmIEFTU0VSVAorCSNkZWZpbmUgQVNTRVJUKGV4cHIsIGZ1bmMpIFwKKwlpZighKGV4cHIpKSB7IFwKKwkgICAgICAgIHByaW50ayggIkFzc2VydGlvbiBmYWlsZWQhICVzLCVzLCVzLGxpbmU9JWRcbiIsXAorICAgICAgICAJI2V4cHIsX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fKTsgXAorCSAgICAgICAgZnVuY30KKyNlbmRpZgorCisvKiBjb252ZXJ0IGhleCB2YWx1ZSB0byBhc2NpaSBoZXggKi8KK3N0YXRpYyBjb25zdCBjaGFyIGhleFRibFtdID0gIjAxMjM0NTY3ODlBQkNERUYiOworCisKK3N0YXRpYyB2b2lkIG1hNjAwX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKTsKK3N0YXRpYyB2b2lkIG1hNjAwX2Nsb3NlKGRvbmdsZV90ICpzZWxmKTsKK3N0YXRpYyBpbnQgIG1hNjAwX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKK3N0YXRpYyBpbnQgIG1hNjAwX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworCisvKiBjb250cm9sIGJ5dGUgZm9yIE1BNjAwICovCisjZGVmaW5lIE1BNjAwXzk2MDAJMHgwMAorI2RlZmluZSBNQTYwMF8xOTIwMAkweDAxCisjZGVmaW5lIE1BNjAwXzM4NDAwCTB4MDIKKyNkZWZpbmUgTUE2MDBfNTc2MDAJMHgwMworI2RlZmluZSBNQTYwMF8xMTUyMDAJMHgwNAorI2RlZmluZSBNQTYwMF9ERVZfSUQxCTB4MDUKKyNkZWZpbmUgTUE2MDBfREVWX0lEMgkweDA2CisjZGVmaW5lIE1BNjAwXzI0MDAJMHgwOAorCitzdGF0aWMgc3RydWN0IGRvbmdsZV9yZWcgZG9uZ2xlID0geworCS50eXBlID0gSVJEQV9NQTYwMF9ET05HTEUsCisJLm9wZW4gPSBtYTYwMF9vcGVuLAorCS5jbG9zZSA9IG1hNjAwX2Nsb3NlLAorCS5yZXNldCA9IG1hNjAwX3Jlc2V0LAorCS5jaGFuZ2Vfc3BlZWQgPSBtYTYwMF9jaGFuZ2Vfc3BlZWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtYTYwMF9pbml0KHZvaWQpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWE2MDBfY2xlYW51cCh2b2lkKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJaXJkYV9kZXZpY2VfdW5yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKKy8qCisJUG93ZXIgb246CisJCSgwKSBDbGVhciBSVFMgYW5kIERUUiBmb3IgMSBzZWNvbmQKKwkJKDEpIFNldCBSVFMgYW5kIERUUiBmb3IgMSBzZWNvbmQKKwkJKDIpIDk2MDAgYnBzIG5vdworCU5vdGU6IGFzc3VtZSBSVFMsIERUUiBhcmUgY2xlYXIgYmVmb3JlCisqLworc3RhdGljIHZvaWQgbWE2MDBfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfMjQwMHxJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwCisJCQkJfElSXzU3NjAwfElSXzExNTIwMDsKKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4MDE7CQkvKiBOZWVkcyBhdCBsZWFzdCAxIG1zICovCQorCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUocW9zKTsKKworCS8vc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworCS8vIHNob3VsZCB3YWl0IDEgc2Vjb25kCisKKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCS8vIHNob3VsZCB3YWl0IDEgc2Vjb25kCit9CisKK3N0YXRpYyB2b2lkIG1hNjAwX2Nsb3NlKGRvbmdsZV90ICpzZWxmKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworfQorCitzdGF0aWMgX191OCBnZXRfY29udHJvbF9ieXRlKF9fdTMyIHNwZWVkKQoreworCV9fdTggYnl0ZTsKKworCXN3aXRjaCAoc3BlZWQpIHsKKwlkZWZhdWx0OgorCWNhc2UgMTE1MjAwOgorCQlieXRlID0gTUE2MDBfMTE1MjAwOworCQlicmVhazsKKwljYXNlIDU3NjAwOgorCQlieXRlID0gTUE2MDBfNTc2MDA7CisJCWJyZWFrOworCWNhc2UgMzg0MDA6CisJCWJ5dGUgPSBNQTYwMF8zODQwMDsKKwkJYnJlYWs7CisJY2FzZSAxOTIwMDoKKwkJYnl0ZSA9IE1BNjAwXzE5MjAwOworCQlicmVhazsKKwljYXNlIDk2MDA6CisJCWJ5dGUgPSBNQTYwMF85NjAwOworCQlicmVhazsKKwljYXNlIDI0MDA6CisJCWJ5dGUgPSBNQTYwMF8yNDAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gYnl0ZTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG1hNjAwX2NoYW5nZV9zcGVlZCAoZGV2LCBzdGF0ZSwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIE1BNjAwIHR5cGUgZG9uZ2xlLiBXYXJuaW5nLCB0aGlzIAorICogICAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBhIHByb2Nlc3MgY29udGV4dCEKKyAqCisgKiAgICBBbGdvcml0aG0KKyAqICAgIDEuIFJlc2V0CisgKiAgICAyLiBjbGVhciBSVFMsIHNldCBEVFIgYW5kIHdhaXQgZm9yIDFtcworICogICAgMy4gc2VuZCBDb250cm9sIEJ5dGUgdG8gdGhlIE1BNjAwIHRocm91Z2ggVFhEIHRvIHNldCBuZXcgYmF1ZCByYXRlCisgKiAgICAgICB3YWl0IHVudGlsIHRoZSBzdG9wIGJpdCBvZiBDb250cm9sIEJ5dGUgaXMgc2VudCAoZm9yIDk2MDAgYmF1ZCByYXRlLCAKKyAqICAgICAgIGl0IHRha2VzIGFib3V0IDEwIG1zZWMpCisgKiAgICA0LiBzZXQgUlRTLCBzZXQgRFRSIChyZXR1cm4gdG8gTk9STUFMIE9wZXJhdGlvbikKKyAqICAgIDUuIHdhaXQgYXQgbGVhc3QgMTAgbXMsIG5ldyBzZXR0aW5nIChiYXVkIHJhdGUsIGV0YykgdGFrZXMgZWZmZWN0IGhlcmUgCisgKiAgICAgICBhZnRlcgorICovCitzdGF0aWMgaW50IG1hNjAwX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCV9fdTMyIHNwZWVkID0gKF9fdTMyKSB0YXNrLT5wYXJhbTsKKwlzdGF0aWMgX191OCBieXRlOworCV9fdTggYnl0ZV9lY2hvOworCWludCByZXQgPSAwOworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlBU1NFUlQodGFzayAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlmIChzZWxmLT5zcGVlZF90YXNrICYmIHNlbGYtPnNwZWVkX3Rhc2sgIT0gdGFzaykgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBidXN5IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIG1zZWNzX3RvX2ppZmZpZXMoMTApOworCX0gZWxzZSB7CisJCXNlbGYtPnNwZWVkX3Rhc2sgPSB0YXNrOworCX0KKworCXN3aXRjaCAodGFzay0+c3RhdGUpIHsKKwljYXNlIElSREFfVEFTS19JTklUOgorCWNhc2UgSVJEQV9UQVNLX0NISUxEX0lOSVQ6CisJCS8qIAorCQkgKiBOZWVkIHRvIHJlc2V0IHRoZSBkb25nbGUgYW5kIGdvIHRvIDk2MDAgYnBzIGJlZm9yZQorICAgICAgICAgICAgICAgICAqIHByb2dyYW1taW5nIAorCQkgKi8KKwkJaWYgKGlyZGFfdGFza19leGVjdXRlKHNlbGYsIG1hNjAwX3Jlc2V0LCBOVUxMLCB0YXNrLCAKKwkJCQkgICAgICAodm9pZCAqKSBzcGVlZCkpIHsKKwkJCS8qIERvbmdsZSBuZWVkIG1vcmUgdGltZSB0byByZXNldCAqLworCQkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0NISUxEX1dBSVQpOworCQorCQkJLyogZ2l2ZSAxIHNlY29uZCB0byBmaW5pc2ggKi8KKwkJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJCX0gZWxzZSB7CisJCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfQ0hJTERfRE9ORSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElSREFfVEFTS19DSElMRF9XQUlUOgorCQlJUkRBX1dBUk5JTkcoIiVzKCksIHJlc2V0dGluZyBkb25nbGUgdGltZWQgb3V0IVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfRE9ORToKKwkJLyogU2V0IERUUiwgQ2xlYXIgUlRTICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgRkFMU0UpOworCQorCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEpOwkJLyogU2xlZXAgMSBtcyAqLworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVCk7CisJCWJyZWFrOworCisJY2FzZSBJUkRBX1RBU0tfV0FJVDoKKwkJc3BlZWQgPSAoX191MzIpIHRhc2stPnBhcmFtOworCQlieXRlID0gZ2V0X2NvbnRyb2xfYnl0ZShzcGVlZCk7CisKKwkJLyogV3JpdGUgY29udHJvbCBieXRlICovCisJCXNlbGYtPndyaXRlKHNlbGYtPmRldiwgJmJ5dGUsIHNpemVvZihieXRlKSk7CisJCQorCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDEpOworCisJCS8qIFdhaXQgYXQgbGVhc3QgMTAgbXMgKi8KKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxNSk7CisJCWJyZWFrOworCisJY2FzZSBJUkRBX1RBU0tfV0FJVDE6CisJCS8qIFJlYWQgY29udHJvbCBieXRlIGVjaG8gKi8KKwkJc2VsZi0+cmVhZChzZWxmLT5kZXYsICZieXRlX2VjaG8sIHNpemVvZihieXRlX2VjaG8pKTsKKworCQlpZihieXRlICE9IGJ5dGVfZWNobykgeworCQkJLyogaWYgY29udHJvbCBieXRlICE9IGVjaG8sIEkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcygpIGNvbnRyb2wgYnl0ZSB3cml0dGVuICE9IHJlYWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29udHJvbCBieXRlID0gMHglYyVjXG4iLCAKKwkJCSAgICAgICBoZXhUYmxbKGJ5dGU+PjQpJjB4MGZdLCBoZXhUYmxbYnl0ZSYweDBmXSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJieXRlIGVjaG8gPSAweCVjJWNcbiIsIAorCQkJICAgICAgIGhleFRibFsoYnl0ZV9lY2hvPj40KSAmIDB4MGZdLCAKKwkJCSAgICAgICBoZXhUYmxbYnl0ZV9lY2hvICYgMHgwZl0pOworCQkjaWZuZGVmIE5ERUJVRworCQl9IGVsc2UgeworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSBjb250cm9sIGJ5dGUgd3JpdGUgcmVhZCBPS1xuIiwgX19GVU5DVElPTl9fKTsKKwkJI2VuZGlmCisJCX0KKworCQkvKiBTZXQgRFRSLCBTZXQgUlRTICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQyKTsKKworCQkvKiBXYWl0IGF0IGxlYXN0IDEwIG1zICovCisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTApOworCQlicmVhazsKKworCWNhc2UgSVJEQV9UQVNLX1dBSVQyOgorCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnNwZWVkX3Rhc2sgPSBOVUxMOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5zcGVlZF90YXNrID0gTlVMTDsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gbWE2MDBfcmVzZXQgKGRyaXZlcikKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBtYTYwMCBkb25nbGUuIFdhcm5pbmcsIHRoaXMgZnVuY3Rpb24gCisgKiAgICAgIG11c3QgYmUgY2FsbGVkIHdpdGggYSBwcm9jZXNzIGNvbnRleHQhISAKKyAqCisgKiAgICAgIEFsZ29yaXRobToKKyAqICAgIAkgIDAuIERUUj0wLCBSVFM9MSBhbmQgd2FpdCAxMCBtcworICogICAgCSAgMS4gRFRSPTEsIFJUUz0xIGFuZCB3YWl0IDEwIG1zCisgKiAgICAgICAgMi4gOTYwMCBicHMgbm93CisgKi8KK2ludCBtYTYwMF9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUFTU0VSVCh0YXNrICE9IE5VTEwsIHJldHVybiAtMTspOworCisJaWYgKHNlbGYtPnJlc2V0X3Rhc2sgJiYgc2VsZi0+cmVzZXRfdGFzayAhPSB0YXNrKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGJ1c3khXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gbXNlY3NfdG9famlmZmllcygxMCk7CisJfSBlbHNlCisJCXNlbGYtPnJlc2V0X3Rhc2sgPSB0YXNrOworCQorCXN3aXRjaCAodGFzay0+c3RhdGUpIHsKKwljYXNlIElSREFfVEFTS19JTklUOgorCQkvKiBDbGVhciBEVFIgYW5kIFNldCBSVFMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgVFJVRSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUMSk7CisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTApOwkJLyogU2xlZXAgMTAgbXMgKi8KKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDE6CisJCS8qIFNldCBEVFIgYW5kIFJUUyAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDIpOworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwKTsJCS8qIFNsZWVwIDEwIG1zICovCisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQyOgorCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCB0YXNrLT5zdGF0ZSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsJCQorCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKKwkJcmV0ID0gLTE7CisJfQorCXJldHVybiByZXQ7Cit9CisKK01PRFVMRV9BVVRIT1IoIkxldW5nIDw5NUV0d2xAYWx1bW5pLmVlLnVzdC5oaz4gaHR0cDovL3d3dy5lbmdzdnIudXN0L35lZXR3bDk1Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1BNjAwIGRvbmdsZSBkcml2ZXIgdmVyc2lvbiAwLjEiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtMTEiKTsgLyogSVJEQV9NQTYwMF9ET05HTEUgKi8KKwkJCisvKgorICogRnVuY3Rpb24gaW5pdF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgSW5pdGlhbGl6ZSBNQTYwMCBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9pbml0KG1hNjAwX2luaXQpOworCisvKgorICogRnVuY3Rpb24gY2xlYW51cF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgQ2xlYW51cCBNQTYwMCBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9leGl0KG1hNjAwX2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL21jcDIxMjAtc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL21jcDIxMjAtc2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdiZDAxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNwMjEyMC1zaXIuYwpAQCAtMCwwICsxLDIzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAKKyAqICAgIAorICogRmlsZW5hbWU6ICAgICAgbWNwMjEyMC5jCisgKiBWZXJzaW9uOiAgICAgICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIEltcGxlbWVudGF0aW9uIGZvciB0aGUgTUNQMjEyMCAoTWljcm9jaGlwKQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRmVsaXggVGFuZyAodGFuZ2ZAZXlldGFwLm9yZykKKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBNYXIgMzEgMTk6MzI6MTIgRVNUIDIwMDIKKyAqIEJhc2VkIG9uIGNvZGUgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAyIEZlbGl4IFRhbmcsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKworI2luY2x1ZGUgInNpci1kZXYuaCIKKworc3RhdGljIGludCBtY3AyMTIwX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBtY3AyMTIwX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldik7CitzdGF0aWMgaW50IG1jcDIxMjBfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldik7CitzdGF0aWMgaW50IG1jcDIxMjBfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKTsKKworI2RlZmluZSBNQ1AyMTIwXzk2MDAgICAgMHg4NworI2RlZmluZSBNQ1AyMTIwXzE5MjAwICAgMHg4QgorI2RlZmluZSBNQ1AyMTIwXzM4NDAwICAgMHg4NQorI2RlZmluZSBNQ1AyMTIwXzU3NjAwICAgMHg4MworI2RlZmluZSBNQ1AyMTIwXzExNTIwMCAgMHg4MQorCisjZGVmaW5lIE1DUDIxMjBfQ09NTUlUICAweDExCisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX2RyaXZlciBtY3AyMTIwID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJPSAiTWljcm9jaGlwIE1DUDIxMjAiLAorCS50eXBlCQk9IElSREFfTUNQMjEyMF9ET05HTEUsCisJLm9wZW4JCT0gbWNwMjEyMF9vcGVuLAorCS5jbG9zZQkJPSBtY3AyMTIwX2Nsb3NlLAorCS5yZXNldAkJPSBtY3AyMTIwX3Jlc2V0LAorCS5zZXRfc3BlZWQJPSBtY3AyMTIwX2NoYW5nZV9zcGVlZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1jcDIxMjBfc2lyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaXJkYV9yZWdpc3Rlcl9kb25nbGUoJm1jcDIxMjApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWNwMjEyMF9zaXJfY2xlYW51cCh2b2lkKQoreworCWlyZGFfdW5yZWdpc3Rlcl9kb25nbGUoJm1jcDIxMjApOworfQorCitzdGF0aWMgaW50IG1jcDIxMjBfb3BlbihzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCXN0cnVjdCBxb3NfaW5mbyAqcW9zID0gJmRldi0+cW9zOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIHNlZW1zIG5vIGV4cGxpY2l0IHBvd2VyLW9uIHJlcXVpcmVkIGhlcmUgYW5kIHJlc2V0IHN3aXRjaGluZyBpdCBvbiBhbnl3YXkgKi8KKworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAxOworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUocW9zKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jcDIxMjBfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworICAgICAgICAvKiByZXNldCBhbmQgaW5oaWJpdCBtY3AyMTIwICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisJLy8gc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIEZBTFNFKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbWNwMjEyMF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIE1DUDIxMjAuCisgKgorICovCisKKyNkZWZpbmUgTUNQMjEyMF9TVEFURV9XQUlUX1NQRUVECShTSVJERVZfU1RBVEVfRE9OR0xFX1NQRUVEKzEpCisKK3N0YXRpYyBpbnQgbWNwMjEyMF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCit7CisJdW5zaWduZWQgc3RhdGUgPSBkZXYtPmZzbS5zdWJzdGF0ZTsKKwl1bnNpZ25lZCBkZWxheSA9IDA7CisJdTggY29udHJvbFsyXTsKKwlzdGF0aWMgaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0lSREVWX1NUQVRFX0RPTkdMRV9TUEVFRDoKKwkJLyogU2V0IERUUiB0byBlbnRlciBjb21tYW5kIG1vZGUgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgRkFMU0UpOworICAgICAgICAgICAgICAgIHVkZWxheSg1MDApOworCisJCXJldCA9IDA7CisJCXN3aXRjaCAoc3BlZWQpIHsKKwkJZGVmYXVsdDoKKwkJCXNwZWVkID0gOTYwMDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSA5NjAwOgorCQkJY29udHJvbFswXSA9IE1DUDIxMjBfOTYwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwIDk2MDBcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMTkyMDA6CisJCQljb250cm9sWzBdID0gTUNQMjEyMF8xOTIwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwIDE5MjAwXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDM0ODAwOgorCQkJY29udHJvbFswXSA9IE1DUDIxMjBfMzg0MDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMCAzODQwMFxuIik7CisJCQlicmVhazsKKwkJY2FzZSA1NzYwMDoKKwkJCWNvbnRyb2xbMF0gPSBNQ1AyMTIwXzU3NjAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjAgNTc2MDBcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMTE1MjAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbFswXSA9IE1DUDIxMjBfMTE1MjAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjAgMTE1MjAwXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWNvbnRyb2xbMV0gPSBNQ1AyMTIwX0NPTU1JVDsKKwkKKwkJLyogV3JpdGUgY29udHJvbCBieXRlcyAqLworCQlzaXJkZXZfcmF3X3dyaXRlKGRldiwgY29udHJvbCwgMik7CisJCWRldi0+c3BlZWQgPSBzcGVlZDsKKworCQlzdGF0ZSA9IE1DUDIxMjBfU1RBVEVfV0FJVF9TUEVFRDsKKwkJZGVsYXkgPSAxMDA7CisgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjBfY2hhbmdlX3NwZWVkOiBkb25nbGVfc3BlZWRcbiIpOworCQlicmVhazsKKworCWNhc2UgTUNQMjEyMF9TVEFURV9XQUlUX1NQRUVEOgorCQkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjBfY2hhbmdlX3NwZWVkOiBtY3Bfd2FpdFxuIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5kZWZpbmUgc3RhdGUgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJZGV2LT5mc20uc3Vic3RhdGUgPSBzdGF0ZTsKKwlyZXR1cm4gKGRlbGF5ID4gMCkgPyBkZWxheSA6IHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG1jcDIxMjBfcmVzZXQgKGRyaXZlcikKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBtY3AyMTIwIGRvbmdsZS4KKyAqICAgICAgCisgKiAgICAgIEluZm86IC1zZXQgUlRTIHRvIHJlc2V0IG1jcDIxMjAKKyAqICAgICAgICAgICAgLXNldCBEVFIgdG8gc2V0IG1jcDIxMjAgc29mdHdhcmUgY29tbWFuZCBtb2RlCisgKiAgICAgICAgICAgIC1tY3AyMTIwIGRlZmF1bHRzIHRvIDk2MDAgYmF1ZCBhZnRlciByZXNldAorICoKKyAqICAgICAgQWxnb3JpdGhtOgorICogICAgICAwLiBTZXQgUlRTIHRvIHJlc2V0IG1jcDIxMjAuCisgKiAgICAgIDEuIENsZWFyIFJUUyBhbmQgd2FpdCBmb3IgZGV2aWNlIHJlc2V0IHRpbWVyIG9mIDMwIG1zIChtYXgpLgorICogICAgICAKKyAqLworCisjZGVmaW5lIE1DUDIxMjBfU1RBVEVfV0FJVDFfUkVTRVQJKFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQrMSkKKyNkZWZpbmUgTUNQMjEyMF9TVEFURV9XQUlUMl9SRVNFVAkoU0lSREVWX1NUQVRFX0RPTkdMRV9SRVNFVCsyKQorCitzdGF0aWMgaW50IG1jcDIxMjBfcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBzdGF0ZSA9IGRldi0+ZnNtLnN1YnN0YXRlOworCXVuc2lnbmVkIGRlbGF5ID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUOgorICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwX3Jlc2V0OiBkb25nbGVfcmVzZXRcbiIpOworCQkvKiBSZXNldCBkb25nbGUgYnkgc2V0dGluZyBSVFMqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKwkJc3RhdGUgPSBNQ1AyMTIwX1NUQVRFX1dBSVQxX1JFU0VUOworCQlkZWxheSA9IDUwOworCQlicmVhazsKKworCWNhc2UgTUNQMjEyMF9TVEFURV9XQUlUMV9SRVNFVDoKKyAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMF9yZXNldDogbWNwMjEyMF93YWl0MVxuIik7CisgICAgICAgICAgICAgICAgLyogY2xlYXIgUlRTIGFuZCB3YWl0IGZvciBhdCBsZWFzdCAzMCBtcy4gKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIEZBTFNFKTsKKwkJc3RhdGUgPSBNQ1AyMTIwX1NUQVRFX1dBSVQyX1JFU0VUOworCQlkZWxheSA9IDUwOworCQlicmVhazsKKworCWNhc2UgTUNQMjEyMF9TVEFURV9XQUlUMl9SRVNFVDoKKyAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMF9yZXNldCBtY3AyMTIwX3dhaXQyXG4iKTsKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgRkFMU0UpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVuZGVmaW5lZCBzdGF0ZSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlkZXYtPmZzbS5zdWJzdGF0ZSA9IHN0YXRlOworCXJldHVybiAoZGVsYXkgPiAwKSA/IGRlbGF5IDogcmV0OworfQorCitNT0RVTEVfQVVUSE9SKCJGZWxpeCBUYW5nIDx0YW5nZkBleWV0YXAub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNaWNyb2NoaXAgTUNQMjEyMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS05Iik7IC8qIElSREFfTUNQMjEyMF9ET05HTEUgKi8KKworbW9kdWxlX2luaXQobWNwMjEyMF9zaXJfaW5pdCk7Cittb2R1bGVfZXhpdChtY3AyMTIwX3Npcl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvbWNwMjEyMC5jIGIvZHJpdmVycy9uZXQvaXJkYS9tY3AyMTIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2MTk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNwMjEyMC5jCkBAIC0wLDAgKzEsMjQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIAorICogICAgCisgKiBGaWxlbmFtZTogICAgICBtY3AyMTIwLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMAorICogRGVzY3JpcHRpb246ICAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBNQ1AyMTIwIChNaWNyb2NoaXApCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBGZWxpeCBUYW5nICh0YW5nZkBleWV0YXAub3JnKQorICogQ3JlYXRlZCBhdDogICAgU3VuIE1hciAzMSAxOTozMjoxMiBFU1QgMjAwMgorICogQmFzZWQgb24gY29kZSBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDIgRmVsaXggVGFuZywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKK3N0YXRpYyBpbnQgIG1jcDIxMjBfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgdm9pZCBtY3AyMTIwX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKTsKK3N0YXRpYyB2b2lkIG1jcDIxMjBfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpOworc3RhdGljIGludCAgbWNwMjEyMF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CisKKyNkZWZpbmUgTUNQMjEyMF85NjAwICAgIDB4ODcKKyNkZWZpbmUgTUNQMjEyMF8xOTIwMCAgIDB4OEIKKyNkZWZpbmUgTUNQMjEyMF8zODQwMCAgIDB4ODUKKyNkZWZpbmUgTUNQMjEyMF81NzYwMCAgIDB4ODMKKyNkZWZpbmUgTUNQMjEyMF8xMTUyMDAgIDB4ODEKKworI2RlZmluZSBNQ1AyMTIwX0NPTU1JVCAgMHgxMQorCitzdGF0aWMgc3RydWN0IGRvbmdsZV9yZWcgZG9uZ2xlID0geworCS50eXBlID0gSVJEQV9NQ1AyMTIwX0RPTkdMRSwKKwkub3BlbiA9IG1jcDIxMjBfb3BlbiwKKwkuY2xvc2UgPSBtY3AyMTIwX2Nsb3NlLAorCS5yZXNldCA9IG1jcDIxMjBfcmVzZXQsCisJLmNoYW5nZV9zcGVlZCA9IG1jcDIxMjBfY2hhbmdlX3NwZWVkLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWNwMjEyMF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1jcDIxMjBfY2xlYW51cCh2b2lkKQoreworCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBtY3AyMTIwX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAxOworfQorCitzdGF0aWMgdm9pZCBtY3AyMTIwX2Nsb3NlKGRvbmdsZV90ICpzZWxmKQoreworCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKyAgICAgICAgLyogcmVzZXQgYW5kIGluaGliaXQgbWNwMjEyMCAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisJLy9zZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBtY3AyMTIwX2NoYW5nZV9zcGVlZCAoZGV2LCBzcGVlZCkKKyAqCisgKiAgICBTZXQgdGhlIHNwZWVkIGZvciB0aGUgTUNQMjEyMC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgbWNwMjEyMF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwlfX3UzMiBzcGVlZCA9IChfX3UzMikgdGFzay0+cGFyYW07CisJX191OCBjb250cm9sWzJdOworCWludCByZXQgPSAwOworCisJc2VsZi0+c3BlZWRfdGFzayA9IHRhc2s7CisKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwkJLyogTmVlZCB0byByZXNldCB0aGUgZG9uZ2xlIGFuZCBnbyB0byA5NjAwIGJwcyBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICBwcm9ncmFtbWluZyAqLworICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJEbWNwMjEyMF9jaGFuZ2Vfc3BlZWQgaXJkYV90YXNrX2luaXRcbiIpOworCQlpZiAoaXJkYV90YXNrX2V4ZWN1dGUoc2VsZiwgbWNwMjEyMF9yZXNldCwgTlVMTCwgdGFzaywgCisJCQkJICAgICAgKHZvaWQgKikgc3BlZWQpKQorCQl7CisJCQkvKiBEb25nbGUgbmVlZCBtb3JlIHRpbWUgdG8gcmVzZXQgKi8KKwkJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19DSElMRF9XQUlUKTsKKworCQkJLyogR2l2ZSByZXNldCAxIHNlYyB0byBmaW5pc2ggKi8KKwkJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfV0FJVDoKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCByZXNldHRpbmcgZG9uZ2xlIHRpbWVkIG91dCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldCA9IC0xOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19DSElMRF9ET05FOgorCQkvKiBTZXQgRFRSIHRvIGVudGVyIGNvbW1hbmQgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICB1ZGVsYXkoNTAwKTsKKworCQlzd2l0Y2ggKHNwZWVkKSB7CisJCWNhc2UgOTYwMDoKKwkJZGVmYXVsdDoKKwkJCWNvbnRyb2xbMF0gPSBNQ1AyMTIwXzk2MDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMCA5NjAwXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwOgorCQkJY29udHJvbFswXSA9IE1DUDIxMjBfMTkyMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMCAxOTIwMFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAzNDgwMDoKKwkJCWNvbnRyb2xbMF0gPSBNQ1AyMTIwXzM4NDAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjAgMzg0MDBcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgNTc2MDA6CisJCQljb250cm9sWzBdID0gTUNQMjEyMF81NzYwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwIDU3NjAwXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDExNTIwMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xbMF0gPSBNQ1AyMTIwXzExNTIwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwIDExNTIwMFxuIik7CisJCQlicmVhazsKKwkJfQorCSAgICAgICAgY29udHJvbFsxXSA9IE1DUDIxMjBfQ09NTUlUOworCQorCQkvKiBXcml0ZSBjb250cm9sIGJ5dGVzICovCisgICAgICAgICAgICAgICAgc2VsZi0+d3JpdGUoc2VsZi0+ZGV2LCBjb250cm9sLCAyKTsKKyAKKyAgICAgICAgICAgICAgICBpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVCk7CisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKyAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMF9jaGFuZ2Vfc3BlZWQgaXJkYV9jaGlsZF9kb25lXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDoKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+c3BlZWRfdGFzayA9IE5VTEw7CisgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjBfY2hhbmdlX3NwZWVkIGlyZGFfdGFza193YWl0XG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgdGFzay0+c3RhdGUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnNwZWVkX3Rhc2sgPSBOVUxMOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBtY3AyMTIwX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgbWNwMjEyMCBkb25nbGUuCisgKiAgICAgIAorICogICAgICBJbmZvOiAtc2V0IFJUUyB0byByZXNldCBtY3AyMTIwCisgKiAgICAgICAgICAgIC1zZXQgRFRSIHRvIHNldCBtY3AyMTIwIHNvZnR3YXJlIGNvbW1hbmQgbW9kZQorICogICAgICAgICAgICAtbWNwMjEyMCBkZWZhdWx0cyB0byA5NjAwIGJhdWQgYWZ0ZXIgcmVzZXQKKyAqCisgKiAgICAgIEFsZ29yaXRobToKKyAqICAgICAgMC4gU2V0IFJUUyB0byByZXNldCBtY3AyMTIwLgorICogICAgICAxLiBDbGVhciBSVFMgYW5kIHdhaXQgZm9yIGRldmljZSByZXNldCB0aW1lciBvZiAzMCBtcyAobWF4KS4KKyAqICAgICAgCisgKi8KKworCitzdGF0aWMgaW50IG1jcDIxMjBfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwlpbnQgcmV0ID0gMDsKKworCXNlbGYtPnJlc2V0X3Rhc2sgPSB0YXNrOworCisJc3dpdGNoICh0YXNrLT5zdGF0ZSkgeworCWNhc2UgSVJEQV9UQVNLX0lOSVQ6CisgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjBfcmVzZXQgaXJkYV90YXNrX2luaXRcbiIpOworCQkvKiBSZXNldCBkb25nbGUgYnkgc2V0dGluZyBSVFMqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDEpOworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDUwKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDE6CisgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjBfcmVzZXQgaXJkYV90YXNrX3dhaXQxXG4iKTsKKyAgICAgICAgICAgICAgICAvKiBjbGVhciBSVFMgYW5kIHdhaXQgZm9yIGF0IGxlYXN0IDMwIG1zLiAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUMik7CisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoNTApOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19XQUlUMjoKKyAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMF9yZXNldCBpcmRhX3Rhc2tfd2FpdDJcbiIpOworCQkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgdGFzay0+c3RhdGUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK01PRFVMRV9BVVRIT1IoIkZlbGl4IFRhbmcgPHRhbmdmQGV5ZXRhcC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1pY3JvY2hpcCBNQ1AyMTIwIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTkiKTsgLyogSVJEQV9NQ1AyMTIwX0RPTkdMRSAqLworCQorLyoKKyAqIEZ1bmN0aW9uIGluaXRfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIEluaXRpYWxpemUgTUNQMjEyMCBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9pbml0KG1jcDIxMjBfaW5pdCk7CisKKy8qCisgKiBGdW5jdGlvbiBjbGVhbnVwX21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBDbGVhbnVwIE1DUDIxMjAgbW9kdWxlCisgKgorICovCittb2R1bGVfZXhpdChtY3AyMTIwX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5jIGIvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNTcxNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmMKQEAgLTAsMCArMSwyMjIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIG5zYy1pcmNjLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMAorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgTlNDIFBDJzEwOCBhbmQgUEMnMzM4IElyREEgY2hpcHNldHMKKyAqIFN0YXR1czogICAgICAgIFN0YWJsZS4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFNhdCBOb3YgIDcgMjE6NDM6MTUgMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgV2VkIE1hciAgMSAxMToyOTozNCAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4IExpY2hlbiBXYW5nLCA8bHdhbmdAYWN0aXN5cy5jb20+CisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4IEFjdGlzeXMgQ29ycC4sIHd3dy5hY3Rpc3lzLmNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqICAgICBOb3RpY2UgdGhhdCBhbGwgZnVuY3Rpb25zIHRoYXQgbmVlZHMgdG8gYWNjZXNzIHRoZSBjaGlwIGluIF9hbnlfCisgKiAgICAgd2F5LCBtdXN0IHNhdmUgQlNSIHJlZ2lzdGVyIG9uIGVudHJ5LCBhbmQgcmVzdG9yZSBpdCBvbiBleGl0LiAKKyAqICAgICBJdCBpcyBfdmVyeV8gaW1wb3J0YW50IHRvIGZvbGxvdyB0aGlzIHBvbGljeSEKKyAqCisgKiAgICAgICAgIF9fdTggYmFuazsKKyAqICAgICAKKyAqICAgICAgICAgYmFuayA9IGluYihpb2Jhc2UrQlNSKTsKKyAqICAKKyAqICAgICAgICAgZG9feW91cl9zdHVmZl9oZXJlKCk7CisgKgorICogICAgICAgICBvdXRiKGJhbmssIGlvYmFzZStCU1IpOworICoKKyAqICAgIElmIHlvdSBmaW5kIGJ1Z3MgaW4gdGhpcyBmaWxlLCBpdHMgdmVyeSBsaWtlbHkgdGhhdCB0aGUgc2FtZSBidWcKKyAqICAgIHdpbGwgYWxzbyBiZSBpbiB3ODM5NzdhZl9pci5jIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbnMgYXJlIHF1aXRlCisgKiAgICBzaW1pbGFyLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS93cmFwcGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKKyNpbmNsdWRlICJuc2MtaXJjYy5oIgorCisjZGVmaW5lIENISVBfSU9fRVhURU5UIDgKKyNkZWZpbmUgQlJPS0VOX0RPTkdMRV9JRAorCitzdGF0aWMgY2hhciAqZHJpdmVyX25hbWUgPSAibnNjLWlyY2MiOworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBxb3NfbXR0X2JpdHMgPSAweDA3OyAgLyogMSBtcyBvciBtb3JlICovCitzdGF0aWMgaW50IGRvbmdsZV9pZDsKKworLyogVXNlIEJJT1Mgc2V0dGlvbnMgYnkgZGVmYXVsdCwgYnV0IHVzZXIgbWF5IHN1cHBseSBtb2R1bGUgcGFyYW1ldGVycyAqLworc3RhdGljIHVuc2lnbmVkIGludCBpb1tdICA9IHsgfjAsIH4wLCB+MCwgfjAgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXJxW10gPSB7IDAsIDAsIDAsIDAsIDAgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZG1hW10gPSB7IDAsIDAsIDAsIDAsIDAgfTsKKworc3RhdGljIGludCBuc2NfaXJjY19wcm9iZV8xMDgobnNjX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOworc3RhdGljIGludCBuc2NfaXJjY19wcm9iZV8zMzgobnNjX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOworc3RhdGljIGludCBuc2NfaXJjY19wcm9iZV8zOXgobnNjX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOworc3RhdGljIGludCBuc2NfaXJjY19pbml0XzEwOChuc2NfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbyk7CitzdGF0aWMgaW50IG5zY19pcmNjX2luaXRfMzM4KG5zY19jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKTsKK3N0YXRpYyBpbnQgbnNjX2lyY2NfaW5pdF8zOXgobnNjX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOworCisvKiBUaGVzZSBhcmUgdGhlIGtub3duIE5TQyBjaGlwcyAqLworc3RhdGljIG5zY19jaGlwX3QgY2hpcHNbXSA9IHsKKy8qICBOYW1lLCB7Y2ZnIHJlZ2lzdGVyc30sIGNoaXAgaWQgaW5kZXggcmVnLCBjaGlwIGlkIGV4cGVjdGVkIHZhbHVlLCByZXZpc2lvbiBtYXNrICovCisJeyAiUEM4NzEwOCIsIHsgMHgxNTAsIDB4Mzk4LCAweGVhIH0sIDB4MDUsIDB4MTAsIDB4ZjAsIAorCSAgbnNjX2lyY2NfcHJvYmVfMTA4LCBuc2NfaXJjY19pbml0XzEwOCB9LAorCXsgIlBDODczMzgiLCB7IDB4Mzk4LCAweDE1YywgMHgyZSB9LCAweDA4LCAweGIwLCAweGY4LCAKKwkgIG5zY19pcmNjX3Byb2JlXzMzOCwgbnNjX2lyY2NfaW5pdF8zMzggfSwKKwkvKiBDb250cmlidXRlZCBieSBTdGVmZmVuIFBpbmdlbCAtIElCTSBYNDAgKi8KKwl7ICJQQzg3Mzh4IiwgeyAweDE2NGUsIDB4NGUsIDB4MCB9LCAweDIwLCAweGY0LCAweGZmLAorCSAgbnNjX2lyY2NfcHJvYmVfMzl4LCBuc2NfaXJjY19pbml0XzM5eCB9LAorCS8qIENvbnRyaWJ1dGVkIGJ5IEphbiBGcmV5IC0gSUJNIEEzMC9BMzEgKi8KKwl7ICJQQzg3Mzl4IiwgeyAweDJlLCAweDRlLCAweDAgfSwgMHgyMCwgMHhlYSwgMHhmZiwgCisJICBuc2NfaXJjY19wcm9iZV8zOXgsIG5zY19pcmNjX2luaXRfMzl4IH0sCisJeyBOVUxMIH0KK307CisKKy8qIE1heCA0IGluc3RhbmNlcyBmb3Igbm93ICovCitzdGF0aWMgc3RydWN0IG5zY19pcmNjX2NiICpkZXZfc2VsZltdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisKK3N0YXRpYyBjaGFyICpkb25nbGVfdHlwZXNbXSA9IHsKKwkiRGlmZmVyZW50aWFsIHNlcmlhbCBpbnRlcmZhY2UiLAorCSJEaWZmZXJlbnRpYWwgc2VyaWFsIGludGVyZmFjZSIsCisJIlJlc2VydmVkIiwKKwkiUmVzZXJ2ZWQiLAorCSJTaGFycCBSWTVIRDAxIiwKKwkiUmVzZXJ2ZWQiLAorCSJTaW5nbGUtZW5kZWQgc2VyaWFsIGludGVyZmFjZSIsCisJIkNvbnN1bWVyLUlSIG9ubHkiLAorCSJIUCBIU0RMLTIzMDAsIEhQIEhTREwtMzYwMC9IU0RMLTM2MTAiLAorCSJJQk0zMVQxMTAwIG9yIFRlbWljIFRGRFM2MDAwL1RGRFM2NTAwIiwKKwkiUmVzZXJ2ZWQiLAorCSJSZXNlcnZlZCIsCisJIkhQIEhTREwtMTEwMC9IU0RMLTIxMDAiLAorCSJIUCBIU0RMLTExMDAvSFNETC0yMTAwIiwKKwkiU3VwcG9ydHMgU0lSIE1vZGUgb25seSIsCisJIk5vIGRvbmdsZSBjb25uZWN0ZWQiLAorfTsKKworLyogU29tZSBwcm90b3R5cGVzICovCitzdGF0aWMgaW50ICBuc2NfaXJjY19vcGVuKGludCBpLCBjaGlwaW9fdCAqaW5mbyk7CitzdGF0aWMgaW50ICBuc2NfaXJjY19jbG9zZShzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCAgbnNjX2lyY2Nfc2V0dXAoY2hpcGlvX3QgKmluZm8pOworc3RhdGljIHZvaWQgbnNjX2lyY2NfcGlvX3JlY2VpdmUoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgIG5zY19pcmNjX2RtYV9yZWNlaXZlKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZik7IAorc3RhdGljIGludCAgbnNjX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKTsKK3N0YXRpYyBpbnQgIG5zY19pcmNjX2hhcmRfeG1pdF9zaXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBuc2NfaXJjY19oYXJkX3htaXRfZmlyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgbnNjX2lyY2NfcGlvX3dyaXRlKGludCBpb2Jhc2UsIF9fdTggKmJ1ZiwgaW50IGxlbiwgaW50IGZpZm9fc2l6ZSk7CitzdGF0aWMgdm9pZCBuc2NfaXJjY19kbWFfeG1pdChzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpOworc3RhdGljIF9fdTggbnNjX2lyY2NfY2hhbmdlX3NwZWVkKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZiwgX191MzIgYmF1ZCk7CitzdGF0aWMgaW50ICBuc2NfaXJjY19pc19yZWNlaXZpbmcoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgIG5zY19pcmNjX3JlYWRfZG9uZ2xlX2lkIChpbnQgaW9iYXNlKTsKK3N0YXRpYyB2b2lkIG5zY19pcmNjX2luaXRfZG9uZ2xlX2ludGVyZmFjZSAoaW50IGlvYmFzZSwgaW50IGRvbmdsZV9pZCk7CisKK3N0YXRpYyBpbnQgIG5zY19pcmNjX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgbnNjX2lyY2NfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgbnNjX2lyY2NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuc2NfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuc2NfaXJjY19wbXByb2Moc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZGF0YSk7CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19pbml0ICgpCisgKgorICogICAgSW5pdGlhbGl6ZSBjaGlwLiBKdXN0IHRyeSB0byBmaW5kIG91dCBob3cgbWFueSBjaGlwcyB3ZSBhcmUgZGVhbGluZyB3aXRoCisgKiAgICBhbmQgd2hlcmUgdGhleSBhcmUKKyAqLworc3RhdGljIGludCBfX2luaXQgbnNjX2lyY2NfaW5pdCh2b2lkKQoreworCWNoaXBpb190IGluZm87CisJbnNjX2NoaXBfdCAqY2hpcDsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKwlpbnQgY2ZnX2Jhc2U7CisJaW50IGNmZywgaWQ7CisJaW50IHJlZzsKKwlpbnQgaSA9IDA7CisKKwkvKiBQcm9iZSBmb3IgYWxsIHRoZSBOU0MgY2hpcHNldHMgd2Uga25vdyBhYm91dCAqLworCWZvciAoY2hpcD1jaGlwczsgY2hpcC0+bmFtZSA7IGNoaXArKykgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBQcm9iaW5nIGZvciAlcyAuLi5cbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgIGNoaXAtPm5hbWUpOworCQkKKwkJLyogVHJ5IGFsbCBjb25maWcgcmVnaXN0ZXJzIGZvciB0aGlzIGNoaXAgKi8KKwkJZm9yIChjZmc9MDsgY2ZnPDM7IGNmZysrKSB7CisJCQljZmdfYmFzZSA9IGNoaXAtPmNmZ1tjZmddOworCQkJaWYgKCFjZmdfYmFzZSkKKwkJCQljb250aW51ZTsKKwkJCQorCQkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoY2hpcGlvX3QpKTsKKwkJCWluZm8uY2ZnX2Jhc2UgPSBjZmdfYmFzZTsKKwkJCWluZm8uZmlyX2Jhc2UgPSBpb1tpXTsKKwkJCWluZm8uZG1hID0gZG1hW2ldOworCQkJaW5mby5pcnEgPSBpcnFbaV07CisKKwkJCS8qIFJlYWQgaW5kZXggcmVnaXN0ZXIgKi8KKwkJCXJlZyA9IGluYihjZmdfYmFzZSk7CisJCQlpZiAocmVnID09IDB4ZmYpIHsKKwkJCQlJUkRBX0RFQlVHKDIsICIlcygpIG5vIGNoaXAgYXQgMHglMDN4XG4iLCBfX0ZVTkNUSU9OX18sIGNmZ19iYXNlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCQorCQkJLyogUmVhZCBjaGlwIGlkZW50aWZpY2F0aW9uIHJlZ2lzdGVyICovCisJCQlvdXRiKGNoaXAtPmNpZF9pbmRleCwgY2ZnX2Jhc2UpOworCQkJaWQgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJCQlpZiAoKGlkICYgY2hpcC0+Y2lkX21hc2spID09IGNoaXAtPmNpZF92YWx1ZSkgeworCQkJCUlSREFfREVCVUcoMiwgIiVzKCkgRm91bmQgJXMgY2hpcCwgcmV2aXNpb249JWRcbiIsCisJCQkJCSAgIF9fRlVOQ1RJT05fXywgY2hpcC0+bmFtZSwgaWQgJiB+Y2hpcC0+Y2lkX21hc2spOworCQkJCS8qIAorCQkJCSAqIElmIHRoZSB1c2VyIHN1cHBsaWVzIHRoZSBiYXNlIGFkZHJlc3MsIHRoZW4KKwkJCQkgKiB3ZSBpbml0IHRoZSBjaGlwLCBpZiBub3Qgd2UgcHJvYmUgdGhlIHZhbHVlcworCQkJCSAqIHNldCBieSB0aGUgQklPUworCQkJCSAqLwkJCQkKKwkJCQlpZiAoaW9baV0gPCAweDIwMDApIHsKKwkJCQkJY2hpcC0+aW5pdChjaGlwLCAmaW5mbyk7CisJCQkJfSBlbHNlCisJCQkJCWNoaXAtPnByb2JlKGNoaXAsICZpbmZvKTsKKworCQkJCWlmIChuc2NfaXJjY19vcGVuKGksICZpbmZvKSA9PSAwKQorCQkJCQlyZXQgPSAwOworCQkJCWkrKzsKKwkJCX0gZWxzZSB7CisJCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgV3JvbmcgY2hpcCBpZD0weCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgaWQpOworCQkJfQorCQl9IAorCQkKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfY2xlYW51cCAoKQorICoKKyAqICAgIENsb3NlIGFsbCBjb25maWd1cmVkIGNoaXBzCisgKgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgbnNjX2lyY2NfY2xlYW51cCh2b2lkKQoreworCWludCBpOworCisJcG1fdW5yZWdpc3Rlcl9hbGwobnNjX2lyY2NfcG1wcm9jKTsKKworCWZvciAoaT0wOyBpIDwgNDsgaSsrKSB7CisJCWlmIChkZXZfc2VsZltpXSkKKwkJCW5zY19pcmNjX2Nsb3NlKGRldl9zZWxmW2ldKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19vcGVuIChpb2Jhc2UsIGlycSkKKyAqCisgKiAgICBPcGVuIGRyaXZlciBpbnN0YW5jZQorICoKKyAqLworc3RhdGljIGludCBfX2luaXQgbnNjX2lyY2Nfb3BlbihpbnQgaSwgY2hpcGlvX3QgKmluZm8pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGY7CisgICAgICAgIHN0cnVjdCBwbV9kZXYgKnBtZGV2OworCXZvaWQgKnJldDsKKwlpbnQgZXJyOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfTUVTU0FHRSgiJXMsIEZvdW5kIGNoaXAgYXQgYmFzZT0weCUwM3hcbiIsIGRyaXZlcl9uYW1lLAorCQkgICAgIGluZm8tPmNmZ19iYXNlKTsKKworCWlmICgobnNjX2lyY2Nfc2V0dXAoaW5mbykpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwlJUkRBX01FU1NBR0UoIiVzLCBkcml2ZXIgbG9hZGVkIChEYWcgQnJhdHRsaSlcbiIsIGRyaXZlcl9uYW1lKTsKKworCWRldiA9IGFsbG9jX2lyZGFkZXYoc2l6ZW9mKHN0cnVjdCBuc2NfaXJjY19jYikpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlJUkRBX0VSUk9SKCIlcygpLCBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKwkJCSAgICJjb250cm9sIGJsb2NrIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc2VsZiA9IGRldi0+cHJpdjsKKwlzZWxmLT5uZXRkZXYgPSBkZXY7CisJc3Bpbl9sb2NrX2luaXQoJnNlbGYtPmxvY2spOworICAgCisJLyogTmVlZCB0byBzdG9yZSBzZWxmIHNvbWV3aGVyZSAqLworCWRldl9zZWxmW2ldID0gc2VsZjsKKwlzZWxmLT5pbmRleCA9IGk7CisKKwkvKiBJbml0aWFsaXplIElPICovCisJc2VsZi0+aW8uY2ZnX2Jhc2UgID0gaW5mby0+Y2ZnX2Jhc2U7CisJc2VsZi0+aW8uZmlyX2Jhc2UgID0gaW5mby0+ZmlyX2Jhc2U7CisgICAgICAgIHNlbGYtPmlvLmlycSAgICAgICA9IGluZm8tPmlycTsKKyAgICAgICAgc2VsZi0+aW8uZmlyX2V4dCAgID0gQ0hJUF9JT19FWFRFTlQ7CisgICAgICAgIHNlbGYtPmlvLmRtYSAgICAgICA9IGluZm8tPmRtYTsKKyAgICAgICAgc2VsZi0+aW8uZmlmb19zaXplID0gMzI7CisJCisJLyogUmVzZXJ2ZSB0aGUgaW9wb3J0cyB0aGF0IHdlIG5lZWQgKi8KKwlyZXQgPSByZXF1ZXN0X3JlZ2lvbihzZWxmLT5pby5maXJfYmFzZSwgc2VsZi0+aW8uZmlyX2V4dCwgZHJpdmVyX25hbWUpOworCWlmICghcmV0KSB7CisJCUlSREFfV0FSTklORygiJXMoKSwgY2FuJ3QgZ2V0IGlvYmFzZSBvZiAweCUwM3hcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgc2VsZi0+aW8uZmlyX2Jhc2UpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDE7CisJfQorCisJLyogSW5pdGlhbGl6ZSBRb1MgZm9yIHRoaXMgZGV2aWNlICovCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc2VsZi0+cW9zKTsKKwkKKwkvKiBUaGUgb25seSB2YWx1ZSB3ZSBtdXN0IG92ZXJyaWRlIGl0IHRoZSBiYXVkcmF0ZSAqLworCXNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyA9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8CisJCUlSXzExNTIwMHxJUl81NzYwMDB8SVJfMTE1MjAwMCB8KElSXzQwMDAwMDAgPDwgOCk7CisJCisJc2VsZi0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyA9IHFvc19tdHRfYml0czsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZzZWxmLT5xb3MpOworCQorCS8qIE1heCBETUEgYnVmZmVyIHNpemUgbmVlZGVkID0gKGRhdGFfc2l6ZSArIDYpICogKHdpbmRvd19zaXplKSArIDY7ICovCisJc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSA9IDE0Mzg0OyAKKwlzZWxmLT50eF9idWZmLnRydWVzaXplID0gMTQzODQ7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgaWYgbmVlZGVkICovCisJc2VsZi0+cnhfYnVmZi5oZWFkID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICAgJnNlbGYtPnJ4X2J1ZmZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+cnhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQyOworCisJfQorCW1lbXNldChzZWxmLT5yeF9idWZmLmhlYWQsIDAsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUpOworCQorCXNlbGYtPnR4X2J1ZmYuaGVhZCA9CisJCWRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBzZWxmLT50eF9idWZmLnRydWVzaXplLAorCQkJCSAgICZzZWxmLT50eF9idWZmX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNlbGYtPnR4X2J1ZmYuaGVhZCA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0MzsKKwl9CisJbWVtc2V0KHNlbGYtPnR4X2J1ZmYuaGVhZCwgMCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CisKKwlzZWxmLT5yeF9idWZmLmluX2ZyYW1lID0gRkFMU0U7CisJc2VsZi0+cnhfYnVmZi5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCXNlbGYtPnJ4X2J1ZmYuZGF0YSA9IHNlbGYtPnJ4X2J1ZmYuaGVhZDsKKwkKKwkvKiBSZXNldCBUeCBxdWV1ZSBpbmZvICovCisJc2VsZi0+dHhfZmlmby5sZW4gPSBzZWxmLT50eF9maWZvLnB0ciA9IHNlbGYtPnR4X2ZpZm8uZnJlZSA9IDA7CisJc2VsZi0+dHhfZmlmby50YWlsID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCisJLyogT3ZlcnJpZGUgdGhlIG5ldHdvcmsgZnVuY3Rpb25zIHdlIG5lZWQgdG8gdXNlICovCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbnNjX2lyY2NfaGFyZF94bWl0X3NpcjsKKwlkZXYtPm9wZW4gICAgICAgICAgICA9IG5zY19pcmNjX25ldF9vcGVuOworCWRldi0+c3RvcCAgICAgICAgICAgID0gbnNjX2lyY2NfbmV0X2Nsb3NlOworCWRldi0+ZG9faW9jdGwgICAgICAgID0gbnNjX2lyY2NfbmV0X2lvY3RsOworCWRldi0+Z2V0X3N0YXRzCSAgICAgPSBuc2NfaXJjY19uZXRfZ2V0X3N0YXRzOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlJUkRBX0VSUk9SKCIlcygpLCByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDQ7CisJfQorCUlSREFfTUVTU0FHRSgiSXJEQTogUmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsIGRldi0+bmFtZSk7CisKKwkvKiBDaGVjayBpZiB1c2VyIGhhcyBzdXBwbGllZCBhIHZhbGlkIGRvbmdsZSBpZCBvciBub3QgKi8KKwlpZiAoKGRvbmdsZV9pZCA8PSAwKSB8fAorCSAgICAoZG9uZ2xlX2lkID49IChzaXplb2YoZG9uZ2xlX3R5cGVzKSAvIHNpemVvZihkb25nbGVfdHlwZXNbMF0pKSkgKSB7CisJCWRvbmdsZV9pZCA9IG5zY19pcmNjX3JlYWRfZG9uZ2xlX2lkKHNlbGYtPmlvLmZpcl9iYXNlKTsKKwkJCisJCUlSREFfTUVTU0FHRSgiJXMsIEZvdW5kIGRvbmdsZTogJXNcbiIsIGRyaXZlcl9uYW1lLAorCQkJICAgICBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7CisJfSBlbHNlIHsKKwkJSVJEQV9NRVNTQUdFKCIlcywgVXNpbmcgZG9uZ2xlOiAlc1xuIiwgZHJpdmVyX25hbWUsCisJCQkgICAgIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsKKwl9CisJCisJc2VsZi0+aW8uZG9uZ2xlX2lkID0gZG9uZ2xlX2lkOworCW5zY19pcmNjX2luaXRfZG9uZ2xlX2ludGVyZmFjZShzZWxmLT5pby5maXJfYmFzZSwgZG9uZ2xlX2lkKTsKKworICAgICAgICBwbWRldiA9IHBtX3JlZ2lzdGVyKFBNX1NZU19ERVYsIFBNX1NZU19JUkRBLCBuc2NfaXJjY19wbXByb2MpOworICAgICAgICBpZiAocG1kZXYpCisgICAgICAgICAgICAgICAgcG1kZXYtPmRhdGEgPSBzZWxmOworCisJcmV0dXJuIDA7Cisgb3V0NDoKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT50eF9idWZmLnRydWVzaXplLAorCQkJICBzZWxmLT50eF9idWZmLmhlYWQsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKKyBvdXQzOgorCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkgIHNlbGYtPnJ4X2J1ZmYuaGVhZCwgc2VsZi0+cnhfYnVmZl9kbWEpOworIG91dDI6CisJcmVsZWFzZV9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQpOworIG91dDE6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlkZXZfc2VsZltpXSA9IE5VTEw7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2Nsb3NlIChzZWxmKQorICoKKyAqICAgIENsb3NlIGRyaXZlciBpbnN0YW5jZQorICoKKyAqLworc3RhdGljIGludCBfX2V4aXQgbnNjX2lyY2NfY2xvc2Uoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworICAgICAgICBpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCS8qIFJlbW92ZSBuZXRkZXZpY2UgKi8KKwl1bnJlZ2lzdGVyX25ldGRldihzZWxmLT5uZXRkZXYpOworCisJLyogUmVsZWFzZSB0aGUgUE9SVCB0aGF0IHRoaXMgZHJpdmVyIGlzIHVzaW5nICovCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgUmVsZWFzaW5nIFJlZ2lvbiAlMDN4XG4iLCAKKwkJICAgX19GVU5DVElPTl9fLCBzZWxmLT5pby5maXJfYmFzZSk7CisJcmVsZWFzZV9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQpOworCisJaWYgKHNlbGYtPnR4X2J1ZmYuaGVhZCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgIHNlbGYtPnR4X2J1ZmYuaGVhZCwgc2VsZi0+dHhfYnVmZl9kbWEpOworCQorCWlmIChzZWxmLT5yeF9idWZmLmhlYWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKKworCWRldl9zZWxmW3NlbGYtPmluZGV4XSA9IE5VTEw7CisJZnJlZV9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2luaXRfMTA4IChpb2Jhc2UsIGNmZ19iYXNlLCBpcnEsIGRtYSkKKyAqCisgKiAgICBJbml0aWFsaXplIHRoZSBOU0MgJzEwOCBjaGlwCisgKgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX2luaXRfMTA4KG5zY19jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKQoreworCWludCBjZmdfYmFzZSA9IGluZm8tPmNmZ19iYXNlOworCV9fdTggdGVtcD0wOworCisJb3V0YigyLCBjZmdfYmFzZSk7ICAgICAgLyogTW9kZSBDb250cm9sIFJlZ2lzdGVyIChNQ1RMKSAqLworCW91dGIoMHgwMCwgY2ZnX2Jhc2UrMSk7IC8qIERpc2FibGUgZGV2aWNlICovCisJCisJLyogQmFzZSBBZGRyZXNzIGFuZCBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAoQkFJQykgKi8KKwlvdXRiKENGR18xMDhfQkFJQywgY2ZnX2Jhc2UpOworCXN3aXRjaCAoaW5mby0+ZmlyX2Jhc2UpIHsKKwljYXNlIDB4M2U4OiBvdXRiKDB4MTQsIGNmZ19iYXNlKzEpOyBicmVhazsKKwljYXNlIDB4MmU4OiBvdXRiKDB4MTUsIGNmZ19iYXNlKzEpOyBicmVhazsKKwljYXNlIDB4M2Y4OiBvdXRiKDB4MTYsIGNmZ19iYXNlKzEpOyBicmVhazsKKwljYXNlIDB4MmY4OiBvdXRiKDB4MTcsIGNmZ19iYXNlKzEpOyBicmVhazsKKwlkZWZhdWx0OiBJUkRBX0VSUk9SKCIlcygpLCBpbnZhbGlkIGJhc2VfYWRkcmVzcyIsIF9fRlVOQ1RJT05fXyk7CisJfQorCQorCS8qIENvbnRyb2wgU2lnbmFsIFJvdXRpbmcgUmVnaXN0ZXIgKENTUlQpICovCisJc3dpdGNoIChpbmZvLT5pcnEpIHsKKwljYXNlIDM6ICB0ZW1wID0gMHgwMTsgYnJlYWs7CisJY2FzZSA0OiAgdGVtcCA9IDB4MDI7IGJyZWFrOworCWNhc2UgNTogIHRlbXAgPSAweDAzOyBicmVhazsKKwljYXNlIDc6ICB0ZW1wID0gMHgwNDsgYnJlYWs7CisJY2FzZSA5OiAgdGVtcCA9IDB4MDU7IGJyZWFrOworCWNhc2UgMTE6IHRlbXAgPSAweDA2OyBicmVhazsKKwljYXNlIDE1OiB0ZW1wID0gMHgwNzsgYnJlYWs7CisJZGVmYXVsdDogSVJEQV9FUlJPUigiJXMoKSwgaW52YWxpZCBpcnEiLCBfX0ZVTkNUSU9OX18pOworCX0KKwlvdXRiKENGR18xMDhfQ1NSVCwgY2ZnX2Jhc2UpOworCQorCXN3aXRjaCAoaW5mby0+ZG1hKSB7CQorCWNhc2UgMDogb3V0YigweDA4K3RlbXAsIGNmZ19iYXNlKzEpOyBicmVhazsKKwljYXNlIDE6IG91dGIoMHgxMCt0ZW1wLCBjZmdfYmFzZSsxKTsgYnJlYWs7CisJY2FzZSAzOiBvdXRiKDB4MTgrdGVtcCwgY2ZnX2Jhc2UrMSk7IGJyZWFrOworCWRlZmF1bHQ6IElSREFfRVJST1IoIiVzKCksIGludmFsaWQgZG1hIiwgX19GVU5DVElPTl9fKTsKKwl9CisJCisJb3V0YihDRkdfMTA4X01DVEwsIGNmZ19iYXNlKTsgICAgICAvKiBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKE1DVEwpICovCisJb3V0YigweDAzLCBjZmdfYmFzZSsxKTsgLyogRW5hYmxlIGRldmljZSAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19wcm9iZV8xMDggKGNoaXAsIGluZm8pCisgKgorICogICAgCisgKgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX3Byb2JlXzEwOChuc2NfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbykgCit7CisJaW50IGNmZ19iYXNlID0gaW5mby0+Y2ZnX2Jhc2U7CisJaW50IHJlZzsKKworCS8qIFJlYWQgYWRkcmVzcyBhbmQgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgKEJBSUMpICovCisJb3V0YihDRkdfMTA4X0JBSUMsIGNmZ19iYXNlKTsKKwlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJCisJc3dpdGNoIChyZWcgJiAweDAzKSB7CisJY2FzZSAwOgorCQlpbmZvLT5maXJfYmFzZSA9IDB4M2U4OworCQlicmVhazsKKwljYXNlIDE6CisJCWluZm8tPmZpcl9iYXNlID0gMHgyZTg7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaW5mby0+ZmlyX2Jhc2UgPSAweDNmODsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpbmZvLT5maXJfYmFzZSA9IDB4MmY4OworCQlicmVhazsKKwl9CisJaW5mby0+c2lyX2Jhc2UgPSBpbmZvLT5maXJfYmFzZTsKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBwcm9iaW5nIGZpcl9iYXNlPTB4JTAzeFxuIiwgX19GVU5DVElPTl9fLAorCQkgICBpbmZvLT5maXJfYmFzZSk7CisKKwkvKiBSZWFkIGNvbnRyb2wgc2lnbmFscyByb3V0aW5nIHJlZ2lzdGVyIChDU1JUKSAqLworCW91dGIoQ0ZHXzEwOF9DU1JULCBjZmdfYmFzZSk7CisJcmVnID0gaW5iKGNmZ19iYXNlKzEpOworCisJc3dpdGNoIChyZWcgJiAweDA3KSB7CisJY2FzZSAwOgorCQlpbmZvLT5pcnEgPSAtMTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpbmZvLT5pcnEgPSAzOworCQlicmVhazsKKwljYXNlIDI6CisJCWluZm8tPmlycSA9IDQ7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaW5mby0+aXJxID0gNTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpbmZvLT5pcnEgPSA3OworCQlicmVhazsKKwljYXNlIDU6CisJCWluZm8tPmlycSA9IDk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJaW5mby0+aXJxID0gMTE7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJaW5mby0+aXJxID0gMTU7CisJCWJyZWFrOworCX0KKwlJUkRBX0RFQlVHKDIsICIlcygpLCBwcm9iaW5nIGlycT0lZFxuIiwgX19GVU5DVElPTl9fLCBpbmZvLT5pcnEpOworCisJLyogQ3VycmVudGx5IHdlIG9ubHkgcmVhZCBSeCBETUEgYnV0IGl0IHdpbGwgYWxzbyBiZSB1c2VkIGZvciBUeCAqLworCXN3aXRjaCAoKHJlZyA+PiAzKSAmIDB4MDMpIHsKKwljYXNlIDA6CisJCWluZm8tPmRtYSA9IC0xOworCQlicmVhazsKKwljYXNlIDE6CisJCWluZm8tPmRtYSA9IDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaW5mby0+ZG1hID0gMTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpbmZvLT5kbWEgPSAzOworCQlicmVhazsKKwl9CisJSVJEQV9ERUJVRygyLCAiJXMoKSwgcHJvYmluZyBkbWE9JWRcbiIsIF9fRlVOQ1RJT05fXywgaW5mby0+ZG1hKTsKKworCS8qIFJlYWQgbW9kZSBjb250cm9sIHJlZ2lzdGVyIChNQ1RMKSAqLworCW91dGIoQ0ZHXzEwOF9NQ1RMLCBjZmdfYmFzZSk7CisJcmVnID0gaW5iKGNmZ19iYXNlKzEpOworCisJaW5mby0+ZW5hYmxlZCA9IHJlZyAmIDB4MDE7CisJaW5mby0+c3VzcGVuZGVkID0gISgocmVnID4+IDEpICYgMHgwMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2luaXRfMzM4IChjaGlwLCBpbmZvKQorICoKKyAqICAgIEluaXRpYWxpemUgdGhlIE5TQyAnMzM4IGNoaXAuIFJlbWVtYmVyIHRoYXQgdGhlIDg3MzM4IG5lZWRzIHR3byAKKyAqICAgIGNvbnNlY3V0aXZlIHdyaXRlcyB0byB0aGUgZGF0YSByZWdpc3RlcnMgd2hpbGUgQ1BVIGludGVycnVwdHMgYXJlCisgKiAgICBkaXNhYmxlZC4gVGhlIDk3MzM4IGRvZXMgbm90IHJlcXVpcmUgdGhpcywgYnV0IHNob3VsZG4ndCBiZSBhbnkKKyAqICAgIGhhcm0gaWYgd2UgZG8gaXQgYW55d2F5LgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX2luaXRfMzM4KG5zY19jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKSAKK3sKKwkvKiBObyBpbml0IHlldCAqLworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfcHJvYmVfMzM4IChjaGlwLCBpbmZvKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIGludCBuc2NfaXJjY19wcm9iZV8zMzgobnNjX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pIAoreworCWludCBjZmdfYmFzZSA9IGluZm8tPmNmZ19iYXNlOworCWludCByZWcsIGNvbSA9IDA7CisJaW50IHBucDsKKworCS8qIFJlYWQgZnVudGlvbiBlbmFibGUgcmVnaXN0ZXIgKEZFUikgKi8KKwlvdXRiKENGR18zMzhfRkVSLCBjZmdfYmFzZSk7CisJcmVnID0gaW5iKGNmZ19iYXNlKzEpOworCisJaW5mby0+ZW5hYmxlZCA9IChyZWcgPj4gMikgJiAweDAxOworCisJLyogQ2hlY2sgaWYgd2UgYXJlIGluIExlZ2FjeSBvciBQblAgbW9kZSAqLworCW91dGIoQ0ZHXzMzOF9QTlAwLCBjZmdfYmFzZSk7CisJcmVnID0gaW5iKGNmZ19iYXNlKzEpOworCQorCXBucCA9IChyZWcgPj4gMykgJiAweDAxOworCWlmIChwbnApIHsKKwkJSVJEQV9ERUJVRygyLCAiKCksIENoaXAgaXMgaW4gUG5QIG1vZGVcbiIpOworCQlvdXRiKDB4NDYsIGNmZ19iYXNlKTsKKwkJcmVnID0gKGluYihjZmdfYmFzZSsxKSAmIDB4ZmUpIDw8IDI7CisKKwkJb3V0YigweDQ3LCBjZmdfYmFzZSk7CisJCXJlZyB8PSAoKGluYihjZmdfYmFzZSsxKSAmIDB4ZmMpIDw8IDgpOworCisJCWluZm8tPmZpcl9iYXNlID0gcmVnOworCX0gZWxzZSB7CisJCS8qIFJlYWQgZnVuY3Rpb24gYWRkcmVzcyByZWdpc3RlciAoRkFSKSAqLworCQlvdXRiKENGR18zMzhfRkFSLCBjZmdfYmFzZSk7CisJCXJlZyA9IGluYihjZmdfYmFzZSsxKTsKKwkJCisJCXN3aXRjaCAoKHJlZyA+PiA0KSAmIDB4MDMpIHsKKwkJY2FzZSAwOgorCQkJaW5mby0+ZmlyX2Jhc2UgPSAweDNmODsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpbmZvLT5maXJfYmFzZSA9IDB4MmY4OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWNvbSA9IDM7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJY29tID0gNDsKKwkJCWJyZWFrOworCQl9CisJCQorCQlpZiAoY29tKSB7CisJCQlzd2l0Y2ggKChyZWcgPj4gNikgJiAweDAzKSB7CisJCQljYXNlIDA6CisJCQkJaWYgKGNvbSA9PSAzKQorCQkJCQlpbmZvLT5maXJfYmFzZSA9IDB4M2U4OworCQkJCWVsc2UKKwkJCQkJaW5mby0+ZmlyX2Jhc2UgPSAweDJlODsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlpZiAoY29tID09IDMpCisJCQkJCWluZm8tPmZpcl9iYXNlID0gMHgzMzg7CisJCQkJZWxzZQorCQkJCQlpbmZvLT5maXJfYmFzZSA9IDB4MjM4OworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWlmIChjb20gPT0gMykKKwkJCQkJaW5mby0+ZmlyX2Jhc2UgPSAweDJlODsKKwkJCQllbHNlCisJCQkJCWluZm8tPmZpcl9iYXNlID0gMHgyZTA7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJaWYgKGNvbSA9PSAzKQorCQkJCQlpbmZvLT5maXJfYmFzZSA9IDB4MjIwOworCQkJCWVsc2UKKwkJCQkJaW5mby0+ZmlyX2Jhc2UgPSAweDIyODsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpbmZvLT5zaXJfYmFzZSA9IGluZm8tPmZpcl9iYXNlOworCisJLyogUmVhZCBQblAgcmVnaXN0ZXIgMSAoUE5QMSkgKi8KKwlvdXRiKENGR18zMzhfUE5QMSwgY2ZnX2Jhc2UpOworCXJlZyA9IGluYihjZmdfYmFzZSsxKTsKKwkKKwlpbmZvLT5pcnEgPSByZWcgPj4gNDsKKwkKKwkvKiBSZWFkIFBuUCByZWdpc3RlciAzIChQTlAzKSAqLworCW91dGIoQ0ZHXzMzOF9QTlAzLCBjZmdfYmFzZSk7CisJcmVnID0gaW5iKGNmZ19iYXNlKzEpOworCisJaW5mby0+ZG1hID0gKHJlZyAmIDB4MDcpIC0gMTsKKworCS8qIFJlYWQgcG93ZXIgYW5kIHRlc3QgcmVnaXN0ZXIgKFBUUikgKi8KKwlvdXRiKENGR18zMzhfUFRSLCBjZmdfYmFzZSk7CisJcmVnID0gaW5iKGNmZ19iYXNlKzEpOworCisJaW5mby0+c3VzcGVuZGVkID0gcmVnICYgMHgwMTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19pbml0XzM5eCAoY2hpcCwgaW5mbykKKyAqCisgKiAgICBOb3cgdGhhdCB3ZSBrbm93IGl0J3MgYSAnMzl4IChzZWUgcHJvYmUgYmVsb3cpLCB3ZSBuZWVkIHRvCisgKiAgICBjb25maWd1cmUgaXQgc28gd2UgY2FuIHVzZSBpdC4KKyAqCisgKiBUaGUgTlNDICczMzggY2hpcCBpcyBhIFN1cGVyIEkvTyBjaGlwIHdpdGggYSAiYmFuayIgYXJjaGl0ZWN0dXJlLAorICogdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGRpZmZlcmVudCBmdW5jdGlvbmFsaXR5IChzZXJpYWwsIHBhcmFsbGVsLAorICogZmxvcHB5Li4uKSBhcmUgZWFjaCBpbiBhIGRpZmZlcmVudCBiYW5rIChMb2dpY2FsIERldmljZSBOdW1iZXIpLgorICogVGhlIGJhc2UgYWRkcmVzcywgaXJxIGFuZCBkbWEgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgYXJlIGNvbW1vbgorICogdG8gYWxsIGZ1bmN0aW9uYWxpdGllcyAoaW5kZXggMHgzMCB0byAweDdGKS4KKyAqIFRoZXJlIGlzIG9ubHkgb25lIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgc3BlY2lmaWMgdG8gdGhlCisgKiBzZXJpYWwgcG9ydCwgQ0ZHXzM5WF9TUEMuCisgKiBKZWFuSUkKKyAqCisgKiBOb3RlIDogdGhpcyBjb2RlIHdhcyB3cml0dGVuIGJ5IEphbiBGcmV5IDxqYW5mcmV5QHdlYi5kZT4KKyAqLworc3RhdGljIGludCBuc2NfaXJjY19pbml0XzM5eChuc2NfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbykgCit7CisJaW50IGNmZ19iYXNlID0gaW5mby0+Y2ZnX2Jhc2U7CisJaW50IGVuYWJsZWQ7CisKKwkvKiBVc2VyIGlzIHNodXJlIGFib3V0IGhpcyBjb25maWcuLi4gYWNjZXB0IGl0LiAqLworCUlSREFfREVCVUcoMiwgIiVzKCk6IG5zY19pcmNjX2luaXRfMzl4ICh1c2VyIHNldHRpbmdzKTogIgorCQkgICAiaW89MHglMDR4LCBpcnE9JWQsIGRtYT0lZFxuIiwgCisJCSAgIF9fRlVOQ1RJT05fXywgaW5mby0+ZmlyX2Jhc2UsIGluZm8tPmlycSwgaW5mby0+ZG1hKTsKKworCS8qIEFjY2VzcyBiYW5rIGZvciBTUDIgKi8KKwlvdXRiKENGR18zOVhfTEROLCBjZmdfYmFzZSk7CisJb3V0YigweDAyLCBjZmdfYmFzZSsxKTsKKworCS8qIENvbmZpZ3VyZSBTUDIgKi8KKworCS8qIFdlIHdhbnQgdG8gZW5hYmxlIHRoZSBkZXZpY2UgaWYgbm90IGVuYWJsZWQgKi8KKwlvdXRiKENGR18zOVhfQUNULCBjZmdfYmFzZSk7CisJZW5hYmxlZCA9IGluYihjZmdfYmFzZSsxKSAmIDB4MDE7CisJCisJaWYgKCFlbmFibGVkKSB7CisJCS8qIEVuYWJsZSB0aGUgZGV2aWNlICovCisJCW91dGIoQ0ZHXzM5WF9TSU9DRjEsIGNmZ19iYXNlKTsKKwkJb3V0YigweDAxLCBjZmdfYmFzZSsxKTsKKwkJLyogTWF5IHdhbnQgdG8gdXBkYXRlIGluZm8tPmVuYWJsZWQuIEplYW4gSUkgKi8KKwl9CisKKwkvKiBFbmFibGUgVUFSVCBiYW5rIHN3aXRjaGluZyAoYml0IDcpIDsgU2V0cyB0aGUgY2hpcCB0byBub3JtYWwKKwkgKiBwb3dlciBtb2RlICh3YWtlIHVwIGZyb20gc2xlZXAgbW9kZSkgKGJpdCAxKSAqLworCW91dGIoQ0ZHXzM5WF9TUEMsIGNmZ19iYXNlKTsKKwlvdXRiKDB4ODIsIGNmZ19iYXNlKzEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19wcm9iZV8zOXggKGNoaXAsIGluZm8pCisgKgorICogICAgVGVzdCBpZiB3ZSByZWFsbHkgaGF2ZSBhICczOXggY2hpcCBhdCB0aGUgZ2l2ZW4gYWRkcmVzcworICoKKyAqIE5vdGUgOiB0aGlzIGNvZGUgd2FzIHdyaXR0ZW4gYnkgSmFuIEZyZXkgPGphbmZyZXlAd2ViLmRlPgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX3Byb2JlXzM5eChuc2NfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbykgCit7CisJaW50IGNmZ19iYXNlID0gaW5mby0+Y2ZnX2Jhc2U7CisJaW50IHJlZzEsIHJlZzIsIGlycSwgaXJxdCwgZG1hMSwgZG1hMjsKKwlpbnQgZW5hYmxlZCwgc3VzcDsKKworCUlSREFfREVCVUcoMiwgIiVzKCksIG5zY19pcmNjX3Byb2JlXzM5eCwgYmFzZT0lZFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBjZmdfYmFzZSk7CisKKwkvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBleGVjdXRlZCB3aXRoIGlycSBvZmYgdG8gYXZvaWQKKwkgKiBhbm90aGVyIGRyaXZlciBtZXNzaW5nIHdpdGggdGhlIFN1cGVyIEkvTyBiYW5rIC0gSmVhbiBJSSAqLworCisJLyogQWNjZXNzIGJhbmsgZm9yIFNQMiAqLworCW91dGIoQ0ZHXzM5WF9MRE4sIGNmZ19iYXNlKTsKKwlvdXRiKDB4MDIsIGNmZ19iYXNlKzEpOworCisJLyogUmVhZCBpbmZvcyBhYm91dCBTUDIgOyBzdG9yZSBpbiBpbmZvIHN0cnVjdCAqLworCW91dGIoQ0ZHXzM5WF9CQVNFSCwgY2ZnX2Jhc2UpOworCXJlZzEgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJb3V0YihDRkdfMzlYX0JBU0VMLCBjZmdfYmFzZSk7CisJcmVnMiA9IGluYihjZmdfYmFzZSsxKTsKKwlpbmZvLT5maXJfYmFzZSA9IChyZWcxIDw8IDgpIHwgcmVnMjsKKworCW91dGIoQ0ZHXzM5WF9JUlFOVU0sIGNmZ19iYXNlKTsKKwlpcnEgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJb3V0YihDRkdfMzlYX0lSUVNFTCwgY2ZnX2Jhc2UpOworCWlycXQgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJaW5mby0+aXJxID0gaXJxOworCisJb3V0YihDRkdfMzlYX0RNQTAsIGNmZ19iYXNlKTsKKwlkbWExID0gaW5iKGNmZ19iYXNlKzEpOworCW91dGIoQ0ZHXzM5WF9ETUExLCBjZmdfYmFzZSk7CisJZG1hMiA9IGluYihjZmdfYmFzZSsxKTsKKwlpbmZvLT5kbWEgPSBkbWExIC0xOworCisJb3V0YihDRkdfMzlYX0FDVCwgY2ZnX2Jhc2UpOworCWluZm8tPmVuYWJsZWQgPSBlbmFibGVkID0gaW5iKGNmZ19iYXNlKzEpICYgMHgwMTsKKwkKKwlvdXRiKENGR18zOVhfU1BDLCBjZmdfYmFzZSk7CisJc3VzcCA9IDEgLSAoKGluYihjZmdfYmFzZSsxKSAmIDB4MDIpID4+IDEpOworCisJSVJEQV9ERUJVRygyLCAiJXMoKTogaW89MHglMDJ4JTAyeCwgaXJxPSVkICh0eXBlICVkKSwgcnhkbWE9JWQsIHR4ZG1hPSVkLCBlbmFibGVkPSVkIChzdXNwZW5kZWQ9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIHJlZzEscmVnMixpcnEsaXJxdCxkbWExLGRtYTIsZW5hYmxlZCxzdXNwKTsKKworCS8qIENvbmZpZ3VyZSBTUDIgKi8KKworCS8qIFdlIHdhbnQgdG8gZW5hYmxlIHRoZSBkZXZpY2UgaWYgbm90IGVuYWJsZWQgKi8KKwlvdXRiKENGR18zOVhfQUNULCBjZmdfYmFzZSk7CisJZW5hYmxlZCA9IGluYihjZmdfYmFzZSsxKSAmIDB4MDE7CisJCisJaWYgKCFlbmFibGVkKSB7CisJCS8qIEVuYWJsZSB0aGUgZGV2aWNlICovCisJCW91dGIoQ0ZHXzM5WF9TSU9DRjEsIGNmZ19iYXNlKTsKKwkJb3V0YigweDAxLCBjZmdfYmFzZSsxKTsKKwkJLyogTWF5IHdhbnQgdG8gdXBkYXRlIGluZm8tPmVuYWJsZWQuIEplYW4gSUkgKi8KKwl9CisKKwkvKiBFbmFibGUgVUFSVCBiYW5rIHN3aXRjaGluZyAoYml0IDcpIDsgU2V0cyB0aGUgY2hpcCB0byBub3JtYWwKKwkgKiBwb3dlciBtb2RlICh3YWtlIHVwIGZyb20gc2xlZXAgbW9kZSkgKGJpdCAxKSAqLworCW91dGIoQ0ZHXzM5WF9TUEMsIGNmZ19iYXNlKTsKKwlvdXRiKDB4ODIsIGNmZ19iYXNlKzEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19zZXR1cCAoaW5mbykKKyAqCisgKiAgICBSZXR1cm5zIG5vbi1uZWdhdGl2ZSBvbiBzdWNjZXNzLgorICoKKyAqLworc3RhdGljIGludCBuc2NfaXJjY19zZXR1cChjaGlwaW9fdCAqaW5mbykKK3sKKwlpbnQgdmVyc2lvbjsKKwlpbnQgaW9iYXNlID0gaW5mby0+ZmlyX2Jhc2U7CisKKwkvKiBSZWFkIHRoZSBNb2R1bGUgSUQgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkszKTsKKwl2ZXJzaW9uID0gaW5iKGlvYmFzZStNSUQpOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSBEcml2ZXIgJXMgRm91bmQgY2hpcCB2ZXJzaW9uICUwMnhcbiIsCisJCSAgIF9fRlVOQ1RJT05fXywgZHJpdmVyX25hbWUsIHZlcnNpb24pOworCisJLyogU2hvdWxkIGJlIDB4Mj8gKi8KKwlpZiAoMHgyMCAhPSAodmVyc2lvbiAmIDB4ZjApKSB7CisJCUlSREFfRVJST1IoIiVzLCBXcm9uZyBjaGlwIHZlcnNpb24gJTAyeFxuIiwKKwkJCSAgIGRyaXZlcl9uYW1lLCB2ZXJzaW9uKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFN3aXRjaCB0byBhZHZhbmNlZCBtb2RlICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMik7CisJb3V0YihFQ1IxX0VYVF9TTCwgaW9iYXNlK0VDUjEpOworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQorCS8qIFNldCBGSUZPIHRocmVzaG9sZCB0byBUWDE3LCBSWDE2LCByZXNldCBhbmQgZW5hYmxlIEZJRk8ncyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCW91dGIoRkNSX1JYVEh8RkNSX1RYVEh8RkNSX1RYU1J8RkNSX1JYU1J8RkNSX0ZJRk9fRU4sIGlvYmFzZStGQ1IpOworCisJb3V0YigweDAzLCBpb2Jhc2UrTENSKTsgCS8qIDggYml0IHdvcmQgbGVuZ3RoICovCisJb3V0YihNQ1JfU0lSLCBpb2Jhc2UrTUNSKTsgCS8qIFN0YXJ0IGF0IFNJUi1tb2RlLCBhbHNvIGNsZWFycyBMU1IqLworCisJLyogU2V0IEZJRk8gc2l6ZSB0byAzMiAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworCW91dGIoRVhDUjJfUkZTSVp8RVhDUjJfVEZTSVosIGlvYmFzZStFWENSMik7CisKKwkvKiBJUkNSMjogRkVORF9NRCBpcyBub3Qgc2V0ICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LNSk7CisgCW91dGIoMHgwMiwgaW9iYXNlKzQpOworCisJLyogTWFrZSBzdXJlIHRoYXQgc29tZSBkZWZhdWx0cyBhcmUgT0sgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTks2KTsKKwlvdXRiKDB4MjAsIGlvYmFzZSswKTsgLyogU2V0IDMyIGJpdHMgRklSIENSQyAqLworCW91dGIoMHgwYSwgaW9iYXNlKzEpOyAvKiBTZXQgTUlSIHB1bHNlIHdpZHRoICovCisJb3V0YigweDBkLCBpb2Jhc2UrMik7IC8qIFNldCBTSVIgcHVsc2Ugd2lkdGggdG8gMS42dXMgKi8KKwlvdXRiKDB4MmEsIGlvYmFzZSs0KTsgLyogU2V0IGJlZ2lubmluZyBmcmFnLCBhbmQgcHJlYW1ibGUgbGVuZ3RoICovCisKKwkvKiBFbmFibGUgcmVjZWl2ZSBpbnRlcnJ1cHRzICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJb3V0YihJRVJfUlhIRExfSUUsIGlvYmFzZStJRVIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19yZWFkX2RvbmdsZV9pZCAodm9pZCkKKyAqCisgKiBUcnkgdG8gcmVhZCBkb25nbGUgaW5kZW50aWZpY2F0aW9uLiBUaGlzIHByb2NlZHVyZSBuZWVkcyB0byBiZSBleGVjdXRlZAorICogb25jZSBhZnRlciBwb3dlci1vbi9yZXNldC4gSXQgYWxzbyBuZWVkcyB0byBiZSB1c2VkIHdoZW5ldmVyIHlvdSBzdXNwZWN0CisgKiB0aGF0IHRoZSB1c2VyIG1heSBoYXZlIHBsdWdnZWQvdW5wbHVnZ2VkIHRoZSBJckRBIERvbmdsZS4KKyAqLworc3RhdGljIGludCBuc2NfaXJjY19yZWFkX2RvbmdsZV9pZCAoaW50IGlvYmFzZSkKK3sKKwlpbnQgZG9uZ2xlX2lkOworCV9fdTggYmFuazsKKworCWJhbmsgPSBpbmIoaW9iYXNlK0JTUik7CisKKwkvKiBTZWxlY3QgQmFuayA3ICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LNyk7CisJCisJLyogSVJDRkc0OiBJUlNMMF9EUyBhbmQgSVJTTDIxX0RTIGFyZSBjbGVhcmVkICovCisJb3V0YigweDAwLCBpb2Jhc2UrNyk7CisJCisJLyogSUQwLCAxLCBhbmQgMiBhcmUgcHVsbGVkIHVwL2Rvd24gdmVyeSBzbG93bHkgKi8KKwl1ZGVsYXkoNTApOworCQorCS8qIElSQ0ZHMTogcmVhZCB0aGUgSUQgYml0cyAqLworCWRvbmdsZV9pZCA9IGluYihpb2Jhc2UrNCkgJiAweDBmOworCisjaWZkZWYgQlJPS0VOX0RPTkdMRV9JRAorCWlmIChkb25nbGVfaWQgPT0gMHgwYSkKKwkJZG9uZ2xlX2lkID0gMHgwOTsKKyNlbmRpZgkKKwkvKiBHbyBiYWNrIHRvICBiYW5rIDAgYmVmb3JlIHJldHVybmluZyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCisJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKKworCXJldHVybiBkb25nbGVfaWQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19pbml0X2RvbmdsZV9pbnRlcmZhY2UgKGlvYmFzZSwgZG9uZ2xlX2lkKQorICoKKyAqICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBkb25nbGUgZm9yIHRoZSB0cmFuc2NlaXZlciB0aGF0IGlzCisgKiAgICAgdXNlZC4gVGhpcyBwcm9jZWR1cmUgbmVlZHMgdG8gYmUgZXhlY3V0ZWQgb25jZSBhZnRlcgorICogICAgIHBvd2VyLW9uL3Jlc2V0LiBJdCBhbHNvIG5lZWRzIHRvIGJlIHVzZWQgd2hlbmV2ZXIgeW91IHN1c3BlY3QgdGhhdAorICogICAgIHRoZSBkb25nbGUgaXMgY2hhbmdlZC4gCisgKi8KK3N0YXRpYyB2b2lkIG5zY19pcmNjX2luaXRfZG9uZ2xlX2ludGVyZmFjZSAoaW50IGlvYmFzZSwgaW50IGRvbmdsZV9pZCkKK3sKKwlpbnQgYmFuazsKKworCS8qIFNhdmUgY3VycmVudCBiYW5rICovCisJYmFuayA9IGluYihpb2Jhc2UrQlNSKTsKKworCS8qIFNlbGVjdCBCYW5rIDcgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTks3KTsKKwkKKwkvKiBJUkNGRzQ6IHNldCBhY2NvcmRpbmcgdG8gZG9uZ2xlX2lkICovCisJc3dpdGNoIChkb25nbGVfaWQpIHsKKwljYXNlIDB4MDA6IC8qIHNhbWUgYXMgKi8KKwljYXNlIDB4MDE6IC8qIERpZmZlcmVudGlhbCBzZXJpYWwgaW50ZXJmYWNlICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzIG5vdCBkZWZpbmVkIGJ5IGlyZGEgeWV0XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7IAorCQlicmVhazsKKwljYXNlIDB4MDI6IC8qIHNhbWUgYXMgKi8KKwljYXNlIDB4MDM6IC8qIFJlc2VydmVkICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzIG5vdCBkZWZpbmVkIGJ5IGlyZGEgeWV0XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7IAorCQlicmVhazsKKwljYXNlIDB4MDQ6IC8qIFNoYXJwIFJZNUhEMDEgKi8KKwkJYnJlYWs7CisJY2FzZSAweDA1OiAvKiBSZXNlcnZlZCwgYnV0IHRoaXMgaXMgd2hhdCB0aGUgVGhpbmtwYWQgcmVwb3J0cyAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlcyBub3QgZGVmaW5lZCBieSBpcmRhIHlldFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOyAKKwkJYnJlYWs7CisJY2FzZSAweDA2OiAvKiBTaW5nbGUtZW5kZWQgc2VyaWFsIGludGVyZmFjZSAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlcyBub3QgZGVmaW5lZCBieSBpcmRhIHlldFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOyAKKwkJYnJlYWs7CisJY2FzZSAweDA3OiAvKiBDb25zdW1lci1JUiBvbmx5ICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzIGlzIG5vdCBmb3IgSXJEQSBtb2RlXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7IAorCQlicmVhazsKKwljYXNlIDB4MDg6IC8qIEhQIEhTREwtMjMwMCwgSFAgSFNETC0zNjAwL0hTREwtMzYxMCAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlc1xuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOworCQlicmVhazsKKwljYXNlIDB4MDk6IC8qIElCTTMxVDExMDAgb3IgVGVtaWMgVEZEUzYwMDAvVEZEUzY1MDAgKi8KKwkJb3V0YigweDI4LCBpb2Jhc2UrNyk7IC8qIFNldCBpcnNsWzAtMl0gYXMgb3V0cHV0ICovCisJCWJyZWFrOworCWNhc2UgMHgwQTogLyogc2FtZSBhcyAqLworCWNhc2UgMHgwQjogLyogUmVzZXJ2ZWQgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXMgbm90IGRlZmluZWQgYnkgaXJkYSB5ZXRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsgCisJCWJyZWFrOworCWNhc2UgMHgwQzogLyogc2FtZSBhcyAqLworCWNhc2UgMHgwRDogLyogSFAgSFNETC0xMTAwL0hTREwtMjEwMCAqLworCQkvKiAKKwkJICogU2V0IGlyc2wwIGFzIGlucHV0LCBpcnNsWzEtMl0gYXMgb3V0cHV0LCBhbmQgc2VwYXJhdGUgCisJCSAqIGlucHV0cyBhcmUgdXNlZCBmb3IgU0lSIGFuZCBNSVIvRklSIAorCQkgKi8KKwkJb3V0YigweDQ4LCBpb2Jhc2UrNyk7IAorCQlicmVhazsKKwljYXNlIDB4MEU6IC8qIFN1cHBvcnRzIFNJUiBNb2RlIG9ubHkgKi8KKwkJb3V0YigweDI4LCBpb2Jhc2UrNyk7IC8qIFNldCBpcnNsWzAtMl0gYXMgb3V0cHV0ICovCisJCWJyZWFrOworCWNhc2UgMHgwRjogLyogTm8gZG9uZ2xlIGNvbm5lY3RlZCAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlc1xuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOyAKKworCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwkJb3V0YigweDYyLCBpb2Jhc2UrTUNSKTsKKwkJYnJlYWs7CisJZGVmYXVsdDogCisJCUlSREFfREVCVUcoMCwgIiVzKCksIGludmFsaWQgZG9uZ2xlX2lkICUjeCIsIAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfaWQpOworCX0KKwkKKwkvKiBJUkNGRzE6IElSU0wxIGFuZCAyIGFyZSBzZXQgdG8gSXJEQSBtb2RlICovCisJb3V0YigweDAwLCBpb2Jhc2UrNCk7CisKKwkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworCQorfSAvKiBzZXRfdXBfZG9uZ2xlX2ludGVyZmFjZSAqLworCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfY2hhbmdlX2RvbmdsZV9zcGVlZCAoaW9iYXNlLCBzcGVlZCwgZG9uZ2xlX2lkKQorICoKKyAqICAgIENoYW5nZSBzcGVlZCBvZiB0aGUgYXR0YWNoIGRvbmdsZQorICoKKyAqLworc3RhdGljIHZvaWQgbnNjX2lyY2NfY2hhbmdlX2RvbmdsZV9zcGVlZChpbnQgaW9iYXNlLCBpbnQgc3BlZWQsIGludCBkb25nbGVfaWQpCit7CisJX191OCBiYW5rOworCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwliYW5rID0gaW5iKGlvYmFzZStCU1IpOworCisJLyogU2VsZWN0IEJhbmsgNyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzcpOworCQorCS8qIElSQ0ZHMTogc2V0IGFjY29yZGluZyB0byBkb25nbGVfaWQgKi8KKwlzd2l0Y2ggKGRvbmdsZV9pZCkgeworCWNhc2UgMHgwMDogLyogc2FtZSBhcyAqLworCWNhc2UgMHgwMTogLyogRGlmZmVyZW50aWFsIHNlcmlhbCBpbnRlcmZhY2UgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXMgbm90IGRlZmluZWQgYnkgaXJkYSB5ZXRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsgCisJCWJyZWFrOworCWNhc2UgMHgwMjogLyogc2FtZSBhcyAqLworCWNhc2UgMHgwMzogLyogUmVzZXJ2ZWQgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXMgbm90IGRlZmluZWQgYnkgaXJkYSB5ZXRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsgCisJCWJyZWFrOworCWNhc2UgMHgwNDogLyogU2hhcnAgUlk1SEQwMSAqLworCQlicmVhazsKKwljYXNlIDB4MDU6IC8qIFJlc2VydmVkICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzIG5vdCBkZWZpbmVkIGJ5IGlyZGEgeWV0XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7IAorCQlicmVhazsKKwljYXNlIDB4MDY6IC8qIFNpbmdsZS1lbmRlZCBzZXJpYWwgaW50ZXJmYWNlICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzIG5vdCBkZWZpbmVkIGJ5IGlyZGEgeWV0XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7IAorCQlicmVhazsKKwljYXNlIDB4MDc6IC8qIENvbnN1bWVyLUlSIG9ubHkgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXMgaXMgbm90IGZvciBJckRBIG1vZGVcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsgCisJCWJyZWFrOworCWNhc2UgMHgwODogLyogSFAgSFNETC0yMzAwLCBIUCBIU0RMLTM2MDAvSFNETC0zNjEwICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzXG4iLCAKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOyAKKwkJb3V0YigweDAwLCBpb2Jhc2UrNCk7CisJCWlmIChzcGVlZCA+IDExNTIwMCkKKwkJCW91dGIoMHgwMSwgaW9iYXNlKzQpOworCQlicmVhazsKKwljYXNlIDB4MDk6IC8qIElCTTMxVDExMDAgb3IgVGVtaWMgVEZEUzYwMDAvVEZEUzY1MDAgKi8KKwkJb3V0YigweDAxLCBpb2Jhc2UrNCk7CisKKwkJaWYgKHNwZWVkID09IDQwMDAwMDApIHsKKwkJCS8qIFRoZXJlIHdhcyBhIGNsaSgpIHRoZXJlLCBidXQgd2Ugbm93IGFyZSBhbHJlYWR5CisJCQkgKiB1bmRlciBzcGluX2xvY2tfaXJxc2F2ZSgpIC0gSmVhbklJICovCisJCQlvdXRiKDB4ODEsIGlvYmFzZSs0KTsKKwkJCW91dGIoMHg4MCwgaW9iYXNlKzQpOworCQl9IGVsc2UKKwkJCW91dGIoMHgwMCwgaW9iYXNlKzQpOworCQlicmVhazsKKwljYXNlIDB4MEE6IC8qIHNhbWUgYXMgKi8KKwljYXNlIDB4MEI6IC8qIFJlc2VydmVkICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzIG5vdCBkZWZpbmVkIGJ5IGlyZGEgeWV0XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7IAorCQlicmVhazsKKwljYXNlIDB4MEM6IC8qIHNhbWUgYXMgKi8KKwljYXNlIDB4MEQ6IC8qIEhQIEhTREwtMTEwMC9IU0RMLTIxMDAgKi8KKwkJYnJlYWs7CisJY2FzZSAweDBFOiAvKiBTdXBwb3J0cyBTSVIgTW9kZSBvbmx5ICovCisJCWJyZWFrOworCWNhc2UgMHgwRjogLyogTm8gZG9uZ2xlIGNvbm5lY3RlZCAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlcyBpcyBub3QgZm9yIElyREEgbW9kZVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOworCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOyAKKwkJb3V0YigweDYyLCBpb2Jhc2UrTUNSKTsKKwkJYnJlYWs7CisJZGVmYXVsdDogCisJCUlSREFfREVCVUcoMCwgIiVzKCksIGludmFsaWQgZGF0YV9yYXRlXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKwkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfY2hhbmdlX3NwZWVkIChzZWxmLCBiYXVkKQorICoKKyAqICAgIENoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gKm11c3QqIGJlIGNhbGxlZCB3aXRoIGlycSBvZmYgYW5kIHNwaW4tbG9jay4KKyAqLworc3RhdGljIF9fdTggbnNjX2lyY2NfY2hhbmdlX3NwZWVkKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZiwgX191MzIgc3BlZWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNlbGYtPm5ldGRldjsKKwlfX3U4IG1jciA9IE1DUl9TSVI7CisJaW50IGlvYmFzZTsgCisJX191OCBiYW5rOworCV9fdTggaWVyOyAgICAgICAgICAgICAgICAgIC8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKworCUlSREFfREVCVUcoMiwgIiVzKCksIHNwZWVkPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHNwZWVkKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogVXBkYXRlIGFjY291bnRpbmcgZm9yIG5ldyBzcGVlZCAqLworCXNlbGYtPmlvLnNwZWVkID0gc3BlZWQ7CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCWJhbmsgPSBpbmIoaW9iYXNlK0JTUik7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKDAsIGlvYmFzZStJRVIpOworCisJLyogU2VsZWN0IEJhbmsgMiAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworCisJb3V0YigweDAwLCBpb2Jhc2UrQkdESCk7CisJc3dpdGNoIChzcGVlZCkgeworCWNhc2UgOTYwMDogICBvdXRiKDB4MGMsIGlvYmFzZStCR0RMKTsgYnJlYWs7CisJY2FzZSAxOTIwMDogIG91dGIoMHgwNiwgaW9iYXNlK0JHREwpOyBicmVhazsKKwljYXNlIDM4NDAwOiAgb3V0YigweDAzLCBpb2Jhc2UrQkdETCk7IGJyZWFrOworCWNhc2UgNTc2MDA6ICBvdXRiKDB4MDIsIGlvYmFzZStCR0RMKTsgYnJlYWs7CisJY2FzZSAxMTUyMDA6IG91dGIoMHgwMSwgaW9iYXNlK0JHREwpOyBicmVhazsKKwljYXNlIDU3NjAwMDoKKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LNSk7CisJCQorCQkvKiBJUkNSMjogTURSUyBpcyBzZXQgKi8KKwkJb3V0YihpbmIoaW9iYXNlKzQpIHwgMHgwNCwgaW9iYXNlKzQpOworCSAgICAgICAKKwkJbWNyID0gTUNSX01JUjsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgaGFuZGxpbmcgYmF1ZCBvZiA1NzYwMDBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCWNhc2UgMTE1MjAwMDoKKwkJbWNyID0gTUNSX01JUjsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgaGFuZGxpbmcgYmF1ZCBvZiAxMTUyMDAwXG4iLCBfX0ZVTkNUSU9OX18pOworCQlicmVhazsKKwljYXNlIDQwMDAwMDA6CisJCW1jciA9IE1DUl9GSVI7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGhhbmRsaW5nIGJhdWQgb2YgNDAwMDAwMFxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWNyID0gTUNSX0ZJUjsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5rbm93biBiYXVkIHJhdGUgb2YgJWRcbiIsIAorCQkJICAgX19GVU5DVElPTl9fLCBzcGVlZCk7CisJCWJyZWFrOworCX0KKworCS8qIFNldCBhcHByb3ByaWF0ZSBzcGVlZCBtb2RlICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJb3V0YihtY3IgfCBNQ1JfVFhfREZSLCBpb2Jhc2UrTUNSKTsKKworCS8qIEdpdmUgc29tZSBoaXRzIHRvIHRoZSB0cmFuc2NlaXZlciAqLworCW5zY19pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQoaW9iYXNlLCBzcGVlZCwgc2VsZi0+aW8uZG9uZ2xlX2lkKTsKKworCS8qIFNldCBGSUZPIHRocmVzaG9sZCB0byBUWDE3LCBSWDE2ICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJb3V0YigweDAwLCBpb2Jhc2UrRkNSKTsKKwlvdXRiKEZDUl9GSUZPX0VOLCBpb2Jhc2UrRkNSKTsKKwlvdXRiKEZDUl9SWFRIfCAgICAgLyogU2V0IFJ4IEZJRk8gdGhyZXNob2xkICovCisJICAgICBGQ1JfVFhUSHwgICAgIC8qIFNldCBUeCBGSUZPIHRocmVzaG9sZCAqLworCSAgICAgRkNSX1RYU1J8ICAgICAvKiBSZXNldCBUeCBGSUZPICovCisJICAgICBGQ1JfUlhTUnwgICAgIC8qIFJlc2V0IFJ4IEZJRk8gKi8KKwkgICAgIEZDUl9GSUZPX0VOLCAgLyogRW5hYmxlIEZJRk9zICovCisJICAgICBpb2Jhc2UrRkNSKTsKKwkKKwkvKiBTZXQgRklGTyBzaXplIHRvIDMyICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMik7CisJb3V0YihFWENSMl9SRlNJWnxFWENSMl9URlNJWiwgaW9iYXNlK0VYQ1IyKTsKKwkKKwkvKiBFbmFibGUgc29tZSBpbnRlcnJ1cHRzIHNvIHdlIGNhbiByZWNlaXZlIGZyYW1lcyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOyAKKwlpZiAoc3BlZWQgPiAxMTUyMDApIHsKKwkJLyogSW5zdGFsbCBGSVIgeG1pdCBoYW5kbGVyICovCisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbnNjX2lyY2NfaGFyZF94bWl0X2ZpcjsKKwkJaWVyID0gSUVSX1NGSUZfSUU7CisJCW5zY19pcmNjX2RtYV9yZWNlaXZlKHNlbGYpOworCX0gZWxzZSB7CisJCS8qIEluc3RhbGwgU0lSIHhtaXQgaGFuZGxlciAqLworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG5zY19pcmNjX2hhcmRfeG1pdF9zaXI7CisJCWllciA9IElFUl9SWEhETF9JRTsKKwl9CisJLyogU2V0IG91ciBjdXJyZW50IGludGVycnVwdCBtYXNrICovCisJb3V0YihpZXIsIGlvYmFzZStJRVIpOworICAgIAkKKwkvKiBSZXN0b3JlIEJTUiAqLworCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CisKKwkvKiBNYWtlIHN1cmUgaW50ZXJydXB0IGhhbmRsZXJzIGtlZXAgdGhlIHByb3BlciBpbnRlcnJ1cHQgbWFzayAqLworCXJldHVybihpZXIpOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfaGFyZF94bWl0IChza2IsIGRldikKKyAqCisgKiAgICBUcmFuc21pdCB0aGUgZnJhbWUhCisgKgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX2hhcmRfeG1pdF9zaXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaW9iYXNlOworCV9fczMyIHNwZWVkOworCV9fdTggYmFuazsKKwkKKwlzZWxmID0gKHN0cnVjdCBuc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCisJLyogTWFrZSBzdXJlIHRlc3RzIComIHNwZWVkIGNoYW5nZSBhcmUgYXRvbWljICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlpZiAoKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJCS8qIENoZWNrIGZvciBlbXB0eSBmcmFtZS4gKi8KKwkJaWYgKCFza2ItPmxlbikgeworCQkJLyogSWYgd2UganVzdCBzZW50IGEgZnJhbWUsIHdlIGdldCBjYWxsZWQgYmVmb3JlCisJCQkgKiB0aGUgbGFzdCBieXRlcyBnZXQgb3V0IChiZWNhdXNlIG9mIHRoZSBTSVIgRklGTykuCisJCQkgKiBJZiB0aGlzIGlzIHRoZSBjYXNlLCBsZXQgaW50ZXJydXB0IGhhbmRsZXIgY2hhbmdlCisJCQkgKiB0aGUgc3BlZWQgaXRzZWxmLi4uIEplYW4gSUkgKi8KKwkJCWlmIChzZWxmLT5pby5kaXJlY3Rpb24gPT0gSU9fUkVDVikgeworCQkJCW5zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzcGVlZCk7IAorCQkJCS8qIFRPRE8gOiBGb3IgU0lSLT5TSVIsIHRoZSBuZXh0IHBhY2tldAorCQkJCSAqIG1heSBnZXQgY29ycnVwdGVkIC0gSmVhbiBJSSAqLworCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCX0gZWxzZSB7CisJCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJCQkJLyogUXVldWUgd2lsbCBiZSByZXN0YXJ0ZWQgYWZ0ZXIgc3BlZWQgY2hhbmdlCisJCQkJICogdG8gbWFrZSBzdXJlIHBhY2tldHMgZ2V0cyB0aHJvdWdoIHRoZQorCQkJCSAqIHByb3BlciB4bWl0IGhhbmRsZXIgLSBKZWFuIElJICovCisJCQl9CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOworCX0KKworCS8qIFNhdmUgY3VycmVudCBiYW5rICovCisJYmFuayA9IGluYihpb2Jhc2UrQlNSKTsKKwkKKwlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisJCisJc2VsZi0+dHhfYnVmZi5sZW4gPSBhc3luY193cmFwX3NrYihza2IsIHNlbGYtPnR4X2J1ZmYuZGF0YSwgCisJCQkJCSAgIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOworCisJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CisJCisJLyogQWRkIGludGVycnVwdCBvbiB0eCBsb3cgbGV2ZWwgKHdpbGwgZmlyZSBpbW1lZGlhdGVseSkgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKElFUl9UWExETF9JRSwgaW9iYXNlK0lFUik7CisJCisJLyogUmVzdG9yZSBiYW5rIHJlZ2lzdGVyICovCisJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5zY19pcmNjX2hhcmRfeG1pdF9maXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaW9iYXNlOworCV9fczMyIHNwZWVkOworCV9fdTggYmFuazsKKwlpbnQgbXR0LCBkaWZmOworCQorCXNlbGYgPSAoc3RydWN0IG5zY19pcmNjX2NiICopIGRldi0+cHJpdjsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKiBNYWtlIHN1cmUgdGVzdHMgKiYgc3BlZWQgY2hhbmdlIGFyZSBhdG9taWMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisJaWYgKChzcGVlZCAhPSBzZWxmLT5pby5zcGVlZCkgJiYgKHNwZWVkICE9IC0xKSkgeworCQkvKiBDaGVjayBmb3IgZW1wdHkgZnJhbWUuICovCisJCWlmICghc2tiLT5sZW4pIHsKKwkJCS8qIElmIHdlIGFyZSBjdXJyZW50bHkgdHJhbnNtaXR0aW5nLCBkZWZlciB0bworCQkJICogaW50ZXJydXB0IGhhbmRsZXIuIC0gSmVhbiBJSSAqLworCQkJaWYoc2VsZi0+dHhfZmlmby5sZW4gPT0gMCkgeworCQkJCW5zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzcGVlZCk7IAorCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCX0gZWxzZSB7CisJCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJCQkJLyogS2VlcCBxdWV1ZSBzdG9wcGVkIDoKKwkJCQkgKiB0aGUgc3BlZWQgY2hhbmdlIG9wZXJhdGlvbiBtYXkgY2hhbmdlIHRoZQorCQkJCSAqIHhtaXQgaGFuZGxlciwgYW5kIHdlIHdhbnQgdG8gbWFrZSBzdXJlCisJCQkJICogdGhlIG5leHQgcGFja2V0IGdldCB0aHJvdWdoIHRoZSBwcm9wZXIKKwkJCQkgKiBUeCBwYXRoLCBzbyBibG9jayB0aGUgVHggcXVldWUgdW50aWwKKwkJCQkgKiB0aGUgc3BlZWQgY2hhbmdlIGhhcyBiZWVuIGRvbmUuCisJCQkJICogSmVhbiBJSSAqLworCQkJfQorCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIENoYW5nZSBzcGVlZCBhZnRlciBjdXJyZW50IGZyYW1lICovCisJCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKwkJfQorCX0KKworCS8qIFNhdmUgY3VycmVudCBiYW5rICovCisJYmFuayA9IGluYihpb2Jhc2UrQlNSKTsKKworCS8qIFJlZ2lzdGVyIGFuZCBjb3B5IHRoaXMgZnJhbWUgdG8gRE1BIG1lbW9yeSAqLworCXNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5zdGFydCA9IHNlbGYtPnR4X2ZpZm8udGFpbDsKKwlzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0ubGVuID0gc2tiLT5sZW47CisJc2VsZi0+dHhfZmlmby50YWlsICs9IHNrYi0+bGVuOworCisJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwltZW1jcHkoc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0LCBza2ItPmRhdGEsIAorCSAgICAgICBza2ItPmxlbik7CisJCisJc2VsZi0+dHhfZmlmby5sZW4rKzsKKwlzZWxmLT50eF9maWZvLmZyZWUrKzsKKworCS8qIFN0YXJ0IHRyYW5zbWl0IG9ubHkgaWYgdGhlcmUgaXMgY3VycmVudGx5IG5vIHRyYW5zbWl0IGdvaW5nIG9uICovCisJaWYgKHNlbGYtPnR4X2ZpZm8ubGVuID09IDEpIHsKKwkJLyogQ2hlY2sgaWYgd2UgbXVzdCB3YWl0IHRoZSBtaW4gdHVybiB0aW1lIG9yIG5vdCAqLworCQltdHQgPSBpcmRhX2dldF9tdHQoc2tiKTsKKwkJaWYgKG10dCkgeworCQkJLyogQ2hlY2sgaG93IG11Y2ggdGltZSB3ZSBoYXZlIHVzZWQgYWxyZWFkeSAqLworCQkJZG9fZ2V0dGltZW9mZGF5KCZzZWxmLT5ub3cpOworCQkJZGlmZiA9IHNlbGYtPm5vdy50dl91c2VjIC0gc2VsZi0+c3RhbXAudHZfdXNlYzsKKwkJCWlmIChkaWZmIDwgMCkgCisJCQkJZGlmZiArPSAxMDAwMDAwOworCQkJCisJCQkvKiBDaGVjayBpZiB0aGUgbXR0IGlzIGxhcmdlciB0aGFuIHRoZSB0aW1lIHdlIGhhdmUKKwkJCSAqIGFscmVhZHkgdXNlZCBieSBhbGwgdGhlIHByb3RvY29sIHByb2Nlc3NpbmcKKwkJCSAqLworCQkJaWYgKG10dCA+IGRpZmYpIHsKKwkJCQltdHQgLT0gZGlmZjsKKworCQkJCS8qIAorCQkJCSAqIFVzZSB0aW1lciBpZiBkZWxheSBsYXJnZXIgdGhhbiAxMjUgdXMsIGFuZAorCQkJCSAqIHVzZSB1ZGVsYXkgZm9yIHNtYWxsZXIgdmFsdWVzIHdoaWNoIHNob3VsZAorCQkJCSAqIGJlIGFjY2VwdGFibGUKKwkJCQkgKi8KKwkJCQlpZiAobXR0ID4gMTI1KSB7CisJCQkJCS8qIEFkanVzdCBmb3IgdGltZXIgcmVzb2x1dGlvbiAqLworCQkJCQltdHQgPSBtdHQgLyAxMjU7CisJCQkJCQorCQkJCQkvKiBTZXR1cCB0aW1lciAqLworCQkJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTks0KTsKKwkJCQkJb3V0YihtdHQgJiAweGZmLCBpb2Jhc2UrVE1STCk7CisJCQkJCW91dGIoKG10dCA+PiA4KSAmIDB4MGYsIGlvYmFzZStUTVJIKTsKKwkJCQkJCisJCQkJCS8qIFN0YXJ0IHRpbWVyICovCisJCQkJCW91dGIoSVJDUjFfVE1SX0VOLCBpb2Jhc2UrSVJDUjEpOworCQkJCQlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19YTUlUOworCQkJCQkKKwkJCQkJLyogRW5hYmxlIHRpbWVyIGludGVycnVwdCAqLworCQkJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwkJCQkJb3V0YihJRVJfVE1SX0lFLCBpb2Jhc2UrSUVSKTsKKwkJCQkJCisJCQkJCS8qIFRpbWVyIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSByZXN0ICovCisJCQkJCWdvdG8gb3V0OyAKKwkJCQl9IGVsc2UKKwkJCQkJdWRlbGF5KG10dCk7CisJCQl9CisJCX0JCQorCQkvKiBFbmFibGUgRE1BIGludGVycnVwdCAqLworCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwkJb3V0YihJRVJfRE1BX0lFLCBpb2Jhc2UrSUVSKTsKKworCQkvKiBUcmFuc21pdCBmcmFtZSAqLworCQluc2NfaXJjY19kbWFfeG1pdChzZWxmLCBpb2Jhc2UpOworCX0KKyBvdXQ6CisJLyogTm90IGJ1c3kgdHJhbnNtaXR0aW5nIGFueW1vcmUgaWYgd2luZG93IGlzIG5vdCBmdWxsLAorCSAqIGFuZCBpZiB3ZSBkb24ndCBuZWVkIHRvIGNoYW5nZSBzcGVlZCAqLworCWlmICgoc2VsZi0+dHhfZmlmby5mcmVlIDwgTUFYX1RYX1dJTkRPVykgJiYgKHNlbGYtPm5ld19zcGVlZCA9PSAwKSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCisJLyogUmVzdG9yZSBiYW5rIHJlZ2lzdGVyICovCisJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2RtYV94bWl0IChzZWxmLCBpb2Jhc2UpCisgKgorICogICAgVHJhbnNtaXQgZGF0YSB1c2luZyBETUEKKyAqCisgKi8KK3N0YXRpYyB2b2lkIG5zY19pcmNjX2RtYV94bWl0KHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSkKK3sKKwlpbnQgYnNyOworCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwlic3IgPSBpbmIoaW9iYXNlK0JTUik7CisKKwkvKiBEaXNhYmxlIERNQSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCW91dGIoaW5iKGlvYmFzZStNQ1IpICYgfk1DUl9ETUFfRU4sIGlvYmFzZStNQ1IpOworCQorCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1hNSVQ7CisJCisJLyogQ2hvb3NlIHRyYW5zbWl0IERNQSBjaGFubmVsICAqLyAKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKwlvdXRiKEVDUjFfRE1BU1dQfEVDUjFfRE1BTkZ8RUNSMV9FWFRfU0wsIGlvYmFzZStFQ1IxKTsKKwkKKwlpcmRhX3NldHVwX2RtYShzZWxmLT5pby5kbWEsIAorCQkgICAgICAgKCh1OCAqKXNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5wdHJdLnN0YXJ0IC0KKwkJCXNlbGYtPnR4X2J1ZmYuaGVhZCkgKyBzZWxmLT50eF9idWZmX2RtYSwKKwkJICAgICAgIHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5wdHJdLmxlbiwgCisJCSAgICAgICBETUFfVFhfTU9ERSk7CisKKwkvKiBFbmFibGUgRE1BIGFuZCBTSVIgaW50ZXJhY3Rpb24gcHVsc2UgKi8KKyAJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CQorCW91dGIoaW5iKGlvYmFzZStNQ1IpfE1DUl9UWF9ERlJ8TUNSX0RNQV9FTnxNQ1JfSVJfUExTLCBpb2Jhc2UrTUNSKTsKKworCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCW91dGIoYnNyLCBpb2Jhc2UrQlNSKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX3Bpb194bWl0IChzZWxmLCBpb2Jhc2UpCisgKgorICogICAgVHJhbnNtaXQgZGF0YSB1c2luZyBQSU8uIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGFjdHVhbGx5CisgKiAgICBnb3QgdHJhbnNmZXJyZWQKKyAqCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfcGlvX3dyaXRlKGludCBpb2Jhc2UsIF9fdTggKmJ1ZiwgaW50IGxlbiwgaW50IGZpZm9fc2l6ZSkKK3sKKwlpbnQgYWN0dWFsID0gMDsKKwlfX3U4IGJhbms7CisJCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFNhdmUgY3VycmVudCBiYW5rICovCisJYmFuayA9IGluYihpb2Jhc2UrQlNSKTsKKworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCWlmICghKGluYl9wKGlvYmFzZStMU1IpICYgTFNSX1RYRU1QKSkgeworCQlJUkRBX0RFQlVHKDQsICIlcygpLCB3YXJuaW5nLCBGSUZPIG5vdCBlbXB0eSB5ZXQhXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKworCQkvKiBGSUZPIG1heSBzdGlsbCBiZSBmaWxsZWQgdG8gdGhlIFR4IGludGVycnVwdCB0aHJlc2hvbGQgKi8KKwkJZmlmb19zaXplIC09IDE3OworCX0KKworCS8qIEZpbGwgRklGTyB3aXRoIGN1cnJlbnQgZnJhbWUgKi8KKwl3aGlsZSAoKGZpZm9fc2l6ZS0tID4gMCkgJiYgKGFjdHVhbCA8IGxlbikpIHsKKwkJLyogVHJhbnNtaXQgbmV4dCBieXRlICovCisJCW91dGIoYnVmW2FjdHVhbCsrXSwgaW9iYXNlK1RYRCk7CisJfQorICAgICAgICAKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBmaWZvX3NpemUgJWQgOyAlZCBzZW50IG9mICVkXG4iLCAKKwkJICAgX19GVU5DVElPTl9fLCBmaWZvX3NpemUsIGFjdHVhbCwgbGVuKTsKKwkKKwkvKiBSZXN0b3JlIGJhbmsgKi8KKwlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworCisJcmV0dXJuIGFjdHVhbDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2RtYV94bWl0X2NvbXBsZXRlIChzZWxmKQorICoKKyAqICAgIFRoZSB0cmFuc2ZlciBvZiBhIGZyYW1lIGluIGZpbmlzaGVkLiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgCisgKiAgICBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKyAqCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisJX191OCBiYW5rOworCWludCByZXQgPSBUUlVFOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwliYW5rID0gaW5iKGlvYmFzZStCU1IpOworCisJLyogRGlzYWJsZSBETUEgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKyAgICAgICAgb3V0YihpbmIoaW9iYXNlK01DUikgJiB+TUNSX0RNQV9FTiwgaW9iYXNlK01DUik7CisJCisJLyogQ2hlY2sgZm9yIHVuZGVycnJ1biEgKi8KKwlpZiAoaW5iKGlvYmFzZStBU0NSKSAmIEFTQ1JfVFhVUikgeworCQlzZWxmLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJc2VsZi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCisJCS8qIENsZWFyIGJpdCwgYnkgd3JpdGluZyAxIGludG8gaXQgKi8KKwkJb3V0YihBU0NSX1RYVVIsIGlvYmFzZStBU0NSKTsKKwl9IGVsc2UgeworCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJfQorCisJLyogRmluaXNoZWQgd2l0aCB0aGlzIGZyYW1lLCBzbyBwcmVwYXJlIGZvciBuZXh0ICovCisJc2VsZi0+dHhfZmlmby5wdHIrKzsKKwlzZWxmLT50eF9maWZvLmxlbi0tOworCisJLyogQW55IGZyYW1lcyB0byBiZSBzZW50IGJhY2stdG8tYmFjaz8gKi8KKwlpZiAoc2VsZi0+dHhfZmlmby5sZW4pIHsKKwkJbnNjX2lyY2NfZG1hX3htaXQoc2VsZiwgaW9iYXNlKTsKKwkJCisJCS8qIE5vdCBmaW5pc2hlZCB5ZXQhICovCisJCXJldCA9IEZBTFNFOworCX0gZWxzZSB7CisJCS8qIFJlc2V0IFR4IEZJRk8gaW5mbyAqLworCQlzZWxmLT50eF9maWZvLmxlbiA9IHNlbGYtPnR4X2ZpZm8ucHRyID0gc2VsZi0+dHhfZmlmby5mcmVlID0gMDsKKwkJc2VsZi0+dHhfZmlmby50YWlsID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHJvb20gZm9yIG1vcmUgZnJhbWVzIGFuZAorCSAqIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2Ugc3BlZWQgKi8KKwlpZiAoKHNlbGYtPnR4X2ZpZm8uZnJlZSA8IE1BWF9UWF9XSU5ET1cpICYmIChzZWxmLT5uZXdfc3BlZWQgPT0gMCkpIHsKKwkJLyogTm90IGJ1c3kgdHJhbnNtaXR0aW5nIGFueW1vcmUgKi8KKwkJLyogVGVsbCB0aGUgbmV0d29yayBsYXllciwgdGhhdCB3ZSBjYW4gYWNjZXB0IG1vcmUgZnJhbWVzICovCisJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwl9CisKKwkvKiBSZXN0b3JlIGJhbmsgKi8KKwlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworCQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19kbWFfcmVjZWl2ZSAoc2VsZikKKyAqCisgKiAgICBHZXQgcmVhZHkgZm9yIHJlY2VpdmluZyBhIGZyYW1lLiBUaGUgZGV2aWNlIHdpbGwgaW5pdGlhdGUgYSBETUEKKyAqICAgIGlmIGl0IHN0YXJ0cyB0byByZWNlaXZlIGEgZnJhbWUuCisgKgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX2RtYV9yZWNlaXZlKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZikgCit7CisJaW50IGlvYmFzZTsKKwlfX3U4IGJzcjsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogUmVzZXQgVHggRklGTyBpbmZvICovCisJc2VsZi0+dHhfZmlmby5sZW4gPSBzZWxmLT50eF9maWZvLnB0ciA9IHNlbGYtPnR4X2ZpZm8uZnJlZSA9IDA7CisJc2VsZi0+dHhfZmlmby50YWlsID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwlic3IgPSBpbmIoaW9iYXNlK0JTUik7CisKKwkvKiBEaXNhYmxlIERNQSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCW91dGIoaW5iKGlvYmFzZStNQ1IpICYgfk1DUl9ETUFfRU4sIGlvYmFzZStNQ1IpOworCisJLyogQ2hvb3NlIERNQSBSeCwgRE1BIEZhaXJuZXNzLCBhbmQgQWR2YW5jZWQgbW9kZSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworCW91dGIoRUNSMV9ETUFORnxFQ1IxX0VYVF9TTCwgaW9iYXNlK0VDUjEpOworCisJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fUkVDVjsKKwlzZWxmLT5yeF9idWZmLmRhdGEgPSBzZWxmLT5yeF9idWZmLmhlYWQ7CisJCisJLyogUmVzZXQgUnggRklGTy4gVGhpcyB3aWxsIGFsc28gZmx1c2ggdGhlIFNUX0ZJRk8gKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKEZDUl9SWFNSfEZDUl9GSUZPX0VOLCBpb2Jhc2UrRkNSKTsKKworCXNlbGYtPnN0X2ZpZm8ubGVuID0gc2VsZi0+c3RfZmlmby5wZW5kaW5nX2J5dGVzID0gMDsKKwlzZWxmLT5zdF9maWZvLnRhaWwgPSBzZWxmLT5zdF9maWZvLmhlYWQgPSAwOworCQorCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYSwgc2VsZi0+cnhfYnVmZl9kbWEsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCSAgICAgICBETUFfUlhfTU9ERSk7CisKKwkvKiBFbmFibGUgRE1BICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJb3V0YihpbmIoaW9iYXNlK01DUil8TUNSX0RNQV9FTiwgaW9iYXNlK01DUik7CisKKwkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlvdXRiKGJzciwgaW9iYXNlK0JTUik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZSAoc2VsZikKKyAqCisgKiAgICBGaW5pc2hlZCB3aXRoIHJlY2VpdmluZyBmcmFtZXMKKyAqCisgKiAgICAKKyAqLworc3RhdGljIGludCBuc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpCit7CisJc3RydWN0IHN0X2ZpZm8gKnN0X2ZpZm87CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlfX3U4IHN0YXR1czsKKwlfX3U4IGJhbms7CisJaW50IGxlbjsKKworCXN0X2ZpZm8gPSAmc2VsZi0+c3RfZmlmbzsKKworCS8qIFNhdmUgY3VycmVudCBiYW5rICovCisJYmFuayA9IGluYihpb2Jhc2UrQlNSKTsKKwkKKwkvKiBSZWFkIGFsbCBlbnRyaWVzIGluIHN0YXR1cyBGSUZPICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LNSk7CisJd2hpbGUgKChzdGF0dXMgPSBpbmIoaW9iYXNlK0ZSTV9TVCkpICYgRlJNX1NUX1ZMRCkgeworCQkvKiBXZSBtdXN0IGVtcHR5IHRoZSBzdGF0dXMgRklGTyBubyBtYXR0ZXIgd2hhdCAqLworCQlsZW4gPSBpbmIoaW9iYXNlK1JGTEZMKSB8ICgoaW5iKGlvYmFzZStSRkxGSCkgJiAweDFmKSA8PCA4KTsKKworCQlpZiAoc3RfZmlmby0+dGFpbCA+PSBNQVhfUlhfV0lORE9XKSB7CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCB3aW5kb3cgaXMgZnVsbCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQljb250aW51ZTsKKwkJfQorCQkJCisJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+dGFpbF0uc3RhdHVzID0gc3RhdHVzOworCQlzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPnRhaWxdLmxlbiA9IGxlbjsKKwkJc3RfZmlmby0+cGVuZGluZ19ieXRlcyArPSBsZW47CisJCXN0X2ZpZm8tPnRhaWwrKzsKKwkJc3RfZmlmby0+bGVuKys7CisJfQorCS8qIFRyeSB0byBwcm9jZXNzIGFsbCBlbnRyaWVzIGluIHN0YXR1cyBGSUZPICovCisJd2hpbGUgKHN0X2ZpZm8tPmxlbiA+IDApIHsKKwkJLyogR2V0IGZpcnN0IGVudHJ5ICovCisJCXN0YXR1cyA9IHN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0uc3RhdHVzOworCQlsZW4gICAgPSBzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLmxlbjsKKwkJc3RfZmlmby0+cGVuZGluZ19ieXRlcyAtPSBsZW47CisJCXN0X2ZpZm8tPmhlYWQrKzsKKwkJc3RfZmlmby0+bGVuLS07CisKKwkJLyogQ2hlY2sgZm9yIGVycm9ycyAqLworCQlpZiAoc3RhdHVzICYgRlJNX1NUX0VSUl9NU0spIHsKKwkJCWlmIChzdGF0dXMgJiBGUk1fU1RfTE9TVF9GUikgeworCQkJCS8qIEFkZCBudW1iZXIgb2YgbG9zdCBmcmFtZXMgdG8gc3RhdHMgKi8KKwkJCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMgKz0gbGVuOwkKKwkJCX0gZWxzZSB7CisJCQkJLyogU2tpcCBmcmFtZSAqLworCQkJCXNlbGYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQorCQkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CisJCQkKKwkJCQlpZiAoc3RhdHVzICYgRlJNX1NUX01BWF9MRU4pCisJCQkJCXNlbGYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQkKKwkJCQlpZiAoc3RhdHVzICYgRlJNX1NUX1BIWV9FUlIpIAorCQkJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQkKKwkJCQlpZiAoc3RhdHVzICYgRlJNX1NUX0JBRF9DUkMpIAorCQkJCQlzZWxmLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQl9CisJCQkvKiBUaGUgZXJyb3JzIGJlbG93IGNhbiBiZSByZXBvcnRlZCBpbiBib3RoIGNhc2VzICovCisJCQlpZiAoc3RhdHVzICYgRlJNX1NUX09WUjEpCisJCQkJc2VsZi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsJCSAgICAgICAKKwkJCQorCQkJaWYgKHN0YXR1cyAmIEZSTV9TVF9PVlIyKQorCQkJCXNlbGYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCX0gZWxzZSB7CisJCQkvKiAgCisJCQkgKiBGaXJzdCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBmcmFtZSB3ZQorCQkJICogd2FudCB0byBkZWxpdmVyIGlzIGFsbCBpbiBtYWluIG1lbW9yeS4gSWYgd2UKKwkJCSAqIGNhbm5vdCB0ZWxsLCB0aGVuIHdlIGNoZWNrIGlmIHRoZSBSeCBGSUZPIGlzCisJCQkgKiBlbXB0eS4gSWYgbm90IHRoZW4gd2Ugd2lsbCBoYXZlIHRvIHRha2UgYSBuYXAKKwkJCSAqIGFuZCB0cnkgYWdhaW4gbGF0ZXIuICAKKwkJCSAqLworCQkJaWYgKHN0X2ZpZm8tPnBlbmRpbmdfYnl0ZXMgPCBzZWxmLT5pby5maWZvX3NpemUpIHsKKwkJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwkJCQlpZiAoaW5iKGlvYmFzZStMU1IpICYgTFNSX1JYREEpIHsKKwkJCQkJLyogUHV0IHRoaXMgZW50cnkgYmFjayBpbiBmaWZvICovCisJCQkJCXN0X2ZpZm8tPmhlYWQtLTsKKwkJCQkJc3RfZmlmby0+bGVuKys7CisJCQkJCXN0X2ZpZm8tPnBlbmRpbmdfYnl0ZXMgKz0gbGVuOworCQkJCQlzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLnN0YXR1cyA9IHN0YXR1czsKKwkJCQkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT5oZWFkXS5sZW4gPSBsZW47CisJCQkJCS8qICAKKwkJCQkJICogRE1BIG5vdCBmaW5pc2hlZCB5ZXQsIHNvIHRyeSBhZ2FpbiAKKwkJCQkJICogbGF0ZXIsIHNldCB0aW1lciB2YWx1ZSwgcmVzb2x1dGlvbiAKKwkJCQkJICogMTI1IHVzIAorCQkJCQkgKi8KKwkJCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LNCk7CisJCQkJCW91dGIoMHgwMiwgaW9iYXNlK1RNUkwpOyAvKiB4IDEyNSB1cyAqLworCQkJCQlvdXRiKDB4MDAsIGlvYmFzZStUTVJIKTsKKworCQkJCQkvKiBTdGFydCB0aW1lciAqLworCQkJCQlvdXRiKElSQ1IxX1RNUl9FTiwgaW9iYXNlK0lSQ1IxKTsKKworCQkJCQkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwkJCQkJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKKwkJCQkJCisJCQkJCXJldHVybiBGQUxTRTsgLyogSSdsbCBiZSBiYWNrISAqLworCQkJCX0KKwkJCX0KKworCQkJLyogCisJCQkgKiBSZW1lbWJlciB0aGUgdGltZSB3ZSByZWNlaXZlZCB0aGlzIGZyYW1lLCBzbyB3ZSBjYW4KKwkJCSAqIHJlZHVjZSB0aGUgbWluIHR1cm4gdGltZSBhIGJpdCBzaW5jZSB3ZSB3aWxsIGtub3cKKwkJCSAqIGhvdyBtdWNoIHRpbWUgd2UgaGF2ZSB1c2VkIGZvciBwcm90b2NvbCBwcm9jZXNzaW5nCisJCQkgKi8KKwkJCWRvX2dldHRpbWVvZmRheSgmc2VsZi0+c3RhbXApOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbisxKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgIHsKKwkJCQlJUkRBX1dBUk5JTkcoIiVzKCksIG1lbW9yeSBzcXVlZXplLCAiCisJCQkJCSAgICAgImRyb3BwaW5nIGZyYW1lLlxuIiwKKwkJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKworCQkJCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCQkJCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CisKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQkKKwkJCS8qIE1ha2Ugc3VyZSBJUCBoZWFkZXIgZ2V0cyBhbGlnbmVkICovCisJCQlza2JfcmVzZXJ2ZShza2IsIDEpOyAKKworCQkJLyogQ29weSBmcmFtZSB3aXRob3V0IENSQyAqLworCQkJaWYgKHNlbGYtPmlvLnNwZWVkIDwgNDAwMDAwMCkgeworCQkJCXNrYl9wdXQoc2tiLCBsZW4tMik7CisJCQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4tMik7CisJCQl9IGVsc2UgeworCQkJCXNrYl9wdXQoc2tiLCBsZW4tNCk7CisJCQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4tNCk7CisJCQl9CisKKwkJCS8qIE1vdmUgdG8gbmV4dCBmcmFtZSAqLworCQkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKKwkJCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKworCQkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CisJCQlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCXNlbGYtPm5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCX0KKwl9CisJLyogUmVzdG9yZSBiYW5rIHJlZ2lzdGVyICovCisJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfcGlvX3JlY2VpdmUgKHNlbGYpCisgKgorICogICAgUmVjZWl2ZSBhbGwgZGF0YSBpbiByZWNlaXZlciBGSUZPCisgKgorICovCitzdGF0aWMgdm9pZCBuc2NfaXJjY19waW9fcmVjZWl2ZShzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYpIAoreworCV9fdTggYnl0ZTsKKwlpbnQgaW9iYXNlOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJCisJLyogIFJlY2VpdmUgYWxsIGNoYXJhY3RlcnMgaW4gUnggRklGTyAqLworCWRvIHsKKwkJYnl0ZSA9IGluYihpb2Jhc2UrUlhEKTsKKwkJYXN5bmNfdW53cmFwX2NoYXIoc2VsZi0+bmV0ZGV2LCAmc2VsZi0+c3RhdHMsICZzZWxmLT5yeF9idWZmLCAKKwkJCQkgIGJ5dGUpOworCX0gd2hpbGUgKGluYihpb2Jhc2UrTFNSKSAmIExTUl9SWERBKTsgLyogRGF0YSBhdmFpbGFibGUgKi8JCit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19zaXJfaW50ZXJydXB0IChzZWxmLCBlaXIpCisgKgorICogICAgSGFuZGxlIFNJUiBpbnRlcnJ1cHQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIG5zY19pcmNjX3Npcl9pbnRlcnJ1cHQoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmLCBpbnQgZWlyKQoreworCWludCBhY3R1YWw7CisKKwkvKiBDaGVjayBpZiB0cmFuc21pdCBGSUZPIGlzIGxvdyBvbiBkYXRhICovCisJaWYgKGVpciAmIEVJUl9UWExETF9FVikgeworCQkvKiBXcml0ZSBkYXRhIGxlZnQgaW4gdHJhbnNtaXQgYnVmZmVyICovCisJCWFjdHVhbCA9IG5zY19pcmNjX3Bpb193cml0ZShzZWxmLT5pby5maXJfYmFzZSwgCisJCQkJCSAgIHNlbGYtPnR4X2J1ZmYuZGF0YSwgCisJCQkJCSAgIHNlbGYtPnR4X2J1ZmYubGVuLCAKKwkJCQkJICAgc2VsZi0+aW8uZmlmb19zaXplKTsKKwkJc2VsZi0+dHhfYnVmZi5kYXRhICs9IGFjdHVhbDsKKwkJc2VsZi0+dHhfYnVmZi5sZW4gIC09IGFjdHVhbDsKKwkJCisJCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1hNSVQ7CisKKwkJLyogQ2hlY2sgaWYgZmluaXNoZWQgKi8KKwkJaWYgKHNlbGYtPnR4X2J1ZmYubGVuID4gMCkKKwkJCXNlbGYtPmllciA9IElFUl9UWExETF9JRTsKKwkJZWxzZSB7IAorCisJCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisJCQlzZWxmLT5pZXIgPSBJRVJfVFhFTVBfSUU7CisJCX0KKwkJCQorCX0KKwkvKiBDaGVjayBpZiB0cmFuc21pc3Npb24gaGFzIGNvbXBsZXRlZCAqLworCWlmIChlaXIgJiBFSVJfVFhFTVBfRVYpIHsKKwkJLyogVHVybiBhcm91bmQgYW5kIGdldCByZWFkeSB0byByZWNlaXZlIHNvbWUgZGF0YSAqLworCQlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19SRUNWOworCQlzZWxmLT5pZXIgPSBJRVJfUlhIRExfSUU7CisJCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZD8KKwkJICogTmVlZCB0byBiZSBhZnRlciBzZWxmLT5pby5kaXJlY3Rpb24gdG8gYXZvaWQgcmFjZSB3aXRoCisJCSAqIG5zY19pcmNjX2hhcmRfeG1pdF9zaXIoKSAtIEplYW4gSUkgKi8KKwkJaWYgKHNlbGYtPm5ld19zcGVlZCkgeworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgQ2hhbmdpbmcgc3BlZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJc2VsZi0+aWVyID0gbnNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsCisJCQkJCQkJICBzZWxmLT5uZXdfc3BlZWQpOworCQkJc2VsZi0+bmV3X3NwZWVkID0gMDsKKwkJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKworCQkJLyogQ2hlY2sgaWYgd2UgYXJlIGdvaW5nIHRvIEZJUiAqLworCQkJaWYgKHNlbGYtPmlvLnNwZWVkID4gMTE1MjAwKSB7CisJCQkJLyogTm8gbmVlZCB0byBkbyBhbnltb3JlIFNJUiBzdHVmZiAqLworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKworCS8qIFJ4IEZJRk8gdGhyZXNob2xkIG9yIHRpbWVvdXQgKi8KKwlpZiAoZWlyICYgRUlSX1JYSERMX0VWKSB7CisJCW5zY19pcmNjX3Bpb19yZWNlaXZlKHNlbGYpOworCisJCS8qIEtlZXAgcmVjZWl2aW5nICovCisJCXNlbGYtPmllciA9IElFUl9SWEhETF9JRTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19maXJfaW50ZXJydXB0IChzZWxmLCBlaXIpCisgKgorICogICAgSGFuZGxlIE1JUi9GSVIgaW50ZXJydXB0CisgKgorICovCitzdGF0aWMgdm9pZCBuc2NfaXJjY19maXJfaW50ZXJydXB0KHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSwgCisJCQkJICAgaW50IGVpcikKK3sKKwlfX3U4IGJhbms7CisKKwliYW5rID0gaW5iKGlvYmFzZStCU1IpOworCQorCS8qIFN0YXR1cyBGSUZPIGV2ZW50Ki8KKwlpZiAoZWlyICYgRUlSX1NGSUZfRVYpIHsKKwkJLyogQ2hlY2sgaWYgRE1BIGhhcyBmaW5pc2hlZCAqLworCQlpZiAobnNjX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZiwgaW9iYXNlKSkgeworCQkJLyogV2FpdCBmb3IgbmV4dCBzdGF0dXMgRklGTyBpbnRlcnJ1cHQgKi8KKwkJCXNlbGYtPmllciA9IElFUl9TRklGX0lFOworCQl9IGVsc2UgeworCQkJc2VsZi0+aWVyID0gSUVSX1NGSUZfSUUgfCBJRVJfVE1SX0lFOworCQl9CisJfSBlbHNlIGlmIChlaXIgJiBFSVJfVE1SX0VWKSB7IC8qIFRpbWVyIGZpbmlzaGVkICovCisJCS8qIERpc2FibGUgdGltZXIgKi8KKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LNCk7CisJCW91dGIoMCwgaW9iYXNlK0lSQ1IxKTsKKworCQkvKiBDbGVhciB0aW1lciBldmVudCAqLworCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwkJb3V0YihBU0NSX0NURSwgaW9iYXNlK0FTQ1IpOworCisJCS8qIENoZWNrIGlmIHRoaXMgaXMgYSBUeCB0aW1lciBpbnRlcnJ1cHQgKi8KKwkJaWYgKHNlbGYtPmlvLmRpcmVjdGlvbiA9PSBJT19YTUlUKSB7CisJCQluc2NfaXJjY19kbWFfeG1pdChzZWxmLCBpb2Jhc2UpOworCisJCQkvKiBJbnRlcnJ1cHQgb24gRE1BICovCisJCQlzZWxmLT5pZXIgPSBJRVJfRE1BX0lFOworCQl9IGVsc2UgeworCQkJLyogQ2hlY2sgKGFnYWluKSBpZiBETUEgaGFzIGZpbmlzaGVkICovCisJCQlpZiAobnNjX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZiwgaW9iYXNlKSkgeworCQkJCXNlbGYtPmllciA9IElFUl9TRklGX0lFOworCQkJfSBlbHNlIHsKKwkJCQlzZWxmLT5pZXIgPSBJRVJfU0ZJRl9JRSB8IElFUl9UTVJfSUU7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGVpciAmIEVJUl9ETUFfRVYpIHsKKwkJLyogRmluaXNoZWQgd2l0aCBhbGwgdHJhbnNtaXNzaW9ucz8gKi8KKwkJaWYgKG5zY19pcmNjX2RtYV94bWl0X2NvbXBsZXRlKHNlbGYpKSB7CisJCQlpZihzZWxmLT5uZXdfc3BlZWQgIT0gMCkgeworCQkJCS8qIEFzIHdlIHN0b3AgdGhlIFR4IHF1ZXVlLCB0aGUgc3BlZWQgY2hhbmdlCisJCQkJICogbmVlZCB0byBiZSBkb25lIHdoZW4gdGhlIFR4IGZpZm8gaXMKKwkJCQkgKiBlbXB0eS4gQXNrIGZvciBhIFR4IGRvbmUgaW50ZXJydXB0ICovCisJCQkJc2VsZi0+aWVyID0gSUVSX1RYRU1QX0lFOworCQkJfSBlbHNlIHsKKwkJCQkvKiBDaGVjayBpZiB0aGVyZSBhcmUgbW9yZSBmcmFtZXMgdG8gYmUKKwkJCQkgKiB0cmFuc21pdHRlZCAqLworCQkJCWlmIChpcmRhX2RldmljZV90eHF1ZXVlX2VtcHR5KHNlbGYtPm5ldGRldikpIHsKKwkJCQkJLyogUHJlcGFyZSBmb3IgcmVjZWl2ZSAqLworCQkJCQluc2NfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKKwkJCQkJc2VsZi0+aWVyID0gSUVSX1NGSUZfSUU7CisJCQkJfSBlbHNlCisJCQkJCUlSREFfV0FSTklORygiJXMoKSwgcG90ZW50aWFsICIKKwkJCQkJCSAgICAgIlR4IHF1ZXVlIGxvY2t1cCAhXG4iLAorCQkJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogIE5vdCBmaW5pc2hlZCB5ZXQsIHNvIGludGVycnVwdCBvbiBETUEgYWdhaW4gKi8KKwkJCXNlbGYtPmllciA9IElFUl9ETUFfSUU7CisJCX0KKwl9IGVsc2UgaWYgKGVpciAmIEVJUl9UWEVNUF9FVikgeworCQkvKiBUaGUgVHggRklGTyBoYXMgdG90YWxseSBkcmFpbmVkIG91dCwgc28gbm93IHdlIGNhbiBjaGFuZ2UKKwkJICogdGhlIHNwZWVkLi4uIC0gSmVhbiBJSSAqLworCQlzZWxmLT5pZXIgPSBuc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+bmV3X3NwZWVkKTsKKwkJc2VsZi0+bmV3X3NwZWVkID0gMDsKKwkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQkvKiBOb3RlIDogbnNjX2lyY2NfY2hhbmdlX3NwZWVkKCkgcmVzdGFydGVkIFJ4IGZpZm8gKi8KKwl9CisKKwlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfaW50ZXJydXB0IChpcnEsIGRldl9pZCwgcmVncykKKyAqCisgKiAgICBBbiBpbnRlcnJ1cHQgZnJvbSB0aGUgY2hpcCBoYXMgYXJyaXZlZC4gVGltZSB0byBkbyBzb21lIHdvcmsKKyAqCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBuc2NfaXJjY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZjsKKwlfX3U4IGJzciwgZWlyOworCWludCBpb2Jhc2U7CisKKwlpZiAoIWRldikgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwKKwkJCSAgICAgZHJpdmVyX25hbWUsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJc2VsZiA9IChzdHJ1Y3QgbnNjX2lyY2NfY2IgKikgZGV2LT5wcml2OworCisJc3Bpbl9sb2NrKCZzZWxmLT5sb2NrKTsJCisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCWJzciA9IGluYihpb2Jhc2UrQlNSKTsgCS8qIFNhdmUgY3VycmVudCBiYW5rICovCisKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsJCisJc2VsZi0+aWVyID0gaW5iKGlvYmFzZStJRVIpOyAKKwllaXIgPSBpbmIoaW9iYXNlK0VJUikgJiBzZWxmLT5pZXI7IC8qIE1hc2sgb3V0IHRoZSBpbnRlcmVzdGluZyBvbmVzICovIAorCisJb3V0YigwLCBpb2Jhc2UrSUVSKTsgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJCisJaWYgKGVpcikgeworCQkvKiBEaXNwYXRjaCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIGN1cnJlbnQgc3BlZWQgKi8KKwkJaWYgKHNlbGYtPmlvLnNwZWVkID4gMTE1MjAwKQorCQkJbnNjX2lyY2NfZmlyX2ludGVycnVwdChzZWxmLCBpb2Jhc2UsIGVpcik7CisJCWVsc2UKKwkJCW5zY19pcmNjX3Npcl9pbnRlcnJ1cHQoc2VsZiwgZWlyKTsKKwl9CisJCisJb3V0YihzZWxmLT5pZXIsIGlvYmFzZStJRVIpOyAvKiBSZXN0b3JlIGludGVycnVwdHMgKi8KKwlvdXRiKGJzciwgaW9iYXNlK0JTUik7ICAgICAgIC8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCisJc3Bpbl91bmxvY2soJnNlbGYtPmxvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGVpcik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19pc19yZWNlaXZpbmcgKHNlbGYpCisgKgorICogICAgUmV0dXJuIFRSVUUgaXMgd2UgYXJlIGN1cnJlbnRseSByZWNlaXZpbmcgYSBmcmFtZQorICoKKyAqLworc3RhdGljIGludCBuc2NfaXJjY19pc19yZWNlaXZpbmcoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YXR1cyA9IEZBTFNFOworCWludCBpb2Jhc2U7CisJX191OCBiYW5rOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gRkFMU0U7KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc2VsZi0+aW8uc3BlZWQgPiAxMTUyMDApIHsKKwkJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkJLyogQ2hlY2sgaWYgcnggRklGTyBpcyBub3QgZW1wdHkgKi8KKwkJYmFuayA9IGluYihpb2Jhc2UrQlNSKTsKKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMik7CisJCWlmICgoaW5iKGlvYmFzZStSWEZMVikgJiAweDNmKSAhPSAwKSB7CisJCQkvKiBXZSBhcmUgcmVjZWl2aW5nIHNvbWV0aGluZyAqLworCQkJc3RhdHVzID0gIFRSVUU7CisJCX0KKwkJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKKwl9IGVsc2UgCisJCXN0YXR1cyA9IChzZWxmLT5yeF9idWZmLnN0YXRlICE9IE9VVFNJREVfRlJBTUUpOworCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19uZXRfb3BlbiAoZGV2KQorICoKKyAqICAgIFN0YXJ0IHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGY7CisJaW50IGlvYmFzZTsKKwljaGFyIGh3bmFtZVszMl07CisJX191OCBiYW5rOworCQorCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSAoc3RydWN0IG5zY19pcmNjX2NiICopIGRldi0+cHJpdjsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJCisJaWYgKHJlcXVlc3RfaXJxKHNlbGYtPmlvLmlycSwgbnNjX2lyY2NfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldikpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcywgdW5hYmxlIHRvIGFsbG9jYXRlIGlycT0lZFxuIiwKKwkJCSAgICAgZHJpdmVyX25hbWUsIHNlbGYtPmlvLmlycSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkvKgorCSAqIEFsd2F5cyBhbGxvY2F0ZSB0aGUgRE1BIGNoYW5uZWwgYWZ0ZXIgdGhlIElSUSwgYW5kIGNsZWFuIHVwIG9uIAorCSAqIGZhaWx1cmUuCisJICovCisJaWYgKHJlcXVlc3RfZG1hKHNlbGYtPmlvLmRtYSwgZGV2LT5uYW1lKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzLCB1bmFibGUgdG8gYWxsb2NhdGUgZG1hPSVkXG4iLAorCQkJICAgICBkcml2ZXJfbmFtZSwgc2VsZi0+aW8uZG1hKTsKKwkJZnJlZV9pcnEoc2VsZi0+aW8uaXJxLCBkZXYpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwliYW5rID0gaW5iKGlvYmFzZStCU1IpOworCQorCS8qIHR1cm4gb24gaW50ZXJydXB0cyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCW91dGIoSUVSX0xTX0lFIHwgSUVSX1JYSERMX0lFLCBpb2Jhc2UrSUVSKTsKKworCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CisKKwkvKiBSZWFkeSB0byBwbGF5ISAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCisJLyogR2l2ZSBzZWxmIGEgaGFyZHdhcmUgbmFtZSAqLworCXNwcmludGYoaHduYW1lLCAiTlNDLUZJUiBAIDB4JTAzeCIsIHNlbGYtPmlvLmZpcl9iYXNlKTsKKworCS8qIAorCSAqIE9wZW4gbmV3IElyTEFQIGxheWVyIGluc3RhbmNlLCBub3cgdGhhdCBldmVyeXRoaW5nIHNob3VsZCBiZQorCSAqIGluaXRpYWxpemVkIHByb3Blcmx5IAorCSAqLworCXNlbGYtPmlybGFwID0gaXJsYXBfb3BlbihkZXYsICZzZWxmLT5xb3MsIGh3bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX25ldF9jbG9zZSAoZGV2KQorICoKKyAqICAgIFN0b3AgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBuc2NfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGY7CisJaW50IGlvYmFzZTsKKwlfX3U4IGJhbms7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXNlbGYgPSAoc3RydWN0IG5zY19pcmNjX2NiICopIGRldi0+cHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisKKwkvKiBTdG9wIGRldmljZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKiBTdG9wIGFuZCByZW1vdmUgaW5zdGFuY2Ugb2YgSXJMQVAgKi8KKwlpZiAoc2VsZi0+aXJsYXApCisJCWlybGFwX2Nsb3NlKHNlbGYtPmlybGFwKTsKKwlzZWxmLT5pcmxhcCA9IE5VTEw7CisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwlkaXNhYmxlX2RtYShzZWxmLT5pby5kbWEpOworCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwliYW5rID0gaW5iKGlvYmFzZStCU1IpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJb3V0YigwLCBpb2Jhc2UrSUVSKTsgCisgICAgICAgCisJZnJlZV9pcnEoc2VsZi0+aW8uaXJxLCBkZXYpOworCWZyZWVfZG1hKHNlbGYtPmlvLmRtYSk7CisKKwkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19uZXRfaW9jdGwgKGRldiwgcnEsIGNtZCkKKyAqCisgKiAgICBQcm9jZXNzIElPQ1RMIGNvbW1hbmRzIGZvciB0aGlzIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBuc2NfaXJjY19uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgaWZfaXJkYV9yZXEgKmlycSA9IChzdHJ1Y3QgaWZfaXJkYV9yZXEgKikgcnE7CisJc3RydWN0IG5zY19pcmNjX2NiICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlzZWxmID0gZGV2LT5wcml2OworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCUlSREFfREVCVUcoMiwgIiVzKCksICVzLCAoY21kPTB4JVgpXG4iLCBfX0ZVTkNUSU9OX18sIGRldi0+bmFtZSwgY21kKTsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ1NCQU5EV0lEVEg6IC8qIFNldCBiYW5kd2lkdGggKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQluc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgaXJxLT5pZnJfYmF1ZHJhdGUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NNRURJQUJVU1k6IC8qIFNldCBtZWRpYSBidXN5ICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKwkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koc2VsZi0+bmV0ZGV2LCBUUlVFKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DR1JFQ0VJVklORzogLyogQ2hlY2sgaWYgd2UgYXJlIHJlY2VpdmluZyByaWdodCBub3cgKi8KKwkJLyogVGhpcyBpcyBhbHJlYWR5IHByb3RlY3RlZCAqLworCQlpcnEtPmlmcl9yZWNlaXZpbmcgPSBuc2NfaXJjY19pc19yZWNlaXZpbmcoc2VsZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zY19pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IG5zY19pcmNjX2NiICopIGRldi0+cHJpdjsKKwkKKwlyZXR1cm4gJnNlbGYtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBuc2NfaXJjY19zdXNwZW5kKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZikKK3sKKwlJUkRBX01FU1NBR0UoIiVzLCBTdXNwZW5kaW5nXG4iLCBkcml2ZXJfbmFtZSk7CisKKwlpZiAoc2VsZi0+aW8uc3VzcGVuZGVkKQorCQlyZXR1cm47CisKKwluc2NfaXJjY19uZXRfY2xvc2Uoc2VsZi0+bmV0ZGV2KTsKKworCXNlbGYtPmlvLnN1c3BlbmRlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIG5zY19pcmNjX3dha2V1cChzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYpCit7CisJaWYgKCFzZWxmLT5pby5zdXNwZW5kZWQpCisJCXJldHVybjsKKworCW5zY19pcmNjX3NldHVwKCZzZWxmLT5pbyk7CisJbnNjX2lyY2NfbmV0X29wZW4oc2VsZi0+bmV0ZGV2KTsKKwkKKwlJUkRBX01FU1NBR0UoIiVzLCBXYWtpbmcgdXBcbiIsIGRyaXZlcl9uYW1lKTsKKworCXNlbGYtPmlvLnN1c3BlbmRlZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgbnNjX2lyY2NfcG1wcm9jKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpCit7CisgICAgICAgIHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZiA9IChzdHJ1Y3QgbnNjX2lyY2NfY2IqKSBkZXYtPmRhdGE7CisgICAgICAgIGlmIChzZWxmKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChycXN0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBQTV9TVVNQRU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgbnNjX2lyY2Nfc3VzcGVuZChzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUE1fUkVTVU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgbnNjX2lyY2Nfd2FrZXVwKHNlbGYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTlNDIElyREEgRGV2aWNlIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKK21vZHVsZV9wYXJhbShxb3NfbXR0X2JpdHMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHFvc19tdHRfYml0cywgIk1pbmltdW0gVHVybiBUaW1lIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiQmFzZSBJL08gYWRkcmVzc2VzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgbGluZXMiKTsKK21vZHVsZV9wYXJhbV9hcnJheShkbWEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRtYSwgIkRNQSBjaGFubmVscyIpOworbW9kdWxlX3BhcmFtKGRvbmdsZV9pZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZG9uZ2xlX2lkLCAiVHlwZS1pZCBvZiB1c2VkIGRvbmdsZSIpOworCittb2R1bGVfaW5pdChuc2NfaXJjY19pbml0KTsKK21vZHVsZV9leGl0KG5zY19pcmNjX2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmggYi9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkZjdlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuaApAQCAtMCwwICsxLDI4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBuc2MtaXJjYy5oCisgKiBWZXJzaW9uOiAgICAgICAKKyAqIERlc2NyaXB0aW9uOiAgIAorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgRnJpIE5vdiAxMyAxNDozNzo0MCAxOTk4CisgKiBNb2RpZmllZCBhdDogICBTdW4gSmFuIDIzIDE3OjQ3OjAwIDIwMDAKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTggTGljaGVuIFdhbmcsIDxsd2FuZ0BhY3Rpc3lzLmNvbT4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTggQWN0aXN5cyBDb3JwLiwgd3d3LmFjdGlzeXMuY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTlNDX0lSQ0NfSAorI2RlZmluZSBOU0NfSVJDQ19ICisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogRE1BIG1vZGVzIG5lZWRlZCAqLworI2RlZmluZSBETUFfVFhfTU9ERSAgICAgMHgwOCAgICAvKiBNZW0gdG8gSS9PLCArKywgZGVtYW5kLiAqLworI2RlZmluZSBETUFfUlhfTU9ERSAgICAgMHgwNCAgICAvKiBJL08gdG8gbWVtLCArKywgZGVtYW5kLiAqLworCisvKiBDb25maWcgcmVnaXN0ZXJzIGZvciB0aGUgJzEwOCAqLworI2RlZmluZSBDRkdfMTA4X0JBSUMgMHgwMAorI2RlZmluZSBDRkdfMTA4X0NTUlQgMHgwMQorI2RlZmluZSBDRkdfMTA4X01DVEwgMHgwMgorCisvKiBDb25maWcgcmVnaXN0ZXJzIGZvciB0aGUgJzMzOCAqLworI2RlZmluZSBDRkdfMzM4X0ZFUiAgMHgwMAorI2RlZmluZSBDRkdfMzM4X0ZBUiAgMHgwMQorI2RlZmluZSBDRkdfMzM4X1BUUiAgMHgwMgorI2RlZmluZSBDRkdfMzM4X1BOUDAgMHgxYgorI2RlZmluZSBDRkdfMzM4X1BOUDEgMHgxYworI2RlZmluZSBDRkdfMzM4X1BOUDMgMHg0ZgorCisvKiBDb25maWcgcmVnaXN0ZXJzIGZvciB0aGUgJzM5eCAoaW4gdGhlIGxvZ2ljYWwgZGV2aWNlIGJhbmspICovCisjZGVmaW5lIENGR18zOVhfTEROCTB4MDcJLyogTG9naWNhbCBkZXZpY2UgbnVtYmVyIChTdXBlciBJL08gYmFuaykgKi8KKyNkZWZpbmUgQ0ZHXzM5WF9TSU9DRjEJMHgyMQkvKiBTdXBlckkvTyBDb25maWcgKi8KKyNkZWZpbmUgQ0ZHXzM5WF9BQ1QJMHgzMAkvKiBEZXZpY2UgYWN0aXZhdGlvbiAqLworI2RlZmluZSBDRkdfMzlYX0JBU0VICTB4NjAJLyogRGV2aWNlIGJhc2UgYWRkcmVzcyAoaGlnaCBiaXRzKSAqLworI2RlZmluZSBDRkdfMzlYX0JBU0VMCTB4NjEJLyogRGV2aWNlIGJhc2UgYWRkcmVzcyAobG93IGJpdHMpICovCisjZGVmaW5lIENGR18zOVhfSVJRTlVNCTB4NzAJLyogSW50ZXJydXB0IG51bWJlciAmIHdha2UgdXAgZW5hYmxlICovCisjZGVmaW5lIENGR18zOVhfSVJRU0VMCTB4NzEJLyogSW50ZXJydXB0IHNlbGVjdCAoZWRnZS9sZXZlbCArIHBvbGFyaXR5KSAqLworI2RlZmluZSBDRkdfMzlYX0RNQTAJMHg3NAkvKiBETUEgMCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIENGR18zOVhfRE1BMQkweDc1CS8qIERNQSAxIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQ0ZHXzM5WF9TUEMJMHhGMAkvKiBTZXJpYWwgcG9ydCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisKKy8qIEZsYWdzIGZvciBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIENSRjAgKi8KKyNkZWZpbmUgQVBFRENSQwkJMHgwMgorI2RlZmluZSBFTkJOS1NFTAkweDAxCisKKy8qIFNldCAwICovCisjZGVmaW5lIFRYRCAgICAgICAgICAgICAweDAwIC8qIFRyYW5zbWl0IGRhdGEgcG9ydCAqLworI2RlZmluZSBSWEQgICAgICAgICAgICAgMHgwMCAvKiBSZWNlaXZlIGRhdGEgcG9ydCAqLworCisvKiBSZWdpc3RlciAxICovCisjZGVmaW5lIElFUgkJMHgwMSAvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyKi8KKyNkZWZpbmUgSUVSX1JYSERMX0lFICAgIDB4MDEgLyogUmVjZWl2ZXIgaGlnaCBkYXRhIGxldmVsIGludGVycnVwdCAqLworI2RlZmluZSBJRVJfVFhMRExfSUUgICAgMHgwMiAvKiBUcmFuc2VpdmVyIGxvdyBkYXRhIGxldmVsIGludGVycnVwdCAqLworI2RlZmluZSBJRVJfTFNfSUUJMHgwNC8vKiBMaW5rIFN0YXR1cyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSUVSX0VUWFVSSSAgICAgIDB4MDQgLyogVHggdW5kZXJydW4gKi8KKyNkZWZpbmUgSUVSX0RNQV9JRQkweDEwIC8qIERNQSBmaW5pc2hlZCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSUVSX1RYRU1QX0lFICAgIDB4MjAKKyNkZWZpbmUgSUVSX1NGSUZfSUUgICAgIDB4NDAgLyogRnJhbWUgc3RhdHVzIEZJRk8gaW50ciAqLworI2RlZmluZSBJRVJfVE1SX0lFICAgICAgMHg4MCAvKiBUaW1lciBldmVudCAqLworCisjZGVmaW5lIEZDUgkJMHgwMiAvKiAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgRkNSX0ZJRk9fRU4gICAgIDB4MDEgLyogRW5hYmxlIEZJRk8ncyAqLworI2RlZmluZSBGQ1JfUlhTUiAgICAgICAgMHgwMiAvKiBSeCBGSUZPIHNvZnQgcmVzZXQgKi8KKyNkZWZpbmUgRkNSX1RYU1IgICAgICAgIDB4MDQgLyogVHggRklGTyBzb2Z0IHJlc2V0ICovCisjZGVmaW5lIEZDUl9SWFRICTB4NDAgLyogUnggRklGTyB0aHJlc2hvbGQgKHNldCB0byAxNikgKi8KKyNkZWZpbmUgRkNSX1RYVEgJMHgyMCAvKiBUeCBGSUZPIHRocmVzaG9sZCAoc2V0IHRvIDE3KSAqLworCisjZGVmaW5lIEVJUgkJMHgwMiAvKiAocmVhZCBvbmx5KSAqLworI2RlZmluZSBFSVJfUlhIRExfRVYJMHgwMQorI2RlZmluZSBFSVJfVFhMRExfRVYgICAgMHgwMgorI2RlZmluZSBFSVJfTFNfRVYJMHgwNAorI2RlZmluZSBFSVJfRE1BX0VWCTB4MTAKKyNkZWZpbmUgRUlSX1RYRU1QX0VWCTB4MjAKKyNkZWZpbmUgRUlSX1NGSUZfRVYgICAgIDB4NDAKKyNkZWZpbmUgRUlSX1RNUl9FViAgICAgIDB4ODAKKworI2RlZmluZSBMQ1IgICAgICAgICAgICAgMHgwMyAvKiBMaW5rIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTENSX1dMU184ICAgICAgIDB4MDMgLyogOCBiaXRzICovCisKKyNkZWZpbmUgQlNSIAkgICAgICAgIDB4MDMgLyogQmFuayBzZWxlY3QgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQlNSX0JLU0UgICAgICAgIDB4ODAKKyNkZWZpbmUgQkFOSzAgCSAgICAgICAgTENSX1dMU184IC8qIE11c3QgbWFrZSBzdXJlIHRoYXQgd2Ugc2V0IDhOMSAqLworI2RlZmluZSBCQU5LMQkgICAgICAgIDB4ODAKKyNkZWZpbmUgQkFOSzIJICAgICAgICAweGUwCisjZGVmaW5lIEJBTkszCSAgICAgICAgMHhlNAorI2RlZmluZSBCQU5LNAkgICAgICAgIDB4ZTgKKyNkZWZpbmUgQkFOSzUJICAgICAgICAweGVjCisjZGVmaW5lIEJBTks2CSAgICAgICAgMHhmMAorI2RlZmluZSBCQU5LNyAgICAgCTB4ZjQKKworI2RlZmluZSBNQ1IJCTB4MDQgLyogTW9kZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE1DUl9NT0RFX01BU0sJfigweGQwKQorI2RlZmluZSBNQ1JfVUFSVCAgICAgICAgMHgwMAorI2RlZmluZSBNQ1JfUkVTRVJWRUQgIAkweDIwCQorI2RlZmluZSBNQ1JfU0hBUlBfSVIgICAgMHg0MAorI2RlZmluZSBNQ1JfU0lSICAgICAgICAgMHg2MAorI2RlZmluZSBNQ1JfTUlSICAJMHg4MAorI2RlZmluZSBNQ1JfRklSCQkweGEwCisjZGVmaW5lIE1DUl9DRUlSICAgICAgICAweGIwCisjZGVmaW5lIE1DUl9JUl9QTFMgICAgICAweDEwCisjZGVmaW5lIE1DUl9ETUFfRU4JMHgwNAorI2RlZmluZSBNQ1JfRU5fSVJRCTB4MDgKKyNkZWZpbmUgTUNSX1RYX0RGUgkweDA4CisKKyNkZWZpbmUgTFNSICAgICAgICAgICAgIDB4MDUgLyogTGluayBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTFNSX1JYREEgICAgICAgIDB4MDEgLyogUmVjZWl2ZXIgZGF0YSBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTFNSX1RYUkRZICAgICAgIDB4MjAgLyogVHJhbnNtaXR0ZXIgcmVhZHkgKi8KKyNkZWZpbmUgTFNSX1RYRU1QICAgICAgIDB4NDAgLyogVHJhbnNtaXR0ZXIgZW1wdHkgKi8KKworI2RlZmluZSBBU0NSICAgICAgICAgICAgMHgwNyAvKiBBdXhpbGxhcnkgU3RhdHVzIGFuZCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEFTQ1JfUlhGX1RPVVQgICAweDAxIC8qIFJ4IEZJRk8gdGltZW91dCAqLworI2RlZmluZSBBU0NSX0ZFTkRfSU5GICAgMHgwMiAvKiBGcmFtZSBlbmQgYnl0ZXMgaW4gcnggRklGTyAqLworI2RlZmluZSBBU0NSX1NfRU9UICAgICAgMHgwNCAvKiBTZXQgZW5kIG9mIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBBU0NUX1JYQlNZICAgICAgMHgyMCAvKiBSeCBidXN5ICovCisjZGVmaW5lIEFTQ1JfVFhVUiAgICAgICAweDQwIC8qIFRyYW5zZWl2ZXIgdW5kZXJydW4gKi8KKyNkZWZpbmUgQVNDUl9DVEUgICAgICAgIDB4ODAgLyogQ2xlYXIgdGltZXIgZXZlbnQgKi8KKworLyogQmFuayAyICovCisjZGVmaW5lIEJHREwgICAgICAgICAgICAweDAwIC8qIEJhdWQgR2VuZXJhdG9yIERpdmlzb3IgUG9ydCAoTG93IEJ5dGUpICovCisjZGVmaW5lIEJHREggICAgICAgICAgICAweDAxIC8qIEJhdWQgR2VuZXJhdG9yIERpdmlzb3IgUG9ydCAoSGlnaCBCeXRlKSAqLworCisjZGVmaW5lIEVDUjEJCTB4MDIgLyogRXh0ZW5kZWQgQ29udHJvbCBSZWdpc3RlciAxICovCisjZGVmaW5lIEVDUjFfRVhUX1NMCTB4MDEgLyogRXh0ZW5kZWQgTW9kZSBTZWxlY3QgKi8KKyNkZWZpbmUgRUNSMV9ETUFORgkweDAyIC8qIERNQSBGYWlybmVzcyAqLworI2RlZmluZSBFQ1IxX0RNQVRIICAgICAgMHgwNCAvKiBETUEgVGhyZXNob2xkICovCisjZGVmaW5lIEVDUjFfRE1BU1dQCTB4MDggLyogRE1BIFN3YXAgKi8KKworI2RlZmluZSBFWENSMgkJMHgwNAorI2RlZmluZSBFWENSMl9URlNJWgkweDAxIC8qIFJ4IEZJRk8gc2l6ZSA9IDMyICovCisjZGVmaW5lIEVYQ1IyX1JGU0laCTB4MDQgLyogVHggRklGTyBzaXplID0gMzIgKi8KKworI2RlZmluZSBUWEZMViAgICAgICAgICAgMHgwNiAvKiBUeCBGSUZPIGxldmVsICovCisjZGVmaW5lIFJYRkxWICAgICAgICAgICAweDA3IC8qIFJ4IEZJRk8gbGV2ZWwgKi8KKworLyogQmFuayAzICovCisjZGVmaW5lIE1JRAkJMHgwMAorCisvKiBCYW5rIDQgKi8KKyNkZWZpbmUgVE1STCAgICAgICAgICAgIDB4MDAgLyogVGltZXIgbG93IGJ5dGUgKi8KKyNkZWZpbmUgVE1SSCAgICAgICAgICAgIDB4MDEgLyogVGltZXIgaGlnaCBieXRlICovCisjZGVmaW5lIElSQ1IxICAgICAgICAgICAweDAyIC8qIEluZnJhcmVkIGNvbnRyb2wgcmVnaXN0ZXIgMSAqLworI2RlZmluZSBJUkNSMV9UTVJfRU4gICAgMHgwMSAvKiBUaW1lciBlbmFibGUgKi8KKworI2RlZmluZSBURlJMTAkJMHgwNAorI2RlZmluZSBURlJMSAkJMHgwNQorI2RlZmluZSBSRlJMTAkJMHgwNgorI2RlZmluZSBSRlJMSAkJMHgwNworCisvKiBCYW5rIDUgKi8KKyNkZWZpbmUgSVJDUjIgICAgICAgICAgIDB4MDQgLyogSW5mcmFyZWQgY29udHJvbCByZWdpc3RlciAyICovCisjZGVmaW5lIElSQ1IyX01EUlMgICAgICAweDA0IC8qIE1JUiBkYXRhIHJhdGUgc2VsZWN0ICovCisjZGVmaW5lIElSQ1IyX0ZFTkRfTUQgICAweDIwIC8qICovCisKKyNkZWZpbmUgRlJNX1NUICAgICAgICAgIDB4MDUgLyogRnJhbWUgc3RhdHVzIEZJRk8gKi8KKyNkZWZpbmUgRlJNX1NUX1ZMRCAgICAgIDB4ODAgLyogRnJhbWUgc3RhdHVzIEZJRk8gZGF0YSB2YWxpZCAqLworI2RlZmluZSBGUk1fU1RfRVJSX01TSyAgMHg1ZgorI2RlZmluZSBGUk1fU1RfTE9TVF9GUiAgMHg0MCAvKiBGcmFtZSBsb3N0ICovCisjZGVmaW5lIEZSTV9TVF9NQVhfTEVOICAweDEwIC8qIE1heCBmcmFtZSBsZW4gZXhjZWVkZWQgKi8KKyNkZWZpbmUgRlJNX1NUX1BIWV9FUlIgIDB4MDggLyogUGh5c2ljYWwgbGF5ZXIgZXJyb3IgKi8KKyNkZWZpbmUgRlJNX1NUX0JBRF9DUkMgIDB4MDQgCisjZGVmaW5lIEZSTV9TVF9PVlIxICAgICAweDAyIC8qIFJ4IEZJRk8gb3ZlcnJ1biAqLworI2RlZmluZSBGUk1fU1RfT1ZSMiAgICAgMHgwMSAvKiBGcmFtZSBzdGF0dXMgRklGTyBvdmVycnVuICovCisKKyNkZWZpbmUgUkZMRkwgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgUkZMRkggICAgICAgICAgIDB4MDcKKworLyogQmFuayA2ICovCisjZGVmaW5lIElSX0NGRzIJCTB4MDAKKyNkZWZpbmUgSVJfQ0ZHMl9ESVNfQ1JDCTB4MDIKKworLyogQmFuayA3ICovCisjZGVmaW5lIElSTV9DUgkJMHgwNyAvKiBJbmZyYXJlZCBtb2R1bGUgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBJUk1fQ1JfSVJYX01TTAkweDQwCisjZGVmaW5lIElSTV9DUl9BRl9NTlQgICAweDgwIC8qIEF1dG9tYXRpYyBmb3JtYXQgKi8KKworLyogTlNDIGNoaXAgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBuc2NfY2hpcCB7CisJY2hhciAqbmFtZTsgICAgICAgICAgLyogTmFtZSBvZiBjaGlwc2V0ICovCisJaW50IGNmZ1szXTsgICAgICAgICAgLyogQ29uZmlnIHJlZ2lzdGVycyAqLworCXVfaW50OF90IGNpZF9pbmRleDsgIC8qIENoaXAgaWRlbnRpZmljYXRpb24gaW5kZXggcmVnICovCisJdV9pbnQ4X3QgY2lkX3ZhbHVlOyAgLyogQ2hpcCBpZGVudGlmaWNhdGlvbiBleHBlY3RlZCB2YWx1ZSAqLworCXVfaW50OF90IGNpZF9tYXNrOyAgIC8qIENoaXAgaWRlbnRpZmljYXRpb24gcmV2aXNpb24gbWFzayAqLworCisJLyogRnVuY3Rpb25zIGZvciBwcm9iaW5nIGFuZCBpbml0aWFsaXppbmcgdGhlIHNwZWNpZmljIGNoaXAgKi8KKwlpbnQgKCpwcm9iZSkoc3RydWN0IG5zY19jaGlwICpjaGlwLCBjaGlwaW9fdCAqaW5mbyk7CisJaW50ICgqaW5pdCkoc3RydWN0IG5zY19jaGlwICpjaGlwLCBjaGlwaW9fdCAqaW5mbyk7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbnNjX2NoaXAgbnNjX2NoaXBfdDsKKworLyogRm9yIHN0b3JpbmcgZW50cmllcyBpbiB0aGUgc3RhdHVzIEZJRk8gKi8KK3N0cnVjdCBzdF9maWZvX2VudHJ5IHsKKwlpbnQgc3RhdHVzOworCWludCBsZW47Cit9OworCisjZGVmaW5lIE1BWF9UWF9XSU5ET1cgNworI2RlZmluZSBNQVhfUlhfV0lORE9XIDcKKworc3RydWN0IHN0X2ZpZm8geworCXN0cnVjdCBzdF9maWZvX2VudHJ5IGVudHJpZXNbTUFYX1JYX1dJTkRPV107CisJaW50IHBlbmRpbmdfYnl0ZXM7CisJaW50IGhlYWQ7CisJaW50IHRhaWw7CisJaW50IGxlbjsKK307CisKK3N0cnVjdCBmcmFtZV9jYiB7CisJdm9pZCAqc3RhcnQ7IC8qIFN0YXJ0IG9mIGZyYW1lIGluIERNQSBtZW0gKi8KKwlpbnQgbGVuOyAgICAgLyogTGVuZ2h0IG9mIGZyYW1lIGluIERNQSBtZW0gKi8KK307CisKK3N0cnVjdCB0eF9maWZvIHsKKwlzdHJ1Y3QgZnJhbWVfY2IgcXVldWVbTUFYX1RYX1dJTkRPV107IC8qIEluZm8gYWJvdXQgZnJhbWVzIGluIHF1ZXVlICovCisJaW50ICAgICAgICAgICAgIHB0cjsgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50bHkgYmVpbmcgc2VudCAqLworCWludCAgICAgICAgICAgICBsZW47ICAgICAgICAgICAgICAgICAgLyogTGVuZ2h0IG9mIHF1ZXVlICovCisJaW50ICAgICAgICAgICAgIGZyZWU7ICAgICAgICAgICAgICAgICAvKiBOZXh0IGZyZWUgc2xvdCAqLworCXZvaWQgICAgICAgICAgICp0YWlsOyAgICAgICAgICAgICAgICAgLyogTmV4dCBmcmVlIHN0YXJ0IGluIERNQSBtZW0gKi8KK307CisKKy8qIFByaXZhdGUgZGF0YSBmb3IgZWFjaCBpbnN0YW5jZSAqLworc3RydWN0IG5zY19pcmNjX2NiIHsKKwlzdHJ1Y3Qgc3RfZmlmbyBzdF9maWZvOyAgICAvKiBJbmZvIGFib3V0IHJlY2VpdmVkIGZyYW1lcyAqLworCXN0cnVjdCB0eF9maWZvIHR4X2ZpZm87ICAgIC8qIEluZm8gYWJvdXQgZnJhbWVzIHRvIGJlIHRyYW5zbWl0dGVkICovCisKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAgICAgLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCQorCXN0cnVjdCBpcmxhcF9jYiAqaXJsYXA7ICAgIC8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KKwlzdHJ1Y3QgcW9zX2luZm8gcW9zOyAgICAgICAvKiBRb1MgY2FwYWJpbGl0aWVzIGZvciB0aGlzIGRldmljZSAqLworCQorCWNoaXBpb190IGlvOyAgICAgICAgICAgICAgIC8qIElyREEgY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLworCWlvYnVmZl90IHR4X2J1ZmY7ICAgICAgICAgIC8qIFRyYW5zbWl0IGJ1ZmZlciAqLworCWlvYnVmZl90IHJ4X2J1ZmY7ICAgICAgICAgIC8qIFJlY2VpdmUgYnVmZmVyICovCisJZG1hX2FkZHJfdCB0eF9idWZmX2RtYTsKKwlkbWFfYWRkcl90IHJ4X2J1ZmZfZG1hOworCisJX191OCBpZXI7ICAgICAgICAgICAgICAgICAgLyogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworCisJc3RydWN0IHRpbWV2YWwgc3RhbXA7CisJc3RydWN0IHRpbWV2YWwgbm93OworCisJc3BpbmxvY2tfdCBsb2NrOyAgICAgICAgICAgLyogRm9yIHNlcmlhbGl6aW5nIG9wZXJhdGlvbnMgKi8KKwkKKwlfX3UzMiBuZXdfc3BlZWQ7CisJaW50IGluZGV4OyAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaW5kZXggKi8KKworICAgICAgICBzdHJ1Y3QgcG1fZGV2ICpkZXY7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgc3dpdGNoX2JhbmsoaW50IGlvYmFzZSwgaW50IGJhbmspCit7CisJCW91dGIoYmFuaywgaW9iYXNlK0JTUik7Cit9CisKKyNlbmRpZiAvKiBOU0NfSVJDQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL29sZF9iZWxraW4tc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL29sZF9iZWxraW4tc2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyMmM3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvb2xkX2JlbGtpbi1zaXIuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBvbGRfYmVsa2luLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMQorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgQmVsa2luIChvbGQpIFNtYXJ0QmVhbSBkb25nbGUKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4uLgorICogQXV0aG9yOiAgICAgICAgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICogQ3JlYXRlZCBhdDogICAgMjIvMTEvOTkKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBEZWMgMTcgMDk6MTM6MzIgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IEplYW4gVG91cnJpbGhlcywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorLy8gI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKKy8qCisgKiBCZWxraW4gaXMgc2VsbGluZyBhIGRvbmdsZSBjYWxsZWQgdGhlIFNtYXJ0QmVhbS4KKyAqIEluIGZhY3QsIHRoZXJlIGlzIHR3byBoYXJkd2FyZSB2ZXJzaW9uIG9mIHRoaXMgZG9uZ2xlLCBvZiBjb3Vyc2Ugd2l0aAorICogdGhlIHNhbWUgbmFtZSBhbmQgbG9va2luZyB0aGUgZXhhY3RseSBzYW1lIChncnJyLi4uKS4KKyAqIEkgZ3Vlc3MgdGhhdCBJJ3ZlIGdvdCB0aGUgb2xkIG9uZSwgYmVjYXVzZSBpbnNpZGUgSSBkb24ndCBoYXZlCisgKiBhIGp1bXBlciBmb3IgSXJEQS9BU0suLi4KKyAqCisgKiBBcyBmYXIgYXMgSSBjYW4gbWFrZSBpdCBmcm9tIGluZm8gb24gdGhlaXIgd2ViIHNpdGUsIHRoZSBvbGQgZG9uZ2xlIAorICogc3VwcG9ydCBvbmx5IDk2MDAgYi9zLCB3aGljaCBtYWtlIG91ciBsaWZlIG11Y2ggc2ltcGxlciBhcyBmYXIgYXMKKyAqIHRoZSBkcml2ZXIgaXMgY29uY2VybmVkLCBidXQgeW91IG1pZ2h0IG5vdCBsaWtlIGl0IHZlcnkgbXVjaCA7LSkKKyAqIFRoZSBuZXcgU21hcnRCZWFtIGRvZXMgMTE1IGtiL3MsIGFuZCBJJ3ZlIG5vdCB0ZXN0ZWQgaXQuLi4KKyAqCisgKiBCZWxraW4gY2xhaW0gdGhhdCB0aGUgY29ycmVjdCBkcml2ZXIgZm9yIHRoZSBvbGQgZG9uZ2xlIChpbiBXaW5kb3dzKQorICogaXMgdGhlIGdlbmVyaWMgUGFyYWxsYXggOTUwMGEgZHJpdmVyLCBidXQgdGhlIExpbnV4IExpdGVMaW5rIGRyaXZlcgorICogZmFpbHMgZm9yIG1lIChwcm9iYWJseSBiZWNhdXNlIExpbnV4LUlyREEgZG9lc24ndCByYXRlIGZhbGxiYWNrKSwKKyAqIHNvIEkgY3JlYXRlZCB0aGlzIHJlYWxseSBkdW1iIGRyaXZlci4uLgorICoKKyAqIEluIGZhY3QsIHRoaXMgZHJpdmVyIGRvZXNuJ3QgZG8gbXVjaC4gVGhlIG9ubHkgdGhpbmcgaXQgZG9lcyBpcyB0bworICogcHJldmVudCBMaW51eC1JckRBIHRvIHVzZSBhbnkgb3RoZXIgc3BlZWQgdGhhbiA5NjAwIGIvcyA7LSkgVGhpcworICogZHJpdmVyIGlzIGNhbGxlZCAib2xkX2JlbGtpbiIgc28gdGhhdCB3aGVuIHRoZSBuZXcgU21hcnRCZWFtIGlzIHN1cHBvcnRlZAorICogaXRzIGRyaXZlciBjYW4gYmUgY2FsbGVkICJiZWxraW4iIGluc3RlYWQgb2YgIm5ld19iZWxraW4iLgorICoKKyAqIE5vdGUgOiB0aGlzIGRyaXZlciB3YXMgd3JpdHRlbiB3aXRob3V0IGFueSBpbmZvL2hlbHAgZnJvbSBCZWxraW4sCisgKiBzbyBhIGxvdCBvZiBpbmZvIGhlcmUgbWlnaHQgYmUgdG90YWxseSB3cm9uZy4gQmxhbWUgbWUgOy0pCisgKi8KKworc3RhdGljIGludCBvbGRfYmVsa2luX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldik7CitzdGF0aWMgaW50IG9sZF9iZWxraW5fY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldik7CitzdGF0aWMgaW50IG9sZF9iZWxraW5fY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKTsKK3N0YXRpYyBpbnQgb2xkX2JlbGtpbl9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKKworc3RhdGljIHN0cnVjdCBkb25nbGVfZHJpdmVyIG9sZF9iZWxraW4gPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZQk9ICJPbGQgQmVsa2luIFNtYXJ0QmVhbSIsCisJLnR5cGUJCT0gSVJEQV9PTERfQkVMS0lOX0RPTkdMRSwKKwkub3BlbgkJPSBvbGRfYmVsa2luX29wZW4sCisJLmNsb3NlCQk9IG9sZF9iZWxraW5fY2xvc2UsCisJLnJlc2V0CQk9IG9sZF9iZWxraW5fcmVzZXQsCisJLnNldF9zcGVlZAk9IG9sZF9iZWxraW5fY2hhbmdlX3NwZWVkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgb2xkX2JlbGtpbl9zaXJfaW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX3JlZ2lzdGVyX2RvbmdsZSgmb2xkX2JlbGtpbik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbGRfYmVsa2luX3Npcl9jbGVhbnVwKHZvaWQpCit7CisJaXJkYV91bnJlZ2lzdGVyX2RvbmdsZSgmb2xkX2JlbGtpbik7Cit9CisKK3N0YXRpYyBpbnQgb2xkX2JlbGtpbl9vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHFvc19pbmZvICpxb3MgPSAmZGV2LT5xb3M7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUG93ZXIgb24gZG9uZ2xlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisKKwkvKiBOb3QgdG9vIGZhc3QsIHBsZWFzZS4uLiAqLworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMDsKKwkvKiBOZWVkcyBhdCBsZWFzdCAxMCBtcyAodG90YWxseSB3aWxkIGd1ZXNzLCBjYW4gZG8gcHJvYmFibHkgYmV0dGVyKSAqLworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMTsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7CisKKwkvKiBpcmRhIHRocmVhZCB3YWl0cyA1MCBtc2VjIGZvciBwb3dlciBzZXR0bGluZyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2xkX2JlbGtpbl9jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIEZBTFNFKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gb2xkX2JlbGtpbl9jaGFuZ2Vfc3BlZWQgKHRhc2spCisgKgorICogICAgV2l0aCBvbmx5IG9uZSBzcGVlZCBhdmFpbGFibGUsIG5vdCBtdWNoIHRvIGRvLi4uCisgKi8KK3N0YXRpYyBpbnQgb2xkX2JlbGtpbl9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWRldi0+c3BlZWQgPSA5NjAwOworCXJldHVybiAoc3BlZWQ9PWRldi0+c3BlZWQpID8gMCA6IC1FSU5WQUw7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBvbGRfYmVsa2luX3Jlc2V0ICh0YXNrKQorICoKKyAqICAgICAgUmVzZXQgdGhlIE9sZC1CZWxraW4gdHlwZSBkb25nbGUuCisgKgorICovCitzdGF0aWMgaW50IG9sZF9iZWxraW5fcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogVGhpcyBkb25nbGVzIHNwZWVkICJkZWZhdWx0cyIgdG8gOTYwMCBicHMgOy0pICovCisJZGV2LT5zcGVlZCA9IDk2MDA7CisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCZWxraW4gKG9sZCkgU21hcnRCZWFtIGRvbmdsZSBkcml2ZXIiKTsJCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTciKTsgLyogSVJEQV9PTERfQkVMS0lOX0RPTkdMRSAqLworCittb2R1bGVfaW5pdChvbGRfYmVsa2luX3Npcl9pbml0KTsKK21vZHVsZV9leGl0KG9sZF9iZWxraW5fc2lyX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9vbGRfYmVsa2luLmMgYi9kcml2ZXJzL25ldC9pcmRhL29sZF9iZWxraW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmY4MWZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9vbGRfYmVsa2luLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgb2xkX2JlbGtpbi5jCisgKiBWZXJzaW9uOiAgICAgICAxLjEKKyAqIERlc2NyaXB0aW9uOiAgIERyaXZlciBmb3IgdGhlIEJlbGtpbiAob2xkKSBTbWFydEJlYW0gZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuLi4KKyAqIEF1dGhvcjogICAgICAgIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqIENyZWF0ZWQgYXQ6ICAgIDIyLzExLzk5CisgKiBNb2RpZmllZCBhdDogICBGcmkgRGVjIDE3IDA5OjEzOjMyIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OSBKZWFuIFRvdXJyaWxoZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisvKgorICogQmVsa2luIGlzIHNlbGxpbmcgYSBkb25nbGUgY2FsbGVkIHRoZSBTbWFydEJlYW0uCisgKiBJbiBmYWN0LCB0aGVyZSBpcyB0d28gaGFyZHdhcmUgdmVyc2lvbiBvZiB0aGlzIGRvbmdsZSwgb2YgY291cnNlIHdpdGgKKyAqIHRoZSBzYW1lIG5hbWUgYW5kIGxvb2tpbmcgdGhlIGV4YWN0bHkgc2FtZSAoZ3Jyci4uLikuCisgKiBJIGd1ZXNzIHRoYXQgSSd2ZSBnb3QgdGhlIG9sZCBvbmUsIGJlY2F1c2UgaW5zaWRlIEkgZG9uJ3QgaGF2ZQorICogYSBqdW1wZXIgZm9yIElyREEvQVNLLi4uCisgKgorICogQXMgZmFyIGFzIEkgY2FuIG1ha2UgaXQgZnJvbSBpbmZvIG9uIHRoZWlyIHdlYiBzaXRlLCB0aGUgb2xkIGRvbmdsZSAKKyAqIHN1cHBvcnQgb25seSA5NjAwIGIvcywgd2hpY2ggbWFrZSBvdXIgbGlmZSBtdWNoIHNpbXBsZXIgYXMgZmFyIGFzCisgKiB0aGUgZHJpdmVyIGlzIGNvbmNlcm5lZCwgYnV0IHlvdSBtaWdodCBub3QgbGlrZSBpdCB2ZXJ5IG11Y2ggOy0pCisgKiBUaGUgbmV3IFNtYXJ0QmVhbSBkb2VzIDExNSBrYi9zLCBhbmQgSSd2ZSBub3QgdGVzdGVkIGl0Li4uCisgKgorICogQmVsa2luIGNsYWltIHRoYXQgdGhlIGNvcnJlY3QgZHJpdmVyIGZvciB0aGUgb2xkIGRvbmdsZSAoaW4gV2luZG93cykKKyAqIGlzIHRoZSBnZW5lcmljIFBhcmFsbGF4IDk1MDBhIGRyaXZlciwgYnV0IHRoZSBMaW51eCBMaXRlTGluayBkcml2ZXIKKyAqIGZhaWxzIGZvciBtZSAocHJvYmFibHkgYmVjYXVzZSBMaW51eC1JckRBIGRvZXNuJ3QgcmF0ZSBmYWxsYmFjayksCisgKiBzbyBJIGNyZWF0ZWQgdGhpcyByZWFsbHkgZHVtYiBkcml2ZXIuLi4KKyAqCisgKiBJbiBmYWN0LCB0aGlzIGRyaXZlciBkb2Vzbid0IGRvIG11Y2guIFRoZSBvbmx5IHRoaW5nIGl0IGRvZXMgaXMgdG8KKyAqIHByZXZlbnQgTGludXgtSXJEQSB0byB1c2UgYW55IG90aGVyIHNwZWVkIHRoYW4gOTYwMCBiL3MgOy0pIFRoaXMKKyAqIGRyaXZlciBpcyBjYWxsZWQgIm9sZF9iZWxraW4iIHNvIHRoYXQgd2hlbiB0aGUgbmV3IFNtYXJ0QmVhbSBpcyBzdXBwb3J0ZWQKKyAqIGl0cyBkcml2ZXIgY2FuIGJlIGNhbGxlZCAiYmVsa2luIiBpbnN0ZWFkIG9mICJuZXdfYmVsa2luIi4KKyAqCisgKiBOb3RlIDogdGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gd2l0aG91dCBhbnkgaW5mby9oZWxwIGZyb20gQmVsa2luLAorICogc28gYSBsb3Qgb2YgaW5mbyBoZXJlIG1pZ2h0IGJlIHRvdGFsbHkgd3JvbmcuIEJsYW1lIG1lIDstKQorICovCisKKy8qIExldCdzIGd1ZXNzICovCisjZGVmaW5lIE1JTl9ERUxBWSAyNSAgICAgIC8qIDE1IHVzLCBidXQgd2FpdCBhIGxpdHRsZSBtb3JlIHRvIGJlIHN1cmUgKi8KKworc3RhdGljIHZvaWQgb2xkX2JlbGtpbl9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CitzdGF0aWMgdm9pZCBvbGRfYmVsa2luX2Nsb3NlKGRvbmdsZV90ICpzZWxmKTsKK3N0YXRpYyBpbnQgIG9sZF9iZWxraW5fY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworc3RhdGljIGludCAgb2xkX2JlbGtpbl9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKKworLyogVGhlc2UgYXJlIHRoZSBiYXVkcmF0ZXMgc3VwcG9ydGVkICovCisvKiBzdGF0aWMgX191MzIgYmF1ZF9yYXRlc1tdID0geyA5NjAwIH07ICovCisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX3JlZyBkb25nbGUgPSB7CisJLnR5cGUgPSBJUkRBX09MRF9CRUxLSU5fRE9OR0xFLAorCS5vcGVuID0gb2xkX2JlbGtpbl9vcGVuLAorCS5jbG9zZSA9IG9sZF9iZWxraW5fY2xvc2UsCisJLnJlc2V0ID0gb2xkX2JlbGtpbl9yZXNldCwKKwkuY2hhbmdlX3NwZWVkID0gb2xkX2JlbGtpbl9jaGFuZ2Vfc3BlZWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvbGRfYmVsa2luX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb2xkX2JlbGtpbl9jbGVhbnVwKHZvaWQpCit7CisJaXJkYV9kZXZpY2VfdW5yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK3N0YXRpYyB2b2lkIG9sZF9iZWxraW5fb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpCit7CisJLyogTm90IHRvbyBmYXN0LCBwbGVhc2UuLi4gKi8KKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDA7CisJLyogTmVlZHMgYXQgbGVhc3QgMTAgbXMgKHRvdGFsbHkgd2lsZCBndWVzcywgY2FuIGRvIHByb2JhYmx5IGJldHRlcikgKi8KKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4MDE7Cit9CisKK3N0YXRpYyB2b2lkIG9sZF9iZWxraW5fY2xvc2UoZG9uZ2xlX3QgKnNlbGYpCit7CisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG9sZF9iZWxraW5fY2hhbmdlX3NwZWVkICh0YXNrKQorICoKKyAqICAgIFdpdGggb25seSBvbmUgc3BlZWQgYXZhaWxhYmxlLCBub3QgbXVjaCB0byBkby4uLgorICovCitzdGF0aWMgaW50IG9sZF9iZWxraW5fY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBvbGRfYmVsa2luX3Jlc2V0ICh0YXNrKQorICoKKyAqICAgICAgUmVzZXQgdGhlIE9sZC1CZWxraW4gdHlwZSBkb25nbGUuCisgKgorICovCitzdGF0aWMgaW50IG9sZF9iZWxraW5fcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKworCS8qIFBvd2VyIG9uIGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisKKwkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCS8qIFRoaXMgZG9uZ2xlcyBzcGVlZCAiZGVmYXVsdHMiIHRvIDk2MDAgYnBzIDstKSAqLworCXNlbGYtPnNwZWVkID0gOTYwMDsKKworCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKworCXJldHVybiAwOworfQorCitNT0RVTEVfQVVUSE9SKCJKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJlbGtpbiAob2xkKSBTbWFydEJlYW0gZG9uZ2xlIGRyaXZlciIpOwkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtNyIpOyAvKiBJUkRBX09MRF9CRUxLSU5fRE9OR0xFICovCisKKy8qCisgKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplIE9sZC1CZWxraW4gbW9kdWxlCisgKgorICovCittb2R1bGVfaW5pdChvbGRfYmVsa2luX2luaXQpOworCisvKgorICogRnVuY3Rpb24gY2xlYW51cF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgQ2xlYW51cCBPbGQtQmVsa2luIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2V4aXQob2xkX2JlbGtpbl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2ExMTAwX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZjUwOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jCkBAIC0wLDAgKzEsMTA0NSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIEluZnJhLXJlZCBkcml2ZXIgZm9yIHRoZSBTdHJvbmdBUk0gU0ExMTAwIGVtYmVkZGVkIG1pY3JvcHJvY2Vzc29yCisgKgorICogIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBTQTExMTEncyBETUEgYnVncyBpbiBoZXJlLAorICogIHNvIHdlIHVzZSB0aGUgc3RyYWlnaHQgZm9yd2FyZCBkbWFfbWFwXyogZnVuY3Rpb25zIHdpdGggYSBudWxsIHBvaW50ZXIuCisgKgorICogIFRoaXMgZHJpdmVyIHRha2VzIG9uZSBrZXJuZWwgY29tbWFuZCBsaW5lIHBhcmFtZXRlciwgc2ExMTAwaXI9LCB3aXRoCisgKiAgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorICoJbWF4X3JhdGU6YmF1ZHJhdGUJLSBzZXQgdGhlIG1heGltdW0gYmF1ZCByYXRlCisgKglwb3dlcl9sZXZlOmxldmVsCS0gc2V0IHRoZSB0cmFuc21pdHRlciBwb3dlciBsZXZlbAorICoJdHhfbHBtOjB8MQkJLSBzZXQgdHJhbnNtaXQgbG93IHBvd2VyIG1vZGUKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcmRhLmg+CisKK3N0YXRpYyBpbnQgcG93ZXJfbGV2ZWwgPSAzOworc3RhdGljIGludCB0eF9scG07CitzdGF0aWMgaW50IG1heF9yYXRlID0gNDAwMDAwMDsKKworc3RydWN0IHNhMTEwMF9pcmRhIHsKKwl1bnNpZ25lZCBjaGFyCQloc2NyMDsKKwl1bnNpZ25lZCBjaGFyCQl1dGNyNDsKKwl1bnNpZ25lZCBjaGFyCQlwb3dlcjsKKwl1bnNpZ25lZCBjaGFyCQlvcGVuOworCisJaW50CQkJc3BlZWQ7CisJaW50CQkJbmV3c3BlZWQ7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnR4c2tiOworCXN0cnVjdCBza19idWZmCQkqcnhza2I7CisJZG1hX2FkZHJfdAkJdHhidWZfZG1hOworCWRtYV9hZGRyX3QJCXJ4YnVmX2RtYTsKKwlkbWFfcmVnc190CQkqdHhkbWE7CisJZG1hX3JlZ3NfdAkJKnJ4ZG1hOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlzdHJ1Y3QgaXJkYV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgaXJsYXBfY2IJCSppcmxhcDsKKwlzdHJ1Y3QgcW9zX2luZm8JCXFvczsKKworCWlvYnVmZl90CQl0eF9idWZmOworCWlvYnVmZl90CQlyeF9idWZmOworfTsKKworI2RlZmluZSBJU19GSVIoc2kpCQkoKHNpKS0+c3BlZWQgPj0gNDAwMDAwMCkKKworI2RlZmluZSBIUFNJUl9NQVhfUlhMRU4JCTIwNDcKKworLyoKKyAqIEFsbG9jYXRlIGFuZCBtYXAgdGhlIHJlY2VpdmUgYnVmZmVyLCB1bmxlc3MgaXQgaXMgYWxyZWFkeSBhbGxvY2F0ZWQuCisgKi8KK3N0YXRpYyBpbnQgc2ExMTAwX2lyZGFfcnhfYWxsb2Moc3RydWN0IHNhMTEwMF9pcmRhICpzaSkKK3sKKwlpZiAoc2ktPnJ4c2tiKQorCQlyZXR1cm4gMDsKKworCXNpLT5yeHNrYiA9IGFsbG9jX3NrYihIUFNJUl9NQVhfUlhMRU4gKyAxLCBHRlBfQVRPTUlDKTsKKworCWlmICghc2ktPnJ4c2tiKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2ExMTAwX2lyOiBvdXQgb2YgbWVtb3J5IGZvciBSWCBTS0JcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIEFsaWduIGFueSBJUCBoZWFkZXJzIHRoYXQgbWF5IGJlIGNvbnRhaW5lZAorCSAqIHdpdGhpbiB0aGUgZnJhbWUuCisJICovCisJc2tiX3Jlc2VydmUoc2ktPnJ4c2tiLCAxKTsKKworCXNpLT5yeGJ1Zl9kbWEgPSBkbWFfbWFwX3NpbmdsZShzaS0+ZGV2LCBzaS0+cnhza2ItPmRhdGEsCisJCQkJCUhQU0lSX01BWF9SWExFTiwKKwkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlIHdhbnQgdG8gZ2V0IGhlcmUgYXMgc29vbiBhcyBwb3NzaWJsZSwgYW5kIGdldCB0aGUgcmVjZWl2ZXIgc2V0dXAuCisgKiBXZSB1c2UgdGhlIGV4aXN0aW5nIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgc2ExMTAwX2lyZGFfcnhfZG1hX3N0YXJ0KHN0cnVjdCBzYTExMDBfaXJkYSAqc2kpCit7CisJaWYgKCFzaS0+cnhza2IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzYTExMDBfaXI6IHJ4IGJ1ZmZlciB3ZW50IG1pc3NpbmdcbiIpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBGaXJzdCBlbXB0eSByZWNlaXZlIEZJRk8KKwkgKi8KKwlTZXIySFNDUjAgPSBzaS0+aHNjcjAgfCBIU0NSMF9IU1NQOworCisJLyoKKwkgKiBFbmFibGUgdGhlIERNQSwgcmVjZWl2ZXIgYW5kIHJlY2VpdmUgaW50ZXJydXB0LgorCSAqLworCXNhMTEwMF9jbGVhcl9kbWEoc2ktPnJ4ZG1hKTsKKwlzYTExMDBfc3RhcnRfZG1hKHNpLT5yeGRtYSwgc2ktPnJ4YnVmX2RtYSwgSFBTSVJfTUFYX1JYTEVOKTsKKwlTZXIySFNDUjAgPSBzaS0+aHNjcjAgfCBIU0NSMF9IU1NQIHwgSFNDUjBfUlhFOworfQorCisvKgorICogU2V0IHRoZSBJckRBIGNvbW11bmljYXRpb25zIHNwZWVkLgorICovCitzdGF0aWMgaW50IHNhMTEwMF9pcmRhX3NldF9zcGVlZChzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpLCBpbnQgc3BlZWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgYnJkLCByZXQgPSAtRUlOVkFMOworCisJc3dpdGNoIChzcGVlZCkgeworCWNhc2UgOTYwMDoJY2FzZSAxOTIwMDoJY2FzZSAzODQwMDoKKwljYXNlIDU3NjAwOgljYXNlIDExNTIwMDoKKwkJYnJkID0gMzY4NjQwMCAvICgxNiAqIHNwZWVkKSAtIDE7CisKKwkJLyoKKwkJICogU3RvcCB0aGUgcmVjZWl2ZSBETUEuCisJCSAqLworCQlpZiAoSVNfRklSKHNpKSkKKwkJCXNhMTEwMF9zdG9wX2RtYShzaS0+cnhkbWEpOworCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCQlTZXIyVVRDUjMgPSAwOworCQlTZXIySFNDUjAgPSBIU0NSMF9VQVJUOworCisJCVNlcjJVVENSMSA9IGJyZCA+PiA4OworCQlTZXIyVVRDUjIgPSBicmQ7CisKKwkJLyoKKwkJICogQ2xlYXIgc3RhdHVzIHJlZ2lzdGVyCisJCSAqLworCQlTZXIyVVRTUjAgPSBVVFNSMF9SRUIgfCBVVFNSMF9SQkIgfCBVVFNSMF9SSUQ7CisJCVNlcjJVVENSMyA9IFVUQ1IzX1JJRSB8IFVUQ1IzX1JYRSB8IFVUQ1IzX1RYRTsKKworCQlpZiAoc2ktPnBkYXRhLT5zZXRfc3BlZWQpCisJCQlzaS0+cGRhdGEtPnNldF9zcGVlZChzaS0+ZGV2LCBzcGVlZCk7CisKKwkJc2ktPnNwZWVkID0gc3BlZWQ7CisKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXQgPSAwOworCQlicmVhazsKKworCWNhc2UgNDAwMDAwMDoKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJCXNpLT5oc2NyMCA9IDA7CisKKwkJU2VyMkhTU1IwID0gMHhmZjsKKwkJU2VyMkhTQ1IwID0gc2ktPmhzY3IwIHwgSFNDUjBfSFNTUDsKKwkJU2VyMlVUQ1IzID0gMDsKKworCQlzaS0+c3BlZWQgPSBzcGVlZDsKKworCQlpZiAoc2ktPnBkYXRhLT5zZXRfc3BlZWQpCisJCQlzaS0+cGRhdGEtPnNldF9zcGVlZChzaS0+ZGV2LCBzcGVlZCk7CisKKwkJc2ExMTAwX2lyZGFfcnhfYWxsb2Moc2kpOworCQlzYTExMDBfaXJkYV9yeF9kbWFfc3RhcnQoc2kpOworCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDb250cm9sIHRoZSBwb3dlciBzdGF0ZSBvZiB0aGUgSXJEQSB0cmFuc21pdHRlci4KKyAqIFN0YXRlOgorICogIDAgLSBvZmYKKyAqICAxIC0gc2hvcnQgcmFuZ2UsIGxvd2VzdCBwb3dlcgorICogIDIgLSBtZWRpdW0gcmFuZ2UsIG1lZGl1bSBwb3dlcgorICogIDMgLSBtYXhpbXVtIHJhbmdlLCBoaWdoIHBvd2VyCisgKgorICogQ3VycmVudGx5LCBvbmx5IGFzc2FiZXQgaXMga25vd24gdG8gc3VwcG9ydCB0aGlzLgorICovCitzdGF0aWMgaW50CitfX3NhMTEwMF9pcmRhX3NldF9wb3dlcihzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpLCB1bnNpZ25lZCBpbnQgc3RhdGUpCit7CisJaW50IHJldCA9IDA7CisJaWYgKHNpLT5wZGF0YS0+c2V0X3Bvd2VyKQorCQlyZXQgPSBzaS0+cGRhdGEtPnNldF9wb3dlcihzaS0+ZGV2LCBzdGF0ZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NhMTEwMF9zZXRfcG93ZXIoc3RydWN0IHNhMTEwMF9pcmRhICpzaSwgdW5zaWduZWQgaW50IHN0YXRlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBfX3NhMTEwMF9pcmRhX3NldF9wb3dlcihzaSwgc3RhdGUpOworCWlmIChyZXQgPT0gMCkKKwkJc2ktPnBvd2VyID0gc3RhdGU7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNhMTEwMF9pcmRhX3N0YXJ0dXAoc3RydWN0IHNhMTEwMF9pcmRhICpzaSkKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0aGUgcG9ydHMgZm9yIHRoaXMgZGV2aWNlIGFyZSBzZXR1cCBjb3JyZWN0bHkuCisJICovCisJaWYgKHNpLT5wZGF0YS0+c3RhcnR1cCkKKwkJc2ktPnBkYXRhLT5zdGFydHVwKHNpLT5kZXYpOworCisJLyoKKwkgKiBDb25maWd1cmUgUFBDIGZvciBJUkRBIC0gd2Ugd2FudCB0byBkcml2ZSBUWEQyIGxvdy4KKwkgKiBXZSBhbHNvIHdhbnQgdG8gZHJpdmUgdGhpcyBwaW4gbG93IGR1cmluZyBzbGVlcC4KKwkgKi8KKwlQUFNSICY9IH5QUENfVFhEMjsKKwlQU0RSICY9IH5QUENfVFhEMjsKKwlQUERSIHw9IFBQQ19UWEQyOworCisJLyoKKwkgKiBFbmFibGUgSFAtU0lSIG1vZHVsYXRpb24sIGFuZCBlbnN1cmUgdGhhdCB0aGUgcG9ydCBpcyBkaXNhYmxlZC4KKwkgKi8KKwlTZXIyVVRDUjMgPSAwOworCVNlcjJIU0NSMCA9IEhTQ1IwX1VBUlQ7CisJU2VyMlVUQ1I0ID0gc2ktPnV0Y3I0OworCVNlcjJVVENSMCA9IFVUQ1IwXzhCaXREYXRhOworCVNlcjJIU0NSMiA9IEhTQ1IyX1RyRGF0YUggfCBIU0NSMl9SY0RhdGFMOworCisJLyoKKwkgKiBDbGVhciBzdGF0dXMgcmVnaXN0ZXIKKwkgKi8KKwlTZXIyVVRTUjAgPSBVVFNSMF9SRUIgfCBVVFNSMF9SQkIgfCBVVFNSMF9SSUQ7CisKKwlyZXQgPSBzYTExMDBfaXJkYV9zZXRfc3BlZWQoc2ksIHNpLT5zcGVlZCA9IDk2MDApOworCWlmIChyZXQpIHsKKwkJU2VyMlVUQ1IzID0gMDsKKwkJU2VyMkhTQ1IwID0gMDsKKworCQlpZiAoc2ktPnBkYXRhLT5zaHV0ZG93bikKKwkJCXNpLT5wZGF0YS0+c2h1dGRvd24oc2ktPmRldik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2ExMTAwX2lyZGFfc2h1dGRvd24oc3RydWN0IHNhMTEwMF9pcmRhICpzaSkKK3sKKwkvKgorCSAqIFN0b3AgYWxsIERNQSBhY3Rpdml0eS4KKwkgKi8KKwlzYTExMDBfc3RvcF9kbWEoc2ktPnJ4ZG1hKTsKKwlzYTExMDBfc3RvcF9kbWEoc2ktPnR4ZG1hKTsKKworCS8qIERpc2FibGUgdGhlIHBvcnQuICovCisJU2VyMlVUQ1IzID0gMDsKKwlTZXIySFNDUjAgPSAwOworCisJaWYgKHNpLT5wZGF0YS0+c2h1dGRvd24pCisJCXNpLT5wZGF0YS0+c2h1dGRvd24oc2ktPmRldik7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKy8qCisgKiBTdXNwZW5kIHRoZSBJckRBIGludGVyZmFjZS4KKyAqLworc3RhdGljIGludCBzYTExMDBfaXJkYV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHUzMiBzdGF0ZSwgdTMyIGxldmVsKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisJc3RydWN0IHNhMTEwMF9pcmRhICpzaTsKKworCWlmICghZGV2IHx8IGxldmVsICE9IFNVU1BFTkRfRElTQUJMRSkKKwkJcmV0dXJuIDA7CisKKwlzaSA9IGRldi0+cHJpdjsKKwlpZiAoc2ktPm9wZW4pIHsKKwkJLyoKKwkJICogU3RvcCB0aGUgdHJhbnNtaXQgcXVldWUKKwkJICovCisJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCQlzYTExMDBfaXJkYV9zaHV0ZG93bihzaSk7CisJCV9fc2ExMTAwX2lyZGFfc2V0X3Bvd2VyKHNpLCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlc3VtZSB0aGUgSXJEQSBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyBpbnQgc2ExMTAwX2lyZGFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHUzMiBsZXZlbCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworCXN0cnVjdCBzYTExMDBfaXJkYSAqc2k7CisKKwlpZiAoIWRldiB8fCBsZXZlbCAhPSBSRVNVTUVfRU5BQkxFKQorCQlyZXR1cm4gMDsKKworCXNpID0gZGV2LT5wcml2OworCWlmIChzaS0+b3BlbikgeworCQkvKgorCQkgKiBJZiB3ZSBtaXNzZWQgYSBzcGVlZCBjaGFuZ2UsIGluaXRpYWxpc2UgYXQgdGhlIG5ldyBzcGVlZAorCQkgKiBkaXJlY3RseS4gIEl0IGlzIGRlYmF0YWJsZSB3aGV0aGVyIHRoaXMgaXMgYWN0dWFsbHkKKwkJICogcmVxdWlyZWQsIGJ1dCBpbiB0aGUgaW50ZXJlc3RzIG9mIGNvbnRpbnVpbmcgZnJvbSB3aGVyZQorCQkgKiB3ZSBsZWZ0IG9mZiBpdCBpcyBkZXNpcmVhYmxlLiAgVGhlIGNvbnZlcnNlIGFyZ3VtZW50IGlzCisJCSAqIHRoYXQgd2Ugc2hvdWxkIHJlLW5lZ290aWF0ZSBhdCA5NjAwIGJhdWQgYWdhaW4uCisJCSAqLworCQlpZiAoc2ktPm5ld3NwZWVkKSB7CisJCQlzaS0+c3BlZWQgPSBzaS0+bmV3c3BlZWQ7CisJCQlzaS0+bmV3c3BlZWQgPSAwOworCQl9CisKKwkJc2ExMTAwX2lyZGFfc3RhcnR1cChzaSk7CisJCV9fc2ExMTAwX2lyZGFfc2V0X3Bvd2VyKHNpLCBzaS0+cG93ZXIpOworCQllbmFibGVfaXJxKGRldi0+aXJxKTsKKworCQkvKgorCQkgKiBUaGlzIGF1dG9tYXRpY2FsbHkgd2FrZXMgdXAgdGhlIHF1ZXVlCisJCSAqLworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBzYTExMDBfaXJkYV9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgc2ExMTAwX2lyZGFfcmVzdW1lCU5VTEwKKyNlbmRpZgorCisvKgorICogSFAtU0lSIGZvcm1hdCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lcy4KKyAqLworc3RhdGljIHZvaWQgc2ExMTAwX2lyZGFfaHBzaXJfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNhMTEwMF9pcmRhICpzaSA9IGRldi0+cHJpdjsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gU2VyMlVUU1IwOworCisJLyoKKwkgKiBEZWFsIHdpdGggYW55IHJlY2VpdmUgZXJyb3JzIGZpcnN0LiAgVGhlIGJ5dGVzIGluIGVycm9yIG1heSBiZQorCSAqIHRoZSBvbmx5IGJ5dGVzIGluIHRoZSByZWNlaXZlIEZJRk8sIHNvIHdlIGRvIHRoaXMgZmlyc3QuCisJICovCisJd2hpbGUgKHN0YXR1cyAmIFVUU1IwX0VJRikgeworCQlpbnQgc3RhdCwgZGF0YTsKKworCQlzdGF0ID0gU2VyMlVUU1IxOworCQlkYXRhID0gU2VyMlVURFI7CisKKwkJaWYgKHN0YXQgJiAoVVRTUjFfRlJFIHwgVVRTUjFfUk9SKSkgeworCQkJc2ktPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHN0YXQgJiBVVFNSMV9GUkUpCisJCQkJc2ktPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKHN0YXQgJiBVVFNSMV9ST1IpCisJCQkJc2ktPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCX0gZWxzZQorCQkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmc2ktPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIGRhdGEpOworCisJCXN0YXR1cyA9IFNlcjJVVFNSMDsKKwl9CisKKwkvKgorCSAqIFdlIG11c3QgY2xlYXIgY2VydGFpbiBiaXRzLgorCSAqLworCVNlcjJVVFNSMCA9IHN0YXR1cyAmIChVVFNSMF9SSUQgfCBVVFNSMF9SQkIgfCBVVFNSMF9SRUIpOworCisJaWYgKHN0YXR1cyAmIFVUU1IwX1JGUykgeworCQkvKgorCQkgKiBUaGVyZSBhcmUgYXQgbGVhc3QgNCBieXRlcyBpbiB0aGUgRklGTy4gIFJlYWQgMyBieXRlcworCQkgKiBhbmQgbGVhdmUgdGhlIHJlc3QgdG8gdGhlIGJsb2NrIGJlbG93LgorCQkgKi8KKwkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmc2ktPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIFNlcjJVVERSKTsKKwkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmc2ktPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIFNlcjJVVERSKTsKKwkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmc2ktPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIFNlcjJVVERSKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgKFVUU1IwX1JGUyB8IFVUU1IwX1JJRCkpIHsKKwkJLyoKKwkJICogRmlmbyBjb250YWlucyBtb3JlIHRoYW4gMSBjaGFyYWN0ZXIuCisJCSAqLworCQlkbyB7CisJCQlhc3luY191bndyYXBfY2hhcihkZXYsICZzaS0+c3RhdHMsICZzaS0+cnhfYnVmZiwKKwkJCQkJICBTZXIyVVREUik7CisJCX0gd2hpbGUgKFNlcjJVVFNSMSAmIFVUU1IxX1JORSk7CisKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwl9CisKKwlpZiAoc3RhdHVzICYgVVRTUjBfVEZTICYmIHNpLT50eF9idWZmLmxlbikgeworCQkvKgorCQkgKiBUcmFuc21pdHRlciBGSUZPIGlzIG5vdCBmdWxsCisJCSAqLworCQlkbyB7CisJCQlTZXIyVVREUiA9ICpzaS0+dHhfYnVmZi5kYXRhKys7CisJCQlzaS0+dHhfYnVmZi5sZW4gLT0gMTsKKwkJfSB3aGlsZSAoU2VyMlVUU1IxICYgVVRTUjFfVE5GICYmIHNpLT50eF9idWZmLmxlbik7CisKKwkJaWYgKHNpLT50eF9idWZmLmxlbiA9PSAwKSB7CisJCQlzaS0+c3RhdHMudHhfcGFja2V0cysrOworCQkJc2ktPnN0YXRzLnR4X2J5dGVzICs9IHNpLT50eF9idWZmLmRhdGEgLQorCQkJCQkgICAgICBzaS0+dHhfYnVmZi5oZWFkOworCisJCQkvKgorCQkJICogV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgdHJhbnNtaXR0ZXIgaGFzCisJCQkgKiBmaW5pc2hlZC4KKwkJCSAqLworCQkJZG8KKwkJCQlybWIoKTsKKwkJCXdoaWxlIChTZXIyVVRTUjEgJiBVVFNSMV9UQlkpOworCisJCQkvKgorCQkJICogT2ssIHdlJ3ZlIGZpbmlzaGVkIHRyYW5zbWl0dGluZy4gIE5vdyBlbmFibGUKKwkJCSAqIHRoZSByZWNlaXZlci4gIFNvbWV0aW1lcyB3ZSBnZXQgYSByZWNlaXZlIElSUQorCQkJICogaW1tZWRpYXRlbHkgYWZ0ZXIgYSB0cmFuc21pdC4uLgorCQkJICovCisJCQlTZXIyVVRTUjAgPSBVVFNSMF9SRUIgfCBVVFNSMF9SQkIgfCBVVFNSMF9SSUQ7CisJCQlTZXIyVVRDUjMgPSBVVENSM19SSUUgfCBVVENSM19SWEUgfCBVVENSM19UWEU7CisKKwkJCWlmIChzaS0+bmV3c3BlZWQpIHsKKwkJCQlzYTExMDBfaXJkYV9zZXRfc3BlZWQoc2ksIHNpLT5uZXdzcGVlZCk7CisJCQkJc2ktPm5ld3NwZWVkID0gMDsKKwkJCX0KKworCQkJLyogSSdtIGh1bmdyeSEgKi8KKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2ExMTAwX2lyZGFfZmlyX2Vycm9yKHN0cnVjdCBzYTExMDBfaXJkYSAqc2ksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNpLT5yeHNrYjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXVuc2lnbmVkIGludCBsZW4sIHN0YXQsIGRhdGE7CisKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9FUlIgInNhMTEwMF9pcjogU0tCIGlzIE5VTEwhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogR2V0IHRoZSBjdXJyZW50IGRhdGEgcG9zaXRpb24uCisJICovCisJZG1hX2FkZHIgPSBzYTExMDBfZ2V0X2RtYV9wb3Moc2ktPnJ4ZG1hKTsKKwlsZW4gPSBkbWFfYWRkciAtIHNpLT5yeGJ1Zl9kbWE7CisJaWYgKGxlbiA+IEhQU0lSX01BWF9SWExFTikKKwkJbGVuID0gSFBTSVJfTUFYX1JYTEVOOworCWRtYV91bm1hcF9zaW5nbGUoc2ktPmRldiwgc2ktPnJ4YnVmX2RtYSwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCisJZG8geworCQkvKgorCQkgKiBSZWFkIFN0YXR1cywgYW5kIHRoZW4gRGF0YS4KKwkJICovCisJCXN0YXQgPSBTZXIySFNTUjE7CisJCXJtYigpOworCQlkYXRhID0gU2VyMkhTRFI7CisKKwkJaWYgKHN0YXQgJiAoSFNTUjFfQ1JFIHwgSFNTUjFfUk9SKSkgeworCQkJc2ktPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHN0YXQgJiBIU1NSMV9DUkUpCisJCQkJc2ktPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChzdGF0ICYgSFNTUjFfUk9SKQorCQkJCXNpLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJfSBlbHNlCisJCQlza2ItPmRhdGFbbGVuKytdID0gZGF0YTsKKworCQkvKgorCQkgKiBJZiB3ZSBoaXQgdGhlIGVuZCBvZiBmcmFtZSwgdGhlcmUncworCQkgKiBubyBwb2ludCBpbiBjb250aW51aW5nLgorCQkgKi8KKwkJaWYgKHN0YXQgJiBIU1NSMV9FT0YpCisJCQlicmVhazsKKwl9IHdoaWxlIChTZXIySFNTUjAgJiBIU1NSMF9FSUYpOworCisJaWYgKHN0YXQgJiBIU1NSMV9FT0YpIHsKKwkJc2ktPnJ4c2tiID0gTlVMTDsKKworCQlza2JfcHV0KHNrYiwgbGVuKTsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOworCQlzaS0+c3RhdHMucnhfcGFja2V0cysrOworCQlzaS0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCisJCS8qCisJCSAqIEJlZm9yZSB3ZSBwYXNzIHRoZSBidWZmZXIgdXAsIGFsbG9jYXRlIGEgbmV3IG9uZS4KKwkJICovCisJCXNhMTEwMF9pcmRhX3J4X2FsbG9jKHNpKTsKKworCQluZXRpZl9yeChza2IpOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFJlbWFwIHRoZSBidWZmZXIuCisJCSAqLworCQlzaS0+cnhidWZfZG1hID0gZG1hX21hcF9zaW5nbGUoc2ktPmRldiwgc2ktPnJ4c2tiLT5kYXRhLAorCQkJCQkJSFBTSVJfTUFYX1JYTEVOLAorCQkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwl9Cit9CisKKy8qCisgKiBGSVIgZm9ybWF0IGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuICBXZSBvbmx5IGhhdmUgdG8KKyAqIGhhbmRsZSBSWCBldmVudHM7IHRyYW5zbWl0IGV2ZW50cyBnbyB2aWEgdGhlIFRYIERNQSBoYW5kbGVyLgorICoKKyAqIE5vIG1hdHRlciB3aGF0LCB3ZSBkaXNhYmxlIFJYLCBwcm9jZXNzLCBhbmQgdGhlIHJlc3RhcnQgUlguCisgKi8KK3N0YXRpYyB2b2lkIHNhMTEwMF9pcmRhX2Zpcl9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpID0gZGV2LT5wcml2OworCisJLyoKKwkgKiBTdG9wIFJYIERNQQorCSAqLworCXNhMTEwMF9zdG9wX2RtYShzaS0+cnhkbWEpOworCisJLyoKKwkgKiBGcmFtaW5nIGVycm9yIC0gd2UgdGhyb3cgYXdheSB0aGUgcGFja2V0IGNvbXBsZXRlbHkuCisJICogQ2xlYXJpbmcgUlhFIGZsdXNoZXMgdGhlIGVycm9yIGNvbmRpdGlvbnMgYW5kIGRhdGEKKwkgKiBmcm9tIHRoZSBmaWZvLgorCSAqLworCWlmIChTZXIySFNTUjAgJiAoSFNTUjBfRlJFIHwgSFNTUjBfUkFCKSkgeworCQlzaS0+c3RhdHMucnhfZXJyb3JzKys7CisKKwkJaWYgKFNlcjJIU1NSMCAmIEhTU1IwX0ZSRSkKKwkJCXNpLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKworCQkvKgorCQkgKiBDbGVhciBvdXQgdGhlIERNQS4uLgorCQkgKi8KKwkJU2VyMkhTQ1IwID0gc2ktPmhzY3IwIHwgSFNDUjBfSFNTUDsKKworCQkvKgorCQkgKiBDbGVhciBzZWxlY3RlZCBzdGF0dXMgYml0cyBub3csIHNvIHdlCisJCSAqIGRvbid0IG1pc3MgdGhlbSBuZXh0IHRpbWUgYXJvdW5kLgorCQkgKi8KKwkJU2VyMkhTU1IwID0gSFNTUjBfRlJFIHwgSFNTUjBfUkFCOworCX0KKworCS8qCisJICogRGVhbCB3aXRoIGFueSByZWNlaXZlIGVycm9ycy4gIFRoZSBhbnkgb2YgdGhlIGxvd2VzdAorCSAqIDggYnl0ZXMgaW4gdGhlIEZJRk8gbWF5IGNvbnRhaW4gYW4gZXJyb3IuICBXZSBtdXN0IHJlYWQKKwkgKiB0aGVtIG9uZSBieSBvbmUuICBUaGUgImVycm9yIiBjb3VsZCBldmVuIGJlIHRoZSBlbmQgb2YKKwkgKiBwYWNrZXQhCisJICovCisJaWYgKFNlcjJIU1NSMCAmIEhTU1IwX0VJRikKKwkJc2ExMTAwX2lyZGFfZmlyX2Vycm9yKHNpLCBkZXYpOworCisJLyoKKwkgKiBObyBtYXR0ZXIgd2hhdCBoYXBwZW5zLCB3ZSBtdXN0IHJlc3RhcnQgcmVjZXB0aW9uLgorCSAqLworCXNhMTEwMF9pcmRhX3J4X2RtYV9zdGFydChzaSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzYTExMDBfaXJkYV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCWlmIChJU19GSVIoKChzdHJ1Y3Qgc2ExMTAwX2lyZGEgKilkZXYtPnByaXYpKSkKKwkJc2ExMTAwX2lyZGFfZmlyX2lycShkZXYpOworCWVsc2UKKwkJc2ExMTAwX2lyZGFfaHBzaXJfaXJxKGRldik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogVFggRE1BIGNvbXBsZXRpb24gaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgc2ExMTAwX2lyZGFfdHhkbWFfaXJxKHZvaWQgKmlkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZDsKKwlzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpID0gZGV2LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2IgPSBzaS0+dHhza2I7CisKKwlzaS0+dHhza2IgPSBOVUxMOworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgdHJhbnNtaXNzaW9uIHRvIGNvbXBsZXRlLiAgVW5mb3J0dW5hdGVseSwKKwkgKiB0aGUgaGFyZHdhcmUgZG9lc24ndCBnaXZlIHVzIGFuIGludGVycnVwdCB0byBpbmRpY2F0ZQorCSAqICJlbmQgb2YgZnJhbWUiLgorCSAqLworCWRvCisJCXJtYigpOworCXdoaWxlICghKFNlcjJIU1NSMCAmIEhTU1IwX1RVUikgfHwgU2VyMkhTU1IxICYgSFNTUjFfVEJZKTsKKworCS8qCisJICogQ2xlYXIgdGhlIHRyYW5zbWl0IHVuZGVycnVuIGJpdC4KKwkgKi8KKwlTZXIySFNTUjAgPSBIU1NSMF9UVVI7CisKKwkvKgorCSAqIERvIHdlIG5lZWQgdG8gY2hhbmdlIHNwZWVkPyAgTm90ZSB0aGF0IHdlJ3JlIGxhenkKKwkgKiBoZXJlIC0gd2UgZG9uJ3QgZnJlZSB0aGUgb2xkIHJ4c2tiLiAgV2UgZG9uJ3QgbmVlZAorCSAqIHRvIGFsbG9jYXRlIGEgYnVmZmVyIGVpdGhlci4KKwkgKi8KKwlpZiAoc2ktPm5ld3NwZWVkKSB7CisJCXNhMTEwMF9pcmRhX3NldF9zcGVlZChzaSwgc2ktPm5ld3NwZWVkKTsKKwkJc2ktPm5ld3NwZWVkID0gMDsKKwl9CisKKwkvKgorCSAqIFN0YXJ0IHJlY2VwdGlvbi4gIFRoaXMgZGlzYWJsZXMgdGhlIHRyYW5zbWl0dGVyIGZvcgorCSAqIHVzLiAgVGhpcyB3aWxsIGJlIHVzaW5nIHRoZSBleGlzdGluZyBSWCBidWZmZXIuCisJICovCisJc2ExMTAwX2lyZGFfcnhfZG1hX3N0YXJ0KHNpKTsKKworCS8qCisJICogQWNjb3VudCBhbmQgZnJlZSB0aGUgcGFja2V0LgorCSAqLworCWlmIChza2IpIHsKKwkJZG1hX3VubWFwX3NpbmdsZShzaS0+ZGV2LCBzaS0+dHhidWZfZG1hLCBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CisJCXNpLT5zdGF0cy50eF9wYWNrZXRzICsrOworCQlzaS0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJfQorCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgVFggcXVldWUgaXMgYXZhaWxhYmxlIGZvciBzZW5kaW5nCisJICogKGZvciByZXRyaWVzKS4gIFRYIGhhcyBwcmlvcml0eSBvdmVyIFJYIGF0IGFsbCB0aW1lcy4KKwkgKi8KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTAwX2lyZGFfaGFyZF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNhMTEwMF9pcmRhICpzaSA9IGRldi0+cHJpdjsKKwlpbnQgc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisKKwkvKgorCSAqIERvZXMgdGhpcyBwYWNrZXQgY29udGFpbiBhIHJlcXVlc3QgdG8gY2hhbmdlIHRoZSBpbnRlcmZhY2UKKwkgKiBzcGVlZD8gIElmIHNvLCByZW1lbWJlciBpdCB1bnRpbCB3ZSBjb21wbGV0ZSB0aGUgdHJhbnNtaXNzaW9uCisJICogb2YgdGhpcyBmcmFtZS4KKwkgKi8KKwlpZiAoc3BlZWQgIT0gc2ktPnNwZWVkICYmIHNwZWVkICE9IC0xKQorCQlzaS0+bmV3c3BlZWQgPSBzcGVlZDsKKworCS8qCisJICogSWYgdGhpcyBpcyBhbiBlbXB0eSBmcmFtZSwgd2UgY2FuIGJ5cGFzcyBhIGxvdC4KKwkgKi8KKwlpZiAoc2tiLT5sZW4gPT0gMCkgeworCQlpZiAoc2ktPm5ld3NwZWVkKSB7CisJCQlzaS0+bmV3c3BlZWQgPSAwOworCQkJc2ExMTAwX2lyZGFfc2V0X3NwZWVkKHNpLCBzcGVlZCk7CisJCX0KKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIUlTX0ZJUihzaSkpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCXNpLT50eF9idWZmLmRhdGEgPSBzaS0+dHhfYnVmZi5oZWFkOworCQlzaS0+dHhfYnVmZi5sZW4gID0gYXN5bmNfd3JhcF9za2Ioc2tiLCBzaS0+dHhfYnVmZi5kYXRhLAorCQkJCQkJICBzaS0+dHhfYnVmZi50cnVlc2l6ZSk7CisKKwkJLyoKKwkJICogU2V0IHRoZSB0cmFuc21pdCBpbnRlcnJ1cHQgZW5hYmxlLiAgVGhpcyB3aWxsIGZpcmUKKwkJICogb2ZmIGFuIGludGVycnVwdCBpbW1lZGlhdGVseS4gIE5vdGUgdGhhdCB3ZSBkaXNhYmxlCisJCSAqIHRoZSByZWNlaXZlciBzbyB3ZSB3b24ndCBnZXQgc3B1cmlvdXMgY2hhcmFjdGVyZXMKKwkJICogcmVjZWl2ZWQuCisJCSAqLworCQlTZXIyVVRDUjMgPSBVVENSM19USUUgfCBVVENSM19UWEU7CisKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0gZWxzZSB7CisJCWludCBtdHQgPSBpcmRhX2dldF9tdHQoc2tiKTsKKworCQkvKgorCQkgKiBXZSBtdXN0IG5vdCBiZSB0cmFuc21pdHRpbmcuLi4KKwkJICovCisJCWlmIChzaS0+dHhza2IpCisJCQlCVUcoKTsKKworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJc2ktPnR4c2tiID0gc2tiOworCQlzaS0+dHhidWZfZG1hID0gZG1hX21hcF9zaW5nbGUoc2ktPmRldiwgc2tiLT5kYXRhLAorCQkJCQkgc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCisJCXNhMTEwMF9zdGFydF9kbWEoc2ktPnR4ZG1hLCBzaS0+dHhidWZfZG1hLCBza2ItPmxlbik7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBhIG1lYW4gdHVybi1hcm91bmQgdGltZSwgaW1wb3NlIHRoZSBzcGVjaWZpZWQKKwkJICogc3BlY2lmaWVkIGRlbGF5LiAgV2UgY291bGQgc2hvcnRlbiB0aGlzIGJ5IHRpbWluZyBmcm9tCisJCSAqIHRoZSBwb2ludCB3ZSByZWNlaXZlZCB0aGUgcGFja2V0LgorCQkgKi8KKwkJaWYgKG10dCkKKwkJCXVkZWxheShtdHQpOworCisJCVNlcjJIU0NSMCA9IHNpLT5oc2NyMCB8IEhTQ1IwX0hTU1AgfCBIU0NSMF9UWEU7CisJfQorCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2ExMTAwX2lyZGFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnJlcSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgaWZfaXJkYV9yZXEgKnJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKWlmcmVxOworCXN0cnVjdCBzYTExMDBfaXJkYSAqc2kgPSBkZXYtPnByaXY7CisJaW50IHJldCA9IC1FT1BOT1RTVVBQOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFORFdJRFRIOgorCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJLyoKKwkJCSAqIFdlIGFyZSB1bmFibGUgdG8gc2V0IHRoZSBzcGVlZCBpZiB0aGUKKwkJCSAqIGRldmljZSBpcyBub3QgcnVubmluZy4KKwkJCSAqLworCQkJaWYgKHNpLT5vcGVuKSB7CisJCQkJcmV0ID0gc2ExMTAwX2lyZGFfc2V0X3NwZWVkKHNpLAorCQkJCQkJcnEtPmlmcl9iYXVkcmF0ZSk7CisJCQl9IGVsc2UgeworCQkJCXByaW50aygic2ExMTAwX2lyZGFfaW9jdGw6IFNJT0NTQkFORFdJRFRIOiAhbmV0aWZfcnVubmluZ1xuIik7CisJCQkJcmV0ID0gMDsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgU0lPQ1NNRURJQUJVU1k6CisJCXJldCA9IC1FUEVSTTsKKwkJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KGRldiwgVFJVRSk7CisJCQlyZXQgPSAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTSU9DR1JFQ0VJVklORzoKKwkJcnEtPmlmcl9yZWNlaXZpbmcgPSBJU19GSVIoc2kpID8gMAorCQkJCQk6IHNpLT5yeF9idWZmLnN0YXRlICE9IE9VVFNJREVfRlJBTUU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCQkKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNhMTEwMF9pcmRhX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNhMTEwMF9pcmRhICpzaSA9IGRldi0+cHJpdjsKKwlyZXR1cm4gJnNpLT5zdGF0czsKK30KKworc3RhdGljIGludCBzYTExMDBfaXJkYV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYTExMDBfaXJkYSAqc2kgPSBkZXYtPnByaXY7CisJaW50IGVycjsKKworCXNpLT5zcGVlZCA9IDk2MDA7CisKKwllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgc2ExMTAwX2lyZGFfaXJxLCAwLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfaXJxOworCisJZXJyID0gc2ExMTAwX3JlcXVlc3RfZG1hKERNQV9TZXIySFNTUFJkLCAiSXJEQSByZWNlaXZlIiwKKwkJCQkgTlVMTCwgTlVMTCwgJnNpLT5yeGRtYSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcnhfZG1hOworCisJZXJyID0gc2ExMTAwX3JlcXVlc3RfZG1hKERNQV9TZXIySFNTUFdyLCAiSXJEQSB0cmFuc21pdCIsCisJCQkJIHNhMTEwMF9pcmRhX3R4ZG1hX2lycSwgZGV2LCAmc2ktPnR4ZG1hKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl90eF9kbWE7CisKKwkvKgorCSAqIFRoZSBpbnRlcnJ1cHQgbXVzdCByZW1haW4gZGlzYWJsZWQgZm9yIG5vdy4KKwkgKi8KKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisKKwkvKgorCSAqIFNldHVwIHRoZSBzZXJpYWwgcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBzcGVlZC4KKwkgKi8KKwllcnIgPSBzYTExMDBfaXJkYV9zdGFydHVwKHNpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9zdGFydHVwOworCisJLyoKKwkgKiBPcGVuIGEgbmV3IElyTEFQIGxheWVyIGluc3RhbmNlLgorCSAqLworCXNpLT5pcmxhcCA9IGlybGFwX29wZW4oZGV2LCAmc2ktPnFvcywgInNhMTEwMCIpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFzaS0+aXJsYXApCisJCWdvdG8gZXJyX2lybGFwOworCisJLyoKKwkgKiBOb3cgZW5hYmxlIHRoZSBpbnRlcnJ1cHQgYW5kIHN0YXJ0IHRoZSBxdWV1ZQorCSAqLworCXNpLT5vcGVuID0gMTsKKwlzYTExMDBfc2V0X3Bvd2VyKHNpLCBwb3dlcl9sZXZlbCk7IC8qIGxvdyBwb3dlciBtb2RlICovCisJZW5hYmxlX2lycShkZXYtPmlycSk7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKKworZXJyX2lybGFwOgorCXNpLT5vcGVuID0gMDsKKwlzYTExMDBfaXJkYV9zaHV0ZG93bihzaSk7CitlcnJfc3RhcnR1cDoKKwlzYTExMDBfZnJlZV9kbWEoc2ktPnR4ZG1hKTsKK2Vycl90eF9kbWE6CisJc2ExMTAwX2ZyZWVfZG1hKHNpLT5yeGRtYSk7CitlcnJfcnhfZG1hOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworZXJyX2lycToKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNhMTEwMF9pcmRhX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpID0gZGV2LT5wcml2OworCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXNhMTEwMF9pcmRhX3NodXRkb3duKHNpKTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBiZWVuIGRvaW5nIERNQSByZWNlaXZlLCBtYWtlIHN1cmUgd2UKKwkgKiB0aWR5IHRoYXQgdXAgY2xlYW5seS4KKwkgKi8KKwlpZiAoc2ktPnJ4c2tiKSB7CisJCWRtYV91bm1hcF9zaW5nbGUoc2ktPmRldiwgc2ktPnJ4YnVmX2RtYSwgSFBTSVJfTUFYX1JYTEVOLAorCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiKHNpLT5yeHNrYik7CisJCXNpLT5yeHNrYiA9IE5VTEw7CisJfQorCisJLyogU3RvcCBJckxBUCAqLworCWlmIChzaS0+aXJsYXApIHsKKwkJaXJsYXBfY2xvc2Uoc2ktPmlybGFwKTsKKwkJc2ktPmlybGFwID0gTlVMTDsKKwl9CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc2ktPm9wZW4gPSAwOworCisJLyoKKwkgKiBGcmVlIHJlc291cmNlcworCSAqLworCXNhMTEwMF9mcmVlX2RtYShzaS0+dHhkbWEpOworCXNhMTEwMF9mcmVlX2RtYShzaS0+cnhkbWEpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJc2ExMTAwX3NldF9wb3dlcihzaSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYTExMDBfaXJkYV9pbml0X2lvYnVmKGlvYnVmZl90ICppbywgaW50IHNpemUpCit7CisJaW8tPmhlYWQgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoaW8tPmhlYWQgIT0gTlVMTCkgeworCQlpby0+dHJ1ZXNpemUgPSBzaXplOworCQlpby0+aW5fZnJhbWUgPSBGQUxTRTsKKwkJaW8tPnN0YXRlICAgID0gT1VUU0lERV9GUkFNRTsKKwkJaW8tPmRhdGEgICAgID0gaW8tPmhlYWQ7CisJfQorCXJldHVybiBpby0+aGVhZCA/IDAgOiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IHNhMTEwMF9pcmRhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShfZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBzYTExMDBfaXJkYSAqc2k7CisJdW5zaWduZWQgaW50IGJhdWRyYXRlX21hc2s7CisJaW50IGVycjsKKworCWlmICghcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gcmVxdWVzdF9tZW1fcmVnaW9uKF9fUFJFRyhTZXIyVVRDUjApLCAweDI0LCAiSXJEQSIpID8gMCA6IC1FQlVTWTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9tZW1fMTsKKwllcnIgPSByZXF1ZXN0X21lbV9yZWdpb24oX19QUkVHKFNlcjJIU0NSMCksIDB4MWMsICJJckRBIikgPyAwIDogLUVCVVNZOworCWlmIChlcnIpCisJCWdvdG8gZXJyX21lbV8yOworCWVyciA9IHJlcXVlc3RfbWVtX3JlZ2lvbihfX1BSRUcoU2VyMkhTQ1IyKSwgMHgwNCwgIklyREEiKSA/IDAgOiAtRUJVU1k7CisJaWYgKGVycikKKwkJZ290byBlcnJfbWVtXzM7CisKKwlkZXYgPSBhbGxvY19pcmRhZGV2KHNpemVvZihzdHJ1Y3Qgc2ExMTAwX2lyZGEpKTsKKwlpZiAoIWRldikKKwkJZ290byBlcnJfbWVtXzQ7CisKKwlzaSA9IGRldi0+cHJpdjsKKwlzaS0+ZGV2ID0gJnBkZXYtPmRldjsKKwlzaS0+cGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCS8qCisJICogSW5pdGlhbGlzZSB0aGUgSFAtU0lSIGJ1ZmZlcnMKKwkgKi8KKwllcnIgPSBzYTExMDBfaXJkYV9pbml0X2lvYnVmKCZzaS0+cnhfYnVmZiwgMTQzODQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX21lbV81OworCWVyciA9IHNhMTEwMF9pcmRhX2luaXRfaW9idWYoJnNpLT50eF9idWZmLCA0MDAwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9tZW1fNTsKKworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gc2ExMTAwX2lyZGFfaGFyZF94bWl0OworCWRldi0+b3BlbgkJPSBzYTExMDBfaXJkYV9zdGFydDsKKwlkZXYtPnN0b3AJCT0gc2ExMTAwX2lyZGFfc3RvcDsKKwlkZXYtPmRvX2lvY3RsCQk9IHNhMTEwMF9pcmRhX2lvY3RsOworCWRldi0+Z2V0X3N0YXRzCQk9IHNhMTEwMF9pcmRhX3N0YXRzOworCWRldi0+aXJxCQk9IElSUV9TZXIySUNQOworCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc2ktPnFvcyk7CisKKwkvKgorCSAqIFdlIHN1cHBvcnQgb3JpZ2luYWwgSVJEQSB1cCB0byAxMTVrMi4gKHdlIGRvbid0IGN1cnJlbnRseQorCSAqIHN1cHBvcnQgNE1icHMpLiAgTWluIFR1cm4gVGltZSBzZXQgdG8gMW1zIG9yIGdyZWF0ZXIuCisJICovCisJYmF1ZHJhdGVfbWFzayA9IElSXzk2MDA7CisKKwlzd2l0Y2ggKG1heF9yYXRlKSB7CisJY2FzZSA0MDAwMDAwOgkJYmF1ZHJhdGVfbWFzayB8PSBJUl80MDAwMDAwIDw8IDg7CisJY2FzZSAxMTUyMDA6CQliYXVkcmF0ZV9tYXNrIHw9IElSXzExNTIwMDsKKwljYXNlIDU3NjAwOgkJYmF1ZHJhdGVfbWFzayB8PSBJUl81NzYwMDsKKwljYXNlIDM4NDAwOgkJYmF1ZHJhdGVfbWFzayB8PSBJUl8zODQwMDsKKwljYXNlIDE5MjAwOgkJYmF1ZHJhdGVfbWFzayB8PSBJUl8xOTIwMDsKKwl9CisJCQorCXNpLT5xb3MuYmF1ZF9yYXRlLmJpdHMgJj0gYmF1ZHJhdGVfbWFzazsKKwlzaS0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyA9IDc7CisKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZzaS0+cW9zKTsKKworCXNpLT51dGNyNCA9IFVUQ1I0X0hQU0lSOworCWlmICh0eF9scG0pCisJCXNpLT51dGNyNCB8PSBVVENSNF9aMV82dXM7CisKKwkvKgorCSAqIEluaXRpYWxseSBlbmFibGUgSFAtU0lSIG1vZHVsYXRpb24sIGFuZCBlbnN1cmUgdGhhdCB0aGUgcG9ydAorCSAqIGlzIGRpc2FibGVkLgorCSAqLworCVNlcjJVVENSMyA9IDA7CisJU2VyMlVUQ1I0ID0gc2ktPnV0Y3I0OworCVNlcjJIU0NSMCA9IEhTQ1IwX1VBUlQ7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyID09IDApCisJCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBkZXYpOworCisJaWYgKGVycikgeworIGVycl9tZW1fNToKKwkJa2ZyZWUoc2ktPnR4X2J1ZmYuaGVhZCk7CisJCWtmcmVlKHNpLT5yeF9idWZmLmhlYWQpOworCQlmcmVlX25ldGRldihkZXYpOworIGVycl9tZW1fNDoKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKF9fUFJFRyhTZXIySFNDUjIpLCAweDA0KTsKKyBlcnJfbWVtXzM6CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihfX1BSRUcoU2VyMkhTQ1IwKSwgMHgxYyk7CisgZXJyX21lbV8yOgorCQlyZWxlYXNlX21lbV9yZWdpb24oX19QUkVHKFNlcjJVVENSMCksIDB4MjQpOworCX0KKyBlcnJfbWVtXzE6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzYTExMDBfaXJkYV9yZW1vdmUoc3RydWN0IGRldmljZSAqX2RldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworCisJaWYgKGRldikgeworCQlzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpID0gZGV2LT5wcml2OworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlrZnJlZShzaS0+dHhfYnVmZi5oZWFkKTsKKwkJa2ZyZWUoc2ktPnJ4X2J1ZmYuaGVhZCk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorCisJcmVsZWFzZV9tZW1fcmVnaW9uKF9fUFJFRyhTZXIySFNDUjIpLCAweDA0KTsKKwlyZWxlYXNlX21lbV9yZWdpb24oX19QUkVHKFNlcjJIU0NSMCksIDB4MWMpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihfX1BSRUcoU2VyMlVUQ1IwKSwgMHgyNCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHNhMTEwMGlyX2RyaXZlciA9IHsKKwkubmFtZQkJPSAic2ExMXgwLWlyIiwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gc2ExMTAwX2lyZGFfcHJvYmUsCisJLnJlbW92ZQkJPSBzYTExMDBfaXJkYV9yZW1vdmUsCisJLnN1c3BlbmQJPSBzYTExMDBfaXJkYV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc2ExMTAwX2lyZGFfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2ExMTAwX2lyZGFfaW5pdCh2b2lkKQoreworCS8qCisJICogTGltaXQgcG93ZXIgbGV2ZWwgYSBzZW5zaWJsZSByYW5nZS4KKwkgKi8KKwlpZiAocG93ZXJfbGV2ZWwgPCAxKQorCQlwb3dlcl9sZXZlbCA9IDE7CisJaWYgKHBvd2VyX2xldmVsID4gMykKKwkJcG93ZXJfbGV2ZWwgPSAzOworCisJcmV0dXJuIGRyaXZlcl9yZWdpc3Rlcigmc2ExMTAwaXJfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNhMTEwMF9pcmRhX2V4aXQodm9pZCkKK3sKKwlkcml2ZXJfdW5yZWdpc3Rlcigmc2ExMTAwaXJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2ExMTAwX2lyZGFfaW5pdCk7Cittb2R1bGVfZXhpdChzYTExMDBfaXJkYV9leGl0KTsKK21vZHVsZV9wYXJhbShwb3dlcl9sZXZlbCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh0eF9scG0sIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWF4X3JhdGUsIGludCwgMCk7CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyA8cm1rQGFybS5saW51eC5vcmcudWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN0cm9uZ0FSTSBTQTExMDAgSXJEQSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9QQVJNX0RFU0MocG93ZXJfbGV2ZWwsICJJckRBIHBvd2VyIGxldmVsLCAxIChsb3cpIHRvIDMgKGhpZ2gpIik7CitNT0RVTEVfUEFSTV9ERVNDKHR4X2xwbSwgIkVuYWJsZSB0cmFuc21pdHRlciBsb3cgcG93ZXIgKDEuNnVzKSBtb2RlIik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9yYXRlLCAiTWF4aW11bSBiYXVkIHJhdGUgKDQwMDAwMDAsIDExNTIwMCwgNTc2MDAsIDM4NDAwLCAxOTIwMCwgOTYwMCkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2lyLWRldi5oIGIvZHJpdmVycy9uZXQvaXJkYS9zaXItZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiOGJjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc2lyLWRldi5oCkBAIC0wLDAgKzEsMjAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJc2lyLmg6CWluY2x1ZGUgZmlsZSBmb3IgaXJkYS1zaXIgZGV2aWNlIGFic3RyYWN0aW9uIGxheWVyCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAyIE1hcnRpbiBEaWVobAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqCXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICoJdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIElSREFfU0lSX0gKKyNkZWZpbmUgSVJEQV9TSVJfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4JCS8vIGlvYnVmZl90CisKKy8qIEZJWE1FOiB1bmlmeSBpcmRhX3JlcXVlc3Qgd2l0aCBzaXJfZnNtISAqLworCitzdHJ1Y3QgaXJkYV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxoX3JlcXVlc3Q7CisJdW5zaWduZWQgbG9uZyBwZW5kaW5nOworCXZvaWQgKCpmdW5jKSh2b2lkICopOworCXZvaWQgKmRhdGE7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7Cit9OworCitzdHJ1Y3Qgc2lyX2ZzbSB7CisJc3RydWN0IHNlbWFwaG9yZQlzZW07CisJc3RydWN0IGlyZGFfcmVxdWVzdAlycTsKKwl1bnNpZ25lZAkJc3RhdGUsIHN1YnN0YXRlOworCWludAkJCXBhcmFtOworCWludAkJCXJlc3VsdDsKK307CisKKyNkZWZpbmUgU0lSREVWX1NUQVRFX1dBSVRfVFhfQ09NUExFVEUJMHgwMTAwCisKKy8qIHN1YnN0YXRlcyBmb3Igd2FpdF90eF9jb21wbGV0ZSAqLworI2RlZmluZSBTSVJERVZfU1RBVEVfV0FJVF9YTUlUCQkweDAxMDEKKyNkZWZpbmUgU0lSREVWX1NUQVRFX1dBSVRfVU5USUxfU0VOVAkweDAxMDIKKyNkZWZpbmUgU0lSREVWX1NUQVRFX1RYX0RPTkUJCTB4MDEwMworCisjZGVmaW5lIFNJUkRFVl9TVEFURV9ET05HTEVfT1BFTgkJMHgwMzAwCisKKy8qIDB4MDMwMS0weDAzZmYgcmVzZXJ2ZWQgZm9yIGluZGl2aWR1YWwgZG9uZ2xlIHN1YnN0YXRlcyAqLworCisjZGVmaW5lIFNJUkRFVl9TVEFURV9ET05HTEVfQ0xPU0UJMHgwNDAwCisKKy8qIDB4MDQwMS0weDA0ZmYgcmVzZXJ2ZWQgZm9yIGluZGl2aWR1YWwgZG9uZ2xlIHN1YnN0YXRlcyAqLworCisjZGVmaW5lIFNJUkRFVl9TVEFURV9TRVRfRFRSX1JUUwkJMHgwNTAwCisKKyNkZWZpbmUgU0lSREVWX1NUQVRFX1NFVF9TUEVFRAkJMHgwNzAwCisjZGVmaW5lIFNJUkRFVl9TVEFURV9ET05HTEVfQ0hFQ0sJMHgwODAwCisjZGVmaW5lIFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQJMHgwOTAwCisKKy8qIDB4MDkwMS0weDA5ZmYgcmVzZXJ2ZWQgZm9yIGluZGl2aWR1YWwgZG9uZ2xlIHN1YnN0YXRlcyAqLworCisjZGVmaW5lIFNJUkRFVl9TVEFURV9ET05HTEVfU1BFRUQJMHgwYTAwCisvKiAweDBhMDEtMHgwYWZmIHJlc2VydmVkIGZvciBpbmRpdmlkdWFsIGRvbmdsZSBzdWJzdGF0ZXMgKi8KKworI2RlZmluZSBTSVJERVZfU1RBVEVfUE9SVF9TUEVFRAkJMHgwYjAwCisjZGVmaW5lIFNJUkRFVl9TVEFURV9ET05FCQkweDBjMDAKKyNkZWZpbmUgU0lSREVWX1NUQVRFX0VSUk9SCQkweDBkMDAKKyNkZWZpbmUgU0lSREVWX1NUQVRFX0NPTVBMRVRFCQkweDBlMDAKKworI2RlZmluZSBTSVJERVZfU1RBVEVfREVBRAkJMHhmZmZmCisKKworc3RydWN0IHNpcl9kZXY7CisKK3N0cnVjdCBkb25nbGVfZHJpdmVyIHsKKworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCisJY29uc3QgY2hhciAqZHJpdmVyX25hbWU7CisKKwlJUkRBX0RPTkdMRSB0eXBlOworCisJaW50CSgqb3Blbikoc3RydWN0IHNpcl9kZXYgKmRldik7CisJaW50CSgqY2xvc2UpKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworCWludAkoKnJlc2V0KShzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKKwlpbnQJKCpzZXRfc3BlZWQpKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKTsKKworCXN0cnVjdCBsaXN0X2hlYWQgZG9uZ2xlX2xpc3Q7Cit9OworCitzdHJ1Y3Qgc2lyX2RyaXZlciB7CisKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKworCWNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lOworCisJaW50IHFvc19tdHRfYml0czsKKworCWludCAoKmNoYXJzX2luX2J1ZmZlcikoc3RydWN0IHNpcl9kZXYgKmRldik7CisJdm9pZCAoKndhaXRfdW50aWxfc2VudCkoc3RydWN0IHNpcl9kZXYgKmRldik7CisJaW50ICgqc2V0X3NwZWVkKShzdHJ1Y3Qgc2lyX2RldiAqZGV2LCB1bnNpZ25lZCBzcGVlZCk7CisJaW50ICgqc2V0X2R0cl9ydHMpKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGludCBkdHIsIGludCBydHMpOworCisJaW50ICgqZG9fd3JpdGUpKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciwgc2l6ZV90IGxlbik7CisKKwlpbnQgKCpzdGFydF9kZXYpKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworCWludCAoKnN0b3BfZGV2KShzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK307CisKKworLyogZXhwb3J0ZWQgKi8KKworZXh0ZXJuIGludCBpcmRhX3JlZ2lzdGVyX2RvbmdsZShzdHJ1Y3QgZG9uZ2xlX2RyaXZlciAqbmV3KTsKK2V4dGVybiBpbnQgaXJkYV91bnJlZ2lzdGVyX2RvbmdsZShzdHJ1Y3QgZG9uZ2xlX2RyaXZlciAqZHJ2KTsKKworZXh0ZXJuIHN0cnVjdCBzaXJfZGV2ICogc2lyZGV2X2dldF9pbnN0YW5jZShjb25zdCBzdHJ1Y3Qgc2lyX2RyaXZlciAqZHJ2LCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiBpbnQgc2lyZGV2X3B1dF9pbnN0YW5jZShzdHJ1Y3Qgc2lyX2RldiAqc2VsZik7CisKK2V4dGVybiBpbnQgc2lyZGV2X3NldF9kb25nbGUoc3RydWN0IHNpcl9kZXYgKmRldiwgSVJEQV9ET05HTEUgdHlwZSk7CitleHRlcm4gdm9pZCBzaXJkZXZfd3JpdGVfY29tcGxldGUoc3RydWN0IHNpcl9kZXYgKmRldik7CitleHRlcm4gaW50IHNpcmRldl9yZWNlaXZlKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBzaXplX3QgY291bnQpOworCisvKiBsb3cgbGV2ZWwgaGVscGVycyBmb3IgU0lSIGRldmljZS9kb25nbGUgc2V0dXAgKi8KK2V4dGVybiBpbnQgc2lyZGV2X3Jhd193cml0ZShzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBjb25zdCBjaGFyICpidWYsIGludCBsZW4pOworZXh0ZXJuIGludCBzaXJkZXZfcmF3X3JlYWQoc3RydWN0IHNpcl9kZXYgKmRldiwgY2hhciAqYnVmLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgc2lyZGV2X3NldF9kdHJfcnRzKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGludCBkdHIsIGludCBydHMpOworCisvKiBub3QgZXhwb3J0ZWQgKi8KKworZXh0ZXJuIGludCBzaXJkZXZfZ2V0X2RvbmdsZShzdHJ1Y3Qgc2lyX2RldiAqc2VsZiwgSVJEQV9ET05HTEUgdHlwZSk7CitleHRlcm4gaW50IHNpcmRldl9wdXRfZG9uZ2xlKHN0cnVjdCBzaXJfZGV2ICpzZWxmKTsKKworZXh0ZXJuIHZvaWQgc2lyZGV2X2VuYWJsZV9yeChzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK2V4dGVybiBpbnQgc2lyZGV2X3NjaGVkdWxlX3JlcXVlc3Qoc3RydWN0IHNpcl9kZXYgKmRldiwgaW50IHN0YXRlLCB1bnNpZ25lZCBwYXJhbSk7CitleHRlcm4gaW50IF9faW5pdCBpcmRhX3RocmVhZF9jcmVhdGUodm9pZCk7CitleHRlcm4gdm9pZCBfX2V4aXQgaXJkYV90aHJlYWRfam9pbih2b2lkKTsKKworLyogaW5saW5lIGhlbHBlcnMgKi8KKworc3RhdGljIGlubGluZSBpbnQgc2lyZGV2X3NjaGVkdWxlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKQoreworCXJldHVybiBzaXJkZXZfc2NoZWR1bGVfcmVxdWVzdChkZXYsIFNJUkRFVl9TVEFURV9TRVRfU1BFRUQsIHNwZWVkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2lyZGV2X3NjaGVkdWxlX2RvbmdsZV9vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGludCBkb25nbGVfaWQpCit7CisJcmV0dXJuIHNpcmRldl9zY2hlZHVsZV9yZXF1ZXN0KGRldiwgU0lSREVWX1NUQVRFX0RPTkdMRV9PUEVOLCBkb25nbGVfaWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzaXJkZXZfc2NoZWR1bGVfZG9uZ2xlX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJcmV0dXJuIHNpcmRldl9zY2hlZHVsZV9yZXF1ZXN0KGRldiwgU0lSREVWX1NUQVRFX0RPTkdMRV9DTE9TRSwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNpcmRldl9zY2hlZHVsZV9kdHJfcnRzKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGludCBkdHIsIGludCBydHMpCit7CisJaW50CWR0cnJ0czsKKworCWR0cnJ0cyA9ICgoZHRyKSA/IDB4MDIgOiAweDAwKSB8ICgocnRzKSA/IDB4MDEgOiAweDAwKTsKKwlyZXR1cm4gc2lyZGV2X3NjaGVkdWxlX3JlcXVlc3QoZGV2LCBTSVJERVZfU1RBVEVfU0VUX0RUUl9SVFMsIGR0cnJ0cyk7Cit9CisKKyNpZiAwCitzdGF0aWMgaW5saW5lIGludCBzaXJkZXZfc2NoZWR1bGVfbW9kZShzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBpbnQgbW9kZSkKK3sKKwlyZXR1cm4gc2lyZGV2X3NjaGVkdWxlX3JlcXVlc3QoZGV2LCBTSVJERVZfU1RBVEVfU0VUX01PREUsIG1vZGUpOworfQorI2VuZGlmCisKKworc3RydWN0IHNpcl9kZXYgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKwlzdHJ1Y3QgaXJsYXBfY2IgICAgKmlybGFwOworCisJc3RydWN0IHFvc19pbmZvIHFvczsKKworCWNoYXIgaHduYW1lWzMyXTsKKworCXN0cnVjdCBzaXJfZnNtIGZzbTsKKwlhdG9taWNfdCBlbmFibGVfcng7CisJaW50IHJhd190eDsKKwlzcGlubG9ja190IHR4X2xvY2s7CisKKwl1MzIgbmV3X3NwZWVkOworIAl1MzIgZmxhZ3M7CisKKwl1bnNpZ25lZAlzcGVlZDsKKworCWlvYnVmZl90IHR4X2J1ZmY7ICAgICAgICAgIC8qIFRyYW5zbWl0IGJ1ZmZlciAqLworCWlvYnVmZl90IHJ4X2J1ZmY7ICAgICAgICAgIC8qIFJlY2VpdmUgYnVmZmVyICovCisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKworCWNvbnN0IHN0cnVjdCBkb25nbGVfZHJpdmVyICogZG9uZ2xlX2RydjsKKwljb25zdCBzdHJ1Y3Qgc2lyX2RyaXZlciAqIGRydjsKKwl2b2lkICpwcml2OworCit9OworCisjZW5kaWYJLyogSVJEQV9TSVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zaXJfY29yZS5jIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OWY5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9jb3JlLmMKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCXNpcl9jb3JlLmM6CW1vZHVsZSBjb3JlIGZvciBpcmRhLXNpciBhYnN0cmFjdGlvbiBsYXllcgorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwKKyAqIAorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKgl0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorCisjaW5jbHVkZSAic2lyLWRldi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitNT0RVTEVfQVVUSE9SKCJNYXJ0aW4gRGllaGwgPGluZm9AbWRpZWhsLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJckRBIFNJUiBjb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0VYUE9SVF9TWU1CT0woaXJkYV9yZWdpc3Rlcl9kb25nbGUpOworRVhQT1JUX1NZTUJPTChpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKTsKKworRVhQT1JUX1NZTUJPTChzaXJkZXZfZ2V0X2luc3RhbmNlKTsKK0VYUE9SVF9TWU1CT0woc2lyZGV2X3B1dF9pbnN0YW5jZSk7CisKK0VYUE9SVF9TWU1CT0woc2lyZGV2X3NldF9kb25nbGUpOworRVhQT1JUX1NZTUJPTChzaXJkZXZfd3JpdGVfY29tcGxldGUpOworRVhQT1JUX1NZTUJPTChzaXJkZXZfcmVjZWl2ZSk7CisKK0VYUE9SVF9TWU1CT0woc2lyZGV2X3Jhd193cml0ZSk7CitFWFBPUlRfU1lNQk9MKHNpcmRldl9yYXdfcmVhZCk7CitFWFBPUlRfU1lNQk9MKHNpcmRldl9zZXRfZHRyX3J0cyk7CisKK3N0YXRpYyBpbnQgX19pbml0IHNpcl9jb3JlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaXJkYV90aHJlYWRfY3JlYXRlKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaXJfY29yZV9leGl0KHZvaWQpCit7CisJaXJkYV90aHJlYWRfam9pbigpOworfQorCittb2R1bGVfaW5pdChzaXJfY29yZV9pbml0KTsKK21vZHVsZV9leGl0KHNpcl9jb3JlX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Npcl9kZXYuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYzVhODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9kZXYuYwpAQCAtMCwwICsxLDY3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCXNpcl9kZXYuYzoJaXJkYSBzaXIgbmV0d29yayBkZXZpY2UKKyAqIAorICoJQ29weXJpZ2h0IChjKSAyMDAyIE1hcnRpbiBEaWVobAorICogCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqCXRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaW5jbHVkZSAic2lyLWRldi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHNpcmRldl9lbmFibGVfcngoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmRldi0+ZW5hYmxlX3J4KSkpCisJCXJldHVybjsKKworCS8qIGZsdXNoIHJ4LWJ1ZmZlciAtIHNob3VsZCBhbHNvIGhlbHAgaW4gY2FzZSBvZiBwcm9ibGVtcyB3aXRoIGVjaG8gY2FuY2VsYXRpb24gKi8KKwlkZXYtPnJ4X2J1ZmYuZGF0YSA9IGRldi0+cnhfYnVmZi5oZWFkOworCWRldi0+cnhfYnVmZi5sZW4gPSAwOworCWRldi0+cnhfYnVmZi5pbl9mcmFtZSA9IEZBTFNFOworCWRldi0+cnhfYnVmZi5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJYXRvbWljX3NldCgmZGV2LT5lbmFibGVfcngsIDEpOworfQorCitzdGF0aWMgaW50IHNpcmRldl9pc19yZWNlaXZpbmcoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlpZiAoIWF0b21pY19yZWFkKCZkZXYtPmVuYWJsZV9yeCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIChkZXYtPnJ4X2J1ZmYuc3RhdGUgIT0gT1VUU0lERV9GUkFNRSk7Cit9CisKK2ludCBzaXJkZXZfc2V0X2RvbmdsZShzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBJUkRBX0RPTkdMRSB0eXBlKQoreworCWludCBlcnI7CisKKwlJUkRBX0RFQlVHKDMsICIlcyA6IHJlcXVlc3RpbmcgZG9uZ2xlICVkLlxuIiwgX19GVU5DVElPTl9fLCB0eXBlKTsKKworCWVyciA9IHNpcmRldl9zY2hlZHVsZV9kb25nbGVfb3BlbihkZXYsIHR5cGUpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlyZXR1cm4gZXJyOworCWRvd24oJmRldi0+ZnNtLnNlbSk7CQkvKiBibG9jayB1bnRpbCBjb25maWcgY2hhbmdlIGNvbXBsZXRlZCAqLworCWVyciA9IGRldi0+ZnNtLnJlc3VsdDsKKwl1cCgmZGV2LT5mc20uc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiB1c2VkIGJ5IGRvbmdsZSBkcml2ZXJzIGZvciBkb25nbGUgcHJvZ3JhbW1pbmcgKi8KKworaW50IHNpcmRldl9yYXdfd3JpdGUoc3RydWN0IHNpcl9kZXYgKmRldiwgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWlmICh1bmxpa2VseShsZW4gPiBkZXYtPnR4X2J1ZmYudHJ1ZXNpemUpKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnR4X2xvY2ssIGZsYWdzKTsJLyogc2VyaWFsaXplIHdpdGggb3RoZXIgdHggb3BlcmF0aW9ucyAqLworCXdoaWxlIChkZXYtPnR4X2J1ZmYubGVuID4gMCkgewkJCS8qIHdhaXQgdW50aWwgdHggaWRsZSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnR4X2xvY2ssIGZsYWdzKTsKKwkJbXNsZWVwKDEwKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dHhfbG9jaywgZmxhZ3MpOworCX0KKworCWRldi0+dHhfYnVmZi5kYXRhID0gZGV2LT50eF9idWZmLmhlYWQ7CisJbWVtY3B5KGRldi0+dHhfYnVmZi5kYXRhLCBidWYsIGxlbik7CQorCWRldi0+dHhfYnVmZi5sZW4gPSBsZW47CisKKwlyZXQgPSBkZXYtPmRydi0+ZG9fd3JpdGUoZGV2LCBkZXYtPnR4X2J1ZmYuZGF0YSwgZGV2LT50eF9idWZmLmxlbik7CisJaWYgKHJldCA+IDApIHsKKwkJSVJEQV9ERUJVRygzLCAiJXMoKSwgcmF3LXR4IHN0YXJ0ZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJZGV2LT50eF9idWZmLmRhdGEgKz0gcmV0OworCQlkZXYtPnR4X2J1ZmYubGVuIC09IHJldDsKKwkJZGV2LT5yYXdfdHggPSAxOworCQlyZXQgPSBsZW47CQkvKiBhbGwgZGF0YSBpcyBnb2luZyB0byBiZSBzZW50ICovCisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dHhfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKKy8qIHNlZW1zIHNvbWUgZG9uZ2xlIGRyaXZlcnMgbWF5IG5lZWQgdGhpcyAqLworCitpbnQgc2lyZGV2X3Jhd19yZWFkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgY291bnQ7CisKKwlpZiAoYXRvbWljX3JlYWQoJmRldi0+ZW5hYmxlX3J4KSkKKwkJcmV0dXJuIC1FSU87CQkvKiBmYWlsIGlmIHdlIGV4cGVjdCBpcmRhLWZyYW1lcyAqLworCisJY291bnQgPSAobGVuIDwgZGV2LT5yeF9idWZmLmxlbikgPyBsZW4gOiBkZXYtPnJ4X2J1ZmYubGVuOworCisJaWYgKGNvdW50ID4gMCkgeworCQltZW1jcHkoYnVmLCBkZXYtPnJ4X2J1ZmYuZGF0YSwgY291bnQpOworCQlkZXYtPnJ4X2J1ZmYuZGF0YSArPSBjb3VudDsKKwkJZGV2LT5yeF9idWZmLmxlbiAtPSBjb3VudDsKKwl9CisKKwkvKiByZW1haW5pbmcgc3R1ZmYgZ2V0cyBmbHVzaGVkIHdoZW4gcmUtZW5hYmxpbmcgbm9ybWFsIHJ4ICovCisKKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCBzaXJkZXZfc2V0X2R0cl9ydHMoc3RydWN0IHNpcl9kZXYgKmRldiwgaW50IGR0ciwgaW50IHJ0cykKK3sKKwlpbnQgcmV0ID0gLUVOWElPOworCWlmIChkZXYtPmRydi0+c2V0X2R0cl9ydHMgIT0gMCkKKwkJcmV0ID0gIGRldi0+ZHJ2LT5zZXRfZHRyX3J0cyhkZXYsIGR0ciwgcnRzKTsKKwlyZXR1cm4gcmV0OworfQorCQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNhbGxlZCBmcm9tIGNsaWVudCBkcml2ZXIgLSBsaWtlbHkgd2l0aCBiaC1jb250ZXh0IC0gdG8gaW5kaWNhdGUKKyAqIGl0IG1hZGUgc29tZSBwcm9ncmVzcyB3aXRoIHRyYW5zbWlzc2lvbi4gSGVuY2Ugd2Ugc2VuZCB0aGUgbmV4dAorICogY2h1bmssIGlmIGFueSwgb3IgY29tcGxldGUgdGhlIHNrYiBvdGhlcndpc2UKKyAqLworCit2b2lkIHNpcmRldl93cml0ZV9jb21wbGV0ZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgYWN0dWFsID0gMDsKKwlpbnQgZXJyOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnR4X2xvY2ssIGZsYWdzKTsKKworCUlSREFfREVCVUcoMywgIiVzKCkgLSBkZXYtPnR4X2J1ZmYubGVuID0gJWRcbiIsCisJCSAgIF9fRlVOQ1RJT05fXywgZGV2LT50eF9idWZmLmxlbik7CisKKwlpZiAobGlrZWx5KGRldi0+dHhfYnVmZi5sZW4gPiAwKSkgIHsKKwkJLyogV3JpdGUgZGF0YSBsZWZ0IGluIHRyYW5zbWl0IGJ1ZmZlciAqLworCQlhY3R1YWwgPSBkZXYtPmRydi0+ZG9fd3JpdGUoZGV2LCBkZXYtPnR4X2J1ZmYuZGF0YSwgZGV2LT50eF9idWZmLmxlbik7CisKKwkJaWYgKGxpa2VseShhY3R1YWw+MCkpIHsKKwkJCWRldi0+dHhfYnVmZi5kYXRhICs9IGFjdHVhbDsKKwkJCWRldi0+dHhfYnVmZi5sZW4gIC09IGFjdHVhbDsKKwkJfQorCQllbHNlIGlmICh1bmxpa2VseShhY3R1YWw8MCkpIHsKKwkJCS8qIGNvdWxkIGJlIGRyb3BwZWQgbGF0ZXIgd2hlbiB3ZSBoYXZlIHR4X3RpbWVvdXQgdG8gcmVjb3ZlciAqLworCQkJSVJEQV9FUlJPUigiJXM6IGRydi0+ZG9fd3JpdGUgZmFpbGVkICglZClcbiIsCisJCQkJICAgX19GVU5DVElPTl9fLCBhY3R1YWwpOworCQkJaWYgKChza2I9ZGV2LT50eF9za2IpICE9IE5VTEwpIHsKKwkJCQlkZXYtPnR4X3NrYiA9IE5VTEw7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwkJICAgICAgCisJCQkJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CQkgICAgICAKKwkJCX0KKwkJCWRldi0+dHhfYnVmZi5sZW4gPSAwOworCQl9CisJCWlmIChkZXYtPnR4X2J1ZmYubGVuID4gMCkKKwkJCWdvdG8gZG9uZTsJLyogbW9yZSBkYXRhIHRvIHNlbmQgbGF0ZXIgKi8KKwl9CisKKwlpZiAodW5saWtlbHkoZGV2LT5yYXdfdHggIT0gMCkpIHsKKwkJLyogaW4gcmF3IG1vZGUgd2UgYXJlIGp1c3QgZG9uZSBub3cgYWZ0ZXIgdGhlIGJ1ZmZlciB3YXMgc2VudAorCQkgKiBjb21wbGV0ZWx5LiBTaW5jZSB0aGlzIHdhcyByZXF1ZXN0ZWQgYnkgc29tZSBkb25nbGUgZHJpdmVyCisJCSAqIHJ1bm5pbmcgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIGlyZGEtdGhyZWFkIHdlIG11c3QgdGFrZQorCQkgKiBjYXJlIGhlcmUgbm90IHRvIHJlLWVuYWJsZSB0aGUgcXVldWUuIFRoZSBxdWV1ZSB3aWxsIGJlCisJCSAqIHJlc3RhcnRlZCB3aGVuIHRoZSBpcmRhLXRocmVhZCBoYXMgY29tcGxldGVkIHRoZSByZXF1ZXN0LgorCQkgKi8KKworCQlJUkRBX0RFQlVHKDMsICIlcygpLCByYXctdHggZG9uZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZGV2LT5yYXdfdHggPSAwOworCQlnb3RvIGRvbmU7CS8qIG5vIHBvc3QtZnJhbWUgaGFuZGxpbmcgaW4gcmF3IG1vZGUgKi8KKwl9CisKKwkvKiB3ZSBoYXZlIGZpbmlzaGVkIG5vdyBzZW5kaW5nIHRoaXMgc2tiLgorCSAqIHVwZGF0ZSBzdGF0aXN0aWNzIGFuZCBmcmVlIHRoZSBza2IuCisJICogZmluYWxseSB3ZSBjaGVjayBhbmQgdHJpZ2dlciBhIHBlbmRpbmcgc3BlZWQgY2hhbmdlLCBpZiBhbnkuCisJICogaWYgbm90IHdlIHN3aXRjaCB0byByeCBtb2RlIGFuZCB3YWtlIHRoZSBxdWV1ZSBmb3IgZnVydGhlcgorCSAqIHBhY2tldHMuCisJICogbm90ZSB0aGUgc2NoZWR1bGVkIHNwZWVkIHJlcXVlc3QgYmxvY2tzIHVudGlsIHRoZSBsb3dlcgorCSAqIGNsaWVudCBkcml2ZXIgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGhhcmR3YXJlIGhhcyByZWFsbHkKKwkgKiBmaW5pc2hlZCBzZW5kaW5nIGFsbCBkYXRhICh4bWl0IGZpZm8gZHJhaW5lZCBmLmUuKQorCSAqIGJlZm9yZSB0aGUgc3BlZWQgY2hhbmdlIGdldHMgZmluYWxseSBkb25lIGFuZCB0aGUgcXVldWUKKwkgKiByZS1hY3RpdmF0ZWQuCisJICovCisKKwlJUkRBX0RFQlVHKDUsICIlcygpLCBmaW5pc2hlZCB3aXRoIGZyYW1lIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCisJaWYgKChza2I9ZGV2LT50eF9za2IpICE9IE5VTEwpIHsKKwkJZGV2LT50eF9za2IgPSBOVUxMOworCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsJCSAgICAgIAorCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0KKworCWlmICh1bmxpa2VseShkZXYtPm5ld19zcGVlZCA+IDApKSB7CisJCUlSREFfREVCVUcoNSwgIiVzKCksIENoYW5naW5nIHNwZWVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZXJyID0gc2lyZGV2X3NjaGVkdWxlX3NwZWVkKGRldiwgZGV2LT5uZXdfc3BlZWQpOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbgorCQkJICogZm9yZ2V0IHRoZSBzcGVlZCBjaGFuZ2UgYW5kIGhvcGUgdGhlIHN0YWNrIHJlY292ZXJzCisJCQkgKi8KKwkJCUlSREFfRVJST1IoIiVzIC0gc2NoZWR1bGUgc3BlZWQgY2hhbmdlIGZhaWxlZDogJWRcbiIsCisJCQkJICAgX19GVU5DVElPTl9fLCBlcnIpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYtPm5ldGRldik7CisJCX0KKwkJLyogZWxzZTogc3VjY2VzcworCQkgKglzcGVlZCBjaGFuZ2UgaW4gcHJvZ3Jlc3Mgbm93CisJCSAqCW9uIGNvbXBsZXRpb24gZGV2LT5uZXdfc3BlZWQgZ2V0cyBjbGVhcmVkLAorCQkgKglyeC1yZWVuYWJsZWQgYW5kIHRoZSBxdWV1ZSByZXN0YXJ0ZWQKKwkJICovCisJfQorCWVsc2UgeworCQlzaXJkZXZfZW5hYmxlX3J4KGRldik7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2LT5uZXRkZXYpOworCX0KKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnR4X2xvY2ssIGZsYWdzKTsKK30KKworLyogY2FsbGVkIGZyb20gY2xpZW50IGRyaXZlciAtIGxpa2VseSB3aXRoIGJoLWNvbnRleHQgLSB0byBnaXZlIHVzCisgKiBzb21lIG1vcmUgcmVjZWl2ZWQgYnl0ZXMuIFdlIHB1dCB0aGVtIGludG8gdGhlIHJ4LWJ1ZmZlciwKKyAqIG5vcm1hbGx5IHVud3JhcHBpbmcgYW5kIGJ1aWxkaW5nIExBUC1za2IncyAodW5sZXNzIHJ4IGRpc2FibGVkKQorICovCisKK2ludCBzaXJkZXZfcmVjZWl2ZShzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgc2l6ZV90IGNvdW50KSAKK3sKKwlpZiAoIWRldiB8fCAhZGV2LT5uZXRkZXYpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBub3QgcmVhZHkgeWV0IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghZGV2LT5pcmxhcCkgeworCQlJUkRBX1dBUk5JTkcoIiVzIC0gdG9vIGVhcmx5OiAlcCAvICV6ZCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgY3AsIGNvdW50KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChjcD09TlVMTCkgeworCQkvKiBlcnJvciBhbHJlYWR5IGF0IGxvd2VyIGxldmVsIHJlY2VpdmUKKwkJICoganVzdCB1cGRhdGUgc3RhdHMgYW5kIHNldCBtZWRpYSBidXN5CisJCSAqLworCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShkZXYtPm5ldGRldiwgVFJVRSk7CisJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlJUkRBX0RFQlVHKDAsICIlczsgcngtZHJvcDogJXpkXG4iLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUmVhZCB0aGUgY2hhcmFjdGVycyBpbnRvIHRoZSBidWZmZXIgKi8KKwlpZiAobGlrZWx5KGF0b21pY19yZWFkKCZkZXYtPmVuYWJsZV9yeCkpKSB7CisJCXdoaWxlIChjb3VudC0tKQorCQkJLyogVW53cmFwIGFuZCBkZXN0dWZmIG9uZSBieXRlICovCisJCQlhc3luY191bndyYXBfY2hhcihkZXYtPm5ldGRldiwgJmRldi0+c3RhdHMsIAorCQkJCQkgICZkZXYtPnJ4X2J1ZmYsICpjcCsrKTsKKwl9IGVsc2UgeworCQl3aGlsZSAoY291bnQtLSkgeworCQkJLyogcnggbm90IGVuYWJsZWQ6IHNhdmUgdGhlIHJhdyBieXRlcyBhbmQgbmV2ZXIKKwkJCSAqIHRyaWdnZXIgYW55IG5ldGlmX3J4LiBUaGUgcmVjZWl2ZWQgYnl0ZXMgYXJlIGZsdXNoZWQKKwkJCSAqIGxhdGVyIHdoZW4gd2UgcmUtZW5hYmxlIHJ4IGJ1dCBtaWdodCBiZSByZWFkIG1lYW53aGlsZQorCQkJICogYnkgdGhlIGRvbmdsZSBkcml2ZXIuCisJCQkgKi8KKwkJCWRldi0+cnhfYnVmZi5kYXRhW2Rldi0+cnhfYnVmZi5sZW4rK10gPSAqY3ArKzsKKworCQkJLyogV2hhdCBzaG91bGQgd2UgZG8gd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGw/ICovCisJCQlpZiAodW5saWtlbHkoZGV2LT5yeF9idWZmLmxlbiA9PSBkZXYtPnJ4X2J1ZmYudHJ1ZXNpemUpKQorCQkJCWRldi0+cnhfYnVmZi5sZW4gPSAwOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBjYWxsYmFja3MgZnJvbSBuZXR3b3JrIGxheWVyICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2lyZGV2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3Qgc2lyX2RldiAqZGV2ID0gbmRldi0+cHJpdjsKKworCXJldHVybiAoZGV2KSA/ICZkZXYtPnN0YXRzIDogTlVMTDsKK30KKworc3RhdGljIGludCBzaXJkZXZfaGFyZF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBzaXJfZGV2ICpkZXYgPSBuZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGFjdHVhbCA9IDA7CisJaW50IGVycjsKKwlzMzIgc3BlZWQ7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKworCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpLCBza2ItPmxlbiA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHNrYi0+bGVuKTsKKworCXNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCWlmICgoc3BlZWQgIT0gZGV2LT5zcGVlZCkgJiYgKHNwZWVkICE9IC0xKSkgeworCQlpZiAoIXNrYi0+bGVuKSB7CisJCQllcnIgPSBzaXJkZXZfc2NoZWR1bGVfc3BlZWQoZGV2LCBzcGVlZCk7CisJCQlpZiAodW5saWtlbHkoZXJyID09IC1FV09VTERCTE9DSykpIHsKKwkJCQkvKiBGYWlsZWQgdG8gaW5pdGlhdGUgdGhlIHNwZWVkIGNoYW5nZSwgbGlrZWx5IHRoZSBmc20KKwkJCQkgKiBpcyBzdGlsbCBidXN5IChwcmV0dHkgdW5saWtlbHksIGJ1dC4uLikKKwkJCQkgKiBXZSByZWZ1c2UgdG8gYWNjZXB0IHRoZSBza2IgYW5kIHJldHVybiB3aXRoIHRoZSBxdWV1ZQorCQkJCSAqIHN0b3BwZWQgc28gdGhlIG5ldHdvcmsgbGF5ZXIgd2lsbCByZXRyeSBhZnRlciB0aGUKKwkJCQkgKiBmc20gY29tcGxldGVzIGFuZCB3YWtlcyB0aGUgcXVldWUuCisJCQkJICovCisJCQkJIHJldHVybiAxOworCQkJfQorCQkJZWxzZSBpZiAodW5saWtlbHkoZXJyKSkgeworCQkJCS8qIG90aGVyIGZhdGFsIGVycm9yIC0gZm9yZ2V0IHRoZSBzcGVlZCBjaGFuZ2UgYW5kCisJCQkJICogaG9wZSB0aGUgc3RhY2sgd2lsbCByZWNvdmVyIHNvbWVob3cKKwkJCQkgKi8KKwkJCQkgbmV0aWZfc3RhcnRfcXVldWUobmRldik7CisJCQl9CisJCQkvKiBlbHNlOiBzdWNjZXNzCisJCQkgKglzcGVlZCBjaGFuZ2UgaW4gcHJvZ3Jlc3Mgbm93CisJCQkgKglvbiBjb21wbGV0aW9uIHRoZSBxdWV1ZSBnZXRzIHJlc3RhcnRlZAorCQkJICovCisKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlkZXYtPm5ld19zcGVlZCA9IHNwZWVkOworCX0KKworCS8qIEluaXQgdHggYnVmZmVyKi8KKwlkZXYtPnR4X2J1ZmYuZGF0YSA9IGRldi0+dHhfYnVmZi5oZWFkOworCisJLyogQ2hlY2sgcHJvYmxlbXMgKi8KKwlpZihzcGluX2lzX2xvY2tlZCgmZGV2LT50eF9sb2NrKSkgeworCQlJUkRBX0RFQlVHKDMsICIlcygpLCB3cml0ZSBub3QgY29tcGxldGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKworCS8qIHNlcmlhbGl6ZSB3aXRoIHdyaXRlIGNvbXBsZXRpb24gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT50eF9sb2NrLCBmbGFncyk7CisKKyAgICAgICAgLyogQ29weSBza2IgdG8gdHhfYnVmZiB3aGlsZSB3cmFwcGluZywgc3R1ZmZpbmcgYW5kIG1ha2luZyBDUkMgKi8KKwlkZXYtPnR4X2J1ZmYubGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCBkZXYtPnR4X2J1ZmYuZGF0YSwgZGV2LT50eF9idWZmLnRydWVzaXplKTsgCisKKwkvKiB0cmFuc21pc3Npb24gd2lsbCBzdGFydCBub3cgLSBkaXNhYmxlIHJlY2VpdmUuCisJICogaWYgd2UgYXJlIGp1c3QgaW4gdGhlIG1pZGRsZSBvZiBhbiBpbmNvbWluZyBmcmFtZSwKKwkgKiB0cmVhdCBpdCBhcyBjb2xsaXNpb24uIHByb2JhYmx5IGl0J3MgYSBnb29kIGlkZWEgdG8KKwkgKiByZXNldCB0aGUgcnhfYnVmIE9VVFNJREVfRlJBTUUgaW4gdGhpcyBjYXNlIHRvbz8KKwkgKi8KKwlhdG9taWNfc2V0KCZkZXYtPmVuYWJsZV9yeCwgMCk7CisJaWYgKHVubGlrZWx5KHNpcmRldl9pc19yZWNlaXZpbmcoZGV2KSkpCisJCWRldi0+c3RhdHMuY29sbGlzaW9ucysrOworCisJYWN0dWFsID0gZGV2LT5kcnYtPmRvX3dyaXRlKGRldiwgZGV2LT50eF9idWZmLmRhdGEsIGRldi0+dHhfYnVmZi5sZW4pOworCisJaWYgKGxpa2VseShhY3R1YWwgPiAwKSkgeworCQlkZXYtPnR4X3NrYiA9IHNrYjsKKwkJbmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlkZXYtPnR4X2J1ZmYuZGF0YSArPSBhY3R1YWw7CisJCWRldi0+dHhfYnVmZi5sZW4gLT0gYWN0dWFsOworCX0KKwllbHNlIGlmICh1bmxpa2VseShhY3R1YWwgPCAwKSkgeworCQkvKiBjb3VsZCBiZSBkcm9wcGVkIGxhdGVyIHdoZW4gd2UgaGF2ZSB0eF90aW1lb3V0IHRvIHJlY292ZXIgKi8KKwkJSVJEQV9FUlJPUigiJXM6IGRydi0+ZG9fd3JpdGUgZmFpbGVkICglZClcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGFjdHVhbCk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CQkgICAgICAKKwkJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CQkgICAgICAKKwkJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT50eF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGVkIGZyb20gbmV0d29yayBsYXllciB3aXRoIHJ0bmwgaG9sZCAqLworCitzdGF0aWMgaW50IHNpcmRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgaWZfaXJkYV9yZXEgKmlycSA9IChzdHJ1Y3QgaWZfaXJkYV9yZXEgKikgcnE7CisJc3RydWN0IHNpcl9kZXYgKmRldiA9IG5kZXYtPnByaXY7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpLCAlcywgKGNtZD0weCVYKVxuIiwgX19GVU5DVElPTl9fLCBuZGV2LT5uYW1lLCBjbWQpOworCQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DU0JBTkRXSURUSDogLyogU2V0IGJhbmR3aWR0aCAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXQgPSAtRVBFUk07CisJCWVsc2UKKwkJCXJldCA9IHNpcmRldl9zY2hlZHVsZV9zcGVlZChkZXYsIGlycS0+aWZyX2JhdWRyYXRlKTsKKwkJLyogY2Fubm90IHNsZWVwIGhlcmUgZm9yIGNvbXBsZXRpb24KKwkJICogd2UgYXJlIGNhbGxlZCBmcm9tIG5ldHdvcmsgbGF5ZXIgd2l0aCBydG5sIGhvbGQKKwkJICovCisJCWJyZWFrOworCisJY2FzZSBTSU9DU0RPTkdMRTogLyogU2V0IGRvbmdsZSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXQgPSAtRVBFUk07CisJCWVsc2UKKwkJCXJldCA9IHNpcmRldl9zY2hlZHVsZV9kb25nbGVfb3BlbihkZXYsIGlycS0+aWZyX2RvbmdsZSk7CisJCS8qIGNhbm5vdCBzbGVlcCBoZXJlIGZvciBjb21wbGV0aW9uCisJCSAqIHdlIGFyZSBjYWxsZWQgZnJvbSBuZXR3b3JrIGxheWVyIHdpdGggcnRubCBob2xkCisJCSAqLworCQlicmVhazsKKworCWNhc2UgU0lPQ1NNRURJQUJVU1k6IC8qIFNldCBtZWRpYSBidXN5ICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldCA9IC1FUEVSTTsKKwkJZWxzZQorCQkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koZGV2LT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dSRUNFSVZJTkc6IC8qIENoZWNrIGlmIHdlIGFyZSByZWNlaXZpbmcgcmlnaHQgbm93ICovCisJCWlycS0+aWZyX3JlY2VpdmluZyA9IHNpcmRldl9pc19yZWNlaXZpbmcoZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTRFRSUlRTOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXQgPSAtRVBFUk07CisJCWVsc2UKKwkJCXJldCA9IHNpcmRldl9zY2hlZHVsZV9kdHJfcnRzKGRldiwgaXJxLT5pZnJfZHRyLCBpcnEtPmlmcl9ydHMpOworCQkvKiBjYW5ub3Qgc2xlZXAgaGVyZSBmb3IgY29tcGxldGlvbgorCQkgKiB3ZSBhcmUgY2FsbGVkIGZyb20gbmV0d29yayBsYXllciB3aXRoIHJ0bmwgaG9sZAorCQkgKi8KKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTTU9ERToKKyNpZiAwCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldCA9IC1FUEVSTTsKKwkJZWxzZQorCQkJcmV0ID0gc2lyZGV2X3NjaGVkdWxlX21vZGUoZGV2LCBpcnEtPmlmcl9tb2RlKTsKKwkJLyogY2Fubm90IHNsZWVwIGhlcmUgZm9yIGNvbXBsZXRpb24KKwkJICogd2UgYXJlIGNhbGxlZCBmcm9tIG5ldHdvcmsgbGF5ZXIgd2l0aCBydG5sIGhvbGQKKwkJICovCisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCQorCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgU0lSQlVGX0FMTE9DU0laRSA0MjY5CS8qIHdvcnN0IGNhc2Ugc2l6ZSBvZiBhIHdyYXBwZWQgSXJMQVAgZnJhbWUgKi8KKworc3RhdGljIGludCBzaXJkZXZfYWxsb2NfYnVmZmVycyhzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCWRldi0+dHhfYnVmZi50cnVlc2l6ZSA9IFNJUkJVRl9BTExPQ1NJWkU7CisJZGV2LT5yeF9idWZmLnRydWVzaXplID0gSVJEQV9TS0JfTUFYX01UVTsgCisKKwkvKiBCb290c3RyYXAgWmVyb0NvcHkgUnggKi8KKwlkZXYtPnJ4X2J1ZmYuc2tiID0gX19kZXZfYWxsb2Nfc2tiKGRldi0+cnhfYnVmZi50cnVlc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldi0+cnhfYnVmZi5za2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2tiX3Jlc2VydmUoZGV2LT5yeF9idWZmLnNrYiwgMSk7CisJZGV2LT5yeF9idWZmLmhlYWQgPSBkZXYtPnJ4X2J1ZmYuc2tiLT5kYXRhOworCisJZGV2LT50eF9idWZmLmhlYWQgPSBrbWFsbG9jKGRldi0+dHhfYnVmZi50cnVlc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldi0+dHhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJa2ZyZWVfc2tiKGRldi0+cnhfYnVmZi5za2IpOworCQlkZXYtPnJ4X2J1ZmYuc2tiID0gTlVMTDsKKwkJZGV2LT5yeF9idWZmLmhlYWQgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkZXYtPnR4X2J1ZmYuZGF0YSA9IGRldi0+dHhfYnVmZi5oZWFkOworCWRldi0+cnhfYnVmZi5kYXRhID0gZGV2LT5yeF9idWZmLmhlYWQ7CisJZGV2LT50eF9idWZmLmxlbiA9IDA7CisJZGV2LT5yeF9idWZmLmxlbiA9IDA7CisKKwlkZXYtPnJ4X2J1ZmYuaW5fZnJhbWUgPSBGQUxTRTsKKwlkZXYtPnJ4X2J1ZmYuc3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCXJldHVybiAwOworfTsKKworc3RhdGljIHZvaWQgc2lyZGV2X2ZyZWVfYnVmZmVycyhzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCWlmIChkZXYtPnJ4X2J1ZmYuc2tiKQorCQlrZnJlZV9za2IoZGV2LT5yeF9idWZmLnNrYik7CisJaWYgKGRldi0+dHhfYnVmZi5oZWFkKQorCQlrZnJlZShkZXYtPnR4X2J1ZmYuaGVhZCk7CisJZGV2LT5yeF9idWZmLmhlYWQgPSBkZXYtPnR4X2J1ZmYuaGVhZCA9IE5VTEw7CisJZGV2LT5yeF9idWZmLnNrYiA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgc2lyZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHNpcl9kZXYgKmRldiA9IG5kZXYtPnByaXY7CisJY29uc3Qgc3RydWN0IHNpcl9kcml2ZXIgKmRydiA9IGRldi0+ZHJ2OworCisJaWYgKCFkcnYpCisJCXJldHVybiAtRU5PREVWOworCisJLyogaW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgZHJpdmVyIG1vZHVsZSBiZWZvcmUgZG9pbmcgc2VyaW91cyBzdHVmZiAqLworCWlmICghdHJ5X21vZHVsZV9nZXQoZHJ2LT5vd25lcikpCisJCXJldHVybiAtRVNUQUxFOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWlmIChzaXJkZXZfYWxsb2NfYnVmZmVycyhkZXYpKQorCQlnb3RvIGVycm91dF9kZWM7CisKKwlpZiAoIWRldi0+ZHJ2LT5zdGFydF9kZXYgIHx8ICBkZXYtPmRydi0+c3RhcnRfZGV2KGRldikpCisJCWdvdG8gZXJyb3V0X2ZyZWU7CisKKwlzaXJkZXZfZW5hYmxlX3J4KGRldik7CisJZGV2LT5yYXdfdHggPSAwOworCisJbmV0aWZfc3RhcnRfcXVldWUobmRldik7CisJZGV2LT5pcmxhcCA9IGlybGFwX29wZW4obmRldiwgJmRldi0+cW9zLCBkZXYtPmh3bmFtZSk7CisJaWYgKCFkZXYtPmlybGFwKQorCQlnb3RvIGVycm91dF9zdG9wOworCisJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKKworCUlSREFfREVCVUcoMiwgIiVzIC0gZG9uZSwgc3BlZWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBkZXYtPnNwZWVkKTsKKworCXJldHVybiAwOworCitlcnJvdXRfc3RvcDoKKwlhdG9taWNfc2V0KCZkZXYtPmVuYWJsZV9yeCwgMCk7CisJaWYgKGRldi0+ZHJ2LT5zdG9wX2RldikKKwkJZGV2LT5kcnYtPnN0b3BfZGV2KGRldik7CitlcnJvdXRfZnJlZToKKwlzaXJkZXZfZnJlZV9idWZmZXJzKGRldik7CitlcnJvdXRfZGVjOgorCW1vZHVsZV9wdXQoZHJ2LT5vd25lcik7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKK3N0YXRpYyBpbnQgc2lyZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBzaXJfZGV2ICpkZXYgPSBuZGV2LT5wcml2OworCWNvbnN0IHN0cnVjdCBzaXJfZHJpdmVyICpkcnY7CisKKy8vCUlSREFfREVCVUcoMCwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKworCWRvd24oJmRldi0+ZnNtLnNlbSk7CQkvKiBibG9jayBvbiBwZW5kaW5nIGNvbmZpZyBjb21wbGV0aW9uICovCisKKwlhdG9taWNfc2V0KCZkZXYtPmVuYWJsZV9yeCwgMCk7CisKKwlpZiAodW5saWtlbHkoIWRldi0+aXJsYXApKQorCQlnb3RvIG91dDsKKwlpcmxhcF9jbG9zZShkZXYtPmlybGFwKTsKKwlkZXYtPmlybGFwID0gTlVMTDsKKworCWRydiA9IGRldi0+ZHJ2OworCWlmICh1bmxpa2VseSghZHJ2ICB8fCAgIWRldi0+cHJpdikpCisJCWdvdG8gb3V0OworCisJaWYgKGRydi0+c3RvcF9kZXYpCisJCWRydi0+c3RvcF9kZXYoZGV2KTsKKworCXNpcmRldl9mcmVlX2J1ZmZlcnMoZGV2KTsKKwltb2R1bGVfcHV0KGRydi0+b3duZXIpOworCitvdXQ6CisJZGV2LT5zcGVlZCA9IDA7CisJdXAoJmRldi0+ZnNtLnNlbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBzaXJfZGV2ICogc2lyZGV2X2dldF9pbnN0YW5jZShjb25zdCBzdHJ1Y3Qgc2lyX2RyaXZlciAqZHJ2LCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCBzaXJfZGV2ICpkZXY7CisKKwlJUkRBX0RFQlVHKDAsICIlcyAtICVzXG4iLCBfX0ZVTkNUSU9OX18sIG5hbWUpOworCisJLyogaW5zdGVhZCBvZiBhZGRpbmcgdGVzdHMgdG8gcHJvdGVjdCBhZ2FpbnN0IGRydi0+ZG9fd3JpdGU9PU5VTEwKKwkgKiBhdCBzZXZlcmFsIHBsYWNlcyB3ZSByZWZ1c2UgdG8gY3JlYXRlIGEgc2lyX2RldiBpbnN0YW5jZSBmb3IKKwkgKiBkcml2ZXJzIHdoaWNoIGRvbid0IGltcGxlbWVudCBkb193cml0ZS4KKwkgKi8KKwlpZiAoIWRydiB8fCAgIWRydi0+ZG9fd3JpdGUpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiAgQWxsb2NhdGUgbmV3IGluc3RhbmNlIG9mIHRoZSBkZXZpY2UKKwkgKi8KKwluZGV2ID0gYWxsb2NfaXJkYWRldihzaXplb2YoKmRldikpOworCWlmIChuZGV2ID09IE5VTEwpIHsKKwkJSVJEQV9FUlJPUigiJXMgLSBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIElyREEgY29udHJvbCBibG9jayFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0OworCX0KKwlkZXYgPSBuZGV2LT5wcml2OworCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmZGV2LT5xb3MpOworCWRldi0+cW9zLmJhdWRfcmF0ZS5iaXRzID0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisJZGV2LT5xb3MubWluX3R1cm5fdGltZS5iaXRzID0gZHJ2LT5xb3NfbXR0X2JpdHM7CisJaXJkYV9xb3NfYml0c190b192YWx1ZSgmZGV2LT5xb3MpOworCisJc3RybmNweShkZXYtPmh3bmFtZSwgbmFtZSwgc2l6ZW9mKGRldi0+aHduYW1lKS0xKTsKKworCWF0b21pY19zZXQoJmRldi0+ZW5hYmxlX3J4LCAwKTsKKwlkZXYtPnR4X3NrYiA9IE5VTEw7CisKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT50eF9sb2NrKTsKKwlpbml0X01VVEVYKCZkZXYtPmZzbS5zZW0pOworCisJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZnNtLnJxLmxoX3JlcXVlc3QpOworCWRldi0+ZnNtLnJxLnBlbmRpbmcgPSAwOworCWluaXRfdGltZXIoJmRldi0+ZnNtLnJxLnRpbWVyKTsKKworCWRldi0+ZHJ2ID0gZHJ2OworCWRldi0+bmV0ZGV2ID0gbmRldjsKKworCVNFVF9NT0RVTEVfT1dORVIobmRldik7CisKKwkvKiBPdmVycmlkZSB0aGUgbmV0d29yayBmdW5jdGlvbnMgd2UgbmVlZCB0byB1c2UgKi8KKwluZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzaXJkZXZfaGFyZF94bWl0OworCW5kZXYtPm9wZW4gPSBzaXJkZXZfb3BlbjsKKwluZGV2LT5zdG9wID0gc2lyZGV2X2Nsb3NlOworCW5kZXYtPmdldF9zdGF0cyA9IHNpcmRldl9nZXRfc3RhdHM7CisJbmRldi0+ZG9faW9jdGwgPSBzaXJkZXZfaW9jdGw7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KG5kZXYpKSB7CisJCUlSREFfRVJST1IoIiVzKCksIHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0X2ZyZWVuZXRkZXY7CisJfQorCisJcmV0dXJuIGRldjsKKworb3V0X2ZyZWVuZXRkZXY6CisJZnJlZV9uZXRkZXYobmRldik7CitvdXQ6CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBzaXJkZXZfcHV0X2luc3RhbmNlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJaW50IGVyciA9IDA7CisKKwlJUkRBX0RFQlVHKDAsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWF0b21pY19zZXQoJmRldi0+ZW5hYmxlX3J4LCAwKTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldi0+bmV0ZGV2KTsKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldi0+bmV0ZGV2KTsKKworCWlmIChkZXYtPmRvbmdsZV9kcnYpCisJCWVyciA9IHNpcmRldl9zY2hlZHVsZV9kb25nbGVfY2xvc2UoZGV2KTsKKwlpZiAoZXJyKQorCQlJUkRBX0VSUk9SKCIlcyAtIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycik7CisKKwlzaXJkZXZfY2xvc2UoZGV2LT5uZXRkZXYpOworCisJZG93bigmZGV2LT5mc20uc2VtKTsKKwlkZXYtPmZzbS5zdGF0ZSA9IFNJUkRFVl9TVEFURV9ERUFEOwkvKiBtYXJrIHN0YWxlZCAqLworCWRldi0+ZG9uZ2xlX2RydiA9IE5VTEw7CisJZGV2LT5wcml2ID0gTlVMTDsKKwl1cCgmZGV2LT5mc20uc2VtKTsKKworCS8qIFJlbW92ZSBuZXRkZXZpY2UgKi8KKwl1bnJlZ2lzdGVyX25ldGRldihkZXYtPm5ldGRldik7CisKKwlmcmVlX25ldGRldihkZXYtPm5ldGRldik7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zaXJfZG9uZ2xlLmMgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9kb25nbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWI3Njc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfZG9uZ2xlLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglzaXJfZG9uZ2xlLmM6CW1hbmFnZXIgZm9yIHNlcmlhbCBkb25nbGUgcHJvdG9jb2wgZHJpdmVycworICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqCXRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGRvbmdsZSByZWdpc3RyYXRpb24gYW5kIGF0dGFjaG1lbnQKKyAqCisgKi8KKworc3RhdGljIExJU1RfSEVBRChkb25nbGVfbGlzdCk7CQkJLyogbGlzdCBvZiByZWdpc3RlcmVkIGRvbmdsZSBkcml2ZXJzICovCitzdGF0aWMgREVDTEFSRV9NVVRFWChkb25nbGVfbGlzdF9sb2NrKTsJCS8qIHByb3RlY3RzIHRoZSBsaXN0ICovCisKK2ludCBpcmRhX3JlZ2lzdGVyX2RvbmdsZShzdHJ1Y3QgZG9uZ2xlX2RyaXZlciAqbmV3KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXN0cnVjdCBkb25nbGVfZHJpdmVyICpkcnY7CisKKwlJUkRBX0RFQlVHKDAsICIlcyA6IHJlZ2lzdGVyaW5nIGRvbmdsZSBcIiVzXCIgKCVkKS5cbiIsCisJCSAgIF9fRlVOQ1RJT05fXywgbmV3LT5kcml2ZXJfbmFtZSwgbmV3LT50eXBlKTsKKworCWRvd24oJmRvbmdsZV9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2goZW50cnksICZkb25nbGVfbGlzdCkgeworCQlkcnYgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZG9uZ2xlX2RyaXZlciwgZG9uZ2xlX2xpc3QpOworCQlpZiAobmV3LT50eXBlID09IGRydi0+dHlwZSkgeworCQkJdXAoJmRvbmdsZV9saXN0X2xvY2spOworCQkJcmV0dXJuIC1FRVhJU1Q7CisJCX0KKwl9CisJbGlzdF9hZGQoJm5ldy0+ZG9uZ2xlX2xpc3QsICZkb25nbGVfbGlzdCk7CisJdXAoJmRvbmdsZV9saXN0X2xvY2spOworCXJldHVybiAwOworfQorCitpbnQgaXJkYV91bnJlZ2lzdGVyX2RvbmdsZShzdHJ1Y3QgZG9uZ2xlX2RyaXZlciAqZHJ2KQoreworCWRvd24oJmRvbmdsZV9saXN0X2xvY2spOworCWxpc3RfZGVsKCZkcnYtPmRvbmdsZV9saXN0KTsKKwl1cCgmZG9uZ2xlX2xpc3RfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzaXJkZXZfZ2V0X2RvbmdsZShzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBJUkRBX0RPTkdMRSB0eXBlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCWNvbnN0IHN0cnVjdCBkb25nbGVfZHJpdmVyICpkcnYgPSBOVUxMOworCWludCBlcnIgPSAtRUlOVkFMOworCisjaWZkZWYgQ09ORklHX0tNT0QKKwlyZXF1ZXN0X21vZHVsZSgiaXJkYS1kb25nbGUtJWQiLCB0eXBlKTsKKyNlbmRpZgorCisJaWYgKGRldi0+ZG9uZ2xlX2RydiAhPSBOVUxMKQorCQlyZXR1cm4gLUVCVVNZOworCQorCS8qIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBkb25nbGVzICovCisJZG93bigmZG9uZ2xlX2xpc3RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmZG9uZ2xlX2xpc3QpIHsKKwkJZHJ2ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGRvbmdsZV9kcml2ZXIsIGRvbmdsZV9saXN0KTsKKwkJaWYgKGRydi0+dHlwZSA9PSB0eXBlKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCWRydiA9IE5VTEw7CisJfQorCisJaWYgKCFkcnYpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXRfdW5sb2NrOwkvKiBubyBzdWNoIGRvbmdsZSAqLworCX0KKworCS8qIGhhbmRsaW5nIG9mIFNNUCByYWNlcyB3aXRoIGRvbmdsZSBtb2R1bGUgcmVtb3ZhbCAtIHRocmVlIGNhc2VzOgorCSAqIDEpIGRvbmdsZSBkcml2ZXIgd2FzIGFscmVhZHkgdW5yZWdpc3RlcmVkIC0gdGhlbiB3ZSBoYXZlbid0IGZvdW5kIHRoZQorCSAqCXJlcXVlc3RlZCBkb25nbGUgYWJvdmUgYW5kIGFyZSBhbHJlYWR5IG91dCBoZXJlCisJICogMikgdGhlIG1vZHVsZSBpcyBhbHJlYWR5IG1hcmtlZCBkZWxldGVkIGJ1dCB0aGUgZHJpdmVyIGlzIHN0aWxsCisJICoJcmVnaXN0ZXJlZCAtIHRoZW4gdGhlIHRyeV9tb2R1bGVfZ2V0KCkgYmVsb3cgd2lsbCBmYWlsCisJICogMykgdGhlIHRyeV9tb2R1bGVfZ2V0KCkgYmVsb3cgc3VjY2VlZHMgYmVmb3JlIHRoZSBtb2R1bGUgaXMgbWFya2VkCisJICoJZGVsZXRlZCAtIHRoZW4gc3lzX2RlbGV0ZV9tb2R1bGUoKSBmYWlscyBhbmQgcHJldmVudHMgdGhlIHJlbW92YWwKKwkgKgliZWNhdXNlIHRoZSBtb2R1bGUgaXMgaW4gdXNlLgorCSAqLworCisJaWYgKCF0cnlfbW9kdWxlX2dldChkcnYtPm93bmVyKSkgeworCQllcnIgPSAtRVNUQUxFOworCQlnb3RvIG91dF91bmxvY2s7CS8qIHJtbW9kIGFscmVhZHkgcGVuZGluZyAqLworCX0KKwlkZXYtPmRvbmdsZV9kcnYgPSBkcnY7CisKKwlpZiAoIWRydi0+b3BlbiAgfHwgIChlcnI9ZHJ2LT5vcGVuKGRldikpIT0wKQorCQlnb3RvIG91dF9yZWplY3Q7CQkvKiBmYWlsZWQgdG8gb3BlbiBkcml2ZXIgKi8KKworCXVwKCZkb25nbGVfbGlzdF9sb2NrKTsKKwlyZXR1cm4gMDsKKworb3V0X3JlamVjdDoKKwlkZXYtPmRvbmdsZV9kcnYgPSBOVUxMOworCW1vZHVsZV9wdXQoZHJ2LT5vd25lcik7CitvdXRfdW5sb2NrOgorCXVwKCZkb25nbGVfbGlzdF9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgc2lyZGV2X3B1dF9kb25nbGUoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwljb25zdCBzdHJ1Y3QgZG9uZ2xlX2RyaXZlciAqZHJ2ID0gZGV2LT5kb25nbGVfZHJ2OworCisJaWYgKGRydikgeworCQlpZiAoZHJ2LT5jbG9zZSkKKwkJCWRydi0+Y2xvc2UoZGV2KTsJCS8qIGNsb3NlIHRoaXMgZG9uZ2xlIGluc3RhbmNlICovCisKKwkJZGV2LT5kb25nbGVfZHJ2ID0gTlVMTDsJCQkvKiB1bmxpbmsgdGhlIGRvbmdsZSBkcml2ZXIgKi8KKwkJbW9kdWxlX3B1dChkcnYtPm93bmVyKTsvKiBkZWNyZW1lbnQgZHJpdmVyJ3MgbW9kdWxlIHJlZmNvdW50ICovCisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Npcl9rdGhyZWFkLmMgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9rdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjZWExMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2t0aHJlYWQuYwpAQCAtMCwwICsxLDUwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCXNpcl9rdGhyZWFkLmM6CQlkZWRpY2F0ZWQgdGhyZWFkIHRvIHByb2Nlc3Mgc2NoZWR1bGVkCisgKgkJCQlzaXIgZGV2aWNlIHNldHVwIHJlcXVlc3RzCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAyIE1hcnRpbiBEaWVobAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqCXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICoJdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKworI2luY2x1ZGUgInNpci1kZXYuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoga0lyREFkIGtlcm5lbCB0aHJlYWQgYW5kIGNvbmZpZyBzdGF0ZSBtYWNoaW5lCisgKgorICovCisKK3N0cnVjdCBpcmRhX3JlcXVlc3RfcXVldWUgeworCXN0cnVjdCBsaXN0X2hlYWQgcmVxdWVzdF9saXN0OworCXNwaW5sb2NrX3QgbG9jazsKKwl0YXNrX3QgKnRocmVhZDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBleGl0OworCXdhaXRfcXVldWVfaGVhZF90IGtpY2ssIGRvbmU7CisJYXRvbWljX3QgbnVtX3BlbmRpbmc7Cit9OworCitzdGF0aWMgc3RydWN0IGlyZGFfcmVxdWVzdF9xdWV1ZSBpcmRhX3JxX3F1ZXVlOworCitzdGF0aWMgaW50IGlyZGFfcXVldWVfcmVxdWVzdChzdHJ1Y3QgaXJkYV9yZXF1ZXN0ICpycSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KDAsICZycS0+cGVuZGluZykpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlyZGFfcnFfcXVldWUubG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZF90YWlsKCZycS0+bGhfcmVxdWVzdCwgJmlyZGFfcnFfcXVldWUucmVxdWVzdF9saXN0KTsKKwkJd2FrZV91cCgmaXJkYV9ycV9xdWV1ZS5raWNrKTsKKwkJYXRvbWljX2luYygmaXJkYV9ycV9xdWV1ZS5udW1fcGVuZGluZyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlyZGFfcnFfcXVldWUubG9jaywgZmxhZ3MpOworCQlyZXQgPSAxOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpcmRhX3JlcXVlc3RfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpcmRhX3JlcXVlc3QgKnJxID0gKHN0cnVjdCBpcmRhX3JlcXVlc3QgKilkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlyZGFfcnFfcXVldWUubG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJnJxLT5saF9yZXF1ZXN0LCAmaXJkYV9ycV9xdWV1ZS5yZXF1ZXN0X2xpc3QpOworCXdha2VfdXAoJmlyZGFfcnFfcXVldWUua2ljayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJkYV9ycV9xdWV1ZS5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgaXJkYV9xdWV1ZV9kZWxheWVkX3JlcXVlc3Qoc3RydWN0IGlyZGFfcmVxdWVzdCAqcnEsIHVuc2lnbmVkIGxvbmcgZGVsYXkpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyID0gJnJxLT50aW1lcjsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdCgwLCAmcnEtPnBlbmRpbmcpKSB7CisJCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIGRlbGF5OworCQl0aW1lci0+ZnVuY3Rpb24gPSBpcmRhX3JlcXVlc3RfdGltZXI7CisJCXRpbWVyLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcnE7CisJCWF0b21pY19pbmMoJmlyZGFfcnFfcXVldWUubnVtX3BlbmRpbmcpOworCQlhZGRfdGltZXIodGltZXIpOworCQlyZXQgPSAxOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBydW5faXJkYV9xdWV1ZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisJc3RydWN0IGlyZGFfcmVxdWVzdCAqcnE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJkYV9ycV9xdWV1ZS5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsICZpcmRhX3JxX3F1ZXVlLnJlcXVlc3RfbGlzdCkgeworCQlycSA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBpcmRhX3JlcXVlc3QsIGxoX3JlcXVlc3QpOworCQlsaXN0X2RlbF9pbml0KGVudHJ5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJkYV9ycV9xdWV1ZS5sb2NrLCBmbGFncyk7CisKKwkJY2xlYXJfYml0KDAsICZycS0+cGVuZGluZyk7CisJCXJxLT5mdW5jKHJxLT5kYXRhKTsKKworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaXJkYV9ycV9xdWV1ZS5udW1fcGVuZGluZykpCisJCQl3YWtlX3VwKCZpcmRhX3JxX3F1ZXVlLmRvbmUpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpcmRhX3JxX3F1ZXVlLmxvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJkYV9ycV9xdWV1ZS5sb2NrLCBmbGFncyk7Cit9CQkKKworc3RhdGljIGludCBpcmRhX3RocmVhZCh2b2lkICpzdGFydHVwKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJZGFlbW9uaXplKCJrSXJEQWQiKTsKKworCWlyZGFfcnFfcXVldWUudGhyZWFkID0gY3VycmVudDsKKworCWNvbXBsZXRlKChzdHJ1Y3QgY29tcGxldGlvbiAqKXN0YXJ0dXApOworCisJd2hpbGUgKGlyZGFfcnFfcXVldWUudGhyZWFkICE9IE5VTEwpIHsKKworCQkvKiBXZSB1c2UgVEFTS19JTlRFUlJVUFRJQkxFLCByYXRoZXIgdGhhbgorCQkgKiBUQVNLX1VOSU5URVJSVVBUSUJMRS4gIEFuZHJldyBNb3J0b24gbWFkZSB0aGlzCisJCSAqIGNoYW5nZSA7IGhlIHRvbGQgbWUgdGhhdCBpdCBpcyBzYWZlLCBiZWNhdXNlICJzaWduYWwKKwkJICogYmxvY2tpbmcgaXMgbm93IGhhbmRsZWQgaW4gZGFlbW9uaXplKCkiLCBoZSBhZGRlZAorCQkgKiB0aGF0IHRoZSBwcm9ibGVtIGlzIHRoYXQgInVuaW50ZXJydXB0aWJsZSBzbGVlcAorCQkgKiBjb250cmlidXRlcyB0byBsb2FkIGF2ZXJhZ2UiLCBtYWtpbmcgdXNlciB3b3JyeS4KKwkJICogSmVhbiBJSSAqLworCQlzZXRfdGFza19zdGF0ZShjdXJyZW50LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQlhZGRfd2FpdF9xdWV1ZSgmaXJkYV9ycV9xdWV1ZS5raWNrLCAmd2FpdCk7CisJCWlmIChsaXN0X2VtcHR5KCZpcmRhX3JxX3F1ZXVlLnJlcXVlc3RfbGlzdCkpCisJCQlzY2hlZHVsZSgpOworCQllbHNlCisJCQlfX3NldF90YXNrX3N0YXRlKGN1cnJlbnQsIFRBU0tfUlVOTklORyk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZpcmRhX3JxX3F1ZXVlLmtpY2ssICZ3YWl0KTsKKworCQkvKiBtYWtlIHN3c3VzcCBoYXBweSB3aXRoIG91ciB0aHJlYWQgKi8KKwkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKQorCQkJcmVmcmlnZXJhdG9yKFBGX0ZSRUVaRSk7CisKKwkJcnVuX2lyZGFfcXVldWUoKTsKKwl9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMzUpCisJcmVwYXJlbnRfdG9faW5pdCgpOworI2VuZGlmCisJY29tcGxldGVfYW5kX2V4aXQoJmlyZGFfcnFfcXVldWUuZXhpdCwgMCk7CisJLyogbmV2ZXIgcmVhY2hlZCAqLworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGZsdXNoX2lyZGFfcXVldWUodm9pZCkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJmlyZGFfcnFfcXVldWUubnVtX3BlbmRpbmcpKSB7CisKKwkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwkJaWYgKCFsaXN0X2VtcHR5KCZpcmRhX3JxX3F1ZXVlLnJlcXVlc3RfbGlzdCkpCisJCQlydW5faXJkYV9xdWV1ZSgpOworCisJCXNldF90YXNrX3N0YXRlKGN1cnJlbnQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJYWRkX3dhaXRfcXVldWUoJmlyZGFfcnFfcXVldWUuZG9uZSwgJndhaXQpOworCQlpZiAoYXRvbWljX3JlYWQoJmlyZGFfcnFfcXVldWUubnVtX3BlbmRpbmcpKQorCQkJc2NoZWR1bGUoKTsKKwkJZWxzZQorCQkJX19zZXRfdGFza19zdGF0ZShjdXJyZW50LCBUQVNLX1JVTk5JTkcpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmaXJkYV9ycV9xdWV1ZS5kb25lLCAmd2FpdCk7CisJfQorfQorCisvKiBzdWJzdGF0ZSBoYW5kbGVyIG9mIHRoZSBjb25maWctZnNtIHRvIGhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgd2Ugd2FudAorICogdG8gd2FpdCBmb3IgdHJhbnNtaXQgY29tcGxldGlvbiBiZWZvcmUgY2hhbmdpbmcgdGhlIHBvcnQgY29uZmlndXJhdGlvbgorICovCisKK3N0YXRpYyBpbnQgaXJkYV90eF9jb21wbGV0ZV9mc20oc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc2lyX2ZzbSAqZnNtID0gJmRldi0+ZnNtOworCXVuc2lnbmVkIG5leHRfc3RhdGUsIGRlbGF5OworCXVuc2lnbmVkIGJ5dGVzX2xlZnQ7CisKKwlkbyB7CisJCW5leHRfc3RhdGUgPSBmc20tPnN1YnN0YXRlOwkvKiBkZWZhdWx0OiBzdGF5IGluIGN1cnJlbnQgc3Vic3RhdGUgKi8KKwkJZGVsYXkgPSAwOworCisJCXN3aXRjaChmc20tPnN1YnN0YXRlKSB7CisKKwkJY2FzZSBTSVJERVZfU1RBVEVfV0FJVF9YTUlUOgorCQkJaWYgKGRldi0+ZHJ2LT5jaGFyc19pbl9idWZmZXIpCisJCQkJYnl0ZXNfbGVmdCA9IGRldi0+ZHJ2LT5jaGFyc19pbl9idWZmZXIoZGV2KTsKKwkJCWVsc2UKKwkJCQlieXRlc19sZWZ0ID0gMDsKKwkJCWlmICghYnl0ZXNfbGVmdCkgeworCQkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfV0FJVF9VTlRJTF9TRU5UOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoZGV2LT5zcGVlZCA+IDExNTIwMCkKKwkJCQlkZWxheSA9IChieXRlc19sZWZ0KjgqMTAwMDApIC8gKGRldi0+c3BlZWQvMTAwKTsKKwkJCWVsc2UgaWYgKGRldi0+c3BlZWQgPiAwKQorCQkJCWRlbGF5ID0gKGJ5dGVzX2xlZnQqMTAqMTAwMDApIC8gKGRldi0+c3BlZWQvMTAwKTsKKwkJCWVsc2UKKwkJCQlkZWxheSA9IDA7CisJCQkvKiBleHBlY3RlZCBkZWxheSAodXNlYykgdW50aWwgcmVtYWluaW5nIGJ5dGVzIGFyZSBzZW50ICovCisJCQlpZiAoZGVsYXkgPCAxMDApIHsKKwkJCQl1ZGVsYXkoZGVsYXkpOworCQkJCWRlbGF5ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIHNsZWVwIHNvbWUgbG9uZ2VyIGRlbGF5IChtc2VjKSAqLworCQkJZGVsYXkgPSAoZGVsYXkrOTk5KSAvIDEwMDA7CisJCQlicmVhazsKKworCQljYXNlIFNJUkRFVl9TVEFURV9XQUlUX1VOVElMX1NFTlQ6CisJCQkvKiBibG9jayB1bnRpbCB1bmRlcmxheWluZyBoYXJkd2FyZSBidWZmZXIgYXJlIGVtcHR5ICovCisJCQlpZiAoZGV2LT5kcnYtPndhaXRfdW50aWxfc2VudCkKKwkJCQlkZXYtPmRydi0+d2FpdF91bnRpbF9zZW50KGRldik7CisJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX1RYX0RPTkU7CisJCQlicmVhazsKKworCQljYXNlIFNJUkRFVl9TVEFURV9UWF9ET05FOgorCQkJcmV0dXJuIDA7CisKKwkJZGVmYXVsdDoKKwkJCUlSREFfRVJST1IoIiVzIC0gdW5kZWZpbmVkIHN0YXRlXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZnNtLT5zdWJzdGF0ZSA9IG5leHRfc3RhdGU7CisJfSB3aGlsZSAoZGVsYXkgPT0gMCk7CisJcmV0dXJuIGRlbGF5OworfQorCisvKgorICogRnVuY3Rpb24gaXJkYV9jb25maWdfZnNtCisgKgorICogU3RhdGUgbWFjaGluZSB0byBoYW5kbGUgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGRldmljZSAoYW5kIGF0dGFjaGVkIGRvbmdsZSwgaWYgYW55KS4KKyAqIFRoaXMgaGFuZGxlciBpcyBzY2hlZHVsZWQgZm9yIGV4ZWN1dGlvbiBpbiBrSXJEQWQgY29udGV4dCwgc28gd2UgY2FuIHNsZWVwLgorICogaG93ZXZlciwga0lyREFkIGlzIHNoYXJlZCBieSBhbGwgc2lyX2RldiBkZXZpY2VzIHNvIHdlIGJldHRlciBkb24ndCBzbGVlcCB0aGVyZSB0b28KKyAqIGxvbmcuIEluc3RlYWQsIGZvciBsb25nZXIgZGVsYXlzIHdlIHN0YXJ0IGEgdGltZXIgdG8gcmVzY2hlZHVsZSB1cyBsYXRlci4KKyAqIE9uIGVudHJ5LCBmc20tPnNlbSBpcyBhbHdheXMgbG9ja2VkIGFuZCB0aGUgbmV0ZGV2IHhtaXQgcXVldWUgc3RvcHBlZC4KKyAqIEJvdGggbXVzdCBiZSB1bmxvY2tlZC9yZXN0YXJ0ZWQgb24gY29tcGxldGlvbiAtIGJ1dCBvbmx5IG9uIGZpbmFsIGV4aXQuCisgKi8KKworc3RhdGljIHZvaWQgaXJkYV9jb25maWdfZnNtKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNpcl9kZXYgKmRldiA9IGRhdGE7CisJc3RydWN0IHNpcl9mc20gKmZzbSA9ICZkZXYtPmZzbTsKKwlpbnQgbmV4dF9zdGF0ZTsKKwlpbnQgcmV0ID0gLTE7CisJdW5zaWduZWQgZGVsYXk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCA8JWxkPlxuIiwgX19GVU5DVElPTl9fLCBqaWZmaWVzKTsgCisKKwlkbyB7CisJCUlSREFfREVCVUcoMywgIiVzIC0gc3RhdGU9MHglMDR4IC8gc3Vic3RhdGU9MHglMDR4XG4iLAorCQkJX19GVU5DVElPTl9fLCBmc20tPnN0YXRlLCBmc20tPnN1YnN0YXRlKTsKKworCQluZXh0X3N0YXRlID0gZnNtLT5zdGF0ZTsKKwkJZGVsYXkgPSAwOworCisJCXN3aXRjaChmc20tPnN0YXRlKSB7CisKKwkJY2FzZSBTSVJERVZfU1RBVEVfRE9OR0xFX09QRU46CisJCQlpZiAoZGV2LT5kb25nbGVfZHJ2ICE9IE5VTEwpIHsKKwkJCQlyZXQgPSBzaXJkZXZfcHV0X2RvbmdsZShkZXYpOworCQkJCWlmIChyZXQpIHsKKwkJCQkJZnNtLT5yZXN1bHQgPSAtRUlOVkFMOworCQkJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0VSUk9SOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCS8qIEluaXRpYWxpemUgZG9uZ2xlICovCisJCQlyZXQgPSBzaXJkZXZfZ2V0X2RvbmdsZShkZXYsIGZzbS0+cGFyYW0pOworCQkJaWYgKHJldCkgeworCQkJCWZzbS0+cmVzdWx0ID0gcmV0OworCQkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfRVJST1I7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIERvbmdsZXMgYXJlIHBvd2VyZWQgdGhyb3VnaCB0aGUgbW9kZW0gY29udHJvbCBsaW5lcyB3aGljaAorCQkJICogd2VyZSBqdXN0IHNldCBkdXJpbmcgb3Blbi4gQmVmb3JlIHJlc2V0dGluZywgbGV0J3Mgd2FpdCBmb3IKKwkJCSAqIHRoZSBwb3dlciB0byBzdGFiaWxpemUuIFRoaXMgaXMgd2hhdCBzb21lIGRvbmdsZSBkcml2ZXJzIGRpZAorCQkJICogaW4gb3BlbiBiZWZvcmUsIHdoaWxlIG90aGVycyBkaWRuJ3QgLSBzaG91bGQgYmUgc2FmZSBhbnl3YXkuCisJCQkgKi8KKworCQkJZGVsYXkgPSA1MDsKKwkJCWZzbS0+c3Vic3RhdGUgPSBTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUOworCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQ7CisKKwkJCWZzbS0+cGFyYW0gPSA5NjAwOworCisJCQlicmVhazsKKworCQljYXNlIFNJUkRFVl9TVEFURV9ET05HTEVfQ0xPU0U6CisJCQkvKiBzaG91bGRuJ3Qgd2UganVzdCB0cmVhdCB0aGlzIGFzIHN1Y2Nlc3M9PyAqLworCQkJaWYgKGRldi0+ZG9uZ2xlX2RydiA9PSBOVUxMKSB7CisJCQkJZnNtLT5yZXN1bHQgPSAtRUlOVkFMOworCQkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfRVJST1I7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXJldCA9IHNpcmRldl9wdXRfZG9uZ2xlKGRldik7CisJCQlpZiAocmV0KSB7CisJCQkJZnNtLT5yZXN1bHQgPSByZXQ7CisJCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9FUlJPUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfRE9ORTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lSREVWX1NUQVRFX1NFVF9EVFJfUlRTOgorCQkJcmV0ID0gc2lyZGV2X3NldF9kdHJfcnRzKGRldiwKKwkJCQkoZnNtLT5wYXJhbSYweDAyKSA/IFRSVUUgOiBGQUxTRSwKKwkJCQkoZnNtLT5wYXJhbSYweDAxKSA/IFRSVUUgOiBGQUxTRSk7CisJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0RPTkU7CisJCQlicmVhazsKKworCQljYXNlIFNJUkRFVl9TVEFURV9TRVRfU1BFRUQ6CisJCQlmc20tPnN1YnN0YXRlID0gU0lSREVWX1NUQVRFX1dBSVRfWE1JVDsKKwkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfRE9OR0xFX0NIRUNLOworCQkJYnJlYWs7CisKKwkJY2FzZSBTSVJERVZfU1RBVEVfRE9OR0xFX0NIRUNLOgorCQkJcmV0ID0gaXJkYV90eF9jb21wbGV0ZV9mc20oZGV2KTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZnNtLT5yZXN1bHQgPSByZXQ7CisJCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9FUlJPUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICgoZGVsYXk9cmV0KSAhPSAwKQorCQkJCWJyZWFrOworCisJCQlpZiAoZGV2LT5kb25nbGVfZHJ2KSB7CisJCQkJZnNtLT5zdWJzdGF0ZSA9IFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQ7CisJCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQ7CisJCQl9CisJCQllbHNlIHsKKwkJCQlkZXYtPnNwZWVkID0gZnNtLT5wYXJhbTsKKwkJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX1BPUlRfU1BFRUQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQ6CisJCQlpZiAoZGV2LT5kb25nbGVfZHJ2LT5yZXNldCkgeworCQkJCXJldCA9IGRldi0+ZG9uZ2xlX2Rydi0+cmVzZXQoZGV2KTsJCisJCQkJaWYgKHJldCA8IDApIHsKKwkJCQkJZnNtLT5yZXN1bHQgPSByZXQ7CisJCQkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfRVJST1I7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCQlyZXQgPSAwOworCQkJaWYgKChkZWxheT1yZXQpID09IDApIHsKKwkJCQkvKiBzZXQgc2VyaWFsIHBvcnQgYWNjb3JkaW5nIHRvIGRvbmdsZSBkZWZhdWx0IHNwZWVkICovCisJCQkJaWYgKGRldi0+ZHJ2LT5zZXRfc3BlZWQpCisJCQkJCWRldi0+ZHJ2LT5zZXRfc3BlZWQoZGV2LCBkZXYtPnNwZWVkKTsKKwkJCQlmc20tPnN1YnN0YXRlID0gU0lSREVWX1NUQVRFX0RPTkdMRV9TUEVFRDsKKwkJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0RPTkdMRV9TUEVFRDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0lSREVWX1NUQVRFX0RPTkdMRV9TUEVFRDoJCQkJCisJCQlpZiAoZGV2LT5kb25nbGVfZHJ2LT5yZXNldCkgeworCQkJCXJldCA9IGRldi0+ZG9uZ2xlX2Rydi0+c2V0X3NwZWVkKGRldiwgZnNtLT5wYXJhbSk7CisJCQkJaWYgKHJldCA8IDApIHsKKwkJCQkJZnNtLT5yZXN1bHQgPSByZXQ7CisJCQkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfRVJST1I7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCQlyZXQgPSAwOworCQkJaWYgKChkZWxheT1yZXQpID09IDApCisJCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9QT1JUX1NQRUVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBTSVJERVZfU1RBVEVfUE9SVF9TUEVFRDoKKwkJCS8qIEZpbmFsbHkgd2UgYXJlIHJlYWR5IHRvIGNoYW5nZSB0aGUgc2VyaWFsIHBvcnQgc3BlZWQgKi8KKwkJCWlmIChkZXYtPmRydi0+c2V0X3NwZWVkKQorCQkJCWRldi0+ZHJ2LT5zZXRfc3BlZWQoZGV2LCBkZXYtPnNwZWVkKTsKKwkJCWRldi0+bmV3X3NwZWVkID0gMDsKKwkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfRE9ORTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lSREVWX1NUQVRFX0RPTkU6CisJCQkvKiBTaWduYWwgbmV0d29yayBsYXllciBzbyBpdCBjYW4gc2VuZCBtb3JlIGZyYW1lcyAqLworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYtPm5ldGRldik7CisJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0NPTVBMRVRFOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUlSREFfRVJST1IoIiVzIC0gdW5kZWZpbmVkIHN0YXRlXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZnNtLT5yZXN1bHQgPSAtRUlOVkFMOworCQkJLyogZmFsbCB0aHJ1ICovCisKKwkJY2FzZSBTSVJERVZfU1RBVEVfRVJST1I6CisJCQlJUkRBX0VSUk9SKCIlcyAtIGVycm9yOiAlZFxuIiwgX19GVU5DVElPTl9fLCBmc20tPnJlc3VsdCk7CisKKyNpZiAwCS8qIGRvbid0IGVuYWJsZSB0aGlzIGJlZm9yZSB3ZSBoYXZlIG5ldGRldi0+dHhfdGltZW91dCB0byByZWNvdmVyICovCisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldi0+bmV0ZGV2KTsKKyNlbHNlCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldi0+bmV0ZGV2KTsKKyNlbmRpZgorCQkJLyogZmFsbCB0aHJ1ICovCisKKwkJY2FzZSBTSVJERVZfU1RBVEVfQ09NUExFVEU6CisJCQkvKiBjb25maWcgY2hhbmdlIGZpbmlzaGVkLCBzbyB3ZSBhcmUgbm90IGJ1c3kgYW55IGxvbmdlciAqLworCQkJc2lyZGV2X2VuYWJsZV9yeChkZXYpOworCQkJdXAoJmZzbS0+c2VtKTsKKwkJCXJldHVybjsKKwkJfQorCQlmc20tPnN0YXRlID0gbmV4dF9zdGF0ZTsKKwl9IHdoaWxlKCFkZWxheSk7CisKKwlpcmRhX3F1ZXVlX2RlbGF5ZWRfcmVxdWVzdCgmZnNtLT5ycSwgbXNlY3NfdG9famlmZmllcyhkZWxheSkpOworfQorCisvKiBzY2hlZHVsZSBzb21lIGRldmljZSBjb25maWd1cmF0aW9uIHRhc2sgZm9yIGV4ZWN1dGlvbiBieSBrSXJEQWQKKyAqIG9uIGJlaGFsZiBvZiB0aGUgYWJvdmUgc3RhdGUgbWFjaGluZS4KKyAqIGNhbiBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIG9yIGludGVycnVwdC90YXNrbGV0IGNvbnRleHQuCisgKi8KKworaW50IHNpcmRldl9zY2hlZHVsZV9yZXF1ZXN0KHN0cnVjdCBzaXJfZGV2ICpkZXYsIGludCBpbml0aWFsX3N0YXRlLCB1bnNpZ25lZCBwYXJhbSkKK3sKKwlzdHJ1Y3Qgc2lyX2ZzbSAqZnNtID0gJmRldi0+ZnNtOworCWludCB4bWl0X3dhc19kb3duOworCisJSVJEQV9ERUJVRygyLCAiJXMgLSBzdGF0ZT0weCUwNHggLyBwYXJhbT0ldVxuIiwgX19GVU5DVElPTl9fLCBpbml0aWFsX3N0YXRlLCBwYXJhbSk7CisKKwlpZiAoZG93bl90cnlsb2NrKCZmc20tPnNlbSkpIHsKKwkJaWYgKGluX2ludGVycnVwdCgpICB8fCAgaW5fYXRvbWljKCkgIHx8ICBpcnFzX2Rpc2FibGVkKCkpIHsKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksIHN0YXRlIG1hY2hpbmUgYnVzeSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCQl9IGVsc2UKKwkJCWRvd24oJmZzbS0+c2VtKTsKKwl9CisKKwlpZiAoZnNtLT5zdGF0ZSA9PSBTSVJERVZfU1RBVEVfREVBRCkgeworCQkvKiByYWNlIHdpdGggc2lyZGV2X2Nsb3NlIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJSVJEQV9FUlJPUigiJXMoKSwgaW5zdGFuY2Ugc3RhbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJdXAoJmZzbS0+c2VtKTsKKwkJcmV0dXJuIC1FU1RBTEU7CQkvKiBvciBiZXR0ZXIgRVBJUEU/ICovCisJfQorCisJeG1pdF93YXNfZG93biA9IG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2LT5uZXRkZXYpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2LT5uZXRkZXYpOworCWF0b21pY19zZXQoJmRldi0+ZW5hYmxlX3J4LCAwKTsKKworCWZzbS0+c3RhdGUgPSBpbml0aWFsX3N0YXRlOworCWZzbS0+cGFyYW0gPSBwYXJhbTsKKwlmc20tPnJlc3VsdCA9IDA7CisKKwlJTklUX0xJU1RfSEVBRCgmZnNtLT5ycS5saF9yZXF1ZXN0KTsKKwlmc20tPnJxLnBlbmRpbmcgPSAwOworCWZzbS0+cnEuZnVuYyA9IGlyZGFfY29uZmlnX2ZzbTsKKwlmc20tPnJxLmRhdGEgPSBkZXY7CisKKwlpZiAoIWlyZGFfcXVldWVfcmVxdWVzdCgmZnNtLT5ycSkpIHsJLyogcmV0dXJucyAwIG9uIGVycm9yISAqLworCQlhdG9taWNfc2V0KCZkZXYtPmVuYWJsZV9yeCwgMSk7CisJCWlmICgheG1pdF93YXNfZG93bikKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2LT5uZXRkZXYpOwkJCisJCXVwKCZmc20tPnNlbSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IF9faW5pdCBpcmRhX3RocmVhZF9jcmVhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgY29tcGxldGlvbiBzdGFydHVwOworCWludCBwaWQ7CisKKwlzcGluX2xvY2tfaW5pdCgmaXJkYV9ycV9xdWV1ZS5sb2NrKTsKKwlpcmRhX3JxX3F1ZXVlLnRocmVhZCA9IE5VTEw7CisJSU5JVF9MSVNUX0hFQUQoJmlyZGFfcnFfcXVldWUucmVxdWVzdF9saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpcmRhX3JxX3F1ZXVlLmtpY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlyZGFfcnFfcXVldWUuZG9uZSk7CisJYXRvbWljX3NldCgmaXJkYV9ycV9xdWV1ZS5udW1fcGVuZGluZywgMCk7CisKKwlpbml0X2NvbXBsZXRpb24oJnN0YXJ0dXApOworCXBpZCA9IGtlcm5lbF90aHJlYWQoaXJkYV90aHJlYWQsICZzdGFydHVwLCBDTE9ORV9GU3xDTE9ORV9GSUxFUyk7CisJaWYgKHBpZCA8PSAwKQorCQlyZXR1cm4gLUVBR0FJTjsKKwllbHNlCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnN0YXJ0dXApOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19leGl0IGlyZGFfdGhyZWFkX2pvaW4odm9pZCkgCit7CisJaWYgKGlyZGFfcnFfcXVldWUudGhyZWFkKSB7CisJCWZsdXNoX2lyZGFfcXVldWUoKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZpcmRhX3JxX3F1ZXVlLmV4aXQpOworCQlpcmRhX3JxX3F1ZXVlLnRocmVhZCA9IE5VTEw7CisJCXdha2VfdXAoJmlyZGFfcnFfcXVldWUua2ljayk7CQkKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmaXJkYV9ycV9xdWV1ZS5leGl0KTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxMjVhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCkBAIC0wLDAgKzEsMjM5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogJElkOiBzbXNjLWlyY2MyLmMsdiAxLjE5LjIuNSAyMDAyLzEwLzI3IDExOjM0OjI2IGRpcCBFeHAgJAorICoKKyAqIERlc2NyaXB0aW9uOiAgIERyaXZlciBmb3IgdGhlIFNNQyBJbmZyYXJlZCBDb21tdW5pY2F0aW9ucyBDb250cm9sbGVyCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYW5pZWxlIFBlcmkgKHBlcmlAY3NhaS51bmlwYS5pdCkKKyAqIENyZWF0ZWQgYXQ6ICAgIAorICogTW9kaWZpZWQgYXQ6ICAgCisgKiBNb2RpZmllZCBieTogICAKKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMjAwMiAgICAgIERhbmllbGUgUGVyaQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAyICAgICAgSmVhbiBUb3VycmlsaGVzCisgKgorICoKKyAqIEJhc2VkIG9uIHNtYy1pcmNjLmM6CisgKgorICogICAgIENvcHlyaWdodCAoYykgMjAwMSAgICAgIFN0ZWZhbmkgU2VpYm9sZAorICogICAgIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIERhZyBCcmF0dGxpCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhvbWFzIERhdmlzLCAKKyAqCisgKglhbmQgaXJwb3J0LmM6CisgKgorICogICAgIENvcHlyaWdodCAoYykgMTk5NywgMTk5OCwgMTk5OS0yMDAwIERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworI2luY2x1ZGUgInNtc2MtaXJjYzIuaCIKKyNpbmNsdWRlICJzbXNjLXNpby5oIgorCisvKiBUeXBlcyAqLworCitzdHJ1Y3Qgc21zY190cmFuc2NlaXZlciB7CisJY2hhciAqbmFtZTsKKwl2b2lkICgqc2V0X2Zvcl9zcGVlZCkoaW50IGZpcl9iYXNlLCB1MzIgc3BlZWQpOwkKKwlpbnQgICgqcHJvYmUpKGludCBmaXJfYmFzZSk7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc21zY190cmFuc2NlaXZlciBzbXNjX3RyYW5zY2VpdmVyX3Q7CisKKyNpZiAwCitzdHJ1Y3Qgc21jX2NoaXAgeworCWNoYXIgKm5hbWU7CisJdTE2IGZsYWdzOworCXU4IGRldmlkOworCXU4IHJldjsKK307Cit0eXBlZGVmIHN0cnVjdCBzbWNfY2hpcCBzbWNfY2hpcF90OworI2VuZGlmCisKK3N0cnVjdCBzbXNjX2NoaXAgeworCWNoYXIgKm5hbWU7CisJI2lmIDAKKwl1OAl0eXBlOworCSNlbmRpZgorCXUxNiBmbGFnczsKKwl1OCBkZXZpZDsKKwl1OCByZXY7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc21zY19jaGlwIHNtc2NfY2hpcF90OworCitzdHJ1Y3Qgc21zY19jaGlwX2FkZHJlc3MgeworCXVuc2lnbmVkIGludCBjZmdfYmFzZTsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKK307Cit0eXBlZGVmIHN0cnVjdCBzbXNjX2NoaXBfYWRkcmVzcyBzbXNjX2NoaXBfYWRkcmVzc190OworCisvKiBQcml2YXRlIGRhdGEgZm9yIGVhY2ggaW5zdGFuY2UgKi8KK3N0cnVjdCBzbXNjX2lyY2NfY2IgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGlybGFwX2NiICAgICppcmxhcDsgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLworCQorCWNoaXBpb190IGlvOyAgICAgICAgICAgICAgIC8qIElyREEgY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLworCWlvYnVmZl90IHR4X2J1ZmY7ICAgICAgICAgIC8qIFRyYW5zbWl0IGJ1ZmZlciAqLworCWlvYnVmZl90IHJ4X2J1ZmY7ICAgICAgICAgIC8qIFJlY2VpdmUgYnVmZmVyICovCisJZG1hX2FkZHJfdCB0eF9idWZmX2RtYTsKKwlkbWFfYWRkcl90IHJ4X2J1ZmZfZG1hOworCisJc3RydWN0IHFvc19pbmZvIHFvczsgICAgICAgLyogUW9TIGNhcGFiaWxpdGllcyBmb3IgdGhpcyBkZXZpY2UgKi8KKworCXNwaW5sb2NrX3QgbG9jazsgICAgICAgICAgIC8qIEZvciBzZXJpYWxpemluZyBvcGVyYXRpb25zICovCisJCisJX191MzIgbmV3X3NwZWVkOworCV9fdTMyIGZsYWdzOyAgICAgICAgICAgICAgIC8qIEludGVyZmFjZSBmbGFncyAqLworCisJaW50IHR4X2J1ZmZfb2Zmc2V0c1sxMF07ICAgLyogT2Zmc2V0cyBiZXR3ZWVuIGZyYW1lcyBpbiB0eF9idWZmICovCisJaW50IHR4X2xlbjsgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGZyYW1lcyBpbiB0eF9idWZmICovCisKKwlpbnQgdHJhbnNjZWl2ZXI7CisJc3RydWN0IHBtX2RldiAqcG1kZXY7Cit9OworCisvKiBDb25zdGFudHMgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lID0gInNtc2MtaXJjYzIiOworI2RlZmluZQlESU0oeCkJKHNpemVvZih4KS8oc2l6ZW9mKCooeCkpKSkKKyNkZWZpbmUgU01TQ19JUkNDMl9DX0lSREFfRkFMTEJBQ0tfU1BFRUQJOTYwMAorI2RlZmluZSBTTVNDX0lSQ0MyX0NfREVGQVVMVF9UUkFOU0NFSVZFUgkxCisjZGVmaW5lIFNNU0NfSVJDQzJfQ19ORVRfVElNRU9VVAkJCTAKKyNkZWZpbmUgU01TQ19JUkNDMl9DX1NJUl9TVE9QCQkJMAorCisvKiBQcm90b3R5cGVzICovCisKK3N0YXRpYyBpbnQgc21zY19pcmNjX29wZW4odW5zaWduZWQgaW50IGZpcmJhc2UsIHVuc2lnbmVkIGludCBzaXJiYXNlLCB1OCBkbWEsIHU4IGlycSk7CitzdGF0aWMgaW50IHNtc2NfaXJjY19wcmVzZW50KHVuc2lnbmVkIGludCBmaXJfYmFzZSwgdW5zaWduZWQgaW50IHNpcl9iYXNlKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXR1cF9pbyhzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCB1bnNpZ25lZCBpbnQgZmlyX2Jhc2UsIHVuc2lnbmVkIGludCBzaXJfYmFzZSwgdTggZG1hLCB1OCBpcnEpOworc3RhdGljIHZvaWQgc21zY19pcmNjX3NldHVwX3FvcyhzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19pbml0X2NoaXAoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50IF9fZXhpdCBzbXNjX2lyY2NfY2xvc2Uoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50ICBzbXNjX2lyY2NfZG1hX3JlY2VpdmUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSk7IAorc3RhdGljIHZvaWQgc21zY19pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpOworc3RhdGljIHZvaWQgc21zY19pcmNjX3Npcl9yZWNlaXZlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCAgc21zY19pcmNjX2hhcmRfeG1pdF9zaXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBzbXNjX2lyY2NfaGFyZF94bWl0X2ZpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfeG1pdChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlLCBpbnQgYm9mcyk7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSk7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHZvaWQgKnByaXYsIHUzMiBzcGVlZCk7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3Npcl9zcGVlZCh2b2lkICpwcml2LCB1MzIgc3BlZWQpOworc3RhdGljIGlycXJldHVybl90IHNtc2NfaXJjY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc21zY19pcmNjX2ludGVycnVwdF9zaXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2lyX3N0YXJ0KHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOworI2lmIFNNU0NfSVJDQzJfQ19TSVJfU1RPUAorc3RhdGljIHZvaWQgc21zY19pcmNjX3Npcl9zdG9wKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOworI2VuZGlmCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2lyX3dyaXRlX3dha2V1cChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgIHNtc2NfaXJjY19zaXJfd3JpdGUoaW50IGlvYmFzZSwgaW50IGZpZm9fc2l6ZSwgX191OCAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgIHNtc2NfaXJjY19uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIHNtc2NfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBzbXNjX2lyY2NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworI2lmIFNNU0NfSVJDQzJfQ19ORVRfVElNRU9VVAorc3RhdGljIHZvaWQgc21zY19pcmNjX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc21zY19pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBzbXNjX2lyY2NfcG1wcm9jKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBzbXNjX2lyY2NfaXNfcmVjZWl2aW5nKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIHZvaWQgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9mb3Jfc3BlZWQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgdTMyIHNwZWVkKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zaXJfd2FpdF9od190cmFuc21pdHRlcl9maW5pc2goc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CisKKy8qIFByb2JpbmcgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNtc2NfaXJjY19sb29rX2Zvcl9jaGlwcyh2b2lkKTsKK3N0YXRpYyBjb25zdCBzbXNjX2NoaXBfdCAqIF9faW5pdCBzbXNjX2lyY2NfcHJvYmUodW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsdTggcmVnLGNvbnN0IHNtc2NfY2hpcF90ICpjaGlwLGNoYXIgKnR5cGUpOworc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX2ZsYXQoY29uc3Qgc21zY19jaGlwX3QgKmNoaXBzLCB1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgY2hhciAqdHlwZSk7CitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fcGFnZWQoY29uc3Qgc21zY19jaGlwX3QgKmNoaXBzLCB1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgY2hhciAqdHlwZSk7CitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fZmRjKHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlKTsKK3N0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19scGModW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UpOworCisvKiBUcmFuc2NlaXZlcnMgc3BlY2lmaWMgZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfdG9zaGliYV9zYXQxODAwKGludCBmaXJfYmFzZSwgdTMyIHNwZWVkKTsKK3N0YXRpYyBpbnQgIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl90b3NoaWJhX3NhdDE4MDAoaW50IGZpcl9iYXNlKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2Zhc3RfcGluX3NlbGVjdChpbnQgZmlyX2Jhc2UsIHUzMiBzcGVlZCk7CitzdGF0aWMgaW50ICBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2Zhc3RfcGluX3NlbGVjdChpbnQgZmlyX2Jhc2UpOworc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9zbXNjX2lyY2NfYXRjKGludCBmaXJfYmFzZSwgdTMyIHNwZWVkKTsKK3N0YXRpYyBpbnQgIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl9zbXNjX2lyY2NfYXRjKGludCBmaXJfYmFzZSk7CisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KKworc3RhdGljIHZvaWQgc21zY19pcmNjX3N1c3BlbmQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfd2FrZXVwKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCBzbXNjX2lyY2NfcG1wcm9jKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpOworCisKKy8qIFRyYW5zY2VpdmVycyBmb3IgU01TQy1pcmNjICovCisKK3N0YXRpYyBzbXNjX3RyYW5zY2VpdmVyX3Qgc21zY190cmFuc2NlaXZlcnNbXT0KK3sKKwl7ICJUb3NoaWJhIFNhdGVsbGl0ZSAxODAwIChHUCBkYXRhIHBpbiBzZWxlY3QpIiwgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl90b3NoaWJhX3NhdDE4MDAsIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl90b3NoaWJhX3NhdDE4MDB9LAorCXsgIkZhc3QgcGluIHNlbGVjdCIsIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2Zhc3RfcGluX3NlbGVjdCwgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19mYXN0X3Bpbl9zZWxlY3R9LAorCXsgIkFUQyBJUk1vZGUiLCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19hdGMsIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl9zbXNjX2lyY2NfYXRjfSwKKwl7IE5VTEwsIE5VTEx9Cit9OworI2RlZmluZSBTTVNDX0lSQ0MyX0NfTlVNQkVSX09GX1RSQU5TQ0VJVkVSUyAoRElNKHNtc2NfdHJhbnNjZWl2ZXJzKS0xKQorCisvKiAgU01DIFN1cGVySU8gY2hpcHNldHMgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZQlLRVk1NV8xCTAJLyogU3VwZXJJTyBDb25maWd1cmF0aW9uIG1vZGUgd2l0aCBLZXkgPDB4NTU+ICovCisjZGVmaW5lCUtFWTU1XzIJMQkvKiBTdXBlcklPIENvbmZpZ3VyYXRpb24gbW9kZSB3aXRoIEtleSA8MHg1NSwweDU1PiAqLworI2RlZmluZQlOb0lSREEJMgkvKiBTdXBlcklPIENoaXAgaGFzIG5vIElSREEgUG9ydCAqLworI2RlZmluZQlTSVIJMAkvKiBTdXBlcklPIENoaXAgaGFzIG9ubHkgc2xvdyBJUkRBICovCisjZGVmaW5lCUZJUgk0CS8qIFN1cGVySU8gQ2hpcCBoYXMgZmFzdCBJUkRBICovCisjZGVmaW5lCVNFUng0CTgJLyogU3VwZXJJTyBDaGlwIHN1cHBvcnRzIDExNSwyIEtCYXVkICogND00NjAsOCBLQmF1ZCAqLworCitzdGF0aWMgc21zY19jaGlwX3QgX19pbml0ZGF0YSBmZGNfY2hpcHNfZmxhdFtdPQoreworCS8qIEJhc2UgYWRkcmVzcyAweDNmMCBvciAweDM3MCAqLworCXsgIjM3QzQ0IiwJS0VZNTVfMXxOb0lSREEsCQkweDAwLCAweDAwIH0sIC8qIFRoaXMgY2hpcCBjYW5ub3QgYmUgZGV0ZWN0ZWQgKi8KKwl7ICIzN0M2NjVHVCIsCUtFWTU1XzJ8Tm9JUkRBLAkJMHg2NSwgMHgwMSB9LAorCXsgIjM3QzY2NUdUIiwJS0VZNTVfMnxOb0lSREEsCQkweDY2LCAweDAxIH0sCisJeyAiMzdDNjY5IiwJS0VZNTVfMnxTSVJ8U0VSeDQsCTB4MDMsIDB4MDIgfSwKKwl7ICIzN0M2NjkiLAlLRVk1NV8yfFNJUnxTRVJ4NCwJMHgwNCwgMHgwMiB9LCAvKiBJRD8gKi8KKwl7ICIzN0M3OCIsCUtFWTU1XzJ8Tm9JUkRBLAkJMHg3OCwgMHgwMCB9LAorCXsgIjM3Tjc2OSIsCUtFWTU1XzF8RklSfFNFUng0LAkweDI4LCAweDAwIH0sCisJeyAiMzdOODY5IiwJS0VZNTVfMXxGSVJ8U0VSeDQsCTB4MjksIDB4MDAgfSwKKwl7IE5VTEwgfQorfTsKKworc3RhdGljIHNtc2NfY2hpcF90IF9faW5pdGRhdGEgZmRjX2NoaXBzX3BhZ2VkW109Cit7CisJLyogQmFzZSBhZGRyZXNzIDB4M2YwIG9yIDB4MzcwICovCisJeyAiMzdCNzJYIiwJS0VZNTVfMXxTSVJ8U0VSeDQsCTB4NGMsIDB4MDAgfSwKKwl7ICIzN0I3N1giLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHg0MywgMHgwMCB9LAorCXsgIjM3Qjc4WCIsCUtFWTU1XzF8U0lSfFNFUng0LAkweDQ0LCAweDAwIH0sCisJeyAiMzdCODBYIiwJS0VZNTVfMXxTSVJ8U0VSeDQsCTB4NDIsIDB4MDAgfSwKKwl7ICIzN0M2N1giLAlLRVk1NV8xfEZJUnxTRVJ4NCwJMHg0MCwgMHgwMCB9LAorCXsgIjM3QzkzWCIsCUtFWTU1XzJ8U0lSfFNFUng0LAkweDAyLCAweDAxIH0sCisJeyAiMzdDOTNYQVBNIiwJS0VZNTVfMXxTSVJ8U0VSeDQsCTB4MzAsIDB4MDEgfSwKKwl7ICIzN0M5M1hGUiIsCUtFWTU1XzJ8RklSfFNFUng0LAkweDAzLCAweDAxIH0sCisJeyAiMzdNNzA3IiwJS0VZNTVfMXxTSVJ8U0VSeDQsCTB4NDIsIDB4MDAgfSwKKwl7ICIzN004MVgiLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHg0ZCwgMHgwMCB9LAorCXsgIjM3Tjk1OEZSIiwJS0VZNTVfMXxGSVJ8U0VSeDQsCTB4MDksIDB4MDQgfSwKKwl7ICIzN045NzEiLAlLRVk1NV8xfEZJUnxTRVJ4NCwJMHgwYSwgMHgwMCB9LAorCXsgIjM3Tjk3MiIsCUtFWTU1XzF8RklSfFNFUng0LAkweDBiLCAweDAwIH0sCisJeyBOVUxMIH0KK307CisKK3N0YXRpYyBzbXNjX2NoaXBfdCBfX2luaXRkYXRhIGxwY19jaGlwc19mbGF0W109Cit7CisJLyogQmFzZSBhZGRyZXNzIDB4MkUgb3IgMHg0RSAqLworCXsgIjQ3TjIyNyIsCUtFWTU1XzF8RklSfFNFUng0LAkweDVhLCAweDAwIH0sCisJeyAiNDdOMjY3IiwJS0VZNTVfMXxGSVJ8U0VSeDQsCTB4NWUsIDB4MDAgfSwKKwl7IE5VTEwgfQorfTsKKworc3RhdGljIHNtc2NfY2hpcF90IF9faW5pdGRhdGEgbHBjX2NoaXBzX3BhZ2VkW109Cit7CisJLyogQmFzZSBhZGRyZXNzIDB4MkUgb3IgMHg0RSAqLworCXsgIjQ3QjI3WCIsCUtFWTU1XzF8U0lSfFNFUng0LAkweDUxLCAweDAwIH0sCisJeyAiNDdCMzdYIiwJS0VZNTVfMXxTSVJ8U0VSeDQsCTB4NTIsIDB4MDAgfSwKKwl7ICI0N00xMFgiLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHg1OSwgMHgwMCB9LAorCXsgIjQ3TTEyMCIsCUtFWTU1XzF8Tm9JUkRBfFNFUng0LAkweDVjLCAweDAwIH0sCisJeyAiNDdNMTNYIiwJS0VZNTVfMXxTSVJ8U0VSeDQsCTB4NTksIDB4MDAgfSwKKwl7ICI0N00xNFgiLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHg1ZiwgMHgwMCB9LAorCXsgIjQ3TjI1MiIsCUtFWTU1XzF8RklSfFNFUng0LAkweDBlLCAweDAwIH0sCisJeyAiNDdTNDJYIiwJS0VZNTVfMXxTSVJ8U0VSeDQsCTB4NTcsIDB4MDAgfSwKKwl7IE5VTEwgfQorfTsKKworI2RlZmluZSBTTVNDU0lPX1RZUEVfRkRDCTEKKyNkZWZpbmUgU01TQ1NJT19UWVBFX0xQQwkyCisjZGVmaW5lIFNNU0NTSU9fVFlQRV9GTEFUCTQKKyNkZWZpbmUgU01TQ1NJT19UWVBFX1BBR0VECTgKKworc3RhdGljIHNtc2NfY2hpcF9hZGRyZXNzX3QgX19pbml0ZGF0YSBwb3NzaWJsZV9hZGRyZXNzZXNbXT0KK3sKKwl7MHgzZjAsIFNNU0NTSU9fVFlQRV9GREN8U01TQ1NJT19UWVBFX0ZMQVR8U01TQ1NJT19UWVBFX1BBR0VEfSwKKwl7MHgzNzAsIFNNU0NTSU9fVFlQRV9GREN8U01TQ1NJT19UWVBFX0ZMQVR8U01TQ1NJT19UWVBFX1BBR0VEfSwKKwl7MHhlMCwgU01TQ1NJT19UWVBFX0ZEQ3xTTVNDU0lPX1RZUEVfRkxBVHxTTVNDU0lPX1RZUEVfUEFHRUR9LAorCXsweDJlLCBTTVNDU0lPX1RZUEVfTFBDfFNNU0NTSU9fVFlQRV9GTEFUfFNNU0NTSU9fVFlQRV9QQUdFRH0sCisJezB4NGUsIFNNU0NTSU9fVFlQRV9MUEN8U01TQ1NJT19UWVBFX0ZMQVR8U01TQ1NJT19UWVBFX1BBR0VEfSwKKwl7MCwwfQorfTsKKworLyogR2xvYmFscyAqLworCitzdGF0aWMgc3RydWN0IHNtc2NfaXJjY19jYiAqZGV2X3NlbGZbXSA9IHsgTlVMTCwgTlVMTH07CisKK3N0YXRpYyBpbnQgaXJjY19pcnE9MjU1Oworc3RhdGljIGludCBpcmNjX2RtYT0yNTU7CitzdGF0aWMgaW50IGlyY2NfZmlyPTA7CitzdGF0aWMgaW50IGlyY2Nfc2lyPTA7CitzdGF0aWMgaW50IGlyY2NfY2ZnPTA7CitzdGF0aWMgaW50IGlyY2NfdHJhbnNjZWl2ZXI9MDsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0CWRldl9jb3VudD0wOworCitzdGF0aWMgaW5saW5lIHZvaWQgcmVnaXN0ZXJfYmFuayhpbnQgaW9iYXNlLCBpbnQgYmFuaykKK3sKKyAgICAgICAgb3V0YigoKGluYihpb2Jhc2UrSVJDQ19NQVNURVIpICYgMHhmMCkgfCAoYmFuayAmIDB4MDcpKSwKKyAgICAgICAgICAgICAgIGlvYmFzZStJUkNDX01BU1RFUik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgorICogU01TQy1pcmNjIHN0dWZmCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX2luaXQgKCkKKyAqCisgKiAgICBJbml0aWFsaXplIGNoaXAuIEp1c3QgdHJ5IHRvIGZpbmQgb3V0IGhvdyBtYW55IGNoaXBzIHdlIGFyZSBkZWFsaW5nIHdpdGgKKyAqICAgIGFuZCB3aGVyZSB0aGV5IGFyZQorICovCitzdGF0aWMgaW50IF9faW5pdCBzbXNjX2lyY2NfaW5pdCh2b2lkKQoreworCWludCByZXQ9LUVOT0RFVjsKKworCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJZGV2X2NvdW50PTA7CisgCisJaWYgKChpcmNjX2Zpcj4wKSYmKGlyY2Nfc2lyPjApKSB7CisJCUlSREFfTUVTU0FHRSgiIE92ZXJyaWRpbmcgRklSIGFkZHJlc3MgMHglMDR4XG4iLCBpcmNjX2Zpcik7CisJCUlSREFfTUVTU0FHRSgiIE92ZXJyaWRpbmcgU0lSIGFkZHJlc3MgMHglMDR4XG4iLCBpcmNjX3Npcik7CisKKwkJaWYgKHNtc2NfaXJjY19vcGVuKGlyY2NfZmlyLCBpcmNjX3NpciwgaXJjY19kbWEsIGlyY2NfaXJxKSA9PSAwKQorCQkJcmV0dXJuIDA7CisKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogdHJ5IHVzZXIgcHJvdmlkZWQgY29uZmlndXJhdGlvbiByZWdpc3RlciBiYXNlIGFkZHJlc3MgKi8KKwlpZiAoaXJjY19jZmc+MCkgeworCSAgICAgICAgSVJEQV9NRVNTQUdFKCIgT3ZlcnJpZGluZyBjb25maWd1cmF0aW9uIGFkZHJlc3MgMHglMDR4XG4iLAorCQkJICAgICBpcmNjX2NmZyk7CisJCWlmICghc21zY19zdXBlcmlvX2ZkYyhpcmNjX2NmZykpCisJCQlyZXQgPSAwOworCQlpZiAoIXNtc2Nfc3VwZXJpb19scGMoaXJjY19jZmcpKQorCQkJcmV0ID0gMDsKKwl9CisJCisJaWYoc21zY19pcmNjX2xvb2tfZm9yX2NoaXBzKCk+MCkgcmV0ID0gMDsKKwkKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX29wZW4gKGZpcmJhc2UsIHNpcmJhc2UsIGRtYSwgaXJxKQorICoKKyAqICAgIFRyeSB0byBvcGVuIGRyaXZlciBpbnN0YW5jZQorICoKKyAqLworc3RhdGljIGludCBfX2luaXQgc21zY19pcmNjX29wZW4odW5zaWduZWQgaW50IGZpcl9iYXNlLCB1bnNpZ25lZCBpbnQgc2lyX2Jhc2UsIHU4IGRtYSwgdTggaXJxKQoreworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyOworCQorCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJZXJyID0gc21zY19pcmNjX3ByZXNlbnQoZmlyX2Jhc2UsIHNpcl9iYXNlKTsKKwlpZihlcnIpIAorCQlnb3RvIGVycl9vdXQ7CisJCQorCWVyciA9IC1FTk9NRU07CisJaWYgKGRldl9jb3VudCA+IERJTShkZXZfc2VsZikpIHsKKwkgICAgICAgIElSREFfV0FSTklORygiJXMoKSwgdG9vIG1hbnkgZGV2aWNlcyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXJyX291dDE7CisJfQorCisJLyoKKwkgKiAgQWxsb2NhdGUgbmV3IGluc3RhbmNlIG9mIHRoZSBkcml2ZXIKKwkgKi8KKwlkZXYgPSBhbGxvY19pcmRhZGV2KHNpemVvZihzdHJ1Y3Qgc21zY19pcmNjX2NiKSk7CisJaWYgKCFkZXYpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpIGNhbid0IGFsbG9jYXRlIG5ldCBkZXZpY2VcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXJyX291dDE7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzbXNjX2lyY2NfaGFyZF94bWl0X3NpcjsKKyNpZiBTTVNDX0lSQ0MyX0NfTkVUX1RJTUVPVVQKKwlkZXYtPnR4X3RpbWVvdXQJICAgICA9IHNtc2NfaXJjY190aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gID0gSFoqMjsgIC8qIEFsbG93IGVub3VnaCB0aW1lIGZvciBzcGVlZCBjaGFuZ2UgKi8KKyNlbmRpZgorCWRldi0+b3BlbiAgICAgICAgICAgID0gc21zY19pcmNjX25ldF9vcGVuOworCWRldi0+c3RvcCAgICAgICAgICAgID0gc21zY19pcmNjX25ldF9jbG9zZTsKKwlkZXYtPmRvX2lvY3RsICAgICAgICA9IHNtc2NfaXJjY19uZXRfaW9jdGw7CisJZGV2LT5nZXRfc3RhdHMJICAgICA9IHNtc2NfaXJjY19uZXRfZ2V0X3N0YXRzOworCQorCXNlbGYgPSBkZXYtPnByaXY7CisJc2VsZi0+bmV0ZGV2ID0gZGV2OworCisJLyogTWFrZSBpZmNvbmZpZyBkaXNwbGF5IHNvbWUgZGV0YWlscyAqLworCWRldi0+YmFzZV9hZGRyID0gc2VsZi0+aW8uZmlyX2Jhc2UgPSBmaXJfYmFzZTsKKwlkZXYtPmlycSA9IHNlbGYtPmlvLmlycSA9IGlycTsKKworCS8qIE5lZWQgdG8gc3RvcmUgc2VsZiBzb21ld2hlcmUgKi8KKwlkZXZfc2VsZltkZXZfY291bnQrK10gPSBzZWxmOworCXNwaW5fbG9ja19pbml0KCZzZWxmLT5sb2NrKTsKKworCXNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUgPSBTTVNDX0lSQ0MyX1JYX0JVRkZfVFJVRVNJWkU7IAorCXNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUgPSBTTVNDX0lSQ0MyX1RYX0JVRkZfVFJVRVNJWkU7CisKKwlzZWxmLT5yeF9idWZmLmhlYWQgPQorCQlkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgICAmc2VsZi0+cnhfYnVmZl9kbWEsIEdGUF9LRVJORUwpOworCWlmIChzZWxmLT5yeF9idWZmLmhlYWQgPT0gTlVMTCkgeworCQlJUkRBX0VSUk9SKCIlcywgQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciByZWNlaXZlIGJ1ZmZlciFcbiIsCisJCQkgICBkcml2ZXJfbmFtZSk7CisJCWdvdG8gZXJyX291dDI7CisJfQorCisJc2VsZi0+dHhfYnVmZi5oZWFkID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICAgJnNlbGYtPnR4X2J1ZmZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+dHhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJSVJEQV9FUlJPUigiJXMsIENhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdHJhbnNtaXQgYnVmZmVyIVxuIiwKKwkJCSAgIGRyaXZlcl9uYW1lKTsKKwkJZ290byBlcnJfb3V0MzsKKwl9CisKKwltZW1zZXQoc2VsZi0+cnhfYnVmZi5oZWFkLCAwLCBzZWxmLT5yeF9idWZmLnRydWVzaXplKTsKKwltZW1zZXQoc2VsZi0+dHhfYnVmZi5oZWFkLCAwLCBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKKworCXNlbGYtPnJ4X2J1ZmYuaW5fZnJhbWUgPSBGQUxTRTsKKwlzZWxmLT5yeF9idWZmLnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisJc2VsZi0+cnhfYnVmZi5kYXRhID0gc2VsZi0+cnhfYnVmZi5oZWFkOworCSAgIAorCXNtc2NfaXJjY19zZXR1cF9pbyhzZWxmLCBmaXJfYmFzZSwgc2lyX2Jhc2UsIGRtYSwgaXJxKTsKKworCXNtc2NfaXJjY19zZXR1cF9xb3Moc2VsZik7CisKKwlzbXNjX2lyY2NfaW5pdF9jaGlwKHNlbGYpOworCQorCWlmKGlyY2NfdHJhbnNjZWl2ZXIgPiAwICAmJiAKKwkgICBpcmNjX3RyYW5zY2VpdmVyIDwgU01TQ19JUkNDMl9DX05VTUJFUl9PRl9UUkFOU0NFSVZFUlMpCisJCXNlbGYtPnRyYW5zY2VpdmVyID0gaXJjY190cmFuc2NlaXZlcjsKKwllbHNlCisJCXNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcihzZWxmKTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihzZWxmLT5uZXRkZXYpOworCWlmKGVycikgeworCQlJUkRBX0VSUk9SKCIlcywgTmV0d29yayBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZCFcbiIsCisJCQkgICBkcml2ZXJfbmFtZSk7CisJCWdvdG8gZXJyX291dDQ7CisJfQorCisJc2VsZi0+cG1kZXYgPSBwbV9yZWdpc3RlcihQTV9TWVNfREVWLCBQTV9TWVNfSVJEQSwgc21zY19pcmNjX3BtcHJvYyk7CisJaWYgKHNlbGYtPnBtZGV2KQorCQlzZWxmLT5wbWRldi0+ZGF0YSA9IHNlbGY7CisKKwlJUkRBX01FU1NBR0UoIklyREE6IFJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCisJcmV0dXJuIDA7CisgZXJyX291dDQ6CisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCSAgc2VsZi0+dHhfYnVmZi5oZWFkLCBzZWxmLT50eF9idWZmX2RtYSk7CisgZXJyX291dDM6CisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJCSAgc2VsZi0+cnhfYnVmZi5oZWFkLCBzZWxmLT5yeF9idWZmX2RtYSk7CisgZXJyX291dDI6CisJZnJlZV9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKwlkZXZfc2VsZlstLWRldl9jb3VudF0gPSBOVUxMOworIGVycl9vdXQxOgorCXJlbGVhc2VfcmVnaW9uKGZpcl9iYXNlLCBTTVNDX0lSQ0MyX0ZJUl9DSElQX0lPX0VYVEVOVCk7CisJcmVsZWFzZV9yZWdpb24oc2lyX2Jhc2UsIFNNU0NfSVJDQzJfU0lSX0NISVBfSU9fRVhURU5UKTsKKyBlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfcHJlc2VudChmaXJfYmFzZSwgc2lyX2Jhc2UpCisgKgorICogICAgQ2hlY2sgdGhlIHNtc2MtaXJjYyBjaGlwIHByZXNlbmNlCisgKgorICovCitzdGF0aWMgaW50IHNtc2NfaXJjY19wcmVzZW50KHVuc2lnbmVkIGludCBmaXJfYmFzZSwgdW5zaWduZWQgaW50IHNpcl9iYXNlKQoreworCXVuc2lnbmVkIGNoYXIgbG93LCBoaWdoLCBjaGlwLCBjb25maWcsIGRtYSwgaXJxLCB2ZXJzaW9uOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihmaXJfYmFzZSwgU01TQ19JUkNDMl9GSVJfQ0hJUF9JT19FWFRFTlQsCisJCQkgICAgZHJpdmVyX25hbWUpKSB7CisJCUlSREFfV0FSTklORygiJXM6IGNhbid0IGdldCBmaXJfYmFzZSBvZiAweCUwM3hcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgZmlyX2Jhc2UpOworCQlnb3RvIG91dDE7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzaXJfYmFzZSwgU01TQ19JUkNDMl9TSVJfQ0hJUF9JT19FWFRFTlQsCisJCQkgICAgZHJpdmVyX25hbWUpKSB7CisJCUlSREFfV0FSTklORygiJXM6IGNhbid0IGdldCBzaXJfYmFzZSBvZiAweCUwM3hcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgc2lyX2Jhc2UpOworCQlnb3RvIG91dDI7CisJfQorCisJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMyk7CisKKwloaWdoICAgID0gaW5iKGZpcl9iYXNlK0lSQ0NfSURfSElHSCk7CisJbG93ICAgICA9IGluYihmaXJfYmFzZStJUkNDX0lEX0xPVyk7CisJY2hpcCAgICA9IGluYihmaXJfYmFzZStJUkNDX0NISVBfSUQpOworCXZlcnNpb24gPSBpbmIoZmlyX2Jhc2UrSVJDQ19WRVJTSU9OKTsKKwljb25maWcgID0gaW5iKGZpcl9iYXNlK0lSQ0NfSU5URVJGQUNFKTsKKwlkbWEgICAgID0gY29uZmlnICYgSVJDQ19JTlRFUkZBQ0VfRE1BX01BU0s7CisJaXJxICAgICA9IChjb25maWcgJiBJUkNDX0lOVEVSRkFDRV9JUlFfTUFTSykgPj4gNDsKKworCWlmIChoaWdoICE9IDB4MTAgfHwgbG93ICE9IDB4YjggfHwgKGNoaXAgIT0gMHhmMSAmJiBjaGlwICE9IDB4ZjIpKSB7IAorCSAgICAgICAgSVJEQV9XQVJOSU5HKCIlcygpLCBhZGRyIDB4JTA0eCAtIG5vIGRldmljZSBmb3VuZCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgZmlyX2Jhc2UpOworCQlnb3RvIG91dDM7CisJfQorCUlSREFfTUVTU0FHRSgiU01zQyBJckRBIENvbnRyb2xsZXIgZm91bmRcbiBJckNDIHZlcnNpb24gJWQuJWQsICIKKwkJICAgICAiZmlycG9ydCAweCUwM3gsIHNpcnBvcnQgMHglMDN4IGRtYT0lZCwgaXJxPSVkXG4iLAorCQkgICAgIGNoaXAgJiAweDBmLCB2ZXJzaW9uLCBmaXJfYmFzZSwgc2lyX2Jhc2UsIGRtYSwgaXJxKTsKKworCXJldHVybiAwOworIG91dDM6CisJcmVsZWFzZV9yZWdpb24oc2lyX2Jhc2UsIFNNU0NfSVJDQzJfU0lSX0NISVBfSU9fRVhURU5UKTsKKyBvdXQyOgorCXJlbGVhc2VfcmVnaW9uKGZpcl9iYXNlLCBTTVNDX0lSQ0MyX0ZJUl9DSElQX0lPX0VYVEVOVCk7Cisgb3V0MToKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19zZXR1cF9pbyhzZWxmLCBmaXJfYmFzZSwgc2lyX2Jhc2UsIGRtYSwgaXJxKQorICoKKyAqICAgIFNldHVwIEkvTworICoKKyAqLworc3RhdGljIHZvaWQgc21zY19pcmNjX3NldHVwX2lvKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIAorCQkJICAgICAgIHVuc2lnbmVkIGludCBmaXJfYmFzZSwgdW5zaWduZWQgaW50IHNpcl9iYXNlLCAKKwkJCSAgICAgICB1OCBkbWEsIHU4IGlycSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNvbmZpZywgY2hpcF9kbWEsIGNoaXBfaXJxOworCisJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMyk7CisJY29uZmlnICA9IGluYihmaXJfYmFzZStJUkNDX0lOVEVSRkFDRSk7CisJY2hpcF9kbWEgICAgID0gY29uZmlnICYgSVJDQ19JTlRFUkZBQ0VfRE1BX01BU0s7CisJY2hpcF9pcnEgICAgID0gKGNvbmZpZyAmIElSQ0NfSU5URVJGQUNFX0lSUV9NQVNLKSA+PiA0OworCisJc2VsZi0+aW8uZmlyX2Jhc2UgID0gZmlyX2Jhc2U7CisJc2VsZi0+aW8uc2lyX2Jhc2UgID0gc2lyX2Jhc2U7CisJc2VsZi0+aW8uZmlyX2V4dCAgID0gU01TQ19JUkNDMl9GSVJfQ0hJUF9JT19FWFRFTlQ7CisJc2VsZi0+aW8uc2lyX2V4dCAgID0gU01TQ19JUkNDMl9TSVJfQ0hJUF9JT19FWFRFTlQ7CisJc2VsZi0+aW8uZmlmb19zaXplID0gU01TQ19JUkNDMl9GSUZPX1NJWkU7CisJc2VsZi0+aW8uc3BlZWQgPSBTTVNDX0lSQ0MyX0NfSVJEQV9GQUxMQkFDS19TUEVFRDsKKworCWlmIChpcnEgPCAyNTUpIHsKKwkJaWYgKGlycSAhPSBjaGlwX2lycSkKKwkJCUlSREFfTUVTU0FHRSgiJXMsIE92ZXJyaWRpbmcgSVJRIC0gY2hpcCBzYXlzICVkLCB1c2luZyAlZFxuIiwKKwkJCQkgICAgIGRyaXZlcl9uYW1lLCBjaGlwX2lycSwgaXJxKTsKKwkJc2VsZi0+aW8uaXJxID0gaXJxOworCX0KKwllbHNlCisJCXNlbGYtPmlvLmlycSA9IGNoaXBfaXJxOworCQorCWlmIChkbWEgPCAyNTUpIHsKKwkJaWYgKGRtYSAhPSBjaGlwX2RtYSkKKwkJCUlSREFfTUVTU0FHRSgiJXMsIE92ZXJyaWRpbmcgRE1BIC0gY2hpcCBzYXlzICVkLCB1c2luZyAlZFxuIiwKKwkJCQkgICAgIGRyaXZlcl9uYW1lLCBjaGlwX2RtYSwgZG1hKTsKKwkJc2VsZi0+aW8uZG1hID0gZG1hOworCX0KKwllbHNlCisJCXNlbGYtPmlvLmRtYSA9IGNoaXBfZG1hOworCit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2Nfc2V0dXBfcW9zKHNlbGYpCisgKgorICogICAgU2V0dXAgcW9zCisgKgorICovCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0dXBfcW9zKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCit7CisJLyogSW5pdGlhbGl6ZSBRb1MgZm9yIHRoaXMgZGV2aWNlICovCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc2VsZi0+cW9zKTsKKwkKKwlzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfAorCQlJUl8xMTUyMDB8SVJfNTc2MDAwfElSXzExNTIwMDB8KElSXzQwMDAwMDAgPDwgOCk7CisKKwlzZWxmLT5xb3MubWluX3R1cm5fdGltZS5iaXRzID0gU01TQ19JUkNDMl9NSU5fVFVSTl9USU1FOworCXNlbGYtPnFvcy53aW5kb3dfc2l6ZS5iaXRzID0gU01TQ19JUkNDMl9XSU5ET1dfU0laRTsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZzZWxmLT5xb3MpOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX2luaXRfY2hpcChzZWxmKQorICoKKyAqICAgIEluaXQgY2hpcAorICoKKyAqLworc3RhdGljIHZvaWQgc21zY19pcmNjX2luaXRfY2hpcChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2UsIGlyX21vZGUsIGN0cmwsIGZhc3Q7IAorCQorCUlSREFfQVNTRVJUKCBzZWxmICE9IE5VTEwsIHJldHVybjsgKTsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCWlyX21vZGUgPSBJUkNDX0NGR0FfSVJEQV9TSVJfQTsKKwljdHJsID0gMDsKKwlmYXN0ID0gMDsKKworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwlvdXRiKElSQ0NfTUFTVEVSX1JFU0VULCBpb2Jhc2UrSVJDQ19NQVNURVIpOworCW91dGIoMHgwMCwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKKworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAxKTsKKwlvdXRiKCgoaW5iKGlvYmFzZStJUkNDX1NDRV9DRkdBKSAmIDB4ODcpIHwgaXJfbW9kZSksIAorCSAgICAgaW9iYXNlK0lSQ0NfU0NFX0NGR0EpOworCisjaWZkZWYgc21zY182NjkgLyogVXNlcyBwaW4gODgvODkgZm9yIFJ4L1R4ICovCisJb3V0YigoKGluYihpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgJiAweDNmKSB8IElSQ0NfQ0ZHQl9NVVhfQ09NKSwgCisJICAgICBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisjZWxzZQkKKwlvdXRiKCgoaW5iKGlvYmFzZStJUkNDX1NDRV9DRkdCKSAmIDB4M2YpIHwgSVJDQ19DRkdCX01VWF9JUiksCisJICAgICBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisjZW5kaWYJCisJKHZvaWQpIGluYihpb2Jhc2UrSVJDQ19GSUZPX1RIUkVTSE9MRCk7CisJb3V0YihTTVNDX0lSQ0MyX0ZJRk9fVEhSRVNIT0xELCBpb2Jhc2UrSVJDQ19GSUZPX1RIUkVTSE9MRCk7CisJCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDQpOworCW91dGIoKGluYihpb2Jhc2UrSVJDQ19DT05UUk9MKSAmIDB4MzApIHwgY3RybCwgaW9iYXNlK0lSQ0NfQ09OVFJPTCk7CisJCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCW91dGIoZmFzdCwgaW9iYXNlK0lSQ0NfTENSX0EpOworCisJc21zY19pcmNjX3NldF9zaXJfc3BlZWQoc2VsZiwgU01TQ19JUkNDMl9DX0lSREFfRkFMTEJBQ0tfU1BFRUQpOworCQorCS8qIFBvd2VyIG9uIGRldmljZSAqLworCW91dGIoMHgwMCwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19uZXRfaW9jdGwgKGRldiwgcnEsIGNtZCkKKyAqCisgKiAgICBQcm9jZXNzIElPQ1RMIGNvbW1hbmRzIGZvciB0aGlzIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBzbXNjX2lyY2NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IGlmX2lyZGFfcmVxICppcnEgPSAoc3RydWN0IGlmX2lyZGFfcmVxICopIHJxOworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXNlbGYgPSBkZXYtPnByaXY7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLCBjbWQpOworCQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DU0JBTkRXSURUSDogLyogU2V0IGJhbmR3aWR0aCAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXQgPSAtRVBFUk07CisgICAgICAgICAgICAgICAgZWxzZSB7CisJCQkvKiBNYWtlIHN1cmUgd2UgYXJlIHRoZSBvbmx5IG9uZSB0b3VjaGluZworCQkJICogc2VsZi0+aW8uc3BlZWQgYW5kIHRoZSBoYXJkd2FyZSAtIEplYW4gSUkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCQlzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIGlycS0+aWZyX2JhdWRyYXRlKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNJT0NTTUVESUFCVVNZOiAvKiBTZXQgbWVkaWEgYnVzeSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koc2VsZi0+bmV0ZGV2LCBUUlVFKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DR1JFQ0VJVklORzogLyogQ2hlY2sgaWYgd2UgYXJlIHJlY2VpdmluZyByaWdodCBub3cgKi8KKwkJaXJxLT5pZnJfcmVjZWl2aW5nID0gc21zY19pcmNjX2lzX3JlY2VpdmluZyhzZWxmKTsKKwkJYnJlYWs7CisJI2lmIDAKKwljYXNlIFNJT0NTRFRSUlRTOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisJCXNtc2NfaXJjY19zaXJfc2V0X2R0cl9ydHMoZGV2LCBpcnEtPmlmcl9kdHIsIGlycS0+aWZyX3J0cyk7CisJCWJyZWFrOworCSNlbmRpZgorCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKwkKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNtc2NfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiA9IChzdHJ1Y3Qgc21zY19pcmNjX2NiICopIGRldi0+cHJpdjsKKwkKKwlyZXR1cm4gJnNlbGYtPnN0YXRzOworfQorCisjaWYgU01TQ19JUkNDMl9DX05FVF9USU1FT1VUCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCisgKgorICogICAgVGhlIG5ldHdvcmtpbmcgdGltZW91dCBtYW5hZ2VtZW50LgorICoKKyAqLworCitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJCisJSVJEQV9XQVJOSU5HKCIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBjaGFuZ2luZyBzcGVlZCB0bzogJWRcbiIsCisJCSAgICAgZGV2LT5uYW1lLCBzZWxmLT5pby5zcGVlZCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwlzbXNjX2lyY2Nfc2lyX3N0YXJ0KHNlbGYpOworCXNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+aW8uc3BlZWQpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7Cit9CisjZW5kaWYKKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19oYXJkX3htaXRfc2lyIChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorICoKKyAqICAgIFRyYW5zbWl0cyB0aGUgY3VycmVudCBmcmFtZSB1bnRpbCBGSUZPIGlzIGZ1bGwsIHRoZW4KKyAqICAgIHdhaXRzIHVudGlsIHRoZSBuZXh0IHRyYW5zbWl0IGludGVycnVwdCwgYW5kIGNvbnRpbnVlcyB1bnRpbCB0aGUKKyAqICAgIGZyYW1lIGlzIHRyYW5zbWl0dGVkLgorICovCitpbnQgc21zY19pcmNjX2hhcmRfeG1pdF9zaXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlvYmFzZTsKKwlzMzIgc3BlZWQ7CisKKwlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gMDspOworCQorCXNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyogTWFrZSBzdXJlIHRlc3Qgb2Ygc2VsZi0+aW8uc3BlZWQgJiBzcGVlZCBjaGFuZ2UgYXJlIGF0b21pYyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlpZiAoKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJCS8qIENoZWNrIGZvciBlbXB0eSBmcmFtZSAqLworCQlpZiAoIXNrYi0+bGVuKSB7CisJCQkvKgorCQkJICogV2Ugc2VuZCBmcmFtZXMgb25lIGJ5IG9uZSBpbiBTSVIgbW9kZSAobm8KKwkJCSAqIHBpcGVsaW5pbmcpLCBzbyBhdCB0aGlzIHBvaW50LCBpZiB3ZSB3ZXJlIHNlbmRpbmcKKwkJCSAqIGEgcHJldmlvdXMgZnJhbWUsIHdlIGp1c3QgcmVjZWl2ZWQgdGhlIGludGVycnVwdAorCQkJICogdGVsbGluZyB1cyBpdCBpcyBmaW5pc2hlZCAoVUFSVF9JSVJfVEhSSSkuCisJCQkgKiBUaGVyZWZvcmUsIHdhaXRpbmcgZm9yIHRoZSB0cmFuc21pdHRlciB0byByZWFsbHkKKwkJCSAqIGZpbmlzaCBkcmFpbmluZyB0aGUgZmlmbyB3b24ndCB0YWtlIHRvbyBsb25nLgorCQkJICogQW5kIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcyBub3QgZXhwZWN0ZWQgdG8gcnVuLgorCQkJICogLSBKZWFuIElJICovCisJCQlzbXNjX2lyY2Nfc2lyX3dhaXRfaHdfdHJhbnNtaXR0ZXJfZmluaXNoKHNlbGYpOworCQkJc21zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzcGVlZCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOworCQl9CisJfQorCisJLyogSW5pdCB0eCBidWZmZXIgKi8KKwlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisKKwkvKiBDb3B5IHNrYiB0byB0eF9idWZmIHdoaWxlIHdyYXBwaW5nLCBzdHVmZmluZyBhbmQgbWFraW5nIENSQyAqLworCXNlbGYtPnR4X2J1ZmYubGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCBzZWxmLT50eF9idWZmLmRhdGEsIAorCQkJCQkgICBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKKwkKKwlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKKworCS8qIFR1cm4gb24gdHJhbnNtaXQgZmluaXNoZWQgaW50ZXJydXB0LiBXaWxsIGZpcmUgaW1tZWRpYXRlbHkhICAqLworCW91dGIoVUFSVF9JRVJfVEhSSSwgaW9iYXNlK1VBUlRfSUVSKTsgCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2Nfc2V0X2Zpcl9zcGVlZCAoc2VsZiwgYmF1ZCkKKyAqCisgKiAgICBDaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfZmlyX3NwZWVkKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIHUzMiBzcGVlZCkKK3sKKwlpbnQgZmlyX2Jhc2UsIGlyX21vZGUsIGN0cmwsIGZhc3Q7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCWZpcl9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwlzZWxmLT5pby5zcGVlZCA9IHNwZWVkOworCisJc3dpdGNoKHNwZWVkKSB7CisJZGVmYXVsdDoKKwljYXNlIDU3NjAwMDoJCQorCQlpcl9tb2RlID0gSVJDQ19DRkdBX0lSREFfSERMQzsKKwkJY3RybCA9IElSQ0NfQ1JDOworCQlmYXN0ID0gMDsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgaGFuZGxpbmcgYmF1ZCBvZiA1NzYwMDBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCWNhc2UgMTE1MjAwMDoKKwkJaXJfbW9kZSA9IElSQ0NfQ0ZHQV9JUkRBX0hETEM7CisJCWN0cmwgPSBJUkNDXzExNTIgfCBJUkNDX0NSQzsKKwkJZmFzdCA9IElSQ0NfTENSX0FfRkFTVCB8IElSQ0NfTENSX0FfR1BfREFUQTsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgaGFuZGxpbmcgYmF1ZCBvZiAxMTUyMDAwXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJY2FzZSA0MDAwMDAwOgorCQlpcl9tb2RlID0gSVJDQ19DRkdBX0lSREFfNFBQTTsKKwkJY3RybCA9IElSQ0NfQ1JDOworCQlmYXN0ID0gSVJDQ19MQ1JfQV9GQVNUOworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBoYW5kbGluZyBiYXVkIG9mIDQwMDAwMDBcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlicmVhazsKKwl9CisJI2lmIDAKKwlOb3cgaW4gdHJhbmNlaXZlciEKKwkvKiBUaGlzIGNhdXNlcyBhbiBpbnRlcnJ1cHQgKi8KKwlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAwKTsKKwlvdXRiKChpbmIoZmlyX2Jhc2UrSVJDQ19MQ1JfQSkgJiAgMHhiZikgfCBmYXN0LCBmaXJfYmFzZStJUkNDX0xDUl9BKTsKKwkjZW5kaWYKKwkKKwlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAxKTsKKwlvdXRiKCgoaW5iKGZpcl9iYXNlK0lSQ0NfU0NFX0NGR0EpICYgSVJDQ19TQ0VfQ0ZHQV9CTE9DS19DVFJMX0JJVFNfTUFTSykgfCBpcl9tb2RlKSwgZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQSk7CisJCisJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgNCk7CisJb3V0YigoaW5iKGZpcl9iYXNlK0lSQ0NfQ09OVFJPTCkgJiAweDMwKSB8IGN0cmwsIGZpcl9iYXNlK0lSQ0NfQ09OVFJPTCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfZmlyX3N0YXJ0KHNlbGYpCisgKgorICogICAgQ2hhbmdlIHRoZSBzcGVlZCBvZiB0aGUgZGV2aWNlCisgKgorICovCitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfZmlyX3N0YXJ0KHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZmlyX2Jhc2U7CisKKwlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJZGV2ID0gc2VsZi0+bmV0ZGV2OworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm47KTsKKworCWZpcl9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBSZXNldCBldmVyeXRoaW5nICovCisKKwkvKiBJbnN0YWxsIEZJUiB0cmFuc21pdCBoYW5kbGVyICovCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzbXNjX2lyY2NfaGFyZF94bWl0X2ZpcjsJCisKKwkvKiBDbGVhciBGSUZPICovCisJb3V0YihpbmIoZmlyX2Jhc2UrSVJDQ19MQ1JfQSl8SVJDQ19MQ1JfQV9GSUZPX1JFU0VULCBmaXJfYmFzZStJUkNDX0xDUl9BKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8KKwkvKm91dGIoSVJDQ19JRVJfQUNUSVZFX0ZSQU1FfElSQ0NfSUVSX0VPTSwgZmlyX2Jhc2UrSVJDQ19JRVIpOyovCisKKwlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAxKTsKKworCS8qIFNlbGVjdCB0aGUgVFgvUlggaW50ZXJmYWNlICovCQorI2lmZGVmIFNNU0NfNjY5IC8qIFVzZXMgcGluIDg4Lzg5IGZvciBSeC9UeCAqLworCW91dGIoKChpbmIoZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgJiAweDNmKSB8IElSQ0NfQ0ZHQl9NVVhfQ09NKSwgCisJICAgICBmaXJfYmFzZStJUkNDX1NDRV9DRkdCKTsKKyNlbHNlCQorCW91dGIoKChpbmIoZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgJiAweDNmKSB8IElSQ0NfQ0ZHQl9NVVhfSVIpLAorCSAgICAgZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisjZW5kaWYJCisJKHZvaWQpIGluYihmaXJfYmFzZStJUkNDX0ZJRk9fVEhSRVNIT0xEKTsKKworCS8qIEVuYWJsZSBTQ0UgaW50ZXJydXB0cyAqLworCW91dGIoMCwgZmlyX2Jhc2UrSVJDQ19NQVNURVIpOworCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDApOworCW91dGIoSVJDQ19JRVJfQUNUSVZFX0ZSQU1FfElSQ0NfSUVSX0VPTSwgZmlyX2Jhc2UrSVJDQ19JRVIpOworCW91dGIoSVJDQ19NQVNURVJfSU5UX0VOLCBmaXJfYmFzZStJUkNDX01BU1RFUik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfZmlyX3N0b3Aoc2VsZiwgYmF1ZCkKKyAqCisgKiAgICBDaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19maXJfc3RvcChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQoreworCWludCBmaXJfYmFzZTsKKworCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlmaXJfYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDApOworCS8qb3V0YihJUkNDX01BU1RFUl9SRVNFVCwgZmlyX2Jhc2UrSVJDQ19NQVNURVIpOyovCQorCW91dGIoaW5iKGZpcl9iYXNlK0lSQ0NfTENSX0IpICYgSVJDQ19MQ1JfQl9TSVBfRU5BQkxFLCBmaXJfYmFzZStJUkNDX0xDUl9CKTsKK30KKworCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBiYXVkKQorICoKKyAqICAgIENoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gKm11c3QqIGJlIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQsIGJlY2F1c2UgaXQgbWF5CisgKiBiZSBjYWxsZWQgZnJvbSB0aGUgaXJxIGhhbmRsZXIuIC0gSmVhbiBJSQorICovCitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHZvaWQgKnByaXYsIHUzMiBzcGVlZCkKK3sKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgcHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpb2Jhc2U7CisJaW50IGxhc3Rfc3BlZWRfd2FzX3NpcjsKKwkKKwlJUkRBX0RFQlVHKDAsICIlcygpIGNoYW5naW5nIHNwZWVkIHRvOiAlZFxuIiwgX19GVU5DVElPTl9fLCBzcGVlZCk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCWRldiA9IHNlbGYtPm5ldGRldjsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCWxhc3Rfc3BlZWRfd2FzX3NpciA9IHNlbGYtPmlvLnNwZWVkIDw9IFNNU0NfSVJDQzJfTUFYX1NJUl9TUEVFRDsKKworCSNpZiAwCisJLyogVGVtcCBIYWNrICovCisJc3BlZWQ9IDExNTIwMDA7CisJc2VsZi0+aW8uc3BlZWQgPSBzcGVlZDsKKwlsYXN0X3NwZWVkX3dhc19zaXIgPSAwOworCXNtc2NfaXJjY19maXJfc3RhcnQoc2VsZik7CQorCSNlbmRpZgorCQorCWlmKHNlbGYtPmlvLnNwZWVkID09IDApCisJCXNtc2NfaXJjY19zaXJfc3RhcnQoc2VsZik7CisKKwkjaWYgMAorCWlmKCFsYXN0X3NwZWVkX3dhc19zaXIpIHNwZWVkID0gc2VsZi0+aW8uc3BlZWQ7CisJI2VuZGlmCisKKwlpZihzZWxmLT5pby5zcGVlZCAhPSBzcGVlZCkgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9mb3Jfc3BlZWQoc2VsZiwgc3BlZWQpOworCisJc2VsZi0+aW8uc3BlZWQgPSBzcGVlZDsKKwkKKwlpZihzcGVlZCA8PSBTTVNDX0lSQ0MyX01BWF9TSVJfU1BFRUQpIHsKKwkJaWYoIWxhc3Rfc3BlZWRfd2FzX3NpcikgeworCQkJc21zY19pcmNjX2Zpcl9zdG9wKHNlbGYpOworCQkJc21zY19pcmNjX3Npcl9zdGFydChzZWxmKTsKKwkJfQorCQlzbXNjX2lyY2Nfc2V0X3Npcl9zcGVlZChzZWxmLCBzcGVlZCk7IAorCX0KKwllbHNlIHsKKwkJaWYobGFzdF9zcGVlZF93YXNfc2lyKSB7CisJCQkjaWYgU01TQ19JUkNDMl9DX1NJUl9TVE9QCQkKKwkJCXNtc2NfaXJjY19zaXJfc3RvcChzZWxmKTsKKwkJCSNlbmRpZgorCQkJc21zY19pcmNjX2Zpcl9zdGFydChzZWxmKTsKKwkJfQorCQlzbXNjX2lyY2Nfc2V0X2Zpcl9zcGVlZChzZWxmLCBzcGVlZCk7CisKKwkJI2lmIDAKKwkJc2VsZi0+dHhfYnVmZi5sZW4gPSAxMDsKKwkJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCQkKKwkJc21zY19pcmNjX2RtYV94bWl0KHNlbGYsIGlvYmFzZSwgNDAwMCk7CisJCSNlbmRpZgorCQkvKiBCZSByZWFkeSBmb3IgaW5jb21pbmcgZnJhbWVzICovCisJCXNtc2NfaXJjY19kbWFfcmVjZWl2ZShzZWxmLCBpb2Jhc2UpOworCX0KKwkKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2Nfc2V0X3Npcl9zcGVlZCAoc2VsZiwgc3BlZWQpCisgKgorICogICAgU2V0IHNwZWVkIG9mIElyREEgcG9ydCB0byBzcGVjaWZpZWQgYmF1ZHJhdGUKKyAqCisgKi8KK3ZvaWQgc21zY19pcmNjX3NldF9zaXJfc3BlZWQodm9pZCAqcHJpdiwgX191MzIgc3BlZWQpCit7CisJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiA9IChzdHJ1Y3Qgc21zY19pcmNjX2NiICopIHByaXY7CisJaW50IGlvYmFzZTsgCisJaW50IGZjcjsgICAgLyogRklGTyBjb250cm9sIHJlZyAqLworCWludCBsY3I7ICAgIC8qIExpbmUgY29udHJvbCByZWcgKi8KKwlpbnQgZGl2aXNvcjsKKworCUlSREFfREVCVUcoMCwgIiVzKCksIFNldHRpbmcgc3BlZWQgdG86ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHNwZWVkKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisJCisJLyogVXBkYXRlIGFjY291bnRpbmcgZm9yIG5ldyBzcGVlZCAqLworCXNlbGYtPmlvLnNwZWVkID0gc3BlZWQ7CisKKwkvKiBUdXJuIG9mZiBpbnRlcnJ1cHRzICovCisJb3V0YigwLCBpb2Jhc2UrVUFSVF9JRVIpOyAKKworCWRpdmlzb3IgPSBTTVNDX0lSQ0MyX01BWF9TSVJfU1BFRUQvc3BlZWQ7CisJCisJZmNyID0gVUFSVF9GQ1JfRU5BQkxFX0ZJRk87CisKKwkvKiAKKwkgKiBVc2UgdHJpZ2dlciBsZXZlbCAxIHRvIGF2b2lkIDMgbXMuIHRpbWVvdXQgZGVsYXkgYXQgOTYwMCBicHMsIGFuZAorCSAqIGFsbW9zdCAxLDcgbXMgYXQgMTkyMDAgYnBzLiBBdCBzcGVlZHMgYWJvdmUgdGhhdCB3ZSBjYW4ganVzdCBmb3JnZXQKKwkgKiBhYm91dCB0aGlzIHRpbWVvdXQgc2luY2UgaXQgd2lsbCBhbHdheXMgYmUgZmFzdCBlbm91Z2guIAorCSAqLworCWlmIChzZWxmLT5pby5zcGVlZCA8IDM4NDAwKQorCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xOworCWVsc2UgCisJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzE0OworICAgICAgICAKKwkvKiBJckRBIHBvcnRzIHVzZSA4TjEgKi8KKwlsY3IgPSBVQVJUX0xDUl9XTEVOODsKKwkKKwlvdXRiKFVBUlRfTENSX0RMQUIgfCBsY3IsIGlvYmFzZStVQVJUX0xDUik7IC8qIFNldCBETEFCICovCisJb3V0YihkaXZpc29yICYgMHhmZiwgICAgICBpb2Jhc2UrVUFSVF9ETEwpOyAvKiBTZXQgc3BlZWQgKi8KKwlvdXRiKGRpdmlzb3IgPj4gOCwJICBpb2Jhc2UrVUFSVF9ETE0pOworCW91dGIobGNyLAkJICBpb2Jhc2UrVUFSVF9MQ1IpOyAvKiBTZXQgOE4xCSovCisJb3V0YihmY3IsCQkgIGlvYmFzZStVQVJUX0ZDUik7IC8qIEVuYWJsZSBGSUZPJ3MgKi8KKworCS8qIFR1cm4gb24gaW50ZXJydXBzICovCisJb3V0YihVQVJUX0lFUl9STFNJfFVBUlRfSUVSX1JESXxVQVJUX0lFUl9USFJJLCBpb2Jhc2UrVUFSVF9JRVIpOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSBzcGVlZCBjaGFuZ2VkIHRvOiAlZFxuIiwgX19GVU5DVElPTl9fLCBzcGVlZCk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19oYXJkX3htaXRfZmlyIChza2IsIGRldikKKyAqCisgKiAgICBUcmFuc21pdCB0aGUgZnJhbWUhCisgKgorICovCitzdGF0aWMgaW50IHNtc2NfaXJjY19oYXJkX3htaXRfZmlyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXMzMiBzcGVlZDsKKwlpbnQgaW9iYXNlOworCWludCBtdHQ7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwlzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogTWFrZSBzdXJlIHRlc3Qgb2Ygc2VsZi0+aW8uc3BlZWQgJiBzcGVlZCBjaGFuZ2UgYXJlIGF0b21pYyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgYWZ0ZXIgdGhpcyBmcmFtZSAqLworCXNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCWlmICgoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQpICYmIChzcGVlZCAhPSAtMSkpIHsKKwkJLyogQ2hlY2sgZm9yIGVtcHR5IGZyYW1lICovCisJCWlmICghc2tiLT5sZW4pIHsKKwkJCS8qIE5vdGUgOiB5b3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHNwZWVkIGNoYW5nZXMKKwkJCSAqIGFyZSBub3QgZ29pbmcgdG8gY29ycnVwdCBhbnkgb3V0Z29pbmcgZnJhbWUuCisJCQkgKiBMb29rIGF0IG5zYy1pcmNjIGZvciB0aGUgZ29yeSBkZXRhaWxzIC0gSmVhbiBJSSAqLworCQkJc21zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzcGVlZCk7IAorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJfQorCQorCW1lbWNweShzZWxmLT50eF9idWZmLmhlYWQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJc2VsZi0+dHhfYnVmZi5sZW4gPSBza2ItPmxlbjsKKwlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisJCisJbXR0ID0gaXJkYV9nZXRfbXR0KHNrYik7CQorCWlmIChtdHQpIHsKKwkJaW50IGJvZnM7CisKKwkJLyogCisJCSAqIENvbXB1dGUgaG93IG1hbnkgQk9GcyAoU1RBIG9yIFBBJ3MpIHdlIG5lZWQgdG8gd2FzdGUgdGhlCisJCSAqIG1pbiB0dXJuIHRpbWUgZ2l2ZW4gdGhlIHNwZWVkIG9mIHRoZSBsaW5rLgorCQkgKi8KKwkJYm9mcyA9IG10dCAqIChzZWxmLT5pby5zcGVlZCAvIDEwMDApIC8gODAwMDsKKwkJaWYgKGJvZnMgPiA0MDk1KQorCQkJYm9mcyA9IDQwOTU7CisKKwkJc21zY19pcmNjX2RtYV94bWl0KHNlbGYsIGlvYmFzZSwgYm9mcyk7CisJfSBlbHNlIHsKKwkJLyogVHJhbnNtaXQgZnJhbWUgKi8KKwkJc21zY19pcmNjX2RtYV94bWl0KHNlbGYsIGlvYmFzZSwgMCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19kbWFfeG1pdCAoc2VsZiwgaW9iYXNlKQorICoKKyAqICAgIFRyYW5zbWl0IGRhdGEgdXNpbmcgRE1BCisgKgorICovCitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfZG1hX3htaXQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSwgaW50IGJvZnMpCit7CisJdTggY3RybDsKKworCUlSREFfREVCVUcoMywgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworI2lmIDEKKwkvKiBEaXNhYmxlIFJ4ICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCW91dGIoMHgwMCwgaW9iYXNlK0lSQ0NfTENSX0IpOworI2VuZGlmCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDEpOworCW91dGIoaW5iKGlvYmFzZStJUkNDX1NDRV9DRkdCKSAmIH5JUkNDX0NGR0JfRE1BX0VOQUJMRSwgCisJICAgICBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisKKwlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19YTUlUOworCisJLyogU2V0IEJPRiBhZGRpdGlvbmFsIGNvdW50IGZvciBnZW5lcmF0aW5nIHRoZSBtaW4gdHVybiB0aW1lICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDQpOworCW91dGIoYm9mcyAmIDB4ZmYsIGlvYmFzZStJUkNDX0JPRl9DT1VOVF9MTyk7CisJY3RybCA9IGluYihpb2Jhc2UrSVJDQ19DT05UUk9MKSAmIDB4ZjA7CisJb3V0YihjdHJsIHwgKChib2ZzID4+IDgpICYgMHgwZiksIGlvYmFzZStJUkNDX0JPRl9DT1VOVF9ISSk7CisKKwkvKiBTZXQgbWF4IFR4IGZyYW1lIHNpemUgKi8KKwlvdXRiKHNlbGYtPnR4X2J1ZmYubGVuID4+IDgsIGlvYmFzZStJUkNDX1RYX1NJWkVfSEkpOworCW91dGIoc2VsZi0+dHhfYnVmZi5sZW4gJiAweGZmLCBpb2Jhc2UrSVJDQ19UWF9TSVpFX0xPKTsKKworCS8qb3V0YihVQVJUX01DUl9PVVQyLCBzZWxmLT5pby5zaXJfYmFzZSArIFVBUlRfTUNSKTsqLworCQorCS8qIEVuYWJsZSBidXJzdCBtb2RlIGNoaXAgVHggRE1BICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDEpOworCW91dGIoaW5iKGlvYmFzZStJUkNDX1NDRV9DRkdCKSB8IElSQ0NfQ0ZHQl9ETUFfRU5BQkxFIHwKKwkgICAgIElSQ0NfQ0ZHQl9ETUFfQlVSU1QsIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKKworCS8qIFNldHVwIERNQSBjb250cm9sbGVyIChtdXN0IGJlIGRvbmUgYWZ0ZXIgZW5hYmxpbmcgY2hpcCBETUEpICovCisJaXJkYV9zZXR1cF9kbWEoc2VsZi0+aW8uZG1hLCBzZWxmLT50eF9idWZmX2RtYSwgc2VsZi0+dHhfYnVmZi5sZW4sCisJCSAgICAgICBETUFfVFhfTU9ERSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0ICovCisKKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJb3V0YihJUkNDX0lFUl9BQ1RJVkVfRlJBTUUgfCBJUkNDX0lFUl9FT00sIGlvYmFzZStJUkNDX0lFUik7CisJb3V0YihJUkNDX01BU1RFUl9JTlRfRU4sIGlvYmFzZStJUkNDX01BU1RFUik7CisJCisJLyogRW5hYmxlIHRyYW5zbWl0ICovCisJb3V0YihJUkNDX0xDUl9CX1NDRV9UUkFOU01JVCB8IElSQ0NfTENSX0JfU0lQX0VOQUJMRSwgaW9iYXNlK0lSQ0NfTENSX0IpOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX2RtYV94bWl0X2NvbXBsZXRlIChzZWxmKQorICoKKyAqICAgIFRoZSB0cmFuc2ZlciBvZiBhIGZyYW1lIGluIGZpbmlzaGVkLiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgCisgKiAgICBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfeG1pdF9jb21wbGV0ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKQoreworCUlSREFfREVCVUcoMywgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworI2lmIDAKKwkvKiBEaXNhYmxlIFR4ICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCW91dGIoMHgwMCwgaW9iYXNlK0lSQ0NfTENSX0IpOworI2VuZGlmCisJcmVnaXN0ZXJfYmFuayhzZWxmLT5pby5maXJfYmFzZSwgMSk7CisJb3V0YihpbmIoc2VsZi0+aW8uZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgJiB+SVJDQ19DRkdCX0RNQV9FTkFCTEUsCisJICAgICBzZWxmLT5pby5maXJfYmFzZStJUkNDX1NDRV9DRkdCKTsKKworCS8qIENoZWNrIGZvciB1bmRlcnJ1biEgKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJaWYgKGluYihpb2Jhc2UrSVJDQ19MU1IpICYgSVJDQ19MU1JfVU5ERVJSVU4pIHsKKwkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7CisJCXNlbGYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisKKwkJLyogUmVzZXQgZXJyb3IgY29uZGl0aW9uICovCisJCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwkJb3V0YihJUkNDX01BU1RFUl9FUlJPUl9SRVNFVCwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKKwkJb3V0YigweDAwLCBpb2Jhc2UrSVJDQ19NQVNURVIpOworCX0gZWxzZSB7CisJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gIHNlbGYtPnR4X2J1ZmYubGVuOworCX0KKworCS8qIENoZWNrIGlmIGl0J3MgdGltZSB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJaWYgKHNlbGYtPm5ld19zcGVlZCkgeworCQlzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNlbGYtPm5ld19zcGVlZCk7CQkKKwkJc2VsZi0+bmV3X3NwZWVkID0gMDsKKwl9CisKKwluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfZG1hX3JlY2VpdmUoc2VsZikKKyAqCisgKiAgICBHZXQgcmVhZHkgZm9yIHJlY2VpdmluZyBhIGZyYW1lLiBUaGUgZGV2aWNlIHdpbGwgaW5pdGlhdGUgYSBETUEKKyAqICAgIGlmIGl0IHN0YXJ0cyB0byByZWNlaXZlIGEgZnJhbWUuCisgKgorICovCitzdGF0aWMgaW50IHNtc2NfaXJjY19kbWFfcmVjZWl2ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKSAKK3sKKyNpZiAwCisJLyogVHVybiBvZmYgY2hpcCBETUEgKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMSk7CisJb3V0YihpbmIoaW9iYXNlK0lSQ0NfU0NFX0NGR0IpICYgfklSQ0NfQ0ZHQl9ETUFfRU5BQkxFLCAKKwkgICAgIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKKyNlbmRpZgorCQorCS8qIERpc2FibGUgVHggKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJb3V0YigweDAwLCBpb2Jhc2UrSVJDQ19MQ1JfQik7CisKKwkvKiBUdXJuIG9mZiBjaGlwIERNQSAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAxKTsKKwlvdXRiKGluYihpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgJiB+SVJDQ19DRkdCX0RNQV9FTkFCTEUsIAorCSAgICAgaW9iYXNlK0lSQ0NfU0NFX0NGR0IpOworCisJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fUkVDVjsKKwlzZWxmLT5yeF9idWZmLmRhdGEgPSBzZWxmLT5yeF9idWZmLmhlYWQ7CisKKwkvKiBTZXQgbWF4IFJ4IGZyYW1lIHNpemUgKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgNCk7CisJb3V0YigoMjA1MCA+PiA4KSAmIDB4MGYsIGlvYmFzZStJUkNDX1JYX1NJWkVfSEkpOworCW91dGIoMjA1MCAmIDB4ZmYsIGlvYmFzZStJUkNDX1JYX1NJWkVfTE8pOworCisJLyogU2V0dXAgRE1BIGNvbnRyb2xsZXIgKi8KKwlpcmRhX3NldHVwX2RtYShzZWxmLT5pby5kbWEsIHNlbGYtPnJ4X2J1ZmZfZG1hLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkgICAgICAgRE1BX1JYX01PREUpOworCisJLyogRW5hYmxlIGJ1cnN0IG1vZGUgY2hpcCBSeCBETUEgKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMSk7CisJb3V0YihpbmIoaW9iYXNlK0lSQ0NfU0NFX0NGR0IpIHwgSVJDQ19DRkdCX0RNQV9FTkFCTEUgfCAKKwkgICAgIElSQ0NfQ0ZHQl9ETUFfQlVSU1QsIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJb3V0YihJUkNDX0lFUl9BQ1RJVkVfRlJBTUUgfCBJUkNDX0lFUl9FT00sIGlvYmFzZStJUkNDX0lFUik7CisJb3V0YihJUkNDX01BU1RFUl9JTlRfRU4sIGlvYmFzZStJUkNDX01BU1RFUik7CisKKworCS8qIEVuYWJsZSByZWNlaXZlciAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwlvdXRiKElSQ0NfTENSX0JfU0NFX1JFQ0VJVkUgfCBJUkNDX0xDUl9CX1NJUF9FTkFCTEUsIAorCSAgICAgaW9iYXNlK0lSQ0NfTENSX0IpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHNlbGYsIGlvYmFzZSkKKyAqCisgKiAgICBGaW5pc2hlZCB3aXRoIHJlY2VpdmluZyBmcmFtZXMKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGxlbiwgbXNnY250LCBsc3I7CisJCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCQorCUlSREFfREVCVUcoMywgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworI2lmIDAKKwkvKiBEaXNhYmxlIFJ4ICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCW91dGIoMHgwMCwgaW9iYXNlK0lSQ0NfTENSX0IpOworI2VuZGlmCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCW91dGIoaW5iKGlvYmFzZStJUkNDX0xTQVIpICYgfklSQ0NfTFNBUl9BRERSRVNTX01BU0ssIGlvYmFzZStJUkNDX0xTQVIpOworCWxzcj0gaW5iKGlvYmFzZStJUkNDX0xTUik7CisJbXNnY250ID0gaW5iKGlvYmFzZStJUkNDX0xDUl9CKSAmIDB4MDg7CisKKwlJUkRBX0RFQlVHKDIsICIlczogZG1hIGNvdW50ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgZ2V0X2RtYV9yZXNpZHVlKHNlbGYtPmlvLmRtYSkpOworCisJbGVuID0gc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSAtIGdldF9kbWFfcmVzaWR1ZShzZWxmLT5pby5kbWEpOworCisJLyogTG9vayBmb3IgZXJyb3JzIAorCSAqLwkKKworCWlmKGxzciAmIChJUkNDX0xTUl9GUkFNRV9FUlJPUiB8IElSQ0NfTFNSX0NSQ19FUlJPUiB8IElSQ0NfTFNSX1NJWkVfRVJST1IpKSB7CisJCXNlbGYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlpZihsc3IgJiBJUkNDX0xTUl9GUkFNRV9FUlJPUikgc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCWlmKGxzciAmIElSQ0NfTFNSX0NSQ19FUlJPUikgc2VsZi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQlpZihsc3IgJiBJUkNDX0xTUl9TSVpFX0VSUk9SKSBzZWxmLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWlmKGxzciAmIChJUkNDX0xTUl9VTkRFUlJVTiB8IElSQ0NfTFNSX09WRVJSVU4pKSBzZWxmLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCXJldHVybjsKKwl9CisJLyogUmVtb3ZlIENSQyAqLworCWlmIChzZWxmLT5pby5zcGVlZCA8IDQwMDAwMDApCisJCWxlbiAtPSAyOworCWVsc2UKKwkJbGVuIC09IDQ7CisKKwlpZiAoKGxlbiA8IDIpIHx8IChsZW4gPiAyMDUwKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIGJvZ3VzIGxlbj0lZFxuIiwgX19GVU5DVElPTl9fLCBsZW4pOworCQlyZXR1cm47CisJfQorCUlSREFfREVCVUcoMiwgIiVzOiBtc2djbnQgPSAlZCwgbGVuPSVkXG4iLCBfX0ZVTkNUSU9OX18sIG1zZ2NudCwgbGVuKTsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKzEpOworCWlmICghc2tiKSAgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBmcmFtZS5cbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CQkJCisJLyogTWFrZSBzdXJlIElQIGhlYWRlciBnZXRzIGFsaWduZWQgKi8KKwlza2JfcmVzZXJ2ZShza2IsIDEpOyAKKworCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4pOworCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisKKwlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKKwlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwluZXRpZl9yeChza2IpOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3Npcl9yZWNlaXZlIChzZWxmKQorICoKKyAqICAgIFJlY2VpdmUgb25lIGZyYW1lIGZyb20gdGhlIGluZnJhcmVkIHBvcnQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zaXJfcmVjZWl2ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKSAKK3sKKwlpbnQgYm9ndXNjb3VudCA9IDA7CisJaW50IGlvYmFzZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCS8qICAKKwkgKiBSZWNlaXZlIGFsbCBjaGFyYWN0ZXJzIGluIFJ4IEZJRk8sIHVud3JhcCBhbmQgdW5zdHVmZiB0aGVtLiAKKyAgICAgICAgICogYXN5bmNfdW53cmFwX2NoYXIgd2lsbCBkZWxpdmVyIGFsbCBmb3VuZCBmcmFtZXMgIAorCSAqLworCWRvIHsKKwkJYXN5bmNfdW53cmFwX2NoYXIoc2VsZi0+bmV0ZGV2LCAmc2VsZi0+c3RhdHMsICZzZWxmLT5yeF9idWZmLCAKKwkJCQkgIGluYihpb2Jhc2UrVUFSVF9SWCkpOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBzdGF5IGhlcmUgdG8gbG9uZyAqLworCQlpZiAoYm9ndXNjb3VudCsrID4gMzIpIHsKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIGJyZWFraW5nIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoaW5iKGlvYmFzZStVQVJUX0xTUikgJiBVQVJUX0xTUl9EUik7CQorfQorCisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfaW50ZXJydXB0IChpcnEsIGRldl9pZCwgcmVncykKKyAqCisgKiAgICBBbiBpbnRlcnJ1cHQgZnJvbSB0aGUgY2hpcCBoYXMgYXJyaXZlZC4gVGltZSB0byBkbyBzb21lIHdvcmsKKyAqCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzbXNjX2lyY2NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZjsKKwlpbnQgaW9iYXNlLCBpaXIsIGxjcmEsIGxzcjsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIAorCQkgICAgICAgZHJpdmVyX25hbWUsIGlycSk7CisJCWdvdG8gaXJxX3JldDsKKwl9CisJc2VsZiA9IChzdHJ1Y3Qgc21zY19pcmNjX2NiICopIGRldi0+cHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiBJUlFfTk9ORTspOworCisJLyogU2VyaWFsaXNlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpbiB2YXJpb3VzIENQVXMsIHN0b3AgVHggcGF0aCAqLworCXNwaW5fbG9jaygmc2VsZi0+bG9jayk7CQorCisJLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIHVzZSB0aGUgU0lSIGludGVycnVwdCBoYW5kbGVyICovCisJaWYgKHNlbGYtPmlvLnNwZWVkIDw9ICBTTVNDX0lSQ0MyX01BWF9TSVJfU1BFRUQpIHsKKwkJcmV0ID0gc21zY19pcmNjX2ludGVycnVwdF9zaXIoZGV2KTsKKwkJZ290byBpcnFfcmV0X3VubG9jazsKKwl9CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwlpaXIgPSBpbmIoaW9iYXNlK0lSQ0NfSUlSKTsKKwlpZiAoaWlyID09IDApIAorCQlnb3RvIGlycV9yZXRfdW5sb2NrOworCXJldCA9IElSUV9IQU5ETEVEOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJb3V0YigwLCBpb2Jhc2UrSVJDQ19JRVIpOworCWxjcmEgPSBpbmIoaW9iYXNlK0lSQ0NfTENSX0EpOworCWxzciA9IGluYihpb2Jhc2UrSVJDQ19MU1IpOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIGlpciA9IDB4JTAyeFxuIiwgX19GVU5DVElPTl9fLCBpaXIpOworCisJaWYgKGlpciAmIElSQ0NfSUlSX0VPTSkgeworCQlpZiAoc2VsZi0+aW8uZGlyZWN0aW9uID09IElPX1JFQ1YpCisJCQlzbXNjX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZiwgaW9iYXNlKTsKKwkJZWxzZQorCQkJc21zY19pcmNjX2RtYV94bWl0X2NvbXBsZXRlKHNlbGYsIGlvYmFzZSk7CisJCQorCQlzbXNjX2lyY2NfZG1hX3JlY2VpdmUoc2VsZiwgaW9iYXNlKTsKKwl9CisKKwlpZiAoaWlyICYgSVJDQ19JSVJfQUNUSVZFX0ZSQU1FKSB7CisJCS8qcHJpbnRrKEtFUk5fV0FSTklORyAiJXMoKTogQWN0aXZlIEZyYW1lXG4iLCBfX0ZVTkNUSU9OX18pOyovCisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYWdhaW4gKi8KKworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwlvdXRiKElSQ0NfSUVSX0FDVElWRV9GUkFNRXxJUkNDX0lFUl9FT00sIGlvYmFzZStJUkNDX0lFUik7CisKKyBpcnFfcmV0X3VubG9jazoKKwlzcGluX3VubG9jaygmc2VsZi0+bG9jayk7CisgaXJxX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X2ludGVycnVwdF9zaXIgKGlycSwgZGV2X2lkLCByZWdzKQorICoKKyAqICAgIEludGVycnVwdCBoYW5kbGVyIGZvciBTSVIgbW9kZXMKKyAqLworc3RhdGljIGlycXJldHVybl90IHNtc2NfaXJjY19pbnRlcnJ1cHRfc2lyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiA9IGRldi0+cHJpdjsKKwlpbnQgYm9ndXNjb3VudCA9IDA7CisJaW50IGlvYmFzZTsKKwlpbnQgaWlyLCBsc3I7CisKKwkvKiBBbHJlYWR5IGxvY2tlZCBjb21taW5nIGhlcmUgaW4gc21zY19pcmNjX2ludGVycnVwdCgpICovCisJLypzcGluX2xvY2soJnNlbGYtPmxvY2spOyovCisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCWlpciA9IGluYihpb2Jhc2UrVUFSVF9JSVIpICYgVUFSVF9JSVJfSUQ7CisJaWYgKGlpciA9PSAwKQorCQlyZXR1cm4gSVJRX05PTkU7CisJd2hpbGUgKGlpcikgeworCQkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKwkJbHNyID0gaW5iKGlvYmFzZStVQVJUX0xTUik7CisKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgaWlyPSUwMngsIGxzcj0lMDJ4LCBpb2Jhc2U9JSN4XG4iLCAKKwkJCSAgICBfX0ZVTkNUSU9OX18sIGlpciwgbHNyLCBpb2Jhc2UpOworCisJCXN3aXRjaCAoaWlyKSB7CisJCWNhc2UgVUFSVF9JSVJfUkxTSToKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIFJMU0lcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlicmVhazsKKwkJY2FzZSBVQVJUX0lJUl9SREk6CisJCQkvKiBSZWNlaXZlIGludGVycnVwdCAqLworCQkJc21zY19pcmNjX3Npcl9yZWNlaXZlKHNlbGYpOworCQkJYnJlYWs7CisJCWNhc2UgVUFSVF9JSVJfVEhSSToKKwkJCWlmIChsc3IgJiBVQVJUX0xTUl9USFJFKQorCQkJCS8qIFRyYW5zbWl0dGVyIHJlYWR5IGZvciBkYXRhICovCisJCQkJc21zY19pcmNjX3Npcl93cml0ZV93YWtldXAoc2VsZik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIHVuaGFuZGxlZCBJSVI9JSN4XG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXywgaWlyKTsKKwkJCWJyZWFrOworCQl9IAorCQkKKwkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHN0YXkgaGVyZSB0byBsb25nICovCisJCWlmIChib2d1c2NvdW50KysgPiAxMDApCisJCQlicmVhazsKKworIAkgICAgICAgIGlpciA9IGluYihpb2Jhc2UgKyBVQVJUX0lJUikgJiBVQVJUX0lJUl9JRDsKKwl9CisJLypzcGluX3VubG9jaygmc2VsZi0+bG9jayk7Ki8KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworI2lmIDAgLyogdW51c2VkICovCisvKgorICogRnVuY3Rpb24gaXJjY19pc19yZWNlaXZpbmcgKHNlbGYpCisgKgorICogICAgUmV0dXJuIFRSVUUgaXMgd2UgYXJlIGN1cnJlbnRseSByZWNlaXZpbmcgYSBmcmFtZQorICoKKyAqLworc3RhdGljIGludCBpcmNjX2lzX3JlY2VpdmluZyhzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQoreworCWludCBzdGF0dXMgPSBGQUxTRTsKKwkvKiBpbnQgaW9iYXNlOyAqLworCisJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiBGQUxTRTspOworCisJSVJEQV9ERUJVRygwLCAiJXM6IGRtYSBjb3VudCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgIGdldF9kbWFfcmVzaWR1ZShzZWxmLT5pby5kbWEpKTsKKworCXN0YXR1cyA9IChzZWxmLT5yeF9idWZmLnN0YXRlICE9IE9VVFNJREVfRlJBTUUpOworCQorCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogdW51c2VkICovCisKKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19uZXRfb3BlbiAoZGV2KQorICoKKyAqICAgIFN0YXJ0IHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgc21zY19pcmNjX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZjsKKwlpbnQgaW9iYXNlOworCWNoYXIgaHduYW1lWzE2XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOworCQorCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJaWYgKHJlcXVlc3RfaXJxKHNlbGYtPmlvLmlycSwgc21zY19pcmNjX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCAKKwkJCSh2b2lkICopIGRldikpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5hYmxlIHRvIGFsbG9jYXRlIGlycT0lZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+aW8uaXJxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkvKnNtc2NfaXJjY19zaXJfc3RhcnQoc2VsZik7Ki8KKwlzZWxmLT5pby5zcGVlZCA9IDA7CisJc21zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBTTVNDX0lSQ0MyX0NfSVJEQV9GQUxMQkFDS19TUEVFRCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQorCS8qIEdpdmUgc2VsZiBhIGhhcmR3YXJlIG5hbWUgKi8KKwkvKiBJdCB3b3VsZCBiZSBjb29sIHRvIG9mZmVyIHRoZSBjaGlwIHJldmlzaW9uIGhlcmUgLSBKZWFuIElJICovCisJc3ByaW50Zihod25hbWUsICJTTVNDIEAgMHglMDN4Iiwgc2VsZi0+aW8uZmlyX2Jhc2UpOworCisJLyogCisJICogT3BlbiBuZXcgSXJMQVAgbGF5ZXIgaW5zdGFuY2UsIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgc2hvdWxkIGJlCisJICogaW5pdGlhbGl6ZWQgcHJvcGVybHkgCisJICovCisJc2VsZi0+aXJsYXAgPSBpcmxhcF9vcGVuKGRldiwgJnNlbGYtPnFvcywgaHduYW1lKTsKKworCS8qCisJICogQWx3YXlzIGFsbG9jYXRlIHRoZSBETUEgY2hhbm5lbCBhZnRlciB0aGUgSVJRLAorCSAqIGFuZCBjbGVhbiB1cCBvbiBmYWlsdXJlLgorCSAqLworCWlmIChyZXF1ZXN0X2RtYShzZWxmLT5pby5kbWEsIGRldi0+bmFtZSkpIHsKKwkJc21zY19pcmNjX25ldF9jbG9zZShkZXYpOworCisJCUlSREFfV0FSTklORygiJXMoKSwgdW5hYmxlIHRvIGFsbG9jYXRlIERNQT0lZFxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBzZWxmLT5pby5kbWEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX25ldF9jbG9zZSAoZGV2KQorICoKKyAqICAgIFN0b3AgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBzbXNjX2lyY2NfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZjsKKwlpbnQgaW9iYXNlOworCisJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCS8qIFN0b3AgZGV2aWNlICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCS8qIFN0b3AgYW5kIHJlbW92ZSBpbnN0YW5jZSBvZiBJckxBUCAqLworCWlmIChzZWxmLT5pcmxhcCkKKwkJaXJsYXBfY2xvc2Uoc2VsZi0+aXJsYXApOworCXNlbGYtPmlybGFwID0gTlVMTDsKKworCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgZGV2KTsKKworCWRpc2FibGVfZG1hKHNlbGYtPmlvLmRtYSk7CisKKwlmcmVlX2RtYShzZWxmLT5pby5kbWEpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgc21zY19pcmNjX3N1c3BlbmQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3sKKwlJUkRBX01FU1NBR0UoIiVzLCBTdXNwZW5kaW5nXG4iLCBkcml2ZXJfbmFtZSk7CisKKwlpZiAoc2VsZi0+aW8uc3VzcGVuZGVkKQorCQlyZXR1cm47CisKKwlzbXNjX2lyY2NfbmV0X2Nsb3NlKHNlbGYtPm5ldGRldik7CisKKwlzZWxmLT5pby5zdXNwZW5kZWQgPSAxOworfQorCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfd2FrZXVwKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCit7CisJaWYgKCFzZWxmLT5pby5zdXNwZW5kZWQpCisJCXJldHVybjsKKworCS8qIFRoZSBjb2RlIHdhcyBkb2luZyBhICJjbGkoKSIgaGVyZSwgYnV0IHRoaXMgY2FuJ3QgYmUgcmlnaHQuCisJICogSWYgeW91IG5lZWQgcHJvdGVjdGlvbiwgZG8gaXQgaW4gbmV0X29wZW4gd2l0aCBhIHNwaW5sb2NrCisJICogb3IgZ2l2ZSBhIGdvb2QgcmVhc29uLiAtIEplYW4gSUkgKi8KKworCXNtc2NfaXJjY19uZXRfb3BlbihzZWxmLT5uZXRkZXYpOworCQorCUlSREFfTUVTU0FHRSgiJXMsIFdha2luZyB1cFxuIiwgZHJpdmVyX25hbWUpOworfQorCitzdGF0aWMgaW50IHNtc2NfaXJjY19wbXByb2Moc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZGF0YSkKK3sKKyAgICAgICAgc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiA9IChzdHJ1Y3Qgc21zY19pcmNjX2NiKikgZGV2LT5kYXRhOworICAgICAgICBpZiAoc2VsZikgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocnFzdCkgeworICAgICAgICAgICAgICAgIGNhc2UgUE1fU1VTUEVORDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtc2NfaXJjY19zdXNwZW5kKHNlbGYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQTV9SRVNVTUU6CisgICAgICAgICAgICAgICAgICAgICAgICBzbXNjX2lyY2Nfd2FrZXVwKHNlbGYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfY2xvc2UgKHNlbGYpCisgKgorICogICAgQ2xvc2UgZHJpdmVyIGluc3RhbmNlCisgKgorICovCitzdGF0aWMgaW50IF9fZXhpdCBzbXNjX2lyY2NfY2xvc2Uoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCWlmIChzZWxmLT5wbWRldikKKwkJcG1fdW5yZWdpc3RlcihzZWxmLT5wbWRldik7CisKKwkvKiBSZW1vdmUgbmV0ZGV2aWNlICovCisJdW5yZWdpc3Rlcl9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgaXJxIGhhbmRsZXIgaXMgbm90IGV4ZWN0dXRpbmcgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogU3RvcCBpbnRlcnJ1cHRzICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCW91dGIoMCwgaW9iYXNlK0lSQ0NfSUVSKTsKKwlvdXRiKElSQ0NfTUFTVEVSX1JFU0VULCBpb2Jhc2UrSVJDQ19NQVNURVIpOworCW91dGIoMHgwMCwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKKyNpZiAwCisJLyogUmVzZXQgdG8gU0lSIG1vZGUgKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMSk7CisgICAgICAgIG91dGIoSVJDQ19DRkdBX0lSREFfU0lSX0F8SVJDQ19DRkdBX1RYX1BPTEFSSVRZLCBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQSk7CisgICAgICAgIG91dGIoSVJDQ19DRkdCX0lSLCBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisjZW5kaWYKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwkvKiBSZWxlYXNlIHRoZSBQT1JUUyB0aGF0IHRoaXMgZHJpdmVyIGlzIHVzaW5nICovCisJSVJEQV9ERUJVRygwLCAiJXMoKSwgcmVsZWFzaW5nIDB4JTAzeFxuIiwgIF9fRlVOQ1RJT05fXywKKwkJICAgc2VsZi0+aW8uZmlyX2Jhc2UpOworCisJcmVsZWFzZV9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQpOworCisJSVJEQV9ERUJVRygwLCAiJXMoKSwgcmVsZWFzaW5nIDB4JTAzeFxuIiwgX19GVU5DVElPTl9fLCAKKwkJICAgc2VsZi0+aW8uc2lyX2Jhc2UpOworCisJcmVsZWFzZV9yZWdpb24oc2VsZi0+aW8uc2lyX2Jhc2UsIHNlbGYtPmlvLnNpcl9leHQpOworCisJaWYgKHNlbGYtPnR4X2J1ZmYuaGVhZCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgIHNlbGYtPnR4X2J1ZmYuaGVhZCwgc2VsZi0+dHhfYnVmZl9kbWEpOworCQorCWlmIChzZWxmLT5yeF9idWZmLmhlYWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKKworCWZyZWVfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNtc2NfaXJjY19jbGVhbnVwKHZvaWQpCit7CisJaW50IGk7CisKKwlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWZvciAoaT0wOyBpIDwgMjsgaSsrKSB7CisJCWlmIChkZXZfc2VsZltpXSkKKwkJCXNtc2NfaXJjY19jbG9zZShkZXZfc2VsZltpXSk7CisJfQorfQorCisvKgorICoJU3RhcnQgU0lSIG9wZXJhdGlvbnMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uICptdXN0KiBiZSBjYWxsZWQgd2l0aCBzcGlubG9jayBoZWxkLCBiZWNhdXNlIGl0IG1heQorICogYmUgY2FsbGVkIGZyb20gdGhlIGlycSBoYW5kbGVyICh2aWEgc21zY19pcmNjX2NoYW5nZV9zcGVlZCgpKS4gLSBKZWFuIElJCisgKi8KK3ZvaWQgc21zY19pcmNjX3Npcl9zdGFydChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGZpcl9iYXNlLCBzaXJfYmFzZTsKKworCUlSREFfREVCVUcoMywgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsJCisJZGV2PSBzZWxmLT5uZXRkZXY7CisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybjspOwkJCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc21zY19pcmNjX2hhcmRfeG1pdF9zaXI7CisKKwlmaXJfYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCXNpcl9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwkvKiBSZXNldCBldmVyeXRoaW5nICovCisJb3V0YihJUkNDX01BU1RFUl9SRVNFVCwgZmlyX2Jhc2UrSVJDQ19NQVNURVIpOworCisJI2lmIFNNU0NfSVJDQzJfQ19TSVJfU1RPUAorCS8qc21zY19pcmNjX3Npcl9zdG9wKHNlbGYpOyovCisJI2VuZGlmCisKKwlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAxKTsKKwlvdXRiKCgoaW5iKGZpcl9iYXNlK0lSQ0NfU0NFX0NGR0EpICYgSVJDQ19TQ0VfQ0ZHQV9CTE9DS19DVFJMX0JJVFNfTUFTSykgfCBJUkNDX0NGR0FfSVJEQV9TSVJfQSksIGZpcl9iYXNlK0lSQ0NfU0NFX0NGR0EpOworCisJLyogSW5pdGlhbGl6ZSBVQVJUICovCisJb3V0YihVQVJUX0xDUl9XTEVOOCwgc2lyX2Jhc2UrVUFSVF9MQ1IpOyAgLyogUmVzZXQgRExBQiAqLworCW91dGIoKFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyB8IFVBUlRfTUNSX09VVDIpLCBzaXJfYmFzZStVQVJUX01DUik7CisJCisJLyogVHVybiBvbiBpbnRlcnJ1cHMgKi8KKwlvdXRiKFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREkgfFVBUlRfSUVSX1RIUkksIHNpcl9iYXNlK1VBUlRfSUVSKTsKKworCUlSREFfREVCVUcoMywgIiVzKCkgLSBleGl0XG4iLCBfX0ZVTkNUSU9OX18pOworCisJb3V0YigweDAwLCBmaXJfYmFzZStJUkNDX01BU1RFUik7Cit9CisKKyNpZiBTTVNDX0lSQ0MyX0NfU0lSX1NUT1AKK3ZvaWQgc21zY19pcmNjX3Npcl9zdG9wKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZTsKKworCUlSREFfREVCVUcoMywgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJLyogUmVzZXQgVUFSVCAqLworCW91dGIoMCwgaW9iYXNlK1VBUlRfTUNSKTsKKwkKKwkvKiBUdXJuIG9mZiBpbnRlcnJ1cHRzICovCisJb3V0YigwLCBpb2Jhc2UrVUFSVF9JRVIpOworfQorI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX3Npcl93cml0ZV93YWtldXAgKHNlbGYpCisgKgorICogICAgQ2FsbGVkIGJ5IHRoZSBTSVIgaW50ZXJydXB0IGhhbmRsZXIgd2hlbiB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZGF0YS4KKyAqICAgIElmIHdlIGhhdmUgbW9yZSBwYWNrZXRzIHRvIHNlbmQsIHdlIHNlbmQgdGhlbSBoZXJlLgorICoKKyAqLworc3RhdGljIHZvaWQgc21zY19pcmNjX3Npcl93cml0ZV93YWtldXAoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgYWN0dWFsID0gMDsKKwlpbnQgaW9iYXNlOworCWludCBmY3I7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJSVJEQV9ERUJVRyg0LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCS8qIEZpbmlzaGVkIHdpdGggZnJhbWU/ICAqLworCWlmIChzZWxmLT50eF9idWZmLmxlbiA+IDApICB7CisJCS8qIFdyaXRlIGRhdGEgbGVmdCBpbiB0cmFuc21pdCBidWZmZXIgKi8KKwkJYWN0dWFsID0gc21zY19pcmNjX3Npcl93cml0ZShpb2Jhc2UsIHNlbGYtPmlvLmZpZm9fc2l6ZSwgCisJCQkJICAgICAgc2VsZi0+dHhfYnVmZi5kYXRhLCBzZWxmLT50eF9idWZmLmxlbik7CisJCXNlbGYtPnR4X2J1ZmYuZGF0YSArPSBhY3R1YWw7CisJCXNlbGYtPnR4X2J1ZmYubGVuICAtPSBhY3R1YWw7CisJfSBlbHNlIHsKKwkKKwkvKmlmIChzZWxmLT50eF9idWZmLmxlbiA9PTApICB7Ki8KKwkJCisJCS8qIAorCQkgKiAgTm93IHNlcmlhbCBidWZmZXIgaXMgYWxtb3N0IGZyZWUgJiB3ZSBjYW4gc3RhcnQgCisJCSAqICB0cmFuc21pc3Npb24gb2YgYW5vdGhlciBwYWNrZXQuIEJ1dCBmaXJzdCB3ZSBtdXN0IGNoZWNrCisJCSAqICBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIGhhcmR3YXJlCisJCSAqLworCQlpZiAoc2VsZi0+bmV3X3NwZWVkKSB7CisJCQlJUkRBX0RFQlVHKDUsICIlcygpLCBDaGFuZ2luZyBzcGVlZCB0byAlZC5cbiIsCisJCQkJICAgX19GVU5DVElPTl9fLCBzZWxmLT5uZXdfc3BlZWQpOworCQkJc21zY19pcmNjX3Npcl93YWl0X2h3X3RyYW5zbWl0dGVyX2ZpbmlzaChzZWxmKTsKKwkJCXNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+bmV3X3NwZWVkKTsKKwkJCXNlbGYtPm5ld19zcGVlZCA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBUZWxsIG5ldHdvcmsgbGF5ZXIgdGhhdCB3ZSB3YW50IG1vcmUgZnJhbWVzICovCisJCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisJCX0KKwkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCisJCWlmKHNlbGYtPmlvLnNwZWVkIDw9IDExNTIwMCkgeworCQkvKiAKKwkJICogUmVzZXQgUnggRklGTyB0byBtYWtlIHN1cmUgdGhhdCBhbGwgcmVmbGVjdGVkIHRyYW5zbWl0IGRhdGEKKwkJICogaXMgZGlzY2FyZGVkLiBUaGlzIGlzIG5lZWRlZCBmb3IgaGFsZiBkdXBsZXggb3BlcmF0aW9uCisJCSAqLworCQlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTyB8IFVBUlRfRkNSX0NMRUFSX1JDVlI7CisJCWlmIChzZWxmLT5pby5zcGVlZCA8IDM4NDAwKQorCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTsKKwkJZWxzZSAKKwkJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzE0OworCisJCW91dGIoZmNyLCBpb2Jhc2UrVUFSVF9GQ1IpOworCisJCS8qIFR1cm4gb24gcmVjZWl2ZSBpbnRlcnJ1cHRzICovCisJCW91dGIoVUFSVF9JRVJfUkRJLCBpb2Jhc2UrVUFSVF9JRVIpOworCQl9CisJfQorfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3Npcl93cml0ZSAoaW9iYXNlLCBmaWZvX3NpemUsIGJ1ZiwgbGVuKQorICoKKyAqICAgIEZpbGwgVHggRklGTyB3aXRoIHRyYW5zbWl0IGRhdGEKKyAqCisgKi8KK3N0YXRpYyBpbnQgc21zY19pcmNjX3Npcl93cml0ZShpbnQgaW9iYXNlLCBpbnQgZmlmb19zaXplLCBfX3U4ICpidWYsIGludCBsZW4pCit7CisJaW50IGFjdHVhbCA9IDA7CisJCisJLyogVHggRklGTyBzaG91bGQgYmUgZW1wdHkhICovCisJaWYgKCEoaW5iKGlvYmFzZStVQVJUX0xTUikgJiBVQVJUX0xTUl9USFJFKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIGZhaWxlZCwgZmlmbyBub3QgZW1wdHkhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gMDsKKwl9CisgICAgICAgIAorCS8qIEZpbGwgRklGTyB3aXRoIGN1cnJlbnQgZnJhbWUgKi8KKwl3aGlsZSAoKGZpZm9fc2l6ZS0tID4gMCkgJiYgKGFjdHVhbCA8IGxlbikpIHsKKwkJLyogVHJhbnNtaXQgbmV4dCBieXRlICovCisJCW91dGIoYnVmW2FjdHVhbF0sIGlvYmFzZStVQVJUX1RYKTsKKwkJYWN0dWFsKys7CisJfQorCXJldHVybiBhY3R1YWw7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfaXNfcmVjZWl2aW5nIChzZWxmKQorICoKKyAqICAgIFJldHVybnMgdHJ1ZSBpcyB3ZSBhcmUgY3VycmVudGx5IHJlY2VpdmluZyBkYXRhCisgKgorICovCitzdGF0aWMgaW50IHNtc2NfaXJjY19pc19yZWNlaXZpbmcoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3sKKwlyZXR1cm4gKHNlbGYtPnJ4X2J1ZmYuc3RhdGUgIT0gT1VUU0lERV9GUkFNRSk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcihzZWxmKQorICoKKyAqICAgIFRyaWVzIHRvIGZpbmQgdGhlIHVzZWQgVHJhbnNjZWl2ZXIKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcihzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQoreworCXVuc2lnbmVkIGludAlpOworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJCisJZm9yKGk9MDsgc21zY190cmFuc2NlaXZlcnNbaV0ubmFtZSE9TlVMTDsgaSsrKSAKKwkJaWYoKCpzbXNjX3RyYW5zY2VpdmVyc1tpXS5wcm9iZSkoc2VsZi0+aW8uZmlyX2Jhc2UpKSB7CisJCQlJUkRBX01FU1NBR0UoIiAlcyB0cmFuc2NlaXZlciBmb3VuZFxuIiwKKwkJCQkgICAgIHNtc2NfdHJhbnNjZWl2ZXJzW2ldLm5hbWUpOworCQkJc2VsZi0+dHJhbnNjZWl2ZXI9IGkrMTsKKwkJCXJldHVybjsKKwkJfQorCUlSREFfTUVTU0FHRSgiTm8gdHJhbnNjZWl2ZXIgZm91bmQuIERlZmF1bHRpbmcgdG8gJXNcbiIsCisJCSAgICAgc21zY190cmFuc2NlaXZlcnNbU01TQ19JUkNDMl9DX0RFRkFVTFRfVFJBTlNDRUlWRVJdLm5hbWUpOworCQkJCisJc2VsZi0+dHJhbnNjZWl2ZXI9IFNNU0NfSVJDQzJfQ19ERUZBVUxUX1RSQU5TQ0VJVkVSOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX2Zvcl9zcGVlZChzZWxmLCBzcGVlZCkKKyAqCisgKiAgICBTZXQgdGhlIHRyYW5zY2VpdmVyIGFjY29yZGluZyB0byB0aGUgc3BlZWQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfZm9yX3NwZWVkKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIHUzMiBzcGVlZCkKK3sKKwl1bnNpZ25lZCBpbnQgdHJ4OworCQorCXRyeCA9IHNlbGYtPnRyYW5zY2VpdmVyOworCWlmKHRyeD4wKSAoKnNtc2NfdHJhbnNjZWl2ZXJzW3RyeC0xXS5zZXRfZm9yX3NwZWVkKShzZWxmLT5pby5maXJfYmFzZSwgc3BlZWQpOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3dhaXRfaHdfdHJhbnNtaXR0ZXJfZmluaXNoICgpCisgKgorICogICAgV2FpdCBmb3IgdGhlIHJlYWwgZW5kIG9mIEhXIHRyYW5zbWlzc2lvbgorICoKKyAqIFRoZSBVQVJUIGlzIGEgc3RyaWN0IEZJRk8sIGFuZCB3ZSBnZXQgY2FsbGVkIG9ubHkgd2hlbiB3ZSBoYXZlIGZpbmlzaGVkCisgKiBwdXNoaW5nIGRhdGEgdG8gdGhlIEZJRk8sIHNvIHRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHdlIG11c3Qgd2FpdAorICogaXMgb25seSBmb3IgdGhlIEZJRk8gdG8gZHJhaW4gb3V0LgorICoKKyAqIFdlIHVzZSBhIHNpbXBsZSBjYWxpYnJhdGVkIGxvb3AuIFdlIG1heSBuZWVkIHRvIGFkanVzdCB0aGUgbG9vcAorICogZGVsYXkgKHVkZWxheSkgdG8gYmFsYW5jZSBJL08gdHJhZmZpYyBhbmQgbGF0ZW5jeS4gQW5kIHdlIGFsc28gbmVlZCB0bworICogYWRqdXN0IHRoZSBtYXhpbXVtIHRpbWVvdXQuCisgKiBJdCB3b3VsZCBwcm9iYWJseSBiZSBiZXR0ZXIgdG8gd2FpdCBmb3IgdGhlIHByb3BlciBpbnRlcnJ1cHQsCisgKiBidXQgaXQgZG9lc24ndCBzZWVtIHRvIGJlIGF2YWlsYWJsZS4KKyAqCisgKiBXZSBjYW4ndCB1c2UgamlmZmllcyBvciBrZXJuZWwgdGltZXJzIGJlY2F1c2UgOgorICogMSkgV2UgYXJlIGNhbGxlZCBmcm9tIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgd2hpY2ggZGlzYWJsZSBzb2Z0aXJxcywKKyAqIHNvIGppZmZpZXMgd29uJ3QgYmUgaW5jcmVhc2VkCisgKiAyKSBKaWZmaWVzIGdyYW51bGFyaXR5IGlzIHVzdWFsbHkgdmVyeSBjb2Fyc2UgKDEwbXMpLCBhbmQgd2UgZG9uJ3QKKyAqIHdhbnQgdG8gd2FpdCB0aGF0IGxvbmcgdG8gZGV0ZWN0IHN0dWNrIGhhcmR3YXJlLgorICogSmVhbiBJSQorICovCisKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zaXJfd2FpdF9od190cmFuc21pdHRlcl9maW5pc2goc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCWludCBjb3VudCA9IFNNU0NfSVJDQzJfSFdfVFJBTlNNSVRURVJfVElNRU9VVF9VUzsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKwkKKwkvKiBDYWxpYnJhdGVkIGJ1c3kgbG9vcCAqLworCXdoaWxlKChjb3VudC0tID4gMCkgJiYgIShpbmIoaW9iYXNlK1VBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpKQorCQl1ZGVsYXkoMSk7CisKKwlpZihjb3VudCA9PSAwKQorCQlJUkRBX0RFQlVHKDAsICIlcygpOiBzdHVjayB0cmFuc21pdHRlclxuIiwgX19GVU5DVElPTl9fKTsKK30KKworCisvKiBQUk9CSU5HCisgKgorICoKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBzbXNjX2lyY2NfbG9va19mb3JfY2hpcHModm9pZCkKK3sKKwlzbXNjX2NoaXBfYWRkcmVzc190ICphZGRyZXNzOworCWNoYXIJKnR5cGU7CisJdW5zaWduZWQgaW50IGNmZ19iYXNlLCBmb3VuZDsKKwkKKwlmb3VuZCA9IDA7CisJYWRkcmVzcyA9IHBvc3NpYmxlX2FkZHJlc3NlczsKKwkKKwl3aGlsZShhZGRyZXNzLT5jZmdfYmFzZSl7CisJCWNmZ19iYXNlID0gYWRkcmVzcy0+Y2ZnX2Jhc2U7CisJCQorCQkvKnByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCk6IHByb2Jpbmc6IDB4JTAyeCBmb3I6IDB4JTAyeFxuIiwgX19GVU5DVElPTl9fLCBjZmdfYmFzZSwgYWRkcmVzcy0+dHlwZSk7Ki8KKwkJCisJCWlmKCBhZGRyZXNzLT50eXBlICYgU01TQ1NJT19UWVBFX0ZEQyl7CisJCQl0eXBlID0gIkZEQyI7CisJCQlpZigoYWRkcmVzcy0+dHlwZSkgJiBTTVNDU0lPX1RZUEVfRkxBVCkgeworCQkJCWlmKCFzbXNjX3N1cGVyaW9fZmxhdChmZGNfY2hpcHNfZmxhdCxjZmdfYmFzZSwgdHlwZSkpIGZvdW5kKys7CisJCQl9CisJCQlpZigoYWRkcmVzcy0+dHlwZSkgJiBTTVNDU0lPX1RZUEVfUEFHRUQpIHsKKwkJCQlpZighc21zY19zdXBlcmlvX3BhZ2VkKGZkY19jaGlwc19wYWdlZCxjZmdfYmFzZSwgdHlwZSkpIGZvdW5kKys7CQkKKwkJCX0JCQkKKwkJfQorCQlpZiggYWRkcmVzcy0+dHlwZSAmIFNNU0NTSU9fVFlQRV9MUEMpeworCQkJdHlwZSA9ICJMUEMiOworCQkJaWYoKGFkZHJlc3MtPnR5cGUpICYgU01TQ1NJT19UWVBFX0ZMQVQpIHsKKwkJCQlpZighc21zY19zdXBlcmlvX2ZsYXQobHBjX2NoaXBzX2ZsYXQsY2ZnX2Jhc2UsdHlwZSkpIGZvdW5kKys7CisJCQl9CisJCQlpZigoYWRkcmVzcy0+dHlwZSkgJiBTTVNDU0lPX1RZUEVfUEFHRUQpIHsKKwkJCQlpZighc21zY19zdXBlcmlvX3BhZ2VkKGxwY19jaGlwc19wYWdlZCxjZmdfYmFzZSwiTFBDIikpIGZvdW5kKys7CQkKKwkJCX0JCQkKKwkJfQorCQlhZGRyZXNzKys7CisJfQorCXJldHVybiBmb3VuZDsKK30gCisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX3N1cGVyaW9fZmxhdCAoY2hpcCwgYmFzZSwgdHlwZSkKKyAqCisgKiAgICBUcnkgdG8gZ2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBzbWMgU3VwZXJJTyBjaGlwIHdpdGggZmxhdCByZWdpc3RlciBtb2RlbAorICoKKyAqLworc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX2ZsYXQoY29uc3Qgc21zY19jaGlwX3QgKmNoaXBzLCB1bnNpZ25lZCBzaG9ydCBjZmdiYXNlLCBjaGFyICp0eXBlKQoreworCXVuc2lnbmVkIHNob3J0IGZpcmJhc2UsIHNpcmJhc2U7CisJdTggbW9kZSwgZG1hLCBpcnE7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWlmIChzbXNjX2lyY2NfcHJvYmUoY2ZnYmFzZSwgU01TQ1NJT0ZMQVRfREVWSUNFSURfUkVHLCBjaGlwcywgdHlwZSk9PU5VTEwpCisJCXJldHVybiByZXQ7CisKKwlvdXRiKFNNU0NTSU9GTEFUX1VBUlRNT0RFMENfUkVHLCBjZmdiYXNlKTsKKwltb2RlID0gaW5iKGNmZ2Jhc2UrMSk7CisJCisJLypwcmludGsoS0VSTl9XQVJOSU5HICIlcygpOiBtb2RlOiAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgbW9kZSk7Ki8KKwkKKwlpZighKG1vZGUgJiBTTVNDU0lPRkxBVF9VQVJUMk1PREVfVkFMX0lSREEpKQorCQlJUkRBX1dBUk5JTkcoIiVzKCk6IElyREEgbm90IGVuYWJsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlvdXRiKFNNU0NTSU9GTEFUX1VBUlQyQkFTRUFERFJfUkVHLCBjZmdiYXNlKTsKKwlzaXJiYXNlID0gaW5iKGNmZ2Jhc2UrMSkgPDwgMjsKKworICAgCS8qIEZJUiBpb2Jhc2UgKi8KKwlvdXRiKFNNU0NTSU9GTEFUX0ZJUkJBU0VBRERSX1JFRywgY2ZnYmFzZSk7CisJZmlyYmFzZSA9IGluYihjZmdiYXNlKzEpIDw8IDM7CisKKwkvKiBETUEgKi8KKwlvdXRiKFNNU0NTSU9GTEFUX0ZJUkRNQVNFTEVDVF9SRUcsIGNmZ2Jhc2UpOworCWRtYSA9IGluYihjZmdiYXNlKzEpICYgU01TQ1NJT0ZMQVRfRklSRE1BU0VMRUNUX01BU0s7CisJCisJLyogSVJRICovCisJb3V0YihTTVNDU0lPRkxBVF9VQVJUSVJRU0VMRUNUX1JFRywgY2ZnYmFzZSk7CisJaXJxID0gaW5iKGNmZ2Jhc2UrMSkgJiBTTVNDU0lPRkxBVF9VQVJUMklSUVNFTEVDVF9NQVNLOworCisJSVJEQV9NRVNTQUdFKCIlcygpOiBmaXI6IDB4JTAyeCwgc2lyOiAweCUwMngsIGRtYTogJTAyZCwgaXJxOiAlZCwgbW9kZTogMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIGZpcmJhc2UsIHNpcmJhc2UsIGRtYSwgaXJxLCBtb2RlKTsKKworCWlmIChmaXJiYXNlKSB7CisJCWlmIChzbXNjX2lyY2Nfb3BlbihmaXJiYXNlLCBzaXJiYXNlLCBkbWEsIGlycSkgPT0gMCkKKwkJCXJldD0wOyAKKwl9CisJCisJLyogRXhpdCBjb25maWd1cmF0aW9uICovCisJb3V0YihTTVNDU0lPX0NGR0VYSVRLRVksIGNmZ2Jhc2UpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2Nfc3VwZXJpb19wYWdlZCAoY2hpcCwgYmFzZSwgdHlwZSkKKyAqCisgKiAgICBUcnkgIHRvIGdldCBjb25maWd1cmF0aW9uIG9mIGEgc21jIFN1cGVySU8gY2hpcCB3aXRoIHBhZ2VkIHJlZ2lzdGVyIG1vZGVsCisgKgorICovCitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fcGFnZWQoY29uc3Qgc21zY19jaGlwX3QgKmNoaXBzLCB1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSwgY2hhciAqdHlwZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBmaXJfaW8sIHNpcl9pbzsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKwkKKwlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWlmIChzbXNjX2lyY2NfcHJvYmUoY2ZnX2Jhc2UsMHgyMCxjaGlwcyx0eXBlKT09TlVMTCkKKwkJcmV0dXJuIHJldDsKKwkKKwkvKiBTZWxlY3QgbG9naWNhbCBkZXZpY2UgKFVBUlQyKSAqLworCW91dGIoMHgwNywgY2ZnX2Jhc2UpOworCW91dGIoMHgwNSwgY2ZnX2Jhc2UgKyAxKTsKKwkJCisJLyogU0lSIGlvYmFzZSAqLworCW91dGIoMHg2MCwgY2ZnX2Jhc2UpOworCXNpcl9pbyAgPSBpbmIoY2ZnX2Jhc2UgKyAxKSA8PCA4OworCW91dGIoMHg2MSwgY2ZnX2Jhc2UpOworCXNpcl9pbyB8PSBpbmIoY2ZnX2Jhc2UgKyAxKTsKKwkJCisJLyogUmVhZCBGSVIgYmFzZSAqLworCW91dGIoMHg2MiwgY2ZnX2Jhc2UpOworCWZpcl9pbyA9IGluYihjZmdfYmFzZSArIDEpIDw8IDg7CisJb3V0YigweDYzLCBjZmdfYmFzZSk7CisJZmlyX2lvIHw9IGluYihjZmdfYmFzZSArIDEpOworCW91dGIoMHgyYiwgY2ZnX2Jhc2UpOyAvKiA/Pz8gKi8KKworCWlmIChmaXJfaW8pIHsKKwkJaWYgKHNtc2NfaXJjY19vcGVuKGZpcl9pbywgc2lyX2lvLCBpcmNjX2RtYSwgaXJjY19pcnEpID09IDApCisJCQlyZXQ9MDsgCisJfQorCQorCS8qIEV4aXQgY29uZmlndXJhdGlvbiAqLworCW91dGIoU01TQ1NJT19DRkdFWElUS0VZLCBjZmdfYmFzZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHNtc2NfYWNjZXNzKHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLHVuc2lnbmVkIGNoYXIgcmVnKQoreworCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJb3V0YihyZWcsIGNmZ19iYXNlKTsKKworCWlmIChpbmIoY2ZnX2Jhc2UpIT1yZWcpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc21zY19jaGlwX3QgKiBfX2luaXQgc21zY19pcmNjX3Byb2JlKHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLHU4IHJlZyxjb25zdCBzbXNjX2NoaXBfdCAqY2hpcCxjaGFyICp0eXBlKQoreworCXU4IGRldmlkLHhkZXZpZCxyZXY7IAorCisJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBMZWF2ZSBjb25maWd1cmF0aW9uICovCisKKwlvdXRiKFNNU0NTSU9fQ0ZHRVhJVEtFWSwgY2ZnX2Jhc2UpOworCisJaWYgKGluYihjZmdfYmFzZSkgPT0gU01TQ1NJT19DRkdFWElUS0VZKQkvKiBub3QgYSBzbWMgc3VwZXJpbyBjaGlwICovCisJCXJldHVybiBOVUxMOworCisJb3V0YihyZWcsIGNmZ19iYXNlKTsKKworCXhkZXZpZD1pbmIoY2ZnX2Jhc2UrMSk7CisKKwkvKiBFbnRlciBjb25maWd1cmF0aW9uICovCisKKwlvdXRiKFNNU0NTSU9fQ0ZHQUNDRVNTS0VZLCBjZmdfYmFzZSk7CisKKwkjaWYgMAorCWlmIChzbXNjX2FjY2VzcyhjZmdfYmFzZSwweDU1KSkJLyogc2VuZCBzZWNvbmQga2V5IGFuZCBjaGVjayAqLworCQlyZXR1cm4gTlVMTDsKKwkjZW5kaWYKKwkKKwkvKiBwcm9iZSBkZXZpY2UgSUQgKi8KKworCWlmIChzbXNjX2FjY2VzcyhjZmdfYmFzZSxyZWcpKQorCQlyZXR1cm4gTlVMTDsKKworCWRldmlkPWluYihjZmdfYmFzZSsxKTsKKwkKKwlpZiAoZGV2aWQ9PTApCQkJLyogdHlwaWNhbCB2YWx1ZSBmb3IgdW51c2VkIHBvcnQgKi8KKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZGV2aWQ9PTB4ZmYpCQkvKiB0eXBpY2FsIHZhbHVlIGZvciB1bnVzZWQgcG9ydCAqLworCQlyZXR1cm4gTlVMTDsKKworCS8qIHByb2JlIHJldmlzaW9uIElEICovCisKKwlpZiAoc21zY19hY2Nlc3MoY2ZnX2Jhc2UscmVnKzEpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldj1pbmIoY2ZnX2Jhc2UrMSk7CisKKwlpZiAocmV2Pj0xMjgpCQkJLyogaSB0aGluayB0aGlzIHdpbGwgbWFrZSBubyBzZW5zZSAqLworCQlyZXR1cm4gTlVMTDsKKworCWlmIChkZXZpZD09eGRldmlkKQkJLyogcHJvdGVjdGlvbiBhZ2FpbnN0IGZhbHNlIHBvc2l0aXZlcyAqLyAgICAgICAgCisJCXJldHVybiBOVUxMOworCisJLyogQ2hlY2sgZm9yIGV4cGVjdGVkIGRldmljZSBJRDsgYXJlIHRoZXJlIG90aGVycz8gKi8KKworCXdoaWxlKGNoaXAtPmRldmlkIT1kZXZpZCkgeworCisJCWNoaXArKzsKKworCQlpZiAoY2hpcC0+bmFtZT09TlVMTCkKKwkJCXJldHVybiBOVUxMOworCX0KKworCUlSREFfTUVTU0FHRSgiZm91bmQgU01DIFN1cGVySU8gQ2hpcCAoZGV2aWQ9MHglMDJ4IHJldj0lMDJYIGJhc2U9MHglMDR4KTogJXMlc1xuIixkZXZpZCxyZXYsY2ZnX2Jhc2UsdHlwZSxjaGlwLT5uYW1lKTsKKworCWlmIChjaGlwLT5yZXY+cmV2KXsKKwkJSVJEQV9NRVNTQUdFKCJSZXZpc2lvbiBoaWdoZXIgdGhhbiBleHBlY3RlZFxuIik7CQorCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJaWYgKGNoaXAtPmZsYWdzJk5vSVJEQSkKKwkJSVJEQV9NRVNTQUdFKCJjaGlwc2V0IGRvZXMgbm90IHN1cHBvcnQgSVJEQVxuIik7CisKKwlyZXR1cm4gY2hpcDsKK30KKworc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX2ZkYyh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSkKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGNmZ19iYXNlLCAyLCBkcml2ZXJfbmFtZSkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogY2FuJ3QgZ2V0IGNmZ19iYXNlIG9mIDB4JTAzeFxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBjZmdfYmFzZSk7CisJfSBlbHNlIHsKKwkJaWYgKCFzbXNjX3N1cGVyaW9fZmxhdChmZGNfY2hpcHNfZmxhdCxjZmdfYmFzZSwiRkRDIikKKwkJICAgIHx8IXNtc2Nfc3VwZXJpb19wYWdlZChmZGNfY2hpcHNfcGFnZWQsY2ZnX2Jhc2UsIkZEQyIpKQorCQkJcmV0ID0gIDA7CisKKwkJcmVsZWFzZV9yZWdpb24oY2ZnX2Jhc2UsIDIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19scGModW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UpCit7CisJaW50IHJldCA9IC0xOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihjZmdfYmFzZSwgMiwgZHJpdmVyX25hbWUpKSB7CisJCUlSREFfV0FSTklORygiJXM6IGNhbid0IGdldCBjZmdfYmFzZSBvZiAweCUwM3hcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgY2ZnX2Jhc2UpOworCX0gZWxzZSB7CisJCWlmICghc21zY19zdXBlcmlvX2ZsYXQobHBjX2NoaXBzX2ZsYXQsY2ZnX2Jhc2UsIkxQQyIpCisJCSAgICB8fCFzbXNjX3N1cGVyaW9fcGFnZWQobHBjX2NoaXBzX3BhZ2VkLGNmZ19iYXNlLCJMUEMiKSkKKwkJCXJldCA9IDA7CisJCXJlbGVhc2VfcmVnaW9uKGNmZ19iYXNlLCAyKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRyYW5zY2VpdmVycyBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19hdGMoZmlyX2Jhc2UsIHNwZWVkKQorICoKKyAqICAgIFByb2dyYW0gdHJhbnNjZWl2ZXIgdGhyb3VnaCBzbXNjLWlyY2MgQVRDIGNpcmN1aXRyeQorICoKKyAqLworCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19hdGMoaW50IGZpcl9iYXNlLCB1MzIgc3BlZWQpCit7CisJdW5zaWduZWQgbG9uZyBqaWZmaWVzX25vdywgamlmZmllc190aW1lb3V0OworCXU4CXZhbDsKKwkKKwlqaWZmaWVzX25vdz0gamlmZmllczsKKwlqaWZmaWVzX3RpbWVvdXQ9IGppZmZpZXMrU01TQ19JUkNDMl9BVENfUFJPR1JBTU1JTkdfVElNRU9VVF9KSUZGSUVTOworCQorCS8qIEFUQyAqLworCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDQpOworCW91dGIoKGluYihmaXJfYmFzZStJUkNDX0FUQykgJiBJUkNDX0FUQ19NQVNLKSB8SVJDQ19BVENfblBST0dSRUFEWXxJUkNDX0FUQ19FTkFCTEUsIGZpcl9iYXNlK0lSQ0NfQVRDKTsKKwl3aGlsZSgodmFsPShpbmIoZmlyX2Jhc2UrSVJDQ19BVEMpICYgSVJDQ19BVENfblBST0dSRUFEWSkpICYmICF0aW1lX2FmdGVyKGppZmZpZXMsIGppZmZpZXNfdGltZW91dCkpOworCWlmKHZhbCkKKwkJSVJEQV9XQVJOSU5HKCIlcygpOiBBVEM6IDB4JTAyeFxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgICBpbmIoZmlyX2Jhc2UrSVJDQ19BVEMpKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl9zbXNjX2lyY2NfYXRjKGZpcl9iYXNlKQorICoKKyAqICAgIFByb2JlIHRyYW5zY2VpdmVyIHNtc2MtaXJjYyBBVEMgY2lyY3VpdHJ5CisgKgorICovCisKK3N0YXRpYyBpbnQgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19hdGMoaW50IGZpcl9iYXNlKQoreworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9zbXNjX2lyY2NfZmFzdF9waW5fc2VsZWN0KHNlbGYsIHNwZWVkKQorICoKKyAqICAgIFNldCB0cmFuc2NlaXZlciAKKyAqCisgKi8KKworc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9zbXNjX2lyY2NfZmFzdF9waW5fc2VsZWN0KGludCBmaXJfYmFzZSwgdTMyIHNwZWVkKQoreworCXU4CWZhc3RfbW9kZTsKKwkKKwlzd2l0Y2goc3BlZWQpCisJeworCQlkZWZhdWx0OgorCQljYXNlIDU3NjAwMCA6CisJCWZhc3RfbW9kZSA9IDA7IAorCQlicmVhazsKKwkJY2FzZSAxMTUyMDAwIDoKKwkJY2FzZSA0MDAwMDAwIDoKKwkJZmFzdF9tb2RlID0gSVJDQ19MQ1JfQV9GQVNUOworCQlicmVhazsKKwkJCisJfQorCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDApOworCW91dGIoKGluYihmaXJfYmFzZStJUkNDX0xDUl9BKSAmICAweGJmKSB8IGZhc3RfbW9kZSwgZmlyX2Jhc2UrSVJDQ19MQ1JfQSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2Zhc3RfcGluX3NlbGVjdChmaXJfYmFzZSkKKyAqCisgKiAgICBQcm9iZSB0cmFuc2NlaXZlciAKKyAqCisgKi8KKworc3RhdGljIGludCBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2Zhc3RfcGluX3NlbGVjdChpbnQgZmlyX2Jhc2UpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Rvc2hpYmFfc2F0MTgwMChmaXJfYmFzZSwgc3BlZWQpCisgKgorICogICAgU2V0IHRyYW5zY2VpdmVyIAorICoKKyAqLworCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Rvc2hpYmFfc2F0MTgwMChpbnQgZmlyX2Jhc2UsIHUzMiBzcGVlZCkKK3sKKwl1OAlmYXN0X21vZGU7CisJCisJc3dpdGNoKHNwZWVkKQorCXsKKwkJZGVmYXVsdDoKKwkJY2FzZSA1NzYwMDAgOgorCQlmYXN0X21vZGUgPSAwOyAKKwkJYnJlYWs7CisJCWNhc2UgMTE1MjAwMCA6CisJCWNhc2UgNDAwMDAwMCA6CisJCWZhc3RfbW9kZSA9IC8qSVJDQ19MQ1JfQV9GQVNUIHwqLyBJUkNDX0xDUl9BX0dQX0RBVEE7CisJCWJyZWFrOworCQkKKwl9CisJLyogVGhpcyBjYXVzZXMgYW4gaW50ZXJydXB0ICovCisJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMCk7CisJb3V0YigoaW5iKGZpcl9iYXNlK0lSQ0NfTENSX0EpICYgIDB4YmYpIHwgZmFzdF9tb2RlLCBmaXJfYmFzZStJUkNDX0xDUl9BKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl90b3NoaWJhX3NhdDE4MDAoZmlyX2Jhc2UpCisgKgorICogICAgUHJvYmUgdHJhbnNjZWl2ZXIgCisgKgorICovCisKK3N0YXRpYyBpbnQgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Rvc2hpYmFfc2F0MTgwMChpbnQgZmlyX2Jhc2UpCit7CisJcmV0dXJuIDA7Cit9CisKKworbW9kdWxlX2luaXQoc21zY19pcmNjX2luaXQpOworbW9kdWxlX2V4aXQoc21zY19pcmNjX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJEYW5pZWxlIFBlcmkgPHBlcmlAY3NhaS51bmlwYS5pdD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU01DIElyQ0MgU0lSL0ZJUiBjb250cm9sbGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oaXJjY19kbWEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyY2NfZG1hLCAiRE1BIGNoYW5uZWwiKTsKK21vZHVsZV9wYXJhbShpcmNjX2lycSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJjY19pcnEsICJJUlEgbGluZSIpOworbW9kdWxlX3BhcmFtKGlyY2NfZmlyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcmNjX2ZpciwgIkZJUiBCYXNlIEFkZHJlc3MiKTsKK21vZHVsZV9wYXJhbShpcmNjX3NpciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJjY19zaXIsICJTSVIgQmFzZSBBZGRyZXNzIik7Cittb2R1bGVfcGFyYW0oaXJjY19jZmcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyY2NfY2ZnLCAiQ29uZmlndXJhdGlvbiByZWdpc3RlciBiYXNlIGFkZHJlc3MiKTsKK21vZHVsZV9wYXJhbShpcmNjX3RyYW5zY2VpdmVyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcmNjX3RyYW5zY2VpdmVyLCAiVHJhbnNjZWl2ZXIgdHlwZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmggYi9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTg2MTFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICRJZDogc21zYy1pcmNjMi5oLHYgMS4xMi4yLjEgMjAwMi8xMC8yNyAxMDo1MjozNyBkaXAgRXhwICQgICAgICAgICAgICAgICAKKyAqCisgKiBEZXNjcmlwdGlvbjogICBEZWZpbml0aW9ucyBmb3IgdGhlIFNNQyBJckNDIGNoaXBzZXQKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhbmllbGUgUGVyaSAocGVyaUBjc2FpLnVuaXBhLml0KQorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDIgICAgICBEYW5pZWxlIFBlcmkKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIEJhc2VkIG9uIHNtYy1pcmNjLmg6CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCwgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5LCBUaG9tYXMgRGF2aXMgKHRhZGF2aXNAanBzLm5ldD4KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU01TQ19JUkNDMl9ICisjZGVmaW5lIFNNU0NfSVJDQzJfSAorCisvKiBETUEgbW9kZXMgbmVlZGVkICovCisjZGVmaW5lIERNQV9UWF9NT0RFICAgICAgICAgICAgICAgIDB4MDggICAgLyogTWVtIHRvIEkvTywgKyssIGRlbWFuZC4gKi8KKyNkZWZpbmUgRE1BX1JYX01PREUgICAgICAgICAgICAgICAgMHgwNCAgICAvKiBJL08gdG8gbWVtLCArKywgZGVtYW5kLiAqLworCisvKiBNYXN0ZXIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBJUkNDX01BU1RFUiAgICAgICAgICAgICAgICAweDA3CisjZGVmaW5lICAgSVJDQ19NQVNURVJfUE9XRVJET1dOCSAgIDB4ODAKKyNkZWZpbmUgICBJUkNDX01BU1RFUl9SRVNFVCAgICAgICAgMHg0MAorI2RlZmluZSAgIElSQ0NfTUFTVEVSX0lOVF9FTiAgICAgICAweDIwCisjZGVmaW5lICAgSVJDQ19NQVNURVJfRVJST1JfUkVTRVQgIDB4MTAKKworLyogUmVnaXN0ZXIgYmxvY2sgMCAqLworCisvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUgSVJDQ19JSVIJCQkJCTB4MDEKKyNkZWZpbmUgICBJUkNDX0lJUl9BQ1RJVkVfRlJBTUUJCTB4ODAKKyNkZWZpbmUgICBJUkNDX0lJUl9FT00JCQkJMHg0MAorI2RlZmluZSAgIElSQ0NfSUlSX1JBV19NT0RFCQkJMHgyMAorI2RlZmluZSAgIElSQ0NfSUlSX0ZJRk8JCQkJMHgxMAorCisvKiBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIElSQ0NfSUVSCQkJCQkweDAyCisjZGVmaW5lICAgSVJDQ19JRVJfQUNUSVZFX0ZSQU1FCQkweDgwCisjZGVmaW5lICAgSVJDQ19JRVJfRU9NCQkJCTB4NDAKKyNkZWZpbmUgICBJUkNDX0lFUl9SQVdfTU9ERQkJCTB4MjAKKyNkZWZpbmUgICBJUkNDX0lFUl9GSUZPCQkJCTB4MTAKKworLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVJDQ19MU1IJCQkJCTB4MDMKKyNkZWZpbmUgICBJUkNDX0xTUl9VTkRFUlJVTgkJCTB4ODAKKyNkZWZpbmUgICBJUkNDX0xTUl9PVkVSUlVOCQkJMHg0MAorI2RlZmluZSAgIElSQ0NfTFNSX0ZSQU1FX0VSUk9SCQkweDIwCisjZGVmaW5lICAgSVJDQ19MU1JfU0laRV9FUlJPUgkJMHgxMAorI2RlZmluZSAgIElSQ0NfTFNSX0NSQ19FUlJPUgkJMHg4MAorI2RlZmluZSAgIElSQ0NfTFNSX0ZSQU1FX0FCT1JUCQkweDQwCisKKy8qIExpbmUgU3RhdHVzIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVJDQ19MU0FSCQkJCQkweDAzCisjZGVmaW5lIElSQ0NfTFNBUl9BRERSRVNTX01BU0sJCTB4MDcKKworLyogTGluZSBDb250cm9sIFJlZ2lzdGVyIEEgKi8KKyNkZWZpbmUgSVJDQ19MQ1JfQSAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSAgIElSQ0NfTENSX0FfRklGT19SRVNFVCAgICAweDgwCisjZGVmaW5lICAgSVJDQ19MQ1JfQV9GQVNUICAgICAgICAgIDB4NDAKKyNkZWZpbmUgICBJUkNDX0xDUl9BX0dQX0RBVEEgICAgICAgMHgyMAorI2RlZmluZSAgIElSQ0NfTENSX0FfUkFXX1RYICAgICAgICAweDEwCisjZGVmaW5lICAgSVJDQ19MQ1JfQV9SQVdfUlggICAgICAgIDB4MDgKKyNkZWZpbmUgICBJUkNDX0xDUl9BX0FCT1JUICAgICAgICAgMHgwNAorI2RlZmluZSAgIElSQ0NfTENSX0FfREFUQV9ET05FICAgICAweDAyCisKKy8qIExpbmUgQ29udHJvbCBSZWdpc3RlciBCICovCisjZGVmaW5lIElSQ0NfTENSX0IgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgICBJUkNDX0xDUl9CX1NDRV9ESVNBQkxFRCAgMHgwMAorI2RlZmluZSAgIElSQ0NfTENSX0JfU0NFX1RSQU5TTUlUICAweDQwCisjZGVmaW5lICAgSVJDQ19MQ1JfQl9TQ0VfUkVDRUlWRSAgIDB4ODAKKyNkZWZpbmUgICBJUkNDX0xDUl9CX1NDRV9VTkRFRklORUQgMHhjMAorI2RlZmluZSAgIElSQ0NfTENSX0JfU0lQX0VOQUJMRQkgICAweDIwCisjZGVmaW5lICAgSVJDQ19MQ1JfQl9CUklDS19XQUxMICAgIDB4MTAKKworLyogQnVzIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBJUkNDX0JTUiAgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lICAgSVJDQ19CU1JfTk9UX0VNUFRZCSAgIDB4ODAKKyNkZWZpbmUgICBJUkNDX0JTUl9GSUZPX0ZVTEwJICAgMHg0MAorI2RlZmluZSAgIElSQ0NfQlNSX1RJTUVPVVQJICAgMHgyMAorCisvKiBSZWdpc3RlciBibG9jayAxICovCisKKyNkZWZpbmUgSVJDQ19GSUZPX1RIUkVTSE9MRAkJCTB4MDIKKworI2RlZmluZSBJUkNDX1NDRV9DRkdBCQkJCTB4MDAKKyNkZWZpbmUgICBJUkNDX0NGR0FfQVVYX0lSCQkJMHg4MAorI2RlZmluZSAgIElSQ0NfQ0ZHQV9IQUxGX0RVUExFWAkJMHgwNAorI2RlZmluZSAgIElSQ0NfQ0ZHQV9UWF9QT0xBUklUWQkJMHgwMgorI2RlZmluZSAgIElSQ0NfQ0ZHQV9SWF9QT0xBUklUWQkJMHgwMQorCisjZGVmaW5lICAgSVJDQ19DRkdBX0NPTQkJCQkweDAwCisjZGVmaW5lCQlJUkNDX1NDRV9DRkdBX0JMT0NLX0NUUkxfQklUU19NQVNLCTB4ODcKKyNkZWZpbmUgICAJSVJDQ19DRkdBX0lSREFfU0lSX0EJMHgwOAorI2RlZmluZSAgIAlJUkNDX0NGR0FfQVNLX1NJUgkJMHgxMAorI2RlZmluZSAgIAlJUkNDX0NGR0FfSVJEQV9TSVJfQgkweDE4CisjZGVmaW5lICAgCUlSQ0NfQ0ZHQV9JUkRBX0hETEMJCTB4MjAKKyNkZWZpbmUJCUlSQ0NfQ0ZHQV9JUkRBXzRQUE0JCTB4MjgKKyNkZWZpbmUJCUlSQ0NfQ0ZHQV9DT05TVU1FUgkJMHgzMAorI2RlZmluZQkJSVJDQ19DRkdBX1JBV19JUgkJMHgzOAorI2RlZmluZSAgICAgSVJDQ19DRkdBX09USEVSCQkJMHg0MAorCisjZGVmaW5lIElSQ0NfSVJfSERMQyAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgSVJDQ19JUl80UFBNICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBJUkNDX0lSX0NPTlNVTUVSICAgICAgICAgICAweDAyCisKKyNkZWZpbmUgSVJDQ19TQ0VfQ0ZHQgkgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgSVJDQ19DRkdCX0xPT1BCQUNLICAgICAgICAgMHgyMAorI2RlZmluZSBJUkNDX0NGR0JfTFBCQ0tfVFhfQ1JDCSAgIDB4MTAKKyNkZWZpbmUgSVJDQ19DRkdCX05PV0FJVAkgICAweDA4CisjZGVmaW5lIElSQ0NfQ0ZHQl9TVFJJTkdfTU9WRQkgICAweDA0CisjZGVmaW5lIElSQ0NfQ0ZHQl9ETUFfQlVSU1QgCSAgIDB4MDIKKyNkZWZpbmUgSVJDQ19DRkdCX0RNQV9FTkFCTEUJICAgMHgwMQorCisjZGVmaW5lIElSQ0NfQ0ZHQl9NVVhfQ09NICAgICAgICAgIDB4MDAKKyNkZWZpbmUgSVJDQ19DRkdCX01VWF9JUiAgICAgICAgICAgMHg0MAorI2RlZmluZSBJUkNDX0NGR0JfTVVYX0FVWCAgICAgICAgICAweDgwCisjZGVmaW5lIElSQ0NfQ0ZHQl9NVVhfSU5BQ1RJVkUJICAgMHhjMAorCisvKiBSZWdpc3RlciBibG9jayAzIC0gSWRlbnRpZmljYXRpb24gUmVnaXN0ZXJzISAqLworI2RlZmluZSBJUkNDX0lEX0hJR0gJICAgICAgICAgICAweDAwICAgLyogMHgxMCAqLworI2RlZmluZSBJUkNDX0lEX0xPVwkgICAgICAgICAgIDB4MDEgICAvKiAweEI4ICovCisjZGVmaW5lIElSQ0NfQ0hJUF9JRCAJICAgICAgICAgICAweDAyICAgLyogMHhGMSAqLworI2RlZmluZSBJUkNDX1ZFUlNJT04JICAgICAgICAgICAweDAzICAgLyogMHgwMSAqLworI2RlZmluZSBJUkNDX0lOVEVSRkFDRQkgICAgICAgICAgIDB4MDQgICAvKiBsb3cgNCA9IERNQSwgaGlnaCA0ID0gSVJRICovCisjZGVmaW5lIAlJUkNDX0lOVEVSRkFDRV9ETUFfTUFTSwkweDBGICAgLyogbG93IDQgPSBETUEsIGhpZ2ggNCA9IElSUSAqLworI2RlZmluZSAJSVJDQ19JTlRFUkZBQ0VfSVJRX01BU0sJMHhGMCAgIC8qIGxvdyA0ID0gRE1BLCBoaWdoIDQgPSBJUlEgKi8KKworLyogUmVnaXN0ZXIgYmxvY2sgNCAtIElyREEgKi8KKyNkZWZpbmUgSVJDQ19DT05UUk9MICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBJUkNDX0JPRl9DT1VOVF9MTyAgICAgICAgICAweDAxIC8qIExvdyBieXRlICovCisjZGVmaW5lIElSQ0NfQk9GX0NPVU5UX0hJICAgICAgICAgIDB4MDAgLyogSGlnaCBuaWJibGUgKGJpdCAwLTMpICovCisjZGVmaW5lIElSQ0NfQlJJQ0tXQUxMX0NOVF9MTyAgICAgIDB4MDIgLyogTG93IGJ5dGUgKi8KKyNkZWZpbmUgSVJDQ19CUklDS1dBTExfQ05UX0hJICAgICAgMHgwMyAvKiBIaWdoIG5pYmJsZSAoYml0IDQtNykgKi8KKyNkZWZpbmUgSVJDQ19UWF9TSVpFX0xPICAgICAgICAgICAgMHgwNCAvKiBMb3cgYnl0ZSAqLworI2RlZmluZSBJUkNDX1RYX1NJWkVfSEkgICAgICAgICAgICAweDAzIC8qIEhpZ2ggbmliYmxlIChiaXQgMC0zKSAqLworI2RlZmluZSBJUkNDX1JYX1NJWkVfSEkgICAgICAgICAgICAweDA1IC8qIEhpZ2ggbmliYmxlIChiaXQgMC0zKSAqLworI2RlZmluZSBJUkNDX1JYX1NJWkVfTE8gICAgICAgICAgICAweDA2IC8qIExvdyBieXRlICovCisKKyNkZWZpbmUgSVJDQ18xMTUyICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBJUkNDX0NSQyAgICAgICAgICAgICAgICAgICAweDQwCisKKy8qIFJlZ2lzdGVyIGJsb2NrIDUgLSBJckRBICovCisjZGVmaW5lIElSQ0NfQVRDCQkJCQkweDAwCisjZGVmaW5lIAlJUkNDX0FUQ19uUFJPR1JFQURZCQkweDgwCisjZGVmaW5lIAlJUkNDX0FUQ19TUEVFRAkJCTB4NDAKKyNkZWZpbmUgCUlSQ0NfQVRDX0VOQUJMRQkJCTB4MjAKKyNkZWZpbmUgCUlSQ0NfQVRDX01BU0sJCQkweEUwCisKKworI2RlZmluZSBJUkNDX0lSSEFMRkRVUExFWF9USU1FT1VUCTB4MDEKKworI2RlZmluZSBJUkNDX1NDRV9UWF9ERUxBWV9USU1FUgkJMHgwMgorCisvKgorICogT3RoZXIgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIFNNU0NfSVJDQzJfTUFYX1NJUl9TUEVFRAkJMTE1MjAwCisjZGVmaW5lIFNNU0NfSVJDQzJfRklSX0NISVBfSU9fRVhURU5UIAk4CisjZGVmaW5lIFNNU0NfSVJDQzJfU0lSX0NISVBfSU9fRVhURU5UIAk4CisjZGVmaW5lIFNNU0NfSVJDQzJfRklGT19TSVpFCQkJMTYKKyNkZWZpbmUgU01TQ19JUkNDMl9GSUZPX1RIUkVTSE9MRAkJNjQKKy8qIE1heCBETUEgYnVmZmVyIHNpemUgbmVlZGVkID0gKGRhdGFfc2l6ZSArIDYpICogKHdpbmRvd19zaXplKSArIDY7ICovCisjZGVmaW5lIFNNU0NfSVJDQzJfUlhfQlVGRl9UUlVFU0laRQkJMTQzODQKKyNkZWZpbmUgU01TQ19JUkNDMl9UWF9CVUZGX1RSVUVTSVpFCQkxNDM4NAorI2RlZmluZSBTTVNDX0lSQ0MyX01JTl9UVVJOX1RJTUUJCTB4MDcKKyNkZWZpbmUgU01TQ19JUkNDMl9XSU5ET1dfU0laRQkJCTB4MDcKKy8qIE1heGltdW0gd2FpdCBmb3IgaHcgdHJhbnNtaXR0ZXIgdG8gZmluaXNoICovCisjZGVmaW5lIFNNU0NfSVJDQzJfSFdfVFJBTlNNSVRURVJfVElNRU9VVF9VUwkxMDAwCS8qIDEgbXMgKi8KKy8qIE1heGltdW0gd2FpdCBmb3IgQVRDIHRyYW5zY2VpdmVyIHByb2dyYW1taW5nIHRvIGZpbmlzaCAqLworI2RlZmluZSBTTVNDX0lSQ0MyX0FUQ19QUk9HUkFNTUlOR19USU1FT1VUX0pJRkZJRVMgMQorI2VuZGlmIC8qIFNNU0NfSVJDQzJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zbXNjLXNpby5oIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLXNpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTIwZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Ntc2Mtc2lvLmgKQEAgLTAsMCArMSwxMDAgQEAKKyNpZm5kZWYgU01TQ19TSU9fSAorI2RlZmluZSBTTVNDX1NJT19ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBLZXlzLiBUaGV5IHNob3VsZCB3b3JrIHdpdGggZXZlcnkgU01zQyBTSU8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU01TQ1NJT19DRkdBQ0NFU1NLRVkJCTB4NTUKKyNkZWZpbmUgU01TQ1NJT19DRkdFWElUS0VZCQkJMHhhYQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdlbmVyaWMgU0lPIEZsYXQgKCE/KSAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyogUmVnaXN0ZXIgMHgwZCAqLworI2RlZmluZSBTTVNDU0lPRkxBVF9ERVZJQ0VJRF9SRUcJCQkJMHgwZAorCisvKiBSZWdpc3RlciAweDBjICovCisjZGVmaW5lIFNNU0NTSU9GTEFUX1VBUlRNT0RFMENfUkVHCQkJCTB4MGMKKyNkZWZpbmUgCVNNU0NTSU9GTEFUX1VBUlQyTU9ERV9NQVNLCQkJMHgzOAorI2RlZmluZSAJU01TQ1NJT0ZMQVRfVUFSVDJNT0RFX1ZBTF9DT00JCTB4MDAKKyNkZWZpbmUgCVNNU0NTSU9GTEFUX1VBUlQyTU9ERV9WQUxfSVJEQQkJMHgwOAorI2RlZmluZSAJU01TQ1NJT0ZMQVRfVUFSVDJNT0RFX1ZBTF9BU0tJUgkJMHgxMAorCisvKiBSZWdpc3RlciAweDI1ICovCisjZGVmaW5lIFNNU0NTSU9GTEFUX1VBUlQyQkFTRUFERFJfUkVHCQkJMHgyNQorCisvKiBSZWdpc3RlciAweDJiICovCisjZGVmaW5lIFNNU0NTSU9GTEFUX0ZJUkJBU0VBRERSX1JFRwkJCQkweDJiCisKKy8qIFJlZ2lzdGVyIDB4MmMgKi8KKyNkZWZpbmUgU01TQ1NJT0ZMQVRfRklSRE1BU0VMRUNUX1JFRwkJCTB4MmMKKyNkZWZpbmUgCVNNU0NTSU9GTEFUX0ZJUkRNQVNFTEVDVF9NQVNLCQkweDBmCisKKy8qIFJlZ2lzdGVyIDB4MjggKi8KKyNkZWZpbmUgU01TQ1NJT0ZMQVRfVUFSVElSUVNFTEVDVF9SRUcJCQkweDI4CisjZGVmaW5lIAlTTVNDU0lPRkxBVF9VQVJUMklSUVNFTEVDVF9NQVNLCQkweDBmCisjZGVmaW5lIAlTTVNDU0lPRkxBVF9VQVJUMUlSUVNFTEVDVF9NQVNLCQkweGYwCisjZGVmaW5lIAlTTVNDU0lPRkxBVF9VQVJUSVJRU0VMRUNUX1ZBTF9OT05FCTB4MDAKKworCisvKioqKioqKioqKioqKioqKioqKioqCisgKiBMUEM0N04yMjcgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExQQzQ3TjIyN19DRkdBQ0NFU1NLRVkJCTB4NTUKKyNkZWZpbmUgTFBDNDdOMjI3X0NGR0VYSVRLRVkJCTB4YWEKKworLyogUmVnaXN0ZXIgMHgwMCAqLworI2RlZmluZSBMUEM0N04yMjdfRkRDUE9XRVJWQUxJRENPTkZfUkVHCQkweDAwCisjZGVmaW5lIAlMUEM0N04yMjdfRkRDUE9XRVJfTUFTSwkJCTB4MDgKKyNkZWZpbmUgCUxQQzQ3TjIyN19WQUxJRF9NQVNLCQkJCTB4ODAKKworLyogUmVnaXN0ZXIgMHgwMiAqLworI2RlZmluZSBMUEM0N04yMjdfVUFSVDEyUE9XRVJfUkVHCQkJCTB4MDIKKyNkZWZpbmUgCUxQQzQ3TjIyN19VQVJUMVBPV0VSRE9XTl9NQVNLCQkweDA4CisjZGVmaW5lIAlMUEM0N04yMjdfVUFSVDJQT1dFUkRPV05fTUFTSwkJMHg4MAorCisvKiBSZWdpc3RlciAweDA3ICovCisjZGVmaW5lIExQQzQ3TjIyN19BUE1CT09URFJJVkVfUkVHCQkJCTB4MDcKKyNkZWZpbmUgCUxQQzQ3TjIyN19QQVJQT1JUMkFVVE9QV1JET1dOX01BU0sJMHgxMCAvKiBhdXRvIHBvd2VyIGRvd24gb24gaWYgc2V0ICovCisjZGVmaW5lIAlMUEM0N04yMjdfVUFSVDJBVVRPUFdSRE9XTl9NQVNLCTB4MjAgLyogYXV0byBwb3dlciBkb3duIG9uIGlmIHNldCAqLworI2RlZmluZSAJTFBDNDdOMjI3X1VBUlQxQVVUT1BXUkRPV05fTUFTSwkweDQwIC8qIGF1dG8gcG93ZXIgZG93biBvbiBpZiBzZXQgKi8KKworLyogUmVnaXN0ZXIgMHgwYyAqLworI2RlZmluZSBMUEM0N04yMjdfVUFSVE1PREUwQ19SRUcJCQkJMHgwYworI2RlZmluZSAJTFBDNDdOMjI3X1VBUlQyTU9ERV9NQVNLCQkJMHgzOAorI2RlZmluZSAJTFBDNDdOMjI3X1VBUlQyTU9ERV9WQUxfQ09NCQkweDAwCisjZGVmaW5lIAlMUEM0N04yMjdfVUFSVDJNT0RFX1ZBTF9JUkRBCQkweDA4CisjZGVmaW5lIAlMUEM0N04yMjdfVUFSVDJNT0RFX1ZBTF9BU0tJUgkJMHgxMAorCisvKiBSZWdpc3RlciAweDBkICovCisjZGVmaW5lIExQQzQ3TjIyN19ERVZJQ0VJRF9SRUcJCQkJCTB4MGQKKyNkZWZpbmUgCUxQQzQ3TjIyN19ERVZJQ0VJRF9ERUZWQUwJCQkweDVhCisKKy8qIFJlZ2lzdGVyIDB4MGUgKi8KKyNkZWZpbmUgTFBDNDdOMjI3X1JFVklTSU9OSURfUkVHCQkJCTB4MGUKKworLyogUmVnaXN0ZXIgMHgyNSAqLworI2RlZmluZSBMUEM0N04yMjdfVUFSVDJCQVNFQUREUl9SRUcJCQkweDI1CisKKy8qIFJlZ2lzdGVyIDB4MjggKi8KKyNkZWZpbmUgTFBDNDdOMjI3X1VBUlRJUlFTRUxFQ1RfUkVHCQkJMHgyOAorI2RlZmluZSAJTFBDNDdOMjI3X1VBUlQySVJRU0VMRUNUX01BU0sJCTB4MGYKKyNkZWZpbmUgCUxQQzQ3TjIyN19VQVJUMUlSUVNFTEVDVF9NQVNLCQkweGYwCisjZGVmaW5lIAlMUEM0N04yMjdfVUFSVElSUVNFTEVDVF9WQUxfTk9ORQkweDAwCisKKy8qIFJlZ2lzdGVyIDB4MmIgKi8KKyNkZWZpbmUgTFBDNDdOMjI3X0ZJUkJBU0VBRERSX1JFRwkJCQkweDJiCisKKy8qIFJlZ2lzdGVyIDB4MmMgKi8KKyNkZWZpbmUgTFBDNDdOMjI3X0ZJUkRNQVNFTEVDVF9SRUcJCQkJMHgyYworI2RlZmluZSAJTFBDNDdOMjI3X0ZJUkRNQVNFTEVDVF9NQVNLCQkweDBmCisjZGVmaW5lIAlMUEM0N04yMjdfRklSRE1BU0VMRUNUX1ZBTF9ETUExCTB4MDEgLyogNDduMjI3IGhhcyB0aHJlZSBkbWEgY2hhbm5lbHMgKi8KKyNkZWZpbmUgCUxQQzQ3TjIyN19GSVJETUFTRUxFQ1RfVkFMX0RNQTIJMHgwMgorI2RlZmluZSAJTFBDNDdOMjI3X0ZJUkRNQVNFTEVDVF9WQUxfRE1BMwkweDAzCisjZGVmaW5lIAlMUEM0N04yMjdfRklSRE1BU0VMRUNUX1ZBTF9OT05FCTB4MGYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc3RpcjQyMDAuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc3RpcjQyMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2M2MDVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jCkBAIC0wLDAgKzEsMTE4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZpbGVuYW1lOiAgICAgIHN0aXI0MjAwLmMKKyogVmVyc2lvbjogICAgICAgMC40CisqIERlc2NyaXB0aW9uOiAgIElyZGEgU2lnbWFUZWwgVVNCIERvbmdsZQorKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwKKyogQXV0aG9yOiAgICAgICAgU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXJAb3NkbC5vcmc+CisqCisqICAJQmFzZWQgb24gZWFybGllciBkcml2ZXIgYnkgUGF1bCBTdGV3YXJ0IDxzdGV3YXJ0QHBhcmMuY29tPgorKgorKglDb3B5cmlnaHQgKEMpIDIwMDAsIFJvbWFuIFdlaXNzZ2FlcmJlciA8d2Vpc3NnQHZpZW5uYS5hdD4KKyoJQ29weXJpZ2h0IChDKSAyMDAxLCBEYWcgQnJhdHRsaSA8ZGFnQGJyYXR0bGkubmV0PgorKglDb3B5cmlnaHQgKEMpIDIwMDEsIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyoJQ29weXJpZ2h0IChDKSAyMDA0LCBTdGVwaGVuIEhlbW1pbmdlciA8c2hlbW1pbmdlckBvc2RsLm9yZz4KKyoKKyoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoaXMgZG9uZ2xlIGRvZXMgbm8gZnJhbWluZywgYW5kIHJlcXVpcmVzIHBvbGxpbmcgdG8gcmVjZWl2ZSB0aGUKKyAqIGRhdGEuICBUaGUgU1RJcjQyMDAgaGFzIGJ1bGsgaW4gYW5kIG91dCBlbmRwb2ludHMganVzdCBsaWtlCisgKiB1c3ItaXJkYSBkZXZpY2VzLCBidXQgdGhlIGRhdGEgaXQgc2VuZHMgYW5kIHJlY2VpdmVzIGlzIHJhdzsgbGlrZQorICogaXJ0dHksIGl0IG5lZWRzIHRvIGNhbGwgdGhlIHdyYXAgYW5kIHVud3JhcCBmdW5jdGlvbnMgdG8gYWRkIGFuZAorICogcmVtb3ZlIFNPRi9CT0YgYW5kIGVzY2FwZSBjaGFyYWN0ZXJzIHRvL2Zyb20gdGhlIGZyYW1lLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS93cmFwcGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvY3JjLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworTU9EVUxFX0FVVEhPUigiU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXJAb3NkbC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklyREEtVVNCIERvbmdsZSBEcml2ZXIgZm9yIFNpZ21hVGVsIFNUSXI0MjAwIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgcW9zX210dF9iaXRzID0gMHgwNzsJLyogMSBtcyBvciBtb3JlICovCittb2R1bGVfcGFyYW0ocW9zX210dF9iaXRzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhxb3NfbXR0X2JpdHMsICJNaW5pbXVtIFR1cm4gVGltZSIpOworCitzdGF0aWMgaW50IHJ4X3NlbnNpdGl2aXR5ID0gMTsJLyogRklSIDAuLjQsIFNJUiAwLi42ICovCittb2R1bGVfcGFyYW0ocnhfc2Vuc2l0aXZpdHksIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X3NlbnNpdGl2aXR5LCAiU2V0IFJlY2VpdmVyIHNlbnNpdGl2aXR5ICgwLTYsIDAgaXMgbW9zdCBzZW5zaXRpdmUpIik7CisKK3N0YXRpYyBpbnQgdHhfcG93ZXIgPSAwOwkvKiAwID0gaGlnaGVzdCAuLi4gMyA9IGxvd2VzdCAqLworbW9kdWxlX3BhcmFtKHR4X3Bvd2VyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0eF9wb3dlciwgIlNldCBUcmFuc21pdHRlciBwb3dlciAoMC0zLCAwIGlzIGhpZ2hlc3QgcG93ZXIpIik7CisKKyNkZWZpbmUgU1RJUl9JUkRBX0hFQURFUiAgCTQKKyNkZWZpbmUgQ1RSTF9USU1FT1VUCQkxMDAJICAgLyogbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIFRSQU5TTUlUX1RJTUVPVVQJMjAwCSAgIC8qIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBTVElSX0ZJRk9fU0laRQkJNDA5NgorI2RlZmluZSBGSUZPX1JFR1NfU0laRQkJMworCitlbnVtIEZpckNoYXJzIHsKKwlGSVJfQ0UgICA9IDB4N2QsCisJRklSX1hCT0YgPSAweDdmLAorCUZJUl9FT0YgID0gMHg3ZSwKK307CisKK2VudW0gU3RpclJlcXVlc3RzIHsKKwlSRVFfV1JJVEVfUkVHID0JCTB4MDAsCisJUkVRX1JFQURfUkVHID0JCTB4MDEsCisJUkVRX1JFQURfUk9NID0JCTB4MDIsCisJUkVRX1dSSVRFX1NJTkdMRSA9CTB4MDMsCit9OworCisvKiBSZWdpc3RlciBvZmZzZXRzICovCitlbnVtIFN0aXJSZWdzIHsKKwlSRUdfUlNWRD0wLAorCVJFR19NT0RFLAorCVJFR19QRENMSywKKwlSRUdfQ1RSTDEsCisJUkVHX0NUUkwyLAorCVJFR19GSUZPQ1RMLAorCVJFR19GSUZPTFNCLAorCVJFR19GSUZPTVNCLAorCVJFR19EUExMLAorCVJFR19JUkRJRywKKwlSRUdfVEVTVD0xNSwKK307CisKK2VudW0gU3Rpck1vZGVNYXNrIHsKKwlNT0RFX0ZJUiA9IDB4ODAsCisJTU9ERV9TSVIgPSAweDIwLAorCU1PREVfQVNLID0gMHgxMCwKKwlNT0RFX0ZBU1RSWCA9IDB4MDgsCisJTU9ERV9GRlJTVEVOID0gMHgwNCwKKwlNT0RFX05SRVNFVCA9IDB4MDIsCisJTU9ERV8yNDAwID0gMHgwMSwKK307CisKK2VudW0gU3RpclBkY2xrTWFzayB7CisJUERDTEtfNDAwMDAwMCA9IDB4MDIsCisJUERDTEtfMTE1MjAwID0gMHgwOSwKKwlQRENMS181NzYwMCA9IDB4MTMsCisJUERDTEtfMzg0MDAgPSAweDFELAorCVBEQ0xLXzE5MjAwID0gMHgzQiwKKwlQRENMS185NjAwID0gMHg3NywKKwlQRENMS18yNDAwID0gMHhERiwKK307CisKK2VudW0gU3RpckN0cmwxTWFzayB7CisJQ1RSTDFfU0RNT0RFID0gMHg4MCwKKwlDVFJMMV9SWFNMT1cgPSAweDQwLAorCUNUUkwxX1RYUFdEID0gMHgxMCwKKwlDVFJMMV9SWFBXRCA9IDB4MDgsCisJQ1RSTDFfU1JFU0VUID0gMHgwMSwKK307CisKK2VudW0gU3RpckN0cmwyTWFzayB7CisJQ1RSTDJfU1BXSURUSCA9IDB4MDgsCisJQ1RSTDJfUkVWSUQgPSAweDAzLAorfTsKKworZW51bSBTdGlyRmlmb0N0bE1hc2sgeworCUZJRk9DVExfRU9GID0gMHg4MCwKKwlGSUZPQ1RMX1VOREVSID0gMHg0MCwKKwlGSUZPQ1RMX09WRVIgPSAweDIwLAorCUZJRk9DVExfRElSID0gMHgxMCwKKwlGSUZPQ1RMX0NMUiA9IDB4MDgsCisJRklGT0NUTF9FTVBUWSA9IDB4MDQsCisJRklGT0NUTF9SWEVSUiA9IDB4MDIsCisJRklGT0NUTF9UWEVSUiA9IDB4MDEsCit9OworCitlbnVtIFN0aXJEaWFnTWFzayB7CisJSVJESUdfUlhISUdIID0gMHg4MCwKKwlJUkRJR19SWExPVyA9IDB4NDAsCit9OworCitlbnVtIFN0aXJUZXN0TWFzayB7CisJVEVTVF9QTExET1dOID0gMHg4MCwKKwlURVNUX0xPT1BJUiA9IDB4NDAsCisJVEVTVF9MT09QVVNCID0gMHgyMCwKKwlURVNUX1RTVEVOQSA9IDB4MTAsCisJVEVTVF9UU1RPU0MgPSAweDBGLAorfTsKKworc3RydWN0IHN0aXJfY2IgeworICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OyAgICAgIC8qIGluaXQ6IHByb2JlX2lyZGEgKi8KKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsgICAgICAvKiBuZXR3b3JrIGxheWVyICovCisgICAgICAgIHN0cnVjdCBpcmxhcF9jYiAgICppcmxhcDsgICAgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogbmV0d29yayBzdGF0aXN0aWNzICovCisgICAgICAgIHN0cnVjdCBxb3NfaW5mbyAgIHFvczsKKwl1bnNpZ25lZCAJICBzcGVlZDsJLyogQ3VycmVudCBzcGVlZCAqLworCisJd2FpdF9xdWV1ZV9oZWFkX3QgdGhyX3dhaXQ7CS8qIHRyYW5zbWl0IHRocmVhZCB3YWtldXAgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiB0aHJfZXhpdGVkOworCXBpZF90CQkgIHRocl9waWQ7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkgICp0eF9wZW5kaW5nOworCXZvaWQJCSAgKmlvX2J1ZjsJLyogdHJhbnNtaXQvcmVjZWl2ZSBidWZmZXIgKi8KKwlfX3U4CQkgICpmaWZvX3N0YXR1czsKKworCWlvYnVmZl90ICAJICByeF9idWZmOwkvKiByZWNlaXZlIHVud3JhcCBzdGF0ZSBtYWNoaW5lICovCisJc3RydWN0IHRpbWV2YWwJICByeF90aW1lOworCWludAkJICByZWNlaXZpbmc7CisJc3RydWN0IHVyYgkgKnJ4X3VyYjsKK307CisKKworLyogVGhlc2UgYXJlIHRoZSBjdXJyZW50bHkga25vd24gVVNCIGlkcyAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRvbmdsZXNbXSA9IHsKKyAgICAvKiBTaWdtYVRlbCwgSW5jLCAgU1RJcjQyMDAgSXJEQS9VU0IgQnJpZGdlICovCisgICAgeyBVU0JfREVWSUNFKDB4MDY2ZiwgMHg0MjAwKSB9LAorICAgIHsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRvbmdsZXMpOworCisvKiBTZW5kIGNvbnRyb2wgbWVzc2FnZSB0byBzZXQgZG9uZ2xlIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IHdyaXRlX3JlZyhzdHJ1Y3Qgc3Rpcl9jYiAqc3RpciwgX191MTYgcmVnLCBfX3U4IHZhbHVlKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBzdGlyLT51c2JkZXY7CisKKwlwcl9kZWJ1ZygiJXM6IHdyaXRlIHJlZyAlZCA9IDB4JXhcbiIsCisJCSBzdGlyLT5uZXRkZXYtPm5hbWUsIHJlZywgdmFsdWUpOworCXJldHVybiB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJCSAgICAgICBSRVFfV1JJVEVfU0lOR0xFLAorCQkJICAgICAgIFVTQl9ESVJfT1VUfFVTQl9UWVBFX1ZFTkRPUnxVU0JfUkVDSVBfREVWSUNFLAorCQkJICAgICAgIHZhbHVlLCByZWcsIE5VTEwsIDAsCisJCQkgICAgICAgQ1RSTF9USU1FT1VUKTsKK30KKworLyogU2VuZCBjb250cm9sIG1lc3NhZ2UgdG8gcmVhZCBtdWx0aXBsZSByZWdpc3RlcnMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJlYWRfcmVnKHN0cnVjdCBzdGlyX2NiICpzdGlyLCBfX3UxNiByZWcsCisJCSAgICBfX3U4ICpkYXRhLCBfX3UxNiBjb3VudCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gc3Rpci0+dXNiZGV2OworCisJcmV0dXJuIHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAorCQkJICAgICAgIFJFUV9SRUFEX1JFRywKKwkJCSAgICAgICBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCSAgICAgICAwLCByZWcsIGRhdGEsIGNvdW50LAorCQkJICAgICAgIENUUkxfVElNRU9VVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzZmlyKHUzMiBzcGVlZCkKK3sKKwlyZXR1cm4gKHNwZWVkID09IDQwMDAwMDApOworfQorCisvKgorICogUHJlcGFyZSBhIEZJUiBJckRBIGZyYW1lIGZvciB0cmFuc21pc3Npb24gdG8gdGhlIFVTQiBkb25nbGUuICBUaGUKKyAqIEZJUiB0cmFuc21pdCBmcmFtZSBpcyBkb2N1bWVudGVkIGluIHRoZSBkYXRhc2hlZXQuICBJdCBjb25zaXN0cyBvZgorICogYSB0d28gYnl0ZSAweDU1IDB4QUEgc2VxdWVuY2UsIHR3byBsaXR0bGUtZW5kaWFuIGxlbmd0aCBieXRlcywgYQorICogc2VxdWVuY2Ugb2YgZXhhY3RseSAxNiBYQk9GIGJ5dGVzIG9mIDB4N0UsIHR3byBCT0YgYnl0ZXMgb2YgMHg3RSwKKyAqIHRoZW4gdGhlIGRhdGEgZXNjYXBlZCBhcyBmb2xsb3dzOgorICoKKyAqICAgIDB4N0QgLT4gMHg3RCAweDVECisgKiAgICAweDdFIC0+IDB4N0QgMHg1RQorICogICAgMHg3RiAtPiAweDdEIDB4NUYKKyAqCisgKiBUaGVuLCA0IGJ5dGVzIG9mIGxpdHRsZSBlbmRpYW4gKHN0dWZmZWQpIEZDUyBmb2xsb3csIHRoZW4gdHdvCisgKiB0cmFpbGluZyBFT0YgYnl0ZXMgb2YgMHg3RS4KKyAqLworc3RhdGljIGlubGluZSBfX3U4ICpzdHVmZl9maXIoX191OCAqcCwgX191OCBjKQoreworCXN3aXRjaChjKSB7CisJY2FzZSAweDdkOgorCWNhc2UgMHg3ZToKKwljYXNlIDB4N2Y6CisJCSpwKysgPSAweDdkOworCQljIF49IElSREFfVFJBTlM7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCSpwKysgPSBjOworCX0KKwlyZXR1cm4gcDsKK30KKworLyogVGFrZSByYXcgZGF0YSBpbiBza2IgYW5kIHB1dCBpdCB3cmFwcGVkIGludG8gYnVmICovCitzdGF0aWMgdW5zaWduZWQgd3JhcF9maXJfc2tiKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIF9fdTggKmJ1ZikKK3sKKwlfX3U4ICpwdHIgPSBidWY7CisJX191MzIgZmNzID0gfihjcmMzMl9sZSh+MCwgc2tiLT5kYXRhLCBza2ItPmxlbikpOworCV9fdTE2IHdyYXBsZW47CisJaW50IGk7CisKKwkvKiBIZWFkZXIgKi8KKwlidWZbMF0gPSAweDU1OworCWJ1ZlsxXSA9IDB4QUE7CisKKwlwdHIgPSBidWYgKyBTVElSX0lSREFfSEVBREVSOworCW1lbXNldChwdHIsIDB4N2YsIDE2KTsKKwlwdHIgKz0gMTY7CisKKwkvKiBCT0YgKi8KKwkqcHRyKysgID0gMHg3ZTsKKwkqcHRyKysgID0gMHg3ZTsKKworCS8qIEFkZHJlc3MgLyBDb250cm9sIC8gSW5mb3JtYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2tiLT5sZW47IGkrKykKKwkJcHRyID0gc3R1ZmZfZmlyKHB0ciwgc2tiLT5kYXRhW2ldKTsKKworCS8qIEZDUyAqLworCXB0ciA9IHN0dWZmX2ZpcihwdHIsIGZjcyAmIDB4ZmYpOworCXB0ciA9IHN0dWZmX2ZpcihwdHIsIChmY3MgPj4gOCkgJiAweGZmKTsKKwlwdHIgPSBzdHVmZl9maXIocHRyLCAoZmNzID4+IDE2KSAmIDB4ZmYpOworCXB0ciA9IHN0dWZmX2ZpcihwdHIsIChmY3MgPj4gMjQpICYgMHhmZik7CisKKwkvKiBFT0ZzICovCisJKnB0cisrID0gMHg3ZTsKKwkqcHRyKysgPSAweDdlOworCisJLyogVG90YWwgbGVuZ3RoLCBtaW51cyB0aGUgaGVhZGVyICovCisJd3JhcGxlbiA9IChwdHIgLSBidWYpIC0gU1RJUl9JUkRBX0hFQURFUjsKKwlidWZbMl0gPSB3cmFwbGVuICYgMHhmZjsKKwlidWZbM10gPSAod3JhcGxlbiA+PiA4KSAmIDB4ZmY7CisKKwlyZXR1cm4gd3JhcGxlbiArIFNUSVJfSVJEQV9IRUFERVI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCB3cmFwX3Npcl9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191OCAqYnVmKQoreworCV9fdTE2IHdyYXBsZW47CisKKwl3cmFwbGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCBidWYgKyBTVElSX0lSREFfSEVBREVSLAorCQkJCSBTVElSX0ZJRk9fU0laRSAtIFNUSVJfSVJEQV9IRUFERVIpOworCWJ1ZlswXSA9IDB4NTU7CisJYnVmWzFdID0gMHhBQTsKKwlidWZbMl0gPSB3cmFwbGVuICYgMHhmZjsKKwlidWZbM10gPSAod3JhcGxlbiA+PiA4KSAmIDB4ZmY7CisKKwlyZXR1cm4gd3JhcGxlbiArIFNUSVJfSVJEQV9IRUFERVI7Cit9CisKKy8qCisgKiBGcmFtZSBpcyBmdWxseSBmb3JtZWQgaW4gdGhlIHJ4X2J1ZmYgc28gY2hlY2sgY3JjCisgKiBhbmQgcGFzcyB1cCB0byBpcmxhcAorICogc2V0dXAgZm9yIG5leHQgcmVjZWl2ZQorICovCitzdGF0aWMgdm9pZCBmaXJfZW9mKHN0cnVjdCBzdGlyX2NiICpzdGlyKQoreworCWlvYnVmZl90ICpyeF9idWZmID0gJnN0aXItPnJ4X2J1ZmY7CisJaW50IGxlbiA9IHJ4X2J1ZmYtPmxlbiAtIDQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5za2I7CisJX191MzIgZmNzOworCisJaWYgKHVubGlrZWx5KGxlbiA8PSAwKSkgeworCQlwcl9kZWJ1ZygiJXM6IHNob3J0IGZyYW1lIGxlbiAlZFxuIiwKKwkJCSBzdGlyLT5uZXRkZXYtPm5hbWUsIGxlbik7CisKKwkJKytzdGlyLT5zdGF0cy5yeF9lcnJvcnM7CisJCSsrc3Rpci0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJcmV0dXJuOworCX0KKworCWZjcyA9IH4oY3JjMzJfbGUofjAsIHJ4X2J1ZmYtPmRhdGEsIGxlbikpOworCWlmIChmY3MgIT0gbGUzMl90b19jcHUoZ2V0X3VuYWxpZ25lZCgodTMyICopKHJ4X2J1ZmYtPmRhdGErbGVuKSkpKSB7CisJCXByX2RlYnVnKCJjcmMgZXJyb3IgY2FsYyAweCV4IGxlbiAlZFxuIiwgZmNzLCBsZW4pOworCQlzdGlyLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJc3Rpci0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQlyZXR1cm47CisJfQorCisJLyogaWYgZnJhbWUgaXMgc2hvcnQgdGhlbiBqdXN0IGNvcHkgaXQgKi8KKwlpZiAobGVuIDwgSVJEQV9SWF9DT1BZX1RIUkVTSE9MRCkgeworCQluc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAxKTsKKwkJaWYgKHVubGlrZWx5KCFuc2tiKSkgeworCQkJKytzdGlyLT5zdGF0cy5yeF9kcm9wcGVkOworCQkJcmV0dXJuOworCQl9CisJCXNrYl9yZXNlcnZlKG5za2IsIDEpOworCQlza2IgPSBuc2tiOworCQltZW1jcHkobnNrYi0+ZGF0YSwgcnhfYnVmZi0+ZGF0YSwgbGVuKTsKKwl9IGVsc2UgeworCQluc2tiID0gZGV2X2FsbG9jX3NrYihyeF9idWZmLT50cnVlc2l6ZSk7CisJCWlmICh1bmxpa2VseSghbnNrYikpIHsKKwkJCSsrc3Rpci0+c3RhdHMucnhfZHJvcHBlZDsKKwkJCXJldHVybjsKKwkJfQorCQlza2JfcmVzZXJ2ZShuc2tiLCAxKTsKKwkJc2tiID0gcnhfYnVmZi0+c2tiOworCQlyeF9idWZmLT5za2IgPSBuc2tiOworCQlyeF9idWZmLT5oZWFkID0gbnNrYi0+ZGF0YTsKKwl9CisKKwlza2JfcHV0KHNrYiwgbGVuKTsKKworCXNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOworCXNrYi0+ZGV2ID0gc3Rpci0+bmV0ZGV2OworCisJbmV0aWZfcngoc2tiKTsKKworCXN0aXItPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlzdGlyLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisKKwlyeF9idWZmLT5kYXRhID0gcnhfYnVmZi0+aGVhZDsKKwlyeF9idWZmLT5sZW4gPSAwOworfQorCisvKiBVbndyYXAgRklSIHN0dWZmZWQgZGF0YSBhbmQgYnVtcCBpdCB0byBJckxBUCAqLworc3RhdGljIHZvaWQgc3Rpcl9maXJfY2hhcnMoc3RydWN0IHN0aXJfY2IgKnN0aXIsCisJCQkgICAgY29uc3QgX191OCAqYnl0ZXMsIGludCBsZW4pCit7CisJaW9idWZmX3QgKnJ4X2J1ZmYgPSAmc3Rpci0+cnhfYnVmZjsKKwlpbnQJaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlfX3U4CWJ5dGUgPSBieXRlc1tpXTsKKworCQlzd2l0Y2gocnhfYnVmZi0+c3RhdGUpIHsKKwkJY2FzZSBPVVRTSURFX0ZSQU1FOgorCQkJLyogaWdub3JlIGdhcmJhZ2UgdGlsbCBzdGFydCBvZiBmcmFtZSAqLworCQkJaWYgKHVubGlrZWx5KGJ5dGUgIT0gRklSX0VPRikpCisJCQkJY29udGludWU7CisJCQkvKiBOb3cgcmVjZWl2aW5nIGZyYW1lICovCisJCQlyeF9idWZmLT5zdGF0ZSA9IEJFR0lOX0ZSQU1FOworCisJCQkvKiBUaW1lIHRvIGluaXRpYWxpemUgcmVjZWl2ZSBidWZmZXIgKi8KKwkJCXJ4X2J1ZmYtPmRhdGEgPSByeF9idWZmLT5oZWFkOworCQkJcnhfYnVmZi0+bGVuID0gMDsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgTElOS19FU0NBUEU6CisJCQlpZiAoYnl0ZSA9PSBGSVJfRU9GKSB7CisJCQkJcHJfZGVidWcoIiVzOiBnb3QgRU9GIGFmdGVyIGVzY2FwZVxuIiwKKwkJCQkJIHN0aXItPm5ldGRldi0+bmFtZSk7CisJCQkJZ290byBmcmFtZV9lcnJvcjsKKwkJCX0KKwkJCXJ4X2J1ZmYtPnN0YXRlID0gSU5TSURFX0ZSQU1FOworCQkJYnl0ZSBePSBJUkRBX1RSQU5TOworCQkJYnJlYWs7CisKKwkJY2FzZSBCRUdJTl9GUkFNRToKKwkJCS8qIGlnbm9yZSBtdWx0aXBsZSBCT0YvRU9GICovCisJCQlpZiAoYnl0ZSA9PSBGSVJfRU9GKQorCQkJCWNvbnRpbnVlOworCQkJcnhfYnVmZi0+c3RhdGUgPSBJTlNJREVfRlJBTUU7CisJCQlyeF9idWZmLT5pbl9mcmFtZSA9IFRSVUU7CisKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIElOU0lERV9GUkFNRToKKwkJCXN3aXRjaChieXRlKSB7CisJCQljYXNlIEZJUl9DRToKKwkJCQlyeF9idWZmLT5zdGF0ZSA9IExJTktfRVNDQVBFOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSBGSVJfWEJPRjoKKwkJCQkvKiAweDdmIGlzIG5vdCB1c2VkIGluIHRoaXMgZnJhbWluZyAqLworCQkJCXByX2RlYnVnKCIlczogZ290IFhCT0Ygd2l0aG91dCBlc2NhcGVcbiIsCisJCQkJCSBzdGlyLT5uZXRkZXYtPm5hbWUpOworCQkJCWdvdG8gZnJhbWVfZXJyb3I7CisJCQljYXNlIEZJUl9FT0Y6CisJCQkJcnhfYnVmZi0+c3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCQkJCXJ4X2J1ZmYtPmluX2ZyYW1lID0gRkFMU0U7CisJCQkJZmlyX2VvZihzdGlyKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyogYWRkIGJ5dGUgdG8gcnggYnVmZmVyICovCisJCWlmICh1bmxpa2VseShyeF9idWZmLT5sZW4gPj0gcnhfYnVmZi0+dHJ1ZXNpemUpKSB7CisJCQlwcl9kZWJ1ZygiJXM6IGZpciBmcmFtZSBleGNlZWRzICVkXG4iLAorCQkJCSBzdGlyLT5uZXRkZXYtPm5hbWUsIHJ4X2J1ZmYtPnRydWVzaXplKTsKKwkJCSsrc3Rpci0+c3RhdHMucnhfb3Zlcl9lcnJvcnM7CisJCQlnb3RvIGVycm9yX3JlY292ZXJ5OworCQl9CisKKwkJcnhfYnVmZi0+ZGF0YVtyeF9idWZmLT5sZW4rK10gPSBieXRlOworCQljb250aW51ZTsKKworCWZyYW1lX2Vycm9yOgorCQkrK3N0aXItPnN0YXRzLnJ4X2ZyYW1lX2Vycm9yczsKKworCWVycm9yX3JlY292ZXJ5OgorCQkrK3N0aXItPnN0YXRzLnJ4X2Vycm9yczsKKwkJcnhfYnVmZi0+c3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCQlyeF9idWZmLT5pbl9mcmFtZSA9IEZBTFNFOworCX0KK30KKworLyogVW53cmFwIFNJUiBzdHVmZmVkIGRhdGEgYW5kIGJ1bXAgaXQgdXAgdG8gSXJMQVAgKi8KK3N0YXRpYyB2b2lkIHN0aXJfc2lyX2NoYXJzKHN0cnVjdCBzdGlyX2NiICpzdGlyLAorCQkJICAgIGNvbnN0IF9fdTggKmJ5dGVzLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlhc3luY191bndyYXBfY2hhcihzdGlyLT5uZXRkZXYsICZzdGlyLT5zdGF0cywKKwkJCQkgICZzdGlyLT5yeF9idWZmLCBieXRlc1tpXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bndyYXBfY2hhcnMoc3RydWN0IHN0aXJfY2IgKnN0aXIsCisJCQkJY29uc3QgX191OCAqYnl0ZXMsIGludCBsZW5ndGgpCit7CisJaWYgKGlzZmlyKHN0aXItPnNwZWVkKSkKKwkJc3Rpcl9maXJfY2hhcnMoc3RpciwgYnl0ZXMsIGxlbmd0aCk7CisJZWxzZQorCQlzdGlyX3Npcl9jaGFycyhzdGlyLCBieXRlcywgbGVuZ3RoKTsKK30KKworLyogTW9kZSBwYXJhbWV0ZXJzIGZvciBlYWNoIHNwZWVkICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCBzcGVlZDsKKwlfX3U4IHBkY2xrOworfSBzdGlyX21vZGVzW10gPSB7CisgICAgICAgIHsgMjQwMCwgICAgUERDTEtfMjQwMCB9LAorICAgICAgICB7IDk2MDAsICAgIFBEQ0xLXzk2MDAgfSwKKyAgICAgICAgeyAxOTIwMCwgICBQRENMS18xOTIwMCB9LAorICAgICAgICB7IDM4NDAwLCAgIFBEQ0xLXzM4NDAwIH0sCisgICAgICAgIHsgNTc2MDAsICAgUERDTEtfNTc2MDAgfSwKKyAgICAgICAgeyAxMTUyMDAsICBQRENMS18xMTUyMDAgfSwKKyAgICAgICAgeyA0MDAwMDAwLCBQRENMS180MDAwMDAwIH0sCit9OworCisKKy8qCisgKiBTZXR1cCBjaGlwIGZvciBzcGVlZC4KKyAqICBDYWxsZWQgYXQgc3RhcnR1cCB0byBpbml0aWFsaXplIHRoZSBjaGlwCisgKiAgYW5kIG9uIHNwZWVkIGNoYW5nZXMuCisgKgorICogTm90ZTogV3JpdGUgbXVsdGlwbGUgcmVnaXN0ZXJzIGRvZXNuJ3QgYXBwZWFyIHRvIHdvcmsKKyAqLworc3RhdGljIGludCBjaGFuZ2Vfc3BlZWQoc3RydWN0IHN0aXJfY2IgKnN0aXIsIHVuc2lnbmVkIHNwZWVkKQoreworCWludCBpLCBlcnI7CisJX191OCBtb2RlOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3Rpcl9tb2Rlcyk7ICsraSkgeworCQlpZiAoc3BlZWQgPT0gc3Rpcl9tb2Rlc1tpXS5zcGVlZCkKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJd2FybigiJXM6IGludmFsaWQgc3BlZWQgJWQiLCBzdGlyLT5uZXRkZXYtPm5hbWUsIHNwZWVkKTsKKwlyZXR1cm4gLUVJTlZBTDsKKworIGZvdW5kOgorCXByX2RlYnVnKCJzcGVlZCBjaGFuZ2UgZnJvbSAlZCB0byAlZFxuIiwgc3Rpci0+c3BlZWQsIHNwZWVkKTsKKworCS8qIFJlc2V0IG1vZHVsYXRvciAqLworCWVyciA9IHdyaXRlX3JlZyhzdGlyLCBSRUdfQ1RSTDEsIENUUkwxX1NSRVNFVCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBVbmRvY3VtZW50ZWQgbWFnaWMgdG8gdHdlYWsgdGhlIERQTEwgKi8KKwllcnIgPSB3cml0ZV9yZWcoc3RpciwgUkVHX0RQTEwsIDB4MTUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogU2V0IGNsb2NrICovCisJZXJyID0gd3JpdGVfcmVnKHN0aXIsIFJFR19QRENMSywgc3Rpcl9tb2Rlc1tpXS5wZGNsayk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwltb2RlID0gTU9ERV9OUkVTRVQgfCBNT0RFX0ZBU1RSWDsKKwlpZiAoaXNmaXIoc3BlZWQpKQorCQltb2RlIHw9IE1PREVfRklSIHwgTU9ERV9GRlJTVEVOOworCWVsc2UKKwkJbW9kZSB8PSBNT0RFX1NJUjsKKworCWlmIChzcGVlZCA9PSAyNDAwKQorCQltb2RlIHw9IE1PREVfMjQwMDsKKworCWVyciA9IHdyaXRlX3JlZyhzdGlyLCBSRUdfTU9ERSwgbW9kZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBUaGlzIHJlc2V0cyBURU1JQyBzdHlsZSB0cmFuc2NlaXZlciBpZiBhbnkuICovCisJZXJyID0gd3JpdGVfcmVnKHN0aXIsIFJFR19DVFJMMSwKKwkJCUNUUkwxX1NETU9ERSB8ICh0eF9wb3dlciAmIDMpIDw8IDEpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gd3JpdGVfcmVnKHN0aXIsIFJFR19DVFJMMSwgKHR4X3Bvd2VyICYgMykgPDwgMSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBSZXNldCBzZW5zaXRpdml0eSAqLworCWVyciA9IHdyaXRlX3JlZyhzdGlyLCBSRUdfQ1RSTDIsIChyeF9zZW5zaXRpdml0eSAmIDcpIDw8IDUpOworIG91dDoKKwlzdGlyLT5zcGVlZCA9IHNwZWVkOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSBuZXQvY29yZSB3aGVuIG5ldyBmcmFtZSBpcyBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbnQgc3Rpcl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgc3Rpcl9jYiAqc3RpciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwkvKiB0aGUgSVJEQSB3cmFwcGluZyByb3V0aW5lcyBkb24ndCBkZWFsIHdpdGggbm9uIGxpbmVhciBza2IgKi8KKwlTS0JfTElORUFSX0FTU0VSVChza2IpOworCisJc2tiID0geGNoZygmc3Rpci0+dHhfcGVuZGluZywgc2tiKTsKKwl3YWtlX3VwKCZzdGlyLT50aHJfd2FpdCk7CisJCisJLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIHVubGVzcyBzdG9wL3dha2V1cCBwcm9ibGVtICovCisJaWYgKHVubGlrZWx5KHNrYikpIHsKKwkJV0FSTl9PTigxKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogV2FpdCBmb3IgdGhlIHRyYW5zbWl0IEZJRk8gdG8gaGF2ZSBzcGFjZSBmb3IgbmV4dCBkYXRhCisgKgorICogSWYgc3BhY2UgPCAwIHRoZW4gd2FpdCB0aWxsIEZJRk8gY29tcGxldGVseSBkcmFpbnMuCisgKiBGWUk6IGNhbiB0YWtlIHVwIHRvIDEzIHNlY29uZHMgYXQgMjQwMGJhdWQuCisgKi8KK3N0YXRpYyBpbnQgZmlmb190eHdhaXQoc3RydWN0IHN0aXJfY2IgKnN0aXIsIGludCBzcGFjZSkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgY291bnQsIHN0YXR1czsKKworCS8qIFJlYWQgRklGTyBzdGF0dXMgYW5kIGNvdW50ICovCisJZm9yKDs7KSB7CisJCWVyciA9IHJlYWRfcmVnKHN0aXIsIFJFR19GSUZPQ1RMLCBzdGlyLT5maWZvX3N0YXR1cywgCisJCQkJICAgRklGT19SRUdTX1NJWkUpOworCQlpZiAodW5saWtlbHkoZXJyICE9IEZJRk9fUkVHU19TSVpFKSkgeworCQkJd2FybigiJXM6IEZJRk8gcmVnaXN0ZXIgcmVhZCBlcnJvcjogJWQiLCAKKwkJCSAgICAgc3Rpci0+bmV0ZGV2LT5uYW1lLCBlcnIpOworCisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJc3RhdHVzID0gc3Rpci0+Zmlmb19zdGF0dXNbMF07CisJCWNvdW50ID0gKHVuc2lnbmVkKShzdGlyLT5maWZvX3N0YXR1c1syXSAmIDB4MWYpIDw8IDggCisJCQl8IHN0aXItPmZpZm9fc3RhdHVzWzFdOworCisJCXByX2RlYnVnKCJmaWZvIHN0YXR1cyAweCVseCBjb3VudCAlbHVcbiIsIHN0YXR1cywgY291bnQpOworCisJCS8qIGVycm9yIHdoZW4gcmVjZWl2ZS90cmFuc21pdCBmaWZvIGdldHMgY29uZnVzZWQgKi8KKwkJaWYgKHN0YXR1cyAmIEZJRk9DVExfUlhFUlIpIHsKKwkJCXN0aXItPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQlzdGlyLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIEZJRk9DVExfVFhFUlIpIHsKKwkJCXN0aXItPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQlzdGlyLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogaXMgZmlmbyByZWNlaXZpbmcgYWxyZWFkeSwgb3IgZW1wdHkgKi8KKwkJaWYgKCEoc3RhdHVzICYgRklGT0NUTF9ESVIpCisJCSAgICB8fCAoc3RhdHVzICYgRklGT0NUTF9FTVBUWSkpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVJTlRSOworCisJCS8qIHNodXR0aW5nIGRvd24/ICovCisJCWlmICghbmV0aWZfcnVubmluZyhzdGlyLT5uZXRkZXYpCisJCSAgICB8fCAhbmV0aWZfZGV2aWNlX3ByZXNlbnQoc3Rpci0+bmV0ZGV2KSkKKwkJCXJldHVybiAtRVNIVVRET1dOOworCisJCS8qIG9ubHkgd2FpdGluZyBmb3Igc29tZSBzcGFjZSAqLworCQlpZiAoc3BhY2UgPj0gMCAmJiBTVElSX0ZJRk9fU0laRSAtIDQgPiBzcGFjZSArIGNvdW50KQorCQkJcmV0dXJuIDA7CisKKwkJLyogZXN0aW1hdGUgdHJhbnNmZXIgdGltZSBmb3IgcmVtYWluaW5nIGNoYXJzICovCisJCW1zbGVlcCgoY291bnQgKiA4MDAwKSAvIHN0aXItPnNwZWVkKTsKKwl9CisJCQkKKwllcnIgPSB3cml0ZV9yZWcoc3RpciwgUkVHX0ZJRk9DVEwsIEZJRk9DVExfQ0xSKTsKKwlpZiAoZXJyKSAKKwkJcmV0dXJuIGVycjsKKwllcnIgPSB3cml0ZV9yZWcoc3RpciwgUkVHX0ZJRk9DVEwsIDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBXYWl0IGZvciB0dXJuYXJvdW5kIGRlbGF5IGJlZm9yZSBzdGFydGluZyB0cmFuc21pdC4gICovCitzdGF0aWMgdm9pZCB0dXJuYXJvdW5kX2RlbGF5KGNvbnN0IHN0cnVjdCBzdGlyX2NiICpzdGlyLCBsb25nIHVzKQoreworCWxvbmcgdGlja3M7CisJc3RydWN0IHRpbWV2YWwgbm93OworCisJaWYgKHVzIDw9IDApCisJCXJldHVybjsKKworCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKwlpZiAobm93LnR2X3NlYyAtIHN0aXItPnJ4X3RpbWUudHZfc2VjID4gMCkKKwkJdXMgLT0gVVNFQ19QRVJfU0VDOworCXVzIC09IG5vdy50dl91c2VjIC0gc3Rpci0+cnhfdGltZS50dl91c2VjOworCWlmICh1cyA8IDEwKQorCQlyZXR1cm47CisKKwl0aWNrcyA9IHVzIC8gKDEwMDAwMDAgLyBIWik7CisJaWYgKHRpY2tzID4gMCkgeworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJc2NoZWR1bGVfdGltZW91dCgxICsgdGlja3MpOworCX0gZWxzZQorCQl1ZGVsYXkodXMpOworfQorCisvKgorICogU3RhcnQgcmVjZWl2ZXIgYnkgc3VibWl0dGluZyBhIHJlcXVlc3QgdG8gdGhlIHJlY2VpdmUgcGlwZS4KKyAqIElmIG5vdGhpbmcgaXMgYXZhaWxhYmxlIGl0IHdpbGwgcmV0dXJuIGFmdGVyIHJ4X2ludGVydmFsLgorICovCitzdGF0aWMgaW50IHJlY2VpdmVfc3RhcnQoc3RydWN0IHN0aXJfY2IgKnN0aXIpCit7CisJLyogcmVzZXQgc3RhdGUgKi8KKwlzdGlyLT5yZWNlaXZpbmcgPSAxOworCisJc3Rpci0+cnhfYnVmZi5pbl9mcmFtZSA9IEZBTFNFOworCXN0aXItPnJ4X2J1ZmYuc3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCisJc3Rpci0+cnhfdXJiLT5zdGF0dXMgPSAwOworCXJldHVybiB1c2Jfc3VibWl0X3VyYihzdGlyLT5yeF91cmIsIEdGUF9LRVJORUwpOworfQorCisvKiBTdG9wIGFsbCBwZW5kaW5nIHJlY2VpdmUgVXJiJ3MgKi8KK3N0YXRpYyB2b2lkIHJlY2VpdmVfc3RvcChzdHJ1Y3Qgc3Rpcl9jYiAqc3RpcikKK3sKKwlzdGlyLT5yZWNlaXZpbmcgPSAwOworCXVzYl9raWxsX3VyYihzdGlyLT5yeF91cmIpOworCisJaWYgKHN0aXItPnJ4X2J1ZmYuaW5fZnJhbWUpIAorCQlzdGlyLT5zdGF0cy5jb2xsaXNpb25zKys7Cit9CisvKgorICogV3JhcCBkYXRhIGluIHNvY2tldCBidWZmZXIgYW5kIHNlbmQgaXQuCisgKi8KK3N0YXRpYyB2b2lkIHN0aXJfc2VuZChzdHJ1Y3Qgc3Rpcl9jYiAqc3Rpciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCB3cmFwbGVuOworCWludCBmaXJzdF9mcmFtZSA9IDA7CisKKwkvKiBpZiByZWNlaXZpbmcsIG5lZWQgdG8gdHVybmFyb3VuZCAqLworCWlmIChzdGlyLT5yZWNlaXZpbmcpIHsKKwkJcmVjZWl2ZV9zdG9wKHN0aXIpOworCQl0dXJuYXJvdW5kX2RlbGF5KHN0aXIsIGlyZGFfZ2V0X210dChza2IpKTsKKwkJZmlyc3RfZnJhbWUgPSAxOworCX0KKworCWlmIChpc2ZpcihzdGlyLT5zcGVlZCkpCisJCXdyYXBsZW4gPSB3cmFwX2Zpcl9za2Ioc2tiLCBzdGlyLT5pb19idWYpOworCWVsc2UKKwkJd3JhcGxlbiA9IHdyYXBfc2lyX3NrYihza2IsIHN0aXItPmlvX2J1Zik7CisJCQorCS8qIGNoZWNrIGZvciBzcGFjZSBhdmFpbGFibGUgaW4gZmlmbyAqLworCWlmICghZmlyc3RfZnJhbWUpCisJCWZpZm9fdHh3YWl0KHN0aXIsIHdyYXBsZW4pOworCisJc3Rpci0+c3RhdHMudHhfcGFja2V0cysrOworCXN0aXItPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCXN0aXItPm5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXByX2RlYnVnKCJzZW5kICVkICglZClcbiIsIHNrYi0+bGVuLCB3cmFwbGVuKTsKKworCWlmICh1c2JfYnVsa19tc2coc3Rpci0+dXNiZGV2LCB1c2Jfc25kYnVsa3BpcGUoc3Rpci0+dXNiZGV2LCAxKSwKKwkJCSBzdGlyLT5pb19idWYsIHdyYXBsZW4sCisJCQkgTlVMTCwgVFJBTlNNSVRfVElNRU9VVCkpCisJCXN0aXItPnN0YXRzLnR4X2Vycm9ycysrOworfQorCisvKgorICogVHJhbnNtaXQgc3RhdGUgbWFjaGluZSB0aHJlYWQKKyAqLworc3RhdGljIGludCBzdGlyX3RyYW5zbWl0X3RocmVhZCh2b2lkICphcmcpCit7CisJc3RydWN0IHN0aXJfY2IgKnN0aXIgPSBhcmc7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHN0aXItPm5ldGRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJZGFlbW9uaXplKCIlcyIsIGRldi0+bmFtZSk7CisJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOworCisJd2hpbGUgKG5ldGlmX3J1bm5pbmcoZGV2KQorCSAgICAgICAmJiBuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpCisJICAgICAgICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwl7CisjaWZkZWYgQ09ORklHX1BNCisJCS8qIGlmIHN1c3BlbmRpbmcsIHRoZW4gcG93ZXIgb2ZmIGFuZCB3YWl0ICovCisJCWlmICh1bmxpa2VseShjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkpIHsKKwkJCWlmIChzdGlyLT5yZWNlaXZpbmcpCisJCQkJcmVjZWl2ZV9zdG9wKHN0aXIpOworCQkJZWxzZQorCQkJCWZpZm9fdHh3YWl0KHN0aXIsIC0xKTsKKworCQkJd3JpdGVfcmVnKHN0aXIsIFJFR19DVFJMMSwgQ1RSTDFfVFhQV0R8Q1RSTDFfUlhQV0QpOworCisJCQlyZWZyaWdlcmF0b3IoUEZfRlJFRVpFKTsKKworCQkJaWYgKGNoYW5nZV9zcGVlZChzdGlyLCBzdGlyLT5zcGVlZCkpCisJCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisJCS8qIGlmIHNvbWV0aGluZyB0byBzZW5kPyAqLworCQlza2IgPSB4Y2hnKCZzdGlyLT50eF9wZW5kaW5nLCBOVUxMKTsKKwkJaWYgKHNrYikgeworCQkJdW5zaWduZWQgbmV3X3NwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJCQlpZiAoc2tiLT5sZW4gPiAwKQorCQkJCXN0aXJfc2VuZChzdGlyLCBza2IpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCisJCQlpZiAoKG5ld19zcGVlZCAhPSAtMSkgJiYgKHN0aXItPnNwZWVkICE9IG5ld19zcGVlZCkpIHsKKwkJCQlpZiAoZmlmb190eHdhaXQoc3RpciwgLTEpIHx8CisJCQkJICAgIGNoYW5nZV9zcGVlZChzdGlyLCBuZXdfc3BlZWQpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogbm90aGluZyB0byBzZW5kPyBzdGFydCByZWNlaXZpbmcgKi8KKwkJaWYgKCFzdGlyLT5yZWNlaXZpbmcgCisJCSAgICAmJiBpcmRhX2RldmljZV90eHF1ZXVlX2VtcHR5KGRldikpIHsKKwkJCS8qIFdhaXQgb3RoZXJ3aXNlIGNoaXAgZ2V0cyBjb25mdXNlZC4gKi8KKwkJCWlmIChmaWZvX3R4d2FpdChzdGlyLCAtMSkpCisJCQkJYnJlYWs7CisKKwkJCWlmICh1bmxpa2VseShyZWNlaXZlX3N0YXJ0KHN0aXIpKSkgeworCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJCWluZm8oIiVzOiByZWNlaXZlIHVzYiBzdWJtaXQgZmFpbGVkIiwKKwkJCQkJICAgICBzdGlyLT5uZXRkZXYtPm5hbWUpOworCQkJCXN0aXItPnJlY2VpdmluZyA9IDA7CisJCQkJbXNsZWVwKDEwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qIHNsZWVwIGlmIG5vdGhpbmcgdG8gc2VuZCAqLworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc3Rpci0+dGhyX3dhaXQsIHN0aXItPnR4X3BlbmRpbmcpOworCX0KKworCWNvbXBsZXRlX2FuZF9leGl0ICgmc3Rpci0+dGhyX2V4aXRlZCwgMCk7Cit9CisKKworLyoKKyAqIFVTQiBidWxrIHJlY2VpdmUgY29tcGxldGlvbiBjYWxsYmFjay4KKyAqIFdha2VzIHVwIGV2ZXJ5IG1zICh1c2Igcm91bmQgdHJpcCkgd2l0aCB3cmFwcGVkIAorICogZGF0YS4KKyAqLworc3RhdGljIHZvaWQgc3Rpcl9yY3ZfaXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHN0aXJfY2IgKnN0aXIgPSB1cmItPmNvbnRleHQ7CisJaW50IGVycjsKKworCS8qIGluIHByb2Nlc3Mgb2Ygc3RvcHBpbmcsIGp1c3QgZHJvcCBkYXRhICovCisJaWYgKCFuZXRpZl9ydW5uaW5nKHN0aXItPm5ldGRldikpCisJCXJldHVybjsKKworCS8qIHVubGluaywgc2h1dGRvd24sIHVucGx1Zywgb3RoZXIgbmFzdGllcyAqLworCWlmICh1cmItPnN0YXR1cyAhPSAwKSAKKwkJcmV0dXJuOworCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApIHsKKwkJcHJfZGVidWcoInJlY2VpdmUgJWRcbiIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCXVud3JhcF9jaGFycyhzdGlyLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCSAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCisJCXN0aXItPm5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCWRvX2dldHRpbWVvZmRheSgmc3Rpci0+cnhfdGltZSk7CisJfQorCisJLyoga2VybmVsIHRocmVhZCBpcyBzdG9wcGluZyByZWNlaXZlciBkb24ndCByZXN1Ym1pdCAqLworCWlmICghc3Rpci0+cmVjZWl2aW5nKQorCQlyZXR1cm47CisKKwkvKiByZXN1Ym1pdCBleGlzdGluZyB1cmIgKi8KKwllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCisJLyogaW4gY2FzZSBvZiBlcnJvciwgdGhlIGtlcm5lbCB0aHJlYWQgd2lsbCByZXN0YXJ0IHVzICovCisJaWYgKGVycikgeworCQl3YXJuKCIlczogdXNiIHJlY2VpdmUgc3VibWl0IGVycm9yOiAlZCIsCisJCQlzdGlyLT5uZXRkZXYtPm5hbWUsIGVycik7CisJCXN0aXItPnJlY2VpdmluZyA9IDA7CisJCXdha2VfdXAoJnN0aXItPnRocl93YWl0KTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzdGlyX25ldF9vcGVuIChkZXYpCisgKgorICogICAgTmV0d29yayBkZXZpY2UgaXMgdGFrZW4gdXAuIFVzdWFsbHkgdGhpcyBpcyBkb25lIGJ5ICJpZmNvbmZpZyBpcmRhMCB1cCIKKyAqLworc3RhdGljIGludCBzdGlyX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IHN0aXJfY2IgKnN0aXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBlcnI7CisJY2hhciBod25hbWVbMTZdOworCisJZXJyID0gdXNiX2NsZWFyX2hhbHQoc3Rpci0+dXNiZGV2LCB1c2Jfc25kYnVsa3BpcGUoc3Rpci0+dXNiZGV2LCAxKSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0MTsKKwllcnIgPSB1c2JfY2xlYXJfaGFsdChzdGlyLT51c2JkZXYsIHVzYl9yY3ZidWxrcGlwZShzdGlyLT51c2JkZXYsIDIpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQxOworCisJZXJyID0gY2hhbmdlX3NwZWVkKHN0aXIsIDk2MDApOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDE7CisKKwllcnIgPSAtRU5PTUVNOworCisJLyogSW5pdGlhbGl6ZSBmb3IgU0lSL0ZJUiB0byBjb3B5IGRhdGEgZGlyZWN0bHkgaW50byBza2IuICAqLworCXN0aXItPnJlY2VpdmluZyA9IDA7CisJc3Rpci0+cnhfYnVmZi50cnVlc2l6ZSA9IElSREFfU0tCX01BWF9NVFU7CisJc3Rpci0+cnhfYnVmZi5za2IgPSBkZXZfYWxsb2Nfc2tiKElSREFfU0tCX01BWF9NVFUpOworCWlmICghc3Rpci0+cnhfYnVmZi5za2IpIAorCQlnb3RvIGVycl9vdXQxOworCisJc2tiX3Jlc2VydmUoc3Rpci0+cnhfYnVmZi5za2IsIDEpOworCXN0aXItPnJ4X2J1ZmYuaGVhZCA9IHN0aXItPnJ4X2J1ZmYuc2tiLT5kYXRhOworCWRvX2dldHRpbWVvZmRheSgmc3Rpci0+cnhfdGltZSk7CisKKwlzdGlyLT5yeF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghc3Rpci0+cnhfdXJiKSAKKwkJZ290byBlcnJfb3V0MjsKKworCXN0aXItPmlvX2J1ZiA9IGttYWxsb2MoU1RJUl9GSUZPX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghc3Rpci0+aW9fYnVmKQorCQlnb3RvIGVycl9vdXQzOworCisJdXNiX2ZpbGxfYnVsa191cmIoc3Rpci0+cnhfdXJiLCBzdGlyLT51c2JkZXYsCisJCQkgIHVzYl9yY3ZidWxrcGlwZShzdGlyLT51c2JkZXYsIDIpLAorCQkJICBzdGlyLT5pb19idWYsIFNUSVJfRklGT19TSVpFLAorCQkJICBzdGlyX3Jjdl9pcnEsIHN0aXIpOworCisJc3Rpci0+Zmlmb19zdGF0dXMgPSBrbWFsbG9jKEZJRk9fUkVHU19TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0aXItPmZpZm9fc3RhdHVzKSAKKwkJZ290byBlcnJfb3V0NDsKKwkJCisJLyoKKwkgKiBOb3cgdGhhdCBldmVyeXRoaW5nIHNob3VsZCBiZSBpbml0aWFsaXplZCBwcm9wZXJseSwKKwkgKiBPcGVuIG5ldyBJckxBUCBsYXllciBpbnN0YW5jZSB0byB0YWtlIGNhcmUgb2YgdXMuLi4KKwkgKiBOb3RlIDogd2lsbCBzZW5kIGltbWVkaWF0ZWx5IGEgc3BlZWQgY2hhbmdlLi4uCisJICovCisJc3ByaW50Zihod25hbWUsICJ1c2IjJWQiLCBzdGlyLT51c2JkZXYtPmRldm51bSk7CisJc3Rpci0+aXJsYXAgPSBpcmxhcF9vcGVuKG5ldGRldiwgJnN0aXItPnFvcywgaHduYW1lKTsKKwlpZiAoIXN0aXItPmlybGFwKSB7CisJCWVycigic3RpcjQyMDA6IGlybGFwX29wZW4gZmFpbGVkIik7CisJCWdvdG8gZXJyX291dDU7CisJfQorCisJLyoqIFN0YXJ0IGtlcm5lbCB0aHJlYWQgZm9yIHRyYW5zbWl0LiAgKi8KKwlzdGlyLT50aHJfcGlkID0ga2VybmVsX3RocmVhZChzdGlyX3RyYW5zbWl0X3RocmVhZCwgc3RpciwKKwkJCQkgICAgICBDTE9ORV9GU3xDTE9ORV9GSUxFUyk7CisJaWYgKHN0aXItPnRocl9waWQgPCAwKSB7CisJCWVyciA9IHN0aXItPnRocl9waWQ7CisJCWVycigic3RpcjQyMDA6IHVuYWJsZSB0byBzdGFydCBrZXJuZWwgdGhyZWFkIik7CisJCWdvdG8gZXJyX291dDY7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKworCXJldHVybiAwOworCisgZXJyX291dDY6CisJaXJsYXBfY2xvc2Uoc3Rpci0+aXJsYXApOworIGVycl9vdXQ1OgorCWtmcmVlKHN0aXItPmZpZm9fc3RhdHVzKTsKKyBlcnJfb3V0NDoKKwlrZnJlZShzdGlyLT5pb19idWYpOworIGVycl9vdXQzOgorCXVzYl9mcmVlX3VyYihzdGlyLT5yeF91cmIpOworIGVycl9vdXQyOgorCWtmcmVlX3NrYihzdGlyLT5yeF9idWZmLnNrYik7CisgZXJyX291dDE6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHN0aXJfbmV0X2Nsb3NlIChzdGlyKQorICoKKyAqICAgIE5ldHdvcmsgZGV2aWNlIGlzIHRha2VuIGRvd24uIFVzdWFsbHkgdGhpcyBpcyBkb25lIGJ5CisgKiAgICAiaWZjb25maWcgaXJkYTAgZG93biIKKyAqLworc3RhdGljIGludCBzdGlyX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBzdGlyX2NiICpzdGlyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIFN0b3AgdHJhbnNtaXQgcHJvY2Vzc2luZyAqLworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCS8qIEtpbGwgdHJhbnNtaXQgdGhyZWFkICovCisJa2lsbF9wcm9jKHN0aXItPnRocl9waWQsIFNJR1RFUk0sIDEpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnN0aXItPnRocl9leGl0ZWQpOworCWtmcmVlKHN0aXItPmZpZm9fc3RhdHVzKTsKKworCS8qIE1vcCB1cCByZWNlaXZlIHVyYidzICovCisJdXNiX2tpbGxfdXJiKHN0aXItPnJ4X3VyYik7CisJCisJa2ZyZWUoc3Rpci0+aW9fYnVmKTsKKwl1c2JfZnJlZV91cmIoc3Rpci0+cnhfdXJiKTsKKwlrZnJlZV9za2Ioc3Rpci0+cnhfYnVmZi5za2IpOworCisJLyogU3RvcCBhbmQgcmVtb3ZlIGluc3RhbmNlIG9mIElyTEFQICovCisJaWYgKHN0aXItPmlybGFwKQorCQlpcmxhcF9jbG9zZShzdGlyLT5pcmxhcCk7CisKKwlzdGlyLT5pcmxhcCA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElPQ1RMcyA6IEV4dHJhIG91dC1vZi1iYW5kIG5ldHdvcmsgY29tbWFuZHMuLi4KKyAqLworc3RhdGljIGludCBzdGlyX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3Qgc3Rpcl9jYiAqc3RpciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ1NCQU5EV0lEVEg6IC8qIFNldCBiYW5kd2lkdGggKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQkvKiBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIHN0aWxsIHRoZXJlICovCisJCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChzdGlyLT5uZXRkZXYpKQorCQkJcmV0ID0gY2hhbmdlX3NwZWVkKHN0aXIsIGlycS0+aWZyX2JhdWRyYXRlKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTTUVESUFCVVNZOiAvKiBTZXQgbWVkaWEgYnVzeSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCS8qIENoZWNrIGlmIHRoZSBJckRBIHN0YWNrIGlzIHN0aWxsIHRoZXJlICovCisJCWlmIChuZXRpZl9ydW5uaW5nKHN0aXItPm5ldGRldikpCisJCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzdGlyLT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dSRUNFSVZJTkc6CisJCS8qIE9ubHkgYXBwcm94aW1hdGVseSB0cnVlICovCisJCWlycS0+aWZyX3JlY2VpdmluZyA9IHN0aXItPnJlY2VpdmluZzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogR2V0IGRldmljZSBzdGF0cyAoZm9yIC9wcm9jL25ldC9kZXYgYW5kIGlmY29uZmlnKQorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0aXJfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBzdGlyX2NiICpzdGlyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlyZXR1cm4gJnN0aXItPnN0YXRzOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgVVNCIHN1YnN5c3RlbSBmb3IgZWFjaCBuZXcgZGV2aWNlCisgKiBpbiB0aGUgc3lzdGVtLiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgb3VycywgYW5kIGluCisgKiB0aGlzIGNhc2Ugc3RhcnQgaGFuZGxpbmcgaXQuCisgKiBOb3RlIDogaXQgbWlnaHQgYmUgd29ydGggcHJvdGVjdGluZyB0aGlzIGZ1bmN0aW9uIGJ5IGEgZ2xvYmFsCisgKiBzcGlubG9jay4uLiBPciBub3QsIGJlY2F1c2UgbWF5YmUgVVNCIGFscmVhZHkgZGVhbCB3aXRoIHRoYXQuLi4KKyAqLworc3RhdGljIGludCBzdGlyX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHN0aXJfY2IgKnN0aXIgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQ7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwkvKiBBbGxvY2F0ZSBuZXR3b3JrIGRldmljZSBjb250YWluZXIuICovCisJbmV0ID0gYWxsb2NfaXJkYWRldihzaXplb2YoKnN0aXIpKTsKKwlpZighbmV0KQorCQlnb3RvIGVycl9vdXQxOworCisJU0VUX01PRFVMRV9PV05FUihuZXQpOworCVNFVF9ORVRERVZfREVWKG5ldCwgJmludGYtPmRldik7CisJc3RpciA9IG5ldGRldl9wcml2KG5ldCk7CisJc3Rpci0+bmV0ZGV2ID0gbmV0OworCXN0aXItPnVzYmRldiA9IGRldjsKKworCXJldCA9IHVzYl9yZXNldF9jb25maWd1cmF0aW9uKGRldik7CisJaWYgKHJldCAhPSAwKSB7CisJCWVycigic3RpcjQyMDA6IHVzYiByZXNldCBjb25maWd1cmF0aW9uIGZhaWxlZCIpOworCQlnb3RvIGVycl9vdXQyOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIlNpZ21hVGVsIFNUSXI0MjAwIElSREEvVVNCIGZvdW5kIGF0IGFkZHJlc3MgJWQsICIKKwkJIlZlbmRvcjogJXgsIFByb2R1Y3Q6ICV4XG4iLAorCSAgICAgICBkZXYtPmRldm51bSwgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkgICAgICAgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOworCisJLyogSW5pdGlhbGl6ZSBRb1MgZm9yIHRoaXMgZGV2aWNlICovCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc3Rpci0+cW9zKTsKKworCS8qIFRoYXQncyB0aGUgUnggY2FwYWJpbGl0eS4gKi8KKwlzdGlyLT5xb3MuYmF1ZF9yYXRlLmJpdHMgICAgICAgJj0gSVJfMjQwMCB8IElSXzk2MDAgfCBJUl8xOTIwMCB8CisJCQkJCSBJUl8zODQwMCB8IElSXzU3NjAwIHwgSVJfMTE1MjAwIHwKKwkJCQkJIChJUl80MDAwMDAwIDw8IDgpOworCXN0aXItPnFvcy5taW5fdHVybl90aW1lLmJpdHMgICAmPSBxb3NfbXR0X2JpdHM7CisJaXJkYV9xb3NfYml0c190b192YWx1ZSgmc3Rpci0+cW9zKTsKKworCWluaXRfY29tcGxldGlvbiAoJnN0aXItPnRocl9leGl0ZWQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZzdGlyLT50aHJfd2FpdCk7CisKKwkvKiBPdmVycmlkZSB0aGUgbmV0d29yayBmdW5jdGlvbnMgd2UgbmVlZCB0byB1c2UgKi8KKwluZXQtPmhhcmRfc3RhcnRfeG1pdCA9IHN0aXJfaGFyZF94bWl0OworCW5ldC0+b3BlbiAgICAgICAgICAgID0gc3Rpcl9uZXRfb3BlbjsKKwluZXQtPnN0b3AgICAgICAgICAgICA9IHN0aXJfbmV0X2Nsb3NlOworCW5ldC0+Z2V0X3N0YXRzCSAgICAgPSBzdGlyX25ldF9nZXRfc3RhdHM7CisJbmV0LT5kb19pb2N0bCAgICAgICAgPSBzdGlyX25ldF9pb2N0bDsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZXQpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBlcnJfb3V0MjsKKworCWluZm8oIklyREE6IFJlZ2lzdGVyZWQgU2lnbWFUZWwgZGV2aWNlICVzIiwgbmV0LT5uYW1lKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50Ziwgc3Rpcik7CisKKwlyZXR1cm4gMDsKKworZXJyX291dDI6CisJZnJlZV9uZXRkZXYobmV0KTsKK2Vycl9vdXQxOgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGUgY3VycmVudCBkZXZpY2UgaXMgcmVtb3ZlZCwgdGhlIFVTQiBsYXllciB0ZWxsIHVzIHRvIHNodXQgaXQgZG93bi4uLgorICovCitzdGF0aWMgdm9pZCBzdGlyX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHN0aXJfY2IgKnN0aXIgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJaWYgKCFzdGlyKQorCQlyZXR1cm47CisKKwl1bnJlZ2lzdGVyX25ldGRldihzdGlyLT5uZXRkZXYpOworCWZyZWVfbmV0ZGV2KHN0aXItPm5ldGRldik7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisvKiBQb3dlciBtYW5hZ2VtZW50IHN1c3BlbmQsIHNvIHBvd2VyIG9mZiB0aGUgdHJhbnNtaXR0ZXIvcmVjZWl2ZXIgKi8KK3N0YXRpYyBpbnQgc3Rpcl9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCB1MzIgc3RhdGUpCit7CisJc3RydWN0IHN0aXJfY2IgKnN0aXIgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChzdGlyLT5uZXRkZXYpOworCXJldHVybiAwOworfQorCisvKiBDb21pbmcgb3V0IG9mIHN1c3BlbmQsIHNvIHJlc2V0IGhhcmR3YXJlICovCitzdGF0aWMgaW50IHN0aXJfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBzdGlyX2NiICpzdGlyID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCW5ldGlmX2RldmljZV9hdHRhY2goc3Rpci0+bmV0ZGV2KTsKKworCS8qIHJlY2VpdmVyIHJlc3RhcnRlZCB3aGVuIHNlbmQgdGhyZWFkIHdha2VzIHVwICovCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoKKyAqIFVTQiBkZXZpY2UgY2FsbGJhY2tzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBpcmRhX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInN0aXI0MjAwIiwKKwkucHJvYmUJCT0gc3Rpcl9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IHN0aXJfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUJPSBkb25nbGVzLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gc3Rpcl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc3Rpcl9yZXN1bWUsCisjZW5kaWYKK307CisKKy8qCisgKiBNb2R1bGUgaW5zZXJ0aW9uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHN0aXJfaW5pdCh2b2lkKQoreworCXJldHVybiB1c2JfcmVnaXN0ZXIoJmlyZGFfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHN0aXJfaW5pdCk7CisKKy8qCisgKiBNb2R1bGUgcmVtb3ZhbAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgc3Rpcl9jbGVhbnVwKHZvaWQpCit7CisJLyogRGVyZWdpc3RlciB0aGUgZHJpdmVyIGFuZCByZW1vdmUgYWxsIHBlbmRpbmcgaW5zdGFuY2VzICovCisJdXNiX2RlcmVnaXN0ZXIoJmlyZGFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHN0aXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Rla3JhbS1zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvdGVrcmFtLXNpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDZiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Rla3JhbS1zaXIuYwpAQCAtMCwwICsxLDIzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICB0ZWtyYW0uYworICogVmVyc2lvbjogICAgICAgMS4zCisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGVrcmFtIElyTWF0ZSBJUi0yMTBCIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgV2VkIE9jdCAyMSAyMDowMjozNSAxOTk4CisgKiBNb2RpZmllZCBhdDogICBTdW4gT2N0IDI3IDIyOjAyOjM4IDIwMDIKKyAqIE1vZGlmaWVkIGJ5OiAgIE1hcnRpbiBEaWVobCA8bWFkQG1kaWVobC5kZT4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpLAorICogICAgIENvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwsCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKK3N0YXRpYyBpbnQgdGVrcmFtX2RlbGF5ID0gMTUwOwkJLyogZGVmYXVsdCBpcyAxNTAgbXMgKi8KK21vZHVsZV9wYXJhbSh0ZWtyYW1fZGVsYXksIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRla3JhbV9kZWxheSwgInRla3JhbSBkb25nbGUgd3JpdGUgY29tcGxldGUgZGVsYXkiKTsKKworc3RhdGljIGludCB0ZWtyYW1fb3BlbihzdHJ1Y3Qgc2lyX2RldiAqKTsKK3N0YXRpYyBpbnQgdGVrcmFtX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICopOworc3RhdGljIGludCB0ZWtyYW1fY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICosIHVuc2lnbmVkKTsKK3N0YXRpYyBpbnQgdGVrcmFtX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICopOworCisjZGVmaW5lIFRFS1JBTV8xMTUyMDAgMHgwMAorI2RlZmluZSBURUtSQU1fNTc2MDAgIDB4MDEKKyNkZWZpbmUgVEVLUkFNXzM4NDAwICAweDAyCisjZGVmaW5lIFRFS1JBTV8xOTIwMCAgMHgwMworI2RlZmluZSBURUtSQU1fOTYwMCAgIDB4MDQKKworI2RlZmluZSBURUtSQU1fUFcgICAgIDB4MTAgLyogUHVsc2Ugc2VsZWN0IGJpdCAqLworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgdGVrcmFtID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJPSAiVGVrcmFtIElSLTIxMEIiLAorCS50eXBlCQk9IElSREFfVEVLUkFNX0RPTkdMRSwKKwkub3BlbgkJPSB0ZWtyYW1fb3BlbiwKKwkuY2xvc2UJCT0gdGVrcmFtX2Nsb3NlLAorCS5yZXNldAkJPSB0ZWtyYW1fcmVzZXQsCisJLnNldF9zcGVlZAk9IHRla3JhbV9jaGFuZ2Vfc3BlZWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0ZWtyYW1fc2lyX2luaXQodm9pZCkKK3sKKwlpZiAodGVrcmFtX2RlbGF5IDwgMSAgfHwgIHRla3JhbV9kZWxheSA+IDUwMCkKKwkJdGVrcmFtX2RlbGF5ID0gMjAwOworCUlSREFfREVCVUcoMSwgIiVzIC0gdXNpbmcgJWQgbXMgZGVsYXlcbiIsCisJCXRla3JhbS5kcml2ZXJfbmFtZSwgdGVrcmFtX2RlbGF5KTsKKwlyZXR1cm4gaXJkYV9yZWdpc3Rlcl9kb25nbGUoJnRla3JhbSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZWtyYW1fc2lyX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZ0ZWtyYW0pOworfQorCitzdGF0aWMgaW50IHRla3JhbV9vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHFvc19pbmZvICpxb3MgPSAmZGV2LT5xb3M7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisKKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMTsgLyogTmVlZHMgYXQgbGVhc3QgMTAgbXMgKi8JCisJaXJkYV9xb3NfYml0c190b192YWx1ZShxb3MpOworCisJLyogaXJkYSB0aHJlYWQgd2FpdHMgNTAgbXNlYyBmb3IgcG93ZXIgc2V0dGxpbmcgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRla3JhbV9jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIEZBTFNFKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gdGVrcmFtX2NoYW5nZV9zcGVlZCAoZGV2LCBzdGF0ZSwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIFRla3JhbSBJUk1hdGUgMjEwIHR5cGUgZG9uZ2xlLiBXYXJuaW5nLCB0aGlzIAorICogICAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBhIHByb2Nlc3MgY29udGV4dCEKKyAqCisgKiAgICBBbGdvcml0aG0KKyAqICAgIDEuIGNsZWFyIERUUiAKKyAqICAgIDIuIHNldCBSVFMsIGFuZCB3YWl0IGF0IGxlYXN0IDcgdXMKKyAqICAgIDMuIHNlbmQgQ29udHJvbCBCeXRlIHRvIHRoZSBJUi0yMTAgdGhyb3VnaCBUWEQgdG8gc2V0IG5ldyBiYXVkIHJhdGUKKyAqICAgICAgIHdhaXQgdW50aWwgdGhlIHN0b3AgYml0IG9mIENvbnRyb2wgQnl0ZSBpcyBzZW50IChmb3IgOTYwMCBiYXVkIHJhdGUsIAorICogICAgICAgaXQgdGFrZXMgYWJvdXQgMTAwIG1zZWMpCisgKgorICoJW29vcHMsIHdoeSAxMDAgbXNlYz8gc2VuZGluZyAxIGJ5dGUgKDEwIGJpdHMpIHRha2VzIDEuMDUgbXNlYworICoJIC0gaXMgdGhpcyBwcm9iYWJseSB0byBjb21wZW5zYXRlIGZvciBkZWxheXMgaW4gdHR5IGxheWVyP10KKyAqCisgKiAgICA1LiBjbGVhciBSVFMgKHJldHVybiB0byBOT1JNQUwgT3BlcmF0aW9uKQorICogICAgNi4gd2FpdCBhdCBsZWFzdCA1MCB1cywgbmV3IHNldHRpbmcgKGJhdWQgcmF0ZSwgZXRjKSB0YWtlcyBlZmZlY3QgaGVyZSAKKyAqICAgICAgIGFmdGVyCisgKi8KKworI2RlZmluZSBURUtSQU1fU1RBVEVfV0FJVF9TUEVFRAkoU0lSREVWX1NUQVRFX0RPTkdMRV9TUEVFRCArIDEpCisKK3N0YXRpYyBpbnQgdGVrcmFtX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCB1bnNpZ25lZCBzcGVlZCkKK3sKKwl1bnNpZ25lZCBzdGF0ZSA9IGRldi0+ZnNtLnN1YnN0YXRlOworCXVuc2lnbmVkIGRlbGF5ID0gMDsKKwl1OCBieXRlOworCXN0YXRpYyBpbnQgcmV0ID0gMDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3dpdGNoKHN0YXRlKSB7CisJY2FzZSBTSVJERVZfU1RBVEVfRE9OR0xFX1NQRUVEOgorCisJCXN3aXRjaCAoc3BlZWQpIHsKKwkJZGVmYXVsdDoKKwkJCXNwZWVkID0gOTYwMDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQkvKiBmYWxsIHRocnUgKi8KKwkJY2FzZSA5NjAwOgorCQkJYnl0ZSA9IFRFS1JBTV9QV3xURUtSQU1fOTYwMDsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwOgorCQkJYnl0ZSA9IFRFS1JBTV9QV3xURUtSQU1fMTkyMDA7CisJCQlicmVhazsKKwkJY2FzZSAzODQwMDoKKwkJCWJ5dGUgPSBURUtSQU1fUFd8VEVLUkFNXzM4NDAwOworCQkJYnJlYWs7CisJCWNhc2UgNTc2MDA6CisJCQlieXRlID0gVEVLUkFNX1BXfFRFS1JBTV81NzYwMDsKKwkJCWJyZWFrOworCQljYXNlIDExNTIwMDoKKwkJCWJ5dGUgPSBURUtSQU1fMTE1MjAwOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBTZXQgRFRSLCBDbGVhciBSVFMgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgRkFMU0UpOworCQorCQkvKiBXYWl0IGF0IGxlYXN0IDd1cyAqLworCQl1ZGVsYXkoMTQpOworCisJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZSAqLworCQlzaXJkZXZfcmF3X3dyaXRlKGRldiwgJmJ5dGUsIDEpOworCQkKKwkJZGV2LT5zcGVlZCA9IHNwZWVkOworCisJCXN0YXRlID0gVEVLUkFNX1NUQVRFX1dBSVRfU1BFRUQ7CisJCWRlbGF5ID0gdGVrcmFtX2RlbGF5OworCQlicmVhazsKKworCWNhc2UgVEVLUkFNX1NUQVRFX1dBSVRfU1BFRUQ6CisJCS8qIFNldCBEVFIsIFNldCBSVFMgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisJCXVkZWxheSg1MCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMgLSB1bmRlZmluZWQgc3RhdGUgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlkZXYtPmZzbS5zdWJzdGF0ZSA9IHN0YXRlOworCXJldHVybiAoZGVsYXkgPiAwKSA/IGRlbGF5IDogcmV0OworfQorCisvKgorICogRnVuY3Rpb24gdGVrcmFtX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgdGVrcmFtIGRvbmdsZS4gV2FybmluZywgdGhpcyBmdW5jdGlvbiAKKyAqICAgICAgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIHByb2Nlc3MgY29udGV4dCEhIAorICoKKyAqICAgICAgQWxnb3JpdGhtOgorICogICAgCSAgMC4gQ2xlYXIgUlRTIGFuZCBEVFIsIGFuZCB3YWl0IDUwIG1zIChwb3dlciBvZmYgdGhlIElSLTIxMCApCisgKiAgICAgICAgMS4gY2xlYXIgUlRTIAorICogICAgICAgIDIuIHNldCBEVFIsIGFuZCB3YWl0IGF0IGxlYXN0IDEgbXMgCisgKiAgICAgICAgMy4gY2xlYXIgRFRSIHRvIFNQQUNFIHN0YXRlLCB3YWl0IGF0IGxlYXN0IDUwIHVzIGZvciBmdXJ0aGVyIAorICogICAgICAgICBvcGVyYXRpb24KKyAqLworCitzdGF0aWMgaW50IHRla3JhbV9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBDbGVhciBEVFIsIFNldCBSVFMgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgVFJVRSk7IAorCisJLyogU2hvdWxkIHNsZWVwIDEgbXMgKi8KKwltc2xlZXAoMSk7CisKKwkvKiBTZXQgRFRSLCBTZXQgUlRTICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisJCisJLyogV2FpdCBhdCBsZWFzdCA1MCB1cyAqLworCXVkZWxheSg3NSk7CisKKwlkZXYtPnNwZWVkID0gOTYwMDsKKworCXJldHVybiAwOworfQorCitNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRla3JhbSBJck1hdGUgSVItMjEwQiBkb25nbGUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTAiKTsgLyogSVJEQV9URUtSQU1fRE9OR0xFICovCisJCQorbW9kdWxlX2luaXQodGVrcmFtX3Npcl9pbml0KTsKK21vZHVsZV9leGl0KHRla3JhbV9zaXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Rla3JhbS5jIGIvZHJpdmVycy9uZXQvaXJkYS90ZWtyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjYyNTgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS90ZWtyYW0uYwpAQCAtMCwwICsxLDI4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICB0ZWtyYW0uYworICogVmVyc2lvbjogICAgICAgMS4yCisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGVrcmFtIElyTWF0ZSBJUi0yMTBCIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgV2VkIE9jdCAyMSAyMDowMjozNSAxOTk4CisgKiBNb2RpZmllZCBhdDogICBGcmkgRGVjIDE3IDA5OjEzOjA5IDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCitzdGF0aWMgdm9pZCB0ZWtyYW1fb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpOworc3RhdGljIHZvaWQgdGVrcmFtX2Nsb3NlKGRvbmdsZV90ICpzZWxmKTsKK3N0YXRpYyBpbnQgIHRla3JhbV9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgaW50ICB0ZWtyYW1fcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CisKKyNkZWZpbmUgVEVLUkFNXzExNTIwMCAweDAwCisjZGVmaW5lIFRFS1JBTV81NzYwMCAgMHgwMQorI2RlZmluZSBURUtSQU1fMzg0MDAgIDB4MDIKKyNkZWZpbmUgVEVLUkFNXzE5MjAwICAweDAzCisjZGVmaW5lIFRFS1JBTV85NjAwICAgMHgwNAorCisjZGVmaW5lIFRFS1JBTV9QVyAgICAgMHgxMCAvKiBQdWxzZSBzZWxlY3QgYml0ICovCisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX3JlZyBkb25nbGUgPSB7CisJLnR5cGUgPSBJUkRBX1RFS1JBTV9ET05HTEUsCisJLm9wZW4gID0gdGVrcmFtX29wZW4sCisJLmNsb3NlID0gdGVrcmFtX2Nsb3NlLAorCS5yZXNldCA9IHRla3JhbV9yZXNldCwKKwkuY2hhbmdlX3NwZWVkID0gdGVrcmFtX2NoYW5nZV9zcGVlZCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRla3JhbV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRla3JhbV9jbGVhbnVwKHZvaWQpCit7CisJaXJkYV9kZXZpY2VfdW5yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRla3JhbV9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcykKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAxOyAvKiBOZWVkcyBhdCBsZWFzdCAxMCBtcyAqLwkKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7Cit9CisKK3N0YXRpYyB2b2lkIHRla3JhbV9jbG9zZShkb25nbGVfdCAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7CisKKwlpZiAoc2VsZi0+cmVzZXRfdGFzaykKKwkJaXJkYV90YXNrX2RlbGV0ZShzZWxmLT5yZXNldF90YXNrKTsKKwlpZiAoc2VsZi0+c3BlZWRfdGFzaykKKwkJaXJkYV90YXNrX2RlbGV0ZShzZWxmLT5zcGVlZF90YXNrKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHRla3JhbV9jaGFuZ2Vfc3BlZWQgKGRldiwgc3RhdGUsIHNwZWVkKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBUZWtyYW0gSVJNYXRlIDIxMCB0eXBlIGRvbmdsZS4gV2FybmluZywgdGhpcyAKKyAqICAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggYSBwcm9jZXNzIGNvbnRleHQhCisgKgorICogICAgQWxnb3JpdGhtCisgKiAgICAxLiBjbGVhciBEVFIgCisgKiAgICAyLiBzZXQgUlRTLCBhbmQgd2FpdCBhdCBsZWFzdCA3IHVzCisgKiAgICAzLiBzZW5kIENvbnRyb2wgQnl0ZSB0byB0aGUgSVItMjEwIHRocm91Z2ggVFhEIHRvIHNldCBuZXcgYmF1ZCByYXRlCisgKiAgICAgICB3YWl0IHVudGlsIHRoZSBzdG9wIGJpdCBvZiBDb250cm9sIEJ5dGUgaXMgc2VudCAoZm9yIDk2MDAgYmF1ZCByYXRlLCAKKyAqICAgICAgIGl0IHRha2VzIGFib3V0IDEwMCBtc2VjKQorICogICAgNS4gY2xlYXIgUlRTIChyZXR1cm4gdG8gTk9STUFMIE9wZXJhdGlvbikKKyAqICAgIDYuIHdhaXQgYXQgbGVhc3QgNTAgdXMsIG5ldyBzZXR0aW5nIChiYXVkIHJhdGUsIGV0YykgdGFrZXMgZWZmZWN0IGhlcmUgCisgKiAgICAgICBhZnRlcgorICovCitzdGF0aWMgaW50IHRla3JhbV9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwlfX3UzMiBzcGVlZCA9IChfX3UzMikgdGFzay0+cGFyYW07CisJX191OCBieXRlOworCWludCByZXQgPSAwOworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQodGFzayAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlmIChzZWxmLT5zcGVlZF90YXNrICYmIHNlbGYtPnNwZWVkX3Rhc2sgIT0gdGFzaykgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBidXN5IVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBtc2Vjc190b19qaWZmaWVzKDEwKTsKKwl9IGVsc2UKKwkJc2VsZi0+c3BlZWRfdGFzayA9IHRhc2s7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJZGVmYXVsdDoKKwljYXNlIDk2MDA6CisJCWJ5dGUgPSBURUtSQU1fUFd8VEVLUkFNXzk2MDA7CisJCWJyZWFrOworCWNhc2UgMTkyMDA6CisJCWJ5dGUgPSBURUtSQU1fUFd8VEVLUkFNXzE5MjAwOworCQlicmVhazsKKwljYXNlIDM4NDAwOgorCQlieXRlID0gVEVLUkFNX1BXfFRFS1JBTV8zODQwMDsKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDoKKwkJYnl0ZSA9IFRFS1JBTV9QV3xURUtSQU1fNTc2MDA7CisJCWJyZWFrOworCWNhc2UgMTE1MjAwOgorCQlieXRlID0gVEVLUkFNXzExNTIwMDsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0YXNrLT5zdGF0ZSkgeworCWNhc2UgSVJEQV9UQVNLX0lOSVQ6CisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfSU5JVDoJCQorCQkvKiAKKwkJICogTmVlZCB0byByZXNldCB0aGUgZG9uZ2xlIGFuZCBnbyB0byA5NjAwIGJwcyBiZWZvcmUKKyAgICAgICAgICAgICAgICAgKiBwcm9ncmFtbWluZyAKKwkJICovCisJCWlmIChpcmRhX3Rhc2tfZXhlY3V0ZShzZWxmLCB0ZWtyYW1fcmVzZXQsIE5VTEwsIHRhc2ssIAorCQkJCSAgICAgICh2b2lkICopIHNwZWVkKSkKKwkJeworCQkJLyogRG9uZ2xlIG5lZWQgbW9yZSB0aW1lIHRvIHJlc2V0ICovCisJCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfQ0hJTERfV0FJVCk7CisKKwkJCS8qIEdpdmUgcmVzZXQgMSBzZWMgdG8gZmluaXNoICovCisJCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCQl9IGVsc2UKKwkJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19DSElMRF9ET05FKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfV0FJVDoKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCByZXNldHRpbmcgZG9uZ2xlIHRpbWVkIG91dCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldCA9IC0xOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19DSElMRF9ET05FOgorCQkvKiBTZXQgRFRSLCBDbGVhciBSVFMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBGQUxTRSk7CisJCisJCS8qIFdhaXQgYXQgbGVhc3QgN3VzICovCisJCXVkZWxheSgxNCk7CisKKwkJLyogV3JpdGUgY29udHJvbCBieXRlICovCisJCXNlbGYtPndyaXRlKHNlbGYtPmRldiwgJmJ5dGUsIDEpOworCQkKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQpOworCisJCS8qIFdhaXQgYXQgbGVhc3QgMTAwIG1zICovCisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTUwKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDoKKwkJLyogU2V0IERUUiwgU2V0IFJUUyAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+c3BlZWRfdGFzayA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5zcGVlZF90YXNrID0gTlVMTDsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gdGVrcmFtX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgdGVrcmFtIGRvbmdsZS4gV2FybmluZywgdGhpcyBmdW5jdGlvbiAKKyAqICAgICAgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIHByb2Nlc3MgY29udGV4dCEhIAorICoKKyAqICAgICAgQWxnb3JpdGhtOgorICogICAgCSAgMC4gQ2xlYXIgUlRTIGFuZCBEVFIsIGFuZCB3YWl0IDUwIG1zIChwb3dlciBvZmYgdGhlIElSLTIxMCApCisgKiAgICAgICAgMS4gY2xlYXIgUlRTIAorICogICAgICAgIDIuIHNldCBEVFIsIGFuZCB3YWl0IGF0IGxlYXN0IDEgbXMgCisgKiAgICAgICAgMy4gY2xlYXIgRFRSIHRvIFNQQUNFIHN0YXRlLCB3YWl0IGF0IGxlYXN0IDUwIHVzIGZvciBmdXJ0aGVyIAorICogICAgICAgICBvcGVyYXRpb24KKyAqLworaW50IHRla3JhbV9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVCh0YXNrICE9IE5VTEwsIHJldHVybiAtMTspOworCisJaWYgKHNlbGYtPnJlc2V0X3Rhc2sgJiYgc2VsZi0+cmVzZXRfdGFzayAhPSB0YXNrKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGJ1c3khXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIG1zZWNzX3RvX2ppZmZpZXMoMTApOworCX0gZWxzZQorCQlzZWxmLT5yZXNldF90YXNrID0gdGFzazsKKwkKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJLy9zZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7CisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKworCXN3aXRjaCAodGFzay0+c3RhdGUpIHsKKwljYXNlIElSREFfVEFTS19JTklUOgorCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDEpOworCisJCS8qIFNsZWVwIDUwIG1zICovCisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoNTApOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19XQUlUMToKKwkJLyogQ2xlYXIgRFRSLCBTZXQgUlRTICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIFRSVUUpOyAKKworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDIpOworCQkKKwkJLyogU2hvdWxkIHNsZWVwIDEgbXMgKi8KKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDI6CisJCS8qIFNldCBEVFIsIFNldCBSVFMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkKKwkJLyogV2FpdCBhdCBsZWFzdCA1MCB1cyAqLworCQl1ZGVsYXkoNzUpOworCisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOwkJCisJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOworCQlyZXQgPSAtMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUZWtyYW0gSXJNYXRlIElSLTIxMEIgZG9uZ2xlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS0wIik7IC8qIElSREFfVEVLUkFNX0RPTkdMRSAqLworCQkKKy8qCisgKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplIFRla3JhbSBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9pbml0KHRla3JhbV9pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgVGVrcmFtIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2V4aXQodGVrcmFtX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jIGIvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYWZiNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmMKQEAgLTAsMCArMSwxNjc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGaWxlbmFtZTogICAgICB2aWEtaXJjYy5jCisgVmVyc2lvbjogICAgICAgMS4wIAorIERlc2NyaXB0aW9uOiAgIERyaXZlciBmb3IgdGhlIFZJQSBWVDgyMzEvVlQ4MjMzIElyREEgY2hpcHNldHMKKyBBdXRob3I6ICAgICAgICBWSUEgVGVjaG5vbG9naWVzLGluYworIERhdGUgIDoJMDgvMDYvMjAwMworCitDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBWSUEgVGVjaG5vbG9naWVzLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCitBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKK0YwMSBPY3QvMDIvMDI6IE1vZGlmeSBjb2RlIGZvciBWMC4xMShtb3ZlIG91dCBiYWNrIHRvIGJhY2sgdHJhbnNmZXIpCitGMDIgT2N0LzI4LzAyOiBBZGQgU0IgZGV2aWNlIElEIGZvciAzMTQ3IGFuZCAzMTc3LgorIENvbW1lbnQgOgorICAgICAgIGp1bC8wOS8yMDAyIDogb25seSBpbXBsZW1lbnQgdHdvIGtpbmQgb2YgZG9uZ2xlIGN1cnJlbnRseS4KKyAgICAgICBPY3QvMDIvMjAwMiA6IHdvcmsgb24gVlQ4MjMxIGFuZCBWVDgyMzMgLgorICAgICAgIEF1Zy8wNi8yMDAzIDogY2hhbmdlIGRyaXZlciBmb3JtYXQgdG8gcGNpIGRyaXZlciAuCisKKzIwMDQtMDItMTY6IDxzZGFAYmRpdC5kZT4KKy0gUmVtb3ZlZCB1bm5lZWRlZCAnbGVnYWN5JyBwY2kgc3R1ZmYuCistIE1ha2Ugc3VyZSBTSVIgbW9kZSBpcyBzZXQgKGh3X2luaXQoKSkgYmVmb3JlIGNhbGxpbmcgbW9kZS1kZXBlbmRhbnQgc3R1ZmYuCistIE9uIHNwZWVkIGNoYW5nZSBmcm9tIGNvcmUsIGRvbid0IHNlbmQgU0lSIGZyYW1lIHdpdGggbmV3IHNwZWVkLiAKKyAgVXNlIGN1cnJlbnQgc3BlZWQgYW5kIGNoYW5nZSBzcGVlZHMgbGF0ZXIuCistIE1ha2UgbW9kdWxlLXBhcmFtIGRvbmdsZV9pZCBhY3R1YWxseSB3b3JrLgorLSBOZXcgZG9uZ2xlX2lkIDE3ICgweDExKTogVERGUzQ1MDAuIFNpbmdsZS1lbmRlZCBTSVIgb25seS4gCisgIFRlc3RlZCB3aXRoIGhvbWUtZ3Jvd24gUENCIG9uIEVQSUEgYm9hcmRzLgorLSBDb2RlIGNsZWFudXAuCisgICAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaW5jbHVkZSAidmlhLWlyY2MuaCIKKworI2RlZmluZSBWSUFfTU9EVUxFX05BTUUgInZpYS1pcmNjIgorI2RlZmluZSBDSElQX0lPX0VYVEVOVCAweDQwCisKK3N0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9IFZJQV9NT0RVTEVfTkFNRTsKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbnQgcW9zX210dF9iaXRzID0gMHgwNzsJLyogMSBtcyBvciBtb3JlICovCitzdGF0aWMgaW50IGRvbmdsZV9pZCA9IDA7CS8qIGRlZmF1bHQ6IHByb2JlICovCisKKy8qIFdlIGNhbid0IGd1ZXNzIHRoZSB0eXBlIG9mIGNvbm5lY3RlZCBkb25nbGUsIHVzZXIgKm11c3QqIHN1cHBseSBpdC4gKi8KK21vZHVsZV9wYXJhbShkb25nbGVfaWQsIGludCwgMCk7CisKKy8qIEZJWE1FIDogd2Ugc2hvdWxkIG5vdCBuZWVkIHRoaXMsIGJlY2F1c2UgaW5zdGFuY2VzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5CisgKiBtYW5hZ2VkIGJ5IHRoZSBQQ0kgbGF5ZXIuIEVzcGVjaWFsbHkgdGhhdCB3ZSBzZWVtIHRvIG9ubHkgYmUgdXNpbmcgdGhlCisgKiBmaXJzdCBlbnRyeS4gSmVhbiBJSSAqLworLyogTWF4IDQgaW5zdGFuY2VzIGZvciBub3cgKi8KK3N0YXRpYyBzdHJ1Y3QgdmlhX2lyY2NfY2IgKmRldl9zZWxmW10gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKworLyogU29tZSBwcm90b3R5cGVzICovCitzdGF0aWMgaW50IHZpYV9pcmNjX29wZW4oaW50IGksIGNoaXBpb190ICogaW5mbywgdW5zaWduZWQgaW50IGlkKTsKK3N0YXRpYyBpbnQgdmlhX2lyY2NfY2xvc2Uoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgdmlhX2lyY2NfZG1hX3JlY2VpdmUoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgdmlhX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLAorCQkJCQkgaW50IGlvYmFzZSk7CitzdGF0aWMgaW50IHZpYV9pcmNjX2hhcmRfeG1pdF9zaXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2aWFfaXJjY19oYXJkX3htaXRfZmlyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHZpYV9od19pbml0KHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgdm9pZCB2aWFfaXJjY19jaGFuZ2Vfc3BlZWQoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLCBfX3UzMiBiYXVkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCB2aWFfaXJjY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgdmlhX2lyY2NfaXNfcmVjZWl2aW5nKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50IHZpYV9pcmNjX3JlYWRfZG9uZ2xlX2lkKGludCBpb2Jhc2UpOworCitzdGF0aWMgaW50IHZpYV9pcmNjX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2aWFfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHZpYV9pcmNjX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLAorCQkJICAgICAgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnZpYV9pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UKKwkJCQkJCSAgICAgICAqZGV2KTsKK3N0YXRpYyB2b2lkIHZpYV9pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQoaW50IGlvYmFzZSwgaW50IHNwZWVkLAorCQkJCQkgaW50IGRvbmdsZV9pZCk7CitzdGF0aWMgaW50IFJ4VGltZXJIYW5kbGVyKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSk7CitzdGF0aWMgdm9pZCBod3Jlc2V0KHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50IHZpYV9pcmNjX2RtYV94bWl0KHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwgdTE2IGlvYmFzZSk7CitzdGF0aWMgaW50IHVwbG9hZF9yeGRhdGEoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZpYV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2aWFfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworCisvKiBGSVhNRSA6IFNob3VsZCB1c2UgdWRlbGF5KCkgaW5zdGVhZCwgZXZlbiBpZiB3ZSBhcmUgeDg2IG9ubHkgLSBKZWFuIElJICovCitzdGF0aWMgdm9pZCBpb2RlbGF5KGludCB1ZGVsYXkpCit7CisJdTggZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB1ZGVsYXk7IGkrKykgeworCQlkYXRhID0gaW5iKDB4ODApOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZpYV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgMHg4MjMxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELDAsMCwwIH0sCisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgMHgzMTA5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELDAsMCwxIH0sCisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgMHgzMDc0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELDAsMCwyIH0sCisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgMHgzMTQ3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELDAsMCwzIH0sCisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgMHgzMTc3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELDAsMCw0IH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSx2aWFfcGNpX3RibCk7CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZpYV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gVklBX01PRFVMRV9OQU1FLAorCS5pZF90YWJsZQk9IHZpYV9wY2lfdGJsLAorCS5wcm9iZQkJPSB2aWFfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh2aWFfcmVtb3ZlX29uZSksCit9OworCisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19pbml0ICgpCisgKgorICogICAgSW5pdGlhbGl6ZSBjaGlwLiBKdXN0IGZpbmQgb3V0IGNoaXAgdHlwZSBhbmQgcmVzb3VyY2UuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHZpYV9pcmNjX2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJcmMgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ2aWFfZHJpdmVyKTsKKwlpZiAocmMgPCAwKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCk6IGVycm9yIHJjID0gJWQsIHJldHVybmluZyAgLUVOT0RFVi4uLlxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgcmMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZpYV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByYzsKKyAgICAgICAgdTggdGVtcCxvbGRQQ0lfNDAsb2xkUENJXzQ0LGJUbXAsYlRtcDE7CisJdTE2IENoaXBzZXQsRmlyRFJRMSxGaXJEUlEwLEZpcklSUSxGaXJJT0Jhc2U7CisJY2hpcGlvX3QgaW5mbzsKKworCUlSREFfREVCVUcoMiwgIiVzKCk6IERldmljZSBJRD0oMFglWClcbiIsIF9fRlVOQ1RJT05fXywgaWQtPmRldmljZSk7CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlIChwY2lkZXYpOworCWlmIChyYykgeworCQlJUkRBX0RFQlVHKDAsICIlcygpOiBlcnJvciByYyA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLy8gU291dGggQnJpZGdlIGV4aXN0CisgICAgICAgIGlmICggUmVhZExQQ1JlZygweDIwKSAhPSAweDNDICkKKwkJQ2hpcHNldD0weDMwOTY7CisJZWxzZQorCQlDaGlwc2V0PTB4MzA3NjsKKworCWlmIChDaGlwc2V0PT0weDMwNzYpIHsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKTogQ2hpcHNldCA9IDMwNzZcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJV3JpdGVMUENSZWcoNywweDBjICk7CisJCXRlbXA9UmVhZExQQ1JlZygweDMwKTsvL2NoZWNrIGlmIEJJT1MgRW5hYmxlIEZpcgorCQlpZigodGVtcCYweDAxKT09MSkgeyAgIC8vIEJJT1MgY2xvc2Ugb3Igbm8gRklSCisJCQlXcml0ZUxQQ1JlZygweDFkLCAweDgyICk7CisJCQlXcml0ZUxQQ1JlZygweDIzLDB4MTgpOworCQkJdGVtcD1SZWFkTFBDUmVnKDB4RjApOworCQkJaWYoKHRlbXAmMHgwMSk9PTApIHsKKwkJCQl0ZW1wPShSZWFkTFBDUmVnKDB4NzQpJjB4MDMpOyAgICAvL0RNQQorCQkJCUZpckRSUTA9dGVtcCArIDQ7CisJCQkJdGVtcD0oUmVhZExQQ1JlZygweDc0KSYweDBDKSA+PiAyOworCQkJCUZpckRSUTE9dGVtcCArIDQ7CisJCQl9IGVsc2UgeworCQkJCXRlbXA9KFJlYWRMUENSZWcoMHg3NCkmMHgwQykgPj4gMjsgICAgLy9ETUEKKwkJCQlGaXJEUlEwPXRlbXAgKyA0OworCQkJCUZpckRSUTE9RmlyRFJRMDsKKwkJCX0KKwkJCUZpcklSUT0oUmVhZExQQ1JlZygweDcwKSYweDBmKTsJCS8vSVJRCisJCQlGaXJJT0Jhc2U9UmVhZExQQ1JlZygweDYwICkgPDwgODsJLy9JTyBTcGFjZSA6aGlnaCBieXRlCisJCQlGaXJJT0Jhc2U9RmlySU9CYXNlfCBSZWFkTFBDUmVnKDB4NjEpIDsJLy9sb3cgYnl0ZQorCQkJRmlySU9CYXNlPUZpcklPQmFzZSAgOworCQkJaW5mby5maXJfYmFzZT1GaXJJT0Jhc2U7CisJCQlpbmZvLmlycT1GaXJJUlE7CisJCQlpbmZvLmRtYT1GaXJEUlExOworCQkJaW5mby5kbWEyPUZpckRSUTA7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0MCwmYlRtcCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpZGV2LDB4NDAsKChiVG1wIHwgMHgwOCkgJiAweGZlKSk7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0MiwmYlRtcCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpZGV2LDB4NDIsKGJUbXAgfCAweGYwKSk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpZGV2LDB4NWEsMHhjMCk7CisJCQlXcml0ZUxQQ1JlZygweDI4LCAweDcwICk7CisJCQlpZiAodmlhX2lyY2Nfb3BlbigwLCAmaW5mbywweDMwNzYpID09IDApCisJCQkJcmM9MDsKKwkJfSBlbHNlCisJCQlyYyA9IC1FTk9ERVY7IC8vSVIgbm90IHR1cm4gb24JIAorCX0gZWxzZSB7IC8vTm90IFZUMTIxMQorCQlJUkRBX0RFQlVHKDIsICIlcygpOiBDaGlwc2V0ID0gMzA5NlxuIiwgX19GVU5DVElPTl9fKTsKKworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg2NywmYlRtcCk7Ly9jaGVjayBpZiBCSU9TIEVuYWJsZSBGaXIKKwkJaWYoKGJUbXAmMHgwMSk9PTEpIHsgIC8vIEJJT1MgZW5hYmxlIEZJUgorCQkJLy9FbmFibGUgRG91YmxlIERNQSBjbG9jaworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LDB4NDIsJm9sZFBDSV80MCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpZGV2LDB4NDIsb2xkUENJXzQwIHwgMHg4MCk7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0MCwmb2xkUENJXzQwKTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lkZXYsMHg0MCxvbGRQQ0lfNDAgJiAweGY3KTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaWRldiwweDQ0LCZvbGRQQ0lfNDQpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaWRldiwweDQ0LDB4NGUpOworICAvLy0tLS0tLS0tLS0gcmVhZCBjb25maWd1cmF0aW9uIGZyb20gRnVuY3Rpb24wIG9mIHNvdXRoIGJyaWRnZQorCQkJaWYoKGJUbXAmMHgwMik9PTApIHsKKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0NCwmYlRtcDEpOyAvL0RNQQorCQkJCUZpckRSUTAgPSAoYlRtcDEgJiAweDMwKSA+PiA0OworCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaWRldiwweDQ0LCZiVG1wMSk7CisJCQkJRmlyRFJRMSA9IChiVG1wMSAmIDB4YzApID4+IDY7CisJCQl9IGVsc2UgIHsKKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0NCwmYlRtcDEpOyAgICAvL0RNQQorCQkJCUZpckRSUTAgPSAoYlRtcDEgJiAweDMwKSA+PiA0IDsKKwkJCQlGaXJEUlExPTA7CisJCQl9CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0NywmYlRtcDEpOyAgLy9JUlEKKwkJCUZpcklSUSA9IGJUbXAxICYgMHgwZjsKKworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LDB4NjksJmJUbXApOworCQkJRmlySU9CYXNlID0gYlRtcCA8PCA4Oy8vaGlnaHQgYnl0ZQorCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LDB4NjgsJmJUbXApOworCQkJRmlySU9CYXNlID0gKEZpcklPQmFzZSB8IGJUbXAgKSAmIDB4ZmZmMDsKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlpbmZvLmZpcl9iYXNlPUZpcklPQmFzZTsKKwkJCWluZm8uaXJxPUZpcklSUTsKKwkJCWluZm8uZG1hPUZpckRSUTE7CisJCQlpbmZvLmRtYTI9RmlyRFJRMDsKKwkJCWlmICh2aWFfaXJjY19vcGVuKDAsICZpbmZvLDB4MzA5NikgPT0gMCkKKwkJCQlyYz0wOworCQl9IGVsc2UKKwkJCXJjID0gLUVOT0RFVjsgLy9JUiBub3QgdHVybiBvbiAhISEhIQorCX0vL05vdCBWVDEyMTEKKworCUlSREFfREVCVUcoMiwgIiVzKCk6IEVuZCAtIHJjID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2NsZWFuICgpCisgKgorICogICAgQ2xvc2UgYWxsIGNvbmZpZ3VyZWQgY2hpcHMKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHZpYV9pcmNjX2NsZWFuKHZvaWQpCit7CisJaW50IGk7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJZm9yIChpPTA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKGRldl9zZWxmW2ldKQorCQkJdmlhX2lyY2NfY2xvc2UoZGV2X3NlbGZbaV0pOworCX0KK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHZpYV9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogRklYTUUgOiBUaGlzIGlzIHVnbHkuIFdlIHNob3VsZCB1c2UgcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCSAqIHRvIGdldCBvdXIgZHJpdmVyIGluc3RhbmNlIGFuZCBjYWxsIGRpcmVjdGx5IHZpYV9pcmNjX2Nsb3NlKCkuCisJICogU2VlIHZsc2lfaXIgZm9yIGRldGFpbHMuLi4KKwkgKiBKZWFuIElJICovCisJdmlhX2lyY2NfY2xlYW4oKTsKKworCS8qIEZJWE1FIDogVGhpcyBzaG91bGQgYmUgaW4gdmlhX2lyY2NfY2xvc2UoKSwgYmVjYXVzZSBoZXJlIHdlIG1heQorCSAqIHRoZW9yaXRpY2FsbHkgZGlzYWJsZSBzdGlsbCBjb25maWd1cmVkIGRldmljZXMgOi0oIC0gSmVhbiBJSSAqLworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHZpYV9pcmNjX2NsZWFudXAodm9pZCkKK3sKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogRklYTUUgOiBUaGlzIHNob3VsZCBiZSByZWR1bmRhbnQsIGFzIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigpCisJICogc2hvdWxkIGNhbGwgdmlhX3JlbW92ZV9vbmUoKSBvbiBlYWNoIGRldmljZS4KKwkgKiBKZWFuIElJICovCisJdmlhX2lyY2NfY2xlYW4oKTsKKworCS8qIENsZWFudXAgYWxsIGluc3RhbmNlcyBvZiB0aGUgZHJpdmVyICovCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmdmlhX2RyaXZlcik7IAorfQorCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2Nfb3BlbiAoaW9iYXNlLCBpcnEpCisgKgorICogICAgT3BlbiBkcml2ZXIgaW5zdGFuY2UKKyAqCisgKi8KK3N0YXRpYyBfX2RldmluaXQgaW50IHZpYV9pcmNjX29wZW4oaW50IGksIGNoaXBpb190ICogaW5mbywgdW5zaWduZWQgaW50IGlkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmOworCWludCBlcnI7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogQWxsb2NhdGUgbmV3IGluc3RhbmNlIG9mIHRoZSBkcml2ZXIgKi8KKwlkZXYgPSBhbGxvY19pcmRhZGV2KHNpemVvZihzdHJ1Y3QgdmlhX2lyY2NfY2IpKTsKKwlpZiAoZGV2ID09IE5VTEwpIAorCQlyZXR1cm4gLUVOT01FTTsKKworCXNlbGYgPSBkZXYtPnByaXY7CisJc2VsZi0+bmV0ZGV2ID0gZGV2OworCXNwaW5fbG9ja19pbml0KCZzZWxmLT5sb2NrKTsKKworCS8qIEZJWE1FIDogV2Ugc2hvdWxkIHN0b3JlIG91ciBkcml2ZXIgaW5zdGFuY2UgaW4gdGhlIFBDSSBsYXllciwKKwkgKiB1c2luZyBwY2lfc2V0X2RydmRhdGEoKSwgbm90IGluIHRoaXMgYXJyYXkuCisJICogU2VlIHZsc2lfaXIgZm9yIGRldGFpbHMuLi4gLSBKZWFuIElJICovCisJLyogRklYTUUgOiAnaScgaXMgYWx3YXlzIDAgKHNlZSB2aWFfaW5pdF9vbmUoKSkgOi0oIC0gSmVhbiBJSSAqLworCS8qIE5lZWQgdG8gc3RvcmUgc2VsZiBzb21ld2hlcmUgKi8KKwlkZXZfc2VsZltpXSA9IHNlbGY7CisJc2VsZi0+aW5kZXggPSBpOworCS8qIEluaXRpYWxpemUgUmVzb3VyY2UgKi8KKwlzZWxmLT5pby5jZmdfYmFzZSA9IGluZm8tPmNmZ19iYXNlOworCXNlbGYtPmlvLmZpcl9iYXNlID0gaW5mby0+ZmlyX2Jhc2U7CisJc2VsZi0+aW8uaXJxID0gaW5mby0+aXJxOworCXNlbGYtPmlvLmZpcl9leHQgPSBDSElQX0lPX0VYVEVOVDsKKwlzZWxmLT5pby5kbWEgPSBpbmZvLT5kbWE7CisJc2VsZi0+aW8uZG1hMiA9IGluZm8tPmRtYTI7CisJc2VsZi0+aW8uZmlmb19zaXplID0gMzI7CisJc2VsZi0+Y2hpcF9pZCA9IGlkOworCXNlbGYtPnN0X2ZpZm8ubGVuID0gMDsKKwlzZWxmLT5SeERhdGFSZWFkeSA9IDA7CisKKwkvKiBSZXNlcnZlIHRoZSBpb3BvcnRzIHRoYXQgd2UgbmVlZCAqLworCWlmICghcmVxdWVzdF9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQsIGRyaXZlcl9uYW1lKSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBjYW4ndCBnZXQgaW9iYXNlIG9mIDB4JTAzeFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+aW8uZmlyX2Jhc2UpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQxOworCX0KKwkKKwkvKiBJbml0aWFsaXplIFFvUyBmb3IgdGhpcyBkZXZpY2UgKi8KKwlpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKCZzZWxmLT5xb3MpOworCisJLyogQ2hlY2sgaWYgdXNlciBoYXMgc3VwcGxpZWQgdGhlIGRvbmdsZSBpZCBvciBub3QgKi8KKwlpZiAoIWRvbmdsZV9pZCkKKwkJZG9uZ2xlX2lkID0gdmlhX2lyY2NfcmVhZF9kb25nbGVfaWQoc2VsZi0+aW8uZmlyX2Jhc2UpOworCXNlbGYtPmlvLmRvbmdsZV9pZCA9IGRvbmdsZV9pZDsKKworCS8qIFRoZSBvbmx5IHZhbHVlIHdlIG11c3Qgb3ZlcnJpZGUgaXQgdGhlIGJhdWRyYXRlICovCisJLyogTWF4aW11bSBzcGVlZHMgYW5kIGNhcGFiaWxpdGllcyBhcmUgZG9uZ2xlLWRlcGVuZGFudC4gKi8KKwlzd2l0Y2goIHNlbGYtPmlvLmRvbmdsZV9pZCApeworCWNhc2UgMHgwZDoKKwkJc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzID0KKwkJICAgIElSXzk2MDAgfCBJUl8xOTIwMCB8IElSXzM4NDAwIHwgSVJfNTc2MDAgfCBJUl8xMTUyMDAgfAorCQkgICAgSVJfNTc2MDAwIHwgSVJfMTE1MjAwMCB8IChJUl80MDAwMDAwIDw8IDgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgPQorCQkgICAgSVJfOTYwMCB8IElSXzE5MjAwIHwgSVJfMzg0MDAgfCBJUl81NzYwMCB8IElSXzExNTIwMDsKKwkJYnJlYWs7CisJfQorCisJLyogRm9sbG93aW5nIHdhcyB1c2VkIGZvciB0ZXN0aW5nOgorCSAqCisJICogICBzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgPSBJUl85NjAwOworCSAqCisJICogSXMgaXMgbm8gZ29vZCwgYXMgaXQgcHJvaGliaXRzIChlcnJvci1wcm9uZSkgc3BlZWQtY2hhbmdlcy4KKwkgKi8KKworCXNlbGYtPnFvcy5taW5fdHVybl90aW1lLmJpdHMgPSBxb3NfbXR0X2JpdHM7CisJaXJkYV9xb3NfYml0c190b192YWx1ZSgmc2VsZi0+cW9zKTsKKworCS8qIE1heCBETUEgYnVmZmVyIHNpemUgbmVlZGVkID0gKGRhdGFfc2l6ZSArIDYpICogKHdpbmRvd19zaXplKSArIDY7ICovCisJc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSA9IDE0Mzg0ICsgMjA0ODsKKwlzZWxmLT50eF9idWZmLnRydWVzaXplID0gMTQzODQgKyAyMDQ4OworCisJLyogQWxsb2NhdGUgbWVtb3J5IGlmIG5lZWRlZCAqLworCXNlbGYtPnJ4X2J1ZmYuaGVhZCA9CisJCWRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJCSAgICZzZWxmLT5yeF9idWZmX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNlbGYtPnJ4X2J1ZmYuaGVhZCA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDI7CisJfQorCW1lbXNldChzZWxmLT5yeF9idWZmLmhlYWQsIDAsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUpOworCisJc2VsZi0+dHhfYnVmZi5oZWFkID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICAgJnNlbGYtPnR4X2J1ZmZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+dHhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0MzsKKwl9CisJbWVtc2V0KHNlbGYtPnR4X2J1ZmYuaGVhZCwgMCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CisKKwlzZWxmLT5yeF9idWZmLmluX2ZyYW1lID0gRkFMU0U7CisJc2VsZi0+cnhfYnVmZi5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCXNlbGYtPnJ4X2J1ZmYuZGF0YSA9IHNlbGYtPnJ4X2J1ZmYuaGVhZDsKKworCS8qIFJlc2V0IFR4IHF1ZXVlIGluZm8gKi8KKwlzZWxmLT50eF9maWZvLmxlbiA9IHNlbGYtPnR4X2ZpZm8ucHRyID0gc2VsZi0+dHhfZmlmby5mcmVlID0gMDsKKwlzZWxmLT50eF9maWZvLnRhaWwgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisKKwkvKiBLZWVwIHRyYWNrIG9mIG1vZHVsZSB1c2FnZSAqLworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIE92ZXJyaWRlIHRoZSBuZXR3b3JrIGZ1bmN0aW9ucyB3ZSBuZWVkIHRvIHVzZSAqLworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gdmlhX2lyY2NfaGFyZF94bWl0X3NpcjsKKwlkZXYtPm9wZW4gPSB2aWFfaXJjY19uZXRfb3BlbjsKKwlkZXYtPnN0b3AgPSB2aWFfaXJjY19uZXRfY2xvc2U7CisJZGV2LT5kb19pb2N0bCA9IHZpYV9pcmNjX25ldF9pb2N0bDsKKwlkZXYtPmdldF9zdGF0cyA9IHZpYV9pcmNjX25ldF9nZXRfc3RhdHM7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQ0OworCisJSVJEQV9NRVNTQUdFKCJJckRBOiBSZWdpc3RlcmVkIGRldmljZSAlcyAodmlhLWlyY2MpXG4iLCBkZXYtPm5hbWUpOworCisJLyogSW5pdGlhbGlzZSB0aGUgaGFyZHdhcmUuLgorCSovCisJc2VsZi0+aW8uc3BlZWQgPSA5NjAwOworCXZpYV9od19pbml0KHNlbGYpOworCXJldHVybiAwOworIGVycl9vdXQ0OgorCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkgIHNlbGYtPnR4X2J1ZmYuaGVhZCwgc2VsZi0+dHhfYnVmZl9kbWEpOworIGVycl9vdXQzOgorCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkgIHNlbGYtPnJ4X2J1ZmYuaGVhZCwgc2VsZi0+cnhfYnVmZl9kbWEpOworIGVycl9vdXQyOgorCXJlbGVhc2VfcmVnaW9uKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0KTsKKyBlcnJfb3V0MToKKwlmcmVlX25ldGRldihkZXYpOworCWRldl9zZWxmW2ldID0gTlVMTDsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2NfY2xvc2UgKHNlbGYpCisgKgorICogICAgQ2xvc2UgZHJpdmVyIGluc3RhbmNlCisgKgorICovCitzdGF0aWMgaW50IHZpYV9pcmNjX2Nsb3NlKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCVJlc2V0Q2hpcChpb2Jhc2UsIDUpOwkvL2hhcmR3YXJlIHJlc2V0LgorCS8qIFJlbW92ZSBuZXRkZXZpY2UgKi8KKwl1bnJlZ2lzdGVyX25ldGRldihzZWxmLT5uZXRkZXYpOworCisJLyogUmVsZWFzZSB0aGUgUE9SVCB0aGF0IHRoaXMgZHJpdmVyIGlzIHVzaW5nICovCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgUmVsZWFzaW5nIFJlZ2lvbiAlMDN4XG4iLAorCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPmlvLmZpcl9iYXNlKTsKKwlyZWxlYXNlX3JlZ2lvbihzZWxmLT5pby5maXJfYmFzZSwgc2VsZi0+aW8uZmlyX2V4dCk7CisJaWYgKHNlbGYtPnR4X2J1ZmYuaGVhZCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgIHNlbGYtPnR4X2J1ZmYuaGVhZCwgc2VsZi0+dHhfYnVmZl9kbWEpOworCWlmIChzZWxmLT5yeF9idWZmLmhlYWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKKwlkZXZfc2VsZltzZWxmLT5pbmRleF0gPSBOVUxMOworCisJZnJlZV9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gdmlhX2h3X2luaXQoc2VsZikKKyAqCisgKiAgICBSZXR1cm5zIG5vbi1uZWdhdGl2ZSBvbiBzdWNjZXNzLgorICoKKyAqIEZvcm1lcmx5IHZpYV9pcmNjX3NldHVwIAorICovCitzdGF0aWMgdm9pZCB2aWFfaHdfaW5pdChzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCVNldE1heFJ4UGFja2V0U2l6ZShpb2Jhc2UsIDB4MGZmZik7CS8vc2V0IHRvIG1heDo0MDk1CisJLy8gRklGTyBJbml0CisJRW5SWEZJRk9SZWFkeUludChpb2Jhc2UsIE9GRik7CisJRW5SWEZJRk9IYWxmTGV2ZWxJbnQoaW9iYXNlLCBPRkYpOworCUVuVFhGSUZPSGFsZkxldmVsSW50KGlvYmFzZSwgT0ZGKTsKKwlFblRYRklGT1VuZGVycnVuRU9NSW50KGlvYmFzZSwgT04pOworCUVuVFhGSUZPUmVhZHlJbnQoaW9iYXNlLCBPRkYpOworCUludmVydFRYKGlvYmFzZSwgT0ZGKTsKKwlJbnZlcnRSWChpb2Jhc2UsIE9GRik7CisKKwlpZiAoUmVhZExQQ1JlZygweDIwKSA9PSAweDNjKQorCQlXcml0ZUxQQ1JlZygweEYwLCAwKTsJLy8gZm9yIFZUMTIxMQorCS8qIEludCBJbml0ICovCisJRW5SWFNwZWNJbnQoaW9iYXNlLCBPTik7CisKKwkvKiBUaGUgZm9sbG93aW5nIGlzIGJhc2ljYWxseSBod3Jlc2V0ICovCisJLyogSWYgdGhpcyBpcyB0aGUgY2FzZSwgd2h5IG5vdCBqdXN0IGNhbGwgaHdyZXNldCgpID8gSmVhbiBJSSAqLworCVJlc2V0Q2hpcChpb2Jhc2UsIDUpOworCUVuYWJsZURNQShpb2Jhc2UsIE9GRik7CisJRW5hYmxlVFgoaW9iYXNlLCBPRkYpOworCUVuYWJsZVJYKGlvYmFzZSwgT0ZGKTsKKwlFblJYRE1BKGlvYmFzZSwgT0ZGKTsKKwlFblRYRE1BKGlvYmFzZSwgT0ZGKTsKKwlSWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKwlUWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKwlJbml0Q2FyZChpb2Jhc2UpOworCUNvbW1vbkluaXQoaW9iYXNlKTsKKwlTSVJGaWx0ZXIoaW9iYXNlLCBPTik7CisJU2V0U0lSKGlvYmFzZSwgT04pOworCUNSQzE2KGlvYmFzZSwgT04pOworCUVuVFhDUkMoaW9iYXNlLCAwKTsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfU1RfQ1RfMCwgMHgwMCk7CisJU2V0QmF1ZFJhdGUoaW9iYXNlLCA5NjAwKTsKKwlTZXRQdWxzZVdpZHRoKGlvYmFzZSwgMTIpOworCVNldFNlbmRQcmVhbWJsZUNvdW50KGlvYmFzZSwgMCk7CisKKwlzZWxmLT5pby5zcGVlZCA9IDk2MDA7CisJc2VsZi0+c3RfZmlmby5sZW4gPSAwOworCisJdmlhX2lyY2NfY2hhbmdlX2RvbmdsZV9zcGVlZChpb2Jhc2UsIHNlbGYtPmlvLnNwZWVkLAorCQkJCSAgICAgc2VsZi0+aW8uZG9uZ2xlX2lkKTsKKworCVdyaXRlUmVnKGlvYmFzZSwgSV9TVF9DVF8wLCAweDgwKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX3JlYWRfZG9uZ2xlX2lkICh2b2lkKQorICoKKyAqLworc3RhdGljIGludCB2aWFfaXJjY19yZWFkX2RvbmdsZV9pZChpbnQgaW9iYXNlKQoreworCWludCBkb25nbGVfaWQgPSA5OwkvKiBEZWZhdWx0IHRvIElCTSAqLworCisJSVJEQV9FUlJPUigidmlhLWlyY2M6IGRvbmdsZSBwcm9iaW5nIG5vdCBzdXBwb3J0ZWQsIHBsZWFzZSBzcGVjaWZ5IGRvbmdsZV9pZCBtb2R1bGUgcGFyYW1ldGVyLlxuIik7CisJcmV0dXJuIGRvbmdsZV9pZDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQgKGlvYmFzZSwgc3BlZWQsIGRvbmdsZV9pZCkKKyAqICAgIENoYW5nZSBzcGVlZCBvZiB0aGUgYXR0YWNoIGRvbmdsZQorICogICAgb25seSBpbXBsZW1lbnQgdHdvIHR5cGUgb2YgZG9uZ2xlIGN1cnJlbnRseS4KKyAqLworc3RhdGljIHZvaWQgdmlhX2lyY2NfY2hhbmdlX2RvbmdsZV9zcGVlZChpbnQgaW9iYXNlLCBpbnQgc3BlZWQsCisJCQkJCSBpbnQgZG9uZ2xlX2lkKQoreworCXU4IG1vZGUgPSAwOworCisJLyogc3BlZWQgaXMgdW51c2VkLCBhcyB3ZSB1c2UgSXNTSVJPbigpL0lzTUlST24oKSAqLworCXNwZWVkID0gc3BlZWQ7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpOiBjaGFuZ2VfZG9uZ2xlX3NwZWVkIHRvICVkIGZvciAweCV4LCAlZFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBzcGVlZCwgaW9iYXNlLCBkb25nbGVfaWQpOworCisJc3dpdGNoIChkb25nbGVfaWQpIHsKKworCQkvKiBOb3RlOiBUaGUgZG9uZ2xlX2lkJ3MgbGlzdGVkIGhlcmUgYXJlIGRlcml2ZWQgZnJvbQorCQkgKiBuc2MtaXJjYy5jICovIAorCisJY2FzZSAweDA4OgkJLyogSFAgSFNETC0yMzAwLCBIUCBIU0RMLTM2MDAvSFNETC0zNjEwICovCisJCVVzZU9uZVJYKGlvYmFzZSwgT04pOwkvLyB1c2Ugb25lIFJYIHBpbiAgIFJYMSxSWDIKKwkJSW52ZXJ0VFgoaW9iYXNlLCBPRkYpOworCQlJbnZlcnRSWChpb2Jhc2UsIE9GRik7CisKKwkJRW5SWDIoaW9iYXNlLCBPTik7CS8vc2lyIHRvIHJ4MgorCQlFbkdQSU90b1JYMihpb2Jhc2UsIE9GRik7CisKKwkJaWYgKElzU0lST24oaW9iYXNlKSkgewkvL3NpcgorCQkJLy8gTW9kZSBzZWxlY3QgT2ZmCisJCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9OKTsKKwkJCXVkZWxheSgxMDAwKTsKKwkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT0ZGKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChJc01JUk9uKGlvYmFzZSkpIHsJLy9taXIKKwkJCQkvLyBNb2RlIHNlbGVjdCBPbgorCQkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT0ZGKTsKKwkJCQl1ZGVsYXkoMjApOworCQkJfSBlbHNlIHsJLy8gZmlyCisJCQkJaWYgKElzRklST24oaW9iYXNlKSkgewkvL2ZpcgorCQkJCQkvLyBNb2RlIHNlbGVjdCBPbgorCQkJCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9GRik7CisJCQkJCXVkZWxheSgyMCk7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSAweDA5OgkJLyogSUJNMzFUMTEwMCBvciBUZW1pYyBURkRTNjAwMC9URkRTNjUwMCAqLworCQlVc2VPbmVSWChpb2Jhc2UsIE9OKTsJLy91c2UgT05FIFJYLi4uLlJYMQorCQlJbnZlcnRUWChpb2Jhc2UsIE9GRik7CisJCUludmVydFJYKGlvYmFzZSwgT0ZGKTsJLy8gaW52ZXJ0IFJYIHBpbgorCisJCUVuUlgyKGlvYmFzZSwgT04pOworCQlFbkdQSU90b1JYMihpb2Jhc2UsIE9GRik7CisJCWlmIChJc1NJUk9uKGlvYmFzZSkpIHsJLy9zaXIKKwkJCS8vIE1vZGUgc2VsZWN0IE9uCisJCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9OKTsKKwkJCXVkZWxheSgyMCk7CisJCQkvLyBNb2RlIHNlbGVjdCBPZmYKKwkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT0ZGKTsKKwkJfQorCQlpZiAoSXNNSVJPbihpb2Jhc2UpKSB7CS8vbWlyCisJCQkvLyBNb2RlIHNlbGVjdCBPbgorCQkJU2xvd0lSUlhMb3dBY3RpdmUoaW9iYXNlLCBPRkYpOworCQkJdWRlbGF5KDIwKTsKKwkJCS8vIE1vZGUgc2VsZWN0IE9mZgorCQkJU2xvd0lSUlhMb3dBY3RpdmUoaW9iYXNlLCBPTik7CisJCX0gZWxzZSB7CS8vIGZpcgorCQkJaWYgKElzRklST24oaW9iYXNlKSkgewkvL2ZpcgorCQkJCS8vIE1vZGUgc2VsZWN0IE9uCisJCQkJU2xvd0lSUlhMb3dBY3RpdmUoaW9iYXNlLCBPRkYpOworCQkJCS8vIFRYIE9uCisJCQkJV3JpdGVUWChpb2Jhc2UsIE9OKTsKKwkJCQl1ZGVsYXkoMjApOworCQkJCS8vIE1vZGUgc2VsZWN0IE9GRgorCQkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT04pOworCQkJCXVkZWxheSgyMCk7CisJCQkJLy8gVFggT2ZmCisJCQkJV3JpdGVUWChpb2Jhc2UsIE9GRik7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDB4MGQ6CisJCVVzZU9uZVJYKGlvYmFzZSwgT0ZGKTsJLy8gdXNlIHR3byBSWCBwaW4gICBSWDEsUlgyCisJCUludmVydFRYKGlvYmFzZSwgT0ZGKTsKKwkJSW52ZXJ0UlgoaW9iYXNlLCBPRkYpOworCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9GRik7CisJCWlmIChJc1NJUk9uKGlvYmFzZSkpIHsJLy9zaXIKKwkJCUVuR1BJT3RvUlgyKGlvYmFzZSwgT0ZGKTsKKwkJCVdyaXRlR0lPKGlvYmFzZSwgT0ZGKTsKKwkJCUVuUlgyKGlvYmFzZSwgT0ZGKTsJLy9zaXIgdG8gcngyCisJCX0gZWxzZSB7CS8vIGZpciBtaXIKKwkJCUVuR1BJT3RvUlgyKGlvYmFzZSwgT0ZGKTsKKwkJCVdyaXRlR0lPKGlvYmFzZSwgT0ZGKTsKKwkJCUVuUlgyKGlvYmFzZSwgT0ZGKTsJLy9maXIgdG8gcngKKwkJfQorCQlicmVhazsKKworCWNhc2UgMHgxMToJCS8qIFRlbWljIFRGRFM0NTAwICovCisKKwkJSVJEQV9ERUJVRygyLCAiJXM6IFRlbWljIFRGRFM0NTAwOiBPbmUgUlggcGluLCBUWCBub3JtYWwsIFJYIGludmVydGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKworCQlVc2VPbmVSWChpb2Jhc2UsIE9OKTsJLy91c2UgT05FIFJYLi4uLlJYMQorCQlJbnZlcnRUWChpb2Jhc2UsIE9GRik7CisJCUludmVydFJYKGlvYmFzZSwgT04pOwkvLyBpbnZlcnQgUlggcGluCisJCisJCUVuUlgyKGlvYmFzZSwgT04pOwkvL3NpciB0byByeDIKKwkJRW5HUElPdG9SWDIoaW9iYXNlLCBPRkYpOworCisJCWlmKCBJc1NJUk9uKGlvYmFzZSkgKXsJLy9zaXIKKworCQkJLy8gTW9kZSBzZWxlY3QgT24KKwkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT04pOworCQkJdWRlbGF5KDIwKTsKKwkJCS8vIE1vZGUgc2VsZWN0IE9mZgorCQkJU2xvd0lSUlhMb3dBY3RpdmUoaW9iYXNlLCBPRkYpOworCisJCX0gZWxzZXsKKwkJCUlSREFfREVCVUcoMCwgIiVzOiBXYXJuaW5nOiBURkRTNDUwMCBub3QgcnVubmluZyBpbiBTSVIgbW9kZSAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQl9CisJCWJyZWFrOworCisJY2FzZSAweDBmZjoJCS8qIFZpc2hheSAqLworCQlpZiAoSXNTSVJPbihpb2Jhc2UpKQorCQkJbW9kZSA9IDA7CisJCWVsc2UgaWYgKElzTUlST24oaW9iYXNlKSkKKwkJCW1vZGUgPSAxOworCQllbHNlIGlmIChJc0ZJUk9uKGlvYmFzZSkpCisJCQltb2RlID0gMjsKKwkJZWxzZSBpZiAoSXNWRklST24oaW9iYXNlKSkKKwkJCW1vZGUgPSA1OwkvL1ZGSVItMTYKKwkJU0lfU2V0TW9kZShpb2Jhc2UsIG1vZGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzOiBFcnJvcjogZG9uZ2xlX2lkICVkIHVuc3VwcG9ydGVkICFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV9pZCk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2NfY2hhbmdlX3NwZWVkIChzZWxmLCBiYXVkKQorICoKKyAqICAgIENoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIHZvaWQgdmlhX2lyY2NfY2hhbmdlX3NwZWVkKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwgX191MzIgc3BlZWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNlbGYtPm5ldGRldjsKKwl1MTYgaW9iYXNlOworCXU4IHZhbHVlID0gMCwgYlRtcDsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCS8qIFVwZGF0ZSBhY2NvdW50aW5nIGZvciBuZXcgc3BlZWQgKi8KKwlzZWxmLT5pby5zcGVlZCA9IHNwZWVkOworCUlSREFfREVCVUcoMSwgIiVzOiBjaGFuZ2Vfc3BlZWQgdG8gJWQgYnBzLlxuIiwgX19GVU5DVElPTl9fLCBzcGVlZCk7CisKKwlXcml0ZVJlZyhpb2Jhc2UsIElfU1RfQ1RfMCwgMHgwKTsKKworCS8qIENvbnRyb2xsZXIgbW9kZSBzZWxsZWN0aW9uICovCisJc3dpdGNoIChzcGVlZCkgeworCWNhc2UgMjQwMDoKKwljYXNlIDk2MDA6CisJY2FzZSAxOTIwMDoKKwljYXNlIDM4NDAwOgorCWNhc2UgNTc2MDA6CisJY2FzZSAxMTUyMDA6CisJCXZhbHVlID0gKDExNTIwMC9zcGVlZCktMTsKKwkJU2V0U0lSKGlvYmFzZSwgT04pOworCQlDUkMxNihpb2Jhc2UsIE9OKTsKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDA6CisJCS8qIEZJWE1FOiB0aGlzIGNhbid0IGJlIHJpZ2h0LCBhcyBpdCdzIHRoZSBzYW1lIGFzIDExNTIwMCwKKwkJICogYW5kIDU3NjAwMCBpcyBNSVIsIG5vdCBTSVIuICovCisJCXZhbHVlID0gMDsKKwkJU2V0U0lSKGlvYmFzZSwgT04pOworCQlDUkMxNihpb2Jhc2UsIE9OKTsKKwkJYnJlYWs7CisJY2FzZSAxMTUyMDAwOgorCQl2YWx1ZSA9IDA7CisJCVNldE1JUihpb2Jhc2UsIE9OKTsKKwkJLyogRklYTUU6IENSQyA/Pz8gKi8KKwkJYnJlYWs7CisJY2FzZSA0MDAwMDAwOgorCQl2YWx1ZSA9IDA7CisJCVNldEZJUihpb2Jhc2UsIE9OKTsKKwkJU2V0UHVsc2VXaWR0aChpb2Jhc2UsIDApOworCQlTZXRTZW5kUHJlYW1ibGVDb3VudChpb2Jhc2UsIDE0KTsKKwkJQ1JDMTYoaW9iYXNlLCBPRkYpOworCQlFblRYQ1JDKGlvYmFzZSwgT04pOworCQlicmVhazsKKwljYXNlIDE2MDAwMDAwOgorCQl2YWx1ZSA9IDA7CisJCVNldFZGSVIoaW9iYXNlLCBPTik7CisJCS8qIEZJWE1FOiBDUkMgPz8/ICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZhbHVlID0gMDsKKwkJYnJlYWs7CisJfQorCisJLyogU2V0IGJhdWRyYXRlIHRvIDB4MTlbMi4uN10gKi8KKwliVG1wID0gKFJlYWRSZWcoaW9iYXNlLCBJX0NGX0hfMSkgJiAweDAzKTsKKwliVG1wIHw9IHZhbHVlIDw8IDI7CisJV3JpdGVSZWcoaW9iYXNlLCBJX0NGX0hfMSwgYlRtcCk7CisKKwkvKiBTb21lIGRvbmdsZXMgbWF5IG5lZWQgdG8gYmUgaW5mb3JtZWQgYWJvdXQgc3BlZWQgY2hhbmdlcy4gKi8KKwl2aWFfaXJjY19jaGFuZ2VfZG9uZ2xlX3NwZWVkKGlvYmFzZSwgc3BlZWQsIHNlbGYtPmlvLmRvbmdsZV9pZCk7CisKKwkvKiBTZXQgRklGTyBzaXplIHRvIDY0ICovCisJU2V0RklGTyhpb2Jhc2UsIDY0KTsKKworCS8qIEVuYWJsZSBJUiAqLworCVdyaXRlUmVnKGlvYmFzZSwgSV9TVF9DVF8wLCAweDgwKTsKKworCS8vIEVuVFhGSUZPSGFsZkxldmVsSW50KGlvYmFzZSxPTik7CisKKwkvKiBFbmFibGUgc29tZSBpbnRlcnJ1cHRzIHNvIHdlIGNhbiByZWNlaXZlIGZyYW1lcyAqLworCS8vRW5BbGxJbnQoaW9iYXNlLE9OKTsKKworCWlmIChJc1NJUk9uKGlvYmFzZSkpIHsKKwkJU0lSRmlsdGVyKGlvYmFzZSwgT04pOworCQlTSVJSZWN2QW55KGlvYmFzZSwgT04pOworCX0gZWxzZSB7CisJCVNJUkZpbHRlcihpb2Jhc2UsIE9GRik7CisJCVNJUlJlY3ZBbnkoaW9iYXNlLCBPRkYpOworCX0KKworCWlmIChzcGVlZCA+IDExNTIwMCkgeworCQkvKiBJbnN0YWxsIEZJUiB4bWl0IGhhbmRsZXIgKi8KKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB2aWFfaXJjY19oYXJkX3htaXRfZmlyOworCQl2aWFfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKKwl9IGVsc2UgeworCQkvKiBJbnN0YWxsIFNJUiB4bWl0IGhhbmRsZXIgKi8KKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB2aWFfaXJjY19oYXJkX3htaXRfc2lyOworCX0KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19oYXJkX3htaXQgKHNrYiwgZGV2KQorICoKKyAqICAgIFRyYW5zbWl0IHRoZSBmcmFtZSEKKyAqCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfaGFyZF94bWl0X3NpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgaW9iYXNlOworCV9fdTMyIHNwZWVkOworCisJc2VsZiA9IChzdHJ1Y3QgdmlhX2lyY2NfY2IgKikgZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlpZiAoKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJCS8qIENoZWNrIGZvciBlbXB0eSBmcmFtZSAqLworCQlpZiAoIXNrYi0+bGVuKSB7CisJCQl2aWFfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc3BlZWQpOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKwl9CisJSW5pdENhcmQoaW9iYXNlKTsKKwlDb21tb25Jbml0KGlvYmFzZSk7CisJU0lSRmlsdGVyKGlvYmFzZSwgT04pOworCVNldFNJUihpb2Jhc2UsIE9OKTsKKwlDUkMxNihpb2Jhc2UsIE9OKTsKKwlFblRYQ1JDKGlvYmFzZSwgMCk7CisJV3JpdGVSZWcoaW9iYXNlLCBJX1NUX0NUXzAsIDB4MDApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisJc2VsZi0+dHhfYnVmZi5sZW4gPQorCSAgICBhc3luY193cmFwX3NrYihza2IsIHNlbGYtPnR4X2J1ZmYuZGF0YSwKKwkJCSAgIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOworCisJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CisJLyogU2VuZCB0aGlzIGZyYW1lIHdpdGggb2xkIHNwZWVkICovCisJU2V0QmF1ZFJhdGUoaW9iYXNlLCBzZWxmLT5pby5zcGVlZCk7CisJU2V0UHVsc2VXaWR0aChpb2Jhc2UsIDEyKTsKKwlTZXRTZW5kUHJlYW1ibGVDb3VudChpb2Jhc2UsIDApOworCVdyaXRlUmVnKGlvYmFzZSwgSV9TVF9DVF8wLCAweDgwKTsKKworCUVuYWJsZVRYKGlvYmFzZSwgT04pOworCUVuYWJsZVJYKGlvYmFzZSwgT0ZGKTsKKworCVJlc2V0Q2hpcChpb2Jhc2UsIDApOworCVJlc2V0Q2hpcChpb2Jhc2UsIDEpOworCVJlc2V0Q2hpcChpb2Jhc2UsIDIpOworCVJlc2V0Q2hpcChpb2Jhc2UsIDMpOworCVJlc2V0Q2hpcChpb2Jhc2UsIDQpOworCisJRW5BbGxJbnQoaW9iYXNlLCBPTik7CisJRW5UWERNQShpb2Jhc2UsIE9OKTsKKwlFblJYRE1BKGlvYmFzZSwgT0ZGKTsKKworCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYSwgc2VsZi0+dHhfYnVmZl9kbWEsIHNlbGYtPnR4X2J1ZmYubGVuLAorCQkgICAgICAgRE1BX1RYX01PREUpOworCisJU2V0U2VuZEJ5dGUoaW9iYXNlLCBzZWxmLT50eF9idWZmLmxlbik7CisJUlhTdGFydChpb2Jhc2UsIE9GRik7CisJVFhTdGFydChpb2Jhc2UsIE9OKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2lyY2NfaGFyZF94bWl0X2ZpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGY7CisJdTE2IGlvYmFzZTsKKwlfX3UzMiBzcGVlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2VsZiA9IChzdHJ1Y3QgdmlhX2lyY2NfY2IgKikgZGV2LT5wcml2OworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJaWYgKHNlbGYtPnN0X2ZpZm8ubGVuKQorCQlyZXR1cm4gMDsKKwlpZiAoc2VsZi0+Y2hpcF9pZCA9PSAweDMwNzYpCisJCWlvZGVsYXkoMTUwMCk7CisJZWxzZQorCQl1ZGVsYXkoMTUwMCk7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCWlmICgoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQpICYmIChzcGVlZCAhPSAtMSkpIHsKKwkJaWYgKCFza2ItPmxlbikgeworCQkJdmlhX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNwZWVkKTsKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0ID0gc2VsZi0+dHhfZmlmby50YWlsOworCXNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5sZW4gPSBza2ItPmxlbjsKKworCXNlbGYtPnR4X2ZpZm8udGFpbCArPSBza2ItPmxlbjsKKwlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwltZW1jcHkoc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0LCBza2ItPmRhdGEsCisJICAgICAgIHNrYi0+bGVuKTsKKwlzZWxmLT50eF9maWZvLmxlbisrOworCXNlbGYtPnR4X2ZpZm8uZnJlZSsrOworLy9GMDEgICBpZiAoc2VsZi0+dHhfZmlmby5sZW4gPT0gMSkgeworCXZpYV9pcmNjX2RtYV94bWl0KHNlbGYsIGlvYmFzZSk7CisvL0YwMSAgIH0KKy8vRjAxICAgaWYgKHNlbGYtPnR4X2ZpZm8uZnJlZSA8IChNQVhfVFhfV0lORE9XIC0xICkpIG5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgdmlhX2lyY2NfZG1hX3htaXQoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLCB1MTYgaW9iYXNlKQoreworCUVuVFhETUEoaW9iYXNlLCBPRkYpOworCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1hNSVQ7CisJRW5QaHlzKGlvYmFzZSwgT04pOworCUVuYWJsZVRYKGlvYmFzZSwgT04pOworCUVuYWJsZVJYKGlvYmFzZSwgT0ZGKTsKKwlSZXNldENoaXAoaW9iYXNlLCAwKTsKKwlSZXNldENoaXAoaW9iYXNlLCAxKTsKKwlSZXNldENoaXAoaW9iYXNlLCAyKTsKKwlSZXNldENoaXAoaW9iYXNlLCAzKTsKKwlSZXNldENoaXAoaW9iYXNlLCA0KTsKKwlFbkFsbEludChpb2Jhc2UsIE9OKTsKKwlFblRYRE1BKGlvYmFzZSwgT04pOworCUVuUlhETUEoaW9iYXNlLCBPRkYpOworCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYSwKKwkJICAgICAgICgodTggKilzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5zdGFydCAtCisJCQlzZWxmLT50eF9idWZmLmhlYWQpICsgc2VsZi0+dHhfYnVmZl9kbWEsCisJCSAgICAgICBzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5sZW4sIERNQV9UWF9NT0RFKTsKKwlJUkRBX0RFQlVHKDEsICIlczogdHhfZmlmby5wdHI9JXgsbGVuPSV4LHR4X2ZpZm8ubGVuPSV4Li5cbiIsCisJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+dHhfZmlmby5wdHIsCisJCSAgIHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5wdHJdLmxlbiwKKwkJICAgc2VsZi0+dHhfZmlmby5sZW4pOworCisJU2V0U2VuZEJ5dGUoaW9iYXNlLCBzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5sZW4pOworCVJYU3RhcnQoaW9iYXNlLCBPRkYpOworCVRYU3RhcnQoaW9iYXNlLCBPTik7CisJcmV0dXJuIDA7CisKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2RtYV94bWl0X2NvbXBsZXRlIChzZWxmKQorICoKKyAqICAgIFRoZSB0cmFuc2ZlciBvZiBhIGZyYW1lIGluIGZpbmlzaGVkLiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgCisgKiAgICBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKyAqCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisJaW50IHJldCA9IFRSVUU7CisJdTggVHhfc3RhdHVzOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCS8qIERpc2FibGUgRE1BICovCisvLyAgICAgIERpc2FibGVEbWFDaGFubmVsKHNlbGYtPmlvLmRtYSk7CisJLyogQ2hlY2sgZm9yIHVuZGVycnJ1biEgKi8KKwkvKiBDbGVhciBiaXQsIGJ5IHdyaXRpbmcgMSBpbnRvIGl0ICovCisJVHhfc3RhdHVzID0gR2V0VFhTdGF0dXMoaW9iYXNlKTsKKwlpZiAoVHhfc3RhdHVzICYgMHgwOCkgeworCQlzZWxmLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJc2VsZi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJaHdyZXNldChzZWxmKTsKKy8vIGhvdyB0byBjbGVhciB1bmRlcnJydW4gPworCX0gZWxzZSB7CisJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJUmVzZXRDaGlwKGlvYmFzZSwgMyk7CisJCVJlc2V0Q2hpcChpb2Jhc2UsIDQpOworCX0KKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KKwlpZiAoc2VsZi0+bmV3X3NwZWVkKSB7CisJCXZpYV9pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzZWxmLT5uZXdfc3BlZWQpOworCQlzZWxmLT5uZXdfc3BlZWQgPSAwOworCX0KKworCS8qIEZpbmlzaGVkIHdpdGggdGhpcyBmcmFtZSwgc28gcHJlcGFyZSBmb3IgbmV4dCAqLworCWlmIChJc0ZJUk9uKGlvYmFzZSkpIHsKKwkJaWYgKHNlbGYtPnR4X2ZpZm8ubGVuKSB7CisJCQlzZWxmLT50eF9maWZvLmxlbi0tOworCQkJc2VsZi0+dHhfZmlmby5wdHIrKzsKKwkJfQorCX0KKwlJUkRBX0RFQlVHKDEsCisJCSAgICIlczogdHhfZmlmby5sZW49JXggLHR4X2ZpZm8ucHRyPSV4LHR4X2ZpZm8uZnJlZT0leC4uLlxuIiwKKwkJICAgX19GVU5DVElPTl9fLAorCQkgICBzZWxmLT50eF9maWZvLmxlbiwgc2VsZi0+dHhfZmlmby5wdHIsIHNlbGYtPnR4X2ZpZm8uZnJlZSk7CisvKiBGMDFfUworCS8vIEFueSBmcmFtZXMgdG8gYmUgc2VudCBiYWNrLXRvLWJhY2s/IAorCWlmIChzZWxmLT50eF9maWZvLmxlbikgeworCQkvLyBOb3QgZmluaXNoZWQgeWV0ISAKKwkgIAl2aWFfaXJjY19kbWFfeG1pdChzZWxmLCBpb2Jhc2UpOworCQlyZXQgPSBGQUxTRTsKKwl9IGVsc2UgeyAKK0YwMV9FKi8KKwkvLyBSZXNldCBUeCBGSUZPIGluZm8gCisJc2VsZi0+dHhfZmlmby5sZW4gPSBzZWxmLT50eF9maWZvLnB0ciA9IHNlbGYtPnR4X2ZpZm8uZnJlZSA9IDA7CisJc2VsZi0+dHhfZmlmby50YWlsID0gc2VsZi0+dHhfYnVmZi5oZWFkOworLy9GMDEgICB9CisKKwkvLyBNYWtlIHN1cmUgd2UgaGF2ZSByb29tIGZvciBtb3JlIGZyYW1lcyAKKy8vRjAxICAgaWYgKHNlbGYtPnR4X2ZpZm8uZnJlZSA8IChNQVhfVFhfV0lORE9XIC0xICkpIHsKKwkvLyBOb3QgYnVzeSB0cmFuc21pdHRpbmcgYW55bW9yZSAKKwkvLyBUZWxsIHRoZSBuZXR3b3JrIGxheWVyLCB0aGF0IHdlIGNhbiBhY2NlcHQgbW9yZSBmcmFtZXMgCisJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworLy9GMDEgICB9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2RtYV9yZWNlaXZlIChzZWxmKQorICoKKyAqICAgIFNldCBjb25maWd1cmF0aW9uIGZvciByZWNlaXZlIGEgZnJhbWUuCisgKgorICovCitzdGF0aWMgaW50IHZpYV9pcmNjX2RtYV9yZWNlaXZlKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2VsZi0+dHhfZmlmby5sZW4gPSBzZWxmLT50eF9maWZvLnB0ciA9IHNlbGYtPnR4X2ZpZm8uZnJlZSA9IDA7CisJc2VsZi0+dHhfZmlmby50YWlsID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCXNlbGYtPlJ4RGF0YVJlYWR5ID0gMDsKKwlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19SRUNWOworCXNlbGYtPnJ4X2J1ZmYuZGF0YSA9IHNlbGYtPnJ4X2J1ZmYuaGVhZDsKKwlzZWxmLT5zdF9maWZvLmxlbiA9IHNlbGYtPnN0X2ZpZm8ucGVuZGluZ19ieXRlcyA9IDA7CisJc2VsZi0+c3RfZmlmby50YWlsID0gc2VsZi0+c3RfZmlmby5oZWFkID0gMDsKKworCUVuUGh5cyhpb2Jhc2UsIE9OKTsKKwlFbmFibGVUWChpb2Jhc2UsIE9GRik7CisJRW5hYmxlUlgoaW9iYXNlLCBPTik7CisKKwlSZXNldENoaXAoaW9iYXNlLCAwKTsKKwlSZXNldENoaXAoaW9iYXNlLCAxKTsKKwlSZXNldENoaXAoaW9iYXNlLCAyKTsKKwlSZXNldENoaXAoaW9iYXNlLCAzKTsKKwlSZXNldENoaXAoaW9iYXNlLCA0KTsKKworCUVuQWxsSW50KGlvYmFzZSwgT04pOworCUVuVFhETUEoaW9iYXNlLCBPRkYpOworCUVuUlhETUEoaW9iYXNlLCBPTik7CisJaXJkYV9zZXR1cF9kbWEoc2VsZi0+aW8uZG1hMiwgc2VsZi0+cnhfYnVmZl9kbWEsCisJCSAgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwgRE1BX1JYX01PREUpOworCVRYU3RhcnQoaW9iYXNlLCBPRkYpOworCVJYU3RhcnQoaW9iYXNlLCBPTik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlIChzZWxmKQorICoKKyAqICAgIENvbnRyb2xsZXIgRmluaXNoZWQgd2l0aCByZWNlaXZpbmcgZnJhbWVzLAorICogICAgYW5kIHRoaXMgcm91dGluZSBpcyBjYWxsIGJ5IElTUgorICogICAgCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLAorCQkJCQkgaW50IGlvYmFzZSkKK3sKKwlzdHJ1Y3Qgc3RfZmlmbyAqc3RfZmlmbzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBsZW4sIGk7CisJdTggc3RhdHVzID0gMDsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCXN0X2ZpZm8gPSAmc2VsZi0+c3RfZmlmbzsKKworCWlmIChzZWxmLT5pby5zcGVlZCA8IDQwMDAwMDApIHsJLy9TcGVlZCBiZWxvdyBGSVIKKwkJbGVuID0gR2V0UmVjdkJ5dGUoaW9iYXNlLCBzZWxmKTsKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAxKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIEZBTFNFOworCQkvLyBNYWtlIHN1cmUgSVAgaGVhZGVyIGdldHMgYWxpZ25lZCAKKwkJc2tiX3Jlc2VydmUoc2tiLCAxKTsKKwkJc2tiX3B1dChza2IsIGxlbiAtIDIpOworCQlpZiAoc2VsZi0+Y2hpcF9pZCA9PSAweDMwNzYpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW4gLSAyOyBpKyspCisJCQkJc2tiLT5kYXRhW2ldID0gc2VsZi0+cnhfYnVmZi5kYXRhW2kgKiAyXTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzZWxmLT5jaGlwX2lkID09IDB4MzA5NikgeworCQkJCWZvciAoaSA9IDA7IGkgPCBsZW4gLSAyOyBpKyspCisJCQkJCXNrYi0+ZGF0YVtpXSA9CisJCQkJCSAgICBzZWxmLT5yeF9idWZmLmRhdGFbaV07CisJCQl9CisJCX0KKwkJLy8gTW92ZSB0byBuZXh0IGZyYW1lIAorCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOworCQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CisJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOworCQluZXRpZl9yeChza2IpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwllbHNlIHsJCQkvL0ZJUiBtb2RlCisJCWxlbiA9IEdldFJlY3ZCeXRlKGlvYmFzZSwgc2VsZik7CisJCWlmIChsZW4gPT0gMCkKKwkJCXJldHVybiBUUlVFOwkvL2ludGVycnVwdCBvbmx5LCBkYXRhIG1heWJlIG1vdmUgYnkgUnhUICAKKwkJaWYgKCgobGVuIC0gNCkgPCAyKSB8fCAoKGxlbiAtIDQpID4gMjA0OCkpIHsKKwkJCUlSREFfREVCVUcoMSwgIiVzKCk6IFRyb3VibGU6bGVuPSV4LEN1ckNvdW50PSV4LExhc3RDb3VudD0leC4uXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXywgbGVuLCBSeEN1ckNvdW50KGlvYmFzZSwgc2VsZiksCisJCQkJICAgc2VsZi0+UnhMYXN0Q291bnQpOworCQkJaHdyZXNldChzZWxmKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQlJUkRBX0RFQlVHKDIsICIlcygpOiBmaWZvLmxlbj0leCxsZW49JXgsQ3VyQ291bnQ9JXguLlxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywKKwkJCSAgIHN0X2ZpZm8tPmxlbiwgbGVuIC0gNCwgUnhDdXJDb3VudChpb2Jhc2UsIHNlbGYpKTsKKworCQlzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPnRhaWxdLnN0YXR1cyA9IHN0YXR1czsKKwkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT50YWlsXS5sZW4gPSBsZW47CisJCXN0X2ZpZm8tPnBlbmRpbmdfYnl0ZXMgKz0gbGVuOworCQlzdF9maWZvLT50YWlsKys7CisJCXN0X2ZpZm8tPmxlbisrOworCQlpZiAoc3RfZmlmby0+dGFpbCA+IE1BWF9SWF9XSU5ET1cpCisJCQlzdF9maWZvLT50YWlsID0gMDsKKwkJc2VsZi0+UnhEYXRhUmVhZHkgPSAwOworCisJCS8vIEl0IG1heWJlIGhhdmUgTUFYX1JYX1dJTkRPVyBwYWNrYWdlIHJlY2VpdmUgYnkKKwkJLy8gcmVjZWl2ZV9jb21wbGV0ZSBiZWZvcmUgVGltZXIgSVJRCisvKiBGMDFfUworICAgICAgICAgIGlmIChzdF9maWZvLT5sZW4gPCAoTUFYX1JYX1dJTkRPVysyICkpIHsgCisJCSAgUlhTdGFydChpb2Jhc2UsT04pOworCSAgCSAgU2V0VGltZXIoaW9iYXNlLDQpOworCSAgfQorCSAgZWxzZQkgIHsgCitGMDFfRSAqLworCQlFbmFibGVSWChpb2Jhc2UsIE9GRik7CisJCUVuUlhETUEoaW9iYXNlLCBPRkYpOworCQlSWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKy8vRjAxX1MKKwkJLy8gUHV0IHRoaXMgZW50cnkgYmFjayBpbiBmaWZvIAorCQlpZiAoc3RfZmlmby0+aGVhZCA+IE1BWF9SWF9XSU5ET1cpCisJCQlzdF9maWZvLT5oZWFkID0gMDsKKwkJc3RhdHVzID0gc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT5oZWFkXS5zdGF0dXM7CisJCWxlbiA9IHN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0ubGVuOworCQlzdF9maWZvLT5oZWFkKys7CisJCXN0X2ZpZm8tPmxlbi0tOworCisJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMSAtIDQpOworCQkvKgorCQkgKiBpZiBmcmFtZSBzaXplLGRhdGEgcHRyLG9yIHNrYiBwdHIgYXJlIHdyb25nICx0aGUgZ2V0IG5leHQKKwkJICogZW50cnkuCisJCSAqLworCQlpZiAoKHNrYiA9PSBOVUxMKSB8fCAoc2tiLT5kYXRhID09IE5VTEwpCisJCSAgICB8fCAoc2VsZi0+cnhfYnVmZi5kYXRhID09IE5VTEwpIHx8IChsZW4gPCA2KSkgeworCQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJc2tiX3Jlc2VydmUoc2tiLCAxKTsKKwkJc2tiX3B1dChza2IsIGxlbiAtIDQpOworCisJCW1lbWNweShza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuIC0gNCk7CisJCUlSREFfREVCVUcoMiwgIiVzKCk6IGxlbj0leC5yeF9idWZmPSVwXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICBsZW4gLSA0LCBzZWxmLT5yeF9idWZmLmRhdGEpOworCisJCS8vIE1vdmUgdG8gbmV4dCBmcmFtZSAKKwkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKKwkJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OworCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwkJbmV0aWZfcngoc2tiKTsKKworLy9GMDFfRQorCX0JCQkvL0ZJUgorCXJldHVybiBUUlVFOworCit9CisKKy8qCisgKiBpZiBmcmFtZSBpcyByZWNlaXZlZCAsIGJ1dCBubyBJTlQgLHRoZW4gdXNlIHRoaXMgcm91dGluZSB0byB1cGxvYWQgZnJhbWUuCisgKi8KK3N0YXRpYyBpbnQgdXBsb2FkX3J4ZGF0YShzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgbGVuOworCXN0cnVjdCBzdF9maWZvICpzdF9maWZvOworCXN0X2ZpZm8gPSAmc2VsZi0+c3RfZmlmbzsKKworCWxlbiA9IEdldFJlY3ZCeXRlKGlvYmFzZSwgc2VsZik7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpOiBsZW49JXhcbiIsIF9fRlVOQ1RJT05fXywgbGVuKTsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMSk7CisJaWYgKChza2IgPT0gTlVMTCkgfHwgKChsZW4gLSA0KSA8IDIpKSB7CisJCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlza2JfcmVzZXJ2ZShza2IsIDEpOworCXNrYl9wdXQoc2tiLCBsZW4gLSA0ICsgMSk7CisJbWVtY3B5KHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4gLSA0ICsgMSk7CisJc3RfZmlmby0+dGFpbCsrOworCXN0X2ZpZm8tPmxlbisrOworCWlmIChzdF9maWZvLT50YWlsID4gTUFYX1JYX1dJTkRPVykKKwkJc3RfZmlmby0+dGFpbCA9IDA7CisJLy8gTW92ZSB0byBuZXh0IGZyYW1lIAorCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CisJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOworCW5ldGlmX3J4KHNrYik7CisJaWYgKHN0X2ZpZm8tPmxlbiA8IChNQVhfUlhfV0lORE9XICsgMikpIHsKKwkJUlhTdGFydChpb2Jhc2UsIE9OKTsKKwl9IGVsc2UgeworCQlFbmFibGVSWChpb2Jhc2UsIE9GRik7CisJCUVuUlhETUEoaW9iYXNlLCBPRkYpOworCQlSWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBJbXBsZW1lbnQgYmFjayB0byBiYWNrIHJlY2VpdmUgLCB1c2UgdGhpcyByb3V0aW5lIHRvIHVwbG9hZCBkYXRhLgorICovCisKK3N0YXRpYyBpbnQgUnhUaW1lckhhbmRsZXIoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKQoreworCXN0cnVjdCBzdF9maWZvICpzdF9maWZvOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGxlbjsKKwl1OCBzdGF0dXM7CisKKwlzdF9maWZvID0gJnNlbGYtPnN0X2ZpZm87CisKKwlpZiAoQ2tSeFJlY3YoaW9iYXNlLCBzZWxmKSkgeworCQkvLyBpZiBzdGlsbCByZWNlaXZpbmcgLHRoZW4gcmV0dXJuICxkb24ndCB1cGxvYWQgZnJhbWUgCisJCXNlbGYtPlJldHJ5Q291bnQgPSAwOworCQlTZXRUaW1lcihpb2Jhc2UsIDIwKTsKKwkJc2VsZi0+UnhEYXRhUmVhZHkrKzsKKwkJcmV0dXJuIEZBTFNFOworCX0gZWxzZQorCQlzZWxmLT5SZXRyeUNvdW50Kys7CisKKwlpZiAoKHNlbGYtPlJldHJ5Q291bnQgPj0gMSkgfHwKKwkgICAgKChzdF9maWZvLT5wZW5kaW5nX2J5dGVzICsgMjA0OCkgPiBzZWxmLT5yeF9idWZmLnRydWVzaXplKQorCSAgICB8fCAoc3RfZmlmby0+bGVuID49IChNQVhfUlhfV0lORE9XKSkpIHsKKwkJd2hpbGUgKHN0X2ZpZm8tPmxlbiA+IDApIHsJLy91cGxvYWQgZnJhbWUKKwkJCS8vIFB1dCB0aGlzIGVudHJ5IGJhY2sgaW4gZmlmbyAKKwkJCWlmIChzdF9maWZvLT5oZWFkID4gTUFYX1JYX1dJTkRPVykKKwkJCQlzdF9maWZvLT5oZWFkID0gMDsKKwkJCXN0YXR1cyA9IHN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0uc3RhdHVzOworCQkJbGVuID0gc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT5oZWFkXS5sZW47CisJCQlzdF9maWZvLT5oZWFkKys7CisJCQlzdF9maWZvLT5sZW4tLTsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAxIC0gNCk7CisJCQkvKgorCQkJICogaWYgZnJhbWUgc2l6ZSwgZGF0YSBwdHIsIG9yIHNrYiBwdHIgYXJlIHdyb25nLAorCQkJICogdGhlbiBnZXQgbmV4dCBlbnRyeS4KKwkJCSAqLworCQkJaWYgKChza2IgPT0gTlVMTCkgfHwgKHNrYi0+ZGF0YSA9PSBOVUxMKQorCQkJICAgIHx8IChzZWxmLT5yeF9idWZmLmRhdGEgPT0gTlVMTCkgfHwgKGxlbiA8IDYpKSB7CisJCQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc2tiX3Jlc2VydmUoc2tiLCAxKTsKKwkJCXNrYl9wdXQoc2tiLCBsZW4gLSA0KTsKKwkJCW1lbWNweShza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuIC0gNCk7CisKKwkJCUlSREFfREVCVUcoMiwgIiVzKCk6IGxlbj0leC5oZWFkPSV4XG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJICAgbGVuIC0gNCwgc3RfZmlmby0+aGVhZCk7CisKKwkJCS8vIE1vdmUgdG8gbmV4dCBmcmFtZSAKKwkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CisJCQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKKwkJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCX0JCS8vd2hpbGUKKwkJc2VsZi0+UmV0cnlDb3VudCA9IDA7CisKKwkJSVJEQV9ERUJVRygyLAorCQkJICAgIiVzKCk6IEVuZCBvZiB1cGxvYWQgSG9zdFN0YXR1cz0leCxSeFN0YXR1cz0leFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywKKwkJCSAgIEdldEhvc3RTdGF0dXMoaW9iYXNlKSwgR2V0UlhTdGF0dXMoaW9iYXNlKSk7CisKKwkJLyoKKwkJICogaWYgZnJhbWUgaXMgcmVjZWl2ZSBjb21wbGV0ZSBhdCB0aGlzIHJvdXRpbmUgLHRoZW4gdXBsb2FkCisJCSAqIGZyYW1lLgorCQkgKi8KKwkJaWYgKChHZXRSWFN0YXR1cyhpb2Jhc2UpICYgMHgxMCkKKwkJICAgICYmIChSeEN1ckNvdW50KGlvYmFzZSwgc2VsZikgIT0gc2VsZi0+UnhMYXN0Q291bnQpKSB7CisJCQl1cGxvYWRfcnhkYXRhKHNlbGYsIGlvYmFzZSk7CisJCQlpZiAoaXJkYV9kZXZpY2VfdHhxdWV1ZV9lbXB0eShzZWxmLT5uZXRkZXYpKQorCQkJCXZpYV9pcmNjX2RtYV9yZWNlaXZlKHNlbGYpOworCQl9CisJfQkJCS8vIHRpbWVyIGRldGVjdCBjb21wbGV0ZQorCWVsc2UKKwkJU2V0VGltZXIoaW9iYXNlLCA0KTsKKwlyZXR1cm4gVFJVRTsKKworfQorCisKKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2ludGVycnVwdCAoaXJxLCBkZXZfaWQsIHJlZ3MpCisgKgorICogICAgQW4gaW50ZXJydXB0IGZyb20gdGhlIGNoaXAgaGFzIGFycml2ZWQuIFRpbWUgdG8gZG8gc29tZSB3b3JrCisgKgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdmlhX2lyY2NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGY7CisJaW50IGlvYmFzZTsKKwl1OCBpSG9zdEludFR5cGUsIGlSeEludFR5cGUsIGlUeEludFR5cGU7CisKKwlpZiAoIWRldikgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgZHJpdmVyX25hbWUsCisJCQkgICAgIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJc2VsZiA9IChzdHJ1Y3QgdmlhX2lyY2NfY2IgKikgZGV2LT5wcml2OworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCXNwaW5fbG9jaygmc2VsZi0+bG9jayk7CisJaUhvc3RJbnRUeXBlID0gR2V0SG9zdFN0YXR1cyhpb2Jhc2UpOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKTogaUhvc3RJbnRUeXBlICUwMng6ICAlcyAlcyAlcyAgJTAyeFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBpSG9zdEludFR5cGUsCisJCSAgIChpSG9zdEludFR5cGUgJiAweDQwKSA/ICJUaW1lciIgOiAiIiwKKwkJICAgKGlIb3N0SW50VHlwZSAmIDB4MjApID8gIlR4IiA6ICIiLAorCQkgICAoaUhvc3RJbnRUeXBlICYgMHgxMCkgPyAiUngiIDogIiIsCisJCSAgIChpSG9zdEludFR5cGUgJiAweDBlKSA+PiAxKTsKKworCWlmICgoaUhvc3RJbnRUeXBlICYgMHg0MCkgIT0gMCkgewkvL1RpbWVyIEV2ZW50CisJCXNlbGYtPkV2ZW50RmxhZy5UaW1lT3V0Kys7CisJCUNsZWFyVGltZXJJbnQoaW9iYXNlLCAxKTsKKwkJaWYgKHNlbGYtPmlvLmRpcmVjdGlvbiA9PSBJT19YTUlUKSB7CisJCQl2aWFfaXJjY19kbWFfeG1pdChzZWxmLCBpb2Jhc2UpOworCQl9CisJCWlmIChzZWxmLT5pby5kaXJlY3Rpb24gPT0gSU9fUkVDVikgeworCQkJLyoKKwkJCSAqIGZyYW1lIHJlYWR5IGhvbGQgdG9vIGxvbmcsIG11c3QgcmVzZXQuCisJCQkgKi8KKwkJCWlmIChzZWxmLT5SeERhdGFSZWFkeSA+IDMwKSB7CisJCQkJaHdyZXNldChzZWxmKTsKKwkJCQlpZiAoaXJkYV9kZXZpY2VfdHhxdWV1ZV9lbXB0eShzZWxmLT5uZXRkZXYpKSB7CisJCQkJCXZpYV9pcmNjX2RtYV9yZWNlaXZlKHNlbGYpOworCQkJCX0KKwkJCX0gZWxzZSB7CS8vIGNhbGwgdGhpcyB0byB1cGxvYWQgZnJhbWUuCisJCQkJUnhUaW1lckhhbmRsZXIoc2VsZiwgaW9iYXNlKTsKKwkJCX0KKwkJfQkJLy9SRUNWCisJfQkJCS8vVGltZXIgRXZlbnQKKwlpZiAoKGlIb3N0SW50VHlwZSAmIDB4MjApICE9IDApIHsJLy9UeCBFdmVudAorCQlpVHhJbnRUeXBlID0gR2V0VFhTdGF0dXMoaW9iYXNlKTsKKworCQlJUkRBX0RFQlVHKDQsICIlcygpOiBpVHhJbnRUeXBlICUwMng6ICAlcyAlcyAlcyAlc1xuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgaVR4SW50VHlwZSwKKwkJCSAgIChpVHhJbnRUeXBlICYgMHgwOCkgPyAiRklGTyB1bmRlcnIuIiA6ICIiLAorCQkJICAgKGlUeEludFR5cGUgJiAweDA0KSA/ICJFT00iIDogIiIsCisJCQkgICAoaVR4SW50VHlwZSAmIDB4MDIpID8gIkZJRk8gcmVhZHkiIDogIiIsCisJCQkgICAoaVR4SW50VHlwZSAmIDB4MDEpID8gIkVhcmx5IEVPTSIgOiAiIik7CisKKwkJaWYgKGlUeEludFR5cGUgJiAweDQpIHsKKwkJCXNlbGYtPkV2ZW50RmxhZy5FT01lc3NhZ2UrKzsJLy8gcmVhZCBhbmQgd2lsbCBhdXRvIGNsZWFuCisJCQlpZiAodmlhX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc2VsZikpIHsKKwkJCQlpZiAoaXJkYV9kZXZpY2VfdHhxdWV1ZV9lbXB0eQorCQkJCSAgICAoc2VsZi0+bmV0ZGV2KSkgeworCQkJCQl2aWFfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXNlbGYtPkV2ZW50RmxhZy5Vbmtub3duKys7CisJCQl9CisJCX0JCS8vRU9QCisJfQkJCS8vVHggRXZlbnQKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlpZiAoKGlIb3N0SW50VHlwZSAmIDB4MTApICE9IDApIHsJLy9SeCBFdmVudAorCQkvKiBDaGVjayBpZiBETUEgaGFzIGZpbmlzaGVkICovCisJCWlSeEludFR5cGUgPSBHZXRSWFN0YXR1cyhpb2Jhc2UpOworCisJCUlSREFfREVCVUcoNCwgIiVzKCk6IGlSeEludFR5cGUgJTAyeDogICVzICVzICVzICVzICVzICVzICVzXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBpUnhJbnRUeXBlLAorCQkJICAgKGlSeEludFR5cGUgJiAweDgwKSA/ICJQSFkgZXJyLiIJOiAiIiwKKwkJCSAgIChpUnhJbnRUeXBlICYgMHg0MCkgPyAiQ1JDIGVyciIJOiAiIiwKKwkJCSAgIChpUnhJbnRUeXBlICYgMHgyMCkgPyAiRklGTyBvdmVyci4iCTogIiIsCisJCQkgICAoaVJ4SW50VHlwZSAmIDB4MTApID8gIkVPRiIJCTogIiIsCisJCQkgICAoaVJ4SW50VHlwZSAmIDB4MDgpID8gIlJ4RGF0YSIJOiAiIiwKKwkJCSAgIChpUnhJbnRUeXBlICYgMHgwMikgPyAiUnhNYXhMZW4iCTogIiIsCisJCQkgICAoaVJ4SW50VHlwZSAmIDB4MDEpID8gIlNJUiBiYWQiCTogIiIpOworCQlpZiAoIWlSeEludFR5cGUpCisJCQlJUkRBX0RFQlVHKDMsICIlcygpOiBSeElSUSA9MFxuIiwgX19GVU5DVElPTl9fKTsKKworCQlpZiAoaVJ4SW50VHlwZSAmIDB4MTApIHsKKwkJCWlmICh2aWFfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzZWxmLCBpb2Jhc2UpKSB7CisvL0YwMSAgICAgICBpZighKElzRklST24oaW9iYXNlKSkpICB2aWFfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKKwkJCQl2aWFfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKKwkJCX0KKwkJfQkJLy8gTm8gRVJSICAgICAKKwkJZWxzZSB7CQkvL0VSUgorCQkJSVJEQV9ERUJVRyg0LCAiJXMoKTogUnhJUlEgRVJSOmlSeEludFR5cGU9JXgsSG9zdEludFR5cGU9JXgsQ3VyQ291bnQ9JXgsUnhMYXN0Q291bnQ9JXhfX19fX1xuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIGlSeEludFR5cGUsIGlIb3N0SW50VHlwZSwKKwkJCQkgICBSeEN1ckNvdW50KGlvYmFzZSwgc2VsZiksCisJCQkJICAgc2VsZi0+UnhMYXN0Q291bnQpOworCisJCQlpZiAoaVJ4SW50VHlwZSAmIDB4MjApIHsJLy9GSUZPIE92ZXJSdW4gRVJSCisJCQkJUmVzZXRDaGlwKGlvYmFzZSwgMCk7CisJCQkJUmVzZXRDaGlwKGlvYmFzZSwgMSk7CisJCQl9IGVsc2UgewkvL1BIWSxDUkMgRVJSCisKKwkJCQlpZiAoaVJ4SW50VHlwZSAhPSAweDA4KQorCQkJCQlod3Jlc2V0KHNlbGYpOwkvL0YwMQorCQkJfQorCQkJdmlhX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CisJCX0JCS8vRVJSCisKKwl9CQkJLy9SeCBFdmVudAorCXNwaW5fdW5sb2NrKCZzZWxmLT5sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChpSG9zdEludFR5cGUpOworfQorCitzdGF0aWMgdm9pZCBod3Jlc2V0KHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCVJlc2V0Q2hpcChpb2Jhc2UsIDUpOworCUVuYWJsZURNQShpb2Jhc2UsIE9GRik7CisJRW5hYmxlVFgoaW9iYXNlLCBPRkYpOworCUVuYWJsZVJYKGlvYmFzZSwgT0ZGKTsKKwlFblJYRE1BKGlvYmFzZSwgT0ZGKTsKKwlFblRYRE1BKGlvYmFzZSwgT0ZGKTsKKwlSWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKwlUWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKwlJbml0Q2FyZChpb2Jhc2UpOworCUNvbW1vbkluaXQoaW9iYXNlKTsKKwlTSVJGaWx0ZXIoaW9iYXNlLCBPTik7CisJU2V0U0lSKGlvYmFzZSwgT04pOworCUNSQzE2KGlvYmFzZSwgT04pOworCUVuVFhDUkMoaW9iYXNlLCAwKTsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfU1RfQ1RfMCwgMHgwMCk7CisJU2V0QmF1ZFJhdGUoaW9iYXNlLCA5NjAwKTsKKwlTZXRQdWxzZVdpZHRoKGlvYmFzZSwgMTIpOworCVNldFNlbmRQcmVhbWJsZUNvdW50KGlvYmFzZSwgMCk7CisJV3JpdGVSZWcoaW9iYXNlLCBJX1NUX0NUXzAsIDB4ODApOworCisJLyogUmVzdG9yZSBzcGVlZC4gKi8KKwl2aWFfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+aW8uc3BlZWQpOworCisJc2VsZi0+c3RfZmlmby5sZW4gPSAwOworfQorCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2NfaXNfcmVjZWl2aW5nIChzZWxmKQorICoKKyAqICAgIFJldHVybiBUUlVFIGlzIHdlIGFyZSBjdXJyZW50bHkgcmVjZWl2aW5nIGEgZnJhbWUKKyAqCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfaXNfcmVjZWl2aW5nKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgc3RhdHVzID0gRkFMU0U7CisJaW50IGlvYmFzZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIEZBTFNFOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwlpZiAoQ2tSeFJlY3YoaW9iYXNlLCBzZWxmKSkKKwkJc3RhdHVzID0gVFJVRTsKKworCUlSREFfREVCVUcoMiwgIiVzKCk6IHN0YXR1cz0leC4uLi5cbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX25ldF9vcGVuIChkZXYpCisgKgorICogICAgU3RhcnQgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIGludCB2aWFfaXJjY19uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZjsKKwlpbnQgaW9iYXNlOworCWNoYXIgaHduYW1lWzMyXTsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IChzdHJ1Y3QgdmlhX2lyY2NfY2IgKikgZGV2LT5wcml2OworCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMgPSAwOworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwlpZiAocmVxdWVzdF9pcnEoc2VsZi0+aW8uaXJxLCB2aWFfaXJjY19pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkgeworCQlJUkRBX1dBUk5JTkcoIiVzLCB1bmFibGUgdG8gYWxsb2NhdGUgaXJxPSVkXG4iLCBkcml2ZXJfbmFtZSwKKwkJCSAgICAgc2VsZi0+aW8uaXJxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCS8qCisJICogQWx3YXlzIGFsbG9jYXRlIHRoZSBETUEgY2hhbm5lbCBhZnRlciB0aGUgSVJRLCBhbmQgY2xlYW4gdXAgb24gCisJICogZmFpbHVyZS4KKwkgKi8KKwlpZiAocmVxdWVzdF9kbWEoc2VsZi0+aW8uZG1hLCBkZXYtPm5hbWUpKSB7CisJCUlSREFfV0FSTklORygiJXMsIHVuYWJsZSB0byBhbGxvY2F0ZSBkbWE9JWRcbiIsIGRyaXZlcl9uYW1lLAorCQkJICAgICBzZWxmLT5pby5kbWEpOworCQlmcmVlX2lycShzZWxmLT5pby5pcnEsIHNlbGYpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJaWYgKHNlbGYtPmlvLmRtYTIgIT0gc2VsZi0+aW8uZG1hKSB7CisJCWlmIChyZXF1ZXN0X2RtYShzZWxmLT5pby5kbWEyLCBkZXYtPm5hbWUpKSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzLCB1bmFibGUgdG8gYWxsb2NhdGUgZG1hMj0lZFxuIiwKKwkJCQkgICAgIGRyaXZlcl9uYW1lLCBzZWxmLT5pby5kbWEyKTsKKwkJCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgc2VsZik7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0KKworCisJLyogdHVybiBvbiBpbnRlcnJ1cHRzICovCisJRW5BbGxJbnQoaW9iYXNlLCBPTik7CisJRW5JbnRlcm5hbExvb3AoaW9iYXNlLCBPRkYpOworCUVuRXh0ZXJuYWxMb29wKGlvYmFzZSwgT0ZGKTsKKworCS8qICovCisJdmlhX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CisKKwkvKiBSZWFkeSB0byBwbGF5ISAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkvKiAKKwkgKiBPcGVuIG5ldyBJckxBUCBsYXllciBpbnN0YW5jZSwgbm93IHRoYXQgZXZlcnl0aGluZyBzaG91bGQgYmUKKwkgKiBpbml0aWFsaXplZCBwcm9wZXJseSAKKwkgKi8KKwlzcHJpbnRmKGh3bmFtZSwgIlZJQSBAIDB4JXgiLCBpb2Jhc2UpOworCXNlbGYtPmlybGFwID0gaXJsYXBfb3BlbihkZXYsICZzZWxmLT5xb3MsIGh3bmFtZSk7CisKKwlzZWxmLT5SeExhc3RDb3VudCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX25ldF9jbG9zZSAoZGV2KQorICoKKyAqICAgIFN0b3AgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIGludCB2aWFfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGY7CisJaW50IGlvYmFzZTsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IChzdHJ1Y3QgdmlhX2lyY2NfY2IgKikgZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKworCS8qIFN0b3AgZGV2aWNlICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCS8qIFN0b3AgYW5kIHJlbW92ZSBpbnN0YW5jZSBvZiBJckxBUCAqLworCWlmIChzZWxmLT5pcmxhcCkKKwkJaXJsYXBfY2xvc2Uoc2VsZi0+aXJsYXApOworCXNlbGYtPmlybGFwID0gTlVMTDsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwlFblRYRE1BKGlvYmFzZSwgT0ZGKTsKKwlFblJYRE1BKGlvYmFzZSwgT0ZGKTsKKwlEaXNhYmxlRG1hQ2hhbm5lbChzZWxmLT5pby5kbWEpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJRW5BbGxJbnQoaW9iYXNlLCBPRkYpOworCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgZGV2KTsKKwlmcmVlX2RtYShzZWxmLT5pby5kbWEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19uZXRfaW9jdGwgKGRldiwgcnEsIGNtZCkKKyAqCisgKiAgICBQcm9jZXNzIElPQ1RMIGNvbW1hbmRzIGZvciB0aGlzIGRldmljZQorICoKKyAqLworc3RhdGljIGludCB2aWFfaXJjY19uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwKKwkJCSAgICAgIGludCBjbWQpCit7CisJc3RydWN0IGlmX2lyZGFfcmVxICppcnEgPSAoc3RydWN0IGlmX2lyZGFfcmVxICopIHJxOworCXN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSBkZXYtPnByaXY7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAlcywgKGNtZD0weCVYKVxuIiwgX19GVU5DVElPTl9fLCBkZXYtPm5hbWUsCisJCSAgIGNtZCk7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFORFdJRFRIOgkvKiBTZXQgYmFuZHdpZHRoICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJZ290byBvdXQ7CisJCX0KKwkJdmlhX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIGlycS0+aWZyX2JhdWRyYXRlKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU01FRElBQlVTWToJLyogU2V0IG1lZGlhIGJ1c3kgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlnb3RvIG91dDsKKwkJfQorCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKwljYXNlIFNJT0NHUkVDRUlWSU5HOgkvKiBDaGVjayBpZiB3ZSBhcmUgcmVjZWl2aW5nIHJpZ2h0IG5vdyAqLworCQlpcnEtPmlmcl9yZWNlaXZpbmcgPSB2aWFfaXJjY19pc19yZWNlaXZpbmcoc2VsZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKyAgICAgIG91dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp2aWFfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlCisJCQkJCQkgICAgICAgKmRldikKK3sKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IHZpYV9pcmNjX2NiICopIGRldi0+cHJpdjsKKworCXJldHVybiAmc2VsZi0+c3RhdHM7Cit9CisKK01PRFVMRV9BVVRIT1IoIlZJQSBUZWNobm9sb2dpZXMsaW5jIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSBJckRBIERldmljZSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQodmlhX2lyY2NfaW5pdCk7Cittb2R1bGVfZXhpdCh2aWFfaXJjY19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuaCBiL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDRiMWIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5oCkBAIC0wLDAgKzEsODUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIHZpYS1pcmNjLmgKKyAqIFZlcnNpb246ICAgICAgIDEuMAorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgVklBIFZUODIzMS9WVDgyMzMgSXJEQSBjaGlwc2V0cworICogQXV0aG9yOiAgICAgICAgVklBIFRlY2hub2xvZ2llcywgaW5jCisgKiBEYXRlICA6CSAgMDgvMDYvMjAwMworCitDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBWSUEgVGVjaG5vbG9naWVzLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCitBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyAqIENvbW1lbnQ6CisgKiBqdWwvMDgvMjAwMiA6IFJ4IGJ1ZmZlciBsZW5ndGggc2hvdWxkIHVzZSBSeCByaW5nIHB0ci4JCisgKiBPY3QvMjgvMjAwMiA6IEFkZCBTQiBpZCBmb3IgMzE0NyBhbmQgMzE3Ny4JCisgKiBqdWwvMDkvMjAwMiA6IG9ubHkgaW1wbGVtZW50IHR3byBraW5kIG9mIGRvbmdsZSBjdXJyZW50bHkuCisgKiBPY3QvMDIvMjAwMiA6IHdvcmsgb24gVlQ4MjMxIGFuZCBWVDgyMzMgLgorICogQXVnLzA2LzIwMDMgOiBjaGFuZ2UgZHJpdmVyIGZvcm1hdCB0byBwY2kgZHJpdmVyIC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgdmlhX0lSQ0NfSAorI2RlZmluZSB2aWFfSVJDQ19ICisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIE1BWF9UWF9XSU5ET1cgNworI2RlZmluZSBNQVhfUlhfV0lORE9XIDcKKworc3RydWN0IHN0X2ZpZm9fZW50cnkgeworCWludCBzdGF0dXM7CisJaW50IGxlbjsKK307CisKK3N0cnVjdCBzdF9maWZvIHsKKwlzdHJ1Y3Qgc3RfZmlmb19lbnRyeSBlbnRyaWVzW01BWF9SWF9XSU5ET1cgKyAyXTsKKwlpbnQgcGVuZGluZ19ieXRlczsKKwlpbnQgaGVhZDsKKwlpbnQgdGFpbDsKKwlpbnQgbGVuOworfTsKKworc3RydWN0IGZyYW1lX2NiIHsKKwl2b2lkICpzdGFydDsJCS8qIFN0YXJ0IG9mIGZyYW1lIGluIERNQSBtZW0gKi8KKwlpbnQgbGVuOwkJLyogTGVuZ2h0IG9mIGZyYW1lIGluIERNQSBtZW0gKi8KK307CisKK3N0cnVjdCB0eF9maWZvIHsKKwlzdHJ1Y3QgZnJhbWVfY2IgcXVldWVbTUFYX1RYX1dJTkRPVyArIDJdOwkvKiBJbmZvIGFib3V0IGZyYW1lcyBpbiBxdWV1ZSAqLworCWludCBwdHI7CQkvKiBDdXJyZW50bHkgYmVpbmcgc2VudCAqLworCWludCBsZW47CQkvKiBMZW5naHQgb2YgcXVldWUgKi8KKwlpbnQgZnJlZTsJCS8qIE5leHQgZnJlZSBzbG90ICovCisJdm9pZCAqdGFpbDsJCS8qIE5leHQgZnJlZSBzdGFydCBpbiBETUEgbWVtICovCit9OworCisKK3N0cnVjdCBldmVudGZsYWcJCS8vIGZvciBrZWVwaW5nIHRyYWNrIG9mIEludGVycnVwdCBFdmVudHMKK3sKKwkvLy0tLS0tLS0tdHggcGFydAorCXVuc2lnbmVkIGNoYXIgVHhGSUZPVW5kZXJSdW47CisJdW5zaWduZWQgY2hhciBFT01lc3NhZ2U7CisJdW5zaWduZWQgY2hhciBUeEZJRk9SZWFkeTsKKwl1bnNpZ25lZCBjaGFyIEVhcmx5RU9NOworCS8vLS0tLS0tLS1yeCBwYXJ0CisJdW5zaWduZWQgY2hhciBQSFlFcnI7CisJdW5zaWduZWQgY2hhciBDUkNFcnI7CisJdW5zaWduZWQgY2hhciBSeEZJRk9PdmVyUnVuOworCXVuc2lnbmVkIGNoYXIgRU9QYWNrZXQ7CisJdW5zaWduZWQgY2hhciBSeEF2YWlsOworCXVuc2lnbmVkIGNoYXIgVG9vTGFyZ2VQYWNrZXQ7CisJdW5zaWduZWQgY2hhciBTSVJCYWQ7CisJLy8tLS0tLS0tLXVua25vd24KKwl1bnNpZ25lZCBjaGFyIFVua25vd247CisJLy8tLS0tLS0tLS0tCisJdW5zaWduZWQgY2hhciBUaW1lT3V0OworCXVuc2lnbmVkIGNoYXIgUnhETUFUQzsKKwl1bnNpZ25lZCBjaGFyIFR4RE1BVEM7Cit9OworCisvKiBQcml2YXRlIGRhdGEgZm9yIGVhY2ggaW5zdGFuY2UgKi8KK3N0cnVjdCB2aWFfaXJjY19jYiB7CisJc3RydWN0IHN0X2ZpZm8gc3RfZmlmbzsJLyogSW5mbyBhYm91dCByZWNlaXZlZCBmcmFtZXMgKi8KKwlzdHJ1Y3QgdHhfZmlmbyB0eF9maWZvOwkvKiBJbmZvIGFib3V0IGZyYW1lcyB0byBiZSB0cmFuc21pdHRlZCAqLworCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsJLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisJc3RydWN0IGlybGFwX2NiICppcmxhcDsJLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLworCXN0cnVjdCBxb3NfaW5mbyBxb3M7CS8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCisKKwljaGlwaW9fdCBpbzsJCS8qIElyREEgY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLworCWlvYnVmZl90IHR4X2J1ZmY7CS8qIFRyYW5zbWl0IGJ1ZmZlciAqLworCWlvYnVmZl90IHJ4X2J1ZmY7CS8qIFJlY2VpdmUgYnVmZmVyICovCisJZG1hX2FkZHJfdCB0eF9idWZmX2RtYTsKKwlkbWFfYWRkcl90IHJ4X2J1ZmZfZG1hOworCisJX191OCBpZXI7CQkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisKKwlzdHJ1Y3QgdGltZXZhbCBzdGFtcDsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisKKwlzcGlubG9ja190IGxvY2s7CS8qIEZvciBzZXJpYWxpemluZyBvcGVyYXRpb25zICovCisKKwlfX3UzMiBmbGFnczsJCS8qIEludGVyZmFjZSBmbGFncyAqLworCV9fdTMyIG5ld19zcGVlZDsKKwlpbnQgaW5kZXg7CQkvKiBJbnN0YW5jZSBpbmRleCAqLworCisJc3RydWN0IGV2ZW50ZmxhZyBFdmVudEZsYWc7CisJc3RydWN0IHBtX2RldiAqZGV2OworCXVuc2lnbmVkIGludCBjaGlwX2lkOwkvKiB0byByZW1lbWJlciBjaGlwIGlkICovCisJdW5zaWduZWQgaW50IFJldHJ5Q291bnQ7CisJdW5zaWduZWQgaW50IFJ4RGF0YVJlYWR5OworCXVuc2lnbmVkIGludCBSeExhc3RDb3VudDsKK307CisKKworLy8tLS0tLS0tLS1JPUluZnJhcmVkLCAgSD1Ib3N0LCBNPU1pc2MsIFQ9VHgsIFI9UngsIFNUPVN0YXR1cywKKy8vICAgICAgICAgQ0Y9Q29uZmlnLCBDVD1Db250cm9sLCBMPUxvdywgSD1IaWdoLCBDPUNvdW50CisjZGVmaW5lICBJX0NGX0xfMCAgCQkweDEwCisjZGVmaW5lICBJX0NGX0hfMAkJMHgxMQorI2RlZmluZSAgSV9TSVJfQk9GCQkweDEyCisjZGVmaW5lICBJX1NJUl9FT0YJCTB4MTMKKyNkZWZpbmUgIElfU1RfQ1RfMAkJMHgxNQorI2RlZmluZSAgSV9TVF9MXzEJCTB4MTYKKyNkZWZpbmUgIElfU1RfSF8xCQkweDE3CisjZGVmaW5lICBJX0NGX0xfMQkJMHgxOAorI2RlZmluZSAgSV9DRl9IXzEJCTB4MTkKKyNkZWZpbmUgIElfQ0ZfTF8yCQkweDFhCisjZGVmaW5lICBJX0NGX0hfMgkJMHgxYgorI2RlZmluZSAgSV9DRl8zCQkweDFlCisjZGVmaW5lICBIX0NUCQkJMHgyMAorI2RlZmluZSAgSF9TVAkJCTB4MjEKKyNkZWZpbmUgIE1fQ1QJCQkweDIyCisjZGVmaW5lICBUWF9DVF8xCQkweDIzCisjZGVmaW5lICBUWF9DVF8yCQkweDI0CisjZGVmaW5lICBUWF9TVAkJCTB4MjUKKyNkZWZpbmUgIFJYX0NUCQkJMHgyNgorI2RlZmluZSAgUlhfU1QJCQkweDI3CisjZGVmaW5lICBSRVNFVAkJCTB4MjgKKyNkZWZpbmUgIFBfQUREUgkJMHgyOQorI2RlZmluZSAgUlhfQ19MCQkweDJhCisjZGVmaW5lICBSWF9DX0gJCTB4MmIKKyNkZWZpbmUgIFJYX1BfTAkJMHgyYworI2RlZmluZSAgUlhfUF9ICQkweDJkCisjZGVmaW5lICBUWF9DX0wJCTB4MmUKKyNkZWZpbmUgIFRYX0NfSAkJMHgyZgorI2RlZmluZSAgVElNRVIgICAgICAgICAJMHgzMgorI2RlZmluZSAgSV9DRl80ICAgICAgICAgCTB4MzMKKyNkZWZpbmUgIElfVF9DX0wJCTB4MzQKKyNkZWZpbmUgIElfVF9DX0gJCTB4MzUKKyNkZWZpbmUgIFZFUlNJT04JCTB4M2YKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBTdGFydEFkZHIgCTB4MTAJLy8gdGhlIGZpcnN0IHJlZ2lzdGVyIGFkZHJlc3MKKyNkZWZpbmUgRW5kQWRkciAJMHgzZgkvLyB0aGUgbGFzdCByZWdpc3RlciBhZGRyZXNzCisjZGVmaW5lIEdldEJpdCh2YWwsYml0KSAgdmFsID0gKHVuc2lnbmVkIGNoYXIpICgodmFsPj5iaXQpICYgMHgxKQorCQkJLy8gUmV0dXJucyB0aGUgYml0CisjZGVmaW5lIFNldEJpdCh2YWwsYml0KSAgdmFsPSAodW5zaWduZWQgY2hhciApICh2YWwgfCAoMHgxIDw8IGJpdCkpCisJCQkvLyBTZXRzIGJpdCB0byAxCisjZGVmaW5lIFJlc2V0Qml0KHZhbCxiaXQpIHZhbD0gKHVuc2lnbmVkIGNoYXIgKSAodmFsICYgfigweDEgPDwgYml0KSkKKwkJCS8vIFNldHMgYml0IHRvIDAKKworI2RlZmluZSBPRkYgICAwCisjZGVmaW5lIE9OICAgMQorI2RlZmluZSBETUFfVFhfTU9ERSAgIDB4MDgKKyNkZWZpbmUgRE1BX1JYX01PREUgICAweDA0CisKKyNkZWZpbmUgRE1BMSAgIDAKKyNkZWZpbmUgRE1BMiAgIDB4YzAKKyNkZWZpbmUgTUFTSzEgICBETUExKzB4MGEKKyNkZWZpbmUgTUFTSzIgICBETUEyKzB4MTQKKworI2RlZmluZSBDbGtfYml0IDB4NDAKKyNkZWZpbmUgVHhfYml0IDB4MDEKKyNkZWZpbmUgUmRfVmFsaWQgMHgwOAorI2RlZmluZSBSeEJpdCAweDA4CisKK3N0YXRpYyB2b2lkIERpc2FibGVEbWFDaGFubmVsKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXN3aXRjaCAoY2hhbm5lbCkgewkvLyA4IEJpdCBETUEgY2hhbm5lbHMgRE1BQzEKKwljYXNlIDA6CisJCW91dGIoNCwgTUFTSzEpOwkvL21hc2sgY2hhbm5lbCAwCisJCWJyZWFrOworCWNhc2UgMToKKwkJb3V0Yig1LCBNQVNLMSk7CS8vTWFzayBjaGFubmVsIDEKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlvdXRiKDYsIE1BU0sxKTsJLy9NYXNrIGNoYW5uZWwgMgorCQlicmVhazsKKwljYXNlIDM6CisJCW91dGIoNywgTUFTSzEpOwkvL01hc2sgY2hhbm5lbCAzCisJCWJyZWFrOworCWNhc2UgNToKKwkJb3V0Yig1LCBNQVNLMik7CS8vTWFzayBjaGFubmVsIDUKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlvdXRiKDYsIE1BU0syKTsJLy9NYXNrIGNoYW5uZWwgNgorCQlicmVhazsKKwljYXNlIDc6CisJCW91dGIoNywgTUFTSzIpOwkvL01hc2sgY2hhbm5lbCA3CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX07CQkJLy9Td2l0Y2gKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgUmVhZExQQ1JlZyhpbnQgaVJlZ051bSkKK3sKKwl1bnNpZ25lZCBjaGFyIGlWYWw7CisKKwlvdXRiKDB4ODcsIDB4MmUpOworCW91dGIoMHg4NywgMHgyZSk7CisJb3V0YihpUmVnTnVtLCAweDJlKTsKKwlpVmFsID0gaW5iKDB4MmYpOworCW91dGIoMHhhYSwgMHgyZSk7CisKKwlyZXR1cm4gaVZhbDsKK30KKworc3RhdGljIHZvaWQgV3JpdGVMUENSZWcoaW50IGlSZWdOdW0sIHVuc2lnbmVkIGNoYXIgaVZhbCkKK3sKKworCW91dGIoMHg4NywgMHgyZSk7CisJb3V0YigweDg3LCAweDJlKTsKKwlvdXRiKGlSZWdOdW0sIDB4MmUpOworCW91dGIoaVZhbCwgMHgyZik7CisJb3V0YigweEFBLCAweDJlKTsKK30KKworc3RhdGljIF9fdTggUmVhZFJlZyh1bnNpZ25lZCBpbnQgQmFzZUFkZHIsIGludCBpUmVnTnVtKQoreworCXJldHVybiAoKF9fdTgpIGluYihCYXNlQWRkciArIGlSZWdOdW0pKTsKK30KKworc3RhdGljIHZvaWQgV3JpdGVSZWcodW5zaWduZWQgaW50IEJhc2VBZGRyLCBpbnQgaVJlZ051bSwgdW5zaWduZWQgY2hhciBpVmFsKQoreworCW91dGIoaVZhbCwgQmFzZUFkZHIgKyBpUmVnTnVtKTsKK30KKworc3RhdGljIGludCBXcml0ZVJlZ0JpdCh1bnNpZ25lZCBpbnQgQmFzZUFkZHIsIHVuc2lnbmVkIGNoYXIgUmVnTnVtLAorCQl1bnNpZ25lZCBjaGFyIEJpdFBvcywgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlfX3U4IFJ0ZW1wLCBXdGVtcDsKKworCWlmIChCaXRQb3MgPiA3KSB7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKChSZWdOdW0gPCBTdGFydEFkZHIpIHx8IChSZWdOdW0gPiBFbmRBZGRyKSkKKwkJcmV0dXJuIC0xOworCVJ0ZW1wID0gUmVhZFJlZyhCYXNlQWRkciwgUmVnTnVtKTsKKwlpZiAodmFsdWUgPT0gMCkKKwkJV3RlbXAgPSBSZXNldEJpdChSdGVtcCwgQml0UG9zKTsKKwllbHNlIHsKKwkJaWYgKHZhbHVlID09IDEpCisJCQlXdGVtcCA9IFNldEJpdChSdGVtcCwgQml0UG9zKTsKKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCX0KKwlXcml0ZVJlZyhCYXNlQWRkciwgUmVnTnVtLCBXdGVtcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX3U4IENoZWNrUmVnQml0KHVuc2lnbmVkIGludCBCYXNlQWRkciwgdW5zaWduZWQgY2hhciBSZWdOdW0sCisJCSB1bnNpZ25lZCBjaGFyIEJpdFBvcykKK3sKKwlfX3U4IHRlbXA7CisKKwlpZiAoQml0UG9zID4gNykKKwkJcmV0dXJuIDB4ZmY7CisJaWYgKChSZWdOdW0gPCBTdGFydEFkZHIpIHx8IChSZWdOdW0gPiBFbmRBZGRyKSkgeworLy8gICAgIHByaW50Zigid2hhdCBpcyB0aGUgcmVnaXN0ZXIgJXghXG4iLFJlZ051bSk7CisJfQorCXRlbXAgPSBSZWFkUmVnKEJhc2VBZGRyLCBSZWdOdW0pOworCXJldHVybiBHZXRCaXQodGVtcCwgQml0UG9zKTsKK30KKworc3RhdGljIHZvaWQgU2V0TWF4UnhQYWNrZXRTaXplKF9fdTE2IGlvYmFzZSwgX191MTYgc2l6ZSkKK3sKKwlfX3UxNiBsb3csIGhpZ2g7CisJaWYgKChzaXplICYgMHhlMDAwKSA9PSAwKSB7CisJCWxvdyA9IHNpemUgJiAweDAwZmY7CisJCWhpZ2ggPSAoc2l6ZSAmIDB4MWYwMCkgPj4gODsKKwkJV3JpdGVSZWcoaW9iYXNlLCBJX0NGX0xfMiwgbG93KTsKKwkJV3JpdGVSZWcoaW9iYXNlLCBJX0NGX0hfMiwgaGlnaCk7CisKKwl9CisKK30KKworLy9mb3IgYm90aCBSeCBhbmQgVHgKKworc3RhdGljIHZvaWQgU2V0RklGTyhfX3UxNiBpb2Jhc2UsIF9fdTE2IHZhbHVlKQoreworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIDEyODoKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCAwLCAwKTsKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCA3LCAxKTsKKwkJYnJlYWs7CisJY2FzZSA2NDoKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCAwLCAwKTsKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCA3LCAwKTsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCAwLCAxKTsKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCA3LCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCAwLCAwKTsKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCA3LCAwKTsKKwl9CisKK30KKworI2RlZmluZSBDUkMxNihCYXNlQWRkcix2YWwpICAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9MXzAsNyx2YWwpCS8vMCBmb3IgMzIgQ1JDCisvKgorI2RlZmluZSBTZXRWRklSKEJhc2VBZGRyLHZhbCkgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9IXzAsNSx2YWwpCisjZGVmaW5lIFNldEZJUihCYXNlQWRkcix2YWwpICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGX0xfMCw2LHZhbCkKKyNkZWZpbmUgU2V0TUlSKEJhc2VBZGRyLHZhbCkgICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfTF8wLDUsdmFsKQorI2RlZmluZSBTZXRTSVIoQmFzZUFkZHIsdmFsKSAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9MXzAsNCx2YWwpCisqLworI2RlZmluZSBTSVJGaWx0ZXIoQmFzZUFkZHIsdmFsKSAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9MXzAsMyx2YWwpCisjZGVmaW5lIEZpbHRlcihCYXNlQWRkcix2YWwpICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGX0xfMCwyLHZhbCkKKyNkZWZpbmUgSW52ZXJ0VFgoQmFzZUFkZHIsdmFsKSAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfTF8wLDEsdmFsKQorI2RlZmluZSBJbnZlcnRSWChCYXNlQWRkcix2YWwpICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9MXzAsMCx2YWwpCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKipJX0NGX0hfMAorI2RlZmluZSBFbmFibGVUWChCYXNlQWRkcix2YWwpICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9IXzAsNCx2YWwpCisjZGVmaW5lIEVuYWJsZVJYKEJhc2VBZGRyLHZhbCkgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGX0hfMCwzLHZhbCkKKyNkZWZpbmUgRW5hYmxlRE1BKEJhc2VBZGRyLHZhbCkgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfSF8wLDIsdmFsKQorI2RlZmluZSBTSVJSZWN2QW55KEJhc2VBZGRyLHZhbCkgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9IXzAsMSx2YWwpCisjZGVmaW5lIERpYWJsZVRyYW5zKEJhc2VBZGRyLHZhbCkgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGX0hfMCwwLHZhbCkKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqSV9TSVJfQk9GLElfU0lSX0VPRgorI2RlZmluZSBTZXRTSVJCT0YoQmFzZUFkZHIsdmFsKSAgICAgV3JpdGVSZWcoQmFzZUFkZHIsSV9TSVJfQk9GLHZhbCkKKyNkZWZpbmUgU2V0U0lSRU9GKEJhc2VBZGRyLHZhbCkgICAgIFdyaXRlUmVnKEJhc2VBZGRyLElfU0lSX0VPRix2YWwpCisjZGVmaW5lIEdldFNJUkJPRihCYXNlQWRkcikgICAgICAgIFJlYWRSZWcoQmFzZUFkZHIsSV9TSVJfQk9GKQorI2RlZmluZSBHZXRTSVJFT0YoQmFzZUFkZHIpICAgICAgICBSZWFkUmVnKEJhc2VBZGRyLElfU0lSX0VPRikKKy8vKioqKioqKioqKioqKioqKioqKklfU1RfQ1RfMAorI2RlZmluZSBFblBoeXMoQmFzZUFkZHIsdmFsKSAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfU1RfQ1RfMCw3LHZhbCkKKyNkZWZpbmUgSXNNb2RlRXJyb3IoQmFzZUFkZHIpIENoZWNrUmVnQml0KEJhc2VBZGRyLElfU1RfQ1RfMCw2KQkvL1JPCisjZGVmaW5lIElzVkZJUk9uKEJhc2VBZGRyKSAgICAgQ2hlY2tSZWdCaXQoQmFzZUFkZHIsMHgxNCwwKQkvL1JPIGZvciBWVDEyMTEgb25seQorI2RlZmluZSBJc0ZJUk9uKEJhc2VBZGRyKSAgICAgQ2hlY2tSZWdCaXQoQmFzZUFkZHIsSV9TVF9DVF8wLDUpCS8vUk8KKyNkZWZpbmUgSXNNSVJPbihCYXNlQWRkcikgICAgIENoZWNrUmVnQml0KEJhc2VBZGRyLElfU1RfQ1RfMCw0KQkvL1JPCisjZGVmaW5lIElzU0lST24oQmFzZUFkZHIpICAgICBDaGVja1JlZ0JpdChCYXNlQWRkcixJX1NUX0NUXzAsMykJLy9STworI2RlZmluZSBJc0VuYWJsZVRYKEJhc2VBZGRyKSAgQ2hlY2tSZWdCaXQoQmFzZUFkZHIsSV9TVF9DVF8wLDIpCS8vUk8KKyNkZWZpbmUgSXNFbmFibGVSWChCYXNlQWRkcikgIENoZWNrUmVnQml0KEJhc2VBZGRyLElfU1RfQ1RfMCwxKQkvL1JPCisjZGVmaW5lIElzMTZDUkMoQmFzZUFkZHIpICAgICBDaGVja1JlZ0JpdChCYXNlQWRkcixJX1NUX0NUXzAsMCkJLy9STworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKipJX0NGXzMKKyNkZWZpbmUgRGlzYWJsZUFkamFjZW50UHVsc2VXaWR0aChCYXNlQWRkcix2YWwpIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfMyw1LHZhbCkJLy8xIGRpc2FibGUKKyNkZWZpbmUgRGlzYWJsZVB1bHNlV2lkdGhBZGp1c3QoQmFzZUFkZHIsdmFsKSAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfMyw0LHZhbCkJLy8xIGRpc2FibGUKKyNkZWZpbmUgVXNlT25lUlgoQmFzZUFkZHIsdmFsKSAgICAgICAgICAgICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfMywxLHZhbCkJLy8wIHVzZSB0d28gUlgKKyNkZWZpbmUgU2xvd0lSUlhMb3dBY3RpdmUoQmFzZUFkZHIsdmFsKSAgICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfMywwLHZhbCkJLy8wIHNob3cgUlggaGlnaD0xIGluIFNJUgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKipIX0NUCisjZGVmaW5lIEVuQWxsSW50KEJhc2VBZGRyLHZhbCkgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixIX0NULDcsdmFsKQorI2RlZmluZSBUWFN0YXJ0KEJhc2VBZGRyLHZhbCkgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSF9DVCw2LHZhbCkKKyNkZWZpbmUgUlhTdGFydChCYXNlQWRkcix2YWwpICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLEhfQ1QsNSx2YWwpCisjZGVmaW5lIENsZWFyUlhJbnQoQmFzZUFkZHIsdmFsKSAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLEhfQ1QsNCx2YWwpCS8vIDEgY2xlYXIKKy8vKioqKioqKioqKioqKioqKipIX1NUCisjZGVmaW5lIElzUlhJbnQoQmFzZUFkZHIpICAgICAgICAgICBDaGVja1JlZ0JpdChCYXNlQWRkcixIX1NULDQpCisjZGVmaW5lIEdldEludEluZGVudGlmeShCYXNlQWRkcikgICAoKFJlYWRSZWcoQmFzZUFkZHIsSF9TVCkmMHhmMSkgPj4xKQorI2RlZmluZSBJc0hvc3RCdXN5KEJhc2VBZGRyKSAgICAgICAgQ2hlY2tSZWdCaXQoQmFzZUFkZHIsSF9TVCwwKQorI2RlZmluZSBHZXRIb3N0U3RhdHVzKEJhc2VBZGRyKSAgICAgUmVhZFJlZyhCYXNlQWRkcixIX1NUKQkvL1JPCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqTV9DVAorI2RlZmluZSBFblRYRE1BKEJhc2VBZGRyLHZhbCkgICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixNX0NULDcsdmFsKQorI2RlZmluZSBFblJYRE1BKEJhc2VBZGRyLHZhbCkgICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixNX0NULDYsdmFsKQorI2RlZmluZSBTd2FwRE1BKEJhc2VBZGRyLHZhbCkgICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixNX0NULDUsdmFsKQorI2RlZmluZSBFbkludGVybmFsTG9vcChCYXNlQWRkcix2YWwpICBXcml0ZVJlZ0JpdChCYXNlQWRkcixNX0NULDQsdmFsKQorI2RlZmluZSBFbkV4dGVybmFsTG9vcChCYXNlQWRkcix2YWwpICBXcml0ZVJlZ0JpdChCYXNlQWRkcixNX0NULDMsdmFsKQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKlRYX0NUXzEKKyNkZWZpbmUgRW5UWEZJRk9IYWxmTGV2ZWxJbnQoQmFzZUFkZHIsdmFsKSAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLFRYX0NUXzEsNCx2YWwpCS8vaGFsZiBlbXB0eSBpbnQgKDEgaGFsZikKKyNkZWZpbmUgRW5UWEZJRk9VbmRlcnJ1bkVPTUludChCYXNlQWRkcix2YWwpIFdyaXRlUmVnQml0KEJhc2VBZGRyLFRYX0NUXzEsNSx2YWwpCisjZGVmaW5lIEVuVFhGSUZPUmVhZHlJbnQoQmFzZUFkZHIsdmFsKSAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixUWF9DVF8xLDYsdmFsKQkvL2ludCB3aGVuIHJlYWNoIGl0IHRocmVzaG9sZCAoc2V0dGluZyBieSBiaXQgNCkKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKipUWF9DVF8yCisjZGVmaW5lIEZvcmNlVW5kZXJydW4oQmFzZUFkZHIsdmFsKSAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLFRYX0NUXzIsNyx2YWwpCS8vIGZvcmNlIGFuIHVuZGVycnVuIGludAorI2RlZmluZSBFblRYQ1JDKEJhc2VBZGRyLHZhbCkgICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixUWF9DVF8yLDYsdmFsKQkvLzEgZm9yIEZJUixNSVIuLi4wIChub3QgU0lSKQorI2RlZmluZSBGb3JjZUJBRENSQyhCYXNlQWRkcix2YWwpICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixUWF9DVF8yLDUsdmFsKQkvL2ZvcmNlIGFuIGJhZCBDUkMKKyNkZWZpbmUgU2VuZFNJUChCYXNlQWRkcix2YWwpICAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsVFhfQ1RfMiw0LHZhbCkJLy9zZW5kIGluZGljYXRpb24gcHVsc2UgZm9yIHByZXZlbnQgU0lSIGRpc3R1cmIKKyNkZWZpbmUgQ2xlYXJFblRYKEJhc2VBZGRyLHZhbCkgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsVFhfQ1RfMiwzLHZhbCkJLy8gb3Bwb3NpdGUgdG8gRW5UWAorLy8qKioqKioqKioqKioqKioqKlRYX1NUCisjZGVmaW5lIEdldFRYU3RhdHVzKEJhc2VBZGRyKSAJUmVhZFJlZyhCYXNlQWRkcixUWF9TVCkJLy9STworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKlJYX0NUCisjZGVmaW5lIEVuUlhTcGVjSW50KEJhc2VBZGRyLHZhbCkgICAgICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLFJYX0NULDAsdmFsKQorI2RlZmluZSBFblJYRklGT1JlYWR5SW50KEJhc2VBZGRyLHZhbCkgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixSWF9DVCwxLHZhbCkJLy9lbmFibGUgaW50IHdoZW4gcmVhY2ggaXQgdGhyZXNob2xkIChzZXR0aW5nIGJ5IGJpdCA3KQorI2RlZmluZSBFblJYRklGT0hhbGZMZXZlbEludChCYXNlQWRkcix2YWwpICBXcml0ZVJlZ0JpdChCYXNlQWRkcixSWF9DVCw3LHZhbCkJLy9lbmFibGUgaW50IHdoZW4gKDEpIGhhbGYgZnVsbC4uLm9yICgwKSBqdXN0IG5vdCBmdWxsCisvLyoqKioqKioqKioqKioqKioqUlhfU1QKKyNkZWZpbmUgR2V0UlhTdGF0dXMoQmFzZUFkZHIpIAlSZWFkUmVnKEJhc2VBZGRyLFJYX1NUKQkvL1JPCisvLyoqKioqKioqKioqKioqKioqKioqKioqUF9BRERSCisjZGVmaW5lIFNldFBhY2tldEFkZHIoQmFzZUFkZHIsYWRkcikgICAgICAgIFdyaXRlUmVnKEJhc2VBZGRyLFBfQUREUixhZGRyKQorLy8qKioqKioqKioqKioqKioqKioqKioqKklfQ0ZfNAorI2RlZmluZSBFbkdQSU90b1JYMihCYXNlQWRkcix2YWwpCVdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfNCw3LHZhbCkKKyNkZWZpbmUgRW5UaW1lckludChCYXNlQWRkcix2YWwpCQlXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGXzQsMSx2YWwpCisjZGVmaW5lIENsZWFyVGltZXJJbnQoQmFzZUFkZHIsdmFsKQlXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGXzQsMCx2YWwpCisvLyoqKioqKioqKioqKioqKioqKioqKioqSV9UX0NfTAorI2RlZmluZSBXcml0ZUdJTyhCYXNlQWRkcix2YWwpCSAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX1RfQ19MLDcsdmFsKQorI2RlZmluZSBSZWFkR0lPKEJhc2VBZGRyKQkJICAgIENoZWNrUmVnQml0KEJhc2VBZGRyLElfVF9DX0wsNykKKyNkZWZpbmUgUmVhZFJYKEJhc2VBZGRyKQkJICAgIENoZWNrUmVnQml0KEJhc2VBZGRyLElfVF9DX0wsMykJLy9STworI2RlZmluZSBXcml0ZVRYKEJhc2VBZGRyLHZhbCkJCVdyaXRlUmVnQml0KEJhc2VBZGRyLElfVF9DX0wsMCx2YWwpCisvLyoqKioqKioqKioqKioqKioqKioqKioqSV9UX0NfSAorI2RlZmluZSBFblJYMihCYXNlQWRkcix2YWwpCQkgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9UX0NfSCw3LHZhbCkKKyNkZWZpbmUgUmVhZFJYMihCYXNlQWRkcikgICAgICAgICAgIENoZWNrUmVnQml0KEJhc2VBZGRyLElfVF9DX0gsNykKKy8vKioqKioqKioqKioqKioqKioqKioqKlZlcnNpb24KKyNkZWZpbmUgR2V0RklSVmVyc2lvbihCYXNlQWRkcikJCVJlYWRSZWcoQmFzZUFkZHIsVkVSU0lPTikKKworCitzdGF0aWMgdm9pZCBTZXRUaW1lcihfX3UxNiBpb2Jhc2UsIF9fdTggY291bnQpCit7CisJRW5UaW1lckludChpb2Jhc2UsIE9GRik7CisJV3JpdGVSZWcoaW9iYXNlLCBUSU1FUiwgY291bnQpOworCUVuVGltZXJJbnQoaW9iYXNlLCBPTik7Cit9CisKKworc3RhdGljIHZvaWQgU2V0U2VuZEJ5dGUoX191MTYgaW9iYXNlLCBfX3UzMiBjb3VudCkKK3sKKwlfX3UzMiBsb3csIGhpZ2g7CisKKwlpZiAoKGNvdW50ICYgMHhmMDAwKSA9PSAwKSB7CisJCWxvdyA9IGNvdW50ICYgMHgwMGZmOworCQloaWdoID0gKGNvdW50ICYgMHgwZjAwKSA+PiA4OworCQlXcml0ZVJlZyhpb2Jhc2UsIFRYX0NfTCwgbG93KTsKKwkJV3JpdGVSZWcoaW9iYXNlLCBUWF9DX0gsIGhpZ2gpOworCX0KK30KKworc3RhdGljIHZvaWQgUmVzZXRDaGlwKF9fdTE2IGlvYmFzZSwgX191OCB0eXBlKQoreworCV9fdTggdmFsdWU7CisKKwl2YWx1ZSA9ICh0eXBlICsgMikgPDwgNDsKKwlXcml0ZVJlZyhpb2Jhc2UsIFJFU0VULCB0eXBlKTsKK30KKworc3RhdGljIGludCBDa1J4UmVjdihfX3UxNiBpb2Jhc2UsIHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZikKK3sKKwlfX3U4IGxvdywgaGlnaDsKKwlfX3UxNiB3VG1wID0gMCwgd1RtcDEgPSAwLCB3VG1wX25ldyA9IDA7CisKKwlsb3cgPSBSZWFkUmVnKGlvYmFzZSwgUlhfQ19MKTsKKwloaWdoID0gUmVhZFJlZyhpb2Jhc2UsIFJYX0NfSCk7CisJd1RtcDEgPSBoaWdoOworCXdUbXAgPSAod1RtcDEgPDwgOCkgfCBsb3c7CisJdWRlbGF5KDEwKTsKKwlsb3cgPSBSZWFkUmVnKGlvYmFzZSwgUlhfQ19MKTsKKwloaWdoID0gUmVhZFJlZyhpb2Jhc2UsIFJYX0NfSCk7CisJd1RtcDEgPSBoaWdoOworCXdUbXBfbmV3ID0gKHdUbXAxIDw8IDgpIHwgbG93OworCWlmICh3VG1wX25ldyAhPSB3VG1wKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworCit9CisKK3N0YXRpYyBfX3UxNiBSeEN1ckNvdW50KF9fdTE2IGlvYmFzZSwgc3RydWN0IHZpYV9pcmNjX2NiICogc2VsZikKK3sKKwlfX3U4IGxvdywgaGlnaDsKKwlfX3UxNiB3VG1wID0gMCwgd1RtcDEgPSAwOworCisJbG93ID0gUmVhZFJlZyhpb2Jhc2UsIFJYX1BfTCk7CisJaGlnaCA9IFJlYWRSZWcoaW9iYXNlLCBSWF9QX0gpOworCXdUbXAxID0gaGlnaDsKKwl3VG1wID0gKHdUbXAxIDw8IDgpIHwgbG93OworCXJldHVybiB3VG1wOworfQorCisvKiBUaGlzIFJvdXRpbmUgY2FuIG9ubHkgdXNlIGluIHJlY2V2aWVfY29tcGxldGUKKyAqIGZvciBpdCB3aWxsIHVwZGF0ZSBsYXN0IGNvdW50LgorICovCisKK3N0YXRpYyBfX3UxNiBHZXRSZWN2Qnl0ZShfX3UxNiBpb2Jhc2UsIHN0cnVjdCB2aWFfaXJjY19jYiAqIHNlbGYpCit7CisJX191OCBsb3csIGhpZ2g7CisJX191MTYgd1RtcCwgd1RtcDEsIHJldDsKKworCWxvdyA9IFJlYWRSZWcoaW9iYXNlLCBSWF9QX0wpOworCWhpZ2ggPSBSZWFkUmVnKGlvYmFzZSwgUlhfUF9IKTsKKwl3VG1wMSA9IGhpZ2g7CisJd1RtcCA9ICh3VG1wMSA8PCA4KSB8IGxvdzsKKworCisJaWYgKHdUbXAgPj0gc2VsZi0+UnhMYXN0Q291bnQpCisJCXJldCA9IHdUbXAgLSBzZWxmLT5SeExhc3RDb3VudDsKKwllbHNlCisJCXJldCA9ICgweDgwMDAgLSBzZWxmLT5SeExhc3RDb3VudCkgKyB3VG1wOworCXNlbGYtPlJ4TGFzdENvdW50ID0gd1RtcDsKKworLyogUlhfUCBpcyBtb3JlIGFjdHVhbGx5IHRoZSBSWF9DCisgbG93PVJlYWRSZWcoaW9iYXNlLFJYX0NfTCk7CisgaGlnaD1SZWFkUmVnKGlvYmFzZSxSWF9DX0gpOworCisgaWYoIShoaWdoJjB4ZTAwMCkpIHsKKwkgdGVtcD0oaGlnaDw8OCkrbG93OworCSByZXR1cm4gdGVtcDsKKyB9CisgZWxzZSByZXR1cm4gMDsKKyovCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgU2RlbGF5KF9fdTE2IHNjYWxlKQoreworCV9fdTggYlRtcDsKKwlpbnQgaSwgajsKKworCWZvciAoaiA9IDA7IGogPCBzY2FsZTsgaisrKSB7CisJCWZvciAoaSA9IDA7IGkgPCAweDIwOyBpKyspIHsKKwkJCWJUbXAgPSBpbmIoMHhlYik7CisJCQlvdXRiKGJUbXAsIDB4ZWIpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBUZGVsYXkoX191MTYgc2NhbGUpCit7CisJX191OCBiVG1wOworCWludCBpLCBqOworCisJZm9yIChqID0gMDsgaiA8IHNjYWxlOyBqKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IDB4NTA7IGkrKykgeworCQkJYlRtcCA9IGluYigweGViKTsKKwkJCW91dGIoYlRtcCwgMHhlYik7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQgQWN0Q2xrKF9fdTE2IGlvYmFzZSwgX191OCB2YWx1ZSkKK3sKKwlfX3U4IGJUbXA7CisJYlRtcCA9IFJlYWRSZWcoaW9iYXNlLCAweDM0KTsKKwlpZiAodmFsdWUpCisJCVdyaXRlUmVnKGlvYmFzZSwgMHgzNCwgYlRtcCB8IENsa19iaXQpOworCWVsc2UKKwkJV3JpdGVSZWcoaW9iYXNlLCAweDM0LCBiVG1wICYgfkNsa19iaXQpOworfQorCitzdGF0aWMgdm9pZCBDbGtUeChfX3UxNiBpb2Jhc2UsIF9fdTggQ2xrLCBfX3U4IFR4KQoreworCV9fdTggYlRtcDsKKworCWJUbXAgPSBSZWFkUmVnKGlvYmFzZSwgMHgzNCk7CisJaWYgKENsayA9PSAwKQorCQliVG1wICY9IH5DbGtfYml0OworCWVsc2UgeworCQlpZiAoQ2xrID09IDEpCisJCQliVG1wIHw9IENsa19iaXQ7CisJfQorCVdyaXRlUmVnKGlvYmFzZSwgMHgzNCwgYlRtcCk7CisJU2RlbGF5KDEpOworCWlmIChUeCA9PSAwKQorCQliVG1wICY9IH5UeF9iaXQ7CisJZWxzZSB7CisJCWlmIChUeCA9PSAxKQorCQkJYlRtcCB8PSBUeF9iaXQ7CisJfQorCVdyaXRlUmVnKGlvYmFzZSwgMHgzNCwgYlRtcCk7Cit9CisKK3N0YXRpYyB2b2lkIFdyX0J5dGUoX191MTYgaW9iYXNlLCBfX3U4IGRhdGEpCit7CisJX191OCBiRGF0YSA9IGRhdGE7CisvLyAgICAgIF9fdTggYnRtcDsKKwlpbnQgaTsKKworCUNsa1R4KGlvYmFzZSwgMCwgMSk7CisKKwlUZGVsYXkoMik7CisJQWN0Q2xrKGlvYmFzZSwgMSk7CisJVGRlbGF5KDEpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewkvL0xETgorCisJCWlmICgoYkRhdGEgPj4gaSkgJiAweDAxKSB7CisJCQlDbGtUeChpb2Jhc2UsIDAsIDEpOwkvL2JpdCBkYXRhID0gMTsKKwkJfSBlbHNlIHsKKwkJCUNsa1R4KGlvYmFzZSwgMCwgMCk7CS8vYml0IGRhdGEgPSAxOworCQl9CisJCVRkZWxheSgyKTsKKwkJU2RlbGF5KDEpOworCQlBY3RDbGsoaW9iYXNlLCAxKTsJLy9jbGsgaGkKKwkJVGRlbGF5KDEpOworCX0KK30KKworc3RhdGljIF9fdTggUmRfSW5keChfX3UxNiBpb2Jhc2UsIF9fdTggYWRkciwgX191OCBpbmRleCkKK3sKKwlfX3U4IGRhdGEgPSAwLCBiVG1wLCBkYXRhX2JpdDsKKwlpbnQgaTsKKworCWJUbXAgPSBhZGRyIHwgKGluZGV4IDw8IDEpIHwgMDsKKwlDbGtUeChpb2Jhc2UsIDAsIDApOworCVRkZWxheSgyKTsKKwlBY3RDbGsoaW9iYXNlLCAxKTsKKwl1ZGVsYXkoMSk7CisJV3JfQnl0ZShpb2Jhc2UsIGJUbXApOworCVNkZWxheSgxKTsKKwlDbGtUeChpb2Jhc2UsIDAsIDApOworCVRkZWxheSgyKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlBY3RDbGsoaW9iYXNlLCAxKTsKKwkJVGRlbGF5KDEpOworCQlBY3RDbGsoaW9iYXNlLCAwKTsKKwkJVGRlbGF5KDEpOworCQlDbGtUeChpb2Jhc2UsIDAsIDEpOworCQlUZGVsYXkoMSk7CisJCWJUbXAgPSBSZWFkUmVnKGlvYmFzZSwgMHgzNCk7CisJCWlmICghKGJUbXAgJiBSZF9WYWxpZCkpCisJCQlicmVhazsKKwl9CisJaWYgKCEoYlRtcCAmIFJkX1ZhbGlkKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlBY3RDbGsoaW9iYXNlLCAxKTsKKwkJCVRkZWxheSgxKTsKKwkJCUFjdENsayhpb2Jhc2UsIDApOworCQkJYlRtcCA9IFJlYWRSZWcoaW9iYXNlLCAweDM0KTsKKwkJCWRhdGFfYml0ID0gMSA8PCBpOworCQkJaWYgKGJUbXAgJiBSeEJpdCkKKwkJCQlkYXRhIHw9IGRhdGFfYml0OworCQkJZWxzZQorCQkJCWRhdGEgJj0gfmRhdGFfYml0OworCQkJVGRlbGF5KDIpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJQWN0Q2xrKGlvYmFzZSwgMSk7CisJCQlUZGVsYXkoMSk7CisJCQlBY3RDbGsoaW9iYXNlLCAwKTsKKwkJCVRkZWxheSgyKTsKKwkJfQorCQliVG1wID0gUmVhZFJlZyhpb2Jhc2UsIDB4MzQpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMTsgaSsrKSB7CisJCUFjdENsayhpb2Jhc2UsIDEpOworCQlUZGVsYXkoMSk7CisJCUFjdENsayhpb2Jhc2UsIDApOworCQlUZGVsYXkoMik7CisJfQorCUNsa1R4KGlvYmFzZSwgMCwgMCk7CisJVGRlbGF5KDEpOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJQWN0Q2xrKGlvYmFzZSwgMSk7CisJCVRkZWxheSgxKTsKKwkJQWN0Q2xrKGlvYmFzZSwgMCk7CisJCVRkZWxheSgyKTsKKwl9CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIFdyX0luZHgoX191MTYgaW9iYXNlLCBfX3U4IGFkZHIsIF9fdTggaW5kZXgsIF9fdTggZGF0YSkKK3sKKwlpbnQgaTsKKwlfX3U4IGJUbXA7CisKKwlDbGtUeChpb2Jhc2UsIDAsIDApOworCXVkZWxheSgyKTsKKwlBY3RDbGsoaW9iYXNlLCAxKTsKKwl1ZGVsYXkoMSk7CisJYlRtcCA9IGFkZHIgfCAoaW5kZXggPDwgMSkgfCAxOworCVdyX0J5dGUoaW9iYXNlLCBiVG1wKTsKKwlXcl9CeXRlKGlvYmFzZSwgZGF0YSk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlDbGtUeChpb2Jhc2UsIDAsIDApOworCQlUZGVsYXkoMik7CisJCUFjdENsayhpb2Jhc2UsIDEpOworCQlUZGVsYXkoMSk7CisJfQorCUFjdENsayhpb2Jhc2UsIDApOworfQorCitzdGF0aWMgdm9pZCBSZXNldERvbmdsZShfX3UxNiBpb2Jhc2UpCit7CisJaW50IGk7CisJQ2xrVHgoaW9iYXNlLCAwLCAwKTsKKwlUZGVsYXkoMSk7CisJZm9yIChpID0gMDsgaSA8IDMwOyBpKyspIHsKKwkJQWN0Q2xrKGlvYmFzZSwgMSk7CisJCVRkZWxheSgxKTsKKwkJQWN0Q2xrKGlvYmFzZSwgMCk7CisJCVRkZWxheSgxKTsKKwl9CisJQWN0Q2xrKGlvYmFzZSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIFNldFNJVG1vZGUoX191MTYgaW9iYXNlKQoreworCisJX191OCBiVG1wOworCisJYlRtcCA9IFJlYWRMUENSZWcoMHgyOCk7CisJV3JpdGVMUENSZWcoMHgyOCwgYlRtcCB8IDB4MTApOwkvL3NlbGVjdCBJVE1PRkYKKwliVG1wID0gUmVhZFJlZyhpb2Jhc2UsIDB4MzUpOworCVdyaXRlUmVnKGlvYmFzZSwgMHgzNSwgYlRtcCB8IDB4NDApOwkvLyBEcml2ZXIgSVRNT0ZGCisJV3JpdGVSZWcoaW9iYXNlLCAweDI4LCBiVG1wIHwgMHg4MCk7CS8vIGVuYWJsZSBBbGwgaW50ZXJydXB0Cit9CisKK3N0YXRpYyB2b2lkIFNJX1NldE1vZGUoX191MTYgaW9iYXNlLCBpbnQgbW9kZSkKK3sKKwkvL19fdTMyIGRUbXA7CisJX191OCBiVG1wOworCisJV3JpdGVMUENSZWcoMHgyOCwgMHg3MCk7CS8vIFMvVyBSZXNldAorCVNldFNJVG1vZGUoaW9iYXNlKTsKKwlSZXNldERvbmdsZShpb2Jhc2UpOworCXVkZWxheSgxMCk7CisJV3JfSW5keChpb2Jhc2UsIDB4NDAsIDB4MCwgMHgxNyk7CS8vUlggLEFQRU4gZW5hYmxlLE5vcm1hbCBwb3dlcgorCVdyX0luZHgoaW9iYXNlLCAweDQwLCAweDEsIG1vZGUpOwkvL1NldCBNb2RlCisJV3JfSW5keChpb2Jhc2UsIDB4NDAsIDB4MiwgMHhmZik7CS8vU2V0IHBvd2VyIHRvIEZJUiBWRklSID4gMW0KKwliVG1wID0gUmRfSW5keChpb2Jhc2UsIDB4NDAsIDEpOworfQorCitzdGF0aWMgdm9pZCBJbml0Q2FyZChfX3UxNiBpb2Jhc2UpCit7CisJUmVzZXRDaGlwKGlvYmFzZSwgNSk7CisJV3JpdGVSZWcoaW9iYXNlLCBJX1NUX0NUXzAsIDB4MDApOwkvLyBvcGVuIENISVAgb24KKwlTZXRTSVJCT0YoaW9iYXNlLCAweGMwKTsJLy8gaGFyZHdhcmUgZGVmYXVsdCB2YWx1ZQorCVNldFNJUkVPRihpb2Jhc2UsIDB4YzEpOworfQorCitzdGF0aWMgdm9pZCBDb21tb25Jbml0KF9fdTE2IGlvYmFzZSkKK3sKKy8vICBFblRYQ1JDKGlvYmFzZSwwKTsKKwlTd2FwRE1BKGlvYmFzZSwgT0ZGKTsKKwlTZXRNYXhSeFBhY2tldFNpemUoaW9iYXNlLCAweDBmZmYpOwkvL3NldCB0byBtYXg6NDA5NQorCUVuUlhGSUZPUmVhZHlJbnQoaW9iYXNlLCBPRkYpOworCUVuUlhGSUZPSGFsZkxldmVsSW50KGlvYmFzZSwgT0ZGKTsKKwlFblRYRklGT0hhbGZMZXZlbEludChpb2Jhc2UsIE9GRik7CisJRW5UWEZJRk9VbmRlcnJ1bkVPTUludChpb2Jhc2UsIE9OKTsKKy8vICBFblRYRklGT1JlYWR5SW50KGlvYmFzZSxPTik7CisJSW52ZXJ0VFgoaW9iYXNlLCBPRkYpOworCUludmVydFJYKGlvYmFzZSwgT0ZGKTsKKy8vICBXcml0ZUxQQ1JlZygweEYwLDApOyAvLyhpZiBWVDEyMTEgdGhlbiBkbyB0aGlzKQorCWlmIChJc1NJUk9uKGlvYmFzZSkpIHsKKwkJU0lSRmlsdGVyKGlvYmFzZSwgT04pOworCQlTSVJSZWN2QW55KGlvYmFzZSwgT04pOworCX0gZWxzZSB7CisJCVNJUkZpbHRlcihpb2Jhc2UsIE9GRik7CisJCVNJUlJlY3ZBbnkoaW9iYXNlLCBPRkYpOworCX0KKwlFblJYU3BlY0ludChpb2Jhc2UsIE9OKTsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfU1RfQ1RfMCwgMHg4MCk7CisJRW5hYmxlRE1BKGlvYmFzZSwgT04pOworfQorCitzdGF0aWMgdm9pZCBTZXRCYXVkUmF0ZShfX3UxNiBpb2Jhc2UsIF9fdTMyIHJhdGUpCit7CisJX191OCB2YWx1ZSA9IDExLCB0ZW1wOworCisJaWYgKElzU0lST24oaW9iYXNlKSkgeworCQlzd2l0Y2ggKHJhdGUpIHsKKwkJY2FzZSAoX191MzIpICgyNDAwTCk6CisJCQl2YWx1ZSA9IDQ3OworCQkJYnJlYWs7CisJCWNhc2UgKF9fdTMyKSAoOTYwMEwpOgorCQkJdmFsdWUgPSAxMTsKKwkJCWJyZWFrOworCQljYXNlIChfX3UzMikgKDE5MjAwTCk6CisJCQl2YWx1ZSA9IDU7CisJCQlicmVhazsKKwkJY2FzZSAoX191MzIpICgzODQwMEwpOgorCQkJdmFsdWUgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgKF9fdTMyKSAoNTc2MDBMKToKKwkJCXZhbHVlID0gMTsKKwkJCWJyZWFrOworCQljYXNlIChfX3UzMikgKDExNTIwMEwpOgorCQkJdmFsdWUgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfTsKKwl9IGVsc2UgaWYgKElzTUlST24oaW9iYXNlKSkgeworCQl2YWx1ZSA9IDA7CS8vIHdpbGwgYXV0b21hdGljYWxseSBiZSBmaXhlZCBpbiAxLjE1Mk0KKwl9IGVsc2UgaWYgKElzRklST24oaW9iYXNlKSkgeworCQl2YWx1ZSA9IDA7CS8vIHdpbGwgYXV0b21hdGljYWxseSBiZSBmaXhlZCBpbiA0TQorCX0KKwl0ZW1wID0gKFJlYWRSZWcoaW9iYXNlLCBJX0NGX0hfMSkgJiAweDAzKTsKKwl0ZW1wIHw9IHZhbHVlIDw8IDI7CisJV3JpdGVSZWcoaW9iYXNlLCBJX0NGX0hfMSwgdGVtcCk7Cit9CisKK3N0YXRpYyB2b2lkIFNldFB1bHNlV2lkdGgoX191MTYgaW9iYXNlLCBfX3U4IHdpZHRoKQoreworCV9fdTggdGVtcCwgdGVtcDEsIHRlbXAyOworCisJdGVtcCA9IChSZWFkUmVnKGlvYmFzZSwgSV9DRl9MXzEpICYgMHgxZik7CisJdGVtcDEgPSAoUmVhZFJlZyhpb2Jhc2UsIElfQ0ZfSF8xKSAmIDB4ZmMpOworCXRlbXAyID0gKHdpZHRoICYgMHgwNykgPDwgNTsKKwl0ZW1wIHw9IHRlbXAyOworCXRlbXAyID0gKHdpZHRoICYgMHgxOCkgPj4gMzsKKwl0ZW1wMSB8PSB0ZW1wMjsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfQ0ZfTF8xLCB0ZW1wKTsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfQ0ZfSF8xLCB0ZW1wMSk7Cit9CisKK3N0YXRpYyB2b2lkIFNldFNlbmRQcmVhbWJsZUNvdW50KF9fdTE2IGlvYmFzZSwgX191OCBjb3VudCkKK3sKKwlfX3U4IHRlbXA7CisKKwl0ZW1wID0gUmVhZFJlZyhpb2Jhc2UsIElfQ0ZfTF8xKSAmIDB4ZTA7CisJdGVtcCB8PSBjb3VudDsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfQ0ZfTF8xLCB0ZW1wKTsKKworfQorCitzdGF0aWMgdm9pZCBTZXRWRklSKF9fdTE2IEJhc2VBZGRyLCBfX3U4IHZhbCkKK3sKKwlfX3U4IHRtcDsKKworCXRtcCA9IFJlYWRSZWcoQmFzZUFkZHIsIElfQ0ZfTF8wKTsKKwlXcml0ZVJlZyhCYXNlQWRkciwgSV9DRl9MXzAsIHRtcCAmIDB4OGYpOworCVdyaXRlUmVnQml0KEJhc2VBZGRyLCBJX0NGX0hfMCwgNSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgU2V0RklSKF9fdTE2IEJhc2VBZGRyLCBfX3U4IHZhbCkKK3sKKwlfX3U4IHRtcDsKKworCVdyaXRlUmVnQml0KEJhc2VBZGRyLCBJX0NGX0hfMCwgNSwgMCk7CisJdG1wID0gUmVhZFJlZyhCYXNlQWRkciwgSV9DRl9MXzApOworCVdyaXRlUmVnKEJhc2VBZGRyLCBJX0NGX0xfMCwgdG1wICYgMHg4Zik7CisJV3JpdGVSZWdCaXQoQmFzZUFkZHIsIElfQ0ZfTF8wLCA2LCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBTZXRNSVIoX191MTYgQmFzZUFkZHIsIF9fdTggdmFsKQoreworCV9fdTggdG1wOworCisJV3JpdGVSZWdCaXQoQmFzZUFkZHIsIElfQ0ZfSF8wLCA1LCAwKTsKKwl0bXAgPSBSZWFkUmVnKEJhc2VBZGRyLCBJX0NGX0xfMCk7CisJV3JpdGVSZWcoQmFzZUFkZHIsIElfQ0ZfTF8wLCB0bXAgJiAweDhmKTsKKwlXcml0ZVJlZ0JpdChCYXNlQWRkciwgSV9DRl9MXzAsIDUsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIFNldFNJUihfX3UxNiBCYXNlQWRkciwgX191OCB2YWwpCit7CisJX191OCB0bXA7CisKKwlXcml0ZVJlZ0JpdChCYXNlQWRkciwgSV9DRl9IXzAsIDUsIDApOworCXRtcCA9IFJlYWRSZWcoQmFzZUFkZHIsIElfQ0ZfTF8wKTsKKwlXcml0ZVJlZyhCYXNlQWRkciwgSV9DRl9MXzAsIHRtcCAmIDB4OGYpOworCVdyaXRlUmVnQml0KEJhc2VBZGRyLCBJX0NGX0xfMCwgNCwgdmFsKTsKK30KKworI2VuZGlmCQkJCS8qIHZpYV9JUkNDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmYWQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCkBAIC0wLDAgKzEsMTkxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCXZsc2lfaXIuYzoJVkxTSTgyQzE0NyBQQ0kgSXJEQSBjb250cm9sbGVyIGRyaXZlciBmb3IgTGludXgKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBNYXJ0aW4gRGllaGwKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqCXRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKglNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorIAorI2RlZmluZSBEUklWRVJfTkFNRSAJCSJ2bHNpX2lyIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJInYwLjUiCisjZGVmaW5lIERSSVZFUl9ERVNDUklQVElPTgkiSXJEQSBTSVIvTUlSL0ZJUiBkcml2ZXIgZm9yIFZMU0kgODJDMTQ3IgorI2RlZmluZSBEUklWRVJfQVVUSE9SCQkiTWFydGluIERpZWhsIDxpbmZvQG1kaWVobC5kZT4iCisKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQ1JJUFRJT04pOworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2NyYy5oPgorCisjaW5jbHVkZSAidmxzaV9pci5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyAvKiBjb25zdCAqLyBjaGFyIGRyaXZlcm5hbWVbXSA9IERSSVZFUl9OQU1FOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdmxzaV9pcmRhX3RhYmxlIFtdID0geworCXsKKwkJLmNsYXNzID0gICAgICAgIFBDSV9DTEFTU19XSVJFTEVTU19JUkRBIDw8IDgsCisJCS5jbGFzc19tYXNrID0JUENJX0NMQVNTX1NVQkNMQVNTX01BU0sgPDwgOCwgCisJCS52ZW5kb3IgPSAgICAgICBQQ0lfVkVORE9SX0lEX1ZMU0ksCisJCS5kZXZpY2UgPSAgICAgICBQQ0lfREVWSUNFX0lEX1ZMU0lfODJDMTQ3LAorCQkuc3VidmVuZG9yID0gCVBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPQlQQ0lfQU5ZX0lELAorCX0sCisJeyAvKiBhbGwgemVyb2VzICovIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB2bHNpX2lyZGFfdGFibGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCWNsa3NyYzogd2hpY2ggY2xvY2sgc291cmNlIHRvIGJlIHVzZWQKKyAqCQkwOiBhdXRvIC0gdHJ5IFBMTCwgZmFsbGJhY2sgdG8gNDBNSHogWENMSworICoJCTE6IG9uLWNoaXAgNDhNSHogUExMCisgKgkJMjogZXh0ZXJuYWwgNDhNSHogWENMSworICoJCTM6IGV4dGVybmFsIDQwTUh6IFhDTEsgKEhQIE9CLTgwMCkKKyAqLworCitzdGF0aWMgaW50IGNsa3NyYyA9IDA7CQkJLyogZGVmYXVsdCBpcyAwKGF1dG8pICovCittb2R1bGVfcGFyYW0oY2xrc3JjLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhjbGtzcmMsICJjbG9jayBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uIik7CisKKy8qCXJpbmdzaXplOiBzaXplIG9mIHRoZSB0eCBhbmQgcnggZGVzY3JpcHRvciByaW5ncworICoJCWluZGVwZW5kZW50IGZvciB0eCBhbmQgcngKKyAqCQlzcGVjaWZ5IGFzIHJpbmdzaXplPXR4WyxyeF0KKyAqCQlhbGxvd2VkIHZhbHVlczogNCwgOCwgMTYsIDMyLCA2NAorICoJCUR1ZSB0byB0aGUgSXJEQSAxLnggbWF4LiBhbGxvd2VkIHdpbmRvdyBzaXplPTcsCisgKgkJdGhlcmUgc2hvdWxkIGJlIG5vIGdhaW4gd2hlbiB1c2luZyByaW5ncyBsYXJnZXIgdGhhbiA4CisgKi8KKworc3RhdGljIGludCByaW5nc2l6ZVtdID0gezgsOH07CQkvKiBkZWZhdWx0IGlzIHR4PTggLyByeD04ICovCittb2R1bGVfcGFyYW1fYXJyYXkocmluZ3NpemUsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJpbmdzaXplLCAiVFgsIFJYIHJpbmcgZGVzY3JpcHRvciBzaXplIik7CisKKy8qCXNpcnB1bHNlOiB0dW5pbmcgb2YgdGhlIFNJUiBwdWxzZSB3aWR0aCB3aXRoaW4gSXJQSFkgMS4zIGxpbWl0cworICoJCTA6IHZlcnkgc2hvcnQsIDEuNXVzIChleGNlcHRpb246IDZ1cyBhdCAyLjQga2JhdWQpCisgKgkJMTogbm9taW5hbCAzLzE2IGJpdHRpbWUgd2lkdGgKKyAqCW5vdGU6IElyREEgY29tcGxpYW50IHBlZXIgZGV2aWNlcyBzaG91bGQgYmUgaGFwcHkgcmVnYXJkbGVzcworICoJCXdoaWNoIG9uZSBpcyB1c2VkLiBQcmltYXJ5IGdvYWwgaXMgdG8gc2F2ZSBzb21lIHBvd2VyCisgKgkJb24gdGhlIHNlbmRlcidzIHNpZGUgLSBhdCA5LjZrYmF1ZCBmb3IgZXhhbXBsZSB0aGUgc2hvcnQKKyAqCQlwdWxzZSB3aWR0aCBzYXZlcyBtb3JlIHRoYW4gOTAlIG9mIHRoZSB0cmFuc21pdHRlZCBJUiBwb3dlci4KKyAqLworCitzdGF0aWMgaW50IHNpcnB1bHNlID0gMTsJCS8qIGRlZmF1bHQgaXMgMy8xNiBiaXR0aW1lICovCittb2R1bGVfcGFyYW0oc2lycHVsc2UsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNpcnB1bHNlLCAiU0lSIHB1bHNlIHdpZHRoIHR1bmluZyIpOworCisvKglxb3NfbXR0X2JpdHM6IGVuY29kZWQgbWluLXR1cm4tdGltZSB2YWx1ZSB3ZSByZXF1aXJlIHRoZSBwZWVyIGRldmljZQorICoJCSB0byB1c2UgYmVmb3JlIHRyYW5zbWl0dGluZyB0byB1cy4gIlR5cGUgMSIgKHBlci1zdGF0aW9uKQorICoJCSBiaXRmaWVsZCBhY2NvcmRpbmcgdG8gSXJMQVAgZGVmaW5pdGlvbiAoc2VjdGlvbiA2LjYuOCkKKyAqCQkgRG9uJ3Qga25vdyB3aGljaCB0cmFuc2NlaXZlciBpcyB1c2VkIGJ5IG15IE9CODAwIC0gdGhlCisgKgkJIHByZXR0eSBjb21tb24gSFAgSERMUy0xMTAwIHJlcXVpcmVzIDEgbXNlYyAtIHNvIGxldHMgdXNlIHRoaXMuCisgKi8KKworc3RhdGljIGludCBxb3NfbXR0X2JpdHMgPSAweDA3OwkJLyogZGVmYXVsdCBpcyAxIG1zIG9yIG1vcmUgKi8KK21vZHVsZV9wYXJhbShxb3NfbXR0X2JpdHMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHFvc19tdHRfYml0cywgIklyTEFQIGJpdGZpZWxkIHJlcHJlc2VudGluZyBtaW4tdHVybi10aW1lIik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgdmxzaV9yZWdfZGVidWcodW5zaWduZWQgaW9iYXNlLCBjb25zdCBjaGFyICpzKQoreworCWludAlpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiLCBzKTsKKwlmb3IgKGkgPSAwOyBpIDwgMHgyMDsgaSsrKQorCQlwcmludGsoIiUwMngiLCAodW5zaWduZWQpaW5iKChpb2Jhc2UraSkpKTsKKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHZsc2lfcmluZ19kZWJ1ZyhzdHJ1Y3QgdmxzaV9yaW5nICpyKQoreworCXN0cnVjdCByaW5nX2Rlc2NyICpyZDsKKwl1bnNpZ25lZCBpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIC0gcmluZyAlcCAvIHNpemUgJXUgLyBtYXNrIDB4JTA0eCAvIGxlbiAldSAvIGRpciAlZCAvIGh3ICVwXG4iLAorCQlfX0ZVTkNUSU9OX18sIHIsIHItPnNpemUsIHItPm1hc2ssIHItPmxlbiwgci0+ZGlyLCByLT5yZFswXS5odyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIC0gaGVhZCA9ICVkIC8gdGFpbCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCWF0b21pY19yZWFkKCZyLT5oZWFkKSAmIHItPm1hc2ssIGF0b21pY19yZWFkKCZyLT50YWlsKSAmIHItPm1hc2spOworCWZvciAoaSA9IDA7IGkgPCByLT5zaXplOyBpKyspIHsKKwkJcmQgPSAmci0+cmRbaV07CisJCXByaW50ayhLRVJOX0RFQlVHICIlcyAtIHJpbmcgZGVzY3IgJXU6ICIsIF9fRlVOQ1RJT05fXywgaSk7CisJCXByaW50aygic2tiPSVwIGRhdGE9JXAgaHc9JXBcbiIsIHJkLT5za2IsIHJkLT5idWYsIHJkLT5odyk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlcyAtIGh3OiBzdGF0dXM9JTAyeCBjb3VudD0ldSBhZGRyPTB4JTA4eFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgKHVuc2lnbmVkKSByZF9nZXRfc3RhdHVzKHJkKSwKKwkJCSh1bnNpZ25lZCkgcmRfZ2V0X2NvdW50KHJkKSwgKHVuc2lnbmVkKSByZF9nZXRfYWRkcihyZCkpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBuZWVkZWQgcmVnYXJkbGVzcyBvZiBDT05GSUdfUFJPQ19GUyAqLworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdmxzaV9wcm9jX3Jvb3QgPSBOVUxMOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIHZvaWQgdmxzaV9wcm9jX3BkZXYoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXVuc2lnbmVkIGlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwl1bnNpZ25lZCBpOworCisJc2VxX3ByaW50ZihzZXEsICJcbiVzICh2aWQvZGlkOiAlMDR4LyUwNHgpXG4iLAorCQkgICBQQ0lERVZfTkFNRShwZGV2KSwgKGludClwZGV2LT52ZW5kb3IsIChpbnQpcGRldi0+ZGV2aWNlKTsKKwlzZXFfcHJpbnRmKHNlcSwgInBjaS1wb3dlci1zdGF0ZTogJXVcbiIsICh1bnNpZ25lZCkgcGRldi0+Y3VycmVudF9zdGF0ZSk7CisJc2VxX3ByaW50ZihzZXEsICJyZXNvdXJjZXM6IGlycT0ldSAvIGlvPTB4JTA0eCAvIGRtYV9tYXNrPTB4JTAxNkx4XG4iLAorCQkgICBwZGV2LT5pcnEsICh1bnNpZ25lZClwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksICh1bnNpZ25lZCBsb25nIGxvbmcpcGRldi0+ZG1hX21hc2spOworCXNlcV9wcmludGYoc2VxLCAiaHcgcmVnaXN0ZXJzOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgMHgyMDsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiUwMngiLCAodW5zaWduZWQpaW5iKChpb2Jhc2UraSkpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlxuIik7Cit9CisJCQorc3RhdGljIHZvaWQgdmxzaV9wcm9jX25kZXYoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5kZXYtPnByaXY7CisJdTggYnl0ZTsKKwl1MTYgd29yZDsKKwl1bnNpZ25lZCBkZWx0YTEsIGRlbHRhMjsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJdW5zaWduZWQgaW9iYXNlID0gbmRldi0+YmFzZV9hZGRyOworCisJc2VxX3ByaW50ZihzZXEsICJcbiVzIGxpbmsgc3RhdGU6ICVzIC8gJXMgLyAlcyAvICVzXG4iLCBuZGV2LT5uYW1lLAorCQluZXRpZl9kZXZpY2VfcHJlc2VudChuZGV2KSA/ICJhdHRhY2hlZCIgOiAiZGV0YWNoZWQiLCAKKwkJbmV0aWZfcnVubmluZyhuZGV2KSA/ICJydW5uaW5nIiA6ICJub3QgcnVubmluZyIsCisJCW5ldGlmX2NhcnJpZXJfb2sobmRldikgPyAiY2FycmllciBvayIgOiAibm8gY2FycmllciIsCisJCW5ldGlmX3F1ZXVlX3N0b3BwZWQobmRldikgPyAicXVldWUgc3RvcHBlZCIgOiAicXVldWUgcnVubmluZyIpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKG5kZXYpKQorCQlyZXR1cm47CisKKwlzZXFfcHJpbnRmKHNlcSwgIlxuaHctc3RhdGU6XG4iKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShpZGV2LT5wZGV2LCBWTFNJX1BDSV9JUk1JU0MsICZieXRlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIklSTUlTQzolcyVzJXMgdWFydCVzIiwKKwkJKGJ5dGUmSVJNSVNDX0lSUkFJTCkgPyAiIGlycmFpbCIgOiAiIiwKKwkJKGJ5dGUmSVJNSVNDX0lSUEQpID8gIiBpcnBkIiA6ICIiLAorCQkoYnl0ZSZJUk1JU0NfVUFSVFRTVCkgPyAiIHVhcnR0ZXN0IiA6ICIiLAorCQkoYnl0ZSZJUk1JU0NfVUFSVEVOKSA/ICJAIiA6ICIgZGlzYWJsZWRcbiIpOworCWlmIChieXRlJklSTUlTQ19VQVJURU4pIHsKKwkJc2VxX3ByaW50ZihzZXEsICIweCVzXG4iLAorCQkJKGJ5dGUmMikgPyAoKGJ5dGUmMSkgPyAiM2U4IiA6ICIyZTgiKQorCQkJCSA6ICgoYnl0ZSYxKSA/ICIzZjgiIDogIjJmOCIpKTsKKwl9CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoaWRldi0+cGRldiwgVkxTSV9QQ0lfQ0xLQ1RMLCAmYnl0ZSk7CisJc2VxX3ByaW50ZihzZXEsICJDTEtDVEw6IFBMTCAlcyVzJXMgLyBjbG9jayAlcyAvIHdha2V1cCAlc1xuIiwKKwkJKGJ5dGUmQ0xLQ1RMX1BEX0lOVikgPyAicG93ZXJlZCIgOiAiZG93biIsCisJCShieXRlJkNMS0NUTF9MT0NLKSA/ICIgbG9ja2VkIiA6ICIiLAorCQkoYnl0ZSZDTEtDVExfRVhUQ0xLKSA/ICgoYnl0ZSZDTEtDVExfWENLU0VMKT8iIC8gNDAgTUh6IFhDTEsiOiIgLyA0OCBNSHogWENMSyIpIDogIiIsCisJCShieXRlJkNMS0NUTF9DTEtTVFApID8gInN0b3BwZWQiIDogInJ1bm5pbmciLAorCQkoYnl0ZSZDTEtDVExfV0FLRSkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShpZGV2LT5wZGV2LCBWTFNJX1BDSV9NU1RSUEFHRSwgJmJ5dGUpOworCXNlcV9wcmludGYoc2VxLCAiTVNUUlBBR0U6IDB4JTAyeFxuIiwgKHVuc2lnbmVkKWJ5dGUpOworCisJYnl0ZSA9IGluYihpb2Jhc2UrVkxTSV9QSU9fSVJJTlRSKTsKKwlzZXFfcHJpbnRmKHNlcSwgIklSSU5UUjolcyVzJXMlcyVzJXMlcyVzXG4iLAorCQkoYnl0ZSZJUklOVFJfQUNURU4pID8gIiBBQ1RFTiIgOiAiIiwKKwkJKGJ5dGUmSVJJTlRSX1JQS1RFTikgPyAiIFJQS1RFTiIgOiAiIiwKKwkJKGJ5dGUmSVJJTlRSX1RQS1RFTikgPyAiIFRQS1RFTiIgOiAiIiwKKwkJKGJ5dGUmSVJJTlRSX09FX0VOKSA/ICIgT0VfRU4iIDogIiIsCisJCShieXRlJklSSU5UUl9BQ1RJVklUWSkgPyAiIEFDVElWSVRZIiA6ICIiLAorCQkoYnl0ZSZJUklOVFJfUlBLVElOVCkgPyAiIFJQS1RJTlQiIDogIiIsCisJCShieXRlJklSSU5UUl9UUEtUSU5UKSA/ICIgVFBLVElOVCIgOiAiIiwKKwkJKGJ5dGUmSVJJTlRSX09FX0lOVCkgPyAiIE9FX0lOVCIgOiAiIik7CisJd29yZCA9IGludyhpb2Jhc2UrVkxTSV9QSU9fUklOR1BUUik7CisJc2VxX3ByaW50ZihzZXEsICJSSU5HUFRSOiByeD0ldSAvIHR4PSV1XG4iLCBSSU5HUFRSX0dFVF9SWCh3b3JkKSwgUklOR1BUUl9HRVRfVFgod29yZCkpOworCXdvcmQgPSBpbncoaW9iYXNlK1ZMU0lfUElPX1JJTkdCQVNFKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlJJTkdCQVNFOiBidXNtYXA9MHglMDh4XG4iLAorCQkoKHVuc2lnbmVkKXdvcmQgPDwgMTApfChNU1RSUEFHRV9WQUxVRTw8MjQpKTsKKwl3b3JkID0gaW53KGlvYmFzZStWTFNJX1BJT19SSU5HU0laRSk7CisJc2VxX3ByaW50ZihzZXEsICJSSU5HU0laRTogcng9JXUgLyB0eD0ldVxuIiwgUklOR1NJWkVfVE9fUlhTSVpFKHdvcmQpLAorCQlSSU5HU0laRV9UT19UWFNJWkUod29yZCkpOworCisJd29yZCA9IGludyhpb2Jhc2UrVkxTSV9QSU9fSVJDRkcpOworCXNlcV9wcmludGYoc2VxLCAiSVJDRkc6JXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXNcbiIsCisJCSh3b3JkJklSQ0ZHX0xPT1ApID8gIiBMT09QIiA6ICIiLAorCQkod29yZCZJUkNGR19FTlRYKSA/ICIgRU5UWCIgOiAiIiwKKwkJKHdvcmQmSVJDRkdfRU5SWCkgPyAiIEVOUlgiIDogIiIsCisJCSh3b3JkJklSQ0ZHX01TVFIpID8gIiBNU1RSIiA6ICIiLAorCQkod29yZCZJUkNGR19SWEFOWSkgPyAiIFJYQU5ZIiA6ICIiLAorCQkod29yZCZJUkNGR19DUkMxNikgPyAiIENSQzE2IiA6ICIiLAorCQkod29yZCZJUkNGR19GSVIpID8gIiBGSVIiIDogIiIsCisJCSh3b3JkJklSQ0ZHX01JUikgPyAiIE1JUiIgOiAiIiwKKwkJKHdvcmQmSVJDRkdfU0lSKSA/ICIgU0lSIiA6ICIiLAorCQkod29yZCZJUkNGR19TSVJGSUxUKSA/ICIgU0lSRklMVCIgOiAiIiwKKwkJKHdvcmQmSVJDRkdfU0lSVEVTVCkgPyAiIFNJUlRFU1QiIDogIiIsCisJCSh3b3JkJklSQ0ZHX1RYUE9MKSA/ICIgVFhQT0wiIDogIiIsCisJCSh3b3JkJklSQ0ZHX1JYUE9MKSA/ICIgUlhQT0wiIDogIiIpOworCXdvcmQgPSBpbncoaW9iYXNlK1ZMU0lfUElPX0lSRU5BQkxFKTsKKwlzZXFfcHJpbnRmKHNlcSwgIklSRU5BQkxFOiVzJXMlcyVzJXMlcyVzJXNcbiIsCisJCSh3b3JkJklSRU5BQkxFX1BIWUFORENMT0NLKSA/ICIgUEhZQU5EQ0xPQ0siIDogIiIsCisJCSh3b3JkJklSRU5BQkxFX0NGR0VSKSA/ICIgQ0ZHRVJSIiA6ICIiLAorCQkod29yZCZJUkVOQUJMRV9GSVJfT04pID8gIiBGSVJfT04iIDogIiIsCisJCSh3b3JkJklSRU5BQkxFX01JUl9PTikgPyAiIE1JUl9PTiIgOiAiIiwKKwkJKHdvcmQmSVJFTkFCTEVfU0lSX09OKSA/ICIgU0lSX09OIiA6ICIiLAorCQkod29yZCZJUkVOQUJMRV9FTlRYU1QpID8gIiBFTlRYU1QiIDogIiIsCisJCSh3b3JkJklSRU5BQkxFX0VOUlhTVCkgPyAiIEVOUlhTVCIgOiAiIiwKKwkJKHdvcmQmSVJFTkFCTEVfQ1JDMTZfT04pID8gIiBDUkMxNl9PTiIgOiAiIik7CisJd29yZCA9IGludyhpb2Jhc2UrVkxTSV9QSU9fUEhZQ1RMKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlBIWUNUTDogYmF1ZC1kaXZpc29yPSV1IC8gcHVsc2V3aWR0aD0ldSAvIHByZWFtYmxlPSV1XG4iLAorCQkodW5zaWduZWQpUEhZQ1RMX1RPX0JBVUQod29yZCksCisJCSh1bnNpZ25lZClQSFlDVExfVE9fUExTV0lEKHdvcmQpLAorCQkodW5zaWduZWQpUEhZQ1RMX1RPX1BSRUFNQih3b3JkKSk7CisJd29yZCA9IGludyhpb2Jhc2UrVkxTSV9QSU9fTlBIWUNUTCk7CisJc2VxX3ByaW50ZihzZXEsICJOUEhZQ1RMOiBiYXVkLWRpdmlzb3I9JXUgLyBwdWxzZXdpZHRoPSV1IC8gcHJlYW1ibGU9JXVcbiIsCisJCSh1bnNpZ25lZClQSFlDVExfVE9fQkFVRCh3b3JkKSwKKwkJKHVuc2lnbmVkKVBIWUNUTF9UT19QTFNXSUQod29yZCksCisJCSh1bnNpZ25lZClQSFlDVExfVE9fUFJFQU1CKHdvcmQpKTsKKwl3b3JkID0gaW53KGlvYmFzZStWTFNJX1BJT19NQVhQS1QpOworCXNlcV9wcmludGYoc2VxLCAiTUFYUEtUOiBtYXguIHJ4IHBhY2tldCBzaXplID0gJXVcbiIsIHdvcmQpOworCXdvcmQgPSBpbncoaW9iYXNlK1ZMU0lfUElPX1JDVkJDTlQpICYgUkNWQkNOVF9NQVNLOworCXNlcV9wcmludGYoc2VxLCAiUkNWQkNOVDogcngtZmlmbyBmaWxsaW5nIGxldmVsID0gJXVcbiIsIHdvcmQpOworCisJc2VxX3ByaW50ZihzZXEsICJcbnN3LXN0YXRlOlxuIik7CisJc2VxX3ByaW50ZihzZXEsICJJclBIWSBzZXR1cDogJWQgYmF1ZCAtICVzIGVuY29kaW5nXG4iLCBpZGV2LT5iYXVkLCAKKwkJKGlkZXYtPm1vZGU9PUlGRl9TSVIpPyJTSVIiOigoaWRldi0+bW9kZT09SUZGX01JUik/Ik1JUiI6IkZJUiIpKTsKKwlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisJaWYgKG5vdy50dl91c2VjID49IGlkZXYtPmxhc3RfcngudHZfdXNlYykgeworCQlkZWx0YTIgPSBub3cudHZfdXNlYyAtIGlkZXYtPmxhc3RfcngudHZfdXNlYzsKKwkJZGVsdGExID0gMDsKKwl9CisJZWxzZSB7CisJCWRlbHRhMiA9IDEwMDAwMDAgKyBub3cudHZfdXNlYyAtIGlkZXYtPmxhc3RfcngudHZfdXNlYzsKKwkJZGVsdGExID0gMTsKKwl9CisJc2VxX3ByaW50ZihzZXEsICJsYXN0IHJ4OiAlbHUuJTA2dSBzZWNcbiIsCisJCW5vdy50dl9zZWMgLSBpZGV2LT5sYXN0X3J4LnR2X3NlYyAtIGRlbHRhMSwgZGVsdGEyKTsJCisKKwlzZXFfcHJpbnRmKHNlcSwgIlJYOiBwYWNrZXRzPSVsdSAvIGJ5dGVzPSVsdSAvIGVycm9ycz0lbHUgLyBkcm9wcGVkPSVsdSIsCisJCWlkZXYtPnN0YXRzLnJ4X3BhY2tldHMsIGlkZXYtPnN0YXRzLnJ4X2J5dGVzLCBpZGV2LT5zdGF0cy5yeF9lcnJvcnMsCisJCWlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQpOworCXNlcV9wcmludGYoc2VxLCAiIC8gb3ZlcnJ1bj0lbHUgLyBsZW5ndGg9JWx1IC8gZnJhbWU9JWx1IC8gY3JjPSVsdVxuIiwKKwkJaWRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMsIGlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMsCisJCWlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycywgaWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycyk7CisJc2VxX3ByaW50ZihzZXEsICJUWDogcGFja2V0cz0lbHUgLyBieXRlcz0lbHUgLyBlcnJvcnM9JWx1IC8gZHJvcHBlZD0lbHUgLyBmaWZvPSVsdVxuIiwKKwkJaWRldi0+c3RhdHMudHhfcGFja2V0cywgaWRldi0+c3RhdHMudHhfYnl0ZXMsIGlkZXYtPnN0YXRzLnR4X2Vycm9ycywKKwkJaWRldi0+c3RhdHMudHhfZHJvcHBlZCwgaWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMpOworCit9CisJCQorc3RhdGljIHZvaWQgdmxzaV9wcm9jX3Jpbmcoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCB2bHNpX3JpbmcgKnIpCit7CisJc3RydWN0IHJpbmdfZGVzY3IgKnJkOworCXVuc2lnbmVkIGksIGo7CisJaW50IGgsIHQ7CisKKwlzZXFfcHJpbnRmKHNlcSwgInNpemUgJXUgLyBtYXNrIDB4JTA0eCAvIGxlbiAldSAvIGRpciAlZCAvIGh3ICVwXG4iLAorCQlyLT5zaXplLCByLT5tYXNrLCByLT5sZW4sIHItPmRpciwgci0+cmRbMF0uaHcpOworCWggPSBhdG9taWNfcmVhZCgmci0+aGVhZCkgJiByLT5tYXNrOworCXQgPSBhdG9taWNfcmVhZCgmci0+dGFpbCkgJiByLT5tYXNrOworCXNlcV9wcmludGYoc2VxLCAiaGVhZCA9ICVkIC8gdGFpbCA9ICVkICIsIGgsIHQpOworCWlmIChoID09IHQpCisJCXNlcV9wcmludGYoc2VxLCAiKGVtcHR5KVxuIik7CisJZWxzZSB7CisJCWlmICgoKHQrMSkmci0+bWFzaykgPT0gaCkKKwkJCXNlcV9wcmludGYoc2VxLCAiKGZ1bGwpXG4iKTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzZXEsICIobGV2ZWwgPSAlZClcbiIsICgodW5zaWduZWQpKHQtaCkgJiByLT5tYXNrKSk7IAorCQlyZCA9ICZyLT5yZFtoXTsKKwkJaiA9ICh1bnNpZ25lZCkgcmRfZ2V0X2NvdW50KHJkKTsKKwkJc2VxX3ByaW50ZihzZXEsICJjdXJyZW50OiByZCA9ICVkIC8gc3RhdHVzID0gJTAyeCAvIGxlbiA9ICV1XG4iLAorCQkJCWgsICh1bnNpZ25lZClyZF9nZXRfc3RhdHVzKHJkKSwgaik7CisJCWlmIChqID4gMCkgeworCQkJc2VxX3ByaW50ZihzZXEsICIgICBkYXRhOiIpOworCQkJaWYgKGogPiAyMCkKKwkJCQlqID0gMjA7CisJCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKQorCQkJCXNlcV9wcmludGYoc2VxLCAiICUwMngiLCAodW5zaWduZWQpKCh1bnNpZ25lZCBjaGFyICopcmQtPmJ1ZilbaV0pOworCQkJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCByLT5zaXplOyBpKyspIHsKKwkJcmQgPSAmci0+cmRbaV07CisJCXNlcV9wcmludGYoc2VxLCAiPiByaW5nIGRlc2NyICV1OiAiLCBpKTsKKwkJc2VxX3ByaW50ZihzZXEsICJza2I9JXAgZGF0YT0lcCBodz0lcFxuIiwgcmQtPnNrYiwgcmQtPmJ1ZiwgcmQtPmh3KTsKKwkJc2VxX3ByaW50ZihzZXEsICIgIGh3OiBzdGF0dXM9JTAyeCBjb3VudD0ldSBidXNhZGRyPTB4JTA4eFxuIiwKKwkJCSh1bnNpZ25lZCkgcmRfZ2V0X3N0YXR1cyhyZCksCisJCQkodW5zaWduZWQpIHJkX2dldF9jb3VudChyZCksICh1bnNpZ25lZCkgcmRfZ2V0X2FkZHIocmQpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHNlcS0+cHJpdmF0ZTsKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzZXFfcHJpbnRmKHNlcSwgIlxuJXMgJXNcblxuIiwgRFJJVkVSX05BTUUsIERSSVZFUl9WRVJTSU9OKTsKKwlzZXFfcHJpbnRmKHNlcSwgImNsa3NyYzogJXNcbiIsIAorCQkoY2xrc3JjPj0yKSA/ICgoY2xrc3JjPT0zKT8iNDBNSHogWENMSyI6IjQ4TUh6IFhDTEsiKQorCQkJICAgIDogKChjbGtzcmM9PTEpPyI0OE1IeiBQTEwiOiJhdXRvZGV0ZWN0IikpOworCXNlcV9wcmludGYoc2VxLCAicmluZ3NpemU6IHR4PSVkIC8gcng9JWRcbiIsCisJCXJpbmdzaXplWzBdLCByaW5nc2l6ZVsxXSk7CisJc2VxX3ByaW50ZihzZXEsICJzaXJwdWxzZTogJXNcbiIsIChzaXJwdWxzZSk/IjMvMTYgYml0dGltZSI6InNob3J0Iik7CisJc2VxX3ByaW50ZihzZXEsICJxb3NfbXR0X2JpdHM6IDB4JTAyeFxuIiwgKHVuc2lnbmVkKXFvc19tdHRfYml0cyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRldi0+bG9jaywgZmxhZ3MpOworCWlmIChpZGV2LT5wZGV2ICE9IE5VTEwpIHsKKwkJdmxzaV9wcm9jX3BkZXYoc2VxLCBpZGV2LT5wZGV2KTsKKworCQlpZiAoaWRldi0+cGRldi0+Y3VycmVudF9zdGF0ZSA9PSAwKQorCQkJdmxzaV9wcm9jX25kZXYoc2VxLCBuZGV2KTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzZXEsICJcblBDSSBjb250cm9sbGVyIGRvd24gLSByZXN1bWVfb2sgPSAlZFxuIiwKKwkJCQlpZGV2LT5yZXN1bWVfb2spOworCQlpZiAobmV0aWZfcnVubmluZyhuZGV2KSAmJiBpZGV2LT5yeF9yaW5nICYmIGlkZXYtPnR4X3JpbmcpIHsKKwkJCXNlcV9wcmludGYoc2VxLCAiXG4tLS0tLS0tLS0gUlggcmluZyAtLS0tLS0tLS0tLVxuXG4iKTsKKwkJCXZsc2lfcHJvY19yaW5nKHNlcSwgaWRldi0+cnhfcmluZyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlxuLS0tLS0tLS0tIFRYIHJpbmcgLS0tLS0tLS0tLS1cblxuIik7CisJCQl2bHNpX3Byb2NfcmluZyhzZXEsIGlkZXYtPnR4X3JpbmcpOworCQl9CisJfQorCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGV2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bHNpX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCB2bHNpX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmxzaV9wcm9jX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gdmxzaV9zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisjZGVmaW5lIFZMU0lfUFJPQ19GT1BTCQkoJnZsc2lfcHJvY19mb3BzKQorCisjZWxzZQkvKiBDT05GSUdfUFJPQ19GUyAqLworI2RlZmluZSBWTFNJX1BST0NfRk9QUwkJTlVMTAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCB2bHNpX3JpbmcgKnZsc2lfYWxsb2NfcmluZyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHJpbmdfZGVzY3JfaHcgKmh3bWFwLAorCQkJCQkJdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgbGVuLCBpbnQgZGlyKQoreworCXN0cnVjdCB2bHNpX3JpbmcgKnI7CisJc3RydWN0IHJpbmdfZGVzY3IgKnJkOworCXVuc2lnbmVkCWksIGo7CisJZG1hX2FkZHJfdAlidXNhZGRyOworCisJaWYgKCFzaXplICB8fCAgKChzaXplLTEpJnNpemUpIT0wKQkvKiBtdXN0IGJlID4wIGFuZCBwb3dlciBvZiAyICovCisJCXJldHVybiBOVUxMOworCisJciA9IGttYWxsb2Moc2l6ZW9mKCpyKSArIHNpemUgKiBzaXplb2Yoc3RydWN0IHJpbmdfZGVzY3IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXIpCisJCXJldHVybiBOVUxMOworCW1lbXNldChyLCAwLCBzaXplb2YoKnIpKTsKKworCXItPnBkZXYgPSBwZGV2OworCXItPmRpciA9IGRpcjsKKwlyLT5sZW4gPSBsZW47CisJci0+cmQgPSAoc3RydWN0IHJpbmdfZGVzY3IgKikocisxKTsKKwlyLT5tYXNrID0gc2l6ZSAtIDE7CisJci0+c2l6ZSA9IHNpemU7CisJYXRvbWljX3NldCgmci0+aGVhZCwgMCk7CisJYXRvbWljX3NldCgmci0+dGFpbCwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXJkID0gci0+cmQgKyBpOworCQltZW1zZXQocmQsIDAsIHNpemVvZigqcmQpKTsKKwkJcmQtPmh3ID0gaHdtYXAgKyBpOworCQlyZC0+YnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUx8R0ZQX0RNQSk7CisJCWlmIChyZC0+YnVmID09IE5VTEwKKwkJICAgIHx8ICAhKGJ1c2FkZHIgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCByZC0+YnVmLCBsZW4sIGRpcikpKSB7CisJCQlpZiAocmQtPmJ1ZikgeworCQkJCUlSREFfRVJST1IoIiVzOiBmYWlsZWQgdG8gY3JlYXRlIFBDSS1NQVAgZm9yICVwIiwKKwkJCQkJICAgX19GVU5DVElPTl9fLCByZC0+YnVmKTsKKwkJCQlrZnJlZShyZC0+YnVmKTsKKwkJCQlyZC0+YnVmID0gTlVMTDsKKwkJCX0KKwkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCQlyZCA9IHItPnJkICsgajsKKwkJCQlidXNhZGRyID0gcmRfZ2V0X2FkZHIocmQpOworCQkJCXJkX3NldF9hZGRyX3N0YXR1cyhyZCwgMCwgMCk7CisJCQkJaWYgKGJ1c2FkZHIpCisJCQkJCXBjaV91bm1hcF9zaW5nbGUocGRldiwgYnVzYWRkciwgbGVuLCBkaXIpOworCQkJCWtmcmVlKHJkLT5idWYpOworCQkJCXJkLT5idWYgPSBOVUxMOworCQkJfQorCQkJa2ZyZWUocik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlyZF9zZXRfYWRkcl9zdGF0dXMocmQsIGJ1c2FkZHIsIDApOworCQkvKiBpbml0aWFsbHksIHRoZSBkbWEgYnVmZmVyIGlzIG93bmVkIGJ5IHRoZSBDUFUgKi8KKwkJcmQtPnNrYiA9IE5VTEw7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHZsc2lfZnJlZV9yaW5nKHN0cnVjdCB2bHNpX3JpbmcgKnIpCit7CisJc3RydWN0IHJpbmdfZGVzY3IgKnJkOworCXVuc2lnbmVkCWk7CisJZG1hX2FkZHJfdAlidXNhZGRyOworCisJZm9yIChpID0gMDsgaSA8IHItPnNpemU7IGkrKykgeworCQlyZCA9IHItPnJkICsgaTsKKwkJaWYgKHJkLT5za2IpCisJCQlkZXZfa2ZyZWVfc2tiX2FueShyZC0+c2tiKTsKKwkJYnVzYWRkciA9IHJkX2dldF9hZGRyKHJkKTsKKwkJcmRfc2V0X2FkZHJfc3RhdHVzKHJkLCAwLCAwKTsKKwkJaWYgKGJ1c2FkZHIpCisJCQlwY2lfdW5tYXBfc2luZ2xlKHItPnBkZXYsIGJ1c2FkZHIsIHItPmxlbiwgci0+ZGlyKTsKKwkJaWYgKHJkLT5idWYpCisJCQlrZnJlZShyZC0+YnVmKTsKKwl9CisJa2ZyZWUocik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9jcmVhdGVfaHdpZih2bHNpX2lyZGFfZGV2X3QgKmlkZXYpCit7CisJY2hhciAJCQkqcmluZ2FyZWE7CisJc3RydWN0IHJpbmdfZGVzY3JfaHcJKmh3bWFwOworCisJaWRldi0+dmlydGFkZHIgPSBOVUxMOworCWlkZXYtPmJ1c2FkZHIgPSAwOworCisJcmluZ2FyZWEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChpZGV2LT5wZGV2LCBIV19SSU5HX0FSRUFfU0laRSwgJmlkZXYtPmJ1c2FkZHIpOworCWlmICghcmluZ2FyZWEpIHsKKwkJSVJEQV9FUlJPUigiJXM6IGluc3VmZmljaWVudCBtZW1vcnkgZm9yIGRlc2NyaXB0b3IgcmluZ3NcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisJbWVtc2V0KHJpbmdhcmVhLCAwLCBIV19SSU5HX0FSRUFfU0laRSk7CisKKwlod21hcCA9IChzdHJ1Y3QgcmluZ19kZXNjcl9odyAqKXJpbmdhcmVhOworCWlkZXYtPnJ4X3JpbmcgPSB2bHNpX2FsbG9jX3JpbmcoaWRldi0+cGRldiwgaHdtYXAsIHJpbmdzaXplWzFdLAorCQkJCQlYRkVSX0JVRl9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWlmIChpZGV2LT5yeF9yaW5nID09IE5VTEwpCisJCWdvdG8gb3V0X3VubWFwOworCisJaHdtYXAgKz0gTUFYX1JJTkdfREVTQ1I7CisJaWRldi0+dHhfcmluZyA9IHZsc2lfYWxsb2NfcmluZyhpZGV2LT5wZGV2LCBod21hcCwgcmluZ3NpemVbMF0sCisJCQkJCVhGRVJfQlVGX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmIChpZGV2LT50eF9yaW5nID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWVfcng7CisKKwlpZGV2LT52aXJ0YWRkciA9IHJpbmdhcmVhOworCXJldHVybiAwOworCitvdXRfZnJlZV9yeDoKKwl2bHNpX2ZyZWVfcmluZyhpZGV2LT5yeF9yaW5nKTsKK291dF91bm1hcDoKKwlpZGV2LT5yeF9yaW5nID0gaWRldi0+dHhfcmluZyA9IE5VTEw7CisJcGNpX2ZyZWVfY29uc2lzdGVudChpZGV2LT5wZGV2LCBIV19SSU5HX0FSRUFfU0laRSwgcmluZ2FyZWEsIGlkZXYtPmJ1c2FkZHIpOworCWlkZXYtPmJ1c2FkZHIgPSAwOworb3V0OgorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IHZsc2lfZGVzdHJveV9od2lmKHZsc2lfaXJkYV9kZXZfdCAqaWRldikKK3sKKwl2bHNpX2ZyZWVfcmluZyhpZGV2LT5yeF9yaW5nKTsKKwl2bHNpX2ZyZWVfcmluZyhpZGV2LT50eF9yaW5nKTsKKwlpZGV2LT5yeF9yaW5nID0gaWRldi0+dHhfcmluZyA9IE5VTEw7CisKKwlpZiAoaWRldi0+YnVzYWRkcikKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChpZGV2LT5wZGV2LEhXX1JJTkdfQVJFQV9TSVpFLGlkZXYtPnZpcnRhZGRyLGlkZXYtPmJ1c2FkZHIpOworCisJaWRldi0+dmlydGFkZHIgPSBOVUxMOworCWlkZXYtPmJ1c2FkZHIgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCB2bHNpX3Byb2Nlc3Nfcngoc3RydWN0IHZsc2lfcmluZyAqciwgc3RydWN0IHJpbmdfZGVzY3IgKnJkKQoreworCXUxNgkJc3RhdHVzOworCWludAkJY3JjbGVuLCBsZW4gPSAwOworCXN0cnVjdCBza19idWZmCSpza2I7CisJaW50CQlyZXQgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcGNpX2dldF9kcnZkYXRhKHItPnBkZXYpOworCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5kZXYtPnByaXY7CisKKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoci0+cGRldiwgcmRfZ2V0X2FkZHIocmQpLCByLT5sZW4sIHItPmRpcik7CisJLyogZG1hIGJ1ZmZlciBub3cgb3duZWQgYnkgdGhlIENQVSAqLworCXN0YXR1cyA9IHJkX2dldF9zdGF0dXMocmQpOworCWlmIChzdGF0dXMgJiBSRF9SWF9FUlJPUikgeworCQlpZiAoc3RhdHVzICYgUkRfUlhfT1ZFUikgIAorCQkJcmV0IHw9IFZMU0lfUlhfT1ZFUjsKKwkJaWYgKHN0YXR1cyAmIFJEX1JYX0xFTkdUSCkgIAorCQkJcmV0IHw9IFZMU0lfUlhfTEVOR1RIOworCQlpZiAoc3RhdHVzICYgUkRfUlhfUEhZRVJSKSAgCisJCQlyZXQgfD0gVkxTSV9SWF9GUkFNRTsKKwkJaWYgKHN0YXR1cyAmIFJEX1JYX0NSQ0VSUikgIAorCQkJcmV0IHw9IFZMU0lfUlhfQ1JDOworCQlnb3RvIGRvbmU7CisJfQorCisJbGVuID0gcmRfZ2V0X2NvdW50KHJkKTsKKwljcmNsZW4gPSAoaWRldi0+bW9kZT09SUZGX0ZJUikgPyBzaXplb2YodTMyKSA6IHNpemVvZih1MTYpOworCWxlbiAtPSBjcmNsZW47CQkvKiByZW1vdmUgdHJhaWxpbmcgQ1JDICovCisJaWYgKGxlbiA8PSAwKSB7CisJCUlSREFfREVCVUcoMCwgIiVzOiBzdHJhbmdlIGZyYW1lIChsZW49JWQpXG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CisJCXJldCB8PSBWTFNJX1JYX0RST1A7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoaWRldi0+bW9kZSA9PSBJRkZfU0lSKSB7CS8qIGh3IGNoZWNrcyBDUkMgaW4gTUlSLCBGSVIgbW9kZSAqLworCisJCS8qIHJkLT5idWYgaXMgYSBzdHJlYW1pbmcgUENJX0RNQV9GUk9NREVWSUNFIG1hcC4gRG9pbmcgdGhlCisJCSAqIGVuZGlhbi1hZGp1c3RtZW50IHRoZXJlIGp1c3QgaW4gcGxhY2Ugd2lsbCBkaXJ0eSBhIGNhY2hlIGxpbmUKKwkJICogd2hpY2ggYmVsb25ncyB0byB0aGUgbWFwIGFuZCB0aHVzIHdlIG11c3QgYmUgc3VyZSBpdCB3aWxsCisJCSAqIGdldCBmbHVzaGVkIGJlZm9yZSBnaXZpbmcgdGhlIGJ1ZmZlciBiYWNrIHRvIGhhcmR3YXJlLgorCQkgKiB2bHNpX2ZpbGxfcngoKSB3aWxsIGRvIHRoaXMgYW55d2F5IC0gYnV0IGhlcmUgd2UgcmVseSBvbi4KKwkJICovCisJCWxlMTZfdG9fY3B1cyhyZC0+YnVmK2xlbik7CisJCWlmIChpcmRhX2NhbGNfY3JjMTYoSU5JVF9GQ1MscmQtPmJ1ZixsZW4rY3JjbGVuKSAhPSBHT09EX0ZDUykgeworCQkJSVJEQV9ERUJVRygwLCAiJXM6IGNyYyBlcnJvclxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldCB8PSBWTFNJX1JYX0NSQzsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCWlmICghcmQtPnNrYikgeworCQlJUkRBX1dBUk5JTkcoIiVzOiByeCBwYWNrZXQgbG9zdFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0IHw9IFZMU0lfUlhfRFJPUDsKKwkJZ290byBkb25lOworCX0KKworCXNrYiA9IHJkLT5za2I7CisJcmQtPnNrYiA9IE5VTEw7CisJc2tiLT5kZXYgPSBuZGV2OworCW1lbWNweShza2JfcHV0KHNrYixsZW4pLCByZC0+YnVmLCBsZW4pOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCW5ldGlmX3J4KHNrYik7CisJZWxzZQorCQluZXRpZl9yeF9uaShza2IpOworCW5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCitkb25lOgorCXJkX3NldF9zdGF0dXMocmQsIDApOworCXJkX3NldF9jb3VudChyZCwgMCk7CisJLyogYnVmZmVyIHN0aWxsIG93bmVkIGJ5IENQVSAqLworCisJcmV0dXJuIChyZXQpID8gLXJldCA6IGxlbjsKK30KKworc3RhdGljIHZvaWQgdmxzaV9maWxsX3J4KHN0cnVjdCB2bHNpX3JpbmcgKnIpCit7CisJc3RydWN0IHJpbmdfZGVzY3IgKnJkOworCisJZm9yIChyZCA9IHJpbmdfbGFzdChyKTsgcmQgIT0gTlVMTDsgcmQgPSByaW5nX3B1dChyKSkgeworCQlpZiAocmRfaXNfYWN0aXZlKHJkKSkgeworCQkJSVJEQV9XQVJOSU5HKCIlczogZHJpdmVyIGJ1ZzogcnggZGVzY3IgcmFjZSB3aXRoIGh3XG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCXZsc2lfcmluZ19kZWJ1ZyhyKTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghcmQtPnNrYikgeworCQkJcmQtPnNrYiA9IGRldl9hbGxvY19za2IoSVJMQVBfU0tCX0FMTE9DU0laRSk7CisJCQlpZiAocmQtPnNrYikgeworCQkJCXNrYl9yZXNlcnZlKHJkLT5za2IsMSk7CisJCQkJcmQtPnNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlicmVhazsJLyogcHJvYmFibHkgbm90IHdvcnRoIGxvZ2dpbmc/ICovCisJCX0KKwkJLyogZ2l2ZSBkbWEgYnVmZmVyIGJhY2sgdG8gYnVzbWFzdGVyICovCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShyLT5wZGV2LCByZF9nZXRfYWRkcihyZCksIHItPmxlbiwgci0+ZGlyKTsKKwkJcmRfYWN0aXZhdGUocmQpOworCX0KK30KKworc3RhdGljIHZvaWQgdmxzaV9yeF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmRldi0+cHJpdjsKKwlzdHJ1Y3QgdmxzaV9yaW5nICpyID0gaWRldi0+cnhfcmluZzsKKwlzdHJ1Y3QgcmluZ19kZXNjciAqcmQ7CisJaW50IHJldDsKKworCWZvciAocmQgPSByaW5nX2ZpcnN0KHIpOyByZCAhPSBOVUxMOyByZCA9IHJpbmdfZ2V0KHIpKSB7CisKKwkJaWYgKHJkX2lzX2FjdGl2ZShyZCkpCisJCQlicmVhazsKKworCQlyZXQgPSB2bHNpX3Byb2Nlc3NfcngociwgcmQpOworCisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXQgPSAtcmV0OworCQkJaWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAocmV0ICYgVkxTSV9SWF9EUk9QKSAgCisJCQkJaWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJaWYgKHJldCAmIFZMU0lfUlhfT1ZFUikgIAorCQkJCWlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAocmV0ICYgVkxTSV9SWF9MRU5HVEgpICAKKwkJCQlpZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAocmV0ICYgVkxTSV9SWF9GUkFNRSkgIAorCQkJCWlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKHJldCAmIFZMU0lfUlhfQ1JDKSAgCisJCQkJaWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQl9CisJCWVsc2UgaWYgKHJldCA+IDApIHsKKwkJCWlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJldDsKKwkJfQorCX0KKworCWRvX2dldHRpbWVvZmRheSgmaWRldi0+bGFzdF9yeCk7IC8qIHJlbWVtYmVyICJub3ciIGZvciBsYXRlciBtdHQgZGVsYXkgKi8KKworCXZsc2lfZmlsbF9yeChyKTsKKworCWlmIChyaW5nX2ZpcnN0KHIpID09IE5VTEwpIHsKKwkJLyogd2UgYXJlIGluIGJpZyB0cm91YmxlLCBpZiB0aGlzIHNob3VsZCBldmVyIGhhcHBlbiAqLworCQlJUkRBX0VSUk9SKCIlczogcnggcmluZyBleGhhdXN0ZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQl2bHNpX3JpbmdfZGVidWcocik7CisJfQorCWVsc2UKKwkJb3V0dygwLCBuZGV2LT5iYXNlX2FkZHIrVkxTSV9QSU9fUFJPTVBUKTsKK30KKworLyogY2FsbGVyIG11c3QgaGF2ZSBzdG9wcGVkIHRoZSBjb250cm9sbGVyIGZyb20gYnVzbWFzdGVyaW5nICovCisKK3N0YXRpYyB2b2lkIHZsc2lfdW5hcm1fcngodmxzaV9pcmRhX2Rldl90ICppZGV2KQoreworCXN0cnVjdCB2bHNpX3JpbmcgKnIgPSBpZGV2LT5yeF9yaW5nOworCXN0cnVjdCByaW5nX2Rlc2NyICpyZDsKKwlpbnQgcmV0OworCisJZm9yIChyZCA9IHJpbmdfZmlyc3Qocik7IHJkICE9IE5VTEw7IHJkID0gcmluZ19nZXQocikpIHsKKworCQlyZXQgPSAwOworCQlpZiAocmRfaXNfYWN0aXZlKHJkKSkgeworCQkJcmRfc2V0X3N0YXR1cyhyZCwgMCk7CisJCQlpZiAocmRfZ2V0X2NvdW50KHJkKSkgeworCQkJCUlSREFfREVCVUcoMCwgIiVzIC0gZHJvcHBpbmcgcnggcGFja2V0XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCXJldCA9IC1WTFNJX1JYX0RST1A7CisJCQl9CisJCQlyZF9zZXRfY291bnQocmQsIDApOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHItPnBkZXYsIHJkX2dldF9hZGRyKHJkKSwgci0+bGVuLCByLT5kaXIpOworCQkJaWYgKHJkLT5za2IpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShyZC0+c2tiKTsKKwkJCQlyZC0+c2tiID0gTlVMTDsKKwkJCX0KKwkJfQorCQllbHNlCisJCQlyZXQgPSB2bHNpX3Byb2Nlc3NfcngociwgcmQpOworCisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXQgPSAtcmV0OworCQkJaWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAocmV0ICYgVkxTSV9SWF9EUk9QKSAgCisJCQkJaWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJaWYgKHJldCAmIFZMU0lfUlhfT1ZFUikgIAorCQkJCWlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAocmV0ICYgVkxTSV9SWF9MRU5HVEgpICAKKwkJCQlpZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAocmV0ICYgVkxTSV9SWF9GUkFNRSkgIAorCQkJCWlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKHJldCAmIFZMU0lfUlhfQ1JDKSAgCisJCQkJaWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQl9CisJCWVsc2UgaWYgKHJldCA+IDApIHsKKwkJCWlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJldDsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHZsc2lfcHJvY2Vzc190eChzdHJ1Y3QgdmxzaV9yaW5nICpyLCBzdHJ1Y3QgcmluZ19kZXNjciAqcmQpCit7CisJdTE2CQlzdGF0dXM7CisJaW50CQlsZW47CisJaW50CQlyZXQ7CisKKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoci0+cGRldiwgcmRfZ2V0X2FkZHIocmQpLCByLT5sZW4sIHItPmRpcik7CisJLyogZG1hIGJ1ZmZlciBub3cgb3duZWQgYnkgdGhlIENQVSAqLworCXN0YXR1cyA9IHJkX2dldF9zdGF0dXMocmQpOworCWlmIChzdGF0dXMgJiBSRF9UWF9VTkRSTikKKwkJcmV0ID0gVkxTSV9UWF9GSUZPOworCWVsc2UKKwkJcmV0ID0gMDsKKwlyZF9zZXRfc3RhdHVzKHJkLCAwKTsKKworCWlmIChyZC0+c2tiKSB7CisJCWxlbiA9IHJkLT5za2ItPmxlbjsKKwkJZGV2X2tmcmVlX3NrYl9hbnkocmQtPnNrYik7CisJCXJkLT5za2IgPSBOVUxMOworCX0KKwllbHNlCS8qIHR4LXNrYiBhbHJlYWR5IGZyZWVkPyAtIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJbGVuID0gcmRfZ2V0X2NvdW50KHJkKTsJCS8qIGluY29ycmVjdCBmb3IgU0lSISAoZHVlIHRvIHdyYXBwaW5nKSAqLworCisJcmRfc2V0X2NvdW50KHJkLCAwKTsKKwkvKiBkbWEgYnVmZmVyIHN0aWxsIG93bmVkIGJ5IHRoZSBDUFUgKi8KKworCXJldHVybiAocmV0KSA/IC1yZXQgOiBsZW47Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9zZXRfYmF1ZCh2bHNpX2lyZGFfZGV2X3QgKmlkZXYsIHVuc2lnbmVkIGlvYmFzZSkKK3sKKwl1MTYgbnBoeWN0bDsKKwl1MTYgY29uZmlnOworCXVuc2lnbmVkIG1vZGU7CisJaW50CXJldDsKKwlpbnQJYmF1ZHJhdGU7CisJaW50CWZpZm9jbnQ7CisKKwliYXVkcmF0ZSA9IGlkZXYtPm5ld19iYXVkOworCUlSREFfREVCVUcoMiwgIiVzOiAlZCAtPiAlZFxuIiwgX19GVU5DVElPTl9fLCBpZGV2LT5iYXVkLCBpZGV2LT5uZXdfYmF1ZCk7CisJaWYgKGJhdWRyYXRlID09IDQwMDAwMDApIHsKKwkJbW9kZSA9IElGRl9GSVI7CisJCWNvbmZpZyA9IElSQ0ZHX0ZJUjsKKwkJbnBoeWN0bCA9IFBIWUNUTF9GSVI7CisJfQorCWVsc2UgaWYgKGJhdWRyYXRlID09IDExNTIwMDApIHsKKwkJbW9kZSA9IElGRl9NSVI7CisJCWNvbmZpZyA9IElSQ0ZHX01JUiB8IElSQ0ZHX0NSQzE2OworCQlucGh5Y3RsID0gUEhZQ1RMX01JUihjbGtzcmM9PTMpOworCX0KKwllbHNlIHsKKwkJbW9kZSA9IElGRl9TSVI7CisJCWNvbmZpZyA9IElSQ0ZHX1NJUiB8IElSQ0ZHX1NJUkZJTFQgIHwgSVJDRkdfUlhBTlk7CisJCXN3aXRjaChiYXVkcmF0ZSkgeworCQkJZGVmYXVsdDoKKwkJCQlJUkRBX1dBUk5JTkcoIiVzOiB1bmRlZmluZWQgYmF1ZHJhdGUgJWQgLSBmYWxsYmFjayB0byA5NjAwIVxuIiwKKwkJCQkJICAgICBfX0ZVTkNUSU9OX18sIGJhdWRyYXRlKTsKKwkJCQliYXVkcmF0ZSA9IDk2MDA7CisJCQkJLyogZmFsbHRocnUgKi8KKwkJCWNhc2UgMjQwMDoKKwkJCWNhc2UgOTYwMDoKKwkJCWNhc2UgMTkyMDA6CisJCQljYXNlIDM4NDAwOgorCQkJY2FzZSA1NzYwMDoKKwkJCWNhc2UgMTE1MjAwOgorCQkJCW5waHljdGwgPSBQSFlDVExfU0lSKGJhdWRyYXRlLHNpcnB1bHNlLGNsa3NyYz09Myk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJY29uZmlnIHw9IElSQ0ZHX01TVFIgfCBJUkNGR19FTlJYOworCisJZmlmb2NudCA9IGludyhpb2Jhc2UrVkxTSV9QSU9fUkNWQkNOVCkgJiBSQ1ZCQ05UX01BU0s7CisJaWYgKGZpZm9jbnQgIT0gMCkgeworCQlJUkRBX0RFQlVHKDAsICIlczogcnggZmlmbyBub3QgZW1wdHkoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIGZpZm9jbnQpOworCX0KKworCW91dHcoMCwgaW9iYXNlK1ZMU0lfUElPX0lSRU5BQkxFKTsKKwlvdXR3KGNvbmZpZywgaW9iYXNlK1ZMU0lfUElPX0lSQ0ZHKTsKKwlvdXR3KG5waHljdGwsIGlvYmFzZStWTFNJX1BJT19OUEhZQ1RMKTsKKwl3bWIoKTsKKwlvdXR3KElSRU5BQkxFX1BIWUFORENMT0NLLCBpb2Jhc2UrVkxTSV9QSU9fSVJFTkFCTEUpOworCW1iKCk7CisKKwl1ZGVsYXkoMSk7CS8qIGNoaXAgYXBwbGllcyBJUkNGRyBvbiBuZXh0IHJpc2luZyBlZGdlIG9mIGl0cyA4TUh6IGNsb2NrICovCisKKwkvKiByZWFkIGJhY2sgc2V0dGluZ3MgZm9yIHZhbGlkYXRpb24gKi8KKworCWNvbmZpZyA9IGludyhpb2Jhc2UrVkxTSV9QSU9fSVJFTkFCTEUpICYgSVJFTkFCTEVfTUFTSzsKKworCWlmIChtb2RlID09IElGRl9GSVIpCisJCWNvbmZpZyBePSBJUkVOQUJMRV9GSVJfT047CisJZWxzZSBpZiAobW9kZSA9PSBJRkZfTUlSKQorCQljb25maWcgXj0gKElSRU5BQkxFX01JUl9PTnxJUkVOQUJMRV9DUkMxNl9PTik7CisJZWxzZQorCQljb25maWcgXj0gSVJFTkFCTEVfU0lSX09OOworCisJaWYgKGNvbmZpZyAhPSAoSVJFTkFCTEVfUEhZQU5EQ0xPQ0t8SVJFTkFCTEVfRU5SWFNUKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBmYWlsZWQgdG8gc2V0ICVzIG1vZGUhXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkobW9kZT09SUZGX1NJUik/IlNJUiI6KChtb2RlPT1JRkZfTUlSKT8iTUlSIjoiRklSIikpOworCQlyZXQgPSAtMTsKKwl9CisJZWxzZSB7CisJCWlmIChpbncoaW9iYXNlK1ZMU0lfUElPX1BIWUNUTCkgIT0gbnBoeWN0bCkgeworCQkJSVJEQV9XQVJOSU5HKCIlczogZmFpbGVkIHRvIGFwcGx5IGJhdWRyYXRlICVkXG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fLCBiYXVkcmF0ZSk7CisJCQlyZXQgPSAtMTsKKwkJfQorCQllbHNlIHsKKwkJCWlkZXYtPm1vZGUgPSBtb2RlOworCQkJaWRldi0+YmF1ZCA9IGJhdWRyYXRlOworCQkJaWRldi0+bmV3X2JhdWQgPSAwOworCQkJcmV0ID0gMDsKKwkJfQorCX0KKworCWlmIChyZXQpCisJCXZsc2lfcmVnX2RlYnVnKGlvYmFzZSxfX0ZVTkNUSU9OX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2bHNpX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCXN0cnVjdCB2bHNpX3JpbmcJKnIgPSBpZGV2LT50eF9yaW5nOworCXN0cnVjdCByaW5nX2Rlc2NyICpyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGlvYmFzZSA9IG5kZXYtPmJhc2VfYWRkcjsKKwl1OCBzdGF0dXM7CisJdTE2IGNvbmZpZzsKKwlpbnQgbXR0OworCWludCBsZW4sIHNwZWVkOworCXN0cnVjdCB0aW1ldmFsICBub3csIHJlYWR5OworCWNoYXIgKm1zZyA9IE5VTEw7CisKKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRldi0+bG9jaywgZmxhZ3MpOworCWlmIChzcGVlZCAhPSAtMSAgJiYgIHNwZWVkICE9IGlkZXYtPmJhdWQpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwkJaWRldi0+bmV3X2JhdWQgPSBzcGVlZDsKKwkJc3RhdHVzID0gUkRfVFhfQ0xSRU5UWDsgIC8qIHN0b3AgdHgtcmluZyBhZnRlciB0aGlzIGZyYW1lICovCisJfQorCWVsc2UKKwkJc3RhdHVzID0gMDsKKworCWlmIChza2ItPmxlbiA9PSAwKSB7CisJCS8qIGhhbmRsZSB6ZXJvIHBhY2tldHMgLSBzaG91bGQgYmUgc3BlZWQgY2hhbmdlICovCisJCWlmIChzdGF0dXMgPT0gMCkgeworCQkJbXNnID0gImJvZ3VzIHplcm8tbGVuZ3RoIHBhY2tldCI7CisJCQlnb3RvIGRyb3BfdW5sb2NrOworCQl9CisKKwkJLyogZHVlIHRvIHRoZSBjb21wbGV0ZWx5IGFzeW5jaCB0eCBvcGVyYXRpb24gd2UgbWlnaHQgaGF2ZQorCQkgKiBJckxBUCByYWNpbmcgd2l0aCB0aGUgaGFyZHdhcmUgaGVyZSwgZi5lLiBpZiB0aGUgY29udHJvbGxlcgorCQkgKiBpcyBqdXN0IHNlbmRpbmcgdGhlIGxhc3QgcGFja2V0IHdpdGggY3VycmVudCBzcGVlZCB3aGlsZQorCQkgKiB0aGUgTEFQIGlzIGFscmVhZHkgc3dpdGNoaW5nIHRoZSBzcGVlZCB1c2luZyBzeW5jaHJvbm91cworCQkgKiBsZW49MCBwYWNrZXQuIEltbWVkaWF0ZSBleGVjdXRpb24gd291bGQgbGVhZCB0byBodyBsb2NrdXAKKwkJICogcmVxdWlyaW5nIGEgcG93ZXJjeWNsZSB0byByZXNldC4gR29vZCBjYW5kaWRhdGUgdG8gdHJpZ2dlcgorCQkgKiB0aGlzIGlzIHRoZSBmaW5hbCBVQTpSU1AgcGFja2V0IGFmdGVyIHJlY2VpdmluZyBhIERJU0M6Q01ECisJCSAqIHdoZW4gZ2V0dGluZyB0aGUgTEFQIGRvd24uCisJCSAqIE5vdGUgdGhhdCB3ZSBhcmUgbm90IHByb3RlY3RlZCBieSB0aGUgcXVldWVfc3RvcCBhcHByb2FjaAorCQkgKiBiZWNhdXNlIHRoZSBmaW5hbCBVQTpSU1AgYXJyaXZlcyBfd2l0aG91dF8gcmVxdWVzdCB0byBhcHBseQorCQkgKiBuZXctc3BlZWQtYWZ0ZXItdGhpcy1wYWNrZXQgLSBoZW5jZSB0aGUgZHJpdmVyIGRvZXNuJ3Qga25vdworCQkgKiB0aGlzIHdhcyB0aGUgbGFzdCBwYWNrZXQgYW5kIGRvZXNuJ3Qgc3RvcCB0aGUgcXVldWUuIFNvIHRoZQorCQkgKiBmb3JjZWQgc3dpdGNoIHRvIGRlZmF1bHQgc3BlZWQgZnJvbSBMQVAgZ2V0cyB0aHJvdWdoIGFzIGZhc3QKKwkJICogYXMgb25seSBzb21lIDEwIHVzZWMgbGF0ZXIgd2hpbGUgdGhlIFVBOlJTUCBpcyBzdGlsbCBwcm9jZXNzZWQKKwkJICogYnkgdGhlIGhhcmR3YXJlIGFuZCB3ZSB3b3VsZCBnZXQgc2NyZXdlZC4KKwkJICovCisKKwkJaWYgKHJpbmdfZmlyc3QoaWRldi0+dHhfcmluZykgPT0gTlVMTCkgeworCQkJLyogbm8gcmFjZSAtIHR4LXJpbmcgYWxyZWFkeSBlbXB0eSAqLworCQkJdmxzaV9zZXRfYmF1ZChpZGV2LCBpb2Jhc2UpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKKwkJfQorCQllbHNlCisJCQk7CisJCQkvKiBrZWVwIHRoZSBzcGVlZCBjaGFuZ2UgcGVuZGluZyBsaWtlIGl0IHdvdWxkCisJCQkgKiBmb3IgYW55IGxlbj4wIHBhY2tldC4gdHggY29tcGxldGlvbiBpbnRlcnJ1cHQKKwkJCSAqIHdpbGwgYXBwbHkgaXQgd2hlbiB0aGUgdHggcmluZyBiZWNvbWVzIGVtcHR5LgorCQkJICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZXYtPmxvY2ssIGZsYWdzKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogc2FuaXR5IGNoZWNrcyAtIHNpbXBseSBkcm9wIHRoZSBwYWNrZXQgKi8KKworCXJkID0gcmluZ19sYXN0KHIpOworCWlmICghcmQpIHsKKwkJbXNnID0gInJpbmcgZnVsbCwgYnV0IHF1ZXVlIHdhc24ndCBzdG9wcGVkIjsKKwkJZ290byBkcm9wX3VubG9jazsKKwl9CisKKwlpZiAocmRfaXNfYWN0aXZlKHJkKSkgeworCQltc2cgPSAiZW50cnkgc3RpbGwgb3duZWQgYnkgaHciOworCQlnb3RvIGRyb3BfdW5sb2NrOworCX0KKworCWlmICghcmQtPmJ1ZikgeworCQltc2cgPSAidHggcmluZyBlbnRyeSB3aXRob3V0IHBjaSBidWZmZXIiOworCQlnb3RvIGRyb3BfdW5sb2NrOworCX0KKworCWlmIChyZC0+c2tiKSB7CisJCW1zZyA9ICJyaW5nIGVudHJ5IHdpdGggb2xkIHNrYiBzdGlsbCBhdHRhY2hlZCI7CisJCWdvdG8gZHJvcF91bmxvY2s7CisJfQorCisJLyogbm8gbmVlZCBmb3Igc2VyaWFsaXphdGlvbiBvciBpbnRlcnJ1cHQgZGlzYWJsZSBkdXJpbmcgbXR0ICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRldi0+bG9jaywgZmxhZ3MpOworCisJaWYgKChtdHQgPSBpcmRhX2dldF9tdHQoc2tiKSkgPiAwKSB7CisJCisJCXJlYWR5LnR2X3VzZWMgPSBpZGV2LT5sYXN0X3J4LnR2X3VzZWMgKyBtdHQ7CisJCXJlYWR5LnR2X3NlYyA9IGlkZXYtPmxhc3RfcngudHZfc2VjOworCQlpZiAocmVhZHkudHZfdXNlYyA+PSAxMDAwMDAwKSB7CisJCQlyZWFkeS50dl91c2VjIC09IDEwMDAwMDA7CisJCQlyZWFkeS50dl9zZWMrKzsJCS8qIElyTEFQIDEuMTogbXR0IGFsd2F5cyA8IDEgc2VjICovCisJCX0KKwkJZm9yKDs7KSB7CisJCQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisJCQlpZiAobm93LnR2X3NlYyA+IHJlYWR5LnR2X3NlYworCQkJICAgIHx8ICAobm93LnR2X3NlYz09cmVhZHkudHZfc2VjICYmIG5vdy50dl91c2VjPj1yZWFkeS50dl91c2VjKSkKKwkJCSAgICAJYnJlYWs7CisJCQl1ZGVsYXkoMTAwKTsKKwkJCS8qIG11c3Qgbm90IHNsZWVwIGhlcmUgLSB3ZSBhcmUgY2FsbGVkIHVuZGVyIHhtaXRfbG9jayEgKi8KKwkJfQorCX0KKworCS8qIHR4IGJ1ZmZlciBhbHJlYWR5IG93bmVkIGJ5IENQVSBkdWUgdG8gcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCkKKwkgKiBhZnRlciBzdWJzZXF1ZW50IHR4LWNvbXBsZXRpb24KKwkgKi8KKworCWlmIChpZGV2LT5tb2RlID09IElGRl9TSVIpIHsKKwkJc3RhdHVzIHw9IFJEX1RYX0RJU0NSQzsJCS8qIG5vIGh3LWNyYyBjcmVhdGlvbiAqLworCQlsZW4gPSBhc3luY193cmFwX3NrYihza2IsIHJkLT5idWYsIHItPmxlbik7CisKKwkJLyogU29tZSByYXJlIHdvcnN0IGNhc2Ugc2l0dWF0aW9uIGluIFNJUiBtb2RlIG1pZ2h0IGxlYWQgdG8KKwkJICogcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvdy4gVGhlIHdyYXBwZXIgZGV0ZWN0cyB0aGlzLCByZXR1cm5zCisJCSAqIHdpdGggYSBzaG9ydGVuZWQgZnJhbWUgKHdpdGhvdXQgRkNTL0VPRikgYnV0IGRvZXNuJ3QgcHJvdmlkZQorCQkgKiBhbnkgZXJyb3IgaW5kaWNhdGlvbiBhYm91dCB0aGUgaW52YWxpZCBwYWNrZXQgd2hpY2ggd2UgYXJlCisJCSAqIGdvaW5nIHRvIHRyYW5zbWl0LgorCQkgKiBUaGVyZWZvcmUgd2UgbG9nIGlmIHRoZSBidWZmZXIgZ290IGZpbGxlZCB0byB0aGUgcG9pbnQsIHdoZXJlIHRoZQorCQkgKiB3cmFwcGVyIHdvdWxkIGFib3J0LCBpLmUuIHdoZW4gdGhlcmUgYXJlIGxlc3MgdGhhbiA1IGJ5dGVzIGxlZnQgdG8KKwkJICogYWxsb3cgYXBwZW5kaW5nIHRoZSBGQ1MvRU9GLgorCQkgKi8KKworCQlpZiAobGVuID49IHItPmxlbi01KQorCQkJIElSREFfV0FSTklORygiJXM6IHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdyB3aXRoIFNJUiB3cmFwcGluZyFcbiIsCisJCQkJICAgICAgX19GVU5DVElPTl9fKTsKKwl9CisJZWxzZSB7CisJCS8qIGh3IGRlYWxzIHdpdGggTUlSL0ZJUiBtb2RlIHdyYXBwaW5nICovCisJCXN0YXR1cyB8PSBSRF9UWF9QVUxTRTsJCS8qIHNlbmQgMiB1cyBoaWdoc3BlZWQgaW5kaWNhdGlvbiBwdWxzZSAqLworCQlsZW4gPSBza2ItPmxlbjsKKwkJaWYgKGxlbiA+IHItPmxlbikgeworCQkJbXNnID0gImZyYW1lIGV4Y2VlZHMgdHggYnVmZmVyIGxlbmd0aCI7CisJCQlnb3RvIGRyb3A7CisJCX0KKwkJZWxzZQorCQkJbWVtY3B5KHJkLT5idWYsIHNrYi0+ZGF0YSwgbGVuKTsKKwl9CisKKwlyZC0+c2tiID0gc2tiOwkJCS8qIHJlbWVtYmVyIHNrYiBmb3IgdHgtY29tcGxldGUgc3RhdHMgKi8KKworCXJkX3NldF9jb3VudChyZCwgbGVuKTsKKwlyZF9zZXRfc3RhdHVzKHJkLCBzdGF0dXMpOwkvKiBub3QgeWV0IGFjdGl2ZSEgKi8KKworCS8qIGdpdmUgZG1hIGJ1ZmZlciBiYWNrIHRvIGJ1c21hc3Rlci1odyAoZmx1c2ggY2FjaGVzIHRvIG1ha2UKKwkgKiBDUFUtZHJpdmVuIGNoYW5nZXMgdmlzaWJsZSBmcm9tIHRoZSBwY2kgYnVzKS4KKwkgKi8KKworCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShyLT5wZGV2LCByZF9nZXRfYWRkcihyZCksIHItPmxlbiwgci0+ZGlyKTsKKworLyoJU3dpdGNoaW5nIHRvIFRYIG1vZGUgaGVyZSByYWNlcyB3aXRoIHRoZSBjb250cm9sbGVyCisgKgl3aGljaCBtYXkgc3RvcCBUWCBhdCBhbnkgdGltZSB3aGVuIGZldGNoaW5nIGFuIGluYWN0aXZlIGRlc2NyaXB0b3IKKyAqCW9yIG9uZSB3aXRoIENMUl9FTlRYIHNldC4gU28gd2Ugc3dpdGNoIG9uIFRYIG9ubHksIGlmIFRYIHdhcyBub3QgcnVubmluZworICoJX2FmdGVyXyB0aGUgbmV3IGRlc2NyaXB0b3Igd2FzIGFjdGl2YXRlZCBvbiB0aGUgcmluZy4gVGhpcyBlbnN1cmVzCisgKgl3ZSB3aWxsIGVpdGhlciBmaW5kIFRYIGFscmVhZHkgc3RvcHBlZCBvciB3ZSBjYW4gYmUgc3VyZSwgdGhlcmUKKyAqCXdpbGwgYmUgYSBUWC1jb21wbGV0ZSBpbnRlcnJ1cHQgZXZlbiBpZiB0aGUgY2hpcCBzdG9wcGVkIGRvaW5nCisgKglUWCBqdXN0IGFmdGVyIHdlIGZvdW5kIGl0IHN0aWxsIHJ1bm5pbmcuIFRoZSBJU1Igd2lsbCB0aGVuIGZpbmQKKyAqCXRoZSBub24tZW1wdHkgcmluZyBhbmQgcmVzdGFydCBUWCBwcm9jZXNzaW5nLiBUaGUgZW5jbG9zaW5nCisgKglzcGlubG9jayBwcm92aWRlcyB0aGUgY29ycmVjdCBzZXJpYWxpemF0aW9uIHRvIHByZXZlbnQgcmFjZSB3aXRoIGlzci4KKyAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZXYtPmxvY2ssZmxhZ3MpOworCisJcmRfYWN0aXZhdGUocmQpOworCisJaWYgKCEoaW53KGlvYmFzZStWTFNJX1BJT19JUkVOQUJMRSkgJiBJUkVOQUJMRV9FTlRYU1QpKSB7CisJCWludCBmaWZvY250OworCisJCWZpZm9jbnQgPSBpbncobmRldi0+YmFzZV9hZGRyK1ZMU0lfUElPX1JDVkJDTlQpICYgUkNWQkNOVF9NQVNLOworCQlpZiAoZmlmb2NudCAhPSAwKSB7CisJCQlJUkRBX0RFQlVHKDAsICIlczogcnggZmlmbyBub3QgZW1wdHkoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIGZpZm9jbnQpOworCQl9CisKKwkJY29uZmlnID0gaW53KGlvYmFzZStWTFNJX1BJT19JUkNGRyk7CisJCW1iKCk7CisJCW91dHcoY29uZmlnIHwgSVJDRkdfRU5UWCwgaW9iYXNlK1ZMU0lfUElPX0lSQ0ZHKTsKKwkJd21iKCk7CisJCW91dHcoMCwgaW9iYXNlK1ZMU0lfUElPX1BST01QVCk7CisJfQorCW5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWlmIChyaW5nX3B1dChyKSA9PSBOVUxMKSB7CisJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJCUlSREFfREVCVUcoMywgIiVzOiB0eCByaW5nIGZ1bGwgLSBxdWV1ZSBzdG9wcGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGV2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKKworZHJvcF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRldi0+bG9jaywgZmxhZ3MpOworZHJvcDoKKwlJUkRBX1dBUk5JTkcoIiVzOiBkcm9wcGluZyBwYWNrZXQgLSAlc1xuIiwgX19GVU5DVElPTl9fLCBtc2cpOworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJaWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJaWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOworCS8qIERvbid0IGV2ZW4gdGhpbmsgYWJvdXQgcmV0dXJuaW5nIE5FVF9YTUlUX0RST1AgKD0xKSBoZXJlIQorCSAqIEluIGZhY3QgYW55IHJldHZhbCE9MCBjYXVzZXMgdGhlIHBhY2tldCBzY2hlZHVsZXIgdG8gcmVxdWV1ZSB0aGUKKwkgKiBwYWNrZXQgZm9yIGxhdGVyIHJldHJ5IG9mIHRyYW5zbWlzc2lvbiAtIHdoaWNoIGlzbid0IGV4YWN0bHkKKwkgKiB3aGF0IHdlIHdhbnQgYWZ0ZXIgd2UndmUganVzdCBjYWxsZWQgZGV2X2tmcmVlX3NrYl9hbnkgOy0pCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZsc2lfdHhfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5kZXYtPnByaXY7CisJc3RydWN0IHZsc2lfcmluZwkqciA9IGlkZXYtPnR4X3Jpbmc7CisJc3RydWN0IHJpbmdfZGVzY3IJKnJkOworCXVuc2lnbmVkCWlvYmFzZTsKKwlpbnQJcmV0OworCXUxNgljb25maWc7CisKKwlmb3IgKHJkID0gcmluZ19maXJzdChyKTsgcmQgIT0gTlVMTDsgcmQgPSByaW5nX2dldChyKSkgeworCisJCWlmIChyZF9pc19hY3RpdmUocmQpKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gdmxzaV9wcm9jZXNzX3R4KHIsIHJkKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0ID0gLXJldDsKKwkJCWlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHJldCAmIFZMU0lfVFhfRFJPUCkKKwkJCQlpZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJCQlpZiAocmV0ICYgVkxTSV9UWF9GSUZPKQorCQkJCWlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCX0KKwkJZWxzZSBpZiAocmV0ID4gMCl7CisJCQlpZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlpZGV2LT5zdGF0cy50eF9ieXRlcyArPSByZXQ7CisJCX0KKwl9CisKKwlpb2Jhc2UgPSBuZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoaWRldi0+bmV3X2JhdWQgICYmICByZCA9PSBOVUxMKQkvKiB0eCByaW5nIGVtcHR5IGFuZCBzcGVlZCBjaGFuZ2UgcGVuZGluZyAqLworCQl2bHNpX3NldF9iYXVkKGlkZXYsIGlvYmFzZSk7CisKKwljb25maWcgPSBpbncoaW9iYXNlK1ZMU0lfUElPX0lSQ0ZHKTsKKwlpZiAocmQgPT0gTlVMTCkJCQkvKiB0eCByaW5nIGVtcHR5OiByZS1lbmFibGUgcnggKi8KKwkJb3V0dygoY29uZmlnICYgfklSQ0ZHX0VOVFgpIHwgSVJDRkdfRU5SWCwgaW9iYXNlK1ZMU0lfUElPX0lSQ0ZHKTsKKworCWVsc2UgaWYgKCEoaW53KGlvYmFzZStWTFNJX1BJT19JUkVOQUJMRSkgJiBJUkVOQUJMRV9FTlRYU1QpKSB7CisJCWludCBmaWZvY250OworCisJCWZpZm9jbnQgPSBpbncoaW9iYXNlK1ZMU0lfUElPX1JDVkJDTlQpICYgUkNWQkNOVF9NQVNLOworCQlpZiAoZmlmb2NudCAhPSAwKSB7CisJCQlJUkRBX0RFQlVHKDAsICIlczogcnggZmlmbyBub3QgZW1wdHkoJWQpXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgZmlmb2NudCk7CisJCX0KKwkJb3V0dyhjb25maWcgfCBJUkNGR19FTlRYLCBpb2Jhc2UrVkxTSV9QSU9fSVJDRkcpOworCX0KKworCW91dHcoMCwgaW9iYXNlK1ZMU0lfUElPX1BST01QVCk7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChuZGV2KSAgJiYgICFpZGV2LT5uZXdfYmF1ZCkgeworCQluZXRpZl93YWtlX3F1ZXVlKG5kZXYpOworCQlJUkRBX0RFQlVHKDMsICIlczogcXVldWUgYXdva2VuXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KK30KKworLyogY2FsbGVyIG11c3QgaGF2ZSBzdG9wcGVkIHRoZSBjb250cm9sbGVyIGZyb20gYnVzbWFzdGVyaW5nICovCisKK3N0YXRpYyB2b2lkIHZsc2lfdW5hcm1fdHgodmxzaV9pcmRhX2Rldl90ICppZGV2KQoreworCXN0cnVjdCB2bHNpX3JpbmcgKnIgPSBpZGV2LT50eF9yaW5nOworCXN0cnVjdCByaW5nX2Rlc2NyICpyZDsKKwlpbnQgcmV0OworCisJZm9yIChyZCA9IHJpbmdfZmlyc3Qocik7IHJkICE9IE5VTEw7IHJkID0gcmluZ19nZXQocikpIHsKKworCQlyZXQgPSAwOworCQlpZiAocmRfaXNfYWN0aXZlKHJkKSkgeworCQkJcmRfc2V0X3N0YXR1cyhyZCwgMCk7CisJCQlyZF9zZXRfY291bnQocmQsIDApOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHItPnBkZXYsIHJkX2dldF9hZGRyKHJkKSwgci0+bGVuLCByLT5kaXIpOworCQkJaWYgKHJkLT5za2IpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShyZC0+c2tiKTsKKwkJCQlyZC0+c2tiID0gTlVMTDsKKwkJCX0KKwkJCUlSREFfREVCVUcoMCwgIiVzIC0gZHJvcHBpbmcgdHggcGFja2V0XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0ID0gLVZMU0lfVFhfRFJPUDsKKwkJfQorCQllbHNlCisJCQlyZXQgPSB2bHNpX3Byb2Nlc3NfdHgociwgcmQpOworCisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXQgPSAtcmV0OworCQkJaWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlpZiAocmV0ICYgVkxTSV9UWF9EUk9QKQorCQkJCWlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCWlmIChyZXQgJiBWTFNJX1RYX0ZJRk8pCisJCQkJaWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJfQorCQllbHNlIGlmIChyZXQgPiAwKXsKKwkJCWlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHJldDsKKwkJfQorCX0KKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdmxzaV9zdGFydF9jbG9jayhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1OAljbGtjdGwsIGxvY2s7CisJaW50CWksIGNvdW50OworCisJaWYgKGNsa3NyYyA8IDIpIHsgLyogYXV0byBvciBQTEw6IHRyeSBQTEwgKi8KKwkJY2xrY3RsID0gQ0xLQ1RMX1BEX0lOViB8IENMS0NUTF9DTEtTVFA7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9DTEtDVEwsIGNsa2N0bCk7CisKKwkJLyogcHJvY2VkdXJlIHRvIGRldGVjdCBQTEwgbG9jayBzeW5jaHJvbmlzYXRpb246CisJCSAqIGFmdGVyIDAuNSBtc2VjIGluaXRpYWwgZGVsYXkgd2UgZXhwZWN0IHRvIGZpbmQgMyBQTEwgbG9jaworCQkgKiBpbmRpY2F0aW9ucyB3aXRoaW4gMTAgbXNlYyBmb3Igc3VjY2Vzc2Z1bCBQTEwgZGV0ZWN0aW9uLgorCQkgKi8KKwkJdWRlbGF5KDUwMCk7CisJCWNvdW50ID0gMDsKKwkJZm9yIChpID0gNTAwOyBpIDw9IDEwMDAwOyBpICs9IDUwKSB7IC8qIG1heCAxMCBtc2VjICovCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9DTEtDVEwsICZsb2NrKTsKKwkJCWlmIChsb2NrJkNMS0NUTF9MT0NLKSB7CisJCQkJaWYgKCsrY291bnQgPj0gMykKKwkJCQkJYnJlYWs7CisJCQl9CisJCQl1ZGVsYXkoNTApOworCQl9CisJCWlmIChjb3VudCA8IDMpIHsKKwkJCWlmIChjbGtzcmMgPT0gMSkgeyAvKiBleHBsaWNpdGx5IGFza2VkIGZvciBQTEwgaGVuY2UgYmFpbCBvdXQgKi8KKwkJCQlJUkRBX0VSUk9SKCIlczogbm8gUExMIG9yIGZhaWxlZCB0byBsb2NrIVxuIiwKKwkJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCQljbGtjdGwgPSBDTEtDVExfQ0xLU1RQOworCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9DTEtDVEwsIGNsa2N0bCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZWxzZQkJCS8qIHdhczogY2xrc3JjPTAoYXV0bykgKi8KKwkJCQljbGtzcmMgPSAzOwkvKiBmYWxsYmFjayB0byA0ME1IeiBYQ0xLIChPQjgwMCkgKi8KKworCQkJSVJEQV9ERUJVRygwLCAiJXM6IFBMTCBub3QgbG9ja2VkLCBmYWxsYmFjayB0byBjbGtzcmM9JWRcbiIsCisJCQkJX19GVU5DVElPTl9fLCBjbGtzcmMpOworCQl9CisJCWVsc2UKKwkJCWNsa3NyYyA9IDE7CS8qIGdvdCBzdWNjZXNzZnVsIFBMTCBsb2NrICovCisJfQorCisJaWYgKGNsa3NyYyAhPSAxKSB7CisJCS8qIHdlIGdldCBoZXJlIGlmIGVpdGhlciBubyBQTEwgZGV0ZWN0ZWQgaW4gYXV0by1tb2RlIG9yCisJCSAgIGFuIGV4dGVybmFsIGNsb2NrIHNvdXJjZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgKi8KKworCQljbGtjdGwgPSBDTEtDVExfRVhUQ0xLIHwgQ0xLQ1RMX0NMS1NUUDsKKwkJaWYgKGNsa3NyYyA9PSAzKQorCQkJY2xrY3RsIHw9IENMS0NUTF9YQ0tTRUw7CQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgVkxTSV9QQ0lfQ0xLQ1RMLCBjbGtjdGwpOworCisJCS8qIG5vIHdheSB0byB0ZXN0IGZvciB3b3JraW5nIFhDTEsgKi8KKwl9CisJZWxzZQorCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9DTEtDVEwsICZjbGtjdGwpOworCisJLyogb2ssIG5vdyBnb2luZyB0byBjb25uZWN0IHRoZSBjaGlwIHdpdGggdGhlIGNsb2NrIHNvdXJjZSAqLworCisJY2xrY3RsICY9IH5DTEtDVExfQ0xLU1RQOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9DTEtDVEwsIGNsa2N0bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmxzaV9zdG9wX2Nsb2NrKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXU4CWNsa2N0bDsKKworCS8qIGRpc2Nvbm5lY3QgY2hpcCBmcm9tIGNsb2NrIHNvdXJjZSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFZMU0lfUENJX0NMS0NUTCwgJmNsa2N0bCk7CisJY2xrY3RsIHw9IENMS0NUTF9DTEtTVFA7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFZMU0lfUENJX0NMS0NUTCwgY2xrY3RsKTsKKworCS8qIGRpc2FibGUgYWxsIGNsb2NrIHNvdXJjZXMgKi8KKwljbGtjdGwgJj0gfihDTEtDVExfRVhUQ0xLIHwgQ0xLQ1RMX1BEX0lOVik7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFZMU0lfUENJX0NMS0NUTCwgY2xrY3RsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB3cml0aW5nIGFsbC16ZXJvIHRvIHRoZSBWTFNJIFBDSSBJTyByZWdpc3RlciBhcmVhIHNlZW1zIHRvIHByZXZlbnQKKyAqIHNvbWUgb2NjYXNpb25hbCBzaXR1YXRpb25zIHdoZXJlIHRoZSBoYXJkd2FyZSBmYWlscyAoc3ltcHRvbXMgYXJlIAorICogd2hhdCBhcHBlYXJzIGFzIHN0YWxsZWQgdHgvcnggc3RhdGUgbWFjaGluZXMsIGkuZS4gZXZlcnl0aGluZyBvayBmb3IKKyAqIHJlY2VpdmUgb3IgdHJhbnNtaXQgYnV0IGh3IG1ha2VzIG5vIHByb2dyZXNzIG9yIGlzIHVuYWJsZSB0byBhY2Nlc3MKKyAqIHRoZSBidXMgbWVtb3J5IGxvY2F0aW9ucykuCisgKiBCZXN0IHBsYWNlIHRvIGNhbGwgdGhpcyBpcyBpbW1lZGlhdGVseSBhZnRlci9iZWZvcmUgdGhlIGludGVybmFsIGNsb2NrCisgKiBnZXRzIHN0YXJ0ZWQvc3RvcHBlZC4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdmxzaV9jbGVhcl9yZWdzKHVuc2lnbmVkIGlvYmFzZSkKK3sKKwl1bnNpZ25lZAlpOworCWNvbnN0IHVuc2lnbmVkCWNoaXBfaW9fZXh0ZW50ID0gMzI7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcF9pb19leHRlbnQ7IGkgKz0gc2l6ZW9mKHUxNikpCisJCW91dHcoMCwgaW9iYXNlICsgaSk7Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9pbml0X2NoaXAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmRldi0+cHJpdjsKKwl1bnNpZ25lZAlpb2Jhc2U7CisJdTE2IHB0cjsKKworCS8qIHN0YXJ0IHRoZSBjbG9jayBhbmQgY2xlYW4gdGhlIHJlZ2lzdGVycyAqLworCisJaWYgKHZsc2lfc3RhcnRfY2xvY2socGRldikpIHsKKwkJSVJEQV9FUlJPUigiJXM6IG5vIHZhbGlkIGNsb2NrIHNvdXJjZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpb2Jhc2UgPSBuZGV2LT5iYXNlX2FkZHI7CisJdmxzaV9jbGVhcl9yZWdzKGlvYmFzZSk7CisKKwlvdXRiKElSSU5UUl9JTlRfTUFTSywgaW9iYXNlK1ZMU0lfUElPX0lSSU5UUik7IC8qIHcvYyBwZW5kaW5nIElSUSwgZGlzYWJsZSBhbGwgSU5UICovCisKKwlvdXR3KDAsIGlvYmFzZStWTFNJX1BJT19JUkVOQUJMRSk7CS8qIGRpc2FibGUgSXJQSFktaW50ZXJmYWNlICovCisKKwkvKiBkaXNhYmxlIGV2ZXJ5dGhpbmcsIHBhcnRpY3VsYXJseSBJUkNGR19NU1RSIC0gKGFsc28gcmVzZXR0aW5nIHRoZSBSSU5HX1BUUikgKi8KKworCW91dHcoMCwgaW9iYXNlK1ZMU0lfUElPX0lSQ0ZHKTsKKwl3bWIoKTsKKworCW91dHcoTUFYX1BBQ0tFVF9MRU5HVEgsIGlvYmFzZStWTFNJX1BJT19NQVhQS1QpOyAgLyogbWF4IHBvc3NpYmxlIHZhbHVlPTB4MGZmZiAqLworCisJb3V0dyhCVVNfVE9fUklOR0JBU0UoaWRldi0+YnVzYWRkciksIGlvYmFzZStWTFNJX1BJT19SSU5HQkFTRSk7CisKKwlvdXR3KFRYX1JYX1RPX1JJTkdTSVpFKGlkZXYtPnR4X3JpbmctPnNpemUsIGlkZXYtPnJ4X3JpbmctPnNpemUpLAorCQlpb2Jhc2UrVkxTSV9QSU9fUklOR1NJWkUpOwkKKworCXB0ciA9IGludyhpb2Jhc2UrVkxTSV9QSU9fUklOR1BUUik7CisJYXRvbWljX3NldCgmaWRldi0+cnhfcmluZy0+aGVhZCwgUklOR1BUUl9HRVRfUlgocHRyKSk7CisJYXRvbWljX3NldCgmaWRldi0+cnhfcmluZy0+dGFpbCwgUklOR1BUUl9HRVRfUlgocHRyKSk7CisJYXRvbWljX3NldCgmaWRldi0+dHhfcmluZy0+aGVhZCwgUklOR1BUUl9HRVRfVFgocHRyKSk7CisJYXRvbWljX3NldCgmaWRldi0+dHhfcmluZy0+dGFpbCwgUklOR1BUUl9HRVRfVFgocHRyKSk7CisKKwl2bHNpX3NldF9iYXVkKGlkZXYsIGlvYmFzZSk7CS8qIGlkZXYtPm5ld19iYXVkIHVzZWQgYXMgcHJvdmlkZWQgYnkgY2FsbGVyICovCisKKwlvdXRiKElSSU5UUl9JTlRfTUFTSywgaW9iYXNlK1ZMU0lfUElPX0lSSU5UUik7CS8qIGp1c3QgaW4gY2FzZSAtIHcvYyBwZW5kaW5nIElSUSdzICovCisJd21iKCk7CisKKwkvKiBETyBOT1QgQkxJTkRMWSBFTkFCTEUgSVJJTlRSX0FDVEVOIQorCSAqIGJhc2ljYWxseSBldmVyeSByZWNlaXZlZCBwdWxzZSBmaXJlcyBhbiBBQ1RJVklUWS1JTlQKKwkgKiBsZWFkaW5nIHRvID4+MTAwMCBJTlQncyBwZXIgc2Vjb25kIGluc3RlYWQgb2YgZmV3IDEwCisJICovCisKKwlvdXRiKElSSU5UUl9SUEtURU58SVJJTlRSX1RQS1RFTiwgaW9iYXNlK1ZMU0lfUElPX0lSSU5UUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bHNpX3N0YXJ0X2h3KHZsc2lfaXJkYV9kZXZfdCAqaWRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGlkZXYtPnBkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgaW9iYXNlID0gbmRldi0+YmFzZV9hZGRyOworCXU4IGJ5dGU7CisKKwkvKiB3ZSBkb24ndCB1c2UgdGhlIGxlZ2FjeSBVQVJULCBkaXNhYmxlIGl0cyBhZGRyZXNzIGRlY29kaW5nICovCisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9JUk1JU0MsICZieXRlKTsKKwlieXRlICY9IH4oSVJNSVNDX1VBUlRFTiB8IElSTUlTQ19VQVJUVFNUKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgVkxTSV9QQ0lfSVJNSVNDLCBieXRlKTsKKworCS8qIGVuYWJsZSBQQ0kgYnVzbWFzdGVyIGFjY2VzcyB0byBvdXIgMTZNQiBwYWdlICovCisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgVkxTSV9QQ0lfTVNUUlBBR0UsIE1TVFJQQUdFX1ZBTFVFKTsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmICh2bHNpX2luaXRfY2hpcChwZGV2KSA8IDApIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlyZXR1cm4gLTE7CisJfQorCisJdmxzaV9maWxsX3J4KGlkZXYtPnJ4X3JpbmcpOworCisJZG9fZ2V0dGltZW9mZGF5KCZpZGV2LT5sYXN0X3J4KTsJLyogZmlyc3QgbXR0IG1heSBzdGFydCBmcm9tIG5vdyBvbiAqLworCisJb3V0dygwLCBpb2Jhc2UrVkxTSV9QSU9fUFJPTVBUKTsJLyoga2ljayBodyBzdGF0ZSBtYWNoaW5lICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bHNpX3N0b3BfaHcodmxzaV9pcmRhX2Rldl90ICppZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaWRldi0+cGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBpb2Jhc2UgPSBuZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGV2LT5sb2NrLGZsYWdzKTsKKwlvdXR3KDAsIGlvYmFzZStWTFNJX1BJT19JUkVOQUJMRSk7CisJb3V0dygwLCBpb2Jhc2UrVkxTSV9QSU9fSVJDRkcpOwkJCS8qIGRpc2FibGUgZXZlcnl0aGluZyAqLworCisJLyogZGlzYWJsZSBhbmQgdy9jIGlycXMgKi8KKwlvdXRiKDAsIGlvYmFzZStWTFNJX1BJT19JUklOVFIpOworCXdtYigpOworCW91dGIoSVJJTlRSX0lOVF9NQVNLLCBpb2Jhc2UrVkxTSV9QSU9fSVJJTlRSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGV2LT5sb2NrLGZsYWdzKTsKKworCXZsc2lfdW5hcm1fdHgoaWRldik7CisJdmxzaV91bmFybV9yeChpZGV2KTsKKworCXZsc2lfY2xlYXJfcmVncyhpb2Jhc2UpOworCXZsc2lfc3RvcF9jbG9jayhwZGV2KTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIHZsc2lfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5kZXYtPnByaXY7CisKKwlyZXR1cm4gJmlkZXYtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCB2bHNpX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmRldi0+cHJpdjsKKworCisJdmxzaV9yZWdfZGVidWcobmRldi0+YmFzZV9hZGRyLCBfX0ZVTkNUSU9OX18pOworCXZsc2lfcmluZ19kZWJ1ZyhpZGV2LT50eF9yaW5nKTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKQorCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJdmxzaV9zdG9wX2h3KGlkZXYpOworCisJLyogbm93IHNpbXBseSByZXN0YXJ0IHRoZSB3aG9sZSB0aGluZyAqLworCisJaWYgKCFpZGV2LT5uZXdfYmF1ZCkKKwkJaWRldi0+bmV3X2JhdWQgPSBpZGV2LT5iYXVkOwkJLyoga2VlcCBjdXJyZW50IGJhdWRyYXRlICovCisKKwlpZiAodmxzaV9zdGFydF9odyhpZGV2KSkKKwkJSVJEQV9FUlJPUigiJXM6IGZhaWxlZCB0byByZXN0YXJ0IGh3IC0gJXMoJXMpIHVudXNhYmxlIVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgUENJREVWX05BTUUoaWRldi0+cGRldiksIG5kZXYtPm5hbWUpOworCWVsc2UKKwkJbmV0aWZfc3RhcnRfcXVldWUobmRldik7Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBmaWZvY250OworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBTSU9DU0JBTkRXSURUSDoKKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJCXJldCA9IC1FUEVSTTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZGV2LT5sb2NrLCBmbGFncyk7CisJCQlpZGV2LT5uZXdfYmF1ZCA9IGlycS0+aWZyX2JhdWRyYXRlOworCQkJLyogd2hlbiBjYWxsZWQgZnJvbSB1c2VybGFuZCB0aGVyZSBtaWdodCBiZSBhIG1pbm9yIHJhY2Ugd2luZG93IGhlcmUKKwkJCSAqIGlmIHRoZSBzdGFjayB0cmllcyB0byBjaGFuZ2Ugc3BlZWQgY29uY3VycmVudGx5IC0gd2hpY2ggd291bGQgYmUKKwkJCSAqIHByZXR0eSBzdHJhbmdlIGFueXdheSB3aXRoIHRoZSB1c2VybGFuZCBoYXZpbmcgZnVsbCBjb250cm9sLi4uCisJCQkgKi8KKwkJCXZsc2lfc2V0X2JhdWQoaWRldiwgbmRldi0+YmFzZV9hZGRyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZXYtPmxvY2ssIGZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NTTUVESUFCVVNZOgorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQkJcmV0ID0gLUVQRVJNOworCQkJCWJyZWFrOworCQkJfQorCQkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3kobmRldiwgVFJVRSk7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DR1JFQ0VJVklORzoKKwkJCS8qIHRoZSBiZXN0IHdlIGNhbiBkbzogY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IGJ5dGVzIGluIHJ4IGZpZm8uCisJCQkgKiBUaGUgdHJ1c3RhYmxlIHdpbmRvdyAoaW4gY2FzZSBzb21lIGRhdGEgYXJyaXZlcyBqdXN0IGFmdGVyd2FyZHMpCisJCQkgKiBtYXkgYmUgYXMgc2hvcnQgYXMgMXVzZWMgb3Igc28gYXQgNE1icHMuCisJCQkgKi8KKwkJCWZpZm9jbnQgPSBpbncobmRldi0+YmFzZV9hZGRyK1ZMU0lfUElPX1JDVkJDTlQpICYgUkNWQkNOVF9NQVNLOworCQkJaXJxLT5pZnJfcmVjZWl2aW5nID0gKGZpZm9jbnQhPTApID8gMSA6IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUlSREFfV0FSTklORygiJXM6IG5vdHN1cHAgLSBjbWQ9JTA0eFxuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXywgY21kKTsKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCX0JCisJCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgdmxzaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9pbnN0YW5jZTsKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCXVuc2lnbmVkCWlvYmFzZTsKKwl1OAkJaXJpbnRyOworCWludCAJCWJvZ3VzY291bnQgPSA1OworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50CQloYW5kbGVkID0gMDsKKworCWlvYmFzZSA9IG5kZXYtPmJhc2VfYWRkcjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRldi0+bG9jayxmbGFncyk7CisJZG8geworCQlpcmludHIgPSBpbmIoaW9iYXNlK1ZMU0lfUElPX0lSSU5UUik7CisJCW1iKCk7CisJCW91dGIoaXJpbnRyLCBpb2Jhc2UrVkxTSV9QSU9fSVJJTlRSKTsJLyogYWNrbm93bGVkZ2UgYXNhcCAqLworCisJCWlmICghKGlyaW50ciY9SVJJTlRSX0lOVF9NQVNLKSkJCS8qIG5vdCBvdXIgSU5UIC0gcHJvYmFibHkgc2hhcmVkICovCisJCQlicmVhazsKKworCQloYW5kbGVkID0gMTsKKworCQlpZiAodW5saWtlbHkoIShpcmludHIgJiB+SVJJTlRSX0FDVElWSVRZKSkpCisJCQlicmVhazsJCQkJLyogbm90aGluZyB0b2RvIGlmIG9ubHkgYWN0aXZpdHkgKi8KKworCQlpZiAoaXJpbnRyJklSSU5UUl9SUEtUSU5UKQorCQkJdmxzaV9yeF9pbnRlcnJ1cHQobmRldik7CisKKwkJaWYgKGlyaW50ciZJUklOVFJfVFBLVElOVCkKKwkJCXZsc2lfdHhfaW50ZXJydXB0KG5kZXYpOworCisJfSB3aGlsZSAoLS1ib2d1c2NvdW50ID4gMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRldi0+bG9jayxmbGFncyk7CisKKwlpZiAoYm9ndXNjb3VudCA8PSAwKQorCQlJUkRBX01FU1NBR0UoIiVzOiB0b28gbXVjaCB3b3JrIGluIGludGVycnVwdCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCB2bHNpX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmRldi0+cHJpdjsKKwlpbnQJZXJyID0gLUVBR0FJTjsKKwljaGFyCWh3bmFtZVszMl07CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhpZGV2LT5wZGV2LCBkcml2ZXJuYW1lKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBpbyByZXNvdXJjZSBidXN5XG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGVycm91dDsKKwl9CisJbmRldi0+YmFzZV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KGlkZXYtPnBkZXYsMCk7CisJbmRldi0+aXJxID0gaWRldi0+cGRldi0+aXJxOworCisJLyogdW5kZXIgc29tZSByYXJlIG9jY2FzaW9ucyB0aGUgY2hpcCBhcHBhcmVudGx5IGNvbWVzIHVwIHdpdGgKKwkgKiBJUlEncyBwZW5kaW5nLiBXZSBiZXR0ZXIgdy9jIHBlbmRpbmcgSVJRIGFuZCBkaXNhYmxlIHRoZW0gYWxsCisJICovCisKKwlvdXRiKElSSU5UUl9JTlRfTUFTSywgbmRldi0+YmFzZV9hZGRyK1ZMU0lfUElPX0lSSU5UUik7CisKKwlpZiAocmVxdWVzdF9pcnEobmRldi0+aXJxLCB2bHNpX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQlkcml2ZXJuYW1lLCBuZGV2KSkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBjb3VsZG4ndCBnZXQgSVJROiAlZFxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBuZGV2LT5pcnEpOworCQlnb3RvIGVycm91dF9pbzsKKwl9CisKKwlpZiAoKGVyciA9IHZsc2lfY3JlYXRlX2h3aWYoaWRldikpICE9IDApCisJCWdvdG8gZXJyb3V0X2lycTsKKworCXNwcmludGYoaHduYW1lLCAiVkxTSS1GSVIgQCAweCUwNHgiLCAodW5zaWduZWQpbmRldi0+YmFzZV9hZGRyKTsKKwlpZGV2LT5pcmxhcCA9IGlybGFwX29wZW4obmRldiwmaWRldi0+cW9zLGh3bmFtZSk7CisJaWYgKCFpZGV2LT5pcmxhcCkKKwkJZ290byBlcnJvdXRfZnJlZV9yaW5nOworCisJZG9fZ2V0dGltZW9mZGF5KCZpZGV2LT5sYXN0X3J4KTsgIC8qIGZpcnN0IG10dCBtYXkgc3RhcnQgZnJvbSBub3cgb24gKi8KKworCWlkZXYtPm5ld19iYXVkID0gOTYwMDsJCS8qIHN0YXJ0IHdpdGggSXJQSFkgdXNpbmcgOTYwMChTSVIpIG1vZGUgKi8KKworCWlmICgoZXJyID0gdmxzaV9zdGFydF9odyhpZGV2KSkgIT0gMCkKKwkJZ290byBlcnJvdXRfY2xvc2VfaXJsYXA7CisKKwluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKKworCUlSREFfTUVTU0FHRSgiJXM6IGRldmljZSAlcyBvcGVyYXRpb25hbFxuIiwgX19GVU5DVElPTl9fLCBuZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworCitlcnJvdXRfY2xvc2VfaXJsYXA6CisJaXJsYXBfY2xvc2UoaWRldi0+aXJsYXApOworZXJyb3V0X2ZyZWVfcmluZzoKKwl2bHNpX2Rlc3Ryb3lfaHdpZihpZGV2KTsKK2Vycm91dF9pcnE6CisJZnJlZV9pcnEobmRldi0+aXJxLG5kZXYpOworZXJyb3V0X2lvOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMoaWRldi0+cGRldik7CitlcnJvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2bHNpX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5kZXYtPnByaXY7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJaWYgKGlkZXYtPmlybGFwKQorCQlpcmxhcF9jbG9zZShpZGV2LT5pcmxhcCk7CisJaWRldi0+aXJsYXAgPSBOVUxMOworCisJdmxzaV9zdG9wX2h3KGlkZXYpOworCisJdmxzaV9kZXN0cm95X2h3aWYoaWRldik7CisKKwlmcmVlX2lycShuZGV2LT5pcnEsbmRldik7CisKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGlkZXYtPnBkZXYpOworCisJSVJEQV9NRVNTQUdFKCIlczogZGV2aWNlICVzIHN0b3BwZWRcbiIsIF9fRlVOQ1RJT05fXywgbmRldi0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bHNpX2lyZGFfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaWRldi0+cGRldjsKKworCVNFVF9NT0RVTEVfT1dORVIobmRldik7CisKKwluZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJbmRldi0+YmFzZV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsMCk7CisKKwkvKiBQQ0kgYnVzbWFzdGVyaW5nCisJICogc2VlIGluY2x1ZGUgZmlsZSBmb3IgZGV0YWlscyB3aHkgd2UgbmVlZCB0aGVzZSAyIG1hc2tzLCBpbiB0aGlzIG9yZGVyIQorCSAqLworCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldixETUFfTUFTS19VU0VEX0JZX0hXKQorCSAgICB8fCBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsRE1BX01BU0tfTVNUUlBBR0UpKSB7CisJCUlSREFfRVJST1IoIiVzOiBhYm9ydGluZyBkdWUgdG8gUENJIEJNLURNQSBhZGRyZXNzIGxpbWl0YXRpb25zXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmaWRldi0+cW9zKTsKKworCS8qIHRoZSBWTFNJODJDMTQ3IGRvZXMgbm90IHN1cHBvcnQgNTc2MDAwISAqLworCisJaWRldi0+cW9zLmJhdWRfcmF0ZS5iaXRzID0gSVJfMjQwMCB8IElSXzk2MDAKKwkJfCBJUl8xOTIwMCB8IElSXzM4NDAwIHwgSVJfNTc2MDAgfCBJUl8xMTUyMDAKKwkJfCBJUl8xMTUyMDAwIHwgKElSXzQwMDAwMDAgPDwgOCk7CisKKwlpZGV2LT5xb3MubWluX3R1cm5fdGltZS5iaXRzID0gcW9zX210dF9iaXRzOworCisJaXJkYV9xb3NfYml0c190b192YWx1ZSgmaWRldi0+cW9zKTsKKworCS8qIGN1cnJlbnRseSBubyBwdWJsaWMgbWVkaWEgZGVmaW5pdGlvbnMgZm9yIElyREEgKi8KKworCW5kZXYtPmZsYWdzIHw9IElGRl9QT1JUU0VMIHwgSUZGX0FVVE9NRURJQTsKKwluZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF9VTktOT1dOOworIAorCW5kZXYtPm9wZW4JICAgICAgPSB2bHNpX29wZW47CisJbmRldi0+c3RvcAkgICAgICA9IHZsc2lfY2xvc2U7CisJbmRldi0+Z2V0X3N0YXRzCSAgICAgID0gdmxzaV9nZXRfc3RhdHM7CisJbmRldi0+aGFyZF9zdGFydF94bWl0ID0gdmxzaV9oYXJkX3N0YXJ0X3htaXQ7CisJbmRldi0+ZG9faW9jdGwJICAgICAgPSB2bHNpX2lvY3RsOworCW5kZXYtPnR4X3RpbWVvdXQgICAgICA9IHZsc2lfdHhfdGltZW91dDsKKwluZGV2LT53YXRjaGRvZ190aW1lbyAgPSA1MDAqSFovMTAwMDsJLyogbWF4LiBhbGxvd2VkIHR1cm4gdGltZSBmb3IgSXJMQVAgKi8KKworCVNFVF9ORVRERVZfREVWKG5kZXYsICZwZGV2LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0Cit2bHNpX2lyZGFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkqbmRldjsKKwl2bHNpX2lyZGFfZGV2X3QJCSppZGV2OworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlnb3RvIG91dDsKKwllbHNlCisJCXBkZXYtPmN1cnJlbnRfc3RhdGUgPSAwOyAvKiBodyBtdXN0IGJlIHJ1bm5pbmcgbm93ICovCisKKwlJUkRBX01FU1NBR0UoIiVzOiBJckRBIFBDSSBjb250cm9sbGVyICVzIGRldGVjdGVkXG4iLAorCQkgICAgIGRyaXZlcm5hbWUsIFBDSURFVl9OQU1FKHBkZXYpKTsKKworCWlmICggIXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDApCisJICAgICB8fCAhKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LDApICYgSU9SRVNPVVJDRV9JTykgKSB7CisJCUlSREFfRVJST1IoIiVzOiBiYXIgMCBpbnZhbGlkIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXRfZGlzYWJsZTsKKwl9CisKKwluZGV2ID0gYWxsb2NfaXJkYWRldihzaXplb2YoKmlkZXYpKTsKKwlpZiAobmRldj09TlVMTCkgeworCQlJUkRBX0VSUk9SKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBtZW1vcnkuXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXRfZGlzYWJsZTsKKwl9CisKKwlpZGV2ID0gbmRldi0+cHJpdjsKKworCXNwaW5fbG9ja19pbml0KCZpZGV2LT5sb2NrKTsKKwlpbml0X01VVEVYKCZpZGV2LT5zZW0pOworCWRvd24oJmlkZXYtPnNlbSk7CisJaWRldi0+cGRldiA9IHBkZXY7CisKKwlpZiAodmxzaV9pcmRhX2luaXQobmRldikgPCAwKQorCQlnb3RvIG91dF9mcmVlZGV2OworCisJaWYgKHJlZ2lzdGVyX25ldGRldihuZGV2KSA8IDApIHsKKwkJSVJEQV9FUlJPUigiJXM6IHJlZ2lzdGVyX25ldGRldiBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0X2ZyZWVkZXY7CisJfQorCisJaWYgKHZsc2lfcHJvY19yb290ICE9IE5VTEwpIHsKKwkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisKKwkJZW50ID0gY3JlYXRlX3Byb2NfZW50cnkobmRldi0+bmFtZSwgU19JRlJFR3xTX0lSVUdPLCB2bHNpX3Byb2Nfcm9vdCk7CisJCWlmICghZW50KSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzOiBmYWlsZWQgdG8gY3JlYXRlIHByb2MgZW50cnlcbiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQl9IGVsc2UgeworCQkJZW50LT5kYXRhID0gbmRldjsKKwkJCWVudC0+cHJvY19mb3BzID0gVkxTSV9QUk9DX0ZPUFM7CisJCQllbnQtPnNpemUgPSAwOworCQl9CisJCWlkZXYtPnByb2NfZW50cnkgPSBlbnQ7CisJfQorCUlSREFfTUVTU0FHRSgiJXM6IHJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLCBkcml2ZXJuYW1lLCBuZGV2LT5uYW1lKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBuZGV2KTsKKwl1cCgmaWRldi0+c2VtKTsKKworCXJldHVybiAwOworCitvdXRfZnJlZWRldjoKKwl1cCgmaWRldi0+c2VtKTsKKwlmcmVlX25ldGRldihuZGV2KTsKK291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK291dDoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2bHNpX2lyZGFfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXZsc2lfaXJkYV9kZXZfdCAqaWRldjsKKworCWlmICghbmRldikgeworCQlJUkRBX0VSUk9SKCIlczogbG9zdCBuZXRkZXZpY2U/XG4iLCBkcml2ZXJuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCisJaWRldiA9IG5kZXYtPnByaXY7CisJZG93bigmaWRldi0+c2VtKTsKKwlpZiAoaWRldi0+cHJvY19lbnRyeSkgeworCQlyZW1vdmVfcHJvY19lbnRyeShuZGV2LT5uYW1lLCB2bHNpX3Byb2Nfcm9vdCk7CisJCWlkZXYtPnByb2NfZW50cnkgPSBOVUxMOworCX0KKwl1cCgmaWRldi0+c2VtKTsKKworCWZyZWVfbmV0ZGV2KG5kZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJSVJEQV9NRVNTQUdFKCIlczogJXMgcmVtb3ZlZFxuIiwgZHJpdmVybmFtZSwgUENJREVWX05BTUUocGRldikpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKKy8qIFRoZSBDb250cm9sbGVyIGRvZXNuJ3QgcHJvdmlkZSBQQ0kgUE0gY2FwYWJpbGl0aWVzIGFzIGRlZmluZWQgYnkgUENJIHNwZWNzLgorICogU29tZSBvZiB0aGUgTGludXggUENJLVBNIGNvZGUgaG93ZXZlciBkZXBlbmRzIG9uIHRoaXMsIGZvciBleGFtcGxlIGluCisgKiBwY2lfc2V0X3Bvd2VyX3N0YXRlKCkuIFNvIHdlIGhhdmUgdG8gdGFrZSBjYXJlIHRvIHBlcmZvcm0gdGhlIHJlcXVpcmVkCisgKiBvcGVyYXRpb25zIG9uIG91ciBvd24gKHBhcnRpY3VsYXJseSByZWZsZWN0aW5nIHRoZSBwZGV2LT5jdXJyZW50X3N0YXRlKQorICogb3RoZXJ3aXNlIHdlIG1pZ2h0IGdldCBjaGVhdGVkIGJ5IHBjaS1wbS4KKyAqLworCisKK3N0YXRpYyBpbnQgdmxzaV9pcmRhX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXY7CisKKwlpZiAoc3RhdGUgPCAxIHx8IHN0YXRlID4gMyApIHsKKwkJSVJEQV9FUlJPUigiJXMgLSAlczogaW52YWxpZCBwbSBzdGF0ZSByZXF1ZXN0OiAldVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgUENJREVWX05BTUUocGRldiksIHN0YXRlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghbmRldikgeworCQlJUkRBX0VSUk9SKCIlcyAtICVzOiBubyBuZXRkZXZpY2UgXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBQQ0lERVZfTkFNRShwZGV2KSk7CisJCXJldHVybiAwOworCX0KKwlpZGV2ID0gbmRldi0+cHJpdjsJCisJZG93bigmaWRldi0+c2VtKTsKKwlpZiAocGRldi0+Y3VycmVudF9zdGF0ZSAhPSAwKSB7CQkJLyogYWxyZWFkeSBzdXNwZW5kZWQgKi8KKwkJaWYgKHN0YXRlID4gcGRldi0+Y3VycmVudF9zdGF0ZSkgewkvKiBzaW1wbHkgZ28gZGVlcGVyICovCisJCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsc3RhdGUpOworCQkJcGRldi0+Y3VycmVudF9zdGF0ZSA9IHN0YXRlOworCQl9CisJCWVsc2UKKwkJCUlSREFfRVJST1IoIiVzIC0gJXM6IGludmFsaWQgc3VzcGVuZCByZXF1ZXN0ICV1IC0+ICV1XG4iLCBfX0ZVTkNUSU9OX18sIFBDSURFVl9OQU1FKHBkZXYpLCBwZGV2LT5jdXJyZW50X3N0YXRlLCBzdGF0ZSk7CisJCXVwKCZpZGV2LT5zZW0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkgeworCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5kZXYpOworCQl2bHNpX3N0b3BfaHcoaWRldik7CisJCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCQlpZiAoIWlkZXYtPm5ld19iYXVkKQorCQkJLyogcmVtZW1iZXIgc3BlZWQgc2V0dGluZ3MgdG8gcmVzdG9yZSBvbiByZXN1bWUgKi8KKwkJCWlkZXYtPm5ld19iYXVkID0gaWRldi0+YmF1ZDsKKwl9CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsc3RhdGUpOworCXBkZXYtPmN1cnJlbnRfc3RhdGUgPSBzdGF0ZTsKKwlpZGV2LT5yZXN1bWVfb2sgPSAxOworCXVwKCZpZGV2LT5zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZsc2lfaXJkYV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdmxzaV9pcmRhX2Rldl90CSppZGV2OworCisJaWYgKCFuZGV2KSB7CisJCUlSREFfRVJST1IoIiVzIC0gJXM6IG5vIG5ldGRldmljZSBcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIFBDSURFVl9OQU1FKHBkZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlkZXYgPSBuZGV2LT5wcml2OwkKKwlkb3duKCZpZGV2LT5zZW0pOworCWlmIChwZGV2LT5jdXJyZW50X3N0YXRlID09IDApIHsKKwkJdXAoJmlkZXYtPnNlbSk7CisJCUlSREFfV0FSTklORygiJXMgLSAlczogYWxyZWFkeSByZXN1bWVkXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIFBDSURFVl9OQU1FKHBkZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7CisJcGRldi0+Y3VycmVudF9zdGF0ZSA9IDA7CisKKwlpZiAoIWlkZXYtPnJlc3VtZV9vaykgeworCQkvKiBzaG91bGQgYmUgb2Jzb2xldGUgbm93IC0gYnV0IHVzZWQgdG8gaGFwcGVuIGR1ZSB0bzoKKwkJICogLSBwY2kgbGF5ZXIgaW5pdGlhbGx5IHNldHRpbmcgcGRldi0+Y3VycmVudF9zdGF0ZSA9IDQgKHVua25vd24pCisJCSAqIC0gcGNpIGxheWVyIGRpZCBub3Qgd2FsayB0aGUgc2F2ZV9zdGF0ZS10cmVlIChtaWdodCBiZSBBUE0gcHJvYmxlbSkKKwkJICogICBzbyB3ZSBjb3VsZCBub3QgcmVmdXNlIHRvIHN1c3BlbmQgZnJvbSB1bmRlZmluZWQgc3RhdGUKKwkJICogLSB2bHNpX2lyZGFfc3VzcGVuZCBkZXRlY3RlZCBpbnZhbGlkIHN0YXRlIGFuZCByZWZ1c2VkIHRvIHNhdmUKKwkJICogICBjb25maWd1cmF0aW9uIGZvciByZXN1bWUgLSBidXQgd2FzIHRvbyBsYXRlIHRvIHN0b3Agc3VzcGVuZGluZworCQkgKiAtIHZsc2lfaXJkYV9yZXN1bWUgZ290IHNjcmV3ZWQgd2hlbiB0cnlpbmcgdG8gcmVzdW1lIGZyb20gZ2FyYmFnZQorCQkgKgorCQkgKiBub3cgd2UgZXhwbGljaXRseSBzZXQgcGRldi0+Y3VycmVudF9zdGF0ZSA9IDAgYWZ0ZXIgZW5hYmxpbmcgdGhlCisJCSAqIGRldmljZSBhbmQgaW5kZXBlbmRlbnRseSByZXN1bWVfb2sgc2hvdWxkIGNhdGNoIGFueSBnYXJiYWdlIGNvbmZpZy4KKwkJICovCisJCUlSREFfV0FSTklORygiJXMgLSBobSwgbm90aGluZyB0byByZXN1bWU/XG4iLCBfX0ZVTkNUSU9OX18pOworCQl1cCgmaWRldi0+c2VtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG5ldGlmX3J1bm5pbmcobmRldikpIHsKKwkJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJCXZsc2lfc3RhcnRfaHcoaWRldik7CisJCW5ldGlmX2RldmljZV9hdHRhY2gobmRldik7CisJfQorCWlkZXYtPnJlc3VtZV9vayA9IDA7CisJdXAoJmlkZXYtPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZsc2lfaXJkYV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gZHJpdmVybmFtZSwKKwkuaWRfdGFibGUJPSB2bHNpX2lyZGFfdGFibGUsCisJLnByb2JlCQk9IHZsc2lfaXJkYV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHZsc2lfaXJkYV9yZW1vdmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gdmxzaV9pcmRhX3N1c3BlbmQsCisJLnJlc3VtZQkJPSB2bHNpX2lyZGFfcmVzdW1lLAorI2VuZGlmCit9OworCisjZGVmaW5lIFBST0NfRElSICgiZHJpdmVyLyIgRFJJVkVSX05BTUUpCisKK3N0YXRpYyBpbnQgX19pbml0IHZsc2lfbW9kX2luaXQodm9pZCkKK3sKKwlpbnQJaSwgcmV0OworCisJaWYgKGNsa3NyYyA8IDAgIHx8ICBjbGtzcmMgPiAzKSB7CisJCUlSREFfRVJST1IoIiVzOiBpbnZhbGlkIGNsa3NyYz0lZFxuIiwgZHJpdmVybmFtZSwgY2xrc3JjKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJc3dpdGNoKHJpbmdzaXplW2ldKSB7CisJCQljYXNlIDQ6CisJCQljYXNlIDg6CisJCQljYXNlIDE2OgorCQkJY2FzZSAzMjoKKwkJCWNhc2UgNjQ6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUlSREFfV0FSTklORygiJXM6IGludmFsaWQgJXMgcmluZ3NpemUgJWQsIHVzaW5nIGRlZmF1bHQ9OCIsIGRyaXZlcm5hbWUsIChpKT8icngiOiJ0eCIsIHJpbmdzaXplW2ldKTsKKwkJCQlyaW5nc2l6ZVtpXSA9IDg7CisJCQkJYnJlYWs7CisJCX0KKwl9IAorCisJc2lycHVsc2UgPSAhIXNpcnB1bHNlOworCisJLyogY3JlYXRlX3Byb2NfZW50cnkgcmV0dXJucyBOVUxMIGlmICFDT05GSUdfUFJPQ19GUy4KKwkgKiBGYWlsdXJlIHRvIGNyZWF0ZSB0aGUgcHJvY2ZzIGVudHJ5IGlzIGhhbmRsZWQgbGlrZSBydW5uaW5nCisJICogd2l0aG91dCBwcm9jZnMgLSBpdCdzIG5vdCByZXF1aXJlZCBmb3IgdGhlIGRyaXZlciB0byB3b3JrLgorCSAqLworCXZsc2lfcHJvY19yb290ID0gY3JlYXRlX3Byb2NfZW50cnkoUFJPQ19ESVIsIFNfSUZESVIsIE5VTEwpOworCWlmICh2bHNpX3Byb2Nfcm9vdCkgeworCQkvKiBwcm90ZWN0IHJlZ2lzdGVyZWQgcHJvY2RpciBhZ2FpbnN0IG1vZHVsZSByZW1vdmFsLgorCQkgKiBCZWNhdXNlIHdlIGFyZSBpbiB0aGUgbW9kdWxlIGluaXQgcGF0aCB0aGVyZSdzIG5vIHJhY2UKKwkJICogd2luZG93IGFmdGVyIGNyZWF0ZV9wcm9jX2VudHJ5IChhbmQgbm8gYmFycmllciBuZWVkZWQpLgorCQkgKi8KKwkJdmxzaV9wcm9jX3Jvb3QtPm93bmVyID0gVEhJU19NT0RVTEU7CisJfQorCisJcmV0ID0gcGNpX21vZHVsZV9pbml0KCZ2bHNpX2lyZGFfZHJpdmVyKTsKKworCWlmIChyZXQgJiYgdmxzaV9wcm9jX3Jvb3QpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRElSLCBOVUxMKTsKKwlyZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2bHNpX21vZF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ2bHNpX2lyZGFfZHJpdmVyKTsKKwlpZiAodmxzaV9wcm9jX3Jvb3QpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRElSLCBOVUxMKTsKK30KKworbW9kdWxlX2luaXQodmxzaV9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdCh2bHNpX21vZF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oIGIvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0Njk0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCkBAIC0wLDAgKzEsNzk4IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgl2bHNpX2lyLmg6CVZMU0k4MkMxNDcgUENJIElyREEgY29udHJvbGxlciBkcml2ZXIgZm9yIExpbnV4CisgKgorICoJVmVyc2lvbjoJMC41CisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgTWFydGluIERpZWhsCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKgl0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICoJTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSVJEQV9WTFNJX0ZJUl9ICisjZGVmaW5lIElSREFfVkxTSV9GSVJfSAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBjb21wYXRpYmlsaXR5IHN0dWZmCisgKi8KKworLyogZGVmaW5pdGlvbnMgbm90IHByZXNlbnQgaW4gcGNpX2lkcy5oICovCisKKyNpZm5kZWYgUENJX0NMQVNTX1dJUkVMRVNTX0lSREEKKyNkZWZpbmUgUENJX0NMQVNTX1dJUkVMRVNTX0lSREEJCTB4MGQwMAorI2VuZGlmCisKKyNpZm5kZWYgUENJX0NMQVNTX1NVQkNMQVNTX01BU0sKKyNkZWZpbmUgUENJX0NMQVNTX1NVQkNMQVNTX01BU0sJCTB4ZmZmZgorI2VuZGlmCisKKy8qIGluIHJlY2VudCAyLjUgaW50ZXJydXB0IGhhbmRsZXJzIGhhdmUgbm9uLXZvaWQgcmV0dXJuIHZhbHVlICovCisjaWZuZGVmIElSUV9SRVRWQUwKK3R5cGVkZWYgdm9pZCBpcnFyZXR1cm5fdDsKKyNkZWZpbmUgSVJRX05PTkUKKyNkZWZpbmUgSVJRX0hBTkRMRUQKKyNkZWZpbmUgSVJRX1JFVFZBTCh4KQorI2VuZGlmCisKKy8qIHNvbWUgc3R1ZmYgbmVlZCB0byBjaGVjayBrZXJuZWx2ZXJzaW9uLiBOb3QgYWxsIDIuNSBzdHVmZiB3YXMgcHJlc2VudAorICogaW4gZWFybHkgMi41LnggLSB0aGUgdGVzdCBpcyBtZXJlbHkgdG8gc2VwYXJhdGUgMi40IGZyb20gMi41CisgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKworLyogUERFKCkgaW50cm9kdWNlZCBpbiAyLjUuNCAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjZGVmaW5lIFBERShpbm9kZSkgKChpbm9kZSktPnUuZ2VuZXJpY19pcCkKKyNlbmRpZgorCisvKiBpcmRhIGNyYzE2IGNhbGN1bGF0aW9uIGV4cG9ydGVkIGluIDIuNS40MiAqLworI2RlZmluZSBpcmRhX2NhbGNfY3JjMTYoZmNzLGJ1ZixsZW4pCShHT09EX0ZDUykKKworLyogd2UgdXNlIHRoaXMgZm9yIHVuaWZpZWQgcGNpIGRldmljZSBuYW1lIGFjY2VzcyAqLworI2RlZmluZSBQQ0lERVZfTkFNRShwZGV2KQkoKHBkZXYpLT5uYW1lKQorCisjZWxzZSAvKiAyLjUgb3IgbGF0ZXIgKi8KKworLyogcmVjZW50IDIuNS8yLjYgc3RvcmVzIHBjaSBkZXZpY2UgbmFtZXMgYXQgdmFyeWluZyBwbGFjZXMgOy0pICovCisjaWZkZWYgQ09ORklHX1BDSV9OQU1FUworLyogaHVtYW4gcmVhZGFibGUgbmFtZSAqLworI2RlZmluZSBQQ0lERVZfTkFNRShwZGV2KQkoKHBkZXYpLT5wcmV0dHlfbmFtZSkKKyNlbHNlCisvKiB3aGF0ZXZlciB3ZSBnZXQgZnJvbSB0aGUgYXNzb2NpYXRlZCBzdHJ1Y3QgZGV2aWNlIC0gYnVzOnNsb3Q6ZGV2LmZuIGlkICovCisjZGVmaW5lIFBDSURFVl9OQU1FKHBkZXYpCShwY2lfbmFtZShwZGV2KSkKKyNlbmRpZgorCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBub24tc3RhbmRhcmQgUENJIHJlZ2lzdGVycyAqLworCitlbnVtIHZsc2lfcGNpX3JlZ3MgeworCVZMU0lfUENJX0NMS0NUTAkJPSAweDQwLAkJLyogY2hpcCBjbG9jayBpbnB1dCBjb250cm9sICovCisJVkxTSV9QQ0lfTVNUUlBBR0UJPSAweDQxLAkJLyogYWRkciBbMzE6MjRdIGZvciBhbGwgYnVzbWFzdGVyIGN5Y2xlcyAqLworCVZMU0lfUENJX0lSTUlTQwkJPSAweDQyCQkvKiBtYWlubHkgbGVnYWN5IFVBUlQgcmVsYXRlZCAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFZMU0lfUENJX0NMS0NUTDogQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAodTgsIHJ3KSAqLworCisvKiBUaHJlZSBwb3NzaWJsZSBjbG9jayBzb3VyY2VzOiBlaXRoZXIgb24tY2hpcCA0OE1IeiBQTEwgb3IKKyAqIGV4dGVybmFsIGNsb2NrIGFwcGxpZWQgdG8gRVhUQ0xLIHBpbi4gRXh0ZXJuYWwgY2xvY2sgbWF5CisgKiBiZSBlaXRoZXIgNDhNSHogb3IgNDBNSHosIHdoaWNoIGlzIGluZGljYXRlZCBieSBYQ0tTRUwuCisgKiBDTEtTVFAgY29udHJvbHMgd2hldGhlciB0aGUgc2VsZWN0ZWQgY2xvY2sgc291cmNlIGdldHMKKyAqIGNvbm5lY3RlZCB0byB0aGUgSXJEQSBibG9jay4KKyAqCisgKiBPbiBteSBIUCBPQi04MDAgdGhlIEJJT1Mgc2V0cyBleHRlcm5hbCA0ME1IeiBjbG9jayBhcyBzb3VyY2UKKyAqIHdoZW4gSXJEQSBlbmFibGVkIGFuZCBJJ3ZlIG5ldmVyIGRldGVjdGVkIGFueSBQTEwgbG9jayBzdWNjZXNzLgorICogQXBwYXJlbnRseSB0aGUgMTQuMy4uLk1IeiBPU0MgaW5wdXQgcmVxdWlyZWQgZm9yIHRoZSBQTEwgdG8gd29yaworICogaXMgbm90IGNvbm5lY3RlZCBhbmQgdGhlIDQwTUh6IEVYVENMSyBpcyBwcm92aWRlZCBleHRlcm5hbGx5LgorICogQXQgbGVhc3QgdGhpcyBpcyB3aGF0IG1ha2VzIHRoZSBkcml2ZXIgd29ya2luZyBmb3IgbWUuCisgKi8KKworZW51bSB2bHNpX3BjaV9jbGtjdGwgeworCisJLyogUExMIGNvbnRyb2wgKi8KKworCUNMS0NUTF9QRF9JTlYJCT0gMHgwNCwJCS8qIFBEIzogaW52ZXJ0ZWQgcG93ZXIgZG93biBzaWduYWwsCisJCQkJCQkgKiBpLmUuIFBMTCBpcyBwb3dlcmVkLCBpZiBQRF9JTlYgc2V0ICovCisJQ0xLQ1RMX0xPQ0sJCT0gMHg0MCwJCS8qIChybykgc2V0LCBpZiBQTEwgaXMgbG9ja2VkICovCisKKwkvKiBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisKKwlDTEtDVExfRVhUQ0xLCQk9IDB4MjAsCQkvKiBzZXQgdG8gc2VsZWN0IGV4dGVybmFsIGNsb2NrIGlucHV0LCBub3QgUExMICovCisJQ0xLQ1RMX1hDS1NFTAkJPSAweDEwLAkJLyogc2V0IHRvIGluZGljYXRlIEVYVENMSyBpcyA0ME1Ieiwgbm90IDQ4TUh6ICovCisKKwkvKiBJckRBIGJsb2NrIGNvbnRyb2wgKi8KKworCUNMS0NUTF9DTEtTVFAJCT0gMHg4MCwJCS8qIHNldCB0byBkaXNjb25uZWN0IGZyb20gc2VsZWN0ZWQgY2xvY2sgc291cmNlICovCisJQ0xLQ1RMX1dBS0UJCT0gMHgwOAkJLyogc2V0IHRvIGVuYWJsZSB3YWtldXAgZmVhdHVyZTogd2hlbmV2ZXIgSVIgYWN0aXZpdHkKKwkJCQkJCSAqIGlzIGRldGVjdGVkLCBQRF9JTlYgZ2V0cyBzZXQoPykgYW5kIENMS1NUUCBjbGVhcmVkICovCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVkxTSV9QQ0lfTVNUUlBBR0U6IE1hc3RlciBQYWdlIFJlZ2lzdGVyICh1OCwgcncpIGFuZCBidXNtYXN0ZXJpbmcgc3R1ZmYgKi8KKworI2RlZmluZSBETUFfTUFTS19VU0VEX0JZX0hXCTB4ZmZmZmZmZmYKKyNkZWZpbmUgRE1BX01BU0tfTVNUUlBBR0UJMHgwMGZmZmZmZgorI2RlZmluZSBNU1RSUEFHRV9WQUxVRQkJKERNQV9NQVNLX01TVFJQQUdFID4+IDI0KQorCisJLyogUENJIGJ1c21hc3RlcmluZyBpcyBzb21ld2hhdCBzcGVjaWFsIGZvciB0aGlzIGd1eSAtIGluIHNob3J0OgorCSAqCisJICogV2Ugc2VsZWN0IHRvIG9wZXJhdGUgdXNpbmcgZml4ZWQgTVNUUlBBR0U9MCwgdXNlIElTQSBETUEKKwkgKiBhZGRyZXNzIHJlc3RyaWN0aW9ucyB0byBtYWtlIHRoZSBQQ0kgQk0gYXBpIGF3YXJlIG9mIHRoaXMsCisJICogYnV0IGVuc3VyZSB0aGUgaGFyZHdhcmUgaXMgZGVhbGluZyB3aXRoIHJlYWwgMzJiaXQgYWNjZXNzLgorCSAqCisJICogSW4gZGV0YWlsOgorCSAqIFRoZSBjaGlwIGV4ZWN1dGVzIG5vcm1hbCAzMmJpdCBidXNtYXN0ZXIgY3ljbGVzLCBpLmUuCisJICogZHJpdmVzIGFsbCAzMiBhZGRyZXNzIGxpbmVzLiBUaGVzZSBhZGRyZXNzZXMgaG93ZXZlciBhcmUKKwkgKiBjb21wb3NlZCBvZiBbMDoyM10gdGFrZW4gZnJvbSB2YXJpb3VzIGJ1c2FkZHItcG9pbnRlcnMKKwkgKiBhbmQgWzI0OjMxXSB0YWtlbiBmcm9tIHRoZSBNU1RSUEFHRSByZWdpc3RlciBpbiB0aGUgVkxTSTgyQzE0NworCSAqIGNvbmZpZyBzcGFjZS4gVGhlcmVmb3JlIF9hbGxfIGJ1c21hc3RlcmluZyBtdXN0IGJlCisJICogdGFyZ2V0ZWQgdG8vZnJvbSBvbmUgc2luZ2xlIDE2TUIgKGJ1c2FkZHItKSBzdXBlcnBhZ2UhCisJICogVGhlIHBvaW50IGlzIHRvIG1ha2Ugc3VyZSBhbGwgdGhlIGFsbG9jYXRpb25zIGZvciBtZW1vcnkKKwkgKiBsb2NhdGlvbnMgd2l0aCBidXNtYXN0ZXIgYWNjZXNzIChyaW5nIGRlc2NyaXB0b3JzLCBidWZmZXJzKQorCSAqIGFyZSBpbmRlZWQgYnVzLW1hcHBhYmxlIHRvIHRoZSBzYW1lIDE2TUIgcmFuZ2UgKGZvciB4ODYgdGhpcworCSAqIG1lYW5zIHRoZXkgbXVzdCByZXNpZGUgaW4gdGhlIHNhbWUgMTZNQiBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcworCSAqIHJhbmdlKS4gVGhlIG9ubHkgY29uc3RyYWludCB3ZSBoYXZlIHdoaWNoIHN1cHBvcnRzICJzZXZlcmFsIG9iamVjdHMKKwkgKiBtYXBwYWJsZSB0byBjb21tb24gMTZNQiByYW5nZSIgcGFyYWRpZ21hLCBpcyB0aGUgb2xkIElTQSBETUEKKwkgKiByZXN0cmljdGlvbiB0byB0aGUgZmlyc3QgMTZNQiBvZiBwaHlzaWNhbCBhZGRyZXNzIHJhbmdlLgorCSAqIEhlbmNlIHRoZSBhcHByb2FjaCBoZXJlIGlzIHRvIGVuYWJsZSBQQ0kgYnVzbWFzdGVyIHN1cHBvcnQgdXNpbmcKKwkgKiB0aGUgY29ycmVjdCAzMmJpdCBkbWEtbWFzayB1c2VkIGJ5IHRoZSBjaGlwLiBBZnRlcndhcmRzIHRoZSBkZXZpY2UncworCSAqIGRtYS1tYXNrIGdldHMgcmVzdHJpY3RlZCB0byAyNGJpdCwgd2hpY2ggbXVzdCBiZSBob25vdXJlZCBzb21laG93IGJ5CisJICogYWxsIGFsbG9jYXRpb25zIGZvciBtZW1vcnkgYXJlYXMgdG8gYmUgZXhwb3NlZCB0byB0aGUgY2hpcCAuLi4KKwkgKgorCSAqIE5vdGU6CisJICogRG9uJ3QgYmUgc3VycHJpc2VkIHRvIGdldCAiU2V0dGluZyBsYXRlbmN5IHRpbWVyLi4uIiBtZXNzYWdlcyBldmVyeQorCSAqIHRpbWUgd2hlbiBQQ0kgYnVzbWFzdGVyaW5nIGlzIGVuYWJsZWQgZm9yIHRoZSBjaGlwLgorCSAqIFRoZSBjaGlwIGhhcyBpdHMgUENJIGxhdGVuY3kgdGltZXIgUk8gZml4ZWQgYXQgMCAtIHdoaWNoIGlzIG5vdCBhCisJICogcHJvYmxlbSBoZXJlLCBiZWNhdXNlIGl0IGlzIG5ldmVyIHJlcXVlc3RpbmcgX2J1cnN0XyB0cmFuc2FjdGlvbnMuCisJICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BDSUlSTUlTQzogSVIgTWlzY2VsbGFuZW91cyBSZWdpc3RlciAodTgsIHJ3KSAqLworCisvKiBsZWdhY3kgVUFSVCBlbXVsYXRpb24gLSBub3QgdXNlZCBieSB0aGlzIGRyaXZlciAtIHdvdWxkIHJlcXVpcmU6CisgKiAoc2VlIGJlbG93IGZvciBzb21lIHJlZ2lzdGVyLXZhbHVlIGRlZmluaXRpb25zKQorICoKKyAqCS0gSVJNSVNDX1VBUlRFTiBtdXN0IGJlIHNldCB0byBlbmFibGUgVUFSVCBhZGRyZXNzIGRlY29kaW5nCisgKgktIElSTUlTQ19VQVJUU0VMIGNvbmZpZ3VyZWQKKyAqCS0gSVJDRkdfTUFTVEVSIG11c3QgYmUgY2xlYXJlZAorICoJLSBJUkNGR19TSVIgbXVzdCBiZSBzZXQKKyAqCS0gSVJFTkFCTEVfUEhZQU5EQ0xPQ0sgbXVzdCBiZSBhc3NlcnRlZCAwLT4xIChhbmQgaGVuY2UgSVJFTkFCTEVfU0lSX09OKQorICovCisKK2VudW0gdmxzaV9wY2lfaXJtaXNjIHsKKworCS8qIElSIHRyYW5zY2VpdmVyIGNvbnRyb2wgKi8KKworCUlSTUlTQ19JUlJBSUwJCT0gMHg0MCwJCS8qIChybz8pIElSIHJhaWwgcG93ZXIgaW5kaWNhdGlvbiAoYW5kIGNvbnRyb2w/KQorCQkJCQkJICogMD0zLjNWIC8gMT01Vi4gUHJvYmFibHkgc2V0IGR1cmluZyBwb3dlci1vbj8KKwkJCQkJCSAqIHVuY2xlYXIgLSBub3QgdG91Y2hlZCBieSBkcml2ZXIgKi8KKwlJUk1JU0NfSVJQRAkJPSAweDA4LAkJLyogdHJhbnNjZWl2ZXIgcG93ZXIgZG93biwgaWYgc2V0ICovCisKKwkvKiBsZWdhY3kgVUFSVCBjb250cm9sICovCisKKwlJUk1JU0NfVUFSVFRTVAkJPSAweDgwLAkJLyogVUFSVCB0ZXN0IG1vZGUgLSAiYWx3YXlzIHdyaXRlIDAiICovCisJSVJNSVNDX1VBUlRFTgkJPSAweDA0LAkJLyogZW5hYmxlIFVBUlQgYWRkcmVzcyBkZWNvZGluZyAqLworCisJLyogYml0cyBbMTowXSBJUk1JU0NfVUFSVFNFTCB0byBzZWxlY3QgbGVnYWN5IFVBUlQgYWRkcmVzcyAqLworCisJSVJNSVNDX1VBUlRTRUxfM2Y4CT0gMHgwMCwKKwlJUk1JU0NfVUFSVFNFTF8yZjgJPSAweDAxLAorCUlSTUlTQ19VQVJUU0VMXzNlOAk9IDB4MDIsCisJSVJNSVNDX1VBUlRTRUxfMmU4CT0gMHgwMworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiByZWdpc3RlcnMgbWFwcGVkIHRvIDMyIGJ5dGUgUENJIElPIHNwYWNlICovCisKKy8qIG5vdGU6IGJldHRlciBhY2Nlc3MgYWxsIHJlZ2lzdGVycyBhdCB0aGUgaW5kaWNhdGVkIHU4L3UxNiBzaXplCisgKgkgYWx0aG91Z2ggc29tZSBvZiB0aGVtIGNvbnRhaW4gb25seSAxIGJ5dGUgb2YgaW5mb3JtYXRpb24uCisgKgkgc29tZSBvZiB0aGVtIChwYXJ0aWNhbHVhcmx5IFBST01QVCBhbmQgSVJDRkcpIGlnbm9yZQorICoJIGFjY2VzcyB3aGVuIHVzaW5nIHRoZSB3cm9uZyBhZGRyZXNzaW5nIG1vZGUhCisgKi8KKworZW51bSB2bHNpX3Bpb19yZWdzIHsKKwlWTFNJX1BJT19JUklOVFIJCT0gMHgwMCwJCS8qIGludGVycnVwdCBlbmFibGUvcmVxdWVzdCAodTgsIHJ3KSAqLworCVZMU0lfUElPX1JJTkdQVFIJPSAweDAyLAkJLyogcngvdHggcmluZyBwb2ludGVyICh1MTYsIHJvKSAqLworCVZMU0lfUElPX1JJTkdCQVNFCT0gMHgwNCwJCS8qIFsyMzoxMF0gb2YgcmluZyBhZGRyZXNzICh1MTYsIHJ3KSAqLworCVZMU0lfUElPX1JJTkdTSVpFCT0gMHgwNiwJCS8qIHJ4L3R4IHJpbmcgc2l6ZSAodTE2LCBydykgKi8KKwlWTFNJX1BJT19QUk9NUFQJCT0gMHgwOCwgCS8qIHRyaWdnZXJzIHJpbmcgcHJvY2Vzc2luZyAodTE2LCB3bykgKi8KKwkvKiAweDBhLTB4MGY6IHJlc2VydmVkIC8gZHVwbGljYXRlZCBVQVJUIHJlZ3MgKi8KKwlWTFNJX1BJT19JUkNGRwkJPSAweDEwLAkJLyogY29uZmlndXJhdGlvbiBzZWxlY3QgKHUxNiwgcncpICovCisJVkxTSV9QSU9fU0lSRkxBRwk9IDB4MTIsCQkvKiBCT0YvRU9GIGZvciBmaWx0ZXJlZCBTSVIgKHUxNiwgcm8pICovCisJVkxTSV9QSU9fSVJFTkFCTEUJPSAweDE0LAkJLyogZW5hYmxlIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKHUxNiwgcncvcm8pICovCisJVkxTSV9QSU9fUEhZQ1RMCQk9IDB4MTYsCQkvKiBwaHlzaWNhbCBsYXllciBjdXJyZW50IHN0YXR1cyAodTE2LCBybykgKi8KKwlWTFNJX1BJT19OUEhZQ1RMCT0gMHgxOCwJCS8qIG5leHQgcGh5c2ljYWwgbGF5ZXIgc2VsZWN0ICh1MTYsIHJ3KSAqLworCVZMU0lfUElPX01BWFBLVAkJPSAweDFhLAkJLyogWzExOjBdIG1heCBsZW4gZm9yIHBhY2tldCByZWNlaXZlICh1MTYsIHJ3KSAqLworCVZMU0lfUElPX1JDVkJDTlQJPSAweDFjCQkvKiBjdXJyZW50IHJlY2VpdmUtRklGTyBieXRlIGNvdW50ICh1MTYsIHJvKSAqLworCS8qIDB4MWUtMHgxZjogcmVzZXJ2ZWQgLyBkdXBsaWNhdGVkIFVBUlQgcmVncyAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFZMU0lfUElPX0lSSU5UUjogSW50ZXJydXB0IFJlZ2lzdGVyICh1OCwgcncpICovCisKKy8qIGVuYWJsZS1iaXRzOgorICoJCTEgPSBlbmFibGUgLyAwID0gZGlzYWJsZQorICogaW50ZXJydXB0IGNvbmRpdGlvbiBiaXRzOgorICogCQlzZXQgYWNjb3JkaW5nIHRvIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0IHNvdXJjZQorICoJCShyZWdhcmRsZXNzIG9mIHRoZSBzdGF0ZSBvZiB0aGUgZW5hYmxlIGJpdHMpCisgKgkJZW5hYmxlIGJpdCBzdGF0dXMgaW5kaWNhdGVzIHdoZXRoZXIgaW50ZXJydXB0IGdldHMgcmFpc2VkCisgKgkJd3JpdGUtdG8tY2xlYXIKKyAqIG5vdGU6IFJQS1RJTlQgYW5kIFRQS1RJTlQgYmVoYXZlIGRpZmZlcmVudCBpbiBsZWdhY3kgVUFSVCBtb2RlICh3aGljaCB3ZSBkb24ndCB1c2UgOi0pCisgKi8KKworZW51bSB2bHNpX3Bpb19pcmludHIgeworCUlSSU5UUl9BQ1RFTgk9IDB4ODAsCS8qIGFjdGl2aXR5IGludGVycnVwdCBlbmFibGUgKi8KKwlJUklOVFJfQUNUSVZJVFkJPSAweDQwLAkvKiBhY3Rpdml0eSBtb25pdG9yICh0cmFmZmljIGRldGVjdGVkKSAqLworCUlSSU5UUl9SUEtURU4JPSAweDIwLAkvKiByZWNlaXZlIHBhY2tldCBpbnRlcnJ1cHQgZW5hYmxlKi8KKwlJUklOVFJfUlBLVElOVAk9IDB4MTAsCS8qIHJ4LXBhY2tldCB0cmFuc2ZlcmVkIGZyb20gZmlmbyB0byBtZW1vcnkgZmluaXNoZWQgKi8KKwlJUklOVFJfVFBLVEVOCT0gMHgwOCwJLyogdHJhbnNtaXQgcGFja2V0IGludGVycnVwdCBlbmFibGUgKi8KKwlJUklOVFJfVFBLVElOVAk9IDB4MDQsCS8qIGxhc3QgYml0IG9mIHR4LXBhY2tldCtjcmMgc2hpZnRlZCB0byBpci1wdWxzZXIgKi8KKwlJUklOVFJfT0VfRU4JPSAweDAyLAkvKiBVQVJUIHJ4IGZpZm8gb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHQgZW5hYmxlICovCisJSVJJTlRSX09FX0lOVAk9IDB4MDEJLyogVUFSVCByeCBmaWZvIG92ZXJydW4gZXJyb3IgKHJlYWQgTFNSIHRvIGNsZWFyKSAqLworfTsKKworLyogd2UgdXNlIHRoaXMgbWFzayB0byBjaGVjayB3aGV0aGVyIHRoZSAoc2hhcmVkIFBDSSkgaW50ZXJydXB0IGlzIG91cnMgKi8KKworI2RlZmluZSBJUklOVFJfSU5UX01BU0sJCShJUklOVFJfQUNUSVZJVFl8SVJJTlRSX1JQS1RJTlR8SVJJTlRSX1RQS1RJTlQpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BJT19SSU5HUFRSOiBSaW5nIFBvaW50ZXIgUmVhZC1CYWNrIFJlZ2lzdGVyICh1MTYsIHJvKSAqLworCisvKiBfYm90aF8gcmluZyBwb2ludGVycyBhcmUgaW5kaWNlcyByZWxhdGl2ZSB0byB0aGUgX2VudGlyZV8gcngsdHgtcmluZyEKKyAqIGkuZS4gdGhlIHJlZmVyZW5jZWQgZGVzY3JpcHRvciBpcyBsb2NhdGVkCisgKiBhdCBSSU5HQkFTRSArIFBUUiAqIHNpemVvZihkZXNjcikgZm9yIHJ4IGFuZCB0eAorICogdGhlcmVmb3JlLCB0aGUgdHgtcG9pbnRlciBoYXMgb2Zmc2V0IE1BWF9SSU5HX0RFU0NSCisgKi8KKworI2RlZmluZSBNQVhfUklOR19ERVNDUgkJNjQJLyogdHgsIHJ4IHJpbmdzIG1heSBjb250YWluIHVwIHRvIDY0IGRlc2NyIGVhY2ggKi8KKworI2RlZmluZSBSSU5HUFRSX1JYX01BU0sJCShNQVhfUklOR19ERVNDUi0xKQorI2RlZmluZSBSSU5HUFRSX1RYX01BU0sJCSgoTUFYX1JJTkdfREVTQ1ItMSk8PDgpCisKKyNkZWZpbmUgUklOR1BUUl9HRVRfUlgocCkJKChwKSZSSU5HUFRSX1JYX01BU0spCisjZGVmaW5lIFJJTkdQVFJfR0VUX1RYKHApCSgoKHApJlJJTkdQVFJfVFhfTUFTSyk+PjgpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BJT19SSU5HQkFTRTogUmluZyBQb2ludGVyIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAodTE2LCBybykgKi8KKworLyogQ29udGFpbnMgWzIzOjEwXSBwYXJ0IG9mIHRoZSByaW5nIGJhc2UgKGJ1cy0pIGFkZHJlc3MKKyAqIHdoaWNoIG11c3QgYmUgMWstYWxpbmdlZC4gWzMxOjI0XSBpcyB0YWtlbiBmcm9tCisgKiBWTFNJX1BDSV9NU1RSUEFHRSBhYm92ZS4KKyAqIFRoZSBjb250cm9sbGVyIGluaXRpYXRlcyBub24tYnVyc3QgUENJIEJNIGN5Y2xlcyB0bworICogZmV0Y2ggYW5kIHVwZGF0ZSB0aGUgZGVzY3JpcHRvcnMgaW4gdGhlIHJpbmcuCisgKiBPbmNlIGZldGNoZWQsIHRoZSBkZXNjcmlwdG9yIHJlbWFpbnMgY2FjaGVkIG9uY2hpcAorICogdW50aWwgaXQgZ2V0cyBjbG9zZWQgYW5kIHVwZGF0ZWQgZHVlIHRvIHRoZSByaW5nCisgKiBwcm9jZXNzaW5nIHN0YXRlIG1hY2hpbmUuCisgKiBUaGUgZW50aXJlIHJpbmcgYXJlYSBpcyBzcGxpdCBpbiByeCBhbmQgdHggYXJlYXMgd2l0aCBlYWNoCisgKiBhcmVhIGNvbnNpc3Rpbmcgb2YgNjQgZGVzY3JpcHRvcnMgb2YgOCBieXRlcyBlYWNoLgorICogVGhlIHJ4KHR4KSByaW5nIGlzIGxvY2F0ZWQgYXQgcmluZ2Jhc2UrMCAocmluZ2Jhc2UrNjQqOCkuCisgKi8KKworI2RlZmluZSBCVVNfVE9fUklOR0JBU0UocCkJKCgocCk+PjEwKSYweDNmZmYpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BJT19SSU5HU0laRTogUmluZyBTaXplIFJlZ2lzdGVyICh1MTYsIHJ3KSAqLworCisvKiBiaXQgbWFzayB0byBpbmRpY2F0ZSB0aGUgcmluZyBzaXplIHRvIGJlIHVzZWQgZm9yIHJ4IGFuZCB0eC4KKyAqIAlwb3NzaWJsZSB2YWx1ZXMJCWVuY29kZWQgYml0cworICoJCSA0CQkgICAwMDAwCisgKgkJIDgJCSAgIDAwMDEKKyAqCQkxNgkJICAgMDAxMQorICoJCTMyCQkgICAwMTExCisgKgkJNjQJCSAgIDExMTEKKyAqIGxvY2F0ZWQgYXQgWzE1OjEyXSBmb3IgdHggYW5kIFsxMTo4XSBmb3IgcnggKFs3OjBdIHVudXNlZCkKKyAqCisgKiBub3RlOiBwcm9iYWJseSBhIGdvb2QgaWRlYSB0byBoYXZlIElSQ0ZHX01TVFIgY2xlYXJlZCB3aGVuIHdyaXRpbmcKKyAqCSB0aGlzIHNvIHRoZSBzdGF0ZSBtYWNoaW5lcyBhcmUgc3RvcHBlZCBhbmQgdGhlIFJJTkdQVFIgaXMgcmVzZXQhCisgKi8KKworI2RlZmluZSBTSVpFX1RPX0JJVFMobnVtKQkJKCgoKG51bSktMSk+PjIpJjB4MGYpCisjZGVmaW5lIFRYX1JYX1RPX1JJTkdTSVpFKHR4LHJ4KQkoKFNJWkVfVE9fQklUUyh0eCk8PDEyKXwoU0laRV9UT19CSVRTKHJ4KTw8OCkpCisjZGVmaW5lIFJJTkdTSVpFX1RPX1JYU0laRShycykJCSgoKChycykmMHgwZjAwKT4+NikrNCkKKyNkZWZpbmUgUklOR1NJWkVfVE9fVFhTSVpFKHJzKQkJKCgoKHJzKSYweGYwMDApPj4xMCkrNCkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVkxTSV9QSU9fUFJPTVBUOiBSaW5nIFByb21wdGluZyBSZWdpc3RlciAodTE2LCB3cml0ZS10by1zdGFydCkgKi8KKworLyogd3JpdGluZyBhbnkgdmFsdWUga2lja3MgdGhlIHJpbmcgcHJvY2Vzc2luZyBzdGF0ZSBtYWNoaW5lcworICogZm9yIGJvdGggdHgsIHJ4IHJpbmdzIGFzIGZvbGxvd3M6CisgKiAJLSBhY3RpdmUgcmluZ3MgKGN1cnJlbnRseSBvd25pbmcgYW4gYWN0aXZlIGRlc2NyaXB0b3IpCisgKgkgIGlnbm9yZSB0aGUgcHJvbXB0IGFuZCBjb250aW51ZQorICoJLSBpZGxlIHJpbmdzIGZldGNoIHRoZSBuZXh0IGRlc2NyIGZyb20gdGhlIHJpbmcgYW5kIHN0YXJ0CisgKgkgIHRoZWlyIHByb2Nlc3NpbmcKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVkxTSV9QSU9fSVJDRkc6IElSIENvbmZpZyBSZWdpc3RlciAodTE2LCBydykgKi8KKworLyogbm90ZXM6CisgKgktIG5vdCBtb3JlIHRoYW4gb25lIFNJUi9NSVIvRklSIGJpdCBtdXN0IGJlIHNldCBhdCBhbnkgdGltZQorICoJLSBTSVIsIE1JUiwgRklSIGFuZCBDUkMxNiBzZWxlY3QgdGhlIGNvbmZpZ3VyYXRpb24gd2hpY2ggd2lsbAorICoJICBiZSBhcHBsaWVkIG9uIG5leHQgMC0+MSB0cmFuc2l0aW9uIG9mIElSRU5BQkxFX1BIWUFORENMT0NLIChzZWUgYmVsb3cpLgorICoJLSBiZXNpZGVzIGFsbG93aW5nIHRoZSBQQ0kgaW50ZXJmYWNlIHRvIGV4ZWN1dGUgYnVzbWFzdGVyIGN5Y2xlcworICoJICBhbmQgdGhlcmVmb3JlIHRoZSByaW5nIFNNIHRvIG9wZXJhdGUsIHRoZSBNU1RSIGJpdCBoYXMgc2lkZS1lZmZlY3RzOgorICoJICB3aGVuIE1TVFIgaXMgY2xlYXJlZCwgdGhlIFJJTkdQVFIncyBnZXQgcmVzZXQgYW5kIHRoZSBsZWdhY3kgVUFSVCBtb2RlCisgKgkgIChpbiBjb250cmFzdCB0byBidXNtYXN0ZXIgYWNjZXNzIG1vZGUpIGdldHMgZW5hYmxlZC4KKyAqCS0gY2xlYXJpbmcgRU5SWCBvciBzZXR0aW5nIEVOVFggd2hpbGUgZGF0YSBpcyByZWNlaXZlZCBtYXkgc3RhbGwgdGhlCisgKgkgIHJlY2VpdmUgZmlmbyB1bnRpbCBFTlJYIHJlZW5hYmxlZCBfYW5kXyBhbm90aGVyIHBhY2tldCBhcnJpdmVzCisgKgktIFNJUkZJTFQgbWVhbnMgdGhlIGNoaXAgcGVyZm9ybXMgdGhlIHJlcXVpcmVkIHVud3JhcHBpbmcgb2YgaGFyZHdhcmUKKyAqCSAgaGVhZGVycyAoWEJPRidzLCBCT0YvRU9GKSBhbmQgdW4tZXNjYXBpbmcgaW4gdGhlIF9yZWNlaXZlXyBkaXJlY3Rpb24uCisgKgkgIE9ubHkgdGhlIHJlc3VsdGluZyBJckxBUCBwYXlsb2FkIGlzIGNvcGllZCB0byB0aGUgcmVjZWl2ZSBidWZmZXJzIC0KKyAqCSAgYnV0IHdpdGggdGhlIDE2Yml0IEZDUyBzdGlsbCBlbmNsdWRlZC4gUXVlc3Rpb24gcmVtYWlucywgd2hldGhlciBpdAorICoJICB3YXMgYWxyZWFkeSBjaGVja2VkIG9yIHdlIHNob3VsZCBkbyBpdCBiZWZvcmUgcGFzc2luZyB0aGUgcGFja2V0IHRvIElyTEFQPworICovCisKK2VudW0gdmxzaV9waW9faXJjZmcgeworCUlSQ0ZHX0xPT1AJPSAweDQwMDAsCS8qIGVuYWJsZSBsb29wYmFjayB0ZXN0IG1vZGUgKi8KKwlJUkNGR19FTlRYCT0gMHgxMDAwLAkvKiB0cmFuc21pdCBlbmFibGUgKi8KKwlJUkNGR19FTlJYCT0gMHgwODAwLAkvKiByZWNlaXZlIGVuYWJsZSAqLworCUlSQ0ZHX01TVFIJPSAweDA0MDAsCS8qIG1hc3RlciBlbmFibGUgKi8KKwlJUkNGR19SWEFOWQk9IDB4MDIwMCwJLyogcmVjZWl2ZSBhbnkgcGFja2V0ICovCisJSVJDRkdfQ1JDMTYJPSAweDAwODAsCS8qIDE2Yml0IChub3QgMzJiaXQpIENSQyBzZWxlY3QgZm9yIE1JUi9GSVIgKi8KKwlJUkNGR19GSVIJPSAweDAwNDAsCS8qIEZJUiA0UFBNIGVuY29kaW5nIG1vZGUgZW5hYmxlICovCisJSVJDRkdfTUlSCT0gMHgwMDIwLAkvKiBNSVIgSERMQyBlbmNvZGluZyBtb2RlIGVuYWJsZSAqLworCUlSQ0ZHX1NJUgk9IDB4MDAxMCwJLyogU0lSIGVuY29kaW5nIG1vZGUgZW5hYmxlICovCisJSVJDRkdfU0lSRklMVAk9IDB4MDAwOCwJLyogZW5hYmxlIFNJUiBkZWNvZGUgZmlsdGVyIChyZWNlaXZlciB1bndyYXBwaW5nKSAqLworCUlSQ0ZHX1NJUlRFU1QJPSAweDAwMDQsCS8qIGFsbG93IFNJUiBkZWNvZGUgZmlsdGVyIHdoZW4gbm90IGluIFNJUiBtb2RlICovCisJSVJDRkdfVFhQT0wJPSAweDAwMDIsCS8qIGludmVydCB0eCBwb2xhcml0eSB3aGVuIHNldCAqLworCUlSQ0ZHX1JYUE9MCT0gMHgwMDAxCS8qIGludmVydCByeCBwb2xhcml0eSB3aGVuIHNldCAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFZMU0lfUElPX1NJUkZMQUc6IFNJUiBGbGFnIFJlZ2lzdGVyICh1MTYsIHJvKSAqLworCisvKiByZWdpc3RlciBjb250YWlucyBoYXJkY29kZWQgQk9GPTB4YzAgYXQgWzc6MF0gYW5kIEVPRj0weGMxIGF0IFsxNTo4XQorICogd2hpY2ggaXMgdXNlZCBmb3IgdW53cmFwcGluZyByZWNlaXZlZCBmcmFtZXMgaW4gU0lSIGRlY29kZS1maWx0ZXIgbW9kZQorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BJT19JUkVOQUJMRTogSVIgRW5hYmxlIFJlZ2lzdGVyICh1MTYsIHJ3L3JvKSAqLworCisvKiBub3RlczoKKyAqCS0gSVJFTiBhY3RzIGFzIGdhdGUgZm9yIGxhdGNoaW5nIHRoZSBjb25maWd1cmVkIElSIG1vZGUgaW5mb3JtYXRpb24KKyAqCSAgZnJvbSBJUkNGRyBhbmQgSVJQSFlDVEwgd2hlbiBJUkVOPXJlc2V0IGFuZCBhcHBseWluZyB0aGVtIHdoZW4KKyAqCSAgSVJFTiBnZXRzIHNldCBhZnRlcndhcmRzLgorICoJLSBFTlRYU1QgcmVmbGVjdHMgSVJDRkdfRU5UWAorICoJLSBFTlJYU1QgPSBJUkNGR19FTlJYICYmICghSVJDRkdfRU5UWCB8fCBJUkNGR19MT09QKQorICovCisKK2VudW0gdmxzaV9waW9faXJlbmFibGUgeworCUlSRU5BQkxFX1BIWUFORENMT0NLCT0gMHg4MDAwLCAgLyogZW5hYmxlIElSIHBoeSBhbmQgZ2F0ZSB0aGUgbW9kZSBjb25maWcgKHJ3KSAqLworCUlSRU5BQkxFX0NGR0VSCQk9IDB4NDAwMCwgIC8qIG1vZGUgY29uZmlndXJhdGlvbiBlcnJvciAocm8pICovCisJSVJFTkFCTEVfRklSX09OCQk9IDB4MjAwMCwgIC8qIEZJUiBvbiBzdGF0dXMgKHJvKSAqLworCUlSRU5BQkxFX01JUl9PTgkJPSAweDEwMDAsICAvKiBNSVIgb24gc3RhdHVzIChybykgKi8KKwlJUkVOQUJMRV9TSVJfT04JCT0gMHgwODAwLCAgLyogU0lSIG9uIHN0YXR1cyAocm8pICovCisJSVJFTkFCTEVfRU5UWFNUCQk9IDB4MDQwMCwgIC8qIHRyYW5zbWl0IGVuYWJsZSBzdGF0dXMgKHJvKSAqLworCUlSRU5BQkxFX0VOUlhTVAkJPSAweDAyMDAsICAvKiBSZWNlaXZlIGVuYWJsZSBzdGF0dXMgKHJvKSAqLworCUlSRU5BQkxFX0NSQzE2X09OCT0gMHgwMTAwICAgLyogMTZiaXQgKG5vdCAzMmJpdCkgQ1JDIGVuYWJsZWQgc3RhdHVzIChybykgKi8KK307CisKKyNkZWZpbmUJICBJUkVOQUJMRV9NQVNLCSAgICAweGZmMDAgIC8qIFJlYWQgbWFzayAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVkxTSV9QSU9fUEhZQ1RMOiBJUiBQaHlzaWNhbCBMYXllciBDdXJyZW50IENvbnRyb2wgUmVnaXN0ZXIgKHUxNiwgcm8pICovCisKKy8qIHJlYWQtYmFjayBvZiB0aGUgY3VycmVudGx5IGFwcGxpZWQgcGh5c2ljYWwgbGF5ZXIgc3RhdHVzLgorICogYXBwbGllZCBmcm9tIFZMU0lfUElPX05QSFlDVEwgYXQgcmlzaW5nIGVkZ2Ugb2YgSVJFTkFCTEVfUEhZQU5EQ0xPQ0sKKyAqIGNvbnRlbnRzIGlkZW50aWNhbCB0byBWTFNJX1BJT19OUEhZQ1RMIChzZWUgYmVsb3cpCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFZMU0lfUElPX05QSFlDVEw6IElSIFBoeXNpY2FsIExheWVyIE5leHQgQ29udHJvbCBSZWdpc3RlciAodTE2LCBydykgKi8KKworLyogbGF0Y2hlZCBkdXJpbmcgSVJFTkFCTEVfUEhZQU5EQ0xPQ0s9MCBhbmQgYXBwbGllZCBhdCAwLTEgdHJhbnNpdGlvbgorICoKKyAqIGNvbnNpc3RzIG9mIEJBVURbMTU6MTBdLCBQTFNXSURbOTo1XSBhbmQgUFJFQU1CWzQ6MF0gYml0cyBkZWZpbmVkIGFzIGZvbGxvd3M6CisgKgorICogU0lSLW1vZGU6CUJBVUQgPSAoMTE1LjJrSHogLyBiYXVkcmF0ZSkgLSAxCisgKgkJUExTV0lEID0gKHB1bHNldGltZSAqIGZyZXEgLyAoQkFVRCsxKSkgLSAxCisgKgkJCXdoZXJlIHB1bHNldGltZSBpcyB0aGUgcmVxdWVzdGVkIElyUEhZIHB1bHNlIHdpZHRoCisgKgkJCWFuZCBmcmVxIGlzIDgoMTYpTUh6IGZvciA0MCg0OClNSHogcHJpbWFyeSBpbnB1dCBjbG9jaworICoJCVBSRUFNQjogZG9uJ3QgY2FyZSBmb3IgU0lSCisgKgorICoJCVRoZSBub21pbmFsIFNJUiBwdWxzZSB3aWR0aCBpcyAzLzE2IGJpdCB0aW1lIHNvIHdlIGhhdmUgUExTV0lEPTEyCisgKgkJZml4ZWQgZm9yIGFsbCBTSVIgc3BlZWRzIGF0IDQwTUh6IGlucHV0IGNsb2NrIChQTFNXSUQ9MjQgYXQgNDhNSHopLgorICoJCUlyUEhZIGFsc28gYWxsb3dzIHNob3J0ZXIgcHVsc2VzIGRvd24gdG8gdGhlIG5vbWluYWwgcHVsc2UgZHVyYXRpb24KKyAqCQlhdCAxMTUuMmtiYXVkIChtaW51cyBzb21lIHRvbGVyYW5jZSkgd2hpY2ggaXMgMS40MSB1c2VjLgorICoJCVVzaW5nIHRoZSBleHByZXNzaW9uIFBMU1dJRCA9IDEyLyhCQVVEKzEpLTEgKG11bHRpcGxpZWQgYnkgdHdvIGZvciA0OE1IeikKKyAqCQl3ZSBnZXQgdGhlIG1pbmltdW0gYWNjZXB0YWJsZSBQTFNXSUQgdmFsdWVzIGFjY29yZGluZyB0byB0aGUgVkxTSQorICoJCXNwZWNpZmljYXRpb24sIHdoaWNoIHByb3ZpZGVzIDEuNSB1c2VjIHB1bHNlIHdpZHRoIGZvciBhbGwgc3BlZWRzIChleGNlcHQKKyAqCQlmb3IgMi40a2JhdWQgZ2V0dGluZyA2dXNlYykuIFRoaXMgaXMgZmluZSB3aXRoIElyUEhZIHYxLjMgc3BlY3MgYW5kCisgKgkJcmVkdWNlcyB0aGUgdHJhbnNjZWl2ZXIgcG93ZXIgd2hpY2ggZHJhaW5zIHRoZSBiYXR0ZXJ5LiBBdCA5LjZrYmF1ZCBmb3IKKyAqCQlleGFtcGxlIHRoaXMgYW1vdW50cyB0byBtb3JlIHRoYW4gOTAlIGJhdHRlcnkgcG93ZXIgc2F2aW5nIQorICoKKyAqIE1JUi1tb2RlOglCQVVEID0gMAorICoJCVBMU1dJRCA9IDkoMTApIGZvciA0MCg0OCkgTUh6IGlucHV0IGNsb2NrCisgKgkJCXRvIGdldCBub21pbmFsIE1JUiBwdWxzZSB3aWR0aAorICoJCVBSRUFNQiA9IDEKKyAqCisgKiBGSVItbW9kZToJQkFVRCA9IDAKKyAqCQlQTFNXSUQ6IGRvbid0IGNhcmUKKyAqCQlQUkVBTUIgPSAxNQorICovCisKKyNkZWZpbmUgUEhZQ1RMX0JBVURfU0hJRlQJMTAKKyNkZWZpbmUgUEhZQ1RMX0JBVURfTUFTSwkweGZjMDAKKyNkZWZpbmUgUEhZQ1RMX1BMU1dJRF9TSElGVAk1CisjZGVmaW5lIFBIWUNUTF9QTFNXSURfTUFTSwkweDAzZTAKKyNkZWZpbmUgUEhZQ1RMX1BSRUFNQl9TSElGVAkwCisjZGVmaW5lIFBIWUNUTF9QUkVBTUJfTUFTSwkweDAwMWYKKworI2RlZmluZSBQSFlDVExfVE9fQkFVRChid3ApCSgoKGJ3cCkmUEhZQ1RMX0JBVURfTUFTSyk+PlBIWUNUTF9CQVVEX1NISUZUKQorI2RlZmluZSBQSFlDVExfVE9fUExTV0lEKGJ3cCkJKCgoYndwKSZQSFlDVExfUExTV0lEX01BU0spPj5QSFlDVExfUExTV0lEX1NISUZUKQorI2RlZmluZSBQSFlDVExfVE9fUFJFQU1CKGJ3cCkJKCgoYndwKSZQSFlDVExfUFJFQU1CX01BU0spPj5QSFlDVExfUFJFQU1CX1NISUZUKQorCisjZGVmaW5lIEJXUF9UT19QSFlDVEwoYix3LHApCSgoKChiKTw8UEhZQ1RMX0JBVURfU0hJRlQpJlBIWUNUTF9CQVVEX01BU0spIFwKKwkJCQkgfCAoKCh3KTw8UEhZQ1RMX1BMU1dJRF9TSElGVCkmUEhZQ1RMX1BMU1dJRF9NQVNLKSBcCisJCQkJIHwgKCgocCk8PFBIWUNUTF9QUkVBTUJfU0hJRlQpJlBIWUNUTF9QUkVBTUJfTUFTSykpCisKKyNkZWZpbmUgQkFVRF9CSVRTKGJyKQkJKCgxMTUyMDAvKGJyKSktMSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZAorY2FsY193aWR0aF9iaXRzKHVuc2lnbmVkIGJhdWRyYXRlLCB1bnNpZ25lZCB3aWR0aHNlbGVjdCwgdW5zaWduZWQgY2xvY2tzZWxlY3QpCit7CisJdW5zaWduZWQJdG1wOworCisJaWYgKHdpZHRoc2VsZWN0KQkvKiBub21pbmFsIDMvMTYgcHVscyB3aWR0aCAqLworCQlyZXR1cm4gKGNsb2Nrc2VsZWN0KSA/IDEyIDogMjQ7CisKKwl0bXAgPSAoKGNsb2Nrc2VsZWN0KSA/IDEyIDogMjQpIC8gKEJBVURfQklUUyhiYXVkcmF0ZSkrMSk7CisKKwkvKiBpbnRlcm1lZGlhdGUgcmVzdWx0IG9mIGludGVnZXIgZGl2aXNpb24gbmVlZGVkIGhlcmUgKi8KKworCXJldHVybiAodG1wPjApID8gKHRtcC0xKSA6IDA7Cit9CisKKyNkZWZpbmUgUEhZQ1RMX1NJUihicix3cyxjcykJQldQX1RPX1BIWUNUTChCQVVEX0JJVFMoYnIpLGNhbGNfd2lkdGhfYml0cygoYnIpLCh3cyksKGNzKSksMCkKKyNkZWZpbmUgUEhZQ1RMX01JUihjcykJCUJXUF9UT19QSFlDVEwoMCwoKGNzKT85OjEwKSwxKQorI2RlZmluZSBQSFlDVExfRklSCQlCV1BfVE9fUEhZQ1RMKDAsMCwxNSkKKworLyogcXVpdGUgdWdseSwgSSBrbm93LiBCdXQgaW1wbGVtZW50aW5nIHRoZXNlIGNhbGN1bGF0aW9ucyBoZXJlIGF2b2lkcworICogaGF2aW5nIG1hZ2ljIG51bWJlcnMgaW4gdGhlIGNvZGUgYW5kIGFsbG93cyBzb21lIHBsYXlpbmcgd2l0aCBwdWxzZXdpZHRocworICogd2l0aG91dCByaXNrIHRvIHZpb2xhdGUgdGhlIHN0YW5kYXJkcy4KKyAqIEZXSVcsIGhlcmUgaXMgdGhlIHRhYmxlIGZvciByZWZlcmVuY2U6CisgKgorICogYmF1ZHJhdGUJQkFVRAltaW4tUExTV0lECW5vbS1QTFNXSUQJUFJFQU1CCisgKiAgICAgMjQwMAkgIDQ3CSAgIDAoMCkJCSAgIDEyKDI0KQkgICAwCisgKiAgICAgOTYwMAkgIDExCSAgIDAoMCkJCSAgIDEyKDI0KQkgICAwCisgKiAgICAxOTIwMAkgICA1CSAgIDEoMikJCSAgIDEyKDI0KQkgICAwCisgKiAgICAzODQwMAkgICAyCSAgIDMoNikJICAgICAgICAgICAxMigyNCkJICAgMAorICogICAgNTc2MDAJICAgMQkgICA1KDEwKQkgICAxMigyNCkJICAgMAorICogICAxMTUyMDAJICAgMAkgIDExKDIyKQkgICAxMigyNCkJICAgMAorICoJTUlSCSAgIDAJICAgIC0JCSAgICA5KDEwKQkgICAxCisgKglGSVIJICAgMCAgICAgICAgLSAgICAgICAgICAgICAgIDAJCSAgMTUKKyAqCisgKiBub3RlOiB4KHkpIG1lYW5zIHgtdmFsdWUgZm9yIDQwTUh6IC8geS12YWx1ZSBmb3IgNDhNSHogcHJpbWFyeSBpbnB1dCBjbG9jaworICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIFZMU0lfUElPX01BWFBLVDogTWF4aW11bSBQYWNrZXQgTGVuZ3RoIHJlZ2lzdGVyICh1MTYsIHJ3KSAqLworCisvKiBtYXhpbXVtIGFjY2VwdGFibGUgbGVuZ3RoIGZvciByZWNlaXZlZCBwYWNrZXRzICovCisKKy8qIGh3IGltcG9zZWQgbGltaXRhdGlvbiAtIHJlZ2lzdGVyIHVzZXMgb25seSBbMTE6MF0gKi8KKyNkZWZpbmUgTUFYX1BBQ0tFVF9MRU5HVEgJMHgwZmZmCisKKy8qIElyTEFQIEktZmllbGQgKGFwcGFyZW50bHkgbm90IGRlZmluZWQgZWxzZXdoZXJlKSAqLworI2RlZmluZSBJUkRBX01UVQkJMjA0OAorCisvKiBjb21wbGV0ZSBwYWNrZXQgY29uc2lzdHMgb2YgQSgxKStDKDEpK0koPD1JUkRBX01UVSkgKi8KKyNkZWZpbmUgSVJMQVBfU0tCX0FMTE9DU0laRQkoMSsxK0lSREFfTVRVKQorCisvKiB0aGUgYnVmZmVycyB3ZSB1c2UgdG8gZXhjaGFuZ2UgZnJhbWVzIHdpdGggdGhlIGhhcmR3YXJlIG5lZWQgdG8gYmUKKyAqIGxhcmdlciB0aGFuIElSTEFQX1NLQl9BTExPQ1NJWkUgYmVjYXVzZSB3ZSBtYXkgaGF2ZSB1cCB0byA0IGJ5dGVzIEZDUworICogYXBwZW5kZWQgYW5kLCBpbiBTSVIgbW9kZSwgYSBsb3Qgb2YgZnJhbWUgd3JhcHBpbmcgYnl0ZXMuIFRoZSB3b3JzdAorICogY2FzZSBhcHBlYXJzIHRvIGJlIGEgU0lSIHBhY2tldCB3aXRoIEktc2l6ZT09SVJEQV9NVFUgYW5kIGFsbCBieXRlcworICogcmVxdWlyaW5nIHRvIGJlIGVzY2FwZWQgdG8gcHJvdmlkZSB0cmFuc3BhcmVuY3kuIEZ1cnRoZXJtb3JlLCB0aGUgcGVlcgorICogbWlnaHQgYXNrIGZvciBxdWl0ZSBhIG51bWJlciBvZiBhZGRpdGlvbmFsIFhCT0ZzOgorICoJdXAgdG8gMTE1KzQ4IFhCT0ZTCQkgMTYzCisgKglyZWd1bGFyIEJPRgkJCSAgIDEKKyAqCUEtZmllbGQJCQkJICAgMQorICoJQy1maWVsZAkJCQkgICAxCisgKglJLWZpZWxkLCBJUkRBX01UVSwgYWxsIGVzY2FwZWQJNDA5NgorICoJRkNTICgxNiBiaXQgYXQgU0lSLCBlc2NhcGVkKQkgICA0CisgKglFT0YJCQkJICAgMQorICogQUZBSUNTIG5vdGhpbmcgaW4gSXJMQVAgZ3VhcmFudGVlcyBBL0MgZmllbGQgbm90IHRvIG5lZWQgZXNjYXBpbmcKKyAqIChmLmUuIDB4YzAvMHhjMSAtIGkuZS4gQk9GL0VPRiAtIGFyZSBsZWdhbCB2YWx1ZXMgdGhlcmUpIHNvIGluIHRoZQorICogd29yc3QgY2FzZSB3ZSBoYXZlIDQyNjkgYnl0ZXMgdG90YWwgZnJhbWUgc2l6ZS4KKyAqIEhvd2V2ZXIsIHRoZSBWTFNJIHVzZXMgMTIgYml0cyBvbmx5IGZvciBhbGwgYnVmZmVyIGxlbmd0aCB2YWx1ZXMsCisgKiB3aGljaCBsaW1pdHMgdGhlIG1heGltdW0gdXNlYWJsZSBidWZmZXIgc2l6ZSA8PSA0MDk1LgorICogTm90ZSB0aGlzIGlzIG5vdCBhIGxpbWl0YXRpb24gaW4gdGhlIHJlY2VpdmUgY2FzZSBiZWNhdXNlIHdlIHVzZQorICogdGhlIFNJUiBmaWx0ZXJpbmcgbW9kZSB3aGVyZSB0aGUgaHcgdW53cmFwcyB0aGUgZnJhbWUgYW5kIG9ubHkgdGhlCisgKiBiYXJlIHBhY2tldCtmY3MgaXMgc3RvcmVkIGludG8gdGhlIGJ1ZmZlciAtIGluIGNvbnRyYXN0IHRvIHRoZSBTSVIKKyAqIHR4IGNhc2Ugd2hlcmUgd2UgaGF2ZSB0byBwYXNzIGZyYW1lLXdyYXBwZWQgcGFja2V0cyB0byB0aGUgaHcuCisgKiBJZiB0aGlzIHdvdWxkIGV2ZXIgYmVjb21lIGFuIGlzc3VlIGluIHJlYWwgbGlmZSwgdGhlIG9ubHkgd29ya2Fyb3VuZAorICogSSBzZWUgd291bGQgYmUgdXNpbmcgdGhlIGxlZ2FjeSBVQVJUIGVtdWxhdGlvbiBpbiBTSVIgbW9kZS4KKyAqLworCisjZGVmaW5lIFhGRVJfQlVGX1NJWkUJCU1BWF9QQUNLRVRfTEVOR1RICisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BJT19SQ1ZCQ05UOiBSZWNlaXZlIEJ5dGUgQ291bnQgUmVnaXN0ZXIgKHUxNiwgcm8pICovCisKKy8qIHJlY2VpdmUgcGFja2V0IGNvdW50ZXIgZ2V0cyBpbmNyZW1lbnRlZCBvbiBldmVyeSBub24tZmlsdGVyZWQKKyAqIGJ5dGUgd2hpY2ggd2FzIHB1dCBpbiB0aGUgcmVjZWl2ZSBmaWZvIGFuZCByZXNldCBmb3IgZWFjaAorICogbmV3IHBhY2tldC4gVXNlZCB0byBkZWNpZGUgd2hldGhlciB3ZSBhcmUganVzdCBpbiB0aGUgbWlkZGxlCisgKiBvZiByZWNlaXZpbmcKKyAqLworCisvKiBiZXR0ZXIgYXBwbHkgdGhlIFsxMTowXSBtYXNrIHdoZW4gcmVhZGluZywgYXMgc29tZSBkb2NzIHNheSB0aGUKKyAqIHJlc2VydmVkIFsxNToxMl0gd291bGQgcmV0dXJuIDEgd2hlbiByZWFkaW5nIC0gd2hpY2ggaXMgd3JvbmcgQUZBSUNTCisgKi8KKyNkZWZpbmUgUkNWQkNOVF9NQVNLCTB4MGZmZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkZXNjcmlwdG9ycyBmb3IgcngvdHggcmluZworICoKKyAqIGFjY2Vzc2VkIGJ5IGhhcmR3YXJlIC0gZG9uJ3QgY2hhbmdlIQorICoKKyAqIHRoZSBkZXNjcmlwdG9yIGlzIG93bmVkIGJ5IGhhcmR3YXJlLCB3aGVuIHRoZSBBQ1RJVkUgc3RhdHVzIGJpdAorICogaXMgc2V0IGFuZCBub3RoaW5nIChiZXNpZGVzIHJlYWRpbmcgc3RhdHVzIHRvIHRlc3QgdGhlIGJpdCkKKyAqIHNoYWxsIGJlIGRvbmUuIFRoZSBiaXQgZ2V0cyBjbGVhcmVkIGJ5IGh3LCB3aGVuIHRoZSBkZXNjcmlwdG9yCisgKiBnZXRzIGNsb3NlZC4gUHJlbWF0dXJlIHJlYXBpbmcgb2YgZGVzY3JpcHRvcnMgb3duZWQgYmUgdGhlIGNoaXAKKyAqIGNhbiBiZSBhY2hpZXZlZCBieSBkaXNhYmxpbmcgSVJDRkdfTVNUUgorICoKKyAqIEF0dGVudGlvbjogV3JpdGluZyBhZGRyIG92ZXJ3cml0ZXMgc3RhdHVzIQorICoKKyAqICMjIyBGSVhNRTogZGVwZW5kcyBvbiBlbmRpYW5lc3MgKGJ1dCB0aGVyZSBhaW4ndCBubyBub24taTU4NiBvYjgwMCA7LSkKKyAqLworCitzdHJ1Y3QgcmluZ19kZXNjcl9odyB7CisJdm9sYXRpbGUgdTE2CXJkX2NvdW50OwkvKiB0eC9yeCBjb3VudCBbMTE6MF0gKi8KKwl1MTYJCXJlc2VydmVkOworCXVuaW9uIHsKKwkJdTMyCWFkZHI7CQkvKiBbMjM6MF0gb2YgdGhlIGJ1ZmZlcidzIGJ1c2FkZHJlc3MgKi8KKwkJc3RydWN0IHsKKwkJCXU4CQlhZGRyX3Jlc1szXTsKKwkJCXZvbGF0aWxlIHU4CXN0YXR1czsJCS8qIGRlc2NyaXB0b3Igc3RhdHVzICovCisJCX0gcmRfcyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwl9IHJkX3UgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgcmRfYWRkcgkJcmRfdS5hZGRyCisjZGVmaW5lIHJkX3N0YXR1cwlyZF91LnJkX3Muc3RhdHVzCisKKy8qIHJpbmcgZGVzY3JpcHRvciBzdGF0dXMgYml0cyAqLworCisjZGVmaW5lIFJEX0FDVElWRQkJMHg4MAkvKiBkZXNjcmlwdG9yIG93bmVkIGJ5IGh3IChib3RoIFRYLFJYKSAqLworCisvKiBUWCByaW5nIGRlc2NyaXB0b3Igc3RhdHVzICovCisKKyNkZWZpbmUJUkRfVFhfRElTQ1JDCQkweDQwCS8qIGRvIG5vdCBzZW5kIENSQyAoZm9yIFNJUikgKi8KKyNkZWZpbmUJUkRfVFhfQkFEQ1JDCQkweDIwCS8qIGZvcmNlIGEgYmFkIENSQyAqLworI2RlZmluZQlSRF9UWF9QVUxTRQkJMHgxMAkvKiBzZW5kIGluZGljYXRpb24gcHVsc2UgYWZ0ZXIgdGhpcyBmcmFtZSAoTUlSL0ZJUikgKi8KKyNkZWZpbmUJUkRfVFhfRlJDRVVORAkJMHgwOAkvKiBmb3JjZSB1bmRlcnJ1biAqLworI2RlZmluZQlSRF9UWF9DTFJFTlRYCQkweDA0CS8qIGNsZWFyIEVOVFggYWZ0ZXIgdGhpcyBmcmFtZSAqLworI2RlZmluZQlSRF9UWF9VTkRSTgkJMHgwMQkvKiBUWCBmaWZvIHVuZGVycnVuIChwcm9iYWJseSBQQ0kgcHJvYmxlbSkgKi8KKworLyogUlggcmluZyBkZXNjcmlwdG9yIHN0YXR1cyAqLworCisjZGVmaW5lIFJEX1JYX1BIWUVSUgkJMHg0MAkvKiBwaHlzaWNhbCBlbmNvZGluZyBlcnJvciAqLworI2RlZmluZSBSRF9SWF9DUkNFUlIJCTB4MjAJLyogQ1JDIGVycm9yIChNSVIvRklSKSAqLworI2RlZmluZSBSRF9SWF9MRU5HVEgJCTB4MTAJLyogZnJhbWUgZXhjZWVkcyBidWZmZXIgbGVuZ3RoICovCisjZGVmaW5lIFJEX1JYX09WRVIJCTB4MDgJLyogUlggZmlmbyBvdmVycnVuIChwcm9iYWJseSBQQ0kgcHJvYmxlbSkgKi8KKyNkZWZpbmUgUkRfUlhfU0lSQkFECQkweDA0CS8qIEVPRiBtaXNzaW5nOiBCT0YgZm9sbG93cyBCT0YgKFNJUiwgZmlsdGVyZWQpICovCisKKyNkZWZpbmUgUkRfUlhfRVJST1IJCTB4N2MJLyogYW55IGVycm9yIGluIHJlY2VpdmVkIGZyYW1lICovCisKKy8qIHRoZSBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgMiBkZXNjcmlwdG9yIHJpbmdzICovCisjZGVmaW5lIEhXX1JJTkdfQVJFQV9TSVpFCSgyICogTUFYX1JJTkdfREVTQ1IgKiBzaXplb2Yoc3RydWN0IHJpbmdfZGVzY3JfaHcpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzdy1yaW5nIGRlc2NyaXB0b3JzIGNvbnNpc3RzIG9mIGEgYnVzLW1hcHBlZCB0cmFuc2ZlciBidWZmZXIgd2l0aAorICogYXNzb2NpYXRlZCBza2IgYW5kIGEgcG9pbnRlciB0byB0aGUgaHcgZW50cnkgZGVzY3JpcHRvcgorICovCisKK3N0cnVjdCByaW5nX2Rlc2NyIHsKKwlzdHJ1Y3QgcmluZ19kZXNjcl9odwkqaHc7CisJc3RydWN0IHNrX2J1ZmYJCSpza2I7CisJdm9pZAkJCSpidWY7Cit9OworCisvKiB3cmFwcGVycyBmb3Igb3BlcmF0aW9ucyBvbiBody1leHBvc2VkIHJpbmcgZGVzY3JpcHRvcnMKKyAqIGFjY2VzcyB0byB0aGUgaHctcGFydCBvZiB0aGUgZGVzY3JpcHRvcnMgbXVzdCB1c2UgdGhlc2UuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgcmRfaXNfYWN0aXZlKHN0cnVjdCByaW5nX2Rlc2NyICpyZCkKK3sKKwlyZXR1cm4gKChyZC0+aHctPnJkX3N0YXR1cyAmIFJEX0FDVElWRSkgIT0gMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZF9hY3RpdmF0ZShzdHJ1Y3QgcmluZ19kZXNjciAqcmQpCit7CisJcmQtPmh3LT5yZF9zdGF0dXMgfD0gUkRfQUNUSVZFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmRfc2V0X3N0YXR1cyhzdHJ1Y3QgcmluZ19kZXNjciAqcmQsIHU4IHMpCit7CisJcmQtPmh3LT5yZF9zdGF0dXMgPSBzOwkgLyogbWF5IHBhc3Mgb3duZXJzaGlwIHRvIHRoZSBoYXJkd2FyZSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmRfc2V0X2FkZHJfc3RhdHVzKHN0cnVjdCByaW5nX2Rlc2NyICpyZCwgZG1hX2FkZHJfdCBhLCB1OCBzKQoreworCS8qIG9yZGVyIGlzIGltcG9ydGFudCBmb3IgdHdvIHJlYXNvbnM6CisJICogIC0gb3ZlcmxheWVkOiB3cml0aW5nIGFkZHIgb3ZlcndyaXRlcyBzdGF0dXMKKwkgKiAgLSB3ZSB3YW50IHRvIHdyaXRlIHN0YXR1cyBsYXN0IHNvIHdlIGhhdmUgdmFsaWQgYWRkcmVzcyBpbgorCSAqICAgIGNhc2Ugc3RhdHVzIGhhcyBSRF9BQ1RJVkUgc2V0CisJICovCisKKwlpZiAoKGEgJiB+RE1BX01BU0tfTVNUUlBBR0UpPj4yNCAhPSBNU1RSUEFHRV9WQUxVRSkgeworCQlJUkRBX0VSUk9SKCIlczogcGNpIGJ1c2FkZHIgaW5jb25zaXN0ZW5jeSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWR1bXBfc3RhY2soKTsKKwkJcmV0dXJuOworCX0KKworCWEgJj0gRE1BX01BU0tfTVNUUlBBR0U7ICAvKiBjbGVhciBoaWdoYnl0ZSB0byBtYWtlIHN1cmUgd2Ugd29uJ3Qgd3JpdGUKKwkJCQkgICogdG8gc3RhdHVzIC0ganVzdCBpbiBjYXNlIE1TVFJQQUdFX1ZBTFVFIT0wCisJCQkJICAqLworCXJkLT5ody0+cmRfYWRkciA9IGNwdV90b19sZTMyKGEpOworCXdtYigpOworCXJkX3NldF9zdGF0dXMocmQsIHMpOwkgLyogbWF5IHBhc3Mgb3duZXJzaGlwIHRvIHRoZSBoYXJkd2FyZSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmRfc2V0X2NvdW50KHN0cnVjdCByaW5nX2Rlc2NyICpyZCwgdTE2IGMpCit7CisJcmQtPmh3LT5yZF9jb3VudCA9IGNwdV90b19sZTE2KGMpOworfQorCitzdGF0aWMgaW5saW5lIHU4IHJkX2dldF9zdGF0dXMoc3RydWN0IHJpbmdfZGVzY3IgKnJkKQoreworCXJldHVybiByZC0+aHctPnJkX3N0YXR1czsKK30KKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IHJkX2dldF9hZGRyKHN0cnVjdCByaW5nX2Rlc2NyICpyZCkKK3sKKwlkbWFfYWRkcl90CWE7CisKKwlhID0gbGUzMl90b19jcHUocmQtPmh3LT5yZF9hZGRyKTsKKwlyZXR1cm4gKGEgJiBETUFfTUFTS19NU1RSUEFHRSkgfCAoTVNUUlBBR0VfVkFMVUUgPDwgMjQpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiByZF9nZXRfY291bnQoc3RydWN0IHJpbmdfZGVzY3IgKnJkKQoreworCXJldHVybiBsZTE2X3RvX2NwdShyZC0+aHctPnJkX2NvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc3cgZGVzY3JpcHRvciByaW5ncyBmb3IgcngsIHR4OgorICoKKyAqIG9wZXJhdGlvbnMgZm9sbG93IHByb2R1Y2VyLWNvbnN1bWVyIHBhcmFkaWdtLCB3aXRoIHRoZSBodworICogaW4gdGhlIG1pZGRsZSBkb2luZyB0aGUgcHJvY2Vzc2luZy4KKyAqIHJpbmcgc2l6ZSBtdXN0IGJlIHBvd2VyIG9mIHR3by4KKyAqCisgKiBwcm9kdWNlciBhZHZhbmNlcyByLT50YWlsIGFmdGVyIGluc2VydGluZyBmb3IgcHJvY2Vzc2luZworICogY29uc3VtZXIgYWR2YW5jZXMgci0+aGVhZCBhZnRlciByZW1vdmluZyBwcm9jZXNzZWQgcmQKKyAqIHJpbmcgaXMgZW1wdHkgaWYgaGVhZD09dGFpbCAvIGZ1bGwgaWYgKHRhaWwrMSk9PWhlYWQKKyAqLworCitzdHJ1Y3QgdmxzaV9yaW5nIHsKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisJaW50CQkJZGlyOworCXVuc2lnbmVkCQlsZW47CisJdW5zaWduZWQJCXNpemU7CisJdW5zaWduZWQJCW1hc2s7CisJYXRvbWljX3QJCWhlYWQsIHRhaWw7CisJc3RydWN0IHJpbmdfZGVzY3IJKnJkOworfTsKKworLyogcmluZyBwcm9jZXNzaW5nIGhlbHBlcnMgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmluZ19kZXNjciAqcmluZ19sYXN0KHN0cnVjdCB2bHNpX3JpbmcgKnIpCit7CisJaW50IHQ7CisKKwl0ID0gYXRvbWljX3JlYWQoJnItPnRhaWwpICYgci0+bWFzazsKKwlyZXR1cm4gKCgodCsxKSAmIHItPm1hc2spID09IChhdG9taWNfcmVhZCgmci0+aGVhZCkgJiByLT5tYXNrKSkgPyBOVUxMIDogJnItPnJkW3RdOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCByaW5nX2Rlc2NyICpyaW5nX3B1dChzdHJ1Y3QgdmxzaV9yaW5nICpyKQoreworCWF0b21pY19pbmMoJnItPnRhaWwpOworCXJldHVybiByaW5nX2xhc3Qocik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJpbmdfZGVzY3IgKnJpbmdfZmlyc3Qoc3RydWN0IHZsc2lfcmluZyAqcikKK3sKKwlpbnQgaDsKKworCWggPSBhdG9taWNfcmVhZCgmci0+aGVhZCkgJiByLT5tYXNrOworCXJldHVybiAoaCA9PSAoYXRvbWljX3JlYWQoJnItPnRhaWwpICYgci0+bWFzaykpID8gTlVMTCA6ICZyLT5yZFtoXTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmluZ19kZXNjciAqcmluZ19nZXQoc3RydWN0IHZsc2lfcmluZyAqcikKK3sKKwlhdG9taWNfaW5jKCZyLT5oZWFkKTsKKwlyZXR1cm4gcmluZ19maXJzdChyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogb3VyIHByaXZhdGUgY29tcG91bmQgVkxTSS1QQ0ktSVJEQSBkZXZpY2UgaW5mb3JtYXRpb24gKi8KKwordHlwZWRlZiBzdHJ1Y3QgdmxzaV9pcmRhX2RldiB7CisJc3RydWN0IHBjaV9kZXYJCSpwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCisJc3RydWN0IGlybGFwX2NiCQkqaXJsYXA7CisKKwlzdHJ1Y3QgcW9zX2luZm8JCXFvczsKKworCXVuc2lnbmVkCQltb2RlOworCWludAkJCWJhdWQsIG5ld19iYXVkOworCisJZG1hX2FkZHJfdAkJYnVzYWRkcjsKKwl2b2lkCQkJKnZpcnRhZGRyOworCXN0cnVjdCB2bHNpX3JpbmcJKnR4X3JpbmcsICpyeF9yaW5nOworCisJc3RydWN0IHRpbWV2YWwJCWxhc3Rfcng7CisKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCBzZW1hcGhvcmUJc2VtOworCisJdTgJCQlyZXN1bWVfb2s7CQorCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19lbnRyeTsKKworfSB2bHNpX2lyZGFfZGV2X3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogdGhlIHJlbWFwcGVkIGVycm9yIGZsYWdzIHdlIHVzZSBmb3IgcmV0dXJuaW5nIGZyb20gZnJhbWUKKyAqIHBvc3QtcHJvY2Vzc2luZyBpbiB2bHNpX3Byb2Nlc3NfdHgvcngoKSBhZnRlciBpdCB3YXMgY29tcGxldGVkCisgKiBieSB0aGUgaGFyZHdhcmUuIFRoZXNlIGZ1bmN0aW9ucyBlaXRoZXIgcmV0dXJuIHRoZSA+PTAgbnVtYmVyCisgKiBvZiB0cmFuc2ZlcmVkIGJ5dGVzIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciB0aGUgbmVnYXRpdmUgKC0pCisgKiBvZiB0aGUgb3InZWQgZXJyb3IgZmxhZ3MuCisgKi8KKworI2RlZmluZSBWTFNJX1RYX0RST1AJCTB4MDAwMQorI2RlZmluZSBWTFNJX1RYX0ZJRk8JCTB4MDAwMgorCisjZGVmaW5lIFZMU0lfUlhfRFJPUAkJMHgwMTAwCisjZGVmaW5lIFZMU0lfUlhfT1ZFUgkJMHgwMjAwCisjZGVmaW5lIFZMU0lfUlhfTEVOR1RIICAJMHgwNDAwCisjZGVmaW5lIFZMU0lfUlhfRlJBTUUJCTB4MDgwMAorI2RlZmluZSBWTFNJX1JYX0NSQwkJMHgxMDAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmIC8qIElSREFfVkxTSV9GSVJfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmLmggYi9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0NzZjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWYuaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIFc4Mzk3N0FGX0gKKyNkZWZpbmUgVzgzOTc3QUZfSAorCisjZGVmaW5lIFc5NzdfRUZJT19CQVNFIDB4MzcwCisjZGVmaW5lIFc5NzdfRUZJTzJfQkFTRSAweDNmMAorI2RlZmluZSBXOTc3X0RFVklDRV9JUiAweDA2CisKKworLyoKKyAqIEVudGVyIGV4dGVuZGVkIGZ1bmN0aW9uIG1vZGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHc5NzdfZWZtX2VudGVyKHVuc2lnbmVkIGludCBlZmlvKQoreworICAgICAgICBvdXRiKDB4ODcsIGVmaW8pOworICAgICAgICBvdXRiKDB4ODcsIGVmaW8pOworfQorCisvKgorICogU2VsZWN0IGEgZGV2aWNlIHRvIGNvbmZpZ3VyZSAKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdzk3N19zZWxlY3RfZGV2aWNlKF9fdTggZGV2bnVtLCB1bnNpZ25lZCBpbnQgZWZpbykKK3sKKwlvdXRiKDB4MDcsIGVmaW8pOworCW91dGIoZGV2bnVtLCBlZmlvKzEpOworfSAKKworLyogCisgKiBXcml0ZSBhIGJ5dGUgdG8gYSByZWdpc3RlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdzk3N193cml0ZV9yZWcoX191OCByZWcsIF9fdTggdmFsdWUsIHVuc2lnbmVkIGludCBlZmlvKQoreworCW91dGIocmVnLCBlZmlvKTsKKwlvdXRiKHZhbHVlLCBlZmlvKzEpOworfQorCisvKgorICogcmVhZCBhIGJ5dGUgZnJvbSBhIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgX191OCB3OTc3X3JlYWRfcmVnKF9fdTggcmVnLCB1bnNpZ25lZCBpbnQgZWZpbykKK3sKKwlvdXRiKHJlZywgZWZpbyk7CisJcmV0dXJuIGluYihlZmlvKzEpOworfQorCisvKgorICogRXhpdCBleHRlbmRlZCBmdW5jdGlvbiBtb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3OTc3X2VmbV9leGl0KHVuc2lnbmVkIGludCBlZmlvKQoreworCW91dGIoMHhBQSwgZWZpbyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWE2NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jCkBAIC0wLDAgKzEsMTM3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICB3ODM5NzdhZl9pci5jCisgKiBWZXJzaW9uOiAgICAgICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIEZJUiBkcml2ZXIgZm9yIHRoZSBXaW5ib25kIFc4Mzk3N0FGIFN1cGVyIEkvTyBjaGlwCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBQYXVsIFZhbmRlclNwZWsKKyAqIENyZWF0ZWQgYXQ6ICAgIFdlZCBOb3YgIDQgMTE6NDY6MTYgMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgRnJpIEphbiAyOCAxMjoxMDo1OSAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgUmViZWwuY29tCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgTmVpdGhlciBQYXVsIFZhbmRlclNwZWsgbm9yIFJlYmVsLmNvbSBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUKKyAqICAgICB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgIkFTLUlTIgorICogICAgIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKiAgICAgSWYgeW91IGZpbmQgYnVncyBpbiB0aGlzIGZpbGUsIGl0cyB2ZXJ5IGxpa2VseSB0aGF0IHRoZSBzYW1lIGJ1ZworICogICAgIHdpbGwgYWxzbyBiZSBpbiBwYzg3MTA4LmMgc2luY2UgdGhlIGltcGxlbWVudGF0aW9ucyBhcmUgcXVpdGUKKyAqICAgICBzaW1pbGFyLgorICoKKyAqICAgICBOb3RpY2UgdGhhdCBhbGwgZnVuY3Rpb25zIHRoYXQgbmVlZHMgdG8gYWNjZXNzIHRoZSBjaGlwIGluIF9hbnlfCisgKiAgICAgd2F5LCBtdXN0IHNhdmUgQlNSIHJlZ2lzdGVyIG9uIGVudHJ5LCBhbmQgcmVzdG9yZSBpdCBvbiBleGl0LiAKKyAqICAgICBJdCBpcyBfdmVyeV8gaW1wb3J0YW50IHRvIGZvbGxvdyB0aGlzIHBvbGljeSEKKyAqCisgKiAgICAgICAgIF9fdTggYmFuazsKKyAqICAgICAKKyAqICAgICAgICAgYmFuayA9IGluYiggaW9iYXNlK0JTUik7CisgKiAgCisgKiAgICAgICAgIGRvX3lvdXJfc3R1ZmZfaGVyZSgpOworICoKKyAqICAgICAgICAgb3V0YiggYmFuaywgaW9iYXNlK0JTUik7CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+IAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorI2luY2x1ZGUgInc4Mzk3N2FmLmgiCisjaW5jbHVkZSAidzgzOTc3YWZfaXIuaCIKKworI2lmZGVmICBDT05GSUdfQVJDSF9ORVRXSU5ERVIgICAgICAgICAgICAvKiBBZGp1c3QgdG8gTmV0V2luZGVyIGRpZmZlcmVuY2VzICovCisjdW5kZWYgIENPTkZJR19ORVRXSU5ERVJfVFhfRE1BX1BST0JMRU1TIC8qIE5vdCBuZWVkZWQgKi8KKyNkZWZpbmUgQ09ORklHX05FVFdJTkRFUl9SWF9ETUFfUFJPQkxFTVMgLyogTXVzdCBoYXZlIHRoaXMgb25lISAqLworI2VuZGlmCisjdW5kZWYgIENPTkZJR19VU0VfSU5URVJOQUxfVElNRVIgIC8qIEp1c3QgY2Fubm90IG1ha2UgdGhhdCB0aW1lciB3b3JrICovCisjZGVmaW5lIENPTkZJR19VU0VfVzk3N19QTlAgICAgICAgIC8qIEN1cnJlbnRseSBuZWVkZWQgKi8KKyNkZWZpbmUgUElPX01BWF9TUEVFRCAgICAgICAxMTUyMDAgCisKK3N0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9ICJ3ODM5NzdhZl9pciI7CitzdGF0aWMgaW50ICBxb3NfbXR0X2JpdHMgPSAweDA3OyAgIC8qIDEgbXMgb3IgbW9yZSAqLworCisjZGVmaW5lIENISVBfSU9fRVhURU5UIDgKKworc3RhdGljIHVuc2lnbmVkIGludCBpb1tdID0geyAweDE4MCwgfjAsIH4wLCB+MCB9OworI2lmZGVmIENPTkZJR19BUkNIX05FVFdJTkRFUiAgICAgICAgICAgICAvKiBBZGp1c3QgdG8gTmV0V2luZGVyIGRpZmZlcmVuY2VzICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlycVtdID0geyA2LCAwLCAwLCAwIH07CisjZWxzZQorc3RhdGljIHVuc2lnbmVkIGludCBpcnFbXSA9IHsgMTEsIDAsIDAsIDAgfTsKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludCBkbWFbXSA9IHsgMSwgMCwgMCwgMCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBlZmJhc2VbXSA9IHsgVzk3N19FRklPX0JBU0UsIFc5NzdfRUZJTzJfQkFTRSB9Oworc3RhdGljIHVuc2lnbmVkIGludCBlZmlvID0gVzk3N19FRklPX0JBU0U7CisKK3N0YXRpYyBzdHJ1Y3QgdzgzOTc3YWZfaXIgKmRldl9zZWxmW10gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9OworCisvKiBTb21lIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgIHc4Mzk3N2FmX29wZW4oaW50IGksIHVuc2lnbmVkIGludCBpb2Jhc2UsIHVuc2lnbmVkIGludCBpcnEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZG1hKTsKK3N0YXRpYyBpbnQgIHc4Mzk3N2FmX2Nsb3NlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZik7CitzdGF0aWMgaW50ICB3ODM5NzdhZl9wcm9iZShpbnQgaW9iYXNlLCBpbnQgaXJxLCBpbnQgZG1hKTsKK3N0YXRpYyBpbnQgIHc4Mzk3N2FmX2RtYV9yZWNlaXZlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZik7IAorc3RhdGljIGludCAgdzgzOTc3YWZfZG1hX3JlY2VpdmVfY29tcGxldGUoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmKTsKK3N0YXRpYyBpbnQgIHc4Mzk3N2FmX2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIHc4Mzk3N2FmX3Bpb193cml0ZShpbnQgaW9iYXNlLCBfX3U4ICpidWYsIGludCBsZW4sIGludCBmaWZvX3NpemUpOworc3RhdGljIHZvaWQgdzgzOTc3YWZfZG1hX3dyaXRlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZiwgaW50IGlvYmFzZSk7CitzdGF0aWMgdm9pZCB3ODM5NzdhZl9jaGFuZ2Vfc3BlZWQoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmLCBfX3UzMiBzcGVlZCk7CitzdGF0aWMgaW50ICB3ODM5NzdhZl9pc19yZWNlaXZpbmcoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmKTsKKworc3RhdGljIGludCAgdzgzOTc3YWZfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICB3ODM5NzdhZl9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICB3ODM5NzdhZl9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnc4Mzk3N2FmX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9pbml0ICgpCisgKgorICogICAgSW5pdGlhbGl6ZSBjaGlwLiBKdXN0IHRyeSB0byBmaW5kIG91dCBob3cgbWFueSBjaGlwcyB3ZSBhcmUgZGVhbGluZyB3aXRoCisgKiAgICBhbmQgd2hlcmUgdGhleSBhcmUKKyAqLworc3RhdGljIGludCBfX2luaXQgdzgzOTc3YWZfaW5pdCh2b2lkKQoreworICAgICAgICBpbnQgaTsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJZm9yIChpPTA7IChpb1tpXSA8IDIwMDApICYmIChpIDwgNCk7IGkrKykgeyAKKwkJaWYgKHc4Mzk3N2FmX29wZW4oaSwgaW9baV0sIGlycVtpXSwgZG1hW2ldKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfY2xlYW51cCAoKQorICoKKyAqICAgIENsb3NlIGFsbCBjb25maWd1cmVkIGNoaXBzCisgKgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgdzgzOTc3YWZfY2xlYW51cCh2b2lkKQoreworCWludCBpOworCisgICAgICAgIElSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJZm9yIChpPTA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKGRldl9zZWxmW2ldKQorCQkJdzgzOTc3YWZfY2xvc2UoZGV2X3NlbGZbaV0pOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX29wZW4gKGlvYmFzZSwgaXJxKQorICoKKyAqICAgIE9wZW4gZHJpdmVyIGluc3RhbmNlCisgKgorICovCitpbnQgdzgzOTc3YWZfb3BlbihpbnQgaSwgdW5zaWduZWQgaW50IGlvYmFzZSwgdW5zaWduZWQgaW50IGlycSwgCisJCSAgdW5zaWduZWQgaW50IGRtYSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgICAgICBzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGY7CisJaW50IGVycjsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogTG9jayB0aGUgcG9ydCB0aGF0IHdlIG5lZWQgKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgQ0hJUF9JT19FWFRFTlQsIGRyaXZlcl9uYW1lKSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBjYW4ndCBnZXQgaW9iYXNlIG9mIDB4JTAzeFxuIiwKKwkJICAgICAgX19GVU5DVElPTl9fICwgaW9iYXNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHc4Mzk3N2FmX3Byb2JlKGlvYmFzZSwgaXJxLCBkbWEpID09IC0xKSB7CisJCWVyciA9IC0xOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qCisJICogIEFsbG9jYXRlIG5ldyBpbnN0YW5jZSBvZiB0aGUgZHJpdmVyCisJICovCisJZGV2ID0gYWxsb2NfaXJkYWRldihzaXplb2Yoc3RydWN0IHc4Mzk3N2FmX2lyKSk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayggS0VSTl9FUlIgIklyREE6IENhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgIgorCQkJIklyREEgY29udHJvbCBibG9jayFcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJc2VsZiA9IGRldi0+cHJpdjsKKwlzcGluX2xvY2tfaW5pdCgmc2VsZi0+bG9jayk7CisgICAKKworCS8qIEluaXRpYWxpemUgSU8gKi8KKwlzZWxmLT5pby5maXJfYmFzZSAgID0gaW9iYXNlOworICAgICAgICBzZWxmLT5pby5pcnEgICAgICAgPSBpcnE7CisgICAgICAgIHNlbGYtPmlvLmZpcl9leHQgICA9IENISVBfSU9fRVhURU5UOworICAgICAgICBzZWxmLT5pby5kbWEgICAgICAgPSBkbWE7CisgICAgICAgIHNlbGYtPmlvLmZpZm9fc2l6ZSA9IDMyOworCisJLyogSW5pdGlhbGl6ZSBRb1MgZm9yIHRoaXMgZGV2aWNlICovCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc2VsZi0+cW9zKTsKKwkKKwkvKiBUaGUgb25seSB2YWx1ZSB3ZSBtdXN0IG92ZXJyaWRlIGl0IHRoZSBiYXVkcmF0ZSAqLworCisJLyogRklYTUU6IFRoZSBIUCBIRExTLTExMDAgZG9lcyBub3Qgc3VwcG9ydCAxMTUyMDAwISAqLworCXNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyA9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8CisJCUlSXzExNTIwMHxJUl81NzYwMDB8SVJfMTE1MjAwMHwoSVJfNDAwMDAwMCA8PCA4KTsKKworCS8qIFRoZSBIUCBIRExTLTExMDAgbmVlZHMgMSBtcyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNzICovCisJc2VsZi0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyA9IHFvc19tdHRfYml0czsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZzZWxmLT5xb3MpOworCQorCS8qIE1heCBETUEgYnVmZmVyIHNpemUgbmVlZGVkID0gKGRhdGFfc2l6ZSArIDYpICogKHdpbmRvd19zaXplKSArIDY7ICovCisJc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSA9IDE0Mzg0OyAKKwlzZWxmLT50eF9idWZmLnRydWVzaXplID0gNDAwMDsKKwkKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgaWYgbmVlZGVkICovCisJc2VsZi0+cnhfYnVmZi5oZWFkID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICAgJnNlbGYtPnJ4X2J1ZmZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+cnhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0MTsKKwl9CisKKwltZW1zZXQoc2VsZi0+cnhfYnVmZi5oZWFkLCAwLCBzZWxmLT5yeF9idWZmLnRydWVzaXplKTsKKwkKKwlzZWxmLT50eF9idWZmLmhlYWQgPQorCQlkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgICAmc2VsZi0+dHhfYnVmZl9kbWEsIEdGUF9LRVJORUwpOworCWlmIChzZWxmLT50eF9idWZmLmhlYWQgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQyOworCX0KKwltZW1zZXQoc2VsZi0+dHhfYnVmZi5oZWFkLCAwLCBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKKworCXNlbGYtPnJ4X2J1ZmYuaW5fZnJhbWUgPSBGQUxTRTsKKwlzZWxmLT5yeF9idWZmLnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisJc2VsZi0+cnhfYnVmZi5kYXRhID0gc2VsZi0+cnhfYnVmZi5oZWFkOworCXNlbGYtPm5ldGRldiA9IGRldjsKKworCS8qIEtlZXAgdHJhY2sgb2YgbW9kdWxlIHVzYWdlICovCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJLyogT3ZlcnJpZGUgdGhlIG5ldHdvcmsgZnVuY3Rpb25zIHdlIG5lZWQgdG8gdXNlICovCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB3ODM5NzdhZl9oYXJkX3htaXQ7CisJZGV2LT5vcGVuICAgICAgICAgICAgPSB3ODM5NzdhZl9uZXRfb3BlbjsKKwlkZXYtPnN0b3AgICAgICAgICAgICA9IHc4Mzk3N2FmX25ldF9jbG9zZTsKKwlkZXYtPmRvX2lvY3RsICAgICAgICA9IHc4Mzk3N2FmX25ldF9pb2N0bDsKKwlkZXYtPmdldF9zdGF0cwkgICAgID0gdzgzOTc3YWZfbmV0X2dldF9zdGF0czsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgcmVnaXN0ZXJfbmV0ZGV2aWNlKCkgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBlcnJfb3V0MzsKKwl9CisJSVJEQV9NRVNTQUdFKCJJckRBOiBSZWdpc3RlcmVkIGRldmljZSAlc1xuIiwgZGV2LT5uYW1lKTsKKworCS8qIE5lZWQgdG8gc3RvcmUgc2VsZiBzb21ld2hlcmUgKi8KKwlkZXZfc2VsZltpXSA9IHNlbGY7CisJCisJcmV0dXJuIDA7CitlcnJfb3V0MzoKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT50eF9idWZmLnRydWVzaXplLAorCQkJICBzZWxmLT50eF9idWZmLmhlYWQsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKK2Vycl9vdXQyOgkKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKK2Vycl9vdXQxOgorCWZyZWVfbmV0ZGV2KGRldik7CitlcnJfb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYmFzZSwgQ0hJUF9JT19FWFRFTlQpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9jbG9zZSAoc2VsZikKKyAqCisgKiAgICBDbG9zZSBkcml2ZXIgaW5zdGFuY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgdzgzOTc3YWZfY2xvc2Uoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmKQoreworCWludCBpb2Jhc2U7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworICAgICAgICBpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworI2lmZGVmIENPTkZJR19VU0VfVzk3N19QTlAKKwkvKiBlbnRlciBQblAgY29uZmlndXJhdGlvbiBtb2RlICovCisJdzk3N19lZm1fZW50ZXIoZWZpbyk7CisKKwl3OTc3X3NlbGVjdF9kZXZpY2UoVzk3N19ERVZJQ0VfSVIsIGVmaW8pOworCisJLyogRGVhY3RpdmF0ZSBkZXZpY2UgKi8KKwl3OTc3X3dyaXRlX3JlZygweDMwLCAweDAwLCBlZmlvKTsKKworCXc5NzdfZWZtX2V4aXQoZWZpbyk7CisjZW5kaWYgLyogQ09ORklHX1VTRV9XOTc3X1BOUCAqLworCisJLyogUmVtb3ZlIG5ldGRldmljZSAqLworCXVucmVnaXN0ZXJfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisKKwkvKiBSZWxlYXNlIHRoZSBQT1JUIHRoYXQgdGhpcyBkcml2ZXIgaXMgdXNpbmcgKi8KKwlJUkRBX0RFQlVHKDAgLCAiJXMoKSwgUmVsZWFzaW5nIFJlZ2lvbiAlMDN4XG4iLCAKKwkgICAgICBfX0ZVTkNUSU9OX18gLCBzZWxmLT5pby5maXJfYmFzZSk7CisJcmVsZWFzZV9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQpOworCisJaWYgKHNlbGYtPnR4X2J1ZmYuaGVhZCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgIHNlbGYtPnR4X2J1ZmYuaGVhZCwgc2VsZi0+dHhfYnVmZl9kbWEpOworCQorCWlmIChzZWxmLT5yeF9idWZmLmhlYWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKKworCWZyZWVfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHc4Mzk3N2FmX3Byb2JlKCBpbnQgaW9iYXNlLCBpbnQgaXJxLCBpbnQgZG1hKQoreworICAJaW50IHZlcnNpb247CisJaW50IGk7CisgIAkKKyAJZm9yIChpPTA7IGkgPCAyOyBpKyspIHsKKyAJCUlSREFfREVCVUcoIDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKyNpZmRlZiBDT05GSUdfVVNFX1c5NzdfUE5QCisgCQkvKiBFbnRlciBQblAgY29uZmlndXJhdGlvbiBtb2RlICovCisJCXc5NzdfZWZtX2VudGVyKGVmYmFzZVtpXSk7CisgIAorIAkJdzk3N19zZWxlY3RfZGV2aWNlKFc5NzdfREVWSUNFX0lSLCBlZmJhc2VbaV0pOworICAKKyAJCS8qIENvbmZpZ3VyZSBQblAgcG9ydCwgSVJRLCBhbmQgRE1BIGNoYW5uZWwgKi8KKyAJCXc5Nzdfd3JpdGVfcmVnKDB4NjAsIChpb2Jhc2UgPj4gOCkgJiAweGZmLCBlZmJhc2VbaV0pOworIAkJdzk3N193cml0ZV9yZWcoMHg2MSwgKGlvYmFzZSkgJiAweGZmLCBlZmJhc2VbaV0pOworICAKKyAJCXc5Nzdfd3JpdGVfcmVnKDB4NzAsIGlycSwgZWZiYXNlW2ldKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9ORVRXSU5ERVIKKwkJLyogTmV0d2luZGVyIHVzZXMgMSBoaWdoZXIgdGhhbiBMaW51eCAqLworIAkJdzk3N193cml0ZV9yZWcoMHg3NCwgZG1hKzEsIGVmYmFzZVtpXSk7CisjZWxzZQorIAkJdzk3N193cml0ZV9yZWcoMHg3NCwgZG1hLCBlZmJhc2VbaV0pOyAgIAorI2VuZGlmIC8qQ09ORklHX0FSQ0hfTkVUV0lOREVSICovCisgCQl3OTc3X3dyaXRlX3JlZygweDc1LCAweDA0LCBlZmJhc2VbaV0pOyAgLyogRGlzYWJsZSBUeCBETUEgKi8KKyAgCQorIAkJLyogU2V0IGFwcGVuZCBoYXJkd2FyZSBDUkMsIGVuYWJsZSBJUiBiYW5rIHNlbGVjdGlvbiAqLwkKKyAJCXc5Nzdfd3JpdGVfcmVnKDB4ZjAsIEFQRURDUkN8RU5CTktTRUwsIGVmYmFzZVtpXSk7CisgIAorIAkJLyogQWN0aXZhdGUgZGV2aWNlICovCisgCQl3OTc3X3dyaXRlX3JlZygweDMwLCAweDAxLCBlZmJhc2VbaV0pOworICAKKyAJCXc5NzdfZWZtX2V4aXQoZWZiYXNlW2ldKTsKKyNlbmRpZiAvKiBDT05GSUdfVVNFX1c5NzdfUE5QICovCisgIAkJLyogRGlzYWJsZSBBZHZhbmNlZCBtb2RlICovCisgIAkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQyKTsKKyAgCQlvdXRiKGlvYmFzZSsyLCAweDAwKTsgIAorIAorIAkJLyogVHVybiBvbiBVQVJUIChnbG9iYWwpIGludGVycnVwdHMgKi8KKyAJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CisgIAkJb3V0YihIQ1JfRU5fSVJRLCBpb2Jhc2UrSENSKTsKKyAgCQorICAJCS8qIFN3aXRjaCB0byBhZHZhbmNlZCBtb2RlICovCisgIAkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQyKTsKKyAgCQlvdXRiKGluYihpb2Jhc2UrQURDUjEpIHwgQURDUjFfQURWX1NMLCBpb2Jhc2UrQURDUjEpOworICAKKyAgCQkvKiBTZXQgZGVmYXVsdCBJUi1tb2RlICovCisgIAkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKyAgCQlvdXRiKEhDUl9TSVIsIGlvYmFzZStIQ1IpOworICAKKyAgCQkvKiBSZWFkIHRoZSBBZHZhbmNlZCBJUiBJRCAqLworICAJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMyk7CisgIAkJdmVyc2lvbiA9IGluYihpb2Jhc2UrQVVJRCk7CisgIAkKKyAgCQkvKiBTaG91bGQgYmUgMHgxPyAqLworICAJCWlmICgweDEwID09ICh2ZXJzaW9uICYgMHhmMCkpIHsKKyAJCQllZmlvID0gZWZiYXNlW2ldOworIAorIAkJCS8qIFNldCBGSUZPIHNpemUgdG8gMzIgKi8KKyAJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDIpOworIAkJCW91dGIoQURDUjJfUlhGUzMyfEFEQ1IyX1RYRlMzMiwgaW9iYXNlK0FEQ1IyKTsJCisgCQorIAkJCS8qIFNldCBGSUZPIHRocmVzaG9sZCB0byBUWDE3LCBSWDE2ICovCisgCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsJCisgCQkJb3V0YihVRlJfUlhUTHxVRlJfVFhUTHxVRlJfVFhGX1JTVHxVRlJfUlhGX1JTVHwKKwkJCSAgICAgVUZSX0VOX0ZJRk8saW9iYXNlK1VGUik7CisgCisgCQkJLyogUmVjZWl2ZXIgZnJhbWUgbGVuZ3RoICovCisgCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQ0KTsKKwkJCW91dGIoMjA0OCAmIDB4ZmYsIGlvYmFzZSs2KTsKKwkJCW91dGIoKDIwNDggPj4gOCkgJiAweDFmLCBpb2Jhc2UrNyk7CisKKwkJCS8qIAorCQkJICogSW5pdCBIUCBIU0RMLTExMDAgdHJhbnNjZWl2ZXIuIAorCQkJICogCisJCQkgKiBTZXQgSVJYX01TTCBzaW5jZSB3ZSBoYXZlIDIgKiByZWNlaXZlIHBhdGhzIElSUlgsIAorCQkJICogYW5kIElSUlhILiBDbGVhciBJUlNMMEQgc2luY2Ugd2Ugd2FudCBJUlNMMCAqIHRvIAorCQkJICogYmUgYSBpbnB1dCBwaW4gdXNlZCBmb3IgSVJSWEggCisJCQkgKgorCQkJICogICBJUlJYICBwaW4gMzcgY29ubmVjdGVkIHRvIHJlY2VpdmVyIAorCQkJICogICBJUlRYICBwaW4gMzggY29ubmVjdGVkIHRvIHRyYW5zbWl0dGVyCisJCQkgKiAgIEZJUlJYIHBpbiAzOSBjb25uZWN0ZWQgdG8gcmVjZWl2ZXIgICAgICAoSVJTTDApIAorCQkJICogICBDSVJSWCBwaW4gNDAgY29ubmVjdGVkIHRvIHBpbiAzNworCQkJICovCisJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDcpOworCQkJb3V0YigweDQwLCBpb2Jhc2UrNyk7CisJCQkKKwkJCUlSREFfTUVTU0FHRSgiVzgzOTc3QUYgKElSKSBkcml2ZXIgbG9hZGVkLiAiCisJCQkJICAgICAiVmVyc2lvbjogMHglMDJ4XG4iLCB2ZXJzaW9uKTsKKwkJCQorCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkvKiBUcnkgbmV4dCBleHRlbnRlZCBmdW5jdGlvbiByZWdpc3RlciBhZGRyZXNzICovCisJCQlJUkRBX0RFQlVHKCAwLCAiJXMoKSwgV3JvbmcgY2hpcCB2ZXJzaW9uIiwgX19GVU5DVElPTl9fICk7CisJCX0KKyAgCX0gICAJCisJcmV0dXJuIC0xOworfQorCit2b2lkIHc4Mzk3N2FmX2NoYW5nZV9zcGVlZChzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGYsIF9fdTMyIHNwZWVkKQoreworCWludCBpcl9tb2RlID0gSENSX1NJUjsKKwlpbnQgaW9iYXNlOyAKKwlfX3U4IHNldDsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogVXBkYXRlIGFjY291bnRpbmcgZm9yIG5ldyBzcGVlZCAqLworCXNlbGYtPmlvLnNwZWVkID0gc3BlZWQ7CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CisJb3V0YigwLCBpb2Jhc2UrSUNSKTsKKworCS8qIFNlbGVjdCBTZXQgMiAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMik7CisJb3V0YigweDAwLCBpb2Jhc2UrQUJITCk7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSA5NjAwOiAgIG91dGIoMHgwYywgaW9iYXNlK0FCTEwpOyBicmVhazsKKwljYXNlIDE5MjAwOiAgb3V0YigweDA2LCBpb2Jhc2UrQUJMTCk7IGJyZWFrOworCWNhc2UgMzg0MDA6ICBvdXRiKDB4MDMsIGlvYmFzZStBQkxMKTsgYnJlYWs7CisJY2FzZSA1NzYwMDogIG91dGIoMHgwMiwgaW9iYXNlK0FCTEwpOyBicmVhazsKKwljYXNlIDExNTIwMDogb3V0YigweDAxLCBpb2Jhc2UrQUJMTCk7IGJyZWFrOworCWNhc2UgNTc2MDAwOgorCQlpcl9tb2RlID0gSENSX01JUl81NzY7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGhhbmRsaW5nIGJhdWQgb2YgNTc2MDAwXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJY2FzZSAxMTUyMDAwOgorCQlpcl9tb2RlID0gSENSX01JUl8xMTUyOworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBoYW5kbGluZyBiYXVkIG9mIDExNTIwMDBcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwljYXNlIDQwMDAwMDA6CisJCWlyX21vZGUgPSBIQ1JfRklSOworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBoYW5kbGluZyBiYXVkIG9mIDQwMDAwMDBcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpcl9tb2RlID0gSENSX0ZJUjsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5rbm93biBiYXVkIHJhdGUgb2YgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIHNwZWVkKTsKKwkJYnJlYWs7CisJfQorCisJLyogU2V0IHNwZWVkIG1vZGUgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCW91dGIoaXJfbW9kZSwgaW9iYXNlK0hDUik7CisKKwkvKiBzZXQgRklGTyBzaXplIHRvIDMyICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQyKTsKKwlvdXRiKEFEQ1IyX1JYRlMzMnxBRENSMl9UWEZTMzIsIGlvYmFzZStBRENSMik7CQorCQorCS8qIHNldCBGSUZPIHRocmVzaG9sZCB0byBUWDE3LCBSWDE2ICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwlvdXRiKDB4MDAsIGlvYmFzZStVRlIpOyAgICAgICAgLyogUmVzZXQgKi8KKwlvdXRiKFVGUl9FTl9GSUZPLCBpb2Jhc2UrVUZSKTsgLyogRmlyc3Qgd2UgbXVzdCBlbmFibGUgRklGTyAqLworCW91dGIoMHhhNywgaW9iYXNlK1VGUik7CisKKwluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisJCQorCS8qIEVuYWJsZSBzb21lIGludGVycnVwdHMgc28gd2UgY2FuIHJlY2VpdmUgZnJhbWVzICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwlpZiAoc3BlZWQgPiBQSU9fTUFYX1NQRUVEKSB7CisJCW91dGIoSUNSX0VGU0ZJLCBpb2Jhc2UrSUNSKTsKKwkJdzgzOTc3YWZfZG1hX3JlY2VpdmUoc2VsZik7CisJfSBlbHNlCisJCW91dGIoSUNSX0VSQlJJLCBpb2Jhc2UrSUNSKTsKKyAgICAJCisJLyogUmVzdG9yZSBTU1IgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9oYXJkX3htaXQgKHNrYiwgZGV2KQorICoKKyAqICAgIFNldHMgdXAgYSBETUEgdHJhbnNmZXIgdG8gc2VuZCB0aGUgY3VycmVudCBmcmFtZS4KKyAqCisgKi8KK2ludCB3ODM5NzdhZl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGY7CisJX19zMzIgc3BlZWQ7CisJaW50IGlvYmFzZTsKKwlfX3U4IHNldDsKKwlpbnQgbXR0OworCQorCXNlbGYgPSAoc3RydWN0IHc4Mzk3N2FmX2lyICopIGRldi0+cHJpdjsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJSVJEQV9ERUJVRyg0LCAiJXMoJWxkKSwgc2tiLT5sZW49JWRcbiIsIF9fRlVOQ1RJT05fXyAsIGppZmZpZXMsIAorCQkgICAoaW50KSBza2ItPmxlbik7CisJCisJLyogTG9jayB0cmFuc21pdCBidWZmZXIgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisJaWYgKChzcGVlZCAhPSBzZWxmLT5pby5zcGVlZCkgJiYgKHNwZWVkICE9IC0xKSkgeworCQkvKiBDaGVjayBmb3IgZW1wdHkgZnJhbWUgKi8KKwkJaWYgKCFza2ItPmxlbikgeworCQkJdzgzOTc3YWZfY2hhbmdlX3NwZWVkKHNlbGYsIHNwZWVkKTsgCisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOworCX0KKworCS8qIFNhdmUgY3VycmVudCBzZXQgKi8KKwlzZXQgPSBpbmIoaW9iYXNlK1NTUik7CisJCisJLyogRGVjaWRlIGlmIHdlIHNob3VsZCB1c2UgUElPIG9yIERNQSB0cmFuc2ZlciAqLworCWlmIChzZWxmLT5pby5zcGVlZCA+IFBJT19NQVhfU1BFRUQpIHsKKwkJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCQltZW1jcHkoc2VsZi0+dHhfYnVmZi5kYXRhLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJc2VsZi0+dHhfYnVmZi5sZW4gPSBza2ItPmxlbjsKKwkJCisJCW10dCA9IGlyZGFfZ2V0X210dChza2IpOworI2lmZGVmIENPTkZJR19VU0VfSU5URVJOQUxfVElNRVIKKwkgICAgICAgIGlmIChtdHQgPiA1MCkgeworCQkJLyogQWRqdXN0IGZvciB0aW1lciByZXNvbHV0aW9uICovCisJCQltdHQgLz0gMTAwMCsxOworCisJCQkvKiBTZXR1cCB0aW1lciAqLworCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQ0KTsKKwkJCW91dGIobXR0ICYgMHhmZiwgaW9iYXNlK1RNUkwpOworCQkJb3V0YigobXR0ID4+IDgpICYgMHgwZiwgaW9iYXNlK1RNUkgpOworCQkJCisJCQkvKiBTdGFydCB0aW1lciAqLworCQkJb3V0YihJUl9NU0xfRU5fVE1SLCBpb2Jhc2UrSVJfTVNMKTsKKwkJCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1hNSVQ7CisJCQkKKwkJCS8qIEVuYWJsZSB0aW1lciBpbnRlcnJ1cHQgKi8KKwkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CisJCQlvdXRiKElDUl9FVE1SSSwgaW9iYXNlK0lDUik7CisJCX0gZWxzZSB7CisjZW5kaWYKKwkJCUlSREFfREVCVUcoNCwgIiVzKCVsZCksIG10dD0lZFxuIiwgX19GVU5DVElPTl9fICwgamlmZmllcywgbXR0KTsKKwkJCWlmIChtdHQpCisJCQkJdWRlbGF5KG10dCk7CisKKwkJCS8qIEVuYWJsZSBETUEgaW50ZXJydXB0ICovCisJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCSAJCW91dGIoSUNSX0VETUFJLCBpb2Jhc2UrSUNSKTsKKwkgICAgIAkJdzgzOTc3YWZfZG1hX3dyaXRlKHNlbGYsIGlvYmFzZSk7CisjaWZkZWYgQ09ORklHX1VTRV9JTlRFUk5BTF9USU1FUgorCQl9CisjZW5kaWYKKwl9IGVsc2UgeworCQlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisJCXNlbGYtPnR4X2J1ZmYubGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCBzZWxmLT50eF9idWZmLmRhdGEsIAorCQkJCQkJICAgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CisJCQorCQkvKiBBZGQgaW50ZXJydXB0IG9uIHR4IGxvdyBsZXZlbCAod2lsbCBmaXJlIGltbWVkaWF0ZWx5KSAqLworCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCQlvdXRiKElDUl9FVFhUSEksIGlvYmFzZStJQ1IpOworCX0KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwkvKiBSZXN0b3JlIHNldCByZWdpc3RlciAqLworCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfZG1hX3dyaXRlIChzZWxmLCBpb2Jhc2UpCisgKgorICogICAgU2VuZCBmcmFtZSB1c2luZyBETUEKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHc4Mzk3N2FmX2RtYV93cml0ZShzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGYsIGludCBpb2Jhc2UpCit7CisJX191OCBzZXQ7CisjaWZkZWYgQ09ORklHX05FVFdJTkRFUl9UWF9ETUFfUFJPQkxFTVMKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCV9fdTggaGNyOworI2VuZGlmCisgICAgICAgIElSREFfREVCVUcoNCwgIiVzKCksIGxlbj0lZFxuIiwgX19GVU5DVElPTl9fICwgc2VsZi0+dHhfYnVmZi5sZW4pOworCisJLyogU2F2ZSBjdXJyZW50IHNldCAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKworCS8qIERpc2FibGUgRE1BICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwlvdXRiKGluYihpb2Jhc2UrSENSKSAmIH5IQ1JfRU5fRE1BLCBpb2Jhc2UrSENSKTsKKworCS8qIENob29zZSB0cmFuc21pdCBETUEgY2hhbm5lbCAgKi8gCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQyKTsKKwlvdXRiKEFEQ1IxX0RfQ0hTV3wvKkFEQ1IxX0RNQV9GfCovQURDUjFfQURWX1NMLCBpb2Jhc2UrQURDUjEpOworI2lmZGVmIENPTkZJR19ORVRXSU5ERVJfVFhfRE1BX1BST0JMRU1TCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCWRpc2FibGVfZG1hKHNlbGYtPmlvLmRtYSk7CisJY2xlYXJfZG1hX2ZmKHNlbGYtPmlvLmRtYSk7CisJc2V0X2RtYV9tb2RlKHNlbGYtPmlvLmRtYSwgRE1BX01PREVfUkVBRCk7CisJc2V0X2RtYV9hZGRyKHNlbGYtPmlvLmRtYSwgc2VsZi0+dHhfYnVmZl9kbWEpOworCXNldF9kbWFfY291bnQoc2VsZi0+aW8uZG1hLCBzZWxmLT50eF9idWZmLmxlbik7CisjZWxzZQorCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYSwgc2VsZi0+dHhfYnVmZl9kbWEsIHNlbGYtPnR4X2J1ZmYubGVuLAorCQkgICAgICAgRE1BX01PREVfV1JJVEUpOwkKKyNlbmRpZgorCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1hNSVQ7CisJCisJLyogRW5hYmxlIERNQSAqLworIAlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworI2lmZGVmIENPTkZJR19ORVRXSU5ERVJfVFhfRE1BX1BST0JMRU1TCisJaGNyID0gaW5iKGlvYmFzZStIQ1IpOworCW91dGIoaGNyIHwgSENSX0VOX0RNQSwgaW9iYXNlK0hDUik7CisJZW5hYmxlX2RtYShzZWxmLT5pby5kbWEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKyNlbHNlCQorCW91dGIoaW5iKGlvYmFzZStIQ1IpIHwgSENSX0VOX0RNQSB8IEhDUl9UWF9XVCwgaW9iYXNlK0hDUik7CisjZW5kaWYKKworCS8qIFJlc3RvcmUgc2V0IHJlZ2lzdGVyICovCisJb3V0YihzZXQsIGlvYmFzZStTU1IpOworfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfcGlvX3dyaXRlIChpb2Jhc2UsIGJ1ZiwgbGVuLCBmaWZvX3NpemUpCisgKgorICogICAgCisgKgorICovCitzdGF0aWMgaW50IHc4Mzk3N2FmX3Bpb193cml0ZShpbnQgaW9iYXNlLCBfX3U4ICpidWYsIGludCBsZW4sIGludCBmaWZvX3NpemUpCit7CisJaW50IGFjdHVhbCA9IDA7CisJX191OCBzZXQ7CisJCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKworCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CisJaWYgKCEoaW5iX3AoaW9iYXNlK1VTUikgJiBVU1JfVFNSRSkpIHsKKwkJSVJEQV9ERUJVRyg0LAorCQkJICAgIiVzKCksIHdhcm5pbmcsIEZJRk8gbm90IGVtcHR5IHlldCFcbiIsIF9fRlVOQ1RJT05fXyAgKTsKKworCQlmaWZvX3NpemUgLT0gMTc7CisJCUlSREFfREVCVUcoNCwgIiVzKCksICVkIGJ5dGVzIGxlZnQgaW4gdHggZmlmb1xuIiwgCisJCQkgICBfX0ZVTkNUSU9OX18gLCBmaWZvX3NpemUpOworCX0KKworCS8qIEZpbGwgRklGTyB3aXRoIGN1cnJlbnQgZnJhbWUgKi8KKwl3aGlsZSAoKGZpZm9fc2l6ZS0tID4gMCkgJiYgKGFjdHVhbCA8IGxlbikpIHsKKwkJLyogVHJhbnNtaXQgbmV4dCBieXRlICovCisJCW91dGIoYnVmW2FjdHVhbCsrXSwgaW9iYXNlK1RCUik7CisJfQorICAgICAgICAKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBmaWZvX3NpemUgJWQgOyAlZCBzZW50IG9mICVkXG4iLCAKKwkJICAgX19GVU5DVElPTl9fICwgZmlmb19zaXplLCBhY3R1YWwsIGxlbik7CisKKwkvKiBSZXN0b3JlIGJhbmsgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7CisKKwlyZXR1cm4gYWN0dWFsOworfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfZG1hX3htaXRfY29tcGxldGUgKHNlbGYpCisgKgorICogICAgVGhlIHRyYW5zZmVyIG9mIGEgZnJhbWUgaW4gZmluaXNoZWQuIFNvIGRvIHRoZSBuZWNlc3NhcnkgdGhpbmdzCisgKgorICogICAgCisgKi8KK3N0YXRpYyB2b2lkIHc4Mzk3N2FmX2RtYV94bWl0X2NvbXBsZXRlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCV9fdTggc2V0OworCisJSVJEQV9ERUJVRyg0LCAiJXMoJWxkKVxuIiwgX19GVU5DVElPTl9fICwgamlmZmllcyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBTYXZlIGN1cnJlbnQgc2V0ICovCisJc2V0ID0gaW5iKGlvYmFzZStTU1IpOworCisJLyogRGlzYWJsZSBETUEgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCW91dGIoaW5iKGlvYmFzZStIQ1IpICYgfkhDUl9FTl9ETUEsIGlvYmFzZStIQ1IpOworCQorCS8qIENoZWNrIGZvciB1bmRlcnJydW4hICovCisJaWYgKGluYihpb2Jhc2UrQVVEUikgJiBBVURSX1VORFIpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVHJhbnNtaXQgdW5kZXJydW4hXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCisJCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlzZWxmLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCisJCS8qIENsZWFyIGJpdCwgYnkgd3JpdGluZyAxIHRvIGl0ICovCisJCW91dGIoQVVEUl9VTkRSLCBpb2Jhc2UrQVVEUik7CisJfSBlbHNlCisJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKworCQorCWlmIChzZWxmLT5uZXdfc3BlZWQpIHsKKwkJdzgzOTc3YWZfY2hhbmdlX3NwZWVkKHNlbGYsIHNlbGYtPm5ld19zcGVlZCk7CisJCXNlbGYtPm5ld19zcGVlZCA9IDA7CisJfQorCisJLyogVW5sb2NrIHR4X2J1ZmYgYW5kIHJlcXVlc3QgYW5vdGhlciBmcmFtZSAqLworCS8qIFRlbGwgdGhlIG5ldHdvcmsgbGF5ZXIsIHRoYXQgd2Ugd2FudCBtb3JlIGZyYW1lcyAqLworCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwkKKwkvKiBSZXN0b3JlIHNldCAqLworCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX2RtYV9yZWNlaXZlIChzZWxmKQorICoKKyAqICAgIEdldCByZWFkeSBmb3IgcmVjZWl2aW5nIGEgZnJhbWUuIFRoZSBkZXZpY2Ugd2lsbCBpbml0aWF0ZSBhIERNQQorICogICAgaWYgaXQgc3RhcnRzIHRvIHJlY2VpdmUgYSBmcmFtZS4KKyAqCisgKi8KK2ludCB3ODM5NzdhZl9kbWFfcmVjZWl2ZShzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGYpIAoreworCWludCBpb2Jhc2U7CisJX191OCBzZXQ7CisjaWZkZWYgQ09ORklHX05FVFdJTkRFUl9SWF9ETUFfUFJPQkxFTVMKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCV9fdTggaGNyOworI2VuZGlmCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCUlSREFfREVCVUcoNCwgIiVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWlvYmFzZT0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBTYXZlIGN1cnJlbnQgc2V0ICovCisJc2V0ID0gaW5iKGlvYmFzZStTU1IpOworCisJLyogRGlzYWJsZSBETUEgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCW91dGIoaW5iKGlvYmFzZStIQ1IpICYgfkhDUl9FTl9ETUEsIGlvYmFzZStIQ1IpOworCisJLyogQ2hvb3NlIERNQSBSeCwgRE1BIEZhaXJuZXNzLCBhbmQgQWR2YW5jZWQgbW9kZSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMik7CisJb3V0YigoaW5iKGlvYmFzZStBRENSMSkgJiB+QURDUjFfRF9DSFNXKS8qfEFEQ1IxX0RNQV9GKi98QURDUjFfQURWX1NMLAorCSAgICAgaW9iYXNlK0FEQ1IxKTsKKworCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1JFQ1Y7CisJc2VsZi0+cnhfYnVmZi5kYXRhID0gc2VsZi0+cnhfYnVmZi5oZWFkOworCisjaWZkZWYgQ09ORklHX05FVFdJTkRFUl9SWF9ETUFfUFJPQkxFTVMKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJZGlzYWJsZV9kbWEoc2VsZi0+aW8uZG1hKTsKKwljbGVhcl9kbWFfZmYoc2VsZi0+aW8uZG1hKTsKKwlzZXRfZG1hX21vZGUoc2VsZi0+aW8uZG1hLCBETUFfTU9ERV9SRUFEKTsKKwlzZXRfZG1hX2FkZHIoc2VsZi0+aW8uZG1hLCBzZWxmLT5yeF9idWZmX2RtYSk7CisJc2V0X2RtYV9jb3VudChzZWxmLT5pby5kbWEsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUpOworI2Vsc2UKKwlpcmRhX3NldHVwX2RtYShzZWxmLT5pby5kbWEsIHNlbGYtPnJ4X2J1ZmZfZG1hLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkgICAgICAgRE1BX01PREVfUkVBRCk7CisjZW5kaWYKKwkvKiAKKwkgKiBSZXNldCBSeCBGSUZPLiBUaGlzIHdpbGwgYWxzbyBmbHVzaCB0aGUgU1RfRklGTywgaXQncyB2ZXJ5IAorCSAqIGltcG9ydGFudCB0aGF0IHdlIGRvbid0IHJlc2V0IHRoZSBUeCBGSUZPIHNpbmNlIGl0IG1pZ2h0IG5vdAorCSAqIGJlIGZpbmlzaGVkIHRyYW5zbWl0dGluZyB5ZXQKKwkgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCW91dGIoVUZSX1JYVEx8VUZSX1RYVEx8VUZSX1JYRl9SU1R8VUZSX0VOX0ZJRk8sIGlvYmFzZStVRlIpOworCXNlbGYtPnN0X2ZpZm8ubGVuID0gc2VsZi0+c3RfZmlmby50YWlsID0gc2VsZi0+c3RfZmlmby5oZWFkID0gMDsKKwkKKwkvKiBFbmFibGUgRE1BICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKyNpZmRlZiBDT05GSUdfTkVUV0lOREVSX1JYX0RNQV9QUk9CTEVNUworCWhjciA9IGluYihpb2Jhc2UrSENSKTsKKwlvdXRiKGhjciB8IEhDUl9FTl9ETUEsIGlvYmFzZStIQ1IpOworCWVuYWJsZV9kbWEoc2VsZi0+aW8uZG1hKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisjZWxzZQkKKwlvdXRiKGluYihpb2Jhc2UrSENSKSB8IEhDUl9FTl9ETUEsIGlvYmFzZStIQ1IpOworI2VuZGlmCisJLyogUmVzdG9yZSBzZXQgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX3JlY2VpdmVfY29tcGxldGUgKHNlbGYpCisgKgorICogICAgRmluaXNoZWQgd2l0aCByZWNlaXZpbmcgYSBmcmFtZQorICoKKyAqLworaW50IHc4Mzk3N2FmX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzdF9maWZvICpzdF9maWZvOworCWludCBsZW47CisJaW50IGlvYmFzZTsKKwlfX3U4IHNldDsKKwlfX3U4IHN0YXR1czsKKworCUlSREFfREVCVUcoNCwgIiVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCXN0X2ZpZm8gPSAmc2VsZi0+c3RfZmlmbzsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogU2F2ZSBjdXJyZW50IHNldCAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCS8qIFJlYWQgc3RhdHVzIEZJRk8gKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDUpOworCXdoaWxlICgoc3RhdHVzID0gaW5iKGlvYmFzZStGU19GTykpICYgRlNfRk9fRlNGRFIpIHsKKwkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT50YWlsXS5zdGF0dXMgPSBzdGF0dXM7CisJCQorCQlzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPnRhaWxdLmxlbiAgPSBpbmIoaW9iYXNlK1JGTEZMKTsKKwkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT50YWlsXS5sZW4gfD0gaW5iKGlvYmFzZStSRkxGSCkgPDwgODsKKwkJCisJCXN0X2ZpZm8tPnRhaWwrKzsKKwkJc3RfZmlmby0+bGVuKys7CisJfQorCQorCXdoaWxlIChzdF9maWZvLT5sZW4pIHsKKwkJLyogR2V0IGZpcnN0IGVudHJ5ICovCisJCXN0YXR1cyA9IHN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0uc3RhdHVzOworCQlsZW4gICAgPSBzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLmxlbjsKKwkJc3RfZmlmby0+aGVhZCsrOworCQlzdF9maWZvLT5sZW4tLTsKKworCQkvKiBDaGVjayBmb3IgZXJyb3JzICovCisJCWlmIChzdGF0dXMgJiBGU19GT19FUlJfTVNLKSB7CisJCQlpZiAoc3RhdHVzICYgRlNfRk9fTFNUX0ZSKSB7CisJCQkJLyogQWRkIG51bWJlciBvZiBsb3N0IGZyYW1lcyB0byBzdGF0cyAqLworCQkJCXNlbGYtPnN0YXRzLnJ4X2Vycm9ycyArPSBsZW47CQorCQkJfSBlbHNlIHsKKwkJCQkvKiBTa2lwIGZyYW1lICovCisJCQkJc2VsZi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCisJCQkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKKwkJCQkKKwkJCQlpZiAoc3RhdHVzICYgRlNfRk9fTVhfTEVYKQorCQkJCQlzZWxmLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJCisJCQkJaWYgKHN0YXR1cyAmIEZTX0ZPX1BIWV9FUlIpIAorCQkJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQkKKwkJCQlpZiAoc3RhdHVzICYgRlNfRk9fQ1JDX0VSUikgCisJCQkJCXNlbGYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCX0KKwkJCS8qIFRoZSBlcnJvcnMgYmVsb3cgY2FuIGJlIHJlcG9ydGVkIGluIGJvdGggY2FzZXMgKi8KKwkJCWlmIChzdGF0dXMgJiBGU19GT19SWF9PVikKKwkJCQlzZWxmLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJCisJCQlpZiAoc3RhdHVzICYgRlNfRk9fRlNGX09WKQorCQkJCXNlbGYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkKKwkJfSBlbHNlIHsKKwkJCS8qIENoZWNrIGlmIHdlIGhhdmUgdHJhbnNmZXJyZWQgYWxsIGRhdGEgdG8gbWVtb3J5ICovCisJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCQkJaWYgKGluYihpb2Jhc2UrVVNSKSAmIFVTUl9SRFIpIHsKKyNpZmRlZiBDT05GSUdfVVNFX0lOVEVSTkFMX1RJTUVSCisJCQkJLyogUHV0IHRoaXMgZW50cnkgYmFjayBpbiBmaWZvICovCisJCQkJc3RfZmlmby0+aGVhZC0tOworCQkJCXN0X2ZpZm8tPmxlbisrOworCQkJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0uc3RhdHVzID0gc3RhdHVzOworCQkJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0ubGVuID0gbGVuOworCQkJCQorCQkJCS8qIFJlc3RvcmUgc2V0IHJlZ2lzdGVyICovCisJCQkJb3V0YihzZXQsIGlvYmFzZStTU1IpOworCQkJCisJCQkJcmV0dXJuIEZBTFNFOyAJLyogSSdsbCBiZSBiYWNrISAqLworI2Vsc2UKKwkJCQl1ZGVsYXkoODApOyAvKiBTaG91bGQgYmUgZW5vdWdoIT8gKi8KKyNlbmRpZgorCQkJfQorCQkJCQkJCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbisxKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICIlcygpLCBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgZnJhbWUuXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCS8qIFJlc3RvcmUgc2V0IHJlZ2lzdGVyICovCisJCQkJb3V0YihzZXQsIGlvYmFzZStTU1IpOworCisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJCisJCQkvKiAgQWxpZ24gdG8gMjAgYnl0ZXMgKi8KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMSk7IAorCQkJCisJCQkvKiBDb3B5IGZyYW1lIHdpdGhvdXQgQ1JDICovCisJCQlpZiAoc2VsZi0+aW8uc3BlZWQgPCA0MDAwMDAwKSB7CisJCQkJc2tiX3B1dChza2IsIGxlbi0yKTsKKwkJCQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbi0yKTsKKwkJCX0gZWxzZSB7CisJCQkJc2tiX3B1dChza2IsIGxlbi00KTsKKwkJCQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbi00KTsKKwkJCX0KKworCQkJLyogTW92ZSB0byBuZXh0IGZyYW1lICovCisJCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOworCQkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCisJCQlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKKwkJCXNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7CisJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CisJCQluZXRpZl9yeChza2IpOworCQkJc2VsZi0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJfQorCX0KKwkvKiBSZXN0b3JlIHNldCByZWdpc3RlciAqLworCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICogRnVuY3Rpb24gcGM4NzEwOF9waW9fcmVjZWl2ZSAoc2VsZikKKyAqCisgKiAgICBSZWNlaXZlIGFsbCBkYXRhIGluIHJlY2VpdmVyIEZJRk8KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHc4Mzk3N2FmX3Bpb19yZWNlaXZlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZikgCit7CisJX191OCBieXRlID0gMHgwMDsKKwlpbnQgaW9iYXNlOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCQorCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCQorCS8qICBSZWNlaXZlIGFsbCBjaGFyYWN0ZXJzIGluIFJ4IEZJRk8gKi8KKwlkbyB7CisJCWJ5dGUgPSBpbmIoaW9iYXNlK1JCUik7CisJCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPnN0YXRzLCAmc2VsZi0+cnhfYnVmZiwgCisJCQkJICBieXRlKTsKKwl9IHdoaWxlIChpbmIoaW9iYXNlK1VTUikgJiBVU1JfUkRSKTsgLyogRGF0YSBhdmFpbGFibGUgKi8JCit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9zaXJfaW50ZXJydXB0IChzZWxmLCBlaXIpCisgKgorICogICAgSGFuZGxlIFNJUiBpbnRlcnJ1cHQKKyAqCisgKi8KK3N0YXRpYyBfX3U4IHc4Mzk3N2FmX3Npcl9pbnRlcnJ1cHQoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmLCBpbnQgaXNyKQoreworCWludCBhY3R1YWw7CisJX191OCBuZXdfaWNyID0gMDsKKwlfX3U4IHNldDsKKwlpbnQgaW9iYXNlOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgaXNyPSUjeFxuIiwgX19GVU5DVElPTl9fICwgaXNyKTsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkvKiBUcmFuc21pdCBGSUZPIGxvdyBvbiBkYXRhICovCisJaWYgKGlzciAmIElTUl9UWFRIX0kpIHsKKwkJLyogV3JpdGUgZGF0YSBsZWZ0IGluIHRyYW5zbWl0IGJ1ZmZlciAqLworCQlhY3R1YWwgPSB3ODM5NzdhZl9waW9fd3JpdGUoc2VsZi0+aW8uZmlyX2Jhc2UsIAorCQkJCQkgICAgc2VsZi0+dHhfYnVmZi5kYXRhLCAKKwkJCQkJICAgIHNlbGYtPnR4X2J1ZmYubGVuLCAKKwkJCQkJICAgIHNlbGYtPmlvLmZpZm9fc2l6ZSk7CisKKwkJc2VsZi0+dHhfYnVmZi5kYXRhICs9IGFjdHVhbDsKKwkJc2VsZi0+dHhfYnVmZi5sZW4gIC09IGFjdHVhbDsKKwkJCisJCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1hNSVQ7CisKKwkJLyogQ2hlY2sgaWYgZmluaXNoZWQgKi8KKwkJaWYgKHNlbGYtPnR4X2J1ZmYubGVuID4gMCkgeworCQkJbmV3X2ljciB8PSBJQ1JfRVRYVEhJOworCQl9IGVsc2UgeworCQkJc2V0ID0gaW5iKGlvYmFzZStTU1IpOworCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwkJCW91dGIoQVVEUl9TRkVORCwgaW9iYXNlK0FVRFIpOworCQkJb3V0YihzZXQsIGlvYmFzZStTU1IpOyAKKworCQkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCisJCQkvKiBGZWVkIG1lIG1vcmUgcGFja2V0cyAqLworCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQkJbmV3X2ljciB8PSBJQ1JfRVRCUkVJOworCQl9CisJfQorCS8qIENoZWNrIGlmIHRyYW5zbWlzc2lvbiBoYXMgY29tcGxldGVkICovCisJaWYgKGlzciAmIElTUl9UWEVNUF9JKSB7CQkKKwkJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkPyAqLworCQlpZiAoc2VsZi0+bmV3X3NwZWVkKSB7CisJCQlJUkRBX0RFQlVHKDIsCisJCQkJICAgIiVzKCksIENoYW5naW5nIHNwZWVkIVxuIiwgX19GVU5DVElPTl9fICk7CisJCQl3ODM5NzdhZl9jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+bmV3X3NwZWVkKTsKKwkJCXNlbGYtPm5ld19zcGVlZCA9IDA7CisJCX0KKworCQkvKiBUdXJuIGFyb3VuZCBhbmQgZ2V0IHJlYWR5IHRvIHJlY2VpdmUgc29tZSBkYXRhICovCisJCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1JFQ1Y7CisJCW5ld19pY3IgfD0gSUNSX0VSQlJJOworCX0KKworCS8qIFJ4IEZJRk8gdGhyZXNob2xkIG9yIHRpbWVvdXQgKi8KKwlpZiAoaXNyICYgSVNSX1JYVEhfSSkgeworCQl3ODM5NzdhZl9waW9fcmVjZWl2ZShzZWxmKTsKKworCQkvKiBLZWVwIHJlY2VpdmluZyAqLworCQluZXdfaWNyIHw9IElDUl9FUkJSSTsKKwl9CisJcmV0dXJuIG5ld19pY3I7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBwYzg3MTA4X2Zpcl9pbnRlcnJ1cHQgKHNlbGYsIGVpcikKKyAqCisgKiAgICBIYW5kbGUgTUlSL0ZJUiBpbnRlcnJ1cHQKKyAqCisgKi8KK3N0YXRpYyBfX3U4IHc4Mzk3N2FmX2Zpcl9pbnRlcnJ1cHQoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmLCBpbnQgaXNyKQoreworCV9fdTggbmV3X2ljciA9IDA7CisJX191OCBzZXQ7CisJaW50IGlvYmFzZTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKwkKKwkvKiBFbmQgb2YgZnJhbWUgZGV0ZWN0ZWQgaW4gRklGTyAqLworCWlmIChpc3IgJiAoSVNSX0ZFTkRfSXxJU1JfRlNGX0kpKSB7CisJCWlmICh3ODM5NzdhZl9kbWFfcmVjZWl2ZV9jb21wbGV0ZShzZWxmKSkgeworCQkJCisJCQkvKiBXYWl0IGZvciBuZXh0IHN0YXR1cyBGSUZPIGludGVycnVwdCAqLworCQkJbmV3X2ljciB8PSBJQ1JfRUZTRkk7CisJCX0gZWxzZSB7CisJCQkvKiBETUEgbm90IGZpbmlzaGVkIHlldCAqLworCisJCQkvKiBTZXQgdGltZXIgdmFsdWUsIHJlc29sdXRpb24gMSBtcyAqLworCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQ0KTsKKwkJCW91dGIoMHgwMSwgaW9iYXNlK1RNUkwpOyAvKiAxIG1zICovCisJCQlvdXRiKDB4MDAsIGlvYmFzZStUTVJIKTsKKworCQkJLyogU3RhcnQgdGltZXIgKi8KKwkJCW91dGIoSVJfTVNMX0VOX1RNUiwgaW9iYXNlK0lSX01TTCk7CisKKwkJCW5ld19pY3IgfD0gSUNSX0VUTVJJOworCQl9CisJfQorCS8qIFRpbWVyIGZpbmlzaGVkICovCisJaWYgKGlzciAmIElTUl9UTVJfSSkgeworCQkvKiBEaXNhYmxlIHRpbWVyICovCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUNCk7CisJCW91dGIoMCwgaW9iYXNlK0lSX01TTCk7CisKKwkJLyogQ2xlYXIgdGltZXIgZXZlbnQgKi8KKwkJLyogc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsgKi8KKy8qIAkJb3V0YihBU0NSX0NURSwgaW9iYXNlK0FTQ1IpOyAqLworCisJCS8qIENoZWNrIGlmIHRoaXMgaXMgYSBUWCB0aW1lciBpbnRlcnJ1cHQgKi8KKwkJaWYgKHNlbGYtPmlvLmRpcmVjdGlvbiA9PSBJT19YTUlUKSB7CisJCQl3ODM5NzdhZl9kbWFfd3JpdGUoc2VsZiwgaW9iYXNlKTsKKworCQkJbmV3X2ljciB8PSBJQ1JfRURNQUk7CisJCX0gZWxzZSB7CisJCQkvKiBDaGVjayBpZiBETUEgaGFzIG5vdyBmaW5pc2hlZCAqLworCQkJdzgzOTc3YWZfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZik7CisKKwkJCW5ld19pY3IgfD0gSUNSX0VGU0ZJOworCQl9CisJfQkKKwkvKiBGaW5pc2hlZCB3aXRoIERNQSAqLworCWlmIChpc3IgJiBJU1JfRE1BX0kpIHsKKwkJdzgzOTc3YWZfZG1hX3htaXRfY29tcGxldGUoc2VsZik7CisKKwkJLyogQ2hlY2sgaWYgdGhlcmUgYXJlIG1vcmUgZnJhbWVzIHRvIGJlIHRyYW5zbWl0dGVkICovCisJCS8qIGlmIChpcmRhX2RldmljZV90eHF1ZXVlX2VtcHR5KHNlbGYpKSB7ICovCisJCQorCQkvKiBQcmVwYXJlIGZvciByZWNlaXZlIAorCQkgKiAKKwkJICogKiogTmV0d2luZGVyIFR4IERNQSBsaWtlcyB0aGF0IHdlIGRvIHRoaXMgYW55d2F5ICoqCisJCSAqLworCQl3ODM5NzdhZl9kbWFfcmVjZWl2ZShzZWxmKTsKKwkJbmV3X2ljciA9IElDUl9FRlNGSTsKKwkgICAgICAgLyogfSAqLworCX0KKwkKKwkvKiBSZXN0b3JlIHNldCAqLworCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKKworCXJldHVybiBuZXdfaWNyOworfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfaW50ZXJydXB0IChpcnEsIGRldl9pZCwgcmVncykKKyAqCisgKiAgICBBbiBpbnRlcnJ1cHQgZnJvbSB0aGUgY2hpcCBoYXMgYXJyaXZlZC4gVGltZSB0byBkbyBzb21lIHdvcmsKKyAqCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB3ODM5NzdhZl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGY7CisJX191OCBzZXQsIGljciwgaXNyOworCWludCBpb2Jhc2U7CisKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIAorCQkJZHJpdmVyX25hbWUsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJc2VsZiA9IChzdHJ1Y3QgdzgzOTc3YWZfaXIgKikgZGV2LT5wcml2OworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCQorCWljciA9IGluYihpb2Jhc2UrSUNSKTsgCisJaXNyID0gaW5iKGlvYmFzZStJU1IpICYgaWNyOyAvKiBNYXNrIG91dCB0aGUgaW50ZXJlc3Rpbmcgb25lcyAqLyAKKworCW91dGIoMCwgaW9iYXNlK0lDUik7IC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCQorCWlmIChpc3IpIHsKKwkJLyogRGlzcGF0Y2ggaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBjdXJyZW50IHNwZWVkICovCisJCWlmIChzZWxmLT5pby5zcGVlZCA+IFBJT19NQVhfU1BFRUQgKQorCQkJaWNyID0gdzgzOTc3YWZfZmlyX2ludGVycnVwdChzZWxmLCBpc3IpOworCQllbHNlCisJCQlpY3IgPSB3ODM5NzdhZl9zaXJfaW50ZXJydXB0KHNlbGYsIGlzcik7CisJfQorCisJb3V0YihpY3IsIGlvYmFzZStJQ1IpOyAgICAvKiBSZXN0b3JlIChuZXcpIGludGVycnVwdHMgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7ICAgIC8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCXJldHVybiBJUlFfUkVUVkFMKGlzcik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9pc19yZWNlaXZpbmcgKHNlbGYpCisgKgorICogICAgUmV0dXJuIFRSVUUgaXMgd2UgYXJlIGN1cnJlbnRseSByZWNlaXZpbmcgYSBmcmFtZQorICoKKyAqLworc3RhdGljIGludCB3ODM5NzdhZl9pc19yZWNlaXZpbmcoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmKQoreworCWludCBzdGF0dXMgPSBGQUxTRTsKKwlpbnQgaW9iYXNlOworCV9fdTggc2V0OworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gRkFMU0U7KTsKKworCWlmIChzZWxmLT5pby5zcGVlZCA+IDExNTIwMCkgeworCQlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCQkvKiBDaGVjayBpZiByeCBGSUZPIGlzIG5vdCBlbXB0eSAqLworCQlzZXQgPSBpbmIoaW9iYXNlK1NTUik7CisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMik7CisJCWlmICgoaW5iKGlvYmFzZStSWEZEVEgpICYgMHgzZikgIT0gMCkgeworCQkJLyogV2UgYXJlIHJlY2VpdmluZyBzb21ldGhpbmcgKi8KKwkJCXN0YXR1cyA9ICBUUlVFOworCQl9CisJCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKKwl9IGVsc2UgCisJCXN0YXR1cyA9IChzZWxmLT5yeF9idWZmLnN0YXRlICE9IE9VVFNJREVfRlJBTUUpOworCQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9uZXRfb3BlbiAoZGV2KQorICoKKyAqICAgIFN0YXJ0IHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgdzgzOTc3YWZfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGY7CisJaW50IGlvYmFzZTsKKwljaGFyIGh3bmFtZVszMl07CisJX191OCBzZXQ7CisJCisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSAoc3RydWN0IHc4Mzk3N2FmX2lyICopIGRldi0+cHJpdjsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwlpZiAocmVxdWVzdF9pcnEoc2VsZi0+aW8uaXJxLCB3ODM5NzdhZl9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgCisJCQkodm9pZCAqKSBkZXYpKSB7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkvKgorCSAqIEFsd2F5cyBhbGxvY2F0ZSB0aGUgRE1BIGNoYW5uZWwgYWZ0ZXIgdGhlIElSUSwKKwkgKiBhbmQgY2xlYW4gdXAgb24gZmFpbHVyZS4KKwkgKi8KKwlpZiAocmVxdWVzdF9kbWEoc2VsZi0+aW8uZG1hLCBkZXYtPm5hbWUpKSB7CisJCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgc2VsZik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkJCisJLyogU2F2ZSBjdXJyZW50IHNldCAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKworIAkvKiBFbmFibGUgc29tZSBpbnRlcnJ1cHRzIHNvIHdlIGNhbiByZWNlaXZlIGZyYW1lcyBhZ2FpbiAqLworIAlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworIAlpZiAoc2VsZi0+aW8uc3BlZWQgPiAxMTUyMDApIHsKKyAJCW91dGIoSUNSX0VGU0ZJLCBpb2Jhc2UrSUNSKTsKKyAJCXc4Mzk3N2FmX2RtYV9yZWNlaXZlKHNlbGYpOworIAl9IGVsc2UKKyAJCW91dGIoSUNSX0VSQlJJLCBpb2Jhc2UrSUNSKTsKKworCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKKworCS8qIFJlYWR5IHRvIHBsYXkhICovCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkKKwkvKiBHaXZlIHNlbGYgYSBoYXJkd2FyZSBuYW1lICovCisJc3ByaW50Zihod25hbWUsICJ3ODM5NzdhZiBAIDB4JTAzeCIsIHNlbGYtPmlvLmZpcl9iYXNlKTsKKworCS8qIAorCSAqIE9wZW4gbmV3IElyTEFQIGxheWVyIGluc3RhbmNlLCBub3cgdGhhdCBldmVyeXRoaW5nIHNob3VsZCBiZQorCSAqIGluaXRpYWxpemVkIHByb3Blcmx5IAorCSAqLworCXNlbGYtPmlybGFwID0gaXJsYXBfb3BlbihkZXYsICZzZWxmLT5xb3MsIGh3bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX25ldF9jbG9zZSAoZGV2KQorICoKKyAqICAgIFN0b3AgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIGludCB3ODM5NzdhZl9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGY7CisJaW50IGlvYmFzZTsKKwlfX3U4IHNldDsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCQorCXNlbGYgPSAoc3RydWN0IHc4Mzk3N2FmX2lyICopIGRldi0+cHJpdjsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBTdG9wIGRldmljZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKiBTdG9wIGFuZCByZW1vdmUgaW5zdGFuY2Ugb2YgSXJMQVAgKi8KKwlpZiAoc2VsZi0+aXJsYXApCisJCWlybGFwX2Nsb3NlKHNlbGYtPmlybGFwKTsKKwlzZWxmLT5pcmxhcCA9IE5VTEw7CisKKwlkaXNhYmxlX2RtYShzZWxmLT5pby5kbWEpOworCisJLyogU2F2ZSBjdXJyZW50IHNldCAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKwkKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCW91dGIoMCwgaW9iYXNlK0lDUik7IAorCisJZnJlZV9pcnEoc2VsZi0+aW8uaXJxLCBkZXYpOworCWZyZWVfZG1hKHNlbGYtPmlvLmRtYSk7CisKKwkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX25ldF9pb2N0bCAoZGV2LCBycSwgY21kKQorICoKKyAqICAgIFByb2Nlc3MgSU9DVEwgY29tbWFuZHMgZm9yIHRoaXMgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IHc4Mzk3N2FmX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXNlbGYgPSBkZXYtPnByaXY7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXyAsIGRldi0+bmFtZSwgY21kKTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFORFdJRFRIOiAvKiBTZXQgYmFuZHdpZHRoICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJZ290byBvdXQ7CisJCX0KKwkJdzgzOTc3YWZfY2hhbmdlX3NwZWVkKHNlbGYsIGlycS0+aWZyX2JhdWRyYXRlKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU01FRElBQlVTWTogLyogU2V0IG1lZGlhIGJ1c3kgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlnb3RvIG91dDsKKwkJfQorCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKwljYXNlIFNJT0NHUkVDRUlWSU5HOiAvKiBDaGVjayBpZiB3ZSBhcmUgcmVjZWl2aW5nIHJpZ2h0IG5vdyAqLworCQlpcnEtPmlmcl9yZWNlaXZpbmcgPSB3ODM5NzdhZl9pc19yZWNlaXZpbmcoc2VsZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3ODM5NzdhZl9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmID0gKHN0cnVjdCB3ODM5NzdhZl9pciAqKSBkZXYtPnByaXY7CisJCisJcmV0dXJuICZzZWxmLT5zdGF0czsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJXaW5ib25kIFc4Mzk3N0FGIElyREEgRGV2aWNlIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKK21vZHVsZV9wYXJhbShxb3NfbXR0X2JpdHMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHFvc19tdHRfYml0cywgIk1pbWltdW0gVHVybiBUaW1lIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiQmFzZSBJL08gYWRkcmVzc2VzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgbGluZXMiKTsKKworLyoKKyAqIEZ1bmN0aW9uIGluaXRfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIAorICoKKyAqLworbW9kdWxlX2luaXQodzgzOTc3YWZfaW5pdCk7CisKKy8qCisgKiBGdW5jdGlvbiBjbGVhbnVwX21vZHVsZSAodm9pZCkKKyAqCisgKiAgICAKKyAqCisgKi8KK21vZHVsZV9leGl0KHc4Mzk3N2FmX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5oIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNzY2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmgKQEAgLTAsMCArMSwxOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgdzgzOTc3YWZfaXIuaAorICogVmVyc2lvbjogICAgICAgCisgKiBEZXNjcmlwdGlvbjogICAKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIFBhdWwgVmFuZGVyU3BlaworICogQ3JlYXRlZCBhdDogICAgVGh1IE5vdiAxOSAxMzo1NTozNCAxOTk4CisgKiBNb2RpZmllZCBhdDogICBUdWUgSmFuIDExIDEzOjA4OjE5IDIwMDAKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVzgzOTc3QUZfSVJfSAorI2RlZmluZSBXODM5NzdBRl9JUl9ICisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBGbGFncyBmb3IgY29uZmlndXJhdGlvbiByZWdpc3RlciBDUkYwICovCisjZGVmaW5lIEVOQk5LU0VMCTB4MDEKKyNkZWZpbmUgQVBFRENSQwkJMHgwMgorI2RlZmluZSBUWFc0QyAgICAgICAgICAgMHgwNAorI2RlZmluZSBSWFc0QyAgICAgICAgICAgMHgwOAorCisvKiBCYW5rIDAgKi8KKyNkZWZpbmUgUkJSICAgICAgICAgICAgIDB4MDAgLyogUmVjZWl2ZXIgYnVmZmVyIHJlZ2lzdGVyICovCisjZGVmaW5lIFRCUiAgICAgICAgICAgICAweDAwIC8qIFRyYW5zbWl0dGVyIGJ1ZmZlciByZWdpc3RlciAqLworCisjZGVmaW5lIElDUgkJMHgwMSAvKiBJbnRlcnJ1cHQgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBJQ1JfRVJCUkkgICAgICAgMHgwMSAvKiBSZWNlaXZlciBidWZmZXIgcmVnaXN0ZXIgaW50ZXJydXB0ICovCisjZGVmaW5lIElDUl9FVEJSRUkgICAgICAweDAyIC8qIFRyYW5zZWl2ZXIgZW1wdHkgaW50ZXJydXB0ICovCisjZGVmaW5lIElDUl9FVVNSSQkweDA0Ly8qIElSIHN0YXR1cyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSUNSX0VIU1JJICAgICAgIDB4MDQKKyNkZWZpbmUgSUNSX0VUWFVSSSAgICAgIDB4MDQgLyogVHggdW5kZXJydW4gKi8KKyNkZWZpbmUgSUNSX0VETUFJCTB4MTAgLyogRE1BIGludGVycnVwdCAqLworI2RlZmluZSBJQ1JfRVRYVEhJICAgICAgMHgyMCAvKiBUcmFuc21pdHRlciB0aHJlc2hvbGQgaW50ZXJydXB0ICovCisjZGVmaW5lIElDUl9FRlNGSSAgICAgICAweDQwIC8qIEZyYW1lIHN0YXR1cyBGSUZPIGludGVycnVwdCAqLworI2RlZmluZSBJQ1JfRVRNUkkgICAgICAgMHg4MCAvKiBUaW1lciBpbnRlcnJ1cHQgKi8KKworI2RlZmluZSBVRlIJCTB4MDIgLyogRklGTyBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFVGUl9FTl9GSUZPICAgICAweDAxIC8qIEVuYWJsZSBGSUZPJ3MgKi8KKyNkZWZpbmUgVUZSX1JYRl9SU1QgICAgIDB4MDIgLyogUmVzZXQgUnggRklGTyAqLworI2RlZmluZSBVRlJfVFhGX1JTVCAgICAgMHgwNCAvKiBSZXNldCBUeCBGSUZPICovCisjZGVmaW5lIFVGUl9SWFRMCTB4ODAgLyogUnggRklGTyB0aHJlc2hvbGQgKHNldCB0byAxNikgKi8KKyNkZWZpbmUgVUZSX1RYVEwJMHgyMCAvKiBUeCBGSUZPIHRocmVzaG9sZCAoc2V0IHRvIDE3KSAqLworCisjZGVmaW5lIElTUgkJMHgwMiAvKiBJbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIElTUl9SWFRIX0kJMHgwMSAvKiBSZWNlaXZlIHRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVNSX1RYRU1QX0kgICAgIDB4MDIgLyogVHJhbnNtaXR0ZXIgZW1wdHkgaW50ZXJydXB0ICovCisjZGVmaW5lIElTUl9GRU5EX0kJMHgwNAorI2RlZmluZSBJU1JfRE1BX0kJMHgxMAorI2RlZmluZSBJU1JfVFhUSF9JCTB4MjAgLyogVHJhbnNtaXR0ZXIgdGhyZXNob2xkIGludGVycnVwdCAqLworI2RlZmluZSBJU1JfRlNGX0kgICAgICAgMHg0MAorI2RlZmluZSBJU1JfVE1SX0kgICAgICAgMHg4MCAvKiBUaW1lciBpbnRlcnJ1cHQgKi8KKworI2RlZmluZSBVQ1IgICAgICAgICAgICAgMHgwMyAvKiBVYXJ0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUNSX0RMUzggICAgICAgIDB4MDMgLyogOE4xICovCisKKyNkZWZpbmUgU1NSIAkgICAgICAgIDB4MDMgLyogU2V0cyBzZWxlY3QgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0VUMCAJICAgICAgICBVQ1JfRExTOCAgICAgICAgLyogTWFrZSBzdXJlIHdlIGtlZXAgOE4xICovCisjZGVmaW5lIFNFVDEJICAgICAgICAoMHg4MHxVQ1JfRExTOCkgLyogTWFrZSBzdXJlIHdlIGtlZXAgOE4xICovCisjZGVmaW5lIFNFVDIJICAgICAgICAweEUwCisjZGVmaW5lIFNFVDMJICAgICAgICAweEU0CisjZGVmaW5lIFNFVDQJICAgICAgICAweEU4CisjZGVmaW5lIFNFVDUJICAgICAgICAweEVDCisjZGVmaW5lIFNFVDYJICAgICAgICAweEYwCisjZGVmaW5lIFNFVDcJICAgICAgICAweEY0CisKKyNkZWZpbmUgSENSCQkweDA0CisjZGVmaW5lIEhDUl9NT0RFX01BU0sJfigweEQwKQorI2RlZmluZSBIQ1JfU0lSICAgICAgICAgMHg2MAorI2RlZmluZSBIQ1JfTUlSXzU3NiAgCTB4MjAJCisjZGVmaW5lIEhDUl9NSVJfMTE1MgkweDgwCisjZGVmaW5lIEhDUl9GSVIJCTB4QTAKKyNkZWZpbmUgSENSX0VOX0RNQQkweDA0CisjZGVmaW5lIEhDUl9FTl9JUlEJMHgwOAorI2RlZmluZSBIQ1JfVFhfV1QJMHgwOAorCisjZGVmaW5lIFVTUiAgICAgICAgICAgICAweDA1IC8qIElSIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBVU1JfUkRSICAgICAgICAgMHgwMSAvKiBSZWNlaXZlIGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgVVNSX1RTUkUgICAgICAgIDB4NDAgLyogVHJhbnNtaXR0ZXIgZW1wdHk/ICovCisKKyNkZWZpbmUgQVVEUiAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgQVVEUl9TRkVORCAgICAgIDB4MDggLyogU2V0IGEgZnJhbWUgZW5kICovCisjZGVmaW5lIEFVRFJfUlhCU1kgICAgICAweDIwIC8qIFJ4IGJ1c3kgKi8KKyNkZWZpbmUgQVVEUl9VTkRSICAgICAgIDB4NDAgLyogVHJhbnNlaXZlciB1bmRlcnJ1biAqLworCisvKiBTZXQgMiAqLworI2RlZmluZSBBQkxMICAgICAgICAgICAgMHgwMCAvKiBBZHZhbmNlZCBiYXVkIHJhdGUgZGl2aXNvciBsYXRjaCAobG93IGJ5dGUpICovCisjZGVmaW5lIEFCSEwgICAgICAgICAgICAweDAxIC8qIEFkdmFuY2VkIGJhdWQgcmF0ZSBkaXZpc29yIGxhdGNoIChoaWdoIGJ5dGUpICovCisKKyNkZWZpbmUgQURDUjEJCTB4MDIKKyNkZWZpbmUgQURDUjFfQURWX1NMCTB4MDEJCisjZGVmaW5lIEFEQ1IxX0RfQ0hTVwkweDA4CS8qIHRoZSBzcGVjcyBhcmUgd3JvbmcuIGl0cyBiaXQgMywgbm90IDQgKi8KKyNkZWZpbmUgQURDUjFfRE1BX0YJMHgwMgorCisjZGVmaW5lIEFEQ1IyCQkweDA0CisjZGVmaW5lIEFEQ1IyX1RYRlMzMgkweDAxCisjZGVmaW5lIEFEQ1IyX1JYRlMzMgkweDA0CisKKyNkZWZpbmUgUlhGRFRIICAgICAgICAgIDB4MDcKKworLyogU2V0IDMgKi8KKyNkZWZpbmUgQVVJRAkJMHgwMAorCisvKiBTZXQgNCAqLworI2RlZmluZSBUTVJMICAgICAgICAgICAgMHgwMCAvKiBUaW1lciB2YWx1ZSByZWdpc3RlciAobG93IGJ5dGUpICovCisjZGVmaW5lIFRNUkggICAgICAgICAgICAweDAxIC8qIFRpbWVyIHZhbHVlIHJlZ2lzdGVyIChoaWdoIGJ5dGUpICovCisKKyNkZWZpbmUgSVJfTVNMICAgICAgICAgIDB4MDIgLyogSW5mcmFyZWQgbW9kZSBzZWxlY3QgKi8KKyNkZWZpbmUgSVJfTVNMX0VOX1RNUiAgIDB4MDEgLyogRW5hYmxlIHRpbWVyICovCisKKyNkZWZpbmUgVEZSTEwJCTB4MDQgLyogVHJhbnNtaXR0ZXIgZnJhbWUgbGVuZ3RoIChsb3cgYnl0ZSkgKi8KKyNkZWZpbmUgVEZSTEgJCTB4MDUgLyogVHJhbnNtaXR0ZXIgZnJhbWUgbGVuZ3RoIChoaWdoIGJ5dGUpICovCisjZGVmaW5lIFJGUkxMCQkweDA2IC8qIFJlY2VpdmVyIGZyYW1lIGxlbmd0aCAobG93IGJ5dGUpICovCisjZGVmaW5lIFJGUkxICQkweDA3IC8qIFJlY2VpdmVyIGZyYW1lIGxlbmd0aCAoaGlnaCBieXRlKSAqLworCisvKiBTZXQgNSAqLworCisjZGVmaW5lIEZTX0ZPICAgICAgICAgICAweDA1IC8qIEZyYW1lIHN0YXR1cyBGSUZPICovCisjZGVmaW5lIEZTX0ZPX0ZTRkRSICAgICAweDgwIC8qIEZyYW1lIHN0YXR1cyBGSUZPIGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgRlNfRk9fTFNUX0ZSICAgIDB4NDAgLyogRnJhbWUgbG9zdCAqLworI2RlZmluZSBGU19GT19NWF9MRVggICAgMHgxMCAvKiBNYXggZnJhbWUgbGVuIGV4Y2VlZGVkICovCisjZGVmaW5lIEZTX0ZPX1BIWV9FUlIgICAweDA4IC8qIFBoeXNpY2FsIGxheWVyIGVycm9yICovCisjZGVmaW5lIEZTX0ZPX0NSQ19FUlIgICAweDA0IAorI2RlZmluZSBGU19GT19SWF9PViAgICAgMHgwMiAvKiBSZWNlaXZlIG92ZXJydW4gKi8KKyNkZWZpbmUgRlNfRk9fRlNGX09WICAgIDB4MDEgLyogRnJhbWUgc3RhdHVzIEZJRk8gb3ZlcnJ1biAqLworI2RlZmluZSBGU19GT19FUlJfTVNLICAgMHg1ZiAvKiBFcnJvciBtYXNrICovCisKKyNkZWZpbmUgUkZMRkwgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgUkZMRkggICAgICAgICAgIDB4MDcKKworLyogU2V0IDYgKi8KKyNkZWZpbmUgSVJfQ0ZHMgkJMHgwMAorI2RlZmluZSBJUl9DRkcyX0RJU19DUkMJMHgwMgorCisvKiBTZXQgNyAqLworI2RlZmluZSBJUk1fQ1IJCTB4MDcgLyogSW5mcmFyZWQgbW9kdWxlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVJNX0NSX0lSWF9NU0wJMHg0MAorI2RlZmluZSBJUk1fQ1JfQUZfTU5UICAgMHg4MCAvKiBBdXRvbWF0aWMgZm9ybWF0ICovCisKKy8qIEZvciBzdG9yaW5nIGVudHJpZXMgaW4gdGhlIHN0YXR1cyBGSUZPICovCitzdHJ1Y3Qgc3RfZmlmb19lbnRyeSB7CisJaW50IHN0YXR1czsKKwlpbnQgbGVuOworfTsKKworc3RydWN0IHN0X2ZpZm8geworCXN0cnVjdCBzdF9maWZvX2VudHJ5IGVudHJpZXNbMTBdOworCWludCBoZWFkOworCWludCB0YWlsOworCWludCBsZW47Cit9OworCisvKiBQcml2YXRlIGRhdGEgZm9yIGVhY2ggaW5zdGFuY2UgKi8KK3N0cnVjdCB3ODM5NzdhZl9pciB7CisJc3RydWN0IHN0X2ZpZm8gc3RfZmlmbzsKKworCWludCB0eF9idWZmX29mZnNldHNbMTBdOyAvKiBPZmZzZXRzIGJldHdlZW4gZnJhbWVzIGluIHR4X2J1ZmYgKi8KKwlpbnQgdHhfbGVuOyAgICAgICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzIGluIHR4X2J1ZmYgKi8KKworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7IC8qIFllcyEgd2UgYXJlIHNvbWUga2luZCBvZiBuZXRkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwkKKwlzdHJ1Y3QgaXJsYXBfY2IgICAgKmlybGFwOyAvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYmluZGVkIHRvICovCisJc3RydWN0IHFvc19pbmZvICAgICBxb3M7ICAgLyogUW9TIGNhcGFiaWxpdGllcyBmb3IgdGhpcyBkZXZpY2UgKi8KKwkKKwljaGlwaW9fdCBpbzsgICAgICAgICAgICAgICAvKiBJckRBIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KKwlpb2J1ZmZfdCB0eF9idWZmOyAgICAgICAgICAvKiBUcmFuc21pdCBidWZmZXIgKi8KKwlpb2J1ZmZfdCByeF9idWZmOyAgICAgICAgICAvKiBSZWNlaXZlIGJ1ZmZlciAqLworCWRtYV9hZGRyX3QgdHhfYnVmZl9kbWE7CisJZG1hX2FkZHJfdCByeF9idWZmX2RtYTsKKworCS8qIE5vdGUgOiBjdXJyZW50bHkgbG9ja2luZyBpcyAqdmVyeSogaW5jb21wbGV0ZSwgYnV0IHRoaXMKKwkgKiB3aWxsIGdldCB5b3Ugc3RhcnRlZC4gQ2hlY2sgaW4gbnNjLWlyY2MuYyBmb3IgYSBwcm9wZXIKKwkgKiBsb2NraW5nIHN0cmF0ZWd5LiAtIEplYW4gSUkgKi8KKwlzcGlubG9ja190IGxvY2s7ICAgICAgICAgICAvKiBGb3Igc2VyaWFsaXppbmcgb3BlcmF0aW9ucyAqLworCQorCV9fdTMyIG5ld19zcGVlZDsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzd2l0Y2hfYmFuayggaW50IGlvYmFzZSwgaW50IHNldCkKK3sKKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXNhLXNrZWxldG9uLmMgYi9kcml2ZXJzL25ldC9pc2Etc2tlbGV0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJlYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXNhLXNrZWxldG9uLmMKQEAgLTAsMCArMSw3MjQgQEAKKy8qIGlzYS1za2VsZXRvbi5jOiBBIG5ldHdvcmsgZHJpdmVyIG91dGxpbmUgZm9yIGxpbnV4LgorICoKKyAqCVdyaXR0ZW4gMTk5My05NCBieSBEb25hbGQgQmVja2VyLgorICoKKyAqCUNvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisgKgorICoJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICoJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKglUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworICoJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisgKgk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorICoJQW5uYXBvbGlzIE1EIDIxNDAzCisgKgorICoJVGhpcyBmaWxlIGlzIGFuIG91dGxpbmUgZm9yIHdyaXRpbmcgYSBuZXR3b3JrIGRldmljZSBkcml2ZXIgZm9yIHRoZQorICoJdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0uCisgKgorICoJVG8gd3JpdGUgKG9yIHVuZGVyc3RhbmQpIGEgZHJpdmVyLCBoYXZlIGEgbG9vayBhdCB0aGUgImxvb3BiYWNrLmMiIGZpbGUgdG8KKyAqCWdldCBhIGZlZWwgb2Ygd2hhdCBpcyBnb2luZyBvbiwgYW5kIHRoZW4gdXNlIHRoZSBjb2RlIGJlbG93IGFzIGEgc2tlbGV0b24KKyAqCWZvciB0aGUgbmV3IGRyaXZlci4KKyAqCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQorCSJpc2Etc2tlbGV0b24uYzp2MS41MSA5LzI0Lzk0IERvbmFsZCBCZWNrZXIgKGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdilcbiI7CisKKy8qCisgKiAgU291cmNlczoKKyAqCUxpc3QgeW91ciBzb3VyY2VzIG9mIHByb2dyYW1taW5nIGluZm9ybWF0aW9uIHRvIGRvY3VtZW50IHRoYXQKKyAqCXRoZSBkcml2ZXIgaXMgeW91ciBvd24gY3JlYXRpb24sIGFuZCBnaXZlIGR1ZSBjcmVkaXQgdG8gb3RoZXJzCisgKgl0aGF0IGNvbnRyaWJ1dGVkIHRvIHRoZSB3b3JrLiBSZW1lbWJlciB0aGF0IEdOVSBwcm9qZWN0IGNvZGUKKyAqCWNhbm5vdCB1c2UgcHJvcHJpZXRhcnkgb3IgdHJhZGUgc2VjcmV0IGluZm9ybWF0aW9uLiBJbnRlcmZhY2UKKyAqCWRlZmluaXRpb25zIGFyZSBnZW5lcmFsbHkgY29uc2lkZXJlZCBub24tY29weXJpZ2h0YWJsZSB0byB0aGUKKyAqCWV4dGVudCB0aGF0IHRoZSBzYW1lIG5hbWVzIGFuZCBzdHJ1Y3R1cmVzIG11c3QgYmUgdXNlZCB0byBiZQorICoJY29tcGF0aWJsZS4KKyAqCisgKglGaW5hbGx5LCBrZWVwIGluIG1pbmQgdGhhdCB0aGUgTGludXgga2VybmVsIGlzIGhhcyBhbiBBUEksIG5vdAorICoJQUJJLiBQcm9wcmlldGFyeSBvYmplY3QtY29kZS1vbmx5IGRpc3RyaWJ1dGlvbnMgYXJlIG5vdCBwZXJtaXR0ZWQKKyAqCXVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisvKgorICogVGhlIG5hbWUgb2YgdGhlIGNhcmQuIElzIHVzZWQgZm9yIG1lc3NhZ2VzIGFuZCBpbiB0aGUgcmVxdWVzdHMgZm9yCisgKiBpbyByZWdpb25zLCBpcnFzIGFuZCBkbWEgY2hhbm5lbHMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIqIGNhcmRuYW1lID0gIm5ldGNhcmQiOworCisvKiBGaXJzdCwgYSBmZXcgZGVmaW5pdGlvbnMgdGhhdCB0aGUgYnJhdmUgbWlnaHQgY2hhbmdlLiAqLworCisvKiBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIEkvTyBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkLiAqLworc3RhdGljIHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9CisgICB7IDB4MjAwLCAweDI0MCwgMHgyODAsIDB4MkMwLCAweDMwMCwgMHgzMjAsIDB4MzQwLCAwfTsKKworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnICovCisjaWZuZGVmIE5FVF9ERUJVRworI2RlZmluZSBORVRfREVCVUcgMgorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldF9kZWJ1ZyA9IE5FVF9ERUJVRzsKKworLyogVGhlIG51bWJlciBvZiBsb3cgSS9PIHBvcnRzIHVzZWQgYnkgdGhlIGV0aGVyY2FyZC4gKi8KKyNkZWZpbmUgTkVUQ0FSRF9JT19FWFRFTlQJMzIKKworI2RlZmluZSBNWV9UWF9USU1FT1VUICAoKDQwMCpIWikvMTAwMCkKKworLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuICovCitzdHJ1Y3QgbmV0X2xvY2FsIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlsb25nIG9wZW5fdGltZTsJCQkvKiBVc2VsZXNzIGV4YW1wbGUgbG9jYWwgaW5mby4gKi8KKworCS8qIFR4IGNvbnRyb2wgbG9jay4gIFRoaXMgcHJvdGVjdHMgdGhlIHRyYW5zbWl0IGJ1ZmZlciByaW5nCisJICogc3RhdGUgYWxvbmcgd2l0aCB0aGUgInR4IGZ1bGwiIHN0YXRlIG9mIHRoZSBkcml2ZXIuICBUaGlzCisJICogbWVhbnMgYWxsIG5ldGlmX3F1ZXVlIGZsb3cgY29udHJvbCBhY3Rpb25zIGFyZSBwcm90ZWN0ZWQKKwkgKiBieSB0aGlzIGxvY2sgYXMgd2VsbC4KKwkgKi8KKwlzcGlubG9ja190IGxvY2s7Cit9OworCisvKiBUaGUgc3RhdGlvbiAoZXRoZXJuZXQpIGFkZHJlc3MgcHJlZml4LCB1c2VkIGZvciBJRGluZyB0aGUgYm9hcmQuICovCisjZGVmaW5lIFNBX0FERFIwIDB4MDAKKyNkZWZpbmUgU0FfQUREUjEgMHg0MgorI2RlZmluZSBTQV9BRERSMiAweDY1CisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KKworc3RhdGljIGludAluZXRjYXJkX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQJbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CW5ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBuZXRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQJbmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAluZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0CW5ldF9kZXZpY2Vfc3RhdHMgKm5ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAlzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICAgbmV0X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworLyogRXhhbXBsZSByb3V0aW5lcyB5b3UgbXVzdCB3cml0ZSA7LT4uICovCisjZGVmaW5lIHR4X2RvbmUoZGV2KSAxCitzdGF0aWMgdm9pZAloYXJkd2FyZV9zZW5kX3BhY2tldChzaG9ydCBpb2FkZHIsIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCAJY2hpcHNldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGFydHApOworCisvKgorICogQ2hlY2sgZm9yIGEgbmV0d29yayBhZGFwdG9yIG9mIHRoaXMgdHlwZSwgYW5kIHJldHVybiAnMCcgaWZmIG9uZSBleGlzdHMuCisgKiBJZiBkZXYtPmJhc2VfYWRkciA9PSAwLCBwcm9iZSBhbGwgbGlrZWx5IGxvY2F0aW9ucy4KKyAqIElmIGRldi0+YmFzZV9hZGRyID09IDEsIGFsd2F5cyByZXR1cm4gZmFpbHVyZS4KKyAqIElmIGRldi0+YmFzZV9hZGRyID09IDIsIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZGV2aWNlIGFuZCByZXR1cm4gc3VjY2VzcworICogKGRldGFjaGFibGUgZGV2aWNlcyBvbmx5KS4KKyAqLworc3RhdGljIGludCBfX2luaXQgZG9fbmV0Y2FyZF9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCWludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaXJxID0gZGV2LT5pcnE7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoYmFzZV9hZGRyID4gMHgxZmYpICAgIC8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJcmV0dXJuIG5ldGNhcmRfcHJvYmUxKGRldiwgYmFzZV9hZGRyKTsKKwllbHNlIGlmIChiYXNlX2FkZHIgIT0gMCkgIC8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJcmV0dXJuIC1FTlhJTzsKKworCWZvciAoaSA9IDA7IG5ldGNhcmRfcG9ydGxpc3RbaV07IGkrKykgeworCQlpbnQgaW9hZGRyID0gbmV0Y2FyZF9wb3J0bGlzdFtpXTsKKwkJaWYgKG5ldGNhcmRfcHJvYmUxKGRldiwgaW9hZGRyKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJCWRldi0+aXJxID0gaXJxOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorIAorc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisjaWZkZWYganVtcGVyZWRfZG1hCisJZnJlZV9kbWEoZGV2LT5kbWEpOworI2VuZGlmCisjaWZkZWYganVtcGVyZWRfaW50ZXJydXB0cworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworI2VuZGlmCisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIE5FVENBUkRfSU9fRVhURU5UKTsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IG5ldGNhcmRfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gZG9fbmV0Y2FyZF9wcm9iZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwljbGVhbnVwX2NhcmQoZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworLyoKKyAqIFRoaXMgaXMgdGhlIHJlYWwgcHJvYmUgcm91dGluZS4gTGludXggaGFzIGEgaGlzdG9yeSBvZiBmcmllbmRseSBkZXZpY2UKKyAqIHByb2JlcyBvbiB0aGUgSVNBIGJ1cy4gQSBnb29kIGRldmljZSBwcm9iZXMgYXZvaWRzIGRvaW5nIHdyaXRlcywgYW5kCisgKiB2ZXJpZmllcyB0aGF0IHRoZSBjb3JyZWN0IGRldmljZSBleGlzdHMgYW5kIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIGludCBfX2luaXQgbmV0Y2FyZF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucDsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCWludCBpOworCWludCBlcnIgPSAtRU5PREVWOworCisJLyogR3JhYiB0aGUgcmVnaW9uIHNvIHRoYXQgbm8gb25lIGVsc2UgdHJpZXMgdG8gcHJvYmUgb3VyIGlvcG9ydHMuICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIE5FVENBUkRfSU9fRVhURU5ULCBjYXJkbmFtZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKgorCSAqIEZvciBldGhlcm5ldCBhZGFwdG9ycyB0aGUgZmlyc3QgdGhyZWUgb2N0ZXRzIG9mIHRoZSBzdGF0aW9uIGFkZHJlc3MgCisJICogY29udGFpbnMgdGhlIG1hbnVmYWN0dXJlcidzIHVuaXF1ZSBjb2RlLiBUaGF0IG1pZ2h0IGJlIGEgZ29vZCBwcm9iZQorCSAqIG1ldGhvZC4gSWRlYWxseSB5b3Ugd291bGQgYWRkIGFkZGl0aW9uYWwgY2hlY2tzLgorCSAqLyAKKwlpZiAoaW5iKGlvYWRkciArIDApICE9IFNBX0FERFIwCisJCXx8CSBpbmIoaW9hZGRyICsgMSkgIT0gU0FfQUREUjEKKwkJfHwJIGluYihpb2FkZHIgKyAyKSAhPSBTQV9BRERSMikKKwkJZ290byBvdXQ7CisKKwlpZiAobmV0X2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIiwgdmVyc2lvbik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgZm91bmQgYXQgJSMzeCwgIiwgZGV2LT5uYW1lLCBjYXJkbmFtZSwgaW9hZGRyKTsKKworCS8qIEZpbGwgaW4gdGhlICdkZXYnIGZpZWxkcy4gKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworCS8qIFJldHJpZXZlIGFuZCBwcmludCB0aGUgZXRoZXJuZXQgYWRkcmVzcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiAlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgaSkpOworCisJZXJyID0gLUVBR0FJTjsKKyNpZmRlZiBqdW1wZXJlZF9pbnRlcnJ1cHRzCisJLyoKKwkgKiBJZiB0aGlzIGJvYXJkIGhhcyBqdW1wZXJlZCBpbnRlcnJ1cHRzLCBhbGxvY2F0ZSB0aGUgaW50ZXJydXB0CisJICogdmVjdG9yIG5vdy4gVGhlcmUgaXMgbm8gcG9pbnQgaW4gd2FpdGluZyBzaW5jZSBubyBvdGhlciBkZXZpY2UKKwkgKiBjYW4gdXNlIHRoZSBpbnRlcnJ1cHQsIGFuZCB0aGlzIG1hcmtzIHRoZSBpcnEgYXMgYnVzeS4gSnVtcGVyZWQKKwkgKiBpbnRlcnJ1cHRzIGFyZSB0eXBpY2FsbHkgbm90IHJlcG9ydGVkIGJ5IHRoZSBib2FyZHMsIGFuZCB3ZSBtdXN0CisJICogdXNlZCBhdXRvSVJRIHRvIGZpbmQgdGhlbS4KKwkgKi8KKworCWlmIChkZXYtPmlycSA9PSAtMSkKKwkJOwkvKiBEbyBub3RoaW5nOiBhIHVzZXItbGV2ZWwgcHJvZ3JhbSB3aWxsIHNldCBpdC4gKi8KKwllbHNlIGlmIChkZXYtPmlycSA8IDIpIHsJLyogIkF1dG8tSVJRIiAqLworCQl1bnNpZ25lZCBsb25nIGlycV9tYXNrID0gcHJvYmVfaXJxX29uKCk7CisJCS8qIFRyaWdnZXIgYW4gaW50ZXJydXB0IGhlcmUuICovCisKKwkJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmKGlycV9tYXNrKTsKKwkJaWYgKG5ldF9kZWJ1ZyA+PSAyKQorCQkJcHJpbnRrKCIgYXV0b2lycSBpcyAlZCIsIGRldi0+aXJxKTsKKwl9IGVsc2UgaWYgKGRldi0+aXJxID09IDIpCisJCS8qCisJCSAqIEZpeHVwIGZvciB1c2VycyB0aGF0IGRvbid0IGtub3cgdGhhdCBJUlEgMiBpcyByZWFsbHkKKwkJICogSVJROSwgb3IgZG9uJ3Qga25vdyB3aGljaCBvbmUgdG8gc2V0LgorCQkgKi8KKwkJZGV2LT5pcnEgPSA5OworCisJeworCQlpbnQgaXJxdmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZuZXRfaW50ZXJydXB0LCAwLCBjYXJkbmFtZSwgZGV2KTsKKwkJaWYgKGlycXZhbCkgeworCQkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGdldCBJUlEgJWQgKGlycXZhbD0lZCkuXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgZGV2LT5pcnEsIGlycXZhbCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKyNlbmRpZgkvKiBqdW1wZXJlZCBpbnRlcnJ1cHQgKi8KKyNpZmRlZiBqdW1wZXJlZF9kbWEKKwkvKgorCSAqIElmIHdlIHVzZSBhIGp1bXBlcmVkIERNQSBjaGFubmVsLCB0aGF0IHNob3VsZCBiZSBwcm9iZWQgZm9yIGFuZAorCSAqIGFsbG9jYXRlZCBoZXJlIGFzIHdlbGwuIFNlZSBsYW5jZS5jIGZvciBhbiBleGFtcGxlLgorCSAqLworCWlmIChkZXYtPmRtYSA9PSAwKSB7CisJCWlmIChyZXF1ZXN0X2RtYShkZXYtPmRtYSwgY2FyZG5hbWUpKSB7CisJCQlwcmludGsoIkRNQSAlZCBhbGxvY2F0aW9uIGZhaWxlZC5cbiIsIGRldi0+ZG1hKTsKKwkJCWdvdG8gb3V0MTsKKwkJfSBlbHNlCisJCQlwcmludGsoIiwgYXNzaWduZWQgRE1BICVkLlxuIiwgZGV2LT5kbWEpOworCX0gZWxzZSB7CisJCXNob3J0IGRtYV9zdGF0dXMsIG5ld19kbWFfc3RhdHVzOworCisJCS8qIFJlYWQgdGhlIERNQSBjaGFubmVsIHN0YXR1cyByZWdpc3RlcnMuICovCisJCWRtYV9zdGF0dXMgPSAoKGluYihETUExX1NUQVRfUkVHKSA+PiA0KSAmIDB4MGYpIHwKKwkJCShpbmIoRE1BMl9TVEFUX1JFRykgJiAweGYwKTsKKwkJLyogVHJpZ2dlciBhIERNQSByZXF1ZXN0LCBwZXJoYXBzIHBhdXNlIGEgYml0LiAqLworCQlvdXR3KDB4MTIzNCwgaW9hZGRyICsgOCk7CisJCS8qIFJlLXJlYWQgdGhlIERNQSBzdGF0dXMgcmVnaXN0ZXJzLiAqLworCQluZXdfZG1hX3N0YXR1cyA9ICgoaW5iKERNQTFfU1RBVF9SRUcpID4+IDQpICYgMHgwZikgfAorCQkJKGluYihETUEyX1NUQVRfUkVHKSAmIDB4ZjApOworCQkvKgorCQkgKiBFbGltaW5hdGUgdGhlIG9sZCBhbmQgZmxvYXRpbmcgcmVxdWVzdHMsCisJCSAqIGFuZCBETUE0IHRoZSBjYXNjYWRlLgorCQkgKi8KKwkJbmV3X2RtYV9zdGF0dXMgXj0gZG1hX3N0YXR1czsKKwkJbmV3X2RtYV9zdGF0dXMgJj0gfjB4MTA7CisJCWZvciAoaSA9IDc7IGkgPiAwOyBpLS0pCisJCQlpZiAodGVzdF9iaXQoaSwgJm5ld19kbWFfc3RhdHVzKSkgeworCQkJCWRldi0+ZG1hID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJaWYgKGkgPD0gMCkgeworCQkJcHJpbnRrKCJETUEgcHJvYmUgZmFpbGVkLlxuIik7CisJCQlnb3RvIG91dDE7CisJCX0gCisJCWlmIChyZXF1ZXN0X2RtYShkZXYtPmRtYSwgY2FyZG5hbWUpKSB7CisJCQlwcmludGsoInByb2JlZCBETUEgJWQgYWxsb2NhdGlvbiBmYWlsZWQuXG4iLCBkZXYtPmRtYSk7CisJCQlnb3RvIG91dDE7CisJCX0KKwl9CisjZW5kaWYJLyoganVtcGVyZWQgRE1BICovCisKKwlucCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2luaXQoJm5wLT5sb2NrKTsKKworCWRldi0+b3BlbgkJPSBuZXRfb3BlbjsKKwlkZXYtPnN0b3AJCT0gbmV0X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gbmV0X3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzCQk9IG5ldF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworCisgICAgICAgIGRldi0+dHhfdGltZW91dAkJPSAmbmV0X3R4X3RpbWVvdXQ7CisgICAgICAgIGRldi0+d2F0Y2hkb2dfdGltZW8JPSBNWV9UWF9USU1FT1VUOyAKKwlyZXR1cm4gMDsKK291dDE6CisjaWZkZWYganVtcGVyZWRfaW50ZXJydXB0cworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworI2VuZGlmCitvdXQ6CisJcmVsZWFzZV9yZWdpb24oYmFzZV9hZGRyLCBORVRDQVJEX0lPX0VYVEVOVCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgbmV0X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCAlcz9cbiIsIGRldi0+bmFtZSwKKwkgICAgICAgdHhfZG9uZShkZXYpID8gIklSUSBjb25mbGljdCIgOiAibmV0d29yayBjYWJsZSBwcm9ibGVtIik7CisKKwkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvci4gKi8KKwljaGlwc2V0X2luaXQoZGV2LCAxKTsKKworCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKworCS8qIElmIHdlIGhhdmUgc3BhY2UgYXZhaWxhYmxlIHRvIGFjY2VwdCBuZXcgdHJhbnNtaXQKKwkgKiByZXF1ZXN0cywgd2FrZSB1cCB0aGUgcXVldWVpbmcgbGF5ZXIuICBUaGlzIHdvdWxkCisJICogYmUgdGhlIGNhc2UgaWYgdGhlIGNoaXBzZXRfaW5pdCgpIGNhbGwgYWJvdmUganVzdAorCSAqIGZsdXNoZXMgb3V0IHRoZSB0eCBxdWV1ZSBhbmQgZW1wdGllcyBpdC4KKwkgKgorCSAqIElmIGluc3RlYWQsIHRoZSB0eCBxdWV1ZSBpcyByZXRhaW5lZCB0aGVuIHRoZQorCSAqIG5ldGlmX3dha2VfcXVldWUoKSBjYWxsIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhlCisJICogVFggY29tcGxldGlvbiBpbnRlcnJ1cHQgaGFuZGxlciBvZiB0aGUgZHJpdmVyIGluc3RlYWQKKwkgKiBvZiBoZXJlLgorCSAqLworCWlmICghdHhfZnVsbChkZXYpKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICogc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCitzdGF0aWMgaW50CituZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJLyoKKwkgKiBUaGlzIGlzIHVzZWQgaWYgdGhlIGludGVycnVwdCBsaW5lIGNhbiB0dXJuZWQgb2ZmIChzaGFyZWQpLgorCSAqIFNlZSAzYzUwMy5jIGZvciBhbiBleGFtcGxlIG9mIHNlbGVjdGluZyB0aGUgSVJRIGF0IGNvbmZpZy10aW1lLgorCSAqLworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJm5ldF9pbnRlcnJ1cHQsIDAsIGNhcmRuYW1lLCBkZXYpKSB7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkvKgorCSAqIEFsd2F5cyBhbGxvY2F0ZSB0aGUgRE1BIGNoYW5uZWwgYWZ0ZXIgdGhlIElSUSwKKwkgKiBhbmQgY2xlYW4gdXAgb24gZmFpbHVyZS4KKwkgKi8KKwlpZiAocmVxdWVzdF9kbWEoZGV2LT5kbWEsIGNhcmRuYW1lKSkgeworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogUmVzZXQgdGhlIGhhcmR3YXJlIGhlcmUuIERvbid0IGZvcmdldCB0byBzZXQgdGhlIHN0YXRpb24gYWRkcmVzcy4gKi8KKwljaGlwc2V0X2luaXQoZGV2LCAxKTsKKwlvdXRiKDB4MDAsIGlvYWRkcik7CisJbnAtPm9wZW5fdGltZSA9IGppZmZpZXM7CisKKwkvKiBXZSBhcmUgbm93IHJlYWR5IHRvIGFjY2VwdCB0cmFuc21pdCByZXF1ZXVzdHMgZnJvbQorCSAqIHRoZSBxdWV1ZWluZyBsYXllciBvZiB0aGUgbmV0d29ya2luZy4KKwkgKi8KKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgd2lsbCBvbmx5IGJlIGludm9rZWQgaWYgeW91ciBkcml2ZXIgaXMgX25vdF8gaW4gWE9GRiBzdGF0ZS4KKyAqIFdoYXQgdGhpcyBtZWFucyBpcyB0aGF0IHlvdSBuZWVkIG5vdCBjaGVjayBpdCwgYW5kIHRoYXQgdGhpcworICogaW52YXJpYW50IHdpbGwgaG9sZCBpZiB5b3UgbWFrZSBzdXJlIHRoYXQgdGhlIG5ldGlmXypfcXVldWUoKQorICogY2FsbHMgYXJlIGRvbmUgYXQgdGhlIHByb3BlciB0aW1lcy4KKyAqLworc3RhdGljIGludCBuZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXNob3J0IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKworCS8qIElmIHNvbWUgZXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byB0cmFuc21pdCB0aGlzCisJICogcGFja2V0LCB5b3Ugc2hvdWxkIHJldHVybiAnMScgZnJvbSB0aGlzIGZ1bmN0aW9uLgorCSAqIEluIHN1Y2ggYSBjYXNlIHlvdSBfbWF5IG5vdF8gZG8gYW55dGhpbmcgdG8gdGhlCisJICogU0tCLCBpdCBpcyBzdGlsbCBvd25lZCBieSB0aGUgbmV0d29yayBxdWV1ZWluZworCSAqIGxheWVyIHdoZW4gYW4gZXJyb3IgaXMgcmV0dXJuZWQuICBUaGlzIG1lYW5zIHlvdQorCSAqIG1heSBub3QgbW9kaWZ5IGFueSBTS0IgZmllbGRzLCB5b3UgbWF5IG5vdCBmcmVlCisJICogdGhlIFNLQiwgZXRjLgorCSAqLworCisjaWYgVFhfUklORworCS8qIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIGNhc2UgZm9yIG1vZGVybiBoYXJkd2FyZS4KKwkgKiBUaGUgc3BpbmxvY2sgcHJvdGVjdHMgdGhpcyBjb2RlIGZyb20gdGhlIFRYIGNvbXBsZXRlCisJICogaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIuICBRdWV1ZSBmbG93IGNvbnRyb2wgaXMKKwkgKiB0aHVzIG1hbmFnZWQgdW5kZXIgdGhpcyBsb2NrIGFzIHdlbGwuCisJICovCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCisJYWRkX3RvX3R4X3JpbmcobnAsIHNrYiwgbGVuZ3RoKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIElmIHdlIGp1c3QgdXNlZCB1cCB0aGUgdmVyeSBsYXN0IGVudHJ5IGluIHRoZQorCSAqIFRYIHJpbmcgb24gdGhpcyBkZXZpY2UsIHRlbGwgdGhlIHF1ZXVlaW5nCisJICogbGF5ZXIgdG8gc2VuZCBubyBtb3JlLgorCSAqLworCWlmICh0eF9mdWxsKGRldikpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIFdoZW4gdGhlIFRYIGNvbXBsZXRpb24gaHcgaW50ZXJydXB0IGFycml2ZXMsIHRoaXMKKwkgKiBpcyB3aGVuIHRoZSB0cmFuc21pdCBzdGF0aXN0aWNzIGFyZSB1cGRhdGVkLgorCSAqLworCisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisjZWxzZQorCS8qIFRoaXMgaXMgdGhlIGNhc2UgZm9yIG9sZGVyIGhhcmR3YXJlIHdoaWNoIHRha2VzCisJICogYSBzaW5nbGUgdHJhbnNtaXQgYnVmZmVyIGF0IGEgdGltZSwgYW5kIGl0IGlzCisJICoganVzdCB3cml0dGVuIHRvIHRoZSBkZXZpY2UgdmlhIFBJTy4KKwkgKgorCSAqIE5vIHNwaW4gbG9ja2luZyBpcyBuZWVkZWQgc2luY2UgdGhlcmUgaXMgbm8gVFggY29tcGxldGUKKwkgKiBldmVudC4gIElmIGJ5IGNoYW5jZSB5b3VyIGNhcmQgZG9lcyBoYXZlIGEgVFggY29tcGxldGUKKwkgKiBoYXJkd2FyZSBJUlEgdGhlbiB5b3UgbWF5IG5lZWQgdG8gdXRpbGl6ZSBucC0+bG9jayBoZXJlLgorCSAqLworCWhhcmR3YXJlX3NlbmRfcGFja2V0KGlvYWRkciwgYnVmLCBsZW5ndGgpOworCW5wLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogWW91IG1pZ2h0IG5lZWQgdG8gY2xlYW4gdXAgYW5kIHJlY29yZCBUeCBzdGF0aXN0aWNzIGhlcmUuICovCisJaWYgKGludyhpb2FkZHIpID09IC8qUlUqLzgxKQorCQlucC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwlkZXZfa2ZyZWVfc2tiIChza2IpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworI2lmIFRYX1JJTkcKKy8qIFRoaXMgaGFuZGxlcyBUWCBjb21wbGV0ZSBldmVudHMgcG9zdGVkIGJ5IHRoZSBkZXZpY2UKKyAqIHZpYSBpbnRlcnJ1cHRzLgorICovCit2b2lkIG5ldF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnk7CisKKwkvKiBUaGlzIHByb3RlY3RzIHVzIGZyb20gY29uY3VycmVudCBleGVjdXRpb24gb2YKKwkgKiBvdXIgZGV2LT5oYXJkX3N0YXJ0X3htaXQgZnVuY3Rpb24gYWJvdmUuCisJICovCisJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisKKwllbnRyeSA9IG5wLT50eF9vbGQ7CisJd2hpbGUgKHR4X2VudHJ5X2lzX3NlbnQobnAsIGVudHJ5KSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbnAtPnNrYnNbZW50cnldOworCisJCW5wLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJZGV2X2tmcmVlX3NrYl9pcnEgKHNrYik7CisKKwkJZW50cnkgPSBuZXh0X3R4X2VudHJ5KG5wLCBlbnRyeSk7CisJfQorCW5wLT50eF9vbGQgPSBlbnRyeTsKKworCS8qIElmIHdlIGhhZCBzdG9wcGVkIHRoZSBxdWV1ZSBkdWUgdG8gYSAidHggZnVsbCIKKwkgKiBjb25kaXRpb24sIGFuZCBzcGFjZSBoYXMgbm93IGJlZW4gbWFkZSBhdmFpbGFibGUsCisJICogd2FrZSB1cCB0aGUgcXVldWUuCisJICovCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJiAhIHR4X2Z1bGwoZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKK30KKyNlbmRpZgorCisvKgorICogVGhlIHR5cGljYWwgd29ya2xvYWQgb2YgdGhlIGRyaXZlcjoKKyAqIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIGlycXJldHVybl90IG5ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucDsKKwlpbnQgaW9hZGRyLCBzdGF0dXM7CisJaW50IGhhbmRsZWQgPSAwOworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RhdHVzID0gaW53KGlvYWRkciArIDApOworCisJaWYgKHN0YXR1cyA9PSAwKQorCQlnb3RvIG91dDsKKwloYW5kbGVkID0gMTsKKworCWlmIChzdGF0dXMgJiBSWF9JTlRSKSB7CisJCS8qIEdvdCBhIHBhY2tldChzKS4gKi8KKwkJbmV0X3J4KGRldik7CisJfQorI2lmIFRYX1JJTkcKKwlpZiAoc3RhdHVzICYgVFhfSU5UUikgeworCQkvKiBUcmFuc21pdCBjb21wbGV0ZS4gKi8KKwkJbmV0X3R4KGRldik7CisJCW5wLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisjZW5kaWYKKwlpZiAoc3RhdHVzICYgQ09VTlRFUlNfSU5UUikgeworCQkvKiBJbmNyZW1lbnQgdGhlIGFwcHJvcHJpYXRlICdsb2NhbHN0YXRzJyBmaWVsZC4gKi8KKwkJbnAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwl9CitvdXQ6CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLiAqLworc3RhdGljIHZvaWQKK25ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGJvZ3VzY291bnQgPSAxMDsKKworCWRvIHsKKwkJaW50IHN0YXR1cyA9IGludyhpb2FkZHIpOworCQlpbnQgcGt0X2xlbiA9IGludyhpb2FkZHIpOworCSAgCisJCWlmIChwa3RfbGVuID09IDApCQkvKiBSZWFkIGFsbCB0aGUgZnJhbWVzPyAqLworCQkJYnJlYWs7CQkJLyogRG9uZSBmb3Igbm93ICovCisKKwkJaWYgKHN0YXR1cyAmIDB4NDApIHsJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIDB4MjApIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAweDEwKSBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAweDA4KSBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIDB4MDQpIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlscC0+c3RhdHMucnhfYnl0ZXMrPXBrdF9sZW47CisJCQkKKwkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbik7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJc2tiLT5kZXYgPSBkZXY7CisKKwkJCS8qICdza2ItPmRhdGEnIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEuICovCisJCQltZW1jcHkoc2tiX3B1dChza2IscGt0X2xlbiksICh2b2lkKilkZXYtPnJtZW1fc3RhcnQsCisJCQkJICAgcGt0X2xlbik7CisJCQkvKiBvciAqLworCQkJaW5zdyhpb2FkZHIsIHNrYi0+ZGF0YSwgKHBrdF9sZW4gKyAxKSA+PiAxKTsKKworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0KKwl9IHdoaWxlICgtLWJvZ3VzY291bnQpOworCisJcmV0dXJuOworfQorCisvKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIG5ldF9vcGVuKCkuICovCitzdGF0aWMgaW50CituZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJbHAtPm9wZW5fdGltZSA9IDA7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnggaGVyZS4gKi8KKworCWRpc2FibGVfZG1hKGRldi0+ZG1hKTsKKworCS8qIElmIG5vdCBJUlEgb3IgRE1BIGp1bXBlcmVkLCBmcmVlIHVwIHRoZSBsaW5lLiAqLworCW91dHcoMHgwMCwgaW9hZGRyKzApOwkvKiBSZWxlYXNlIHRoZSBwaHlzaWNhbCBpbnRlcnJ1cHQgbGluZS4gKi8KKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCWZyZWVfZG1hKGRldi0+ZG1hKTsKKworCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBoZXJlLiAqLworCisJcmV0dXJuIDA7CisKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLgorICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBmcm9tIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLiAqLworCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gaW53KGlvYWRkcisxKTsKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyoKKyAqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICogbnVtX2FkZHJzID09IC0xCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKyAqIG51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICogbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsCisgKgkJCWFuZCBkbyBiZXN0LWVmZm9ydCBmaWx0ZXJpbmcuCisgKi8KK3N0YXRpYyB2b2lkCitzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpZiAoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykKKwl7CisJCS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCW91dHcoTVVMVElDQVNUfFBST01JU0MsIGlvYWRkcik7CisJfQorCWVsc2UgaWYoKGRldi0+ZmxhZ3MmSUZGX0FMTE1VTFRJKSB8fCBkZXYtPm1jX2NvdW50ID4gSFdfTUFYX0FERFJTKQorCXsKKwkJLyogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlLCB1c2Ugbm9ybWFsIG1vZGUuICovCisJCWhhcmR3YXJlX3NldF9maWx0ZXIoTlVMTCk7CisKKwkJb3V0dyhNVUxUSUNBU1QsIGlvYWRkcik7CisJfQorCWVsc2UgaWYoZGV2LT5tY19jb3VudCkKKwl7CisJCS8qIFdhbGsgdGhlIGFkZHJlc3MgbGlzdCwgYW5kIGxvYWQgdGhlIGZpbHRlciAqLworCQloYXJkd2FyZV9zZXRfZmlsdGVyKGRldi0+bWNfbGlzdCk7CisKKwkJb3V0dyhNVUxUSUNBU1QsIGlvYWRkcik7CisJfQorCWVsc2UgCisJCW91dHcoMCwgaW9hZGRyKTsKK30KKworI2lmZGVmIE1PRFVMRQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnRoaXNfZGV2aWNlOworc3RhdGljIGludCBpbyA9IDB4MzAwOworc3RhdGljIGludCBpcnE7CitzdGF0aWMgaW50IGRtYTsKK3N0YXRpYyBpbnQgbWVtOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCByZXN1bHQ7CisKKwlpZiAoaW8gPT0gMCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFlvdSBzaG91bGRuJ3QgdXNlIGF1dG8tcHJvYmluZyB3aXRoIGluc21vZCFcbiIsCisJCQkgICBjYXJkbmFtZSk7CisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBDb3B5IHRoZSBwYXJhbWV0ZXJzIGZyb20gaW5zbW9kIGludG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5iYXNlX2FkZHIgPSBpbzsKKwlkZXYtPmlycSAgICAgICA9IGlycTsKKwlkZXYtPmRtYSAgICAgICA9IGRtYTsKKwlkZXYtPm1lbV9zdGFydCA9IG1lbTsKKwlpZiAoZG9fbmV0Y2FyZF9wcm9iZShkZXYpID09IDApIHsKKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApCisJCQl0aGlzX2RldmljZSA9IGRldjsKKwkJCXJldHVybiAwOworCQl9CisJCWNsZWFudXBfY2FyZChkZXYpOworCX0KKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiAtRU5YSU87Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYodGhpc19kZXZpY2UpOworCWNsZWFudXBfY2FyZCh0aGlzX2RldmljZSk7CisJZnJlZV9uZXRkZXYodGhpc19kZXZpY2UpOworfQorCisjZW5kaWYgLyogTU9EVUxFICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOgorICoJZ2NjIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xd3JpdGUtc3RyaW5ncworICoJLVdyZWR1bmRhbnQtZGVjbHMgLU8yIC1tNDg2IC1jIHNrZWxldG9uLmMKKyAqICB2ZXJzaW9uLWNvbnRyb2w6IHQKKyAqICBrZXB0LW5ldy12ZXJzaW9uczogNQorICogIHRhYi13aWR0aDogNAorICogIGMtaW5kZW50LWxldmVsOiA0CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jIGIvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1ZjhiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jCkBAIC0wLDAgKzEsMTQyMiBAQAorLyogRmlsZSB2ZXRoLmMgY3JlYXRlZCBieSBLeWxlIEEuIEx1Y2tlIG9uIE1vbiBBdWcgIDcgMjAwMC4gKi8KKy8qCisgKiBJQk0gZVNlcnZlciBpU2VyaWVzIFZpcnR1YWwgRXRoZXJuZXQgRGV2aWNlIERyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDAxIEt5bGUgQS4gTHVja2UgKGtsdWNrZUB1cy5pYm0uY29tKSwgSUJNIENvcnAuCisgKiBTdWJzdGFudGlhbGx5IGNsZWFuZWQgdXAgYnk6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgRGF2aWQgR2lic29uIDxkd2dAYXUxLmlibS5jb20+LCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICogVVNBCisgKgorICoKKyAqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIHZpcnR1YWwgZXRoZXJuZXQgZGV2aWNlIGZvciBpU2VyaWVzIExQQVIKKyAqIExpbnV4LiAgSXQgdXNlcyBoeXBlcnZpc29yIG1lc3NhZ2UgcGFzc2luZyB0byBpbXBsZW1lbnQgYW4KKyAqIGV0aGVybmV0LWxpa2UgbmV0d29yayBkZXZpY2UgY29tbXVuaWNhdGluZyBiZXR3ZWVuIHBhcnRpdGlvbnMgb24KKyAqIHRoZSBpU2VyaWVzLgorICoKKyAqIFRoZSBpU2VyaWVzIExQQVIgaHlwZXJ2aXNvciBjdXJyZW50bHkgYWxsb3dzIGZvciB1cCB0byAxNiBkaWZmZXJlbnQKKyAqIHZpcnR1YWwgZXRoZXJuZXRzLiAgVGhlc2UgYXJlIGFsbCBkeW5hbWljYWxseSBjb25maWd1cmFibGUgb24KKyAqIE9TLzQwMCBwYXJ0aXRpb25zLCBidXQgZHluYW1pYyBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIKKyAqIExpbnV4IHlldC4gIEFuIGV0aFhYIG5ldHdvcmsgZGV2aWNlIHdpbGwgYmUgY3JlYXRlZCBmb3IgZWFjaAorICogdmlydHVhbCBldGhlcm5ldCB0aGlzIHBhcnRpdGlvbiBpcyBjb25uZWN0ZWQgdG8uCisgKgorICogLSBUaGlzIGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3Igcm91dGluZyBwYWNrZXRzIHRvIGFuZCBmcm9tIG90aGVyCisgKiAgIHBhcnRpdGlvbnMuICBUaGUgTUFDIGFkZHJlc3NlcyB1c2VkIGJ5IHRoZSB2aXJ0dWFsIGV0aGVybmV0cworICogICBjb250YWlucyBtZWFuaW5nIGFuZCBtdXN0IG5vdCBiZSBtb2RpZmllZC4KKyAqCisgKiAtIEhhdmluZyAyIHZpcnR1YWwgZXRoZXJuZXRzIHRvIHRoZSBzYW1lIHJlbW90ZSBwYXJ0aXRpb24gRE9FUyBOT1QKKyAqICAgZG91YmxlIHRoZSBhdmFpbGFibGUgYmFuZHdpZHRoLiAgVGhlIDIgZGV2aWNlcyB3aWxsIHNoYXJlIHRoZQorICogICBhdmFpbGFibGUgaHlwZXJ2aXNvciBiYW5kd2lkdGguCisgKgorICogLSBJZiB5b3Ugc2VuZCBhIHBhY2tldCB0byB5b3VyIG93biBtYWMgYWRkcmVzcywgaXQgd2lsbCBqdXN0IGJlCisgKiAgIGRyb3BwZWQsIHlvdSB3b24ndCBnZXQgaXQgb24gdGhlIHJlY2VpdmUgc2lkZS4KKyAqCisgKiAtIE11bHRpY2FzdCBpcyBpbXBsZW1lbnRlZCBieSBzZW5kaW5nIHRoZSBmcmFtZSBmcmFtZSB0byBldmVyeQorICogICBvdGhlciBwYXJ0aXRpb24uICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHJlY2VpdmluZworICogICBwYXJ0aXRpb24gdG8gZmlsdGVyIHRoZSBhZGRyZXNzZXMgZGVzaXJlZC4KKyAqCisgKiBUdW5hYmxlIHBhcmFtZXRlcnM6CisgKgorICogVkVUSF9OVU1CVUZGRVJTOiBUaGlzIGNvbXBpbGUgdGltZSBvcHRpb24gZGVmYXVsdHMgdG8gMTIwLiAgSXQKKyAqIGNvbnRyb2xzIGhvdyBtdWNoIG1lbW9yeSBMaW51eCB3aWxsIGFsbG9jYXRlIHBlciByZW1vdGUgcGFydGl0aW9uCisgKiBpdCBpcyBjb21tdW5pY2F0aW5nIHdpdGguICBJdCBjYW4gYmUgdGhvdWdodCBvZiBhcyB0aGUgbWF4aW11bQorICogbnVtYmVyIG9mIHBhY2tldHMgb3V0c3RhbmRpbmcgdG8gYSByZW1vdGUgcGFydGl0aW9uIGF0IGEgdGltZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGFzbS9pU2VyaWVzL21mLmg+CisjaW5jbHVkZSA8YXNtL2lTZXJpZXMvaVNlcmllc19wY2kuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL2lTZXJpZXMvSHZMcENvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0h2VHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaVNlcmllcy9IdkxwRXZlbnQuaD4KKyNpbmNsdWRlIDxhc20vaW9tbXUuaD4KKyNpbmNsdWRlIDxhc20vdmlvLmg+CisKKyNpbmNsdWRlICJpc2VyaWVzX3ZldGguaCIKKworTU9EVUxFX0FVVEhPUigiS3lsZSBMdWNrZSA8a2x1Y2tlQHVzLmlibS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlTZXJpZXMgVmlydHVhbCBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBWRVRIX05VTUJVRkZFUlMJCSgxMjApCisjZGVmaW5lIFZFVEhfQUNLVElNRU9VVCAJKDEwMDAwMDApIC8qIG1pY3Jvc2Vjb25kcyAqLworI2RlZmluZSBWRVRIX01BWF9NQ0FTVAkJKDEyKQorCisjZGVmaW5lIFZFVEhfTUFYX01UVQkJKDkwMDApCisKKyNpZiBWRVRIX05VTUJVRkZFUlMgPCAxMAorI2RlZmluZSBBQ0tfVEhSRVNIT0xEIAkJKDEpCisjZWxpZiBWRVRIX05VTUJVRkZFUlMgPCAyMAorI2RlZmluZSBBQ0tfVEhSRVNIT0xEIAkJKDQpCisjZWxpZiBWRVRIX05VTUJVRkZFUlMgPCA0MAorI2RlZmluZSBBQ0tfVEhSRVNIT0xEIAkJKDEwKQorI2Vsc2UKKyNkZWZpbmUgQUNLX1RIUkVTSE9MRCAJCSgyMCkKKyNlbmRpZgorCisjZGVmaW5lCVZFVEhfU1RBVEVfU0hVVERPV04JKDB4MDAwMSkKKyNkZWZpbmUgVkVUSF9TVEFURV9PUEVOCQkoMHgwMDAyKQorI2RlZmluZSBWRVRIX1NUQVRFX1JFU0VUCSgweDAwMDQpCisjZGVmaW5lIFZFVEhfU1RBVEVfU0VOVE1PTgkoMHgwMDA4KQorI2RlZmluZSBWRVRIX1NUQVRFX1NFTlRDQVBTCSgweDAwMTApCisjZGVmaW5lIFZFVEhfU1RBVEVfR09UQ0FQQUNLCSgweDAwMjApCisjZGVmaW5lIFZFVEhfU1RBVEVfR09UQ0FQUwkoMHgwMDQwKQorI2RlZmluZSBWRVRIX1NUQVRFX1NFTlRDQVBBQ0sJKDB4MDA4MCkKKyNkZWZpbmUgVkVUSF9TVEFURV9SRUFEWQkoMHgwMTAwKQorCitzdHJ1Y3QgdmV0aF9tc2cgeworCXN0cnVjdCB2ZXRoX21zZyAqbmV4dDsKKwlzdHJ1Y3QgVmV0aEZyYW1lc0RhdGEgZGF0YTsKKwlpbnQgdG9rZW47CisJdW5zaWduZWQgbG9uZyBpbl91c2U7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cit9OworCitzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24geworCUh2THBJbmRleCByZW1vdGVfbHA7CisJc3RydWN0IHdvcmtfc3RydWN0IHN0YXRlbWFjaGluZV93cTsKKwlzdHJ1Y3QgdmV0aF9tc2cgKm1zZ3M7CisJaW50IG51bV9ldmVudHM7CisJc3RydWN0IFZldGhDYXBEYXRhIGxvY2FsX2NhcHM7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBhY2tfdGltZXI7CisKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgbG9uZyBzdGF0ZTsKKwlIdkxwSW5zdGFuY2VJZCBzcmNfaW5zdDsKKwlIdkxwSW5zdGFuY2VJZCBkc3RfaW5zdDsKKwlzdHJ1Y3QgVmV0aExwRXZlbnQgY2FwX2V2ZW50LCBjYXBfYWNrX2V2ZW50OworCXUxNiBwZW5kaW5nX2Fja3NbVkVUSF9NQVhfQUNLU19QRVJfTVNHXTsKKwl1MzIgbnVtX3BlbmRpbmdfYWNrczsKKworCWludCBudW1fYWNrX2V2ZW50czsKKwlzdHJ1Y3QgVmV0aENhcERhdGEgcmVtb3RlX2NhcHM7CisJdTMyIGFja190aW1lb3V0OworCisJc3BpbmxvY2tfdCBtc2dfc3RhY2tfbG9jazsKKwlzdHJ1Y3QgdmV0aF9tc2cgKm1zZ19zdGFja19oZWFkOworfTsKKworc3RydWN0IHZldGhfcG9ydCB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXU2NCBtYWNfYWRkcjsKKwlIdkxwSW5kZXhNYXAgbHBhcl9tYXA7CisKKwlzcGlubG9ja190IHBlbmRpbmdfZ2F0ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGVuZGluZ19za2I7CisJSHZMcEluZGV4TWFwIHBlbmRpbmdfbHBtYXNrOworCisJcndsb2NrX3QgbWNhc3RfZ2F0ZTsKKwlpbnQgcHJvbWlzY3VvdXM7CisJaW50IGFsbF9tY2FzdDsKKwlpbnQgbnVtX21jYXN0OworCXU2NCBtY2FzdF9hZGRyW1ZFVEhfTUFYX01DQVNUXTsKK307CisKK3N0YXRpYyBIdkxwSW5kZXggdGhpc19scDsKK3N0YXRpYyBzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKnZldGhfY254W0hWTUFYQVJDSElURUNURURMUFNdOyAvKiA9IDAgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqdmV0aF9kZXZbSFZNQVhBUkNISVRFQ1RFRFZJUlRVQUxMQU5TXTsgLyogPSAwICovCisKK3N0YXRpYyBpbnQgdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdmV0aF9yZWN5Y2xlX21zZyhzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKiwgc3RydWN0IHZldGhfbXNnICopOworc3RhdGljIHZvaWQgdmV0aF9mbHVzaF9wZW5kaW5nKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254KTsKK3N0YXRpYyB2b2lkIHZldGhfcmVjZWl2ZShzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKiwgc3RydWN0IFZldGhMcEV2ZW50ICopOworc3RhdGljIHZvaWQgdmV0aF90aW1lZF9hY2sodW5zaWduZWQgbG9uZyBjb25uZWN0aW9uUHRyKTsKKworLyoKKyAqIFV0aWxpdHkgZnVuY3Rpb25zCisgKi8KKworI2RlZmluZSB2ZXRoX3ByaW50ayhwcmlvLCBmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsocHJpbyAiJXM6ICIgZm10LCBfX0ZJTEVfXywgIyMgYXJncykKKworI2RlZmluZSB2ZXRoX2Vycm9yKGZtdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0VSUiAiKCVzOiUzLjNkKSBFUlJPUjogIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXyAsICMjIGFyZ3MpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZXRoX3N0YWNrX3B1c2goc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngsCisJCQkJICAgc3RydWN0IHZldGhfbXNnICptc2cpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbngtPm1zZ19zdGFja19sb2NrLCBmbGFncyk7CisJbXNnLT5uZXh0ID0gY254LT5tc2dfc3RhY2tfaGVhZDsKKwljbngtPm1zZ19zdGFja19oZWFkID0gbXNnOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNueC0+bXNnX3N0YWNrX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdmV0aF9tc2cgKnZldGhfc3RhY2tfcG9wKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZldGhfbXNnICptc2c7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY254LT5tc2dfc3RhY2tfbG9jaywgZmxhZ3MpOworCW1zZyA9IGNueC0+bXNnX3N0YWNrX2hlYWQ7CisJaWYgKG1zZykKKwkJY254LT5tc2dfc3RhY2tfaGVhZCA9IGNueC0+bXNnX3N0YWNrX2hlYWQtPm5leHQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY254LT5tc2dfc3RhY2tfbG9jaywgZmxhZ3MpOworCXJldHVybiBtc2c7Cit9CisKK3N0YXRpYyBpbmxpbmUgSHZMcEV2ZW50X1JjCit2ZXRoX3NpZ25hbGV2ZW50KHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254LCB1MTYgc3VidHlwZSwKKwkJIEh2THBFdmVudF9BY2tJbmQgYWNraW5kLCBIdkxwRXZlbnRfQWNrVHlwZSBhY2t0eXBlLAorCQkgdTY0IHRva2VuLAorCQkgdTY0IGRhdGExLCB1NjQgZGF0YTIsIHU2NCBkYXRhMywgdTY0IGRhdGE0LCB1NjQgZGF0YTUpCit7CisJcmV0dXJuIEh2Q2FsbEV2ZW50X3NpZ25hbExwRXZlbnRGYXN0KGNueC0+cmVtb3RlX2xwLAorCQkJCQkgICAgIEh2THBFdmVudF9UeXBlX1ZpcnR1YWxMYW4sCisJCQkJCSAgICAgc3VidHlwZSwgYWNraW5kLCBhY2t0eXBlLAorCQkJCQkgICAgIGNueC0+c3JjX2luc3QsCisJCQkJCSAgICAgY254LT5kc3RfaW5zdCwKKwkJCQkJICAgICB0b2tlbiwgZGF0YTEsIGRhdGEyLCBkYXRhMywKKwkJCQkJICAgICBkYXRhNCwgZGF0YTUpOworfQorCitzdGF0aWMgaW5saW5lIEh2THBFdmVudF9SYyB2ZXRoX3NpZ25hbGRhdGEoc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngsCisJCQkJCSAgIHUxNiBzdWJ0eXBlLCB1NjQgdG9rZW4sIHZvaWQgKmRhdGEpCit7CisJdTY0ICpwID0gKHU2NCAqKSBkYXRhOworCisJcmV0dXJuIHZldGhfc2lnbmFsZXZlbnQoY254LCBzdWJ0eXBlLCBIdkxwRXZlbnRfQWNrSW5kX05vQWNrLAorCQkJCUh2THBFdmVudF9BY2tUeXBlX0ltbWVkaWF0ZUFjaywKKwkJCQl0b2tlbiwgcFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSk7Cit9CisKK3N0cnVjdCB2ZXRoX2FsbG9jYXRpb24geworCXN0cnVjdCBjb21wbGV0aW9uIGM7CisJaW50IG51bTsKK307CisKK3N0YXRpYyB2b2lkIHZldGhfY29tcGxldGVfYWxsb2NhdGlvbih2b2lkICpwYXJtLCBpbnQgbnVtYmVyKQoreworCXN0cnVjdCB2ZXRoX2FsbG9jYXRpb24gKnZjID0gKHN0cnVjdCB2ZXRoX2FsbG9jYXRpb24gKilwYXJtOworCisJdmMtPm51bSA9IG51bWJlcjsKKwljb21wbGV0ZSgmdmMtPmMpOworfQorCitzdGF0aWMgaW50IHZldGhfYWxsb2NhdGVfZXZlbnRzKEh2THBJbmRleCBybHAsIGludCBudW1iZXIpCit7CisJc3RydWN0IHZldGhfYWxsb2NhdGlvbiB2YyA9IHsgQ09NUExFVElPTl9JTklUSUFMSVpFUih2Yy5jKSwgMCB9OworCisJbWZfYWxsb2NhdGVfbHBfZXZlbnRzKHJscCwgSHZMcEV2ZW50X1R5cGVfVmlydHVhbExhbiwKKwkJCSAgICBzaXplb2Yoc3RydWN0IFZldGhMcEV2ZW50KSwgbnVtYmVyLAorCQkJICAgICZ2ZXRoX2NvbXBsZXRlX2FsbG9jYXRpb24sICZ2Yyk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmdmMuYyk7CisKKwlyZXR1cm4gdmMubnVtOworfQorCisvKgorICogTFBBUiBjb25uZWN0aW9uIGNvZGUKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdmV0aF9raWNrX3N0YXRlbWFjaGluZShzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCkKK3sKKwlzY2hlZHVsZV93b3JrKCZjbngtPnN0YXRlbWFjaGluZV93cSk7Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfdGFrZV9jYXAoc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngsCisJCQkgIHN0cnVjdCBWZXRoTHBFdmVudCAqZXZlbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbngtPmxvY2ssIGZsYWdzKTsKKwkvKiBSZWNlaXZpbmcgY2FwcyBtYXkgbWVhbiB0aGUgb3RoZXIgZW5kIGhhcyBqdXN0IGNvbWUgdXAsIHNvCisJICogd2UgbmVlZCB0byByZWxvYWQgdGhlIGluc3RhbmNlIElEIG9mIHRoZSBmYXIgZW5kICovCisJY254LT5kc3RfaW5zdCA9CisJCUh2Q2FsbEV2ZW50X2dldFRhcmdldExwSW5zdGFuY2VJZChjbngtPnJlbW90ZV9scCwKKwkJCQkJCSAgSHZMcEV2ZW50X1R5cGVfVmlydHVhbExhbik7CisKKwlpZiAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfR09UQ0FQUykgeworCQl2ZXRoX2Vycm9yKCJSZWNlaXZlZCBhIHNlY29uZCBjYXBhYmlsaXRpZXMgZnJvbSBscGFyICVkXG4iLAorCQkJICAgY254LT5yZW1vdGVfbHApOworCQlldmVudC0+YmFzZV9ldmVudC54UmMgPSBIdkxwRXZlbnRfUmNfQnVmZmVyTm90QXZhaWxhYmxlOworCQlIdkNhbGxFdmVudF9hY2tMcEV2ZW50KChzdHJ1Y3QgSHZMcEV2ZW50ICopIGV2ZW50KTsKKwl9IGVsc2UgeworCQltZW1jcHkoJmNueC0+Y2FwX2V2ZW50LCBldmVudCwgc2l6ZW9mKGNueC0+Y2FwX2V2ZW50KSk7CisJCWNueC0+c3RhdGUgfD0gVkVUSF9TVEFURV9HT1RDQVBTOworCQl2ZXRoX2tpY2tfc3RhdGVtYWNoaW5lKGNueCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNueC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB2ZXRoX3Rha2VfY2FwX2FjayhzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCwKKwkJCSAgICAgIHN0cnVjdCBWZXRoTHBFdmVudCAqZXZlbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbngtPmxvY2ssIGZsYWdzKTsKKwlpZiAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfR09UQ0FQQUNLKSB7CisJCXZldGhfZXJyb3IoIlJlY2VpdmVkIGEgc2Vjb25kIGNhcGFiaWxpdGllcyBhY2sgZnJvbSBscGFyICVkXG4iLAorCQkJICAgY254LT5yZW1vdGVfbHApOworCX0gZWxzZSB7CisJCW1lbWNweSgmY254LT5jYXBfYWNrX2V2ZW50LCBldmVudCwKKwkJICAgICAgIHNpemVvZigmY254LT5jYXBfYWNrX2V2ZW50KSk7CisJCWNueC0+c3RhdGUgfD0gVkVUSF9TVEFURV9HT1RDQVBBQ0s7CisJCXZldGhfa2lja19zdGF0ZW1hY2hpbmUoY254KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY254LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfdGFrZV9tb25pdG9yX2FjayhzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCwKKwkJCQkgIHN0cnVjdCBWZXRoTHBFdmVudCAqZXZlbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbngtPmxvY2ssIGZsYWdzKTsKKwl2ZXRoX3ByaW50ayhLRVJOX0RFQlVHLCAiTW9uaXRvciBhY2sgcmV0dXJuZWQgZm9yIGxwYXIgJWRcbiIsCisJCSAgICBjbngtPnJlbW90ZV9scCk7CisJY254LT5zdGF0ZSB8PSBWRVRIX1NUQVRFX1JFU0VUOworCXZldGhfa2lja19zdGF0ZW1hY2hpbmUoY254KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbngtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdmV0aF9oYW5kbGVfYWNrKHN0cnVjdCBWZXRoTHBFdmVudCAqZXZlbnQpCit7CisJSHZMcEluZGV4IHJscCA9IGV2ZW50LT5iYXNlX2V2ZW50LnhUYXJnZXRMcDsKKwlzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCA9IHZldGhfY254W3JscF07CisKKwlCVUdfT04oISBjbngpOworCisJc3dpdGNoIChldmVudC0+YmFzZV9ldmVudC54U3VidHlwZSkgeworCWNhc2UgVmV0aEV2ZW50VHlwZUNhcDoKKwkJdmV0aF90YWtlX2NhcF9hY2soY254LCBldmVudCk7CisJCWJyZWFrOworCWNhc2UgVmV0aEV2ZW50VHlwZU1vbml0b3I6CisJCXZldGhfdGFrZV9tb25pdG9yX2FjayhjbngsIGV2ZW50KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmV0aF9lcnJvcigiVW5rbm93biBhY2sgdHlwZSAlZCBmcm9tIGxwYXIgJWRcbiIsCisJCQkgICBldmVudC0+YmFzZV9ldmVudC54U3VidHlwZSwgcmxwKTsKKwl9OworfQorCitzdGF0aWMgdm9pZCB2ZXRoX2hhbmRsZV9pbnQoc3RydWN0IFZldGhMcEV2ZW50ICpldmVudCkKK3sKKwlIdkxwSW5kZXggcmxwID0gZXZlbnQtPmJhc2VfZXZlbnQueFNvdXJjZUxwOworCXN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254ID0gdmV0aF9jbnhbcmxwXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJQlVHX09OKCEgY254KTsKKworCXN3aXRjaCAoZXZlbnQtPmJhc2VfZXZlbnQueFN1YnR5cGUpIHsKKwljYXNlIFZldGhFdmVudFR5cGVDYXA6CisJCXZldGhfdGFrZV9jYXAoY254LCBldmVudCk7CisJCWJyZWFrOworCWNhc2UgVmV0aEV2ZW50VHlwZU1vbml0b3I6CisJCS8qIGRvIG5vdGhpbmcuLi4gdGhpcydsbCBoYW5nIG91dCBoZXJlIHRpbCB3ZSdyZSBkZWFkLAorCQkgKiBhbmQgdGhlIGh5cGVydmlzb3Igd2lsbCByZXR1cm4gaXQgZm9yIHVzLiAqLworCQlicmVhazsKKwljYXNlIFZldGhFdmVudFR5cGVGcmFtZXNBY2s6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjbngtPmxvY2ssIGZsYWdzKTsKKwkJZm9yIChpID0gMDsgaSA8IFZFVEhfTUFYX0FDS1NfUEVSX01TRzsgKytpKSB7CisJCQl1MTYgbXNnbnVtID0gZXZlbnQtPnUuZnJhbWVzX2Fja19kYXRhLnRva2VuW2ldOworCisJCQlpZiAobXNnbnVtIDwgVkVUSF9OVU1CVUZGRVJTKQorCQkJCXZldGhfcmVjeWNsZV9tc2coY254LCBjbngtPm1zZ3MgKyBtc2dudW0pOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNueC0+bG9jaywgZmxhZ3MpOworCQl2ZXRoX2ZsdXNoX3BlbmRpbmcoY254KTsKKwkJYnJlYWs7CisJY2FzZSBWZXRoRXZlbnRUeXBlRnJhbWVzOgorCQl2ZXRoX3JlY2VpdmUoY254LCBldmVudCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZldGhfZXJyb3IoIlVua25vd24gaW50ZXJydXB0IHR5cGUgJWQgZnJvbSBscGFyICVkXG4iLAorCQkJICAgZXZlbnQtPmJhc2VfZXZlbnQueFN1YnR5cGUsIHJscCk7CisJfTsKK30KKworc3RhdGljIHZvaWQgdmV0aF9oYW5kbGVfZXZlbnQoc3RydWN0IEh2THBFdmVudCAqZXZlbnQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBWZXRoTHBFdmVudCAqdmV0aF9ldmVudCA9IChzdHJ1Y3QgVmV0aExwRXZlbnQgKilldmVudDsKKworCWlmIChldmVudC0+eEZsYWdzLnhGdW5jdGlvbiA9PSBIdkxwRXZlbnRfRnVuY3Rpb25fQWNrKQorCQl2ZXRoX2hhbmRsZV9hY2sodmV0aF9ldmVudCk7CisJZWxzZSBpZiAoZXZlbnQtPnhGbGFncy54RnVuY3Rpb24gPT0gSHZMcEV2ZW50X0Z1bmN0aW9uX0ludCkKKwkJdmV0aF9oYW5kbGVfaW50KHZldGhfZXZlbnQpOworfQorCitzdGF0aWMgaW50IHZldGhfcHJvY2Vzc19jYXBzKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254KQoreworCXN0cnVjdCBWZXRoQ2FwRGF0YSAqcmVtb3RlX2NhcHMgPSAmY254LT5yZW1vdGVfY2FwczsKKwlpbnQgbnVtX2Fja3NfbmVlZGVkOworCisJLyogQ29udmVydCB0aW1lciB0byBqaWZmaWVzICovCisJY254LT5hY2tfdGltZW91dCA9IHJlbW90ZV9jYXBzLT5hY2tfdGltZW91dCAqIEhaIC8gMTAwMDAwMDsKKworCWlmICggKHJlbW90ZV9jYXBzLT5udW1fYnVmZmVycyA9PSAwKQorCSAgICAgfHwgKHJlbW90ZV9jYXBzLT5hY2tfdGhyZXNob2xkID4gVkVUSF9NQVhfQUNLU19QRVJfTVNHKQorCSAgICAgfHwgKHJlbW90ZV9jYXBzLT5hY2tfdGhyZXNob2xkID09IDApCisJICAgICB8fCAoY254LT5hY2tfdGltZW91dCA9PSAwKSApIHsKKwkJdmV0aF9lcnJvcigiUmVjZWl2ZWQgaW5jb21wYXRpYmxlIGNhcGFiaWxpdGllcyBmcm9tIGxwYXIgJWRcbiIsCisJCQkgICBjbngtPnJlbW90ZV9scCk7CisJCXJldHVybiBIdkxwRXZlbnRfUmNfSW52YWxpZFN1YnR5cGVEYXRhOworCX0KKworCW51bV9hY2tzX25lZWRlZCA9IChyZW1vdGVfY2Fwcy0+bnVtX2J1ZmZlcnMKKwkJCSAgIC8gcmVtb3RlX2NhcHMtPmFja190aHJlc2hvbGQpICsgMTsKKworCS8qIEZJWE1FOiBsb2NraW5nIG9uIG51bV9hY2tfZXZlbnRzPyAqLworCWlmIChjbngtPm51bV9hY2tfZXZlbnRzIDwgbnVtX2Fja3NfbmVlZGVkKSB7CisJCWludCBudW07CisKKwkJbnVtID0gdmV0aF9hbGxvY2F0ZV9ldmVudHMoY254LT5yZW1vdGVfbHAsCisJCQkJCSAgIG51bV9hY2tzX25lZWRlZC1jbngtPm51bV9hY2tfZXZlbnRzKTsKKwkJaWYgKG51bSA+IDApCisJCQljbngtPm51bV9hY2tfZXZlbnRzICs9IG51bTsKKworCQlpZiAoY254LT5udW1fYWNrX2V2ZW50cyA8IG51bV9hY2tzX25lZWRlZCkgeworCQkJdmV0aF9lcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgZW5vdWdoIGFjayBldmVudHMgZm9yIGxwYXIgJWRcbiIsCisJCQkJICAgY254LT5yZW1vdGVfbHApOworCisJCQlyZXR1cm4gSHZMcEV2ZW50X1JjX0J1ZmZlck5vdEF2YWlsYWJsZTsKKwkJfQorCX0KKworCisJcmV0dXJuIEh2THBFdmVudF9SY19Hb29kOworfQorCisvKiBGSVhNRTogVGhlIGdvdG9zIGhlcmUgYXJlIGEgYml0IGR1YmlvdXMgKi8KK3N0YXRpYyB2b2lkIHZldGhfc3RhdGVtYWNoaW5lKHZvaWQgKnApCit7CisJc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbnggPSAoc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICopcDsKKwlpbnQgcmxwID0gY254LT5yZW1vdGVfbHA7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmY254LT5sb2NrKTsKKworIHJlc3RhcnQ6CisJaWYgKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX1JFU0VUKSB7CisJCWludCBpOworCisJCWRlbF90aW1lcigmY254LT5hY2tfdGltZXIpOworCisJCWlmIChjbngtPnN0YXRlICYgVkVUSF9TVEFURV9PUEVOKQorCQkJSHZDYWxsRXZlbnRfY2xvc2VMcEV2ZW50UGF0aChjbngtPnJlbW90ZV9scCwKKwkJCQkJCSAgICAgSHZMcEV2ZW50X1R5cGVfVmlydHVhbExhbik7CisKKwkJLyogcmVzZXQgYWNrIGRhdGEgKi8KKwkJbWVtc2V0KCZjbngtPnBlbmRpbmdfYWNrcywgMHhmZiwgc2l6ZW9mIChjbngtPnBlbmRpbmdfYWNrcykpOworCQljbngtPm51bV9wZW5kaW5nX2Fja3MgPSAwOworCisJCWNueC0+c3RhdGUgJj0gfihWRVRIX1NUQVRFX1JFU0VUIHwgVkVUSF9TVEFURV9TRU5UTU9OCisJCQkJfCBWRVRIX1NUQVRFX09QRU4gfCBWRVRIX1NUQVRFX1NFTlRDQVBTCisJCQkJfCBWRVRIX1NUQVRFX0dPVENBUEFDSyB8IFZFVEhfU1RBVEVfR09UQ0FQUworCQkJCXwgVkVUSF9TVEFURV9TRU5UQ0FQQUNLIHwgVkVUSF9TVEFURV9SRUFEWSk7CisKKwkJLyogQ2xlYW4gdXAgYW55IGxlZnRvdmVyIG1lc3NhZ2VzICovCisJCWlmIChjbngtPm1zZ3MpCisJCQlmb3IgKGkgPSAwOyBpIDwgVkVUSF9OVU1CVUZGRVJTOyArK2kpCisJCQkJdmV0aF9yZWN5Y2xlX21zZyhjbngsIGNueC0+bXNncyArIGkpOworCQlzcGluX3VubG9ja19pcnEoJmNueC0+bG9jayk7CisJCXZldGhfZmx1c2hfcGVuZGluZyhjbngpOworCQlzcGluX2xvY2tfaXJxKCZjbngtPmxvY2spOworCQlpZiAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfUkVTRVQpCisJCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJaWYgKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX1NIVVRET1dOKQorCQkvKiBJdCdzIGFsbCBvdmVyLCBkbyBub3RoaW5nICovCisJCWdvdG8gb3V0OworCisJaWYgKCAhKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX09QRU4pICkgeworCQlpZiAoISBjbngtPm1zZ3MgfHwgKGNueC0+bnVtX2V2ZW50cyA8ICgyICsgVkVUSF9OVU1CVUZGRVJTKSkgKQorCQkJZ290byBjYW50X2NvcGU7CisKKwkJSHZDYWxsRXZlbnRfb3BlbkxwRXZlbnRQYXRoKHJscCwgSHZMcEV2ZW50X1R5cGVfVmlydHVhbExhbik7CisJCWNueC0+c3JjX2luc3QgPQorCQkJSHZDYWxsRXZlbnRfZ2V0U291cmNlTHBJbnN0YW5jZUlkKHJscCwKKwkJCQkJCQkgIEh2THBFdmVudF9UeXBlX1ZpcnR1YWxMYW4pOworCQljbngtPmRzdF9pbnN0ID0KKwkJCUh2Q2FsbEV2ZW50X2dldFRhcmdldExwSW5zdGFuY2VJZChybHAsCisJCQkJCQkJICBIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsTGFuKTsKKwkJY254LT5zdGF0ZSB8PSBWRVRIX1NUQVRFX09QRU47CisJfQorCisJaWYgKCAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfT1BFTikKKwkgICAgICYmICEoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfU0VOVE1PTikgKSB7CisJCXJjID0gdmV0aF9zaWduYWxldmVudChjbngsIFZldGhFdmVudFR5cGVNb25pdG9yLAorCQkJCSAgICAgIEh2THBFdmVudF9BY2tJbmRfRG9BY2ssCisJCQkJICAgICAgSHZMcEV2ZW50X0Fja1R5cGVfRGVmZXJyZWRBY2ssCisJCQkJICAgICAgMCwgMCwgMCwgMCwgMCwgMCk7CisKKwkJaWYgKHJjID09IEh2THBFdmVudF9SY19Hb29kKSB7CisJCQljbngtPnN0YXRlIHw9IFZFVEhfU1RBVEVfU0VOVE1PTjsKKwkJfSBlbHNlIHsKKwkJCWlmICggKHJjICE9IEh2THBFdmVudF9SY19QYXJ0aXRpb25EZWFkKQorCQkJICAgICAmJiAocmMgIT0gSHZMcEV2ZW50X1JjX1BhdGhDbG9zZWQpICkKKwkJCQl2ZXRoX2Vycm9yKCJFcnJvciBzZW5kaW5nIG1vbml0b3IgdG8gIgorCQkJCQkgICAibHBhciAlZCwgcmM9JXhcbiIsCisJCQkJCSAgIHJscCwgKGludCkgcmMpOworCisJCQkvKiBPaCB3ZWxsLCBob3BlIHdlIGdldCBhIGNhcCBmcm9tIHRoZSBvdGhlcgorCQkJICogZW5kIGFuZCBkbyBiZXR0ZXIgd2hlbiB0aGF0IGtpY2tzIHVzICovCisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICggKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX09QRU4pCisJICAgICAmJiAhKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX1NFTlRDQVBTKSkgeworCQl1NjQgKnJhd2NhcCA9ICh1NjQgKikmY254LT5sb2NhbF9jYXBzOworCisJCXJjID0gdmV0aF9zaWduYWxldmVudChjbngsIFZldGhFdmVudFR5cGVDYXAsCisJCQkJICAgICAgSHZMcEV2ZW50X0Fja0luZF9Eb0FjaywKKwkJCQkgICAgICBIdkxwRXZlbnRfQWNrVHlwZV9JbW1lZGlhdGVBY2ssCisJCQkJICAgICAgMCwgcmF3Y2FwWzBdLCByYXdjYXBbMV0sIHJhd2NhcFsyXSwKKwkJCQkgICAgICByYXdjYXBbM10sIHJhd2NhcFs0XSk7CisKKwkJaWYgKHJjID09IEh2THBFdmVudF9SY19Hb29kKSB7CisJCQljbngtPnN0YXRlIHw9IFZFVEhfU1RBVEVfU0VOVENBUFM7CisJCX0gZWxzZSB7CisJCQlpZiAoIChyYyAhPSBIdkxwRXZlbnRfUmNfUGFydGl0aW9uRGVhZCkKKwkJCSAgICAgJiYgKHJjICE9IEh2THBFdmVudF9SY19QYXRoQ2xvc2VkKSApCisJCQkJdmV0aF9lcnJvcigiRXJyb3Igc2VuZGluZyBjYXBzIHRvICIKKwkJCQkJICAgImxwYXIgJWQsIHJjPSV4XG4iLAorCQkJCQkgICBybHAsIChpbnQpIHJjKTsKKwkJCS8qIE9oIHdlbGwsIGhvcGUgd2UgZ2V0IGEgY2FwIGZyb20gdGhlIG90aGVyCisJCQkgKiBlbmQgYW5kIGRvIGJldHRlciB3aGVuIHRoYXQga2lja3MgdXMgKi8KKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKChjbngtPnN0YXRlICYgVkVUSF9TVEFURV9HT1RDQVBTKQorCSAgICAmJiAhKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX1NFTlRDQVBBQ0spKSB7CisJCXN0cnVjdCBWZXRoQ2FwRGF0YSAqcmVtb3RlX2NhcHMgPSAmY254LT5yZW1vdGVfY2FwczsKKworCQltZW1jcHkocmVtb3RlX2NhcHMsICZjbngtPmNhcF9ldmVudC51LmNhcHNfZGF0YSwKKwkJICAgICAgIHNpemVvZigqcmVtb3RlX2NhcHMpKTsKKworCQlzcGluX3VubG9ja19pcnEoJmNueC0+bG9jayk7CisJCXJjID0gdmV0aF9wcm9jZXNzX2NhcHMoY254KTsKKwkJc3Bpbl9sb2NrX2lycSgmY254LT5sb2NrKTsKKworCQkvKiBXZSBkcm9wcGVkIHRoZSBsb2NrLCBzbyByZWNoZWNrIGZvciBhbnl0aGluZyB3aGljaAorCQkgKiBtaWdodCBtZXNzIHVzIHVwICovCisJCWlmIChjbngtPnN0YXRlICYgKFZFVEhfU1RBVEVfUkVTRVR8VkVUSF9TVEFURV9TSFVURE9XTikpCisJCQlnb3RvIHJlc3RhcnQ7CisKKwkJY254LT5jYXBfZXZlbnQuYmFzZV9ldmVudC54UmMgPSByYzsKKwkJSHZDYWxsRXZlbnRfYWNrTHBFdmVudCgoc3RydWN0IEh2THBFdmVudCAqKSZjbngtPmNhcF9ldmVudCk7CisJCWlmIChyYyA9PSBIdkxwRXZlbnRfUmNfR29vZCkKKwkJCWNueC0+c3RhdGUgfD0gVkVUSF9TVEFURV9TRU5UQ0FQQUNLOworCQllbHNlCisJCQlnb3RvIGNhbnRfY29wZTsKKwl9CisKKwlpZiAoKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX0dPVENBUEFDSykKKwkgICAgJiYgKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX0dPVENBUFMpCisJICAgICYmICEoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfUkVBRFkpKSB7CisJCWlmIChjbngtPmNhcF9hY2tfZXZlbnQuYmFzZV9ldmVudC54UmMgPT0gSHZMcEV2ZW50X1JjX0dvb2QpIHsKKwkJCS8qIFN0YXJ0IHRoZSBBQ0sgdGltZXIgKi8KKwkJCWNueC0+YWNrX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgY254LT5hY2tfdGltZW91dDsKKwkJCWFkZF90aW1lcigmY254LT5hY2tfdGltZXIpOworCQkJY254LT5zdGF0ZSB8PSBWRVRIX1NUQVRFX1JFQURZOworCQl9IGVsc2UgeworCQkJdmV0aF9wcmludGsoS0VSTl9FUlIsICJDYXBzIHJlamVjdGVkIChyYz0lZCkgYnkgIgorCQkJCSAgICAibHBhciAlZFxuIiwKKwkJCQkgICAgY254LT5jYXBfYWNrX2V2ZW50LmJhc2VfZXZlbnQueFJjLAorCQkJCSAgICBybHApOworCQkJZ290byBjYW50X2NvcGU7CisJCX0KKwl9CisKKyBvdXQ6CisJc3Bpbl91bmxvY2tfaXJxKCZjbngtPmxvY2spOworCXJldHVybjsKKworIGNhbnRfY29wZToKKwkvKiBGSVhNRTogd2UgZ2V0IGhlcmUgaWYgc29tZXRoaW5nIGhhcHBlbnMgd2UgcmVhbGx5IGNhbid0CisJICogY29wZSB3aXRoLiAgVGhlIGxpbmsgd2lsbCBuZXZlciB3b3JrIG9uY2Ugd2UgZ2V0IGhlcmUsIGFuZAorCSAqIGFsbCB3ZSBjYW4gZG8gaXMgbm90IGxvY2sgdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbSB1cCAqLworCXZldGhfZXJyb3IoIkJhZG5lc3Mgb24gY29ubmVjdGlvbiB0byBscGFyICVkIChzdGF0ZT0lMDRseCkgIgorCQkgICAiIC0gc2h1dHRpbmcgZG93blxuIiwgcmxwLCBjbngtPnN0YXRlKTsKKwljbngtPnN0YXRlIHw9IFZFVEhfU1RBVEVfU0hVVERPV047CisJc3Bpbl91bmxvY2tfaXJxKCZjbngtPmxvY2spOworfQorCitzdGF0aWMgaW50IHZldGhfaW5pdF9jb25uZWN0aW9uKHU4IHJscCkKK3sKKwlzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueDsKKwlzdHJ1Y3QgdmV0aF9tc2cgKm1zZ3M7CisJaW50IGk7CisKKwlpZiAoIChybHAgPT0gdGhpc19scCkKKwkgICAgIHx8ICEgSHZMcENvbmZpZ19kb0xwc0NvbW11bmljYXRlT25WaXJ0dWFsTGFuKHRoaXNfbHAsIHJscCkgKQorCQlyZXR1cm4gMDsKKworCWNueCA9IGttYWxsb2Moc2l6ZW9mKCpjbngpLCBHRlBfS0VSTkVMKTsKKwlpZiAoISBjbngpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChjbngsIDAsIHNpemVvZigqY254KSk7CisKKwljbngtPnJlbW90ZV9scCA9IHJscDsKKwlzcGluX2xvY2tfaW5pdCgmY254LT5sb2NrKTsKKwlJTklUX1dPUksoJmNueC0+c3RhdGVtYWNoaW5lX3dxLCB2ZXRoX3N0YXRlbWFjaGluZSwgY254KTsKKwlpbml0X3RpbWVyKCZjbngtPmFja190aW1lcik7CisJY254LT5hY2tfdGltZXIuZnVuY3Rpb24gPSB2ZXRoX3RpbWVkX2FjazsKKwljbngtPmFja190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGNueDsKKwltZW1zZXQoJmNueC0+cGVuZGluZ19hY2tzLCAweGZmLCBzaXplb2YgKGNueC0+cGVuZGluZ19hY2tzKSk7CisKKwl2ZXRoX2NueFtybHBdID0gY254OworCisJbXNncyA9IGttYWxsb2MoVkVUSF9OVU1CVUZGRVJTICogc2l6ZW9mKHN0cnVjdCB2ZXRoX21zZyksIEdGUF9LRVJORUwpOworCWlmICghIG1zZ3MpIHsKKwkJdmV0aF9lcnJvcigiQ2FuJ3QgYWxsb2NhdGUgYnVmZmVycyBmb3IgbHBhciAlZFxuIiwgcmxwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY254LT5tc2dzID0gbXNnczsKKwltZW1zZXQobXNncywgMCwgVkVUSF9OVU1CVUZGRVJTICogc2l6ZW9mKHN0cnVjdCB2ZXRoX21zZykpOworCXNwaW5fbG9ja19pbml0KCZjbngtPm1zZ19zdGFja19sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBWRVRIX05VTUJVRkZFUlM7IGkrKykgeworCQltc2dzW2ldLnRva2VuID0gaTsKKwkJdmV0aF9zdGFja19wdXNoKGNueCwgbXNncyArIGkpOworCX0KKworCWNueC0+bnVtX2V2ZW50cyA9IHZldGhfYWxsb2NhdGVfZXZlbnRzKHJscCwgMiArIFZFVEhfTlVNQlVGRkVSUyk7CisKKwlpZiAoY254LT5udW1fZXZlbnRzIDwgKDIgKyBWRVRIX05VTUJVRkZFUlMpKSB7CisJCXZldGhfZXJyb3IoIkNhbid0IGFsbG9jYXRlIGV2ZW50cyBmb3IgbHBhciAlZCwgb25seSBnb3QgJWRcbiIsCisJCQkgICBybHAsIGNueC0+bnVtX2V2ZW50cyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNueC0+bG9jYWxfY2Fwcy5udW1fYnVmZmVycyA9IFZFVEhfTlVNQlVGRkVSUzsKKwljbngtPmxvY2FsX2NhcHMuYWNrX3RocmVzaG9sZCA9IEFDS19USFJFU0hPTEQ7CisJY254LT5sb2NhbF9jYXBzLmFja190aW1lb3V0ID0gVkVUSF9BQ0tUSU1FT1VUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfc3RvcF9jb25uZWN0aW9uKHU4IHJscCkKK3sKKwlzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCA9IHZldGhfY254W3JscF07CisKKwlpZiAoISBjbngpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnEoJmNueC0+bG9jayk7CisJY254LT5zdGF0ZSB8PSBWRVRIX1NUQVRFX1JFU0VUIHwgVkVUSF9TVEFURV9TSFVURE9XTjsKKwl2ZXRoX2tpY2tfc3RhdGVtYWNoaW5lKGNueCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjbngtPmxvY2spOworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCS8qIEZJWE1FOiBub3Qgc3VyZSBpZiB0aGlzIGlzIG5lY2Vzc2FyeSAtIHdpbGwgYWxyZWFkeSBoYXZlCisJICogYmVlbiBkZWxldGVkIGJ5IHRoZSBzdGF0ZSBtYWNoaW5lLCBqdXN0IHdhbnQgdG8gbWFrZSBzdXJlCisJICogaXRzIG5vdCBydW5uaW5nIGFueSBtb3JlICovCisJZGVsX3RpbWVyX3N5bmMoJmNueC0+YWNrX3RpbWVyKTsKKworCWlmIChjbngtPm51bV9ldmVudHMgPiAwKQorCQltZl9kZWFsbG9jYXRlX2xwX2V2ZW50cyhjbngtPnJlbW90ZV9scCwKKwkJCQkgICAgICBIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsTGFuLAorCQkJCSAgICAgIGNueC0+bnVtX2V2ZW50cywKKwkJCQkgICAgICBOVUxMLCBOVUxMKTsKKwlpZiAoY254LT5udW1fYWNrX2V2ZW50cyA+IDApCisJCW1mX2RlYWxsb2NhdGVfbHBfZXZlbnRzKGNueC0+cmVtb3RlX2xwLAorCQkJCSAgICAgIEh2THBFdmVudF9UeXBlX1ZpcnR1YWxMYW4sCisJCQkJICAgICAgY254LT5udW1fYWNrX2V2ZW50cywKKwkJCQkgICAgICBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgdmV0aF9kZXN0cm95X2Nvbm5lY3Rpb24odTggcmxwKQoreworCXN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254ID0gdmV0aF9jbnhbcmxwXTsKKworCWlmICghIGNueCkKKwkJcmV0dXJuOworCisJa2ZyZWUoY254LT5tc2dzKTsKKwlrZnJlZShjbngpOworCXZldGhfY254W3JscF0gPSBOVUxMOworfQorCisvKgorICogbmV0X2RldmljZSBjb2RlCisgKi8KKworc3RhdGljIGludCB2ZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmV0aF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB2ZXRoX3BvcnQgKikgZGV2LT5wcml2OworCisJbWVtc2V0KCZwb3J0LT5zdGF0cywgMCwgc2l6ZW9mIChwb3J0LT5zdGF0cykpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmV0aF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp2ZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2ZXRoX3BvcnQgKnBvcnQgPSAoc3RydWN0IHZldGhfcG9ydCAqKSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJnBvcnQtPnN0YXRzOworfQorCitzdGF0aWMgaW50IHZldGhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiBWRVRIX01BWF9NVFUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZldGhfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdmV0aF9wb3J0ICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZwb3J0LT5tY2FzdF9nYXRlLCBmbGFncyk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CS8qIHNldCBwcm9taXNjdW91cyBtb2RlICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcG9ydC0+cHJvbWlzY3VvdXMgPSAxOworCX0gZWxzZSBpZiAoIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQkgICAgfHwgKGRldi0+bWNfY291bnQgPiBWRVRIX01BWF9NQ0FTVCkgKSB7CisJCXBvcnQtPmFsbF9tY2FzdCA9IDE7CisJfSBlbHNlIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisJCWludCBpOworCisJCS8qIFVwZGF0ZSB0YWJsZSAqLworCQlwb3J0LT5udW1fbWNhc3QgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJCXU4ICphZGRyID0gZG1pLT5kbWlfYWRkcjsKKwkJCXU2NCB4YWRkciA9IDA7CisKKwkJCWlmIChhZGRyWzBdICYgMHgwMSkgey8qIG11bHRpY2FzdCBhZGRyZXNzPyAqLworCQkJCW1lbWNweSgmeGFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKKwkJCQlwb3J0LT5tY2FzdF9hZGRyW3BvcnQtPm51bV9tY2FzdF0gPSB4YWRkcjsKKwkJCQlwb3J0LT5udW1fbWNhc3QrKzsKKwkJCX0KKwkJCWRtaSA9IGRtaS0+bmV4dDsKKwkJfQorCX0KKworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5tY2FzdF9nYXRlLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJuY3B5KGluZm8tPmRyaXZlciwgInZldGgiLCBzaXplb2YoaW5mby0+ZHJpdmVyKSAtIDEpOworCWluZm8tPmRyaXZlcltzaXplb2YoaW5mby0+ZHJpdmVyKSAtIDFdID0gJ1wwJzsKKwlzdHJuY3B5KGluZm8tPnZlcnNpb24sICIxLjAiLCBzaXplb2YoaW5mby0+dmVyc2lvbikgLSAxKTsKK30KKworc3RhdGljIGludCB2ZXRoX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJZWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbAorCQkJICB8IFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX0ZJQlJFKTsKKwllY21kLT5hZHZlcnRpc2luZyA9IChTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwKKwkJCSAgICB8IFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX0ZJQlJFKTsKKwllY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisJZWNtZC0+cGh5X2FkZHJlc3MgPSAwOworCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwMDsKKwllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJZWNtZC0+bWF4dHhwa3QgPSAxMjA7CisJZWNtZC0+bWF4cnhwa3QgPSAxMjA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgdmV0aF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG9wcyA9IHsKKwkuZ2V0X2RydmluZm8gPSB2ZXRoX2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MgPSB2ZXRoX2dldF9zZXR0aW5ncywKKwkuZ2V0X2xpbmsgPSB2ZXRoX2dldF9saW5rLAorfTsKKworc3RhdGljIHZvaWQgdmV0aF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZldGhfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdmV0aF9wb3J0ICopZGV2LT5wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwb3J0LT5zdGF0czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJc3RhdHMtPnR4X2Vycm9ycysrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPnBlbmRpbmdfZ2F0ZSwgZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFR4IHRpbWVvdXQhICBSZXNldHRpbmcgbHAgY29ubmVjdGlvbnM6ICUwOHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgcG9ydC0+cGVuZGluZ19scG1hc2spOworCisJLyogSWYgd2UndmUgdGltZWQgb3V0IHRoZSBxdWV1ZSBtdXN0IGJlIHN0b3BwZWQsIHdoaWNoIHNob3VsZAorCSAqIG9ubHkgZXZlciBoYXBwZW4gd2hlbiB0aGVyZSBpcyBhIHBlbmRpbmcgcGFja2V0LiAqLworCVdBUk5fT04oISBwb3J0LT5wZW5kaW5nX2xwbWFzayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFZNQVhBUkNISVRFQ1RFRExQUzsgaSsrKSB7CisJCXN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254ID0gdmV0aF9jbnhbaV07CisKKwkJaWYgKCEgKHBvcnQtPnBlbmRpbmdfbHBtYXNrICYgKDE8PGkpKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIElmIHdlJ3JlIHBlbmRpbmcgb24gaXQsIHdlIG11c3QgYmUgY29ubmVjdGVkIHRvIGl0LAorCQkgKiBzbyB3ZSBzaG91bGQgY2VydGFpbmx5IGhhdmUgYSBzdHJ1Y3R1cmUgZm9yIGl0LiAqLworCQlCVUdfT04oISBjbngpOworCisJCS8qIFRoZW9yZXRpY2FsbHkgd2UgY291bGQgYmUga2lja2luZyBhIGNvbm5lY3Rpb24KKwkJICogd2hpY2ggZG9lc24ndCBkZXNlcnZlIGl0LCBidXQgaW4gcHJhY3RpY2UgaWYgd2UndmUKKwkJICogaGFkIGEgVHggdGltZW91dCwgdGhlIHBlbmRpbmdfbHBtYXNrIHdpbGwgaGF2ZQorCQkgKiBleGFjdGx5IG9uZSBiaXQgc2V0IC0gdGhlIGNvbm5lY3Rpb24gY2F1c2luZyB0aGUKKwkJICogcHJvYmxlbS4gKi8KKwkJc3Bpbl9sb2NrKCZjbngtPmxvY2spOworCQljbngtPnN0YXRlIHw9IFZFVEhfU1RBVEVfUkVTRVQ7CisJCXZldGhfa2lja19zdGF0ZW1hY2hpbmUoY254KTsKKwkJc3Bpbl91bmxvY2soJmNueC0+bG9jayk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+cGVuZGluZ19nYXRlLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCB2ZXRoX3Byb2JlX29uZShpbnQgdmxhbiwgc3RydWN0IGRldmljZSAqdmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCB2ZXRoX3BvcnQgKnBvcnQ7CisJaW50IGksIHJjOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mIChzdHJ1Y3QgdmV0aF9wb3J0KSk7CisJaWYgKCEgZGV2KSB7CisJCXZldGhfZXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSBuZXRfZGV2aWNlIHN0cnVjdHVyZSFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwb3J0ID0gKHN0cnVjdCB2ZXRoX3BvcnQgKikgZGV2LT5wcml2OworCisJc3Bpbl9sb2NrX2luaXQoJnBvcnQtPnBlbmRpbmdfZ2F0ZSk7CisJcndsb2NrX2luaXQoJnBvcnQtPm1jYXN0X2dhdGUpOworCisJZm9yIChpID0gMDsgaSA8IEhWTUFYQVJDSElURUNURURMUFM7IGkrKykgeworCQlIdkxwVmlydHVhbExhbkluZGV4TWFwIG1hcDsKKworCQlpZiAoaSA9PSB0aGlzX2xwKQorCQkJY29udGludWU7CisJCW1hcCA9IEh2THBDb25maWdfZ2V0VmlydHVhbExhbkluZGV4TWFwRm9yTHAoaSk7CisJCWlmIChtYXAgJiAoMHg4MDAwID4+IHZsYW4pKQorCQkJcG9ydC0+bHBhcl9tYXAgfD0gKDEgPDwgaSk7CisJfQorCXBvcnQtPmRldiA9IHZkZXY7CisKKwlkZXYtPmRldl9hZGRyWzBdID0gMHgwMjsKKwlkZXYtPmRldl9hZGRyWzFdID0gMHgwMTsKKwlkZXYtPmRldl9hZGRyWzJdID0gMHhmZjsKKwlkZXYtPmRldl9hZGRyWzNdID0gdmxhbjsKKwlkZXYtPmRldl9hZGRyWzRdID0gMHhmZjsKKwlkZXYtPmRldl9hZGRyWzVdID0gdGhpc19scDsKKworCWRldi0+bXR1ID0gVkVUSF9NQVhfTVRVOworCisJbWVtY3B5KCZwb3J0LT5tYWNfYWRkciwgZGV2LT5kZXZfYWRkciwgNik7CisKKwlkZXYtPm9wZW4gPSB2ZXRoX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB2ZXRoX3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gdmV0aF9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9IHZldGhfZ2V0X3N0YXRzOworCWRldi0+Y2hhbmdlX210dSA9IHZldGhfY2hhbmdlX210dTsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IE5VTEw7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSB2ZXRoX3NldF9tdWx0aWNhc3RfbGlzdDsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmb3BzKTsKKworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAyICogKFZFVEhfQUNLVElNRU9VVCAqIEhaIC8gMTAwMDAwMCk7CisJZGV2LT50eF90aW1lb3V0ID0gdmV0aF90eF90aW1lb3V0OworCisJU0VUX05FVERFVl9ERVYoZGV2LCB2ZGV2KTsKKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjICE9IDApIHsKKwkJdmV0aF9wcmludGsoS0VSTl9FUlIsCisJCQkgICAgIkZhaWxlZCB0byByZWdpc3RlciBldGhlcm5ldCBkZXZpY2UgZm9yIHZsYW4gJWRcbiIsCisJCQkgICAgdmxhbik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBOVUxMOworCX0KKworCXZldGhfcHJpbnRrKEtFUk5fREVCVUcsICIlcyBhdHRhY2hlZCB0byBpU2VyaWVzIHZsYW4gJWQgKGxwYXJfbWFwPTB4JTA0eClcbiIsCisJCSAgICBkZXYtPm5hbWUsIHZsYW4sIHBvcnQtPmxwYXJfbWFwKTsKKworCXJldHVybiBkZXY7Cit9CisKKy8qCisgKiBUeCBwYXRoCisgKi8KKworc3RhdGljIGludCB2ZXRoX3RyYW5zbWl0X3RvX29uZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBIdkxwSW5kZXggcmxwLAorCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbnggPSB2ZXRoX2NueFtybHBdOworCXN0cnVjdCB2ZXRoX3BvcnQgKnBvcnQgPSAoc3RydWN0IHZldGhfcG9ydCAqKSBkZXYtPnByaXY7CisJSHZMcEV2ZW50X1JjIHJjOworCXUzMiBkbWFfYWRkcmVzcywgZG1hX2xlbmd0aDsKKwlzdHJ1Y3QgdmV0aF9tc2cgKm1zZyA9IE5VTEw7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghIGNueCkgeworCQlwb3J0LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY254LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoISBjbngtPnN0YXRlICYgVkVUSF9TVEFURV9SRUFEWSkKKwkJZ290byBkcm9wOworCisJaWYgKChza2ItPmxlbiAtIDE0KSA+IFZFVEhfTUFYX01UVSkKKwkJZ290byBkcm9wOworCisJbXNnID0gdmV0aF9zdGFja19wb3AoY254KTsKKworCWlmICghIG1zZykgeworCQllcnIgPSAxOworCQlnb3RvIGRyb3A7CisJfQorCisJZG1hX2xlbmd0aCA9IHNrYi0+bGVuOworCWRtYV9hZGRyZXNzID0gZG1hX21hcF9zaW5nbGUocG9ydC0+ZGV2LCBza2ItPmRhdGEsCisJCQkJICAgICBkbWFfbGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKKworCWlmIChkbWFfbWFwcGluZ19lcnJvcihkbWFfYWRkcmVzcykpCisJCWdvdG8gcmVjeWNsZV9hbmRfZHJvcDsKKworCS8qIElzIGl0IHJlYWxseSBuZWNlc3NhcnkgdG8gY2hlY2sgdGhlIGxlbmd0aCBhbmQgYWRkcmVzcworCSAqIGZpZWxkcyBvZiB0aGUgZmlyc3QgZW50cnkgaGVyZT8gKi8KKwltc2ctPnNrYiA9IHNrYjsKKwltc2ctPmRldiA9IHBvcnQtPmRldjsKKwltc2ctPmRhdGEuYWRkclswXSA9IGRtYV9hZGRyZXNzOworCW1zZy0+ZGF0YS5sZW5bMF0gPSBkbWFfbGVuZ3RoOworCW1zZy0+ZGF0YS5lb2ZtYXNrID0gMSA8PCBWRVRIX0VPRl9TSElGVDsKKwlzZXRfYml0KDAsICYobXNnLT5pbl91c2UpKTsKKwlyYyA9IHZldGhfc2lnbmFsZGF0YShjbngsIFZldGhFdmVudFR5cGVGcmFtZXMsIG1zZy0+dG9rZW4sICZtc2ctPmRhdGEpOworCisJaWYgKHJjICE9IEh2THBFdmVudF9SY19Hb29kKQorCQlnb3RvIHJlY3ljbGVfYW5kX2Ryb3A7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbngtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKKworIHJlY3ljbGVfYW5kX2Ryb3A6CisJbXNnLT5za2IgPSBOVUxMOworCS8qIG5lZWQgdG8gc2V0IGluIHVzZSB0byBtYWtlIHZldGhfcmVjeWNsZV9tc2cgaW4gY2FzZSB0aGlzCisJICogd2FzIGEgbWFwcGluZyBmYWlsdXJlICovCisJc2V0X2JpdCgwLCAmbXNnLT5pbl91c2UpOworCXZldGhfcmVjeWNsZV9tc2coY254LCBtc2cpOworIGRyb3A6CisJcG9ydC0+c3RhdHMudHhfZXJyb3JzKys7CisJZGV2X2tmcmVlX3NrYihza2IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNueC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBIdkxwSW5kZXhNYXAgdmV0aF90cmFuc21pdF90b19tYW55KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgSHZMcEluZGV4TWFwIGxwbWFzaywKKwkJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2ZXRoX3BvcnQgKnBvcnQgPSAoc3RydWN0IHZldGhfcG9ydCAqKSBkZXYtPnByaXY7CisJaW50IGk7CisJaW50IHJjOworCisJZm9yIChpID0gMDsgaSA8IEhWTUFYQVJDSElURUNURURMUFM7IGkrKykgeworCQlpZiAoKGxwbWFzayAmICgxIDw8IGkpKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJcmMgPSB2ZXRoX3RyYW5zbWl0X3RvX29uZShza2JfZ2V0KHNrYiksIGksIGRldik7CisJCWlmICghIHJjKQorCQkJbHBtYXNrICY9IH4oMTw8aSk7CisJfQorCisJaWYgKCEgbHBtYXNrKSB7CisJCXBvcnQtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJcG9ydC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJfQorCisJcmV0dXJuIGxwbWFzazsKK30KKworc3RhdGljIGludCB2ZXRoX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBjaGFyICpmcmFtZSA9IHNrYi0+ZGF0YTsKKwlzdHJ1Y3QgdmV0aF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB2ZXRoX3BvcnQgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJSHZMcEluZGV4TWFwIGxwbWFzazsKKworCWlmICghIChmcmFtZVswXSAmIDB4MDEpKSB7CisJCS8qIHVuaWNhc3QgcGFja2V0ICovCisJCUh2THBJbmRleCBybHAgPSBmcmFtZVs1XTsKKworCQlpZiAoICEgKCgxIDw8IHJscCkgJiBwb3J0LT5scGFyX21hcCkgKSB7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWxwbWFzayA9IDEgPDwgcmxwOworCX0gZWxzZSB7CisJCWxwbWFzayA9IHBvcnQtPmxwYXJfbWFwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5wZW5kaW5nX2dhdGUsIGZsYWdzKTsKKworCWxwbWFzayA9IHZldGhfdHJhbnNtaXRfdG9fbWFueShza2IsIGxwbWFzaywgZGV2KTsKKworCWlmICghIGxwbWFzaykgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfSBlbHNlIHsKKwkJaWYgKHBvcnQtPnBlbmRpbmdfc2tiKSB7CisJCQl2ZXRoX2Vycm9yKCIlczogVHggd2hpbGUgc2tiIHdhcyBwZW5kaW5nIVxuIiwKKwkJCQkgICBkZXYtPm5hbWUpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+cGVuZGluZ19nYXRlLCBmbGFncyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCXBvcnQtPnBlbmRpbmdfc2tiID0gc2tiOworCQlwb3J0LT5wZW5kaW5nX2xwbWFzayA9IGxwbWFzazsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnBlbmRpbmdfZ2F0ZSwgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfcmVjeWNsZV9tc2coc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngsCisJCQkgICAgIHN0cnVjdCB2ZXRoX21zZyAqbXNnKQoreworCXUzMiBkbWFfYWRkcmVzcywgZG1hX2xlbmd0aDsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJm1zZy0+aW5fdXNlKSkgeworCQlkbWFfYWRkcmVzcyA9IG1zZy0+ZGF0YS5hZGRyWzBdOworCQlkbWFfbGVuZ3RoID0gbXNnLT5kYXRhLmxlblswXTsKKworCQlkbWFfdW5tYXBfc2luZ2xlKG1zZy0+ZGV2LCBkbWFfYWRkcmVzcywgZG1hX2xlbmd0aCwKKwkJCQkgRE1BX1RPX0RFVklDRSk7CisKKwkJaWYgKG1zZy0+c2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShtc2ctPnNrYik7CisJCQltc2ctPnNrYiA9IE5VTEw7CisJCX0KKworCQltZW1zZXQoJm1zZy0+ZGF0YSwgMCwgc2l6ZW9mKG1zZy0+ZGF0YSkpOworCQl2ZXRoX3N0YWNrX3B1c2goY254LCBtc2cpOworCX0gZWxzZQorCQlpZiAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfT1BFTikKKwkJCXZldGhfZXJyb3IoIkJvZ3VzIGZyYW1lcyBhY2sgZnJvbSBscGFyICVkICgjJWQpXG4iLAorCQkJCSAgIGNueC0+cmVtb3RlX2xwLCBtc2ctPnRva2VuKTsKK30KKworc3RhdGljIHZvaWQgdmV0aF9mbHVzaF9wZW5kaW5nKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBIVk1BWEFSQ0hJVEVDVEVEVklSVFVBTExBTlM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdmV0aF9kZXZbaV07CisJCXN0cnVjdCB2ZXRoX3BvcnQgKnBvcnQ7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJaWYgKCEgZGV2KQorCQkJY29udGludWU7CisKKwkJcG9ydCA9IChzdHJ1Y3QgdmV0aF9wb3J0ICopZGV2LT5wcml2OworCisJCWlmICghIChwb3J0LT5scGFyX21hcCAmICgxPDxjbngtPnJlbW90ZV9scCkpKQorCQkJY29udGludWU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPnBlbmRpbmdfZ2F0ZSwgZmxhZ3MpOworCQlpZiAocG9ydC0+cGVuZGluZ19za2IpIHsKKwkJCXBvcnQtPnBlbmRpbmdfbHBtYXNrID0KKwkJCQl2ZXRoX3RyYW5zbWl0X3RvX21hbnkocG9ydC0+cGVuZGluZ19za2IsCisJCQkJCQkgICAgICBwb3J0LT5wZW5kaW5nX2xwbWFzaywKKwkJCQkJCSAgICAgIGRldik7CisJCQlpZiAoISBwb3J0LT5wZW5kaW5nX2xwbWFzaykgeworCQkJCWRldl9rZnJlZV9za2JfYW55KHBvcnQtPnBlbmRpbmdfc2tiKTsKKwkJCQlwb3J0LT5wZW5kaW5nX3NrYiA9IE5VTEw7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnBlbmRpbmdfZ2F0ZSwgZmxhZ3MpOworCX0KK30KKworLyoKKyAqIFJ4IHBhdGgKKyAqLworCitzdGF0aWMgaW5saW5lIGludCB2ZXRoX2ZyYW1lX3dhbnRlZChzdHJ1Y3QgdmV0aF9wb3J0ICpwb3J0LCB1NjQgbWFjX2FkZHIpCit7CisJaW50IHdhbnRlZCA9IDA7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICggKG1hY19hZGRyID09IHBvcnQtPm1hY19hZGRyKSB8fCAobWFjX2FkZHIgPT0gMHhmZmZmZmZmZmZmZmYwMDAwKSApCisJCXJldHVybiAxOworCisJaWYgKCEgKCgoY2hhciAqKSAmbWFjX2FkZHIpWzBdICYgMHgwMSkpCisJCXJldHVybiAwOworCisJcmVhZF9sb2NrX2lycXNhdmUoJnBvcnQtPm1jYXN0X2dhdGUsIGZsYWdzKTsKKworCWlmIChwb3J0LT5wcm9taXNjdW91cyB8fCBwb3J0LT5hbGxfbWNhc3QpIHsKKwkJd2FudGVkID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBvcnQtPm51bV9tY2FzdDsgKytpKSB7CisJCWlmIChwb3J0LT5tY2FzdF9hZGRyW2ldID09IG1hY19hZGRyKSB7CisJCQl3YW50ZWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKyBvdXQ6CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bWNhc3RfZ2F0ZSwgZmxhZ3MpOworCisJcmV0dXJuIHdhbnRlZDsKK30KKworc3RydWN0IGRtYV9jaHVuayB7CisJdTY0IGFkZHI7CisJdTY0IHNpemU7Cit9OworCisjZGVmaW5lIFZFVEhfTUFYX1BBR0VTX1BFUl9GUkFNRSAoIChWRVRIX01BWF9NVFUrUEFHRV9TSVpFLTIpL1BBR0VfU0laRSArIDEgKQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmV0aF9idWlsZF9kbWFfbGlzdChzdHJ1Y3QgZG1hX2NodW5rICpsaXN0LAorCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBsb25nIGRvbmU7CisJaW50IGkgPSAxOworCisJLyogRklYTUU6IHNrYnMgYXJlIGNvbnRpbmd1b3VzIGluIHJlYWwgYWRkcmVzc2VzLiAgRG8gd2UKKwkgKiByZWFsbHkgbmVlZCB0byBicmVhayBpdCBpbnRvIFBBR0VfU0laRSBjaHVua3MsIG9yIGNhbiB3ZSBkbworCSAqIGl0IGp1c3QgYXQgdGhlIGdyYW51bGFyaXR5IG9mIGlTZXJpZXMgcmVhbC0+YWJzb2x1dGUKKwkgKiBtYXBwaW5nPyAgSW5kZWVkLCBnaXZlbiB0aGUgd2F5IHRoZSBhbGxvY2F0b3Igd29ya3MsIGNhbiB3ZQorCSAqIGNvdW50IG9uIHRoZW0gYmVpbmcgYWJzb2x1dGVseSBjb250aWd1b3VzPyAqLworCWxpc3RbMF0uYWRkciA9IElTRVJJRVNfSFZfQUREUihwKTsKKwlsaXN0WzBdLnNpemUgPSBtaW4obGVuZ3RoLAorCQkJICAgUEFHRV9TSVpFIC0gKCh1bnNpZ25lZCBsb25nKXAgJiB+UEFHRV9NQVNLKSk7CisKKwlkb25lID0gbGlzdFswXS5zaXplOworCXdoaWxlIChkb25lIDwgbGVuZ3RoKSB7CisJCWxpc3RbaV0uYWRkciA9IElTRVJJRVNfSFZfQUREUihwICsgZG9uZSk7CisJCWxpc3RbaV0uc2l6ZSA9IG1pbihsZW5ndGgtZG9uZSwgUEFHRV9TSVpFKTsKKwkJZG9uZSArPSBsaXN0W2ldLnNpemU7CisJCWkrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfZmx1c2hfYWNrcyhzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCkKK3sKKwlIdkxwRXZlbnRfUmMgcmM7CisKKwlyYyA9IHZldGhfc2lnbmFsZGF0YShjbngsIFZldGhFdmVudFR5cGVGcmFtZXNBY2ssCisJCQkgICAgIDAsICZjbngtPnBlbmRpbmdfYWNrcyk7CisKKwlpZiAocmMgIT0gSHZMcEV2ZW50X1JjX0dvb2QpCisJCXZldGhfZXJyb3IoIkVycm9yIDB4JXggYWNraW5nIGZyYW1lcyBmcm9tIGxwYXIgJWQhXG4iLAorCQkJICAgKHVuc2lnbmVkKXJjLCBjbngtPnJlbW90ZV9scCk7CisKKwljbngtPm51bV9wZW5kaW5nX2Fja3MgPSAwOworCW1lbXNldCgmY254LT5wZW5kaW5nX2Fja3MsIDB4ZmYsIHNpemVvZihjbngtPnBlbmRpbmdfYWNrcykpOworfQorCitzdGF0aWMgdm9pZCB2ZXRoX3JlY2VpdmUoc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngsCisJCQkgc3RydWN0IFZldGhMcEV2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgVmV0aEZyYW1lc0RhdGEgKnNlbmRkYXRhID0gJmV2ZW50LT51LmZyYW1lc19kYXRhOworCWludCBzdGFydGNodW5rID0gMDsKKwlpbnQgbmNodW5rczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCUh2THBEbWFfUmMgcmM7CisKKwlkbyB7CisJCXUxNiBsZW5ndGggPSAwOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlzdHJ1Y3QgZG1hX2NodW5rIGxvY2FsX2xpc3RbVkVUSF9NQVhfUEFHRVNfUEVSX0ZSQU1FXTsKKwkJc3RydWN0IGRtYV9jaHVuayByZW1vdGVfbGlzdFtWRVRIX01BWF9GUkFNRVNfUEVSX01TR107CisJCXU2NCBkZXN0OworCQlIdkxwVmlydHVhbExhbkluZGV4IHZsYW47CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCXN0cnVjdCB2ZXRoX3BvcnQgKnBvcnQ7CisKKwkJLyogRklYTUU6IGRvIHdlIG5lZWQgdGhpcz8gKi8KKwkJbWVtc2V0KGxvY2FsX2xpc3QsIDAsIHNpemVvZihsb2NhbF9saXN0KSk7CisJCW1lbXNldChyZW1vdGVfbGlzdCwgMCwgc2l6ZW9mKFZFVEhfTUFYX0ZSQU1FU19QRVJfTVNHKSk7CisKKwkJLyogYSAwIGFkZHJlc3MgbWFya3MgdGhlIGVuZCBvZiB0aGUgdmFsaWQgZW50cmllcyAqLworCQlpZiAoc2VuZGRhdGEtPmFkZHJbc3RhcnRjaHVua10gPT0gMCkKKwkJCWJyZWFrOworCisJCS8qIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYXQgbGVhc3QgMSBFT0YgZW50cnkgaW4gdGhlCisJCSAqIHJlbWFpbmluZyBlbnRyaWVzICovCisJCWlmICghIChzZW5kZGF0YS0+ZW9mbWFzayA+PiAoc3RhcnRjaHVuayArIFZFVEhfRU9GX1NISUZUKSkpIHsKKwkJCXZldGhfZXJyb3IoIm1pc3NpbmcgRU9GIGZyYWcgaW4gZXZlbnQgIgorCQkJCSAgICJlb2ZtYXNrPTB4JXggc3RhcnRjaHVuaz0lZFxuIiwKKwkJCQkgICAodW5zaWduZWQpIHNlbmRkYXRhLT5lb2ZtYXNrLCBzdGFydGNodW5rKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogYnVpbGQgbGlzdCBvZiBjaHVua3MgaW4gdGhpcyBmcmFtZSAqLworCQluY2h1bmtzID0gMDsKKwkJZG8geworCQkJcmVtb3RlX2xpc3RbbmNodW5rc10uYWRkciA9CisJCQkJKHU2NCkgc2VuZGRhdGEtPmFkZHJbc3RhcnRjaHVuaytuY2h1bmtzXSA8PCAzMjsKKwkJCXJlbW90ZV9saXN0W25jaHVua3NdLnNpemUgPQorCQkJCXNlbmRkYXRhLT5sZW5bc3RhcnRjaHVuaytuY2h1bmtzXTsKKwkJCWxlbmd0aCArPSByZW1vdGVfbGlzdFtuY2h1bmtzXS5zaXplOworCQl9IHdoaWxlICghIChzZW5kZGF0YS0+ZW9mbWFzayAmCisJCQkgICAgKDEgPDwgKFZFVEhfRU9GX1NISUZUICsgc3RhcnRjaHVuayArIG5jaHVua3MrKykpKSk7CisKKwkJLyogbGVuZ3RoID09IHRvdGFsIGxlbmd0aCBvZiBhbGwgY2h1bmtzICovCisJCS8qIG5jaHVua3MgPT0gIyBvZiBjaHVua3MgaW4gdGhpcyBmcmFtZSAqLworCisJCWlmICgobGVuZ3RoIC0gRVRIX0hMRU4pID4gVkVUSF9NQVhfTVRVKSB7CisJCQl2ZXRoX2Vycm9yKCJSZWNlaXZlZCBvdmVyc2l6ZSBmcmFtZSBmcm9tIGxwYXIgJWQgIgorCQkJCSAgICIobGVuZ3RoPSVkKVxuIiwgY254LT5yZW1vdGVfbHAsIGxlbmd0aCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXNrYiA9IGFsbG9jX3NrYihsZW5ndGgsIEdGUF9BVE9NSUMpOworCQlpZiAoIXNrYikKKwkJCWNvbnRpbnVlOworCisJCXZldGhfYnVpbGRfZG1hX2xpc3QobG9jYWxfbGlzdCwgc2tiLT5kYXRhLCBsZW5ndGgpOworCisJCXJjID0gSHZDYWxsRXZlbnRfZG1hQnVmTGlzdChIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsTGFuLAorCQkJCQkgICAgZXZlbnQtPmJhc2VfZXZlbnQueFNvdXJjZUxwLAorCQkJCQkgICAgSHZMcERtYV9EaXJlY3Rpb25fUmVtb3RlVG9Mb2NhbCwKKwkJCQkJICAgIGNueC0+c3JjX2luc3QsCisJCQkJCSAgICBjbngtPmRzdF9pbnN0LAorCQkJCQkgICAgSHZMcERtYV9BZGRyZXNzVHlwZV9SZWFsQWRkcmVzcywKKwkJCQkJICAgIEh2THBEbWFfQWRkcmVzc1R5cGVfVGNlSW5kZXgsCisJCQkJCSAgICBJU0VSSUVTX0hWX0FERFIoJmxvY2FsX2xpc3QpLAorCQkJCQkgICAgSVNFUklFU19IVl9BRERSKCZyZW1vdGVfbGlzdCksCisJCQkJCSAgICBsZW5ndGgpOworCQlpZiAocmMgIT0gSHZMcERtYV9SY19Hb29kKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJY29udGludWU7CisJCX0KKworCQl2bGFuID0gc2tiLT5kYXRhWzldOworCQlkZXYgPSB2ZXRoX2Rldlt2bGFuXTsKKwkJaWYgKCEgZGV2KQorCQkJLyogU29tZSBlYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBkcml2ZXIgc2VudAorCQkJICAgYnJvYWRjYXN0cyBkb3duIGFsbCBjb25uZWN0aW9ucywgZXZlbiB0bworCQkJICAgbHBhcnMgdGhhdCB3ZXJlbid0IG9uIHRoZSByZWxldmFudCB2bGFuLgorCQkJICAgU28gaWdub3JlIHBhY2tldHMgYmVsb25naW5nIHRvIGEgdmxhbiB3ZSdyZQorCQkJICAgbm90IG9uLiAqLworCQkJY29udGludWU7CisKKwkJcG9ydCA9IChzdHJ1Y3QgdmV0aF9wb3J0ICopZGV2LT5wcml2OworCQlkZXN0ID0gKigodTY0ICopIHNrYi0+ZGF0YSkgJiAweEZGRkZGRkZGRkZGRjAwMDA7CisKKwkJaWYgKCh2bGFuID4gSFZNQVhBUkNISVRFQ1RFRFZJUlRVQUxMQU5TKSB8fCAhcG9ydCkgeworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghIHZldGhfZnJhbWVfd2FudGVkKHBvcnQsIGRlc3QpKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJY29udGludWU7CisJCX0KKworCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJbmV0aWZfcngoc2tiKTsJLyogc2VuZCBpdCB1cCAqLworCQlwb3J0LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCXBvcnQtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbmd0aDsKKwl9IHdoaWxlIChzdGFydGNodW5rICs9IG5jaHVua3MsIHN0YXJ0Y2h1bmsgPCBWRVRIX01BWF9GUkFNRVNfUEVSX01TRyk7CisKKwkvKiBBY2sgaXQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY254LT5sb2NrLCBmbGFncyk7CisJQlVHX09OKGNueC0+bnVtX3BlbmRpbmdfYWNrcyA+IFZFVEhfTUFYX0FDS1NfUEVSX01TRyk7CisKKwljbngtPnBlbmRpbmdfYWNrc1tjbngtPm51bV9wZW5kaW5nX2Fja3MrK10gPQorCQlldmVudC0+YmFzZV9ldmVudC54Q29ycmVsYXRpb25Ub2tlbjsKKworCWlmICggKGNueC0+bnVtX3BlbmRpbmdfYWNrcyA+PSBjbngtPnJlbW90ZV9jYXBzLmFja190aHJlc2hvbGQpCisJICAgICB8fCAoY254LT5udW1fcGVuZGluZ19hY2tzID49IFZFVEhfTUFYX0FDS1NfUEVSX01TRykgKQorCQl2ZXRoX2ZsdXNoX2Fja3MoY254KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNueC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB2ZXRoX3RpbWVkX2Fjayh1bnNpZ25lZCBsb25nIHB0cikKK3sKKwlzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCA9IChzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKikgcHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBBY2sgYWxsIHRoZSBldmVudHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY254LT5sb2NrLCBmbGFncyk7CisJaWYgKGNueC0+bnVtX3BlbmRpbmdfYWNrcyA+IDApCisJCXZldGhfZmx1c2hfYWNrcyhjbngpOworCisJLyogUmVzY2hlZHVsZSB0aGUgdGltZXIgKi8KKwljbngtPmFja190aW1lci5leHBpcmVzID0gamlmZmllcyArIGNueC0+YWNrX3RpbWVvdXQ7CisJYWRkX3RpbWVyKCZjbngtPmFja190aW1lcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY254LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgdmV0aF9yZW1vdmUoc3RydWN0IHZpb19kZXYgKnZkZXYpCit7CisJaW50IGkgPSB2ZGV2LT51bml0X2FkZHJlc3M7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWRldiA9IHZldGhfZGV2W2ldOworCWlmIChkZXYgIT0gTlVMTCkgeworCQl2ZXRoX2RldltpXSA9IE5VTEw7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZldGhfcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgaSA9IHZkZXYtPnVuaXRfYWRkcmVzczsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJZGV2ID0gdmV0aF9wcm9iZV9vbmUoaSwgJnZkZXYtPmRldik7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXZldGhfcmVtb3ZlKHZkZXYpOworCQlyZXR1cm4gMTsKKwl9CisJdmV0aF9kZXZbaV0gPSBkZXY7CisKKwkvKiBTdGFydCB0aGUgc3RhdGUgbWFjaGluZSBvbiBlYWNoIGNvbm5lY3Rpb24sIHRvIGNvbW1lbmNlCisJICogbGluayBuZWdvdGlhdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBIVk1BWEFSQ0hJVEVDVEVETFBTOyBpKyspCisJCWlmICh2ZXRoX2NueFtpXSkKKwkJCXZldGhfa2lja19zdGF0ZW1hY2hpbmUodmV0aF9jbnhbaV0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdmV0aF9kZXZpY2VfdGFibGU6IFVzZWQgYnkgdmlvLmMgdG8gbWF0Y2ggZGV2aWNlcyB0aGF0IHdlCisgKiBzdXBwb3J0LgorICovCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgdmV0aF9kZXZpY2VfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsgInZsYW4iLCAiIiB9LAorCXsgTlVMTCwgTlVMTCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIHZldGhfZGV2aWNlX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIHZldGhfZHJpdmVyID0geworCS5uYW1lID0gImlzZXJpZXNfdmV0aCIsCisJLmlkX3RhYmxlID0gdmV0aF9kZXZpY2VfdGFibGUsCisJLnByb2JlID0gdmV0aF9wcm9iZSwKKwkucmVtb3ZlID0gdmV0aF9yZW1vdmUKK307CisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24vY2xlYW51cAorICovCisKK3ZvaWQgX19leGl0IHZldGhfbW9kdWxlX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaTsKKworCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmdmV0aF9kcml2ZXIpOworCisJZm9yIChpID0gMDsgaSA8IEhWTUFYQVJDSElURUNURURMUFM7ICsraSkKKwkJdmV0aF9zdG9wX2Nvbm5lY3Rpb24oaSk7CisKKwlIdkxwRXZlbnRfdW5yZWdpc3RlckhhbmRsZXIoSHZMcEV2ZW50X1R5cGVfVmlydHVhbExhbik7CisKKwkvKiBIeXBlcnZpc29yIGNhbGxiYWNrcyBtYXkgaGF2ZSBzY2hlZHVsZWQgbW9yZSB3b3JrIHdoaWxlIHdlCisJICogd2VyZSBkZXN0cm95aW5nIGNvbm5lY3Rpb25zLiBOb3cgdGhhdCB3ZSd2ZSBkaXNjb25uZWN0ZWQgZnJvbQorCSAqIHRoZSBoeXBlcnZpc29yIG1ha2Ugc3VyZSBldmVyeXRoaW5nJ3MgZmluaXNoZWQuICovCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWZvciAoaSA9IDA7IGkgPCBIVk1BWEFSQ0hJVEVDVEVETFBTOyArK2kpCisJCXZldGhfZGVzdHJveV9jb25uZWN0aW9uKGkpOworCit9Cittb2R1bGVfZXhpdCh2ZXRoX21vZHVsZV9jbGVhbnVwKTsKKworaW50IF9faW5pdCB2ZXRoX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IGk7CisJaW50IHJjOworCisJdGhpc19scCA9IEh2THBDb25maWdfZ2V0THBJbmRleF9vdXRsaW5lKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFZNQVhBUkNISVRFQ1RFRExQUzsgKytpKSB7CisJCXJjID0gdmV0aF9pbml0X2Nvbm5lY3Rpb24oaSk7CisJCWlmIChyYyAhPSAwKSB7CisJCQl2ZXRoX21vZHVsZV9jbGVhbnVwKCk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlIdkxwRXZlbnRfcmVnaXN0ZXJIYW5kbGVyKEh2THBFdmVudF9UeXBlX1ZpcnR1YWxMYW4sCisJCQkJICAmdmV0aF9oYW5kbGVfZXZlbnQpOworCisJcmV0dXJuIHZpb19yZWdpc3Rlcl9kcml2ZXIoJnZldGhfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHZldGhfbW9kdWxlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmggYi9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTM3MGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmgKQEAgLTAsMCArMSw0NiBAQAorLyogRmlsZSB2ZXRoLmggY3JlYXRlZCBieSBLeWxlIEEuIEx1Y2tlIG9uIE1vbiBBdWcgIDcgMjAwMC4gKi8KKworI2lmbmRlZiBfSVNFUklFU19WRVRIX0gKKyNkZWZpbmUgX0lTRVJJRVNfVkVUSF9ICisKKyNkZWZpbmUgVmV0aEV2ZW50VHlwZUNhcAkoMCkKKyNkZWZpbmUgVmV0aEV2ZW50VHlwZUZyYW1lcwkoMSkKKyNkZWZpbmUgVmV0aEV2ZW50VHlwZU1vbml0b3IJKDIpCisjZGVmaW5lIFZldGhFdmVudFR5cGVGcmFtZXNBY2sJKDMpCisKKyNkZWZpbmUgVkVUSF9NQVhfQUNLU19QRVJfTVNHCSgyMCkKKyNkZWZpbmUgVkVUSF9NQVhfRlJBTUVTX1BFUl9NU0cJKDYpCisKK3N0cnVjdCBWZXRoRnJhbWVzRGF0YSB7CisJdTMyIGFkZHJbVkVUSF9NQVhfRlJBTUVTX1BFUl9NU0ddOworCXUxNiBsZW5bVkVUSF9NQVhfRlJBTUVTX1BFUl9NU0ddOworCXUzMiBlb2ZtYXNrOworfTsKKyNkZWZpbmUgVkVUSF9FT0ZfU0hJRlQJCSgzMi1WRVRIX01BWF9GUkFNRVNfUEVSX01TRykKKworc3RydWN0IFZldGhGcmFtZXNBY2tEYXRhIHsKKwl1MTYgdG9rZW5bVkVUSF9NQVhfQUNLU19QRVJfTVNHXTsKK307CisKK3N0cnVjdCBWZXRoQ2FwRGF0YSB7CisJdTggY2Fwc192ZXJzaW9uOworCXU4IHJzdmQxOworCXUxNiBudW1fYnVmZmVyczsKKwl1MTYgYWNrX3RocmVzaG9sZDsKKwl1MTYgcnN2ZDI7CisJdTMyIGFja190aW1lb3V0OworCXUzMiByc3ZkMzsKKwl1NjQgcnN2ZDRbM107Cit9OworCitzdHJ1Y3QgVmV0aExwRXZlbnQgeworCXN0cnVjdCBIdkxwRXZlbnQgYmFzZV9ldmVudDsKKwl1bmlvbiB7CisJCXN0cnVjdCBWZXRoQ2FwRGF0YSBjYXBzX2RhdGE7CisJCXN0cnVjdCBWZXRoRnJhbWVzRGF0YSBmcmFtZXNfZGF0YTsKKwkJc3RydWN0IFZldGhGcmFtZXNBY2tEYXRhIGZyYW1lc19hY2tfZGF0YTsKKwl9IHU7CisKK307CisKKyNlbmRpZgkvKiBfSVNFUklFU19WRVRIX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2IvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9peGdiL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjN2FmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9peGdiL01ha2VmaWxlCkBAIC0wLDAgKzEsMzUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIAorIyBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDIgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisjIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisjIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyMgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorIyBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyMgCisjIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorIyBmaWxlIGNhbGxlZCBMSUNFTlNFLgorIyAKKyMgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyMgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisjIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBJbnRlbChSKSBQUk8vMTBHYkUgZHJpdmVyCisjCisKK29iai0kKENPTkZJR19JWEdCKSArPSBpeGdiLm8KKworaXhnYi1vYmpzIDo9IGl4Z2JfbWFpbi5vIGl4Z2JfaHcubyBpeGdiX2VlLm8gaXhnYl9ldGh0b29sLm8gaXhnYl9wYXJhbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaCBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YzRmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaApAQCAtMCwwICsxLDIwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0lYR0JfSF8KKyNkZWZpbmUgX0lYR0JfSF8KKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2lmZGVmIE5FVElGX0ZfVFNPCisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisKKyNkZWZpbmUgQkFSXzAJCTAKKyNkZWZpbmUgQkFSXzEJCTEKKyNkZWZpbmUgQkFSXzUJCTUKKworc3RydWN0IGl4Z2JfYWRhcHRlcjsKKyNpbmNsdWRlICJpeGdiX2h3LmgiCisjaW5jbHVkZSAiaXhnYl9lZS5oIgorI2luY2x1ZGUgIml4Z2JfaWRzLmgiCisKKyNpZmRlZiBfREVCVUdfRFJJVkVSXworI2RlZmluZSBJWEdCX0RCRyhhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiaXhnYjogIiBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgSVhHQl9EQkcoYXJncy4uLikKKyNlbmRpZgorCisjZGVmaW5lIElYR0JfRVJSKGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiAiaXhnYjogIiBhcmdzKQorCisvKiBUWC9SWCBkZXNjcmlwdG9yIGRlZmluZXMgKi8KKyNkZWZpbmUgREVGQVVMVF9UWEQJIDI1NgorI2RlZmluZSBNQVhfVFhEICAgCTQwOTYKKyNkZWZpbmUgTUlOX1RYRAkgIDY0CisKKy8qIGhhcmR3YXJlIGNhbm5vdCByZWxpYWJseSBzdXBwb3J0IG1vcmUgdGhhbiA1MTIgZGVzY3JpcHRvcnMgb3duZWQgYnkKKyAqIGhhcmR3YXJlIGRlc2NyaW9wdG9yIGNhY2hlIG90aGVyd2lzZSBhbiB1bnJlbGlhYmxlIHJpbmcgdW5kZXIgaGVhdnkgCisgKiByZWNpZXZlIGxvYWQgbWF5IHJlc3VsdCAqLworLyogI2RlZmluZSBERUZBVUxUX1JYRAkgICAxMDI0ICovCisvKiAjZGVmaW5lIE1BWF9SWEQJICAgNDA5NiAqLworI2RlZmluZSBERUZBVUxUX1JYRAk1MTIKKyNkZWZpbmUgTUFYX1JYRAk1MTIKKyNkZWZpbmUgTUlOX1JYRAkgNjQKKworLyogU3VwcG9ydGVkIFJ4IEJ1ZmZlciBTaXplcyAqLworI2RlZmluZSBJWEdCX1JYQlVGRkVSXzIwNDggIDIwNDgKKyNkZWZpbmUgSVhHQl9SWEJVRkZFUl80MDk2ICA0MDk2CisjZGVmaW5lIElYR0JfUlhCVUZGRVJfODE5MiAgODE5MgorI2RlZmluZSBJWEdCX1JYQlVGRkVSXzE2Mzg0IDE2Mzg0CisKKy8qIEhvdyBtYW55IFR4IERlc2NyaXB0b3JzIGRvIHdlIG5lZWQgdG8gY2FsbCBuZXRpZl93YWtlX3F1ZXVlPyAqLworI2RlZmluZSBJWEdCX1RYX1FVRVVFX1dBS0UgMTYKKworLyogSG93IG1hbnkgUnggQnVmZmVycyBkbyB3ZSBidW5kbGUgaW50byBvbmUgd3JpdGUgdG8gdGhlIGhhcmR3YXJlID8gKi8KKyNkZWZpbmUgSVhHQl9SWF9CVUZGRVJfV1JJVEUJMTYJLyogTXVzdCBiZSBwb3dlciBvZiAyICovCisKKy8qIG9ubHkgd29ya3MgZm9yIHNpemVzIHRoYXQgYXJlIHBvd2VycyBvZiAyICovCisjZGVmaW5lIElYR0JfUk9VTkRVUChpLCBzaXplKSAoKGkpID0gKCgoaSkgKyAoc2l6ZSkgLSAxKSAmIH4oKHNpemUpIC0gMSkpKQorCisvKiB3cmFwcGVyIGFyb3VuZCBhIHBvaW50ZXIgdG8gYSBzb2NrZXQgYnVmZmVyLAorICogc28gYSBETUEgaGFuZGxlIGNhbiBiZSBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgYnVmZmVyICovCitzdHJ1Y3QgaXhnYl9idWZmZXIgeworCXN0cnVjdCBza19idWZmICpza2I7CisJdWludDY0X3QgZG1hOworCXVuc2lnbmVkIGxvbmcgdGltZV9zdGFtcDsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDE2X3QgbmV4dF90b193YXRjaDsKK307CisKK3N0cnVjdCBpeGdiX2Rlc2NfcmluZyB7CisJLyogcG9pbnRlciB0byB0aGUgZGVzY3JpcHRvciByaW5nIG1lbW9yeSAqLworCXZvaWQgKmRlc2M7CisJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRvciByaW5nICovCisJZG1hX2FkZHJfdCBkbWE7CisJLyogbGVuZ3RoIG9mIGRlc2NyaXB0b3IgcmluZyBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBzaXplOworCS8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgcmluZyAqLworCXVuc2lnbmVkIGludCBjb3VudDsKKwkvKiBuZXh0IGRlc2NyaXB0b3IgdG8gYXNzb2NpYXRlIGEgYnVmZmVyIHdpdGggKi8KKwl1bnNpZ25lZCBpbnQgbmV4dF90b191c2U7CisJLyogbmV4dCBkZXNjcmlwdG9yIHRvIGNoZWNrIGZvciBERCBzdGF0dXMgYml0ICovCisJdW5zaWduZWQgaW50IG5leHRfdG9fY2xlYW47CisJLyogYXJyYXkgb2YgYnVmZmVyIGluZm9ybWF0aW9uIHN0cnVjdHMgKi8KKwlzdHJ1Y3QgaXhnYl9idWZmZXIgKmJ1ZmZlcl9pbmZvOworfTsKKworI2RlZmluZSBJWEdCX0RFU0NfVU5VU0VEKFIpIFwKKwkoKCgoUiktPm5leHRfdG9fY2xlYW4gPiAoUiktPm5leHRfdG9fdXNlKSA/IDAgOiAoUiktPmNvdW50KSArIFwKKwkoUiktPm5leHRfdG9fY2xlYW4gLSAoUiktPm5leHRfdG9fdXNlIC0gMSkKKworI2RlZmluZSBJWEdCX0dFVF9ERVNDKFIsIGksIHR5cGUpCSgmKCgoc3RydWN0IHR5cGUgKikoKFIpLmRlc2MpKVtpXSkpCisjZGVmaW5lIElYR0JfUlhfREVTQyhSLCBpKQkJSVhHQl9HRVRfREVTQyhSLCBpLCBpeGdiX3J4X2Rlc2MpCisjZGVmaW5lIElYR0JfVFhfREVTQyhSLCBpKQkJSVhHQl9HRVRfREVTQyhSLCBpLCBpeGdiX3R4X2Rlc2MpCisjZGVmaW5lIElYR0JfQ09OVEVYVF9ERVNDKFIsIGkpCUlYR0JfR0VUX0RFU0MoUiwgaSwgaXhnYl9jb250ZXh0X2Rlc2MpCisKKy8qIGJvYXJkIHNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IGl4Z2JfYWRhcHRlciB7CisJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGltZXI7CisJc3RydWN0IHZsYW5fZ3JvdXAgKnZsZ3JwOworCXVpbnQzMl90IGJkX251bWJlcjsKKwl1aW50MzJfdCByeF9idWZmZXJfbGVuOworCXVpbnQzMl90IHBhcnRfbnVtOworCXVpbnQxNl90IGxpbmtfc3BlZWQ7CisJdWludDE2X3QgbGlua19kdXBsZXg7CisJc3BpbmxvY2tfdCB0eF9sb2NrOworCWF0b21pY190IGlycV9zZW07CisJc3RydWN0IHdvcmtfc3RydWN0IHR4X3RpbWVvdXRfdGFzazsKKworCXN0cnVjdCB0aW1lcl9saXN0IGJsaW5rX3RpbWVyOworCXVuc2lnbmVkIGxvbmcgbGVkX3N0YXR1czsKKworCS8qIFRYICovCisJc3RydWN0IGl4Z2JfZGVzY19yaW5nIHR4X3Jpbmc7CisJdW5zaWduZWQgbG9uZyB0aW1lb19zdGFydDsKKwl1aW50MzJfdCB0eF9jbWRfdHlwZTsKKwl1aW50NjRfdCBod19jc3VtX3R4X2dvb2Q7CisJdWludDY0X3QgaHdfY3N1bV90eF9lcnJvcjsKKwl1aW50MzJfdCB0eF9pbnRfZGVsYXk7CisJYm9vbGVhbl90IHR4X2ludF9kZWxheV9lbmFibGU7CisJYm9vbGVhbl90IGRldGVjdF90eF9odW5nOworCisJLyogUlggKi8KKwlzdHJ1Y3QgaXhnYl9kZXNjX3JpbmcgcnhfcmluZzsKKwl1aW50NjRfdCBod19jc3VtX3J4X2Vycm9yOworCXVpbnQ2NF90IGh3X2NzdW1fcnhfZ29vZDsKKwl1aW50MzJfdCByeF9pbnRfZGVsYXk7CisJYm9vbGVhbl90IHJ4X2NzdW07CisKKwkvKiBPUyBkZWZpbmVkIHN0cnVjdHMgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKKworCS8qIHN0cnVjdHMgZGVmaW5lZCBpbiBpeGdiX2h3LmggKi8KKwlzdHJ1Y3QgaXhnYl9odyBodzsKKwlzdHJ1Y3QgaXhnYl9od19zdGF0cyBzdGF0czsKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCWJvb2xlYW5fdCBoYXZlX21zaTsKKyNlbmRpZgorfTsKKyNlbmRpZiAvKiBfSVhHQl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX2VlLmMgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTNlOTlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2VlLmMKQEAgLTAsMCArMSw3NzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyAgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKKyAgbW9yZSBkZXRhaWxzLgorICAKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgCisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICAKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgIAorICBDb250YWN0IEluZm9ybWF0aW9uOgorICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaXhnYl9ody5oIgorI2luY2x1ZGUgIml4Z2JfZWUuaCIKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB1aW50MTZfdCBpeGdiX3NoaWZ0X2luX2JpdHMoc3RydWN0IGl4Z2JfaHcgKmh3KTsKKworc3RhdGljIHZvaWQgaXhnYl9zaGlmdF9vdXRfYml0cyhzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCQkJdWludDE2X3QgZGF0YSwKKwkJCQl1aW50MTZfdCBjb3VudCk7CitzdGF0aWMgdm9pZCBpeGdiX3N0YW5kYnlfZWVwcm9tKHN0cnVjdCBpeGdiX2h3ICpodyk7CisKK3N0YXRpYyBib29sZWFuX3QgaXhnYl93YWl0X2VlcHJvbV9jb21tYW5kKHN0cnVjdCBpeGdiX2h3ICpodyk7CisKK3N0YXRpYyB2b2lkIGl4Z2JfY2xlYW51cF9lZXByb20oc3RydWN0IGl4Z2JfaHcgKmh3KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFpc2VzIHRoZSBFRVBST00ncyBjbG9jayBpbnB1dC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogZWVjZF9yZWcgLSBFRUNEJ3MgY3VycmVudCB2YWx1ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2l4Z2JfcmFpc2VfY2xvY2soc3RydWN0IGl4Z2JfaHcgKmh3LAorCQkgIHVpbnQzMl90ICplZWNkX3JlZykKK3sKKwkvKiBSYWlzZSB0aGUgY2xvY2sgaW5wdXQgdG8gdGhlIEVFUFJPTSAoYnkgc2V0dGluZyB0aGUgU0sgYml0KSwgYW5kIHRoZW4KKwkgKiAgd2FpdCA1MCBtaWNyb3NlY29uZHMuCisJICovCisJKmVlY2RfcmVnID0gKmVlY2RfcmVnIHwgSVhHQl9FRUNEX1NLOworCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCAqZWVjZF9yZWcpOworCXVkZWxheSg1MCk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMb3dlcnMgdGhlIEVFUFJPTSdzIGNsb2NrIGlucHV0LgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBlZWNkX3JlZyAtIEVFQ0QncyBjdXJyZW50IHZhbHVlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXhnYl9sb3dlcl9jbG9jayhzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCSAgdWludDMyX3QgKmVlY2RfcmVnKQoreworCS8qIExvd2VyIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgRUVQUk9NIChieSBjbGVhcmluZyB0aGUgU0sgYml0KSwgYW5kIHRoZW4KKwkgKiB3YWl0IDUwIG1pY3Jvc2Vjb25kcy4KKwkgKi8KKwkqZWVjZF9yZWcgPSAqZWVjZF9yZWcgJiB+SVhHQl9FRUNEX1NLOworCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCAqZWVjZF9yZWcpOworCXVkZWxheSg1MCk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTaGlmdCBkYXRhIGJpdHMgb3V0IHRvIHRoZSBFRVBST00uCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIGRhdGEgLSBkYXRhIHRvIHNlbmQgdG8gdGhlIEVFUFJPTQorICogY291bnQgLSBudW1iZXIgb2YgYml0cyB0byBzaGlmdCBvdXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpeGdiX3NoaWZ0X291dF9iaXRzKHN0cnVjdCBpeGdiX2h3ICpodywKKwkJCQkJIHVpbnQxNl90IGRhdGEsCisJCQkJCSB1aW50MTZfdCBjb3VudCkKK3sKKwl1aW50MzJfdCBlZWNkX3JlZzsKKwl1aW50MzJfdCBtYXNrOworCisJLyogV2UgbmVlZCB0byBzaGlmdCAiY291bnQiIGJpdHMgb3V0IHRvIHRoZSBFRVBST00uIFNvLCB2YWx1ZSBpbiB0aGUKKwkgKiAiZGF0YSIgcGFyYW1ldGVyIHdpbGwgYmUgc2hpZnRlZCBvdXQgdG8gdGhlIEVFUFJPTSBvbmUgYml0IGF0IGEgdGltZS4KKwkgKiBJbiBvcmRlciB0byBkbyB0aGlzLCAiZGF0YSIgbXVzdCBiZSBicm9rZW4gZG93biBpbnRvIGJpdHMuCisJICovCisJbWFzayA9IDB4MDEgPDwgKGNvdW50IC0gMSk7CisJZWVjZF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBFRUNEKTsKKwllZWNkX3JlZyAmPSB+KElYR0JfRUVDRF9ETyB8IElYR0JfRUVDRF9ESSk7CisJZG8geworCQkvKiBBICIxIiBpcyBzaGlmdGVkIG91dCB0byB0aGUgRUVQUk9NIGJ5IHNldHRpbmcgYml0ICJESSIgdG8gYSAiMSIsCisJCSAqIGFuZCB0aGVuIHJhaXNpbmcgYW5kIHRoZW4gbG93ZXJpbmcgdGhlIGNsb2NrICh0aGUgU0sgYml0IGNvbnRyb2xzCisJCSAqIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgRUVQUk9NKS4gIEEgIjAiIGlzIHNoaWZ0ZWQgb3V0IHRvIHRoZSBFRVBST00KKwkJICogYnkgc2V0dGluZyAiREkiIHRvICIwIiBhbmQgdGhlbiByYWlzaW5nIGFuZCB0aGVuIGxvd2VyaW5nIHRoZSBjbG9jay4KKwkJICovCisJCWVlY2RfcmVnICY9IH5JWEdCX0VFQ0RfREk7CisKKwkJaWYoZGF0YSAmIG1hc2spCisJCQllZWNkX3JlZyB8PSBJWEdCX0VFQ0RfREk7CisKKwkJSVhHQl9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2RfcmVnKTsKKworCQl1ZGVsYXkoNTApOworCisJCWl4Z2JfcmFpc2VfY2xvY2soaHcsICZlZWNkX3JlZyk7CisJCWl4Z2JfbG93ZXJfY2xvY2soaHcsICZlZWNkX3JlZyk7CisKKwkJbWFzayA9IG1hc2sgPj4gMTsKKworCX0gd2hpbGUobWFzayk7CisKKwkvKiBXZSBsZWF2ZSB0aGUgIkRJIiBiaXQgc2V0IHRvICIwIiB3aGVuIHdlIGxlYXZlIHRoaXMgcm91dGluZS4gKi8KKwllZWNkX3JlZyAmPSB+SVhHQl9FRUNEX0RJOworCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkX3JlZyk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTaGlmdCBkYXRhIGJpdHMgaW4gZnJvbSB0aGUgRUVQUk9NCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1aW50MTZfdAoraXhnYl9zaGlmdF9pbl9iaXRzKHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwl1aW50MzJfdCBlZWNkX3JlZzsKKwl1aW50MzJfdCBpOworCXVpbnQxNl90IGRhdGE7CisKKwkvKiBJbiBvcmRlciB0byByZWFkIGEgcmVnaXN0ZXIgZnJvbSB0aGUgRUVQUk9NLCB3ZSBuZWVkIHRvIHNoaWZ0IDE2IGJpdHMKKwkgKiBpbiBmcm9tIHRoZSBFRVBST00uIEJpdHMgYXJlICJzaGlmdGVkIGluIiBieSByYWlzaW5nIHRoZSBjbG9jayBpbnB1dCB0bworCSAqIHRoZSBFRVBST00gKHNldHRpbmcgdGhlIFNLIGJpdCksIGFuZCB0aGVuIHJlYWRpbmcgdGhlIHZhbHVlIG9mIHRoZSAiRE8iCisJICogYml0LiAgRHVyaW5nIHRoaXMgInNoaWZ0aW5nIGluIiBwcm9jZXNzIHRoZSAiREkiIGJpdCBzaG91bGQgYWx3YXlzIGJlCisJICogY2xlYXIuLgorCSAqLworCisJZWVjZF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBFRUNEKTsKKworCWVlY2RfcmVnICY9IH4oSVhHQl9FRUNEX0RPIHwgSVhHQl9FRUNEX0RJKTsKKwlkYXRhID0gMDsKKworCWZvcihpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJZGF0YSA9IGRhdGEgPDwgMTsKKwkJaXhnYl9yYWlzZV9jbG9jayhodywgJmVlY2RfcmVnKTsKKworCQllZWNkX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisJCWVlY2RfcmVnICY9IH4oSVhHQl9FRUNEX0RJKTsKKwkJaWYoZWVjZF9yZWcgJiBJWEdCX0VFQ0RfRE8pCisJCQlkYXRhIHw9IDE7CisKKwkJaXhnYl9sb3dlcl9jbG9jayhodywgJmVlY2RfcmVnKTsKKwl9CisKKwlyZXR1cm4gZGF0YTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHJlcGFyZXMgRUVQUk9NIGZvciBhY2Nlc3MKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIExvd2VycyBFRVBST00gY2xvY2suIENsZWFycyBpbnB1dCBwaW4uIFNldHMgdGhlIGNoaXAgc2VsZWN0IHBpbi4gVGhpcworICogZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgaXNzdWluZyBhIGNvbW1hbmQgdG8gdGhlIEVFUFJPTS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpeGdiX3NldHVwX2VlcHJvbShzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3QgZWVjZF9yZWc7CisKKwllZWNkX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisJLyogIENsZWFyIFNLIGFuZCBESSAgKi8KKwllZWNkX3JlZyAmPSB+KElYR0JfRUVDRF9TSyB8IElYR0JfRUVDRF9ESSk7CisJSVhHQl9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2RfcmVnKTsKKworCS8qICBTZXQgQ1MgICovCisJZWVjZF9yZWcgfD0gSVhHQl9FRUNEX0NTOworCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkX3JlZyk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXR1cm5zIEVFUFJPTSB0byBhICJzdGFuZGJ5IiBzdGF0ZQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXhnYl9zdGFuZGJ5X2VlcHJvbShzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3QgZWVjZF9yZWc7CisKKwllZWNkX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisJLyogIERlc2VsY3QgRUVQUk9NICAqLworCWVlY2RfcmVnICY9IH4oSVhHQl9FRUNEX0NTIHwgSVhHQl9FRUNEX1NLKTsKKwlJWEdCX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZF9yZWcpOworCXVkZWxheSg1MCk7CisKKwkvKiAgQ2xvY2sgaGlnaCAgKi8KKwllZWNkX3JlZyB8PSBJWEdCX0VFQ0RfU0s7CisJSVhHQl9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2RfcmVnKTsKKwl1ZGVsYXkoNTApOworCisJLyogIFNlbGVjdCBFRVBST00gICovCisJZWVjZF9yZWcgfD0gSVhHQl9FRUNEX0NTOworCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkX3JlZyk7CisJdWRlbGF5KDUwKTsKKworCS8qICBDbG9jayBsb3cgICovCisJZWVjZF9yZWcgJj0gfklYR0JfRUVDRF9TSzsKKwlJWEdCX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZF9yZWcpOworCXVkZWxheSg1MCk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWlzZXMgdGhlbiBsb3dlcnMgdGhlIEVFUFJPTSdzIGNsb2NrIHBpbgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXhnYl9jbG9ja19lZXByb20oc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IGVlY2RfcmVnOworCisJZWVjZF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBFRUNEKTsKKworCS8qICBSaXNpbmcgZWRnZSBvZiBjbG9jayAgKi8KKwllZWNkX3JlZyB8PSBJWEdCX0VFQ0RfU0s7CisJSVhHQl9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2RfcmVnKTsKKwl1ZGVsYXkoNTApOworCisJLyogIEZhbGxpbmcgZWRnZSBvZiBjbG9jayAgKi8KKwllZWNkX3JlZyAmPSB+SVhHQl9FRUNEX1NLOworCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkX3JlZyk7CisJdWRlbGF5KDUwKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlcm1pbmF0ZXMgYSBjb21tYW5kIGJ5IGxvd2VyaW5nIHRoZSBFRVBST00ncyBjaGlwIHNlbGVjdCBwaW4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2l4Z2JfY2xlYW51cF9lZXByb20oc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IGVlY2RfcmVnOworCisJZWVjZF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBFRUNEKTsKKworCWVlY2RfcmVnICY9IH4oSVhHQl9FRUNEX0NTIHwgSVhHQl9FRUNEX0RJKTsKKworCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkX3JlZyk7CisKKwlpeGdiX2Nsb2NrX2VlcHJvbShodyk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBXYWl0cyBmb3IgdGhlIEVFUFJPTSB0byBmaW5pc2ggdGhlIGN1cnJlbnQgY29tbWFuZC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFRoZSBjb21tYW5kIGlzIGRvbmUgd2hlbiB0aGUgRUVQUk9NJ3MgZGF0YSBvdXQgcGluIGdvZXMgaGlnaC4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICBUUlVFOiBFRVBST00gZGF0YSBwaW4gaXMgaGlnaCBiZWZvcmUgdGltZW91dC4KKyAqICAgICAgRkFMU0U6ICBUaW1lIGV4cGlyZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYm9vbGVhbl90CitpeGdiX3dhaXRfZWVwcm9tX2NvbW1hbmQoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IGVlY2RfcmVnOworCXVpbnQzMl90IGk7CisKKwkvKiBUb2dnbGUgdGhlIENTIGxpbmUuICBUaGlzIGluIGVmZmVjdCB0ZWxscyB0byBFRVBST00gdG8gYWN0dWFsbHkgZXhlY3V0ZQorCSAqIHRoZSBjb21tYW5kIGluIHF1ZXN0aW9uLgorCSAqLworCWl4Z2Jfc3RhbmRieV9lZXByb20oaHcpOworCisJLyogTm93IHJlYWQgRE8gcmVwZWF0ZWRseSB1bnRpbCBpcyBoaWdoIChlcXVhbCB0byAnMScpLiAgVGhlIEVFRVBST00gd2lsbAorCSAqIHNpZ25hbCB0aGF0IHRoZSBjb21tYW5kIGhhcyBiZWVuIGNvbXBsZXRlZCBieSByYWlzaW5nIHRoZSBETyBzaWduYWwuCisJICogSWYgRE8gZG9lcyBub3QgZ28gaGlnaCBpbiAxMCBtaWxsaXNlY29uZHMsIHRoZW4gZXJyb3Igb3V0LgorCSAqLworCWZvcihpID0gMDsgaSA8IDIwMDsgaSsrKSB7CisJCWVlY2RfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgRUVDRCk7CisKKwkJaWYoZWVjZF9yZWcgJiBJWEdCX0VFQ0RfRE8pCisJCQlyZXR1cm4gKFRSVUUpOworCisJCXVkZWxheSg1MCk7CisJfQorCUFTU0VSVCgwKTsKKwlyZXR1cm4gKEZBTFNFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmVyaWZpZXMgdGhhdCB0aGUgRUVQUk9NIGhhcyBhIHZhbGlkIGNoZWNrc3VtCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZWFkcyB0aGUgZmlyc3QgNjQgMTYgYml0IHdvcmRzIG9mIHRoZSBFRVBST00gYW5kIHN1bXMgdGhlIHZhbHVlcyByZWFkLgorICogSWYgdGhlIHRoZSBzdW0gb2YgdGhlIDY0IDE2IGJpdCB3b3JkcyBpcyAweEJBQkEsIHRoZSBFRVBST00ncyBjaGVja3N1bSBpcworICogdmFsaWQuCisgKgorICogUmV0dXJuczoKKyAqICBUUlVFOiBDaGVja3N1bSBpcyB2YWxpZAorICogIEZBTFNFOiBDaGVja3N1bSBpcyBub3QgdmFsaWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sZWFuX3QKK2l4Z2JfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtKHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwl1aW50MTZfdCBjaGVja3N1bSA9IDA7CisJdWludDE2X3QgaTsKKworCWZvcihpID0gMDsgaSA8IChFRVBST01fQ0hFQ0tTVU1fUkVHICsgMSk7IGkrKykKKwkJY2hlY2tzdW0gKz0gaXhnYl9yZWFkX2VlcHJvbShodywgaSk7CisKKwlpZihjaGVja3N1bSA9PSAodWludDE2X3QpIEVFUFJPTV9TVU0pCisJCXJldHVybiAoVFJVRSk7CisJZWxzZQorCQlyZXR1cm4gKEZBTFNFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2FsY3VsYXRlcyB0aGUgRUVQUk9NIGNoZWNrc3VtIGFuZCB3cml0ZXMgaXQgdG8gdGhlIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogU3VtcyB0aGUgZmlyc3QgNjMgMTYgYml0IHdvcmRzIG9mIHRoZSBFRVBST00uIFN1YnRyYWN0cyB0aGUgc3VtIGZyb20gMHhCQUJBLgorICogV3JpdGVzIHRoZSBkaWZmZXJlbmNlIHRvIHdvcmQgb2Zmc2V0IDYzIG9mIHRoZSBFRVBST00uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitpeGdiX3VwZGF0ZV9lZXByb21fY2hlY2tzdW0oc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQxNl90IGNoZWNrc3VtID0gMDsKKwl1aW50MTZfdCBpOworCisJZm9yKGkgPSAwOyBpIDwgRUVQUk9NX0NIRUNLU1VNX1JFRzsgaSsrKQorCQljaGVja3N1bSArPSBpeGdiX3JlYWRfZWVwcm9tKGh3LCBpKTsKKworCWNoZWNrc3VtID0gKHVpbnQxNl90KSBFRVBST01fU1VNIC0gY2hlY2tzdW07CisKKwlpeGdiX3dyaXRlX2VlcHJvbShodywgRUVQUk9NX0NIRUNLU1VNX1JFRywgY2hlY2tzdW0pOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV3JpdGVzIGEgMTYgYml0IHdvcmQgdG8gYSBnaXZlbiBvZmZzZXQgaW4gdGhlIEVFUFJPTS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogcmVnIC0gb2Zmc2V0IHdpdGhpbiB0aGUgRUVQUk9NIHRvIGJlIHdyaXR0ZW4gdG8KKyAqIGRhdGEgLSAxNiBiaXQgd29yZCB0byBiZSB3cml0ZW4gdG8gdGhlIEVFUFJPTQorICoKKyAqIElmIGl4Z2JfdXBkYXRlX2VlcHJvbV9jaGVja3N1bSBpcyBub3QgY2FsbGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZQorICogRUVQUk9NIHdpbGwgbW9zdCBsaWtlbHkgY29udGFpbiBhbiBpbnZhbGlkIGNoZWNrc3VtLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l4Z2Jfd3JpdGVfZWVwcm9tKHN0cnVjdCBpeGdiX2h3ICpodywgdWludDE2X3Qgb2Zmc2V0LCB1aW50MTZfdCBkYXRhKQoreworCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOworCisJLyogUHJlcGFyZSB0aGUgRUVQUk9NIGZvciB3cml0aW5nICovCisJaXhnYl9zZXR1cF9lZXByb20oaHcpOworCisJLyogIFNlbmQgdGhlIDktYml0IEVXRU4gKHdyaXRlIGVuYWJsZSkgY29tbWFuZCB0byB0aGUgRUVQUk9NICg1LWJpdCBvcGNvZGUKKwkgKiAgcGx1cyA0LWJpdCBkdW1teSkuICBUaGlzIHB1dHMgdGhlIEVFUFJPTSBpbnRvIHdyaXRlL2VyYXNlIG1vZGUuCisJICovCisJaXhnYl9zaGlmdF9vdXRfYml0cyhodywgRUVQUk9NX0VXRU5fT1BDT0RFLCA1KTsKKwlpeGdiX3NoaWZ0X291dF9iaXRzKGh3LCAwLCA0KTsKKworCS8qICBQcmVwYXJlIHRoZSBFRVBST00gICovCisJaXhnYl9zdGFuZGJ5X2VlcHJvbShodyk7CisKKwkvKiAgU2VuZCB0aGUgV3JpdGUgY29tbWFuZCAoMy1iaXQgb3Bjb2RlICsgNi1iaXQgYWRkcikgICovCisJaXhnYl9zaGlmdF9vdXRfYml0cyhodywgRUVQUk9NX1dSSVRFX09QQ09ERSwgMyk7CisJaXhnYl9zaGlmdF9vdXRfYml0cyhodywgb2Zmc2V0LCA2KTsKKworCS8qICBTZW5kIHRoZSBkYXRhICAqLworCWl4Z2Jfc2hpZnRfb3V0X2JpdHMoaHcsIGRhdGEsIDE2KTsKKworCWl4Z2Jfd2FpdF9lZXByb21fY29tbWFuZChodyk7CisKKwkvKiAgUmVjb3ZlciBmcm9tIHdyaXRlICAqLworCWl4Z2Jfc3RhbmRieV9lZXByb20oaHcpOworCisJLyogU2VuZCB0aGUgOS1iaXQgRVdEUyAod3JpdGUgZGlzYWJsZSkgY29tbWFuZCB0byB0aGUgRUVQUk9NICg1LWJpdAorCSAqIG9wY29kZSBwbHVzIDQtYml0IGR1bW15KS4gIFRoaXMgdGFrZXMgdGhlIEVFUFJPTSBvdXQgb2Ygd3JpdGUvZXJhc2UKKwkgKiBtb2RlLgorCSAqLworCWl4Z2Jfc2hpZnRfb3V0X2JpdHMoaHcsIEVFUFJPTV9FV0RTX09QQ09ERSwgNSk7CisJaXhnYl9zaGlmdF9vdXRfYml0cyhodywgMCwgNCk7CisKKwkvKiAgRG9uZSB3aXRoIHdyaXRpbmcgICovCisJaXhnYl9jbGVhbnVwX2VlcHJvbShodyk7CisKKwkvKiBjbGVhciB0aGUgaW5pdF9jdHJsX3JlZ18xIHRvIHNpZ25pZnkgdGhhdCB0aGUgY2FjaGUgaXMgaW52YWxpZGF0ZWQgKi8KKwllZV9tYXAtPmluaXRfY3RybF9yZWdfMSA9IEVFUFJPTV9JQ1cxX1NJR05BVFVSRV9DTEVBUjsKKworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVhZHMgYSAxNiBiaXQgd29yZCBmcm9tIHRoZSBFRVBST00uCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG9mZnNldCAtIG9mZnNldCBvZiAxNiBiaXQgd29yZCBpbiB0aGUgRUVQUk9NIHRvIHJlYWQKKyAqCisgKiBSZXR1cm5zOgorICogIFRoZSAxNi1iaXQgdmFsdWUgcmVhZCBmcm9tIHRoZSBlZXByb20KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQxNl90CitpeGdiX3JlYWRfZWVwcm9tKHN0cnVjdCBpeGdiX2h3ICpodywKKwkJICB1aW50MTZfdCBvZmZzZXQpCit7CisJdWludDE2X3QgZGF0YTsKKworCS8qICBQcmVwYXJlIHRoZSBFRVBST00gZm9yIHJlYWRpbmcgICovCisJaXhnYl9zZXR1cF9lZXByb20oaHcpOworCisJLyogIFNlbmQgdGhlIFJFQUQgY29tbWFuZCAob3Bjb2RlICsgYWRkcikgICovCisJaXhnYl9zaGlmdF9vdXRfYml0cyhodywgRUVQUk9NX1JFQURfT1BDT0RFLCAzKTsKKwkvKgorCSAqIFdlIGhhdmUgYSA2NCB3b3JkIEVFUFJPTSwgdGhlcmUgYXJlIDYgYWRkcmVzcyBiaXRzCisJICovCisJaXhnYl9zaGlmdF9vdXRfYml0cyhodywgb2Zmc2V0LCA2KTsKKworCS8qICBSZWFkIHRoZSBkYXRhICAqLworCWRhdGEgPSBpeGdiX3NoaWZ0X2luX2JpdHMoaHcpOworCisJLyogIEVuZCB0aGlzIHJlYWQgb3BlcmF0aW9uICAqLworCWl4Z2Jfc3RhbmRieV9lZXByb20oaHcpOworCisJcmV0dXJuIChkYXRhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVhZHMgZWVwcm9tIGFuZCBzdG9yZXMgZGF0YSBpbiBzaGFyZWQgc3RydWN0dXJlLgorICogVmFsaWRhdGVzIGVlcHJvbSBjaGVja3N1bSBhbmQgZWVwcm9tIHNpZ25hdHVyZS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFJldHVybnM6CisgKiAgICAgIFRSVUU6IGlmIGVlcHJvbSByZWFkIGlzIHN1Y2Nlc3NmdWwKKyAqICAgICAgRkFMU0U6IG90aGVyd2lzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2xlYW5fdAoraXhnYl9nZXRfZWVwcm9tX2RhdGEoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQxNl90IGk7CisJdWludDE2X3QgY2hlY2tzdW0gPSAwOworCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXA7CisKKwlERUJVR0ZVTkMoIml4Z2JfZ2V0X2VlcHJvbV9kYXRhIik7CisKKwllZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOworCisJREVCVUdPVVQoIml4Z2JfZWU6IFJlYWRpbmcgZWVwcm9tIGRhdGFcbiIpOworCWZvcihpID0gMDsgaSA8IElYR0JfRUVQUk9NX1NJWkUgOyBpKyspIHsKKwkJdWludDE2X3QgZWVfZGF0YTsKKwkJZWVfZGF0YSA9IGl4Z2JfcmVhZF9lZXByb20oaHcsIGkpOworCQljaGVja3N1bSArPSBlZV9kYXRhOworCQlody0+ZWVwcm9tW2ldID0gbGUxNl90b19jcHUoZWVfZGF0YSk7CisJfQorCisJaWYgKGNoZWNrc3VtICE9ICh1aW50MTZfdCkgRUVQUk9NX1NVTSkgeworCQlERUJVR09VVCgiaXhnYl9lZTogQ2hlY2tzdW0gaW52YWxpZC5cbiIpOworCQkvKiBjbGVhciB0aGUgaW5pdF9jdHJsX3JlZ18xIHRvIHNpZ25pZnkgdGhhdCB0aGUgY2FjaGUgaXMKKwkJICogaW52YWxpZGF0ZWQgKi8KKwkJZWVfbWFwLT5pbml0X2N0cmxfcmVnXzEgPSBFRVBST01fSUNXMV9TSUdOQVRVUkVfQ0xFQVI7CisJCXJldHVybiAoRkFMU0UpOworCX0KKworCWlmICgoZWVfbWFwLT5pbml0X2N0cmxfcmVnXzEgJiBsZTE2X3RvX2NwdShFRVBST01fSUNXMV9TSUdOQVRVUkVfTUFTSykpCisJCSAhPSBsZTE2X3RvX2NwdShFRVBST01fSUNXMV9TSUdOQVRVUkVfVkFMSUQpKSB7CisJCURFQlVHT1VUKCJpeGdiX2VlOiBTaWduYXR1cmUgaW52YWxpZC5cbiIpOworCQlyZXR1cm4oRkFMU0UpOworCX0KKworCXJldHVybihUUlVFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTG9jYWwgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGVlcHJvbSBzaWduYXR1cmUgaXMgZ29vZAorICogSWYgdGhlIGVlcHJvbSBzaWduYXR1cmUgaXMgZ29vZCwgY2FsbHMgaXhnYilnZXRfZWVwcm9tX2RhdGEuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZXR1cm5zOgorICogICAgICBUUlVFOiBlZXByb20gc2lnbmF0dXJlIHdhcyBnb29kIGFuZCB0aGUgZWVwcm9tIHJlYWQgd2FzIHN1Y2Nlc3NmdWwKKyAqICAgICAgRkFMU0U6IG90aGVyd2lzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYm9vbGVhbl90CitpeGdiX2NoZWNrX2FuZF9nZXRfZWVwcm9tX2RhdGEgKHN0cnVjdCBpeGdiX2h3KiBodykKK3sKKwlzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqZWVfbWFwID0gKHN0cnVjdCBpeGdiX2VlX21hcF90eXBlICopaHctPmVlcHJvbTsKKworCWlmICgoZWVfbWFwLT5pbml0X2N0cmxfcmVnXzEgJiBsZTE2X3RvX2NwdShFRVBST01fSUNXMV9TSUdOQVRVUkVfTUFTSykpCisJICAgID09IGxlMTZfdG9fY3B1KEVFUFJPTV9JQ1cxX1NJR05BVFVSRV9WQUxJRCkpIHsKKwkJcmV0dXJuIChUUlVFKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gaXhnYl9nZXRfZWVwcm9tX2RhdGEoaHcpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmV0dXJuIGEgd29yZCBmcm9tIHRoZSBlZXByb20KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogaW5kZXggLSBPZmZzZXQgb2YgZWVwcm9tIHdvcmQKKyAqCisgKiBSZXR1cm5zOgorICogICAgICAgICAgV29yZCBhdCBpbmRleGVkIG9mZnNldCBpbiBlZXByb20sIGlmIHZhbGlkLCAwIG90aGVyd2lzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdAoraXhnYl9nZXRfZWVwcm9tX3dvcmQoc3RydWN0IGl4Z2JfaHcgKmh3LCB1aW50MTZfdCBpbmRleCkKK3sKKworCWlmICgoaW5kZXggPCBJWEdCX0VFUFJPTV9TSVpFKSAmJgorCQkoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKSkgeworCSAgIHJldHVybihody0+ZWVwcm9tW2luZGV4XSk7CisJfQorCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZXR1cm4gdGhlIG1hYyBhZGRyZXNzIGZyb20gRUVQUk9NCisgKgorICogaHcgICAgICAgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG1hY19hZGRyIC0gRXRoZXJuZXQgQWRkcmVzcyBpZiBFRVBST00gY29udGVudHMgYXJlIHZhbGlkLCAwIG90aGVyd2lzZQorICoKKyAqIFJldHVybnM6IE5vbmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAoraXhnYl9nZXRfZWVfbWFjX2FkZHIoc3RydWN0IGl4Z2JfaHcgKmh3LAorCQkJdWludDhfdCAqbWFjX2FkZHIpCit7CisJaW50IGk7CisJc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKmVlX21hcCA9IChzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqKWh3LT5lZXByb207CisKKwlERUJVR0ZVTkMoIml4Z2JfZ2V0X2VlX21hY19hZGRyIik7CisKKwlpZiAoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKSB7CisJCWZvciAoaSA9IDA7IGkgPCBJWEdCX0VUSF9MRU5HVEhfT0ZfQUREUkVTUzsgaSsrKSB7CisJCQltYWNfYWRkcltpXSA9IGVlX21hcC0+bWFjX2FkZHJbaV07CisJCQlERUJVR09VVDIoIm1hYyglZCkgPSAlLjJYXG4iLCBpLCBtYWNfYWRkcltpXSk7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJldHVybiB0aGUgY29tcGF0aWJpbGl0eSBmbGFncyBmcm9tIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogUmV0dXJuczoKKyAqICAgICAgICAgIGNvbXBhdGliaWxpdHkgZmxhZ3MgaWYgRUVQUk9NIGNvbnRlbnRzIGFyZSB2YWxpZCwgMCBvdGhlcndpc2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdAoraXhnYl9nZXRfZWVfY29tcGF0aWJpbGl0eShzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKmVlX21hcCA9IChzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqKWh3LT5lZXByb207CisKKwlpZihpeGdiX2NoZWNrX2FuZF9nZXRfZWVwcm9tX2RhdGEoaHcpID09IFRSVUUpCisJCXJldHVybihlZV9tYXAtPmNvbXBhdGliaWxpdHkpOworCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZXR1cm4gdGhlIFByaW50ZWQgQm9hcmQgQXNzZW1ibHkgbnVtYmVyIGZyb20gRUVQUk9NCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZXR1cm5zOgorICogICAgICAgICAgUEJBIG51bWJlciBpZiBFRVBST00gY29udGVudHMgYXJlIHZhbGlkLCAwIG90aGVyd2lzZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90CitpeGdiX2dldF9lZV9wYmFfbnVtYmVyKHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwlpZihpeGdiX2NoZWNrX2FuZF9nZXRfZWVwcm9tX2RhdGEoaHcpID09IFRSVUUpCisJCXJldHVybiAobGUxNl90b19jcHUoaHctPmVlcHJvbVtFRVBST01fUEJBXzFfMl9SRUddKQorCQkJfCAobGUxNl90b19jcHUoaHctPmVlcHJvbVtFRVBST01fUEJBXzNfNF9SRUddKTw8MTYpKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmV0dXJuIHRoZSBJbml0aWFsaXphdGlvbiBDb250cm9sIFdvcmQgMSBmcm9tIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogUmV0dXJuczoKKyAqICAgICAgICAgIEluaXRpYWxpemF0aW9uIENvbnRyb2wgV29yZCAxIGlmIEVFUFJPTSBjb250ZW50cyBhcmUgdmFsaWQsIDAgb3RoZXJ3aXNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDE2X3QKK2l4Z2JfZ2V0X2VlX2luaXRfY3RybF9yZWdfMShzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKmVlX21hcCA9IChzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqKWh3LT5lZXByb207CisKKwlpZihpeGdiX2NoZWNrX2FuZF9nZXRfZWVwcm9tX2RhdGEoaHcpID09IFRSVUUpCisJCXJldHVybihlZV9tYXAtPmluaXRfY3RybF9yZWdfMSk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJldHVybiB0aGUgSW5pdGlhbGl6YXRpb24gQ29udHJvbCBXb3JkIDIgZnJvbSBFRVBST00KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAgICBJbml0aWFsaXphdGlvbiBDb250cm9sIFdvcmQgMiBpZiBFRVBST00gY29udGVudHMgYXJlIHZhbGlkLCAwIG90aGVyd2lzZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQxNl90CitpeGdiX2dldF9lZV9pbml0X2N0cmxfcmVnXzIoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOworCisJaWYoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKQorCQlyZXR1cm4oZWVfbWFwLT5pbml0X2N0cmxfcmVnXzIpOworCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZXR1cm4gdGhlIFN1YnN5c3RlbSBJZCBmcm9tIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogUmV0dXJuczoKKyAqICAgICAgICAgIFN1YnN5c3RlbSBJZCBpZiBFRVBST00gY29udGVudHMgYXJlIHZhbGlkLCAwIG90aGVyd2lzZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQxNl90CitpeGdiX2dldF9lZV9zdWJzeXN0ZW1faWQoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOworCisJaWYoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKQorCSAgIHJldHVybihlZV9tYXAtPnN1YnN5c3RlbV9pZCk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJldHVybiB0aGUgU3ViIFZlbmRvciBJZCBmcm9tIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogUmV0dXJuczoKKyAqICAgICAgICAgIFN1YiBWZW5kb3IgSWQgaWYgRUVQUk9NIGNvbnRlbnRzIGFyZSB2YWxpZCwgMCBvdGhlcndpc2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdAoraXhnYl9nZXRfZWVfc3VidmVuZG9yX2lkKHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwlzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqZWVfbWFwID0gKHN0cnVjdCBpeGdiX2VlX21hcF90eXBlICopaHctPmVlcHJvbTsKKworCWlmKGl4Z2JfY2hlY2tfYW5kX2dldF9lZXByb21fZGF0YShodykgPT0gVFJVRSkKKwkJcmV0dXJuKGVlX21hcC0+c3VidmVuZG9yX2lkKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmV0dXJuIHRoZSBEZXZpY2UgSWQgZnJvbSBFRVBST00KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAgICBEZXZpY2UgSWQgaWYgRUVQUk9NIGNvbnRlbnRzIGFyZSB2YWxpZCwgMCBvdGhlcndpc2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdAoraXhnYl9nZXRfZWVfZGV2aWNlX2lkKHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwlzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqZWVfbWFwID0gKHN0cnVjdCBpeGdiX2VlX21hcF90eXBlICopaHctPmVlcHJvbTsKKworCWlmKGl4Z2JfY2hlY2tfYW5kX2dldF9lZXByb21fZGF0YShodykgPT0gVFJVRSkKKwkJcmV0dXJuKGVlX21hcC0+ZGV2aWNlX2lkKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmV0dXJuIHRoZSBWZW5kb3IgSWQgZnJvbSBFRVBST00KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAgICBEZXZpY2UgSWQgaWYgRUVQUk9NIGNvbnRlbnRzIGFyZSB2YWxpZCwgMCBvdGhlcndpc2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdAoraXhnYl9nZXRfZWVfdmVuZG9yX2lkKHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwlzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqZWVfbWFwID0gKHN0cnVjdCBpeGdiX2VlX21hcF90eXBlICopaHctPmVlcHJvbTsKKworCWlmKGl4Z2JfY2hlY2tfYW5kX2dldF9lZXByb21fZGF0YShodykgPT0gVFJVRSkKKwkJcmV0dXJuKGVlX21hcC0+dmVuZG9yX2lkKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmV0dXJuIHRoZSBTb2Z0d2FyZSBEZWZpbmVkIFBpbnMgUmVnaXN0ZXIgZnJvbSBFRVBST00KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAgICBTRFAgUmVnaXN0ZXIgaWYgRUVQUk9NIGNvbnRlbnRzIGFyZSB2YWxpZCwgMCBvdGhlcndpc2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdAoraXhnYl9nZXRfZWVfc3dkcGluc19yZWcoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOworCisJaWYoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKQorCQlyZXR1cm4oZWVfbWFwLT5zd2RwaW5zX3JlZyk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJldHVybiB0aGUgRDMgUG93ZXIgTWFuYWdlbWVudCBCaXRzIGZyb20gRUVQUk9NCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZXR1cm5zOgorICogICAgICAgICAgRDMgUG93ZXIgTWFuYWdlbWVudCBCaXRzIGlmIEVFUFJPTSBjb250ZW50cyBhcmUgdmFsaWQsIDAgb3RoZXJ3aXNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDhfdAoraXhnYl9nZXRfZWVfZDNfcG93ZXIoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOworCisJaWYoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKQorCQlyZXR1cm4oZWVfbWFwLT5kM19wb3dlcik7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJldHVybiB0aGUgRDAgUG93ZXIgTWFuYWdlbWVudCBCaXRzIGZyb20gRUVQUk9NCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZXR1cm5zOgorICogICAgICAgICAgRDAgUG93ZXIgTWFuYWdlbWVudCBCaXRzIGlmIEVFUFJPTSBjb250ZW50cyBhcmUgdmFsaWQsIDAgb3RoZXJ3aXNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDhfdAoraXhnYl9nZXRfZWVfZDBfcG93ZXIoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOworCisJaWYoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKQorCQlyZXR1cm4oZWVfbWFwLT5kMF9wb3dlcik7CisKKwlyZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZWUuaCBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9lZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOTBhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZWUuaApAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0lYR0JfRUVfSF8KKyNkZWZpbmUgX0lYR0JfRUVfSF8KKworI2RlZmluZSBJWEdCX0VFUFJPTV9TSVpFICAgIDY0CS8qIFNpemUgaW4gd29yZHMgKi8KKworI2RlZmluZSBJWEdCX0VUSF9MRU5HVEhfT0ZfQUREUkVTUyAgIDYKKworLyogRUVQUk9NIENvbW1hbmRzICovCisjZGVmaW5lIEVFUFJPTV9SRUFEX09QQ09ERSAgMHg2CS8qIEVFUlBPTSByZWFkIG9wY29kZSAqLworI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFIDB4NQkvKiBFRVJQT00gd3JpdGUgb3Bjb2RlICovCisjZGVmaW5lIEVFUFJPTV9FUkFTRV9PUENPREUgMHg3CS8qIEVFUlBPTSBlcmFzZSBvcGNvZGUgKi8KKyNkZWZpbmUgRUVQUk9NX0VXRU5fT1BDT0RFICAweDEzCS8qIEVFUlBPTSBlcmFzZS93cml0ZSBlbmFibGUgKi8KKyNkZWZpbmUgRUVQUk9NX0VXRFNfT1BDT0RFICAweDEwCS8qIEVFUlBPTSBlcmFzdC93cml0ZSBkaXNhYmxlICovCisKKy8qIEVFUFJPTSBNQVAgKFdvcmQgT2Zmc2V0cykgKi8KKyNkZWZpbmUgRUVQUk9NX0lBXzFfMl9SRUcgICAgICAgIDB4MDAwMAorI2RlZmluZSBFRVBST01fSUFfM180X1JFRyAgICAgICAgMHgwMDAxCisjZGVmaW5lIEVFUFJPTV9JQV81XzZfUkVHICAgICAgICAweDAwMDIKKyNkZWZpbmUgRUVQUk9NX0NPTVBBVElCSUxJVFlfUkVHIDB4MDAwMworI2RlZmluZSBFRVBST01fUEJBXzFfMl9SRUcgICAgICAgMHgwMDA4CisjZGVmaW5lIEVFUFJPTV9QQkFfM180X1JFRyAgICAgICAweDAwMDkKKyNkZWZpbmUgRUVQUk9NX0lOSVRfQ09OVFJPTDFfUkVHIDB4MDAwQQorI2RlZmluZSBFRVBST01fU1VCU1lTX0lEX1JFRyAgICAgMHgwMDBCCisjZGVmaW5lIEVFUFJPTV9TVUJWRU5EX0lEX1JFRyAgICAweDAwMEMKKyNkZWZpbmUgRUVQUk9NX0RFVklDRV9JRF9SRUcgICAgIDB4MDAwRAorI2RlZmluZSBFRVBST01fVkVORE9SX0lEX1JFRyAgICAgMHgwMDBFCisjZGVmaW5lIEVFUFJPTV9JTklUX0NPTlRST0wyX1JFRyAweDAwMEYKKyNkZWZpbmUgRUVQUk9NX1NXRFBJTlNfUkVHICAgICAgIDB4MDAyMAorI2RlZmluZSBFRVBST01fQ0lSQ1VJVF9DVFJMX1JFRyAgMHgwMDIxCisjZGVmaW5lIEVFUFJPTV9EMF9EM19QT1dFUl9SRUcgICAweDAwMjIKKyNkZWZpbmUgRUVQUk9NX0ZMQVNIX1ZFUlNJT04gICAgIDB4MDAzMgorI2RlZmluZSBFRVBST01fQ0hFQ0tTVU1fUkVHICAgICAgMHgwMDNGCisKKy8qIE1hc2sgYml0cyBmb3IgZmllbGRzIGluIFdvcmQgMHgwYSBvZiB0aGUgRUVQUk9NICovCisKKyNkZWZpbmUgRUVQUk9NX0lDVzFfU0lHTkFUVVJFX01BU0sgIDB4QzAwMAorI2RlZmluZSBFRVBST01fSUNXMV9TSUdOQVRVUkVfVkFMSUQgMHg0MDAwCisjZGVmaW5lIEVFUFJPTV9JQ1cxX1NJR05BVFVSRV9DTEVBUiAweDAwMDAKKworLyogRm9yIGNoZWNrc3VtbWluZywgdGhlIHN1bSBvZiBhbGwgd29yZHMgaW4gdGhlIEVFUFJPTSBzaG91bGQgZXF1YWwgMHhCQUJBLiAqLworI2RlZmluZSBFRVBST01fU1VNIDB4QkFCQQorCisvKiBFRVBST00gTWFwIFNpemVzIChCeXRlIENvdW50cykgKi8KKyNkZWZpbmUgUEJBX1NJWkUgNAorCisvKiBFRVBST00gTWFwIGRlZmluZXMgKFdPUkQgT0ZGU0VUUykqLworCisvKiBFRVBST00gc3RydWN0dXJlICovCitzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSB7CisJdWludDhfdCBtYWNfYWRkcltJWEdCX0VUSF9MRU5HVEhfT0ZfQUREUkVTU107CisJdWludDE2X3QgY29tcGF0aWJpbGl0eTsKKwl1aW50MTZfdCByZXNlcnZlZDFbNF07CisJdWludDMyX3QgcGJhX251bWJlcjsKKwl1aW50MTZfdCBpbml0X2N0cmxfcmVnXzE7CisJdWludDE2X3Qgc3Vic3lzdGVtX2lkOworCXVpbnQxNl90IHN1YnZlbmRvcl9pZDsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CisJdWludDE2X3QgdmVuZG9yX2lkOworCXVpbnQxNl90IGluaXRfY3RybF9yZWdfMjsKKwl1aW50MTZfdCBvZW1fcmVzZXJ2ZWRbMTZdOworCXVpbnQxNl90IHN3ZHBpbnNfcmVnOworCXVpbnQxNl90IGNpcmN1aXRfY3RybF9yZWc7CisJdWludDhfdCBkM19wb3dlcjsKKwl1aW50OF90IGQwX3Bvd2VyOworCXVpbnQxNl90IHJlc2VydmVkMlsyOF07CisJdWludDE2X3QgY2hlY2tzdW07Cit9OworCisvKiBFRVBST00gRnVuY3Rpb25zICovCit1aW50MTZfdCBpeGdiX3JlYWRfZWVwcm9tKHN0cnVjdCBpeGdiX2h3ICpodywgdWludDE2X3QgcmVnKTsKKworYm9vbGVhbl90IGl4Z2JfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtKHN0cnVjdCBpeGdiX2h3ICpodyk7CisKK3ZvaWQgaXhnYl91cGRhdGVfZWVwcm9tX2NoZWNrc3VtKHN0cnVjdCBpeGdiX2h3ICpodyk7CisKK3ZvaWQgaXhnYl93cml0ZV9lZXByb20oc3RydWN0IGl4Z2JfaHcgKmh3LCB1aW50MTZfdCByZWcsIHVpbnQxNl90IGRhdGEpOworCisjZW5kaWYJCQkJLyogSVhHQl9FRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2V0aHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWExMGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2V0aHRvb2wuYwpAQCAtMCwwICsxLDcwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGV0aHRvb2wgc3VwcG9ydCBmb3IgaXhnYiAqLworCisjaW5jbHVkZSAiaXhnYi5oIgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworZXh0ZXJuIGNoYXIgaXhnYl9kcml2ZXJfbmFtZVtdOworZXh0ZXJuIGNoYXIgaXhnYl9kcml2ZXJfdmVyc2lvbltdOworCitleHRlcm4gaW50IGl4Z2JfdXAoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gdm9pZCBpeGdiX2Rvd24oc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciwgYm9vbGVhbl90IGtpbGxfd2F0Y2hkb2cpOworZXh0ZXJuIHZvaWQgaXhnYl9yZXNldChzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK2V4dGVybiBpbnQgaXhnYl9zZXR1cF9yeF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gaW50IGl4Z2Jfc2V0dXBfdHhfcmVzb3VyY2VzKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworZXh0ZXJuIHZvaWQgaXhnYl9mcmVlX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK2V4dGVybiB2b2lkIGl4Z2JfZnJlZV90eF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gdm9pZCBpeGdiX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKKworc3RydWN0IGl4Z2Jfc3RhdHMgeworCWNoYXIgc3RhdF9zdHJpbmdbRVRIX0dTVFJJTkdfTEVOXTsKKwlpbnQgc2l6ZW9mX3N0YXQ7CisJaW50IHN0YXRfb2Zmc2V0OworfTsKKworI2RlZmluZSBJWEdCX1NUQVQobSkgc2l6ZW9mKCgoc3RydWN0IGl4Z2JfYWRhcHRlciAqKTApLT5tKSwgXAorCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgaXhnYl9hZGFwdGVyLCBtKQorc3RhdGljIHN0cnVjdCBpeGdiX3N0YXRzIGl4Z2JfZ3N0cmluZ3Nfc3RhdHNbXSA9IHsKKwl7InJ4X3BhY2tldHMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnJ4X3BhY2tldHMpfSwKKwl7InR4X3BhY2tldHMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnR4X3BhY2tldHMpfSwKKwl7InJ4X2J5dGVzIiwgSVhHQl9TVEFUKG5ldF9zdGF0cy5yeF9ieXRlcyl9LAorCXsidHhfYnl0ZXMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnR4X2J5dGVzKX0sCisJeyJyeF9lcnJvcnMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnJ4X2Vycm9ycyl9LAorCXsidHhfZXJyb3JzIiwgSVhHQl9TVEFUKG5ldF9zdGF0cy50eF9lcnJvcnMpfSwKKwl7InJ4X2Ryb3BwZWQiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnJ4X2Ryb3BwZWQpfSwKKwl7InR4X2Ryb3BwZWQiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnR4X2Ryb3BwZWQpfSwKKwl7Im11bHRpY2FzdCIsIElYR0JfU1RBVChuZXRfc3RhdHMubXVsdGljYXN0KX0sCisJeyJjb2xsaXNpb25zIiwgSVhHQl9TVEFUKG5ldF9zdGF0cy5jb2xsaXNpb25zKX0sCisKKy8qCXsgInJ4X2xlbmd0aF9lcnJvcnMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMpIH0sCSovCisJeyJyeF9vdmVyX2Vycm9ycyIsIElYR0JfU1RBVChuZXRfc3RhdHMucnhfb3Zlcl9lcnJvcnMpfSwKKwl7InJ4X2NyY19lcnJvcnMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMpfSwKKwl7InJ4X2ZyYW1lX2Vycm9ycyIsIElYR0JfU1RBVChuZXRfc3RhdHMucnhfZnJhbWVfZXJyb3JzKX0sCisJeyJyeF9maWZvX2Vycm9ycyIsIElYR0JfU1RBVChuZXRfc3RhdHMucnhfZmlmb19lcnJvcnMpfSwKKwl7InJ4X21pc3NlZF9lcnJvcnMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMpfSwKKwl7InR4X2Fib3J0ZWRfZXJyb3JzIiwgSVhHQl9TVEFUKG5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyl9LAorCXsidHhfY2Fycmllcl9lcnJvcnMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKX0sCisJeyJ0eF9maWZvX2Vycm9ycyIsIElYR0JfU1RBVChuZXRfc3RhdHMudHhfZmlmb19lcnJvcnMpfSwKKwl7InR4X2hlYXJ0YmVhdF9lcnJvcnMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMpfSwKKwl7InR4X3dpbmRvd19lcnJvcnMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnMpfSwKKwl7InR4X2RlZmVycmVkX29rIiwgSVhHQl9TVEFUKHN0YXRzLmRjKX0sCisJeyJyeF9sb25nX2xlbmd0aF9lcnJvcnMiLCBJWEdCX1NUQVQoc3RhdHMucm9jKX0sCisJeyJyeF9zaG9ydF9sZW5ndGhfZXJyb3JzIiwgSVhHQl9TVEFUKHN0YXRzLnJ1Yyl9LAorI2lmZGVmIE5FVElGX0ZfVFNPCisJeyJ0eF90Y3Bfc2VnX2dvb2QiLCBJWEdCX1NUQVQoc3RhdHMudHNjdGMpfSwKKwl7InR4X3RjcF9zZWdfZmFpbGVkIiwgSVhHQl9TVEFUKHN0YXRzLnRzY3RmYyl9LAorI2VuZGlmCisJeyJyeF9mbG93X2NvbnRyb2xfeG9uIiwgSVhHQl9TVEFUKHN0YXRzLnhvbnJ4Yyl9LAorCXsicnhfZmxvd19jb250cm9sX3hvZmYiLCBJWEdCX1NUQVQoc3RhdHMueG9mZnJ4Yyl9LAorCXsidHhfZmxvd19jb250cm9sX3hvbiIsIElYR0JfU1RBVChzdGF0cy54b250eGMpfSwKKwl7InR4X2Zsb3dfY29udHJvbF94b2ZmIiwgSVhHQl9TVEFUKHN0YXRzLnhvZmZ0eGMpfSwKKwl7InJ4X2NzdW1fb2ZmbG9hZF9nb29kIiwgSVhHQl9TVEFUKGh3X2NzdW1fcnhfZ29vZCl9LAorCXsicnhfY3N1bV9vZmZsb2FkX2Vycm9ycyIsIElYR0JfU1RBVChod19jc3VtX3J4X2Vycm9yKX0sCisJeyJ0eF9jc3VtX29mZmxvYWRfZ29vZCIsIElYR0JfU1RBVChod19jc3VtX3R4X2dvb2QpfSwKKwl7InR4X2NzdW1fb2ZmbG9hZF9lcnJvcnMiLCBJWEdCX1NUQVQoaHdfY3N1bV90eF9lcnJvcil9Cit9OworCisjZGVmaW5lIElYR0JfU1RBVFNfTEVOCVwKKwlzaXplb2YoaXhnYl9nc3RyaW5nc19zdGF0cykgLyBzaXplb2Yoc3RydWN0IGl4Z2Jfc3RhdHMpCisKK3N0YXRpYyBpbnQKK2l4Z2JfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJZWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUpOworCWVjbWQtPmFkdmVydGlzaW5nID0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUpOworCWVjbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKworCWlmKG5ldGlmX2NhcnJpZXJfb2soYWRhcHRlci0+bmV0ZGV2KSkgeworCQllY21kLT5zcGVlZCA9IFNQRUVEXzEwMDAwOworCQllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwl9IGVsc2UgeworCQllY21kLT5zcGVlZCA9IC0xOworCQllY21kLT5kdXBsZXggPSAtMTsKKwl9CisKKwllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpeGdiX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCWlmKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUgfHwKKwkgICBlY21kLT5zcGVlZCArIGVjbWQtPmR1cGxleCAhPSBTUEVFRF8xMDAwMCArIERVUExFWF9GVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwlpZihuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwkJaXhnYl9kb3duKGFkYXB0ZXIsIFRSVUUpOworCQlpeGdiX3Jlc2V0KGFkYXB0ZXIpOworCQlpeGdiX3VwKGFkYXB0ZXIpOworCX0gZWxzZQorCQlpeGdiX3Jlc2V0KGFkYXB0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpeGdiX2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXhnYl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJCisJcGF1c2UtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJCQorCWlmKGh3LT5mYy50eXBlID09IGl4Z2JfZmNfcnhfcGF1c2UpCisJCXBhdXNlLT5yeF9wYXVzZSA9IDE7CisJZWxzZSBpZihody0+ZmMudHlwZSA9PSBpeGdiX2ZjX3R4X3BhdXNlKQorCQlwYXVzZS0+dHhfcGF1c2UgPSAxOworCWVsc2UgaWYoaHctPmZjLnR5cGUgPT0gaXhnYl9mY19mdWxsKSB7CisJCXBhdXNlLT5yeF9wYXVzZSA9IDE7CisJCXBhdXNlLT50eF9wYXVzZSA9IDE7CisJfQorfQorCitzdGF0aWMgaW50CitpeGdiX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXhnYl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJCisJaWYocGF1c2UtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYocGF1c2UtPnJ4X3BhdXNlICYmIHBhdXNlLT50eF9wYXVzZSkKKwkJaHctPmZjLnR5cGUgPSBpeGdiX2ZjX2Z1bGw7CisJZWxzZSBpZihwYXVzZS0+cnhfcGF1c2UgJiYgIXBhdXNlLT50eF9wYXVzZSkKKwkJaHctPmZjLnR5cGUgPSBpeGdiX2ZjX3J4X3BhdXNlOworCWVsc2UgaWYoIXBhdXNlLT5yeF9wYXVzZSAmJiBwYXVzZS0+dHhfcGF1c2UpCisJCWh3LT5mYy50eXBlID0gaXhnYl9mY190eF9wYXVzZTsKKwllbHNlIGlmKCFwYXVzZS0+cnhfcGF1c2UgJiYgIXBhdXNlLT50eF9wYXVzZSkKKwkJaHctPmZjLnR5cGUgPSBpeGdiX2ZjX25vbmU7CisKKwlpZihuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwkJaXhnYl9kb3duKGFkYXB0ZXIsIFRSVUUpOworCQlpeGdiX3VwKGFkYXB0ZXIpOworCX0gZWxzZQorCQlpeGdiX3Jlc2V0KGFkYXB0ZXIpOworCQkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90CitpeGdiX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlyZXR1cm4gYWRhcHRlci0+cnhfY3N1bTsKK30KKworc3RhdGljIGludAoraXhnYl9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBkYXRhKQoreworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJYWRhcHRlci0+cnhfY3N1bSA9IGRhdGE7CisKKwlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJaXhnYl9kb3duKGFkYXB0ZXIsVFJVRSk7CisJCWl4Z2JfdXAoYWRhcHRlcik7CisJfSBlbHNlCisJCWl4Z2JfcmVzZXQoYWRhcHRlcik7CisJcmV0dXJuIDA7Cit9CisJCitzdGF0aWMgdWludDMyX3QKK2l4Z2JfZ2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX0NTVU0pICE9IDA7Cit9CisKK3N0YXRpYyBpbnQKK2l4Z2Jfc2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKK3sKKwlpZiAoZGF0YSkKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX0NTVU07CisJZWxzZQorCQluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0hXX0NTVU07CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE5FVElGX0ZfVFNPCitzdGF0aWMgaW50CitpeGdiX3NldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKK3sKKwlpZihkYXRhKQorCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOworCWVsc2UKKwkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9UU087CisJcmV0dXJuIDA7Cit9IAorI2VuZGlmIC8qIE5FVElGX0ZfVFNPICovCisKKyNkZWZpbmUgSVhHQl9HRVRfU1RBVChfQV8sIF9SXykgX0FfLT5zdGF0cy5fUl8KKworc3RhdGljIGludCAKK2l4Z2JfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisjZGVmaW5lIElYR0JfUkVHX0RVTVBfTEVOICAxMzYqc2l6ZW9mKHVpbnQzMl90KQorCXJldHVybiBJWEdCX1JFR19EVU1QX0xFTjsKK30KKworc3RhdGljIHZvaWQKK2l4Z2JfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICAgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBpeGdiX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1aW50MzJfdCAqcmVnID0gcDsKKwl1aW50MzJfdCAqcmVnX3N0YXJ0ID0gcmVnOworCXVpbnQ4X3QgaTsKKworCXJlZ3MtPnZlcnNpb24gPSAoYWRhcHRlci0+aHcuZGV2aWNlX2lkIDw8IDE2KSB8IGFkYXB0ZXItPmh3LnN1YnN5c3RlbV9pZDsKKworCS8qIEdlbmVyYWwgUmVnaXN0ZXJzICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgQ1RSTDApOwkvKiAgIDAgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBDVFJMMSk7CS8qICAgMSAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFNUQVRVUyk7CS8qICAgMiAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIEVFQ0QpOwkvKiAgIDMgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBNRlMpOwkvKiAgIDQgKi8KKworCS8qIEludGVycnVwdCAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIElDUik7CS8qICAgNSAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIElDUyk7CS8qICAgNiAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIElNUyk7CS8qICAgNyAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIElNQyk7CS8qICAgOCAqLworCisJLyogUmVjZWl2ZSAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFJDVEwpOwkvKiAgIDkgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBGQ1JUTCk7CS8qICAxMCAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIEZDUlRIKTsJLyogIDExICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgUkRCQUwpOwkvKiAgMTIgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBSREJBSCk7CS8qICAxMyAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFJETEVOKTsJLyogIDE0ICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgUkRIKTsJLyogIDE1ICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgUkRUKTsJLyogIDE2ICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgUkRUUik7CS8qICAxNyAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFJYRENUTCk7CS8qICAxOCAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFJBSURDKTsJLyogIDE5ICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgUlhDU1VNKTsJLyogIDIwICovCisKKwlmb3IgKGkgPSAwOyBpIDwgSVhHQl9SQVJfRU5UUklFUzsgaSsrKSB7CisJCSpyZWcrKyA9IElYR0JfUkVBRF9SRUdfQVJSQVkoaHcsIFJBTCwgKGkgPDwgMSkpOyAvKjIxLC4uLiw1MSAqLworCQkqcmVnKysgPSBJWEdCX1JFQURfUkVHX0FSUkFZKGh3LCBSQUgsIChpIDw8IDEpKTsgLyoyMiwuLi4sNTIgKi8KKwl9CisKKwkvKiBUcmFuc21pdCAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFRDVEwpOwkvKiAgNTMgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBUREJBTCk7CS8qICA1NCAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFREQkFIKTsJLyogIDU1ICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgVERMRU4pOwkvKiAgNTYgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBUREgpOwkvKiAgNTcgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBURFQpOwkvKiAgNTggKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBUSURWKTsJLyogIDU5ICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgVFhEQ1RMKTsJLyogIDYwICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgVFNQTVQpOwkvKiAgNjEgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBQQVApOwkvKiAgNjIgKi8KKworCS8qIFBoeXNpY2FsICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgUENTQzEpOwkvKiAgNjMgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBQQ1NDMik7CS8qICA2NCAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFBDU1MxKTsJLyogIDY1ICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgUENTUzIpOwkvKiAgNjYgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBYUENTUyk7CS8qICA2NyAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFVDQ1IpOwkvKiAgNjggKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBYUENTVEMpOwkvKiAgNjkgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBNQUNBKTsJLyogIDcwICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgQVBBRSk7CS8qICA3MSAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIEFSRCk7CS8qICA3MiAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIEFJUyk7CS8qICA3MyAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIE1TQ0EpOwkvKiAgNzQgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBNU1JXRCk7CS8qICA3NSAqLworCisJLyogU3RhdGlzdGljcyAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgdHBybCk7CS8qICA3NiAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgdHByaCk7CS8qICA3NyAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgZ3ByY2wpOwkvKiAgNzggKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIGdwcmNoKTsJLyogIDc5ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBicHJjbCk7CS8qICA4MCAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgYnByY2gpOwkvKiAgODEgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIG1wcmNsKTsJLyogIDgyICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBtcHJjaCk7CS8qICA4MyAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgdXByY2wpOwkvKiAgODQgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHVwcmNoKTsJLyogIDg1ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB2cHJjbCk7CS8qICA4NiAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgdnByY2gpOwkvKiAgODcgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIGpwcmNsKTsJLyogIDg4ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBqcHJjaCk7CS8qICA4OSAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgZ29yY2wpOwkvKiAgOTAgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIGdvcmNoKTsJLyogIDkxICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB0b3JsKTsJLyogIDkyICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB0b3JoKTsJLyogIDkzICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBybmJjKTsJLyogIDk0ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBydWMpOwkvKiAgOTUgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHJvYyk7CS8qICA5NiAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgcmxlYyk7CS8qICA5NyAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgY3JjZXJycyk7CS8qICA5OCAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgaWNiYyk7CS8qICA5OSAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgZWNiYyk7CS8qIDEwMCAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgbXBjKTsJLyogMTAxICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB0cHRsKTsJLyogMTAyICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB0cHRoKTsJLyogMTAzICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBncHRjbCk7CS8qIDEwNCAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgZ3B0Y2gpOwkvKiAxMDUgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIGJwdGNsKTsJLyogMTA2ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBicHRjaCk7CS8qIDEwNyAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgbXB0Y2wpOwkvKiAxMDggKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIG1wdGNoKTsJLyogMTA5ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB1cHRjbCk7CS8qIDExMCAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgdXB0Y2gpOwkvKiAxMTEgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHZwdGNsKTsJLyogMTEyICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB2cHRjaCk7CS8qIDExMyAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwganB0Y2wpOwkvKiAxMTQgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIGpwdGNoKTsJLyogMTE1ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBnb3RjbCk7CS8qIDExNiAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgZ290Y2gpOwkvKiAxMTcgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHRvdGwpOwkvKiAxMTggKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHRvdGgpOwkvKiAxMTkgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIGRjKTsJLyogMTIwICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBwbHQ2NGMpOwkvKiAxMjEgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHRzY3RjKTsJLyogMTIyICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB0c2N0ZmMpOwkvKiAxMjMgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIGliaWMpOwkvKiAxMjQgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHJmYyk7CS8qIDEyNSAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgbGZjKTsJLyogMTI2ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBwZnJjKTsJLyogMTI3ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBwZnRjKTsJLyogMTI4ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBtY2ZyYyk7CS8qIDEyOSAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgbWNmdGMpOwkvKiAxMzAgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHhvbnJ4Yyk7CS8qIDEzMSAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgeG9udHhjKTsJLyogMTMyICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB4b2ZmcnhjKTsJLyogMTMzICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB4b2ZmdHhjKTsJLyogMTM0ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCByamMpOwkvKiAxMzUgKi8KKworCXJlZ3MtPmxlbiA9IChyZWcgLSByZWdfc3RhcnQpICogc2l6ZW9mKHVpbnQzMl90KTsKK30KKworc3RhdGljIGludAoraXhnYl9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCS8qIHJldHVybiBzaXplIGluIGJ5dGVzICovCisJcmV0dXJuIChJWEdCX0VFUFJPTV9TSVpFIDw8IDEpOworfQorCitzdGF0aWMgaW50CitpeGdiX2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdWludDhfdCAqYnl0ZXMpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXhnYl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdWludDE2X3QgKmVlcHJvbV9idWZmOworCWludCBpLCBtYXhfbGVuLCBmaXJzdF93b3JkLCBsYXN0X3dvcmQ7CisJaW50IHJldF92YWwgPSAwOworCisJaWYoZWVwcm9tLT5sZW4gPT0gMCkgeworCQlyZXRfdmFsID0gLUVJTlZBTDsKKwkJZ290byBnZWVwcm9tX2Vycm9yOworCX0KKworCWVlcHJvbS0+bWFnaWMgPSBody0+dmVuZG9yX2lkIHwgKGh3LT5kZXZpY2VfaWQgPDwgMTYpOworCisJbWF4X2xlbiA9IGl4Z2JfZ2V0X2VlcHJvbV9sZW4obmV0ZGV2KTsKKworCWlmKGVlcHJvbS0+b2Zmc2V0ID4gZWVwcm9tLT5vZmZzZXQgKyBlZXByb20tPmxlbikgeworCQlyZXRfdmFsID0gLUVJTlZBTDsKKwkJZ290byBnZWVwcm9tX2Vycm9yOworCX0KKworCWlmKChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuKSA+IG1heF9sZW4pCisJCWVlcHJvbS0+bGVuID0gKG1heF9sZW4gLSBlZXByb20tPm9mZnNldCk7CisKKwlmaXJzdF93b3JkID0gZWVwcm9tLT5vZmZzZXQgPj4gMTsKKwlsYXN0X3dvcmQgPSAoZWVwcm9tLT5vZmZzZXQgKyBlZXByb20tPmxlbiAtIDEpID4+IDE7CisKKwllZXByb21fYnVmZiA9IGttYWxsb2Moc2l6ZW9mKHVpbnQxNl90KSAqCisJCQkobGFzdF93b3JkIC0gZmlyc3Rfd29yZCArIDEpLCBHRlBfS0VSTkVMKTsKKwlpZighZWVwcm9tX2J1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogbm90ZSB0aGUgZWVwcm9tIHdhcyBnb29kIGJlY2F1c2UgdGhlIGRyaXZlciBsb2FkZWQgKi8KKwlmb3IoaSA9IDA7IGkgPD0gKGxhc3Rfd29yZCAtIGZpcnN0X3dvcmQpOyBpKyspIHsKKwkJZWVwcm9tX2J1ZmZbaV0gPSBpeGdiX2dldF9lZXByb21fd29yZChodywgKGZpcnN0X3dvcmQgKyBpKSk7CisJfQorCisJbWVtY3B5KGJ5dGVzLCAodWludDhfdCAqKWVlcHJvbV9idWZmICsgKGVlcHJvbS0+b2Zmc2V0ICYgMSksCisJCQllZXByb20tPmxlbik7CisJa2ZyZWUoZWVwcm9tX2J1ZmYpOworCitnZWVwcm9tX2Vycm9yOgorCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgaW50CitpeGdiX3NldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdWludDhfdCAqYnl0ZXMpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXhnYl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdWludDE2X3QgKmVlcHJvbV9idWZmOworCXZvaWQgKnB0cjsKKwlpbnQgbWF4X2xlbiwgZmlyc3Rfd29yZCwgbGFzdF93b3JkOworCXVpbnQxNl90IGk7CisKKwlpZihlZXByb20tPmxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmKGVlcHJvbS0+bWFnaWMgIT0gKGh3LT52ZW5kb3JfaWQgfCAoaHctPmRldmljZV9pZCA8PCAxNikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1heF9sZW4gPSBpeGdiX2dldF9lZXByb21fbGVuKG5ldGRldik7CisKKwlpZihlZXByb20tPm9mZnNldCA+IGVlcHJvbS0+b2Zmc2V0ICsgZWVwcm9tLT5sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYoKGVlcHJvbS0+b2Zmc2V0ICsgZWVwcm9tLT5sZW4pID4gbWF4X2xlbikKKwkJZWVwcm9tLT5sZW4gPSAobWF4X2xlbiAtIGVlcHJvbS0+b2Zmc2V0KTsKKworCWZpcnN0X3dvcmQgPSBlZXByb20tPm9mZnNldCA+PiAxOworCWxhc3Rfd29yZCA9IChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuIC0gMSkgPj4gMTsKKwllZXByb21fYnVmZiA9IGttYWxsb2MobWF4X2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYoIWVlcHJvbV9idWZmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXB0ciA9ICh2b2lkICopZWVwcm9tX2J1ZmY7CisKKwlpZihlZXByb20tPm9mZnNldCAmIDEpIHsKKwkJLyogbmVlZCByZWFkL21vZGlmeS93cml0ZSBvZiBmaXJzdCBjaGFuZ2VkIEVFUFJPTSB3b3JkICovCisJCS8qIG9ubHkgdGhlIHNlY29uZCBieXRlIG9mIHRoZSB3b3JkIGlzIGJlaW5nIG1vZGlmaWVkICovCisJCWVlcHJvbV9idWZmWzBdID0gaXhnYl9yZWFkX2VlcHJvbShodywgZmlyc3Rfd29yZCk7CisJCXB0cisrOworCX0KKwlpZigoZWVwcm9tLT5vZmZzZXQgKyBlZXByb20tPmxlbikgJiAxKSB7CisJCS8qIG5lZWQgcmVhZC9tb2RpZnkvd3JpdGUgb2YgbGFzdCBjaGFuZ2VkIEVFUFJPTSB3b3JkICovCisJCS8qIG9ubHkgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHdvcmQgaXMgYmVpbmcgbW9kaWZpZWQgKi8KKwkJZWVwcm9tX2J1ZmZbbGFzdF93b3JkIC0gZmlyc3Rfd29yZF0gCisJCQk9IGl4Z2JfcmVhZF9lZXByb20oaHcsIGxhc3Rfd29yZCk7CisJfQorCisJbWVtY3B5KHB0ciwgYnl0ZXMsIGVlcHJvbS0+bGVuKTsKKwlmb3IoaSA9IDA7IGkgPD0gKGxhc3Rfd29yZCAtIGZpcnN0X3dvcmQpOyBpKyspCisJCWl4Z2Jfd3JpdGVfZWVwcm9tKGh3LCBmaXJzdF93b3JkICsgaSwgZWVwcm9tX2J1ZmZbaV0pOworCisJLyogVXBkYXRlIHRoZSBjaGVja3N1bSBvdmVyIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBFRVBST00gaWYgbmVlZGVkICovCisJaWYoZmlyc3Rfd29yZCA8PSBFRVBST01fQ0hFQ0tTVU1fUkVHKQorCQlpeGdiX3VwZGF0ZV9lZXByb21fY2hlY2tzdW0oaHcpOworCisJa2ZyZWUoZWVwcm9tX2J1ZmYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraXhnYl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQoreworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisKKwlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgIGl4Z2JfZHJpdmVyX25hbWUsIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPnZlcnNpb24sIGl4Z2JfZHJpdmVyX3ZlcnNpb24sIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sICJOL0EiLCAzMik7CisJc3RybmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldiksIDMyKTsKKwlkcnZpbmZvLT5uX3N0YXRzID0gSVhHQl9TVEFUU19MRU47CisJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSBpeGdiX2dldF9yZWdzX2xlbihuZXRkZXYpOworCWRydmluZm8tPmVlZHVtcF9sZW4gPSBpeGdiX2dldF9lZXByb21fbGVuKG5ldGRldik7Cit9CisKK3N0YXRpYyB2b2lkCitpeGdiX2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQoreworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGl4Z2JfZGVzY19yaW5nICp0eGRyID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IGl4Z2JfZGVzY19yaW5nICpyeGRyID0gJmFkYXB0ZXItPnJ4X3Jpbmc7CisKKwlyaW5nLT5yeF9tYXhfcGVuZGluZyA9IE1BWF9SWEQ7IAorCXJpbmctPnR4X21heF9wZW5kaW5nID0gTUFYX1RYRDsKKwlyaW5nLT5yeF9taW5pX21heF9wZW5kaW5nID0gMDsKKwlyaW5nLT5yeF9qdW1ib19tYXhfcGVuZGluZyA9IDA7CisJcmluZy0+cnhfcGVuZGluZyA9IHJ4ZHItPmNvdW50OworCXJpbmctPnR4X3BlbmRpbmcgPSB0eGRyLT5jb3VudDsKKwlyaW5nLT5yeF9taW5pX3BlbmRpbmcgPSAwOworCXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPSAwOworfQorCitzdGF0aWMgaW50IAoraXhnYl9zZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCXN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyAqdHhkciA9ICZhZGFwdGVyLT50eF9yaW5nOworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyAqcnhkciA9ICZhZGFwdGVyLT5yeF9yaW5nOworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyB0eF9vbGQsIHR4X25ldywgcnhfb2xkLCByeF9uZXc7CisJaW50IGVycjsKKworCXR4X29sZCA9IGFkYXB0ZXItPnR4X3Jpbmc7CisJcnhfb2xkID0gYWRhcHRlci0+cnhfcmluZzsKKworCWlmKChyaW5nLT5yeF9taW5pX3BlbmRpbmcpIHx8IChyaW5nLT5yeF9qdW1ib19wZW5kaW5nKSkgCisJCXJldHVybiAtRUlOVkFMOworCisJaWYobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKQorCQlpeGdiX2Rvd24oYWRhcHRlcixUUlVFKTsKKworCXJ4ZHItPmNvdW50ID0gbWF4KHJpbmctPnJ4X3BlbmRpbmcsKHVpbnQzMl90KU1JTl9SWEQpOworCXJ4ZHItPmNvdW50ID0gbWluKHJ4ZHItPmNvdW50LCh1aW50MzJfdClNQVhfUlhEKTsKKwlJWEdCX1JPVU5EVVAocnhkci0+Y291bnQsIElYR0JfUkVRX1JYX0RFU0NSSVBUT1JfTVVMVElQTEUpOyAKKworCXR4ZHItPmNvdW50ID0gbWF4KHJpbmctPnR4X3BlbmRpbmcsKHVpbnQzMl90KU1JTl9UWEQpOworCXR4ZHItPmNvdW50ID0gbWluKHR4ZHItPmNvdW50LCh1aW50MzJfdClNQVhfVFhEKTsKKwlJWEdCX1JPVU5EVVAodHhkci0+Y291bnQsIElYR0JfUkVRX1RYX0RFU0NSSVBUT1JfTVVMVElQTEUpOyAKKworCWlmKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgeworCQkvKiBUcnkgdG8gZ2V0IG5ldyByZXNvdXJjZXMgYmVmb3JlIGRlbGV0aW5nIG9sZCAqLworCQlpZigoZXJyID0gaXhnYl9zZXR1cF9yeF9yZXNvdXJjZXMoYWRhcHRlcikpKQorCQkJZ290byBlcnJfc2V0dXBfcng7CisJCWlmKChlcnIgPSBpeGdiX3NldHVwX3R4X3Jlc291cmNlcyhhZGFwdGVyKSkpCisJCQlnb3RvIGVycl9zZXR1cF90eDsKKworCQkvKiBzYXZlIHRoZSBuZXcsIHJlc3RvcmUgdGhlIG9sZCBpbiBvcmRlciB0byBmcmVlIGl0LAorCQkgKiB0aGVuIHJlc3RvcmUgdGhlIG5ldyBiYWNrIGFnYWluICovCisKKwkJcnhfbmV3ID0gYWRhcHRlci0+cnhfcmluZzsKKwkJdHhfbmV3ID0gYWRhcHRlci0+dHhfcmluZzsKKwkJYWRhcHRlci0+cnhfcmluZyA9IHJ4X29sZDsKKwkJYWRhcHRlci0+dHhfcmluZyA9IHR4X29sZDsKKwkJaXhnYl9mcmVlX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKKwkJaXhnYl9mcmVlX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKKwkJYWRhcHRlci0+cnhfcmluZyA9IHJ4X25ldzsKKwkJYWRhcHRlci0+dHhfcmluZyA9IHR4X25ldzsKKwkJaWYoKGVyciA9IGl4Z2JfdXAoYWRhcHRlcikpKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK2Vycl9zZXR1cF90eDoKKwlpeGdiX2ZyZWVfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOworZXJyX3NldHVwX3J4OgorCWFkYXB0ZXItPnJ4X3JpbmcgPSByeF9vbGQ7CisJYWRhcHRlci0+dHhfcmluZyA9IHR4X29sZDsKKwlpeGdiX3VwKGFkYXB0ZXIpOworCXJldHVybiBlcnI7Cit9CisKKy8qIHRvZ2dsZSBMRUQgNCB0aW1lcyBwZXIgc2Vjb25kID0gMiAiYmxpbmtzIiBwZXIgc2Vjb25kICovCisjZGVmaW5lIElYR0JfSURfSU5URVJWQUwJKEhaLzQpCisKKy8qIGJpdCBkZWZpbmVzIGZvciBhZGFwdGVyLT5sZWRfc3RhdHVzICovCisjZGVmaW5lIElYR0JfTEVEX09OCQkwCisKK3N0YXRpYyB2b2lkCitpeGdiX2xlZF9ibGlua19jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgaXhnYl9hZGFwdGVyICopZGF0YTsKKworCWlmKHRlc3RfYW5kX2NoYW5nZV9iaXQoSVhHQl9MRURfT04sICZhZGFwdGVyLT5sZWRfc3RhdHVzKSkKKwkJaXhnYl9sZWRfb2ZmKCZhZGFwdGVyLT5odyk7CisJZWxzZQorCQlpeGdiX2xlZF9vbigmYWRhcHRlci0+aHcpOworCisJbW9kX3RpbWVyKCZhZGFwdGVyLT5ibGlua190aW1lciwgamlmZmllcyArIElYR0JfSURfSU5URVJWQUwpOworfQorCitzdGF0aWMgaW50CitpeGdiX3BoeXNfaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJaWYoIWRhdGEgfHwgZGF0YSA+ICh1aW50MzJfdCkoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWikpCisJCWRhdGEgPSAodWludDMyX3QpKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopOworCisJaWYoIWFkYXB0ZXItPmJsaW5rX3RpbWVyLmZ1bmN0aW9uKSB7CisJCWluaXRfdGltZXIoJmFkYXB0ZXItPmJsaW5rX3RpbWVyKTsKKwkJYWRhcHRlci0+YmxpbmtfdGltZXIuZnVuY3Rpb24gPSBpeGdiX2xlZF9ibGlua19jYWxsYmFjazsKKwkJYWRhcHRlci0+YmxpbmtfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWFkYXB0ZXI7CisJfQorCisJbW9kX3RpbWVyKCZhZGFwdGVyLT5ibGlua190aW1lciwgamlmZmllcyk7CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWlmKGRhdGEpCisJCXNjaGVkdWxlX3RpbWVvdXQoZGF0YSAqIEhaKTsKKwllbHNlCisJCXNjaGVkdWxlX3RpbWVvdXQoTUFYX1NDSEVEVUxFX1RJTUVPVVQpOworCisJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPmJsaW5rX3RpbWVyKTsKKwlpeGdiX2xlZF9vZmYoJmFkYXB0ZXItPmh3KTsKKwljbGVhcl9iaXQoSVhHQl9MRURfT04sICZhZGFwdGVyLT5sZWRfc3RhdHVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IAoraXhnYl9nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gSVhHQl9TVEFUU19MRU47Cit9CisKK3N0YXRpYyB2b2lkIAoraXhnYl9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCAKKwkJc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1aW50NjRfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWludCBpOworCisJaXhnYl91cGRhdGVfc3RhdHMoYWRhcHRlcik7CisJZm9yKGkgPSAwOyBpIDwgSVhHQl9TVEFUU19MRU47IGkrKykgeworCQljaGFyICpwID0gKGNoYXIgKilhZGFwdGVyK2l4Z2JfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9vZmZzZXQ7CQorCQlkYXRhW2ldID0gKGl4Z2JfZ3N0cmluZ3Nfc3RhdHNbaV0uc2l6ZW9mX3N0YXQgPT0gCisJCQlzaXplb2YodWludDY0X3QpKSA/ICoodWludDY0X3QgKilwIDogKih1aW50MzJfdCAqKXA7CisJfQorfQorCitzdGF0aWMgdm9pZCAKK2l4Z2JfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3Qgc3RyaW5nc2V0LCB1aW50OF90ICpkYXRhKQoreworCWludCBpOworCisJc3dpdGNoKHN0cmluZ3NldCkgeworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQlmb3IoaT0wOyBpIDwgSVhHQl9TVEFUU19MRU47IGkrKykgeworCQkJbWVtY3B5KGRhdGEgKyBpICogRVRIX0dTVFJJTkdfTEVOLCAKKwkJCWl4Z2JfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9zdHJpbmcsCisJCQlFVEhfR1NUUklOR19MRU4pOworCQl9CisJCWJyZWFrOworCX0KK30KKworc3RydWN0IGV0aHRvb2xfb3BzIGl4Z2JfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncyA9IGl4Z2JfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBpeGdiX3NldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8gPSBpeGdiX2dldF9kcnZpbmZvLAorCS5nZXRfcmVnc19sZW4gPSBpeGdiX2dldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MgPSBpeGdiX2dldF9yZWdzLAorCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9lZXByb21fbGVuID0gaXhnYl9nZXRfZWVwcm9tX2xlbiwKKwkuZ2V0X2VlcHJvbSA9IGl4Z2JfZ2V0X2VlcHJvbSwKKwkuc2V0X2VlcHJvbSA9IGl4Z2Jfc2V0X2VlcHJvbSwKKwkuZ2V0X3JpbmdwYXJhbSA9IGl4Z2JfZ2V0X3JpbmdwYXJhbSwKKwkuc2V0X3JpbmdwYXJhbSA9IGl4Z2Jfc2V0X3JpbmdwYXJhbSwKKwkuZ2V0X3BhdXNlcGFyYW0JPSBpeGdiX2dldF9wYXVzZXBhcmFtLAorCS5zZXRfcGF1c2VwYXJhbQk9IGl4Z2Jfc2V0X3BhdXNlcGFyYW0sCisJLmdldF9yeF9jc3VtID0gaXhnYl9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0gPSBpeGdiX3NldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bSA9IGl4Z2JfZ2V0X3R4X2NzdW0sCisJLnNldF90eF9jc3VtID0gaXhnYl9zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLnNldF9zZwk9IGV0aHRvb2xfb3Bfc2V0X3NnLAorI2lmZGVmIE5FVElGX0ZfVFNPCisJLmdldF90c28gPSBldGh0b29sX29wX2dldF90c28sCisJLnNldF90c28gPSBpeGdiX3NldF90c28sCisjZW5kaWYKKwkuZ2V0X3N0cmluZ3MgPSBpeGdiX2dldF9zdHJpbmdzLAorCS5waHlzX2lkID0gaXhnYl9waHlzX2lkLAorCS5nZXRfc3RhdHNfY291bnQgPSBpeGdiX2dldF9zdGF0c19jb3VudCwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMgPSBpeGdiX2dldF9ldGh0b29sX3N0YXRzLAorfTsKKwordm9pZCBpeGdiX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZpeGdiX2V0aHRvb2xfb3BzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9ody5jIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2h3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzMjljNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9ody5jCkBAIC0wLDAgKzEsMTIwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGl4Z2JfaHcuYworICogU2hhcmVkIGZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIGFuZCBjb25maWd1cmluZyB0aGUgYWRhcHRlcgorICovCisKKyNpbmNsdWRlICJpeGdiX2h3LmgiCisjaW5jbHVkZSAiaXhnYl9pZHMuaCIKKworLyogIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHVpbnQzMl90IGl4Z2JfaGFzaF9tY19hZGRyKHN0cnVjdCBpeGdiX2h3ICpodywgdWludDhfdCAqIG1jX2FkZHIpOworCitzdGF0aWMgdm9pZCBpeGdiX210YV9zZXQoc3RydWN0IGl4Z2JfaHcgKmh3LCB1aW50MzJfdCBoYXNoX3ZhbHVlKTsKKworc3RhdGljIHZvaWQgaXhnYl9nZXRfYnVzX2luZm8oc3RydWN0IGl4Z2JfaHcgKmh3KTsKKworc3RhdGljIGJvb2xlYW5fdCBpeGdiX2xpbmtfcmVzZXQoc3RydWN0IGl4Z2JfaHcgKmh3KTsKKworc3RhdGljIHZvaWQgaXhnYl9vcHRpY3NfcmVzZXQoc3RydWN0IGl4Z2JfaHcgKmh3KTsKKworc3RhdGljIGl4Z2JfcGh5X3R5cGUgaXhnYl9pZGVudGlmeV9waHkoc3RydWN0IGl4Z2JfaHcgKmh3KTsKKwordWludDMyX3QgaXhnYl9tYWNfcmVzZXQoc3RydWN0IGl4Z2JfaHcgKmh3KTsKKwordWludDMyX3QgaXhnYl9tYWNfcmVzZXQoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IGN0cmxfcmVnOworCisJY3RybF9yZWcgPSAgSVhHQl9DVFJMMF9SU1QgfAorCQkJCUlYR0JfQ1RSTDBfU0RQM19ESVIgfCAgIC8qIEFsbCBwaW5zIGFyZSBPdXRwdXQ9MSAqLworCQkJCUlYR0JfQ1RSTDBfU0RQMl9ESVIgfAorCQkJCUlYR0JfQ1RSTDBfU0RQMV9ESVIgfAorCQkJCUlYR0JfQ1RSTDBfU0RQMF9ESVIgfAorCQkJCUlYR0JfQ1RSTDBfU0RQMwkgfCAgIC8qIEluaXRpYWwgdmFsdWUgMTEwMSAgICovCisJCQkJSVhHQl9DVFJMMF9TRFAyCSB8CisJCQkJSVhHQl9DVFJMMF9TRFAwOworCisjaWZkZWYgSFBfWlgxCisJLyogV29ya2Fyb3VuZCBmb3IgODI1OTdFWCByZXNldCBlcnJhdGEgKi8KKwlJWEdCX1dSSVRFX1JFR19JTyhodywgQ1RSTDAsIGN0cmxfcmVnKTsKKyNlbHNlCisJSVhHQl9XUklURV9SRUcoaHcsIENUUkwwLCBjdHJsX3JlZyk7CisjZW5kaWYKKworCS8qIERlbGF5IGEgZmV3IG1zIGp1c3QgdG8gYWxsb3cgdGhlIHJlc2V0IHRvIGNvbXBsZXRlICovCisJbXNlY19kZWxheShJWEdCX0RFTEFZX0FGVEVSX1JFU0VUKTsKKwljdHJsX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIENUUkwwKTsKKyNpZmRlZiBEQkcKKwkvKiBNYWtlIHN1cmUgdGhlIHNlbGYtY2xlYXJpbmcgZ2xvYmFsIHJlc2V0IGJpdCBkaWQgc2VsZiBjbGVhciAqLworCUFTU0VSVCghKGN0cmxfcmVnICYgSVhHQl9DVFJMMF9SU1QpKTsKKyNlbmRpZgorCisJaWYgKGh3LT5waHlfdHlwZSA9PSBpeGdiX3BoeV90eXBlX3R4bjE3NDAxKSB7CisJCWl4Z2Jfb3B0aWNzX3Jlc2V0KGh3KTsKKwl9CisKKwlyZXR1cm4gY3RybF9yZWc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlc2V0IHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSB1bml0czsgbWFzayBhbmQgY2xlYXIgYWxsIGludGVycnVwdHMuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2xlYW5fdAoraXhnYl9hZGFwdGVyX3N0b3Aoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IGN0cmxfcmVnOworCXVpbnQzMl90IGljcl9yZWc7CisKKwlERUJVR0ZVTkMoIml4Z2JfYWRhcHRlcl9zdG9wIik7CisKKwkvKiBJZiB3ZSBhcmUgc3RvcHBlZCBvciByZXNldHRpbmcgZXhpdCBncmFjZWZ1bGx5IGFuZCB3YWl0IHRvIGJlCisJICogc3RhcnRlZCBhZ2FpbiBiZWZvcmUgYWNjZXNzaW5nIHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlpZihody0+YWRhcHRlcl9zdG9wcGVkKSB7CisJCURFQlVHT1VUKCJFeGl0aW5nIGJlY2F1c2UgdGhlIGFkYXB0ZXIgaXMgYWxyZWFkeSBzdG9wcGVkISEhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8qIFNldCB0aGUgQWRhcHRlciBTdG9wcGVkIGZsYWcgc28gb3RoZXIgZHJpdmVyIGZ1bmN0aW9ucyBzdG9wCisJICogdG91Y2hpbmcgdGhlIEhhcmR3YXJlLgorCSAqLworCWh3LT5hZGFwdGVyX3N0b3BwZWQgPSBUUlVFOworCisJLyogQ2xlYXIgaW50ZXJydXB0IG1hc2sgdG8gc3RvcCBib2FyZCBmcm9tIGdlbmVyYXRpbmcgaW50ZXJydXB0cyAqLworCURFQlVHT1VUKCJNYXNraW5nIG9mZiBhbGwgaW50ZXJydXB0c1xuIik7CisJSVhHQl9XUklURV9SRUcoaHcsIElNQywgMHhGRkZGRkZGRik7CisKKwkvKiBEaXNhYmxlIHRoZSBUcmFuc21pdCBhbmQgUmVjZWl2ZSB1bml0cy4gIFRoZW4gZGVsYXkgdG8gYWxsb3cKKwkgKiBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMgdG8gY29tcGxldGUgYmVmb3JlIHdlIGhpdCB0aGUgTUFDIHdpdGgKKwkgKiB0aGUgZ2xvYmFsIHJlc2V0LgorCSAqLworCUlYR0JfV1JJVEVfUkVHKGh3LCBSQ1RMLCBJWEdCX1JFQURfUkVHKGh3LCBSQ1RMKSAmIH5JWEdCX1JDVExfUlhFTik7CisJSVhHQl9XUklURV9SRUcoaHcsIFRDVEwsIElYR0JfUkVBRF9SRUcoaHcsIFRDVEwpICYgfklYR0JfVENUTF9UWEVOKTsKKwltc2VjX2RlbGF5KElYR0JfREVMQVlfQkVGT1JFX1JFU0VUKTsKKworCS8qIElzc3VlIGEgZ2xvYmFsIHJlc2V0IHRvIHRoZSBNQUMuICBUaGlzIHdpbGwgcmVzZXQgdGhlIGNoaXAncworCSAqIHRyYW5zbWl0LCByZWNlaXZlLCBETUEsIGFuZCBsaW5rIHVuaXRzLiAgSXQgd2lsbCBub3QgZWZmZWN0CisJICogdGhlIGN1cnJlbnQgUENJIGNvbmZpZ3VyYXRpb24uICBUaGUgZ2xvYmFsIHJlc2V0IGJpdCBpcyBzZWxmLQorCSAqIGNsZWFyaW5nLCBhbmQgc2hvdWxkIGNsZWFyIHdpdGhpbiBhIG1pY3Jvc2Vjb25kLgorCSAqLworCURFQlVHT1VUKCJJc3N1aW5nIGEgZ2xvYmFsIHJlc2V0IHRvIE1BQ1xuIik7CisKKwljdHJsX3JlZyA9IGl4Z2JfbWFjX3Jlc2V0KGh3KTsKKworCS8qIENsZWFyIGludGVycnVwdCBtYXNrIHRvIHN0b3AgYm9hcmQgZnJvbSBnZW5lcmF0aW5nIGludGVycnVwdHMgKi8KKwlERUJVR09VVCgiTWFza2luZyBvZmYgYWxsIGludGVycnVwdHNcbiIpOworCUlYR0JfV1JJVEVfUkVHKGh3LCBJTUMsIDB4ZmZmZmZmZmYpOworCisJLyogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0IGV2ZW50cy4gKi8KKwlpY3JfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgSUNSKTsKKworCXJldHVybiAoY3RybF9yZWcgJiBJWEdCX0NUUkwwX1JTVCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSWRlbnRpZmllcyB0aGUgdmVuZG9yIG9mIHRoZSBvcHRpY3MgbW9kdWxlIG9uIHRoZSBhZGFwdGVyLiAgVGhlIFNSIGFkYXB0ZXJzCisgKiBzdXBwb3J0IHR3byBkaWZmZXJlbnQgdHlwZXMgb2YgWFBBSyBvcHRpY3MsIHNvIGl0IGlzIG5lY2Vzc2FyeSB0byBkZXRlcm1pbmUKKyAqIHdoaWNoIG9wdGljcyBhcmUgcHJlc2VudCBiZWZvcmUgYXBwbHlpbmcgYW55IG9wdGljcy1zcGVjaWZpYyB3b3JrYXJvdW5kcy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZS4KKyAqCisgKiBSZXR1cm5zOiB0aGUgdmVuZG9yIG9mIHRoZSBYUEFLIG9wdGljcyBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaXhnYl94cGFrX3ZlbmRvcgoraXhnYl9pZGVudGlmeV94cGFrX3ZlbmRvcihzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3QgaTsKKwl1aW50MTZfdCB2ZW5kb3JfbmFtZVs1XTsKKwlpeGdiX3hwYWtfdmVuZG9yIHhwYWtfdmVuZG9yOworCisJREVCVUdGVU5DKCJpeGdiX2lkZW50aWZ5X3hwYWtfdmVuZG9yIik7CisKKwkvKiBSZWFkIHRoZSBmaXJzdCBmZXcgYnl0ZXMgb2YgdGhlIHZlbmRvciBzdHJpbmcgZnJvbSB0aGUgWFBBSyBOVlIKKwkgKiByZWdpc3RlcnMuICBUaGVzZSBhcmUgc3RhbmRhcmQgWEVOUEFLL1hQQUsgcmVnaXN0ZXJzLCBzbyBhbGwgWFBBSworCSAqIGRldmljZXMgc2hvdWxkIGltcGxlbWVudCB0aGVtLiAqLworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJdmVuZG9yX25hbWVbaV0gPSBpeGdiX3JlYWRfcGh5X3JlZyhodywKKwkJCQkJCSAgIE1ESU9fUE1BX1BNRF9YUEFLX1ZFTkRPUl9OQU1FCisJCQkJCQkgICArIGksIElYR0JfUEhZX0FERFJFU1MsCisJCQkJCQkgICBNRElPX1BNQV9QTURfRElEKTsKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIGFjdHVhbCB2ZW5kb3IgKi8KKwlpZiAodmVuZG9yX25hbWVbMF0gPT0gJ0knICYmCisJICAgIHZlbmRvcl9uYW1lWzFdID09ICdOJyAmJgorCSAgICB2ZW5kb3JfbmFtZVsyXSA9PSAnVCcgJiYKKwkgICAgdmVuZG9yX25hbWVbM10gPT0gJ0UnICYmIHZlbmRvcl9uYW1lWzRdID09ICdMJykgeworCQl4cGFrX3ZlbmRvciA9IGl4Z2JfeHBha192ZW5kb3JfaW50ZWw7CisJfSBlbHNlIHsKKwkJeHBha192ZW5kb3IgPSBpeGdiX3hwYWtfdmVuZG9yX2luZmluZW9uOworCX0KKworCXJldHVybiAoeHBha192ZW5kb3IpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXRlcm1pbmUgdGhlIHBoeXNpY2FsIGxheWVyIG1vZHVsZSBvbiB0aGUgYWRhcHRlci4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZS4gIFRoZSBkZXZpY2VfaWQKKyAqICAgICAgZmllbGQgbXVzdCBiZSAoY29ycmVjdGx5KSBwb3B1bGF0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorICoKKyAqIFJldHVybnM6IHRoZSBwaHkgdHlwZSBvZiB0aGUgYWRhcHRlci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpeGdiX3BoeV90eXBlCitpeGdiX2lkZW50aWZ5X3BoeShzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJaXhnYl9waHlfdHlwZSBwaHlfdHlwZTsKKwlpeGdiX3hwYWtfdmVuZG9yIHhwYWtfdmVuZG9yOworCisJREVCVUdGVU5DKCJpeGdiX2lkZW50aWZ5X3BoeSIpOworCisJLyogSW5mZXIgdGhlIHRyYW5zY2VpdmVyL3BoeSB0eXBlIGZyb20gdGhlIGRldmljZSBpZCAqLworCXN3aXRjaCAoaHctPmRldmljZV9pZCkgeworCWNhc2UgSVhHQl9ERVZJQ0VfSURfODI1OTdFWDoKKwkJREVCVUdPVVQoIklkZW50aWZpZWQgVFhOMTc0MDEgb3B0aWNzXG4iKTsKKwkJcGh5X3R5cGUgPSBpeGdiX3BoeV90eXBlX3R4bjE3NDAxOworCQlicmVhazsKKworCWNhc2UgSVhHQl9ERVZJQ0VfSURfODI1OTdFWF9TUjoKKwkJLyogVGhlIFNSIGFkYXB0ZXJzIGNhcnJ5IHR3byBkaWZmZXJlbnQgdHlwZXMgb2YgWFBBSyBvcHRpY3MKKwkJICogbW9kdWxlczsgcmVhZCB0aGUgdmVuZG9yIGlkZW50aWZpZXIgdG8gZGV0ZXJtaW5lIHRoZSBleGFjdAorCQkgKiB0eXBlIG9mIG9wdGljcy4gKi8KKwkJeHBha192ZW5kb3IgPSBpeGdiX2lkZW50aWZ5X3hwYWtfdmVuZG9yKGh3KTsKKwkJaWYgKHhwYWtfdmVuZG9yID09IGl4Z2JfeHBha192ZW5kb3JfaW50ZWwpIHsKKwkJCURFQlVHT1VUKCJJZGVudGlmaWVkIFRYTjE3MjAxIG9wdGljc1xuIik7CisJCQlwaHlfdHlwZSA9IGl4Z2JfcGh5X3R5cGVfdHhuMTcyMDE7CisJCX0gZWxzZSB7CisJCQlERUJVR09VVCgiSWRlbnRpZmllZCBHNjAwNSBvcHRpY3NcbiIpOworCQkJcGh5X3R5cGUgPSBpeGdiX3BoeV90eXBlX2c2MDA1OworCQl9CisJCWJyZWFrOworCWNhc2UgSVhHQl9ERVZJQ0VfSURfODI1OTdFWF9MUjoKKwkJREVCVUdPVVQoIklkZW50aWZpZWQgRzYxMDQgb3B0aWNzXG4iKTsKKwkJcGh5X3R5cGUgPSBpeGdiX3BoeV90eXBlX2c2MTA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR09VVCgiVW5rbm93biBwaHlzaWNhbCBsYXllciBtb2R1bGVcbiIpOworCQlwaHlfdHlwZSA9IGl4Z2JfcGh5X3R5cGVfdW5rbm93bjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIChwaHlfdHlwZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBlcmZvcm1zIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGFkYXB0ZXIuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZXNldHMgdGhlIGNvbnRyb2xsZXIuCisgKiBSZWFkcyBhbmQgdmFsaWRhdGVzIHRoZSBFRVBST00uCisgKiBJbml0aWFsaXplcyB0aGUgcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVycy4KKyAqIEluaXRpYWxpemVzIHRoZSBtdWx0aWNhc3QgdGFibGUuCisgKiBDbGVhcnMgYWxsIG9uLWNoaXAgY291bnRlcnMuCisgKiBDYWxscyByb3V0aW5lIHRvIHNldHVwIGZsb3cgY29udHJvbCBzZXR0aW5ncy4KKyAqIExlYXZlcyB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHMgZGlzYWJsZWQgYW5kIHVuaW5pdGlhbGl6ZWQuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgVFJVRSBpZiBzdWNjZXNzZnVsLAorICogICAgICBGQUxTRSBpZiB1bnJlY292ZXJhYmxlIHByb2JsZW1zIHdlcmUgZW5jb3VudGVyZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sZWFuX3QKK2l4Z2JfaW5pdF9odyhzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3QgaTsKKwl1aW50MzJfdCBjdHJsX3JlZzsKKwlib29sZWFuX3Qgc3RhdHVzOworCisJREVCVUdGVU5DKCJpeGdiX2luaXRfaHciKTsKKworCS8qIElzc3VlIGEgZ2xvYmFsIHJlc2V0IHRvIHRoZSBNQUMuICBUaGlzIHdpbGwgcmVzZXQgdGhlIGNoaXAncworCSAqIHRyYW5zbWl0LCByZWNlaXZlLCBETUEsIGFuZCBsaW5rIHVuaXRzLiAgSXQgd2lsbCBub3QgZWZmZWN0CisJICogdGhlIGN1cnJlbnQgUENJIGNvbmZpZ3VyYXRpb24uICBUaGUgZ2xvYmFsIHJlc2V0IGJpdCBpcyBzZWxmLQorCSAqIGNsZWFyaW5nLCBhbmQgc2hvdWxkIGNsZWFyIHdpdGhpbiBhIG1pY3Jvc2Vjb25kLgorCSAqLworCURFQlVHT1VUKCJJc3N1aW5nIGEgZ2xvYmFsIHJlc2V0IHRvIE1BQ1xuIik7CisKKwljdHJsX3JlZyA9IGl4Z2JfbWFjX3Jlc2V0KGh3KTsKKworCURFQlVHT1VUKCJJc3N1aW5nIGFuIEVFIHJlc2V0IHRvIE1BQ1xuIik7CisjaWZkZWYgSFBfWlgxCisJLyogV29ya2Fyb3VuZCBmb3IgODI1OTdFWCByZXNldCBlcnJhdGEgKi8KKwlJWEdCX1dSSVRFX1JFR19JTyhodywgQ1RSTDEsIElYR0JfQ1RSTDFfRUVfUlNUKTsKKyNlbHNlCisJSVhHQl9XUklURV9SRUcoaHcsIENUUkwxLCBJWEdCX0NUUkwxX0VFX1JTVCk7CisjZW5kaWYKKworCS8qIERlbGF5IGEgZmV3IG1zIGp1c3QgdG8gYWxsb3cgdGhlIHJlc2V0IHRvIGNvbXBsZXRlICovCisJbXNlY19kZWxheShJWEdCX0RFTEFZX0FGVEVSX0VFX1JFU0VUKTsKKworCWlmIChpeGdiX2dldF9lZXByb21fZGF0YShodykgPT0gRkFMU0UpIHsKKwkJcmV0dXJuKEZBTFNFKTsKKwl9CisKKwkvKiBVc2UgdGhlIGRldmljZSBpZCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgcGh5L3RyYW5zY2VpdmVyLiAqLworCWh3LT5kZXZpY2VfaWQgPSBpeGdiX2dldF9lZV9kZXZpY2VfaWQoaHcpOworCWh3LT5waHlfdHlwZSA9IGl4Z2JfaWRlbnRpZnlfcGh5KGh3KTsKKworCS8qIFNldHVwIHRoZSByZWNlaXZlIGFkZHJlc3Nlcy4KKwkgKiBSZWNlaXZlIEFkZHJlc3MgUmVnaXN0ZXJzIChSQVJzIDAgLSAxNSkuCisJICovCisJaXhnYl9pbml0X3J4X2FkZHJzKGh3KTsKKworCS8qCisJICogQ2hlY2sgdGhhdCBhIHZhbGlkIE1BQyBhZGRyZXNzIGhhcyBiZWVuIHNldC4KKwkgKiBJZiBpdCBpcyBub3QgdmFsaWQsIHdlIGZhaWwgaGFyZHdhcmUgaW5pdC4KKwkgKi8KKwlpZiAoIW1hY19hZGRyX3ZhbGlkKGh3LT5jdXJyX21hY19hZGRyKSkgeworCQlERUJVR09VVCgiTUFDIGFkZHJlc3MgaW52YWxpZCBhZnRlciBpeGdiX2luaXRfcnhfYWRkcnNcbiIpOworCQlyZXR1cm4oRkFMU0UpOworCX0KKworCS8qIHRlbGwgdGhlIHJvdXRpbmVzIGluIHRoaXMgZmlsZSB0aGV5IGNhbiBhY2Nlc3MgaGFyZHdhcmUgYWdhaW4gKi8KKwlody0+YWRhcHRlcl9zdG9wcGVkID0gRkFMU0U7CisKKwkvKiBGaWxsIGluIHRoZSBidXNfaW5mbyBzdHJ1Y3R1cmUgKi8KKwlpeGdiX2dldF9idXNfaW5mbyhodyk7CisKKwkvKiBaZXJvIG91dCB0aGUgTXVsdGljYXN0IEhBU0ggdGFibGUgKi8KKwlERUJVR09VVCgiWmVyb2luZyB0aGUgTVRBXG4iKTsKKwlmb3IoaSA9IDA7IGkgPCBJWEdCX01DX1RCTF9TSVpFOyBpKyspCisJCUlYR0JfV1JJVEVfUkVHX0FSUkFZKGh3LCBNVEEsIGksIDApOworCisJLyogWmVybyBvdXQgdGhlIFZMQU4gRmlsdGVyIFRhYmxlIEFycmF5ICovCisJaXhnYl9jbGVhcl92ZnRhKGh3KTsKKworCS8qIFplcm8gYWxsIG9mIHRoZSBoYXJkd2FyZSBjb3VudGVycyAqLworCWl4Z2JfY2xlYXJfaHdfY250cnMoaHcpOworCisJLyogQ2FsbCBhIHN1YnJvdXRpbmUgdG8gc2V0dXAgZmxvdyBjb250cm9sLiAqLworCXN0YXR1cyA9IGl4Z2Jfc2V0dXBfZmMoaHcpOworCisJLyogODI1OTdFWCBlcnJhdGE6IENhbGwgY2hlY2stZm9yLWxpbmsgaW4gY2FzZSBsYW5lIGRlc2tldyBpcyBsb2NrZWQgKi8KKwlpeGdiX2NoZWNrX2Zvcl9saW5rKGh3KTsKKworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5pdGlhbGl6ZXMgcmVjZWl2ZSBhZGRyZXNzIGZpbHRlcnMuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBQbGFjZXMgdGhlIE1BQyBhZGRyZXNzIGluIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlciAwIGFuZCBjbGVhcnMgdGhlIHJlc3QKKyAqIG9mIHRoZSByZWNlaXZlIGFkZHJlc3NzIHJlZ2lzdGVycy4gQ2xlYXJzIHRoZSBtdWx0aWNhc3QgdGFibGUuIEFzc3VtZXMKKyAqIHRoZSByZWNlaXZlciBpcyBpbiByZXNldCB3aGVuIHRoZSByb3V0aW5lIGlzIGNhbGxlZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l4Z2JfaW5pdF9yeF9hZGRycyhzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3QgaTsKKworCURFQlVHRlVOQygiaXhnYl9pbml0X3J4X2FkZHJzIik7CisKKwkvKgorCSAqIElmIHRoZSBjdXJyZW50IG1hYyBhZGRyZXNzIGlzIHZhbGlkLCBhc3N1bWUgaXQgaXMgYSBzb2Z0d2FyZSBvdmVycmlkZQorCSAqIHRvIHRoZSBwZXJtYW5lbnQgYWRkcmVzcy4KKwkgKiBPdGhlcndpc2UsIHVzZSB0aGUgcGVybWFuZW50IGFkZHJlc3MgZnJvbSB0aGUgZWVwcm9tLgorCSAqLworCWlmICghbWFjX2FkZHJfdmFsaWQoaHctPmN1cnJfbWFjX2FkZHIpKSB7CisKKwkJLyogR2V0IHRoZSBNQUMgYWRkcmVzcyBmcm9tIHRoZSBlZXByb20gZm9yIGxhdGVyIHJlZmVyZW5jZSAqLworCQlpeGdiX2dldF9lZV9tYWNfYWRkcihodywgaHctPmN1cnJfbWFjX2FkZHIpOworCisJCURFQlVHT1VUMygiIEtlZXBpbmcgUGVybWFuZW50IE1BQyBBZGRyID0lLjJYICUuMlggJS4yWCAiLAorCQkJICBody0+Y3Vycl9tYWNfYWRkclswXSwKKwkJCSAgaHctPmN1cnJfbWFjX2FkZHJbMV0sIGh3LT5jdXJyX21hY19hZGRyWzJdKTsKKwkJREVCVUdPVVQzKCIlLjJYICUuMlggJS4yWFxuIiwKKwkJCSAgaHctPmN1cnJfbWFjX2FkZHJbM10sCisJCQkgIGh3LT5jdXJyX21hY19hZGRyWzRdLCBody0+Y3Vycl9tYWNfYWRkcls1XSk7CisJfSBlbHNlIHsKKworCQkvKiBTZXR1cCB0aGUgcmVjZWl2ZSBhZGRyZXNzLiAqLworCQlERUJVR09VVCgiT3ZlcnJpZGluZyBNQUMgQWRkcmVzcyBpbiBSQVJbMF1cbiIpOworCQlERUJVR09VVDMoIiBOZXcgTUFDIEFkZHIgPSUuMlggJS4yWCAlLjJYICIsCisJCQkgIGh3LT5jdXJyX21hY19hZGRyWzBdLAorCQkJICBody0+Y3Vycl9tYWNfYWRkclsxXSwgaHctPmN1cnJfbWFjX2FkZHJbMl0pOworCQlERUJVR09VVDMoIiUuMlggJS4yWCAlLjJYXG4iLAorCQkJICBody0+Y3Vycl9tYWNfYWRkclszXSwKKwkJCSAgaHctPmN1cnJfbWFjX2FkZHJbNF0sIGh3LT5jdXJyX21hY19hZGRyWzVdKTsKKworCQlpeGdiX3Jhcl9zZXQoaHcsIGh3LT5jdXJyX21hY19hZGRyLCAwKTsKKwl9CisKKwkvKiBaZXJvIG91dCB0aGUgb3RoZXIgMTUgcmVjZWl2ZSBhZGRyZXNzZXMuICovCisJREVCVUdPVVQoIkNsZWFyaW5nIFJBUlsxLTE1XVxuIik7CisJZm9yKGkgPSAxOyBpIDwgSVhHQl9SQVJfRU5UUklFUzsgaSsrKSB7CisJCUlYR0JfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgKGkgPDwgMSksIDApOworCQlJWEdCX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaSA8PCAxKSArIDEpLCAwKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVwZGF0ZXMgdGhlIE1BQydzIGxpc3Qgb2YgbXVsdGljYXN0IGFkZHJlc3Nlcy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogbWNfYWRkcl9saXN0IC0gdGhlIGxpc3Qgb2YgbmV3IG11bHRpY2FzdCBhZGRyZXNzZXMKKyAqIG1jX2FkZHJfY291bnQgLSBudW1iZXIgb2YgYWRkcmVzc2VzCisgKiBwYWQgLSBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiBhZGRyZXNzZXMgaW4gdGhlIGxpc3QKKyAqCisgKiBUaGUgZ2l2ZW4gbGlzdCByZXBsYWNlcyBhbnkgZXhpc3RpbmcgbGlzdC4gQ2xlYXJzIHRoZSBsYXN0IDE1IHJlY2VpdmUKKyAqIGFkZHJlc3MgcmVnaXN0ZXJzIGFuZCB0aGUgbXVsdGljYXN0IHRhYmxlLiBVc2VzIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlcnMKKyAqIGZvciB0aGUgZmlyc3QgMTUgbXVsdGljYXN0IGFkZHJlc3NlcywgYW5kIGhhc2hlcyB0aGUgcmVzdCBpbnRvIHRoZQorICogbXVsdGljYXN0IHRhYmxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAoraXhnYl9tY19hZGRyX2xpc3RfdXBkYXRlKHN0cnVjdCBpeGdiX2h3ICpodywKKwkJCSAgdWludDhfdCAqbWNfYWRkcl9saXN0LAorCQkJICB1aW50MzJfdCBtY19hZGRyX2NvdW50LAorCQkJICB1aW50MzJfdCBwYWQpCit7CisJdWludDMyX3QgaGFzaF92YWx1ZTsKKwl1aW50MzJfdCBpOworCXVpbnQzMl90IHJhcl91c2VkX2NvdW50ID0gMTsJCS8qIFJBUlswXSBpcyB1c2VkIGZvciBvdXIgTUFDIGFkZHJlc3MgKi8KKworCURFQlVHRlVOQygiaXhnYl9tY19hZGRyX2xpc3RfdXBkYXRlIik7CisKKwkvKiBTZXQgdGhlIG5ldyBudW1iZXIgb2YgTUMgYWRkcmVzc2VzIHRoYXQgd2UgYXJlIGJlaW5nIHJlcXVlc3RlZCB0byB1c2UuICovCisJaHctPm51bV9tY19hZGRycyA9IG1jX2FkZHJfY291bnQ7CisKKwkvKiBDbGVhciBSQVJbMS0xNV0gKi8KKwlERUJVR09VVCgiIENsZWFyaW5nIFJBUlsxLTE1XVxuIik7CisJZm9yKGkgPSByYXJfdXNlZF9jb3VudDsgaSA8IElYR0JfUkFSX0VOVFJJRVM7IGkrKykgeworCQlJWEdCX1dSSVRFX1JFR19BUlJBWShodywgUkEsIChpIDw8IDEpLCAwKTsKKwkJSVhHQl9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAoKGkgPDwgMSkgKyAxKSwgMCk7CisJfQorCisJLyogQ2xlYXIgdGhlIE1UQSAqLworCURFQlVHT1VUKCIgQ2xlYXJpbmcgTVRBXG4iKTsKKwlmb3IoaSA9IDA7IGkgPCBJWEdCX01DX1RCTF9TSVpFOyBpKyspIHsKKwkJSVhHQl9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgaSwgMCk7CisJfQorCisJLyogQWRkIHRoZSBuZXcgYWRkcmVzc2VzICovCisJZm9yKGkgPSAwOyBpIDwgbWNfYWRkcl9jb3VudDsgaSsrKSB7CisJCURFQlVHT1VUKCIgQWRkaW5nIHRoZSBtdWx0aWNhc3QgYWRkcmVzc2VzOlxuIik7CisJCURFQlVHT1VUNygiIE1DIEFkZHIgIyVkID0lLjJYICUuMlggJS4yWCAlLjJYICUuMlggJS4yWFxuIiwgaSwKKwkJCSAgbWNfYWRkcl9saXN0W2kgKiAoSVhHQl9FVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpXSwKKwkJCSAgbWNfYWRkcl9saXN0W2kgKiAoSVhHQl9FVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpICsKKwkJCQkgICAgICAgMV0sCisJCQkgIG1jX2FkZHJfbGlzdFtpICogKElYR0JfRVRIX0xFTkdUSF9PRl9BRERSRVNTICsgcGFkKSArCisJCQkJICAgICAgIDJdLAorCQkJICBtY19hZGRyX2xpc3RbaSAqIChJWEdCX0VUSF9MRU5HVEhfT0ZfQUREUkVTUyArIHBhZCkgKworCQkJCSAgICAgICAzXSwKKwkJCSAgbWNfYWRkcl9saXN0W2kgKiAoSVhHQl9FVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpICsKKwkJCQkgICAgICAgNF0sCisJCQkgIG1jX2FkZHJfbGlzdFtpICogKElYR0JfRVRIX0xFTkdUSF9PRl9BRERSRVNTICsgcGFkKSArCisJCQkJICAgICAgIDVdKTsKKworCQkvKiBQbGFjZSB0aGlzIG11bHRpY2FzdCBhZGRyZXNzIGluIHRoZSBSQVIgaWYgdGhlcmUgaXMgcm9vbSwgKgorCQkgKiBlbHNlIHB1dCBpdCBpbiB0aGUgTVRBCisJCSAqLworCQlpZihyYXJfdXNlZF9jb3VudCA8IElYR0JfUkFSX0VOVFJJRVMpIHsKKwkJCWl4Z2JfcmFyX3NldChodywKKwkJCQkgICAgIG1jX2FkZHJfbGlzdCArCisJCQkJICAgICAoaSAqIChJWEdCX0VUSF9MRU5HVEhfT0ZfQUREUkVTUyArIHBhZCkpLAorCQkJCSAgICAgcmFyX3VzZWRfY291bnQpOworCQkJREVCVUdPVVQxKCJBZGRlZCBhIG11bHRpY2FzdCBhZGRyZXNzIHRvIFJBUlslZF1cbiIsIGkpOworCQkJcmFyX3VzZWRfY291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCWhhc2hfdmFsdWUgPSBpeGdiX2hhc2hfbWNfYWRkcihodywKKwkJCQkJCSAgICAgICBtY19hZGRyX2xpc3QgKworCQkJCQkJICAgICAgIChpICoKKwkJCQkJCQkoSVhHQl9FVEhfTEVOR1RIX09GX0FERFJFU1MKKwkJCQkJCQkgKyBwYWQpKSk7CisKKwkJCURFQlVHT1VUMSgiIEhhc2ggdmFsdWUgPSAweCUwM1hcbiIsIGhhc2hfdmFsdWUpOworCisJCQlpeGdiX210YV9zZXQoaHcsIGhhc2hfdmFsdWUpOworCQl9CisJfQorCisJREVCVUdPVVQoIk1DIFVwZGF0ZSBDb21wbGV0ZVxuIik7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIYXNoZXMgYW4gYWRkcmVzcyB0byBkZXRlcm1pbmUgaXRzIGxvY2F0aW9uIGluIHRoZSBtdWx0aWNhc3QgdGFibGUKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogbWNfYWRkciAtIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyB0byBoYXNoCisgKgorICogUmV0dXJuczoKKyAqICAgICAgVGhlIGhhc2ggdmFsdWUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1aW50MzJfdAoraXhnYl9oYXNoX21jX2FkZHIoc3RydWN0IGl4Z2JfaHcgKmh3LAorCQkgICB1aW50OF90ICptY19hZGRyKQoreworCXVpbnQzMl90IGhhc2hfdmFsdWUgPSAwOworCisJREVCVUdGVU5DKCJpeGdiX2hhc2hfbWNfYWRkciIpOworCisJLyogVGhlIHBvcnRpb24gb2YgdGhlIGFkZHJlc3MgdGhhdCBpcyB1c2VkIGZvciB0aGUgaGFzaCB0YWJsZSBpcworCSAqIGRldGVybWluZWQgYnkgdGhlIG1jX2ZpbHRlcl90eXBlIHNldHRpbmcuCisJICovCisJc3dpdGNoIChody0+bWNfZmlsdGVyX3R5cGUpIHsKKwkJLyogWzBdIFsxXSBbMl0gWzNdIFs0XSBbNV0KKwkJICogMDEgIEFBICAwMCAgMTIgIDM0ICA1NgorCQkgKiBMU0IgICAgICAgICAgICAgICAgIE1TQiAtIEFjY29yZGluZyB0byBIL1cgZG9jcyAqLworCWNhc2UgMDoKKwkJLyogWzQ3OjM2XSBpLmUuIDB4NTYzIGZvciBhYm92ZSBleGFtcGxlIGFkZHJlc3MgKi8KKwkJaGFzaF92YWx1ZSA9CisJCSAgICAoKG1jX2FkZHJbNF0gPj4gNCkgfCAoKCh1aW50MTZfdCkgbWNfYWRkcls1XSkgPDwgNCkpOworCQlicmVhazsKKwljYXNlIDE6CQkvKiBbNDY6MzVdIGkuZS4gMHhBQzYgZm9yIGFib3ZlIGV4YW1wbGUgYWRkcmVzcyAqLworCQloYXNoX3ZhbHVlID0KKwkJICAgICgobWNfYWRkcls0XSA+PiAzKSB8ICgoKHVpbnQxNl90KSBtY19hZGRyWzVdKSA8PCA1KSk7CisJCWJyZWFrOworCWNhc2UgMjoJCS8qIFs0NTozNF0gaS5lLiAweDVEOCBmb3IgYWJvdmUgZXhhbXBsZSBhZGRyZXNzICovCisJCWhhc2hfdmFsdWUgPQorCQkgICAgKChtY19hZGRyWzRdID4+IDIpIHwgKCgodWludDE2X3QpIG1jX2FkZHJbNV0pIDw8IDYpKTsKKwkJYnJlYWs7CisJY2FzZSAzOgkJLyogWzQzOjMyXSBpLmUuIDB4NjM0IGZvciBhYm92ZSBleGFtcGxlIGFkZHJlc3MgKi8KKwkJaGFzaF92YWx1ZSA9ICgobWNfYWRkcls0XSkgfCAoKCh1aW50MTZfdCkgbWNfYWRkcls1XSkgPDwgOCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBJbnZhbGlkIG1jX2ZpbHRlcl90eXBlLCB3aGF0IHNob3VsZCB3ZSBkbz8gKi8KKwkJREVCVUdPVVQoIk1DIGZpbHRlciB0eXBlIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CisJCUFTU0VSVCgwKTsKKwkJYnJlYWs7CisJfQorCisJaGFzaF92YWx1ZSAmPSAweEZGRjsKKwlyZXR1cm4gKGhhc2hfdmFsdWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZXRzIHRoZSBiaXQgaW4gdGhlIG11bHRpY2FzdCB0YWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBoYXNoIHZhbHVlLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBoYXNoX3ZhbHVlIC0gTXVsdGljYXN0IGFkZHJlc3MgaGFzaCB2YWx1ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2l4Z2JfbXRhX3NldChzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCSAgdWludDMyX3QgaGFzaF92YWx1ZSkKK3sKKwl1aW50MzJfdCBoYXNoX2JpdCwgaGFzaF9yZWc7CisJdWludDMyX3QgbXRhX3JlZzsKKworCS8qIFRoZSBNVEEgaXMgYSByZWdpc3RlciBhcnJheSBvZiAxMjggMzItYml0IHJlZ2lzdGVycy4KKwkgKiBJdCBpcyB0cmVhdGVkIGxpa2UgYW4gYXJyYXkgb2YgNDA5NiBiaXRzLiAgV2Ugd2FudCB0byBzZXQKKwkgKiBiaXQgQml0QXJyYXlbaGFzaF92YWx1ZV0uIFNvIHdlIGZpZ3VyZSBvdXQgd2hhdCByZWdpc3RlcgorCSAqIHRoZSBiaXQgaXMgaW4sIHJlYWQgaXQsIE9SIGluIHRoZSBuZXcgYml0LCB0aGVuIHdyaXRlCisJICogYmFjayB0aGUgbmV3IHZhbHVlLiAgVGhlIHJlZ2lzdGVyIGlzIGRldGVybWluZWQgYnkgdGhlCisJICogdXBwZXIgNyBiaXRzIG9mIHRoZSBoYXNoIHZhbHVlIGFuZCB0aGUgYml0IHdpdGhpbiB0aGF0CisJICogcmVnaXN0ZXIgYXJlIGRldGVybWluZWQgYnkgdGhlIGxvd2VyIDUgYml0cyBvZiB0aGUgdmFsdWUuCisJICovCisJaGFzaF9yZWcgPSAoaGFzaF92YWx1ZSA+PiA1KSAmIDB4N0Y7CisJaGFzaF9iaXQgPSBoYXNoX3ZhbHVlICYgMHgxRjsKKworCW10YV9yZWcgPSBJWEdCX1JFQURfUkVHX0FSUkFZKGh3LCBNVEEsIGhhc2hfcmVnKTsKKworCW10YV9yZWcgfD0gKDEgPDwgaGFzaF9iaXQpOworCisJSVhHQl9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgaGFzaF9yZWcsIG10YV9yZWcpOworCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQdXRzIGFuIGV0aGVybmV0IGFkZHJlc3MgaW50byBhIHJlY2VpdmUgYWRkcmVzcyByZWdpc3Rlci4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogYWRkciAtIEFkZHJlc3MgdG8gcHV0IGludG8gcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyCisgKiBpbmRleCAtIFJlY2VpdmUgYWRkcmVzcyByZWdpc3RlciB0byB3cml0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAoraXhnYl9yYXJfc2V0KHN0cnVjdCBpeGdiX2h3ICpodywKKwkJICB1aW50OF90ICphZGRyLAorCQkgIHVpbnQzMl90IGluZGV4KQoreworCXVpbnQzMl90IHJhcl9sb3csIHJhcl9oaWdoOworCisJREVCVUdGVU5DKCJpeGdiX3Jhcl9zZXQiKTsKKworCS8qIEhXIGV4cGVjdHMgdGhlc2UgaW4gbGl0dGxlIGVuZGlhbiBzbyB3ZSByZXZlcnNlIHRoZSBieXRlIG9yZGVyCisJICogZnJvbSBuZXR3b3JrIG9yZGVyIChiaWcgZW5kaWFuKSB0byBsaXR0bGUgZW5kaWFuCisJICovCisJcmFyX2xvdyA9ICgodWludDMyX3QpIGFkZHJbMF0gfAorCQkgICAoKHVpbnQzMl90KWFkZHJbMV0gPDwgOCkgfAorCQkgICAoKHVpbnQzMl90KWFkZHJbMl0gPDwgMTYpIHwKKwkJICAgKCh1aW50MzJfdClhZGRyWzNdIDw8IDI0KSk7CisKKwlyYXJfaGlnaCA9ICgodWludDMyX3QpIGFkZHJbNF0gfAorCQkJKCh1aW50MzJfdClhZGRyWzVdIDw8IDgpIHwKKwkJCUlYR0JfUkFIX0FWKTsKKworCUlYR0JfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgKGluZGV4IDw8IDEpLCByYXJfbG93KTsKKwlJWEdCX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaW5kZXggPDwgMSkgKyAxKSwgcmFyX2hpZ2gpOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV3JpdGVzIGEgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBvZmZzZXQgaW4gdGhlIFZMQU4gZmlsdGVyIHRhYmxlLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBvZmZzZXQgLSBPZmZzZXQgaW4gVkxBTiBmaWxlciB0YWJsZSB0byB3cml0ZQorICogdmFsdWUgLSBWYWx1ZSB0byB3cml0ZSBpbnRvIFZMQU4gZmlsdGVyIHRhYmxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitpeGdiX3dyaXRlX3ZmdGEoc3RydWN0IGl4Z2JfaHcgKmh3LAorCQkgdWludDMyX3Qgb2Zmc2V0LAorCQkgdWludDMyX3QgdmFsdWUpCit7CisJSVhHQl9XUklURV9SRUdfQVJSQVkoaHcsIFZGVEEsIG9mZnNldCwgdmFsdWUpOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2xlYXJzIHRoZSBWTEFOIGZpbGVyIHRhYmxlCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l4Z2JfY2xlYXJfdmZ0YShzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3Qgb2Zmc2V0OworCisJZm9yKG9mZnNldCA9IDA7IG9mZnNldCA8IElYR0JfVkxBTl9GSUxURVJfVEJMX1NJWkU7IG9mZnNldCsrKQorCQlJWEdCX1dSSVRFX1JFR19BUlJBWShodywgVkZUQSwgb2Zmc2V0LCAwKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbmZpZ3VyZXMgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncyBiYXNlZCBvbiBTVyBjb25maWd1cmF0aW9uLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2Jvb2xlYW5fdAoraXhnYl9zZXR1cF9mYyhzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3QgY3RybF9yZWc7CisJdWludDMyX3QgcGFwX3JlZyA9IDA7ICAgLyogYnkgZGVmYXVsdCwgYXNzdW1lIG5vIHBhdXNlIHRpbWUgKi8KKwlib29sZWFuX3Qgc3RhdHVzID0gVFJVRTsKKworCURFQlVHRlVOQygiaXhnYl9zZXR1cF9mYyIpOworCisJLyogR2V0IHRoZSBjdXJyZW50IGNvbnRyb2wgcmVnIDAgc2V0dGluZ3MgKi8KKwljdHJsX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIENUUkwwKTsKKworCS8qIENsZWFyIHRoZSBSZWNlaXZlIFBhdXNlIEVuYWJsZSBhbmQgVHJhbnNtaXQgUGF1c2UgRW5hYmxlIGJpdHMgKi8KKwljdHJsX3JlZyAmPSB+KElYR0JfQ1RSTDBfUlBFIHwgSVhHQl9DVFJMMF9UUEUpOworCisJLyogVGhlIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgImZsb3dfY29udHJvbCIgcGFyYW1ldGVyIGFyZToKKwkgKiAgICAgIDA6ICBGbG93IGNvbnRyb2wgaXMgY29tcGxldGVseSBkaXNhYmxlZAorCSAqICAgICAgMTogIFJ4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gcmVjZWl2ZSBwYXVzZSBmcmFtZXMKKwkgKiAgICAgICAgICBidXQgbm90IHNlbmQgcGF1c2UgZnJhbWVzKS4KKwkgKiAgICAgIDI6ICBUeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHNlbmQgcGF1c2UgZnJhbWVzCisJICogICAgICAgICAgYnV0IHdlIGRvIG5vdCBzdXBwb3J0IHJlY2VpdmluZyBwYXVzZSBmcmFtZXMpLgorCSAqICAgICAgMzogIEJvdGggUnggYW5kIFRYIGZsb3cgY29udHJvbCAoc3ltbWV0cmljKSBhcmUgZW5hYmxlZC4KKwkgKiAgb3RoZXI6ICBJbnZhbGlkLgorCSAqLworCXN3aXRjaCAoaHctPmZjLnR5cGUpIHsKKwljYXNlIGl4Z2JfZmNfbm9uZToJLyogMCAqLworCQkvKiBTZXQgQ01EQyBiaXQgdG8gZGlzYWJsZSBSeCBGbG93IGNvbnRyb2wgKi8KKwkJY3RybF9yZWcgfD0gKElYR0JfQ1RSTDBfQ01EQyk7CisJCWJyZWFrOworCWNhc2UgaXhnYl9mY19yeF9wYXVzZToJLyogMSAqLworCQkvKiBSWCBGbG93IGNvbnRyb2wgaXMgZW5hYmxlZCwgYW5kIFRYIEZsb3cgY29udHJvbCBpcworCQkgKiBkaXNhYmxlZC4KKwkJICovCisJCWN0cmxfcmVnIHw9IChJWEdCX0NUUkwwX1JQRSk7CisJCWJyZWFrOworCWNhc2UgaXhnYl9mY190eF9wYXVzZToJLyogMiAqLworCQkvKiBUWCBGbG93IGNvbnRyb2wgaXMgZW5hYmxlZCwgYW5kIFJYIEZsb3cgY29udHJvbCBpcworCQkgKiBkaXNhYmxlZCwgYnkgYSBzb2Z0d2FyZSBvdmVyLXJpZGUuCisJCSAqLworCQljdHJsX3JlZyB8PSAoSVhHQl9DVFJMMF9UUEUpOworCQlwYXBfcmVnID0gaHctPmZjLnBhdXNlX3RpbWU7CisJCWJyZWFrOworCWNhc2UgaXhnYl9mY19mdWxsOgkvKiAzICovCisJCS8qIEZsb3cgY29udHJvbCAoYm90aCBSWCBhbmQgVFgpIGlzIGVuYWJsZWQgYnkgYSBzb2Z0d2FyZQorCQkgKiBvdmVyLXJpZGUuCisJCSAqLworCQljdHJsX3JlZyB8PSAoSVhHQl9DVFJMMF9SUEUgfCBJWEdCX0NUUkwwX1RQRSk7CisJCXBhcF9yZWcgPSBody0+ZmMucGF1c2VfdGltZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLiAgVGhlIHZhbHVlIHNob3VsZCBiZSAwLTMuICovCisJCURFQlVHT1VUKCJGbG93IGNvbnRyb2wgcGFyYW0gc2V0IGluY29ycmVjdGx5XG4iKTsKKwkJQVNTRVJUKDApOworCQlicmVhazsKKwl9CisKKwkvKiBXcml0ZSB0aGUgbmV3IHNldHRpbmdzICovCisJSVhHQl9XUklURV9SRUcoaHcsIENUUkwwLCBjdHJsX3JlZyk7CisKKwlpZiAocGFwX3JlZyAhPSAwKSB7CisJCUlYR0JfV1JJVEVfUkVHKGh3LCBQQVAsIHBhcF9yZWcpOworCX0KKworCS8qIFNldCB0aGUgZmxvdyBjb250cm9sIHJlY2VpdmUgdGhyZXNob2xkIHJlZ2lzdGVycy4gIE5vcm1hbGx5LAorCSAqIHRoZXNlIHJlZ2lzdGVycyB3aWxsIGJlIHNldCB0byBhIGRlZmF1bHQgdGhyZXNob2xkIHRoYXQgbWF5IGJlCisJICogYWRqdXN0ZWQgbGF0ZXIgYnkgdGhlIGRyaXZlcidzIHJ1bnRpbWUgY29kZS4gIEhvd2V2ZXIsIGlmIHRoZQorCSAqIGFiaWxpdHkgdG8gdHJhbnNtaXQgcGF1c2UgZnJhbWVzIGluIG5vdCBlbmFibGVkLCB0aGVuIHRoZXNlCisJICogcmVnaXN0ZXJzIHdpbGwgYmUgc2V0IHRvIDAuCisJICovCisJaWYoIShody0+ZmMudHlwZSAmIGl4Z2JfZmNfdHhfcGF1c2UpKSB7CisJCUlYR0JfV1JJVEVfUkVHKGh3LCBGQ1JUTCwgMCk7CisJCUlYR0JfV1JJVEVfUkVHKGh3LCBGQ1JUSCwgMCk7CisJfSBlbHNlIHsKKwkgICAvKiBXZSBuZWVkIHRvIHNldCB1cCB0aGUgUmVjZWl2ZSBUaHJlc2hvbGQgaGlnaCBhbmQgbG93IHdhdGVyCisJICAgICogbWFya3MgYXMgd2VsbCBhcyAob3B0aW9uYWxseSkgZW5hYmxpbmcgdGhlIHRyYW5zbWlzc2lvbiBvZiBYT04KKwkgICAgKiBmcmFtZXMuICovCisJCWlmKGh3LT5mYy5zZW5kX3hvbikgeworCQkJSVhHQl9XUklURV9SRUcoaHcsIEZDUlRMLAorCQkJCShody0+ZmMubG93X3dhdGVyIHwgSVhHQl9GQ1JUTF9YT05FKSk7CisJCX0gZWxzZSB7CisJCQlJWEdCX1dSSVRFX1JFRyhodywgRkNSVEwsIGh3LT5mYy5sb3dfd2F0ZXIpOworCQl9CisJCUlYR0JfV1JJVEVfUkVHKGh3LCBGQ1JUSCwgaHctPmZjLmhpZ2hfd2F0ZXIpOworCX0KKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWRzIGEgd29yZCBmcm9tIGEgZGV2aWNlIG92ZXIgdGhlIE1hbmFnZW1lbnQgRGF0YSBJbnRlcmZhY2UgKE1ESSkgYnVzLgorICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBtYW5hZ2UgUGh5c2ljYWwgbGF5ZXIgZGV2aWNlcy4KKyAqCisgKiBodyAgICAgICAgICAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBodyBjb2RlCisgKiByZWdfYWRkcmVzcyAtIE9mZnNldCBvZiBkZXZpY2UgcmVnaXN0ZXIgYmVpbmcgcmVhZC4KKyAqIHBoeV9hZGRyZXNzIC0gQWRkcmVzcyBvZiBkZXZpY2Ugb24gTURJLgorICoKKyAqIFJldHVybnM6ICBEYXRhIHdvcmQgKDE2IGJpdHMpIGZyb20gTURJIGRldmljZS4KKyAqCisgKiBUaGUgODI1OTdFWCBoYXMgc3VwcG9ydCBmb3Igc2V2ZXJhbCBNREkgYWNjZXNzIG1ldGhvZHMuICBUaGlzIHJvdXRpbmUKKyAqIHVzZXMgdGhlIG5ldyBwcm90b2NvbCBNREkgU2luZ2xlIENvbW1hbmQgYW5kIEFkZHJlc3MgT3BlcmF0aW9uLgorICogVGhpcyByZXF1aXJlcyB0aGF0IGZpcnN0IGFuIGFkZHJlc3MgY3ljbGUgY29tbWFuZCBpcyBzZW50LCBmb2xsb3dlZCBieSBhCisgKiByZWFkIGNvbW1hbmQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdAoraXhnYl9yZWFkX3BoeV9yZWcoc3RydWN0IGl4Z2JfaHcgKmh3LAorCQl1aW50MzJfdCByZWdfYWRkcmVzcywKKwkJdWludDMyX3QgcGh5X2FkZHJlc3MsCisJCXVpbnQzMl90IGRldmljZV90eXBlKQoreworCXVpbnQzMl90IGk7CisJdWludDMyX3QgZGF0YTsKKwl1aW50MzJfdCBjb21tYW5kID0gMDsKKworCUFTU0VSVChyZWdfYWRkcmVzcyA8PSBJWEdCX01BWF9QSFlfUkVHX0FERFJFU1MpOworCUFTU0VSVChwaHlfYWRkcmVzcyA8PSBJWEdCX01BWF9QSFlfQUREUkVTUyk7CisJQVNTRVJUKGRldmljZV90eXBlIDw9IElYR0JfTUFYX1BIWV9ERVZfVFlQRSk7CisKKwkvKiBTZXR1cCBhbmQgd3JpdGUgdGhlIGFkZHJlc3MgY3ljbGUgY29tbWFuZCAqLworCWNvbW1hbmQgPSAoKHJlZ19hZGRyZXNzIDw8IElYR0JfTVNDQV9OUF9BRERSX1NISUZUKSB8CisJCSAgIChkZXZpY2VfdHlwZSA8PCBJWEdCX01TQ0FfREVWX1RZUEVfU0hJRlQpIHwKKwkJICAgKHBoeV9hZGRyZXNzIDw8IElYR0JfTVNDQV9QSFlfQUREUl9TSElGVCkgfAorCQkgICAoSVhHQl9NU0NBX0FERFJfQ1lDTEUgfCBJWEdCX01TQ0FfTURJX0NPTU1BTkQpKTsKKworCUlYR0JfV1JJVEVfUkVHKGh3LCBNU0NBLCBjb21tYW5kKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICoqIENoZWNrIGV2ZXJ5IDEwIHVzZWMgdG8gc2VlIGlmIHRoZSBhZGRyZXNzIGN5Y2xlIGNvbXBsZXRlZAorICAgICoqIFRoZSBDT01NQU5EIGJpdCB3aWxsIGNsZWFyIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAqKiBUaGlzIG1heSB0YWtlIGFzIGxvbmcgYXMgNjQgdXNlY3MgKHdlJ2xsIHdhaXQgMTAwIHVzZWNzIG1heCkKKyAgICAqKiBmcm9tIHRoZSBDUFUgV3JpdGUgdG8gdGhlIFJlYWR5IGJpdCBhc3NlcnRpb24uCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlmb3IoaSA9IDA7IGkgPCAxMDsgaSsrKQorCXsKKwkJdWRlbGF5KDEwKTsKKworCQljb21tYW5kID0gSVhHQl9SRUFEX1JFRyhodywgTVNDQSk7CisKKwkJaWYgKChjb21tYW5kICYgSVhHQl9NU0NBX01ESV9DT01NQU5EKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJQVNTRVJUKChjb21tYW5kICYgSVhHQl9NU0NBX01ESV9DT01NQU5EKSA9PSAwKTsKKworCS8qIEFkZHJlc3MgY3ljbGUgY29tcGxldGUsIHNldHVwIGFuZCB3cml0ZSB0aGUgcmVhZCBjb21tYW5kICovCisJY29tbWFuZCA9ICgocmVnX2FkZHJlc3MgPDwgSVhHQl9NU0NBX05QX0FERFJfU0hJRlQpIHwKKwkJICAgKGRldmljZV90eXBlIDw8IElYR0JfTVNDQV9ERVZfVFlQRV9TSElGVCkgfAorCQkgICAocGh5X2FkZHJlc3MgPDwgSVhHQl9NU0NBX1BIWV9BRERSX1NISUZUKSB8CisJCSAgIChJWEdCX01TQ0FfUkVBRCB8IElYR0JfTVNDQV9NRElfQ09NTUFORCkpOworCisJSVhHQl9XUklURV9SRUcoaHcsIE1TQ0EsIGNvbW1hbmQpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiogQ2hlY2sgZXZlcnkgMTAgdXNlYyB0byBzZWUgaWYgdGhlIHJlYWQgY29tbWFuZCBjb21wbGV0ZWQKKyAgICAqKiBUaGUgQ09NTUFORCBiaXQgd2lsbCBjbGVhciB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUuCisgICAgKiogVGhlIHJlYWQgbWF5IHRha2UgYXMgbG9uZyBhcyA2NCB1c2VjcyAod2UnbGwgd2FpdCAxMDAgdXNlY3MgbWF4KQorICAgICoqIGZyb20gdGhlIENQVSBXcml0ZSB0byB0aGUgUmVhZHkgYml0IGFzc2VydGlvbi4KKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCWZvcihpID0gMDsgaSA8IDEwOyBpKyspCisJeworCQl1ZGVsYXkoMTApOworCisJCWNvbW1hbmQgPSBJWEdCX1JFQURfUkVHKGh3LCBNU0NBKTsKKworCQlpZiAoKGNvbW1hbmQgJiBJWEdCX01TQ0FfTURJX0NPTU1BTkQpID09IDApCisJCQlicmVhazsKKwl9CisKKwlBU1NFUlQoKGNvbW1hbmQgJiBJWEdCX01TQ0FfTURJX0NPTU1BTkQpID09IDApOworCisJLyogT3BlcmF0aW9uIGlzIGNvbXBsZXRlLCBnZXQgdGhlIGRhdGEgZnJvbSB0aGUgTURJTyBSZWFkL1dyaXRlIERhdGEKKwkgKiByZWdpc3RlciBhbmQgcmV0dXJuLgorCSAqLworCWRhdGEgPSBJWEdCX1JFQURfUkVHKGh3LCBNU1JXRCk7CisJZGF0YSA+Pj0gSVhHQl9NU1JXRF9SRUFEX0RBVEFfU0hJRlQ7CisJcmV0dXJuKCh1aW50MTZfdCkgZGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFdyaXRlcyBhIHdvcmQgdG8gYSBkZXZpY2Ugb3ZlciB0aGUgTWFuYWdlbWVudCBEYXRhIEludGVyZmFjZSAoTURJKSBidXMuCisgKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIG1hbmFnZSBQaHlzaWNhbCBsYXllciBkZXZpY2VzLgorICoKKyAqIGh3ICAgICAgICAgIC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IGh3IGNvZGUKKyAqIHJlZ19hZGRyZXNzIC0gT2Zmc2V0IG9mIGRldmljZSByZWdpc3RlciBiZWluZyByZWFkLgorICogcGh5X2FkZHJlc3MgLSBBZGRyZXNzIG9mIGRldmljZSBvbiBNREkuCisgKiBkZXZpY2VfdHlwZSAtIEFsc28ga25vd24gYXMgdGhlIERldmljZSBJRCBvciBESUQuCisgKiBkYXRhICAgICAgICAtIDE2LWJpdCB2YWx1ZSB0byBiZSB3cml0dGVuCisgKgorICogUmV0dXJuczogIHZvaWQuCisgKgorICogVGhlIDgyNTk3RVggaGFzIHN1cHBvcnQgZm9yIHNldmVyYWwgTURJIGFjY2VzcyBtZXRob2RzLiAgVGhpcyByb3V0aW5lCisgKiB1c2VzIHRoZSBuZXcgcHJvdG9jb2wgTURJIFNpbmdsZSBDb21tYW5kIGFuZCBBZGRyZXNzIE9wZXJhdGlvbi4KKyAqIFRoaXMgcmVxdWlyZXMgdGhhdCBmaXJzdCBhbiBhZGRyZXNzIGN5Y2xlIGNvbW1hbmQgaXMgc2VudCwgZm9sbG93ZWQgYnkgYQorICogd3JpdGUgY29tbWFuZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l4Z2Jfd3JpdGVfcGh5X3JlZyhzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCQl1aW50MzJfdCByZWdfYWRkcmVzcywKKwkJCXVpbnQzMl90IHBoeV9hZGRyZXNzLAorCQkJdWludDMyX3QgZGV2aWNlX3R5cGUsCisJCQl1aW50MTZfdCBkYXRhKQoreworCXVpbnQzMl90IGk7CisJdWludDMyX3QgY29tbWFuZCA9IDA7CisKKwlBU1NFUlQocmVnX2FkZHJlc3MgPD0gSVhHQl9NQVhfUEhZX1JFR19BRERSRVNTKTsKKwlBU1NFUlQocGh5X2FkZHJlc3MgPD0gSVhHQl9NQVhfUEhZX0FERFJFU1MpOworCUFTU0VSVChkZXZpY2VfdHlwZSA8PSBJWEdCX01BWF9QSFlfREVWX1RZUEUpOworCisJLyogUHV0IHRoZSBkYXRhIGluIHRoZSBNRElPIFJlYWQvV3JpdGUgRGF0YSByZWdpc3RlciAqLworCUlYR0JfV1JJVEVfUkVHKGh3LCBNU1JXRCwgKHVpbnQzMl90KWRhdGEpOworCisJLyogU2V0dXAgYW5kIHdyaXRlIHRoZSBhZGRyZXNzIGN5Y2xlIGNvbW1hbmQgKi8KKwljb21tYW5kID0gKChyZWdfYWRkcmVzcyA8PCBJWEdCX01TQ0FfTlBfQUREUl9TSElGVCkgIHwKKwkJCSAgIChkZXZpY2VfdHlwZSA8PCBJWEdCX01TQ0FfREVWX1RZUEVfU0hJRlQpIHwKKwkJCSAgIChwaHlfYWRkcmVzcyA8PCBJWEdCX01TQ0FfUEhZX0FERFJfU0hJRlQpIHwKKwkJCSAgIChJWEdCX01TQ0FfQUREUl9DWUNMRSB8IElYR0JfTVNDQV9NRElfQ09NTUFORCkpOworCisJSVhHQl9XUklURV9SRUcoaHcsIE1TQ0EsIGNvbW1hbmQpOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKiogQ2hlY2sgZXZlcnkgMTAgdXNlYyB0byBzZWUgaWYgdGhlIGFkZHJlc3MgY3ljbGUgY29tcGxldGVkCisJKiogVGhlIENPTU1BTkQgYml0IHdpbGwgY2xlYXIgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLgorCSoqIFRoaXMgbWF5IHRha2UgYXMgbG9uZyBhcyA2NCB1c2VjcyAod2UnbGwgd2FpdCAxMDAgdXNlY3MgbWF4KQorCSoqIGZyb20gdGhlIENQVSBXcml0ZSB0byB0aGUgUmVhZHkgYml0IGFzc2VydGlvbi4KKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCWZvcihpID0gMDsgaSA8IDEwOyBpKyspCisJeworCQl1ZGVsYXkoMTApOworCisJCWNvbW1hbmQgPSBJWEdCX1JFQURfUkVHKGh3LCBNU0NBKTsKKworCQlpZiAoKGNvbW1hbmQgJiBJWEdCX01TQ0FfTURJX0NPTU1BTkQpID09IDApCisJCQlicmVhazsKKwl9CisKKwlBU1NFUlQoKGNvbW1hbmQgJiBJWEdCX01TQ0FfTURJX0NPTU1BTkQpID09IDApOworCisJLyogQWRkcmVzcyBjeWNsZSBjb21wbGV0ZSwgc2V0dXAgYW5kIHdyaXRlIHRoZSB3cml0ZSBjb21tYW5kICovCisJY29tbWFuZCA9ICgocmVnX2FkZHJlc3MgPDwgSVhHQl9NU0NBX05QX0FERFJfU0hJRlQpICB8CisJCQkgICAoZGV2aWNlX3R5cGUgPDwgSVhHQl9NU0NBX0RFVl9UWVBFX1NISUZUKSB8CisJCQkgICAocGh5X2FkZHJlc3MgPDwgSVhHQl9NU0NBX1BIWV9BRERSX1NISUZUKSB8CisJCQkgICAoSVhHQl9NU0NBX1dSSVRFIHwgSVhHQl9NU0NBX01ESV9DT01NQU5EKSk7CisKKwlJWEdCX1dSSVRFX1JFRyhodywgTVNDQSwgY29tbWFuZCk7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqKiBDaGVjayBldmVyeSAxMCB1c2VjIHRvIHNlZSBpZiB0aGUgcmVhZCBjb21tYW5kIGNvbXBsZXRlZAorCSoqIFRoZSBDT01NQU5EIGJpdCB3aWxsIGNsZWFyIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KKwkqKiBUaGUgd3JpdGUgbWF5IHRha2UgYXMgbG9uZyBhcyA2NCB1c2VjcyAod2UnbGwgd2FpdCAxMDAgdXNlY3MgbWF4KQorCSoqIGZyb20gdGhlIENQVSBXcml0ZSB0byB0aGUgUmVhZHkgYml0IGFzc2VydGlvbi4KKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCWZvcihpID0gMDsgaSA8IDEwOyBpKyspCisJeworCQl1ZGVsYXkoMTApOworCisJCWNvbW1hbmQgPSBJWEdCX1JFQURfUkVHKGh3LCBNU0NBKTsKKworCQlpZiAoKGNvbW1hbmQgJiBJWEdCX01TQ0FfTURJX0NPTU1BTkQpID09IDApCisJCQlicmVhazsKKwl9CisKKwlBU1NFUlQoKGNvbW1hbmQgJiBJWEdCX01TQ0FfTURJX0NPTU1BTkQpID09IDApOworCisJLyogT3BlcmF0aW9uIGlzIGNvbXBsZXRlLCByZXR1cm4uICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGxpbmsgc3RhdHVzIG9mIHRoZSBoYXJkd2FyZSBoYXMgY2hhbmdlZC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBodyBjb2RlCisgKgorICogQ2FsbGVkIGJ5IGFueSBmdW5jdGlvbiB0aGF0IG5lZWRzIHRvIGNoZWNrIHRoZSBsaW5rIHN0YXR1cyBvZiB0aGUgYWRhcHRlci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l4Z2JfY2hlY2tfZm9yX2xpbmsoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IHN0YXR1c19yZWc7CisJdWludDMyX3QgeHBjc3NfcmVnOworCisJREVCVUdGVU5DKCJpeGdiX2NoZWNrX2Zvcl9saW5rIik7CisKKwl4cGNzc19yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBYUENTUyk7CisJc3RhdHVzX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFNUQVRVUyk7CisKKwlpZiAoKHhwY3NzX3JlZyAmIElYR0JfWFBDU1NfQUxJR05fU1RBVFVTKSAmJgorCSAgICAoc3RhdHVzX3JlZyAmIElYR0JfU1RBVFVTX0xVKSkgeworCQlody0+bGlua191cCA9IFRSVUU7CisJfSBlbHNlIGlmICghKHhwY3NzX3JlZyAmIElYR0JfWFBDU1NfQUxJR05fU1RBVFVTKSAmJgorCQkgICAoc3RhdHVzX3JlZyAmIElYR0JfU1RBVFVTX0xVKSkgeworCQlERUJVR09VVCgiWFBDU1MgTm90IEFsaWduZWQgd2hpbGUgU3RhdHVzOkxVIGlzIHNldC5cbiIpOworCQlody0+bGlua191cCA9IGl4Z2JfbGlua19yZXNldChodyk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogODI1OTdFWCBlcnJhdGEuICBTaW5jZSB0aGUgbGFuZSBkZXNrZXcgcHJvYmxlbSBtYXkgcHJldmVudAorCQkgKiBsaW5rLCByZXNldCB0aGUgbGluayBiZWZvcmUgcmVwb3J0aW5nIGxpbmsgZG93bi4KKwkJICovCisJCWh3LT5saW5rX3VwID0gaXhnYl9saW5rX3Jlc2V0KGh3KTsKKwl9CisJLyogIEFueXRoaW5nIGVsc2UgZm9yIDEwIEdpZz8/ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoZWNrIGZvciBhIGJhZCBsaW5rIGNvbmRpdGlvbiB0aGF0IG1heSBoYXZlIG9jY3VyZWQuCisgKiBUaGUgaW5kaWNhdGlvbiBpcyB0aGF0IHRoZSBSRkMgLyBMRkMgcmVnaXN0ZXJzIG1heSBiZSBpbmNyZW1lbnRpbmcKKyAqIGNvbnRpbnVhbGx5LiAgQSBmdWxsIGFkYXB0ZXIgcmVzZXQgaXMgcmVxdWlyZWQgdG8gcmVjb3Zlci4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBodyBjb2RlCisgKgorICogQ2FsbGVkIGJ5IGFueSBmdW5jdGlvbiB0aGF0IG5lZWRzIHRvIGNoZWNrIHRoZSBsaW5rIHN0YXR1cyBvZiB0aGUgYWRhcHRlci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2xlYW5fdCBpeGdiX2NoZWNrX2Zvcl9iYWRfbGluayhzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3QgbmV3TEZDLCBuZXdSRkM7CisJYm9vbGVhbl90IGJhZF9saW5rX3JldHVybmNvZGUgPSBGQUxTRTsKKworCWlmIChody0+cGh5X3R5cGUgPT0gaXhnYl9waHlfdHlwZV90eG4xNzQwMSkgeworCQluZXdMRkMgPSBJWEdCX1JFQURfUkVHKGh3LCBMRkMpOworCQluZXdSRkMgPSBJWEdCX1JFQURfUkVHKGh3LCBSRkMpOworCQlpZiAoKGh3LT5sYXN0TEZDICsgMjUwIDwgbmV3TEZDKQorCQkgICAgfHwgKGh3LT5sYXN0UkZDICsgMjUwIDwgbmV3UkZDKSkgeworCQkJREVCVUdPVVQKKwkJCSAgICAoIkJBRCBMSU5LISB0b28gbWFueSBMRkMvUkZDIHNpbmNlIGxhc3QgY2hlY2tcbiIpOworCQkJYmFkX2xpbmtfcmV0dXJuY29kZSA9IFRSVUU7CisJCX0KKwkJaHctPmxhc3RMRkMgPSBuZXdMRkM7CisJCWh3LT5sYXN0UkZDID0gbmV3UkZDOworCX0KKworCXJldHVybiBiYWRfbGlua19yZXR1cm5jb2RlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDbGVhcnMgYWxsIGhhcmR3YXJlIHN0YXRpc3RpY3MgY291bnRlcnMuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l4Z2JfY2xlYXJfaHdfY250cnMoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXZvbGF0aWxlIHVpbnQzMl90IHRlbXBfcmVnOworCisJREVCVUdGVU5DKCJpeGdiX2NsZWFyX2h3X2NudHJzIik7CisKKwkvKiBpZiB3ZSBhcmUgc3RvcHBlZCBvciByZXNldHRpbmcgZXhpdCBncmFjZWZ1bGx5ICovCisJaWYoaHctPmFkYXB0ZXJfc3RvcHBlZCkgeworCQlERUJVR09VVCgiRXhpdGluZyBiZWNhdXNlIHRoZSBhZGFwdGVyIGlzIHN0b3BwZWQhISFcbiIpOworCQlyZXR1cm47CisJfQorCisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBUUFJMKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFRQUkgpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR1BSQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR1BSQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgQlBSQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgQlBSQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgTVBSQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgTVBSQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVVBSQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVVBSQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVlBSQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVlBSQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgSlBSQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgSlBSQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR09SQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR09SQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVE9STCk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBUT1JIKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFJOQkMpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgUlVDKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFJPQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBSTEVDKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIENSQ0VSUlMpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgSUNCQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBFQ0JDKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIE1QQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBUUFRMKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFRQVEgpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR1BUQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR1BUQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgQlBUQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgQlBUQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgTVBUQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgTVBUQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVVBUQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVVBUQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVlBUQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVlBUQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgSlBUQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgSlBUQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR09UQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR09UQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVE9UTCk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBUT1RIKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIERDKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFBMVDY0Qyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBUU0NUQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBUU0NURkMpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgSUJJQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBSRkMpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgTEZDKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFBGUkMpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgUEZUQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBNQ0ZSQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBNQ0ZUQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBYT05SWEMpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgWE9OVFhDKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFhPRkZSWEMpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgWE9GRlRYQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBSSkMpOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVHVybnMgb24gdGhlIHNvZnR3YXJlIGNvbnRyb2xsYWJsZSBMRUQKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAoraXhnYl9sZWRfb24oc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IGN0cmwwX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIENUUkwwKTsKKworCS8qIFRvIHR1cm4gb24gdGhlIExFRCwgY2xlYXIgc29mdHdhcmUtZGVmaW5hYmxlIHBpbiAwIChTRFAwKS4gKi8KKwljdHJsMF9yZWcgJj0gfklYR0JfQ1RSTDBfU0RQMDsKKwlJWEdCX1dSSVRFX1JFRyhodywgQ1RSTDAsIGN0cmwwX3JlZyk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUdXJucyBvZmYgdGhlIHNvZnR3YXJlIGNvbnRyb2xsYWJsZSBMRUQKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAoraXhnYl9sZWRfb2ZmKHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwl1aW50MzJfdCBjdHJsMF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBDVFJMMCk7CisKKwkvKiBUbyB0dXJuIG9mZiB0aGUgTEVELCBzZXQgc29mdHdhcmUtZGVmaW5hYmxlIHBpbiAwIChTRFAwKS4gKi8KKwljdHJsMF9yZWcgfD0gSVhHQl9DVFJMMF9TRFAwOworCUlYR0JfV1JJVEVfUkVHKGh3LCBDVFJMMCwgY3RybDBfcmVnKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdldHMgdGhlIGN1cnJlbnQgUENJIGJ1cyB0eXBlLCBzcGVlZCwgYW5kIHdpZHRoIG9mIHRoZSBoYXJkd2FyZQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXhnYl9nZXRfYnVzX2luZm8oc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IHN0YXR1c19yZWc7CisKKwlzdGF0dXNfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgU1RBVFVTKTsKKworCWh3LT5idXMudHlwZSA9IChzdGF0dXNfcmVnICYgSVhHQl9TVEFUVVNfUENJWF9NT0RFKSA/CisJCWl4Z2JfYnVzX3R5cGVfcGNpeCA6IGl4Z2JfYnVzX3R5cGVfcGNpOworCisJaWYgKGh3LT5idXMudHlwZSA9PSBpeGdiX2J1c190eXBlX3BjaSkgeworCQlody0+YnVzLnNwZWVkID0gKHN0YXR1c19yZWcgJiBJWEdCX1NUQVRVU19QQ0lfU1BEKSA/CisJCQlpeGdiX2J1c19zcGVlZF82NiA6IGl4Z2JfYnVzX3NwZWVkXzMzOworCX0gZWxzZSB7CisJCXN3aXRjaCAoc3RhdHVzX3JlZyAmIElYR0JfU1RBVFVTX1BDSVhfU1BEX01BU0spIHsKKwkJY2FzZSBJWEdCX1NUQVRVU19QQ0lYX1NQRF82NjoKKwkJCWh3LT5idXMuc3BlZWQgPSBpeGdiX2J1c19zcGVlZF82NjsKKwkJCWJyZWFrOworCQljYXNlIElYR0JfU1RBVFVTX1BDSVhfU1BEXzEwMDoKKwkJCWh3LT5idXMuc3BlZWQgPSBpeGdiX2J1c19zcGVlZF8xMDA7CisJCQlicmVhazsKKwkJY2FzZSBJWEdCX1NUQVRVU19QQ0lYX1NQRF8xMzM6CisJCQlody0+YnVzLnNwZWVkID0gaXhnYl9idXNfc3BlZWRfMTMzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlody0+YnVzLnNwZWVkID0gaXhnYl9idXNfc3BlZWRfcmVzZXJ2ZWQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCWh3LT5idXMud2lkdGggPSAoc3RhdHVzX3JlZyAmIElYR0JfU1RBVFVTX0JVUzY0KSA/CisJCWl4Z2JfYnVzX3dpZHRoXzY0IDogaXhnYl9idXNfd2lkdGhfMzI7CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3RzIGEgTUFDIGFkZHJlc3MgdG8gZW5zdXJlIGl0IGlzIGEgdmFsaWQgSW5kaXZpZHVhbCBBZGRyZXNzCisgKgorICogbWFjX2FkZHIgLSBwb2ludGVyIHRvIE1BQyBhZGRyZXNzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2xlYW5fdAorbWFjX2FkZHJfdmFsaWQodWludDhfdCAqbWFjX2FkZHIpCit7CisJYm9vbGVhbl90IGlzX3ZhbGlkID0gVFJVRTsKKwlERUJVR0ZVTkMoIm1hY19hZGRyX3ZhbGlkIik7CisKKwkvKiBNYWtlIHN1cmUgaXQgaXMgbm90IGEgbXVsdGljYXN0IGFkZHJlc3MgKi8KKwlpZiAoSVNfTVVMVElDQVNUKG1hY19hZGRyKSkgeworCQlERUJVR09VVCgiTUFDIGFkZHJlc3MgaXMgbXVsdGljYXN0XG4iKTsKKwkJaXNfdmFsaWQgPSBGQUxTRTsKKwl9CisJLyogTm90IGEgYnJvYWRjYXN0IGFkZHJlc3MgKi8KKwllbHNlIGlmIChJU19CUk9BRENBU1QobWFjX2FkZHIpKSB7CisJCURFQlVHT1VUKCJNQUMgYWRkcmVzcyBpcyBicm9hZGNhc3RcbiIpOworCQlpc192YWxpZCA9IEZBTFNFOworCX0KKwkvKiBSZWplY3QgdGhlIHplcm8gYWRkcmVzcyAqLworCWVsc2UgaWYgKG1hY19hZGRyWzBdID09IDAgJiYKKwkJCSBtYWNfYWRkclsxXSA9PSAwICYmCisJCQkgbWFjX2FkZHJbMl0gPT0gMCAmJgorCQkJIG1hY19hZGRyWzNdID09IDAgJiYKKwkJCSBtYWNfYWRkcls0XSA9PSAwICYmCisJCQkgbWFjX2FkZHJbNV0gPT0gMCkgeworCQlERUJVR09VVCgiTUFDIGFkZHJlc3MgaXMgYWxsIHplcm9zXG4iKTsKKwkJaXNfdmFsaWQgPSBGQUxTRTsKKwl9CisJcmV0dXJuIChpc192YWxpZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlc2V0cyB0aGUgMTBHYkUgbGluay4gIFdhaXRzIHRoZSBzZXR0bGUgdGltZSBhbmQgcmV0dXJucyB0aGUgc3RhdGUgb2YKKyAqIHRoZSBsaW5rLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sZWFuX3QKK2l4Z2JfbGlua19yZXNldChzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJYm9vbGVhbl90IGxpbmtfc3RhdHVzID0gRkFMU0U7CisJdWludDhfdCB3YWl0X3JldHJpZXMgPSBNQVhfUkVTRVRfSVRFUkFUSU9OUzsKKwl1aW50OF90IGxyc3RfcmV0cmllcyA9IE1BWF9SRVNFVF9JVEVSQVRJT05TOworCisJZG8geworCQkvKiBSZXNldCB0aGUgbGluayAqLworCQlJWEdCX1dSSVRFX1JFRyhodywgQ1RSTDAsCisJCQkgICAgICAgSVhHQl9SRUFEX1JFRyhodywgQ1RSTDApIHwgSVhHQl9DVFJMMF9MUlNUKTsKKworCQkvKiBXYWl0IGZvciBsaW5rLXVwIGFuZCBsYW5lIHJlLWFsaWdubWVudCAqLworCQlkbyB7CisJCQl1ZGVsYXkoSVhHQl9ERUxBWV9VU0VDU19BRlRFUl9MSU5LX1JFU0VUKTsKKwkJCWxpbmtfc3RhdHVzID0KKwkJCSAgICAoKElYR0JfUkVBRF9SRUcoaHcsIFNUQVRVUykgJiBJWEdCX1NUQVRVU19MVSkKKwkJCSAgICAgJiYgKElYR0JfUkVBRF9SRUcoaHcsIFhQQ1NTKSAmCisJCQkJIElYR0JfWFBDU1NfQUxJR05fU1RBVFVTKSkgPyBUUlVFIDogRkFMU0U7CisJCX0gd2hpbGUgKCFsaW5rX3N0YXR1cyAmJiAtLXdhaXRfcmV0cmllcyk7CisKKwl9IHdoaWxlICghbGlua19zdGF0dXMgJiYgLS1scnN0X3JldHJpZXMpOworCisJcmV0dXJuIGxpbmtfc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXNldHMgdGhlIDEwR2JFIG9wdGljcyBtb2R1bGUuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l4Z2Jfb3B0aWNzX3Jlc2V0KHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwlpZiAoaHctPnBoeV90eXBlID09IGl4Z2JfcGh5X3R5cGVfdHhuMTc0MDEpIHsKKwkJdWludDE2X3QgbWRpb19yZWc7CisKKwkJaXhnYl93cml0ZV9waHlfcmVnKGh3LAorCQkJCQlNRElPX1BNQV9QTURfQ1IxLAorCQkJCQlJWEdCX1BIWV9BRERSRVNTLAorCQkJCQlNRElPX1BNQV9QTURfRElELAorCQkJCQlNRElPX1BNQV9QTURfQ1IxX1JFU0VUKTsKKworCQltZGlvX3JlZyA9IGl4Z2JfcmVhZF9waHlfcmVnKCBodywKKwkJCQkJCU1ESU9fUE1BX1BNRF9DUjEsCisJCQkJCQlJWEdCX1BIWV9BRERSRVNTLAorCQkJCQkJTURJT19QTUFfUE1EX0RJRCk7CisJfQorCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX2h3LmggYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfaHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzg5OGVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2h3LmgKQEAgLTAsMCArMSw4NDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyAgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKKyAgbW9yZSBkZXRhaWxzLgorICAKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgCisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICAKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgIAorICBDb250YWN0IEluZm9ybWF0aW9uOgorICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9JWEdCX0hXX0hfCisjZGVmaW5lIF9JWEdCX0hXX0hfCisKKyNpbmNsdWRlICJpeGdiX29zZGVwLmgiCisKKy8qIEVudW1zICovCit0eXBlZGVmIGVudW0geworCWl4Z2JfbWFjX3Vua25vd24gPSAwLAorCWl4Z2JfODI1OTcsCisJaXhnYl9udW1fbWFjcworfSBpeGdiX21hY190eXBlOworCisvKiBUeXBlcyBvZiBwaHlzaWNhbCBsYXllciBtb2R1bGVzICovCit0eXBlZGVmIGVudW0geworCWl4Z2JfcGh5X3R5cGVfdW5rbm93biA9IDAsCisJaXhnYl9waHlfdHlwZV9nNjAwNSwJLyogODUwbm0sIE1NIGZpYmVyLCBYUEFLIHRyYW5zY2VpdmVyICovCisJaXhnYl9waHlfdHlwZV9nNjEwNCwJLyogMTMxMG5tLCBTTSBmaWJlciwgWFBBSyB0cmFuc2NlaXZlciAqLworCWl4Z2JfcGh5X3R5cGVfdHhuMTcyMDEsCS8qIDg1MG5tLCBNTSBmaWJlciwgWFBBSyB0cmFuc2NlaXZlciAqLworCWl4Z2JfcGh5X3R5cGVfdHhuMTc0MDEJLyogMTMxMG5tLCBTTSBmaWJlciwgWEVOUEFLIHRyYW5zY2VpdmVyICovCit9IGl4Z2JfcGh5X3R5cGU7CisKKy8qIFhQQUsgdHJhbnNjZWl2ZXIgdmVuZG9ycywgZm9yIHRoZSBTUiBhZGFwdGVycyAqLwordHlwZWRlZiBlbnVtIHsKKwlpeGdiX3hwYWtfdmVuZG9yX2ludGVsLAorCWl4Z2JfeHBha192ZW5kb3JfaW5maW5lb24KK30gaXhnYl94cGFrX3ZlbmRvcjsKKworLyogTWVkaWEgVHlwZXMgKi8KK3R5cGVkZWYgZW51bSB7CisJaXhnYl9tZWRpYV90eXBlX3Vua25vd24gPSAwLAorCWl4Z2JfbWVkaWFfdHlwZV9maWJlciA9IDEsCisJaXhnYl9udW1fbWVkaWFfdHlwZXMKK30gaXhnYl9tZWRpYV90eXBlOworCisvKiBGbG93IENvbnRyb2wgU2V0dGluZ3MgKi8KK3R5cGVkZWYgZW51bSB7CisJaXhnYl9mY19ub25lID0gMCwKKwlpeGdiX2ZjX3J4X3BhdXNlID0gMSwKKwlpeGdiX2ZjX3R4X3BhdXNlID0gMiwKKwlpeGdiX2ZjX2Z1bGwgPSAzLAorCWl4Z2JfZmNfZGVmYXVsdCA9IDB4RkYKK30gaXhnYl9mY190eXBlOworCisvKiBQQ0kgYnVzIHR5cGVzICovCit0eXBlZGVmIGVudW0geworCWl4Z2JfYnVzX3R5cGVfdW5rbm93biA9IDAsCisJaXhnYl9idXNfdHlwZV9wY2ksCisJaXhnYl9idXNfdHlwZV9wY2l4Cit9IGl4Z2JfYnVzX3R5cGU7CisKKy8qIFBDSSBidXMgc3BlZWRzICovCit0eXBlZGVmIGVudW0geworCWl4Z2JfYnVzX3NwZWVkX3Vua25vd24gPSAwLAorCWl4Z2JfYnVzX3NwZWVkXzMzLAorCWl4Z2JfYnVzX3NwZWVkXzY2LAorCWl4Z2JfYnVzX3NwZWVkXzEwMCwKKwlpeGdiX2J1c19zcGVlZF8xMzMsCisJaXhnYl9idXNfc3BlZWRfcmVzZXJ2ZWQKK30gaXhnYl9idXNfc3BlZWQ7CisKKy8qIFBDSSBidXMgd2lkdGhzICovCit0eXBlZGVmIGVudW0geworCWl4Z2JfYnVzX3dpZHRoX3Vua25vd24gPSAwLAorCWl4Z2JfYnVzX3dpZHRoXzMyLAorCWl4Z2JfYnVzX3dpZHRoXzY0Cit9IGl4Z2JfYnVzX3dpZHRoOworCisjZGVmaW5lIElYR0JfRVRIX0xFTkdUSF9PRl9BRERSRVNTICAgNgorCisjZGVmaW5lIElYR0JfRUVQUk9NX1NJWkUgICAgNjQJLyogU2l6ZSBpbiB3b3JkcyAqLworCisjZGVmaW5lIFNQRUVEXzEwMDAwICAxMDAwMAorI2RlZmluZSBGVUxMX0RVUExFWCAgMgorCisjZGVmaW5lIE1JTl9OVU1CRVJfT0ZfREVTQ1JJUFRPUlMgICAgICAgOAorI2RlZmluZSBNQVhfTlVNQkVSX09GX0RFU0NSSVBUT1JTICAweEZGRjgJLyogMTMgYml0cyBpbiBSRExFTi9URExFTiwgMTI4QiBhbGlnbmVkICAgICAqLworCisjZGVmaW5lIElYR0JfREVMQVlfQkVGT1JFX1JFU0VUICAgICAgICAxMAkvKiBhbGxvdyAxMG1zIGFmdGVyIGlkbGluZyByeC90eCB1bml0cyAgICAgICovCisjZGVmaW5lIElYR0JfREVMQVlfQUZURVJfUkVTRVQgICAgICAgICAgMQkvKiBhbGxvdyAxbXMgYWZ0ZXIgdGhlIHJlc2V0ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElYR0JfREVMQVlfQUZURVJfRUVfUkVTRVQgICAgICAxMAkvKiBhbGxvdyAxMG1zIGFmdGVyIHRoZSBFRVBST00gcmVzZXQgICAgICAgICovCisKKyNkZWZpbmUgSVhHQl9ERUxBWV9VU0VDU19BRlRFUl9MSU5LX1JFU0VUICAgIDEzCS8qIGFsbG93IDEzIG1pY3Jvc2Vjb25kcyBhZnRlciB0aGUgcmVzZXQgICAgKi8KKwkJCQkJICAgLyogTk9URTogdGhpcyBpcyBNSUNST1NFQ09ORFMgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQVhfUkVTRVRfSVRFUkFUSU9OUyAgICAgICAgICAgIDgJLyogbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gZ2V0IHRoaW5ncyByaWdodCAqLworCisvKiBHZW5lcmFsIFJlZ2lzdGVycyAqLworI2RlZmluZSBJWEdCX0NUUkwwICAgMHgwMDAwMAkvKiBEZXZpY2UgQ29udHJvbCBSZWdpc3RlciAwIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9DVFJMMSAgIDB4MDAwMDgJLyogRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIgMSAtIFJXICovCisjZGVmaW5lIElYR0JfU1RBVFVTICAweDAwMDEwCS8qIERldmljZSBTdGF0dXMgUmVnaXN0ZXIgLSBSTyAqLworI2RlZmluZSBJWEdCX0VFQ0QgICAgMHgwMDAxOAkvKiBFRVBST00vRmxhc2ggQ29udHJvbC9EYXRhIFJlZ2lzdGVyIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9NRlMgICAgIDB4MDAwMjAJLyogTWF4aW11bSBGcmFtZSBTaXplIC0gUlcgKi8KKworLyogSW50ZXJydXB0ICovCisjZGVmaW5lIElYR0JfSUNSICAgICAweDAwMDgwCS8qIEludGVycnVwdCBDYXVzZSBSZWFkIC0gUi9jbHIgKi8KKyNkZWZpbmUgSVhHQl9JQ1MgICAgIDB4MDAwODgJLyogSW50ZXJydXB0IENhdXNlIFNldCAtIFJXICovCisjZGVmaW5lIElYR0JfSU1TICAgICAweDAwMDkwCS8qIEludGVycnVwdCBNYXNrIFNldC9SZWFkIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9JTUMgICAgIDB4MDAwOTgJLyogSW50ZXJydXB0IE1hc2sgQ2xlYXIgLSBXTyAqLworCisvKiBSZWNlaXZlICovCisjZGVmaW5lIElYR0JfUkNUTCAgICAweDAwMTAwCS8qIFJYIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBJWEdCX0ZDUlRMICAgMHgwMDEwOAkvKiBGbG93IENvbnRyb2wgUmVjZWl2ZSBUaHJlc2hvbGQgTG93IC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9GQ1JUSCAgIDB4MDAxMTAJLyogRmxvdyBDb250cm9sIFJlY2VpdmUgVGhyZXNob2xkIEhpZ2ggLSBSVyAqLworI2RlZmluZSBJWEdCX1JEQkFMICAgMHgwMDExOAkvKiBSWCBEZXNjcmlwdG9yIEJhc2UgTG93IC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9SREJBSCAgIDB4MDAxMUMJLyogUlggRGVzY3JpcHRvciBCYXNlIEhpZ2ggLSBSVyAqLworI2RlZmluZSBJWEdCX1JETEVOICAgMHgwMDEyMAkvKiBSWCBEZXNjcmlwdG9yIExlbmd0aCAtIFJXICovCisjZGVmaW5lIElYR0JfUkRIICAgICAweDAwMTI4CS8qIFJYIERlc2NyaXB0b3IgSGVhZCAtIFJXICovCisjZGVmaW5lIElYR0JfUkRUICAgICAweDAwMTMwCS8qIFJYIERlc2NyaXB0b3IgVGFpbCAtIFJXICovCisjZGVmaW5lIElYR0JfUkRUUiAgICAweDAwMTM4CS8qIFJYIERlbGF5IFRpbWVyIFJpbmcgLSBSVyAqLworI2RlZmluZSBJWEdCX1JYRENUTCAgMHgwMDE0MAkvKiBSZWNlaXZlIERlc2NyaXB0b3IgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIElYR0JfUkFJREMgICAweDAwMTQ4CS8qIFJlY2VpdmUgQWRhcHRpdmUgSW50ZXJydXB0IERlbGF5IENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBJWEdCX1JYQ1NVTSAgMHgwMDE1OAkvKiBSZWNlaXZlIENoZWNrc3VtIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBJWEdCX1JBICAgICAgMHgwMDE4MAkvKiBSZWNlaXZlIEFkZHJlc3MgQXJyYXkgQmFzZSAtIFJXICovCisjZGVmaW5lIElYR0JfUkFMICAgICAweDAwMTgwCS8qIFJlY2VpdmUgQWRkcmVzcyBMb3cgWzA6MTVdIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9SQUggICAgIDB4MDAxODQJLyogUmVjZWl2ZSBBZGRyZXNzIEhpZ2ggWzA6MTVdIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9NVEEgICAgIDB4MDAyMDAJLyogTXVsdGljYXN0IFRhYmxlIEFycmF5IFswOjEyN10gLSBSVyAqLworI2RlZmluZSBJWEdCX1ZGVEEgICAgMHgwMDQwMAkvKiBWTEFOIEZpbHRlciBUYWJsZSBBcnJheSBbMDoxMjddIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9SRVFfUlhfREVTQ1JJUFRPUl9NVUxUSVBMRSA4CisKKy8qIFRyYW5zbWl0ICovCisjZGVmaW5lIElYR0JfVENUTCAgICAweDAwNjAwCS8qIFRYIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBJWEdCX1REQkFMICAgMHgwMDYwOAkvKiBUWCBEZXNjcmlwdG9yIEJhc2UgTG93IC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9UREJBSCAgIDB4MDA2MEMJLyogVFggRGVzY3JpcHRvciBCYXNlIEhpZ2ggLSBSVyAqLworI2RlZmluZSBJWEdCX1RETEVOICAgMHgwMDYxMAkvKiBUWCBEZXNjcmlwdG9yIExlbmd0aCAtIFJXICovCisjZGVmaW5lIElYR0JfVERIICAgICAweDAwNjE4CS8qIFRYIERlc2NyaXB0b3IgSGVhZCAtIFJXICovCisjZGVmaW5lIElYR0JfVERUICAgICAweDAwNjIwCS8qIFRYIERlc2NyaXB0b3IgVGFpbCAtIFJXICovCisjZGVmaW5lIElYR0JfVElEViAgICAweDAwNjI4CS8qIFRYIEludGVycnVwdCBEZWxheSBWYWx1ZSAtIFJXICovCisjZGVmaW5lIElYR0JfVFhEQ1RMICAweDAwNjMwCS8qIFRyYW5zbWl0IERlc2NyaXB0b3IgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIElYR0JfVFNQTVQgICAweDAwNjM4CS8qIFRDUCBTZWdtZW50YXRpb24gUEFEICYgTWluIFRocmVzaG9sZCAtIFJXICovCisjZGVmaW5lIElYR0JfUEFQICAgICAweDAwNjQwCS8qIFBhdXNlIGFuZCBQYWNlIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9SRVFfVFhfREVTQ1JJUFRPUl9NVUxUSVBMRSA4CisKKy8qIFBoeXNpY2FsICovCisjZGVmaW5lIElYR0JfUENTQzEgICAweDAwNzAwCS8qIFBDUyBDb250cm9sIDEgLSBSVyAqLworI2RlZmluZSBJWEdCX1BDU0MyICAgMHgwMDcwOAkvKiBQQ1MgQ29udHJvbCAyIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9QQ1NTMSAgIDB4MDA3MTAJLyogUENTIFN0YXR1cyAxIC0gUk8gKi8KKyNkZWZpbmUgSVhHQl9QQ1NTMiAgIDB4MDA3MTgJLyogUENTIFN0YXR1cyAyIC0gUk8gKi8KKyNkZWZpbmUgSVhHQl9YUENTUyAgIDB4MDA3MjAJLyogMTBHQkFTRS1YIFBDUyBTdGF0dXMgKG9yIFhHWFMgTGFuZSBTdGF0dXMpIC0gUk8gKi8KKyNkZWZpbmUgSVhHQl9VQ0NSICAgIDB4MDA3MjgJLyogVW5pbGluayBDaXJjdWl0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVhHQl9YUENTVEMgIDB4MDA3MzAJLyogMTBHQkFTRS1YIFBDUyBUZXN0IENvbnRyb2wgKi8KKyNkZWZpbmUgSVhHQl9NQUNBICAgIDB4MDA3MzgJLyogTURJIEF1dG9zY2FuIENvbW1hbmQgYW5kIEFkZHJlc3MgLSBSVyAqLworI2RlZmluZSBJWEdCX0FQQUUgICAgMHgwMDc0MAkvKiBBdXRvc2NhbiBQSFkgQWRkcmVzcyBFbmFibGUgLSBSVyAqLworI2RlZmluZSBJWEdCX0FSRCAgICAgMHgwMDc0OAkvKiBBdXRvc2NhbiBSZWFkIERhdGEgLSBSTyAqLworI2RlZmluZSBJWEdCX0FJUyAgICAgMHgwMDc1MAkvKiBBdXRvc2NhbiBJbnRlcnJ1cHQgU3RhdHVzIC0gUk8gKi8KKyNkZWZpbmUgSVhHQl9NU0NBICAgIDB4MDA3NTgJLyogTURJIFNpbmdsZSBDb21tYW5kIGFuZCBBZGRyZXNzIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9NU1JXRCAgIDB4MDA3NjAJLyogTURJIFNpbmdsZSBSZWFkIGFuZCBXcml0ZSBEYXRhIC0gUlcsIFJPICovCisKKy8qIFdha2UtdXAgKi8KKyNkZWZpbmUgSVhHQl9XVUZDICAgIDB4MDA4MDgJLyogV2FrZSBVcCBGaWx0ZXIgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIElYR0JfV1VTICAgICAweDAwODEwCS8qIFdha2UgVXAgU3RhdHVzIC0gUk8gKi8KKyNkZWZpbmUgSVhHQl9GRkxUICAgIDB4MDEwMDAJLyogRmxleGlibGUgRmlsdGVyIExlbmd0aCBUYWJsZSAtIFJXICovCisjZGVmaW5lIElYR0JfRkZNVCAgICAweDAxMDIwCS8qIEZsZXhpYmxlIEZpbHRlciBNYXNrIFRhYmxlIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9GVFZUICAgIDB4MDE0MjAJLyogRmxleGlibGUgRmlsdGVyIFZhbHVlIFRhYmxlIC0gUlcgKi8KKworLyogU3RhdGlzdGljcyAqLworI2RlZmluZSBJWEdCX1RQUkwgICAgMHgwMjAwMAkvKiBUb3RhbCBQYWNrZXRzIFJlY2VpdmVkIChMb3cpICovCisjZGVmaW5lIElYR0JfVFBSSCAgICAweDAyMDA0CS8qIFRvdGFsIFBhY2tldHMgUmVjZWl2ZWQgKEhpZ2gpICovCisjZGVmaW5lIElYR0JfR1BSQ0wgICAweDAyMDA4CS8qIEdvb2QgUGFja2V0cyBSZWNlaXZlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX0dQUkNIICAgMHgwMjAwQwkvKiBHb29kIFBhY2tldHMgUmVjZWl2ZWQgQ291bnQgKEhpZ2gpICovCisjZGVmaW5lIElYR0JfQlBSQ0wgICAweDAyMDEwCS8qIEJyb2FkY2FzdCBQYWNrZXRzIFJlY2VpdmVkIENvdW50IChMb3cpICovCisjZGVmaW5lIElYR0JfQlBSQ0ggICAweDAyMDE0CS8qIEJyb2FkY2FzdCBQYWNrZXRzIFJlY2VpdmVkIENvdW50IChIaWdoKSAqLworI2RlZmluZSBJWEdCX01QUkNMICAgMHgwMjAxOAkvKiBNdWx0aWNhc3QgUGFja2V0cyBSZWNlaXZlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX01QUkNIICAgMHgwMjAxQwkvKiBNdWx0aWNhc3QgUGFja2V0cyBSZWNlaXZlZCBDb3VudCAoSGlnaCkgKi8KKyNkZWZpbmUgSVhHQl9VUFJDTCAgIDB4MDIwMjAJLyogVW5pY2FzdCBQYWNrZXRzIFJlY2VpdmVkIENvdW50IChMb3cpICovCisjZGVmaW5lIElYR0JfVVBSQ0ggICAweDAyMDI0CS8qIFVuaWNhc3QgUGFja2V0cyBSZWNlaXZlZCBDb3VudCAoSGlnaCkgKi8KKyNkZWZpbmUgSVhHQl9WUFJDTCAgIDB4MDIwMjgJLyogVkxBTiBQYWNrZXRzIFJlY2VpdmVkIENvdW50IChMb3cpICovCisjZGVmaW5lIElYR0JfVlBSQ0ggICAweDAyMDJDCS8qIFZMQU4gUGFja2V0cyBSZWNlaXZlZCBDb3VudCAoSGlnaCkgKi8KKyNkZWZpbmUgSVhHQl9KUFJDTCAgIDB4MDIwMzAJLyogSnVtYm8gUGFja2V0cyBSZWNlaXZlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX0pQUkNIICAgMHgwMjAzNAkvKiBKdW1ibyBQYWNrZXRzIFJlY2VpdmVkIENvdW50IChIaWdoKSAqLworI2RlZmluZSBJWEdCX0dPUkNMICAgMHgwMjAzOAkvKiBHb29kIE9jdGV0cyBSZWNlaXZlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX0dPUkNIICAgMHgwMjAzQwkvKiBHb29kIE9jdGV0cyBSZWNlaXZlZCBDb3VudCAoSGlnaCkgKi8KKyNkZWZpbmUgSVhHQl9UT1JMICAgIDB4MDIwNDAJLyogVG90YWwgT2N0ZXRzIFJlY2VpdmVkIChMb3cpICovCisjZGVmaW5lIElYR0JfVE9SSCAgICAweDAyMDQ0CS8qIFRvdGFsIE9jdGV0cyBSZWNlaXZlZCAoSGlnaCkgKi8KKyNkZWZpbmUgSVhHQl9STkJDICAgIDB4MDIwNDgJLyogUmVjZWl2ZSBObyBCdWZmZXJzIENvdW50ICovCisjZGVmaW5lIElYR0JfUlVDICAgICAweDAyMDUwCS8qIFJlY2VpdmUgVW5kZXJzaXplIENvdW50ICovCisjZGVmaW5lIElYR0JfUk9DICAgICAweDAyMDU4CS8qIFJlY2VpdmUgT3ZlcnNpemUgQ291bnQgKi8KKyNkZWZpbmUgSVhHQl9STEVDICAgIDB4MDIwNjAJLyogUmVjZWl2ZSBMZW5ndGggRXJyb3IgQ291bnQgKi8KKyNkZWZpbmUgSVhHQl9DUkNFUlJTIDB4MDIwNjgJLyogQ1JDIEVycm9yIENvdW50ICovCisjZGVmaW5lIElYR0JfSUNCQyAgICAweDAyMDcwCS8qIElsbGVnYWwgY29udHJvbCBieXRlIGluIG1pZC1wYWNrZXQgQ291bnQgKi8KKyNkZWZpbmUgSVhHQl9FQ0JDICAgIDB4MDIwNzgJLyogRXJyb3IgQ29udHJvbCBieXRlIGluIG1pZC1wYWNrZXQgQ291bnQgKi8KKyNkZWZpbmUgSVhHQl9NUEMgICAgIDB4MDIwODAJLyogTWlzc2VkIFBhY2tldHMgQ291bnQgKi8KKyNkZWZpbmUgSVhHQl9UUFRMICAgIDB4MDIxMDAJLyogVG90YWwgUGFja2V0cyBUcmFuc21pdHRlZCAoTG93KSAqLworI2RlZmluZSBJWEdCX1RQVEggICAgMHgwMjEwNAkvKiBUb3RhbCBQYWNrZXRzIFRyYW5zbWl0dGVkIChIaWdoKSAqLworI2RlZmluZSBJWEdCX0dQVENMICAgMHgwMjEwOAkvKiBHb29kIFBhY2tldHMgVHJhbnNtaXR0ZWQgQ291bnQgKExvdykgKi8KKyNkZWZpbmUgSVhHQl9HUFRDSCAgIDB4MDIxMEMJLyogR29vZCBQYWNrZXRzIFRyYW5zbWl0dGVkIENvdW50IChIaWdoKSAqLworI2RlZmluZSBJWEdCX0JQVENMICAgMHgwMjExMAkvKiBCcm9hZGNhc3QgUGFja2V0cyBUcmFuc21pdHRlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX0JQVENIICAgMHgwMjExNAkvKiBCcm9hZGNhc3QgUGFja2V0cyBUcmFuc21pdHRlZCBDb3VudCAoSGlnaCkgKi8KKyNkZWZpbmUgSVhHQl9NUFRDTCAgIDB4MDIxMTgJLyogTXVsdGljYXN0IFBhY2tldHMgVHJhbnNtaXR0ZWQgQ291bnQgKExvdykgKi8KKyNkZWZpbmUgSVhHQl9NUFRDSCAgIDB4MDIxMUMJLyogTXVsdGljYXN0IFBhY2tldHMgVHJhbnNtaXR0ZWQgQ291bnQgKEhpZ2gpICovCisjZGVmaW5lIElYR0JfVVBUQ0wgICAweDAyMTIwCS8qIFVuaWNhc3QgUGFja2V0cyBUcmFuc21pdHRlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX1VQVENIICAgMHgwMjEyNAkvKiBVbmljYXN0IFBhY2tldHMgVHJhbnNtaXR0ZWQgQ291bnQgKEhpZ2gpICovCisjZGVmaW5lIElYR0JfVlBUQ0wgICAweDAyMTI4CS8qIFZMQU4gUGFja2V0cyBUcmFuc21pdHRlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX1ZQVENIICAgMHgwMjEyQwkvKiBWTEFOIFBhY2tldHMgVHJhbnNtaXR0ZWQgQ291bnQgKEhpZ2gpICovCisjZGVmaW5lIElYR0JfSlBUQ0wgICAweDAyMTMwCS8qIEp1bWJvIFBhY2tldHMgVHJhbnNtaXR0ZWQgQ291bnQgKExvdykgKi8KKyNkZWZpbmUgSVhHQl9KUFRDSCAgIDB4MDIxMzQJLyogSnVtYm8gUGFja2V0cyBUcmFuc21pdHRlZCBDb3VudCAoSGlnaCkgKi8KKyNkZWZpbmUgSVhHQl9HT1RDTCAgIDB4MDIxMzgJLyogR29vZCBPY3RldHMgVHJhbnNtaXR0ZWQgQ291bnQgKExvdykgKi8KKyNkZWZpbmUgSVhHQl9HT1RDSCAgIDB4MDIxM0MJLyogR29vZCBPY3RldHMgVHJhbnNtaXR0ZWQgQ291bnQgKEhpZ2gpICovCisjZGVmaW5lIElYR0JfVE9UTCAgICAweDAyMTQwCS8qIFRvdGFsIE9jdGV0cyBUcmFuc21pdHRlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX1RPVEggICAgMHgwMjE0NAkvKiBUb3RhbCBPY3RldHMgVHJhbnNtaXR0ZWQgQ291bnQgKEhpZ2gpICovCisjZGVmaW5lIElYR0JfREMgICAgICAweDAyMTQ4CS8qIERlZmVyIENvdW50ICovCisjZGVmaW5lIElYR0JfUExUNjRDICAweDAyMTUwCS8qIFBhY2tldCBUcmFuc21pdHRlZCB3YXMgbGVzcyB0aGFuIDY0IGJ5dGVzIENvdW50ICovCisjZGVmaW5lIElYR0JfVFNDVEMgICAweDAyMTcwCS8qIFRDUCBTZWdtZW50YXRpb24gQ29udGV4dCBUcmFuc21pdHRlZCBDb3VudCAqLworI2RlZmluZSBJWEdCX1RTQ1RGQyAgMHgwMjE3OAkvKiBUQ1AgU2VnbWVudGF0aW9uIENvbnRleHQgVHggRmFpbCBDb3VudCAqLworI2RlZmluZSBJWEdCX0lCSUMgICAgMHgwMjE4MAkvKiBJbGxlZ2FsIGJ5dGUgZHVyaW5nIElkbGUgc3RyZWFtIGNvdW50ICovCisjZGVmaW5lIElYR0JfUkZDICAgICAweDAyMTg4CS8qIFJlbW90ZSBGYXVsdCBDb3VudCAqLworI2RlZmluZSBJWEdCX0xGQyAgICAgMHgwMjE5MAkvKiBMb2NhbCBGYXVsdCBDb3VudCAqLworI2RlZmluZSBJWEdCX1BGUkMgICAgMHgwMjE5OAkvKiBQYXVzZSBGcmFtZSBSZWNlaXZlIENvdW50ICovCisjZGVmaW5lIElYR0JfUEZUQyAgICAweDAyMUEwCS8qIFBhdXNlIEZyYW1lIFRyYW5zbWl0IENvdW50ICovCisjZGVmaW5lIElYR0JfTUNGUkMgICAweDAyMUE4CS8qIE1BQyBDb250cm9sIEZyYW1lcyAobm9uLVBhdXNlKSBSZWNlaXZlZCBDb3VudCAqLworI2RlZmluZSBJWEdCX01DRlRDICAgMHgwMjFCMAkvKiBNQUMgQ29udHJvbCBGcmFtZXMgKG5vbi1QYXVzZSkgVHJhbnNtaXR0ZWQgQ291bnQgKi8KKyNkZWZpbmUgSVhHQl9YT05SWEMgIDB4MDIxQjgJLyogWE9OIFJlY2VpdmVkIENvdW50ICovCisjZGVmaW5lIElYR0JfWE9OVFhDICAweDAyMUMwCS8qIFhPTiBUcmFuc21pdHRlZCBDb3VudCAqLworI2RlZmluZSBJWEdCX1hPRkZSWEMgMHgwMjFDOAkvKiBYT0ZGIFJlY2VpdmVkIENvdW50ICovCisjZGVmaW5lIElYR0JfWE9GRlRYQyAweDAyMUQwCS8qIFhPRkYgVHJhbnNtaXR0ZWQgQ291bnQgKi8KKyNkZWZpbmUgSVhHQl9SSkMgICAgIDB4MDIxRDgJLyogUmVjZWl2ZSBKYWJiZXIgQ291bnQgKi8KKworLyogQ1RSTDAgQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfQ1RSTDBfTFJTVCAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBJWEdCX0NUUkwwX0pGRSAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSVhHQl9DVFJMMF9YTEUgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIElYR0JfQ1RSTDBfTURDUyAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBJWEdCX0NUUkwwX0NNREMgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgSVhHQl9DVFJMMF9TRFAwICAgICAweDAwMDQwMDAwCisjZGVmaW5lIElYR0JfQ1RSTDBfU0RQMSAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBJWEdCX0NUUkwwX1NEUDIgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgSVhHQl9DVFJMMF9TRFAzICAgICAweDAwMjAwMDAwCisjZGVmaW5lIElYR0JfQ1RSTDBfU0RQMF9ESVIgMHgwMDQwMDAwMAorI2RlZmluZSBJWEdCX0NUUkwwX1NEUDFfRElSIDB4MDA4MDAwMDAKKyNkZWZpbmUgSVhHQl9DVFJMMF9TRFAyX0RJUiAweDAxMDAwMDAwCisjZGVmaW5lIElYR0JfQ1RSTDBfU0RQM19ESVIgMHgwMjAwMDAwMAorI2RlZmluZSBJWEdCX0NUUkwwX1JTVCAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgSVhHQl9DVFJMMF9SUEUgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIElYR0JfQ1RSTDBfVFBFICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBJWEdCX0NUUkwwX1ZNRSAgICAgIDB4NDAwMDAwMDAKKworLyogQ1RSTDEgQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfQ1RSTDFfR1BJMF9FTiAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBJWEdCX0NUUkwxX0dQSTFfRU4gICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSVhHQl9DVFJMMV9HUEkyX0VOICAgICAweDAwMDAwMDA0CisjZGVmaW5lIElYR0JfQ1RSTDFfR1BJM19FTiAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBJWEdCX0NUUkwxX1NEUDQgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSVhHQl9DVFJMMV9TRFA1ICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIElYR0JfQ1RSTDFfU0RQNiAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBJWEdCX0NUUkwxX1NEUDcgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgSVhHQl9DVFJMMV9TRFA0X0RJUiAgICAweDAwMDAwMTAwCisjZGVmaW5lIElYR0JfQ1RSTDFfU0RQNV9ESVIgICAgMHgwMDAwMDIwMAorI2RlZmluZSBJWEdCX0NUUkwxX1NEUDZfRElSICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgSVhHQl9DVFJMMV9TRFA3X0RJUiAgICAweDAwMDAwODAwCisjZGVmaW5lIElYR0JfQ1RSTDFfRUVfUlNUICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBJWEdCX0NUUkwxX1JPX0RJUyAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSVhHQl9DVFJMMV9QQ0lYSE1fTUFTSyAweDAwQzAwMDAwCisjZGVmaW5lIElYR0JfQ1RSTDFfUENJWEhNXzFfMiAgMHgwMDAwMDAwMAorI2RlZmluZSBJWEdCX0NUUkwxX1BDSVhITV81XzggIDB4MDA0MDAwMDAKKyNkZWZpbmUgSVhHQl9DVFJMMV9QQ0lYSE1fM180ICAweDAwODAwMDAwCisjZGVmaW5lIElYR0JfQ1RSTDFfUENJWEhNXzdfOCAgMHgwMEMwMDAwMAorCisvKiBTVEFUVVMgQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfU1RBVFVTX0xVICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBJWEdCX1NUQVRVU19BSVAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSVhHQl9TVEFUVVNfVFhPRkYgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIElYR0JfU1RBVFVTX1hBVUlNRSAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBJWEdCX1NUQVRVU19SRVMgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSVhHQl9TVEFUVVNfUklTICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIElYR0JfU1RBVFVTX1JJRSAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBJWEdCX1NUQVRVU19STEYgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSVhHQl9TVEFUVVNfUlJGICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIElYR0JfU1RBVFVTX1BDSV9TUEQgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBJWEdCX1NUQVRVU19CVVM2NCAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgSVhHQl9TVEFUVVNfUENJWF9NT0RFICAgICAweDAwMDAyMDAwCisjZGVmaW5lIElYR0JfU1RBVFVTX1BDSVhfU1BEX01BU0sgMHgwMDAwQzAwMAorI2RlZmluZSBJWEdCX1NUQVRVU19QQ0lYX1NQRF82NiAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSVhHQl9TVEFUVVNfUENJWF9TUERfMTAwICAweDAwMDA0MDAwCisjZGVmaW5lIElYR0JfU1RBVFVTX1BDSVhfU1BEXzEzMyAgMHgwMDAwODAwMAorI2RlZmluZSBJWEdCX1NUQVRVU19SRVZfSURfTUFTSyAgIDB4MDAwRjAwMDAKKyNkZWZpbmUgSVhHQl9TVEFUVVNfUkVWX0lEX1NISUZUICAxNgorCisvKiBFRUNEIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX0VFQ0RfU0sgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBJWEdCX0VFQ0RfQ1MgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBJWEdCX0VFQ0RfREkgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBJWEdCX0VFQ0RfRE8gICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBJWEdCX0VFQ0RfRldFX01BU0sgMHgwMDAwMDAzMAorI2RlZmluZSBJWEdCX0VFQ0RfRldFX0RJUyAgMHgwMDAwMDAxMAorI2RlZmluZSBJWEdCX0VFQ0RfRldFX0VOICAgMHgwMDAwMDAyMAorCisvKiBNRlMgKi8KKyNkZWZpbmUgSVhHQl9NRlNfU0hJRlQgMTYKKworLyogSW50ZXJydXB0IFJlZ2lzdGVyIEJpdCBNYXNrcyAodXNlZCBmb3IgSUNSLCBJQ1MsIElNUywgYW5kIElNQykgKi8KKyNkZWZpbmUgSVhHQl9JTlRfVFhEVyAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBJWEdCX0lOVF9UWFFFICAgICAweDAwMDAwMDAyCisjZGVmaW5lIElYR0JfSU5UX0xTQyAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSVhHQl9JTlRfUlhTRVEgICAgMHgwMDAwMDAwOAorI2RlZmluZSBJWEdCX0lOVF9SWERNVDAgICAweDAwMDAwMDEwCisjZGVmaW5lIElYR0JfSU5UX1JYTyAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSVhHQl9JTlRfUlhUMCAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBJWEdCX0lOVF9BVVRPU0NBTiAweDAwMDAwMjAwCisjZGVmaW5lIElYR0JfSU5UX0dQSTAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgSVhHQl9JTlRfR1BJMSAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBJWEdCX0lOVF9HUEkyICAgICAweDAwMDAyMDAwCisjZGVmaW5lIElYR0JfSU5UX0dQSTMgICAgIDB4MDAwMDQwMDAKKworLyogUkNUTCBCaXQgTWFza3MgKi8KKyNkZWZpbmUgSVhHQl9SQ1RMX1JYRU4gICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSVhHQl9SQ1RMX1NCUCAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSVhHQl9SQ1RMX1VQRSAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSVhHQl9SQ1RMX01QRSAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSVhHQl9SQ1RMX1JETVRTX01BU0sgIDB4MDAwMDAzMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX1JETVRTXzFfMiAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX1JETVRTXzFfNCAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX1JETVRTXzFfOCAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX01PX01BU0sgICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX01PXzQ3XzM2ICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX01PXzQ2XzM1ICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX01PXzQ1XzM0ICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX01PXzQzXzMyICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX01PX1NISUZUICAgIDEyCisjZGVmaW5lIElYR0JfUkNUTF9CQU0gICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIElYR0JfUkNUTF9CU0laRV9NQVNLICAweDAwMDMwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9CU0laRV8yMDQ4ICAweDAwMDAwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9CU0laRV80MDk2ICAweDAwMDEwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9CU0laRV84MTkyICAweDAwMDIwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9CU0laRV8xNjM4NCAweDAwMDMwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9WRkUgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9DRklFTiAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9DRkkgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9SUERBX01BU0sgICAweDAwNjAwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9SUERBX01DX01BQyAweDAwMDAwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9NQ19PTkxZICAgICAweDAwNDAwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9DRkYgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9TRUNSQyAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIElYR0JfUkRUX0ZQREIgICAgICAgICAweDgwMDAwMDAwCisKKyNkZWZpbmUgSVhHQl9SQ1RMX0lETEVfUlhfVU5JVCAwCisKKy8qIEZDUlRMIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX0ZDUlRMX1hPTkUgICAgICAgMHg4MDAwMDAwMAorCisvKiBSWERDVEwgQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfUlhEQ1RMX1BUSFJFU0hfTUFTSyAgMHgwMDAwMDFGRgorI2RlZmluZSBJWEdCX1JYRENUTF9QVEhSRVNIX1NISUZUIDAKKyNkZWZpbmUgSVhHQl9SWERDVExfSFRIUkVTSF9NQVNLICAweDAwMDNGRTAwCisjZGVmaW5lIElYR0JfUlhEQ1RMX0hUSFJFU0hfU0hJRlQgOQorI2RlZmluZSBJWEdCX1JYRENUTF9XVEhSRVNIX01BU0sgIDB4MDdGQzAwMDAKKyNkZWZpbmUgSVhHQl9SWERDVExfV1RIUkVTSF9TSElGVCAxOAorCisvKiBSQUlEQyBCaXQgTWFza3MgKi8KKyNkZWZpbmUgSVhHQl9SQUlEQ19ISUdIVEhSU19NQVNLIDB4MDAwMDAwM0YKKyNkZWZpbmUgSVhHQl9SQUlEQ19ERUxBWV9NQVNLICAgIDB4MDAwRkY4MDAKKyNkZWZpbmUgSVhHQl9SQUlEQ19ERUxBWV9TSElGVCAgIDExCisjZGVmaW5lIElYR0JfUkFJRENfUE9MTF9NQVNLICAgICAweDFGRjAwMDAwCisjZGVmaW5lIElYR0JfUkFJRENfUE9MTF9TSElGVCAgICAyMAorI2RlZmluZSBJWEdCX1JBSURDX1JYVF9HQVRFICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBJWEdCX1JBSURDX0VOICAgICAgICAgICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIElYR0JfUkFJRENfUE9MTF8xMDAwX0lOVEVSUlVQVFNfUEVSX1NFQ09ORCAgICAgIDEyMjAKKyNkZWZpbmUgSVhHQl9SQUlEQ19QT0xMXzUwMDBfSU5URVJSVVBUU19QRVJfU0VDT05EICAgICAgMjQ0CisjZGVmaW5lIElYR0JfUkFJRENfUE9MTF8xMDAwMF9JTlRFUlJVUFRTX1BFUl9TRUNPTkQgICAgIDEyMgorI2RlZmluZSBJWEdCX1JBSURDX1BPTExfMjAwMDBfSU5URVJSVVBUU19QRVJfU0VDT05EICAgICA2MQorCisvKiBSWENTVU0gQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfUlhDU1VNX0lQT0ZMIDB4MDAwMDAxMDAKKyNkZWZpbmUgSVhHQl9SWENTVU1fVFVPRkwgMHgwMDAwMDIwMAorCisvKiBSQUggQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfUkFIX0FTRUxfTUFTSyAweDAwMDMwMDAwCisjZGVmaW5lIElYR0JfUkFIX0FTRUxfREVTVCAweDAwMDAwMDAwCisjZGVmaW5lIElYR0JfUkFIX0FTRUxfU1JDICAweDAwMDEwMDAwCisjZGVmaW5lIElYR0JfUkFIX0FWICAgICAgICAweDgwMDAwMDAwCisKKy8qIFRDVEwgQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfVENUTF9UQ0UgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSVhHQl9UQ1RMX1RYRU4gMHgwMDAwMDAwMgorI2RlZmluZSBJWEdCX1RDVExfVFBERSAweDAwMDAwMDA0CisKKyNkZWZpbmUgSVhHQl9UQ1RMX0lETEVfVFhfVU5JVCAgMAorCisvKiBUWERDVEwgQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfVFhEQ1RMX1BUSFJFU0hfTUFTSyAgMHgwMDAwMDA3RgorI2RlZmluZSBJWEdCX1RYRENUTF9IVEhSRVNIX01BU0sgIDB4MDAwMDdGMDAKKyNkZWZpbmUgSVhHQl9UWERDVExfSFRIUkVTSF9TSElGVCA4CisjZGVmaW5lIElYR0JfVFhEQ1RMX1dUSFJFU0hfTUFTSyAgMHgwMDdGMDAwMAorI2RlZmluZSBJWEdCX1RYRENUTF9XVEhSRVNIX1NISUZUIDE2CisKKy8qIFRTUE1UIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX1RTUE1UX1RTTVRfTUFTSyAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgSVhHQl9UU1BNVF9UU1BCUF9NQVNLICAweEZGRkYwMDAwCisjZGVmaW5lIElYR0JfVFNQTVRfVFNQQlBfU0hJRlQgMTYKKworLyogUEFQIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX1BBUF9UWFBDX01BU0sgMHgwMDAwRkZGRgorI2RlZmluZSBJWEdCX1BBUF9UWFBWX01BU0sgMHgwMDBGMDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzEwRyAgMHgwMDAwMDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzFHICAgMHgwMDAxMDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzJHICAgMHgwMDAyMDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzNHICAgMHgwMDAzMDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzRHICAgMHgwMDA0MDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzVHICAgMHgwMDA1MDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzZHICAgMHgwMDA2MDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzdHICAgMHgwMDA3MDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzhHICAgMHgwMDA4MDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzlHICAgMHgwMDA5MDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWX1dBTiAgMHgwMDBGMDAwMAorCisvKiBQQ1NDMSBCaXQgTWFza3MgKi8KKyNkZWZpbmUgSVhHQl9QQ1NDMV9MT09QQkFDSyAweDAwMDA0MDAwCisKKy8qIFBDU0MyIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX1BDU0MyX1BDU19UWVBFX01BU0sgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSVhHQl9QQ1NDMl9QQ1NfVFlQRV8xMEdCWCAweDAwMDAwMDAxCisKKy8qIFBDU1MxIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX1BDU1MxX0xPQ0FMX0ZBVUxUICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgSVhHQl9QQ1NTMV9SWF9MSU5LX1NUQVRVUyAweDAwMDAwMDA0CisKKy8qIFBDU1MyIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX1BDU1MyX0RFVl9QUkVTX01BU0sgMHgwMDAwQzAwMAorI2RlZmluZSBJWEdCX1BDU1MyX0RFVl9QUkVTICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBJWEdCX1BDU1MyX1RYX0xGICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBJWEdCX1BDU1MyX1JYX0xGICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBJWEdCX1BDU1MyXzEwR0JXICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBJWEdCX1BDU1MyXzEwR0JYICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBJWEdCX1BDU1MyXzEwR0JSICAgICAgICAgMHgwMDAwMDAwMQorCisvKiBYUENTUyBCaXQgTWFza3MgKi8KKyNkZWZpbmUgSVhHQl9YUENTU19BTElHTl9TVEFUVVMgMHgwMDAwMTAwMAorI2RlZmluZSBJWEdCX1hQQ1NTX1BBVFRFUk5fVEVTVCAweDAwMDAwODAwCisjZGVmaW5lIElYR0JfWFBDU1NfTEFORV8zX1NZTkMgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSVhHQl9YUENTU19MQU5FXzJfU1lOQyAgMHgwMDAwMDAwNAorI2RlZmluZSBJWEdCX1hQQ1NTX0xBTkVfMV9TWU5DICAweDAwMDAwMDAyCisjZGVmaW5lIElYR0JfWFBDU1NfTEFORV8wX1NZTkMgIDB4MDAwMDAwMDEKKworLyogWFBDU1RDIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX1hQQ1NUQ19CRVJUX1RSSUcgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBJWEdCX1hQQ1NUQ19CRVJUX1NTVCAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBJWEdCX1hQQ1NUQ19CRVJUX1BTWl9NQVNLICAgMHgwMDBDMDAwMAorI2RlZmluZSBJWEdCX1hQQ1NUQ19CRVJUX1BTWl9TSElGVCAgMTcKKyNkZWZpbmUgSVhHQl9YUENTVENfQkVSVF9QU1pfSU5GICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSVhHQl9YUENTVENfQkVSVF9QU1pfNjggICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSVhHQl9YUENTVENfQkVSVF9QU1pfMTAyOCAgIDB4MDAwMDAwMDAKKworLyogTVNDQSBiaXQgTWFza3MgKi8KKy8qIE5ldyBQcm90b2NvbCBBZGRyZXNzICovCisjZGVmaW5lIElYR0JfTVNDQV9OUF9BRERSX01BU0sgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIElYR0JfTVNDQV9OUF9BRERSX1NISUZUICAgICAwCisvKiBFaXRoZXIgRGV2aWNlIFR5cGUgb3IgUmVnaXN0ZXIgQWRkcmVzcyxkZXBlbmRpbmcgb24gU1RfQ09ERSAqLworI2RlZmluZSBJWEdCX01TQ0FfREVWX1RZUEVfTUFTSyAgICAgMHgwMDFGMDAwMAorI2RlZmluZSBJWEdCX01TQ0FfREVWX1RZUEVfU0hJRlQgICAgMTYKKyNkZWZpbmUgSVhHQl9NU0NBX1BIWV9BRERSX01BU0sgICAgIDB4MDNFMDAwMDAKKyNkZWZpbmUgSVhHQl9NU0NBX1BIWV9BRERSX1NISUZUICAgIDIxCisjZGVmaW5lIElYR0JfTVNDQV9PUF9DT0RFX01BU0sgICAgICAweDBDMDAwMDAwCisvKiBPUF9DT0RFID09IDAwLCBBZGRyZXNzIGN5Y2xlLCBOZXcgUHJvdG9jb2wgICAgICAgICAgICovCisvKiBPUF9DT0RFID09IDAxLCBXcml0ZSBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPUF9DT0RFID09IDEwLCBSZWFkIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPUF9DT0RFID09IDExLCBSZWFkLCBhdXRvIGluY3JlbWVudCwgTmV3IFByb3RvY29sICAgICovCisjZGVmaW5lIElYR0JfTVNDQV9BRERSX0NZQ0xFICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIElYR0JfTVNDQV9XUklURSAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIElYR0JfTVNDQV9SRUFEICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIElYR0JfTVNDQV9SRUFEX0FVVE9JTkMgICAgICAweDBDMDAwMDAwCisjZGVmaW5lIElYR0JfTVNDQV9PUF9DT0RFX1NISUZUICAgICAyNgorI2RlZmluZSBJWEdCX01TQ0FfU1RfQ09ERV9NQVNLICAgICAgMHgzMDAwMDAwMAorLyogU1RfQ09ERSA9PSAwMCwgTmV3IFByb3RvY29sICAqLworLyogU1RfQ09ERSA9PSAwMSwgT2xkIFByb3RvY29sICAqLworI2RlZmluZSBJWEdCX01TQ0FfTkVXX1BST1RPQ09MICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBJWEdCX01TQ0FfT0xEX1BST1RPQ09MICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBJWEdCX01TQ0FfU1RfQ09ERV9TSElGVCAgICAgMjgKKy8qIEluaXRpYXRlIGNvbW1hbmQsIHNlbGYtY2xlYXJpbmcgd2hlbiBjb21tYW5kIGNvbXBsZXRlcyAqLworI2RlZmluZSBJWEdCX01TQ0FfTURJX0NPTU1BTkQgICAgICAgMHg0MDAwMDAwMAorLypNREkgSW4gUHJvZ3Jlc3MgRW5hYmxlLiAqLworI2RlZmluZSBJWEdCX01TQ0FfTURJX0lOX1BST0dfRU4gICAgMHg4MDAwMDAwMAorCisvKiBNU1JXRCBiaXQgbWFza3MgKi8KKyNkZWZpbmUgSVhHQl9NU1JXRF9XUklURV9EQVRBX01BU0sgIDB4MDAwMEZGRkYKKyNkZWZpbmUgSVhHQl9NU1JXRF9XUklURV9EQVRBX1NISUZUIDAKKyNkZWZpbmUgSVhHQl9NU1JXRF9SRUFEX0RBVEFfTUFTSyAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgSVhHQl9NU1JXRF9SRUFEX0RBVEFfU0hJRlQgIDE2CisKKy8qIERlZmluaXRpb25zIGZvciB0aGUgb3B0aWNzIGRldmljZXMgb24gdGhlIE1ESU8gYnVzLiAqLworI2RlZmluZSBJWEdCX1BIWV9BRERSRVNTICAgICAgICAgICAgIDB4MAkvKiBTaW5nbGUgUEhZLCBtdWx0aXBsZSAiRGV2aWNlcyIgKi8KKworLyogU3RhbmRhcmQgZml2ZS1iaXQgRGV2aWNlIElEcy4gIFNlZSBJRUVFIDgwMi4zYWUsIGNsYXVzZSA0NSAqLworI2RlZmluZSBNRElPX1BNQV9QTURfRElEICAgICAgICAweDAxCisjZGVmaW5lIE1ESU9fV0lTX0RJRCAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTURJT19QQ1NfRElEICAgICAgICAgICAgMHgwMworI2RlZmluZSBNRElPX1hHWFNfRElEICAgICAgICAgICAweDA0CisKKy8qIFN0YW5kYXJkIFBNQS9QTUQgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMuICovCisvKiBOb3RlOiBUaGlzIGlzIGEgdmVyeSBsaW1pdGVkIHNldCBvZiBkZWZpbml0aW9ucywgICAgICAqLworLyogb25seSBpbXBsZW1lbnRlZCBmZWF0dXJlcyBhcmUgZGVmaW5lZC4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTURJT19QTUFfUE1EX0NSMSAgICAgICAgMHgwMDAwCisjZGVmaW5lIE1ESU9fUE1BX1BNRF9DUjFfUkVTRVQgIDB4ODAwMAorCisjZGVmaW5lIE1ESU9fUE1BX1BNRF9YUEFLX1ZFTkRPUl9OQU1FICAgICAgIDB4ODAzQQkvKiBYUEFLL1hFTlBBSyBkZXZpY2VzIG9ubHkgKi8KKworLyogVmVuZG9yLXNwZWNpZmljIE1ESU8gcmVnaXN0ZXJzICovCisjZGVmaW5lIEc2WFhYX1BNQV9QTURfVlMxICAgICAgICAgICAgICAgICAgIDB4QzAwMQkvKiBWZW5kb3Itc3BlY2lmaWMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRzZYWFhfWEdYU19YQVVJX1ZTMiAgICAgICAgICAgICAgICAgMHgxOAkvKiBWZW5kb3Itc3BlY2lmaWMgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBHNlhYWF9QTUFfUE1EX1ZTMV9QTExfUkVTRVQgICAgICAgICAweDgwCisjZGVmaW5lIEc2WFhYX1BNQV9QTURfVlMxX1JFTU9WRV9QTExfUkVTRVQgIDB4MDAKKyNkZWZpbmUgRzZYWFhfWEdYU19YQVVJX1ZTMl9JTlBVVF9NQVNLICAgICAgMHgwRgkvKiBYQVVJIGxhbmVzIHN5bmNocm9uaXplZCAqLworCisvKiBMYXlvdXQgb2YgYSBzaW5nbGUgcmVjZWl2ZSBkZXNjcmlwdG9yLiAgVGhlIGNvbnRyb2xsZXIgYXNzdW1lcyB0aGF0IHRoaXMKKyAqIHN0cnVjdHVyZSBpcyBwYWNrZWQgaW50byAxNiBieXRlcywgd2hpY2ggaXMgYSBzYWZlIGFzc3VtcHRpb24gd2l0aCBtb3N0CisgKiBjb21waWxlcnMuICBIb3dldmVyLCBzb21lIGNvbXBpbGVycyBtYXkgaW5zZXJ0IHBhZGRpbmcgYmV0d2VlbiB0aGUgZmllbGRzLAorICogaW4gd2hpY2ggY2FzZSB0aGUgc3RydWN0dXJlIG11c3QgYmUgcGFja2VkIGluIHNvbWUgY29tcGlsZXItc3BlY2lmaWMKKyAqIG1hbm5lci4gKi8KK3N0cnVjdCBpeGdiX3J4X2Rlc2MgeworCXVpbnQ2NF90IGJ1ZmZfYWRkcjsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDE2X3QgcmVzZXJ2ZWQ7CisJdWludDhfdCBzdGF0dXM7CisJdWludDhfdCBlcnJvcnM7CisJdWludDE2X3Qgc3BlY2lhbDsKK307CisKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX1NUQVRVU19ERCAgICAweDAxCisjZGVmaW5lIElYR0JfUlhfREVTQ19TVEFUVVNfRU9QICAgMHgwMgorI2RlZmluZSBJWEdCX1JYX0RFU0NfU1RBVFVTX0lYU00gIDB4MDQKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX1NUQVRVU19WUCAgICAweDA4CisjZGVmaW5lIElYR0JfUlhfREVTQ19TVEFUVVNfVENQQ1MgMHgyMAorI2RlZmluZSBJWEdCX1JYX0RFU0NfU1RBVFVTX0lQQ1MgIDB4NDAKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX1NUQVRVU19QSUYgICAweDgwCisKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX0VSUk9SU19DRSAgIDB4MDEKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX0VSUk9SU19TRSAgIDB4MDIKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX0VSUk9SU19QICAgIDB4MDgKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX0VSUk9SU19UQ1BFIDB4MjAKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX0VSUk9SU19JUEUgIDB4NDAKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX0VSUk9SU19SWEUgIDB4ODAKKworI2RlZmluZSBJWEdCX1JYX0RFU0NfU1BFQ0lBTF9WTEFOX01BU0sgIDB4MEZGRgkvKiBWTEFOIElEIGlzIGluIGxvd2VyIDEyIGJpdHMgKi8KKyNkZWZpbmUgSVhHQl9SWF9ERVNDX1NQRUNJQUxfUFJJX01BU0sgICAweEUwMDAJLyogUHJpb3JpdHkgaXMgaW4gdXBwZXIgMyBiaXRzICovCisjZGVmaW5lIElYR0JfUlhfREVTQ19TUEVDSUFMX1BSSV9TSElGVCAgMHgwMDBECS8qIFByaW9yaXR5IGlzIGluIHVwcGVyIDMgb2YgMTYgKi8KKworLyogTGF5b3V0IG9mIGEgc2luZ2xlIHRyYW5zbWl0IGRlc2NyaXB0b3IuICBUaGUgY29udHJvbGxlciBhc3N1bWVzIHRoYXQgdGhpcworICogc3RydWN0dXJlIGlzIHBhY2tlZCBpbnRvIDE2IGJ5dGVzLCB3aGljaCBpcyBhIHNhZmUgYXNzdW1wdGlvbiB3aXRoIG1vc3QKKyAqIGNvbXBpbGVycy4gIEhvd2V2ZXIsIHNvbWUgY29tcGlsZXJzIG1heSBpbnNlcnQgcGFkZGluZyBiZXR3ZWVuIHRoZSBmaWVsZHMsCisgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJ1Y3R1cmUgbXVzdCBiZSBwYWNrZWQgaW4gc29tZSBjb21waWxlci1zcGVjaWZpYworICogbWFubmVyLiAqLworc3RydWN0IGl4Z2JfdHhfZGVzYyB7CisJdWludDY0X3QgYnVmZl9hZGRyOworCXVpbnQzMl90IGNtZF90eXBlX2xlbjsKKwl1aW50OF90IHN0YXR1czsKKwl1aW50OF90IHBvcHRzOworCXVpbnQxNl90IHZsYW47Cit9OworCisjZGVmaW5lIElYR0JfVFhfREVTQ19MRU5HVEhfTUFTSyAgICAweDAwMEZGRkZGCisjZGVmaW5lIElYR0JfVFhfREVTQ19UWVBFX01BU0sgICAgICAweDAwRjAwMDAwCisjZGVmaW5lIElYR0JfVFhfREVTQ19UWVBFX1NISUZUICAgICAyMAorI2RlZmluZSBJWEdCX1RYX0RFU0NfQ01EX01BU0sgICAgICAgMHhGRjAwMDAwMAorI2RlZmluZSBJWEdCX1RYX0RFU0NfQ01EX1NISUZUICAgICAgMjQKKyNkZWZpbmUgSVhHQl9UWF9ERVNDX0NNRF9FT1AgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgSVhHQl9UWF9ERVNDX0NNRF9UU0UgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgSVhHQl9UWF9ERVNDX0NNRF9SUyAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgSVhHQl9UWF9ERVNDX0NNRF9WTEUgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgSVhHQl9UWF9ERVNDX0NNRF9JREUgICAgICAgIDB4ODAwMDAwMDAKKworI2RlZmluZSBJWEdCX1RYX0RFU0NfVFlQRSAgICAgICAgICAgMHgwMDEwMDAwMAorCisjZGVmaW5lIElYR0JfVFhfREVTQ19TVEFUVVNfREQgIDB4MDEKKworI2RlZmluZSBJWEdCX1RYX0RFU0NfUE9QVFNfSVhTTSAweDAxCisjZGVmaW5lIElYR0JfVFhfREVTQ19QT1BUU19UWFNNIDB4MDIKKyNkZWZpbmUgSVhHQl9UWF9ERVNDX1NQRUNJQUxfUFJJX1NISUZUICBJWEdCX1JYX0RFU0NfU1BFQ0lBTF9QUklfU0hJRlQJLyogUHJpb3JpdHkgaXMgaW4gdXBwZXIgMyBvZiAxNiAqLworCitzdHJ1Y3QgaXhnYl9jb250ZXh0X2Rlc2MgeworCXVpbnQ4X3QgaXBjc3M7CisJdWludDhfdCBpcGNzbzsKKwl1aW50MTZfdCBpcGNzZTsKKwl1aW50OF90IHR1Y3NzOworCXVpbnQ4X3QgdHVjc287CisJdWludDE2X3QgdHVjc2U7CisJdWludDMyX3QgY21kX3R5cGVfbGVuOworCXVpbnQ4X3Qgc3RhdHVzOworCXVpbnQ4X3QgaGRyX2xlbjsKKwl1aW50MTZfdCBtc3M7Cit9OworCisjZGVmaW5lIElYR0JfQ09OVEVYVF9ERVNDX0NNRF9UQ1AgMHgwMTAwMDAwMAorI2RlZmluZSBJWEdCX0NPTlRFWFRfREVTQ19DTURfSVAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgSVhHQl9DT05URVhUX0RFU0NfQ01EX1RTRSAweDA0MDAwMDAwCisjZGVmaW5lIElYR0JfQ09OVEVYVF9ERVNDX0NNRF9SUyAgMHgwODAwMDAwMAorI2RlZmluZSBJWEdCX0NPTlRFWFRfREVTQ19DTURfSURFIDB4ODAwMDAwMDAKKworI2RlZmluZSBJWEdCX0NPTlRFWFRfREVTQ19UWVBFIDB4MDAwMDAwMDAKKworI2RlZmluZSBJWEdCX0NPTlRFWFRfREVTQ19TVEFUVVNfREQgMHgwMQorCisvKiBGaWx0ZXJzICovCisjZGVmaW5lIElYR0JfTUNfVEJMX1NJWkUgICAgICAgICAgMTI4CS8qIE11bHRpY2FzdCBGaWx0ZXIgVGFibGUgKDQwOTYgYml0cykgKi8KKyNkZWZpbmUgSVhHQl9WTEFOX0ZJTFRFUl9UQkxfU0laRSAxMjgJLyogVkxBTiBGaWx0ZXIgVGFibGUgKDQwOTYgYml0cykgKi8KKyNkZWZpbmUgSVhHQl9SQVJfRU5UUklFUwkJICAzCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIFJ4IEFkZHJlc3MgYXJyYXkgKi8KKworI2RlZmluZSBJWEdCX01FTU9SWV9SRUdJU1RFUl9CQVNFX0FERFJFU1MgICAwCisjZGVmaW5lIEVORVRfSEVBREVSX1NJWkUJCQkxNAorI2RlZmluZSBFTkVUX0ZDU19MRU5HVEgJCQkgNAorI2RlZmluZSBJWEdCX01BWF9OVU1fTVVMVElDQVNUX0FERFJFU1NFUwkxMjgKKyNkZWZpbmUgSVhHQl9NSU5fRU5FVF9GUkFNRV9TSVpFX1dJVEhPVVRfRkNTCTYwCisjZGVmaW5lIElYR0JfTUFYX0VORVRfRlJBTUVfU0laRV9XSVRIT1VUX0ZDUwkxNTE0CisjZGVmaW5lIElYR0JfTUFYX0pVTUJPX0ZSQU1FX1NJWkUJCTB4M0YwMAorCisvKiBQaHkgQWRkcmVzc2VzICovCisjZGVmaW5lIElYR0JfT1BUSUNBTF9QSFlfQUREUiAweDAJLyogT3B0aWNhbCBNb2R1bGUgcGh5IGFkZHJlc3MgKi8KKyNkZWZpbmUgSVhHQl9YQVVJSV9QSFlfQUREUiAgIDB4MQkvKiBYYXVpaSB0cmFuc2NlaXZlciBwaHkgYWRkcmVzcyAqLworI2RlZmluZSBJWEdCX0RJQUdfUEhZX0FERFIgICAgMHgxRgkvKiBEaWFnbm9zdGljIERldmljZSBwaHkgYWRkcmVzcyAqLworCisvKiBUaGlzIHN0cnVjdHVyZSB0YWtlcyBhIDY0ayBmbGFzaCBhbmQgbWFwcyBpdCBmb3IgaWRlbnRpZmljYXRpb24gY29tbWFuZHMgKi8KK3N0cnVjdCBpeGdiX2ZsYXNoX2J1ZmZlciB7CisJdWludDhfdCBtYW51ZmFjdHVyZXJfaWQ7CisJdWludDhfdCBkZXZpY2VfaWQ7CisJdWludDhfdCBmaWxsZXIxWzB4MkFBOF07CisJdWludDhfdCBjbWQyOworCXVpbnQ4X3QgZmlsbGVyMlsweDJBQUFdOworCXVpbnQ4X3QgY21kMTsKKwl1aW50OF90IGZpbGxlcjNbMHhBQUFBXTsKK307CisKKy8qCisgKiBUaGlzIGlzIGEgbGl0dGxlLWVuZGlhbiBzcGVjaWZpYyBjaGVjay4KKyAqLworI2RlZmluZSBJU19NVUxUSUNBU1QoQWRkcmVzcykgXAorICAgIChib29sZWFuX3QpKCgodWludDhfdCAqKShBZGRyZXNzKSlbMF0gJiAoKHVpbnQ4X3QpMHgwMSkpCisKKy8qCisgKiBDaGVjayB3aGV0aGVyIGFuIGFkZHJlc3MgaXMgYnJvYWRjYXN0LgorICovCisjZGVmaW5lIElTX0JST0FEQ0FTVChBZGRyZXNzKSAgICAgICAgICAgICAgIFwKKyAgICAoKCgodWludDhfdCAqKShBZGRyZXNzKSlbMF0gPT0gKCh1aW50OF90KTB4ZmYpKSAmJiAoKCh1aW50OF90ICopKEFkZHJlc3MpKVsxXSA9PSAoKHVpbnQ4X3QpMHhmZikpKQorCisvKiBGbG93IGNvbnRyb2wgcGFyYW1ldGVycyAqLworc3RydWN0IGl4Z2JfZmMgeworCXVpbnQzMl90IGhpZ2hfd2F0ZXI7CS8qIEZsb3cgQ29udHJvbCBIaWdoLXdhdGVyICAgICAgICAgICovCisJdWludDMyX3QgbG93X3dhdGVyOwkvKiBGbG93IENvbnRyb2wgTG93LXdhdGVyICAgICAgICAgICAqLworCXVpbnQxNl90IHBhdXNlX3RpbWU7CS8qIEZsb3cgQ29udHJvbCBQYXVzZSB0aW1lciAgICAgICAgICovCisJYm9vbGVhbl90IHNlbmRfeG9uOwkvKiBGbG93IGNvbnRyb2wgc2VuZCBYT04gICAgICAgICAgICAqLworCWl4Z2JfZmNfdHlwZSB0eXBlOwkvKiBUeXBlIG9mIGZsb3cgY29udHJvbCAgICAgICAgICAgICAqLworfTsKKworLyogVGhlIGhpc3RvcmljYWwgZGVmYXVsdHMgZm9yIHRoZSBmbG93IGNvbnRyb2wgdmFsdWVzIGFyZSBnaXZlbiBiZWxvdy4gKi8KKyNkZWZpbmUgRkNfREVGQVVMVF9ISV9USFJFU0ggICAgICAgICgweDgwMDApCS8qIDMyS0IgKi8KKyNkZWZpbmUgRkNfREVGQVVMVF9MT19USFJFU0ggICAgICAgICgweDQwMDApCS8qIDE2S0IgKi8KKyNkZWZpbmUgRkNfREVGQVVMVF9UWF9USU1FUiAgICAgICAgICgweDEwMCkJLyogfjEzMCB1cyAqLworCisvKiBQaHkgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgSVhHQl9NQVhfUEhZX1JFR19BRERSRVNTICAgIDB4RkZGRgorI2RlZmluZSBJWEdCX01BWF9QSFlfQUREUkVTUyAgICAgICAgMzEKKyNkZWZpbmUgSVhHQl9NQVhfUEhZX0RFVl9UWVBFICAgICAgIDMxCisKKy8qIEJ1cyBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgaXhnYl9idXMgeworCWl4Z2JfYnVzX3NwZWVkIHNwZWVkOworCWl4Z2JfYnVzX3dpZHRoIHdpZHRoOworCWl4Z2JfYnVzX3R5cGUgdHlwZTsKK307CisKK3N0cnVjdCBpeGdiX2h3IHsKKwl1aW50OF90IF9faW9tZW0gKmh3X2FkZHI7LyogQmFzZSBBZGRyZXNzIG9mIHRoZSBoYXJkd2FyZSAgICAgKi8KKwl2b2lkICpiYWNrOwkJLyogUG9pbnRlciB0byBPUy1kZXBlbmRlbnQgc3RydWN0ICAgKi8KKwlzdHJ1Y3QgaXhnYl9mYyBmYzsJLyogRmxvdyBjb250cm9sIHBhcmFtZXRlcnMgICAgICAgICAgKi8KKwlzdHJ1Y3QgaXhnYl9idXMgYnVzOwkvKiBCdXMgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAqLworCXVpbnQzMl90IHBoeV9pZDsJLyogUGh5IElkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgKi8KKwl1aW50MzJfdCBwaHlfYWRkcjsJLyogWEdNSUkgYWRkcmVzcyBvZiBQaHkgICAgICAgICAgICAgKi8KKwlpeGdiX21hY190eXBlIG1hY190eXBlOwkvKiBJZGVudGlmaWVyIGZvciBNQUMgY29udHJvbGxlciAgICAqLworCWl4Z2JfcGh5X3R5cGUgcGh5X3R5cGU7CS8qIFRyYW5zY2VpdmVyL3BoeSBpZGVudGlmaWVyICAgICAgICovCisJdWludDMyX3QgbWF4X2ZyYW1lX3NpemU7CS8qIE1heGltdW0gZnJhbWUgc2l6ZSBzdXBwb3J0ZWQgICAgICovCisJdWludDMyX3QgbWNfZmlsdGVyX3R5cGU7CS8qIE11bHRpY2FzdCBmaWx0ZXIgaGFzaCB0eXBlICAgICAgICovCisJdWludDMyX3QgbnVtX21jX2FkZHJzOwkvKiBOdW1iZXIgb2YgY3VycmVudCBNdWx0aWNhc3QgYWRkcnMgKi8KKwl1aW50OF90IGN1cnJfbWFjX2FkZHJbSVhHQl9FVEhfTEVOR1RIX09GX0FERFJFU1NdOwkvKiBJbmRpdmlkdWFsIGFkZHJlc3MgY3VycmVudGx5IHByb2dyYW1tZWQgaW4gTUFDICovCisJdWludDMyX3QgbnVtX3R4X2Rlc2M7CS8qIE51bWJlciBvZiBUcmFuc21pdCBkZXNjcmlwdG9ycyAgICovCisJdWludDMyX3QgbnVtX3J4X2Rlc2M7CS8qIE51bWJlciBvZiBSZWNlaXZlIGRlc2NyaXB0b3JzICAgICovCisJdWludDMyX3QgcnhfYnVmZmVyX3NpemU7CS8qIFNpemUgb2YgUmVjZWl2ZSBidWZmZXIgICAgICAgICAgICovCisJYm9vbGVhbl90IGxpbmtfdXA7CS8qIFRSVUUgaWYgbGluayBpcyB2YWxpZCAgICAgICAgICAgICovCisJYm9vbGVhbl90IGFkYXB0ZXJfc3RvcHBlZDsJLyogU3RhdGUgb2YgYWRhcHRlciAgICAgICAgICAgICAgICAgKi8KKwl1aW50MTZfdCBkZXZpY2VfaWQ7CS8qIGRldmljZSBpZCBmcm9tIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlICovCisJdWludDE2X3QgdmVuZG9yX2lkOwkvKiB2ZW5kb3IgaWQgZnJvbSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSAqLworCXVpbnQ4X3QgcmV2aXNpb25faWQ7CS8qIHJldmlzaW9uIGlkIGZyb20gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgKi8KKwl1aW50MTZfdCBzdWJzeXN0ZW1fdmVuZG9yX2lkOwkvKiBzdWJzeXN0ZW0gdmVuZG9yIGlkIGZyb20gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgKi8KKwl1aW50MTZfdCBzdWJzeXN0ZW1faWQ7CS8qIHN1YnN5c3RlbSBpZCBmcm9tIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlICovCisJdWludDMyX3QgYmFyMDsJCS8qIEJhc2UgQWRkcmVzcyByZWdpc3RlcnMgICAgICAgICAgICovCisJdWludDMyX3QgYmFyMTsKKwl1aW50MzJfdCBiYXIyOworCXVpbnQzMl90IGJhcjM7CisJdWludDE2X3QgcGNpX2NtZF93b3JkOwkvKiBQQ0kgY29tbWFuZCByZWdpc3RlciBpZCBmcm9tIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlICovCisJdWludDE2X3QgZWVwcm9tW0lYR0JfRUVQUk9NX1NJWkVdOwkvKiBFRVBST00gY29udGVudHMgcmVhZCBhdCBpbml0IHRpbWUgICovCisJdW5zaWduZWQgbG9uZyBpb19iYXNlOwkvKiBPdXIgSS9PIG1hcHBlZCBsb2NhdGlvbiAqLworCXVpbnQzMl90IGxhc3RMRkM7CisJdWludDMyX3QgbGFzdFJGQzsKK307CisKKy8qIFN0YXRpc3RpY3MgcmVwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlICovCitzdHJ1Y3QgaXhnYl9od19zdGF0cyB7CisJdWludDY0X3QgdHBybDsKKwl1aW50NjRfdCB0cHJoOworCXVpbnQ2NF90IGdwcmNsOworCXVpbnQ2NF90IGdwcmNoOworCXVpbnQ2NF90IGJwcmNsOworCXVpbnQ2NF90IGJwcmNoOworCXVpbnQ2NF90IG1wcmNsOworCXVpbnQ2NF90IG1wcmNoOworCXVpbnQ2NF90IHVwcmNsOworCXVpbnQ2NF90IHVwcmNoOworCXVpbnQ2NF90IHZwcmNsOworCXVpbnQ2NF90IHZwcmNoOworCXVpbnQ2NF90IGpwcmNsOworCXVpbnQ2NF90IGpwcmNoOworCXVpbnQ2NF90IGdvcmNsOworCXVpbnQ2NF90IGdvcmNoOworCXVpbnQ2NF90IHRvcmw7CisJdWludDY0X3QgdG9yaDsKKwl1aW50NjRfdCBybmJjOworCXVpbnQ2NF90IHJ1YzsKKwl1aW50NjRfdCByb2M7CisJdWludDY0X3QgcmxlYzsKKwl1aW50NjRfdCBjcmNlcnJzOworCXVpbnQ2NF90IGljYmM7CisJdWludDY0X3QgZWNiYzsKKwl1aW50NjRfdCBtcGM7CisJdWludDY0X3QgdHB0bDsKKwl1aW50NjRfdCB0cHRoOworCXVpbnQ2NF90IGdwdGNsOworCXVpbnQ2NF90IGdwdGNoOworCXVpbnQ2NF90IGJwdGNsOworCXVpbnQ2NF90IGJwdGNoOworCXVpbnQ2NF90IG1wdGNsOworCXVpbnQ2NF90IG1wdGNoOworCXVpbnQ2NF90IHVwdGNsOworCXVpbnQ2NF90IHVwdGNoOworCXVpbnQ2NF90IHZwdGNsOworCXVpbnQ2NF90IHZwdGNoOworCXVpbnQ2NF90IGpwdGNsOworCXVpbnQ2NF90IGpwdGNoOworCXVpbnQ2NF90IGdvdGNsOworCXVpbnQ2NF90IGdvdGNoOworCXVpbnQ2NF90IHRvdGw7CisJdWludDY0X3QgdG90aDsKKwl1aW50NjRfdCBkYzsKKwl1aW50NjRfdCBwbHQ2NGM7CisJdWludDY0X3QgdHNjdGM7CisJdWludDY0X3QgdHNjdGZjOworCXVpbnQ2NF90IGliaWM7CisJdWludDY0X3QgcmZjOworCXVpbnQ2NF90IGxmYzsKKwl1aW50NjRfdCBwZnJjOworCXVpbnQ2NF90IHBmdGM7CisJdWludDY0X3QgbWNmcmM7CisJdWludDY0X3QgbWNmdGM7CisJdWludDY0X3QgeG9ucnhjOworCXVpbnQ2NF90IHhvbnR4YzsKKwl1aW50NjRfdCB4b2ZmcnhjOworCXVpbnQ2NF90IHhvZmZ0eGM7CisJdWludDY0X3QgcmpjOworfTsKKworLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLworZXh0ZXJuIGJvb2xlYW5fdCBpeGdiX2FkYXB0ZXJfc3RvcChzdHJ1Y3QgaXhnYl9odyAqaHcpOworZXh0ZXJuIGJvb2xlYW5fdCBpeGdiX2luaXRfaHcoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK2V4dGVybiBib29sZWFuX3QgaXhnYl9hZGFwdGVyX3N0YXJ0KHN0cnVjdCBpeGdiX2h3ICpodyk7CitleHRlcm4gdm9pZCBpeGdiX2luaXRfcnhfYWRkcnMoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK2V4dGVybiB2b2lkIGl4Z2JfY2hlY2tfZm9yX2xpbmsoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK2V4dGVybiBib29sZWFuX3QgaXhnYl9jaGVja19mb3JfYmFkX2xpbmsoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK2V4dGVybiBib29sZWFuX3QgaXhnYl9zZXR1cF9mYyhzdHJ1Y3QgaXhnYl9odyAqaHcpOworZXh0ZXJuIHZvaWQgaXhnYl9jbGVhcl9od19jbnRycyhzdHJ1Y3QgaXhnYl9odyAqaHcpOworZXh0ZXJuIGJvb2xlYW5fdCBtYWNfYWRkcl92YWxpZCh1aW50OF90ICptYWNfYWRkcik7CisKK2V4dGVybiB1aW50MTZfdCBpeGdiX3JlYWRfcGh5X3JlZyhzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCQkJdWludDMyX3QgcmVnX2FkZHIsCisJCQkJdWludDMyX3QgcGh5X2FkZHIsCisJCQkJdWludDMyX3QgZGV2aWNlX3R5cGUpOworCitleHRlcm4gdm9pZCBpeGdiX3dyaXRlX3BoeV9yZWcoc3RydWN0IGl4Z2JfaHcgKmh3LAorCQkJCXVpbnQzMl90IHJlZ19hZGRyLAorCQkJCXVpbnQzMl90IHBoeV9hZGRyLAorCQkJCXVpbnQzMl90IGRldmljZV90eXBlLAorCQkJCXVpbnQxNl90IGRhdGEpOworCitleHRlcm4gdm9pZCBpeGdiX3Jhcl9zZXQoc3RydWN0IGl4Z2JfaHcgKmh3LAorCQkJCXVpbnQ4X3QgKmFkZHIsCisJCQkJdWludDMyX3QgaW5kZXgpOworCisKKy8qIEZpbHRlcnMgKG11bHRpY2FzdCwgdmxhbiwgcmVjZWl2ZSkgKi8KK2V4dGVybiB2b2lkIGl4Z2JfbWNfYWRkcl9saXN0X3VwZGF0ZShzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCQkJICAgdWludDhfdCAqbWNfYWRkcl9saXN0LAorCQkJCSAgIHVpbnQzMl90IG1jX2FkZHJfY291bnQsCisJCQkJICAgdWludDMyX3QgcGFkKTsKKworLyogVmZ0YSBmdW5jdGlvbnMgKi8KK2V4dGVybiB2b2lkIGl4Z2Jfd3JpdGVfdmZ0YShzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCQkJIHVpbnQzMl90IG9mZnNldCwKKwkJCQkgdWludDMyX3QgdmFsdWUpOworCitleHRlcm4gdm9pZCBpeGdiX2NsZWFyX3ZmdGEoc3RydWN0IGl4Z2JfaHcgKmh3KTsKKworLyogQWNjZXNzIGZ1bmN0aW9ucyB0byBlZXByb20gZGF0YSAqLwordm9pZCBpeGdiX2dldF9lZV9tYWNfYWRkcihzdHJ1Y3QgaXhnYl9odyAqaHcsIHVpbnQ4X3QgKm1hY19hZGRyKTsKK3VpbnQxNl90IGl4Z2JfZ2V0X2VlX2NvbXBhdGliaWxpdHkoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK3VpbnQzMl90IGl4Z2JfZ2V0X2VlX3BiYV9udW1iZXIoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK3VpbnQxNl90IGl4Z2JfZ2V0X2VlX2luaXRfY3RybF9yZWdfMShzdHJ1Y3QgaXhnYl9odyAqaHcpOwordWludDE2X3QgaXhnYl9nZXRfZWVfaW5pdF9jdHJsX3JlZ18yKHN0cnVjdCBpeGdiX2h3ICpodyk7Cit1aW50MTZfdCBpeGdiX2dldF9lZV9zdWJzeXN0ZW1faWQoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK3VpbnQxNl90IGl4Z2JfZ2V0X2VlX3N1YnZlbmRvcl9pZChzdHJ1Y3QgaXhnYl9odyAqaHcpOwordWludDE2X3QgaXhnYl9nZXRfZWVfZGV2aWNlX2lkKHN0cnVjdCBpeGdiX2h3ICpodyk7Cit1aW50MTZfdCBpeGdiX2dldF9lZV92ZW5kb3JfaWQoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK3VpbnQxNl90IGl4Z2JfZ2V0X2VlX3N3ZHBpbnNfcmVnKHN0cnVjdCBpeGdiX2h3ICpodyk7Cit1aW50OF90IGl4Z2JfZ2V0X2VlX2QzX3Bvd2VyKHN0cnVjdCBpeGdiX2h3ICpodyk7Cit1aW50OF90IGl4Z2JfZ2V0X2VlX2QwX3Bvd2VyKHN0cnVjdCBpeGdiX2h3ICpodyk7Citib29sZWFuX3QgaXhnYl9nZXRfZWVwcm9tX2RhdGEoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK3VpbnQxNl90IGl4Z2JfZ2V0X2VlcHJvbV93b3JkKHN0cnVjdCBpeGdiX2h3ICpodywgdWludDE2X3QgaW5kZXgpOworCisvKiBFdmVyeXRoaW5nIGVsc2UgKi8KK3ZvaWQgaXhnYl9sZWRfb24oc3RydWN0IGl4Z2JfaHcgKmh3KTsKK3ZvaWQgaXhnYl9sZWRfb2ZmKHN0cnVjdCBpeGdiX2h3ICpodyk7Cit2b2lkIGl4Z2Jfd3JpdGVfcGNpX2NmZyhzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCQkgdWludDMyX3QgcmVnLAorCQkJIHVpbnQxNl90ICogdmFsdWUpOworCisKKyNlbmRpZiAvKiBfSVhHQl9IV19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX2lkcy5oIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2lkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTIwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfaWRzLmgKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0lYR0JfSURTX0hfCisjZGVmaW5lIF9JWEdCX0lEU19IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogVGhlIERldmljZSBhbmQgVmVuZG9yIElEcyBmb3IgMTAgR2lnYWJpdCBNQUNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElOVEVMX1ZFTkRPUl9JRCAgICAgICAgICAgICAweDgwODYKKyNkZWZpbmUgSU5URUxfU1VCVkVORE9SX0lEICAgICAgICAgIDB4ODA4NgorCisKKyNkZWZpbmUgSVhHQl9ERVZJQ0VfSURfODI1OTdFWCAgICAgIDB4MTA0OCAgIAorI2RlZmluZSBJWEdCX0RFVklDRV9JRF84MjU5N0VYX1NSICAgMHgxQTQ4ICAgCisjZGVmaW5lIElYR0JfREVWSUNFX0lEXzgyNTk3RVhfTFIgICAweDFCNDgKKyNkZWZpbmUgSVhHQl9TVUJERVZJQ0VfSURfQTExRiAgICAgIDB4QTExRiAgIAorI2RlZmluZSBJWEdCX1NVQkRFVklDRV9JRF9BMDFGICAgICAgMHhBMDFGICAgCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9JWEdCX0lEU19IXyAqLworCisvKiBFbmQgb2YgRmlsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyNjYyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKQEAgLTAsMCArMSwyMTY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIAorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisgIGFueSBsYXRlciB2ZXJzaW9uLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisgIG1vcmUgZGV0YWlscy4KKyAgCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAgCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICAKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIml4Z2IuaCIKKworLyogQ2hhbmdlIExvZworICogMS4wLjg4IDAxLzA1LzA1CisgKiAtIGluY2x1ZGUgZml4IHRvIHRoZSBjb25kaXRpb24gdGhhdCBkZXRlcm1pbmVzIHdoZW4gdG8gcXVpdCBOQVBJIC0gUm9iZXJ0IE9sc3NvbgorICogLSB1c2UgbmV0aWZfcG9sbF97ZGlzYWJsZS9lbmFibGV9IHRvIHN5bmNocm9uaXplIGJldHdlZW4gTkFQSSBhbmQgaS9mIHVwL2Rvd24KKyAqIDEuMC44NCAxMC8yNi8wNAorICogLSByZXNldCBidWZmZXJfaW5mby0+ZG1hIGluIFR4IHJlc291cmNlIGNsZWFudXAgbG9naWMKKyAqIDEuMC44MyAxMC8xMi8wNAorICogLSBzcGFyc2UgY2xlYW51cCAtIHNoZW1taW5nZXJAb3NkbC5vcmcKKyAqIC0gZml4IHR4IHJlc291cmNlIGNsZWFudXAgbG9naWMKKyAqLworCitjaGFyIGl4Z2JfZHJpdmVyX25hbWVbXSA9ICJpeGdiIjsKK2NoYXIgaXhnYl9kcml2ZXJfc3RyaW5nW10gPSAiSW50ZWwoUikgUFJPLzEwR2JFIE5ldHdvcmsgRHJpdmVyIjsKKworI2lmbmRlZiBDT05GSUdfSVhHQl9OQVBJCisjZGVmaW5lIERSSVZFUk5BUEkKKyNlbHNlCisjZGVmaW5lIERSSVZFUk5BUEkgIi1OQVBJIgorI2VuZGlmCitjaGFyIGl4Z2JfZHJpdmVyX3ZlcnNpb25bXSA9ICIxLjAuOTAtazIiRFJJVkVSTkFQSTsKK2NoYXIgaXhnYl9jb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4iOworCisvKiBpeGdiX3BjaV90YmwgLSBQQ0kgRGV2aWNlIElEIFRhYmxlCisgKgorICogV2lsZGNhcmQgZW50cmllcyAoUENJX0FOWV9JRCkgc2hvdWxkIGNvbWUgbGFzdAorICogTGFzdCBlbnRyeSBtdXN0IGJlIGFsbCAwcworICoKKyAqIHsgVmVuZG9yIElELCBEZXZpY2UgSUQsIFN1YlZlbmRvciBJRCwgU3ViRGV2aWNlIElELAorICogICBDbGFzcywgQ2xhc3MgTWFzaywgcHJpdmF0ZSBkYXRhIChub3QgdXNlZCkgfQorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaXhnYl9wY2lfdGJsW10gPSB7CisJe0lOVEVMX1ZFTkRPUl9JRCwgSVhHQl9ERVZJQ0VfSURfODI1OTdFWCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe0lOVEVMX1ZFTkRPUl9JRCwgSVhHQl9ERVZJQ0VfSURfODI1OTdFWF9TUiwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe0lOVEVMX1ZFTkRPUl9JRCwgSVhHQl9ERVZJQ0VfSURfODI1OTdFWF9MUiwgIAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KKwl7MCx9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaXhnYl9wY2lfdGJsKTsKKworLyogTG9jYWwgRnVuY3Rpb24gUHJvdG90eXBlcyAqLworCitpbnQgaXhnYl91cChzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgaXhnYl9kb3duKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIsIGJvb2xlYW5fdCBraWxsX3dhdGNoZG9nKTsKK3ZvaWQgaXhnYl9yZXNldChzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK2ludCBpeGdiX3NldHVwX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK2ludCBpeGdiX3NldHVwX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgaXhnYl9mcmVlX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgaXhnYl9mcmVlX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgaXhnYl91cGRhdGVfc3RhdHMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcik7CisKK3N0YXRpYyBpbnQgaXhnYl9pbml0X21vZHVsZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGl4Z2JfZXhpdF9tb2R1bGUodm9pZCk7CitzdGF0aWMgaW50IGl4Z2JfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHZvaWQgX19kZXZleGl0IGl4Z2JfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK3N0YXRpYyBpbnQgaXhnYl9zd19pbml0KHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBpeGdiX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgaW50IGl4Z2JfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgdm9pZCBpeGdiX2NvbmZpZ3VyZV90eChzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIGl4Z2JfY29uZmlndXJlX3J4KHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgaXhnYl9zZXR1cF9yY3RsKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgaXhnYl9jbGVhbl90eF9yaW5nKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgaXhnYl9jbGVhbl9yeF9yaW5nKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgaXhnYl9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgdm9pZCBpeGdiX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgaW50IGl4Z2JfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXhnYl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgaW50IGl4Z2JfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSk7CitzdGF0aWMgaW50IGl4Z2Jfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBpeGdiX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGJvb2xlYW5fdCBpeGdiX2NsZWFuX3R4X2lycShzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKKyNpZmRlZiBDT05GSUdfSVhHQl9OQVBJCitzdGF0aWMgaW50IGl4Z2JfY2xlYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50ICpidWRnZXQpOworc3RhdGljIGJvb2xlYW5fdCBpeGdiX2NsZWFuX3J4X2lycShzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgIGludCAqd29ya19kb25lLCBpbnQgd29ya190b19kbyk7CisjZWxzZQorc3RhdGljIGJvb2xlYW5fdCBpeGdiX2NsZWFuX3J4X2lycShzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgaXhnYl9hbGxvY19yeF9idWZmZXJzKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBpeGdiX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyB2b2lkIGl4Z2JfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGl4Z2JfdHhfdGltZW91dF90YXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaXhnYl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKTsKK3N0YXRpYyB2b2lkIGl4Z2Jfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQxNl90IHZpZCk7CitzdGF0aWMgdm9pZCBpeGdiX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDE2X3QgdmlkKTsKK3N0YXRpYyB2b2lkIGl4Z2JfcmVzdG9yZV92bGFuKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworCitzdGF0aWMgaW50IGl4Z2Jfbm90aWZ5X3JlYm9vdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyBldmVudCwKKwkJCSAgICAgIHZvaWQgKnB0cik7CitzdGF0aWMgaW50IGl4Z2Jfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludDMyX3Qgc3RhdGUpOworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKy8qIGZvciBuZXRkdW1wIC8gbmV0IGNvbnNvbGUgKi8KK3N0YXRpYyB2b2lkIGl4Z2JfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCitzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXhnYl9ub3RpZmllcl9yZWJvb3QgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBpeGdiX25vdGlmeV9yZWJvb3QsCisJLm5leHQgPSBOVUxMLAorCS5wcmlvcml0eSA9IDAKK307CisKKy8qIEV4cG9ydGVkIGZyb20gb3RoZXIgbW9kdWxlcyAqLworCitleHRlcm4gdm9pZCBpeGdiX2NoZWNrX29wdGlvbnMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpeGdiX2RyaXZlciA9IHsKKwkubmFtZSA9IGl4Z2JfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlID0gaXhnYl9wY2lfdGJsLAorCS5wcm9iZSA9IGl4Z2JfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGl4Z2JfcmVtb3ZlKSwKKwkvKiBQb3dlciBNYW5hZ21lbnQgSG9va3MgKi8KKwkuc3VzcGVuZCA9IE5VTEwsCisJLnJlc3VtZSA9IE5VTEwKK307CisKK01PRFVMRV9BVVRIT1IoIkludGVsIENvcnBvcmF0aW9uLCA8bGludXgubmljc0BpbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsKFIpIFBSTy8xMEdiRSBOZXR3b3JrIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBzb21lIGRlZmluZXMgZm9yIGNvbnRyb2xsaW5nIGRlc2NyaXB0b3IgZmV0Y2hlcyBpbiBoL3cgKi8KKyNkZWZpbmUgUlhEQ1RMX1BUSFJFU0hfREVGQVVMVCAxMjgJLyogY2hpcCBjb25zaWRlcnMgcHJlZmVjaCBiZWxvdyB0aGlzICovCisjZGVmaW5lIFJYRENUTF9IVEhSRVNIX0RFRkFVTFQgMTYJLyogY2hpcCB3aWxsIG9ubHkgcHJlZmV0Y2ggaWYgdGFpbCBpcyAKKwkJCQkJICAgcHVzaGVkIHRoaXMgbWFueSBkZXNjcmlwdG9ycyBmcm9tIGhlYWQgKi8KKyNkZWZpbmUgUlhEQ1RMX1dUSFJFU0hfREVGQVVMVCAxNgkvKiBjaGlwIHdyaXRlcyBiYWNrIGF0IHRoaXMgbWFueSBvciBSWFQwICovCisKKy8qKgorICogaXhnYl9pbml0X21vZHVsZSAtIERyaXZlciBSZWdpc3RyYXRpb24gUm91dGluZQorICoKKyAqIGl4Z2JfaW5pdF9tb2R1bGUgaXMgdGhlIGZpcnN0IHJvdXRpbmUgY2FsbGVkIHdoZW4gdGhlIGRyaXZlciBpcworICogbG9hZGVkLiBBbGwgaXQgZG9lcyBpcyByZWdpc3RlciB3aXRoIHRoZSBQQ0kgc3Vic3lzdGVtLgorICoqLworCitzdGF0aWMgaW50IF9faW5pdAoraXhnYl9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXQ7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgLSB2ZXJzaW9uICVzXG4iLAorCSAgICAgICBpeGdiX2RyaXZlcl9zdHJpbmcsIGl4Z2JfZHJpdmVyX3ZlcnNpb24pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIGl4Z2JfY29weXJpZ2h0KTsKKworCXJldCA9IHBjaV9tb2R1bGVfaW5pdCgmaXhnYl9kcml2ZXIpOworCWlmKHJldCA+PSAwKSB7CisJCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmaXhnYl9ub3RpZmllcl9yZWJvb3QpOworCX0KKwlyZXR1cm4gcmV0OworfQorCittb2R1bGVfaW5pdChpeGdiX2luaXRfbW9kdWxlKTsKKworLyoqCisgKiBpeGdiX2V4aXRfbW9kdWxlIC0gRHJpdmVyIEV4aXQgQ2xlYW51cCBSb3V0aW5lCisgKgorICogaXhnYl9leGl0X21vZHVsZSBpcyBjYWxsZWQganVzdCBiZWZvcmUgdGhlIGRyaXZlciBpcyByZW1vdmVkCisgKiBmcm9tIG1lbW9yeS4KKyAqKi8KKworc3RhdGljIHZvaWQgX19leGl0CitpeGdiX2V4aXRfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJml4Z2Jfbm90aWZpZXJfcmVib290KTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJml4Z2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2V4aXQoaXhnYl9leGl0X21vZHVsZSk7CisKKy8qKgorICogaXhnYl9pcnFfZGlzYWJsZSAtIE1hc2sgb2ZmIGludGVycnVwdCBnZW5lcmF0aW9uIG9uIHRoZSBOSUMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK2l4Z2JfaXJxX2Rpc2FibGUoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKKwlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElNQywgfjApOworCUlYR0JfV1JJVEVfRkxVU0goJmFkYXB0ZXItPmh3KTsKKwlzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKK30KKworLyoqCisgKiBpeGdiX2lycV9lbmFibGUgLSBFbmFibGUgZGVmYXVsdCBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBzZXR0aW5ncworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraXhnYl9pcnFfZW5hYmxlKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYoYXRvbWljX2RlY19hbmRfdGVzdCgmYWRhcHRlci0+aXJxX3NlbSkpIHsKKwkJSVhHQl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJTVMsCisJCQkgICBJWEdCX0lOVF9SWFQwIHwgSVhHQl9JTlRfUlhETVQwIHwgSVhHQl9JTlRfVFhEVyB8CisJCQkgICBJWEdCX0lOVF9SWE8gfCBJWEdCX0lOVF9MU0MpOworCQlJWEdCX1dSSVRFX0ZMVVNIKCZhZGFwdGVyLT5odyk7CisJfQorfQorCitpbnQKK2l4Z2JfdXAoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCWludCBlcnI7CisJaW50IG1heF9mcmFtZSA9IG5ldGRldi0+bXR1ICsgRU5FVF9IRUFERVJfU0laRSArIEVORVRfRkNTX0xFTkdUSDsKKwlzdHJ1Y3QgaXhnYl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwkvKiBoYXJkd2FyZSBoYXMgYmVlbiByZXNldCwgd2UgbmVlZCB0byByZWxvYWQgc29tZSB0aGluZ3MgKi8KKworCWl4Z2Jfc2V0X211bHRpKG5ldGRldik7CisKKwlpeGdiX3Jlc3RvcmVfdmxhbihhZGFwdGVyKTsKKworCWl4Z2JfY29uZmlndXJlX3R4KGFkYXB0ZXIpOworCWl4Z2Jfc2V0dXBfcmN0bChhZGFwdGVyKTsKKwlpeGdiX2NvbmZpZ3VyZV9yeChhZGFwdGVyKTsKKwlpeGdiX2FsbG9jX3J4X2J1ZmZlcnMoYWRhcHRlcik7CisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCXsKKwlib29sZWFuX3QgcGNpeCA9IChJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKSAmIAorCQkJCQkJICBJWEdCX1NUQVRVU19QQ0lYX01PREUpID8gVFJVRSA6IEZBTFNFOworCWFkYXB0ZXItPmhhdmVfbXNpID0gVFJVRTsKKworCWlmICghcGNpeCkKKwkgICBhZGFwdGVyLT5oYXZlX21zaSA9IEZBTFNFOworCWVsc2UgaWYoKGVyciA9IHBjaV9lbmFibGVfbXNpKGFkYXB0ZXItPnBkZXYpKSkgeworCQlwcmludGsgKEtFUk5fRVJSCisJCSAiVW5hYmxlIHRvIGFsbG9jYXRlIE1TSSBpbnRlcnJ1cHQgRXJyb3I6ICVkXG4iLCBlcnIpOworCQlhZGFwdGVyLT5oYXZlX21zaSA9IEZBTFNFOworCQkvKiBwcm9jZWVkIHRvIHRyeSB0byByZXF1ZXN0IHJlZ3VsYXIgaW50ZXJydXB0ICovCisJfQorCX0KKworI2VuZGlmCisJaWYoKGVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwgJml4Z2JfaW50ciwKKwkJCQkgIFNBX1NISVJRIHwgU0FfU0FNUExFX1JBTkRPTSwKKwkJCQkgIG5ldGRldi0+bmFtZSwgbmV0ZGV2KSkpCisJCXJldHVybiBlcnI7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgYW5kIGdldCB0aGUgaGFyZHdhcmUgaW50byBhIGtub3duIHN0YXRlICovCisJSVhHQl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJTUMsIDB4ZmZmZmZmZmYpOworCisJaWYoKGh3LT5tYXhfZnJhbWVfc2l6ZSAhPSBtYXhfZnJhbWUpIHx8CisJCShody0+bWF4X2ZyYW1lX3NpemUgIT0KKwkJKElYR0JfUkVBRF9SRUcoaHcsIE1GUykgPj4gSVhHQl9NRlNfU0hJRlQpKSkgeworCisJCWh3LT5tYXhfZnJhbWVfc2l6ZSA9IG1heF9mcmFtZTsKKworCQlJWEdCX1dSSVRFX1JFRyhodywgTUZTLCBody0+bWF4X2ZyYW1lX3NpemUgPDwgSVhHQl9NRlNfU0hJRlQpOworCisJCWlmKGh3LT5tYXhfZnJhbWVfc2l6ZSA+CisJCSAgIElYR0JfTUFYX0VORVRfRlJBTUVfU0laRV9XSVRIT1VUX0ZDUyArIEVORVRfRkNTX0xFTkdUSCkgeworCQkJdWludDMyX3QgY3RybDAgPSBJWEdCX1JFQURfUkVHKGh3LCBDVFJMMCk7CisKKwkJCWlmKCEoY3RybDAgJiBJWEdCX0NUUkwwX0pGRSkpIHsKKwkJCQljdHJsMCB8PSBJWEdCX0NUUkwwX0pGRTsKKwkJCQlJWEdCX1dSSVRFX1JFRyhodywgQ1RSTDAsIGN0cmwwKTsKKwkJCX0KKwkJfQorCX0KKworCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMpOworCWl4Z2JfaXJxX2VuYWJsZShhZGFwdGVyKTsKKworI2lmZGVmIENPTkZJR19JWEdCX05BUEkKKwluZXRpZl9wb2xsX2VuYWJsZShuZXRkZXYpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2l4Z2JfZG93bihzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyLCBib29sZWFuX3Qga2lsbF93YXRjaGRvZykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJaXhnYl9pcnFfZGlzYWJsZShhZGFwdGVyKTsKKwlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIG5ldGRldik7CisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwlpZihhZGFwdGVyLT5oYXZlX21zaSA9PSBUUlVFKQorCQlwY2lfZGlzYWJsZV9tc2koYWRhcHRlci0+cGRldik7CisKKyNlbmRpZgorCWlmKGtpbGxfd2F0Y2hkb2cpCisJCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lcik7CisjaWZkZWYgQ09ORklHX0lYR0JfTkFQSQorCW5ldGlmX3BvbGxfZGlzYWJsZShuZXRkZXYpOworI2VuZGlmCisJYWRhcHRlci0+bGlua19zcGVlZCA9IDA7CisJYWRhcHRlci0+bGlua19kdXBsZXggPSAwOworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJaXhnYl9yZXNldChhZGFwdGVyKTsKKwlpeGdiX2NsZWFuX3R4X3JpbmcoYWRhcHRlcik7CisJaXhnYl9jbGVhbl9yeF9yaW5nKGFkYXB0ZXIpOworfQorCit2b2lkCitpeGdiX3Jlc2V0KHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisKKwlpeGdiX2FkYXB0ZXJfc3RvcCgmYWRhcHRlci0+aHcpOworCWlmKCFpeGdiX2luaXRfaHcoJmFkYXB0ZXItPmh3KSkKKwkJSVhHQl9EQkcoIml4Z2JfaW5pdF9odyBmYWlsZWQuXG4iKTsKK30KKworLyoqCisgKiBpeGdiX3Byb2JlIC0gRGV2aWNlIEluaXRpYWxpemF0aW9uIFJvdXRpbmUKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIHN0cnVjdAorICogQGVudDogZW50cnkgaW4gaXhnYl9wY2lfdGJsCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqCisgKiBpeGdiX3Byb2JlIGluaXRpYWxpemVzIGFuIGFkYXB0ZXIgaWRlbnRpZmllZCBieSBhIHBjaV9kZXYgc3RydWN0dXJlLgorICogVGhlIE9TIGluaXRpYWxpemF0aW9uLCBjb25maWd1cmluZyBvZiB0aGUgYWRhcHRlciBwcml2YXRlIHN0cnVjdHVyZSwKKyAqIGFuZCBhIGhhcmR3YXJlIHJlc2V0IG9jY3VyLgorICoqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdAoraXhnYl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyOworCXN0YXRpYyBpbnQgY2FyZHNfZm91bmQgPSAwOworCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydDsKKwlpbnQgbW1pb19sZW47CisJaW50IHBjaV91c2luZ19kYWM7CisJaW50IGk7CisJaW50IGVycjsKKworCWlmKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpCisJCXJldHVybiBlcnI7CisKKwlpZighKGVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spKSkgeworCQlwY2lfdXNpbmdfZGFjID0gMTsKKwl9IGVsc2UgeworCQlpZigoZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpKSB7CisJCQlJWEdCX0VSUigiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCBhYm9ydGluZ1xuIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCXBjaV91c2luZ19kYWMgPSAwOworCX0KKworCWlmKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIGl4Z2JfZHJpdmVyX25hbWUpKSkKKwkJcmV0dXJuIGVycjsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBpeGdiX2FkYXB0ZXIpKTsKKwlpZighbmV0ZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jX2V0aGVyZGV2OworCX0KKworCVNFVF9NT0RVTEVfT1dORVIobmV0ZGV2KTsKKwlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5ldGRldik7CisJYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlhZGFwdGVyLT5uZXRkZXYgPSBuZXRkZXY7CisJYWRhcHRlci0+cGRldiA9IHBkZXY7CisJYWRhcHRlci0+aHcuYmFjayA9IGFkYXB0ZXI7CisKKwltbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIEJBUl8wKTsKKwltbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgQkFSXzApOworCisJYWRhcHRlci0+aHcuaHdfYWRkciA9IGlvcmVtYXAobW1pb19zdGFydCwgbW1pb19sZW4pOworCWlmKCFhZGFwdGVyLT5ody5od19hZGRyKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX2lvcmVtYXA7CisJfQorCisJZm9yKGkgPSBCQVJfMTsgaSA8PSBCQVJfNTsgaSsrKSB7CisJCWlmKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZihwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgaSkgJiBJT1JFU09VUkNFX0lPKSB7CisJCQlhZGFwdGVyLT5ody5pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwluZXRkZXYtPm9wZW4gPSAmaXhnYl9vcGVuOworCW5ldGRldi0+c3RvcCA9ICZpeGdiX2Nsb3NlOworCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0gJml4Z2JfeG1pdF9mcmFtZTsKKwluZXRkZXYtPmdldF9zdGF0cyA9ICZpeGdiX2dldF9zdGF0czsKKwluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZpeGdiX3NldF9tdWx0aTsKKwluZXRkZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZpeGdiX3NldF9tYWM7CisJbmV0ZGV2LT5jaGFuZ2VfbXR1ID0gJml4Z2JfY2hhbmdlX210dTsKKwlpeGdiX3NldF9ldGh0b29sX29wcyhuZXRkZXYpOworCW5ldGRldi0+dHhfdGltZW91dCA9ICZpeGdiX3R4X3RpbWVvdXQ7CisJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyA9IEhaOworI2lmZGVmIENPTkZJR19JWEdCX05BUEkKKwluZXRkZXYtPnBvbGwgPSAmaXhnYl9jbGVhbjsKKwluZXRkZXYtPndlaWdodCA9IDY0OworI2VuZGlmCisJbmV0ZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gaXhnYl92bGFuX3J4X3JlZ2lzdGVyOworCW5ldGRldi0+dmxhbl9yeF9hZGRfdmlkID0gaXhnYl92bGFuX3J4X2FkZF92aWQ7CisJbmV0ZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gaXhnYl92bGFuX3J4X2tpbGxfdmlkOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJbmV0ZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBpeGdiX25ldHBvbGw7CisjZW5kaWYKKworCW5ldGRldi0+bWVtX3N0YXJ0ID0gbW1pb19zdGFydDsKKwluZXRkZXYtPm1lbV9lbmQgPSBtbWlvX3N0YXJ0ICsgbW1pb19sZW47CisJbmV0ZGV2LT5iYXNlX2FkZHIgPSBhZGFwdGVyLT5ody5pb19iYXNlOworCisJYWRhcHRlci0+YmRfbnVtYmVyID0gY2FyZHNfZm91bmQ7CisJYWRhcHRlci0+bGlua19zcGVlZCA9IDA7CisJYWRhcHRlci0+bGlua19kdXBsZXggPSAwOworCisJLyogc2V0dXAgdGhlIHByaXZhdGUgc3RydWN0dXJlICovCisKKwlpZigoZXJyID0gaXhnYl9zd19pbml0KGFkYXB0ZXIpKSkKKwkJZ290byBlcnJfc3dfaW5pdDsKKworCW5ldGRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwKKwkJCSAgIE5FVElGX0ZfSFdfQ1NVTSB8CisJCQkgICBORVRJRl9GX0hXX1ZMQU5fVFggfAorCQkJICAgTkVUSUZfRl9IV19WTEFOX1JYIHwKKwkJCSAgIE5FVElGX0ZfSFdfVkxBTl9GSUxURVI7CisjaWZkZWYgTkVUSUZfRl9UU08KKwluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOworI2VuZGlmCisKKwlpZihwY2lfdXNpbmdfZGFjKQorCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKworCS8qIG1ha2Ugc3VyZSB0aGUgRUVQUk9NIGlzIGdvb2QgKi8KKworCWlmKCFpeGdiX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bSgmYWRhcHRlci0+aHcpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVGhlIEVFUFJPTSBDaGVja3N1bSBJcyBOb3QgVmFsaWRcbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9lZXByb207CisJfQorCisJaXhnYl9nZXRfZWVfbWFjX2FkZHIoJmFkYXB0ZXItPmh3LCBuZXRkZXYtPmRldl9hZGRyKTsKKworCWlmKCFpc192YWxpZF9ldGhlcl9hZGRyKG5ldGRldi0+ZGV2X2FkZHIpKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX2VlcHJvbTsKKwl9CisKKwlhZGFwdGVyLT5wYXJ0X251bSA9IGl4Z2JfZ2V0X2VlX3BiYV9udW1iZXIoJmFkYXB0ZXItPmh3KTsKKworCWluaXRfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyKTsKKwlhZGFwdGVyLT53YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9ICZpeGdiX3dhdGNoZG9nOworCWFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylhZGFwdGVyOworCisJSU5JVF9XT1JLKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2ssCisJCSAgKHZvaWQgKCopKHZvaWQgKikpaXhnYl90eF90aW1lb3V0X3Rhc2ssIG5ldGRldik7CisKKwlpZigoZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldikpKQorCQlnb3RvIGVycl9yZWdpc3RlcjsKKworCS8qIHdlJ3JlIGdvaW5nIHRvIHJlc2V0LCBzbyBhc3N1bWUgd2UgaGF2ZSBubyBsaW5rIGZvciBub3cgKi8KKworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVsKFIpIFBSTy8xMEdiRSBOZXR3b3JrIENvbm5lY3Rpb25cbiIsCisJCSAgIG5ldGRldi0+bmFtZSk7CisJaXhnYl9jaGVja19vcHRpb25zKGFkYXB0ZXIpOworCS8qIHJlc2V0IHRoZSBoYXJkd2FyZSB3aXRoIHRoZSBuZXcgc2V0dGluZ3MgKi8KKworCWl4Z2JfcmVzZXQoYWRhcHRlcik7CisKKwljYXJkc19mb3VuZCsrOworCXJldHVybiAwOworCitlcnJfcmVnaXN0ZXI6CitlcnJfc3dfaW5pdDoKK2Vycl9lZXByb206CisJaW91bm1hcChhZGFwdGVyLT5ody5od19hZGRyKTsKK2Vycl9pb3JlbWFwOgorCWZyZWVfbmV0ZGV2KG5ldGRldik7CitlcnJfYWxsb2NfZXRoZXJkZXY6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGl4Z2JfcmVtb3ZlIC0gRGV2aWNlIFJlbW92YWwgUm91dGluZQorICogQHBkZXY6IFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0CisgKgorICogaXhnYl9yZW1vdmUgaXMgY2FsbGVkIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtIHRvIGFsZXJ0IHRoZSBkcml2ZXIKKyAqIHRoYXQgaXQgc2hvdWxkIHJlbGVhc2UgYSBQQ0kgZGV2aWNlLiAgVGhlIGNvdWxkIGJlIGNhdXNlZCBieSBhCisgKiBIb3QtUGx1ZyBldmVudCwgb3IgYmVjYXVzZSB0aGUgZHJpdmVyIGlzIGdvaW5nIHRvIGJlIHJlbW92ZWQgZnJvbQorICogbWVtb3J5LgorICoqLworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQKK2l4Z2JfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisKKwlpb3VubWFwKGFkYXB0ZXItPmh3Lmh3X2FkZHIpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKKwlmcmVlX25ldGRldihuZXRkZXYpOworfQorCisvKioKKyAqIGl4Z2Jfc3dfaW5pdCAtIEluaXRpYWxpemUgZ2VuZXJhbCBzb2Z0d2FyZSBzdHJ1Y3R1cmVzIChzdHJ1Y3QgaXhnYl9hZGFwdGVyKQorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlIHRvIGluaXRpYWxpemUKKyAqCisgKiBpeGdiX3N3X2luaXQgaW5pdGlhbGl6ZXMgdGhlIEFkYXB0ZXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZS4KKyAqIEZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgYmFzZWQgb24gUENJIGRldmljZSBpbmZvcm1hdGlvbiBhbmQKKyAqIE9TIG5ldHdvcmsgZGV2aWNlIHNldHRpbmdzIChNVFUgc2l6ZSkuCisgKiovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitpeGdiX3N3X2luaXQoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaXhnYl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisKKwkvKiBQQ0kgY29uZmlnIHNwYWNlIGluZm8gKi8KKworCWh3LT52ZW5kb3JfaWQgPSBwZGV2LT52ZW5kb3I7CisJaHctPmRldmljZV9pZCA9IHBkZXYtPmRldmljZTsKKwlody0+c3Vic3lzdGVtX3ZlbmRvcl9pZCA9IHBkZXYtPnN1YnN5c3RlbV92ZW5kb3I7CisJaHctPnN1YnN5c3RlbV9pZCA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisKKwlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gSVhHQl9SWEJVRkZFUl8yMDQ4OworCisJaHctPm1heF9mcmFtZV9zaXplID0gbmV0ZGV2LT5tdHUgKyBFTkVUX0hFQURFUl9TSVpFICsgRU5FVF9GQ1NfTEVOR1RIOworCisJaWYoKGh3LT5kZXZpY2VfaWQgPT0gSVhHQl9ERVZJQ0VfSURfODI1OTdFWCkKKwkgICB8fChody0+ZGV2aWNlX2lkID09IElYR0JfREVWSUNFX0lEXzgyNTk3RVhfTFIpCisJICAgfHwoaHctPmRldmljZV9pZCA9PSBJWEdCX0RFVklDRV9JRF84MjU5N0VYX1NSKSkKKwkJCWh3LT5tYWNfdHlwZSA9IGl4Z2JfODI1OTc7CisJZWxzZSB7CisJCS8qIHNob3VsZCBuZXZlciBoYXZlIGxvYWRlZCBvbiB0aGlzIGRldmljZSAqLworCQlwcmludGsoS0VSTl9FUlIgIml4Z2I6IHVuc3VwcG9ydGVkIGRldmljZSBpZFxuIik7CisJfQorCisJLyogZW5hYmxlIGZsb3cgY29udHJvbCB0byBiZSBwcm9ncmFtbWVkICovCisJaHctPmZjLnNlbmRfeG9uID0gMTsKKworCWF0b21pY19zZXQoJmFkYXB0ZXItPmlycV9zZW0sIDEpOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT50eF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl4Z2Jfb3BlbiAtIENhbGxlZCB3aGVuIGEgbmV0d29yayBpbnRlcmZhY2UgaXMgbWFkZSBhY3RpdmUKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZQorICoKKyAqIFRoZSBvcGVuIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuIGEgbmV0d29yayBpbnRlcmZhY2UgaXMgbWFkZQorICogYWN0aXZlIGJ5IHRoZSBzeXN0ZW0gKElGRl9VUCkuICBBdCB0aGlzIHBvaW50IGFsbCByZXNvdXJjZXMgbmVlZGVkCisgKiBmb3IgdHJhbnNtaXQgYW5kIHJlY2VpdmUgb3BlcmF0aW9ucyBhcmUgYWxsb2NhdGVkLCB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgT1MsIHRoZSB3YXRjaGRvZyB0aW1lciBpcyBzdGFydGVkLAorICogYW5kIHRoZSBzdGFjayBpcyBub3RpZmllZCB0aGF0IHRoZSBpbnRlcmZhY2UgaXMgcmVhZHkuCisgKiovCisKK3N0YXRpYyBpbnQKK2l4Z2Jfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJaW50IGVycjsKKworCS8qIGFsbG9jYXRlIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCisKKwlpZigoZXJyID0gaXhnYl9zZXR1cF90eF9yZXNvdXJjZXMoYWRhcHRlcikpKQorCQlnb3RvIGVycl9zZXR1cF90eDsKKworCS8qIGFsbG9jYXRlIHJlY2VpdmUgZGVzY3JpcHRvcnMgKi8KKworCWlmKChlcnIgPSBpeGdiX3NldHVwX3J4X3Jlc291cmNlcyhhZGFwdGVyKSkpCisJCWdvdG8gZXJyX3NldHVwX3J4OworCisJaWYoKGVyciA9IGl4Z2JfdXAoYWRhcHRlcikpKQorCQlnb3RvIGVycl91cDsKKworCXJldHVybiAwOworCitlcnJfdXA6CisJaXhnYl9mcmVlX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKK2Vycl9zZXR1cF9yeDoKKwlpeGdiX2ZyZWVfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpOworZXJyX3NldHVwX3R4OgorCWl4Z2JfcmVzZXQoYWRhcHRlcik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGl4Z2JfY2xvc2UgLSBEaXNhYmxlcyBhIG5ldHdvcmsgaW50ZXJmYWNlCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwLCB0aGlzIGlzIG5vdCBhbGxvd2VkIHRvIGZhaWwKKyAqCisgKiBUaGUgY2xvc2UgZW50cnkgcG9pbnQgaXMgY2FsbGVkIHdoZW4gYW4gaW50ZXJmYWNlIGlzIGRlLWFjdGl2YXRlZAorICogYnkgdGhlIE9TLiAgVGhlIGhhcmR3YXJlIGlzIHN0aWxsIHVuZGVyIHRoZSBkcml2ZXJzIGNvbnRyb2wsIGJ1dAorICogbmVlZHMgdG8gYmUgZGlzYWJsZWQuICBBIGdsb2JhbCBNQUMgcmVzZXQgaXMgaXNzdWVkIHRvIHN0b3AgdGhlCisgKiBoYXJkd2FyZSwgYW5kIGFsbCB0cmFuc21pdCBhbmQgcmVjZWl2ZSByZXNvdXJjZXMgYXJlIGZyZWVkLgorICoqLworCitzdGF0aWMgaW50CitpeGdiX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCWl4Z2JfZG93bihhZGFwdGVyLCBUUlVFKTsKKworCWl4Z2JfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlcik7CisJaXhnYl9mcmVlX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl4Z2Jfc2V0dXBfdHhfcmVzb3VyY2VzIC0gYWxsb2NhdGUgVHggcmVzb3VyY2VzIChEZXNjcmlwdG9ycykKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqKi8KKworaW50CitpeGdiX3NldHVwX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyAqdHhkciA9ICZhZGFwdGVyLT50eF9yaW5nOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGl4Z2JfYnVmZmVyKSAqIHR4ZHItPmNvdW50OworCXR4ZHItPmJ1ZmZlcl9pbmZvID0gdm1hbGxvYyhzaXplKTsKKwlpZighdHhkci0+YnVmZmVyX2luZm8pIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCh0eGRyLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CisKKwkvKiByb3VuZCB1cCB0byBuZWFyZXN0IDRLICovCisKKwl0eGRyLT5zaXplID0gdHhkci0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGl4Z2JfdHhfZGVzYyk7CisJSVhHQl9ST1VORFVQKHR4ZHItPnNpemUsIDQwOTYpOworCisJdHhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsICZ0eGRyLT5kbWEpOworCWlmKCF0eGRyLT5kZXNjKSB7CisJCXZmcmVlKHR4ZHItPmJ1ZmZlcl9pbmZvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCh0eGRyLT5kZXNjLCAwLCB0eGRyLT5zaXplKTsKKworCXR4ZHItPm5leHRfdG9fdXNlID0gMDsKKwl0eGRyLT5uZXh0X3RvX2NsZWFuID0gMDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl4Z2JfY29uZmlndXJlX3R4IC0gQ29uZmlndXJlIDgyNTk3IFRyYW5zbWl0IFVuaXQgYWZ0ZXIgUmVzZXQuCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBDb25maWd1cmUgdGhlIFR4IHVuaXQgb2YgdGhlIE1BQyBhZnRlciBhIHJlc2V0LgorICoqLworCitzdGF0aWMgdm9pZAoraXhnYl9jb25maWd1cmVfdHgoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1aW50NjRfdCB0ZGJhID0gYWRhcHRlci0+dHhfcmluZy5kbWE7CisJdWludDMyX3QgdGRsZW4gPSBhZGFwdGVyLT50eF9yaW5nLmNvdW50ICogc2l6ZW9mKHN0cnVjdCBpeGdiX3R4X2Rlc2MpOworCXVpbnQzMl90IHRjdGw7CisJc3RydWN0IGl4Z2JfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCisJLyogU2V0dXAgdGhlIEJhc2UgYW5kIExlbmd0aCBvZiB0aGUgVHggRGVzY3JpcHRvciBSaW5nIAorCSAqIHR4X3JpbmcuZG1hIGNhbiBiZSBlaXRoZXIgYSAzMiBvciA2NCBiaXQgdmFsdWUgCisJICovCisKKwlJWEdCX1dSSVRFX1JFRyhodywgVERCQUwsICh0ZGJhICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSk7CisJSVhHQl9XUklURV9SRUcoaHcsIFREQkFILCAodGRiYSA+PiAzMikpOworCisJSVhHQl9XUklURV9SRUcoaHcsIFRETEVOLCB0ZGxlbik7CisKKwkvKiBTZXR1cCB0aGUgSFcgVHggSGVhZCBhbmQgVGFpbCBkZXNjcmlwdG9yIHBvaW50ZXJzICovCisKKwlJWEdCX1dSSVRFX1JFRyhodywgVERILCAwKTsKKwlJWEdCX1dSSVRFX1JFRyhodywgVERULCAwKTsKKworCS8qIGRvbid0IHNldCB1cCB0eGRjdGwsIGl0IGluZHVjZXMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgaWYgY29uZmlndXJlZAorCSAqIGluY29ycmVjdGx5ICovCisJLyogU2V0IHRoZSBUeCBJbnRlcnJ1cHQgRGVsYXkgcmVnaXN0ZXIgKi8KKworCUlYR0JfV1JJVEVfUkVHKGh3LCBUSURWLCBhZGFwdGVyLT50eF9pbnRfZGVsYXkpOworCisJLyogUHJvZ3JhbSB0aGUgVHJhbnNtaXQgQ29udHJvbCBSZWdpc3RlciAqLworCisJdGN0bCA9IElYR0JfVENUTF9UQ0UgfCBJWEdCX1RDVExfVFhFTiB8IElYR0JfVENUTF9UUERFOworCUlYR0JfV1JJVEVfUkVHKGh3LCBUQ1RMLCB0Y3RsKTsKKworCS8qIFNldHVwIFRyYW5zbWl0IERlc2NyaXB0b3IgU2V0dGluZ3MgZm9yIHRoaXMgYWRhcHRlciAqLworCWFkYXB0ZXItPnR4X2NtZF90eXBlID0KKwkJSVhHQl9UWF9ERVNDX1RZUEUgCisJCXwgKGFkYXB0ZXItPnR4X2ludF9kZWxheV9lbmFibGUgPyBJWEdCX1RYX0RFU0NfQ01EX0lERSA6IDApOworfQorCisvKioKKyAqIGl4Z2Jfc2V0dXBfcnhfcmVzb3VyY2VzIC0gYWxsb2NhdGUgUnggcmVzb3VyY2VzIChEZXNjcmlwdG9ycykKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKiovCisKK2ludAoraXhnYl9zZXR1cF9yeF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaXhnYl9kZXNjX3JpbmcgKnJ4ZHIgPSAmYWRhcHRlci0+cnhfcmluZzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJaW50IHNpemU7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBpeGdiX2J1ZmZlcikgKiByeGRyLT5jb3VudDsKKwlyeGRyLT5idWZmZXJfaW5mbyA9IHZtYWxsb2Moc2l6ZSk7CisJaWYoIXJ4ZHItPmJ1ZmZlcl9pbmZvKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocnhkci0+YnVmZmVyX2luZm8sIDAsIHNpemUpOworCisJLyogUm91bmQgdXAgdG8gbmVhcmVzdCA0SyAqLworCisJcnhkci0+c2l6ZSA9IHJ4ZHItPmNvdW50ICogc2l6ZW9mKHN0cnVjdCBpeGdiX3J4X2Rlc2MpOworCUlYR0JfUk9VTkRVUChyeGRyLT5zaXplLCA0MDk2KTsKKworCXJ4ZHItPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLCAmcnhkci0+ZG1hKTsKKworCWlmKCFyeGRyLT5kZXNjKSB7CisJCXZmcmVlKHJ4ZHItPmJ1ZmZlcl9pbmZvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChyeGRyLT5kZXNjLCAwLCByeGRyLT5zaXplKTsKKworCXJ4ZHItPm5leHRfdG9fY2xlYW4gPSAwOworCXJ4ZHItPm5leHRfdG9fdXNlID0gMDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl4Z2Jfc2V0dXBfcmN0bCAtIGNvbmZpZ3VyZSB0aGUgcmVjZWl2ZSBjb250cm9sIHJlZ2lzdGVyCisgKiBAYWRhcHRlcjogQm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KKworc3RhdGljIHZvaWQKK2l4Z2Jfc2V0dXBfcmN0bChzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKQoreworCXVpbnQzMl90IHJjdGw7CisKKwlyY3RsID0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJDVEwpOworCisJcmN0bCAmPSB+KDMgPDwgSVhHQl9SQ1RMX01PX1NISUZUKTsKKworCXJjdGwgfD0KKwkJSVhHQl9SQ1RMX0JBTSB8IElYR0JfUkNUTF9SRE1UU18xXzIgfCAKKwkJSVhHQl9SQ1RMX1JYRU4gfCBJWEdCX1JDVExfQ0ZGIHwgCisJCShhZGFwdGVyLT5ody5tY19maWx0ZXJfdHlwZSA8PCBJWEdCX1JDVExfTU9fU0hJRlQpOworCisJcmN0bCB8PSBJWEdCX1JDVExfU0VDUkM7CisKKwlzd2l0Y2ggKGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4pIHsKKwljYXNlIElYR0JfUlhCVUZGRVJfMjA0ODoKKwlkZWZhdWx0OgorCQlyY3RsIHw9IElYR0JfUkNUTF9CU0laRV8yMDQ4OworCQlicmVhazsKKwljYXNlIElYR0JfUlhCVUZGRVJfNDA5NjoKKwkJcmN0bCB8PSBJWEdCX1JDVExfQlNJWkVfNDA5NjsKKwkJYnJlYWs7CisJY2FzZSBJWEdCX1JYQlVGRkVSXzgxOTI6CisJCXJjdGwgfD0gSVhHQl9SQ1RMX0JTSVpFXzgxOTI7CisJCWJyZWFrOworCWNhc2UgSVhHQl9SWEJVRkZFUl8xNjM4NDoKKwkJcmN0bCB8PSBJWEdCX1JDVExfQlNJWkVfMTYzODQ7CisJCWJyZWFrOworCX0KKworCUlYR0JfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkNUTCwgcmN0bCk7Cit9CisKKy8qKgorICogaXhnYl9jb25maWd1cmVfcnggLSBDb25maWd1cmUgODI1OTcgUmVjZWl2ZSBVbml0IGFmdGVyIFJlc2V0LgorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogQ29uZmlndXJlIHRoZSBSeCB1bml0IG9mIHRoZSBNQUMgYWZ0ZXIgYSByZXNldC4KKyAqKi8KKworc3RhdGljIHZvaWQKK2l4Z2JfY29uZmlndXJlX3J4KHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdWludDY0X3QgcmRiYSA9IGFkYXB0ZXItPnJ4X3JpbmcuZG1hOworCXVpbnQzMl90IHJkbGVuID0gYWRhcHRlci0+cnhfcmluZy5jb3VudCAqIHNpemVvZihzdHJ1Y3QgaXhnYl9yeF9kZXNjKTsKKwlzdHJ1Y3QgaXhnYl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdWludDMyX3QgcmN0bDsKKwl1aW50MzJfdCByeGNzdW07CisJdWludDMyX3QgcnhkY3RsOworCisJLyogbWFrZSBzdXJlIHJlY2VpdmVzIGFyZSBkaXNhYmxlZCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBkZXNjcmlwdG9ycyAqLworCisJcmN0bCA9IElYR0JfUkVBRF9SRUcoaHcsIFJDVEwpOworCUlYR0JfV1JJVEVfUkVHKGh3LCBSQ1RMLCByY3RsICYgfklYR0JfUkNUTF9SWEVOKTsKKworCS8qIHNldCB0aGUgUmVjZWl2ZSBEZWxheSBUaW1lciBSZWdpc3RlciAqLworCisJSVhHQl9XUklURV9SRUcoaHcsIFJEVFIsIGFkYXB0ZXItPnJ4X2ludF9kZWxheSk7CisKKwkvKiBTZXR1cCB0aGUgQmFzZSBhbmQgTGVuZ3RoIG9mIHRoZSBSeCBEZXNjcmlwdG9yIFJpbmcgKi8KKworCUlYR0JfV1JJVEVfUkVHKGh3LCBSREJBTCwgKHJkYmEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpKTsKKwlJWEdCX1dSSVRFX1JFRyhodywgUkRCQUgsIChyZGJhID4+IDMyKSk7CisKKwlJWEdCX1dSSVRFX1JFRyhodywgUkRMRU4sIHJkbGVuKTsKKworCS8qIFNldHVwIHRoZSBIVyBSeCBIZWFkIGFuZCBUYWlsIERlc2NyaXB0b3IgUG9pbnRlcnMgKi8KKwlJWEdCX1dSSVRFX1JFRyhodywgUkRILCAwKTsKKwlJWEdCX1dSSVRFX1JFRyhodywgUkRULCAwKTsKKworCS8qIHNldCB1cCBwcmUtZmV0Y2hpbmcgb2YgcmVjZWl2ZSBidWZmZXJzIHNvIHdlIGdldCBzb21lIGJlZm9yZSB3ZQorCSAqIHJ1biBvdXQgKGRlZmF1bHQgaGFyZHdhcmUgYmVoYXZpb3IgaXMgdG8gcnVuIG91dCBiZWZvcmUgZmV0Y2hpbmcKKwkgKiBtb3JlKS4gIFRoaXMgc2V0cyB1cCB0byBmZXRjaCBpZiBIVEhSRVNIIHJ4IGRlc2NyaXB0b3JzIGFyZSBhdmFpbAorCSAqIGFuZCB0aGUgZGVzY3JpcHRvcnMgaW4gaHcgY2FjaGUgYXJlIGJlbG93IFBUSFJFU0guICBUaGlzIGF2b2lkcworCSAqIHRoZSBoYXJkd2FyZSBiZWhhdmlvciBvZiBmZXRjaGluZyA8PTUxMiBkZXNjcmlwdG9ycyBpbiBhIHNpbmdsZQorCSAqIGJ1cnN0IHRoYXQgcHJlLWVtcHRzIGFsbCBvdGhlciBhY3Rpdml0eSwgdXN1YWxseSBjYXVzaW5nIGZpZm8KKwkgKiBvdmVyZmxvd3MuICovCisJLyogdXNlIFdUSFJFU0ggdG8gYnVyc3Qgd3JpdGUgMTYgZGVzY3JpcHRvcnMgb3IgYnVyc3Qgd2hlbiBSWFQwICovCisJcnhkY3RsID0gUlhEQ1RMX1dUSFJFU0hfREVGQVVMVCA8PCBJWEdCX1JYRENUTF9XVEhSRVNIX1NISUZUIHwKKwkgICAgICAgICBSWERDVExfSFRIUkVTSF9ERUZBVUxUIDw8IElYR0JfUlhEQ1RMX0hUSFJFU0hfU0hJRlQgfAorCSAgICAgICAgIFJYRENUTF9QVEhSRVNIX0RFRkFVTFQgPDwgSVhHQl9SWERDVExfUFRIUkVTSF9TSElGVDsKKwlJWEdCX1dSSVRFX1JFRyhodywgUlhEQ1RMLCByeGRjdGwpOworCisJLyogRW5hYmxlIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCBmb3IgVENQIGFuZCBVRFAgKi8KKwlpZihhZGFwdGVyLT5yeF9jc3VtID09IFRSVUUpIHsKKwkJcnhjc3VtID0gSVhHQl9SRUFEX1JFRyhodywgUlhDU1VNKTsKKwkJcnhjc3VtIHw9IElYR0JfUlhDU1VNX1RVT0ZMOworCQlJWEdCX1dSSVRFX1JFRyhodywgUlhDU1VNLCByeGNzdW0pOworCX0KKworCS8qIEVuYWJsZSBSZWNlaXZlcyAqLworCisJSVhHQl9XUklURV9SRUcoaHcsIFJDVEwsIHJjdGwpOworfQorCisvKioKKyAqIGl4Z2JfZnJlZV90eF9yZXNvdXJjZXMgLSBGcmVlIFR4IFJlc291cmNlcworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogRnJlZSBhbGwgdHJhbnNtaXQgc29mdHdhcmUgcmVzb3VyY2VzCisgKiovCisKK3ZvaWQKK2l4Z2JfZnJlZV90eF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisKKwlpeGdiX2NsZWFuX3R4X3JpbmcoYWRhcHRlcik7CisKKwl2ZnJlZShhZGFwdGVyLT50eF9yaW5nLmJ1ZmZlcl9pbmZvKTsKKwlhZGFwdGVyLT50eF9yaW5nLmJ1ZmZlcl9pbmZvID0gTlVMTDsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgYWRhcHRlci0+dHhfcmluZy5zaXplLAorCQkJICAgIGFkYXB0ZXItPnR4X3JpbmcuZGVzYywgYWRhcHRlci0+dHhfcmluZy5kbWEpOworCisJYWRhcHRlci0+dHhfcmluZy5kZXNjID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpeGdiX3VubWFwX2FuZF9mcmVlX3R4X3Jlc291cmNlKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCXN0cnVjdCBpeGdiX2J1ZmZlciAqYnVmZmVyX2luZm8pCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCWlmKGJ1ZmZlcl9pbmZvLT5kbWEpIHsKKwkJcGNpX3VubWFwX3BhZ2UocGRldiwKKwkJCSAgIGJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkgICBidWZmZXJfaW5mby0+bGVuZ3RoLAorCQkJICAgUENJX0RNQV9UT0RFVklDRSk7CisJCWJ1ZmZlcl9pbmZvLT5kbWEgPSAwOworCX0KKwlpZihidWZmZXJfaW5mby0+c2tiKSB7CisJCWRldl9rZnJlZV9za2JfYW55KGJ1ZmZlcl9pbmZvLT5za2IpOworCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKKwl9Cit9CisKKy8qKgorICogaXhnYl9jbGVhbl90eF9yaW5nIC0gRnJlZSBUeCBCdWZmZXJzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KKworc3RhdGljIHZvaWQKK2l4Z2JfY2xlYW5fdHhfcmluZyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyAqdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nOworCXN0cnVjdCBpeGdiX2J1ZmZlciAqYnVmZmVyX2luZm87CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGludCBpOworCisJLyogRnJlZSBhbGwgdGhlIFR4IHJpbmcgc2tfYnVmZnMgKi8KKworCWZvcihpID0gMDsgaSA8IHR4X3JpbmctPmNvdW50OyBpKyspIHsKKwkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCWl4Z2JfdW5tYXBfYW5kX2ZyZWVfdHhfcmVzb3VyY2UoYWRhcHRlciwgYnVmZmVyX2luZm8pOworCX0KKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGl4Z2JfYnVmZmVyKSAqIHR4X3JpbmctPmNvdW50OworCW1lbXNldCh0eF9yaW5nLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CisKKwkvKiBaZXJvIG91dCB0aGUgZGVzY3JpcHRvciByaW5nICovCisKKwltZW1zZXQodHhfcmluZy0+ZGVzYywgMCwgdHhfcmluZy0+c2l6ZSk7CisKKwl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7CisJdHhfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7CisKKwlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFRESCwgMCk7CisJSVhHQl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBURFQsIDApOworfQorCisvKioKKyAqIGl4Z2JfZnJlZV9yeF9yZXNvdXJjZXMgLSBGcmVlIFJ4IFJlc291cmNlcworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogRnJlZSBhbGwgcmVjZWl2ZSBzb2Z0d2FyZSByZXNvdXJjZXMKKyAqKi8KKwordm9pZAoraXhnYl9mcmVlX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyAqcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKworCWl4Z2JfY2xlYW5fcnhfcmluZyhhZGFwdGVyKTsKKworCXZmcmVlKHJ4X3JpbmctPmJ1ZmZlcl9pbmZvKTsKKwlyeF9yaW5nLT5idWZmZXJfaW5mbyA9IE5VTEw7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHJ4X3JpbmctPnNpemUsIHJ4X3JpbmctPmRlc2MsIHJ4X3JpbmctPmRtYSk7CisKKwlyeF9yaW5nLT5kZXNjID0gTlVMTDsKK30KKworLyoqCisgKiBpeGdiX2NsZWFuX3J4X3JpbmcgLSBGcmVlIFJ4IEJ1ZmZlcnMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworCitzdGF0aWMgdm9pZAoraXhnYl9jbGVhbl9yeF9yaW5nKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGl4Z2JfZGVzY19yaW5nICpyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3Jpbmc7CisJc3RydWN0IGl4Z2JfYnVmZmVyICpidWZmZXJfaW5mbzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGludCBpOworCisJLyogRnJlZSBhbGwgdGhlIFJ4IHJpbmcgc2tfYnVmZnMgKi8KKworCWZvcihpID0gMDsgaSA8IHJ4X3JpbmctPmNvdW50OyBpKyspIHsKKwkJYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCWlmKGJ1ZmZlcl9pbmZvLT5za2IpIHsKKworCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LAorCQkJCQkgYnVmZmVyX2luZm8tPmRtYSwKKwkJCQkJIGJ1ZmZlcl9pbmZvLT5sZW5ndGgsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQlkZXZfa2ZyZWVfc2tiKGJ1ZmZlcl9pbmZvLT5za2IpOworCisJCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKKwkJfQorCX0KKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGl4Z2JfYnVmZmVyKSAqIHJ4X3JpbmctPmNvdW50OworCW1lbXNldChyeF9yaW5nLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CisKKwkvKiBaZXJvIG91dCB0aGUgZGVzY3JpcHRvciByaW5nICovCisKKwltZW1zZXQocnhfcmluZy0+ZGVzYywgMCwgcnhfcmluZy0+c2l6ZSk7CisKKwlyeF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gMDsKKwlyeF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7CisKKwlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJESCwgMCk7CisJSVhHQl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRFQsIDApOworfQorCisvKioKKyAqIGl4Z2Jfc2V0X21hYyAtIENoYW5nZSB0aGUgRXRoZXJuZXQgQWRkcmVzcyBvZiB0aGUgTklDCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcDogcG9pbnRlciB0byBhbiBhZGRyZXNzIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKiovCisKK3N0YXRpYyBpbnQKK2l4Z2Jfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKKworCWlmKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CisKKwlpeGdiX3Jhcl9zZXQoJmFkYXB0ZXItPmh3LCBhZGRyLT5zYV9kYXRhLCAwKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl4Z2Jfc2V0X211bHRpIC0gTXVsdGljYXN0IGFuZCBQcm9taXNjdW91cyBtb2RlIHNldAorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoZSBzZXRfbXVsdGkgZW50cnkgcG9pbnQgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBtdWx0aWNhc3QgYWRkcmVzcworICogbGlzdCBvciB0aGUgbmV0d29yayBpbnRlcmZhY2UgZmxhZ3MgYXJlIHVwZGF0ZWQuICBUaGlzIHJvdXRpbmUgaXMKKyAqIHJlc3BvbnNpYmxlIGZvciBjb25maWd1cmluZyB0aGUgaGFyZHdhcmUgZm9yIHByb3BlciBtdWx0aWNhc3QsCisgKiBwcm9taXNjdW91cyBtb2RlLCBhbmQgYWxsLW11bHRpIGJlaGF2aW9yLgorICoqLworCitzdGF0aWMgdm9pZAoraXhnYl9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBpeGdiX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jX3B0cjsKKwl1aW50MzJfdCByY3RsOworCWludCBpOworCisJLyogQ2hlY2sgZm9yIFByb21pc2N1b3VzIGFuZCBBbGwgTXVsdGljYXN0IG1vZGVzICovCisKKwlyY3RsID0gSVhHQl9SRUFEX1JFRyhodywgUkNUTCk7CisKKwlpZihuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJcmN0bCB8PSAoSVhHQl9SQ1RMX1VQRSB8IElYR0JfUkNUTF9NUEUpOworCX0gZWxzZSBpZihuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCXJjdGwgfD0gSVhHQl9SQ1RMX01QRTsKKwkJcmN0bCAmPSB+SVhHQl9SQ1RMX1VQRTsKKwl9IGVsc2UgeworCQlyY3RsICY9IH4oSVhHQl9SQ1RMX1VQRSB8IElYR0JfUkNUTF9NUEUpOworCX0KKworCWlmKG5ldGRldi0+bWNfY291bnQgPiBJWEdCX01BWF9OVU1fTVVMVElDQVNUX0FERFJFU1NFUykgeworCQlyY3RsIHw9IElYR0JfUkNUTF9NUEU7CisJCUlYR0JfV1JJVEVfUkVHKGh3LCBSQ1RMLCByY3RsKTsKKwl9IGVsc2UgeworCQl1aW50OF90IG10YVtuZXRkZXYtPm1jX2NvdW50ICogSVhHQl9FVEhfTEVOR1RIX09GX0FERFJFU1NdOworCisJCUlYR0JfV1JJVEVfUkVHKGh3LCBSQ1RMLCByY3RsKTsKKworCQlmb3IoaSA9IDAsIG1jX3B0ciA9IG5ldGRldi0+bWNfbGlzdDsgbWNfcHRyOworCQkJaSsrLCBtY19wdHIgPSBtY19wdHItPm5leHQpCisJCQltZW1jcHkoJm10YVtpICogSVhHQl9FVEhfTEVOR1RIX09GX0FERFJFU1NdLAorCQkJCSAgIG1jX3B0ci0+ZG1pX2FkZHIsIElYR0JfRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKworCQlpeGdiX21jX2FkZHJfbGlzdF91cGRhdGUoaHcsIG10YSwgbmV0ZGV2LT5tY19jb3VudCwgMCk7CisJfQorfQorCisvKioKKyAqIGl4Z2Jfd2F0Y2hkb2cgLSBUaW1lciBDYWxsLWJhY2sKKyAqIEBkYXRhOiBwb2ludGVyIHRvIG5ldGRldiBjYXN0IGludG8gYW4gdW5zaWduZWQgbG9uZworICoqLworCitzdGF0aWMgdm9pZAoraXhnYl93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgaXhnYl9hZGFwdGVyICopZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyAqdHhkciA9ICZhZGFwdGVyLT50eF9yaW5nOworCisJaXhnYl9jaGVja19mb3JfbGluaygmYWRhcHRlci0+aHcpOworCisJaWYgKGl4Z2JfY2hlY2tfZm9yX2JhZF9saW5rKCZhZGFwdGVyLT5odykpIHsKKwkJLyogZm9yY2UgdGhlIHJlc2V0IHBhdGggKi8KKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCX0KKworCWlmKGFkYXB0ZXItPmh3LmxpbmtfdXApIHsKKwkJaWYoIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiaXhnYjogJXMgTklDIExpbmsgaXMgVXAgJWQgTWJwcyAlc1xuIiwKKwkJCQkgICBuZXRkZXYtPm5hbWUsIDEwMDAwLCAiRnVsbCBEdXBsZXgiKTsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAxMDAwMDsKKwkJCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gRlVMTF9EVVBMRVg7CisJCQluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7CisJCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisJCX0KKwl9IGVsc2UgeworCQlpZihuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAwOworCQkJYWRhcHRlci0+bGlua19kdXBsZXggPSAwOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICJpeGdiOiAlcyBOSUMgTGluayBpcyBEb3duXG4iLAorCQkJCSAgIG5ldGRldi0+bmFtZSk7CisJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJCX0KKwl9CisKKwlpeGdiX3VwZGF0ZV9zdGF0cyhhZGFwdGVyKTsKKworCWlmKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJaWYoSVhHQl9ERVNDX1VOVVNFRCh0eGRyKSArIDEgPCB0eGRyLT5jb3VudCkgeworCQkJLyogV2UndmUgbG9zdCBsaW5rLCBzbyB0aGUgY29udHJvbGxlciBzdG9wcyBETUEsCisJCQkgKiBidXQgd2UndmUgZ290IHF1ZXVlZCBUeCB3b3JrIHRoYXQncyBuZXZlciBnb2luZworCQkJICogdG8gZ2V0IGRvbmUsIHNvIHJlc2V0IGNvbnRyb2xsZXIgdG8gZmx1c2ggVHguCisJCQkgKiAoRG8gdGhlIHJlc2V0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQpLiAqLworCQkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+dHhfdGltZW91dF90YXNrKTsKKwkJfQorCX0KKworCS8qIEZvcmNlIGRldGVjdGlvbiBvZiBodW5nIGNvbnRyb2xsZXIgZXZlcnkgd2F0Y2hkb2cgcGVyaW9kICovCisJYWRhcHRlci0+ZGV0ZWN0X3R4X2h1bmcgPSBUUlVFOworCisJLyogZ2VuZXJhdGUgYW4gaW50ZXJydXB0IHRvIGZvcmNlIGNsZWFuIHVwIG9mIGFueSBzdHJhZ2dsZXJzICovCisJSVhHQl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJQ1MsIElYR0JfSU5UX1RYRFcpOworCisJLyogUmVzZXQgdGhlIHRpbWVyICovCisJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIDIgKiBIWik7Cit9CisKKyNkZWZpbmUgSVhHQl9UWF9GTEFHU19DU1VNCQkweDAwMDAwMDAxCisjZGVmaW5lIElYR0JfVFhfRkxBR1NfVkxBTgkJMHgwMDAwMDAwMgorI2RlZmluZSBJWEdCX1RYX0ZMQUdTX1RTTwkJMHgwMDAwMDAwNAorCitzdGF0aWMgaW5saW5lIGludAoraXhnYl90c28oc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyNpZmRlZiBORVRJRl9GX1RTTworCXN0cnVjdCBpeGdiX2NvbnRleHRfZGVzYyAqY29udGV4dF9kZXNjOworCXVuc2lnbmVkIGludCBpOworCXVpbnQ4X3QgaXBjc3MsIGlwY3NvLCB0dWNzcywgdHVjc28sIGhkcl9sZW47CisJdWludDE2X3QgaXBjc2UsIHR1Y3NlLCBtc3M7CisJaW50IGVycjsKKworCWlmKGxpa2VseShza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKSkgeworCQlpZiAoc2tiX2hlYWRlcl9jbG9uZWQoc2tiKSkgeworCQkJZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJaGRyX2xlbiA9ICgoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKKwkJbXNzID0gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZTsKKwkJc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSAwOworCQlza2ItPm5oLmlwaC0+Y2hlY2sgPSAwOworCQlza2ItPmgudGgtPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKHNrYi0+bmguaXBoLT5zYWRkciwKKwkJCQkJCSAgICAgIHNrYi0+bmguaXBoLT5kYWRkciwKKwkJCQkJCSAgICAgIDAsIElQUFJPVE9fVENQLCAwKTsKKwkJaXBjc3MgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJaXBjc28gPSAodm9pZCAqKSYoc2tiLT5uaC5pcGgtPmNoZWNrKSAtICh2b2lkICopc2tiLT5kYXRhOworCQlpcGNzZSA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGEgLSAxOworCQl0dWNzcyA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CisJCXR1Y3NvID0gKHZvaWQgKikmKHNrYi0+aC50aC0+Y2hlY2spIC0gKHZvaWQgKilza2ItPmRhdGE7CisJCXR1Y3NlID0gMDsKKworCQlpID0gYWRhcHRlci0+dHhfcmluZy5uZXh0X3RvX3VzZTsKKwkJY29udGV4dF9kZXNjID0gSVhHQl9DT05URVhUX0RFU0MoYWRhcHRlci0+dHhfcmluZywgaSk7CisKKwkJY29udGV4dF9kZXNjLT5pcGNzcyA9IGlwY3NzOworCQljb250ZXh0X2Rlc2MtPmlwY3NvID0gaXBjc287CisJCWNvbnRleHRfZGVzYy0+aXBjc2UgPSBjcHVfdG9fbGUxNihpcGNzZSk7CisJCWNvbnRleHRfZGVzYy0+dHVjc3MgPSB0dWNzczsKKwkJY29udGV4dF9kZXNjLT50dWNzbyA9IHR1Y3NvOworCQljb250ZXh0X2Rlc2MtPnR1Y3NlID0gY3B1X3RvX2xlMTYodHVjc2UpOworCQljb250ZXh0X2Rlc2MtPm1zcyA9IGNwdV90b19sZTE2KG1zcyk7CisJCWNvbnRleHRfZGVzYy0+aGRyX2xlbiA9IGhkcl9sZW47CisJCWNvbnRleHRfZGVzYy0+c3RhdHVzID0gMDsKKwkJY29udGV4dF9kZXNjLT5jbWRfdHlwZV9sZW4gPSBjcHVfdG9fbGUzMigKKwkJCQkJCSAgSVhHQl9DT05URVhUX0RFU0NfVFlQRSAKKwkJCQkJCXwgSVhHQl9DT05URVhUX0RFU0NfQ01EX1RTRQorCQkJCQkJfCBJWEdCX0NPTlRFWFRfREVTQ19DTURfSVAKKwkJCQkJCXwgSVhHQl9DT05URVhUX0RFU0NfQ01EX1RDUAorCQkJCQkJfCBJWEdCX0NPTlRFWFRfREVTQ19DTURfUlMKKwkJCQkJCXwgSVhHQl9DT05URVhUX0RFU0NfQ01EX0lERQorCQkJCQkJfCAoc2tiLT5sZW4gLSAoaGRyX2xlbikpKTsKKworCQlpZigrK2kgPT0gYWRhcHRlci0+dHhfcmluZy5jb3VudCkgaSA9IDA7CisJCWFkYXB0ZXItPnR4X3JpbmcubmV4dF90b191c2UgPSBpOworCisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbGVhbl90CitpeGdiX3R4X2NzdW0oc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXhnYl9jb250ZXh0X2Rlc2MgKmNvbnRleHRfZGVzYzsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1aW50OF90IGNzcywgY3NvOworCisJaWYobGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSkgeworCQljc3MgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOworCQljc28gPSAoc2tiLT5oLnJhdyArIHNrYi0+Y3N1bSkgLSBza2ItPmRhdGE7CisKKwkJaSA9IGFkYXB0ZXItPnR4X3JpbmcubmV4dF90b191c2U7CisJCWNvbnRleHRfZGVzYyA9IElYR0JfQ09OVEVYVF9ERVNDKGFkYXB0ZXItPnR4X3JpbmcsIGkpOworCisJCWNvbnRleHRfZGVzYy0+dHVjc3MgPSBjc3M7CisJCWNvbnRleHRfZGVzYy0+dHVjc28gPSBjc287CisJCWNvbnRleHRfZGVzYy0+dHVjc2UgPSAwOworCQkvKiB6ZXJvIG91dCBhbnkgcHJldmlvdXNseSBleGlzdGluZyBkYXRhIGluIG9uZSBpbnN0cnVjdGlvbiAqLworCQkqKHVpbnQzMl90ICopJihjb250ZXh0X2Rlc2MtPmlwY3NzKSA9IDA7CisJCWNvbnRleHRfZGVzYy0+c3RhdHVzID0gMDsKKwkJY29udGV4dF9kZXNjLT5oZHJfbGVuID0gMDsKKwkJY29udGV4dF9kZXNjLT5tc3MgPSAwOworCQljb250ZXh0X2Rlc2MtPmNtZF90eXBlX2xlbiA9CisJCQljcHVfdG9fbGUzMihJWEdCX0NPTlRFWFRfREVTQ19UWVBFCisJCQkJCXwgSVhHQl9UWF9ERVNDX0NNRF9SUyAKKwkJCQkJfCBJWEdCX1RYX0RFU0NfQ01EX0lERSk7CisKKwkJaWYoKytpID09IGFkYXB0ZXItPnR4X3JpbmcuY291bnQpIGkgPSAwOworCQlhZGFwdGVyLT50eF9yaW5nLm5leHRfdG9fdXNlID0gaTsKKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKyNkZWZpbmUgSVhHQl9NQVhfVFhEX1BXUgkxNAorI2RlZmluZSBJWEdCX01BWF9EQVRBX1BFUl9UWEQJKDE8PElYR0JfTUFYX1RYRF9QV1IpCisKK3N0YXRpYyBpbmxpbmUgaW50CitpeGdiX3R4X21hcChzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgICB1bnNpZ25lZCBpbnQgZmlyc3QpCit7CisJc3RydWN0IGl4Z2JfZGVzY19yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IGl4Z2JfYnVmZmVyICpidWZmZXJfaW5mbzsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisJdW5zaWduZWQgaW50IG9mZnNldCA9IDAsIHNpemUsIGNvdW50ID0gMCwgaTsKKworCXVuc2lnbmVkIGludCBucl9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJdW5zaWduZWQgaW50IGY7CisJbGVuIC09IHNrYi0+ZGF0YV9sZW47CisKKwlpID0gdHhfcmluZy0+bmV4dF90b191c2U7CisKKwl3aGlsZShsZW4pIHsKKwkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCXNpemUgPSBtaW4obGVuLCBJWEdCX01BWF9KVU1CT19GUkFNRV9TSVpFKTsKKwkJYnVmZmVyX2luZm8tPmxlbmd0aCA9IHNpemU7CisJCWJ1ZmZlcl9pbmZvLT5kbWEgPQorCQkJcGNpX21hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwKKwkJCQlza2ItPmRhdGEgKyBvZmZzZXQsCisJCQkJc2l6ZSwKKwkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJYnVmZmVyX2luZm8tPnRpbWVfc3RhbXAgPSBqaWZmaWVzOworCisJCWxlbiAtPSBzaXplOworCQlvZmZzZXQgKz0gc2l6ZTsKKwkJY291bnQrKzsKKwkJaWYoKytpID09IHR4X3JpbmctPmNvdW50KSBpID0gMDsKKwl9CisKKwlmb3IoZiA9IDA7IGYgPCBucl9mcmFnczsgZisrKSB7CisJCXN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKmZyYWc7CisKKwkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZdOworCQlsZW4gPSBmcmFnLT5zaXplOworCQlvZmZzZXQgPSAwOworCisJCXdoaWxlKGxlbikgeworCQkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCQlzaXplID0gbWluKGxlbiwgSVhHQl9NQVhfSlVNQk9fRlJBTUVfU0laRSk7CisJCQlidWZmZXJfaW5mby0+bGVuZ3RoID0gc2l6ZTsKKwkJCWJ1ZmZlcl9pbmZvLT5kbWEgPQorCQkJCXBjaV9tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJCQlmcmFnLT5wYWdlLAorCQkJCQlmcmFnLT5wYWdlX29mZnNldCArIG9mZnNldCwKKwkJCQkJc2l6ZSwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlidWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisKKwkJCWxlbiAtPSBzaXplOworCQkJb2Zmc2V0ICs9IHNpemU7CisJCQljb3VudCsrOworCQkJaWYoKytpID09IHR4X3JpbmctPmNvdW50KSBpID0gMDsKKwkJfQorCX0KKwlpID0gKGkgPT0gMCkgPyB0eF9yaW5nLT5jb3VudCAtIDEgOiBpIC0gMTsKKwl0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5za2IgPSBza2I7CisJdHhfcmluZy0+YnVmZmVyX2luZm9bZmlyc3RdLm5leHRfdG9fd2F0Y2ggPSBpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2l4Z2JfdHhfcXVldWUoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciwgaW50IGNvdW50LCBpbnQgdmxhbl9pZCxpbnQgdHhfZmxhZ3MpCit7CisJc3RydWN0IGl4Z2JfZGVzY19yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IGl4Z2JfdHhfZGVzYyAqdHhfZGVzYyA9IE5VTEw7CisJc3RydWN0IGl4Z2JfYnVmZmVyICpidWZmZXJfaW5mbzsKKwl1aW50MzJfdCBjbWRfdHlwZV9sZW4gPSBhZGFwdGVyLT50eF9jbWRfdHlwZTsKKwl1aW50OF90IHN0YXR1cyA9IDA7CisJdWludDhfdCBwb3B0cyA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZih0eF9mbGFncyAmIElYR0JfVFhfRkxBR1NfVFNPKSB7CisJCWNtZF90eXBlX2xlbiB8PSBJWEdCX1RYX0RFU0NfQ01EX1RTRTsKKwkJcG9wdHMgfD0gKElYR0JfVFhfREVTQ19QT1BUU19JWFNNIHwgSVhHQl9UWF9ERVNDX1BPUFRTX1RYU00pOworCX0KKworCWlmKHR4X2ZsYWdzICYgSVhHQl9UWF9GTEFHU19DU1VNKQorCQlwb3B0cyB8PSBJWEdCX1RYX0RFU0NfUE9QVFNfVFhTTTsKKworCWlmKHR4X2ZsYWdzICYgSVhHQl9UWF9GTEFHU19WTEFOKSB7CisJCWNtZF90eXBlX2xlbiB8PSBJWEdCX1RYX0RFU0NfQ01EX1ZMRTsKKwl9CisKKwlpID0gdHhfcmluZy0+bmV4dF90b191c2U7CisKKwl3aGlsZShjb3VudC0tKSB7CisJCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCQl0eF9kZXNjID0gSVhHQl9UWF9ERVNDKCp0eF9yaW5nLCBpKTsKKwkJdHhfZGVzYy0+YnVmZl9hZGRyID0gY3B1X3RvX2xlNjQoYnVmZmVyX2luZm8tPmRtYSk7CisJCXR4X2Rlc2MtPmNtZF90eXBlX2xlbiA9CisJCQljcHVfdG9fbGUzMihjbWRfdHlwZV9sZW4gfCBidWZmZXJfaW5mby0+bGVuZ3RoKTsKKwkJdHhfZGVzYy0+c3RhdHVzID0gc3RhdHVzOworCQl0eF9kZXNjLT5wb3B0cyA9IHBvcHRzOworCQl0eF9kZXNjLT52bGFuID0gY3B1X3RvX2xlMTYodmxhbl9pZCk7CisKKwkJaWYoKytpID09IHR4X3JpbmctPmNvdW50KSBpID0gMDsKKwl9CisKKwl0eF9kZXNjLT5jbWRfdHlwZV9sZW4gfD0gY3B1X3RvX2xlMzIoSVhHQl9UWF9ERVNDX0NNRF9FT1AgCisJCQkJfCBJWEdCX1RYX0RFU0NfQ01EX1JTICk7CisKKwkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIHRvIGNvbXBsZXRlIGJlZm9yZSBsZXR0aW5nIGgvdworCSAqIGtub3cgdGhlcmUgYXJlIG5ldyBkZXNjcmlwdG9ycyB0byBmZXRjaC4gIChPbmx5CisJICogYXBwbGljYWJsZSBmb3Igd2Vhay1vcmRlcmVkIG1lbW9yeSBtb2RlbCBhcmNocywKKwkgKiBzdWNoIGFzIElBLTY0KS4gKi8KKwl3bWIoKTsKKworCXR4X3JpbmctPm5leHRfdG9fdXNlID0gaTsKKwlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFREVCwgaSk7Cit9CisKKy8qIFR4IERlc2NyaXB0b3JzIG5lZWRlZCwgd29yc3QgY2FzZSAqLworI2RlZmluZSBUWERfVVNFX0NPVU5UKFMpICgoKFMpID4+IElYR0JfTUFYX1RYRF9QV1IpICsgXAorCQkJICgoKFMpICYgKElYR0JfTUFYX0RBVEFfUEVSX1RYRCAtIDEpKSA/IDEgOiAwKSkKKyNkZWZpbmUgREVTQ19ORUVERUQgVFhEX1VTRV9DT1VOVChJWEdCX01BWF9EQVRBX1BFUl9UWEQpICsgXAorCU1BWF9TS0JfRlJBR1MgKiBUWERfVVNFX0NPVU5UKFBBR0VfU0laRSkgKyAxCisKK3N0YXRpYyBpbnQKK2l4Z2JfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJdW5zaWduZWQgaW50IGZpcnN0OworCXVuc2lnbmVkIGludCB0eF9mbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdmxhbl9pZCA9IDA7CisJaW50IHRzbzsKKworCWlmKHNrYi0+bGVuIDw9IDApIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnR4X2xvY2ssIGZsYWdzKTsKKwlpZih1bmxpa2VseShJWEdCX0RFU0NfVU5VU0VEKCZhZGFwdGVyLT50eF9yaW5nKSA8IERFU0NfTkVFREVEKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnR4X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnR4X2xvY2ssIGZsYWdzKTsKKworCWlmKGFkYXB0ZXItPnZsZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCQl0eF9mbGFncyB8PSBJWEdCX1RYX0ZMQUdTX1ZMQU47CisJCXZsYW5faWQgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKKwl9CisKKwlmaXJzdCA9IGFkYXB0ZXItPnR4X3JpbmcubmV4dF90b191c2U7CisJCisJdHNvID0gaXhnYl90c28oYWRhcHRlciwgc2tiKTsKKwlpZiAodHNvIDwgMCkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gTkVUREVWX1RYX09LOworCX0KKworCWlmICh0c28pCisJCXR4X2ZsYWdzIHw9IElYR0JfVFhfRkxBR1NfVFNPOworCWVsc2UgaWYoaXhnYl90eF9jc3VtKGFkYXB0ZXIsIHNrYikpCisJCXR4X2ZsYWdzIHw9IElYR0JfVFhfRkxBR1NfQ1NVTTsKKworCWl4Z2JfdHhfcXVldWUoYWRhcHRlciwgaXhnYl90eF9tYXAoYWRhcHRlciwgc2tiLCBmaXJzdCksIHZsYW5faWQsCisJCQl0eF9mbGFncyk7CisKKwluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl4Z2JfdHhfdGltZW91dCAtIFJlc3BvbmQgdG8gYSBUeCBIYW5nCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyB2b2lkCitpeGdiX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJLyogRG8gdGhlIHJlc2V0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQgKi8KKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2spOworfQorCitzdGF0aWMgdm9pZAoraXhnYl90eF90aW1lb3V0X3Rhc2soc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJaXhnYl9kb3duKGFkYXB0ZXIsIFRSVUUpOworCWl4Z2JfdXAoYWRhcHRlcik7Cit9CisKKy8qKgorICogaXhnYl9nZXRfc3RhdHMgLSBHZXQgU3lzdGVtIE5ldHdvcmsgU3RhdGlzdGljcworICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBzdGF0aXN0aWNzIHN0cnVjdHVyZS4KKyAqIFRoZSBzdGF0aXN0aWNzIGFyZSBhY3R1YWxseSB1cGRhdGVkIGZyb20gdGhlIHRpbWVyIGNhbGxiYWNrLgorICoqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgoraXhnYl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJcmV0dXJuICZhZGFwdGVyLT5uZXRfc3RhdHM7Cit9CisKKy8qKgorICogaXhnYl9jaGFuZ2VfbXR1IC0gQ2hhbmdlIHRoZSBNYXhpbXVtIFRyYW5zZmVyIFVuaXQKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBuZXdfbXR1OiBuZXcgdmFsdWUgZm9yIG1heGltdW0gZnJhbWUgc2l6ZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKiovCisKK3N0YXRpYyBpbnQKK2l4Z2JfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWludCBtYXhfZnJhbWUgPSBuZXdfbXR1ICsgRU5FVF9IRUFERVJfU0laRSArIEVORVRfRkNTX0xFTkdUSDsKKwlpbnQgb2xkX21heF9mcmFtZSA9IG5ldGRldi0+bXR1ICsgRU5FVF9IRUFERVJfU0laRSArIEVORVRfRkNTX0xFTkdUSDsKKworCisJaWYoKG1heF9mcmFtZSA8IElYR0JfTUlOX0VORVRfRlJBTUVfU0laRV9XSVRIT1VUX0ZDUyArIEVORVRfRkNTX0xFTkdUSCkKKwkgICB8fCAobWF4X2ZyYW1lID4gSVhHQl9NQVhfSlVNQk9fRlJBTUVfU0laRSArIEVORVRfRkNTX0xFTkdUSCkpIHsKKwkJSVhHQl9FUlIoIkludmFsaWQgTVRVIHNldHRpbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZigobWF4X2ZyYW1lIDw9IElYR0JfTUFYX0VORVRfRlJBTUVfU0laRV9XSVRIT1VUX0ZDUyArIEVORVRfRkNTX0xFTkdUSCkKKwkgICB8fCAobWF4X2ZyYW1lIDw9IElYR0JfUlhCVUZGRVJfMjA0OCkpIHsKKwkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IElYR0JfUlhCVUZGRVJfMjA0ODsKKworCX0gZWxzZSBpZihtYXhfZnJhbWUgPD0gSVhHQl9SWEJVRkZFUl80MDk2KSB7CisJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSBJWEdCX1JYQlVGRkVSXzQwOTY7CisKKwl9IGVsc2UgaWYobWF4X2ZyYW1lIDw9IElYR0JfUlhCVUZGRVJfODE5MikgeworCQlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gSVhHQl9SWEJVRkZFUl84MTkyOworCisJfSBlbHNlIHsKKwkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IElYR0JfUlhCVUZGRVJfMTYzODQ7CisJfQorCisJbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OworCisJaWYob2xkX21heF9mcmFtZSAhPSBtYXhfZnJhbWUgJiYgbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisKKwkJaXhnYl9kb3duKGFkYXB0ZXIsIFRSVUUpOworCQlpeGdiX3VwKGFkYXB0ZXIpOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl4Z2JfdXBkYXRlX3N0YXRzIC0gVXBkYXRlIHRoZSBib2FyZCBzdGF0aXN0aWNzIGNvdW50ZXJzLgorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3ZvaWQKK2l4Z2JfdXBkYXRlX3N0YXRzKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJYWRhcHRlci0+c3RhdHMudHBybCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVFBSTCk7CisJYWRhcHRlci0+c3RhdHMudHByaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVFBSSCk7CisJYWRhcHRlci0+c3RhdHMuZ3ByY2wgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEdQUkNMKTsKKwlhZGFwdGVyLT5zdGF0cy5ncHJjaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgR1BSQ0gpOworCWFkYXB0ZXItPnN0YXRzLmJwcmNsICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBCUFJDTCk7CisJYWRhcHRlci0+c3RhdHMuYnByY2ggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEJQUkNIKTsKKwlhZGFwdGVyLT5zdGF0cy5tcHJjbCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgTVBSQ0wpOworCWFkYXB0ZXItPnN0YXRzLm1wcmNoICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNUFJDSCk7CisJYWRhcHRlci0+c3RhdHMudXByY2wgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFVQUkNMKTsKKwlhZGFwdGVyLT5zdGF0cy51cHJjaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVVBSQ0gpOworCWFkYXB0ZXItPnN0YXRzLnZwcmNsICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBWUFJDTCk7CisJYWRhcHRlci0+c3RhdHMudnByY2ggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFZQUkNIKTsKKwlhZGFwdGVyLT5zdGF0cy5qcHJjbCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgSlBSQ0wpOworCWFkYXB0ZXItPnN0YXRzLmpwcmNoICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBKUFJDSCk7CisJYWRhcHRlci0+c3RhdHMuZ29yY2wgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEdPUkNMKTsKKwlhZGFwdGVyLT5zdGF0cy5nb3JjaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgR09SQ0gpOworCWFkYXB0ZXItPnN0YXRzLnRvcmwgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRPUkwpOworCWFkYXB0ZXItPnN0YXRzLnRvcmggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRPUkgpOworCWFkYXB0ZXItPnN0YXRzLnJuYmMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJOQkMpOworCWFkYXB0ZXItPnN0YXRzLnJ1YyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUlVDKTsKKwlhZGFwdGVyLT5zdGF0cy5yb2MgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJPQyk7CisJYWRhcHRlci0+c3RhdHMucmxlYyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkxFQyk7CisJYWRhcHRlci0+c3RhdHMuY3JjZXJycyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgQ1JDRVJSUyk7CisJYWRhcHRlci0+c3RhdHMuaWNiYyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgSUNCQyk7CisJYWRhcHRlci0+c3RhdHMuZWNiYyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRUNCQyk7CisJYWRhcHRlci0+c3RhdHMubXBjICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNUEMpOworCWFkYXB0ZXItPnN0YXRzLnRwdGwgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRQVEwpOworCWFkYXB0ZXItPnN0YXRzLnRwdGggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRQVEgpOworCWFkYXB0ZXItPnN0YXRzLmdwdGNsICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBHUFRDTCk7CisJYWRhcHRlci0+c3RhdHMuZ3B0Y2ggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEdQVENIKTsKKwlhZGFwdGVyLT5zdGF0cy5icHRjbCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgQlBUQ0wpOworCWFkYXB0ZXItPnN0YXRzLmJwdGNoICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBCUFRDSCk7CisJYWRhcHRlci0+c3RhdHMubXB0Y2wgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1QVENMKTsKKwlhZGFwdGVyLT5zdGF0cy5tcHRjaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgTVBUQ0gpOworCWFkYXB0ZXItPnN0YXRzLnVwdGNsICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBVUFRDTCk7CisJYWRhcHRlci0+c3RhdHMudXB0Y2ggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFVQVENIKTsKKwlhZGFwdGVyLT5zdGF0cy52cHRjbCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVlBUQ0wpOworCWFkYXB0ZXItPnN0YXRzLnZwdGNoICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBWUFRDSCk7CisJYWRhcHRlci0+c3RhdHMuanB0Y2wgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEpQVENMKTsKKwlhZGFwdGVyLT5zdGF0cy5qcHRjaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgSlBUQ0gpOworCWFkYXB0ZXItPnN0YXRzLmdvdGNsICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBHT1RDTCk7CisJYWRhcHRlci0+c3RhdHMuZ290Y2ggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEdPVENIKTsKKwlhZGFwdGVyLT5zdGF0cy50b3RsICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBUT1RMKTsKKwlhZGFwdGVyLT5zdGF0cy50b3RoICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBUT1RIKTsKKwlhZGFwdGVyLT5zdGF0cy5kYyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgREMpOworCWFkYXB0ZXItPnN0YXRzLnBsdDY0YyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUExUNjRDKTsKKwlhZGFwdGVyLT5zdGF0cy50c2N0YyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVFNDVEMpOworCWFkYXB0ZXItPnN0YXRzLnRzY3RmYyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVFNDVEZDKTsKKwlhZGFwdGVyLT5zdGF0cy5pYmljICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBJQklDKTsKKwlhZGFwdGVyLT5zdGF0cy5yZmMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJGQyk7CisJYWRhcHRlci0+c3RhdHMubGZjICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBMRkMpOworCWFkYXB0ZXItPnN0YXRzLnBmcmMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFBGUkMpOworCWFkYXB0ZXItPnN0YXRzLnBmdGMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFBGVEMpOworCWFkYXB0ZXItPnN0YXRzLm1jZnJjICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNQ0ZSQyk7CisJYWRhcHRlci0+c3RhdHMubWNmdGMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1DRlRDKTsKKwlhZGFwdGVyLT5zdGF0cy54b25yeGMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFhPTlJYQyk7CisJYWRhcHRlci0+c3RhdHMueG9udHhjICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBYT05UWEMpOworCWFkYXB0ZXItPnN0YXRzLnhvZmZyeGMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFhPRkZSWEMpOworCWFkYXB0ZXItPnN0YXRzLnhvZmZ0eGMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFhPRkZUWEMpOworCWFkYXB0ZXItPnN0YXRzLnJqYyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkpDKTsKKworCS8qIEZpbGwgb3V0IHRoZSBPUyBzdGF0aXN0aWNzIHN0cnVjdHVyZSAqLworCisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X3BhY2tldHMgPSBhZGFwdGVyLT5zdGF0cy5ncHJjbDsKKwlhZGFwdGVyLT5uZXRfc3RhdHMudHhfcGFja2V0cyA9IGFkYXB0ZXItPnN0YXRzLmdwdGNsOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9ieXRlcyA9IGFkYXB0ZXItPnN0YXRzLmdvcmNsOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9ieXRlcyA9IGFkYXB0ZXItPnN0YXRzLmdvdGNsOworCWFkYXB0ZXItPm5ldF9zdGF0cy5tdWx0aWNhc3QgPSBhZGFwdGVyLT5zdGF0cy5tcHJjbDsKKwlhZGFwdGVyLT5uZXRfc3RhdHMuY29sbGlzaW9ucyA9IDA7CisKKwkvKiBpZ25vcmUgUkxFQyBhcyBpdCByZXBvcnRzIGVycm9ycyBmb3IgcGFkZGVkICg8NjRieXRlcykgZnJhbWVzCisJICogd2l0aCBhIGxlbmd0aCBpbiB0aGUgdHlwZS9sZW4gZmllbGQgKi8KKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZXJyb3JzID0KKwkgICAgLyogYWRhcHRlci0+c3RhdHMucm5iYyArICovIGFkYXB0ZXItPnN0YXRzLmNyY2VycnMgKworCSAgICBhZGFwdGVyLT5zdGF0cy5ydWMgKworCSAgICBhZGFwdGVyLT5zdGF0cy5yb2MgLyorIGFkYXB0ZXItPnN0YXRzLnJsZWMgKi8gICsKKwkgICAgYWRhcHRlci0+c3RhdHMuaWNiYyArCisJICAgIGFkYXB0ZXItPnN0YXRzLmVjYmMgKyBhZGFwdGVyLT5zdGF0cy5tcGM7CisKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZHJvcHBlZCA9IGFkYXB0ZXItPnN0YXRzLm1wYzsKKworCS8qIHNlZSBhYm92ZQorCSAqIGFkYXB0ZXItPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMucmxlYzsKKwkgKi8KKworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMuY3JjZXJyczsKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZmlmb19lcnJvcnMgPSBhZGFwdGVyLT5zdGF0cy5tcGM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBhZGFwdGVyLT5zdGF0cy5tcGM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X292ZXJfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMubXBjOworCisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2Vycm9ycyA9IDA7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IDA7CisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gMDsKKwlhZGFwdGVyLT5uZXRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPSAwOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9maWZvX2Vycm9ycyA9IDA7CisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMgPSAwOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gMDsKK30KKworI2RlZmluZSBJWEdCX01BWF9JTlRSIDEwCisvKioKKyAqIGl4Z2JfaW50ciAtIEludGVycnVwdCBIYW5kbGVyCisgKiBAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAZGF0YTogcG9pbnRlciB0byBhIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwdF9yZWdzOiBDUFUgcmVnaXN0ZXJzIHN0cnVjdHVyZQorICoqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK2l4Z2JfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBpeGdiX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1aW50MzJfdCBpY3IgPSBJWEdCX1JFQURfUkVHKGh3LCBJQ1IpOworI2lmbmRlZiBDT05GSUdfSVhHQl9OQVBJCisJdW5zaWduZWQgaW50IGk7CisjZW5kaWYKKworCWlmKHVubGlrZWx5KCFpY3IpKQorCQlyZXR1cm4gSVJRX05PTkU7ICAvKiBOb3Qgb3VyIGludGVycnVwdCAqLworCisJaWYodW5saWtlbHkoaWNyICYgKElYR0JfSU5UX1JYU0VRIHwgSVhHQl9JTlRfTFNDKSkpIHsKKwkJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyk7CisJfQorCisjaWZkZWYgQ09ORklHX0lYR0JfTkFQSQorCWlmKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAobmV0ZGV2KSkgeworCisJCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgcmVnaXN0ZXIgZm9yIHBvbGwuIFRoZSBmbHVzaCAKKwkJICBvZiB0aGUgcG9zdGVkIHdyaXRlIGlzIGludGVudGlvbmFsbHkgbGVmdCBvdXQuCisJCSovCisKKwkJYXRvbWljX2luYygmYWRhcHRlci0+aXJxX3NlbSk7CisJCUlYR0JfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSU1DLCB+MCk7CisJCV9fbmV0aWZfcnhfc2NoZWR1bGUobmV0ZGV2KTsKKwl9CisjZWxzZQorCS8qIHllcywgdGhhdCBpcyBhY3R1YWxseSBhICYgYW5kIGl0IGlzIG1lYW50IHRvIG1ha2Ugc3VyZSB0aGF0CisJICogZXZlcnkgcGFzcyB0aHJvdWdoIHRoaXMgZm9yIGxvb3AgY2hlY2tzIGJvdGggcmVjZWl2ZSBhbmQKKwkgKiB0cmFuc21pdCBxdWV1ZXMgZm9yIGNvbXBsZXRlZCBkZXNjcmlwdG9ycywgaW50ZW5kZWQgdG8KKwkgKiBhdm9pZCBzdGFydmF0aW9uIGlzc3VlcyBhbmQgYXNzaXN0IHR4L3J4IGZhaXJuZXNzLiAqLworCWZvcihpID0gMDsgaSA8IElYR0JfTUFYX0lOVFI7IGkrKykKKwkJaWYoIWl4Z2JfY2xlYW5fcnhfaXJxKGFkYXB0ZXIpICYKKwkJICAgIWl4Z2JfY2xlYW5fdHhfaXJxKGFkYXB0ZXIpKQorCQkJYnJlYWs7CisjZW5kaWYgCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWZkZWYgQ09ORklHX0lYR0JfTkFQSQorLyoqCisgKiBpeGdiX2NsZWFuIC0gTkFQSSBSeCBwb2xsaW5nIGNhbGxiYWNrCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KKworc3RhdGljIGludAoraXhnYl9jbGVhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWludCB3b3JrX3RvX2RvID0gbWluKCpidWRnZXQsIG5ldGRldi0+cXVvdGEpOworCWludCB0eF9jbGVhbmVkOworCWludCB3b3JrX2RvbmUgPSAwOworCisJdHhfY2xlYW5lZCA9IGl4Z2JfY2xlYW5fdHhfaXJxKGFkYXB0ZXIpOworCWl4Z2JfY2xlYW5fcnhfaXJxKGFkYXB0ZXIsICZ3b3JrX2RvbmUsIHdvcmtfdG9fZG8pOworCisJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CisJbmV0ZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisKKwkvKiBpZiBubyBUeCBhbmQgbm90IGVub3VnaCBSeCB3b3JrIGRvbmUsIGV4aXQgdGhlIHBvbGxpbmcgbW9kZSAqLworCWlmKCghdHhfY2xlYW5lZCAmJiAod29ya19kb25lID09IDApKSB8fCAhbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCW5ldGlmX3J4X2NvbXBsZXRlKG5ldGRldik7CisJCWl4Z2JfaXJxX2VuYWJsZShhZGFwdGVyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoqCisgKiBpeGdiX2NsZWFuX3R4X2lycSAtIFJlY2xhaW0gcmVzb3VyY2VzIGFmdGVyIHRyYW5zbWl0IGNvbXBsZXRlcworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyBib29sZWFuX3QKK2l4Z2JfY2xlYW5fdHhfaXJxKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGl4Z2JfZGVzY19yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlzdHJ1Y3QgaXhnYl90eF9kZXNjICp0eF9kZXNjLCAqZW9wX2Rlc2M7CisJc3RydWN0IGl4Z2JfYnVmZmVyICpidWZmZXJfaW5mbzsKKwl1bnNpZ25lZCBpbnQgaSwgZW9wOworCWJvb2xlYW5fdCBjbGVhbmVkID0gRkFMU0U7CisKKwlpID0gdHhfcmluZy0+bmV4dF90b19jbGVhbjsKKwllb3AgPSB0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5uZXh0X3RvX3dhdGNoOworCWVvcF9kZXNjID0gSVhHQl9UWF9ERVNDKCp0eF9yaW5nLCBlb3ApOworCisJd2hpbGUoZW9wX2Rlc2MtPnN0YXR1cyAmIElYR0JfVFhfREVTQ19TVEFUVVNfREQpIHsKKworCQlmb3IoY2xlYW5lZCA9IEZBTFNFOyAhY2xlYW5lZDsgKSB7CisJCQl0eF9kZXNjID0gSVhHQl9UWF9ERVNDKCp0eF9yaW5nLCBpKTsKKwkJCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCisJCQlpZiAodHhfZGVzYy0+cG9wdHMKKwkJCSAgICAmIChJWEdCX1RYX0RFU0NfUE9QVFNfVFhTTSB8CisJCQkgICAgICAgSVhHQl9UWF9ERVNDX1BPUFRTX0lYU00pKQorCQkJCWFkYXB0ZXItPmh3X2NzdW1fdHhfZ29vZCsrOworCisJCQlpeGdiX3VubWFwX2FuZF9mcmVlX3R4X3Jlc291cmNlKGFkYXB0ZXIsIGJ1ZmZlcl9pbmZvKTsKKworCQkJKih1aW50MzJfdCAqKSYodHhfZGVzYy0+c3RhdHVzKSA9IDA7CisKKwkJCWNsZWFuZWQgPSAoaSA9PSBlb3ApOworCQkJaWYoKytpID09IHR4X3JpbmctPmNvdW50KSBpID0gMDsKKwkJfQorCisJCWVvcCA9IHR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldLm5leHRfdG9fd2F0Y2g7CisJCWVvcF9kZXNjID0gSVhHQl9UWF9ERVNDKCp0eF9yaW5nLCBlb3ApOworCX0KKworCXR4X3JpbmctPm5leHRfdG9fY2xlYW4gPSBpOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT50eF9sb2NrKTsKKwlpZihjbGVhbmVkICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSAmJiBuZXRpZl9jYXJyaWVyX29rKG5ldGRldikgJiYKKwkgICAoSVhHQl9ERVNDX1VOVVNFRCh0eF9yaW5nKSA+IElYR0JfVFhfUVVFVUVfV0FLRSkpIHsKKworCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisJfQorCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT50eF9sb2NrKTsKKworCWlmKGFkYXB0ZXItPmRldGVjdF90eF9odW5nKSB7CisJCS8qIGRldGVjdCBhIHRyYW5zbWl0IGhhbmcgaW4gaGFyZHdhcmUsIHRoaXMgc2VyaWFsaXplcyB0aGUKKwkJICogY2hlY2sgd2l0aCB0aGUgY2xlYXJpbmcgb2YgdGltZV9zdGFtcCBhbmQgbW92ZW1lbnQgb2YgaSAqLworCQlhZGFwdGVyLT5kZXRlY3RfdHhfaHVuZyA9IEZBTFNFOworCQlpZih0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5kbWEgJiYKKwkJICAgdGltZV9hZnRlcihqaWZmaWVzLCB0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS50aW1lX3N0YW1wICsgSFopCisJCSAgICYmICEoSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJgorCQkJSVhHQl9TVEFUVVNfVFhPRkYpKQorCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCX0KKworCXJldHVybiBjbGVhbmVkOworfQorCisvKioKKyAqIGl4Z2JfcnhfY2hlY2tzdW0gLSBSZWNlaXZlIENoZWNrc3VtIE9mZmxvYWQgZm9yIDgyNTk3LgorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiBAcnhfZGVzYzogcmVjZWl2ZSBkZXNjcmlwdG9yCisgKiBAc2tfYnVmZjogc29ja2V0IGJ1ZmZlciB3aXRoIHJlY2VpdmVkIGRhdGEKKyAqKi8KKworc3RhdGljIGlubGluZSB2b2lkCitpeGdiX3J4X2NoZWNrc3VtKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCSBzdHJ1Y3QgaXhnYl9yeF9kZXNjICpyeF9kZXNjLAorCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBJZ25vcmUgQ2hlY2tzdW0gYml0IGlzIHNldCBPUgorCSAqIFRDUCBDaGVja3N1bSBoYXMgbm90IGJlZW4gY2FsY3VsYXRlZAorCSAqLworCWlmKChyeF9kZXNjLT5zdGF0dXMgJiBJWEdCX1JYX0RFU0NfU1RBVFVTX0lYU00pIHx8CisJICAgKCEocnhfZGVzYy0+c3RhdHVzICYgSVhHQl9SWF9ERVNDX1NUQVRVU19UQ1BDUykpKSB7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJcmV0dXJuOworCX0KKworCS8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGUgaGFyZHdhcmUgZGlkIHRoZSBUQ1AgY2hlY2tzdW0gKi8KKwkvKiBub3cgbG9vayBhdCB0aGUgVENQIGNoZWNrc3VtIGVycm9yIGJpdCAqLworCWlmKHJ4X2Rlc2MtPmVycm9ycyAmIElYR0JfUlhfREVTQ19FUlJPUlNfVENQRSkgeworCQkvKiBsZXQgdGhlIHN0YWNrIHZlcmlmeSBjaGVja3N1bSBlcnJvcnMgKi8KKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQlhZGFwdGVyLT5od19jc3VtX3J4X2Vycm9yKys7CisJfSBlbHNlIHsKKwkJLyogVENQIGNoZWNrc3VtIGlzIGdvb2QgKi8KKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJYWRhcHRlci0+aHdfY3N1bV9yeF9nb29kKys7CisJfQorfQorCisvKioKKyAqIGl4Z2JfY2xlYW5fcnhfaXJxIC0gU2VuZCByZWNlaXZlZCBkYXRhIHVwIHRoZSBuZXR3b3JrIHN0YWNrLAorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyBib29sZWFuX3QKKyNpZmRlZiBDT05GSUdfSVhHQl9OQVBJCitpeGdiX2NsZWFuX3J4X2lycShzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyLCBpbnQgKndvcmtfZG9uZSwgaW50IHdvcmtfdG9fZG8pCisjZWxzZQoraXhnYl9jbGVhbl9yeF9pcnEoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKKyNlbmRpZgoreworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyAqcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXN0cnVjdCBpeGdiX3J4X2Rlc2MgKnJ4X2Rlc2MsICpuZXh0X3J4ZDsKKwlzdHJ1Y3QgaXhnYl9idWZmZXIgKmJ1ZmZlcl9pbmZvLCAqbmV4dF9idWZmZXIsICpuZXh0Ml9idWZmZXI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5leHRfc2tiOworCXVpbnQzMl90IGxlbmd0aDsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwlib29sZWFuX3QgY2xlYW5lZCA9IEZBTFNFOworCisJaSA9IHJ4X3JpbmctPm5leHRfdG9fY2xlYW47CisJcnhfZGVzYyA9IElYR0JfUlhfREVTQygqcnhfcmluZywgaSk7CisJYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CisKKwl3aGlsZShyeF9kZXNjLT5zdGF0dXMgJiBJWEdCX1JYX0RFU0NfU1RBVFVTX0REKSB7CisKKyNpZmRlZiBDT05GSUdfSVhHQl9OQVBJCisJCWlmKCp3b3JrX2RvbmUgPj0gd29ya190b19kbykKKwkJCWJyZWFrOworCisJCSgqd29ya19kb25lKSsrOworI2VuZGlmCisJCXNrYiA9IGJ1ZmZlcl9pbmZvLT5za2I7CisJCXByZWZldGNoKHNrYi0+ZGF0YSk7CisKKwkJaWYoKytpID09IHJ4X3JpbmctPmNvdW50KSBpID0gMDsKKwkJbmV4dF9yeGQgPSBJWEdCX1JYX0RFU0MoKnJ4X3JpbmcsIGkpOworCQlwcmVmZXRjaChuZXh0X3J4ZCk7CisKKwkJaWYoKGogPSBpICsgMSkgPT0gcnhfcmluZy0+Y291bnQpIGogPSAwOworCQluZXh0Ml9idWZmZXIgPSAmcnhfcmluZy0+YnVmZmVyX2luZm9bal07CisJCXByZWZldGNoKG5leHQyX2J1ZmZlcik7CisKKwkJbmV4dF9idWZmZXIgPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCW5leHRfc2tiID0gbmV4dF9idWZmZXItPnNrYjsKKwkJcHJlZmV0Y2gobmV4dF9za2IpOworCisKKwkJY2xlYW5lZCA9IFRSVUU7CisKKwkJcGNpX3VubWFwX3NpbmdsZShwZGV2LAorCQkJCSBidWZmZXJfaW5mby0+ZG1hLAorCQkJCSBidWZmZXJfaW5mby0+bGVuZ3RoLAorCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCWxlbmd0aCA9IGxlMTZfdG9fY3B1KHJ4X2Rlc2MtPmxlbmd0aCk7CisKKwkJaWYodW5saWtlbHkoIShyeF9kZXNjLT5zdGF0dXMgJiBJWEdCX1JYX0RFU0NfU1RBVFVTX0VPUCkpKSB7CisKKwkJCS8qIEFsbCByZWNlaXZlcyBtdXN0IGZpdCBpbnRvIGEgc2luZ2xlIGJ1ZmZlciAqLworCisJCQlJWEdCX0RCRygiUmVjZWl2ZSBwYWNrZXQgY29uc3VtZWQgbXVsdGlwbGUgYnVmZmVycyAiCisJCQkJCSAibGVuZ3RoPCV4PlxuIiwgbGVuZ3RoKTsKKworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCXJ4X2Rlc2MtPnN0YXR1cyA9IDA7CisJCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKKworCQkJcnhfZGVzYyA9IG5leHRfcnhkOworCQkJYnVmZmVyX2luZm8gPSBuZXh0X2J1ZmZlcjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHVubGlrZWx5KHJ4X2Rlc2MtPmVycm9ycworCQkJICAgICAmIChJWEdCX1JYX0RFU0NfRVJST1JTX0NFIHwgSVhHQl9SWF9ERVNDX0VSUk9SU19TRQorCQkJCXwgSVhHQl9SWF9ERVNDX0VSUk9SU19QIHwKKwkJCQlJWEdCX1JYX0RFU0NfRVJST1JTX1JYRSkpKSB7CisKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQlyeF9kZXNjLT5zdGF0dXMgPSAwOworCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisKKwkJCXJ4X2Rlc2MgPSBuZXh0X3J4ZDsKKwkJCWJ1ZmZlcl9pbmZvID0gbmV4dF9idWZmZXI7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEdvb2QgUmVjZWl2ZSAqLworCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKworCQkvKiBSZWNlaXZlIENoZWNrc3VtIE9mZmxvYWQgKi8KKwkJaXhnYl9yeF9jaGVja3N1bShhZGFwdGVyLCByeF9kZXNjLCBza2IpOworCisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7CisjaWZkZWYgQ09ORklHX0lYR0JfTkFQSQorCQlpZihhZGFwdGVyLT52bGdycCAmJiAocnhfZGVzYy0+c3RhdHVzICYgSVhHQl9SWF9ERVNDX1NUQVRVU19WUCkpIHsKKwkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIGFkYXB0ZXItPnZsZ3JwLAorCQkJCWxlMTZfdG9fY3B1KHJ4X2Rlc2MtPnNwZWNpYWwpICYKKwkJCQkJSVhHQl9SWF9ERVNDX1NQRUNJQUxfVkxBTl9NQVNLKTsKKwkJfSBlbHNlIHsKKwkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCX0KKyNlbHNlIC8qIENPTkZJR19JWEdCX05BUEkgKi8KKwkJaWYoYWRhcHRlci0+dmxncnAgJiYgKHJ4X2Rlc2MtPnN0YXR1cyAmIElYR0JfUlhfREVTQ19TVEFUVVNfVlApKSB7CisJCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBhZGFwdGVyLT52bGdycCwKKwkJCQlsZTE2X3RvX2NwdShyeF9kZXNjLT5zcGVjaWFsKSAmCisJCQkJCUlYR0JfUlhfREVTQ19TUEVDSUFMX1ZMQU5fTUFTSyk7CisJCX0gZWxzZSB7CisJCQluZXRpZl9yeChza2IpOworCQl9CisjZW5kaWYgLyogQ09ORklHX0lYR0JfTkFQSSAqLworCQluZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisJCXJ4X2Rlc2MtPnN0YXR1cyA9IDA7CisJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOworCisJCXJ4X2Rlc2MgPSBuZXh0X3J4ZDsKKwkJYnVmZmVyX2luZm8gPSBuZXh0X2J1ZmZlcjsKKwl9CisKKwlyeF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gaTsKKworCWl4Z2JfYWxsb2NfcnhfYnVmZmVycyhhZGFwdGVyKTsKKworCXJldHVybiBjbGVhbmVkOworfQorCisvKioKKyAqIGl4Z2JfYWxsb2NfcnhfYnVmZmVycyAtIFJlcGxhY2UgdXNlZCByZWNlaXZlIGJ1ZmZlcnMKKyAqIEBhZGFwdGVyOiBhZGRyZXNzIG9mIGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyB2b2lkCitpeGdiX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaXhnYl9kZXNjX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwlzdHJ1Y3QgaXhnYl9yeF9kZXNjICpyeF9kZXNjOworCXN0cnVjdCBpeGdiX2J1ZmZlciAqYnVmZmVyX2luZm87CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgbnVtX2dyb3VwX3RhaWxfd3JpdGVzOworCWxvbmcgY2xlYW5jb3VudDsKKworCWkgPSByeF9yaW5nLT5uZXh0X3RvX3VzZTsKKwlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwljbGVhbmNvdW50ID0gSVhHQl9ERVNDX1VOVVNFRChyeF9yaW5nKTsKKworCW51bV9ncm91cF90YWlsX3dyaXRlcyA9IElYR0JfUlhfQlVGRkVSX1dSSVRFOworCisJLyogbGVhdmUgb25lIGRlc2NyaXB0b3IgdW51c2VkICovCisJd2hpbGUoLS1jbGVhbmNvdW50ID4gMCkgeworCQlyeF9kZXNjID0gSVhHQl9SWF9ERVNDKCpyeF9yaW5nLCBpKTsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gKyBORVRfSVBfQUxJR04pOworCisJCWlmKHVubGlrZWx5KCFza2IpKSB7CisJCQkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kICovCisJCQlicmVhazsKKwkJfQorCisJCS8qIE1ha2UgYnVmZmVyIGFsaWdubWVudCAyIGJleW9uZCBhIDE2IGJ5dGUgYm91bmRhcnkKKwkJICogdGhpcyB3aWxsIHJlc3VsdCBpbiBhIDE2IGJ5dGUgYWxpZ25lZCBJUCBoZWFkZXIgYWZ0ZXIKKwkJICogdGhlIDE0IGJ5dGUgTUFDIGhlYWRlciBpcyByZW1vdmVkCisJCSAqLworCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisKKwkJc2tiLT5kZXYgPSBuZXRkZXY7CisKKwkJYnVmZmVyX2luZm8tPnNrYiA9IHNrYjsKKwkJYnVmZmVyX2luZm8tPmxlbmd0aCA9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW47CisJCWJ1ZmZlcl9pbmZvLT5kbWEgPQorCQkJcGNpX21hcF9zaW5nbGUocGRldiwKKwkJCQkgICBza2ItPmRhdGEsCisJCQkJICAgYWRhcHRlci0+cnhfYnVmZmVyX2xlbiwKKwkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCXJ4X2Rlc2MtPmJ1ZmZfYWRkciA9IGNwdV90b19sZTY0KGJ1ZmZlcl9pbmZvLT5kbWEpOworCisJCWlmKChpICYgfihudW1fZ3JvdXBfdGFpbF93cml0ZXMtIDEpKSA9PSBpKSB7CisJCQkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIHRvIGNvbXBsZXRlIGJlZm9yZSBsZXR0aW5nIGgvdworCQkJICoga25vdyB0aGVyZSBhcmUgbmV3IGRlc2NyaXB0b3JzIHRvIGZldGNoLiAgKE9ubHkKKwkJCSAqIGFwcGxpY2FibGUgZm9yIHdlYWstb3JkZXJlZCBtZW1vcnkgbW9kZWwgYXJjaHMsCisJCQkgKiBzdWNoIGFzIElBLTY0KS4gKi8KKwkJCXdtYigpOworCisJCQlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJEVCwgaSk7CisJCX0KKworCQlpZigrK2kgPT0gcnhfcmluZy0+Y291bnQpIGkgPSAwOworCQlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwl9CisKKwlyeF9yaW5nLT5uZXh0X3RvX3VzZSA9IGk7Cit9CisKKy8qKgorICogaXhnYl92bGFuX3J4X3JlZ2lzdGVyIC0gZW5hYmxlcyBvciBkaXNhYmxlcyB2bGFuIHRhZ2dpbmcvc3RyaXBwaW5nLgorICogCisgKiBAcGFyYW0gbmV0ZGV2IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBncnAgaW5kaWNhdGVzIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRhZ2dpbmcvc3RyaXBwaW5nCisgKiovCitzdGF0aWMgdm9pZAoraXhnYl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwl1aW50MzJfdCBjdHJsLCByY3RsOworCisJaXhnYl9pcnFfZGlzYWJsZShhZGFwdGVyKTsKKwlhZGFwdGVyLT52bGdycCA9IGdycDsKKworCWlmKGdycCkgeworCQkvKiBlbmFibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisJCWN0cmwgPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgQ1RSTDApOworCQljdHJsIHw9IElYR0JfQ1RSTDBfVk1FOworCQlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkwwLCBjdHJsKTsKKworCQkvKiBlbmFibGUgVkxBTiByZWNlaXZlIGZpbHRlcmluZyAqLworCisJCXJjdGwgPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7CisJCXJjdGwgfD0gSVhHQl9SQ1RMX1ZGRTsKKwkJcmN0bCAmPSB+SVhHQl9SQ1RMX0NGSUVOOworCQlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOworCX0gZWxzZSB7CisJCS8qIGRpc2FibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisKKwkJY3RybCA9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMMCk7CisJCWN0cmwgJj0gfklYR0JfQ1RSTDBfVk1FOworCQlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkwwLCBjdHJsKTsKKworCQkvKiBkaXNhYmxlIFZMQU4gZmlsdGVyaW5nICovCisKKwkJcmN0bCA9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMKTsKKwkJcmN0bCAmPSB+SVhHQl9SQ1RMX1ZGRTsKKwkJSVhHQl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKKwl9CisKKwlpeGdiX2lycV9lbmFibGUoYWRhcHRlcik7Cit9CisKK3N0YXRpYyB2b2lkCitpeGdiX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MTZfdCB2aWQpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwl1aW50MzJfdCB2ZnRhLCBpbmRleDsKKworCS8qIGFkZCBWSUQgdG8gZmlsdGVyIHRhYmxlICovCisKKwlpbmRleCA9ICh2aWQgPj4gNSkgJiAweDdGOworCXZmdGEgPSBJWEdCX1JFQURfUkVHX0FSUkFZKCZhZGFwdGVyLT5odywgVkZUQSwgaW5kZXgpOworCXZmdGEgfD0gKDEgPDwgKHZpZCAmIDB4MUYpKTsKKwlpeGdiX3dyaXRlX3ZmdGEoJmFkYXB0ZXItPmh3LCBpbmRleCwgdmZ0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitpeGdiX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDE2X3QgdmlkKQoreworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJdWludDMyX3QgdmZ0YSwgaW5kZXg7CisKKwlpeGdiX2lycV9kaXNhYmxlKGFkYXB0ZXIpOworCisJaWYoYWRhcHRlci0+dmxncnApCisJCWFkYXB0ZXItPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSA9IE5VTEw7CisKKwlpeGdiX2lycV9lbmFibGUoYWRhcHRlcik7CisKKwkvKiByZW1vdmUgVklEIGZyb20gZmlsdGVyIHRhYmxlKi8KKworCWluZGV4ID0gKHZpZCA+PiA1KSAmIDB4N0Y7CisJdmZ0YSA9IElYR0JfUkVBRF9SRUdfQVJSQVkoJmFkYXB0ZXItPmh3LCBWRlRBLCBpbmRleCk7CisJdmZ0YSAmPSB+KDEgPDwgKHZpZCAmIDB4MUYpKTsKKwlpeGdiX3dyaXRlX3ZmdGEoJmFkYXB0ZXItPmh3LCBpbmRleCwgdmZ0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitpeGdiX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKQoreworCWl4Z2Jfdmxhbl9yeF9yZWdpc3RlcihhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPnZsZ3JwKTsKKworCWlmKGFkYXB0ZXItPnZsZ3JwKSB7CisJCXVpbnQxNl90IHZpZDsKKwkJZm9yKHZpZCA9IDA7IHZpZCA8IFZMQU5fR1JPVVBfQVJSQVlfTEVOOyB2aWQrKykgeworCQkJaWYoIWFkYXB0ZXItPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSkKKwkJCQljb250aW51ZTsKKwkJCWl4Z2Jfdmxhbl9yeF9hZGRfdmlkKGFkYXB0ZXItPm5ldGRldiwgdmlkKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBpeGdiX25vdGlmeV9yZWJvb3QgLSBoYW5kbGVzIE9TIG5vdGlmaWNhdGlvbiBvZiByZWJvb3QgZXZlbnQuCisgKiBAcGFyYW0gbmIgbm90aWZpZXIgYmxvY2ssIHVudXNlZAorICogQHBhcmFtIGV2ZW50IEV2ZW50IGJlaW5nIHBhc3NlZCB0byBkcml2ZXIgdG8gYWN0IHVwb24KKyAqIEBwYXJhbSBwIEEgcG9pbnRlciB0byBvdXIgbmV0IGRldmljZQorICoqLworc3RhdGljIGludAoraXhnYl9ub3RpZnlfcmVib290KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnApCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBTWVNfRE9XTjoKKwljYXNlIFNZU19IQUxUOgorCWNhc2UgU1lTX1BPV0VSX09GRjoKKwkJd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBkZXYpKSkgeworCQkJaWYgKHBjaV9kZXZfZHJpdmVyKHBkZXYpID09ICZpeGdiX2RyaXZlcikKKwkJCQlpeGdiX3N1c3BlbmQocGRldiwgMyk7CisJCX0KKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKioKKyAqIGl4Z2Jfc3VzcGVuZCAtIGRyaXZlciBzdXNwZW5kIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIG5vdGlmeS4KKyAqIEBwYXJhbSBwZGV2IHBjaSBkcml2ZXIgc3RydWN0dXJlIHVzZWQgZm9yIHBhc3NpbmcgdG8KKyAqIEBwYXJhbSBzdGF0ZSBwb3dlciBzdGF0ZSB0byBlbnRlciAKKyAqKi8KK3N0YXRpYyBpbnQKK2l4Z2Jfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludDMyX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCisJaWYobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlpeGdiX2Rvd24oYWRhcHRlciwgVFJVRSk7CisKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKworCXN0YXRlID0gKHN0YXRlID4gMCkgPyAzIDogMDsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHN0YXRlKTsKKwltc2VjX2RlbGF5KDIwMCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisvKgorICogUG9sbGluZyAnaW50ZXJydXB0JyAtIHVzZWQgYnkgdGhpbmdzIGxpa2UgbmV0Y29uc29sZSB0byBzZW5kIHNrYnMKKyAqIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWVuYWJsZSBpbnRlcnJ1cHRzLiBJdCdzIG5vdCBjYWxsZWQgd2hpbGUKKyAqIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBpcyBleGVjdXRpbmcuCisgKi8KKworc3RhdGljIHZvaWQgaXhnYl9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwlkaXNhYmxlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEpOworCWl4Z2JfaW50cihhZGFwdGVyLT5wZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEpOworfQorI2VuZGlmCisKKy8qIGl4Z2JfbWFpbi5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2Jfb3NkZXAuaCBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9vc2RlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYmE5MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2Jfb3NkZXAuaApAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIAorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisgIGFueSBsYXRlciB2ZXJzaW9uLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisgIG1vcmUgZGV0YWlscy4KKyAgCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAgCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICAKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZ2x1ZSBmb3IgdGhlIE9TIGluZGVwZW5kZW50IHBhcnQgb2YgaXhnYgorICogaW5jbHVkZXMgcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcworICovCisKKyNpZm5kZWYgX0lYR0JfT1NERVBfSF8KKyNkZWZpbmUgX0lYR0JfT1NERVBfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaWZuZGVmIG1zZWNfZGVsYXkKKyNkZWZpbmUgbXNlY19kZWxheSh4KQlkbyB7IGlmKGluX2ludGVycnVwdCgpKSB7IFwKKwkJCQkvKiBEb24ndCBtZGVsYXkgaW4gaW50ZXJydXB0IGNvbnRleHQhICovIFwKKwkgICAgICAgICAgICAgICAgCUJVRygpOyBcCisJCQl9IGVsc2UgeyBcCisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOyBcCisJCQkJc2NoZWR1bGVfdGltZW91dCgoeCAqIEhaKS8xMDAwICsgMik7IFwKKwkJCX0gfSB3aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgUENJX0NPTU1BTkRfUkVHSVNURVIgICBQQ0lfQ09NTUFORAorI2RlZmluZSBDTURfTUVNX1dSVF9JTlZBTElEQVRFIFBDSV9DT01NQU5EX0lOVkFMSURBVEUKKwordHlwZWRlZiBlbnVtIHsKKyN1bmRlZiBGQUxTRQorCUZBTFNFID0gMCwKKyN1bmRlZiBUUlVFCisJVFJVRSA9IDEKK30gYm9vbGVhbl90OworCisjdW5kZWYgQVNTRVJUCisjZGVmaW5lIEFTU0VSVCh4KQlpZighKHgpKSBCVUcoKQorI2RlZmluZSBNU0dPVVQoUywgQSwgQikJcHJpbnRrKEtFUk5fREVCVUcgUyAiXG4iLCBBLCBCKQorCisjaWZkZWYgREJHCisjZGVmaW5lIERFQlVHT1VUKFMpCQlwcmludGsoS0VSTl9ERUJVRyBTICJcbiIpCisjZGVmaW5lIERFQlVHT1VUMShTLCBBLi4uKQlwcmludGsoS0VSTl9ERUJVRyBTICJcbiIsIEEpCisjZWxzZQorI2RlZmluZSBERUJVR09VVChTKQorI2RlZmluZSBERUJVR09VVDEoUywgQS4uLikKKyNlbmRpZgorCisjZGVmaW5lIERFQlVHRlVOQyhGKSBERUJVR09VVChGKQorI2RlZmluZSBERUJVR09VVDIgREVCVUdPVVQxCisjZGVmaW5lIERFQlVHT1VUMyBERUJVR09VVDIKKyNkZWZpbmUgREVCVUdPVVQ3IERFQlVHT1VUMworCisjZGVmaW5lIElYR0JfV1JJVEVfUkVHKGEsIHJlZywgdmFsdWUpICggXAorCXdyaXRlbCgodmFsdWUpLCAoKGEpLT5od19hZGRyICsgSVhHQl8jI3JlZykpKQorCisjZGVmaW5lIElYR0JfUkVBRF9SRUcoYSwgcmVnKSAoIFwKKwlyZWFkbCgoYSktPmh3X2FkZHIgKyBJWEdCXyMjcmVnKSkKKworI2RlZmluZSBJWEdCX1dSSVRFX1JFR19BUlJBWShhLCByZWcsIG9mZnNldCwgdmFsdWUpICggXAorCXdyaXRlbCgodmFsdWUpLCAoKGEpLT5od19hZGRyICsgSVhHQl8jI3JlZyArICgob2Zmc2V0KSA8PCAyKSkpKQorCisjZGVmaW5lIElYR0JfUkVBRF9SRUdfQVJSQVkoYSwgcmVnLCBvZmZzZXQpICggXAorCXJlYWRsKChhKS0+aHdfYWRkciArIElYR0JfIyNyZWcgKyAoKG9mZnNldCkgPDwgMikpKQorCisjZGVmaW5lIElYR0JfV1JJVEVfRkxVU0goYSkgSVhHQl9SRUFEX1JFRyhhLCBTVEFUVVMpCisKKyNkZWZpbmUgSVhHQl9NRU1DUFkgbWVtY3B5CisKKyNlbmRpZiAvKiBfSVhHQl9PU0RFUF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX3BhcmFtLmMgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfcGFyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTgzZGZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX3BhcmFtLmMKQEAgLTAsMCArMSw0NzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyAgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKKyAgbW9yZSBkZXRhaWxzLgorICAKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgCisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICAKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgIAorICBDb250YWN0IEluZm9ybWF0aW9uOgorICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaXhnYi5oIgorCisvKiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgY2hhbmdlZCB0byBhZGp1c3QgdGhlCisgKiBtYXhpbXVtIG51bWJlciBvZiBwb3J0cyB0aGF0IHRoZSBkcml2ZXIgY2FuIG1hbmFnZS4KKyAqLworCisjZGVmaW5lIElYR0JfTUFYX05JQyA4CisKKyNkZWZpbmUgT1BUSU9OX1VOU0VUCS0xCisjZGVmaW5lIE9QVElPTl9ESVNBQkxFRCAwCisjZGVmaW5lIE9QVElPTl9FTkFCTEVEICAxCisKKy8qIEFsbCBwYXJhbWV0ZXJzIGFyZSB0cmVhdGVkIHRoZSBzYW1lLCBhcyBhbiBpbnRlZ2VyIGFycmF5IG9mIHZhbHVlcy4KKyAqIFRoaXMgbWFjcm8ganVzdCByZWR1Y2VzIHRoZSBuZWVkIHRvIHJlcGVhdCB0aGUgc2FtZSBkZWNsYXJhdGlvbiBjb2RlCisgKiBvdmVyIGFuZCBvdmVyIChwbHVzIHRoaXMgaGVscHMgdG8gYXZvaWQgdHlwbyBidWdzKS4KKyAqLworCisjZGVmaW5lIElYR0JfUEFSQU1fSU5JVCB7IFswIC4uLiBJWEdCX01BWF9OSUNdID0gT1BUSU9OX1VOU0VUIH0KKyNkZWZpbmUgSVhHQl9QQVJBTShYLCBkZXNjKSBcCisJc3RhdGljIGludCBfX2RldmluaXRkYXRhIFhbSVhHQl9NQVhfTklDKzFdID0gSVhHQl9QQVJBTV9JTklUOyBcCisJc3RhdGljIGludCBudW1fIyNYID0gMDsgXAorCW1vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChYLCBYLCBpbnQsICZudW1fIyNYLCAwKTsgXAorCU1PRFVMRV9QQVJNX0RFU0MoWCwgZGVzYyk7CisKKy8qIFRyYW5zbWl0IERlc2NyaXB0b3IgQ291bnQKKyAqCisgKiBWYWxpZCBSYW5nZTogNjQtNDA5NgorICoKKyAqIERlZmF1bHQgVmFsdWU6IDI1NgorICovCisKK0lYR0JfUEFSQU0oVHhEZXNjcmlwdG9ycywgIk51bWJlciBvZiB0cmFuc21pdCBkZXNjcmlwdG9ycyIpOworCisvKiBSZWNlaXZlIERlc2NyaXB0b3IgQ291bnQKKyAqCisgKiBWYWxpZCBSYW5nZTogNjQtNDA5NgorICoKKyAqIERlZmF1bHQgVmFsdWU6IDEwMjQKKyAqLworCitJWEdCX1BBUkFNKFJ4RGVzY3JpcHRvcnMsICJOdW1iZXIgb2YgcmVjZWl2ZSBkZXNjcmlwdG9ycyIpOworCisvKiBVc2VyIFNwZWNpZmllZCBGbG93IENvbnRyb2wgT3ZlcnJpZGUKKyAqCisgKiBWYWxpZCBSYW5nZTogMC0zCisgKiAgLSAwIC0gTm8gRmxvdyBDb250cm9sCisgKiAgLSAxIC0gUnggb25seSwgcmVzcG9uZCB0byBQQVVTRSBmcmFtZXMgYnV0IGRvIG5vdCBnZW5lcmF0ZSB0aGVtCisgKiAgLSAyIC0gVHggb25seSwgZ2VuZXJhdGUgUEFVU0UgZnJhbWVzIGJ1dCBpZ25vcmUgdGhlbSBvbiByZWNlaXZlCisgKiAgLSAzIC0gRnVsbCBGbG93IENvbnRyb2wgU3VwcG9ydAorICoKKyAqIERlZmF1bHQgVmFsdWU6IFJlYWQgZmxvdyBjb250cm9sIHNldHRpbmdzIGZyb20gdGhlIEVFUFJPTQorICovCisKK0lYR0JfUEFSQU0oRmxvd0NvbnRyb2wsICJGbG93IENvbnRyb2wgc2V0dGluZyIpOworCisvKiBYc3VtUlggLSBSZWNlaXZlIENoZWNrc3VtIE9mZmxvYWQgRW5hYmxlL0Rpc2FibGUKKyAqCisgKiBWYWxpZCBSYW5nZTogMCwgMQorICogIC0gMCAtIGRpc2FibGVzIGFsbCBjaGVja3N1bSBvZmZsb2FkCisgKiAgLSAxIC0gZW5hYmxlcyByZWNlaXZlIElQL1RDUC9VRFAgY2hlY2tzdW0gb2ZmbG9hZAorICogICAgICAgIG9uIDgyNTk3IGJhc2VkIE5JQ3MKKyAqCisgKiBEZWZhdWx0IFZhbHVlOiAxCisgKi8KKworSVhHQl9QQVJBTShYc3VtUlgsICJEaXNhYmxlIG9yIGVuYWJsZSBSZWNlaXZlIENoZWNrc3VtIG9mZmxvYWQiKTsKKworLyogVHJhbnNtaXQgSW50ZXJydXB0IERlbGF5IGluIHVuaXRzIG9mIDAuODE5MiBtaWNyb3NlY29uZHMKKyAqCisgKiBWYWxpZCBSYW5nZTogMC02NTUzNQorICoKKyAqIERlZmF1bHQgVmFsdWU6IDMyCisgKi8KKworSVhHQl9QQVJBTShUeEludERlbGF5LCAiVHJhbnNtaXQgSW50ZXJydXB0IERlbGF5Iik7CisKKy8qIFJlY2VpdmUgSW50ZXJydXB0IERlbGF5IGluIHVuaXRzIG9mIDAuODE5MiBtaWNyb3NlY29uZHMKKyAqCisgKiBWYWxpZCBSYW5nZTogMC02NTUzNQorICoKKyAqIERlZmF1bHQgVmFsdWU6IDcyCisgKi8KKworSVhHQl9QQVJBTShSeEludERlbGF5LCAiUmVjZWl2ZSBJbnRlcnJ1cHQgRGVsYXkiKTsKKworLyogUmVjZWl2ZSBGbG93IGNvbnRyb2wgaGlnaCB0aHJlc2hvbGQgKHdoZW4gd2Ugc2VuZCBhIHBhdXNlIGZyYW1lKQorICogKEZDUlRIKQorICoKKyAqIFZhbGlkIFJhbmdlOiAxLDUzNiAtIDI2MiwxMzYgKDB4NjAwIC0gMHgzRkZGOCwgOCBieXRlIGdyYW51bGFyaXR5KQorICoKKyAqIERlZmF1bHQgVmFsdWU6IDE5Niw2MDggKDB4MzAwMDApCisgKi8KKworSVhHQl9QQVJBTShSeEZDSGlnaFRocmVzaCwgIlJlY2VpdmUgRmxvdyBDb250cm9sIEhpZ2ggVGhyZXNob2xkIik7CisKKy8qIFJlY2VpdmUgRmxvdyBjb250cm9sIGxvdyB0aHJlc2hvbGQgKHdoZW4gd2Ugc2VuZCBhIHJlc3VtZSBmcmFtZSkKKyAqIChGQ1JUTCkKKyAqCisgKiBWYWxpZCBSYW5nZTogNjQgLSAyNjIsMTM2ICgweDQwIC0gMHgzRkZGOCwgOCBieXRlIGdyYW51bGFyaXR5KQorICogICAgICAgICAgICAgIG11c3QgYmUgbGVzcyB0aGFuIGhpZ2ggdGhyZXNob2xkIGJ5IGF0IGxlYXN0IDggYnl0ZXMKKyAqCisgKiBEZWZhdWx0IFZhbHVlOiAgMTYzLDg0MCAoMHgyODAwMCkKKyAqLworCitJWEdCX1BBUkFNKFJ4RkNMb3dUaHJlc2gsICJSZWNlaXZlIEZsb3cgQ29udHJvbCBMb3cgVGhyZXNob2xkIik7CisKKy8qIEZsb3cgY29udHJvbCByZXF1ZXN0IHRpbWVvdXQgKGhvdyBsb25nIHRvIHBhdXNlIHRoZSBsaW5rIHBhcnRuZXIncyB0eCkKKyAqIChQQVAgMTU6MCkKKyAqCisgKiBWYWxpZCBSYW5nZTogMSAtIDY1NTM1IAorICoKKyAqIERlZmF1bHQgVmFsdWU6ICAyNTYgKDB4MTAwKQorICovCisKK0lYR0JfUEFSQU0oRkNSZXFUaW1lb3V0LCAiRmxvdyBDb250cm9sIFJlcXVlc3QgVGltZW91dCIpOworCisvKiBJbnRlcnJ1cHQgRGVsYXkgRW5hYmxlCisgKgorICogVmFsaWQgUmFuZ2U6IDAsIDEKKyAqCisgKiAgLSAwIC0gZGlzYWJsZXMgdHJhbnNtaXQgaW50ZXJydXB0IGRlbGF5CisgKiAgLSAxIC0gZW5hYmxlcyB0cmFuc21taXQgaW50ZXJydXB0IGRlbGF5CisgKgorICogRGVmYXVsdCBWYWx1ZTogMQorICovCisKK0lYR0JfUEFSQU0oSW50RGVsYXlFbmFibGUsICJUcmFuc21pdCBJbnRlcnJ1cHQgRGVsYXkgRW5hYmxlIik7CisKKworI2RlZmluZSBERUZBVUxUX1RJRFYJICAgCQkgICAgIDMyCisjZGVmaW5lIE1BWF9USURWCQkJIDB4RkZGRgorI2RlZmluZSBNSU5fVElEVgkJCSAgICAgIDAKKworI2RlZmluZSBERUZBVUxUX1JEVFIJCSAgIAkgICAgIDcyCisjZGVmaW5lIE1BWF9SRFRSCQkJIDB4RkZGRgorI2RlZmluZSBNSU5fUkRUUgkJCSAgICAgIDAKKworI2RlZmluZSBYU1VNUlhfREVGQVVMVAkJIE9QVElPTl9FTkFCTEVECisKKyNkZWZpbmUgRkxPV19DT05UUk9MX0ZVTEwJICAgaXhnYl9mY19mdWxsCisjZGVmaW5lIEZMT1dfQ09OVFJPTF9ERUZBVUxUICBGTE9XX0NPTlRST0xfRlVMTAorI2RlZmluZSBERUZBVUxUX0ZDUlRMCSAgCQkweDI4MDAwCisjZGVmaW5lIERFRkFVTFRfRkNSVEgJCQkweDMwMDAwCisjZGVmaW5lIE1JTl9GQ1JUTAkJCSAgICAgIDAKKyNkZWZpbmUgTUFYX0ZDUlRMCQkJMHgzRkZFOAorI2RlZmluZSBNSU5fRkNSVEgJCQkgICAgICA4CisjZGVmaW5lIE1BWF9GQ1JUSAkJCTB4M0ZGRjAKKworI2RlZmluZSBERUZBVUxUX0ZDUEFVU0UJCSAgCTB4MTAwCS8qIHRoaXMgbWF5IGJlIHRvbyBsb25nICovCisjZGVmaW5lIE1JTl9GQ1BBVVNFCQkJICAgICAgMQorI2RlZmluZSBNQVhfRkNQQVVTRQkJCSAweGZmZmYKKworc3RydWN0IGl4Z2Jfb3B0aW9uIHsKKwllbnVtIHsgZW5hYmxlX29wdGlvbiwgcmFuZ2Vfb3B0aW9uLCBsaXN0X29wdGlvbiB9IHR5cGU7CisJY2hhciAqbmFtZTsKKwljaGFyICplcnI7CisJaW50IGRlZjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CS8qIHJhbmdlX29wdGlvbiBpbmZvICovCisJCQlpbnQgbWluOworCQkJaW50IG1heDsKKwkJfSByOworCQlzdHJ1Y3QgewkvKiBsaXN0X29wdGlvbiBpbmZvICovCisJCQlpbnQgbnI7CisJCQlzdHJ1Y3QgaXhnYl9vcHRfbGlzdCB7CisJCQkJaW50IGk7CisJCQkJY2hhciAqc3RyOworCQkJfSAqcDsKKwkJfSBsOworCX0gYXJnOworfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK2l4Z2JfdmFsaWRhdGVfb3B0aW9uKGludCAqdmFsdWUsIHN0cnVjdCBpeGdiX29wdGlvbiAqb3B0KQoreworCWlmKCp2YWx1ZSA9PSBPUFRJT05fVU5TRVQpIHsKKwkJKnZhbHVlID0gb3B0LT5kZWY7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAob3B0LT50eXBlKSB7CisJY2FzZSBlbmFibGVfb3B0aW9uOgorCQlzd2l0Y2ggKCp2YWx1ZSkgeworCQljYXNlIE9QVElPTl9FTkFCTEVEOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgRW5hYmxlZFxuIiwgb3B0LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQljYXNlIE9QVElPTl9ESVNBQkxFRDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzIERpc2FibGVkXG4iLCBvcHQtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSByYW5nZV9vcHRpb246CisJCWlmKCp2YWx1ZSA+PSBvcHQtPmFyZy5yLm1pbiAmJiAqdmFsdWUgPD0gb3B0LT5hcmcuci5tYXgpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzIHNldCB0byAlaVxuIiwgb3B0LT5uYW1lLCAqdmFsdWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBsaXN0X29wdGlvbjogeworCQlpbnQgaTsKKwkJc3RydWN0IGl4Z2Jfb3B0X2xpc3QgKmVudDsKKworCQlmb3IoaSA9IDA7IGkgPCBvcHQtPmFyZy5sLm5yOyBpKyspIHsKKwkJCWVudCA9ICZvcHQtPmFyZy5sLnBbaV07CisJCQlpZigqdmFsdWUgPT0gZW50LT5pKSB7CisJCQkJaWYoZW50LT5zdHJbMF0gIT0gJ1wwJykKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIGVudC0+c3RyKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiSW52YWxpZCAlcyBzcGVjaWZpZWQgKCVpKSAlc1xuIiwKKwkJICAgb3B0LT5uYW1lLCAqdmFsdWUsIG9wdC0+ZXJyKTsKKwkqdmFsdWUgPSBvcHQtPmRlZjsKKwlyZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgTElTVF9MRU4obCkgKHNpemVvZihsKSAvIHNpemVvZihsWzBdKSkKKworLyoqCisgKiBpeGdiX2NoZWNrX29wdGlvbnMgLSBSYW5nZSBDaGVja2luZyBmb3IgQ29tbWFuZCBMaW5lIFBhcmFtZXRlcnMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgcm91dGluZSBjaGVja3MgYWxsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGZvciB2YWxpZCB1c2VyCisgKiBpbnB1dC4gIElmIGFuIGludmFsaWQgdmFsdWUgaXMgZ2l2ZW4sIG9yIGlmIG5vIHVzZXIgc3BlY2lmaWVkCisgKiB2YWx1ZSBleGlzdHMsIGEgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkLiAgVGhlIGZpbmFsIHZhbHVlIGlzIHN0b3JlZAorICogaW4gYSB2YXJpYWJsZSBpbiB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKiovCisKK3ZvaWQgX19kZXZpbml0CitpeGdiX2NoZWNrX29wdGlvbnMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgYmQgPSBhZGFwdGVyLT5iZF9udW1iZXI7CisJaWYoYmQgPj0gSVhHQl9NQVhfTklDKSB7CisJCXByaW50ayhLRVJOX05PVElDRQorCQkJICAgIldhcm5pbmc6IG5vIGNvbmZpZ3VyYXRpb24gZm9yIGJvYXJkICMlaVxuIiwgYmQpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVzaW5nIGRlZmF1bHRzIGZvciBhbGwgdmFsdWVzXG4iKTsKKwl9CisKKwl7IC8qIFRyYW5zbWl0IERlc2NyaXB0b3IgQ291bnQgKi8KKwkJc3RydWN0IGl4Z2Jfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gcmFuZ2Vfb3B0aW9uLAorCQkJLm5hbWUgPSAiVHJhbnNtaXQgRGVzY3JpcHRvcnMiLAorCQkJLmVyciAgPSAidXNpbmcgZGVmYXVsdCBvZiAiIF9fTU9EVUxFX1NUUklORyhERUZBVUxUX1RYRCksCisJCQkuZGVmICA9IERFRkFVTFRfVFhELAorCQkJLmFyZyAgPSB7IC5yID0geyAubWluID0gTUlOX1RYRCwKKwkJCQkJIC5tYXggPSBNQVhfVFhEfX0KKwkJfTsKKwkJc3RydWN0IGl4Z2JfZGVzY19yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisKKwkJaWYobnVtX1R4RGVzY3JpcHRvcnMgPiBiZCkgeworCQkJdHhfcmluZy0+Y291bnQgPSBUeERlc2NyaXB0b3JzW2JkXTsKKwkJCWl4Z2JfdmFsaWRhdGVfb3B0aW9uKCZ0eF9yaW5nLT5jb3VudCwgJm9wdCk7CisJCX0gZWxzZSB7CisJCQl0eF9yaW5nLT5jb3VudCA9IG9wdC5kZWY7CisJCX0KKwkJSVhHQl9ST1VORFVQKHR4X3JpbmctPmNvdW50LCBJWEdCX1JFUV9UWF9ERVNDUklQVE9SX01VTFRJUExFKTsKKwl9CisJeyAvKiBSZWNlaXZlIERlc2NyaXB0b3IgQ291bnQgKi8KKwkJc3RydWN0IGl4Z2Jfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gcmFuZ2Vfb3B0aW9uLAorCQkJLm5hbWUgPSAiUmVjZWl2ZSBEZXNjcmlwdG9ycyIsCisJCQkuZXJyICA9ICJ1c2luZyBkZWZhdWx0IG9mICIgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfUlhEKSwKKwkJCS5kZWYgID0gREVGQVVMVF9SWEQsCisJCQkuYXJnICA9IHsgLnIgPSB7IC5taW4gPSBNSU5fUlhELAorCQkJCQkgLm1heCA9IE1BWF9SWER9fQorCQl9OworCQlzdHJ1Y3QgaXhnYl9kZXNjX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKKworCQlpZihudW1fUnhEZXNjcmlwdG9ycyA+IGJkKSB7CisJCQlyeF9yaW5nLT5jb3VudCA9IFJ4RGVzY3JpcHRvcnNbYmRdOworCQkJaXhnYl92YWxpZGF0ZV9vcHRpb24oJnJ4X3JpbmctPmNvdW50LCAmb3B0KTsKKwkJfSBlbHNlIHsKKwkJCXJ4X3JpbmctPmNvdW50ID0gb3B0LmRlZjsKKwkJfQorCQlJWEdCX1JPVU5EVVAocnhfcmluZy0+Y291bnQsIElYR0JfUkVRX1JYX0RFU0NSSVBUT1JfTVVMVElQTEUpOworCX0KKwl7IC8qIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCBFbmFibGUgKi8KKwkJc3RydWN0IGl4Z2Jfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gZW5hYmxlX29wdGlvbiwKKwkJCS5uYW1lID0gIlJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCIsCisJCQkuZXJyICA9ICJkZWZhdWx0aW5nIHRvIEVuYWJsZWQiLAorCQkJLmRlZiAgPSBPUFRJT05fRU5BQkxFRAorCQl9OworCisJCWlmKG51bV9Yc3VtUlggPiBiZCkgeworCQkJaW50IHJ4X2NzdW0gPSBYc3VtUlhbYmRdOworCQkJaXhnYl92YWxpZGF0ZV9vcHRpb24oJnJ4X2NzdW0sICZvcHQpOworCQkJYWRhcHRlci0+cnhfY3N1bSA9IHJ4X2NzdW07CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5yeF9jc3VtID0gb3B0LmRlZjsKKwkJfQorCX0KKwl7IC8qIEZsb3cgQ29udHJvbCAqLworCisJCXN0cnVjdCBpeGdiX29wdF9saXN0IGZjX2xpc3RbXSA9CisJCQl7eyBpeGdiX2ZjX25vbmUsCSJGbG93IENvbnRyb2wgRGlzYWJsZWQiIH0sCisJCQkgeyBpeGdiX2ZjX3J4X3BhdXNlLCJGbG93IENvbnRyb2wgUmVjZWl2ZSBPbmx5IiB9LAorCQkJIHsgaXhnYl9mY190eF9wYXVzZSwiRmxvdyBDb250cm9sIFRyYW5zbWl0IE9ubHkiIH0sCisJCQkgeyBpeGdiX2ZjX2Z1bGwsCSJGbG93IENvbnRyb2wgRW5hYmxlZCIgfSwKKwkJCSB7IGl4Z2JfZmNfZGVmYXVsdCwgIkZsb3cgQ29udHJvbCBIYXJkd2FyZSBEZWZhdWx0IiB9fTsKKworCQlzdHJ1Y3QgaXhnYl9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSBsaXN0X29wdGlvbiwKKwkJCS5uYW1lID0gIkZsb3cgQ29udHJvbCIsCisJCQkuZXJyICA9ICJyZWFkaW5nIGRlZmF1bHQgc2V0dGluZ3MgZnJvbSBFRVBST00iLAorCQkJLmRlZiAgPSBpeGdiX2ZjX2Z1bGwsCisJCQkuYXJnICA9IHsgLmwgPSB7IC5uciA9IExJU1RfTEVOKGZjX2xpc3QpLAorCQkJCQkgLnAgPSBmY19saXN0IH19CisJCX07CisKKwkJaWYobnVtX0Zsb3dDb250cm9sID4gYmQpIHsKKwkJCWludCBmYyA9IEZsb3dDb250cm9sW2JkXTsKKwkJCWl4Z2JfdmFsaWRhdGVfb3B0aW9uKCZmYywgJm9wdCk7CisJCQlhZGFwdGVyLT5ody5mYy50eXBlID0gZmM7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5ody5mYy50eXBlID0gb3B0LmRlZjsKKwkJfQorCX0KKwl7IC8qIFJlY2VpdmUgRmxvdyBDb250cm9sIEhpZ2ggVGhyZXNob2xkICovCisJCXN0cnVjdCBpeGdiX29wdGlvbiBvcHQgPSB7CisJCQkudHlwZSA9IHJhbmdlX29wdGlvbiwKKwkJCS5uYW1lID0gIlJ4IEZsb3cgQ29udHJvbCBIaWdoIFRocmVzaG9sZCIsCisJCQkuZXJyICA9ICJ1c2luZyBkZWZhdWx0IG9mICIgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfRkNSVEgpLAorCQkJLmRlZiAgPSBERUZBVUxUX0ZDUlRILAorCQkJLmFyZyAgPSB7IC5yID0geyAubWluID0gTUlOX0ZDUlRILAorCQkJCQkgLm1heCA9IE1BWF9GQ1JUSH19CisJCX07CisKKwkJaWYobnVtX1J4RkNIaWdoVGhyZXNoID4gYmQpIHsKKwkJCWFkYXB0ZXItPmh3LmZjLmhpZ2hfd2F0ZXIgPSBSeEZDSGlnaFRocmVzaFtiZF07CisJCQlpeGdiX3ZhbGlkYXRlX29wdGlvbigmYWRhcHRlci0+aHcuZmMuaGlnaF93YXRlciwgJm9wdCk7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5ody5mYy5oaWdoX3dhdGVyID0gb3B0LmRlZjsKKwkJfQorCQlpZighKGFkYXB0ZXItPmh3LmZjLnR5cGUgJiBpeGdiX2ZjX3J4X3BhdXNlKSApCisJCQlwcmludGsgKEtFUk5fSU5GTyAKKwkJCQkiSWdub3JpbmcgUnhGQ0hpZ2hUaHJlc2ggd2hlbiBubyBSeEZDXG4iKTsKKwl9CisJeyAvKiBSZWNlaXZlIEZsb3cgQ29udHJvbCBMb3cgVGhyZXNob2xkICovCisJCXN0cnVjdCBpeGdiX29wdGlvbiBvcHQgPSB7CisJCQkudHlwZSA9IHJhbmdlX29wdGlvbiwKKwkJCS5uYW1lID0gIlJ4IEZsb3cgQ29udHJvbCBMb3cgVGhyZXNob2xkIiwKKwkJCS5lcnIgID0gInVzaW5nIGRlZmF1bHQgb2YgIiBfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9GQ1JUTCksCisJCQkuZGVmICA9IERFRkFVTFRfRkNSVEwsCisJCQkuYXJnICA9IHsgLnIgPSB7IC5taW4gPSBNSU5fRkNSVEwsCisJCQkJCSAubWF4ID0gTUFYX0ZDUlRMfX0KKwkJfTsKKworCQlpZihudW1fUnhGQ0xvd1RocmVzaCA+IGJkKSB7CisJCQlhZGFwdGVyLT5ody5mYy5sb3dfd2F0ZXIgPSBSeEZDTG93VGhyZXNoW2JkXTsKKwkJCWl4Z2JfdmFsaWRhdGVfb3B0aW9uKCZhZGFwdGVyLT5ody5mYy5sb3dfd2F0ZXIsICZvcHQpOworCQl9IGVsc2UgeworCQkJYWRhcHRlci0+aHcuZmMubG93X3dhdGVyID0gb3B0LmRlZjsKKwkJfQorCQlpZighKGFkYXB0ZXItPmh3LmZjLnR5cGUgJiBpeGdiX2ZjX3J4X3BhdXNlKSApCisJCQlwcmludGsgKEtFUk5fSU5GTyAKKwkJCQkiSWdub3JpbmcgUnhGQ0xvd1RocmVzaCB3aGVuIG5vIFJ4RkNcbiIpOworCX0KKwl7IC8qIEZsb3cgQ29udHJvbCBQYXVzZSBUaW1lIFJlcXVlc3QqLworCQlzdHJ1Y3QgaXhnYl9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSByYW5nZV9vcHRpb24sCisJCQkubmFtZSA9ICJGbG93IENvbnRyb2wgUGF1c2UgVGltZSBSZXF1ZXN0IiwKKwkJCS5lcnIgID0gInVzaW5nIGRlZmF1bHQgb2YgIl9fTU9EVUxFX1NUUklORyhERUZBVUxUX0ZDUEFVU0UpLAorCQkJLmRlZiAgPSBERUZBVUxUX0ZDUEFVU0UsCisJCQkuYXJnID0geyAuciA9IHsgLm1pbiA9IE1JTl9GQ1BBVVNFLAorCQkJCQkubWF4ID0gTUFYX0ZDUEFVU0V9fQorCQl9OworCisJCWlmKG51bV9GQ1JlcVRpbWVvdXQgPiBiZCkgeworCQkJaW50IHBhdXNlX3RpbWUgPSBGQ1JlcVRpbWVvdXRbYmRdOworCQkJaXhnYl92YWxpZGF0ZV9vcHRpb24oJnBhdXNlX3RpbWUsICZvcHQpOworCQkJYWRhcHRlci0+aHcuZmMucGF1c2VfdGltZSA9IHBhdXNlX3RpbWU7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5ody5mYy5wYXVzZV90aW1lID0gb3B0LmRlZjsKKwkJfQorCQlpZighKGFkYXB0ZXItPmh3LmZjLnR5cGUgJiBpeGdiX2ZjX3J4X3BhdXNlKSApCisJCQlwcmludGsgKEtFUk5fSU5GTyAKKwkJCQkiSWdub3JpbmcgRkNSZXFUaW1lb3V0IHdoZW4gbm8gUnhGQ1xuIik7CisJfQorCS8qIGhpZ2ggbG93IGFuZCBzcGFjaW5nIGNoZWNrIGZvciByeCBmbG93IGNvbnRyb2wgdGhyZXNob2xkcyAqLworCWlmIChhZGFwdGVyLT5ody5mYy50eXBlICYgaXhnYl9mY19yeF9wYXVzZSkgeworCQkvKiBoaWdoIG11c3QgYmUgZ3JlYXRlciB0aGFuIGxvdyAqLworCQlpZiAoYWRhcHRlci0+aHcuZmMuaGlnaF93YXRlciA8IChhZGFwdGVyLT5ody5mYy5sb3dfd2F0ZXIgKyA4KSkgeworCQkJLyogc2V0IGRlZmF1bHRzICovCisJCQlwcmludGsgKEtFUk5fSU5GTyAKKwkJCQkiUnhGQ0hpZ2hUaHJlc2ggbXVzdCBiZSA+PSAoUnhGQ0xvd1RocmVzaCArIDgpLCAiCisJCQkJIlVzaW5nIERlZmF1bHRzXG4iKTsKKwkJCWFkYXB0ZXItPmh3LmZjLmhpZ2hfd2F0ZXIgPSBERUZBVUxUX0ZDUlRIOworCQkJYWRhcHRlci0+aHcuZmMubG93X3dhdGVyICA9IERFRkFVTFRfRkNSVEw7CisJCX0KKwl9CisJeyAvKiBSZWNlaXZlIEludGVycnVwdCBEZWxheSAqLworCQlzdHJ1Y3QgaXhnYl9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSByYW5nZV9vcHRpb24sCisJCQkubmFtZSA9ICJSZWNlaXZlIEludGVycnVwdCBEZWxheSIsCisJCQkuZXJyICA9ICJ1c2luZyBkZWZhdWx0IG9mICIgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfUkRUUiksCisJCQkuZGVmICA9IERFRkFVTFRfUkRUUiwKKwkJCS5hcmcgID0geyAuciA9IHsgLm1pbiA9IE1JTl9SRFRSLAorCQkJCQkgLm1heCA9IE1BWF9SRFRSfX0KKwkJfTsKKworCQlpZihudW1fUnhJbnREZWxheSA+IGJkKSB7CisJCQlhZGFwdGVyLT5yeF9pbnRfZGVsYXkgPSBSeEludERlbGF5W2JkXTsKKwkJCWl4Z2JfdmFsaWRhdGVfb3B0aW9uKCZhZGFwdGVyLT5yeF9pbnRfZGVsYXksICZvcHQpOworCQl9IGVsc2UgeworCQkJYWRhcHRlci0+cnhfaW50X2RlbGF5ID0gb3B0LmRlZjsKKwkJfQorCX0KKwl7IC8qIFRyYW5zbWl0IEludGVycnVwdCBEZWxheSAqLworCQlzdHJ1Y3QgaXhnYl9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSByYW5nZV9vcHRpb24sCisJCQkubmFtZSA9ICJUcmFuc21pdCBJbnRlcnJ1cHQgRGVsYXkiLAorCQkJLmVyciAgPSAidXNpbmcgZGVmYXVsdCBvZiAiIF9fTU9EVUxFX1NUUklORyhERUZBVUxUX1RJRFYpLAorCQkJLmRlZiAgPSBERUZBVUxUX1RJRFYsCisJCQkuYXJnICA9IHsgLnIgPSB7IC5taW4gPSBNSU5fVElEViwKKwkJCQkJIC5tYXggPSBNQVhfVElEVn19CisJCX07CisKKwkJaWYobnVtX1R4SW50RGVsYXkgPiBiZCkgeworCQkJYWRhcHRlci0+dHhfaW50X2RlbGF5ID0gVHhJbnREZWxheVtiZF07CisJCQlpeGdiX3ZhbGlkYXRlX29wdGlvbigmYWRhcHRlci0+dHhfaW50X2RlbGF5LCAmb3B0KTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPnR4X2ludF9kZWxheSA9IG9wdC5kZWY7CisJCX0KKwl9CisKKwl7IC8qIFRyYW5zbWl0IEludGVycnVwdCBEZWxheSBFbmFibGUgKi8KKwkJc3RydWN0IGl4Z2Jfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gZW5hYmxlX29wdGlvbiwKKwkJCS5uYW1lID0gIlR4IEludGVycnVwdCBEZWxheSBFbmFibGUiLAorCQkJLmVyciAgPSAiZGVmYXVsdGluZyB0byBFbmFibGVkIiwKKwkJCS5kZWYgID0gT1BUSU9OX0VOQUJMRUQKKwkJfTsKKworCQlpZihudW1fSW50RGVsYXlFbmFibGUgPiBiZCkgeworCQkJaW50IGlkZSA9IEludERlbGF5RW5hYmxlW2JkXTsKKwkJCWl4Z2JfdmFsaWRhdGVfb3B0aW9uKCZpZGUsICZvcHQpOworCQkJYWRhcHRlci0+dHhfaW50X2RlbGF5X2VuYWJsZSA9IGlkZTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPnR4X2ludF9kZWxheV9lbmFibGUgPSBvcHQuZGVmOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvamF6enNvbmljLmMgYi9kcml2ZXJzL25ldC9qYXp6c29uaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmVjNjEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvamF6enNvbmljLmMKQEAgLTAsMCArMSwzODEgQEAKKy8qCisgKiBzb25pYy5jCisgKgorICogKEMpIDE5OTYsMTk5OCBieSBUaG9tYXMgQm9nZW5kb2VyZmVyICh0c2JvZ2VuZEBhbHBoYS5mcmFua2VuLmRlKQorICogCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB3b3JrIGZyb20gQW5kcmVhcyBCdXNzZSwgYnV0IG1vc3Qgb2YKKyAqIHRoZSBjb2RlIGlzIHJld3JpdHRlbi4KKyAqIAorICogKEMpIDE5OTUgYnkgQW5kcmVhcyBCdXNzZSAoYW5keUB3YWxkb3JmLWdtYmguZGUpCisgKgorICogQSBkcml2ZXIgZm9yIHRoZSBvbmJvYXJkIFNvbmljIGV0aGVybmV0IGNvbnRyb2xsZXIgb24gTWlwcyBKYXp6CisgKiBzeXN0ZW1zIChBY2VyIFBpY2EtNjEsIE1pcHMgTWFnbnVtIDQwMDAsIE9saXZldHRpIE03MDAgYW5kCisgKiBwZXJoYXBzIG90aGVycywgdG9vKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9qYXp6Lmg+CisjaW5jbHVkZSA8YXNtL2phenpkbWEuaD4KKworc3RhdGljIGNoYXIgamF6el9zb25pY19zdHJpbmdbXSA9ICJqYXp6c29uaWMiOworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmphenpfc29uaWNfZGV2aWNlOworCisjZGVmaW5lIFNPTklDX01FTV9TSVpFCTB4MTAwCisKKyNkZWZpbmUgU1JFR1NfUEFEKG4pICAgIHUxNiBuOworCisjaW5jbHVkZSAic29uaWMuaCIKKworLyoKKyAqIE1hY3JvcyB0byBhY2Nlc3MgU09OSUMgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgU09OSUNfUkVBRChyZWcpICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKiliYXNlX2FkZHIrcmVnKSkKKworI2RlZmluZSBTT05JQ19XUklURShyZWcsdmFsKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJKigodm9sYXRpbGUgdW5zaWduZWQgaW50ICopYmFzZV9hZGRyKyhyZWcpKSA9ICh2YWwpOwkJXAorfSB3aGlsZSAoMCkKKworCisvKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcgKi8KKyNpZmRlZiBTT05JQ19ERUJVRworc3RhdGljIHVuc2lnbmVkIGludCBzb25pY19kZWJ1ZyA9IFNPTklDX0RFQlVHOworI2Vsc2UgCitzdGF0aWMgdW5zaWduZWQgaW50IHNvbmljX2RlYnVnID0gMTsKKyNlbmRpZgorCisvKgorICogQmFzZSBhZGRyZXNzIGFuZCBpbnRlcnJ1cHQgb2YgdGhlIFNPTklDIGNvbnRyb2xsZXIgb24gSkFaWiBib2FyZHMKKyAqLworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHBvcnQ7CisJdW5zaWduZWQgaW50IGlycTsKK30gc29uaWNfcG9ydGxpc3RbXSA9IHsge0pBWlpfRVRIRVJORVRfQkFTRSwgSkFaWl9FVEhFUk5FVF9JUlF9LCB7MCwgMH19OworCisvKgorICogV2UgY2Fubm90IHVzZSBzdGF0aW9uIChldGhlcm5ldCkgYWRkcmVzcyBwcmVmaXhlcyB0byBkZXRlY3QgdGhlCisgKiBzb25pYyBjb250cm9sbGVyIHNpbmNlIHRoZXNlIGFyZSBib2FyZCBtYW51ZmFjdHVyZXIgZGVwZW5kZWQuCisgKiBTbyB3ZSBjaGVjayBmb3Iga25vd24gU2lsaWNvbiBSZXZpc2lvbiBJRHMgaW5zdGVhZC4gCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBrbm93bl9yZXZpc2lvbnNbXSA9Cit7CisJMHgwNCwJCQkvKiBNaXBzIE1hZ251bSA0MDAwICovCisJMHhmZmZmCQkJLyogZW5kIG9mIGxpc3QgKi8KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNvbmljX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisJdW5zaWduZWQgaW50IHNpbGljb25fcmV2aXNpb247CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3Qgc29uaWNfbG9jYWwgKmxwOworCWludCBlcnIgPSAtRU5PREVWOworCWludCBpOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYmFzZV9hZGRyLCBTT05JQ19NRU1fU0laRSwgamF6el9zb25pY19zdHJpbmcpKQorCQlyZXR1cm4gLUVCVVNZOworCS8qCisJICogZ2V0IHRoZSBTaWxpY29uIFJldmlzaW9uIElELiBJZiB0aGlzIGlzIG9uZSBvZiB0aGUga25vd24KKwkgKiBvbmUgYXNzdW1lIHRoYXQgd2UgZm91bmQgYSBTT05JQyBldGhlcm5ldCBjb250cm9sbGVyIGF0CisJICogdGhlIGV4cGVjdGVkIGxvY2F0aW9uLgorCSAqLworCXNpbGljb25fcmV2aXNpb24gPSBTT05JQ19SRUFEKFNPTklDX1NSKTsKKwlpZiAoc29uaWNfZGVidWcgPiAxKQorCQlwcmludGsoIlNPTklDIFNpbGljb24gUmV2aXNpb24gPSAweCUwNHhcbiIsc2lsaWNvbl9yZXZpc2lvbik7CisKKwlpID0gMDsKKwl3aGlsZSAoa25vd25fcmV2aXNpb25zW2ldICE9IDB4ZmZmZgorCSAgICAgICAmJiBrbm93bl9yZXZpc2lvbnNbaV0gIT0gc2lsaWNvbl9yZXZpc2lvbikKKwkJaSsrOworCisJaWYgKGtub3duX3JldmlzaW9uc1tpXSA9PSAweGZmZmYpIHsKKwkJcHJpbnRrKCJTT05JQyBldGhlcm5ldCBjb250cm9sbGVyIG5vdCBmb3VuZCAoMHglNHgpXG4iLAorCQkgICAgICAgc2lsaWNvbl9yZXZpc2lvbik7CisJCWdvdG8gb3V0OworCX0KKyAgICAKKwlpZiAoc29uaWNfZGVidWcgICYmICB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwlwcmludGsoIiVzOiBTb25pYyBldGhlcm5ldCBmb3VuZCBhdCAweCUwOGx4LCAiLCBkZXYtPm5hbWUsIGJhc2VfYWRkcik7CisKKwkvKiBGaWxsIGluIHRoZSAnZGV2JyBmaWVsZHMuICovCisJZGV2LT5iYXNlX2FkZHIgPSBiYXNlX2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisKKwkvKgorCSAqIFB1dCB0aGUgc29uaWMgaW50byBzb2Z0d2FyZSByZXNldCwgdGhlbgorCSAqIHJldHJpZXZlIGFuZCBwcmludCB0aGUgZXRoZXJuZXQgYWRkcmVzcy4KKwkgKi8KKwlTT05JQ19XUklURShTT05JQ19DTUQsU09OSUNfQ1JfUlNUKTsKKwlTT05JQ19XUklURShTT05JQ19DRVAsMCk7CisJZm9yIChpPTA7IGk8MzsgaSsrKSB7CisJCXZhbCA9IFNPTklDX1JFQUQoU09OSUNfQ0FQMC1pKTsKKwkJZGV2LT5kZXZfYWRkcltpKjJdID0gdmFsOworCQlkZXYtPmRldl9hZGRyW2kqMisxXSA9IHZhbCA+PiA4OworCX0KKworCXByaW50aygiSFcgQWRkcmVzcyAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCXByaW50aygiJTIuMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwkJaWYgKGk8NSkKKwkJCXByaW50aygiOiIpOworCX0KKworCXByaW50aygiIElSUSAlZFxuIiwgaXJxKTsKKworCWVyciA9IC1FTk9NRU07CisgICAgCisJLyogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlpZiAoZGV2LT5wcml2ID09IE5VTEwpIHsKKwkJLyoKKwkJICogdGhlIG1lbW9yeSBiZSBsb2NhdGVkIGluIHRoZSBzYW1lIDY0a2Igc2VnbWVudAorCQkgKi8KKwkJbHAgPSBOVUxMOworCQlpID0gMDsKKwkJZG8geworCQkJbHAgPSBrbWFsbG9jKHNpemVvZigqbHApLCBHRlBfS0VSTkVMKTsKKwkJCWlmICgodW5zaWduZWQgbG9uZykgbHAgPj4gMTYKKwkJCSAgICAhPSAoKHVuc2lnbmVkIGxvbmcpbHAgKyBzaXplb2YoKmxwKSApID4+IDE2KSB7CisJCQkJLyogRklYTUUsIGZyZWUgdGhlIG1lbW9yeSBsYXRlciAqLworCQkJCWtmcmVlKGxwKTsKKwkJCQlscCA9IE5VTEw7CisJCQl9CisJCX0gd2hpbGUgKGxwID09IE5VTEwgJiYgaSsrIDwgMjApOworCisJCWlmIChscCA9PSBOVUxMKSB7CisJCQlwcmludGsoIiVzOiBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRlc2NyaXB0b3JzXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW1lbXNldChscCwgMCwgc2l6ZW9mKHN0cnVjdCBzb25pY19sb2NhbCkpOworCisJCS8qIGdldCB0aGUgdmlydHVhbCBkbWEgYWRkcmVzcyAqLworCQlscC0+Y2RhX2xhZGRyID0gdmRtYV9hbGxvYyhDUEhZU0FERFIobHApLHNpemVvZigqbHApKTsKKwkJaWYgKGxwLT5jZGFfbGFkZHIgPT0gfjBVTCkgeworCQkJcHJpbnRrKCIlczogY291bGRuJ3QgZ2V0IERNQSBwYWdlIGVudHJ5IGZvciAiCisJCQkgICAgICAgImRlc2NyaXB0b3JzXG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBvdXQxOworCQl9CisKKwkJbHAtPnRkYV9sYWRkciA9IGxwLT5jZGFfbGFkZHIgKyBzaXplb2YgKGxwLT5jZGEpOworCQlscC0+cnJhX2xhZGRyID0gbHAtPnRkYV9sYWRkciArIHNpemVvZiAobHAtPnRkYSk7CisJCWxwLT5yZGFfbGFkZHIgPSBscC0+cnJhX2xhZGRyICsgc2l6ZW9mIChscC0+cnJhKTsKKwkKKwkJLyogYWxsb2NhdGUgcmVjZWl2ZSBidWZmZXIgYXJlYSAqLworCQkvKiBGSVhNRSwgbWF5YmUgd2Ugc2hvdWxkIHVzZSBza2JzICovCisJCWxwLT5yYmEgPSBrbWFsbG9jKFNPTklDX05VTV9SUlMgKiBTT05JQ19SQlNJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoIWxwLT5yYmEpIHsKKwkJCXByaW50aygiJXM6IGNvdWxkbid0IGFsbG9jYXRlIHJlY2VpdmUgYnVmZmVyc1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZ290byBvdXQyOworCQl9CisKKwkJLyogZ2V0IHZpcnR1YWwgZG1hIGFkZHJlc3MgKi8KKwkJbHAtPnJiYV9sYWRkciA9IHZkbWFfYWxsb2MoQ1BIWVNBRERSKGxwLT5yYmEpLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JQ19OVU1fUlJTICogU09OSUNfUkJTSVpFKTsKKwkJaWYgKGxwLT5yYmFfbGFkZHIgPT0gfjBVTCkgeworCQkJcHJpbnRrKCIlczogY291bGRuJ3QgZ2V0IERNQSBwYWdlIGVudHJ5IGZvciByZWNlaXZlICIKKwkJCSAgICAgICAiYnVmZmVyc1xuIixkZXYtPm5hbWUpOworCQkJZ290byBvdXQzOworCQl9CisKKwkJLyogbm93IGNvbnZlcnQgcG9pbnRlciB0byBLU0VHMSBwb2ludGVyICovCisJCWxwLT5yYmEgPSAoY2hhciAqKUtTRUcxQUREUihscC0+cmJhKTsKKwkJZmx1c2hfY2FjaGVfYWxsKCk7CisJCWRldi0+cHJpdiA9IChzdHJ1Y3Qgc29uaWNfbG9jYWwgKilLU0VHMUFERFIobHApOworCX0KKworCWxwID0gKHN0cnVjdCBzb25pY19sb2NhbCAqKWRldi0+cHJpdjsKKwlkZXYtPm9wZW4gPSBzb25pY19vcGVuOworCWRldi0+c3RvcCA9IHNvbmljX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gc29uaWNfc2VuZF9wYWNrZXQ7CisJZGV2LT5nZXRfc3RhdHMJPSBzb25pY19nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc29uaWNfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisKKwkvKgorCSAqIGNsZWFyIHRhbGx5IGNvdW50ZXIKKwkgKi8KKwlTT05JQ19XUklURShTT05JQ19DUkNULDB4ZmZmZik7CisJU09OSUNfV1JJVEUoU09OSUNfRkFFVCwweGZmZmYpOworCVNPTklDX1dSSVRFKFNPTklDX01QVCwweGZmZmYpOworCisJcmV0dXJuIDA7CitvdXQzOgorCWtmcmVlKGxwLT5yYmEpOworb3V0MjoKKwl2ZG1hX2ZyZWUobHAtPmNkYV9sYWRkcik7CitvdXQxOgorCWtmcmVlKGxwKTsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihiYXNlX2FkZHIsIFNPTklDX01FTV9TSVpFKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogUHJvYmUgZm9yIGEgU09OSUMgZXRoZXJuZXQgY29udHJvbGxlciBvbiBhIE1pcHMgSmF6eiBib2FyZC4KKyAqIEFjdHVhbGx5IHByb2JpbmcgaXMgc3VwZXJmbHVvdXMgYnV0IHdlJ3JlIHBhcmFub2lkLgorICovCitzdGF0aWMgaW50IF9faW5pdCBqYXp6X3NvbmljX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBzb25pY19sb2NhbCAqbHA7CisJdW5zaWduZWQgbG9uZyBiYXNlX2FkZHI7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisKKwkvKgorCSAqIERvbid0IHByb2JlIGlmIHdlJ3JlIG5vdCBydW5uaW5nIG9uIGEgSmF6eiBib2FyZC4KKwkgKi8KKwlpZiAobWlwc19tYWNoZ3JvdXAgIT0gTUFDSF9HUk9VUF9KQVpaKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KDApOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoYmFzZV9hZGRyID49IEtTRUcwKQl7IC8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJZXJyID0gc29uaWNfcHJvYmUxKGRldiwgYmFzZV9hZGRyLCBkZXYtPmlycSk7CisJfSBlbHNlIGlmIChiYXNlX2FkZHIgIT0gMCkgeyAvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCWVyciA9IC1FTlhJTzsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBzb25pY19wb3J0bGlzdFtpXS5wb3J0OyBpKyspIHsKKwkJCWludCBpbyA9IHNvbmljX3BvcnRsaXN0W2ldLnBvcnQ7CisJCQlpZiAoc29uaWNfcHJvYmUxKGRldiwgaW8sIHNvbmljX3BvcnRsaXN0W2ldLmlycSkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIXNvbmljX3BvcnRsaXN0W2ldLnBvcnQpCisJCQllcnIgPSAtRU5PREVWOworCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisKKwlyZXR1cm4gMDsKKworb3V0MToKKwlscCA9IGRldi0+cHJpdjsKKwl2ZG1hX2ZyZWUobHAtPnJiYV9sYWRkcik7CisJa2ZyZWUobHAtPnJiYSk7CisJdmRtYV9mcmVlKGxwLT5jZGFfbGFkZHIpOworCWtmcmVlKGxwKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU09OSUNfTUVNX1NJWkUpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogICAgICBTT05JQyB1c2VzIGEgbm9ybWFsIElSUQorICovCisjZGVmaW5lIHNvbmljX3JlcXVlc3RfaXJxICAgICAgIHJlcXVlc3RfaXJxCisjZGVmaW5lIHNvbmljX2ZyZWVfaXJxICAgICAgICAgIGZyZWVfaXJxCisKKyNkZWZpbmUgc29uaWNfY2hpcHRvbWVtKHgpICAgICAgS1NFRzFBRERSKHZkbWFfbG9nMnBoeXMoeCkpCisKKyNpbmNsdWRlICJzb25pYy5jIgorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBqYXp6X3NvbmljX2RldmljZV9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2aWNlLT5kcml2ZXJfZGF0YTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCXJlbGVhc2VfcmVnaW9uIChkZXYtPmJhc2VfYWRkciwgU09OSUNfTUVNX1NJWkUpOworCWZyZWVfbmV0ZGV2IChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBqYXp6X3NvbmljX2RyaXZlciA9IHsKKwkubmFtZQk9IGphenpfc29uaWNfc3RyaW5nLAorCS5idXMJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlCT0gamF6el9zb25pY19wcm9iZSwKKwkucmVtb3ZlCT0gX19kZXZleGl0X3AoamF6el9zb25pY19kZXZpY2VfcmVtb3ZlKSwKK307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorc3RhdGljIHZvaWQgamF6el9zb25pY19wbGF0Zm9ybV9yZWxlYXNlIChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxkZXY7CisKKwkvKiBmcmVlIGRldmljZSAqLworCXBsZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlIChkZXZpY2UpOworCWtmcmVlIChwbGRldik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGphenpfc29uaWNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGRldjsKKworCWlmIChkcml2ZXJfcmVnaXN0ZXIoJmphenpfc29uaWNfZHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkRyaXZlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJamF6el9zb25pY19kZXZpY2UgPSBOVUxMOworCisJaWYgKCEocGxkZXYgPSBrbWFsbG9jIChzaXplb2YgKCpwbGRldiksIEdGUF9LRVJORUwpKSkgeworCQlnb3RvIG91dF91bnJlZ2lzdGVyOworCX0KKworCW1lbXNldChwbGRldiwgMCwgc2l6ZW9mICgqcGxkZXYpKTsKKwlwbGRldi0+bmFtZQkJPSBqYXp6X3NvbmljX3N0cmluZzsKKwlwbGRldi0+aWQJCT0gMDsKKwlwbGRldi0+ZGV2LnJlbGVhc2UJPSBqYXp6X3NvbmljX3BsYXRmb3JtX3JlbGVhc2U7CisJamF6el9zb25pY19kZXZpY2UJPSBwbGRldjsKKworCWlmIChwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIgKHBsZGV2KSkgeworCQlrZnJlZShwbGRldik7CisJCWphenpfc29uaWNfZGV2aWNlID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X3VucmVnaXN0ZXI6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGxkZXYpOworCisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBqYXp6X3NvbmljX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmphenpfc29uaWNfZHJpdmVyKTsKKworCWlmIChqYXp6X3NvbmljX2RldmljZSkgeworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihqYXp6X3NvbmljX2RldmljZSk7CisJCWphenpfc29uaWNfZGV2aWNlID0gTlVMTDsKKwl9Cit9CisKK21vZHVsZV9pbml0KGphenpfc29uaWNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoamF6el9zb25pY19jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9sYW5jZS5jIGIvZHJpdmVycy9uZXQvbGFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWM1NTdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbGFuY2UuYwpAQCAtMCwwICsxLDEzMDggQEAKKy8qIGxhbmNlLmM6IEFuIEFNRCBMQU5DRS9QQ25ldCBldGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LiAqLworLyoKKwlXcml0dGVuL2NvcHlyaWdodCAxOTkzLTE5OTggYnkgRG9uYWxkIEJlY2tlci4KKworCUNvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKwlEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBBbGxpZWQgVGVsZXNpcyBBVDE1MDAgYW5kIEhQIEoyNDA1QSwgYW5kIHNob3VsZCB3b3JrCisJd2l0aCBtb3N0IG90aGVyIExBTkNFLWJhc2VkIGJ1cy1tYXN0ZXIgKE5FMjEwMC9ORTI1MDApIGV0aGVyY2FyZHMuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlBbmRyZXkgVi4gU2F2b2Noa2luOgorCS0gYWxpZ25tZW50IHByb2JsZW0gd2l0aCAxLjMuKiBrZXJuZWwgYW5kIHNvbWUgbWlub3IgY2hhbmdlcy4KKwlUaG9tYXMgQm9nZW5kb2VyZmVyICh0c2JvZ2VuZEBiaWdidWcuZnJhbmtlbi5kZSk6CisJLSBhZGRlZCBzdXBwb3J0IGZvciBMaW51eC9BbHBoYSwgYnV0IHJlbW92ZWQgbW9zdCBvZiBpdCwgYmVjYXVzZQorICAgICAgICBpdCB3b3JrZWQgb25seSBmb3IgdGhlIFBDSSBjaGlwLiAKKyAgICAgIC0gYWRkZWQgaG9vayBmb3IgdGhlIDMyYml0IGxhbmNlIGRyaXZlcgorICAgICAgLSBhZGRlZCBQQ25ldFBDSSBJSSAoNzlDOTcwQSkgdG8gY2hpcCB0YWJsZQorCVBhdWwgR29ydG1ha2VyIChncGcxMDlAcnNwaHkxLmFudS5lZHUuYXUpOgorCS0gaG9wZWZ1bGx5IGZpeCBhYm92ZSBzbyBMaW51eC9BbHBoYSBjYW4gdXNlIElTQSBjYXJkcyB0b28uCisgICAgOC8yMC85NiBGaXhlZCA3OTkwIGF1dG9JUlEgZmFpbHVyZSBhbmQgcmV2ZXJzZWQgdW5uZWVkZWQgYWxpZ25tZW50IC1kamIKKyAgICB2MS4xMiAxMC8yNy85NyBNb2R1bGUgc3VwcG9ydCAtZGpiCisgICAgdjEuMTQgIDIvMy85OCBNb2R1bGUgc3VwcG9ydCBtb2RpZmllZCwgbWFkZSBQQ0kgc3VwcG9ydCBvcHRpb25hbCAtZGpiCisgICAgdjEuMTUgNS8yNy85OSBGaXhlZCBidWcgaW4gdGhlIGNsZWFudXBfbW9kdWxlKCkuIGRldi0+cHJpdiB3YXMgZnJlZWQKKyAgICAgICAgICAgICAgICAgIGJlZm9yZSB1bnJlZ2lzdGVyX25ldGRldigpIHdoaWNoIGNhdXNlZCBOVUxMIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSBsYXRlciBpbiB0aGUgY2hhaW4gKGluIHJ0bmV0bGlua19maWxsX2lmaW5mbygpKQorICAgICAgICAgICAgICAgICAgLS0gTWlrYSBLdW9wcGFsYSA8bWlrdUBpa2kuZmk+CisgICAgCisgICAgRm9yd2FyZCBwb3J0ZWQgdjEuMTQgdG8gMi4xLjEyOSwgbWVyZ2VkIHRoZSBQQ0kgYW5kIG1pc2MgY2hhbmdlcyBmcm9tCisgICAgdGhlIDIuMSB2ZXJzaW9uIG9mIHRoZSBvbGQgZHJpdmVyIC0gQWxhbiBDb3gKKworICAgIEdldCByaWQgb2YgY2hlY2tfcmVnaW9uLCBjaGVjayBrbWFsbG9jIHJldHVybiBpbiBsYW5jZV9wcm9iZTEKKyAgICBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gLSAxMS8wMS8yMDAxCisKKwlSZXdvcmtlZCBkZXRlY3Rpb24sIGFkZGVkIHN1cHBvcnQgZm9yIFJhY2FsIEludGVyTGFuIEV0aGVyQmxhc3RlciBjYXJkcworCVZlc3NlbGluIEtvc3RhZGlub3YgPHZlc29rIGF0IHlhaG9vIGRvdCBjb20gPiAtIDIyLzQvMjAwNAorKi8KKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0gImxhbmNlLmM6djEuMTVhYyAxOTk5LzExLzEzIGRwbGF0dEAzZG8uY29tLCBiZWNrZXJAY2VzZGlzLmdzZmMubmFzYS5nb3ZcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCitzdGF0aWMgdW5zaWduZWQgaW50IGxhbmNlX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9IHsgMHgzMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDB9Oworc3RhdGljIGludCBsYW5jZV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkciwgaW50IGlycSwgaW50IG9wdGlvbnMpOworc3RhdGljIGludCBfX2luaXQgZG9fbGFuY2VfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworc3RhdGljIHN0cnVjdCBjYXJkIHsKKwljaGFyIGlkX29mZnNldDE0OworCWNoYXIgaWRfb2Zmc2V0MTU7Cit9IGNhcmRzW10gPSB7CisJewkvLyJub3JtYWwiCisJCS5pZF9vZmZzZXQxNCA9IDB4NTcsCisJCS5pZF9vZmZzZXQxNSA9IDB4NTcsCisJfSwKKwl7CS8vTkk2NTEwRUIKKwkJLmlkX29mZnNldDE0ID0gMHg1MiwKKwkJLmlkX29mZnNldDE1ID0gMHg0NCwKKwl9LAorCXsJLy9SYWNhbCBJbnRlckxhbiBFdGhlckJsYXN0ZXIKKwkJLmlkX29mZnNldDE0ID0gMHg1MiwKKwkJLmlkX29mZnNldDE1ID0gMHg0OSwKKwl9LAorfTsKKyNkZWZpbmUgTlVNX0NBUkRTIDMKKworI2lmZGVmIExBTkNFX0RFQlVHCitzdGF0aWMgaW50IGxhbmNlX2RlYnVnID0gTEFOQ0VfREVCVUc7CisjZWxzZQorc3RhdGljIGludCBsYW5jZV9kZWJ1ZyA9IDE7CisjZW5kaWYKKworLyoKKwkJCQlUaGVvcnkgb2YgT3BlcmF0aW9uCisKK0kuIEJvYXJkIENvbXBhdGliaWxpdHkKKworVGhpcyBkZXZpY2UgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgQU1EIDc5Qzk2MCwgdGhlICJQQ25ldC1JU0EKK3NpbmdsZS1jaGlwIGV0aGVybmV0IGNvbnRyb2xsZXIgZm9yIElTQSIuICBUaGlzIGNoaXAgaXMgdXNlZCBpbiBhIHdpZGUKK3ZhcmlldHkgb2YgYm9hcmRzIGZyb20gdmVuZG9ycyBzdWNoIGFzIEFsbGllZCBUZWxlc2lzLCBIUCwgS2luZ3N0b24sCithbmQgQm9jYS4gIFRoaXMgZHJpdmVyIGlzIGFsc28gaW50ZW5kZWQgdG8gd29yayB3aXRoIG9sZGVyIEFNRCA3OTkwCitkZXNpZ25zLCBzdWNoIGFzIHRoZSBORTE1MDAgYW5kIE5FMjEwMCwgYW5kIG5ld2VyIDc5Qzk2MS4gIEZvciBjb252ZW5pZW5jZSwKK0kgdXNlIHRoZSBuYW1lIExBTkNFIHRvIHJlZmVyIHRvIGFsbCBvZiB0aGUgQU1EIGNoaXBzLCBldmVuIHRob3VnaCBpdCBwcm9wZXJseQorcmVmZXJzIG9ubHkgdG8gdGhlIG9yaWdpbmFsIDc5OTAuCisKK0lJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworCitUaGUgZHJpdmVyIGlzIGRlc2lnbmVkIHRvIHdvcmsgdGhlIGJvYXJkcyB0aGF0IHVzZSB0aGUgZmFzdGVyCitidXMtbWFzdGVyIG1vZGUsIHJhdGhlciB0aGFuIGluIHNoYXJlZCBtZW1vcnkgbW9kZS4JIChPbmx5IG9sZGVyIGRlc2lnbnMKK2hhdmUgb24tYm9hcmQgYnVmZmVyIG1lbW9yeSBuZWVkZWQgdG8gc3VwcG9ydCB0aGUgc2xvd2VyIHNoYXJlZCBtZW1vcnkgbW9kZS4pCisKK01vc3QgSVNBIGJvYXJkcyBoYXZlIGp1bXBlcmVkIHNldHRpbmdzIGZvciB0aGUgSS9PIGJhc2UsIElSUSBsaW5lLCBhbmQgRE1BCitjaGFubmVsLiAgVGhpcyBkcml2ZXIgcHJvYmVzIHRoZSBsaWtlbHkgYmFzZSBhZGRyZXNzZXM6Cit7MHgzMDAsIDB4MzIwLCAweDM0MCwgMHgzNjB9LgorQWZ0ZXIgdGhlIGJvYXJkIGlzIGZvdW5kIGl0IGdlbmVyYXRlcyBhIERNQS10aW1lb3V0IGludGVycnVwdCBhbmQgdXNlcworYXV0b0lSUSB0byBmaW5kIHRoZSBJUlEgbGluZS4gIFRoZSBETUEgY2hhbm5lbCBjYW4gYmUgc2V0IHdpdGggdGhlIGxvdyBiaXRzCitvZiB0aGUgb3RoZXJ3aXNlLXVudXNlZCBkZXYtPm1lbV9zdGFydCB2YWx1ZSAoYWthIFBBUkFNMSkuICBJZiB1bnNldCBpdCBpcworcHJvYmVkIGZvciBieSBlbmFibGluZyBlYWNoIGZyZWUgRE1BIGNoYW5uZWwgaW4gdHVybiBhbmQgY2hlY2tpbmcgaWYKK2luaXRpYWxpemF0aW9uIHN1Y2NlZWRzLgorCitUaGUgSFAtSjI0MDVBIGJvYXJkIGlzIGFuIGV4Y2VwdGlvbjogd2l0aCB0aGlzIGJvYXJkIGl0IGlzIGVhc3kgdG8gcmVhZCB0aGUKK0VFUFJPTS1zZXQgdmFsdWVzIGZvciB0aGUgYmFzZSwgSVJRLCBhbmQgRE1BLiAgKE9mIGNvdXJzZSB5b3UgbXVzdCBhbHJlYWR5Citfa25vd18gdGhlIGJhc2UgYWRkcmVzcyAtLSB0aGF0IGZpZWxkIGlzIGZvciB3cml0aW5nIHRoZSBFRVBST00uKQorCitJSUkuIERyaXZlciBvcGVyYXRpb24KKworSUlJYS4gUmluZyBidWZmZXJzCitUaGUgTEFOQ0UgdXNlcyByaW5nIGJ1ZmZlcnMgb2YgVHggYW5kIFJ4IGRlc2NyaXB0b3JzLiAgRWFjaCBlbnRyeSBkZXNjcmliZXMKK3RoZSBiYXNlIGFuZCBsZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyLCBhbG9uZyB3aXRoIHN0YXR1cyBiaXRzLgkgVGhlIGxlbmd0aAorb2YgdGhlc2UgYnVmZmVycyBpcyBzZXQgYnkgTEFOQ0VfTE9HX3tSWCxUWH1fQlVGRkVSUywgd2hpY2ggaXMgbG9nXzIoKSBvZgordGhlIGJ1ZmZlciBsZW5ndGggKHJhdGhlciB0aGFuIGJlaW5nIGRpcmVjdGx5IHRoZSBidWZmZXIgbGVuZ3RoKSBmb3IKK2ltcGxlbWVudGF0aW9uIGVhc2UuICBUaGUgY3VycmVudCB2YWx1ZXMgYXJlIDIgKFR4KSBhbmQgNCAoUngpLCB3aGljaCBsZWFkcyB0bworcmluZyBzaXplcyBvZiA0IChUeCkgYW5kIDE2IChSeCkuICBJbmNyZWFzaW5nIHRoZSBudW1iZXIgb2YgcmluZyBlbnRyaWVzCituZWVkbGVzc2x5IHVzZXMgZXh0cmEgc3BhY2UgYW5kIHJlZHVjZXMgdGhlIGNoYW5jZSB0aGF0IGFuIHVwcGVyIGxheWVyIHdpbGwKK2JlIGFibGUgdG8gcmVvcmRlciBxdWV1ZWQgVHggcGFja2V0cyBiYXNlZCBvbiBwcmlvcml0eS4JIERlY3JlYXNpbmcgdGhlIG51bWJlcgorb2YgZW50cmllcyBtYWtlcyBpdCBtb3JlIGRpZmZpY3VsdCB0byBhY2hpZXZlIGJhY2stdG8tYmFjayBwYWNrZXQgdHJhbnNtaXNzaW9uCithbmQgaW5jcmVhc2VzIHRoZSBjaGFuY2UgdGhhdCBSeCByaW5nIHdpbGwgb3ZlcmZsb3cuICAoQ29uc2lkZXIgdGhlIHdvcnN0IGNhc2UKK29mIHJlY2VpdmluZyBiYWNrLXRvLWJhY2sgbWluaW11bS1zaXplZCBwYWNrZXRzLikKKworVGhlIExBTkNFIGhhcyB0aGUgY2FwYWJpbGl0eSB0byAiY2hhaW4iIGJvdGggUnggYW5kIFR4IGJ1ZmZlcnMsIGJ1dCB0aGlzIGRyaXZlcgorc3RhdGljYWxseSBhbGxvY2F0ZXMgZnVsbC1zaXplZCAoc2xpZ2h0bHkgb3ZlcnNpemVkIC0tIFBLVF9CVUZfU1opIGJ1ZmZlcnMgdG8KK2F2b2lkIHRoZSBhZG1pbmlzdHJhdGl2ZSBvdmVyaGVhZC4gRm9yIHRoZSBSeCBzaWRlIHRoaXMgYXZvaWRzIGR5bmFtaWNhbGx5CithbGxvY2F0aW5nIGZ1bGwtc2l6ZWQgYnVmZmVycyAianVzdCBpbiBjYXNlIiwgYXQgdGhlIGV4cGVuc2Ugb2YgYQorbWVtb3J5LXRvLW1lbW9yeSBkYXRhIGNvcHkgZm9yIGVhY2ggcGFja2V0IHJlY2VpdmVkLiAgRm9yIG1vc3Qgc3lzdGVtcyB0aGlzCitpcyBhIGdvb2QgdHJhZGVvZmY6IHRoZSBSeCBidWZmZXIgd2lsbCBhbHdheXMgYmUgaW4gbG93IG1lbW9yeSwgdGhlIGNvcHkKK2lzIGluZXhwZW5zaXZlLCBhbmQgaXQgcHJpbWVzIHRoZSBjYWNoZSBmb3IgbGF0ZXIgcGFja2V0IHByb2Nlc3NpbmcuICBGb3IgVHgKK3RoZSBidWZmZXJzIGFyZSBvbmx5IHVzZWQgd2hlbiBuZWVkZWQgYXMgbG93LW1lbW9yeSBib3VuY2UgYnVmZmVycy4KKworSUlJQi4gMTZNIG1lbW9yeSBsaW1pdGF0aW9ucy4KK0ZvciB0aGUgSVNBIGJ1cyBtYXN0ZXIgbW9kZSBhbGwgc3RydWN0dXJlcyB1c2VkIGRpcmVjdGx5IGJ5IHRoZSBMQU5DRSwKK3RoZSBpbml0aWFsaXphdGlvbiBibG9jaywgUnggYW5kIFR4IHJpbmdzLCBhbmQgZGF0YSBidWZmZXJzLCBtdXN0IGJlCithY2Nlc3NpYmxlIGZyb20gdGhlIElTQSBidXMsIGkuZS4gaW4gdGhlIGxvd2VyIDE2TSBvZiByZWFsIG1lbW9yeS4KK1RoaXMgaXMgYSBwcm9ibGVtIGZvciBjdXJyZW50IExpbnV4IGtlcm5lbHMgb24gPjE2TSBtYWNoaW5lcy4gVGhlIG5ldHdvcmsKK2RldmljZXMgYXJlIGluaXRpYWxpemVkIGFmdGVyIG1lbW9yeSBpbml0aWFsaXphdGlvbiwgYW5kIHRoZSBrZXJuZWwgZG9sZXMgb3V0CittZW1vcnkgZnJvbSB0aGUgdG9wIG9mIG1lbW9yeSBkb3dud2FyZC4JIFRoZSBjdXJyZW50IHNvbHV0aW9uIGlzIHRvIGhhdmUgYQorc3BlY2lhbCBuZXR3b3JrIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgdGhhdCdzIGNhbGxlZCBiZWZvcmUgbWVtb3J5Citpbml0aWFsaXphdGlvbjsgdGhpcyB3aWxsIGV2ZW50dWFsbHkgYmUgZ2VuZXJhbGl6ZWQgZm9yIGFsbCBuZXR3b3JrIGRldmljZXMuCitBcyBtZW50aW9uZWQgYmVmb3JlLCBsb3ctbWVtb3J5ICJib3VuY2UtYnVmZmVycyIgYXJlIHVzZWQgd2hlbiBuZWVkZWQuCisKK0lJSUMuIFN5bmNocm9uaXphdGlvbgorVGhlIGRyaXZlciBydW5zIGFzIHR3byBpbmRlcGVuZGVudCwgc2luZ2xlLXRocmVhZGVkIGZsb3dzIG9mIGNvbnRyb2wuICBPbmUKK2lzIHRoZSBzZW5kLXBhY2tldCByb3V0aW5lLCB3aGljaCBlbmZvcmNlcyBzaW5nbGUtdGhyZWFkZWQgdXNlIGJ5IHRoZQorZGV2LT50YnVzeSBmbGFnLiAgVGhlIG90aGVyIHRocmVhZCBpcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIHdoaWNoIGlzIHNpbmdsZQordGhyZWFkZWQgYnkgdGhlIGhhcmR3YXJlIGFuZCBvdGhlciBzb2Z0d2FyZS4KKworVGhlIHNlbmQgcGFja2V0IHRocmVhZCBoYXMgcGFydGlhbCBjb250cm9sIG92ZXIgdGhlIFR4IHJpbmcgYW5kICdkZXYtPnRidXN5JworZmxhZy4gIEl0IHNldHMgdGhlIHRidXN5IGZsYWcgd2hlbmV2ZXIgaXQncyBxdWV1aW5nIGEgVHggcGFja2V0LiBJZiB0aGUgbmV4dAorcXVldWUgc2xvdCBpcyBlbXB0eSwgaXQgY2xlYXJzIHRoZSB0YnVzeSBmbGFnIHdoZW4gZmluaXNoZWQgb3RoZXJ3aXNlIGl0IHNldHMKK3RoZSAnbHAtPnR4X2Z1bGwnIGZsYWcuCisKK1RoZSBpbnRlcnJ1cHQgaGFuZGxlciBoYXMgZXhjbHVzaXZlIGNvbnRyb2wgb3ZlciB0aGUgUnggcmluZyBhbmQgcmVjb3JkcyBzdGF0cworZnJvbSB0aGUgVHggcmluZy4gKFRoZSBUeC1kb25lIGludGVycnVwdCBjYW4ndCBiZSBzZWxlY3RpdmVseSB0dXJuZWQgb2ZmLCBzbword2UgY2FuJ3QgYXZvaWQgdGhlIGludGVycnVwdCBvdmVyaGVhZCBieSBoYXZpbmcgdGhlIFR4IHJvdXRpbmUgcmVhcCB0aGUgVHgKK3N0YXRzLikJIEFmdGVyIHJlYXBpbmcgdGhlIHN0YXRzLCBpdCBtYXJrcyB0aGUgcXVldWUgZW50cnkgYXMgZW1wdHkgYnkgc2V0dGluZwordGhlICdiYXNlJyB0byB6ZXJvLiBJZmYgdGhlICdscC0+dHhfZnVsbCcgZmxhZyBpcyBzZXQsIGl0IGNsZWFycyBib3RoIHRoZQordHhfZnVsbCBhbmQgdGJ1c3kgZmxhZ3MuCisKKyovCisKKy8qIFNldCB0aGUgbnVtYmVyIG9mIFR4IGFuZCBSeCBidWZmZXJzLCB1c2luZyBMb2dfMigjIGJ1ZmZlcnMpLgorICAgUmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcyBhcmUgMTYgVHggYnVmZmVycywgYW5kIDE2IFJ4IGJ1ZmZlcnMuCisgICBUaGF0IHRyYW5zbGF0ZXMgdG8gNCBhbmQgNCAoMTYgPT0gMl5eNCkuCisgICBUaGlzIGlzIGEgY29tcGlsZS10aW1lIG9wdGlvbiBmb3IgZWZmaWNpZW5jeS4KKyAgICovCisjaWZuZGVmIExBTkNFX0xPR19UWF9CVUZGRVJTCisjZGVmaW5lIExBTkNFX0xPR19UWF9CVUZGRVJTIDQKKyNkZWZpbmUgTEFOQ0VfTE9HX1JYX0JVRkZFUlMgNAorI2VuZGlmCisKKyNkZWZpbmUgVFhfUklOR19TSVpFCQkJKDEgPDwgKExBTkNFX0xPR19UWF9CVUZGRVJTKSkKKyNkZWZpbmUgVFhfUklOR19NT0RfTUFTSwkJKFRYX1JJTkdfU0laRSAtIDEpCisjZGVmaW5lIFRYX1JJTkdfTEVOX0JJVFMJCSgoTEFOQ0VfTE9HX1RYX0JVRkZFUlMpIDw8IDI5KQorCisjZGVmaW5lIFJYX1JJTkdfU0laRQkJCSgxIDw8IChMQU5DRV9MT0dfUlhfQlVGRkVSUykpCisjZGVmaW5lIFJYX1JJTkdfTU9EX01BU0sJCShSWF9SSU5HX1NJWkUgLSAxKQorI2RlZmluZSBSWF9SSU5HX0xFTl9CSVRTCQkoKExBTkNFX0xPR19SWF9CVUZGRVJTKSA8PCAyOSkKKworI2RlZmluZSBQS1RfQlVGX1NaCQkxNTQ0CisKKy8qIE9mZnNldHMgZnJvbSBiYXNlIEkvTyBhZGRyZXNzLiAqLworI2RlZmluZSBMQU5DRV9EQVRBIDB4MTAKKyNkZWZpbmUgTEFOQ0VfQUREUiAweDEyCisjZGVmaW5lIExBTkNFX1JFU0VUIDB4MTQKKyNkZWZpbmUgTEFOQ0VfQlVTX0lGIDB4MTYKKyNkZWZpbmUgTEFOQ0VfVE9UQUxfU0laRSAweDE4CisKKyNkZWZpbmUgVFhfVElNRU9VVAkyMAorCisvKiBUaGUgTEFOQ0UgUnggYW5kIFR4IHJpbmcgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3QgbGFuY2VfcnhfaGVhZCB7CisJczMyIGJhc2U7CisJczE2IGJ1Zl9sZW5ndGg7CQkJLyogVGhpcyBsZW5ndGggaXMgMnMgY29tcGxlbWVudCAobmVnYXRpdmUpISAqLworCXMxNiBtc2dfbGVuZ3RoOwkJCS8qIFRoaXMgbGVuZ3RoIGlzICJub3JtYWwiLiAqLworfTsKKworc3RydWN0IGxhbmNlX3R4X2hlYWQgeworCXMzMiBiYXNlOworCXMxNiBsZW5ndGg7CQkJCS8qIExlbmd0aCBpcyAycyBjb21wbGVtZW50IChuZWdhdGl2ZSkhICovCisJczE2IG1pc2M7Cit9OworCisvKiBUaGUgTEFOQ0UgaW5pdGlhbGl6YXRpb24gYmxvY2ssIGRlc2NyaWJlZCBpbiBkYXRhYm9vay4gKi8KK3N0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIHsKKwl1MTYgbW9kZTsJCS8qIFByZS1zZXQgbW9kZSAocmVnLiAxNSkgKi8KKwl1OCAgcGh5c19hZGRyWzZdOyAvKiBQaHlzaWNhbCBldGhlcm5ldCBhZGRyZXNzICovCisJdTMyIGZpbHRlclsyXTsJCQkvKiBNdWx0aWNhc3QgZmlsdGVyICh1bnVzZWQpLiAqLworCS8qIFJlY2VpdmUgYW5kIHRyYW5zbWl0IHJpbmcgYmFzZSwgYWxvbmcgd2l0aCBleHRyYSBiaXRzLiAqLworCXUzMiAgcnhfcmluZzsJCQkvKiBUeCBhbmQgUnggcmluZyBiYXNlIHBvaW50ZXJzICovCisJdTMyICB0eF9yaW5nOworfTsKKworc3RydWN0IGxhbmNlX3ByaXZhdGUgeworCS8qIFRoZSBUeCBhbmQgUnggcmluZyBlbnRyaWVzIG11c3QgYmUgYWxpZ25lZCBvbiA4LWJ5dGUgYm91bmRhcmllcy4gKi8KKwlzdHJ1Y3QgbGFuY2VfcnhfaGVhZCByeF9yaW5nW1JYX1JJTkdfU0laRV07CisJc3RydWN0IGxhbmNlX3R4X2hlYWQgdHhfcmluZ1tUWF9SSU5HX1NJWkVdOworCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrCWluaXRfYmxvY2s7CisJY29uc3QgY2hhciAqbmFtZTsKKwkvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQtaW4tcGxhY2UgcGFja2V0L2J1ZmZlciwgZm9yIHNrZnJlZSgpLiAqLworCXN0cnVjdCBza19idWZmKiB0eF9za2J1ZmZbVFhfUklOR19TSVpFXTsKKwkvKiBUaGUgYWRkcmVzc2VzIG9mIHJlY2VpdmUtaW4tcGxhY2Ugc2tidWZmcy4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiogcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJdW5zaWduZWQgbG9uZyByeF9idWZmczsJCS8qIEFkZHJlc3Mgb2YgUnggYW5kIFR4IGJ1ZmZlcnMuICovCisJLyogVHggbG93LW1lbW9yeSAiYm91bmNlIGJ1ZmZlciIgYWRkcmVzcy4gKi8KKwljaGFyICgqdHhfYm91bmNlX2J1ZmZzKVtQS1RfQlVGX1NaXTsKKwlpbnQgY3VyX3J4LCBjdXJfdHg7CQkJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCisJaW50IGRpcnR5X3J4LCBkaXJ0eV90eDsJCS8qIFRoZSByaW5nIGVudHJpZXMgdG8gYmUgZnJlZSgpZWQuICovCisJaW50IGRtYTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl1bnNpZ25lZCBjaGFyIGNoaXBfdmVyc2lvbjsJLyogU2VlIGxhbmNlX2NoaXBfdHlwZS4gKi8KKwlzcGlubG9ja190IGRldmxvY2s7Cit9OworCisjZGVmaW5lIExBTkNFX01VU1RfUEFEICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1QgMHgwMDAwMDAwMgorI2RlZmluZSBMQU5DRV9NVVNUX1JFSU5JVF9SSU5HICAweDAwMDAwMDA0CisjZGVmaW5lIExBTkNFX01VU1RfVU5SRVNFVCAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTEFOQ0VfSEFTX01JU1NFRF9GUkFNRSAgMHgwMDAwMDAxMAorCisvKiBBIG1hcHBpbmcgZnJvbSB0aGUgY2hpcCBJRCBudW1iZXIgdG8gdGhlIHBhcnQgbnVtYmVyIGFuZCBmZWF0dXJlcy4KKyAgIFRoZXNlIGFyZSBmcm9tIHRoZSBkYXRhc2hlZXRzIC0tIGluIHJlYWwgbGlmZSB0aGUgJzk3MCB2ZXJzaW9uCisgICByZXBvcnRlZGx5IGhhcyB0aGUgc2FtZSBJRCBhcyB0aGUgJzk2NS4gKi8KK3N0YXRpYyBzdHJ1Y3QgbGFuY2VfY2hpcF90eXBlIHsKKwlpbnQgaWRfbnVtYmVyOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGZsYWdzOworfSBjaGlwX3RhYmxlW10gPSB7CisJezB4MDAwMCwgIkxBTkNFIDc5OTAiLAkJCQkvKiBBbmNpZW50IGxhbmNlIGNoaXAuICAqLworCQlMQU5DRV9NVVNUX1BBRCArIExBTkNFX01VU1RfVU5SRVNFVH0sCisJezB4MDAwMywgIlBDbmV0L0lTQSA3OUM5NjAiLAkJLyogNzlDOTYwIFBDbmV0L0lTQS4gICovCisJCUxBTkNFX0VOQUJMRV9BVVRPU0VMRUNUICsgTEFOQ0VfTVVTVF9SRUlOSVRfUklORyArCisJCQlMQU5DRV9IQVNfTUlTU0VEX0ZSQU1FfSwKKwl7MHgyMjYwLCAiUENuZXQvSVNBKyA3OUM5NjEiLAkJLyogNzlDOTYxIFBDbmV0L0lTQSssIFBsdWctbi1QbGF5LiAgKi8KKwkJTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1QgKyBMQU5DRV9NVVNUX1JFSU5JVF9SSU5HICsKKwkJCUxBTkNFX0hBU19NSVNTRURfRlJBTUV9LAorCXsweDI0MjAsICJQQ25ldC9QQ0kgNzlDOTcwIiwJCS8qIDc5Qzk3MCBvciA3OUM5NzQgUENuZXQtU0NTSSwgUENJLiAqLworCQlMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVCArIExBTkNFX01VU1RfUkVJTklUX1JJTkcgKworCQkJTEFOQ0VfSEFTX01JU1NFRF9GUkFNRX0sCisJLyogQnVnOiB0aGUgUENuZXQvUENJIGFjdHVhbGx5IHVzZXMgdGhlIFBDbmV0L1ZMQiBJRCBudW1iZXIsIHNvIGp1c3QgY2FsbAorCQlpdCB0aGUgUENuZXQzMi4gKi8KKwl7MHgyNDMwLCAiUENuZXQzMiIsCQkJCQkvKiA3OUM5NjUgUENuZXQgZm9yIFZMIGJ1cy4gKi8KKwkJTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1QgKyBMQU5DRV9NVVNUX1JFSU5JVF9SSU5HICsKKwkJCUxBTkNFX0hBU19NSVNTRURfRlJBTUV9LAorICAgICAgICB7MHgyNjIxLCAiUENuZXQvUENJLUlJIDc5Qzk3MEEiLCAgICAgICAgLyogNzlDOTcwQSBQQ0luZXRQQ0kgSUkuICovCisgICAgICAgICAgICAgICAgTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1QgKyBMQU5DRV9NVVNUX1JFSU5JVF9SSU5HICsKKyAgICAgICAgICAgICAgICAgICAgICAgIExBTkNFX0hBU19NSVNTRURfRlJBTUV9LAorCXsweDAsIAkgIlBDbmV0ICh1bmtub3duKSIsCisJCUxBTkNFX0VOQUJMRV9BVVRPU0VMRUNUICsgTEFOQ0VfTVVTVF9SRUlOSVRfUklORyArCisJCQlMQU5DRV9IQVNfTUlTU0VEX0ZSQU1FfSwKK307CisKK2VudW0ge09MRF9MQU5DRSA9IDAsIFBDTkVUX0lTQT0xLCBQQ05FVF9JU0FQPTIsIFBDTkVUX1BDST0zLCBQQ05FVF9WTEI9NCwgUENORVRfUENJX0lJPTUsIExBTkNFX1VOS05PV049Nn07CisKKworLyogTm9uLXplcm8gaWYgbGFuY2VfcHJvYmUxKCkgbmVlZHMgdG8gYWxsb2NhdGUgbG93LW1lbW9yeSBib3VuY2UgYnVmZmVycy4KKyAgIEFzc3VtZSB5ZXMgdW50aWwgd2Uga25vdyB0aGUgbWVtb3J5IHNpemUuICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBsYW5jZV9uZWVkX2lzYV9ib3VuY2VfYnVmZmVycyA9IDE7CisKK3N0YXRpYyBpbnQgbGFuY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGxhbmNlX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbW9kZSk7CitzdGF0aWMgaW50IGxhbmNlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGxhbmNlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGxhbmNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgbGFuY2VfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmxhbmNlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGxhbmNlX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisMCisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpZiAoZGV2LT5kbWEgIT0gNCkKKwkJZnJlZV9kbWEoZGV2LT5kbWEpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBMQU5DRV9UT1RBTF9TSVpFKTsKKwlrZnJlZShscC0+dHhfYm91bmNlX2J1ZmZzKTsKKwlrZnJlZSgodm9pZCopbHAtPnJ4X2J1ZmZzKTsKKwlrZnJlZShscCk7Cit9CisKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUgTUFYX0NBUkRTCQk4CS8qIE1heCBudW1iZXIgb2YgaW50ZXJmYWNlcyAoY2FyZHMpIHBlciBtb2R1bGUgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfbGFuY2VbTUFYX0NBUkRTXTsKK3N0YXRpYyBpbnQgaW9bTUFYX0NBUkRTXTsKK3N0YXRpYyBpbnQgZG1hW01BWF9DQVJEU107CitzdGF0aWMgaW50IGlycVtNQVhfQ0FSRFNdOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZG1hLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShsYW5jZV9kZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJMQU5DRS9QQ25ldCBJL08gYmFzZSBhZGRyZXNzKGVzKSxyZXF1aXJlZCIpOworTU9EVUxFX1BBUk1fREVTQyhkbWEsICJMQU5DRS9QQ25ldCBJU0EgRE1BIGNoYW5uZWwgKGlnbm9yZWQgZm9yIHNvbWUgZGV2aWNlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiTEFOQ0UvUENuZXQgSVJRIG51bWJlciAoaWdub3JlZCBmb3Igc29tZSBkZXZpY2VzKSIpOworTU9EVUxFX1BBUk1fREVTQyhsYW5jZV9kZWJ1ZywgIkxBTkNFL1BDbmV0IGRlYnVnIGxldmVsICgwLTcpIik7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHRoaXNfZGV2LCBmb3VuZCA9IDA7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJaWYgKGlvW3RoaXNfZGV2XSA9PSAwKSAgeworCQkJaWYgKHRoaXNfZGV2ICE9IDApIC8qIG9ubHkgY29tcGxhaW4gb25jZSAqLworCQkJCWJyZWFrOworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJsYW5jZS5jOiBNb2R1bGUgYXV0b3Byb2Jpbmcgbm90IGFsbG93ZWQuIEFwcGVuZCBcImlvPTB4Tk5OXCIgdmFsdWUocykuXG4iKTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJZGV2ID0gYWxsb2NfZXRoZXJkZXYoMCk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CisJCWRldi0+ZG1hID0gZG1hW3RoaXNfZGV2XTsKKwkJaWYgKGRvX2xhbmNlX3Byb2JlKGRldikgPT0gMCkgeworCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCQlkZXZfbGFuY2VbZm91bmQrK10gPSBkZXY7CisJCQkJY29udGludWU7CisJCQl9CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJfQorCQlmcmVlX25ldGRldihkZXYpOworCQlicmVhazsKKwl9CisJaWYgKGZvdW5kICE9IDApCisJCXJldHVybiAwOworCXJldHVybiAtRU5YSU87Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXY7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9sYW5jZVt0aGlzX2Rldl07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CQorCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorfQorI2VuZGlmIC8qIE1PRFVMRSAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKy8qIFN0YXJ0aW5nIGluIHYyLjEuKiwgdGhlIExBTkNFL1BDbmV0IHByb2JlIGlzIG5vdyBzaW1pbGFyIHRvIHRoZSBvdGhlcgorICAgYm9hcmQgcHJvYmVzIG5vdyB0aGF0IGttYWxsb2MoKSBjYW4gYWxsb2NhdGUgSVNBIERNQS1hYmxlIHJlZ2lvbnMuCisgICBUaGlzIGFsc28gYWxsb3dzIHRoZSBMQU5DRSBkcml2ZXIgdG8gYmUgdXNlZCBhcyBhIG1vZHVsZS4KKyAgICovCitzdGF0aWMgaW50IF9faW5pdCBkb19sYW5jZV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCAqcG9ydCwgcmVzdWx0OworCisJaWYgKGhpZ2hfbWVtb3J5IDw9IHBoeXNfdG9fdmlydCgxNioxMDI0KjEwMjQpKQorCQlsYW5jZV9uZWVkX2lzYV9ib3VuY2VfYnVmZmVycyA9IDA7CisKKwlmb3IgKHBvcnQgPSBsYW5jZV9wb3J0bGlzdDsgKnBvcnQ7IHBvcnQrKykgeworCQlpbnQgaW9hZGRyID0gKnBvcnQ7CisJCXN0cnVjdCByZXNvdXJjZSAqciA9IHJlcXVlc3RfcmVnaW9uKGlvYWRkciwgTEFOQ0VfVE9UQUxfU0laRSwKKwkJCQkJCQkibGFuY2UtcHJvYmUiKTsKKworCQlpZiAocikgeworCQkJLyogRGV0ZWN0IHRoZSBjYXJkIHdpdGggbWluaW1hbCBJL08gcmVhZHMgKi8KKwkJCWNoYXIgb2Zmc2V0MTQgPSBpbmIoaW9hZGRyICsgMTQpOworCQkJaW50IGNhcmQ7CisJCQlmb3IgKGNhcmQgPSAwOyBjYXJkIDwgTlVNX0NBUkRTOyArK2NhcmQpCisJCQkJaWYgKGNhcmRzW2NhcmRdLmlkX29mZnNldDE0ID09IG9mZnNldDE0KQorCQkJCQlicmVhazsKKwkJCWlmIChjYXJkIDwgTlVNX0NBUkRTKSB7Lyp5ZXMsIHRoZSBmaXJzdCBieXRlIG1hdGNoZXMqLworCQkJCWNoYXIgb2Zmc2V0MTUgPSBpbmIoaW9hZGRyICsgMTUpOworCQkJCWZvciAoY2FyZCA9IDA7IGNhcmQgPCBOVU1fQ0FSRFM7ICsrY2FyZCkKKwkJCQkJaWYgKChjYXJkc1tjYXJkXS5pZF9vZmZzZXQxNCA9PSBvZmZzZXQxNCkgJiYKKwkJCQkJCShjYXJkc1tjYXJkXS5pZF9vZmZzZXQxNSA9PSBvZmZzZXQxNSkpCisJCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjYXJkIDwgTlVNX0NBUkRTKSB7IC8qU2lnbmF0dXJlIE9LKi8KKwkJCQlyZXN1bHQgPSBsYW5jZV9wcm9iZTEoZGV2LCBpb2FkZHIsIDAsIDApOworCQkJCWlmICghcmVzdWx0KSB7CisJCQkJCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwkJCQkJaW50IHZlciA9IGxwLT5jaGlwX3ZlcnNpb247CisKKwkJCQkJci0+bmFtZSA9IGNoaXBfdGFibGVbdmVyXS5uYW1lOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIExBTkNFX1RPVEFMX1NJWkUpOworCQl9CisJfQorCXJldHVybiAtRU5PREVWOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgbGFuY2VfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KDApOworCWludCBlcnI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCWVyciA9IGRvX2xhbmNlX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBsYW5jZV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkciwgaW50IGlycSwgaW50IG9wdGlvbnMpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwOworCWxvbmcgZG1hX2NoYW5uZWxzOwkJCS8qIE1hcmsgc3B1cmlvdXNseS1idXN5IERNQSBjaGFubmVscyAqLworCWludCBpLCByZXNldF92YWwsIGxhbmNlX3ZlcnNpb247CisJY29uc3QgY2hhciAqY2hpcG5hbWU7CisJLyogRmxhZ3MgZm9yIHNwZWNpZmljIGNoaXBzIG9yIGJvYXJkcy4gKi8KKwl1bnNpZ25lZCBjaGFyIGhwSjI0MDVBID0gMDsJCS8qIEhQIElTQSBhZGFwdG9yICovCisJaW50IGhwX2J1aWx0aW4gPSAwOwkJCS8qIEhQIG9uLWJvYXJkIGV0aGVybmV0LiAqLworCXN0YXRpYyBpbnQgZGlkX3ZlcnNpb247CQkJLyogQWxyZWFkeSBwcmludGVkIHZlcnNpb24gaW5mby4gKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIgPSAtRU5PTUVNOworCisJLyogRmlyc3Qgd2UgbG9vayBmb3Igc3BlY2lhbCBjYXNlcy4KKwkgICBDaGVjayBmb3IgSFAncyBvbi1ib2FyZCBldGhlcm5ldCBieSBsb29raW5nIGZvciAnSFAnIGluIHRoZSBCSU9TLgorCSAgIFRoZXJlIGFyZSB0d28gSFAgdmVyc2lvbnMsIGNoZWNrIHRoZSBCSU9TIGZvciB0aGUgY29uZmlndXJhdGlvbiBwb3J0LgorCSAgIFRoaXMgbWV0aG9kIHByb3ZpZGVkIGJ5IEwuIEp1bGxpYXJkLCBMYXVyZW50X0p1bGxpYXJkQGdyZW5vYmxlLmhwLmNvbS4KKwkgICAqLworCWlmIChpc2FfcmVhZHcoMHgwMDBmMDEwMikgPT0gMHg1MDQ4KSAgeworCQlzdGF0aWMgY29uc3Qgc2hvcnQgaW9hZGRyX3RhYmxlW10gPSB7IDB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MzYwfTsKKwkJaW50IGhwX3BvcnQgPSAoaXNhX3JlYWRsKDB4MDAwZjAwZjEpICYgMSkgID8gMHg0OTkgOiAweDk5OworCQkvKiBXZSBjYW4gaGF2ZSBib2FyZHMgb3RoZXIgdGhhbiB0aGUgYnVpbHQtaW4hICBWZXJpZnkgdGhpcyBpcyBvbi1ib2FyZC4gKi8KKwkJaWYgKChpbmIoaHBfcG9ydCkgJiAweGMwKSA9PSAweDgwCisJCQkmJiBpb2FkZHJfdGFibGVbaW5iKGhwX3BvcnQpICYgM10gPT0gaW9hZGRyKQorCQkJaHBfYnVpbHRpbiA9IGhwX3BvcnQ7CisJfQorCS8qIFdlIGFsc28gcmVjb2duaXplIHRoZSBIUCBWZWN0cmEgb24tYm9hcmQgaGVyZSwgYnV0IGNoZWNrIGJlbG93LiAqLworCWhwSjI0MDVBID0gKGluYihpb2FkZHIpID09IDB4MDggJiYgaW5iKGlvYWRkcisxKSA9PSAweDAwCisJCQkJJiYgaW5iKGlvYWRkcisyKSA9PSAweDA5KTsKKworCS8qIFJlc2V0IHRoZSBMQU5DRS4JICovCisJcmVzZXRfdmFsID0gaW53KGlvYWRkcitMQU5DRV9SRVNFVCk7IC8qIFJlc2V0IHRoZSBMQU5DRSAqLworCisJLyogVGhlIFVuLVJlc2V0IG5lZWRlZCBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlIHJlYWwgTkUyMTAwLCBhbmQgd2lsbAorCSAgIGNvbmZ1c2UgdGhlIEhQIGJvYXJkLiAqLworCWlmICghaHBKMjQwNUEpCisJCW91dHcocmVzZXRfdmFsLCBpb2FkZHIrTEFOQ0VfUkVTRVQpOworCisJb3V0dygweDAwMDAsIGlvYWRkcitMQU5DRV9BRERSKTsgLyogU3dpdGNoIHRvIHdpbmRvdyAwICovCisJaWYgKGludyhpb2FkZHIrTEFOQ0VfREFUQSkgIT0gMHgwMDA0KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgY2hpcC4gKi8KKwlvdXR3KDg4LCBpb2FkZHIrTEFOQ0VfQUREUik7CisJaWYgKGludyhpb2FkZHIrTEFOQ0VfQUREUikgIT0gODgpIHsKKwkJbGFuY2VfdmVyc2lvbiA9IDA7CisJfSBlbHNlIHsJCQkvKiBHb29kLCBpdCdzIGEgbmV3ZXIgY2hpcC4gKi8KKwkJaW50IGNoaXBfdmVyc2lvbiA9IGludyhpb2FkZHIrTEFOQ0VfREFUQSk7CisJCW91dHcoODksIGlvYWRkcitMQU5DRV9BRERSKTsKKwkJY2hpcF92ZXJzaW9uIHw9IGludyhpb2FkZHIrTEFOQ0VfREFUQSkgPDwgMTY7CisJCWlmIChsYW5jZV9kZWJ1ZyA+IDIpCisJCQlwcmludGsoIiAgTEFOQ0UgY2hpcCB2ZXJzaW9uIGlzICUjeC5cbiIsIGNoaXBfdmVyc2lvbik7CisJCWlmICgoY2hpcF92ZXJzaW9uICYgMHhmZmYpICE9IDB4MDAzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWNoaXBfdmVyc2lvbiA9IChjaGlwX3ZlcnNpb24gPj4gMTIpICYgMHhmZmZmOworCQlmb3IgKGxhbmNlX3ZlcnNpb24gPSAxOyBjaGlwX3RhYmxlW2xhbmNlX3ZlcnNpb25dLmlkX251bWJlcjsgbGFuY2VfdmVyc2lvbisrKSB7CisJCQlpZiAoY2hpcF90YWJsZVtsYW5jZV92ZXJzaW9uXS5pZF9udW1iZXIgPT0gY2hpcF92ZXJzaW9uKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJLyogV2UgY2FuJ3QgYWxsb2NhdGUgZGV2LT5wcml2IGZyb20gYWxsb2NfZXRoZXJkZXYoKSBiZWNhdXNlIGl0IG11c3QKKwkgICBhIElTQSBETUEtYWJsZSByZWdpb24uICovCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWNoaXBuYW1lID0gY2hpcF90YWJsZVtsYW5jZV92ZXJzaW9uXS5uYW1lOworCXByaW50aygiJXM6ICVzIGF0ICUjM3gsIiwgZGV2LT5uYW1lLCBjaGlwbmFtZSwgaW9hZGRyKTsKKworCS8qIFRoZXJlIGlzIGEgMTYgYnl0ZSBzdGF0aW9uIGFkZHJlc3MgUFJPTSBhdCB0aGUgYmFzZSBhZGRyZXNzLgorCSAgIFRoZSBmaXJzdCBzaXggYnl0ZXMgYXJlIHRoZSBzdGF0aW9uIGFkZHJlc3MuICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMngiLCBkZXYtPmRldl9hZGRyW2ldID0gaW5iKGlvYWRkciArIGkpKTsKKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCS8qIE1ha2UgY2VydGFpbiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIExBTkNFIGFyZSBhbGlnbmVkIGFuZCBETUFibGUuICovCisJCQorCWxwID0ga21hbGxvYyhzaXplb2YoKmxwKSwgR0ZQX0RNQSB8IEdGUF9LRVJORUwpOworCWlmKGxwPT1OVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAobGFuY2VfZGVidWcgPiA2KSBwcmludGsoIiAoIzB4JTA1bHgpIiwgKHVuc2lnbmVkIGxvbmcpbHApOworCW1lbXNldChscCwgMCwgc2l6ZW9mKCpscCkpOworCWRldi0+cHJpdiA9IGxwOworCWxwLT5uYW1lID0gY2hpcG5hbWU7CisJbHAtPnJ4X2J1ZmZzID0gKHVuc2lnbmVkIGxvbmcpa21hbGxvYyhQS1RfQlVGX1NaKlJYX1JJTkdfU0laRSwKKwkJCQkJCSAgR0ZQX0RNQSB8IEdGUF9LRVJORUwpOworCWlmICghbHAtPnJ4X2J1ZmZzKQorCQlnb3RvIG91dF9scDsKKwlpZiAobGFuY2VfbmVlZF9pc2FfYm91bmNlX2J1ZmZlcnMpIHsKKwkJbHAtPnR4X2JvdW5jZV9idWZmcyA9IGttYWxsb2MoUEtUX0JVRl9TWipUWF9SSU5HX1NJWkUsCisJCQkJCQkgIEdGUF9ETUEgfCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFscC0+dHhfYm91bmNlX2J1ZmZzKQorCQkJZ290byBvdXRfcng7CisJfSBlbHNlCisJCWxwLT50eF9ib3VuY2VfYnVmZnMgPSBOVUxMOworCisJbHAtPmNoaXBfdmVyc2lvbiA9IGxhbmNlX3ZlcnNpb247CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5kZXZsb2NrKTsKKworCWxwLT5pbml0X2Jsb2NrLm1vZGUgPSAweDAwMDM7CQkvKiBEaXNhYmxlIFJ4IGFuZCBUeC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlscC0+aW5pdF9ibG9jay5waHlzX2FkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworCWxwLT5pbml0X2Jsb2NrLmZpbHRlclswXSA9IDB4MDAwMDAwMDA7CisJbHAtPmluaXRfYmxvY2suZmlsdGVyWzFdID0gMHgwMDAwMDAwMDsKKwlscC0+aW5pdF9ibG9jay5yeF9yaW5nID0gKCh1MzIpaXNhX3ZpcnRfdG9fYnVzKGxwLT5yeF9yaW5nKSAmIDB4ZmZmZmZmKSB8IFJYX1JJTkdfTEVOX0JJVFM7CisJbHAtPmluaXRfYmxvY2sudHhfcmluZyA9ICgodTMyKWlzYV92aXJ0X3RvX2J1cyhscC0+dHhfcmluZykgJiAweGZmZmZmZikgfCBUWF9SSU5HX0xFTl9CSVRTOworCisJb3V0dygweDAwMDEsIGlvYWRkcitMQU5DRV9BRERSKTsKKwlpbncoaW9hZGRyK0xBTkNFX0FERFIpOworCW91dHcoKHNob3J0KSAodTMyKSBpc2FfdmlydF90b19idXMoJmxwLT5pbml0X2Jsb2NrKSwgaW9hZGRyK0xBTkNFX0RBVEEpOworCW91dHcoMHgwMDAyLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJaW53KGlvYWRkcitMQU5DRV9BRERSKTsKKwlvdXR3KCgodTMyKWlzYV92aXJ0X3RvX2J1cygmbHAtPmluaXRfYmxvY2spKSA+PiAxNiwgaW9hZGRyK0xBTkNFX0RBVEEpOworCW91dHcoMHgwMDAwLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJaW53KGlvYWRkcitMQU5DRV9BRERSKTsKKworCWlmIChpcnEpIHsJCQkJCS8qIFNldCBpZmYgUENJIGNhcmQuICovCisJCWRldi0+ZG1hID0gNDsJCQkvKiBOYXRpdmUgYnVzLW1hc3Rlciwgbm8gRE1BIGNoYW5uZWwgbmVlZGVkLiAqLworCQlkZXYtPmlycSA9IGlycTsKKwl9IGVsc2UgaWYgKGhwX2J1aWx0aW4pIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgZG1hX3RibFs0XSA9IHszLCA1LCA2LCAwfTsKKwkJc3RhdGljIGNvbnN0IGNoYXIgaXJxX3RibFs0XSA9IHszLCA0LCA1LCA5fTsKKwkJdW5zaWduZWQgY2hhciBwb3J0X3ZhbCA9IGluYihocF9idWlsdGluKTsKKwkJZGV2LT5kbWEgPSBkbWFfdGJsWyhwb3J0X3ZhbCA+PiA0KSAmIDNdOworCQlkZXYtPmlycSA9IGlycV90YmxbKHBvcnRfdmFsID4+IDIpICYgM107CisJCXByaW50aygiIEhQIFZlY3RyYSBJUlEgJWQgRE1BICVkLlxuIiwgZGV2LT5pcnEsIGRldi0+ZG1hKTsKKwl9IGVsc2UgaWYgKGhwSjI0MDVBKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyIGRtYV90YmxbNF0gPSB7MywgNSwgNiwgN307CisJCXN0YXRpYyBjb25zdCBjaGFyIGlycV90YmxbOF0gPSB7MywgNCwgNSwgOSwgMTAsIDExLCAxMiwgMTV9OworCQlzaG9ydCByZXNldF92YWwgPSBpbncoaW9hZGRyK0xBTkNFX1JFU0VUKTsKKwkJZGV2LT5kbWEgPSBkbWFfdGJsWyhyZXNldF92YWwgPj4gMikgJiAzXTsKKwkJZGV2LT5pcnEgPSBpcnFfdGJsWyhyZXNldF92YWwgPj4gNCkgJiA3XTsKKwkJcHJpbnRrKCIgSFAgSjI0MDVBIElSUSAlZCBETUEgJWQuXG4iLCBkZXYtPmlycSwgZGV2LT5kbWEpOworCX0gZWxzZSBpZiAobGFuY2VfdmVyc2lvbiA9PSBQQ05FVF9JU0FQKSB7CQkvKiBUaGUgcGx1Zy1uLXBsYXkgdmVyc2lvbi4gKi8KKwkJc2hvcnQgYnVzX2luZm87CisJCW91dHcoOCwgaW9hZGRyK0xBTkNFX0FERFIpOworCQlidXNfaW5mbyA9IGludyhpb2FkZHIrTEFOQ0VfQlVTX0lGKTsKKwkJZGV2LT5kbWEgPSBidXNfaW5mbyAmIDB4MDc7CisJCWRldi0+aXJxID0gKGJ1c19pbmZvID4+IDQpICYgMHgwRjsKKwl9IGVsc2UgeworCQkvKiBUaGUgRE1BIGNoYW5uZWwgbWF5IGJlIHBhc3NlZCBpbiBQQVJBTTEuICovCisJCWlmIChkZXYtPm1lbV9zdGFydCAmIDB4MDcpCisJCQlkZXYtPmRtYSA9IGRldi0+bWVtX3N0YXJ0ICYgMHgwNzsKKwl9CisKKwlpZiAoZGV2LT5kbWEgPT0gMCkgeworCQkvKiBSZWFkIHRoZSBETUEgY2hhbm5lbCBzdGF0dXMgcmVnaXN0ZXIsIHNvIHRoYXQgd2UgY2FuIGF2b2lkCisJCSAgIHN0dWNrIERNQSBjaGFubmVscyBpbiB0aGUgRE1BIGRldGVjdGlvbiBiZWxvdy4gKi8KKwkJZG1hX2NoYW5uZWxzID0gKChpbmIoRE1BMV9TVEFUX1JFRykgPj4gNCkgJiAweDBmKSB8CisJCQkoaW5iKERNQTJfU1RBVF9SRUcpICYgMHhmMCk7CisJfQorCWVyciA9IC1FTk9ERVY7CisJaWYgKGRldi0+aXJxID49IDIpCisJCXByaW50aygiIGFzc2lnbmVkIElSUSAlZCIsIGRldi0+aXJxKTsKKwllbHNlIGlmIChsYW5jZV92ZXJzaW9uICE9IDApICB7CS8qIDc5OTAgYm9hcmRzIG5lZWQgRE1BIGRldGVjdGlvbiBmaXJzdC4gKi8KKwkJdW5zaWduZWQgbG9uZyBpcnFfbWFzazsKKworCQkvKiBUbyBhdXRvLUlSUSB3ZSBlbmFibGUgdGhlIGluaXRpYWxpemF0aW9uLWRvbmUgYW5kIERNQSBlcnJvcgorCQkgICBpbnRlcnJ1cHRzLiBGb3IgSVNBIGJvYXJkcyB3ZSBnZXQgYSBETUEgZXJyb3IsIGJ1dCBWTEIgYW5kIFBDSQorCQkgICBib2FyZHMgd2lsbCB3b3JrLiAqLworCQlpcnFfbWFzayA9IHByb2JlX2lycV9vbigpOworCisJCS8qIFRyaWdnZXIgYW4gaW5pdGlhbGl6YXRpb24ganVzdCBmb3IgdGhlIGludGVycnVwdC4gKi8KKwkJb3V0dygweDAwNDEsIGlvYWRkcitMQU5DRV9EQVRBKTsKKworCQltZGVsYXkoMjApOworCQlkZXYtPmlycSA9IHByb2JlX2lycV9vZmYoaXJxX21hc2spOworCQlpZiAoZGV2LT5pcnEpCisJCQlwcmludGsoIiwgcHJvYmVkIElSUSAlZCIsIGRldi0+aXJxKTsKKwkJZWxzZSB7CisJCQlwcmludGsoIiwgZmFpbGVkIHRvIGRldGVjdCBJUlEgbGluZS5cbiIpOworCQkJZ290byBvdXRfdHg7CisJCX0KKworCQkvKiBDaGVjayBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGRvbmUgYml0LCAweDAxMDAsIHdoaWNoIG1lYW5zCisJCSAgIHRoYXQgd2UgZG9uJ3QgbmVlZCBhIERNQSBjaGFubmVsLiAqLworCQlpZiAoaW53KGlvYWRkcitMQU5DRV9EQVRBKSAmIDB4MDEwMCkKKwkJCWRldi0+ZG1hID0gNDsKKwl9CisKKwlpZiAoZGV2LT5kbWEgPT0gNCkgeworCQlwcmludGsoIiwgbm8gRE1BIG5lZWRlZC5cbiIpOworCX0gZWxzZSBpZiAoZGV2LT5kbWEpIHsKKwkJaWYgKHJlcXVlc3RfZG1hKGRldi0+ZG1hLCBjaGlwbmFtZSkpIHsKKwkJCXByaW50aygiRE1BICVkIGFsbG9jYXRpb24gZmFpbGVkLlxuIiwgZGV2LT5kbWEpOworCQkJZ290byBvdXRfdHg7CisJCX0gZWxzZQorCQkJcHJpbnRrKCIsIGFzc2lnbmVkIERNQSAlZC5cbiIsIGRldi0+ZG1hKTsKKwl9IGVsc2UgewkJCS8qIE9LLCB3ZSBoYXZlIHRvIGF1dG8tRE1BLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQlzdGF0aWMgY29uc3QgY2hhciBkbWFzW10gPSB7IDUsIDYsIDcsIDMgfTsKKwkJCWludCBkbWEgPSBkbWFzW2ldOworCQkJaW50IGJvZ3VzY250OworCisJCQkvKiBEb24ndCBlbmFibGUgYSBwZXJtYW5lbnRseSBidXN5IERNQSBjaGFubmVsLCBvciB0aGUgbWFjaGluZQorCQkJICAgd2lsbCBoYW5nLiAqLworCQkJaWYgKHRlc3RfYml0KGRtYSwgJmRtYV9jaGFubmVscykpCisJCQkJY29udGludWU7CisJCQlvdXR3KDB4N2YwNCwgaW9hZGRyK0xBTkNFX0RBVEEpOyAvKiBDbGVhciB0aGUgbWVtb3J5IGVycm9yIGJpdHMuICovCisJCQlpZiAocmVxdWVzdF9kbWEoZG1hLCBjaGlwbmFtZSkpCisJCQkJY29udGludWU7CisJCQkJCisJCQlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCQkJc2V0X2RtYV9tb2RlKGRtYSwgRE1BX01PREVfQ0FTQ0FERSk7CisJCQllbmFibGVfZG1hKGRtYSk7CisJCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKworCQkJLyogVHJpZ2dlciBhbiBpbml0aWFsaXphdGlvbi4gKi8KKwkJCW91dHcoMHgwMDAxLCBpb2FkZHIrTEFOQ0VfREFUQSk7CisJCQlmb3IgKGJvZ3VzY250ID0gMTAwOyBib2d1c2NudCA+IDA7IC0tYm9ndXNjbnQpCisJCQkJaWYgKGludyhpb2FkZHIrTEFOQ0VfREFUQSkgJiAweDA5MDApCisJCQkJCWJyZWFrOworCQkJaWYgKGludyhpb2FkZHIrTEFOQ0VfREFUQSkgJiAweDAxMDApIHsKKwkJCQlkZXYtPmRtYSA9IGRtYTsKKwkJCQlwcmludGsoIiwgRE1BICVkLlxuIiwgZGV2LT5kbWEpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCQkJCWRpc2FibGVfZG1hKGRtYSk7CisJCQkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCQkJZnJlZV9kbWEoZG1hKTsKKwkJCX0KKwkJfQorCQlpZiAoaSA9PSA0KSB7CQkJLyogRmFpbHVyZTogYmFpbC4gKi8KKwkJCXByaW50aygiRE1BIGRldGVjdGlvbiBmYWlsZWQuXG4iKTsKKwkJCWdvdG8gb3V0X3R4OworCQl9CisJfQorCisJaWYgKGxhbmNlX3ZlcnNpb24gPT0gMCAmJiBkZXYtPmlycSA9PSAwKSB7CisJCS8qIFdlIG1heSBhdXRvLUlSUSBub3cgdGhhdCB3ZSBoYXZlIGEgRE1BIGNoYW5uZWwuICovCisJCS8qIFRyaWdnZXIgYW4gaW5pdGlhbGl6YXRpb24ganVzdCBmb3IgdGhlIGludGVycnVwdC4gKi8KKwkJdW5zaWduZWQgbG9uZyBpcnFfbWFzazsKKworCQlpcnFfbWFzayA9IHByb2JlX2lycV9vbigpOworCQlvdXR3KDB4MDA0MSwgaW9hZGRyK0xBTkNFX0RBVEEpOworCisJCW1kZWxheSg0MCk7CisJCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZihpcnFfbWFzayk7CisJCWlmIChkZXYtPmlycSA9PSAwKSB7CisJCQlwcmludGsoIiAgRmFpbGVkIHRvIGRldGVjdCB0aGUgNzk5MCBJUlEgbGluZS5cbiIpOworCQkJZ290byBvdXRfZG1hOworCQl9CisJCXByaW50aygiICBBdXRvLUlSUSBkZXRlY3RlZCBJUlElZC5cbiIsIGRldi0+aXJxKTsKKwl9CisKKwlpZiAoY2hpcF90YWJsZVtscC0+Y2hpcF92ZXJzaW9uXS5mbGFncyAmIExBTkNFX0VOQUJMRV9BVVRPU0VMRUNUKSB7CisJCS8qIFR1cm4gb24gYXV0by1zZWxlY3Qgb2YgbWVkaWEgKDEwYmFzZVQgb3IgQk5DKSBzbyB0aGF0IHRoZSB1c2VyCisJCSAgIGNhbiB3YXRjaCB0aGUgTEVEcyBldmVuIGlmIHRoZSBib2FyZCBpc24ndCBvcGVuZWQuICovCisJCW91dHcoMHgwMDAyLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJCS8qIERvbid0IHRvdWNoIDEwYmFzZTIgcG93ZXIgYml0LiAqLworCQlvdXR3KGludyhpb2FkZHIrTEFOQ0VfQlVTX0lGKSB8IDB4MDAwMiwgaW9hZGRyK0xBTkNFX0JVU19JRik7CisJfQorCisJaWYgKGxhbmNlX2RlYnVnID4gMCAgJiYgIGRpZF92ZXJzaW9uKysgPT0gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJLyogVGhlIExBTkNFLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuID0gbGFuY2Vfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGxhbmNlX3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gbGFuY2VfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSBsYW5jZV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT50eF90aW1lb3V0ID0gbGFuY2VfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKworCXJldHVybiAwOworb3V0X2RtYToKKwlpZiAoZGV2LT5kbWEgIT0gNCkKKwkJZnJlZV9kbWEoZGV2LT5kbWEpOworb3V0X3R4OgorCWtmcmVlKGxwLT50eF9ib3VuY2VfYnVmZnMpOworb3V0X3J4OgorCWtmcmVlKCh2b2lkKilscC0+cnhfYnVmZnMpOworb3V0X2xwOgorCWtmcmVlKGxwKTsKKwlyZXR1cm4gZXJyOworfQorCisMCitzdGF0aWMgaW50CitsYW5jZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaTsKKworCWlmIChkZXYtPmlycSA9PSAwIHx8CisJCXJlcXVlc3RfaXJxKGRldi0+aXJxLCAmbGFuY2VfaW50ZXJydXB0LCAwLCBscC0+bmFtZSwgZGV2KSkgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBXZSB1c2VkIHRvIGFsbG9jYXRlIERNQSBoZXJlLCBidXQgdGhhdCB3YXMgc2lsbHkuCisJICAgRE1BIGxpbmVzIGNhbid0IGJlIHNoYXJlZCEgIFdlIG5vdyBwZXJtYW5lbnRseSBhbGxvY2F0ZSB0aGVtLiAqLworCisJLyogUmVzZXQgdGhlIExBTkNFICovCisJaW53KGlvYWRkcitMQU5DRV9SRVNFVCk7CisKKwkvKiBUaGUgRE1BIGNvbnRyb2xsZXIgaXMgdXNlZCBhcyBhIG5vLW9wZXJhdGlvbiBzbGF2ZSwgImNhc2NhZGUgbW9kZSIuICovCisJaWYgKGRldi0+ZG1hICE9IDQpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCQllbmFibGVfZG1hKGRldi0+ZG1hKTsKKwkJc2V0X2RtYV9tb2RlKGRldi0+ZG1hLCBETUFfTU9ERV9DQVNDQURFKTsKKwkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJfQorCisJLyogVW4tUmVzZXQgdGhlIExBTkNFLCBuZWVkZWQgb25seSBmb3IgdGhlIE5FMjEwMC4gKi8KKwlpZiAoY2hpcF90YWJsZVtscC0+Y2hpcF92ZXJzaW9uXS5mbGFncyAmIExBTkNFX01VU1RfVU5SRVNFVCkKKwkJb3V0dygwLCBpb2FkZHIrTEFOQ0VfUkVTRVQpOworCisJaWYgKGNoaXBfdGFibGVbbHAtPmNoaXBfdmVyc2lvbl0uZmxhZ3MgJiBMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVCkgeworCQkvKiBUaGlzIGlzIDc5Qzk2MC1zcGVjaWZpYzogVHVybiBvbiBhdXRvLXNlbGVjdCBvZiBtZWRpYSAoQVVJLCBCTkMpLiAqLworCQlvdXR3KDB4MDAwMiwgaW9hZGRyK0xBTkNFX0FERFIpOworCQkvKiBPbmx5IHRvdWNoIGF1dG9zZWxlY3QgYml0LiAqLworCQlvdXR3KGludyhpb2FkZHIrTEFOQ0VfQlVTX0lGKSB8IDB4MDAwMiwgaW9hZGRyK0xBTkNFX0JVU19JRik7CisgCX0KKworCWlmIChsYW5jZV9kZWJ1ZyA+IDEpCisJCXByaW50aygiJXM6IGxhbmNlX29wZW4oKSBpcnEgJWQgZG1hICVkIHR4L3J4IHJpbmdzICUjeC8lI3ggaW5pdCAlI3guXG4iLAorCQkJICAgZGV2LT5uYW1lLCBkZXYtPmlycSwgZGV2LT5kbWEsCisJCSAgICAgICAgICAgKHUzMikgaXNhX3ZpcnRfdG9fYnVzKGxwLT50eF9yaW5nKSwKKwkJICAgICAgICAgICAodTMyKSBpc2FfdmlydF90b19idXMobHAtPnJ4X3JpbmcpLAorCQkJICAgKHUzMikgaXNhX3ZpcnRfdG9fYnVzKCZscC0+aW5pdF9ibG9jaykpOworCisJbGFuY2VfaW5pdF9yaW5nKGRldiwgR0ZQX0tFUk5FTCk7CisJLyogUmUtaW5pdGlhbGl6ZSB0aGUgTEFOQ0UsIGFuZCBzdGFydCBpdCB3aGVuIGRvbmUuICovCisJb3V0dygweDAwMDEsIGlvYWRkcitMQU5DRV9BRERSKTsKKwlvdXR3KChzaG9ydCkgKHUzMikgaXNhX3ZpcnRfdG9fYnVzKCZscC0+aW5pdF9ibG9jayksIGlvYWRkcitMQU5DRV9EQVRBKTsKKwlvdXR3KDB4MDAwMiwgaW9hZGRyK0xBTkNFX0FERFIpOworCW91dHcoKCh1MzIpaXNhX3ZpcnRfdG9fYnVzKCZscC0+aW5pdF9ibG9jaykpID4+IDE2LCBpb2FkZHIrTEFOQ0VfREFUQSk7CisKKwlvdXR3KDB4MDAwNCwgaW9hZGRyK0xBTkNFX0FERFIpOworCW91dHcoMHgwOTE1LCBpb2FkZHIrTEFOQ0VfREFUQSk7CisKKwlvdXR3KDB4MDAwMCwgaW9hZGRyK0xBTkNFX0FERFIpOworCW91dHcoMHgwMDAxLCBpb2FkZHIrTEFOQ0VfREFUQSk7CisKKwluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKworCWkgPSAwOworCXdoaWxlIChpKysgPCAxMDApCisJCWlmIChpbncoaW9hZGRyK0xBTkNFX0RBVEEpICYgMHgwMTAwKQorCQkJYnJlYWs7CisJLyogCisJICogV2UgdXNlZCB0byBjbGVhciB0aGUgSW5pdERvbmUgYml0LCAweDAxMDAsIGhlcmUgYnV0IE1hcmsgU3RvY2t0b24KKwkgKiByZXBvcnRzIHRoYXQgZG9pbmcgc28gdHJpZ2dlcnMgYSBidWcgaW4gdGhlICc5NzQuCisJICovCisgCW91dHcoMHgwMDQyLCBpb2FkZHIrTEFOQ0VfREFUQSk7CisKKwlpZiAobGFuY2VfZGVidWcgPiAyKQorCQlwcmludGsoIiVzOiBMQU5DRSBvcGVuIGFmdGVyICVkIHRpY2tzLCBpbml0IGJsb2NrICUjeCBjc3IwICU0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaSwgKHUzMikgaXNhX3ZpcnRfdG9fYnVzKCZscC0+aW5pdF9ibG9jayksIGludyhpb2FkZHIrTEFOQ0VfREFUQSkpOworCisJcmV0dXJuIDA7CQkJCQkvKiBBbHdheXMgc3VjY2VlZCAqLworfQorCisvKiBUaGUgTEFOQ0UgaGFzIGJlZW4gaGFsdGVkIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIgKGJ1c21hc3RlciBtZW1vcnkKKyAgIGFyYml0cmF0aW9uIGVycm9yLCBUeCBGSUZPIHVuZGVyZmxvdywgZHJpdmVyIHN0b3BwZWQgaXQgdG8gcmVjb25maWd1cmUsCisgICBldGMuKS4gIE1vZGVybiBMQU5DRSB2YXJpYW50cyBhbHdheXMgcmVsb2FkIHRoZWlyIHJpbmctYnVmZmVyCisgICBjb25maWd1cmF0aW9uIHdoZW4gcmVzdGFydGVkLCBzbyB3ZSBtdXN0IHJlaW5pdGlhbGl6ZSBvdXIgcmluZworICAgY29udGV4dCBiZWZvcmUgcmVzdGFydGluZy4gIEFzIHBhcnQgb2YgdGhpcyByZWluaXRpYWxpemF0aW9uLAorICAgZmluZCBhbGwgcGFja2V0cyBzdGlsbCBvbiB0aGUgVHggcmluZyBhbmQgcHJldGVuZCB0aGF0IHRoZXkgaGFkIGJlZW4KKyAgIHNlbnQgKGluIGVmZmVjdCwgZHJvcCB0aGUgcGFja2V0cyBvbiB0aGUgZmxvb3IpIC0gdGhlIGhpZ2hlci1sZXZlbAorICAgcHJvdG9jb2xzIHdpbGwgdGltZSBvdXQgYW5kIHJldHJhbnNtaXQuICBJdCdkIGJlIGJldHRlciB0byBzaHVmZmxlCisgICB0aGVzZSBza2JzIHRvIGEgdGVtcCBsaXN0IGFuZCB0aGVuIGFjdHVhbGx5IHJlLVR4IHRoZW0gYWZ0ZXIKKyAgIHJlc3RhcnRpbmcgdGhlIGNoaXAsIGJ1dCBJJ20gdG9vIGxhenkgdG8gZG8gc28gcmlnaHQgbm93LiAgZHBsYXR0QDNkby5jb20KKyovCisKK3N0YXRpYyB2b2lkIAorbGFuY2VfcHVyZ2VfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCS8qIEZyZWUgYWxsIHRoZSBza2J1ZmZzIGluIHRoZSBSeCBhbmQgVHggcXVldWVzLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbHAtPnJ4X3NrYnVmZltpXTsKKwkJbHAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJCWxwLT5yeF9yaW5nW2ldLmJhc2UgPSAwOwkJLyogTm90IG93bmVkIGJ5IExBTkNFIGNoaXAuICovCisJCWlmIChza2IpCisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKGxwLT50eF9za2J1ZmZbaV0pIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KGxwLT50eF9za2J1ZmZbaV0pOworCQkJbHAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCX0KKwl9Cit9CisKKworLyogSW5pdGlhbGl6ZSB0aGUgTEFOQ0UgUnggYW5kIFR4IHJpbmdzLiAqLworc3RhdGljIHZvaWQKK2xhbmNlX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZ2ZwKQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCWxwLT5jdXJfcnggPSBscC0+Y3VyX3R4ID0gMDsKKwlscC0+ZGlydHlfcnggPSBscC0+ZGlydHlfdHggPSAwOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXZvaWQgKnJ4X2J1ZmY7CisKKwkJc2tiID0gYWxsb2Nfc2tiKFBLVF9CVUZfU1osIEdGUF9ETUEgfCBnZnApOworCQlscC0+cnhfc2tidWZmW2ldID0gc2tiOworCQlpZiAoc2tiKSB7CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXJ4X2J1ZmYgPSBza2ItPnRhaWw7CisJCX0gZWxzZQorCQkJcnhfYnVmZiA9IGttYWxsb2MoUEtUX0JVRl9TWiwgR0ZQX0RNQSB8IGdmcCk7CisJCWlmIChyeF9idWZmID09IE5VTEwpCisJCQlscC0+cnhfcmluZ1tpXS5iYXNlID0gMDsKKwkJZWxzZQorCQkJbHAtPnJ4X3JpbmdbaV0uYmFzZSA9ICh1MzIpaXNhX3ZpcnRfdG9fYnVzKHJ4X2J1ZmYpIHwgMHg4MDAwMDAwMDsKKwkJbHAtPnJ4X3JpbmdbaV0uYnVmX2xlbmd0aCA9IC1QS1RfQlVGX1NaOworCX0KKwkvKiBUaGUgVHggYnVmZmVyIGFkZHJlc3MgaXMgZmlsbGVkIGluIGFzIG5lZWRlZCwgYnV0IHdlIGRvIG5lZWQgdG8gY2xlYXIKKwkgICB0aGUgdXBwZXIgb3duZXJzaGlwIGJpdC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJbHAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCWxwLT50eF9yaW5nW2ldLmJhc2UgPSAwOworCX0KKworCWxwLT5pbml0X2Jsb2NrLm1vZGUgPSAweDAwMDA7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJbHAtPmluaXRfYmxvY2sucGh5c19hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKwlscC0+aW5pdF9ibG9jay5maWx0ZXJbMF0gPSAweDAwMDAwMDAwOworCWxwLT5pbml0X2Jsb2NrLmZpbHRlclsxXSA9IDB4MDAwMDAwMDA7CisJbHAtPmluaXRfYmxvY2sucnhfcmluZyA9ICgodTMyKWlzYV92aXJ0X3RvX2J1cyhscC0+cnhfcmluZykgJiAweGZmZmZmZikgfCBSWF9SSU5HX0xFTl9CSVRTOworCWxwLT5pbml0X2Jsb2NrLnR4X3JpbmcgPSAoKHUzMilpc2FfdmlydF90b19idXMobHAtPnR4X3JpbmcpICYgMHhmZmZmZmYpIHwgVFhfUklOR19MRU5fQklUUzsKK30KKworc3RhdGljIHZvaWQKK2xhbmNlX3Jlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNzcjBfYml0cywgaW50IG11c3RfcmVpbml0KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKworCWlmIChtdXN0X3JlaW5pdCB8fAorCQkoY2hpcF90YWJsZVtscC0+Y2hpcF92ZXJzaW9uXS5mbGFncyAmIExBTkNFX01VU1RfUkVJTklUX1JJTkcpKSB7CisJCWxhbmNlX3B1cmdlX3JpbmcoZGV2KTsKKwkJbGFuY2VfaW5pdF9yaW5nKGRldiwgR0ZQX0FUT01JQyk7CisJfQorCW91dHcoMHgwMDAwLCAgICBkZXYtPmJhc2VfYWRkciArIExBTkNFX0FERFIpOworCW91dHcoY3NyMF9iaXRzLCBkZXYtPmJhc2VfYWRkciArIExBTkNFX0RBVEEpOworfQorCisKK3N0YXRpYyB2b2lkIGxhbmNlX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopIGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlvdXR3ICgwLCBpb2FkZHIgKyBMQU5DRV9BRERSKTsKKwlwcmludGsgKCIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTQuNHgsIHJlc2V0dGluZy5cbiIsCisJCWRldi0+bmFtZSwgaW53IChpb2FkZHIgKyBMQU5DRV9EQVRBKSk7CisJb3V0dyAoMHgwMDA0LCBpb2FkZHIgKyBMQU5DRV9EQVRBKTsKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwlpZiAobGFuY2VfZGVidWcgPiAzKSB7CisJCWludCBpOworCQlwcmludGsgKCIgUmluZyBkYXRhIGR1bXA6IGRpcnR5X3R4ICVkIGN1cl90eCAlZCVzIGN1cl9yeCAlZC4iLAorCQkgIGxwLT5kaXJ0eV90eCwgbHAtPmN1cl90eCwgbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpID8gIiAoZnVsbCkiIDogIiIsCisJCQlscC0+Y3VyX3J4KTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrICgiJXMgJTA4eCAlMDR4ICUwNHgiLCBpICYgMHgzID8gIiIgOiAiXG4gIiwKKwkJCSBscC0+cnhfcmluZ1tpXS5iYXNlLCAtbHAtPnJ4X3JpbmdbaV0uYnVmX2xlbmd0aCwKKwkJCQlscC0+cnhfcmluZ1tpXS5tc2dfbGVuZ3RoKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrICgiJXMgJTA4eCAlMDR4ICUwNHgiLCBpICYgMHgzID8gIiIgOiAiXG4gIiwKKwkJCSAgICAgbHAtPnR4X3JpbmdbaV0uYmFzZSwgLWxwLT50eF9yaW5nW2ldLmxlbmd0aCwKKwkJCQlscC0+dHhfcmluZ1tpXS5taXNjKTsKKwkJcHJpbnRrICgiXG4iKTsKKwl9CisjZW5kaWYKKwlsYW5jZV9yZXN0YXJ0IChkZXYsIDB4MDA0MywgMSk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworfQorCisKK3N0YXRpYyBpbnQgbGFuY2Vfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGVudHJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmRldmxvY2ssIGZsYWdzKTsKKworCWlmIChsYW5jZV9kZWJ1ZyA+IDMpIHsKKwkJb3V0dygweDAwMDAsIGlvYWRkcitMQU5DRV9BRERSKTsKKwkJcHJpbnRrKCIlczogbGFuY2Vfc3RhcnRfeG1pdCgpIGNhbGxlZCwgY3NyMCAlNC40eC5cbiIsIGRldi0+bmFtZSwKKwkJCSAgIGludyhpb2FkZHIrTEFOQ0VfREFUQSkpOworCQlvdXR3KDB4MDAwMCwgaW9hZGRyK0xBTkNFX0RBVEEpOworCX0KKworCS8qIEZpbGwgaW4gYSBUeCByaW5nIGVudHJ5ICovCisKKwkvKiBNYXNrIHRvIHJpbmcgYnVmZmVyIGJvdW5kYXJ5LiAqLworCWVudHJ5ID0gbHAtPmN1cl90eCAmIFRYX1JJTkdfTU9EX01BU0s7CisKKwkvKiBDYXV0aW9uOiB0aGUgd3JpdGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUsIHNldCB0aGUgYmFzZSBhZGRyZXNzCisJICAgd2l0aCB0aGUgIm93bmVyc2hpcCIgYml0cyBsYXN0LiAqLworCisJLyogVGhlIG9sZCBMQU5DRSBjaGlwcyBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgcGFkIGJ1ZmZlcnMgdG8gbWluLiBzaXplLiAqLworCWlmIChjaGlwX3RhYmxlW2xwLT5jaGlwX3ZlcnNpb25dLmZsYWdzICYgTEFOQ0VfTVVTVF9QQUQpIHsKKwkJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKKwkJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJCWlmIChza2IgPT0gTlVMTCkKKwkJCQlnb3RvIG91dDsKKwkJCWxwLT50eF9yaW5nW2VudHJ5XS5sZW5ndGggPSAtRVRIX1pMRU47CisJCX0KKwkJZWxzZSAKKwkJCWxwLT50eF9yaW5nW2VudHJ5XS5sZW5ndGggPSAtc2tiLT5sZW47CisJfSBlbHNlCisJCWxwLT50eF9yaW5nW2VudHJ5XS5sZW5ndGggPSAtc2tiLT5sZW47CisKKwlscC0+dHhfcmluZ1tlbnRyeV0ubWlzYyA9IDB4MDAwMDsKKworCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCS8qIElmIGFueSBwYXJ0IG9mIHRoaXMgYnVmZmVyIGlzID4xNk0gd2UgbXVzdCBjb3B5IGl0IHRvIGEgbG93LW1lbW9yeQorCSAgIGJ1ZmZlci4gKi8KKwlpZiAoKHUzMilpc2FfdmlydF90b19idXMoc2tiLT5kYXRhKSArIHNrYi0+bGVuID4gMHgwMTAwMDAwMCkgeworCQlpZiAobGFuY2VfZGVidWcgPiA1KQorCQkJcHJpbnRrKCIlczogYm91bmNpbmcgYSBoaWdoLW1lbW9yeSBwYWNrZXQgKCUjeCkuXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgKHUzMilpc2FfdmlydF90b19idXMoc2tiLT5kYXRhKSk7CisJCW1lbWNweSgmbHAtPnR4X2JvdW5jZV9idWZmc1tlbnRyeV0sIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlscC0+dHhfcmluZ1tlbnRyeV0uYmFzZSA9CisJCQkoKHUzMilpc2FfdmlydF90b19idXMoKGxwLT50eF9ib3VuY2VfYnVmZnMgKyBlbnRyeSkpICYgMHhmZmZmZmYpIHwgMHg4MzAwMDAwMDsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0gZWxzZSB7CisJCWxwLT50eF9za2J1ZmZbZW50cnldID0gc2tiOworCQlscC0+dHhfcmluZ1tlbnRyeV0uYmFzZSA9ICgodTMyKWlzYV92aXJ0X3RvX2J1cyhza2ItPmRhdGEpICYgMHhmZmZmZmYpIHwgMHg4MzAwMDAwMDsKKwl9CisJbHAtPmN1cl90eCsrOworCisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgc2VuZCBwb2xsLiAqLworCW91dHcoMHgwMDAwLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJb3V0dygweDAwNDgsIGlvYWRkcitMQU5DRV9EQVRBKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJaWYgKChscC0+Y3VyX3R4IC0gbHAtPmRpcnR5X3R4KSA+PSBUWF9SSU5HX1NJWkUpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5kZXZsb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBMQU5DRSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorbGFuY2VfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwOworCWludCBjc3IwLCBpb2FkZHIsIGJvZ3VzY250PTEwOworCWludCBtdXN0X3Jlc3RhcnQ7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrICgibGFuY2VfaW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbHAgPSBkZXYtPnByaXY7CisJCisJc3Bpbl9sb2NrICgmbHAtPmRldmxvY2spOworCisJb3V0dygweDAwLCBkZXYtPmJhc2VfYWRkciArIExBTkNFX0FERFIpOworCXdoaWxlICgoY3NyMCA9IGludyhkZXYtPmJhc2VfYWRkciArIExBTkNFX0RBVEEpKSAmIDB4ODYwMAorCQkgICAmJiAtLWJvZ3VzY250ID49IDApIHsKKwkJLyogQWNrbm93bGVkZ2UgYWxsIG9mIHRoZSBjdXJyZW50IGludGVycnVwdCBzb3VyY2VzIEFTQVAuICovCisJCW91dHcoY3NyMCAmIH4weDAwNGYsIGRldi0+YmFzZV9hZGRyICsgTEFOQ0VfREFUQSk7CisKKwkJbXVzdF9yZXN0YXJ0ID0gMDsKKworCQlpZiAobGFuY2VfZGVidWcgPiA1KQorCQkJcHJpbnRrKCIlczogaW50ZXJydXB0ICBjc3IwPSUjMi4yeCBuZXcgY3NyPSUjMi4yeC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBjc3IwLCBpbncoZGV2LT5iYXNlX2FkZHIgKyBMQU5DRV9EQVRBKSk7CisKKwkJaWYgKGNzcjAgJiAweDA0MDApCQkJLyogUnggaW50ZXJydXB0ICovCisJCQlsYW5jZV9yeChkZXYpOworCisJCWlmIChjc3IwICYgMHgwMjAwKSB7CQkvKiBUeC1kb25lIGludGVycnVwdCAqLworCQkJaW50IGRpcnR5X3R4ID0gbHAtPmRpcnR5X3R4OworCisJCQl3aGlsZSAoZGlydHlfdHggPCBscC0+Y3VyX3R4KSB7CisJCQkJaW50IGVudHJ5ID0gZGlydHlfdHggJiBUWF9SSU5HX01PRF9NQVNLOworCQkJCWludCBzdGF0dXMgPSBscC0+dHhfcmluZ1tlbnRyeV0uYmFzZTsKKwkJCQorCQkJCWlmIChzdGF0dXMgPCAwKQorCQkJCQlicmVhazsJCQkvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBUeGVkICovCisKKwkJCQlscC0+dHhfcmluZ1tlbnRyeV0uYmFzZSA9IDA7CisKKwkJCQlpZiAoc3RhdHVzICYgMHg0MDAwMDAwMCkgeworCQkJCQkvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KKwkJCQkJaW50IGVycl9zdGF0dXMgPSBscC0+dHhfcmluZ1tlbnRyeV0ubWlzYzsKKwkJCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCQlpZiAoZXJyX3N0YXR1cyAmIDB4MDQwMCkgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJCWlmIChlcnJfc3RhdHVzICYgMHgwODAwKSBscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQkJaWYgKGVycl9zdGF0dXMgJiAweDEwMDApIGxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQkJCWlmIChlcnJfc3RhdHVzICYgMHg0MDAwKSB7CisJCQkJCQkvKiBBY2trISAgT24gRklGTyBlcnJvcnMgdGhlIFR4IHVuaXQgaXMgdHVybmVkIG9mZiEgKi8KKwkJCQkJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCQkJLyogUmVtb3ZlIHRoaXMgdmVyYm9zaXR5IGxhdGVyISAqLworCQkJCQkJcHJpbnRrKCIlczogVHggRklGTyBlcnJvciEgU3RhdHVzICU0LjR4LlxuIiwKKwkJCQkJCQkgICBkZXYtPm5hbWUsIGNzcjApOworCQkJCQkJLyogUmVzdGFydCB0aGUgY2hpcC4gKi8KKwkJCQkJCW11c3RfcmVzdGFydCA9IDE7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoc3RhdHVzICYgMHgxODAwMDAwMCkKKwkJCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCQkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJfQorCisJCQkJLyogV2UgbXVzdCBmcmVlIHRoZSBvcmlnaW5hbCBza2IgaWYgaXQncyBub3QgYSBkYXRhLW9ubHkgY29weQorCQkJCSAgIGluIHRoZSBib3VuY2UgYnVmZmVyLiAqLworCQkJCWlmIChscC0+dHhfc2tidWZmW2VudHJ5XSkgeworCQkJCQlkZXZfa2ZyZWVfc2tiX2lycShscC0+dHhfc2tidWZmW2VudHJ5XSk7CisJCQkJCWxwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCQl9CisJCQkJZGlydHlfdHgrKzsKKwkJCX0KKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQlpZiAobHAtPmN1cl90eCAtIGRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSkgeworCQkJCXByaW50aygib3V0LW9mLXN5bmMgZGlydHkgcG9pbnRlciwgJWQgdnMuICVkLCBmdWxsPSVzLlxuIiwKKwkJCQkJICAgZGlydHlfdHgsIGxwLT5jdXJfdHgsCisJCQkJCSAgIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSA/ICJ5ZXMiIDogIm5vIik7CisJCQkJZGlydHlfdHggKz0gVFhfUklOR19TSVpFOworCQkJfQorI2VuZGlmCisKKwkJCS8qIGlmIHRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsLCBhY2NlcHQgbW9yZSBwYWNrZXRzICovCisJCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJCQkgICAgZGlydHlfdHggPiBscC0+Y3VyX3R4IC0gVFhfUklOR19TSVpFICsgMikKKwkJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCisJCQlscC0+ZGlydHlfdHggPSBkaXJ0eV90eDsKKwkJfQorCisJCS8qIExvZyBtaXNjIGVycm9ycy4gKi8KKwkJaWYgKGNzcjAgJiAweDQwMDApIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsgLyogVHggYmFiYmxlLiAqLworCQlpZiAoY3NyMCAmIDB4MTAwMCkgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBNaXNzZWQgYSBSeCBmcmFtZS4gKi8KKwkJaWYgKGNzcjAgJiAweDA4MDApIHsKKwkJCXByaW50aygiJXM6IEJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gZmFpbHVyZSwgc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGNzcjApOworCQkJLyogUmVzdGFydCB0aGUgY2hpcC4gKi8KKwkJCW11c3RfcmVzdGFydCA9IDE7CisJCX0KKworCQlpZiAobXVzdF9yZXN0YXJ0KSB7CisJCQkvKiBzdG9wIHRoZSBjaGlwIHRvIGNsZWFyIHRoZSBlcnJvciBjb25kaXRpb24sIHRoZW4gcmVzdGFydCAqLworCQkJb3V0dygweDAwMDAsIGRldi0+YmFzZV9hZGRyICsgTEFOQ0VfQUREUik7CisJCQlvdXR3KDB4MDAwNCwgZGV2LT5iYXNlX2FkZHIgKyBMQU5DRV9EQVRBKTsKKwkJCWxhbmNlX3Jlc3RhcnQoZGV2LCAweDAwMDIsIDApOworCQl9CisJfQorCisJLyogQ2xlYXIgYW55IG90aGVyIGludGVycnVwdCwgYW5kIHNldCBpbnRlcnJ1cHQgZW5hYmxlLiAqLworCW91dHcoMHgwMDAwLCBkZXYtPmJhc2VfYWRkciArIExBTkNFX0FERFIpOworCW91dHcoMHg3OTQwLCBkZXYtPmJhc2VfYWRkciArIExBTkNFX0RBVEEpOworCisJaWYgKGxhbmNlX2RlYnVnID4gNCkKKwkJcHJpbnRrKCIlczogZXhpdGluZyBpbnRlcnJ1cHQsIGNzciVkPSUjNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGludyhpb2FkZHIgKyBMQU5DRV9BRERSKSwKKwkJCSAgIGludyhkZXYtPmJhc2VfYWRkciArIExBTkNFX0RBVEEpKTsKKworCXNwaW5fdW5sb2NrICgmbHAtPmRldmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludAorbGFuY2Vfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJaW50IGVudHJ5ID0gbHAtPmN1cl9yeCAmIFJYX1JJTkdfTU9EX01BU0s7CisJaW50IGk7CisJCQorCS8qIElmIHdlIG93biB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKGxwLT5yeF9yaW5nW2VudHJ5XS5iYXNlID49IDApIHsKKwkJaW50IHN0YXR1cyA9IGxwLT5yeF9yaW5nW2VudHJ5XS5iYXNlID4+IDI0OworCisJCWlmIChzdGF0dXMgIT0gMHgwMykgewkJCS8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KKwkJCS8qIFRoZXJlIGlzIGEgdHJpY2t5IGVycm9yIG5vdGVkIGJ5IEpvaG4gTXVycGh5LAorCQkJICAgPG11cmZAcGVyZnRlY2guY29tPiB0byBSdXNzIE5lbHNvbjogRXZlbiB3aXRoIGZ1bGwtc2l6ZWQKKwkJCSAgIGJ1ZmZlcnMgaXQncyBwb3NzaWJsZSBmb3IgYSBqYWJiZXIgcGFja2V0IHRvIHVzZSB0d28KKwkJCSAgIGJ1ZmZlcnMsIHdpdGggb25seSB0aGUgbGFzdCBjb3JyZWN0bHkgbm90aW5nIHRoZSBlcnJvci4gKi8KKwkJCWlmIChzdGF0dXMgJiAweDAxKQkvKiBPbmx5IGNvdW50IGEgZ2VuZXJhbCBlcnJvciBhdCB0aGUgKi8KKwkJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7IC8qIGVuZCBvZiBhIHBhY2tldC4qLworCQkJaWYgKHN0YXR1cyAmIDB4MjApIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAweDEwKSBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAweDA4KSBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIDB4MDQpIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJbHAtPnJ4X3JpbmdbZW50cnldLmJhc2UgJj0gMHgwM2ZmZmZmZjsKKwkJfQorCQllbHNlIAorCQl7CisJCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlciwgY29tcGF0aWJsZSB3aXRoIG5ldDMuICovCisJCQlzaG9ydCBwa3RfbGVuID0gKGxwLT5yeF9yaW5nW2VudHJ5XS5tc2dfbGVuZ3RoICYgMHhmZmYpLTQ7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJCisJCQlpZihwa3RfbGVuPDYwKQorCQkJeworCQkJCXByaW50aygiJXM6IFJ1bnQgcGFja2V0IVxuIixkZXYtPm5hbWUpOworCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMik7CisJCQkJaWYgKHNrYiA9PSBOVUxMKSAKKwkJCQl7CisJCQkJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkZWZlcnJpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJZm9yIChpPTA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykKKwkJCQkJCWlmIChscC0+cnhfcmluZ1soZW50cnkraSkgJiBSWF9SSU5HX01PRF9NQVNLXS5iYXNlIDwgMCkKKwkJCQkJCQlicmVhazsKKworCQkJCQlpZiAoaSA+IFJYX1JJTkdfU0laRSAtMikgCisJCQkJCXsKKwkJCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJCQlscC0+cnhfcmluZ1tlbnRyeV0uYmFzZSB8PSAweDgwMDAwMDAwOworCQkJCQkJbHAtPmN1cl9yeCsrOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsMik7CS8qIDE2IGJ5dGUgYWxpZ24gKi8KKwkJCQlza2JfcHV0KHNrYixwa3RfbGVuKTsJLyogTWFrZSByb29tICovCisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCisJCQkJCSh1bnNpZ25lZCBjaGFyICopaXNhX2J1c190b192aXJ0KChscC0+cnhfcmluZ1tlbnRyeV0uYmFzZSAmIDB4MDBmZmZmZmYpKSwKKwkJCQkJcGt0X2xlbiwwKTsKKwkJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCWxwLT5zdGF0cy5yeF9ieXRlcys9cGt0X2xlbjsKKwkJCX0KKwkJfQorCQkvKiBUaGUgZG9jcyBzYXkgdGhhdCB0aGUgYnVmZmVyIGxlbmd0aCBpc24ndCB0b3VjaGVkLCBidXQgQW5kcmV3IEJveWQKKwkJICAgb2YgUU5YIHJlcG9ydHMgdGhhdCBzb21lIHJldnMgb2YgdGhlIDc5Qzk2NSBjbGVhciBpdC4gKi8KKwkJbHAtPnJ4X3JpbmdbZW50cnldLmJ1Zl9sZW5ndGggPSAtUEtUX0JVRl9TWjsKKwkJbHAtPnJ4X3JpbmdbZW50cnldLmJhc2UgfD0gMHg4MDAwMDAwMDsKKwkJZW50cnkgPSAoKytscC0+Y3VyX3J4KSAmIFJYX1JJTkdfTU9EX01BU0s7CisJfQorCisJLyogV2Ugc2hvdWxkIGNoZWNrIHRoYXQgYXQgbGVhc3QgdHdvIHJpbmcgZW50cmllcyBhcmUgZnJlZS4JIElmIG5vdCwKKwkgICB3ZSBzaG91bGQgZnJlZSBvbmUgYW5kIG1hcmsgc3RhdHMtPnJ4X2Ryb3BwZWQrKy4gKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitsYW5jZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCisJaWYgKGNoaXBfdGFibGVbbHAtPmNoaXBfdmVyc2lvbl0uZmxhZ3MgJiBMQU5DRV9IQVNfTUlTU0VEX0ZSQU1FKSB7CisJCW91dHcoMTEyLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gaW53KGlvYWRkcitMQU5DRV9EQVRBKTsKKwl9CisJb3V0dygwLCBpb2FkZHIrTEFOQ0VfQUREUik7CisKKwlpZiAobGFuY2VfZGVidWcgPiAxKQorCQlwcmludGsoIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlMi4yeC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGludyhpb2FkZHIrTEFOQ0VfREFUQSkpOworCisJLyogV2Ugc3RvcCB0aGUgTEFOQ0UgaGVyZSAtLSBpdCBvY2Nhc2lvbmFsbHkgcG9sbHMKKwkgICBtZW1vcnkgaWYgd2UgZG9uJ3QuICovCisJb3V0dygweDAwMDQsIGlvYWRkcitMQU5DRV9EQVRBKTsKKworCWlmIChkZXYtPmRtYSAhPSA0KQorCXsKKwkJdW5zaWduZWQgbG9uZyBmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCQlkaXNhYmxlX2RtYShkZXYtPmRtYSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCX0KKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCWxhbmNlX3B1cmdlX3JpbmcoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmxhbmNlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKworCWlmIChjaGlwX3RhYmxlW2xwLT5jaGlwX3ZlcnNpb25dLmZsYWdzICYgTEFOQ0VfSEFTX01JU1NFRF9GUkFNRSkgeworCQlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkJc2hvcnQgc2F2ZWRfYWRkcjsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmRldmxvY2ssIGZsYWdzKTsKKwkJc2F2ZWRfYWRkciA9IGludyhpb2FkZHIrTEFOQ0VfQUREUik7CisJCW91dHcoMTEyLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gaW53KGlvYWRkcitMQU5DRV9EQVRBKTsKKwkJb3V0dyhzYXZlZF9hZGRyLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5kZXZsb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICovCisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJb3V0dygwLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJb3V0dygweDAwMDQsIGlvYWRkcitMQU5DRV9EQVRBKTsgLyogVGVtcG9yYXJpbHkgc3RvcCB0aGUgbGFuY2UuCSAqLworCisJaWYgKGRldi0+ZmxhZ3MmSUZGX1BST01JU0MpIHsKKwkJLyogTG9nIGFueSBuZXQgdGFwcy4gKi8KKwkJcHJpbnRrKCIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJb3V0dygxNSwgaW9hZGRyK0xBTkNFX0FERFIpOworCQlvdXR3KDB4ODAwMCwgaW9hZGRyK0xBTkNFX0RBVEEpOyAvKiBTZXQgcHJvbWlzY3VvdXMgbW9kZSAqLworCX0gZWxzZSB7CisJCXNob3J0IG11bHRpY2FzdF90YWJsZVs0XTsKKwkJaW50IGk7CisJCWludCBudW1fYWRkcnM9ZGV2LT5tY19jb3VudDsKKwkJaWYoZGV2LT5mbGFncyZJRkZfQUxMTVVMVEkpCisJCQludW1fYWRkcnM9MTsKKwkJLyogRklYSVQ6IFdlIGRvbid0IHVzZSB0aGUgbXVsdGljYXN0IHRhYmxlLCBidXQgcmVseSBvbiB1cHBlci1sYXllciBmaWx0ZXJpbmcuICovCisJCW1lbXNldChtdWx0aWNhc3RfdGFibGUsIChudW1fYWRkcnMgPT0gMCkgPyAwIDogLTEsIHNpemVvZihtdWx0aWNhc3RfdGFibGUpKTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJb3V0dyg4ICsgaSwgaW9hZGRyK0xBTkNFX0FERFIpOworCQkJb3V0dyhtdWx0aWNhc3RfdGFibGVbaV0sIGlvYWRkcitMQU5DRV9EQVRBKTsKKwkJfQorCQlvdXR3KDE1LCBpb2FkZHIrTEFOQ0VfQUREUik7CisJCW91dHcoMHgwMDAwLCBpb2FkZHIrTEFOQ0VfREFUQSk7IC8qIFVuc2V0IHByb21pc2N1b3VzIG1vZGUgKi8KKwl9CisKKwlsYW5jZV9yZXN0YXJ0KGRldiwgMHgwMTQyLCAwKTsgLyogIFJlc3VtZSBub3JtYWwgb3BlcmF0aW9uICovCisKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbGFzaV84MjU5Ni5jIGIvZHJpdmVycy9uZXQvbGFzaV84MjU5Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjYzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9sYXNpXzgyNTk2LmMKQEAgLTAsMCArMSwxNjA3IEBACisvKiBsYXNpXzgyNTk2LmMgLS0gZHJpdmVyIGZvciB0aGUgaW50ZWwgODI1OTYgZXRoZXJuZXQgY29udHJvbGxlciwgYXMKKyAgIG11bmdlZCBpbnRvIEhQUEEgYm94ZW4gLgorCisgICBUaGlzIGRyaXZlciBpcyBiYXNlZCB1cG9uIDgyNTk2LmMsIG9yaWdpbmFsIGNyZWRpdHMgYXJlIGJlbG93Li4uCisgICBidXQgdGhlcmUgd2VyZSB0b28gbWFueSBob29wcyB3aGljaCBIUCB3YW50cyBqdW1wZWQgdGhyb3VnaCB0bworICAga2VlcCB0aGlzIGNvZGUgaW4gdGhlcmUgaW4gYSBzYW5lIG1hbm5lci4KKworICAgMyBwcmltYXJ5IHNvdXJjZXMgb2YgdGhlIG1lc3MgLS0gCisgICAxKSBocHBhIG5lZWRzICpsb3RzKiBvZiBjYWNoZWxpbmUgZmx1c2hpbmcgdG8ga2VlcCB0aGlzIGtpbmQgb2YKKyAgIE1NSU8gcnVubmluZy4KKworICAgMikgVGhlIDgyNTk2IG5lZWRzIHRvIHNlZSBhbGwgb2YgaXRzIHBvaW50ZXJzIGFzIHRoZWlyIHBoeXNpY2FsCisgICBhZGRyZXNzLiAgVGh1cyB2aXJ0X3RvX2J1cy9idXNfdG9fdmlydCBhcmUgKmV2ZXJ5d2hlcmUqLgorCisgICAzKSBUaGUgaW1wbGVtZW50YXRpb24gSFAgaXMgdXNpbmcgc2VlbXMgdG8gYmUgc2lnbmlmaWNhbnRseSBwaWNraWVyIAorICAgYWJvdXQgd2hlbiBhbmQgaG93IHRoZSBjb21tYW5kIGFuZCBSWCB1bml0cyBhcmUgc3RhcnRlZC4gIHNvbWUKKyAgIGNvbW1hbmQgb3JkZXJpbmcgd2FzIGNoYW5nZWQuCisKKyAgIEV4YW1pbmF0aW9uIG9mIHRoZSBtYWNoIGRyaXZlciBsZWFkcyBvbmUgdG8gYmVsaWV2ZSB0aGF0IHRoZXJlCisgICBtaWdodCBiZSBhIHNhbmVyIHdheSB0byBwdWxsIHRoaXMgb2ZmLi4uICBhbnlvbmUgd2hvIGZlZWxzIGxpa2UgYQorICAgZnVsbCByZXdyaXRlIGNhbiBiZSBteSBndWVzdC4KKworICAgU3BsaXQgMDIvMTMvMjAwMCBTYW0gQ3JlYXNleSAoc2FtbXlAb2gudmVyaW8uY29tKQorICAgCisgICAwMi8wMS8yMDAwICBJbml0aWFsIG1vZGlmaWNhdGlvbnMgZm9yIHBhcmlzYyBieSBIZWxnZSBEZWxsZXIgKGRlbGxlckBnbXguZGUpCisgICAwMy8wMi8yMDAwICBjaGFuZ2VzIGZvciBiZXR0ZXIvY29ycmVjdCg/KSBjYWNoZS1mbHVzaGluZyAoZGVsbGVyKQorKi8KKworLyogODI1OTYuYzogQSBnZW5lcmljIDgyNTk2IGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguICovCisvKgorICAgQmFzZWQgb24gQXByaWNvdC5jCisgICBXcml0dGVuIDE5OTQgYnkgTWFyayBFdmFucy4KKyAgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgQXByaWNvdCA4MjU5NiBidXMtbWFzdGVyIGludGVyZmFjZQorCisgICBNb2R1bGFyaXNlZCAxMi85NCBNYXJrIEV2YW5zCisKKworICAgTW9kaWZpZWQgdG8gc3VwcG9ydCB0aGUgODI1OTYgZXRoZXJuZXQgY2hpcHMgb24gNjgweDAgVk1FIGJvYXJkcy4KKyAgIGJ5IFJpY2hhcmQgSGlyc3QgPHJpY2hhcmRAc2xlZXBpZS5kZW1vbi5jby51az4KKyAgIFJlbmFtZWQgdG8gYmUgODI1OTYuYworCisgICA5ODA4MjU6ICBDaGFuZ2VkIHRvIHJlY2VpdmUgZGlyZWN0bHkgaW4gdG8gc2tfYnVmZnMgd2hpY2ggYXJlCisgICBhbGxvY2F0ZWQgYXQgb3BlbigpIHRpbWUuICBFbGltaW5hdGVzIGNvcHkgb24gaW5jb21pbmcgZnJhbWVzCisgICAoc21hbGwgb25lcyBhcmUgc3RpbGwgY29waWVkKS4gIFNoYXJlZCBkYXRhIG5vdyBoZWxkIGluIGEKKyAgIG5vbi1jYWNoZWQgcGFnZSwgc28gd2UgY2FuIHJ1biBvbiA2ODA2MCBpbiBjb3B5YmFjayBtb2RlLgorCisgICBUQkQ6CisgICAqIGxvb2sgYXQgZGVmZXJyaW5nIHJ4IGZyYW1lcyByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIChhcyBwZXIgdHVsaXApCisgICAqIGhhbmRsZSB0eCByaW5nIGZ1bGwgYXMgcGVyIHR1bGlwCisgICAqIHBlcmZvcm1hY2UgdGVzdCB0byB0dW5lIHJ4X2NvcHlicmVhaworCisgICBNb3N0IG9mIG15IG1vZGlmaWNhdGlvbnMgcmVsYXRlIHRvIHRoZSBicmFpbmRlYWQgYmlnLWVuZGlhbgorICAgaW1wbGVtZW50YXRpb24gYnkgSW50ZWwuICBXaGVuIHRoZSBpNTk2IGlzIG9wZXJhdGluZyBpbgorICAgJ2JpZy1lbmRpYW4nIG1vZGUsIGl0IHRoaW5rcyBhIDMyIGJpdCB2YWx1ZSBvZiAweDEyMzQ1Njc4CisgICBzaG91bGQgYmUgc3RvcmVkIGFzIDB4NTY3ODEyMzQuICBUaGlzIGlzIGEgcmVhbCBwYWluLCB3aGVuCisgICB5b3UgaGF2ZSBsaW5rZWQgbGlzdHMgd2hpY2ggYXJlIHNoYXJlZCBieSB0aGUgNjgweDAgYW5kIHRoZQorICAgaTU5Ni4KKworICAgRHJpdmVyIHNrZWxldG9uCisgICBXcml0dGVuIDE5OTMgYnkgRG9uYWxkIEJlY2tlci4KKyAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUgRGlyZWN0b3IsCisgICBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQKKyAgIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIG1vZGlmaWVkIGJ5IFNSQywKKyAgIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisgICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworICAgU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uLCA0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMCwgQW5uYXBvbGlzIE1EIDIxNDAzCisKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3BkYy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9wYXJpc2MtZGV2aWNlLmg+CisKKyNkZWZpbmUgTEFTSV84MjU5Nl9EUklWRVJfVkVSU0lPTiAiTEFTSSA4MjU5NiBkcml2ZXIgLSBSZXZpc2lvbjogMS4zMCIKKworLyogREVCVUcgZmxhZ3MKKyAqLworCisjZGVmaW5lIERFQl9JTklUCTB4MDAwMQorI2RlZmluZSBERUJfUFJPQkUJMHgwMDAyCisjZGVmaW5lIERFQl9TRVJJT1VTCTB4MDAwNAorI2RlZmluZSBERUJfRVJST1JTCTB4MDAwOAorI2RlZmluZSBERUJfTVVMVEkJMHgwMDEwCisjZGVmaW5lIERFQl9URFIJCTB4MDAyMAorI2RlZmluZSBERUJfT1BFTgkweDAwNDAKKyNkZWZpbmUgREVCX1JFU0VUCTB4MDA4MAorI2RlZmluZSBERUJfQUREQ01ECTB4MDEwMAorI2RlZmluZSBERUJfU1RBVFVTCTB4MDIwMAorI2RlZmluZSBERUJfU1RBUlRUWAkweDA0MDAKKyNkZWZpbmUgREVCX1JYQUREUgkweDA4MDAKKyNkZWZpbmUgREVCX1RYQUREUgkweDEwMDAKKyNkZWZpbmUgREVCX1JYRlJBTUUJMHgyMDAwCisjZGVmaW5lIERFQl9JTlRTCTB4NDAwMAorI2RlZmluZSBERUJfU1RSVUNUCTB4ODAwMAorI2RlZmluZSBERUJfQU5ZCQkweGZmZmYKKworCisjZGVmaW5lIERFQih4LHkpCWlmIChpNTk2X2RlYnVnICYgKHgpKSB7IHk7IH0KKworCisjZGVmaW5lICBDSEVDS19XQkFDSyhhZGRyLGxlbikgXAorCWRvIHsgZG1hX2NhY2hlX3N5bmMoKHZvaWQgKilhZGRyLCBsZW4sIERNQV9UT19ERVZJQ0UpOyB9IHdoaWxlICgwKQorCisjZGVmaW5lICBDSEVDS19JTlYoYWRkcixsZW4pIFwKKwlkbyB7IGRtYV9jYWNoZV9zeW5jKCh2b2lkICopYWRkciwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOyB9IHdoaWxlKDApCisKKyNkZWZpbmUgIENIRUNLX1dCQUNLX0lOVihhZGRyLGxlbikgXAorCWRvIHsgZG1hX2NhY2hlX3N5bmMoKHZvaWQgKilhZGRyLCBsZW4sIERNQV9CSURJUkVDVElPTkFMKTsgfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIFBBX0k4MjU5Nl9SRVNFVAkJMAkvKiBPZmZzZXRzIHJlbGF0aXZlIHRvIExBU0ktTEFOLUFkZHIuKi8KKyNkZWZpbmUgUEFfQ1BVX1BPUlRfTF9BQ0NFU1MJNAorI2RlZmluZSBQQV9DSEFOTkVMX0FUVEVOVElPTgk4CisKKworLyoKKyAqIERlZmluZSB2YXJpb3VzIG1hY3JvcyBmb3IgQ2hhbm5lbCBBdHRlbnRpb24sIHdvcmQgc3dhcHBpbmcgZXRjLiwgZGVwZW5kZW50CisgKiBvbiBhcmNoaXRlY3R1cmUuICBNVk1FIGFuZCBCVk1FIGFyZSA2ODB4MCBiYXNlZCwgb3RoZXJ3aXNlIGl0IGlzIEludGVsLgorICovCisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKyNkZWZpbmUgV1NXQVByZmQoeCkgICgoKHUzMikoeCk8PDE2KSB8ICgoKCh1MzIpKHgpKSk+PjE2KSkKKyNkZWZpbmUgV1NXQVByYmQoeCkgICgoKHUzMikoeCk8PDE2KSB8ICgoKCh1MzIpKHgpKSk+PjE2KSkKKyNkZWZpbmUgV1NXQVBpc2NwKHgpICgoKHUzMikoeCk8PDE2KSB8ICgoKCh1MzIpKHgpKSk+PjE2KSkKKyNkZWZpbmUgV1NXQVBzY2IoeCkgICgoKHUzMikoeCk8PDE2KSB8ICgoKCh1MzIpKHgpKSk+PjE2KSkKKyNkZWZpbmUgV1NXQVBjbWQoeCkgICgoKHUzMikoeCk8PDE2KSB8ICgoKCh1MzIpKHgpKSk+PjE2KSkKKyNkZWZpbmUgV1NXQVB0YmQoeCkgICgoKHUzMikoeCk8PDE2KSB8ICgoKCh1MzIpKHgpKSk+PjE2KSkKKyNkZWZpbmUgV1NXQVBjaGFyKHgpICgoKHUzMikoeCk8PDE2KSB8ICgoKCh1MzIpKHgpKSk+PjE2KSkKKyNkZWZpbmUgSVNDUF9CVVNZCTB4MDAwMTAwMDAKKyNkZWZpbmUgTUFDSF9JU19BUFJJQ09UCTAKKyNlbHNlCisjZGVmaW5lIFdTV0FQcmZkKHgpICAgICAoKHN0cnVjdCBpNTk2X3JmZCAqKSh4KSkKKyNkZWZpbmUgV1NXQVByYmQoeCkgICAgICgoc3RydWN0IGk1OTZfcmJkICopKHgpKQorI2RlZmluZSBXU1dBUGlzY3AoeCkgICAgKChzdHJ1Y3QgaTU5Nl9pc2NwICopKHgpKQorI2RlZmluZSBXU1dBUHNjYih4KSAgICAgKChzdHJ1Y3QgaTU5Nl9zY2IgKikoeCkpCisjZGVmaW5lIFdTV0FQY21kKHgpICAgICAoKHN0cnVjdCBpNTk2X2NtZCAqKSh4KSkKKyNkZWZpbmUgV1NXQVB0YmQoeCkgICAgICgoc3RydWN0IGk1OTZfdGJkICopKHgpKQorI2RlZmluZSBXU1dBUGNoYXIoeCkgICAgKChjaGFyICopKHgpKQorI2RlZmluZSBJU0NQX0JVU1kJMHgwMDAxCisjZGVmaW5lIE1BQ0hfSVNfQVBSSUNPVAkxCisjZW5kaWYKKworLyoKKyAqIFRoZSBNUFVfUE9SVCBjb21tYW5kIGFsbG93cyBkaXJlY3QgYWNjZXNzIHRvIHRoZSA4MjU5Ni4gV2l0aCBQT1JUIGFjY2VzcworICogdGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIChwNS0xOCkuIFRoZSAzMi1iaXQgcG9ydCBjb21tYW5kCisgKiBtdXN0IGJlIHdvcmQtc3dhcHBlZCB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IHdvcmQgd3JpdHRlbiBmaXJzdC4KKyAqIFRoaXMgb25seSBhcHBsaWVzIHRvIFZNRSBib2FyZHMuCisgKi8KKyNkZWZpbmUgUE9SVF9SRVNFVAkJMHgwMAkvKiByZXNldCA4MjU5NiAqLworI2RlZmluZSBQT1JUX1NFTEZURVNUCQkweDAxCS8qIHNlbGZ0ZXN0ICovCisjZGVmaW5lIFBPUlRfQUxUU0NQCQkweDAyCS8qIGFsdGVybmF0ZSBTQ0IgYWRkcmVzcyAqLworI2RlZmluZSBQT1JUX0FMVERVTVAJCTB4MDMJLyogQWx0ZXJuYXRlIERVTVAgYWRkcmVzcyAqLworCitzdGF0aWMgaW50IGk1OTZfZGVidWcgPSAoREVCX1NFUklPVVN8REVCX1BST0JFKTsgIAorCitNT0RVTEVfQVVUSE9SKCJSaWNoYXJkIEhpcnN0Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImk4MjU5NiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9QQVJNKGk1OTZfZGVidWcsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGk1OTZfZGVidWcsICJsYXNpXzgyNTk2IGRlYnVnIG1hc2siKTsKKworLyogQ29weSBmcmFtZXMgc2hvcnRlciB0aGFuIHJ4X2NvcHlicmVhaywgb3RoZXJ3aXNlIHBhc3Mgb24gdXAgaW4KKyAqIGEgZnVsbCBzaXplZCBza19idWZmLiAgVmFsdWUgb2YgMTAwIHN0b2xlbiBmcm9tIHR1bGlwLmMgKCFhbHBoYSkuCisgKi8KK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMTAwOworCisjZGVmaW5lIE1BWF9EUklWRVJTCTQJLyogbWF4IGNvdW50IG9mIGRyaXZlcnMgKi8KKworI2RlZmluZSBQS1RfQlVGX1NaCTE1MzYKKyNkZWZpbmUgTUFYX01DX0NOVAk2NAorCisjZGVmaW5lIEk1OTZfTlVMTCAoKHUzMikweGZmZmZmZmZmKQorCisjZGVmaW5lIENNRF9FT0wJCTB4ODAwMAkvKiBUaGUgbGFzdCBjb21tYW5kIG9mIHRoZSBsaXN0LCBzdG9wLiAqLworI2RlZmluZSBDTURfU1VTUAkweDQwMDAJLyogU3VzcGVuZCBhZnRlciBkb2luZyBjbWQuICovCisjZGVmaW5lIENNRF9JTlRSCTB4MjAwMAkvKiBJbnRlcnJ1cHQgYWZ0ZXIgZG9pbmcgY21kLiAqLworCisjZGVmaW5lIENNRF9GTEVYCTB4MDAwOAkvKiBFbmFibGUgZmxleGlibGUgbWVtb3J5IG1vZGVsICovCisKK2VudW0gY29tbWFuZHMgeworCUNtZE5PcCA9IDAsIENtZFNBU2V0dXAgPSAxLCBDbWRDb25maWd1cmUgPSAyLCBDbWRNdWx0aWNhc3RMaXN0ID0gMywKKwlDbWRUeCA9IDQsIENtZFREUiA9IDUsIENtZER1bXAgPSA2LCBDbWREaWFnbm9zZSA9IDcKK307CisKKyNkZWZpbmUgU1RBVF9DCQkweDgwMDAJLyogU2V0IHRvIDAgYWZ0ZXIgZXhlY3V0aW9uICovCisjZGVmaW5lIFNUQVRfQgkJMHg0MDAwCS8qIENvbW1hbmQgYmVpbmcgZXhlY3V0ZWQgKi8KKyNkZWZpbmUgU1RBVF9PSwkJMHgyMDAwCS8qIENvbW1hbmQgZXhlY3V0ZWQgb2sgKi8KKyNkZWZpbmUgU1RBVF9BCQkweDEwMDAJLyogQ29tbWFuZCBhYm9ydGVkICovCisKKyNkZWZpbmUJIENVQ19TVEFSVAkweDAxMDAKKyNkZWZpbmUJIENVQ19SRVNVTUUJMHgwMjAwCisjZGVmaW5lCSBDVUNfU1VTUEVORCAgICAweDAzMDAKKyNkZWZpbmUJIENVQ19BQk9SVAkweDA0MDAKKyNkZWZpbmUJIFJYX1NUQVJUCTB4MDAxMAorI2RlZmluZQkgUlhfUkVTVU1FCTB4MDAyMAorI2RlZmluZQkgUlhfU1VTUEVORAkweDAwMzAKKyNkZWZpbmUJIFJYX0FCT1JUCTB4MDA0MAorCisjZGVmaW5lIFRYX1RJTUVPVVQJNQorCisjZGVmaW5lIE9QVF9TV0FQX1BPUlQJMHgwMDAxCS8qIE5lZWQgdG8gd29yZHN3cCBvbiB0aGUgTVBVIHBvcnQgKi8KKworCitzdHJ1Y3QgaTU5Nl9yZWcgeworCXVuc2lnbmVkIHNob3J0IHBvcnRoaTsKKwl1bnNpZ25lZCBzaG9ydCBwb3J0bG87CisJdTMyICAgICAgICAgICAgY2E7Cit9OworCisjZGVmaW5lIEVPRgkJMHg4MDAwCisjZGVmaW5lIFNJWkVfTUFTSwkweDNmZmYKKworc3RydWN0IGk1OTZfdGJkIHsKKwl1bnNpZ25lZCBzaG9ydCBzaXplOworCXVuc2lnbmVkIHNob3J0IHBhZDsKKwlkbWFfYWRkcl90ICAgICBuZXh0OworCWRtYV9hZGRyX3QgICAgIGRhdGE7CisJdTMyIGNhY2hlX3BhZFs1XTsJCS8qIFRvdGFsIDMyIGJ5dGVzLi4uICovCit9OworCisvKiBUaGUgY29tbWFuZCBzdHJ1Y3R1cmUgaGFzIHR3byAnbmV4dCcgcG9pbnRlcnM7IHZfbmV4dCBpcyB0aGUgYWRkcmVzcyBvZgorICogdGhlIG5leHQgY29tbWFuZCBhcyBzZWVuIGJ5IHRoZSBDUFUsIGJfbmV4dCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dAorICogY29tbWFuZCBhcyBzZWVuIGJ5IHRoZSA4MjU5Ni4gIFRoZSBiX25leHQgcG9pbnRlciwgYXMgdXNlZCBieSB0aGUgODI1OTYKKyAqIGFsd2F5cyByZWZlcmVuY2VzIHRoZSBzdGF0dXMgZmllbGQgb2YgdGhlIG5leHQgY29tbWFuZCwgcmF0aGVyIHRoYW4gdGhlCisgKiB2X25leHQgZmllbGQsIGJlY2F1c2UgdGhlIDgyNTk2IGlzIHVuYXdhcmUgb2Ygdl9uZXh0LiAgSXQgbWF5IHNlZW0gbW9yZQorICogbG9naWNhbCB0byBwdXQgdl9uZXh0IGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSwgYnV0IHdlIGNhbm5vdCBkbyB0aGF0CisgKiBiZWNhdXNlIHRoZSA4MjU5NiBleHBlY3RzIG90aGVyIGZpZWxkcyB0byBiZSB0aGVyZSwgZGVwZW5kaW5nIG9uIGNvbW1hbmQKKyAqIHR5cGUuCisgKi8KKworc3RydWN0IGk1OTZfY21kIHsKKwlzdHJ1Y3QgaTU5Nl9jbWQgKnZfbmV4dDsJLyogQWRkcmVzcyBmcm9tIENQVXMgdmlld3BvaW50ICovCisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCXVuc2lnbmVkIHNob3J0IGNvbW1hbmQ7CisJZG1hX2FkZHJfdCAgICAgYl9uZXh0OwkvKiBBZGRyZXNzIGZyb20gaTU5NiB2aWV3cG9pbnQgKi8KK307CisKK3N0cnVjdCB0eF9jbWQgeworCXN0cnVjdCBpNTk2X2NtZCBjbWQ7CisJZG1hX2FkZHJfdCAgICAgdGJkOworCXVuc2lnbmVkIHNob3J0IHNpemU7CisJdW5zaWduZWQgc2hvcnQgcGFkOworCXN0cnVjdCBza19idWZmICpza2I7CQkvKiBTbyB3ZSBjYW4gZnJlZSBpdCBhZnRlciB0eCAqLworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisjaWZkZWYgX19MUDY0X18KKwl1MzIgY2FjaGVfcGFkWzZdOwkJLyogVG90YWwgNjQgYnl0ZXMuLi4gKi8KKyNlbHNlICAgIAorCXUzMiBjYWNoZV9wYWRbMV07CQkvKiBUb3RhbCAzMiBieXRlcy4uLiAqLworI2VuZGlmICAgIAorfTsKKworc3RydWN0IHRkcl9jbWQgeworCXN0cnVjdCBpNTk2X2NtZCBjbWQ7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCXVuc2lnbmVkIHNob3J0IHBhZDsKK307CisKK3N0cnVjdCBtY19jbWQgeworCXN0cnVjdCBpNTk2X2NtZCBjbWQ7CisJc2hvcnQgbWNfY250OworCWNoYXIgbWNfYWRkcnNbTUFYX01DX0NOVCo2XTsKK307CisKK3N0cnVjdCBzYV9jbWQgeworCXN0cnVjdCBpNTk2X2NtZCBjbWQ7CisJY2hhciBldGhfYWRkcls4XTsKK307CisKK3N0cnVjdCBjZl9jbWQgeworCXN0cnVjdCBpNTk2X2NtZCBjbWQ7CisJY2hhciBpNTk2X2NvbmZpZ1sxNl07Cit9OworCitzdHJ1Y3QgaTU5Nl9yZmQgeworCXVuc2lnbmVkIHNob3J0IHN0YXQ7CisJdW5zaWduZWQgc2hvcnQgY21kOworCWRtYV9hZGRyX3QgICAgIGJfbmV4dDsJLyogQWRkcmVzcyBmcm9tIGk1OTYgdmlld3BvaW50ICovCisJZG1hX2FkZHJfdCAgICAgcmJkOworCXVuc2lnbmVkIHNob3J0IGNvdW50OworCXVuc2lnbmVkIHNob3J0IHNpemU7CisJc3RydWN0IGk1OTZfcmZkICp2X25leHQ7CS8qIEFkZHJlc3MgZnJvbSBDUFVzIHZpZXdwb2ludCAqLworCXN0cnVjdCBpNTk2X3JmZCAqdl9wcmV2OworI2lmbmRlZiBfX0xQNjRfXyAgICAKKwl1MzIgY2FjaGVfcGFkWzJdOwkJLyogVG90YWwgMzIgYnl0ZXMuLi4gKi8KKyNlbmRpZiAgICAKK307CisKK3N0cnVjdCBpNTk2X3JiZCB7CisgICAgLyogaGFyZHdhcmUgZGF0YSAqLworICAgIHVuc2lnbmVkIHNob3J0IGNvdW50OworICAgIHVuc2lnbmVkIHNob3J0IHplcm8xOworICAgIGRtYV9hZGRyX3QgICAgIGJfbmV4dDsKKyAgICBkbWFfYWRkcl90ICAgICBiX2RhdGE7CQkvKiBBZGRyZXNzIGZyb20gaTU5NiB2aWV3cG9pbnQgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBzaXplOworICAgIHVuc2lnbmVkIHNob3J0IHplcm8yOworICAgIC8qIGRyaXZlciBkYXRhICovCisgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyAgICBzdHJ1Y3QgaTU5Nl9yYmQgKnZfbmV4dDsKKyAgICBkbWFfYWRkcl90ICAgICBiX2FkZHI7CQkvKiBUaGlzIHJiZCBhZGRyIGZyb20gaTU5NiB2aWV3ICovCisgICAgdW5zaWduZWQgY2hhciAqdl9kYXRhOwkJLyogQWRkcmVzcyBmcm9tIENQVXMgdmlld3BvaW50ICovCisJCQkJCS8qIFRvdGFsIDMyIGJ5dGVzLi4uICovCisjaWZkZWYgX19MUDY0X18KKyAgICB1MzIgY2FjaGVfcGFkWzRdOworI2VuZGlmICAgIAorfTsKKworLyogVGhlc2UgdmFsdWVzIGFzIGNob3NlbiBzbyBzdHJ1Y3QgaTU5Nl9wcml2YXRlIGZpdHMgaW4gb25lIHBhZ2UuLi4gKi8KKworI2RlZmluZSBUWF9SSU5HX1NJWkUgMzIKKyNkZWZpbmUgUlhfUklOR19TSVpFIDE2CisKK3N0cnVjdCBpNTk2X3NjYiB7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCXVuc2lnbmVkIHNob3J0IGNvbW1hbmQ7CisJZG1hX2FkZHJfdCAgICBjbWQ7CisJZG1hX2FkZHJfdCAgICByZmQ7CisJdTMyICAgICAgICAgICBjcmNfZXJyOworCXUzMiAgICAgICAgICAgYWxpZ25fZXJyOworCXUzMiAgICAgICAgICAgcmVzb3VyY2VfZXJyOworCXUzMiAgICAgICAgICAgb3Zlcl9lcnI7CisJdTMyICAgICAgICAgICByY3ZkdF9lcnI7CisJdTMyICAgICAgICAgICBzaG9ydF9lcnI7CisJdW5zaWduZWQgc2hvcnQgdF9vbjsKKwl1bnNpZ25lZCBzaG9ydCB0X29mZjsKK307CisKK3N0cnVjdCBpNTk2X2lzY3AgeworCXUzMiAgICAgICAgICAgc3RhdDsKKwlkbWFfYWRkcl90ICAgIHNjYjsKK307CisKK3N0cnVjdCBpNTk2X3NjcCB7CisJdTMyICAgICAgICAgICBzeXNidXM7CisJdTMyICAgICAgICAgICAgcGFkOworCWRtYV9hZGRyX3QgICAgaXNjcDsKK307CisKK3N0cnVjdCBpNTk2X3ByaXZhdGUgeworCXZvbGF0aWxlIHN0cnVjdCBpNTk2X3NjcCBzY3AJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CisJdm9sYXRpbGUgc3RydWN0IGk1OTZfaXNjcCBpc2NwCQlfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOworCXZvbGF0aWxlIHN0cnVjdCBpNTk2X3NjYiBzY2IJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CisJc3RydWN0IHNhX2NtZCBzYV9jbWQJCQlfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOworCXN0cnVjdCBjZl9jbWQgY2ZfY21kCQkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKKwlzdHJ1Y3QgdGRyX2NtZCB0ZHJfY21kCQkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKKwlzdHJ1Y3QgbWNfY21kIG1jX2NtZAkJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CisJc3RydWN0IGk1OTZfcmZkIHJmZHNbUlhfUklOR19TSVpFXQlfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOworCXN0cnVjdCBpNTk2X3JiZCByYmRzW1JYX1JJTkdfU0laRV0JX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKKwlzdHJ1Y3QgdHhfY21kIHR4X2NtZHNbVFhfUklOR19TSVpFXQlfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOworCXN0cnVjdCBpNTk2X3RiZCB0YmRzW1RYX1JJTkdfU0laRV0JX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKKwl1MzIgICAgc3RhdDsKKwlpbnQgbGFzdF9yZXN0YXJ0OworCXN0cnVjdCBpNTk2X3JmZCAqcmZkX2hlYWQ7CisJc3RydWN0IGk1OTZfcmJkICpyYmRfaGVhZDsKKwlzdHJ1Y3QgaTU5Nl9jbWQgKmNtZF90YWlsOworCXN0cnVjdCBpNTk2X2NtZCAqY21kX2hlYWQ7CisJaW50IGNtZF9iYWNrbG9nOworCXUzMiAgICBsYXN0X2NtZDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlpbnQgbmV4dF90eF9jbWQ7CisJaW50IG9wdGlvbnM7CisJc3BpbmxvY2tfdCBsb2NrOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJc3RydWN0IGRldmljZSAqZGV2OworfTsKKworc3RhdGljIGNoYXIgaW5pdF9zZXR1cFtdID0KK3sKKwkweDhFLAkJCS8qIGxlbmd0aCwgcHJlZmV0Y2ggb24gKi8KKwkweEM4LAkJCS8qIGZpZm8gdG8gOCwgbW9uaXRvciBvZmYgKi8KKwkweDgwLAkJCS8qIGRvbid0IHNhdmUgYmFkIGZyYW1lcyAqLworCTB4MkUsCQkJLyogTm8gc291cmNlIGFkZHJlc3MgaW5zZXJ0aW9uLCA4IGJ5dGUgcHJlYW1ibGUgKi8KKwkweDAwLAkJCS8qIHByaW9yaXR5IGFuZCBiYWNrb2ZmIGRlZmF1bHRzICovCisJMHg2MCwJCQkvKiBpbnRlcmZyYW1lIHNwYWNpbmcgKi8KKwkweDAwLAkJCS8qIHNsb3QgdGltZSBMU0IgKi8KKwkweGYyLAkJCS8qIHNsb3QgdGltZSBhbmQgcmV0cmllcyAqLworCTB4MDAsCQkJLyogcHJvbWlzY3VvdXMgbW9kZSAqLworCTB4MDAsCQkJLyogY29sbGlzaW9uIGRldGVjdCAqLworCTB4NDAsCQkJLyogbWluaW11bSBmcmFtZSBsZW5ndGggKi8KKwkweGZmLAorCTB4MDAsCisJMHg3ZiAvKiAgKm11bHRpIElBICovIH07CisKK3N0YXRpYyBpbnQgaTU5Nl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpNTk2X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgaTU5Nl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IGk1OTZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmk1OTZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaTU5Nl9hZGRfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpNTk2X2NtZCAqY21kKTsKK3N0YXRpYyB2b2lkIGk1OTZfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBwcmludF9ldGgodW5zaWduZWQgY2hhciAqYnVmLCBjaGFyICpzdHIpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IHJ4X3Jpbmdfc2l6ZSA9IFJYX1JJTkdfU0laRTsKK3N0YXRpYyBpbnQgdGlja3NfbGltaXQgPSAxMDA7CitzdGF0aWMgaW50IG1heF9jbWRfYmFja2xvZyA9IFRYX1JJTkdfU0laRS0xOworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBDQShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWdzY193cml0ZWwoMCwgZGV2LT5iYXNlX2FkZHIgKyBQQV9DSEFOTkVMX0FUVEVOVElPTik7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIE1QVV9QT1JUKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjLCBkbWFfYWRkcl90IHgpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisKKwl1MzIgdiA9ICh1MzIpIChjKSB8ICh1MzIpICh4KTsKKwl1MTYgYSwgYjsKKworCWlmIChscC0+b3B0aW9ucyAmIE9QVF9TV0FQX1BPUlQpIHsKKwkJYSA9IHYgPj4gMTY7CisJCWIgPSB2ICYgMHhmZmZmOworCX0gZWxzZSB7CisJCWEgPSB2ICYgMHhmZmZmOworCQliID0gdiA+PiAxNjsKKwl9CisKKwlnc2Nfd3JpdGVsKGEsIGRldi0+YmFzZV9hZGRyICsgUEFfQ1BVX1BPUlRfTF9BQ0NFU1MpOworCXVkZWxheSgxKTsKKwlnc2Nfd3JpdGVsKGIsIGRldi0+YmFzZV9hZGRyICsgUEFfQ1BVX1BPUlRfTF9BQ0NFU1MpOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHdhaXRfaXN0YXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAsIGludCBkZWxjbnQsIGNoYXIgKnN0cikKK3sKKwlDSEVDS19JTlYoJihscC0+aXNjcCksIHNpemVvZihzdHJ1Y3QgaTU5Nl9pc2NwKSk7CisJd2hpbGUgKC0tZGVsY250ICYmIGxwLT5pc2NwLnN0YXQpIHsKKwkJdWRlbGF5KDEwKTsKKwkJQ0hFQ0tfSU5WKCYobHAtPmlzY3ApLCBzaXplb2Yoc3RydWN0IGk1OTZfaXNjcCkpOworCX0KKwlpZiAoIWRlbGNudCkgeworCQlwcmludGsoIiVzOiAlcywgaXNjcC5zdGF0ICUwNHgsIGRpZG4ndCBjbGVhclxuIiwKKwkJICAgICBkZXYtPm5hbWUsIHN0ciwgbHAtPmlzY3Auc3RhdCk7CisJCXJldHVybiAtMTsKKwl9CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIGludCB3YWl0X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCwgaW50IGRlbGNudCwgY2hhciAqc3RyKQoreworCUNIRUNLX0lOVigmKGxwLT5zY2IpLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7CisJd2hpbGUgKC0tZGVsY250ICYmIGxwLT5zY2IuY29tbWFuZCkgeworCQl1ZGVsYXkoMTApOworCQlDSEVDS19JTlYoJihscC0+c2NiKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCX0KKwlpZiAoIWRlbGNudCkgeworCQlwcmludGsoIiVzOiAlcywgc3RhdHVzICU0LjR4LCBjbWQgJTQuNHguXG4iLAorCQkgICAgIGRldi0+bmFtZSwgc3RyLCBscC0+c2NiLnN0YXR1cywgbHAtPnNjYi5jb21tYW5kKTsKKwkJcmV0dXJuIC0xOworCX0KKwllbHNlCisJCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGk1OTZfZGlzcGxheV9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IGk1OTZfY21kICpjbWQ7CisJc3RydWN0IGk1OTZfcmZkICpyZmQ7CisJc3RydWN0IGk1OTZfcmJkICpyYmQ7CisKKwlwcmludGsoImxwIGFuZCBzY3AgYXQgJXAsIC5zeXNidXMgPSAlMDh4LCAuaXNjcCA9ICUwOHhcbiIsCisJICAgICAgICZscC0+c2NwLCBscC0+c2NwLnN5c2J1cywgbHAtPnNjcC5pc2NwKTsKKwlwcmludGsoImlzY3AgYXQgJXAsIGlzY3Auc3RhdCA9ICUwOHgsIC5zY2IgPSAlMDh4XG4iLAorCSAgICAgICAmbHAtPmlzY3AsIGxwLT5pc2NwLnN0YXQsIGxwLT5pc2NwLnNjYik7CisJcHJpbnRrKCJzY2IgYXQgJXAsIHNjYi5zdGF0dXMgPSAlMDR4LCAuY29tbWFuZCA9ICUwNHgsIgorCQkiIC5jbWQgPSAlMDh4LCAucmZkID0gJTA4eFxuIiwKKwkgICAgICAgJmxwLT5zY2IsIGxwLT5zY2Iuc3RhdHVzLCBscC0+c2NiLmNvbW1hbmQsCisJCWxwLT5zY2IuY21kLCBscC0+c2NiLnJmZCk7CisJcHJpbnRrKCIgICBlcnJvcnM6IGNyYyAleCwgYWxpZ24gJXgsIHJlc291cmNlICV4LCIKKyAgICAgICAgICAgICAgICIgb3ZlciAleCwgcmN2ZHQgJXgsIHNob3J0ICV4XG4iLAorCQlscC0+c2NiLmNyY19lcnIsIGxwLT5zY2IuYWxpZ25fZXJyLCBscC0+c2NiLnJlc291cmNlX2VyciwKKwkJbHAtPnNjYi5vdmVyX2VyciwgbHAtPnNjYi5yY3ZkdF9lcnIsIGxwLT5zY2Iuc2hvcnRfZXJyKTsKKwljbWQgPSBscC0+Y21kX2hlYWQ7CisJd2hpbGUgKGNtZCAhPSBOVUxMKSB7CisJCXByaW50aygiY21kIGF0ICVwLCAuc3RhdHVzID0gJTA0eCwgLmNvbW1hbmQgPSAlMDR4LCAuYl9uZXh0ID0gJTA4eFxuIiwKKwkJICBjbWQsIGNtZC0+c3RhdHVzLCBjbWQtPmNvbW1hbmQsIGNtZC0+Yl9uZXh0KTsKKwkJY21kID0gY21kLT52X25leHQ7CisJfQorCXJmZCA9IGxwLT5yZmRfaGVhZDsKKwlwcmludGsoInJmZF9oZWFkID0gJXBcbiIsIHJmZCk7CisJZG8geworCQlwcmludGsoIiAgICVwIC5zdGF0ICUwNHgsIC5jbWQgJTA0eCwgYl9uZXh0ICUwOHgsIHJiZCAlMDh4LCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgY291bnQgJTA0eFxuIiwKKwkJCXJmZCwgcmZkLT5zdGF0LCByZmQtPmNtZCwgcmZkLT5iX25leHQsIHJmZC0+cmJkLAorCQkJcmZkLT5jb3VudCk7CisJCXJmZCA9IHJmZC0+dl9uZXh0OworCX0gd2hpbGUgKHJmZCAhPSBscC0+cmZkX2hlYWQpOworCXJiZCA9IGxwLT5yYmRfaGVhZDsKKwlwcmludGsoInJiZF9oZWFkID0gJXBcbiIsIHJiZCk7CisJZG8geworCQlwcmludGsoIiAgICVwIC5jb3VudCAlMDR4LCBiX25leHQgJTA4eCwgYl9kYXRhICUwOHgsIHNpemUgJTA0eFxuIiwKKwkJCXJiZCwgcmJkLT5jb3VudCwgcmJkLT5iX25leHQsIHJiZC0+Yl9kYXRhLCByYmQtPnNpemUpOworCQlyYmQgPSByYmQtPnZfbmV4dDsKKwl9IHdoaWxlIChyYmQgIT0gbHAtPnJiZF9oZWFkKTsKKwlDSEVDS19JTlYobHAsIHNpemVvZihzdHJ1Y3QgaTU5Nl9wcml2YXRlKSk7Cit9CisKKworI2lmIGRlZmluZWQoRU5BQkxFX01WTUUxNnhfTkVUKSB8fCBkZWZpbmVkKEVOQUJMRV9CVk1FNjAwMF9ORVQpCitzdGF0aWMgdm9pZCBpNTk2X2Vycm9yKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwY2MyID0gKHVuc2lnbmVkIGNoYXIgKikgMHhmZmY0MjAwMDsKKworCXBjYzJbMHgyOF0gPSAxOworCXBjYzJbMHgyYl0gPSAweDFkOworCXByaW50aygiJXM6IEVycm9yIGludGVycnVwdFxuIiwgZGV2LT5uYW1lKTsKKwlpNTk2X2Rpc3BsYXlfZGF0YShkZXYpOworfQorI2VuZGlmCisKKyNkZWZpbmUgdmlydF90b19kbWEobHAsdikgKChscCktPmRtYV9hZGRyICsgKGRtYV9hZGRyX3QpKCh1bnNpZ25lZCBsb25nKSh2KS0odW5zaWduZWQgbG9uZykobHApKSkKKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfcnhfYnVmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCWludCBpOworCXN0cnVjdCBpNTk2X3JmZCAqcmZkOworCXN0cnVjdCBpNTk2X3JiZCAqcmJkOworCisJLyogRmlyc3QgYnVpbGQgdGhlIFJlY2VpdmUgQnVmZmVyIERlc2NyaXB0b3IgTGlzdCAqLworCisJZm9yIChpID0gMCwgcmJkID0gbHAtPnJiZHM7IGkgPCByeF9yaW5nX3NpemU7IGkrKywgcmJkKyspIHsKKwkJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWiArIDQpOworCisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXBhbmljKCIlczogYWxsb2Nfc2tiKCkgZmFpbGVkIiwgX19GSUxFX18pOworCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGxwLT5kZXYsIHNrYi0+dGFpbCxQS1RfQlVGX1NaLAorCQkJCQkgIERNQV9GUk9NX0RFVklDRSk7CisJCXNrYi0+ZGV2ID0gZGV2OworCQlyYmQtPnZfbmV4dCA9IHJiZCsxOworCQlyYmQtPmJfbmV4dCA9IFdTV0FQcmJkKHZpcnRfdG9fZG1hKGxwLHJiZCsxKSk7CisJCXJiZC0+Yl9hZGRyID0gV1NXQVByYmQodmlydF90b19kbWEobHAscmJkKSk7CisJCXJiZC0+c2tiID0gc2tiOworCQlyYmQtPnZfZGF0YSA9IHNrYi0+dGFpbDsKKwkJcmJkLT5iX2RhdGEgPSBXU1dBUGNoYXIoZG1hX2FkZHIpOworCQlyYmQtPnNpemUgPSBQS1RfQlVGX1NaOworCX0KKwlscC0+cmJkX2hlYWQgPSBscC0+cmJkczsKKwlyYmQgPSBscC0+cmJkcyArIHJ4X3Jpbmdfc2l6ZSAtIDE7CisJcmJkLT52X25leHQgPSBscC0+cmJkczsKKwlyYmQtPmJfbmV4dCA9IFdTV0FQcmJkKHZpcnRfdG9fZG1hKGxwLGxwLT5yYmRzKSk7CisKKwkvKiBOb3cgYnVpbGQgdGhlIFJlY2VpdmUgRnJhbWUgRGVzY3JpcHRvciBMaXN0ICovCisKKwlmb3IgKGkgPSAwLCByZmQgPSBscC0+cmZkczsgaSA8IHJ4X3Jpbmdfc2l6ZTsgaSsrLCByZmQrKykgeworCQlyZmQtPnJiZCA9IEk1OTZfTlVMTDsKKwkJcmZkLT52X25leHQgPSByZmQrMTsKKwkJcmZkLT52X3ByZXYgPSByZmQtMTsKKwkJcmZkLT5iX25leHQgPSBXU1dBUHJmZCh2aXJ0X3RvX2RtYShscCxyZmQrMSkpOworCQlyZmQtPmNtZCA9IENNRF9GTEVYOworCX0KKwlscC0+cmZkX2hlYWQgPSBscC0+cmZkczsKKwlscC0+c2NiLnJmZCA9IFdTV0FQcmZkKHZpcnRfdG9fZG1hKGxwLGxwLT5yZmRzKSk7CisJcmZkID0gbHAtPnJmZHM7CisJcmZkLT5yYmQgPSBXU1dBUHJiZCh2aXJ0X3RvX2RtYShscCxscC0+cmJkX2hlYWQpKTsKKwlyZmQtPnZfcHJldiA9IGxwLT5yZmRzICsgcnhfcmluZ19zaXplIC0gMTsKKwlyZmQgPSBscC0+cmZkcyArIHJ4X3Jpbmdfc2l6ZSAtIDE7CisJcmZkLT52X25leHQgPSBscC0+cmZkczsKKwlyZmQtPmJfbmV4dCA9IFdTV0FQcmZkKHZpcnRfdG9fZG1hKGxwLGxwLT5yZmRzKSk7CisJcmZkLT5jbWQgPSBDTURfRU9MfENNRF9GTEVYOworCisJQ0hFQ0tfV0JBQ0tfSU5WKGxwLCBzaXplb2Yoc3RydWN0IGk1OTZfcHJpdmF0ZSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVtb3ZlX3J4X2J1ZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgaTU5Nl9yYmQgKnJiZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDAsIHJiZCA9IGxwLT5yYmRzOyBpIDwgcnhfcmluZ19zaXplOyBpKyssIHJiZCsrKSB7CisJCWlmIChyYmQtPnNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWRtYV91bm1hcF9zaW5nbGUobHAtPmRldiwKKwkJCQkgKGRtYV9hZGRyX3QpV1NXQVBjaGFyKHJiZC0+Yl9kYXRhKSwgCisJCQkJIFBLVF9CVUZfU1osIERNQV9GUk9NX0RFVklDRSk7CisJCWRldl9rZnJlZV9za2IocmJkLT5za2IpOworCX0KK30KKworCitzdGF0aWMgdm9pZCByZWJ1aWxkX3J4X2J1ZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCS8qIEVuc3VyZSByeCBmcmFtZS9idWZmZXIgZGVzY3JpcHRvcnMgYXJlIHRpZHkgKi8KKworCWZvciAoaSA9IDA7IGkgPCByeF9yaW5nX3NpemU7IGkrKykgeworCQlscC0+cmZkc1tpXS5yYmQgPSBJNTk2X05VTEw7CisJCWxwLT5yZmRzW2ldLmNtZCA9IENNRF9GTEVYOworCX0KKwlscC0+cmZkc1tyeF9yaW5nX3NpemUtMV0uY21kID0gQ01EX0VPTHxDTURfRkxFWDsKKwlscC0+cmZkX2hlYWQgPSBscC0+cmZkczsKKwlscC0+c2NiLnJmZCA9IFdTV0FQcmZkKHZpcnRfdG9fZG1hKGxwLGxwLT5yZmRzKSk7CisJbHAtPnJiZF9oZWFkID0gbHAtPnJiZHM7CisJbHAtPnJmZHNbMF0ucmJkID0gV1NXQVByYmQodmlydF90b19kbWEobHAsbHAtPnJiZHMpKTsKKworCUNIRUNLX1dCQUNLX0lOVihscCwgc2l6ZW9mKHN0cnVjdCBpNTk2X3ByaXZhdGUpKTsKK30KKworCitzdGF0aWMgaW50IGluaXRfaTU5Nl9tZW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOwkvKiBkaXNhYmxlIElSUXMgZnJvbSBMQU4gKi8KKwlERUIoREVCX0lOSVQsCisJCXByaW50aygiUkVTRVQgODI1OTYgcG9ydDogJXAgKHdpdGggSVJRICVkIGRpc2FibGVkKVxuIiwKKwkJICAgICAgICh2b2lkKikoZGV2LT5iYXNlX2FkZHIgKyBQQV9JODI1OTZfUkVTRVQpLAorCQkgICAgICAgZGV2LT5pcnEpKTsKKwkKKwlnc2Nfd3JpdGVsKDAsICh2b2lkKikoZGV2LT5iYXNlX2FkZHIgKyBQQV9JODI1OTZfUkVTRVQpKTsgLyogSGFyZCBSZXNldCAqLworCXVkZWxheSgxMDApOwkJCS8qIFdhaXQgMTAwdXMgLSBzZWVtcyB0byBoZWxwICovCisKKwkvKiBjaGFuZ2UgdGhlIHNjcCBhZGRyZXNzICovCisKKwlscC0+bGFzdF9jbWQgPSBqaWZmaWVzOworCisKKwlscC0+c2NwLnN5c2J1cyA9IDB4MDAwMDAwNmM7CisJbHAtPnNjcC5pc2NwID0gV1NXQVBpc2NwKHZpcnRfdG9fZG1hKGxwLCYobHAtPmlzY3ApKSk7CisJbHAtPmlzY3Auc2NiID0gV1NXQVBzY2IodmlydF90b19kbWEobHAsJihscC0+c2NiKSkpOworCWxwLT5pc2NwLnN0YXQgPSBJU0NQX0JVU1k7CisJbHAtPmNtZF9iYWNrbG9nID0gMDsKKworCWxwLT5jbWRfaGVhZCA9IE5VTEw7CisgICAgICAgIGxwLT5zY2IuY21kID0gSTU5Nl9OVUxMOworCisJREVCKERFQl9JTklULCBwcmludGsoIiVzOiBzdGFydGluZyBpODI1OTYuXG4iLCBkZXYtPm5hbWUpKTsKKworCUNIRUNLX1dCQUNLKCYobHAtPnNjcCksIHNpemVvZihzdHJ1Y3QgaTU5Nl9zY3ApKTsKKwlDSEVDS19XQkFDSygmKGxwLT5pc2NwKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X2lzY3ApKTsKKworCU1QVV9QT1JUKGRldiwgUE9SVF9BTFRTQ1AsIHZpcnRfdG9fZG1hKGxwLCZscC0+c2NwKSk7CQorCisJQ0EoZGV2KTsKKworCWlmICh3YWl0X2lzdGF0KGRldiwgbHAsIDEwMDAsICJpbml0aWFsaXphdGlvbiB0aW1lZCBvdXQiKSkKKwkJZ290byBmYWlsZWQ7CisJREVCKERFQl9JTklULCBwcmludGsoIiVzOiBpODI1OTYgaW5pdGlhbGl6YXRpb24gc3VjY2Vzc2Z1bFxuIiwgZGV2LT5uYW1lKSk7CisKKwkvKiBFbnN1cmUgcnggZnJhbWUvYnVmZmVyIGRlc2NyaXB0b3JzIGFyZSB0aWR5ICovCisJcmVidWlsZF9yeF9idWZzKGRldik7CisKKwlscC0+c2NiLmNvbW1hbmQgPSAwOworCUNIRUNLX1dCQUNLKCYobHAtPnNjYiksIHNpemVvZihzdHJ1Y3QgaTU5Nl9zY2IpKTsKKworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOwkvKiBlbmFibGUgSVJRcyBmcm9tIExBTiAqLworCisJREVCKERFQl9JTklULCBwcmludGsoIiVzOiBxdWV1aW5nIENtZENvbmZpZ3VyZVxuIiwgZGV2LT5uYW1lKSk7CisJbWVtY3B5KGxwLT5jZl9jbWQuaTU5Nl9jb25maWcsIGluaXRfc2V0dXAsIDE0KTsKKwlscC0+Y2ZfY21kLmNtZC5jb21tYW5kID0gQ21kQ29uZmlndXJlOworCUNIRUNLX1dCQUNLKCYobHAtPmNmX2NtZCksIHNpemVvZihzdHJ1Y3QgY2ZfY21kKSk7CisJaTU5Nl9hZGRfY21kKGRldiwgJmxwLT5jZl9jbWQuY21kKTsKKworCURFQihERUJfSU5JVCwgcHJpbnRrKCIlczogcXVldWluZyBDbWRTQVNldHVwXG4iLCBkZXYtPm5hbWUpKTsKKwltZW1jcHkobHAtPnNhX2NtZC5ldGhfYWRkciwgZGV2LT5kZXZfYWRkciwgNik7CisJbHAtPnNhX2NtZC5jbWQuY29tbWFuZCA9IENtZFNBU2V0dXA7CisJQ0hFQ0tfV0JBQ0soJihscC0+c2FfY21kKSwgc2l6ZW9mKHN0cnVjdCBzYV9jbWQpKTsKKwlpNTk2X2FkZF9jbWQoZGV2LCAmbHAtPnNhX2NtZC5jbWQpOworCisJREVCKERFQl9JTklULCBwcmludGsoIiVzOiBxdWV1aW5nIENtZFREUlxuIiwgZGV2LT5uYW1lKSk7CisJbHAtPnRkcl9jbWQuY21kLmNvbW1hbmQgPSBDbWRURFI7CisJQ0hFQ0tfV0JBQ0soJihscC0+dGRyX2NtZCksIHNpemVvZihzdHJ1Y3QgdGRyX2NtZCkpOworCWk1OTZfYWRkX2NtZChkZXYsICZscC0+dGRyX2NtZC5jbWQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZscC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHdhaXRfY21kKGRldiwgbHAsIDEwMDAsICJ0aW1lZCBvdXQgd2FpdGluZyB0byBpc3N1ZSBSWF9TVEFSVCIpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZscC0+bG9jaywgZmxhZ3MpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJREVCKERFQl9JTklULCBwcmludGsoIiVzOiBJc3N1aW5nIFJYX1NUQVJUXG4iLCBkZXYtPm5hbWUpKTsKKwlscC0+c2NiLmNvbW1hbmQgPSBSWF9TVEFSVDsKKwlscC0+c2NiLnJmZCA9IFdTV0FQcmZkKHZpcnRfdG9fZG1hKGxwLGxwLT5yZmRzKSk7CisJQ0hFQ0tfV0JBQ0soJihscC0+c2NiKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCisJQ0EoZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZscC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHdhaXRfY21kKGRldiwgbHAsIDEwMDAsICJSWF9TVEFSVCBub3QgcHJvY2Vzc2VkIikpCisJCWdvdG8gZmFpbGVkOworCURFQihERUJfSU5JVCwgcHJpbnRrKCIlczogUmVjZWl2ZSB1bml0IHN0YXJ0ZWQgT0tcbiIsIGRldi0+bmFtZSkpOworCisJcmV0dXJuIDA7CisKK2ZhaWxlZDoKKwlwcmludGsoIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGlzZSA4MjU5NlxuIiwgZGV2LT5uYW1lKTsKKwlNUFVfUE9SVChkZXYsIFBPUlRfUkVTRVQsIDApOworCXJldHVybiAtMTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBpNTk2X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IGk1OTZfcmZkICpyZmQ7CisJc3RydWN0IGk1OTZfcmJkICpyYmQ7CisJaW50IGZyYW1lcyA9IDA7CisKKwlERUIoREVCX1JYRlJBTUUsIHByaW50aygiaTU5Nl9yeCgpLCByZmRfaGVhZCAlcCwgcmJkX2hlYWQgJXBcbiIsCisJCQlscC0+cmZkX2hlYWQsIGxwLT5yYmRfaGVhZCkpOworCisKKwlyZmQgPSBscC0+cmZkX2hlYWQ7CQkvKiBSZWYgbmV4dCBmcmFtZSB0byBjaGVjayAqLworCisJQ0hFQ0tfSU5WKHJmZCwgc2l6ZW9mKHN0cnVjdCBpNTk2X3JmZCkpOworCXdoaWxlICgocmZkLT5zdGF0KSAmIFNUQVRfQykgewkvKiBMb29wIHdoaWxlIGNvbXBsZXRlIGZyYW1lcyAqLworCQlpZiAocmZkLT5yYmQgPT0gSTU5Nl9OVUxMKQorCQkJcmJkID0gTlVMTDsKKwkJZWxzZSBpZiAocmZkLT5yYmQgPT0gbHAtPnJiZF9oZWFkLT5iX2FkZHIpIHsKKwkJCXJiZCA9IGxwLT5yYmRfaGVhZDsKKwkJCUNIRUNLX0lOVihyYmQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9yYmQpKTsKKwkJfQorCQllbHNlIHsKKwkJCXByaW50aygiJXM6IHJiZCBjaGFpbiBicm9rZW4hXG4iLCBkZXYtPm5hbWUpOworCQkJLyogWFhYIE5vdyB3aGF0PyAqLworCQkJcmJkID0gTlVMTDsKKwkJfQorCQlERUIoREVCX1JYRlJBTUUsIHByaW50aygiICByZmQgJXAsIHJmZC5yYmQgJTA4eCwgcmZkLnN0YXQgJTA0eFxuIiwKKwkJCXJmZCwgcmZkLT5yYmQsIHJmZC0+c3RhdCkpOworCQkKKwkJaWYgKHJiZCAhPSBOVUxMICYmICgocmZkLT5zdGF0KSAmIFNUQVRfT0spKSB7CisJCQkvKiBhIGdvb2QgZnJhbWUgKi8KKwkJCWludCBwa3RfbGVuID0gcmJkLT5jb3VudCAmIDB4M2ZmZjsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSByYmQtPnNrYjsKKwkJCWludCByeF9pbl9wbGFjZSA9IDA7CisKKwkJCURFQihERUJfUlhBRERSLHByaW50X2V0aChyYmQtPnZfZGF0YSwgInJlY2VpdmVkIikpOworCQkJZnJhbWVzKys7CisKKwkJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8ganVzdCBhY2NlcHQKKwkJCSAqIHdpdGhvdXQgY29weWluZyB0byBhIHByb3Blcmx5IHNpemVkIHNrYnVmZi4KKwkJCSAqLworCisJCQlpZiAocGt0X2xlbiA+IHJ4X2NvcHlicmVhaykgeworCQkJCXN0cnVjdCBza19idWZmICpuZXdza2I7CisJCQkJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCQkJCWRtYV91bm1hcF9zaW5nbGUobHAtPmRldiwoZG1hX2FkZHJfdClXU1dBUGNoYXIocmJkLT5iX2RhdGEpLCBQS1RfQlVGX1NaLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJCS8qIEdldCBmcmVzaCBza2J1ZmYgdG8gcmVwbGFjZSBmaWxsZWQgb25lLiAqLworCQkJCW5ld3NrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWiArIDQpOworCQkJCWlmIChuZXdza2IgPT0gTlVMTCkgeworCQkJCQlza2IgPSBOVUxMOwkvKiBkcm9wIHBrdCAqLworCQkJCQlnb3RvIG1lbW9yeV9zcXVlZXplOworCQkJCX0KKwkJCQlza2JfcmVzZXJ2ZShuZXdza2IsIDIpOworCisJCQkJLyogUGFzcyB1cCB0aGUgc2tiIGFscmVhZHkgb24gdGhlIFJ4IHJpbmcuICovCisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCXJ4X2luX3BsYWNlID0gMTsKKwkJCQlyYmQtPnNrYiA9IG5ld3NrYjsKKwkJCQluZXdza2ItPmRldiA9IGRldjsKKwkJCQlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGxwLT5kZXYsIG5ld3NrYi0+dGFpbCwgUEtUX0JVRl9TWiwgRE1BX0ZST01fREVWSUNFKTsKKwkJCQlyYmQtPnZfZGF0YSA9IG5ld3NrYi0+dGFpbDsKKwkJCQlyYmQtPmJfZGF0YSA9IFdTV0FQY2hhcihkbWFfYWRkcik7CisJCQkJQ0hFQ0tfV0JBQ0tfSU5WKHJiZCwgc2l6ZW9mKHN0cnVjdCBpNTk2X3JiZCkpOworCQkJfQorCQkJZWxzZQorCQkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpOworbWVtb3J5X3NxdWVlemU6CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQkvKiBYWFggdHVsaXAuYyBjYW4gZGVmZXIgcGFja2V0cyBoZXJlISEgKi8KKwkJCQlwcmludGsoIiVzOiBpNTk2X3J4IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQl9CisJCQllbHNlIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlpZiAoIXJ4X2luX3BsYWNlKSB7CisJCQkJCS8qIDE2IGJ5dGUgYWxpZ24gdGhlIGRhdGEgZmllbGRzICovCisJCQkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGxwLT5kZXYsIChkbWFfYWRkcl90KVdTV0FQY2hhcihyYmQtPmJfZGF0YSksIFBLVF9CVUZfU1osIERNQV9GUk9NX0RFVklDRSk7CisJCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCQkJCW1lbWNweShza2JfcHV0KHNrYixwa3RfbGVuKSwgcmJkLT52X2RhdGEsIHBrdF9sZW4pOworCQkJCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShscC0+ZGV2LCAoZG1hX2FkZHJfdClXU1dBUGNoYXIocmJkLT5iX2RhdGEpLCBQS1RfQlVGX1NaLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJCX0KKwkJCQlza2ItPmxlbiA9IHBrdF9sZW47CisJCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlscC0+c3RhdHMucnhfYnl0ZXMrPXBrdF9sZW47CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlERUIoREVCX0VSUk9SUywgcHJpbnRrKCIlczogRXJyb3IsIHJmZC5zdGF0ID0gMHglMDR4XG4iLAorCQkJCQlkZXYtPm5hbWUsIHJmZC0+c3RhdCkpOworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKChyZmQtPnN0YXQpICYgMHgwMDAxKQorCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCQlpZiAoKHJmZC0+c3RhdCkgJiAweDAwODApCisJCQkJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmICgocmZkLT5zdGF0KSAmIDB4MDEwMCkKKwkJCQlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmICgocmZkLT5zdGF0KSAmIDB4MDIwMCkKKwkJCQlscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCWlmICgocmZkLT5zdGF0KSAmIDB4MDQwMCkKKwkJCQlscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoKHJmZC0+c3RhdCkgJiAweDA4MDApCisJCQkJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmICgocmZkLT5zdGF0KSAmIDB4MTAwMCkKKwkJCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9CisKKwkJLyogQ2xlYXIgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yIGNvdW50IGFuZCBFT0YgKyBGIGZsYWdzICovCisKKwkJaWYgKHJiZCAhPSBOVUxMICYmIChyYmQtPmNvdW50ICYgMHg0MDAwKSkgeworCQkJcmJkLT5jb3VudCA9IDA7CisJCQlscC0+cmJkX2hlYWQgPSByYmQtPnZfbmV4dDsKKwkJCUNIRUNLX1dCQUNLX0lOVihyYmQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9yYmQpKTsKKwkJfQorCisJCS8qIFRpZHkgdGhlIGZyYW1lIGRlc2NyaXB0b3IsIG1hcmtpbmcgaXQgYXMgZW5kIG9mIGxpc3QgKi8KKworCQlyZmQtPnJiZCA9IEk1OTZfTlVMTDsKKwkJcmZkLT5zdGF0ID0gMDsKKwkJcmZkLT5jbWQgPSBDTURfRU9MfENNRF9GTEVYOworCQlyZmQtPmNvdW50ID0gMDsKKworCQkvKiBSZW1vdmUgZW5kLW9mLWxpc3QgZnJvbSBvbGQgZW5kIGRlc2NyaXB0b3IgKi8KKworCQlyZmQtPnZfcHJldi0+Y21kID0gQ01EX0ZMRVg7CisKKwkJLyogVXBkYXRlIHJlY29yZCBvZiBuZXh0IGZyYW1lIGRlc2NyaXB0b3IgdG8gcHJvY2VzcyAqLworCisJCWxwLT5zY2IucmZkID0gcmZkLT5iX25leHQ7CisJCWxwLT5yZmRfaGVhZCA9IHJmZC0+dl9uZXh0OworCQlDSEVDS19XQkFDS19JTlYocmZkLT52X3ByZXYsIHNpemVvZihzdHJ1Y3QgaTU5Nl9yZmQpKTsKKwkJQ0hFQ0tfV0JBQ0tfSU5WKHJmZCwgc2l6ZW9mKHN0cnVjdCBpNTk2X3JmZCkpOworCQlyZmQgPSBscC0+cmZkX2hlYWQ7CisJCUNIRUNLX0lOVihyZmQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9yZmQpKTsKKwl9CisKKwlERUIoREVCX1JYRlJBTUUsIHByaW50aygiZnJhbWVzICVkXG4iLCBmcmFtZXMpKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpNTk2X2NsZWFudXBfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwKQoreworCXN0cnVjdCBpNTk2X2NtZCAqcHRyOworCisJd2hpbGUgKGxwLT5jbWRfaGVhZCAhPSBOVUxMKSB7CisJCXB0ciA9IGxwLT5jbWRfaGVhZDsKKwkJbHAtPmNtZF9oZWFkID0gcHRyLT52X25leHQ7CisJCWxwLT5jbWRfYmFja2xvZy0tOworCisJCXN3aXRjaCAoKHB0ci0+Y29tbWFuZCkgJiAweDcpIHsKKwkJY2FzZSBDbWRUeDoKKwkJCXsKKwkJCQlzdHJ1Y3QgdHhfY21kICp0eF9jbWQgPSAoc3RydWN0IHR4X2NtZCAqKSBwdHI7CisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4X2NtZC0+c2tiOworCQkJCWRtYV91bm1hcF9zaW5nbGUobHAtPmRldiwgdHhfY21kLT5kbWFfYWRkciwgc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCisJCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCisJCQkJcHRyLT52X25leHQgPSBOVUxMOworCQkJCXB0ci0+Yl9uZXh0ID0gSTU5Nl9OVUxMOworCQkJCXR4X2NtZC0+Y21kLmNvbW1hbmQgPSAwOyAgLyogTWFyayBhcyBmcmVlICovCisJCQkJYnJlYWs7CisJCQl9CisJCWRlZmF1bHQ6CisJCQlwdHItPnZfbmV4dCA9IE5VTEw7CisJCQlwdHItPmJfbmV4dCA9IEk1OTZfTlVMTDsKKwkJfQorCQlDSEVDS19XQkFDS19JTlYocHRyLCBzaXplb2Yoc3RydWN0IGk1OTZfY21kKSk7CisJfQorCisJd2FpdF9jbWQoZGV2LCBscCwgMTAwLCAiaTU5Nl9jbGVhbnVwX2NtZCB0aW1lZCBvdXQiKTsKKwlscC0+c2NiLmNtZCA9IEk1OTZfTlVMTDsKKwlDSEVDS19XQkFDSygmKGxwLT5zY2IpLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGk1OTZfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURFQihERUJfUkVTRVQsIHByaW50aygiaTU5Nl9yZXNldFxuIikpOworCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZscC0+bG9jaywgZmxhZ3MpOworCisJd2FpdF9jbWQoZGV2LCBscCwgMTAwLCAiaTU5Nl9yZXNldCB0aW1lZCBvdXQiKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIEZJWE1FOiB0aGlzIGNvbW1hbmQgbWlnaHQgY2F1c2UgYW4gbHBtYyAqLworCWxwLT5zY2IuY29tbWFuZCA9IENVQ19BQk9SVCB8IFJYX0FCT1JUOworCUNIRUNLX1dCQUNLKCYobHAtPnNjYiksIHNpemVvZihzdHJ1Y3QgaTU5Nl9zY2IpKTsKKwlDQShkZXYpOworCisJLyogd2FpdCBmb3Igc2h1dGRvd24gKi8KKwl3YWl0X2NtZChkZXYsIGxwLCAxMDAwLCAiaTU5Nl9yZXNldCAyIHRpbWVkIG91dCIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZscC0+bG9jaywgZmxhZ3MpOworCisJaTU5Nl9jbGVhbnVwX2NtZChkZXYsbHApOworCWk1OTZfcngoZGV2KTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJaW5pdF9pNTk2X21lbShkZXYpOworfQorCisKK3N0YXRpYyB2b2lkIGk1OTZfYWRkX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaTU5Nl9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJREVCKERFQl9BRERDTUQsIHByaW50aygiaTU5Nl9hZGRfY21kIGNtZF9oZWFkICVwXG4iLCBscC0+Y21kX2hlYWQpKTsKKworCWNtZC0+c3RhdHVzID0gMDsKKwljbWQtPmNvbW1hbmQgfD0gKENNRF9FT0wgfCBDTURfSU5UUik7CisJY21kLT52X25leHQgPSBOVUxMOworCWNtZC0+Yl9uZXh0ID0gSTU5Nl9OVUxMOworCUNIRUNLX1dCQUNLKGNtZCwgc2l6ZW9mKHN0cnVjdCBpNTk2X2NtZCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZscC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGxwLT5jbWRfaGVhZCAhPSBOVUxMKSB7CisJCWxwLT5jbWRfdGFpbC0+dl9uZXh0ID0gY21kOworCQlscC0+Y21kX3RhaWwtPmJfbmV4dCA9IFdTV0FQY21kKHZpcnRfdG9fZG1hKGxwLCZjbWQtPnN0YXR1cykpOworCQlDSEVDS19XQkFDSyhscC0+Y21kX3RhaWwsIHNpemVvZihzdHJ1Y3QgaTU5Nl9jbWQpKTsKKwl9IGVsc2UgeworCQlscC0+Y21kX2hlYWQgPSBjbWQ7CisJCXdhaXRfY21kKGRldiwgbHAsIDEwMCwgImk1OTZfYWRkX2NtZCB0aW1lZCBvdXQiKTsKKwkJbHAtPnNjYi5jbWQgPSBXU1dBUGNtZCh2aXJ0X3RvX2RtYShscCwmY21kLT5zdGF0dXMpKTsKKwkJbHAtPnNjYi5jb21tYW5kID0gQ1VDX1NUQVJUOworCQlDSEVDS19XQkFDSygmKGxwLT5zY2IpLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7CisJCUNBKGRldik7CisJfQorCWxwLT5jbWRfdGFpbCA9IGNtZDsKKwlscC0+Y21kX2JhY2tsb2crKzsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZscC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGxwLT5jbWRfYmFja2xvZyA+IG1heF9jbWRfYmFja2xvZykgeworCQl1bnNpZ25lZCBsb25nIHRpY2tzc29mYXIgPSBqaWZmaWVzIC0gbHAtPmxhc3RfY21kOworCisJCWlmICh0aWNrc3NvZmFyIDwgdGlja3NfbGltaXQpCisJCQlyZXR1cm47CisKKwkJcHJpbnRrKCIlczogY29tbWFuZCB1bml0IHRpbWVkIG91dCwgc3RhdHVzIHJlc2V0dGluZy5cbiIsIGRldi0+bmFtZSk7CisjaWYgMQorCQlpNTk2X3Jlc2V0KGRldiwgbHApOworI2VuZGlmCisJfQorfQorCisjaWYgMAorLyogdGhpcyBmdW5jdGlvbiBtYWtlcyBhIHBlcmZlY3RseSBhZGVxdWF0ZSBwcm9iZS4uLiAgYnV0IHdlIGhhdmUgYQorICAgZGV2aWNlIGxpc3QgKi8KK3N0YXRpYyBpbnQgaTU5Nl90ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJdm9sYXRpbGUgaW50ICp0aW50OworCXUzMiBkYXRhOworCisJdGludCA9ICh2b2xhdGlsZSBpbnQgKikoJihscC0+c2NwKSk7CisJZGF0YSA9IHZpcnRfdG9fZG1hKGxwLHRpbnQpOworCQorCXRpbnRbMV0gPSAtMTsKKwlDSEVDS19XQkFDSyh0aW50LFBBR0VfU0laRSk7CisKKwlNUFVfUE9SVChkZXYsIDEsIGRhdGEpOworCisJZm9yKGRhdGEgPSAxMDAwMDAwOyBkYXRhOyBkYXRhLS0pIHsKKwkJQ0hFQ0tfSU5WKHRpbnQsUEFHRV9TSVpFKTsKKwkJaWYodGludFsxXSAhPSAtMSkKKwkJCWJyZWFrOworCisJfQorCisJcHJpbnRrKCJpNTk2X3Rlc3QgcmVzdWx0ICVkXG4iLCB0aW50WzFdKTsKKworfQorI2VuZGlmCisKKworc3RhdGljIGludCBpNTk2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlERUIoREVCX09QRU4sIHByaW50aygiJXM6IGk1OTZfb3BlbigpIGlycSAlZC5cbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpKTsKKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJmk1OTZfaW50ZXJydXB0LCAwLCAiaTgyNTk2IiwgZGV2KSkgeworCQlwcmludGsoIiVzOiBJUlEgJWQgbm90IGZyZWVcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlnb3RvIG91dDsKKwl9CisKKwlpbml0X3J4X2J1ZnMoZGV2KTsKKworCWlmIChpbml0X2k1OTZfbWVtKGRldikpIHsKKwkJcHJpbnRrKCIlczogRmFpbGVkIHRvIGluaXQgbWVtb3J5XG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIG91dF9yZW1vdmVfcnhfYnVmczsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7CisKK291dF9yZW1vdmVfcnhfYnVmczoKKwlyZW1vdmVfcnhfYnVmcyhkZXYpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworb3V0OgorCXJldHVybiAtRUFHQUlOOworfQorCitzdGF0aWMgdm9pZCBpNTk2X3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisKKwkvKiBUcmFuc21pdHRlciB0aW1lb3V0LCBzZXJpb3VzIHByb2JsZW1zLiAqLworCURFQihERUJfRVJST1JTLCBwcmludGsoIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyByZXNldHRpbmcuXG4iLAorCQkJZGV2LT5uYW1lKSk7CisKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvciAqLworCWlmIChscC0+bGFzdF9yZXN0YXJ0ID09IGxwLT5zdGF0cy50eF9wYWNrZXRzKSB7CisJCURFQihERUJfRVJST1JTLCBwcmludGsoIlJlc2V0dGluZyBib2FyZC5cbiIpKTsKKwkJLyogU2h1dGRvd24gYW5kIHJlc3RhcnQgKi8KKwkJaTU5Nl9yZXNldCAoZGV2LCBscCk7CisJfSBlbHNlIHsKKwkJLyogSXNzdWUgYSBjaGFubmVsIGF0dGVudGlvbiBzaWduYWwgKi8KKwkJREVCKERFQl9FUlJPUlMsIHByaW50aygiS2lja2luZyBib2FyZC5cbiIpKTsKKwkJbHAtPnNjYi5jb21tYW5kID0gQ1VDX1NUQVJUIHwgUlhfU1RBUlQ7CisJCUNIRUNLX1dCQUNLX0lOVigmKGxwLT5zY2IpLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7CisJCUNBIChkZXYpOworCQlscC0+bGFzdF9yZXN0YXJ0ID0gbHAtPnN0YXRzLnR4X3BhY2tldHM7CisJfQorCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworCitzdGF0aWMgaW50IGk1OTZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCB0eF9jbWQgKnR4X2NtZDsKKwlzdHJ1Y3QgaTU5Nl90YmQgKnRiZDsKKwlzaG9ydCBsZW5ndGggPSBza2ItPmxlbjsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCURFQihERUJfU1RBUlRUWCwgcHJpbnRrKCIlczogaTU5Nl9zdGFydF94bWl0KCV4LCVwKSBjYWxsZWRcbiIsIGRldi0+bmFtZSwKKwkJCQlza2ItPmxlbiwgc2tiLT5kYXRhKSk7CisKKwlpZiAobGVuZ3RoIDwgRVRIX1pMRU4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJbGVuZ3RoID0gRVRIX1pMRU47CisJfQorCQorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXR4X2NtZCA9IGxwLT50eF9jbWRzICsgbHAtPm5leHRfdHhfY21kOworCXRiZCA9IGxwLT50YmRzICsgbHAtPm5leHRfdHhfY21kOworCisJaWYgKHR4X2NtZC0+Y21kLmNvbW1hbmQpIHsKKwkJREVCKERFQl9FUlJPUlMsIHByaW50aygiJXM6IHhtaXQgcmluZyBmdWxsLCBkcm9wcGluZyBwYWNrZXQuXG4iLAorCQkJCWRldi0+bmFtZSkpOworCQlscC0+c3RhdHMudHhfZHJvcHBlZCsrOworCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9IGVsc2UgeworCQlpZiAoKytscC0+bmV4dF90eF9jbWQgPT0gVFhfUklOR19TSVpFKQorCQkJbHAtPm5leHRfdHhfY21kID0gMDsKKwkJdHhfY21kLT50YmQgPSBXU1dBUHRiZCh2aXJ0X3RvX2RtYShscCx0YmQpKTsKKwkJdGJkLT5uZXh0ID0gSTU5Nl9OVUxMOworCisJCXR4X2NtZC0+Y21kLmNvbW1hbmQgPSBDTURfRkxFWCB8IENtZFR4OworCQl0eF9jbWQtPnNrYiA9IHNrYjsKKworCQl0eF9jbWQtPnBhZCA9IDA7CisJCXR4X2NtZC0+c2l6ZSA9IDA7CisJCXRiZC0+cGFkID0gMDsKKwkJdGJkLT5zaXplID0gRU9GIHwgbGVuZ3RoOworCisJCXR4X2NtZC0+ZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShscC0+ZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCURNQV9UT19ERVZJQ0UpOworCQl0YmQtPmRhdGEgPSBXU1dBUGNoYXIodHhfY21kLT5kbWFfYWRkcik7CisKKwkJREVCKERFQl9UWEFERFIscHJpbnRfZXRoKHNrYi0+ZGF0YSwgInR4LXF1ZXVlZCIpKTsKKwkJQ0hFQ0tfV0JBQ0tfSU5WKHR4X2NtZCwgc2l6ZW9mKHN0cnVjdCB0eF9jbWQpKTsKKwkJQ0hFQ0tfV0JBQ0tfSU5WKHRiZCwgc2l6ZW9mKHN0cnVjdCBpNTk2X3RiZCkpOworCQlpNTk2X2FkZF9jbWQoZGV2LCAmdHhfY21kLT5jbWQpOworCisJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWxwLT5zdGF0cy50eF9ieXRlcyArPSBsZW5ndGg7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9ldGgodW5zaWduZWQgY2hhciAqYWRkLCBjaGFyICpzdHIpCit7CisJaW50IGk7CisKKwlwcmludGsoImk1OTYgMHglcCwgIiwgYWRkKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiAlMDJYIiwgYWRkW2kgKyA2XSk7CisJcHJpbnRrKCIgLS0+Iik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTAyWCIsIGFkZFtpXSk7CisJcHJpbnRrKCIgJTAyWCUwMlgsICVzXG4iLCBhZGRbMTJdLCBhZGRbMTNdLCBzdHIpOworfQorCisKKyNkZWZpbmUgTEFOX1BST01fQUREUgkweEYwODEwMDAwCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGk4MjU5Nl9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZSAqZ2VuX2RldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscDsKKwljaGFyIGV0aF9hZGRyWzZdOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisKKwkvKiBUaGlzIGxvdCBpcyBlbnN1cmUgdGhpbmdzIGhhdmUgYmVlbiBjYWNoZSBsaW5lIGFsaWduZWQuICovCisJaWYgKHNpemVvZihzdHJ1Y3QgaTU5Nl9yZmQpICE9IDMyKSB7CisJICAgIHByaW50aygiODI1OTY6IHNpemVvZihzdHJ1Y3QgaTU5Nl9yZmQpID0gJWRcbiIsCisJCQkgICAgKGludClzaXplb2Yoc3RydWN0IGk1OTZfcmZkKSk7CisJICAgIHJldHVybiAtRU5PREVWOworCX0KKwlpZiAoKHNpemVvZihzdHJ1Y3QgaTU5Nl9yYmQpICUgMzIpICE9IDApIHsKKwkgICAgcHJpbnRrKCI4MjU5Njogc2l6ZW9mKHN0cnVjdCBpNTk2X3JiZCkgPSAlZFxuIiwKKwkJCSAgICAoaW50KXNpemVvZihzdHJ1Y3QgaTU5Nl9yYmQpKTsKKwkgICAgcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICgoc2l6ZW9mKHN0cnVjdCB0eF9jbWQpICUgMzIpICE9IDApIHsKKwkgICAgcHJpbnRrKCI4MjU5Njogc2l6ZW9mKHN0cnVjdCB0eF9jbWQpID0gJWRcbiIsCisJCQkgICAgKGludClzaXplb2Yoc3RydWN0IHR4X2NtZCkpOworCSAgICByZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHNpemVvZihzdHJ1Y3QgaTU5Nl90YmQpICE9IDMyKSB7CisJICAgIHByaW50aygiODI1OTY6IHNpemVvZihzdHJ1Y3QgaTU5Nl90YmQpID0gJWRcbiIsCisJCQkgICAgKGludClzaXplb2Yoc3RydWN0IGk1OTZfdGJkKSk7CisJICAgIHJldHVybiAtRU5PREVWOworCX0KKyNpZm5kZWYgX19MUDY0X18KKwlpZiAoc2l6ZW9mKHN0cnVjdCBpNTk2X3ByaXZhdGUpID4gNDA5NikgeworCSAgICBwcmludGsoIjgyNTk2OiBzaXplb2Yoc3RydWN0IGk1OTZfcHJpdmF0ZSkgPSAlZFxuIiwKKwkJCSAgICAoaW50KXNpemVvZihzdHJ1Y3QgaTU5Nl9wcml2YXRlKSk7CisJICAgIHJldHVybiAtRU5PREVWOworCX0KKyNlbmRpZgorCisJaWYgKCFkZXYtPmJhc2VfYWRkciB8fCAhZGV2LT5pcnEpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHBkY19sYW5fc3RhdGlvbl9pZChldGhfYWRkciwgZGV2LT5iYXNlX2FkZHIpKSB7CisJCWZvciAoaT0wOyBpIDwgNjsgaSsrKSB7CisJCQlldGhfYWRkcltpXSA9IGdzY19yZWFkYihMQU5fUFJPTV9BRERSICsgaSk7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1BQyBvZiBIUDcwMCBMQU4gcmVhZCBmcm9tIEVFUFJPTVxuIiwgX19GSUxFX18pOworCX0KKworCWRldi0+bWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIGRtYV9hbGxvY19ub25jb2hlcmVudChnZW5fZGV2LCAKKwkJc2l6ZW9mKHN0cnVjdCBpNTk2X3ByaXZhdGUpLCAmZG1hX2FkZHIsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5tZW1fc3RhcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGRuJ3QgZ2V0IHNoYXJlZCBtZW1vcnlcbiIsIF9fRklMRV9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGV0aF9hZGRyW2ldOworCisJLyogVGhlIDgyNTk2LXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuID0gaTU5Nl9vcGVuOworCWRldi0+c3RvcCA9IGk1OTZfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpNTk2X3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBpNTk2X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSBpNTk2X3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisKKwlkZXYtPnByaXYgPSAodm9pZCAqKShkZXYtPm1lbV9zdGFydCk7CisKKwlscCA9IGRldi0+cHJpdjsKKwltZW1zZXQobHAsIDAsIHNpemVvZihzdHJ1Y3QgaTU5Nl9wcml2YXRlKSk7CisKKwlscC0+c2NiLmNvbW1hbmQgPSAwOworCWxwLT5zY2IuY21kID0gSTU5Nl9OVUxMOworCWxwLT5zY2IucmZkID0gSTU5Nl9OVUxMOworCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisJbHAtPmRtYV9hZGRyID0gZG1hX2FkZHI7CisJbHAtPmRldiA9IGdlbl9kZXY7CisKKwlDSEVDS19XQkFDS19JTlYoZGV2LT5tZW1fc3RhcnQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9wcml2YXRlKSk7CisKKwlpID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGkpIHsKKwkJbHAgPSBkZXYtPnByaXY7CisJCWRtYV9mcmVlX25vbmNvaGVyZW50KGxwLT5kZXYsIHNpemVvZihzdHJ1Y3QgaTU5Nl9wcml2YXRlKSwgCisJCQkJICAgICh2b2lkICopZGV2LT5tZW1fc3RhcnQsIGxwLT5kbWFfYWRkcik7CisJCXJldHVybiBpOworCX07CisKKwlERUIoREVCX1BST0JFLCBwcmludGsoS0VSTl9JTkZPICIlczogODI1OTYgYXQgJSMzbHgsIiwgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkcikpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCURFQihERUJfUFJPQkUsIHByaW50aygiICUyLjJYIiwgZGV2LT5kZXZfYWRkcltpXSkpOworCURFQihERUJfUFJPQkUsIHByaW50aygiIElSUSAlZC5cbiIsIGRldi0+aXJxKSk7CisJREVCKERFQl9JTklULCBwcmludGsoS0VSTl9JTkZPICIlczogbHAgYXQgMHglcCAoJWQgYnl0ZXMpLCBscC0+c2NiIGF0IDB4JXBcbiIsCisJCWRldi0+bmFtZSwgbHAsIChpbnQpc2l6ZW9mKHN0cnVjdCBpNTk2X3ByaXZhdGUpLCAmbHAtPnNjYikpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IGk1OTZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscDsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXMsIGFja19jbWQgPSAwOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50aygiJXM6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBfX0ZVTkNUSU9OX18sIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlscCA9IGRldi0+cHJpdjsKKworCXNwaW5fbG9jayAoJmxwLT5sb2NrKTsKKworCXdhaXRfY21kKGRldiwgbHAsIDEwMCwgImk1OTYgaW50ZXJydXB0LCB0aW1lb3V0Iik7CisJc3RhdHVzID0gbHAtPnNjYi5zdGF0dXM7CisKKwlERUIoREVCX0lOVFMsIHByaW50aygiJXM6IGk1OTYgaW50ZXJydXB0LCBJUlEgJWQsIHN0YXR1cyAlNC40eC5cbiIsCisJCQlkZXYtPm5hbWUsIGlycSwgc3RhdHVzKSk7CisKKwlhY2tfY21kID0gc3RhdHVzICYgMHhmMDAwOworCisJaWYgKCFhY2tfY21kKSB7CisJCURFQihERUJfRVJST1JTLCBwcmludGsoIiVzOiBpbnRlcnJ1cHQgd2l0aCBubyBldmVudHNcbiIsIGRldi0+bmFtZSkpOworCQlzcGluX3VubG9jayAoJmxwLT5sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmICgoc3RhdHVzICYgMHg4MDAwKSB8fCAoc3RhdHVzICYgMHgyMDAwKSkgeworCQlzdHJ1Y3QgaTU5Nl9jbWQgKnB0cjsKKworCQlpZiAoKHN0YXR1cyAmIDB4ODAwMCkpCisJCQlERUIoREVCX0lOVFMsIHByaW50aygiJXM6IGk1OTYgaW50ZXJydXB0IGNvbXBsZXRlZCBjb21tYW5kLlxuIiwgZGV2LT5uYW1lKSk7CisJCWlmICgoc3RhdHVzICYgMHgyMDAwKSkKKwkJCURFQihERUJfSU5UUywgcHJpbnRrKCIlczogaTU5NiBpbnRlcnJ1cHQgY29tbWFuZCB1bml0IGluYWN0aXZlICV4LlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMgJiAweDA3MDApKTsKKworCQl3aGlsZSAobHAtPmNtZF9oZWFkICE9IE5VTEwpIHsKKwkJCUNIRUNLX0lOVihscC0+Y21kX2hlYWQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9jbWQpKTsKKwkJCWlmICghKGxwLT5jbWRfaGVhZC0+c3RhdHVzICYgU1RBVF9DKSkKKwkJCQlicmVhazsKKworCQkJcHRyID0gbHAtPmNtZF9oZWFkOworCisJCQlERUIoREVCX1NUQVRVUywgcHJpbnRrKCJjbWRfaGVhZC0+c3RhdHVzID0gJTA0eCwgLT5jb21tYW5kID0gJTA0eFxuIiwKKwkJCQkgICAgICAgbHAtPmNtZF9oZWFkLT5zdGF0dXMsIGxwLT5jbWRfaGVhZC0+Y29tbWFuZCkpOworCQkJbHAtPmNtZF9oZWFkID0gcHRyLT52X25leHQ7CisJCQlscC0+Y21kX2JhY2tsb2ctLTsKKworCQkJc3dpdGNoICgocHRyLT5jb21tYW5kKSAmIDB4NykgeworCQkJY2FzZSBDbWRUeDoKKwkJCSAgICB7CisJCQkJc3RydWN0IHR4X2NtZCAqdHhfY21kID0gKHN0cnVjdCB0eF9jbWQgKikgcHRyOworCQkJCXN0cnVjdCBza19idWZmICpza2IgPSB0eF9jbWQtPnNrYjsKKworCQkJCWlmICgocHRyLT5zdGF0dXMpICYgU1RBVF9PSykgeworCQkJCQlERUIoREVCX1RYQUREUiwgcHJpbnRfZXRoKHNrYi0+ZGF0YSwgInR4LWRvbmUiKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCQlpZiAoKHB0ci0+c3RhdHVzKSAmIDB4MDAyMCkKKwkJCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCQkJCWlmICghKChwdHItPnN0YXR1cykgJiAweDAwNDApKQorCQkJCQkJbHAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKwkJCQkJaWYgKChwdHItPnN0YXR1cykgJiAweDA0MDApCisJCQkJCQlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQkJaWYgKChwdHItPnN0YXR1cykgJiAweDA4MDApCisJCQkJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJCQlpZiAoKHB0ci0+c3RhdHVzKSAmIDB4MTAwMCkKKwkJCQkJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCX0KKwkJCQlkbWFfdW5tYXBfc2luZ2xlKGxwLT5kZXYsIHR4X2NtZC0+ZG1hX2FkZHIsIHNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCisJCQkJdHhfY21kLT5jbWQuY29tbWFuZCA9IDA7IC8qIE1hcmsgZnJlZSAqLworCQkJCWJyZWFrOworCQkJICAgIH0KKwkJCWNhc2UgQ21kVERSOgorCQkJICAgIHsKKwkJCQl1bnNpZ25lZCBzaG9ydCBzdGF0dXMgPSAoKHN0cnVjdCB0ZHJfY21kICopcHRyKS0+c3RhdHVzOworCisJCQkJaWYgKHN0YXR1cyAmIDB4ODAwMCkgeworCQkJCQlERUIoREVCX0FOWSwgcHJpbnRrKCIlczogbGluayBvay5cbiIsIGRldi0+bmFtZSkpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChzdGF0dXMgJiAweDQwMDApCisJCQkJCQlwcmludGsoIiVzOiBUcmFuc2NlaXZlciBwcm9ibGVtLlxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJaWYgKHN0YXR1cyAmIDB4MjAwMCkKKwkJCQkJCXByaW50aygiJXM6IFRlcm1pbmF0aW9uIHByb2JsZW0uXG4iLCBkZXYtPm5hbWUpOworCQkJCQlpZiAoc3RhdHVzICYgMHgxMDAwKQorCQkJCQkJcHJpbnRrKCIlczogU2hvcnQgY2lyY3VpdC5cbiIsIGRldi0+bmFtZSk7CisKKwkJCQkJREVCKERFQl9URFIsIHByaW50aygiJXM6IFRpbWUgJWQuXG4iLCBkZXYtPm5hbWUsIHN0YXR1cyAmIDB4MDdmZikpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCSAgICB9CisJCQljYXNlIENtZENvbmZpZ3VyZToKKwkJCQkvKiBaYXAgY29tbWFuZCBzbyBzZXRfbXVsdGljYXN0X2xpc3QoKSBrbm93cyBpdCBpcyBmcmVlICovCisJCQkJcHRyLT5jb21tYW5kID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXB0ci0+dl9uZXh0ID0gTlVMTDsKKwkJICAgICAgICBwdHItPmJfbmV4dCA9IEk1OTZfTlVMTDsKKwkJCUNIRUNLX1dCQUNLKHB0ciwgc2l6ZW9mKHN0cnVjdCBpNTk2X2NtZCkpOworCQkJbHAtPmxhc3RfY21kID0gamlmZmllczsKKwkJfQorCisJCS8qIFRoaXMgbWVzcyBpcyBhcnJhbmdpbmcgdGhhdCBvbmx5IHRoZSBsYXN0IG9mIGFueSBvdXRzdGFuZGluZworCQkgKiBjb21tYW5kcyBoYXMgdGhlIGludGVycnVwdCBiaXQgc2V0LiAgU2hvdWxkIHByb2JhYmx5IHJlYWxseQorCQkgKiBvbmx5IGFkZCB0byB0aGUgY21kIHF1ZXVlIHdoZW4gdGhlIENVIGlzIHN0b3BwZWQuCisJCSAqLworCQlwdHIgPSBscC0+Y21kX2hlYWQ7CisJCXdoaWxlICgocHRyICE9IE5VTEwpICYmIChwdHIgIT0gbHAtPmNtZF90YWlsKSkgeworCQkJc3RydWN0IGk1OTZfY21kICpwcmV2ID0gcHRyOworCisJCQlwdHItPmNvbW1hbmQgJj0gMHgxZmZmOworCQkJcHRyID0gcHRyLT52X25leHQ7CisJCQlDSEVDS19XQkFDS19JTlYocHJldiwgc2l6ZW9mKHN0cnVjdCBpNTk2X2NtZCkpOworCQl9CisKKwkJaWYgKChscC0+Y21kX2hlYWQgIT0gTlVMTCkpCisJCQlhY2tfY21kIHw9IENVQ19TVEFSVDsKKwkJbHAtPnNjYi5jbWQgPSBXU1dBUGNtZCh2aXJ0X3RvX2RtYShscCwmbHAtPmNtZF9oZWFkLT5zdGF0dXMpKTsKKwkJQ0hFQ0tfV0JBQ0tfSU5WKCZscC0+c2NiLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7CisJfQorCWlmICgoc3RhdHVzICYgMHgxMDAwKSB8fCAoc3RhdHVzICYgMHg0MDAwKSkgeworCQlpZiAoKHN0YXR1cyAmIDB4NDAwMCkpCisJCQlERUIoREVCX0lOVFMsIHByaW50aygiJXM6IGk1OTYgaW50ZXJydXB0IHJlY2VpdmVkIGEgZnJhbWUuXG4iLCBkZXYtPm5hbWUpKTsKKwkJaTU5Nl9yeChkZXYpOworCQkvKiBPbmx5IFJYX1NUQVJUIGlmIHN0b3BwZWQgLSBSR0ggMDctMDctOTYgKi8KKwkJaWYgKHN0YXR1cyAmIDB4MTAwMCkgeworCQkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJCURFQihERUJfRVJST1JTLCBwcmludGsoIiVzOiBpNTk2IGludGVycnVwdCByZWNlaXZlIHVuaXQgaW5hY3RpdmUsIHN0YXR1cyAweCV4XG4iLCBkZXYtPm5hbWUsIHN0YXR1cykpOworCQkJCWFja19jbWQgfD0gUlhfU1RBUlQ7CisJCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJCXJlYnVpbGRfcnhfYnVmcyhkZXYpOworCQkJfQorCQl9CisJfQorCXdhaXRfY21kKGRldiwgbHAsIDEwMCwgImk1OTYgaW50ZXJydXB0LCB0aW1lb3V0Iik7CisJbHAtPnNjYi5jb21tYW5kID0gYWNrX2NtZDsKKwlDSEVDS19XQkFDSygmbHAtPnNjYiwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCisJLyogREFOR0VSOiBJIHN1c3BlY3QgdGhhdCBzb21lIGtpbmQgb2YgaW50ZXJydXB0CisJIGFja25vd2xlZGdlbWVudCBhc2lkZSBmcm9tIGFja2luZyB0aGUgODI1OTYgbWlnaHQgYmUgbmVlZGVkIAorCSBoZXJlLi4uICBidXQgaXQncyBydW5uaW5nIGFjY2VwdGFibHkgd2l0aG91dCAqLworCisJQ0EoZGV2KTsKKworCXdhaXRfY21kKGRldiwgbHAsIDEwMCwgImk1OTYgaW50ZXJydXB0LCBleGl0IHRpbWVvdXQiKTsKKwlERUIoREVCX0lOVFMsIHByaW50aygiJXM6IGV4aXRpbmcgaW50ZXJydXB0LlxuIiwgZGV2LT5uYW1lKSk7CisKKwlzcGluX3VubG9jayAoJmxwLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgaTU5Nl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlERUIoREVCX0lOSVQsIHByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzICU0LjR4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbHAtPnNjYi5zdGF0dXMpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJd2FpdF9jbWQoZGV2LCBscCwgMTAwLCAiY2xvc2UxIHRpbWVkIG91dCIpOworCWxwLT5zY2IuY29tbWFuZCA9IENVQ19BQk9SVCB8IFJYX0FCT1JUOworCUNIRUNLX1dCQUNLKCZscC0+c2NiLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7CisKKwlDQShkZXYpOworCisJd2FpdF9jbWQoZGV2LCBscCwgMTAwLCAiY2xvc2UyIHRpbWVkIG91dCIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJREVCKERFQl9TVFJVQ1QsaTU5Nl9kaXNwbGF5X2RhdGEoZGV2KSk7CisJaTU5Nl9jbGVhbnVwX2NtZChkZXYsbHApOworCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVtb3ZlX3J4X2J1ZnMoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorIGk1OTZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyoKKyAqICAgIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICovCisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCWludCBjb25maWcgPSAwLCBjbnQ7CisKKwlERUIoREVCX01VTFRJLCBwcmludGsoIiVzOiBzZXQgbXVsdGljYXN0IGxpc3QsICVkIGVudHJpZXMsIHByb21pc2MgJXMsIGFsbG11bHRpICVzXG4iLAorCQlkZXYtPm5hbWUsIGRldi0+bWNfY291bnQsIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyA/ICJPTiIgOiAiT0ZGIiwKKwkJZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSA/ICJPTiIgOiAiT0ZGIikpOworCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICYmICEobHAtPmNmX2NtZC5pNTk2X2NvbmZpZ1s4XSAmIDB4MDEpKSB7CisJCWxwLT5jZl9jbWQuaTU5Nl9jb25maWdbOF0gfD0gMHgwMTsKKwkJY29uZmlnID0gMTsKKwl9CisJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSAmJiAobHAtPmNmX2NtZC5pNTk2X2NvbmZpZ1s4XSAmIDB4MDEpKSB7CisJCWxwLT5jZl9jbWQuaTU5Nl9jb25maWdbOF0gJj0gfjB4MDE7CisJCWNvbmZpZyA9IDE7CisJfQorCWlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgJiYgKGxwLT5jZl9jbWQuaTU5Nl9jb25maWdbMTFdICYgMHgyMCkpIHsKKwkJbHAtPmNmX2NtZC5pNTk2X2NvbmZpZ1sxMV0gJj0gfjB4MjA7CisJCWNvbmZpZyA9IDE7CisJfQorCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpICYmICEobHAtPmNmX2NtZC5pNTk2X2NvbmZpZ1sxMV0gJiAweDIwKSkgeworCQlscC0+Y2ZfY21kLmk1OTZfY29uZmlnWzExXSB8PSAweDIwOworCQljb25maWcgPSAxOworCX0KKwlpZiAoY29uZmlnKSB7CisJCWlmIChscC0+Y2ZfY21kLmNtZC5jb21tYW5kKQorCQkJcHJpbnRrKCIlczogY29uZmlnIGNoYW5nZSByZXF1ZXN0IGFscmVhZHkgcXVldWVkXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCWVsc2UgeworCQkJbHAtPmNmX2NtZC5jbWQuY29tbWFuZCA9IENtZENvbmZpZ3VyZTsKKwkJCUNIRUNLX1dCQUNLX0lOVigmbHAtPmNmX2NtZCwgc2l6ZW9mKHN0cnVjdCBjZl9jbWQpKTsKKwkJCWk1OTZfYWRkX2NtZChkZXYsICZscC0+Y2ZfY21kLmNtZCk7CisJCX0KKwl9CisKKwljbnQgPSBkZXYtPm1jX2NvdW50OworCWlmIChjbnQgPiBNQVhfTUNfQ05UKQorCXsKKwkJY250ID0gTUFYX01DX0NOVDsKKwkJcHJpbnRrKCIlczogT25seSAlZCBtdWx0aWNhc3QgYWRkcmVzc2VzIHN1cHBvcnRlZCIsCisJCQlkZXYtPm5hbWUsIGNudCk7CisJfQorCQorCWlmIChkZXYtPm1jX2NvdW50ID4gMCkgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaTsKKwkJdW5zaWduZWQgY2hhciAqY3A7CisJCXN0cnVjdCBtY19jbWQgKmNtZDsKKworCQljbWQgPSAmbHAtPm1jX2NtZDsKKwkJY21kLT5jbWQuY29tbWFuZCA9IENtZE11bHRpY2FzdExpc3Q7CisJCWNtZC0+bWNfY250ID0gZGV2LT5tY19jb3VudCAqIDY7CisJCWNwID0gY21kLT5tY19hZGRyczsKKwkJZm9yIChkbWkgPSBkZXYtPm1jX2xpc3Q7IGNudCAmJiBkbWkgIT0gTlVMTDsgZG1pID0gZG1pLT5uZXh0LCBjbnQtLSwgY3AgKz0gNikgeworCQkJbWVtY3B5KGNwLCBkbWktPmRtaV9hZGRyLCA2KTsKKwkJCWlmIChpNTk2X2RlYnVnID4gMSkKKwkJCQlERUIoREVCX01VTFRJLCBwcmludGsoIiVzOiBBZGRpbmcgYWRkcmVzcyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCWRldi0+bmFtZSwgY3BbMF0sY3BbMV0sY3BbMl0sY3BbM10sY3BbNF0sY3BbNV0pKTsKKwkJfQorCQlDSEVDS19XQkFDS19JTlYoJmxwLT5tY19jbWQsIHNpemVvZihzdHJ1Y3QgbWNfY21kKSk7CisJCWk1OTZfYWRkX2NtZChkZXYsICZjbWQtPmNtZCk7CisJfQorfQorCitNT0RVTEVfUEFSTShkZWJ1ZywgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJsYXNpXzgyNTk2IGRlYnVnIG1hc2siKTsKK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsKKworc3RhdGljIGludCBudW1fZHJpdmVyczsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2c1tNQVhfRFJJVkVSU107CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitsYW5faW5pdF9jaGlwKHN0cnVjdCBwYXJpc2NfZGV2aWNlICpkZXYpCit7CisJc3RydWN0CW5ldF9kZXZpY2UgKm5ldGRldmljZTsKKwlpbnQJcmV0dmFsOworCisJaWYgKG51bV9kcml2ZXJzID49IE1BWF9EUklWRVJTKSB7CisJCS8qIG1heCBjb3VudCBvZiBwb3NzaWJsZSBpODI1OTYgZHJpdmVycyByZWFjaGVkICovCisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChudW1fZHJpdmVycyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPIExBU0lfODI1OTZfRFJJVkVSX1ZFUlNJT04gIlxuIik7CisJCisJaWYgKCFkZXYtPmlycSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJUlEgbm90IGZvdW5kIGZvciBpODI1OTYgYXQgMHglbHhcbiIsCisJCQlfX0ZJTEVfXywgZGV2LT5ocGEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBpODI1OTYgYXQgMHglbHgsIElSUSAlZFxuIiwgZGV2LT5ocGEsIGRldi0+aXJxKTsKKworCW5ldGRldmljZSA9IGFsbG9jX2V0aGVyZGV2KDApOworCWlmICghbmV0ZGV2aWNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5ldGRldmljZS0+YmFzZV9hZGRyID0gZGV2LT5ocGE7CisJbmV0ZGV2aWNlLT5pcnEgPSBkZXYtPmlycTsKKworCXJldHZhbCA9IGk4MjU5Nl9wcm9iZShuZXRkZXZpY2UsICZkZXYtPmRldik7CisJaWYgKHJldHZhbCkgeworCQlmcmVlX25ldGRldihuZXRkZXZpY2UpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoZGV2LT5pZC5zdmVyc2lvbiA9PSAweDcyKSB7CisJCSgoc3RydWN0IGk1OTZfcHJpdmF0ZSAqKW5ldGRldmljZS0+cHJpdiktPm9wdGlvbnMgPSBPUFRfU1dBUF9QT1JUOworCX0KKworCW5ldGRldnNbbnVtX2RyaXZlcnMrK10gPSBuZXRkZXZpY2U7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGFyaXNjX2RldmljZV9pZCBsYW5fdGJsW10gPSB7CisJeyBIUEhXX0ZJTywgSFZFUlNJT05fUkVWX0FOWV9JRCwgSFZFUlNJT05fQU5ZX0lELCAweDAwMDhhIH0sCisJeyBIUEhXX0ZJTywgSFZFUlNJT05fUkVWX0FOWV9JRCwgSFZFUlNJT05fQU5ZX0lELCAweDAwMDcyIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBhcmlzYywgbGFuX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGFyaXNjX2RyaXZlciBsYW5fZHJpdmVyID0geworCS5uYW1lCQk9ICJBcHJpY290IiwKKwkuaWRfdGFibGUJPSBsYW5fdGJsLAorCS5wcm9iZQkJPSBsYW5faW5pdF9jaGlwLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgbGFzaV84MjU5Nl9pbml0KHZvaWQpCit7CisJaWYgKGRlYnVnID49IDApCisJCWk1OTZfZGVidWcgPSBkZWJ1ZzsKKwlyZXR1cm4gcmVnaXN0ZXJfcGFyaXNjX2RyaXZlcigmbGFuX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGxhc2lfODI1OTZfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsYXNpXzgyNTk2X2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPE1BWF9EUklWRVJTOyBpKyspIHsKKwkJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHA7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXZpY2U7CisJCQorCQluZXRkZXZpY2UgPSBuZXRkZXZzW2ldOworCQlpZiAoIW5ldGRldmljZSkgCisJCQljb250aW51ZTsKKwkJCisJCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldmljZSk7CisKKwkJbHAgPSBuZXRkZXZpY2UtPnByaXY7CisJCWRtYV9mcmVlX25vbmNvaGVyZW50KGxwLT5kZXYsIHNpemVvZihzdHJ1Y3QgaTU5Nl9wcml2YXRlKSwgCisJCQkJICAgICAgICh2b2lkICopbmV0ZGV2aWNlLT5tZW1fc3RhcnQsIGxwLT5kbWFfYWRkcik7CisJCWZyZWVfbmV0ZGV2KG5ldGRldmljZSk7CisJfQorCW51bV9kcml2ZXJzID0gMDsKKworCXVucmVnaXN0ZXJfcGFyaXNjX2RyaXZlcigmbGFuX2RyaXZlcik7Cit9CisKK21vZHVsZV9leGl0KGxhc2lfODI1OTZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9sbmUzOTAuYyBiL2RyaXZlcnMvbmV0L2xuZTM5MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWE5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9sbmUzOTAuYwpAQCAtMCwwICsxLDQ1OCBAQAorLyoKKwlsbmUzOTAuYworCisJTGludXggZHJpdmVyIGZvciBNeWxleCBMTkUzOTAgRUlTQSBOZXR3b3JrIEFkYXB0ZXIKKworCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk4LCBQYXVsIEdvcnRtYWtlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJSW5mb3JtYXRpb24gYW5kIENvZGUgU291cmNlczoKKworCTEpIEJhc2VkIHVwb24gZnJhbWV3b3JrIG9mIGVzMzIxMCBkcml2ZXIuCisJMikgVGhlIGV4aXN0aW5nIG15cmlhZCBvZiBvdGhlciBMaW51eCA4MzkwIGRyaXZlcnMgYnkgRG9uYWxkIEJlY2tlci4KKwkzKSBSdXNzIE5lbHNvbidzIGFzbSBwYWNrZXQgZHJpdmVyIHByb3ZpZGVkIGFkZGl0aW9uYWwgaW5mby4KKwk0KSBJbmZvIGZvciBnZXR0aW5nIElSUSBhbmQgc2gtbWVtIGdsZWFuZWQgZnJvbSB0aGUgRUlTQSBjZmcgZmlsZXMuCisKKwlUaGUgTE5FMzkwIGlzIGFuIEVJU0Egc2hhcmVkIG1lbW9yeSBOUzgzOTAgaW1wbGVtZW50YXRpb24uIE5vdGUKKwl0aGF0IGFsbCBtZW1vcnkgY29waWVzIHRvL2Zyb20gdGhlIGJvYXJkIG11c3QgYmUgMzJiaXQgdHJhbnNmZXJzLgorCVRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2YgdGhlIGNhcmQ6IHRoZSBsbmUzOTBhIGFuZCB0aGUgbG5lMzkwYi4KKwlHb2luZyBieSB0aGUgRUlTQSBjZmcgZmlsZXMsIHRoZSAiYSIgaGFzIGp1bXBlcnMgdG8gc2VsZWN0IGJldHdlZW4KKwlCTkMvQVVJLCBidXQgdGhlICJiIiBhbHNvIGhhcyBSSi00NSBhbmQgc2VsZWN0aW9uIGlzIHZpYSB0aGUgU0NVLgorCVRoZSBzaGFyZWQgbWVtb3J5IGFkZHJlc3Mgc2VsZWN0aW9uIGlzIGFsc28gc2xpZ2h0bHkgZGlmZmVyZW50LgorCU5vdGUgdGhhdCBzaGFyZWQgbWVtb3J5IGFkZHJlc3MgPiAxTUIgYXJlIHN1cHBvcnRlZCB3aXRoIHRoaXMgZHJpdmVyLgorCisJWW91IGNhbiB0cnkgPGh0dHA6Ly93d3cubXlsZXguY29tPiBpZiB5b3Ugd2FudCBtb3JlIGluZm8sIGFzIEkndmUKKwluZXZlciBldmVuIHNlZW4gb25lIG9mIHRoZXNlIGNhcmRzLiAgOikKKworCUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiAtIDIwMDAvMDkvMDEKKwktIGdldCByaWQgb2YgY2hlY2tfcmVnaW9uCisJLSBubyBuZWVkIHRvIGNoZWNrIGlmIGRldiA9PSBOVUxMIGluIGxuZTM5MF9wcm9iZTEKKyovCisKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzaW9uID0KKwkibG5lMzkwLmM6IERyaXZlciByZXZpc2lvbiB2MC45OS4xLCAwMS8wOS8yMDAwXG4iOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZWlzYS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworI2RlZmluZSBEUlZfTkFNRSAibG5lMzkwIgorCitzdGF0aWMgaW50IGxuZTM5MF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcik7CisKK3N0YXRpYyBpbnQgbG5lMzkwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGxuZTM5MF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgbG5lMzkwX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIGxuZTM5MF9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSk7CitzdGF0aWMgdm9pZCBsbmUzOTBfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgbG5lMzkwX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpOworCisjZGVmaW5lIExORTM5MF9TVEFSVF9QRwkJMHgwMCAgICAvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlcgkqLworI2RlZmluZSBMTkUzOTBfU1RPUF9QRwkJMHg4MCAgICAvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZwkqLworCisjZGVmaW5lIExORTM5MF9JRF9QT1JUCQkweGM4MAkvKiBTYW1lIGZvciBhbGwgRUlTQSBjYXJkcyAJKi8KKyNkZWZpbmUgTE5FMzkwX0lPX0VYVEVOVAkweDIwCisjZGVmaW5lIExORTM5MF9TQV9QUk9NCQkweDE2CS8qIFN0YXJ0IG9mIGUnbmV0IGFkZHIuCQkqLworI2RlZmluZSBMTkUzOTBfUkVTRVRfUE9SVAkweGM4NAkvKiBGcm9tIHRoZSBwa3QgZHJpdmVyIHNvdXJjZQkqLworI2RlZmluZSBMTkUzOTBfTklDX09GRlNFVAkweDAwCS8qIEhlbGxvLCB0aGUgODM5MCBpcyAqaGVyZSoJKi8KKworI2RlZmluZSBMTkUzOTBfQUREUjAJCTB4MDAJLyogMyBieXRlIHZlbmRvciBwcmVmaXgJCSovCisjZGVmaW5lIExORTM5MF9BRERSMQkJMHg4MAorI2RlZmluZSBMTkUzOTBfQUREUjIJCTB4ZTUKKworI2RlZmluZSBMTkUzOTBfSUQwCTB4MTAwMDk4MzUJLyogMHgzNTk4ID0gMDExMDEgMDExMDAgMTEwMDAgPSBtbHggKi8KKyNkZWZpbmUgTE5FMzkwX0lEMQkweDExMDA5ODM1CS8qIGFib3ZlIGlzIHRoZSAzOTBBLCB0aGlzIGlzIDM5MEIgICovCisKKyNkZWZpbmUgTE5FMzkwX0NGRzEJCTB4Yzg0CS8qIE5COiAweGM4NCBpcyBhbHNvICJyZXNldCIgcG9ydC4gKi8KKyNkZWZpbmUgTE5FMzkwX0NGRzIJCTB4YzkwCisKKy8qCisgKglZb3UgY2FuIE9SIGFueSBvZiB0aGUgZm9sbG93aW5nIGJpdHMgdG9nZXRoZXIgYW5kIGFzc2lnbiBpdAorICoJdG8gTE5FMzkwX0RFQlVHIHRvIGdldCB2ZXJib3NlIGRyaXZlciBpbmZvIGR1cmluZyBvcGVyYXRpb24uCisgKglDdXJyZW50bHkgb25seSB0aGUgcHJvYmUgb25lIGlzIGltcGxlbWVudGVkLgorICovCisKKyNkZWZpbmUgTE5FMzkwX0RfUFJPQkUJMHgwMQorI2RlZmluZSBMTkUzOTBfRF9SWF9QS1QJMHgwMgorI2RlZmluZSBMTkUzOTBfRF9UWF9QS1QJMHgwNAorI2RlZmluZSBMTkUzOTBfRF9JUlEJMHgwOAorCisjZGVmaW5lIExORTM5MF9ERUJVRwkwCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlycV9tYXBbXSBfX2luaXRkYXRhID0gezE1LCAxMiwgMTEsIDEwLCA5LCA3LCA1LCAzfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2htZW1fbWFwQVtdIF9faW5pdGRhdGEgPSB7MHhmZiwgMHhmZSwgMHhmZCwgMHhmZmYsIDB4ZmZlLCAweGZmYywgMHgwZCwgMHgwfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2htZW1fbWFwQltdIF9faW5pdGRhdGEgPSB7MHhmZiwgMHhmZSwgMHgwZSwgMHhmZmYsIDB4ZmZlLCAweGZmYywgMHgwZCwgMHgwfTsKKworLyoKKyAqCVByb2JlIGZvciB0aGUgY2FyZC4gVGhlIGJlc3Qgd2F5IGlzIHRvIHJlYWQgdGhlIEVJU0EgSUQgaWYgaXQKKyAqCWlzIGtub3duLiBUaGVuIHdlIGNhbiBjaGVjayB0aGUgcHJlZml4IG9mIHRoZSBzdGF0aW9uIGFkZHJlc3MKKyAqCVBST00gZm9yIGEgbWF0Y2ggYWdhaW5zdCB0aGUgdmFsdWUgYXNzaWduZWQgdG8gTXlsZXguCisgKi8KKworc3RhdGljIGludCBfX2luaXQgZG9fbG5lMzkwX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGlycSA9IGRldi0+aXJxOworCWludCBtZW1fc3RhcnQgPSBkZXYtPm1lbV9zdGFydDsKKwlpbnQgcmV0OworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKGlvYWRkciA+IDB4MWZmKSB7CQkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBMTkUzOTBfSU9fRVhURU5ULCBEUlZfTkFNRSkpCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXQgPSBsbmUzOTBfcHJvYmUxKGRldiwgaW9hZGRyKTsKKwkJaWYgKHJldCkKKwkJCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgTE5FMzkwX0lPX0VYVEVOVCk7CisJCXJldHVybiByZXQ7CisJfQorCWVsc2UgaWYgKGlvYWRkciA+IDApCQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAoIUVJU0FfYnVzKSB7CisjaWYgTE5FMzkwX0RFQlVHICYgTE5FMzkwX0RfUFJPQkUKKwkJcHJpbnRrKCJsbmUzOTAtZGVidWc6IE5vdCBhbiBFSVNBIGJ1cy4gTm90IHByb2JpbmcgaGlnaCBwb3J0cy5cbiIpOworI2VuZGlmCisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyogRUlTQSBzcGVjIGFsbG93cyBmb3IgdXAgdG8gMTYgc2xvdHMsIGJ1dCA4IGlzIHR5cGljYWwuICovCisJZm9yIChpb2FkZHIgPSAweDEwMDA7IGlvYWRkciA8IDB4OTAwMDsgaW9hZGRyICs9IDB4MTAwMCkgeworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgTE5FMzkwX0lPX0VYVEVOVCwgRFJWX05BTUUpKQorCQkJY29udGludWU7CisJCWlmIChsbmUzOTBfcHJvYmUxKGRldiwgaW9hZGRyKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgTE5FMzkwX0lPX0VYVEVOVCk7CisJCWRldi0+aXJxID0gaXJxOworCQlkZXYtPm1lbV9zdGFydCA9IG1lbV9zdGFydDsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIExORTM5MF9JT19FWFRFTlQpOworCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7Cit9CisKKyNpZm5kZWYgTU9EVUxFCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBsbmUzOTBfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2VpX25ldGRldigpOworCWludCBlcnI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCWVyciA9IGRvX2xuZTM5MF9wcm9iZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwljbGVhbnVwX2NhcmQoZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgbG5lMzkwX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKQoreworCWludCBpLCByZXZpc2lvbiwgcmV0OworCXVuc2lnbmVkIGxvbmcgZWlzYV9pZDsKKworCWlmIChpbmJfcChpb2FkZHIgKyBMTkUzOTBfSURfUE9SVCkgPT0gMHhmZikgcmV0dXJuIC1FTk9ERVY7CisKKyNpZiBMTkUzOTBfREVCVUcgJiBMTkUzOTBfRF9QUk9CRQorCXByaW50aygibG5lMzkwLWRlYnVnOiBwcm9iZSBhdCAlI3gsIElEICUjOHhcbiIsIGlvYWRkciwgaW5sKGlvYWRkciArIExORTM5MF9JRF9QT1JUKSk7CisJcHJpbnRrKCJsbmUzOTAtZGVidWc6IGNvbmZpZyByZWdzOiAlI3ggJSN4XG4iLAorCQlpbmIoaW9hZGRyICsgTE5FMzkwX0NGRzEpLCBpbmIoaW9hZGRyICsgTE5FMzkwX0NGRzIpKTsKKyNlbmRpZgorCisKKy8qCUNoZWNrIHRoZSBFSVNBIElEIG9mIHRoZSBjYXJkLiAqLworCWVpc2FfaWQgPSBpbmwoaW9hZGRyICsgTE5FMzkwX0lEX1BPUlQpOworCWlmICgoZWlzYV9pZCAhPSBMTkUzOTBfSUQwKSAmJiAoZWlzYV9pZCAhPSBMTkUzOTBfSUQxKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXZpc2lvbiA9IChlaXNhX2lkID4+IDI0KSAmIDB4MDE7CS8qIDAgPSByZXYgQSwgMSByZXYgQiAqLworCQorI2lmIDAKKy8qCUNoZWNrIHRoZSBNeWxleCB2ZW5kb3IgSUQgYXMgd2VsbC4gTm90IHJlYWxseSByZXF1aXJlZC4gKi8KKwlpZiAoaW5iKGlvYWRkciArIExORTM5MF9TQV9QUk9NICsgMCkgIT0gTE5FMzkwX0FERFIwCisJCXx8IGluYihpb2FkZHIgKyBMTkUzOTBfU0FfUFJPTSArIDEpICE9IExORTM5MF9BRERSMQorCQl8fCBpbmIoaW9hZGRyICsgTE5FMzkwX1NBX1BST00gKyAyKSAhPSBMTkUzOTBfQUREUjIgKSB7CisJCXByaW50aygibG5lMzkwLmM6IGNhcmQgbm90IGZvdW5kIik7CisJCWZvcihpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspCisJCQlwcmludGsoIiAlMDJ4IiwgaW5iKGlvYWRkciArIExORTM5MF9TQV9QUk9NICsgaSkpOworCQlwcmludGsoIiAoaW52YWxpZCBwcmVmaXgpLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKyNlbmRpZgorCisJcHJpbnRrKCJsbmUzOTAuYzogTE5FMzkwJVggaW4gRUlTQSBzbG90ICVkLCBhZGRyZXNzIiwgMHhhK3JldmlzaW9uLCBpb2FkZHIvMHgxMDAwKTsKKwlmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKQorCQlwcmludGsoIiAlMDJ4IiwgKGRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgTE5FMzkwX1NBX1BST00gKyBpKSkpOworCXByaW50aygiLlxubG5lMzkwLmM6ICIpOworCisJLyogU25hcmYgdGhlIGludGVycnVwdCBub3cuIENGRyBmaWxlIGhhcyB0aGVtIGFsbCBsaXN0ZWQgYXMgYGVkZ2UnIHdpdGggc2hhcmU9Tk8gKi8KKwlpZiAoZGV2LT5pcnEgPT0gMCkgeworCQl1bnNpZ25lZCBjaGFyIGlycV9yZWcgPSBpbmIoaW9hZGRyICsgTE5FMzkwX0NGRzIpID4+IDM7CisJCWRldi0+aXJxID0gaXJxX21hcFtpcnFfcmVnICYgMHgwN107CisJCXByaW50aygidXNpbmciKTsKKwl9IGVsc2UgeworCQkvKiBUaGlzIGlzIHVzZWxlc3MgdW5sZXNzIHdlIHJlcHJvZ3JhbSB0aGUgY2FyZCBoZXJlIHRvbyAqLworCQlpZiAoZGV2LT5pcnEgPT0gMikgZGV2LT5pcnEgPSA5OwkvKiBEb2ghICovCisJCXByaW50aygiYXNzaWduaW5nIik7CisJfQorCXByaW50aygiIElSUSAlZCwiLCBkZXYtPmlycSk7CisKKwlpZiAoKHJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIDAsIERSVl9OQU1FLCBkZXYpKSkgeworCQlwcmludGsgKCIgdW5hYmxlIHRvIGdldCBJUlEgJWQuXG4iLCBkZXYtPmlycSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGRldi0+bWVtX3N0YXJ0ID09IDApIHsKKwkJdW5zaWduZWQgY2hhciBtZW1fcmVnID0gaW5iKGlvYWRkciArIExORTM5MF9DRkcyKSAmIDB4MDc7CisKKwkJaWYgKHJldmlzaW9uKQkvKiBMTkUzOTBCICovCisJCQlkZXYtPm1lbV9zdGFydCA9IHNobWVtX21hcEJbbWVtX3JlZ10gKiAweDEwMDAwOworCQllbHNlCQkvKiBMTkUzOTBBICovCisJCQlkZXYtPm1lbV9zdGFydCA9IHNobWVtX21hcEFbbWVtX3JlZ10gKiAweDEwMDAwOworCQlwcmludGsoIiB1c2luZyAiKTsKKwl9IGVsc2UgeworCQkvKiBTaG91bGQgY2hlY2sgZm9yIHZhbHVlIGluIHNobWVtX21hcCBhbmQgcmVwcm9ncmFtIHRoZSBjYXJkIHRvIHVzZSBpdCAqLworCQlkZXYtPm1lbV9zdGFydCAmPSAweGZmZjAwMDA7CisJCXByaW50aygiIGFzc2lnbmluZyAiKTsKKwl9CisKKwlwcmludGsoIiVka0IgbWVtb3J5IGF0IHBoeXNpY2FsIGFkZHJlc3MgJSNseFxuIiwKKwkJCUxORTM5MF9TVE9QX1BHLzQsIGRldi0+bWVtX3N0YXJ0KTsKKworCS8qCisJICAgQkVXQVJFISEgU29tZSBkYWluLWJyYW1hZ2VkIEVJU0EgU0NVcyB3aWxsIGFsbG93IHlvdSB0byBwdXQKKwkgICB0aGUgY2FyZCBtZW0gd2l0aGluIHRoZSByZWdpb24gY292ZXJlZCBieSBgbm9ybWFsJyBSQU0gICEhIQorCisJICAgaW9yZW1hcCgpIHdpbGwgZmFpbCBpbiB0aGF0IGNhc2UuCisJKi8KKwllaV9zdGF0dXMubWVtID0gaW9yZW1hcChkZXYtPm1lbV9zdGFydCwgTE5FMzkwX1NUT1BfUEcqMHgxMDApOworCWlmICghZWlfc3RhdHVzLm1lbSkgeworCQlwcmludGsoS0VSTl9FUlIgImxuZTM5MC5jOiBVbmFibGUgdG8gcmVtYXAgY2FyZCBtZW1vcnkgYWJvdmUgMU1CICEhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJsbmUzOTAuYzogVHJ5IHVzaW5nIEVJU0EgU0NVIHRvIHNldCBtZW1vcnkgYmVsb3cgMU1CLlxuIik7CisJCXByaW50ayhLRVJOX0VSUiAibG5lMzkwLmM6IERyaXZlciBOT1QgaW5zdGFsbGVkLlxuIik7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gY2xlYW51cDsKKwl9CisJcHJpbnRrKCJsbmUzOTAuYzogcmVtYXBwZWQgJWRrQiBjYXJkIG1lbW9yeSB0byB2aXJ0dWFsIGFkZHJlc3MgJXBcbiIsCisJCQlMTkUzOTBfU1RPUF9QRy80LCBlaV9zdGF0dXMubWVtKTsKKworCWRldi0+bWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpZWlfc3RhdHVzLm1lbTsKKwlkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIChMTkUzOTBfU1RPUF9QRyAtIExORTM5MF9TVEFSVF9QRykqMjU2OworCisJLyogVGhlIDgzOTAgb2Zmc2V0IGlzIHplcm8gZm9yIHRoZSBMTkUzOTAgKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworCWVpX3N0YXR1cy5uYW1lID0gIkxORTM5MCI7CisJZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBMTkUzOTBfU1RBUlRfUEc7CisJZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBMTkUzOTBfU1RBUlRfUEcgKyBUWF9QQUdFUzsKKwllaV9zdGF0dXMuc3RvcF9wYWdlID0gTE5FMzkwX1NUT1BfUEc7CisJZWlfc3RhdHVzLndvcmQxNiA9IDE7CisKKwlpZiAoZWlfZGVidWcgPiAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwllaV9zdGF0dXMucmVzZXRfODM5MCA9ICZsbmUzOTBfcmVzZXRfODM5MDsKKwllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmbG5lMzkwX2Jsb2NrX2lucHV0OworCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmbG5lMzkwX2Jsb2NrX291dHB1dDsKKwllaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJmxuZTM5MF9nZXRfODM5MF9oZHI7CisKKwlkZXYtPm9wZW4gPSAmbG5lMzkwX29wZW47CisJZGV2LT5zdG9wID0gJmxuZTM5MF9jbG9zZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCU5TODM5MF9pbml0KGRldiwgMCk7CisJcmV0dXJuIDA7CitjbGVhbnVwOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKglSZXNldCBhcyBwZXIgdGhlIHBhY2tldCBkcml2ZXIgbWV0aG9kLiBKdWRnaW5nIGJ5IHRoZSBFSVNBIGNmZworICoJZmlsZSwgdGhpcyBqdXN0IHRvZ2dsZXMgdGhlICJCb2FyZCBFbmFibGUiIGJpdHMgKGJpdCAyIGFuZCAwKS4KKyAqLworCitzdGF0aWMgdm9pZCBsbmUzOTBfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJb3V0YigweDA0LCBpb2FkZHIgKyBMTkUzOTBfUkVTRVRfUE9SVCk7CisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCIlczogcmVzZXR0aW5nIHRoZSBMTkUzOTAuLi4iLCBkZXYtPm5hbWUpOworCisJbWRlbGF5KDIpOworCisJZWlfc3RhdHVzLnR4aW5nID0gMDsKKwlvdXRiKDB4MDEsIGlvYWRkciArIExORTM5MF9SRVNFVF9QT1JUKTsKKwlpZiAoZWlfZGVidWcgPiAxKSBwcmludGsoInJlc2V0IGRvbmVcbiIpOworCisJcmV0dXJuOworfQorCisvKgorICoJTm90ZTogSW4gdGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMgaXMgdGhlIGltcGxpY2l0IGFzc3VtcHRpb24KKyAqCXRoYXQgdGhlIGFzc29jaWF0ZWQgbWVtY3B5IHdpbGwgb25seSB1c2UgInJlcDsgbW92c2wiIGFzIGxvbmcgYXMKKyAqCXdlIGtlZXAgdGhlIGNvdW50cyBhcyBzb21lIG11bHRpcGxlIG9mIGRvdWJsZXdvcmRzLiBUaGlzIGlzIGEKKyAqCXJlcXVpcmVtZW50IG9mIHRoZSBoYXJkd2FyZSwgYW5kIGFsc28gcHJldmVudHMgdXMgZnJvbSB1c2luZworICoJZXRoX2lvX2NvcHlfYW5kX3N1bSgpIHNpbmNlIHdlIGNhbid0IGd1YXJhbnRlZSBpdCB3aWxsIGxpbWl0CisgKglpdHNlbGYgdG8gZG91Ymxld29yZCBhY2Nlc3MuCisgKi8KKworLyoKKyAqCUdyYWIgdGhlIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiBTaW1pbGFyIHRvIHRoZSBibG9ja19pbnB1dCByb3V0aW5lLCBidXQKKyAqCXdlIGRvbid0IG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGggcmluZyB3cmFwIGFzIHRoZSBoZWFkZXIgd2lsbCBiZSBhdAorICoJdGhlIHN0YXJ0IG9mIGEgcGFnZSwgc28gd2Ugb3B0aW1pemUgYWNjb3JkaW5nbHkuIChBIHNpbmdsZSBkb3VibGV3b3JkLikKKyAqLworCitzdGF0aWMgdm9pZAorbG5lMzkwX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCXZvaWQgX19pb21lbSAqaGRyX3N0YXJ0ID0gZWlfc3RhdHVzLm1lbSArICgocmluZ19wYWdlIC0gTE5FMzkwX1NUQVJUX1BHKTw8OCk7CisJbWVtY3B5X2Zyb21pbyhoZHIsIGhkcl9zdGFydCwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSk7CisJaGRyLT5jb3VudCA9IChoZHItPmNvdW50ICsgMykgJiB+MzsgICAgIC8qIFJvdW5kIHVwIGFsbG9jYXRpb24uICovCit9CisKKy8qCQorICoJQmxvY2sgaW5wdXQgYW5kIG91dHB1dCBhcmUgZWFzeSBvbiBzaGFyZWQgbWVtb3J5IGV0aGVyY2FyZHMsIHRoZSBvbmx5CisgKgljb21wbGljYXRpb24gaXMgd2hlbiB0aGUgcmluZyBidWZmZXIgd3JhcHMuIFRoZSBjb3VudCB3aWxsIGFscmVhZHkKKyAqCWJlIHJvdW5kZWQgdXAgdG8gYSBkb3VibGV3b3JkIHZhbHVlIHZpYSBsbmUzOTBfZ2V0XzgzOTBfaGRyKCkgYWJvdmUuCisgKi8KKworc3RhdGljIHZvaWQgbG5lMzkwX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJCSAgaW50IHJpbmdfb2Zmc2V0KQoreworCXZvaWQgX19pb21lbSAqeGZlcl9zdGFydCA9IGVpX3N0YXR1cy5tZW0gKyByaW5nX29mZnNldCAtIChMTkUzOTBfU1RBUlRfUEc8PDgpOworCisJaWYgKHJpbmdfb2Zmc2V0ICsgY291bnQgPiAoTE5FMzkwX1NUT1BfUEc8PDgpKSB7CisJCS8qIFBhY2tldCB3cmFwcyBvdmVyIGVuZCBvZiByaW5nIGJ1ZmZlci4gKi8KKwkJaW50IHNlbWlfY291bnQgPSAoTE5FMzkwX1NUT1BfUEc8PDgpIC0gcmluZ19vZmZzZXQ7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCB4ZmVyX3N0YXJ0LCBzZW1pX2NvdW50KTsKKwkJY291bnQgLT0gc2VtaV9jb3VudDsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEgKyBzZW1pX2NvdW50LAorCQkJZWlfc3RhdHVzLm1lbSArIChUWF9QQUdFUzw8OCksIGNvdW50KTsKKwl9IGVsc2UgeworCQkvKiBQYWNrZXQgaXMgaW4gb25lIGNodW5rLiAqLworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgeGZlcl9zdGFydCwgY291bnQpOworCX0KK30KKworc3RhdGljIHZvaWQgbG5lMzkwX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSkKK3sKKwl2b2lkIF9faW9tZW0gKnNobWVtID0gZWlfc3RhdHVzLm1lbSArICgoc3RhcnRfcGFnZSAtIExORTM5MF9TVEFSVF9QRyk8PDgpOworCisJY291bnQgPSAoY291bnQgKyAzKSAmIH4zOyAgICAgLyogUm91bmQgdXAgdG8gZG91Ymxld29yZCAqLworCW1lbWNweV90b2lvKHNobWVtLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGludCBsbmUzOTBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVpX29wZW4oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsbmUzOTBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKworCWVpX2Nsb3NlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUgTUFYX0xORV9DQVJEUwk0CS8qIE1heCBudW1iZXIgb2YgTE5FMzkwIGNhcmRzIHBlciBtb2R1bGUgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2xuZVtNQVhfTE5FX0NBUkRTXTsKK3N0YXRpYyBpbnQgaW9bTUFYX0xORV9DQVJEU107CitzdGF0aWMgaW50IGlycVtNQVhfTE5FX0NBUkRTXTsKK3N0YXRpYyBpbnQgbWVtW01BWF9MTkVfQ0FSRFNdOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG1lbSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYmFzZSBhZGRyZXNzKGVzKSIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgbnVtYmVyKHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKG1lbSwgIm1lbW9yeSBiYXNlIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk15bGV4IExORTM5MEEvQiBFSVNBIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0xORV9DQVJEUzsgdGhpc19kZXYrKykgeworCQlpZiAoaW9bdGhpc19kZXZdID09IDAgJiYgdGhpc19kZXYgIT0gMCkKKwkJCWJyZWFrOworCQlkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwkJaWYgKCFkZXYpCisJCQlicmVhazsKKwkJZGV2LT5pcnEgPSBpcnFbdGhpc19kZXZdOworCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKKwkJZGV2LT5tZW1fc3RhcnQgPSBtZW1bdGhpc19kZXZdOworCQlpZiAoZG9fbG5lMzkwX3Byb2JlKGRldikgPT0gMCkgeworCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCQlkZXZfbG5lW2ZvdW5kKytdID0gZGV2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY2xlYW51cF9jYXJkKGRldik7CisJCX0KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibG5lMzkwLmM6IE5vIExORTM5MCBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsIGlvW3RoaXNfZGV2XSk7CisJCWJyZWFrOworCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiAtRU5YSU87Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXY7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfTE5FX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfbG5lW3RoaXNfZGV2XTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbG9vcGJhY2suYyBiL2RyaXZlcnMvbmV0L2xvb3BiYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmYzMxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2xvb3BiYWNrLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJUHNldWRvLWRyaXZlciBmb3IgdGhlIGxvb3BiYWNrIGludGVyZmFjZS4KKyAqCisgKiBWZXJzaW9uOglAKCMpbG9vcGJhY2suYwkxLjAuNGIJMDgvMTYvOTMKKyAqCisgKiBBdXRob3JzOglSb3NzIEJpcm8sIDxiaXI3QGxlbGFuZC5TdGFuZm9yZC5FZHU+CisgKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgkJRG9uYWxkIEJlY2tlciwgPGJlY2tlckBzY3lsZC5jb20+CisgKgorICoJCUFsYW4gQ294CToJRml4ZWQgb2RkbWVudHMgZm9yIE5FVDMuMDE0CisgKgkJQWxhbiBDb3gJOglSZWppZyBmb3IgTkVUMy4wMjkgc25hcCAjMworICoJCUFsYW4gQ294CTogCUZpeGVkIE5FVDMuMDI5IGJ1Z3MgYW5kIHNwZWQgdXAKKyAqCQlMYXJyeSBNY1ZveQk6CVRpbnkgdHdlYWsgdG8gZG91YmxlIHBlcmZvcm1hbmNlCisgKgkJQWxhbiBDb3gJOglCYWNrZWQgb3V0IExNVidzIHR3ZWFrIC0gdGhlIGxpbnV4IG1tCisgKgkJCQkJY2FuJ3QgdGFrZSBpdC4uLgorICogICAgICAgICAgICAgIE1pY2hhZWwgR3JpZmZpdGg6ICAgICAgIERvbid0IGJvdGhlciBjb21wdXRpbmcgdGhlIGNoZWNrc3VtcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHBhY2tldHMgcmVjZWl2ZWQgb24gdGhlIGxvb3BiYWNrCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLgorICoJCUFsZXhleSBLdXpuZXRzb3Y6CVBvdGVudGlhbCBoYW5nIHVuZGVyIHNvbWUgZXh0cmVtZQorICoJCQkJCWNhc2VzIHJlbW92ZWQuCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4JLyogRm9yIHRoZSBzdGF0aXN0aWNzIHN0cnVjdHVyZS4gKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4JLyogRm9yIEFSUEhSRF9FVEhFUiAqLworI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cywgbG9vcGJhY2tfc3RhdHMpOworCisjZGVmaW5lIExPT1BCQUNLX09WRVJIRUFEICgxMjggKyBNQVhfSEVBREVSICsgMTYgKyAxNikKKworLyogS0lTUzoganVzdCBhbGxvY2F0ZSBzbWFsbCBjaHVua3MgYW5kIGNvcHkgYml0cy4KKyAqCisgKiBTbywgaW4gZmFjdCwgdGhpcyBpcyBkb2N1bWVudGF0aW9uLCBleHBsYWluaW5nIHdoYXQgd2UgZXhwZWN0CisgKiBvZiBsYXJnZXNlbmRpbmcgZGV2aWNlIG1vZHVsbyBUQ1AgY2hlY2tzdW0sIHdoaWNoIGlzIGlnbm9yZWQgZm9yIGxvb3BiYWNrLgorICovCisKK3N0YXRpYyB2b2lkIGVtdWxhdGVfbGFyZ2Vfc2VuZF9vZmZsb2FkKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgdGNwaGRyICp0aCA9IChzdHJ1Y3QgdGNwaGRyKikoc2tiLT5uaC5yYXcgKyAoaXBoLT5paGwgKiA0KSk7CisJdW5zaWduZWQgaW50IGRvZmZzZXQgPSAoaXBoLT5paGwgKyB0aC0+ZG9mZikgKiA0OworCXVuc2lnbmVkIGludCBtdHUgPSBza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplICsgZG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKKwl1MzIgc2VxID0gbnRvaGwodGgtPnNlcSk7CisJdTE2IGlkICA9IG50b2hzKGlwaC0+aWQpOworCisJd2hpbGUgKG9mZnNldCArIGRvZmZzZXQgPCBza2ItPmxlbikgeworCQl1bnNpZ25lZCBpbnQgZnJhZ19zaXplID0gbWluKG10dSwgc2tiLT5sZW4gLSBvZmZzZXQpIC0gZG9mZnNldDsKKwkJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBhbGxvY19za2IobXR1ICsgMzIsIEdGUF9BVE9NSUMpOworCisJCWlmICghbnNrYikKKwkJCWJyZWFrOworCQlza2JfcmVzZXJ2ZShuc2tiLCAzMik7CisJCW5za2ItPm1hYy5yYXcgPSBuc2tiLT5kYXRhIC0gMTQ7CisJCW5za2ItPm5oLnJhdyA9IG5za2ItPmRhdGE7CisJCWlwaCA9IG5za2ItPm5oLmlwaDsKKwkJbWVtY3B5KG5za2ItPmRhdGEsIHNrYi0+bmgucmF3LCBkb2Zmc2V0KTsKKwkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLAorCQkJCSAgZG9mZnNldCArIG9mZnNldCwKKwkJCQkgIG5za2ItPmRhdGEgKyBkb2Zmc2V0LAorCQkJCSAgZnJhZ19zaXplKSkKKwkJCUJVRygpOworCQlza2JfcHV0KG5za2IsIGRvZmZzZXQgKyBmcmFnX3NpemUpOworCQluc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJbnNrYi0+ZGV2ID0gc2tiLT5kZXY7CisJCW5za2ItPnByaW9yaXR5ID0gc2tiLT5wcmlvcml0eTsKKwkJbnNrYi0+cHJvdG9jb2wgPSBza2ItPnByb3RvY29sOworCQluc2tiLT5kc3QgPSBkc3RfY2xvbmUoc2tiLT5kc3QpOworCQltZW1jcHkobnNrYi0+Y2IsIHNrYi0+Y2IsIHNpemVvZihza2ItPmNiKSk7CisJCW5za2ItPnBrdF90eXBlID0gc2tiLT5wa3RfdHlwZTsKKworCQl0aCA9IChzdHJ1Y3QgdGNwaGRyKikobnNrYi0+bmgucmF3ICsgaXBoLT5paGwqNCk7CisJCWlwaC0+dG90X2xlbiA9IGh0b25zKGZyYWdfc2l6ZSArIGRvZmZzZXQpOworCQlpcGgtPmlkID0gaHRvbnMoaWQpOworCQlpcGgtPmNoZWNrID0gMDsKKwkJaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bSgodW5zaWduZWQgY2hhciAqKSBpcGgsIGlwaC0+aWhsKTsKKwkJdGgtPnNlcSA9IGh0b25sKHNlcSk7CisJCWlmIChvZmZzZXQgKyBkb2Zmc2V0ICsgZnJhZ19zaXplIDwgc2tiLT5sZW4pCisJCQl0aC0+ZmluID0gdGgtPnBzaCA9IDA7CisJCW5ldGlmX3J4KG5za2IpOworCQlvZmZzZXQgKz0gZnJhZ19zaXplOworCQlzZXEgKz0gZnJhZ19zaXplOworCQlpZCsrOworCX0KKworCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKworLyoKKyAqIFRoZSBoaWdoZXIgbGV2ZWxzIHRha2UgY2FyZSBvZiBtYWtpbmcgdGhpcyBub24tcmVlbnRyYW50IChpdCdzCisgKiBjYWxsZWQgd2l0aCBiaCdzIGRpc2FibGVkKS4KKyAqLworc3RhdGljIGludCBsb29wYmFja194bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmxiX3N0YXRzOworCisJc2tiX29ycGhhbihza2IpOworCisJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwlza2ItPmRldj1kZXY7CisjaWZuZGVmIExPT1BCQUNLX01VU1RfQ0hFQ0tTVU0KKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworI2VuZGlmCisKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSkgeworCQlCVUdfT04oc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkpOworCQlCVUdfT04oc2tiLT5uaC5pcGgtPnByb3RvY29sICE9IElQUFJPVE9fVENQKTsKKworCQllbXVsYXRlX2xhcmdlX3NlbmRfb2ZmbG9hZChza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisJbGJfc3RhdHMgPSAmcGVyX2NwdShsb29wYmFja19zdGF0cywgZ2V0X2NwdSgpKTsKKwlsYl9zdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJbGJfc3RhdHMtPnR4X2J5dGVzICs9IHNrYi0+bGVuOworCWxiX3N0YXRzLT5yeF9wYWNrZXRzKys7CisJbGJfc3RhdHMtPnR4X3BhY2tldHMrKzsKKwlwdXRfY3B1KCk7CisKKwluZXRpZl9yeChza2IpOworCisJcmV0dXJuKDApOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCWlmICghc3RhdHMpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKworCWZvciAoaT0wOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsYl9zdGF0czsKKworCQlpZiAoIWNwdV9wb3NzaWJsZShpKSkgCisJCQljb250aW51ZTsKKwkJbGJfc3RhdHMgPSAmcGVyX2NwdShsb29wYmFja19zdGF0cywgaSk7CisJCXN0YXRzLT5yeF9ieXRlcyAgICs9IGxiX3N0YXRzLT5yeF9ieXRlczsKKwkJc3RhdHMtPnR4X2J5dGVzICAgKz0gbGJfc3RhdHMtPnR4X2J5dGVzOworCQlzdGF0cy0+cnhfcGFja2V0cyArPSBsYl9zdGF0cy0+cnhfcGFja2V0czsKKwkJc3RhdHMtPnR4X3BhY2tldHMgKz0gbGJfc3RhdHMtPnR4X3BhY2tldHM7CisJfQorCQkJCQorCXJldHVybiBzdGF0czsKK30KKworc3RhdGljIHUzMiBsb29wYmFja19nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGxvb3BiYWNrX2V0aHRvb2xfb3BzID0geworCS5nZXRfbGluawkJPSBsb29wYmFja19nZXRfbGluaywKKwkuZ2V0X3RzbwkJPSBldGh0b29sX29wX2dldF90c28sCisJLnNldF90c28JCT0gZXRodG9vbF9vcF9zZXRfdHNvLAorfTsKKworc3RydWN0IG5ldF9kZXZpY2UgbG9vcGJhY2tfZGV2ID0geworCS5uYW1lCSAJCT0gImxvIiwKKwkubXR1CQkJPSAoMTYgKiAxMDI0KSArIDIwICsgMjAgKyAxMiwKKwkuaGFyZF9zdGFydF94bWl0CT0gbG9vcGJhY2tfeG1pdCwKKwkuaGFyZF9oZWFkZXIJCT0gZXRoX2hlYWRlciwKKwkuaGFyZF9oZWFkZXJfY2FjaGUJPSBldGhfaGVhZGVyX2NhY2hlLAorCS5oZWFkZXJfY2FjaGVfdXBkYXRlCT0gZXRoX2hlYWRlcl9jYWNoZV91cGRhdGUsCisJLmhhcmRfaGVhZGVyX2xlbgk9IEVUSF9ITEVOLAkvKiAxNAkqLworCS5hZGRyX2xlbgkJPSBFVEhfQUxFTiwJLyogNgkqLworCS50eF9xdWV1ZV9sZW4JCT0gMCwKKwkudHlwZQkJCT0gQVJQSFJEX0xPT1BCQUNLLAkvKiAweDAwMDEqLworCS5yZWJ1aWxkX2hlYWRlcgkJPSBldGhfcmVidWlsZF9oZWFkZXIsCisJLmZsYWdzCQkJPSBJRkZfTE9PUEJBQ0ssCisJLmZlYXR1cmVzIAkJPSBORVRJRl9GX1NHfE5FVElGX0ZfRlJBR0xJU1QKKwkJCQkgIHxORVRJRl9GX05PX0NTVU18TkVUSUZfRl9ISUdIRE1BCisJCQkJICB8TkVUSUZfRl9MTFRYLAorCS5ldGh0b29sX29wcwkJPSAmbG9vcGJhY2tfZXRodG9vbF9vcHMsCit9OworCisvKiBTZXR1cCBhbmQgcmVnaXN0ZXIgdGhlIG9mIHRoZSBMT09QQkFDSyBkZXZpY2UuICovCitpbnQgX19pbml0IGxvb3BiYWNrX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisKKwkvKiBDYW4gc3Vydml2ZSB3aXRob3V0IHN0YXRpc3RpY3MgKi8KKwlzdGF0cyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRzKSB7CisJCW1lbXNldChzdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisJCWxvb3BiYWNrX2Rldi5wcml2ID0gc3RhdHM7CisJCWxvb3BiYWNrX2Rldi5nZXRfc3RhdHMgPSAmZ2V0X3N0YXRzOworCX0KKwkKKwlyZXR1cm4gcmVnaXN0ZXJfbmV0ZGV2KCZsb29wYmFja19kZXYpOworfTsKKworRVhQT1JUX1NZTUJPTChsb29wYmFja19kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbHA0ODZlLmMgYi9kcml2ZXJzL25ldC9scDQ4NmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTM5ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbHA0ODZlLmMKQEAgLTAsMCArMSwxMzUyIEBACisvKiBJbnRlbCBQcm9mZXNzaW9uYWwgV29ya3N0YXRpb24vcGFudGhlciBldGhlcm5ldCBkcml2ZXIgKi8KKy8qIGxwNDg2ZS5jOiBBIHBhbnRoZXIgODI1OTYgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4gKi8KKy8qCisgICAgSGlzdG9yeSBhbmQgY29weXJpZ2h0czoKKworICAgIERyaXZlciBza2VsZXRvbgorICAgICAgICBXcml0dGVuIDE5OTMgYnkgRG9uYWxkIEJlY2tlci4KKyAgICAgICAgQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZSBEaXJlY3RvciwKKyAgICAgICAgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiAgVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkIGFuZAorCWRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisJYXMgbW9kaWZpZWQgYnkgU1JDLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworICAgICAgICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKyAgICBBcHJpY290CisgICAgICAgIFdyaXR0ZW4gMTk5NCBieSBNYXJrIEV2YW5zLgorICAgICAgICBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIEFwcmljb3QgODI1OTYgYnVzLW1hc3RlciBpbnRlcmZhY2UKKworICAgICAgICBNb2R1bGFyaXNlZCAxMi85NCBNYXJrIEV2YW5zCisKKyAgICBQcm9mZXNzaW9uYWwgV29ya3N0YXRpb24KKwlEZXJpdmVkIGZyb20gYXByaWNvdC5jIGJ5IEFyZCB2YW4gQnJlZW1lbgorCTxhcmRAbXVycGh5Lm5sPnw8YXJkQGNzdG1lbC5ob2JieS5ubD58PGFyZEBjc3RtZWwubmwuZXUub3JnPgorCisJQ3JlZGl0czoKKwlUaGFua3MgdG8gTXVycGh5IFNvZnR3YXJlIEJWIGZvciBsZXR0aW5nIG1lIHdyaXRlIHRoaXMgaW4gdGhlaXIgdGltZS4KKwlXZWxsLCBhY3R1YWxseSwgSSBnZXQgcGF5ZWQgZG9pbmcgdGhpcy4uLgorCShBbHNvOiBzZWUgaHR0cDovL3d3dy5tdXJwaHkubmwgZm9yIG11cnBoeSwgYW5kIG15IGhvbWVwYWdlIH5hcmQgZm9yCisJbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgUHJvZmVzc2lvbmFsIFdvcmtzdGF0aW9uKQorCisgICAgUHJlc2VudCB2ZXJzaW9uCisJYWViQGN3aS5ubAorKi8KKy8qCisgICAgVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gbW90aGVyYm9hcmRzIHRoYXQgSSBrbm93IG9mIGluIHRoZQorICAgIHByb2Zlc3Npb25hbCB3b3Jrc3RhdGlvbi4gVGhlIG9ubHkgb25lIHRoYXQgSSBrbm93IGlzIHRoZQorICAgIGludGVsIHBhbnRoZXIgbW90aGVyYm9hcmQuIC0tIGFyZAorKi8KKy8qCitUaGUgcHdzIGlzIGVxdWlwcGVkIHdpdGggYW4gaW50ZWwgODI1OTYuIFRoaXMgaXMgYSB2ZXJ5IGludGVsbGlnZW50IGNvbnRyb2xsZXIKK3doaWNoIHJ1bnMgaXRzIG93biBtaWNyby1jb2RlLiBDb21tdW5pY2F0aW9uIHdpdGggdGhlIGhvc3Rwcm9jZXNzb3IgaXMgZG9uZQordGhyb3VnaCBsaW5rZWQgbGlzdHMgb2YgY29tbWFuZHMgYW5kIGJ1ZmZlcnMgaW4gdGhlIGhvc3Rwcm9jZXNzb3JzIG1lbW9yeS4KK0EgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIDgyNTk2IGlzIGF2YWlsYWJsZSBmcm9tIGludGVsLiBTZWFyY2ggZm9yCithIGZpbGUgY2FsbGVkICIyOTAyMTgwNi5wZGYiLiBJdCBpcyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGlwIGl0c2VsZi4KK1RvIHVzZSBpdCBmb3IgdGhlIHB3cyBzb21lIGFkZGl0aW9ucyBhcmUgbmVlZGVkIHJlZ2FyZGluZyBnZW5lcmF0aW9uIG9mCit0aGUgUE9SVCBhbmQgQ0Egc2lnbmFsLCBhbmQgdGhlIGludGVycnVwdCBnbHVlIG5lZWRlZCBmb3IgYSBwYy4KK0kvTyBtYXA6CitQT1JUICBTSVpFIEFDVElPTiBNRUFOSU5HCisweENCMCAgICAyIFdSSVRFICBMb3dlciAxNiBiaXRzIGZvciBQT1JUIGNvbW1hbmQKKzB4Q0IyICAgIDIgV1JJVEUgIFVwcGVyIDE2IGJpdHMgZm9yIFBPUlQgY29tbWFuZCwgYW5kIGlzc3VlIG9mIFBPUlQgY29tbWFuZAorMHhDQjQgICAgMSBXUklURSAgR2VuZXJhdGlvbiBvZiBDQSBzaWduYWwKKzB4Q0I4ICAgIDEgV1JJVEUgIENsZWFyIGludGVycnVwdCBnbHVlCitBbGwgb3RoZXIgY29tbXVuaWNhdGlvbiBpcyB0aHJvdWdoIG1lbW9yeSEKKyovCisKKyNkZWZpbmUgU0xPV19ET1dOX0lPIHVkZWxheSg1KQorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2RlZmluZSBEUlZfTkFNRSAibHA0ODZlIgorCisvKiBkZWJ1ZyBwcmludCBmbGFncyAqLworI2RlZmluZSBMT0dfU1JDRFNUICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTE9HX1NUQVRJTlQgICAweDQwMDAwMDAwCisjZGVmaW5lIExPR19TVEFSVElOVCAgMHgyMDAwMDAwMAorCisjZGVmaW5lIGk1OTZfZGVidWcgZGVidWcKKworc3RhdGljIGludCBpNTk2X2RlYnVnID0gMDsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtZWRpYW5hbWVbXSA9IHsKKwkiMTBiYXNlVCIsICJBVUkiLAorCSIxMGJhc2VULUZEIiwgIkFVSS1GRCIsCit9OworCisjZGVmaW5lIExQNDg2RV9UT1RBTF9TSVpFIDE2CisKKyNkZWZpbmUgSTU5Nl9OVUxMICgweGZmZmZmZmZmKQorCisjZGVmaW5lIENNRF9FT0wJCTB4ODAwMAkvKiBUaGUgbGFzdCBjb21tYW5kIG9mIHRoZSBsaXN0LCBzdG9wLiAqLworI2RlZmluZSBDTURfU1VTUAkweDQwMDAJLyogU3VzcGVuZCBhZnRlciBkb2luZyBjbWQuICovCisjZGVmaW5lIENNRF9JTlRSCTB4MjAwMAkvKiBJbnRlcnJ1cHQgYWZ0ZXIgZG9pbmcgY21kLiAqLworCisjZGVmaW5lIENNRF9GTEVYCTB4MDAwOAkvKiBFbmFibGUgZmxleGlibGUgbWVtb3J5IG1vZGVsICovCisKK2VudW0gY29tbWFuZHMgeworCUNtZE5PUCA9IDAsCisJQ21kSUFTZXR1cCA9IDEsCisJQ21kQ29uZmlndXJlID0gMiwKKwlDbWRNdWx0aWNhc3RMaXN0ID0gMywKKwlDbWRUeCA9IDQsCisJQ21kVERSID0gNSwKKwlDbWREdW1wID0gNiwKKwlDbWREaWFnbm9zZSA9IDcKK307CisKKyNpZiAwCitzdGF0aWMgY29uc3QgY2hhciAqQ1VjbWRuYW1lc1s4XSA9IHsgIk5PUCIsICJJQVNldHVwIiwgIkNvbmZpZ3VyZSIsICJNdWx0aWNhc3RMaXN0IiwKKwkJCQkgICAgICJUeCIsICJURFIiLCAiRHVtcCIsICJEaWFnbm9zZSIgfTsKKyNlbmRpZgorCisvKiBTdGF0dXMgd29yZCBiaXRzICovCisjZGVmaW5lCVNUQVRfQ1gJCTB4ODAwMAkvKiBUaGUgQ1UgZmluaXNoZWQgZXhlY3V0aW5nIGEgY29tbWFuZAorCQkJCSAgIHdpdGggdGhlIEludGVycnVwdCBiaXQgc2V0ICovCisjZGVmaW5lCVNUQVRfRlIJCTB4NDAwMAkvKiBUaGUgUlUgZmluaXNoZWQgcmVjZWl2aW5nIGEgZnJhbWUgKi8KKyNkZWZpbmUJU1RBVF9DTkEJMHgyMDAwCS8qIFRoZSBDVSBsZWZ0IHRoZSBhY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUJU1RBVF9STlIJMHgxMDAwCS8qIFRoZSBSVSBsZWZ0IHRoZSBhY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgU1RBVF9BQ0sJKFNUQVRfQ1ggfCBTVEFUX0ZSIHwgU1RBVF9DTkEgfCBTVEFUX1JOUikKKyNkZWZpbmUJU1RBVF9DVVMJMHgwNzAwCS8qIFN0YXR1cyBvZiBDVTogMDogaWRsZSwgMTogc3VzcGVuZGVkLAorCQkJCSAgIDI6IGFjdGl2ZSwgMy03OiB1bnVzZWQgKi8KKyNkZWZpbmUgU1RBVF9SVVMJMHgwMGYwCS8qIFN0YXR1cyBvZiBSVTogMDogaWRsZSwgMTogc3VzcGVuZGVkLAorCQkJCSAgIDI6IG5vIHJlc291cmNlcywgNDogcmVhZHksCisJCQkJICAgMTA6IG5vIHJlc291cmNlcyBkdWUgdG8gbm8gbW9yZSBSQkRzLAorCQkJCSAgIDEyOiBubyBtb3JlIFJCRHMsIG90aGVyOiB1bnVzZWQgKi8KKyNkZWZpbmUJU1RBVF9UCQkweDAwMDgJLyogQnVzIHRocm90dGxlIHRpbWVycyBsb2FkZWQgKi8KKyNkZWZpbmUJU1RBVF9aRVJPCTB4MDgwNwkvKiBBbHdheXMgemVybyAqLworCisjaWYgMAorc3RhdGljIGNoYXIgKkNVc3RhdGVzWzhdID0geworCSJpZGxlIiwgInN1c3BlbmRlZCIsICJhY3RpdmUiLCAwLCAwLCAwLCAwLCAwCit9Oworc3RhdGljIGNoYXIgKlJVc3RhdGVzWzE2XSA9IHsKKwkiaWRsZSIsICJzdXNwZW5kZWQiLCAibm8gcmVzb3VyY2VzIiwgMCwgInJlYWR5IiwgMCwgMCwgMCwKKwkwLCAwLCAibm8gUkJEcyIsIDAsICJvdXQgb2YgUkJEcyIsIDAsIDAsIDAKK307CisKK3N0YXRpYyB2b2lkCitpNTk2X291dF9zdGF0dXMoaW50IHN0YXR1cykgeworCWludCBiYWQgPSAwOworCWNoYXIgKnM7CisKKwlwcmludGsoInN0YXR1cyAlNC40eDoiLCBzdGF0dXMpOworCWlmIChzdGF0dXMgPT0gMHhmZmZmKQorCQlwcmludGsoIiBzdHJhbmdlLi5cbiIpOworCWVsc2UgeworCQlpZiAoc3RhdHVzICYgU1RBVF9DWCkKKwkJCXByaW50aygiICBDVSBkb25lIik7CisJCWlmIChzdGF0dXMgJiBTVEFUX0NOQSkKKwkJCXByaW50aygiICBDVSBzdG9wcGVkIik7CisJCWlmIChzdGF0dXMgJiBTVEFUX0ZSKQorCQkJcHJpbnRrKCIgIGdvdCBhIGZyYW1lIik7CisJCWlmIChzdGF0dXMgJiBTVEFUX1JOUikKKwkJCXByaW50aygiICBSVSBzdG9wcGVkIik7CisJCWlmIChzdGF0dXMgJiBTVEFUX1QpCisJCQlwcmludGsoIiAgdGhyb3R0bGVkIik7CisJCWlmIChzdGF0dXMgJiBTVEFUX1pFUk8pCisJCQliYWQgPSAxOworCQlzID0gQ1VzdGF0ZXNbKHN0YXR1cyAmIFNUQVRfQ1VTKSA+PiA4XTsKKwkJaWYgKCFzKQorCQkJYmFkID0gMTsKKwkJZWxzZQorCQkJcHJpbnRrKCIgIENVKCVzKSIsIHMpOworCQlzID0gUlVzdGF0ZXNbKHN0YXR1cyAmIFNUQVRfUlVTKSA+PiA0XTsKKwkJaWYgKCFzKQorCQkJYmFkID0gMTsKKwkJZWxzZQorCQkJcHJpbnRrKCIgIFJVKCVzKSIsIHMpOworCQlpZiAoYmFkKQorCQkJcHJpbnRrKCIgIGJhZCBzdGF0dXMiKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KK30KKyNlbmRpZgorCisvKiBDb21tYW5kIHdvcmQgYml0cyAqLworI2RlZmluZSBBQ0tfQ1gJCTB4ODAwMAorI2RlZmluZSBBQ0tfRlIJCTB4NDAwMAorI2RlZmluZSBBQ0tfQ05BCQkweDIwMDAKKyNkZWZpbmUgQUNLX1JOUgkJMHgxMDAwCisKKyNkZWZpbmUgQ1VDX1NUQVJUCTB4MDEwMAorI2RlZmluZSBDVUNfUkVTVU1FCTB4MDIwMAorI2RlZmluZSBDVUNfU1VTUEVORAkweDAzMDAKKyNkZWZpbmUgQ1VDX0FCT1JUCTB4MDQwMAorCisjZGVmaW5lIFJYX1NUQVJUCTB4MDAxMAorI2RlZmluZSBSWF9SRVNVTUUJMHgwMDIwCisjZGVmaW5lIFJYX1NVU1BFTkQJMHgwMDMwCisjZGVmaW5lIFJYX0FCT1JUCTB4MDA0MAorCit0eXBlZGVmIHUzMiBwaHlzX2FkZHI7CisKK3N0YXRpYyBpbmxpbmUgcGh5c19hZGRyCit2YV90b19wYSh2b2lkICp4KSB7CisJcmV0dXJuIHggPyB2aXJ0X3RvX2J1cyh4KSA6IEk1OTZfTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkICoKK3BhX3RvX3ZhKHBoeXNfYWRkciB4KSB7CisJcmV0dXJuICh4ID09IEk1OTZfTlVMTCkgPyBOVUxMIDogYnVzX3RvX3ZpcnQoeCk7Cit9CisKKy8qIHN0YXR1cyBiaXRzIGZvciBjbWQgKi8KKyNkZWZpbmUgQ01EX1NUQVRfQwkweDgwMDAJLyogQ1UgY29tbWFuZCBjb21wbGV0ZSAqLworI2RlZmluZSBDTURfU1RBVF9CCTB4NDAwMAkvKiBDVSBjb21tYW5kIGluIHByb2dyZXNzICovCisjZGVmaW5lIENNRF9TVEFUX09LCTB4MjAwMAkvKiBDVSBjb21tYW5kIGNvbXBsZXRlZCB3aXRob3V0IGVycm9ycyAqLworI2RlZmluZSBDTURfU1RBVF9BCTB4MTAwMAkvKiBDVSBjb21tYW5kIGFibm9ybWFsbHkgdGVybWluYXRlZCAqLworCitzdHJ1Y3QgaTU5Nl9jbWQgewkJLyogOCBieXRlcyAqLworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBjb21tYW5kOworCXBoeXNfYWRkciBwYV9uZXh0OwkvKiB2YV90b19wYShzdHJ1Y3QgaTU5Nl9jbWQgKm5leHQpICovCit9OworCisjZGVmaW5lIEVPRgkJMHg4MDAwCisjZGVmaW5lIFNJWkVfTUFTSwkweDNmZmYKKworc3RydWN0IGk1OTZfdGJkIHsKKwl1bnNpZ25lZCBzaG9ydCBzaXplOworCXVuc2lnbmVkIHNob3J0IHBhZDsKKwlwaHlzX2FkZHIgcGFfbmV4dDsJLyogdmFfdG9fcGEoc3RydWN0IGk1OTZfdGJkICpuZXh0KSAqLworCXBoeXNfYWRkciBwYV9kYXRhOwkvKiB2YV90b19wYShjaGFyICpkYXRhKSAqLworCXN0cnVjdCBza19idWZmICpza2I7Cit9OworCitzdHJ1Y3QgdHhfY21kIHsKKwlzdHJ1Y3QgaTU5Nl9jbWQgY21kOworCXBoeXNfYWRkciBwYV90YmQ7CS8qIHZhX3RvX3BhKHN0cnVjdCBpNTk2X3RiZCAqdGJkKSAqLworCXVuc2lnbmVkIHNob3J0IHNpemU7CisJdW5zaWduZWQgc2hvcnQgcGFkOworfTsKKworLyogc3RhdHVzIGJpdHMgZm9yIHJmZCAqLworI2RlZmluZSBSRkRfU1RBVF9DCTB4ODAwMAkvKiBGcmFtZSByZWNlcHRpb24gY29tcGxldGUgKi8KKyNkZWZpbmUgUkZEX1NUQVRfQgkweDQwMDAJLyogRnJhbWUgcmVjZXB0aW9uIGluIHByb2dyZXNzICovCisjZGVmaW5lIFJGRF9TVEFUX09LCTB4MjAwMAkvKiBGcmFtZSByZWNlaXZlZCB3aXRob3V0IGVycm9ycyAqLworI2RlZmluZSBSRkRfU1RBVFVTCTB4MWZmZgorI2RlZmluZSBSRkRfTEVOR1RIX0VSUgkweDEwMDAKKyNkZWZpbmUgUkZEX0NSQ19FUlIJMHgwODAwCisjZGVmaW5lIFJGRF9BTElHTl9FUlIJMHgwNDAwCisjZGVmaW5lIFJGRF9OT0JVRlNfRVJSCTB4MDIwMAorI2RlZmluZSBSRkRfRE1BX0VSUgkweDAxMDAJLyogRE1BIG92ZXJydW4gZmFpbHVyZSB0byBhY3F1aXJlIHN5c3RlbSBidXMgKi8KKyNkZWZpbmUgUkZEX1NIT1JUX0ZSQU1FX0VSUgkweDAwODAKKyNkZWZpbmUgUkZEX05PRU9QX0VSUgkweDAwNDAKKyNkZWZpbmUgUkZEX1RSVU5DX0VSUgkweDAwMjAKKyNkZWZpbmUgUkZEX01VTFRJQ0FTVCAgMHgwMDAyCS8qIDA6IGRlc3RpbmF0aW9uIGhhZCBvdXIgYWRkcmVzcworCQkJCSAgIDE6IGRlc3RpbmF0aW9uIHdhcyBicm9hZGNhc3QvbXVsdGljYXN0ICovCisjZGVmaW5lIFJGRF9DT0xMSVNJT04gIDB4MDAwMQorCisvKiByZWNlaXZlIGZyYW1lIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBpNTk2X3JmZCB7CisJdW5zaWduZWQgc2hvcnQgc3RhdDsKKwl1bnNpZ25lZCBzaG9ydCBjbWQ7CisJcGh5c19hZGRyIHBhX25leHQ7CS8qIHZhX3RvX3BhKHN0cnVjdCBpNTk2X3JmZCAqbmV4dCkgKi8KKwlwaHlzX2FkZHIgcGFfcmJkOwkvKiB2YV90b19wYShzdHJ1Y3QgaTU5Nl9yYmQgKnJiZCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBjb3VudDsKKwl1bnNpZ25lZCBzaG9ydCBzaXplOworCWNoYXIgZGF0YVsxNTMyXTsKK307CisKKyNkZWZpbmUgUkJEX0VMCQkweDgwMDAKKyNkZWZpbmUgUkJEX1AJCTB4NDAwMAorI2RlZmluZSBSQkRfU0laRU1BU0sJMHgzZmZmCisjZGVmaW5lIFJCRF9FT0YJCTB4ODAwMAorI2RlZmluZSBSQkRfRgkJMHg0MDAwCisKKy8qIHJlY2VpdmUgYnVmZmVyIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBpNTk2X3JiZCB7CisJdW5zaWduZWQgc2hvcnQgc2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCBwYWQ7CisJcGh5c19hZGRyIHBhX25leHQ7CS8qIHZhX3RvX3BhKHN0cnVjdCBpNTk2X3RiZCAqbmV4dCkgKi8KKwlwaHlzX2FkZHIgcGFfZGF0YTsJLyogdmFfdG9fcGEoY2hhciAqZGF0YSkgKi8KKwlwaHlzX2FkZHIgcGFfcHJldjsJLyogdmFfdG9fcGEoc3RydWN0IGk1OTZfdGJkICpwcmV2KSAqLworCQorCS8qIERyaXZlciBwcml2YXRlIHBhcnQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworfTsKKworI2RlZmluZSBSWF9SSU5HX1NJWkUgNjQKKyNkZWZpbmUgUlhfU0tCU0laRSAoRVRIX0ZSQU1FX0xFTisxMCkKKyNkZWZpbmUgUlhfUkJEX1NJWkUgMzIKKworLyogU3lzdGVtIENvbnRyb2wgQmxvY2sgLSA0MCBieXRlcyAqLworc3RydWN0IGk1OTZfc2NiIHsKKwl1MTYgc3RhdHVzOwkJLyogMCAqLworCXUxNiBjb21tYW5kOwkJLyogMiAqLworCXBoeXNfYWRkciBwYV9jbWQ7CS8qIDQgLSB2YV90b19wYShzdHJ1Y3QgaTU5Nl9jbWQgKmNtZCkgKi8KKwlwaHlzX2FkZHIgcGFfcmZkOwkvKiA4IC0gdmFfdG9fcGEoc3RydWN0IGk1OTZfcmZkICpyZmQpICovCisJdTMyIGNyY19lcnI7CQkvKiAxMiAqLworCXUzMiBhbGlnbl9lcnI7CQkvKiAxNiAqLworCXUzMiByZXNvdXJjZV9lcnI7CS8qIDIwICovCisJdTMyIG92ZXJfZXJyOwkJLyogMjQgKi8KKwl1MzIgcmN2ZHRfZXJyOwkJLyogMjggKi8KKwl1MzIgc2hvcnRfZXJyOwkJLyogMzIgKi8KKwl1MTYgdF9vbjsJCS8qIDM2ICovCisJdTE2IHRfb2ZmOwkJLyogMzggKi8KK307CisKKy8qIEludGVybWVkaWF0ZSBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIC0gOCBieXRlcyAqLworc3RydWN0IGk1OTZfaXNjcCB7CisJdTMyIGJ1c3k7CQkvKiAwICovCisJcGh5c19hZGRyIHBhX3NjYjsJLyogNCAtIHZhX3RvX3BhKHN0cnVjdCBpNTk2X3NjYiAqc2NiKSAqLworfTsKKworLyogU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAtIDEyIGJ5dGVzICovCitzdHJ1Y3QgaTU5Nl9zY3AgeworCXUzMiBzeXNidXM7CQkvKiAwICovCisJdTMyIHBhZDsJCS8qIDQgKi8KKwlwaHlzX2FkZHIgcGFfaXNjcDsJLyogOCAtIHZhX3RvX3BhKHN0cnVjdCBpNTk2X2lzY3AgKmlzY3ApICovCit9OworCisvKiBTZWxmdGVzdCBhbmQgZHVtcCByZXN1bHRzIC0gbmVlZHMgMTYtYnl0ZSBhbGlnbm1lbnQgKi8KKy8qCisgKiBUaGUgc2l6ZSBvZiB0aGUgZHVtcCBhcmVhIGlzIDMwNCBieXRlcy4gV2hlbiB0aGUgZHVtcCBpcyBleGVjdXRlZAorICogYnkgdGhlIFBvcnQgY29tbWFuZCBhbiBleHRyYSB3b3JkIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGR1bXAgYXJlYS4KKyAqIFRoZSBleHRyYSB3b3JkIGlzIGEgY29weSBvZiB0aGUgRHVtcCBzdGF0dXMgd29yZCAoY29udGFpbmluZyB0aGUKKyAqIEMsIEIsIE9LIGJpdHMpLiBbSSBmaW5kIDB4YTAwNiwgd2l0aCBhMCBmb3IgQytPSyBhbmQgNiBmb3IgZHVtcF0KKyAqLworc3RydWN0IGk1OTZfZHVtcCB7CisJdTE2IGR1bXBbMTUzXTsJCS8qICgzMDQgPSAxMzBoKSArIDIgYnl0ZXMgKi8KK307CisKK3N0cnVjdCBpNTk2X3ByaXZhdGUgewkJLyogYWxpZ25lZCB0byBhIDE2LWJ5dGUgYm91bmRhcnkgKi8KKwlzdHJ1Y3QgaTU5Nl9zY3Agc2NwOwkvKiAwIC0gbmVlZHMgMTYtYnl0ZSBhbGlnbm1lbnQgKi8KKwlzdHJ1Y3QgaTU5Nl9pc2NwIGlzY3A7CS8qIDEyICovCisJc3RydWN0IGk1OTZfc2NiIHNjYjsJLyogMjAgKi8KKwl1MzIgZHVtbXk7CQkvKiA2MCAqLworCXN0cnVjdCBpNTk2X2R1bXAgZHVtcDsJLyogNjQgLSBuZWVkcyAxNi1ieXRlIGFsaWdubWVudCAqLworCisJc3RydWN0IGk1OTZfY21kIHNldF9hZGQ7CisJY2hhciBldGhfYWRkcls4XTsJLyogZGlyZWN0bHkgZm9sbG93cyBzZXRfYWRkICovCisKKwlzdHJ1Y3QgaTU5Nl9jbWQgc2V0X2NvbmY7CisJY2hhciBpNTk2X2NvbmZpZ1sxNl07CS8qIGRpcmVjdGx5IGZvbGxvd3Mgc2V0X2NvbmYgKi8KKworCXN0cnVjdCBpNTk2X2NtZCB0ZHI7CisJdW5zaWduZWQgbG9uZyB0ZHJfc3RhdDsJLyogZGlyZWN0bHkgZm9sbG93cyB0ZHIgKi8KKworCWludCBsYXN0X3Jlc3RhcnQ7CisJc3RydWN0IGk1OTZfcmJkICpyYmRfbGlzdDsKKwlzdHJ1Y3QgaTU5Nl9yYmQgKnJiZF90YWlsOworCXN0cnVjdCBpNTk2X3JmZCAqcnhfdGFpbDsKKwlzdHJ1Y3QgaTU5Nl9jbWQgKmNtZF90YWlsOworCXN0cnVjdCBpNTk2X2NtZCAqY21kX2hlYWQ7CisJaW50IGNtZF9iYWNrbG9nOworCXVuc2lnbmVkIGxvbmcgbGFzdF9jbWQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3BpbmxvY2tfdCBjbWRfbG9jazsKK307CisKK3N0YXRpYyBjaGFyIGluaXRfc2V0dXBbMTRdID0geworCTB4OEUsCS8qIGxlbmd0aCAxNCBieXRlcywgcHJlZmV0Y2ggb24gKi8KKwkweEM4LAkvKiBkZWZhdWx0OiBmaWZvIHRvIDgsIG1vbml0b3Igb2ZmICovCisJMHg0MCwJLyogZGVmYXVsdDogZG9uJ3Qgc2F2ZSBiYWQgZnJhbWVzIChhcHJpY290LmMgaGFkIDB4ODApICovCisJMHgyRSwJLyogKGRlZmF1bHQgaXMgMHgyNikKKwkJICAgTm8gc291cmNlIGFkZHJlc3MgaW5zZXJ0aW9uLCA4IGJ5dGUgcHJlYW1ibGUgKi8KKwkweDAwLAkvKiBkZWZhdWx0IHByaW9yaXR5IGFuZCBiYWNrb2ZmICovCisJMHg2MCwJLyogZGVmYXVsdCBpbnRlcmZyYW1lIHNwYWNpbmcgKi8KKwkweDAwLAkvKiBkZWZhdWx0IHNsb3QgdGltZSBMU0IgKi8KKwkweGYyLAkvKiBkZWZhdWx0IHNsb3QgdGltZSBhbmQgbnIgb2YgcmV0cmllcyAqLworCTB4MDAsCS8qIGRlZmF1bHQgdmFyaW91cyBiaXRzCisJCSAgICgwOiBwcm9taXNjdW91cyBtb2RlLCAxOiBicm9hZGNhc3QgZGlzYWJsZSwKKwkJICAgIDI6IGVuY29kaW5nIG1vZGUsIDM6IHRyYW5zbWl0IG9uIG5vIENSUywKKwkJICAgIDQ6IG5vIENSQyBpbnNlcnRpb24sIDU6IENSQyB0eXBlLAorCQkgICAgNjogYml0IHN0dWZmaW5nLCA3OiBwYWRkaW5nKSAqLworCTB4MDAsCS8qIGRlZmF1bHQgY2FycmllciBzZW5zZSBhbmQgY29sbGlzaW9uIGRldGVjdCAqLworCTB4NDAsCS8qIGRlZmF1bHQgbWluaW11bSBmcmFtZSBsZW5ndGggKi8KKwkweGZmLAkvKiAoZGVmYXVsdCBpcyAweGZmLCBhbmQgdGhhdCBpcyB3aGF0IGFwcmljb3QuYyBoYXM7CisJCSAgIGVscDQ4Ni5jIGhhcyAweGZiOiBFbmFibGUgY3JjIGFwcGVuZCBpbiBtZW1vcnkuKSAqLworCTB4MDAsCS8qIGRlZmF1bHQ6IG5vdCBmdWxsIGR1cGxleCAqLworCTB4N2YJLyogKGRlZmF1bHQgaXMgMHgzZikgbXVsdGkgSUEgKi8KK307CisKK3N0YXRpYyBpbnQgaTU5Nl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpNTk2X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgaTU5Nl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IGk1OTZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmk1OTZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaTU5Nl9hZGRfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpNTk2X2NtZCAqY21kKTsKK3N0YXRpYyB2b2lkIHByaW50X2V0aChjaGFyICopOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaTU5Nl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50CitpNTk2X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqbXNnLCBpbnQgY3QpIHsKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscDsKKwlpbnQgYm9ndXNjbnQgPSBjdDsKKworCWxwID0gKHN0cnVjdCBpNTk2X3ByaXZhdGUgKikgZGV2LT5wcml2OworCXdoaWxlIChscC0+c2NiLmNvbW1hbmQpIHsKKwkJaWYgKC0tYm9ndXNjbnQgPT0gMCkgeworCQkJcHJpbnRrKCIlczogJXMgdGltZWQgb3V0IC0gc3RhdCAlNC40eCwgY21kICU0LjR4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgbXNnLAorCQkJICAgICAgIGxwLT5zY2Iuc3RhdHVzLCBscC0+c2NiLmNvbW1hbmQpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJdWRlbGF5KDUpOworCQliYXJyaWVyKCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAoraW5pdF9yeF9idWZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBudW0pIHsKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscDsKKwlzdHJ1Y3QgaTU5Nl9yZmQgKnJmZDsKKwlpbnQgaTsKKwkvLyBzdHJ1Y3QgaTU5Nl9yYmQgKnJiZDsKKworCWxwID0gKHN0cnVjdCBpNTk2X3ByaXZhdGUgKikgZGV2LT5wcml2OworCWxwLT5zY2IucGFfcmZkID0gSTU5Nl9OVUxMOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXJmZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpNTk2X3JmZCksIEdGUF9LRVJORUwpOworCQlpZiAocmZkID09IE5VTEwpCisJCQlicmVhazsKKworCQlyZmQtPnN0YXQgPSAwOworCQlyZmQtPnBhX3JiZCA9IEk1OTZfTlVMTDsKKwkJcmZkLT5jb3VudCA9IDA7CisJCXJmZC0+c2l6ZSA9IDE1MzI7CisJCWlmIChpID09IDApIHsKKwkJCXJmZC0+Y21kID0gQ01EX0VPTDsKKwkJCWxwLT5yeF90YWlsID0gcmZkOworCQl9IGVsc2UgeworCQkJcmZkLT5jbWQgPSAwOworCQl9CisJCXJmZC0+cGFfbmV4dCA9IGxwLT5zY2IucGFfcmZkOworCQlscC0+c2NiLnBhX3JmZCA9IHZhX3RvX3BhKHJmZCk7CisJCWxwLT5yeF90YWlsLT5wYV9uZXh0ID0gbHAtPnNjYi5wYV9yZmQ7CisJfQorCisjaWYgMAorCWZvciAoaSA9IDA7IGk8UlhfUkJEX1NJWkU7IGkrKykgeworCQlyYmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTU5Nl9yYmQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHJiZCkgeworCQkJcmJkLT5wYWQgPSAwOworCQkJcmJkLT5jb3VudCA9IDA7CisJCQlyYmQtPnNrYiA9IGRldl9hbGxvY19za2IoUlhfU0tCX1NJWkUpOworCQkJaWYgKCFyYmQtPnNrYikgeworCQkJCXByaW50aygiZGV2X2FsbG9jX3NrYiBmYWlsZWQiKTsKKwkJCX0KKwkJCXJiZC0+bmV4dCA9IHJmZC0+cmJkOworCQkJaWYgKGkpIHsKKwkJCQlyZmQtPnJiZC0+cHJldiA9IHJiZDsKKwkJCQlyYmQtPnNpemUgPSBSWF9TS0JfU0laRTsKKwkJCX0gZWxzZSB7CisJCQkJcmJkLT5zaXplID0gKFJYX1NLQl9TSVpFIHwgUkJEX0VMKTsKKwkJCQlscC0+cmJkX3RhaWwgPSByYmQ7CisJCQl9CisKKwkJCXJmZC0+cmJkID0gcmJkOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJDb3VsZCBub3Qga21hbGxvYyByYmRcbiIpOworCQl9CisJfQorCWxwLT5yYmRfdGFpbC0+bmV4dCA9IHJmZC0+cmJkOworI2VuZGlmCisJcmV0dXJuIChpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCityZW1vdmVfcnhfYnVmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHA7CisJc3RydWN0IGk1OTZfcmZkICpyZmQ7CisKKwlscCA9IChzdHJ1Y3QgaTU5Nl9wcml2YXRlICopIGRldi0+cHJpdjsKKwlscC0+cnhfdGFpbC0+cGFfbmV4dCA9IEk1OTZfTlVMTDsKKworCWRvIHsKKwkJcmZkID0gcGFfdG9fdmEobHAtPnNjYi5wYV9yZmQpOworCQlscC0+c2NiLnBhX3JmZCA9IHJmZC0+cGFfbmV4dDsKKwkJa2ZyZWUocmZkKTsKKwl9IHdoaWxlIChyZmQgIT0gbHAtPnJ4X3RhaWwpOworCisJbHAtPnJ4X3RhaWwgPSBOVUxMOworCisjaWYgMAorCWZvciAobHAtPnJiZF9saXN0KSB7CisJfQorI2VuZGlmCit9CisKKyNkZWZpbmUgUE9SVF9SRVNFVCAgICAgICAgICAgICAgMHgwMCAgICAvKiByZXNldCA4MjU5NiAqLworI2RlZmluZSBQT1JUX1NFTEZURVNUICAgICAgICAgICAweDAxICAgIC8qIHNlbGZ0ZXN0ICovCisjZGVmaW5lIFBPUlRfQUxUU0NQICAgICAgICAgICAgIDB4MDIgICAgLyogYWx0ZXJuYXRlIFNDQiBhZGRyZXNzICovCisjZGVmaW5lIFBPUlRfRFVNUCAgICAgICAgICAgICAgIDB4MDMgICAgLyogZHVtcCAqLworCisjZGVmaW5lIElPQUREUgkweGNiMAkJLyogcmVhbCBjb25zdGFudCAqLworI2RlZmluZSBJUlEJMTAJCS8qIGRlZmF1bHQgSVJRIC0gY2FuIGJlIGNoYW5nZWQgYnkgRUNVICovCisKKy8qIFRoZSA4MjU5NiByZXF1aXJlcyB0d28gMTYtYml0IHdyaXRlIGN5Y2xlcyBmb3IgYSBwb3J0IGNvbW1hbmQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorUE9SVChwaHlzX2FkZHIgYSwgdW5zaWduZWQgaW50IGNtZCkgeworCWlmIChhICYgMHhmKQorCQlwcmludGsoImxwNDg2ZS5jOiBQT1JUOiBhZGRyZXNzIG5vdCBhbGlnbmVkXG4iKTsKKwlvdXR3KCgoYSAmIDB4ZmZmZikgfCBjbWQpLCBJT0FERFIpOworCW91dHcoKChhPj4xNikgJiAweGZmZmYpLCBJT0FERFIrMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorQ0Eodm9pZCkgeworCW91dGIoMCwgSU9BRERSKzQpOworCXVkZWxheSg4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitDTEVBUl9JTlQodm9pZCkgeworCW91dGIoMCwgSU9BRERSKzgpOworfQorCisjZGVmaW5lIFNJWkUoeCkJKHNpemVvZih4KS9zaXplb2YoKHgpWzBdKSkKKworI2lmIDAKKy8qIHNlbGZ0ZXN0IG9yIGR1bXAgKi8KK3N0YXRpYyB2b2lkCitpNTk2X3BvcnRfZG8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBvcnRjbWQsIGNoYXIgKmNtZG5hbWUpIHsKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwl1MTYgKm91dHA7CisJaW50IGksIG07CisKKwltZW1zZXQoKHZvaWQgKikmKGxwLT5kdW1wKSwgMCwgc2l6ZW9mKHN0cnVjdCBpNTk2X2R1bXApKTsKKwlvdXRwID0gJihscC0+ZHVtcC5kdW1wWzBdKTsKKworCVBPUlQodmFfdG9fcGEob3V0cCksIHBvcnRjbWQpOworCW1kZWxheSgzMCk7ICAgICAgICAgICAgIC8qIHJhbmRvbSwgdW5tb3RpdmF0ZWQgKi8KKworCXByaW50aygibHA0ODZlIGk4MjU5NiAlcyByZXN1bHQ6XG4iLCBjbWRuYW1lKTsKKwlmb3IgKG0gPSBTSVpFKGxwLT5kdW1wLmR1bXApOyBtICYmIGxwLT5kdW1wLmR1bXBbbS0xXSA9PSAwOyBtLS0pCisJCTsKKwlmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7CisJCXByaW50aygiICUwNHgiLCBscC0+ZHVtcC5kdW1wW2ldKTsKKwkJaWYgKGklOCA9PSA3KQorCQkJcHJpbnRrKCJcbiIpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYKKworc3RhdGljIGludAoraTU5Nl9zY3Bfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCWludCBib2d1c2NudDsKKworCS8qIFNldHVwIFNDUCwgSVNDUCwgU0NCICovCisJLyoKKwkgKiBzeXNidXMgYml0czoKKwkgKiAgb25seSBhIHNpbmdsZSBieXRlIGlzIHNpZ25pZmljYW50IC0gaGVyZSAweDQ0CisJICogIDB4ODA6IGJpZyBlbmRpYW4gbW9kZSAoZGV0YWlscyBkZXBlbmQgb24gc3RlcHBpbmcpCisJICogIDB4NDA6IDEKKwkgKiAgMHgyMDogaW50ZXJydXB0IHBpbiBpcyBhY3RpdmUgbG93CisJICogIDB4MTA6IGxvY2sgZnVuY3Rpb24gZGlzYWJsZWQKKwkgKiAgMHgwODogZXh0ZXJuYWwgdHJpZ2dlcmluZyBvZiBidXMgdGhyb3R0bGUgdGltZXJzCisJICogIDB4MDY6IDAwOiA4MjU4NiBjb21wYXQgbW9kZSwgMDE6IHNlZ21lbnRlZCBtb2RlLCAxMDogbGluZWFyIG1vZGUKKwkgKiAgMHgwMTogdW51c2VkCisJICovCisJbHAtPnNjcC5zeXNidXMgPSAweDAwNDQwMDAwOyAJCS8qIGxpbmVhciBtb2RlICovCisJbHAtPnNjcC5wYWQgPSAwOwkJCS8qIG11c3QgYmUgemVybyAqLworCWxwLT5zY3AucGFfaXNjcCA9IHZhX3RvX3BhKCYobHAtPmlzY3ApKTsKKworCS8qCisJICogVGhlIENQVSBzZXRzIHRoZSBJU0NQIHRvIDEgYmVmb3JlIGl0IGdpdmVzIHRoZSBmaXJzdCBDQSgpCisJICovCisJbHAtPmlzY3AuYnVzeSA9IDB4MDAwMTsKKwlscC0+aXNjcC5wYV9zY2IgPSB2YV90b19wYSgmKGxwLT5zY2IpKTsKKworCWxwLT5zY2IuY29tbWFuZCA9IDA7CisJbHAtPnNjYi5zdGF0dXMgPSAwOworCWxwLT5zY2IucGFfY21kID0gSTU5Nl9OVUxMOworCS8qIGxwLT5zY2IucGFfcmZkIGhhcyBiZWVuIGluaXRpYWxpc2VkIGFscmVhZHkgKi8KKworCWxwLT5sYXN0X2NtZCA9IGppZmZpZXM7CisJbHAtPmNtZF9iYWNrbG9nID0gMDsKKwlscC0+Y21kX2hlYWQgPSBOVUxMOworCisJLyoKKwkgKiBSZXNldCB0aGUgODI1OTYuCisJICogV2UgbmVlZCB0byB3YWl0IDEwIHN5c3RlbWNsb2NrIGN5Y2xlcywgYW5kCisJICogNSBzZXJpYWwgY2xvY2sgY3ljbGVzLgorCSAqLworCVBPUlQoMCwgUE9SVF9SRVNFVCk7CS8qIGFkZHJlc3MgcGFydCBpZ25vcmVkICovCisJdWRlbGF5KDEwMCk7CisKKwkvKgorCSAqIEJlZm9yZSB0aGUgQ0Egc2lnbmFsIGlzIGFzc2VydGVkLCB0aGUgZGVmYXVsdCBTQ1AgYWRkcmVzcworCSAqICgweDAwZmZmZmY0KSBjYW4gYmUgY2hhbmdlZCB0byBhIDE2LWJ5dGUgYWxpZ25lZCB2YWx1ZQorCSAqLworCVBPUlQodmFfdG9fcGEoJmxwLT5zY3ApLCBQT1JUX0FMVFNDUCk7CS8qIGNoYW5nZSB0aGUgc2NwIGFkZHJlc3MgKi8KKworCS8qCisJICogVGhlIGluaXRpYWxpemF0aW9uIHByb2NlZHVyZSBiZWdpbnMgd2hlbiBhCisJICogQ2hhbm5lbCBBdHRlbnRpb24gc2lnbmFsIGlzIGFzc2VydGVkIGFmdGVyIGEgcmVzZXQuCisJICovCisKKwlDQSgpOworCisJLyoKKwkgKiBUaGUgSVNDUCBidXN5IGlzIGNsZWFyZWQgYnkgdGhlIDgyNTk2IGFmdGVyIHRoZSBTQ0IgYWRkcmVzcyBpcyByZWFkLgorCSAqLworCWJvZ3VzY250ID0gMTAwOworCXdoaWxlIChscC0+aXNjcC5idXN5KSB7CisJCWlmICgtLWJvZ3VzY250ID09IDApIHsKKwkJCS8qIE5vIGk4MjU5NiBwcmVzZW50PyAqLworCQkJcHJpbnRrKCIlczogaTgyNTk2IGluaXRpYWxpemF0aW9uIHRpbWVkIG91dFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJdWRlbGF5KDUpOworCQliYXJyaWVyKCk7CisJfQorCS8qIEkgZmluZCBoZXJlIGJvZ3VzY250PT0xMDAsIHNvIG5vIGRlbGF5IHdhcyByZXF1aXJlZC4gKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpbml0X2k1OTYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwOworCisJaWYgKGk1OTZfc2NwX3NldHVwKGRldikpCisJCXJldHVybiAxOworCisJbHAgPSAoc3RydWN0IGk1OTZfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJbHAtPnNjYi5jb21tYW5kID0gMDsKKworCW1lbWNweSAoKHZvaWQgKilscC0+aTU5Nl9jb25maWcsIGluaXRfc2V0dXAsIDE0KTsKKwlscC0+c2V0X2NvbmYuY29tbWFuZCA9IENtZENvbmZpZ3VyZTsKKwlpNTk2X2FkZF9jbWQoZGV2LCAodm9pZCAqKSZscC0+c2V0X2NvbmYpOworCisJbWVtY3B5ICgodm9pZCAqKWxwLT5ldGhfYWRkciwgZGV2LT5kZXZfYWRkciwgNik7CisJbHAtPnNldF9hZGQuY29tbWFuZCA9IENtZElBU2V0dXA7CisJaTU5Nl9hZGRfY21kKGRldiwgKHN0cnVjdCBpNTk2X2NtZCAqKSZscC0+c2V0X2FkZCk7CisKKwlscC0+dGRyLmNvbW1hbmQgPSBDbWRURFI7CisJaTU5Nl9hZGRfY21kKGRldiwgKHN0cnVjdCBpNTk2X2NtZCAqKSZscC0+dGRyKTsKKworCWlmIChscC0+c2NiLmNvbW1hbmQgJiYgaTU5Nl90aW1lb3V0KGRldiwgImk4MjU5NiBpbml0IiwgMjAwKSkKKwkJcmV0dXJuIDE7CisKKwlscC0+c2NiLmNvbW1hbmQgPSBSWF9TVEFSVDsKKwlDQSgpOworCisJYmFycmllcigpOworCQorCWlmIChscC0+c2NiLmNvbW1hbmQgJiYgaTU5Nl90aW1lb3V0KGRldiwgIlJlY2VpdmUgVW5pdCBzdGFydCIsIDEwMCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlY2VpdmUgYSBzaW5nbGUgZnJhbWUgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpNTk2X3J4X29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCwKKwkgICAgc3RydWN0IGk1OTZfcmZkICpyZmQsIGludCAqZnJhbWVzKSB7CisKKwlpZiAocmZkLT5zdGF0ICYgUkZEX1NUQVRfT0spIHsKKwkJLyogYSBnb29kIGZyYW1lICovCisJCWludCBwa3RfbGVuID0gKHJmZC0+Y291bnQgJiAweDNmZmYpOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKTsKKworCQkoKmZyYW1lcykrKzsKKworCQlpZiAocmZkLT5jbWQgJiBDTURfRU9MKQorCQkJcHJpbnRrKCJSZWNlaXZlZCBvbiBFT0xcbiIpOworCisJCWlmIChza2IgPT0gTlVMTCkgeworCQkJcHJpbnRrICgiJXM6IGk1OTZfcnggTWVtb3J5IHNxdWVlemUsICIKKwkJCQkiZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCXNrYi0+ZGV2ID0gZGV2OwkJCisJCW1lbWNweShza2JfcHV0KHNrYixwa3RfbGVuKSwgcmZkLT5kYXRhLCBwa3RfbGVuKTsKKworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCW5ldGlmX3J4KHNrYik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJfSBlbHNlIHsKKyNpZiAwCisJCXByaW50aygiRnJhbWUgcmVjZXB0aW9uIGVycm9yIHN0YXR1cyAlMDR4XG4iLAorCQkgICAgICAgcmZkLT5zdGF0KTsKKyNlbmRpZgorCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWlmIChyZmQtPnN0YXQgJiBSRkRfQ09MTElTSU9OKQorCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJaWYgKHJmZC0+c3RhdCAmIFJGRF9TSE9SVF9GUkFNRV9FUlIpCisJCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlpZiAocmZkLT5zdGF0ICYgUkZEX0RNQV9FUlIpCisJCQlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJaWYgKHJmZC0+c3RhdCAmIFJGRF9OT0JVRlNfRVJSKQorCQkJbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCWlmIChyZmQtPnN0YXQgJiBSRkRfQUxJR05fRVJSKQorCQkJbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQlpZiAocmZkLT5zdGF0ICYgUkZEX0NSQ19FUlIpCisJCQlscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQlpZiAocmZkLT5zdGF0ICYgUkZEX0xFTkdUSF9FUlIpCisJCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCX0KKwlyZmQtPnN0YXQgPSByZmQtPmNvdW50ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraTU5Nl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGk1OTZfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJc3RydWN0IGk1OTZfcmZkICpyZmQ7CisJaW50IGZyYW1lcyA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlyZmQgPSBwYV90b192YShscC0+c2NiLnBhX3JmZCk7CisJCWlmICghcmZkKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImk1OTZfcng6IE5VTEwgcmZkP1xuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorI2lmIDEKKwkJaWYgKHJmZC0+c3RhdCAmJiAhKHJmZC0+c3RhdCAmIChSRkRfU1RBVF9DIHwgUkZEX1NUQVRfQikpKQorCQkJcHJpbnRrKCJTRjolcC0lMDR4XG4iLCByZmQsIHJmZC0+c3RhdCk7CisjZW5kaWYKKwkJaWYgKCEocmZkLT5zdGF0ICYgUkZEX1NUQVRfQykpCisJCQlicmVhazsJCS8qIG5leHQgb25lIG5vdCByZWFkeSAqLworCQlpZiAoaTU5Nl9yeF9vbmUoZGV2LCBscCwgcmZkLCAmZnJhbWVzKSkKKwkJCWJyZWFrOwkJLyogb3V0IG9mIG1lbW9yeSAqLworCQlyZmQtPmNtZCA9IENNRF9FT0w7CisJCWxwLT5yeF90YWlsLT5jbWQgPSAwOworCQlscC0+cnhfdGFpbCA9IHJmZDsKKwkJbHAtPnNjYi5wYV9yZmQgPSByZmQtPnBhX25leHQ7CisJCWJhcnJpZXIoKTsKKwl9CisKKwlyZXR1cm4gZnJhbWVzOworfQorCitzdGF0aWMgdm9pZAoraTU5Nl9jbGVhbnVwX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHA7CisJc3RydWN0IGk1OTZfY21kICpjbWQ7CisKKwlscCA9IChzdHJ1Y3QgaTU5Nl9wcml2YXRlICopIGRldi0+cHJpdjsKKwl3aGlsZSAobHAtPmNtZF9oZWFkKSB7CisJCWNtZCA9IChzdHJ1Y3QgaTU5Nl9jbWQgKilscC0+Y21kX2hlYWQ7CisKKwkJbHAtPmNtZF9oZWFkID0gcGFfdG9fdmEobHAtPmNtZF9oZWFkLT5wYV9uZXh0KTsKKwkJbHAtPmNtZF9iYWNrbG9nLS07CisKKwkJc3dpdGNoICgoY21kLT5jb21tYW5kKSAmIDB4NykgeworCQkJY2FzZSBDbWRUeDogeworCQkJCXN0cnVjdCB0eF9jbWQgKnR4X2NtZCA9IChzdHJ1Y3QgdHhfY21kICopIGNtZDsKKwkJCQlzdHJ1Y3QgaTU5Nl90YmQgKiB0eF9jbWRfdGJkOworCQkJCXR4X2NtZF90YmQgPSBwYV90b192YSh0eF9jbWQtPnBhX3RiZCk7CisKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueSh0eF9jbWRfdGJkLT5za2IpOworCisJCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCisJCQkJY21kLT5wYV9uZXh0ID0gSTU5Nl9OVUxMOworCQkJCWtmcmVlKCh1bnNpZ25lZCBjaGFyICopdHhfY21kKTsKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIENtZE11bHRpY2FzdExpc3Q6IHsKKwkJCQkvLyB1bnNpZ25lZCBzaG9ydCBjb3VudCA9ICooKHVuc2lnbmVkIHNob3J0ICopIChwdHIgKyAxKSk7CisKKwkJCQljbWQtPnBhX25leHQgPSBJNTk2X05VTEw7CisJCQkJa2ZyZWUoKHVuc2lnbmVkIGNoYXIgKiljbWQpOworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDogeworCQkJCWNtZC0+cGFfbmV4dCA9IEk1OTZfTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQliYXJyaWVyKCk7CisJfQorCisJaWYgKGxwLT5zY2IuY29tbWFuZCAmJiBpNTk2X3RpbWVvdXQoZGV2LCAiaTU5Nl9jbGVhbnVwX2NtZCIsIDEwMCkpCisJCTsKKworCWxwLT5zY2IucGFfY21kID0gdmFfdG9fcGEobHAtPmNtZF9oZWFkKTsKK30KKworc3RhdGljIHZvaWQgaTU5Nl9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCwgaW50IGlvYWRkcikgeworCisJaWYgKGxwLT5zY2IuY29tbWFuZCAmJiBpNTk2X3RpbWVvdXQoZGV2LCAiaTU5Nl9yZXNldCIsIDEwMCkpCisJCTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWxwLT5zY2IuY29tbWFuZCA9IENVQ19BQk9SVCB8IFJYX0FCT1JUOworCUNBKCk7CisJYmFycmllcigpOworCQorCS8qIHdhaXQgZm9yIHNodXRkb3duICovCisJaWYgKGxwLT5zY2IuY29tbWFuZCAmJiBpNTk2X3RpbWVvdXQoZGV2LCAiaTU5Nl9yZXNldCgyKSIsIDQwMCkpCisJCTsKKworCWk1OTZfY2xlYW51cF9jbWQoZGV2KTsKKwlpNTk2X3J4KGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCS8qZGV2X2tmcmVlX3NrYihza2IsIEZSRUVfV1JJVEUpOyovCisJaW5pdF9pNTk2KGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGk1OTZfYWRkX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaTU5Nl9jbWQgKmNtZCkgeworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY21kLT5zdGF0dXMgPSAwOworCWNtZC0+Y29tbWFuZCB8PSAoQ01EX0VPTCB8IENNRF9JTlRSKTsKKwljbWQtPnBhX25leHQgPSBJNTk2X05VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmNtZF9sb2NrLCBmbGFncyk7CisJCisJaWYgKGxwLT5jbWRfaGVhZCkgeworCQlscC0+Y21kX3RhaWwtPnBhX25leHQgPSB2YV90b19wYShjbWQpOworCX0gZWxzZSB7CisJCWxwLT5jbWRfaGVhZCA9IGNtZDsKKwkJaWYgKGxwLT5zY2IuY29tbWFuZCAmJiBpNTk2X3RpbWVvdXQoZGV2LCAiaTU5Nl9hZGRfY21kIiwgMTAwKSkKKwkJCTsKKwkJbHAtPnNjYi5wYV9jbWQgPSB2YV90b19wYShjbWQpOworCQlscC0+c2NiLmNvbW1hbmQgPSBDVUNfU1RBUlQ7CisJCUNBKCk7CisJfQorCWxwLT5jbWRfdGFpbCA9IGNtZDsKKwlscC0+Y21kX2JhY2tsb2crKzsKKworCWxwLT5jbWRfaGVhZCA9IHBhX3RvX3ZhKGxwLT5zY2IucGFfY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+Y21kX2xvY2ssIGZsYWdzKTsKKworCWlmIChscC0+Y21kX2JhY2tsb2cgPiAxNikgeworCQlpbnQgdGlja3Nzb2ZhciA9IGppZmZpZXMgLSBscC0+bGFzdF9jbWQ7CisJCWlmICh0aWNrc3NvZmFyIDwgSFovNCkKKwkJCXJldHVybjsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY29tbWFuZCB1bml0IHRpbWVkIG91dCwgc3RhdHVzIHJlc2V0dGluZy5cbiIsIGRldi0+bmFtZSk7CisJCWk1OTZfcmVzZXQoZGV2LCBscCwgaW9hZGRyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaTU5Nl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCWludCBpOworCisJaSA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmaTU5Nl9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKGkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSVJRICVkIG5vdCBmcmVlXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0dXJuIGk7CisJfQorCisJaWYgKChpID0gaW5pdF9yeF9idWZzKGRldiwgUlhfUklOR19TSVpFKSkgPCBSWF9SSU5HX1NJWkUpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG9ubHkgYWJsZSB0byBhbGxvY2F0ZSAlZCByZWNlaXZlIGJ1ZmZlcnNcbiIsIGRldi0+bmFtZSwgaSk7CisKKwlpZiAoaSA8IDQpIHsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCWluaXRfaTU5NihkZXYpOworCXJldHVybiAwOwkJCS8qIEFsd2F5cyBzdWNjZWVkICovCit9CisKK3N0YXRpYyBpbnQgaTU5Nl9zdGFydF94bWl0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHR4X2NtZCAqdHhfY21kOworCXNob3J0IGxlbmd0aDsKKworCWxlbmd0aCA9IHNrYi0+bGVuOworCQorCWlmIChsZW5ndGggPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQlsZW5ndGggPSBFVEhfWkxFTjsKKwl9CisJCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwl0eF9jbWQgPSAoc3RydWN0IHR4X2NtZCAqKSBrbWFsbG9jICgoc2l6ZW9mIChzdHJ1Y3QgdHhfY21kKSArIHNpemVvZiAoc3RydWN0IGk1OTZfdGJkKSksIEdGUF9BVE9NSUMpOworCWlmICh0eF9jbWQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaTU5Nl94bWl0IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQlscC0+c3RhdHMudHhfZHJvcHBlZCsrOworCQlkZXZfa2ZyZWVfc2tiIChza2IpOworCX0gZWxzZSB7CisJCXN0cnVjdCBpNTk2X3RiZCAqdHhfY21kX3RiZDsKKwkJdHhfY21kX3RiZCA9IChzdHJ1Y3QgaTU5Nl90YmQgKikgKHR4X2NtZCArIDEpOworCQl0eF9jbWQtPnBhX3RiZCA9IHZhX3RvX3BhICh0eF9jbWRfdGJkKTsKKwkJdHhfY21kX3RiZC0+cGFfbmV4dCA9IEk1OTZfTlVMTDsKKworCQl0eF9jbWQtPmNtZC5jb21tYW5kID0gKENNRF9GTEVYIHwgQ21kVHgpOworCisJCXR4X2NtZC0+cGFkID0gMDsKKwkJdHhfY21kLT5zaXplID0gMDsKKwkJdHhfY21kX3RiZC0+cGFkID0gMDsKKwkJdHhfY21kX3RiZC0+c2l6ZSA9IChFT0YgfCBsZW5ndGgpOworCisJCXR4X2NtZF90YmQtPnBhX2RhdGEgPSB2YV90b19wYSAoc2tiLT5kYXRhKTsKKwkJdHhfY21kX3RiZC0+c2tiID0gc2tiOworCisJCWlmIChpNTk2X2RlYnVnICYgTE9HX1NSQ0RTVCkKKwkJCXByaW50X2V0aCAoc2tiLT5kYXRhKTsKKworCQlpNTk2X2FkZF9jbWQgKGRldiwgKHN0cnVjdCBpNTk2X2NtZCAqKSB0eF9jbWQpOworCisJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpNTk2X3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBUcmFuc21pdHRlciB0aW1lb3V0LCBzZXJpb3VzIHByb2JsZW1zLiAqLworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyByZXNldHRpbmcuXG4iLCBkZXYtPm5hbWUpOworCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKworCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yICovCisJaWYgKGxwLT5sYXN0X3Jlc3RhcnQgPT0gbHAtPnN0YXRzLnR4X3BhY2tldHMpIHsKKwkJcHJpbnRrICgiUmVzZXR0aW5nIGJvYXJkLlxuIik7CisKKwkJLyogU2h1dGRvd24gYW5kIHJlc3RhcnQgKi8KKwkJaTU5Nl9yZXNldCAoZGV2LCBscCwgaW9hZGRyKTsKKwl9IGVsc2UgeworCQkvKiBJc3N1ZSBhIGNoYW5uZWwgYXR0ZW50aW9uIHNpZ25hbCAqLworCQlwcmludGsgKCJLaWNraW5nIGJvYXJkLlxuIik7CisJCWxwLT5zY2IuY29tbWFuZCA9IChDVUNfU1RBUlQgfCBSWF9TVEFSVCk7CisJCUNBKCk7CisJCWxwLT5sYXN0X3Jlc3RhcnQgPSBscC0+c3RhdHMudHhfcGFja2V0czsKKwl9CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9ldGgoY2hhciAqYWRkKSAKK3sKKwlpbnQgaTsKKworCXByaW50ayAoIkRlc3QgICIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUyLjJYIiwgKHVuc2lnbmVkIGNoYXIpIGFkZFtpXSk7CisJcHJpbnRrICgiXG4iKTsKKworCXByaW50ayAoIlNvdXJjZSIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUyLjJYIiwgKHVuc2lnbmVkIGNoYXIpIGFkZFtpKzZdKTsKKwlwcmludGsgKCJcbiIpOworCisJcHJpbnRrICgidHlwZSAlMi4yWCUyLjJYXG4iLAorCQkodW5zaWduZWQgY2hhcikgYWRkWzEyXSwgKHVuc2lnbmVkIGNoYXIpIGFkZFsxM10pOworfQorCitzdGF0aWMgaW50IF9faW5pdCBscDQ4NmVfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwOworCXVuc2lnbmVkIGNoYXIgZXRoX2FkZHJbNl0gPSB7IDAsIDB4YWEsIDAsIDAsIDAsIDAgfTsKKwl1bnNpZ25lZCBjaGFyICpiaW9zOworCWludCBpLCBqOworCWludCByZXQgPSAtRU5PTUVNOworCXN0YXRpYyBpbnQgcHJvYmVkOworCisJaWYgKHByb2JlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcHJvYmVkKys7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKElPQUREUiwgTFA0ODZFX1RPVEFMX1NJWkUsIERSVl9OQU1FKSkgeworCQlwcmludGsoS0VSTl9FUlIgImxwNDg2ZTogSU8gYWRkcmVzcyAweCV4IGluIHVzZVxuIiwgSU9BRERSKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlscCA9IChzdHJ1Y3QgaTU5Nl9wcml2YXRlICopIGRldi0+cHJpdjsKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmNtZF9sb2NrKTsKKwkKKwkvKgorCSAqIERvIHdlIHJlYWxseSBoYXZlIHRoaXMgdGhpbmc/CisJICovCisJaWYgKGk1OTZfc2NwX3NldHVwKGRldikpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2tmcmVlOworCX0KKworCWRldi0+YmFzZV9hZGRyID0gSU9BRERSOworCWRldi0+aXJxID0gSVJROworCisKKwkvKgorCSAqIEhvdyBkbyB3ZSBmaW5kIHRoZSBldGhlcm5ldCBhZGRyZXNzPyBJIGRvbid0IGtub3cuCisJICogT25lIHBvc3NpYmlsaXR5IGlzIHRvIGxvb2sgYXQgdGhlIEVJU0EgY29uZmlndXJhdGlvbiBhcmVhCisJICogWzB4ZTgwMDAtMHhlOWZmZl0uIFRoaXMgY29udGFpbnMgdGhlIGV0aGVybmV0IGFkZHJlc3MKKwkgKiBidXQgbm90IGF0IGEgZml4ZWQgYWRkcmVzcyAtIHRoaW5ncyBkZXBlbmQgb24gc2V0dXAgb3B0aW9ucy4KKwkgKgorCSAqIElmIHdlIGZpbmQgbm8gYWRkcmVzcywgb3IgdGhlIHdyb25nIGFkZHJlc3MsIHVzZQorCSAqICAgaWZjb25maWcgZXRoMCBodyBldGhlciBhMTphMjphMzphNDphNTphNgorCSAqIHdpdGggdGhlIHZhbHVlIGZvdW5kIGluIHRoZSBCSU9TIHNldHVwLgorCSAqLworCWJpb3MgPSBidXNfdG9fdmlydCgweGU4MDAwKTsKKwlmb3IgKGogPSAwOyBqIDwgMHgyMDAwOyBqKyspIHsKKwkJaWYgKGJpb3Nbal0gPT0gMCAmJiBiaW9zW2orMV0gPT0gMHhhYSAmJiBiaW9zW2orMl0gPT0gMCkgeworCQkJcHJpbnRrKCIlczogbWF5YmUgYWRkcmVzcyBhdCBCSU9TIDB4JXg6IiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIDB4ZTgwMDAraik7CisJCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQkJZXRoX2FkZHJbaV0gPSBiaW9zW2kral07CisJCQkJcHJpbnRrKCIgJTIuMlgiLCBldGhfYWRkcltpXSk7CisJCQl9CisJCQlwcmludGsoIlxuIik7CisJCX0KKwl9CisKKwlwcmludGsoIiVzOiBscDQ4NmUgODI1OTYgYXQgJSMzbHgsIElSUSAlZCwiLAorCSAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMlgiLCBkZXYtPmRldl9hZGRyW2ldID0gZXRoX2FkZHJbaV0pOworCXByaW50aygiXG4iKTsKKworCS8qIFRoZSBMUDQ4NkUtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSAmaTU5Nl9vcGVuOworCWRldi0+c3RvcCA9ICZpNTk2X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmk1OTZfc3RhcnRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9ICZpNTk2X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CisJZGV2LT50eF90aW1lb3V0ID0gaTU5Nl90eF90aW1lb3V0OworCisjaWYgMAorCS8qIHNlbGZ0ZXN0IHJlcG9ydHMgMHgzMjA5MjVhZSAtIGRvbid0IGtub3cgd2hhdCB0aGF0IG1lYW5zICovCisJaTU5Nl9wb3J0X2RvKGRldiwgUE9SVF9TRUxGVEVTVCwgInNlbGZ0ZXN0Iik7CisJaTU5Nl9wb3J0X2RvKGRldiwgUE9SVF9EVU1QLCAiZHVtcCIpOworI2VuZGlmCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfa2ZyZWU6CisJcmVsZWFzZV9yZWdpb24oSU9BRERSLCBMUDQ4NkVfVE9UQUxfU0laRSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpNTk2X2hhbmRsZV9DVV9jb21wbGV0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwLAorCQkJICB1bnNpZ25lZCBzaG9ydCBzdGF0dXMsCisJCQkgIHVuc2lnbmVkIHNob3J0ICphY2tfY21kcCkgeworCXN0cnVjdCBpNTk2X2NtZCAqY21kOworCWludCBmcmFtZXNfb3V0ID0gMDsKKwlpbnQgY29tbWFuZHNfZG9uZSA9IDA7CisJaW50IGNtZF92YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+Y21kX2xvY2ssIGZsYWdzKTsKKwljbWQgPSBscC0+Y21kX2hlYWQ7CisKKwl3aGlsZSAobHAtPmNtZF9oZWFkICYmIChscC0+Y21kX2hlYWQtPnN0YXR1cyAmIENNRF9TVEFUX0MpKSB7CisJCWNtZCA9IGxwLT5jbWRfaGVhZDsKKworCQlscC0+Y21kX2hlYWQgPSBwYV90b192YShscC0+Y21kX2hlYWQtPnBhX25leHQpOworCQlscC0+Y21kX2JhY2tsb2ctLTsKKworCQljb21tYW5kc19kb25lKys7CisJCWNtZF92YWwgPSBjbWQtPmNvbW1hbmQgJiAweDc7CisjaWYgMAorCQlwcmludGsoImZpbmlzaGVkIENVICVzIGNvbW1hbmQgKCVkKVxuIiwKKwkJICAgICAgIENVY21kbmFtZXNbY21kX3ZhbF0sIGNtZF92YWwpOworI2VuZGlmCisJCXN3aXRjaCAoY21kX3ZhbCkgeworCQljYXNlIENtZFR4OgorCQl7CisJCQlzdHJ1Y3QgdHhfY21kICp0eF9jbWQ7CisJCQlzdHJ1Y3QgaTU5Nl90YmQgKnR4X2NtZF90YmQ7CisKKwkJCXR4X2NtZCA9IChzdHJ1Y3QgdHhfY21kICopIGNtZDsKKwkJCXR4X2NtZF90YmQgPSBwYV90b192YSh0eF9jbWQtPnBhX3RiZCk7CisKKwkJCWZyYW1lc19vdXQrKzsKKwkJCWlmIChjbWQtPnN0YXR1cyAmIENNRF9TVEFUX09LKSB7CisJCQkJaWYgKGk1OTZfZGVidWcpCisJCQkJCXByaW50X2V0aChwYV90b192YSh0eF9jbWRfdGJkLT5wYV9kYXRhKSk7CisJCQl9IGVsc2UgeworCQkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQlpZiAoaTU5Nl9kZWJ1ZykKKwkJCQkJcHJpbnRrKCJ0cmFuc21pc3Npb24gZmFpbHVyZTolMDR4XG4iLAorCQkJCQkgICAgICAgY21kLT5zdGF0dXMpOworCQkJCWlmIChjbWQtPnN0YXR1cyAmIDB4MDAyMCkKKwkJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCQlpZiAoIShjbWQtPnN0YXR1cyAmIDB4MDA0MCkpCisJCQkJCWxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCQkJaWYgKGNtZC0+c3RhdHVzICYgMHgwNDAwKQorCQkJCQlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQlpZiAoY21kLT5zdGF0dXMgJiAweDA4MDApCisJCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCQkJaWYgKGNtZC0+c3RhdHVzICYgMHgxMDAwKQorCQkJCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCX0KKwkJCWRldl9rZnJlZV9za2JfaXJxKHR4X2NtZF90YmQtPnNrYik7CisKKwkJCWNtZC0+cGFfbmV4dCA9IEk1OTZfTlVMTDsKKwkJCWtmcmVlKCh1bnNpZ25lZCBjaGFyICopdHhfY21kKTsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBDbWRNdWx0aWNhc3RMaXN0OgorCQkJY21kLT5wYV9uZXh0ID0gSTU5Nl9OVUxMOworCQkJa2ZyZWUoKHVuc2lnbmVkIGNoYXIgKiljbWQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBDbWRURFI6CisJCXsKKwkJCXVuc2lnbmVkIGxvbmcgc3RhdHVzID0gKigodW5zaWduZWQgbG9uZyAqKSAoY21kICsgMSkpOworCQkJaWYgKHN0YXR1cyAmIDB4ODAwMCkgeworCQkJCWlmIChpNTk2X2RlYnVnKQorCQkJCQlwcmludGsoIiVzOiBsaW5rIG9rLlxuIiwgZGV2LT5uYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHN0YXR1cyAmIDB4NDAwMCkKKwkJCQkJcHJpbnRrKCIlczogVHJhbnNjZWl2ZXIgcHJvYmxlbS5cbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCWlmIChzdGF0dXMgJiAweDIwMDApCisJCQkJCXByaW50aygiJXM6IFRlcm1pbmF0aW9uIHByb2JsZW0uXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQlpZiAoc3RhdHVzICYgMHgxMDAwKQorCQkJCQlwcmludGsoIiVzOiBTaG9ydCBjaXJjdWl0LlxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJcHJpbnRrKCIlczogVGltZSAlbGQuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyAmIDB4MDdmZik7CisJCQl9CisJCX0KKwkJZGVmYXVsdDoKKwkJCWNtZC0+cGFfbmV4dCA9IEk1OTZfTlVMTDsKKwkJCWxwLT5sYXN0X2NtZCA9IGppZmZpZXM7CisJCQkKKwkJfQorCQliYXJyaWVyKCk7CisJfQorCisJY21kID0gbHAtPmNtZF9oZWFkOworCXdoaWxlIChjbWQgJiYgKGNtZCAhPSBscC0+Y21kX3RhaWwpKSB7CisJCWNtZC0+Y29tbWFuZCAmPSAweDFmZmY7CisJCWNtZCA9IHBhX3RvX3ZhKGNtZC0+cGFfbmV4dCk7CisJCWJhcnJpZXIoKTsKKwl9CisKKwlpZiAobHAtPmNtZF9oZWFkKQorCQkqYWNrX2NtZHAgfD0gQ1VDX1NUQVJUOworCWxwLT5zY2IucGFfY21kID0gdmFfdG9fcGEobHAtPmNtZF9oZWFkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+Y21kX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlycXJldHVybl90CitpNTk2X2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2luc3RhbmNlOworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwOworCXVuc2lnbmVkIHNob3J0IHN0YXR1cywgYWNrX2NtZCA9IDA7CisJaW50IGZyYW1lc19pbiA9IDA7CisKKwlscCA9IChzdHJ1Y3QgaTU5Nl9wcml2YXRlICopIGRldi0+cHJpdjsKKworCS8qCisJICogVGhlIDgyNTk2IGV4YW1pbmVzIHRoZSBjb21tYW5kLCBwZXJmb3JtcyB0aGUgcmVxdWlyZWQgYWN0aW9uLAorCSAqIGFuZCB0aGVuIGNsZWFycyB0aGUgU0NCIGNvbW1hbmQgd29yZC4KKwkgKi8KKwlpZiAobHAtPnNjYi5jb21tYW5kICYmIGk1OTZfdGltZW91dChkZXYsICJpbnRlcnJ1cHQiLCA0MCkpCisJCTsKKworCS8qCisJICogVGhlIHN0YXR1cyB3b3JkIGluZGljYXRlcyB0aGUgc3RhdHVzIG9mIHRoZSA4MjU5Ni4KKwkgKiBJdCBpcyBtb2RpZmllZCBvbmx5IGJ5IHRoZSA4MjU5Ni4KKwkgKgorCSAqIFtTbywgd2UgbXVzdCBub3QgY2xlYXIgaXQuIEkgZmluZCBvZnRlbiBzdGF0dXMgMHhmZmZmLAorCSAqICB3aGljaCBpcyBub3Qgb25lIG9mIHRoZSB2YWx1ZXMgYWxsb3dlZCBieSB0aGUgZG9jcy5dCisJICovCisJc3RhdHVzID0gbHAtPnNjYi5zdGF0dXM7CisjaWYgMAorCWlmIChpNTk2X2RlYnVnKSB7CisJCXByaW50aygiJXM6IGk1OTYgaW50ZXJydXB0LCAiLCBkZXYtPm5hbWUpOworCQlpNTk2X291dF9zdGF0dXMoc3RhdHVzKTsKKwl9CisjZW5kaWYKKwkvKiBJbXBvc3NpYmxlLCBidXQgaXQgaGFwcGVucyAtIHBlcmhhcHMgd2hlbiB3ZSBnZXQKKwkgICBhIHJlY2VpdmUgaW50ZXJydXB0IGJ1dCBzY2IucGFfcmZkIGlzIEk1OTZfTlVMTC4gKi8KKwlpZiAoc3RhdHVzID09IDB4ZmZmZikgeworCQlwcmludGsoIiVzOiBpNTk2X2ludGVycnVwdDogZ290IHN0YXR1cyAweGZmZmZcbiIsIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWFja19jbWQgPSAoc3RhdHVzICYgU1RBVF9BQ0spOworCisJaWYgKHN0YXR1cyAmIChTVEFUX0NYIHwgU1RBVF9DTkEpKQorCQlpNTk2X2hhbmRsZV9DVV9jb21wbGV0aW9uKGRldiwgbHAsIHN0YXR1cywgJmFja19jbWQpOworCisJaWYgKHN0YXR1cyAmIChTVEFUX0ZSIHwgU1RBVF9STlIpKSB7CisJCS8qIFJlc3RhcnQgdGhlIHJlY2VpdmUgdW5pdCB3aGVuIGl0IGdvdCBpbmFjdGl2ZSBzb21laG93ICovCisJCWlmICgoc3RhdHVzICYgU1RBVF9STlIpICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCWFja19jbWQgfD0gUlhfU1RBUlQ7CisKKwkJaWYgKHN0YXR1cyAmIFNUQVRfRlIpIHsKKwkJCWZyYW1lc19pbiA9IGk1OTZfcngoZGV2KTsKKwkJCWlmICghZnJhbWVzX2luKQorCQkJCXByaW50aygicmVjZWl2ZSBmcmFtZSByZXBvcnRlZCwgYnV0IG5vIGZyYW1lc1xuIik7CisJCX0KKwl9CisKKwkvKiBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0ICovCisJLyoKKwlpZiAoKGxwLT5zY2IucGFfY21kICE9IEk1OTZfTlVMTCkgJiYgbmV0aWZfcnVubmluZyhkZXYpKQorCQlhY2tfY21kIHw9IENVQ19TVEFSVDsKKwkqLworCisJaWYgKGxwLT5zY2IuY29tbWFuZCAmJiBpNTk2X3RpbWVvdXQoZGV2LCAiaTU5NiBpbnRlcnJ1cHQiLCAxMDApKQorCQk7CisKKwlscC0+c2NiLmNvbW1hbmQgPSBhY2tfY21kOworCisJQ0xFQVJfSU5UKCk7CisJQ0EoKTsKKworIG91dDoKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgaTU5Nl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoaTU5Nl9kZWJ1ZykKKwkJcHJpbnRrKCIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgJTQuNHguXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBscC0+c2NiLnN0YXR1cyk7CisKKwlscC0+c2NiLmNvbW1hbmQgPSAoQ1VDX0FCT1JUIHwgUlhfQUJPUlQpOworCUNBKCk7CisKKwlpNTk2X2NsZWFudXBfY21kKGRldik7CisKKwlpZiAobHAtPnNjYi5jb21tYW5kICYmIGk1OTZfdGltZW91dChkZXYsICJpNTk2X2Nsb3NlIiwgMjAwKSkKKwkJOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVtb3ZlX3J4X2J1ZnMoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBpNTk2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyoKKyoJU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisqLworCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBpNTk2X2NtZCAqY21kOworCisJaWYgKGk1OTZfZGVidWcgPiAxKQorCQlwcmludGsgKCIlczogc2V0IG11bHRpY2FzdCBsaXN0ICVkXG4iLAorCQkJZGV2LT5uYW1lLCBkZXYtPm1jX2NvdW50KTsKKworCWlmIChkZXYtPm1jX2NvdW50ID4gMCkgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaTsKKwkJY2hhciAqY3A7CisJCWNtZCA9IChzdHJ1Y3QgaTU5Nl9jbWQgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTU5Nl9jbWQpKzIrZGV2LT5tY19jb3VudCo2LCBHRlBfQVRPTUlDKTsKKwkJaWYgKGNtZCA9PSBOVUxMKSB7CisJCQlwcmludGsgKEtFUk5fRVJSICIlczogc2V0X211bHRpY2FzdCBNZW1vcnkgc3F1ZWV6ZS5cbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwkJY21kLT5jb21tYW5kID0gQ21kTXVsdGljYXN0TGlzdDsKKwkJKigodW5zaWduZWQgc2hvcnQgKikgKGNtZCArIDEpKSA9IGRldi0+bWNfY291bnQgKiA2OworCQljcCA9ICgoY2hhciAqKShjbWQgKyAxKSkrMjsKKwkJZm9yIChkbWkgPSBkZXYtPm1jX2xpc3Q7IGRtaSAhPSBOVUxMOyBkbWkgPSBkbWktPm5leHQpIHsKKwkJCW1lbWNweShjcCwgZG1pLDYpOworCQkJY3AgKz0gNjsKKwkJfQorCQlpZiAoaTU5Nl9kZWJ1ZyAmIExPR19TUkNEU1QpCisJCQlwcmludF9ldGggKCgoY2hhciAqKShjbWQgKyAxKSkgKyAyKTsKKwkJaTU5Nl9hZGRfY21kKGRldiwgY21kKTsKKwl9IGVsc2UgeworCQlpZiAobHAtPnNldF9jb25mLnBhX25leHQgIT0gSTU5Nl9OVUxMKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGRldi0+bWNfY291bnQgPT0gMCAmJiAhKGRldi0+ZmxhZ3MgJiAoSUZGX1BST01JU0MgfCBJRkZfQUxMTVVMVEkpKSkgeworCQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCisJCQkJZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKKwkJCWxwLT5pNTk2X2NvbmZpZ1s4XSAmPSB+MHgwMTsKKwkJfSBlbHNlIHsKKwkJCWxwLT5pNTk2X2NvbmZpZ1s4XSB8PSAweDAxOworCQl9CisKKwkJaTU5Nl9hZGRfY21kKGRldiwgKHN0cnVjdCBpNTk2X2NtZCAqKSAmbHAtPnNldF9jb25mKTsKKwl9Cit9CisKK01PRFVMRV9BVVRIT1IoIkFyZCB2YW4gQnJlZW1lbiA8YXJkQGNzdG1lbC5ubC5ldS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIFBhbnRoZXIgb25ib2FyZCBpODI1OTYgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2xwNDg2ZTsKK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXg7CitzdGF0aWMgaW50IG9wdGlvbnM7CitzdGF0aWMgaW50IGlvID0gSU9BRERSOworc3RhdGljIGludCBpcnEgPSBJUlE7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKKy8vbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKKy8vbW9kdWxlX3BhcmFtKHJldmVyc2VfcHJvYmUsIGludCwgMCk7CisvL21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW0ob3B0aW9ucywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShmdWxsX2R1cGxleCwgaW50LCAwKTsKKworc3RhdGljIGludCBfX2luaXQgbHA0ODZlX2luaXRfbW9kdWxlKHZvaWQpIHsKKwlpbnQgZXJyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGk1OTZfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldi0+aXJxID0gaXJxOworCWRldi0+YmFzZV9hZGRyID0gaW87CisJZXJyID0gbHA0ODZlX3Byb2JlKGRldik7CisJaWYgKGVycikgeworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBMUDQ4NkVfVE9UQUxfU0laRSk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBlcnI7CisJfQorCWRldl9scDQ4NmUgPSBkZXY7CisJZnVsbF9kdXBsZXggPSAwOworCW9wdGlvbnMgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbHA0ODZlX2NsZWFudXBfbW9kdWxlKHZvaWQpIHsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfbHA0ODZlKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXZfbHA0ODZlLT5iYXNlX2FkZHIsIExQNDg2RV9UT1RBTF9TSVpFKTsKKwlmcmVlX25ldGRldihkZXZfbHA0ODZlKTsKK30KKworbW9kdWxlX2luaXQobHA0ODZlX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGxwNDg2ZV9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWM4MzkwLmMgYi9kcml2ZXJzL25ldC9tYWM4MzkwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1NzYxOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L21hYzgzOTAuYwpAQCAtMCwwICsxLDc1NyBAQAorLyogbWFjODM5MC5jOiBOZXcgZHJpdmVyIGZvciA4MzkwLWJhc2VkIE51YnVzIChvciBOdWJ1cy1hbGlrZSkKKyAgIEV0aGVybmV0IGNhcmRzIG9uIExpbnV4ICovCisvKiBCYXNlZCBvbiB0aGUgZm9ybWVyIGRheW5hcG9ydC5jIGRyaXZlciwgYnkgQWxhbiBDb3guICBTb21lIGNvZGUKKyAgIHRha2VuIGZyb20gb3IgaW5zcGlyZWQgYnkgc2tlbGV0b24uYyBieSBEb25hbGQgQmVja2VyLCBhY2VuaWMuYyBieQorICAgSmVzIFNvcmVuc2VuLCBhbmQgbmUyay1wY2kuYyBieSBEb25hbGQgQmVja2VyIGFuZCBQYXVsIEdvcnRtYWtlci4KKworICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICAgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuICAqLworCisvKiAyMDAwLTAyLTI4OiBzdXBwb3J0IGFkZGVkIGZvciBEYXluYSBhbmQgS2luZXRpY3MgY2FyZHMgYnkgCisgICBBLkcuZGVXaWpuQHBoeXMudXUubmwgKi8KKy8qIDIwMDAtMDQtMDQ6IHN1cHBvcnQgYWRkZWQgZm9yIERheW5hMiBieSBiYXJ0QGV0cG1vZC5waHlzLnR1ZS5ubCAqLworLyogMjAwMS0wNC0xODogc3VwcG9ydCBmb3IgRGF5bmFQb3J0IEUvTEMtTSBieSByYXlrQGtuaWdodHNtYW5vci5vcmcgKi8KKy8qIDIwMDEtMDUtMTU6IHN1cHBvcnQgZm9yIENhYmxldHJvbiBwb3J0ZWQgZnJvbSBvbGQgZGF5bmFwb3J0IGRyaXZlcgorICogYW5kIGZpeGVkIGFjY2VzcyB0byBTb25pYyBTeXMgY2FyZCB3aGljaCBtYXNxdWVyYWRlcyBhcyBhIEZhcmFsbG9uIAorICogYnkgcmF5a0BrbmlnaHRzbWFub3Iub3JnICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L251YnVzLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2h3dGVzdC5oPgorI2luY2x1ZGUgPGFzbS9tYWNpbnRzLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKyNkZWZpbmUgV0RfU1RBUlRfUEcJCQkweDAwCS8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyICovCisjZGVmaW5lIENBQkxFVFJPTl9SWF9TVEFSVF9QRwkJMHgwMCAgICAvKiBGaXJzdCBwYWdlIG9mIFJYIGJ1ZmZlciAqLworI2RlZmluZSBDQUJMRVRST05fUlhfU1RPUF9QRwkJMHgzMCAgICAvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworI2RlZmluZSBDQUJMRVRST05fVFhfU1RBUlRfUEcJCUNBQkxFVFJPTl9SWF9TVE9QX1BHICAvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlciAqLworCisvKiBVbmZvcnR1bmF0ZWx5IGl0IHNlZW1zIHdlIGhhdmUgdG8gaGFyZGNvZGUgdGhlc2UgZm9yIHRoZSBtb21lbnQgKi8KKy8qIFNob3VsZG4ndCB0aGUgY2FyZCBrbm93IGFib3V0IHRoaXM/IERvZXMgYW55b25lIGtub3cgd2hlcmUgdG8gcmVhZCBpdCBvZmYgdGhlIGNhcmQ/IERvIHdlIHRydXN0IHRoZSBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBjYXJkPyAqLworCisjZGVmaW5lIERBWU5BXzgzOTBfQkFTRQkJMHg4MDAwMAorI2RlZmluZSBEQVlOQV84MzkwX01FTQkJMHgwMDAwMAorCisjZGVmaW5lIEtJTkVUSUNTXzgzOTBfQkFTRQkweDgwMDAwCisjZGVmaW5lIEtJTkVUSUNTXzgzOTBfTUVNCTB4MDAwMDAKKworI2RlZmluZSBDQUJMRVRST05fODM5MF9CQVNFCTB4OTAwMDAJCisjZGVmaW5lIENBQkxFVFJPTl84MzkwX01FTQkweDAwMDAwCisKK2VudW0gbWFjODM5MF90eXBlIHsKKwlNQUM4MzkwX05PTkUgPSAtMSwKKwlNQUM4MzkwX0FQUExFLAorCU1BQzgzOTBfQVNBTlRFLAorCU1BQzgzOTBfRkFSQUxMT04sICAvKiBBcHBsZSwgQXNhbnRlLCBhbmQgRmFyYWxsb24gYXJlIGFsbCBjb21wYXRpYmxlICovCisJTUFDODM5MF9DQUJMRVRST04sCisJTUFDODM5MF9EQVlOQSwKKwlNQUM4MzkwX0lOVEVSTEFOLAorCU1BQzgzOTBfS0lORVRJQ1MsCisJTUFDODM5MF9GT0NVUywKKwlNQUM4MzkwX1NPTklDU1lTLAorCU1BQzgzOTBfREFZTkEyLAorCU1BQzgzOTBfREFZTkEzLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjYXJkbmFtZVtdID0geworCSJhcHBsZSIsCisJImFzYW50ZSIsCisJImZhcmFsbG9uIiwKKwkiY2FibGV0cm9uIiwKKwkiZGF5bmEiLAorCSJpbnRlcmxhbiIsCisJImtpbmV0aWNzIiwKKwkiZm9jdXMiLAorCSJzb25pYyBzeXN0ZW1zIiwKKwkiZGF5bmEyIiwKKwkiZGF5bmFfbGMiLAorfTsKKworc3RhdGljIGludCB3b3JkMTZbXSA9IHsKKwkxLCAvKiBhcHBsZSAqLworCTEsIC8qIGFzYW50ZSAqLworCTEsIC8qIGZhcmFsbG9uICovCisJMSwgLyogY2FibGV0cm9uICovCisJMCwgLyogZGF5bmEgKi8KKwkxLCAvKiBpbnRlcmxhbiAqLworCTAsIC8qIGtpbmV0aWNzICovCisJMSwgLyogZm9jdXMgKD8/KSAqLworCTEsIC8qIHNvbmljIHN5c3RlbXMgICovCisJMSwgLyogZGF5bmEyICovCisJMSwgLyogZGF5bmEtbGMgKi8KK307CisKKy8qIG9uIHdoaWNoIGNhcmRzIGRvIHdlIHVzZSBOdUJ1cyByZXNvdXJjZXM/ICovCitzdGF0aWMgaW50IHVzZXJlc291cmNlc1tdID0geworCTEsIC8qIGFwcGxlICovCisJMSwgLyogYXNhbnRlICovCisJMSwgLyogZmFyYWxsb24gKi8KKwkwLCAvKiBjYWJsZXRyb24gKi8KKwkwLCAvKiBkYXluYSAqLworCTAsIC8qIGludGVybGFuICovCisJMCwgLyoga2luZXRpY3MgKi8KKwkwLCAvKiBmb2N1cyAoPz8pICovCisJMSwgLyogc29uaWMgc3lzdGVtcyAqLworCTEsIC8qIGRheW5hMiAqLworCTEsIC8qIGRheW5hLWxjICovCit9OworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9CisJIm1hYzgzOTAuYzogdjAuNCAyMDAxLTA1LTE1IERhdmlkIEh1Z2dpbnMtRGFpbmVzIDxkaGRAZGViaWFuLm9yZz4gYW5kIG90aGVyc1xuIjsKKwkJCitleHRlcm4gZW51bSBtYWM4MzkwX3R5cGUgbWFjODM5MF9pZGVudChzdHJ1Y3QgbnVidXNfZGV2ICogZGV2KTsKK2V4dGVybiBpbnQgbWFjODM5MF9tZW1zaXplKHVuc2lnbmVkIGxvbmcgbWVtYmFzZSk7CitleHRlcm4gaW50IG1hYzgzOTBfbWVtdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldik7CitzdGF0aWMgaW50IG1hYzgzOTBfaW5pdGRldihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgc3RydWN0IG51YnVzX2RldiAqIG5kZXYsCisJCQkgICBlbnVtIG1hYzgzOTBfdHlwZSB0eXBlKTsKKworc3RhdGljIGludCBtYWM4MzkwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpOworc3RhdGljIGludCBtYWM4MzkwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KTsKK3N0YXRpYyB2b2lkIG1hYzgzOTBfbm9fcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIFNhbmUgKDMyLWJpdCBjaHVuayBtZW1vcnkgcmVhZC93cml0ZSkgLSBBcHBsZS9Bc2FudGUvRmFyYWxsb24gZG8gdGhpcyovCitzdGF0aWMgdm9pZCBzYW5lX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSk7CitzdGF0aWMgdm9pZCBzYW5lX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBpbnQgY291bnQsCisJCQkgICAgIHN0cnVjdCBza19idWZmICogc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgc2FuZV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBjb3VudCwKKwkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKTsKKworLyogZGF5bmFfbWVtY3B5IHRvIGFuZCBmcm9tIGNhcmQgKi8KK3N0YXRpYyB2b2lkIGRheW5hX21lbWNweV9mcm9tY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICp0bywKKwkJCQlpbnQgZnJvbSwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIGRheW5hX21lbWNweV90b2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHRvLAorCQkJICAgICAgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGNvdW50KTsKKworLyogRGF5bmEgLSBEYXluYS9LaW5ldGljcyB1c2UgdGhpcyAqLworc3RhdGljIHZvaWQgZGF5bmFfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSk7CitzdGF0aWMgdm9pZCBkYXluYV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgZGF5bmFfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKKworI2RlZmluZSBtZW1jcHlfZnJvbWlvKGEsYixjKQltZW1jcHkoKGEpLCh2b2lkICopKGIpLChjKSkKKyNkZWZpbmUgbWVtY3B5X3RvaW8oYSxiLGMpCW1lbWNweSgodm9pZCAqKShhKSwoYiksKGMpKQorCisvKiBTbG93IFNhbmUgKDE2LWJpdCBjaHVuayBtZW1vcnkgcmVhZC93cml0ZSkgQ2FibGV0cm9uIHVzZXMgdGhpcyAqLworc3RhdGljIHZvaWQgc2xvd19zYW5lX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgc2xvd19zYW5lX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCBzbG93X3NhbmVfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIHdvcmRfbWVtY3B5X3RvY2FyZCh2b2lkICp0cCwgY29uc3Qgdm9pZCAqZnAsIGludCBjb3VudCk7CitzdGF0aWMgdm9pZCB3b3JkX21lbWNweV9mcm9tY2FyZCh2b2lkICp0cCwgY29uc3Qgdm9pZCAqZnAsIGludCBjb3VudCk7CisKK2VudW0gbWFjODM5MF90eXBlIF9faW5pdCBtYWM4MzkwX2lkZW50KHN0cnVjdCBudWJ1c19kZXYgKiBkZXYpCit7CisJaWYgKGRldi0+ZHJfc3cgPT0gTlVCVVNfRFJTV19BU0FOVEUpCisJCXJldHVybiBNQUM4MzkwX0FTQU5URTsKKwlpZiAoZGV2LT5kcl9zdyA9PSBOVUJVU19EUlNXX0ZBUkFMTE9OKSAKKwkJcmV0dXJuIE1BQzgzOTBfRkFSQUxMT047CisJaWYgKGRldi0+ZHJfc3cgPT0gTlVCVVNfRFJTV19LSU5FVElDUykKKwkJcmV0dXJuIE1BQzgzOTBfS0lORVRJQ1M7CisJaWYgKGRldi0+ZHJfc3cgPT0gTlVCVVNfRFJTV19EQVlOQSkKKwkJcmV0dXJuIE1BQzgzOTBfREFZTkE7CisJaWYgKGRldi0+ZHJfc3cgPT0gTlVCVVNfRFJTV19EQVlOQTIpCisJCXJldHVybiBNQUM4MzkwX0RBWU5BMjsKKwlpZiAoZGV2LT5kcl9zdyA9PSBOVUJVU19EUlNXX0RBWU5BX0xDKQorCQlyZXR1cm4gTUFDODM5MF9EQVlOQTM7CisJaWYgKGRldi0+ZHJfaHcgPT0gTlVCVVNfRFJIV19DQUJMRVRST04pCisJCXJldHVybiBNQUM4MzkwX0NBQkxFVFJPTjsKKwlyZXR1cm4gTUFDODM5MF9OT05FOworfQorCitpbnQgX19pbml0IG1hYzgzOTBfbWVtc2l6ZSh1bnNpZ25lZCBsb25nIG1lbWJhc2UpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaSwgajsKKwkKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJLyogQ2hlY2sgdXAgdG8gMzJLIGluIDRLIGluY3JlbWVudHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICptID0gKHVuc2lnbmVkIHNob3J0ICopIChtZW1iYXNlICsgKGkgKiAweDEwMDApKTsKKworCQkvKiBVbndyaXRlYWJsZSAtIHdlIGhhdmUgYSBmdWxseSBkZWNvZGVkIGNhcmQgYW5kIHRoZQorCQkgICBSQU0gZW5kIGxvY2F0ZWQgKi8KKwkJaWYgKGh3cmVnX3ByZXNlbnQobSkgPT0gMCkKKwkJCWJyZWFrOworCQkKKwkJLyogd3JpdGUgYSBkaXN0aW5jdGl2ZSBieXRlICovCisJCSptID0gMHhBNUEwIHwgaTsKKwkJLyogY2hlY2sgdGhhdCB3ZSByZWFkIGJhY2sgd2hhdCB3ZSB3cm90ZSAqLworCQlpZiAoKm0gIT0gKDB4QTVBMCB8IGkpKQorCQkJYnJlYWs7CisKKwkJLyogY2hlY2sgZm9yIHBhcnRpYWwgZGVjb2RlIGFuZCB3cmFwICovCisJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpwID0gKHVuc2lnbmVkIHNob3J0ICopIChtZW1iYXNlICsgKGogKiAweDEwMDApKTsKKwkJCWlmICgqcCAhPSAoMHhBNUEwIHwgaikpCisJCQkJYnJlYWs7CisgCQl9CisgCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJLyogaW4gYW55IGNhc2UsIHdlIHN0b3BwZWQgb25jZSB3ZSB0cmllZCBvbmUgYmxvY2sgdG9vIG1hbnksCisgICAgICAgICAgIG9yIG9uY2Ugd2UgcmVhY2hlZCAzMksgKi8KKyAJcmV0dXJuIGkgKiAweDEwMDA7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IG1hYzgzOTBfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqaTsKKwlpbnQgdmVyc2lvbl9kaXNwID0gMDsKKwlzdHJ1Y3QgbnVidXNfZGV2ICogbmRldiA9IE5VTEw7CisJaW50IGVyciA9IC1FTk9ERVY7CisJCisJc3RydWN0IG51YnVzX2RpciBkaXI7CisJc3RydWN0IG51YnVzX2RpcmVudCBlbnQ7CisJaW50IG9mZnNldDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IHNsb3RzOworCisJZW51bSBtYWM4MzkwX3R5cGUgY2FyZHR5cGU7CisKKwkvKiBwcm9iYWJseSBzaG91bGQgY2hlY2sgZm9yIE51YnVzIGluc3RlYWQgKi8KKworCWlmICghTUFDSF9JU19NQUMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKHVuaXQgPj0gMCkKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCisgCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCXdoaWxlICgobmRldiA9IG51YnVzX2ZpbmRfdHlwZShOVUJVU19DQVRfTkVUV09SSywgTlVCVVNfVFlQRV9FVEhFUk5FVCwgbmRldikpKSB7CisJCS8qIEhhdmUgd2Ugc2VlbiBpdCBhbHJlYWR5PyAqLworCQlpZiAoc2xvdHMgJiAoMTw8bmRldi0+Ym9hcmQtPnNsb3QpKQorCQkJY29udGludWU7CisJCXNsb3RzIHw9IDE8PG5kZXYtPmJvYXJkLT5zbG90OworCisJCWlmICgoY2FyZHR5cGUgPSBtYWM4MzkwX2lkZW50KG5kZXYpKSA9PSBNQUM4MzkwX05PTkUpCisJCQljb250aW51ZTsKKworCQlpZiAodmVyc2lvbl9kaXNwID09IDApIHsKKwkJCXZlcnNpb25fZGlzcCA9IDE7CisJCQlwcmludGsodmVyc2lvbik7CisJCX0KKworCQlkZXYtPmlycSA9IFNMT1QySVJRKG5kZXYtPmJvYXJkLT5zbG90KTsKKwkJLyogVGhpcyBpcyBnZXR0aW5nIHRvIGJlIGEgaGFiaXQgKi8KKwkJZGV2LT5iYXNlX2FkZHIgPSBuZGV2LT5ib2FyZC0+c2xvdF9hZGRyIHwgKChuZGV2LT5ib2FyZC0+c2xvdCYweGYpIDw8IDIwKTsKKworCQkvKiBHZXQgc29tZSBOdWJ1cyBpbmZvIC0gd2Ugd2lsbCB0cnVzdCB0aGUgY2FyZCdzIGlkZWEKKwkJICAgb2Ygd2hlcmUgaXRzIG1lbW9yeSBhbmQgcmVnaXN0ZXJzIGFyZS4gKi8KKworCQlpZiAobnVidXNfZ2V0X2Z1bmNfZGlyKG5kZXYsICZkaXIpID09IC0xKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IE51YnVzIGZ1bmN0aW9uYWwiCisJCQkJCSIgZGlyZWN0b3J5IGZvciBzbG90ICVYIVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIG5kZXYtPmJvYXJkLT5zbG90KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQorCQkvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCisJCWlmICgobnVidXNfZmluZF9yc3JjKCZkaXIsIE5VQlVTX1JFU0lEX01BQ19BRERSRVNTLCAmZW50KSkgPT0gLTEpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VsZG4ndCBnZXQgTUFDIGFkZHJlc3MhXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQludWJ1c19nZXRfcnNyY19tZW0oZGV2LT5kZXZfYWRkciwgJmVudCwgNik7CisJCQkvKiBTb21lIFNvbmljIFN5cyBjYXJkcyBtYXNxdWVyYWRlIGFzIEZhcmFsbG9uICovCisJCQlpZiAoY2FyZHR5cGUgPT0gTUFDODM5MF9GQVJBTExPTiAmJiAKKwkJCQkJZGV2LT5kZXZfYWRkclswXSA9PSAweDAgJiYKKwkJCQkJZGV2LT5kZXZfYWRkclsxXSA9PSAweDQwICYmCisJCQkJCWRldi0+ZGV2X2FkZHJbMl0gPT0gMHgxMCkgeworCQkJCS8qIFRoaXMgaXMgcmVhbGx5IFNvbmljIFN5cyBjYXJkICovCisJCQkJY2FyZHR5cGUgPSBNQUM4MzkwX1NPTklDU1lTOworCQkJfQorCQl9CisJCQorCQlpZiAodXNlcmVzb3VyY2VzW2NhcmR0eXBlXSA9PSAxKSB7CisJCQludWJ1c19yZXdpbmRkaXIoJmRpcik7CisJCQlpZiAobnVidXNfZmluZF9yc3JjKCZkaXIsIE5VQlVTX1JFU0lEX01JTk9SX0JBU0VPUywgJmVudCkgPT0gLTEpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBNZW1vcnkgb2Zmc2V0IHJlc291cmNlIgorCQkJCQkJIiBmb3Igc2xvdCAlWCBub3QgZm91bmQhXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIG5kZXYtPmJvYXJkLT5zbG90KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW51YnVzX2dldF9yc3JjX21lbSgmb2Zmc2V0LCAmZW50LCA0KTsKKwkJCWRldi0+bWVtX3N0YXJ0ID0gZGV2LT5iYXNlX2FkZHIgKyBvZmZzZXQ7CisJCQkvKiB5ZXMsIHRoaXMgaXMgaG93IHRoZSBBcHBsZSBkcml2ZXIgZG9lcyBpdCAqLworCQkJZGV2LT5iYXNlX2FkZHIgPSBkZXYtPm1lbV9zdGFydCArIDB4MTAwMDA7CisJCQludWJ1c19yZXdpbmRkaXIoJmRpcik7CisJCQlpZiAobnVidXNfZmluZF9yc3JjKCZkaXIsIE5VQlVTX1JFU0lEX01JTk9SX0xFTkdUSCwgJmVudCkgPT0gLTEpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVtb3J5IGxlbmd0aCByZXNvdXJjZSIKKwkJCQkJCSAiIGZvciBzbG90ICVYIG5vdCBmb3VuZCIKKwkJCQkJCSAiLCBwcm9iaW5nXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIG5kZXYtPmJvYXJkLT5zbG90KTsKKwkJCQlvZmZzZXQgPSBtYWM4MzkwX21lbXNpemUoZGV2LT5tZW1fc3RhcnQpOworCQkJCX0gZWxzZSB7CisJCQkJCW51YnVzX2dldF9yc3JjX21lbSgmb2Zmc2V0LCAmZW50LCA0KTsKKwkJCQl9CisJCQlkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIG9mZnNldDsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoY2FyZHR5cGUpIHsKKwkJCQljYXNlIE1BQzgzOTBfS0lORVRJQ1M6CisJCQkJY2FzZSBNQUM4MzkwX0RBWU5BOiAvKiBpdCdzIHRoZSBzYW1lICovCisJCQkJCWRldi0+YmFzZV9hZGRyID0gCisJCQkJCQkoaW50KShuZGV2LT5ib2FyZC0+c2xvdF9hZGRyICsKKwkJCQkJCURBWU5BXzgzOTBfQkFTRSk7CisJCQkJCWRldi0+bWVtX3N0YXJ0ID0gCisJCQkJCQkoaW50KShuZGV2LT5ib2FyZC0+c2xvdF9hZGRyICsKKwkJCQkJCURBWU5BXzgzOTBfTUVNKTsKKwkJCQkJZGV2LT5tZW1fZW5kID0KKwkJCQkJCWRldi0+bWVtX3N0YXJ0ICsKKwkJCQkJCW1hYzgzOTBfbWVtc2l6ZShkZXYtPm1lbV9zdGFydCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTUFDODM5MF9DQUJMRVRST046CisJCQkJCWRldi0+YmFzZV9hZGRyID0KKwkJCQkJCShpbnQpKG5kZXYtPmJvYXJkLT5zbG90X2FkZHIgKworCQkJCQkJQ0FCTEVUUk9OXzgzOTBfQkFTRSk7CisJCQkJCWRldi0+bWVtX3N0YXJ0ID0KKwkJCQkJCShpbnQpKG5kZXYtPmJvYXJkLT5zbG90X2FkZHIgKworCQkJCQkJQ0FCTEVUUk9OXzgzOTBfTUVNKTsKKwkJCQkJLyogVGhlIGJhc2UgYWRkcmVzcyBpcyB1bnJlYWRhYmxlIGlmIDB4MDAKKwkJCQkJICogaGFzIGJlZW4gd3JpdHRlbiB0byB0aGUgY29tbWFuZCByZWdpc3RlcgorCQkJCQkgKiBSZXNldCB0aGUgY2hpcCBieSB3cml0aW5nIEU4MzkwX05PRE1BICsKKwkJCQkJICogICBFODM5MF9QQUdFMCArIEU4MzkwX1NUT1AganVzdCB0byBiZQorCQkJCQkgKiAgIHN1cmUKKwkJCQkJICovCisJCQkJCWkgPSAodm9pZCAqKWRldi0+YmFzZV9hZGRyOworCQkJCQkqaSA9IDB4MjE7CisJCQkJCWRldi0+bWVtX2VuZCA9IAorCQkJCQkJZGV2LT5tZW1fc3RhcnQgKworCQkJCQkJbWFjODM5MF9tZW1zaXplKGRldi0+bWVtX3N0YXJ0KTsKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWRlZmF1bHQ6CisJCQkJCXByaW50ayhLRVJOX0VSUiAiQ2FyZCB0eXBlICVzIGlzIgorCQkJCQkJCSIgdW5zdXBwb3J0ZWQsIHNvcnJ5XG4iLAorCQkJCQkgICAgICAgY2FyZG5hbWVbY2FyZHR5cGVdKTsKKwkJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBEbyB0aGUgbmFzdHkgODM5MCBzdHVmZiAqLworCQlpZiAoIW1hYzgzOTBfaW5pdGRldihkZXYsIG5kZXYsIGNhcmR0eXBlKSkKKwkJCWJyZWFrOworCX0KKworCWlmICghbmRldikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIGRldjsKKworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworI2lmZGVmIE1PRFVMRQorTU9EVUxFX0FVVEhPUigiRGF2aWQgSHVnZ2lucy1EYWluZXMgPGRoZEBkZWJpYW4ub3JnPiBhbmQgb3RoZXJzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1hY2ludG9zaCBOUzgzOTAtYmFzZWQgTnVidXMgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIG92ZXJraWxsLCBvZiBjb3Vyc2UgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X21hYzgzOTBbMTVdOworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG1hYzgzOTBfcHJvYmUoLTEpOworCQlpZiAoSVNfRVJSKGRldikpCisJCQlicmVhazsKKwkJZGV2X21hYzg5MFtpXSA9IGRldjsKKwl9CisJaWYgKCFpKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAibWFjODM5MC5jOiBObyB1c2VhYmxlIGNhcmRzIGZvdW5kLCBkcml2ZXIgTk9UIGluc3RhbGxlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X21hYzg5MFtpXTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworc3RhdGljIGludCBfX2luaXQgbWFjODM5MF9pbml0ZGV2KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBzdHJ1Y3QgbnVidXNfZGV2ICogbmRldiwKKwkJCSAgICBlbnVtIG1hYzgzOTBfdHlwZSB0eXBlKQoreworCXN0YXRpYyB1MzIgZndyZDRfb2Zmc2V0c1sxNl09eworCQkwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwKKwkJMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsCisJCTMyLCAgICAgMzYsICAgICA0MCwgICAgIDQ0LAorCQk0OCwgICAgIDUyLCAgICAgNTYsICAgICA2MAorCX07CisJc3RhdGljIHUzMiBiYWNrNF9vZmZzZXRzWzE2XT17CisJCTYwLCAgICAgNTYsICAgICA1MiwgICAgIDQ4LAorCQk0NCwgICAgIDQwLCAgICAgMzYsICAgICAzMiwKKwkJMjgsICAgICAyNCwgICAgIDIwLCAgICAgMTYsCisJCTEyLCAgICAgOCwgICAgICA0LCAgICAgIDAKKwl9OworCXN0YXRpYyB1MzIgZndyZDJfb2Zmc2V0c1sxNl09eworCQkwLCAgICAgIDIsICAgICAgNCwgICAgICA2LAorCQk4LCAgICAgMTAsICAgICAxMiwgICAgIDE0LAorCQkxNiwgICAgMTgsICAgICAyMCwgICAgIDIyLAorCQkyNCwgICAgMjYsICAgICAyOCwgICAgIDMwCisJfTsKKworCWludCBhY2Nlc3NfYml0bW9kZTsKKwkKKwkvKiBOb3cgZmlsbCBpbiBvdXIgc3R1ZmYgKi8KKwlkZXYtPm9wZW4gPSAmbWFjODM5MF9vcGVuOworCWRldi0+c3RvcCA9ICZtYWM4MzkwX2Nsb3NlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworI2VuZGlmCisKKwkvKiBHQVIsIGVpX3N0YXR1cyBpcyBhY3R1YWxseSBhIG1hY3JvIGV2ZW4gdGhvdWdoIGl0IGxvb2tzIGdsb2JhbCAqLworCWVpX3N0YXR1cy5uYW1lID0gY2FyZG5hbWVbdHlwZV07CisJZWlfc3RhdHVzLndvcmQxNiA9IHdvcmQxNlt0eXBlXTsKKworCS8qIENhYmxldHJvbidzIFRYL1JYIGJ1ZmZlcnMgYXJlIGJhY2t3YXJkcyAqLworCWlmICh0eXBlID09IE1BQzgzOTBfQ0FCTEVUUk9OKSB7CisgICAgICAgICAgICAgICBlaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA9IENBQkxFVFJPTl9UWF9TVEFSVF9QRzsKKyAgICAgICAgICAgICAgIGVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gQ0FCTEVUUk9OX1JYX1NUQVJUX1BHOworICAgICAgICAgICAgICAgZWlfc3RhdHVzLnN0b3BfcGFnZSA9IENBQkxFVFJPTl9SWF9TVE9QX1BHOworICAgICAgICAgICAgICAgZWlfc3RhdHVzLnJtZW1fc3RhcnQgPSBkZXYtPm1lbV9zdGFydDsKKyAgICAgICAgICAgICAgIGVpX3N0YXR1cy5ybWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgQ0FCTEVUUk9OX1JYX1NUT1BfUEcqMjU2OworCX0gZWxzZSB7CisgICAgICAgICAgICAgICBlaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA9IFdEX1NUQVJUX1BHOworICAgICAgICAgICAgICAgZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBXRF9TVEFSVF9QRyArIFRYX1BBR0VTOworICAgICAgICAgICAgICAgZWlfc3RhdHVzLnN0b3BfcGFnZSA9IChkZXYtPm1lbV9lbmQgLSBkZXYtPm1lbV9zdGFydCkvMjU2OworICAgICAgICAgICAgICAgZWlfc3RhdHVzLnJtZW1fc3RhcnQgPSBkZXYtPm1lbV9zdGFydCArIFRYX1BBR0VTKjI1NjsKKyAgICAgICAgICAgICAgIGVpX3N0YXR1cy5ybWVtX2VuZCA9IGRldi0+bWVtX2VuZDsKKwl9CisJCisJLyogRmlsbCBpbiBtb2RlbC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBhbmQgZnVuY3Rpb25zICovCisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIE1BQzgzOTBfU09OSUNTWVM6CisJCS8qIDE2IGJpdCBjYXJkLCByZWdpc3RlciBtYXAgaXMgcmV2ZXJzZWQgKi8KKwkJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmbWFjODM5MF9ub19yZXNldDsKKwkJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJnNsb3dfc2FuZV9ibG9ja19pbnB1dDsKKwkJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZzbG93X3NhbmVfYmxvY2tfb3V0cHV0OworCQllaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJnNsb3dfc2FuZV9nZXRfODM5MF9oZHI7CisJCWVpX3N0YXR1cy5yZWdfb2Zmc2V0ID0gYmFjazRfb2Zmc2V0czsKKwkJYWNjZXNzX2JpdG1vZGUgPSAwOworCQlicmVhazsKKwljYXNlIE1BQzgzOTBfRkFSQUxMT046CisJY2FzZSBNQUM4MzkwX0FQUExFOgorCWNhc2UgTUFDODM5MF9BU0FOVEU6CisJY2FzZSBNQUM4MzkwX0RBWU5BMjoKKwljYXNlIE1BQzgzOTBfREFZTkEzOgorCQkvKiAzMiBiaXQgY2FyZCwgcmVnaXN0ZXIgbWFwIGlzIHJldmVyc2VkICovCisJCS8qIHNhbmUgKi8KKwkJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmbWFjODM5MF9ub19yZXNldDsKKwkJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJnNhbmVfYmxvY2tfaW5wdXQ7CisJCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmc2FuZV9ibG9ja19vdXRwdXQ7CisJCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmc2FuZV9nZXRfODM5MF9oZHI7CisJCWVpX3N0YXR1cy5yZWdfb2Zmc2V0ID0gYmFjazRfb2Zmc2V0czsKKwkJYWNjZXNzX2JpdG1vZGUgPSAxOworCQlicmVhazsKKwljYXNlIE1BQzgzOTBfQ0FCTEVUUk9OOgorCQkvKiAxNiBiaXQgY2FyZCwgcmVnaXN0ZXIgbWFwIGlzIHNob3J0IGZvcndhcmQgKi8KKwkJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmbWFjODM5MF9ub19yZXNldDsKKwkJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJnNsb3dfc2FuZV9ibG9ja19pbnB1dDsKKwkJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZzbG93X3NhbmVfYmxvY2tfb3V0cHV0OworCQllaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJnNsb3dfc2FuZV9nZXRfODM5MF9oZHI7CisJCWVpX3N0YXR1cy5yZWdfb2Zmc2V0ID0gZndyZDJfb2Zmc2V0czsKKwkJYWNjZXNzX2JpdG1vZGUgPSAwOworCQlicmVhazsKKwljYXNlIE1BQzgzOTBfREFZTkE6CisJY2FzZSBNQUM4MzkwX0tJTkVUSUNTOgorCQkvKiAxNiBiaXQgbWVtb3J5ICovCisJCS8qIGRheW5hIGFuZCBzaW1pbGFyICovCisJCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJm1hYzgzOTBfbm9fcmVzZXQ7CisJCWVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZkYXluYV9ibG9ja19pbnB1dDsKKwkJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZkYXluYV9ibG9ja19vdXRwdXQ7CisJCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmZGF5bmFfZ2V0XzgzOTBfaGRyOworCQllaV9zdGF0dXMucmVnX29mZnNldCA9IGZ3cmQ0X29mZnNldHM7CisJCWFjY2Vzc19iaXRtb2RlID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJDYXJkIHR5cGUgJXMgaXMgdW5zdXBwb3J0ZWQsIHNvcnJ5XG4iLCBjYXJkbmFtZVt0eXBlXSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkJCisJTlM4MzkwX2luaXQoZGV2LCAwKTsKKworCS8qIEdvb2QsIGRvbmUsIG5vdyBzcGl0IG91dCBzb21lIG1lc3NhZ2VzICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGluIHNsb3QgJVggKHR5cGUgJXMpXG4iLAorCQkgICBkZXYtPm5hbWUsIG5kZXYtPmJvYXJkLT5uYW1lLCBuZGV2LT5ib2FyZC0+c2xvdCwgY2FyZG5hbWVbdHlwZV0pOworCXByaW50ayhLRVJOX0lORk8gIk1BQyAiKTsKKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQlwcmludGsoIiUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJCQlpZiAoaSA8IDUpCisJCQkJcHJpbnRrKCI6Iik7CisJCX0KKwl9CisJcHJpbnRrKCIgSVJRICVkLCBzaGFyZWQgbWVtb3J5IGF0ICUjbHgtJSNseCwgICVkLWJpdCBhY2Nlc3MuXG4iLAorCQkgICBkZXYtPmlycSwgZGV2LT5tZW1fc3RhcnQsIGRldi0+bWVtX2VuZC0xLCAKKwkJICAgYWNjZXNzX2JpdG1vZGU/MzI6MTYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hYzgzOTBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVpX29wZW4oZGV2KTsKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgIjgzOTAgRXRoZXJuZXQiLCBkZXYpKSB7CisJCXByaW50ayAoIiVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZC5cbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hYzgzOTBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwllaV9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYWM4MzkwX25vX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZWlfc3RhdHVzLnR4aW5nID0gMDsKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsoInJlc2V0IG5vdCBzdXBwb3J0ZWRcbiIpOworCXJldHVybjsKK30KKworLyogZGF5bmFfbWVtY3B5X2Zyb21pby9kYXluYV9tZW1jcHlfdG9pbyAqLworLyogZGlyZWN0bHkgZnJvbSBkYXluYXBvcnQuYyBieSBBbGFuIENveCAqLworc3RhdGljIHZvaWQgZGF5bmFfbWVtY3B5X2Zyb21jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnRvLCBpbnQgZnJvbSwgaW50IGNvdW50KQoreworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpwdHI7CisJdW5zaWduZWQgc2hvcnQgKnRhcmdldD10bzsKKwlmcm9tPDw9MTsJLyogd29yZCwgc2tpcCBvdmVyaGVhZCAqLworCXB0cj0odW5zaWduZWQgc2hvcnQgKikoZGV2LT5tZW1fc3RhcnQrZnJvbSk7CisJLyogTGVhZGluZyBieXRlPyAqLworCWlmIChmcm9tJjIpIHsKKwkJKigoY2hhciAqKXRhcmdldCkrKyA9ICooKChjaGFyICopcHRyKyspLTEpOworCQljb3VudC0tOworCX0KKwl3aGlsZShjb3VudD49MikKKwl7CisJCSp0YXJnZXQrKz0qcHRyKys7CS8qIENvcHkgYW5kICovCisJCXB0cisrOwkJCS8qIHNraXAgY3J1ZnQgKi8KKwkJY291bnQtPTI7CisJfQorCS8qIFRyYWlsaW5nIGJ5dGU/ICovCisJaWYoY291bnQpCisJeworCQkvKiBCaWcgZW5kaWFuICovCisJCXVuc2lnbmVkIHNob3J0IHY9KnB0cjsKKwkJKigoY2hhciAqKXRhcmdldCk9dj4+ODsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRheW5hX21lbWNweV90b2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgY291bnQpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnB0cjsKKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqc3JjPWZyb207CisJdG88PD0xOwkvKiB3b3JkLCBza2lwIG92ZXJoZWFkICovCisJcHRyPSh1bnNpZ25lZCBzaG9ydCAqKShkZXYtPm1lbV9zdGFydCt0byk7CisJLyogTGVhZGluZyBieXRlPyAqLworCWlmICh0byYyKSB7IC8qIGF2b2lkIGEgYnl0ZSB3cml0ZSAoc3RvbXBzIG9uIG90aGVyIGRhdGEpICovCisJCXB0clstMV0gPSAocHRyWy0xXSYweEZGMDApfCooKHVuc2lnbmVkIGNoYXIgKilzcmMpKys7CisJCXB0cisrOworCQljb3VudC0tOworCX0KKwl3aGlsZShjb3VudD49MikKKwl7CisJCSpwdHIrKz0qc3JjKys7CQkvKiBDb3B5IGFuZCAqLworCQlwdHIrKzsJCQkvKiBza2lwIGNydWZ0ICovCisJCWNvdW50LT0yOworCX0KKwkvKiBUcmFpbGluZyBieXRlPyAqLworCWlmKGNvdW50KQorCXsKKwkJLyogQmlnIGVuZGlhbiAqLworCQl1bnNpZ25lZCBzaG9ydCB2PSpzcmM7CisJCS8qIGNhcmQgZG9lc24ndCBsaWtlIGJ5dGUgd3JpdGVzICovCisJCSpwdHI9KCpwdHImMHgwMEZGKXwodiYweEZGMDApOworCX0KK30KKworLyogc2FuZSBibG9jayBpbnB1dC9vdXRwdXQgKi8KK3N0YXRpYyB2b2lkIHNhbmVfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCXVuc2lnbmVkIGxvbmcgaGRyX3N0YXJ0ID0gKHJpbmdfcGFnZSAtIFdEX1NUQVJUX1BHKTw8ODsKKwltZW1jcHlfZnJvbWlvKCh2b2lkICopaGRyLCAoY2hhciAqKWRldi0+bWVtX3N0YXJ0ICsgaGRyX3N0YXJ0LCA0KTsKKwkvKiBGaXggZW5kaWFubmVzcyAqLworCWhkci0+Y291bnQgPSBzd2FiMTYoaGRyLT5jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIHNhbmVfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisJdW5zaWduZWQgbG9uZyB4ZmVyX2Jhc2UgPSByaW5nX29mZnNldCAtIChXRF9TVEFSVF9QRzw8OCk7CisJdW5zaWduZWQgbG9uZyB4ZmVyX3N0YXJ0ID0geGZlcl9iYXNlICsgZGV2LT5tZW1fc3RhcnQ7CisKKwlpZiAoeGZlcl9zdGFydCArIGNvdW50ID4gZWlfc3RhdHVzLnJtZW1fZW5kKSB7CisJCS8qIFdlIG11c3Qgd3JhcCB0aGUgaW5wdXQgbW92ZS4gKi8KKwkJaW50IHNlbWlfY291bnQgPSBlaV9zdGF0dXMucm1lbV9lbmQgLSB4ZmVyX3N0YXJ0OworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgKGNoYXIgKilkZXYtPm1lbV9zdGFydCArIHhmZXJfYmFzZSwgc2VtaV9jb3VudCk7CisJCWNvdW50IC09IHNlbWlfY291bnQ7CisJCW1lbWNweV90b2lvKHNrYi0+ZGF0YSArIHNlbWlfY291bnQsIChjaGFyICopZWlfc3RhdHVzLnJtZW1fc3RhcnQsIGNvdW50KTsKKwl9IGVsc2UgeworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgKGNoYXIgKilkZXYtPm1lbV9zdGFydCArIHhmZXJfYmFzZSwgY291bnQpOworCX0KK30KKworc3RhdGljIHZvaWQgc2FuZV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSkKK3sKKwlsb25nIHNobWVtID0gKHN0YXJ0X3BhZ2UgLSBXRF9TVEFSVF9QRyk8PDg7CisJCisJbWVtY3B5X3RvaW8oKGNoYXIgKilkZXYtPm1lbV9zdGFydCArIHNobWVtLCBidWYsIGNvdW50KTsKK30KKworLyogZGF5bmEgYmxvY2sgaW5wdXQvb3V0cHV0ICovCitzdGF0aWMgdm9pZCBkYXluYV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIGhkcl9zdGFydCA9IChyaW5nX3BhZ2UgLSBXRF9TVEFSVF9QRyk8PDg7CisKKwlkYXluYV9tZW1jcHlfZnJvbWNhcmQoZGV2LCAodm9pZCAqKWhkciwgaGRyX3N0YXJ0LCA0KTsKKwkvKiBGaXggZW5kaWFubmVzcyAqLworCWhkci0+Y291bnQ9KGhkci0+Y291bnQmMHhGRik8PDh8KGhkci0+Y291bnQ+PjgpOworfQorCitzdGF0aWMgdm9pZCBkYXluYV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIHhmZXJfYmFzZSA9IHJpbmdfb2Zmc2V0IC0gKFdEX1NUQVJUX1BHPDw4KTsKKwl1bnNpZ25lZCBsb25nIHhmZXJfc3RhcnQgPSB4ZmVyX2Jhc2UrZGV2LT5tZW1fc3RhcnQ7CisKKwkvKiBOb3RlIHRoZSBvZmZzZXQgbWF0aCBpcyBkb25lIGluIGNhcmQgbWVtb3J5IHNwYWNlIHdoaWNoIGlzIHdvcmQKKwkgICBwZXIgbG9uZyBvbnRvIG91ciBzcGFjZS4gKi8KKworCWlmICh4ZmVyX3N0YXJ0ICsgY291bnQgPiBlaV9zdGF0dXMucm1lbV9lbmQpCisJeworCQkvKiBXZSBtdXN0IHdyYXAgdGhlIGlucHV0IG1vdmUuICovCisJCWludCBzZW1pX2NvdW50ID0gZWlfc3RhdHVzLnJtZW1fZW5kIC0geGZlcl9zdGFydDsKKwkJZGF5bmFfbWVtY3B5X2Zyb21jYXJkKGRldiwgc2tiLT5kYXRhLCB4ZmVyX2Jhc2UsIHNlbWlfY291bnQpOworCQljb3VudCAtPSBzZW1pX2NvdW50OworCQlkYXluYV9tZW1jcHlfZnJvbWNhcmQoZGV2LCBza2ItPmRhdGEgKyBzZW1pX2NvdW50LAorCQkJCSAgICAgIGVpX3N0YXR1cy5ybWVtX3N0YXJ0IC0gZGV2LT5tZW1fc3RhcnQsCisJCQkJICAgICAgY291bnQpOworCX0KKwllbHNlCisJeworCQlkYXluYV9tZW1jcHlfZnJvbWNhcmQoZGV2LCBza2ItPmRhdGEsIHhmZXJfYmFzZSwgY291bnQpOworCX0KK30KKworc3RhdGljIHZvaWQgZGF5bmFfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCWludCBzdGFydF9wYWdlKQoreworCWxvbmcgc2htZW0gPSAoc3RhcnRfcGFnZSAtIFdEX1NUQVJUX1BHKTw8ODsKKwkKKwlkYXluYV9tZW1jcHlfdG9jYXJkKGRldiwgc2htZW0sIGJ1ZiwgY291bnQpOworfQorCisvKiBDYWJsZXRyb24gYmxvY2sgSS9PICovCitzdGF0aWMgdm9pZCBzbG93X3NhbmVfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIAorCWludCByaW5nX3BhZ2UpCit7CisJdW5zaWduZWQgbG9uZyBoZHJfc3RhcnQgPSAocmluZ19wYWdlIC0gV0RfU1RBUlRfUEcpPDw4OworCXdvcmRfbWVtY3B5X2Zyb21jYXJkKCh2b2lkICopaGRyLCAoY2hhciAqKWRldi0+bWVtX3N0YXJ0K2hkcl9zdGFydCwgNCk7CisJLyogUmVnaXN0ZXIgZW5kaWFuaXNtIC0gZml4IGhlcmUgcmF0aGVyIHRoYW4gODM5MC5jICovCisJaGRyLT5jb3VudCA9IChoZHItPmNvdW50JjB4RkYpPDw4fChoZHItPmNvdW50Pj44KTsKK30KKworc3RhdGljIHZvaWQgc2xvd19zYW5lX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwlpbnQgcmluZ19vZmZzZXQpCit7CisJdW5zaWduZWQgbG9uZyB4ZmVyX2Jhc2UgPSByaW5nX29mZnNldCAtIChXRF9TVEFSVF9QRzw8OCk7CisJdW5zaWduZWQgbG9uZyB4ZmVyX3N0YXJ0ID0geGZlcl9iYXNlK2Rldi0+bWVtX3N0YXJ0OworCisJaWYgKHhmZXJfc3RhcnQgKyBjb3VudCA+IGVpX3N0YXR1cy5ybWVtX2VuZCkKKwl7CisJCS8qIFdlIG11c3Qgd3JhcCB0aGUgaW5wdXQgbW92ZS4gKi8KKwkJaW50IHNlbWlfY291bnQgPSBlaV9zdGF0dXMucm1lbV9lbmQgLSB4ZmVyX3N0YXJ0OworCQl3b3JkX21lbWNweV9mcm9tY2FyZChza2ItPmRhdGEsIChjaGFyICopZGV2LT5tZW1fc3RhcnQgKworCQkJeGZlcl9iYXNlLCBzZW1pX2NvdW50KTsKKwkJY291bnQgLT0gc2VtaV9jb3VudDsKKwkJd29yZF9tZW1jcHlfZnJvbWNhcmQoc2tiLT5kYXRhICsgc2VtaV9jb3VudCwKKwkJCQkgICAgIChjaGFyICopZWlfc3RhdHVzLnJtZW1fc3RhcnQsIGNvdW50KTsKKwl9CisJZWxzZQorCXsKKwkJd29yZF9tZW1jcHlfZnJvbWNhcmQoc2tiLT5kYXRhLCAoY2hhciAqKWRldi0+bWVtX3N0YXJ0ICsKKwkJCXhmZXJfYmFzZSwgY291bnQpOworCX0KK30KKworc3RhdGljIHZvaWQgc2xvd19zYW5lX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwlpbnQgc3RhcnRfcGFnZSkKK3sKKwlsb25nIHNobWVtID0gKHN0YXJ0X3BhZ2UgLSBXRF9TVEFSVF9QRyk8PDg7CisKKwl3b3JkX21lbWNweV90b2NhcmQoKGNoYXIgKilkZXYtPm1lbV9zdGFydCArIHNobWVtLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIHZvaWQgd29yZF9tZW1jcHlfdG9jYXJkKHZvaWQgKnRwLCBjb25zdCB2b2lkICpmcCwgaW50IGNvdW50KQoreworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICp0byA9IHRwOworCWNvbnN0IHVuc2lnbmVkIHNob3J0ICpmcm9tID0gZnA7CisKKwljb3VudCsrOworCWNvdW50Lz0yOworCisJd2hpbGUoY291bnQtLSkKKwkJKnRvKys9KmZyb20rKzsKK30KKworc3RhdGljIHZvaWQgd29yZF9tZW1jcHlfZnJvbWNhcmQodm9pZCAqdHAsIGNvbnN0IHZvaWQgKmZwLCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgc2hvcnQgKnRvID0gdHA7CisJY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKmZyb20gPSBmcDsKKworCWNvdW50Kys7CisJY291bnQvPTI7CisKKwl3aGlsZShjb3VudC0tKQorCQkqdG8rKz0qZnJvbSsrOworfQorCisJCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWM4OXgwLmMgYi9kcml2ZXJzL25ldC9tYWM4OXgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1YjBkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L21hYzg5eDAuYwpAQCAtMCwwICsxLDY2NiBAQAorLyogbWFjODl4MC5jOiBBIENyeXN0YWwgU2VtaWNvbmR1Y3RvciBDUzg5WzAyXTAgZHJpdmVyIGZvciBsaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTk2IGJ5IFJ1c3NlbGwgTmVsc29uLCB3aXRoIHJlZmVyZW5jZSB0byBza2VsZXRvbi5jCisJd3JpdHRlbiAxOTkzLTE5OTQgYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhdCBuZWxzb25AY3J5bndyLmNvbSwgQ3J5bndyCisJU29mdHdhcmUsIDExIEdyYW50IFN0LiwgUG90c2RhbSwgTlkgMTM2NzYKKworICBDaGFuZ2Vsb2c6CisKKyAgTWlrZSBDcnVzZSAgICAgICAgOiBtY3J1c2VAY3RpLWx0ZC5jb20KKyAgICAgICAgICAgICAgICAgICAgOiBDaGFuZ2VzIGZvciBMaW51eCAyLjAgY29tcGF0aWJpbGl0eS4gCisgICAgICAgICAgICAgICAgICAgIDogQWRkZWQgZGV2X2lkIHBhcmFtZXRlciBpbiBuZXRfaW50ZXJydXB0KCksCisgICAgICAgICAgICAgICAgICAgIDogcmVxdWVzdF9pcnEoKSBhbmQgZnJlZV9pcnEoKS4gSnVzdCBOVUxMIGZvciBub3cuCisKKyAgTWlrZSBDcnVzZSAgICAgICAgOiBBZGRlZCBNT0RfSU5DX1VTRV9DT1VOVCBhbmQgTU9EX0RFQ19VU0VfQ09VTlQgbWFjcm9zCisgICAgICAgICAgICAgICAgICAgIDogaW4gbmV0X29wZW4oKSBhbmQgbmV0X2Nsb3NlKCkgc28ga2VybmVsZCB3b3VsZCBrbm93CisgICAgICAgICAgICAgICAgICAgIDogdGhhdCB0aGUgbW9kdWxlIGlzIGluIHVzZSBhbmQgd291bGRuJ3QgZWplY3QgdGhlIAorICAgICAgICAgICAgICAgICAgICA6IGRyaXZlciBwcmVtYXR1cmVseS4KKworICBNaWtlIENydXNlICAgICAgICA6IFJld3JvdGUgaW5pdF9tb2R1bGUoKSBhbmQgY2xlYW51cF9tb2R1bGUgdXNpbmcgODM5MC5jCisgICAgICAgICAgICAgICAgICAgIDogYXMgYW4gZXhhbXBsZS4gRGlzYWJsZWQgYXV0b3Byb2JpbmcgaW4gaW5pdF9tb2R1bGUoKSwKKyAgICAgICAgICAgICAgICAgICAgOiBub3QgYSBnb29kIHRoaW5nIHRvIGRvIHRvIG90aGVyIGRldmljZXMgd2hpbGUgTGludXgKKyAgICAgICAgICAgICAgICAgICAgOiBpcyBydW5uaW5nIGZyb20gYWxsIGFjY291bnRzLgorICAgICAgICAgICAgICAgICAgICAKKyAgQWxhbiBDb3ggICAgICAgICAgOiBSZW1vdmVkIDEuMiBzdXBwb3J0LCBhZGRlZCAyLjEgZXh0cmEgY291bnRlcnMuCisKKyAgRGF2aWQgSHVnZ2lucy1EYWluZXMgPGRoZEBkZWJpYW4ub3JnPgorICAKKyAgU3BsaXQgdGhpcyBvZmYgaW50byBtYWM4OXgwLmMsIGFuZCBndXR0ZWQgaXQgb2YgYWxsIHBhcnRzIHdoaWNoIGFyZQorICBub3QgcmVsZXZhbnQgdG8gdGhlIGV4aXN0aW5nIENTODkwMCBjYXJkcyBvbiB0aGUgTWFjaW50b3NoCisgIChpLmUuIGJhc2ljYWxseSB0aGUgRGF5bmFwb3J0IENTIGFuZCBMQyBjYXJkcykuICBUbyBiZSBwcmVjaXNlOgorCisgICAgKiBSZW1vdmVkIGFsbCB0aGUgbWVkaWEtZGV0ZWN0aW9uIHN0dWZmLCBiZWNhdXNlIHRoZXNlIGNhcmRzIGFyZQorICAgIFRQLW9ubHkuCisKKyAgICAqIExvYm90b21pemVkIHRoZSBJU0EgaW50ZXJydXB0IGJvZ29zaXR5LCBiZWNhdXNlIHRoZXNlIGNhcmRzIHVzZQorICAgIGEgaGFyZHdpcmVkIE51QnVzIGludGVycnVwdCBhbmQgYSBtYWdpYyBJU0FJUlEgdmFsdWUgaW4gdGhlIGNhcmQuCisKKyAgICAqIEJhc2ljYWxseSBlbGltaW5hdGVkIGV2ZXJ5dGhpbmcgbm90IHJlbGV2YW50IHRvIGdldHRpbmcgdGhlCisgICAgY2FyZHMgbWluaW1hbGx5IGZ1bmN0aW9uaW5nIG9uIHRoZSBNYWNpbnRvc2guCisKKyAgSSBtaWdodCBhZGQgdGhhdCB0aGVzZSBjYXJkcyBhcmUgYmFkbHkgZGVzaWduZWQgZXZlbiBmcm9tIHRoZSBNYWMKKyAgc3RhbmRwb2ludCwgaW4gdGhhdCBEYXluYSwgaW4gdGhlaXIgaW5maW5pdGUgd2lzZG9tLCB1c2VkIE51QnVzIHNsb3QKKyAgSS9PIHNwYWNlIGFuZCBOdUJ1cyBpbnRlcnJ1cHRzIGZvciB0aGVzZSBjYXJkcywgYnV0IG5lZ2xlY3RlZCB0bworICBwcm92aWRlIGFueXRoaW5nIGV2ZW4gcmVtb3RlbHkgcmVzZW1ibGluZyBhIE51QnVzIFJPTS4gIFRoZXJlZm9yZSB3ZQorICBoYXZlIHRvIHByb2JlIGZvciB0aGVtIGluIGEgYnJhaW4tZGFtYWdlZCBJU0EtbGlrZSBmYXNoaW9uLgorCisgIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiAtIDExLzAxLzIwMDEKKyAgY2hlY2sga21hbGxvYyBhbmQgcmVsZWFzZSB0aGUgYWxsb2NhdGVkIG1lbW9yeSBvbiBmYWlsdXJlIGluCisgIG1hYzg5eDBfcHJvYmUgYW5kIGluIGluaXRfbW9kdWxlCisgIHVzZSBsb2NhbF9pcnFfe3NhdmUscmVzdG9yZX0oZmxhZ3MpIGluIG5ldF9nZXRfc3RhdCwgbm90IGp1c3QKKyAgbG9jYWxfaXJxX3tkaXMsZW59YWJsZSgpCisqLworCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9CisiY3M4OXgwLmM6djEuMDIgMTEvMjYvOTYgUnVzc2VsbCBOZWxzb24gPG5lbHNvbkBjcnlud3IuY29tPlxuIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT0gY29uZmlndXJlIHRoZSBkcml2ZXIgaGVyZSA9PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcgKi8KKyNpZm5kZWYgTkVUX0RFQlVHCisjZGVmaW5lIE5FVF9ERUJVRyAwCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT0gZW5kIG9mIGNvbmZpZ3VyYXRpb24gPT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisvKiBBbHdheXMgaW5jbHVkZSAnY29uZmlnLmgnIGZpcnN0IGluIGNhc2UgdGhlIHVzZXIgd2FudHMgdG8gdHVybiBvbgorICAgb3Igb3ZlcnJpZGUgc29tZXRoaW5nLiAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIFBSSU5USyh4KSBwcmludGsgeAorCisvKgorICBTb3VyY2VzOgorCisJQ3J5bndyIHBhY2tldCBkcml2ZXIgZXBrdGlzYS4KKworCUNyeXN0YWwgU2VtaWNvbmR1Y3RvciBkYXRhIHNoZWV0cy4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9udWJ1cy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2h3dGVzdC5oPgorI2luY2x1ZGUgPGFzbS9tYWNpbnRzLmg+CisKKyNpbmNsdWRlICJjczg5eDAuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBuZXRfZGVidWcgPSBORVRfREVCVUc7CisKKy8qIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLiAqLworc3RydWN0IG5ldF9sb2NhbCB7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJaW50IGNoaXBfdHlwZTsJCS8qIG9uZSBvZjogQ1M4OTAwLCBDUzg5MjAsIENTODkyME0gKi8KKwljaGFyIGNoaXBfcmV2aXNpb247CS8qIHJldmlzaW9uIGxldHRlciBvZiB0aGUgY2hpcCAoJ0EnLi4uKSAqLworCWludCBzZW5kX2NtZDsJCS8qIHRoZSBwcm9wZXJjb21tYW5kIHVzZWQgdG8gc2VuZCBhIHBhY2tldC4gKi8KKwlpbnQgcnhfbW9kZTsKKwlpbnQgY3Vycl9yeF9jZmc7CisgICAgICAgIGludCBzZW5kX3VuZGVycnVuOyAgICAgIC8qIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgdW5kZXJydW5zIGluIGEgcm93IHdlIGdldCAqLworCXN0cnVjdCBza19idWZmICpza2I7Cit9OworCisvKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisKKyNpZiAwCitleHRlcm4gdm9pZCByZXNldF9jaGlwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCitzdGF0aWMgaW50IG5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAluZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgbmV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CisKKworLyogRXhhbXBsZSByb3V0aW5lcyB5b3UgbXVzdCB3cml0ZSA7LT4uICovCisjZGVmaW5lIHR4X2RvbmUoZGV2KSAxCisKKy8qIEZvciByZWFkaW5nL3dyaXRpbmcgcmVnaXN0ZXJzIElTQS1zdHlsZSAqLworc3RhdGljIGlubGluZSBpbnQKK3JlYWRyZWdfaW8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBvcnRubykKK3sKKwludWJ1c193cml0ZXcoc3dhYjE2KHBvcnRubyksIGRldi0+YmFzZV9hZGRyICsgQUREX1BPUlQpOworCXJldHVybiBzd2FiMTYobnVidXNfcmVhZHcoZGV2LT5iYXNlX2FkZHIgKyBEQVRBX1BPUlQpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit3cml0ZXJlZ19pbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcG9ydG5vLCBpbnQgdmFsdWUpCit7CisJbnVidXNfd3JpdGV3KHN3YWIxNihwb3J0bm8pLCBkZXYtPmJhc2VfYWRkciArIEFERF9QT1JUKTsKKwludWJ1c193cml0ZXcoc3dhYjE2KHZhbHVlKSwgZGV2LT5iYXNlX2FkZHIgKyBEQVRBX1BPUlQpOworfQorCisvKiBUaGVzZSBhcmUgZm9yIHJlYWRpbmcvd3JpdGluZyByZWdpc3RlcnMgaW4gc2hhcmVkIG1lbW9yeSAqLworc3RhdGljIGlubGluZSBpbnQKK3JlYWRyZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBvcnRubykKK3sKKwlyZXR1cm4gc3dhYjE2KG51YnVzX3JlYWR3KGRldi0+bWVtX3N0YXJ0ICsgcG9ydG5vKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAord3JpdGVyZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBvcnRubywgaW50IHZhbHVlKQoreworCW51YnVzX3dyaXRldyhzd2FiMTYodmFsdWUpLCBkZXYtPm1lbV9zdGFydCArIHBvcnRubyk7Cit9CisKKy8qIFByb2JlIGZvciB0aGUgQ1M4OTAwIGNhcmQgaW4gc2xvdCBFLiAgV2Ugd29uJ3QgYm90aGVyIGxvb2tpbmcKKyAgIGFueXdoZXJlIGVsc2UgdW50aWwgd2UgaGF2ZSBhIHJlYWxseSBnb29kIHJlYXNvbiB0byBkbyBzby4gKi8KK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IG1hYzg5eDBfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdGF0aWMgaW50IG9uY2VfaXNfZW5vdWdoOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwOworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisJaW50IGksIHNsb3Q7CisJdW5zaWduZWQgcmV2X3R5cGUgPSAwOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCXVuc2lnbmVkIHNob3J0IHNpZzsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKG9uY2VfaXNfZW5vdWdoKQorCQlnb3RvIG91dDsKKwlvbmNlX2lzX2Vub3VnaCA9IDE7CisKKwkvKiBXZSBtaWdodCBoYXZlIHRvIHBhcmFtZXRlcml6ZSB0aGlzIGxhdGVyICovCisJc2xvdCA9IDB4RTsKKwkvKiBHZXQgb3V0IG5vdyBpZiB0aGVyZSdzIGEgcmVhbCBOdUJ1cyBjYXJkIGluIHNsb3QgRSAqLworCWlmIChudWJ1c19maW5kX3Nsb3Qoc2xvdCwgTlVMTCkgIT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwkvKiBUaGUgcHNldWRvLUlTQSBiaXRzIGFsd2F5cyBsaXZlIGF0IG9mZnNldCAweDMwMCAoZ2VlLAorICAgICAgICAgICB3b25kZXIgd2h5Li4uKSAqLworCWlvYWRkciA9ICh1bnNpZ25lZCBsb25nKQorCQludWJ1c19zbG90X2FkZHIoc2xvdCkgfCAoKChzbG90JjB4ZikgPDwgMjApICsgREVGQVVMVElPQkFTRSk7CisJeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlpbnQgY2FyZF9wcmVzZW50OworCQkKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQljYXJkX3ByZXNlbnQgPSBod3JlZ19wcmVzZW50KCh2b2lkKikgaW9hZGRyKzQpCisJCSAgJiYgaHdyZWdfcHJlc2VudCgodm9pZCopIGlvYWRkciArIERBVEFfUE9SVCk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCQlpZiAoIWNhcmRfcHJlc2VudCkKKwkJCWdvdG8gb3V0OworCX0KKworCW51YnVzX3dyaXRldygwLCBpb2FkZHIgKyBBRERfUE9SVCk7CisJc2lnID0gbnVidXNfcmVhZHcoaW9hZGRyICsgREFUQV9QT1JUKTsKKwlpZiAoc2lnICE9IHN3YWIxNihDSElQX0VJU0FfSURfU0lHKSkKKwkJZ290byBvdXQ7CisKKwkvKiBJbml0aWFsaXplIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlscCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBGaWxsIGluIHRoZSAnZGV2JyBmaWVsZHMuICovCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5tZW1fc3RhcnQgPSAodW5zaWduZWQgbG9uZykgCisJCW51YnVzX3Nsb3RfYWRkcihzbG90KSB8ICgoKHNsb3QmMHhmKSA8PCAyMCkgKyBNTUlPQkFTRSk7CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAweDEwMDA7CisKKwkvKiBUdXJuIG9uIHNoYXJlZCBtZW1vcnkgKi8KKwl3cml0ZXJlZ19pbyhkZXYsIFBQX0J1c0NUTCwgTUVNT1JZX09OKTsKKworCS8qIGdldCB0aGUgY2hpcCB0eXBlICovCisJcmV2X3R5cGUgPSByZWFkcmVnKGRldiwgUFJPRFVDVF9JRF9BREQpOworCWxwLT5jaGlwX3R5cGUgPSByZXZfdHlwZSAmfiBSRVZJU09OX0JJVFM7CisJbHAtPmNoaXBfcmV2aXNpb24gPSAoKHJldl90eXBlICYgUkVWSVNPTl9CSVRTKSA+PiA4KSArICdBJzsKKworCS8qIENoZWNrIHRoZSBjaGlwIHR5cGUgYW5kIHJldmlzaW9uIGluIG9yZGVyIHRvIHNldCB0aGUgY29ycmVjdCBzZW5kIGNvbW1hbmQKKwlDUzg5MjAgcmV2aXNpb24gQyBhbmQgQ1M4OTAwIHJldmlzaW9uIEYgY2FuIHVzZSB0aGUgZmFzdGVyIHNlbmQuICovCisJbHAtPnNlbmRfY21kID0gVFhfQUZURVJfMzgxOworCWlmIChscC0+Y2hpcF90eXBlID09IENTODkwMCAmJiBscC0+Y2hpcF9yZXZpc2lvbiA+PSAnRicpCisJCWxwLT5zZW5kX2NtZCA9IFRYX05PVzsKKwlpZiAobHAtPmNoaXBfdHlwZSAhPSBDUzg5MDAgJiYgbHAtPmNoaXBfcmV2aXNpb24gPj0gJ0MnKQorCQlscC0+c2VuZF9jbWQgPSBUWF9OT1c7CisKKwlpZiAobmV0X2RlYnVnICYmIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayh2ZXJzaW9uKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBjczg5JWMwJXMgcmV2ICVjIGZvdW5kIGF0ICUjOGx4IiwKKwkgICAgICAgZGV2LT5uYW1lLAorCSAgICAgICBscC0+Y2hpcF90eXBlPT1DUzg5MDA/JzAnOicyJywKKwkgICAgICAgbHAtPmNoaXBfdHlwZT09Q1M4OTIwTT8iTSI6IiIsCisJICAgICAgIGxwLT5jaGlwX3JldmlzaW9uLAorCSAgICAgICBkZXYtPmJhc2VfYWRkcik7CisKKwkvKiBUcnkgdG8gcmVhZCB0aGUgTUFDIGFkZHJlc3MgKi8KKwlpZiAoKHJlYWRyZWcoZGV2LCBQUF9TZWxmU1QpICYgKEVFUFJPTV9QUkVTRU5UIHwgRUVQUk9NX09LKSkgPT0gMCkgeworCQlwcmludGsoIlxubWFjODl4MDogTm8gRUVQUk9NLCBnaXZpbmcgdXAgbm93LlxuIik7CisJCWdvdG8gb3V0MTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkgKz0gMikgeworCQkJLyogQmlnLWVuZGlhbiAod2h5Pz8hKSAqLworCQkJdW5zaWduZWQgc2hvcnQgcyA9IHJlYWRyZWcoZGV2LCBQUF9JQSArIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5kZXZfYWRkcltpXSA9IHMgPj4gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+ZGV2X2FkZHJbaSsxXSA9IHMgJiAweGZmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJZGV2LT5pcnEgPSBTTE9UMklSUShzbG90KTsKKwlwcmludGsoIiBJUlEgJWQgQUREUiAiLCBkZXYtPmlycSk7CisKKwkvKiBwcmludCB0aGUgZXRoZXJuZXQgYWRkcmVzcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVzIiwgZGV2LT5kZXZfYWRkcltpXSwKKwkJICAgICAgICgoaSA8IEVUSF9BTEVOLTEpID8gIjoiIDogIiIpKTsKKwlwcmludGsoIlxuIik7CisKKwlkZXYtPm9wZW4JCT0gbmV0X29wZW47CisJZGV2LT5zdG9wCQk9IG5ldF9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG5ldF9zZW5kX3BhY2tldDsKKwlkZXYtPmdldF9zdGF0cwk9IG5ldF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gJnNldF9tYWNfYWRkcmVzczsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gMDsKK291dDE6CisJbnVidXNfd3JpdGV3KDAsIGRldi0+YmFzZV9hZGRyICsgQUREX1BPUlQpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworI2lmIDAKKy8qIFRoaXMgaXMgdXNlZnVsIGZvciBzb21ldGhpbmcsIGJ1dCBJIGRvbid0IGtub3cgd2hhdCB5ZXQuICovCit2b2lkIF9faW5pdCByZXNldF9jaGlwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc2V0X3N0YXJ0X3RpbWU7CisKKwl3cml0ZXJlZyhkZXYsIFBQX1NlbGZDVEwsIHJlYWRyZWcoZGV2LCBQUF9TZWxmQ1RMKSB8IFBPV0VSX09OX1JFU0VUKTsKKworCS8qIHdhaXQgMzAgbXMgKi8KKwltc2xlZXBfaW50ZXJydXB0aWJsZSgzMCk7CisKKwkvKiBXYWl0IHVudGlsIHRoZSBjaGlwIGlzIHJlc2V0ICovCisJcmVzZXRfc3RhcnRfdGltZSA9IGppZmZpZXM7CisJd2hpbGUoIChyZWFkcmVnKGRldiwgUFBfU2VsZlNUKSAmIElOSVRfRE9ORSkgPT0gMCAmJiBqaWZmaWVzIC0gcmVzZXRfc3RhcnRfdGltZSA8IDIpCisJCTsKK30KKyNlbmRpZgorCisvKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKKyAgIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKworICAgVGhpcyByb3V0aW5lIHNob3VsZCBzZXQgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgorICAgcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKKyAgIHRoZXJlIGlzIG5vbi1yZWJvb3Qgd2F5IHRvIHJlY292ZXIgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisgICAqLworc3RhdGljIGludAorbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwkvKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIG5vdyAqLworCXdyaXRlcmVnKGRldiwgUFBfQnVzQ1RMLCByZWFkcmVnKGRldiwgUFBfQnVzQ1RMKSAmIH5FTkFCTEVfSVJRKTsKKworCS8qIEdyYWIgdGhlIGludGVycnVwdCAqLworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJm5ldF9pbnRlcnJ1cHQsIDAsICJjczg5eDAiLCBkZXYpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qIFNldCB1cCB0aGUgSVJRIC0gQXBwYXJlbnRseSBtYWdpYyAqLworCWlmIChscC0+Y2hpcF90eXBlID09IENTODkwMCkKKwkJd3JpdGVyZWcoZGV2LCBQUF9DUzg5MDBfSVNBSU5ULCAwKTsKKwllbHNlCisJCXdyaXRlcmVnKGRldiwgUFBfQ1M4OTIwX0lTQUlOVCwgMCk7CisKKwkvKiBzZXQgdGhlIEV0aGVybmV0IGFkZHJlc3MgKi8KKwlmb3IgKGk9MDsgaSA8IEVUSF9BTEVOLzI7IGkrKykKKwkJd3JpdGVyZWcoZGV2LCBQUF9JQStpKjIsIGRldi0+ZGV2X2FkZHJbaSoyXSB8IChkZXYtPmRldl9hZGRyW2kqMisxXSA8PCA4KSk7CisKKwkvKiBUdXJuIG9uIGJvdGggcmVjZWl2ZSBhbmQgdHJhbnNtaXQgb3BlcmF0aW9ucyAqLworCXdyaXRlcmVnKGRldiwgUFBfTGluZUNUTCwgcmVhZHJlZyhkZXYsIFBQX0xpbmVDVEwpIHwgU0VSSUFMX1JYX09OIHwgU0VSSUFMX1RYX09OKTsKKworCS8qIFJlY2VpdmUgb25seSBlcnJvciBmcmVlIHBhY2tldHMgYWRkcmVzc2VkIHRvIHRoaXMgY2FyZCAqLworCWxwLT5yeF9tb2RlID0gMDsKKwl3cml0ZXJlZyhkZXYsIFBQX1J4Q1RMLCBERUZfUlhfQUNDRVBUKTsKKworCWxwLT5jdXJyX3J4X2NmZyA9IFJYX09LX0VOQkwgfCBSWF9DUkNfRVJST1JfRU5CTDsKKworCXdyaXRlcmVnKGRldiwgUFBfUnhDRkcsIGxwLT5jdXJyX3J4X2NmZyk7CisKKwl3cml0ZXJlZyhkZXYsIFBQX1R4Q0ZHLCBUWF9MT1NUX0NSU19FTkJMIHwgVFhfU1FFX0VSUk9SX0VOQkwgfCBUWF9PS19FTkJMIHwKKwkgICAgICAgVFhfTEFURV9DT0xfRU5CTCB8IFRYX0pCUl9FTkJMIHwgVFhfQU5ZX0NPTF9FTkJMIHwgVFhfMTZfQ09MX0VOQkwpOworCisJd3JpdGVyZWcoZGV2LCBQUF9CdWZDRkcsIFJFQURZX0ZPUl9UWF9FTkJMIHwgUlhfTUlTU19DT1VOVF9PVlJGTE9XX0VOQkwgfAorCQkgVFhfQ09MX0NPVU5UX09WUkZMT1dfRU5CTCB8IFRYX1VOREVSUlVOX0VOQkwpOworCisJLyogbm93IHRoYXQgd2UndmUgZ290IG91ciBhY3QgdG9nZXRoZXIsIGVuYWJsZSBldmVyeXRoaW5nICovCisJd3JpdGVyZWcoZGV2LCBQUF9CdXNDVEwsIHJlYWRyZWcoZGV2LCBQUF9CdXNDVEwpIHwgRU5BQkxFX0lSUSk7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+dGJ1c3kpIHsKKwkJLyogSWYgd2UgZ2V0IGhlcmUsIHNvbWUgaGlnaGVyIGxldmVsIGhhcyBkZWNpZGVkIHdlIGFyZSBicm9rZW4uCisJCSAgIFRoZXJlIHNob3VsZCByZWFsbHkgYmUgYSAia2ljayBtZSIgZnVuY3Rpb24gY2FsbCBpbnN0ZWFkLiAqLworCQlpbnQgdGlja3Nzb2ZhciA9IGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0OworCQlpZiAodGlja3Nzb2ZhciA8IDUpCisJCQlyZXR1cm4gMTsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDApIHByaW50aygiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/XG4iLCBkZXYtPm5hbWUsCisJCQkgICB0eF9kb25lKGRldikgPyAiSVJRIGNvbmZsaWN0IiA6ICJuZXR3b3JrIGNhYmxlIHByb2JsZW0iKTsKKwkJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuICovCisJCWRldi0+dGJ1c3k9MDsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJfQorCisJLyogQmxvY2sgYSB0aW1lci1iYXNlZCB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nLiAgVGhpcyBjb3VsZCBiZXR0ZXIgYmUKKwkgICBkb25lIHdpdGggYXRvbWljX3N3YXAoMSwgZGV2LT50YnVzeSksIGJ1dCBzZXRfYml0KCkgd29ya3MgYXMgd2VsbC4gKi8KKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCopJmRldi0+dGJ1c3kpICE9IDApCisJCXByaW50aygiJXM6IFRyYW5zbWl0dGVyIGFjY2VzcyBjb25mbGljdC5cbiIsIGRldi0+bmFtZSk7CisJZWxzZSB7CisJCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlpZiAobmV0X2RlYnVnID4gMykKKwkJCXByaW50aygiJXM6IHNlbnQgJWQgYnl0ZSBwYWNrZXQgb2YgdHlwZSAleFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHNrYi0+bGVuLAorCQkJICAgICAgIChza2ItPmRhdGFbRVRIX0FMRU4rRVRIX0FMRU5dIDw8IDgpCisJCQkgICAgICAgfCBza2ItPmRhdGFbRVRIX0FMRU4rRVRIX0FMRU4rMV0pOworCisJCS8qIGtlZXAgdGhlIHVwbG9hZCBmcm9tIGJlaW5nIGludGVycnVwdGVkLCBzaW5jZSB3ZQorICAgICAgICAgICAgICAgICAgIGFzayB0aGUgY2hpcCB0byBzdGFydCB0cmFuc21pdHRpbmcgYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgICAgIHdob2xlIHBhY2tldCBoYXMgYmVlbiBjb21wbGV0ZWx5IHVwbG9hZGVkLiAqLworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkJLyogaW5pdGlhdGUgYSB0cmFuc21pdCBzZXF1ZW5jZSAqLworCQl3cml0ZXJlZyhkZXYsIFBQX1R4Q01ELCBscC0+c2VuZF9jbWQpOworCQl3cml0ZXJlZyhkZXYsIFBQX1R4TGVuZ3RoLCBza2ItPmxlbik7CisKKwkJLyogVGVzdCB0byBzZWUgaWYgdGhlIGNoaXAgaGFzIGFsbG9jYXRlZCBtZW1vcnkgZm9yIHRoZSBwYWNrZXQgKi8KKwkJaWYgKChyZWFkcmVnKGRldiwgUFBfQnVzU1QpICYgUkVBRFlfRk9SX1RYX05PVykgPT0gMCkgeworCQkJLyogR2FzcCEgIEl0IGhhc24ndC4gIEJ1dCB0aGF0IHNob3VsZG4ndCBoYXBwZW4gc2luY2UKKwkJCSAgIHdlJ3JlIHdhaXRpbmcgZm9yIFR4T2ssIHNvIHJldHVybiAxIGFuZCByZXF1ZXVlIHRoaXMgcGFja2V0LiAqLworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKiBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIHBhY2tldCAqLworCQltZW1jcHlfdG9pbyhkZXYtPm1lbV9zdGFydCArIFBQX1R4RnJhbWUsIHNrYi0+ZGF0YSwgc2tiLT5sZW4rMSk7CisKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwl9CisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKworCXJldHVybiAwOworfQorDAorLyogVGhlIHR5cGljYWwgd29ya2xvYWQgb2YgdGhlIGRyaXZlcjoKKyAgIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBuZXRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IG5ldF9sb2NhbCAqbHA7CisJaW50IGlvYWRkciwgc3RhdHVzOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayAoIm5ldF9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJaWYgKGRldi0+aW50ZXJydXB0KQorCQlwcmludGsoIiVzOiBSZS1lbnRlcmluZyB0aGUgaW50ZXJydXB0IGhhbmRsZXIuXG4iLCBkZXYtPm5hbWUpOworCWRldi0+aW50ZXJydXB0ID0gMTsKKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIHdlIE1VU1QgcmVhZCBhbGwgdGhlIGV2ZW50cyBvdXQgb2YgdGhlIElTUSwgb3RoZXJ3aXNlIHdlJ2xsIG5ldmVyCisgICAgICAgICAgIGdldCBpbnRlcnJ1cHRlZCBhZ2Fpbi4gIEFzIGEgY29uc2VxdWVuY2UsIHdlIGNhbid0IGhhdmUgYW55IGxpbWl0CisgICAgICAgICAgIG9uIHRoZSBudW1iZXIgb2YgdGltZXMgd2UgbG9vcCBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIuICBUaGUKKyAgICAgICAgICAgaGFyZHdhcmUgZ3VhcmFudGVlcyB0aGF0IGV2ZW50dWFsbHkgd2UnbGwgcnVuIG91dCBvZiBldmVudHMuICBPZgorICAgICAgICAgICBjb3Vyc2UsIGlmIHlvdSdyZSBvbiBhIHNsb3cgbWFjaGluZSwgYW5kIHBhY2tldHMgYXJlIGFycml2aW5nCisgICAgICAgICAgIGZhc3RlciB0aGFuIHlvdSBjYW4gcmVhZCB0aGVtIG9mZiwgeW91J3JlIHNjcmV3ZWQuICBIYXN0YSBsYQorICAgICAgICAgICB2aXN0YSwgYmFieSEgICovCisJd2hpbGUgKChzdGF0dXMgPSBzd2FiMTYobnVidXNfcmVhZHcoZGV2LT5iYXNlX2FkZHIgKyBJU1FfUE9SVCkpKSkgeworCQlpZiAobmV0X2RlYnVnID4gNClwcmludGsoIiVzOiBldmVudD0lMDR4XG4iLCBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCXN3aXRjaChzdGF0dXMgJiBJU1FfRVZFTlRfTUFTSykgeworCQljYXNlIElTUV9SRUNFSVZFUl9FVkVOVDoKKwkJCS8qIEdvdCBhIHBhY2tldChzKS4gKi8KKwkJCW5ldF9yeChkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgSVNRX1RSQU5TTUlUVEVSX0VWRU5UOgorCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWRldi0+dGJ1c3kgPSAwOworCQkJbWFya19iaChORVRfQkgpOwkvKiBJbmZvcm0gdXBwZXIgbGF5ZXJzLiAqLworCQkJaWYgKChzdGF0dXMgJiBUWF9PSykgPT0gMCkgbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFRYX0xPU1RfQ1JTKSBscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBUWF9TUUVfRVJST1IpIGxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgVFhfTEFURV9DT0wpIGxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgVFhfMTZfQ09MKSBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWJyZWFrOworCQljYXNlIElTUV9CVUZGRVJfRVZFTlQ6CisJCQlpZiAoc3RhdHVzICYgUkVBRFlfRk9SX1RYKSB7CisJCQkJLyogd2UgdHJpZWQgdG8gdHJhbnNtaXQgYSBwYWNrZXQgZWFybGllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGluZXhwbGljYWJseSByYW4gb3V0IG9mIGJ1ZmZlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoYXQgc2hvdWxkbid0IGhhcHBlbiBzaW5jZSB3ZSBvbmx5IGV2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCBvbmUgcGFja2V0LiAgU2hydWcuICBEbyB0aGUgcmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcgYW55d2F5LiAqLworCQkJCWRldi0+dGJ1c3kgPSAwOworCQkJCW1hcmtfYmgoTkVUX0JIKTsJLyogSW5mb3JtIHVwcGVyIGxheWVycy4gKi8KKwkJCX0KKwkJCWlmIChzdGF0dXMgJiBUWF9VTkRFUlJVTikgeworCQkJCWlmIChuZXRfZGVidWcgPiAwKSBwcmludGsoIiVzOiB0cmFuc21pdCB1bmRlcnJ1blxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnNlbmRfdW5kZXJydW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxwLT5zZW5kX3VuZGVycnVuID09IDMpIGxwLT5zZW5kX2NtZCA9IFRYX0FGVEVSXzM4MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobHAtPnNlbmRfdW5kZXJydW4gPT0gNikgbHAtPnNlbmRfY21kID0gVFhfQUZURVJfQUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJYnJlYWs7CisJCWNhc2UgSVNRX1JYX01JU1NfRVZFTlQ6CisJCQlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSAoc3RhdHVzID4+Nik7CisJCQlicmVhazsKKwkJY2FzZSBJU1FfVFhfQ09MX0VWRU5UOgorCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHN0YXR1cyA+PjYpOworCQkJYnJlYWs7CisJCX0KKwl9CisJZGV2LT5pbnRlcnJ1cHQgPSAwOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuICovCitzdGF0aWMgdm9pZAorbmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHN0YXR1cywgbGVuZ3RoOworCisJc3RhdHVzID0gcmVhZHJlZyhkZXYsIFBQX1J4U3RhdHVzKTsKKwlpZiAoKHN0YXR1cyAmIFJYX09LKSA9PSAwKSB7CisJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJYX1JVTlQpIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBSWF9FWFRSQV9EQVRBKSBscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgUlhfQ1JDX0VSUk9SKSBpZiAoIShzdGF0dXMgJiAoUlhfRVhUUkFfREFUQXxSWF9SVU5UKSkpCisJCQkvKiBwZXIgc3RyIDE3MiAqLworCQkJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJYX0RSSUJCTEUpIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJcmV0dXJuOworCX0KKworCWxlbmd0aCA9IHJlYWRyZWcoZGV2LCBQUF9SeExlbmd0aCk7CisJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJc2tiID0gYWxsb2Nfc2tiKGxlbmd0aCwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCXNrYl9wdXQoc2tiLCBsZW5ndGgpOworCXNrYi0+ZGV2ID0gZGV2OworCisJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIGRldi0+bWVtX3N0YXJ0ICsgUFBfUnhGcmFtZSwgbGVuZ3RoKTsKKworCWlmIChuZXRfZGVidWcgPiAzKXByaW50aygiJXM6IHJlY2VpdmVkICVkIGJ5dGUgcGFja2V0IG9mIHR5cGUgJXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChza2ItPmRhdGFbRVRIX0FMRU4rRVRIX0FMRU5dIDw8IDgpCisJCQkJIHwgc2tiLT5kYXRhW0VUSF9BTEVOK0VUSF9BTEVOKzFdKTsKKworICAgICAgICBza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCW5ldGlmX3J4KHNrYik7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlscC0+c3RhdHMucnhfcGFja2V0cysrOworCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7Cit9CisKKy8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gbmV0X29wZW4oKS4gKi8KK3N0YXRpYyBpbnQKK25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJd3JpdGVyZWcoZGV2LCBQUF9SeENGRywgMCk7CisJd3JpdGVyZWcoZGV2LCBQUF9UeENGRywgMCk7CisJd3JpdGVyZWcoZGV2LCBQUF9CdWZDRkcsIDApOworCXdyaXRlcmVnKGRldiwgUFBfQnVzQ1RMLCAwKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGhlcmUuICovCisKKwlyZXR1cm4gMDsKKworfQorCisvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4JVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvcgorICAgY2xvc2VkLiAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkvKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3MgZnJvbSB0aGUgZGV2aWNlIHJlZ2lzdGVycy4gKi8KKwlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSAocmVhZHJlZyhkZXYsIFBQX1J4TWlzcykgPj4gNik7CisJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHJlYWRyZWcoZGV2LCBQUF9UeENvbCkgPj4gNik7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmKGRldi0+ZmxhZ3MmSUZGX1BST01JU0MpCisJeworCQlscC0+cnhfbW9kZSA9IFJYX0FMTF9BQ0NFUFQ7CisJfQorCWVsc2UgaWYoKGRldi0+ZmxhZ3MmSUZGX0FMTE1VTFRJKXx8ZGV2LT5tY19saXN0KQorCXsKKwkJLyogVGhlIG11bHRpY2FzdC1hY2NlcHQgbGlzdCBpcyBpbml0aWFsaXplZCB0byBhY2NlcHQtYWxsLCBhbmQgd2UKKwkJICAgcmVseSBvbiBoaWdoZXItbGV2ZWwgZmlsdGVyaW5nIGZvciBub3cuICovCisJCWxwLT5yeF9tb2RlID0gUlhfTVVMVENBU1RfQUNDRVBUOworCX0gCisJZWxzZQorCQlscC0+cnhfbW9kZSA9IDA7CisKKwl3cml0ZXJlZyhkZXYsIFBQX1J4Q1RMLCBERUZfUlhfQUNDRVBUIHwgbHAtPnJ4X21vZGUpOworCisJLyogaW4gcHJvbWlzY3VvdXMgbW9kZSwgd2UgYWNjZXB0IGVycm9yZWQgcGFja2V0cywgc28gd2UgaGF2ZSB0byBlbmFibGUgaW50ZXJydXB0cyBvbiB0aGVtIGFsc28gKi8KKwl3cml0ZXJlZyhkZXYsIFBQX1J4Q0ZHLCBscC0+Y3Vycl9yeF9jZmcgfAorCSAgICAgKGxwLT5yeF9tb2RlID09IFJYX0FMTF9BQ0NFUFQ/IChSWF9DUkNfRVJST1JfRU5CTHxSWF9SVU5UX0VOQkx8UlhfRVhUUkFfREFUQV9FTkJMKSA6IDApKTsKK30KKworCitzdGF0aWMgaW50IHNldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCWludCBpOworCWlmIChkZXYtPnN0YXJ0KQorCQlyZXR1cm4gLUVCVVNZOworCXByaW50aygiJXM6IFNldHRpbmcgTUFDIGFkZHJlc3MgdG8gIiwgZGV2LT5uYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiAlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0gPSAoKHVuc2lnbmVkIGNoYXIgKilhZGRyKVtpXSk7CisJcHJpbnRrKCIuXG4iKTsKKwkvKiBzZXQgdGhlIEV0aGVybmV0IGFkZHJlc3MgKi8KKwlmb3IgKGk9MDsgaSA8IEVUSF9BTEVOLzI7IGkrKykKKwkJd3JpdGVyZWcoZGV2LCBQUF9JQStpKjIsIGRldi0+ZGV2X2FkZHJbaSoyXSB8IChkZXYtPmRldl9hZGRyW2kqMisxXSA8PCA4KSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE1PRFVMRQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9jczg5eDA7CitzdGF0aWMgaW50IGRlYnVnOworCitNT0RVTEVfUEFSTShkZWJ1ZywgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJDUzg5WzAyXTAgZGVidWcgbGV2ZWwgKDAtNSkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworaW50Citpbml0X21vZHVsZSh2b2lkKQoreworCW5ldF9kZWJ1ZyA9IGRlYnVnOworICAgICAgICBkZXZfY3M4OXgwID0gbWFjODl4MF9wcm9iZSgtMSk7CisJaWYgKElTX0VSUihkZXZfY3M4OXgwKSkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIm1hYzg5eDAuYzogTm8gY2FyZCBmb3VuZFxuIik7CisJCXJldHVybiBQVFJfRVJSKGRldl9jczg5eDApOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZAorY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfY3M4OXgwKTsKKwludWJ1c193cml0ZXcoMCwgZGV2X2NzODl4MC0+YmFzZV9hZGRyICsgQUREX1BPUlQpOworCWZyZWVfbmV0ZGV2KGRldl9jczg5eDApOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJtNjhrLWxpbnV4LWdjYyAtRF9fS0VSTkVMX18gLUkuLi8uLi9pbmNsdWRlIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1waXBlIC1mbm8tc3RyZW5ndGgtcmVkdWNlIC1mZml4ZWQtYTIgLURNT0RVTEUgLURNT0RWRVJTSU9OUyAtaW5jbHVkZSAuLi8uLi9pbmNsdWRlL2xpbnV4L21vZHZlcnNpb25zLmggICAtYyAtbyBtYWM4OXgwLm8gbWFjODl4MC5jIgorICogIHZlcnNpb24tY29udHJvbDogdAorICogIGtlcHQtbmV3LXZlcnNpb25zOiA1CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqCisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY2UuYyBiL2RyaXZlcnMvbmV0L21hY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQyZDdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbWFjZS5jCkBAIC0wLDAgKzEsMTA1MyBAQAorLyoKKyAqIE5ldHdvcmsgZGV2aWNlIGRyaXZlciBmb3IgdGhlIE1BQ0UgZXRoZXJuZXQgY29udHJvbGxlciBvbgorICogQXBwbGUgUG93ZXJtYWNzLiAgQXNzdW1lcyBpdCdzIHVuZGVyIGEgREJETUEgY29udHJvbGxlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vZGJkbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNpby5oPgorCisjaW5jbHVkZSAibWFjZS5oIgorCitzdGF0aWMgaW50IHBvcnRfYWF1aSA9IC0xOworCisjZGVmaW5lIE5fUlhfUklORwk4CisjZGVmaW5lIE5fVFhfUklORwk2CisjZGVmaW5lIE1BWF9UWF9BQ1RJVkUJMQorI2RlZmluZSBOQ01EU19UWAkxCS8qIGRtYSBjb21tYW5kcyBwZXIgZWxlbWVudCBpbiB0eCByaW5nICovCisjZGVmaW5lIFJYX0JVRkxFTgkoRVRIX0ZSQU1FX0xFTiArIDgpCisjZGVmaW5lIFRYX1RJTUVPVVQJSFoJLyogMSBzZWNvbmQgKi8KKworLyogQ2hpcCByZXYgbmVlZHMgd29ya2Fyb3VuZCBvbiBIVyAmIG11bHRpY2FzdCBhZGRyIGNoYW5nZSAqLworI2RlZmluZSBCUk9LRU5fQUREUkNIR19SRVYJMHgwOTQxCisKKy8qIEJpdHMgaW4gdHJhbnNtaXQgRE1BIHN0YXR1cyAqLworI2RlZmluZSBUWF9ETUFfRVJSCTB4ODAKKworc3RydWN0IG1hY2VfZGF0YSB7CisgICAgdm9sYXRpbGUgc3RydWN0IG1hY2UgX19pb21lbSAqbWFjZTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICp0eF9kbWE7CisgICAgaW50IHR4X2RtYV9pbnRyOworICAgIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnJ4X2RtYTsKKyAgICBpbnQgcnhfZG1hX2ludHI7CisgICAgdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqdHhfY21kczsJLyogeG1pdCBkbWEgY29tbWFuZCBsaXN0ICovCisgICAgdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqcnhfY21kczsJLyogcmVjdiBkbWEgY29tbWFuZCBsaXN0ICovCisgICAgc3RydWN0IHNrX2J1ZmYgKnJ4X2J1ZnNbTl9SWF9SSU5HXTsKKyAgICBpbnQgcnhfZmlsbDsKKyAgICBpbnQgcnhfZW1wdHk7CisgICAgc3RydWN0IHNrX2J1ZmYgKnR4X2J1ZnNbTl9UWF9SSU5HXTsKKyAgICBpbnQgdHhfZmlsbDsKKyAgICBpbnQgdHhfZW1wdHk7CisgICAgdW5zaWduZWQgY2hhciBtYWNjYzsKKyAgICB1bnNpZ25lZCBjaGFyIHR4X2Z1bGx1cDsKKyAgICB1bnNpZ25lZCBjaGFyIHR4X2FjdGl2ZTsKKyAgICB1bnNpZ25lZCBjaGFyIHR4X2JhZF9ydW50OworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworICAgIHN0cnVjdCB0aW1lcl9saXN0IHR4X3RpbWVvdXQ7CisgICAgaW50IHRpbWVvdXRfYWN0aXZlOworICAgIGludCBwb3J0X2FhdWk7CisgICAgaW50IGNoaXBpZDsKKyAgICBzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2OworICAgIHNwaW5sb2NrX3QgbG9jazsKK307CisKKy8qCisgKiBOdW1iZXIgb2YgYnl0ZXMgb2YgcHJpdmF0ZSBkYXRhIHBlciBNQUNFOiBhbGxvdyBlbm91Z2ggZm9yCisgKiB0aGUgcnggYW5kIHR4IGRtYSBjb21tYW5kcyBwbHVzIGEgYnJhbmNoIGRtYSBjb21tYW5kIGVhY2gsCisgKiBhbmQgYW5vdGhlciAxNiBieXRlcyB0byBhbGxvdyB1cyB0byBhbGlnbiB0aGUgZG1hIGNvbW1hbmQKKyAqIGJ1ZmZlcnMgb24gYSAxNiBieXRlIGJvdW5kYXJ5LgorICovCisjZGVmaW5lIFBSSVZfQllURVMJKHNpemVvZihzdHJ1Y3QgbWFjZV9kYXRhKSBcCisJKyAoTl9SWF9SSU5HICsgTkNNRFNfVFggKiBOX1RYX1JJTkcgKyAzKSAqIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSkKKworc3RhdGljIGludCBiaXRyZXYoaW50KTsKK3N0YXRpYyBpbnQgbWFjZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtYWNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtYWNlX3htaXRfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm1hY2Vfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBtYWNlX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBtYWNlX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtYWNlX3NldF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpOworc3RhdGljIGlycXJldHVybl90IG1hY2VfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGlycXJldHVybl90IG1hY2VfdHhkbWFfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYWNlX3J4ZG1hX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBtYWNlX3NldF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbWFjZV90eF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgaW5saW5lIHZvaWQgZGJkbWFfcmVzZXQodm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZG1hKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWNlX2NsZWFuX3JpbmdzKHN0cnVjdCBtYWNlX2RhdGEgKm1wKTsKK3N0YXRpYyB2b2lkIF9fbWFjZV9zZXRfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKTsKKworLyoKKyAqIElmIHdlIGNhbid0IGdldCBhIHNrYnVmZiB3aGVuIHdlIG5lZWQgaXQsIHdlIHVzZSB0aGlzIGFyZWEgZm9yIERNQS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmR1bW15X2J1ZjsKKworLyogQml0LXJldmVyc2Ugb25lIGJ5dGUgb2YgYW4gZXRoZXJuZXQgaGFyZHdhcmUgYWRkcmVzcy4gKi8KK3N0YXRpYyBpbmxpbmUgaW50CitiaXRyZXYoaW50IGIpCit7CisgICAgaW50IGQgPSAwLCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSwgYiA+Pj0gMSkKKwlkID0gKGQgPDwgMSkgfCAoYiAmIDEpOworICAgIHJldHVybiBkOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1hY2VfcHJvYmUoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1hY2UgPSBtYWNpb19nZXRfb2Zfbm9kZShtZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBtYWNlX2RhdGEgKm1wOworCXVuc2lnbmVkIGNoYXIgKmFkZHI7CisJaW50IGosIHJldiwgcmMgPSAtRUJVU1k7CisKKwlpZiAobWFjaW9fcmVzb3VyY2VfY291bnQobWRldikgIT0gMyB8fCBtYWNpb19pcnFfY291bnQobWRldikgIT0gMykgeworCQlwcmludGsoS0VSTl9FUlIgImNhbid0IHVzZSBNQUNFICVzOiBuZWVkIDMgYWRkcnMgYW5kIDMgaXJxc1xuIiwKKwkJICAgICAgIG1hY2UtPmZ1bGxfbmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWFkZHIgPSBnZXRfcHJvcGVydHkobWFjZSwgIm1hYy1hZGRyZXNzIiwgTlVMTCk7CisJaWYgKGFkZHIgPT0gTlVMTCkgeworCQlhZGRyID0gZ2V0X3Byb3BlcnR5KG1hY2UsICJsb2NhbC1tYWMtYWRkcmVzcyIsIE5VTEwpOworCQlpZiAoYWRkciA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGdldCBtYWMtYWRkcmVzcyBmb3IgTUFDRSAlc1xuIiwKKwkJCSAgICAgICBtYWNlLT5mdWxsX25hbWUpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwkvKgorCSAqIGxhenkgYWxsb2NhdGUgdGhlIGRyaXZlci13aWRlIGR1bW15IGJ1ZmZlci4gKE5vdGUgdGhhdCB3ZQorCSAqIG5ldmVyIGhhdmUgbW9yZSB0aGFuIG9uZSBNQUNFIGluIHRoZSBzeXN0ZW0gYW55d2F5KQorCSAqLworCWlmIChkdW1teV9idWYgPT0gTlVMTCkgeworCQlkdW1teV9idWYgPSBrbWFsbG9jKFJYX0JVRkxFTisyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGR1bW15X2J1ZiA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIk1BQ0U6IGNvdWxkbid0IGFsbG9jYXRlIGR1bW15IGJ1ZmZlclxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWlmIChtYWNpb19yZXF1ZXN0X3Jlc291cmNlcyhtZGV2LCAibWFjZSIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTUFDRTogY2FuJ3QgcmVxdWVzdCBJTyByZXNvdXJjZXMgIVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoUFJJVl9CWVRFUyk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNQUNFOiBjYW4ndCBhbGxvY2F0ZSBldGhlcm5ldCBkZXZpY2UgIVxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmVsZWFzZTsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJm1kZXYtPm9mZGV2LmRldik7CisKKwltcCA9IGRldi0+cHJpdjsKKwltcC0+bWRldiA9IG1kZXY7CisJbWFjaW9fc2V0X2RydmRhdGEobWRldiwgZGV2KTsKKworCWRldi0+YmFzZV9hZGRyID0gbWFjaW9fcmVzb3VyY2Vfc3RhcnQobWRldiwgMCk7CisJbXAtPm1hY2UgPSBpb3JlbWFwKGRldi0+YmFzZV9hZGRyLCAweDEwMDApOworCWlmIChtcC0+bWFjZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTUFDRTogY2FuJ3QgbWFwIElPIHJlc291cmNlcyAhXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlOworCX0KKwlkZXYtPmlycSA9IG1hY2lvX2lycShtZGV2LCAwKTsKKworCXJldiA9IGFkZHJbMF0gPT0gMCAmJiBhZGRyWzFdID09IDB4QTA7CisJZm9yIChqID0gMDsgaiA8IDY7ICsraikgeworCQlkZXYtPmRldl9hZGRyW2pdID0gcmV2PyBiaXRyZXYoYWRkcltqXSk6IGFkZHJbal07CisJfQorCW1wLT5jaGlwaWQgPSAoaW5fOCgmbXAtPm1hY2UtPmNoaXBpZF9oaSkgPDwgOCkgfAorCQkJaW5fOCgmbXAtPm1hY2UtPmNoaXBpZF9sbyk7CisJCQorCisJbXAgPSAoc3RydWN0IG1hY2VfZGF0YSAqKSBkZXYtPnByaXY7CisJbXAtPm1hY2NjID0gRU5YTVQgfCBFTlJDVjsKKworCW1wLT50eF9kbWEgPSBpb3JlbWFwKG1hY2lvX3Jlc291cmNlX3N0YXJ0KG1kZXYsIDEpLCAweDEwMDApOworCWlmIChtcC0+dHhfZG1hID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNQUNFOiBjYW4ndCBtYXAgVFggRE1BIHJlc291cmNlcyAhXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bm1hcF9pbzsKKwl9CisJbXAtPnR4X2RtYV9pbnRyID0gbWFjaW9faXJxKG1kZXYsIDEpOworCisJbXAtPnJ4X2RtYSA9IGlvcmVtYXAobWFjaW9fcmVzb3VyY2Vfc3RhcnQobWRldiwgMiksIDB4MTAwMCk7CisJaWYgKG1wLT5yeF9kbWEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIk1BQ0U6IGNhbid0IG1hcCBSWCBETUEgcmVzb3VyY2VzICFcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VubWFwX3R4X2RtYTsKKwl9CisJbXAtPnJ4X2RtYV9pbnRyID0gbWFjaW9faXJxKG1kZXYsIDIpOworCisJbXAtPnR4X2NtZHMgPSAodm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqKSBEQkRNQV9BTElHTihtcCArIDEpOworCW1wLT5yeF9jbWRzID0gbXAtPnR4X2NtZHMgKyBOQ01EU19UWCAqIE5fVFhfUklORyArIDE7CisKKwltZW1zZXQoJm1wLT5zdGF0cywgMCwgc2l6ZW9mKG1wLT5zdGF0cykpOworCW1lbXNldCgoY2hhciAqKSBtcC0+dHhfY21kcywgMCwKKwkgICAgICAgKE5DTURTX1RYKk5fVFhfUklORyArIE5fUlhfUklORyArIDIpICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpKTsKKwlpbml0X3RpbWVyKCZtcC0+dHhfdGltZW91dCk7CisJc3Bpbl9sb2NrX2luaXQoJm1wLT5sb2NrKTsKKwltcC0+dGltZW91dF9hY3RpdmUgPSAwOworCisJaWYgKHBvcnRfYWF1aSA+PSAwKQorCQltcC0+cG9ydF9hYXVpID0gcG9ydF9hYXVpOworCWVsc2UgeworCQkvKiBBcHBsZSBOZXR3b3JrIFNlcnZlciB1c2VzIHRoZSBBQVVJIHBvcnQgKi8KKwkJaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCxTaGluZXJFU0IiKSkKKwkJCW1wLT5wb3J0X2FhdWkgPSAxOworCQllbHNlIHsKKyNpZmRlZiBDT05GSUdfTUFDRV9BQVVJX1BPUlQKKwkJCW1wLT5wb3J0X2FhdWkgPSAxOworI2Vsc2UKKwkJCW1wLT5wb3J0X2FhdWkgPSAwOworI2VuZGlmCQkJCisJCX0KKwl9CisKKwlkZXYtPm9wZW4gPSBtYWNlX29wZW47CisJZGV2LT5zdG9wID0gbWFjZV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG1hY2VfeG1pdF9zdGFydDsKKwlkZXYtPmdldF9zdGF0cyA9IG1hY2Vfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBtYWNlX3NldF9tdWx0aWNhc3Q7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBtYWNlX3NldF9hZGRyZXNzOworCisJLyoKKwkgKiBNb3N0IG9mIHdoYXQgaXMgYmVsb3cgY291bGQgYmUgbW92ZWQgdG8gbWFjZV9vcGVuKCkKKwkgKi8KKwltYWNlX3Jlc2V0KGRldik7CisKKwlyYyA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBtYWNlX2ludGVycnVwdCwgMCwgIk1BQ0UiLCBkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIk1BQ0U6IGNhbid0IGdldCBpcnEgJWRcbiIsIGRldi0+aXJxKTsKKwkJZ290byBlcnJfdW5tYXBfcnhfZG1hOworCX0KKwlyYyA9IHJlcXVlc3RfaXJxKG1wLT50eF9kbWFfaW50ciwgbWFjZV90eGRtYV9pbnRyLCAwLCAiTUFDRS10eGRtYSIsIGRldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTUFDRTogY2FuJ3QgZ2V0IGlycSAlZFxuIiwgbWFjZS0+aW50cnNbMV0ubGluZSk7CisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCX0KKwlyYyA9IHJlcXVlc3RfaXJxKG1wLT5yeF9kbWFfaW50ciwgbWFjZV9yeGRtYV9pbnRyLCAwLCAiTUFDRS1yeGRtYSIsIGRldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTUFDRTogY2FuJ3QgZ2V0IGlycSAlZFxuIiwgbWFjZS0+aW50cnNbMl0ubGluZSk7CisJCWdvdG8gZXJyX2ZyZWVfdHhfaXJxOworCX0KKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTUFDRTogQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX2ZyZWVfcnhfaXJxOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBNQUNFIGF0IiwgZGV2LT5uYW1lKTsKKwlmb3IgKGogPSAwOyBqIDwgNjsgKytqKSB7CisJCXByaW50aygiJWMlLjJ4IiwgKGo/ICc6JzogJyAnKSwgZGV2LT5kZXZfYWRkcltqXSk7CisJfQorCXByaW50aygiLCBjaGlwIHJldmlzaW9uICVkLiVkXG4iLCBtcC0+Y2hpcGlkID4+IDgsIG1wLT5jaGlwaWQgJiAweGZmKTsKKworCXJldHVybiAwOworIAorIGVycl9mcmVlX3J4X2lycToKKwlmcmVlX2lycShtYWNpb19pcnEobWRldiwgMiksIGRldik7CisgZXJyX2ZyZWVfdHhfaXJxOgorCWZyZWVfaXJxKG1hY2lvX2lycShtZGV2LCAxKSwgZGV2KTsKKyBlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEobWFjaW9faXJxKG1kZXYsIDApLCBkZXYpOworIGVycl91bm1hcF9yeF9kbWE6CisJaW91bm1hcChtcC0+cnhfZG1hKTsKKyBlcnJfdW5tYXBfdHhfZG1hOgorCWlvdW5tYXAobXAtPnR4X2RtYSk7CisgZXJyX3VubWFwX2lvOgorCWlvdW5tYXAobXAtPm1hY2UpOworIGVycl9mcmVlOgorCWZyZWVfbmV0ZGV2KGRldik7CisgZXJyX3JlbGVhc2U6CisJbWFjaW9fcmVsZWFzZV9yZXNvdXJjZXMobWRldik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG1hY2VfcmVtb3ZlKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG1hY2lvX2dldF9kcnZkYXRhKG1kZXYpOworCXN0cnVjdCBtYWNlX2RhdGEgKm1wOworCisJQlVHX09OKGRldiA9PSBOVUxMKTsKKworCW1hY2lvX3NldF9kcnZkYXRhKG1kZXYsIE5VTEwpOworCisJbXAgPSBkZXYtPnByaXY7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJZnJlZV9pcnEobXAtPnR4X2RtYV9pbnRyLCBkZXYpOworCWZyZWVfaXJxKG1wLT5yeF9kbWFfaW50ciwgZGV2KTsKKworCWlvdW5tYXAobXAtPnJ4X2RtYSk7CisJaW91bm1hcChtcC0+dHhfZG1hKTsKKwlpb3VubWFwKG1wLT5tYWNlKTsKKworCWZyZWVfbmV0ZGV2KGRldik7CisKKwltYWNpb19yZWxlYXNlX3Jlc291cmNlcyhtZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkYmRtYV9yZXNldCh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpkbWEpCit7CisgICAgaW50IGk7CisKKyAgICBvdXRfbGUzMigmZG1hLT5jb250cm9sLCAoV0FLRXxGTFVTSHxQQVVTRXxSVU4pIDw8IDE2KTsKKworICAgIC8qCisgICAgICogWWVzIHRoaXMgbG9va3MgcGVjdWxpYXIsIGJ1dCBhcHBhcmVudGx5IGl0IG5lZWRzIHRvIGJlIHRoaXMKKyAgICAgKiB3YXkgb24gc29tZSBtYWNoaW5lcy4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAyMDA7IGkgPiAwOyAtLWkpCisJaWYgKGxkX2xlMzIoJmRtYS0+Y29udHJvbCkgJiBSVU4pCisJICAgIHVkZWxheSgxKTsKK30KKworc3RhdGljIHZvaWQgbWFjZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworICAgIHZvbGF0aWxlIHN0cnVjdCBtYWNlIF9faW9tZW0gKm1iID0gbXAtPm1hY2U7CisgICAgaW50IGk7CisKKyAgICAvKiBzb2Z0LXJlc2V0IHRoZSBjaGlwICovCisgICAgaSA9IDIwMDsKKyAgICB3aGlsZSAoLS1pKSB7CisJb3V0XzgoJm1iLT5iaXVjYywgU1dSU1QpOworCWlmIChpbl84KCZtYi0+Yml1Y2MpICYgU1dSU1QpIHsKKwkgICAgdWRlbGF5KDEwKTsKKwkgICAgY29udGludWU7CisJfQorCWJyZWFrOworICAgIH0KKyAgICBpZiAoIWkpIHsKKwlwcmludGsoS0VSTl9FUlIgIm1hY2U6IGNhbm5vdCByZXNldCBjaGlwIVxuIik7CisJcmV0dXJuOworICAgIH0KKworICAgIG91dF84KCZtYi0+aW1yLCAweGZmKTsJLyogZGlzYWJsZSBhbGwgaW50cnMgZm9yIG5vdyAqLworICAgIGkgPSBpbl84KCZtYi0+aXIpOworICAgIG91dF84KCZtYi0+bWFjY2MsIDApOwkvKiB0dXJuIG9mZiB0eCwgcnggKi8KKworICAgIG91dF84KCZtYi0+Yml1Y2MsIFhNVFNQXzY0KTsKKyAgICBvdXRfOCgmbWItPnV0ciwgUlRSRCk7CisgICAgb3V0XzgoJm1iLT5maWZvY2MsIFJDVkZXXzMyIHwgWE1URldfMTYgfCBYTVRGV1UgfCBSQ1ZGV1UgfCBYTVRCUlNUKTsKKyAgICBvdXRfOCgmbWItPnhtdGZjLCBBVVRPX1BBRF9YTUlUKTsgLyogYXV0by1wYWQgc2hvcnQgZnJhbWVzICovCisgICAgb3V0XzgoJm1iLT5yY3ZmYywgMCk7CisKKyAgICAvKiBsb2FkIHVwIHRoZSBoYXJkd2FyZSBhZGRyZXNzICovCisgICAgX19tYWNlX3NldF9hZGRyZXNzKGRldiwgZGV2LT5kZXZfYWRkcik7CisKKyAgICAvKiBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciAqLworICAgIGlmIChtcC0+Y2hpcGlkID09IEJST0tFTl9BRERSQ0hHX1JFVikKKwlvdXRfOCgmbWItPmlhYywgTE9HQUREUik7CisgICAgZWxzZSB7CisJb3V0XzgoJm1iLT5pYWMsIEFERFJDSEcgfCBMT0dBRERSKTsKKwl3aGlsZSAoKGluXzgoJm1iLT5pYWMpICYgQUREUkNIRykgIT0gMCkKKwkJOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorCW91dF84KCZtYi0+bGFkcmYsIDApOworCisgICAgLyogZG9uZSBjaGFuZ2luZyBhZGRyZXNzICovCisgICAgaWYgKG1wLT5jaGlwaWQgIT0gQlJPS0VOX0FERFJDSEdfUkVWKQorCW91dF84KCZtYi0+aWFjLCAwKTsKKworICAgIGlmIChtcC0+cG9ydF9hYXVpKQorICAgIAlvdXRfOCgmbWItPnBsc2NjLCBQT1JUU0VMX0FVSSArIEVOUExTSU8pOworICAgIGVsc2UKKyAgICAJb3V0XzgoJm1iLT5wbHNjYywgUE9SVFNFTF9HUFNJICsgRU5QTFNJTyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fbWFjZV9zZXRfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworICAgIHN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworICAgIHZvbGF0aWxlIHN0cnVjdCBtYWNlIF9faW9tZW0gKm1iID0gbXAtPm1hY2U7CisgICAgdW5zaWduZWQgY2hhciAqcCA9IGFkZHI7CisgICAgaW50IGk7CisKKyAgICAvKiBsb2FkIHVwIHRoZSBoYXJkd2FyZSBhZGRyZXNzICovCisgICAgaWYgKG1wLT5jaGlwaWQgPT0gQlJPS0VOX0FERFJDSEdfUkVWKQorICAgIAlvdXRfOCgmbWItPmlhYywgUEhZQUREUik7CisgICAgZWxzZSB7CisgICAgCW91dF84KCZtYi0+aWFjLCBBRERSQ0hHIHwgUEhZQUREUik7CisJd2hpbGUgKChpbl84KCZtYi0+aWFjKSAmIEFERFJDSEcpICE9IDApCisJICAgIDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDY7ICsraSkKKwlvdXRfOCgmbWItPnBhZHIsIGRldi0+ZGV2X2FkZHJbaV0gPSBwW2ldKTsKKyAgICBpZiAobXAtPmNoaXBpZCAhPSBCUk9LRU5fQUREUkNIR19SRVYpCisgICAgICAgIG91dF84KCZtYi0+aWFjLCAwKTsKK30KKworc3RhdGljIGludCBtYWNlX3NldF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisgICAgc3RydWN0IG1hY2VfZGF0YSAqbXAgPSAoc3RydWN0IG1hY2VfZGF0YSAqKSBkZXYtPnByaXY7CisgICAgdm9sYXRpbGUgc3RydWN0IG1hY2UgX19pb21lbSAqbWIgPSBtcC0+bWFjZTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CisKKyAgICBfX21hY2Vfc2V0X2FkZHJlc3MoZGV2LCBhZGRyKTsKKworICAgIC8qIG5vdGU6IHNldHRpbmcgQUREUkNIRyBjbGVhcnMgRU5SQ1YgKi8KKyAgICBvdXRfOCgmbWItPm1hY2NjLCBtcC0+bWFjY2MpOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1hY2VfY2xlYW5fcmluZ3Moc3RydWN0IG1hY2VfZGF0YSAqbXApCit7CisgICAgaW50IGk7CisKKyAgICAvKiBmcmVlIHNvbWUgc2tiJ3MgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTl9SWF9SSU5HOyArK2kpIHsKKwlpZiAobXAtPnJ4X2J1ZnNbaV0gIT0gMCkgeworCSAgICBkZXZfa2ZyZWVfc2tiKG1wLT5yeF9idWZzW2ldKTsKKwkgICAgbXAtPnJ4X2J1ZnNbaV0gPSBOVUxMOworCX0KKyAgICB9CisgICAgZm9yIChpID0gbXAtPnR4X2VtcHR5OyBpICE9IG1wLT50eF9maWxsOyApIHsKKwlkZXZfa2ZyZWVfc2tiKG1wLT50eF9idWZzW2ldKTsKKwlpZiAoKytpID49IE5fVFhfUklORykKKwkgICAgaSA9IDA7CisgICAgfQorfQorCitzdGF0aWMgaW50IG1hY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworICAgIHZvbGF0aWxlIHN0cnVjdCBtYWNlIF9faW9tZW0gKm1iID0gbXAtPm1hY2U7CisgICAgdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqcmQgPSBtcC0+cnhfZG1hOworICAgIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnRkID0gbXAtPnR4X2RtYTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcDsKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisKKyAgICAvKiByZXNldCB0aGUgY2hpcCAqLworICAgIG1hY2VfcmVzZXQoZGV2KTsKKworICAgIC8qIGluaXRpYWxpemUgbGlzdCBvZiBza19idWZmcyBmb3IgcmVjZWl2aW5nIGFuZCBzZXQgdXAgcmVjdiBkbWEgKi8KKyAgICBtYWNlX2NsZWFuX3JpbmdzKG1wKTsKKyAgICBtZW1zZXQoKGNoYXIgKiltcC0+cnhfY21kcywgMCwgTl9SWF9SSU5HICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpKTsKKyAgICBjcCA9IG1wLT5yeF9jbWRzOworICAgIGZvciAoaSA9IDA7IGkgPCBOX1JYX1JJTkcgLSAxOyArK2kpIHsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKFJYX0JVRkxFTiArIDIpOworCWlmIChza2IgPT0gMCkgeworCSAgICBkYXRhID0gZHVtbXlfYnVmOworCX0gZWxzZSB7CisJICAgIHNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIHNvIElQIGhlYWRlciBsYW5kcyBvbiA0LWJ5dGUgYmRyeSAqLworCSAgICBkYXRhID0gc2tiLT5kYXRhOworCX0KKwltcC0+cnhfYnVmc1tpXSA9IHNrYjsKKwlzdF9sZTE2KCZjcC0+cmVxX2NvdW50LCBSWF9CVUZMRU4pOworCXN0X2xlMTYoJmNwLT5jb21tYW5kLCBJTlBVVF9MQVNUICsgSU5UUl9BTFdBWVMpOworCXN0X2xlMzIoJmNwLT5waHlfYWRkciwgdmlydF90b19idXMoZGF0YSkpOworCWNwLT54ZmVyX3N0YXR1cyA9IDA7CisJKytjcDsKKyAgICB9CisgICAgbXAtPnJ4X2J1ZnNbaV0gPSBOVUxMOworICAgIHN0X2xlMTYoJmNwLT5jb21tYW5kLCBEQkRNQV9TVE9QKTsKKyAgICBtcC0+cnhfZmlsbCA9IGk7CisgICAgbXAtPnJ4X2VtcHR5ID0gMDsKKworICAgIC8qIFB1dCBhIGJyYW5jaCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlY2VpdmUgY29tbWFuZCBsaXN0ICovCisgICAgKytjcDsKKyAgICBzdF9sZTE2KCZjcC0+Y29tbWFuZCwgREJETUFfTk9QICsgQlJfQUxXQVlTKTsKKyAgICBzdF9sZTMyKCZjcC0+Y21kX2RlcCwgdmlydF90b19idXMobXAtPnJ4X2NtZHMpKTsKKworICAgIC8qIHN0YXJ0IHJ4IGRtYSAqLworICAgIG91dF9sZTMyKCZyZC0+Y29udHJvbCwgKFJVTnxQQVVTRXxGTFVTSHxXQUtFKSA8PCAxNik7IC8qIGNsZWFyIHJ1biBiaXQgKi8KKyAgICBvdXRfbGUzMigmcmQtPmNtZHB0ciwgdmlydF90b19idXMobXAtPnJ4X2NtZHMpKTsKKyAgICBvdXRfbGUzMigmcmQtPmNvbnRyb2wsIChSVU4gPDwgMTYpIHwgUlVOKTsKKworICAgIC8qIHB1dCBhIGJyYW5jaCBhdCB0aGUgZW5kIG9mIHRoZSB0eCBjb21tYW5kIGxpc3QgKi8KKyAgICBjcCA9IG1wLT50eF9jbWRzICsgTkNNRFNfVFggKiBOX1RYX1JJTkc7CisgICAgc3RfbGUxNigmY3AtPmNvbW1hbmQsIERCRE1BX05PUCArIEJSX0FMV0FZUyk7CisgICAgc3RfbGUzMigmY3AtPmNtZF9kZXAsIHZpcnRfdG9fYnVzKG1wLT50eF9jbWRzKSk7CisKKyAgICAvKiByZXNldCB0eCBkbWEgKi8KKyAgICBvdXRfbGUzMigmdGQtPmNvbnRyb2wsIChSVU58UEFVU0V8RkxVU0h8V0FLRSkgPDwgMTYpOworICAgIG91dF9sZTMyKCZ0ZC0+Y21kcHRyLCB2aXJ0X3RvX2J1cyhtcC0+dHhfY21kcykpOworICAgIG1wLT50eF9maWxsID0gMDsKKyAgICBtcC0+dHhfZW1wdHkgPSAwOworICAgIG1wLT50eF9mdWxsdXAgPSAwOworICAgIG1wLT50eF9hY3RpdmUgPSAwOworICAgIG1wLT50eF9iYWRfcnVudCA9IDA7CisKKyAgICAvKiB0dXJuIGl0IG9uISAqLworICAgIG91dF84KCZtYi0+bWFjY2MsIG1wLT5tYWNjYyk7CisgICAgLyogZW5hYmxlIGFsbCBpbnRlcnJ1cHRzIGV4Y2VwdCByZWNlaXZlIGludGVycnVwdHMgKi8KKyAgICBvdXRfOCgmbWItPmltciwgUkNWSU5UKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY2VfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgbWFjZSBfX2lvbWVtICptYiA9IG1wLT5tYWNlOworICAgIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnJkID0gbXAtPnJ4X2RtYTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICp0ZCA9IG1wLT50eF9kbWE7CisKKyAgICAvKiBkaXNhYmxlIHJ4IGFuZCB0eCAqLworICAgIG91dF84KCZtYi0+bWFjY2MsIDApOworICAgIG91dF84KCZtYi0+aW1yLCAweGZmKTsJCS8qIGRpc2FibGUgYWxsIGludHJzICovCisKKyAgICAvKiBkaXNhYmxlIHJ4IGFuZCB0eCBkbWEgKi8KKyAgICBzdF9sZTMyKCZyZC0+Y29udHJvbCwgKFJVTnxQQVVTRXxGTFVTSHxXQUtFKSA8PCAxNik7IC8qIGNsZWFyIHJ1biBiaXQgKi8KKyAgICBzdF9sZTMyKCZ0ZC0+Y29udHJvbCwgKFJVTnxQQVVTRXxGTFVTSHxXQUtFKSA8PCAxNik7IC8qIGNsZWFyIHJ1biBiaXQgKi8KKworICAgIG1hY2VfY2xlYW5fcmluZ3MobXApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWNlX3NldF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IG1hY2VfZGF0YSAqbXAgPSAoc3RydWN0IG1hY2VfZGF0YSAqKSBkZXYtPnByaXY7CisKKyAgICBpZiAobXAtPnRpbWVvdXRfYWN0aXZlKQorCWRlbF90aW1lcigmbXAtPnR4X3RpbWVvdXQpOworICAgIG1wLT50eF90aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgVFhfVElNRU9VVDsKKyAgICBtcC0+dHhfdGltZW91dC5mdW5jdGlvbiA9IG1hY2VfdHhfdGltZW91dDsKKyAgICBtcC0+dHhfdGltZW91dC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKyAgICBhZGRfdGltZXIoJm1wLT50eF90aW1lb3V0KTsKKyAgICBtcC0+dGltZW91dF9hY3RpdmUgPSAxOworfQorCitzdGF0aWMgaW50IG1hY2VfeG1pdF9zdGFydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworICAgIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnRkID0gbXAtPnR4X2RtYTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcCwgKm5wOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgaW50IGZpbGwsIG5leHQsIGxlbjsKKworICAgIC8qIHNlZSBpZiB0aGVyZSdzIGEgZnJlZSBzbG90IGluIHRoZSB0eCByaW5nICovCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CisgICAgZmlsbCA9IG1wLT50eF9maWxsOworICAgIG5leHQgPSBmaWxsICsgMTsKKyAgICBpZiAobmV4dCA+PSBOX1RYX1JJTkcpCisJbmV4dCA9IDA7CisgICAgaWYgKG5leHQgPT0gbXAtPnR4X2VtcHR5KSB7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCW1wLT50eF9mdWxsdXAgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDE7CQkvKiBjYW4ndCB0YWtlIGl0IGF0IHRoZSBtb21lbnQgKi8KKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKKworICAgIC8qIHBhcnRpYWxseSBmaWxsIGluIHRoZSBkbWEgY29tbWFuZCBibG9jayAqLworICAgIGxlbiA9IHNrYi0+bGVuOworICAgIGlmIChsZW4gPiBFVEhfRlJBTUVfTEVOKSB7CisJcHJpbnRrKEtFUk5fREVCVUcgIm1hY2U6IHhtaXQgZnJhbWUgdG9vIGxvbmcgKCVkKVxuIiwgbGVuKTsKKwlsZW4gPSBFVEhfRlJBTUVfTEVOOworICAgIH0KKyAgICBtcC0+dHhfYnVmc1tmaWxsXSA9IHNrYjsKKyAgICBjcCA9IG1wLT50eF9jbWRzICsgTkNNRFNfVFggKiBmaWxsOworICAgIHN0X2xlMTYoJmNwLT5yZXFfY291bnQsIGxlbik7CisgICAgc3RfbGUzMigmY3AtPnBoeV9hZGRyLCB2aXJ0X3RvX2J1cyhza2ItPmRhdGEpKTsKKworICAgIG5wID0gbXAtPnR4X2NtZHMgKyBOQ01EU19UWCAqIG5leHQ7CisgICAgb3V0X2xlMTYoJm5wLT5jb21tYW5kLCBEQkRNQV9TVE9QKTsKKworICAgIC8qIHBva2UgdGhlIHR4IGRtYSBjaGFubmVsICovCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CisgICAgbXAtPnR4X2ZpbGwgPSBuZXh0OworICAgIGlmICghbXAtPnR4X2JhZF9ydW50ICYmIG1wLT50eF9hY3RpdmUgPCBNQVhfVFhfQUNUSVZFKSB7CisJb3V0X2xlMTYoJmNwLT54ZmVyX3N0YXR1cywgMCk7CisJb3V0X2xlMTYoJmNwLT5jb21tYW5kLCBPVVRQVVRfTEFTVCk7CisJb3V0X2xlMzIoJnRkLT5jb250cm9sLCAoKFJVTnxXQUtFKSA8PCAxNikgKyAoUlVOfFdBS0UpKTsKKwkrK21wLT50eF9hY3RpdmU7CisJbWFjZV9zZXRfdGltZW91dChkZXYpOworICAgIH0KKyAgICBpZiAoKytuZXh0ID49IE5fVFhfUklORykKKwluZXh0ID0gMDsKKyAgICBpZiAobmV4dCA9PSBtcC0+dHhfZW1wdHkpCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptYWNlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IG1hY2VfZGF0YSAqcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKworICAgIHJldHVybiAmcC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIG1hY2Vfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworICAgIHZvbGF0aWxlIHN0cnVjdCBtYWNlIF9faW9tZW0gKm1iID0gbXAtPm1hY2U7CisgICAgaW50IGksIGo7CisgICAgdTMyIGNyYzsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CisgICAgbXAtPm1hY2NjICY9IH5QUk9NOworICAgIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwltcC0+bWFjY2MgfD0gUFJPTTsKKyAgICB9IGVsc2UgeworCXVuc2lnbmVkIGNoYXIgbXVsdGljYXN0X2ZpbHRlcls4XTsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCW11bHRpY2FzdF9maWx0ZXJbaV0gPSAweGZmOworCX0gZWxzZSB7CisJICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCW11bHRpY2FzdF9maWx0ZXJbaV0gPSAwOworCSAgICBmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrKSB7CisJICAgICAgICBjcmMgPSBldGhlcl9jcmNfbGUoNiwgZG1pLT5kbWlfYWRkcik7CisJCWogPSBjcmMgPj4gMjY7CS8qIGJpdCBudW1iZXIgaW4gbXVsdGljYXN0X2ZpbHRlciAqLworCQltdWx0aWNhc3RfZmlsdGVyW2ogPj4gM10gfD0gMSA8PCAoaiAmIDcpOworCQlkbWkgPSBkbWktPm5leHQ7CisJICAgIH0KKwl9CisjaWYgMAorCXByaW50aygiTXVsdGljYXN0IGZpbHRlciA6Iik7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkgICAgcHJpbnRrKCIlMDJ4ICIsIG11bHRpY2FzdF9maWx0ZXJbaV0pOworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCisJaWYgKG1wLT5jaGlwaWQgPT0gQlJPS0VOX0FERFJDSEdfUkVWKQorCSAgICBvdXRfOCgmbWItPmlhYywgTE9HQUREUik7CisJZWxzZSB7CisJICAgIG91dF84KCZtYi0+aWFjLCBBRERSQ0hHIHwgTE9HQUREUik7CisJICAgIHdoaWxlICgoaW5fOCgmbWItPmlhYykgJiBBRERSQ0hHKSAhPSAwKQorCQk7CisJfQorCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisJICAgIG91dF84KCZtYi0+bGFkcmYsIG11bHRpY2FzdF9maWx0ZXJbaV0pOworCWlmIChtcC0+Y2hpcGlkICE9IEJST0tFTl9BRERSQ0hHX1JFVikKKwkgICAgb3V0XzgoJm1iLT5pYWMsIDApOworICAgIH0KKyAgICAvKiByZXNldCBtYWNjYyAqLworICAgIG91dF84KCZtYi0+bWFjY2MsIG1wLT5tYWNjYyk7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbWFjZV9oYW5kbGVfbWlzY19pbnRycyhzdHJ1Y3QgbWFjZV9kYXRhICptcCwgaW50IGludHIpCit7CisgICAgdm9sYXRpbGUgc3RydWN0IG1hY2UgX19pb21lbSAqbWIgPSBtcC0+bWFjZTsKKyAgICBzdGF0aWMgaW50IG1hY2VfYmFiYmxlcywgbWFjZV9qYWJiZXJzOworCisgICAgaWYgKGludHIgJiBNUENPKQorCW1wLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IDI1NjsKKyAgICBtcC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpbl84KCZtYi0+bXBjKTsgICAvKiByZWFkaW5nIGNsZWFycyBpdCAqLworICAgIGlmIChpbnRyICYgUk5UUENPKQorCW1wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9IDI1NjsKKyAgICBtcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyArPSBpbl84KCZtYi0+cm50cGMpOyAvKiByZWFkaW5nIGNsZWFycyBpdCAqLworICAgIGlmIChpbnRyICYgQ0VSUikKKwkrK21wLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzOworICAgIGlmIChpbnRyICYgQkFCQkxFKQorCWlmIChtYWNlX2JhYmJsZXMrKyA8IDQpCisJICAgIHByaW50ayhLRVJOX0RFQlVHICJtYWNlOiBiYWJibGluZyB0cmFuc21pdHRlclxuIik7CisgICAgaWYgKGludHIgJiBKQUJCRVIpCisJaWYgKG1hY2VfamFiYmVycysrIDwgNCkKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIm1hY2U6IGphYmJlcmluZyB0cmFuc2NlaXZlclxuIik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYWNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworICAgIHN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworICAgIHZvbGF0aWxlIHN0cnVjdCBtYWNlIF9faW9tZW0gKm1iID0gbXAtPm1hY2U7CisgICAgdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqdGQgPSBtcC0+dHhfZG1hOworICAgIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmNwOworICAgIGludCBpbnRyLCBmcywgaSwgc3RhdCwgeDsKKyAgICBpbnQgeGNvdW50LCBkc3RhdDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIC8qIHN0YXRpYyBpbnQgbWFjZV9sYXN0X2ZzLCBtYWNlX2xhc3RfeGNvdW50OyAqLworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CisgICAgaW50ciA9IGluXzgoJm1iLT5pcik7CQkvKiByZWFkIGludGVycnVwdCByZWdpc3RlciAqLworICAgIGluXzgoJm1iLT54bXRyYyk7CQkJLyogZ2V0IHJldHJpZXMgKi8KKyAgICBtYWNlX2hhbmRsZV9taXNjX2ludHJzKG1wLCBpbnRyKTsKKworICAgIGkgPSBtcC0+dHhfZW1wdHk7CisgICAgd2hpbGUgKGluXzgoJm1iLT5wcikgJiBYTVRTVikgeworCWRlbF90aW1lcigmbXAtPnR4X3RpbWVvdXQpOworCW1wLT50aW1lb3V0X2FjdGl2ZSA9IDA7CisJLyoKKwkgKiBDbGVhciBhbnkgaW50ZXJydXB0IGluZGljYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RhdHVzCisJICogd29yZC4gIFRoaXMgYXBwZWFycyB0byB1bmxhdGNoIGFueSBlcnJvciBpbmRpY2F0aW9uIGZyb20KKwkgKiB0aGUgRE1BIGNvbnRyb2xsZXIuCisJICovCisJaW50ciA9IGluXzgoJm1iLT5pcik7CisJaWYgKGludHIgIT0gMCkKKwkgICAgbWFjZV9oYW5kbGVfbWlzY19pbnRycyhtcCwgaW50cik7CisJaWYgKG1wLT50eF9iYWRfcnVudCkgeworCSAgICBmcyA9IGluXzgoJm1iLT54bXRmcyk7CisJICAgIG1wLT50eF9iYWRfcnVudCA9IDA7CisJICAgIG91dF84KCZtYi0+eG10ZmMsIEFVVE9fUEFEX1hNSVQpOworCSAgICBjb250aW51ZTsKKwl9CisJZHN0YXQgPSBsZF9sZTMyKCZ0ZC0+c3RhdHVzKTsKKwkvKiBzdG9wIERNQSBjb250cm9sbGVyICovCisJb3V0X2xlMzIoJnRkLT5jb250cm9sLCBSVU4gPDwgMTYpOworCS8qCisJICogeGNvdW50IGlzIHRoZSBudW1iZXIgb2YgY29tcGxldGUgZnJhbWVzIHdoaWNoIGhhdmUgYmVlbgorCSAqIHdyaXR0ZW4gdG8gdGhlIGZpZm8gYnV0IGZvciB3aGljaCBzdGF0dXMgaGFzIG5vdCBiZWVuIHJlYWQuCisJICovCisJeGNvdW50ID0gKGluXzgoJm1iLT5maWZvZmMpID4+IFhNVEZDX1NIKSAmIFhNVEZDX01BU0s7CisJaWYgKHhjb3VudCA9PSAwIHx8IChkc3RhdCAmIERFQUQpKSB7CisJICAgIC8qCisJICAgICAqIElmIGEgcGFja2V0IHdhcyBhYm9ydGVkIGJlZm9yZSB0aGUgRE1BIGNvbnRyb2xsZXIgaGFzCisJICAgICAqIGZpbmlzaGVkIHRyYW5zZmVycmluZyBpdCwgaXQgc2VlbXMgdGhhdCB0aGVyZSBhcmUgMiBieXRlcworCSAgICAgKiB3aGljaCBhcmUgc3R1Y2sgaW4gc29tZSBidWZmZXIgc29tZXdoZXJlLiAgVGhlc2Ugd2lsbCBnZXQKKwkgICAgICogdHJhbnNtaXR0ZWQgYXMgc29vbiBhcyB3ZSByZWFkIHRoZSBmcmFtZSBzdGF0dXMgKHdoaWNoCisJICAgICAqIHJlZW5hYmxlcyB0aGUgdHJhbnNtaXQgZGF0YSB0cmFuc2ZlciByZXF1ZXN0KS4gIFR1cm5pbmcKKwkgICAgICogb2ZmIHRoZSBETUEgY29udHJvbGxlciBhbmQvb3IgcmVzZXR0aW5nIHRoZSBNQUNFIGRvZXNuJ3QKKwkgICAgICogaGVscC4gIFNvIHdlIGRpc2FibGUgYXV0by1wYWRkaW5nIGFuZCBGQ1MgdHJhbnNtaXNzaW9uCisJICAgICAqIHNvIHRoZSB0d28gYnl0ZXMgd2lsbCBvbmx5IGJlIGEgcnVudCBwYWNrZXQgd2hpY2ggc2hvdWxkCisJICAgICAqIGJlIGlnbm9yZWQgYnkgb3RoZXIgc3RhdGlvbnMuCisJICAgICAqLworCSAgICBvdXRfOCgmbWItPnhtdGZjLCBEWE1URkNTKTsKKwl9CisJZnMgPSBpbl84KCZtYi0+eG10ZnMpOworCWlmICgoZnMgJiBYTVRTVikgPT0gMCkgeworCSAgICBwcmludGsoS0VSTl9FUlIgIm1hY2U6IHhtdGZzIG5vdCB2YWxpZCEgKGZzPSV4IHhjPSVkIGRzPSV4KVxuIiwKKwkJICAgZnMsIHhjb3VudCwgZHN0YXQpOworCSAgICBtYWNlX3Jlc2V0KGRldik7CisJCS8qCisJCSAqIFhYWCBtYWNlIGxpa2VzIHRvIGhhbmcgdGhlIG1hY2hpbmUgYWZ0ZXIgYSB4bXRmcyBlcnJvci4KKwkJICogVGhpcyBpcyBoYXJkIHRvIHJlcHJvZHVjZSwgcmVzZXRpbmcgKm1heSogaGVscAorCQkgKi8KKwl9CisJY3AgPSBtcC0+dHhfY21kcyArIE5DTURTX1RYICogaTsKKwlzdGF0ID0gbGRfbGUxNigmY3AtPnhmZXJfc3RhdHVzKTsKKwlpZiAoKGZzICYgKFVGTE98TENPTHxMQ0FSfFJUUlkpKSB8fCAoZHN0YXQgJiBERUFEKSB8fCB4Y291bnQgPT0gMCkgeworCSAgICAvKgorCSAgICAgKiBDaGVjayB3aGV0aGVyIHRoZXJlIHdlcmUgaW4gZmFjdCAyIGJ5dGVzIHdyaXR0ZW4gdG8KKwkgICAgICogdGhlIHRyYW5zbWl0IEZJRk8uCisJICAgICAqLworCSAgICB1ZGVsYXkoMSk7CisJICAgIHggPSAoaW5fOCgmbWItPmZpZm9mYykgPj4gWE1URkNfU0gpICYgWE1URkNfTUFTSzsKKwkgICAgaWYgKHggIT0gMCkgeworCQkvKiB0aGVyZSB3ZXJlIHR3byBieXRlcyB3aXRoIGFuIGVuZC1vZi1wYWNrZXQgaW5kaWNhdGlvbiAqLworCQltcC0+dHhfYmFkX3J1bnQgPSAxOworCQltYWNlX3NldF90aW1lb3V0KGRldik7CisJICAgIH0gZWxzZSB7CisJCS8qCisJCSAqIEVpdGhlciB0aGVyZSB3ZXJlbid0IHRoZSB0d28gYnl0ZXMgYnVmZmVyZWQgdXAsIG9yIHRoZXkKKwkJICogZGlkbid0IGhhdmUgYW4gZW5kLW9mLXBhY2tldCBpbmRpY2F0aW9uLgorCQkgKiBXZSBmbHVzaCB0aGUgdHJhbnNtaXQgRklGTyBqdXN0IGluIGNhc2UgKGJ5IHNldHRpbmcgdGhlCisJCSAqIFhNVEZXVSBiaXQgd2l0aCB0aGUgdHJhbnNtaXR0ZXIgZGlzYWJsZWQpLgorCQkgKi8KKwkJb3V0XzgoJm1iLT5tYWNjYywgaW5fOCgmbWItPm1hY2NjKSAmIH5FTlhNVCk7CisJCW91dF84KCZtYi0+Zmlmb2NjLCBpbl84KCZtYi0+Zmlmb2NjKSB8IFhNVEZXVSk7CisJCXVkZWxheSgxKTsKKwkJb3V0XzgoJm1iLT5tYWNjYywgaW5fOCgmbWItPm1hY2NjKSB8IEVOWE1UKTsKKwkJb3V0XzgoJm1iLT54bXRmYywgQVVUT19QQURfWE1JVCk7CisJICAgIH0KKwl9CisJLyogZG1hIHNob3VsZCBoYXZlIGZpbmlzaGVkICovCisJaWYgKGkgPT0gbXAtPnR4X2ZpbGwpIHsKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIm1hY2U6IHR4IHJpbmcgcmFuIG91dD8gKGZzPSV4IHhjPSVkIGRzPSV4KVxuIiwKKwkJICAgZnMsIHhjb3VudCwgZHN0YXQpOworCSAgICBjb250aW51ZTsKKwl9CisJLyogVXBkYXRlIHN0YXRzICovCisJaWYgKGZzICYgKFVGTE98TENPTHxMQ0FSfFJUUlkpKSB7CisJICAgICsrbXAtPnN0YXRzLnR4X2Vycm9yczsKKwkgICAgaWYgKGZzICYgTENBUikKKwkJKyttcC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnM7CisJICAgIGlmIChmcyAmIChVRkxPfExDT0x8UlRSWSkpCisJCSsrbXAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzOworCX0gZWxzZSB7CisJICAgIG1wLT5zdGF0cy50eF9ieXRlcyArPSBtcC0+dHhfYnVmc1tpXS0+bGVuOworCSAgICArK21wLT5zdGF0cy50eF9wYWNrZXRzOworCX0KKwlkZXZfa2ZyZWVfc2tiX2lycShtcC0+dHhfYnVmc1tpXSk7CisJLS1tcC0+dHhfYWN0aXZlOworCWlmICgrK2kgPj0gTl9UWF9SSU5HKQorCSAgICBpID0gMDsKKyNpZiAwCisJbWFjZV9sYXN0X2ZzID0gZnM7CisJbWFjZV9sYXN0X3hjb3VudCA9IHhjb3VudDsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChpICE9IG1wLT50eF9lbXB0eSkgeworCW1wLT50eF9mdWxsdXAgPSAwOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICB9CisgICAgbXAtPnR4X2VtcHR5ID0gaTsKKyAgICBpICs9IG1wLT50eF9hY3RpdmU7CisgICAgaWYgKGkgPj0gTl9UWF9SSU5HKQorCWkgLT0gTl9UWF9SSU5HOworICAgIGlmICghbXAtPnR4X2JhZF9ydW50ICYmIGkgIT0gbXAtPnR4X2ZpbGwgJiYgbXAtPnR4X2FjdGl2ZSA8IE1BWF9UWF9BQ1RJVkUpIHsKKwlkbyB7CisJICAgIC8qIHNldCB1cCB0aGUgbmV4dCBvbmUgKi8KKwkgICAgY3AgPSBtcC0+dHhfY21kcyArIE5DTURTX1RYICogaTsKKwkgICAgb3V0X2xlMTYoJmNwLT54ZmVyX3N0YXR1cywgMCk7CisJICAgIG91dF9sZTE2KCZjcC0+Y29tbWFuZCwgT1VUUFVUX0xBU1QpOworCSAgICArK21wLT50eF9hY3RpdmU7CisJICAgIGlmICgrK2kgPj0gTl9UWF9SSU5HKQorCQlpID0gMDsKKwl9IHdoaWxlIChpICE9IG1wLT50eF9maWxsICYmIG1wLT50eF9hY3RpdmUgPCBNQVhfVFhfQUNUSVZFKTsKKwlvdXRfbGUzMigmdGQtPmNvbnRyb2wsICgoUlVOfFdBS0UpIDw8IDE2KSArIChSVU58V0FLRSkpOworCW1hY2Vfc2V0X3RpbWVvdXQoZGV2KTsKKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG1hY2VfdHhfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworICAgIHN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworICAgIHZvbGF0aWxlIHN0cnVjdCBtYWNlIF9faW9tZW0gKm1iID0gbXAtPm1hY2U7CisgICAgdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqdGQgPSBtcC0+dHhfZG1hOworICAgIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnJkID0gbXAtPnJ4X2RtYTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCBpOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CisgICAgbXAtPnRpbWVvdXRfYWN0aXZlID0gMDsKKyAgICBpZiAobXAtPnR4X2FjdGl2ZSA9PSAwICYmICFtcC0+dHhfYmFkX3J1bnQpCisJZ290byBvdXQ7CisKKyAgICAvKiB1cGRhdGUgdmFyaW91cyBjb3VudGVycyAqLworICAgIG1hY2VfaGFuZGxlX21pc2NfaW50cnMobXAsIGluXzgoJm1iLT5pcikpOworCisgICAgY3AgPSBtcC0+dHhfY21kcyArIE5DTURTX1RYICogbXAtPnR4X2VtcHR5OworCisgICAgLyogdHVybiBvZmYgYm90aCB0eCBhbmQgcnggYW5kIHJlc2V0IHRoZSBjaGlwICovCisgICAgb3V0XzgoJm1iLT5tYWNjYywgMCk7CisgICAgcHJpbnRrKEtFUk5fRVJSICJtYWNlOiB0cmFuc21pdCB0aW1lb3V0IC0gcmVzZXR0aW5nXG4iKTsKKyAgICBkYmRtYV9yZXNldCh0ZCk7CisgICAgbWFjZV9yZXNldChkZXYpOworCisgICAgLyogcmVzdGFydCByeCBkbWEgKi8KKyAgICBjcCA9IGJ1c190b192aXJ0KGxkX2xlMzIoJnJkLT5jbWRwdHIpKTsKKyAgICBkYmRtYV9yZXNldChyZCk7CisgICAgb3V0X2xlMTYoJmNwLT54ZmVyX3N0YXR1cywgMCk7CisgICAgb3V0X2xlMzIoJnJkLT5jbWRwdHIsIHZpcnRfdG9fYnVzKGNwKSk7CisgICAgb3V0X2xlMzIoJnJkLT5jb250cm9sLCAoUlVOIDw8IDE2KSB8IFJVTik7CisKKyAgICAvKiBmaXggdXAgdGhlIHRyYW5zbWl0IHNpZGUgKi8KKyAgICBpID0gbXAtPnR4X2VtcHR5OworICAgIG1wLT50eF9hY3RpdmUgPSAwOworICAgICsrbXAtPnN0YXRzLnR4X2Vycm9yczsKKyAgICBpZiAobXAtPnR4X2JhZF9ydW50KSB7CisJbXAtPnR4X2JhZF9ydW50ID0gMDsKKyAgICB9IGVsc2UgaWYgKGkgIT0gbXAtPnR4X2ZpbGwpIHsKKwlkZXZfa2ZyZWVfc2tiKG1wLT50eF9idWZzW2ldKTsKKwlpZiAoKytpID49IE5fVFhfUklORykKKwkgICAgaSA9IDA7CisJbXAtPnR4X2VtcHR5ID0gaTsKKyAgICB9CisgICAgbXAtPnR4X2Z1bGx1cCA9IDA7CisgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworICAgIGlmIChpICE9IG1wLT50eF9maWxsKSB7CisJY3AgPSBtcC0+dHhfY21kcyArIE5DTURTX1RYICogaTsKKwlvdXRfbGUxNigmY3AtPnhmZXJfc3RhdHVzLCAwKTsKKwlvdXRfbGUxNigmY3AtPmNvbW1hbmQsIE9VVFBVVF9MQVNUKTsKKwlvdXRfbGUzMigmdGQtPmNtZHB0ciwgdmlydF90b19idXMoY3ApKTsKKwlvdXRfbGUzMigmdGQtPmNvbnRyb2wsIChSVU4gPDwgMTYpIHwgUlVOKTsKKwkrK21wLT50eF9hY3RpdmU7CisJbWFjZV9zZXRfdGltZW91dChkZXYpOworICAgIH0KKworICAgIC8qIHR1cm4gaXQgYmFjayBvbiAqLworICAgIG91dF84KCZtYi0+aW1yLCBSQ1ZJTlQpOworICAgIG91dF84KCZtYi0+bWFjY2MsIG1wLT5tYWNjYyk7CisKK291dDoKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFjZV90eGRtYV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFjZV9yeGRtYV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisgICAgc3RydWN0IG1hY2VfZGF0YSAqbXAgPSAoc3RydWN0IG1hY2VfZGF0YSAqKSBkZXYtPnByaXY7CisgICAgdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqcmQgPSBtcC0+cnhfZG1hOworICAgIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmNwLCAqbnA7CisgICAgaW50IGksIG5iLCBzdGF0LCBuZXh0OworICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgdW5zaWduZWQgZnJhbWVfc3RhdHVzOworICAgIHN0YXRpYyBpbnQgbWFjZV9sb3N0X3N0YXR1czsKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPmxvY2ssIGZsYWdzKTsKKyAgICBmb3IgKGkgPSBtcC0+cnhfZW1wdHk7IGkgIT0gbXAtPnJ4X2ZpbGw7ICkgeworCWNwID0gbXAtPnJ4X2NtZHMgKyBpOworCXN0YXQgPSBsZF9sZTE2KCZjcC0+eGZlcl9zdGF0dXMpOworCWlmICgoc3RhdCAmIEFDVElWRSkgPT0gMCkgeworCSAgICBuZXh0ID0gaSArIDE7CisJICAgIGlmIChuZXh0ID49IE5fUlhfUklORykKKwkJbmV4dCA9IDA7CisJICAgIG5wID0gbXAtPnJ4X2NtZHMgKyBuZXh0OworCSAgICBpZiAobmV4dCAhPSBtcC0+cnhfZmlsbAorCQkmJiAobGRfbGUxNigmbnAtPnhmZXJfc3RhdHVzKSAmIEFDVElWRSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAibWFjZTogbG9zdCBhIHN0YXR1cyB3b3JkXG4iKTsKKwkJKyttYWNlX2xvc3Rfc3RhdHVzOworCSAgICB9IGVsc2UKKwkJYnJlYWs7CisJfQorCW5iID0gbGRfbGUxNigmY3AtPnJlcV9jb3VudCkgLSBsZF9sZTE2KCZjcC0+cmVzX2NvdW50KTsKKwlvdXRfbGUxNigmY3AtPmNvbW1hbmQsIERCRE1BX1NUT1ApOworCS8qIGdvdCBhIHBhY2tldCwgaGF2ZSBhIGxvb2sgYXQgaXQgKi8KKwlza2IgPSBtcC0+cnhfYnVmc1tpXTsKKwlpZiAoc2tiID09IDApIHsKKwkgICAgKyttcC0+c3RhdHMucnhfZHJvcHBlZDsKKwl9IGVsc2UgaWYgKG5iID4gOCkgeworCSAgICBkYXRhID0gc2tiLT5kYXRhOworCSAgICBmcmFtZV9zdGF0dXMgPSAoZGF0YVtuYi0zXSA8PCA4KSArIGRhdGFbbmItNF07CisJICAgIGlmIChmcmFtZV9zdGF0dXMgJiAoUlNfT0ZMT3xSU19DTFNOfFJTX0ZSQU1FUlJ8UlNfRkNTRVJSKSkgeworCQkrK21wLT5zdGF0cy5yeF9lcnJvcnM7CisJCWlmIChmcmFtZV9zdGF0dXMgJiBSU19PRkxPKQorCQkgICAgKyttcC0+c3RhdHMucnhfb3Zlcl9lcnJvcnM7CisJCWlmIChmcmFtZV9zdGF0dXMgJiBSU19GUkFNRVJSKQorCQkgICAgKyttcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzOworCQlpZiAoZnJhbWVfc3RhdHVzICYgUlNfRkNTRVJSKQorCQkgICAgKyttcC0+c3RhdHMucnhfY3JjX2Vycm9yczsKKwkgICAgfSBlbHNlIHsKKwkJLyogTWFjZSBmZWF0dXJlIEFVVE9fU1RSSVBfUkNWIGlzIG9uIGJ5IGRlZmF1bHQsIGRyb3BwaW5nIHRoZQorCQkgKiBGQ1Mgb24gZnJhbWVzIHdpdGggODAyLjMgaGVhZGVycy4gVGhpcyBtZWFucyB0aGF0IEV0aGVybmV0CisJCSAqIGZyYW1lcyBoYXZlIDggZXh0cmEgb2N0ZXRzIGF0IHRoZSBlbmQsIHdoaWxlIDgwMi4zIGZyYW1lcworCQkgKiBoYXZlIG9ubHkgNC4gV2UgbmVlZCB0byBjb3JyZWN0bHkgYWNjb3VudCBmb3IgdGhpcy4gKi8KKwkJaWYgKCoodW5zaWduZWQgc2hvcnQgKikoZGF0YSsxMikgPCAxNTM2KSAvKiA4MDIuMyBoZWFkZXIgKi8KKwkJICAgIG5iIC09IDQ7CisJCWVsc2UJLyogRXRoZXJuZXQgaGVhZGVyOyBtYWNlIGluY2x1ZGVzIEZDUyAqLworCQkgICAgbmIgLT0gODsKKwkJc2tiX3B1dChza2IsIG5iKTsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCW1wLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbmV0aWZfcngoc2tiKTsKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJbXAtPnJ4X2J1ZnNbaV0gPSBOVUxMOworCQkrK21wLT5zdGF0cy5yeF9wYWNrZXRzOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgKyttcC0+c3RhdHMucnhfZXJyb3JzOworCSAgICArK21wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzOworCX0KKworCS8qIGFkdmFuY2UgdG8gbmV4dCAqLworCWlmICgrK2kgPj0gTl9SWF9SSU5HKQorCSAgICBpID0gMDsKKyAgICB9CisgICAgbXAtPnJ4X2VtcHR5ID0gaTsKKworICAgIGkgPSBtcC0+cnhfZmlsbDsKKyAgICBmb3IgKDs7KSB7CisJbmV4dCA9IGkgKyAxOworCWlmIChuZXh0ID49IE5fUlhfUklORykKKwkgICAgbmV4dCA9IDA7CisJaWYgKG5leHQgPT0gbXAtPnJ4X2VtcHR5KQorCSAgICBicmVhazsKKwljcCA9IG1wLT5yeF9jbWRzICsgaTsKKwlza2IgPSBtcC0+cnhfYnVmc1tpXTsKKwlpZiAoc2tiID09IDApIHsKKwkgICAgc2tiID0gZGV2X2FsbG9jX3NrYihSWF9CVUZMRU4gKyAyKTsKKwkgICAgaWYgKHNrYiAhPSAwKSB7CisJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCW1wLT5yeF9idWZzW2ldID0gc2tiOworCSAgICB9CisJfQorCXN0X2xlMTYoJmNwLT5yZXFfY291bnQsIFJYX0JVRkxFTik7CisJZGF0YSA9IHNrYj8gc2tiLT5kYXRhOiBkdW1teV9idWY7CisJc3RfbGUzMigmY3AtPnBoeV9hZGRyLCB2aXJ0X3RvX2J1cyhkYXRhKSk7CisJb3V0X2xlMTYoJmNwLT54ZmVyX3N0YXR1cywgMCk7CisJb3V0X2xlMTYoJmNwLT5jb21tYW5kLCBJTlBVVF9MQVNUICsgSU5UUl9BTFdBWVMpOworI2lmIDAKKwlpZiAoKGxkX2xlMzIoJnJkLT5zdGF0dXMpICYgQUNUSVZFKSAhPSAwKSB7CisJICAgIG91dF9sZTMyKCZyZC0+Y29udHJvbCwgKFBBVVNFIDw8IDE2KSB8IFBBVVNFKTsKKwkgICAgd2hpbGUgKChpbl9sZTMyKCZyZC0+c3RhdHVzKSAmIEFDVElWRSkgIT0gMCkKKwkJOworCX0KKyNlbmRpZgorCWkgPSBuZXh0OworICAgIH0KKyAgICBpZiAoaSAhPSBtcC0+cnhfZmlsbCkgeworCW91dF9sZTMyKCZyZC0+Y29udHJvbCwgKChSVU58V0FLRSkgPDwgMTYpIHwgKFJVTnxXQUtFKSk7CisJbXAtPnJ4X2ZpbGwgPSBpOworICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBtYWNlX21hdGNoW10gPSAKK3sKKwl7CisJLm5hbWUgCQk9ICJtYWNlIiwKKwkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCisJLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKKwl9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBtYWNpb19kcml2ZXIgbWFjZV9kcml2ZXIgPSAKK3sKKwkubmFtZSAJCT0gIm1hY2UiLAorCS5tYXRjaF90YWJsZQk9IG1hY2VfbWF0Y2gsCisJLnByb2JlCQk9IG1hY2VfcHJvYmUsCisJLnJlbW92ZQkJPSBtYWNlX3JlbW92ZSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgbWFjZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG1hY2lvX3JlZ2lzdGVyX2RyaXZlcigmbWFjZV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWFjZV9jbGVhbnVwKHZvaWQpCit7CisJbWFjaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJm1hY2VfZHJpdmVyKTsKKworCWlmIChkdW1teV9idWYpIHsKKwkJa2ZyZWUoZHVtbXlfYnVmKTsKKwkJZHVtbXlfYnVmID0gTlVMTDsKKwl9Cit9CisKK01PRFVMRV9BVVRIT1IoIlBhdWwgTWFja2VycmFzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBvd2VyTWFjIE1BQ0UgZHJpdmVyLiIpOworTU9EVUxFX1BBUk0ocG9ydF9hYXVpLCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhwb3J0X2FhdWksICJNQUNFIHVzZXMgQUFVSSBwb3J0ICgwLTEpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KG1hY2VfaW5pdCk7Cittb2R1bGVfZXhpdChtYWNlX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjZS5oIGIvZHJpdmVycy9uZXQvbWFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYjdlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9tYWNlLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBtYWNlLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlZ2lzdGVycyBpbiB0aGUgQW03OUM5NDAgTUFDRQorICogKE1lZGl1bSBBY2Nlc3MgQ29udHJvbCBmb3IgRXRoZXJuZXQpIGNvbnRyb2xsZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2RlZmluZSBSRUcoeCkJdm9sYXRpbGUgdW5zaWduZWQgY2hhciB4OyBjaGFyIHggIyMgX3BhZFsxNV0KKworc3RydWN0IG1hY2UgeworCVJFRyhyY3ZmaWZvKTsJCS8qIHJlY2VpdmUgRklGTyAqLworCVJFRyh4bXRmaWZvKTsJCS8qIHRyYW5zbWl0IEZJRk8gKi8KKwlSRUcoeG10ZmMpOwkJLyogdHJhbnNtaXQgZnJhbWUgY29udHJvbCAqLworCVJFRyh4bXRmcyk7CQkvKiB0cmFuc21pdCBmcmFtZSBzdGF0dXMgKi8KKwlSRUcoeG10cmMpOwkJLyogdHJhbnNtaXQgcmV0cnkgY291bnQgKi8KKwlSRUcocmN2ZmMpOwkJLyogcmVjZWl2ZSBmcmFtZSBjb250cm9sICovCisJUkVHKHJjdmZzKTsJCS8qIHJlY2VpdmUgZnJhbWUgc3RhdHVzICg0IGJ5dGVzKSAqLworCVJFRyhmaWZvZmMpOwkJLyogRklGTyBmcmFtZSBjb3VudCAqLworCVJFRyhpcik7CQkvKiBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKwlSRUcoaW1yKTsJCS8qIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisJUkVHKHByKTsJCS8qIHBvbGwgcmVnaXN0ZXIgKi8KKwlSRUcoYml1Y2MpOwkJLyogYnVzIGludGVyZmFjZSB1bml0IGNvbmZpZyBjb250cm9sICovCisJUkVHKGZpZm9jYyk7CQkvKiBGSUZPIGNvbmZpZ3VyYXRpb24gY29udHJvbCAqLworCVJFRyhtYWNjYyk7CQkvKiBtZWRpdW0gYWNjZXNzIGNvbnRyb2wgY29uZmlnIGNvbnRyb2wgKi8KKwlSRUcocGxzY2MpOwkJLyogcGh5cyBsYXllciBzaWduYWxsaW5nIGNvbmZpZyBjb250cm9sICovCisJUkVHKHBoeWNjKTsJCS8qIHBoeXNpY2FsIGNvbmZpZ3VyYXRpb24gY29udHJvbCAqLworCVJFRyhjaGlwaWRfbG8pOwkJLyogY2hpcCBJRCwgbHNiICovCisJUkVHKGNoaXBpZF9oaSk7CQkvKiBjaGlwIElELCBtc2IgKi8KKwlSRUcoaWFjKTsJCS8qIGludGVybmFsIGFkZHJlc3MgY29uZmlnICovCisJUkVHKHJlZzE5KTsKKwlSRUcobGFkcmYpOwkJLyogbG9naWNhbCBhZGRyZXNzIGZpbHRlciAoOCBieXRlcykgKi8KKwlSRUcocGFkcik7CQkvKiBwaHlzaWNhbCBhZGRyZXNzICg2IGJ5dGVzKSAqLworCVJFRyhyZWcyMik7CisJUkVHKHJlZzIzKTsKKwlSRUcobXBjKTsJCS8qIG1pc3NlZCBwYWNrZXQgY291bnQgKGNsZWFycyB3aGVuIHJlYWQpICovCisJUkVHKHJlZzI1KTsKKwlSRUcocm50cGMpOwkJLyogcnVudCBwYWNrZXQgY291bnQgKGNsZWFycyB3aGVuIHJlYWQpICovCisJUkVHKHJjdmNjKTsJCS8qIHJlY3YgY29sbGlzaW9uIGNvdW50IChjbGVhcnMgd2hlbiByZWFkKSAqLworCVJFRyhyZWcyOCk7CisJUkVHKHV0cik7CQkvKiB1c2VyIHRlc3QgcmVnICovCisJUkVHKHJlZzMwKTsKKwlSRUcocmVnMzEpOworfTsKKworLyogQml0cyBpbiBYTVRGQyAqLworI2RlZmluZSBEUlRSWQkJMHg4MAkvKiBkb24ndCByZXRyeSB0cmFuc21pc3Npb24gYWZ0ZXIgY29sbGlzaW9uICovCisjZGVmaW5lIERYTVRGQ1MJCTB4MDgJLyogZG9uJ3QgYXBwZW5kIEZDUyB0byB0cmFuc21pdHRlZCBmcmFtZSAqLworI2RlZmluZSBBVVRPX1BBRF9YTUlUCTB4MDEJLyogYXV0by1wYWQgc2hvcnQgcGFja2V0cyBvbiB0cmFuc21pc3Npb24gKi8KKworLyogQml0cyBpbiBYTVRGUzogb25seSB2YWxpZCB3aGVuIFhNVFNWIGlzIHNldCBpbiBQUiBhbmQgWE1URlMgKi8KKyNkZWZpbmUgWE1UU1YJCTB4ODAJLyogdHJhbnNtaXQgc3RhdHVzIChpLmUuIFhNVEZTKSB2YWxpZCAqLworI2RlZmluZSBVRkxPCQkweDQwCS8qIHVuZGVyZmxvdyAtIHhtaXQgZmlmbyByYW4gZHJ5ICovCisjZGVmaW5lIExDT0wJCTB4MjAJLyogbGF0ZSBjb2xsaXNpb24gKHRyYW5zbWlzc2lvbiBhYm9ydGVkKSAqLworI2RlZmluZSBNT1JFCQkweDEwCS8qIDIgb3IgbW9yZSByZXRyaWVzIG5lZWRlZCB0byB4bWl0IGZyYW1lICovCisjZGVmaW5lIE9ORQkJMHgwOAkvKiAxIHJldHJ5IG5lZWRlZCB0byB4bWl0IGZyYW1lICovCisjZGVmaW5lIERFRkVSCQkweDA0CS8qIE1BQ0UgaGFkIHRvIGRlZmVyIHhtaXNzaW9uIChlbmV0IGJ1c3kpICovCisjZGVmaW5lIExDQVIJCTB4MDIJLyogbG9zcyBvZiBjYXJyaWVyICh0cmFuc21pc3Npb24gYWJvcnRlZCkgKi8KKyNkZWZpbmUgUlRSWQkJMHgwMQkvKiB0b28gbWFueSByZXRyaWVzICh0cmFuc21pc3Npb24gYWJvcnRlZCkgKi8KKworLyogQml0cyBpbiBYTVRSQzogb25seSB2YWxpZCB3aGVuIFhNVFNWIGlzIHNldCBpbiBQUiAoYW5kIFhNVEZTKSAqLworI2RlZmluZSBFWERFRgkJMHg4MAkvKiBoYWQgdG8gZGVmZXIgZm9yIGV4Y2Vzc2l2ZSB0aW1lICovCisjZGVmaW5lIFJFVFJZX01BU0sJMHgwZgkvKiBudW1iZXIgb2YgcmV0cmllcyAoMCAtIDE1KSAqLworCisvKiBCaXRzIGluIFJDVkZDICovCisjZGVmaW5lIExMUkNWCQkweDA4CS8qIGxvdyBsYXRlbmN5IHJlY2VpdmU6IGVhcmx5IERNQSByZXF1ZXN0ICovCisjZGVmaW5lIE1fUkJBUgkJMHgwNAkvKiBzZXRzIGZ1bmN0aW9uIG9mIEVBTS9SIHBpbiAqLworI2RlZmluZSBBVVRPX1NUUklQX1JDVgkweDAxCS8qIGF1dG8tc3RyaXAgc2hvcnQgTExDIGZyYW1lcyBvbiByZWN2ICovCisKKy8qCisgKiBCaXRzIGluIFJDVkZTLiAgQWZ0ZXIgYSBmcmFtZSBpcyByZWNlaXZlZCwgZm91ciBieXRlcyBvZiBzdGF0dXMKKyAqIGFyZSBhdXRvbWF0aWNhbGx5IHJlYWQgZnJvbSB0aGlzIHJlZ2lzdGVyIGFuZCBhcHBlbmRlZCB0byB0aGUgZnJhbWUKKyAqIGRhdGEgaW4gbWVtb3J5LiAgVGhlc2UgYXJlOgorICogQnl0ZSAwIGFuZCAxOiBtZXNzYWdlIGJ5dGUgY291bnQgYW5kIGZyYW1lIHN0YXR1cworICogQnl0ZSAyOiBydW50IHBhY2tldCBjb3VudAorICogQnl0ZSAzOiByZWNlaXZlIGNvbGxpc2lvbiBjb3VudAorICovCisjZGVmaW5lIFJTX09GTE8JCTB4ODAwMAkvKiByZWNlaXZlIEZJRk8gb3ZlcmZsb3dlZCAqLworI2RlZmluZSBSU19DTFNOCQkweDQwMDAJLyogcmVjZWl2ZWQgZnJhbWUgc3VmZmVyZWQgKGxhdGUpIGNvbGxpc2lvbiAqLworI2RlZmluZSBSU19GUkFNRVJSCTB4MjAwMAkvKiBmcmFtaW5nIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgUlNfRkNTRVJSCTB4MTAwMAkvKiBmcmFtZSBoYWQgRkNTIGVycm9yICovCisjZGVmaW5lIFJTX0NPVU5UCTB4MGZmZgkvKiBtYXNrIGZvciBieXRlIGNvdW50IGZpZWxkICovCisKKy8qIEJpdHMgKGZpZWxkcykgaW4gRklGT0ZDICovCisjZGVmaW5lIFJDVkZDX1NICTQJLyogcmVjZWl2ZSBmcmFtZSBjb3VudCBpbiBGSUZPICovCisjZGVmaW5lIFJDVkZDX01BU0sJMHgwZgorI2RlZmluZSBYTVRGQ19TSAkwCS8qIHRyYW5zbWl0IGZyYW1lIGNvdW50IGluIEZJRk8gKi8KKyNkZWZpbmUgWE1URkNfTUFTSwkweDBmCisKKy8qCisgKiBCaXRzIGluIElSIGFuZCBJTVIuICBUaGUgSVIgY2xlYXJzIGl0c2VsZiB3aGVuIHJlYWQuCisgKiBTZXR0aW5nIGEgYml0IGluIHRoZSBJTVIgd2lsbCBkaXNhYmxlIHRoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdC4KKyAqLworI2RlZmluZSBKQUJCRVIJCTB4ODAJLyogamFiYmVyIGVycm9yIC0gMTBiYXNlVCB4bWlzc2lvbiB0b28gbG9uZyAqLworI2RlZmluZSBCQUJCTEUJCTB4NDAJLyogYmFiYmxlIC0geG1pdHRlciB4bWl0dGluZyBmb3IgdG9vIGxvbmcgKi8KKyNkZWZpbmUgQ0VSUgkJMHgyMAkvKiBjb2xsaXNpb24gZXJyIC0gbm8gU1FFIHRlc3QgKGhlYXJ0YmVhdCkgKi8KKyNkZWZpbmUgUkNWQ0NPCQkweDEwCS8qIFJDVkNDIG92ZXJmbG93ICovCisjZGVmaW5lIFJOVFBDTwkJMHgwOAkvKiBSTlRQQyBvdmVyZmxvdyAqLworI2RlZmluZSBNUENPCQkweDA0CS8qIE1QQyBvdmVyZmxvdyAqLworI2RlZmluZSBSQ1ZJTlQJCTB4MDIJLyogcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgWE1USU5UCQkweDAxCS8qIHRyYW5zbWl0dGVyIGludGVycnVwdCAqLworCisvKiBCaXRzIGluIFBSICovCisjZGVmaW5lIFhNVFNWCQkweDgwCS8qIFhNVEZTIHZhbGlkIChzYW1lIGFzIGluIFhNVEZTKSAqLworI2RlZmluZSBURFRSRVEJCTB4NDAJLyogc2V0IHdoZW4geG1pdCBmaWZvIGlzIHJlcXVlc3RpbmcgZGF0YSAqLworI2RlZmluZSBSRFRSRVEJCTB4MjAJLyogc2V0IHdoZW4gcmVjdiBmaWZvIHJlcXVlc3RzIGRhdGEgeGZlciAqLworCisvKiBCaXRzIGluIEJJVUNDICovCisjZGVmaW5lIEJTV1AJCTB4NDAJLyogYnl0ZSBzd2FwLCBpLmUuIGJpZy1lbmRpYW4gYnVzICovCisjZGVmaW5lIFhNVFNQXzQJCTB4MDAJLyogc3RhcnQgeG1pdHRpbmcgd2hlbiA0IGJ5dGVzIGluIEZJRk8gKi8KKyNkZWZpbmUgWE1UU1BfMTYJMHgxMAkvKiBzdGFydCB4bWl0dGluZyB3aGVuIDE2IGJ5dGVzIGluIEZJRk8gKi8KKyNkZWZpbmUgWE1UU1BfNjQJMHgyMAkvKiBzdGFydCB4bWl0dGluZyB3aGVuIDY0IGJ5dGVzIGluIEZJRk8gKi8KKyNkZWZpbmUgWE1UU1BfMTEyCTB4MzAJLyogc3RhcnQgeG1pdHRpbmcgd2hlbiAxMTIgYnl0ZXMgaW4gRklGTyAqLworI2RlZmluZSBTV1JTVAkJMHgwMQkvKiBzb2Z0d2FyZSByZXNldCAqLworCisvKiBCaXRzIGluIEZJRk9DQyAqLworI2RlZmluZSBYTVRGV184CQkweDAwCS8qIHhtaXQgZmlmbyB3YXRlcm1hcmsgPSA4IHdvcmRzIGZyZWUgKi8KKyNkZWZpbmUgWE1URldfMTYJMHg0MAkvKiAgMTYgd29yZHMgZnJlZSAqLworI2RlZmluZSBYTVRGV18zMgkweDgwCS8qICAzMiB3b3JkcyBmcmVlICovCisjZGVmaW5lIFJDVkZXXzE2CTB4MDAJLyogcmVjdiBmaWZvIHdhdGVybWFyayA9IDE2IGJ5dGVzIGF2YWlsICovCisjZGVmaW5lIFJDVkZXXzMyCTB4MTAJLyogIDMyIGJ5dGVzIGF2YWlsICovCisjZGVmaW5lIFJDVkZXXzY0CTB4MjAJLyogIDY0IGJ5dGVzIGF2YWlsICovCisjZGVmaW5lIFhNVEZXVQkJMHgwOAkvKiB4bWl0IGZpZm8gd2F0ZXJtYXJrIHVwZGF0ZSBlbmFibGUgKi8KKyNkZWZpbmUgUkNWRldVCQkweDA0CS8qIHJlY3YgZmlmbyB3YXRlcm1hcmsgdXBkYXRlIGVuYWJsZSAqLworI2RlZmluZSBYTVRCUlNUCQkweDAyCS8qIGVuYWJsZSB0cmFuc21pdCBidXJzdCBtb2RlICovCisjZGVmaW5lIFJDVkJSU1QJCTB4MDEJLyogZW5hYmxlIHJlY2VpdmUgYnVyc3QgbW9kZSAqLworCisvKiBCaXRzIGluIE1BQ0NDICovCisjZGVmaW5lIFBST00JCTB4ODAJLyogcHJvbWlzY3VvdXMgbW9kZSAqLworI2RlZmluZSBEWE1UMlBECQkweDQwCS8qIGRpc2FibGUgeG1pdCB0d28tcGFydCBkZWZlcnJhbCBhbGdvcml0aG0gKi8KKyNkZWZpbmUgRU1CQQkJMHgyMAkvKiBlbmFibGUgbW9kaWZpZWQgYmFja29mZiBhbGdvcml0aG0gKi8KKyNkZWZpbmUgRFJDVlBBCQkweDA4CS8qIGRpc2FibGUgcmVjZWl2aW5nIHBoeXNpY2FsIGFkZHJlc3MgKi8KKyNkZWZpbmUgRFJDVkJDCQkweDA0CS8qIGRpc2FibGUgcmVjZWl2aW5nIGJyb2FkY2FzdHMgKi8KKyNkZWZpbmUgRU5YTVQJCTB4MDIJLyogZW5hYmxlIHRyYW5zbWl0dGVyICovCisjZGVmaW5lIEVOUkNWCQkweDAxCS8qIGVuYWJsZSByZWNlaXZlciAqLworCisvKiBCaXRzIGluIFBMU0NDICovCisjZGVmaW5lIFhNVFNFTAkJMHgwOAkvKiBzZWxlY3QgRE8rL0RPLSBzdGF0ZSB3aGVuIGlkbGUgKi8KKyNkZWZpbmUgUE9SVFNFTF9BVUkJMHgwMAkvKiBzZWxlY3QgQVVJIHBvcnQgKi8KKyNkZWZpbmUgUE9SVFNFTF8xMFQJMHgwMgkvKiBzZWxlY3QgMTBCYXNlLVQgcG9ydCAqLworI2RlZmluZSBQT1JUU0VMX0RBSQkweDA0CS8qIHNlbGVjdCBEQUkgcG9ydCAqLworI2RlZmluZSBQT1JUU0VMX0dQU0kJMHgwNgkvKiBzZWxlY3QgR1BTSSBwb3J0ICovCisjZGVmaW5lIEVOUExTSU8JCTB4MDEJLyogZW5hYmxlIG9wdGlvbmFsIFBMUyBJL08gcGlucyAqLworCisvKiBCaXRzIGluIFBIWUNDICovCisjZGVmaW5lIExOS0ZMCQkweDgwCS8qIHJlcG9ydHMgMTBCYXNlLVQgbGluayBmYWlsdXJlICovCisjZGVmaW5lIERMTktUU1QJCTB4NDAJLyogZGlzYWJsZSAxMEJhc2UtVCBsaW5rIHRlc3QgKi8KKyNkZWZpbmUgUkVWUE9MCQkweDIwCS8qIDEwQmFzZS1UIHJlY2VpdmVyIHBvbGFyaXR5IHJldmVyc2VkICovCisjZGVmaW5lIERBUEMJCTB4MTAJLyogZGlzYWJsZSBhdXRvIHJlY2VpdmVyIHBvbGFyaXR5IGNvcnJlY3Rpb24gKi8KKyNkZWZpbmUgTFJUCQkweDA4CS8qIGxvdyByZWNlaXZlIHRocmVzaG9sZCBmb3IgbG9uZyBsaW5rcyAqLworI2RlZmluZSBBU0VMCQkweDA0CS8qIGF1dG8tc2VsZWN0IEFVSSBvciAxMEJhc2UtVCBwb3J0ICovCisjZGVmaW5lIFJXQUtFCQkweDAyCS8qIHJlbW90ZSB3YWtlIGZ1bmN0aW9uICovCisjZGVmaW5lIEFXQUtFCQkweDAxCS8qIGF1dG8gd2FrZSBmdW5jdGlvbiAqLworCisvKiBCaXRzIGluIElBQyAqLworI2RlZmluZSBBRERSQ0hHCQkweDgwCS8qIHJlcXVlc3QgYWRkcmVzcyBjaGFuZ2UgKi8KKyNkZWZpbmUgUEhZQUREUgkJMHgwNAkvKiBhY2Nlc3MgcGh5c2ljYWwgYWRkcmVzcyAqLworI2RlZmluZSBMT0dBRERSCQkweDAyCS8qIGFjY2VzcyBtdWx0aWNhc3QgZmlsdGVyICovCisKKy8qIEJpdHMgaW4gVVRSICovCisjZGVmaW5lIFJUUkUJCTB4ODAJLyogcmVzZXJ2ZWQgdGVzdCByZWdpc3RlciBlbmFibGUuIERPTidUIFNFVC4gKi8KKyNkZWZpbmUgUlRSRAkJMHg0MAkvKiByZXNlcnZlZCB0ZXN0IHJlZ2lzdGVyIGRpc2FibGUuICBTdGlja3kgKi8KKyNkZWZpbmUgUlBBQwkJMHgyMAkvKiBhY2NlcHQgcnVudCBwYWNrZXRzICovCisjZGVmaW5lIEZDT0xMCQkweDEwCS8qIGZvcmNlIGNvbGxpc2lvbiAqLworI2RlZmluZSBSQ1ZGQ1NFCQkweDA4CS8qIHJlY2VpdmUgRkNTIGVuYWJsZSAqLworI2RlZmluZSBMT09QX05PTkUJMHgwMAkvKiBubyBsb29wYmFjayAqLworI2RlZmluZSBMT09QX0VYVAkweDAyCS8qIGV4dGVybmFsIGxvb3BiYWNrICovCisjZGVmaW5lIExPT1BfSU5UCTB4MDQJLyogaW50ZXJuYWwgbG9vcGJhY2ssIGV4Y2x1ZGVzIE1FTkRFQyAqLworI2RlZmluZSBMT09QX01FTkRFQwkweDA2CS8qIGludGVybmFsIGxvb3BiYWNrLCBpbmNsdWRlcyBNRU5ERUMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY21hY2UuYyBiL2RyaXZlcnMvbmV0L21hY21hY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWE2ZmMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbWFjbWFjZS5jCkBAIC0wLDAgKzEsNzEwIEBACisvKgorICoJRHJpdmVyIGZvciB0aGUgTWFjaW50b3NoIDY4SyBvbmJvYXJkIE1BQ0UgY29udHJvbGxlciB3aXRoIFBTQworICoJZHJpdmVuIERNQS4gVGhlIE1BQ0UgZHJpdmVyIGNvZGUgaXMgZGVyaXZlZCBmcm9tIG1hY2UuYy4gVGhlCisgKglNYWM2OGsgdGhlb3J5IG9mIG9wZXJhdGlvbiBpcyBjb3VydGVzeSBvZiB0aGUgTWFjQlNEIHdpemFyZHMuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMuCisgKglDb3B5cmlnaHQgKEMpIDE5OTggQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKglNb2RpZmllZCBoZWF2aWx5IGJ5IEpvc2h1YSBNLiBUaG9tcHNvbiBiYXNlZCBvbiBEYXZlIEh1YW5nJ3MgTmV0QlNEIGRyaXZlcgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNpbnRvc2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaW50cy5oPgorI2luY2x1ZGUgPGFzbS9tYWNfcHNjLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlICJtYWNlLmgiCisKKyNkZWZpbmUgTl9UWF9SSU5HCTEKKyNkZWZpbmUgTl9SWF9SSU5HCTgKKyNkZWZpbmUgTl9SWF9QQUdFUwkoKE5fUlhfUklORyAqIDB4MDgwMCArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFKQorI2RlZmluZSBUWF9USU1FT1VUCUhaCisKKy8qIEJpdHMgaW4gdHJhbnNtaXQgRE1BIHN0YXR1cyAqLworI2RlZmluZSBUWF9ETUFfRVJSCTB4ODAKKworLyogVGhlIE1BQ0UgaXMgc2ltcGx5IHdpcmVkIGRvd24gb24gYSBNYWM2OEsgYm94ICovCisKKyNkZWZpbmUgTUFDRV9CQVNFCSh2b2lkICopKDB4NTBGMUMwMDApCisjZGVmaW5lIE1BQ0VfUFJPTQkodm9pZCAqKSgweDUwRjA4MDAxKQorCitzdHJ1Y3QgbWFjZV9kYXRhIHsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWFjZSAqbWFjZTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICp0eF9yaW5nOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnR4X3JpbmdfcGh5czsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpyeF9yaW5nOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnJ4X3JpbmdfcGh5czsKKwlpbnQgZG1hX2ludHI7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJaW50IHJ4X3Nsb3QsIHJ4X3RhaWw7CisJaW50IHR4X3Nsb3QsIHR4X3Nsb3RpLCB0eF9jb3VudDsKK307CisKK3N0cnVjdCBtYWNlX2ZyYW1lIHsKKwl1MTYJbGVuOworCXUxNglzdGF0dXM7CisJdTE2CXJudHBjOworCXUxNglyY3ZjYzsKKwl1MzIJcGFkMTsKKwl1MzIJcGFkMjsKKwl1OAlkYXRhWzFdOwkKKwkvKiBBbmQgZnJhbWUgY29udGludWVzLi4gKi8KK307CisKKyNkZWZpbmUgUFJJVl9CWVRFUwlzaXplb2Yoc3RydWN0IG1hY2VfZGF0YSkKKworZXh0ZXJuIHZvaWQgcHNjX2RlYnVnX2R1bXAodm9pZCk7CisKK3N0YXRpYyBpbnQgbWFjZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtYWNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtYWNlX3htaXRfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm1hY2Vfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBtYWNlX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1hY2Vfc2V0X2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CitzdGF0aWMgaXJxcmV0dXJuX3QgbWFjZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgbWFjZV9kbWFfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIG1hY2VfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogQml0LXJldmVyc2Ugb25lIGJ5dGUgb2YgYW4gZXRoZXJuZXQgaGFyZHdhcmUgYWRkcmVzcy4gKi8KKworc3RhdGljIGludCBiaXRyZXYoaW50IGIpCit7CisJaW50IGQgPSAwLCBpOworCisJZm9yIChpID0gMDsgaSA8IDg7ICsraSwgYiA+Pj0gMSkgeworCQlkID0gKGQgPDwgMSkgfCAoYiAmIDEpOworCX0KKworCXJldHVybiBkOworfQorCisvKgorICogTG9hZCBhIHJlY2VpdmUgRE1BIGNoYW5uZWwgd2l0aCBhIGJhc2UgYWRkcmVzcyBhbmQgcmluZyBsZW5ndGgKKyAqLworCitzdGF0aWMgdm9pZCBtYWNlX2xvYWRfcnhkbWFfYmFzZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc2V0KQoreworCXN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworCisJcHNjX3dyaXRlX3dvcmQoUFNDX0VORVRSRF9DTUQgKyBzZXQsIDB4MDEwMCk7CisJcHNjX3dyaXRlX2xvbmcoUFNDX0VORVRSRF9BRERSICsgc2V0LCAodTMyKSBtcC0+cnhfcmluZ19waHlzKTsKKwlwc2Nfd3JpdGVfbG9uZyhQU0NfRU5FVFJEX0xFTiArIHNldCwgTl9SWF9SSU5HKTsKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFJEX0NNRCArIHNldCwgMHg5ODAwKTsKKwltcC0+cnhfdGFpbCA9IDA7Cit9CisKKy8qCisgKiBSZXNldCB0aGUgcmVjZWl2ZSBETUEgc3Vic3lzdGVtCisgKi8KKworc3RhdGljIHZvaWQgbWFjZV9yeGRtYV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworCXZvbGF0aWxlIHN0cnVjdCBtYWNlICptYWNlID0gbXAtPm1hY2U7CisJdTggbWFjY2MgPSBtYWNlLT5tYWNjYzsKKwkKKwltYWNlLT5tYWNjYyA9IG1hY2NjICYgfkVOUkNWOworCQorCXBzY193cml0ZV93b3JkKFBTQ19FTkVUUkRfQ1RMLCAweDg4MDApOworCW1hY2VfbG9hZF9yeGRtYV9iYXNlKGRldiwgMHgwMCk7CisJcHNjX3dyaXRlX3dvcmQoUFNDX0VORVRSRF9DVEwsIDB4MDQwMCk7CisJCisJcHNjX3dyaXRlX3dvcmQoUFNDX0VORVRSRF9DVEwsIDB4ODgwMCk7CisJbWFjZV9sb2FkX3J4ZG1hX2Jhc2UoZGV2LCAweDEwKTsKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFJEX0NUTCwgMHgwNDAwKTsKKwkKKwltYWNlLT5tYWNjYyA9IG1hY2NjOworCW1wLT5yeF9zbG90ID0gMDsKKworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUUkRfQ01EICsgUFNDX1NFVDAsIDB4OTgwMCk7CisJcHNjX3dyaXRlX3dvcmQoUFNDX0VORVRSRF9DTUQgKyBQU0NfU0VUMSwgMHg5ODAwKTsKK30KKworLyoKKyAqIFJlc2V0IHRoZSB0cmFuc21pdCBETUEgc3Vic3lzdGVtCisgKi8KKyAKK3N0YXRpYyB2b2lkIG1hY2VfdHhkbWFfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWFjZSAqbWFjZSA9IG1wLT5tYWNlOworCXU4IG1hY2NjOworCisJcHNjX3dyaXRlX3dvcmQoUFNDX0VORVRXUl9DVEwsIDB4ODgwMCk7CisKKwltYWNjYyA9IG1hY2UtPm1hY2NjOworCW1hY2UtPm1hY2NjID0gbWFjY2MgJiB+RU5YTVQ7CisKKwltcC0+dHhfc2xvdCA9IG1wLT50eF9zbG90aSA9IDA7CisJbXAtPnR4X2NvdW50ID0gTl9UWF9SSU5HOworCisJcHNjX3dyaXRlX3dvcmQoUFNDX0VORVRXUl9DVEwsIDB4MDQwMCk7CisJbWFjZS0+bWFjY2MgPSBtYWNjYzsKK30KKworLyoKKyAqIERpc2FibGUgRE1BCisgKi8KKyAKK3N0YXRpYyB2b2lkIG1hY2VfZG1hX29mZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUUkRfQ1RMLCAweDg4MDApOworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUUkRfQ1RMLCAweDEwMDApOworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUUkRfQ01EICsgUFNDX1NFVDAsIDB4MTEwMCk7CisJcHNjX3dyaXRlX3dvcmQoUFNDX0VORVRSRF9DTUQgKyBQU0NfU0VUMSwgMHgxMTAwKTsKKworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUV1JfQ1RMLCAweDg4MDApOworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUV1JfQ1RMLCAweDEwMDApOworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUV1JfQ01EICsgUFNDX1NFVDAsIDB4MTEwMCk7CisJcHNjX3dyaXRlX3dvcmQoUFNDX0VORVRXUl9DTUQgKyBQU0NfU0VUMSwgMHgxMTAwKTsKK30KKworLyoKKyAqIE5vdCByZWFsbHkgbXVjaCBvZiBhIHByb2JlLiBUaGUgaGFyZHdhcmUgdGFibGUgdGVsbHMgdXMgaWYgdGhpcworICogbW9kZWwgb2YgTWFjaW50cmFzaCBoYXMgYSBNQUNFIChBViBtYWNpbnRvc2hlcykKKyAqLworIAorc3RydWN0IG5ldF9kZXZpY2UgKm1hY2VfcHJvYmUoaW50IHVuaXQpCit7CisJaW50IGo7CisJc3RydWN0IG1hY2VfZGF0YSAqbXA7CisJdW5zaWduZWQgY2hhciAqYWRkcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXVuc2lnbmVkIGNoYXIgY2hlY2tzdW0gPSAwOworCXN0YXRpYyBpbnQgZm91bmQgPSAwOworCWludCBlcnI7CisJCisJaWYgKGZvdW5kIHx8IG1hY2ludG9zaF9jb25maWctPmV0aGVyX3R5cGUgIT0gTUFDX0VUSEVSX01BQ0UpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJZm91bmQgPSAxOwkvKiBwcmV2ZW50ICdmaW5kaW5nJyBvbmUgb24gZXZlcnkgZGV2aWNlIHByb2JlICovCisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihQUklWX0JZVEVTKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAodW5pdCA+PSAwKQorCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisKKwltcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKwlkZXYtPmJhc2VfYWRkciA9ICh1MzIpTUFDRV9CQVNFOworCW1wLT5tYWNlID0gKHZvbGF0aWxlIHN0cnVjdCBtYWNlICopIE1BQ0VfQkFTRTsKKwkKKwlkZXYtPmlycSA9IElSUV9NQUNfTUFDRTsKKwltcC0+ZG1hX2ludHIgPSBJUlFfTUFDX01BQ0VfRE1BOworCisJLyoKKwkgKiBUaGUgUFJPTSBjb250YWlucyA4IGJ5dGVzIHdoaWNoIHRvdGFsIDB4RkYgd2hlbiBYT1InZAorCSAqIHRvZ2V0aGVyLiBEdWUgdG8gdGhlIHVzdWFsIHBlY3VsaWFyIGFwcGxlIGJyYWluIGRhbWFnZQorCSAqIHRoZSBieXRlcyBhcmUgc3BhY2VkIG91dCBpbiBhIHN0cmFuZ2UgYm91bmRhcnkgYW5kIHRoZQorCSAqIGJpdHMgYXJlIHJldmVyc2VkLgorCSAqLworCisJYWRkciA9ICh2b2lkICopTUFDRV9QUk9NOworCQkgCisJZm9yIChqID0gMDsgaiA8IDY7ICsraikgeworCQl1OCB2PWJpdHJldihhZGRyW2o8PDRdKTsKKwkJY2hlY2tzdW0gXj0gdjsKKwkJZGV2LT5kZXZfYWRkcltqXSA9IHY7CisJfQorCWZvciAoOyBqIDwgODsgKytqKSB7CisJCWNoZWNrc3VtIF49IGJpdHJldihhZGRyW2o8PDRdKTsKKwl9CisJCisJaWYgKGNoZWNrc3VtICE9IDB4RkYpIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisJfQorCisJbWVtc2V0KCZtcC0+c3RhdHMsIDAsIHNpemVvZihtcC0+c3RhdHMpKTsKKworCWRldi0+b3BlbgkJPSBtYWNlX29wZW47CisJZGV2LT5zdG9wCQk9IG1hY2VfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBtYWNlX3htaXRfc3RhcnQ7CisJZGV2LT50eF90aW1lb3V0CQk9IG1hY2VfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gVFhfVElNRU9VVDsKKwlkZXYtPmdldF9zdGF0cwkJPSBtYWNlX3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0CT0gbWFjZV9zZXRfbXVsdGljYXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzCT0gbWFjZV9zZXRfYWRkcmVzczsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiA2OEsgTUFDRSwgaGFyZHdhcmUgYWRkcmVzcyAlLjJYIiwgZGV2LT5uYW1lLCBkZXYtPmRldl9hZGRyWzBdKTsKKwlmb3IgKGogPSAxIDsgaiA8IDYgOyBqKyspIHByaW50aygiOiUuMlgiLCBkZXYtPmRldl9hZGRyW2pdKTsKKwlwcmludGsoIlxuIik7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoIWVycikKKwkJcmV0dXJuIGRldjsKKworCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoKKyAqIExvYWQgdGhlIGFkZHJlc3Mgb24gYSBtYWNlIGNvbnRyb2xsZXIuCisgKi8KKworc3RhdGljIGludCBtYWNlX3NldF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJdW5zaWduZWQgY2hhciAqcCA9IGFkZHI7CisJc3RydWN0IG1hY2VfZGF0YSAqbXAgPSAoc3RydWN0IG1hY2VfZGF0YSAqKSBkZXYtPnByaXY7CisJdm9sYXRpbGUgc3RydWN0IG1hY2UgKm1iID0gbXAtPm1hY2U7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBtYWNjYzsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCW1hY2NjID0gbWItPm1hY2NjOworCisJLyogbG9hZCB1cCB0aGUgaGFyZHdhcmUgYWRkcmVzcyAqLworCW1iLT5pYWMgPSBBRERSQ0hHIHwgUEhZQUREUjsKKwl3aGlsZSAoKG1iLT5pYWMgJiBBRERSQ0hHKSAhPSAwKTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgNjsgKytpKSB7CisJCW1iLT5wYWRyID0gZGV2LT5kZXZfYWRkcltpXSA9IHBbaV07CisJfQorCisJbWItPm1hY2NjID0gbWFjY2M7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBPcGVuIHRoZSBNYWNpbnRvc2ggTUFDRS4gTW9zdCBvZiB0aGlzIGlzIHBsYXlpbmcgd2l0aCB0aGUgRE1BCisgKiBlbmdpbmUuIFRoZSBldGhlcm5ldCBjaGlwIGlzIHF1aXRlIGZyaWVuZGx5LgorICovCisgCitzdGF0aWMgaW50IG1hY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworCXZvbGF0aWxlIHN0cnVjdCBtYWNlICptYiA9IG1wLT5tYWNlOworI2lmIDAKKwlpbnQgaTsKKworCWkgPSAyMDA7CisJd2hpbGUgKC0taSkgeworCQltYi0+Yml1Y2MgPSBTV1JTVDsKKwkJaWYgKG1iLT5iaXVjYyAmIFNXUlNUKSB7CisJCQl1ZGVsYXkoMTApOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCWlmICghaSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzb2Z0d2FyZSByZXNldCBmYWlsZWQhIVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorI2VuZGlmCisKKwltYi0+Yml1Y2MgPSBYTVRTUF82NDsKKwltYi0+Zmlmb2NjID0gWE1URldfMTYgfCBSQ1ZGV182NCB8IFhNVEZXVSB8IFJDVkZXVSB8IFhNVEJSU1QgfCBSQ1ZCUlNUOworCW1iLT54bXRmYyA9IEFVVE9fUEFEX1hNSVQ7CisJbWItPnBsc2NjID0gUE9SVFNFTF9BVUk7CisJLyogbWItPnV0ciA9IFJUUkQ7ICovCisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIG1hY2VfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgZ2V0IGlycSAlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlpZiAocmVxdWVzdF9pcnEobXAtPmRtYV9pbnRyLCBtYWNlX2RtYV9pbnRyLCAwLCBkZXYtPm5hbWUsIGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgZ2V0IGlycSAlZFxuIiwgZGV2LT5uYW1lLCBtcC0+ZG1hX2ludHIpOworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogQWxsb2NhdGUgdGhlIERNQSByaW5nIGJ1ZmZlcnMgKi8KKworCW1wLT5yeF9yaW5nID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMIHwgR0ZQX0RNQSwgTl9SWF9QQUdFUyk7CisJbXAtPnR4X3JpbmcgPSAodm9pZCAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBHRlBfRE1BLCAwKTsKKwkKKwlpZiAobXAtPnR4X3Jpbmc9PU5VTEwgfHwgbXAtPnJ4X3Jpbmc9PU5VTEwpIHsKKwkJaWYgKG1wLT5yeF9yaW5nKSBmcmVlX3BhZ2VzKCh1MzIpIG1wLT5yeF9yaW5nLCBOX1JYX1BBR0VTKTsKKwkJaWYgKG1wLT50eF9yaW5nKSBmcmVlX3BhZ2VzKCh1MzIpIG1wLT50eF9yaW5nLCAwKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCWZyZWVfaXJxKG1wLT5kbWFfaW50ciwgZGV2KTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGFsbG9jYXRlIERNQSBidWZmZXJzXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltcC0+cnhfcmluZ19waHlzID0gKHVuc2lnbmVkIGNoYXIgKikgdmlydF90b19idXMoKHZvaWQgKiltcC0+cnhfcmluZyk7CisJbXAtPnR4X3JpbmdfcGh5cyA9ICh1bnNpZ25lZCBjaGFyICopIHZpcnRfdG9fYnVzKCh2b2lkICopbXAtPnR4X3JpbmcpOworCisJLyogV2Ugd2FudCB0aGUgUnggYnVmZmVyIHRvIGJlIHVuY2FjaGVkIGFuZCB0aGUgVHggYnVmZmVyIHRvIGJlIHdyaXRldGhyb3VnaCAqLworCisJa2VybmVsX3NldF9jYWNoZW1vZGUoKHZvaWQgKiltcC0+cnhfcmluZywgTl9SWF9QQUdFUyAqIFBBR0VfU0laRSwgSU9NQVBfTk9DQUNIRV9OT05TRVIpOwkKKwlrZXJuZWxfc2V0X2NhY2hlbW9kZSgodm9pZCAqKW1wLT50eF9yaW5nLCBQQUdFX1NJWkUsIElPTUFQX1dSSVRFVEhST1VHSCk7CisKKwltYWNlX2RtYV9vZmYoZGV2KTsKKworCS8qIE5vdCBzdXJlIHdoYXQgdGhlc2UgZG8gKi8KKworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUV1JfQ1RMLCAweDkwMDApOworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUUkRfQ1RMLCAweDkwMDApOworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUV1JfQ1RMLCAweDA0MDApOworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUUkRfQ1RMLCAweDA0MDApOworCisjaWYgMAorCS8qIGxvYWQgdXAgdGhlIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwkKKwltYi0+aWFjID0gQUREUkNIRyB8IFBIWUFERFI7CisJCisJd2hpbGUgKChtYi0+aWFjICYgQUREUkNIRykgIT0gMCk7CisJCisJZm9yIChpID0gMDsgaSA8IDY7ICsraSkKKwkJbWItPnBhZHIgPSBkZXYtPmRldl9hZGRyW2ldOworCisJLyogY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgKi8KKwltYi0+aWFjID0gQUREUkNIRyB8IExPR0FERFI7CisKKwl3aGlsZSAoKG1iLT5pYWMgJiBBRERSQ0hHKSAhPSAwKTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorCQltYi0+bGFkcmYgPSAwOworCisJbWItPnBsc2NjID0gUE9SVFNFTF9HUFNJICsgRU5QTFNJTzsKKworCW1iLT5tYWNjYyA9IEVOWE1UIHwgRU5SQ1Y7CisJbWItPmltciA9IFJDVklOVDsKKyNlbmRpZgorCisJbWFjZV9yeGRtYV9yZXNldChkZXYpOworCW1hY2VfdHhkbWFfcmVzZXQoZGV2KTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNodXQgZG93biB0aGUgbWFjZSBhbmQgaXRzIGludGVycnVwdCBjaGFubmVsCisgKi8KKyAKK3N0YXRpYyBpbnQgbWFjZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworCXZvbGF0aWxlIHN0cnVjdCBtYWNlICptYiA9IG1wLT5tYWNlOworCisJbWItPm1hY2NjID0gMDsJCS8qIGRpc2FibGUgcnggYW5kIHR4CSAqLworCW1iLT5pbXIgPSAweEZGOwkJLyogZGlzYWJsZSBhbGwgaXJxcwkgKi8KKwltYWNlX2RtYV9vZmYoZGV2KTsJLyogZGlzYWJsZSByeCBhbmQgdHggZG1hICovCisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlmcmVlX2lycShJUlFfTUFDX01BQ0VfRE1BLCBkZXYpOworCisJZnJlZV9wYWdlcygodTMyKSBtcC0+cnhfcmluZywgTl9SWF9QQUdFUyk7CisJZnJlZV9wYWdlcygodTMyKSBtcC0+dHhfcmluZywgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRyYW5zbWl0IGEgZnJhbWUKKyAqLworIAorc3RhdGljIGludCBtYWNlX3htaXRfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKworCS8qIFN0b3AgdGhlIHF1ZXVlIGlmIHRoZSBidWZmZXIgaXMgZnVsbCAqLworCisJaWYgKCFtcC0+dHhfY291bnQpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlyZXR1cm4gMTsKKwl9CisJbXAtPnR4X2NvdW50LS07CisJCisJbXAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwltcC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkvKiBXZSBuZWVkIHRvIGNvcHkgaW50byBvdXIgeG1pdCBidWZmZXIgdG8gdGFrZSBjYXJlIG9mIGFsaWdubWVudCBhbmQgY2FjaGluZyBpc3N1ZXMgKi8KKworCW1lbWNweSgodm9pZCAqKSBtcC0+dHhfcmluZywgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwkvKiBsb2FkIHRoZSBUeCBETUEgYW5kIGZpcmUgaXQgb2ZmICovCisKKwlwc2Nfd3JpdGVfbG9uZyhQU0NfRU5FVFdSX0FERFIgKyBtcC0+dHhfc2xvdCwgKHUzMikgIG1wLT50eF9yaW5nX3BoeXMpOworCXBzY193cml0ZV9sb25nKFBTQ19FTkVUV1JfTEVOICsgbXAtPnR4X3Nsb3QsIHNrYi0+bGVuKTsKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFdSX0NNRCArIG1wLT50eF9zbG90LCAweDk4MDApOworCisJbXAtPnR4X3Nsb3QgXj0gMHgxMDsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm1hY2Vfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWFjZV9kYXRhICpwID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworCXJldHVybiAmcC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIG1hY2Vfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworCXZvbGF0aWxlIHN0cnVjdCBtYWNlICptYiA9IG1wLT5tYWNlOworCWludCBpLCBqOworCXUzMiBjcmM7CisJdTggbWFjY2M7CisKKwltYWNjYyA9IG1iLT5tYWNjYzsKKwltYi0+bWFjY2MgJj0gflBST007CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCW1iLT5tYWNjYyB8PSBQUk9NOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGNoYXIgbXVsdGljYXN0X2ZpbHRlcls4XTsKKwkJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisKKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCQltdWx0aWNhc3RfZmlsdGVyW2ldID0gMHhGRjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQkJbXVsdGljYXN0X2ZpbHRlcltpXSA9IDA7CisJCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrKSB7CisJCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGRtaS0+ZG1pX2FkZHIpOworCQkJCWogPSBjcmMgPj4gMjY7CS8qIGJpdCBudW1iZXIgaW4gbXVsdGljYXN0X2ZpbHRlciAqLworCQkJCW11bHRpY2FzdF9maWx0ZXJbaiA+PiAzXSB8PSAxIDw8IChqICYgNyk7CisJCQkJZG1pID0gZG1pLT5uZXh0OworCQkJfQorCQl9CisKKwkJbWItPmlhYyA9IEFERFJDSEcgfCBMT0dBRERSOworCQl3aGlsZSAobWItPmlhYyAmIEFERFJDSEcpOworCQkKKwkJZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworCQkJbWItPmxhZHJmID0gbXVsdGljYXN0X2ZpbHRlcltpXTsKKwkJfQorCX0KKworCW1iLT5tYWNjYyA9IG1hY2NjOworfQorCisvKgorICogTWlzY2VsbGFuZW91cyBpbnRlcnJ1cHRzIGFyZSBoYW5kbGVkIGhlcmUuIFdlIG1heSBlbmQgdXAgCisgKiBoYXZpbmcgdG8gYmFzaCB0aGUgY2hpcCBvbiB0aGUgaGVhZCBmb3IgYmFkIGVycm9ycworICovCisgCitzdGF0aWMgdm9pZCBtYWNlX2hhbmRsZV9taXNjX2ludHJzKHN0cnVjdCBtYWNlX2RhdGEgKm1wLCBpbnQgaW50cikKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgbWFjZSAqbWIgPSBtcC0+bWFjZTsKKwlzdGF0aWMgaW50IG1hY2VfYmFiYmxlcywgbWFjZV9qYWJiZXJzOworCisJaWYgKGludHIgJiBNUENPKSB7CisJCW1wLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IDI1NjsKKwl9CisJbXAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gbWItPm1wYzsJLyogcmVhZGluZyBjbGVhcnMgaXQgKi8KKworCWlmIChpbnRyICYgUk5UUENPKSB7CisJCW1wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9IDI1NjsKKwl9CisJbXAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgKz0gbWItPnJudHBjOwkvKiByZWFkaW5nIGNsZWFycyBpdCAqLworCisJaWYgKGludHIgJiBDRVJSKSB7CisJCSsrbXAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnM7CisJfQorCWlmIChpbnRyICYgQkFCQkxFKSB7CisJCWlmIChtYWNlX2JhYmJsZXMrKyA8IDQpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJtYWNlOiBiYWJibGluZyB0cmFuc21pdHRlclxuIik7CisJCX0KKwl9CisJaWYgKGludHIgJiBKQUJCRVIpIHsKKwkJaWYgKG1hY2VfamFiYmVycysrIDwgNCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIm1hY2U6IGphYmJlcmluZyB0cmFuc2NlaXZlclxuIik7CisJCX0KKwl9Cit9CisKKy8qCisgKglBIHRyYW5zbWl0IGVycm9yIGhhcyBvY2N1cnJlZC4gKFdlIGtpY2sgdGhlIHRyYW5zbWl0IHNpZGUgZnJvbQorICoJdGhlIERNQSBjb21wbGV0aW9uKQorICovCisgCitzdGF0aWMgdm9pZCBtYWNlX3htaXRfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWFjZSAqbWIgPSBtcC0+bWFjZTsKKwl1OCB4bXRmcywgeG10cmM7CisJCisJeG10ZnMgPSBtYi0+eG10ZnM7CisJeG10cmMgPSBtYi0+eG10cmM7CisJCisJaWYgKHhtdGZzICYgWE1UU1YpIHsKKwkJaWYgKHhtdGZzICYgVUZMTykgeworCQkJcHJpbnRrKCIlczogRE1BIHVuZGVycnVuLlxuIiwgZGV2LT5uYW1lKTsKKwkJCW1wLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCW1wLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJbWFjZV90eGRtYV9yZXNldChkZXYpOworCQl9CisJCWlmICh4bXRmcyAmIFJUUlkpIHsKKwkJCW1wLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCX0KKwl9CQkJCit9CisKKy8qCisgKglBIHJlY2VpdmUgaW50ZXJydXB0IG9jY3VycmVkLgorICovCisgCitzdGF0aWMgdm9pZCBtYWNlX3JlY3ZfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisvKglzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsgKi8KKy8vCXZvbGF0aWxlIHN0cnVjdCBtYWNlICptYiA9IG1wLT5tYWNlOworfQorCisvKgorICogUHJvY2VzcyB0aGUgY2hpcCBpbnRlcnJ1cHQKKyAqLworIAorc3RhdGljIGlycXJldHVybl90IG1hY2VfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IG1hY2VfZGF0YSAqbXAgPSAoc3RydWN0IG1hY2VfZGF0YSAqKSBkZXYtPnByaXY7CisJdm9sYXRpbGUgc3RydWN0IG1hY2UgKm1iID0gbXAtPm1hY2U7CisJdTggaXI7CisJCisJaXIgPSBtYi0+aXI7CisJbWFjZV9oYW5kbGVfbWlzY19pbnRycyhtcCwgaXIpOworCQorCWlmIChpciAmIFhNVElOVCkgeworCQltYWNlX3htaXRfZXJyb3IoZGV2KTsKKwl9CisJaWYgKGlyICYgUkNWSU5UKSB7CisJCW1hY2VfcmVjdl9pbnRlcnJ1cHQoZGV2KTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBtYWNlX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKy8qCXN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OyAqLworLy8Jdm9sYXRpbGUgc3RydWN0IG1hY2UgKm1iID0gbXAtPm1hY2U7Cit9CisKKy8qCisgKiBIYW5kbGUgYSBuZXdseSBhcnJpdmVkIGZyYW1lCisgKi8KKyAKK3N0YXRpYyB2b2lkIG1hY2VfZG1hX3J4X2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBtYWNlX2ZyYW1lICptZikKK3sKKwlzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKG1mLT5zdGF0dXMgJiBSU19PRkxPKSB7CisJCXByaW50aygiJXM6IGZpZm8gb3ZlcmZsb3cuXG4iLCBkZXYtPm5hbWUpOworCQltcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCW1wLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCX0KKwlpZiAobWYtPnN0YXR1cyYoUlNfQ0xTTnxSU19GUkFNRVJSfFJTX0ZDU0VSUikpCisJCW1wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCisJaWYgKG1mLT5zdGF0dXMmUlNfQ0xTTikgeworCQltcC0+c3RhdHMuY29sbGlzaW9ucysrOworCX0KKwlpZiAobWYtPnN0YXR1cyZSU19GUkFNRVJSKSB7CisJCW1wLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwl9CisJaWYgKG1mLT5zdGF0dXMmUlNfRkNTRVJSKSB7CisJCW1wLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJfQorCQkKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKG1mLT5sZW4rMik7CisJaWYgKCFza2IpIHsKKwkJbXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKwlza2JfcmVzZXJ2ZShza2IsMik7CisJbWVtY3B5KHNrYl9wdXQoc2tiLCBtZi0+bGVuKSwgbWYtPmRhdGEsIG1mLT5sZW4pOworCQorCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCW1wLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbXAtPnN0YXRzLnJ4X2J5dGVzICs9IG1mLT5sZW47Cit9CisKKy8qCisgKiBUaGUgUFNDIGhhcyBwYXNzZWQgdXMgYSBETUEgaW50ZXJydXB0IGV2ZW50LgorICovCisgCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFjZV9kbWFfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworCWludCBsZWZ0LCBoZWFkOworCXUxNiBzdGF0dXM7CisJdTMyIGJha2E7CisKKwkvKiBOb3Qgc3VyZSB3aGF0IHRoaXMgZG9lcyAqLworCisJd2hpbGUgKChiYWthID0gcHNjX3JlYWRfbG9uZyhQU0NfTVlTVEVSWSkpICE9IHBzY19yZWFkX2xvbmcoUFNDX01ZU1RFUlkpKTsKKwlpZiAoIShiYWthICYgMHg2MDAwMDAwMCkpIHJldHVybiBJUlFfTk9ORTsKKworCS8qCisJICogUHJvY2VzcyB0aGUgcmVhZCBxdWV1ZQorCSAqLworCQkgCisJc3RhdHVzID0gcHNjX3JlYWRfd29yZChQU0NfRU5FVFJEX0NUTCk7CisJCQorCWlmIChzdGF0dXMgJiAweDIwMDApIHsKKwkJbWFjZV9yeGRtYV9yZXNldChkZXYpOworCX0gZWxzZSBpZiAoc3RhdHVzICYgMHgwMTAwKSB7CisJCXBzY193cml0ZV93b3JkKFBTQ19FTkVUUkRfQ01EICsgbXAtPnJ4X3Nsb3QsIDB4MTEwMCk7CisKKwkJbGVmdCA9IHBzY19yZWFkX2xvbmcoUFNDX0VORVRSRF9MRU4gKyBtcC0+cnhfc2xvdCk7CisJCWhlYWQgPSBOX1JYX1JJTkcgLSBsZWZ0OworCisJCS8qIExvb3AgdGhyb3VnaCB0aGUgcmluZyBidWZmZXIgYW5kIHByb2Nlc3MgbmV3IHBhY2thZ2VzICovCisKKwkJd2hpbGUgKG1wLT5yeF90YWlsIDwgaGVhZCkgeworCQkJbWFjZV9kbWFfcnhfZnJhbWUoZGV2LCAoc3RydWN0IG1hY2VfZnJhbWUgKikgKG1wLT5yeF9yaW5nICsgKG1wLT5yeF90YWlsICogMHgwODAwKSkpOworCQkJbXAtPnJ4X3RhaWwrKzsKKwkJfQorCQkJCisJCS8qIElmIHdlJ3JlIG91dCBvZiBidWZmZXJzIGluIHRoaXMgcmluZyB0aGVuIHN3aXRjaCB0byAqLworCQkvKiB0aGUgb3RoZXIgc2V0LCBvdGhlcndpc2UganVzdCByZWFjdGl2YXRlIHRoaXMgb25lLiAgKi8KKworCQlpZiAoIWxlZnQpIHsKKwkJCW1hY2VfbG9hZF9yeGRtYV9iYXNlKGRldiwgbXAtPnJ4X3Nsb3QpOworCQkJbXAtPnJ4X3Nsb3QgXj0gMHgxMDsKKwkJfSBlbHNlIHsKKwkJCXBzY193cml0ZV93b3JkKFBTQ19FTkVUUkRfQ01EICsgbXAtPnJ4X3Nsb3QsIDB4OTgwMCk7CisJCX0KKwl9CisJCQorCS8qCisJICogUHJvY2VzcyB0aGUgd3JpdGUgcXVldWUKKwkgKi8KKworCXN0YXR1cyA9IHBzY19yZWFkX3dvcmQoUFNDX0VORVRXUl9DVEwpOworCisJaWYgKHN0YXR1cyAmIDB4MjAwMCkgeworCQltYWNlX3R4ZG1hX3Jlc2V0KGRldik7CisJfSBlbHNlIGlmIChzdGF0dXMgJiAweDAxMDApIHsKKwkJcHNjX3dyaXRlX3dvcmQoUFNDX0VORVRXUl9DTUQgKyBtcC0+dHhfc2xvdGksIDB4MDEwMCk7CisJCW1wLT50eF9zbG90aSBePSAweDEwOworCQltcC0+dHhfY291bnQrKzsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY3NvbmljLmMgYi9kcml2ZXJzL25ldC9tYWNzb25pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMjhjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9tYWNzb25pYy5jCkBAIC0wLDAgKzEsNjU3IEBACisvKgorICogbWFjc29uaWMuYworICoKKyAqIChDKSAxOTk4IEFsYW4gQ294CisgKgorICogRGVidWdnaW5nIEFuZHJlYXMgRWhsaWFyLCBNaWNoYWVsIFNjaG1pdHoKKyAqCisgKiBCYXNlZCBvbiBjb2RlCisgKiAoQykgMTk5NiBieSBUaG9tYXMgQm9nZW5kb2VyZmVyICh0c2JvZ2VuZEBiaWdidWcuZnJhbmtlbi5kZSkKKyAqIAorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gd29yayBmcm9tIEFuZHJlYXMgQnVzc2UsIGJ1dCBtb3N0IG9mCisgKiB0aGUgY29kZSBpcyByZXdyaXR0ZW4uCisgKiAKKyAqIChDKSAxOTk1IGJ5IEFuZHJlYXMgQnVzc2UgKGFuZHlAd2FsZG9yZi1nbWJoLmRlKQorICoKKyAqIEEgZHJpdmVyIGZvciB0aGUgTWFjIG9uYm9hcmQgU29uaWMgZXRoZXJuZXQgY2hpcC4KKyAqCisgKiA5OC8xMi8yMSBNU2NoOiBqdWRnZWQgZnJvbSB0ZXN0cyBvbiBRODAwLCBpdCdzIGJhc2ljYWxseSB3b3JraW5nLCAKKyAqCQkgIGJ1dCBlYXRpbmcgdXAgYm90aCByZWNlaXZlIGFuZCB0cmFuc21pdCByZXNvdXJjZXMKKyAqCQkgIGFuZCBkdXBsaWNhdGluZyBwYWNrZXRzLiBOZWVkcyBtb3JlIHRlc3RpbmcuCisgKgorICogOTkvMDEvMDMgTVNjaDogdXBncmFkZWQgdG8gdmVyc2lvbiAwLjkyIG9mIHRoZSBjb3JlIGRyaXZlciwgZml4ZWQuCisgKiAKKyAqIDAwLzEwLzMxIHNhbW15QG9oLnZlcmlvLmNvbTogVXBkYXRlZCBkcml2ZXIgZm9yIDIuNCBrZXJuZWxzLCBmaXhlZCBwcm9ibGVtcworICogICAgICAgICAgb24gY2VudHJpcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbnVidXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaHd0ZXN0Lmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9tYWNpbnRvc2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaW50cy5oPgorI2luY2x1ZGUgPGFzbS9tYWNfdmlhLmg+CisKKyNkZWZpbmUgU1JFR1NfUEFEKG4pICAgIHUxNiBuOworCisjaW5jbHVkZSAic29uaWMuaCIKKworI2RlZmluZSBTT05JQ19SRUFEKHJlZykgXAorCW51YnVzX3JlYWRsKGJhc2VfYWRkcisocmVnKSkKKyNkZWZpbmUgU09OSUNfV1JJVEUocmVnLHZhbCkgXAorCW51YnVzX3dyaXRlbCgodmFsKSwgYmFzZV9hZGRyKyhyZWcpKQorI2RlZmluZSBzb25pY19yZWFkKGRldiwgcmVnKSBcCisJbnVidXNfcmVhZGwoKGRldiktPmJhc2VfYWRkcisocmVnKSkKKyNkZWZpbmUgc29uaWNfd3JpdGUoZGV2LCByZWcsIHZhbCkgXAorCW51YnVzX3dyaXRlbCgodmFsKSwgKGRldiktPmJhc2VfYWRkcisocmVnKSkKKworCitzdGF0aWMgaW50IHNvbmljX2RlYnVnOworc3RhdGljIGludCBzb25pY192ZXJzaW9uX3ByaW50ZWQ7CisKK3N0YXRpYyBpbnQgcmVnX29mZnNldDsKKworZXh0ZXJuIGludCBtYWNfb25ib2FyZF9zb25pY19wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK2V4dGVybiBpbnQgbWFjX251YnVzX3NvbmljX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworCisvKiBGb3Igb25ib2FyZCBTT05JQyAqLworI2RlZmluZSBPTkJPQVJEX1NPTklDX1JFR0lTVEVSUwkweDUwRjBBMDAwCisjZGVmaW5lIE9OQk9BUkRfU09OSUNfUFJPTV9CQVNFCTB4NTBmMDgwMDAKKworZW51bSBtYWNzb25pY190eXBlIHsKKwlNQUNTT05JQ19EVU9ET0NLLAorCU1BQ1NPTklDX0FQUExFLAorCU1BQ1NPTklDX0FQUExFMTYsCisJTUFDU09OSUNfREFZTkEsCisJTUFDU09OSUNfREFZTkFMSU5LCit9OworCisvKiBGb3IgdGhlIGJ1aWx0LWluIFNPTklDIGluIHRoZSBEdW8gRG9jayAqLworI2RlZmluZSBEVU9ET0NLX1NPTklDX1JFR0lTVEVSUyAweGUxMDAwMAorI2RlZmluZSBEVU9ET0NLX1NPTklDX1BST01fQkFTRSAweGUxMjAwMAorCisvKiBGb3IgQXBwbGUtc3R5bGUgTnVCdXMgU09OSUMgKi8KKyNkZWZpbmUgQVBQTEVfU09OSUNfUkVHSVNURVJTCTAKKyNkZWZpbmUgQVBQTEVfU09OSUNfUFJPTV9CQVNFCTB4NDAwMDAKKworLyogRGF5bmFsaW5rIExDIFNPTklDICovCisjZGVmaW5lIERBWU5BTElOS19QUk9NX0JBU0UgMHg0MDAwMDAKKworLyogRm9yIERheW5hLXN0eWxlIE51QnVzIFNPTklDIChoYXZlbid0IHNlZW4gb25lIHlldCkgKi8KKyNkZWZpbmUgREFZTkFfU09OSUNfUkVHSVNURVJTICAgMHgxODAwMDAKKy8qIFRoaXMgaXMgd2hhdCBPcGVuQlNEIHNheXMuICBIb3dldmVyLCB0aGlzIGlzIGRlZmluaXRlbHkgaW4gTnVCdXMKKyAgIFJPTSBzcGFjZSBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgaXQgYnkgd2Fsa2luZyB0aGUgTnVCdXMKKyAgIHJlc291cmNlIGRpcmVjdG9yaWVzICovCisjZGVmaW5lIERBWU5BX1NPTklDX01BQ19BRERSCTB4ZmZlMDA0CisKKyNkZWZpbmUgU09OSUNfUkVBRF9QUk9NKGFkZHIpIG51YnVzX3JlYWRiKHByb21fYWRkcithZGRyKQorCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBtYWNzb25pY19wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoMCk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApCisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKworIAlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBUaGlzIHdpbGwgY2F0Y2ggZmF0YWwgc3R1ZmYgbGlrZSAtRU5PTUVNIGFzIHdlbGwgYXMgc3VjY2VzcyAqLworCWVyciA9IG1hY19vbmJvYXJkX3NvbmljX3Byb2JlKGRldik7CisJaWYgKGVyciA9PSAwKQorCQlnb3RvIGZvdW5kOworCWlmIChlcnIgIT0gLUVOT0RFVikKKwkJZ290byBvdXQ7CisJZXJyID0gbWFjX251YnVzX3NvbmljX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7Citmb3VuZDoKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJa2ZyZWUoZGV2LT5wcml2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qCisgKiBGb3IgcmV2ZXJzaW5nIHRoZSBQUk9NIGFkZHJlc3MKKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuaWJibGV0YWJbXSA9IHswLCA4LCA0LCAxMiwgMiwgMTAsIDYsIDE0LAorCQkJCSAgICAxLCA5LCA1LCAxMywgMywgMTEsIDcsIDE1fTsKKworc3RhdGljIGlubGluZSB2b2lkIGJpdF9yZXZlcnNlX2FkZHIodW5zaWduZWQgY2hhciBhZGRyWzZdKQoreworCWludCBpOworCisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlhZGRyW2ldID0gKChuaWJibGV0YWJbYWRkcltpXSAmIDB4Zl0gPDwgNCkgfCAKKwkJCSAgIG5pYmJsZXRhYlsoYWRkcltpXSA+PiA0KSAmMHhmXSk7Cit9CisKK2ludCBfX2luaXQgbWFjc29uaWNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCBzb25pY19sb2NhbCogbHAgPSBOVUxMOworCWludCBpOworCisJLyogQWxsb2NhdGUgdGhlIGVudGlyZSBjaHVuayBvZiBtZW1vcnkgZm9yIHRoZSBkZXNjcmlwdG9ycy4KKyAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgY2Fubm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5LiAqLworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgZGVzY19iYXNlLCBkZXNjX3RvcDsKKwkJaWYoKGxwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNvbmljX2xvY2FsKSwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpKSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZG4ndCBhbGxvY2F0ZSBkZXNjcmlwdG9yIGJ1ZmZlcnNcbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWRlc2NfYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBscDsKKwkJZGVzY190b3AgPSBkZXNjX2Jhc2UgKyBzaXplb2Yoc3RydWN0IHNvbmljX2xvY2FsKTsKKwkJaWYgKChkZXNjX3RvcCAmIDB4ZmZmZikgPj0gKGRlc2NfYmFzZSAmIDB4ZmZmZikpCisJCQlicmVhazsKKwkJLyogSG1tLiB0cnkgYWdhaW4gKEZJWE1FOiBkb2VzIHRoaXMgYWN0dWFsbHkgd29yaz8pICovCisJCWtmcmVlKGxwKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIlczogZGlkbid0IGdldCBjb250aW5ndW91cyBjaHVuayBbJTA4bHggLSAlMDhseF0sIHRyeWluZyBhZ2FpblxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZGVzY19iYXNlLCBkZXNjX3RvcCk7CisJfQorCisJaWYgKGxwID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdHJpZWQgMjAgdGltZXMgdG8gYWxsb2NhdGUgZGVzY3JpcHRvciBidWZmZXJzLCBnaXZpbmcgdXAuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQkJICAgICAgIAorCisJZGV2LT5wcml2ID0gbHA7CisKKyNpZiAwCisJLyogdGhpcyBjb2RlIGlzIG9ubHkgaGVyZSBhcyBhIGN1cmlvdXNpdHkuLi4gICBtYWlubHksIHdoZXJlIHRoZSAKKwkgICBmdWNrIGRpZCBTT05JQ19CVVNfU0NBTEUgY29tZSBmcm9tLCBhbmQgd2hhdCB3YXMgaXQgc3VwcG9zZWQKKwkgICB0byBkbz8gIHRoZSBub3JtYWwgYWxsb2NhdGlvbiB3b3JrcyBncmVhdCBmb3IgMzIgYml0IHN0dWZmcy4uICAqLworCisJLyogTm93IHNldCB1cCB0aGUgcG9pbnRlcnMgdG8gcG9pbnQgdG8gdGhlIGFwcHJvcHJpYXRlIHBsYWNlcyAqLworCWxwLT5jZGEgPSBscC0+c29uaWNfZGVzYzsKKwlscC0+dGRhID0gbHAtPmNkYSArIChTSVpFT0ZfU09OSUNfQ0RBICogU09OSUNfQlVTX1NDQUxFKGxwLT5kbWFfYml0bW9kZSkpOworCWxwLT5yZGEgPSBscC0+dGRhICsgKFNJWkVPRl9TT05JQ19URCAqIFNPTklDX05VTV9URFMKKwkJCSAgICAgKiBTT05JQ19CVVNfU0NBTEUobHAtPmRtYV9iaXRtb2RlKSk7CisJbHAtPnJyYSA9IGxwLT5yZGEgKyAoU0laRU9GX1NPTklDX1JEICogU09OSUNfTlVNX1JEUworCQkJICAgICAqIFNPTklDX0JVU19TQ0FMRShscC0+ZG1hX2JpdG1vZGUpKTsKKworI2VuZGlmCisJCisJbWVtc2V0KGxwLCAwLCBzaXplb2Yoc3RydWN0IHNvbmljX2xvY2FsKSk7CisKKwlscC0+Y2RhX2xhZGRyID0gKHVuc2lnbmVkIGludCkmKGxwLT5jZGEpOworCWxwLT50ZGFfbGFkZHIgPSAodW5zaWduZWQgaW50KWxwLT50ZGE7CisJbHAtPnJyYV9sYWRkciA9ICh1bnNpZ25lZCBpbnQpbHAtPnJyYTsKKwlscC0+cmRhX2xhZGRyID0gKHVuc2lnbmVkIGludClscC0+cmRhOworCisJLyogRklYTUUsIG1heWJlIHdlIHNob3VsZCB1c2Ugc2ticyAqLworCWlmICgobHAtPnJiYSA9IChjaGFyICopCisJICAgICBrbWFsbG9jKFNPTklDX05VTV9SUlMgKiBTT05JQ19SQlNJWkUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZG4ndCBhbGxvY2F0ZSByZWNlaXZlIGJ1ZmZlcnNcbiIsIGRldi0+bmFtZSk7CisJCWRldi0+cHJpdiA9IE5VTEw7CisJCWtmcmVlKGxwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbHAtPnJiYV9sYWRkciA9ICh1bnNpZ25lZCBpbnQpbHAtPnJiYTsKKworCXsKKwkJaW50IHJzLCBkczsKKworCQkvKiBhbG1vc3QgYWx3YXlzIDEyKjQwOTYsIGJ1dCBsZXQncyBub3QgdGFrZSBjaGFuY2VzICovCisJCXJzID0gKChTT05JQ19OVU1fUlJTICogU09OSUNfUkJTSVpFICsgNDA5NSkgLyA0MDk2KSAqIDQwOTY7CisJCS8qIGFsbW9zdCBhbHdheXMgdW5kZXIgYSBwYWdlLCBidXQgbGV0J3Mgbm90IHRha2UgY2hhbmNlcyAqLworCQlkcyA9ICgoc2l6ZW9mKHN0cnVjdCBzb25pY19sb2NhbCkgKyA0MDk1KSAvIDQwOTYpICogNDA5NjsKKwkJa2VybmVsX3NldF9jYWNoZW1vZGUobHAtPnJiYSwgcnMsIElPTUFQX05PQ0FDSEVfU0VSKTsKKwkJa2VybmVsX3NldF9jYWNoZW1vZGUobHAsIGRzLCBJT01BUF9OT0NBQ0hFX1NFUik7CisJfQorCQorI2lmIDAKKwlmbHVzaF9jYWNoZV9hbGwoKTsKKyNlbmRpZgorCisJZGV2LT5vcGVuID0gc29uaWNfb3BlbjsKKwlkZXYtPnN0b3AgPSBzb25pY19jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHNvbmljX3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzID0gc29uaWNfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNvbmljX211bHRpY2FzdF9saXN0OworCisJLyoKKwkgKiBjbGVhciB0YWxseSBjb3VudGVyCisJICovCisJc29uaWNfd3JpdGUoZGV2LCBTT05JQ19DUkNULCAweGZmZmYpOworCXNvbmljX3dyaXRlKGRldiwgU09OSUNfRkFFVCwgMHhmZmZmKTsKKwlzb25pY193cml0ZShkZXYsIFNPTklDX01QVCwgMHhmZmZmKTsKKworCXJldHVybiAwOworfQorCitpbnQgX19pbml0IG1hY19vbmJvYXJkX3NvbmljX2V0aGVybmV0X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwljb25zdCBpbnQgcHJvbV9hZGRyID0gT05CT0FSRF9TT05JQ19QUk9NX0JBU0U7CisJaW50IGk7CisKKwkvKiBPbiBOdUJ1cyBib2FyZHMgd2UgY2FuIHNvbWV0aW1lcyBsb29rIGluIHRoZSBST00gcmVzb3VyY2VzLgorCSAgIE5vIHN1Y2ggbHVjayBmb3IgY29tbS1zbG90L29uYm9hcmQuICovCisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gU09OSUNfUkVBRF9QUk9NKGkpOworCisJLyogTW9zdCBvZiB0aGUgdGltZSwgdGhlIGFkZHJlc3MgaXMgYml0LXJldmVyc2VkLiAgVGhlIE5ldEJTRAorCSAgIHNvdXJjZSBoYXMgYSByYXRoZXIgbG9uZyBhbmQgZGV0YWlsZWQgaGlzdG9yaWNhbCBhY2NvdW50IG9mCisJICAgd2h5IHRoaXMgaXMgc28uICovCisJaWYgKG1lbWNtcChkZXYtPmRldl9hZGRyLCAiXHgwOFx4MDBceDA3IiwgMykgJiYKKwkgICAgbWVtY21wKGRldi0+ZGV2X2FkZHIsICJceDAwXHhBMFx4NDAiLCAzKSAmJgorCSAgICBtZW1jbXAoZGV2LT5kZXZfYWRkciwgIlx4MDBceDA1XHgwMiIsIDMpKQorCQliaXRfcmV2ZXJzZV9hZGRyKGRldi0+ZGV2X2FkZHIpOworCWVsc2UKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiB3ZSBzdGlsbCBoYXZlIHdoYXQgc2VlbXMgdG8gYmUgYSBib2d1cyBhZGRyZXNzLCB3ZSdsbAorICAgICAgICAgICBsb29rIGluIHRoZSBDQU0uICBUaGUgdG9wIGVudHJ5IHNob3VsZCBiZSBvdXJzLiAqLworCS8qIERhbmdlciEgVGhpcyBvbmx5IHdvcmtzIGlmIE1hY09TIGhhcyBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgICAgICAgIHRoZSBjYXJkLi4uICovCisJaWYgKG1lbWNtcChkZXYtPmRldl9hZGRyLCAiXHgwOFx4MDBceDA3IiwgMykgJiYKKwkgICAgbWVtY21wKGRldi0+ZGV2X2FkZHIsICJceDAwXHhBMFx4NDAiLCAzKSAmJgorCSAgICBtZW1jbXAoZGV2LT5kZXZfYWRkciwgIlx4MDBceDA1XHgwMiIsIDMpKQorCXsKKwkJdW5zaWduZWQgc2hvcnQgdmFsOworCisJCXByaW50ayhLRVJOX0lORk8gIm1hY3NvbmljOiBQUk9NIHNlZW1zIHRvIGJlIHdyb25nLCB0cnlpbmcgQ0FNIGVudHJ5IDE1XG4iKTsKKwkJCisJCXNvbmljX3dyaXRlKGRldiwgU09OSUNfQ01ELCBTT05JQ19DUl9SU1QpOworCQlzb25pY193cml0ZShkZXYsIFNPTklDX0NFUCwgMTUpOworCisJCXZhbCA9IHNvbmljX3JlYWQoZGV2LCBTT05JQ19DQVAyKTsKKwkJZGV2LT5kZXZfYWRkcls1XSA9IHZhbCA+PiA4OworCQlkZXYtPmRldl9hZGRyWzRdID0gdmFsICYgMHhmZjsKKwkJdmFsID0gc29uaWNfcmVhZChkZXYsIFNPTklDX0NBUDEpOworCQlkZXYtPmRldl9hZGRyWzNdID0gdmFsID4+IDg7CisJCWRldi0+ZGV2X2FkZHJbMl0gPSB2YWwgJiAweGZmOworCQl2YWwgPSBzb25pY19yZWFkKGRldiwgU09OSUNfQ0FQMCk7CisJCWRldi0+ZGV2X2FkZHJbMV0gPSB2YWwgPj4gODsKKwkJZGV2LT5kZXZfYWRkclswXSA9IHZhbCAmIDB4ZmY7CisJCQorCQlwcmludGsoS0VSTl9JTkZPICJIVyBBZGRyZXNzIGZyb20gQ0FNIDE1OiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJcHJpbnRrKCIlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCQkJaWYgKGkgPCA1KQorCQkJCXByaW50aygiOiIpOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9IGVsc2UgcmV0dXJuIDA7CisKKwlpZiAobWVtY21wKGRldi0+ZGV2X2FkZHIsICJceDA4XHgwMFx4MDciLCAzKSAmJgorCSAgICBtZW1jbXAoZGV2LT5kZXZfYWRkciwgIlx4MDBceEEwXHg0MCIsIDMpICYmCisJICAgIG1lbWNtcChkZXYtPmRldl9hZGRyLCAiXHgwMFx4MDVceDAyIiwgMykpCisJeworCQkvKgorCQkgKiBTdGlsbCBub25zZW5zZSAuLi4gbWVzc2VkIHVwIHNvbWVwbGFjZSEKKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAibWFjc29uaWM6IEVSUk9SIChJTlZBTElEIE1BQylcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9IGVsc2UgcmV0dXJuIDA7Cit9CisKK2ludCBfX2luaXQgbWFjX29uYm9hcmRfc29uaWNfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwkvKiBCd2FoYWhhaGEgKi8KKwlzdGF0aWMgaW50IG9uY2VfaXNfbW9yZV90aGFuX2Vub3VnaDsKKwlpbnQgaTsKKwlpbnQgZG1hX2JpdG1vZGU7CisJCisJaWYgKG9uY2VfaXNfbW9yZV90aGFuX2Vub3VnaCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJb25jZV9pc19tb3JlX3RoYW5fZW5vdWdoID0gMTsKKworCWlmICghTUFDSF9JU19NQUMpCisJCXJldHVybiAtRU5PREVWOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQ2hlY2tpbmcgZm9yIGludGVybmFsIE1hY2ludG9zaCBldGhlcm5ldCAoU09OSUMpLi4gIik7CisKKwlpZiAobWFjaW50b3NoX2NvbmZpZy0+ZXRoZXJfdHlwZSAhPSBNQUNfRVRIRVJfU09OSUMpCisJeworCQlwcmludGsoIm5vbmUuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogQm9ndXMgcHJvYmluZywgb24gdGhlIG1vZGVscyB3aGljaCBtYXkgb3IgbWF5IG5vdCBoYXZlCisJICAgRXRoZXJuZXQgKEJUVywgdGhlIEV0aGVybmV0ICppcyogYWx3YXlzIGF0IHRoZSBzYW1lCisJICAgYWRkcmVzcywgYW5kIG5vdGhpbmcgZWxzZSBsaXZlcyB0aGVyZSwgYXQgbGVhc3QgaWYgQXBwbGUncworCSAgIGRvY3VtZW50YXRpb24gaXMgdG8gYmUgYmVsaWV2ZWQpICovCisJaWYgKG1hY2ludG9zaF9jb25maWctPmlkZW50ID09IE1BQ19NT0RFTF9RNjMwIHx8CisJICAgIG1hY2ludG9zaF9jb25maWctPmlkZW50ID09IE1BQ19NT0RFTF9QNTg4IHx8CisJICAgIG1hY2ludG9zaF9jb25maWctPmlkZW50ID09IE1BQ19NT0RFTF9DNjEwKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCWludCBjYXJkX3ByZXNlbnQ7CisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQljYXJkX3ByZXNlbnQgPSBod3JlZ19wcmVzZW50KCh2b2lkKilPTkJPQVJEX1NPTklDX1JFR0lTVEVSUyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCQlpZiAoIWNhcmRfcHJlc2VudCkgeworCQkJcHJpbnRrKCJub25lLlxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCXByaW50aygieWVzXG4iKTsJCisKKwkvKiBEYW5nZXIhICBNeSBhcm1zIGFyZSBmbGFpbGluZyB3aWxkbHkhICBZb3UgKm11c3QqIHNldCB0aGlzCisgICAgICAgICAgIGJlZm9yZSB1c2luZyBzb25pY19yZWFkKCkgKi8KKworCWRldi0+YmFzZV9hZGRyID0gT05CT0FSRF9TT05JQ19SRUdJU1RFUlM7CisJaWYgKHZpYV9hbHRfbWFwcGluZykKKwkJZGV2LT5pcnEgPSBJUlFfQVVUT18zOworCWVsc2UKKwkJZGV2LT5pcnEgPSBJUlFfTlVCVVNfOTsKKworCWlmICghc29uaWNfdmVyc2lvbl9wcmludGVkKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisJCXNvbmljX3ZlcnNpb25fcHJpbnRlZCA9IDE7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBvbmJvYXJkIC8gY29tbS1zbG90IFNPTklDIGF0IDB4JTA4bHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIpOworCisJLyogTm93IGRvIGEgc29uZyBhbmQgZGFuY2Ugcm91dGluZSBpbiBhbiBhdHRlbXB0IHRvIGRldGVybWluZQorICAgICAgICAgICB0aGUgYnVzIHdpZHRoICovCisKKwkvKiBUaGUgUG93ZXJCb29rJ3MgU09OSUMgaXMgMTYgYml0IGFsd2F5cy4gKi8KKwlpZiAobWFjaW50b3NoX2NvbmZpZy0+aWRlbnQgPT0gTUFDX01PREVMX1BCNTIwKSB7CisJCXJlZ19vZmZzZXQgPSAwOworCQlkbWFfYml0bW9kZSA9IDA7CisJfSBlbHNlIGlmIChtYWNpbnRvc2hfY29uZmlnLT5pZGVudCA9PSBNQUNfTU9ERUxfQzYxMCkgeworCQlyZWdfb2Zmc2V0ID0gMDsKKwkJZG1hX2JpdG1vZGUgPSAxOworCX0gZWxzZSB7CisJCS8qIFNvbWUgb2YgdGhlIGNvbW0tc2xvdCBjYXJkcyBhcmUgMTYgYml0LiAgQnV0IHNvbWUKKyAgICAgICAgICAgICAgICAgICBvZiB0aGVtIGFyZSBub3QuICBUaGUgMzItYml0IGNhcmRzIHVzZSBvZmZzZXQgMiBhbmQKKyAgICAgICAgICAgICAgICAgICBwYWQgd2l0aCB6ZXJvZXMgb3Igc29tZXRpbWVzIG9uZXMgKEkgdGhpbmsuLi4pCisgICAgICAgICAgICAgICAgICAgVGhlcmVmb3JlLCBpZiB3ZSB0cnkgb2Zmc2V0IDAgYW5kIGdldCBhIHNpbGljb24KKyAgICAgICAgICAgICAgICAgICByZXZpc2lvbiBvZiAwLCB3ZSBhc3N1bWUgMTYgYml0LiAqLworCQlpbnQgc3I7CisKKwkJLyogVGVjaG5pY2FsbHkgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IHNpbmNlIHdlIHplcm9lZAorICAgICAgICAgICAgICAgICAgIGl0IGFib3ZlICovCisJCXJlZ19vZmZzZXQgPSAwOworCQlkbWFfYml0bW9kZSA9IDA7CisJCXNyID0gc29uaWNfcmVhZChkZXYsIFNPTklDX1NSKTsKKwkJaWYgKHNyID09IDAgfHwgc3IgPT0gMHhmZmZmKSB7CisJCQlyZWdfb2Zmc2V0ID0gMjsKKwkJCS8qIDgzOTMyIGlzIDB4MDAwNCwgODM5MzQgaXMgMHgwMTAwIG9yIDB4MDEwMSAqLworCQkJc3IgPSBzb25pY19yZWFkKGRldiwgU09OSUNfU1IpOworCQkJZG1hX2JpdG1vZGUgPSAxOworCQkJCisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiByZXZpc2lvbiAweCUwNHgsIHVzaW5nICVkIGJpdCBETUEgYW5kIHJlZ2lzdGVyIG9mZnNldCAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgc3IsIGRtYV9iaXRtb2RlPzMyOjE2LCByZWdfb2Zmc2V0KTsKKwl9CisJCisKKwkvKiB0aGlzIGNhcnJpZXMgbXkgc2luY2VyZSBhcG9sb2dpZXMgLS0gYnkgdGhlIHRpbWUgSSBnb3QgdG8gdXBkYXRpbmcKKwkgICB0aGUgZHJpdmVyLCBzdXBwb3J0IGZvciAicmVnX29mZnNldHMiIGFwcGVhcmVzIG5vd2hlcmUgaW4gdGhlIHNvbmljCisJICAgY29kZSwgZ29pbmcgYmFjayBmb3Igb3ZlciBhIHllYXIuICBGb3J0dW5hdGVseSwgbXkgTWFjIGRvZXMndCBzZWVtCisJICAgdG8gdXNlIHdoYXRldmVyIHRoaXMgd2FzLgorCisJICAgSWYgeW91IGtub3cgaG93IHRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgaW1wbGVtZW50ZWQsIGVpdGhlciBmaXggaXQsCisJICAgb3IgY29udGFjdCBtZSAoc2FtbXlAb2gudmVyaW8uY29tKSB0byBleHBsYWluIHdoYXQgaXQgaXMuIC0tU2FtICovCisJICAgCisJaWYocmVnX29mZnNldCkgeworCQlwcmludGsoIiVzOiByZWdpc3RlciBvZmZzZXQgdW5zdXBwb3J0ZWQuICBwbGVhc2UgZml4IHRoaXMgaWYgeW91IGtub3cgd2hhdCBpdCBpcy5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkKKwkvKiBTb2Z0d2FyZSByZXNldCwgdGhlbiBpbml0aWFsaXplIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCXNvbmljX3dyaXRlKGRldiwgU09OSUNfQ01ELCBTT05JQ19DUl9SU1QpOworCXNvbmljX3dyaXRlKGRldiwgU09OSUNfRENSLCBTT05JQ19EQ1JfQk1TIHwKKwkJICAgIFNPTklDX0RDUl9SRlQxIHwgU09OSUNfRENSX1RGVDAgfCBTT05JQ19EQ1JfRVhCVVMgfAorCQkgICAgKGRtYV9iaXRtb2RlID8gU09OSUNfRENSX0RXIDogMCkpOworCisJLyogVGhpcyAqbXVzdCogYmUgd3JpdHRlbiBiYWNrIHRvIGluIG9yZGVyIHRvIHJlc3RvcmUgdGhlCisgICAgICAgICAgIGV4dGVuZGVkIHByb2dyYW1tYWJsZSBvdXRwdXQgYml0cyAqLworCXNvbmljX3dyaXRlKGRldiwgU09OSUNfRENSMiwgMCk7CisKKwkvKiBDbGVhciAqYW5kKiBkaXNhYmxlIGludGVycnVwdHMgdG8gYmUgb24gdGhlIHNhZmUgc2lkZSAqLworCXNvbmljX3dyaXRlKGRldiwgU09OSUNfSVNSLDB4N2ZmZik7CisJc29uaWNfd3JpdGUoZGV2LCBTT05JQ19JTVIsMCk7CisKKwkvKiBOb3cgbG9vayBmb3IgdGhlIE1BQyBhZGRyZXNzLiAqLworCWlmIChtYWNfb25ib2FyZF9zb25pY19ldGhlcm5ldF9hZGRyKGRldikgIT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcmludGsoS0VSTl9JTkZPICJNQUMgIik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlwcmludGsoIiUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJCWlmIChpIDwgNSkKKwkJCXByaW50aygiOiIpOworCX0KKworCXByaW50aygiIElSUSAlZFxuIiwgZGV2LT5pcnEpOworCisJLyogU2hhcmVkIGluaXQgY29kZSAqLworCXJldHVybiBtYWNzb25pY19pbml0KGRldik7Cit9CisKK2ludCBfX2luaXQgbWFjX251YnVzX3NvbmljX2V0aGVybmV0X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgcHJvbV9hZGRyLAorCQkJCQkgaW50IGlkKQoreworCWludCBpOworCWZvcihpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IFNPTklDX1JFQURfUFJPTShpKTsKKwkvKiBGb3Igbm93IHdlIGFyZSBnb2luZyB0byBhc3N1bWUgdGhhdCB0aGV5J3JlIGFsbCBiaXQtcmV2ZXJzZWQgKi8KKwliaXRfcmV2ZXJzZV9hZGRyKGRldi0+ZGV2X2FkZHIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2luaXQgbWFjc29uaWNfaWRlbnQoc3RydWN0IG51YnVzX2RldiogbmRldikKK3sKKwlpZiAobmRldi0+ZHJfaHcgPT0gTlVCVVNfRFJIV19BU0FOVEVfTEMgJiYgCisJICAgIG5kZXYtPmRyX3N3ID09IE5VQlVTX0RSU1dfU09OSUNfTEMpCisJCXJldHVybiBNQUNTT05JQ19EQVlOQUxJTks7CisJaWYgKG5kZXYtPmRyX2h3ID09IE5VQlVTX0RSSFdfU09OSUMgJiYKKwkgICAgbmRldi0+ZHJfc3cgPT0gTlVCVVNfRFJTV19BUFBMRSkgeworCQkvKiBUaGVyZSBoYXMgdG8gYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMuLi4gKi8KKwkJaWYgKHN0cnN0cihuZGV2LT5ib2FyZC0+bmFtZSwgIkR1b0RvY2siKSkKKwkJCXJldHVybiBNQUNTT05JQ19EVU9ET0NLOworCQllbHNlCisJCQlyZXR1cm4gTUFDU09OSUNfQVBQTEU7CisJfQorCXJldHVybiAtMTsKK30KKworaW50IF9faW5pdCBtYWNfbnVidXNfc29uaWNfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdGF0aWMgaW50IHNsb3RzOworCXN0cnVjdCBudWJ1c19kZXYqIG5kZXYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyLCBwcm9tX2FkZHI7CisJdTE2IHNvbmljX2RjcjsKKwlpbnQgaWQ7CisJaW50IGk7CisJaW50IGRtYV9iaXRtb2RlOworCisJLyogRmluZCB0aGUgZmlyc3QgU09OSUMgdGhhdCBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCBhbHJlYWR5ICovCisJd2hpbGUgKChuZGV2ID0gbnVidXNfZmluZF90eXBlKE5VQlVTX0NBVF9ORVRXT1JLLAorCQkJCSAgICAgICBOVUJVU19UWVBFX0VUSEVSTkVULCBuZGV2KSkgIT0gTlVMTCkKKwl7CisJCS8qIEhhdmUgd2Ugc2VlbiBpdCBhbHJlYWR5PyAqLworCQlpZiAoc2xvdHMgJiAoMTw8bmRldi0+Ym9hcmQtPnNsb3QpKQorCQkJY29udGludWU7CisJCXNsb3RzIHw9IDE8PG5kZXYtPmJvYXJkLT5zbG90OworCisJCS8qIElzIGl0IG9uZSBvZiBvdXJzPyAqLworCQlpZiAoKGlkID0gbWFjc29uaWNfaWRlbnQobmRldikpICE9IC0xKQorCQkJYnJlYWs7CisJfQorCisJaWYgKG5kZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBNQUNTT05JQ19EVU9ET0NLOgorCQliYXNlX2FkZHIgPSBuZGV2LT5ib2FyZC0+c2xvdF9hZGRyICsgRFVPRE9DS19TT05JQ19SRUdJU1RFUlM7CisJCXByb21fYWRkciA9IG5kZXYtPmJvYXJkLT5zbG90X2FkZHIgKyBEVU9ET0NLX1NPTklDX1BST01fQkFTRTsKKwkJc29uaWNfZGNyID0gU09OSUNfRENSX0VYQlVTIHwgU09OSUNfRENSX1JGVDAgfCBTT05JQ19EQ1JfUkZUMQorCQkJfCBTT05JQ19EQ1JfVEZUMDsKKwkJcmVnX29mZnNldCA9IDI7CisJCWRtYV9iaXRtb2RlID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNQUNTT05JQ19BUFBMRToKKwkJYmFzZV9hZGRyID0gbmRldi0+Ym9hcmQtPnNsb3RfYWRkciArIEFQUExFX1NPTklDX1JFR0lTVEVSUzsKKwkJcHJvbV9hZGRyID0gbmRldi0+Ym9hcmQtPnNsb3RfYWRkciArIEFQUExFX1NPTklDX1BST01fQkFTRTsKKwkJc29uaWNfZGNyID0gU09OSUNfRENSX0JNUyB8IFNPTklDX0RDUl9SRlQxIHwgU09OSUNfRENSX1RGVDA7CisJCXJlZ19vZmZzZXQgPSAwOworCQlkbWFfYml0bW9kZSA9IDE7CisJCWJyZWFrOworCWNhc2UgTUFDU09OSUNfQVBQTEUxNjoKKwkJYmFzZV9hZGRyID0gbmRldi0+Ym9hcmQtPnNsb3RfYWRkciArIEFQUExFX1NPTklDX1JFR0lTVEVSUzsKKwkJcHJvbV9hZGRyID0gbmRldi0+Ym9hcmQtPnNsb3RfYWRkciArIEFQUExFX1NPTklDX1BST01fQkFTRTsKKwkJc29uaWNfZGNyID0gU09OSUNfRENSX0VYQlVTCisgCQkJfCBTT05JQ19EQ1JfUkZUMSB8IFNPTklDX0RDUl9URlQwCisJCQl8IFNPTklDX0RDUl9QTzEgfCBTT05JQ19EQ1JfQk1TOyAKKwkJcmVnX29mZnNldCA9IDA7CisJCWRtYV9iaXRtb2RlID0gMDsKKwkJYnJlYWs7CisJY2FzZSBNQUNTT05JQ19EQVlOQUxJTks6CisJCWJhc2VfYWRkciA9IG5kZXYtPmJvYXJkLT5zbG90X2FkZHIgKyBBUFBMRV9TT05JQ19SRUdJU1RFUlM7CisJCXByb21fYWRkciA9IG5kZXYtPmJvYXJkLT5zbG90X2FkZHIgKyBEQVlOQUxJTktfUFJPTV9CQVNFOworCQlzb25pY19kY3IgPSBTT05JQ19EQ1JfUkZUMSB8IFNPTklDX0RDUl9URlQwCisJCQl8IFNPTklDX0RDUl9QTzEgfCBTT05JQ19EQ1JfQk1TOyAKKwkJcmVnX29mZnNldCA9IDA7CisJCWRtYV9iaXRtb2RlID0gMDsKKwkJYnJlYWs7CisJY2FzZSBNQUNTT05JQ19EQVlOQToKKwkJYmFzZV9hZGRyID0gbmRldi0+Ym9hcmQtPnNsb3RfYWRkciArIERBWU5BX1NPTklDX1JFR0lTVEVSUzsKKwkJcHJvbV9hZGRyID0gbmRldi0+Ym9hcmQtPnNsb3RfYWRkciArIERBWU5BX1NPTklDX01BQ19BRERSOworCQlzb25pY19kY3IgPSBTT05JQ19EQ1JfQk1TCisJCQl8IFNPTklDX0RDUl9SRlQxIHwgU09OSUNfRENSX1RGVDAgfCBTT05JQ19EQ1JfUE8xOworCQlyZWdfb2Zmc2V0ID0gMDsKKwkJZG1hX2JpdG1vZGUgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIm1hY3NvbmljOiBXVEYsIGlkIGlzICVkXG4iLCBpZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIERhbmdlciEgIE15IGFybXMgYXJlIGZsYWlsaW5nIHdpbGRseSEgIFlvdSAqbXVzdCogc2V0IHRoaXMKKyAgICAgICAgICAgYmVmb3JlIHVzaW5nIHNvbmljX3JlYWQoKSAqLworCWRldi0+YmFzZV9hZGRyID0gYmFzZV9hZGRyOworCWRldi0+aXJxID0gU0xPVDJJUlEobmRldi0+Ym9hcmQtPnNsb3QpOworCisJaWYgKCFzb25pY192ZXJzaW9uX3ByaW50ZWQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKwkJc29uaWNfdmVyc2lvbl9wcmludGVkID0gMTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGluIHNsb3QgJVhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgbmRldi0+Ym9hcmQtPm5hbWUsIG5kZXYtPmJvYXJkLT5zbG90KTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogcmV2aXNpb24gMHglMDR4LCB1c2luZyAlZCBiaXQgRE1BIGFuZCByZWdpc3RlciBvZmZzZXQgJWRcbiIsCisJICAgICAgIGRldi0+bmFtZSwgc29uaWNfcmVhZChkZXYsIFNPTklDX1NSKSwgZG1hX2JpdG1vZGU/MzI6MTYsIHJlZ19vZmZzZXQpOworCisJaWYocmVnX29mZnNldCkgeworCQlwcmludGsoIiVzOiByZWdpc3RlciBvZmZzZXQgdW5zdXBwb3J0ZWQuICBwbGVhc2UgZml4IHRoaXMgaWYgeW91IGtub3cgd2hhdCBpdCBpcy5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFNvZnR3YXJlIHJlc2V0LCB0aGVuIGluaXRpYWxpemUgY29udHJvbCByZWdpc3RlcnMuICovCisJc29uaWNfd3JpdGUoZGV2LCBTT05JQ19DTUQsIFNPTklDX0NSX1JTVCk7CisJc29uaWNfd3JpdGUoZGV2LCBTT05JQ19EQ1IsIHNvbmljX2RjcgorCQkgICAgfCAoZG1hX2JpdG1vZGUgPyBTT05JQ19EQ1JfRFcgOiAwKSk7CisKKwkvKiBDbGVhciAqYW5kKiBkaXNhYmxlIGludGVycnVwdHMgdG8gYmUgb24gdGhlIHNhZmUgc2lkZSAqLworCXNvbmljX3dyaXRlKGRldiwgU09OSUNfSVNSLDB4N2ZmZik7CisJc29uaWNfd3JpdGUoZGV2LCBTT05JQ19JTVIsMCk7CisKKwkvKiBOb3cgbG9vayBmb3IgdGhlIE1BQyBhZGRyZXNzLiAqLworCWlmIChtYWNfbnVidXNfc29uaWNfZXRoZXJuZXRfYWRkcihkZXYsIHByb21fYWRkciwgaWQpICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJcHJpbnRrKEtFUk5fSU5GTyAiTUFDICIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJcHJpbnRrKCIlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCQlpZiAoaSA8IDUpCisJCQlwcmludGsoIjoiKTsKKwl9CisJcHJpbnRrKCIgSVJRICVkXG4iLCBkZXYtPmlycSk7CisKKwkvKiBTaGFyZWQgaW5pdCBjb2RlICovCisJcmV0dXJuIG1hY3NvbmljX2luaXQoZGV2KTsKK30KKworI2lmZGVmIE1PRFVMRQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfbWFjc29uaWM7CisKK01PRFVMRV9QQVJNKHNvbmljX2RlYnVnLCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhzb25pY19kZWJ1ZywgIm1hY3NvbmljIGRlYnVnIGxldmVsICgxLTQpIik7CisKK2ludAoraW5pdF9tb2R1bGUodm9pZCkKK3sKKyAgICAgICAgZGV2X21hY3NvbmljID0gbWFjc29uaWNfcHJvYmUoLTEpOworCWlmIChJU19FUlIoZGV2X21hY3NvbmljKSkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIm1hY3NvbmljLmM6IE5vIGNhcmQgZm91bmRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihkZXZfbWFjc29uaWMpOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZAorY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfbWFjc29uaWMpOworCWtmcmVlKGRldl9tYWNzb25pYy0+cHJpdik7CisJZnJlZV9uZXRkZXYoZGV2X21hY3NvbmljKTsKK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworCisjZGVmaW5lIHZkbWFfYWxsb2MoZm9vLCBiYXIpICgodTMyKWZvbykKKyNkZWZpbmUgdmRtYV9mcmVlKGJheikKKyNkZWZpbmUgc29uaWNfY2hpcHRvbWVtKGJhdCkgKGJhdCkKKyNkZWZpbmUgUEhZU0FERFIocXV1eCkgKHF1dXgpCisjZGVmaW5lIENQSFlTQUREUihxdXV4KSAocXV1eCkKKworI2RlZmluZSBzb25pY19yZXF1ZXN0X2lycSAgICAgICByZXF1ZXN0X2lycQorI2RlZmluZSBzb25pY19mcmVlX2lycSAgICAgICAgICBmcmVlX2lycQorCisjaW5jbHVkZSAic29uaWMuYyIKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJtNjhrLWxpbnV4LWdjYyAtRF9fS0VSTkVMX18gLUkuLi8uLi9pbmNsdWRlIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1waXBlIC1mbm8tc3RyZW5ndGgtcmVkdWNlIC1mZml4ZWQtYTIgLURNT0RVTEUgLURNT0RWRVJTSU9OUyAtaW5jbHVkZSAuLi8uLi9pbmNsdWRlL2xpbnV4L21vZHZlcnNpb25zLmggICAtYyAtbyBtYWNzb25pYy5vIG1hY3NvbmljLmMiCisgKiAgdmVyc2lvbi1jb250cm9sOiB0CisgKiAga2VwdC1uZXctdmVyc2lvbnM6IDUKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWV0aC5jIGIvZHJpdmVycy9uZXQvbWV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzY1NWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9tZXRoLmMKQEAgLTAsMCArMSw4NDMgQEAKKy8qCisgKiBtZXRoLmMgLS0gTzIgQnVpbHRpbiAxMC8xMDAgRXRoZXJuZXQgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgSWx5YSBWb2x5bmV0cworICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAvKiBwcmludGsoKSAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+ICAvKiBlcnJvciBjb2RlcyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+ICAvKiBzaXplX3QgKi8KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4gLyogbWFya19iaCAqLworCisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4gLyogc3RydWN0IGRldmljZSwgZXQgYWwgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4gICAvKiBzdHJ1Y3QgZGV2aWNlLCBhbmQgb3RoZXIgaGVhZGVycyAqLworI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+IC8qIGV0aF90eXBlX3RyYW5zICovCisjaW5jbHVkZSA8bGludXgvaXAuaD4gICAgICAgICAgLyogc3RydWN0IGlwaGRyICovCisjaW5jbHVkZSA8bGludXgvdGNwLmg+ICAgICAgICAgLyogc3RydWN0IHRjcGhkciAqLworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPiAgICAgICAgIC8qIE1JSSBkZWZpbml0aW9ucyAqLworCisjaW5jbHVkZSA8YXNtL2lwMzIvbWFjZS5oPgorI2luY2x1ZGUgPGFzbS9pcDMyL2lwMzJfaW50cy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgIm1ldGguaCIKKworI2lmbmRlZiBNRkVfREVCVUcKKyNkZWZpbmUgTUZFX0RFQlVHIDAKKyNlbmRpZgorCisjaWYgTUZFX0RFQlVHPj0xCisjZGVmaW5lIERQUklOVEsoc3RyLGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHICJtZXRoOiAlczogIiBzdHIsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCisjZGVmaW5lIE1GRV9SWF9ERUJVRyAyCisjZWxzZQorI2RlZmluZSBEUFJJTlRLKHN0cixhcmdzLi4uKQorI2RlZmluZSBNRkVfUlhfREVCVUcgMAorI2VuZGlmCisKKworc3RhdGljIGNvbnN0IGNoYXIgKm1ldGhfc3RyPSJTR0kgTzIgRmFzdCBFdGhlcm5ldCI7CitNT0RVTEVfQVVUSE9SKCJJbHlhIFZvbHluZXRzIDxpbHlhQHRoZUlseWEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTR0kgTzIgQnVpbHRpbiBGYXN0IEV0aGVybmV0IGRyaXZlciIpOworCisjZGVmaW5lIEhBVkVfVFhfVElNRU9VVAorLyogVGhlIG1heGltdW0gdGltZSB3YWl0ZWQgKGluIGppZmZpZXMpIGJlZm9yZSBhc3N1bWluZyBhIFR4IGZhaWxlZC4gKDQwMG1zKSAqLworI2RlZmluZSBUWF9USU1FT1VUICg0MDAqSFovMTAwMCkKKworI2lmZGVmIEhBVkVfVFhfVElNRU9VVAorc3RhdGljIGludCB0aW1lb3V0ID0gVFhfVElNRU9VVDsKK01PRFVMRV9QQVJNKHRpbWVvdXQsICJpIik7CisjZW5kaWYKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHByaXZhdGUgdG8gZWFjaCBkZXZpY2UuIEl0IGlzIHVzZWQgdG8gcGFzcworICogcGFja2V0cyBpbiBhbmQgb3V0LCBzbyB0aGVyZSBpcyBwbGFjZSBmb3IgYSBwYWNrZXQKKyAqLworc3RydWN0IG1ldGhfcHJpdmF0ZSB7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJLyogaW4tbWVtb3J5IGNvcHkgb2YgTUFDIENvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBsb25nIG1hY19jdHJsOworCS8qIGluLW1lbW9yeSBjb3B5IG9mIERNQSBDb250cm9sIHJlZ2lzdGVyICovCisJdW5zaWduZWQgbG9uZyBkbWFfY3RybDsKKwkvKiBhZGRyZXNzIG9mIFBIWSwgdXNlZCBieSBtZGlvXyogZnVuY3Rpb25zLCBpbml0aWFsaXplZCBpbiBtZGlvX3Byb2JlICovCisJdW5zaWduZWQgbG9uZyBwaHlfYWRkcjsKKwl0eF9wYWNrZXQgKnR4X3Jpbmc7CisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tic1tUWF9SSU5HX0VOVFJJRVNdOworCWRtYV9hZGRyX3QgdHhfc2tiX2RtYXNbVFhfUklOR19FTlRSSUVTXTsKKwl1bnNpZ25lZCBsb25nIHR4X3JlYWQsIHR4X3dyaXRlLCB0eF9jb3VudDsKKworCXJ4X3BhY2tldCAqcnhfcmluZ1tSWF9SSU5HX0VOVFJJRVNdOworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWFzW1JYX1JJTkdfRU5UUklFU107CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYnNbUlhfUklOR19FTlRSSUVTXTsKKwl1bnNpZ25lZCBsb25nIHJ4X3dyaXRlOworCisJc3BpbmxvY2tfdCBtZXRoX2xvY2s7Cit9OworCitzdGF0aWMgdm9pZCBtZXRoX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgbWV0aF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcHJlZ3MpOworICAgICAgICAKKy8qIGdsb2JhbCwgaW5pdGlhbGl6ZWQgaW4gaXAzMi1zZXR1cC5jICovCitjaGFyIG8ybWV0aF9lYWRkcls4XT17MCwwLDAsMCwwLDAsMCwwfTsKKworc3RhdGljIGlubGluZSB2b2lkIGxvYWRfZWFkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlEUFJJTlRLKCJMb2FkaW5nIE1BQyBBZGRyZXNzOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJKGludClvMm1ldGhfZWFkZHJbMF0mMHhGRiwoaW50KW8ybWV0aF9lYWRkclsxXSYweEZGLChpbnQpbzJtZXRoX2VhZGRyWzJdJjB4RkYsCisJCShpbnQpbzJtZXRoX2VhZGRyWzNdJjB4RkYsKGludClvMm1ldGhfZWFkZHJbNF0mMHhGRiwoaW50KW8ybWV0aF9lYWRkcls1XSYweEZGKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gbzJtZXRoX2VhZGRyW2ldOworCW1hY2UtPmV0aC5tYWNfYWRkciA9ICgqKHVuc2lnbmVkIGxvbmcqKW8ybWV0aF9lYWRkcikgPj4gMTY7Cit9CisKKy8qCisgKiBXYWl0cyBmb3IgQlVTWSBzdGF0dXMgb2YgbWRpbyBidXMgdG8gY2xlYXIKKyAqLworI2RlZmluZSBXQUlUX0ZPUl9QSFkoX19fcnZhbCkJCQkJCVwKKwl3aGlsZSAoKF9fX3J2YWwgPSBtYWNlLT5ldGgucGh5X2RhdGEpICYgTURJT19CVVNZKSB7CVwKKwkJdWRlbGF5KDI1KTsJCQkJCVwKKwl9CisvKnJlYWQgcGh5IHJlZ2lzdGVyLCByZXR1cm4gdmFsdWUgcmVhZCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWRpb19yZWFkKHN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGxvbmcgcGh5cmVnKQoreworCXVuc2lnbmVkIGxvbmcgcnZhbDsKKwlXQUlUX0ZPUl9QSFkocnZhbCk7CisJbWFjZS0+ZXRoLnBoeV9yZWdzID0gKHByaXYtPnBoeV9hZGRyIDw8IDUpIHwgKHBoeXJlZyAmIDB4MWYpOworCXVkZWxheSgyNSk7CisJbWFjZS0+ZXRoLnBoeV90cmFuc19nbyA9IDE7CisJdWRlbGF5KDI1KTsKKwlXQUlUX0ZPUl9QSFkocnZhbCk7CisJcmV0dXJuIHJ2YWwgJiBNRElPX0RBVEFfTUFTSzsKK30KKworc3RhdGljIGludCBtZGlvX3Byb2JlKHN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBwMiwgcDM7CisJLyogY2hlY2sgaWYgcGh5IGlzIGRldGVjdGVkIGFscmVhZHkgKi8KKwlpZihwcml2LT5waHlfYWRkcj49MCYmcHJpdi0+cGh5X2FkZHI8MzIpCisJCXJldHVybiAwOworCXNwaW5fbG9jaygmcHJpdi0+bWV0aF9sb2NrKTsKKwlmb3IgKGk9MDtpPDMyOysraSl7CisJCXByaXYtPnBoeV9hZGRyPWk7CisJCXAyPW1kaW9fcmVhZChwcml2LDIpOworCQlwMz1tZGlvX3JlYWQocHJpdiwzKTsKKyNpZiBNRkVfREVCVUc+PTIKKwkJc3dpdGNoICgocDI8PDEyKXwocDM+PjQpKXsKKwkJY2FzZSBQSFlfUVM2NjEyWDoKKwkJCURQUklOVEsoIlBIWSBpcyBRUzY2MTJYXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV9JQ1MxODg5OgorCQkJRFBSSU5USygiUEhZIGlzIElDUzE4ODlcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZX0lDUzE4OTA6CisJCQlEUFJJTlRLKCJQSFkgaXMgSUNTMTg5MFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfRFA4Mzg0MDoKKwkJCURQUklOVEsoIlBIWSBpcyBEUDgzODQwXG4iKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJaWYocDIhPTB4ZmZmZiYmcDIhPTB4MDAwMCl7CisJCQlEUFJJTlRLKCJQSFkgY29kZTogJXhcbiIsKHAyPDwxMil8KHAzPj40KSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmcHJpdi0+bWV0aF9sb2NrKTsKKwlpZihwcml2LT5waHlfYWRkcjwzMikgeworCQlyZXR1cm4gMDsKKwl9CisJRFBSSU5USygiT29wc2llISBQSFkgaXMgbm90IGtub3duIVxuIik7CisJcHJpdi0+cGh5X2FkZHI9LTE7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIG1ldGhfY2hlY2tfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IG1ldGhfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBtaWlfYWR2ZXJ0aXNpbmcgPSBtZGlvX3JlYWQocHJpdiwgNCk7CisJdW5zaWduZWQgbG9uZyBtaWlfcGFydG5lciA9IG1kaW9fcmVhZChwcml2LCA1KTsKKwl1bnNpZ25lZCBsb25nIG5lZ290aWF0ZWQgPSBtaWlfYWR2ZXJ0aXNpbmcgJiBtaWlfcGFydG5lcjsKKwl1bnNpZ25lZCBsb25nIGR1cGxleCwgc3BlZWQ7CisKKwlpZiAobWlpX3BhcnRuZXIgPT0gMHhmZmZmKQorCQlyZXR1cm47CisKKwlzcGVlZCA9IChuZWdvdGlhdGVkICYgMHgwMzgwKSA/IE1FVEhfMTAwTUJJVCA6IDA7CisJZHVwbGV4ID0gKChuZWdvdGlhdGVkICYgMHgwMTAwKSB8fCAobmVnb3RpYXRlZCAmIDB4MDFDMCkgPT0gMHgwMDQwKSA/CisJCSBNRVRIX1BIWV9GRFggOiAwOworCisJaWYgKChwcml2LT5tYWNfY3RybCAmIE1FVEhfUEhZX0ZEWCkgXiBkdXBsZXgpIHsKKwkJRFBSSU5USygiU2V0dGluZyAlcy1kdXBsZXhcbiIsIGR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIik7CisJCWlmIChkdXBsZXgpCisJCQlwcml2LT5tYWNfY3RybCB8PSBNRVRIX1BIWV9GRFg7CisJCWVsc2UKKwkJCXByaXYtPm1hY19jdHJsICY9IH5NRVRIX1BIWV9GRFg7CisJCW1hY2UtPmV0aC5tYWNfY3RybCA9IHByaXYtPm1hY19jdHJsOworCX0KKworCWlmICgocHJpdi0+bWFjX2N0cmwgJiBNRVRIXzEwME1CSVQpIF4gc3BlZWQpIHsKKwkJRFBSSU5USygiU2V0dGluZyAlZE1icyBtb2RlXG4iLCBzcGVlZCA/IDEwMCA6IDEwKTsKKwkJaWYgKGR1cGxleCkKKwkJCXByaXYtPm1hY19jdHJsIHw9IE1FVEhfMTAwTUJJVDsKKwkJZWxzZQorCQkJcHJpdi0+bWFjX2N0cmwgJj0gfk1FVEhfMTAwTUJJVDsKKwkJbWFjZS0+ZXRoLm1hY19jdHJsID0gcHJpdi0+bWFjX2N0cmw7CisJfQorfQorCisKK3N0YXRpYyBpbnQgbWV0aF9pbml0X3R4X3Jpbmcoc3RydWN0IG1ldGhfcHJpdmF0ZSAqcHJpdikKK3sKKwkvKiBJbml0IFRYIHJpbmcgKi8KKwlwcml2LT50eF9yaW5nID0gZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIFRYX1JJTkdfQlVGRkVSX1NJWkUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpdi0+dHhfcmluZ19kbWEsIEdGUF9BVE9NSUMpOworCWlmICghcHJpdi0+dHhfcmluZykKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHByaXYtPnR4X3JpbmcsIDAsIFRYX1JJTkdfQlVGRkVSX1NJWkUpOworCXByaXYtPnR4X2NvdW50ID0gcHJpdi0+dHhfcmVhZCA9IHByaXYtPnR4X3dyaXRlID0gMDsKKwltYWNlLT5ldGgudHhfcmluZ19iYXNlID0gcHJpdi0+dHhfcmluZ19kbWE7CisJLyogTm93IGluaXQgc2tiIHNhdmUgYXJlYSAqLworCW1lbXNldChwcml2LT50eF9za2JzLCAwLCBzaXplb2YocHJpdi0+dHhfc2ticykpOworCW1lbXNldChwcml2LT50eF9za2JfZG1hcywgMCwgc2l6ZW9mKHByaXYtPnR4X3NrYl9kbWFzKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWV0aF9pbml0X3J4X3Jpbmcoc3RydWN0IG1ldGhfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX0VOVFJJRVM7IGkrKykgeworCQlwcml2LT5yeF9za2JzW2ldID0gYWxsb2Nfc2tiKE1FVEhfUlhfQlVGRl9TSVpFLCAwKTsKKwkJLyogOGJ5dGUgc3RhdHVzIHZlY3RvciArIDNxdWFkIHBhZGRpbmcgKyAyYnl0ZSBwYWRkaW5nLAorCQkgKiB0byBwdXQgZGF0YSBvbiA2NGJpdCBhbGlnbmVkIGJvdW5kYXJ5ICovCisJCXNrYl9yZXNlcnZlKHByaXYtPnJ4X3NrYnNbaV0sTUVUSF9SWF9IRUFEKTsKKwkJcHJpdi0+cnhfcmluZ1tpXT0ocnhfcGFja2V0KikocHJpdi0+cnhfc2tic1tpXS0+aGVhZCk7CisJCS8qIEknbGwgbmVlZCB0byByZS1zeW5jIGl0IGFmdGVyIGVhY2ggUlggKi8KKwkJcHJpdi0+cnhfcmluZ19kbWFzW2ldID0gCisJCQlkbWFfbWFwX3NpbmdsZShOVUxMLCBwcml2LT5yeF9yaW5nW2ldLAorCQkJCSAgICAgICBNRVRIX1JYX0JVRkZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJbWFjZS0+ZXRoLnJ4X2ZpZm8gPSBwcml2LT5yeF9yaW5nX2RtYXNbaV07CisJfQorICAgICAgICBwcml2LT5yeF93cml0ZSA9IDA7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBtZXRoX2ZyZWVfdHhfcmluZyhzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2KQoreworCWludCBpOworCisJLyogUmVtb3ZlIGFueSBwZW5kaW5nIHNrYiAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX0VOVFJJRVM7IGkrKykgeworCQlpZiAocHJpdi0+dHhfc2tic1tpXSkKKwkJCWRldl9rZnJlZV9za2IocHJpdi0+dHhfc2tic1tpXSk7CisJCXByaXYtPnR4X3NrYnNbaV0gPSBOVUxMOworCX0KKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBUWF9SSU5HX0JVRkZFUl9TSVpFLCBwcml2LT50eF9yaW5nLAorCSAgICAgICAgICAgICAgICAgIHByaXYtPnR4X3JpbmdfZG1hKTsKK30KKworLyogUHJlc3VtZXMgUlggRE1BIGVuZ2luZSBpcyBzdG9wcGVkLCBhbmQgUlggZmlmbyByaW5nIGlzIHJlc2V0ICovCitzdGF0aWMgdm9pZCBtZXRoX2ZyZWVfcnhfcmluZyhzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfRU5UUklFUzsgaSsrKSB7CisJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgcHJpdi0+cnhfcmluZ19kbWFzW2ldLAorCQkJCSBNRVRIX1JYX0JVRkZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJcHJpdi0+cnhfcmluZ1tpXSA9IDA7CisJCXByaXYtPnJ4X3JpbmdfZG1hc1tpXSA9IDA7CisJCWtmcmVlX3NrYihwcml2LT5yeF9za2JzW2ldKTsKKwl9Cit9CisKK2ludCBtZXRoX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1ldGhfcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgbWV0aF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCS8qIFJlc2V0IGNhcmQgKi8KKwltYWNlLT5ldGgubWFjX2N0cmwgPSBTR0lfTUFDX1JFU0VUOworCXVkZWxheSgxKTsKKwltYWNlLT5ldGgubWFjX2N0cmwgPSAwOworCXVkZWxheSgyNSk7CisKKwkvKiBMb2FkIGV0aGVybmV0IGFkZHJlc3MgKi8KKwlsb2FkX2VhZGRyKGRldik7CisJLyogU2hvdWxkIGxvYWQgc29tZSAiZXJyYXRhIiwgYnV0IGxhdGVyICovCisJCisJLyogQ2hlY2sgZm9yIGRldmljZSAqLworCWlmIChtZGlvX3Byb2JlKHByaXYpIDwgMCkgeworCQlEUFJJTlRLKCJVbmFibGUgdG8gZmluZCBQSFlcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBJbml0aWFsIG1vZGU6IDEwIHwgSGFsZi1kdXBsZXggfCBBY2NlcHQgbm9ybWFsIHBhY2tldHMgKi8KKwlwcml2LT5tYWNfY3RybCA9IE1FVEhfQUNDRVBUX01DQVNUIHwgTUVUSF9ERUZBVUxUX0lQRzsKKwlpZiAoZGV2LT5mbGFncyB8IElGRl9QUk9NSVNDKQorCQlwcml2LT5tYWNfY3RybCB8PSBNRVRIX1BST01JU0M7CisJbWFjZS0+ZXRoLm1hY19jdHJsID0gcHJpdi0+bWFjX2N0cmw7CisKKwkvKiBBdXRvbmVnb3RpYXRlIHNwZWVkIGFuZCBkdXBsZXggbW9kZSAqLworCW1ldGhfY2hlY2tfbGluayhkZXYpOworCisJLyogTm93IHNldCBkbWEgY29udHJvbCwgYnV0IGRvbid0IGVuYWJsZSBETUEsIHlldCAqLworCXByaXYtPmRtYV9jdHJsID0gKDQgPDwgTUVUSF9SWF9PRkZTRVRfU0hJRlQpIHwKKwkJCSAoUlhfUklOR19FTlRSSUVTIDw8IE1FVEhfUlhfREVQVEhfU0hJRlQpOworCW1hY2UtPmV0aC5kbWFfY3RybCA9IHByaXYtPmRtYV9jdHJsOworCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09RW5kIEhlbHBlciBSb3V0aW5lcz09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBPcGVuIGFuZCBjbG9zZQorICovCitzdGF0aWMgaW50IG1ldGhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJaW50IHJldDsKKworCXByaXYtPnBoeV9hZGRyID0gLTE7ICAgIC8qIE5vIFBIWSBpcyBrbm93biB5ZXQuLi4gKi8KKworCS8qIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlICovCisJcmV0ID0gbWV0aF9yZXNldChkZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQWxsb2NhdGUgdGhlIHJpbmcgYnVmZmVycyAqLworCXJldCA9IG1ldGhfaW5pdF90eF9yaW5nKHByaXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IG1ldGhfaW5pdF9yeF9yaW5nKHByaXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF9mcmVlX3R4X3Jpbmc7CisKKwlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgbWV0aF9pbnRlcnJ1cHQsIDAsIG1ldGhfc3RyLCBkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgZ2V0IGlycSAlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCWdvdG8gb3V0X2ZyZWVfcnhfcmluZzsKKwl9CisKKwkvKiBTdGFydCBETUEgKi8KKwlwcml2LT5kbWFfY3RybCB8PSBNRVRIX0RNQV9UWF9FTiB8IC8qTUVUSF9ETUFfVFhfSU5UX0VOIHwqLworCQkJICBNRVRIX0RNQV9SWF9FTiB8IE1FVEhfRE1BX1JYX0lOVF9FTjsKKwltYWNlLT5ldGguZG1hX2N0cmwgPSBwcml2LT5kbWFfY3RybDsKKworCURQUklOVEsoIkFib3V0IHRvIHN0YXJ0IHF1ZXVlXG4iKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlX3J4X3Jpbmc6CisJbWV0aF9mcmVlX3J4X3JpbmcocHJpdik7CitvdXRfZnJlZV90eF9yaW5nOgorCW1ldGhfZnJlZV90eF9yaW5nKHByaXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtZXRoX3JlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCisJRFBSSU5USygiU3RvcHBpbmcgcXVldWVcbiIpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsgLyogY2FuJ3QgdHJhbnNtaXQgYW55IG1vcmUgKi8KKwkvKiBzaHV0IGRvd24gRE1BICovCisJcHJpdi0+ZG1hX2N0cmwgJj0gfihNRVRIX0RNQV9UWF9FTiB8IE1FVEhfRE1BX1RYX0lOVF9FTiB8CisJCQkgICAgTUVUSF9ETUFfUlhfRU4gfCBNRVRIX0RNQV9SWF9JTlRfRU4pOworCW1hY2UtPmV0aC5kbWFfY3RybCA9IHByaXYtPmRtYV9jdHJsOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCW1ldGhfZnJlZV90eF9yaW5nKHByaXYpOworCW1ldGhfZnJlZV9yeF9yaW5nKHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWNlaXZlIGEgcGFja2V0OiByZXRyaWV2ZSwgZW5jYXBzdWxhdGUgYW5kIHBhc3Mgb3ZlciB0byB1cHBlciBsZXZlbHMKKyAqLworc3RhdGljIHZvaWQgbWV0aF9yeChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1bnNpZ25lZCBsb25nIGludF9zdGF0dXMpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKwlzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2ID0gKHN0cnVjdCBtZXRoX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmlmb19ycHRyID0gKGludF9zdGF0dXMgJiBNRVRIX0lOVF9SWF9SUFRSX01BU0spID4+IDg7CisKKwlzcGluX2xvY2soJnByaXYtPm1ldGhfbG9jayk7CisJcHJpdi0+ZG1hX2N0cmwgJj0gfk1FVEhfRE1BX1JYX0lOVF9FTjsKKwltYWNlLT5ldGguZG1hX2N0cmwgPSBwcml2LT5kbWFfY3RybDsKKwlzcGluX3VubG9jaygmcHJpdi0+bWV0aF9sb2NrKTsKKworCWlmIChpbnRfc3RhdHVzICYgTUVUSF9JTlRfUlhfVU5ERVJGTE9XKSB7CisJCWZpZm9fcnB0ciA9IChmaWZvX3JwdHIgLSAxKSAmIDB4MGY7CisJfQorCXdoaWxlIChwcml2LT5yeF93cml0ZSAhPSBmaWZvX3JwdHIpIHsKKwkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCBwcml2LT5yeF9yaW5nX2RtYXNbcHJpdi0+cnhfd3JpdGVdLAorCQkJCSBNRVRIX1JYX0JVRkZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJc3RhdHVzID0gcHJpdi0+cnhfcmluZ1twcml2LT5yeF93cml0ZV0tPnN0YXR1cy5yYXc7CisjaWYgTUZFX0RFQlVHCisJCWlmICghKHN0YXR1cyAmIE1FVEhfUlhfU1RfVkFMSUQpKSB7CisJCQlEUFJJTlRLKCJOb3QgcmVjZWl2ZWQ/IHN0YXR1cz0lMDE2bHhcbiIsc3RhdHVzKTsKKwkJfQorI2VuZGlmCisJCWlmICgoIShzdGF0dXMgJiBNRVRIX1JYX1NUQVRVU19FUlJPUlMpKSAmJiAoc3RhdHVzICYgTUVUSF9SWF9TVF9WQUxJRCkpIHsKKwkJCWludCBsZW4gPSAoc3RhdHVzICYgMHhmZmZmKSAtIDQ7IC8qIG9taXQgQ1JDICovCisJCQkvKiBsZW5ndGggc2FuaXR5IGNoZWNrICovCisJCQlpZiAobGVuIDwgNjAgfHwgbGVuID4gMTUxOCkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYm9ndXMgcGFja2V0IHNpemU6ICVsZCwgc3RhdHVzPSUjMmx4LlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBwcml2LT5yeF93cml0ZSwKKwkJCQkgICAgICAgcHJpdi0+cnhfcmluZ1twcml2LT5yeF93cml0ZV0tPnN0YXR1cy5yYXcpOworCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCXByaXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQlza2IgPSBwcml2LT5yeF9za2JzW3ByaXYtPnJ4X3dyaXRlXTsKKwkJCX0gZWxzZSB7CisJCQkJc2tiID0gYWxsb2Nfc2tiKE1FVEhfUlhfQlVGRl9TSVpFLCBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7CisJCQkJaWYgKCFza2IpIHsKKwkJCQkJLyogT3VjaCEgTm8gbWVtb3J5ISBEcm9wIHBhY2tldCBvbiB0aGUgZmxvb3IgKi8KKwkJCQkJRFBSSU5USygiTm8gbWVtOiBkcm9wcGluZyBwYWNrZXRcbiIpOworCQkJCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJCXNrYiA9IHByaXYtPnJ4X3NrYnNbcHJpdi0+cnhfd3JpdGVdOworCQkJCX0gZWxzZSB7CisJCQkJCXN0cnVjdCBza19idWZmICpza2JfYyA9IHByaXYtPnJ4X3NrYnNbcHJpdi0+cnhfd3JpdGVdOworCQkJCQkvKiA4Ynl0ZSBzdGF0dXMgdmVjdG9yICsgM3F1YWQgcGFkZGluZyArIDJieXRlIHBhZGRpbmcsCisJCQkJCSAqIHRvIHB1dCBkYXRhIG9uIDY0Yml0IGFsaWduZWQgYm91bmRhcnkgKi8KKwkJCQkJc2tiX3Jlc2VydmUoc2tiLCBNRVRIX1JYX0hFQUQpOworCQkJCQkvKiBXcml0ZSBtZXRhZGF0YSwgYW5kIHRoZW4gcGFzcyB0byB0aGUgcmVjZWl2ZSBsZXZlbCAqLworCQkJCQlza2JfcHV0KHNrYl9jLCBsZW4pOworCQkJCQlwcml2LT5yeF9za2JzW3ByaXYtPnJ4X3dyaXRlXSA9IHNrYjsKKwkJCQkJc2tiX2MtPmRldiA9IGRldjsKKwkJCQkJc2tiX2MtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiX2MsIGRldik7CisJCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQkJCQluZXRpZl9yeChza2JfYyk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlza2I9cHJpdi0+cnhfc2tic1twcml2LT5yeF93cml0ZV07CisjaWYgTUZFX0RFQlVHPjAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1ldGg6IFJYIGVycm9yOiBzdGF0dXM9MHglMDE2bHhcbiIsc3RhdHVzKTsKKwkJCWlmKHN0YXR1cyZNRVRIX1JYX1NUX1JDVl9DT0RFX1ZJT0xBVElPTikKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZWNlaXZlIENvZGUgVmlvbGF0aW9uXG4iKTsKKwkJCWlmKHN0YXR1cyZNRVRIX1JYX1NUX0NSQ19FUlIpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ1JDIGVycm9yXG4iKTsKKwkJCWlmKHN0YXR1cyZNRVRIX1JYX1NUX0lOVl9QUkVBTUJMRV9DVFgpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSW52YWxpZCBQcmVhbWJsZSBDb250ZXh0XG4iKTsKKwkJCWlmKHN0YXR1cyZNRVRIX1JYX1NUX0xPTkdfRVZUX1NFRU4pCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTG9uZyBFdmVudCBTZWVuLi4uXG4iKTsKKwkJCWlmKHN0YXR1cyZNRVRIX1JYX1NUX0JBRF9QQUNLRVQpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQmFkIFBhY2tldFxuIik7CisJCQlpZihzdGF0dXMmTUVUSF9SWF9TVF9DQVJSSUVSX0VWVF9TRUVOKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhcnJpZXIgRXZlbnQgU2VlblxuIik7CisjZW5kaWYKKwkJfQorCQlwcml2LT5yeF9yaW5nW3ByaXYtPnJ4X3dyaXRlXSA9IChyeF9wYWNrZXQqKXNrYi0+aGVhZDsKKwkJcHJpdi0+cnhfcmluZ1twcml2LT5yeF93cml0ZV0tPnN0YXR1cy5yYXcgPSAwOworCQlwcml2LT5yeF9yaW5nX2RtYXNbcHJpdi0+cnhfd3JpdGVdID0gCisJCQlkbWFfbWFwX3NpbmdsZShOVUxMLCBwcml2LT5yeF9yaW5nW3ByaXYtPnJ4X3dyaXRlXSwKKwkJCQkgICAgICAgTUVUSF9SWF9CVUZGX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCW1hY2UtPmV0aC5yeF9maWZvID0gcHJpdi0+cnhfcmluZ19kbWFzW3ByaXYtPnJ4X3dyaXRlXTsKKwkJQURWQU5DRV9SWF9QVFIocHJpdi0+cnhfd3JpdGUpOworCX0KKwlzcGluX2xvY2soJnByaXYtPm1ldGhfbG9jayk7CisJLyogSW4gY2FzZSB0aGVyZSB3YXMgdW5kZXJmbG93LCBhbmQgUnggRE1BIHdhcyBkaXNhYmxlZCAqLworCXByaXYtPmRtYV9jdHJsIHw9IE1FVEhfRE1BX1JYX0lOVF9FTiB8IE1FVEhfRE1BX1JYX0VOOworCW1hY2UtPmV0aC5kbWFfY3RybCA9IHByaXYtPmRtYV9jdHJsOworCW1hY2UtPmV0aC5pbnRfc3RhdCA9IE1FVEhfSU5UX1JYX1RIUkVTSE9MRDsKKwlzcGluX3VubG9jaygmcHJpdi0+bWV0aF9sb2NrKTsKK30KKworc3RhdGljIGludCBtZXRoX3R4X2Z1bGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2ID0gKHN0cnVjdCBtZXRoX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJcmV0dXJuIChwcml2LT50eF9jb3VudCA+PSBUWF9SSU5HX0VOVFJJRVMgLSAxKTsKK30KKworc3RhdGljIHZvaWQgbWV0aF90eF9jbGVhbnVwKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHVuc2lnbmVkIGxvbmcgaW50X3N0YXR1cykKK3sKKwlzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBycHRyID0gKGludF9zdGF0dXMmVFhfSU5GT19SUFRSKSA+PiAxNjsKKworCXNwaW5fbG9jaygmcHJpdi0+bWV0aF9sb2NrKTsKKworCS8qIFN0b3AgRE1BIG5vdGlmaWNhdGlvbiAqLworCXByaXYtPmRtYV9jdHJsICY9IH4oTUVUSF9ETUFfVFhfSU5UX0VOKTsKKwltYWNlLT5ldGguZG1hX2N0cmwgPSBwcml2LT5kbWFfY3RybDsKKworCXdoaWxlIChwcml2LT50eF9yZWFkICE9IHJwdHIpIHsKKwkJc2tiID0gcHJpdi0+dHhfc2tic1twcml2LT50eF9yZWFkXTsKKwkJc3RhdHVzID0gcHJpdi0+dHhfcmluZ1twcml2LT50eF9yZWFkXS5oZWFkZXIucmF3OworI2lmIE1GRV9ERUJVRz49MQorCQlpZiAocHJpdi0+dHhfcmVhZCA9PSBwcml2LT50eF93cml0ZSkKKwkJCURQUklOVEsoIkF1Y2hpISB0eF9yZWFkPSVkLHR4X3dyaXRlPSVkLHJwdHI9JWQ/XG4iLCBwcml2LT50eF9yZWFkLCBwcml2LT50eF93cml0ZSxycHRyKTsKKyNlbmRpZgorCQlpZiAoc3RhdHVzICYgTUVUSF9UWF9TVF9ET05FKSB7CisJCQlpZiAoc3RhdHVzICYgTUVUSF9UWF9TVF9TVUNDRVNTKXsKKwkJCQlwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQl9IGVsc2UgeworCQkJCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworI2lmIE1GRV9ERUJVRz49MQorCQkJCURQUklOVEsoIlRYIGVycm9yOiBzdGF0dXM9JTAxNmx4IDwiLHN0YXR1cyk7CisJCQkJaWYoc3RhdHVzICYgTUVUSF9UWF9TVF9TVUNDRVNTKQorCQkJCQlwcmludGsoIiBTVUNDRVNTIik7CisJCQkJaWYoc3RhdHVzICYgTUVUSF9UWF9TVF9UT09MT05HKQorCQkJCQlwcmludGsoIiBUT09MT05HIik7CisJCQkJaWYoc3RhdHVzICYgTUVUSF9UWF9TVF9VTkRFUlJVTikKKwkJCQkJcHJpbnRrKCIgVU5ERVJSVU4iKTsKKwkJCQlpZihzdGF0dXMgJiBNRVRIX1RYX1NUX0VYQ0NPTEwpCisJCQkJCXByaW50aygiIEVYQ0NPTEwiKTsKKwkJCQlpZihzdGF0dXMgJiBNRVRIX1RYX1NUX0RFRkVSKQorCQkJCQlwcmludGsoIiBERUZFUiIpOworCQkJCWlmKHN0YXR1cyAmIE1FVEhfVFhfU1RfTEFURUNPTEwpCisJCQkJCXByaW50aygiIExBVEVDT0xMIik7CisJCQkJcHJpbnRrKCIgPlxuIik7CisjZW5kaWYKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURQUklOVEsoIlJQVFIgcG9pbnRzIHVzIGhlcmUsIGJ1dCBwYWNrZXQgbm90IGRvbmU/XG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCXByaXYtPnR4X3NrYnNbcHJpdi0+dHhfcmVhZF0gPSBOVUxMOworCQlwcml2LT50eF9yaW5nW3ByaXYtPnR4X3JlYWRdLmhlYWRlci5yYXcgPSAwOworCQlwcml2LT50eF9yZWFkID0gKHByaXYtPnR4X3JlYWQrMSkmKFRYX1JJTkdfRU5UUklFUy0xKTsKKwkJcHJpdi0+dHhfY291bnQtLTsKKwl9CisKKwkvKiB3YWtlIHVwIHF1ZXVlIGlmIGl0IHdhcyBzdG9wcGVkICovCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJiAhbWV0aF90eF9mdWxsKGRldikpIHsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworCW1hY2UtPmV0aC5pbnRfc3RhdCA9IE1FVEhfSU5UX1RYX0VNUFRZIHwgTUVUSF9JTlRfVFhfUEtUOworCXNwaW5fdW5sb2NrKCZwcml2LT5tZXRoX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBtZXRoX2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHVuc2lnbmVkIHN0YXR1cykKK3sKKwlzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2ID0gKHN0cnVjdCBtZXRoX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJcHJpbnRrKEtFUk5fV0FSTklORyAibWV0aDogZXJyb3Igc3RhdHVzOiAweCUwOHhcbiIsc3RhdHVzKTsKKwkvKiBjaGVjayBmb3IgZXJyb3JzIHRvby4uLiAqLworCWlmIChzdGF0dXMgJiAoTUVUSF9JTlRfVFhfTElOS19GQUlMKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWV0aDogbGluayBmYWlsdXJlXG4iKTsKKwkvKiBTaG91bGQgSSBkbyBmdWxsIHJlc2V0IGluIHRoaXMgY2FzZT8gKi8KKwlpZiAoc3RhdHVzICYgKE1FVEhfSU5UX01FTV9FUlJPUikpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1ldGg6IG1lbW9yeSBlcnJvclxuIik7CisJaWYgKHN0YXR1cyAmIChNRVRIX0lOVF9UWF9BQk9SVCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1ldGg6IGFib3J0ZWRcbiIpOworCWlmIChzdGF0dXMgJiAoTUVUSF9JTlRfUlhfT1ZFUkZMT1cpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZXRoOiBSeCBvdmVyZmxvd1xuIik7CisJaWYgKHN0YXR1cyAmIChNRVRIX0lOVF9SWF9VTkRFUkZMT1cpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1ldGg6IFJ4IHVuZGVyZmxvd1xuIik7CisJCXNwaW5fbG9jaygmcHJpdi0+bWV0aF9sb2NrKTsKKwkJbWFjZS0+ZXRoLmludF9zdGF0ID0gTUVUSF9JTlRfUlhfVU5ERVJGTE9XOworCQkvKiBtb3JlIHVuZGVyZmxvdyBpbnRlcnJ1cHRzIHdpbGwgYmUgZGVsaXZlcmVkLCAKKwkJICogZWZmZWN0aXZlbHkgdGhyb3dpbmcgdXMgaW50byBhbiBpbmZpbml0ZSBsb29wLgorCQkgKiAgVGh1cyBJIHN0b3AgcHJvY2Vzc2luZyBSeCBpbiB0aGlzIGNhc2UuICovCisJCXByaXYtPmRtYV9jdHJsICY9IH5NRVRIX0RNQV9SWF9FTjsKKwkJbWFjZS0+ZXRoLmRtYV9jdHJsID0gcHJpdi0+ZG1hX2N0cmw7CisJCURQUklOVEsoIkRpc2FibGVkIG1ldGggUnggRE1BIHRlbXBvcmFyaWx5XG4iKTsKKwkJc3Bpbl91bmxvY2soJnByaXYtPm1ldGhfbG9jayk7CisJfQorCW1hY2UtPmV0aC5pbnRfc3RhdCA9IE1FVEhfSU5UX0VSUk9SOworfQorCisvKgorICogVGhlIHR5cGljYWwgaW50ZXJydXB0IGVudHJ5IHBvaW50CisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBtZXRoX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IG1ldGhfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlzdGF0dXMgPSBtYWNlLT5ldGguaW50X3N0YXQ7CisJd2hpbGUgKHN0YXR1cyAmIDB4ZmYpIHsKKwkJLyogRmlyc3QgaGFuZGxlIGVycm9ycyAtIGlmIHdlIGdldCBSeCB1bmRlcmZsb3csCisJCSAqIFJ4IERNQSB3aWxsIGJlIGRpc2FibGVkLCBhbmQgUnggaGFuZGxlciB3aWxsIHJlZW5hYmxlCisJCSAqIGl0LiBJIGRvbid0IHRoaW5rIGl0J3MgcG9zc2libGUgdG8gZ2V0IFJ4IHVuZGVyZmxvdywKKwkJICogd2l0aG91dCBnZXR0aW5nIFJ4IGludGVycnVwdCAqLworCQlpZiAoc3RhdHVzICYgTUVUSF9JTlRfRVJST1IpIHsKKwkJCW1ldGhfZXJyb3IoZGV2LCBzdGF0dXMpOworCQl9CisJCWlmIChzdGF0dXMgJiAoTUVUSF9JTlRfVFhfRU1QVFkgfCBNRVRIX0lOVF9UWF9QS1QpKSB7CisJCQkvKiBhIHRyYW5zbWlzc2lvbiBpcyBvdmVyOiBmcmVlIHRoZSBza2IgKi8KKwkJCW1ldGhfdHhfY2xlYW51cChkZXYsIHN0YXR1cyk7CisJCX0KKwkJaWYgKHN0YXR1cyAmIE1FVEhfSU5UX1JYX1RIUkVTSE9MRCkgeworCQkJaWYgKCEocHJpdi0+ZG1hX2N0cmwgJiBNRVRIX0RNQV9SWF9JTlRfRU4pKQorCQkJCWJyZWFrOworCQkJLyogc2VuZCBpdCB0byBtZXRoX3J4IGZvciBoYW5kbGluZyAqLworCQkJbWV0aF9yeChkZXYsIHN0YXR1cyk7CisJCX0KKwkJc3RhdHVzID0gbWFjZS0+ZXRoLmludF9zdGF0OworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIFRyYW5zbWl0cyBwYWNrZXRzIHRoYXQgZml0IGludG8gVFggZGVzY3JpcHRvciAoYXJlIDw9MTIwQikKKyAqLworc3RhdGljIHZvaWQgbWV0aF90eF9zaG9ydF9wcmVwYXJlKHN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXR4X3BhY2tldCAqZGVzYyA9ICZwcml2LT50eF9yaW5nW3ByaXYtPnR4X3dyaXRlXTsKKwlpbnQgbGVuID0gKHNrYi0+bGVuIDwgRVRIX1pMRU4pID8gRVRIX1pMRU4gOiBza2ItPmxlbjsKKworCWRlc2MtPmhlYWRlci5yYXcgPSBNRVRIX1RYX0NNRF9JTlRfRU4gfCAobGVuLTEpIHwgKCgxMjgtbGVuKSA8PCAxNik7CisJLyogbWF5YmUgSSBzaG91bGQgc2V0IHdob2xlIHRoaW5nIHRvIDAgZmlyc3QuLi4gKi8KKwltZW1jcHkoZGVzYy0+ZGF0YS5kdCArICgxMjAgLSBsZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlpZiAoc2tiLT5sZW4gPCBsZW4pCisJCW1lbXNldChkZXNjLT5kYXRhLmR0ICsgMTIwIC0gbGVuICsgc2tiLT5sZW4sIDAsIGxlbi1za2ItPmxlbik7Cit9CisjZGVmaW5lIFRYX0NBVEJVRjEgQklUKDI1KQorc3RhdGljIHZvaWQgbWV0aF90eF8xcGFnZV9wcmVwYXJlKHN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXR4X3BhY2tldCAqZGVzYyA9ICZwcml2LT50eF9yaW5nW3ByaXYtPnR4X3dyaXRlXTsKKwl2b2lkICpidWZmZXJfZGF0YSA9ICh2b2lkICopKCgodW5zaWduZWQgbG9uZylza2ItPmRhdGEgKyA3KSAmIH43KTsKKwlpbnQgdW5hbGlnbmVkX2xlbiA9IChpbnQpKCh1bnNpZ25lZCBsb25nKWJ1ZmZlcl9kYXRhIC0gKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhKTsKKwlpbnQgYnVmZmVyX2xlbiA9IHNrYi0+bGVuIC0gdW5hbGlnbmVkX2xlbjsKKwlkbWFfYWRkcl90IGNhdGJ1ZjsKKworCWRlc2MtPmhlYWRlci5yYXcgPSBNRVRIX1RYX0NNRF9JTlRfRU4gfCBUWF9DQVRCVUYxIHwgKHNrYi0+bGVuIC0gMSk7CisKKwkvKiB1bmFsaWduZWQgcGFydCAqLworCWlmICh1bmFsaWduZWRfbGVuKSB7CisJCW1lbWNweShkZXNjLT5kYXRhLmR0ICsgKDEyMCAtIHVuYWxpZ25lZF9sZW4pLAorCQkgICAgICAgc2tiLT5kYXRhLCB1bmFsaWduZWRfbGVuKTsKKwkJZGVzYy0+aGVhZGVyLnJhdyB8PSAoMTI4IC0gdW5hbGlnbmVkX2xlbikgPDwgMTY7CisJfQorCisJLyogZmlyc3QgcGFnZSAqLworCWNhdGJ1ZiA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsIGJ1ZmZlcl9kYXRhLCBidWZmZXJfbGVuLAorCQkJCURNQV9UT19ERVZJQ0UpOworCWRlc2MtPmRhdGEuY2F0X2J1ZlswXS5mb3JtLnN0YXJ0X2FkZHIgPSBjYXRidWYgPj4gMzsKKwlkZXNjLT5kYXRhLmNhdF9idWZbMF0uZm9ybS5sZW4gPSBidWZmZXJfbGVuIC0gMTsKK30KKyNkZWZpbmUgVFhfQ0FUQlVGMiBCSVQoMjYpCitzdGF0aWMgdm9pZCBtZXRoX3R4XzJwYWdlX3ByZXBhcmUoc3RydWN0IG1ldGhfcHJpdmF0ZSAqcHJpdiwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdHhfcGFja2V0ICpkZXNjID0gJnByaXYtPnR4X3JpbmdbcHJpdi0+dHhfd3JpdGVdOworCXZvaWQgKmJ1ZmZlcjFfZGF0YSA9ICh2b2lkICopKCgodW5zaWduZWQgbG9uZylza2ItPmRhdGEgKyA3KSAmIH43KTsKKwl2b2lkICpidWZmZXIyX2RhdGEgPSAodm9pZCAqKVBBR0VfQUxJR04oKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhKTsKKwlpbnQgdW5hbGlnbmVkX2xlbiA9IChpbnQpKCh1bnNpZ25lZCBsb25nKWJ1ZmZlcjFfZGF0YSAtICh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSk7CisJaW50IGJ1ZmZlcjFfbGVuID0gKGludCkoKHVuc2lnbmVkIGxvbmcpYnVmZmVyMl9kYXRhIC0gKHVuc2lnbmVkIGxvbmcpYnVmZmVyMV9kYXRhKTsKKwlpbnQgYnVmZmVyMl9sZW4gPSBza2ItPmxlbiAtIGJ1ZmZlcjFfbGVuIC0gdW5hbGlnbmVkX2xlbjsKKwlkbWFfYWRkcl90IGNhdGJ1ZjEsIGNhdGJ1ZjI7CisKKwlkZXNjLT5oZWFkZXIucmF3ID0gTUVUSF9UWF9DTURfSU5UX0VOIHwgVFhfQ0FUQlVGMSB8IFRYX0NBVEJVRjJ8IChza2ItPmxlbiAtIDEpOworCS8qIHVuYWxpZ25lZCBwYXJ0ICovCisJaWYgKHVuYWxpZ25lZF9sZW4peworCQltZW1jcHkoZGVzYy0+ZGF0YS5kdCArICgxMjAgLSB1bmFsaWduZWRfbGVuKSwKKwkJICAgICAgIHNrYi0+ZGF0YSwgdW5hbGlnbmVkX2xlbik7CisJCWRlc2MtPmhlYWRlci5yYXcgfD0gKDEyOCAtIHVuYWxpZ25lZF9sZW4pIDw8IDE2OworCX0KKworCS8qIGZpcnN0IHBhZ2UgKi8KKwljYXRidWYxID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgYnVmZmVyMV9kYXRhLCBidWZmZXIxX2xlbiwKKwkJCQkgRE1BX1RPX0RFVklDRSk7CisJZGVzYy0+ZGF0YS5jYXRfYnVmWzBdLmZvcm0uc3RhcnRfYWRkciA9IGNhdGJ1ZjEgPj4gMzsKKwlkZXNjLT5kYXRhLmNhdF9idWZbMF0uZm9ybS5sZW4gPSBidWZmZXIxX2xlbiAtIDE7CisJLyogc2Vjb25kIHBhZ2UgKi8KKwljYXRidWYyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgYnVmZmVyMl9kYXRhLCBidWZmZXIyX2xlbiwKKwkJCQkgRE1BX1RPX0RFVklDRSk7CisJZGVzYy0+ZGF0YS5jYXRfYnVmWzFdLmZvcm0uc3RhcnRfYWRkciA9IGNhdGJ1ZjIgPj4gMzsKKwlkZXNjLT5kYXRhLmNhdF9idWZbMV0uZm9ybS5sZW4gPSBidWZmZXIyX2xlbiAtIDE7Cit9CisKK3N0YXRpYyB2b2lkIG1ldGhfYWRkX3RvX3R4X3Jpbmcoc3RydWN0IG1ldGhfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBSZW1lbWJlciB0aGUgc2tiLCBzbyB3ZSBjYW4gZnJlZSBpdCBhdCBpbnRlcnJ1cHQgdGltZSAqLworCXByaXYtPnR4X3NrYnNbcHJpdi0+dHhfd3JpdGVdID0gc2tiOworCWlmIChza2ItPmxlbiA8PSAxMjApIHsKKwkJLyogV2hvbGUgcGFja2V0IGZpdHMgaW50byBkZXNjcmlwdG9yICovCisJCW1ldGhfdHhfc2hvcnRfcHJlcGFyZShwcml2LCBza2IpOworCX0gZWxzZSBpZiAoUEFHRV9BTElHTigodW5zaWduZWQgbG9uZylza2ItPmRhdGEpICE9CisJCSAgIFBBR0VfQUxJR04oKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhICsgc2tiLT5sZW4gLSAxKSkgeworCQkvKiBQYWNrZXQgY3Jvc3NlcyBwYWdlIGJvdW5kYXJ5ICovCisJCW1ldGhfdHhfMnBhZ2VfcHJlcGFyZShwcml2LCBza2IpOworCX0gZWxzZSB7CisJCS8qIFBhY2tldCBpcyBpbiBvbmUgcGFnZSAqLworCQltZXRoX3R4XzFwYWdlX3ByZXBhcmUocHJpdiwgc2tiKTsKKwl9CisJcHJpdi0+dHhfd3JpdGUgPSAocHJpdi0+dHhfd3JpdGUgKyAxKSAmIChUWF9SSU5HX0VOVFJJRVMgLSAxKTsKKwltYWNlLT5ldGgudHhfaW5mbyA9IHByaXYtPnR4X3dyaXRlOworCXByaXYtPnR4X2NvdW50Kys7Cit9CisKKy8qCisgKiBUcmFuc21pdCBhIHBhY2tldCAoY2FsbGVkIGJ5IHRoZSBrZXJuZWwpCisgKi8KK3N0YXRpYyBpbnQgbWV0aF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IG1ldGhfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5tZXRoX2xvY2ssIGZsYWdzKTsKKwkvKiBTdG9wIERNQSBub3RpZmljYXRpb24gKi8KKwlwcml2LT5kbWFfY3RybCAmPSB+KE1FVEhfRE1BX1RYX0lOVF9FTik7CisJbWFjZS0+ZXRoLmRtYV9jdHJsID0gcHJpdi0+ZG1hX2N0cmw7CisKKwltZXRoX2FkZF90b190eF9yaW5nKHByaXYsIHNrYik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7IC8qIHNhdmUgdGhlIHRpbWVzdGFtcCAqLworCisJLyogSWYgVFggcmluZyBpcyBmdWxsLCB0ZWxsIHRoZSB1cHBlciBsYXllciB0byBzdG9wIHNlbmRpbmcgcGFja2V0cyAqLworCWlmIChtZXRoX3R4X2Z1bGwoZGV2KSkgeworCSAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIlRYIGZ1bGw6IHN0b3BwaW5nXG4iKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCX0KKworCS8qIFJlc3RhcnQgRE1BIG5vdGlmaWNhdGlvbiAqLworCXByaXYtPmRtYV9jdHJsIHw9IE1FVEhfRE1BX1RYX0lOVF9FTjsKKwltYWNlLT5ldGguZG1hX2N0cmwgPSBwcml2LT5kbWFfY3RybDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPm1ldGhfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWFsIHdpdGggYSB0cmFuc21pdCB0aW1lb3V0LgorICovCitzdGF0aWMgdm9pZCBtZXRoX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2ID0gKHN0cnVjdCBtZXRoX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0XG4iLCBkZXYtPm5hbWUpOworCisJLyogUHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgcnggaW50ZXJydXB0cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5tZXRoX2xvY2ssZmxhZ3MpOworCisJLyogVHJ5IHRvIHJlc2V0IHRoZSBpbnRlcmZhY2UuICovCisJbWV0aF9yZXNldChkZXYpOworCisJcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkvKiBDbGVhciBhbGwgcmluZ3MgKi8KKwltZXRoX2ZyZWVfdHhfcmluZyhwcml2KTsKKwltZXRoX2ZyZWVfcnhfcmluZyhwcml2KTsKKwltZXRoX2luaXRfdHhfcmluZyhwcml2KTsKKwltZXRoX2luaXRfcnhfcmluZyhwcml2KTsKKworCS8qIFJlc3RhcnQgZG1hICovCisJcHJpdi0+ZG1hX2N0cmwgfD0gTUVUSF9ETUFfVFhfRU4gfCBNRVRIX0RNQV9SWF9FTiB8IE1FVEhfRE1BX1JYX0lOVF9FTjsKKwltYWNlLT5ldGguZG1hX2N0cmwgPSBwcml2LT5kbWFfY3RybDsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5tZXRoX2xvY2ssIGZsYWdzKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCXJldHVybjsKK30KKworLyoKKyAqIElvY3RsIGNvbW1hbmRzIAorICovCitzdGF0aWMgaW50IG1ldGhfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwkvKiBYWFggTm90IHlldCBpbXBsZW1lbnRlZCAqLworCXN3aXRjaChjbWQpIHsgCisJY2FzZSBTSU9DR01JSVBIWToKKwljYXNlIFNJT0NHTUlJUkVHOgorCWNhc2UgU0lPQ1NNSUlSRUc6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworLyoKKyAqIFJldHVybiBzdGF0aXN0aWNzIHRvIHRoZSBjYWxsZXIKKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptZXRoX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1ldGhfcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgbWV0aF9wcml2YXRlICopIGRldi0+cHJpdjsKKwlyZXR1cm4gJnByaXYtPnN0YXRzOworfQorCisvKgorICogVGhlIGluaXQgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqbWV0aF9pbml0KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2OworCWludCByZXQ7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG1ldGhfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWRldi0+b3BlbiAgICAgICAgICAgID0gbWV0aF9vcGVuOworCWRldi0+c3RvcCAgICAgICAgICAgID0gbWV0aF9yZWxlYXNlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbWV0aF90eDsKKwlkZXYtPmRvX2lvY3RsICAgICAgICA9IG1ldGhfaW9jdGw7CisJZGV2LT5nZXRfc3RhdHMgICAgICAgPSBtZXRoX3N0YXRzOworI2lmZGVmIEhBVkVfVFhfVElNRU9VVAorCWRldi0+dHhfdGltZW91dCAgICAgID0gbWV0aF90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gID0gdGltZW91dDsKKyNlbmRpZgorCWRldi0+aXJxCSAgICAgPSBNQUNFX0VUSEVSTkVUX0lSUTsKKwlkZXYtPmJhc2VfYWRkcgkgICAgID0gKHVuc2lnbmVkIGxvbmcpJm1hY2UtPmV0aDsKKworCXByaXYgPSAoc3RydWN0IG1ldGhfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPm1ldGhfbG9jayk7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0KSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNHSSBNQUNFIEV0aGVybmV0IHJldi4gJWRcbiIsCisJICAgICAgIGRldi0+bmFtZSwgKHVuc2lnbmVkIGludCkobWFjZS0+ZXRoLm1hY19jdHJsID4+IDI5KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqbWV0aF9kZXY7CisKK3N0YXRpYyBpbnQgX19pbml0IG1ldGhfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwltZXRoX2RldiA9IG1ldGhfaW5pdCgpOworCWlmIChJU19FUlIobWV0aF9kZXYpKQorCQlyZXR1cm4gUFRSX0VSUihtZXRoX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZXRoX2V4aXRfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYobWV0aF9kZXYpOworCWZyZWVfbmV0ZGV2KG1ldGhfZGV2KTsKK30KKworbW9kdWxlX2luaXQobWV0aF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChtZXRoX2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21ldGguaCBiL2RyaXZlcnMvbmV0L21ldGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDk2MGRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbWV0aC5oCkBAIC0wLDAgKzEsMjQ2IEBACisKKy8qCisgKiBzbnVsbC5oIC0tIGRlZmluaXRpb25zIGZvciB0aGUgbmV0d29yayBtb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQWxlc3NhbmRybyBSdWJpbmkgYW5kIEpvbmF0aGFuIENvcmJldAorICogQ29weXJpZ2h0IChDKSAyMDAxIE8nUmVpbGx5ICYgQXNzb2NpYXRlcworICoKKyAqIFRoZSBzb3VyY2UgY29kZSBpbiB0aGlzIGZpbGUgY2FuIGJlIGZyZWVseSB1c2VkLCBhZGFwdGVkLAorICogYW5kIHJlZGlzdHJpYnV0ZWQgaW4gc291cmNlIG9yIGJpbmFyeSBmb3JtLCBzbyBsb25nIGFzIGFuCisgKiBhY2tub3dsZWRnbWVudCBhcHBlYXJzIGluIGRlcml2ZWQgc291cmNlIGZpbGVzLiAgVGhlIGNpdGF0aW9uCisgKiBzaG91bGQgbGlzdCB0aGF0IHRoZSBjb2RlIGNvbWVzIGZyb20gdGhlIGJvb2sgIkxpbnV4IERldmljZQorICogRHJpdmVycyIgYnkgQWxlc3NhbmRybyBSdWJpbmkgYW5kIEpvbmF0aGFuIENvcmJldCwgcHVibGlzaGVkCisgKiBieSBPJ1JlaWxseSAmIEFzc29jaWF0ZXMuICAgTm8gd2FycmFudHkgaXMgYXR0YWNoZWQ7CisgKiB3ZSBjYW5ub3QgdGFrZSByZXNwb25zaWJpbGl0eSBmb3IgZXJyb3JzIG9yIGZpdG5lc3MgZm9yIHVzZS4KKyAqLworCisvKiB2ZXJzaW9uIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gY29uZmluZWQgdG8gYSBzZXBhcmF0ZSBmaWxlICovCisKKy8qIFR1bmFibGUgcGFyYW1ldGVycyAqLworI2RlZmluZSBUWF9SSU5HX0VOVFJJRVMgNjQJLyogNjQtNTEyPyovCisKKyNkZWZpbmUgUlhfUklOR19FTlRSSUVTIDE2IC8qIERvIG5vdCBjaGFuZ2UgKi8KKy8qIEludGVybmFsIGNvbnN0YW50cyAqLworI2RlZmluZSBUWF9SSU5HX0JVRkZFUl9TSVpFCShUWF9SSU5HX0VOVFJJRVMqc2l6ZW9mKHR4X3BhY2tldCkpCisjZGVmaW5lIFJYX0JVRkZFUl9TSVpFIDE1NDYgLyogZXRoZW5ldCBwYWNrZXQgc2l6ZSAqLworI2RlZmluZSBNRVRIX1JYX0JVRkZfU0laRSA0MDk2CisjZGVmaW5lIE1FVEhfUlhfSEVBRCAzNCAvKiBzdGF0dXMgKyAzIHF1YWQgZ2FyYmFnZS1maWxsICsgMiBieXRlIHplcm8tcGFkICovCisjZGVmaW5lIFJYX0JVRkZFUl9PRkZTRVQgKHNpemVvZihyeF9zdGF0dXNfdmVjdG9yKSsyKSAvKiBzdGF1cyB2ZWN0b3IgKyAyIGJ5dGVzIG9mIHBhZGRpbmcgKi8KKyNkZWZpbmUgUlhfQlVDS0VUX1NJWkUgMjU2CisKKyN1bmRlZiBCSVQKKyNkZWZpbmUgQklUKHgpCSgxVUwgPDwgKHgpKQorCisvKiBGb3IgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbnMgb2Ygd2hhdCBlYWNoIGZpZWxkIG1lbmFzLAorICAgc2VlIE5pY2sncyBncmVhdCBjb21tZW50cyB0byAjZGVmaW5lcyBiZWxvdyAob3IgZG9jcywgaWYKKyAgIHlvdSBhcmUgbHVja3kgZW5vdWdoIHRvZ2V0IGhvbGQgb2YgdGhlbSA6KSovCisKKy8qIHR4IHN0YXR1cyB2ZWN0b3IgaXMgd3JpdHRlbiBvdmVyIHR4IGNvbW1hbmQgaGVhZGVyIHVwb24KKyAgIGRtYSBjb21wbGV0aW9uLiAqLworCit0eXBlZGVmIHN0cnVjdCB0eF9zdGF0dXNfdmVjdG9yIHsKKwl1NjQJCXNlbnQ6MTsgLyogYWx3YXlzIHNldCB0byAxLi4uKi8KKwl1NjQJCXBhZDA6MzQ7LyogYWx3YXlzIHNldCB0byAwICovCisJdTY0CQlmbGFnczo5OwkJCS8qSSdtIHRvbyBsYXp5IHRvIHNwZWNpZnkgZWFjaCBvbmUgc2VwYXJhdGVseSBhdCB0aGUgbW9tZW50Ki8KKwl1NjQJCWNvbF9yZXRyeV9jbnQ6NDsJLypjb2xsaXNpb24gcmV0cnkgY291bnQqLworCXU2NAkJbGVuOjE2OwkJCQkvKlRyYW5zbWl0IGxlbmd0aCBpbiBieXRlcyovCit9IHR4X3N0YXR1c192ZWN0b3I7CisKKy8qCisgKiBFYWNoIHBhY2tldCBpcyAxMjggYnl0ZXMgbG9uZy4KKyAqIEl0IGNvbnNpc3RzIG9mIGhlYWRlciwgMC0zIGNvbmNhdGluYXRpb24KKyAqIGJ1ZmZlciBwb2ludGVycyBhbmQgdXAgdG8gMTIwIGRhdGEgYnl0ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHR4X3BhY2tldF9oZHIgeworCXU2NAkJcGFkMTozNjsgLypzaG91bGQgYmUgZmlsbGVkIHdpdGggMCAqLworCXU2NAkJY2F0X3B0cjNfdmFsaWQ6MSwJLypDb25jYXRpbmF0aW9uIHBvaW50ZXIgdmFsaWQgZmxhZ3MqLworCQkJY2F0X3B0cjJfdmFsaWQ6MSwKKwkJCWNhdF9wdHIxX3ZhbGlkOjE7CisJdTY0CQl0eF9pbnRfZmxhZzoxOwkJLypHZW5lcmF0ZSBUWCBpbnRycnVwdCB3aGVuIHBhY2tldCBoYXMgYmVlbiBzZW50Ki8KKwl1NjQJCXRlcm1fZG1hX2ZsYWc6MTsJLypUZXJtaW5hdGUgdHJhbnNtaXQgRE1BIG9uIHRyYW5zbWl0IGFib3J0IGNvbmRpdGlvbnMqLworCXU2NAkJZGF0YV9vZmZzZXQ6NzsJCS8qU3RhcnRpbmcgYnl0ZSBvZmZzZXQgaW4gcmluZyBkYXRhIGJsb2NrKi8KKwl1NjQJCWRhdGFfbGVuOjE2OwkJLypMZW5ndGggb2YgdmFsaWQgZGF0YSBpbiBieXRlcy0xKi8KK30gdHhfcGFja2V0X2hkcjsKK3R5cGVkZWYgdW5pb24gdHhfY2F0X3B0ciB7CisJc3RydWN0IHsKKwkJdTY0CQlwYWQyOjE2OyAvKiBzaG91bGQgYmUgMCAqLworCQl1NjQJCWxlbjoxNjsJCQkJLypsZW5ndGggb2YgYnVmZmVyIGRhdGEgLSAxKi8KKwkJdTY0CQlzdGFydF9hZGRyOjI5OwkJLypQaHlzaWNhbCBzdGFydGluZyBhZGRyZXNzKi8KKwkJdTY0CQlwYWQxOjM7IC8qIHNob3VsZCBiZSB6ZXJvICovCisJfSBmb3JtOworCXU2NCByYXc7Cit9IHR4X2NhdF9wdHI7CisKK3R5cGVkZWYgc3RydWN0IHR4X3BhY2tldCB7CisJdW5pb24geworCQl0eF9wYWNrZXRfaGRyIGhlYWRlcjsKKwkJdHhfc3RhdHVzX3ZlY3RvciByZXM7CisJCXU2NCByYXc7CisJfWhlYWRlcjsKKwl1bmlvbiB7CisJCXR4X2NhdF9wdHIgY2F0X2J1ZlszXTsKKwkJY2hhciBkdFsxMjBdOworCX0gZGF0YTsKK30gdHhfcGFja2V0OworCit0eXBlZGVmIHVuaW9uIHJ4X3N0YXR1c192ZWN0b3IgeworCXZvbGF0aWxlIHN0cnVjdCB7CisJCXU2NAkJcGFkMToxOy8qZmlsbCBpdCB3aXRoIG9uZXMqLworCQl1NjQJCXBhZDI6MTU7LypmaWxsIHdpdGggMCovCisJCXU2NAkJaXBfY2hrX3N1bToxNjsKKwkJdTY0CQlzZXFfbnVtOjU7CisJCXU2NAkJbWFjX2FkZHJfbWF0Y2g6MTsKKwkJdTY0CQltY2FzdF9hZGRyX21hdGNoOjE7CisJCXU2NAkJY2Fycmllcl9ldmVudF9zZWVuOjE7CisJCXU2NAkJYmFkX3BhY2tldDoxOworCQl1NjQJCWxvbmdfZXZlbnRfc2VlbjoxOworCQl1NjQJCWludmFsaWRfcHJlYW1ibGU6MTsKKwkJdTY0CQlicm9hZGNhc3Q6MTsKKwkJdTY0CQltdWx0aWNhc3Q6MTsKKwkJdTY0CQljcmNfZXJyb3I6MTsKKwkJdTY0CQlodWg6MTsvKj8/PyovCisJCXU2NAkJcnhfY29kZV92aW9sYXRpb246MTsKKwkJdTY0CQlyeF9sZW46MTY7CisJfSBwYXJzZWQ7CisJdm9sYXRpbGUgdTY0IHJhdzsKK30gcnhfc3RhdHVzX3ZlY3RvcjsKKwordHlwZWRlZiBzdHJ1Y3QgcnhfcGFja2V0IHsKKwlyeF9zdGF0dXNfdmVjdG9yIHN0YXR1czsKKyAgICAgICAgdTY0IHBhZFszXTsgLyogRm9yIHdoYXRldmVyIHJlYXNvbiwgdGhlcmUgbmVlZHMgdG8gYmUgNCBkb3VibGUtd29yZCBvZmZzZXQgKi8KKyAgICAgICAgdTE2IHBhZDI7CisJY2hhciBidWZbTUVUSF9SWF9CVUZGX1NJWkUtc2l6ZW9mKHJ4X3N0YXR1c192ZWN0b3IpLTMqc2l6ZW9mKHU2NCktc2l6ZW9mKHUxNildOy8qIGRhdGEgKi8KK30gcnhfcGFja2V0OworCisjZGVmaW5lIFRYX0lORk9fUlBUUiAgICAweDAwRkYwMDAwCisjZGVmaW5lIFRYX0lORk9fV1BUUiAgICAweDAwMDAwMEZGCisKKwkvKiBCaXRzIGluIE1FVEhfTUFDICovCisKKyNkZWZpbmUgU0dJX01BQ19SRVNFVAkJQklUKDApCS8qIDA6IE1BQzExMCBhY3RpdmUgaW4gcnVuIG1vZGUsIDE6IEdsb2JhbCByZXNldCBzaWduYWwgdG8gTUFDMTEwIGNvcmUgaXMgYWN0aXZlICovCisjZGVmaW5lIE1FVEhfUEhZX0ZEWAkJQklUKDEpIC8qIDA6IERpc2FibGUgZnVsbCBkdXBsZXgsIDE6IEVuYWJsZSBmdWxsIGR1cGxleCAqLworI2RlZmluZSBNRVRIX1BIWV9MT09QCUJJVCgyKSAvKiAwOiBOb3JtYWwgb3BlcmF0aW9uLCBmb2xsb3dzIDEwLzEwMG1iaXQgYW5kIE0xMFQvTUlJIHNlbGVjdCwgMTogbG9vcHMgaW50ZXJuYWwgTUlJIGJ1cyAqLworCQkJCSAgICAgICAvKiAgICBzZWxlY3RzIGlnbm9yZWQgKi8KKyNkZWZpbmUgTUVUSF8xMDBNQklUCQlCSVQoMykgLyogMDogMTBtZWcgbW9kZSwgMTogMTAwbWVnIG1vZGUgKi8KKyNkZWZpbmUgTUVUSF9QSFlfTUlJCQlCSVQoNCkgLyogMDogTUlJIHNlbGVjdGVkLCAxOiBTSUEgc2VsZWN0ZWQgKi8KKwkJCQkgICAgICAgLyogICBOb3RlOiB3aGVuIGxvb3BiYWNrIGlzIHNldCB0aGlzIGJpdCBiZWNvbWVzIGNvbGxpc2lvbiBjb250cm9sLiAgU2V0dGluZyB0aGlzIGJpdCB3aWxsICovCisJCQkJICAgICAgIC8qICAgICAgICAgY2F1c2UgYSBjb2xsaXNpb24gdG8gYmUgcmVwb3J0ZWQuICovCisKKwkJCQkgICAgICAgLyogQml0cyA1IGFuZCA2IGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdGhlIERlc3RpbmF0aW9uIGFkZHJlc3MgZmlsdGVyIG1vZGUgKi8KKyNkZWZpbmUgTUVUSF9BQ0NFUFRfTVkgMAkJCS8qIDAwOiBBY2NlcHQgUEhZIGFkZHJlc3Mgb25seSAqLworI2RlZmluZSBNRVRIX0FDQ0VQVF9NQ0FTVCAweDIwCS8qIDAxOiBBY2NlcHQgcGh5c2ljYWwsIGJyb2FkY2FzdCwgYW5kIG11bHRpY2FzdCBmaWx0ZXIgbWF0Y2hlcyBvbmx5ICovCisjZGVmaW5lIE1FVEhfQUNDRVBUX0FNQ0FTVCAweDQwCS8qIDEwOiBBY2NlcHQgcGh5c2ljYWwsIGJyb2FkY2FzdCwgYW5kIGFsbCBtdWx0aWNhc3QgcGFja2V0cyAqLworI2RlZmluZSBNRVRIX1BST01JU0MgMHg2MAkJLyogMTE6IFByb21pc2Npb3VzIG1vZGUgKi8KKworI2RlZmluZSBNRVRIX1BIWV9MSU5LX0ZBSUwJQklUKDcpIC8qIDA6IExpbmsgZmFpbHVyZSBkZXRlY3Rpb24gZGlzYWJsZWQsIDE6IEhhcmR3YXJlIHNjYW5zIGZvciBsaW5rIGZhaWx1cmUgaW4gUEhZICovCisKKyNkZWZpbmUgTUVUSF9NQUNfSVBHCTB4MWZmZmYwMAorCisjZGVmaW5lIE1FVEhfREVGQVVMVF9JUEcgKCgxNzw8MTUpIHwgKDExPDwyMikgfCAoMjE8PDgpKQorCQkJCQkJLyogMHgxNzJlNWMwMCAqLyAvKiAyMywgMjMsIDIzICovIC8qMHg1NEE5NTAwICovLyoyMSwyMSwyMSovCisJCQkJICAgICAgIC8qIEJpdHMgOCB0aHJvdWdoIDE0IGFyZSB1c2VkIHRvIGRldGVybWluZSBJbnRlci1QYWNrZXQgR2FwIGJldHdlZW4gIkJhY2sgdG8gQmFjayIgcGFja2V0cyAqLworCQkJCSAgICAgICAvKiBUaGUgZ2FwIGRlcGVuZHMgb24gdGhlIGNsb2NrIHNwZWVkIG9mIHRoZSBsaW5rLCA4MG5zIHBlciBpbmNyZW1lbnQgZm9yIDEwMGJhc2VULCA4MDBucyAgKi8KKwkJCQkgICAgICAgLyogcGVyIGluY3JlbWVudCBmb3IgMTBCYXNlVCAqLworCisJCQkJICAgICAgIC8qIEJpdHMgMTUgdGhyb3VnaCAyMSBhcmUgdXNlZCB0byBkZXRlcm1pbmUgSVBHUjEgKi8KKworCQkJCSAgICAgICAvKiBCaXRzIDIyIHRocm91Z2ggMjggYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIElQR1IyICovCisKKyNkZWZpbmUgTUVUSF9SRVZfU0hJRlQgMjkgICAgICAgLyogQml0cyAyOSB0aHJvdWdoIDMxIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcmV2aXNpb24gKi8KKwkJCQkgICAgICAgLyogMDAwOiBJbml0YWwgcmV2aXNpb24gKi8KKwkJCQkgICAgICAgLyogMDAxOiBGaXJzdCByZXZpc2lvbiwgSW1wcm92ZWQgVFggY29uY2F0ZW5hdGlvbiAqLworCisKKy8qIERNQSBjb250cm9sIGJpdHMgKi8KKyNkZWZpbmUgTUVUSF9SWF9PRkZTRVRfU0hJRlQgMTIgLyogQml0cyAxMjoxNCBvZiBETUEgY29udHJvbCByZWdpc3RlciBpbmRpY2F0ZSBzdGFydGluZyBvZmZzZXQgb2YgcGFja2V0IGRhdGEgZm9yIFJYIG9wZXJhdGlvbiAqLworI2RlZmluZSBNRVRIX1JYX0RFUFRIX1NISUZUIDQgLyogQml0cyA4OjQgZGVmaW5lIFJYIGZpZm8gZGVwdGggLS0gd2hlbiAjIG9mIFJYIGZpZm8gZW50cmllcyAhPSBkZXB0aCwgaW50ZXJydXB0IGlzIGdlbmVydGVkICovCisKKyNkZWZpbmUgTUVUSF9ETUFfVFhfRU4gQklUKDEpIC8qIGVuYWJsZSBUWCBETUEgKi8KKyNkZWZpbmUgTUVUSF9ETUFfVFhfSU5UX0VOIEJJVCgwKSAvKiBlbmFibGUgVFggQnVmZmVyIEVtcHR5IGludGVycnVwdCAqLworI2RlZmluZSBNRVRIX0RNQV9SWF9FTiBCSVQoMTUpIC8qIEVuYWJsZSBSWCAqLworI2RlZmluZSBNRVRIX0RNQV9SWF9JTlRfRU4gQklUKDkpIC8qIEVuYWJsZSBpbnRlcnJ1cHQgb24gUlggcGFja2V0ICovCisKKy8qIFJYIEZJRk8gTUNMIEluZm8gYml0cyAqLworI2RlZmluZSBNRVRIX1JYX0ZJRk9fV1BUUih4KSAgICgoKHgpPj4xNikmMHhmKQorI2RlZmluZSBNRVRIX1JYX0ZJRk9fUlBUUih4KSAgICgoKHgpPj44KSYweGYpCisjZGVmaW5lIE1FVEhfUlhfRklGT19ERVBUSCh4KSAgKCh4KSYweDFmKQorCisvKiBSWCBzdGF0dXMgYml0cyAqLworCisjZGVmaW5lIE1FVEhfUlhfU1RfVkFMSUQgQklUKDYzKQorI2RlZmluZSBNRVRIX1JYX1NUX1JDVl9DT0RFX1ZJT0xBVElPTiBCSVQoMTYpCisjZGVmaW5lIE1FVEhfUlhfU1RfRFJCTF9OQkwgQklUKDE3KQorI2RlZmluZSBNRVRIX1JYX1NUX0NSQ19FUlIgQklUKDE4KQorI2RlZmluZSBNRVRIX1JYX1NUX01DQVNUX1BLVCBCSVQoMTkpCisjZGVmaW5lIE1FVEhfUlhfU1RfQkNBU1RfUEtUIEJJVCgyMCkKKyNkZWZpbmUgTUVUSF9SWF9TVF9JTlZfUFJFQU1CTEVfQ1RYIEJJVCgyMSkKKyNkZWZpbmUgTUVUSF9SWF9TVF9MT05HX0VWVF9TRUVOIEJJVCgyMikKKyNkZWZpbmUgTUVUSF9SWF9TVF9CQURfUEFDS0VUIEJJVCgyMykKKyNkZWZpbmUgTUVUSF9SWF9TVF9DQVJSSUVSX0VWVF9TRUVOIEJJVCgyNCkKKyNkZWZpbmUgTUVUSF9SWF9TVF9NQ0FTVF9GSUxURVJfTUFUQ0ggQklUKDI1KQorI2RlZmluZSBNRVRIX1JYX1NUX1BIWVNfQUREUl9NQVRDSCBCSVQoMjYpCisKKyNkZWZpbmUgTUVUSF9SWF9TVEFUVVNfRVJST1JTIFwKKwkoIFwKKwlNRVRIX1JYX1NUX1JDVl9DT0RFX1ZJT0xBVElPTnwgXAorCU1FVEhfUlhfU1RfQ1JDX0VSUnwgXAorCU1FVEhfUlhfU1RfSU5WX1BSRUFNQkxFX0NUWHwgXAorCU1FVEhfUlhfU1RfTE9OR19FVlRfU0VFTnwgXAorCU1FVEhfUlhfU1RfQkFEX1BBQ0tFVHwgXAorCU1FVEhfUlhfU1RfQ0FSUklFUl9FVlRfU0VFTiBcCisJKQorCS8qIEJpdHMgaW4gTUVUSF9JTlQgKi8KKwkvKiBXcml0ZSBfMV8gdG8gY29ycmVzcG9uZGluZyBiaXQgdG8gY2xlYXIgKi8KKyNkZWZpbmUgTUVUSF9JTlRfVFhfRU1QVFkJQklUKDApCS8qIDA6IE5vIGludGVycnVwdCBwZW5kaW5nLCAxOiBUaGUgVFggcmluZyBidWZmZXIgaXMgZW1wdHkgKi8KKyNkZWZpbmUgTUVUSF9JTlRfVFhfUEtUCQlCSVQoMSkJLyogMDogTm8gaW50ZXJydXB0IHBlbmRpbmcgKi8KKwkJCQkJICAgICAgCS8qIDE6IEEgVFggbWVzc2FnZSBoYWQgdGhlIElOVCByZXF1ZXN0IGJpdCBzZXQsIHRoZSBwYWNrZXQgaGFzIGJlZW4gc2VudC4gKi8KKyNkZWZpbmUgTUVUSF9JTlRfVFhfTElOS19GQUlMCUJJVCgyKQkvKiAwOiBObyBpbnRlcnJ1cHQgcGVuZGluZywgMTogUEhZIGhhcyByZXBvcnRlZCBhIGxpbmsgZmFpbHVyZSAqLworI2RlZmluZSBNRVRIX0lOVF9NRU1fRVJST1IJQklUKDMpCS8qIDA6IE5vIGludGVycnVwdCBwZW5kaW5nICovCisJCQkJCQkvKiAxOiBBIG1lbW9yeSBlcnJvciBvY2N1cnJlZCBkdXJyaW5nIERNQSwgRE1BIHN0b3BwZWQsIEZhdGFsICovCisjZGVmaW5lIE1FVEhfSU5UX1RYX0FCT1JUCQlCSVQoNCkJLyogMDogTm8gaW50ZXJydXB0IHBlbmRpbmcsIDE6IFRoZSBUWCBhYm9ydGVkIG9wZXJhdGlvbiwgRE1BIHN0b3BwZWQsIEZBVEFMICovCisjZGVmaW5lIE1FVEhfSU5UX1JYX1RIUkVTSE9MRAlCSVQoNSkJLyogMDogTm8gaW50ZXJydXB0IHBlbmRpbmcsIDE6IFNlbGVjdGVkIHJlY2VpdmUgdGhyZXNob2xkIGNvbmRpdGlvbiBWYWxpZCAqLworI2RlZmluZSBNRVRIX0lOVF9SWF9VTkRFUkZMT1cJQklUKDYpCS8qIDA6IE5vIGludGVycnVwdCBwZW5kaW5nLCAxOiBGSUZPIHdhcyBlbXB0eSwgcGFja2V0IGNvdWxkIG5vdCBiZSBxdWV1ZWQgKi8KKyNkZWZpbmUgTUVUSF9JTlRfUlhfT1ZFUkZMT1cJCUJJVCg3KQkvKiAwOiBObyBpbnRlcnJ1cHQgcGVuZGluZywgMTogRE1BIEZJRk8gT3ZlcmZsb3csIERNQSBzdG9wcGVkLCBGQVRBTCAqLworCisvKiNkZWZpbmUgTUVUSF9JTlRfUlhfUlBUUl9NQVNLIDB4MDAwMUYwMCovCQkvKiBCaXRzIDggdGhyb3VnaCAxMiBhbGlhcyBvZiBSWCByZWFkLXBvaW50ZXIgKi8KKyNkZWZpbmUgTUVUSF9JTlRfUlhfUlBUUl9NQVNLIDB4MDAwMEYwMAkJLyogQml0cyA4IHRocm91Z2ggMTEgYWxpYXMgb2YgUlggcmVhZC1wb2ludGVyIC0gc28sIGlzIFJ4IEZJRk8gMTYgb3IgMzIgZW50cnk/Ki8KKworCQkJCQkJLyogQml0cyAxMyB0aHJvdWdoIDE1IGFyZSBhbHdheXMgMC4gKi8KKworI2RlZmluZSBNRVRIX0lOVF9UWF9SUFRSX01BU0sJMHgxRkYwMDAwICAgICAgICAvKiBCaXRzIDE2IHRocm91Z2ggMjQgYWxpYXMgb2YgVFggcmVhZC1wb2ludGVyICovCisKKyNkZWZpbmUgTUVUSF9JTlRfUlhfU0VRX01BU0sJMHgyRTAwMDAwMAkvKiBCaXRzIDI1IHRocm91Z2ggMjkgYXJlIHRoZSBzdGFydGluZyBzZXEgbnVtYmVyIGZvciB0aGUgbWVzc2FnZSBhdCB0aGUgKi8KKworCQkJCQkJLyogdG9wIG9mIHRoZSBxdWV1ZSAqLworCisjZGVmaW5lIE1FVEhfSU5UX0VSUk9SCShNRVRIX0lOVF9UWF9MSU5LX0ZBSUx8IFwKKwkJCU1FVEhfSU5UX01FTV9FUlJPUnwgXAorCQkJTUVUSF9JTlRfVFhfQUJPUlR8IFwKKwkJCU1FVEhfSU5UX1JYX09WRVJGTE9XfCBcCisJCQlNRVRIX0lOVF9SWF9VTkRFUkZMT1cpCisKKyNkZWZpbmUgTUVUSF9JTlRfTUNBU1RfSEFTSAkJQklUKDMwKSAvKiBJZiBSWCBETUEgaXMgZW5hYmxlZCB0aGUgaGFzaCBzZWxlY3QgbG9naWMgb3V0cHV0IGlzIGxhdGNoZWQgaGVyZSAqLworCisvKiBUWCBzdGF0dXMgYml0cyAqLworI2RlZmluZSBNRVRIX1RYX1NUX0RPTkUgICAgICBCSVQoNjMpIC8qIFRYIGNvbXBsZXRlICovCisjZGVmaW5lIE1FVEhfVFhfU1RfU1VDQ0VTUyAgIEJJVCgyMykgLyogUGFja2V0IHdhcyB0cmFuc21pdHRlZCBzdWNjZXNzZnVsbHkgKi8KKyNkZWZpbmUgTUVUSF9UWF9TVF9UT09MT05HICAgQklUKDI0KSAvKiBUWCBhYm9ydCBkdWUgdG8gZXhjZXNzaXZlIGxlbmd0aCAqLworI2RlZmluZSBNRVRIX1RYX1NUX1VOREVSUlVOICBCSVQoMjUpIC8qIFRYIGFib3J0IGR1ZSB0byB1bmRlcnJ1biAoPykgKi8KKyNkZWZpbmUgTUVUSF9UWF9TVF9FWENDT0xMICAgQklUKDI2KSAvKiBUWCBhYm9ydCBkdWUgdG8gZXhjZXNzIGNvbGxpc2lvbnMgKi8KKyNkZWZpbmUgTUVUSF9UWF9TVF9ERUZFUiAgICAgQklUKDI3KSAvKiBUWCBhYm9ydCBkdWUgdG8gZXhjZXNzIGRlZmVyYWxzICovCisjZGVmaW5lIE1FVEhfVFhfU1RfTEFURUNPTEwgIEJJVCgyOCkgLyogVFggYWJvcnQgZHVlIHRvIGxhdGUgY29sbGlzaW9uICovCisKKworLyogVHggY29tbWFuZCBoZWFkZXIgYml0cyAqLworI2RlZmluZSBNRVRIX1RYX0NNRF9JTlRfRU4gQklUKDI0KSAvKiBHZW5lcmF0ZSBUWCBpbnRlcnJ1cHQgd2hlbiBwYWNrZXQgaXMgc2VudCAqLworCisvKiBQaHkgTURJTyBpbnRlcmZhY2UgYnVzeSBmbGFnICovCisjZGVmaW5lIE1ESU9fQlVTWSAgICBCSVQoMTYpCisjZGVmaW5lIE1ESU9fREFUQV9NQVNLIDB4RkZGRgorLyogUEhZIGRlZmluZXMgKi8KKyNkZWZpbmUgUEhZX1FTNjYxMlggICAgMHgwMTgxNDQxICAgIC8qIFF1YWxpdHkgVFggKi8KKyNkZWZpbmUgUEhZX0lDUzE4ODkgICAgMHgwMDE1RjQxICAgIC8qIElDUyBGWCAqLworI2RlZmluZSBQSFlfSUNTMTg5MCAgICAweDAwMTVGNDIgICAgLyogSUNTIFRYICovCisjZGVmaW5lIFBIWV9EUDgzODQwICAgIDB4MjAwMDVDMCAgICAvKiBOYXRpb25hbCBUWCAqLworCisjZGVmaW5lIEFEVkFOQ0VfUlhfUFRSKHgpICB4PSh4KzEpJihSWF9SSU5HX0VOVFJJRVMtMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21paS5jIGIvZHJpdmVycy9uZXQvbWlpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzY2IzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L21paS5jCkBAIC0wLDAgKzEsMzk4IEBACisvKgorCisJbWlpLmM6IE1JSSBpbnRlcmZhY2UgbGlicmFyeQorCisJTWFpbnRhaW5lZCBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJQ29weXJpZ2h0IDIwMDEsMjAwMiBKZWZmIEdhcnppaworCisJVmFyaW91cyBjb2RlIGNhbWUgZnJvbSBteXNvbjgwMy5jIGFuZCBvdGhlciBmaWxlcyBieQorCURvbmFsZCBCZWNrZXIuICBDb3B5cmlnaHQ6CisKKwkJV3JpdHRlbiAxOTk4LTIwMDIgYnkgRG9uYWxkIEJlY2tlci4KKworCQlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcKKwkJdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKKwkJaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuICBEcml2ZXJzIGJhc2VkIG9uCisJCW9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisJCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4KKwkJVGhpcyBmaWxlIGlzIG5vdCBhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlCisJCXVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZyBzeXN0ZW0gaXMgbGljZW5zZWQKKwkJdW5kZXIgdGhlIEdQTC4KKworCQlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCQlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwkJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwkJQW5uYXBvbGlzIE1EIDIxNDAzCisKKworICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisKK2ludCBtaWlfZXRodG9vbF9nc2V0KHN0cnVjdCBtaWlfaWZfaW5mbyAqbWlpLCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG1paS0+ZGV2OworCXUzMiBhZHZlcnQsIGJtY3IsIGxwYSwgbmVnbzsKKwl1MzIgYWR2ZXJ0MiA9IDAsIGJtY3IyID0gMCwgbHBhMiA9IDA7CisKKwllY21kLT5zdXBwb3J0ZWQgPQorCSAgICAoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCSAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJICAgICBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF9NSUkpOworCWlmIChtaWktPnN1cHBvcnRzX2dtaWkpCisJCWVjbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYgfAorCQkJU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOworCisJLyogb25seSBzdXBwb3J0cyB0d2lzdGVkLXBhaXIgKi8KKwllY21kLT5wb3J0ID0gUE9SVF9NSUk7CisKKwkvKiBvbmx5IHN1cHBvcnRzIGludGVybmFsIHRyYW5zY2VpdmVyICovCisJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCisJLyogdGhpcyBpc24ndCBmdWxseSBzdXBwb3J0ZWQgYXQgaGlnaGVyIGxheWVycyAqLworCWVjbWQtPnBoeV9hZGRyZXNzID0gbWlpLT5waHlfaWQ7CisKKwllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfVFAgfCBBRFZFUlRJU0VEX01JSTsKKwlhZHZlcnQgPSBtaWktPm1kaW9fcmVhZChkZXYsIG1paS0+cGh5X2lkLCBNSUlfQURWRVJUSVNFKTsKKwlpZiAobWlpLT5zdXBwb3J0c19nbWlpKQorCQlhZHZlcnQyID0gbWlpLT5tZGlvX3JlYWQoZGV2LCBtaWktPnBoeV9pZCwgTUlJX0NUUkwxMDAwKTsKKworCWlmIChhZHZlcnQgJiBBRFZFUlRJU0VfMTBIQUxGKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZjsKKwlpZiAoYWR2ZXJ0ICYgQURWRVJUSVNFXzEwRlVMTCkKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGw7CisJaWYgKGFkdmVydCAmIEFEVkVSVElTRV8xMDBIQUxGKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGY7CisJaWYgKGFkdmVydCAmIEFEVkVSVElTRV8xMDBGVUxMKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7CisJaWYgKGFkdmVydDIgJiBBRFZFUlRJU0VfMTAwMEhBTEYpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGY7CisJaWYgKGFkdmVydDIgJiBBRFZFUlRJU0VfMTAwMEZVTEwpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7CisKKwlibWNyID0gbWlpLT5tZGlvX3JlYWQoZGV2LCBtaWktPnBoeV9pZCwgTUlJX0JNQ1IpOworCWxwYSA9IG1paS0+bWRpb19yZWFkKGRldiwgbWlpLT5waHlfaWQsIE1JSV9MUEEpOworCWlmIChtaWktPnN1cHBvcnRzX2dtaWkpIHsKKwkJYm1jcjIgPSBtaWktPm1kaW9fcmVhZChkZXYsIG1paS0+cGh5X2lkLCBNSUlfQ1RSTDEwMDApOworCQlscGEyID0gbWlpLT5tZGlvX3JlYWQoZGV2LCBtaWktPnBoeV9pZCwgTUlJX1NUQVQxMDAwKTsKKwl9CisJaWYgKGJtY3IgJiBCTUNSX0FORU5BQkxFKSB7CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKKwkJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCQkKKwkJbmVnbyA9IG1paV9ud2F5X3Jlc3VsdChhZHZlcnQgJiBscGEpOworCQlpZiAoKGJtY3IyICYgKEFEVkVSVElTRV8xMDAwSEFMRiB8IEFEVkVSVElTRV8xMDAwRlVMTCkpICYgCisJCSAgICAobHBhMiA+PiAyKSkKKwkJCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwMDsKKwkJZWxzZSBpZiAobmVnbyA9PSBMUEFfMTAwRlVMTCB8fCBuZWdvID09IExQQV8xMDBIQUxGKQorCQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDA7CisJCWVsc2UKKwkJCWVjbWQtPnNwZWVkID0gU1BFRURfMTA7CisJCWlmICgobHBhMiAmIExQQV8xMDAwRlVMTCkgfHwgbmVnbyA9PSBMUEFfMTAwRlVMTCB8fAorCQkgICAgbmVnbyA9PSBMUEFfMTBGVUxMKSB7CisJCQllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJCW1paS0+ZnVsbF9kdXBsZXggPSAxOworCQl9IGVsc2UgeworCQkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCQltaWktPmZ1bGxfZHVwbGV4ID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisKKwkJZWNtZC0+c3BlZWQgPSAoKGJtY3IgJiBCTUNSX1NQRUVEMTAwMCAmJiAKKwkJCQkoYm1jciAmIEJNQ1JfU1BFRUQxMDApID09IDApID8gU1BFRURfMTAwMCA6CisJCQkgICAgICAgKGJtY3IgJiBCTUNSX1NQRUVEMTAwKSA/IFNQRUVEXzEwMCA6IFNQRUVEXzEwKTsKKwkJZWNtZC0+ZHVwbGV4ID0gKGJtY3IgJiBCTUNSX0ZVTExEUExYKSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJfQorCisJLyogaWdub3JlIG1heHR4cGt0LCBtYXhyeHBrdCBmb3Igbm93ICovCisKKwlyZXR1cm4gMDsKK30KKworaW50IG1paV9ldGh0b29sX3NzZXQoc3RydWN0IG1paV9pZl9pbmZvICptaWksIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbWlpLT5kZXY7CisKKwlpZiAoZWNtZC0+c3BlZWQgIT0gU1BFRURfMTAgJiYgCisJICAgIGVjbWQtPnNwZWVkICE9IFNQRUVEXzEwMCAmJiAKKwkgICAgZWNtZC0+c3BlZWQgIT0gU1BFRURfMTAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJiBlY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlY21kLT5wb3J0ICE9IFBPUlRfTUlJKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+dHJhbnNjZWl2ZXIgIT0gWENWUl9JTlRFUk5BTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPnBoeV9hZGRyZXNzICE9IG1paS0+cGh5X2lkKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0RJU0FCTEUgJiYgZWNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKChlY21kLT5zcGVlZCA9PSBTUEVFRF8xMDAwKSAmJiAoIW1paS0+c3VwcG9ydHNfZ21paSkpCisJCXJldHVybiAtRUlOVkFMOworCQkJCSAgCisJLyogaWdub3JlIHN1cHBvcnRlZCwgbWF4dHhwa3QsIG1heHJ4cGt0ICovCisJCisJaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJdTMyIGJtY3IsIGFkdmVydCwgdG1wOworCQl1MzIgYWR2ZXJ0MiA9IDAsIHRtcDIgPSAwOworCisJCWlmICgoZWNtZC0+YWR2ZXJ0aXNpbmcgJiAoQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfAorCQkJCQkgIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKKwkJCQkJICBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfAorCQkJCQkgIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8CisJCQkJCSAgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8CisJCQkJCSAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkpID09IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBhZHZlcnRpc2Ugb25seSB3aGF0IGhhcyBiZWVuIHJlcXVlc3RlZCAqLworCQlhZHZlcnQgPSBtaWktPm1kaW9fcmVhZChkZXYsIG1paS0+cGh5X2lkLCBNSUlfQURWRVJUSVNFKTsKKwkJdG1wID0gYWR2ZXJ0ICYgfihBRFZFUlRJU0VfQUxMIHwgQURWRVJUSVNFXzEwMEJBU0U0KTsKKwkJaWYgKG1paS0+c3VwcG9ydHNfZ21paSkgeworCQkJYWR2ZXJ0MiA9IG1paS0+bWRpb19yZWFkKGRldiwgbWlpLT5waHlfaWQsIE1JSV9DVFJMMTAwMCk7CisJCQl0bXAyID0gYWR2ZXJ0MiAmIH4oQURWRVJUSVNFXzEwMDBIQUxGIHwgQURWRVJUSVNFXzEwMDBGVUxMKTsKKwkJfQorCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKKwkJCXRtcCB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJCXRtcCB8PSBBRFZFUlRJU0VfMTBGVUxMOworCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCQl0bXAgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJCWlmIChlY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKKwkJCXRtcCB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwkJaWYgKG1paS0+c3VwcG9ydHNfZ21paSkgeworCQkJaWYgKGVjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZikKKwkJCQl0bXAyIHw9IEFEVkVSVElTRV8xMDAwSEFMRjsKKwkJCWlmIChlY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpCisJCQkJdG1wMiB8PSBBRFZFUlRJU0VfMTAwMEZVTEw7CisJCX0KKwkJaWYgKGFkdmVydCAhPSB0bXApIHsKKwkJCW1paS0+bWRpb193cml0ZShkZXYsIG1paS0+cGh5X2lkLCBNSUlfQURWRVJUSVNFLCB0bXApOworCQkJbWlpLT5hZHZlcnRpc2luZyA9IHRtcDsKKwkJfQorCQlpZiAoKG1paS0+c3VwcG9ydHNfZ21paSkgJiYgKGFkdmVydDIgIT0gdG1wMikpCisJCQltaWktPm1kaW9fd3JpdGUoZGV2LCBtaWktPnBoeV9pZCwgTUlJX0NUUkwxMDAwLCB0bXAyKTsKKwkJCisJCS8qIHR1cm4gb24gYXV0b25lZ290aWF0aW9uLCBhbmQgZm9yY2UgYSByZW5lZ290aWF0ZSAqLworCQlibWNyID0gbWlpLT5tZGlvX3JlYWQoZGV2LCBtaWktPnBoeV9pZCwgTUlJX0JNQ1IpOworCQlibWNyIHw9IChCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpOworCQltaWktPm1kaW9fd3JpdGUoZGV2LCBtaWktPnBoeV9pZCwgTUlJX0JNQ1IsIGJtY3IpOworCisJCW1paS0+Zm9yY2VfbWVkaWEgPSAwOworCX0gZWxzZSB7CisJCXUzMiBibWNyLCB0bXA7CisKKwkJLyogdHVybiBvZmYgYXV0byBuZWdvdGlhdGlvbiwgc2V0IHNwZWVkIGFuZCBkdXBsZXhpdHkgKi8KKwkJYm1jciA9IG1paS0+bWRpb19yZWFkKGRldiwgbWlpLT5waHlfaWQsIE1JSV9CTUNSKTsKKwkJdG1wID0gYm1jciAmIH4oQk1DUl9BTkVOQUJMRSB8IEJNQ1JfU1BFRUQxMDAgfCAKKwkJCSAgICAgICBCTUNSX1NQRUVEMTAwMCB8IEJNQ1JfRlVMTERQTFgpOworCQlpZiAoZWNtZC0+c3BlZWQgPT0gU1BFRURfMTAwMCkKKwkJCXRtcCB8PSBCTUNSX1NQRUVEMTAwMDsKKwkJZWxzZSBpZiAoZWNtZC0+c3BlZWQgPT0gU1BFRURfMTAwKQorCQkJdG1wIHw9IEJNQ1JfU1BFRUQxMDA7CisJCWlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpIHsKKwkJCXRtcCB8PSBCTUNSX0ZVTExEUExYOworCQkJbWlpLT5mdWxsX2R1cGxleCA9IDE7CisJCX0gZWxzZQorCQkJbWlpLT5mdWxsX2R1cGxleCA9IDA7CisJCWlmIChibWNyICE9IHRtcCkKKwkJCW1paS0+bWRpb193cml0ZShkZXYsIG1paS0+cGh5X2lkLCBNSUlfQk1DUiwgdG1wKTsKKworCQltaWktPmZvcmNlX21lZGlhID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBtaWlfbGlua19vayAoc3RydWN0IG1paV9pZl9pbmZvICptaWkpCit7CisJLyogZmlyc3QsIGEgZHVtbXkgcmVhZCwgbmVlZGVkIHRvIGxhdGNoIHNvbWUgTUlJIHBoeXMgKi8KKwltaWktPm1kaW9fcmVhZChtaWktPmRldiwgbWlpLT5waHlfaWQsIE1JSV9CTVNSKTsKKwlpZiAobWlpLT5tZGlvX3JlYWQobWlpLT5kZXYsIG1paS0+cGh5X2lkLCBNSUlfQk1TUikgJiBCTVNSX0xTVEFUVVMpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitpbnQgbWlpX253YXlfcmVzdGFydCAoc3RydWN0IG1paV9pZl9pbmZvICptaWkpCit7CisJaW50IGJtY3I7CisJaW50IHIgPSAtRUlOVkFMOworCisJLyogaWYgYXV0b25lZyBpcyBvZmYsIGl0J3MgYW4gZXJyb3IgKi8KKwlibWNyID0gbWlpLT5tZGlvX3JlYWQobWlpLT5kZXYsIG1paS0+cGh5X2lkLCBNSUlfQk1DUik7CisKKwlpZiAoYm1jciAmIEJNQ1JfQU5FTkFCTEUpIHsKKwkJYm1jciB8PSBCTUNSX0FOUkVTVEFSVDsKKwkJbWlpLT5tZGlvX3dyaXRlKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0JNQ1IsIGJtY3IpOworCQlyID0gMDsKKwl9CisKKwlyZXR1cm4gcjsKK30KKwordm9pZCBtaWlfY2hlY2tfbGluayAoc3RydWN0IG1paV9pZl9pbmZvICptaWkpCit7CisJaW50IGN1cl9saW5rID0gbWlpX2xpbmtfb2sobWlpKTsKKwlpbnQgcHJldl9saW5rID0gbmV0aWZfY2Fycmllcl9vayhtaWktPmRldik7CisKKwlpZiAoY3VyX2xpbmsgJiYgIXByZXZfbGluaykKKwkJbmV0aWZfY2Fycmllcl9vbihtaWktPmRldik7CisJZWxzZSBpZiAocHJldl9saW5rICYmICFjdXJfbGluaykKKwkJbmV0aWZfY2Fycmllcl9vZmYobWlpLT5kZXYpOworfQorCit1bnNpZ25lZCBpbnQgbWlpX2NoZWNrX21lZGlhIChzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBva190b19wcmludCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBpbml0X21lZGlhKQoreworCXVuc2lnbmVkIGludCBvbGRfY2FycmllciwgbmV3X2NhcnJpZXI7CisJaW50IGFkdmVydGlzZSwgbHBhLCBtZWRpYSwgZHVwbGV4OworCWludCBscGEyID0gMDsKKworCS8qIGlmIGZvcmNlZCBtZWRpYSwgZ28gbm8gZnVydGhlciAqLworCWlmIChtaWktPmZvcmNlX21lZGlhKQorCQlyZXR1cm4gMDsgLyogZHVwbGV4IGRpZCBub3QgY2hhbmdlICovCisKKwkvKiBjaGVjayBjdXJyZW50IGFuZCBvbGQgbGluayBzdGF0dXMgKi8KKwlvbGRfY2FycmllciA9IG5ldGlmX2NhcnJpZXJfb2sobWlpLT5kZXYpID8gMSA6IDA7CisJbmV3X2NhcnJpZXIgPSAodW5zaWduZWQgaW50KSBtaWlfbGlua19vayhtaWkpOworCisJLyogaWYgY2FycmllciBzdGF0ZSBkaWQgbm90IGNoYW5nZSwgdGhpcyBpcyBhICJib3VuY2UiLAorCSAqIGp1c3QgZXhpdCBhcyBldmVyeXRoaW5nIGlzIGFscmVhZHkgc2V0IGNvcnJlY3RseQorCSAqLworCWlmICgoIWluaXRfbWVkaWEpICYmIChvbGRfY2FycmllciA9PSBuZXdfY2FycmllcikpCisJCXJldHVybiAwOyAvKiBkdXBsZXggZGlkIG5vdCBjaGFuZ2UgKi8KKworCS8qIG5vIGNhcnJpZXIsIG5vdGhpbmcgbXVjaCB0byBkbyAqLworCWlmICghbmV3X2NhcnJpZXIpIHsKKwkJbmV0aWZfY2Fycmllcl9vZmYobWlpLT5kZXYpOworCQlpZiAob2tfdG9fcHJpbnQpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayBkb3duXG4iLCBtaWktPmRldi0+bmFtZSk7CisJCXJldHVybiAwOyAvKiBkdXBsZXggZGlkIG5vdCBjaGFuZ2UgKi8KKwl9CisKKwkvKgorCSAqIHdlIGhhdmUgY2Fycmllciwgc2VlIHdobydzIG9uIHRoZSBvdGhlciBlbmQKKwkgKi8KKwluZXRpZl9jYXJyaWVyX29uKG1paS0+ZGV2KTsKKworCS8qIGdldCBNSUkgYWR2ZXJ0aXNlIGFuZCBMUEEgdmFsdWVzICovCisJaWYgKCghaW5pdF9tZWRpYSkgJiYgKG1paS0+YWR2ZXJ0aXNpbmcpKQorCQlhZHZlcnRpc2UgPSBtaWktPmFkdmVydGlzaW5nOworCWVsc2UgeworCQlhZHZlcnRpc2UgPSBtaWktPm1kaW9fcmVhZChtaWktPmRldiwgbWlpLT5waHlfaWQsIE1JSV9BRFZFUlRJU0UpOworCQltaWktPmFkdmVydGlzaW5nID0gYWR2ZXJ0aXNlOworCX0KKwlscGEgPSBtaWktPm1kaW9fcmVhZChtaWktPmRldiwgbWlpLT5waHlfaWQsIE1JSV9MUEEpOworCWlmIChtaWktPnN1cHBvcnRzX2dtaWkpCisJCWxwYTIgPSBtaWktPm1kaW9fcmVhZChtaWktPmRldiwgbWlpLT5waHlfaWQsIE1JSV9TVEFUMTAwMCk7CisKKwkvKiBmaWd1cmUgb3V0IG1lZGlhIGFuZCBkdXBsZXggZnJvbSBhZHZlcnRpc2UgYW5kIExQQSB2YWx1ZXMgKi8KKwltZWRpYSA9IG1paV9ud2F5X3Jlc3VsdChscGEgJiBhZHZlcnRpc2UpOworCWR1cGxleCA9IChtZWRpYSAmIEFEVkVSVElTRV9GVUxMKSA/IDEgOiAwOworCWlmIChscGEyICYgTFBBXzEwMDBGVUxMKQorCQlkdXBsZXggPSAxOworCisJaWYgKG9rX3RvX3ByaW50KQorCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayB1cCwgJXNNYnBzLCAlcy1kdXBsZXgsIGxwYSAweCUwNFhcbiIsCisJCSAgICAgICBtaWktPmRldi0+bmFtZSwKKwkJICAgICAgIGxwYTIgJiAoTFBBXzEwMDBGVUxMIHwgTFBBXzEwMDBIQUxGKSA/ICIxMDAwIiA6CisJCSAgICAgICBtZWRpYSAmIChBRFZFUlRJU0VfMTAwRlVMTCB8IEFEVkVSVElTRV8xMDBIQUxGKSA/ICIxMDAiIDogIjEwIiwKKwkJICAgICAgIGR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIiwKKwkJICAgICAgIGxwYSk7CisKKwlpZiAoKGluaXRfbWVkaWEpIHx8IChtaWktPmZ1bGxfZHVwbGV4ICE9IGR1cGxleCkpIHsKKwkJbWlpLT5mdWxsX2R1cGxleCA9IGR1cGxleDsKKwkJcmV0dXJuIDE7IC8qIGR1cGxleCBjaGFuZ2VkICovCisJfQorCisJcmV0dXJuIDA7IC8qIGR1cGxleCBkaWQgbm90IGNoYW5nZSAqLworfQorCitpbnQgZ2VuZXJpY19taWlfaW9jdGwoc3RydWN0IG1paV9pZl9pbmZvICptaWlfaWYsCisJCSAgICAgIHN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqbWlpX2RhdGEsIGludCBjbWQsCisJCSAgICAgIHVuc2lnbmVkIGludCAqZHVwbGV4X2NoZ19vdXQpCit7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBpbnQgZHVwbGV4X2NoYW5nZWQgPSAwOworCisJaWYgKGR1cGxleF9jaGdfb3V0KQorCQkqZHVwbGV4X2NoZ19vdXQgPSAwOworCisJbWlpX2RhdGEtPnBoeV9pZCAmPSBtaWlfaWYtPnBoeV9pZF9tYXNrOworCW1paV9kYXRhLT5yZWdfbnVtICY9IG1paV9pZi0+cmVnX251bV9tYXNrOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CisJCW1paV9kYXRhLT5waHlfaWQgPSBtaWlfaWYtPnBoeV9pZDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwljYXNlIFNJT0NHTUlJUkVHOgorCQltaWlfZGF0YS0+dmFsX291dCA9CisJCQltaWlfaWYtPm1kaW9fcmVhZChtaWlfaWYtPmRldiwgbWlpX2RhdGEtPnBoeV9pZCwKKwkJCQkJICBtaWlfZGF0YS0+cmVnX251bSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU01JSVJFRzogeworCQl1MTYgdmFsID0gbWlpX2RhdGEtPnZhbF9pbjsKKworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChtaWlfZGF0YS0+cGh5X2lkID09IG1paV9pZi0+cGh5X2lkKSB7CisJCQlzd2l0Y2gobWlpX2RhdGEtPnJlZ19udW0pIHsKKwkJCWNhc2UgTUlJX0JNQ1I6IHsKKwkJCQl1bnNpZ25lZCBpbnQgbmV3X2R1cGxleCA9IDA7CisJCQkJaWYgKHZhbCAmIChCTUNSX1JFU0VUfEJNQ1JfQU5FTkFCTEUpKQorCQkJCQltaWlfaWYtPmZvcmNlX21lZGlhID0gMDsKKwkJCQllbHNlCisJCQkJCW1paV9pZi0+Zm9yY2VfbWVkaWEgPSAxOworCQkJCWlmIChtaWlfaWYtPmZvcmNlX21lZGlhICYmCisJCQkJICAgICh2YWwgJiBCTUNSX0ZVTExEUExYKSkKKwkJCQkJbmV3X2R1cGxleCA9IDE7CisJCQkJaWYgKG1paV9pZi0+ZnVsbF9kdXBsZXggIT0gbmV3X2R1cGxleCkgeworCQkJCQlkdXBsZXhfY2hhbmdlZCA9IDE7CisJCQkJCW1paV9pZi0+ZnVsbF9kdXBsZXggPSBuZXdfZHVwbGV4OworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTUlJX0FEVkVSVElTRToKKwkJCQltaWlfaWYtPmFkdmVydGlzaW5nID0gdmFsOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKiBkbyBub3RoaW5nICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQltaWlfaWYtPm1kaW9fd3JpdGUobWlpX2lmLT5kZXYsIG1paV9kYXRhLT5waHlfaWQsCisJCQkJICAgbWlpX2RhdGEtPnJlZ19udW0sIHZhbCk7CisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCXJjID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKworCWlmICgocmMgPT0gMCkgJiYgKGR1cGxleF9jaGdfb3V0KSAmJiAoZHVwbGV4X2NoYW5nZWQpKQorCQkqZHVwbGV4X2NoZ19vdXQgPSAxOworCisJcmV0dXJuIHJjOworfQorCitNT0RVTEVfQVVUSE9SICgiSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OICgiTUlJIGhhcmR3YXJlIHN1cHBvcnQgbGlicmFyeSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitFWFBPUlRfU1lNQk9MKG1paV9saW5rX29rKTsKK0VYUE9SVF9TWU1CT0wobWlpX253YXlfcmVzdGFydCk7CitFWFBPUlRfU1lNQk9MKG1paV9ldGh0b29sX2dzZXQpOworRVhQT1JUX1NZTUJPTChtaWlfZXRodG9vbF9zc2V0KTsKK0VYUE9SVF9TWU1CT0wobWlpX2NoZWNrX2xpbmspOworRVhQT1JUX1NZTUJPTChtaWlfY2hlY2tfbWVkaWEpOworRVhQT1JUX1NZTUJPTChnZW5lcmljX21paV9pb2N0bCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMgYi9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZGUyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCkBAIC0wLDAgKzEsMzAzMyBAQAorLyoKKyAqIGRyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMgLSBEcml2ZXIgZm9yIE1WNjQzWFggZXRoZXJuZXQgcG9ydHMKKyAqIENvcHlyaWdodCAoQykgMjAwMiBNYXR0aGV3IERoYXJtIDxtZGhhcm1AbW9tZW5jby5jb20+CisgKgorICogQmFzZWQgb24gdGhlIDY0MzYwIGRyaXZlciBmcm9tOgorICogQ29weXJpZ2h0IChDKSAyMDAyIHJhYmVlaEBnYWxpbGVvLmNvLmlsCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFBNQy1TaWVycmEsIEluYy4sCisgKgl3cml0dGVuIGJ5IE1hbmlzaCBMYWNod2FuaSAobGFjaHdhbmlAcG1jLXNpZXJyYS5jb20pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIFJhbGYgQmFlY2hsZSA8cmFsZkBsaW51eC1taXBzLm9yZz4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgkJCSAgIERhbGUgRmFybnN3b3J0aCA8ZGFsZUBmYXJuc3dvcnRoLm9yZz4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgU3RldmVuIEouIEhpbGwgPHNqaGlsbDFAcm9ja3dlbGxjb2xsaW5zLmNvbT4KKyAqCQkJCSAgICAgPHNqaGlsbEByZWFsaXR5ZGlsdXRlZC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSAibXY2NDN4eF9ldGguaCIKKworLyoKKyAqIFRoZSBmaXJzdCBwYXJ0IGlzIHRoZSBoaWdoIGxldmVsIGRyaXZlciBvZiB0aGUgZ2lnRSBldGhlcm5ldCBwb3J0cy4KKyAqLworCisvKiBDb25zdGFudHMgKi8KKyNkZWZpbmUgVkxBTl9ITEVOCQk0CisjZGVmaW5lIEZDU19MRU4JCQk0CisjZGVmaW5lIFdSQVAJCQlORVRfSVBfQUxJR04gKyBFVEhfSExFTiArIFZMQU5fSExFTiArIEZDU19MRU4KKyNkZWZpbmUgUlhfU0tCX1NJWkUJCSgoZGV2LT5tdHUgKyBXUkFQICsgNykgJiB+MHg3KQorCisjZGVmaW5lIElOVF9DQVVTRV9VTk1BU0tfQUxMCQkweDAwMDdmZmZmCisjZGVmaW5lIElOVF9DQVVTRV9VTk1BU0tfQUxMX0VYVAkweDAwMTFmZmZmCisjaWZkZWYgTVY2NDNYWF9SWF9RVUVVRV9GSUxMX09OX1RBU0sKKyNkZWZpbmUgSU5UX0NBVVNFX01BU0tfQUxMCQkweDAwMDAwMDAwCisjZGVmaW5lIElOVF9DQVVTRV9DSEVDS19CSVRTCQlJTlRfQ0FVU0VfVU5NQVNLX0FMTAorI2RlZmluZSBJTlRfQ0FVU0VfQ0hFQ0tfQklUU19FWFQJSU5UX0NBVVNFX1VOTUFTS19BTExfRVhUCisjZW5kaWYKKworI2lmZGVmIE1WNjQzWFhfQ0hFQ0tTVU1fT0ZGTE9BRF9UWAorI2RlZmluZSBNQVhfREVTQ1NfUEVSX1NLQgkoTUFYX1NLQl9GUkFHUyArIDEpCisjZWxzZQorI2RlZmluZSBNQVhfREVTQ1NfUEVSX1NLQgkxCisjZW5kaWYKKworI2RlZmluZSBQSFlfV0FJVF9JVEVSQVRJT05TCTEwMDAJLyogMTAwMCBpdGVyYXRpb25zICogMTB1UyA9IDEwbVMgbWF4ICovCisjZGVmaW5lIFBIWV9XQUlUX01JQ1JPX1NFQ09ORFMJMTAKKworLyogU3RhdGljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIGludCBldGhfcG9ydF9saW5rX2lzX3VwKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0pOworc3RhdGljIHZvaWQgZXRoX3BvcnRfdWNfYWRkcl9nZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCXVuc2lnbmVkIGNoYXIgKk1hY0FkZHIpOworc3RhdGljIGludCBtdjY0M3h4X2V0aF9yZWFsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IG12NjQzeHhfZXRoX3JlYWxfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgbXY2NDN4eF9ldGhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptdjY0M3h4X2V0aF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBldGhfcG9ydF9pbml0X21hY190YWJsZXModW5zaWduZWQgaW50IGV0aF9wb3J0X251bSk7CisjaWZkZWYgTVY2NDNYWF9OQVBJCitzdGF0aWMgaW50IG12NjQzeHhfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGV0aGVybmV0X3BoeV9zZXQodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSwgaW50IHBoeV9hZGRyKTsKK3N0YXRpYyBpbnQgZXRoZXJuZXRfcGh5X2RldGVjdCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtKTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbXY2NDN4eF9ldGh0b29sX29wczsKKworc3RhdGljIGNoYXIgbXY2NDN4eF9kcml2ZXJfbmFtZVtdID0gIm12NjQzeHhfZXRoIjsKK3N0YXRpYyBjaGFyIG12NjQzeHhfZHJpdmVyX3ZlcnNpb25bXSA9ICIxLjAiOworCitzdGF0aWMgdm9pZCBfX2lvbWVtICptdjY0M3h4X2V0aF9zaGFyZWRfYmFzZTsKKworLyogdXNlZCB0byBwcm90ZWN0IE1WNjQzWFhfRVRIX1NNSV9SRUcsIHdoaWNoIGlzIHNoYXJlZCBhY3Jvc3MgcG9ydHMgKi8KK3N0YXRpYyBzcGlubG9ja190IG12NjQzeHhfZXRoX3BoeV9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCitzdGF0aWMgaW5saW5lIHUzMiBtdl9yZWFkKGludCBvZmZzZXQpCit7CisJdm9pZCAqX19pb21lbSByZWdfYmFzZTsKKworCXJlZ19iYXNlID0gbXY2NDN4eF9ldGhfc2hhcmVkX2Jhc2UgLSBNVjY0M1hYX0VUSF9TSEFSRURfUkVHUzsKKworCXJldHVybiByZWFkbChyZWdfYmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdl93cml0ZShpbnQgb2Zmc2V0LCB1MzIgZGF0YSkKK3sKKwl2b2lkICogX19pb21lbSByZWdfYmFzZTsKKworCXJlZ19iYXNlID0gbXY2NDN4eF9ldGhfc2hhcmVkX2Jhc2UgLSBNVjY0M1hYX0VUSF9TSEFSRURfUkVHUzsKKwl3cml0ZWwoZGF0YSwgcmVnX2Jhc2UgKyBvZmZzZXQpOworfQorCisvKgorICogQ2hhbmdlcyBNVFUgKG1heGltdW0gdHJhbnNmZXIgdW5pdCkgb2YgdGhlIGdpZ2FiaXQgZXRoZW5yZXQgcG9ydAorICoKKyAqIElucHV0IDoJcG9pbnRlciB0byBldGhlcm5ldCBpbnRlcmZhY2UgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgkJbmV3IG10dSBzaXplCisgKiBPdXRwdXQgOgkwIHVwb24gc3VjY2VzcywgLUVJTlZBTCB1cG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBtdjY0M3h4X2V0aF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoKG5ld19tdHUgPiA5NTAwKSB8fCAobmV3X210dSA8IDY0KSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJLyoKKwkgKiBTdG9wIHRoZW4gcmUtb3BlbiB0aGUgaW50ZXJmYWNlLiBUaGlzIHdpbGwgYWxsb2NhdGUgUlggc2tiJ3Mgd2l0aAorCSAqIHRoZSBuZXcgTVRVLgorCSAqIFRoZXJlIGlzIGEgcG9zc2libGUgZGFuZ2VyIHRoYXQgdGhlIG9wZW4gd2lsbCBub3Qgc3VjY2Vzc2VkLCBkdWUKKwkgKiB0byBtZW1vcnkgaXMgZnVsbCwgd2hpY2ggbWlnaHQgZmFpbCB0aGUgb3BlbiBmdW5jdGlvbi4KKwkgKi8KKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWlmIChtdjY0M3h4X2V0aF9yZWFsX3N0b3AoZGV2KSkKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSIlczogRmF0YWwgZXJyb3Igb24gc3RvcHBpbmcgZGV2aWNlXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCWlmIChtdjY0M3h4X2V0aF9yZWFsX29wZW4oZGV2KSkKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSIlczogRmF0YWwgZXJyb3Igb24gb3BlbmluZyBkZXZpY2VcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKgorICogbXY2NDN4eF9ldGhfcnhfdGFzaworICoKKyAqIEZpbGxzIC8gcmVmaWxscyBSWCBxdWV1ZSBvbiBhIGNlcnRhaW4gZ2lnYWJpdCBldGhlcm5ldCBwb3J0CisgKgorICogSW5wdXQgOglwb2ludGVyIHRvIGV0aGVybmV0IGludGVyZmFjZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqIE91dHB1dCA6CU4vQQorICovCitzdGF0aWMgdm9pZCBtdjY0M3h4X2V0aF9yeF90YXNrKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwa3RfaW5mbyBwa3RfaW5mbzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJm1wLT5yeF90YXNrX2J1c3kpKQorCQlwYW5pYygiJXM6IEVycm9yIGluIHRlc3Rfc2V0X2JpdCAvIGNsZWFyX2JpdCIsIGRldi0+bmFtZSk7CisKKwl3aGlsZSAobXAtPnJ4X3Jpbmdfc2ticyA8IChtcC0+cnhfcmluZ19zaXplIC0gNSkpIHsKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihSWF9TS0JfU0laRSk7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisJCW1wLT5yeF9yaW5nX3NrYnMrKzsKKwkJcGt0X2luZm8uY21kX3N0cyA9IEVUSF9SWF9FTkFCTEVfSU5URVJSVVBUOworCQlwa3RfaW5mby5ieXRlX2NudCA9IFJYX1NLQl9TSVpFOworCQlwa3RfaW5mby5idWZfcHRyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLCBSWF9TS0JfU0laRSwKKwkJCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQlwa3RfaW5mby5yZXR1cm5faW5mbyA9IHNrYjsKKwkJaWYgKGV0aF9yeF9yZXR1cm5fYnVmZihtcCwgJnBrdF9pbmZvKSAhPSBFVEhfT0spIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSIlczogRXJyb3IgYWxsb2NhdGluZyBSWCBSaW5nXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwl9CisJY2xlYXJfYml0KDAsICZtcC0+cnhfdGFza19idXN5KTsKKwkvKgorCSAqIElmIFJYIHJpbmcgaXMgZW1wdHkgb2YgU0tCLCBzZXQgYSB0aW1lciB0byB0cnkgYWxsb2NhdGluZworCSAqIGFnYWluIGluIGEgbGF0ZXIgdGltZSAuCisJICovCisJaWYgKChtcC0+cnhfcmluZ19za2JzID09IDApICYmIChtcC0+cnhfdGltZXJfZmxhZyA9PSAwKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogUnggcmluZyBpcyBlbXB0eVxuIiwgZGV2LT5uYW1lKTsKKwkJLyogQWZ0ZXIgMTAwbVNlYyAqLworCQltcC0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDEwKTsKKwkJYWRkX3RpbWVyKCZtcC0+dGltZW91dCk7CisJCW1wLT5yeF90aW1lcl9mbGFnID0gMTsKKwl9CisjaWZkZWYgTVY2NDNYWF9SWF9RVUVVRV9GSUxMX09OX1RBU0sKKwllbHNlIHsKKwkJLyogUmV0dXJuIGludGVycnVwdHMgKi8KKwkJbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX01BU0tfUkVHKG1wLT5wb3J0X251bSksCisJCQkJCQkJSU5UX0NBVVNFX1VOTUFTS19BTEwpOworCX0KKyNlbmRpZgorfQorCisvKgorICogbXY2NDN4eF9ldGhfcnhfdGFza190aW1lcl93cmFwcGVyCisgKgorICogVGltZXIgcm91dGluZSB0byB3YWtlIHVwIFJYIHF1ZXVlIGZpbGxpbmcgdGFzay4gVGhpcyBmdW5jdGlvbiBpcworICogdXNlZCBvbmx5IGluIGNhc2UgdGhlIFJYIHF1ZXVlIGlzIGVtcHR5LCBhbmQgYWxsIGFsbG9jX3NrYiBoYXMKKyAqIGZhaWxlZCAoZHVlIHRvIG91dCBvZiBtZW1vcnkgZXZlbnQpLgorICoKKyAqIElucHV0IDoJcG9pbnRlciB0byBldGhlcm5ldCBpbnRlcmZhY2UgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKiBPdXRwdXQgOglOL0EKKyAqLworc3RhdGljIHZvaWQgbXY2NDN4eF9ldGhfcnhfdGFza190aW1lcl93cmFwcGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CisKKwltcC0+cnhfdGltZXJfZmxhZyA9IDA7CisJbXY2NDN4eF9ldGhfcnhfdGFzaygodm9pZCAqKWRhdGEpOworfQorCisvKgorICogbXY2NDN4eF9ldGhfdXBkYXRlX21hY19hZGRyZXNzCisgKgorICogVXBkYXRlIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgcG9ydCBpbiB0aGUgYWRkcmVzcyB0YWJsZQorICoKKyAqIElucHV0IDoJcG9pbnRlciB0byBldGhlcm5ldCBpbnRlcmZhY2UgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKiBPdXRwdXQgOglOL0EKKyAqLworc3RhdGljIHZvaWQgbXY2NDN4eF9ldGhfdXBkYXRlX21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBwb3J0X251bSA9IG1wLT5wb3J0X251bTsKKworCWV0aF9wb3J0X2luaXRfbWFjX3RhYmxlcyhwb3J0X251bSk7CisJbWVtY3B5KG1wLT5wb3J0X21hY19hZGRyLCBkZXYtPmRldl9hZGRyLCA2KTsKKwlldGhfcG9ydF91Y19hZGRyX3NldChwb3J0X251bSwgbXAtPnBvcnRfbWFjX2FkZHIpOworfQorCisvKgorICogbXY2NDN4eF9ldGhfc2V0X3J4X21vZGUKKyAqCisgKiBDaGFuZ2UgZnJvbSBwcm9taXNjdW9zIHRvIHJlZ3VsYXIgcnggbW9kZQorICoKKyAqIElucHV0IDoJcG9pbnRlciB0byBldGhlcm5ldCBpbnRlcmZhY2UgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKiBPdXRwdXQgOglOL0EKKyAqLworc3RhdGljIHZvaWQgbXY2NDN4eF9ldGhfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIGNvbmZpZ19yZWc7CisKKwljb25maWdfcmVnID0gZXRoZXJuZXRfZ2V0X2NvbmZpZ19yZWcobXAtPnBvcnRfbnVtKTsKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQljb25maWdfcmVnIHw9ICh1MzIpIE1WNjQzWFhfRVRIX1VOSUNBU1RfUFJPTUlTQ1VPVVNfTU9ERTsKKwllbHNlCisJCWNvbmZpZ19yZWcgJj0gfih1MzIpIE1WNjQzWFhfRVRIX1VOSUNBU1RfUFJPTUlTQ1VPVVNfTU9ERTsKKwlldGhlcm5ldF9zZXRfY29uZmlnX3JlZyhtcC0+cG9ydF9udW0sIGNvbmZpZ19yZWcpOworfQorCisvKgorICogbXY2NDN4eF9ldGhfc2V0X21hY19hZGRyZXNzCisgKgorICogQ2hhbmdlIHRoZSBpbnRlcmZhY2UncyBtYWMgYWRkcmVzcy4KKyAqIE5vIHNwZWNpYWwgaGFyZHdhcmUgdGhpbmcgc2hvdWxkIGJlIGRvbmUgYmVjYXVzZSBpbnRlcmZhY2UgaXMgYWx3YXlzCisgKiBwdXQgaW4gcHJvbWlzY3VvdXMgbW9kZS4KKyAqCisgKiBJbnB1dCA6CXBvaW50ZXIgdG8gZXRoZXJuZXQgaW50ZXJmYWNlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZSBhbmQKKyAqCQlhIHBvaW50ZXIgdG8gdGhlIGRlc2lnbmF0ZWQgZW50cnkgdG8gYmUgYWRkZWQgdG8gdGhlIGNhY2hlLgorICogT3V0cHV0IDoJemVybyB1cG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHVwb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IG12NjQzeHhfZXRoX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJLyogKzIgaXMgZm9yIHRoZSBvZmZzZXQgb2YgdGhlIEhXIGFkZHIgdHlwZSAqLworCQlkZXYtPmRldl9hZGRyW2ldID0gKCh1bnNpZ25lZCBjaGFyICopYWRkcilbaSArIDJdOworCW12NjQzeHhfZXRoX3VwZGF0ZV9tYWNfYWRkcmVzcyhkZXYpOworCXJldHVybiAwOworfQorCisvKgorICogbXY2NDN4eF9ldGhfdHhfdGltZW91dAorICoKKyAqIENhbGxlZCB1cG9uIGEgdGltZW91dCBvbiB0cmFuc21pdHRpbmcgYSBwYWNrZXQKKyAqCisgKiBJbnB1dCA6CXBvaW50ZXIgdG8gZXRoZXJuZXQgaW50ZXJmYWNlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZS4KKyAqIE91dHB1dCA6CU4vQQorICovCitzdGF0aWMgdm9pZCBtdjY0M3h4X2V0aF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRYIHRpbWVvdXQgICIsIGRldi0+bmFtZSk7CisKKwkvKiBEbyB0aGUgcmVzZXQgb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dCAqLworCXNjaGVkdWxlX3dvcmsoJm1wLT50eF90aW1lb3V0X3Rhc2spOworfQorCisvKgorICogbXY2NDN4eF9ldGhfdHhfdGltZW91dF90YXNrCisgKgorICogQWN0dWFsIHJvdXRpbmUgdG8gcmVzZXQgdGhlIGFkYXB0ZXIgd2hlbiBhIHRpbWVvdXQgb24gVHggaGFzIG9jY3VycmVkCisgKi8KK3N0YXRpYyB2b2lkIG12NjQzeHhfZXRoX3R4X3RpbWVvdXRfdGFzayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlldGhfcG9ydF9yZXNldChtcC0+cG9ydF9udW0pOworCWV0aF9wb3J0X3N0YXJ0KG1wKTsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7Cit9CisKKy8qCisgKiBtdjY0M3h4X2V0aF9mcmVlX3R4X3F1ZXVlCisgKgorICogSW5wdXQgOglkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIHJlcXVpcmVkIGludGVyZmFjZQorICoKKyAqIE91dHB1dCA6CTAgaWYgd2FzIGFibGUgdG8gcmVsZWFzZSBza2IgLCBub256ZXJvIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IG12NjQzeHhfZXRoX2ZyZWVfdHhfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJdW5zaWduZWQgaW50IGV0aF9pbnRfY2F1c2VfZXh0KQoreworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmbXAtPnN0YXRzOworCXN0cnVjdCBwa3RfaW5mbyBwa3RfaW5mbzsKKwlpbnQgcmVsZWFzZWQgPSAxOworCisJaWYgKCEoZXRoX2ludF9jYXVzZV9leHQgJiAoQklUMCB8IEJJVDgpKSkKKwkJcmV0dXJuIHJlbGVhc2VkOworCisJc3Bpbl9sb2NrKCZtcC0+bG9jayk7CisKKwkvKiBDaGVjayBvbmx5IHF1ZXVlIDAgKi8KKwl3aGlsZSAoZXRoX3R4X3JldHVybl9kZXNjKG1wLCAmcGt0X2luZm8pID09IEVUSF9PSykgeworCQlpZiAocGt0X2luZm8uY21kX3N0cyAmIEJJVDApIHsKKwkJCXByaW50aygiJXM6IEVycm9yIGluIFRYXG4iLCBkZXYtPm5hbWUpOworCQkJc3RhdHMtPnR4X2Vycm9ycysrOworCQl9CisKKwkJLyoKKwkJICogSWYgcmV0dXJuX2luZm8gaXMgZGlmZmVyZW50IHRoYW4gMCwgcmVsZWFzZSB0aGUgc2tiLgorCQkgKiBUaGUgY2FzZSB3aGVyZSByZXR1cm5faW5mbyBpcyBub3QgMCBpcyBvbmx5IGluIGNhc2UKKwkJICogd2hlbiB0cmFuc21pdHRlZCBhIHNjYXR0ZXIvZ2F0aGVyIHBhY2tldCwgd2hlcmUgb25seQorCQkgKiBsYXN0IHNrYiByZWxlYXNlcyB0aGUgd2hvbGUgY2hhaW4uCisJCSAqLworCQlpZiAocGt0X2luZm8ucmV0dXJuX2luZm8pIHsKKwkJCWlmIChza2Jfc2hpbmZvKHBrdF9pbmZvLnJldHVybl9pbmZvKS0+bnJfZnJhZ3MpCisJCQkJZG1hX3VubWFwX3BhZ2UoTlVMTCwgcGt0X2luZm8uYnVmX3B0ciwKKwkJCQkJCXBrdF9pbmZvLmJ5dGVfY250LAorCQkJCQkJRE1BX1RPX0RFVklDRSk7CisJCQllbHNlCisJCQkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCBwa3RfaW5mby5idWZfcHRyLAorCQkJCQkJcGt0X2luZm8uYnl0ZV9jbnQsCisJCQkJCQlETUFfVE9fREVWSUNFKTsKKworCQkJZGV2X2tmcmVlX3NrYl9pcnEocGt0X2luZm8ucmV0dXJuX2luZm8pOworCQkJcmVsZWFzZWQgPSAwOworCisJCQkvKgorCQkJICogRGVjcmVtZW50IHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgc2ticyBjb3VudGVyIG9uCisJCQkgKiB0aGUgVFggcXVldWUuCisJCQkgKi8KKwkJCWlmIChtcC0+dHhfcmluZ19za2JzID09IDApCisJCQkJcGFuaWMoIkVSUk9SIC0gVFggb3V0c3RhbmRpbmcgU0tCcyIKKwkJCQkJCSIgY291bnRlciBpcyBjb3JydXB0ZWQiKTsKKwkJCW1wLT50eF9yaW5nX3NrYnMtLTsKKwkJfSBlbHNlCisJCQlkbWFfdW5tYXBfcGFnZShOVUxMLCBwa3RfaW5mby5idWZfcHRyLAorCQkJCQlwa3RfaW5mby5ieXRlX2NudCwgRE1BX1RPX0RFVklDRSk7CisJfQorCisJc3Bpbl91bmxvY2soJm1wLT5sb2NrKTsKKworCXJldHVybiByZWxlYXNlZDsKK30KKworLyoKKyAqIG12NjQzeHhfZXRoX3JlY2VpdmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvcndhcmQgcGFja2V0cyB0aGF0IGFyZSByZWNlaXZlZCBmcm9tIHRoZSBwb3J0J3MKKyAqIHF1ZXVlcyB0b3dhcmQga2VybmVsIGNvcmUgb3IgRmFzdFJvdXRlIHRoZW0gdG8gYW5vdGhlciBpbnRlcmZhY2UuCisgKgorICogSW5wdXQgOglkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIHJlcXVpcmVkIGludGVyZmFjZQorICoJCW1heCAtIG1heGltdW0gbnVtYmVyIHRvIHJlY2VpdmUgKDAgbWVhbnMgdW5saW10ZWQpCisgKgorICogT3V0cHV0IDoJbnVtYmVyIG9mIHNlcnZlZCBwYWNrZXRzCisgKi8KKyNpZmRlZiBNVjY0M1hYX05BUEkKK3N0YXRpYyBpbnQgbXY2NDN4eF9ldGhfcmVjZWl2ZV9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVkZ2V0KQorI2Vsc2UKK3N0YXRpYyBpbnQgbXY2NDN4eF9ldGhfcmVjZWl2ZV9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorI2VuZGlmCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZtcC0+c3RhdHM7CisJdW5zaWduZWQgaW50IHJlY2VpdmVkX3BhY2tldHMgPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHBrdF9pbmZvIHBrdF9pbmZvOworCisjaWZkZWYgTVY2NDNYWF9OQVBJCisJd2hpbGUgKGV0aF9wb3J0X3JlY2VpdmUobXAsICZwa3RfaW5mbykgPT0gRVRIX09LICYmIGJ1ZGdldCA+IDApIHsKKyNlbHNlCisJd2hpbGUgKGV0aF9wb3J0X3JlY2VpdmUobXAsICZwa3RfaW5mbykgPT0gRVRIX09LKSB7CisjZW5kaWYKKwkJbXAtPnJ4X3Jpbmdfc2ticy0tOworCQlyZWNlaXZlZF9wYWNrZXRzKys7CisjaWZkZWYgTVY2NDNYWF9OQVBJCisJCWJ1ZGdldC0tOworI2VuZGlmCisJCS8qIFVwZGF0ZSBzdGF0aXN0aWNzLiBOb3RlIGJ5dGUgY291bnQgaW5jbHVkZXMgNCBieXRlIENSQyBjb3VudCAqLworCQlzdGF0cy0+cnhfcGFja2V0cysrOworCQlzdGF0cy0+cnhfYnl0ZXMgKz0gcGt0X2luZm8uYnl0ZV9jbnQ7CisJCXNrYiA9IHBrdF9pbmZvLnJldHVybl9pbmZvOworCQkvKgorCQkgKiBJbiBjYXNlIHJlY2VpdmVkIGEgcGFja2V0IHdpdGhvdXQgZmlyc3QgLyBsYXN0IGJpdHMgb24gT1IKKwkJICogdGhlIGVycm9yIHN1bW1hcnkgYml0IGlzIG9uLCB0aGUgcGFja2V0cyBuZWVkcyB0byBiZSBkcm9wZWVkLgorCQkgKi8KKwkJaWYgKCgocGt0X2luZm8uY21kX3N0cworCQkJCSYgKEVUSF9SWF9GSVJTVF9ERVNDIHwgRVRIX1JYX0xBU1RfREVTQykpICE9CisJCQkJCShFVEhfUlhfRklSU1RfREVTQyB8IEVUSF9SWF9MQVNUX0RFU0MpKQorCQkJCXx8IChwa3RfaW5mby5jbWRfc3RzICYgRVRIX0VSUk9SX1NVTU1BUlkpKSB7CisJCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQkJaWYgKChwa3RfaW5mby5jbWRfc3RzICYgKEVUSF9SWF9GSVJTVF9ERVNDIHwKKwkJCQkJCQlFVEhfUlhfTEFTVF9ERVNDKSkgIT0KKwkJCQkoRVRIX1JYX0ZJUlNUX0RFU0MgfCBFVEhfUlhfTEFTVF9ERVNDKSkgeworCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkJIiVzOiBSZWNlaXZlZCBwYWNrZXQgc3ByZWFkICIKKwkJCQkJCSJvbiBtdWx0aXBsZSBkZXNjcmlwdG9yc1xuIiwKKwkJCQkJCWRldi0+bmFtZSk7CisJCQl9CisJCQlpZiAocGt0X2luZm8uY21kX3N0cyAmIEVUSF9FUlJPUl9TVU1NQVJZKQorCQkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUaGUgLTQgaXMgZm9yIHRoZSBDUkMgaW4gdGhlIHRyYWlsZXIgb2YgdGhlCisJCQkgKiByZWNlaXZlZCBwYWNrZXQKKwkJCSAqLworCQkJc2tiX3B1dChza2IsIHBrdF9pbmZvLmJ5dGVfY250IC0gNCk7CisJCQlza2ItPmRldiA9IGRldjsKKworCQkJaWYgKHBrdF9pbmZvLmNtZF9zdHMgJiBFVEhfTEFZRVJfNF9DSEVDS1NVTV9PSykgeworCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCQkJc2tiLT5jc3VtID0gaHRvbnMoCisJCQkJCShwa3RfaW5mby5jbWRfc3RzICYgMHgwMDA3ZmZmOCkgPj4gMyk7CisJCQl9CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworI2lmZGVmIE1WNjQzWFhfTkFQSQorCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKyNlbHNlCisJCQluZXRpZl9yeChza2IpOworI2VuZGlmCisJCX0KKwl9CisKKwlyZXR1cm4gcmVjZWl2ZWRfcGFja2V0czsKK30KKworLyoKKyAqIG12NjQzeHhfZXRoX2ludF9oYW5kbGVyCisgKgorICogTWFpbiBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIGdpZ2JpdCBldGhlcm5ldCBwb3J0cworICoKKyAqIElucHV0IDoJaXJxCS0gaXJxIG51bWJlciAobm90IHVzZWQpCisgKgkJZGV2X2lkCS0gYSBwb2ludGVyIHRvIHRoZSByZXF1aXJlZCBpbnRlcmZhY2UncyBkYXRhIHN0cnVjdHVyZQorICoJCXJlZ3MJLSBub3QgdXNlZAorICogT3V0cHV0IDoJTi9BCisgKi8KKworc3RhdGljIGlycXJldHVybl90IG12NjQzeHhfZXRoX2ludF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgZXRoX2ludF9jYXVzZSwgZXRoX2ludF9jYXVzZV9leHQgPSAwOworCXVuc2lnbmVkIGludCBwb3J0X251bSA9IG1wLT5wb3J0X251bTsKKworCS8qIFJlYWQgaW50ZXJydXB0IGNhdXNlIHJlZ2lzdGVycyAqLworCWV0aF9pbnRfY2F1c2UgPSBtdl9yZWFkKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9DQVVTRV9SRUcocG9ydF9udW0pKSAmCisJCQkJCQlJTlRfQ0FVU0VfVU5NQVNLX0FMTDsKKworCWlmIChldGhfaW50X2NhdXNlICYgQklUMSkKKwkJZXRoX2ludF9jYXVzZV9leHQgPSBtdl9yZWFkKAorCQkJTVY2NDNYWF9FVEhfSU5URVJSVVBUX0NBVVNFX0VYVEVORF9SRUcocG9ydF9udW0pKSAmCisJCQkJCQlJTlRfQ0FVU0VfVU5NQVNLX0FMTF9FWFQ7CisKKyNpZmRlZiBNVjY0M1hYX05BUEkKKwlpZiAoIShldGhfaW50X2NhdXNlICYgMHgwMDA3ZmZmZCkpIHsKKwkJLyogRG9udCBhY2sgdGhlIFJ4IGludGVycnVwdCAqLworI2VuZGlmCisJCS8qCisJCSAqIENsZWFyIHNwZWNpZmljIGV0aGVybmV0IHBvcnQgaW50cmVycnVwdCByZWdpc3RlcnMgYnkKKwkJICogYWNrbm93bGVkaW5nIHJlbGV2YW50IGJpdHMuCisJCSAqLworCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfQ0FVU0VfUkVHKHBvcnRfbnVtKSwKKwkJCQkJCQl+ZXRoX2ludF9jYXVzZSk7CisJCWlmIChldGhfaW50X2NhdXNlX2V4dCAhPSAweDApCisJCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfQ0FVU0VfRVhURU5EX1JFRworCQkJCQkocG9ydF9udW0pLCB+ZXRoX2ludF9jYXVzZV9leHQpOworCisJCS8qIFVEUCBjaGFuZ2UgOiBXZSBtYXkgbmVlZCB0aGlzICovCisJCWlmICgoZXRoX2ludF9jYXVzZV9leHQgJiAweDAwMDBmZmZmKSAmJgorCQkgICAgKG12NjQzeHhfZXRoX2ZyZWVfdHhfcXVldWUoZGV2LCBldGhfaW50X2NhdXNlX2V4dCkgPT0gMCkgJiYKKwkJICAgIChtcC0+dHhfcmluZ19zaXplID4gbXAtPnR4X3Jpbmdfc2ticyArIE1BWF9ERVNDU19QRVJfU0tCKSkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyNpZmRlZiBNVjY0M1hYX05BUEkKKwl9IGVsc2UgeworCQlpZiAobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChkZXYpKSB7CisJCQkvKiBNYXNrIGFsbCB0aGUgaW50ZXJydXB0cyAqLworCQkJbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX01BU0tfUkVHKHBvcnRfbnVtKSwgMCk7CisJCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfRVhURU5EX01BU0tfUkVHCisJCQkJCQkJCShwb3J0X251bSksIDApOworCQkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOworCQl9CisjZWxzZQorCQlpZiAoZXRoX2ludF9jYXVzZSAmIChCSVQyIHwgQklUMTEpKQorCQkJbXY2NDN4eF9ldGhfcmVjZWl2ZV9xdWV1ZShkZXYsIDApOworCisJCS8qCisJCSAqIEFmdGVyIGZvcndhcmRlZCByZWNlaXZlZCBwYWNrZXRzIHRvIHVwcGVyIGxheWVyLCBhZGQgYSB0YXNrCisJCSAqIGluIGFuIGludGVycnVwdHMgZW5hYmxlZCBjb250ZXh0IHRoYXQgcmVmaWxscyB0aGUgUlggcmluZworCQkgKiB3aXRoIHNrYidzLgorCQkgKi8KKyNpZmRlZiBNVjY0M1hYX1JYX1FVRVVFX0ZJTExfT05fVEFTSworCQkvKiBVbm1hc2sgYWxsIGludGVycnVwdHMgb24gZXRoZXJuZXQgcG9ydCAqLworCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcocG9ydF9udW0pLAorCQkJCQkJCUlOVF9DQVVTRV9NQVNLX0FMTCk7CisJCXF1ZXVlX3Rhc2soJm1wLT5yeF90YXNrLCAmdHFfaW1tZWRpYXRlKTsKKwkJbWFya19iaChJTU1FRElBVEVfQkgpOworI2Vsc2UKKwkJbXAtPnJ4X3Rhc2suZnVuYyhkZXYpOworI2VuZGlmCisjZW5kaWYKKwl9CisJLyogUEhZIHN0YXR1cyBjaGFuZ2VkICovCisJaWYgKGV0aF9pbnRfY2F1c2VfZXh0ICYgKEJJVDE2IHwgQklUMjApKSB7CisJCWlmIChldGhfcG9ydF9saW5rX2lzX3VwKHBvcnRfbnVtKSkgeworCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJLyogU3RhcnQgVFggcXVldWUgKi8KKwkJCW12X3dyaXRlKE1WNjQzWFhfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHCisJCQkJCQkJCShwb3J0X251bSksIDEpOworCQl9IGVsc2UgeworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJfQorCX0KKworCS8qCisJICogSWYgbm8gcmVhbCBpbnRlcnJ1cHQgb2NjdXJlZCwgZXhpdC4KKwkgKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB1c2luZyBnaWdFIGludGVycnVwdCBjb2FsZXNjaW5nIG1lY2hhbmlzbS4KKwkgKi8KKwlpZiAoKGV0aF9pbnRfY2F1c2UgPT0gMHgwKSAmJiAoZXRoX2ludF9jYXVzZV9leHQgPT0gMHgwKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWZkZWYgTVY2NDNYWF9DT0FMCisKKy8qCisgKiBldGhfcG9ydF9zZXRfcnhfY29hbCAtIFNldHMgY29hbGVzY2luZyBpbnRlcnJ1cHQgbWVjaGFuaXNtIG9uIFJYIHBhdGgKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgcm91dGluZSBzZXRzIHRoZSBSWCBjb2FsZXNjaW5nIGludGVycnVwdCBtZWNoYW5pc20gcGFyYW1ldGVyLgorICoJVGhpcyBwYXJhbWV0ZXIgaXMgYSB0aW1lb3V0IGNvdW50ZXIsIHRoYXQgY291bnRzIGluIDY0IHRfY2xrCisgKgljaHVua3MgOyB0aGF0IHdoZW4gdGltZW91dCBldmVudCBvY2N1cnMgYSBtYXNrYWJsZSBpbnRlcnJ1cHQKKyAqCW9jY3Vycy4KKyAqCVRoZSBwYXJhbWV0ZXIgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgdENsayBvZiB0aGUgTVYtNjQzeHggY2hpcAorICoJLCBhbmQgdGhlIHJlcXVpcmVkIGRlbGF5IG9mIHRoZSBpbnRlcnJ1cHQgaW4gdXNlYy4KKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludCBldGhfcG9ydF9udW0JRXRoZXJuZXQgcG9ydCBudW1iZXIKKyAqCXVuc2lnbmVkIGludCB0X2NsawkJdF9jbGsgb2YgdGhlIE1WLTY0M3h4IGNoaXAgaW4gSFogdW5pdHMKKyAqCXVuc2lnbmVkIGludCBkZWxheQkJRGVsYXkgaW4gdXNlYworICoKKyAqIE9VVFBVVDoKKyAqCUludGVycnVwdCBjb2FsZXNjaW5nIG1lY2hhbmlzbSB2YWx1ZSBpcyBzZXQgaW4gTVYtNjQzeHggY2hpcC4KKyAqCisgKiBSRVRVUk46CisgKglUaGUgaW50ZXJydXB0IGNvYWxlc2NpbmcgdmFsdWUgc2V0IGluIHRoZSBnaWdFIHBvcnQuCisgKgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGV0aF9wb3J0X3NldF9yeF9jb2FsKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0sCisJCQkJCXVuc2lnbmVkIGludCB0X2NsaywgdW5zaWduZWQgaW50IGRlbGF5KQoreworCXVuc2lnbmVkIGludCBjb2FsID0gKCh0X2NsayAvIDEwMDAwMDApICogZGVsYXkpIC8gNjQ7CisKKwkvKiBTZXQgUlggQ29hbGVzY2luZyBtZWNoYW5pc20gKi8KKwltdl93cml0ZShNVjY0M1hYX0VUSF9TRE1BX0NPTkZJR19SRUcoZXRoX3BvcnRfbnVtKSwKKwkJKChjb2FsICYgMHgzZmZmKSA8PCA4KSB8CisJCShtdl9yZWFkKE1WNjQzWFhfRVRIX1NETUFfQ09ORklHX1JFRyhldGhfcG9ydF9udW0pKQorCQkJJiAweGZmYzAwMGZmKSk7CisKKwlyZXR1cm4gY29hbDsKK30KKyNlbmRpZgorCisvKgorICogZXRoX3BvcnRfc2V0X3R4X2NvYWwgLSBTZXRzIGNvYWxlc2NpbmcgaW50ZXJydXB0IG1lY2hhbmlzbSBvbiBUWCBwYXRoCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIHJvdXRpbmUgc2V0cyB0aGUgVFggY29hbGVzY2luZyBpbnRlcnJ1cHQgbWVjaGFuaXNtIHBhcmFtZXRlci4KKyAqCVRoaXMgcGFyYW1ldGVyIGlzIGEgdGltZW91dCBjb3VudGVyLCB0aGF0IGNvdW50cyBpbiA2NCB0X2NsaworICoJY2h1bmtzIDsgdGhhdCB3aGVuIHRpbWVvdXQgZXZlbnQgb2NjdXJzIGEgbWFza2FibGUgaW50ZXJydXB0CisgKglvY2N1cnMuCisgKglUaGUgcGFyYW1ldGVyIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIHRfY0xLIGZyZXF1ZW5jeSBvZiB0aGUKKyAqCU1WLTY0M3h4IGNoaXAgYW5kIHRoZSByZXF1aXJlZCBkZWxheSBpbiB0aGUgaW50ZXJydXB0IGluIHVTZWMKKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludCBldGhfcG9ydF9udW0JRXRoZXJuZXQgcG9ydCBudW1iZXIKKyAqCXVuc2lnbmVkIGludCB0X2NsawkJdF9jbGsgb2YgdGhlIE1WLTY0M3h4IGNoaXAgaW4gSFogdW5pdHMKKyAqCXVuc2lnbmVkIGludCBkZWxheQkJRGVsYXkgaW4gdVNlY29uZHMKKyAqCisgKiBPVVRQVVQ6CisgKglJbnRlcnJ1cHQgY29hbGVzY2luZyBtZWNoYW5pc20gdmFsdWUgaXMgc2V0IGluIE1WLTY0M3h4IGNoaXAuCisgKgorICogUkVUVVJOOgorICoJVGhlIGludGVycnVwdCBjb2FsZXNjaW5nIHZhbHVlIHNldCBpbiB0aGUgZ2lnRSBwb3J0LgorICoKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBldGhfcG9ydF9zZXRfdHhfY29hbCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtLAorCQkJCQl1bnNpZ25lZCBpbnQgdF9jbGssIHVuc2lnbmVkIGludCBkZWxheSkKK3sKKwl1bnNpZ25lZCBpbnQgY29hbDsKKwljb2FsID0gKCh0X2NsayAvIDEwMDAwMDApICogZGVsYXkpIC8gNjQ7CisJLyogU2V0IFRYIENvYWxlc2NpbmcgbWVjaGFuaXNtICovCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfVFhfRklGT19VUkdFTlRfVEhSRVNIT0xEX1JFRyhldGhfcG9ydF9udW0pLAorCQkJCQkJCQljb2FsIDw8IDQpOworCXJldHVybiBjb2FsOworfQorCisvKgorICogbXY2NDN4eF9ldGhfb3BlbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gb3Blbm5pbmcgdGhlIG5ldHdvcmsgZGV2aWNlLiBUaGUgZnVuY3Rpb24KKyAqIHNob3VsZCBpbml0aWFsaXplIGFsbCB0aGUgaGFyZHdhcmUsIGluaXRpYWxpemUgY3ljbGljIFJ4L1R4CisgKiBkZXNjcmlwdG9ycyBjaGFpbiBhbmQgYnVmZmVycyBhbmQgYWxsb2NhdGUgYW4gSVJRIHRvIHRoZSBuZXR3b3JrCisgKiBkZXZpY2UuCisgKgorICogSW5wdXQgOglhIHBvaW50ZXIgdG8gdGhlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIE91dHB1dCA6CXplcm8gb2Ygc3VjY2VzcyAsIG5vbnplcm8gaWYgZmFpbHMuCisgKi8KKworc3RhdGljIGludCBtdjY0M3h4X2V0aF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBwb3J0X251bSA9IG1wLT5wb3J0X251bTsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrX2lycSgmbXAtPmxvY2spOworCisJZXJyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIG12NjQzeHhfZXRoX2ludF9oYW5kbGVyLAorCQkJU0FfSU5URVJSVVBUIHwgU0FfU0FNUExFX1JBTkRPTSwgZGV2LT5uYW1lLCBkZXYpOworCisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIkNhbiBub3QgYXNzaWduIElSUSBudW1iZXIgdG8gTVY2NDNYWF9ldGglZFxuIiwKKwkJCQkJCQkJcG9ydF9udW0pOworCQllcnIgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobXY2NDN4eF9ldGhfcmVhbF9vcGVuKGRldikpIHsKKwkJcHJpbnRrKCIlczogRXJyb3Igb3BlbmluZyBpbnRlcmZhY2VcbiIsIGRldi0+bmFtZSk7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJm1wLT5sb2NrKTsKKworCXJldHVybiAwOworCitvdXRfZnJlZToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycSgmbXAtPmxvY2spOworCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGV0aGVyX2luaXRfcnhfZGVzY19yaW5nIC0gQ3VydmUgYSBSeCBjaGFpbiBkZXNjIGxpc3QgYW5kIGJ1ZmZlciBpbiBtZW1vcnkuCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIGEgUnggY2hhaW5lZCBsaXN0IG9mIGRlc2NyaXB0b3JzIGFuZCBwYWNrZXQKKyAqCWJ1ZmZlcnMgaW4gYSBmb3JtIG9mIGEgcmluZy4gVGhlIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgcG9ydAorICoJaW5pdGlhbGl6YXRpb24gcm91dGluZSBhbmQgYmVmb3JlIHBvcnQgc3RhcnQgcm91dGluZS4KKyAqCVRoZSBFdGhlcm5ldCBTRE1BIGVuZ2luZSB1c2VzIENQVSBidXMgYWRkcmVzc2VzIHRvIGFjY2VzcyB0aGUgdmFyaW91cworICoJZGV2aWNlcyBpbiB0aGUgc3lzdGVtIChpLmUuIERSQU0pLiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGV0aGVybmV0CisgKglzdHJ1Y3QgJ3ZpcnR1YWwgdG8gcGh5c2ljYWwnIHJvdXRpbmUgKHNldCBieSB0aGUgdXNlcikgdG8gc2V0IHRoZSByaW5nCisgKgl3aXRoIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAqCisgKiBJTlBVVDoKKyAqCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wCUV0aGVybmV0IFBvcnQgQ29udHJvbCBzcnR1Y3QuCisgKgorICogT1VUUFVUOgorICoJVGhlIHJvdXRpbmUgdXBkYXRlcyB0aGUgRXRoZXJuZXQgcG9ydCBjb250cm9sIHN0cnVjdCB3aXRoIGluZm9ybWF0aW9uCisgKglyZWdhcmRpbmcgdGhlIFJ4IGRlc2NyaXB0b3JzIGFuZCBidWZmZXJzLgorICoKKyAqIFJFVFVSTjoKKyAqCU5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGV0aGVyX2luaXRfcnhfZGVzY19yaW5nKHN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wKQoreworCXZvbGF0aWxlIHN0cnVjdCBldGhfcnhfZGVzYyAqcF9yeF9kZXNjOworCWludCByeF9kZXNjX251bSA9IG1wLT5yeF9yaW5nX3NpemU7CisJaW50IGk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBuZXh0X2Rlc2NfcHRyIGxpbmtzIGluIHRoZSBSeCBkZXNjcmlwdG9ycyByaW5nICovCisJcF9yeF9kZXNjID0gKHN0cnVjdCBldGhfcnhfZGVzYyAqKW1wLT5wX3J4X2Rlc2NfYXJlYTsKKwlmb3IgKGkgPSAwOyBpIDwgcnhfZGVzY19udW07IGkrKykgeworCQlwX3J4X2Rlc2NbaV0ubmV4dF9kZXNjX3B0ciA9IG1wLT5yeF9kZXNjX2RtYSArCisJCQkoKGkgKyAxKSAlIHJ4X2Rlc2NfbnVtKSAqIHNpemVvZihzdHJ1Y3QgZXRoX3J4X2Rlc2MpOworCX0KKworCS8qIFNhdmUgUnggZGVzYyBwb2ludGVyIHRvIGRyaXZlciBzdHJ1Y3QuICovCisJbXAtPnJ4X2N1cnJfZGVzY19xID0gMDsKKwltcC0+cnhfdXNlZF9kZXNjX3EgPSAwOworCisJbXAtPnJ4X2Rlc2NfYXJlYV9zaXplID0gcnhfZGVzY19udW0gKiBzaXplb2Yoc3RydWN0IGV0aF9yeF9kZXNjKTsKKworCS8qIEFkZCB0aGUgcXVldWUgdG8gdGhlIGxpc3Qgb2YgUlggcXVldWVzIG9mIHRoaXMgcG9ydCAqLworCW1wLT5wb3J0X3J4X3F1ZXVlX2NvbW1hbmQgfD0gMTsKK30KKworLyoKKyAqIGV0aGVyX2luaXRfdHhfZGVzY19yaW5nIC0gQ3VydmUgYSBUeCBjaGFpbiBkZXNjIGxpc3QgYW5kIGJ1ZmZlciBpbiBtZW1vcnkuCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIGEgVHggY2hhaW5lZCBsaXN0IG9mIGRlc2NyaXB0b3JzIGFuZCBwYWNrZXQKKyAqCWJ1ZmZlcnMgaW4gYSBmb3JtIG9mIGEgcmluZy4gVGhlIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgcG9ydAorICoJaW5pdGlhbGl6YXRpb24gcm91dGluZSBhbmQgYmVmb3JlIHBvcnQgc3RhcnQgcm91dGluZS4KKyAqCVRoZSBFdGhlcm5ldCBTRE1BIGVuZ2luZSB1c2VzIENQVSBidXMgYWRkcmVzc2VzIHRvIGFjY2VzcyB0aGUgdmFyaW91cworICoJZGV2aWNlcyBpbiB0aGUgc3lzdGVtIChpLmUuIERSQU0pLiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGV0aGVybmV0CisgKglzdHJ1Y3QgJ3ZpcnR1YWwgdG8gcGh5c2ljYWwnIHJvdXRpbmUgKHNldCBieSB0aGUgdXNlcikgdG8gc2V0IHRoZSByaW5nCisgKgl3aXRoIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAqCisgKiBJTlBVVDoKKyAqCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wCUV0aGVybmV0IFBvcnQgQ29udHJvbCBzcnR1Y3QuCisgKgorICogT1VUUFVUOgorICoJVGhlIHJvdXRpbmUgdXBkYXRlcyB0aGUgRXRoZXJuZXQgcG9ydCBjb250cm9sIHN0cnVjdCB3aXRoIGluZm9ybWF0aW9uCisgKglyZWdhcmRpbmcgdGhlIFR4IGRlc2NyaXB0b3JzIGFuZCBidWZmZXJzLgorICoKKyAqIFJFVFVSTjoKKyAqCU5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGV0aGVyX2luaXRfdHhfZGVzY19yaW5nKHN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wKQoreworCWludCB0eF9kZXNjX251bSA9IG1wLT50eF9yaW5nX3NpemU7CisJc3RydWN0IGV0aF90eF9kZXNjICpwX3R4X2Rlc2M7CisJaW50IGk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBuZXh0X2Rlc2NfcHRyIGxpbmtzIGluIHRoZSBUeCBkZXNjcmlwdG9ycyByaW5nICovCisJcF90eF9kZXNjID0gKHN0cnVjdCBldGhfdHhfZGVzYyAqKW1wLT5wX3R4X2Rlc2NfYXJlYTsKKwlmb3IgKGkgPSAwOyBpIDwgdHhfZGVzY19udW07IGkrKykgeworCQlwX3R4X2Rlc2NbaV0ubmV4dF9kZXNjX3B0ciA9IG1wLT50eF9kZXNjX2RtYSArCisJCQkoKGkgKyAxKSAlIHR4X2Rlc2NfbnVtKSAqIHNpemVvZihzdHJ1Y3QgZXRoX3R4X2Rlc2MpOworCX0KKworCW1wLT50eF9jdXJyX2Rlc2NfcSA9IDA7CisJbXAtPnR4X3VzZWRfZGVzY19xID0gMDsKKyNpZmRlZiBNVjY0M1hYX0NIRUNLU1VNX09GRkxPQURfVFgKKwltcC0+dHhfZmlyc3RfZGVzY19xID0gMDsKKyNlbmRpZgorCisJbXAtPnR4X2Rlc2NfYXJlYV9zaXplID0gdHhfZGVzY19udW0gKiBzaXplb2Yoc3RydWN0IGV0aF90eF9kZXNjKTsKKworCS8qIEFkZCB0aGUgcXVldWUgdG8gdGhlIGxpc3Qgb2YgVHggcXVldWVzIG9mIHRoaXMgcG9ydCAqLworCW1wLT5wb3J0X3R4X3F1ZXVlX2NvbW1hbmQgfD0gMTsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIGZvciBtdjY0M3h4X2V0aF9vcGVuICovCitzdGF0aWMgaW50IG12NjQzeHhfZXRoX3JlYWxfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW0gPSBtcC0+cG9ydF9udW07CisJdW5zaWduZWQgaW50IHNpemU7CisKKwkvKiBTdG9wIFJYIFF1ZXVlcyAqLworCW12X3dyaXRlKE1WNjQzWFhfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcocG9ydF9udW0pLCAweDAwMDBmZjAwKTsKKworCS8qIENsZWFyIHRoZSBldGhlcm5ldCBwb3J0IGludGVycnVwdHMgKi8KKwltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfQ0FVU0VfUkVHKHBvcnRfbnVtKSwgMCk7CisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX0NBVVNFX0VYVEVORF9SRUcocG9ydF9udW0pLCAwKTsKKworCS8qIFVubWFzayBSWCBidWZmZXIgYW5kIFRYIGVuZCBpbnRlcnJ1cHQgKi8KKwltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcocG9ydF9udW0pLAorCQkJCQkJSU5UX0NBVVNFX1VOTUFTS19BTEwpOworCisJLyogVW5tYXNrIHBoeSBhbmQgbGluayBzdGF0dXMgY2hhbmdlcyBpbnRlcnJ1cHRzICovCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX0VYVEVORF9NQVNLX1JFRyhwb3J0X251bSksCisJCQkJCQlJTlRfQ0FVU0VfVU5NQVNLX0FMTF9FWFQpOworCisJLyogU2V0IHRoZSBNQUMgQWRkcmVzcyAqLworCW1lbWNweShtcC0+cG9ydF9tYWNfYWRkciwgZGV2LT5kZXZfYWRkciwgNik7CisKKwlldGhfcG9ydF9pbml0KG1wKTsKKworCUlOSVRfV09SSygmbXAtPnJ4X3Rhc2ssICh2b2lkICgqKSh2b2lkICopKW12NjQzeHhfZXRoX3J4X3Rhc2ssIGRldik7CisKKwltZW1zZXQoJm1wLT50aW1lb3V0LCAwLCBzaXplb2Yoc3RydWN0IHRpbWVyX2xpc3QpKTsKKwltcC0+dGltZW91dC5mdW5jdGlvbiA9IG12NjQzeHhfZXRoX3J4X3Rhc2tfdGltZXJfd3JhcHBlcjsKKwltcC0+dGltZW91dC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCisJbXAtPnJ4X3Rhc2tfYnVzeSA9IDA7CisJbXAtPnJ4X3RpbWVyX2ZsYWcgPSAwOworCisJLyogQWxsb2NhdGUgUlggYW5kIFRYIHNrYiByaW5ncyAqLworCW1wLT5yeF9za2IgPSBrbWFsbG9jKHNpemVvZigqbXAtPnJ4X3NrYikgKiBtcC0+cnhfcmluZ19zaXplLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW1wLT5yeF9za2IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IGFsbG9jYXRlIFJ4IHNrYiByaW5nXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbXAtPnR4X3NrYiA9IGttYWxsb2Moc2l6ZW9mKCptcC0+dHhfc2tiKSAqIG1wLT50eF9yaW5nX3NpemUsCisJCQkJCQkJCUdGUF9LRVJORUwpOworCWlmICghbXAtPnR4X3NrYikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgYWxsb2NhdGUgVHggc2tiIHJpbmdcbiIsIGRldi0+bmFtZSk7CisJCWtmcmVlKG1wLT5yeF9za2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBUWCByaW5nICovCisJbXAtPnR4X3Jpbmdfc2ticyA9IDA7CisJc2l6ZSA9IG1wLT50eF9yaW5nX3NpemUgKiBzaXplb2Yoc3RydWN0IGV0aF90eF9kZXNjKTsKKwltcC0+dHhfZGVzY19hcmVhX3NpemUgPSBzaXplOworCisJaWYgKG1wLT50eF9zcmFtX3NpemUpIHsKKwkJbXAtPnBfdHhfZGVzY19hcmVhID0gaW9yZW1hcChtcC0+dHhfc3JhbV9hZGRyLAorCQkJCQkJCW1wLT50eF9zcmFtX3NpemUpOworCQltcC0+dHhfZGVzY19kbWEgPSBtcC0+dHhfc3JhbV9hZGRyOworCX0gZWxzZQorCQltcC0+cF90eF9kZXNjX2FyZWEgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2l6ZSwKKwkJCQkJCQkmbXAtPnR4X2Rlc2NfZG1hLAorCQkJCQkJCUdGUF9LRVJORUwpOworCisJaWYgKCFtcC0+cF90eF9kZXNjX2FyZWEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IGFsbG9jYXRlIFR4IFJpbmcgKHNpemUgJWQgYnl0ZXMpXG4iLAorCQkJCQkJCWRldi0+bmFtZSwgc2l6ZSk7CisJCWtmcmVlKG1wLT5yeF9za2IpOworCQlrZnJlZShtcC0+dHhfc2tiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCUJVR19PTigodTMyKSBtcC0+cF90eF9kZXNjX2FyZWEgJiAweGYpOwkvKiBjaGVjayAxNi1ieXRlIGFsaWdubWVudCAqLworCW1lbXNldCgodm9pZCAqKW1wLT5wX3R4X2Rlc2NfYXJlYSwgMCwgbXAtPnR4X2Rlc2NfYXJlYV9zaXplKTsKKworCWV0aGVyX2luaXRfdHhfZGVzY19yaW5nKG1wKTsKKworCS8qIEFsbG9jYXRlIFJYIHJpbmcgKi8KKwltcC0+cnhfcmluZ19za2JzID0gMDsKKwlzaXplID0gbXAtPnJ4X3Jpbmdfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgZXRoX3J4X2Rlc2MpOworCW1wLT5yeF9kZXNjX2FyZWFfc2l6ZSA9IHNpemU7CisKKwlpZiAobXAtPnJ4X3NyYW1fc2l6ZSkgeworCQltcC0+cF9yeF9kZXNjX2FyZWEgPSBpb3JlbWFwKG1wLT5yeF9zcmFtX2FkZHIsCisJCQkJCQkJbXAtPnJ4X3NyYW1fc2l6ZSk7CisJCW1wLT5yeF9kZXNjX2RtYSA9IG1wLT5yeF9zcmFtX2FkZHI7CisJfSBlbHNlCisJCW1wLT5wX3J4X2Rlc2NfYXJlYSA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBzaXplLAorCQkJCQkJCSZtcC0+cnhfZGVzY19kbWEsCisJCQkJCQkJR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1wLT5wX3J4X2Rlc2NfYXJlYSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgYWxsb2NhdGUgUnggcmluZyAoc2l6ZSAlZCBieXRlcylcbiIsCisJCQkJCQkJZGV2LT5uYW1lLCBzaXplKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRnJlZWluZyBwcmV2aW91c2x5IGFsbG9jYXRlZCBUWCBxdWV1ZXMuLi4iLAorCQkJCQkJCWRldi0+bmFtZSk7CisJCWlmIChtcC0+cnhfc3JhbV9zaXplKQorCQkJaW91bm1hcChtcC0+cF9yeF9kZXNjX2FyZWEpOworCQllbHNlCisJCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBtcC0+dHhfZGVzY19hcmVhX3NpemUsCisJCQkJCW1wLT5wX3R4X2Rlc2NfYXJlYSwgbXAtPnR4X2Rlc2NfZG1hKTsKKwkJa2ZyZWUobXAtPnJ4X3NrYik7CisJCWtmcmVlKG1wLT50eF9za2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCh2b2lkICopbXAtPnBfcnhfZGVzY19hcmVhLCAwLCBzaXplKTsKKworCWV0aGVyX2luaXRfcnhfZGVzY19yaW5nKG1wKTsKKworCW12NjQzeHhfZXRoX3J4X3Rhc2soZGV2KTsJLyogRmlsbCBSWCByaW5nIHdpdGggc2tiJ3MgKi8KKworCWV0aF9wb3J0X3N0YXJ0KG1wKTsKKworCS8qIEludGVycnVwdCBDb2FsZXNjaW5nICovCisKKyNpZmRlZiBNVjY0M1hYX0NPQUwKKwltcC0+cnhfaW50X2NvYWwgPQorCQlldGhfcG9ydF9zZXRfcnhfY29hbChwb3J0X251bSwgMTMzMDAwMDAwLCBNVjY0M1hYX1JYX0NPQUwpOworI2VuZGlmCisKKwltcC0+dHhfaW50X2NvYWwgPQorCQlldGhfcG9ydF9zZXRfdHhfY29hbChwb3J0X251bSwgMTMzMDAwMDAwLCBNVjY0M1hYX1RYX0NPQUwpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtdjY0M3h4X2V0aF9mcmVlX3R4X3JpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBwb3J0X251bSA9IG1wLT5wb3J0X251bTsKKwl1bnNpZ25lZCBpbnQgY3VycjsKKworCS8qIFN0b3AgVHggUXVldWVzICovCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfVFJBTlNNSVRfUVVFVUVfQ09NTUFORF9SRUcocG9ydF9udW0pLCAweDAwMDBmZjAwKTsKKworCS8qIEZyZWUgb3V0c3RhbmRpbmcgc2tiJ3Mgb24gVFggcmluZ3MgKi8KKwlmb3IgKGN1cnIgPSAwOyBtcC0+dHhfcmluZ19za2JzICYmIGN1cnIgPCBtcC0+dHhfcmluZ19zaXplOyBjdXJyKyspIHsKKwkJaWYgKG1wLT50eF9za2JbY3Vycl0pIHsKKwkJCWRldl9rZnJlZV9za2IobXAtPnR4X3NrYltjdXJyXSk7CisJCQltcC0+dHhfcmluZ19za2JzLS07CisJCX0KKwl9CisJaWYgKG1wLT50eF9yaW5nX3NrYnMpCisJCXByaW50aygiJXM6IEVycm9yIG9uIFR4IGRlc2NyaXB0b3IgZnJlZSAtIGNvdWxkIG5vdCBmcmVlICVkIgorCQkJCSIgZGVzY3JpcHRvcnNcbiIsIGRldi0+bmFtZSwgbXAtPnR4X3Jpbmdfc2ticyk7CisKKwkvKiBGcmVlIFRYIHJpbmcgKi8KKwlpZiAobXAtPnR4X3NyYW1fc2l6ZSkKKwkJaW91bm1hcChtcC0+cF90eF9kZXNjX2FyZWEpOworCWVsc2UKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgbXAtPnR4X2Rlc2NfYXJlYV9zaXplLAorCQkJCW1wLT5wX3R4X2Rlc2NfYXJlYSwgbXAtPnR4X2Rlc2NfZG1hKTsKK30KKworc3RhdGljIHZvaWQgbXY2NDN4eF9ldGhfZnJlZV9yeF9yaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW0gPSBtcC0+cG9ydF9udW07CisJaW50IGN1cnI7CisKKwkvKiBTdG9wIFJYIFF1ZXVlcyAqLworCW12X3dyaXRlKE1WNjQzWFhfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcocG9ydF9udW0pLCAweDAwMDBmZjAwKTsKKworCS8qIEZyZWUgcHJlYWxsb2NhdGVkIHNrYidzIG9uIFJYIHJpbmdzICovCisJZm9yIChjdXJyID0gMDsgbXAtPnJ4X3Jpbmdfc2ticyAmJiBjdXJyIDwgbXAtPnJ4X3Jpbmdfc2l6ZTsgY3VycisrKSB7CisJCWlmIChtcC0+cnhfc2tiW2N1cnJdKSB7CisJCQlkZXZfa2ZyZWVfc2tiKG1wLT5yeF9za2JbY3Vycl0pOworCQkJbXAtPnJ4X3Jpbmdfc2ticy0tOworCQl9CisJfQorCisJaWYgKG1wLT5yeF9yaW5nX3NrYnMpCisJCXByaW50ayhLRVJOX0VSUgorCQkJIiVzOiBFcnJvciBpbiBmcmVlaW5nIFJ4IFJpbmcuICVkIHNrYidzIHN0aWxsIgorCQkJIiBzdHVjayBpbiBSWCBSaW5nIC0gaWdub3JpbmcgdGhlbVxuIiwgZGV2LT5uYW1lLAorCQkJbXAtPnJ4X3Jpbmdfc2ticyk7CisJLyogRnJlZSBSWCByaW5nICovCisJaWYgKG1wLT5yeF9zcmFtX3NpemUpCisJCWlvdW5tYXAobXAtPnBfcnhfZGVzY19hcmVhKTsKKwllbHNlCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIG1wLT5yeF9kZXNjX2FyZWFfc2l6ZSwKKwkJCQltcC0+cF9yeF9kZXNjX2FyZWEsIG1wLT5yeF9kZXNjX2RtYSk7Cit9CisKKy8qCisgKiBtdjY0M3h4X2V0aF9zdG9wCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gY2xvc2luZyB0aGUgbmV0d29yayBkZXZpY2UuCisgKiBJdCB1cGRhdGVzIHRoZSBoYXJkd2FyZSwKKyAqIHJlbGVhc2UgYWxsIG1lbW9yeSB0aGF0IGhvbGRzIGJ1ZmZlcnMgYW5kIGRlc2NyaXB0b3JzIGFuZCByZWxlYXNlIHRoZSBJUlEuCisgKiBJbnB1dCA6CWEgcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogT3V0cHV0IDoJemVybyBpZiBzdWNjZXNzICwgbm9uemVybyBpZiBmYWlscworICovCisKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3IgbXY2NDN4eF9ldGhfc3RvcCAqLworCitzdGF0aWMgaW50IG12NjQzeHhfZXRoX3JlYWxfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW0gPSBtcC0+cG9ydF9udW07CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCW12NjQzeHhfZXRoX2ZyZWVfdHhfcmluZ3MoZGV2KTsKKwltdjY0M3h4X2V0aF9mcmVlX3J4X3JpbmdzKGRldik7CisKKwlldGhfcG9ydF9yZXNldChtcC0+cG9ydF9udW0pOworCisJLyogRGlzYWJsZSBldGhlcm5ldCBwb3J0IGludGVycnVwdHMgKi8KKwltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfQ0FVU0VfUkVHKHBvcnRfbnVtKSwgMCk7CisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX0NBVVNFX0VYVEVORF9SRUcocG9ydF9udW0pLCAwKTsKKworCS8qIE1hc2sgUlggYnVmZmVyIGFuZCBUWCBlbmQgaW50ZXJydXB0ICovCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX01BU0tfUkVHKHBvcnRfbnVtKSwgMCk7CisKKwkvKiBNYXNrIHBoeSBhbmQgbGluayBzdGF0dXMgY2hhbmdlcyBpbnRlcnJ1cHRzICovCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX0VYVEVORF9NQVNLX1JFRyhwb3J0X251bSksIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY2NDN4eF9ldGhfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJm1wLT5sb2NrKTsKKworCW12NjQzeHhfZXRoX3JlYWxfc3RvcChkZXYpOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZtcC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE1WNjQzWFhfTkFQSQorc3RhdGljIHZvaWQgbXY2NDN4eF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGt0X2luZm8gcGt0X2luZm87CisKKwl3aGlsZSAoZXRoX3R4X3JldHVybl9kZXNjKG1wLCAmcGt0X2luZm8pID09IEVUSF9PSykgeworCQlpZiAocGt0X2luZm8ucmV0dXJuX2luZm8pIHsKKwkJCWlmIChza2Jfc2hpbmZvKHBrdF9pbmZvLnJldHVybl9pbmZvKS0+bnJfZnJhZ3MpCisJCQkJZG1hX3VubWFwX3BhZ2UoTlVMTCwgcGt0X2luZm8uYnVmX3B0ciwKKwkJCQkJCXBrdF9pbmZvLmJ5dGVfY250LAorCQkJCQkJRE1BX1RPX0RFVklDRSk7CisJCQllbHNlCisJCQkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCBwa3RfaW5mby5idWZfcHRyLAorCQkJCQkJcGt0X2luZm8uYnl0ZV9jbnQsCisJCQkJCQlETUFfVE9fREVWSUNFKTsKKworCQkJZGV2X2tmcmVlX3NrYl9pcnEocGt0X2luZm8ucmV0dXJuX2luZm8pOworCisJCQlpZiAobXAtPnR4X3Jpbmdfc2ticykKKwkJCQltcC0+dHhfcmluZ19za2JzLS07CisJCX0gZWxzZQorCQkJZG1hX3VubWFwX3BhZ2UoTlVMTCwgcGt0X2luZm8uYnVmX3B0ciwKKwkJCQkJcGt0X2luZm8uYnl0ZV9jbnQsIERNQV9UT19ERVZJQ0UpOworCX0KKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkJCW1wLT50eF9yaW5nX3NpemUgPiBtcC0+dHhfcmluZ19za2JzICsgTUFYX0RFU0NTX1BFUl9TS0IpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoKKyAqIG12NjQzeHhfcG9sbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBjYXNlIG9mIE5BUEkKKyAqLworc3RhdGljIGludCBtdjY0M3h4X3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBkb25lID0gMSwgb3JpZ19idWRnZXQsIHdvcmtfZG9uZTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW0gPSBtcC0+cG9ydF9udW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIE1WNjQzWFhfVFhfRkFTVF9SRUZJTEwKKwlpZiAoKyttcC0+dHhfY2xlYW5fdGhyZXNob2xkID4gNSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPmxvY2ssIGZsYWdzKTsKKwkJbXY2NDN4eF90eChkZXYpOworCQltcC0+dHhfY2xlYW5fdGhyZXNob2xkID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKKwl9CisjZW5kaWYKKworCWlmICgobXZfcmVhZChNVjY0M1hYX0VUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzAocG9ydF9udW0pKSkKKwkJCQkJCSE9ICh1MzIpIG1wLT5yeF91c2VkX2Rlc2NfcSkgeworCQlvcmlnX2J1ZGdldCA9ICpidWRnZXQ7CisJCWlmIChvcmlnX2J1ZGdldCA+IGRldi0+cXVvdGEpCisJCQlvcmlnX2J1ZGdldCA9IGRldi0+cXVvdGE7CisJCXdvcmtfZG9uZSA9IG12NjQzeHhfZXRoX3JlY2VpdmVfcXVldWUoZGV2LCBvcmlnX2J1ZGdldCk7CisJCW1wLT5yeF90YXNrLmZ1bmMoZGV2KTsKKwkJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CisJCWRldi0+cXVvdGEgLT0gd29ya19kb25lOworCQlpZiAod29ya19kb25lID49IG9yaWdfYnVkZ2V0KQorCQkJZG9uZSA9IDA7CisJfQorCisJaWYgKGRvbmUpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CisJCV9fbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKKwkJbXZfd3JpdGUoTVY2NDNYWF9FVEhfSU5URVJSVVBUX0NBVVNFX1JFRyhwb3J0X251bSksIDApOworCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfQ0FVU0VfRVhURU5EX1JFRyhwb3J0X251bSksIDApOworCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcocG9ydF9udW0pLAorCQkJCQkJSU5UX0NBVVNFX1VOTUFTS19BTEwpOworCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfRVhURU5EX01BU0tfUkVHKHBvcnRfbnVtKSwKKwkJCQkJCUlOVF9DQVVTRV9VTk1BU0tfQUxMX0VYVCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIGRvbmUgPyAwIDogMTsKK30KKyNlbmRpZgorCisvKgorICogbXY2NDN4eF9ldGhfc3RhcnRfeG1pdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcXVldWVzIGEgcGFja2V0IGluIHRoZSBUeCBkZXNjcmlwdG9yIGZvcgorICogcmVxdWlyZWQgcG9ydC4KKyAqCisgKiBJbnB1dCA6CXNrYiAtIGEgcG9pbnRlciB0byBzb2NrZXQgYnVmZmVyCisgKgkJZGV2IC0gYSBwb2ludGVyIHRvIHRoZSByZXF1aXJlZCBwb3J0CisgKgorICogT3V0cHV0IDoJemVybyB1cG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBtdjY0M3h4X2V0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZtcC0+c3RhdHM7CisJRVRIX0ZVTkNfUkVUX1NUQVRVUyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcGt0X2luZm8gcGt0X2luZm87CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIiVzOiBUcmllZCBzZW5kaW5nIHBhY2tldCB3aGVuIGludGVyZmFjZSBpcyBzdG9wcGVkXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogVGhpcyBpcyBhIGhhcmQgZXJyb3IsIGxvZyBpdC4gKi8KKwlpZiAoKG1wLT50eF9yaW5nX3NpemUgLSBtcC0+dHhfcmluZ19za2JzKSA8PQorCQkJCQkoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDEpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiJXM6IEJ1ZyBpbiBtdjY0M3h4X2V0aCAtIFRyeWluZyB0byB0cmFuc21pdCB3aGVuIgorCQkJIiBxdWV1ZSBmdWxsICFcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCS8qIFBhcmFub2lkIGNoZWNrIC0gdGhpcyBzaG91bGRuJ3QgaGFwcGVuICovCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXN0YXRzLT50eF9kcm9wcGVkKys7CisJCXByaW50ayhLRVJOX0VSUiAibXY2NDMyMF9ldGggcGFyYW5vaWQgY2hlY2sgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CisKKwkvKiBVcGRhdGUgcGFja2V0IGluZm8gZGF0YSBzdHJ1Y3R1cmUgLS0gRE1BIG93bmVkLCBmaXJzdCBsYXN0ICovCisjaWZkZWYgTVY2NDNYWF9DSEVDS1NVTV9PRkZMT0FEX1RYCisJaWYgKCFza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSB7CitsaW5lYXI6CisJCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9IVykgeworCQkJcGt0X2luZm8uY21kX3N0cyA9IEVUSF9UWF9FTkFCTEVfSU5URVJSVVBUIHwKKwkJCQkJRVRIX1RYX0ZJUlNUX0RFU0MgfCBFVEhfVFhfTEFTVF9ERVNDOworCQkJcGt0X2luZm8ubDRpX2NoayA9IDA7CisJCX0gZWxzZSB7CisJCQl1MzIgaXBoZWFkZXIgPSBza2ItPm5oLmlwaC0+aWhsIDw8IDExOworCisJCQlwa3RfaW5mby5jbWRfc3RzID0gRVRIX1RYX0VOQUJMRV9JTlRFUlJVUFQgfAorCQkJCQlFVEhfVFhfRklSU1RfREVTQyB8IEVUSF9UWF9MQVNUX0RFU0MgfAorCQkJCQlFVEhfR0VOX1RDUF9VRFBfQ0hFQ0tTVU0gfAorCQkJCQlFVEhfR0VOX0lQX1ZfNF9DSEVDS1NVTSB8IGlwaGVhZGVyOworCQkJLyogQ1BVIGFscmVhZHkgY2FsY3VsYXRlZCBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtLiAqLworCQkJaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgeworCQkJCXBrdF9pbmZvLmNtZF9zdHMgfD0gRVRIX1VEUF9GUkFNRTsKKwkJCQlwa3RfaW5mby5sNGlfY2hrID0gc2tiLT5oLnVoLT5jaGVjazsKKwkJCX0gZWxzZSBpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKQorCQkJCXBrdF9pbmZvLmw0aV9jaGsgPSBza2ItPmgudGgtPmNoZWNrOworCQkJZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSIlczogY2hrc3VtIHByb3RvICE9IFRDUCBvciBVRFBcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCQlwa3RfaW5mby5ieXRlX2NudCA9IHNrYi0+bGVuOworCQlwa3RfaW5mby5idWZfcHRyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJcGt0X2luZm8ucmV0dXJuX2luZm8gPSBza2I7CisJCW1wLT50eF9yaW5nX3NrYnMrKzsKKwkJc3RhdHVzID0gZXRoX3BvcnRfc2VuZChtcCwgJnBrdF9pbmZvKTsKKwkJaWYgKChzdGF0dXMgPT0gRVRIX0VSUk9SKSB8fCAoc3RhdHVzID09IEVUSF9RVUVVRV9GVUxMKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIG9uIHRyYW5zbWl0dGluZyBwYWNrZXRcbiIsCisJCQkJCQkJCWRldi0+bmFtZSk7CisJCXN0YXRzLT50eF9ieXRlcyArPSBwa3RfaW5mby5ieXRlX2NudDsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQgZnJhZzsKKwkJdTMyIGlwaGVhZGVyOworCisJCS8qIFNpbmNlIGhhcmR3YXJlIGNhbid0IGhhbmRsZSB1bmFsaWduZWQgZnJhZ21lbnRzIHNtYWxsZXIKKwkJICogdGhhbiA5IGJ5dGVzLCBpZiB3ZSBmaW5kIGFueSwgd2UgbGluZWFyaXplIHRoZSBza2IKKwkJICogYW5kIHN0YXJ0IGFnYWluLiAgV2hlbiBJJ3ZlIHNlZW4gaXQsIGl0J3MgYWx3YXlzIGJlZW4KKwkJICogdGhlIGZpcnN0IGZyYWcgKHByb2JhYmx5IG5lYXIgdGhlIGVuZCBvZiB0aGUgcGFnZSksCisJCSAqIGJ1dCB3ZSBjaGVjayBhbGwgZnJhZ3MgdG8gYmUgc2FmZS4KKwkJICovCisJCWZvciAoZnJhZyA9IDA7IGZyYWcgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmcmFnKyspIHsKKwkJCXNrYl9mcmFnX3QgKmZyYWdwOworCisJCQlmcmFncCA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZyYWddOworCQkJaWYgKGZyYWdwLT5zaXplIDw9IDggJiYgZnJhZ3AtPnBhZ2Vfb2Zmc2V0ICYgMHg3KSB7CisJCQkJc2tiX2xpbmVhcml6ZShza2IsIEdGUF9BVE9NSUMpOworCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5hbGlnbmVkIHRpbnkgZnJhZ21lbnQiCisJCQkJCQkiJWQgb2YgJWQsIGZpeGVkXG4iLAorCQkJCQkJZGV2LT5uYW1lLCBmcmFnLAorCQkJCQkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyk7CisJCQkJZ290byBsaW5lYXI7CisJCQl9CisJCX0KKworCQkvKiBmaXJzdCBmcmFnIHdoaWNoIGlzIHNrYiBoZWFkZXIgKi8KKwkJcGt0X2luZm8uYnl0ZV9jbnQgPSBza2JfaGVhZGxlbihza2IpOworCQlwa3RfaW5mby5idWZfcHRyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLAorCQkJCQkJCXNrYl9oZWFkbGVuKHNrYiksCisJCQkJCQkJRE1BX1RPX0RFVklDRSk7CisJCXBrdF9pbmZvLmw0aV9jaGsgPSAwOworCQlwa3RfaW5mby5yZXR1cm5faW5mbyA9IDA7CisJCXBrdF9pbmZvLmNtZF9zdHMgPSBFVEhfVFhfRklSU1RfREVTQzsKKworCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpIHsKKwkJCWlwaGVhZGVyID0gc2tiLT5uaC5pcGgtPmlobCA8PCAxMTsKKwkJCXBrdF9pbmZvLmNtZF9zdHMgfD0gRVRIX0dFTl9UQ1BfVURQX0NIRUNLU1VNIHwKKwkJCQkJRVRIX0dFTl9JUF9WXzRfQ0hFQ0tTVU0gfCBpcGhlYWRlcjsKKwkJCS8qIENQVSBhbHJlYWR5IGNhbGN1bGF0ZWQgcHNldWRvIGhlYWRlciBjaGVja3N1bS4gKi8KKwkJCWlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKKwkJCQlwa3RfaW5mby5jbWRfc3RzIHw9IEVUSF9VRFBfRlJBTUU7CisJCQkJcGt0X2luZm8ubDRpX2NoayA9IHNrYi0+aC51aC0+Y2hlY2s7CisJCQl9IGVsc2UgaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKwkJCQlwa3RfaW5mby5sNGlfY2hrID0gc2tiLT5oLnRoLT5jaGVjazsKKwkJCWVsc2UgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiJXM6IGNoa3N1bSBwcm90byAhPSBUQ1Agb3IgVURQXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKworCQlzdGF0dXMgPSBldGhfcG9ydF9zZW5kKG1wLCAmcGt0X2luZm8pOworCQlpZiAoc3RhdHVzICE9IEVUSF9PSykgeworCQkJaWYgKChzdGF0dXMgPT0gRVRIX0VSUk9SKSkKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJIiVzOiBFcnJvciBvbiB0cmFuc21pdHRpbmcgcGFja2V0XG4iLAorCQkJCQlkZXYtPm5hbWUpOworCQkJaWYgKHN0YXR1cyA9PSBFVEhfUVVFVUVfRlVMTCkKKwkJCQlwcmludGsoIkVycm9yIG9uIFF1ZXVlIEZ1bGwgXG4iKTsKKwkJCWlmIChzdGF0dXMgPT0gRVRIX1FVRVVFX0xBU1RfUkVTT1VSQ0UpCisJCQkJcHJpbnRrKCJUeCByZXNvdXJjZSBlcnJvciBcbiIpOworCQl9CisJCXN0YXRzLT50eF9ieXRlcyArPSBwa3RfaW5mby5ieXRlX2NudDsKKworCQkvKiBDaGVjayBmb3IgdGhlIHJlbWFpbmluZyBmcmFncyAqLworCQlmb3IgKGZyYWcgPSAwOyBmcmFnIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgZnJhZysrKSB7CisJCQlza2JfZnJhZ190ICp0aGlzX2ZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmcmFnXTsKKwkJCXBrdF9pbmZvLmw0aV9jaGsgPSAweDAwMDA7CisJCQlwa3RfaW5mby5jbWRfc3RzID0gMHgwMDAwMDAwMDsKKworCQkJLyogTGFzdCBGcmFnIGVuYWJsZXMgaW50ZXJydXB0IGFuZCBmcmVlcyB0aGUgc2tiICovCisJCQlpZiAoZnJhZyA9PSAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyAtIDEpKSB7CisJCQkJcGt0X2luZm8uY21kX3N0cyB8PSBFVEhfVFhfRU5BQkxFX0lOVEVSUlVQVCB8CisJCQkJCQkJRVRIX1RYX0xBU1RfREVTQzsKKwkJCQlwa3RfaW5mby5yZXR1cm5faW5mbyA9IHNrYjsKKwkJCQltcC0+dHhfcmluZ19za2JzKys7CisJCQl9IGVsc2UgeworCQkJCXBrdF9pbmZvLnJldHVybl9pbmZvID0gMDsKKwkJCX0KKwkJCXBrdF9pbmZvLmw0aV9jaGsgPSAwOworCQkJcGt0X2luZm8uYnl0ZV9jbnQgPSB0aGlzX2ZyYWctPnNpemU7CisKKwkJCXBrdF9pbmZvLmJ1Zl9wdHIgPSBkbWFfbWFwX3BhZ2UoTlVMTCwgdGhpc19mcmFnLT5wYWdlLAorCQkJCQkJCXRoaXNfZnJhZy0+cGFnZV9vZmZzZXQsCisJCQkJCQkJdGhpc19mcmFnLT5zaXplLAorCQkJCQkJCURNQV9UT19ERVZJQ0UpOworCisJCQlzdGF0dXMgPSBldGhfcG9ydF9zZW5kKG1wLCAmcGt0X2luZm8pOworCisJCQlpZiAoc3RhdHVzICE9IEVUSF9PSykgeworCQkJCWlmICgoc3RhdHVzID09IEVUSF9FUlJPUikpCisJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIG9uICIKKwkJCQkJCQkidHJhbnNtaXR0aW5nIHBhY2tldFxuIiwKKwkJCQkJCQlkZXYtPm5hbWUpOworCisJCQkJaWYgKHN0YXR1cyA9PSBFVEhfUVVFVUVfTEFTVF9SRVNPVVJDRSkKKwkJCQkJcHJpbnRrKCJUeCByZXNvdXJjZSBlcnJvciBcbiIpOworCisJCQkJaWYgKHN0YXR1cyA9PSBFVEhfUVVFVUVfRlVMTCkKKwkJCQkJcHJpbnRrKCJRdWV1ZSBpcyBmdWxsIFxuIik7CisJCQl9CisJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gcGt0X2luZm8uYnl0ZV9jbnQ7CisJCX0KKwl9CisjZWxzZQorCXBrdF9pbmZvLmNtZF9zdHMgPSBFVEhfVFhfRU5BQkxFX0lOVEVSUlVQVCB8IEVUSF9UWF9GSVJTVF9ERVNDIHwKKwkJCQkJCQlFVEhfVFhfTEFTVF9ERVNDOworCXBrdF9pbmZvLmw0aV9jaGsgPSAwOworCXBrdF9pbmZvLmJ5dGVfY250ID0gc2tiLT5sZW47CisJcGt0X2luZm8uYnVmX3B0ciA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCisJCQkJCQkJCURNQV9UT19ERVZJQ0UpOworCXBrdF9pbmZvLnJldHVybl9pbmZvID0gc2tiOworCW1wLT50eF9yaW5nX3NrYnMrKzsKKwlzdGF0dXMgPSBldGhfcG9ydF9zZW5kKG1wLCAmcGt0X2luZm8pOworCWlmICgoc3RhdHVzID09IEVUSF9FUlJPUikgfHwgKHN0YXR1cyA9PSBFVEhfUVVFVUVfRlVMTCkpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIG9uIHRyYW5zbWl0dGluZyBwYWNrZXRcbiIsCisJCQkJCQkJCWRldi0+bmFtZSk7CisJc3RhdHMtPnR4X2J5dGVzICs9IHBrdF9pbmZvLmJ5dGVfY250OworI2VuZGlmCisKKwkvKiBDaGVjayBpZiBUWCBxdWV1ZSBjYW4gaGFuZGxlIGFub3RoZXIgc2tiLiBJZiBub3QsIHRoZW4KKwkgKiBzaWduYWwgaGlnaGVyIGxheWVycyB0byBzdG9wIHJlcXVlc3RpbmcgVFgKKwkgKi8KKwlpZiAobXAtPnR4X3Jpbmdfc2l6ZSA8PSAobXAtPnR4X3Jpbmdfc2ticyArIE1BWF9ERVNDU19QRVJfU0tCKSkKKwkJLyoKKwkJICogU3RvcCBnZXR0aW5nIHNrYidzIGZyb20gdXBwZXIgbGF5ZXJzLgorCQkgKiBHZXR0aW5nIHNrYidzIGZyb20gdXBwZXIgbGF5ZXJzIHdpbGwgYmUgZW5hYmxlZCBhZ2FpbiBhZnRlcgorCQkgKiBwYWNrZXRzIGFyZSByZWxlYXNlZC4KKwkJICovCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIFVwZGF0ZSBzdGF0aXN0aWNzIGFuZCBzdGFydCBvZiB0cmFuc21pdHRpb24gdGltZSAqLworCXN0YXRzLT50eF9wYWNrZXRzKys7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7CQkvKiBzdWNjZXNzICovCit9CisKKy8qCisgKiBtdjY0M3h4X2V0aF9nZXRfc3RhdHMKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0YXRpc3RpY3MuCisgKgorICogSW5wdXQgOglkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIHJlcXVpcmVkIGludGVyZmFjZQorICoKKyAqIE91dHB1dCA6CWEgcG9pbnRlciB0byB0aGUgaW50ZXJmYWNlJ3Mgc3RhdGlzdGljcworICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbXY2NDN4eF9ldGhfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZtcC0+c3RhdHM7Cit9CisKKy8qLworICogbXY2NDN4eF9ldGhfcHJvYmUKKyAqCisgKiBGaXJzdCBmdW5jdGlvbiBjYWxsZWQgYWZ0ZXIgcmVnaXN0ZXJpbmcgdGhlIG5ldHdvcmsgZGV2aWNlLgorICogSXQncyBwdXJwb3NlIGlzIHRvIGluaXRpYWxpemUgdGhlIGRldmljZSBhcyBhbiBldGhlcm5ldCBkZXZpY2UsCisgKiBmaWxsIHRoZSBldGhlcm5ldCBkZXZpY2Ugc3RydWN0dXJlIHdpdGggcG9pbnRlcnMgKiB0byBmdW5jdGlvbnMsCisgKiBhbmQgc2V0IHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlCisgKgorICogSW5wdXQgOglzdHJ1Y3QgZGV2aWNlICoKKyAqIE91dHB1dCA6CS1FTk9NRU0gaWYgZmFpbGVkICwgMCBpZiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgbXY2NDN4eF9ldGhfcHJvYmUoc3RydWN0IGRldmljZSAqZGRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRkZXYpOworCXN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhICpwZDsKKwlpbnQgcG9ydF9udW0gPSBwZGV2LT5pZDsKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXU4ICpwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBlcnI7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG12NjQzeHhfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZGV2LCBkZXYpOworCisJbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlCVUdfT04oIXJlcyk7CisJZGV2LT5pcnEgPSByZXMtPnN0YXJ0OworCisJbXAtPnBvcnRfbnVtID0gcG9ydF9udW07CisKKwlkZXYtPm9wZW4gPSBtdjY0M3h4X2V0aF9vcGVuOworCWRldi0+c3RvcCA9IG12NjQzeHhfZXRoX3N0b3A7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBtdjY0M3h4X2V0aF9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gbXY2NDN4eF9ldGhfZ2V0X3N0YXRzOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gbXY2NDN4eF9ldGhfc2V0X21hY19hZGRyZXNzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gbXY2NDN4eF9ldGhfc2V0X3J4X21vZGU7CisKKwkvKiBObyBuZWVkIHRvIFR4IFRpbWVvdXQgKi8KKwlkZXYtPnR4X3RpbWVvdXQgPSBtdjY0M3h4X2V0aF90eF90aW1lb3V0OworI2lmZGVmIE1WNjQzWFhfTkFQSQorCWRldi0+cG9sbCA9IG12NjQzeHhfcG9sbDsKKwlkZXYtPndlaWdodCA9IDY0OworI2VuZGlmCisKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gMiAqIEhaOworCWRldi0+dHhfcXVldWVfbGVuID0gbXAtPnR4X3Jpbmdfc2l6ZTsKKwlkZXYtPmJhc2VfYWRkciA9IDA7CisJZGV2LT5jaGFuZ2VfbXR1ID0gbXY2NDN4eF9ldGhfY2hhbmdlX210dTsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbXY2NDN4eF9ldGh0b29sX29wcyk7CisKKyNpZmRlZiBNVjY0M1hYX0NIRUNLU1VNX09GRkxPQURfVFgKKyNpZmRlZiBNQVhfU0tCX0ZSQUdTCisJLyoKKwkgKiBaZXJvIGNvcHkgY2FuIG9ubHkgd29yayBpZiB3ZSB1c2UgRGlzY292ZXJ5IElJIG1lbW9yeS4gRWxzZSwgd2Ugd2lsbAorCSAqIGhhdmUgdG8gbWFwIHRoZSBidWZmZXJzIHRvIElTQSBtZW1vcnkgd2hpY2ggaXMgb25seSAxNiBNQgorCSAqLworCWRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9IV19DU1VNOworI2VuZGlmCisjZW5kaWYKKworCS8qIENvbmZpZ3VyZSB0aGUgdGltZW91dCB0YXNrICovCisJSU5JVF9XT1JLKCZtcC0+dHhfdGltZW91dF90YXNrLAorCQkJKHZvaWQgKCopKHZvaWQgKikpbXY2NDN4eF9ldGhfdHhfdGltZW91dF90YXNrLCBkZXYpOworCisJc3Bpbl9sb2NrX2luaXQoJm1wLT5sb2NrKTsKKworCS8qIHNldCBkZWZhdWx0IGNvbmZpZyB2YWx1ZXMgKi8KKwlldGhfcG9ydF91Y19hZGRyX2dldChkZXYsIGRldi0+ZGV2X2FkZHIpOworCW1wLT5wb3J0X2NvbmZpZyA9IE1WNjQzWFhfRVRIX1BPUlRfQ09ORklHX0RFRkFVTFRfVkFMVUU7CisJbXAtPnBvcnRfY29uZmlnX2V4dGVuZCA9IE1WNjQzWFhfRVRIX1BPUlRfQ09ORklHX0VYVEVORF9ERUZBVUxUX1ZBTFVFOworCW1wLT5wb3J0X3NkbWFfY29uZmlnID0gTVY2NDNYWF9FVEhfUE9SVF9TRE1BX0NPTkZJR19ERUZBVUxUX1ZBTFVFOworCW1wLT5wb3J0X3NlcmlhbF9jb250cm9sID0gTVY2NDNYWF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9ERUZBVUxUX1ZBTFVFOworCW1wLT5yeF9yaW5nX3NpemUgPSBNVjY0M1hYX0VUSF9QT1JUX0RFRkFVTFRfUkVDRUlWRV9RVUVVRV9TSVpFOworCW1wLT50eF9yaW5nX3NpemUgPSBNVjY0M1hYX0VUSF9QT1JUX0RFRkFVTFRfVFJBTlNNSVRfUVVFVUVfU0laRTsKKworCXBkID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKHBkKSB7CisJCWlmIChwZC0+bWFjX2FkZHIgIT0gTlVMTCkKKwkJCW1lbWNweShkZXYtPmRldl9hZGRyLCBwZC0+bWFjX2FkZHIsIDYpOworCisJCWlmIChwZC0+cGh5X2FkZHIgfHwgcGQtPmZvcmNlX3BoeV9hZGRyKQorCQkJZXRoZXJuZXRfcGh5X3NldChwb3J0X251bSwgcGQtPnBoeV9hZGRyKTsKKworCQlpZiAocGQtPnBvcnRfY29uZmlnIHx8IHBkLT5mb3JjZV9wb3J0X2NvbmZpZykKKwkJCW1wLT5wb3J0X2NvbmZpZyA9IHBkLT5wb3J0X2NvbmZpZzsKKworCQlpZiAocGQtPnBvcnRfY29uZmlnX2V4dGVuZCB8fCBwZC0+Zm9yY2VfcG9ydF9jb25maWdfZXh0ZW5kKQorCQkJbXAtPnBvcnRfY29uZmlnX2V4dGVuZCA9IHBkLT5wb3J0X2NvbmZpZ19leHRlbmQ7CisKKwkJaWYgKHBkLT5wb3J0X3NkbWFfY29uZmlnIHx8IHBkLT5mb3JjZV9wb3J0X3NkbWFfY29uZmlnKQorCQkJbXAtPnBvcnRfc2RtYV9jb25maWcgPSBwZC0+cG9ydF9zZG1hX2NvbmZpZzsKKworCQlpZiAocGQtPnBvcnRfc2VyaWFsX2NvbnRyb2wgfHwgcGQtPmZvcmNlX3BvcnRfc2VyaWFsX2NvbnRyb2wpCisJCQltcC0+cG9ydF9zZXJpYWxfY29udHJvbCA9IHBkLT5wb3J0X3NlcmlhbF9jb250cm9sOworCisJCWlmIChwZC0+cnhfcXVldWVfc2l6ZSkKKwkJCW1wLT5yeF9yaW5nX3NpemUgPSBwZC0+cnhfcXVldWVfc2l6ZTsKKworCQlpZiAocGQtPnR4X3F1ZXVlX3NpemUpCisJCQltcC0+dHhfcmluZ19zaXplID0gcGQtPnR4X3F1ZXVlX3NpemU7CisKKwkJaWYgKHBkLT50eF9zcmFtX3NpemUpIHsKKwkJCW1wLT50eF9zcmFtX3NpemUgPSBwZC0+dHhfc3JhbV9zaXplOworCQkJbXAtPnR4X3NyYW1fYWRkciA9IHBkLT50eF9zcmFtX2FkZHI7CisJCX0KKworCQlpZiAocGQtPnJ4X3NyYW1fc2l6ZSkgeworCQkJbXAtPnJ4X3NyYW1fc2l6ZSA9IHBkLT5yeF9zcmFtX3NpemU7CisJCQltcC0+cnhfc3JhbV9hZGRyID0gcGQtPnJ4X3NyYW1fYWRkcjsKKwkJfQorCX0KKworCWVyciA9IGV0aGVybmV0X3BoeV9kZXRlY3QocG9ydF9udW0pOworCWlmIChlcnIpIHsKKwkJcHJfZGVidWcoIk1WNjQzeHggZXRoZXJuZXQgcG9ydCAlZDogIgorCQkJCQkiTm8gUEhZIGRldGVjdGVkIGF0IGFkZHIgJWRcbiIsCisJCQkJCXBvcnRfbnVtLCBldGhlcm5ldF9waHlfZ2V0KHBvcnRfbnVtKSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlwID0gZGV2LT5kZXZfYWRkcjsKKwlwcmludGsoS0VSTl9OT1RJQ0UKKwkJIiVzOiBwb3J0ICVkIHdpdGggTUFDIGFkZHJlc3MgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCWRldi0+bmFtZSwgcG9ydF9udW0sIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0sIHBbNV0pOworCisJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBTY2F0dGVyIEdhdGhlciBFbmFibGVkXG4iLCBkZXYtPm5hbWUpOworCisJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0lQX0NTVU0pCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFRYIFRDUC9JUCBDaGVja3N1bW1pbmcgU3VwcG9ydGVkXG4iLAorCQkJCQkJCQlkZXYtPm5hbWUpOworCisjaWZkZWYgTVY2NDNYWF9DSEVDS1NVTV9PRkZMT0FEX1RYCisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUlggVENQL1VEUCBDaGVja3N1bSBPZmZsb2FkIE9OIFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisjaWZkZWYgTVY2NDNYWF9DT0FMCisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogVFggYW5kIFJYIEludGVycnVwdCBDb2FsZXNjaW5nIE9OIFxuIiwKKwkJCQkJCQkJZGV2LT5uYW1lKTsKKyNlbmRpZgorCisjaWZkZWYgTVY2NDNYWF9OQVBJCisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUlggTkFQSSBFbmFibGVkIFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7CisKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtdjY0M3h4X2V0aF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRkZXYpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJZnJlZV9uZXRkZXYoZGV2KTsKKwlkZXZfc2V0X2RydmRhdGEoZGRldiwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY2NDN4eF9ldGhfc2hhcmVkX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXByaW50ayhLRVJOX05PVElDRSAiTVYtNjQzeHggMTAvMTAwLzEwMDAgRXRoZXJuZXQgRHJpdmVyXG4iKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW12NjQzeHhfZXRoX3NoYXJlZF9iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LAorCQkJCQkJTVY2NDNYWF9FVEhfU0hBUkVEX1JFR1NfU0laRSk7CisJaWYgKG12NjQzeHhfZXRoX3NoYXJlZF9iYXNlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCBtdjY0M3h4X2V0aF9zaGFyZWRfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRkZXYpCit7CisJaW91bm1hcChtdjY0M3h4X2V0aF9zaGFyZWRfYmFzZSk7CisJbXY2NDN4eF9ldGhfc2hhcmVkX2Jhc2UgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBtdjY0M3h4X2V0aF9kcml2ZXIgPSB7CisJLm5hbWUgPSBNVjY0M1hYX0VUSF9OQU1FLAorCS5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlID0gbXY2NDN4eF9ldGhfcHJvYmUsCisJLnJlbW92ZSA9IG12NjQzeHhfZXRoX3JlbW92ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBtdjY0M3h4X2V0aF9zaGFyZWRfZHJpdmVyID0geworCS5uYW1lID0gTVY2NDNYWF9FVEhfU0hBUkVEX05BTUUsCisJLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUgPSBtdjY0M3h4X2V0aF9zaGFyZWRfcHJvYmUsCisJLnJlbW92ZSA9IG12NjQzeHhfZXRoX3NoYXJlZF9yZW1vdmUsCit9OworCisvKgorICogbXY2NDN4eF9pbml0X21vZHVsZQorICoKKyAqIFJlZ2lzdGVycyB0aGUgbmV0d29yayBkcml2ZXJzIGludG8gdGhlIExpbnV4IGtlcm5lbAorICoKKyAqIElucHV0IDoJTi9BCisgKgorICogT3V0cHV0IDoJTi9BCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG12NjQzeHhfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGRyaXZlcl9yZWdpc3RlcigmbXY2NDN4eF9ldGhfc2hhcmVkX2RyaXZlcik7CisJaWYgKCFyYykgeworCQlyYyA9IGRyaXZlcl9yZWdpc3RlcigmbXY2NDN4eF9ldGhfZHJpdmVyKTsKKwkJaWYgKHJjKQorCQkJZHJpdmVyX3VucmVnaXN0ZXIoJm12NjQzeHhfZXRoX3NoYXJlZF9kcml2ZXIpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBtdjY0M3h4X2NsZWFudXBfbW9kdWxlCisgKgorICogUmVnaXN0ZXJzIHRoZSBuZXR3b3JrIGRyaXZlcnMgaW50byB0aGUgTGludXgga2VybmVsCisgKgorICogSW5wdXQgOglOL0EKKyAqCisgKiBPdXRwdXQgOglOL0EKKyAqLworc3RhdGljIHZvaWQgX19leGl0IG12NjQzeHhfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmbXY2NDN4eF9ldGhfZHJpdmVyKTsKKwlkcml2ZXJfdW5yZWdpc3RlcigmbXY2NDN4eF9ldGhfc2hhcmVkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG12NjQzeHhfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQobXY2NDN4eF9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoCSJSYWJlZWggS2hvdXJ5LCBBc3NhZiBIb2ZmbWFuLCBNYXR0aGV3IERoYXJtLCBNYW5pc2ggTGFjaHdhbmkiCisJCSIgYW5kIERhbGUgRmFybnN3b3J0aCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFdGhlcm5ldCBkcml2ZXIgZm9yIE1hcnZlbGwgTVY2NDNYWCIpOworCisvKgorICogVGhlIHNlY29uZCBwYXJ0IGlzIHRoZSBsb3cgbGV2ZWwgZHJpdmVyIG9mIHRoZSBnaWdFIGV0aGVybmV0IHBvcnRzLgorICovCisKKy8qCisgKiBNYXJ2ZWxsJ3MgR2lnYWJpdCBFdGhlcm5ldCBjb250cm9sbGVyIGxvdyBsZXZlbCBkcml2ZXIKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgZmlsZSBpbnRyb2R1Y2UgbG93IGxldmVsIEFQSSB0byBNYXJ2ZWxsJ3MgR2lnYWJpdCBFdGhlcm5ldAorICoJCWNvbnRyb2xsZXIuIFRoaXMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIGRyaXZlciBBUEkgY29udHJvbHMKKyAqCQkxKSBPcGVyYXRpb25zIChpLmUuIHBvcnQgaW5pdCwgc3RhcnQsIHJlc2V0IGV0YycpLgorICoJCTIpIERhdGEgZmxvdyAoaS5lLiBwb3J0IHNlbmQsIHJlY2VpdmUgZXRjJykuCisgKgkJRWFjaCBHaWdhYml0IEV0aGVybmV0IHBvcnQgaXMgY29udHJvbGxlZCB2aWEKKyAqCQlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlLgorICoJCVRoaXMgc3RydWN0IGluY2x1ZGVzIHVzZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhcyB3ZWxsIGFzCisgKgkJZHJpdmVyIGludGVybmFsIGRhdGEgbmVlZGVkIGZvciBpdHMgb3BlcmF0aW9ucy4KKyAqCisgKgkJU3VwcG9ydGVkIEZlYXR1cmVzOgorICoJCS0gVGhpcyBsb3cgbGV2ZWwgZHJpdmVyIGlzIE9TIGluZGVwZW5kZW50LiBBbGxvY2F0aW5nIG1lbW9yeSBmb3IKKyAqCQkgIHRoZSBkZXNjcmlwdG9yIHJpbmdzIGFuZCBidWZmZXJzIGFyZSBub3Qgd2l0aGluIHRoZSBzY29wZSBvZgorICoJCSAgdGhpcyBkcml2ZXIuCisgKgkJLSBUaGUgdXNlciBpcyBmcmVlIGZyb20gUngvVHggcXVldWUgbWFuYWdpbmcuCisgKgkJLSBUaGlzIGxvdyBsZXZlbCBkcml2ZXIgaW50cm9kdWNlIGZ1bmN0aW9uYWxpdHkgQVBJIHRoYXQgZW5hYmxlCisgKgkJICB0aGUgdG8gb3BlcmF0ZSBNYXJ2ZWxsJ3MgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIGluIGEKKyAqCQkgIGNvbnZlbmllbnQgd2F5LgorICoJCS0gU2ltcGxlIEdpZ2FiaXQgRXRoZXJuZXQgcG9ydCBvcGVyYXRpb24gQVBJLgorICoJCS0gU2ltcGxlIEdpZ2FiaXQgRXRoZXJuZXQgcG9ydCBkYXRhIGZsb3cgQVBJLgorICoJCS0gRGF0YSBmbG93IGFuZCBvcGVyYXRpb24gQVBJIHN1cHBvcnQgcGVyIHF1ZXVlIGZ1bmN0aW9uYWxpdHkuCisgKgkJLSBTdXBwb3J0IGNhY2hlZCBkZXNjcmlwdG9ycyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLgorICoJCS0gRW5hYmxlIGFjY2VzcyB0byBhbGwgZm91ciBEUkFNIGJhbmtzIGFuZCBpbnRlcm5hbCBTUkFNIG1lbW9yeQorICoJCSAgc3BhY2VzLgorICoJCS0gUEhZIGFjY2VzcyBhbmQgY29udHJvbCBBUEkuCisgKgkJLSBQb3J0IGNvbnRyb2wgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiBBUEkuCisgKgkJLSBGdWxsIGNvbnRyb2wgb3ZlciBVbmljYXN0IGFuZCBNdWx0aWNhc3QgTUFDIGNvbmZpZ3VyYXRpb25zLgorICoKKyAqCQlPcGVyYXRpb24gZmxvdzoKKyAqCisgKgkJSW5pdGlhbGl6YXRpb24gcGhhc2UKKyAqCQlUaGlzIHBoYXNlIGNvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdGhlCisgKgkJbXY2NDN4eF9wcml2YXRlIHN0cnVjdC4KKyAqCQlVc2VyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwb3J0IGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIHNldAorICoJCXByaW9yIHRvIGNhbGxpbmcgdGhlIHBvcnQgaW5pdGlhbGl6YXRpb24gcm91dGluZS4KKyAqCisgKgkJSW4gdGhpcyBwaGFzZSBhbnkgcG9ydCBUeC9SeCBhY3Rpdml0eSBpcyBoYWx0ZWQsIE1JQiBjb3VudGVycworICoJCWFyZSBjbGVhcmVkLCBQSFkgYWRkcmVzcyBpcyBzZXQgYWNjb3JkaW5nIHRvIHVzZXIgcGFyYW1ldGVyIGFuZAorICoJCWFjY2VzcyB0byBEUkFNIGFuZCBpbnRlcm5hbCBTUkFNIG1lbW9yeSBzcGFjZXMuCisgKgorICoJCURyaXZlciByaW5nIGluaXRpYWxpemF0aW9uCisgKgkJQWxsb2NhdGluZyBtZW1vcnkgZm9yIHRoZSBkZXNjcmlwdG9yIHJpbmdzIGFuZCBidWZmZXJzIGlzIG5vdAorICoJCXdpdGhpbiB0aGUgc2NvcGUgb2YgdGhpcyBkcml2ZXIuIFRodXMsIHRoZSB1c2VyIGlzIHJlcXVpcmVkIHRvCisgKgkJYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZGVzY3JpcHRvcnMgcmluZyBhbmQgYnVmZmVycy4gVGhvc2UKKyAqCQltZW1vcnkgcGFyYW1ldGVycyBhcmUgdXNlZCBieSB0aGUgUnggYW5kIFR4IHJpbmcgaW5pdGlhbGl6YXRpb24KKyAqCQlyb3V0aW5lcyBpbiBvcmRlciB0byBjdXJ2ZSB0aGUgZGVzY3JpcHRvciBsaW5rZWQgbGlzdCBpbiBhIGZvcm0KKyAqCQlvZiBhIHJpbmcuCisgKgkJTm90ZTogUGF5IHNwZWNpYWwgYXR0ZW50aW9uIHRvIGFsaWdubWVudCBpc3N1ZXMgd2hlbiB1c2luZworICoJCWNhY2hlZCBkZXNjcmlwdG9ycy9idWZmZXJzLiBJbiB0aGlzIHBoYXNlIHRoZSBkcml2ZXIgc3RvcmUKKyAqCQlpbmZvcm1hdGlvbiBpbiB0aGUgbXY2NDN4eF9wcml2YXRlIHN0cnVjdCByZWdhcmRpbmcgZWFjaCBxdWV1ZQorICoJCXJpbmcuCisgKgorICoJCURyaXZlciBzdGFydAorICoJCVRoaXMgcGhhc2UgcHJlcGFyZXMgdGhlIEV0aGVybmV0IHBvcnQgZm9yIFJ4IGFuZCBUeCBhY3Rpdml0eS4KKyAqCQlJdCB1c2VzIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIG12NjQzeHhfcHJpdmF0ZSBzdHJ1Y3QgdG8KKyAqCQlpbml0aWFsaXplIHRoZSB2YXJpb3VzIHBvcnQgcmVnaXN0ZXJzLgorICoKKyAqCQlEYXRhIGZsb3c6CisgKgkJQWxsIHBhY2tldCByZWZlcmVuY2VzIHRvL2Zyb20gdGhlIGRyaXZlciBhcmUgZG9uZSB1c2luZworICoJCXN0cnVjdCBwa3RfaW5mby4KKyAqCQlUaGlzIHN0cnVjdCBpcyBhIHVuaWZpZWQgc3RydWN0IHVzZWQgd2l0aCBSeCBhbmQgVHggb3BlcmF0aW9ucy4KKyAqCQlUaGlzIHdheSB0aGUgdXNlciBpcyBub3QgcmVxdWlyZWQgdG8gYmUgZmFtaWxpYXIgd2l0aCBuZWl0aGVyCisgKgkJVHggbm9yIFJ4IGRlc2NyaXB0b3JzIHN0cnVjdHVyZXMuCisgKgkJVGhlIGRyaXZlcidzIGRlc2NyaXB0b3JzIHJpbmdzIGFyZSBtYW5hZ2VtZW50IGJ5IGluZGV4ZXMuCisgKgkJVGhvc2UgaW5kZXhlcyBjb250cm9scyB0aGUgcmluZyByZXNvdXJjZXMgYW5kIHVzZWQgdG8gaW5kaWNhdGUKKyAqCQlhIFNXIHJlc291cmNlIGVycm9yOgorICoJCSdjdXJyZW50JworICoJCVRoaXMgaW5kZXggcG9pbnRzIHRvIHRoZSBjdXJyZW50IGF2YWlsYWJsZSByZXNvdXJjZSBmb3IgdXNlLiBGb3IKKyAqCQlleGFtcGxlIGluIFJ4IHByb2Nlc3MgdGhpcyBpbmRleCB3aWxsIHBvaW50IHRvIHRoZSBkZXNjcmlwdG9yCisgKgkJdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdXNlciB1cG9uIGNhbGxpbmcgdGhlIHJlY2VpdmUKKyAqCQlyb3V0aW5lLiAgSW4gVHggcHJvY2VzcywgdGhpcyBpbmRleCB3aWxsIHBvaW50IHRvIHRoZSBkZXNjcmlwdG9yCisgKgkJdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHdpdGggdGhlIHVzZXIgcGFja2V0IGluZm8gYW5kIHRyYW5zbWl0dGVkLgorICoJCSd1c2VkJworICoJCVRoaXMgaW5kZXggcG9pbnRzIHRvIHRoZSBkZXNjcmlwdG9yIHRoYXQgbmVlZCB0byByZXN0b3JlIGl0cworICoJCXJlc291cmNlcy4gRm9yIGV4YW1wbGUgaW4gUnggcHJvY2VzcywgdXNpbmcgdGhlIFJ4IGJ1ZmZlciByZXR1cm4KKyAqCQlBUEkgd2lsbCBhdHRhY2ggdGhlIGJ1ZmZlciByZXR1cm5lZCBpbiBwYWNrZXQgaW5mbyB0byB0aGUKKyAqCQlkZXNjcmlwdG9yIHBvaW50ZWQgYnkgJ3VzZWQnLiBJbiBUeCBwcm9jZXNzLCB1c2luZyB0aGUgVHgKKyAqCQlkZXNjcmlwdG9yIHJldHVybiB3aWxsIG1lcmVseSByZXR1cm4gdGhlIHVzZXIgcGFja2V0IGluZm8gd2l0aAorICoJCXRoZSBjb21tYW5kIHN0YXR1cyBvZiB0aGUgdHJhbnNtaXR0ZWQgYnVmZmVyIHBvaW50ZWQgYnkgdGhlCisgKgkJJ3VzZWQnIGluZGV4LiBOZXZlcnRoZWxlc3MsIGl0IGlzIGVzc2VudGlhbCB0byB1c2UgdGhpcyByb3V0aW5lCisgKgkJdG8gdXBkYXRlIHRoZSAndXNlZCcgaW5kZXguCisgKgkJJ2ZpcnN0JworICoJCVRoaXMgaW5kZXggc3VwcG9ydHMgVHggU2NhdHRlci1HYXRoZXIuIEl0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAqCQlkZXNjcmlwdG9yIG9mIGEgcGFja2V0IGFzc2VtYmxlZCBvZiBtdWx0aXBsZSBidWZmZXJzLiBGb3IKKyAqCQlleGFtcGxlIHdoZW4gaW4gbWlkZGxlIG9mIFN1Y2ggcGFja2V0IHdlIGhhdmUgYSBUeCByZXNvdXJjZQorICoJCWVycm9yIHRoZSAnY3VycicgaW5kZXggZ2V0IHRoZSB2YWx1ZSBvZiAnZmlyc3QnIHRvIGluZGljYXRlCisgKgkJdGhhdCB0aGUgcmluZyByZXR1cm5lZCB0byBpdHMgc3RhdGUgYmVmb3JlIHRyeWluZyB0byB0cmFuc21pdAorICoJCXRoaXMgcGFja2V0LgorICoKKyAqCQlSZWNlaXZlIG9wZXJhdGlvbjoKKyAqCQlUaGUgZXRoX3BvcnRfcmVjZWl2ZSBBUEkgc2V0IHRoZSBwYWNrZXQgaW5mb3JtYXRpb24gc3RydWN0LAorICoJCXBhc3NlZCBieSB0aGUgY2FsbGVyLCB3aXRoIHJlY2VpdmVkIGluZm9ybWF0aW9uIGZyb20gdGhlCisgKgkJJ2N1cnJlbnQnIFNETUEgZGVzY3JpcHRvci4KKyAqCQlJdCBpcyB0aGUgdXNlciByZXNwb25zaWJpbGl0eSB0byByZXR1cm4gdGhpcyByZXNvdXJjZSBiYWNrCisgKgkJdG8gdGhlIFJ4IGRlc2NyaXB0b3IgcmluZyB0byBlbmFibGUgdGhlIHJldXNlIG9mIHRoaXMgc291cmNlLgorICoJCVJldHVybiBSeCByZXNvdXJjZSBpcyBkb25lIHVzaW5nIHRoZSBldGhfcnhfcmV0dXJuX2J1ZmYgQVBJLgorICoKKyAqCQlUcmFuc21pdCBvcGVyYXRpb246CisgKgkJVGhlIGV0aF9wb3J0X3NlbmQgQVBJIHN1cHBvcnRzIFNjYXR0ZXItR2F0aGVyIHdoaWNoIGVuYWJsZXMgdG8KKyAqCQlzZW5kIGEgcGFja2V0IHNwYW5uZWQgb3ZlciBtdWx0aXBsZSBidWZmZXJzLiBUaGlzIG1lYW5zIHRoYXQKKyAqCQlmb3IgZWFjaCBwYWNrZXQgaW5mbyBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIHVzZXIgYW5kIHB1dCBpbnRvCisgKgkJdGhlIFR4IGRlc2NyaXB0b3JzIHJpbmcsIHdpbGwgYmUgdHJhbnNtaXR0ZWQgb25seSBpZiB0aGUgJ0xBU1QnCisgKgkJYml0IHdpbGwgYmUgc2V0IGluIHRoZSBwYWNrZXQgaW5mbyBjb21tYW5kIHN0YXR1cyBmaWVsZC4gVGhpcworICoJCUFQSSBhbHNvIGNvbnNpZGVyIHJlc3RyaWN0aW9uIHJlZ2FyZGluZyBidWZmZXIgYWxpZ25tZW50cyBhbmQKKyAqCQlzaXplcy4KKyAqCQlUaGUgdXNlciBtdXN0IHJldHVybiBhIFR4IHJlc291cmNlIGFmdGVyIGVuc3VyaW5nIHRoZSBidWZmZXIKKyAqCQloYXMgYmVlbiB0cmFuc21pdHRlZCB0byBlbmFibGUgdGhlIFR4IHJpbmcgaW5kZXhlcyB0byB1cGRhdGUuCisgKgorICoJCUJPQVJEIExBWU9VVAorICoJCVRoaXMgZGV2aWNlIGlzIG9uLWJvYXJkLiAgTm8ganVtcGVyIGRpYWdyYW0gaXMgbmVjZXNzYXJ5LgorICoKKyAqCQlFWFRFUk5BTCBJTlRFUkZBQ0UKKyAqCisgKglQcmlvciB0byBjYWxsaW5nIHRoZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGV0aF9wb3J0X2luaXQoKSB0aGUgdXNlcgorICoJbXVzdCBzZXQgdGhlIGZvbGxvd2luZyBmaWVsZHMgdW5kZXIgbXY2NDN4eF9wcml2YXRlIHN0cnVjdDoKKyAqCXBvcnRfbnVtCQlVc2VyIEV0aGVybmV0IHBvcnQgbnVtYmVyLgorICoJcG9ydF9tYWNfYWRkcls2XQlVc2VyIGRlZmluZWQgcG9ydCBNQUMgYWRkcmVzcy4KKyAqCXBvcnRfY29uZmlnCQlVc2VyIHBvcnQgY29uZmlndXJhdGlvbiB2YWx1ZS4KKyAqCXBvcnRfY29uZmlnX2V4dGVuZAlVc2VyIHBvcnQgY29uZmlnIGV4dGVuZCB2YWx1ZS4KKyAqCXBvcnRfc2RtYV9jb25maWcJVXNlciBwb3J0IFNETUEgY29uZmlnIHZhbHVlLgorICoJcG9ydF9zZXJpYWxfY29udHJvbAlVc2VyIHBvcnQgc2VyaWFsIGNvbnRyb2wgdmFsdWUuCisgKgorICoJCVRoaXMgZHJpdmVyIGRhdGEgZmxvdyBpcyBkb25lIHVzaW5nIHRoZSBzdHJ1Y3QgcGt0X2luZm8gd2hpY2gKKyAqCQlpcyBhIHVuaWZpZWQgc3RydWN0IGZvciBSeCBhbmQgVHggb3BlcmF0aW9uczoKKyAqCisgKgkJYnl0ZV9jbnQJVHgvUnggZGVzY3JpcHRvciBidWZmZXIgYnl0ZSBjb3VudC4KKyAqCQlsNGlfY2hrCQlDUFUgcHJvdmlkZWQgVENQIENoZWNrc3VtLiBGb3IgVHggb3BlcmF0aW9uCisgKgkJCQlvbmx5LgorICoJCWNtZF9zdHMJCVR4L1J4IGRlc2NyaXB0b3IgY29tbWFuZCBzdGF0dXMuCisgKgkJYnVmX3B0cgkJVHgvUnggZGVzY3JpcHRvciBidWZmZXIgcG9pbnRlci4KKyAqCQlyZXR1cm5faW5mbwlUeC9SeCB1c2VyIHJlc291cmNlIHJldHVybiBpbmZvcm1hdGlvbi4KKyAqLworCisvKiBkZWZpbmVzICovCisvKiBTRE1BIGNvbW1hbmQgbWFjcm9zICovCisjZGVmaW5lIEVUSF9FTkFCTEVfVFhfUVVFVUUoZXRoX3BvcnQpIFwKKwltdl93cml0ZShNVjY0M1hYX0VUSF9UUkFOU01JVF9RVUVVRV9DT01NQU5EX1JFRyhldGhfcG9ydCksIDEpCisKKy8qIGxvY2FscyAqLworCisvKiBQSFkgcm91dGluZXMgKi8KK3N0YXRpYyBpbnQgZXRoZXJuZXRfcGh5X2dldCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtKTsKK3N0YXRpYyB2b2lkIGV0aGVybmV0X3BoeV9zZXQodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSwgaW50IHBoeV9hZGRyKTsKKworLyogRXRoZXJuZXQgUG9ydCByb3V0aW5lcyAqLworc3RhdGljIGludCBldGhfcG9ydF91Y19hZGRyKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0sIHVuc2lnbmVkIGNoYXIgdWNfbmliYmxlLAorCQkJCQkJCQlpbnQgb3B0aW9uKTsKKworLyoKKyAqIGV0aF9wb3J0X2luaXQgLSBJbml0aWFsaXplIHRoZSBFdGhlcm5ldCBwb3J0IGRyaXZlcgorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyB0aGUgZXRoZXJuZXQgcG9ydCB0byBzdGFydCBpdHMgYWN0aXZpdHk6CisgKgkxKSBDb21wbGV0ZXMgdGhlIGV0aGVybmV0IHBvcnQgZHJpdmVyIHN0cnVjdCBpbml0aWFsaXphdGlvbiB0b3dhcmQgcG9ydAorICoJCXN0YXJ0IHJvdXRpbmUuCisgKgkyKSBSZXNldHMgdGhlIGRldmljZSB0byBhIHF1aWVzY2VudCBzdGF0ZSBpbiBjYXNlIG9mIHdhcm0gcmVib290LgorICoJMykgRW5hYmxlIFNETUEgYWNjZXNzIHRvIGFsbCBmb3VyIERSQU0gYmFua3MgYXMgd2VsbCBhcyBpbnRlcm5hbCBTUkFNLgorICoJNCkgQ2xlYW4gTUFDIHRhYmxlcy4gVGhlIHJlc2V0IHN0YXR1cyBvZiB0aG9zZSB0YWJsZXMgaXMgdW5rbm93bi4KKyAqCTUpIFNldCBQSFkgYWRkcmVzcy4KKyAqCU5vdGU6IENhbGwgdGhpcyByb3V0aW5lIHByaW9yIHRvIGV0aF9wb3J0X3N0YXJ0IHJvdXRpbmUgYW5kIGFmdGVyCisgKglzZXR0aW5nIHVzZXIgdmFsdWVzIGluIHRoZSB1c2VyIGZpZWxkcyBvZiBFdGhlcm5ldCBwb3J0IGNvbnRyb2wKKyAqCXN0cnVjdC4KKyAqCisgKiBJTlBVVDoKKyAqCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wCUV0aGVybmV0IHBvcnQgY29udHJvbCBzdHJ1Y3QKKyAqCisgKiBPVVRQVVQ6CisgKglTZWUgZGVzY3JpcHRpb24uCisgKgorICogUkVUVVJOOgorICoJTm9uZS4KKyAqLworc3RhdGljIHZvaWQgZXRoX3BvcnRfaW5pdChzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCkKK3sKKwltcC0+cG9ydF9yeF9xdWV1ZV9jb21tYW5kID0gMDsKKwltcC0+cG9ydF90eF9xdWV1ZV9jb21tYW5kID0gMDsKKworCW1wLT5yeF9yZXNvdXJjZV9lcnIgPSAwOworCW1wLT50eF9yZXNvdXJjZV9lcnIgPSAwOworCisJZXRoX3BvcnRfcmVzZXQobXAtPnBvcnRfbnVtKTsKKworCWV0aF9wb3J0X2luaXRfbWFjX3RhYmxlcyhtcC0+cG9ydF9udW0pOworCisJZXRoZXJuZXRfcGh5X3Jlc2V0KG1wLT5wb3J0X251bSk7Cit9CisKKy8qCisgKiBldGhfcG9ydF9zdGFydCAtIFN0YXJ0IHRoZSBFdGhlcm5ldCBwb3J0IGFjdGl2aXR5LgorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyByb3V0aW5lIHByZXBhcmVzIHRoZSBFdGhlcm5ldCBwb3J0IGZvciBSeCBhbmQgVHggYWN0aXZpdHk6CisgKgkgMS4gSW5pdGlhbGl6ZSBUeCBhbmQgUnggQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgZm9yIGVhY2ggcXVldWUgdGhhdAorICoJICAgIGhhcyBiZWVuIGluaXRpYWxpemVkIGEgZGVzY3JpcHRvcidzIHJpbmcgKHVzaW5nCisgKgkgICAgZXRoZXJfaW5pdF90eF9kZXNjX3JpbmcgZm9yIFR4IGFuZCBldGhlcl9pbml0X3J4X2Rlc2NfcmluZyBmb3IgUngpCisgKgkgMi4gSW5pdGlhbGl6ZSBhbmQgZW5hYmxlIHRoZSBFdGhlcm5ldCBjb25maWd1cmF0aW9uIHBvcnQgYnkgd3JpdGluZyB0bworICoJICAgIHRoZSBwb3J0J3MgY29uZmlndXJhdGlvbiBhbmQgY29tbWFuZCByZWdpc3RlcnMuCisgKgkgMy4gSW5pdGlhbGl6ZSBhbmQgZW5hYmxlIHRoZSBTRE1BIGJ5IHdyaXRpbmcgdG8gdGhlIFNETUEncworICoJICAgIGNvbmZpZ3VyYXRpb24gYW5kIGNvbW1hbmQgcmVnaXN0ZXJzLiAgQWZ0ZXIgY29tcGxldGluZyB0aGVzZSBzdGVwcywKKyAqCSAgICB0aGUgZXRoZXJuZXQgcG9ydCBTRE1BIGNhbiBzdGFydHMgdG8gcGVyZm9ybSBSeCBhbmQgVHggYWN0aXZpdGllcy4KKyAqCisgKglOb3RlOiBFYWNoIFJ4IGFuZCBUeCBxdWV1ZSBkZXNjcmlwdG9yJ3MgbGlzdCBtdXN0IGJlIGluaXRpYWxpemVkIHByaW9yCisgKgl0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gKHVzZSBldGhlcl9pbml0X3R4X2Rlc2NfcmluZyBmb3IgVHggcXVldWVzCisgKglhbmQgZXRoZXJfaW5pdF9yeF9kZXNjX3JpbmcgZm9yIFJ4IHF1ZXVlcykuCisgKgorICogSU5QVVQ6CisgKglzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcAlFdGhlcm5ldCBwb3J0IGNvbnRyb2wgc3RydWN0CisgKgorICogT1VUUFVUOgorICoJRXRoZXJuZXQgcG9ydCBpcyByZWFkeSB0byByZWNlaXZlIGFuZCB0cmFuc21pdC4KKyAqCisgKiBSRVRVUk46CisgKglOb25lLgorICovCitzdGF0aWMgdm9pZCBldGhfcG9ydF9zdGFydChzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCkKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW0gPSBtcC0+cG9ydF9udW07CisJaW50IHR4X2N1cnJfZGVzYywgcnhfY3Vycl9kZXNjOworCisJLyogQXNzaWdubWVudCBvZiBUeCBDVFJQIG9mIGdpdmVuIHF1ZXVlICovCisJdHhfY3Vycl9kZXNjID0gbXAtPnR4X2N1cnJfZGVzY19xOworCW12X3dyaXRlKE1WNjQzWFhfRVRIX1RYX0NVUlJFTlRfUVVFVUVfREVTQ19QVFJfMChwb3J0X251bSksCisJCSh1MzIpKChzdHJ1Y3QgZXRoX3R4X2Rlc2MgKiltcC0+dHhfZGVzY19kbWEgKyB0eF9jdXJyX2Rlc2MpKTsKKworCS8qIEFzc2lnbm1lbnQgb2YgUnggQ1JEUCBvZiBnaXZlbiBxdWV1ZSAqLworCXJ4X2N1cnJfZGVzYyA9IG1wLT5yeF9jdXJyX2Rlc2NfcTsKKwltdl93cml0ZShNVjY0M1hYX0VUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzAocG9ydF9udW0pLAorCQkodTMyKSgoc3RydWN0IGV0aF9yeF9kZXNjICopbXAtPnJ4X2Rlc2NfZG1hICsgcnhfY3Vycl9kZXNjKSk7CisKKwkvKiBBZGQgdGhlIGFzc2lnbmVkIEV0aGVybmV0IGFkZHJlc3MgdG8gdGhlIHBvcnQncyBhZGRyZXNzIHRhYmxlICovCisJZXRoX3BvcnRfdWNfYWRkcl9zZXQocG9ydF9udW0sIG1wLT5wb3J0X21hY19hZGRyKTsKKworCS8qIEFzc2lnbiBwb3J0IGNvbmZpZ3VyYXRpb24gYW5kIGNvbW1hbmQuICovCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUE9SVF9DT05GSUdfUkVHKHBvcnRfbnVtKSwgbXAtPnBvcnRfY29uZmlnKTsKKworCW12X3dyaXRlKE1WNjQzWFhfRVRIX1BPUlRfQ09ORklHX0VYVEVORF9SRUcocG9ydF9udW0pLAorCQkJCQkJbXAtPnBvcnRfY29uZmlnX2V4dGVuZCk7CisKKworCS8qIEluY3JlYXNlIHRoZSBSeCBzaWRlIGJ1ZmZlciBzaXplIGlmIHN1cHBvcnRpbmcgR2lnRSAqLworCWlmIChtcC0+cG9ydF9zZXJpYWxfY29udHJvbCAmIE1WNjQzWFhfRVRIX1NFVF9HTUlJX1NQRUVEX1RPXzEwMDApCisJCW12X3dyaXRlKE1WNjQzWFhfRVRIX1BPUlRfU0VSSUFMX0NPTlRST0xfUkVHKHBvcnRfbnVtKSwKKwkJCShtcC0+cG9ydF9zZXJpYWxfY29udHJvbCAmIDB4ZmZmMWZmZmYpIHwgKDB4NSA8PCAxNykpOworCWVsc2UKKwkJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcocG9ydF9udW0pLAorCQkJCQkJbXAtPnBvcnRfc2VyaWFsX2NvbnRyb2wpOworCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcocG9ydF9udW0pLAorCQltdl9yZWFkKE1WNjQzWFhfRVRIX1BPUlRfU0VSSUFMX0NPTlRST0xfUkVHKHBvcnRfbnVtKSkgfAorCQkJCQkJTVY2NDNYWF9FVEhfU0VSSUFMX1BPUlRfRU5BQkxFKTsKKworCS8qIEFzc2lnbiBwb3J0IFNETUEgY29uZmlndXJhdGlvbiAqLworCW12X3dyaXRlKE1WNjQzWFhfRVRIX1NETUFfQ09ORklHX1JFRyhwb3J0X251bSksCisJCQkJCQkJbXAtPnBvcnRfc2RtYV9jb25maWcpOworCisJLyogRW5hYmxlIHBvcnQgUnguICovCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRyhwb3J0X251bSksCisJCQkJCQltcC0+cG9ydF9yeF9xdWV1ZV9jb21tYW5kKTsKK30KKworLyoKKyAqIGV0aF9wb3J0X3VjX2FkZHJfc2V0IC0gVGhpcyBmdW5jdGlvbiBTZXQgdGhlIHBvcnQgVW5pY2FzdCBhZGRyZXNzLgorICoKKyAqIERFU0NSSVBUSU9OOgorICoJCVRoaXMgZnVuY3Rpb24gU2V0IHRoZSBwb3J0IEV0aGVybmV0IE1BQyBhZGRyZXNzLgorICoKKyAqIElOUFVUOgorICoJdW5zaWduZWQgaW50CWV0aF9wb3J0X251bQlQb3J0IG51bWJlci4KKyAqCWNoYXIgKgkJcF9hZGRyCQlBZGRyZXNzIHRvIGJlIHNldAorICoKKyAqIE9VVFBVVDoKKyAqCVNldCBNQUMgYWRkcmVzcyBsb3cgYW5kIGhpZ2ggcmVnaXN0ZXJzLiBhbHNvIGNhbGxzIGV0aF9wb3J0X3VjX2FkZHIoKQorICoJVG8gc2V0IHRoZSB1bmljYXN0IHRhYmxlIHdpdGggdGhlIHByb3BlciBpbmZvcm1hdGlvbi4KKyAqCisgKiBSRVRVUk46CisgKglOL0EuCisgKgorICovCitzdGF0aWMgdm9pZCBldGhfcG9ydF91Y19hZGRyX3NldCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtLAorCQkJCQkJCXVuc2lnbmVkIGNoYXIgKnBfYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgbWFjX2g7CisJdW5zaWduZWQgaW50IG1hY19sOworCisJbWFjX2wgPSAocF9hZGRyWzRdIDw8IDgpIHwgKHBfYWRkcls1XSk7CisJbWFjX2ggPSAocF9hZGRyWzBdIDw8IDI0KSB8IChwX2FkZHJbMV0gPDwgMTYpIHwgKHBfYWRkclsyXSA8PCA4KSB8CisJCQkJCQkJKHBfYWRkclszXSA8PCAwKTsKKworCW12X3dyaXRlKE1WNjQzWFhfRVRIX01BQ19BRERSX0xPVyhldGhfcG9ydF9udW0pLCBtYWNfbCk7CisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfTUFDX0FERFJfSElHSChldGhfcG9ydF9udW0pLCBtYWNfaCk7CisKKwkvKiBBY2NlcHQgZnJhbWVzIG9mIHRoaXMgYWRkcmVzcyAqLworCWV0aF9wb3J0X3VjX2FkZHIoZXRoX3BvcnRfbnVtLCBwX2FkZHJbNV0sIEFDQ0VQVF9NQUNfQUREUik7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBldGhfcG9ydF91Y19hZGRyX2dldCAtIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBwb3J0IFVuaWNhc3QgYWRkcmVzcworICogKE1BQyBhZGRyZXNzKSBmcm9tIHRoZSBldGhlcm5ldCBodyByZWdpc3RlcnMuCisgKgorICogREVTQ1JJUFRJT046CisgKgkJVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHBvcnQgRXRoZXJuZXQgTUFDIGFkZHJlc3MuCisgKgorICogSU5QVVQ6CisgKgl1bnNpZ25lZCBpbnQJZXRoX3BvcnRfbnVtCVBvcnQgbnVtYmVyLgorICoJY2hhcgkJKk1hY0FkZHIJcG9pbnRlciB3aGVyZSB0aGUgTUFDIGFkZHJlc3MgaXMgc3RvcmVkCisgKgorICogT1VUUFVUOgorICoJQ29weSB0aGUgTUFDIGFkZHJlc3MgdG8gdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgTWFjQWRkcgorICoKKyAqIFJFVFVSTjoKKyAqCU4vQS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3VjX2FkZHJfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKnBfYWRkcikKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IG1hY19oOworCXVuc2lnbmVkIGludCBtYWNfbDsKKworCW1hY19oID0gbXZfcmVhZChNVjY0M1hYX0VUSF9NQUNfQUREUl9ISUdIKG1wLT5wb3J0X251bSkpOworCW1hY19sID0gbXZfcmVhZChNVjY0M1hYX0VUSF9NQUNfQUREUl9MT1cobXAtPnBvcnRfbnVtKSk7CisKKwlwX2FkZHJbMF0gPSAobWFjX2ggPj4gMjQpICYgMHhmZjsKKwlwX2FkZHJbMV0gPSAobWFjX2ggPj4gMTYpICYgMHhmZjsKKwlwX2FkZHJbMl0gPSAobWFjX2ggPj4gOCkgJiAweGZmOworCXBfYWRkclszXSA9IG1hY19oICYgMHhmZjsKKwlwX2FkZHJbNF0gPSAobWFjX2wgPj4gOCkgJiAweGZmOworCXBfYWRkcls1XSA9IG1hY19sICYgMHhmZjsKK30KKworLyoKKyAqIGV0aF9wb3J0X3VjX2FkZHIgLSBUaGlzIGZ1bmN0aW9uIFNldCB0aGUgcG9ydCB1bmljYXN0IGFkZHJlc3MgdGFibGUKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgZnVuY3Rpb24gbG9jYXRlcyB0aGUgcHJvcGVyIGVudHJ5IGluIHRoZSBVbmljYXN0IHRhYmxlIGZvciB0aGUKKyAqCXNwZWNpZmllZCBNQUMgbmliYmxlIGFuZCBzZXRzIGl0cyBwcm9wZXJ0aWVzIGFjY29yZGluZyB0byBmdW5jdGlvbgorICoJcGFyYW1ldGVycy4KKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludAlldGhfcG9ydF9udW0JUG9ydCBudW1iZXIuCisgKgl1bnNpZ25lZCBjaGFyCXVjX25pYmJsZQlVbmljYXN0IE1BQyBBZGRyZXNzIGxhc3QgbmliYmxlLgorICoJaW50IAkJb3B0aW9uCQkwID0gQWRkLCAxID0gcmVtb3ZlIGFkZHJlc3MuCisgKgorICogT1VUUFVUOgorICoJVGhpcyBmdW5jdGlvbiBhZGQvcmVtb3ZlcyBNQUMgYWRkcmVzc2VzIGZyb20gdGhlIHBvcnQgdW5pY2FzdCBhZGRyZXNzCisgKgl0YWJsZS4KKyAqCisgKiBSRVRVUk46CisgKgl0cnVlIGlzIG91dHB1dCBzdWNjZWVkZWQuCisgKglmYWxzZSBpZiBvcHRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQuCisgKgorICovCitzdGF0aWMgaW50IGV0aF9wb3J0X3VjX2FkZHIodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSwgdW5zaWduZWQgY2hhciB1Y19uaWJibGUsCisJCQkJCQkJCWludCBvcHRpb24pCit7CisJdW5zaWduZWQgaW50IHVuaWNhc3RfcmVnOworCXVuc2lnbmVkIGludCB0Ymxfb2Zmc2V0OworCXVuc2lnbmVkIGludCByZWdfb2Zmc2V0OworCisJLyogTG9jYXRlIHRoZSBVbmljYXN0IHRhYmxlIGVudHJ5ICovCisJdWNfbmliYmxlID0gKDB4ZiAmIHVjX25pYmJsZSk7CisJdGJsX29mZnNldCA9ICh1Y19uaWJibGUgLyA0KSAqIDQ7CS8qIFJlZ2lzdGVyIG9mZnNldCBmcm9tIHVuaWNhc3QgdGFibGUgYmFzZSAqLworCXJlZ19vZmZzZXQgPSB1Y19uaWJibGUgJSA0OwkvKiBFbnRyeSBvZmZzZXQgd2l0aGluIHRoZSBhYm92ZSByZWdpc3RlciAqLworCisJc3dpdGNoIChvcHRpb24pIHsKKwljYXNlIFJFSkVDVF9NQUNfQUREUjoKKwkJLyogQ2xlYXIgYWNjZXB0cyBmcmFtZSBiaXQgYXQgZ2l2ZW4gdW5pY2FzdCBEQSB0YWJsZSBlbnRyeSAqLworCQl1bmljYXN0X3JlZyA9IG12X3JlYWQoKE1WNjQzWFhfRVRIX0RBX0ZJTFRFUl9VTklDQVNUX1RBQkxFX0JBU0UKKwkJCQkJCShldGhfcG9ydF9udW0pICsgdGJsX29mZnNldCkpOworCisJCXVuaWNhc3RfcmVnICY9ICgweDBFIDw8ICg4ICogcmVnX29mZnNldCkpOworCisJCW12X3dyaXRlKChNVjY0M1hYX0VUSF9EQV9GSUxURVJfVU5JQ0FTVF9UQUJMRV9CQVNFCisJCQkJKGV0aF9wb3J0X251bSkgKyB0Ymxfb2Zmc2V0KSwgdW5pY2FzdF9yZWcpOworCQlicmVhazsKKworCWNhc2UgQUNDRVBUX01BQ19BRERSOgorCQkvKiBTZXQgYWNjZXB0cyBmcmFtZSBiaXQgYXQgdW5pY2FzdCBEQSBmaWx0ZXIgdGFibGUgZW50cnkgKi8KKwkJdW5pY2FzdF9yZWcgPQorCQkJbXZfcmVhZCgoTVY2NDNYWF9FVEhfREFfRklMVEVSX1VOSUNBU1RfVEFCTEVfQkFTRQorCQkJCQkJKGV0aF9wb3J0X251bSkgKyB0Ymxfb2Zmc2V0KSk7CisKKwkJdW5pY2FzdF9yZWcgfD0gKDB4MDEgPDwgKDggKiByZWdfb2Zmc2V0KSk7CisKKwkJbXZfd3JpdGUoKE1WNjQzWFhfRVRIX0RBX0ZJTFRFUl9VTklDQVNUX1RBQkxFX0JBU0UKKwkJCQkoZXRoX3BvcnRfbnVtKSArIHRibF9vZmZzZXQpLCB1bmljYXN0X3JlZyk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGV0aF9wb3J0X2luaXRfbWFjX3RhYmxlcyAtIENsZWFyIGFsbCBlbnRyYW5jZSBpbiB0aGUgVUMsIFNNQyBhbmQgT01DIHRhYmxlcworICoKKyAqIERFU0NSSVBUSU9OOgorICoJR28gdGhyb3VnaCBhbGwgdGhlIERBIGZpbHRlciB0YWJsZXMgKFVuaWNhc3QsIFNwZWNpYWwgTXVsdGljYXN0ICYKKyAqCU90aGVyIE11bHRpY2FzdCkgYW5kIHNldCBlYWNoIGVudHJ5IHRvIDAuCisgKgorICogSU5QVVQ6CisgKgl1bnNpZ25lZCBpbnQJZXRoX3BvcnRfbnVtCUV0aGVybmV0IFBvcnQgbnVtYmVyLgorICoKKyAqIE9VVFBVVDoKKyAqCU11bHRpY2FzdCBhbmQgVW5pY2FzdCBwYWNrZXRzIGFyZSByZWplY3RlZC4KKyAqCisgKiBSRVRVUk46CisgKglOb25lLgorICovCitzdGF0aWMgdm9pZCBldGhfcG9ydF9pbml0X21hY190YWJsZXModW5zaWduZWQgaW50IGV0aF9wb3J0X251bSkKK3sKKwlpbnQgdGFibGVfaW5kZXg7CisKKwkvKiBDbGVhciBEQSBmaWx0ZXIgdW5pY2FzdCB0YWJsZSAoRXhfZEZVVCkgKi8KKwlmb3IgKHRhYmxlX2luZGV4ID0gMDsgdGFibGVfaW5kZXggPD0gMHhDOyB0YWJsZV9pbmRleCArPSA0KQorCQltdl93cml0ZSgoTVY2NDNYWF9FVEhfREFfRklMVEVSX1VOSUNBU1RfVEFCTEVfQkFTRQorCQkJCQkoZXRoX3BvcnRfbnVtKSArIHRhYmxlX2luZGV4KSwgMCk7CisKKwlmb3IgKHRhYmxlX2luZGV4ID0gMDsgdGFibGVfaW5kZXggPD0gMHhGQzsgdGFibGVfaW5kZXggKz0gNCkgeworCQkvKiBDbGVhciBEQSBmaWx0ZXIgc3BlY2lhbCBtdWx0aWNhc3QgdGFibGUgKEV4X2RGU01UKSAqLworCQltdl93cml0ZSgoTVY2NDNYWF9FVEhfREFfRklMVEVSX1NQRUNJQUxfTVVMVElDQVNUX1RBQkxFX0JBU0UKKwkJCQkJKGV0aF9wb3J0X251bSkgKyB0YWJsZV9pbmRleCksIDApOworCQkvKiBDbGVhciBEQSBmaWx0ZXIgb3RoZXIgbXVsdGljYXN0IHRhYmxlIChFeF9kRk9NVCkgKi8KKwkJbXZfd3JpdGUoKE1WNjQzWFhfRVRIX0RBX0ZJTFRFUl9PVEhFUl9NVUxUSUNBU1RfVEFCTEVfQkFTRQorCQkJCQkoZXRoX3BvcnRfbnVtKSArIHRhYmxlX2luZGV4KSwgMCk7CisJfQorfQorCisvKgorICogZXRoX2NsZWFyX21pYl9jb3VudGVycyAtIENsZWFyIGFsbCBNSUIgY291bnRlcnMKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgZnVuY3Rpb24gY2xlYXJzIGFsbCBNSUIgY291bnRlcnMgb2YgYSBzcGVjaWZpYyBldGhlcm5ldCBwb3J0LgorICoJQSByZWFkIGZyb20gdGhlIE1JQiBjb3VudGVyIHdpbGwgcmVzZXQgdGhlIGNvdW50ZXIuCisgKgorICogSU5QVVQ6CisgKgl1bnNpZ25lZCBpbnQJZXRoX3BvcnRfbnVtCUV0aGVybmV0IFBvcnQgbnVtYmVyLgorICoKKyAqIE9VVFBVVDoKKyAqCUFmdGVyIHJlYWRpbmcgYWxsIE1JQiBjb3VudGVycywgdGhlIGNvdW50ZXJzIHJlc2V0cy4KKyAqCisgKiBSRVRVUk46CisgKglNSUIgY291bnRlciB2YWx1ZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGV0aF9jbGVhcl9taWJfY291bnRlcnModW5zaWduZWQgaW50IGV0aF9wb3J0X251bSkKK3sKKwlpbnQgaTsKKworCS8qIFBlcmZvcm0gZHVtbXkgcmVhZHMgZnJvbSBNSUIgY291bnRlcnMgKi8KKwlmb3IgKGkgPSBFVEhfTUlCX0dPT0RfT0NURVRTX1JFQ0VJVkVEX0xPVzsgaSA8IEVUSF9NSUJfTEFURV9DT0xMSVNJT047CisJCQkJCQkJCQlpICs9IDQpCisJCW12X3JlYWQoTVY2NDNYWF9FVEhfTUlCX0NPVU5URVJTX0JBU0UoZXRoX3BvcnRfbnVtKSArIGkpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiByZWFkX21pYihzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCwgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gbXZfcmVhZChNVjY0M1hYX0VUSF9NSUJfQ09VTlRFUlNfQkFTRShtcC0+cG9ydF9udW0pICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgZXRoX3VwZGF0ZV9taWJfY291bnRlcnMoc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXApCit7CisJc3RydWN0IG12NjQzeHhfbWliX2NvdW50ZXJzICpwID0gJm1wLT5taWJfY291bnRlcnM7CisJaW50IG9mZnNldDsKKworCXAtPmdvb2Rfb2N0ZXRzX3JlY2VpdmVkICs9CisJCXJlYWRfbWliKG1wLCBFVEhfTUlCX0dPT0RfT0NURVRTX1JFQ0VJVkVEX0xPVyk7CisJcC0+Z29vZF9vY3RldHNfcmVjZWl2ZWQgKz0KKwkJKHU2NClyZWFkX21pYihtcCwgRVRIX01JQl9HT09EX09DVEVUU19SRUNFSVZFRF9ISUdIKSA8PCAzMjsKKworCWZvciAob2Zmc2V0ID0gRVRIX01JQl9CQURfT0NURVRTX1JFQ0VJVkVEOworCQkJb2Zmc2V0IDw9IEVUSF9NSUJfRlJBTUVTXzEwMjRfVE9fTUFYX09DVEVUUzsKKwkJCW9mZnNldCArPSA0KQorCQkqKHUzMiAqKSgoY2hhciAqKXAgKyBvZmZzZXQpID0gcmVhZF9taWIobXAsIG9mZnNldCk7CisKKwlwLT5nb29kX29jdGV0c19zZW50ICs9IHJlYWRfbWliKG1wLCBFVEhfTUlCX0dPT0RfT0NURVRTX1NFTlRfTE9XKTsKKwlwLT5nb29kX29jdGV0c19zZW50ICs9CisJCSh1NjQpcmVhZF9taWIobXAsIEVUSF9NSUJfR09PRF9PQ1RFVFNfU0VOVF9ISUdIKSA8PCAzMjsKKworCWZvciAob2Zmc2V0ID0gRVRIX01JQl9HT09EX0ZSQU1FU19TRU5UOworCQkJb2Zmc2V0IDw9IEVUSF9NSUJfTEFURV9DT0xMSVNJT047CisJCQlvZmZzZXQgKz0gNCkKKwkJKih1MzIgKikoKGNoYXIgKilwICsgb2Zmc2V0KSA9IHJlYWRfbWliKG1wLCBvZmZzZXQpOworfQorCisvKgorICogZXRoZXJuZXRfcGh5X2RldGVjdCAtIERldGVjdCB3aGV0aGVyIGEgcGh5IGlzIHByZXNlbnQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgZnVuY3Rpb24gdGVzdHMgd2hldGhlciB0aGVyZSBpcyBhIFBIWSBwcmVzZW50IG9uCisgKgl0aGUgc3BlY2lmaWVkIHBvcnQuCisgKgorICogSU5QVVQ6CisgKgl1bnNpZ25lZCBpbnQJZXRoX3BvcnRfbnVtCUV0aGVybmV0IFBvcnQgbnVtYmVyLgorICoKKyAqIE9VVFBVVDoKKyAqCU5vbmUKKyAqCisgKiBSRVRVUk46CisgKgkwIG9uIHN1Y2Nlc3MKKyAqCS1FTk9ERVYgb24gZmFpbHVyZQorICoKKyAqLworc3RhdGljIGludCBldGhlcm5ldF9waHlfZGV0ZWN0KHVuc2lnbmVkIGludCBwb3J0X251bSkKK3sKKwl1bnNpZ25lZCBpbnQgcGh5X3JlZ19kYXRhMDsKKwlpbnQgYXV0b19uZWc7CisKKwlldGhfcG9ydF9yZWFkX3NtaV9yZWcocG9ydF9udW0sIDAsICZwaHlfcmVnX2RhdGEwKTsKKwlhdXRvX25lZyA9IHBoeV9yZWdfZGF0YTAgJiAweDEwMDA7CisJcGh5X3JlZ19kYXRhMCBePSAweDEwMDA7CS8qIGludmVydCBhdXRvX25lZyAqLworCWV0aF9wb3J0X3dyaXRlX3NtaV9yZWcocG9ydF9udW0sIDAsIHBoeV9yZWdfZGF0YTApOworCisJZXRoX3BvcnRfcmVhZF9zbWlfcmVnKHBvcnRfbnVtLCAwLCAmcGh5X3JlZ19kYXRhMCk7CisJaWYgKChwaHlfcmVnX2RhdGEwICYgMHgxMDAwKSA9PSBhdXRvX25lZykKKwkJcmV0dXJuIC1FTk9ERVY7CQkJCS8qIGNoYW5nZSBkaWRuJ3QgdGFrZSAqLworCisJcGh5X3JlZ19kYXRhMCBePSAweDEwMDA7CisJZXRoX3BvcnRfd3JpdGVfc21pX3JlZyhwb3J0X251bSwgMCwgcGh5X3JlZ19kYXRhMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBldGhlcm5ldF9waHlfZ2V0IC0gR2V0IHRoZSBldGhlcm5ldCBwb3J0IFBIWSBhZGRyZXNzLgorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGdpdmVuIGV0aGVybmV0IHBvcnQgUEhZIGFkZHJlc3MuCisgKgorICogSU5QVVQ6CisgKgl1bnNpZ25lZCBpbnQJZXRoX3BvcnRfbnVtCUV0aGVybmV0IFBvcnQgbnVtYmVyLgorICoKKyAqIE9VVFBVVDoKKyAqCU5vbmUuCisgKgorICogUkVUVVJOOgorICoJUEhZIGFkZHJlc3MuCisgKgorICovCitzdGF0aWMgaW50IGV0aGVybmV0X3BoeV9nZXQodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnX2RhdGE7CisKKwlyZWdfZGF0YSA9IG12X3JlYWQoTVY2NDNYWF9FVEhfUEhZX0FERFJfUkVHKTsKKworCXJldHVybiAoKHJlZ19kYXRhID4+ICg1ICogZXRoX3BvcnRfbnVtKSkgJiAweDFmKTsKK30KKworLyoKKyAqIGV0aGVybmV0X3BoeV9zZXQgLSBTZXQgdGhlIGV0aGVybmV0IHBvcnQgUEhZIGFkZHJlc3MuCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIHJvdXRpbmUgc2V0cyB0aGUgZ2l2ZW4gZXRoZXJuZXQgcG9ydCBQSFkgYWRkcmVzcy4KKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludAlldGhfcG9ydF9udW0JRXRoZXJuZXQgUG9ydCBudW1iZXIuCisgKglpbnQJCXBoeV9hZGRyCVBIWSBhZGRyZXNzLgorICoKKyAqIE9VVFBVVDoKKyAqCU5vbmUuCisgKgorICogUkVUVVJOOgorICoJTm9uZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGV0aGVybmV0X3BoeV9zZXQodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSwgaW50IHBoeV9hZGRyKQoreworCXUzMiByZWdfZGF0YTsKKwlpbnQgYWRkcl9zaGlmdCA9IDUgKiBldGhfcG9ydF9udW07CisKKwlyZWdfZGF0YSA9IG12X3JlYWQoTVY2NDNYWF9FVEhfUEhZX0FERFJfUkVHKTsKKwlyZWdfZGF0YSAmPSB+KDB4MWYgPDwgYWRkcl9zaGlmdCk7CisJcmVnX2RhdGEgfD0gKHBoeV9hZGRyICYgMHgxZikgPDwgYWRkcl9zaGlmdDsKKwltdl93cml0ZShNVjY0M1hYX0VUSF9QSFlfQUREUl9SRUcsIHJlZ19kYXRhKTsKK30KKworLyoKKyAqIGV0aGVybmV0X3BoeV9yZXNldCAtIFJlc2V0IEV0aGVybmV0IHBvcnQgUEhZLgorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyByb3V0aW5lIHV0aWxpemVzIHRoZSBTTUkgaW50ZXJmYWNlIHRvIHJlc2V0IHRoZSBldGhlcm5ldCBwb3J0IFBIWS4KKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludAlldGhfcG9ydF9udW0JRXRoZXJuZXQgUG9ydCBudW1iZXIuCisgKgorICogT1VUUFVUOgorICoJVGhlIFBIWSBpcyByZXNldC4KKyAqCisgKiBSRVRVUk46CisgKglOb25lLgorICoKKyAqLworc3RhdGljIHZvaWQgZXRoZXJuZXRfcGh5X3Jlc2V0KHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0pCit7CisJdW5zaWduZWQgaW50IHBoeV9yZWdfZGF0YTsKKworCS8qIFJlc2V0IHRoZSBQSFkgKi8KKwlldGhfcG9ydF9yZWFkX3NtaV9yZWcoZXRoX3BvcnRfbnVtLCAwLCAmcGh5X3JlZ19kYXRhKTsKKwlwaHlfcmVnX2RhdGEgfD0gMHg4MDAwOwkvKiBTZXQgYml0IDE1IHRvIHJlc2V0IHRoZSBQSFkgKi8KKwlldGhfcG9ydF93cml0ZV9zbWlfcmVnKGV0aF9wb3J0X251bSwgMCwgcGh5X3JlZ19kYXRhKTsKK30KKworLyoKKyAqIGV0aF9wb3J0X3Jlc2V0IC0gUmVzZXQgRXRoZXJuZXQgcG9ydAorICoKKyAqIERFU0NSSVBUSU9OOgorICogCVRoaXMgcm91dGluZSByZXNldHMgdGhlIGNoaXAgYnkgYWJvcnRpbmcgYW55IFNETUEgZW5naW5lIGFjdGl2aXR5IGFuZAorICoJY2xlYXJpbmcgdGhlIE1JQiBjb3VudGVycy4gVGhlIFJlY2VpdmVyIGFuZCB0aGUgVHJhbnNtaXQgdW5pdCBhcmUgaW4KKyAqCWlkbGUgc3RhdGUgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHBlcmZvcm1lZCBhbmQgdGhlIHBvcnQgaXMgZGlzYWJsZWQuCisgKgorICogSU5QVVQ6CisgKgl1bnNpZ25lZCBpbnQJZXRoX3BvcnRfbnVtCUV0aGVybmV0IFBvcnQgbnVtYmVyLgorICoKKyAqIE9VVFBVVDoKKyAqCUNoYW5uZWwgYWN0aXZpdHkgaXMgaGFsdGVkLgorICoKKyAqIFJFVFVSTjoKKyAqCU5vbmUuCisgKgorICovCitzdGF0aWMgdm9pZCBldGhfcG9ydF9yZXNldCh1bnNpZ25lZCBpbnQgcG9ydF9udW0pCit7CisJdW5zaWduZWQgaW50IHJlZ19kYXRhOworCisJLyogU3RvcCBUeCBwb3J0IGFjdGl2aXR5LiBDaGVjayBwb3J0IFR4IGFjdGl2aXR5LiAqLworCXJlZ19kYXRhID0gbXZfcmVhZChNVjY0M1hYX0VUSF9UUkFOU01JVF9RVUVVRV9DT01NQU5EX1JFRyhwb3J0X251bSkpOworCisJaWYgKHJlZ19kYXRhICYgMHhGRikgeworCQkvKiBJc3N1ZSBzdG9wIGNvbW1hbmQgZm9yIGFjdGl2ZSBjaGFubmVscyBvbmx5ICovCisJCW12X3dyaXRlKE1WNjQzWFhfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHKHBvcnRfbnVtKSwKKwkJCQkJCQkocmVnX2RhdGEgPDwgOCkpOworCisJCS8qIFdhaXQgZm9yIGFsbCBUeCBhY3Rpdml0eSB0byB0ZXJtaW5hdGUuICovCisJCS8qIENoZWNrIHBvcnQgY2F1c2UgcmVnaXN0ZXIgdGhhdCBhbGwgVHggcXVldWVzIGFyZSBzdG9wcGVkICovCisJCXdoaWxlIChtdl9yZWFkKE1WNjQzWFhfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHKHBvcnRfbnVtKSkKKwkJCQkJCQkJCSYgMHhGRikKKwkJCXVkZWxheSgxMCk7CisJfQorCisJLyogU3RvcCBSeCBwb3J0IGFjdGl2aXR5LiBDaGVjayBwb3J0IFJ4IGFjdGl2aXR5LiAqLworCXJlZ19kYXRhID0gbXZfcmVhZChNVjY0M1hYX0VUSF9SRUNFSVZFX1FVRVVFX0NPTU1BTkRfUkVHKHBvcnRfbnVtKSk7CisKKwlpZiAocmVnX2RhdGEgJiAweEZGKSB7CisJCS8qIElzc3VlIHN0b3AgY29tbWFuZCBmb3IgYWN0aXZlIGNoYW5uZWxzIG9ubHkgKi8KKwkJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRyhwb3J0X251bSksCisJCQkJCQkJKHJlZ19kYXRhIDw8IDgpKTsKKworCQkvKiBXYWl0IGZvciBhbGwgUnggYWN0aXZpdHkgdG8gdGVybWluYXRlLiAqLworCQkvKiBDaGVjayBwb3J0IGNhdXNlIHJlZ2lzdGVyIHRoYXQgYWxsIFJ4IHF1ZXVlcyBhcmUgc3RvcHBlZCAqLworCQl3aGlsZSAobXZfcmVhZChNVjY0M1hYX0VUSF9SRUNFSVZFX1FVRVVFX0NPTU1BTkRfUkVHKHBvcnRfbnVtKSkKKwkJCQkJCQkJCSYgMHhGRikKKwkJCXVkZWxheSgxMCk7CisJfQorCisJLyogQ2xlYXIgYWxsIE1JQiBjb3VudGVycyAqLworCWV0aF9jbGVhcl9taWJfY291bnRlcnMocG9ydF9udW0pOworCisJLyogUmVzZXQgdGhlIEVuYWJsZSBiaXQgaW4gdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwlyZWdfZGF0YSA9IG12X3JlYWQoTVY2NDNYWF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcocG9ydF9udW0pKTsKKwlyZWdfZGF0YSAmPSB+TVY2NDNYWF9FVEhfU0VSSUFMX1BPUlRfRU5BQkxFOworCW12X3dyaXRlKE1WNjQzWFhfRVRIX1BPUlRfU0VSSUFMX0NPTlRST0xfUkVHKHBvcnRfbnVtKSwgcmVnX2RhdGEpOworfQorCisvKgorICogZXRoZXJuZXRfc2V0X2NvbmZpZ19yZWcgLSBTZXQgc3BlY2lmaWVkIGJpdHMgaW4gY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgZnVuY3Rpb24gc2V0cyBzcGVjaWZpZWQgYml0cyBpbiB0aGUgZ2l2ZW4gZXRoZXJuZXQKKyAqCWNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuCisgKgorICogSU5QVVQ6CisgKgl1bnNpZ25lZCBpbnQJZXRoX3BvcnRfbnVtCUV0aGVybmV0IFBvcnQgbnVtYmVyLgorICoJdW5zaWduZWQgaW50CXZhbHVlCQkzMiBiaXQgdmFsdWUuCisgKgorICogT1VUUFVUOgorICoJVGhlIHNldCBiaXRzIGluIHRoZSB2YWx1ZSBwYXJhbWV0ZXIgYXJlIHNldCBpbiB0aGUgY29uZmlndXJhdGlvbgorICoJcmVnaXN0ZXIuCisgKgorICogUkVUVVJOOgorICoJTm9uZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGV0aGVybmV0X3NldF9jb25maWdfcmVnKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0sCisJCQkJCQkJdW5zaWduZWQgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludCBldGhfY29uZmlnX3JlZzsKKworCWV0aF9jb25maWdfcmVnID0gbXZfcmVhZChNVjY0M1hYX0VUSF9QT1JUX0NPTkZJR19SRUcoZXRoX3BvcnRfbnVtKSk7CisJZXRoX2NvbmZpZ19yZWcgfD0gdmFsdWU7CisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUE9SVF9DT05GSUdfUkVHKGV0aF9wb3J0X251bSksIGV0aF9jb25maWdfcmVnKTsKK30KKworc3RhdGljIGludCBldGhfcG9ydF9hdXRvbmVnX3N1cHBvcnRlZCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtKQoreworCXVuc2lnbmVkIGludCBwaHlfcmVnX2RhdGEwOworCisJZXRoX3BvcnRfcmVhZF9zbWlfcmVnKGV0aF9wb3J0X251bSwgMCwgJnBoeV9yZWdfZGF0YTApOworCisJcmV0dXJuIHBoeV9yZWdfZGF0YTAgJiAweDEwMDA7Cit9CisKK3N0YXRpYyBpbnQgZXRoX3BvcnRfbGlua19pc191cCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtKQoreworCXVuc2lnbmVkIGludCBwaHlfcmVnX2RhdGExOworCisJZXRoX3BvcnRfcmVhZF9zbWlfcmVnKGV0aF9wb3J0X251bSwgMSwgJnBoeV9yZWdfZGF0YTEpOworCisJaWYgKGV0aF9wb3J0X2F1dG9uZWdfc3VwcG9ydGVkKGV0aF9wb3J0X251bSkpIHsKKwkJaWYgKHBoeV9yZWdfZGF0YTEgJiAweDIwKQkvKiBhdXRvLW5lZyBjb21wbGV0ZSAqLworCQkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChwaHlfcmVnX2RhdGExICYgMHg0KQkJLyogbGluayB1cCAqLworCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKgorICogZXRoZXJuZXRfZ2V0X2NvbmZpZ19yZWcgLSBHZXQgdGhlIHBvcnQgY29uZmlndXJhdGlvbiByZWdpc3RlcgorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHZhbHVlIG9mIHRoZSBnaXZlbgorICoJZXRoZXJuZXQgcG9ydC4KKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludAlldGhfcG9ydF9udW0JRXRoZXJuZXQgUG9ydCBudW1iZXIuCisgKgorICogT1VUUFVUOgorICoJTm9uZS4KKyAqCisgKiBSRVRVUk46CisgKglQb3J0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgdmFsdWUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXRoZXJuZXRfZ2V0X2NvbmZpZ19yZWcodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSkKK3sKKwl1bnNpZ25lZCBpbnQgZXRoX2NvbmZpZ19yZWc7CisKKwlldGhfY29uZmlnX3JlZyA9IG12X3JlYWQoTVY2NDNYWF9FVEhfUE9SVF9DT05GSUdfRVhURU5EX1JFRworCQkJCQkJCQkoZXRoX3BvcnRfbnVtKSk7CisJcmV0dXJuIGV0aF9jb25maWdfcmVnOworfQorCisvKgorICogZXRoX3BvcnRfcmVhZF9zbWlfcmVnIC0gUmVhZCBQSFkgcmVnaXN0ZXJzCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIHJvdXRpbmUgdXRpbGl6ZSB0aGUgU01JIGludGVyZmFjZSB0byBpbnRlcmFjdCB3aXRoIHRoZSBQSFkgaW4KKyAqCW9yZGVyIHRvIHBlcmZvcm0gUEhZIHJlZ2lzdGVyIHJlYWQuCisgKgorICogSU5QVVQ6CisgKgl1bnNpZ25lZCBpbnQJcG9ydF9udW0JRXRoZXJuZXQgUG9ydCBudW1iZXIuCisgKgl1bnNpZ25lZCBpbnQJcGh5X3JlZwkJUEhZIHJlZ2lzdGVyIGFkZHJlc3Mgb2Zmc2V0LgorICoJdW5zaWduZWQgaW50CSp2YWx1ZQkJUmVnaXN0ZXIgdmFsdWUgYnVmZmVyLgorICoKKyAqIE9VVFBVVDoKKyAqCVdyaXRlIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBQSFkgcmVnaXN0ZXIgaW50byBnaXZlbiBidWZmZXIuCisgKgorICogUkVUVVJOOgorICoJZmFsc2UgaWYgdGhlIFBIWSBpcyBidXN5IG9yIHJlYWQgZGF0YSBpcyBub3QgaW4gdmFsaWQgc3RhdGUuCisgKgl0cnVlIG90aGVyd2lzZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3JlYWRfc21pX3JlZyh1bnNpZ25lZCBpbnQgcG9ydF9udW0sCisJCQkJdW5zaWduZWQgaW50IHBoeV9yZWcsIHVuc2lnbmVkIGludCAqdmFsdWUpCit7CisJaW50IHBoeV9hZGRyID0gZXRoZXJuZXRfcGh5X2dldChwb3J0X251bSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCS8qIHRoZSBTTUkgcmVnaXN0ZXIgaXMgYSBzaGFyZWQgcmVzb3VyY2UgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXY2NDN4eF9ldGhfcGh5X2xvY2ssIGZsYWdzKTsKKworCS8qIHdhaXQgZm9yIHRoZSBTTUkgcmVnaXN0ZXIgdG8gYmVjb21lIGF2YWlsYWJsZSAqLworCWZvciAoaSA9IDA7IG12X3JlYWQoTVY2NDNYWF9FVEhfU01JX1JFRykgJiBFVEhfU01JX0JVU1k7IGkrKykgeworCQlpZiAoaSA9PSBQSFlfV0FJVF9JVEVSQVRJT05TKSB7CisJCQlwcmludGsoIm12NjQzeHggUEhZIGJ1c3kgdGltZW91dCwgcG9ydCAlZFxuIiwgcG9ydF9udW0pOworCQkJZ290byBvdXQ7CisJCX0KKwkJdWRlbGF5KFBIWV9XQUlUX01JQ1JPX1NFQ09ORFMpOworCX0KKworCW12X3dyaXRlKE1WNjQzWFhfRVRIX1NNSV9SRUcsCisJCShwaHlfYWRkciA8PCAxNikgfCAocGh5X3JlZyA8PCAyMSkgfCBFVEhfU01JX09QQ09ERV9SRUFEKTsKKworCS8qIG5vdyB3YWl0IGZvciB0aGUgZGF0YSB0byBiZSB2YWxpZCAqLworCWZvciAoaSA9IDA7ICEobXZfcmVhZChNVjY0M1hYX0VUSF9TTUlfUkVHKSAmIEVUSF9TTUlfUkVBRF9WQUxJRCk7IGkrKykgeworCQlpZiAoaSA9PSBQSFlfV0FJVF9JVEVSQVRJT05TKSB7CisJCQlwcmludGsoIm12NjQzeHggUEhZIHJlYWQgdGltZW91dCwgcG9ydCAlZFxuIiwgcG9ydF9udW0pOworCQkJZ290byBvdXQ7CisJCX0KKwkJdWRlbGF5KFBIWV9XQUlUX01JQ1JPX1NFQ09ORFMpOworCX0KKworCSp2YWx1ZSA9IG12X3JlYWQoTVY2NDNYWF9FVEhfU01JX1JFRykgJiAweGZmZmY7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXY2NDN4eF9ldGhfcGh5X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIGV0aF9wb3J0X3dyaXRlX3NtaV9yZWcgLSBXcml0ZSB0byBQSFkgcmVnaXN0ZXJzCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIHJvdXRpbmUgdXRpbGl6ZSB0aGUgU01JIGludGVyZmFjZSB0byBpbnRlcmFjdCB3aXRoIHRoZSBQSFkgaW4KKyAqCW9yZGVyIHRvIHBlcmZvcm0gd3JpdGVzIHRvIFBIWSByZWdpc3RlcnMuCisgKgorICogSU5QVVQ6CisgKgl1bnNpZ25lZCBpbnQJZXRoX3BvcnRfbnVtCUV0aGVybmV0IFBvcnQgbnVtYmVyLgorICoJdW5zaWduZWQgaW50CXBoeV9yZWcJCVBIWSByZWdpc3RlciBhZGRyZXNzIG9mZnNldC4KKyAqCXVuc2lnbmVkIGludAl2YWx1ZQkJUmVnaXN0ZXIgdmFsdWUuCisgKgorICogT1VUUFVUOgorICoJV3JpdGUgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgUEhZIHJlZ2lzdGVyLgorICoKKyAqIFJFVFVSTjoKKyAqCWZhbHNlIGlmIHRoZSBQSFkgaXMgYnVzeS4KKyAqCXRydWUgb3RoZXJ3aXNlLgorICoKKyAqLworc3RhdGljIHZvaWQgZXRoX3BvcnRfd3JpdGVfc21pX3JlZyh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtLAorCQkJCSAgIHVuc2lnbmVkIGludCBwaHlfcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJaW50IHBoeV9hZGRyOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwaHlfYWRkciA9IGV0aGVybmV0X3BoeV9nZXQoZXRoX3BvcnRfbnVtKTsKKworCS8qIHRoZSBTTUkgcmVnaXN0ZXIgaXMgYSBzaGFyZWQgcmVzb3VyY2UgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXY2NDN4eF9ldGhfcGh5X2xvY2ssIGZsYWdzKTsKKworCS8qIHdhaXQgZm9yIHRoZSBTTUkgcmVnaXN0ZXIgdG8gYmVjb21lIGF2YWlsYWJsZSAqLworCWZvciAoaSA9IDA7IG12X3JlYWQoTVY2NDNYWF9FVEhfU01JX1JFRykgJiBFVEhfU01JX0JVU1k7IGkrKykgeworCQlpZiAoaSA9PSBQSFlfV0FJVF9JVEVSQVRJT05TKSB7CisJCQlwcmludGsoIm12NjQzeHggUEhZIGJ1c3kgdGltZW91dCwgcG9ydCAlZFxuIiwKKwkJCQkJCQkJZXRoX3BvcnRfbnVtKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXVkZWxheShQSFlfV0FJVF9NSUNST19TRUNPTkRTKTsKKwl9CisKKwltdl93cml0ZShNVjY0M1hYX0VUSF9TTUlfUkVHLCAocGh5X2FkZHIgPDwgMTYpIHwgKHBoeV9yZWcgPDwgMjEpIHwKKwkJCQlFVEhfU01JX09QQ09ERV9XUklURSB8ICh2YWx1ZSAmIDB4ZmZmZikpOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm12NjQzeHhfZXRoX3BoeV9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBldGhfcG9ydF9zZW5kIC0gU2VuZCBhbiBFdGhlcm5ldCBwYWNrZXQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgcm91dGluZSBzZW5kIGEgZ2l2ZW4gcGFja2V0IGRlc2NyaWJlZCBieSBwX3BrdGluZm8gcGFyYW1ldGVyLiBJdAorICoJc3VwcG9ydHMgdHJhbnNtaXR0aW5nIG9mIGEgcGFja2V0IHNwYW5lZCBvdmVyIG11bHRpcGxlIGJ1ZmZlcnMuIFRoZQorICoJcm91dGluZSB1cGRhdGVzICdjdXJyJyBhbmQgJ2ZpcnN0JyBpbmRleGVzIGFjY29yZGluZyB0byB0aGUgcGFja2V0CisgKglzZWdtZW50IHBhc3NlZCB0byB0aGUgcm91dGluZS4gSW4gY2FzZSB0aGUgcGFja2V0IHNlZ21lbnQgaXMgZmlyc3QsCisgKgl0aGUgJ2ZpcnN0JyBpbmRleCBpcyB1cGRhdGUuIEluIGFueSBjYXNlLCB0aGUgJ2N1cnInIGluZGV4IGlzIHVwZGF0ZWQuCisgKglJZiB0aGUgcm91dGluZSBnZXQgaW50byBUeCByZXNvdXJjZSBlcnJvciBpdCBhc3NpZ25zICdjdXJyJyBpbmRleCBhcworICoJJ2ZpcnN0Jy4gVGhpcyB3YXkgdGhlIGZ1bmN0aW9uIGNhbiBhYm9ydCBUeCBwcm9jZXNzIG9mIG11bHRpcGxlCisgKglkZXNjcmlwdG9ycyBwZXIgcGFja2V0LgorICoKKyAqIElOUFVUOgorICoJc3RydWN0IG12NjQzeHhfcHJpdmF0ZQkqbXAJCUV0aGVybmV0IFBvcnQgQ29udHJvbCBzcnR1Y3QuCisgKglzdHJ1Y3QgcGt0X2luZm8JCSpwX3BrdF9pbmZvCVVzZXIgcGFja2V0IGJ1ZmZlci4KKyAqCisgKiBPVVRQVVQ6CisgKglUeCByaW5nICdjdXJyJyBhbmQgJ2ZpcnN0JyBpbmRleGVzIGFyZSB1cGRhdGVkLgorICoKKyAqIFJFVFVSTjoKKyAqCUVUSF9RVUVVRV9GVUxMIGluIGNhc2Ugb2YgVHggcmVzb3VyY2UgZXJyb3IuCisgKglFVEhfRVJST1IgaW4gY2FzZSB0aGUgcm91dGluZSBjYW4gbm90IGFjY2VzcyBUeCBkZXNjIHJpbmcuCisgKglFVEhfUVVFVUVfTEFTVF9SRVNPVVJDRSBpZiB0aGUgcm91dGluZSB1c2VzIHRoZSBsYXN0IFR4IHJlc291cmNlLgorICoJRVRIX09LIG90aGVyd2lzZS4KKyAqCisgKi8KKyNpZmRlZiBNVjY0M1hYX0NIRUNLU1VNX09GRkxPQURfVFgKKy8qCisgKiBNb2RpZmllZCB0byBpbmNsdWRlIHRoZSBmaXJzdCBkZXNjcmlwdG9yIHBvaW50ZXIgaW4gY2FzZSBvZiBTRworICovCitzdGF0aWMgRVRIX0ZVTkNfUkVUX1NUQVRVUyBldGhfcG9ydF9zZW5kKHN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wLAorCQkJCQkgc3RydWN0IHBrdF9pbmZvICpwX3BrdF9pbmZvKQoreworCWludCB0eF9kZXNjX2N1cnIsIHR4X2Rlc2NfdXNlZCwgdHhfZmlyc3RfZGVzYywgdHhfbmV4dF9kZXNjOworCXN0cnVjdCBldGhfdHhfZGVzYyAqY3VycmVudF9kZXNjcmlwdG9yOworCXN0cnVjdCBldGhfdHhfZGVzYyAqZmlyc3RfZGVzY3JpcHRvcjsKKwl1MzIgY29tbWFuZDsKKworCS8qIERvIG5vdCBwcm9jZXNzIFR4IHJpbmcgaW4gY2FzZSBvZiBUeCByaW5nIHJlc291cmNlIGVycm9yICovCisJaWYgKG1wLT50eF9yZXNvdXJjZV9lcnIpCisJCXJldHVybiBFVEhfUVVFVUVfRlVMTDsKKworCS8qCisJICogVGhlIGhhcmR3YXJlIHJlcXVpcmVzIHRoYXQgZWFjaCBidWZmZXIgdGhhdCBpcyA8PSA4IGJ5dGVzCisJICogaW4gbGVuZ3RoIG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4IGJ5dGUgYm91bmRhcnkuCisJICovCisJaWYgKHBfcGt0X2luZm8tPmJ5dGVfY250IDw9IDggJiYgcF9wa3RfaW5mby0+YnVmX3B0ciAmIDB4NykgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJtdjY0M3h4X2V0aCBwb3J0ICVkOiBwYWNrZXQgc2l6ZSA8PSA4IHByb2JsZW1cbiIsCisJCQltcC0+cG9ydF9udW0pOworCQlyZXR1cm4gRVRIX0VSUk9SOworCX0KKworCS8qIEdldCB0aGUgVHggRGVzYyByaW5nIGluZGV4ZXMgKi8KKwl0eF9kZXNjX2N1cnIgPSBtcC0+dHhfY3Vycl9kZXNjX3E7CisJdHhfZGVzY191c2VkID0gbXAtPnR4X3VzZWRfZGVzY19xOworCisJY3VycmVudF9kZXNjcmlwdG9yID0gJm1wLT5wX3R4X2Rlc2NfYXJlYVt0eF9kZXNjX2N1cnJdOworCisJdHhfbmV4dF9kZXNjID0gKHR4X2Rlc2NfY3VyciArIDEpICUgbXAtPnR4X3Jpbmdfc2l6ZTsKKworCWN1cnJlbnRfZGVzY3JpcHRvci0+YnVmX3B0ciA9IHBfcGt0X2luZm8tPmJ1Zl9wdHI7CisJY3VycmVudF9kZXNjcmlwdG9yLT5ieXRlX2NudCA9IHBfcGt0X2luZm8tPmJ5dGVfY250OworCWN1cnJlbnRfZGVzY3JpcHRvci0+bDRpX2NoayA9IHBfcGt0X2luZm8tPmw0aV9jaGs7CisJbXAtPnR4X3NrYlt0eF9kZXNjX2N1cnJdID0gcF9wa3RfaW5mby0+cmV0dXJuX2luZm87CisKKwljb21tYW5kID0gcF9wa3RfaW5mby0+Y21kX3N0cyB8IEVUSF9aRVJPX1BBRERJTkcgfCBFVEhfR0VOX0NSQyB8CisJCQkJCQkJRVRIX0JVRkZFUl9PV05FRF9CWV9ETUE7CisJaWYgKGNvbW1hbmQgJiBFVEhfVFhfRklSU1RfREVTQykgeworCQl0eF9maXJzdF9kZXNjID0gdHhfZGVzY19jdXJyOworCQltcC0+dHhfZmlyc3RfZGVzY19xID0gdHhfZmlyc3RfZGVzYzsKKwkJZmlyc3RfZGVzY3JpcHRvciA9IGN1cnJlbnRfZGVzY3JpcHRvcjsKKwkJbXAtPnR4X2ZpcnN0X2NvbW1hbmQgPSBjb21tYW5kOworCX0gZWxzZSB7CisJCXR4X2ZpcnN0X2Rlc2MgPSBtcC0+dHhfZmlyc3RfZGVzY19xOworCQlmaXJzdF9kZXNjcmlwdG9yID0gJm1wLT5wX3R4X2Rlc2NfYXJlYVt0eF9maXJzdF9kZXNjXTsKKwkJQlVHX09OKGZpcnN0X2Rlc2NyaXB0b3IgPT0gTlVMTCk7CisJCWN1cnJlbnRfZGVzY3JpcHRvci0+Y21kX3N0cyA9IGNvbW1hbmQ7CisJfQorCisJaWYgKGNvbW1hbmQgJiBFVEhfVFhfTEFTVF9ERVNDKSB7CisJCXdtYigpOworCQlmaXJzdF9kZXNjcmlwdG9yLT5jbWRfc3RzID0gbXAtPnR4X2ZpcnN0X2NvbW1hbmQ7CisKKwkJd21iKCk7CisJCUVUSF9FTkFCTEVfVFhfUVVFVUUobXAtPnBvcnRfbnVtKTsKKworCQkvKgorCQkgKiBGaW5pc2ggVHggcGFja2V0LiBVcGRhdGUgZmlyc3QgZGVzYyBpbiBjYXNlIG9mIFR4IHJlc291cmNlCisJCSAqIGVycm9yICovCisJCXR4X2ZpcnN0X2Rlc2MgPSB0eF9uZXh0X2Rlc2M7CisJCW1wLT50eF9maXJzdF9kZXNjX3EgPSB0eF9maXJzdF9kZXNjOworCX0KKworCS8qIENoZWNrIGZvciByaW5nIGluZGV4IG92ZXJsYXAgaW4gdGhlIFR4IGRlc2MgcmluZyAqLworCWlmICh0eF9uZXh0X2Rlc2MgPT0gdHhfZGVzY191c2VkKSB7CisJCW1wLT50eF9yZXNvdXJjZV9lcnIgPSAxOworCQltcC0+dHhfY3Vycl9kZXNjX3EgPSB0eF9maXJzdF9kZXNjOworCisJCXJldHVybiBFVEhfUVVFVUVfTEFTVF9SRVNPVVJDRTsKKwl9CisKKwltcC0+dHhfY3Vycl9kZXNjX3EgPSB0eF9uZXh0X2Rlc2M7CisKKwlyZXR1cm4gRVRIX09LOworfQorI2Vsc2UKK3N0YXRpYyBFVEhfRlVOQ19SRVRfU1RBVFVTIGV0aF9wb3J0X3NlbmQoc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAsCisJCQkJCSBzdHJ1Y3QgcGt0X2luZm8gKnBfcGt0X2luZm8pCit7CisJaW50IHR4X2Rlc2NfY3VycjsKKwlpbnQgdHhfZGVzY191c2VkOworCXN0cnVjdCBldGhfdHhfZGVzYyAqY3VycmVudF9kZXNjcmlwdG9yOworCXVuc2lnbmVkIGludCBjb21tYW5kX3N0YXR1czsKKworCS8qIERvIG5vdCBwcm9jZXNzIFR4IHJpbmcgaW4gY2FzZSBvZiBUeCByaW5nIHJlc291cmNlIGVycm9yICovCisJaWYgKG1wLT50eF9yZXNvdXJjZV9lcnIpCisJCXJldHVybiBFVEhfUVVFVUVfRlVMTDsKKworCS8qIEdldCB0aGUgVHggRGVzYyByaW5nIGluZGV4ZXMgKi8KKwl0eF9kZXNjX2N1cnIgPSBtcC0+dHhfY3Vycl9kZXNjX3E7CisJdHhfZGVzY191c2VkID0gbXAtPnR4X3VzZWRfZGVzY19xOworCWN1cnJlbnRfZGVzY3JpcHRvciA9ICZtcC0+cF90eF9kZXNjX2FyZWFbdHhfZGVzY19jdXJyXTsKKworCWNvbW1hbmRfc3RhdHVzID0gcF9wa3RfaW5mby0+Y21kX3N0cyB8IEVUSF9aRVJPX1BBRERJTkcgfCBFVEhfR0VOX0NSQzsKKwljdXJyZW50X2Rlc2NyaXB0b3ItPmJ1Zl9wdHIgPSBwX3BrdF9pbmZvLT5idWZfcHRyOworCWN1cnJlbnRfZGVzY3JpcHRvci0+Ynl0ZV9jbnQgPSBwX3BrdF9pbmZvLT5ieXRlX2NudDsKKwltcC0+dHhfc2tiW3R4X2Rlc2NfY3Vycl0gPSBwX3BrdF9pbmZvLT5yZXR1cm5faW5mbzsKKworCS8qIFNldCBsYXN0IGRlc2Mgd2l0aCBETUEgb3duZXJzaGlwIGFuZCBpbnRlcnJ1cHQgZW5hYmxlLiAqLworCXdtYigpOworCWN1cnJlbnRfZGVzY3JpcHRvci0+Y21kX3N0cyA9IGNvbW1hbmRfc3RhdHVzIHwKKwkJCUVUSF9CVUZGRVJfT1dORURfQllfRE1BIHwgRVRIX1RYX0VOQUJMRV9JTlRFUlJVUFQ7CisKKwl3bWIoKTsKKwlFVEhfRU5BQkxFX1RYX1FVRVVFKG1wLT5wb3J0X251bSk7CisKKwkvKiBGaW5pc2ggVHggcGFja2V0LiBVcGRhdGUgZmlyc3QgZGVzYyBpbiBjYXNlIG9mIFR4IHJlc291cmNlIGVycm9yICovCisJdHhfZGVzY19jdXJyID0gKHR4X2Rlc2NfY3VyciArIDEpICUgbXAtPnR4X3Jpbmdfc2l6ZTsKKworCS8qIFVwZGF0ZSB0aGUgY3VycmVudCBkZXNjcmlwdG9yICovCisJbXAtPnR4X2N1cnJfZGVzY19xID0gdHhfZGVzY19jdXJyOworCisJLyogQ2hlY2sgZm9yIHJpbmcgaW5kZXggb3ZlcmxhcCBpbiB0aGUgVHggZGVzYyByaW5nICovCisJaWYgKHR4X2Rlc2NfY3VyciA9PSB0eF9kZXNjX3VzZWQpIHsKKwkJbXAtPnR4X3Jlc291cmNlX2VyciA9IDE7CisJCXJldHVybiBFVEhfUVVFVUVfTEFTVF9SRVNPVVJDRTsKKwl9CisKKwlyZXR1cm4gRVRIX09LOworfQorI2VuZGlmCisKKy8qCisgKiBldGhfdHhfcmV0dXJuX2Rlc2MgLSBGcmVlIGFsbCB1c2VkIFR4IGRlc2NyaXB0b3JzCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0IGluZm9ybWF0aW9uIHRvIHRoZSBjYWxsZXIuCisgKglJdCB1c2VzIHRoZSAnZmlyc3QnIGluZGV4IHRvIHN1cHBvcnQgVHggZGVzYyByZXR1cm4gaW4gY2FzZSBhIHRyYW5zbWl0CisgKglvZiBhIHBhY2tldCBzcGFubmVkIG92ZXIgbXVsdGlwbGUgYnVmZmVyIHN0aWxsIGluIHByb2Nlc3MuCisgKglJbiBjYXNlIHRoZSBUeCBxdWV1ZSB3YXMgaW4gInJlc291cmNlIGVycm9yIiBjb25kaXRpb24sIHdoZXJlIHRoZXJlIGFyZQorICoJbm8gYXZhaWxhYmxlIFR4IHJlc291cmNlcywgdGhlIGZ1bmN0aW9uIHJlc2V0cyB0aGUgcmVzb3VyY2UgZXJyb3IgZmxhZy4KKyAqCisgKiBJTlBVVDoKKyAqCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUJKm1wCQlFdGhlcm5ldCBQb3J0IENvbnRyb2wgc3J0dWN0LgorICoJc3RydWN0IHBrdF9pbmZvCQkqcF9wa3RfaW5mbwlVc2VyIHBhY2tldCBidWZmZXIuCisgKgorICogT1VUUFVUOgorICoJVHggcmluZyAnZmlyc3QnIGFuZCAndXNlZCcgaW5kZXhlcyBhcmUgdXBkYXRlZC4KKyAqCisgKiBSRVRVUk46CisgKglFVEhfRVJST1IgaW4gY2FzZSB0aGUgcm91dGluZSBjYW4gbm90IGFjY2VzcyBUeCBkZXNjIHJpbmcuCisgKglFVEhfUkVUUlkgaW4gY2FzZSB0aGVyZSBpcyB0cmFuc21pc3Npb24gaW4gcHJvY2Vzcy4KKyAqCUVUSF9FTkRfT0ZfSk9CIGlmIHRoZSByb3V0aW5lIGhhcyBub3RoaW5nIHRvIHJlbGVhc2UuCisgKglFVEhfT0sgb3RoZXJ3aXNlLgorICoKKyAqLworc3RhdGljIEVUSF9GVU5DX1JFVF9TVEFUVVMgZXRoX3R4X3JldHVybl9kZXNjKHN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wLAorCQkJCQkJc3RydWN0IHBrdF9pbmZvICpwX3BrdF9pbmZvKQoreworCWludCB0eF9kZXNjX3VzZWQ7CisjaWZkZWYgTVY2NDNYWF9DSEVDS1NVTV9PRkZMT0FEX1RYCisJaW50IHR4X2J1c3lfZGVzYyA9IG1wLT50eF9maXJzdF9kZXNjX3E7CisjZWxzZQorCWludCB0eF9idXN5X2Rlc2MgPSBtcC0+dHhfY3Vycl9kZXNjX3E7CisjZW5kaWYKKwlzdHJ1Y3QgZXRoX3R4X2Rlc2MgKnBfdHhfZGVzY191c2VkOworCXVuc2lnbmVkIGludCBjb21tYW5kX3N0YXR1czsKKworCS8qIEdldCB0aGUgVHggRGVzYyByaW5nIGluZGV4ZXMgKi8KKwl0eF9kZXNjX3VzZWQgPSBtcC0+dHhfdXNlZF9kZXNjX3E7CisKKwlwX3R4X2Rlc2NfdXNlZCA9ICZtcC0+cF90eF9kZXNjX2FyZWFbdHhfZGVzY191c2VkXTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChwX3R4X2Rlc2NfdXNlZCA9PSBOVUxMKQorCQlyZXR1cm4gRVRIX0VSUk9SOworCisJLyogU3RvcCByZWxlYXNlLiBBYm91dCB0byBvdmVybGFwIHRoZSBjdXJyZW50IGF2YWlsYWJsZSBUeCBkZXNjcmlwdG9yICovCisJaWYgKHR4X2Rlc2NfdXNlZCA9PSB0eF9idXN5X2Rlc2MgJiYgIW1wLT50eF9yZXNvdXJjZV9lcnIpCisJCXJldHVybiBFVEhfRU5EX09GX0pPQjsKKworCWNvbW1hbmRfc3RhdHVzID0gcF90eF9kZXNjX3VzZWQtPmNtZF9zdHM7CisKKwkvKiBTdGlsbCB0cmFuc21pdHRpbmcuLi4gKi8KKwlpZiAoY29tbWFuZF9zdGF0dXMgJiAoRVRIX0JVRkZFUl9PV05FRF9CWV9ETUEpKQorCQlyZXR1cm4gRVRIX1JFVFJZOworCisJLyogUGFzcyB0aGUgcGFja2V0IGluZm9ybWF0aW9uIHRvIHRoZSBjYWxsZXIgKi8KKwlwX3BrdF9pbmZvLT5jbWRfc3RzID0gY29tbWFuZF9zdGF0dXM7CisJcF9wa3RfaW5mby0+cmV0dXJuX2luZm8gPSBtcC0+dHhfc2tiW3R4X2Rlc2NfdXNlZF07CisJbXAtPnR4X3NrYlt0eF9kZXNjX3VzZWRdID0gTlVMTDsKKworCS8qIFVwZGF0ZSB0aGUgbmV4dCBkZXNjcmlwdG9yIHRvIHJlbGVhc2UuICovCisJbXAtPnR4X3VzZWRfZGVzY19xID0gKHR4X2Rlc2NfdXNlZCArIDEpICUgbXAtPnR4X3Jpbmdfc2l6ZTsKKworCS8qIEFueSBUeCByZXR1cm4gY2FuY2VscyB0aGUgVHggcmVzb3VyY2UgZXJyb3Igc3RhdHVzICovCisJbXAtPnR4X3Jlc291cmNlX2VyciA9IDA7CisKKwlyZXR1cm4gRVRIX09LOworfQorCisvKgorICogZXRoX3BvcnRfcmVjZWl2ZSAtIEdldCByZWNlaXZlZCBpbmZvcm1hdGlvbiBmcm9tIFJ4IHJpbmcuCisgKgorICogREVTQ1JJUFRJT046CisgKiAJVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIHJlY2VpdmVkIGRhdGEgdG8gdGhlIGNhbGxlci4gVGhlcmUgaXMgbm8KKyAqCWRhdGEgY29weWluZyBkdXJpbmcgcm91dGluZSBvcGVyYXRpb24uIEFsbCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZAorICoJdXNpbmcgcG9pbnRlciB0byBwYWNrZXQgaW5mb3JtYXRpb24gc3RydWN0IHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIuCisgKglJZiB0aGUgcm91dGluZSBleGhhdXN0cyBSeCByaW5nIHJlc291cmNlcyB0aGVuIHRoZSByZXNvdXJjZSBlcnJvciBmbGFnCisgKglpcyBzZXQuCisgKgorICogSU5QVVQ6CisgKglzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlCSptcAkJRXRoZXJuZXQgUG9ydCBDb250cm9sIHNydHVjdC4KKyAqCXN0cnVjdCBwa3RfaW5mbwkJKnBfcGt0X2luZm8JVXNlciBwYWNrZXQgYnVmZmVyLgorICoKKyAqIE9VVFBVVDoKKyAqCVJ4IHJpbmcgY3VycmVudCBhbmQgdXNlZCBpbmRleGVzIGFyZSB1cGRhdGVkLgorICoKKyAqIFJFVFVSTjoKKyAqCUVUSF9FUlJPUiBpbiBjYXNlIHRoZSByb3V0aW5lIGNhbiBub3QgYWNjZXNzIFJ4IGRlc2MgcmluZy4KKyAqCUVUSF9RVUVVRV9GVUxMIGlmIFJ4IHJpbmcgcmVzb3VyY2VzIGFyZSBleGhhdXN0ZWQuCisgKglFVEhfRU5EX09GX0pPQiBpZiB0aGVyZSBpcyBubyByZWNlaXZlZCBkYXRhLgorICoJRVRIX09LIG90aGVyd2lzZS4KKyAqLworc3RhdGljIEVUSF9GVU5DX1JFVF9TVEFUVVMgZXRoX3BvcnRfcmVjZWl2ZShzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCwKKwkJCQkJCXN0cnVjdCBwa3RfaW5mbyAqcF9wa3RfaW5mbykKK3sKKwlpbnQgcnhfbmV4dF9jdXJyX2Rlc2MsIHJ4X2N1cnJfZGVzYywgcnhfdXNlZF9kZXNjOworCXZvbGF0aWxlIHN0cnVjdCBldGhfcnhfZGVzYyAqcF9yeF9kZXNjOworCXVuc2lnbmVkIGludCBjb21tYW5kX3N0YXR1czsKKworCS8qIERvIG5vdCBwcm9jZXNzIFJ4IHJpbmcgaW4gY2FzZSBvZiBSeCByaW5nIHJlc291cmNlIGVycm9yICovCisJaWYgKG1wLT5yeF9yZXNvdXJjZV9lcnIpCisJCXJldHVybiBFVEhfUVVFVUVfRlVMTDsKKworCS8qIEdldCB0aGUgUnggRGVzYyByaW5nICdjdXJyIGFuZCAndXNlZCcgaW5kZXhlcyAqLworCXJ4X2N1cnJfZGVzYyA9IG1wLT5yeF9jdXJyX2Rlc2NfcTsKKwlyeF91c2VkX2Rlc2MgPSBtcC0+cnhfdXNlZF9kZXNjX3E7CisKKwlwX3J4X2Rlc2MgPSAmbXAtPnBfcnhfZGVzY19hcmVhW3J4X2N1cnJfZGVzY107CisKKwkvKiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQgdG8gc2F2ZSByZWFkaW5ncyBmcm9tIG1lbW9yeSAqLworCWNvbW1hbmRfc3RhdHVzID0gcF9yeF9kZXNjLT5jbWRfc3RzOworCXJtYigpOworCisJLyogTm90aGluZyB0byByZWNlaXZlLi4uICovCisJaWYgKGNvbW1hbmRfc3RhdHVzICYgKEVUSF9CVUZGRVJfT1dORURfQllfRE1BKSkKKwkJcmV0dXJuIEVUSF9FTkRfT0ZfSk9COworCisJcF9wa3RfaW5mby0+Ynl0ZV9jbnQgPSAocF9yeF9kZXNjLT5ieXRlX2NudCkgLSBSWF9CVUZfT0ZGU0VUOworCXBfcGt0X2luZm8tPmNtZF9zdHMgPSBjb21tYW5kX3N0YXR1czsKKwlwX3BrdF9pbmZvLT5idWZfcHRyID0gKHBfcnhfZGVzYy0+YnVmX3B0cikgKyBSWF9CVUZfT0ZGU0VUOworCXBfcGt0X2luZm8tPnJldHVybl9pbmZvID0gbXAtPnJ4X3NrYltyeF9jdXJyX2Rlc2NdOworCXBfcGt0X2luZm8tPmw0aV9jaGsgPSBwX3J4X2Rlc2MtPmJ1Zl9zaXplOworCisJLyogQ2xlYW4gdGhlIHJldHVybiBpbmZvIGZpZWxkIHRvIGluZGljYXRlIHRoYXQgdGhlIHBhY2tldCBoYXMgYmVlbiAqLworCS8qIG1vdmVkIHRvIHRoZSB1cHBlciBsYXllcnMJCQkJCSAgICAqLworCW1wLT5yeF9za2JbcnhfY3Vycl9kZXNjXSA9IE5VTEw7CisKKwkvKiBVcGRhdGUgY3VycmVudCBpbmRleCBpbiBkYXRhIHN0cnVjdHVyZSAqLworCXJ4X25leHRfY3Vycl9kZXNjID0gKHJ4X2N1cnJfZGVzYyArIDEpICUgbXAtPnJ4X3Jpbmdfc2l6ZTsKKwltcC0+cnhfY3Vycl9kZXNjX3EgPSByeF9uZXh0X2N1cnJfZGVzYzsKKworCS8qIFJ4IGRlc2NyaXB0b3JzIGV4aGF1c3RlZC4gU2V0IHRoZSBSeCByaW5nIHJlc291cmNlIGVycm9yIGZsYWcgKi8KKwlpZiAocnhfbmV4dF9jdXJyX2Rlc2MgPT0gcnhfdXNlZF9kZXNjKQorCQltcC0+cnhfcmVzb3VyY2VfZXJyID0gMTsKKworCXJldHVybiBFVEhfT0s7Cit9CisKKy8qCisgKiBldGhfcnhfcmV0dXJuX2J1ZmYgLSBSZXR1cm5zIGEgUnggYnVmZmVyIGJhY2sgdG8gdGhlIFJ4IHJpbmcuCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIHJvdXRpbmUgcmV0dXJucyBhIFJ4IGJ1ZmZlciBiYWNrIHRvIHRoZSBSeCByaW5nLiBJdCByZXRyaWV2ZXMgdGhlCisgKgluZXh0ICd1c2VkJyBkZXNjcmlwdG9yIGFuZCBhdHRhY2hlZCB0aGUgcmV0dXJuZWQgYnVmZmVyIHRvIGl0LgorICoJSW4gY2FzZSB0aGUgUnggcmluZyB3YXMgaW4gInJlc291cmNlIGVycm9yIiBjb25kaXRpb24sIHdoZXJlIHRoZXJlIGFyZQorICoJbm8gYXZhaWxhYmxlIFJ4IHJlc291cmNlcywgdGhlIGZ1bmN0aW9uIHJlc2V0cyB0aGUgcmVzb3VyY2UgZXJyb3IgZmxhZy4KKyAqCisgKiBJTlBVVDoKKyAqCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUJKm1wCQlFdGhlcm5ldCBQb3J0IENvbnRyb2wgc3J0dWN0LgorICoJc3RydWN0IHBrdF9pbmZvCQkqcF9wa3RfaW5mbwlJbmZvcm1hdGlvbiBvbiByZXR1cm5lZCBidWZmZXIuCisgKgorICogT1VUUFVUOgorICoJTmV3IGF2YWlsYWJsZSBSeCByZXNvdXJjZSBpbiBSeCBkZXNjcmlwdG9yIHJpbmcuCisgKgorICogUkVUVVJOOgorICoJRVRIX0VSUk9SIGluIGNhc2UgdGhlIHJvdXRpbmUgY2FuIG5vdCBhY2Nlc3MgUnggZGVzYyByaW5nLgorICoJRVRIX09LIG90aGVyd2lzZS4KKyAqLworc3RhdGljIEVUSF9GVU5DX1JFVF9TVEFUVVMgZXRoX3J4X3JldHVybl9idWZmKHN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wLAorCQkJCQkJc3RydWN0IHBrdF9pbmZvICpwX3BrdF9pbmZvKQoreworCWludCB1c2VkX3J4X2Rlc2M7CS8qIFdoZXJlIHRvIHJldHVybiBSeCByZXNvdXJjZSAqLworCXZvbGF0aWxlIHN0cnVjdCBldGhfcnhfZGVzYyAqcF91c2VkX3J4X2Rlc2M7CisKKwkvKiBHZXQgJ3VzZWQnIFJ4IGRlc2NyaXB0b3IgKi8KKwl1c2VkX3J4X2Rlc2MgPSBtcC0+cnhfdXNlZF9kZXNjX3E7CisJcF91c2VkX3J4X2Rlc2MgPSAmbXAtPnBfcnhfZGVzY19hcmVhW3VzZWRfcnhfZGVzY107CisKKwlwX3VzZWRfcnhfZGVzYy0+YnVmX3B0ciA9IHBfcGt0X2luZm8tPmJ1Zl9wdHI7CisJcF91c2VkX3J4X2Rlc2MtPmJ1Zl9zaXplID0gcF9wa3RfaW5mby0+Ynl0ZV9jbnQ7CisJbXAtPnJ4X3NrYlt1c2VkX3J4X2Rlc2NdID0gcF9wa3RfaW5mby0+cmV0dXJuX2luZm87CisKKwkvKiBGbHVzaCB0aGUgd3JpdGUgcGlwZSAqLworCisJLyogUmV0dXJuIHRoZSBkZXNjcmlwdG9yIHRvIERNQSBvd25lcnNoaXAgKi8KKwl3bWIoKTsKKwlwX3VzZWRfcnhfZGVzYy0+Y21kX3N0cyA9CisJCQlFVEhfQlVGRkVSX09XTkVEX0JZX0RNQSB8IEVUSF9SWF9FTkFCTEVfSU5URVJSVVBUOworCXdtYigpOworCisJLyogTW92ZSB0aGUgdXNlZCBkZXNjcmlwdG9yIHBvaW50ZXIgdG8gdGhlIG5leHQgZGVzY3JpcHRvciAqLworCW1wLT5yeF91c2VkX2Rlc2NfcSA9ICh1c2VkX3J4X2Rlc2MgKyAxKSAlIG1wLT5yeF9yaW5nX3NpemU7CisKKwkvKiBBbnkgUnggcmV0dXJuIGNhbmNlbHMgdGhlIFJ4IHJlc291cmNlIGVycm9yIHN0YXR1cyAqLworCW1wLT5yeF9yZXNvdXJjZV9lcnIgPSAwOworCisJcmV0dXJuIEVUSF9PSzsKK30KKworLyoqKioqKioqKioqKiogQmVnaW4gZXRodG9vbCBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBtdjY0M3h4X3N0YXRzIHsKKwljaGFyIHN0YXRfc3RyaW5nW0VUSF9HU1RSSU5HX0xFTl07CisJaW50IHNpemVvZl9zdGF0OworCWludCBzdGF0X29mZnNldDsKK307CisKKyNkZWZpbmUgTVY2NDNYWF9TVEFUKG0pIHNpemVvZigoKHN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKikwKS0+bSksIFwKKwkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IG12NjQzeHhfcHJpdmF0ZSwgbSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjY0M3h4X3N0YXRzIG12NjQzeHhfZ3N0cmluZ3Nfc3RhdHNbXSA9IHsKKwl7ICJyeF9wYWNrZXRzIiwgTVY2NDNYWF9TVEFUKHN0YXRzLnJ4X3BhY2tldHMpIH0sCisJeyAidHhfcGFja2V0cyIsIE1WNjQzWFhfU1RBVChzdGF0cy50eF9wYWNrZXRzKSB9LAorCXsgInJ4X2J5dGVzIiwgTVY2NDNYWF9TVEFUKHN0YXRzLnJ4X2J5dGVzKSB9LAorCXsgInR4X2J5dGVzIiwgTVY2NDNYWF9TVEFUKHN0YXRzLnR4X2J5dGVzKSB9LAorCXsgInJ4X2Vycm9ycyIsIE1WNjQzWFhfU1RBVChzdGF0cy5yeF9lcnJvcnMpIH0sCisJeyAidHhfZXJyb3JzIiwgTVY2NDNYWF9TVEFUKHN0YXRzLnR4X2Vycm9ycykgfSwKKwl7ICJyeF9kcm9wcGVkIiwgTVY2NDNYWF9TVEFUKHN0YXRzLnJ4X2Ryb3BwZWQpIH0sCisJeyAidHhfZHJvcHBlZCIsIE1WNjQzWFhfU1RBVChzdGF0cy50eF9kcm9wcGVkKSB9LAorCXsgImdvb2Rfb2N0ZXRzX3JlY2VpdmVkIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5nb29kX29jdGV0c19yZWNlaXZlZCkgfSwKKwl7ICJiYWRfb2N0ZXRzX3JlY2VpdmVkIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5iYWRfb2N0ZXRzX3JlY2VpdmVkKSB9LAorCXsgImludGVybmFsX21hY190cmFuc21pdF9lcnIiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLmludGVybmFsX21hY190cmFuc21pdF9lcnIpIH0sCisJeyAiZ29vZF9mcmFtZXNfcmVjZWl2ZWQiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLmdvb2RfZnJhbWVzX3JlY2VpdmVkKSB9LAorCXsgImJhZF9mcmFtZXNfcmVjZWl2ZWQiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLmJhZF9mcmFtZXNfcmVjZWl2ZWQpIH0sCisJeyAiYnJvYWRjYXN0X2ZyYW1lc19yZWNlaXZlZCIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuYnJvYWRjYXN0X2ZyYW1lc19yZWNlaXZlZCkgfSwKKwl7ICJtdWx0aWNhc3RfZnJhbWVzX3JlY2VpdmVkIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5tdWx0aWNhc3RfZnJhbWVzX3JlY2VpdmVkKSB9LAorCXsgImZyYW1lc182NF9vY3RldHMiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLmZyYW1lc182NF9vY3RldHMpIH0sCisJeyAiZnJhbWVzXzY1X3RvXzEyN19vY3RldHMiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLmZyYW1lc182NV90b18xMjdfb2N0ZXRzKSB9LAorCXsgImZyYW1lc18xMjhfdG9fMjU1X29jdGV0cyIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuZnJhbWVzXzEyOF90b18yNTVfb2N0ZXRzKSB9LAorCXsgImZyYW1lc18yNTZfdG9fNTExX29jdGV0cyIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuZnJhbWVzXzI1Nl90b181MTFfb2N0ZXRzKSB9LAorCXsgImZyYW1lc181MTJfdG9fMTAyM19vY3RldHMiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLmZyYW1lc181MTJfdG9fMTAyM19vY3RldHMpIH0sCisJeyAiZnJhbWVzXzEwMjRfdG9fbWF4X29jdGV0cyIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuZnJhbWVzXzEwMjRfdG9fbWF4X29jdGV0cykgfSwKKwl7ICJnb29kX29jdGV0c19zZW50IiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5nb29kX29jdGV0c19zZW50KSB9LAorCXsgImdvb2RfZnJhbWVzX3NlbnQiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLmdvb2RfZnJhbWVzX3NlbnQpIH0sCisJeyAiZXhjZXNzaXZlX2NvbGxpc2lvbiIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuZXhjZXNzaXZlX2NvbGxpc2lvbikgfSwKKwl7ICJtdWx0aWNhc3RfZnJhbWVzX3NlbnQiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLm11bHRpY2FzdF9mcmFtZXNfc2VudCkgfSwKKwl7ICJicm9hZGNhc3RfZnJhbWVzX3NlbnQiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLmJyb2FkY2FzdF9mcmFtZXNfc2VudCkgfSwKKwl7ICJ1bnJlY19tYWNfY29udHJvbF9yZWNlaXZlZCIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMudW5yZWNfbWFjX2NvbnRyb2xfcmVjZWl2ZWQpIH0sCisJeyAiZmNfc2VudCIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuZmNfc2VudCkgfSwKKwl7ICJnb29kX2ZjX3JlY2VpdmVkIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5nb29kX2ZjX3JlY2VpdmVkKSB9LAorCXsgImJhZF9mY19yZWNlaXZlZCIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuYmFkX2ZjX3JlY2VpdmVkKSB9LAorCXsgInVuZGVyc2l6ZV9yZWNlaXZlZCIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMudW5kZXJzaXplX3JlY2VpdmVkKSB9LAorCXsgImZyYWdtZW50c19yZWNlaXZlZCIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuZnJhZ21lbnRzX3JlY2VpdmVkKSB9LAorCXsgIm92ZXJzaXplX3JlY2VpdmVkIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5vdmVyc2l6ZV9yZWNlaXZlZCkgfSwKKwl7ICJqYWJiZXJfcmVjZWl2ZWQiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLmphYmJlcl9yZWNlaXZlZCkgfSwKKwl7ICJtYWNfcmVjZWl2ZV9lcnJvciIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMubWFjX3JlY2VpdmVfZXJyb3IpIH0sCisJeyAiYmFkX2NyY19ldmVudCIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuYmFkX2NyY19ldmVudCkgfSwKKwl7ICJjb2xsaXNpb24iLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLmNvbGxpc2lvbikgfSwKKwl7ICJsYXRlX2NvbGxpc2lvbiIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMubGF0ZV9jb2xsaXNpb24pIH0sCit9OworCisjZGVmaW5lIE1WNjQzWFhfU1RBVFNfTEVOCVwKKwlzaXplb2YobXY2NDN4eF9nc3RyaW5nc19zdGF0cykgLyBzaXplb2Yoc3RydWN0IG12NjQzeHhfc3RhdHMpCisKK3N0YXRpYyBpbnQKK212NjQzeHhfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldi0+cHJpdjsKKwlpbnQgcG9ydF9udW0gPSBtcC0+cG9ydF9udW07CisJaW50IGF1dG9uZWcgPSBldGhfcG9ydF9hdXRvbmVnX3N1cHBvcnRlZChwb3J0X251bSk7CisJaW50IG1vZGVfMTBfYml0OworCWludCBhdXRvX2R1cGxleDsKKwlpbnQgaGFsZl9kdXBsZXggPSAwOworCWludCBmdWxsX2R1cGxleCA9IDA7CisJaW50IGF1dG9fc3BlZWQ7CisJaW50IHNwZWVkXzEwID0gMDsKKwlpbnQgc3BlZWRfMTAwID0gMDsKKwlpbnQgc3BlZWRfMTAwMCA9IDA7CisKKwl1MzIgcGNzID0gbXZfcmVhZChNVjY0M1hYX0VUSF9QT1JUX1NFUklBTF9DT05UUk9MX1JFRyhwb3J0X251bSkpOworCXUzMiBwc3IgPSBtdl9yZWFkKE1WNjQzWFhfRVRIX1BPUlRfU1RBVFVTX1JFRyhwb3J0X251bSkpOworCisJbW9kZV8xMF9iaXQgPSBwc3IgJiBNVjY0M1hYX0VUSF9QT1JUX1NUQVRVU19NT0RFXzEwX0JJVDsKKworCWlmIChtb2RlXzEwX2JpdCkgeworCQllY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfMTBiYXNlVF9IYWxmOworCX0gZWxzZSB7CisJCWVjbWQtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfMTBiYXNlVF9IYWxmCQl8CisJCQkJICAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbAkJfAorCQkJCSAgIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmCQl8CisJCQkJICAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwJCXwKKwkJCQkgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwJCXwKKwkJCQkgICAoYXV0b25lZyA/IFNVUFBPUlRFRF9BdXRvbmVnIDogMCkJfAorCQkJCSAgIFNVUFBPUlRFRF9UUCk7CisKKwkJYXV0b19kdXBsZXggPSAhKHBjcyAmIE1WNjQzWFhfRVRIX0RJU0FCTEVfQVVUT19ORUdfRk9SX0RVUExYKTsKKwkJYXV0b19zcGVlZCA9ICEocGNzICYgTVY2NDNYWF9FVEhfRElTQUJMRV9BVVRPX05FR19TUEVFRF9HTUlJKTsKKworCQllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfVFA7CisKKwkJaWYgKGF1dG9uZWcpIHsKKwkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKKworCQkJaWYgKGF1dG9fZHVwbGV4KSB7CisJCQkJaGFsZl9kdXBsZXggPSAxOworCQkJCWZ1bGxfZHVwbGV4ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBjcyAmIE1WNjQzWFhfRVRIX1NFVF9GVUxMX0RVUExFWF9NT0RFKQorCQkJCQlmdWxsX2R1cGxleCA9IDE7CisJCQkJZWxzZQorCQkJCQloYWxmX2R1cGxleCA9IDE7CisJCQl9CisKKwkJCWlmIChhdXRvX3NwZWVkKSB7CisJCQkJc3BlZWRfMTAgPSAxOworCQkJCXNwZWVkXzEwMCA9IDE7CisJCQkJc3BlZWRfMTAwMCA9IDE7CisJCQl9IGVsc2UgeworCQkJCWlmIChwY3MgJiBNVjY0M1hYX0VUSF9TRVRfR01JSV9TUEVFRF9UT18xMDAwKQorCQkJCQlzcGVlZF8xMDAwID0gMTsKKwkJCQllbHNlIGlmIChwY3MgJiBNVjY0M1hYX0VUSF9TRVRfTUlJX1NQRUVEX1RPXzEwMCkKKwkJCQkJc3BlZWRfMTAwID0gMTsKKwkJCQllbHNlCisJCQkJCXNwZWVkXzEwID0gMTsKKwkJCX0KKworCQkJaWYgKHNwZWVkXzEwICYgaGFsZl9kdXBsZXgpCisJCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGY7CisJCQlpZiAoc3BlZWRfMTAgJiBmdWxsX2R1cGxleCkKKwkJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbDsKKwkJCWlmIChzcGVlZF8xMDAgJiBoYWxmX2R1cGxleCkKKwkJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGY7CisJCQlpZiAoc3BlZWRfMTAwICYgZnVsbF9kdXBsZXgpCisJCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsOworCQkJaWYgKHNwZWVkXzEwMDApCisJCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbDsKKwkJfQorCX0KKworCWVjbWQtPnBvcnQgPSBQT1JUX1RQOworCWVjbWQtPnBoeV9hZGRyZXNzID0gZXRoZXJuZXRfcGh5X2dldChwb3J0X251bSk7CisKKwllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisKKwlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CisJCWlmIChtb2RlXzEwX2JpdCkKKwkJCWVjbWQtPnNwZWVkID0gU1BFRURfMTA7CisJCWVsc2UgeworCQkJaWYgKHBzciAmIE1WNjQzWFhfRVRIX1BPUlRfU1RBVFVTX0dNSUlfMTAwMCkKKwkJCQllY21kLT5zcGVlZCA9IFNQRUVEXzEwMDA7CisJCQllbHNlIGlmIChwc3IgJiBNVjY0M1hYX0VUSF9QT1JUX1NUQVRVU19NSUlfMTAwKQorCQkJCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwOworCQkJZWxzZQorCQkJCWVjbWQtPnNwZWVkID0gU1BFRURfMTA7CisJCX0KKworCQlpZiAocHNyICYgTVY2NDNYWF9FVEhfUE9SVF9TVEFUVVNfRlVMTF9EVVBMRVgpCisJCQllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJZWxzZQorCQkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJfSBlbHNlIHsKKwkJZWNtZC0+c3BlZWQgPSAtMTsKKwkJZWNtZC0+ZHVwbGV4ID0gLTE7CisJfQorCisJZWNtZC0+YXV0b25lZyA9IGF1dG9uZWcgPyBBVVRPTkVHX0VOQUJMRSA6IEFVVE9ORUdfRElTQUJMRTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK212NjQzeHhfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKK3sKKwlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgIG12NjQzeHhfZHJpdmVyX25hbWUsIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPnZlcnNpb24sIG12NjQzeHhfZHJpdmVyX3ZlcnNpb24sIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sICJOL0EiLCAzMik7CisJc3RybmNweShkcnZpbmZvLT5idXNfaW5mbywgIm12NjQzeHgiLCAzMik7CisJZHJ2aW5mby0+bl9zdGF0cyA9IE1WNjQzWFhfU1RBVFNfTEVOOworfQorCitzdGF0aWMgaW50IAorbXY2NDN4eF9nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gTVY2NDNYWF9TVEFUU19MRU47Cit9CisKK3N0YXRpYyB2b2lkIAorbXY2NDN4eF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCAKKwkJc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1aW50NjRfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldi0+cHJpdjsKKwlpbnQgaTsKKworCWV0aF91cGRhdGVfbWliX2NvdW50ZXJzKG1wKTsKKworCWZvcihpID0gMDsgaSA8IE1WNjQzWFhfU1RBVFNfTEVOOyBpKyspIHsKKwkJY2hhciAqcCA9IChjaGFyICopbXArbXY2NDN4eF9nc3RyaW5nc19zdGF0c1tpXS5zdGF0X29mZnNldDsJCisJCWRhdGFbaV0gPSAobXY2NDN4eF9nc3RyaW5nc19zdGF0c1tpXS5zaXplb2Zfc3RhdCA9PSAKKwkJCXNpemVvZih1aW50NjRfdCkpID8gKih1aW50NjRfdCAqKXAgOiAqKHVpbnQzMl90ICopcDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIAorbXY2NDN4eF9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBzdHJpbmdzZXQsIHVpbnQ4X3QgKmRhdGEpCit7CisJaW50IGk7CisKKwlzd2l0Y2goc3RyaW5nc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCWZvciAoaT0wOyBpIDwgTVY2NDNYWF9TVEFUU19MRU47IGkrKykgeworCQkJbWVtY3B5KGRhdGEgKyBpICogRVRIX0dTVFJJTkdfTEVOLCAKKwkJCW12NjQzeHhfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9zdHJpbmcsCisJCQlFVEhfR1NUUklOR19MRU4pOworCQl9CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBtdjY0M3h4X2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MgICAgICAgICAgID0gbXY2NDN4eF9nZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvICAgICAgICAgICAgPSBtdjY0M3h4X2dldF9kcnZpbmZvLAorCS5nZXRfbGluayAgICAgICAgICAgICAgID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3N0cmluZ3MgICAgICAgICAgICA9IG12NjQzeHhfZ2V0X3N0cmluZ3MsCisJLmdldF9zdGF0c19jb3VudCAgICAgICAgPSBtdjY0M3h4X2dldF9zdGF0c19jb3VudCwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMgICAgICA9IG12NjQzeHhfZ2V0X2V0aHRvb2xfc3RhdHMsCit9OworCisvKioqKioqKioqKioqKiBFbmQgZXRodG9vbCBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5oIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2M0ZjhmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguaApAQCAtMCwwICsxLDQzOCBAQAorI2lmbmRlZiBfX01WNjQzWFhfRVRIX0hfXworI2RlZmluZSBfX01WNjQzWFhfRVRIX0hfXworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tdjY0M3h4Lmg+CisKKyNkZWZpbmUJQklUMAkweDAwMDAwMDAxCisjZGVmaW5lCUJJVDEJMHgwMDAwMDAwMgorI2RlZmluZQlCSVQyCTB4MDAwMDAwMDQKKyNkZWZpbmUJQklUMwkweDAwMDAwMDA4CisjZGVmaW5lCUJJVDQJMHgwMDAwMDAxMAorI2RlZmluZQlCSVQ1CTB4MDAwMDAwMjAKKyNkZWZpbmUJQklUNgkweDAwMDAwMDQwCisjZGVmaW5lCUJJVDcJMHgwMDAwMDA4MAorI2RlZmluZQlCSVQ4CTB4MDAwMDAxMDAKKyNkZWZpbmUJQklUOQkweDAwMDAwMjAwCisjZGVmaW5lCUJJVDEwCTB4MDAwMDA0MDAKKyNkZWZpbmUJQklUMTEJMHgwMDAwMDgwMAorI2RlZmluZQlCSVQxMgkweDAwMDAxMDAwCisjZGVmaW5lCUJJVDEzCTB4MDAwMDIwMDAKKyNkZWZpbmUJQklUMTQJMHgwMDAwNDAwMAorI2RlZmluZQlCSVQxNQkweDAwMDA4MDAwCisjZGVmaW5lCUJJVDE2CTB4MDAwMTAwMDAKKyNkZWZpbmUJQklUMTcJMHgwMDAyMDAwMAorI2RlZmluZQlCSVQxOAkweDAwMDQwMDAwCisjZGVmaW5lCUJJVDE5CTB4MDAwODAwMDAKKyNkZWZpbmUJQklUMjAJMHgwMDEwMDAwMAorI2RlZmluZQlCSVQyMQkweDAwMjAwMDAwCisjZGVmaW5lCUJJVDIyCTB4MDA0MDAwMDAKKyNkZWZpbmUJQklUMjMJMHgwMDgwMDAwMAorI2RlZmluZQlCSVQyNAkweDAxMDAwMDAwCisjZGVmaW5lCUJJVDI1CTB4MDIwMDAwMDAKKyNkZWZpbmUJQklUMjYJMHgwNDAwMDAwMAorI2RlZmluZQlCSVQyNwkweDA4MDAwMDAwCisjZGVmaW5lCUJJVDI4CTB4MTAwMDAwMDAKKyNkZWZpbmUJQklUMjkJMHgyMDAwMDAwMAorI2RlZmluZQlCSVQzMAkweDQwMDAwMDAwCisjZGVmaW5lCUJJVDMxCTB4ODAwMDAwMDAKKworLyoKKyAqICBUaGUgZmlyc3QgcGFydCBpcyB0aGUgaGlnaCBsZXZlbCBkcml2ZXIgb2YgdGhlIGdpZ0UgZXRoZXJuZXQgcG9ydHMuCisgKi8KKworLyogQ2hlY2tzdW0gb2ZmbG9hZCBmb3IgVHggd29ya3MgZm9yIG1vc3QgcGFja2V0cywgYnV0CisgKiBmYWlscyBpZiBwcmV2aW91cyBwYWNrZXQgc2VudCBkaWQgbm90IHVzZSBodyBjc3VtCisgKi8KKyN1bmRlZglNVjY0M1hYX0NIRUNLU1VNX09GRkxPQURfVFgKKyNkZWZpbmUJTVY2NDNYWF9OQVBJCisjZGVmaW5lCU1WNjQzWFhfVFhfRkFTVF9SRUZJTEwKKyN1bmRlZglNVjY0M1hYX1JYX1FVRVVFX0ZJTExfT05fVEFTSwkvKiBEb2VzIG5vdCB3b3JrLCB5ZXQgKi8KKyN1bmRlZglNVjY0M1hYX0NPQUwKKworLyoKKyAqIE51bWJlciBvZiBSWCAvIFRYIGRlc2NyaXB0b3JzIG9uIFJYIC8gVFggcmluZ3MuCisgKiBOb3RlIHRoYXQgYWxsb2NhdGluZyBSWCBkZXNjcmlwdG9ycyBpcyBkb25lIGJ5IGFsbG9jYXRpbmcgdGhlIFJYCisgKiByaW5nIEFORCBhIHByZWFsbG9jYXRlZCBSWCBidWZmZXJzIChza2IncykgZm9yIGVhY2ggZGVzY3JpcHRvci4KKyAqIFRoZSBUWCBkZXNjcmlwdG9ycyBvbmx5IGFsbG9jYXRlcyB0aGUgVFggZGVzY3JpcHRvcnMgcmluZywKKyAqIHdpdGggbm8gcHJlIGFsbG9jYXRlZCBUWCBidWZmZXJzIChza2IncyBhcmUgYWxsb2NhdGVkIGJ5IGhpZ2hlciBsYXllcnMuCisgKi8KKworLyogRGVmYXVsdCBUWCByaW5nIHNpemUgaXMgMTAwMCBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBNVjY0M1hYX0RFRkFVTFRfVFhfUVVFVUVfU0laRSAxMDAwCisKKy8qIERlZmF1bHQgUlggcmluZyBzaXplIGlzIDQwMCBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBNVjY0M1hYX0RFRkFVTFRfUlhfUVVFVUVfU0laRSA0MDAKKworI2RlZmluZSBNVjY0M1hYX1RYX0NPQUwgMTAwCisjaWZkZWYgTVY2NDNYWF9DT0FMCisjZGVmaW5lIE1WNjQzWFhfUlhfQ09BTCAxMDAKKyNlbmRpZgorCisvKgorICogVGhlIHNlY29uZCBwYXJ0IGlzIHRoZSBsb3cgbGV2ZWwgZHJpdmVyIG9mIHRoZSBnaWdFIGV0aGVybmV0IHBvcnRzLgorICovCisKKy8qCisgKiBIZWFkZXIgRmlsZSBmb3IgOiBNVi02NDN4eCBuZXR3b3JrIGludGVyZmFjZSBoZWFkZXIKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgbWFjcm9zIHR5cGVkZWZzIGFuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbiBmb3IKKyAqCXRoZSBNYXJ2ZWxsIEdpZyBCaXQgRXRoZXJuZXQgQ29udHJvbGxlci4KKyAqCisgKiBERVBFTkRFTkNJRVM6CisgKglOb25lLgorICoKKyAqLworCisvKiBNQUMgYWNjZXBldC9yZWplY3QgbWFjcm9zICovCisjZGVmaW5lIEFDQ0VQVF9NQUNfQUREUgkJCQkwCisjZGVmaW5lIFJFSkVDVF9NQUNfQUREUgkJCQkxCisKKy8qIEJ1ZmZlciBvZmZzZXQgZnJvbSBidWZmZXIgcG9pbnRlciAqLworI2RlZmluZSBSWF9CVUZfT0ZGU0VUCQkJCTB4MgorCisvKiBHaWdhYml0IEV0aGVybmV0IFVuaXQgR2xvYmFsIFJlZ2lzdGVycyAqLworCisvKiBNSUIgQ291bnRlcnMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRVRIX01JQl9HT09EX09DVEVUU19SRUNFSVZFRF9MT1cJMHgwCisjZGVmaW5lIEVUSF9NSUJfR09PRF9PQ1RFVFNfUkVDRUlWRURfSElHSAkweDQKKyNkZWZpbmUgRVRIX01JQl9CQURfT0NURVRTX1JFQ0VJVkVECQkweDgKKyNkZWZpbmUgRVRIX01JQl9JTlRFUk5BTF9NQUNfVFJBTlNNSVRfRVJSCTB4YworI2RlZmluZSBFVEhfTUlCX0dPT0RfRlJBTUVTX1JFQ0VJVkVECQkweDEwCisjZGVmaW5lIEVUSF9NSUJfQkFEX0ZSQU1FU19SRUNFSVZFRAkJMHgxNAorI2RlZmluZSBFVEhfTUlCX0JST0FEQ0FTVF9GUkFNRVNfUkVDRUlWRUQJMHgxOAorI2RlZmluZSBFVEhfTUlCX01VTFRJQ0FTVF9GUkFNRVNfUkVDRUlWRUQJMHgxYworI2RlZmluZSBFVEhfTUlCX0ZSQU1FU182NF9PQ1RFVFMJCTB4MjAKKyNkZWZpbmUgRVRIX01JQl9GUkFNRVNfNjVfVE9fMTI3X09DVEVUUwkJMHgyNAorI2RlZmluZSBFVEhfTUlCX0ZSQU1FU18xMjhfVE9fMjU1X09DVEVUUwkweDI4CisjZGVmaW5lIEVUSF9NSUJfRlJBTUVTXzI1Nl9UT181MTFfT0NURVRTCTB4MmMKKyNkZWZpbmUgRVRIX01JQl9GUkFNRVNfNTEyX1RPXzEwMjNfT0NURVRTCTB4MzAKKyNkZWZpbmUgRVRIX01JQl9GUkFNRVNfMTAyNF9UT19NQVhfT0NURVRTCTB4MzQKKyNkZWZpbmUgRVRIX01JQl9HT09EX09DVEVUU19TRU5UX0xPVwkJMHgzOAorI2RlZmluZSBFVEhfTUlCX0dPT0RfT0NURVRTX1NFTlRfSElHSAkJMHgzYworI2RlZmluZSBFVEhfTUlCX0dPT0RfRlJBTUVTX1NFTlQJCTB4NDAKKyNkZWZpbmUgRVRIX01JQl9FWENFU1NJVkVfQ09MTElTSU9OCQkweDQ0CisjZGVmaW5lIEVUSF9NSUJfTVVMVElDQVNUX0ZSQU1FU19TRU5UCQkweDQ4CisjZGVmaW5lIEVUSF9NSUJfQlJPQURDQVNUX0ZSQU1FU19TRU5UCQkweDRjCisjZGVmaW5lIEVUSF9NSUJfVU5SRUNfTUFDX0NPTlRST0xfUkVDRUlWRUQJMHg1MAorI2RlZmluZSBFVEhfTUlCX0ZDX1NFTlQJCQkJMHg1NAorI2RlZmluZSBFVEhfTUlCX0dPT0RfRkNfUkVDRUlWRUQJCTB4NTgKKyNkZWZpbmUgRVRIX01JQl9CQURfRkNfUkVDRUlWRUQJCQkweDVjCisjZGVmaW5lIEVUSF9NSUJfVU5ERVJTSVpFX1JFQ0VJVkVECQkweDYwCisjZGVmaW5lIEVUSF9NSUJfRlJBR01FTlRTX1JFQ0VJVkVECQkweDY0CisjZGVmaW5lIEVUSF9NSUJfT1ZFUlNJWkVfUkVDRUlWRUQJCTB4NjgKKyNkZWZpbmUgRVRIX01JQl9KQUJCRVJfUkVDRUlWRUQJCQkweDZjCisjZGVmaW5lIEVUSF9NSUJfTUFDX1JFQ0VJVkVfRVJST1IJCTB4NzAKKyNkZWZpbmUgRVRIX01JQl9CQURfQ1JDX0VWRU5UCQkJMHg3NAorI2RlZmluZSBFVEhfTUlCX0NPTExJU0lPTgkJCTB4NzgKKyNkZWZpbmUgRVRIX01JQl9MQVRFX0NPTExJU0lPTgkJCTB4N2MKKworLyogUG9ydCBzZXJpYWwgc3RhdHVzIHJlZyAoUFNSKSAqLworI2RlZmluZSBFVEhfSU5URVJGQUNFX0dNSUlfTUlJCQkJMAorI2RlZmluZSBFVEhfSU5URVJGQUNFX1BDTQkJCUJJVDAKKyNkZWZpbmUgRVRIX0xJTktfSVNfRE9XTgkJCTAKKyNkZWZpbmUgRVRIX0xJTktfSVNfVVAJCQkJQklUMQorI2RlZmluZSBFVEhfUE9SVF9BVF9IQUxGX0RVUExFWAkJCTAKKyNkZWZpbmUgRVRIX1BPUlRfQVRfRlVMTF9EVVBMRVgJCQlCSVQyCisjZGVmaW5lIEVUSF9SWF9GTE9XX0NUUkxfRElTQUJMRUQJCTAKKyNkZWZpbmUgRVRIX1JYX0ZMT1dfQ1RSTF9FTkJBTEVECQlCSVQzCisjZGVmaW5lIEVUSF9HTUlJX1NQRUVEXzEwMF8xMAkJCTAKKyNkZWZpbmUgRVRIX0dNSUlfU1BFRURfMTAwMAkJCUJJVDQKKyNkZWZpbmUgRVRIX01JSV9TUEVFRF8xMAkJCTAKKyNkZWZpbmUgRVRIX01JSV9TUEVFRF8xMDAJCQlCSVQ1CisjZGVmaW5lIEVUSF9OT19UWAkJCQkwCisjZGVmaW5lIEVUSF9UWF9JTl9QUk9HUkVTUwkJCUJJVDcKKyNkZWZpbmUgRVRIX0JZUEFTU19OT19BQ1RJVkUJCQkwCisjZGVmaW5lIEVUSF9CWVBBU1NfQUNUSVZFCQkJQklUOAorI2RlZmluZSBFVEhfUE9SVF9OT1RfQVRfUEFSVElUSU9OX1NUQVRFCQkwCisjZGVmaW5lIEVUSF9QT1JUX0FUX1BBUlRJVElPTl9TVEFURQkJQklUOQorI2RlZmluZSBFVEhfUE9SVF9UWF9GSUZPX05PVF9FTVBUWQkJMAorI2RlZmluZSBFVEhfUE9SVF9UWF9GSUZPX0VNUFRZCQkJQklUMTAKKworI2RlZmluZSBFVEhfREVGQVVMVF9SWF9CUERVX1FVRVVFXzMJCShCSVQyMyB8IEJJVDIyKQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9CUERVX1FVRVVFXzQJCUJJVDI0CisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfNQkJKEJJVDI0IHwgQklUMjIpCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfNgkJKEJJVDI0IHwgQklUMjMpCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfNwkJKEJJVDI0IHwgQklUMjMgfCBCSVQyMikKKworLyogU01JIHJlZyAqLworI2RlZmluZSBFVEhfU01JX0JVU1kJCUJJVDI4CS8qIDAgLSBXcml0ZSwgMSAtIFJlYWQJCSovCisjZGVmaW5lIEVUSF9TTUlfUkVBRF9WQUxJRAlCSVQyNwkvKiAwIC0gV3JpdGUsIDEgLSBSZWFkCQkqLworI2RlZmluZSBFVEhfU01JX09QQ09ERV9XUklURQkwCS8qIENvbXBsZXRpb24gb2YgUmVhZCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgRVRIX1NNSV9PUENPREVfUkVBRCAJQklUMjYJLyogT3BlcmF0aW9uIGlzIGluIHByb2dyZXNzCSovCisKKy8qIFNETUEgY29tbWFuZCBzdGF0dXMgZmllbGRzIG1hY3JvcyAqLworCisvKiBUeCAmIFJ4IGRlc2NyaXB0b3JzIHN0YXR1cyAqLworI2RlZmluZSBFVEhfRVJST1JfU1VNTUFSWQkJCShCSVQwKQorCisvKiBUeCAmIFJ4IGRlc2NyaXB0b3JzIGNvbW1hbmQgKi8KKyNkZWZpbmUgRVRIX0JVRkZFUl9PV05FRF9CWV9ETUEJCQkoQklUMzEpCisKKy8qIFR4IGRlc2NyaXB0b3JzIHN0YXR1cyAqLworI2RlZmluZSBFVEhfTENfRVJST1IJCQkJKDAgICAgKQorI2RlZmluZSBFVEhfVVJfRVJST1IJCQkJKEJJVDEgKQorI2RlZmluZSBFVEhfUkxfRVJST1IJCQkJKEJJVDIgKQorI2RlZmluZSBFVEhfTExDX1NOQVBfRk9STUFUCQkJKEJJVDkgKQorCisvKiBSeCBkZXNjcmlwdG9ycyBzdGF0dXMgKi8KKyNkZWZpbmUgRVRIX0NSQ19FUlJPUgkJCQkoMCAgICApCisjZGVmaW5lIEVUSF9PVkVSUlVOX0VSUk9SCQkJKEJJVDEgKQorI2RlZmluZSBFVEhfTUFYX0ZSQU1FX0xFTkdUSF9FUlJPUgkJKEJJVDIgKQorI2RlZmluZSBFVEhfUkVTT1VSQ0VfRVJST1IJCQkoKEJJVDIgfCBCSVQxKSkKKyNkZWZpbmUgRVRIX1ZMQU5fVEFHR0VECQkJCShCSVQxOSkKKyNkZWZpbmUgRVRIX0JQRFVfRlJBTUUJCQkJKEJJVDIwKQorI2RlZmluZSBFVEhfVENQX0ZSQU1FX09WRVJfSVBfVl80CQkoMCAgICApCisjZGVmaW5lIEVUSF9VRFBfRlJBTUVfT1ZFUl9JUF9WXzQJCShCSVQyMSkKKyNkZWZpbmUgRVRIX09USEVSX0ZSQU1FX1RZUEUJCQkoQklUMjIpCisjZGVmaW5lIEVUSF9MQVlFUl8yX0lTX0VUSF9WXzIJCQkoQklUMjMpCisjZGVmaW5lIEVUSF9GUkFNRV9UWVBFX0lQX1ZfNAkJCShCSVQyNCkKKyNkZWZpbmUgRVRIX0ZSQU1FX0hFQURFUl9PSwkJCShCSVQyNSkKKyNkZWZpbmUgRVRIX1JYX0xBU1RfREVTQwkJCShCSVQyNikKKyNkZWZpbmUgRVRIX1JYX0ZJUlNUX0RFU0MJCQkoQklUMjcpCisjZGVmaW5lIEVUSF9VTktOT1dOX0RFU1RJTkFUSU9OX0FERFIJCShCSVQyOCkKKyNkZWZpbmUgRVRIX1JYX0VOQUJMRV9JTlRFUlJVUFQJCQkoQklUMjkpCisjZGVmaW5lIEVUSF9MQVlFUl80X0NIRUNLU1VNX09LCQkJKEJJVDMwKQorCisvKiBSeCBkZXNjcmlwdG9ycyBieXRlIGNvdW50ICovCisjZGVmaW5lIEVUSF9GUkFNRV9GUkFHTUVOVEVECQkJKEJJVDIpCisKKy8qIFR4IGRlc2NyaXB0b3JzIGNvbW1hbmQgKi8KKyNkZWZpbmUgRVRIX0xBWUVSXzRfQ0hFQ0tTVU1fRklSU1RfREVTQwkJKEJJVDEwKQorI2RlZmluZSBFVEhfRlJBTUVfU0VUX1RPX1ZMQU4JCQkoQklUMTUpCisjZGVmaW5lIEVUSF9UQ1BfRlJBTUUJCQkJKDAgICAgKQorI2RlZmluZSBFVEhfVURQX0ZSQU1FCQkJCShCSVQxNikKKyNkZWZpbmUgRVRIX0dFTl9UQ1BfVURQX0NIRUNLU1VNCQkoQklUMTcpCisjZGVmaW5lIEVUSF9HRU5fSVBfVl80X0NIRUNLU1VNCQkJKEJJVDE4KQorI2RlZmluZSBFVEhfWkVST19QQURESU5HCQkJKEJJVDE5KQorI2RlZmluZSBFVEhfVFhfTEFTVF9ERVNDCQkJKEJJVDIwKQorI2RlZmluZSBFVEhfVFhfRklSU1RfREVTQwkJCShCSVQyMSkKKyNkZWZpbmUgRVRIX0dFTl9DUkMJCQkJKEJJVDIyKQorI2RlZmluZSBFVEhfVFhfRU5BQkxFX0lOVEVSUlVQVAkJCShCSVQyMykKKyNkZWZpbmUgRVRIX0FVVE9fTU9ERQkJCQkoQklUMzApCisKKy8qIHR5cGVkZWZzICovCisKK3R5cGVkZWYgZW51bSBfZXRoX2Z1bmNfcmV0X3N0YXR1cyB7CisJRVRIX09LLAkJCS8qIFJldHVybmVkIGFzIGV4cGVjdGVkLgkJKi8KKwlFVEhfRVJST1IsCQkvKiBGdW5kYW1lbnRhbCBlcnJvci4JCQkqLworCUVUSF9SRVRSWSwJCS8qIENvdWxkIG5vdCBwcm9jZXNzIHJlcXVlc3QuIFRyeSBsYXRlci4qLworCUVUSF9FTkRfT0ZfSk9CLAkJLyogUmluZyBoYXMgbm90aGluZyB0byBwcm9jZXNzLgkJKi8KKwlFVEhfUVVFVUVfRlVMTCwJCS8qIFJpbmcgcmVzb3VyY2UgZXJyb3IuCQkJKi8KKwlFVEhfUVVFVUVfTEFTVF9SRVNPVVJDRQkvKiBSaW5nIHJlc291cmNlcyBhYm91dCB0byBleGhhdXN0LgkqLworfSBFVEhfRlVOQ19SRVRfU1RBVFVTOworCit0eXBlZGVmIGVudW0gX2V0aF90YXJnZXQgeworCUVUSF9UQVJHRVRfRFJBTSwKKwlFVEhfVEFSR0VUX0RFVklDRSwKKwlFVEhfVEFSR0VUX0NCUywKKwlFVEhfVEFSR0VUX1BDSTAsCisJRVRIX1RBUkdFVF9QQ0kxCit9IEVUSF9UQVJHRVQ7CisKKy8qIFRoZXNlIGFyZSBmb3IgYmlnLWVuZGlhbiBtYWNoaW5lcy4gIExpdHRsZSBlbmRpYW4gbmVlZHMgZGlmZmVyZW50CisgKiBkZWZpbml0aW9ucy4KKyAqLworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorc3RydWN0IGV0aF9yeF9kZXNjIHsKKwl1MTYgYnl0ZV9jbnQ7CQkvKiBEZXNjcmlwdG9yIGJ1ZmZlciBieXRlIGNvdW50CQkqLworCXUxNiBidWZfc2l6ZTsJCS8qIEJ1ZmZlciBzaXplCQkJCSovCisJdTMyIGNtZF9zdHM7CQkvKiBEZXNjcmlwdG9yIGNvbW1hbmQgc3RhdHVzCQkqLworCXUzMiBuZXh0X2Rlc2NfcHRyOwkvKiBOZXh0IGRlc2NyaXB0b3IgcG9pbnRlcgkJKi8KKwl1MzIgYnVmX3B0cjsJCS8qIERlc2NyaXB0b3IgYnVmZmVyIHBvaW50ZXIJCSovCit9OworCitzdHJ1Y3QgZXRoX3R4X2Rlc2MgeworCXUxNiBieXRlX2NudDsJCS8qIGJ1ZmZlciBieXRlIGNvdW50CQkJKi8KKwl1MTYgbDRpX2NoazsJCS8qIENQVSBwcm92aWRlZCBUQ1AgY2hlY2tzdW0JCSovCisJdTMyIGNtZF9zdHM7CQkvKiBDb21tYW5kL3N0YXR1cyBmaWVsZAkJCSovCisJdTMyIG5leHRfZGVzY19wdHI7CS8qIFBvaW50ZXIgdG8gbmV4dCBkZXNjcmlwdG9yCQkqLworCXUzMiBidWZfcHRyOwkJLyogcG9pbnRlciB0byBidWZmZXIgZm9yIHRoaXMgZGVzY3JpcHRvciovCit9OworCisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKK3N0cnVjdCBldGhfcnhfZGVzYyB7CisJdTMyIGNtZF9zdHM7CQkvKiBEZXNjcmlwdG9yIGNvbW1hbmQgc3RhdHVzCQkqLworCXUxNiBidWZfc2l6ZTsJCS8qIEJ1ZmZlciBzaXplCQkJCSovCisJdTE2IGJ5dGVfY250OwkJLyogRGVzY3JpcHRvciBidWZmZXIgYnl0ZSBjb3VudAkJKi8KKwl1MzIgYnVmX3B0cjsJCS8qIERlc2NyaXB0b3IgYnVmZmVyIHBvaW50ZXIJCSovCisJdTMyIG5leHRfZGVzY19wdHI7CS8qIE5leHQgZGVzY3JpcHRvciBwb2ludGVyCQkqLworfTsKKworc3RydWN0IGV0aF90eF9kZXNjIHsKKwl1MzIgY21kX3N0czsJCS8qIENvbW1hbmQvc3RhdHVzIGZpZWxkCQkJKi8KKwl1MTYgbDRpX2NoazsJCS8qIENQVSBwcm92aWRlZCBUQ1AgY2hlY2tzdW0JCSovCisJdTE2IGJ5dGVfY250OwkJLyogYnVmZmVyIGJ5dGUgY291bnQJCQkqLworCXUzMiBidWZfcHRyOwkJLyogcG9pbnRlciB0byBidWZmZXIgZm9yIHRoaXMgZGVzY3JpcHRvciovCisJdTMyIG5leHRfZGVzY19wdHI7CS8qIFBvaW50ZXIgdG8gbmV4dCBkZXNjcmlwdG9yCQkqLworfTsKKyNlbHNlCisjZXJyb3IgT25lIG9mIF9fQklHX0VORElBTiBvciBfX0xJVFRMRV9FTkRJQU4gbXVzdCBiZSBkZWZpbmVkCisjZW5kaWYKKworLyogVW5pZmllZCBzdHJ1Y3QgZm9yIFJ4IGFuZCBUeCBvcGVyYXRpb25zLiBUaGUgdXNlciBpcyBub3QgcmVxdWlyZWQgdG8JKi8KKy8qIGJlIGZhbWlsaWVyIHdpdGggbmVpdGhlciBUeCBub3IgUnggZGVzY3JpcHRvcnMuCQkJKi8KK3N0cnVjdCBwa3RfaW5mbyB7CisJdW5zaWduZWQgc2hvcnQgYnl0ZV9jbnQ7CS8qIERlc2NyaXB0b3IgYnVmZmVyIGJ5dGUgY291bnQJKi8KKwl1bnNpZ25lZCBzaG9ydCBsNGlfY2hrOwkJLyogVHggQ1BVIHByb3ZpZGVkIFRDUCBDaGVja3N1bQkqLworCXVuc2lnbmVkIGludCBjbWRfc3RzOwkJLyogRGVzY3JpcHRvciBjb21tYW5kIHN0YXR1cwkqLworCWRtYV9hZGRyX3QgYnVmX3B0cjsJCS8qIERlc2NyaXB0b3IgYnVmZmVyIHBvaW50ZXIJKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcmV0dXJuX2luZm87CS8qIFVzZXIgcmVzb3VyY2UgcmV0dXJuIGluZm9ybWF0aW9uICovCit9OworCisvKiBFdGhlcm5ldCBwb3J0IHNwZWNpZmljIGluZm9tYXRpb24gKi8KKworc3RydWN0IG12NjQzeHhfbWliX2NvdW50ZXJzIHsKKwl1NjQgZ29vZF9vY3RldHNfcmVjZWl2ZWQ7CisJdTMyIGJhZF9vY3RldHNfcmVjZWl2ZWQ7CisJdTMyIGludGVybmFsX21hY190cmFuc21pdF9lcnI7CisJdTMyIGdvb2RfZnJhbWVzX3JlY2VpdmVkOworCXUzMiBiYWRfZnJhbWVzX3JlY2VpdmVkOworCXUzMiBicm9hZGNhc3RfZnJhbWVzX3JlY2VpdmVkOworCXUzMiBtdWx0aWNhc3RfZnJhbWVzX3JlY2VpdmVkOworCXUzMiBmcmFtZXNfNjRfb2N0ZXRzOworCXUzMiBmcmFtZXNfNjVfdG9fMTI3X29jdGV0czsKKwl1MzIgZnJhbWVzXzEyOF90b18yNTVfb2N0ZXRzOworCXUzMiBmcmFtZXNfMjU2X3RvXzUxMV9vY3RldHM7CisJdTMyIGZyYW1lc181MTJfdG9fMTAyM19vY3RldHM7CisJdTMyIGZyYW1lc18xMDI0X3RvX21heF9vY3RldHM7CisJdTY0IGdvb2Rfb2N0ZXRzX3NlbnQ7CisJdTMyIGdvb2RfZnJhbWVzX3NlbnQ7CisJdTMyIGV4Y2Vzc2l2ZV9jb2xsaXNpb247CisJdTMyIG11bHRpY2FzdF9mcmFtZXNfc2VudDsKKwl1MzIgYnJvYWRjYXN0X2ZyYW1lc19zZW50OworCXUzMiB1bnJlY19tYWNfY29udHJvbF9yZWNlaXZlZDsKKwl1MzIgZmNfc2VudDsKKwl1MzIgZ29vZF9mY19yZWNlaXZlZDsKKwl1MzIgYmFkX2ZjX3JlY2VpdmVkOworCXUzMiB1bmRlcnNpemVfcmVjZWl2ZWQ7CisJdTMyIGZyYWdtZW50c19yZWNlaXZlZDsKKwl1MzIgb3ZlcnNpemVfcmVjZWl2ZWQ7CisJdTMyIGphYmJlcl9yZWNlaXZlZDsKKwl1MzIgbWFjX3JlY2VpdmVfZXJyb3I7CisJdTMyIGJhZF9jcmNfZXZlbnQ7CisJdTMyIGNvbGxpc2lvbjsKKwl1MzIgbGF0ZV9jb2xsaXNpb247Cit9OworCitzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlIHsKKwlpbnQgcG9ydF9udW07CQkJLyogVXNlciBFdGhlcm5ldCBwb3J0IG51bWJlcgkqLworCXU4IHBvcnRfbWFjX2FkZHJbNl07CQkvKiBVc2VyIGRlZmluZWQgcG9ydCBNQUMgYWRkcmVzcy4qLworCXUzMiBwb3J0X2NvbmZpZzsJCS8qIFVzZXIgcG9ydCBjb25maWd1cmF0aW9uIHZhbHVlKi8KKwl1MzIgcG9ydF9jb25maWdfZXh0ZW5kOwkJLyogVXNlciBwb3J0IGNvbmZpZyBleHRlbmQgdmFsdWUqLworCXUzMiBwb3J0X3NkbWFfY29uZmlnOwkJLyogVXNlciBwb3J0IFNETUEgY29uZmlnIHZhbHVlCSovCisJdTMyIHBvcnRfc2VyaWFsX2NvbnRyb2w7CS8qIFVzZXIgcG9ydCBzZXJpYWwgY29udHJvbCB2YWx1ZSAqLworCXUzMiBwb3J0X3R4X3F1ZXVlX2NvbW1hbmQ7CS8qIFBvcnQgYWN0aXZlIFR4IHF1ZXVlcyBzdW1tYXJ5Ki8KKwl1MzIgcG9ydF9yeF9xdWV1ZV9jb21tYW5kOwkvKiBQb3J0IGFjdGl2ZSBSeCBxdWV1ZXMgc3VtbWFyeSovCisKKwl1MzIgcnhfc3JhbV9hZGRyOwkJLyogQmFzZSBhZGRyZXNzIG9mIHJ4IHNyYW0gYXJlYSAqLworCXUzMiByeF9zcmFtX3NpemU7CQkvKiBTaXplIG9mIHJ4IHNyYW0gYXJlYQkJKi8KKwl1MzIgdHhfc3JhbV9hZGRyOwkJLyogQmFzZSBhZGRyZXNzIG9mIHR4IHNyYW0gYXJlYSAqLworCXUzMiB0eF9zcmFtX3NpemU7CQkvKiBTaXplIG9mIHR4IHNyYW0gYXJlYQkJKi8KKworCWludCByeF9yZXNvdXJjZV9lcnI7CQkvKiBSeCByaW5nIHJlc291cmNlIGVycm9yIGZsYWcgKi8KKwlpbnQgdHhfcmVzb3VyY2VfZXJyOwkJLyogVHggcmluZyByZXNvdXJjZSBlcnJvciBmbGFnICovCisKKwkvKiBUeC9SeCByaW5ncyBtYW5hZ21lbnQgaW5kZXhlcyBmaWVsZHMuIEZvciBkcml2ZXIgdXNlICovCisKKwkvKiBOZXh0IGF2YWlsYWJsZSBhbmQgZmlyc3QgcmV0dXJuaW5nIFJ4IHJlc291cmNlICovCisJaW50IHJ4X2N1cnJfZGVzY19xLCByeF91c2VkX2Rlc2NfcTsKKworCS8qIE5leHQgYXZhaWxhYmxlIGFuZCBmaXJzdCByZXR1cm5pbmcgVHggcmVzb3VyY2UgKi8KKwlpbnQgdHhfY3Vycl9kZXNjX3EsIHR4X3VzZWRfZGVzY19xOworI2lmZGVmIE1WNjQzWFhfQ0hFQ0tTVU1fT0ZGTE9BRF9UWAorCWludCB0eF9maXJzdF9kZXNjX3E7CisJdTMyIHR4X2ZpcnN0X2NvbW1hbmQ7CisjZW5kaWYKKworI2lmZGVmIE1WNjQzWFhfVFhfRkFTVF9SRUZJTEwKKwl1MzIgdHhfY2xlYW5fdGhyZXNob2xkOworI2VuZGlmCisKKwlzdHJ1Y3QgZXRoX3J4X2Rlc2MgKnBfcnhfZGVzY19hcmVhOworCWRtYV9hZGRyX3QgcnhfZGVzY19kbWE7CisJdW5zaWduZWQgaW50IHJ4X2Rlc2NfYXJlYV9zaXplOworCXN0cnVjdCBza19idWZmICoqcnhfc2tiOworCisJc3RydWN0IGV0aF90eF9kZXNjICpwX3R4X2Rlc2NfYXJlYTsKKwlkbWFfYWRkcl90IHR4X2Rlc2NfZG1hOworCXVuc2lnbmVkIGludCB0eF9kZXNjX2FyZWFfc2l6ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqKnR4X3NrYjsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF90aW1lb3V0X3Rhc2s7CisKKwkvKgorCSAqIEZvcm1lciBzdHJ1Y3QgbXY2NDN4eF9ldGhfcHJpdiBtZW1iZXJzIHN0YXJ0IGhlcmUKKwkgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgbXY2NDN4eF9taWJfY291bnRlcnMgbWliX2NvdW50ZXJzOworCXNwaW5sb2NrX3QgbG9jazsKKwkvKiBTaXplIG9mIFR4IFJpbmcgcGVyIHF1ZXVlICovCisJdW5zaWduZWQgaW50IHR4X3Jpbmdfc2l6ZTsKKwkvKiBBbW1vbnQgb2YgU0tCcyBvdXRzdGFuZGluZyBvbiBUeCBxdWV1ZSAqLworCXVuc2lnbmVkIGludCB0eF9yaW5nX3NrYnM7CisJLyogU2l6ZSBvZiBSeCBSaW5nIHBlciBxdWV1ZSAqLworCXVuc2lnbmVkIGludCByeF9yaW5nX3NpemU7CisJLyogQW1tb3VudCBvZiBTS0JzIGFsbG9jYXRlZCB0byBSeCBSaW5nIHBlciBxdWV1ZSAqLworCXVuc2lnbmVkIGludCByeF9yaW5nX3NrYnM7CisKKwkvKgorCSAqIHJ4X3Rhc2sgdXNlZCB0byBmaWxsIFJYIHJpbmcgb3V0IG9mIGJvdHRvbSBoYWxmIGNvbnRleHQKKwkgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcnhfdGFzazsKKworCS8qCisJICogVXNlZCBpbiBjYXNlIFJYIFJpbmcgaXMgZW1wdHksIHdoaWNoIGNhbiBiZSBjYXVzZWQgd2hlbgorCSAqIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHJlc291cmNlcyAoc2tiJ3MpCisJICovCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZW91dDsKKwlsb25nIHJ4X3Rhc2tfYnVzeSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZChTTVBfQ0FDSEVfQllURVMpKSk7CisJdW5zaWduZWQgcnhfdGltZXJfZmxhZzsKKworCXUzMiByeF9pbnRfY29hbDsKKwl1MzIgdHhfaW50X2NvYWw7Cit9OworCisvKiBldGhlcm5ldC5oIEFQSSBsaXN0ICovCisKKy8qIFBvcnQgb3BlcmF0aW9uIGNvbnRyb2wgcm91dGluZXMgKi8KK3N0YXRpYyB2b2lkIGV0aF9wb3J0X2luaXQoc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXApOworc3RhdGljIHZvaWQgZXRoX3BvcnRfcmVzZXQodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSk7CitzdGF0aWMgdm9pZCBldGhfcG9ydF9zdGFydChzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCk7CisKK3N0YXRpYyB2b2lkIGV0aGVybmV0X3NldF9jb25maWdfcmVnKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0sCisJCQkJICAgIHVuc2lnbmVkIGludCB2YWx1ZSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGV0aGVybmV0X2dldF9jb25maWdfcmVnKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0pOworCisvKiBQb3J0IE1BQyBhZGRyZXNzIHJvdXRpbmVzICovCitzdGF0aWMgdm9pZCBldGhfcG9ydF91Y19hZGRyX3NldCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtLAorCQkJCSB1bnNpZ25lZCBjaGFyICpwX2FkZHIpOworCisvKiBQSFkgYW5kIE1JQiByb3V0aW5lcyAqLworc3RhdGljIHZvaWQgZXRoZXJuZXRfcGh5X3Jlc2V0KHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0pOworCitzdGF0aWMgdm9pZCBldGhfcG9ydF93cml0ZV9zbWlfcmVnKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0sCisJCQkJICAgdW5zaWduZWQgaW50IHBoeV9yZWcsIHVuc2lnbmVkIGludCB2YWx1ZSk7CisKK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3JlYWRfc21pX3JlZyh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtLAorCQkJCSAgdW5zaWduZWQgaW50IHBoeV9yZWcsIHVuc2lnbmVkIGludCAqdmFsdWUpOworCitzdGF0aWMgdm9pZCBldGhfY2xlYXJfbWliX2NvdW50ZXJzKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0pOworCisvKiBQb3J0IGRhdGEgZmxvdyBjb250cm9sIHJvdXRpbmVzICovCitzdGF0aWMgRVRIX0ZVTkNfUkVUX1NUQVRVUyBldGhfcG9ydF9zZW5kKHN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wLAorCQkJCQkgc3RydWN0IHBrdF9pbmZvICpwX3BrdF9pbmZvKTsKK3N0YXRpYyBFVEhfRlVOQ19SRVRfU1RBVFVTIGV0aF90eF9yZXR1cm5fZGVzYyhzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCwKKwkJCQkJICAgICAgc3RydWN0IHBrdF9pbmZvICpwX3BrdF9pbmZvKTsKK3N0YXRpYyBFVEhfRlVOQ19SRVRfU1RBVFVTIGV0aF9wb3J0X3JlY2VpdmUoc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAsCisJCQkJCSAgICBzdHJ1Y3QgcGt0X2luZm8gKnBfcGt0X2luZm8pOworc3RhdGljIEVUSF9GVU5DX1JFVF9TVEFUVVMgZXRoX3J4X3JldHVybl9idWZmKHN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wLAorCQkJCQkgICAgICBzdHJ1Y3QgcGt0X2luZm8gKnBfcGt0X2luZm8pOworCisjZW5kaWYJCQkJLyogX19NVjY0M1hYX0VUSF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L212bWUxNDcuYyBiL2RyaXZlcnMvbmV0L212bWUxNDcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmE4MmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbXZtZTE0Ny5jCkBAIC0wLDAgKzEsMjAzIEBACisvKiBtdm1lMTQ3LmMgIDogdGhlICBMaW51eC9tdm1lMTQ3L2xhbmNlIGV0aGVybmV0IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMDUvMTk5OCBQZXRlciBNYXlkZWxsIDxwbWF5ZGVsbEBjaGlhcmsuZ3JlZW5lbmQub3JnLnVrPgorICogQmFzZWQgb24gdGhlIFN1biBMYW5jZSBkcml2ZXIgYW5kIHRoZSBOZXRCU0QgSFAgTGFuY2UgZHJpdmVyCisgKiBVc2VzIHRoZSBnZW5lcmljIDc5OTAuYyBMQU5DRSBjb2RlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorLyogVXNlZCBmb3IgdGhlIHRlbXBvcmFsIGluZXQgZW50cmllcyBhbmQgcm91dGluZyAqLworI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9tdm1lMTQ3aHcuaD4KKworLyogV2UgaGF2ZSAxNjgzNCBieXRlcyBvZiBSQU0gZm9yIHRoZSBpbml0IGJsb2NrIGFuZCBidWZmZXJzLiBUaGlzIHBsYWNlcworICogYW4gdXBwZXIgbGltaXQgb24gdGhlIG51bWJlciBvZiBidWZmZXJzIHdlIGNhbiB1c2UuIE5ldEJTRCB1c2VzIDggUngKKyAqIGJ1ZmZlcnMgYW5kIDIgVHggYnVmZmVycy4KKyAqLworI2RlZmluZSBMQU5DRV9MT0dfVFhfQlVGRkVSUyAxCisjZGVmaW5lIExBTkNFX0xPR19SWF9CVUZGRVJTIDMKKworI2luY2x1ZGUgIjc5OTAuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgZ2VuZXJpYyBMQU5DRSBjb2RlICovCisKKy8qIE91ciBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgbTE0N2xhbmNlX3ByaXZhdGUgeworCXN0cnVjdCBsYW5jZV9wcml2YXRlIGxhbmNlOworCXVuc2lnbmVkIGxvbmcgcmFtOworfTsKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcy4uLiBUaGlzIGlzIGVhc3kgYmVjYXVzZSBhbGwgdGhlIGdyb3QgaXMgaW4gdGhlCisgKiBnZW5lcmljIExBTkNFIHN1cHBvcnQuIEFsbCB3ZSBoYXZlIHRvIHN1cHBvcnQgaXMgcHJvYmluZyBmb3IgYm9hcmRzLAorICogcGx1cyBib2FyZC1zcGVjaWZpYyBpbml0LCBvcGVuIGFuZCBjbG9zZSBhY3Rpb25zLgorICogT2gsIGFuZCB3ZSBuZWVkIHRvIHRlbGwgdGhlIGdlbmVyaWMgY29kZSBob3cgdG8gcmVhZCBhbmQgd3JpdGUgTEFOQ0UgcmVnaXN0ZXJzLi4uCisgKi8KK3N0YXRpYyBpbnQgbTE0N2xhbmNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG0xNDdsYW5jZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG0xNDdsYW5jZV93cml0ZXJhcChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAsIHVuc2lnbmVkIHNob3J0IHZhbHVlKTsKK3N0YXRpYyB2b2lkIG0xNDdsYW5jZV93cml0ZXJkcChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAsIHVuc2lnbmVkIHNob3J0IHZhbHVlKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBtMTQ3bGFuY2VfcmVhZHJkcChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApOworCit0eXBlZGVmIHZvaWQgKCp3cml0ZXJhcF90KSh2b2lkICosIHVuc2lnbmVkIHNob3J0KTsKK3R5cGVkZWYgdm9pZCAoKndyaXRlcmRwX3QpKHZvaWQgKiwgdW5zaWduZWQgc2hvcnQpOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAoKnJlYWRyZHBfdCkodm9pZCAqKTsKKworLyogSW5pdGlhbGlzZSB0aGUgb25lIGFuZCBvbmx5IG9uLWJvYXJkIDc5OTAgKi8KK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IG12bWUxNDdsYW5jZV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0YXRpYyBpbnQgY2FsbGVkOworCXN0YXRpYyBjb25zdCBjaGFyIG5hbWVbXSA9ICJNVk1FMTQ3IExBTkNFIjsKKwlzdHJ1Y3QgbTE0N2xhbmNlX3ByaXZhdGUgKmxwOworCXVfbG9uZyAqYWRkcjsKKwl1X2xvbmcgYWRkcmVzczsKKwlpbnQgZXJyOworCisJaWYgKCFNQUNIX0lTX01WTUUxNDcgfHwgY2FsbGVkKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwljYWxsZWQrKzsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbTE0N2xhbmNlX3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAodW5pdCA+PSAwKQorCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBGaWxsIHRoZSBkZXYgZmllbGRzICovCisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylNVk1FMTQ3X0xBTkNFX0JBU0U7CisJZGV2LT5vcGVuID0gJm0xNDdsYW5jZV9vcGVuOworCWRldi0+c3RvcCA9ICZtMTQ3bGFuY2VfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmbGFuY2Vfc3RhcnRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9ICZsYW5jZV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmbGFuY2Vfc2V0X211bHRpY2FzdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmbGFuY2VfdHhfdGltZW91dDsKKwlkZXYtPmRtYSA9IDA7CisKKwlhZGRyPSh1X2xvbmcgKilFVEhFUk5FVF9BRERSRVNTOworCWFkZHJlc3MgPSAqYWRkcjsKKwlkZXYtPmRldl9hZGRyWzBdPTB4MDg7CisJZGV2LT5kZXZfYWRkclsxXT0weDAwOworCWRldi0+ZGV2X2FkZHJbMl09MHgzZTsKKwlhZGRyZXNzPWFkZHJlc3M+Pjg7CisJZGV2LT5kZXZfYWRkcls1XT1hZGRyZXNzJjB4ZmY7CisJYWRkcmVzcz1hZGRyZXNzPj44OworCWRldi0+ZGV2X2FkZHJbNF09YWRkcmVzcyYweGZmOworCWFkZHJlc3M9YWRkcmVzcz4+ODsKKwlkZXYtPmRldl9hZGRyWzNdPWFkZHJlc3MmMHhmZjsKKworCXByaW50aygiJXM6IE1WTUUxNDcgYXQgMHglMDhseCwgaXJxICVkLCBIYXJkd2FyZSBBZGRyZXNzICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBNVk1FMTQ3X0xBTkNFX0lSUSwKKwkJZGV2LT5kZXZfYWRkclswXSwKKwkJZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkJZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwKKwkJZGV2LT5kZXZfYWRkcls1XSk7CisKKwlscCA9IChzdHJ1Y3QgbTE0N2xhbmNlX3ByaXZhdGUgKilkZXYtPnByaXY7CisJbHAtPnJhbSA9IF9fZ2V0X2RtYV9wYWdlcyhHRlBfQVRPTUlDLCAzKTsJLyogMTZLICovCisJaWYgKCFscC0+cmFtKQorCXsKKwkJcHJpbnRrKCIlczogTm8gbWVtb3J5IGZvciBMQU5DRSBidWZmZXJzXG4iLCBkZXYtPm5hbWUpOworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlscC0+bGFuY2UubmFtZSA9IChjaGFyKiluYW1lOyAgICAgICAgICAgICAgICAgICAvKiBkaXNjYXJkcyBjb25zdCwgc2h1dCB1cCBnY2MgKi8KKwlscC0+bGFuY2UuYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCWxwLT5sYW5jZS5pbml0X2Jsb2NrID0gKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopKGxwLT5yYW0pOyAvKiBDUFUgYWRkciAqLworCWxwLT5sYW5jZS5sYW5jZV9pbml0X2Jsb2NrID0gKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopKGxwLT5yYW0pOyAgICAgICAgICAgICAgICAgLyogTEFOQ0UgYWRkciBvZiBzYW1lIFJBTSAqLworCWxwLT5sYW5jZS5idXNtYXN0ZXJfcmVndmFsID0gTEVfQzNfQlNXUDsgICAgICAgIC8qIHdlJ3JlIGJpZ2VuZGlhbiAqLworCWxwLT5sYW5jZS5pcnEgPSBNVk1FMTQ3X0xBTkNFX0lSUTsKKwlscC0+bGFuY2Uud3JpdGVyYXAgPSAod3JpdGVyYXBfdCltMTQ3bGFuY2Vfd3JpdGVyYXA7CisJbHAtPmxhbmNlLndyaXRlcmRwID0gKHdyaXRlcmRwX3QpbTE0N2xhbmNlX3dyaXRlcmRwOworCWxwLT5sYW5jZS5yZWFkcmRwID0gKHJlYWRyZHBfdCltMTQ3bGFuY2VfcmVhZHJkcDsKKwlscC0+bGFuY2UubGFuY2VfbG9nX3J4X2J1ZnMgPSBMQU5DRV9MT0dfUlhfQlVGRkVSUzsKKwlscC0+bGFuY2UubGFuY2VfbG9nX3R4X2J1ZnMgPSBMQU5DRV9MT0dfVFhfQlVGRkVSUzsKKwlscC0+bGFuY2UucnhfcmluZ19tb2RfbWFzayA9IFJYX1JJTkdfTU9EX01BU0s7CisJbHAtPmxhbmNlLnR4X3JpbmdfbW9kX21hc2sgPSBUWF9SSU5HX01PRF9NQVNLOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlmcmVlX3BhZ2VzKGxwLT5yYW0sIDMpOworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKworCXJldHVybiBkZXY7Cit9CisKK3N0YXRpYyB2b2lkIG0xNDdsYW5jZV93cml0ZXJhcChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCW91dF9iZTE2KGxwLT5iYXNlICsgTEFOQ0VfUkFQLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIG0xNDdsYW5jZV93cml0ZXJkcChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCW91dF9iZTE2KGxwLT5iYXNlICsgTEFOQ0VfUkRQLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBtMTQ3bGFuY2VfcmVhZHJkcChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApCit7CisJcmV0dXJuIGluX2JlMTYobHAtPmJhc2UgKyBMQU5DRV9SRFApOworfQorCitzdGF0aWMgaW50IG0xNDdsYW5jZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGxhbmNlX29wZW4oZGV2KTsgICAgICAgICAgICAgICAgIC8qIGNhbGwgZ2VuZXJpYyBsYW5jZSBvcGVuIGNvZGUgKi8KKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzIGF0IGJvYXJkIGxldmVsLiAqLworCW0xNDdfcGNjLT5sYW5fY250cmw9MDsgICAgICAgLyogY2xlYXIgdGhlIGludGVycnVwdHMgKGlmIGFueSkgKi8KKwltMTQ3X3BjYy0+bGFuX2NudHJsPTB4MDggfCAweDA0OyAgICAgLyogRW5hYmxlIGlycSA0ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtMTQ3bGFuY2VfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgYXQgYm9hcmRsZXZlbCAqLworCW0xNDdfcGNjLT5sYW5fY250cmw9MHgwOyAvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlsYW5jZV9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisjaWZkZWYgTU9EVUxFCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X212bWUxNDdfbGFuY2U7CitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlkZXZfbXZtZTE0N19sYW5jZSA9IG12bWUxNDdsYW5jZV9wcm9iZSgtMSk7CisJaWYgKElTX0VSUihkZXZfbXZtZTE0N19sYW5jZSkpCisJCXJldHVybiBQVFJfRVJSKGRldl9tdm1lMTQ3X2xhbmNlKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBtMTQ3bGFuY2VfcHJpdmF0ZSAqbHAgPSBkZXZfbXZtZTE0N19sYW5jZS0+cHJpdjsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfbXZtZTE0N19sYW5jZSk7CisJZnJlZV9wYWdlcyhscC0+cmFtLCAzKTsKKwlmcmVlX25ldGRldihkZXZfbXZtZTE0N19sYW5jZSk7Cit9CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmlfY29kZS5oIGIvZHJpdmVycy9uZXQvbXlyaV9jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxZWJhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L215cmlfY29kZS5oCkBAIC0wLDAgKzEsNjI4NyBAQAorLyogVGhpcyBpcyB0aGUgTXlyaW5ldCBNQ1AgY29kZSBmb3IgTEFOYWk0LnggKi8gCisvKiBHZW5lcmF0ZWQgYnkgIGNhdCAkTVlSSV9IT01FL2xpYi9sYW5haS9tY3A0LmRhdCA+IG15cmlfY29kZTQuaCAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGxhbmFpNF9jb2RlX29mZiA9IDB4MDAwMDsgLyogaGFsZi13b3JkIG9mZnNldCAqLyAKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxhbmFpNF9jb2RlWzc2MjU2XSBfX2luaXRkYXRhID0geworMHhGMiwweDBFLCAKKzB4RkUsMHgwMCwgMHhDMiwweDkwLCAweDAwLDB4MDAsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MDEsMHg0QywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhFMCwweDAwLCAweDAwLDB4MTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNiwgMHgyQSwweDZDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4MkMsMHgxMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg0OCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDAyLCAweDA1LDB4M0MsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4MDAsMHgwMywgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDI5LDB4RTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgyQiwweDg0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4MkMsMHgxQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg0OCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDAyLCAweDBBLDB4QkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4MDAsMHgwMiwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDJBLDB4RjgsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHhGNywweDA0LCAweDRBLDB4OUMsIDB4ODUsMHgxNiwgMHgwMCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgwMSwgMHhFRSwweDAwLCAKKzB4MDEsMHgwMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDAxLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhGMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgwMSwweDJELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4MkQsMHgzOCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhGNCwweDgyLCAweDAwLDB4MTIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4MDEsMHhFMCwgMHhCNCwweEJBLCAKKzB4NjgsMHgwMiwgMHhFMCwweDAwLCAweDAxLDB4RTAsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY3LDB4MDQsIDB4M0IsMHg2NCwgMHhGNSwweDg0LCAKKzB4NEYsMHg1NCwgMHhGNywweDA1LCAweDdBLDB4MTAsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MDEsMHg5OSwgMHg5NywweDJBLCAKKzB4MDAsMHgyMCwgMHg5NSwweEFBLCAweDAwLDB4MUMsIDB4RjYsMHgwNiwgMHg0QSwweDk4LCAweDI2LDB4QUMsIDB4MDAsMHgwMSwgMHg3NywweDM1LCAKKzB4MDAsMHgwMSwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDA3LDB4MzgsIDB4MDAsMHgwQywgMHhBNCwweEJBLCAKKzB4NjAsMHgwMiwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHhBQSwgMHgwMCwweDEwLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg4NywweDNBLCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTcsMHgyQSwgMHgwMCwweDE0LCAweEY3LDB4MDQsIDB4NEEsMHg5QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyNywweDM4LCAweDAwLDB4MDEsIDB4QzAsMHgyRSwgMHg3MiwweDAwLCAweEQ3LDB4MDAsIDB4MEEsMHgwMSwgMHhFMCwweDAwLCAKKzB4MDEsMHhEMCwgMHhGNywweDA1LCAweDdBLDB4MTgsIDB4OTUsMHhBQSwgMHgwMCwweDFDLCAweEY2LDB4MDYsIDB4NEEsMHg5OCwgMHgwNiwweEFDLCAKKzB4MDAsMHgwMSwgMHg3NywweDM1LCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgwNywweDM4LCAKKzB4MDAsMHgwQywgMHhBNCwweEJBLCAweDYwLDB4MDIsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4QUEsIDB4MDAsMHgxMCwgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHg4NywweDNBLCAweDAwLDB4MDQsIDB4RjAsMHgwNSwgMHg3QSwweDE4LCAweDk3LDB4MkEsIDB4MDAsMHgxNCwgMHhGNSwweDA1LCAKKzB4NzksMHhEOCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgwMSwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgzOCwgMHhGNywweDA0LCAKKzB4N0EsMHgxMCwgMHhGNiwweDg0LCAweDNCLDB4NjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHhENywweDAwLCAweDBBLDB4NzAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MDIsMHg0QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MDIsMHg0QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDAyLDB4ODUsIDB4RjQsMHg4MiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDAyLCAKKzB4MDAsMHgxMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgwMiwweDc0LCAweEIzLDB4M0EsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHhGMywweDA2LCAweDJBLDB4NkMsIDB4RjMsMHgwNSwgMHgyQywweDEwLCAweEUwLDB4MDAsIDB4MDUsMHgyOCwgMHhGMCwweDA1LCAKKzB4N0EsMHgxOCwgMHhGMywweDg0LCAweDc5LDB4RDgsIDB4RjYsMHg4NCwgMHg0QSwweEEwLCAweDIzLDB4MTQsIDB4MDAsMHgyMCwgMHg5MywweDE2LCAKKzB4RkYsMHhDNCwgMHg4NCwweDFFLCAweDAwLDB4MTAsIDB4OTYsMHg5NiwgMHhGRiwweEQ0LCAweEY3LDB4MDQsIDB4NEEsMHg5QywgMHg5NCwweDE2LCAKKzB4RkYsMHhFMCwgMHg4NSwweDFFLCAweDAwLDB4MTQsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEVDLDB4MDAsIDB4MDMsMHg2QywgMHg5NSwweDE2LCAKKzB4RkYsMHhFNCwgMHg3NywweDM1LCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDA2LCAKKzB4NEEsMHg5OCwgMHhDNiwweEI4LCAweDMwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDBDLCAweEM1LDB4ODQsIDB4MDAsMHgwMCwgMHg4NywweDM2LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg0MiwweDAwLCAweEU2LDB4MDAsIDB4MDIsMHhGQywgMHhDNiwweDI0LCAKKzB4MDAsMHgwMCwgMHg4NywweDM2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NTIsMHgwMCwgMHhFNiwweDAwLCAKKzB4MDMsMHgwMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MDMsMHgwRCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjUsMHg4MiwgMHgwMCwweDAwLCAweDg2LDB4MzYsIDB4MDAsMHgwMCwgMHg4NywweDE2LCAKKzB4RkYsMHhFMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzMiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4MDMsMHg0OCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHhDMCwweDMyLCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHgwMywweDUwLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHg4NiwweEI2LCAKKzB4MDAsMHgwNCwgMHg4NywweDE2LCAweEZGLDB4RTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAKKzB4MDMsMHg1MSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RjUsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MDMsMHg2MSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MDMsMHg3MCwgMHgyMCwweDI2LCAweDAwLDB4MDAsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MDMsMHhBNSwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgxNiwgMHhGRiwweEQ0LCAweEYzLDB4MDYsIDB4NEEsMHg5OCwgMHg3NiwweEI5LCAKKzB4MDAsMHgwMSwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4MzAsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgxNCwgMHg4NiwweEI2LCAweDAwLDB4MDAsIDB4OTcsMHgxNiwgMHhGRiwweEQ4LCAweEUwLDB4MDAsIDB4MDQsMHgxOCwgMHg5NiwweDk2LCAKKzB4RkYsMHhEQywgMHgyNywweDE0LCAweDAwLDB4MkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDgzLDB4MTYsIDB4RkYsMHhDNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4RjMsMHgwNiwgMHg0QSwweDk4LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg5MywweDk2LCAKKzB4RkYsMHhDQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNSwweDY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAKKzB4RkYsMHhDQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgwNCwweDE1LCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDE2LCAKKzB4RkYsMHhENCwgMHhGMywweDA2LCAweDRBLDB4OTgsIDB4NzYsMHhCOSwgMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg3NiwweEI1LCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDMwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDE0LCAweDg2LDB4QjYsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAKKzB4RkYsMHhEOCwgMHg5NiwweDk2LCAweEZGLDB4REMsIDB4RjcsMHgwNSwgMHg0QSwweEEwLCAweEUwLDB4MDAsIDB4MDQsMHgxQywgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MDQsMHgyQywgMHhGNCwweDgyLCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDA0LDB4ODQsIDB4RjQsMHg4MiwgMHgwMCwweDAwLCAweDg2LDB4OTYsIDB4RkYsMHhEOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NywweDM1LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNiwweDg2LCAKKzB4NDIsMHhDOCwgMHhBNiwweDNBLCAweDY4LDB4MDIsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDc1LDB4MzksIDB4MDAsMHgxRSwgMHg3NSwweDI4LCAKKzB4RkYsMHhFNSwgMHgwNSwweEI4LCAweDAwLDB4MDIsIDB4ODYsMHhBRSwgMHgwMCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgwNCwgMHg5NywweDE2LCAKKzB4RkYsMHhFQywgMHhDNiwweDMwLCAweDU3LDB4QzAsIDB4NzYsMHgzMCwgMHhGRiwweEYwLCAweDk2LDB4MTYsIDB4RkYsMHhGNCwgMHg3NSwweEFELCAKKzB4MDAsMHgxRSwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg1RiwweEMwLCAweDc2LDB4QjQsIDB4RkYsMHhGMCwgMHg5NiwweDk2LCAKKzB4RkYsMHhGMCwgMHgyMCwweDI2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgwNSwweDI1LCAweEYzLDB4MDYsIDB4MjksMHhFMCwgMHg4NiwweDk2LCAKKzB4RkYsMHhGMCwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4QzcsMHgzNCwgMHg2OCwweDAwLCAweEM0LDB4OUMsIDB4NzIsMHgwMCwgMHhDMCwweDJFLCAKKzB4NkEsMHgwMCwgMHhFQywweDAwLCAweDA0LDB4RjAsIDB4QzUsMHgyNCwgMHgwMCwweDAwLCAweEM2LDB4MkMsIDB4MDAsMHgwMCwgMHg4NywweDE2LCAKKzB4RkYsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QTYsMHhCMiwgMHg3MCwweDAyLCAweDA1LDB4QUMsIDB4MDAsMHgwMSwgMHhDNywweDMwLCAKKzB4NzAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI0LCAKKzB4RkYsMHhGMCwgMHhGNiwweEFCLCAweDI4LDB4MDAsIDB4MDUsMHgyOCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhGMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDJFLCAweDcyLDB4MDAsIDB4RUMsMHgwMCwgMHgwNCwweEIxLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHhGMywweDAyLCAKKzB4MDAsMHgwMywgMHhGMywweDA1LCAweDc2LDB4RjQsIDB4ODcsMHgxNiwgMHhGRiwweEYwLCAweDg2LDB4OUUsIDB4MDAsMHgwNCwgMHhDNywweDM4LCAKKzB4NzAsMHgwMCwgMHhDNywweDM4LCAweDQ4LDB4MDAsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDg3LDB4MTYsIDB4RkYsMHhGNCwgMHgwNiwweEI0LCAKKzB4MDAsMHgyMCwgMHg5NywweDAyLCAweEZGLDB4NkMsIDB4OTQsMHg4MiwgMHhGRiwweDUwLCAweDk2LDB4ODIsIDB4RkYsMHg1OCwgMHhGMywweDA2LCAKKzB4MjksMHhFMCwgMHhGMywweDA1LCAweDJDLDB4MTAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHhGNywweDA0LCAweDdBLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MDUsMHhDRCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3QSwweDEwLCAweEY2LDB4ODQsIDB4M0IsMHg2NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDZBLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MDUsMHhDRCwgMHhGNSwweDg2LCAweDRBLDB4OTgsIDB4RjYsMHgwNCwgMHg3OSwweEQ4LCAweEY2LDB4ODQsIDB4NEYsMHg1NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NiwweEIyLCAweDAwLDB4MUMsIDB4MDYsMHhCNCwgMHgwMCwweDAxLCAweDc3LDB4MzUsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MDcsMHgzOCwgMHgwMCwweDBDLCAweEE1LDB4M0EsIDB4NTgsMHgwMiwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NSwweDMyLCAweDAwLDB4MTAsIDB4QzcsMHgzOCwgMHg1OCwweDAwLCAweDg3LDB4M0EsIDB4MDAsMHgwNCwgMHhGMCwweDA1LCAKKzB4N0EsMHgxOCwgMHg5NywweDMyLCAweDAwLDB4MTQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MDEsMHhGNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhFMCwweDAwLCAweDA1LDB4RkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNSwweDAyLCAKKzB4MDAsMHgxMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgwNSwweEY0LCAweEI1LDB4M0EsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHhGNSwweDA2LCAweDJBLDB4NkMsIDB4RjUsMHgwNSwgMHgyQywweDEwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODUsMHg5NiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4NzUsMHhFQywgMHg4NSwweDJFLCAKKzB4MDAsMHgyMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgwNiwweENDLCAweEY1LDB4MDUsIDB4N0EsMHgwOCwgMHhGNywweDA0LCAKKzB4NzUsMHhGMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MDYsMHhDQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDdBLDB4MDgsIDB4RjYsMHg4NCwgMHgzQiwweDY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAKKzB4NkEsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4RDcsMHgwMCwgMHgwQSwweDcwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MDYsMHhDQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgyRSwgMHgwMCwweDFDLCAweEY2LDB4ODQsIDB4NEYsMHg1NCwgMHhGNywweDA1LCAKKzB4N0EsMHgwMCwgMHhDNywweDM0LCAweDcyLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEVFLDB4MDAsIDB4MDYsMHg4RCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDA2LDB4OTAsIDB4RjUsMHgwNSwgMHg3OSwweEY4LCAweEYwLDB4ODUsIDB4NzksMHhGOCwgMHhGNiwweDg0LCAKKzB4N0EsMHgwMCwgMHhDNywweDM4LCAweDcwLDB4MDAsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweEY3LDB4MDQsIDB4NzksMHhGOCwgMHhGNiwweDg1LCAKKzB4NzksMHhFOCwgMHhDNywweDM4LCAweDcwLDB4MDAsIDB4QzYsMHgzNCwgMHg3MCwweDAwLCAweEY3LDB4MDQsIDB4NEEsMHg5QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RUMsMHgwMCwgMHgwNiwweENDLCAweEY2LDB4MDUsIDB4NzksMHhGMCwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMCwgMHhFQywweDAwLCAweDA2LDB4RjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNSwweDAyLCAKKzB4MDAsMHgxMywgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgwNywweDM4LCAweEI1LDB4M0EsIDB4NjgsMHgwMiwgMHhFMCwweDAwLCAKKzB4MDcsMHgzOCwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjcsMHgwNCwgMHg0QSwweDlDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDMyLCAKKzB4NzIsMHgwMCwgMHhFRSwweDAwLCAweDA3LDB4MTksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NEEsMHg5QywgMHhFMCwweDAwLCAKKzB4MDcsMHgyOCwgMHhGNywweDA1LCAweDc5LDB4RjAsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEVDLDB4MDAsIDB4MDcsMHgyOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGMCwweDg1LCAweDc5LDB4RjAsIDB4RjUsMHg4NSwgMHg3OSwweEUwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MDcsMHg0QywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwNCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MzgsIDB4RjcsMHgwNCwgMHg3NSwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDA3LDB4QTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhGMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgwNywweEE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4N0EsMHgwOCwgMHhGNiwweDg0LCAweDNCLDB4NjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHhENywweDAwLCAweDBBLDB4NzAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MDcsMHhENSwgMHhGNCwweDAyLCAKKzB4MDAsMHgwMCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHgwMiwgMHgwMCwweDEzLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4MDcsMHhDQywgMHhCMywweDNBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEUwLDB4MDAsIDB4MEEsMHhBNCwgMHhGMywweDA2LCAKKzB4MkIsMHg4NCwgMHhGNiwweDg0LCAweDc5LDB4RTgsIDB4RjYsMHgwNiwgMHg0QSwweDk4LCAweDc3LDB4MzUsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjYsMHg4NCwgMHg3OSwweEUwLCAweDA3LDB4MzgsIDB4MDAsMHgwQywgMHhBMywweDNBLCAKKzB4NjAsMHgwMiwgMHhDMywweEI0LCAweDAwLDB4MDAsIDB4OTMsMHgzNiwgMHgwMCwweDEwLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg4NywweDNBLCAKKzB4MDAsMHgwNCwgMHgyMywweDE0LCAweDAwLDB4MjAsIDB4OTMsMHgxNiwgMHhGRiwweEM0LCAweDk3LDB4MzYsIDB4MDAsMHgxNCwgMHg4NCwweDlFLCAKKzB4MDAsMHgxMCwgMHhGNiwweDg0LCAweDRBLDB4QTAsIDB4OTQsMHg5NiwgMHhGRiwweEUwLCAweDk2LDB4OTYsIDB4RkYsMHhENCwgMHg4NSwweDFFLCAKKzB4MDAsMHgxNCwgMHhGNywweDA0LCAweDRBLDB4OUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFQywweDAwLCAKKzB4MDgsMHhFQywgMHg5NSwweDE2LCAweEZGLDB4RTQsIDB4NzcsMHgzNSwgMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhDNiwweEI4LCAweDYwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDBDLCAweEM1LDB4ODQsIDB4MDAsMHgwMCwgMHg4NywweDM2LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg0QSwweDAwLCAweEU2LDB4MDAsIDB4MDgsMHg3QywgMHhDNiwweDIwLCAKKzB4MDAsMHgwMCwgMHg4NywweDM2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NTIsMHgwMCwgMHhFNiwweDAwLCAKKzB4MDgsMHg4MCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MDgsMHg4RCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjUsMHg4MiwgMHgwMCwweDAwLCAweDg2LDB4MzYsIDB4MDAsMHgwMCwgMHg4NywweDE2LCAKKzB4RkYsMHhFMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzMiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4MDgsMHhDOCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHhDMCwweDMyLCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHgwOCwweEQwLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHg4NiwweEI2LCAKKzB4MDAsMHgwNCwgMHg4NywweDE2LCAweEZGLDB4RTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAKKzB4MDgsMHhEMSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RjUsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MDgsMHhFMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MDgsMHhGMCwgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RjQsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MDksMHgyNSwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgxNiwgMHhGRiwweEQ0LCAweEYzLDB4MDYsIDB4NEEsMHg5OCwgMHg3NiwweEI5LCAKKzB4MDAsMHgwMSwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4MzAsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgxNCwgMHg4NiwweEI2LCAweDAwLDB4MDAsIDB4OTcsMHgxNiwgMHhGRiwweEQ4LCAweEUwLDB4MDAsIDB4MDksMHg5OCwgMHg5NiwweDk2LCAKKzB4RkYsMHhEQywgMHgyNywweDE0LCAweDAwLDB4MkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDgzLDB4MTYsIDB4RkYsMHhDNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4RjMsMHgwNiwgMHg0QSwweDk4LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg5MywweDk2LCAKKzB4RkYsMHhDQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNSwweDY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAKKzB4RkYsMHhDQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgwOSwweDk1LCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDE2LCAKKzB4RkYsMHhENCwgMHhGMywweDA2LCAweDRBLDB4OTgsIDB4NzYsMHhCOSwgMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg3NiwweEI1LCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDMwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDE0LCAweDg2LDB4QjYsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAKKzB4RkYsMHhEOCwgMHg5NiwweDk2LCAweEZGLDB4REMsIDB4RjcsMHgwNSwgMHg0QSwweEEwLCAweEUwLDB4MDAsIDB4MDksMHg5QywgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MDksMHhBQywgMHhGNCwweDgyLCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDBBLDB4MDQsIDB4RjQsMHg4MiwgMHgwMCwweDAwLCAweDg2LDB4OTYsIDB4RkYsMHhEOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NywweDM1LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNiwweDg2LCAKKzB4NDIsMHhDOCwgMHhBNiwweDNBLCAweDY4LDB4MDIsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDc1LDB4MzksIDB4MDAsMHgxRSwgMHg3NSwweDI4LCAKKzB4RkYsMHhFNSwgMHgwNSwweEI4LCAweDAwLDB4MDIsIDB4ODYsMHhBRSwgMHgwMCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgwNCwgMHg5NywweDE2LCAKKzB4RkYsMHhFQywgMHhDNiwweDMwLCAweDU3LDB4QzAsIDB4NzYsMHgzMCwgMHhGRiwweEYwLCAweDk2LDB4MTYsIDB4RkYsMHhGNCwgMHg3NSwweEFELCAKKzB4MDAsMHgxRSwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg1RiwweEMwLCAweDc2LDB4QjQsIDB4RkYsMHhGMCwgMHg5NiwweDk2LCAKKzB4RkYsMHhGMCwgMHgyMCwweDI2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgwQSwweEE1LCAweEYzLDB4MDYsIDB4MkEsMHhGOCwgMHg4NiwweDk2LCAKKzB4RkYsMHhGMCwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4QzcsMHgzNCwgMHg2OCwweDAwLCAweEM0LDB4OUMsIDB4NzIsMHgwMCwgMHhDMCwweDJFLCAKKzB4NkEsMHgwMCwgMHhFQywweDAwLCAweDBBLDB4NzAsIDB4QzUsMHgyNCwgMHgwMCwweDAwLCAweEM2LDB4MkMsIDB4MDAsMHgwMCwgMHg4NywweDE2LCAKKzB4RkYsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QTYsMHhCMiwgMHg3MCwweDAyLCAweDA1LDB4QUMsIDB4MDAsMHgwMSwgMHhDNywweDMwLCAKKzB4NzAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI0LCAKKzB4RkYsMHhGMCwgMHhGNiwweEFCLCAweDI4LDB4MDAsIDB4MDUsMHgyOCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhGMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDJFLCAweDcyLDB4MDAsIDB4RUMsMHgwMCwgMHgwQSwweDMxLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHhGMywweDAyLCAKKzB4MDAsMHgwMiwgMHhGMywweDA1LCAweDc2LDB4RjQsIDB4ODcsMHgxNiwgMHhGRiwweEYwLCAweDg2LDB4OUUsIDB4MDAsMHgwNCwgMHhDNywweDM4LCAKKzB4NzAsMHgwMCwgMHhDNywweDM4LCAweDQ4LDB4MDAsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDg3LDB4MTYsIDB4RkYsMHhGNCwgMHgwNiwweEI0LCAKKzB4MDAsMHgyMCwgMHg5NywweDAyLCAweEZGLDB4NkMsIDB4OTQsMHg4MiwgMHhGRiwweDUwLCAweDk2LDB4ODIsIDB4RkYsMHg1OCwgMHhGMywweDA2LCAKKzB4MkEsMHhGOCwgMHhGMywweDA1LCAweDJDLDB4MUMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHhGNiwweDg0LCAweDc5LDB4RTgsIDB4RjcsMHgwNCwgMHg3OSwweEY4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNiwweEI0LCAKKzB4NzAsMHgwMCwgMHhGNywweDA0LCAweDdBLDB4MjAsIDB4RjYsMHg4NSwgMHg3OSwweEU4LCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4N0EsMHgyMCwgMHhGNywweDA0LCAweDc5LDB4RjAsIDB4RjYsMHgwNCwgMHg3QSwweDIwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4MEIsMHgyQywgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY1LDB4ODIsIDB4MDAsMHgxMywgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDBCLDB4MjAsIDB4QjUsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNSwweDg2LCAKKzB4MkIsMHg4NCwgMHhFMCwweDAwLCAweDBCLDB4MzgsIDB4RjUsMHg4NSwgMHgyQywweDFDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MDcsMHg0QywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHhGNywweDA2LCAweDJDLDB4MTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MjksMHhFMCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4MkMsMHgxMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgyQSwweDZDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MkMsMHgxQywgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDJBLDB4RjgsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgyQywweDFDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4MkIsMHg4NCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHhGMCwweDA1LCAweDJELDB4M0MsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MTgsIDB4RkYsMHg4NSwgMHgyRSwweERDLCAweEY3LDB4MDYsIDB4MEMsMHgzRSwgMHhDNywweDdDLCAKKzB4NzQsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxNCwweDI5LCAweDk3LDB4MTYsIDB4RkYsMHhGNCwgMHg0NywweDM4LCAKKzB4RkYsMHhGQiwgMHhGNiwweDg0LCAweDZGLDB4NTAsIDB4Q0YsMHhCOCwgMHgwMCwweDAwLCAweDgzLDB4OTYsIDB4RkYsMHhGNCwgMHhGNywweDAyLCAKKzB4MDAsMHgzRiwgMHhDMywweDlDLCAweDZELDB4ODAsIDB4QzcsMHgxQywgMHg3NCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgzRiwgMHhFMiwweDAwLCAKKzB4MTIsMHg2MCwgMHg5MywweDk2LCAweEZGLDB4RjQsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY2LDB4ODIsIDB4MEMsMHg1QywgMHhBNiwweEI2LCAKKzB4NzAsMHgwMiwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzEsMHgzNCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MTIsMHg2MCwgMHgwMCwweDAwLCAKKzB4MTIsMHg2MCwgMHgwMCwweDAwLCAweDBELDB4NjgsIDB4MDAsMHgwMCwgMHgwRCwweDY4LCAweDAwLDB4MDAsIDB4MEQsMHg1QywgMHgwMCwweDAwLCAKKzB4MEQsMHg1QywgMHgwMCwweDAwLCAweDBELDB4NjgsIDB4MDAsMHgwMCwgMHgwRCwweDY4LCAweDAwLDB4MDAsIDB4MTIsMHg1MCwgMHgwMCwweDAwLCAKKzB4MTIsMHg1MCwgMHgwMCwweDAwLCAweDEyLDB4M0MsIDB4MDAsMHgwMCwgMHgxMiwweDNDLCAweDAwLDB4MDAsIDB4MEQsMHhFMCwgMHgwMCwweDAwLCAKKzB4MEQsMHhFMCwgMHgwMCwweDAwLCAweDEyLDB4M0MsIDB4MDAsMHgwMCwgMHgxMiwweDNDLCAweDAwLDB4MDAsIDB4MEQsMHhFOCwgMHgwMCwweDAwLCAKKzB4MEQsMHhGNCwgMHgwMCwweDAwLCAweDBFLDB4MDAsIDB4MDAsMHgwMCwgMHgwRSwweDIwLCAweDAwLDB4MDAsIDB4MEUsMHg0MCwgMHgwMCwweDAwLCAKKzB4MEUsMHg2MCwgMHgwMCwweDAwLCAweDBFLDB4ODAsIDB4MDAsMHgwMCwgMHgwRSwweEEwLCAweDAwLDB4MDAsIDB4MEUsMHhDMCwgMHgwMCwweDAwLCAKKzB4MEUsMHhDOCwgMHgwMCwweDAwLCAweDBFLDB4RDAsIDB4MDAsMHgwMCwgMHgxMiwweDI4LCAweDAwLDB4MDAsIDB4MEUsMHhEOCwgMHgwMCwweDAwLCAKKzB4MEUsMHhGNCwgMHgwMCwweDAwLCAweDBGLDB4MTAsIDB4MDAsMHgwMCwgMHgxMiwweDI4LCAweDAwLDB4MDAsIDB4MEYsMHgxOCwgMHgwMCwweDAwLCAKKzB4MEYsMHgxOCwgMHgwMCwweDAwLCAweDBGLDB4MjQsIDB4MDAsMHgwMCwgMHgwRiwweDI0LCAweDAwLDB4MDAsIDB4MEYsMHg0NCwgMHgwMCwweDAwLCAKKzB4MEYsMHg0NCwgMHgwMCwweDAwLCAweDBGLDB4NjQsIDB4MDAsMHgwMCwgMHgwRiwweDY0LCAweDAwLDB4MDAsIDB4MEYsMHg4NCwgMHgwMCwweDAwLCAKKzB4MEYsMHg4NCwgMHgwMCwweDAwLCAweDBGLDB4OEMsIDB4MDAsMHgwMCwgMHgwRiwweDhDLCAweDAwLDB4MDAsIDB4MEYsMHg5NCwgMHgwMCwweDAwLCAKKzB4MEYsMHg5NCwgMHgwMCwweDAwLCAweDBGLDB4QjAsIDB4MDAsMHgwMCwgMHgwRiwweEIwLCAweDAwLDB4MDAsIDB4MEYsMHhCOCwgMHgwMCwweDAwLCAKKzB4MEYsMHhEOCwgMHgwMCwweDAwLCAweDBGLDB4RjgsIDB4MDAsMHgwMCwgMHgxMCwweDJDLCAweDAwLDB4MDAsIDB4MTAsMHg2MCwgMHgwMCwweDAwLCAKKzB4MTAsMHg5NCwgMHgwMCwweDAwLCAweDEwLDB4QzgsIDB4MDAsMHgwMCwgMHgxMCwweEZDLCAweDAwLDB4MDAsIDB4MTEsMHgzMCwgMHgwMCwweDAwLCAKKzB4MTEsMHg0QywgMHgwMCwweDAwLCAweDExLDB4NjgsIDB4MDAsMHgwMCwgMHgxMiwweDE0LCAweDAwLDB4MDAsIDB4MTEsMHg4NCwgMHgwMCwweDAwLCAKKzB4MTEsMHhCNCwgMHgwMCwweDAwLCAweDExLDB4RTQsIDB4MDAsMHgwMCwgMHgxMiwweDE0LCAweEYzLDB4ODIsIDB4MDAsMHgwNiwgMHhFMCwweDAwLCAKKzB4MTIsMHg1NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjYsMHgwMiwgMHgwMCwweDA1LCAweDIwLDB4MzIsIDB4MDAsMHgxNCwgMHhFNiwweDAwLCAKKzB4MEQsMHhCNSwgMHgyNywweDAwLCAweDAwLDB4MTAsIDB4MjAsMHgzQSwgMHgwMCwweDAxLCAweEUyLDB4MDAsIDB4MEQsMHhCNSwgMHhGNywweDA2LCAKKzB4MkQsMHhDQywgMHhGNiwweDg0LCAweDJFLDB4Q0MsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc1LDB4QjUsIDB4MDAsMHgwMiwgMHhCNiwweDJFLCAKKzB4NzAsMHgwMiwgMHgwNiwweEI0LCAweDAwLDB4MDEsIDB4RjYsMHg4NSwgMHgyRSwweENDLCAweDg2LDB4MDIsIDB4RkYsMHgzNCwgMHhGNywweDA2LCAKKzB4MkUsMHg0QywgMHgyMCwweDM2LCAweDAwLDB4MUYsIDB4RTIsMHgwMCwgMHgwRCwweEI1LCAweEI2LDB4MkUsIDB4NzAsMHgwMiwgMHhGMCwweDA1LCAKKzB4MkUsMHhDQywgMHhGNywweDA0LCAweDJELDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4M0EsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDNBLCAweDAwLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhDMSwweDM4LCAKKzB4MDAsMHgwMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHgxMiwweDYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhFMCwweDAwLCAKKzB4MTIsMHg0MCwgMHhGMywweDgyLCAweDAwLDB4MDYsIDB4RjMsMHg4MiwgMHgwMCwweDBCLCAweEUwLDB4MDAsIDB4MTIsMHg1NCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDcsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAKKzB4MDAsMHgwQiwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDUsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAKKzB4MDAsMHgwNywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDUsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAKKzB4MDAsMHgwQiwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDYsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAKKzB4MDAsMHgwNywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDYsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAKKzB4MDAsMHgwQiwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDUsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAKKzB4MDAsMHgwNywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDUsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAKKzB4MTIsMHg0MCwgMHhGMywweDgyLCAweDAwLDB4MEIsIDB4RTAsMHgwMCwgMHgxMiwweDQwLCAweEYzLDB4ODIsIDB4MDAsMHgwNywgMHhFMCwweDAwLCAKKzB4MTIsMHgyQywgMHhGMywweDgyLCAweDAwLDB4MEIsIDB4RjMsMHg4MiwgMHgwMCwweDBCLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4MTIsMHg0MCwgMHhGMywweDgyLCAKKzB4MDAsMHgwNiwgMHhGMywweDgyLCAweDAwLDB4MDcsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHgxMiwweDQwLCAweEYzLDB4ODIsIDB4MDAsMHgwNiwgMHhFMCwweDAwLCAKKzB4MTIsMHgyQywgMHhGMywweDgyLCAweDAwLDB4MEIsIDB4RjMsMHg4MiwgMHgwMCwweDE0LCAweEUwLDB4MDAsIDB4MTIsMHg1NCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDA1LCAweEUwLDB4MDAsIDB4MTIsMHg1NCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDA2LCAweEUwLDB4MDAsIDB4MTIsMHg1NCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDA1LCAweEUwLDB4MDAsIDB4MTIsMHg1NCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHhFMCwweDAwLCAweDEyLDB4NDAsIDB4RjMsMHg4MiwgMHgwMCwweDE0LCAweEUwLDB4MDAsIDB4MTIsMHgyQywgMHhGMywweDgyLCAKKzB4MDAsMHgxNCwgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHgxMiwweDQwLCAweEYzLDB4ODIsIDB4MDAsMHgwNiwgMHhFMCwweDAwLCAKKzB4MTIsMHgyQywgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4RjMsMHg4MiwgMHgwMCwweDE0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwQiwgMHhFMCwweDAwLCAKKzB4MTIsMHg1NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDE0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwNywgMHhFMCwweDAwLCAKKzB4MTIsMHg1NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDE0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwQiwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAKKzB4MDAsMHgwNSwgMHhFMCwweDAwLCAweDEyLDB4NTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgxNCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAKKzB4MDAsMHgwNywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDUsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAKKzB4MDAsMHgxNCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MEIsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDA2LCAweEUwLDB4MDAsIDB4MTIsMHg1NCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDA3LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwNiwgMHhFMCwweDAwLCAKKzB4MTIsMHg1NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDE0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwQiwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAKKzB4MDAsMHgwNSwgMHhFMCwweDAwLCAweDEyLDB4NTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgxNCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAKKzB4MDAsMHgwNywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDUsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAKKzB4MDAsMHgxNCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhFMCwweDAwLCAweDEyLDB4NDAsIDB4RjMsMHg4MiwgMHgwMCwweDBCLCAweEYzLDB4ODIsIDB4MDAsMHgxNCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAKKzB4MTIsMHg0MCwgMHhGMywweDgyLCAweDAwLDB4MDcsIDB4RjMsMHg4MiwgMHgwMCwweDE0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4MTIsMHgyQywgMHhGMywweDgyLCAKKzB4MDAsMHgwQiwgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDBCLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4MTIsMHg0MCwgMHhGMywweDgyLCAKKzB4MDAsMHgwNiwgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDA3LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4MTIsMHg0MCwgMHhGMywweDgyLCAKKzB4MDAsMHgwNiwgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHgxMiwweDJDLCAweEYzLDB4ODIsIDB4MDAsMHgwQiwgMHhGNywweDA0LCAKKzB4MzUsMHgyOCwgMHhGNiwweDgyLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTMsMHhDQywgMHhGNywweDA1LCAKKzB4MzUsMHg0NCwgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDA3LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwNSwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg5MCwweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAKKzB4RkYsMHhGNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHg5QywgMHgwMCwweDE0LCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAwLCAKKzB4MTIsMHg5RCwgMHhGNywweDA2LCAweDA0LDB4MDAsIDB4RjcsMHgwNCwgMHg2RiwweDVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDZGLDB4NUMsIDB4RjcsMHgwNCwgMHg2RiwweDVDLCAweEUwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4MywweDk2LCAweEZGLDB4RjQsIDB4RjcsMHgwNiwgMHgwNCwweDAwLCAweEMwLDB4MUUsIDB4NzQsMHgwMCwgMHhFNiwweDAwLCAKKzB4MTQsMHgyOSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHgyRSwweEQwLCAweEY2LDB4ODQsIDB4MzUsMHgyNCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxNCwweDA1LCAweEY3LDB4MDUsIDB4MkUsMHhEMCwgMHhGNywweDA0LCAKKzB4RTAsMHgxNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MTQsMHgwNSwgMHhGNiwweDgyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDg1LCAweEUwLDB4MTQsIDB4RjcsMHgwNCwgMHgyRSwweEQ4LCAweEM1LDB4MzQsIDB4MDAsMHgwMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDJFLDB4RDgsIDB4MjAsMHgyQSwgMHgwMCwweDAyLCAweEVFLDB4MDAsIDB4MTMsMHhDQywgMHhGNiwweDgyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDIsIDB4RTYsMHgwMCwgMHgxMywweEEwLCAweDA1LDB4QjQsIDB4MDAsMHgwOCwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHg5NSwweDE2LCAweEZGLDB4RTgsIDB4OTUsMHg5NiwgMHhGRiwweEU0LCAweDk2LDB4OTYsIDB4RkYsMHhFMCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4NjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4MTYsIDB4RkYsMHhFOCwgMHg4NSwweDk2LCAKKzB4RkYsMHhFNCwgMHg4NiwweDk2LCAweEZGLDB4RTAsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MTMsMHg5MCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMCwgMHg4NiwweDM2LCAweDAwLDB4MEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwRiwgMHhFMiwweDAwLCAKKzB4MTMsMHg3NSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHg5NywweDM2LCAweDAwLDB4MTQsIDB4ODcsMHgzNiwgMHgwMCwweDE0LCAweEUwLDB4MDAsIDB4MTMsMHg5MCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHg2MCwweDAwLCAweDc3LDB4MzUsIDB4MDAsMHgwNSwgMHhDNywweDM4LCAKKzB4NkEsMHgwMCwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDEwLCAweEM3LDB4MkMsIDB4NzAsMHgwMCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDEyLDB4MDAsIDB4RjcsMHgwNSwgMHgzNSwweDJDLCAweEY2LDB4ODQsIDB4MzUsMHgyOCwgMHhGNywweDA0LCAKKzB4NkYsMHg0QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4MTMsMHhDMCwgMHgwNywweDM0LCAKKzB4MTQsMHg5NCwgMHhGMywweDg0LCAweDZGLDB4NDQsIDB4RTAsMHgwMCwgMHgxMywweEM0LCAweEYzLDB4ODUsIDB4MzUsMHgyOCwgMHhGNywweDA1LCAKKzB4MzUsMHgyOCwgMHhFMCwweDAwLCAweDEyLDB4RTgsIDB4MDUsMHgyOCwgMHgwMCwweDAxLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MTQsMHgyOSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweEYwLDB4MDUsIDB4MzUsMHgyNCwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4ODIsIDB4MDAsMHgwRCwgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDE0LDB4MjgsIDB4QjMsMHhCQSwgMHg2OCwweDAyLCAweEUwLDB4MDAsIDB4MTQsMHgyOCwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHhGNywweDA0LCAweEUwLDB4MTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MTQsMHgyOSwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4RjcsMHgwNSwgMHhFMCwweDEwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAKKzB4MDIsMHg5OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjQsMHg4NCwgMHgyRCwweDM4LCAweEY3LDB4MDQsIDB4MkQsMHgzQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDRBLDB4MDAsIDB4RTYsMHgwMCwgMHgwQywweDA5LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhBNSwweDNBLCAweDY4LDB4MDIsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MkEsIDB4MDAsMHgxNCwgMHhFNiwweDAwLCAKKzB4MTQsMHg5MSwgMHgyNywweDI4LCAweDAwLDB4MTUsIDB4MjAsMHgzQSwgMHgwMCwweDAxLCAweEUyLDB4MDAsIDB4MTQsMHg5MSwgMHhGNywweDA2LCAKKzB4MkQsMHhDQywgMHhGNiwweDg0LCAweDJFLDB4Q0MsIDB4ODYsMHgwMiwgMHhGRiwweDM0LCAweDc1LDB4QjUsIDB4MDAsMHgwMiwgMHhCNSwweDJFLCAKKzB4NzAsMHgwMiwgMHgwNiwweEI0LCAweDAwLDB4MDEsIDB4RjYsMHg4NSwgMHgyRSwweENDLCAweEY3LDB4MDYsIDB4MkUsMHg0QywgMHgyMCwweDM2LCAKKzB4MDAsMHgxRiwgMHhFMiwweDAwLCAweDE0LDB4OTEsIDB4QjYsMHgyRSwgMHg3MCwweDAyLCAweEYwLDB4MDUsIDB4MkUsMHhDQywgMHhGNywweDA2LCAKKzB4MkQsMHg0NCwgMHg3NiwweEE5LCAweDAwLDB4MDIsIDB4QTcsMHgzNiwgMHg3MCwweDAyLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDNBLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDg3LDB4MzYsIDB4MDAsMHgwNCwgMHg5NCwweDk2LCAKKzB4RkYsMHhFQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4QzEsMHgzOCwgMHgwMCwweDAwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA0LCAKKzB4MkQsMHgzQywgMHg4NCwweDk2LCAweEZGLDB4RUMsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4MTQsMHgyQywgMHhGNywweDA1LCAweDJELDB4M0MsIDB4RTAsMHgwMCwgMHgxNCwweDJDLCAweEYwLDB4MDUsIDB4MkQsMHgzQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg0LDB4MTYsIDB4MDAsMHgwMCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMCwgMHg4NSwweDk2LCAweDAwLDB4MDQsIDB4MjAsMHgzQSwgMHgwMCwweDIxLCAweEVFLDB4MDAsIDB4MTUsMHgzNCwgMHg5NSwweEEyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDA2LCAweDIzLDB4MzgsIDB4MDcsMHgyMCwgMHgwMCwweDg0LCAweEM2LDB4QTAsIDB4MDAsMHgwMCwgMHg5NiwweDNBLCAKKzB4MDAsMHgwNCwgMHgyNywweDM4LCAweDAwLDB4MDQsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEVDLDB4MDAsIDB4MTUsMHgyMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwOCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NiwweDk2LCAKKzB4MDAsMHgwMCwgMHg4NywweDE2LCAweDAwLDB4MDQsIDB4RjYsMHgwNCwgMHgyRCwweDQwLCAweDk3LDB4MzYsIDB4MDAsMHgwMCwgMHg5NywweDM2LCAKKzB4MDAsMHgwNCwgMHgwNywweDMwLCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHgyRCwweDQwLCAweDk2LDB4MzYsIDB4MDAsMHgwOCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA4LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg1LDB4MTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDJBLCAweDAwLDB4MTQsIDB4RTYsMHgwMCwgMHgxNSwweEQ5LCAweDI3LDB4MjgsIDB4MDAsMHgxNSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMSwgMHhFMiwweDAwLCAweDE1LDB4RDksIDB4RjcsMHgwNiwgMHgyRCwweENDLCAweEY2LDB4ODQsIDB4MkUsMHhDQywgMHg4NiwweDAyLCAKKzB4RkYsMHgzNCwgMHg3NSwweEI1LCAweDAwLDB4MDIsIDB4QjUsMHgyRSwgMHg3MCwweDAyLCAweDA2LDB4QjQsIDB4MDAsMHgwMSwgMHhGNiwweDg1LCAKKzB4MkUsMHhDQywgMHhGNywweDA2LCAweDJFLDB4NEMsIDB4MjAsMHgzNiwgMHgwMCwweDFGLCAweEUyLDB4MDAsIDB4MTUsMHhEOSwgMHhCNiwweDJFLCAKKzB4NzAsMHgwMiwgMHhGMCwweDA1LCAweDJFLDB4Q0MsIDB4RjYsMHg4NiwgMHgyRCwweDQ0LCAweDc3LDB4MjksIDB4MDAsMHgwMiwgMHhBNiwweEJBLCAKKzB4NjgsMHgwMiwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHg4NywweDNBLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhDMSwweDM4LCAKKzB4MDAsMHgwMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwNCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHg4NywweDE2LCAweDAwLDB4MDAsIDB4ODYsMHg5NiwgMHgwMCwweDA0LCAweEY2LDB4MDYsIDB4MkQsMHg0NCwgMHg3NiwweEI1LCAKKzB4MDAsMHgwMiwgMHg4NSwweEJBLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEI1LDB4QjYsIDB4NjAsMHgwMiwgMHhDNiwweEI0LCAKKzB4NzAsMHgwMCwgMHg4NSwweDk2LCAweDAwLDB4MDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4QjYsIDB4MDAsMHgwNCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDBDLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg2LDB4MTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDMyLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwRiwgMHg4NiwweEIyLCAKKzB4MDAsMHgwMCwgMHhDNSwweDM4LCAweDAwLDB4MDAsIDB4RUUsMHgwMCwgMHgxNiwweEI0LCAweEM1LDB4QjQsIDB4MDAsMHgwMCwgMHgyMCwweDM2LCAKKzB4MDAsMHgwRiwgMHhFRSwweDAwLCAweDE2LDB4QjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFQywweDAwLCAKKzB4MTYsMHhCNSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEVDLDB4MDAsIDB4MTYsMHhEMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDMyLCAweDAwLDB4MEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDMyLCAKKzB4MDAsMHgwQywgMHg4NywweDMyLCAweDAwLDB4MEMsIDB4RTAsMHgwMCwgMHgxNiwweEQ4LCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHhDMCwweDJBLCAKKzB4NUEsMHgwMCwgMHg0NCwweDBDLCAweDAwLDB4MDEsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwNCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNiwgMHgyRSwweEUwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4MzIsMHhENCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg0OCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDAyLCAweDE4LDB4MkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgwOSwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDJFLDB4RTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwMiwgMHgzNCwweDU4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDAyLCAKKzB4MDAsMHgwQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgyRiwweDZDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4M0YsMHg5NCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MEIsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MkYsMHhGOCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDAyLCAKKzB4M0IsMHg4NCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDBCLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4MzIsMHgyOCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDAyLCAweDI2LDB4RTQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4MDAsMHgxMywgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDMwLDB4ODQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwMiwgMHgyNiwweEEwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDAyLCAKKzB4MDAsMHgxMSwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzMSwweDEwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4MTgsMHgyQywgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MDksIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzEsMHg5QywgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMCwweDA1LCAKKzB4N0EsMHg3OCwgMHhGMCwweDA1LCAweDMyLDB4RTgsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4NTAsIDB4RjcsMHgwNCwgMHg3MSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDE4LDB4NTUsIDB4RjYsMHg4NiwgMHg3MSwweEM0LCAweEUwLDB4MDAsIDB4MTgsMHg2QywgMHhGNiwweDAyLCAKKzB4MDAsMHgwMCwgMHhGNywweDA0LCAweDcxLDB4RDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHg4NiwweDNBLCAweDAwLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MzIsMHhDNCwgMHg4NiwweEIyLCAKKzB4MDAsMHgwOCwgMHgwNywweDAxLCAweDgwLDB4MDAsIDB4QzUsMHhCNCwgMHg3NCwweDAwLCAweEY1LDB4ODUsIDB4MzIsMHhEMCwgMHg4NywweDMyLCAKKzB4MDAsMHgxOCwgMHhGNiwweDg2LCAweDZGLDB4NDQsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEE3LDB4M0EsIDB4NjgsMHgwMiwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhGNywweDA1LCAweDMyLDB4QzAsIDB4MDcsMHgzOCwgMHgwOSwweEQ4LCAweDg2LDB4QjIsIDB4MDAsMHgwNCwgMHhGNywweDA1LCAKKzB4MzIsMHhDQywgMHhFNiwweDAwLCAweDE5LDB4NDEsIDB4RjYsMHg4NSwgMHgzMiwweEM4LCAweEY3LDB4MDQsIDB4NzEsMHg5OCwgMHhGNiwweDg0LCAKKzB4N0EsMHg3OCwgMHgyNywweDM4LCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MTksMHgxMCwgMHhGNywweDA1LCAKKzB4NzEsMHg5OCwgMHhGNywweDA0LCAweDc2LDB4RkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MTgsMHhFOCwgMHhGMywweDAyLCAweDAwLDB4MTEsIDB4RjMsMHgwNiwgMHgzMiwweEQ0LCAweEYzLDB4MDUsIDB4NzYsMHhGQywgMHhFMCwweDAwLCAKKzB4MTgsMHhGOCwgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4RjMsMHgwNSwgMHg3NiwweEY4LCAweEYzLDB4MDYsIDB4MzIsMHhENCwgMHhGMywweDA1LCAKKzB4NzcsMHgwMCwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MTksMHgxNCwgMHhGMywweDAyLCAKKzB4MDAsMHgwMSwgMHhGMywweDA2LCAweDMxLDB4MTAsIDB4RTAsMHgwMCwgMHgyNiwweDhDLCAweEYzLDB4MDUsIDB4MzIsMHhENCwgMHhGMywweDAyLCAKKzB4MDAsMHgwMSwgMHhGMywweDA1LCAweDdBLDB4NzgsIDB4RjMsMHgwNiwgMHgzMCwweDg0LCAweEYzLDB4MDUsIDB4MzIsMHhENCwgMHhGMywweDA0LCAKKzB4MzIsMHhDNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MDYsMHgxMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHgyNiwweDhDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGMywweDAyLCAKKzB4MDAsMHgwMCwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxQywweEI5LCAweDkzLDB4MTYsIDB4RkYsMHhFNCwgMHg4NywweDMyLCAKKzB4MDAsMHgwOCwgMHg4NiwweDk2LCAweEZGLDB4RTQsIDB4QzMsMHgwNCwgMHgwMCwweDAwLCAweEMwLDB4M0EsIDB4MzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4MTksMHg4NCwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDBDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAKKzB4MzIsMHgwMCwgMHhFNiwweDAwLCAweDE5LDB4ODQsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEY2LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDFDLDB4QjgsIDB4RjMsMHgwMiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4MzIsMHhDMCwgMHg5MywweDE2LCAKKzB4RkYsMHhBQywgMHhGNSwweDg0LCAweDMyLDB4QzQsIDB4ODYsMHgzQSwgMHgxNCwweDI4LCAweDAzLDB4QjgsIDB4MTQsMHgyMCwgMHgwNCwweDJDLCAKKzB4MDAsMHgwOCwgMHg4NiwweEJBLCAweDE0LDB4MjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzIsIDB4NkEsMHgwMCwgMHhFQywweDAwLCAKKzB4MUEsMHg3MCwgMHg5NiwweDE2LCAweEZGLDB4RUMsIDB4NzcsMHgzMSwgMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhDNiwweDM4LCAweDM4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDBDLCAweDg2LDB4QjIsIDB4MDAsMHgwMCwgMHg4NywweDJFLCAKKzB4MDAsMHgwOCwgMHg4NSwweDE2LCAweEZGLDB4QUMsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4MUEsMHgwMCwgMHhDNCwweDg0LCAKKzB4MDAsMHgwMCwgMHg4NiwweEIyLCAweDAwLDB4MDQsIDB4ODcsMHgyRSwgMHgwMCwweDBDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDFBLDB4MDQsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEY1LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDJBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDFBLDB4MTEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY0LDB4ODIsIDB4MDAsMHgwMCwgMHg4NiwweEIyLCAKKzB4MDAsMHgwMCwgMHg4NywweDIyLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAKKzB4MUEsMHg0QywgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4MUEsMHg1NCwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHg4NiwweEIyLCAweDAwLDB4MDQsIDB4ODcsMHgyMiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFMiwweDAwLCAweDFBLDB4NTUsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDFBLDB4NjUsIDB4MjAsMHgyNiwgMHgwMCwweDAwLCAweEY0LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDI2LCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDFBLDB4NzAsIDB4RjMsMHgwMiwgMHgwMCwweDAxLCAweDkzLDB4MTYsIDB4RkYsMHhBQywgMHg4MywweDE2LCAKKzB4RkYsMHhBQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgxQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MUEsMHhCMSwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHg4NywweDE2LCAweEZGLDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc2LDB4QjksIDB4MDAsMHgwMSwgMHhDNiwweEI0LCAKKzB4NzAsMHgwMCwgMHg3NiwweEI1LCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHgzOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgxNCwgMHg4NiwweEI2LCAKKzB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4RjAsIDB4RTAsMHgwMCwgMHgxQiwweDE4LCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHgyNywweDE0LCAKKzB4MDAsMHgxNCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTQsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg5MywweDk2LCAKKzB4RkYsMHhCQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNSwweDY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAKKzB4RkYsMHhCQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxQiwweDE1LCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDE2LCAKKzB4RkYsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzYsMHhCOSwgMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg3NiwweEI1LCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDM4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDE0LCAweDg2LDB4QjYsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAKKzB4RkYsMHhGMCwgMHg5NiwweDk2LCAweEZGLDB4RjQsIDB4OTcsMHgxRSwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MUIsMHgxQywgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MUMsMHhCOCwgMHhGMywweDAyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDA0LCAweDMyLDB4QzAsIDB4OTMsMHgxNiwgMHhGRiwweEFDLCAweDg2LDB4QjIsIDB4MTQsMHgyOCwgMHgwMywweEIwLCAKKzB4MTQsMHgyMCwgMHgwNCwweDMwLCAweDE0LDB4OEMsIDB4ODcsMHgzMiwgMHgxNCwweDI0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFQywweDAwLCAweDFDLDB4MDQsIDB4OTYsMHg5NiwgMHhGRiwweEVDLCAweDc3LDB4MzUsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzUsMHhCOCwgMHgzOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwQywgMHg4NiwweEFFLCAKKzB4MDAsMHgwMCwgMHg4NywweDMyLCAweDE0LDB4OEMsIDB4ODUsMHgxNiwgMHhGRiwweEFDLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4MUIsMHg5NCwgMHhDNCwweDg0LCAweDAwLDB4MDAsIDB4ODYsMHhBRSwgMHgwMCwweDA0LCAweDg3LDB4MzIsIDB4MTQsMHg5MCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHgxQiwweDk4LCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxQiwweEE1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMCwgMHg4NiwweEFFLCAweDAwLDB4MDAsIDB4ODcsMHgyMiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFMiwweDAwLCAweDFCLDB4RTAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4MUIsMHhFOCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4ODYsMHhBRSwgMHgwMCwweDA0LCAweDg3LDB4MjIsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHgxQiwweEU5LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxQiwweEY5LCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDI2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxQywweDA0LCAweEYzLDB4MDIsIDB4MDAsMHgwMSwgMHg5MywweDE2LCAKKzB4RkYsMHhBQywgMHg4MywweDE2LCAweEZGLDB4QUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MUEsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MUMsMHg0NSwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgxNiwgMHhGRiwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NiwweEI5LCAKKzB4MDAsMHgwMSwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4MzgsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgxNCwgMHg4NiwweEI2LCAweDAwLDB4MDAsIDB4OTcsMHgxNiwgMHhGRiwweEYwLCAweEUwLDB4MDAsIDB4MUMsMHhBQywgMHg5NiwweDk2LCAKKzB4RkYsMHhGNCwgMHgyNywweDE0LCAweDAwLDB4MTQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk0LDB4MTMsIDB4RkYsMHhGQywgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHg5MywweDk2LCAweEZGLDB4QkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjUsMHg2OCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4QkMsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MUMsMHhBOSwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHg4NywweDE2LCAweEZGLDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc2LDB4QjksIDB4MDAsMHgwMSwgMHhDNiwweEI0LCAKKzB4NzAsMHgwMCwgMHg3NiwweEI1LCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHgzOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgxNCwgMHg4NiwweEI2LCAKKzB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4RjAsIDB4OTYsMHg5NiwgMHhGRiwweEY0LCAweDk3LDB4MUUsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MUMsMHhCMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MUUsMHgxNSwgMHhGMywweDAyLCAweDAwLDB4MDEsIDB4RjYsMHg4NCwgMHgzMiwweEMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NSwweEI2LCAKKzB4MEUsMHhGNCwgMHg4NiwweDM2LCAweDBFLDB4RjgsIDB4MjAsMHgyRSwgMHgwMCwweDEwLCAweEUyLDB4MDAsIDB4MUMsMHhEQywgMHgyMCwweDMyLCAKKzB4MDAsMHgxMCwgMHhFMiwweDAwLCAweDFDLDB4RjksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MEYsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgwRiwweDAwLCAweDg3LDB4MzYsIDB4MEYsMHgwMCwgMHhFMCwweDAwLCAKKzB4MUQsMHgyNCwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4MDcsMHgzMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NUEsMHgwMCwgMHhFNiwweDAwLCAKKzB4MUQsMHgxRCwgMHhGNiwweDgyLCAweDAwLDB4MDAsIDB4MjAsMHgzMiwgMHgwMCwweDEwLCAweEU2LDB4MDAsIDB4MUQsMHgyMCwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDFELDB4MjQsIDB4QzcsMHgzNCwgMHgwMCwweDAwLCAweEY2LDB4ODIsIDB4MDAsMHgwMSwgMHhDNywweDM0LCAKKzB4MDAsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxRSwweDE0LCAweEYzLDB4MDIsIDB4MDAsMHgwMSwgMHhGMywweDA0LCAKKzB4MzIsMHhDQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHgxNiwgMHhGRiwweERDLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDQzLDB4NjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MUQsMHhGQywgMHhGMywweDAyLCAweDAwLDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweERDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweDFBLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDEwLCAweEUyLDB4MDAsIDB4MUQsMHg5MSwgMHg3NiwweEIxLCAKKzB4MDAsMHgwMiwgMHg4NywweDFBLCAweDAwLDB4MEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDFBLCAKKzB4MDAsMHgwQywgMHg4NywweDFBLCAweDAwLDB4MEMsIDB4RTAsMHgwMCwgMHgxRCwweEZDLCAweEYzLDB4MDIsIDB4MDAsMHgwMCwgMHhGMywweDAyLCAKKzB4MDAsMHg0QywgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4QzYsMHhCNCwgMHg2MCwweDAwLCAweDc3LDB4MzUsIDB4MDAsMHgwNCwgMHhDNywweDM4LCAKKzB4NkEsMHgwMCwgMHg4MywweDE2LCAweEZGLDB4REMsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweEM3LDB4MzgsIDB4MzAsMHgwMCwgMHgwNywweDM4LCAKKzB4MDAsMHgxMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjMsMHgwNiwgMHg3QSwweDI4LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg5NiwweDE2LCAKKzB4RkYsMHhCNCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNiwweEY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NiwweDE2LCAKKzB4RkYsMHhCNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgxMSwgMHhFNiwweDAwLCAKKzB4MUQsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDgzLDB4MTYsIDB4RkYsMHhEQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NiwweDFBLCAweDAwLDB4MDAsIDB4RjMsMHgwMiwgMHgwMCwweDAxLCAweDkzLDB4MTYsIDB4RkYsMHhENCwgMHg4MywweDE2LCAKKzB4RkYsMHhENCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgxQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MUUsMHgxOCwgMHhGMywweDAyLCAKKzB4MDAsMHgwMSwgMHg5MywweDE2LCAweEZGLDB4RTQsIDB4ODMsMHgxNiwgMHhGRiwweEU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDFBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDFGLDB4MzUsIDB4RjYsMHg4MiwgMHgwQywweEFCLCAweEY3LDB4MDQsIDB4MzIsMHhCNCwgMHg4MywweDE2LCAKKzB4RkYsMHhENCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHgzMiwweEI0LCAweEY3LDB4MDQsIDB4MzIsMHhCNCwgMHgyMCwweDFBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDFFLDB4NzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4MzIsMHhDMCwgMHhGMywweDA2LCAKKzB4RTAsMHgzMCwgMHhDMCwweDNBLCAweDMyLDB4MDAsIDB4RTYsMHgwMCwgMHgxRSwweDcwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4MzIsMHhFOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4MzIsMHhFOCwgMHhGNywweDA0LCAKKzB4NzEsMHhDNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MUUsMHhBRCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHgwMiwgMHgwMCwweDBBLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4MUUsMHhBQywgMHhCMywweDNBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY3LDB4MDQsIDB4NzEsMHhENCwgMHhGNiwweDg0LCAKKzB4NzEsMHhDQywgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDAsIDB4MUUsMHhDOCwgMHhGNywweDA1LCAKKzB4NzEsMHhENCwgMHhGMCwweDA1LCAweDcxLDB4RDQsIDB4RjYsMHg4NCwgMHg3MSwweEQ0LCAweEY3LDB4MDQsIDB4NzEsMHhEMCwgMHhGMCwweDA1LCAKKzB4NzEsMHhDNCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4MzIsMHhEMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyNSwweEQ5LCAweEY3LDB4MDUsIDB4NzEsMHhDOCwgMHhGNywweDA0LCAKKzB4NzEsMHg5OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MjUsMHg3OSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MjUsMHg3OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDI1LDB4NzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4MjUsMHhEQywgMHhGMywweDA2LCAKKzB4MzEsMHg5QywgMHhGMCwweDA1LCAweDMyLDB4RTgsIDB4RjcsMHgwNCwgMHgzMiwweEMwLCAweEY2LDB4MDQsIDB4NkYsMHg1NCwgMHg5NiwweEJBLCAKKzB4MDAsMHgwNCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxRiwweDYwLCAweEYzLDB4MDIsIDB4MDAsMHgwQywgMHhGMywweDAyLCAKKzB4MDAsMHgwMSwgMHhGMywweDA1LCAweDZGLDB4NTQsIDB4RTAsMHgwMCwgMHgxRiwweDY4LCAweEY3LDB4MDIsIDB4MDAsMHgwMSwgMHhGMywweDA1LCAKKzB4NkYsMHg1OCwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MUYsMHg3QywgMHhGMywweDA2LCAKKzB4MkYsMHg2QywgMHhFMCwweDAwLCAweDI2LDB4OEMsIDB4RjMsMHgwNSwgMHgzMiwweEQ0LCAweEY1LDB4ODQsIDB4N0EsMHg3MCwgMHgyNCwweDk0LCAKKzB4MDAsMHgxMCwgMHgyMCwweDJFLCAweDAwLDB4MDEsIDB4RTYsMHgwMCwgMHgyMiwweDg0LCAweEY1LDB4ODUsIDB4N0EsMHhBMCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMSwgMHhGNiwweDA0LCAweDMyLDB4QzgsIDB4RjcsMHgwNSwgMHg3QSwweDcwLCAweEY3LDB4MDQsIDB4MzIsMHhDNCwgMHhGNiwweDg0LCAKKzB4MzIsMHhDMCwgMHhGNiwweDA1LCAweDdBLDB4MkMsIDB4OTAsMHgwMiwgMHhGRiwweDgwLCAweDkwLDB4MDIsIDB4RkYsMHgzOCwgMHhGNSwweDg0LCAKKzB4N0EsMHgyOCwgMHgwNywweDM4LCAweDAwLDB4MjQsIDB4OTUsMHg4MiwgMHhGRiwweDNDLCAweDk3LDB4MDIsIDB4RkYsMHg0MCwgMHg5NiwweDAyLCAKKzB4RkYsMHg0NCwgMHg4NywweDM2LCAweDE0LDB4MTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg5NywweDM2LCAKKzB4MTQsMHgxMCwgMHg4NywweDM2LCAweDE0LDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MTQsMHgxOCwgMHg4NywweDM2LCAweDE0LDB4MTgsIDB4RjAsMHgwNSwgMHg2RiwweDUwLCAweEY3LDB4MDQsIDB4MzIsMHhCOCwgMHg5NSwweDk2LCAKKzB4RkYsMHhFQywgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4RjcsMHgwNSwgMHgzMiwweEI4LCAweEY3LDB4MDQsIDB4MzIsMHhCQywgMHhGMywweDA2LCAKKzB4MkYsMHhGOCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHgzMiwweEJDLCAweEY3LDB4MDQsIDB4MzIsMHhCQywgMHhGMywweDA1LCAKKzB4MzIsMHhENCwgMHhGNywweDA2LCAweDBDLDB4M0UsIDB4QzAsMHg3RSwgMHg3NCwweDAwLCAweEU2LDB4MDAsIDB4MjAsMHgzNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDdFLCAweDc0LDB4MDAsIDB4RTYsMHgwMCwgMHgyMCwweDI1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA2LCAKKzB4MEMsMHgzRSwgMHhDNywweDdDLCAweDc0LDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDEwLCAweEU2LDB4MDAsIDB4MjYsMHg4QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDMyLDB4RTQsIDB4RkYsMHg4MiwgMHgwMCwweDEwLCAweEY1LDB4ODQsIDB4NkYsMHg1OCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MjEsIDB4RTIsMHgwMCwgMHgyMCwweDkwLCAweEY3LDB4MDUsIDB4MzIsMHhFNCwgMHhGNywweDA0LCAKKzB4MkQsMHgzOCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgyMCwweDg0LCAweEI1LDB4QkEsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHhGMywweDAyLCAweDAwLDB4MjIsIDB4RTAsMHgwMCwgMHgyMCwweDk0LCAweEYzLDB4MDUsIDB4NkYsMHg1OCwgMHhGMCwweDA1LCAKKzB4NkYsMHg1NCwgMHhGNSwweDg0LCAweDMyLDB4QzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkwLDB4MkUsIDB4MDAsMHgwNCwgMHg4NywweDJFLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAyLCAweEU2LDB4MDAsIDB4MjEsMHhDMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDAyLCAweEZGLDB4MzgsIDB4MDMsMHgyQywgMHgwRSwweEY0LCAweDkzLDB4MTYsIDB4RkYsMHhDQywgMHhGNywweDA1LCAKKzB4N0EsMHg2OCwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4OTUsMHg5NiwgMHhGRiwweEI4LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4NDMsMHhBMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHg5NiwgMHhGRiwweEI4LCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MjEsMHg3QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHgyRSwgMHgwRSwweEY4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgxMCwgMHhFMiwweDAwLCAweDIxLDB4MTksIDB4RjMsMHgwMiwgMHgwMCwweDRDLCAweDg3LDB4MkUsIDB4MEYsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgyRSwgMHgwRiwweDAwLCAweDg3LDB4MkUsIDB4MEYsMHgwMCwgMHhFMCwweDAwLCAKKzB4MjEsMHg3QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweEYzLDB4MDYsIDB4N0EsMHgyOCwgMHg5MywweDEzLCAKKzB4RkYsMHhGQywgMHg3NiwweEIxLCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHg2MCwweDAwLCAweDc3LDB4MzUsIDB4MDAsMHgwNCwgMHhDNywweDM4LCAKKzB4NkEsMHgwMCwgMHg4MywweDE2LCAweEZGLDB4Q0MsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweEM3LDB4MzgsIDB4MzAsMHgwMCwgMHgwNywweDM4LCAKKzB4MDAsMHgxMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTUsMHg5NiwgMHhGRiwweEI4LCAweDk2LDB4MTYsIDB4RkYsMHhCNCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI2LDB4RjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg2LDB4MTYsIDB4RkYsMHhCNCwgMHg4NSwweDk2LCAKKzB4RkYsMHhCOCwgMHgwNiwweDMwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDExLCAweEU2LDB4MDAsIDB4MjEsMHg3OCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4OTYsMHgyRSwgMHgwRSwweEY4LCAweEY3LDB4MDQsIDB4MzIsMHhDMCwgMHhGMywweDA2LCAKKzB4RTAsMHgzMCwgMHhDMCwweDNBLCAweDMyLDB4MDAsIDB4RTYsMHgwMCwgMHgyMSwweEMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4RTAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhCOCwgMHgwMCwweDFFLCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAwLCAKKzB4MjEsMHhDMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MEYsMHg4MSwgMHg0MCwweDAwLCAweEY3LDB4MDQsIDB4NzksMHhDOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3OSwweEM4LCAweEY3LDB4MDQsIDB4NzksMHhDOCwgMHhGNywweDA0LCAKKzB4NzEsMHhDNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MjEsMHhGRCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHgwMiwgMHgwMCwweDBBLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4MjEsMHhGQywgMHhCMywweDNBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY3LDB4MDQsIDB4NzEsMHhENCwgMHhGNiwweDg0LCAKKzB4NzEsMHhDQywgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDAsIDB4MjIsMHgxOCwgMHhGNywweDA1LCAKKzB4NzEsMHhENCwgMHhGMCwweDA1LCAweDcxLDB4RDQsIDB4RjYsMHg4NCwgMHg3MSwweEQ0LCAweEY3LDB4MDQsIDB4NzEsMHhEMCwgMHhGMCwweDA1LCAKKzB4NzEsMHhDNCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4MzIsMHhEMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyNSwweEQ5LCAweEY3LDB4MDUsIDB4NzEsMHhDOCwgMHhGNywweDA0LCAKKzB4NzEsMHg5OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MjUsMHg3OSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MjUsMHg3OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDI1LDB4NzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4MjUsMHhEQywgMHhGMywweDA2LCAKKzB4MzEsMHg5QywgMHhGMCwweDA1LCAweDdBLDB4ODgsIDB4OTAsMHgwMiwgMHhGRiwweDM4LCAweEYwLDB4MDUsIDB4NkYsMHg1MCwgMHg5MCwweDAyLCAKKzB4RkYsMHg4MCwgMHhGNywweDA0LCAweDMyLDB4QzQsIDB4RjMsMHgwNiwgMHgzMiwweDI4LCAweEYzLDB4MDUsIDB4MzIsMHhENCwgMHhGNiwweDA0LCAKKzB4MzIsMHhDOCwgMHhGNiwweDg0LCAweDdBLDB4MkMsIDB4RjUsMHgwMiwgMHgwMCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgyNCwgMHhGNywweDA1LCAKKzB4N0EsMHg5OCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyMiwweEQ1LCAweEY2LDB4MDUsIDB4N0EsMHg5MCwgMHhDMCwweDJBLCAKKzB4NUEsMHgwMCwgMHhFNiwweDAwLCAweDI2LDB4MjAsIDB4QzAsMHgzMiwgMHg2QSwweDAwLCAweEVFLDB4MDAsIDB4MjYsMHgyMSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNiwweDg0LCAweDMyLDB4QzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MTQsMHgxMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4OTcsMHgzNiwgMHgxNCwweDEwLCAweDg3LDB4MzYsIDB4MTQsMHgxOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgxNCwweDE4LCAweDg3LDB4MzYsIDB4MTQsMHgxOCwgMHhGNywweDA0LCAKKzB4MzIsMHhCOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweEY3LDB4MDUsIDB4MzIsMHhCOCwgMHhGNywweDA0LCAKKzB4MzIsMHhCQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4MzIsMHhCQywgMHhGNywweDA0LCAKKzB4MzIsMHhCQywgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyMywweDQ1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4MzIsMHhFMCwgMHhGNSwweDA1LCAweDdBLDB4NzAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4MjMsMHg0OCwgMHhGNywweDA1LCAKKzB4MzIsMHhFMCwgMHhGNSwweDA1LCAweDdBLDB4NzAsIDB4RjUsMHg4NCwgMHg2RiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAKKzB4MDAsMHgyMSwgMHhFMiwweDAwLCAweDIzLDB4OEMsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDIzLDB4ODAsIDB4QjUsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGMywweDAyLCAKKzB4MDAsMHgyMiwgMHhFMCwweDAwLCAweDIzLDB4OTAsIDB4RjMsMHgwNSwgMHg2RiwweDU4LCAweEYwLDB4MDUsIDB4NkYsMHg1NCwgMHhGNSwweDg0LCAKKzB4MzIsMHhDMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTAsMHgyRSwgMHgwMCwweDA0LCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDIsIDB4RTYsMHgwMCwgMHgyNCwweEJDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDAyLCAKKzB4RkYsMHgzOCwgMHgwMywweDJDLCAweDBFLDB4RjQsIDB4OTMsMHgxNiwgMHhGRiwweEM0LCAweEY3LDB4MDUsIDB4N0EsMHg2OCwgMHg5MywweDEzLCAKKzB4RkYsMHhGQywgMHg5NSwweDk2LCAweEZGLDB4QjgsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NDMsMHhBMCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NSwweDk2LCAweEZGLDB4QjgsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MjQsMHg3OCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NiwweDJFLCAweDBFLDB4RjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgxMCwgMHhFMiwweDAwLCAKKzB4MjQsMHgxNSwgMHhGMywweDAyLCAweDAwLDB4NEMsIDB4ODcsMHgyRSwgMHgwRiwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHg5NywweDJFLCAweDBGLDB4MDAsIDB4ODcsMHgyRSwgMHgwRiwweDAwLCAweEUwLDB4MDAsIDB4MjQsMHg3OCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4RjMsMHgwNiwgMHg3QSwweDI4LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg3NiwweEIxLCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDYwLDB4MDAsIDB4NzcsMHgzNSwgMHgwMCwweDA0LCAweEM3LDB4MzgsIDB4NkEsMHgwMCwgMHg4MywweDE2LCAKKzB4RkYsMHhDNCwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4QzcsMHgzOCwgMHgzMCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgxMCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHg5NSwweDk2LCAweEZGLDB4QjgsIDB4OTYsMHgxNiwgMHhGRiwweEI0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAKKzB4MjYsMHhGOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODYsMHgxNiwgMHhGRiwweEI0LCAweDg1LDB4OTYsIDB4RkYsMHhCOCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MTEsIDB4RTYsMHgwMCwgMHgyNCwweDc0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMCwgMHg5NiwweDJFLCAweDBFLDB4RjgsIDB4RjcsMHgwNCwgMHgzMiwweEMwLCAweEYzLDB4MDYsIDB4RTAsMHgzMCwgMHhDMCwweDNBLCAKKzB4MzIsMHgwMCwgMHhFNiwweDAwLCAweDI0LDB4QkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4RTAsMHgxOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NywweEI4LCAweDAwLDB4MUUsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDAsIDB4MjQsMHhCRCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwRiwweDgxLCAweDQwLDB4MDAsIDB4RjcsMHgwNCwgMHg3OSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDc5LDB4QzgsIDB4RjcsMHgwNCwgMHg3OSwweEM4LCAweEY3LDB4MDQsIDB4NzEsMHhDNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyNCwweEY5LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAKKzB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhGMywweDAyLCAweDAwLDB4MEEsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4MjQsMHhGOCwgMHhCMywweDNBLCAKKzB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjcsMHgwNCwgMHg3MSwweEQ0LCAweEY2LDB4ODQsIDB4NzEsMHhDQywgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDZBLDB4MDAsIDB4RTYsMHgwMCwgMHgyNSwweDE0LCAweEY3LDB4MDUsIDB4NzEsMHhENCwgMHhGMCwweDA1LCAKKzB4NzEsMHhENCwgMHhGNiwweDg0LCAweDcxLDB4RDQsIDB4RjcsMHgwNCwgMHg3MSwweEQwLCAweEYwLDB4MDUsIDB4NzEsMHhDNCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4RjYsMHg4NCwgMHgzMiwweEQwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDI1LDB4RDksIDB4RjcsMHgwNSwgMHg3MSwweEM4LCAweEY3LDB4MDQsIDB4NzEsMHg5OCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyNSwweDc5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NzUsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MjUsMHg3OCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MjUsMHhEMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjUsMHg4NCwgMHg3NiwweEY4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAKKzB4MDAsMHgyMSwgMHhFMiwweDAwLCAweDI1LDB4QzQsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDI1LDB4QjAsIDB4QjUsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGMywweDAyLCAKKzB4MDAsMHgyMiwgMHhGMywweDA1LCAweDc2LDB4RjgsIDB4RjMsMHgwNCwgMHg3NywweDAwLCAweEUwLDB4MDAsIDB4MjUsMHhDOCwgMHhGMywweDA1LCAKKzB4NzYsMHhGQywgMHhGMCwweDA1LCAweDc2LDB4RkMsIDB4RTAsMHgwMCwgMHgyNSwweEQ4LCAweEYwLDB4MDUsIDB4N0EsMHg3OCwgMHhFMCwweDAwLCAKKzB4MjUsMHhEQywgMHhGMywweDA2LCAweDMxLDB4OUMsIDB4RjMsMHgwNiwgMHgyRSwweEUwLCAweEYzLDB4MDUsIDB4MzIsMHhENCwgMHhGNywweDA0LCAKKzB4NzEsMHhDOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MjYsMHg4QywgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHgwMiwgMHgwMCwweDA5LCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4MjYsMHg4QywgMHhCMywweDNBLCAweDY4LDB4MDIsIDB4RTAsMHgwMCwgMHgyNiwweDhDLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNywweDA0LCAKKzB4N0EsMHg5MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEVFLDB4MDAsIDB4MjYsMHg0MSwgMHhDNSwweEI0LCAKKzB4MDAsMHgwMCwgMHhDNywweDM4LCAweDVBLDB4MDAsIDB4RTAsMHgwMCwgMHgyNiwweDQ4LCAweEY3LDB4MDUsIDB4N0EsMHg5MCwgMHhDNSwweEI4LCAKKzB4MDAsMHgwMCwgMHhGMCwweDA1LCAweDdBLDB4OTAsIDB4RjYsMHg4NCwgMHg3QSwweDg4LCAweEY3LDB4MDYsIDB4N0EsMHgyOCwgMHg3NiwweDM1LCAKKzB4MDAsMHgwMywgMHhBNywweDMyLCAweDcwLDB4MDIsIDB4MDYsMHhCNCwgMHgwMCwweDAxLCAweDk3LDB4MTYsIDB4RkYsMHhFQywgMHg4NCwweEE2LCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDdBLDB4MkMsIDB4RjMsMHgwNCwgMHg3QSwweDk4LCAweDk0LDB4ODIsIDB4RkYsMHgzQywgMHg5MywweDAyLCAKKzB4RkYsMHg0MCwgMHg5NSwweDgyLCAweEZGLDB4NDQsIDB4QjUsMHhCMiwgMHg3MCwweDAyLCAweEY3LDB4MDQsIDB4N0EsMHg5OCwgMHhGNiwweDg1LCAKKzB4N0EsMHg4OCwgMHhDNywweDM4LCAweDU4LDB4MDAsIDB4RjcsMHgwNSwgMHg3QSwweDk4LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4N0EsMHg3OCwgMHhGNywweDA2LCAKKzB4MzAsMHg4NCwgMHhGNywweDA1LCAweDMyLDB4RDQsIDB4RjcsMHgwNCwgMHgzMiwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgwNiwweDEwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHg1MCwgMHhGNywweDA0LCAKKzB4MzIsMHhEMCwgMHhGMywweDAyLCAweDAwLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MkEsMHg3MSwgMHg5MywweDE2LCAKKzB4RkYsMHhFNCwgMHhGNiwweDg0LCAweDMyLDB4QzQsIDB4ODYsMHgxNiwgMHhGRiwweEU0LCAweDg3LDB4MzYsIDB4MDAsMHgwOCwgMHhDMywweDA0LCAKKzB4MDAsMHgwMCwgMHhDMCwweDNBLCAweDMyLDB4MDAsIDB4RTYsMHgwMCwgMHgyNywweDNDLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHg4NywweDM2LCAKKzB4MDAsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHgzMiwweDAwLCAweEU2LDB4MDAsIDB4MjcsMHgzQywgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MkEsMHg3MCwgMHhGMywweDAyLCAKKzB4MDAsMHgwMCwgMHhGNywweDA0LCAweDMyLDB4QzAsIDB4OTMsMHgxNiwgMHhGRiwweEFDLCAweEY1LDB4ODQsIDB4MzIsMHhDNCwgMHg4NiwweDNBLCAKKzB4MTQsMHgyOCwgMHgwMywweEI4LCAweDE0LDB4MjAsIDB4MDQsMHgyQywgMHgwMCwweDA4LCAweDg2LDB4QkEsIDB4MTQsMHgyNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDMyLCAweDZBLDB4MDAsIDB4RUMsMHgwMCwgMHgyOCwweDI4LCAweDk2LDB4MTYsIDB4RkYsMHhFQywgMHg3NywweDMxLCAKKzB4MDAsMHgwMSwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEM2LDB4MzgsIDB4MzgsMHgwMCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwQywgMHg4NiwweEIyLCAweDAwLDB4MDAsIDB4ODcsMHgyRSwgMHgwMCwweDA4LCAweDg1LDB4MTYsIDB4RkYsMHhBQywgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDI3LDB4QjgsIDB4QzQsMHg4NCwgMHgwMCwweDAwLCAweDg2LDB4QjIsIDB4MDAsMHgwNCwgMHg4NywweDJFLCAKKzB4MDAsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4MjcsMHhCQywgMHgyMCwweDJBLCAKKzB4MDAsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MjcsMHhDOSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNCwweDgyLCAweDAwLDB4MDAsIDB4ODYsMHhCMiwgMHgwMCwweDAwLCAweDg3LDB4MjIsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHgyOCwweDA0LCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDI4LDB4MEMsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweDg2LDB4QjIsIDB4MDAsMHgwNCwgMHg4NywweDIyLCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4MjgsMHgwRCwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MjgsMHgxRCwgMHgyMCwweDI2LCAKKzB4MDAsMHgwMCwgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MjgsMHgyOCwgMHhGMywweDAyLCAKKzB4MDAsMHgwMSwgMHg5MywweDE2LCAweEZGLDB4QUMsIDB4ODMsMHgxNiwgMHhGRiwweEFDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDFBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDI4LDB4NjksIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIDB4RkYsMHhFQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NiwweEI5LCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAKKzB4MzgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTQsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhGMCwgMHhFMCwweDAwLCAKKzB4MjgsMHhEMCwgMHg5NiwweDk2LCAweEZGLDB4RjQsIDB4MjcsMHgxNCwgMHgwMCwweDE0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg5NCwweDEzLCAKKzB4RkYsMHhGQywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4OTMsMHg5NiwgMHhGRiwweEJDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAKKzB4MjUsMHg2OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweEJDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MjgsMHhDRCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgxNiwgMHhGRiwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NiwweEI5LCAKKzB4MDAsMHgwMSwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4MzgsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgxNCwgMHg4NiwweEI2LCAweDAwLDB4MDAsIDB4OTcsMHgxNiwgMHhGRiwweEYwLCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHg5NywweDFFLCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDI4LDB4RDQsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDJBLDB4NzAsIDB4RjMsMHgwMiwgMHgwMCwweDAwLCAweEY2LDB4MDQsIDB4MzIsMHhDMCwgMHg5MywweDE2LCAKKzB4RkYsMHhBQywgMHg4NiwweEIyLCAweDE0LDB4MjgsIDB4MDMsMHhCMCwgMHgxNCwweDIwLCAweDA0LDB4MzAsIDB4MTQsMHg4QywgMHg4NywweDMyLCAKKzB4MTQsMHgyNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEVDLDB4MDAsIDB4MjksMHhCQywgMHg5NiwweDk2LCAKKzB4RkYsMHhFQywgMHg3NywweDM1LCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhDNSwweEI4LCAKKzB4MzgsMHgwMCwgMHgwNSwweEFDLCAweDAwLDB4MEMsIDB4ODYsMHhBRSwgMHgwMCwweDAwLCAweDg3LDB4MzIsIDB4MTQsMHg4QywgMHg4NSwweDE2LCAKKzB4RkYsMHhBQywgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHgyOSwweDRDLCAweEM0LDB4ODQsIDB4MDAsMHgwMCwgMHg4NiwweEFFLCAKKzB4MDAsMHgwNCwgMHg4NywweDMyLCAweDE0LDB4OTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4MjksMHg1MCwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RjUsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MjksMHg1RCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjQsMHg4MiwgMHgwMCwweDAwLCAweDg2LDB4QUUsIDB4MDAsMHgwMCwgMHg4NywweDIyLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4MjksMHg5OCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHgyOSwweEEwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHg4NiwweEFFLCAKKzB4MDAsMHgwNCwgMHg4NywweDIyLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAKKzB4MjksMHhBMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MjksMHhCMSwgMHgyMCwweDI2LCAweDAwLDB4MDAsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MjksMHhCQywgMHhGMywweDAyLCAweDAwLDB4MDEsIDB4OTMsMHgxNiwgMHhGRiwweEFDLCAweDgzLDB4MTYsIDB4RkYsMHhBQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDFBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyOSwweEZELCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDE2LCAKKzB4RkYsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzYsMHhCOSwgMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg3NiwweEI1LCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDM4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDE0LCAweDg2LDB4QjYsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAKKzB4RkYsMHhGMCwgMHhFMCwweDAwLCAweDJBLDB4NjQsIDB4OTYsMHg5NiwgMHhGRiwweEY0LCAweDI3LDB4MTQsIDB4MDAsMHgxNCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHg5NCwweDEzLCAweEZGLDB4RkMsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDkzLDB4OTYsIDB4RkYsMHhCQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI1LDB4NjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHhCQywgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDJBLDB4NjEsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIDB4RkYsMHhFQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NiwweEI5LCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAKKzB4MzgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTQsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhGMCwgMHg5NiwweDk2LCAKKzB4RkYsMHhGNCwgMHg5NywweDFFLCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgyQSwweDY4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyQiwweENELCAweEYzLDB4MDIsIDB4MDAsMHgwMSwgMHhGNiwweDg0LCAKKzB4MzIsMHhDMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODUsMHhCNiwgMHgwRSwweEY0LCAweDg2LDB4MzYsIDB4MEUsMHhGOCwgMHgyMCwweDJFLCAKKzB4MDAsMHgxMCwgMHhFMiwweDAwLCAweDJBLDB4OTQsIDB4MjAsMHgzMiwgMHgwMCwweDEwLCAweEUyLDB4MDAsIDB4MkEsMHhCMSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDBGLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MEYsMHgwMCwgMHg4NywweDM2LCAweDBGLDB4MDAsIDB4RTAsMHgwMCwgMHgyQSwweERDLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHgwNywweDMwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDVBLDB4MDAsIDB4RTYsMHgwMCwgMHgyQSwweEQ1LCAweEY2LDB4ODIsIDB4MDAsMHgwMCwgMHgyMCwweDMyLCAKKzB4MDAsMHgxMCwgMHhFNiwweDAwLCAweDJBLDB4RDgsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MkEsMHhEQywgMHhDNywweDM0LCAKKzB4MDAsMHgwMCwgMHhGNiwweDgyLCAweDAwLDB4MDEsIDB4QzcsMHgzNCwgMHgwMCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MkIsMHhDQywgMHhGMywweDAyLCAweDAwLDB4MDEsIDB4RjMsMHgwNCwgMHgzMiwweENDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDE2LCAKKzB4RkYsMHhEQywgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NDMsMHg2OCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyQiwweEI0LCAweEYzLDB4MDIsIDB4MDAsMHgwMCwgMHg4MywweDE2LCAKKzB4RkYsMHhEQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHgxQSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgxMCwgMHhFMiwweDAwLCAweDJCLDB4NDksIDB4NzYsMHhCMSwgMHgwMCwweDAyLCAweDg3LDB4MUEsIDB4MDAsMHgwQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgxQSwgMHgwMCwweDBDLCAweDg3LDB4MUEsIDB4MDAsMHgwQywgMHhFMCwweDAwLCAKKzB4MkIsMHhCNCwgMHhGMywweDAyLCAweDAwLDB4MDAsIDB4RjMsMHgwMiwgMHgwMCwweDRDLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHhDNiwweEI0LCAKKzB4NjAsMHgwMCwgMHg3NywweDM1LCAweDAwLDB4MDQsIDB4QzcsMHgzOCwgMHg2QSwweDAwLCAweDgzLDB4MTYsIDB4RkYsMHhEQywgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHhDNywweDM4LCAweDMwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDEwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGMywweDA2LCAKKzB4N0EsMHgyOCwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4OTYsMHgxNiwgMHhGRiwweEI0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAKKzB4MjYsMHhGOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODYsMHgxNiwgMHhGRiwweEI0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MTEsIDB4RTYsMHgwMCwgMHgyQiwweEE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMCwgMHg4MywweDE2LCAweEZGLDB4REMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk2LDB4MUEsIDB4MDAsMHgwMCwgMHhGMywweDAyLCAKKzB4MDAsMHgwMSwgMHg5MywweDE2LCAweEZGLDB4RDQsIDB4ODMsMHgxNiwgMHhGRiwweEQ0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDFBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDJCLDB4RDAsIDB4RjMsMHgwMiwgMHgwMCwweDAxLCAweDkzLDB4MTYsIDB4RkYsMHhFNCwgMHg4MywweDE2LCAKKzB4RkYsMHhFNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgxQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MkMsMHhFRCwgMHhGNiwweDgyLCAKKzB4MEMsMHhBQiwgMHhGNywweDA0LCAweDMyLDB4QjQsIDB4ODMsMHgxNiwgMHhGRiwweEQ0LCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4MzIsMHhCNCwgMHhGNywweDA0LCAweDMyLDB4QjQsIDB4MjAsMHgxQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MkMsMHgyOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDMyLDB4QzAsIDB4RjMsMHgwNiwgMHhFMCwweDMwLCAweEMwLDB4M0EsIDB4MzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4MkMsMHgyOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHgzMiwweEU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDMyLDB4RTgsIDB4RjcsMHgwNCwgMHg3MSwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDJDLDB4NjUsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDAyLCAKKzB4MDAsMHgwQSwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgyQywweDY0LCAweEIzLDB4M0EsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHhGNywweDA0LCAweDcxLDB4RDQsIDB4RjYsMHg4NCwgMHg3MSwweENDLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAKKzB4NkEsMHgwMCwgMHhFNiwweDAwLCAweDJDLDB4ODAsIDB4RjcsMHgwNSwgMHg3MSwweEQ0LCAweEYwLDB4MDUsIDB4NzEsMHhENCwgMHhGNiwweDg0LCAKKzB4NzEsMHhENCwgMHhGNywweDA0LCAweDcxLDB4RDAsIDB4RjAsMHgwNSwgMHg3MSwweEM0LCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHhGNiwweDg0LCAweDMyLDB4RDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MzMsMHg5MSwgMHhGNywweDA1LCAweDcxLDB4QzgsIDB4RjcsMHgwNCwgMHg3MSwweDk4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDMzLDB4MzEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhFQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgzMywweDMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NzUsMHhGMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MzMsMHgzMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDMzLDB4OTQsIDB4RjMsMHgwNiwgMHgzMSwweDlDLCAweEYwLDB4MDUsIDB4MzIsMHhFOCwgMHhGNywweDA0LCAKKzB4MzIsMHhDMCwgMHhGNiwweDA0LCAweDZGLDB4NTQsIDB4OTYsMHhCQSwgMHgwMCwweDA0LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MkQsMHgxOCwgMHhGMywweDAyLCAweDAwLDB4MEMsIDB4RjMsMHgwMiwgMHgwMCwweDAxLCAweEYzLDB4MDUsIDB4NkYsMHg1NCwgMHhFMCwweDAwLCAKKzB4MkQsMHgyMCwgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4RjMsMHgwNSwgMHg2RiwweDU4LCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDJELDB4MzQsIDB4RjMsMHgwNiwgMHgyRiwweDZDLCAweEUwLDB4MDAsIDB4MzQsMHg0NCwgMHhGMywweDA1LCAKKzB4MzIsMHhENCwgMHhGNSwweDg0LCAweDdBLDB4NzAsIDB4MjQsMHg5NCwgMHgwMCwweDEwLCAweDIwLDB4MkUsIDB4MDAsMHgwMSwgMHhFNiwweDAwLCAKKzB4MzAsMHgzQywgMHhGNSwweDg1LCAweDdBLDB4QTAsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweEY2LDB4MDQsIDB4MzIsMHhDOCwgMHhGNywweDA1LCAKKzB4N0EsMHg3MCwgMHhGNywweDA0LCAweDMyLDB4QzQsIDB4RjYsMHg4NCwgMHgzMiwweEMwLCAweEY2LDB4MDUsIDB4N0EsMHgyQywgMHg5MCwweDAyLCAKKzB4RkYsMHg4MCwgMHg5MCwweDAyLCAweEZGLDB4MzgsIDB4RjUsMHg4NCwgMHg3QSwweDI4LCAweDA3LDB4MzgsIDB4MDAsMHgyNCwgMHg5NSwweDgyLCAKKzB4RkYsMHgzQywgMHg5NywweDAyLCAweEZGLDB4NDAsIDB4OTYsMHgwMiwgMHhGRiwweDQ0LCAweDg3LDB4MzYsIDB4MTQsMHgxMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4OTcsMHgzNiwgMHgxNCwweDEwLCAweDg3LDB4MzYsIDB4MTQsMHgxOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgxNCwweDE4LCAweDg3LDB4MzYsIDB4MTQsMHgxOCwgMHhGMCwweDA1LCAKKzB4NkYsMHg1MCwgMHhGNywweDA0LCAweDMyLDB4QjgsIDB4OTUsMHg5NiwgMHhGRiwweEVDLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHhGNywweDA1LCAKKzB4MzIsMHhCOCwgMHhGNywweDA0LCAweDMyLDB4QkMsIDB4RjMsMHgwNiwgMHgyRiwweEY4LCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4MzIsMHhCQywgMHhGNywweDA0LCAweDMyLDB4QkMsIDB4RjMsMHgwNSwgMHgzMiwweEQ0LCAweEY3LDB4MDYsIDB4MEMsMHgzRSwgMHhDMCwweDdFLCAKKzB4NzQsMHgwMCwgMHhFNiwweDAwLCAweDJELDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4N0UsIDB4NzQsMHgwMCwgMHhFNiwweDAwLCAKKzB4MkQsMHhERCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNiwgMHgwQywweDNFLCAweEM3LDB4N0MsIDB4NzQsMHgwMCwgMHgyMCwweDNBLCAKKzB4MDAsMHgxMCwgMHhFNiwweDAwLCAweDM0LDB4NDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4MzIsMHhFNCwgMHhGRiwweDgyLCAKKzB4MDAsMHgxMCwgMHhGNSwweDg0LCAweDZGLDB4NTgsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgyMSwgMHhFMiwweDAwLCAKKzB4MkUsMHg0OCwgMHhGNywweDA1LCAweDMyLDB4RTQsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4MkUsMHgzQywgMHhCNSwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEYzLDB4MDIsIDB4MDAsMHgyMiwgMHhFMCwweDAwLCAKKzB4MkUsMHg0QywgMHhGMywweDA1LCAweDZGLDB4NTgsIDB4RjAsMHgwNSwgMHg2RiwweDU0LCAweEY1LDB4ODQsIDB4MzIsMHhDMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MCwweDJFLCAweDAwLDB4MDQsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMiwgMHhFNiwweDAwLCAweDJGLDB4NzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MDIsIDB4RkYsMHgzOCwgMHgwMywweDJDLCAKKzB4MEUsMHhGNCwgMHg5MywweDE2LCAweEZGLDB4Q0MsIDB4RjcsMHgwNSwgMHg3QSwweDY4LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg5NSwweDk2LCAKKzB4RkYsMHhCOCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg0MywweEEwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDk2LCAKKzB4RkYsMHhCOCwgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyRiwweDM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweDJFLCAKKzB4MEUsMHhGOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDEwLCAweEUyLDB4MDAsIDB4MkUsMHhEMSwgMHhGMywweDAyLCAKKzB4MDAsMHg0QywgMHg4NywweDJFLCAweDBGLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDJFLCAKKzB4MEYsMHgwMCwgMHg4NywweDJFLCAweDBGLDB4MDAsIDB4RTAsMHgwMCwgMHgyRiwweDM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDEzLCAKKzB4RkYsMHhGQywgMHhGMywweDA2LCAweDdBLDB4MjgsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDc2LDB4QjEsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAKKzB4NjAsMHgwMCwgMHg3NywweDM1LCAweDAwLDB4MDQsIDB4QzcsMHgzOCwgMHg2QSwweDAwLCAweDgzLDB4MTYsIDB4RkYsMHhDQywgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHhDNywweDM4LCAweDMwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDEwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg5NSwweDk2LCAKKzB4RkYsMHhCOCwgMHg5NiwweDE2LCAweEZGLDB4QjQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjYsMHhGOCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NiwweDE2LCAweEZGLDB4QjQsIDB4ODUsMHg5NiwgMHhGRiwweEI4LCAweDA2LDB4MzAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgxMSwgMHhFNiwweDAwLCAweDJGLDB4MzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHg5NiwweDJFLCAKKzB4MEUsMHhGOCwgMHhGNywweDA0LCAweDMyLDB4QzAsIDB4RjMsMHgwNiwgMHhFMCwweDMwLCAweEMwLDB4M0EsIDB4MzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4MkYsMHg3OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHhFMCwweDE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEI4LCAKKzB4MDAsMHgxRSwgMHg3MCwweDNFLCAweEZGLDB4RTEsIDB4RTYsMHgwMCwgMHgyRiwweDc5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwRiwweDgxLCAKKzB4NDAsMHgwMCwgMHhGNywweDA0LCAweDc5LDB4QzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4NzksMHhDOCwgMHhGNywweDA0LCAweDc5LDB4QzgsIDB4RjcsMHgwNCwgMHg3MSwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDJGLDB4QjUsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDAyLCAKKzB4MDAsMHgwQSwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgyRiwweEI0LCAweEIzLDB4M0EsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHhGNywweDA0LCAweDcxLDB4RDQsIDB4RjYsMHg4NCwgMHg3MSwweENDLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAKKzB4NkEsMHgwMCwgMHhFNiwweDAwLCAweDJGLDB4RDAsIDB4RjcsMHgwNSwgMHg3MSwweEQ0LCAweEYwLDB4MDUsIDB4NzEsMHhENCwgMHhGNiwweDg0LCAKKzB4NzEsMHhENCwgMHhGNywweDA0LCAweDcxLDB4RDAsIDB4RjAsMHgwNSwgMHg3MSwweEM0LCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHhGNiwweDg0LCAweDMyLDB4RDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MzMsMHg5MSwgMHhGNywweDA1LCAweDcxLDB4QzgsIDB4RjcsMHgwNCwgMHg3MSwweDk4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDMzLDB4MzEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhFQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgzMywweDMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NzUsMHhGMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MzMsMHgzMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDMzLDB4OTQsIDB4RjMsMHgwNiwgMHgzMSwweDlDLCAweEYwLDB4MDUsIDB4N0EsMHg4OCwgMHg5MCwweDAyLCAKKzB4RkYsMHgzOCwgMHhGMCwweDA1LCAweDZGLDB4NTAsIDB4OTAsMHgwMiwgMHhGRiwweDgwLCAweEY3LDB4MDQsIDB4MzIsMHhDNCwgMHhGMywweDA2LCAKKzB4MzIsMHgyOCwgMHhGMywweDA1LCAweDMyLDB4RDQsIDB4RjYsMHgwNCwgMHgzMiwweEM4LCAweEY2LDB4ODQsIDB4N0EsMHgyQywgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MjQsIDB4RjcsMHgwNSwgMHg3QSwweDk4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MzAsMHg4RCwgMHhGNiwweDA1LCAweDdBLDB4OTAsIDB4QzAsMHgyQSwgMHg1QSwweDAwLCAweEU2LDB4MDAsIDB4MzMsMHhEOCwgMHhDMCwweDMyLCAKKzB4NkEsMHgwMCwgMHhFRSwweDAwLCAweDMzLDB4RDksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4MzIsMHhDMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDE0LDB4MTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg5NywweDM2LCAKKzB4MTQsMHgxMCwgMHg4NywweDM2LCAweDE0LDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MTQsMHgxOCwgMHg4NywweDM2LCAweDE0LDB4MTgsIDB4RjcsMHgwNCwgMHgzMiwweEI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHhGNywweDA1LCAweDMyLDB4QjgsIDB4RjcsMHgwNCwgMHgzMiwweEJDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDMyLDB4QkMsIDB4RjcsMHgwNCwgMHgzMiwweEJDLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MzAsMHhGRCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHgzMiwweEUwLCAweEY1LDB4MDUsIDB4N0EsMHg3MCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDMxLDB4MDAsIDB4RjcsMHgwNSwgMHgzMiwweEUwLCAweEY1LDB4MDUsIDB4N0EsMHg3MCwgMHhGNSwweDg0LCAKKzB4NkYsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIDB4MzEsMHg0NCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4MzEsMHgzOCwgMHhCNSwweEJBLCAKKzB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjMsMHgwMiwgMHgwMCwweDIyLCAweEUwLDB4MDAsIDB4MzEsMHg0OCwgMHhGMywweDA1LCAKKzB4NkYsMHg1OCwgMHhGMCwweDA1LCAweDZGLDB4NTQsIDB4RjUsMHg4NCwgMHgzMiwweEMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MCwweDJFLCAKKzB4MDAsMHgwNCwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMiwgMHhFNiwweDAwLCAKKzB4MzIsMHg3NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgwMiwgMHhGRiwweDM4LCAweDAzLDB4MkMsIDB4MEUsMHhGNCwgMHg5MywweDE2LCAKKzB4RkYsMHhDNCwgMHhGNywweDA1LCAweDdBLDB4NjgsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4OTYsIDB4RkYsMHhCOCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDQzLDB4QTAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4OTYsIDB4RkYsMHhCOCwgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDMyLDB4MzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4MkUsIDB4MEUsMHhGOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MTAsIDB4RTIsMHgwMCwgMHgzMSwweENELCAweEYzLDB4MDIsIDB4MDAsMHg0QywgMHg4NywweDJFLCAKKzB4MEYsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MkUsIDB4MEYsMHgwMCwgMHg4NywweDJFLCAKKzB4MEYsMHgwMCwgMHhFMCwweDAwLCAweDMyLDB4MzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHhGMywweDA2LCAKKzB4N0EsMHgyOCwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4NzYsMHhCMSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4NjAsMHgwMCwgMHg3NywweDM1LCAKKzB4MDAsMHgwNCwgMHhDNywweDM4LCAweDZBLDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweEM0LCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHhDNywweDM4LCAKKzB4MzAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4OTYsIDB4RkYsMHhCOCwgMHg5NiwweDE2LCAKKzB4RkYsMHhCNCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNiwweEY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NiwweDE2LCAKKzB4RkYsMHhCNCwgMHg4NSwweDk2LCAweEZGLDB4QjgsIDB4MDYsMHgzMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgxMSwgMHhFNiwweDAwLCAKKzB4MzIsMHgyQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDk2LDB4MkUsIDB4MEUsMHhGOCwgMHhGNywweDA0LCAKKzB4MzIsMHhDMCwgMHhGMywweDA2LCAweEUwLDB4MzAsIDB4QzAsMHgzQSwgMHgzMiwweDAwLCAweEU2LDB4MDAsIDB4MzIsMHg3NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweEUwLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4QjgsIDB4MDAsMHgxRSwgMHg3MCwweDNFLCAKKzB4RkYsMHhFMSwgMHhFNiwweDAwLCAweDMyLDB4NzUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDBGLDB4ODEsIDB4NDAsMHgwMCwgMHhGNywweDA0LCAKKzB4NzksMHhDOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzksMHhDOCwgMHhGNywweDA0LCAKKzB4NzksMHhDOCwgMHhGNywweDA0LCAweDcxLDB4QzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MzIsMHhCMSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4MDIsIDB4MDAsMHgwQSwgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDMyLDB4QjAsIDB4QjMsMHgzQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNywweDA0LCAKKzB4NzEsMHhENCwgMHhGNiwweDg0LCAweDcxLDB4Q0MsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHhFNiwweDAwLCAKKzB4MzIsMHhDQywgMHhGNywweDA1LCAweDcxLDB4RDQsIDB4RjAsMHgwNSwgMHg3MSwweEQ0LCAweEY2LDB4ODQsIDB4NzEsMHhENCwgMHhGNywweDA0LCAKKzB4NzEsMHhEMCwgMHhGMCwweDA1LCAweDcxLDB4QzQsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHhGNiwweDg0LCAKKzB4MzIsMHhEMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MzMsMHg5MSwgMHhGNywweDA1LCAKKzB4NzEsMHhDOCwgMHhGNywweDA0LCAweDcxLDB4OTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MzMsMHgzMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDMzLDB4MzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhGMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgzMywweDg5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDg0LCAKKzB4NzYsMHhGOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIDB4MzMsMHg3QywgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4MzMsMHg2OCwgMHhCNSwweEJBLCAKKzB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjMsMHgwMiwgMHgwMCwweDIyLCAweEYzLDB4MDUsIDB4NzYsMHhGOCwgMHhGMywweDA0LCAKKzB4NzcsMHgwMCwgMHhFMCwweDAwLCAweDMzLDB4ODAsIDB4RjMsMHgwNSwgMHg3NiwweEZDLCAweEYwLDB4MDUsIDB4NzYsMHhGQywgMHhFMCwweDAwLCAKKzB4MzMsMHg5MCwgMHhGMCwweDA1LCAweDdBLDB4NzgsIDB4RTAsMHgwMCwgMHgzMywweDk0LCAweEYzLDB4MDYsIDB4MzEsMHg5QywgMHhGMywweDA2LCAKKzB4MkUsMHhFMCwgMHhGMywweDA1LCAweDMyLDB4RDQsIDB4RjcsMHgwNCwgMHg3MSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDM0LDB4NDQsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDAyLCAKKzB4MDAsMHgwOSwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgzNCwweDQ0LCAweEIzLDB4M0EsIDB4NjgsMHgwMiwgMHhFMCwweDAwLCAKKzB4MzQsMHg0NCwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjcsMHgwNCwgMHg3QSwweDkwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAKKzB4NkEsMHgwMCwgMHhFRSwweDAwLCAweDMzLDB4RjksIDB4QzUsMHhCNCwgMHgwMCwweDAwLCAweEM3LDB4MzgsIDB4NUEsMHgwMCwgMHhFMCwweDAwLCAKKzB4MzQsMHgwMCwgMHhGNywweDA1LCAweDdBLDB4OTAsIDB4QzUsMHhCOCwgMHgwMCwweDAwLCAweEYwLDB4MDUsIDB4N0EsMHg5MCwgMHhGNiwweDg0LCAKKzB4N0EsMHg4OCwgMHhGNywweDA2LCAweDdBLDB4MjgsIDB4NzYsMHgzNSwgMHgwMCwweDAzLCAweEE3LDB4MzIsIDB4NzAsMHgwMiwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMSwgMHg5NywweDE2LCAweEZGLDB4RUMsIDB4ODQsMHhBNiwgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4N0EsMHgyQywgMHhGMywweDA0LCAKKzB4N0EsMHg5OCwgMHg5NCwweDgyLCAweEZGLDB4M0MsIDB4OTMsMHgwMiwgMHhGRiwweDQwLCAweDk1LDB4ODIsIDB4RkYsMHg0NCwgMHhCNSwweEIyLCAKKzB4NzAsMHgwMiwgMHhGNywweDA0LCAweDdBLDB4OTgsIDB4RjYsMHg4NSwgMHg3QSwweDg4LCAweEM3LDB4MzgsIDB4NTgsMHgwMCwgMHhGNywweDA1LCAKKzB4N0EsMHg5OCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAKKzB4MDAsMHgyMCwgMHhGNSwweDg0LCAweDdBLDB4NzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMSwgMHhFNiwweDAwLCAKKzB4MzcsMHg2QywgMHhGNSwweDg1LCAweDdBLDB4QTAsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweEY2LDB4MDQsIDB4MzIsMHhDOCwgMHhGNywweDA1LCAKKzB4N0EsMHg3MCwgMHhGNywweDA0LCAweDMyLDB4QzQsIDB4RjYsMHg4NCwgMHgzMiwweEMwLCAweEY2LDB4MDUsIDB4N0EsMHgyQywgMHg5MCwweDAyLCAKKzB4RkYsMHg4MCwgMHg5MCwweDAyLCAweEZGLDB4MzgsIDB4RjUsMHg4NCwgMHg3QSwweDI4LCAweDA3LDB4MzgsIDB4MDAsMHgyNCwgMHg5NSwweDgyLCAKKzB4RkYsMHgzQywgMHg5NywweDAyLCAweEZGLDB4NDAsIDB4OTYsMHgwMiwgMHhGRiwweDQ0LCAweDg3LDB4MzYsIDB4MTQsMHgxMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4OTcsMHgzNiwgMHgxNCwweDEwLCAweDg3LDB4MzYsIDB4MTQsMHgxOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgxNCwweDE4LCAweDg3LDB4MzYsIDB4MTQsMHgxOCwgMHhGMCwweDA1LCAKKzB4NkYsMHg1MCwgMHhGNywweDA0LCAweDMyLDB4QjgsIDB4OTUsMHg5NiwgMHhGRiwweEY0LCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHhGNywweDA1LCAKKzB4MzIsMHhCOCwgMHhGNywweDA0LCAweDMyLDB4QkMsIDB4RjQsMHg4NiwgMHgyRiwweEY4LCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4MzIsMHhCQywgMHhGNywweDA0LCAweDMyLDB4QkMsIDB4RjQsMHg4NSwgMHgzMiwweEQ0LCAweEY3LDB4MDYsIDB4MEMsMHgzRSwgMHhDMCwweDdFLCAKKzB4NzQsMHgwMCwgMHhFNiwweDAwLCAweDM1LDB4MUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4N0UsIDB4NzQsMHgwMCwgMHhFNiwweDAwLCAKKzB4MzUsMHgwRCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNiwgMHgwQywweDNFLCAweEM3LDB4N0MsIDB4NzQsMHgwMCwgMHgyMCwweDNBLCAKKzB4MDAsMHgxMCwgMHhFNiwweDAwLCAweDNCLDB4NzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4MzIsMHhFNCwgMHhGRiwweDgyLCAKKzB4MDAsMHgxMCwgMHhGNSwweDg0LCAweDZGLDB4NTgsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgyMSwgMHhFMiwweDAwLCAKKzB4MzUsMHg3OCwgMHhGNywweDA1LCAweDMyLDB4RTQsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4MzUsMHg2QywgMHhCNSwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY0LDB4ODIsIDB4MDAsMHgyMiwgMHhFMCwweDAwLCAKKzB4MzUsMHg3QywgMHhGNCwweDg1LCAweDZGLDB4NTgsIDB4RjAsMHgwNSwgMHg2RiwweDU0LCAweEY1LDB4ODQsIDB4MzIsMHhDMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MCwweDJFLCAweDAwLDB4MDQsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMiwgMHhFNiwweDAwLCAweDM2LDB4QTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MDIsIDB4RkYsMHgzOCwgMHgwNCwweEFDLCAKKzB4MEUsMHhGNCwgMHg5NCwweDk2LCAweEZGLDB4RUMsIDB4RjcsMHgwNSwgMHg3QSwweDY4LCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHg5NSwweDk2LCAKKzB4RkYsMHhEQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg0MywweEEwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDk2LCAKKzB4RkYsMHhEQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgzNiwweDY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweDJFLCAKKzB4MEUsMHhGOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDEwLCAweEUyLDB4MDAsIDB4MzYsMHgwMSwgMHhGNCwweDgyLCAKKzB4MDAsMHg0QywgMHg4NywweDJFLCAweDBGLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDJFLCAKKzB4MEYsMHgwMCwgMHg4NywweDJFLCAweDBGLDB4MDAsIDB4RTAsMHgwMCwgMHgzNiwweDY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweDkzLCAKKzB4RkYsMHhGQywgMHhGNCwweDg2LCAweDdBLDB4MjgsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDc2LDB4QjEsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAKKzB4NjAsMHgwMCwgMHg3NywweDM1LCAweDAwLDB4MDQsIDB4QzcsMHgzOCwgMHg2QSwweDAwLCAweDg0LDB4OTYsIDB4RkYsMHhFQywgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHhDNywweDM4LCAweDQ4LDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDEwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg5NSwweDk2LCAKKzB4RkYsMHhEQywgMHg5NiwweDE2LCAweEZGLDB4RDgsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjYsMHhGOCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NiwweDE2LCAweEZGLDB4RDgsIDB4ODUsMHg5NiwgMHhGRiwweERDLCAweDA2LDB4MzAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgxMSwgMHhFNiwweDAwLCAweDM2LDB4NjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHg5NiwweDJFLCAKKzB4MEUsMHhGOCwgMHhGNywweDA0LCAweDMyLDB4QzAsIDB4RjQsMHg4NiwgMHhFMCwweDMwLCAweEMwLDB4M0EsIDB4NEEsMHgwMCwgMHhFNiwweDAwLCAKKzB4MzYsMHhBOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHhFMCwweDE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEI4LCAKKzB4MDAsMHgxRSwgMHg3MCwweDNFLCAweEZGLDB4RTEsIDB4RTYsMHgwMCwgMHgzNiwweEE5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwRiwweDgxLCAKKzB4NDAsMHgwMCwgMHhGNywweDA0LCAweDc5LDB4QzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4NzksMHhDOCwgMHhGNywweDA0LCAweDc5LDB4QzgsIDB4RjcsMHgwNCwgMHg3MSwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDM2LDB4RTUsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNCwweDgyLCAKKzB4MDAsMHgwQSwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgzNiwweEU0LCAweEI0LDB4QkEsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHhGNywweDA0LCAweDcxLDB4RDQsIDB4RjYsMHg4NCwgMHg3MSwweENDLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAKKzB4NkEsMHgwMCwgMHhFNiwweDAwLCAweDM3LDB4MDAsIDB4RjcsMHgwNSwgMHg3MSwweEQ0LCAweEYwLDB4MDUsIDB4NzEsMHhENCwgMHhGNiwweDg0LCAKKzB4NzEsMHhENCwgMHhGNywweDA0LCAweDcxLDB4RDAsIDB4RjAsMHgwNSwgMHg3MSwweEM0LCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHhGNiwweDg0LCAweDMyLDB4RDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4M0EsMHhDMSwgMHhGNywweDA1LCAweDcxLDB4QzgsIDB4RjcsMHgwNCwgMHg3MSwweDk4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDNBLDB4NjEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhFQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgzQSwweDYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NzUsMHhGMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4M0EsMHg2MCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDNBLDB4QzQsIDB4RjQsMHg4NiwgMHgzMSwweDlDLCAweEYwLDB4MDUsIDB4N0EsMHg4OCwgMHg5MCwweDAyLCAKKzB4RkYsMHgzOCwgMHhGMCwweDA1LCAweDZGLDB4NTAsIDB4OTAsMHgwMiwgMHhGRiwweDgwLCAweEY3LDB4MDQsIDB4MzIsMHhDNCwgMHhGNCwweDg2LCAKKzB4MzIsMHgyOCwgMHhGNCwweDg1LCAweDMyLDB4RDQsIDB4RjYsMHgwNCwgMHgzMiwweEM4LCAweEY2LDB4ODQsIDB4N0EsMHgyQywgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MjQsIDB4RjcsMHgwNSwgMHg3QSwweDk4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MzcsMHhCRCwgMHhGNiwweDA1LCAweDdBLDB4OTAsIDB4QzAsMHgyQSwgMHg1QSwweDAwLCAweEU2LDB4MDAsIDB4M0IsMHgwOCwgMHhDMCwweDMyLCAKKzB4NkEsMHgwMCwgMHhFRSwweDAwLCAweDNCLDB4MDksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4MzIsMHhDMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDE0LDB4MTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg5NywweDM2LCAKKzB4MTQsMHgxMCwgMHg4NywweDM2LCAweDE0LDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MTQsMHgxOCwgMHg4NywweDM2LCAweDE0LDB4MTgsIDB4RjcsMHgwNCwgMHgzMiwweEI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHhGNywweDA1LCAweDMyLDB4QjgsIDB4RjcsMHgwNCwgMHgzMiwweEJDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDMyLDB4QkMsIDB4RjcsMHgwNCwgMHgzMiwweEJDLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MzgsMHgyRCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHgzMiwweEUwLCAweEY1LDB4MDUsIDB4N0EsMHg3MCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDM4LDB4MzAsIDB4RjcsMHgwNSwgMHgzMiwweEUwLCAweEY1LDB4MDUsIDB4N0EsMHg3MCwgMHhGNSwweDg0LCAKKzB4NkYsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIDB4MzgsMHg3NCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4MzgsMHg2OCwgMHhCNSwweEJBLCAKKzB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjQsMHg4MiwgMHgwMCwweDIyLCAweEUwLDB4MDAsIDB4MzgsMHg3OCwgMHhGNCwweDg1LCAKKzB4NkYsMHg1OCwgMHhGMCwweDA1LCAweDZGLDB4NTQsIDB4RjUsMHg4NCwgMHgzMiwweEMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MCwweDJFLCAKKzB4MDAsMHgwNCwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMiwgMHhFNiwweDAwLCAKKzB4MzksMHhBNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgwMiwgMHhGRiwweDM4LCAweDA0LDB4QUMsIDB4MEUsMHhGNCwgMHg5NCwweDk2LCAKKzB4RkYsMHhFNCwgMHhGNywweDA1LCAweDdBLDB4NjgsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4OTYsIDB4RkYsMHhEQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDQzLDB4QTAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4OTYsIDB4RkYsMHhEQywgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDM5LDB4NjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4MkUsIDB4MEUsMHhGOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MTAsIDB4RTIsMHgwMCwgMHgzOCwweEZELCAweEY0LDB4ODIsIDB4MDAsMHg0QywgMHg4NywweDJFLCAKKzB4MEYsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MkUsIDB4MEYsMHgwMCwgMHg4NywweDJFLCAKKzB4MEYsMHgwMCwgMHhFMCwweDAwLCAweDM5LDB4NjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHhGNCwweDg2LCAKKzB4N0EsMHgyOCwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4NzYsMHhCMSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4NjAsMHgwMCwgMHg3NywweDM1LCAKKzB4MDAsMHgwNCwgMHhDNywweDM4LCAweDZBLDB4MDAsIDB4ODQsMHg5NiwgMHhGRiwweEU0LCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHhDNywweDM4LCAKKzB4NDgsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4OTYsIDB4RkYsMHhEQywgMHg5NiwweDE2LCAKKzB4RkYsMHhEOCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNiwweEY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NiwweDE2LCAKKzB4RkYsMHhEOCwgMHg4NSwweDk2LCAweEZGLDB4REMsIDB4MDYsMHgzMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgxMSwgMHhFNiwweDAwLCAKKzB4MzksMHg1QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDk2LDB4MkUsIDB4MEUsMHhGOCwgMHhGNywweDA0LCAKKzB4MzIsMHhDMCwgMHhGNCwweDg2LCAweEUwLDB4MzAsIDB4QzAsMHgzQSwgMHg0QSwweDAwLCAweEU2LDB4MDAsIDB4MzksMHhBNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweEUwLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4QjgsIDB4MDAsMHgxRSwgMHg3MCwweDNFLCAKKzB4RkYsMHhFMSwgMHhFNiwweDAwLCAweDM5LDB4QTUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDBGLDB4ODEsIDB4NDAsMHgwMCwgMHhGNywweDA0LCAKKzB4NzksMHhDOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzksMHhDOCwgMHhGNywweDA0LCAKKzB4NzksMHhDOCwgMHhGNywweDA0LCAweDcxLDB4QzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4MzksMHhFMSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY0LDB4ODIsIDB4MDAsMHgwQSwgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDM5LDB4RTAsIDB4QjQsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNywweDA0LCAKKzB4NzEsMHhENCwgMHhGNiwweDg0LCAweDcxLDB4Q0MsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHhFNiwweDAwLCAKKzB4MzksMHhGQywgMHhGNywweDA1LCAweDcxLDB4RDQsIDB4RjAsMHgwNSwgMHg3MSwweEQ0LCAweEY2LDB4ODQsIDB4NzEsMHhENCwgMHhGNywweDA0LCAKKzB4NzEsMHhEMCwgMHhGMCwweDA1LCAweDcxLDB4QzQsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHhGNiwweDg0LCAKKzB4MzIsMHhEMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4M0EsMHhDMSwgMHhGNywweDA1LCAKKzB4NzEsMHhDOCwgMHhGNywweDA0LCAweDcxLDB4OTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4M0EsMHg2MSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDNBLDB4NjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhGMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgzQSwweEI5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDg0LCAKKzB4NzYsMHhGOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIDB4M0EsMHhBQywgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4M0EsMHg5OCwgMHhCNSwweEJBLCAKKzB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjQsMHg4MiwgMHgwMCwweDIyLCAweEY0LDB4ODUsIDB4NzYsMHhGOCwgMHhGNCwweDg0LCAKKzB4NzcsMHgwMCwgMHhFMCwweDAwLCAweDNBLDB4QjAsIDB4RjQsMHg4NSwgMHg3NiwweEZDLCAweEYwLDB4MDUsIDB4NzYsMHhGQywgMHhFMCwweDAwLCAKKzB4M0EsMHhDMCwgMHhGMCwweDA1LCAweDdBLDB4NzgsIDB4RTAsMHgwMCwgMHgzQSwweEM0LCAweEY0LDB4ODYsIDB4MzEsMHg5QywgMHhGNCwweDg2LCAKKzB4MkUsMHhFMCwgMHhGNCwweDg1LCAweDMyLDB4RDQsIDB4RjcsMHgwNCwgMHg3MSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDNCLDB4NzAsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNCwweDgyLCAKKzB4MDAsMHgwOSwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgzQiwweDcwLCAweEI0LDB4QkEsIDB4NjgsMHgwMiwgMHhFMCwweDAwLCAKKzB4M0IsMHg3MCwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjcsMHgwNCwgMHg3QSwweDkwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAKKzB4NkEsMHgwMCwgMHhFRSwweDAwLCAweDNCLDB4MjksIDB4QzUsMHhCNCwgMHgwMCwweDAwLCAweEM3LDB4MzgsIDB4NUEsMHgwMCwgMHhFMCwweDAwLCAKKzB4M0IsMHgzMCwgMHhGNywweDA1LCAweDdBLDB4OTAsIDB4QzUsMHhCOCwgMHgwMCwweDAwLCAweEYwLDB4MDUsIDB4N0EsMHg5MCwgMHhGNywweDA0LCAKKzB4N0EsMHg4OCwgMHhGNiwweDg2LCAweDdBLDB4MjgsIDB4NzYsMHgzOSwgMHgwMCwweDAzLCAweEE2LDB4QjIsIDB4NjgsMHgwMiwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDdBLDB4ODgsIDB4RjcsMHgwNCwgMHg3QSwweDk4LCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHg5NiwweDgyLCAKKzB4RkYsMHgzQywgMHhGNCwweDg0LCAweDdBLDB4OTgsIDB4RjYsMHg4NiwgMHg3QSwweDJDLCAweEM3LDB4MzgsIDB4NTgsMHgwMCwgMHg5NCwweDgyLCAKKzB4RkYsMHg0MCwgMHg5NSwweDgyLCAweEZGLDB4NDQsIDB4QjUsMHhCMiwgMHg2OCwweDAyLCAweEY3LDB4MDUsIDB4N0EsMHg5OCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgxOCwgMHhGNSwweDA0LCAKKzB4N0EsMHg4OCwgMHhGNywweDA2LCAweDdBLDB4MkMsIDB4RjUsMHg4NCwgMHg3QSwweDkwLCAweDc2LDB4QTksIDB4MDAsMHgwMywgMHhBNiwweEI2LCAKKzB4NzAsMHgwMiwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgzQiwweENELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4N0EsMHhBMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgyQSwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4M0YsMHgxOCwgMHhDMCwweDJFLCAKKzB4NkEsMHgwMCwgMHhFRSwweDAwLCAweDNGLDB4MTksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4MzIsMHhDMCwgMHhGNiwweDA0LCAKKzB4MzIsMHhDOCwgMHg4NywweDM2LCAweDE0LDB4MTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg5NywweDM2LCAKKzB4MTQsMHgxMCwgMHg4NywweDM2LCAweDE0LDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MTQsMHgxOCwgMHg4NywweDM2LCAweDE0LDB4MTgsIDB4RjcsMHgwNCwgMHgzMiwweEI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHhGNywweDA1LCAweDMyLDB4QjgsIDB4RjcsMHgwNCwgMHgzMiwweEJDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDMyLDB4QkMsIDB4RjcsMHgwNCwgMHgzMiwweEJDLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4M0MsMHgzRCwgMHhGNiwweDgyLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHgzMiwweEUwLCAweEY2LDB4ODUsIDB4N0EsMHg3MCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDNDLDB4NDAsIDB4RjcsMHgwNSwgMHgzMiwweEUwLCAweEY1LDB4MDUsIDB4N0EsMHg3MCwgMHhGNSwweDg0LCAKKzB4NkYsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIDB4M0MsMHg4NCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4M0MsMHg3OCwgMHhCNSwweEJBLCAKKzB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjQsMHg4MiwgMHgwMCwweDIyLCAweEUwLDB4MDAsIDB4M0MsMHg4OCwgMHhGNCwweDg1LCAKKzB4NkYsMHg1OCwgMHhGMCwweDA1LCAweDZGLDB4NTQsIDB4RjUsMHg4NCwgMHgzMiwweEMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MCwweDJFLCAKKzB4MDAsMHgwNCwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMiwgMHhFNiwweDAwLCAKKzB4M0QsMHhCNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgwMiwgMHhGRiwweDM4LCAweDA0LDB4QUMsIDB4MEUsMHhGNCwgMHg5NCwweDk2LCAKKzB4RkYsMHhFQywgMHhGNywweDA1LCAweDdBLDB4NjgsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4OTYsIDB4RkYsMHhFNCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDQzLDB4QTAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4OTYsIDB4RkYsMHhFNCwgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDNELDB4NzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4MkUsIDB4MEUsMHhGOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MTAsIDB4RTIsMHgwMCwgMHgzRCwweDBELCAweEY0LDB4ODIsIDB4MDAsMHg0QywgMHg4NywweDJFLCAKKzB4MEYsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MkUsIDB4MEYsMHgwMCwgMHg4NywweDJFLCAKKzB4MEYsMHgwMCwgMHhFMCwweDAwLCAweDNELDB4NzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHhGNCwweDg2LCAKKzB4N0EsMHgyOCwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4NzYsMHhCMSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4NjAsMHgwMCwgMHg3NywweDM1LCAKKzB4MDAsMHgwNCwgMHhDNywweDM4LCAweDZBLDB4MDAsIDB4ODQsMHg5NiwgMHhGRiwweEVDLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHhDNywweDM4LCAKKzB4NDgsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4OTYsIDB4RkYsMHhFNCwgMHg5NiwweDE2LCAKKzB4RkYsMHhFMCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNiwweEY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NiwweDE2LCAKKzB4RkYsMHhFMCwgMHg4NSwweDk2LCAweEZGLDB4RTQsIDB4MDYsMHgzMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgxMSwgMHhFNiwweDAwLCAKKzB4M0QsMHg2QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDk2LDB4MkUsIDB4MEUsMHhGOCwgMHhGNywweDA0LCAKKzB4MzIsMHhDMCwgMHhGNCwweDg2LCAweEUwLDB4MzAsIDB4QzAsMHgzQSwgMHg0QSwweDAwLCAweEU2LDB4MDAsIDB4M0QsMHhCNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweEUwLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4QjgsIDB4MDAsMHgxRSwgMHg3MCwweDNFLCAKKzB4RkYsMHhFMSwgMHhFNiwweDAwLCAweDNELDB4QjUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDBGLDB4ODEsIDB4NDAsMHgwMCwgMHhGNywweDA0LCAKKzB4NzksMHhDOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzksMHhDOCwgMHhGNywweDA0LCAKKzB4NzksMHhDOCwgMHhGNywweDA0LCAweDcxLDB4QzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4M0QsMHhGMSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY0LDB4ODIsIDB4MDAsMHgwQSwgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDNELDB4RjAsIDB4QjQsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNywweDA0LCAKKzB4NzEsMHhENCwgMHhGNiwweDg0LCAweDcxLDB4Q0MsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHhFNiwweDAwLCAKKzB4M0UsMHgwQywgMHhGNywweDA1LCAweDcxLDB4RDQsIDB4RjAsMHgwNSwgMHg3MSwweEQ0LCAweEY2LDB4ODQsIDB4NzEsMHhENCwgMHhGNywweDA0LCAKKzB4NzEsMHhEMCwgMHhGMCwweDA1LCAweDcxLDB4QzQsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHhGNiwweDg0LCAKKzB4MzIsMHhEMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4M0UsMHhEMSwgMHhGNywweDA1LCAKKzB4NzEsMHhDOCwgMHhGNywweDA0LCAweDcxLDB4OTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4M0UsMHg3MSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDNFLDB4NzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhGMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgzRSwweEM5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDg0LCAKKzB4NzYsMHhGOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIDB4M0UsMHhCQywgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4M0UsMHhBOCwgMHhCNSwweEJBLCAKKzB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjQsMHg4MiwgMHgwMCwweDIyLCAweEY0LDB4ODUsIDB4NzYsMHhGOCwgMHhGNCwweDg0LCAKKzB4NzcsMHgwMCwgMHhFMCwweDAwLCAweDNFLDB4QzAsIDB4RjQsMHg4NSwgMHg3NiwweEZDLCAweEYwLDB4MDUsIDB4NzYsMHhGQywgMHhFMCwweDAwLCAKKzB4M0UsMHhEMCwgMHhGMCwweDA1LCAweDdBLDB4NzgsIDB4RTAsMHgwMCwgMHgzRSwweEQ0LCAweEY0LDB4ODYsIDB4MzEsMHg5QywgMHhGNCwweDg2LCAKKzB4MkUsMHhFMCwgMHhGNCwweDg1LCAweDMyLDB4RDQsIDB4RjcsMHgwNCwgMHg3MSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDNGLDB4ODAsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNCwweDgyLCAKKzB4MDAsMHgwOSwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgzRiwweDgwLCAweEI0LDB4QkEsIDB4NjgsMHgwMiwgMHhFMCwweDAwLCAKKzB4M0YsMHg4MCwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjcsMHgwNCwgMHg3QSwweDkwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAKKzB4NkEsMHgwMCwgMHhFRSwweDAwLCAweDNGLDB4MzksIDB4QzUsMHhCNCwgMHgwMCwweDAwLCAweEM3LDB4MzgsIDB4NUEsMHgwMCwgMHhFMCwweDAwLCAKKzB4M0YsMHg0MCwgMHhGNywweDA1LCAweDdBLDB4OTAsIDB4QzUsMHhCOCwgMHgwMCwweDAwLCAweEYwLDB4MDUsIDB4N0EsMHg5MCwgMHhGNywweDA0LCAKKzB4N0EsMHg4OCwgMHhGNiwweDg2LCAweDdBLDB4MjgsIDB4NzYsMHgzOSwgMHgwMCwweDAzLCAweEE2LDB4QjIsIDB4NjgsMHgwMiwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDdBLDB4ODgsIDB4RjcsMHgwNCwgMHg3QSwweDk4LCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHg5NiwweDgyLCAKKzB4RkYsMHgzQywgMHhGNCwweDg0LCAweDdBLDB4OTgsIDB4RjYsMHg4NiwgMHg3QSwweDJDLCAweEM3LDB4MzgsIDB4NTgsMHgwMCwgMHg5NCwweDgyLCAKKzB4RkYsMHg0MCwgMHg5NSwweDgyLCAweEZGLDB4NDQsIDB4QjUsMHhCMiwgMHg2OCwweDAyLCAweEY3LDB4MDUsIDB4N0EsMHg5OCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgxMCwgMHhGNSwweDg0LCAKKzB4NkYsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIDB4M0YsMHhFNCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4M0YsMHhEOCwgMHhCNSwweEJBLCAKKzB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjUsMHgwMiwgMHgwMCwweDIyLCAweEUwLDB4MDAsIDB4M0YsMHhFOCwgMHhGNSwweDA1LCAKKzB4NkYsMHg1OCwgMHhGMCwweDA1LCAweDZGLDB4NTQsIDB4RjUsMHg4NCwgMHgzMiwweEMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MCwweDJFLCAKKzB4MDAsMHgwNCwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMiwgMHhFNiwweDAwLCAKKzB4NDEsMHgxNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgwMiwgMHhGRiwweDM4LCAweDA1LDB4MkMsIDB4MEUsMHhGNCwgMHg5NSwweDE2LCAKKzB4RkYsMHhGNCwgMHhGNywweDA1LCAweDdBLDB4NjgsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4OTYsIDB4RkYsMHhFQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDQzLDB4QTAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4OTYsIDB4RkYsMHhFQywgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDQwLDB4RDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4MkUsIDB4MEUsMHhGOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MTAsIDB4RTIsMHgwMCwgMHg0MCwweDZELCAweEY1LDB4MDIsIDB4MDAsMHg0QywgMHg4NywweDJFLCAKKzB4MEYsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MkUsIDB4MEYsMHgwMCwgMHg4NywweDJFLCAKKzB4MEYsMHgwMCwgMHhFMCwweDAwLCAweDQwLDB4RDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAKKzB4N0EsMHgyOCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4NzYsMHhCMSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4NjAsMHgwMCwgMHg3NywweDM1LCAKKzB4MDAsMHgwNCwgMHhDNywweDM4LCAweDZBLDB4MDAsIDB4ODUsMHgxNiwgMHhGRiwweEY0LCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHhDNywweDM4LCAKKzB4NTAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4OTYsIDB4RkYsMHhFQywgMHg5NiwweDE2LCAKKzB4RkYsMHhFOCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNiwweEY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NiwweDE2LCAKKzB4RkYsMHhFOCwgMHg4NSwweDk2LCAweEZGLDB4RUMsIDB4MDYsMHgzMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgxMSwgMHhFNiwweDAwLCAKKzB4NDAsMHhDQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDk2LDB4MkUsIDB4MEUsMHhGOCwgMHhGNywweDA0LCAKKzB4MzIsMHhDMCwgMHhGNSwweDA2LCAweEUwLDB4MzAsIDB4QzAsMHgzQSwgMHg1MiwweDAwLCAweEU2LDB4MDAsIDB4NDEsMHgxNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweEUwLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4QjgsIDB4MDAsMHgxRSwgMHg3MCwweDNFLCAKKzB4RkYsMHhFMSwgMHhFNiwweDAwLCAweDQxLDB4MTUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDBGLDB4ODEsIDB4NDAsMHgwMCwgMHhGNywweDA0LCAKKzB4NzksMHhDOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzksMHhDOCwgMHhGNywweDA0LCAKKzB4NzksMHhDOCwgMHhGNywweDA0LCAweDcxLDB4QzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NDEsMHg1MSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY1LDB4MDIsIDB4MDAsMHgwQSwgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDQxLDB4NTAsIDB4QjUsMHgzQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNywweDA0LCAKKzB4NzEsMHhENCwgMHhGNiwweDg0LCAweDcxLDB4Q0MsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHhFNiwweDAwLCAKKzB4NDEsMHg2QywgMHhGNywweDA1LCAweDcxLDB4RDQsIDB4RjAsMHgwNSwgMHg3MSwweEQ0LCAweEY2LDB4ODQsIDB4NzEsMHhENCwgMHhGNywweDA0LCAKKzB4NzEsMHhEMCwgMHhGMCwweDA1LCAweDcxLDB4QzQsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHhGNiwweDg0LCAKKzB4MzIsMHhEMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NDIsMHgzMSwgMHhGNywweDA1LCAKKzB4NzEsMHhDOCwgMHhGNywweDA0LCAweDcxLDB4OTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NDEsMHhEMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDQxLDB4RDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhGMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg0MiwweDI5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDg0LCAKKzB4NzYsMHhGOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIDB4NDIsMHgxQywgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4NDIsMHgwOCwgMHhCNSwweEJBLCAKKzB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjUsMHgwMiwgMHgwMCwweDIyLCAweEY1LDB4MDUsIDB4NzYsMHhGOCwgMHhGNSwweDA0LCAKKzB4NzcsMHgwMCwgMHhFMCwweDAwLCAweDQyLDB4MjAsIDB4RjUsMHgwNSwgMHg3NiwweEZDLCAweEYwLDB4MDUsIDB4NzYsMHhGQywgMHhFMCwweDAwLCAKKzB4NDIsMHgzMCwgMHhGMCwweDA1LCAweDdBLDB4NzgsIDB4RTAsMHgwMCwgMHg0MiwweDM0LCAweEY1LDB4MDYsIDB4MzEsMHg5QywgMHhGNSwweDA2LCAKKzB4MkUsMHhFMCwgMHhGNSwweDA1LCAweDMyLDB4RDQsIDB4RjcsMHgwNCwgMHg3MSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDQyLDB4NzQsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNSwweDAyLCAKKzB4MDAsMHgwOSwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHg0MiwweDc0LCAweEI1LDB4M0EsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA2LCAKKzB4MzIsMHhENCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgyRSwweEUwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzIsMHhENCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDJGLDB4NkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzMiwweEQ0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4MkYsMHhGOCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDMyLDB4RDQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzAsMHg4NCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4MzIsMHhENCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzMSwweDEwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzIsMHhENCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDMxLDB4OUMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzMiwweEQ0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4MzIsMHgyOCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NywweDE2LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHhCQSwgMHgwMCwweDAwLCAweDg3LDB4M0EsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDQsMHgwQywgMHgwMCwweDAxLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDQsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODUsMHg5NiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweDJFLCAKKzB4MDAsMHgwMCwgMHg4NiwweEFFLCAweDAwLDB4MDQsIDB4MjAsMHgzMiwgMHgwMCwweDEwLCAweEUyLDB4MDAsIDB4NDMsMHhEMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MTAsIDB4RTIsMHgwMCwgMHg0MywweEVELCAweDA3LDB4MzQsIDB4MDAsMHgwMSwgMHg4NywweDJFLCAKKzB4MDAsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MkUsIDB4MDAsMHgwQywgMHg4NywweDJFLCAKKzB4MDAsMHgwQywgMHhFMCwweDAwLCAweDQ0LDB4MTQsIDB4RjQsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4M0EsIDB4NjIsMHgwMCwgMHhFNiwweDAwLCAKKzB4NDQsMHgxMSwgMHhGNCwweDAyLCAweDAwLDB4MDAsIDB4MjAsMHgzNiwgMHgwMCwweDEwLCAweEU2LDB4MDAsIDB4NDQsMHgxNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg0NCwweDE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNCwweDAyLCAKKzB4MDAsMHgwMSwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwNCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDM1LDB4MjQsIDB4RjcsMHgwNCwgMHg2RiwweDQ0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4MzUsMHgyOCwgMHhGNywweDA2LCAweDMyLDB4RjQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzUsMHgzMCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDQ4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDAyLCAKKzB4NDUsMHgwNCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwMiwgMHgwMCwweDBELCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4MzIsMHhGNCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDAyLCAweDRBLDB4MDQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4MDAsMHgwRiwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDMzLDB4ODAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwMiwgMHg0RSwweEVDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDAyLCAKKzB4MDAsMHgwOCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzNCwweDBDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4NTcsMHg2NCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDAyLCAweDAwLDB4MDcsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzQsMHg5OCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgxNCwgMHhGNywweDA0LCAKKzB4NzUsMHhGOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NDUsMHgyRCwgMHhGNiwweDg2LCAKKzB4NzUsMHhGOCwgMHhFMCwweDAwLCAweDQ1LDB4NDQsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4NzYsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDg3LDB4M0EsIDB4MDAsMHgxOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg0NSwweDVDLCAweEY3LDB4MDUsIDB4MzUsMHg0OCwgMHhGNCwweDg2LCAKKzB4MzMsMHg4MCwgMHhFMCwweDAwLCAweDQ5LDB4RjAsIDB4RjQsMHg4NSwgMHgzNSwweDMwLCAweEY3LDB4MDQsIDB4NkYsMHg1NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg0NSwweDgwLCAweEY0LDB4ODIsIDB4MDAsMHgwOCwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMSwgMHhGNCwweDg1LCAweDZGLDB4NTQsIDB4RTAsMHgwMCwgMHg0NSwweDg4LCAweEY3LDB4MDIsIDB4MDAsMHgwMSwgMHhGNCwweDg1LCAKKzB4NkYsMHg1OCwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NDUsMHhBMCwgMHhGNCwweDgyLCAKKzB4MDAsMHgwNCwgMHhGNCwweDg2LCAweDM0LDB4MEMsIDB4RTAsMHgwMCwgMHg0OSwweEYwLCAweEY0LDB4ODUsIDB4MzUsMHgzMCwgMHhGNiwweDg0LCAKKzB4MzUsMHg0OCwgMHhGNiwweDA0LCAweDM1LDB4MkMsIDB4RjQsMHhCNywgMHgyOCwweDAwLCAweDA3LDB4MzQsIDB4MDAsMHgwMiwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMSwgMHhGNCwweEJCLCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDhDLCAweEY0LDB4ODIsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MDAsMHgxOCwgMHg4NywweDMyLCAweDAwLDB4OTAsIDB4RjQsMHg4NSwgMHg2RiwweDUwLCAweDk3LDB4MzYsIDB4MDAsMHgwNCwgMHg4NCwweEIyLCAKKzB4MDAsMHg4NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHhCNiwgMHgwMCwweDEwLCAweDg0LDB4QjIsIDB4MDAsMHg4OCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NCwweEI2LCAweDAwLDB4MTQsIDB4ODQsMHhCNiwgMHgwMCwweDEwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweEI2LCAKKzB4MDAsMHgwOCwgMHg4NCwweEI2LCAweDAwLDB4MTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4QjYsIDB4MDAsMHgwQywgMHg4NCwweEIyLCAKKzB4MDAsMHg5OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjQsMHg4NSwgMHgzNSwweDU0LCAweEY0LDB4ODIsIDB4MDAsMHgwMSwgMHg5NCwweDgyLCAKKzB4RkYsMHg4MCwgMHhGNSwweDA0LCAweDM1LDB4NTQsIDB4RjQsMHg4NiwgMHgzNCwweDk4LCAweEY0LDB4ODUsIDB4MzUsMHgzMCwgMHg5NSwweDAyLCAKKzB4RkYsMHgzOCwgMHg4NSwweEIyLCAweDAwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDI0LCAweDk1LDB4ODIsIDB4RkYsMHgzQywgMHg5NiwweDgyLCAKKzB4RkYsMHg0MCwgMHg4NywweDMyLCAweDAwLDB4MDQsIDB4RjYsMHg4NSwgMHgzNSwweDUwLCAweDk3LDB4MDIsIDB4RkYsMHg0NCwgMHg4NiwweEIyLCAKKzB4MDAsMHgwNCwgMHhGMCwweDA1LCAweDM1LDB4NEMsIDB4RjcsMHgwNCwgMHgzNSwweDQwLCAweDk1LDB4MTYsIDB4RkYsMHhGNCwgMHg5NSwweDk2LCAKKzB4RkYsMHhGNCwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4RjcsMHgwNSwgMHgzNSwweDQwLCAweEY1LDB4ODQsIDB4MzUsMHgyOCwgMHg4NiwweEIyLCAKKzB4MDAsMHgwNCwgMHg4NywweDJFLCAweDE0LDB4MTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHg5NywweDJFLCAKKzB4MTQsMHgxNCwgMHg4NywweDMyLCAweDAwLDB4ODAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMSwgMHhFRSwweDAwLCAKKzB4NDksMHhGMCwgMHhGNywweDA2LCAweDBDLDB4M0UsIDB4QzAsMHg3RSwgMHg3NCwweDAwLCAweEU2LDB4MDAsIDB4NDYsMHhBNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDdFLCAweDc0LDB4MDAsIDB4RTYsMHgwMCwgMHg0NiwweDk1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA2LCAKKzB4MEMsMHgzRSwgMHhDNywweDdDLCAweDc0LDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDEwLCAweEU2LDB4MDAsIDB4NDksMHhGMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGRiwweDgyLCAweDAwLDB4MTAsIDB4ODYsMHg4MiwgMHhGRiwweDM4LCAweEY3LDB4MDQsIDB4MzUsMHg1OCwgMHhGNSwweDg0LCAKKzB4NkYsMHg1OCwgMHhGNiwweDg1LCAweDM1LDB4NTQsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgyMSwgMHhFMiwweDAwLCAKKzB4NDcsMHgwOCwgMHhGNywweDA1LCAweDM1LDB4NTgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4NDYsMHhGQywgMHhCNSwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY0LDB4ODIsIDB4MDAsMHgyMiwgMHhFMCwweDAwLCAKKzB4NDcsMHgwQywgMHhGNCwweDg1LCAweDZGLDB4NTgsIDB4RjAsMHgwNSwgMHg2RiwweDU0LCAweEY2LDB4ODQsIDB4MzUsMHgyQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4OTQsIDB4QzQsMHg4NCwgMHgwMCwweDAwLCAweEMwLDB4M0EsIDB4NEEsMHgwMCwgMHhFNiwweDAwLCAKKzB4NDcsMHg3MSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHgzNiwgMHgwMCwweDk0LCAweEY2LDB4ODQsIDB4MzUsMHg1NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NiwweEI0LCAweEZGLDB4RjAsIDB4RjcsMHgwNCwgMHgzNSwweDU0LCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHg0NywweDM5LCAKKzB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4RjAsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweEY3LDB4MDQsIDB4MzUsMHg0OCwgMHg3NywweEI0LCAKKzB4MDAsMHgwRiwgMHg3MCwweDNFLCAweEZGLDB4RTEsIDB4MDcsMHgzOCwgMHgwMCwweDI0LCAweEU2LDB4MDAsIDB4NDcsMHg2OSwgMHhDNiwweDM4LCAKKzB4NjAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDEsIDB4QzcsMHgwNCwgMHg2RSwweDAwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHhGNiwweDg0LCAKKzB4MzUsMHg0NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwRiwgMHhFMiwweDAwLCAweDQ3LDB4QkQsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgwQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgwMCwweDBDLCAweDg3LDB4MzYsIDB4MDAsMHgwQywgMHhFMCwweDAwLCAKKzB4NDcsMHhEMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHgzNSwweDI4LCAweEY2LDB4ODIsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDQ5LDB4NjgsIDB4RjcsMHgwNSwgMHgzNSwweDQ0LCAweDIwLDB4M0EsIDB4MDAsMHgxMCwgMHhFNiwweDAwLCAKKzB4NDcsMHhDQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDk3LDB4MzYsIDB4MDAsMHgwNCwgMHhGNywweDA0LCAKKzB4MzUsMHgzQywgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4MzUsMHgzQywgMHhGNywweDA0LCAKKzB4MzUsMHgzQywgMHg4NywweDM2LCAweDE0LDB4MUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MTQsMHgxQywgMHhGNywweDA0LCAweDc2LDB4MDQsIDB4ODYsMHhCNiwgMHgxNCwweDFDLCAweEY2LDB4MDQsIDB4NzUsMHhGQywgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDg0LCAweDc2LDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHhFNiwweDAwLCAKKzB4NDgsMHgxQywgMHhGNywweDA1LCAweDc2LDB4MDQsIDB4RjAsMHgwNSwgMHg3NiwweDA0LCAweEY2LDB4ODQsIDB4NzYsMHgwNCwgMHhGNywweDA0LCAKKzB4NzYsMHgwOCwgMHhGMCwweDA1LCAweDc1LDB4RkMsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDQ4LDB4ODEsIDB4RjcsMHgwNSwgMHg3NSwweEY4LCAweEY3LDB4MDQsIDB4NzYsMHg0OCwgMHhGNCwweDg2LCAKKzB4NzIsMHgxOCwgMHhDMCwweDNBLCAweDRBLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NDgsMHg4MSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY0LDB4ODIsIDB4MDAsMHgwRSwgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDQ4LDB4ODAsIDB4QjQsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHgyMCwweDJBLCAweDAwLDB4MDIsIDB4RUUsMHgwMCwgMHg0OSwweDY4LCAweEY2LDB4ODIsIDB4MDAsMHgwMCwgMHhGNiwweDg0LCAKKzB4MzUsMHgyOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMiwgMHhFNiwweDAwLCAweDQ5LDB4M0MsIDB4MDUsMHhCNCwgMHgwMCwweDA4LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHg5NSwweDE2LCAKKzB4RkYsMHhFQywgMHg5NSwweDk2LCAweEZGLDB4RTgsIDB4OTYsMHg5NiwgMHhGRiwweEU0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4NUUsMHhEQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHhGRiwweEVDLCAweDg1LDB4OTYsIDB4RkYsMHhFOCwgMHg4NiwweDk2LCAKKzB4RkYsMHhFNCwgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg0OSwweDJDLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg4NiwweDM2LCAKKzB4MDAsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDBGLCAweEUyLDB4MDAsIDB4NDksMHgxMSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MDAsMHgxNCwgMHg4NywweDM2LCAweDAwLDB4MTQsIDB4RTAsMHgwMCwgMHg0OSwweDJDLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDYwLDB4MDAsIDB4NzcsMHgzNSwgMHgwMCwweDA1LCAweEM3LDB4MzgsIDB4NkEsMHgwMCwgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MTAsIDB4QzcsMHgyQywgMHg3MCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NDcsMHhBOCwgMHhGNywweDA1LCAweDM1LDB4MkMsIDB4RjYsMHg4NCwgMHgzNSwweDI4LCAweEY3LDB4MDQsIDB4NkYsMHg0QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg0OSwweDVDLCAweDA3LDB4MzQsIDB4MTQsMHg5NCwgMHhGNCwweDg0LCAKKzB4NkYsMHg0NCwgMHhFMCwweDAwLCAweDQ5LDB4NjAsIDB4RjQsMHg4NSwgMHgzNSwweDI4LCAweEY3LDB4MDUsIDB4MzUsMHgyOCwgMHhFMCwweDAwLCAKKzB4NDgsMHg4NCwgMHgwNSwweDI4LCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NDksMHhBMSwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjQsMHg4MiwgMHgwMCwweDBELCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4NDksMHhBOCwgMHhCNCwweEJBLCAweDY4LDB4MDIsIDB4RTAsMHgwMCwgMHg0OSwweEE4LCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMSwgMHhGNCwweDg1LCAweDM1LDB4MjQsIDB4RjYsMHg4NCwgMHgzNSwweDI4LCAweEY3LDB4MDQsIDB4NkYsMHg0NCwgMHhGNCwweDg2LCAKKzB4MzIsMHhGNCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg0OSwweEYwLCAweEY0LDB4ODUsIDB4MzUsMHgzMCwgMHhGNywweDA0LCAKKzB4RTAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhCOCwgMHgwMCwweDFGLCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAwLCAKKzB4NDksMHhGMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MEYsMHg4MSwgMHg0MCwweDAwLCAweEY3LDB4MDQsIDB4NzksMHhDOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3OSwweEM4LCAweEY3LDB4MDQsIDB4NzksMHhDOCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgxNCwgMHhGNywweDA0LCAKKzB4NzUsMHhGOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NEEsMHgyRCwgMHhGNiwweDg2LCAKKzB4NzUsMHhGOCwgMHhFMCwweDAwLCAweDRBLDB4NDAsIDB4RjYsMHg4MiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4NzYsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDg2LDB4QkEsIDB4MDAsMHgxOCwgMHhGNywweDA0LCAKKzB4NkYsMHg1NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NEEsMHg2NCwgMHhGNiwweDg1LCAKKzB4MzUsMHg0OCwgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4RjQsMHg4NSwgMHg2RiwweDU0LCAweEUwLDB4MDAsIDB4NEEsMHg3MCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMSwgMHhGNCwweDgyLCAweDAwLDB4MDgsIDB4RjQsMHg4NSwgMHg2RiwweDU4LCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDRBLDB4ODgsIDB4RjQsMHg4MiwgMHgwMCwweDA0LCAweEY0LDB4ODYsIDB4MzQsMHgwQywgMHhFMCwweDAwLCAKKzB4NEUsMHhEOCwgMHhGNCwweDg1LCAweDM1LDB4MzAsIDB4RjYsMHg4NCwgMHgzNSwweDQ4LCAweEY2LDB4MDQsIDB4MzUsMHgyQywgMHhGNCwweEI3LCAKKzB4MjgsMHgwMCwgMHgwNywweDM0LCAweDAwLDB4MDIsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweEY0LDB4QkIsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAKKzB4MDAsMHg4QywgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgwMCwweDE4LCAweDg3LDB4MzIsIDB4MDAsMHg5MCwgMHhGNCwweDg1LCAKKzB4NkYsMHg1MCwgMHg5NywweDM2LCAweDAwLDB4MDQsIDB4ODQsMHhCMiwgMHgwMCwweDg0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweEI2LCAKKzB4MDAsMHgxMCwgMHg4NCwweEIyLCAweDAwLDB4ODgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4QjYsIDB4MDAsMHgxNCwgMHg4NCwweEI2LCAKKzB4MDAsMHgxMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHhCNiwgMHgwMCwweDA4LCAweDg0LDB4QjYsIDB4MDAsMHgxNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NCwweEI2LCAweDAwLDB4MEMsIDB4ODQsMHhCMiwgMHgwMCwweDk4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNCwweDg1LCAKKzB4MzUsMHg1NCwgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4OTQsMHg4MiwgMHhGRiwweDgwLCAweEY1LDB4MDQsIDB4MzUsMHg1NCwgMHhGNCwweDg2LCAKKzB4MzQsMHg5OCwgMHhGNCwweDg1LCAweDM1LDB4MzAsIDB4OTUsMHgwMiwgMHhGRiwweDM4LCAweDg1LDB4QjIsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgyNCwgMHg5NSwweDgyLCAweEZGLDB4M0MsIDB4OTYsMHg4MiwgMHhGRiwweDQwLCAweDg3LDB4MzIsIDB4MDAsMHgwNCwgMHhGNiwweDg1LCAKKzB4MzUsMHg1MCwgMHg5NywweDAyLCAweEZGLDB4NDQsIDB4ODYsMHhCMiwgMHgwMCwweDA0LCAweEYwLDB4MDUsIDB4MzUsMHg0QywgMHhGNywweDA0LCAKKzB4MzUsMHg0MCwgMHg5NSwweDE2LCAweEZGLDB4RjQsIDB4OTUsMHg5NiwgMHhGRiwweEY0LCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHhGNywweDA1LCAKKzB4MzUsMHg0MCwgMHhGNSwweDg0LCAweDM1LDB4MjgsIDB4ODYsMHhCMiwgMHgwMCwweDA0LCAweDg3LDB4MkUsIDB4MTQsMHgxNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4OTcsMHgyRSwgMHgxNCwweDE0LCAweDg3LDB4MzIsIDB4MDAsMHg4MCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDEsIDB4RUUsMHgwMCwgMHg0RSwweEQ4LCAweEY3LDB4MDYsIDB4MEMsMHgzRSwgMHhDMCwweDdFLCAKKzB4NzQsMHgwMCwgMHhFNiwweDAwLCAweDRCLDB4OEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4N0UsIDB4NzQsMHgwMCwgMHhFNiwweDAwLCAKKzB4NEIsMHg3RCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNiwgMHgwQywweDNFLCAweEM3LDB4N0MsIDB4NzQsMHgwMCwgMHgyMCwweDNBLCAKKzB4MDAsMHgxMCwgMHhFNiwweDAwLCAweDRFLDB4RDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEZGLDB4ODIsIDB4MDAsMHgxMCwgMHg4NiwweDgyLCAKKzB4RkYsMHgzOCwgMHhGNywweDA0LCAweDM1LDB4NTgsIDB4RjUsMHg4NCwgMHg2RiwweDU4LCAweEY2LDB4ODUsIDB4MzUsMHg1NCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MjEsIDB4RTIsMHgwMCwgMHg0QiwweEYwLCAweEY3LDB4MDUsIDB4MzUsMHg1OCwgMHhGNywweDA0LCAKKzB4MkQsMHgzOCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHg0QiwweEU0LCAweEI1LDB4QkEsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHhGNCwweDgyLCAweDAwLDB4MjIsIDB4RTAsMHgwMCwgMHg0QiwweEY0LCAweEY0LDB4ODUsIDB4NkYsMHg1OCwgMHhGMCwweDA1LCAKKzB4NkYsMHg1NCwgMHhGNiwweDg0LCAweDM1LDB4MkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHg5NCwgMHhDNCwweDg0LCAKKzB4MDAsMHgwMCwgMHhDMCwweDNBLCAweDRBLDB4MDAsIDB4RTYsMHgwMCwgMHg0QywweDU5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweDM2LCAKKzB4MDAsMHg5NCwgMHhGNiwweDg0LCAweDM1LDB4NTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc2LDB4QjQsIDB4RkYsMHhGMCwgMHhGNywweDA0LCAKKzB4MzUsMHg1NCwgMHg5NiwweDk2LCAweEZGLDB4RjQsIDB4NDcsMHgzOSwgMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhGMCwgMHhDNiwweEI0LCAKKzB4NzAsMHgwMCwgMHhGNywweDA0LCAweDM1LDB4NDgsIDB4NzcsMHhCNCwgMHgwMCwweDBGLCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHgwNywweDM4LCAKKzB4MDAsMHgyNCwgMHhFNiwweDAwLCAweDRDLDB4NTEsIDB4QzYsMHgzOCwgMHg2MCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMSwgMHhDNywweDA0LCAKKzB4NkUsMHgwMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4RjYsMHg4NCwgMHgzNSwweDQ0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDBGLCAweEUyLDB4MDAsIDB4NEMsMHhBNSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MDAsMHgwQywgMHg4NywweDM2LCAweDAwLDB4MEMsIDB4RTAsMHgwMCwgMHg0QywweEI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4MzUsMHgyOCwgMHhGNiwweDgyLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NEUsMHg1MCwgMHhGNywweDA1LCAKKzB4MzUsMHg0NCwgMHgyMCwweDNBLCAweDAwLDB4MTAsIDB4RTYsMHgwMCwgMHg0QywweEI0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDAyLCAKKzB4MDAsMHgwMCwgMHg5NywweDM2LCAweDAwLDB4MDQsIDB4RjcsMHgwNCwgMHgzNSwweDNDLCAweEY2LDB4ODQsIDB4MzUsMHgyOCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDM1LDB4M0MsIDB4RjcsMHgwNCwgMHgzNSwweDNDLCAweDg3LDB4MzYsIDB4MTQsMHgxQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgxNCwweDFDLCAweEY3LDB4MDQsIDB4NzYsMHgwNCwgMHg4NiwweEI2LCAKKzB4MTQsMHgxQywgMHhGNiwweDA0LCAweDc1LDB4RkMsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4NzYsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDZBLDB4MDAsIDB4RTYsMHgwMCwgMHg0RCwweDA0LCAweEY3LDB4MDUsIDB4NzYsMHgwNCwgMHhGMCwweDA1LCAKKzB4NzYsMHgwNCwgMHhGNiwweDg0LCAweDc2LDB4MDQsIDB4RjcsMHgwNCwgMHg3NiwweDA4LCAweEYwLDB4MDUsIDB4NzUsMHhGQywgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NEQsMHg2OSwgMHhGNywweDA1LCAKKzB4NzUsMHhGOCwgMHhGNywweDA0LCAweDc2LDB4NDgsIDB4RjQsMHg4NiwgMHg3MiwweDE4LCAweEMwLDB4M0EsIDB4NEEsMHgwMCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg0RCwweDY5LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAKKzB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhGNCwweDgyLCAweDAwLDB4MEUsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4NEQsMHg2OCwgMHhCNCwweEJBLCAKKzB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjUsMHgwMiwgMHgwMCwweDAwLCAweDIwLDB4MkEsIDB4MDAsMHgwMiwgMHhFRSwweDAwLCAKKzB4NEUsMHg1MCwgMHhGNiwweDgyLCAweDAwLDB4MDAsIDB4RjYsMHg4NCwgMHgzNSwweDI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAyLCAweEU2LDB4MDAsIDB4NEUsMHgyNCwgMHgwNSwweEI0LCAKKzB4MDAsMHgwOCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4OTUsMHgxNiwgMHhGRiwweEVDLCAweDk1LDB4OTYsIDB4RkYsMHhFOCwgMHg5NiwweDk2LCAKKzB4RkYsMHhFNCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg1RSwweERDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAKKzB4RkYsMHhFQywgMHg4NSwweDk2LCAweEZGLDB4RTgsIDB4ODYsMHg5NiwgMHhGRiwweEU0LCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NEUsMHgxNCwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4ODYsMHgzNiwgMHgwMCwweDBDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgwRiwgMHhFMiwweDAwLCAweDRELDB4RjksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgxNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgwMCwweDE0LCAweDg3LDB4MzYsIDB4MDAsMHgxNCwgMHhFMCwweDAwLCAKKzB4NEUsMHgxNCwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4NjAsMHgwMCwgMHg3NywweDM1LCAKKzB4MDAsMHgwNSwgMHhDNywweDM4LCAweDZBLDB4MDAsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgxMCwgMHhDNywweDJDLCAKKzB4NzAsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg0QywweDkwLCAweEY3LDB4MDUsIDB4MzUsMHgyQywgMHhGNiwweDg0LCAKKzB4MzUsMHgyOCwgMHhGNywweDA0LCAweDZGLDB4NEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4NEUsMHg0NCwgMHgwNywweDM0LCAweDE0LDB4OTQsIDB4RjQsMHg4NCwgMHg2RiwweDQ0LCAweEUwLDB4MDAsIDB4NEUsMHg0OCwgMHhGNCwweDg1LCAKKzB4MzUsMHgyOCwgMHhGNywweDA1LCAweDM1LDB4MjgsIDB4RTAsMHgwMCwgMHg0RCwweDZDLCAweDA1LDB4MjgsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDRFLDB4ODksIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNCwweDgyLCAKKzB4MDAsMHgwRCwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHg0RSwweDkwLCAweEI0LDB4QkEsIDB4NjgsMHgwMiwgMHhFMCwweDAwLCAKKzB4NEUsMHg5MCwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweEY0LDB4ODUsIDB4MzUsMHgyNCwgMHhGNiwweDg0LCAKKzB4MzUsMHgyOCwgMHhGNywweDA0LCAweDZGLDB4NDQsIDB4RjQsMHg4NiwgMHgzMiwweEY0LCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4NEUsMHhEOCwgMHhGNCwweDg1LCAweDM1LDB4MzAsIDB4RjcsMHgwNCwgMHhFMCwweDE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEI4LCAKKzB4MDAsMHgxRiwgMHg3MCwweDNFLCAweEZGLDB4RTEsIDB4RTYsMHgwMCwgMHg0RSwweEQ5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwRiwweDgxLCAKKzB4NDAsMHgwMCwgMHhGNywweDA0LCAweDc5LDB4QzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4NzksMHhDOCwgMHhGNywweDA0LCAweDc5LDB4QzgsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MTQsIDB4RjYsMHg4NCwgMHgzNSwweDQ4LCAweEY2LDB4MDQsIDB4MzUsMHgyQywgMHhGNCwweDgyLCAKKzB4MDAsMHgwNCwgMHhGNCwweEI3LCAweDI4LDB4MDAsIDB4MDcsMHgzNCwgMHgwMCwweDAyLCAweEY0LDB4ODIsIDB4MDAsMHgwMSwgMHhGNCwweEJCLCAKKzB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4OEMsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweDk3LDB4MzYsIDB4MDAsMHgxOCwgMHg4NywweDMyLCAKKzB4MDAsMHg5MCwgMHhGNCwweDg1LCAweDZGLDB4NTAsIDB4OTcsMHgzNiwgMHgwMCwweDA0LCAweDg0LDB4QjIsIDB4MDAsMHg4NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NCwweEI2LCAweDAwLDB4MTAsIDB4ODQsMHhCMiwgMHgwMCwweDg4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweEI2LCAKKzB4MDAsMHgxNCwgMHg4NCwweEI2LCAweDAwLDB4MTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4QjYsIDB4MDAsMHgwOCwgMHg4NCwweEI2LCAKKzB4MDAsMHgxNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHhCNiwgMHgwMCwweDBDLCAweDg0LDB4QjIsIDB4MDAsMHg5OCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNCwweDg1LCAweDM1LDB4NTQsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweDk0LDB4ODIsIDB4RkYsMHg4MCwgMHhGNSwweDA0LCAKKzB4MzUsMHg1NCwgMHhGNCwweDg2LCAweDM0LDB4OTgsIDB4RjQsMHg4NSwgMHgzNSwweDMwLCAweDk1LDB4MDIsIDB4RkYsMHgzOCwgMHg4NSwweEIyLCAKKzB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MjQsIDB4OTUsMHg4MiwgMHhGRiwweDNDLCAweDk2LDB4ODIsIDB4RkYsMHg0MCwgMHg4NywweDMyLCAKKzB4MDAsMHgwNCwgMHhGNiwweDg1LCAweDM1LDB4NTAsIDB4OTcsMHgwMiwgMHhGRiwweDQ0LCAweDg2LDB4QjIsIDB4MDAsMHgwNCwgMHhGMCwweDA1LCAKKzB4MzUsMHg0QywgMHhGNywweDA0LCAweDM1LDB4NDAsIDB4OTUsMHgxNiwgMHhGRiwweEY0LCAweDk1LDB4OTYsIDB4RkYsMHhGNCwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHhGNywweDA1LCAweDM1LDB4NDAsIDB4RjUsMHg4NCwgMHgzNSwweDI4LCAweDg2LDB4QjIsIDB4MDAsMHgwNCwgMHg4NywweDJFLCAKKzB4MTQsMHgxNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDk3LDB4MkUsIDB4MTQsMHgxNCwgMHg4NywweDMyLCAKKzB4MDAsMHg4MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAxLCAweEVFLDB4MDAsIDB4NTMsMHg0QywgMHhGNywweDA2LCAKKzB4MEMsMHgzRSwgMHhDMCwweDdFLCAweDc0LDB4MDAsIDB4RTYsMHgwMCwgMHg1MCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDdFLCAKKzB4NzQsMHgwMCwgMHhFNiwweDAwLCAweDRGLDB4RjEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDYsIDB4MEMsMHgzRSwgMHhDNywweDdDLCAKKzB4NzQsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MTAsIDB4RTYsMHgwMCwgMHg1MywweDRDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGRiwweDgyLCAKKzB4MDAsMHgxMCwgMHg4NiwweDgyLCAweEZGLDB4MzgsIDB4RjcsMHgwNCwgMHgzNSwweDU4LCAweEY1LDB4ODQsIDB4NkYsMHg1OCwgMHhGNiwweDg1LCAKKzB4MzUsMHg1NCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIDB4NTAsMHg2NCwgMHhGNywweDA1LCAKKzB4MzUsMHg1OCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4NTAsMHg1OCwgMHhCNSwweEJBLCAKKzB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjQsMHg4MiwgMHgwMCwweDIyLCAweEUwLDB4MDAsIDB4NTAsMHg2OCwgMHhGNCwweDg1LCAKKzB4NkYsMHg1OCwgMHhGMCwweDA1LCAweDZGLDB4NTQsIDB4RjYsMHg4NCwgMHgzNSwweDJDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAKKzB4MDAsMHg5NCwgMHhDNCwweDg0LCAweDAwLDB4MDAsIDB4QzAsMHgzQSwgMHg0QSwweDAwLCAweEU2LDB4MDAsIDB4NTAsMHhDRCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NiwweDM2LCAweDAwLDB4OTQsIDB4RjYsMHg4NCwgMHgzNSwweDU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NiwweEI0LCAKKzB4RkYsMHhGMCwgMHhGNywweDA0LCAweDM1LDB4NTQsIDB4OTYsMHg5NiwgMHhGRiwweEY0LCAweDQ3LDB4MzksIDB4MDAsMHgwMCwgMHg5NywweDE2LCAKKzB4RkYsMHhGMCwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4RjcsMHgwNCwgMHgzNSwweDQ4LCAweDc3LDB4QjQsIDB4MDAsMHgwRiwgMHg3MCwweDNFLCAKKzB4RkYsMHhFMSwgMHgwNywweDM4LCAweDAwLDB4MjQsIDB4RTYsMHgwMCwgMHg1MCwweEM1LCAweEM2LDB4MzgsIDB4NjAsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMSwgMHhDNywweDA0LCAweDZFLDB4MDAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweEY2LDB4ODQsIDB4MzUsMHg0NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwRiwgMHhFMiwweDAwLCAKKzB4NTEsMHgxOSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDBDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHg5NywweDM2LCAweDAwLDB4MEMsIDB4ODcsMHgzNiwgMHgwMCwweDBDLCAweEUwLDB4MDAsIDB4NTEsMHgyQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDM1LDB4MjgsIDB4RjYsMHg4MiwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4NTIsMHhDNCwgMHhGNywweDA1LCAweDM1LDB4NDQsIDB4MjAsMHgzQSwgMHgwMCwweDEwLCAweEU2LDB4MDAsIDB4NTEsMHgyOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4OTcsMHgzNiwgMHgwMCwweDA0LCAweEY3LDB4MDQsIDB4MzUsMHgzQywgMHhGNiwweDg0LCAKKzB4MzUsMHgyOCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHgzNSwweDNDLCAweEY3LDB4MDQsIDB4MzUsMHgzQywgMHg4NywweDM2LCAKKzB4MTQsMHgxQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIDB4MTQsMHgxQywgMHhGNywweDA0LCAKKzB4NzYsMHgwNCwgMHg4NiwweEI2LCAweDE0LDB4MUMsIDB4RjYsMHgwNCwgMHg3NSwweEZDLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDg0LCAKKzB4NzYsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDAsIDB4NTEsMHg3OCwgMHhGNywweDA1LCAKKzB4NzYsMHgwNCwgMHhGMCwweDA1LCAweDc2LDB4MDQsIDB4RjYsMHg4NCwgMHg3NiwweDA0LCAweEY3LDB4MDQsIDB4NzYsMHgwOCwgMHhGMCwweDA1LCAKKzB4NzUsMHhGQywgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NTEsMHhERCwgMHhGNywweDA1LCAweDc1LDB4RjgsIDB4RjcsMHgwNCwgMHg3NiwweDQ4LCAweEY0LDB4ODYsIDB4NzIsMHgxOCwgMHhDMCwweDNBLCAKKzB4NEEsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NTEsMHhERCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjQsMHg4MiwgMHgwMCwweDBFLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4NTEsMHhEQywgMHhCNCwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY1LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDJBLCAKKzB4MDAsMHgwMiwgMHhFRSwweDAwLCAweDUyLDB4QzQsIDB4RjYsMHg4MiwgMHgwMCwweDAwLCAweEY2LDB4ODQsIDB4MzUsMHgyOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMiwgMHhFNiwweDAwLCAKKzB4NTIsMHg5OCwgMHgwNSwweEI0LCAweDAwLDB4MDgsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4MTYsIDB4RkYsMHhFQywgMHg5NSwweDk2LCAKKzB4RkYsMHhFOCwgMHg5NiwweDk2LCAweEZGLDB4RTQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NUUsMHhEQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NSwweDE2LCAweEZGLDB4RUMsIDB4ODUsMHg5NiwgMHhGRiwweEU4LCAweDg2LDB4OTYsIDB4RkYsMHhFNCwgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDUyLDB4ODgsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDg2LDB4MzYsIDB4MDAsMHgwQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MEYsIDB4RTIsMHgwMCwgMHg1MiwweDZELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAKKzB4MDAsMHgxNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIDB4MDAsMHgxNCwgMHg4NywweDM2LCAKKzB4MDAsMHgxNCwgMHhFMCwweDAwLCAweDUyLDB4ODgsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAKKzB4NjAsMHgwMCwgMHg3NywweDM1LCAweDAwLDB4MDUsIDB4QzcsMHgzOCwgMHg2QSwweDAwLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHgwNywweDM4LCAKKzB4MDAsMHgxMCwgMHhDNywweDJDLCAweDcwLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NTEsMHgwNCwgMHhGNywweDA1LCAKKzB4MzUsMHgyQywgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4RjcsMHgwNCwgMHg2RiwweDRDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDUyLDB4QjgsIDB4MDcsMHgzNCwgMHgxNCwweDk0LCAweEY0LDB4ODQsIDB4NkYsMHg0NCwgMHhFMCwweDAwLCAKKzB4NTIsMHhCQywgMHhGNCwweDg1LCAweDM1LDB4MjgsIDB4RjcsMHgwNSwgMHgzNSwweDI4LCAweEUwLDB4MDAsIDB4NTEsMHhFMCwgMHgwNSwweDI4LCAKKzB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg1MiwweEZELCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAKKzB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhGNCwweDgyLCAweDAwLDB4MEQsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4NTMsMHgwNCwgMHhCNCwweEJBLCAKKzB4NjgsMHgwMiwgMHhFMCwweDAwLCAweDUzLDB4MDQsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY0LDB4ODIsIDB4MDAsMHgwMSwgMHhGNCwweDg1LCAKKzB4MzUsMHgyNCwgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4RjcsMHgwNCwgMHg2RiwweDQ0LCAweEY0LDB4ODYsIDB4MzIsMHhGNCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDUzLDB4NEMsIDB4RjQsMHg4NSwgMHgzNSwweDMwLCAweEY3LDB4MDQsIDB4RTAsMHgxOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NywweEI4LCAweDAwLDB4MUYsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDAsIDB4NTMsMHg0RCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwRiwweDgxLCAweDQwLDB4MDAsIDB4RjcsMHgwNCwgMHg3OSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDc5LDB4QzgsIDB4RjcsMHgwNCwgMHg3OSwweEM4LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDE0LCAweEY0LDB4ODQsIDB4MzUsMHg1NCwgMHhGNiwweDg0LCAKKzB4MzUsMHg0QywgMHhGNSwweDg0LCAweDM1LDB4MkMsIDB4OTQsMHg4MiwgMHhGRiwweDM4LCAweDc2LDB4QjUsIDB4MDAsMHgwMywgMHhBNSwweDJFLCAKKzB4NjgsMHgwMiwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgwMiwgMHhGRiwweDNDLCAweEYzLDB4ODQsIDB4MzUsMHg1MCwgMHhDNiwweEFDLCAKKzB4NjgsMHgwMCwgMHg5MywweDgyLCAweEZGLDB4NDAsIDB4ODcsMHgzNiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NywweDAyLCAKKzB4RkYsMHg0NCwgMHg4NiwweDM2LCAweDAwLDB4MDQsIDB4RjcsMHgwNCwgMHgzNSwweDQwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHhGNywweDA1LCAweDM1LDB4NDAsIDB4RjYsMHgwNCwgMHgzNSwweDI4LCAweDg2LDB4QjYsIDB4MDAsMHgwNCwgMHg4NywweDMyLCAKKzB4MTQsMHgxNCwgMHg5NCwweDk2LCAweEZGLDB4RjQsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDk3LDB4MzIsIDB4MTQsMHgxNCwgMHg4NywweDJFLCAKKzB4MDAsMHg4MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAxLCAweEVFLDB4MDAsIDB4NTcsMHg1MCwgMHg5NSwweDE2LCAKKzB4RkYsMHhGNCwgMHhGNywweDA2LCAweDBDLDB4M0UsIDB4QzAsMHg3RSwgMHg3NCwweDAwLCAweEU2LDB4MDAsIDB4NTQsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDdFLCAweDc0LDB4MDAsIDB4RTYsMHgwMCwgMHg1MywweEY1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA2LCAKKzB4MEMsMHgzRSwgMHhDNywweDdDLCAweDc0LDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDEwLCAweEU2LDB4MDAsIDB4NTcsMHg1MCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGRiwweDgyLCAweDAwLDB4MTAsIDB4ODYsMHg4MiwgMHhGRiwweDM4LCAweEY3LDB4MDQsIDB4MzUsMHg1OCwgMHhGNSwweDg0LCAKKzB4NkYsMHg1OCwgMHhGNiwweDg1LCAweDM1LDB4NTQsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgyMSwgMHhFMiwweDAwLCAKKzB4NTQsMHg2OCwgMHhGNywweDA1LCAweDM1LDB4NTgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4NTQsMHg1QywgMHhCNSwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEYzLDB4ODIsIDB4MDAsMHgyMiwgMHhFMCwweDAwLCAKKzB4NTQsMHg2QywgMHhGMywweDg1LCAweDZGLDB4NTgsIDB4RjAsMHgwNSwgMHg2RiwweDU0LCAweEY2LDB4ODQsIDB4MzUsMHgyQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4OTQsIDB4QzMsMHg4NCwgMHgwMCwweDAwLCAweEMwLDB4M0EsIDB4M0EsMHgwMCwgMHhFNiwweDAwLCAKKzB4NTQsMHhEMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHgzNiwgMHgwMCwweDk0LCAweEY2LDB4ODQsIDB4MzUsMHg1NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NiwweEI0LCAweEZGLDB4RjAsIDB4RjcsMHgwNCwgMHgzNSwweDU0LCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHg0NywweDM5LCAKKzB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4RjAsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweEY3LDB4MDQsIDB4MzUsMHg0OCwgMHg3NywweEI0LCAKKzB4MDAsMHgwRiwgMHg3MCwweDNFLCAweEZGLDB4RTEsIDB4MDcsMHgzOCwgMHgwMCwweDI0LCAweEU2LDB4MDAsIDB4NTQsMHhDOSwgMHhDNiwweDM4LCAKKzB4NjAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDEsIDB4QzcsMHgwNCwgMHg2RSwweDAwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHhGNiwweDg0LCAKKzB4MzUsMHg0NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwRiwgMHhFMiwweDAwLCAweDU1LDB4MUQsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgwQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgwMCwweDBDLCAweDg3LDB4MzYsIDB4MDAsMHgwQywgMHhFMCwweDAwLCAKKzB4NTUsMHgzMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHgzNSwweDI4LCAweEY2LDB4ODIsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDU2LDB4QzgsIDB4RjcsMHgwNSwgMHgzNSwweDQ0LCAweDIwLDB4M0EsIDB4MDAsMHgxMCwgMHhFNiwweDAwLCAKKzB4NTUsMHgyQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDk3LDB4MzYsIDB4MDAsMHgwNCwgMHhGNywweDA0LCAKKzB4MzUsMHgzQywgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4MzUsMHgzQywgMHhGNywweDA0LCAKKzB4MzUsMHgzQywgMHg4NywweDM2LCAweDE0LDB4MUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MTQsMHgxQywgMHhGNywweDA0LCAweDc2LDB4MDQsIDB4ODYsMHhCNiwgMHgxNCwweDFDLCAweEY2LDB4MDQsIDB4NzUsMHhGQywgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDg0LCAweDc2LDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHhFNiwweDAwLCAKKzB4NTUsMHg3QywgMHhGNywweDA1LCAweDc2LDB4MDQsIDB4RjAsMHgwNSwgMHg3NiwweDA0LCAweEY2LDB4ODQsIDB4NzYsMHgwNCwgMHhGNywweDA0LCAKKzB4NzYsMHgwOCwgMHhGMCwweDA1LCAweDc1LDB4RkMsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDU1LDB4RTEsIDB4RjcsMHgwNSwgMHg3NSwweEY4LCAweEY3LDB4MDQsIDB4NzYsMHg0OCwgMHhGMywweDg2LCAKKzB4NzIsMHgxOCwgMHhDMCwweDNBLCAweDNBLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NTUsMHhFMSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4ODIsIDB4MDAsMHgwRSwgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDU1LDB4RTAsIDB4QjMsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHgyMCwweDJBLCAweDAwLDB4MDIsIDB4RUUsMHgwMCwgMHg1NiwweEM4LCAweEY2LDB4ODIsIDB4MDAsMHgwMCwgMHhGNiwweDg0LCAKKzB4MzUsMHgyOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMiwgMHhFNiwweDAwLCAweDU2LDB4OUMsIDB4MDUsMHhCNCwgMHgwMCwweDA4LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHg5NSwweDE2LCAKKzB4RkYsMHhFQywgMHg5NSwweDk2LCAweEZGLDB4RTgsIDB4OTYsMHg5NiwgMHhGRiwweEU0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4NUUsMHhEQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHhGRiwweEVDLCAweDg1LDB4OTYsIDB4RkYsMHhFOCwgMHg4NiwweDk2LCAKKzB4RkYsMHhFNCwgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg1NiwweDhDLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg4NiwweDM2LCAKKzB4MDAsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDBGLCAweEUyLDB4MDAsIDB4NTYsMHg3MSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MDAsMHgxNCwgMHg4NywweDM2LCAweDAwLDB4MTQsIDB4RTAsMHgwMCwgMHg1NiwweDhDLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDYwLDB4MDAsIDB4NzcsMHgzNSwgMHgwMCwweDA1LCAweEM3LDB4MzgsIDB4NkEsMHgwMCwgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MTAsIDB4QzcsMHgyQywgMHg3MCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NTUsMHgwOCwgMHhGNywweDA1LCAweDM1LDB4MkMsIDB4RjYsMHg4NCwgMHgzNSwweDI4LCAweEY3LDB4MDQsIDB4NkYsMHg0QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg1NiwweEJDLCAweDA3LDB4MzQsIDB4MTQsMHg5NCwgMHhGMywweDg0LCAKKzB4NkYsMHg0NCwgMHhFMCwweDAwLCAweDU2LDB4QzAsIDB4RjMsMHg4NSwgMHgzNSwweDI4LCAweEY3LDB4MDUsIDB4MzUsMHgyOCwgMHhFMCwweDAwLCAKKzB4NTUsMHhFNCwgMHgwNSwweDI4LCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NTcsMHgwMSwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHg4MiwgMHgwMCwweDBELCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4NTcsMHgwOCwgMHhCMywweEJBLCAweDY4LDB4MDIsIDB4RTAsMHgwMCwgMHg1NywweDA4LCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGMywweDgyLCAKKzB4MDAsMHgwMSwgMHhGMywweDg1LCAweDM1LDB4MjQsIDB4RjYsMHg4NCwgMHgzNSwweDI4LCAweEY3LDB4MDQsIDB4NkYsMHg0NCwgMHhGMywweDg2LCAKKzB4MzIsMHhGNCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg1NywweDUwLCAweEYzLDB4ODUsIDB4MzUsMHgzMCwgMHhGNywweDA0LCAKKzB4RTAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhCOCwgMHgwMCwweDFGLCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAwLCAKKzB4NTcsMHg1MSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MEYsMHg4MSwgMHg0MCwweDAwLCAweEY3LDB4MDQsIDB4NzksMHhDOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3OSwweEM4LCAweEY3LDB4MDQsIDB4NzksMHhDOCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgxNCwgMHg4NywweDAyLCAKKzB4RkYsMHgzOCwgMHhGMywweDg0LCAweDM1LDB4MkMsIDB4RjcsMHgwNSwgMHgzNSwweDU0LCAweDg3LDB4MUUsIDB4MDAsMHg4MCwgMHhGNSwweDA0LCAKKzB4MzUsMHg0QywgMHgyNywweDM4LCAweDAwLDB4MDEsIDB4QzAsMHgyQSwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NUEsMHg0QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNSwweDg0LCAweDZGLDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgyMSwgMHhFMiwweDAwLCAKKzB4NTcsMHhEOCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4NTcsMHhDQywgMHhCNSwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEYzLDB4MDIsIDB4MDAsMHgyMiwgMHhFMCwweDAwLCAKKzB4NTcsMHhEQywgMHhGMywweDA1LCAweDZGLDB4NTgsIDB4RjAsMHgwNSwgMHg2RiwweDU0LCAweEY2LDB4ODQsIDB4MzUsMHgyQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4OTQsIDB4QzMsMHgwNCwgMHgwMCwweDAwLCAweEMwLDB4M0EsIDB4MzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4NTgsMHg0MSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHgzNiwgMHgwMCwweDk0LCAweEY2LDB4ODQsIDB4MzUsMHg1NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NiwweEI0LCAweEZGLDB4RjAsIDB4RjcsMHgwNCwgMHgzNSwweDU0LCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHg0NywweDM5LCAKKzB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4RjAsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweEY3LDB4MDQsIDB4MzUsMHg0OCwgMHg3NywweEI0LCAKKzB4MDAsMHgwRiwgMHg3MCwweDNFLCAweEZGLDB4RTEsIDB4MDcsMHgzOCwgMHgwMCwweDI0LCAweEU2LDB4MDAsIDB4NTgsMHgzOSwgMHhDNiwweDM4LCAKKzB4NjAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDEsIDB4QzcsMHgwNCwgMHg2RSwweDAwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHhGNiwweDg0LCAKKzB4MzUsMHg0NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwRiwgMHhFMiwweDAwLCAweDU4LDB4OEQsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgwQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgwMCwweDBDLCAweDg3LDB4MzYsIDB4MDAsMHgwQywgMHhFMCwweDAwLCAKKzB4NTgsMHhBMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHgzNSwweDI4LCAweEY2LDB4ODIsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDVBLDB4MzgsIDB4RjcsMHgwNSwgMHgzNSwweDQ0LCAweDIwLDB4M0EsIDB4MDAsMHgxMCwgMHhFNiwweDAwLCAKKzB4NTgsMHg5QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDk3LDB4MzYsIDB4MDAsMHgwNCwgMHhGNywweDA0LCAKKzB4MzUsMHgzQywgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4MzUsMHgzQywgMHhGNywweDA0LCAKKzB4MzUsMHgzQywgMHg4NywweDM2LCAweDE0LDB4MUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MTQsMHgxQywgMHhGNywweDA0LCAweDc2LDB4MDQsIDB4ODYsMHhCNiwgMHgxNCwweDFDLCAweEY2LDB4MDQsIDB4NzUsMHhGQywgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDg0LCAweDc2LDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHhFNiwweDAwLCAKKzB4NTgsMHhFQywgMHhGNywweDA1LCAweDc2LDB4MDQsIDB4RjAsMHgwNSwgMHg3NiwweDA0LCAweEY2LDB4ODQsIDB4NzYsMHgwNCwgMHhGNywweDA0LCAKKzB4NzYsMHgwOCwgMHhGMCwweDA1LCAweDc1LDB4RkMsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDU5LDB4NTEsIDB4RjcsMHgwNSwgMHg3NSwweEY4LCAweEY3LDB4MDQsIDB4NzYsMHg0OCwgMHhGMywweDA2LCAKKzB4NzIsMHgxOCwgMHhDMCwweDNBLCAweDMyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NTksMHg1MSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4MDIsIDB4MDAsMHgwRSwgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDU5LDB4NTAsIDB4QjMsMHgzQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHgyMCwweDJBLCAweDAwLDB4MDIsIDB4RUUsMHgwMCwgMHg1QSwweDM4LCAweEY2LDB4ODIsIDB4MDAsMHgwMCwgMHhGNiwweDg0LCAKKzB4MzUsMHgyOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMiwgMHhFNiwweDAwLCAweDVBLDB4MEMsIDB4MDUsMHhCNCwgMHgwMCwweDA4LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHg5NSwweDE2LCAKKzB4RkYsMHhFQywgMHg5NSwweDk2LCAweEZGLDB4RTgsIDB4OTYsMHg5NiwgMHhGRiwweEU0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4NUUsMHhEQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHhGRiwweEVDLCAweDg1LDB4OTYsIDB4RkYsMHhFOCwgMHg4NiwweDk2LCAKKzB4RkYsMHhFNCwgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg1OSwweEZDLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg4NiwweDM2LCAKKzB4MDAsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDBGLCAweEUyLDB4MDAsIDB4NTksMHhFMSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MDAsMHgxNCwgMHg4NywweDM2LCAweDAwLDB4MTQsIDB4RTAsMHgwMCwgMHg1OSwweEZDLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDYwLDB4MDAsIDB4NzcsMHgzNSwgMHgwMCwweDA1LCAweEM3LDB4MzgsIDB4NkEsMHgwMCwgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MTAsIDB4QzcsMHgyQywgMHg3MCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NTgsMHg3OCwgMHhGNywweDA1LCAweDM1LDB4MkMsIDB4RjYsMHg4NCwgMHgzNSwweDI4LCAweEY3LDB4MDQsIDB4NkYsMHg0QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg1QSwweDJDLCAweDA3LDB4MzQsIDB4MTQsMHg5NCwgMHhGMywweDA0LCAKKzB4NkYsMHg0NCwgMHhFMCwweDAwLCAweDVBLDB4MzAsIDB4RjMsMHgwNSwgMHgzNSwweDI4LCAweEY3LDB4MDUsIDB4MzUsMHgyOCwgMHhFMCwweDAwLCAKKzB4NTksMHg1NCwgMHgwNSwweDI4LCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NUQsMHhDNCwgMHhGMywweDAyLCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDVELDB4RjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4MjksIDB4MDAsMHgwMywgMHhDNywweDFDLCAKKzB4NzAsMHgwMCwgMHg4NywweDNBLCAweDAwLDB4MDQsIDB4MDUsMHgyOCwgMHgwMCwweDAxLCAweDc2LDB4QTksIDB4MDAsMHgwMywgMHhGNCwweDg0LCAKKzB4MzUsMHg1NCwgMHhGNiwweDA0LCAweDM1LDB4NTAsIDB4OTQsMHg4MiwgMHhGRiwweDM4LCAweEE0LDB4MUUsIDB4NjgsMHgwMiwgMHhDNiwweDMwLCAKKzB4NzAsMHgwMCwgMHg5NCwweDAyLCAweEZGLDB4M0MsIDB4OTYsMHgwMiwgMHhGRiwweDQwLCAweEM2LDB4OUMsIDB4NjgsMHgwMCwgMHg4NywweDM2LCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTcsMHgwMiwgMHhGRiwweDQ0LCAweDg1LDB4QjYsIDB4MDAsMHgwNCwgMHhGNywweDA0LCAKKzB4MzUsMHg0MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg1OCwweDAwLCAweEY3LDB4MDUsIDB4MzUsMHg0MCwgMHg4NSwweEI2LCAKKzB4MDAsMHgwNCwgMHhGNSwweDA1LCAweDM1LDB4NEMsIDB4RjYsMHg4NCwgMHgzNSwweDI4LCAweEY2LDB4MDUsIDB4MzUsMHg1MCwgMHg4NywweDM2LCAKKzB4MTQsMHgxNCwgMHg5NCwweDk2LCAweEZGLDB4RjQsIDB4QzcsMHgzOCwgMHg1OCwweDAwLCAweDk3LDB4MzYsIDB4MTQsMHgxNCwgMHg4NywweDFFLCAKKzB4MDAsMHg4MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAxLCAweEVFLDB4MDAsIDB4NUUsMHgzQywgMHg5NCwweDE2LCAKKzB4RkYsMHhGNCwgMHhGNywweDA2LCAweDBDLDB4M0UsIDB4QzAsMHg3RSwgMHg3NCwweDAwLCAweEU2LDB4MDAsIDB4NUEsMHhGNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDdFLCAweDc0LDB4MDAsIDB4RTYsMHgwMCwgMHg1QSwweEU1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA2LCAKKzB4MEMsMHgzRSwgMHhDNywweDdDLCAweDc0LDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDEwLCAweEU2LDB4MDAsIDB4NUUsMHgzQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGRiwweDgyLCAweDAwLDB4MTAsIDB4ODYsMHg4MiwgMHhGRiwweDM4LCAweEY3LDB4MDQsIDB4MzUsMHg1OCwgMHhGNSwweDg0LCAKKzB4NkYsMHg1OCwgMHhGNiwweDg1LCAweDM1LDB4NTQsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgyMSwgMHhFMiwweDAwLCAKKzB4NUIsMHg1OCwgMHhGNywweDA1LCAweDM1LDB4NTgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4NUIsMHg0QywgMHhCNSwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEYzLDB4MDIsIDB4MDAsMHgyMiwgMHhFMCwweDAwLCAKKzB4NUIsMHg1QywgMHhGMywweDA1LCAweDZGLDB4NTgsIDB4RjAsMHgwNSwgMHg2RiwweDU0LCAweEY2LDB4ODQsIDB4MzUsMHgyQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4OTQsIDB4QzMsMHgwNCwgMHgwMCwweDAwLCAweEMwLDB4M0EsIDB4MzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4NUIsMHhDMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHgzNiwgMHgwMCwweDk0LCAweEY2LDB4ODQsIDB4MzUsMHg1NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NiwweEI0LCAweEZGLDB4RjAsIDB4RjcsMHgwNCwgMHgzNSwweDU0LCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHg0NywweDM5LCAKKzB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4RjAsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweEY3LDB4MDQsIDB4MzUsMHg0OCwgMHg3NywweEI0LCAKKzB4MDAsMHgwRiwgMHg3MCwweDNFLCAweEZGLDB4RTEsIDB4MDcsMHgzOCwgMHgwMCwweDI0LCAweEU2LDB4MDAsIDB4NUIsMHhCOSwgMHhDNiwweDM4LCAKKzB4NjAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDEsIDB4QzcsMHgwNCwgMHg2RSwweDAwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHhGNiwweDg0LCAKKzB4MzUsMHg0NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwRiwgMHhFMiwweDAwLCAweDVDLDB4MEQsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgwQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgwMCwweDBDLCAweDg3LDB4MzYsIDB4MDAsMHgwQywgMHhFMCwweDAwLCAKKzB4NUMsMHgyMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHgzNSwweDI4LCAweEY2LDB4ODIsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDVELDB4QjgsIDB4RjcsMHgwNSwgMHgzNSwweDQ0LCAweDIwLDB4M0EsIDB4MDAsMHgxMCwgMHhFNiwweDAwLCAKKzB4NUMsMHgxQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDk3LDB4MzYsIDB4MDAsMHgwNCwgMHhGNywweDA0LCAKKzB4MzUsMHgzQywgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4MzUsMHgzQywgMHhGNywweDA0LCAKKzB4MzUsMHgzQywgMHg4NywweDM2LCAweDE0LDB4MUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MTQsMHgxQywgMHhGNywweDA0LCAweDc2LDB4MDQsIDB4ODYsMHhCNiwgMHgxNCwweDFDLCAweEY2LDB4MDQsIDB4NzUsMHhGQywgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDg0LCAweDc2LDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHhFNiwweDAwLCAKKzB4NUMsMHg2QywgMHhGNywweDA1LCAweDc2LDB4MDQsIDB4RjAsMHgwNSwgMHg3NiwweDA0LCAweEY2LDB4ODQsIDB4NzYsMHgwNCwgMHhGNywweDA0LCAKKzB4NzYsMHgwOCwgMHhGMCwweDA1LCAweDc1LDB4RkMsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDVDLDB4RDEsIDB4RjcsMHgwNSwgMHg3NSwweEY4LCAweEY3LDB4MDQsIDB4NzYsMHg0OCwgMHhGMywweDA2LCAKKzB4NzIsMHgxOCwgMHhDMCwweDNBLCAweDMyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NUMsMHhEMSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4MDIsIDB4MDAsMHgwRSwgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDVDLDB4RDAsIDB4QjMsMHgzQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHgyMCwweDJBLCAweDAwLDB4MDIsIDB4RUUsMHgwMCwgMHg1RCwweEI4LCAweEY2LDB4ODIsIDB4MDAsMHgwMCwgMHhGNiwweDg0LCAKKzB4MzUsMHgyOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMiwgMHhFNiwweDAwLCAweDVELDB4OEMsIDB4MDUsMHhCNCwgMHgwMCwweDA4LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHg5NSwweDE2LCAKKzB4RkYsMHhFQywgMHg5NSwweDk2LCAweEZGLDB4RTgsIDB4OTYsMHg5NiwgMHhGRiwweEU0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4NUUsMHhEQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHhGRiwweEVDLCAweDg1LDB4OTYsIDB4RkYsMHhFOCwgMHg4NiwweDk2LCAKKzB4RkYsMHhFNCwgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg1RCwweDdDLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg4NiwweDM2LCAKKzB4MDAsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDBGLCAweEUyLDB4MDAsIDB4NUQsMHg2MSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAKKzB4MDAsMHgxNCwgMHg4NywweDM2LCAweDAwLDB4MTQsIDB4RTAsMHgwMCwgMHg1RCwweDdDLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDYwLDB4MDAsIDB4NzcsMHgzNSwgMHgwMCwweDA1LCAweEM3LDB4MzgsIDB4NkEsMHgwMCwgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MTAsIDB4QzcsMHgyQywgMHg3MCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NUIsMHhGOCwgMHhGNywweDA1LCAweDM1LDB4MkMsIDB4RjYsMHg4NCwgMHgzNSwweDI4LCAweEY3LDB4MDQsIDB4NkYsMHg0QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg1RCwweEFDLCAweDA3LDB4MzQsIDB4MTQsMHg5NCwgMHhGMywweDA0LCAKKzB4NkYsMHg0NCwgMHhFMCwweDAwLCAweDVELDB4QjAsIDB4RjMsMHgwNSwgMHgzNSwweDI4LCAweEY3LDB4MDUsIDB4MzUsMHgyOCwgMHhFMCwweDAwLCAKKzB4NUMsMHhENCwgMHgwNSwweDI4LCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NUQsMHhGMSwgMHhGMywweDAyLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHgwMiwgMHgwMCwweDBELCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4NUQsMHhGNCwgMHhCMywweDNBLCAweDY4LDB4MDIsIDB4RTAsMHgwMCwgMHg1RCwweEY0LCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGMywweDA1LCAKKzB4MzUsMHgyNCwgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4RjcsMHgwNCwgMHg2RiwweDQ0LCAweEYzLDB4MDYsIDB4MzIsMHhGNCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDVFLDB4M0MsIDB4RjMsMHgwNSwgMHgzNSwweDMwLCAweEY3LDB4MDQsIDB4RTAsMHgxOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NywweEI4LCAweDAwLDB4MUYsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDAsIDB4NUUsMHgzRCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwRiwweDgxLCAweDQwLDB4MDAsIDB4RjcsMHgwNCwgMHg3OSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDc5LDB4QzgsIDB4RjcsMHgwNCwgMHg3OSwweEM4LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNiwgMHgzNSwweDMwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4MzIsMHhGNCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDM1LDB4MzAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzMsMHg4MCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4MzUsMHgzMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzNCwweDBDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzUsMHgzMCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDM0LDB4OTgsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHg4NiwweDE2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzIsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MEYsIDB4ODYsMHhCMiwgMHgwMCwweDAwLCAweEM1LDB4MzgsIDB4MDAsMHgwMCwgMHhFRSwweDAwLCAKKzB4NUYsMHgyQywgMHhDNSwweEI0LCAweDAwLDB4MDAsIDB4MjAsMHgzNiwgMHgwMCwweDBGLCAweEVFLDB4MDAsIDB4NUYsMHgyQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RUMsMHgwMCwgMHg1RiwweDJELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMCwgMHhFQywweDAwLCAweDVGLDB4NDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzIsIDB4MDAsMHgwQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgzMiwgMHgwMCwweDBDLCAweDg3LDB4MzIsIDB4MDAsMHgwQywgMHhFMCwweDAwLCAKKzB4NUYsMHg1MCwgMHhGNCwweDAyLCAweDAwLDB4MDAsIDB4QzAsMHgyQSwgMHg1QSwweDAwLCAweDQ0LDB4MEMsIDB4MDAsMHgwMSwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNiwweDg2LCAKKzB4MzUsMHg2MCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4NiwgMHg0MiwweDMwLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4NDgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODIsIDB4NjYsMHhGOCwgMHg5NiwweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MTcsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODYsIDB4MzUsMHg2MCwgMHg5NiwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDgyLCAKKzB4NjksMHg4MCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDE4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDg2LCAKKzB4MzUsMHg2MCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNiwweDgyLCAweDZCLDB4NTAsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgxNiwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNiwweDg2LCAweDM1LDB4NjAsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4MiwgMHg2MSwweDc4LCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAKKzB4MDAsMHgxRiwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4NiwgMHgzNSwweDYwLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODIsIDB4NjIsMHg3QywgMHg5NiwweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MjAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODYsIDB4MzUsMHg2MCwgMHg5NiwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDgyLCAKKzB4NjYsMHhGOCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDE3LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDg2LCAKKzB4MzUsMHhFQywgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNiwweDgyLCAweDY5LDB4ODAsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgxOCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNiwweDg2LCAweDM1LDB4RUMsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4MiwgMHg2QiwweDUwLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAKKzB4MDAsMHgxNiwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4NiwgMHgzNSwweEVDLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODIsIDB4NjEsMHg3OCwgMHg5NiwweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MUYsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODYsIDB4MzUsMHhFQywgMHg5NiwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDgyLCAKKzB4NjIsMHg3QywgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDIwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDg2LCAKKzB4MzUsMHhFQywgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDA0LCAweEUwLDB4MjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NjEsMHgxNSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHhFMCwweDI4LCAweEUwLDB4MDAsIDB4NjEsMHgxOCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhGNywweDAyLCAweDAwLDB4RjAsIDB4RjcsMHgwNSwgMHg0MiwweDI4LCAweEY3LDB4MDYsIDB4NDAsMHg4QSwgMHhGMCwweDNCLCAKKzB4MjgsMHgwMCwgMHhGNywweDA2LCAweDQwLDB4OEMsIDB4RjAsMHgzQiwgMHgyOCwweDAwLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHhGNywweDA1LCAKKzB4N0EsMHhDMCwgMHhGNywweDA1LCAweDdBLDB4QjgsIDB4RjcsMHgwNSwgMHg3QSwweEIwLCAweEY3LDB4MDUsIDB4N0EsMHhDOCwgMHhGNiwweDgyLCAKKzB4QzMsMHg1MCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4MiwgMHgwMCwweDE2LCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDg2LCAKKzB4NDIsMHgzMCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MUUsMHhDMCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNiwweDA0LCAKKzB4NkYsMHgzNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjEsMHhFRCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHgyMCwweDNBLCAweDAwLDB4MDcsIDB4RTYsMHgwMCwgMHg2MSwweEVDLCAweDA2LDB4QjAsIDB4MDAsMHgwMiwgMHg4NywweDM2LCAKKzB4MDAsMHgwMCwgMHg3NiwweEI1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHgyMCwweDNBLCAweDAwLDB4MDEsIDB4RTYsMHgwMCwgMHg2MSwweEVDLCAweEY1LDB4MDYsIDB4MzUsMHhFQywgMHhGNywweDA0LCAKKzB4NDIsMHgzMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg1MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDYyLDB4MTEsIDB4RjUsMHg4MiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4NDIsMHhBMCwgMHhGNiwweDA2LCAKKzB4NDIsMHhBMiwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RTAsMHgwMCwgMHg2MiwweDY4LCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHhFMCwweDAwLCAweDg2LDB4QjIsIDB4MDAsMHgwOCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDYyLDB4M0MsIDB4RjYsMHg4NSwgMHhFMCwweDA0LCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NjIsMHg0MCwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NjIsMHg2NSwgMHhGNiwweDA2LCAweDQyLDB4QTIsIDB4RjcsMHgwNCwgMHg0MiwweEEwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHhGMCwweDA1LCAweDQyLDB4MjgsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHhGNywweDA0LCAweDQyLDB4M0MsIDB4RjYsMHg4NCwgMHg2RiwweDM0LCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDYyLDB4QjEsIDB4RjcsMHgwNSwgMHg0MiwweDNDLCAweDg3LDB4MzYsIDB4MDAsMHgwMCwgMHhGNSwweDlFLCAKKzB4MDAsMHgwMiwgMHhDMCwweDNBLCAweDVBLDB4MDAsIDB4RTYsMHgwMCwgMHg2MiwweEJELCAweEY1LDB4ODYsIDB4MzUsMHhFQywgMHhGNywweDA0LCAKKzB4NDIsMHhBMCwgMHhFMCwweDAwLCAweDYyLDB4REMsIDB4RjYsMHgwNiwgMHg0MiwweEEyLCAweEY3LDB4MDQsIDB4NDIsMHgzMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDVBLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NjIsMHhGOSwgMHhGNiwweDA2LCAweDQyLDB4QTQsIDB4RjcsMHgwNCwgMHg0MiwweEE0LCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhFMCwweDAwLCAKKzB4NjMsMHgwQywgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4NjMsMHgyMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjAsMHgwNSwgMHg0MiwweDI4LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDIwLCAweDgzLDB4MTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDFBLCAweDAwLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NjMsMHg2QywgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4ODMsMHg5QSwgMHgwMCwweDFDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGMywweDg1LCAKKzB4N0EsMHhDMCwgMHg4NCwweDlBLCAweDAwLDB4MTQsIDB4RjcsMHgwNSwgMHg3QSwweEM4LCAweEY0LDB4ODUsIDB4N0EsMHhCMCwgMHhGNywweDA1LCAKKzB4N0EsMHhCOCwgMHg4MywweDE2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4OUEsIDB4MDAsMHgxNCwgMHhGNywweDA0LCAKKzB4N0EsMHhCMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NjMsMHhEMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMCwgMHg4NiwweDlBLCAweDAwLDB4MUMsIDB4RjcsMHgwNCwgMHg3QSwweEMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDYzLDB4RDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4OUEsIDB4MDAsMHgxOCwgMHhGNywweDA0LCAKKzB4N0EsMHhCOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NjMsMHhEMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NiwweDlBLCAweDAwLDB4MjAsIDB4RjcsMHgwNCwgMHg3QSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4NjQsIDB4RUUsMHgwMCwgMHg2MywweEQ5LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2NCwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4MywweDk2LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgxRSwgMHgwMCwweDE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDY0LDB4M0MsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweEY3LDB4MDUsIDB4NDAsMHg4MCwgMHhGNywweDA1LCAKKzB4NDAsMHg4NCwgMHhGNiwweDg0LCAweDZFLDB4NTAsIDB4RjQsMHg4MiwgMHhGRiwweEZGLCAweDgzLDB4MUUsIDB4MDAsMHgwQywgMHhGNCwweDg1LCAKKzB4NEYsMHg1NCwgMHg5MywweDM2LCAweDAwLDB4MTAsIDB4ODMsMHg5RSwgMHgwMCwweDEwLCAweDg0LDB4OTYsIDB4MDAsMHgwMCwgMHg5MywweEI2LCAKKzB4MDAsMHgxNCwgMHg4NCwweEE2LCAweDAwLDB4MDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4QjYsIDB4MUQsMHhEQywgMHhGNiwweDgyLCAKKzB4MDAsMHg2NCwgMHhGNiwweDg1LCAweDRBLDB4OTgsIDB4RjcsMHgwNSwgMHg0QSwweDlDLCAweDgzLDB4MTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDFBLCAweDAwLDB4MjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFRSwweDAwLCAKKzB4NjQsMHg3QywgMHhGMywweDgyLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg0MiwweEE0LCAweEY2LDB4MDYsIDB4NDIsMHhBNiwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDY2LDB4RTQsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDkzLDB4OTYsIDB4RkYsMHhGNCwgMHg4NCwweDE2LCAKKzB4MDAsMHgwMCwgMHhGNCwweDg2LCAweDQyLDB4QzgsIDB4OTQsMHg5NiwgMHhGRiwweEVDLCAweEYzLDB4MDIsIDB4MDAsMHgwQywgMHg5MywweDE2LCAKKzB4RkYsMHhFNCwgMHg4MywweDk2LCAweDAwLDB4MDAsIDB4ODQsMHg5NiwgMHhGRiwweEY0LCAweDg3LDB4MUUsIDB4MDAsMHgyMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDI2LCAweDcyLDB4MDAsIDB4RUMsMHgwMCwgMHg2NiwweDQ4LCAweEYzLDB4ODYsIDB4NEEsMHg5OCwgMHg4NCwweEEyLCAKKzB4MDAsMHgyNCwgMHg4MywweDE2LCAweEZGLDB4RTQsIDB4QzUsMHgwNCwgMHgwMCwweDAwLCAweEI0LDB4OUEsIDB4MzgsMHgwMiwgMHhDNywweDE4LCAKKzB4MzgsMHgwMCwgMHg4MywweDIyLCAweDAwLDB4MjgsIDB4ODMsMHg5NiwgMHhGRiwweEY0LCAweDg0LDB4OTYsIDB4RkYsMHhFNCwgMHg5MywweDNBLCAKKzB4MDAsMHgwNCwgMHg5MywweEJBLCAweDAwLDB4MDgsIDB4RjYsMHgwNCwgMHhFMCwweDAwLCAweEYzLDB4MDYsIDB4NEEsMHg5OCwgMHhBNiwweEE2LCAKKzB4MzAsMHgwMiwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4QzAsMHgzMiwgMHg2QSwweDAwLCAweEU2LDB4MDAsIDB4NjUsMHgxMCwgMHhDNiwweDM4LCAKKzB4MDAsMHgwMCwgMHhGNiwweDg0LCAweEUwLDB4MDQsIDB4ODcsMHgzMiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDY1LDB4MTQsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDY1LDB4MjEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY1LDB4MDIsIDB4MDAsMHgwMCwgMHhGNiwweDg0LCAKKzB4RTAsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAKKzB4NjUsMHg1QywgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NjUsMHg2NCwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhGNiwweDg0LCAweEUwLDB4MDQsIDB4ODcsMHgzMiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFMiwweDAwLCAweDY1LDB4NjUsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDY1LDB4NzUsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEY1LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDJBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDY1LDB4ODgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDgzLDB4OTYsIDB4RkYsMHhGNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGMywweDg1LCAweDRGLDB4NTQsIDB4ODcsMHgyMiwgMHgwMCwweDJDLCAweDc2LDB4QTEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHgwNSwweEEwLCAweDAwLDB4MkUsIDB4NzYsMHgyRCwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMCwgMHg5NCwweDk2LCAweEZGLDB4REMsIDB4ODMsMHgxNiwgMHhGRiwweEVDLCAweDIwLDB4MjYsIDB4MDAsMHgwNywgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxQiwgMHgyOCwweDAwLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHgwNiwweDk4LCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEUyLDB4MDAsIDB4NjYsMHgxQywgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NSwweDE2LCAweEZGLDB4RUMsIDB4ODUsMHg5NiwgMHhGRiwweERDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDJDLCAKKzB4NDAsMHgwMCwgMHg4NiwweEJBLCAweDAwLDB4MzAsIDB4MDYsMHgyOCwgMHgwMCwweDA0LCAweDA1LDB4MjgsIDB4MDAsMHgwMiwgMHgwNSwweEFDLCAKKzB4MDAsMHgwMiwgMHg4MywweDk2LCAweEZGLDB4REMsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHgwMywweDlDLCAKKzB4MDAsMHgwMSwgMHg5MywweDk2LCAweEZGLDB4REMsIDB4MjAsMHgxRSwgMHgwMCwweDA3LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI0LCAKKzB4RkYsMHhGMCwgMHhFMiwweDAwLCAweDY1LDB4RTEsIDB4RjYsMHhCMywgMHgyOCwweDAwLCAweDA0LDB4MjAsIDB4MDAsMHgxQywgMHg4NCwweDk2LCAKKzB4RkYsMHhFQywgMHg4MywweDE2LCAweEZGLDB4RTQsIDB4ODMsMHg5NiwgMHhGRiwweEY0LCAweDA0LDB4QTQsIDB4MDAsMHgxNCwgMHg5NCwweDk2LCAKKzB4RkYsMHhFQywgMHgwMywweDE4LCAweDAwLDB4MEMsIDB4OTMsMHgxNiwgMHhGRiwweEU0LCAweDAzLDB4OUMsIDB4MDAsMHgwMSwgMHhFMCwweDAwLCAKKzB4NjQsMHg5NCwgMHg5MywweDk2LCAweEZGLDB4RjQsIDB4ODQsMHg5NiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDI2LCAKKzB4MDAsMHgyMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg0QSwweDlDLCAweDg1LDB4QTYsIDB4MDAsMHgyMCwgMHhGNywweDA0LCAKKzB4N0EsMHhCOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4N0EsMHhCOCwgMHhGNywweDA0LCAKKzB4N0EsMHhCOCwgMHhGNiwweDg0LCAweDdBLDB4QzgsIDB4ODYsMHgyNiwgMHgwMCwweDE4LCAweEM2LDB4QjQsIDB4NTgsMHgwMCwgMHg4NywweDI2LCAKKzB4MDAsMHgxQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjcsMHgzOCwgMHgwMCwweDAxLCAweEMwLDB4MzIsIDB4NzIsMHgwMCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2NiwweEU1LCAweEY2LDB4ODUsIDB4N0EsMHhDOCwgMHg4MywweDI2LCAKKzB4MDAsMHgwOCwgMHhGNywweDA0LCAweDZFLDB4NTAsIDB4RjMsMHgwNSwgMHgzQiwweDY0LCAweDgzLDB4QTYsIDB4MDAsMHgwOCwgMHhGNiwweDgyLCAKKzB4MDAsMHgwMCwgMHg5MywweEJBLCAweDFELDB4REMsIDB4ODQsMHhBNiwgMHgwMCwweDBDLCAweDgzLDB4MTYsIDB4MDAsMHgwMCwgMHg5NCwweEJBLCAKKzB4MDAsMHgxMCwgMHg4MywweDFBLCAweDAwLDB4MTAsIDB4RjYsMHg4NSwgMHg3QSwweEM4LCAweDkzLDB4M0EsIDB4MDAsMHgxNCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDQwLDB4ODQsIDB4RjYsMHg4NSwgMHg3QSwweEMwLCAweEY2LDB4ODUsIDB4N0EsMHhCOCwgMHhGNiwweDg1LCAKKzB4N0EsMHhCMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwNCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAKKzB4MDAsMHgwOCwgMHhGMywweDg0LCAweDZGLDB4MzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MUUsIDB4MDAsMHgxOCwgMHhGNiwweDg0LCAKKzB4RTAsMHgxQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEVDLDB4MDAsIDB4NjcsMHgyOSwgMHhGNywweDAyLCAKKzB4MDAsMHgwMSwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjcsMHhFOCwgMHhGNSwweDgyLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweEUwLDB4MUMsIDB4ODYsMHg5RSwgMHgwMCwweDE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAKKzB4NkEsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjcsMHhFOSwgMHhDNSwweDg0LCAKKzB4MDAsMHgwMCwgMHg4NiwweDlFLCAweDAwLDB4MTAsIDB4RjcsMHgwNCwgMHhFMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDY3LDB4ODgsIDB4MDUsMHgxQywgMHgwMCwweDEwLCAweDg2LDB4OUUsIDB4MDAsMHgxNCwgMHhGNywweDA0LCAKKzB4RTAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NjcsMHg4QywgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjcsMHg5OSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4ODYsMHhBQSwgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4RTAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHg2NywweEQ0LCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDY3LDB4REMsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweDg2LDB4QUEsIDB4MDAsMHgwNCwgMHhGNywweDA0LCAKKzB4RTAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4NjcsMHhERCwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjcsMHhFRCwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjgsMHgxMCwgMHhGNiwweDA2LCAKKzB4NDIsMHg5QywgMHhGNywweDA0LCAweDQyLDB4OUMsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHhGNywweDA0LCAKKzB4NzUsMHhGNCwgMHg3NSwweEFDLCAweEZGLDB4RTEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjgsMHg0NSwgMHg5NSwweDk2LCAKKzB4RkYsMHhGNCwgMHhGNywweDA0LCAweDQyLDB4OTgsIDB4RjYsMHgwNiwgMHg0MiwweDk4LCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHg4NywweDFFLCAweDAwLDB4MjAsIDB4MDQsMHgxQywgMHgwMCwweDIwLCAweDc2LDB4QTEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDIwLDB4M0EsIDB4MDAsMHgwOCwgMHhFRSwweDAwLCAKKzB4NjgsMHhDNCwgMHhGMywweDA2LCAweDE1LDB4NTQsIDB4RjUsMHgwMiwgMHgwMCwweDAwLCAweDA1LDB4OUMsIDB4MDAsMHgyMiwgMHhDNCwweEFDLCAKKzB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgyMiwgMHgwMCwweDAwLCAweDc2LDB4QTEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweEMwLDB4MkEsIDB4NzIsMHgwMCwgMHhFQywweDAwLCAKKzB4NjgsMHhDMCwgMHhDNiwweEE0LCAweDYwLDB4MDAsIDB4QTcsMHgyNiwgMHg2MCwweDAyLCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHgwNSwweDI4LCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhFOCwgMHhGNywweDJGLCAKKzB4NjgsMHgwMCwgMHgwNSwweEFDLCAweDAwLDB4MDEsIDB4RTAsMHgwMCwgMHg2OCwweDc4LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHhGMywweDA2LCAKKzB4MTUsMHg1NCwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNCwgMHhFMCwweDI0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA0LCAweEUwLDB4MUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGMywweDA2LCAKKzB4RTAsMHgwMCwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4MDIsIDB4MDAsMHgwMSwgMHg5MywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhFRSwweDY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDY5LDB4MjgsIDB4RjYsMHgwNiwgMHg0MiwweDlFLCAweEY3LDB4MDQsIDB4NDIsMHg5QywgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweEY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDFBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDY5LDB4NkMsIDB4RjMsMHgwNiwgMHgzNSwweEVDLCAweEY3LDB4MDQsIDB4NDIsMHgzMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDMyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NjksMHg2RCwgMHhGMCwweDA1LCAweDQyLDB4MjgsIDB4RjMsMHgwNiwgMHgzNSwweDYwLCAweEYzLDB4MDUsIDB4NDIsMHgzMCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDc4LDB4OUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDA0LCAweEY1LDB4MDQsIDB4NkYsMHgzNCwgMHhGNywweDA0LCAKKzB4NDIsMHg0MCwgMHg4NiwweDJBLCAweDAwLDB4MTgsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4RTAsMHgxQywgMHhGNywweDA1LCAKKzB4NDIsMHg0MCwgMHhDMCwweDM2LCAweDYyLDB4MDAsIDB4RUMsMHgwMCwgMHg2OSwweEI1LCAweEY3LDB4MDIsIDB4MDAsMHgwMSwgMHhGNywweDAyLCAKKzB4MDAsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2QSwweDgwLCAweEY3LDB4MDIsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4RTAsMHgxQywgMHg4NiwweEFBLCAweDAwLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2QSwweDdELCAweEM1LDB4ODQsIDB4MDAsMHgwMCwgMHg4NiwweEFBLCAKKzB4MDAsMHgxMCwgMHhGNywweDA0LCAweEUwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4NkEsMHgxNCwgMHgwNCwweEE4LCAweDAwLDB4MTAsIDB4ODYsMHhBQSwgMHgwMCwweDE0LCAweEY3LDB4MDQsIDB4RTAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg2QSwweDE4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2QSwweDI1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDgyLCAKKzB4MDAsMHgwMCwgMHg4NiwweEE2LCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHhFMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFMiwweDAwLCAweDZBLDB4NjAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4NkEsMHg2OCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4ODYsMHhBNiwgMHgwMCwweDA0LCAweEY3LDB4MDQsIDB4RTAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHg2QSwweDY5LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2QSwweDgxLCAweEM3LDB4MkMsIDB4MDAsMHgwMCwgMHhGNSwweDgyLCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDZBLDB4ODAsIDB4QzcsMHgyQywgMHgwMCwweDAwLCAweEM3LDB4MDQsIDB4MDAsMHgwMCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFRSwweDAwLCAweDZCLDB4M0QsIDB4RjYsMHg4NiwgMHg0MCwweDhBLCAweEY3LDB4MDQsIDB4NDAsMHg4OCwgMHg3NiwweEI1LCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDZCLDB4M0MsIDB4RjYsMHg4MiwgMHgwMCwweDAwLCAweEY2LDB4ODUsIDB4NDAsMHg4MCwgMHhGNiwweDg1LCAKKzB4NDAsMHg4NCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDQsIDB4RTAsMHgxQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjMsMHg4NiwgMHhFMCwweDAwLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDIsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEVFLDB4NjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY0LDB4MDUsIDB4NDAsMHg4NCwgMHg4NiwweDk2LCAKKzB4RkYsMHhGNCwgMHhGNywweDA0LCAweDZFLDB4NTAsIDB4RjMsMHg4NiwgMHgzNSwweEVDLCAweEY2LDB4ODUsIDB4NDAsMHg5MCwgMHhGNiwweDg1LCAKKzB4NDAsMHg5NCwgMHg4NywweDNBLCAweDFELDB4REMsIDB4RjYsMHg4NSwgMHg0MiwweDI4LCAweEY3LDB4MDUsIDB4M0IsMHg2NCwgMHhGNywweDA0LCAKKzB4NDIsMHgzMCwgMHhGNCwweDA1LCAweDQwLDB4ODAsIDB4QzAsMHgzQSwgMHgzQSwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDZCLDB4M0QsIDB4RjMsMHg4NiwgMHgzNSwweDYwLCAweEYzLDB4ODUsIDB4NDIsMHgzMCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDc4LDB4OUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjQsMHg4NiwgMHg0MiwweDMwLCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDIwLDB4RTQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NkQsMHhEOSwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg0MCwweDhDLCAweEY2LDB4MDYsIDB4NDAsMHg4QywgMHg3NiwweDMxLCAKKzB4MDAsMHgxRSwgMHhGNiwweDg0LCAweDQyLDB4MjgsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweDA2LDB4QjQsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NkIsMHhDOCwgMHhGNiwweDg1LCAKKzB4NDIsMHgyOCwgMHhGNywweDA0LCAweDQwLDB4ODgsIDB4RjYsMHg4NiwgMHg0MCwweDhBLCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NkQsMHgwRCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0MCwweDhDLCAweEY2LDB4ODYsIDB4NDAsMHg4QywgMHg3NiwweEI1LCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDZDLDB4MzUsIDB4RjYsMHgwNiwgMHg0MCwweDhBLCAweEY3LDB4MDQsIDB4NDAsMHg4OCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDZDLDB4MzQsIDB4RjQsMHg4NiwgMHgzNiwweDc4LCAweEY3LDB4MDQsIDB4NDIsMHg0NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDRBLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NkMsMHgzNSwgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4RjQsMHhCMywgMHgyOCwweDAwLCAweEUwLDB4MDAsIDB4NkQsMHgxMCwgMHhGMCwweDA1LCAKKzB4NDIsMHgyQywgMHhGNywweDA0LCAweDQwLDB4OEMsIDB4RjUsMHgwNiwgMHg0MCwweDhDLCAweDc2LDB4QTksIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NkMsMHhDMSwgMHhGNiwweDA2LCAweDQwLDB4OEEsIDB4RjcsMHgwNCwgMHg0MCwweDg4LCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NkMsMHhDMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0MiwweDJDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDksIDB4RUUsMHgwMCwgMHg2RCwweDExLCAweEY3LDB4MDUsIDB4NDIsMHgyQywgMHhGMCwweDJCLCAKKzB4MjgsMHgwMCwgMHhGMCwweDMzLCAweDI4LDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NDIsMHg5NCwgMHhGNiwweDA2LCAKKzB4NDIsMHg5NCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RTAsMHgwMCwgMHg2RCwweDEwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHhGNywweDA0LCAKKzB4NDAsMHg4QywgMHhGNiwweDg2LCAweDQwLDB4OEMsIDB4NzYsMHhCNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NkQsMHgxNCwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhGNywweDA0LCAweDQwLDB4ODgsIDB4RjYsMHgwNiwgMHg0MCwweDhBLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NkQsMHgxNSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RjAsMHgzMywgMHgyOCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDZELDB4QjUsIDB4RjQsMHg4NiwgMHgzNSwweEVDLCAweEY3LDB4MDQsIDB4NDIsMHgzMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDRBLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NkQsMHg1OSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHhFMCwweDI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDZELDB4NzksIDB4RjYsMHg4MiwgMHgwMCwweDNDLCAweEY2LDB4ODQsIDB4RTAsMHgyOCwgMHhFMCwweDAwLCAKKzB4NkQsMHg3OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHhFMCwweDI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDZELDB4NzksIDB4RjYsMHg4MiwgMHgwMCwweEYwLCAweEY3LDB4MDQsIDB4RTAsMHgyOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NiwweEI5LCAweDAwLDB4MDIsIDB4RjcsMHgwNCwgMHg0MiwweDI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAKKzB4NkEsMHgwMCwgMHhFQywweDAwLCAweDZELDB4QjUsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGMCwweDA1LCAKKzB4NDIsMHgyOCwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNCwweDgyLCAKKzB4MDAsMHgxOSwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHg2RCwweEI0LCAweEI0LDB4QkEsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHhGNCwweDgyLCAweEMzLDB4NTAsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweEY0LDB4ODIsIDB4MDAsMHgxNiwgMHg5NCwweDkzLCAKKzB4RkYsMHhGQywgMHhGNCwweDg2LCAweDQyLDB4MzAsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAKKzB4MUUsMHhDMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MDQsIDB4RjUsMHg4NiwgMHgzNiwweDc4LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDg2LCAKKzB4NDIsMHg0NCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg0OCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDgyLCAweDc0LDB4MTgsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODIsIDB4MDAsMHgxOSwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDg2LCAweDM2LDB4NzgsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4MiwgMHg3NCwweEFDLCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAKKzB4MDAsMHgxRCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4NiwgMHgzNywweDA0LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODIsIDB4NzgsMHgwMCwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MUIsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODYsIDB4MzcsMHgwNCwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDgyLCAKKzB4NzgsMHhGQywgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDFBLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDg2LCAKKzB4MzcsMHg5MCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDgyLCAweDgwLDB4RDgsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgxQiwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDg2LCAweDM3LDB4OTAsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4MiwgMHg4MSwweDc0LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAKKzB4MDAsMHgxRCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4NiwgMHgzOCwweDFDLCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODIsIDB4ODcsMHg3NCwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MUIsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODYsIDB4MzgsMHgxQywgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDgyLCAKKzB4OTQsMHhGOCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDFCLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDg2LCAKKzB4MzksMHgzNCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDgyLCAweDhBLDB4MDAsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDg2LCAweDM5LDB4MzQsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4MiwgMHg4RSwweDA4LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAKKzB4MDAsMHgxQSwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4NiwgMHgzOSwweDM0LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODIsIDB4OTYsMHg5QywgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MUUsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODYsIDB4MzgsMHhBOCwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDgyLCAKKzB4OUIsMHgyQywgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDFCLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDg2LCAKKzB4MzgsMHhBOCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDgyLCAweEEyLDB4REMsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgxRSwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDg2LCAweDNBLDB4RDgsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4MiwgMHg5RSwweDU0LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAKKzB4MDAsMHgxQiwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4NiwgMHgzQSwweEQ4LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODIsIDB4QTMsMHhDMCwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODYsIDB4MzksMHhDMCwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDgyLCAKKzB4QTcsMHg2NCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDFFLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDg2LCAKKzB4MzksMHhDMCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDgyLCAweEFBLDB4MDQsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgxQiwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDg2LCAweDM5LDB4QzAsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4MiwgMHhBRSwweEY4LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAKKzB4MDAsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4NiwgMHgzQSwweDRDLCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NDIsMHg1MCwgMHhGMCwweDNCLCAKKzB4MjgsMHgwMCwgMHhGNywweDA2LCAweDQwLDB4ODgsIDB4RjAsMHgzQiwgMHgyOCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHhGNiwweDA1LCAKKzB4NDAsMHg4MCwgMHhGNiwweDA1LCAweDQwLDB4ODQsIDB4RjcsMHgwNiwgMHgzQiwweDcwLCAweEY2LDB4M0IsIDB4MjgsMHgwMCwgMHhGNywweDA2LCAKKzB4M0IsMHg3MiwgMHhGMCwweEJCLCAweDI4LDB4MDAsIDB4RjUsMHg4MiwgMHhDQSwweDIwLCAweEY1LDB4ODUsIDB4M0IsMHg3NCwgMHhGNywweDA2LCAKKzB4M0IsMHg3OCwgMHhGMCwweDNCLCAweDI4LDB4MDAsIDB4RjcsMHgwNiwgMHgzQiwweDdBLCAweEYwLDB4QkIsIDB4MjgsMHgwMCwgMHhGNSwweDgyLCAKKzB4QjEsMHg5NCwgMHhGNSwweDg1LCAweDNCLDB4N0MsIDB4RjcsMHgwNiwgMHgzQiwweDgwLCAweEYwLDB4M0IsIDB4MjgsMHgwMCwgMHhGNywweDA2LCAKKzB4M0IsMHg4MiwgMHhGMCwweEJCLCAweDI4LDB4MDAsIDB4RjUsMHg4MiwgMHhDNywweDU0LCAweEY1LDB4ODUsIDB4M0IsMHg4NCwgMHhGNywweDA2LCAKKzB4M0IsMHg4OCwgMHhGMCwweDNCLCAweDI4LDB4MDAsIDB4RjcsMHgwNiwgMHgzQiwweDhBLCAweEYwLDB4QkIsIDB4MjgsMHgwMCwgMHhGNSwweDgyLCAKKzB4QkUsMHhGOCwgMHhGNSwweDg1LCAweDNCLDB4OEMsIDB4RjcsMHgwNiwgMHgzQiwweDkwLCAweEYwLDB4M0IsIDB4MjgsMHgwMCwgMHhGNywweDA2LCAKKzB4M0IsMHg5MiwgMHhGMCwweEJCLCAweDI4LDB4MDAsIDB4RjUsMHg4MiwgMHhDOCwweEY4LCAweEY1LDB4ODUsIDB4M0IsMHg5NCwgMHhGNywweDA2LCAKKzB4M0IsMHg5OCwgMHhGMCwweDNCLCAweDI4LDB4MDAsIDB4RjcsMHgwNiwgMHgzQiwweDlBLCAweEYwLDB4QkIsIDB4MjgsMHgwMCwgMHhGNSwweDgyLCAKKzB4QzUsMHhEOCwgMHhGNSwweDg1LCAweDNCLDB4OUMsIDB4RjcsMHgwNiwgMHgzQiwweEEwLCAweEYwLDB4M0IsIDB4MjgsMHgwMCwgMHhGNywweDA2LCAKKzB4M0IsMHhBMiwgMHhGMCwweEJCLCAweDI4LDB4MDAsIDB4RjUsMHg4MiwgMHhDNywweDcwLCAweEY1LDB4ODUsIDB4M0IsMHhBNCwgMHhGNywweDA2LCAKKzB4M0IsMHhBOCwgMHhGMCwweDNCLCAweDI4LDB4MDAsIDB4RjcsMHgwNiwgMHgzQiwweEFBLCAweEYwLDB4QkIsIDB4MjgsMHgwMCwgMHhGNSwweDgyLCAKKzB4QzEsMHhCNCwgMHhGNSwweDg1LCAweDNCLDB4QUMsIDB4OTYsMHgxNiwgMHhGRiwweEY0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RDUsMHg0MCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4NCwgMHg2RSwweDUwLCAweDg2LDB4MTYsIDB4RkYsMHhGNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NiwweDM2LCAweDFELDB4REMsIDB4RjYsMHgwNSwgMHgzQiwweDY0LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDMwLCAweDI1LDB4OTQsIDB4MDAsMHgyMCwgMHhGMCwweDJGLCAKKzB4MjgsMHgwMCwgMHgyNiwweDE0LCAweDAwLDB4MzgsIDB4RjAsMHgzMywgMHgyOCwweDAwLCAweDkwLDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA0LCAKKzB4NDIsMHg1MCwgMHhGNiwweDg2LCAweDQyLDB4NTAsIDB4NzYsMHhCNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhGNSwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDcyLDB4MUQsIDB4RjUsMHgwMiwgMHgxNywweDcwLCAweEY3LDB4MDQsIDB4NDIsMHg1NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg0MiwweDU0LCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHhGNSwweDAyLCAKKzB4MDAsMHgxQiwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHg0MiwweDQ0LCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDFFLDB4QzAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNCwgMHhFMCwweDA0LCAweDg2LDB4MTYsIDB4MDAsMHgwMCwgMHhGNiwweDgyLCAKKzB4MDAsMHhGRiwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4QzcsMHgzOCwgMHg2QywweDAwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHhGNywweDA2LCAKKzB4RTAsMHgwNiwgMHg4NywweDNBLCAweDAwLDB4MDAsIDB4MDYsMHhCMCwgMHgwMCwweDAyLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHhGNiwweDg0LCAKKzB4M0IsMHg2NCwgMHgwNywweDMwLCAweDAwLDB4MDQsIDB4RjYsMHhCQiwgMHgyOCwweDAwLCAweDg3LDB4MDIsIDB4RkYsMHgzNCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwNiwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwNCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MzAsIDB4MjYsMHgxNCwgMHgwMCwweDIwLCAweEYwLDB4MzMsIDB4MjgsMHgwMCwgMHgyNywweDE0LCAKKzB4MDAsMHgzOCwgMHhGMCwweDNCLCAweDI4LDB4MDAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDkwLDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA0LCAKKzB4NDIsMHg1MCwgMHhGNiwweDg2LCAweDQyLDB4NTAsIDB4NzYsMHhCNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEYzLDB4MzgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NzMsMHgxOSwgMHhGNSwweDgyLCAweDE3LDB4NzAsIDB4RjcsMHgwNCwgMHg0MiwweDU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDQyLDB4NTQsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODIsIDB4MDAsMHgxQiwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDg2LCAweDQyLDB4NDQsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAKKzB4MUUsMHhDMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4NDAsIDB4MjYsMHgxNCwgMHgwMCwweDIwLCAweDk2LDB4MTYsIDB4RkYsMHhDNCwgMHhGMCwweDMzLCAKKzB4MjgsMHgwMCwgMHg5MCwweDEzLCAweEZGLDB4RkMsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweDI2LDB4MTQsIDB4MDAsMHgzOCwgMHg5NiwweDE2LCAKKzB4RkYsMHhCQywgMHg5NiwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RDAsMHhEQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg5MCwweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNCwgMHg0MiwweDUwLCAweEY2LDB4ODYsIDB4NDIsMHg1MCwgMHg3NiwweEI1LCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHg4NiwweDE2LCAweEZGLDB4QkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHg4NiwweDE2LCAKKzB4RkYsMHhDNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RjUsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NzMsMHhFNSwgMHhGNiwweDAyLCAKKzB4MTcsMHg3MCwgMHhGNywweDA0LCAweDQyLDB4NTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDI3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4NDIsMHg1NCwgMHg5NiwweDEzLCAweEZGLDB4RkMsIDB4RjYsMHgwMiwgMHgwMCwweDFCLCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHhGNiwweDA2LCAKKzB4NDIsMHg0NCwgMHg5NiwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MUUsMHhDMCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAKKzB4MDAsMHgwNCwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4RjUsMHg4NSwgMHg0MCwweDgwLCAweDk1LDB4OTYsIDB4RkYsMHhGNCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENCLDB4NTAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4OTYsIDB4RkYsMHhGNCwgMHhGNSwweDAyLCAKKzB4MDAsMHg2NCwgMHhGNSwweDA1LCAweDNCLDB4QjQsIDB4RjcsMHgwNCwgMHg0MiwweDUwLCAweEY0LDB4ODYsIDB4NDIsMHg1MCwgMHg3NiwweEE1LCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4RjYsMHgwNCwgMHg0RiwweDVDLCAweEY0LDB4MDIsIDB4MDAsMHgwNiwgMHhGNCwweDA1LCAKKzB4NDIsMHg1NCwgMHhGNSwweDg1LCAweDNCLDB4NkMsIDB4RjUsMHg4NSwgMHgzQiwweEI4LCAweDk1LDB4MzIsIDB4MDAsMHgwMCwgMHg5NSwweEIyLCAKKzB4MDAsMHgwNCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg3MSwweEIwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNCwweDA2LCAKKzB4MzcsMHgwNCwgMHhGNCwweDA1LCAweDQyLDB4NDQsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4NTAsIDB4RjcsMHgwNCwgMHg0MiwweDUwLCAweEY2LDB4ODYsIDB4NDIsMHg1MCwgMHg3NiwweEI1LCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4RjYsMHgwNCwgMHg2RiwweDM0LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg4NiwweEIyLCAKKzB4MDAsMHgwQywgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NzcsMHhFQywgMHhDNSwweDA0LCAKKzB4MDAsMHgwMCwgMHg4NiwweEIyLCAweDAwLDB4MTAsIDB4RjcsMHgwNCwgMHhFMCwweDAwLCAweEYzLDB4MDIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDc1LDB4MTgsIDB4MDQsMHhCMCwgMHgwMCwweDEwLCAweDg2LDB4QjIsIDB4MDAsMHgxNCwgMHhGNywweDA0LCAKKzB4RTAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NzUsMHgxQywgMHgyMCwweDFBLCAKKzB4MDAsMHgwMCwgMHhGMywweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgxQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NzUsMHgyOSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNSwweDAyLCAweDAwLDB4MDAsIDB4ODYsMHhBNiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4RTAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHg3NSwweDY0LCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDc1LDB4NkMsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweDg2LDB4QTYsIDB4MDAsMHgwNCwgMHhGNywweDA0LCAKKzB4RTAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4NzUsMHg2RCwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NzUsMHg3RCwgMHgyMCwweDJBLCAKKzB4MDAsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NzcsMHhFQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDQiwweENDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyNiwweDE0LCAKKzB4MDAsMHgyMCwgMHhGMCwweDMzLCAweDI4LDB4MDAsIDB4MDQsMHhBMCwgMHgwMCwweDAyLCAweEYwLDB4MjcsIDB4MjgsMHgwMCwgMHhGNSwweDgyLCAKKzB4MDAsMHgwMCwgMHgyMywweDk0LCAweDAwLDB4MjIsIDB4RjUsMHg5RiwgMHgyOCwweDAwLCAweDAzLDB4QTAsIDB4MDAsMHgxQSwgMHg5MywweDk2LCAKKzB4RkYsMHhENCwgMHgyNSwweDk0LCAweDAwLDB4MjIsIDB4ODUsMHhBRSwgMHgwMCwweDAwLCAweDc3LDB4QUQsIDB4MDAsMHgxRSwgMHg3NywweEJDLCAKKzB4RkYsMHhFNSwgMHhDNSwweEFDLCAweDdGLDB4QzAsIDB4NzUsMHhBRCwgMHhGRiwweEYwLCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHgwNiwweEE0LCAweDAwLDB4MDIsIDB4MjMsMHgxNCwgMHgwMCwweDFFLCAweDc1LDB4MTUsIDB4MDAsMHgxRSwgMHhGNSwweDlGLCAKKzB4MjgsMHgwMCwgMHhGMywweDg0LCAweEUwLDB4MDAsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweDkzLDB4QTIsIDB4MDAsMHgxQywgMHhGNSwweDg0LCAKKzB4RTAsMHgwNCwgMHg3MywweDk5LCAweDAwLDB4MUUsIDB4NzMsMHg5QywgMHhGRiwweEU1LCAweDkzLDB4OTYsIDB4RkYsMHhBQywgMHg3MywweDk1LCAKKzB4MDAsMHgxRSwgMHg3MywweDlDLCAweEZGLDB4RTUsIDB4OTMsMHg5NiwgMHhGRiwweENDLCAweDIzLDB4OTQsIDB4MDAsMHg0MiwgMHg5NSwweEEyLCAKKzB4MDAsMHgyMCwgMHg4NywweDE2LCAweEZGLDB4RTAsIDB4NzUsMHg5NSwgMHgwMCwweDFFLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHg5NSwweDk2LCAKKzB4RkYsMHhCNCwgMHg3NSwweDk1LCAweDAwLDB4MUUsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweDk1LDB4OTYsIDB4RkYsMHhDNCwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweEY0LDB4ODQsIDB4NEYsMHg1OCwgMHg4NywweDFBLCAKKzB4MDAsMHgwMCwgMHhDNCwweEEwLCAweDRBLDB4MDAsIDB4NzQsMHhBNCwgMHhGRiwweEZBLCAweEM1LDB4QTQsIDB4MDAsMHgwMCwgMHhGNSwweDlGLCAKKzB4MjgsMHgwMCwgMHg4MywweDk2LCAweEZGLDB4QUMsIDB4MjMsMHgxNCwgMHgwMCwweDFBLCAweDc2LDB4MTksIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHg4NSwweDk2LCAweEZGLDB4QjQsIDB4QzcsMHgzOCwgMHgzRiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEU0LCAweDgzLDB4OTYsIDB4RkYsMHhDQywgMHhDNywweDM4LCAKKzB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RTgsIDB4MjMsMHgxNCwgMHgwMCwweDE2LCAweDc2LDB4MTksIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDFBLCAKKzB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEVDLCAweDIzLDB4MTQsIDB4MDAsMHgxMiwgMHg3NiwweDE5LCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHgzRiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg1LDB4OTYsIDB4RkYsMHhDNCwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MTYsIDB4RkYsMHhGMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHhGMywweDgyLCAKKzB4MDAsMHgwMiwgMHhGMywweEEzLCAweDI4LDB4MDAsIDB4MDQsMHgyMCwgMHgwMCwweDE4LCAweDI1LDB4OTQsIDB4MDAsMHgyMiwgMHg4NSwweEFFLCAKKzB4MDAsMHgwMCwgMHg3NywweEFELCAweDAwLDB4MUUsIDB4NzcsMHhCQywgMHhGRiwweEU1LCAweEM1LDB4QUMsIDB4N0YsMHhDMCwgMHg3NSwweEFELCAKKzB4RkYsMHhGMCwgMHg4MywweDk2LCAweEZGLDB4RDQsIDB4RjUsMHhBMywgMHgyOCwweDAwLCAweEY0LDB4OUYsIDB4MjgsMHgwMCwgMHgyNSwweDk0LCAKKzB4MDAsMHg0MiwgMHg4NSwweEFFLCAweDAwLDB4MDAsIDB4NzcsMHhBRCwgMHgwMCwweDFFLCAweDc3LDB4QkMsIDB4RkYsMHhFNSwgMHhDNSwweEFDLCAKKzB4N0YsMHhDMCwgMHg3NSwweEFELCAweEZGLDB4RjAsIDB4NDQsMHhBRCwgMHgwMCwweDAwLCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDg2LCAKKzB4RTAsMHgwMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4NCwgMHg0RiwweDVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyMywweDQwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDc4LDB4RDgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEYwLDB4MDUsIDB4NDAsMHg4NCwgMHhGNywweDg2LCAKKzB4RTAsMHgwMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RDUsMHhBMCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDA0LCAweDZFLDB4NTAsIDB4RjQsMHgwNSwgMHg0MCwweDg0LCAweDg3LDB4M0EsIDB4MUQsMHhEQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDNCLDB4NjQsIDB4RjUsMHg4NiwgMHgzNiwweDc4LCAweEY1LDB4ODUsIDB4NDIsMHg0NCwgMHhGMywweDg2LCAKKzB4MzUsMHg2MCwgMHhGMywweDg1LCAweDQyLDB4MzAsIDB4RjUsMHg4NiwgMHg0MiwweDQ0LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDFGLDB4NDgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjUsMHg4NiwgMHg0MiwweDQ0LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDIwLDB4RTQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4NzgsMHg4OSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0MiwweDU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFRSwweDAwLCAweDc4LDB4NTEsIDB4RjYsMHgwNiwgMHg0MiwweDUwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4NzEsMHhCMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHg3OCwweDg4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NDIsMHg1MCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEY1LDB4ODIsIDB4MDAsMHgwNiwgMHhGNSwweDg1LCAKKzB4NDIsMHg1NCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg3MiwweEFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDg2LCAKKzB4MzcsMHg5MCwgMHhGNSwweDg1LCAweDQyLDB4NDQsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHhGNiwweDA2LCAweDM2LDB4NzgsIDB4RjYsMHgwNSwgMHg0MiwweDQ0LCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHhGNywweDA1LCAKKzB4NDAsMHg4MCwgMHhGNywweDA1LCAweDQwLDB4OTQsIDB4RjYsMHg4NCwgMHg2RSwweDUwLCAweEY3LDB4MDUsIDB4NDAsMHg5MCwgMHg5NywweDM2LCAKKzB4MUQsMHhEQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDQwLDB4ODAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4QTgsIDB4RjcsMHgwNCwgMHg0MiwweDUwLCAweEY1LDB4ODYsIDB4NDIsMHg1MCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHhGNCwweDg0LCAweDZGLDB4MzQsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDk0LDB4OTYsIDB4RkYsMHhDNCwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg4NiwweEE2LCAweDAwLDB4MEMsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4NzksMHg1NSwgMHhGNiwweDA2LCAweDQyLDB4OUEsIDB4RjcsMHgwNCwgMHg0MiwweDk4LCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHhGNywweDA0LCAweDQyLDB4NTAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHg4NSwweDE2LCAKKzB4RkYsMHhDNCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4ODYsMHhBQSwgMHgwMCwweDBDLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDgwLDB4QTgsIDB4RjYsMHgwNiwgMHg0MiwweDlBLCAweDg3LDB4MkEsIDB4MDAsMHgxMCwgMHg4NiwweDJBLCAKKzB4MDAsMHgxQywgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg3OSwweEE4LCAweEY2LDB4ODIsIDB4MDAsMHgwMCwgMHg4NywweDJBLCAKKzB4MDAsMHgxNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NzksMHhBQywgMHgyMCwweDM2LCAKKzB4MDAsMHgwMCwgMHhGNiwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4N0EsMHgwNSwgMHgyNCwweDk0LCAKKzB4MDAsMHgyMCwgMHg5NCwweDk2LCAweEZGLDB4QkMsIDB4ODUsMHgxNiwgMHhGRiwweEM0LCAweEYwLDB4MjcsIDB4MjgsMHgwMCwgMHgwNSwweDI4LCAKKzB4MDAsMHgxMCwgMHg5NSwweDE2LCAweEZGLDB4QjQsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4NzIsMHg1MCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODQsMHg5NiwgMHhGRiwweEI0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweDkzLCAKKzB4RkYsMHhGQywgMHg4NSwweDE2LCAweEZGLDB4QkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEY5LDB4MzQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4ODAsMHhDNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg4MCwweDZDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENCLDB4Q0MsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDI1LDB4OTQsIDB4MDAsMHgyMCwgMHhGMCwweDJGLCAKKzB4MjgsMHgwMCwgMHgwNCwweEEwLCAweDAwLDB4MDIsIDB4OTQsMHg5NiwgMHhGRiwweDVDLCAweEYwLDB4MjcsIDB4MjgsMHgwMCwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMCwgMHgyNSwweDE0LCAweDAwLDB4NUEsIDB4RjQsMHhBQiwgMHgyOCwweDAwLCAweDA3LDB4MjAsIDB4MDAsMHgxQSwgMHgyNSwweDE0LCAKKzB4MDAsMHg1QSwgMHg4NSwweDJBLCAweDAwLDB4MDAsIDB4NzcsMHhBOSwgMHgwMCwweDFFLCAweDc3LDB4QkMsIDB4RkYsMHhFNSwgMHhDNSwweDI4LCAKKzB4N0YsMHhDMCwgMHg3NSwweDI5LCAweEZGLDB4RjAsIDB4NzUsMHhBRCwgMHgwMCwweDFFLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHgyMywweDE0LCAKKzB4MDAsMHgxRSwgMHg3NiwweDE5LCAweDAwLDB4MUUsIDB4RjUsMHgzQiwgMHgyOCwweDAwLCAweEY0LDB4ODQsIDB4RTAsMHgwMCwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHg5NCwweEEyLCAweDAwLDB4MUMsIDB4RjUsMHgwNCwgMHhFMCwweDA0LCAweDg0LDB4OTYsIDB4RkYsMHg1QywgMHg5NSwweDIyLCAKKzB4MDAsMHgyMCwgMHg4NywweDE2LCAweEZGLDB4RTAsIDB4MDYsMHhBNCwgMHgwMCwweDAyLCAweDc1LDB4MTUsIDB4MDAsMHgxRSwgMHg3NSwweDI4LCAKKzB4RkYsMHhFNSwgMHg5NSwweDE2LCAweEZGLDB4NTQsIDB4NzQsMHg5NSwgMHgwMCwweDFFLCAweDc0LDB4QTQsIDB4RkYsMHhFNSwgMHg5NCwweDk2LCAKKzB4RkYsMHg5QywgMHg3NSwweDE1LCAweDAwLDB4MUUsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweDk1LDB4MTYsIDB4RkYsMHg5NCwgMHg3NCwweDk1LCAKKzB4MDAsMHgxRSwgMHg4NSwweDE2LCAweEZGLDB4NUMsIDB4NzQsMHhBNCwgMHhGRiwweEU1LCAweDk0LDB4OTYsIDB4RkYsMHg4QywgMHg4NCwweDk2LCAKKzB4RkYsMHg1NCwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHg4NywweDFBLCAKKzB4MDAsMHgwMCwgMHg4NSwweDE2LCAweEZGLDB4OUMsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEU0LCAweDIzLDB4MTQsIDB4MDAsMHgxQSwgMHg3NiwweDE5LCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg0RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg0LDB4OTYsIDB4RkYsMHg5NCwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAKKzB4RkYsMHhFOCwgMHgyMywweDE0LCAweDAwLDB4MTYsIDB4NzYsMHgxOSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RUMsIDB4MjMsMHgxNCwgMHgwMCwweDEyLCAweDc2LDB4MTksIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDRGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDFBLCAKKzB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODUsMHgxNiwgMHhGRiwweDhDLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEYwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAKKzB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweEY0LDB4ODIsIDB4MDAsMHgwMiwgMHhGNCwweEEzLCAKKzB4MjgsMHgwMCwgMHgyNSwweDE0LCAweDAwLDB4NUEsIDB4ODUsMHgyQSwgMHgwMCwweDAwLCAweDc3LDB4QTksIDB4MDAsMHgxRSwgMHg3NywweEJDLCAKKzB4RkYsMHhFNSwgMHhDNSwweDI4LCAweDdGLDB4QzAsIDB4NzUsMHgyOSwgMHhGRiwweEYwLCAweDA3LDB4MjAsIDB4MDAsMHgxOCwgMHhGNSwweDNCLCAKKzB4MjgsMHgwMCwgMHg5NCwweDE2LCAweEZGLDB4QUMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0IsMHhDQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgyNiwweDE0LCAweDAwLDB4MzgsIDB4MjQsMHg5NCwgMHgwMCwweDVBLCAweDg0LDB4QTYsIDB4MDAsMHgwMCwgMHg3NywweEE1LCAKKzB4MDAsMHgxRSwgMHg3NywweEJDLCAweEZGLDB4RTUsIDB4QzQsMHhBNCwgMHg3RiwweEMwLCAweDc0LDB4QTUsIDB4RkYsMHhGMCwgMHgwNSwweEEwLCAKKzB4MDAsMHgwMiwgMHgwNiwweEFDLCAweDAwLDB4MDIsIDB4MjMsMHg5NCwgMHgwMCwweDM2LCAweDc1LDB4MUQsIDB4MDAsMHgxRSwgMHg3NSwweDI4LCAKKzB4RkYsMHhFNSwgMHgwNywweDIwLCAweDAwLDB4MUEsIDB4RjQsMHhCMywgMHgyOCwweDAwLCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHg5NSwweDE2LCAweEZGLDB4NTQsIDB4NzQsMHg5NSwgMHgwMCwweDFFLCAweDc0LDB4QTQsIDB4RkYsMHhFNSwgMHg5NCwweDk2LCAKKzB4RkYsMHg1QywgMHg3NSwweDE1LCAweDAwLDB4MUUsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweDk1LDB4MTYsIDB4RkYsMHg3QywgMHg3NCwweDk1LCAKKzB4MDAsMHgxRSwgMHg4NSwweDE2LCAweEZGLDB4QzQsIDB4NzQsMHhBNCwgMHhGRiwweEU1LCAweDk0LDB4OTYsIDB4RkYsMHg3NCwgMHg4NSwweDJBLCAKKzB4MDAsMHgzNCwgMHgyNCwweDk0LCAweDAwLDB4NUEsIDB4OTUsMHgxNiwgMHhGRiwweDg0LCAweDg0LDB4QTYsIDB4MDAsMHgwMCwgMHg3NywweEE1LCAKKzB4MDAsMHgxRSwgMHg3NywweEJDLCAweEZGLDB4RTUsIDB4QzQsMHhBNCwgMHg3RiwweEMwLCAweDc0LDB4QTUsIDB4RkYsMHhGMCwgMHgyNSwweDE0LCAKKzB4MDAsMHg1QSwgMHhGNCwweEFGLCAweDI4LDB4MDAsIDB4ODUsMHgyQSwgMHgwMCwweDAwLCAweDc3LDB4QTksIDB4MDAsMHgxRSwgMHg3NywweEJDLCAKKzB4RkYsMHhFNSwgMHhDNSwweDI4LCAweDdGLDB4QzAsIDB4NzUsMHgyOSwgMHhGRiwweEYwLCAweDg0LDB4OTYsIDB4RkYsMHhDNCwgMHhGNSwweDNCLCAKKzB4MjgsMHgwMCwgMHg4NCwweEE2LCAweDAwLDB4MTAsIDB4ODUsMHgxNiwgMHhGRiwweEM0LCAweDk0LDB4QTIsIDB4MDAsMHgxQywgMHg4NSwweDJBLCAKKzB4MDAsMHgxNCwgMHg3NCwweDk1LCAweDAwLDB4MUUsIDB4NzQsMHhBNCwgMHhGRiwweEU1LCAweDk0LDB4OTYsIDB4RkYsMHg2QywgMHg5NSwweDIyLCAKKzB4MDAsMHgyMCwgMHg4NywweDE2LCAweEZGLDB4QzgsIDB4ODUsMHgxNiwgMHhGRiwweDU0LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4ODcsMHgxRSwgMHgwMCwweDAwLCAweDg0LDB4OTYsIDB4RkYsMHg1QywgMHhDNywweDM4LCAKKzB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAKKzB4RkYsMHhDQywgMHgyMywweDk0LCAweDAwLDB4MzIsIDB4NzYsMHgxRCwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHg4NSwweDE2LCAKKzB4RkYsMHg3QywgMHhDNywweDM4LCAweDRGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDFFLCAKKzB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEQwLCAweDIzLDB4OTQsIDB4MDAsMHgyRSwgMHg3NiwweDFELCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg1NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NywweDFFLCAweDAwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg0LDB4OTYsIDB4RkYsMHg3NCwgMHg4NSwweDE2LCAKKzB4RkYsMHg2QywgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RDQsIDB4MjMsMHg5NCwgMHgwMCwweDJBLCAweDc2LDB4MUQsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDRGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDFFLCAKKzB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4RDgsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NTcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4RjQsMHg4MiwgMHgwMCwweDAyLCAweEY0LDB4QTMsIDB4MjgsMHgwMCwgMHgwNywweDIwLCAKKzB4MDAsMHgxOCwgMHgyNSwweDE0LCAweDAwLDB4N0EsIDB4ODUsMHgyQSwgMHgwMCwweDAwLCAweDc3LDB4QTksIDB4MDAsMHgxRSwgMHg3NywweEJDLCAKKzB4RkYsMHhFNSwgMHhDNSwweDI4LCAweDdGLDB4QzAsIDB4NzUsMHgyOSwgMHhGRiwweEYwLCAweDg0LDB4OTYsIDB4RkYsMHhDNCwgMHhGNSwweDNCLCAKKzB4MjgsMHgwMCwgMHg4NywweDI2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgyNCwgMHhGNywweDA0LCAKKzB4NEYsMHg1OCwgMHhFNiwweDAwLCAweDdFLDB4RjksIDB4OTQsMHgxNiwgMHhGRiwweDU0LCAweEM3LDB4MjAsIDB4NzIsMHgwMCwgMHhGNiwweDg0LCAKKzB4NkUsMHg1MCwgMHg4NiwweDI2LCAweDAwLDB4MkMsIDB4NzcsMHgzOCwgMHhGRiwweEZBLCAweDI1LDB4MTQsIDB4MDAsMHg1QSwgMHg4NCwweDJBLCAKKzB4MDAsMHgwMCwgMHg3NywweEE5LCAweDAwLDB4MUUsIDB4NzcsMHhCQywgMHhGRiwweEU1LCAweEM0LDB4MjAsIDB4N0YsMHhDMCwgMHg3NCwweDIxLCAKKzB4RkYsMHhGMCwgMHg0NywweDM5LCAweDAwLDB4MDAsIDB4ODYsMHhCNiwgMHgxRCwweERDLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhDMCwweDMyLCAKKzB4NkEsMHgwMCwgMHg0NiwweDhDLCAweDAwLDB4MDEsIDB4RDYsMHg4MCwgMHgwQSwweDY4LCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhGNiwweDg2LCAKKzB4NDAsMHg5OCwgMHhFNiwweDAwLCAweDdFLDB4QzAsIDB4QzMsMHhCOCwgMHg2OCwweDAwLCAweEM1LDB4ODQsIDB4MDAsMHgwMCwgMHg4NiwweEE2LCAKKzB4MDAsMHgyNCwgMHhGNywweDA0LCAweEUwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4N0UsMHg1NCwgMHgwMywweDI0LCAweDAwLDB4MjQsIDB4ODYsMHhBNiwgMHgwMCwweDI4LCAweEY3LDB4MDQsIDB4RTAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg3RSwweDU4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg3RSwweDY1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDgyLCAKKzB4MDAsMHgwMCwgMHg4NiwweDlBLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHhFMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFMiwweDAwLCAweDdFLDB4QTAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4N0UsMHhBOCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4ODYsMHg5QSwgMHgwMCwweDA0LCAweEY3LDB4MDQsIDB4RTAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHg3RSwweEE5LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg3RSwweEI5LCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhGNSwweDgyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg3RSwweEM1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNCwweDAyLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDRGLDB4NTgsIDB4RjQsMHgxRiwgMHgyOCwweDAwLCAweDg0LDB4OTYsIDB4RkYsMHg1NCwgMHg4NSwweDE2LCAKKzB4RkYsMHhDNCwgMHhGNiwweDg2LCAweDQwLDB4OUEsIDB4QzcsMHgyNCwgMHg3MiwweDAwLCAweDc3LDB4MzgsIDB4RkYsMHhGQSwgMHg4NiwweDJBLCAKKzB4MDAsMHgzMCwgMHg0NywweDM5LCAweDAwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHhFMCwweDAwLCAKKzB4N0YsMHg0QywgMHhGNiwweDNCLCAweDI4LDB4MDAsIDB4ODQsMHg5NiwgMHhGRiwweDU0LCAweEY2LDB4MDYsIDB4NDAsMHg5OCwgMHhDNywweDI0LCAKKzB4NzIsMHgwMCwgMHg3NywweDM4LCAweEZGLDB4RkEsIDB4QzYsMHhCOCwgMHgwMCwweDAwLCAweDQ2LDB4QjUsIDB4MDAsMHgwMCwgMHg3NiwweEI1LCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDYwLDB4MDAsIDB4RjUsMHgwMiwgMHgwMCwweDAxLCAweEY1LDB4MzcsIDB4MjgsMHgwMCwgMHg0NywweDM5LCAKKzB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHg1QSwgMHg4NCwweEE2LCAKKzB4MDAsMHgwMCwgMHg3NywweEE1LCAweDAwLDB4MUUsIDB4NzcsMHhCQywgMHhGRiwweEU1LCAweEM0LDB4QTQsIDB4N0YsMHhDMCwgMHg3NCwweEE1LCAKKzB4RkYsMHhGMCwgMHgwNywweDM4LCAweDAwLDB4MDIsIDB4RjQsMHhCQiwgMHgyOCwweDAwLCAweEY3LDB4MDQsIDB4NEYsMHg1OCwgMHg4NSwweDE2LCAKKzB4RkYsMHg1NCwgMHg4NCwweDk2LCAweEZGLDB4QUMsIDB4QzYsMHhBOCwgMHg3MiwweDAwLCAweDc2LDB4QjQsIDB4RkYsMHhGQSwgMHgwNiwweDI0LCAKKzB4MDAsMHgxQSwgMHhGNiwweEIzLCAweDI4LDB4MDAsIDB4QzcsMHgyNCwgMHg3MiwweDAwLCAweDc3LDB4MzgsIDB4RkYsMHhGQSwgMHgwNiwweEE4LCAKKzB4MDAsMHgxQSwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4NDcsMHgzOSwgMHgwMCwweDAwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDI0LCAKKzB4MDAsMHgxQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjUsMHgwNCwgMHg0RiwweDVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyMywweDQwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA0LCAKKzB4NEYsMHg1OCwgMHg4NCwweDk2LCAweEZGLDB4NTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MjQsIDB4NzIsMHgwMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGQSwgMHg0NywweDM5LCAweDAwLDB4MDAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4MjQsIDB4MDAsMHgxQywgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNSwweDA0LCAweDRGLDB4NUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDIzLDB4NDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4NzgsMHhEOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4NCwgMHg2RSwweDUwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAKKzB4MUQsMHhEQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIDB4MUQsMHhEQywgMHg4NywweDM2LCAKKzB4MUQsMHhEQywgMHhGMCwweDA1LCAweDQwLDB4ODQsIDB4RjQsMHg4NiwgMHhFMCwweDAwLCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEQ1LDB4QTAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY0LDB4MDUsIDB4NDAsMHg4NCwgMHhGNywweDA0LCAKKzB4NkUsMHg1MCwgMHhGMCwweDA1LCAweDQyLDB4NUMsIDB4ODcsMHgzQSwgMHgxRCwweERDLCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA1LCAKKzB4M0IsMHg2NCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjUsMHgwNiwgMHgzQSwweDRDLCAweEY1LDB4MDUsIDB4NDIsMHg0NCwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY0LDB4ODIsIDB4MDAsMHgxQywgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDgwLDB4NjAsIDB4QjQsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNSwweDA2LCAKKzB4MzUsMHhFQywgMHhFMCwweDAwLCAweDgwLDB4OEMsIDB4RjUsMHgwNSwgMHg0MiwweDMwLCAweDIwLDB4MzIsIDB4MDAsMHgwMSwgMHhFNiwweDAwLCAKKzB4ODAsMHhDNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NzgsMHg5QywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNCwweDg2LCAweDM1LDB4NjAsIDB4RjQsMHg4NSwgMHg0MiwweDMwLCAweEY1LDB4MDYsIDB4NDIsMHg0NCwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxRiwweDQ4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAKKzB4ODAsMHhDNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0MiwweDk4LCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNSwweDg2LCAKKzB4NDIsMHg0NCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjAsMHhFNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg4MSwweDYxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NDIsMHg1NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEVFLDB4MDAsIDB4ODEsMHgyOSwgMHhGNiwweDA2LCAKKzB4NDIsMHg1MCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg3MiwweEFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAKKzB4ODEsMHg2MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0MiwweDUwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhGNSwweDgyLCAweDAwLDB4MDYsIDB4RjUsMHg4NSwgMHg0MiwweDU0LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4NzMsMHg0QywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4NiwgMHgzOCwweDFDLCAweEY1LDB4ODUsIDB4NDIsMHg0NCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHg1OCwgMHhGNywweDA0LCAKKzB4NDIsMHg1MCwgMHhGNiwweDg2LCAweDQyLDB4NTAsIDB4NzYsMHhCNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhGNiwweDA0LCAKKzB4NkYsMHgzNCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4ODYsMHhCMiwgMHgwMCwweDBDLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDgyLDB4NTAsIDB4RjQsMHg4MiwgMHgwMCwweDAwLCAweEM1LDB4MDQsIDB4MDAsMHgwMCwgMHg4NiwweEIyLCAKKzB4MDAsMHgxMCwgMHhGNywweDA0LCAweEUwLDB4MDAsIDB4QzUsMHhBNCwgMHgwMCwweDAwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4ODEsMHhFNCwgMHgwNCwweDMwLCAweDAwLDB4MTAsIDB4ODYsMHhCMiwgMHgwMCwweDE0LCAweEY3LDB4MDQsIDB4RTAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg4MSwweEU4LCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhGNSwweDgyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg4MSwweEY1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHg4NiwweEEyLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHhFMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFMiwweDAwLCAweDgyLDB4MzAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4ODIsMHgzOCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4ODYsMHhBMiwgMHgwMCwweDA0LCAweEY3LDB4MDQsIDB4RTAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHg4MiwweDM5LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg4MiwweDQ5LCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg4MiwweDU5LCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDI2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg4NywweDYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENCLDB4Q0MsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4MjAsIDB4MDAsMHgwMiwgMHhGMCwweDNCLCAKKzB4MjgsMHgwMCwgMHhGNywweDA0LCAweDRGLDB4NTgsIDB4RjQsMHgwNSwgMHgzQiwweEIwLCAweDA2LDB4QTAsIDB4MDAsMHgxNCwgMHhDNywweDIwLCAKKzB4NzIsMHgwMCwgMHg3NywweDM4LCAweEZGLDB4RkEsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QTAsIDB4MDAsMHgxNiwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHhGMywweDAyLCAweDAwLDB4MDEsIDB4RjMsMHgyMywgMHgyOCwweDAwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4Q0IsMHhDQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MjYsMHgxNCwgMHgwMCwweDIwLCAweEYwLDB4MzMsIDB4MjgsMHgwMCwgMHgwNCwweEEwLCAKKzB4MDAsMHgwMiwgMHhGMCwweDI3LCAweDI4LDB4MDAsIDB4RjMsMHgwMiwgMHgwMCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHgyQSwgMHhGMywweDFGLCAKKzB4MjgsMHgwMCwgMHgwNywweDIwLCAweDAwLDB4MUEsIDB4MjMsMHg5NCwgMHgwMCwweDJBLCAweDgzLDB4OUUsIDB4MDAsMHgwMCwgMHg3NywweDlELCAKKzB4MDAsMHgxRSwgMHg3NywweEJDLCAweEZGLDB4RTUsIDB4QzMsMHg5QywgMHg3RiwweEMwLCAweDczLDB4OUQsIDB4RkYsMHhGMCwgMHg3NiwweDMxLCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4MDYsMHhBNCwgMHgwMCwweDAyLCAweDc1LDB4MTUsIDB4MDAsMHgxRSwgMHhGMywweEJCLCAKKzB4MjgsMHgwMCwgMHhGMywweDA0LCAweEUwLDB4MDAsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweDkzLDB4MjIsIDB4MDAsMHgxQywgMHhGMywweDg0LCAKKzB4RTAsMHgwNCwgMHgyMywweDE0LCAweDAwLDB4MUUsIDB4OTMsMHgxNiwgMHhGRiwweEE0LCAweDc1LDB4OTksIDB4MDAsMHgxRSwgMHg3NSwweEFDLCAKKzB4RkYsMHhFNSwgMHg3MywweDE1LCAweDAwLDB4MUUsIDB4NzMsMHgxOCwgMHhGRiwweEU1LCAweDkzLDB4MTYsIDB4RkYsMHhDQywgMHg4MywweDE2LCAKKzB4RkYsMHhBNCwgMHg5MywweEEyLCAweDAwLDB4MjAsIDB4ODcsMHgxNiwgMHhGRiwweEUwLCAweDczLDB4OTUsIDB4MDAsMHgxRSwgMHg3MywweDlDLCAKKzB4RkYsMHhFNSwgMHg5MywweDk2LCAweEZGLDB4QUMsIDB4NzMsMHg5NSwgMHgwMCwweDFFLCAweDczLDB4OUMsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHg5MywweDk2LCAKKzB4RkYsMHhDNCwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RTQsIDB4MjMsMHg5NCwgMHgwMCwweDFBLCAweDkzLDB4OTYsIDB4RkYsMHhBNCwgMHg3NiwweDFELCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg1NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NywweDFFLCAweDAwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhFOCwgMHgyMywweDE0LCAKKzB4MDAsMHgxNiwgMHg5MywweDE2LCAweEZGLDB4QTQsIDB4NzYsMHgxOSwgMHgwMCwweDFFLCAweDgzLDB4OTYsIDB4RkYsMHhBQywgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDNGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDFBLCAKKzB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEVDLCAweDIzLDB4MTQsIDB4MDAsMHgxMiwgMHg5MywweDE2LCAKKzB4RkYsMHhBNCwgMHg3NiwweDE5LCAweDAwLDB4MUUsIDB4ODMsMHg5NiwgMHhGRiwweENDLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4M0YsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDE2LCAKKzB4RkYsMHhGMCwgMHg4MywweDE2LCAweEZGLDB4QzQsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4MzcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4RjMsMHg4MiwgMHgwMCwweDAyLCAweEYzLDB4QTMsIDB4MjgsMHgwMCwgMHgyMywweDE0LCAKKzB4MDAsMHgyQSwgMHg4MywweDFBLCAweDAwLDB4MDAsIDB4NzcsMHg5OSwgMHgwMCwweDFFLCAweDc3LDB4QkMsIDB4RkYsMHhFNSwgMHhDMywweDE4LCAKKzB4N0YsMHhDMCwgMHg3MywweDE5LCAweEZGLDB4RjAsIDB4MDcsMHgyMCwgMHgwMCwweDE4LCAweEYzLDB4M0IsIDB4MjgsMHgwMCwgMHg5NCwweDE2LCAKKzB4RkYsMHhEQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDQiwweENDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDIwLCAKKzB4MDAsMHgwMiwgMHgyMywweDk0LCAweDAwLDB4MkEsIDB4ODMsMHg5RSwgMHgwMCwweDAwLCAweDc3LDB4OUQsIDB4MDAsMHgxRSwgMHg3NywweEJDLCAKKzB4RkYsMHhFNSwgMHhDMywweDlDLCAweDdGLDB4QzAsIDB4NzMsMHg5RCwgMHhGRiwweEYwLCAweDI0LDB4ODAsIDB4MDAsMHgwNywgMHgwNSwweDIwLCAKKzB4MDAsMHgwQSwgMHhGMywweEJCLCAweDI4LDB4MDAsIDB4MjAsMHgyNiwgMHgwMCwweDA3LCAweEVFLDB4MDAsIDB4ODQsMHhFMCwgMHgwNiwweDI4LCAKKzB4MDAsMHgwRSwgMHg4NiwweEIyLCAweDAwLDB4MDAsIDB4NzcsMHgzMSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHg3NSwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4MDUsMHgyOCwgMHgwMCwweDAyLCAweDA0LDB4QTQsIDB4MDAsMHgwMSwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4RjcsMHgwMiwgMHhGRiwweDAwLCAweEM2LDB4QjQsIDB4NzQsMHgwMCwgMHhGNiwweEIzLCAKKzB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4RjMsMHgwMiwgMHgwMCwweEZGLCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHhDNywweDM4LCAweDM0LDB4MDAsIDB4RTAsMHgwMCwgMHg4NCwweDg4LCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNSwweDIwLCAKKzB4MDAsMHgyNiwgMHg4NiwweDJBLCAweDAwLDB4MDAsIDB4NzYsMHhBOSwgMHgwMCwweDFFLCAweEY1LDB4ODQsIDB4NEYsMHg1OCwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHg4MywweDk2LCAweEZGLDB4REMsIDB4RjMsMHgwMiwgMHgwMCwweEZGLCAweDk0LDB4MTYsIDB4RkYsMHhCQywgMHhDNywweDFDLCAKKzB4NUEsMHgwMCwgMHg3NywweDM4LCAweEZGLDB4RkEsIDB4QzYsMHgzMCwgMHg2RiwweEMwLCAweDc2LDB4MzEsIDB4RkYsMHhGMCwgMHg0NywweDM5LCAKKzB4MDAsMHgwMCwgMHhDNywweDM4LCAweDM0LDB4MDAsIDB4RjYsMHg4MiwgMHhGRiwweDAwLCAweEM2LDB4MzAsIDB4NkMsMHgwMCwgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHhGNiwweDg0LCAweDNCLDB4NkMsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweEM1LDB4QTAsIDB4NUEsMHgwMCwgMHg3NSwweEFDLCAKKzB4RkYsMHhGQSwgMHg4MywweDE2LCAweEZGLDB4REMsIDB4MDcsMHgzNCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4M0IsMHg2QywgMHgwNywweDIwLCAKKzB4MDAsMHgzQSwgMHhGNiwweEJCLCAweDI4LDB4MDAsIDB4MDcsMHgyMCwgMHgwMCwweDM2LCAweEYwLDB4M0IsIDB4MjgsMHgwMCwgMHhGMywweDgyLCAKKzB4MDAsMHgwMywgMHhGMywweEEzLCAweDI4LDB4MDAsIDB4MDcsMHgxOCwgMHgwMCwweDFBLCAweEY1LDB4QkIsIDB4MjgsMHgwMCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENCLDB4Q0MsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4MjAsIDB4MDAsMHgwMiwgMHhGMCwweDNCLCAKKzB4MjgsMHgwMCwgMHgyNCwweDgwLCAweDAwLDB4MDcsIDB4MDUsMHgyMCwgMHgwMCwweDBBLCAweDIwLDB4MjYsIDB4MDAsMHgwNywgMHhFRSwweDAwLCAKKzB4ODUsMHhENCwgMHgwNiwweDI4LCAweDAwLDB4MEUsIDB4ODYsMHhCMiwgMHgwMCwweDAwLCAweDc3LDB4MzEsIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHg3NSwweEIxLCAweDAwLDB4MUUsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweDA1LDB4MjgsIDB4MDAsMHgwMiwgMHgwNCwweEE0LCAKKzB4MDAsMHgwMSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweEY3LDB4MDIsIDB4RkYsMHgwMCwgMHhDNiwweEI0LCAKKzB4NzQsMHgwMCwgMHhGNiwweEIzLCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweEYzLDB4ODIsIDB4MDAsMHhGRiwgMHhDNywweDM4LCAKKzB4NUYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4QzcsMHgzOCwgMHgzQywweDAwLCAweEUwLDB4MDAsIDB4ODUsMHg3QywgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHgwNSwweEEwLCAweDAwLDB4MjYsIDB4ODYsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNSwweDIwLCAweDAwLDB4MDAsIDB4MjQsMHgwMCwgMHgwMCwweDA3LCAweEYzLDB4MDIsIDB4MDAsMHgwMSwgMHg5MywweDE2LCAKKzB4RkYsMHhBNCwgMHhGNywweDA0LCAweDRGLDB4NTgsIDB4ODMsMHg5NiwgMHhGRiwweEJDLCAweDI0LDB4ODAsIDB4MDAsMHgwRSwgMHhDNywweDFDLCAKKzB4NzIsMHgwMCwgMHg3NywweDM4LCAweEZGLDB4RkEsIDB4QzYsMHgzMCwgMHg2RiwweEMwLCAweDc2LDB4MzEsIDB4RkYsMHhGMCwgMHg0NywweDM5LCAKKzB4MDAsMHgwMCwgMHhGNiwweDgyLCAweDAwLDB4RkYsIDB4QzcsMHgzOCwgMHg2QywweDAwLCAweEY2LDB4ODIsIDB4RkYsMHgwMCwgMHhDNiwweDMwLCAKKzB4NkMsMHgwMCwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4RjYsMHg4NCwgMHgzQiwweDZDLCAweEY3LDB4MkYsIDB4MjgsMHgwMCwgMHgwNywweDM0LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDNCLDB4NkMsIDB4MDcsMHgyOCwgMHgwMCwweDNBLCAweEY2LDB4QkIsIDB4MjgsMHgwMCwgMHgwNywweDI4LCAKKzB4MDAsMHgzNiwgMHhGMCwweDNCLCAweDI4LDB4MDAsIDB4RjMsMHgwMiwgMHgwMCwweDAzLCAweEYzLDB4MkIsIDB4MjgsMHgwMCwgMHgyMCwweDIyLCAKKzB4MDAsMHgwNywgMHhFRSwweDAwLCAweDg2LDB4OTQsIDB4QzYsMHgyOCwgMHg0OCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgyNiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDA0LDB4QTQsIDB4MDAsMHgwMiwgMHgwNCwweDIwLCAKKzB4MDAsMHgwMSwgMHg4MywweDk2LCAweEZGLDB4QTQsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhGNiwweDgyLCAKKzB4RkYsMHgwMCwgMHhDNywweDM4LCAweDZDLDB4MDAsIDB4QzcsMHgxQywgMHg3MCwweDAwLCAweEUwLDB4MDAsIDB4ODYsMHg1MCwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHgwNiwweDI4LCAweDAwLDB4MjYsIDB4ODYsMHhCMiwgMHgwMCwweDAwLCAweDc3LDB4MzEsIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweEY3LDB4MDIsIDB4RkYsMHgwMCwgMHhDNiwweEI0LCAKKzB4NzQsMHgwMCwgMHhGNiwweEIzLCAweDI4LDB4MDAsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweEYzLDB4MDQsIDB4M0IsMHhCMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4OTUsMHgxNiwgMHhGRiwweEI0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RDQsMHgyQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHhGRiwweEI0LCAweEYwLDB4MDUsIDB4NDAsMHg3QywgMHg4MywweDk2LCAKKzB4RkYsMHhCQywgMHgyMywweDAwLCAweDAwLDB4MDcsIDB4RjMsMHgwNSwgMHg0MiwweDU4LCAweEY3LDB4MDQsIDB4NDIsMHg1MCwgMHhGNiwweDA2LCAKKzB4NDIsMHg1MCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEYzLDB4MDYsIDB4MzksMHgzNCwgMHhGMywweDA1LCAKKzB4NDIsMHg0NCwgMHhGNSwweDA1LCAweDQwLDB4NzQsIDB4RjMsMHg4NSwgMHg0MiwweDYwLCAweEYzLDB4ODIsIDB4MDAsMHgwNiwgMHhGMywweDg1LCAKKzB4NDIsMHg1NCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweEY2LDB4ODQsIDB4MkQsMHgzOCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4MDYsMHgzNCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHhGNywweDA2LCAKKzB4MkMsMHgyOCwgMHg3NiwweEI1LCAweDAwLDB4MDIsIDB4RjMsMHg4MiwgMHgwMCwweDFDLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4ODcsMHg0QywgMHhCMywweEI2LCAweDcwLDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEYzLDB4MDYsIDB4NDIsMHg0NCwgMHg5MywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxRiwweDQ4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHg0OCwgMHhGMywweDg2LCAKKzB4NDIsMHg0NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjAsMHhFNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg4OSwweEVELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NDIsMHg1NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEVFLDB4MDAsIDB4ODcsMHhDOSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg3MywweDRDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAKKzB4ODksMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0IsMHhDQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgyNiwweDE0LCAweDAwLDB4MjAsIDB4RjAsMHgzMywgMHgyOCwweDAwLCAweDA1LDB4QTAsIDB4MDAsMHgwMiwgMHhGMCwweDJGLCAKKzB4MjgsMHgwMCwgMHhGMywweDgyLCAweDAwLDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDIyLCAweEYzLDB4QTcsIDB4MjgsMHgwMCwgMHgwNCwweEEwLCAKKzB4MDAsMHgxQSwgMHg5NCwweDk2LCAweEZGLDB4RDQsIDB4MjMsMHg5NCwgMHgwMCwweDIyLCAweDgzLDB4OUUsIDB4MDAsMHgwMCwgMHg3NywweDlELCAKKzB4MDAsMHgxRSwgMHg3NywweEJDLCAweEZGLDB4RTUsIDB4QzMsMHg5QywgMHg3RiwweEMwLCAweDczLDB4OUQsIDB4RkYsMHhGMCwgMHg3NiwweDMxLCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4MDYsMHhBQywgMHgwMCwweDAyLCAweDIzLDB4MTQsIDB4MDAsMHgxRSwgMHg3NSwweDE5LCAKKzB4MDAsMHgxRSwgMHhGMywweEE3LCAweDI4LDB4MDAsIDB4RjQsMHg4NCwgMHhFMCwweDAwLCAweDc1LDB4MjgsIDB4RkYsMHhFNSwgMHg5NCwweEEyLCAKKzB4MDAsMHgxQywgMHhGMywweDg0LCAweEUwLDB4MDQsIDB4NzQsMHg5NSwgMHgwMCwweDFFLCAweDc0LDB4QTQsIDB4RkYsMHhFNSwgMHg5NCwweDk2LCAKKzB4RkYsMHhCNCwgMHg3NCwweDk1LCAweDAwLDB4MUUsIDB4NzQsMHhBNCwgMHhGRiwweEU1LCAweDk0LDB4OTYsIDB4RkYsMHhDQywgMHg4NCwweDk2LCAKKzB4RkYsMHhCNCwgMHg5MywweEEyLCAweDAwLDB4MjAsIDB4ODcsMHgxNiwgMHhGRiwweEUwLCAweDczLDB4OTUsIDB4MDAsMHgxRSwgMHg3MywweDlDLCAKKzB4RkYsMHhFNSwgMHg5MywweDk2LCAweEZGLDB4QkMsIDB4NzMsMHg5NSwgMHgwMCwweDFFLCAweDczLDB4OUMsIDB4RkYsMHhFNSwgMHg5MywweDk2LCAKKzB4RkYsMHhDNCwgMHg4MywweDk2LCAweEZGLDB4QkMsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAKKzB4MjgsMHgwMCwgMHhGNSwweDg0LCAweDRGLDB4NTgsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweEM1LDB4QTAsIDB4NUEsMHgwMCwgMHg3NSwweEFDLCAKKzB4RkYsMHhGQSwgMHhDNywweDM4LCAweDU3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RTQsIDB4MjMsMHgxNCwgMHgwMCwweDFBLCAweDc2LDB4MTksIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHg0NSwweEFELCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg0RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg0LDB4OTYsIDB4RkYsMHhDQywgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAKKzB4RkYsMHhFOCwgMHgyMywweDE0LCAweDAwLDB4MTYsIDB4NzYsMHgxOSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4M0YsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RUMsIDB4MjMsMHgxNCwgMHgwMCwweDEyLCAweDc2LDB4MTksIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDRGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDFBLCAKKzB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODMsMHg5NiwgMHhGRiwweEM0LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEYwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAKKzB4M0YsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweEY0LDB4ODIsIDB4MDAsMHgwMiwgMHhGNCwweEEzLCAKKzB4MjgsMHgwMCwgMHgwNCwweDIwLCAweDAwLDB4MTgsIDB4MjMsMHg5NCwgMHgwMCwweDIyLCAweDgzLDB4OUUsIDB4MDAsMHgwMCwgMHg3NywweDlELCAKKzB4MDAsMHgxRSwgMHg3NywweEJDLCAweEZGLDB4RTUsIDB4QzMsMHg5QywgMHg3RiwweEMwLCAweDczLDB4OUQsIDB4RkYsMHhGMCwgMHg4NCwweDk2LCAKKzB4RkYsMHhENCwgMHhGMywweEEzLCAweDI4LDB4MDAsIDB4RjMsMHg4MiwgMHgwMCwweDAxLCAweEYzLDB4QTcsIDB4MjgsMHgwMCwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHhGNCwweDg2LCAweEUwLDB4MDAsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODQsIDB4NEYsMHg1QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjMsMHg0MCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg3OCwweEQ4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNCwweDg2LCAKKzB4MzYsMHg3OCwgMHhGNCwweDg1LCAweDQyLDB4NDQsIDB4RjAsMHgwNSwgMHg0MCwweDg0LCAweEY2LDB4ODQsIDB4NEYsMHg1QywgMHhGNywweDAyLCAKKzB4MDAsMHg2NCwgMHg5NywweDM2LCAweDAwLDB4MDAsIDB4OTAsMHgzNiwgMHgwMCwweDA0LCAweEY3LDB4MDIsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4NDAsMHg4NCwgMHhGMywweDg2LCAweDM1LDB4RUMsIDB4RjMsMHg4NSwgMHg0MiwweDMwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDkwLCAweEY3LDB4MDQsIDB4NDIsMHg2MCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHgwNSwweEI4LCAweDAwLDB4MTgsIDB4RjYsMHgwNCwgMHg0MiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgwNywgMHhFRSwweDAwLCAweDhBLDB4NzAsIDB4QzcsMHgzMCwgMHg2MCwweDAwLCAweEM3LDB4MzgsIDB4NTgsMHgwMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwRSwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4RjcsMHgwMiwgMHgwMCwweEZGLCAweEM2LDB4QjQsIDB4NzQsMHgwMCwgMHhDMCwweDM2LCAKKzB4NTIsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4RDcsMHgwMCwgMHgwQSwweDcwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4OEEsMHg3MSwgMHgwNywweDMwLCAweDAwLDB4MDEsIDB4RTAsMHgwMCwgMHg4QSwweDE4LCAweEY3LDB4MDUsIDB4NDIsMHg1OCwgMHhGNCwweDA0LCAKKzB4NDIsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyMiwgMHgwMCwweDA3LCAweEVFLDB4MDAsIDB4OEQsMHg5NCwgMHgyNCwweDk0LCAKKzB4MDAsMHgzNiwgMHhGNiwweDA0LCAweDQyLDB4NjAsIDB4MjUsMHgxNCwgMHgwMCwweDM4LCAweDIzLDB4OTQsIDB4MDAsMHgyMCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg3NSwweEIxLCAweDAwLDB4MUUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAKKzB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDM0LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDMyLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDMwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDJFLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDJDLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDJBLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHgyNCwweDk0LCAKKzB4MDAsMHgyOCwgMHg3NiwweDMxLCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4OTQsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHg5MywweDk2LCAKKzB4RkYsMHg3QywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RDAsMHhEQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNiwweDA0LCAweDQyLDB4NjAsIDB4MjQsMHg5NCwgMHgwMCwweDdFLCAweDI1LDB4MTQsIDB4MDAsMHg4MCwgMHgyMywweDk0LCAKKzB4MDAsMHg2OCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4NzUsMHhCMSwgMHgwMCwweDFFLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHg3QywgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHg3QSwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHg3OCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHg3NiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHg3NCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHg3MiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4NzAsIDB4NzYsMHgzMSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHg5MywweDk2LCAKKzB4RkYsMHg3NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RDIsMHg1OCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4NzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA0LCAKKzB4NDIsMHg1OCwgMHgyMywweDk0LCAweDAwLDB4NTAsIDB4QzcsMHgwMCwgMHg3MiwweDAwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg5MywweDk2LCAKKzB4RkYsMHg2QywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0YsMHgyNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4NkMsIDB4RjYsMHg4NiwgMHg0MiwweDUwLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDg0LCAKKzB4NDIsMHg1OCwgMHg3NiwweEI1LCAweDAwLDB4MUUsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDQsIDB4NDIsMHg1MCwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAKKzB4RkYsMHg3QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RjMsMHgzOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4OEQsMHg5NSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDQyLDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4NDIsMHg1OCwgMHhGNywweDA0LCAweDQyLDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwNywgMHhFRSwweDAwLCAKKzB4OEQsMHhENCwgMHhGMywweDgyLCAweDE3LDB4NzAsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4ODIsIDB4MDAsMHgxQywgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDhELDB4RjQsIDB4QjMsMHhCQSwgMHg2OCwweDAyLCAweEUwLDB4MDAsIDB4OEQsMHhGNCwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDFCLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDg2LCAKKzB4NDIsMHg0NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MUUsMHhDMCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAKKzB4MDAsMHg4OCwgMHhGNywweDA0LCAweDQyLDB4NTAsIDB4RjYsMHg4NiwgMHg0MiwweDUwLCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHhGMywweDg0LCAKKzB4NkYsMHgzNCwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4OTMsMHg5NiwgMHhGRiwweEM0LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg4NiwweDlFLCAKKzB4MDAsMHgwQywgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4OEUsMHg2NSwgMHhGNiwweDA2LCAKKzB4NDIsMHhBMCwgMHhGNywweDA0LCAweDQyLDB4QTAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4OTQsMHhFNCwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHhGNiwweDA0LCAweDQyLDB4NjAsIDB4MjQsMHg5NCwgMHgwMCwweDM2LCAweDg1LDB4MTYsIDB4RkYsMHhDNCwgMHgyMywweDk0LCAKKzB4MDAsMHgzOCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHg4NSwweDJBLCAweDAwLDB4MUMsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDc1LDB4QjEsIDB4MDAsMHgxRSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4OTUsMHgxNiwgMHhGRiwweEJDLCAweEY3LDB4MUYsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4ODUsMHgxNiwgMHhGRiwweEM0LCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDM0LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDMyLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDMwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDJFLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDJDLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDJBLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHgyNCwweDk0LCAKKzB4MDAsMHgyOCwgMHg3NiwweDMxLCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4ODcsMHgyQSwgMHgwMCwweDIwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MjcsMHgxNCwgMHgwMCwweDIwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEQwLDB4REMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHhDNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDFFLCAweDAwLDB4MTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4OEYsMHhGMCwgMHhGNiwweDgyLCAweDAwLDB4MDAsIDB4ODcsMHgxRSwgMHgwMCwweDE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDhGLDB4RjQsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEY2LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDkwLDB4NDEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg1LDB4MTYsIDB4RkYsMHhDNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNSwweDI4LCAweDAwLDB4MTAsIDB4OTUsMHgxNiwgMHhGRiwweEI0LCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDcyLDB4NTAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHhCNCwgMHgyNywweDE0LCAKKzB4MDAsMHgyMCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RjksMHgzNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHg5NCwweEU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NSwweDE2LCAKKzB4RkYsMHhCQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4OTQsMHhCQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDQiwweENDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHgyMywweDk0LCAweDAwLDB4NjIsIDB4RjUsMHgxRiwgMHgyOCwweDAwLCAweDc1LDB4OTUsIDB4MDAsMHgxRSwgMHg3NSwweEFDLCAKKzB4RkYsMHhFNSwgMHgwNiwweDIwLCAweDAwLDB4MDIsIDB4MDYsMHhCMCwgMHgwMCwweDAyLCAweDIzLDB4MTQsIDB4MDAsMHgxRSwgMHg3MywweDk5LCAKKzB4MDAsMHgxRSwgMHg3MywweDlDLCAweEZGLDB4RTUsIDB4OTMsMHg5NiwgMHhGRiwweDc0LCAweDc1LDB4MTUsIDB4MDAsMHgxRSwgMHg3NSwweDI4LCAKKzB4RkYsMHhFNSwgMHg5NSwweDE2LCAweEZGLDB4N0MsIDB4NzMsMHg5NSwgMHgwMCwweDFFLCAweDczLDB4OUMsIDB4RkYsMHhFNSwgMHg5MywweDk2LCAKKzB4RkYsMHg4QywgMHg4NSwweDE2LCAweEZGLDB4QzQsIDB4NzMsMHg5NSwgMHgwMCwweDFFLCAweDkzLDB4OTYsIDB4RkYsMHg4NCwgMHg4NSwweDJBLCAKKzB4MDAsMHgzNCwgMHgyMywweDk0LCAweDAwLDB4NjIsIDB4OTUsMHgxNiwgMHhGRiwweEFDLCAweEYwLDB4MzMsIDB4MjgsMHgwMCwgMHgwNSwweDIwLCAKKzB4MDAsMHgxQSwgMHg5NSwweDE2LCAweEZGLDB4OTQsIDB4ODMsMHg5RSwgMHgwMCwweDAwLCAweDc3LDB4OUQsIDB4MDAsMHgxRSwgMHg3NywweEJDLCAKKzB4RkYsMHhFNSwgMHhDMywweDlDLCAweDdGLDB4QzAsIDB4NzMsMHg5RCwgMHhGRiwweEYwLCAweDc0LDB4OTUsIDB4MDAsMHgxRSwgMHhGMywweEFCLCAKKzB4MjgsMHgwMCwgMHg4NSwweDE2LCAweEZGLDB4QzQsIDB4NzQsMHhBNCwgMHhGRiwweEU1LCAweDg1LDB4MkEsIDB4MDAsMHgxMCwgMHg4MywweDk2LCAKKzB4RkYsMHhDNCwgMHg5NSwweDIyLCAweDAwLDB4MUMsIDB4ODMsMHg5RSwgMHgwMCwweDE0LCAweDg1LDB4MTYsIDB4RkYsMHg4NCwgMHg5MywweEEyLCAKKzB4MDAsMHgyMCwgMHg4NywweDE2LCAweEZGLDB4RTAsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweDk1LDB4MTYsIDB4RkYsMHg4NCwgMHhGMywweDg0LCAKKzB4NEYsMHg1OCwgMHg4NSwweDE2LCAweEZGLDB4NzQsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4OTMsMHg5NiwgMHhGRiwweEE0LCAweEMwLDB4MjIsIDB4M0EsMHgwMCwgMHg4MywweDk2LCAKKzB4RkYsMHg3QywgMHhDNywweDM4LCAweDU3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RTQsIDB4MjMsMHgxNCwgMHgwMCwweDFBLCAweDc2LDB4MTksIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDRGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDFBLCAKKzB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEU4LCAweDIzLDB4MTQsIDB4MDAsMHgxNiwgMHg3NiwweDE5LCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHgzRiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg1LDB4MTYsIDB4RkYsMHg4QywgMHg4MywweDk2LCAKKzB4RkYsMHg4NCwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RUMsIDB4MjMsMHgxNCwgMHgwMCwweDEyLCAweDc2LDB4MTksIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDU3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDFBLCAKKzB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4RjAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4M0YsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4RjUsMHgwMiwgMHgwMCwweDAyLCAweEY1LDB4MjMsIDB4MjgsMHgwMCwgMHgyMywweDk0LCAKKzB4MDAsMHg1MiwgMHg4MywweDlFLCAweDAwLDB4MDAsIDB4NzcsMHg5RCwgMHgwMCwweDFFLCAweDc3LDB4QkMsIDB4RkYsMHhFNSwgMHhDMywweDlDLCAKKzB4N0YsMHhDMCwgMHg3MywweDlELCAweEZGLDB4RjAsIDB4MDMsMHgyMCwgMHgwMCwweDE4LCAweEU2LDB4MDAsIDB4OTIsMHgzMCwgMHhGMywweDlCLCAKKzB4MjgsMHgwMCwgMHhGNywweDA0LCAweDQyLDB4NzAsIDB4RTAsMHgwMCwgMHg5MiwweDlDLCAweEY2LDB4MDYsIDB4NDIsMHg3MiwgMHg4NSwweDE2LCAKKzB4RkYsMHhDNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHhBQSwgMHgwMCwweDIwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM0LCAKKzB4MDAsMHgwNywgMHgyMCwweDNBLCAweDAwLDB4MEUsIDB4RTIsMHgwMCwgMHg5MiwweDk0LCAweEM3LDB4MzQsIDB4NjgsMHgwMCwgMHhGNSwweDg0LCAKKzB4NDIsMHg2MCwgMHhGMywweDgyLCAweDAwLDB4RkYsIDB4QzcsMHgyQywgMHg3MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgyNiwgMHg4NiwweEJBLCAKKzB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4NzQsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4QzYsMHhCNCwgMHgzQywweDAwLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHhENywweDAwLCAweDBBLDB4NzAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4OTIsMHhDOSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDQyLDB4NzQsIDB4RjYsMHgwNiwgMHg0MiwweDc0LCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg3OCwweDlDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAKKzB4OTQsMHhFNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODUsMHgxNiwgMHhGRiwweEE0LCAweDgzLDB4OTYsIDB4RkYsMHg3NCwgMHhDNywweDIwLCAKKzB4NTIsMHgwMCwgMHg3NCwweEI4LCAweEZGLDB4RkEsIDB4QzYsMHgyNCwgMHgwMCwweDAwLCAweDg3LDB4MUUsIDB4MDAsMHgwMCwgMHg3NiwweDlELCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzUsMHhBQywgMHg1MiwweDAwLCAweDc1LDB4QUMsIDB4RkYsMHhGQSwgMHg0NiwweDMxLCAKKzB4MDAsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4RkYsIDB4QzYsMHgzMCwgMHg1NCwweDAwLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHhGNiwweDgyLCAweEZGLDB4MDAsIDB4QzcsMHgzOCwgMHg2QywweDAwLCAweEM2LDB4MzAsIDB4NzAsMHgwMCwgMHhGNiwweDFGLCAKKzB4MjgsMHgwMCwgMHg4MywweDk2LCAweEZGLDB4OTQsIDB4ODUsMHgxNiwgMHhGRiwweEM0LCAweEY1LDB4OUYsIDB4MjgsMHgwMCwgMHg4NywweDJBLCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDI0LCAweEU2LDB4MDAsIDB4OTQsMHg2OSwgMHhGNiwweDg2LCAKKzB4NDAsMHg5OCwgMHhGNywweDA0LCAweDZFLDB4NTAsIDB4ODYsMHgyQSwgMHgwMCwweDJDLCAweEM2LDB4QTQsIDB4MDAsMHgwMCwgMHgyMywweDk0LCAKKzB4MDAsMHg2MiwgMHg4NCwweDlFLCAweDAwLDB4MDAsIDB4NzcsMHg5RCwgMHgwMCwweDFFLCAweDc3LDB4QkMsIDB4RkYsMHhFNSwgMHhDNCwweEE0LCAKKzB4N0YsMHhDMCwgMHg3NCwweEE1LCAweEZGLDB4RjAsIDB4NDYsMHhCNSwgMHgwMCwweDAwLCAweDg3LDB4M0EsIDB4MUQsMHhEQywgMHg3NiwweEI1LCAKKzB4MDAsMHgwMiwgMHhDMCwweDMyLCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweEQ3LDB4MDAsIDB4MEEsMHg3MCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhGNywweDA2LCAweDQwLDB4OTgsIDB4RTYsMHgwMCwgMHg5NCwweDM0LCAweEMzLDB4MzQsIDB4NzAsMHgwMCwgMHhDNSwweDg0LCAKKzB4MDAsMHgwMCwgMHg4NiwweEFBLCAweDAwLDB4MjQsIDB4RjcsMHgwNCwgMHhFMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHgwNSwweDI4LCAweDAwLDB4MjQsIDB4RTYsMHgwMCwgMHg5MywweEM0LCAweDk1LDB4MTYsIDB4RkYsMHg3NCwgMHg4MywweDk2LCAKKzB4RkYsMHhDNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHg5RSwgMHgwMCwweDI4LCAweEY3LDB4MDQsIDB4RTAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg5MywweEM4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg5MywweEQ1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDgyLCAKKzB4MDAsMHgwMCwgMHg4NSwweDE2LCAweEZGLDB4NzQsIDB4RjcsMHgwNCwgMHhFMCwweDAwLCAweDg2LDB4QUEsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHg5NCwweDE0LCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDk0LDB4MUMsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweDg2LDB4QUEsIDB4MDAsMHgwNCwgMHhGNywweDA0LCAKKzB4RTAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4OTQsMHgxRCwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4OTQsMHgyRCwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4OTQsMHgzOSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0RiwweDU4LCAweEY0LDB4OUIsIDB4MjgsMHgwMCwgMHg4MywweDk2LCAKKzB4RkYsMHhDNCwgMHhGNiwweDg2LCAweDQwLDB4OUEsIDB4QzcsMHgyMCwgMHg3MiwweDAwLCAweDc3LDB4MzgsIDB4RkYsMHhGQSwgMHg4NiwweDFFLCAKKzB4MDAsMHgzMCwgMHg0NywweDM5LCAweDAwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHhFMCwweDAwLCAKKzB4OTQsMHhFNCwgMHhGNiwweDNCLCAweDI4LDB4MDAsIDB4NDcsMHgyNSwgMHgwMCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4MDEsIDB4RjUsMHgzQiwgMHgyOCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgwMiwgMHgyMywweDk0LCAKKzB4MDAsMHg2MiwgMHg4MywweDlFLCAweDAwLDB4MDAsIDB4NzcsMHg5RCwgMHgwMCwweDFFLCAweDc3LDB4QkMsIDB4RkYsMHhFNSwgMHhDMywweDlDLCAKKzB4N0YsMHhDMCwgMHg3MywweDlELCAweEZGLDB4RjAsIDB4MjUsMHgxNCwgMHgwMCwweDYyLCAweEYzLDB4QkIsIDB4MjgsMHgwMCwgMHg4NSwweDJBLCAKKzB4MDAsMHgwMCwgMHg3NywweEE5LCAweDAwLDB4MUUsIDB4NzcsMHhCQywgMHhGRiwweEU1LCAweEM1LDB4MjgsIDB4N0YsMHhDMCwgMHg3NSwweDI5LCAKKzB4RkYsMHhGMCwgMHhFMCwweDAwLCAweDk0LDB4RTQsIDB4RjUsMHgxQiwgMHgyOCwweDAwLCAweDgzLDB4OTYsIDB4RkYsMHhCQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDFFLCAweDAwLDB4MDEsIDB4RTYsMHgwMCwgMHg5NCwweEU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDc4LDB4OUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4MzUsMHg2MCwgMHhGNSwweDA1LCAKKzB4NDIsMHgzMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNSwweDA2LCAKKzB4NDIsMHg0NCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjAsMHhFNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg5NiwweDg5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNiwweDg0LCAKKzB4NDIsMHg1NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEVFLDB4MDAsIDB4OTUsMHg4RCwgMHhGNSwweDg2LCAKKzB4NDIsMHg1MCwgMHhGNywweDA0LCAweDQyLDB4NTAsIDB4NzYsMHgyRCwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHgyNiwweEI0LCAKKzB4MDAsMHgwMSwgMHhGNiwweDg1LCAweDQyLDB4NTQsIDB4MjUsMHgwMCwgMHgwMCwweDA3LCAweEY1LDB4MDUsIDB4NDIsMHg1OCwgMHhGNiwweDg0LCAKKzB4MkQsMHgzOCwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDJGLCAKKzB4MjgsMHgwMCwgMHgwNiwweDM0LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweEY3LDB4MDYsIDB4MkMsMHgyOCwgMHg3NiwweEI1LCAKKzB4MDAsMHgwMiwgMHhGNSwweDAyLCAweDAwLDB4MUMsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4OTYsMHg4OCwgMHhCNSwweDM2LCAKKzB4NzAsMHgwMiwgMHhFMCwweDAwLCAweDk2LDB4ODgsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY1LDB4MDQsIDB4NDIsMHg2MCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4QjIsMHg4NCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNiwweDg0LCAweDRGLDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzQsIDB4MDAsMHg0MCwgMHhDMCwweDIyLCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDk1LDB4RUMsIDB4RjYsMHgwNiwgMHg0MiwweDc2LCAweEY3LDB4MDQsIDB4NDIsMHg3NCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NzgsMHg5QywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhFMCwweDAwLCAweDk2LDB4ODgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NDIsMHg2MCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDIyLCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg5NiwweDI0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNSwweDA0LCAweDNCLDB4QjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEQ0LDB4MkMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4OTYsMHg0MCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDIyLCAweDZBLDB4MDAsIDB4RTYsMHgwMCwgMHg5NiwweDcxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDQywweDYwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA0LCAKKzB4NDAsMHg3QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNSwweDA0LCAKKzB4NDAsMHg3NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4QkUsMHhGOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHg5NiwweDg4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDA0LCAKKzB4NDAsMHg3NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4QzEsMHhCNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4NzAsIDB4RjYsMHgwNCwgMHg2RiwweDM0LCAweEY3LDB4MDQsIDB4NDIsMHg2NCwgMHg4NiwweEIyLCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4OUIsMHgxOCwgMHgwNiwweEIwLCAKKzB4MDAsMHgwMiwgMHg4NywweDM2LCAweDAwLDB4MDAsIDB4RjQsMHgwNCwgMHg0MCwweDdDLCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweEMwLDB4M0EsIDB4NDIsMHgwMCwgMHhFNiwweDAwLCAKKzB4OUIsMHgxOCwgMHgyNCwweDk0LCAweDAwLDB4MzYsIDB4RjYsMHgwNCwgMHg0MCwweDc0LCAweDIzLDB4OTQsIDB4MDAsMHgzOCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg3NSwweEIxLCAweDAwLDB4MUUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFGLCAKKzB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDM0LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDMyLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDMwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDJFLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDJDLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDJBLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHgyNCwweDk0LCAKKzB4MDAsMHgyOCwgMHg3NiwweDMxLCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4OTQsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgyNywweDE0LCAKKzB4MDAsMHgyMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RDAsMHhEQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDQiwweENDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDA0LCAKKzB4NDAsMHg3NCwgMHg5NCwweDE2LCAweEZGLDB4QzQsIDB4MDcsMHgyMCwgMHgwMCwweDAyLCAweEYwLDB4M0IsIDB4MjgsMHgwMCwgMHgyNCwweDgwLCAKKzB4MDAsMHgwNywgMHhGNCwweDAyLCAweDAwLDB4RkYsIDB4ODMsMHg5NiwgMHhGRiwweEM0LCAweDk1LDB4MTYsIDB4RkYsMHhCQywgMHgwMywweDFDLCAKKzB4MDAsMHgwQSwgMHgyMCwweDI2LCAweDAwLDB4MDcsIDB4RUUsMHgwMCwgMHg5OCwweEE4LCAweDA2LDB4MTgsIDB4MDAsMHgwRSwgMHg4NiwweEIyLCAKKzB4MDAsMHgwMCwgMHg3NywweDMxLCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweDc1LDB4QjEsIDB4MDAsMHgxRSwgMHg3NSwweEFDLCAKKzB4RkYsMHhFNSwgMHgwMywweDE4LCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhGNywweDAyLCAKKzB4RkYsMHgwMCwgMHhDNiwweEI0LCAweDc0LDB4MDAsIDB4RjYsMHhCMywgMHgyOCwweDAwLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHgwNCwweEE0LCAKKzB4MDAsMHgwMSwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweEM3LDB4MzgsIDB4NDQsMHgwMCwgMHhFMCwweDAwLCAKKzB4OTgsMHg1NCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4ODUsMHgxNiwgMHhGRiwweEM0LCAweDc0LDB4OTUsIDB4MDAsMHgxRSwgMHg3NCwweEE0LCAKKzB4RkYsMHhFNSwgMHg4MywweDk2LCAweEZGLDB4QzQsIDB4MjMsMHgxNCwgMHgwMCwweDFFLCAweDc0LDB4MTksIDB4MDAsMHgxRSwgMHg3NCwweDIwLCAKKzB4RkYsMHhFNSwgMHgwNSwweDI4LCAweDAwLDB4MjYsIDB4OTUsMHgxNiwgMHhGRiwweDhDLCAweDg1LDB4QUEsIDB4MDAsMHgwMCwgMHg3NiwweEE5LCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4MDMsMHg5QywgMHgwMCwweDAyLCAweDkzLDB4OTYsIDB4RkYsMHhCNCwgMHgwNiwweDFDLCAKKzB4MDAsMHgwMiwgMHg3MywweDk1LCAweDAwLDB4MUUsIDB4NzMsMHg5QywgMHhGRiwweEU1LCAweDkzLDB4OTYsIDB4RkYsMHhBQywgMHg3MywweDk1LCAKKzB4MDAsMHgxRSwgMHg3MywweDlDLCAweEZGLDB4RTUsIDB4OTMsMHg5NiwgMHhGRiwweDlDLCAweDgzLDB4OTYsIDB4RkYsMHhCQywgMHg3NSwweDE1LCAKKzB4MDAsMHgxRSwgMHg3NSwweDI4LCAweEZGLDB4RTUsIDB4OTUsMHgxNiwgMHhGRiwweDk0LCAweDc1LDB4MTUsIDB4MDAsMHgxRSwgMHg3NSwweDI4LCAKKzB4RkYsMHhFNSwgMHg5NSwweDE2LCAweEZGLDB4QTQsIDB4ODUsMHgxNiwgMHhGRiwweEM0LCAweEM1LDB4QUMsIDB4NkYsMHhDMCwgMHg3NSwweEFELCAKKzB4RkYsMHhGMCwgMHhGNSwweDA1LCAweDQyLDB4NjAsIDB4RjUsMHgwNCwgMHg0RiwweDU4LCAweEY2LDB4ODIsIDB4MDAsMHhGRiwgMHhDNywweDFDLCAKKzB4NTIsMHgwMCwgMHg3NywweDM4LCAweEZGLDB4RkEsIDB4NDcsMHgzOSwgMHgwMCwweDAwLCAweEM3LDB4MzgsIDB4NkMsMHgwMCwgMHhGNiwweDgyLCAKKzB4RkYsMHgwMCwgMHhDNSwweEFDLCAweDZDLDB4MDAsIDB4QzcsMHgzOCwgMHg1OCwweDAwLCAweDgzLDB4OTYsIDB4RkYsMHg4QywgMHhGNSwweDg0LCAKKzB4M0IsMHg2QywgMHg4NSwweDE2LCAweEZGLDB4QjQsIDB4RjcsMHgxRiwgMHgyOCwweDAwLCAweDg3LDB4MTYsIDB4RkYsMHhFMCwgMHgwNiwweEFDLCAKKzB4MDAsMHgwMSwgMHhGNiwweDg1LCAweDNCLDB4NkMsIDB4ODMsMHg5NiwgMHhGRiwweEM0LCAweEM3LDB4MzgsIDB4NEYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4RjUsMHgwNCwgMHg0RiwweDU4LCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHhDMCwweDFFLCAKKzB4NTIsMHgwMCwgMHhDNywweDM4LCAweDQ3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RTQsIDB4MjMsMHgxNCwgMHgwMCwweDFBLCAweDc2LDB4OTksIDB4MDAsMHgxRSwgMHg4MywweDk2LCAKKzB4RkYsMHg5NCwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHgzRiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhFOCwgMHgyMywweDE0LCAKKzB4MDAsMHgxNiwgMHg3NiwweDk5LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDg1LDB4MTYsIDB4RkYsMHhBQywgMHg4MywweDk2LCAKKzB4RkYsMHhBNCwgMHhDNywweDM4LCAweDU3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHg4NywweDFBLCAKKzB4MDAsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODUsMHgxNiwgMHhGRiwweDlDLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhFQywgMHgyMywweDE0LCAKKzB4MDAsMHgxMiwgMHg3NiwweDk5LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4M0YsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4MywweDk2LCAKKzB4RkYsMHhDNCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHg4NywweDE2LCAKKzB4RkYsMHhGMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg1NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHgwNywweDFDLCAweDAwLDB4M0EsIDB4RjUsMHhCQiwgMHgyOCwweDAwLCAweDA3LDB4MUMsIDB4MDAsMHgzNiwgMHhGMCwweDNCLCAKKzB4MjgsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4MDMsIDB4RTYsMHgwMCwgMHg5QSwweEE0LCAweEY1LDB4MUYsIDB4MjgsMHgwMCwgMHhGNywweDA0LCAKKzB4NDIsMHg3OCwgMHhGNiwweDA2LCAweDQyLDB4NzgsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDc4LDB4OUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4OUIsMHgxOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGMywweDg2LCAweDQyLDB4NDQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAKKzB4MUYsMHg0OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MjUsMHgwMCwgMHgwMCwweDA3LCAweEY1LDB4MDUsIDB4NDIsMHg1OCwgMHhGNywweDA0LCAKKzB4NDIsMHg1MCwgMHhGNiwweDA2LCAweDQyLDB4NTAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhGMywweDgyLCAKKzB4MDAsMHgwNiwgMHhGMywweDg1LCAweDQyLDB4NTQsIDB4RjUsMHgwNiwgMHgzOSwweDM0LCAweEY1LDB4MDUsIDB4NDIsMHg0NCwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4RjYsMHg4NCwgMHgyRCwweDM4LCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHgwNiwweDM0LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweEY3LDB4MDYsIDB4MkMsMHgyOCwgMHg3NiwweEI1LCAKKzB4MDAsMHgwMiwgMHhGMywweDgyLCAweDAwLDB4MUMsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4OUIsMHgxOCwgMHhCMywweEI2LCAKKzB4NzAsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4NzgsIDB4RjMsMHg4NiwgMHg0MiwweDQ0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDIwLDB4RTQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4OUUsMHg0MSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0MiwweDU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFRSwweDAwLCAweDlELDB4ODUsIDB4MjQsMHg5NCwgMHgwMCwweDM2LCAweEY2LDB4MDQsIDB4NDAsMHg3NCwgMHgyNSwweDE0LCAKKzB4MDAsMHgzOCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4NzUsMHhCMSwgMHgwMCwweDFFLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgzNCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgzMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgzMCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgyRSwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgyQywgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgyQSwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MjgsIDB4NzYsMHgzMSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweEYzLDB4ODQsIDB4NDAsMHg3QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDIzLDB4OTQsIDB4MDAsMHgyMCwgMHg5MywweDk2LCAKKzB4RkYsMHg5NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RDAsMHhEQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4OTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgyMywweDk0LCAKKzB4MDAsMHg2OCwgMHg5MywweDk2LCAweEZGLDB4OEMsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RDIsMHg1OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweDhDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHg5MCwweDEzLCAweEZGLDB4RkMsIDB4MjMsMHg5NCwgMHgwMCwweDUwLCAweDkzLDB4OTYsIDB4RkYsMHg4NCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDRiwweDI0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDAyLCAKKzB4RkYsMHgzNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg0MiwweDY0LCAweEYzLDB4ODQsIDB4NDAsMHg3QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHg4NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweDk0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhGNywweEM4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDlELDB4NUQsIDB4RjMsMHg4MiwgMHgxNywweDcwLCAweEY3LDB4MDQsIDB4NDIsMHg1NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg0MiwweDU0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAKKzB4MDAsMHgxQiwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4NiwgMHg0MiwweDQ0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDFFLDB4QzAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4OUUsMHg0MCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNSwweDA0LCAweDQwLDB4N0MsIDB4RjQsMHg4NCwgMHg0MCwweDc0LCAweEM3LDB4MjgsIDB4NTAsMHgwMCwgMHhDNywweDI0LCAKKzB4NzAsMHgwMCwgMHgwNSwweEI4LCAweDAwLDB4MjYsIDB4ODYsMHhBRSwgMHgwMCwweDAwLCAweDc3LDB4MkQsIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzcsMHhCNCwgMHgwMCwweDA4LCAweDcwLDB4M0UsIDB4RkYsMHhFOCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHhENywweDAwLCAweDBBLDB4NzAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4NEYsMHg1OCwgMHhFNiwweDAwLCAKKzB4OUQsMHhGRCwgMHhGNiwweDAyLCAweDAwLDB4RkYsIDB4RjcsMHgwNCwgMHg0MiwweDc4LCAweEY2LDB4MDYsIDB4NDIsMHg3QSwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NzgsMHg5QywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhFMCwweDAwLCAweDlFLDB4NDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4QUUsIDB4MDAsMHgwMCwgMHg3NywweDJELCAKKzB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMSwgMHhDNywweDM4LCAweDY0LDB4MDAsIDB4RjYsMHgwMiwgMHhGRiwweDAwLCAweEM2LDB4QjQsIDB4NjQsMHgwMCwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDcsMHgyOCwgMHgwMCwweDAxLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg5NCwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhCRSwweEY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHhEOCwgMHhGMywweDg2LCAKKzB4NDIsMHg0NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjAsMHhFNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhBMiwweEM5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NDIsMHg1NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEVFLDB4MDAsIDB4QTAsMHgzNSwgMHgyNCwweDk0LCAKKzB4MDAsMHgzNiwgMHhGNiwweDA0LCAweDQwLDB4NzQsIDB4MjUsMHgxNCwgMHgwMCwweDM4LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg3NSwweEIxLCAKKzB4MDAsMHgxRSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MzQsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MzIsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MzAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MkUsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MkMsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MkEsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgyOCwgMHg3NiwweDMxLCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHhGMywweDg0LCAweDQwLDB4N0MsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHgyMywweDk0LCAweDAwLDB4MjAsIDB4OTMsMHg5NiwgMHhGRiwweDRDLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEQwLDB4REMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHg0QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MjMsMHg5NCwgMHgwMCwweDUwLCAweDkzLDB4OTYsIDB4RkYsMHg0NCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhEMiwweDU4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDAyLCAKKzB4RkYsMHgzNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg0MiwweDY0LCAweEYzLDB4ODQsIDB4NDAsMHg3QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHg0NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweDRDLCAweEUwLDB4MDAsIDB4QTIsMHg4MCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHhGNCwweDA0LCAweDQwLDB4N0MsIDB4RjYsMHgwNCwgMHg0MCwweDc0LCAweEYzLDB4ODIsIDB4MDAsMHgwMCwgMHhDNywweDIwLCAKKzB4NDAsMHgwMCwgMHhDNywweDMwLCAweDcwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDI2LCAweDg2LDB4QkEsIDB4MDAsMHgwMCwgMHg3NywweDM5LCAKKzB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc3LDB4QjQsIDB4MDAsMHgwOCwgMHg3MCwweDNFLCAKKzB4RkYsMHhFOCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4RDcsMHgwMCwgMHgwQSwweDcwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4QTAsMHhBRCwgMHg5MywweDk2LCAweEZGLDB4M0MsIDB4RjcsMHgwNCwgMHg0MiwweEEwLCAweEY2LDB4MDYsIDB4NDIsMHhBMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NzgsMHg5QywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhFMCwweDAwLCAweEEyLDB4QzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDI0LDB4OTQsIDB4MDAsMHg3RSwgMHgyNSwweDE0LCAKKzB4MDAsMHg4MCwgMHgyMywweDk0LCAweDAwLDB4NjgsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDc1LDB4QjEsIDB4MDAsMHgxRSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NSwweEFDLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAKKzB4MDAsMHg3QywgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAKKzB4MDAsMHg3QSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAKKzB4MDAsMHg3OCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAKKzB4MDAsMHg3NiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAKKzB4MDAsMHg3NCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAKKzB4MDAsMHg3MiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDcwLCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHg5NCwweDEzLCAKKzB4RkYsMHhGQywgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4OTMsMHg5NiwgMHhGRiwweDM0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEQwLDB4REMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHgzNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MjMsMHg5NCwgMHgwMCwweEIwLCAweDkzLDB4OTYsIDB4RkYsMHgyQywgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhEMiwweDU4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAKKzB4RkYsMHgyQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHgzQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MjMsMHg5NCwgMHgwMCwweDk4LCAweDkzLDB4OTYsIDB4RkYsMHgyNCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDRiwweDI0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAKKzB4MDAsMHgwNiwgMHhGMywweDg1LCAweDQyLDB4NTQsIDB4ODcsMHgwMiwgMHhGRiwweDM0LCAweEYzLDB4ODYsIDB4MzgsMHhBOCwgMHhGMywweDg1LCAKKzB4NDIsMHg0NCwgMHhGNywweDA1LCAweDQyLDB4NjQsIDB4RjMsMHg4NCwgMHg0MCwweDdDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweDI0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4MzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEY3LDB4QzgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4QTIsMHhBOSwgMHhGMywweDgyLCAweDE3LDB4NzAsIDB4RjcsMHgwNCwgMHg0MiwweDU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDQyLDB4NTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgxQiwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDg2LCAweDQyLDB4NDQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAKKzB4MUUsMHhDMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHhGNiwweDA0LCAweDZGLDB4MzQsIDB4RjcsMHgwNCwgMHg0MiwweDY0LCAweDg2LDB4QjIsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhBMywweEFDLCAweDA2LDB4QjAsIDB4MDAsMHgwMiwgMHg4NywweDM2LCAKKzB4MDAsMHgwMCwgMHg3NiwweEI1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHhGNiwweDg0LCAKKzB4NDAsMHg3QywgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDAsIDB4QTMsMHhBQywgMHhDNywweDM0LCAKKzB4NjgsMHgwMCwgMHhGNSwweDg0LCAweDQwLDB4NzQsIDB4RjYsMHgwNCwgMHg0RiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNiwweDJDLCAKKzB4NjIsMHgwMCwgMHg3NiwweDMwLCAweEZGLDB4RkEsIDB4QzUsMHhBQywgMHg3MCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgyNiwgMHg4NiwweEFFLCAKKzB4MDAsMHgwMCwgMHg3NywweDJELCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweDQ2LDB4MzEsIDB4MDAsMHgwMCwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4RjcsMHgwMiwgMHgwMCwweEZGLCAweEM2LDB4MzAsIDB4NzQsMHgwMCwgMHhGNywweDAyLCAKKzB4RkYsMHgwMCwgMHhDNiwweEI0LCAweDc0LDB4MDAsIDB4QzYsMHgzMCwgMHg2OCwweDAwLCAweEY2LDB4MkYsIDB4MjgsMHgwMCwgMHhGNSwweDA2LCAKKzB4NDIsMHg0NCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MUYsMHg0OCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDA0LCAweDQwLDB4N0MsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNSwweDA0LCAweDQwLDB4NzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEJFLDB4RjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDgwLCAweEY3LDB4MDQsIDB4NDIsMHg1OCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhBMywweEY0LCAweDIwLDB4M0EsIDB4MDAsMHgwNywgMHhGNSwweDAyLCAKKzB4MDAsMHgwMSwgMHhGNSwweDA1LCAweDQyLDB4NTgsIDB4RjcsMHgwNCwgMHg0MiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwNywgMHhFRSwweDAwLCAweEE2LDB4RjAsIDB4MjMsMHg5NCwgMHgwMCwweDFFLCAweEY2LDB4MDQsIDB4NDIsMHg2MCwgMHgyMywweDE0LCAKKzB4MDAsMHg2NiwgMHhGNCwweDg0LCAweDQwLDB4NzgsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4MDQsMHhBNCwgMHgwMCwweDAyLCAweDc0LDB4MjUsIDB4MDAsMHgxRSwgMHg3NCwweDIwLCAKKzB4RkYsMHhFNSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4NzUsMHgzMSwgMHgwMCwweDFFLCAweDc1LDB4MjgsIDB4RkYsMHhFNSwgMHg5NSwweDE2LCAKKzB4RkYsMHg3QywgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweDI1LDB4MTQsIDB4MDAsMHgyMCwgMHg5NSwweDE2LCAKKzB4RkYsMHg5NCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDg1LDB4MTYsIDB4RkYsMHg3QywgMHgwNSwweEE0LCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDU3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIDB4MjgsMHgwMCwgMHgyMywweDk0LCAKKzB4MDAsMHgxQywgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHgyNSwweDE0LCAweDAwLDB4NTAsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFGLCAKKzB4MjgsMHgwMCwgMHgyMywweDk0LCAweDAwLDB4MUEsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFGLCAKKzB4MjgsMHgwMCwgMHgyMywweDk0LCAweDAwLDB4MTgsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFGLCAKKzB4MjgsMHgwMCwgMHgyMywweDk0LCAweDAwLDB4MTYsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFGLCAKKzB4MjgsMHgwMCwgMHgyMywweDk0LCAweDAwLDB4MTQsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFGLCAKKzB4MjgsMHgwMCwgMHgyMywweDk0LCAweDAwLDB4MTIsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFGLCAKKzB4MjgsMHgwMCwgMHgyMywweDk0LCAweDAwLDB4MTAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweDMxLCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDFGLCAweDI4LDB4MDAsIDB4ODcsMHgyNiwgMHgwMCwweDAwLCAweDI2LDB4MTQsIDB4MDAsMHg2OCwgMHhDNywweDM4LCAKKzB4NDcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIDB4MjgsMHgwMCwgMHgyMywweDE0LCAKKzB4MDAsMHg2NCwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIDB4MjgsMHgwMCwgMHgyMywweDE0LCAKKzB4MDAsMHg2MiwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIDB4MjgsMHgwMCwgMHgyMywweDE0LCAKKzB4MDAsMHg2MCwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIDB4MjgsMHgwMCwgMHgyMywweDE0LCAKKzB4MDAsMHg1RSwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIDB4MjgsMHgwMCwgMHgyMywweDE0LCAKKzB4MDAsMHg1QywgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIDB4MjgsMHgwMCwgMHgyMywweDE0LCAKKzB4MDAsMHg1QSwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIDB4MjgsMHgwMCwgMHgwNSwweEFDLCAKKzB4MDAsMHgwMiwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4MjMsMHgxNCwgMHgwMCwweDU4LCAweDc1LDB4QUQsIDB4MDAsMHgxRSwgMHg3NSwweEFDLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIDB4MjgsMHgwMCwgMHg5NiwweDEzLCAKKzB4RkYsMHhGQywgMHg5NSwweDE2LCAweEZGLDB4OEMsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RDIsMHg1OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHhGRiwweDhDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHhGNSwweDA0LCAweDQyLDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgyNSwweDE0LCAKKzB4MDAsMHgzOCwgMHg5NSwweDE2LCAweEZGLDB4ODQsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4Q0YsMHgyNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwNCwgMHg0MiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHhGNSwweDA0LCAweDQyLDB4NjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAKKzB4RkYsMHg4NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDg1LDB4MTYsIDB4RkYsMHg5NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RjcsMHhDOCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhBNiwweEYxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NDIsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NDIsMHg1OCwgMHhGNywweDA0LCAKKzB4NDIsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDA3LCAweEVFLDB4MDAsIDB4QTcsMHgzMCwgMHhGNSwweDAyLCAKKzB4MTcsMHg3MCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjUsMHgwMiwgMHgwMCwweDFDLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAKKzB4QTcsMHg1MCwgMHhCNSwweDNBLCAweDY4LDB4MDIsIDB4RTAsMHgwMCwgMHhBNywweDUwLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHhGNSwweDAyLCAweDAwLDB4MUIsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4NDIsMHg0NCwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxRSwweEMwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgzMCwgMHhGNiwweDA0LCAKKzB4NkYsMHgzNCwgMHhGNywweDA0LCAweDQyLDB4NjQsIDB4ODYsMHhCMiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweEE5LDB4RjAsIDB4MDcsMHgzMCwgMHgwMCwweDAyLCAweDg2LDB4M0EsIDB4MDAsMHgwMCwgMHhGNSwweDgyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDg0LCAweDQwLDB4N0MsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweDMwLCAKKzB4NzcsMHhDMCwgMHhGNywweDA0LCAweDQwLDB4NzQsIDB4QzYsMHhCNCwgMHg2OCwweDAwLCAweDc2LDB4MzEsIDB4RkYsMHhGMCwgMHhDNiwweDAwLCAKKzB4NjIsMHgwMCwgMHg5NiwweDE2LCAweEZGLDB4RjQsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgyNiwgMHg4NiwweEJBLCAKKzB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NywweEI0LCAKKzB4MDAsMHgwOCwgMHg3MCwweDNFLCAweEZGLDB4RTgsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweEQ3LDB4MDAsIDB4MEEsMHg3MCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEE4LDB4MzQsIDB4RjYsMHgwMiwgMHgwMCwweEZGLCAweDgzLDB4MTYsIDB4RkYsMHhGNCwgMHg4MywweDk2LCAKKzB4RkYsMHhGNCwgMHhGNywweDA0LCAweDQwLDB4NzgsIDB4QzYsMHg5OCwgMHgzOCwweDAwLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHgwNywweDM4LCAKKzB4MDAsMHgyNiwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4QzYsMHhCNCwgMHg2NCwweDAwLCAweEMwLDB4MzYsIDB4NUEsMHgwMCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHhENywweDAwLCAweDBBLDB4NzAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QTgsMHgzRCwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QTgsMHg3NSwgMHhGNiwweDA2LCAKKzB4NDIsMHg3QywgMHhGNywweDA0LCAweDQyLDB4N0MsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDc4LDB4OUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4QTksMHhGMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGMywweDA0LCAweDQyLDB4NjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENDLDB4NjAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY0LDB4MDQsIDB4NDAsMHg3OCwgMHhGNywweDA0LCAKKzB4NEYsMHg1OCwgMHhGNSwweDA0LCAweDQwLDB4NzQsIDB4RjMsMHg4NCwgMHg0MCwweDdDLCAweEYzLDB4MDQsIDB4NDAsMHg3QywgMHhDNiwweDIwLCAKKzB4NzIsMHgwMCwgMHg3NiwweDMwLCAweEZGLDB4RkEsIDB4QzUsMHg5QywgMHgzMCwweDAwLCAweEM1LDB4QTgsIDB4NTgsMHgwMCwgMHgwNSwweEFDLCAKKzB4MDAsMHgyNiwgMHg4NiwweEFFLCAweDAwLDB4MDAsIDB4NzQsMHhBRCwgMHgwMCwweDFFLCAweDc0LDB4QTQsIDB4RkYsMHhFNSwgMHg3MywweEFELCAKKzB4MDAsMHgxRSwgMHg3MywweDlDLCAweEZGLDB4RTUsIDB4OTMsMHg5NiwgMHhGRiwweEQ0LCAweEM1LDB4MjgsIDB4NzIsMHgwMCwgMHg3NSwweDI4LCAKKzB4RkYsMHhGQSwgMHg4MywweDE2LCAweEZGLDB4RjQsIDB4ODMsMHg5NiwgMHhGRiwweEY0LCAweDQ2LDB4MzEsIDB4MDAsMHgwMCwgMHg0NSwweDI5LCAKKzB4MDAsMHgwMCwgMHhDNywweDE4LCAweDM4LDB4MDAsIDB4QzQsMHgyMCwgMHg3MCwweDAwLCAweDA0LDB4MjAsIDB4MDAsMHgyNiwgMHg3MywweDIxLCAKKzB4MDAsMHgxRSwgMHhDNiwweEI0LCAweDRGLDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweEY0LDB4ODIsIDB4MDAsMHhGRiwgMHhDNiwweDMwLCAKKzB4NEMsMHgwMCwgMHhGMywweDgyLCAweEZGLDB4MDAsIDB4QzYsMHhCNCwgMHgzQywweDAwLCAweEM2LDB4MzAsIDB4NjgsMHgwMCwgMHhGNiwweDJGLCAKKzB4MjgsMHgwMCwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzMsMHgxOCwgMHhGRiwweEU1LCAweDkzLDB4MTYsIDB4RkYsMHhDQywgMHg4MywweDE2LCAKKzB4RkYsMHhENCwgMHg4MywweDk2LCAweEZGLDB4RjQsIDB4QzUsMHgyOCwgMHg0QywweDAwLCAweEM3LDB4MzgsIDB4MzcsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHg3NiwweDlELCAweDAwLDB4MTAsIDB4NzYsMHhCNSwgMHhGRiwweEY4LCAweEM3LDB4MzgsIDB4NEMsMHgwMCwgMHhDNiwweEI0LCAKKzB4NzAsMHgwMCwgMHhGNiwweEFGLCAweDI4LDB4MDAsIDB4ODcsMHgyMiwgMHgwMCwweDAwLCAweDc2LDB4QTEsIDB4MDAsMHgxRSwgMHg4MywweDE2LCAKKzB4RkYsMHhDQywgMHhGMywweDgyLCAweEZGLDB4MDAsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4MzcsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHhDNywweDM4LCAweDNDLDB4MDAsIDB4QzUsMHgyOCwgMHg3MCwweDAwLCAweEY1LDB4MjMsIDB4MjgsMHgwMCwgMHg4NywweDIyLCAKKzB4MDAsMHgwMCwgMHhGMywweDA0LCAweDQwLDB4N0MsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3MywweDE5LCAKKzB4MDAsMHgxMCwgMHg5MywweDE2LCAweEZGLDB4RUMsIDB4NzMsMHg5OSwgMHhGRiwweEY4LCAweEM3LDB4MzgsIDB4NEMsMHgwMCwgMHhDNywweDFDLCAKKzB4NzAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4REMsIDB4MjMsMHgxNCwgMHgwMCwweDIyLCAweDgzLDB4MUEsIDB4MDAsMHgwMCwgMHg3NywweDk5LCAKKzB4MDAsMHgxRSwgMHg3NywweEJDLCAweEZGLDB4RTUsIDB4QzMsMHgxOCwgMHg3RiwweEMwLCAweDczLDB4MTksIDB4RkYsMHhGMCwgMHhGMywweDIzLCAKKzB4MjgsMHgwMCwgMHhGMywweDg2LCAweDQyLDB4NDQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAKKzB4MUYsMHg0OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNCwgMHg0MCwweDdDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjMsMHgwNCwgMHg0MCwweDc0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhCRSwweEY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHg5OCwgMHhGMywweDA2LCAKKzB4NDIsMHg0NCwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjAsMHhFNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhBRSwweEU1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NDIsMHg1NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEVFLDB4MDAsIDB4QUQsMHg4OSwgMHgyNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDQyLDB4NTQsIDB4MjMsMHg5NCwgMHgwMCwweDFFLCAweEY2LDB4MDQsIDB4NDIsMHg2MCwgMHgyNCwweDk0LCAKKzB4MDAsMHg2NiwgMHg5NCwweDk2LCAweEZGLDB4NjQsIDB4RjMsMHgwNCwgMHg0MCwweDc4LCAweDI0LDB4OTQsIDB4MDAsMHgyMCwgMHg5NCwweDk2LCAKKzB4RkYsMHg5NCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHgwMywweDE4LCAweDAwLDB4MDIsIDB4OTMsMHgxNiwgMHhGRiwweDc0LCAweDc0LDB4MTksIDB4MDAsMHgxRSwgMHg3NCwweDIwLCAKKzB4RkYsMHhFNSwgMHgwNSwweDk4LCAweDAwLDB4MDIsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDc1LDB4MzEsIDB4MDAsMHgxRSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NSwweDI4LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDU3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIDB4MjgsMHgwMCwgMHgyMywweDk0LCAKKzB4MDAsMHgxQywgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHg4NSwweDE2LCAweEZGLDB4NjQsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFGLCAKKzB4MjgsMHgwMCwgMHgyMywweDk0LCAweDAwLDB4MUEsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFGLCAKKzB4MjgsMHgwMCwgMHgyMywweDk0LCAweDAwLDB4MTgsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFGLCAKKzB4MjgsMHgwMCwgMHgyMywweDk0LCAweDAwLDB4MTYsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFGLCAKKzB4MjgsMHgwMCwgMHgyMywweDk0LCAweDAwLDB4MTQsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFGLCAKKzB4MjgsMHgwMCwgMHgyMywweDk0LCAweDAwLDB4MTIsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFGLCAKKzB4MjgsMHgwMCwgMHgyMywweDk0LCAweDAwLDB4MTAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweDMxLCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDFGLCAweDI4LDB4MDAsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDI2LDB4MTQsIDB4MDAsMHg2OCwgMHhDNywweDM4LCAKKzB4NDcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHgyMywweDE0LCAKKzB4MDAsMHg2NCwgMHg5MywweDE2LCAweEZGLDB4NjQsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFCLCAKKzB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4NjIsIDB4OTQsMHg5NiwgMHhGRiwweDY0LCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHg4NywweDJFLCAKKzB4MDAsMHgwMCwgMHg3NiwweEFELCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDYwLCAweDk1LDB4MTYsIDB4RkYsMHg2NCwgMHgwNSwweEFDLCAKKzB4MDAsMHgwMiwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDIzLDB4MTQsIDB4MDAsMHg1RSwgMHg5MywweDE2LCAKKzB4RkYsMHg2NCwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAKKzB4MDAsMHg1QywgMHg5NCwweDk2LCAweEZGLDB4NjQsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgyNSwweDE0LCAweDAwLDB4NUEsIDB4OTUsMHgxNiwgMHhGRiwweDY0LCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHg4NywweDJFLCAKKzB4MDAsMHgwMCwgMHg3NiwweEFELCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDI0LDB4OTQsIDB4MDAsMHg1MCwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDIzLDB4MTQsIDB4MDAsMHg1OCwgMHgwNSwweEFDLCAKKzB4MDAsMHgwMiwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4OTMsMHgxNiwgMHhGRiwweDY0LCAweDc1LDB4QUQsIDB4MDAsMHgxRSwgMHg3NSwweEFDLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIDB4MjgsMHgwMCwgMHg5NiwweDEzLCAKKzB4RkYsMHhGQywgMHg5NCwweDk2LCAweEZGLDB4OEMsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RDIsMHg1OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHhGRiwweDhDLCAweDIzLDB4MTQsIDB4MDAsMHgzOCwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHgyNywweDgwLCAweDAwLDB4MDcsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDkzLDB4MTYsIDB4RkYsMHg4NCwgMHg5MywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDRiwweDI0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyNywweDgwLCAKKzB4MDAsMHgwNywgMHhGNywweDg1LCAweDQyLDB4NTgsIDB4MjcsMHg4MCwgMHgwMCwweDA3LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNCwweDg0LCAKKzB4NDIsMHg2NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4MTYsIDB4RkYsMHg4NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4ODMsMHgxNiwgMHhGRiwweDk0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhGNywweEM4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEFELDB4NUQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NDIsMHg1OCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg0MiwweDU4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNCwweDgyLCAKKzB4MDAsMHgxQywgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHhBRSwweEU0LCAweEI0LDB4QkEsIDB4NjgsMHgwMiwgMHhFMCwweDAwLCAKKzB4QUUsMHhFNCwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjcsMHgwNCwgMHg0MCwweDc4LCAweEY1LDB4ODQsIDB4NEYsMHg1OCwgMHgwNywweDM4LCAKKzB4MDAsMHgxNiwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4RjQsMHgwNiwgMHgzQiwweDkwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNCwgMHhGRiwweEYwLCAweDc2LDB4MzUsIDB4MDAsMHgwNiwgMHhBNywweDJFLCAKKzB4NjAsMHgwMiwgMHhDNSwweDJDLCAweDYwLDB4MDAsIDB4NzYsMHhBOSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4NzcsMHgzOSwgMHgwMCwweDAzLCAweEM3LDB4MzgsIDB4NDAsMHgwMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMiwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHg3MywweEI3LCAweEZGLDB4RjAsIDB4RUUsMHgwMCwgMHhBRSwweDU1LCAweDk1LDB4MTYsIDB4RkYsMHg2NCwgMHhBNywweDJFLCAKKzB4NjAsMHgwMiwgMHg3NiwweEE5LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHg3NywweDM5LCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHg0MCwweDAwLCAweDg2LDB4QkEsIDB4MDAsMHgwNCwgMHgyMywweDE0LCAKKzB4MDAsMHg4OCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAKKzB4RkYsMHhGMCwgMHhBNiwweEFBLCAweDY4LDB4MDIsIDB4NzcsMHgxRCwgMHgwMCwweDAzLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHgyNywweDM4LCAKKzB4MDAsMHgwOCwgMHg4NSwweDNBLCAweDAwLDB4MDQsIDB4ODQsMHhCQSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDFBLCAKKzB4MDAsMHgwNCwgMHg5NCwweDlBLCAweDAwLDB4MDAsIDB4ODUsMHg5NiwgMHhGRiwweDdDLCAweEUwLDB4MDAsIDB4QUUsMHg3OCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NCwweDk2LCAweEZGLDB4NjQsIDB4QTcsMHgyRSwgMHg2MCwweDAyLCAweDc2LDB4QTUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDc3LDB4MzksIDB4MDAsMHgwMywgMHhDNywweDM4LCAKKzB4NDAsMHgwMCwgMHg4NSwweEJBLCAweDAwLDB4MDQsIDB4ODUsMHgxNiwgMHhGRiwweDY0LCAweEY2LDB4MDYsIDB4M0IsMHg5MCwgMHg4NywweDJBLCAKKzB4MDAsMHgwMCwgMHg3NiwweEE5LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHg3NywweDM5LCAweDAwLDB4MDMsIDB4QTYsMHhCQSwgMHg2MCwweDAyLCAweDIwLDB4MUUsIDB4MDAsMHgwMCwgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHhFRSwweDAwLCAKKzB4QUUsMHhDOSwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4ODMsMHgxNiwgMHhGRiwweDc4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweDE5LCAKKzB4RkYsMHhGMCwgMHhDNiwweEI4LCAweDY4LDB4MDAsIDB4ODQsMHg5NiwgMHhGRiwweDY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDI0LCAKKzB4NjgsMHgwMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEMxLDB4MkMsIDB4MDAsMHgwMCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAKKzB4MDAsMHgxMCwgMHhGNywweDA0LCAweDQwLDB4ODQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4QUYsMHgzQywgMHhGNiwweDA2LCAweDQyLDB4QjgsIDB4RjcsMHgwNCwgMHg0MiwweEI4LCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhGMywweDA2LCAweDM2LDB4NzgsIDB4RjMsMHgwNSwgMHg0MiwweDQ0LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweEY3LDB4MDQsIDB4NEYsMHg1QywgMHhGMywweDg0LCAKKzB4NDIsMHg1QywgMHg4MywweDNBLCAweDAwLDB4MDQsIDB4QzQsMHgzOCwgMHgwMCwweDAwLCAweDkzLDB4MTYsIDB4RkYsMHhFQywgMHg3NywweDFELCAKKzB4MDAsMHgwMSwgMHhDNywweDM4LCAweDM4LDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDA0LDB4QjgsIDB4MDAsMHgwQywgMHg4MywweDE2LCAKKzB4RkYsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgxRSwgMHgzMiwweDAwLCAweEVDLDB4MDAsIDB4QjAsMHg3MCwgMHhDNSwweDA0LCAKKzB4MDAsMHgwMCwgMHhBNiwweEEyLCAweDQ4LDB4MDIsIDB4RjcsMHgwNCwgMHhFMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweEFGLDB4QTgsIDB4QzYsMHgyMCwgMHg0OCwweDAwLCAweDg2LDB4QjIsIDB4MDAsMHgwNCwgMHhGNywweDA0LCAKKzB4RTAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4QUYsMHhBQywgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QUYsMHhCOSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNSwweDAyLCAweDAwLDB4MDAsIDB4ODYsMHhCMiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4RTAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHhBRiwweEY0LCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweEFGLDB4RkMsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweDg2LDB4QjIsIDB4MDAsMHgwNCwgMHhGNywweDA0LCAKKzB4RTAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4QUYsMHhGRCwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QjAsMHgwRCwgMHgyMCwweDJBLCAKKzB4MDAsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QjAsMHg1OSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDdBLDB4RDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4QjAsMHg2NCwgMHhDNywweDIwLCAweDQ4LDB4MDAsIDB4ODcsMHgzQSwgMHgwMCwweDA4LCAweEY2LDB4MDYsIDB4NDAsMHg5OCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhBNiwweEJBLCAweDYwLDB4MDIsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4QjAsMHg2NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDQsMHhBNCwgMHgwMCwweDBDLCAweEUwLDB4MDAsIDB4QUYsMHg2MCwgMHgwMywweDlDLCAKKzB4MDAsMHgwMSwgMHg4MywweDE2LCAweEZGLDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MUUsIDB4MzIsMHgwMCwgMHhFQywweDAwLCAKKzB4QjEsMHgwNCwgMHhGMywweDA2LCAweDM2LDB4NzgsIDB4RjYsMHg4NCwgMHg0RiwweDVDLCAweDc3LDB4MUQsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4MzgsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MDcsMHgzOCwgMHgwMCwweDBDLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg4NywweDM2LCAKKzB4MDAsMHgwOCwgMHhGNiwweDg0LCAweDRGLDB4NTgsIDB4NzcsMHgzOSwgMHgwMCwweDA2LCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg5NiwweDkzLCAKKzB4RkYsMHhGQywgMHg5MywweDk2LCAweEZGLDB4RjQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RkEsMHg5OCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RjYsMHg4NCwgMHg0MiwweDZDLCAweDgzLDB4OTYsIDB4RkYsMHhGNCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHhENywweDAwLCAweDBBLDB4NzAsIDB4QzcsMHgxQywgMHg3MCwweDAwLCAweEY3LDB4MDUsIDB4NDIsMHg1QywgMHgwNiwweEI0LCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjYsMHg4NSwgMHg0MiwweDZDLCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4MDIsIDB4MDAsMHgxQywgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAwLCAweEIxLDB4MDgsIDB4QjMsMHgzQSwgMHg2OCwweDAyLCAweEUwLDB4MDAsIDB4QjEsMHgwOCwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHhGMywweDA1LCAweDQyLDB4NDQsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHhGNCwweDAyLCAweDAwLDB4MDAsIDB4QzUsMHhBMCwgMHgwMCwweDAwLCAweEY2LDB4ODIsIDB4MDcsMHg3MCwgMHhGNywweDA0LCAKKzB4NkUsMHg1MCwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhCMSwweDZELCAweDA2LDB4MzgsIDB4MDAsMHgxQywgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzQsMHgyMCwgMHg3MCwweDAwLCAweEMwLDB4MjIsIDB4NzIsMHgwMCwgMHhFNCwweDAwLCAKKzB4QjEsMHg1RCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDUsMHhBQywgMHgwMCwweDAxLCAweDI2LDB4QjQsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEIxLDB4NDAsIDB4MDYsMHgzMCwgMHgwMCwweDA0LCAweEM0LDB4MjAsIDB4NTgsMHgwMCwgMHhDMCwweDIyLCAKKzB4NUEsMHgwMCwgMHhFNCwweDAwLCAweEIxLDB4ODEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA0LDB4MjAsIDB4MDAsMHgwMSwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4NzgsMHhEOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4QjEsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDA0LCAweDQwLDB4OTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MjIsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4QjEsMHhFRCwgMHhGNCwweDA1LCAweDQwLDB4OTAsIDB4RjcsMHgwNCwgMHg2RSwweDUwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweEJBLCAKKzB4MUQsMHhEQywgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MDYsMHhCNCwgMHgwMCwweDAxLCAweDk2LDB4QkEsIDB4MUQsMHhEQywgMHg4NywweDNBLCAKKzB4MUQsMHhEQywgMHhFMCwweDAwLCAweEIxLDB4RjAsIDB4RjUsMHg4NSwgMHg3QSwweEQwLCAweEYwLDB4MDUsIDB4N0EsMHhEMCwgMHhGNSwweDg0LCAKKzB4NDAsMHg5MCwgMHhGMCwweDA1LCAweDQwLDB4ODQsIDB4RjUsMHg4NSwgMHg0MCwweDk0LCAweEY1LDB4ODYsIDB4RTAsMHgwMCwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhENSwweEEwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA0LCAKKzB4NkUsMHg1MCwgMHhGNCwweDA1LCAweDQwLDB4ODQsIDB4ODUsMHhCQSwgMHgxRCwweERDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDg1LCAKKzB4M0IsMHg2NCwgMHhGNSwweDg0LCAweEUwLDB4MDAsIDB4RjAsMHgwNSwgMHg0MiwweDVDLCAweDk1LDB4QkEsIDB4MDAsMHgxMCwgMHhGNSwweDg0LCAKKzB4RTAsMHgwNCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4OTUsMHhCQSwgMHgwMCwweDE0LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGNSwweDg2LCAKKzB4M0EsMHg0QywgMHhGNSwweDg1LCAweDQyLDB4NDQsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhGNSwweDgyLCAweDAwLDB4MUMsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4QjIsMHg2OCwgMHhCNSwweEJBLCAKKzB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjUsMHg4NiwgMHgzNSwweEVDLCAweEY1LDB4ODUsIDB4NDIsMHgzMCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA4LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHhDOCwgMHhGMywweDAyLCAKKzB4MDAsMHgwMCwgMHg5MywweDE2LCAweEZGLDB4OTQsIDB4MjQsMHg4MCwgMHgwMCwweDA4LCAweDk0LDB4OTYsIDB4RkYsMHg4NCwgMHgyMywweDgwLCAKKzB4MDAsMHgwNywgMHg4MywweDE2LCAweEZGLDB4OTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4MTYsIDB4RkYsMHg1NCwgMHgyMCwweDFFLCAKKzB4MDAsMHgwNywgMHhFRSwweDAwLCAweEI1LDB4NjQsIDB4QzcsMHgxQywgMHgzOCwweDAwLCAweDg0LDB4OTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDNywweDI0LCAweDcwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDI2LCAweDg2LDB4QkEsIDB4MDAsMHgwMCwgMHhGNSwweDg0LCAKKzB4NEYsMHg1OCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAKKzB4RkYsMHhGMCwgMHhGNywweDAyLCAweDAwLDB4RkYsIDB4QzYsMHhCNiwgMHg3NCwweDAwLCAweEU2LDB4MDAsIDB4QjMsMHgyRCwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMSwgMHhFNiwweDAwLCAweEIzLDB4MkQsIDB4NzcsMHgzNSwgMHgwMCwweDA2LCAweEE2LDB4QkEsIDB4NTgsMHgwMiwgMHhDNywweDM4LCAKKzB4NTgsMHgwMCwgMHg3NiwweDM5LCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NjcsMHhDMCwgMHg3NiwweEI1LCAKKzB4RkYsMHhGMCwgMHgyMCwweDM2LCAweDAwLDB4MDIsIDB4RTYsMHgwMCwgMHhCMywweDMxLCAweEM2LDB4QjgsIDB4MDAsMHgwMCwgMHhDNywweDJDLCAKKzB4MDAsMHgwMCwgMHhFMCwweDAwLCAweEIzLDB4MzAsIDB4QzYsMHhCOCwgMHgwMCwweDAwLCAweEY2LDB4ODQsIDB4NEYsMHg1OCwgMHhGNywweDA0LCAKKzB4NEYsMHg1OCwgMHhDNSwweDM0LCAweDAwLDB4MDAsIDB4QzAsMHgyQSwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4QjUsMHg1RCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNiwweDg0LCAweDNCLDB4QkMsIDB4RjMsMHgwMiwgMHgwMCwweDAwLCAweDkzLDB4MTYsIDB4RkYsMHgzQywgMHgwNCwweDI4LCAKKzB4MDAsMHgxQywgMHhGNywweDA0LCAweDNCLDB4QjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFQywweDAwLCAKKzB4QjQsMHg0MCwgMHg5NiwweDk2LCAweEZGLDB4QUMsIDB4NzcsMHgzNSwgMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhGNCwweDg2LCAweDNCLDB4QjQsIDB4QzYsMHgzOCwgMHg0OCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwQywgMHhDMywweDA0LCAKKzB4MDAsMHgwMCwgMHg5MywweDE2LCAweEZGLDB4MzQsIDB4ODYsMHhCMiwgMHgwMCwweDAwLCAweDg3LDB4MkEsIDB4MDAsMHgxQywgMHg4NSwweDk2LCAKKzB4RkYsMHgzQywgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhCMywweEMwLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHg4NiwweEIyLCAKKzB4MDAsMHgwNCwgMHg4NywweDJBLCAweDAwLDB4MjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4QjMsMHhDMCwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4QjMsMHhEMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjQsMHg4MiwgMHgwMCwweDAwLCAweDk0LDB4OTYsIDB4RkYsMHgzNCwgMHg4NiwweEIyLCAKKzB4MDAsMHgwMCwgMHg4NywweDIyLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAKKzB4QjQsMHgwQywgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4QjQsMHgxNCwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHg4NiwweEIyLCAweDAwLDB4MDQsIDB4ODcsMHgyMiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFMiwweDAwLCAweEI0LDB4MTUsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEI0LDB4MjUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEYzLDB4MDIsIDB4MDAsMHgwMSwgMHg5MywweDE2LCAKKzB4RkYsMHgzNCwgMHg4NCwweDk2LCAweEZGLDB4MzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4QjQsMHg0MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjMsMHgwMiwgMHgwMCwweDAxLCAweDkzLDB4MTYsIDB4RkYsMHgzQywgMHg4NCwweDk2LCAKKzB4RkYsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QjQsMHg4MSwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHg4NywweDE2LCAweEZGLDB4QUMsIDB4RjMsMHgwNiwgMHgzQiwweEI0LCAweDc2LDB4QjksIDB4MDAsMHgwMSwgMHhDNiwweEI0LCAKKzB4NzAsMHgwMCwgMHg3NiwweEI1LCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHgzMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgxNCwgMHg4NiwweEI2LCAKKzB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4QjAsIDB4RTAsMHgwMCwgMHhCNCwweEY0LCAweDk2LDB4OTYsIDB4RkYsMHhCNCwgMHgyNywweDE0LCAKKzB4MDAsMHg1NCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTQsMHgxMywgMHhGRiwweEZDLCAweEY0LDB4ODYsIDB4M0IsMHhCNCwgMHg5NCwweDkzLCAKKzB4RkYsMHhGQywgMHg5MywweDk2LCAweEZGLDB4NEMsIDB4OTUsMHgxNiwgMHhGRiwweDQ0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAKKzB4MjUsMHg2OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweDRDLCAweDg1LDB4MTYsIDB4RkYsMHg0NCwgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEI0LDB4RjEsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIDB4RkYsMHhBQywgMHhGMywweDA2LCAKKzB4M0IsMHhCNCwgMHg3NiwweEI5LCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAKKzB4MzAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTQsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhCMCwgMHg5NiwweDk2LCAKKzB4RkYsMHhCNCwgMHhGNywweDA1LCAweDNCLDB4QkMsIDB4RTAsMHgwMCwgMHhCNCwweEY4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhCNSwweDJELCAweDI3LDB4MTQsIDB4MDAsMHgwOCwgMHg4NCwweDk2LCAKKzB4RkYsMHg1NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgyNCwgMHg3MCwweDAwLCAweDgzLDB4MTYsIDB4RkYsMHhCNCwgMHgwNCwweEE0LCAKKzB4MDAsMHgwNCwgMHg5NCwweDk2LCAweEZGLDB4NTQsIDB4ODQsMHg5NiwgMHhGRiwweDk0LCAweDkzLDB4M0EsIDB4RkYsMHhDMCwgMHgwNCwweEE0LCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweEI1LDB4NTQsIDB4OTQsMHg5NiwgMHhGRiwweDk0LCAweDgzLDB4MTYsIDB4RkYsMHg1NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDNywweDE4LCAweDcwLDB4MDAsIDB4RjQsMHg4NCwgMHg0RiwweDU4LCAweDAzLDB4MTgsIDB4MDAsMHgwNCwgMHg5MywweDE2LCAKKzB4RkYsMHg1NCwgMHg4MywweDE2LCAweEZGLDB4OTQsIDB4OTQsMHhCQSwgMHhGRiwweEMwLCAweDAzLDB4MTgsIDB4MDAsMHgwMSwgMHg5MywweDE2LCAKKzB4RkYsMHg5NCwgMHg5NSwweDE2LCAweEZGLDB4M0MsIDB4OTMsMHg5NiwgMHhGRiwweDhDLCAweEUwLDB4MDAsIDB4QjIsMHhCMCwgMHgwMywweDlDLCAKKzB4MDAsMHgwMSwgMHg4NCwweDk2LCAweEZGLDB4OTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4QjUsMHg4NCwgMHhGMywweDgyLCAweDAwLDB4MDEsIDB4RjQsMHgwNCwgMHg0RiwweDU4LCAweEUwLDB4MDAsIDB4QkUsMHhFNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4MywweDE2LCAweEZGLDB4QjgsIDB4ODQsMHg5NiwgMHhGRiwweDk0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDFFLCAKKzB4NEEsMHgwMCwgMHhFQywweDAwLCAweEI1LDB4Q0MsIDB4OTMsMHgxNiwgMHhGRiwweDdDLCAweDI2LDB4OTQsIDB4MDAsMHgwNCwgMHg4NywweDM2LCAKKzB4RkYsMHhDMCwgMHg4MywweDE2LCAweEZGLDB4N0MsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4MzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4QkIsMHg5OCwgMHgwMywweDlDLCAweDAwLDB4MDEsIDB4ODQsMHg5NiwgMHhGRiwweDk0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDFFLCAKKzB4NEEsMHgwMCwgMHhFQywweDAwLCAweEI1LDB4QTEsIDB4MDYsMHhCNCwgMHgwMCwweDA0LCAweEY0LDB4MDQsIDB4NEYsMHg1OCwgMHg4MywweDE2LCAKKzB4RkYsMHg3QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgxQSwgMHg0MiwweDAwLCAweEU2LDB4MDAsIDB4QkEsMHgyRCwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMCwgMHg5NCwweDk2LCAweEZGLDB4NzQsIDB4MjMsMHg4MCwgMHgwMCwweDA3LCAweDIwLDB4MUUsIDB4MDAsMHgwNywgMHhFRSwweDAwLCAKKzB4QjcsMHg0OCwgMHhDNywweDFDLCAweDM4LDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweDdDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDE4LCAKKzB4NzAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MjYsIDB4ODYsMHhCQSwgMHgwMCwweDAwLCAweEY1LDB4ODQsIDB4NEYsMHg1OCwgMHg3NywweDM5LCAKKzB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhGNywweDAyLCAKKzB4MDAsMHhGRiwgMHhDNiwweEI2LCAweDc0LDB4MDAsIDB4RTYsMHgwMCwgMHhCNiwweDY5LCAweDIwLDB4MzYsIDB4MDAsMHgwMSwgMHhFNiwweDAwLCAKKzB4QjYsMHg2OSwgMHg3NywweDM1LCAweDAwLDB4MDYsIDB4QTYsMHhCQSwgMHg1OCwweDAyLCAweEM3LDB4MzgsIDB4NTgsMHgwMCwgMHg3NiwweDM5LCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg2NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMiwgMHhFNiwweDAwLCAweEI2LDB4NkQsIDB4QzYsMHhCOCwgMHgwMCwweDAwLCAweEM3LDB4MkMsIDB4MDAsMHgwMCwgMHhFMCwweDAwLCAKKzB4QjYsMHg2QywgMHhDNiwweEI4LCAweDAwLDB4MDAsIDB4RjYsMHg4NCwgMHg0RiwweDU4LCAweEY3LDB4MDQsIDB4NEYsMHg1OCwgMHhDNSwweDM0LCAKKzB4MDAsMHgwMCwgMHhDMCwweDJBLCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhCNywweDQxLCAweEM1LDB4ODQsIDB4MDAsMHgwMCwgMHg4NCwweDk2LCAKKzB4RkYsMHg3NCwgMHg4NiwweEFBLCAweDAwLDB4MUMsIDB4ODMsMHgxNiwgMHhGRiwweDNDLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHgwNCwweEE0LCAKKzB4MDAsMHgwMSwgMHg5NCwweDk2LCAweEZGLDB4NzQsIDB4ODcsMHgxQSwgMHgwMCwweDFDLCAweDA0LDB4QTgsIDB4MDAsMHgxQywgMHg5NCwweDk2LCAKKzB4RkYsMHgzNCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhCNiwweENDLCAweDA0LDB4MTgsIDB4MDAsMHgxQywgMHg4NiwweEFBLCAKKzB4MDAsMHgyMCwgMHg4NywweDFBLCAweDAwLDB4MjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4QjYsMHhEMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4QjYsMHhERCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjUsMHg4MiwgMHgwMCwweDAwLCAweDgzLDB4MTYsIDB4RkYsMHgzNCwgMHg4NywweDIyLCAKKzB4MDAsMHgwMCwgMHg4NiwweDlBLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAKKzB4QjcsMHgxQywgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4QjcsMHgyNCwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHg4NiwweDlBLCAweDAwLDB4MDQsIDB4ODcsMHgyMiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFMiwweDAwLCAweEI3LDB4MjUsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEI3LDB4MzUsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEI3LDB4NDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4OTYsIDB4RkYsMHg4NCwgMHhFMCwweDAwLCAKKzB4QjUsMHhFQywgMHgwMywweDlDLCAweDAwLDB4MDEsIDB4ODQsMHg5NiwgMHhGRiwweDc0LCAweDgzLDB4MTYsIDB4RkYsMHg5NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDI2LCAweDMyLDB4MDAsIDB4RTYsMHgwMCwgMHhCQiwweDk4LCAweDIzLDB4MDAsIDB4MDAsMHgwOCwgMHg4NCwweDk2LCAKKzB4RkYsMHg4NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgyNiwgMHgzMiwweDAwLCAweEU2LDB4MDAsIDB4QkIsMHg5OSwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDg0LCAweDQwLDB4N0MsIDB4RjcsMHgwNCwgMHg0MCwweDc0LCAweEM2LDB4QjQsIDB4NjgsMHgwMCwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MjYsIDB4ODYsMHhCQSwgMHgwMCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzcsMHhCNCwgMHgwMCwweDA4LCAweDcwLDB4M0UsIDB4RkYsMHhFOCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHhENywweDAwLCAweDBBLDB4NzAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QjgsMHgwNCwgMHhGNSwweDgyLCAKKzB4MDAsMHhGRiwgMHg4NCwweDk2LCAweEZGLDB4ODQsIDB4ODMsMHgxNiwgMHhGRiwweDhDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDI0LCAKKzB4MzIsMHgwMCwgMHg4NCwweDk2LCAweEZGLDB4N0MsIDB4QzcsMHgzOCwgMHg3MCwweDAwLCAweEM3LDB4MjQsIDB4NzAsMHgwMCwgMHgwNywweDM4LCAKKzB4MDAsMHgyNiwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4QzYsMHhCNCwgMHg1QywweDAwLCAweEMwLDB4MzYsIDB4NjIsMHgwMCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHhENywweDAwLCAweDBBLDB4NzAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QjgsMHgwRCwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QkIsMHg5OCwgMHgyMywweDgwLCAKKzB4MDAsMHgwNywgMHgyMCwweDFFLCAweDAwLDB4MDcsIDB4RUUsMHgwMCwgMHhCOCwweEM4LCAweEM3LDB4MUMsIDB4MzgsMHgwMCwgMHg4MywweDE2LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgxOCwgMHg3MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgyNiwgMHg4NiwweEJBLCAKKzB4MDAsMHgwMCwgMHhGNSwweDg0LCAweDRGLDB4NTgsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4RjcsMHgwMiwgMHgwMCwweEZGLCAweEM2LDB4QjYsIDB4NzQsMHgwMCwgMHhFNiwweDAwLCAKKzB4QjgsMHg5MSwgMHgyMCwweDM2LCAweDAwLDB4MDEsIDB4RTYsMHgwMCwgMHhCOCwweDkxLCAweDc3LDB4MzUsIDB4MDAsMHgwNiwgMHhBNiwweEJBLCAKKzB4NTgsMHgwMiwgMHhDNywweDM4LCAweDU4LDB4MDAsIDB4NzYsMHgzOSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAKKzB4NjcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4MjAsMHgzNiwgMHgwMCwweDAyLCAweEU2LDB4MDAsIDB4QjgsMHg5NSwgMHhDNiwweEI4LCAKKzB4MDAsMHgwMCwgMHhDNywweDJDLCAweDAwLDB4MDAsIDB4RTAsMHgwMCwgMHhCOCwweDk0LCAweEM2LDB4QjgsIDB4MDAsMHgwMCwgMHhGNiwweDg0LCAKKzB4NEYsMHg1OCwgMHhGNywweDA0LCAweDRGLDB4NTgsIDB4QzUsMHgzNCwgMHgwMCwweDAwLCAweEMwLDB4MkEsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4QjgsMHhDMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTYsIDB4RkYsMHg0QywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENDLDB4NjAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHg0QywgMHhFMCwweDAwLCAKKzB4QjgsMHgxNCwgMHgwMywweDlDLCAweDAwLDB4MDEsIDB4ODQsMHg5NiwgMHhGRiwweDg0LCAweDgzLDB4MTYsIDB4RkYsMHg4QywgMHhGMywweDg0LCAKKzB4NDAsMHg3QywgMHhGNSwweDA0LCAweDQwLDB4NzQsIDB4QzQsMHhBNCwgMHgzMiwweDAwLCAweDk0LDB4OTYsIDB4RkYsMHgzNCwgMHg4MywweDE2LCAKKzB4RkYsMHgzNCwgMHhDNSwweDlDLCAweDM4LDB4MDAsIDB4QzUsMHhBOCwgMHg1OCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgyNiwgMHg4NiwweEFFLCAKKzB4MDAsMHgwMCwgMHg3NywweDJELCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweDc0LDB4MkQsIDB4MDAsMHgxRSwgMHg3NCwweDIwLCAKKzB4RkYsMHhFNSwgMHg3MywweDlELCAweDAwLDB4MTAsIDB4NzMsMHg5RCwgMHhGRiwweEY4LCAweEM0LDB4QTQsIDB4MzAsMHgwMCwgMHg5NCwweDk2LCAKKzB4RkYsMHgzQywgMHg4MywweDE2LCAweEZGLDB4N0MsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweEM0LDB4OTgsIDB4NDgsMHgwMCwgMHg5NCwweDk2LCAKKzB4RkYsMHgzQywgMHgwNCwweEE0LCAweDAwLDB4MjYsIDB4OTQsMHg5NiwgMHhGRiwweDNDLCAweDczLDB4MjUsIDB4MDAsMHgxRSwgMHg3MywweDE4LCAKKzB4RkYsMHhFNSwgMHg5MywweDE2LCAweEZGLDB4NkMsIDB4NzQsMHhBNSwgMHgwMCwweDFFLCAweDk0LDB4OTYsIDB4RkYsMHg2NCwgMHg3NCwweEE0LCAKKzB4RkYsMHhFNSwgMHg5NCwweDk2LCAweEZGLDB4NjQsIDB4ODMsMHgxNiwgMHhGRiwweDdDLCAweEY0LDB4ODQsIDB4NEYsMHg1OCwgMHg3NiwweEI1LCAKKzB4RkYsMHhGMCwgMHhDNiwweDE4LCAweDRBLDB4MDAsIDB4NzYsMHgzMCwgMHhGRiwweEZBLCAweDQ2LDB4MzEsIDB4MDAsMHgwMCwgMHhGMywweDAyLCAKKzB4MDAsMHhGRiwgMHhDNiwweDMwLCAweDM0LDB4MDAsIDB4RjQsMHg4MiwgMHhGRiwweDAwLCAweEM2LDB4QjQsIDB4NEMsMHgwMCwgMHhDNiwweDMwLCAKKzB4NjgsMHgwMCwgMHhGNiwweDJGLCAweDI4LDB4MDAsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDgzLDB4MTYsIDB4RkYsMHgzNCwgMHhDNywweDM4LCAKKzB4NDcsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4NzMsMHgxOSwgMHgwMCwweDEwLCAweDkzLDB4MTYsIDB4RkYsMHgzNCwgMHg3NCwweDk5LCAKKzB4RkYsMHhGOCwgMHhGMywweDAyLCAweDAwLDB4RkYsIDB4QzcsMHgzOCwgMHgzNCwweDAwLCAweEM3LDB4MjQsIDB4NzAsMHgwMCwgMHg5NywweDE2LCAKKzB4RkYsMHgzNCwgMHgyNCwweDk0LCAweDAwLDB4Q0EsIDB4ODQsMHhBNiwgMHgwMCwweDAwLCAweDc3LDB4QTUsIDB4MDAsMHgxRSwgMHg3NywweEJDLCAKKzB4RkYsMHhFNSwgMHhDNCwweEE0LCAweDdGLDB4QzAsIDB4NzQsMHhBNSwgMHhGRiwweEYwLCAweDgzLDB4MTYsIDB4RkYsMHgzQywgMHhGNCwweEFGLCAKKzB4MjgsMHgwMCwgMHhGNCwweDg0LCAweDRGLDB4NTgsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweEM1LDB4MjgsIDB4NEEsMHgwMCwgMHg3NSwweDI4LCAKKzB4RkYsMHhGQSwgMHg4MywweDE2LCAweEZGLDB4NkMsIDB4NDUsMHgyOSwgMHgwMCwweDAwLCAweEY0LDB4ODIsIDB4MDAsMHhGRiwgMHhDNSwweDI4LCAKKzB4NEMsMHgwMCwgMHg4NCwweDk2LCAweEZGLDB4M0MsIDB4QzcsMHgzOCwgMHgzNywweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhGMywweDAyLCAKKzB4RkYsMHgwMCwgMHhDNywweDM4LCAweDM0LDB4MDAsIDB4QzUsMHgyOCwgMHg3MCwweDAwLCAweEY1LDB4MjcsIDB4MjgsMHgwMCwgMHg4NywweDI2LCAKKzB4MDAsMHgwMCwgMHg4MywweDE2LCAweEZGLDB4NjQsIDB4ODQsMHgxNiwgMHhGRiwweDdDLCAweEM3LDB4MzgsIDB4MzcsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHhGNCwweDgyLCAweDAwLDB4RkYsIDB4QzcsMHgzOCwgMHg0QywweDAwLCAweDgzLDB4MTYsIDB4RkYsMHgzQywgMHhDMywweDlDLCAKKzB4NzAsMHgwMCwgMHhFMCwweDAwLCAweEJFLDB4RTQsIDB4RjMsMHg5QiwgMHgyOCwweDAwLCAweEY3LDB4MDQsIDB4NDAsMHg3QywgMHhGNiwweDA0LCAKKzB4NDAsMHg3NCwgMHhDNywweDM4LCAweDcwLDB4MDAsIDB4QzcsMHgzMCwgMHg3MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgyNiwgMHg4NiwweEJBLCAKKzB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NywweEI0LCAKKzB4MDAsMHgwOCwgMHg3MCwweDNFLCAweEZGLDB4RTgsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweEQ3LDB4MDAsIDB4MEEsMHg3MCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEJBLDB4N0QsIDB4MjUsMHg4MCwgMHgwMCwweDA3LCAweEUwLDB4MDAsIDB4QkUsMHhFNCwgMHgwNCwweDIwLCAKKzB4MDAsMHg0MCwgMHhFMCwweDAwLCAweEJBLDB4RDgsIDB4QzQsMHgyQywgMHgwMCwweDAwLCAweEM3LDB4MzAsIDB4NDIsMHgwMCwgMHg4NCwweDk2LCAKKzB4MDAsMHgwMCwgMHg3NSwweDM4LCAweEZGLDB4RkEsIDB4MDYsMHgyNCwgMHgwMCwweDBBLCAweDIwLDB4MkUsIDB4MDAsMHgwNywgMHhFRSwweDAwLCAKKzB4QkEsMHhENCwgMHgwNywweDMwLCAweDAwLDB4MEUsIDB4ODYsMHhCQSwgMHgwMCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweEY3LDB4MDIsIDB4MDAsMHhGRiwgMHhDNiwweEI0LCAKKzB4NzQsMHgwMCwgMHg0NywweDI5LCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEJBLDB4NzQsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweEUwLDB4MDAsIDB4QkEsMHg4QywgMHgwNSwweEFDLCAKKzB4MDAsMHgwMSwgMHhGNCwweDAyLCAweDAwLDB4MDgsIDB4MDcsMHgyMCwgMHgwMCwweDA3LCAweDIwLDB4M0EsIDB4MDAsMHgwRSwgMHhFMiwweDAwLCAKKzB4QkIsMHhBNCwgMHhDNSwweEEwLCAweDQwLDB4MDAsIDB4ODMsMHgxNiwgMHgwMCwweDAwLCAweEY1LDB4MDQsIDB4NDAsMHg3QywgMHhGNCwweDgyLCAKKzB4MDAsMHhGRiwgMHhGNiwweDA0LCAweDRGLDB4NTgsIDB4QzUsMHg5OCwgMHg1OCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgyNiwgMHg4NiwweEFFLCAKKzB4MDAsMHgwMCwgMHg3NywweDJELCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4MTgsIDB4NjIsMHgwMCwgMHg3NiwweDMwLCAKKzB4RkYsMHhGQSwgMHg0NiwweDMxLCAweDAwLDB4MDAsIDB4QzYsMHgzMCwgMHg0QywweDAwLCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAKKzB4RkYsMHhGMCwgMHg3NywweDI5LCAweDAwLDB4MTAsIDB4NzcsMHgzOSwgMHhGRiwweEY4LCAweEM2LDB4QjQsIDB4NEMsMHgwMCwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4RjUsMHg4NCwgMHg0MCwweDc0LCAweEM1LDB4MjgsIDB4NTAsMHgwMCwgMHhDNSwweEFDLCAKKzB4NTAsMHgwMCwgMHgwNSwweEFDLCAweDAwLDB4MjYsIDB4ODYsMHhBRSwgMHgwMCwweDAwLCAweDc3LDB4MkQsIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHg3NSwweDJELCAweDAwLDB4MUUsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAKKzB4RkYsMHhGMCwgMHhGNywweDAyLCAweEZGLDB4MDAsIDB4QzYsMHhCNCwgMHg3NCwweDAwLCAweEM2LDB4MzAsIDB4NjgsMHgwMCwgMHhGNiwweDJGLCAKKzB4MjgsMHgwMCwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBMSwgMHgwMCwweDEwLCAweDc2LDB4QjUsIDB4RkYsMHhGOCwgMHhDNywweDM4LCAKKzB4NTcsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4QzcsMHgzOCwgMHg0QywweDAwLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHhFMCwweDAwLCAKKzB4QkIsMHhGOCwgMHhGNiwweEFGLCAweDI4LDB4MDAsIDB4RjQsMHgwNCwgMHg0RiwweDU4LCAweEUwLDB4MDAsIDB4QkUsMHhFNCwgMHgwNCwweDIwLCAKKzB4MDAsMHg0MCwgMHhGNiwweDA0LCAweDRGLDB4NTgsIDB4ODMsMHgxNiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4NDAsMHg3QywgMHhGNSwweDg0LCAKKzB4NDAsMHg3NCwgMHhDNiwweDE4LCAweDYyLDB4MDAsIDB4NzYsMHgzMCwgMHhGRiwweEZBLCAweEM3LDB4MzgsIDB4NzAsMHgwMCwgMHhDNSwweEFDLCAKKzB4NzAsMHgwMCwgMHgwNSwweEFDLCAweDAwLDB4MjYsIDB4ODYsMHhBRSwgMHgwMCwweDAwLCAweDc3LDB4MkQsIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHg0NiwweDMxLCAweDAwLDB4MDAsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhGNywweDAyLCAKKzB4MDAsMHhGRiwgMHhDNiwweDMwLCAweDc0LDB4MDAsIDB4RjcsMHgwMiwgMHhGRiwweDAwLCAweEM2LDB4QjQsIDB4NzQsMHgwMCwgMHhDNiwweDMwLCAKKzB4NjgsMHgwMCwgMHhGNiwweDJGLCAweDI4LDB4MDAsIDB4MjMsMHg4MCwgMHgwMCwweDA3LCAweDIwLDB4MUUsIDB4MDAsMHgwNywgMHhFRSwweDAwLCAKKzB4QkUsMHhFMCwgMHhDNywweDFDLCAweDM4LDB4MDAsIDB4ODQsMHg5NiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDI0LCAKKzB4NzAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MjYsIDB4ODYsMHhCQSwgMHgwMCwweDAwLCAweEY1LDB4ODQsIDB4NEYsMHg1OCwgMHg3NywweDM5LCAKKzB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhGNywweDAyLCAKKzB4MDAsMHhGRiwgMHhDNiwweEI2LCAweDc0LDB4MDAsIDB4RTYsMHgwMCwgMHhCQywweDc5LCAweDIwLDB4MzYsIDB4MDAsMHgwMSwgMHhFNiwweDAwLCAKKzB4QkMsMHg3OSwgMHg3NywweDM1LCAweDAwLDB4MDYsIDB4QTYsMHhCQSwgMHg1OCwweDAyLCAweEM3LDB4MzgsIDB4NTgsMHgwMCwgMHg3NiwweDM5LCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg2NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMiwgMHhFNiwweDAwLCAweEJDLDB4N0QsIDB4QzYsMHhCOCwgMHgwMCwweDAwLCAweEM3LDB4MkMsIDB4MDAsMHgwMCwgMHhFMCwweDAwLCAKKzB4QkMsMHg3QywgMHhDNiwweEI4LCAweDAwLDB4MDAsIDB4RjYsMHg4NCwgMHg0RiwweDU4LCAweEY3LDB4MDQsIDB4NEYsMHg1OCwgMHhDNSwweDM0LCAKKzB4MDAsMHgwMCwgMHhDMCwweDJBLCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhCRSwweEQ5LCAweDA2LDB4QTgsIDB4MDAsMHgxQywgMHg4MywweDE2LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHhGNCwweDg2LCAKKzB4M0IsMHhCNCwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4OTMsMHg5NiwgMHhGRiwweDRDLCAweDk1LDB4MTYsIDB4RkYsMHg0NCwgMHg5NiwweDk2LCAKKzB4RkYsMHg0MCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyMywweDQwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDA0LCAKKzB4NEYsMHg1QywgMHhGNCwweDgyLCAweDAwLDB4MDAsIDB4OTQsMHg5NiwgMHhGRiwweDVDLCAweDg2LDB4OTYsIDB4RkYsMHg0MCwgMHg4MywweDk2LCAKKzB4RkYsMHg0QywgMHg4NSwweDE2LCAweEZGLDB4NDQsIDB4OTMsMHgxNiwgMHhGRiwweDM0LCAweDg2LDB4MUEsIDB4MDAsMHgwOCwgMHg5NiwweDk2LCAKKzB4RkYsMHgzQywgMHg4NywweDFBLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzIsIDB4NzIsMHgwMCwgMHhFQywweDAwLCAKKzB4QkQsMHhCOCwgMHg5NiwweDE2LCAweEZGLDB4OUMsIDB4NzcsMHgzMSwgMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhDNiwweDM4LCAweDMwLDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDBDLCAweDg2LDB4QjIsIDB4MDAsMHgwMCwgMHg4NywweDJBLCAKKzB4MDAsMHgxQywgMHg4NSwweDk2LCAweEZGLDB4NUMsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4QkQsMHg0MCwgMHhDNCwweDA0LCAKKzB4MDAsMHgwMCwgMHg4NiwweEIyLCAweDAwLDB4MDQsIDB4ODcsMHgyQSwgMHgwMCwweDIwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweEJELDB4NDQsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEJELDB4NTEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHg4MywweDE2LCAKKzB4RkYsMHgzQywgMHg4NiwweEIyLCAweDAwLDB4MDAsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFMiwweDAwLCAweEJELDB4OTAsIDB4RjUsMHg4MiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4QkQsMHg5OCwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4ODYsMHhCMiwgMHgwMCwweDA0LCAweDg3LDB4MUEsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHhCRCwweDk5LCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhGNSwweDgyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhCRCwweEE5LCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhGNCwweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhCRCwweEI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMSwgMHg5NCwweDk2LCAweEZGLDB4NUMsIDB4ODMsMHgxNiwgMHhGRiwweDVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDFBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEJELDB4RjksIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIDB4RkYsMHg5QywgMHg4NCwweDk2LCAKKzB4RkYsMHgzNCwgMHg3NiwweEI5LCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAKKzB4NDgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTQsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhBMCwgMHhFMCwweDAwLCAKKzB4QkUsMHg3MCwgMHg5NiwweDk2LCAweEZGLDB4QTQsIDB4MjcsMHgxNCwgMHgwMCwweDY0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg4MywweDE2LCAKKzB4RkYsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDg0LDB4OTYsIDB4RkYsMHgzNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4OTMsMHg5NiwgMHhGRiwweDRDLCAweDk1LDB4MTYsIDB4RkYsMHg0NCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI1LDB4NjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHg0QywgMHg4NSwweDE2LCAKKzB4RkYsMHg0NCwgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhCRSwweDcxLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHg4NywweDE2LCAKKzB4RkYsMHg5QywgMHg4MywweDE2LCAweEZGLDB4MzQsIDB4NzYsMHhCOSwgMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg3NiwweEI1LCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDMwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDE0LCAweDg2LDB4QjYsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAKKzB4RkYsMHhBMCwgMHg5NiwweDk2LCAweEZGLDB4QTQsIDB4OTcsMHgxQSwgMHgwMCwweDA4LCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEJFLDB4OTksIDB4RjYsMHgwNiwgMHg0MiwweDlDLCAweEY3LDB4MDQsIDB4NDIsMHg5QywgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4RjcsMHgwNCwgMHg0RiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDI4LCAKKzB4NzIsMHgwMCwgMHg3NywweDM4LCAweEZGLDB4RkEsIDB4NDcsMHgzOSwgMHgwMCwweDAwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDI4LCAKKzB4MDAsMHgxQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjQsMHg4NCwgMHg0RiwweDVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweDkzLCAKKzB4RkYsMHhGQywgMHg5MywweDk2LCAweEZGLDB4NEMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjMsMHg0MCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4NEMsIDB4RTAsMHgwMCwgMHhCQiwweEZDLCAweDAzLDB4OUMsIDB4MDAsMHgwMSwgMHg4NCwweDE2LCAKKzB4MDAsMHgwMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwNCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAKKzB4MDAsMHg2MCwgMHg4NSwweDE2LCAweDAwLDB4MDAsIDB4ODYsMHgxNiwgMHgwMCwweDA0LCAweDA2LDB4QTgsIDB4MDAsMHgxOCwgMHhDNywweDMwLCAKKzB4NjAsMHgwMCwgMHhDNSwweEI4LCAweDY4LDB4MDAsIDB4MjAsMHgzMiwgMHgwMCwweDA3LCAweEVFLDB4MDAsIDB4QkYsMHg2NCwgMHgwNywweDJDLCAKKzB4MDAsMHgwRSwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4RjcsMHgwMiwgMHgwMCwweEZGLCAweEM2LDB4QjQsIDB4NzQsMHgwMCwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4RDcsMHgwMCwgMHgwQSwweDcwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4QkYsMHg2MSwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4RTAsMHgwMCwgMHhCRiwweDE4LCAweDA2LDB4MzAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgwNywgMHhFRSwweDAwLCAweEMwLDB4NEMsIDB4MDYsMHhBOCwgMHgwMCwweDE2LCAweEY1LDB4MDUsIDB4NDAsMHg3NCwgMHhGNiwweDA1LCAKKzB4NDAsMHg3QywgMHhGMywweDAyLCAweDAwLDB4MDYsIDB4RjMsMHgwNSwgMHg0MiwweDU0LCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHgwNSwweDI4LCAKKzB4MDAsMHgwMiwgMHg5NSwweDE2LCAweEZGLDB4QzQsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDIzLDB4OTQsIDB4MDAsMHgyMCwgMHg5MywweDk2LCAKKzB4RkYsMHhCQywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4OTYsMHgxNiwgMHhGRiwweEFDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RDAsMHhEQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODQsMHg5NiwgMHhGRiwweEM0LCAweDIzLDB4MTQsIDB4MDAsMHgzOCwgMHg5NCwweDkzLCAKKzB4RkYsMHhGQywgMHg5MywweDE2LCAweEZGLDB4QjQsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RDIsMHg1OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHgwMiwgMHhGRiwweDM0LCAweDg2LDB4MTYsIDB4RkYsMHhBQywgMHhGNywweDA1LCAKKzB4NDIsMHg2NCwgMHg5NiwweDEzLCAweEZGLDB4RkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHhCNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4ODQsMHg5NiwgMHhGRiwweEJDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhGNywweEM4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEMwLDB4MUQsIDB4RjMsMHgwNiwgMHgzQSwweEQ4LCAweEY3LDB4MDQsIDB4NDIsMHg1NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg0MiwweDU0LCAweEYzLDB4MDUsIDB4NDIsMHg0NCwgMHhGMywweDgyLCAKKzB4MTcsMHg3MCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjQsMHg4MiwgMHgwMCwweDFCLCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDA2LCAKKzB4NDIsMHg0NCwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MUUsMHhDMCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhFMCwweDAwLCAweEMxLDB4QTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgwMCwgMHhGNSwweDg0LCAKKzB4NEYsMHg1OCwgMHhGNCwweDA2LCAweDNCLDB4NzAsIDB4NzYsMHhCNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4NzYsMHgzOSwgMHgwMCwweDA2LCAweEE3LDB4MkUsIDB4NjAsMHgwMiwgMHhDNSwweDJDLCAKKzB4NjAsMHgwMCwgMHg3NiwweEE5LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHg3NywweDM5LCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHg0MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgwMiwgMHg4NiwweEJBLCAKKzB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI3LCAKKzB4RkYsMHhGMCwgMHhFRSwweDAwLCAweEMxLDB4MTUsIDB4OTYsMHg5NiwgMHhGRiwweDlDLCAweEE3LDB4MkUsIDB4NjAsMHgwMiwgMHg3NiwweEE5LCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4ODMsMHg5NiwgMHhGRiwweDlDLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHg3NywweDM5LCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHg0MCwweDAwLCAweDg2LDB4QkEsIDB4MDAsMHgwNCwgMHgyNCwweDk0LCAKKzB4MDAsMHg2MCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAKKzB4RkYsMHhGMCwgMHhBNiwweEFBLCAweDY4LDB4MDIsIDB4NzcsMHgxRCwgMHgwMCwweDAzLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHgyNywweDM4LCAKKzB4MDAsMHgwOCwgMHg4MywweEJBLCAweDAwLDB4MDQsIDB4ODMsMHgzQSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweEE2LCAKKzB4MDAsMHgwNCwgMHg5MywweDI2LCAweDAwLDB4MDAsIDB4ODUsMHg5NiwgMHhGRiwweEE0LCAweEUwLDB4MDAsIDB4QzEsMHgzOCwgMHgyMywweDAwLCAKKzB4MDAsMHgwNywgMHhBNywweDJFLCAweDYwLDB4MDIsIDB4NzYsMHhBOSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4NzcsMHgzOSwgMHgwMCwweDAzLCAweEM3LDB4MzgsIDB4NDAsMHgwMCwgMHg4NSwweEJBLCAKKzB4MDAsMHgwNCwgMHgyMywweDAwLCAweDAwLDB4MDcsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDg3LDB4MkEsIDB4MDAsMHgwMCwgMHg3NiwweEE5LCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4ODMsMHg5NiwgMHhGRiwweDlDLCAweEY2LDB4MDYsIDB4M0IsMHg3MCwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4NzcsMHgzOSwgMHgwMCwweDAzLCAweEE2LDB4QkEsIDB4NjAsMHgwMiwgMHgyMCwweDFFLCAKKzB4MDAsMHgwMCwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHhFRSwweDAwLCAweEMxLDB4OEQsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweDg0LDB4OTYsIDB4RkYsMHhBMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NywweDI1LCAweEZGLDB4RjAsIDB4QzYsMHhCOCwgMHg2OCwweDAwLCAweEM3LDB4MjgsIDB4NjgsMHgwMCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4QzEsMHgyQywgMHgwMCwweDAwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA4LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHg3MCwgMHgyNSwweDAwLCAKKzB4MDAsMHgwNywgMHgyMCwweDJBLCAweDAwLDB4MDcsIDB4RUUsMHgwMCwgMHhDMywweEI4LCAweEM3LDB4MjgsIDB4NTAsMHgwMCwgMHg4MywweDE2LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgxOCwgMHg3MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgyNiwgMHg4NiwweEJBLCAKKzB4MDAsMHgwMCwgMHhGNSwweDg0LCAweDRGLDB4NTgsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4RjcsMHgwMiwgMHgwMCwweEZGLCAweEM2LDB4QjYsIDB4NzQsMHgwMCwgMHhFNiwweDAwLCAKKzB4QzIsMHgzRCwgMHgyMCwweDM2LCAweDAwLDB4MDEsIDB4RTYsMHgwMCwgMHhDMiwweDNELCAweDc3LDB4MzUsIDB4MDAsMHgwNiwgMHhBNiwweEJBLCAKKzB4NTgsMHgwMiwgMHhDNywweDM4LCAweDU4LDB4MDAsIDB4NzYsMHgzOSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAKKzB4NjcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4MjAsMHgzNiwgMHgwMCwweDAyLCAweEU2LDB4MDAsIDB4QzIsMHg0RCwgMHhDMCwweDNBLCAKKzB4NUEsMHgwMCwgMHhFMCwweDAwLCAweEMyLDB4NDgsIDB4QzcsMHgyQywgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4NEYsMHg1OCwgMHhGNSwweDg0LCAKKzB4NEYsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg1QSwweDAwLCAweEU2LDB4MDAsIDB4QzMsMHhCMSwgMHhGNCwweDg2LCAKKzB4M0IsMHg5MCwgMHg4MywweDk2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4OUMsIDB4MDAsMHgxNiwgMHg4NywweDM2LCAKKzB4MDAsMHgwMCwgMHg3NiwweEI1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHg3NiwweDM5LCAweDAwLDB4MDYsIDB4QTcsMHgyRSwgMHg2MCwweDAyLCAweEM1LDB4MkMsIDB4NjAsMHgwMCwgMHg3NiwweEE5LCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMywgMHhDNywweDM4LCAweDQ4LDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDAyLCAweDg2LDB4QkEsIDB4MDAsMHgwMCwgMHg3NywweDM5LCAKKzB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjcsIDB4RkYsMHhGMCwgMHhFRSwweDAwLCAKKzB4QzMsMHgyMSwgMHg5NiwweDk2LCAweEZGLDB4OEMsIDB4QTcsMHgyRSwgMHg2MCwweDAyLCAweDc2LDB4QTksIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHg4MywweDE2LCAweEZGLDB4OEMsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMywgMHhDNywweDM4LCAweDQ4LDB4MDAsIDB4ODYsMHhCQSwgMHgwMCwweDA0LCAweDI0LDB4OTQsIDB4MDAsMHg3MCwgMHg3NywweDM5LCAKKzB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhBNiwweEFBLCAKKzB4NjgsMHgwMiwgMHg3NywweDE5LCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDI3LDB4MzgsIDB4MDAsMHgwOCwgMHg4MywweEJBLCAKKzB4MDAsMHgwNCwgMHg4MywweDNBLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4QTYsIDB4MDAsMHgwNCwgMHg5MywweDI2LCAKKzB4MDAsMHgwMCwgMHg4NiwweDE2LCAweEZGLDB4OTQsIDB4RTAsMHgwMCwgMHhDMywweDQ0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhBNywweDJFLCAKKzB4NjAsMHgwMiwgMHg3NiwweEE5LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEYzLDB4MDYsIDB4M0IsMHg5MCwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4NzcsMHgzOSwgMHgwMCwweDAzLCAweEM3LDB4MzgsIDB4MzAsMHgwMCwgMHg4NiwweDNBLCAKKzB4MDAsMHgwNCwgMHg4NywweDJBLCAweDAwLDB4MDAsIDB4NzYsMHhBOSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHg4MywweDk2LCAKKzB4RkYsMHg4QywgMHhGNCwweDg2LCAweDNCLDB4OTAsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMywgMHhBNiwweEJBLCAweDQ4LDB4MDIsIDB4MjAsMHgxRSwgMHgwMCwweDAwLCAweEM3LDB4MzgsIDB4NDgsMHgwMCwgMHg3NywweDM5LCAKKzB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweEVFLDB4MDAsIDB4QzMsMHg5NSwgMHg3NiwweEI1LCAKKzB4RkYsMHhGMCwgMHg4MywweDE2LCAweEZGLDB4OTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4MTksIDB4RkYsMHhGMCwgMHhDNiwweEI4LCAKKzB4NjgsMHgwMCwgMHhDNywweDI4LCAweDY4LDB4MDAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhDMSwweDMwLCAKKzB4MDAsMHgwMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHhDNSwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhFMCwweDAwLCAKKzB4QzEsMHhDNCwgMHgwNSwweDI4LCAweDAwLDB4MDEsIDB4ODMsMHg5NiwgMHgwMCwweDAwLCAweEY0LDB4ODIsIDB4MDAsMHgwNiwgMHhGNCwweDg1LCAKKzB4NDIsMHg1NCwgMHhGNiwweDA0LCAweDQyLDB4NjAsIDB4MjUsMHgxNCwgMHgwMCwweDFFLCAweDIzLDB4MTQsIDB4MDAsMHgyMCwgMHg5MywweDE2LCAKKzB4RkYsMHhBQywgMHhGMywweDg1LCAweDQwLDB4NzgsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDc1LDB4QjEsIDB4MDAsMHgxRSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxQiwgMHgyOCwweDAwLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NSwweEFDLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHgyNSwweDE0LCAKKzB4MDAsMHgxQywgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHgyNSwweDE0LCAKKzB4MDAsMHgxQSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHgyNSwweDE0LCAKKzB4MDAsMHgxOCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHgyNSwweDE0LCAKKzB4MDAsMHgxNiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHgyNSwweDE0LCAKKzB4MDAsMHgxNCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHgyNSwweDE0LCAKKzB4MDAsMHgxMiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDEwLCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHgwNywweDFDLCAKKzB4MDAsMHgwMiwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MjMsMHg5NCwgMHgwMCwweDUwLCAweDkzLDB4OTYsIDB4RkYsMHhBNCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhEMiwweDU4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NCwweDk2LCAKKzB4RkYsMHhBNCwgMHgyMywweDE0LCAweDAwLDB4MzgsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDI3LDB4ODAsIDB4MDAsMHgwNywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg5MywweDE2LCAweEZGLDB4OUMsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4Q0YsMHgyNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHgwMiwgMHhGRiwweDM0LCAweDI3LDB4ODAsIDB4MDAsMHgwNywgMHhGNywweDg1LCAKKzB4NDIsMHg1OCwgMHhGNywweDA1LCAweDQyLDB4NjQsIDB4MjcsMHg4MCwgMHgwMCwweDA3LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4OUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg4NCwweDk2LCAKKzB4RkYsMHhBQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RjUsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QzUsMHg5NSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDQyLDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4NDIsMHg1OCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjMsMHgwNiwgMHgzOSwweEMwLCAweEYzLDB4MDUsIDB4NDIsMHg0NCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDgyLCAKKzB4MDAsMHgxQywgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHhDNSwweEM0LCAweEIzLDB4QkEsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwNCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyNSwweDAwLCAKKzB4MDAsMHgwNywgMHhGNywweDA0LCAweDQwLDB4NzQsIDB4RjYsMHg4NCwgMHg0RiwweDU4LCAweEY2LDB4MDQsIDB4NDIsMHg2MCwgMHhDNywweDM4LCAKKzB4NkEsMHgwMCwgMHg3NSwweEI4LCAweEZGLDB4RkEsIDB4MDYsMHgzMCwgMHgwMCwweDBBLCAweDIwLDB4MkEsIDB4MDAsMHgwNywgMHhFRSwweDAwLCAKKzB4QzYsMHg0OCwgMHgwNywweDMwLCAweDAwLDB4MEUsIDB4ODYsMHhCQSwgMHgwMCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweEY3LDB4MDIsIDB4MDAsMHhGRiwgMHhDNiwweEI0LCAKKzB4NzQsMHgwMCwgMHg0NywweDJELCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEM2LDB4NEMsIDB4QzMsMHgyOCwgMHgwMCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHhFMCwweDAwLCAKKzB4QzUsMHhGQywgMHgwNSwweDI4LCAweDAwLDB4MDEsIDB4RjMsMHgwMiwgMHgwMCwweDA4LCAweEM1LDB4MTgsIDB4MzAsMHgwMCwgMHhGMywweDg0LCAKKzB4NDIsMHg2MCwgMHhGNiwweDA0LCAweDRGLDB4NTgsIDB4RjcsMHgwNCwgMHg0MCwweDdDLCAweEY0LDB4ODQsIDB4NDAsMHg3NCwgMHhDNSwweDFDLCAKKzB4NTAsMHgwMCwgMHgwNSwweDI4LCAweDAwLDB4MjYsIDB4ODUsMHhBQSwgMHgwMCwweDAwLCAweDc0LDB4MjksIDB4MDAsMHgxRSwgMHg3NCwweDIwLCAKKzB4RkYsMHhFNSwgMHhDNiwweDFDLCAweDYyLDB4MDAsIDB4NzYsMHgzMCwgMHhGRiwweEZBLCAweEM2LDB4QjgsIDB4NzAsMHgwMCwgMHhDNCwweEE0LCAKKzB4NjgsMHgwMCwgMHgwNCwweEE0LCAweDAwLDB4MjYsIDB4NzYsMHhBNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHg3NywweDM5LCAKKzB4MDAsMHgxMCwgMHg3NywweDM5LCAweEZGLDB4RjgsIDB4NDYsMHgzMSwgMHgwMCwweDAwLCAweEM1LDB4QUMsIDB4NDcsMHhDMCwgMHg3NSwweEFELCAKKzB4RkYsMHhGMCwgMHhGNCwweDAyLCAweDAwLDB4RkYsIDB4QzUsMHhBQywgMHg0NCwweDAwLCAweEM3LDB4MzgsIDB4NTgsMHgwMCwgMHhGNywweDJCLCAKKzB4MjgsMHgwMCwgMHg4NywweDI2LCAweDAwLDB4MDAsIDB4NzUsMHhBNSwgMHgwMCwweDFFLCAweEM2LDB4MzAsIDB4NDQsMHgwMCwgMHg3NSwweEFDLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweEY2LDB4ODIsIDB4RkYsMHgwMCwgMHhDNywweDM4LCAKKzB4NkMsMHgwMCwgMHhDNiwweDMwLCAweDcwLDB4MDAsIDB4RjYsMHgyNywgMHgyOCwweDAwLCAweDg3LDB4MjYsIDB4MDAsMHgwMCwgMHg3NiwweDk5LCAKKzB4MDAsMHgxMCwgMHg3NiwweEI1LCAweEZGLDB4RjgsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhDNywweDM4LCAKKzB4NDQsMHgwMCwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4RjYsMHhBNywgMHgyOCwweDAwLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDg0LCAKKzB4M0IsMHhCMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RDQsMHgyQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNCwgMHg0MCwweDdDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjMsMHg4NCwgMHg0MCwweDc0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhCRSwweEY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDgsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwNCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA2LCAKKzB4NDIsMHgzMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzNSwweDYwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NDIsMHgzMCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDM1LDB4RUMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg0MiwweDQ0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4MzYsMHg3OCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDQyLDB4NDQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzcsMHgwNCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4NDIsMHg0NCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzNywweDkwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NDIsMHg0NCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDM4LDB4MUMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg0MiwweDQ0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4MzgsMHhBOCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDQyLDB4NDQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzksMHgzNCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4NDIsMHg0NCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzOSwweEMwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NDIsMHg0NCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDNBLDB4NEMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg0MiwweDQ0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4M0EsMHhEOCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NSwweDk2LCAKKzB4MDAsMHgwMCwgMHhGNSwweDA2LCAweDNCLDB4OTAsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDc3LDB4MzksIDB4MDAsMHgwMywgMHhDNywweDM4LCAKKzB4NTAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MDIsIDB4ODYsMHhCQSwgMHgwMCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHgzNywgMHhGRiwweEYwLCAweEVFLDB4MDAsIDB4QzksMHg5NSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4NzcsMHgzOSwgMHgwMCwweDAzLCAweEM3LDB4MzgsIDB4NTAsMHgwMCwgMHg4NiwweEJBLCAKKzB4MDAsMHgwNCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAKKzB4RkYsMHhGMCwgMHhBNiwweEFFLCAweDY4LDB4MDIsIDB4NzcsMHgzMSwgMHgwMCwweDAzLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHgyNywweDM4LCAKKzB4MDAsMHgwOCwgMHg4NCwweEJBLCAweDAwLDB4MDQsIDB4ODQsMHgzQSwgMHgwMCwweDAwLCAweEUwLDB4MDAsIDB4QzksMHhCNCwgMHhDNSwweDI0LCAKKzB4MDAsMHgwMCwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4NzcsMHgzOSwgMHgwMCwweDAzLCAweEM3LDB4MzgsIDB4NTAsMHgwMCwgMHg4NSwweDNBLCAKKzB4MDAsMHgwNCwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDA2LCAweDNCLDB4OTAsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMywgMHhBNiwweEJBLCAweDYwLDB4MDIsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4RUUsMHgwMCwgMHhDOSwweEY5LCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHg3NywweDIxLCAKKzB4RkYsMHhGMCwgMHhDNiwweEI4LCAweDY4LDB4MDAsIDB4QzcsMHgyQywgMHg2OCwweDAwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhDMSwweDI4LCAweDAwLDB4MDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDQsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODUsMHg5NiwgMHgwMCwweDAwLCAweEY1LDB4MDYsIDB4M0IsMHg3MCwgMHg4NywweDJFLCAKKzB4MDAsMHgwMCwgMHg3NiwweEFELCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHg3NywweDM5LCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHg1MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgwMiwgMHg4NiwweEJBLCAKKzB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweDM3LCAKKzB4RkYsMHhGMCwgMHhFRSwweDAwLCAweENBLDB4QkQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMywgMHhDNywweDM4LCAweDUwLDB4MDAsIDB4ODYsMHhCQSwgMHgwMCwweDA0LCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweEE2LDB4QUUsIDB4NjgsMHgwMiwgMHg3NywweDMxLCAKKzB4MDAsMHgwMywgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4MjcsMHgzOCwgMHgwMCwweDA4LCAweDg0LDB4QkEsIDB4MDAsMHgwNCwgMHg4NCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFMCwweDAwLCAweENBLDB4REMsIDB4QzUsMHgyNCwgMHgwMCwweDAwLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMywgMHhDNywweDM4LCAweDUwLDB4MDAsIDB4ODUsMHgzQSwgMHgwMCwweDA0LCAweDgzLDB4OTYsIDB4MDAsMHgwNCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDJFLCAKKzB4MDAsMHgwMCwgMHhGNiwweDA2LCAweDNCLDB4NzAsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMywgMHhBNiwweEJBLCAweDYwLDB4MDIsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4RUUsMHgwMCwgMHhDQiwweDI5LCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHg3NywweDIxLCAKKzB4RkYsMHhGMCwgMHhDNiwweEI4LCAweDY4LDB4MDAsIDB4QzcsMHgyQywgMHg2OCwweDAwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhDMSwweDI4LCAweDAwLDB4MDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDgsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjUsMHgwNCwgMHg0RiwweDU4LCAweEY1LDB4ODIsIDB4MDAsMHgwMiwgMHgwNiwweDI4LCAKKzB4MDAsMHg4MCwgMHgyMCwweDJFLCAweDAwLDB4NjIsIDB4RUUsMHgwMCwgMHhDQiwweDkwLCAweDA3LDB4MzAsIDB4MDAsMHg0MCwgMHhGMCwweDMzLCAKKzB4MjgsMHgwMCwgMHhDNiwweEI4LCAweDUyLDB4MDAsIDB4NzYsMHhCNCwgMHhGRiwweEZBLCAweDA2LDB4MzAsIDB4MDAsMHgxNCwgMHhGNiwweEIzLCAKKzB4MjgsMHgwMCwgMHhDNiwweDM4LCAweDAwLDB4MDAsIDB4RTAsMHgwMCwgMHhDQiwweDY0LCAweDA1LDB4QUMsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NEYsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHhCOCwgMHgxOCwweEQ0LCAweEY0LDB4ODIsIDB4MDAsMHgwMSwgMHhGNCwweEI3LCAKKzB4MjgsMHgwMCwgMHgwNywweDM4LCAweDE4LDB4QzAsIDB4RjAsMHgzQiwgMHgyOCwweDAwLCAweEY3LDB4MDYsIDB4NDIsMHhDMCwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMiwgMHhGNCwweEJCLCAweDI4LDB4MDAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHhGNiwweDg0LCAweDQyLDB4QzAsIDB4RjYsMHgwNiwgMHg0MiwweEMwLCAweDc3LDB4MzEsIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHg3NSwweEIxLCAweDAwLDB4MUUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjQsIDB4RkYsMHhGMCwgMHhGNywweDA0LCAKKzB4NEYsMHg1OCwgMHg3NiwweEI1LCAweDAwLDB4MDYsIDB4QzQsMHgzOCwgMHg2OCwweDAwLCAweDg3LDB4MjIsIDB4MDAsMHgxNCwgMHg3NiwweEExLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHhGNywweDA0LCAweDQyLDB4QzAsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHgyMCwweDNBLCAweDAwLDB4MDEsIDB4RTYsMHgwMCwgMHhDQywweDRDLCAweEY2LDB4MDYsIDB4NDIsMHg5MCwgMHhGNywweDA0LCAKKzB4NDIsMHg5MCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDA0LCAweDg1LDB4MTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4OTUsMHgxNiwgMHhGRiwweEY0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4Q0QsMHgwMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHhGRiwweEY0LCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4Q0MsMHhCQywgMHhGNSwweDg2LCAweDQyLDB4QzAsIDB4RjcsMHgwNCwgMHg0MiwweDkwLCAweEY2LDB4MDYsIDB4NDIsMHg5MiwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweENDLDB4RUMsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweEYwLDB4MkIsIDB4MjgsMHgwMCwgMHhGNiwweDg0LCAKKzB4NDIsMHhDMCwgMHg3NywweDJELCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweDA2LDB4MjgsIDB4MDAsMHgxNCwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHg3NiwweEI0LCAweEZGLDB4RjAsIDB4RjcsMHgwNCwgMHg0RiwweDU4LCAweEY2LDB4QjMsIDB4MjgsMHgwMCwgMHhDNywweDI4LCAKKzB4NzIsMHgwMCwgMHg3NywweDM4LCAweEZGLDB4RkEsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDQsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODYsMHg5NiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4NEYsMHg1OCwgMHhGNCwweDAyLCAKKzB4MDAsMHgwMCwgMHhDNiwweEI0LCAweDcyLDB4MDAsIDB4NzcsMHgzNCwgMHhGRiwweEZBLCAweDI3LDB4MzgsIDB4MDAsMHgwMiwgMHgyMCwweDNBLCAKKzB4MDAsMHg2MSwgMHhGNywweDAyLCAweDAwLDB4M0YsIDB4RTIsMHgwMCwgMHhDRCwweDQwLCAweEM2LDB4QjQsIDB4NzQsMHgwMCwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweENELDB4NDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY0LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg2LDB4MTYsIDB4MDAsMHgwMCwgMHg4NywweDE2LCAKKzB4MDAsMHgwOCwgMHg4NSwweDk2LCAweDAwLDB4MDQsIDB4QzUsMHgzMCwgMHg3MCwweDAwLCAweEMwLDB4MzIsIDB4NTIsMHgwMCwgMHhFNiwweDAwLCAKKzB4Q0QsMHhBMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHhCMiwgMHgwMCwweDAwLCAweDc3LDB4MzEsIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEU4LCAweEY2LDB4QUYsIDB4NjgsMHgwMCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDMyLCAweDUyLDB4MDAsIDB4RTYsMHgwMCwgMHhDRCwweDc4LCAweDA1LDB4QUMsIDB4MDAsMHgwMSwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDBDLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NCwweDk2LCAKKzB4MDAsMHgwMCwgMHg4NCwweDE2LCAweDAwLDB4MDQsIDB4ODUsMHg5NiwgMHgwMCwweDA4LCAweDg2LDB4QTYsIDB4MDAsMHgwMCwgMHg3NywweDI1LCAKKzB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc1LDB4MzUsIDB4RkYsMHhGMCwgMHgyMCwweDJBLCAKKzB4MDAsMHgxMCwgMHhFMiwweDAwLCAweENFLDB4MEQsIDB4RjYsMHgwNiwgMHg0MiwweDhFLCAweEY1LDB4MDIsIDB4MDAsMHgxMCwgMHhGNywweDA0LCAKKzB4NDIsMHg4QywgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDIwLDB4MkUsIDB4MDAsMHgwMSwgMHhFNiwweDAwLCAKKzB4Q0UsMHg3MCwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RUUsMHgwMCwgMHhDRSwweDcxLCAweDA3LDB4MjQsIDB4MDAsMHgwMiwgMHgyNSwweDI4LCAKKzB4MDAsMHgwMSwgMHhBNSwweEJBLCAweDUwLDB4MDIsIDB4ODYsMHgyMiwgMHgwMCwweDAwLCAweDc2LDB4QTEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDUwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNSwweEFDLCAKKzB4NzcsMHhDMCwgMHhDNiwweDMwLCAweDZGLDB4QzAsIDB4NzYsMHgzMSwgMHhGRiwweEYwLCAweDc1LDB4QUQsIDB4RkYsMHhFOCwgMHhGNiwweDgyLCAKKzB4MDAsMHhGRiwgMHhGNywweDAyLCAweEYxLDB4NTQsIDB4NzUsMHhBRCwgMHgwMCwweDAyLCAweEE3LDB4MkUsIDB4NzAsMHgwMiwgMHhDNiwweDMwLCAKKzB4NkMsMHgwMCwgMHhDNiwweDMwLCAweDc1LDB4ODAsIDB4RjYsMHgyMywgMHgyOCwweDAwLCAweDI0LDB4MjAsIDB4MDAsMHgwMiwgMHgyNSwweEE4LCAKKzB4MDAsMHgwMSwgMHhGMywweDAyLCAweEYyLDB4NDYsIDB4MDMsMHhBNCwgMHgwMCwweDAyLCAweEM0LDB4QUMsIDB4MzgsMHgwMCwgMHgyNSwweDJDLCAKKzB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RUMsMHgwMCwgMHhDRiwweDExLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhFNiwweDAwLCAKKzB4Q0UsMHhBMCwgMHhDNywweDFDLCAweDUwLDB4MDAsIDB4RTAsMHgwMCwgMHhDRSwweEI0LCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHhBNiwweDlFLCAKKzB4NTAsMHgwMiwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweDM1LCAKKzB4RkYsMHhFOCwgMHg4NiwweEE2LCAweDAwLDB4MDAsIDB4NzcsMHgyNSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHgyNSwweDI4LCAKKzB4MDAsMHgwMiwgMHgyNSwweEFDLCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhFOCwgMHg3NywweDMxLCAKKzB4MDAsMHgwNCwgMHhDNywweDM4LCAweDYyLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4MzAsMHgwMCwgMHhDNiwweEI0LCAKKzB4NjgsMHgwMCwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDBFLCAweDg3LDB4MzYsIDB4MDAsMHgwMCwgMHgyNCwweEE0LCAKKzB4MDAsMHgwMiwgMHg3NiwweEI1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDIzLCAweDI4LDB4MDAsIDB4RTAsMHgwMCwgMHhDRSwweDg0LCAweDI0LDB4MjAsIDB4MDAsMHgwMiwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDBDLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg2LDB4MTYsIDB4MDAsMHgwOCwgMHg4MywweDE2LCAKKzB4MDAsMHgwNCwgMHg4MywweDk2LCAweDAwLDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHgwNSwweDlDLCAweDAwLDB4MDIsIDB4NzQsMHg5RCwgMHgwMCwweDFFLCAweDc0LDB4QTQsIDB4RkYsMHhFNSwgMHg3NCwweDFELCAKKzB4MDAsMHgxRSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4NzUsMHgzMSwgMHgwMCwweDFFLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDFGLCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc1LDB4MjgsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4NzYsMHgzMSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDg3LDB4MUUsIDB4MDAsMHgwMCwgMHg3NCwweDIwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDRGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDFGLCAKKzB4MjgsMHgwMCwgMHg4NywweDFFLCAweDAwLDB4MDAsIDB4MDQsMHg5QywgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NDcsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHgyNSwweDM4LCAweDAwLDB4MDEsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEVFLDB4MDAsIDB4RDAsMHhCRCwgMHgyNiwweDI4LCAKKzB4MDAsMHgwMSwgMHhBNywweDI2LCAweDYwLDB4MDIsIDB4QzYsMHhBNCwgMHg2MCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNSwweEE0LCAweDUwLDB4MDAsIDB4QzUsMHgzMCwgMHgwMCwweDAwLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhFOCwgMHhFMCwweDAwLCAweEQwLDB4ODgsIDB4RjcsMHgyRiwgMHg2OCwweDAwLCAweDA3LDB4MUMsIDB4MDAsMHgwMiwgMHhGMywweDNCLCAKKzB4NjgsMHgwMCwgMHhDNCwweDFDLCAweDAwLDB4MDAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwQywgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHg4NiwweDE2LCAweDAwLDB4MDQsIDB4ODQsMHgxNiwgMHgwMCwweDAwLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4MDUsMHhBMCwgMHgwMCwweDAyLCAweDc0LDB4QTEsIDB4MDAsMHgxRSwgMHg3NCwweEE0LCAKKzB4RkYsMHhFNSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4NzUsMHgzMSwgMHgwMCwweDFFLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDIzLCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc1LDB4MjgsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4MDYsMHhBMCwgMHgwMCwweDAyLCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkYsIDB4MjgsMHgwMCwgMHg4NywweDIyLCAKKzB4MDAsMHgwMCwgMHg3NiwweDIxLCAweDAwLDB4MUUsIDB4ODUsMHg5NiwgMHgwMCwweDA4LCAweEM3LDB4MzgsIDB4NEYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4RjUsMHhCNywgMHg2OCwweDAwLCAweDg3LDB4MjIsIDB4MDAsMHgwMCwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDIzLCAKKzB4MjgsMHgwMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwQywgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAKKzB4MDAsMHgyMCwgMHgyNywweDE0LCAweDAwLDB4MjAsIDB4RjAsMHgzQiwgMHgyOCwweDAwLCAweDg0LDB4OTYsIDB4MDAsMHgwNCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHg4NiwweEE2LCAweDAwLDB4MDAsIDB4NzYsMHgyNSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHgwNCwweDI0LCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDY3LDB4QzAsIDB4NzYsMHhCNCwgMHhGRiwweEYwLCAweEY2LDB4QkIsIDB4MjgsMHgwMCwgMHg4NywweDI2LCAKKzB4MDAsMHgwMCwgMHg3NiwweEE1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHhDMCwweDJBLCAweDcyLDB4MDAsIDB4RUMsMHgwMCwgMHhEMiwweEY4LCAweDc2LDB4QTUsIDB4MDAsMHgxRSwgMHg4NywweDI2LCAKKzB4MDAsMHgwMCwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4MDYsMHgyOCwgMHgwMCwweDAxLCAweDI1LDB4OTQsIDB4MDAsMHgxRSwgMHhDNSwweEFDLCAKKzB4NTAsMHgwMCwgMHhDNSwweDMwLCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhDNywweDM4LCAKKzB4NTIsMHgwMCwgMHhBNiwweEEyLCAweDcwLDB4MDIsIDB4QzcsMHgyMCwgMHg3MCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEU4LCAweEM2LDB4ODAsIDB4NkEsMHgwMCwgMHhFMCwweDAwLCAKKzB4RDIsMHg5MCwgMHhGNiwweEFGLCAweDY4LDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEUwLCAweDc2LDB4MTUsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHg4MywweDk2LCAweDAwLDB4MDAsIDB4MjMsMHgxNCwgMHgwMCwweDFFLCAweDc1LDB4OTksIDB4MDAsMHgxRSwgMHg3NSwweEFDLCAKKzB4RkYsMHhFNSwgMHg3NSwweDE1LCAweDAwLDB4MUUsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweDc0LDB4OTUsIDB4MDAsMHgxRSwgMHg3NCwweEE0LCAKKzB4RkYsMHhFNSwgMHg3NCwweDE1LCAweDAwLDB4MUUsIDB4NzQsMHgyMCwgMHhGRiwweEU1LCAweDA2LDB4OUMsIDB4MDAsMHgwMiwgMHg3MywweDk1LCAKKzB4MDAsMHgxRSwgMHg5MywweDk2LCAweEZGLDB4REMsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDgzLDB4OTYsIDB4MDAsMHgwMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDFGLCAweDI4LDB4MDAsIDB4ODMsMHg5NiwgMHhGRiwweERDLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHg3MywweDlDLCAKKzB4RkYsMHhFNSwgMHg5MywweDk2LCAweEZGLDB4REMsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEU0LCAweDIzLDB4MTQsIDB4MDAsMHgxQSwgMHg3NiwweDE5LCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg1NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhFOCwgMHgyMywweDE0LCAKKzB4MDAsMHgxNiwgMHg3NiwweDE5LCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NEYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAKKzB4RkYsMHhFQywgMHgyMywweDE0LCAweDAwLDB4MTIsIDB4NzYsMHgxOSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NDcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHg4NCwweDE2LCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4RjAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4M0YsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwOCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHg4NiwweDE2LCAweDAwLDB4MDAsIDB4ODQsMHgxNiwgMHgwMCwweDA0LCAweEY2LDB4ODQsIDB4NEYsMHg1OCwgMHg4NywweDMyLCAKKzB4MDAsMHgxNCwgMHgwMywweDMwLCAweDAwLDB4MTQsIDB4NzUsMHgxOSwgMHgwMCwweDFFLCAweDc1LDB4MjgsIDB4RkYsMHhFNSwgMHhDMywweEEwLCAKKzB4NkEsMHgwMCwgMHg3MywweDlDLCAweEZGLDB4RkEsIDB4MDQsMHhBMCwgMHgwMCwweDE0LCAweDc1LDB4QTUsIDB4MDAsMHgxRSwgMHhDNiwweDMwLCAKKzB4NkEsMHgwMCwgMHg3NiwweDMwLCAweEZGLDB4RkEsIDB4QzcsMHgzOCwgMHg1NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHhGMywweDlCLCAweDI4LDB4MDAsIDB4MDcsMHgyMCwgMHgwMCwweDE2LCAweEY2LDB4M0IsIDB4MjgsMHgwMCwgMHg4NywweDIyLCAKKzB4MDAsMHgxNCwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHg3NywweDM5LCAKKzB4MDAsMHgwNiwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDE2LCAweEYzLDB4QjcsIDB4MjgsMHgwMCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA4LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg2LDB4MTYsIDB4MDAsMHgwMCwgMHhGNSwweDg0LCAKKzB4NEYsMHg1OCwgMHgwNSwweDMwLCAweDAwLDB4MTYsIDB4ODcsMHgyQSwgMHgwMCwweDAwLCAweDc2LDB4QTksIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweDc3LDB4MzksIDB4MDAsMHgwNiwgMHhDNCwweDJDLCAKKzB4NzAsMHgwMCwgMHhDMCwweDIyLCAweDYyLDB4MDAsIDB4RTYsMHgwMCwgMHhENSwweDI5LCAweDA2LDB4QTAsIDB4MDAsMHgxNiwgMHg4NywweDM2LCAKKzB4MDAsMHgwMCwgMHhDNiwweDMwLCAweDVBLDB4MDAsIDB4NzYsMHgzMCwgMHhGRiwweEZBLCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweDc3LDB4MzksIDB4MDAsMHgwNiwgMHg3NiwweEI4LCAKKzB4RkYsMHhGQSwgMHhGNiwweEFCLCAweDI4LDB4MDAsIDB4QzcsMHgyQywgMHg3MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgxNCwgMHhFMCwweDAwLCAKKzB4RDUsMHgyQywgMHhGNiwweDNCLCAweDI4LDB4MDAsIDB4QzQsMHgyQywgMHgwMCwweDAwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDQsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNiwgMHg0RiwweDg0LCAweDQ3LDB4MzgsIDB4RkYsMHhGQywgMHhGNywweDA1LCAKKzB4NkYsMHgzMCwgMHhGNiwweDg2LCAweDUwLDB4NUMsIDB4NDYsMHhCNCwgMHhGRiwweEZDLCAweEY2LDB4ODUsIDB4NkUsMHg1MCwgMHhGNywweDA2LCAKKzB4NkUsMHg3QywgMHg0NywweDM4LCAweEZGLDB4RkMsIDB4RjcsMHgwNSwgMHg2RSwweDU0LCAweDA3LDB4MzQsIDB4MTksMHgxQywgMHhGNywweDA1LCAKKzB4NEYsMHg1QywgMHhGNywweDAyLCAweDAwLDB4NjQsIDB4OTcsMHgzNiwgMHgxOSwweDFDLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg5NywweDM2LCAKKzB4MTksMHgyMCwgMHgwNiwweEI0LCAweDAwLDB4MUMsIDB4RjYsMHg4NSwgMHg0RiwweDU4LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDkwLCAweEYzLDB4MDIsIDB4RkYsMHhGRiwgMHhGMywweDA1LCAKKzB4NEYsMHg1NCwgMHhGMywweDgyLCAweDAwLDB4MDAsIDB4OTMsMHg5NiwgMHhGRiwweEFDLCAweDIzLDB4MTQsIDB4MDAsMHgyMCwgMHg5MywweDE2LCAKKzB4RkYsMHg5QywgMHgyMywweDk0LCAweDAwLDB4MzgsIDB4OTMsMHg5NiwgMHhGRiwweDk0LCAweDgzLDB4MTYsIDB4RkYsMHhBQywgMHhGNywweDA0LCAKKzB4NEYsMHg1QywgMHhGMywweDgyLCAweDAwLDB4MEMsIDB4OTMsMHg5NiwgMHhGRiwweDc0LCAweDkzLDB4MTYsIDB4RkYsMHg4QywgMHg4NywweDNBLCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTcsMHgxNiwgMHhGRiwweEE0LCAweDgzLDB4MTYsIDB4RkYsMHhBQywgMHg4MywweDk2LCAKKzB4RkYsMHhBNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgxQSwgMHgzQSwweDAwLCAweEVDLDB4MDAsIDB4REIsMHg3OCwgMHhGMywweDAyLCAKKzB4MDQsMHhCQywgMHhGNywweDA0LCAweDRGLDB4NUMsIDB4ODMsMHgxNiwgMHhGRiwweDc0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4MzAsMHgwMCwgMHg4NywweDNBLCAweDAwLDB4MDgsIDB4RjYsMHg4NCwgMHg0RiwweDU4LCAweDc3LDB4MzksIDB4MDAsMHgwNiwgMHhDNCwweEI0LCAKKzB4NzAsMHgwMCwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4OTQsMHg5NiwgMHhGRiwweDdDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4Q0QsMHgwMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODQsMHg5NiwgMHhGRiwweDdDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4RDYsMHg1NCwgMHhDNSwweDA0LCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg0MiwweDg4LCAweEUwLDB4MDAsIDB4RDgsMHg3QywgMHhGNiwweDA2LCAKKzB4NDIsMHg4OCwgMHhGNiwweDA0LCAweDRGLDB4NUMsIDB4ODMsMHg5NiwgMHgwMCwweDAwLCAweDgzLDB4MTYsIDB4RkYsMHg3NCwgMHg4NiwweDlFLCAKKzB4MDAsMHgwMCwgMHhBNywweDMyLCAweDMwLDB4MDIsIDB4RjUsMHg4MiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4RDYsMHg5NCwgMHhDNiwweDMwLCAweDMwLDB4MDAsIDB4ODYsMHg5RSwgMHgwMCwweDA0LCAweDg3LDB4MzIsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhENiwweDk4LCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhGNSwweDgyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhENiwweEE1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHg4MywweDk2LCAweDAwLDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDg2LDB4OUUsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHhENiwweEU0LCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweEQ2LDB4RUMsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweDg2LDB4OUUsIDB4MDAsMHgwNCwgMHg4NywweDMyLCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4RDYsMHhFRCwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4RDYsMHhGRCwgMHgyMCwweDJBLCAKKzB4MDAsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4RDcsMHgyOCwgMHgwNCwweEE0LCAKKzB4MDAsMHgwMiwgMHg4MywweDE2LCAweEZGLDB4QUMsIDB4RjcsMHgwNiwgMHg0MiwweEM4LCAweDgzLDB4OTYsIDB4RkYsMHg4QywgMHhGMywweDA1LCAKKzB4NEYsMHg1NCwgMHhDNywweDFDLCAweDcwLDB4MDAsIDB4RjAsMHgzQiwgMHgyOCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgwMiwgMHhFMCwweDAwLCAKKzB4REIsMHg1MCwgMHhGMCwweDNCLCAweDI4LDB4MDAsIDB4OTQsMHg5NiwgMHhGRiwweDZDLCAweDg3LDB4MjYsIDB4MDAsMHgwMCwgMHg3NiwweEE1LCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4ODMsMHgxNiwgMHhGRiwweDZDLCAweDgzLDB4OTYsIDB4RkYsMHg5QywgMHgyNCwweDk0LCAKKzB4MDAsMHgxRSwgMHgwNiwweDE4LCAweDAwLDB4MDIsIDB4NzUsMHhCMSwgMHgwMCwweDFFLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxRiwgMHgyOCwweDAwLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NSwweDFELCAKKzB4MDAsMHgxRSwgMHg3NSwweDI4LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MUMsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MUEsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MTgsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MTYsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MTQsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MTIsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgxMCwgMHg3NiwweDMxLCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4RTAsIDB4RjYsMHg4MiwgMHhGRiwweEZDLCAweEM3LDB4MzgsIDB4NTcsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHgwNywweDM4LCAweDAwLDB4MDMsIDB4QzQsMHhCOCwgMHg2QywweDAwLCAweDIwLDB4MjYsIDB4MDAsMHgxMCwgMHhFMiwweDAwLCAKKzB4RDgsMHg5RCwgMHhGNiwweDA2LCAweDQyLDB4OEEsIDB4RjcsMHgwNCwgMHg0MiwweDg4LCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhGNCwweDAyLCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweERCLDB4QTAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDgzLDB4MTYsIDB4RkYsMHg2QywgMHgyNSwweDE0LCAKKzB4MDAsMHgzNiwgMHg4MywweDk2LCAweEZGLDB4OTQsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDc2LDB4OTksIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHgwNiwweDE4LCAweDAwLDB4MDIsIDB4NzUsMHhCMSwgMHgwMCwweDFFLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDFGLCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHgzNCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHgzMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHgzMCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHgyRSwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHgyQywgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHgyQSwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHgyOCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4MjYsMHhBNCwgMHgwMCwweDAyLCAweDc0LDB4QTQsIDB4RkYsMHhGRiwgMHg3NiwweDMxLCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAKKzB4MjgsMHgwMCwgMHg5MCwweDEzLCAweEZGLDB4RkMsIDB4ODMsMHgxNiwgMHhGRiwweDhDLCAweEY3LDB4MDYsIDB4NDIsMHhDQywgMHhDNywweDE4LCAKKzB4NzAsMHgwMCwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg5NCwweDk2LCAKKzB4RkYsMHg3QywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDRCwweEI4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAKKzB4RkYsMHg2QywgMHgyNCwweDE0LCAweDAwLDB4NEUsIDB4MjUsMHgxNCwgMHgwMCwweDUwLCAweDgzLDB4MTYsIDB4RkYsMHg4QywgMHg4NCwweDk2LCAKKzB4RkYsMHg3QywgMHg4NywweDFFLCAweDAwLDB4MDAsIDB4NzYsMHg5RCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHgwNiwweDFDLCAKKzB4MDAsMHgwMiwgMHg3NSwweEIxLCAweDAwLDB4MUUsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc1LDB4MjksIDB4MDAsMHgxRSwgMHg3NSwweDI4LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHgyNCwweDE0LCAKKzB4MDAsMHg0QywgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHgyNCwweDE0LCAKKzB4MDAsMHg0QSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHgyNCwweDE0LCAKKzB4MDAsMHg0OCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHgyNCwweDE0LCAKKzB4MDAsMHg0NiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHgyNCwweDE0LCAKKzB4MDAsMHg0NCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHgyNCwweDE0LCAKKzB4MDAsMHg0MiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4MjQsMHgxNCwgMHgwMCwweDQwLCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHg4NiwweDk2LCAKKzB4RkYsMHhCMCwgMHhGNiwweDA2LCAweDQyLDB4QzgsIDB4QzYsMHgxOCwgMHg2MCwweDAwLCAweEY3LDB4MDIsIDB4MDAsMHgwMywgMHhDNiwweEI0LCAKKzB4NTcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4QzYsMHhCNCwgMHg3NCwweDAwLCAweEY3LDB4MDIsIDB4MDAsMHgwNCwgMHhDNywweDM4LCAKKzB4NkEsMHgwMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweEY0LDB4QjMsIDB4MjgsMHgwMCwgMHg4MywweDk2LCAKKzB4RkYsMHg4QywgMHg4MywweDE2LCAweEZGLDB4NzQsIDB4MDMsMHg5QywgMHgwMCwweDE0LCAweDkzLDB4OTYsIDB4RkYsMHg4QywgMHgwMywweDE4LCAKKzB4MDAsMHgwQywgMHg4MywweDk2LCAweEZGLDB4QUMsIDB4OTMsMHgxNiwgMHhGRiwweDc0LCAweDAzLDB4OUMsIDB4MDAsMHgwMSwgMHhFMCwweDAwLCAKKzB4RDUsMHhFQywgMHg5MywweDk2LCAweEZGLDB4QUMsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweEYzLDB4ODQsIDB4NEYsMHg1QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHgwNiwgMHg0QSwweDk4LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI2LDB4RjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY0LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDEsMHhBMCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHhGMywweDg0LCAweDZFLDB4NTAsIDB4RjYsMHgwMiwgMHgwMCwweDFDLCAweDIwLDB4MkEsIDB4MDAsMHg2MywgMHhFRSwweDAwLCAKKzB4REMsMHgwOCwgMHhDNSwweDlDLCAweDYwLDB4MDAsIDB4QTYsMHg5RSwgMHg2MCwweDAyLCAweDc3LDB4MkQsIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweDIwLDB4MzYsIDB4MDAsMHgwMywgMHhFNiwweDAwLCAKKzB4REIsMHhGQywgMHgwNywweDJDLCAweDAwLDB4MzYsIDB4RjAsMHgzQiwgMHgyOCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHg0MCwgMHhFMCwweDAwLCAKKzB4REIsMHhDQywgMHgwNSwweDI4LCAweDAwLDB4MDEsIDB4RjUsMHg4NCwgMHg0RiwweDVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweEFFLCAKKzB4MDAsMHgwOCwgMHhGNCwweDAyLCAweDAwLDB4MDAsIDB4ODcsMHgyRSwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFQywweDAwLCAweERDLDB4RjAsIDB4OTYsMHg5NiwgMHhGRiwweEVDLCAweDc3LDB4MzUsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzYsMHgzOCwgMHg1OCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwQywgMHhDMywweDg0LCAKKzB4MDAsMHgwMCwgMHg4MywweDE2LCAweDAwLDB4MDAsIDB4ODYsMHhCMiwgMHgwMCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhEQywweDdDLCAweEM1LDB4MjAsIDB4MDAsMHgwMCwgMHg4NiwweEIyLCAKKzB4MDAsMHgwNCwgMHg4NywweDFBLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4REMsMHg4MCwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RjUsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4REMsMHg4RCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjMsMHg4MiwgMHgwMCwweDAwLCAweDg0LDB4OTYsIDB4MDAsMHgwMCwgMHg4NiwweEIyLCAKKzB4MDAsMHgwMCwgMHg4NywweDI2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAKKzB4REMsMHhDQywgMHhGNSwweDAyLCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4REMsMHhENCwgMHgyMCwweDJBLCAKKzB4MDAsMHgwMCwgMHg4NiwweEIyLCAweDAwLDB4MDQsIDB4ODcsMHgyNiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFMiwweDAwLCAweERDLDB4RDUsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEY1LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDJBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweERDLDB4RTUsIDB4MjAsMHgxRSwgMHgwMCwweDAwLCAweEYzLDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDFFLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweERDLDB4RjQsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEY0LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweERELDB4MjksIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIDB4RkYsMHhFQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NiwweEI5LCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAKKzB4NTgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTQsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhGMCwgMHhFMCwweDAwLCAKKzB4REQsMHg5OCwgMHg5NiwweDk2LCAweEZGLDB4RjQsIDB4MjcsMHgxNCwgMHgwMCwweDE0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg4MywweDE2LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHg5NSwweDk2LCAKKzB4RkUsMHg3MCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNSwweDY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDk2LCAKKzB4RkUsMHg3MCwgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhERCwweDk1LCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDE2LCAKKzB4RkYsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzYsMHhCOSwgMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg3NiwweEI1LCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDU4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDE0LCAweDg2LDB4QjYsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAKKzB4RkYsMHhGMCwgMHg5NiwweDk2LCAweEZGLDB4RjQsIDB4OTcsMHgyRSwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4REQsMHg5QywgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4REQsMHhCMCwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMCwgMHhGNywweDA0LCAweDQyLDB4N0MsIDB4RTAsMHgwMCwgMHhFMCwweDlDLCAweEY2LDB4MDYsIDB4NDIsMHg3RSwgMHg5NCwweDk2LCAKKzB4RkYsMHg0NCwgMHg4NywweDE2LCAweEZGLDB4RjQsIDB4RjYsMHgwNCwgMHg0RiwweDU4LCAweDc3LDB4MzksIDB4MDAsMHgwNiwgMHhDNywweDMwLCAKKzB4NzAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4NTQsIDB4MDYsMHhCOCwgMHgwMCwweDFBLCAweDg3LDB4MzYsIDB4MDAsMHgwMCwgMHg4MywweDE2LCAKKzB4RkYsMHg1NCwgMHg3NiwweEI1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg5MywweDEzLCAKKzB4RkYsMHhGQywgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4NzcsMHgzOSwgMHgwMCwweDA2LCAweEM2LDB4MzAsIDB4NzAsMHgwMCwgMHg5NiwweDE2LCAKKzB4RkYsMHg0QywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDRCwweDAwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweERFLDB4MzUsIDB4RjMsMHgwMiwgMHgwMCwweDAxLCAweDg0LDB4OTYsIDB4RkYsMHg0QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0QsMHgwMCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhERSwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGMywweDAyLCAKKzB4MDAsMHgwMSwgMHg5MywweDE2LCAweEZGLDB4NDQsIDB4ODQsMHg5NiwgMHhGRiwweDQ0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDI2LCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweERFLDB4NTksIDB4RjYsMHgwNiwgMHg0MiwweEE0LCAweEY3LDB4MDQsIDB4NDIsMHhBNCwgMHhFMCwweDAwLCAKKzB4RTAsMHhBMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4ODMsMHgxNiwgMHhGRiwweDRDLCAweDg2LDB4MTYsIDB4RkYsMHg0QywgMHg4NywweDFBLCAKKzB4MDAsMHgwMCwgMHg3NiwweDk5LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHgyMCwweDNBLCAweDAwLDB4MDIsIDB4RTYsMHgwMCwgMHhERSwweDg1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNiwweDA0LCAKKzB4NEYsMHg1OCwgMHhGNSwweDg0LCAweDRGLDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzIsIDB4NUEsMHgwMCwgMHhFNiwweDAwLCAKKzB4RTAsMHgyNSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODQsMHg5NiwgMHhGRiwweDRDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweEE0LCAKKzB4MDAsMHgxQSwgMHg4NywweDM2LCAweDAwLDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweDU0LCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweDc3LDB4MzksIDB4MDAsMHgwNiwgMHhDNywweDJDLCAKKzB4NzAsMHgwMCwgMHhDMCwweDNBLCAweDMyLDB4MDAsIDB4RTYsMHgwMCwgMHhERSwweERELCAweEY2LDB4MDYsIDB4NDIsMHg4MCwgMHhGNywweDA0LCAKKzB4NDIsMHg4MCwgMHhFMCwweDAwLCAweEUwLDB4QTAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDI2LDB4MTQsIDB4MDAsMHgzMCwgMHhGMCwweDMzLCAKKzB4MjgsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4RDAsIDB4NzYsMHgzMSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHg4NCwweDk2LCAKKzB4RkYsMHg0QywgMHgyMywweDE0LCAweDAwLDB4MkUsIDB4OTMsMHgxNiwgMHhGRSwweDY0LCAweDc1LDB4OTksIDB4MDAsMHgxRSwgMHg3NSwweEFDLCAKKzB4RkYsMHhFNSwgMHg3NSwweDE1LCAweDAwLDB4MUUsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweDczLDB4MTUsIDB4MDAsMHgxRSwgMHg3MywweDE4LCAKKzB4RkYsMHhFNSwgMHg5MywweDE2LCAweEZGLDB4MzQsIDB4ODMsMHgxNiwgMHhGRSwweDY0LCAweDA0LDB4MjQsIDB4MDAsMHgwMiwgMHgwNiwweEEwLCAKKzB4MDAsMHgwMiwgMHg3NCwweDk1LCAweDAwLDB4MUUsIDB4NzQsMHhBNCwgMHhGRiwweEU1LCAweDk0LDB4OTYsIDB4RkYsMHgzQywgMHg3NCwweDk1LCAKKzB4MDAsMHgxRSwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHg4NywweDFBLCAKKzB4MDAsMHgwMCwgMHg3NCwweEE0LCAweEZGLDB4RTUsIDB4OTQsMHg5NiwgMHhGRiwweDJDLCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhENCwgMHgyNCwweDk0LCAKKzB4MDAsMHgyQSwgMHg5NCwweDk2LCAweEZFLDB4NjQsIDB4NzYsMHgyNSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MjYsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RDgsIDB4MjMsMHgxNCwgMHgwMCwweDI2LCAweDkzLDB4MTYsIDB4RkUsMHg2NCwgMHg3NiwweDE5LCAKKzB4MDAsMHgxRSwgMHg4NCwweDk2LCAweEZGLDB4M0MsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NEYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NCwweDk2LCAKKzB4RkYsMHgzNCwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4REMsIDB4MjMsMHgxNCwgMHgwMCwweDIyLCAweDkzLDB4MTYsIDB4RkUsMHg2NCwgMHg3NiwweDE5LCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg0RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEUwLCAweDgzLDB4MTYsIDB4RkYsMHgyQywgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDM3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEUwLDB4MDAsIDB4RUEsMHhBMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDQiwweENDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgwNiwweEEwLCAKKzB4MDAsMHgwMiwgMHhGNywweDA0LCAweDRGLDB4NTgsIDB4RjAsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QTAsIDB4MDAsMHgxNCwgMHg5NCwweDE2LCAKKzB4RkYsMHgyNCwgMHhDNywweDIwLCAweDcyLDB4MDAsIDB4NzcsMHgzOCwgMHhGRiwweEZBLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEEwLCAKKzB4MDAsMHgxNiwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweEY0LDB4QTMsIDB4MjgsMHgwMCwgMHg5NCwweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDRCwweDAwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEUwLDB4QkMsIDB4MjYsMHg5NCwgMHgwMCwweDQ4LCAweEY3LDB4MDQsIDB4NDIsMHg4MCwgMHhFMCwweDAwLCAKKzB4RTAsMHg5QywgMHhGNiwweDA2LCAweDQyLDB4ODIsIDB4ODYsMHg5NiwgMHhGRSwweEY0LCAweEUwLDB4MDAsIDB4RTIsMHg5NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDQyLDB4ODQsIDB4RjYsMHgwNiwgMHg0MiwweDg0LCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhGNCwweDAyLCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweEVBLDB4QTQsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDgzLDB4MTYsIDB4RkYsMHg0QywgMHg3NSwweDE1LCAKKzB4MDAsMHgxRSwgMHg3NSwweDI4LCAweEZGLDB4RTUsIDB4OTMsMHgxNiwgMHhGRiwweDFDLCAweDA3LDB4MTgsIDB4MDAsMHgzNiwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMSwgMHhGNCwweEJCLCAweDI4LDB4MDAsIDB4RjAsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MTYsIDB4RkYsMHhCOCwgMHg3NiwweEI1LCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4MDQsMHgxOCwgMHgwMCwweDAyLCAweDA2LDB4MjAsIDB4MDAsMHgwMiwgMHgyMywweDE0LCAKKzB4MDAsMHg0NiwgMHg5MywweDE2LCAweEZGLDB4MTQsIDB4NzUsMHg5OSwgMHgwMCwweDFFLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHg3NCwweDk1LCAKKzB4MDAsMHgxRSwgMHg3NCwweEE0LCAweEZGLDB4RTUsIDB4OTQsMHg5NiwgMHhGRiwweDBDLCAweDczLDB4MTUsIDB4MDAsMHgxRSwgMHg3MywweDE4LCAKKzB4RkYsMHhFNSwgMHg5MywweDE2LCAweEZGLDB4MDQsIDB4NzQsMHg5NSwgMHgwMCwweDFFLCAweDc0LDB4QTQsIDB4RkYsMHhFNSwgMHg5NCwweDk2LCAKKzB4RkUsMHhGQywgMHgyMywweDAwLCAweDAwLDB4MDcsIDB4OTMsMHgxNiwgMHhGRSwweEY0LCAweDg0LDB4OTYsIDB4RkYsMHgxQywgMHg4MywweDE2LCAKKzB4RkYsMHgxNCwgMHgwNCwweEE0LCAweDAwLDB4MEEsIDB4OTQsMHg5NiwgMHhGRSwweDdDLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDIzLCAweDI4LDB4MDAsIDB4RjYsMHg4NCwgMHg0RiwweDU4LCAweDg0LDB4OTYsIDB4RkYsMHg1NCwgMHg4NywweDFBLCAKKzB4MDAsMHgwMCwgMHhDNiwweEE0LCAweDZBLDB4MDAsIDB4NzQsMHgzNCwgMHhGRiwweEZBLCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhCQywgMHgyMywweDE0LCAKKzB4MDAsMHg0MiwgMHg5MywweDE2LCAweEZGLDB4MTQsIDB4NzYsMHg5OSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4QzAsIDB4MjQsMHg5NCwgMHgwMCwweDNFLCAweDk0LDB4OTYsIDB4RkYsMHgxNCwgMHg3NiwweEE1LCAKKzB4MDAsMHgxRSwgMHg4MywweDE2LCAweEZGLDB4MEMsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4MzcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4ODcsMHgyNiwgMHgwMCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAKKzB4RkYsMHhDNCwgMHgyNCwweDk0LCAweDAwLDB4M0EsIDB4OTQsMHg5NiwgMHhGRiwweDE0LCAweDc2LDB4QTUsIDB4MDAsMHgxRSwgMHg4MywweDE2LCAKKzB4RkYsMHgwNCwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHgzNywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHg4NywweDI2LCAweDAwLDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEM4LCAweDg0LDB4OTYsIDB4RkUsMHhGQywgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDRGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHg4MywweDE2LCAKKzB4RkUsMHhGNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgxQSwgMHgwMCwweDA3LCAweEVFLDB4MDAsIDB4RTIsMHg5NCwgMHhGNiwweDgyLCAKKzB4MDAsMHgwOCwgMHg4NCwweDk2LCAweEZFLDB4N0MsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MjQsIDB4MDAsMHgwRSwgMHg4NiwweEJBLCAKKzB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAKKzB4RkYsMHhGMCwgMHhGNywweDAyLCAweDAwLDB4RkYsIDB4QzYsMHhCNCwgMHg3NCwweDAwLCAweDQ3LDB4MjEsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4RTAsMHg4OCwgMHgwNCwweEE0LCAKKzB4MDAsMHgwMiwgMHg5NCwweDk2LCAweEZFLDB4N0MsIDB4MDMsMHgxOCwgMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4RTIsMHgzMCwgMHg5MywweDE2LCAKKzB4RkUsMHhGNCwgMHg4MywweDE2LCAweEZGLDB4MUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MTgsIDB4MDAsMHgzOCwgMHhGNiwweEJCLCAKKzB4MjgsMHgwMCwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4ODQsMHg5NiwgMHhGRiwweDI0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhENCwweDJDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyMywweDE0LCAKKzB4MDAsMHg3OCwgMHg5MywweDE2LCAweEZFLDB4QkMsIDB4ODQsMHg5NiwgMHgwMCwweDAwLCAweDIzLDB4MTQsIDB4MDAsMHhBOCwgMHg4NiwweEE2LCAKKzB4MDAsMHgwNCwgMHg4NywweDI2LCAweDAwLDB4MDAsIDB4OTMsMHgxNiwgMHhGRSwweDlDLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg5NiwweDk2LCAKKzB4RkUsMHhFQywgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4QzcsMHgzNCwgMHg3NCwweDAwLCAweDk3LDB4MTYsIDB4RkUsMHhFNCwgMHg4NCwweDk2LCAKKzB4RkYsMHgyNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RDQsMHhCNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNCwgMHg0RiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDIyLCAKKzB4NzIsMHgwMCwgMHhFNiwweDAwLCAweEVBLDB4QTEsIDB4OTQsMHgxNiwgMHhGRiwweDFDLCAweDg2LDB4QTIsIDB4MDAsMHgzOCwgMHg3NywweDIxLCAKKzB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4RjMsMHgwMiwgMHgwMCwweDAwLCAweDkzLDB4MTYsIDB4RkUsMHhENCwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4OTYsMHg5NiwgMHhGRSwweERDLCAweDg0LDB4OTYsIDB4RkUsMHhENCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDI2LCAweDAwLDB4MEUsIDB4RUUsMHgwMCwgMHhFMiwweEYwLCAweEYzLDB4MDIsIDB4MDAsMHgwRiwgMHg5MywweDEzLCAKKzB4RkYsMHhGQywgMHg4MywweDE2LCAweEZFLDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MTgsIDB4NDgsMHgwMCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNywweEU4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhDMywweEEwLCAKKzB4MDAsMHgwMCwgMHg4NCwweDk2LCAweEZFLDB4RTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4RTMsMHg4RCwgMHgyMywweDlDLCAweDAwLDB4MDcsIDB4QzMsMHg4MCwgMHgzQSwweDAwLCAweEM3LDB4MUMsIDB4MzgsMHgwMCwgMHg4MywweDE2LCAKKzB4RkYsMHgxQywgMHhGNCwweDgyLCAweDAwLDB4RkYsIDB4RjYsMHgwNCwgMHg0RiwweDU4LCAweEM3LDB4MTgsIDB4NzAsMHgwMCwgMHgwNywweDM4LCAKKzB4MDAsMHgyNiwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4OTcsMHgxNiwgMHhGRSwweEM0LCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweEM2LDB4QjQsIDB4NEMsMHgwMCwgMHg3NiwweEI1LCAKKzB4MDAsMHgwNiwgMHhDMywweDMwLCAweDY4LDB4MDAsIDB4MDcsMHgzMCwgMHgwMCwweDQwLCAweEMwLDB4MUEsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4RTQsMHgwRCwgMHg5MywweDE2LCAweEZFLDB4Q0MsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTYsIDB4RkUsMHg3NCwgMHg5NiwweDE2LCAKKzB4RkUsMHg2QywgMHg5NiwweDk2LCAweEZFLDB4NjgsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0QsMHgwMCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4MywweDk2LCAweEZFLDB4NzQsIDB4ODYsMHgxNiwgMHhGRSwweDZDLCAweDg2LDB4OTYsIDB4RkUsMHg2OCwgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEUwLDB4OTUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY1LDB4ODQsIDB4NEYsMHg1OCwgMHg4NCwweDk2LCAKKzB4RkUsMHhDQywgMHgwNywweDJDLCAweDAwLDB4NDAsIDB4QzAsMHgyNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4RUEsMHg4RCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhBNywweDMyLCAweDY4LDB4MDIsIDB4NzYsMHhBNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHg4NiwweDE2LCAKKzB4RkUsMHhDQywgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDIwLDB4M0EsIDB4MDAsMHgwMiwgMHhFNiwweDAwLCAKKzB4RTQsMHg1MSwgMHhDMCwweDMyLCAweDVBLDB4MDAsIDB4QzYsMHgyQywgMHgwMCwweDAwLCAweEMwLDB4MzIsIDB4NUEsMHgwMCwgMHhFNiwweDAwLCAKKzB4RTYsMHhFNSwgMHgyNSwweDE0LCAweDAwLDB4NzYsIDB4ODMsMHgxNiwgMHhGRiwweDFDLCAweDg0LDB4OTYsIDB4RkUsMHhCQywgMHgwNiwweDE4LCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHg4MywweDE2LCAKKzB4RkUsMHhEQywgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4NzUsMHhCMSwgMHgwMCwweDFFLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHg3NCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHg3MiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHg3MCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHg2RSwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHg2QywgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHg2QSwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHgyNSwweDE0LCAweDAwLDB4NjgsIDB4NzYsMHgzMSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweEM3LDB4MUMsIDB4MzIsMHgwMCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4MjYsMHgxNCwgMHgwMCwweDYwLCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHg5NiwweDE2LCAKKzB4RkUsMHg2QywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhEMCwweERDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDE2LCAKKzB4RkYsMHhBMCwgMHg4NiwweDE2LCAweEZFLDB4NkMsIDB4ODQsMHg5NiwgMHhGRSwweENDLCAweDIzLDB4MTQsIDB4MDAsMHg1RSwgMHg5MywweDE2LCAKKzB4RkUsMHg1QywgMHg3NSwweDk5LCAweDAwLDB4MUUsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweDc0LDB4MTUsIDB4MDAsMHgxRSwgMHg3NCwweDIwLCAKKzB4RkYsMHhFNSwgMHg3MywweDE1LCAweDAwLDB4MUUsIDB4NzMsMHgxOCwgMHhGRiwweEU1LCAweDkzLDB4MTYsIDB4RkUsMHhBQywgMHg4MywweDE2LCAKKzB4RkUsMHg1QywgMHg3NiwweDMxLCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweDA1LDB4MjQsIDB4MDAsMHgwMiwgMHgwNiwweEE4LCAKKzB4MDAsMHgwMiwgMHg3NCwweDk1LCAweDAwLDB4MUUsIDB4NzQsMHhBNCwgMHhGRiwweEU1LCAweDk0LDB4OTYsIDB4RkUsMHhCNCwgMHg3NCwweDk1LCAKKzB4MDAsMHgxRSwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHg4NywweDFBLCAKKzB4MDAsMHgwMCwgMHg3NCwweEE0LCAweEZGLDB4RTUsIDB4OTQsMHg5NiwgMHhGRSwweEE0LCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhBNCwgMHgyNCwweDk0LCAKKzB4MDAsMHg1QSwgMHg5NCwweDk2LCAweEZFLDB4NUMsIDB4NzYsMHgyNSwgMHgwMCwweDFFLCAweDgzLDB4MTYsIDB4RkUsMHhCNCwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDM3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDI2LCAKKzB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEE4LCAweDI0LDB4OTQsIDB4MDAsMHg1NiwgMHg5NCwweDk2LCAKKzB4RkUsMHg1QywgMHg3NiwweDI1LCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NDcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgyNiwgMHgwMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAKKzB4RkYsMHhBQywgMHgyMywweDE0LCAweDAwLDB4NTIsIDB4OTMsMHgxNiwgMHhGRSwweDVDLCAweDc2LDB4MTksIDB4MDAsMHgxRSwgMHg4NCwweDk2LCAKKzB4RkUsMHhBQywgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg0RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEIwLCAweDgzLDB4MTYsIDB4RkUsMHhBNCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDM3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEUwLDB4MDAsIDB4RUEsMHg4QywgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NCwweDk2LCAweEZFLDB4Q0MsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA0LDB4QTQsIDB4MDAsMHgzNiwgMHg5NCwweDk2LCAKKzB4RkUsMHg1QywgMHg4NywweDI2LCAweDAwLDB4MDAsIDB4NzYsMHhBNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEVBLDB4OEQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDgzLDB4MTYsIDB4RkUsMHhDQywgMHg4NCwweDk2LCAKKzB4RkYsMHgxQywgMHgwNiwweDE4LCAweDAwLDB4M0EsIDB4ODUsMHhCMiwgMHgwMCwweDAwLCAweDA3LDB4MjQsIDB4MDAsMHgzQSwgMHg4NiwweEJBLCAKKzB4MDAsMHgwMCwgMHg3NiwweDMxLCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNSwweEFDLCAweDY3LDB4QzAsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc1LDB4QUQsIDB4RkYsMHhGMCwgMHg3NiwweEI1LCAKKzB4RkYsMHhGMCwgMHhDMCwweDJFLCAweDZBLDB4MDAsIDB4RUMsMHgwMCwgMHhFNywweDY0LCAweEY1LDB4MDIsIDB4MDAsMHgwMiwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMSwgMHg4MywweDE2LCAweEZGLDB4MUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MTgsIDB4MDAsMHgzNiwgMHg4NiwweEJBLCAKKzB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAKKzB4RkYsMHhGMCwgMHgyMCwweDM2LCAweDAwLDB4MDIsIDB4RTYsMHgwMCwgMHhFNywweDlDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDJBLCAKKzB4MDAsMHgwMSwgMHhFNiwweDAwLCAweEVBLDB4OEQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg0LDB4OTYsIDB4RkUsMHg1QywgMHg4MywweDE2LCAKKzB4RkYsMHgxQywgMHhGNSwweDI3LCAweDI4LDB4MDAsIDB4MDYsMHgxOCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4MjUsMHgxNCwgMHgwMCwweEE2LCAweDg0LDB4OTYsIDB4RkUsMHg5QywgMHg4MywweDE2LCAKKzB4RkUsMHhEQywgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4NzUsMHhCMSwgMHgwMCwweDFFLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHhBNCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHhBMiwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHhBMCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHg5RSwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHg5QywgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHg5QSwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAKKzB4MDAsMHgwMCwgMHgyNSwweDE0LCAweDAwLDB4OTgsIDB4NzYsMHgzMSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweEM3LDB4MUMsIDB4MzIsMHgwMCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4MjYsMHgxNCwgMHgwMCwweDkwLCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHg5NiwweDE2LCAKKzB4RkUsMHg2QywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhEMCwweERDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDE2LCAKKzB4RkYsMHg3MCwgMHg4NiwweDE2LCAweEZFLDB4NkMsIDB4ODQsMHg5NiwgMHhGRSwweENDLCAweDIzLDB4OTQsIDB4MDAsMHg4RSwgMHg3NSwweDlELCAKKzB4MDAsMHgxRSwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4NzMsMHgxNSwgMHgwMCwweDFFLCAweDczLDB4MTgsIDB4RkYsMHhFNSwgMHg5MywweDE2LCAKKzB4RkUsMHg5NCwgMHg3NCwweDE1LCAweDAwLDB4MUUsIDB4NzQsMHgyMCwgMHhGRiwweEU1LCAweDczLDB4MTUsIDB4MDAsMHgxRSwgMHg3MywweDE4LCAKKzB4RkYsMHhFNSwgMHg5MywweDE2LCAweEZFLDB4ODQsIDB4ODMsMHgxNiwgMHhGRSwweDk0LCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHgwNSwweDI0LCAweDAwLDB4MDIsIDB4MDYsMHhBOCwgMHgwMCwweDAyLCAweDc0LDB4OTUsIDB4MDAsMHgxRSwgMHg3NCwweEE0LCAKKzB4RkYsMHhFNSwgMHg5NCwweDk2LCAweEZFLDB4OEMsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAKKzB4MjgsMHgwMCwgMHg4NCwweDk2LCAweEZFLDB4QzQsIDB4ODcsMHgxRSwgMHgwMCwweDAwLCAweDc1LDB4MjUsIDB4MDAsMHgxRSwgMHhDNywweDM4LCAKKzB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAKKzB4RkYsMHg3NCwgMHgyMywweDk0LCAweDAwLDB4OEEsIDB4NzYsMHgxRCwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHg4NCwweDk2LCAKKzB4RkUsMHg4QywgMHg3NSwweDI4LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHgzNywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAKKzB4MjgsMHgwMCwgMHg4NywweDFFLCAweDAwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDgzLDB4MTYsIDB4RkUsMHg4NCwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAKKzB4RkYsMHg3OCwgMHgyMywweDk0LCAweDAwLDB4ODYsIDB4NzYsMHgxRCwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NDcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUUsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4N0MsIDB4MjMsMHg5NCwgMHgwMCwweDgyLCAweDc2LDB4MUQsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDRGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDFFLCAKKzB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODQsMHg5NiwgMHhGRSwweEM0LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweDgwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAKKzB4MzcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MjYsIDB4MDAsMHgwMCwgMHhGMywweDAyLCAKKzB4MDAsMHhGRiwgMHhDNywweDM4LCAweDU3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEU4LCAweEM2LDB4QjgsIDB4MzQsMHgwMCwgMHhGNywweDAyLCAKKzB4MDAsMHg4MCwgMHhDNywweDM0LCAweDc0LDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDEwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEVBLDB4NjEsIDB4MjcsMHgwMCwgMHgwMSwweDAwLCAweEM2LDB4QjQsIDB4NzUsMHg4MCwgMHg4NCwweDk2LCAKKzB4RkUsMHhDQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgyNCwgMHgwMCwweDM4LCAweEY2LDB4QkIsIDB4MjgsMHgwMCwgMHg5NCwweDkzLCAKKzB4RkYsMHhGQywgMHg4MywweDE2LCAweEZGLDB4MjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEQ0LDB4MkMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg0LDB4OTYsIDB4RkUsMHhENCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNCwweEE0LCAweDAwLDB4MDEsIDB4RTAsMHgwMCwgMHhFMywweDNDLCAweDk0LDB4OTYsIDB4RkUsMHhENCwgMHhGNCwweDAyLCAKKzB4MDAsMHgwMSwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwNCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NiwweDE2LCAKKzB4MDAsMHgwOCwgMHg4NiwweDk2LCAweDAwLDB4MEMsIDB4RjUsMHgwMiwgMHhGRiwweEZDLCAweDg1LDB4OTYsIDB4MDAsMHgwNCwgMHg4NCwweDE2LCAKKzB4MDAsMHgxMCwgMHhGNCwweDg0LCAweEUwLDB4MDAsIDB4MDcsMHgzMCwgMHgwMCwweDAyLCAweDk0LDB4QjIsIDB4MDAsMHgxMCwgMHhGNCwweDg0LCAKKzB4RTAsMHgwNCwgMHgwNiwweEI0LCAweDAwLDB4MDMsIDB4OTQsMHhCMiwgMHgwMCwweDE0LCAweEY0LDB4ODQsIDB4RTAsMHgxQywgMHhDNiwweEI0LCAKKzB4NTQsMHgwMCwgMHg5NCwweEIyLCAweDAwLDB4MTgsIDB4RjQsMHg4MiwgMHgwMCwweDA1LCAweEY0LDB4QjMsIDB4MjgsMHgwMCwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMSwgMHhGNCwweEJCLCAweDI4LDB4MDAsIDB4MjcsMHgzNCwgMHgwMCwweDA4LCAweDk3LDB4MzIsIDB4MDAsMHgwNCwgMHg4NiwweDE2LCAKKzB4MDAsMHgwMCwgMHgwNywweDJDLCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHg1NCwweDAwLCAweEM2LDB4QjgsIDB4NjgsMHgwMCwgMHg5NiwweDkzLCAKKzB4RkYsMHhGQywgMHhDNiwweDMwLCAweDcyLDB4MDAsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4MDAsMHgwMywgMHhDNSwweEFDLCAKKzB4NzQsMHgwMCwgMHhGNywweDAyLCAweDAwLDB4MDQsIDB4QzcsMHgzOCwgMHg1QSwweDAwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhDMSwweDIwLCAweDAwLDB4MDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MTQsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDE4LCAweDg3LDB4MTYsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4MywweEJBLCAweDAwLDB4MDAsIDB4ODQsMHg5NiwgMHgwMCwweDAwLCAweDkzLDB4OTYsIDB4RkYsMHhGMCwgMHhGMywweDg0LCAKKzB4NkUsMHg1NCwgMHg4NywweDNBLCAweDAwLDB4MDQsIDB4OTMsMHg5NiwgMHhGRiwweEVDLCAweDk3LDB4MTYsIDB4RkYsMHhGNCwgMHg5MCwweDEzLCAKKzB4RkYsMHhGQywgMHgyNywweDFDLCAweDAwLDB4MDIsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4MjQsIDB4MDAsMHgyMCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHg5NCwweDk2LCAweEZGLDB4RTQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0QsMHhCOCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NCwweDk2LCAweEZGLDB4RTQsIDB4ODMsMHg5NiwgMHgwMCwweDA4LCAweDg3LDB4MjYsIDB4MDAsMHgxOCwgMHg4NSwweDE2LCAKKzB4RkYsMHhFQywgMHhDMCwweDNBLCAweDNBLDB4MDAsIDB4RUUsMHgwMCwgMHhFQywweDdDLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHg4NywweDI2LCAKKzB4MDAsMHgxOCwgMHg4MywweDk2LCAweDAwLDB4MDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MUUsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4RUMsMHg3QywgMHhDNSwweDg0LCAweDAwLDB4MDAsIDB4ODYsMHhBNiwgMHgwMCwweDEwLCAweDg3LDB4MTYsIDB4RkYsMHhGMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhFQywweDFDLCAweDA0LDB4MjQsIDB4MDAsMHgxMCwgMHg4NiwweEE2LCAKKzB4MDAsMHgxNCwgMHg4NywweDE2LCAweEZGLDB4RjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4RUMsMHgyMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4RUMsMHgyRCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjUsMHg4MiwgMHgwMCwweDAwLCAweDg2LDB4QTIsIDB4MDAsMHgwMCwgMHg4NywweDE2LCAKKzB4RkYsMHhGMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4RUMsMHg2OCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhFQywweDcwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHg4NiwweEEyLCAKKzB4MDAsMHgwNCwgMHg4NywweDE2LCAweEZGLDB4RjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAKKzB4RUMsMHg3MSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4RUMsMHg4MSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4RUMsMHhBQywgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0MiwweDlDLCAweEY2LDB4MDYsIDB4NDIsMHg5QywgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweDk3LDB4MkEsIDB4MDAsMHgwOCwgMHg4MywweEE2LCAKKzB4MDAsMHgwQywgMHg3NywweDJDLCAweEZGLDB4RTEsIDB4OTMsMHhBQSwgMHgwMCwweDBDLCAweDk3LDB4MkEsIDB4MDAsMHgxQywgMHg4MywweEE2LCAKKzB4MDAsMHgxQywgMHhGNywweDA0LCAweDZFLDB4NTAsIDB4OTMsMHhBQSwgMHgwMCwweDIwLCAweDgzLDB4QkEsIDB4MUQsMHhEQywgMHhGNiwweDgyLCAKKzB4MDAsMHgwMCwgMHg5MywweEFBLCAweDAwLDB4MkMsIDB4ODMsMHg5NiwgMHgwMCwweDBDLCAweEM1LDB4QjQsIDB4MDAsMHgwMCwgMHg5MywweEFBLCAKKzB4MDAsMHgzMCwgMHg4MywweEJBLCAweDAwLDB4MTAsIDB4QzYsMHgzNCwgMHgwMCwweDAwLCAweDkzLDB4QUEsIDB4MDAsMHgyNCwgMHg4NywweDNBLCAKKzB4MDAsMHgxNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTcsMHgyQSwgMHgwMCwweDI4LCAweDIwLDB4MzYsIDB4MDAsMHgxRiwgMHhFRSwweDAwLCAKKzB4RUQsMHgxQywgMHhDNywweDMwLCAweDUwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDM0LCAweDk1LDB4QkEsIDB4MDAsMHgwMCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwNCwgMHhFMCwweDAwLCAweEVDLDB4RkMsIDB4MDYsMHhCNCwgMHgwMCwweDAxLCAweDgzLDB4OTYsIDB4MDAsMHgxMCwgMHg3NiwweEE1LCAKKzB4MDAsMHgxRSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweEI0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHg4NywweDI2LCAweDAwLDB4MjAsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhFQSwweEI4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDE0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgxOCwgMHg4NywweDE2LCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHgzQSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NiwweDE2LCAKKzB4RkYsMHhGMCwgMHg4NywweDNBLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk3LDB4MTYsIDB4RkYsMHhGNCwgMHhGNiwweDAyLCAKKzB4MUQsMHhFMCwgMHg5NiwweDEzLCAweEZGLDB4RkMsIDB4ODYsMHgxNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NiwweDEzLCAKKzB4RkYsMHhGQywgMHhGNiwweDA0LCAweDZFLDB4NTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHgyNiwweDE0LCAKKzB4MDAsMHgxMCwgMHg5NiwweDE2LCAweEZGLDB4RUMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjYsMHhGOCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNiwweDg0LCAweDZFLDB4NTAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDg3LDB4MzYsIDB4MUQsMHhEOCwgMHg5NiwweDE2LCAKKzB4RkYsMHhFNCwgMHg3NiwweEI1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNiwweDg2LCAweDQyLDB4QzAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg2LDB4MTYsIDB4RkYsMHhFQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NiwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4REIsMHhCNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhFRSwweDRELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweDE2LCAKKzB4RkYsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RDUsMHhBMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4RUUsMHg0RCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4OTYsMHgxNiwgMHhGRiwweEU0LCAweDg0LDB4MTYsIDB4RkYsMHhFNCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA4LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg2LDB4OTYsIDB4MDAsMHgwNCwgMHg4NiwweDE2LCAKKzB4MDAsMHgwMCwgMHg4NywweDM2LCAweDAwLDB4MDgsIDB4ODUsMHg5NiwgMHgwMCwweDA4LCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4RUUsMHg5OSwgMHgyMCwweDNBLCAweDAwLDB4MDMsIDB4RTYsMHgwMCwgMHhFRSwweEU5LCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHhFMCwweDAwLCAKKzB4RUYsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhCMCwgMHgwMCwweDFGLCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAwLCAKKzB4RUYsMHgwRCwgMHhGNCwweDAyLCAweDAwLDB4MDAsIDB4ODUsMHgxNiwgMHgwMCwweDE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHg4NSwweDE2LCAweDAwLDB4MTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAKKzB4MDAsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHg5NiwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhFQiwweDYwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAKKzB4RUYsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhCMCwgMHgwMCwweDFFLCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAwLCAKKzB4RUYsMHgwRCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEVELDB4NzQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MTgsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDE4LCAweEY0LDB4ODIsIDB4MDAsMHgwMCwgMHg4NiwweDk2LCAKKzB4MDAsMHgwMCwgMHhGNiwweDA0LCAweDRBLDB4QTAsIDB4MjMsMHg5NCwgMHgwMCwweDEwLCAweDg0LDB4MzYsIDB4MDAsMHgwMCwgMHg5NiwweDE2LCAKKzB4RkYsMHhFNCwgMHhGNywweDA0LCAweDRBLDB4OUMsIDB4OTQsMHgxNiwgMHhGRiwweEYwLCAweDg1LDB4MzYsIDB4MDAsMHgwNCwgMHhDMCwweDMyLCAKKzB4NzIsMHgwMCwgMHhFQywweDAwLCAweEYwLDB4MTQsIDB4OTUsMHgxNiwgMHhGRiwweEY0LCAweDc3LDB4MzEsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHgwNiwgMHg0QSwweDk4LCAweEM2LDB4QjgsIDB4MzAsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgwQywgMHhDNSwweDg0LCAweDAwLDB4MDAsIDB4ODcsMHgzNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAKKzB4NDIsMHgwMCwgMHhFNiwweDAwLCAweEVGLDB4QTQsIDB4QzYsMHgyNCwgMHgwMCwweDAwLCAweDg3LDB4MzYsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDUyLDB4MDAsIDB4RTYsMHgwMCwgMHhFRiwweEE4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhFRiwweEI1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDgyLCAKKzB4MDAsMHgwMCwgMHg4NiwweDM2LCAweDAwLDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDMyLCAKKzB4NzIsMHgwMCwgMHhFMiwweDAwLCAweEVGLDB4RjAsIDB4RjUsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MzIsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAKKzB4RUYsMHhGOCwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4ODYsMHhCNiwgMHgwMCwweDA0LCAweDg3LDB4MTYsIDB4RkYsMHhGNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHhFRiwweEY5LCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhGMCwweDA5LCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhGNSwweDgyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhGMCwweDE4LCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDI2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhGMCwweDRELCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDE2LCAKKzB4RkYsMHhFNCwgMHhGMywweDA2LCAweDRBLDB4OTgsIDB4NzYsMHhCOSwgMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg3NiwweEI1LCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDMwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDE0LCAweDg2LDB4QjYsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAKKzB4RkYsMHhFOCwgMHhFMCwweDAwLCAweEYwLDB4QjAsIDB4OTYsMHg5NiwgMHhGRiwweEVDLCAweDI3LDB4MTQsIDB4MDAsMHgxQywgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHgwNiwgMHg0QSwweDk4LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI1LDB4NjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4RjAsMHhBRCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgxNiwgMHhGRiwweEU0LCAweEYzLDB4MDYsIDB4NEEsMHg5OCwgMHg3NiwweEI5LCAKKzB4MDAsMHgwMSwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4MzAsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgxNCwgMHg4NiwweEI2LCAweDAwLDB4MDAsIDB4OTcsMHgxNiwgMHhGRiwweEU4LCAweDk2LDB4OTYsIDB4RkYsMHhFQywgMHhGNywweDA1LCAKKzB4NEEsMHhBMCwgMHhFMCwweDAwLCAweEYwLDB4QjQsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEYxLDB4MjEsIDB4RjQsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIDB4RkYsMHhFOCwgMHhGNiwweDA2LCAKKzB4NDIsMHhDOCwgMHg3NiwweEI5LCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgwMiwgMHhBNywweDM2LCAKKzB4NjAsMHgwMiwgMHg4MywweDE2LCAweDAwLDB4MDQsIDB4QzYsMHhCNCwgMHg2MCwweDAwLCAweDc2LDB4MzUsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHgwNSwweDM0LCAweDAwLDB4MDIsIDB4NzUsMHhBOSwgMHgwMCwweDFFLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHg5NywweDFBLCAweDAwLDB4MDAsIDB4ODcsMHgyQSwgMHgwMCwweDAwLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHg4MywweDE2LCAKKzB4MDAsMHgwOCwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweDk3LDB4MUEsIDB4MDAsMHgwMCwgMHg4MywweDE2LCAKKzB4MDAsMHgwQywgMHgwNiwweEI0LCAweDAwLDB4MDQsIDB4RTAsMHgwMCwgMHhGMSwweDI0LCAweDk2LDB4OUEsIDB4MDAsMHgwMCwgMHhGNCwweDAyLCAKKzB4MDAsMHgwMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgxMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDAsMHgwMCwgMHhCOSwweDAwLCAweDAwLDB4MDAsIDB4QkEsMHgwMCwgMHgwMCwweDAwLCAKKzB4QkIsMHgwMCwgMHgwMCwweDAwLCAweEJDLDB4MDAsIDB4MDAsMHgwMCwgMHhCRCwweDAwLCAweDAwLDB4MDAsIDB4QkUsMHgwMCwgMHgwMCwweDAwLCAKKzB4QkYsMHgwMCwgMHgwMCwweDAwLCAweDgwLDB4MDAsIDB4MDAsMHgwMCwgMHg4MSwweDAwLCAweDAwLDB4MDAsIDB4ODIsMHgwMCwgMHgwMCwweDAwLCAKKzB4ODMsMHgwMCwgMHgwMCwweDAwLCAweDg0LDB4MDAsIDB4MDAsMHgwMCwgMHg4NSwweDAwLCAweDAwLDB4MDAsIDB4ODYsMHgwMCwgMHgwMCwweDAwLCAKKzB4ODcsMHgwMCwgMHhCOSwweEI5LCAweEI5LDB4QkEsIDB4QjksMHhCQiwgMHhCOSwweEJDLCAweEI5LDB4QkQsIDB4QjksMHhCRSwgMHhCOSwweEJGLCAKKzB4QjksMHg4MCwgMHhCOSwweDgxLCAweEI5LDB4ODIsIDB4QjksMHg4MywgMHhCOSwweDg0LCAweEI5LDB4ODUsIDB4QjksMHg4NiwgMHhCOSwweDg3LCAKKzB4QkEsMHhCOSwgMHhCQSwweEJBLCAweEJBLDB4QkIsIDB4QkEsMHhCQywgMHhCQSwweEJELCAweEJBLDB4QkUsIDB4QkEsMHhCRiwgMHhCQSwweDgwLCAKKzB4QkEsMHg4MSwgMHhCQSwweDgyLCAweEJBLDB4ODMsIDB4QkEsMHg4NCwgMHhCQSwweDg1LCAweEJBLDB4ODYsIDB4QkEsMHg4NywgMHhCQiwweEI5LCAKKzB4QkIsMHhCQSwgMHhCQiwweEJCLCAweEJCLDB4QkMsIDB4QkIsMHhCRCwgMHhCQiwweEJFLCAweEJCLDB4QkYsIDB4QkIsMHg4MCwgMHhCQiwweDgxLCAKKzB4QkIsMHg4MiwgMHhCQiwweDgzLCAweEJCLDB4ODQsIDB4QkIsMHg4NSwgMHhCQiwweDg2LCAweEJCLDB4ODcsIDB4QkMsMHhCOSwgMHhCQywweEJBLCAKKzB4QkMsMHhCQiwgMHhCQywweEJDLCAweEJDLDB4QkQsIDB4QkMsMHhCRSwgMHhCQywweEJGLCAweEJDLDB4ODAsIDB4QkMsMHg4MSwgMHhCQywweDgyLCAKKzB4QkMsMHg4MywgMHhCQywweDg0LCAweEJDLDB4ODUsIDB4QkMsMHg4NiwgMHhCQywweDg3LCAweEJELDB4QjksIDB4QkQsMHhCQSwgMHhCRCwweEJCLCAKKzB4QkQsMHhCQywgMHhCRCwweEJELCAweEJELDB4QkUsIDB4QkQsMHhCRiwgMHhCRCwweDgwLCAweEJELDB4ODEsIDB4QkQsMHg4MiwgMHhCRCwweDgzLCAKKzB4QkQsMHg4NCwgMHhCRCwweDg1LCAweEJELDB4ODYsIDB4QkQsMHg4NywgMHhCRSwweEI5LCAweEJFLDB4QkEsIDB4QkUsMHhCQiwgMHhCRSwweEJDLCAKKzB4QkUsMHhCRCwgMHhCRSwweEJFLCAweEJFLDB4QkYsIDB4QkUsMHg4MCwgMHhCRSwweDgxLCAweEJFLDB4ODIsIDB4QkUsMHg4MywgMHhCRSwweDg0LCAKKzB4QkUsMHg4NSwgMHhCRSwweDg2LCAweEJFLDB4ODcsIDB4QkYsMHhCOSwgMHhCRiwweEJBLCAweEJGLDB4QkIsIDB4QkYsMHhCQywgMHhCRiwweEJELCAKKzB4QkYsMHhCRSwgMHhCRiwweEJGLCAweEJGLDB4ODAsIDB4QkYsMHg4MSwgMHhCRiwweDgyLCAweEJGLDB4ODMsIDB4QkYsMHg4NCwgMHhCRiwweDg1LCAKKzB4QkYsMHg4NiwgMHhCRiwweDg3LCAweDgwLDB4QjksIDB4ODAsMHhCQSwgMHg4MCwweEJCLCAweDgwLDB4QkMsIDB4ODAsMHhCRCwgMHg4MCwweEJFLCAKKzB4ODAsMHhCRiwgMHg4MCwweDgwLCAweDgwLDB4ODEsIDB4ODAsMHg4MiwgMHg4MCwweDgzLCAweDgwLDB4ODQsIDB4ODAsMHg4NSwgMHg4MCwweDg2LCAKKzB4ODAsMHg4NywgMHg4MSwweEI5LCAweDgxLDB4QkEsIDB4ODEsMHhCQiwgMHg4MSwweEJDLCAweDgxLDB4QkQsIDB4ODEsMHhCRSwgMHg4MSwweEJGLCAKKzB4ODEsMHg4MCwgMHg4MSwweDgxLCAweDgxLDB4ODIsIDB4ODEsMHg4MywgMHg4MSwweDg0LCAweDgxLDB4ODUsIDB4ODEsMHg4NiwgMHg4MSwweDg3LCAKKzB4ODIsMHhCOSwgMHg4MiwweEJBLCAweDgyLDB4QkIsIDB4ODIsMHhCQywgMHg4MiwweEJELCAweDgyLDB4QkUsIDB4ODIsMHhCRiwgMHg4MiwweDgwLCAKKzB4ODIsMHg4MSwgMHg4MiwweDgyLCAweDgyLDB4ODMsIDB4ODIsMHg4NCwgMHg4MiwweDg1LCAweDgyLDB4ODYsIDB4ODIsMHg4NywgMHg4MywweEI5LCAKKzB4ODMsMHhCQSwgMHg4MywweEJCLCAweDgzLDB4QkMsIDB4ODMsMHhCRCwgMHg4MywweEJFLCAweDgzLDB4QkYsIDB4ODMsMHg4MCwgMHg4MywweDgxLCAKKzB4ODMsMHg4MiwgMHg4MywweDgzLCAweDgzLDB4ODQsIDB4ODMsMHg4NSwgMHg4MywweDg2LCAweDgzLDB4ODcsIDB4ODQsMHhCOSwgMHg4NCwweEJBLCAKKzB4ODQsMHhCQiwgMHg4NCwweEJDLCAweDg0LDB4QkQsIDB4ODQsMHhCRSwgMHg4NCwweEJGLCAweDg0LDB4ODAsIDB4ODQsMHg4MSwgMHg4NCwweDgyLCAKKzB4ODQsMHg4MywgMHg4NCwweDg0LCAweDg0LDB4ODUsIDB4ODQsMHg4NiwgMHg4NCwweDg3LCAweDg1LDB4QjksIDB4ODUsMHhCQSwgMHg4NSwweEJCLCAKKzB4ODUsMHhCQywgMHg4NSwweEJELCAweDg1LDB4QkUsIDB4ODUsMHhCRiwgMHg4NSwweDgwLCAweDg1LDB4ODEsIDB4ODUsMHg4MiwgMHg4NSwweDgzLCAKKzB4ODUsMHg4NCwgMHg4NSwweDg1LCAweDg1LDB4ODYsIDB4ODUsMHg4NywgMHg4NiwweEI5LCAweDg2LDB4QkEsIDB4ODYsMHhCQiwgMHg4NiwweEJDLCAKKzB4ODYsMHhCRCwgMHg4NiwweEJFLCAweDg2LDB4QkYsIDB4ODYsMHg4MCwgMHg4NiwweDgxLCAweDg2LDB4ODIsIDB4ODYsMHg4MywgMHg4NiwweDg0LCAKKzB4ODYsMHg4NSwgMHg4NiwweDg2LCAweDg2LDB4ODcsIDB4ODcsMHhCOSwgMHg4NywweEJBLCAweDg3LDB4QkIsIDB4ODcsMHhCQywgMHg4NywweEJELCAKKzB4ODcsMHhCRSwgMHg4NywweEJGLCAweDg3LDB4ODAsIDB4ODcsMHg4MSwgMHg4NywweDgyLCAweDg3LDB4ODMsIDB4ODcsMHg4NCwgMHg4NywweDg1LCAKKzB4ODcsMHg4NiwgMHg4NywweDg3LCAweDAwLDB4MDAsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAKKzB4MDAsMHgxOCwgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4RjMsMHg3RCwgMHhGNiwweDA2LCAweDQyLDB4OTYsIDB4RjcsMHgwNCwgMHg0MiwweDk0LCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhGNCwweDAyLCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweEY1LDB4RTAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweEYzLDB4ODQsIDB4NkYsMHgzMCwgMHg5MCwweDEzLCAKKzB4RkYsMHhGQywgMHgyNywweDFDLCAweDAwLDB4MDIsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDgzLDB4MTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4OTMsMHg5NiwgMHhGRiwweEVDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4Q0QsMHhCOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweEVDLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg5NywweDFFLCAKKzB4MDAsMHgwOCwgMHg4MywweDE2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4MUUsIDB4MDAsMHgwQywgMHg4MywweDE2LCAKKzB4MDAsMHgwOCwgMHgwNCwweDlDLCAweDAwLDB4MjIsIDB4OTMsMHgxRSwgMHgwMCwweDFDLCAweDgzLDB4MTYsIDB4MDAsMHgwQywgMHg5MywweDk2LCAKKzB4RkYsMHhGNCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4NzYsMHg5OSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHgwNiwweDE4LCAKKzB4MDAsMHgwMiwgMHg3NSwweEIxLCAweDAwLDB4MUUsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHgwNiwweDlDLCAweDAwLDB4MjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg5NiwweDk2LCAKKzB4RkYsMHhFNCwgMHg3NSwweDM1LCAweDAwLDB4MUUsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgwNCwweDlDLCAweDAwLDB4MjQsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgwNCwweDlDLCAweDAwLDB4MjYsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgwNCwweDlDLCAweDAwLDB4MjgsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgwNCwweDlDLCAweDAwLDB4MkEsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgwNCwweDlDLCAweDAwLDB4MkMsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgwNCwweDlDLCAweDAwLDB4MkUsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDA0LDB4OUMsIDB4MDAsMHgzMCwgMHg3NiwweDMxLCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAKKzB4MjgsMHgwMCwgMHg4NywweDFFLCAweDAwLDB4MjAsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NTcsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHgyMCwweDNBLCAweDAwLDB4MDgsIDB4RUUsMHgwMCwgMHhGNSwweDk4LCAweEYzLDB4MDYsIDB4MTQsMHhEOCwgMHg4MywweDE2LCAKKzB4RkYsMHhFNCwgMHg4NywweDFFLCAweDAwLDB4MjAsIDB4NzYsMHg5OSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MjUsMHhCOCwgMHgwMCwweDAxLCAweEM0LDB4QUMsIDB4NTgsMHgwMCwgMHgwNCwweDI0LCAKKzB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RUMsMHgwMCwgMHhGNSwweDk1LCAweEY1LDB4MDIsIDB4MDAsMHgwMCwgMHg4MywweDE2LCAKKzB4RkYsMHhFNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgxOCwgMHgwMCwweDAyLCAweEE3LDB4MzIsIDB4NTgsMHgwMiwgMHhDNiwweEIwLCAKKzB4NTgsMHgwMCwgMHg3NiwweEI1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhFOCwgMHhDNiwweEIwLCAweDQwLDB4MDAsIDB4NzcsMHhCOCwgMHgwMCwweDE4LCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAwLCAKKzB4RjUsMHg3RCwgMHhGNywweDM3LCAweDY4LDB4MDAsIDB4RjUsMHgwMiwgMHhGRiwweEZGLCAweEM3LDB4MzAsIDB4NDgsMHgwMCwgMHhGNSwweDNCLCAKKzB4NjgsMHgwMCwgMHgyNCwweEE0LCAweDAwLDB4MDIsIDB4MjQsMHgyMCwgMHgwMCwweDAyLCAweEUwLDB4MDAsIDB4RjUsMHgzNCwgMHgyNSwweEFDLCAKKzB4MDAsMHgwMSwgMHhGMywweDA2LCAweDE0LDB4RDgsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweEYzLDB4MDIsIDB4MDAsMHgzNCwgMHg5MywweDEzLCAKKzB4RkYsMHhGQywgMHg4MywweDE2LCAweEZGLDB4RjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg4MywweDE2LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDc2LDB4OTksIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhFQSwweEI4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDEwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgxMCwgMHhGNywweDA0LCAKKzB4NzUsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4RjYsMHgzOSwgMHhGNiwweDA2LCAKKzB4NDIsMHg5NiwgMHhGNywweDA0LCAweDQyLDB4OTQsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhGNCwweDAyLCAKKzB4MDAsMHgwMCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhFMCwweDAwLCAKKzB4RjcsMHg0OCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4RjUsMHgwNCwgMHg2RiwweDMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDE2LCAKKzB4RkYsMHhGNCwgMHg5MCwweDEzLCAweEZGLDB4RkMsIDB4MjcsMHgyOCwgMHgwMCwweDAyLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg4NSwweDk2LCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4Q0QsMHhCOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHgwMCwweDA0LCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHg4NiwweEFBLCAKKzB4MDAsMHgwMCwgMHg3NywweDI5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAKKzB4RkYsMHhGMCwgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3NCwweDAwLCAweEU2LDB4MDAsIDB4RjYsMHg5OSwgMHg5NiwweDk2LCAKKzB4RkYsMHhFQywgMHhDNiwweDM4LCAweDAwLDB4MDAsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweDg1LDB4OTYsIDB4RkYsMHhFQywgMHg4NSwweDE2LCAKKzB4RkYsMHhGNCwgMHg0NywweDJDLCAweEZGLDB4RkUsIDB4MDcsMHgzOCwgMHgwMCwweDAyLCAweEM3LDB4MjgsIDB4NzIsMHgwMCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHg4NSwweDk2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENELDB4QjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4MTYsIDB4RkYsMHhGNCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMiwgMHg5NywweDJBLCAweDAwLDB4MDgsIDB4ODUsMHg5NiwgMHgwMCwweDA4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweEFBLCAKKzB4MDAsMHgwQywgMHg4NSwweDk2LCAweDAwLDB4MEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4QUEsIDB4MDAsMHgxQywgMHhGNSwweDA2LCAKKzB4MTQsMHhEOCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4RjUsMHg4MiwgMHgwMCwweDIwLCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAKKzB4RkYsMHhGNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDg1LDB4OTYsIDB4MDAsMHgwMCwgMHg4NSwweDE2LCAKKzB4RkYsMHhFQywgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4QzcsMHgzOCwgMHg1MCwweDAwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg4NSwweDk2LCAKKzB4RkYsMHhGNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RUEsMHhCOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgxMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHg4NSwweDk2LCAweDAwLDB4MDAsIDB4ODUsMHgxNiwgMHgwMCwweDA0LCAweDg3LDB4MTYsIDB4MDAsMHgwOCwgMHhGNiwweDAyLCAKKzB4RkYsMHhGQywgMHgwNiwweEE4LCAweDAwLDB4MDMsIDB4QzYsMHhCNCwgMHg2NCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgwMywgMHhDNywweDM4LCAKKzB4NjQsMHgwMCwgMHhDNywweDM0LCAweDcwLDB4MDAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEM1LDB4QUMsIDB4NkEsMHgwMCwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDAyLCAweDAwLDB4MDMsIDB4QzUsMHgyOCwgMHg3NCwweDAwLCAweEY3LDB4MDIsIDB4MDAsMHgwNCwgMHhDNywweDM4LCAKKzB4NTIsMHgwMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MTQsMHhEOCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgxMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAKKzB4MDAsMHgxMCwgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4RjgsMHgwRCwgMHhGNiwweDA2LCAweDQyLDB4OTYsIDB4RjcsMHgwNCwgMHg0MiwweDk0LCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhGNCwweDAyLCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweEY5LDB4MjAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweEY1LDB4MDQsIDB4NkYsMHgzMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NSwweDE2LCAweEZGLDB4RjQsIDB4OTAsMHgxMywgMHhGRiwweEZDLCAweDI3LDB4MjgsIDB4MDAsMHgwMiwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHg4NSwweDk2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENELDB4QjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4MTYsIDB4MDAsMHgwNCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMCwgMHg4NiwweEFBLCAweDAwLDB4MDAsIDB4NzcsMHgyOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzQsMHgwMCwgMHhFNiwweDAwLCAKKzB4RjgsMHg2RCwgMHg5NiwweDk2LCAweEZGLDB4RUMsIDB4QzYsMHgzOCwgMHgwMCwweDAwLCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHg4NSwweDk2LCAKKzB4RkYsMHhFQywgMHg4NSwweDE2LCAweEZGLDB4RjQsIDB4NDcsMHgyQywgMHhGRiwweEZFLCAweDA3LDB4MzgsIDB4MDAsMHgwMiwgMHhDNywweDI4LCAKKzB4NzIsMHgwMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODUsMHg5NiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDRCwweEI4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAKKzB4RkYsMHhGNCwgMHhGNSwweDgyLCAweDAwLDB4MDYsIDB4RjUsMHhBQiwgMHgyOCwweDAwLCAweDg1LDB4OTYsIDB4MDAsMHgwOCwgMHgwNywweDI4LCAKKzB4MDAsMHgwMiwgMHg5NSwweEFBLCAweDAwLDB4MDQsIDB4MDUsMHgxNCwgMHgwMCwweDBFLCAweDg1LDB4MkEsIDB4MDAsMHgwMCwgMHg3NywweEE5LCAKKzB4MDAsMHgxRSwgMHg3NywweEJDLCAweEZGLDB4RTUsIDB4QzUsMHgyOCwgMHg3RiwweEMwLCAweDc1LDB4MjksIDB4RkYsMHhGMCwgMHhGNSwweDNCLCAKKzB4MjgsMHgwMCwgMHhGNSwweDg2LCAweDE0LDB4RDgsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDIsIDB4MDAsMHgwOCwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHg4NSwweDk2LCAweDAwLDB4MDAsIDB4ODUsMHgxNiwgMHhGRiwweEVDLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhDNywweDM4LCAKKzB4NTAsMHgwMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODUsMHg5NiwgMHhGRiwweEY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhGNywweDVDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDEwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgwOCwgMHhGNywweDA0LCAKKzB4NzUsMHhFQywgMHg4MywweDk2LCAweDAwLDB4MDQsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4RkEsMHg2NCwgMHhGNiwweDA2LCAKKzB4NDIsMHg5NiwgMHhGNSwweDA0LCAweDZGLDB4MzAsIDB4OTAsMHgxMywgMHhGRiwweEZDLCAweDI3LDB4MjgsIDB4MDAsMHgwMiwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHg4MywweDE2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg5MywweDk2LCAKKzB4RkYsMHhGNCwgMHg5NSwweDE2LCAweEZGLDB4RjAsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0QsMHhCOCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NSwweDE2LCAweEZGLDB4RjAsIDB4RjMsMHgwMiwgMHgwMCwweDA3LCAweDgzLDB4OTYsIDB4RkYsMHhGNCwgMHhGMywweDJCLCAKKzB4MjgsMHgwMCwgMHgwNywweDI4LCAweDAwLDB4MDIsIDB4RjMsMHgwMiwgMHgwMCwweDAxLCAweEYzLDB4M0IsIDB4MjgsMHgwMCwgMHg4NywweDFFLCAKKzB4MDAsMHgwMCwgMHg3NiwweDlELCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDA1LDB4OUMsIDB4MDAsMHgwMiwgMHg3NiwweDJELCAKKzB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4NzQsMHg5RCwgMHgwMCwweDFFLCAweDc0LDB4QTQsIDB4RkYsMHhFNSwgMHgwNCwweDFDLCAKKzB4MDAsMHgwNiwgMHg4MywweDE2LCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHgwNiwweEE4LCAKKzB4MDAsMHgwNCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDA2LDB4QTgsIDB4MDAsMHgwNiwgMHg3NSwweEExLCAKKzB4MDAsMHgxRSwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDFFLCAKKzB4MDAsMHgwNCwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4MDYsMHhBOCwgMHgwMCwweDA4LCAweDc2LDB4MTksIDB4MDAsMHgxRSwgMHhDNywweDM4LCAKKzB4NEYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MjIsIDB4MDAsMHgwMCwgMHgwNiwweEE4LCAKKzB4MDAsMHgwQSwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHhGMywweDA2LCAKKzB4MTQsMHhEOCwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4RjMsMHgwMiwgMHgwMCwweDBDLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg4MywweDE2LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEY3LDB4NUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4RkEsMHg4NCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDQyLDB4OTQsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhGNCwweDAyLCAKKzB4MDAsMHgwMCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDMzLCAKKzB4MjgsMHgwMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwOCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAKKzB4MDAsMHg0OCwgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4ODUsMHg5NiwgMHgwMCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4RkQsMHg5OCwgMHhGNiwweDA2LCAweDQyLDB4OTYsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4MjQsMHgxNCwgMHgwMCwweDFFLCAweDA2LDB4MkMsIDB4MDAsMHgwMiwgMHg3NSwweDMxLCAKKzB4MDAsMHgxRSwgMHgyNCwweDk0LCAweDAwLDB4MjAsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweEYzLDB4ODQsIDB4NkUsMHg1MCwgMHhDNywweDM4LCAKKzB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg5MywweDk2LCAKKzB4RkYsMHhDNCwgMHhDNywweDM4LCAweDU3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHgyNCwweDE0LCAKKzB4MDAsMHgxQywgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHgyNCwweDE0LCAKKzB4MDAsMHgxQSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHgyNCwweDE0LCAKKzB4MDAsMHgxOCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHgyNCwweDE0LCAKKzB4MDAsMHgxNiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHgyNCwweDE0LCAKKzB4MDAsMHgxNCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHgyNCwweDE0LCAKKzB4MDAsMHgxMiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4MjQsMHgxNCwgMHgwMCwweDEwLCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHg5MCwweDEzLCAKKzB4RkYsMHhGQywgMHgyNywweDFDLCAweDAwLDB4MDIsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHg5NSwweDk2LCAKKzB4RkYsMHhCQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDRCwweEI4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDk2LCAKKzB4RkYsMHhCQywgMHgyMywweDE0LCAweDAwLDB4MzYsIDB4MjQsMHg5NCwgMHgwMCwweDM4LCAweDczLDB4QTUsIDB4MDAsMHgxRSwgMHg3MywweDlDLCAKKzB4RkYsMHhFNSwgMHhGNCwweDA0LCAweDQyLDB4QzAsIDB4RjYsMHg4NiwgMHg0MiwweEMwLCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHgyRCwgMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNCwweDIwLCAKKzB4NkYsMHhDMCwgMHg3NCwweDIwLCAweEZGLDB4RjAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDc1LDB4MkQsIDB4MDAsMHgxRSwgMHg3NSwweDI4LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHg4NywweDJFLCAKKzB4MDAsMHgwMCwgMHhGNiwweDA0LCAweDZFLDB4NTAsIDB4QzcsMHgzOCwgMHg1NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFCLCAKKzB4MjgsMHgwMCwgMHgyMywweDE0LCAweDAwLDB4MzQsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFCLCAKKzB4MjgsMHgwMCwgMHgyMywweDE0LCAweDAwLDB4MzIsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFCLCAKKzB4MjgsMHgwMCwgMHgyMywweDE0LCAweDAwLDB4MzAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFCLCAKKzB4MjgsMHgwMCwgMHgyMywweDE0LCAweDAwLDB4MkUsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFCLCAKKzB4MjgsMHgwMCwgMHgyMywweDE0LCAweDAwLDB4MkMsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFCLCAKKzB4MjgsMHgwMCwgMHgyMywweDE0LCAweDAwLDB4MkEsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFCLCAKKzB4MjgsMHgwMCwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDIzLDB4MTQsIDB4MDAsMHgyOCwgMHg3NSwweEFELCAKKzB4MDAsMHgxRSwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFCLCAKKzB4MjgsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4QzgsIDB4RjYsMHg4MiwgMHgwMCwweDAzLCAweEM3LDB4MzgsIDB4M0YsMHhDMCwgMHg5NiwweEIyLCAKKzB4MDAsMHgwOCwgMHgwNiwweEIwLCAweDFELDB4RDgsIDB4RjQsMHgzNywgMHgyOCwweDAwLCAweEYzLDB4ODYsIDB4MTQsMHhEOCwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHhGMywweDgyLCAweDFELDB4RTAsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhFQSwweEI4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAKKzB4RkQsMHhCOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0MiwweDk0LCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhGNCwweDAyLCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwNCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHg4NiwweDE2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwNiwgMHhFNiwweDAwLCAweEZFLDB4MjEsIDB4RjUsMHg4MiwgMHgwMCwweDFFLCAweEY3LDB4MDQsIDB4NDIsMHhBOCwgMHhGNiwweDA2LCAKKzB4NDIsMHhBOCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAKKzB4RkYsMHhGMCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RTAsMHgwMCwgMHhGRSwweDM0LCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHhGNiwweDA1LCAKKzB4NkYsMHgzNCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwNCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NiwweDE2LCAKKzB4MDAsMHgwMCwgMHg4NSwweDk2LCAweDAwLDB4MDQsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDIwLDB4M0EsIDB4MDAsMHgwNywgMHhFNiwweDAwLCAKKzB4RkUsMHg5RCwgMHhGNCwweDAyLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg0MiwweEE4LCAweEY2LDB4MDYsIDB4NDIsMHhBQSwgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhFMCwweDAwLCAweEZGLDB4MUMsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDA3LDB4MzAsIDB4MDAsMHgwMiwgMHg4NiwweEJBLCAKKzB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAKKzB4RkYsMHhGMCwgMHgyMCwweDM2LCAweDAwLDB4MDEsIDB4RTYsMHgwMCwgMHhGRSwweEQ1LCAweEY2LDB4MDUsIDB4NkYsMHgzNCwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMiwgMHhFNiwweDAwLCAweEZFLDB4RTUsIDB4RjUsMHgwMiwgMHgwMCwweDIwLCAweEUwLDB4MDAsIDB4RkUsMHhGQywgMHhGNiwweDA2LCAKKzB4NDIsMHhBQywgMHgyMCwweDJFLCAweDAwLDB4MEMsIDB4RTYsMHgwMCwgMHhGRiwweDFDLCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHhGNSwweDAyLCAKKzB4MDAsMHgxRiwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhFMCwweDAwLCAweEZGLDB4MUMsIDB4RjQsMHgwMiwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NDIsMHhBQywgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4RjQsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDgsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODYsMHg5NiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAKKzB4MDAsMHgwNCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDA4LCAweDk3LDB4MzYsIDB4MDAsMHgwNCwgMHg4NywweDM2LCAKKzB4MDAsMHgwOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEVDLDB4MDAsIDB4RkYsMHg3RCwgMHhGNiwweDg1LCAKKzB4NkYsMHgzNCwgMHg4NywweDM2LCAweDAwLDB4MDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMywgMHhFRSwweDAwLCAKKzB4RkYsMHg4MCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAKKzB4RkYsMHhCRCwgMHhGNiwweDA2LCAweDQyLDB4QUUsIDB4RjcsMHgwNCwgMHg2RiwweDM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDNBLCAKKzB4MDAsMHgwOCwgMHhGNiwweDgyLCAweEZGLDB4RUMsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEE3LDB4M0EsIDB4NjgsMHgwMiwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhFMCwweDAwLCAweEZGLDB4RDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NDIsMHhBQywgMHg3NiwweEIxLCAKKzB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwNCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDAwLDB4MDAsIDB4MDAsMHgxNywgMHgwMCwweDAwLCAKKzB4MDAsMHgxQSwgMHgwMCwweDAwLCAweDAwLDB4MUQsIDB4MDAsMHgwMCwgMHgwMCwweDE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHg1NiwweDY1LCAKKzB4NzIsMHg3MywgMHg2OSwweDZGLCAweDZFLDB4NTMsIDB4NzQsMHg3MiwgMHg2OSwweDZFLCAweDY3LDB4M0EsIDB4MjAsMHg2RCwgMHg2MywweDcwLCAKKzB4MkQsMHg2QywgMHgzNCwweDc2LCAweDMzLDB4MjAsIDB4MzMsMHgyRSwgMHgzMCwweDM4LCAweDYzLDB4MjAsIDB4NDQsMHg2NSwgMHg2MywweDIwLCAKKzB4MzEsMHgzMSwgMHgyMCwweDMxLCAweDM5LDB4MzksIDB4MzYsMHgyMCwgMHgzMSwweDMzLCAweDNBLDB4MzAsIDB4MzYsMHgzQSwgMHgzMSwweDM2LCAKKzB4MDAsMHgwMCwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY3LDB4MDQsIDB4RTAsMHgwQywgMHhGRiwweDAyLCAKKzB4MDAsMHgwMCwgMHg5NywweDAyLCAweEZGLDB4ODQsIDB4RjcsMHgwNiwgMHgwQywweDNFLCAweENGLDB4RkMsIDB4NzUsMHg4MCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMiwgMHg5NiwweDAyLCAweEZGLDB4OEMsIDB4OTAsMHgwMiwgMHhGRiwweDg4LCAweEY3LDB4MDQsIDB4RTAsMHgyMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgwMCwweDc0LCAweEY2LDB4ODIsIDB4MDAsMHgwMCwgMHhGNiwweDgyLCAKKzB4MDAsMHgwMywgMHg5NiwweDgyLCAweEZGLDB4OTgsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MEMsIDB4RjUsMHgwMiwgMHgxNCwweDk0LCAweEY1LDB4MDUsIDB4N0IsMHgwMCwgMHhGNSwweDBFLCAKKzB4RjAsMHgxNCwgMHhGNSwweDA1LCAweDdCLDB4MDgsIDB4RjcsMHgwNiwgMHhFMCwweDAwLCAweEY2LDB4ODYsIDB4N0IsMHg2OCwgMHhDNywweDM4LCAKKzB4NkEsMHgwMCwgMHhGNywweDA1LCAweDdBLDB4RjAsIDB4RjUsMHgwMiwgMHgwMCwweDRDLCAweEY2LDB4ODIsIDB4MDAsMHgwMCwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMiwgMHhFRSwweDAxLCAweDAxLDB4MjQsIDB4RjUsMHgwNSwgMHg3QSwweEY4LCAweEM1LDB4QjQsIDB4MDAsMHgwMCwgMHhDNiwweDM0LCAKKzB4MDAsMHgwMCwgMHhGNywweDA2LCAweEUwLDB4MzAsIDB4QzcsMHgyQywgMHg3MCwweDAwLCAweEY1LDB4MDYsIDB4NkYsMHg0NCwgMHhCNywweDMyLCAKKzB4NTAsMHgwMiwgMHg5MCwweDEzLCAweEZGLDB4RkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4OTYsIDB4RkYsMHhGNCwgMHg5NiwweDE2LCAKKzB4RkYsMHhGMCwgMHg5NiwweDk2LCAweEZGLDB4RUMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MDMsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NSwweDk2LCAweEZGLDB4RjQsIDB4ODYsMHgxNiwgMHhGRiwweEYwLCAweDg2LDB4OTYsIDB4RkYsMHhFQywgMHgwNSwweEFDLCAKKzB4MTQsMHg5NCwgMHgwNiwweEI0LCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAyLCAweEVFLDB4MDEsIDB4MDAsMHhENSwgMHgwNiwweDMwLCAKKzB4MDAsMHgwNCwgMHhGNSwweDAyLCAweDAwLDB4MjIsIDB4RjUsMHgwNSwgMHg2RiwweDU4LCAweEYwLDB4MDUsIDB4NkYsMHg1NCwgMHhGMCwweDA1LCAKKzB4NkYsMHg1MCwgMHhGMCwweDA1LCAweDJELDB4NDAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyOSwweDU4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDAyLCAKKzB4MDAsMHgwMywgMHhGNywweDA1LCAweEUwLDB4MDgsIDB4RjcsMHgwNCwgMHg3QSwweEQ4LCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg5NiwweDAyLCAKKzB4RkYsMHg5NCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgwMSwweDkxLCAweEY3LDB4MDYsIDB4N0EsMHhFOCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDAzLDB4REMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4N0EsMHhFOCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwNSwgMHhGNiwweDNCLCAweDI4LDB4MDAsIDB4RjcsMHgwNiwgMHg3QSwweEUwLCAweDg2LDB4ODIsIDB4RkYsMHg0NCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMywgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgwMSwweEM5LCAweEY2LDB4M0IsIDB4MjgsMHgwMCwgMHhGNywweDA0LCAKKzB4NkYsMHg2NCwgMHg4NiwweDgyLCAweEZGLDB4NDQsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MDEsMHhCMCwgMHhGNywweDA1LCAweDZGLDB4NjQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MDAsMHgzNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgwMCwweDhDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDQ0LDB4MjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHhGMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MEMsMHg2MCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgwNCwweDA4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDAwLDB4MjAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MEIsMHhEOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MUQsMHg2OCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxRSwweDUwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDVGLDB4NjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4NkQsMHhFQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjEsMHhEMCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyMiwweDJDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg5MCwweDAyLCAKKzB4RkYsMHg5NCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgwQiwweEZDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNCwweDAyLCAKKzB4MDAsMHgwMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAKKzB4MDAsMHgwOCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4QzUsMHhCMCwgMHgwMCwweDAwLCAweDIwLDB4MzIsIDB4MDAsMHgwMiwgMHhFRSwweDAxLCAKKzB4MDMsMHgwOCwgMHhGNSwweDA2LCAweDZGLDB4NDQsIDB4QTYsMHhBRSwgMHg1MCwweDAyLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAxLCAweEU2LDB4MDEsIDB4MDIsMHhGQywgMHhGNSwweDAyLCAKKzB4MDAsMHgwMiwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4OTYsIDB4RkYsMHhGNCwgMHg5NiwweDE2LCAKKzB4RkYsMHhGMCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgwMywweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NiwweDE2LCAKKzB4RkYsMHhGMCwgMHg4NSwweDk2LCAweEZGLDB4RjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA1LDB4QUMsIDB4MDAsMHgwNCwgMHhFMCwweDAxLCAKKzB4MDIsMHhBQywgMHgwNiwweDMwLCAweDAwLDB4MDEsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHg4NywweDE2LCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweEY2LDB4ODIsIDB4MDAsMHgwOCwgMHg5NiwweDNBLCAKKzB4MDAsMHgwOCwgMHg5NiwweDNBLCAweDAwLDB4MEMsIDB4OTYsMHgzQSwgMHgwOSwweEQ4LCAweDk2LDB4M0EsIDB4MDksMHhEQywgMHg5NiwweDNBLCAKKzB4MEUsMHhGNCwgMHg5NiwweDNBLCAweDBFLDB4RjgsIDB4OTYsMHhCQSwgMHgxNCwweDIwLCAweDk2LDB4M0EsIDB4MTQsMHgyNCwgMHg5MCwweEJBLCAKKzB4MTQsMHg4QywgMHg4NiwweDk2LCAweDAwLDB4MDQsIDB4OTAsMHhCQSwgMHgxNCwweDkwLCAweDk2LDB4QkEsIDB4MDAsMHgwMCwgMHg5NiwweDNBLCAKKzB4MDAsMHgwNCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwOCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NSwweDk2LCAKKzB4MDAsMHgwMCwgMHg4NywweDE2LCAweDAwLDB4MDgsIDB4ODYsMHgxNiwgMHgwMCwweDA0LCAweDc3LDB4MzgsIDB4RkYsMHhGRiwgMHhDNSwweDMwLCAKKzB4NzAsMHgwMCwgMHhDMCwweDMyLCAweDUyLDB4MDAsIDB4RTQsMHgwMSwgMHgwMywweEM5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDJFLCAKKzB4MDAsMHgwMCwgMHg3NiwweEFELCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweEMwLDB4MzIsIDB4NTIsMHgwMCwgMHhFNCwweDAxLCAKKzB4MDMsMHhBMCwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwQywgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4RTAsMHgwMSwgMHgwMywweEU4LCAweEY3LDB4MDUsIDB4N0EsMHhEOCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwQSwgMHhGNSwweDA1LCAweDcxLDB4Q0MsIDB4RjAsMHgwNSwgMHg3MSwweEQ0LCAweEYwLDB4MDUsIDB4NzEsMHhEMCwgMHhGMCwweDA1LCAKKzB4NzEsMHhDNCwgMHhGNSwweDAyLCAweDAwLDB4MDEsIDB4RjYsMHg4MiwgMHgwMCwweDAwLCAweDIwLDB4MzYsIDB4MDAsMHgwQSwgMHhFQywweDAxLCAKKzB4MDQsMHg2NCwgMHhGNSwweDA1LCAweDcxLDB4QzgsIDB4RjUsMHg4QSwgMHgxRSwweDAwLCAweEY2LDB4MDYsIDB4NzEsMHhDNCwgMHg0NywweDJDLCAKKzB4RkYsMHhGQywgMHg5NywweDMyLCAweDAwLDB4MTgsIDB4MDYsMHgzMCwgMHgwMCwweDA0LCAweDA2LDB4QjQsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NzEsMHhDQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEVDLDB4MDEsIDB4MDQsMHg0MSwgMHgwNSwweEFDLCAKKzB4MjEsMHg0QywgMHhGMCwweDA1LCAweDcxLDB4OTgsIDB4RjUsMHgwNiwgMHg2RiwweDY4LCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAKKzB4N0IsMHgxOCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg0OCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDA2LCAweDA1LDB4RDQsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgwNSwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDA2LCAweDZGLDB4NjgsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHgwQiwweDcwLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAKKzB4MDAsMHgwNiwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHg2RiwweDY4LCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4MEIsMHhBMCwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MDUsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4NzAsMHg4MCwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAKKzB4MEIsMHg3MCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDA2LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAKKzB4NzAsMHg4MCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDA2LCAweDA1LDB4NTgsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweEY1LDB4MDIsIDB4MDAsMHgwQSwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHhGNSwweDA2LCAweDcxLDB4MEMsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MDUsMHg1OCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA0LCAKKzB4NzEsMHhDNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MDUsMHg3RCwgMHhGNiwweDg2LCAKKzB4NzEsMHhDNCwgMHhFMCwweDAxLCAweDA1LDB4OTQsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4NzEsMHhEMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDg3LDB4M0EsIDB4MDAsMHgxOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgwNSwweEFDLCAweEY3LDB4MDUsIDB4N0IsMHgxMCwgMHhGNiwweDA2LCAKKzB4NzEsMHgwQywgMHhFMCwweDAxLCAweDA1LDB4QzAsIDB4RjYsMHgwNSwgMHg3QiwweDE4LCAweEY2LDB4MDYsIDB4NkYsMHg2OCwgMHhGNiwweDA1LCAKKzB4N0IsMHgxOCwgMHg5NywweDAyLCAweEZGLDB4NDgsIDB4MDcsMHgzOCwgMHgyMSwweDI4LCAweDk3LDB4MDIsIDB4RkYsMHg0QywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgxMCwgMHg4NiwweDgyLCAKKzB4RkYsMHg0OCwgMHhGNCwweDg2LCAweDZGLDB4NjgsIDB4RjQsMHg4NSwgMHg3QiwweDE4LCAweEY1LDB4MDQsIDB4N0IsMHgxMCwgMHgyNiwweEI0LCAKKzB4MDAsMHgwMiwgMHg4NSwweEI2LCAweDAwLDB4MDAsIDB4ODcsMHgyQSwgMHgwMCwweDAwLCAweDc2LDB4MjksIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAKKzB4RkYsMHhFNSwgMHg3NiwweEI1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM1LDB4QUMsIDB4NkYsMHhDMCwgMHhDNywweDM4LCAKKzB4NjcsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4NzcsMHhCOCwgMHgwMCwweDEwLCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAxLCAKKzB4MDYsMHg0NSwgMHg3NSwweEFDLCAweEZGLDB4RjAsIDB4RjcsMHgwNCwgMHg3MSwweEFDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDcxLDB4QUMsIDB4RjcsMHgwNCwgMHg3MSwweEFDLCAweEUwLDB4MDEsIDB4MDgsMHhDNCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMSwgMHg3NywweDJDLCAweEZGLDB4RjgsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MDYsMHg3MSwgMHg3NiwweEE5LCAKKzB4MDAsMHgxRSwgMHhGNywweDA0LCAweDcxLDB4QTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4NzEsMHhBOCwgMHhGNywweDA0LCAweDcxLDB4QTgsIDB4RTAsMHgwMSwgMHgwOCwweEM0LCAweEY3LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDJBLCAKKzB4MDAsMHgwMCwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgyNywweDM4LCAKKzB4MDAsMHgwNCwgMHgyMCwweDNBLCAweDAwLDB4MDMsIDB4RTIsMHgwMSwgMHgwOCwweEE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhGNiwweDg2LCAweDA2LDB4QTQsIDB4QTYsMHhCNiwgMHg3MCwweDAyLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMSwweDM0LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4QjQsIDB4MDAsMHgwMSwgMHgwNywweDdDLCAweDAwLDB4MDEsIDB4MDcsMHhFQywgMHgwMCwweDAxLCAKKzB4MDgsMHg0NCwgMHg4NywweDJBLCAweDAwLDB4MDQsIDB4QzQsMHg4NCwgMHgwMCwweDAwLCAweEMwLDB4M0EsIDB4NEEsMHgwMCwgMHhFNiwweDAxLCAKKzB4MDYsMHhEOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgwMiwgMHhGRiwweDQ4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NTIsMHgwMCwgMHg5NywweDJBLCAweDAwLDB4MDQsIDB4ODcsMHgyQSwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MjEsMHgwMCwgMHhFRSwweDAxLCAweDA3LDB4M0MsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDg2LDB4QUEsIDB4MDAsMHgwNCwgMHg4NywweDAyLCAKKzB4RkYsMHg0OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg1MiwweDAwLCAweDI3LDB4MzgsIDB4MDAsMHgyOCwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFNiwweDAxLCAweDA3LDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4RkMsIDB4MDAsMHgxRCwgMHg3MCwweDNFLCAKKzB4RkYsMHhFMSwgMHhFNiwweDAxLCAweDA3LDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4RkMsIDB4MDAsMHgxNywgMHg3MCwweDNFLCAKKzB4RkYsMHhFMSwgMHhFNiwweDAxLCAweDA3LDB4M0QsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4RkMsIDB4MDAsMHgxNiwgMHg3MCwweDNFLCAKKzB4RkYsMHhFMSwgMHhFNiwweDAxLCAweDA3LDB4NDQsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDA4LDB4ODgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MkEsIDB4MDAsMHgxOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDIsIDB4RUUsMHgwMSwgMHgwOCwweEMxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NzEsMHhBNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzEsMHhBNCwgMHhGNywweDA0LCAKKzB4NzEsMHhBNCwgMHhFMCwweDAxLCAweDA4LDB4QzQsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MkEsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDIxLDB4MDAsIDB4RUUsMHgwMSwgMHgwNywweEUwLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHg4NiwweEFBLCAKKzB4MDAsMHgwNCwgMHg4NywweDAyLCAweEZGLDB4NDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NTIsMHgwMCwgMHgyNywweDM4LCAKKzB4MDAsMHgwQywgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMSwgMHgwNywweEUwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEZDLCAKKzB4MDAsMHgxRCwgMHg3MCwweDNFLCAweEZGLDB4RTEsIDB4RTYsMHgwMSwgMHgwNywweEUwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEZDLCAKKzB4MDAsMHgxNywgMHg3MCwweDNFLCAweEZGLDB4RTEsIDB4RTYsMHgwMSwgMHgwNywweEUxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEZDLCAKKzB4MDAsMHgxNiwgMHg3MCwweDNFLCAweEZGLDB4RTEsIDB4RTYsMHgwMSwgMHgwOCwweDgwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHhFMCwweDAxLCAweDA4LDB4ODAsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweDg3LDB4MDIsIDB4RkYsMHg0OCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDNywweDM4LCAweDUyLDB4MDAsIDB4MjcsMHgzOCwgMHgwMCwweDA0LCAweDIwLDB4M0EsIDB4MDAsMHgwOCwgMHhFNiwweDAxLCAKKzB4MDgsMHgzOCwgMHhGNiwweDgyLCAweDAwLDB4MDAsIDB4NzcsMHhGQywgMHgwMCwweDFELCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAxLCAKKzB4MDgsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhGQywgMHgwMCwweDE3LCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAxLCAKKzB4MDgsMHgzOSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhGQywgMHgwMCwweDE2LCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAxLCAKKzB4MDgsMHg4MCwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RjYsMHg4MiwgMHgwMCwweDAxLCAweEUwLDB4MDEsIDB4MDgsMHg4MCwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMCwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4NzcsMHhGQywgMHgwMCwweDFELCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAxLCAKKzB4MDgsMHg3OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhGQywgMHgwMCwweDE3LCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAxLCAKKzB4MDgsMHg3OSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhGQywgMHgwMCwweDE2LCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAxLCAKKzB4MDgsMHg4MCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MDgsMHhDMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3MSwweEEwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDcxLDB4QTAsIDB4RjcsMHgwNCwgMHg3MSwweEEwLCAweEUwLDB4MDEsIDB4MDgsMHhDNCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDcxLDB4OUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4NzEsMHg5QywgMHhGNywweDA0LCAweDcxLDB4OUMsIDB4RTAsMHgwMSwgMHgwOCwweEM0LCAweEY3LDB4MDIsIDB4MDAsMHgwMSwgMHhGNywweDAyLCAKKzB4MDAsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgwOSwweDY4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNiwweDg0LCAKKzB4N0IsMHgxMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAKKzB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDI3LDB4MzgsIDB4MDAsMHgwNCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMywgMHhFMiwweDAxLCAweDBCLDB4NTAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY2LDB4ODYsIDB4MDksMHgwQywgMHhBNiwweEI2LCAKKzB4NzAsMHgwMiwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzEsMHgzNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDksMHgxQywgMHgwMCwweDAxLCAKKzB4MEEsMHhFMCwgMHgwMCwweDAxLCAweDBBLDB4QUMsIDB4MDAsMHgwMSwgMHgwQiwweDE0LCAweEY3LDB4MDQsIDB4NzEsMHhEMCwgMHhGNiwweDA0LCAKKzB4NzEsMHhDQywgMHgwNiwweEI4LCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg2MiwweDAwLCAweEU2LDB4MDEsIDB4MDksMHgzOCwgMHhDNywweDM0LCAKKzB4MDAsMHgwMCwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4RjUsMHg4NCwgMHg3MSwweEQ0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAKKzB4NUEsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MDksMHg4NSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDcxLDB4QjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4NzEsMHhCMCwgMHhGNywweDA0LCAweDcxLDB4QjAsIDB4RjcsMHgwNCwgMHg3MSwweEI0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDcxLDB4QjQsIDB4RjcsMHgwNCwgMHg3MSwweEI0LCAweEUwLDB4MDEsIDB4MEIsMHg1MCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNCwweDg0LCAweDcxLDB4QzgsIDB4RjYsMHg4NSwgMHg3MSwweEQwLCAweDk0LDB4OTYsIDB4RkYsMHhGNCwgMHhGNCwweDg0LCAKKzB4N0IsMHgxMCwgMHhDMCwweDM2LCAweDYyLDB4MDAsIDB4RTYsMHgwMSwgMHgwOSwweEE0LCAweDk0LDB4OTYsIDB4RkYsMHhFQywgMHhGMCwweDA1LCAKKzB4NzEsMHhEMCwgMHhGNywweDA0LCAweDcxLDB4RDAsIDB4RjAsMHgwNSwgMHg3MSwweEM4LCAweDg0LDB4OTYsIDB4RkYsMHhFQywgMHhDMCwweDNBLCAKKzB4NUEsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3MSwweEM0LCAweDg3LDB4MjYsIDB4MDAsMHgwOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3MCwweDNBLCAweEZGLDB4RTEsIDB4RTYsMHgwMSwgMHgwOSwweEUxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NzEsMHg5OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzEsMHg5OCwgMHg4NCwweDk2LCAKKzB4RkYsMHhGNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyNiwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MEEsMHg3MSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgwNSwweDU4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDAyLCAKKzB4MDAsMHgwOSwgMHgyMCwweDMyLCAweDAwLDB4MTQsIDB4RTYsMHgwMSwgMHgwQSwweDRELCAweDI3LDB4MDAsIDB4MDAsMHgwQywgMHgyMCwweDNBLCAKKzB4MDAsMHgwMSwgMHhFMiwweDAxLCAweDBBLDB4NEQsIDB4RjcsMHgwNiwgMHgyRCwweENDLCAweEY2LDB4ODQsIDB4MkUsMHhDQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NSwweEI1LCAweDAwLDB4MDIsIDB4QjYsMHgyRSwgMHg3MCwweDAyLCAweDA2LDB4QjQsIDB4MDAsMHgwMSwgMHhGNiwweDg1LCAKKzB4MkUsMHhDQywgMHg4NiwweDAyLCAweEZGLDB4MzQsIDB4RjcsMHgwNiwgMHgyRSwweDRDLCAweDIwLDB4MzYsIDB4MDAsMHgxRiwgMHhFMiwweDAxLCAKKzB4MEEsMHg0RCwgMHhCNiwweDJFLCAweDcwLDB4MDIsIDB4RjAsMHgwNSwgMHgyRSwweENDLCAweEY3LDB4MDQsIDB4MkQsMHg2OCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDNBLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4M0EsIDB4MDAsMHgyOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4QzEsMHgzOCwgMHgwMCwweDAwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA0LCAKKzB4NzEsMHhCQywgMHg4NCwweDk2LCAweEZGLDB4RUMsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzEsMHhCQywgMHhGNywweDA0LCAKKzB4NzEsMHhCQywgMHg4NiwweEE2LCAweDAwLDB4MDQsIDB4ODQsMHg5NiwgMHhGRiwweEY0LCAweEY3LDB4MDQsIDB4NzEsMHhCOCwgMHgyMCwweDI2LCAKKzB4MDAsMHgwMCwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4RjcsMHgwNSwgMHg3MSwweEI4LCAweEU2LDB4MDEsIDB4MEIsMHg1MSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhFMCwweDAxLCAweDBCLDB4NUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzEsMHhDMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3MSwweEMwLCAweEY3LDB4MDQsIDB4NzEsMHhDMCwgMHhGNCwweDg0LCAKKzB4N0IsMHgxMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4RkQsMHhDQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMSwgMHgwQiwweDUwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NzEsMHhDMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzEsMHhDMCwgMHhGNywweDA0LCAKKzB4NzEsMHhDMCwgMHhGNCwweDg0LCAweDdCLDB4MTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEZGLDB4MzAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDEsIDB4MEIsMHg1MCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDcxLDB4QzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4NzEsMHhDMCwgMHhGNywweDA0LCAweDcxLDB4QzAsIDB4RjYsMHg4NCwgMHg3QiwweDEwLCAweDg3LDB4MDIsIDB4RkYsMHg0OCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDNywweDM4LCAweDZBLDB4MDAsIDB4MjcsMHgzOCwgMHgwMCwweDA0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg5NiwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhGRSwweDQ4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDA1LDB4NTgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNiwgMHg3MCwweDgwLCAweEY3LDB4MDUsIDB4N0IsMHgxOCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDA1LDB4NTgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNiwgMHg2RiwweDY4LCAweEY3LDB4MDUsIDB4N0IsMHgxOCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDA1LDB4NTgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNiwgMHg3QiwweDE4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4NkYsMHg2OCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDdCLDB4MTgsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NkYsMHhGNCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4N0IsMHgxOCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg3MCwweDgwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4N0IsMHgxOCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDcxLDB4MEMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjUsMHgwMiwgMHgwMCwweDA0LCAweEY1LDB4MDUsIDB4NzYsMHgwMCwgMHhGMCwweDA1LCAKKzB4NzYsMHgwOCwgMHhGMCwweDA1LCAweDc2LDB4MDQsIDB4RjAsMHgwNSwgMHg3NSwweEY4LCAweEY1LDB4MDIsIDB4MDAsMHgwMSwgMHhGNiwweDgyLCAKKzB4MDAsMHgwMCwgMHgyMCwweDM2LCAweDAwLDB4MDQsIDB4RUMsMHgwMSwgMHgwQywweEJDLCAweEY1LDB4MDUsIDB4NzUsMHhGQywgMHhGNSwweDhFLCAKKzB4NkEsMHhGOCwgMHhGNiwweDA2LCAweDc1LDB4RjgsIDB4NDcsMHgyQywgMHhGRiwweEZDLCAweDk3LDB4MzIsIDB4MDAsMHgxOCwgMHgwNiwweDMwLCAKKzB4MDAsMHgwNCwgMHgwNiwweEI0LCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NiwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFQywweDAxLCAweDBDLDB4OTksIDB4MDUsMHhBQywgMHgyMSwweDRDLCAweEY1LDB4MDYsIDB4NzIsMHgxOCwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHhGNSwweDA2LCAweDc2LDB4NDgsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTUsMHg0OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHgwRCwweEY0LCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAKKzB4MDAsMHgwRSwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHg3MiwweDE4LCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4MEQsMHhGNCwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MEUsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4NzIsMHhBNCwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAKKzB4MTMsMHgyQywgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDAxLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAKKzB4NzMsMHgzMCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDA2LCAweDE2LDB4QzgsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgwMSwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDA2LCAweDczLDB4QkMsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHgxOCwweDAwLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAKKzB4MDAsMHgxMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHg3NCwweDQ4LCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4MTYsMHg0MCwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MTAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4NzQsMHhENCwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAKKzB4MTMsMHgyQywgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4RjUsMHgwMiwgMHgwMCwweDEyLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAKKzB4NzUsMHg2MCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGMCwweDA1LCAweDc1LDB4RjAsIDB4RjAsMHgwNSwgMHg3NSwweEVDLCAweEYwLDB4MDUsIDB4NzUsMHhGNCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgzOCwgMHhGNywweDA0LCAKKzB4NzUsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MEUsMHgyOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MEUsMHgzRCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MTUsMHhEMCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhFMCwweDAxLCAweDEzLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhGQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgwRSwweDU5LCAweEY2LDB4ODYsIDB4NzUsMHhGOCwgMHhFMCwweDAxLCAKKzB4MEUsMHg2QywgMHhGNiwweDgyLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg3NiwweDA4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4ODYsMHhCQSwgMHgwMCwweDE4LCAweEY3LDB4MDQsIDB4NzYsMHhGQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgwRSwweDkwLCAweEY2LDB4ODUsIDB4NzYsMHg2MCwgMHhGMywweDA2LCAKKzB4NzYsMHg0OCwgMHhGMywweDA1LCAweDc2LDB4RkMsIDB4RTAsMHgwMSwgMHgwRSwweEE0LCAweEY3LDB4MDIsIDB4MDAsMHgwMSwgMHhGMywweDAyLCAKKzB4MDAsMHgxMCwgMHhGMywweDA1LCAweDc2LDB4RjgsIDB4RjMsMHgwNiwgMHg3NiwweDQ4LCAweEYzLDB4MDUsIDB4NzcsMHgwMCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxMywweDE1LCAweEYzLDB4MDYsIDB4NzQsMHg0OCwgMHhGNywweDA0LCAKKzB4NzUsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MEUsMHhEOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MEUsMHhFRCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MTYsMHg0MCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhFMCwweDAxLCAweDEzLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4NzYsMHg2MCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDcwLDB4M0EsIDB4RkYsMHhFMSwgMHhFNiwweDAxLCAKKzB4MEYsMHgyMSwgMHhGNCwweDgyLCAweDAwLDB4MDAsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MDAsMHhCQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMSwgMHgxMywweDE0LCAweEYzLDB4MDYsIDB4NzUsMHg2MCwgMHhDMywweEI0LCAKKzB4MDAsMHgwMCwgMHg4NCwweDFFLCAweDAwLDB4MTAsIDB4RjYsMHg4NCwgMHg0QSwweEEwLCAweDIzLDB4MTQsIDB4MDAsMHgyMCwgMHg5MywweDE2LCAKKzB4RkYsMHhDNCwgMHg5NCwweDE2LCAweEZGLDB4RTAsIDB4OTYsMHg5NiwgMHhGRiwweEQ0LCAweDg1LDB4MUUsIDB4MDAsMHgxNCwgMHhGNywweDA0LCAKKzB4NEEsMHg5QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEVDLDB4MDEsIDB4MTAsMHgwQywgMHg5NSwweDE2LCAKKzB4RkYsMHhFNCwgMHg3NywweDM1LCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDA2LCAKKzB4NEEsMHg5OCwgMHhDNiwweEI4LCAweDMwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDBDLCAweEM1LDB4ODQsIDB4MDAsMHgwMCwgMHg4NywweDM2LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg0MiwweDAwLCAweEU2LDB4MDEsIDB4MEYsMHg5QywgMHhDNiwweDI0LCAKKzB4MDAsMHgwMCwgMHg4NywweDM2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NTIsMHgwMCwgMHhFNiwweDAxLCAKKzB4MEYsMHhBMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MEYsMHhBRCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjUsMHg4MiwgMHgwMCwweDAwLCAweDg2LDB4MzYsIDB4MDAsMHgwMCwgMHg4NywweDE2LCAKKzB4RkYsMHhFMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzMiwgMHg3MiwweDAwLCAweEUyLDB4MDEsIDB4MEYsMHhFOCwgMHhGNSwweDAyLCAKKzB4MDAsMHgwMCwgMHhDMCwweDMyLCAweDcyLDB4MDAsIDB4RTYsMHgwMSwgMHgwRiwweEYwLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHg4NiwweEI2LCAKKzB4MDAsMHgwNCwgMHg4NywweDE2LCAweEZGLDB4RTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAxLCAKKzB4MEYsMHhGMSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RjUsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MTAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MTAsMHgxMCwgMHgyMCwweDI2LCAweDAwLDB4MDAsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MTAsMHg0NSwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgxNiwgMHhGRiwweEQ0LCAweEYzLDB4MDYsIDB4NEEsMHg5OCwgMHg3NiwweEI5LCAKKzB4MDAsMHgwMSwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4MzAsMHgwMCwgMHgwNiwweEI0LCAKKzB4MDAsMHgxNCwgMHg4NiwweEI2LCAweDAwLDB4MDAsIDB4OTcsMHgxNiwgMHhGRiwweEQ4LCAweEUwLDB4MDEsIDB4MTAsMHhCOCwgMHg5NiwweDk2LCAKKzB4RkYsMHhEQywgMHgyNywweDE0LCAweDAwLDB4MkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDgzLDB4MTYsIDB4RkYsMHhDNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4RjMsMHgwNiwgMHg0QSwweDk4LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg5MywweDk2LCAKKzB4RkYsMHhDQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNSwweDY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAKKzB4RkYsMHhDQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxMCwweEI1LCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDE2LCAKKzB4RkYsMHhENCwgMHhGMywweDA2LCAweDRBLDB4OTgsIDB4NzYsMHhCOSwgMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg3NiwweEI1LCAKKzB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDMwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDE0LCAweDg2LDB4QjYsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAKKzB4RkYsMHhEOCwgMHg5NiwweDk2LCAweEZGLDB4REMsIDB4RjcsMHgwNSwgMHg0QSwweEEwLCAweEUwLDB4MDEsIDB4MTAsMHhCQywgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTAsMHhDQywgMHhGNCwweDgyLCAKKzB4MDAsMHgwMSwgMHhFMCwweDAxLCAweDExLDB4MjQsIDB4RjQsMHg4MiwgMHgwMCwweDAwLCAweDg2LDB4OTYsIDB4RkYsMHhEOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg3NywweDM1LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNiwweDg2LCAKKzB4NDIsMHhDOCwgMHhBNiwweDNBLCAweDY4LDB4MDIsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDc1LDB4MzksIDB4MDAsMHgxRSwgMHg3NSwweDI4LCAKKzB4RkYsMHhFNSwgMHgwNSwweEI4LCAweDAwLDB4MDIsIDB4ODYsMHhBRSwgMHgwMCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgwNCwgMHg5NywweDE2LCAKKzB4RkYsMHhFQywgMHhDNiwweDMwLCAweDU3LDB4QzAsIDB4NzYsMHgzMCwgMHhGRiwweEYwLCAweDk2LDB4MTYsIDB4RkYsMHhGNCwgMHg3NSwweEFELCAKKzB4MDAsMHgxRSwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg1RiwweEMwLCAweDc2LDB4QjQsIDB4RkYsMHhGMCwgMHg5NiwweDk2LCAKKzB4RkYsMHhGMCwgMHgyMCwweDI2LCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxMSwweDM4LCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHhFMCwweDAxLCAKKzB4MTEsMHhDQywgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4ODYsMHg5NiwgMHhGRiwweEYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDM0LCAKKzB4NjgsMHgwMCwgMHhDNCwweDlDLCAweDcyLDB4MDAsIDB4QzAsMHgyRSwgMHg2QSwweDAwLCAweEVDLDB4MDEsIDB4MTEsMHg5OCwgMHhDNSwweDI0LCAKKzB4MDAsMHgwMCwgMHhDNiwweDJDLCAweDAwLDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhBNiwweEIyLCAKKzB4NzAsMHgwMiwgMHgwNSwweEFDLCAweDAwLDB4MDEsIDB4QzcsMHgzMCwgMHg3MCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNCwgMHhGRiwweEYwLCAweEY2LDB4QUIsIDB4MjgsMHgwMCwgMHgwNSwweDI4LCAKKzB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MkUsIDB4NzIsMHgwMCwgMHhFQywweDAxLCAKKzB4MTEsMHg1OSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4RjMsMHgwMiwgMHgwMCwweDAxLCAweEYzLDB4MDUsIDB4NzYsMHhGNCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHg4NywweDE2LCAweEZGLDB4RjAsIDB4ODYsMHg5RSwgMHgwMCwweDA0LCAweEM3LDB4MzgsIDB4NzAsMHgwMCwgMHhDNywweDM4LCAKKzB4NDgsMHgwMCwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEY0LCAweDA2LDB4QjQsIDB4MDAsMHgyMCwgMHg5NywweDAyLCAKKzB4RkYsMHg2QywgMHg5NCwweDgyLCAweEZGLDB4NTAsIDB4OTYsMHg4MiwgMHhGRiwweDU4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MTMsMHgxMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NiwweDVDLCAweEY1LDB4ODQsIDB4NzYsMHhGOCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDc2LDB4NUMsIDB4RjcsMHgwNCwgMHg3NiwweDVDLCAweDIwLDB4MkUsIDB4MDAsMHgyMSwgMHhFMiwweDAxLCAKKzB4MTIsMHgzMCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAxLCAKKzB4MTIsMHgxQywgMHhCNSwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEYzLDB4MDIsIDB4MDAsMHgyMiwgMHhGMywweDA1LCAKKzB4NzYsMHhGOCwgMHhGMywweDA0LCAweDc3LDB4MDAsIDB4RTAsMHgwMSwgMHgxMiwweDM0LCAweEYzLDB4MDUsIDB4NzYsMHhGQywgMHhGMCwweDA1LCAKKzB4NzYsMHhGQywgMHhGNywweDA0LCAweDc1LDB4RjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MTIsMHg3MSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4MDIsIDB4MDAsMHgwRiwgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAxLCAweDEyLDB4NzAsIDB4QjMsMHgzQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNywweDA0LCAKKzB4NzYsMHgwOCwgMHhGNiwweDg0LCAweDc2LDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHhFNiwweDAxLCAKKzB4MTIsMHg4QywgMHhGNywweDA1LCAweDc2LDB4MDgsIDB4RjAsMHgwNSwgMHg3NiwweDA4LCAweEY2LDB4ODQsIDB4NzYsMHgwOCwgMHhGNywweDA0LCAKKzB4NzYsMHgwNCwgMHhGMCwweDA1LCAweDc1LDB4RjgsIDB4RjYsMHgwNiwgMHg3NSwweEY4LCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxMiwweEI5LCAweEY3LDB4MDUsIDB4NzUsMHhGQywgMHhFMCwweDAxLCAKKzB4MTIsMHhDOCwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4NzcsMHgzNSwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg4NywweDNBLCAKKzB4MDAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTMsMHgwOSwgMHhGNywweDA1LCAKKzB4NzYsMHg2MCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjMsMHgwNiwgMHg3MiwweEE0LCAweEYzLDB4MDUsIDB4NzYsMHg0OCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDAyLCAKKzB4MDAsMHgwRSwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMSwgMHgxMywweDE4LCAweEIzLDB4M0EsIDB4NjgsMHgwMiwgMHhFMCwweDAxLCAKKzB4MTMsMHgxOCwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RTAsMHgwMSwgMHgxMywweDE0LCAweEYzLDB4MDYsIDB4NzIsMHgxOCwgMHhGMywweDA2LCAKKzB4NzMsMHgzMCwgMHhGMywweDA1LCAweDc2LDB4NDgsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHhGNywweDA0LCAweDc2LDB4NjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4QkEsIDB4MDAsMHgwNCwgMHhGNywweDA0LCAKKzB4NzYsMHg1NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweEY3LDB4MDUsIDB4NzYsMHg1NCwgMHhGNywweDA0LCAKKzB4NzYsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzYsMHg1OCwgMHhGNywweDA0LCAKKzB4NzUsMHhGOCwgMHhGNiwweDg0LCAweDc2LDB4NTgsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTMsMHg5RCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjUsMHgwMiwgMHgwMCwweDBGLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAxLCAKKzB4MTMsMHg5QywgMHhCNSwweDNBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY3LDB4MDQsIDB4NzYsMHgwOCwgMHhGNiwweDg0LCAKKzB4NzYsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDEsIDB4MTMsMHhCOCwgMHhGNywweDA1LCAKKzB4NzYsMHgwOCwgMHhGMCwweDA1LCAweDc2LDB4MDgsIDB4RjcsMHgwNCwgMHg3NiwweDA4LCAweEY2LDB4ODQsIDB4NzYsMHgwNCwgMHhGMCwweDA1LCAKKzB4NzUsMHhGOCwgMHhGNSwweDg0LCAweDc2LDB4RjgsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAKKzB4MDAsMHgyMSwgMHhFMiwweDAxLCAweDE0LDB4MTQsIDB4RjcsMHgwNSwgMHg3NSwweEZDLCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAxLCAweDE0LDB4MDAsIDB4QjUsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNSwweDAyLCAKKzB4MDAsMHgyMiwgMHhGNSwweDA1LCAweDc2LDB4RjgsIDB4RjUsMHgwNCwgMHg3NywweDAwLCAweEUwLDB4MDEsIDB4MTQsMHgxOCwgMHhGNSwweDA1LCAKKzB4NzYsMHhGQywgMHhGMCwweDA1LCAweDc2LDB4RkMsIDB4RjcsMHgwNCwgMHg3NSwweEVDLCAweEY1LDB4MDYsIDB4NzIsMHgxOCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDE0LDB4NDAsIDB4RjUsMHgwNSwgMHg3NiwweDQ4LCAweEY3LDB4MDQsIDB4NzUsMHhGMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxNCwweDU1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDE1LDB4RDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDEsIDB4MTQsMHhDNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MTQsMHg3MSwgMHhGNiwweDg2LCAweDc1LDB4RjgsIDB4RTAsMHgwMSwgMHgxNCwweDg4LCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHhGNywweDA0LCAKKzB4NzYsMHgwOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHg4NywweDNBLCAKKzB4MDAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTQsMHhDNSwgMHhGNywweDA1LCAKKzB4NzYsMHg2MCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjUsMHgwMiwgMHgwMCwweDBFLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAxLCAKKzB4MTQsMHhCQywgMHhCNSwweDNBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY1LDB4MDYsIDB4NzIsMHhBNCwgMHhGNSwweDA1LCAKKzB4NzYsMHg0OCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA0LCAKKzB4NzUsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTUsMHg0MCwgMHhGNCwweDAyLCAKKzB4MDAsMHgwMCwgMHg4NiwweDk2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY2LDB4ODUsIDB4NzUsMHhFQywgMHg4NiwweDk2LCAKKzB4MDAsMHgwOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHg4NSwgMHg3QiwweDM4LCAweDg2LDB4OTYsIDB4MDAsMHgwMCwgMHhGNywweDA0LCAKKzB4NzYsMHg0OCwgMHhGNiwweDg1LCAweDdCLDB4MzAsIDB4RjYsMHg4NiwgMHg3MiwweDE4LCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxNSwweDQxLCAweEY0LDB4MDIsIDB4MDAsMHgwMSwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDE1LDB4RDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY0LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDBDLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY3LDB4MDQsIDB4NzUsMHhGNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxNSwweEJDLCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHg4NiwweDk2LCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHg4NSwgMHg3NSwweEYwLCAweDg2LDB4OTYsIDB4MDAsMHgwOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNiwweDg1LCAweDdCLDB4NDgsIDB4ODYsMHg5NiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4NzYsMHg0OCwgMHhGNiwweDg1LCAKKzB4N0IsMHg0MCwgMHhGNiwweDg2LCAweDcyLDB4MTgsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDE1LDB4QkQsIDB4RjQsMHgwMiwgMHgwMCwweDAxLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAKKzB4MTUsMHhEMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjQsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MEMsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNCwgMHg3NiwweEZDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDE1LDB4RkMsIDB4RjYsMHg4MiwgMHgwMCwweDEwLCAweEY2LDB4ODYsIDB4NzYsMHg0OCwgMHhGNiwweDg1LCAKKzB4NzYsMHhGQywgMHhFMCwweDAxLCAweDE2LDB4MEMsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweEY2LDB4ODUsIDB4NzYsMHhGOCwgMHhGNiwweDg2LCAKKzB4NzYsMHg0OCwgMHhGNiwweDg1LCAweDc3LDB4MDAsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MTYsMHgyMCwgMHhGNiwweDg2LCAweDc0LDB4RDQsIDB4RTAsMHgwMSwgMHgxNiwweDJDLCAweEY2LDB4ODUsIDB4NzYsMHg0OCwgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDE2LDB4NDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjYsMHgwNCwgMHg3NSwweEYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDE2LDB4ODUsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzUsMHhGNCwgMHhGNiwweDg0LCAKKzB4N0IsMHg0OCwgMHhGNywweDA1LCAweDc2LDB4RjQsIDB4RjcsMHgwNCwgMHg3QiwweDQwLCAweEM2LDB4QjAsIDB4NjgsMHgwMCwgMHgyNiwweEI0LCAKKzB4MDAsMHgwNCwgMHg5NywweDAyLCAweEZGLDB4NkMsIDB4OTYsMHgwMiwgMHhGRiwweDUwLCAweEUwLDB4MDEsIDB4MTYsMHhBOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4RjYsMHg4NCwgMHg3QiwweDM4LCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHhGNSwweDg1LCAKKzB4NzYsMHhGNCwgMHhGNiwweDA0LCAweDdCLDB4MzAsIDB4QzYsMHhCOCwgMHg2OCwweDAwLCAweDI2LDB4QjQsIDB4MDAsMHgwNCwgMHg5NiwweDAyLCAKKzB4RkYsMHg2QywgMHg5NywweDAyLCAweEZGLDB4NTAsIDB4OTYsMHg4MiwgMHhGRiwweDU4LCAweEY1LDB4ODYsIDB4NzMsMHhCQywgMHhGNSwweDg1LCAKKzB4NzYsMHg0OCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA0LCAKKzB4N0IsMHgyOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4N0IsMHgyOCwgMHhGNywweDA0LCAKKzB4NzUsMHhGNCwgMHhGNiwweDg0LCAweDdCLDB4MjgsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTcsMHgyMSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGMCwweDA1LCAweDc1LDB4RjQsIDB4RjcsMHgwNCwgMHg3NSwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDE3LDB4MjUsIDB4RjAsMHgwNSwgMHg3NSwweEYwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAKKzB4MTYsMHg0MCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMSwgMHgxNywweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGMCwweDA1LCAKKzB4NzUsMHhFQywgMHhGNywweDA0LCAweDc1LDB4RkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MTcsMHg0MSwgMHhGNiwweDg2LCAweDc1LDB4RjgsIDB4RTAsMHgwMSwgMHgxNywweDU4LCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHhGNywweDA0LCAKKzB4NzYsMHgwOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHg4NywweDNBLCAKKzB4MDAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTcsMHg5NSwgMHhGNywweDA1LCAKKzB4NzYsMHg2MCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjUsMHgwMiwgMHgwMCwweDBFLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAxLCAKKzB4MTcsMHg4QywgMHhCNSwweDNBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEUwLDB4MDEsIDB4MTcsMHg5OCwgMHhGNSwweDA2LCAKKzB4NzIsMHhBNCwgMHhGNSwweDA2LCAweDcyLDB4MTgsIDB4RjUsMHgwNSwgMHg3NiwweDQ4LCAweEY1LDB4ODQsIDB4NzYsMHhGOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MjEsIDB4RTIsMHgwMSwgMHgxNywweEU4LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAKKzB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMSwgMHgxNywweEQ0LCAweEI1LDB4QkEsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHhGNSwweDAyLCAweDAwLDB4MjIsIDB4RjUsMHgwNSwgMHg3NiwweEY4LCAweEY1LDB4MDQsIDB4NzcsMHgwMCwgMHhFMCwweDAxLCAKKzB4MTcsMHhFQywgMHhGNSwweDA1LCAweDc2LDB4RkMsIDB4RjAsMHgwNSwgMHg3NiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDM4LCAweEY3LDB4MDQsIDB4NzUsMHhFQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxOCwweDM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4NzUsMHhGMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTgsMHg0OSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxNiwweDQwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAxLCAKKzB4MUMsMHg3NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHg4NCwgMHg3NiwweDYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAKKzB4MDAsMHgwOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzAsMHgzQSwgMHhGRiwweEUxLCAweEU2LDB4MDEsIDB4MTgsMHg3RCwgMHhGNCwweDgyLCAKKzB4MDAsMHgwMCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MDAsMHhCQywgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhFMCwweDAxLCAweDFDLDB4NzAsIDB4RjMsMHgwNiwgMHg3NSwweDYwLCAweEMzLDB4QjQsIDB4MDAsMHgwMCwgMHg4NCwweDFFLCAKKzB4MDAsMHgxMCwgMHhGNiwweDg0LCAweDRBLDB4QTAsIDB4MjMsMHgxNCwgMHgwMCwweDIwLCAweDkzLDB4MTYsIDB4RkYsMHhDNCwgMHg5NCwweDE2LCAKKzB4RkYsMHhFMCwgMHg5NiwweDk2LCAweEZGLDB4RDQsIDB4ODUsMHgxRSwgMHgwMCwweDE0LCAweEY3LDB4MDQsIDB4NEEsMHg5QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RUMsMHgwMSwgMHgxOSwweDY4LCAweDk1LDB4MTYsIDB4RkYsMHhFNCwgMHg3NywweDM1LCAKKzB4MDAsMHgwMSwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4MDYsIDB4NEEsMHg5OCwgMHhDNiwweEI4LCAKKzB4MzAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MEMsIDB4QzUsMHg4NCwgMHgwMCwweDAwLCAweDg3LDB4MzYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDQyLDB4MDAsIDB4RTYsMHgwMSwgMHgxOCwweEY4LCAweEM2LDB4MjQsIDB4MDAsMHgwMCwgMHg4NywweDM2LCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg1MiwweDAwLCAweEU2LDB4MDEsIDB4MTgsMHhGQywgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTksMHgwOSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4ODYsMHgzNiwgMHgwMCwweDAwLCAweDg3LDB4MTYsIDB4RkYsMHhFMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDMyLCAweDcyLDB4MDAsIDB4RTIsMHgwMSwgMHgxOSwweDQ0LCAweEY1LDB4MDIsIDB4MDAsMHgwMCwgMHhDMCwweDMyLCAKKzB4NzIsMHgwMCwgMHhFNiwweDAxLCAweDE5LDB4NEMsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweDg2LDB4QjYsIDB4MDAsMHgwNCwgMHg4NywweDE2LCAKKzB4RkYsMHhFNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDEsIDB4MTksMHg0RCwgMHgyMCwweDJBLCAKKzB4MDAsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTksMHg1RCwgMHgyMCwweDJFLCAKKzB4MDAsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTksMHg2QywgMHgyMCwweDI2LCAKKzB4MDAsMHgwMCwgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyNiwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTksMHhBMSwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHg4NywweDE2LCAweEZGLDB4RDQsIDB4RjMsMHgwNiwgMHg0QSwweDk4LCAweDc2LDB4QjksIDB4MDAsMHgwMSwgMHhDNiwweEI0LCAKKzB4NzAsMHgwMCwgMHg3NiwweEI1LCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHgzMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgxNCwgMHg4NiwweEI2LCAKKzB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4RDgsIDB4RTAsMHgwMSwgMHgxQSwweDE0LCAweDk2LDB4OTYsIDB4RkYsMHhEQywgMHgyNywweDE0LCAKKzB4MDAsMHgyQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODMsMHgxNiwgMHhGRiwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDEzLCAKKzB4RkYsMHhGQywgMHhGMywweDA2LCAweDRBLDB4OTgsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTYsIDB4RkYsMHhDQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI1LDB4NjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHhDQywgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDFBLDB4MTEsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIDB4RkYsMHhENCwgMHhGMywweDA2LCAKKzB4NEEsMHg5OCwgMHg3NiwweEI5LCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAKKzB4MzAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTQsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhEOCwgMHg5NiwweDk2LCAKKzB4RkYsMHhEQywgMHhGNywweDA1LCAweDRBLDB4QTAsIDB4RTAsMHgwMSwgMHgxQSwweDE4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxQSwweDI4LCAweEY0LDB4ODIsIDB4MDAsMHgwMSwgMHhFMCwweDAxLCAKKzB4MUEsMHg4MCwgMHhGNCwweDgyLCAweDAwLDB4MDAsIDB4ODYsMHg5NiwgMHhGRiwweEQ4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweDM1LCAKKzB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY2LDB4ODYsIDB4NDIsMHhDOCwgMHhBNiwweDNBLCAKKzB4NjgsMHgwMiwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzUsMHgzOSwgMHgwMCwweDFFLCAweDc1LDB4MjgsIDB4RkYsMHhFNSwgMHgwNSwweEI4LCAKKzB4MDAsMHgwMiwgMHg4NiwweEFFLCAweDAwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDA0LCAweDk3LDB4MTYsIDB4RkYsMHhFQywgMHhDNiwweDMwLCAKKzB4NTcsMHhDMCwgMHg3NiwweDMwLCAweEZGLDB4RjAsIDB4OTYsMHgxNiwgMHhGRiwweEY0LCAweDc1LDB4QUQsIDB4MDAsMHgxRSwgMHg3NSwweEFDLCAKKzB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDVGLDB4QzAsIDB4NzYsMHhCNCwgMHhGRiwweEYwLCAweDk2LDB4OTYsIDB4RkYsMHhGMCwgMHgyMCwweDI2LCAKKzB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDFBLDB4OTQsIDB4RjUsMHg4MiwgMHgwMCwweDAwLCAweEUwLDB4MDEsIDB4MUIsMHgyOCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMCwgMHg4NiwweDk2LCAweEZGLDB4RjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzQsIDB4NjgsMHgwMCwgMHhDNCwweDlDLCAKKzB4NzIsMHgwMCwgMHhDMCwweDJFLCAweDZBLDB4MDAsIDB4RUMsMHgwMSwgMHgxQSwweEY0LCAweEM1LDB4MjQsIDB4MDAsMHgwMCwgMHhDNiwweDJDLCAKKzB4MDAsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEE2LDB4QjIsIDB4NzAsMHgwMiwgMHgwNSwweEFDLCAKKzB4MDAsMHgwMSwgMHhDNywweDMwLCAweDcwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAKKzB4NzcsMHhDMCwgMHg3NiwweEI0LCAweEZGLDB4RjAsIDB4RjYsMHhBQiwgMHgyOCwweDAwLCAweDA1LDB4MjgsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAKKzB4RkYsMHhGMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgyRSwgMHg3MiwweDAwLCAweEVDLDB4MDEsIDB4MUEsMHhCNSwgMHgwNiwweDMwLCAKKzB4MDAsMHgwMiwgMHhGMywweDAyLCAweDAwLDB4MDEsIDB4RjMsMHgwNSwgMHg3NiwweEY0LCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDE2LCAKKzB4RkYsMHhGMCwgMHg4NiwweDlFLCAweDAwLDB4MDQsIDB4QzcsMHgzOCwgMHg3MCwweDAwLCAweEM3LDB4MzgsIDB4NDgsMHgwMCwgMHhDNiwweEI0LCAKKzB4NzAsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4RjQsIDB4MDYsMHhCNCwgMHgwMCwweDIwLCAweDk3LDB4MDIsIDB4RkYsMHg2QywgMHg5NCwweDgyLCAKKzB4RkYsMHg1MCwgMHg5NiwweDgyLCAweEZGLDB4NTgsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MUMsMHg2QywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc2LDB4NUMsIDB4RjUsMHg4NCwgMHg3NiwweEY4LCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAKKzB4NzYsMHg1QywgMHhGNywweDA0LCAweDc2LDB4NUMsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDEsIDB4MUIsMHg4QywgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDEsIDB4MUIsMHg3OCwgMHhCNSwweEJBLCAKKzB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjMsMHgwMiwgMHgwMCwweDIyLCAweEYzLDB4MDUsIDB4NzYsMHhGOCwgMHhGMywweDA0LCAKKzB4NzcsMHgwMCwgMHhFMCwweDAxLCAweDFCLDB4OTAsIDB4RjMsMHgwNSwgMHg3NiwweEZDLCAweEYwLDB4MDUsIDB4NzYsMHhGQywgMHhGNywweDA0LCAKKzB4NzUsMHhGOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MUIsMHhDRCwgMHhGNiwweDg2LCAKKzB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAKKzB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHgwMiwgMHgwMCwweDBGLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAxLCAKKzB4MUIsMHhDQywgMHhCMywweDNBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY3LDB4MDQsIDB4NzYsMHgwOCwgMHhGNiwweDg0LCAKKzB4NzYsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDEsIDB4MUIsMHhFOCwgMHhGNywweDA1LCAKKzB4NzYsMHgwOCwgMHhGMCwweDA1LCAweDc2LDB4MDgsIDB4RjYsMHg4NCwgMHg3NiwweDA4LCAweEY3LDB4MDQsIDB4NzYsMHgwNCwgMHhGMCwweDA1LCAKKzB4NzUsMHhGOCwgMHhGNiwweDA2LCAweDc1LDB4RjgsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDFDLDB4MTUsIDB4RjcsMHgwNSwgMHg3NSwweEZDLCAweEUwLDB4MDEsIDB4MUMsMHgyNCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMCwgMHg3NywweDM1LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDg3LDB4M0EsIDB4MDAsMHgxOCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxQywweDY1LCAweEY3LDB4MDUsIDB4NzYsMHg2MCwgMHhGNywweDA0LCAKKzB4MkQsMHgzOCwgMHhGMywweDA2LCAweDcyLDB4QTQsIDB4RjMsMHgwNSwgMHg3NiwweDQ4LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHgwNiwweDM4LCAKKzB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4MDIsIDB4MDAsMHgwRSwgMHgyMCwweDMyLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAxLCAweDFDLDB4NzQsIDB4QjMsMHgzQSwgMHg2OCwweDAyLCAweEUwLDB4MDEsIDB4MUMsMHg3NCwgMHhGMCwweDA1LCAKKzB4MkQsMHgzOCwgMHhFMCwweDAxLCAweDFDLDB4NzAsIDB4RjMsMHgwNiwgMHg3MiwweDE4LCAweEYzLDB4MDYsIDB4NzMsMHgzMCwgMHhGMywweDA1LCAKKzB4NzYsMHg0OCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA2LCAKKzB4NzYsMHg0OCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg3MiwweDE4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NzYsMHg0OCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDcyLDB4QTQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg3NiwweDQ4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4NzMsMHgzMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDc2LDB4NDgsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NzMsMHhCQywgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4NzYsMHg0OCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg3NCwweDQ4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NzYsMHg0OCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDc0LDB4RDQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg3NiwweDQ4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4NzUsMHg2MCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNiwweDg2LCAKKzB4NzYsMHg2OCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4NiwgMHg3NywweDA0LCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4NDgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODYsIDB4MUQsMHhENCwgMHg5NiwweDkzLCAKKzB4RkYsMHhGQywgMHg5MCwweDEzLCAweEZGLDB4RkMsIDB4RjYsMHg4NiwgMHg3NiwweDY4LCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4MDAsMHgyMiwgMHhGNywweDA1LCAKKzB4NzYsMHhGNCwgMHhGNywweDA1LCAweDc2LDB4RjgsIDB4RjAsMHgwNSwgMHg3NiwweEZDLCAweEYwLDB4MDUsIDB4NzcsMHgwMCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY3LDB4MDQsIDB4NzYsMHhGNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MjIsIDB4RTYsMHgwMSwgMHgxRSwweDAxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY3LDB4MDYsIDB4NzcsMHgwNCwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDc2LDB4NjgsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjYsMHg4NiwgMHg3OCwweDEwLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDg2LCAKKzB4NzgsMHhBNCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg0OCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNiwweDg2LCAweDFGLDB4QkMsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODIsIDB4MDAsMHgxNCwgMHg5NiwweDkzLCAKKzB4RkYsMHhGQywgMHhGNiwweDg2LCAweDc4LDB4MTAsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjAsMHgwNSwgMHg3OCwweDlDLCAweDkwLDB4MDIsIDB4RkYsMHgzNCwgMHhGNywweDAyLCAKKzB4N0YsMHhGRiwgMHhGNywweDA1LCAweDc4LDB4QTAsIDB4OTcsMHgwMiwgMHhGRiwweDMwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjYsMHgwNCwgMHg3OCwweDlDLCAweDg3LDB4MTYsIDB4MDAsMHgwMCwgMHg4NCwweDk2LCAKKzB4MDAsMHgwOCwgMHhGNSwweDg2LCAweDc3LDB4MTAsIDB4ODcsMHgzQSwgMHgwMCwweDA4LCAweEY2LDB4ODYsIDB4MjEsMHg4QywgMHg3NSwweDM5LCAKKzB4MDAsMHgwNCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QTcsMHgzQSwgMHg2OCwweDAyLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhDNiwweEE4LCAKKzB4NTgsMHgwMCwgMHg4NCwweDE2LCAweDAwLDB4MDQsIDB4QzYsMHgzMCwgMHg3NSwweDgwLCAweDk0LDB4MzYsIDB4MDAsMHgwNCwgMHhCNCwweEFBLCAKKzB4NTgsMHgwMiwgMHg4NywweDM2LCAweDAwLDB4MDgsIDB4RjYsMHgwNSwgMHg3OCwweDlDLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhFNiwweDAxLCAKKzB4MUYsMHgyRCwgMHg5NywweDM2LCAweDAwLDB4MDgsIDB4ODcsMHgwMiwgMHhGRiwweDMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAKKzB4NEEsMHgwMCwgMHhFRSwweDAxLCAweDFGLDB4MzUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY0LDB4ODUsIDB4NzgsMHhBMCwgMHg5NCwweDgyLCAKKzB4RkYsMHgzMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwQywgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NSwweDk2LCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgyRSwgMHgwMCwweDA4LCAweEY2LDB4ODYsIDB4MjEsMHg4QywgMHg3NywweDM5LCAKKzB4MDAsMHgwMiwgMHhBNywweDNBLCAweDY4LDB4MDIsIDB4RjYsMHgwNCwgMHg3OCwweDlDLCAweEM3LDB4MDQsIDB4NzYsMHgwMCwgMHg4NiwweEFFLCAKKzB4MDAsMHgwOCwgMHhDNiwweDMwLCAweDc0LDB4MDAsIDB4RjcsMHgwNiwgMHg3NywweDEwLCAweEY2LDB4MDUsIDB4NzgsMHg5QywgMHg3NiwweEI1LCAKKzB4MDAsMHgwNCwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4ODcsMHgzNiwgMHgwMCwweDA4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhFNiwweDAxLCAweDFGLDB4QTgsIDB4OTcsMHgzNiwgMHgwMCwweDA4LCAweEY3LDB4MDIsIDB4N0YsMHhGRiwgMHhGNywweDA1LCAKKzB4NzgsMHhBMCwgMHg5NywweDAyLCAweEZGLDB4MzAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwNCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MDgsIDB4RjcsMHgwNCwgMHg3OCwweDlDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDIwLDB4RDEsIDB4RjYsMHgwMiwgMHg3RiwweEZGLCAweDk2LDB4MTYsIDB4RkYsMHhGNCwgMHhGNiwweDg0LCAKKzB4MkQsMHg0MCwgMHhGNiwweDA2LCAweDc3LDB4MTAsIDB4MjYsMHhCNCwgMHgwMCwweDAxLCAweDc3LDB4MzUsIDB4MDAsMHgwNCwgMHhDNCwweEI4LCAKKzB4NjAsMHgwMCwgMHhDMywweDM4LCAweDAwLDB4MDAsIDB4NzQsMHgzNSwgMHgwMCwweDAyLCAweEY2LDB4MDYsIDB4NzcsMHgxMCwgMHhDMCwweDI2LCAKKzB4NjIsMHgwMCwgMHhFQywweDAxLCAweDIwLDB4QzEsIDB4RjYsMHgwNiwgMHgyMSwweDhDLCAweEYzLDB4ODQsIDB4NzgsMHg5QywgMHhBNywweDIyLCAKKzB4NjAsMHgwMiwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgxRSwgMHg3NCwweDAwLCAweEU2LDB4MDEsIDB4MjAsMHhCMSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NiwweEE2LCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg3OCwweEEwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNiwweEI0LCAKKzB4NzIsMHgwMCwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RUUsMHgwMSwgMHgyMCwweDk4LCAweDk2LDB4QTYsIDB4MDAsMHgwMCwgMHhGNywweDA0LCAKKzB4MkQsMHgzOCwgMHhGNiwweDA2LCAweDc3LDB4MTAsIDB4QzUsMHgxOCwgMHg2MCwweDAwLCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHg4NiwweDJBLCAKKzB4MDAsMHgwNCwgMHgwNSwweEI4LCAweDAwLDB4MDEsIDB4RjUsMHg4NSwgMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgyMCwweDJFLCAKKzB4MDAsMHg0NCwgMHhFNiwweDAxLCAweDIwLDB4NzAsIDB4QjYsMHgzQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHg4NiwweDJBLCAKKzB4MDAsMHgwOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTYsMHgyQSwgMHgwMCwweDBDLCAweEY2LDB4MDYsIDB4MjEsMHg4QywgMHhBNywweDIyLCAKKzB4NjAsMHgwMiwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgwNCwgMHg3NiwweDAwLCAweEM3LDB4MUMsIDB4NzQsMHgwMCwgMHhFMCwweDAxLCAKKzB4MjAsMHhCMCwgMHhGNywweDA1LCAweDc4LDB4OUMsIDB4ODYsMHgxNiwgMHhGRiwweEY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NjIsMHgwMCwgMHhFQywweDAxLCAweDIwLDB4QjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHgyNCwweEE0LCAKKzB4MDAsMHgxMCwgMHgyMywweDE4LCAweDAwLDB4MTAsIDB4RTAsMHgwMSwgMHgxRiwweEZDLCAweDI0LDB4MjAsIDB4MDAsMHgwNCwgMHg4NiwweDE2LCAKKzB4RkYsMHhGNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHg3OCwweEEwLCAweDk2LDB4MDIsIDB4RkYsMHgzMCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg3LDB4MTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDNBLCAweDAwLDB4MDgsIDB4RjYsMHg4NiwgMHg3NywweDEwLCAweDc3LDB4MzksIDB4MDAsMHgwNCwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHg4NiwweEJBLCAweDAwLDB4MEMsIDB4ODcsMHgzQSwgMHgwMCwweDA4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHg0NCwweDBDLCAweDAwLDB4MDEsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwNCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHhGNywweDAyLCAweDAwLDB4MEYsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEVDLDB4MDEsIDB4MjEsMHg1RCwgMHhGNiwweDg2LCAKKzB4NzcsMHgxOCwgMHg5MCwweDM2LCAweDAwLDB4MDAsIDB4MjcsMHgzOCwgMHgwMCwweDAxLCAweEM2LDB4MDQsIDB4MDAsMHgwMCwgMHhDMCwweDNBLCAKKzB4NjIsMHgwMCwgMHhFNiwweDAxLCAweDIxLDB4NDQsIDB4MDYsMHhCNCwgMHgwMCwweDEwLCAweEY2LDB4MDYsIDB4NzgsMHhBNCwgMHg5NiwweDEzLCAKKzB4RkYsMHhGQywgMHhGNiwweDA2LCAweDc4LDB4MTAsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMiwgMHgwMCwweDAwLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDA4LCAweDAwLDB4MDAsIDB4MDAsMHgxMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgyMCwgMHgwMCwweDAwLCAweDAwLDB4NDAsIDB4MDAsMHgwMCwgMHgwMCwweDgwLCAweDAwLDB4MDAsIDB4MDEsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDIsMHgwMCwgMHgwMCwweDAwLCAweDA0LDB4MDAsIDB4MDAsMHgwMCwgMHgwOCwweDAwLCAweDAwLDB4MDAsIDB4MTAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MjAsMHgwMCwgMHgwMCwweDAwLCAweDQwLDB4MDAsIDB4MDAsMHgwMCwgMHg4MCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNiwgMHg3OCwweEIwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4NzksMHhDQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg0OCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDIyLDB4MkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4MDAsMHgxNSwgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDc4LDB4QjAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAKKzB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAKKzB4MDAsMHgwOCwgMHhGNiwweDg0LCAweDZGLDB4NDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDIsIDB4RTYsMHgwMSwgMHgyMiwweDcwLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHg4NywweDM2LCAKKzB4MEUsMHhGNCwgMHg4NiwweEI2LCAweDBFLDB4RjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHg0NywweDBDLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgyMiwweDc4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgyMiwweDk0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAKKzB4MzIsMHhFOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MjIsMHhCMSwgMHhGNSwweDgyLCAKKzB4MDMsMHhFOCwgMHgwRiwweDgxLCAweDQwLDB4MDAsIDB4RjcsMHgwNCwgMHg3OSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHhGNywweDA1LCAweDc5LDB4QzgsIDB4RjcsMHgwNCwgMHg3OSwweEM4LCAweEY1LDB4ODIsIDB4MDMsMHhFOCwgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHhGNSwweDgyLCAweDAwLDB4MTUsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODYsIDB4NzksMHhDQywgMHg5NSwweDkzLCAKKzB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxRSwweEMwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY3LDB4MDYsIDB4NzksMHhDQywgMHg5NywweDEzLCAKKzB4RkYsMHhGQywgMHhGNywweDA2LCAweDc4LDB4QjAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAKKzB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg3OSwweENDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAKKzB4NzksMHgzQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzEsMHgzQywgMHgwMCwweDAwLCAweDAyLDB4MTAsIDB4MDAsMHgwNCwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDBDLCAweDg1LDB4OTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NiwweEFFLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MjMsMHg4NCwgMHgyNywweDE0LCAweDAwLDB4MEMsIDB4ODcsMHgyRSwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwMSwgMHg5NywweDJFLCAweDAwLDB4MDQsIDB4ODcsMHgyRSwgMHgwMCwweDA0LCAweEUwLDB4MDEsIDB4MjQsMHgzNCwgMHg5NiwweDk2LCAKKzB4RkYsMHhGNCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDEzLCAKKzB4RkYsMHhGQywgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4OTUsMHg5NiwgMHhGRiwweEVDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAKKzB4MjUsMHg2OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHg5NiwgMHhGRiwweEVDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MjQsMHgzNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHhBRSwgMHgwMCwweDA0LCAweDg2LDB4MTYsIDB4RkYsMHhGNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDYyLDB4MDAsIDB4RUUsMHgwMSwgMHgyNCwweDIxLCAweDc3LDB4MzUsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzYsMHhCOCwgMHg1OCwweDAwLCAweDc3LDB4MzEsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg1OCwweDAwLCAweDg1LDB4MzYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NSwweDM2LCAweDAwLDB4MEMsIDB4ODUsMHgzNiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDM2LCAKKzB4MDAsMHgxMCwgMHg4NSwweDM2LCAweDAwLDB4MDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MzYsIDB4MDAsMHgxNCwgMHgyNiwweEI0LCAKKzB4MDAsMHgwQywgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RUUsMHgwMSwgMHgyMywweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDJFLCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MkUsIDB4MDAsMHgwNCwgMHg4NywweDJFLCAKKzB4MDAsMHgwNCwgMHg4NiwweDk2LCAweEZGLDB4RjQsIDB4ODUsMHgxNiwgMHgwMCwweDA0LCAweDc3LDB4MzUsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAKKzB4NjgsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzcsMHgyQywgMHg3MCwweDAwLCAweDg1LDB4MkEsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NSwweDNBLCAweDAwLDB4MEMsIDB4ODUsMHgxNiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NSwweDJBLCAKKzB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgzQSwgMHgwMCwweDEwLCAweDg1LDB4MTYsIDB4MDAsMHgwOCwgMHhGNCwweDAyLCAKKzB4MDAsMHgwMSwgMHg5NSwweDNBLCAweDAwLDB4MTQsIDB4OTYsMHhBRSwgMHgwMCwweDA4LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MEMsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDBDLCAweDg1LDB4OTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NCwweDJFLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MjUsMHg1NSwgMHgyNywweDE0LCAweDAwLDB4MEMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDg1LDB4MTYsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4OTYsIDB4RkYsMHhFQywgMHgwNywweDg4LCAKKzB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI1LDB4NjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4OTYsIDB4RkYsMHhFQywgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDI1LDB4NTUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4MTYsIDB4RkYsMHhGNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RUUsMHgwMSwgMHgyNSwweDQ1LCAweDc3LDB4MzEsIDB4MDAsMHgwMSwgMHhDNiwweEFDLCAKKzB4MDAsMHgwMCwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NTgsMHgwMCwgMHg4NSwweDM2LCAKKzB4MDAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgzNiwgMHgwMCwweDBDLCAweDg1LDB4MzYsIDB4MDAsMHgxQywgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg5NSwweDM2LCAweDAwLDB4MTAsIDB4ODUsMHgzNiwgMHgwMCwweDIwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDM2LCAKKzB4MDAsMHgxNCwgMHgwNiwweEI0LCAweDAwLDB4MEMsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEVDLDB4MDEsIDB4MjUsMHgxMSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDJFLCAweDAwLDB4MDQsIDB4RjQsMHgwMiwgMHgwMCwweDAxLCAweDI3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDJFLCAKKzB4MDAsMHgwNCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwOCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAKKzB4MDAsMHgwOCwgMHg4MywweDk2LCAweDAwLDB4MDQsIDB4ODMsMHgxNiwgMHgwMCwweDAwLCAweEM1LDB4MDAsIDB4MDAsMHgwMCwgMHg4NCwweDFBLCAKKzB4MDAsMHgwNCwgMHhDNCwweEE4LCAweDAwLDB4MDAsIDB4OTQsMHgxNiwgMHhGRiwweEY0LCAweEMwLDB4MjYsIDB4NDIsMHgwMCwgMHhFNiwweDAxLCAKKzB4MjYsMHhEMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODMsMHgxNiwgMHhGRiwweEY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDJBLCAKKzB4MzIsMHgwMCwgMHhFNiwweDAxLCAweDI2LDB4RDEsIDB4QzcsMHgyMCwgMHg0QSwweDAwLCAweDk1LDB4MTYsIDB4RkYsMHhGNCwgMHg3NiwweEI4LCAKKzB4RkYsMHhFMSwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzcsMHgzOSwgMHhGRiwweEZGLCAweEM1LDB4MjQsIDB4NzAsMHgwMCwgMHg3NywweDI5LCAKKzB4MDAsMHgwMSwgMHhDNywweDM4LCAweDUwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDgzLDB4MTYsIDB4MDAsMHgwMCwgMHg4NiwweDlFLCAKKzB4MDAsMHgwMCwgMHhDNSwweEI4LCAweDMwLDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDBDLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHhDNiwweDAwLCAKKzB4MDAsMHgwMCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMSwgMHgyNiwweDEwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHg4NiwweDlFLCAKKzB4MDAsMHgwNCwgMHg4NywweDJFLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAxLCAKKzB4MjYsMHgxMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MjYsMHgyNSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgwMCwgMHgwMCwweDAwLCAweEUwLDB4MDEsIDB4MjYsMHg3OCwgMHgyMCwweDNBLCAKKzB4MDAsMHgwMCwgMHg4NiwweDlFLCAweDAwLDB4MDAsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFMiwweDAxLCAweDI2LDB4NUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEU2LDB4MDEsIDB4MjYsMHg2NCwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHg4NiwweDlFLCAweDAwLDB4MDQsIDB4ODcsMHgyRSwgMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAKKzB4NzIsMHgwMCwgMHhFMiwweDAxLCAweDI2LDB4NjUsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAKKzB4MDAsMHgwMCwgMHg0NywweDA0LCAweEZGLDB4RkYsIDB4RTYsMHgwMSwgMHgyNiwweDc5LCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgyNiwweEIxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFRSwweDAxLCAKKzB4MjYsMHhBMCwgMHgyMCwweDNBLCAweDAwLDB4MDEsIDB4NDMsMHgwNCwgMHhGRiwweEZGLCAweEMwLDB4M0EsIDB4MzIsMHgwMCwgMHhFNiwweDAxLCAKKzB4MjYsMHhDOSwgMHhDMCwweDI2LCAweDQyLDB4MDAsIDB4RTAsMHgwMSwgMHgyNSwweDkwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhFNiwweDAxLCAKKzB4MjYsMHhDMSwgMHhDMCwweDI2LCAweDQyLDB4MDAsIDB4RTAsMHgwMSwgMHgyNSwweDkwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4MywweDE2LCAKKzB4MDAsMHgwOCwgMHhGNCwweDAyLCAweDAwLDB4MDEsIDB4RTAsMHgwMSwgMHgyNiwweEUwLCAweDk1LDB4MUEsIDB4MDAsMHgwMCwgMHhFMCwweDAxLCAKKzB4MjUsMHg4QywgMHhDNCwweEE4LCAweDAwLDB4MDAsIDB4RTAsMHgwMSwgMHgyNSwweDhDLCAweEM0LDB4MjgsIDB4MDAsMHgwMCwgMHg4MywweDE2LCAKKzB4MDAsMHgwOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHgxQSwgMHgwMCwweDAwLCAweEM0LDB4MDAsIDB4MDAsMHgwMCwgMHg4NywweDk2LCAKKzB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDBDLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NSwweDk2LCAKKzB4MDAsMHgwNCwgMHg4NCwweDE2LCAweDAwLDB4MDAsIDB4ODQsMHg5NiwgMHgwMCwweDA4LCAweEY3LDB4MDIsIDB4MDAsMHgwMywgMHhDNiwweEEwLCAKKzB4NEQsMHg4MCwgMHhDNiwweEI2LCAweDc0LDB4MDAsIDB4RTYsMHgwMSwgMHgyNywweDcxLCAweEM2LDB4MjAsIDB4MDAsMHgwMCwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMiwgMHhFNiwweDAxLCAweDI3LDB4QTAsIDB4QzUsMHgyMCwgMHg0OCwweDAwLCAweEM3LDB4MjAsIDB4NDgsMHgwMCwgMHgyNywweDM4LCAKKzB4MDAsMHgwMiwgMHhDMCwweDIyLCAweDcyLDB4MDAsIDB4RTIsMHgwMSwgMHgyNywweDlDLCAweEM1LDB4MzgsIDB4MDAsMHgwMCwgMHg4NywweDJFLCAKKzB4MDAsMHgwMCwgMHg3NiwweEFELCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAKKzB4RkYsMHhGMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweEMwLDB4MzIsIDB4NTIsMHgwMCwgMHhFMiwweDAxLCAKKzB4MjcsMHg0MSwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4RTAsMHgwMSwgMHgyNywweEEwLCAweEM1LDB4MjAsIDB4NDgsMHgwMCwgMHhDNywweDIwLCAKKzB4NDgsMHgwMCwgMHgyNywweDM4LCAweDAwLDB4MDQsIDB4QzAsMHgyMiwgMHg3MiwweDAwLCAweEUyLDB4MDEsIDB4MjcsMHhBMCwgMHhDNSwweDIwLCAKKzB4NDgsMHgwMCwgMHg4MywweEFELCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4QjEsIDB4MDAsMHgwNCwgMHhDMCwweDMyLCAKKzB4NzIsMHgwMCwgMHhFMiwweDAxLCAweDI3LDB4ODUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM1LDB4MjAsIDB4NDgsMHgwMCwgMHhDMCwweDMyLCAKKzB4NTIsMHgwMCwgMHhFNCwweDAxLCAweDI3LDB4RDUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4QUUsIDB4MDAsMHgwMCwgMHg3NywweDJELCAKKzB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhFOCwgMHhGNiwweEIzLCAKKzB4NjgsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDEsIDB4QzAsMHgzMiwgMHg1MiwweDAwLCAweEU0LDB4MDEsIDB4MjcsMHhBQywgMHgwNSwweEFDLCAKKzB4MDAsMHgwMSwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwQywgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NCwweDE2LCAKKzB4MDAsMHgwMCwgMHg4NiwweDk2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MjIsIDB4NkQsMHg4MCwgMHhFNiwweDAxLCAKKzB4MjgsMHgxMCwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTAsMHgwMSwgMHgyOCwweDc0LCAweEM0LDB4MzgsIDB4MDAsMHgwMCwgMHhGNywweDAyLCAKKzB4MDAsMHgwMSwgMHhFRSwweDAxLCAweDI4LDB4NDEsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAKKzB4MDAsMHgwMCwgMHhFRSwweDAxLCAweDI4LDB4MUMsIDB4NzcsMHgzOSwgMHgwMCwweDAxLCAweEUwLDB4MDEsIDB4MjgsMHg0NCwgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHg3NCwweDIxLCAweDAwLDB4MDEsIDB4NzcsMHgzOCwgMHhGRiwweEZGLCAweDA2LDB4MzAsIDB4MDAsMHgwMSwgMHgyMCwweDIyLCAKKzB4MDAsMHgwMCwgMHhFRSwweDAxLCAweDI4LDB4MzQsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MjgsMHg3MSwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHhDMCwweDIyLCAweDZBLDB4MDAsIDB4RTQsMHgwMSwgMHgyOCwweDY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNCwweDIwLCAKKzB4NkEsMHgwMCwgMHg3NywweDNBLCAweEZGLDB4RkYsIDB4RTYsMHgwMSwgMHgyOCwweDU0LCAweDc2LDB4QjQsIDB4RkYsMHhGRiwgMHhENCwweDIwLCAKKzB4MDcsMHg2MiwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwOCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAKKzB4MDAsMHgwNCwgMHhFMCwweDAxLCAweDI4LDB4Q0MsIDB4RjcsMHgwNiwgMHgyOSwweERDLCAweDg2LDB4QkEsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgyOCwweEM5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NywweDE2LCAKKzB4RkYsMHhGNCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4QzEsMHgzNCwgMHgwMCwweDAwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDE2LCAKKzB4RkYsMHhGNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjcsMHgzOCwgMHgwMCwweDA0LCAweEY2LDB4MDYsIDB4MjksMHhFMCwgMHhDMCwweDNBLCAKKzB4NjIsMHgwMCwgMHhFNCwweDAxLCAweDI4LDB4OUQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAKKzB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAKKzB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDA0LCAweEUwLDB4MDEsIDB4MjksMHgzNCwgMHhGNywweDA2LCAKKzB4MjksMHg5OCwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAKKzB4MjksMHgzMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTcsMHgxNiwgMHhGRiwweEY0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhDMSwweDM0LCAKKzB4MDAsMHgwMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHgxNiwgMHhGRiwweEY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAKKzB4MDAsMHgwNCwgMHhGNiwweDA2LCAweDI5LDB4RTAsIDB4QzAsMHgzQSwgMHg2MiwweDAwLCAweEU0LDB4MDEsIDB4MjksMHgwNCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMSwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA0LCAKKzB4N0IsMHg1MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MjksMHg4NCwgMHhGNiwweDgyLCAKKzB4MDAsMHgwMSwgMHhGNiwweDg1LCAweDdCLDB4NTAsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjgsMHhGMCwgMHg5NywweDkzLCAKKzB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDAsMHgwMCwgMHgwQiwweDRDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4NDIsMHg4OCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHg1RSwweDUwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4QzcsMHhBOCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwQiwweEQwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAKKzB4MUMsMHg4OCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgxRSwweDE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAKKzB4MjEsMHgyQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMiwweEU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgfSA7CisKKworLyogVGhpcyBpcyB0aGUgTEFOYWkgZGF0YSAqLyAKKworc3RhdGljIHVuc2lnbmVkIGludCBsYW5haTRfZGF0YV9vZmYgPSAweDk0RjA7IC8qIGhhbGYtd29yZCBvZmZzZXQgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxhbmFpNF9kYXRhWzIwNDcyXSBfX2luaXRkYXRhID0geworMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAKKzB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIH0gOworCisKKyNpZmRlZiBTWU1CT0xfREVGSU5FU19DT01QSUxFRAorLyogVGhlc2UgYXJlIGhhbGYtd29yZCBhZGRyZXNzZXMgLSBOT1QgYnl0ZSBvZmZzZXRzICovCisjZGVmaW5lIE1ZUklfR2VuZXJhdGVNYXBWZXJzaW9uICAgICAgMHhCRDA4CisjZGVmaW5lIE1ZUklfTW9yZVRvR2VuZXJhdGUgICAgICAgICAgMHhCRDBDCisjZGVmaW5lIE1ZUklfR2VuZXJhdGVNZXNzYWdlICAgICAgICAgMHhCQ0VDCisjZGVmaW5lIE1ZUklfUmVsYXlNYXBWZXJzaW9uICAgICAgICAgMHhCRDA0CisjZGVmaW5lIE1ZUklfUmVsYXlTdGFydCAgICAgICAgICAgICAgMHhCRDAwCisjZGVmaW5lIE1ZUklfUmVsYXlEaXJlY3Rpb24gICAgICAgICAgMHhCQ0ZDCisjZGVmaW5lIE1ZUklfUmVsYXlJbmRleCAgICAgICAgICAgICAgMHhCQ0Y0CisjZGVmaW5lIE1ZUklfUmVsYXlTdG9wICAgICAgICAgICAgICAgMHhCQ0Y4CisjZGVmaW5lIE1ZUklfUmVsYXlNZXNzYWdlICAgICAgICAgICAgMHhCQ0YwCisjZGVmaW5lIE1ZUklfQnJvYWRjYXN0UmVsYXlNZXNzYWdlc1NlbnQgMHhCRDEwCisjZGVmaW5lIE1ZUklfU2VuZE11bHRpcGxleEdyYWJiZWQgICAgMHhCRDNDCisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVJdGVtICAgICAgICAgMHhCRDE0CisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVOdW1TY2F0dGVycyAgMHhCRDUwCisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVTY2F0dGVySW5kZXggMHhCRDQ0CisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVTY2F0dGVyUG9pbnRlciAweEJENEMKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZVNjYXR0ZXJMZW5ndGggMHhCRDQ4CisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVDaGVja3N1bSAgICAgMHhCRDQwCisjZGVmaW5lIE1ZUklfUm91dGVOdW1GcmFnbWVudHMgICAgICAgMHhCRDYwCisjZGVmaW5lIE1ZUklfUm91dGVGcmFnbWVudCAgICAgICAgICAgMHhCRDVDCisjZGVmaW5lIE1ZUklfUm91dGVTdGFtcCAgICAgICAgICAgICAgMHhCRDU4CisjZGVmaW5lIE1ZUklfUm91dGVzU29GYXIgICAgICAgICAgICAgMHhCRDY0CisjZGVmaW5lIE1ZUklfTWFwVmVyc2lvbkNoYW5nZWQgICAgICAgMHhCRDY4CisjZGVmaW5lIE1ZUklfbWFwX2MgICAgICAgICAgICAgICAgICAgMHhCRDU0CisjZGVmaW5lIE1ZUklfcGFja19saXN0ICAgICAgICAgICAgICAgMHg3ODlDCisjZGVmaW5lIE1ZUklfcGFja190YWJsZSAgICAgICAgICAgICAgMHg3OEJBCisjZGVmaW5lIE1ZUklfbXNnMmV2ZW50ICAgICAgICAgICAgICAgMHg3RkY2CisjZGVmaW5lIE1ZUklfVmVyc2lvblN0cmluZyAgICAgICAgICAgMHhCN0EwCisjZGVmaW5lIE1ZUklfU2l6ZW9mQ2hhbm5lbCAgICAgICAgICAgMHhCRDgwCisjZGVmaW5lIE1ZUklfRW5kT2ZRdWV1ZVNwYWNlICAgICAgICAgMHhCRDg0CisjZGVmaW5lIE1ZUklfRnJlZUNvZGUgICAgICAgICAgICAgICAgMHhCRDc4CisjZGVmaW5lIE1ZUklfRnJlZURhdGEgICAgICAgICAgICAgICAgMHhCRDdDCisjZGVmaW5lIE1ZUklfQXNzZXJ0aW5nICAgICAgICAgICAgICAgMHhCRDZDCisjZGVmaW5lIE1ZUklfVmVyc2lvbiAgICAgICAgICAgICAgICAgMHhCRDc0CisjZGVmaW5lIE1ZUklfUHJvY2Vzc29yICAgICAgICAgICAgICAgMHhCRDcwCisjZGVmaW5lIE1ZUklfTmV0UmVjZWl2ZSAgICAgICAgICAgICAgMHhCRDhDCisjZGVmaW5lIE1ZUklfTmV0UmVjZWl2ZUJ1ZmZlciAgICAgICAgMHhCRDg4CisjZGVmaW5lIE1ZUklfTWFwTGVuZ3RoICAgICAgICAgICAgICAgMHhCRDlDCisjZGVmaW5lIE1ZUklfTWFwU2VuZEFsaWdubWVudCAgICAgICAgMHhCRDk4CisjZGVmaW5lIE1ZUklfSG9zdFJlcGx5TGVuZ3RoICAgICAgICAgMHhCREE0CisjZGVmaW5lIE1ZUklfSG9zdFJlcGx5U2VuZEFsaWdubWVudCAgMHhCREEwCisjZGVmaW5lIE1ZUklfTWFwU2VuZE1lc3NhZ2VzICAgICAgICAgMHhCRDk0CisjZGVmaW5lIE1ZUklfYml0bWFzayAgICAgICAgICAgICAgICAgMHg5MEM2CisjZGVmaW5lIE1ZUklfSG9zdFNlbmRGdWxsICAgICAgICAgICAgMHg5OUMwCisjZGVmaW5lIE1ZUklfSG9zdFJlcGxpZXMgICAgICAgICAgICAgMHhBMDRDCisjZGVmaW5lIE1ZUklfSW50ZXJydXB0cyAgICAgICAgICAgICAgMHhCQ0U0CisjZGVmaW5lIE1ZUklfTmV0UmVjZWl2ZURyb3BzICAgICAgICAgMHhCOERBCisjZGVmaW5lIE1ZUklfU2VuZE11bHRpcGxleERvbmVFdmVudCAgMHhCQjdBCisjZGVmaW5lIE1ZUklfYkV2ZW50cyAgICAgICAgICAgICAgICAgMHg5NkU2CisjZGVmaW5lIE1ZUklfYkhvc3RSZWNlaXZlU2hvcnRjdXRzICAgMHg5OTcyCisjZGVmaW5lIE1ZUklfdGhlX21hcCAgICAgICAgICAgICAgICAgMHhCNzI4CisjZGVmaW5lIE1ZUklfQ2hhbm5lbHMgICAgICAgICAgICAgICAgMHhCN0EyCisjZGVmaW5lIE1ZUklfYkV2ZW50SW5kZXggICAgICAgICAgICAgMHg5NzY2CisjZGVmaW5lIE1ZUklfTm9CdWZmZXJzQ2hhbm5lbDAgICAgICAgMHg5OTc0CisjZGVmaW5lIE1ZUklfYlNoYWtlcyAgICAgICAgICAgICAgICAgMHg5NzZBCisjZGVmaW5lIE1ZUklfTUFQUEVSICAgICAgICAgICAgICAgICAgMHhBMTIyCisjZGVmaW5lIE1ZUklfQ09SRV90aW1lb3V0X2NvdW50ZXIgICAgMHhBMTE0CisjZGVmaW5lIE1ZUklfdGhlX21hcF9pc192YWxpZCAgICAgICAgMHhBMDQwCisjZGVmaW5lIE1ZUklfYkJhZFNjYXR0ZXJzICAgICAgICAgICAgMHg5OTcwCisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVDaGFubmVsICAgICAgMHg5OTYwCisjZGVmaW5lIE1ZUklfc2VuZF9zcGFjZSAgICAgICAgICAgICAgMHhBN0IwCisjZGVmaW5lIE1ZUklfTWFwUmVjZWl2ZU1lc3NhZ2VzICAgICAgMHhCOEUwCisjZGVmaW5lIE1ZUklfd2FrZXVwX21hc2sgICAgICAgICAgICAgMHhCQzRFCisjZGVmaW5lIE1ZUklfTmV0U2VuZEJ1ZmZlciAgICAgICAgICAgMHhCQjMwCisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVNdWx0aWNhc3QgICAgMHg5OTY4CisjZGVmaW5lIE1ZUklfSG9zdFNlbmRDaGFubmVsICAgICAgICAgMHg5QTk0CisjZGVmaW5lIE1ZUklfTmV0UmVjZWl2ZURtYURvbmUgICAgICAgMHhCN0ZBCisjZGVmaW5lIE1ZUklfSG9zdFNlbmRDaGVja3N1bSAgICAgICAgMHg5QUFBCisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVTY2F0dGVyICAgICAgMHg5OTE0CisjZGVmaW5lIE1ZUklfY29tcGFyZXMgICAgICAgICAgICAgICAgMHg5REM4CisjZGVmaW5lIE1ZUklfTmV0U2VuZFF1ZXVlICAgICAgICAgICAgMHhCQUZDCisjZGVmaW5lIE1ZUklfSG9zdFRhYmxlICAgICAgICAgICAgICAgMHhBNTRDCisjZGVmaW5lIE1ZUklfbWFwX2ggICAgICAgICAgICAgICAgICAgMHg5REI0CisjZGVmaW5lIE1ZUklfSG9zdFNlbmRCeXRlcyAgICAgICAgICAgMHg5QUEwCisjZGVmaW5lIE1ZUklfTDNfZW5kX2xvYWRlZF9tZW1vcnkgICAgMHhCREI0CisjZGVmaW5lIE1ZUklfTmV0U2VuZEJ5dGVzICAgICAgICAgICAgMHhCQjJBCisjZGVmaW5lIE1ZUklfbWFwX3NwYWNlICAgICAgICAgICAgICAgMHhBODFDCisjZGVmaW5lIE1ZUklfTUFQX0FDSyAgICAgICAgICAgICAgICAgMHhBMDQ1CisjZGVmaW5lIE1ZUklfTmV0UmVjZWl2ZU1pc3JvdXRlcyAgICAgMHhCOEQ2CisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVCeXRlcyAgICAgICAgMHg5OTVDCisjZGVmaW5lIE1ZUklfQnJvYWRjYXN0UmVsYXlJZGxlICAgICAgMHg5NUMyCisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVJZGxlICAgICAgICAgMHg5NzcwCisjZGVmaW5lIE1ZUklfdGltaW5nICAgICAgICAgICAgICAgICAgMHhCQzA4CisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmUgICAgICAgICAgICAgMHg5OTZBCisjZGVmaW5lIE1ZUklfcm91dGVIYW5kbGVNZXNzYWdlICAgICAgMHg3NzMyCisjZGVmaW5lIE1ZUklfRnJlc2VzICAgICAgICAgICAgICAgICAgMHhCN0FFCisjZGVmaW5lIE1ZUklfTmV4dFRvUHV0ICAgICAgICAgICAgICAgMHg5NjlDCisjZGVmaW5lIE1ZUklfSG9zdFNlbmRJZGxlICAgICAgICAgICAgMHg5OTdBCisjZGVmaW5lIE1ZUkllZGF0YSAgICAgICAgICAgICAgICAgICAgMHhCQ0VDCisjZGVmaW5lIE1ZUklfU2VuZGluZ0hvc3RSZXBseSAgICAgICAgMHhCQUZBCisjZGVmaW5lIE1ZUklfdGltaW5nX3BlcmlvZCAgICAgICAgICAgMHhCQzUwCisjZGVmaW5lIE1ZUklfZGVidWcgICAgICAgICAgICAgICAgICAgMHhBMTM4CisjZGVmaW5lIE1ZUklfTmV0U2VuZEJ1c3kgICAgICAgICAgICAgMHhCOTk4CisjZGVmaW5lIE1ZUklfcm91dGVJbml0aWFsaXplICAgICAgICAgMHg2QUEwCisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVRdWV1ZSAgICAgICAgMHg5OTY2CisjZGVmaW5lIE1ZUklfYldha2VzICAgICAgICAgICAgICAgICAgMHg5NzY4CisjZGVmaW5lIE1ZUklfTmV0UmVjZWl2ZUJhZExlbmd0aHMgICAgMHhCOEQwCisjZGVmaW5lIE1ZUklfTmV0UmVjZWl2ZVF1ZXVlICAgICAgICAgMHhCOEUyCisjZGVmaW5lIE1ZUklfTWFwQnVmZmVyICAgICAgICAgICAgICAgMHhCQUY2CisjZGVmaW5lIE1ZUklfTWFwQ2hlY2tzdW0gICAgICAgICAgICAgMHhBMDQ4CisjZGVmaW5lIE1ZUklfdGhlX3JvdXRlc19hcmVfdmFsaWQgICAgMHhBMDQyCisjZGVmaW5lIE1ZUklfTUFQUEVSX3Byb2JlX3N0YW1wICAgICAgMHhBMTMyCisjZGVmaW5lIE1ZUklfbWVtb3J5ICAgICAgICAgICAgICAgICAgMHhBN0FDCisjZGVmaW5lIE1ZUklfRXZlbnRzICAgICAgICAgICAgICAgICAgMHg5NjE0CisjZGVmaW5lIE1ZUklfc3dpdGNoZXMgICAgICAgICAgICAgICAgMHg5REI2CisjZGVmaW5lIE1ZUklfSG9zdHMgICAgICAgICAgICAgICAgICAgMHhBN0FFCisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVHb2luZ1RvQnJvYWRjYXN0IDB4OThDRQorI2RlZmluZSBNWVJJX05ldFNlbmRJZGxlICAgICAgICAgICAgIDB4QjkwQworI2RlZmluZSBNWVJJX2hvc3RfcmVwbHlfc3BhY2UgICAgICAgIDB4QjcyQworI2RlZmluZSBNWVJJX0hvc3RSZWNlaXZlV2FpdGluZ1RvQnJvYWRjYXN0IDB4OTg4OAorI2RlZmluZSBNWVJJX2JTZXRSb3V0ZXMgICAgICAgICAgICAgIDB4QTExRQorI2RlZmluZSBNWVJJX2JTZW5kcyAgICAgICAgICAgICAgICAgIDB4OTc2QworI2RlZmluZSBNWVJJX0Jyb2FkY2FzdEdlbmVyYXRlSWRsZSAgIDB4OTUzNgorI2RlZmluZSBNWVJJX1dhdGNoZG9nT2ZmICAgICAgICAgICAgIDB4QkM5RQorI2RlZmluZSBNWVJJX1RJTUVSICAgICAgICAgICAgICAgICAgIDB4QkM1MgorI2RlZmluZSBNWVJJX1NlbmRNdWx0aXBsZXggICAgICAgICAgIDB4QkI4MgorI2RlZmluZSBNWVJJX0hvc3RSZXBseUJ1ZmZlciAgICAgICAgIDB4QkFGOAorI2RlZmluZSBNWVJJX3RoZV9uZXdfc3dpdGNoICAgICAgICAgIDB4QTEzMAorI2RlZmluZSBNWVJJX2N1cnJlbnRfc3dpdGNoICAgICAgICAgIDB4QTAzQQorI2RlZmluZSBNWVJJX21lbWNweSAgICAgICAgICAgICAgICAgIDB4OTM3QworI2RlZmluZSBNWVJJX3NlcnZlciAgICAgICAgICAgICAgICAgIDB4OUFGNgorI2RlZmluZSBNWVJJX1dhdGNoZG9nT24gICAgICAgICAgICAgIDB4QkM1OAorI2RlZmluZSBNWVJJX05ldFNlbmRDb250aW51aW5nICAgICAgIDB4Qjk1MgorI2RlZmluZSBNWVJJX05ldFJlY2VpdmVCYWRDaGFubmVscyAgIDB4QjhEMgorI2RlZmluZSBNWVJJX1NlbmRNdWx0aXBsZXhGcmVlTWFjaGluZSAweEJCODAKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlRmx1c2ggICAgICAgICAweEI4NDAKKyNkZWZpbmUgTVlSSV9OZXRTZW5kQnJvYWRjYXN0aW5nICAgICAweEJBQjAKKyNkZWZpbmUgTVlSSV9sb29raW5nX2Zvcl9hX2xvb3BiYWNrICAweDlENkMKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZEdhdGhlclBvaW50ZXIgICAweDlBQTgKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZEl0ZW0gICAgICAgICAgICAweDlBOTYKKyNkZWZpbmUgTVlSSV9NQVBfUkVRICAgICAgICAgICAgICAgICAweEEwNDYKKyNkZWZpbmUgTVlSSV9tZW1vcnlfZnJlZV9saXN0ICAgICAgICAweEExNjAKKyNkZWZpbmUgTVlSSWVuZCAgICAgICAgICAgICAgICAgICAgICAweEJEQjQKKyNkZWZpbmUgTVlSSV9NYXBWZXJzaW9uICAgICAgICAgICAgICAweDlEQjIKKyNkZWZpbmUgTVlSSV9jbGllbnQgICAgICAgICAgICAgICAgICAweDlBQjAKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZUJyb2FkY2FzdGluZyAweDk4NDIKKyNkZWZpbmUgTVlSSWV0ZXh0ICAgICAgICAgICAgICAgICAgICAweDk0RjAKKyNkZWZpbmUgTVlSSV9OZXRTZW5kTWFwQnVzeSAgICAgICAgICAweEI5REUKKyNkZWZpbmUgTVlSSV9iUm91dGVNZXNzYWdlcyAgICAgICAgICAweEExMzQKKyNkZWZpbmUgTVlSSV9EbWFEaXJlY3Rpb24gICAgICAgICAgICAweEI3QTgKKyNkZWZpbmUgTVlSSV9TZW5kTXVsdGlwbGV4RnJlZUV2ZW50ICAweEJCN0MKKyNkZWZpbmUgTVlSSV9pZGxlX21hcHBlciAgICAgICAgICAgICAweDlCM0MKKyNkZWZpbmUgTVlSSV9OZXRTZW5kICAgICAgICAgICAgICAgICAweEJCMjQKKyNkZWZpbmUgTVlSSV9jdXJyZW50X3BvcnQgICAgICAgICAgICAweEEwM0UKKyNkZWZpbmUgTVlSSV9Ib3N0Q29ubmVjdGVkU3dpdGNoZXMgICAweDlEREEKKyNkZWZpbmUgTVlSSV90cnlfbG9vcGJhY2sgICAgICAgICAgICAweDlCODIKKyNkZWZpbmUgTVlSSV90aGVfaG9zdF9yZXBseV9tZXNzYWdlICAweEI3MkEKKyNkZWZpbmUgTVlSSV9NQVBQRVJfcXVldWUgICAgICAgICAgICAweDlERDgKKyNkZWZpbmUgTVlSSV9iSG9zdFNlbmRTaG9ydGN1dHMgICAgICAweDlBQUMKKyNkZWZpbmUgTVlSSV9Ccm9hZGNhc3RHZW5lcmF0ZSAgICAgICAweDk2MDgKKyNkZWZpbmUgTVlSSV9EbWFGcmVlRXZlbnQgICAgICAgICAgICAweEI3QUMKKyNkZWZpbmUgTVlSSV9ob3N0X3RpbWVvdXRfY291bnRlciAgICAweEExMTYKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlRG1hICAgICAgICAgICAweEI3QjQKKyNkZWZpbmUgTVlSSV9NQVBQRVJfdHJ5X3BvcnQgICAgICAgICAweEExMkMKKyNkZWZpbmUgTVlSSV9iY29weSAgICAgICAgICAgICAgICAgICAweDY2QUEKKyNkZWZpbmUgTVlSSV9xdWV1ZV9oICAgICAgICAgICAgICAgICAweEJCMzIKKyNkZWZpbmUgTVlSSV9iVXBkYXRlcyAgICAgICAgICAgICAgICAweEExMjAKKyNkZWZpbmUgTVlSSV9TZW5kTXVsdGlwbGV4TWFjaGluZSAgICAweEJCN0UKKyNkZWZpbmUgTVlSSV9NQVBQRVJfcmVwZWF0ICAgICAgICAgICAweEExMkEKKyNkZWZpbmUgTVlSSV90aGVfcmV0dXJuX3BvcnQgICAgICAgICAweEEwMzgKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlRnVsbCAgICAgICAgICAweEI4ODYKKyNkZWZpbmUgTVlSSV9NeUhvc3RUYWJsZUluZGV4ICAgICAgICAweEE3QUEKKyNkZWZpbmUgTVlSSV9DT1JFICAgICAgICAgICAgICAgICAgICAweEExMTgKKyNkZWZpbmUgTVlSSV9JX2hhdmVfYV9tYXAgICAgICAgICAgICAweEEwNDQKKyNkZWZpbmUgTVlSSV9iV2FpdGluZyAgICAgICAgICAgICAgICAweEI3QjAKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlT3ZlcmZsb3dzICAgICAweEI4RDgKKyNkZWZpbmUgTVlSSV9OdW1NYWNoaW5lcyAgICAgICAgICAgICAweDk2QTAKKyNkZWZpbmUgTVlSSV9NYXBNZXNzYWdlc1NlbnRDb3VudGVyICAweEI3OUMKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZUJ1ZmZlciAgICAgICAweDk5NjIKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZERtYSAgICAgICAgICAgICAweDlBNEMKKyNkZWZpbmUgTVlSSV9OZXh0VG9HZXQgICAgICAgICAgICAgICAweDk2OUUKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZURtYUJ1c3kgICAgICAweDk3QjYKKyNkZWZpbmUgTVlSSV9iVXBkYXRlTWVzc2FnZXMgICAgICAgICAweEExMzYKKyNkZWZpbmUgTVlSSV90cnlfdGhlX3N3aXRjaCAgICAgICAgICAweDlDMEUKKyNkZWZpbmUgTVlSSV9Ccm9hZGNhc3RSZWxheSAgICAgICAgICAweDk2MEUKKyNkZWZpbmUgTVlSSV90aGVfbXNnICAgICAgICAgICAgICAgICAweEI3OTgKKyNkZWZpbmUgTVlSSV9iRXZlbnRzUlRDICAgICAgICAgICAgICAweDk3MjYKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZU1lc3NhZ2VzICAgICAweDk5NUUKKyNkZWZpbmUgTVlSSV9DVVJSRU5UX01TRyAgICAgICAgICAgICAweEI3OUEKKyNkZWZpbmUgTVlSSV9NQVBQRVJfcGhhc2UgICAgICAgICAgICAweEExMjgKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZURtYSAgICAgICAgICAweDk3RkMKKyNkZWZpbmUgTVlSSV9XYXRjaGRvZyAgICAgICAgICAgICAgICAweEJDRTYKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZEVtcHR5ICAgICAgICAgICAweDlBOTIKKyNkZWZpbmUgTVlSSV9hYm9ydCAgICAgICAgICAgICAgICAgICAweDYzQzYKKyNkZWZpbmUgTVlSSV9TZW5kTXVsdGlwbGV4SWRsZSAgICAgICAweEJCMzQKKyNkZWZpbmUgTVlSSV9sb29raW5nX2Zvcl9hX3N3aXRjaCAgICAweDlDNTQKKyNkZWZpbmUgTVlSSV9OZXRTZW5kTWVzc2FnZXMgICAgICAgICAweEJCMkMKKyNkZWZpbmUgTVlSSV91cGRhdGluZyAgICAgICAgICAgICAgICAweDlEMjYKKyNkZWZpbmUgTVlSSV9Ccm9hZGNhc3RHZW5lcmF0ZVNlbmRpbmcgMHg5NEYwCisjZGVmaW5lIE1ZUklfSG9zdFNlbmRCdWZmZXIgICAgICAgICAgMHg5QUE0CisjZGVmaW5lIE1ZUklfSG9zdFNlbmRNZXNzYWdlcyAgICAgICAgMHg5QTlFCisjZGVmaW5lIE1ZUklfQnJvYWRjYXN0UmVsYXlTZW5kaW5nICAgMHg5NTdDCisjZGVmaW5lIE1ZUklfSG9zdFNlbmREbWFCdXN5ICAgICAgICAgMHg5QTA2CisjZGVmaW5lIE1ZUklfQnJvYWRjYXN0c1BlbmRpbmcgICAgICAgMHhCOENDCisjZGVmaW5lIE1ZUklfTmV0U2VuZE1hcFdhaXRpbmcgICAgICAgMHhCQTZBCisjZGVmaW5lIE1ZUklfTmV0UmVjZWl2ZUJhZFR5cGVzICAgICAgMHhCOENFCisjZGVmaW5lIE1ZUklfbG9va2luZ19mb3JfaG9zdHMgICAgICAgMHg5QzlBCisjZGVmaW5lIE1ZUklfYkJhZEhlYWRlciAgICAgICAgICAgICAgMHg5OTc4CisjZGVmaW5lIE1ZUklfSG9zdFNlbmRHYXRoZXJJbmRleCAgICAgMHg5QUE2CisjZGVmaW5lIE1ZUklfcm91dGVMb29rdXAgICAgICAgICAgICAgMHg3NzkwCisjZGVmaW5lIE1ZUklfTmV0UmVjZWl2ZU1lc3NhZ2VzICAgICAgMHhCOERFCisjZGVmaW5lIE1ZUklfRG1hSW5Vc2UgICAgICAgICAgICAgICAgMHhCN0FBCisjZGVmaW5lIE1ZUklfZXhwbG9yZXMgICAgICAgICAgICAgICAgMHg5REI4CisjZGVmaW5lIE1ZUklfSG9zdFNlbmQgICAgICAgICAgICAgICAgMHg5QTk4CisjZGVmaW5lIE1ZUklfRG1hUmVzZXRTcGluICAgICAgICAgICAgMHhCN0IyCisjZGVmaW5lIE1ZUklzdGFydCAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIE1ZUklfUm91dGVUYWJsZSAgICAgICAgICAgICAgMHhBMTY0CisjZGVmaW5lIE1ZUklfTWFjaGluZXMgICAgICAgICAgICAgICAgMHg5NkEyCisjZGVmaW5lIE1ZUklfdHJ5X3RoZV9ob3N0ICAgICAgICAgICAgMHg5QkM4CisjZGVmaW5lIE1ZUklfaXNyX3JlY29yZCAgICAgICAgICAgICAgMHg5NzZFCisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVEcm9wcyAgICAgICAgMHg5OTVBCisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVMZW5ndGggICAgICAgMHg5OTY0CisjZGVmaW5lIE1ZUklfdGltZXJzICAgICAgICAgICAgICAgICAgMHhCQjg4CisjZGVmaW5lIE1ZUklfTmV0U2VuZFdhaXRpbmcgICAgICAgICAgMHhCQTI0CisjZGVmaW5lIE1ZUklfTmV0U2VuZERyb3BzICAgICAgICAgICAgMHhCQjJFCisjZGVmaW5lIE1ZUklfY29tcGFyaW5nX2Ffc3dpdGNoICAgICAgMHg5Q0UwCisjZGVmaW5lIE1ZUklfT2xkTWFwQ2hlY2tzdW0gICAgICAgICAgMHhBMDRBCisjZGVmaW5lIE1ZUklfSG9zdFNlbmRRdWV1ZSAgICAgICAgICAgMHg5QUEyCisjZGVmaW5lIE1ZUklfTUFQUEVSX2hvc3QgICAgICAgICAgICAgMHhBMTJFCisjZGVmaW5lIE1ZUklfY29tcGFyZV9zd2l0Y2ggICAgICAgICAgMHhBMDNDCisjZGVmaW5lIE1ZUklfbWFpbiAgICAgICAgICAgICAgICAgICAgMHg4MEE2CisjZGVmaW5lIE1ZUklfTmV0UmVjZWl2ZUJhZENyY3MgICAgICAgMHhCOEQ0CisjZGVmaW5lIE1ZUklfTmV0UmVjZWl2ZUJ5dGVzICAgICAgICAgMHhCOERDCisKKyNlbmRpZiAvKiBTWU1CT0xfREVGSU5FU19DT01QSUxFRCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMgYi9kcml2ZXJzL25ldC9teXJpX3NidXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQ1NDk0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMKQEAgLTAsMCArMSwxMTc0IEBACisvKiBteXJpX3NidXMuaDogTXlyaUNPTSBNeXJpTkVUIFNCVVMgY2FyZCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqLworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gPQorICAgICAgICAibXlyaV9zYnVzLmM6djEuOSAxMi9TZXAvOTkgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvZHN0Lmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KKyNpbmNsdWRlIDxhc20vc2J1cy5oPgorI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgorI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9hdXhpby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgorCisjaW5jbHVkZSAibXlyaV9zYnVzLmgiCisjaW5jbHVkZSAibXlyaV9jb2RlLmgiCisKKy8qICNkZWZpbmUgREVCVUdfREVURUNUICovCisvKiAjZGVmaW5lIERFQlVHX0lSUSAqLworLyogI2RlZmluZSBERUJVR19UUkFOU01JVCAqLworLyogI2RlZmluZSBERUJVR19SRUNFSVZFICovCisvKiAjZGVmaW5lIERFQlVHX0hFQURFUiAqLworCisjaWZkZWYgREVCVUdfREVURUNUCisjZGVmaW5lIERFVCh4KSAgIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBERVQoeCkKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfSVJRCisjZGVmaW5lIERJUlEoeCkgIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBESVJRKHgpCisjZW5kaWYKKworI2lmZGVmIERFQlVHX1RSQU5TTUlUCisjZGVmaW5lIERUWCh4KSAgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIERUWCh4KQorI2VuZGlmCisKKyNpZmRlZiBERUJVR19SRUNFSVZFCisjZGVmaW5lIERSWCh4KSAgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIERSWCh4KQorI2VuZGlmCisKKyNpZmRlZiBERUJVR19IRUFERVIKKyNkZWZpbmUgREhEUih4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgREhEUih4KQorI2VuZGlmCisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBzdHJ1Y3QgbXlyaV9ldGggKnJvb3RfbXlyaV9kZXY7CisjZW5kaWYKKworc3RhdGljIHZvaWQgbXlyaV9yZXNldF9vZmYodm9pZCBfX2lvbWVtICpscCwgdm9pZCBfX2lvbWVtICpjcmVncykKK3sKKwkvKiBDbGVhciBJUlEgbWFzay4gKi8KKwlzYnVzX3dyaXRlbCgwLCBscCArIExBTkFJX0VJTUFTSyk7CisKKwkvKiBUdXJuIFJFU0VUIGZ1bmN0aW9uIG9mZi4gKi8KKwlzYnVzX3dyaXRlbChDT05UUk9MX1JPRkYsIGNyZWdzICsgTVlSSUNUUkxfQ1RSTCk7Cit9CisKK3N0YXRpYyB2b2lkIG15cmlfcmVzZXRfb24odm9pZCBfX2lvbWVtICpjcmVncykKK3sKKwkvKiBFbmFibGUgUkVTRVQgZnVuY3Rpb24uICovCisJc2J1c193cml0ZWwoQ09OVFJPTF9ST04sIGNyZWdzICsgTVlSSUNUUkxfQ1RSTCk7CisKKwkvKiBEaXNhYmxlIElSUSdzLiAqLworCXNidXNfd3JpdGVsKENPTlRST0xfRElSUSwgY3JlZ3MgKyBNWVJJQ1RSTF9DVFJMKTsKK30KKworc3RhdGljIHZvaWQgbXlyaV9kaXNhYmxlX2lycSh2b2lkIF9faW9tZW0gKmxwLCB2b2lkIF9faW9tZW0gKmNyZWdzKQoreworCXNidXNfd3JpdGVsKENPTlRST0xfRElSUSwgY3JlZ3MgKyBNWVJJQ1RSTF9DVFJMKTsKKwlzYnVzX3dyaXRlbCgwLCBscCArIExBTkFJX0VJTUFTSyk7CisJc2J1c193cml0ZWwoSVNUQVRfSE9TVCwgbHAgKyBMQU5BSV9JU1RBVCk7Cit9CisKK3N0YXRpYyB2b2lkIG15cmlfZW5hYmxlX2lycSh2b2lkIF9faW9tZW0gKmxwLCB2b2lkIF9faW9tZW0gKmNyZWdzKQoreworCXNidXNfd3JpdGVsKENPTlRST0xfRUlSUSwgY3JlZ3MgKyBNWVJJQ1RSTF9DVFJMKTsKKwlzYnVzX3dyaXRlbChJU1RBVF9IT1NULCBscCArIExBTkFJX0VJTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiYW5nX3RoZV9jaGlwKHN0cnVjdCBteXJpX2V0aCAqbXApCit7CisJc3RydWN0IG15cmlfc2htZW0gX19pb21lbSAqc2htZW0gPSBtcC0+c2htZW07CisJdm9pZCBfX2lvbWVtICpjcmVncwkJPSBtcC0+Y3JlZ3M7CisKKwlzYnVzX3dyaXRlbCgxLCAmc2htZW0tPnNlbmQpOworCXNidXNfd3JpdGVsKENPTlRST0xfV09OLCBjcmVncyArIE1ZUklDVFJMX0NUUkwpOworfQorCitzdGF0aWMgaW50IG15cmlfZG9faGFuZHNoYWtlKHN0cnVjdCBteXJpX2V0aCAqbXApCit7CisJc3RydWN0IG15cmlfc2htZW0gX19pb21lbSAqc2htZW0gPSBtcC0+c2htZW07CisJdm9pZCBfX2lvbWVtICpjcmVncyA9IG1wLT5jcmVnczsKKwlzdHJ1Y3QgbXlyaV9jaGFubmVsIF9faW9tZW0gKmNoYW4gPSAmc2htZW0tPmNoYW5uZWw7CisJaW50IHRpY2sgCQkJPSAwOworCisJREVUKCgibXlyaV9kb19oYW5kc2hha2U6ICIpKTsKKwlpZiAoc2J1c19yZWFkbCgmY2hhbi0+c3RhdGUpID09IFNUQVRFX1JFQURZKSB7CisJCURFVCgoIkFscmVhZHkgU1RBVEVfUkVBRFksIGZhaWxlZC5cbiIpKTsKKwkJcmV0dXJuIC0xOwkvKiBXZSdyZSBob3NlZC4uLiAqLworCX0KKworCW15cmlfZGlzYWJsZV9pcnEobXAtPmxyZWdzLCBjcmVncyk7CisKKwl3aGlsZSAodGljaysrIDw9IDI1KSB7CisJCXUzMiBzb2Z0c3RhdGU7CisKKwkJLyogV2FrZSBpdCB1cC4gKi8KKwkJREVUKCgic2hha2Vkb3duLCBDT05UUk9MX1dPTiwgIikpOworCQlzYnVzX3dyaXRlbCgxLCAmc2htZW0tPnNoYWtlZG93bik7CisJCXNidXNfd3JpdGVsKENPTlRST0xfV09OLCBjcmVncyArIE1ZUklDVFJMX0NUUkwpOworCisJCXNvZnRzdGF0ZSA9IHNidXNfcmVhZGwoJmNoYW4tPnN0YXRlKTsKKwkJREVUKCgiY2hhbnN0YXRlWyUwOHhdICIsIHNvZnRzdGF0ZSkpOworCQlpZiAoc29mdHN0YXRlID09IFNUQVRFX1JFQURZKSB7CisJCQlERVQoKCJ3YWtldXAgc3VjY2Vzc2Z1bCwgIikpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc29mdHN0YXRlICE9IFNUQVRFX1dGTikgeworCQkJREVUKCgibm90IFdGTiBzZXR0aW5nIHRoYXQsICIpKTsKKwkJCXNidXNfd3JpdGVsKFNUQVRFX1dGTiwgJmNoYW4tPnN0YXRlKTsKKwkJfQorCisJCXVkZWxheSgyMCk7CisJfQorCisJbXlyaV9lbmFibGVfaXJxKG1wLT5scmVncywgY3JlZ3MpOworCisJaWYgKHRpY2sgPiAyNSkgeworCQlERVQoKCIyNSB0aWNrcyB3ZSBsb3NlLCBmYWlsdXJlLlxuIikpOworCQlyZXR1cm4gLTE7CisJfQorCURFVCgoInN1Y2Nlc3NcbiIpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteXJpX2xvYWRfbGFuYWkoc3RydWN0IG15cmlfZXRoICptcCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2ID0gbXAtPmRldjsKKwlzdHJ1Y3QgbXlyaV9zaG1lbSBfX2lvbWVtICpzaG1lbSA9IG1wLT5zaG1lbTsKKwl2b2lkIF9faW9tZW0JCSpycHRyOworCWludCAJCQlpOworCisJbXlyaV9kaXNhYmxlX2lycShtcC0+bHJlZ3MsIG1wLT5jcmVncyk7CisJbXlyaV9yZXNldF9vbihtcC0+Y3JlZ3MpOworCisJcnB0ciA9IG1wLT5sYW5haTsKKwlmb3IgKGkgPSAwOyBpIDwgbXAtPmVlcHJvbS5yYW1zejsgaSsrKQorCQlzYnVzX3dyaXRlYigwLCBycHRyICsgaSk7CisKKwlpZiAobXAtPmVlcHJvbS5jcHV2ZXJzID49IENQVVZFUlNfM18wKQorCQlzYnVzX3dyaXRlbChtcC0+ZWVwcm9tLmN2YWwsIG1wLT5scmVncyArIExBTkFJX0NWQUwpOworCisJLyogTG9hZCBleGVjdXRhYmxlIGNvZGUuICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihsYW5haTRfY29kZSk7IGkrKykKKwkJc2J1c193cml0ZWIobGFuYWk0X2NvZGVbaV0sIHJwdHIgKyAobGFuYWk0X2NvZGVfb2ZmICogMikgKyBpKTsKKworCS8qIExvYWQgZGF0YSBzZWdtZW50LiAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobGFuYWk0X2RhdGEpOyBpKyspCisJCXNidXNfd3JpdGViKGxhbmFpNF9kYXRhW2ldLCBycHRyICsgKGxhbmFpNF9kYXRhX29mZiAqIDIpICsgaSk7CisKKwkvKiBTZXQgZGV2aWNlIGFkZHJlc3MuICovCisJc2J1c193cml0ZWIoMCwgJnNobWVtLT5hZGRyWzBdKTsKKwlzYnVzX3dyaXRlYigwLCAmc2htZW0tPmFkZHJbMV0pOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXNidXNfd3JpdGViKGRldi0+ZGV2X2FkZHJbaV0sCisJCQkgICAgJnNobWVtLT5hZGRyW2kgKyAyXSk7CisKKwkvKiBTZXQgU0JVUyBidXJzdHMgYW5kIGludGVycnVwdCBtYXNrLiAqLworCXNidXNfd3JpdGVsKCgobXAtPm15cmlfYnVyc3RzICYgMHhmOCkgPj4gMyksICZzaG1lbS0+YnVyc3QpOworCXNidXNfd3JpdGVsKFNITUVNX0lNQVNLX1JYLCAmc2htZW0tPmltYXNrKTsKKworCS8qIFJlbGVhc2UgdGhlIExBTkFJLiAqLworCW15cmlfZGlzYWJsZV9pcnEobXAtPmxyZWdzLCBtcC0+Y3JlZ3MpOworCW15cmlfcmVzZXRfb2ZmKG1wLT5scmVncywgbXAtPmNyZWdzKTsKKwlteXJpX2Rpc2FibGVfaXJxKG1wLT5scmVncywgbXAtPmNyZWdzKTsKKworCS8qIFdhaXQgZm9yIHRoZSByZXNldCB0byBjb21wbGV0ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTAwMDsgaSsrKSB7CisJCWlmIChzYnVzX3JlYWRsKCZzaG1lbS0+Y2hhbm5lbC5zdGF0ZSkgIT0gU1RBVEVfUkVBRFkpCisJCQlicmVhazsKKwkJZWxzZQorCQkJdWRlbGF5KDEwKTsKKwl9CisKKwlpZiAoaSA9PSA1MDAwKQorCQlwcmludGsoS0VSTl9FUlIgIm15cmljb206IENoaXAgd291bGQgbm90IHJlc2V0IGFmdGVyIGZpcm13YXJlIGxvYWQuXG4iKTsKKworCWkgPSBteXJpX2RvX2hhbmRzaGFrZShtcCk7CisJaWYgKGkpCisJCXByaW50ayhLRVJOX0VSUiAibXlyaWNvbTogSGFuZHNoYWtlIHdpdGggTEFOQUkgZmFpbGVkLlxuIik7CisKKwlpZiAobXAtPmVlcHJvbS5jcHV2ZXJzID09IENQVVZFUlNfNF8wKQorCQlzYnVzX3dyaXRlbCgwLCBtcC0+bHJlZ3MgKyBMQU5BSV9WRVJTKTsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBteXJpX2NsZWFuX3JpbmdzKHN0cnVjdCBteXJpX2V0aCAqbXApCit7CisJc3RydWN0IHNlbmRxIF9faW9tZW0gKnNxID0gbXAtPnNxOworCXN0cnVjdCByZWN2cSBfX2lvbWVtICpycSA9IG1wLT5ycTsKKwlpbnQgaTsKKworCXNidXNfd3JpdGVsKDAsICZycS0+dGFpbCk7CisJc2J1c193cml0ZWwoMCwgJnJxLT5oZWFkKTsKKwlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSsxKTsgaSsrKSB7CisJCWlmIChtcC0+cnhfc2tic1tpXSAhPSBOVUxMKSB7CisJCQlzdHJ1Y3QgbXlyaV9yeGQgX19pb21lbSAqcnhkID0gJnJxLT5teXJpX3J4ZFtpXTsKKwkJCXUzMiBkbWFfYWRkcjsKKworCQkJZG1hX2FkZHIgPSBzYnVzX3JlYWRsKCZyeGQtPm15cmlfc2NhdHRlcnNbMF0uYWRkcik7CisJCQlzYnVzX3VubWFwX3NpbmdsZShtcC0+bXlyaV9zZGV2LCBkbWFfYWRkciwgUlhfQUxMT0NfU0laRSwgU0JVU19ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKG1wLT5yeF9za2JzW2ldKTsKKwkJCW1wLT5yeF9za2JzW2ldID0gTlVMTDsKKwkJfQorCX0KKworCW1wLT50eF9vbGQgPSAwOworCXNidXNfd3JpdGVsKDAsICZzcS0+dGFpbCk7CisJc2J1c193cml0ZWwoMCwgJnNxLT5oZWFkKTsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKG1wLT50eF9za2JzW2ldICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBtcC0+dHhfc2tic1tpXTsKKwkJCXN0cnVjdCBteXJpX3R4ZCBfX2lvbWVtICp0eGQgPSAmc3EtPm15cmlfdHhkW2ldOworCQkJdTMyIGRtYV9hZGRyOworCisJCQlkbWFfYWRkciA9IHNidXNfcmVhZGwoJnR4ZC0+bXlyaV9nYXRoZXJzWzBdLmFkZHIpOworCQkJc2J1c191bm1hcF9zaW5nbGUobXAtPm15cmlfc2RldiwgZG1hX2FkZHIsIChza2ItPmxlbiArIDMpICYgfjMsIFNCVVNfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IobXAtPnR4X3NrYnNbaV0pOworCQkJbXAtPnR4X3NrYnNbaV0gPSBOVUxMOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBteXJpX2luaXRfcmluZ3Moc3RydWN0IG15cmlfZXRoICptcCwgaW50IGZyb21faXJxKQoreworCXN0cnVjdCByZWN2cSBfX2lvbWVtICpycSA9IG1wLT5ycTsKKwlzdHJ1Y3QgbXlyaV9yeGQgX19pb21lbSAqcnhkID0gJnJxLT5teXJpX3J4ZFswXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbXAtPmRldjsKKwlpbnQgZ2ZwX2ZsYWdzID0gR0ZQX0tFUk5FTDsKKwlpbnQgaTsKKworCWlmIChmcm9tX2lycSB8fCBpbl9pbnRlcnJ1cHQoKSkKKwkJZ2ZwX2ZsYWdzID0gR0ZQX0FUT01JQzsKKworCW15cmlfY2xlYW5fcmluZ3MobXApOworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbXlyaV9hbGxvY19za2IoUlhfQUxMT0NfU0laRSwgZ2ZwX2ZsYWdzKTsKKwkJdTMyIGRtYV9hZGRyOworCisJCWlmICghc2tiKQorCQkJY29udGludWU7CisJCW1wLT5yeF9za2JzW2ldID0gc2tiOworCQlza2ItPmRldiA9IGRldjsKKwkJc2tiX3B1dChza2IsIFJYX0FMTE9DX1NJWkUpOworCisJCWRtYV9hZGRyID0gc2J1c19tYXBfc2luZ2xlKG1wLT5teXJpX3NkZXYsIHNrYi0+ZGF0YSwgUlhfQUxMT0NfU0laRSwgU0JVU19ETUFfRlJPTURFVklDRSk7CisJCXNidXNfd3JpdGVsKGRtYV9hZGRyLCAmcnhkW2ldLm15cmlfc2NhdHRlcnNbMF0uYWRkcik7CisJCXNidXNfd3JpdGVsKFJYX0FMTE9DX1NJWkUsICZyeGRbaV0ubXlyaV9zY2F0dGVyc1swXS5sZW4pOworCQlzYnVzX3dyaXRlbChpLCAmcnhkW2ldLmN0eCk7CisJCXNidXNfd3JpdGVsKDEsICZyeGRbaV0ubnVtX3NnKTsKKwl9CisJc2J1c193cml0ZWwoMCwgJnJxLT5oZWFkKTsKKwlzYnVzX3dyaXRlbChSWF9SSU5HX1NJWkUsICZycS0+dGFpbCk7Cit9CisKK3N0YXRpYyBpbnQgbXlyaV9pbml0KHN0cnVjdCBteXJpX2V0aCAqbXAsIGludCBmcm9tX2lycSkKK3sKKwlteXJpX2luaXRfcmluZ3MobXAsIGZyb21faXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXlyaV9pc19ub3Rfc29faGFwcHkoc3RydWN0IG15cmlfZXRoICptcCkKK3sKK30KKworI2lmZGVmIERFQlVHX0hFQURFUgorc3RhdGljIHZvaWQgZHVtcF9laGRyKHN0cnVjdCBldGhoZHIgKmVoZHIpCit7CisJcHJpbnRrKCJlaGRyW2hfZHN0KCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KSIKKwkgICAgICAgImhfc291cmNlKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KWhfcHJvdG8oJTA0eCldXG4iLAorCSAgICAgICBlaGRyLT5oX2Rlc3RbMF0sIGVoZHItPmhfZGVzdFsxXSwgZWhkci0+aF9kZXN0WzJdLAorCSAgICAgICBlaGRyLT5oX2Rlc3RbM10sIGVoZHItPmhfZGVzdFs0XSwgZWhkci0+aF9kZXN0WzRdLAorCSAgICAgICBlaGRyLT5oX3NvdXJjZVswXSwgZWhkci0+aF9zb3VyY2VbMV0sIGVoZHItPmhfc291cmNlWzJdLAorCSAgICAgICBlaGRyLT5oX3NvdXJjZVszXSwgZWhkci0+aF9zb3VyY2VbNF0sIGVoZHItPmhfc291cmNlWzRdLAorCSAgICAgICBlaGRyLT5oX3Byb3RvKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9laGRyX2FuZF9teXJpcGFkKHVuc2lnbmVkIGNoYXIgKnN0dWZmKQoreworCXN0cnVjdCBldGhoZHIgKmVoZHIgPSAoc3RydWN0IGV0aGhkciAqKSAoc3R1ZmYgKyAyKTsKKworCXByaW50aygicGFkWyUwMng6JTAyeF0iLCBzdHVmZlswXSwgc3R1ZmZbMV0pOworCXByaW50aygiZWhkcltoX2RzdCglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCkiCisJICAgICAgICJoX3NvdXJjZSglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCloX3Byb3RvKCUwNHgpXVxuIiwKKwkgICAgICAgZWhkci0+aF9kZXN0WzBdLCBlaGRyLT5oX2Rlc3RbMV0sIGVoZHItPmhfZGVzdFsyXSwKKwkgICAgICAgZWhkci0+aF9kZXN0WzNdLCBlaGRyLT5oX2Rlc3RbNF0sIGVoZHItPmhfZGVzdFs0XSwKKwkgICAgICAgZWhkci0+aF9zb3VyY2VbMF0sIGVoZHItPmhfc291cmNlWzFdLCBlaGRyLT5oX3NvdXJjZVsyXSwKKwkgICAgICAgZWhkci0+aF9zb3VyY2VbM10sIGVoZHItPmhfc291cmNlWzRdLCBlaGRyLT5oX3NvdXJjZVs0XSwKKwkgICAgICAgZWhkci0+aF9wcm90byk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgbXlyaV90eChzdHJ1Y3QgbXlyaV9ldGggKm1wLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzZW5kcSBfX2lvbWVtICpzcT0gbXAtPnNxOworCWludCBlbnRyeQkJPSBtcC0+dHhfb2xkOworCWludCBsaW1pdAkJPSBzYnVzX3JlYWRsKCZzcS0+aGVhZCk7CisKKwlEVFgoKCJlbnRyeVslZF0gbGltaXRbJWRdICIsIGVudHJ5LCBsaW1pdCkpOworCWlmIChlbnRyeSA9PSBsaW1pdCkKKwkJcmV0dXJuOworCXdoaWxlIChlbnRyeSAhPSBsaW1pdCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbXAtPnR4X3NrYnNbZW50cnldOworCQl1MzIgZG1hX2FkZHI7CisKKwkJRFRYKCgiU0tCWyVkXSAiLCBlbnRyeSkpOworCQlkbWFfYWRkciA9IHNidXNfcmVhZGwoJnNxLT5teXJpX3R4ZFtlbnRyeV0ubXlyaV9nYXRoZXJzWzBdLmFkZHIpOworCQlzYnVzX3VubWFwX3NpbmdsZShtcC0+bXlyaV9zZGV2LCBkbWFfYWRkciwgc2tiLT5sZW4sIFNCVVNfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQltcC0+dHhfc2tic1tlbnRyeV0gPSBOVUxMOworCQltcC0+ZW5ldF9zdGF0cy50eF9wYWNrZXRzKys7CisJCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CisJfQorCW1wLT50eF9vbGQgPSBlbnRyeTsKK30KKworLyogRGV0ZXJtaW5lIHRoZSBwYWNrZXQncyBwcm90b2NvbCBJRC4gVGhlIHJ1bGUgaGVyZSBpcyB0aGF0IHdlIAorICogYXNzdW1lIDgwMi4zIGlmIHRoZSB0eXBlIGZpZWxkIGlzIHNob3J0IGVub3VnaCB0byBiZSBhIGxlbmd0aC4KKyAqIFRoaXMgaXMgbm9ybWFsIHByYWN0aWNlIGFuZCB3b3JrcyBmb3IgYW55ICdub3cgaW4gdXNlJyBwcm90b2NvbC4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG15cmlfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBldGhoZHIgKmV0aDsKKwl1bnNpZ25lZCBjaGFyICpyYXdwOworCQorCXNrYi0+bWFjLnJhdyA9ICgoKHVuc2lnbmVkIGNoYXIgKilza2ItPmRhdGEpICsgTVlSSV9QQURfTEVOKTsKKwlza2JfcHVsbChza2IsIGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwlldGggPSBldGhfaGRyKHNrYik7CisJCisjaWZkZWYgREVCVUdfSEVBREVSCisJREhEUigoIm15cmlfdHlwZV90cmFuczogIikpOworCWR1bXBfZWhkcihldGgpOworI2VuZGlmCisJaWYgKCpldGgtPmhfZGVzdCAmIDEpIHsKKwkJaWYgKG1lbWNtcChldGgtPmhfZGVzdCwgZGV2LT5icm9hZGNhc3QsIEVUSF9BTEVOKT09MCkKKwkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfQlJPQURDQVNUOworCQllbHNlCisJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX01VTFRJQ0FTVDsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiAoSUZGX1BST01JU0N8SUZGX0FMTE1VTFRJKSkgeworCQlpZiAobWVtY21wKGV0aC0+aF9kZXN0LCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpCisJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwl9CisJCisJaWYgKG50b2hzKGV0aC0+aF9wcm90bykgPj0gMTUzNikKKwkJcmV0dXJuIGV0aC0+aF9wcm90bzsKKwkJCisJcmF3cCA9IHNrYi0+ZGF0YTsKKwkKKwkvKiBUaGlzIGlzIGEgbWFnaWMgaGFjayB0byBzcG90IElQWCBwYWNrZXRzLiBPbGRlciBOb3ZlbGwgYnJlYWtzCisJICogdGhlIHByb3RvY29sIGRlc2lnbiBhbmQgcnVucyBJUFggb3ZlciA4MDIuMyB3aXRob3V0IGFuIDgwMi4yIExMQworCSAqIGxheWVyLiBXZSBsb29rIGZvciBGRkZGIHdoaWNoIGlzbid0IGEgdXNlZCA4MDIuMiBTU0FQL0RTQVAuIFRoaXMKKwkgKiB3b24ndCB3b3JrIGZvciBmYXVsdCB0b2xlcmFudCBuZXR3YXJlIGJ1dCBkb2VzIGZvciB0aGUgcmVzdC4KKwkgKi8KKwlpZiAoKih1bnNpZ25lZCBzaG9ydCAqKXJhd3AgPT0gMHhGRkZGKQorCQlyZXR1cm4gaHRvbnMoRVRIX1BfODAyXzMpOworCQkKKwkvKiBSZWFsIDgwMi4yIExMQyAqLworCXJldHVybiBodG9ucyhFVEhfUF84MDJfMik7Cit9CisKK3N0YXRpYyB2b2lkIG15cmlfcngoc3RydWN0IG15cmlfZXRoICptcCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmVjdnEgX19pb21lbSAqcnEgPSBtcC0+cnE7CisJc3RydWN0IHJlY3ZxIF9faW9tZW0gKnJxYSA9IG1wLT5ycWFjazsKKwlpbnQgZW50cnkJCT0gc2J1c19yZWFkbCgmcnFhLT5oZWFkKTsKKwlpbnQgbGltaXQJCT0gc2J1c19yZWFkbCgmcnFhLT50YWlsKTsKKwlpbnQgZHJvcHM7CisKKwlEUlgoKCJlbnRyeVslZF0gbGltaXRbJWRdICIsIGVudHJ5LCBsaW1pdCkpOworCWlmIChlbnRyeSA9PSBsaW1pdCkKKwkJcmV0dXJuOworCWRyb3BzID0gMDsKKwlEUlgoKCJcbiIpKTsKKwl3aGlsZSAoZW50cnkgIT0gbGltaXQpIHsKKwkJc3RydWN0IG15cmlfcnhkIF9faW9tZW0gKnJ4ZGFjayA9ICZycWEtPm15cmlfcnhkW2VudHJ5XTsKKwkJdTMyIGNzdW0JCT0gc2J1c19yZWFkbCgmcnhkYWNrLT5jc3VtKTsKKwkJaW50IGxlbgkJCT0gc2J1c19yZWFkbCgmcnhkYWNrLT5teXJpX3NjYXR0ZXJzWzBdLmxlbik7CisJCWludCBpbmRleAkJPSBzYnVzX3JlYWRsKCZyeGRhY2stPmN0eCk7CisJCXN0cnVjdCBteXJpX3J4ZCBfX2lvbWVtICpyeGQgPSAmcnEtPm15cmlfcnhkW3NidXNfcmVhZGwoJnJxLT50YWlsKV07CisJCXN0cnVjdCBza19idWZmICpza2IJPSBtcC0+cnhfc2tic1tpbmRleF07CisKKwkJLyogQWNrIGl0LiAqLworCQlzYnVzX3dyaXRlbChORVhUX1JYKGVudHJ5KSwgJnJxYS0+aGVhZCk7CisKKwkJLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KKwkJRFJYKCgicnhkWyVkXTogJXAgbGVuWyVkXSBjc3VtWyUwOHhdICIsIGVudHJ5LCByeGQsIGxlbiwgY3N1bSkpOworCQlzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KG1wLT5teXJpX3NkZXYsCisJCQkJCSAgICAgc2J1c19yZWFkbCgmcnhkLT5teXJpX3NjYXR0ZXJzWzBdLmFkZHIpLAorCQkJCQkgICAgIFJYX0FMTE9DX1NJWkUsIFNCVVNfRE1BX0ZST01ERVZJQ0UpOworCQlpZiAobGVuIDwgKEVUSF9ITEVOICsgTVlSSV9QQURfTEVOKSB8fCAoc2tiLT5kYXRhWzBdICE9IE1ZUklfUEFEX0xFTikpIHsKKwkJCURSWCgoIkVSUk9SWyIpKTsKKwkJCW1wLT5lbmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKGxlbiA8IChFVEhfSExFTiArIE1ZUklfUEFEX0xFTikpIHsKKwkJCQlEUlgoKCJCQURfTEVOR1RIXSAiKSk7CisJCQkJbXAtPmVuZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJfSBlbHNlIHsKKwkJCQlEUlgoKCJOT19QQURESU5HXSAiKSk7CisJCQkJbXAtPmVuZXRfc3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQl9CisKKwkJCS8qIFJldHVybiBpdCB0byB0aGUgTEFOQUkuICovCisJZHJvcF9pdDoKKwkJCWRyb3BzKys7CisJCQlEUlgoKCJEUk9QICIpKTsKKwkJCW1wLT5lbmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobXAtPm15cmlfc2RldiwKKwkJCQkJCQlzYnVzX3JlYWRsKCZyeGQtPm15cmlfc2NhdHRlcnNbMF0uYWRkciksCisJCQkJCQkJUlhfQUxMT0NfU0laRSwKKwkJCQkJCQlTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNidXNfd3JpdGVsKFJYX0FMTE9DX1NJWkUsICZyeGQtPm15cmlfc2NhdHRlcnNbMF0ubGVuKTsKKwkJCXNidXNfd3JpdGVsKGluZGV4LCAmcnhkLT5jdHgpOworCQkJc2J1c193cml0ZWwoMSwgJnJ4ZC0+bnVtX3NnKTsKKwkJCXNidXNfd3JpdGVsKE5FWFRfUlgoc2J1c19yZWFkbCgmcnEtPnRhaWwpKSwgJnJxLT50YWlsKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCURSWCgoImxlblslZF0gIiwgbGVuKSk7CisJCWlmIChsZW4gPiBSWF9DT1BZX1RIUkVTSE9MRCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisJCQl1MzIgZG1hX2FkZHI7CisKKwkJCURSWCgoIkJJR0JVRkYgIikpOworCQkJbmV3X3NrYiA9IG15cmlfYWxsb2Nfc2tiKFJYX0FMTE9DX1NJWkUsIEdGUF9BVE9NSUMpOworCQkJaWYgKG5ld19za2IgPT0gTlVMTCkgeworCQkJCURSWCgoInNrYl9hbGxvYyhGQUlMRUQpICIpKTsKKwkJCQlnb3RvIGRyb3BfaXQ7CisJCQl9CisJCQlzYnVzX3VubWFwX3NpbmdsZShtcC0+bXlyaV9zZGV2LAorCQkJCQkgIHNidXNfcmVhZGwoJnJ4ZC0+bXlyaV9zY2F0dGVyc1swXS5hZGRyKSwKKwkJCQkJICBSWF9BTExPQ19TSVpFLAorCQkJCQkgIFNCVVNfRE1BX0ZST01ERVZJQ0UpOworCQkJbXAtPnJ4X3NrYnNbaW5kZXhdID0gbmV3X3NrYjsKKwkJCW5ld19za2ItPmRldiA9IGRldjsKKwkJCXNrYl9wdXQobmV3X3NrYiwgUlhfQUxMT0NfU0laRSk7CisJCQlkbWFfYWRkciA9IHNidXNfbWFwX3NpbmdsZShtcC0+bXlyaV9zZGV2LAorCQkJCQkJICAgbmV3X3NrYi0+ZGF0YSwKKwkJCQkJCSAgIFJYX0FMTE9DX1NJWkUsCisJCQkJCQkgICBTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNidXNfd3JpdGVsKGRtYV9hZGRyLCAmcnhkLT5teXJpX3NjYXR0ZXJzWzBdLmFkZHIpOworCQkJc2J1c193cml0ZWwoUlhfQUxMT0NfU0laRSwgJnJ4ZC0+bXlyaV9zY2F0dGVyc1swXS5sZW4pOworCQkJc2J1c193cml0ZWwoaW5kZXgsICZyeGQtPmN0eCk7CisJCQlzYnVzX3dyaXRlbCgxLCAmcnhkLT5udW1fc2cpOworCQkJc2J1c193cml0ZWwoTkVYVF9SWChzYnVzX3JlYWRsKCZycS0+dGFpbCkpLCAmcnEtPnRhaWwpOworCisJCQkvKiBUcmltIHRoZSBvcmlnaW5hbCBza2IgZm9yIHRoZSBuZXRpZi4gKi8KKwkJCURSWCgoInRyaW0oJWQpICIsIGxlbikpOworCQkJc2tiX3RyaW0oc2tiLCBsZW4pOworCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKmNvcHlfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJCQlEUlgoKCJTTUFMTEJVRkYgIikpOworCQkJaWYgKGNvcHlfc2tiID09IE5VTEwpIHsKKwkJCQlEUlgoKCJkZXZfYWxsb2Nfc2tiKEZBSUxFRCkgIikpOworCQkJCWdvdG8gZHJvcF9pdDsKKwkJCX0KKwkJCS8qIERNQSBzeW5jIGFscmVhZHkgZG9uZSBhYm92ZS4gKi8KKwkJCWNvcHlfc2tiLT5kZXYgPSBkZXY7CisJCQlEUlgoKCJyZXN2X2FuZF9wdXQgIikpOworCQkJc2tiX3B1dChjb3B5X3NrYiwgbGVuKTsKKwkJCW1lbWNweShjb3B5X3NrYi0+ZGF0YSwgc2tiLT5kYXRhLCBsZW4pOworCisJCQkvKiBSZXVzZSBvcmlnaW5hbCByaW5nIGJ1ZmZlci4gKi8KKwkJCURSWCgoInJldXNlICIpKTsKKwkJCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobXAtPm15cmlfc2RldiwKKwkJCQkJCQlzYnVzX3JlYWRsKCZyeGQtPm15cmlfc2NhdHRlcnNbMF0uYWRkciksCisJCQkJCQkJUlhfQUxMT0NfU0laRSwKKwkJCQkJCQlTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNidXNfd3JpdGVsKFJYX0FMTE9DX1NJWkUsICZyeGQtPm15cmlfc2NhdHRlcnNbMF0ubGVuKTsKKwkJCXNidXNfd3JpdGVsKGluZGV4LCAmcnhkLT5jdHgpOworCQkJc2J1c193cml0ZWwoMSwgJnJ4ZC0+bnVtX3NnKTsKKwkJCXNidXNfd3JpdGVsKE5FWFRfUlgoc2J1c19yZWFkbCgmcnEtPnRhaWwpKSwgJnJxLT50YWlsKTsKKworCQkJc2tiID0gY29weV9za2I7CisJCX0KKworCQkvKiBKdXN0IGxpa2UgdGhlIGhhcHB5IG1lYWwgd2UgZ2V0IGNoZWNrc3VtcyBmcm9tIHRoaXMgY2FyZC4gKi8KKwkJc2tiLT5jc3VtID0gY3N1bTsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsgLyogWFhYICovCisKKwkJc2tiLT5wcm90b2NvbCA9IG15cmlfdHlwZV90cmFucyhza2IsIGRldik7CisJCURSWCgoInByb3RbJTA0eF0gbmV0aWZfcnggIiwgc2tiLT5wcm90b2NvbCkpOworCQluZXRpZl9yeChza2IpOworCisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW1wLT5lbmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKKwkJbXAtPmVuZXRfc3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCW5leHQ6CisJCURSWCgoIk5FWFRcbiIpKTsKKwkJZW50cnkgPSBORVhUX1JYKGVudHJ5KTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBteXJpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYJCT0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgbXlyaV9ldGggKm1wCQk9IChzdHJ1Y3QgbXlyaV9ldGggKikgZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqbHJlZ3MJCT0gbXAtPmxyZWdzOworCXN0cnVjdCBteXJpX2NoYW5uZWwgX19pb21lbSAqY2hhbiA9ICZtcC0+c2htZW0tPmNoYW5uZWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgc3RhdHVzOworCWludCBoYW5kbGVkID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtcC0+aXJxX2xvY2ssIGZsYWdzKTsKKworCXN0YXR1cyA9IHNidXNfcmVhZGwobHJlZ3MgKyBMQU5BSV9JU1RBVCk7CisJRElSUSgoIm15cmlfaW50ZXJydXB0OiBzdGF0dXNbJTA4eF0gIiwgc3RhdHVzKSk7CisJaWYgKHN0YXR1cyAmIElTVEFUX0hPU1QpIHsKKwkJdTMyIHNvZnRzdGF0ZTsKKworCQloYW5kbGVkID0gMTsKKwkJRElSUSgoIklSUV9ESVNBQiAiKSk7CisJCW15cmlfZGlzYWJsZV9pcnEobHJlZ3MsIG1wLT5jcmVncyk7CisJCXNvZnRzdGF0ZSA9IHNidXNfcmVhZGwoJmNoYW4tPnN0YXRlKTsKKwkJRElSUSgoInN0YXRlWyUwOHhdICIsIHNvZnRzdGF0ZSkpOworCQlpZiAoc29mdHN0YXRlICE9IFNUQVRFX1JFQURZKSB7CisJCQlESVJRKCgibXlyaV9ub3Rfc29faGFwcHkgIikpOworCQkJbXlyaV9pc19ub3Rfc29faGFwcHkobXApOworCQl9CisJCURJUlEoKCJcbm15cmlfcng6ICIpKTsKKwkJbXlyaV9yeChtcCwgZGV2KTsKKwkJRElSUSgoIlxuaXN0YXQ9SVNUQVRfSE9TVCAiKSk7CisJCXNidXNfd3JpdGVsKElTVEFUX0hPU1QsIGxyZWdzICsgTEFOQUlfSVNUQVQpOworCQlESVJRKCgiSVJRX0VOQUIgIikpOworCQlteXJpX2VuYWJsZV9pcnEobHJlZ3MsIG1wLT5jcmVncyk7CisJfQorCURJUlEoKCJcbiIpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5pcnFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyBpbnQgbXlyaV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG15cmlfZXRoICptcCA9IChzdHJ1Y3QgbXlyaV9ldGggKikgZGV2LT5wcml2OworCisJcmV0dXJuIG15cmlfaW5pdChtcCwgaW5faW50ZXJydXB0KCkpOworfQorCitzdGF0aWMgaW50IG15cmlfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXlyaV9ldGggKm1wID0gKHN0cnVjdCBteXJpX2V0aCAqKSBkZXYtPnByaXY7CisKKwlteXJpX2NsZWFuX3JpbmdzKG1wKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXlyaV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG15cmlfZXRoICptcCA9IChzdHJ1Y3QgbXlyaV9ldGggKikgZGV2LT5wcml2OworCisJcHJpbnRrKEtFUk5fRVJSICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCByZXNldHRpbmdcbiIsIGRldi0+bmFtZSk7CisKKwltcC0+ZW5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwlteXJpX2luaXQobXAsIDApOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBteXJpX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXlyaV9ldGggKm1wID0gKHN0cnVjdCBteXJpX2V0aCAqKSBkZXYtPnByaXY7CisJc3RydWN0IHNlbmRxIF9faW9tZW0gKnNxID0gbXAtPnNxOworCXN0cnVjdCBteXJpX3R4ZCBfX2lvbWVtICp0eGQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaGVhZCwgdGFpbDsKKwlpbnQgbGVuLCBlbnRyeTsKKwl1MzIgZG1hX2FkZHI7CisKKwlEVFgoKCJteXJpX3N0YXJ0X3htaXQ6ICIpKTsKKworCW15cmlfdHgobXAsIGRldik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBUaGlzIGlzIGp1c3QgdG8gcHJldmVudCBtdWx0aXBsZSBQSU8gcmVhZHMgZm9yIFRYX0JVRkZTX0FWQUlMLiAqLworCWhlYWQgPSBzYnVzX3JlYWRsKCZzcS0+aGVhZCk7CisJdGFpbCA9IHNidXNfcmVhZGwoJnNxLT50YWlsKTsKKworCWlmICghVFhfQlVGRlNfQVZBSUwoaGVhZCwgdGFpbCkpIHsKKwkJRFRYKCgibm8gYnVmZnMgYXZhaWxhYmxlLCByZXR1cm5pbmcgMVxuIikpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPmlycV9sb2NrLCBmbGFncyk7CisKKwlESERSKCgieG1pdFtza2JkYXRhKCVwKV1cbiIsIHNrYi0+ZGF0YSkpOworI2lmZGVmIERFQlVHX0hFQURFUgorCWR1bXBfZWhkcl9hbmRfbXlyaXBhZCgoKHVuc2lnbmVkIGNoYXIgKikgc2tiLT5kYXRhKSk7CisjZW5kaWYKKworCS8qIFhYWCBNYXliZSB0aGlzIGNhbiBnbyBhcyB3ZWxsLiAqLworCWxlbiA9IHNrYi0+bGVuOworCWlmIChsZW4gJiAzKSB7CisJCURUWCgoImxlbiYzICIpKTsKKwkJbGVuID0gKGxlbiArIDQpICYgKH4zKTsKKwl9CisKKwllbnRyeSA9IHNidXNfcmVhZGwoJnNxLT50YWlsKTsKKworCXR4ZCA9ICZzcS0+bXlyaV90eGRbZW50cnldOworCW1wLT50eF9za2JzW2VudHJ5XSA9IHNrYjsKKworCS8qIE11c3QgZG8gdGhpcyBiZWZvcmUgd2Ugc2J1cyBtYXAgaXQuICovCisJaWYgKHNrYi0+ZGF0YVtNWVJJX1BBRF9MRU5dICYgMHgxKSB7CisJCXNidXNfd3JpdGV3KDB4ZmZmZiwgJnR4ZC0+YWRkclswXSk7CisJCXNidXNfd3JpdGV3KDB4ZmZmZiwgJnR4ZC0+YWRkclsxXSk7CisJCXNidXNfd3JpdGV3KDB4ZmZmZiwgJnR4ZC0+YWRkclsyXSk7CisJCXNidXNfd3JpdGV3KDB4ZmZmZiwgJnR4ZC0+YWRkclszXSk7CisJfSBlbHNlIHsKKwkJc2J1c193cml0ZXcoMHhmZmZmLCAmdHhkLT5hZGRyWzBdKTsKKwkJc2J1c193cml0ZXcoKHNrYi0+ZGF0YVswXSA8PCA4KSB8IHNrYi0+ZGF0YVsxXSwgJnR4ZC0+YWRkclsxXSk7CisJCXNidXNfd3JpdGV3KChza2ItPmRhdGFbMl0gPDwgOCkgfCBza2ItPmRhdGFbM10sICZ0eGQtPmFkZHJbMl0pOworCQlzYnVzX3dyaXRldygoc2tiLT5kYXRhWzRdIDw8IDgpIHwgc2tiLT5kYXRhWzVdLCAmdHhkLT5hZGRyWzNdKTsKKwl9CisKKwlkbWFfYWRkciA9IHNidXNfbWFwX3NpbmdsZShtcC0+bXlyaV9zZGV2LCBza2ItPmRhdGEsIGxlbiwgU0JVU19ETUFfVE9ERVZJQ0UpOworCXNidXNfd3JpdGVsKGRtYV9hZGRyLCAmdHhkLT5teXJpX2dhdGhlcnNbMF0uYWRkcik7CisJc2J1c193cml0ZWwobGVuLCAmdHhkLT5teXJpX2dhdGhlcnNbMF0ubGVuKTsKKwlzYnVzX3dyaXRlbCgxLCAmdHhkLT5udW1fc2cpOworCXNidXNfd3JpdGVsKEtFUk5FTF9DSEFOTkVMLCAmdHhkLT5jaGFuKTsKKwlzYnVzX3dyaXRlbChsZW4sICZ0eGQtPmxlbik7CisJc2J1c193cml0ZWwoKHUzMiktMSwgJnR4ZC0+Y3N1bV9vZmYpOworCXNidXNfd3JpdGVsKDAsICZ0eGQtPmNzdW1fZmllbGQpOworCisJc2J1c193cml0ZWwoTkVYVF9UWChlbnRyeSksICZzcS0+dGFpbCk7CisJRFRYKCgiQmFuZ1RoZUNoaXAgIikpOworCWJhbmdfdGhlX2NoaXAobXApOworCisJRFRYKCgidGJ1c3k9MCwgcmV0dXJuaW5nIDBcbiIpKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5pcnFfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKiBDcmVhdGUgdGhlIE15cmlOZXQgTUFDIGhlYWRlciBmb3IgYW4gYXJiaXRyYXJ5IHByb3RvY29sIGxheWVyIAorICoKKyAqIHNhZGRyPU5VTEwJbWVhbnMgdXNlIGRldmljZSBzb3VyY2UgYWRkcmVzcworICogZGFkZHI9TlVMTAltZWFucyBsZWF2ZSBkZXN0aW5hdGlvbiBhZGRyZXNzIChlZyB1bnJlc29sdmVkIGFycCkKKyAqLworc3RhdGljIGludCBteXJpX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB0eXBlLAorCQkgICAgICAgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKikgc2tiX3B1c2goc2tiLCBFVEhfSExFTik7CisJdW5zaWduZWQgY2hhciAqcGFkID0gKHVuc2lnbmVkIGNoYXIgKikgc2tiX3B1c2goc2tiLCBNWVJJX1BBRF9MRU4pOworCisjaWZkZWYgREVCVUdfSEVBREVSCisJREhEUigoIm15cmlfaGVhZGVyOiBwYWRbJTAyeCwlMDJ4XSAiLCBwYWRbMF0sIHBhZFsxXSkpOworCWR1bXBfZWhkcihldGgpOworI2VuZGlmCisKKwkvKiBTZXQgdGhlIE15cmlORVQgcGFkZGluZyBpZGVudGlmaWVyLiAqLworCXBhZFswXSA9IE1ZUklfUEFEX0xFTjsKKwlwYWRbMV0gPSAweGFiOworCisJLyogU2V0IHRoZSBwcm90b2NvbCB0eXBlLiBGb3IgYSBwYWNrZXQgb2YgdHlwZSBFVEhfUF84MDJfMyB3ZSBwdXQgdGhlIGxlbmd0aAorCSAqIGluIGhlcmUgaW5zdGVhZC4gSXQgaXMgdXAgdG8gdGhlIDgwMi4yIGxheWVyIHRvIGNhcnJ5IHByb3RvY29sIGluZm9ybWF0aW9uLgorCSAqLworCWlmICh0eXBlICE9IEVUSF9QXzgwMl8zKSAKKwkJZXRoLT5oX3Byb3RvID0gaHRvbnModHlwZSk7CisJZWxzZQorCQlldGgtPmhfcHJvdG8gPSBodG9ucyhsZW4pOworCisJLyogU2V0IHRoZSBzb3VyY2UgaGFyZHdhcmUgYWRkcmVzcy4gKi8KKwlpZiAoc2FkZHIpCisJCW1lbWNweShldGgtPmhfc291cmNlLCBzYWRkciwgZGV2LT5hZGRyX2xlbik7CisJZWxzZQorCQltZW1jcHkoZXRoLT5oX3NvdXJjZSwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisKKwkvKiBBbnl3YXksIHRoZSBsb29wYmFjay1kZXZpY2Ugc2hvdWxkIG5ldmVyIHVzZSB0aGlzIGZ1bmN0aW9uLi4uICovCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPmFkZHJfbGVuOyBpKyspCisJCQlldGgtPmhfZGVzdFtpXSA9IDA7CisJCXJldHVybihkZXYtPmhhcmRfaGVhZGVyX2xlbik7CisJfQorCQorCWlmIChkYWRkcikgeworCQltZW1jcHkoZXRoLT5oX2Rlc3QsIGRhZGRyLCBkZXYtPmFkZHJfbGVuKTsKKwkJcmV0dXJuIGRldi0+aGFyZF9oZWFkZXJfbGVuOworCX0KKwlyZXR1cm4gLWRldi0+aGFyZF9oZWFkZXJfbGVuOworfQorCisvKiBSZWJ1aWxkIHRoZSBNeXJpTmV0IE1BQyBoZWFkZXIuIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFuIEFSUAorICogKG9yIGluIGZ1dHVyZSBvdGhlciBhZGRyZXNzIHJlc29sdXRpb24pIGhhcyBjb21wbGV0ZWQgb24gdGhpcworICogc2tfYnVmZi4gV2Ugbm93IGxldCBBUlAgZmlsbCBpbiB0aGUgb3RoZXIgZmllbGRzLgorICovCitzdGF0aWMgaW50IG15cmlfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBjaGFyICpwYWQgPSAodW5zaWduZWQgY2hhciAqKSBza2ItPmRhdGE7CisJc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKikgKHBhZCArIE1ZUklfUEFEX0xFTik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCisjaWZkZWYgREVCVUdfSEVBREVSCisJREhEUigoIm15cmlfcmVidWlsZF9oZWFkZXI6IHBhZFslMDJ4LCUwMnhdICIsIHBhZFswXSwgcGFkWzFdKSk7CisJZHVtcF9laGRyKGV0aCk7CisjZW5kaWYKKworCS8qIFJlZmlsbCBNeXJpTmV0IHBhZGRpbmcgaWRlbnRpZmllcnMsIHRoaXMgaXMganVzdCBiZWluZyBhbmFsLiAqLworCXBhZFswXSA9IE1ZUklfUEFEX0xFTjsKKwlwYWRbMV0gPSAweGFiOworCisJc3dpdGNoIChldGgtPmhfcHJvdG8pCisJeworI2lmZGVmIENPTkZJR19JTkVUCisJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKToKKyAJCXJldHVybiBhcnBfZmluZChldGgtPmhfZGVzdCwgc2tiKTsKKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgCisJCSAgICAgICAiJXM6IHVuYWJsZSB0byByZXNvbHZlIHR5cGUgJVggYWRkcmVzc2VzLlxuIiwgCisJCSAgICAgICBkZXYtPm5hbWUsIChpbnQpZXRoLT5oX3Byb3RvKTsKKwkJCisJCW1lbWNweShldGgtPmhfc291cmNlLCBkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKTsKKwkJcmV0dXJuIDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOwkKK30KKworaW50IG15cmlfaGVhZGVyX2NhY2hlKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3QgaGhfY2FjaGUgKmhoKQoreworCXVuc2lnbmVkIHNob3J0IHR5cGUgPSBoaC0+aGhfdHlwZTsKKwl1bnNpZ25lZCBjaGFyICpwYWQ7CisJc3RydWN0IGV0aGhkciAqZXRoOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZWlnaC0+ZGV2OworCisJcGFkID0gKCh1bnNpZ25lZCBjaGFyICopIGhoLT5oaF9kYXRhKSArCisJCUhIX0RBVEFfT0ZGKHNpemVvZigqZXRoKSArIE1ZUklfUEFEX0xFTik7CisJZXRoID0gKHN0cnVjdCBldGhoZHIgKikgKHBhZCArIE1ZUklfUEFEX0xFTik7CisKKwlpZiAodHlwZSA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8zKSkKKwkJcmV0dXJuIC0xOworCisJLyogUmVmaWxsIE15cmlOZXQgcGFkZGluZyBpZGVudGlmaWVycywgdGhpcyBpcyBqdXN0IGJlaW5nIGFuYWwuICovCisJcGFkWzBdID0gTVlSSV9QQURfTEVOOworCXBhZFsxXSA9IDB4YWI7CisKKwlldGgtPmhfcHJvdG8gPSB0eXBlOworCW1lbWNweShldGgtPmhfc291cmNlLCBkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKTsKKwltZW1jcHkoZXRoLT5oX2Rlc3QsIG5laWdoLT5oYSwgZGV2LT5hZGRyX2xlbik7CisJaGgtPmhoX2xlbiA9IDE2OworCXJldHVybiAwOworfQorCisKKy8qIENhbGxlZCBieSBBZGRyZXNzIFJlc29sdXRpb24gbW9kdWxlIHRvIG5vdGlmeSBjaGFuZ2VzIGluIGFkZHJlc3MuICovCit2b2lkIG15cmlfaGVhZGVyX2NhY2hlX3VwZGF0ZShzdHJ1Y3QgaGhfY2FjaGUgKmhoLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICogaGFkZHIpCit7CisJbWVtY3B5KCgodTgqKWhoLT5oaF9kYXRhKSArIEhIX0RBVEFfT0ZGKHNpemVvZihzdHJ1Y3QgZXRoaGRyKSksCisJICAgICAgIGhhZGRyLCBkZXYtPmFkZHJfbGVuKTsKK30KKworc3RhdGljIGludCBteXJpX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKChuZXdfbXR1IDwgKEVUSF9ITEVOICsgTVlSSV9QQURfTEVOKSkgfHwgKG5ld19tdHUgPiBNWVJJTkVUX01UVSkpCisJCXJldHVybiAtRUlOVkFMOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpteXJpX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreyByZXR1cm4gJigoKHN0cnVjdCBteXJpX2V0aCAqKWRldi0+cHJpdiktPmVuZXRfc3RhdHMpOyB9CisKK3N0YXRpYyB2b2lkIG15cmlfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIERvIG5vdGhpbmcsIGFsbCBNeXJpQ09NIG5vZGVzIHRyYW5zbWl0IG11bHRpY2FzdCBmcmFtZXMKKwkgKiBhcyBicm9hZGNhc3QgcGFja2V0cy4uLgorCSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JvYXJkaWRfZnJvbV9pZHByb20oc3RydWN0IG15cmlfZXRoICptcCwgaW50IG51bSkKK3sKKwltcC0+ZWVwcm9tLmlkWzBdID0gMDsKKwltcC0+ZWVwcm9tLmlkWzFdID0gaWRwcm9tLT5pZF9tYWNodHlwZTsKKwltcC0+ZWVwcm9tLmlkWzJdID0gKGlkcHJvbS0+aWRfc2VybnVtID4+IDE2KSAmIDB4ZmY7CisJbXAtPmVlcHJvbS5pZFszXSA9IChpZHByb20tPmlkX3Nlcm51bSA+PiA4KSAmIDB4ZmY7CisJbXAtPmVlcHJvbS5pZFs0XSA9IChpZHByb20tPmlkX3Nlcm51bSA+PiAwKSAmIDB4ZmY7CisJbXAtPmVlcHJvbS5pZFs1XSA9IG51bTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRldGVybWluZV9yZWdfc3BhY2Vfc2l6ZShzdHJ1Y3QgbXlyaV9ldGggKm1wKQoreworCXN3aXRjaChtcC0+ZWVwcm9tLmNwdXZlcnMpIHsKKwljYXNlIENQVVZFUlNfMl8zOgorCWNhc2UgQ1BVVkVSU18zXzA6CisJY2FzZSBDUFVWRVJTXzNfMToKKwljYXNlIENQVVZFUlNfM18yOgorCQltcC0+cmVnX3NpemUgPSAoMyAqIDEyOCAqIDEwMjQpICsgNDA5NjsKKwkJYnJlYWs7CisKKwljYXNlIENQVVZFUlNfNF8wOgorCWNhc2UgQ1BVVkVSU180XzE6CisJCW1wLT5yZWdfc2l6ZSA9ICgoNDA5Njw8MSkgKyBtcC0+ZWVwcm9tLnJhbXN6KTsKKwkJYnJlYWs7CisKKwljYXNlIENQVVZFUlNfNF8yOgorCWNhc2UgQ1BVVkVSU181XzA6CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJteXJpY29tOiBBSUVFRSB3ZWlyZCBjcHUgdmVyc2lvbiAlMDR4IGFzc3VtaW5nIHByZTQuMFxuIiwKKwkJICAgICAgIG1wLT5lZXByb20uY3B1dmVycyk7CisJCW1wLT5yZWdfc2l6ZSA9ICgzICogMTI4ICogMTAyNCkgKyA0MDk2OworCX07Cit9CisKKyNpZmRlZiBERUJVR19ERVRFQ1QKK3N0YXRpYyB2b2lkIGR1bXBfZWVwcm9tKHN0cnVjdCBteXJpX2V0aCAqbXApCit7CisJcHJpbnRrKCJFRVBST006IGNsb2NrdmFsWyUwOHhdIGNwdXZlcnNbJTA0eF0gIgorCSAgICAgICAiaWRbJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMnhdXG4iLAorCSAgICAgICBtcC0+ZWVwcm9tLmN2YWwsIG1wLT5lZXByb20uY3B1dmVycywKKwkgICAgICAgbXAtPmVlcHJvbS5pZFswXSwgbXAtPmVlcHJvbS5pZFsxXSwgbXAtPmVlcHJvbS5pZFsyXSwKKwkgICAgICAgbXAtPmVlcHJvbS5pZFszXSwgbXAtPmVlcHJvbS5pZFs0XSwgbXAtPmVlcHJvbS5pZFs1XSk7CisJcHJpbnRrKCJFRVBST006IHJhbXN6WyUwOHhdXG4iLCBtcC0+ZWVwcm9tLnJhbXN6KTsKKwlwcmludGsoIkVFUFJPTTogZnZlcnNbJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4XG4iLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzBdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzFdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzJdLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzNdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzRdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzVdLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzZdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzddKTsKKwlwcmludGsoIkVFUFJPTTogICAgICAgJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4XG4iLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzhdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzldLCBtcC0+ZWVwcm9tLmZ2ZXJzWzEwXSwKKwkgICAgICAgbXAtPmVlcHJvbS5mdmVyc1sxMV0sIG1wLT5lZXByb20uZnZlcnNbMTJdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzEzXSwKKwkgICAgICAgbXAtPmVlcHJvbS5mdmVyc1sxNF0sIG1wLT5lZXByb20uZnZlcnNbMTVdKTsKKwlwcmludGsoIkVFUFJPTTogICAgICAgJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4XG4iLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzE2XSwgbXAtPmVlcHJvbS5mdmVyc1sxN10sIG1wLT5lZXByb20uZnZlcnNbMThdLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzE5XSwgbXAtPmVlcHJvbS5mdmVyc1syMF0sIG1wLT5lZXByb20uZnZlcnNbMjFdLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzIyXSwgbXAtPmVlcHJvbS5mdmVyc1syM10pOworCXByaW50aygiRUVQUk9NOiAgICAgICAlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMnhdXG4iLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzI0XSwgbXAtPmVlcHJvbS5mdmVyc1syNV0sIG1wLT5lZXByb20uZnZlcnNbMjZdLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzI3XSwgbXAtPmVlcHJvbS5mdmVyc1syOF0sIG1wLT5lZXByb20uZnZlcnNbMjldLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzMwXSwgbXAtPmVlcHJvbS5mdmVyc1szMV0pOworCXByaW50aygiRUVQUk9NOiBtdmVyc1slMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMnhcbiIsCisJICAgICAgIG1wLT5lZXByb20ubXZlcnNbMF0sIG1wLT5lZXByb20ubXZlcnNbMV0sIG1wLT5lZXByb20ubXZlcnNbMl0sCisJICAgICAgIG1wLT5lZXByb20ubXZlcnNbM10sIG1wLT5lZXByb20ubXZlcnNbNF0sIG1wLT5lZXByb20ubXZlcnNbNV0sCisJICAgICAgIG1wLT5lZXByb20ubXZlcnNbNl0sIG1wLT5lZXByb20ubXZlcnNbN10pOworCXByaW50aygiRUVQUk9NOiAgICAgICAlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMnhdXG4iLAorCSAgICAgICBtcC0+ZWVwcm9tLm12ZXJzWzhdLCBtcC0+ZWVwcm9tLm12ZXJzWzldLCBtcC0+ZWVwcm9tLm12ZXJzWzEwXSwKKwkgICAgICAgbXAtPmVlcHJvbS5tdmVyc1sxMV0sIG1wLT5lZXByb20ubXZlcnNbMTJdLCBtcC0+ZWVwcm9tLm12ZXJzWzEzXSwKKwkgICAgICAgbXAtPmVlcHJvbS5tdmVyc1sxNF0sIG1wLT5lZXByb20ubXZlcnNbMTVdKTsKKwlwcmludGsoIkVFUFJPTTogZGx2YWxbJTA0eF0gYnJkX3R5cGVbJTA0eF0gYnVzX3R5cGVbJTA0eF0gcHJvZF9jb2RlWyUwNHhdXG4iLAorCSAgICAgICBtcC0+ZWVwcm9tLmRsdmFsLCBtcC0+ZWVwcm9tLmJyZF90eXBlLCBtcC0+ZWVwcm9tLmJ1c190eXBlLAorCSAgICAgICBtcC0+ZWVwcm9tLnByb2RfY29kZSk7CisJcHJpbnRrKCJFRVBST006IHNlcmlhbF9udW1bJTA4eF1cbiIsIG1wLT5lZXByb20uc2VyaWFsX251bSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgbXlyaV9ldGhlcl9pbml0KHN0cnVjdCBzYnVzX2RldiAqc2RldiwgaW50IG51bSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG15cmlfZXRoICptcDsKKwl1bnNpZ25lZCBjaGFyIHByb3BfYnVmWzMyXTsKKwlpbnQgaTsKKworCURFVCgoIm15cmlfZXRoZXJfaW5pdCglcCwlZCk6XG4iLCBzZGV2LCBudW0pKTsKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG15cmlfZXRoKSk7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAodmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJbXAgPSAoc3RydWN0IG15cmlfZXRoICopIGRldi0+cHJpdjsKKwlzcGluX2xvY2tfaW5pdCgmbXAtPmlycV9sb2NrKTsKKwltcC0+bXlyaV9zZGV2ID0gc2RldjsKKworCS8qIENsZWFuIG91dCBza2IgYXJyYXlzLiAqLworCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFICsgMSk7IGkrKykKKwkJbXAtPnJ4X3NrYnNbaV0gPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQltcC0+dHhfc2tic1tpXSA9IE5VTEw7CisKKwkvKiBGaXJzdCBjaGVjayBmb3IgRUVQUk9NIGluZm9ybWF0aW9uLiAqLworCWkgPSBwcm9tX2dldHByb3BlcnR5KHNkZXYtPnByb21fbm9kZSwgIm15cmluZXQtZWVwcm9tLWluZm8iLAorCQkJICAgICAoY2hhciAqKSZtcC0+ZWVwcm9tLCBzaXplb2Yoc3RydWN0IG15cmlfZWVwcm9tKSk7CisJREVUKCgicHJvbV9nZXRwcm9wKG15cmluZXQtZWVwcm9tLWluZm8pIHJldHVybnMgJWRcbiIsIGkpKTsKKwlpZiAoaSA9PSAwIHx8IGkgPT0gLTEpIHsKKwkJLyogTm8gZWVwcm9tIHByb3BlcnR5LCBtdXN0IGNvb2sgdXAgdGhlIHZhbHVlcyBvdXJzZWx2ZXMuICovCisJCURFVCgoIk5vIEVFUFJPTTogIikpOworCQltcC0+ZWVwcm9tLmJ1c190eXBlID0gQlVTX1RZUEVfU0JVUzsKKwkJbXAtPmVlcHJvbS5jcHV2ZXJzID0gcHJvbV9nZXRpbnRkZWZhdWx0KHNkZXYtPnByb21fbm9kZSwiY3B1X3ZlcnNpb24iLDApOworCQltcC0+ZWVwcm9tLmN2YWwgPSBwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+cHJvbV9ub2RlLCJjbG9ja192YWx1ZSIsMCk7CisJCW1wLT5lZXByb20ucmFtc3ogPSBwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+cHJvbV9ub2RlLCJzcmFtX3NpemUiLDApOworCQlERVQoKCJjcHV2ZXJzWyVkXSBjdmFsWyVkXSByYW1zelslZF1cbiIsIG1wLT5lZXByb20uY3B1dmVycywKKwkJICAgICBtcC0+ZWVwcm9tLmN2YWwsIG1wLT5lZXByb20ucmFtc3opKTsKKwkJaWYgKG1wLT5lZXByb20uY3B1dmVycyA9PSAwKSB7CisJCQlERVQoKCJFRVBST006IGNwdXZlcnMgd2FzIHplcm8sIHNldHRpbmcgdG8gJTA0eFxuIixDUFVWRVJTXzJfMykpOworCQkJbXAtPmVlcHJvbS5jcHV2ZXJzID0gQ1BVVkVSU18yXzM7CisJCX0KKwkJaWYgKG1wLT5lZXByb20uY3B1dmVycyA8IENQVVZFUlNfM18wKSB7CisJCQlERVQoKCJFRVBST006IGNwdXZlcnMgPCBDUFVWRVJTXzNfMCwgY2xvY2t2YWwgc2V0IHRvIHplcm8uXG4iKSk7CisJCQltcC0+ZWVwcm9tLmN2YWwgPSAwOworCQl9CisJCWlmIChtcC0+ZWVwcm9tLnJhbXN6ID09IDApIHsKKwkJCURFVCgoIkVFUFJPTTogcmFtc3ogPT0gMCwgc2V0dGluZyB0byAxMjhrXG4iKSk7CisJCQltcC0+ZWVwcm9tLnJhbXN6ID0gKDEyOCAqIDEwMjQpOworCQl9CisJCWkgPSBwcm9tX2dldHByb3BlcnR5KHNkZXYtPnByb21fbm9kZSwgIm15cmluZXQtYm9hcmQtaWQiLAorCQkJCSAgICAgJnByb3BfYnVmWzBdLCAxMCk7CisJCURFVCgoIkVFUFJPTTogcHJvbV9nZXRwcm9wKG15cmluZXQtYm9hcmQtaWQpIHJldHVybnMgJWRcbiIsIGkpKTsKKwkJaWYgKChpICE9IDApICYmIChpICE9IC0xKSkKKwkJCW1lbWNweSgmbXAtPmVlcHJvbS5pZFswXSwgJnByb3BfYnVmWzBdLCA2KTsKKwkJZWxzZQorCQkJc2V0X2JvYXJkaWRfZnJvbV9pZHByb20obXAsIG51bSk7CisJCWkgPSBwcm9tX2dldHByb3BlcnR5KHNkZXYtPnByb21fbm9kZSwgImZwZ2FfdmVyc2lvbiIsCisJCQkJICAgICAmbXAtPmVlcHJvbS5mdmVyc1swXSwgMzIpOworCQlERVQoKCJFRVBST006IHByb21fZ2V0cHJvcChmcGdhX3ZlcnNpb24pIHJldHVybnMgJWRcbiIsIGkpKTsKKwkJaWYgKGkgPT0gMCB8fCBpID09IC0xKQorCQkJbWVtc2V0KCZtcC0+ZWVwcm9tLmZ2ZXJzWzBdLCAwLCAzMik7CisKKwkJaWYgKG1wLT5lZXByb20uY3B1dmVycyA9PSBDUFVWRVJTXzRfMSkgeworCQkJREVUKCgiRUVQUk9NOiBjcHV2ZXJzIENQVVZFUlNfNF8xLCAiKSk7CisJCQlpZiAobXAtPmVlcHJvbS5yYW1zeiA9PSAoMTI4ICogMTAyNCkpIHsKKwkJCQlERVQoKCJyYW1zaXplIDEyOGssIHNldHRpbmcgdG8gMjU2aywgIikpOworCQkJCW1wLT5lZXByb20ucmFtc3ogPSAoMjU2ICogMTAyNCk7CisJCQl9CisJCQlpZiAoKG1wLT5lZXByb20uY3ZhbD09MHg0MDQxNDA0MSl8fChtcC0+ZWVwcm9tLmN2YWw9PTB4OTA0NDkwNDQpKXsKKwkJCQlERVQoKCJjaGFuZ2luZyBjdmFsIGZyb20gJTA4eCB0byAlMDh4ICIsCisJCQkJICAgICBtcC0+ZWVwcm9tLmN2YWwsIDB4NTBlNDUwZTQpKTsKKwkJCQltcC0+ZWVwcm9tLmN2YWwgPSAweDUwZTQ1MGU0OworCQkJfQorCQkJREVUKCgiXG4iKSk7CisJCX0KKwl9CisjaWZkZWYgREVCVUdfREVURUNUCisJZHVtcF9lZXByb20obXApOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gbXAtPmVlcHJvbS5pZFtpXTsKKworCWRldGVybWluZV9yZWdfc3BhY2Vfc2l6ZShtcCk7CisKKwkvKiBNYXAgaW4gdGhlIE15cmlDT00gcmVnaXN0ZXIvbG9jYWxyYW0gc2V0LiAqLworCWlmIChtcC0+ZWVwcm9tLmNwdXZlcnMgPCBDUFVWRVJTXzRfMCkgeworCQkvKiBYWFggTWFrZXMgbm8gc2Vuc2UsIGlmIGNvbnRyb2wgcmVnIGlzIG5vbi1leGlzdGFudCB0aGlzCisJCSAqIFhYWCBkcml2ZXIgY2Fubm90IGZ1bmN0aW9uIGF0IGFsbC4uLiBtYXliZSBwcmUtNC4wIGlzCisJCSAqIFhYWCBvbmx5IGEgdmFsaWQgdmVyc2lvbiBmb3IgUENJIGNhcmRzPyAgQXNrIGZlbGR5Li4uCisJCSAqLworCQlERVQoKCJNYXBwaW5nIHJlZ3MgZm9yIGNwdXZlcnMgPCBDUFVWRVJTXzRfMFxuIikpOworCQltcC0+cmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sIDAsCisJCQkJCW1wLT5yZWdfc2l6ZSwgIk15cmlDT00gUmVncyIpOworCQlpZiAoIW1wLT5yZWdzKSB7CisJCQlwcmludGsoIk15cmlDT006IENhbm5vdCBtYXAgTXlyaUNPTSByZWdpc3RlcnMuXG4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCW1wLT5sYW5haSA9IG1wLT5yZWdzICsgKDI1NiAqIDEwMjQpOworCQltcC0+bHJlZ3MgPSBtcC0+bGFuYWkgKyAoMHgxMDAwMCAqIDIpOworCX0gZWxzZSB7CisJCURFVCgoIk1hcHBpbmcgcmVncyBmb3IgY3B1dmVycyA+PSBDUFVWRVJTXzRfMFxuIikpOworCQltcC0+Y3JlZ3MgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzBdLCAwLAorCQkJCQkgUEFHRV9TSVpFLCAiTXlyaUNPTSBDb250cm9sIFJlZ3MiKTsKKwkJbXAtPmxyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVswXSwgKDI1NiAqIDEwMjQpLAorCQkJCQkgUEFHRV9TSVpFLCAiTXlyaUNPTSBMQU5BSSBSZWdzIik7CisJCW1wLT5sYW5haSA9CisJCQlzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzBdLCAoNTEyICogMTAyNCksCisJCQkJICAgICBtcC0+ZWVwcm9tLnJhbXN6LCAiTXlyaUNPTSBTUkFNIik7CisJfQorCURFVCgoIlJlZ2lzdGVycyBtYXBwZWQ6IGNyZWdzWyVwXSBscmVnc1slcF0gbGFuYWlbJXBdXG4iLAorCSAgICAgbXAtPmNyZWdzLCBtcC0+bHJlZ3MsIG1wLT5sYW5haSkpOworCisJaWYgKG1wLT5lZXByb20uY3B1dmVycyA+PSBDUFVWRVJTXzRfMCkKKwkJbXAtPnNobWVtX2Jhc2UgPSAweGYwMDA7CisJZWxzZQorCQltcC0+c2htZW1fYmFzZSA9IDB4ODAwMDsKKworCURFVCgoIlNoYXJlZCBtZW1vcnkgYmFzZSBpcyAlMDR4LCAiLCBtcC0+c2htZW1fYmFzZSkpOworCisJbXAtPnNobWVtID0gKHN0cnVjdCBteXJpX3NobWVtIF9faW9tZW0gKikKKwkJKG1wLT5sYW5haSArIChtcC0+c2htZW1fYmFzZSAqIDIpKTsKKwlERVQoKCJzaG1lbSBtYXBwZWQgYXQgJXBcbiIsIG1wLT5zaG1lbSkpOworCisJbXAtPnJxYWNrCT0gJm1wLT5zaG1lbS0+Y2hhbm5lbC5yZWN2cWE7CisJbXAtPnJxCQk9ICZtcC0+c2htZW0tPmNoYW5uZWwucmVjdnE7CisJbXAtPnNxCQk9ICZtcC0+c2htZW0tPmNoYW5uZWwuc2VuZHE7CisKKwkvKiBSZXNldCB0aGUgYm9hcmQuICovCisJREVUKCgiUmVzZXR0aW5nIExBTkFJXG4iKSk7CisJbXlyaV9yZXNldF9vZmYobXAtPmxyZWdzLCBtcC0+Y3JlZ3MpOworCW15cmlfcmVzZXRfb24obXAtPmNyZWdzKTsKKworCS8qIFR1cm4gSVJRJ3Mgb2ZmLiAqLworCW15cmlfZGlzYWJsZV9pcnEobXAtPmxyZWdzLCBtcC0+Y3JlZ3MpOworCisJLyogUmVzZXQgb25jZSBtb3JlLiAqLworCW15cmlfcmVzZXRfb24obXAtPmNyZWdzKTsKKworCS8qIEdldCB0aGUgc3VwcG9ydGVkIERWTUEgYnVyc3Qgc2l6ZXMgZnJvbSBvdXIgU0JVUy4gKi8KKwltcC0+bXlyaV9idXJzdHMgPSBwcm9tX2dldGludGRlZmF1bHQobXAtPm15cmlfc2Rldi0+YnVzLT5wcm9tX25vZGUsCisJCQkJCSAgICAgImJ1cnN0LXNpemVzIiwgMHgwMCk7CisKKwlpZiAoIXNidXNfY2FuX2J1cnN0NjQoc2RldikpCisJCW1wLT5teXJpX2J1cnN0cyAmPSB+KERNQV9CVVJTVDY0KTsKKworCURFVCgoIk1ZUkkgYnVyc3RzICUwMnhcbiIsIG1wLT5teXJpX2J1cnN0cykpOworCisJLyogRW5jb2RlIFNCVVMgaW50ZXJydXB0IGxldmVsIGluIHNlY29uZCBjb250cm9sIHJlZ2lzdGVyLiAqLworCWkgPSBwcm9tX2dldGludChzZGV2LT5wcm9tX25vZGUsICJpbnRlcnJ1cHRzIik7CisJaWYgKGkgPT0gMCkKKwkJaSA9IDQ7CisJREVUKCgicHJvbV9nZXRpbnQoaW50ZXJydXB0cyk9PSVkLCBpcnFsdmwgc2V0IHRvICUwNHhcbiIsCisJICAgICBpLCAoMSA8PCBpKSkpOworCisJc2J1c193cml0ZWwoKDEgPDwgaSksIG1wLT5jcmVncyArIE1ZUklDVFJMX0lSUUxWTCk7CisKKwltcC0+ZGV2ID0gZGV2OworCWRldi0+b3BlbiA9ICZteXJpX29wZW47CisJZGV2LT5zdG9wID0gJm15cmlfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmbXlyaV9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dCA9ICZteXJpX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CisJZGV2LT5nZXRfc3RhdHMgPSAmbXlyaV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmbXlyaV9zZXRfbXVsdGljYXN0OworCWRldi0+aXJxID0gc2Rldi0+aXJxc1swXTsKKworCS8qIFJlZ2lzdGVyIGludGVycnVwdCBoYW5kbGVyIG5vdy4gKi8KKwlERVQoKCJSZXF1ZXN0aW5nIE1ZUkljb20gSVJRIGxpbmUuXG4iKSk7CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmbXlyaV9pbnRlcnJ1cHQsCisJCQlTQV9TSElSUSwgIk15cmlDT00gRXRoZXJuZXQiLCAodm9pZCAqKSBkZXYpKSB7CisJCXByaW50aygiTXlyaUNPTTogQ2Fubm90IHJlZ2lzdGVyIGludGVycnVwdCBoYW5kbGVyLlxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWRldi0+bXR1CQk9IE1ZUklORVRfTVRVOworCWRldi0+Y2hhbmdlX210dQkJPSBteXJpX2NoYW5nZV9tdHU7CisJZGV2LT5oYXJkX2hlYWRlcgk9IG15cmlfaGVhZGVyOworCWRldi0+cmVidWlsZF9oZWFkZXIJPSBteXJpX3JlYnVpbGRfaGVhZGVyOworCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gKEVUSF9ITEVOICsgTVlSSV9QQURfTEVOKTsKKwlkZXYtPmhhcmRfaGVhZGVyX2NhY2hlIAk9IG15cmlfaGVhZGVyX2NhY2hlOworCWRldi0+aGVhZGVyX2NhY2hlX3VwZGF0ZT0gbXlyaV9oZWFkZXJfY2FjaGVfdXBkYXRlOworCisJLyogTG9hZCBjb2RlIG9udG8gdGhlIExBTmFpLiAqLworCURFVCgoIkxvYWRpbmcgTEFOQUkgZmlybXdhcmVcbiIpKTsKKwlteXJpX2xvYWRfbGFuYWkobXApOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCXByaW50aygiTXlyaUNPTTogQ2Fubm90IHJlZ2lzdGVyIGRldmljZS5cbiIpOworCQlnb3RvIGVycl9mcmVlX2lycTsKKwl9CisKKyNpZmRlZiBNT0RVTEUKKwltcC0+bmV4dF9tb2R1bGUgPSByb290X215cmlfZGV2OworCXJvb3RfbXlyaV9kZXYgPSBtcDsKKyNlbmRpZgorCisJcHJpbnRrKCIlczogTXlyaUNPTSBNeXJpTkVUIEV0aGVybmV0ICIsIGRldi0+bmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLCBkZXYtPmRldl9hZGRyW2ldLAorCQkgICAgICAgaSA9PSA1ID8gJyAnIDogJzonKTsKKwlwcmludGsoIlxuIik7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworZXJyOgorCS8qIFRoaXMgd2lsbCBhbHNvIGZyZWUgdGhlIGNvLWFsbG9jYXRlZCAnZGV2LT5wcml2JyAqLworCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG15cmlfc2J1c19tYXRjaChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCit7CisJY2hhciAqbmFtZSA9IHNkZXYtPnByb21fbmFtZTsKKworCWlmICghc3RyY21wKG5hbWUsICJNWVJJQ09NLG1sYW5haSIpIHx8CisJICAgICFzdHJjbXAobmFtZSwgIm15cmkiKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbXlyaV9zYnVzX3Byb2JlKHZvaWQpCit7CisJc3RydWN0IHNidXNfYnVzICpidXM7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gTlVMTDsKKwlzdGF0aWMgaW50IGNhbGxlZDsKKwlpbnQgY2FyZHMgPSAwLCB2OworCisjaWZkZWYgTU9EVUxFCisJcm9vdF9teXJpX2RldiA9IE5VTEw7CisjZW5kaWYKKworCWlmIChjYWxsZWQpCisJCXJldHVybiAtRU5PREVWOworCWNhbGxlZCsrOworCisJZm9yX2VhY2hfc2J1cyhidXMpIHsKKwkJZm9yX2VhY2hfc2J1c2RldihzZGV2LCBidXMpIHsKKwkJCWlmIChteXJpX3NidXNfbWF0Y2goc2RldikpIHsKKwkJCQljYXJkcysrOworCQkJCURFVCgoIkZvdW5kIG15cmljb20gbXlyaW5ldCBhcyAlc1xuIiwgc2Rldi0+cHJvbV9uYW1lKSk7CisJCQkJaWYgKCh2ID0gbXlyaV9ldGhlcl9pbml0KHNkZXYsIChjYXJkcyAtIDEpKSkpCisJCQkJCXJldHVybiB2OworCQkJfQorCQl9CisJfQorCWlmICghY2FyZHMpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbXlyaV9zYnVzX2NsZWFudXAodm9pZCkKK3sKKyNpZmRlZiBNT0RVTEUKKwl3aGlsZSAocm9vdF9teXJpX2RldikgeworCQlzdHJ1Y3QgbXlyaV9ldGggKm5leHQgPSByb290X215cmlfZGV2LT5uZXh0X21vZHVsZTsKKworCQl1bnJlZ2lzdGVyX25ldGRldihyb290X215cmlfZGV2LT5kZXYpOworCQkvKiB0aGlzIHdpbGwgYWxzbyBmcmVlIHRoZSBjby1hbGxvY2F0ZWQgJ3Jvb3RfbXlyaV9kZXYnICovCisJCWZyZWVfbmV0ZGV2KHJvb3RfbXlyaV9kZXYtPmRldik7CisJCXJvb3RfbXlyaV9kZXYgPSBuZXh0OworCX0KKyNlbmRpZiAvKiBNT0RVTEUgKi8KK30KKworbW9kdWxlX2luaXQobXlyaV9zYnVzX3Byb2JlKTsKK21vZHVsZV9leGl0KG15cmlfc2J1c19jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmlfc2J1cy5oIGIvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5MWU1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L215cmlfc2J1cy5oCkBAIC0wLDAgKzEsMzEzIEBACisvKiBteXJpX3NidXMuaDogRGVmaW5lcyBmb3IgTXlyaUNPTSBNeXJpTkVUIFNCVVMgY2FyZCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqLworCisjaWZuZGVmIF9NWVJJX1NCVVNfSAorI2RlZmluZSBfTVlSSV9TQlVTX0gKKworLyogTEFOQUkgUmVnaXN0ZXJzICovCisjZGVmaW5lIExBTkFJX0lQRjAJMHgwMFVMCQkvKiBDb250ZXh0IHplcm8gc3RhdGUgcmVnaXN0ZXJzLiovCisjZGVmaW5lIExBTkFJX0NVUjAJMHgwNFVMCisjZGVmaW5lIExBTkFJX1BSRVYwCTB4MDhVTAorI2RlZmluZSBMQU5BSV9EQVRBMAkweDBjVUwKKyNkZWZpbmUgTEFOQUlfRFBGMAkweDEwVUwKKyNkZWZpbmUgTEFOQUlfSVBGMQkweDE0VUwJCS8qIENvbnRleHQgb25lIHN0YXRlIHJlZ2lzdGVycy4JKi8KKyNkZWZpbmUgTEFOQUlfQ1VSMQkweDE4VUwKKyNkZWZpbmUgTEFOQUlfUFJFVjEJMHgxY1VMCisjZGVmaW5lIExBTkFJX0RBVEExCTB4MjBVTAorI2RlZmluZSBMQU5BSV9EUEYxCTB4MjRVTAorI2RlZmluZSBMQU5BSV9JU1RBVAkweDI4VUwJCS8qIEludGVycnVwdCBzdGF0dXMuCQkqLworI2RlZmluZSBMQU5BSV9FSU1BU0sJMHgyY1VMCQkvKiBFeHRlcm5hbCBJUlEgbWFzay4JCSovCisjZGVmaW5lIExBTkFJX0lUSU1FUgkweDMwVUwJCS8qIElSUSB0aW1lci4JCQkqLworI2RlZmluZSBMQU5BSV9SVEMJMHgzNFVMCQkvKiBSZWFsIFRpbWUgQ2xvY2sJCSovCisjZGVmaW5lIExBTkFJX0NTVU0JMHgzOFVMCQkvKiBDaGVja3N1bS4JCQkqLworI2RlZmluZSBMQU5BSV9ETUFYQUREUgkweDNjVUwJCS8qIFNCVVMgRE1BIGV4dGVybmFsIGFkZHJlc3MuCSovCisjZGVmaW5lIExBTkFJX0RNQUxBRERSCTB4NDBVTAkJLyogU0JVUyBETUEgbG9jYWwgYWRkcmVzcy4JKi8KKyNkZWZpbmUgTEFOQUlfRE1BQ1RSCTB4NDRVTAkJLyogU0JVUyBETUEgY291bnRlci4JCSovCisjZGVmaW5lIExBTkFJX1JYRE1BUFRSCTB4NDhVTAkJLyogUmVjZWl2ZSBETUEgcG9pbnRlci4JCSovCisjZGVmaW5lIExBTkFJX1JYRE1BTElNCTB4NGNVTAkJLyogUmVjZWl2ZSBETUEgbGltaXQuCQkqLworI2RlZmluZSBMQU5BSV9UWERNQVBUUgkweDUwVUwJCS8qIFRyYW5zbWl0IERNQSBwb2ludGVyLgkqLworI2RlZmluZSBMQU5BSV9UWERNQUxJTQkweDU0VUwJCS8qIFRyYW5zbWl0IERNQSBsaW1pdC4JCSovCisjZGVmaW5lIExBTkFJX1RYRE1BTElNVAkweDU4VUwJCS8qIFRyYW5zbWl0IERNQSBsaW1pdCB3L3RhaWwuCSovCisJLyogMHg1Y1VMLCByZXNlcnZlZCAqLworI2RlZmluZSBMQU5BSV9SQllURQkweDYwVUwJCS8qIFJlY2VpdmUgYnl0ZS4JCSovCisJLyogMHg2NC0tPjB4NmMsIHJlc2VydmVkICovCisjZGVmaW5lIExBTkFJX1JIQUxGCTB4NzBVTAkJLyogUmVjZWl2ZSBoYWxmLXdvcmQuCQkqLworCS8qIDB4NzJVTCwgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTEFOQUlfUldPUkQJMHg3NFVMCQkvKiBSZWNlaXZlIHdvcmQuCQkqLworI2RlZmluZSBMQU5BSV9TQUxJR04JMHg3OFVMCQkvKiBTZW5kIGFsaWduLgkJCSovCisjZGVmaW5lIExBTkFJX1NCWVRFCTB4N2NVTAkJLyogU2luZ2xlU2VuZCBzZW5kLWJ5dGUuCSovCisjZGVmaW5lIExBTkFJX1NIQUxGCTB4ODBVTAkJLyogU2luZ2xlU2VuZCBzZW5kLWhhbGZ3b3JkLgkqLworI2RlZmluZSBMQU5BSV9TV09SRAkweDg0VUwJCS8qIFNpbmdsZVNlbmQgc2VuZC13b3JkLgkqLworI2RlZmluZSBMQU5BSV9TU0VORFQJMHg4OFVMCQkvKiBTaW5nbGVTZW5kIHNwZWNpYWwuCQkqLworI2RlZmluZSBMQU5BSV9ETUFESVIJMHg4Y1VMCQkvKiBETUEgZGlyZWN0aW9uLgkJKi8KKyNkZWZpbmUgTEFOQUlfRE1BU1RBVAkweDkwVUwJCS8qIERNQSBzdGF0dXMuCQkJKi8KKyNkZWZpbmUgTEFOQUlfVElNRU8JMHg5NFVMCQkvKiBUaW1lb3V0IHJlZ2lzdGVyLgkJKi8KKyNkZWZpbmUgTEFOQUlfTVlSSU5FVAkweDk4VUwJCS8qIFhYWCBNQUdJQyBteXJpY29tIHRoaW5nCSovCisjZGVmaW5lIExBTkFJX0hXREVCVUcJMHg5Y1VMCQkvKiBIYXJkd2FyZSBkZWJ1Z2dpbmcgcmVnLgkqLworI2RlZmluZSBMQU5BSV9MRURTCTB4YTBVTAkJLyogTEVEIGNvbnRyb2wuCQkJKi8KKyNkZWZpbmUgTEFOQUlfVkVSUwkweGE0VUwJCS8qIFZlcnNpb24gcmVnaXN0ZXIuCQkqLworI2RlZmluZSBMQU5BSV9MSU5LT04JMHhhOFVMCQkvKiBMaW5rIGFjdGl2YXRpb24gcmVnLgkJKi8KKwkvKiAweGFjLS0+MHgxMDQsIHJlc2VydmVkICovCisjZGVmaW5lIExBTkFJX0NWQUwJMHgxMDhVTAkJLyogQ2xvY2sgdmFsdWUgcmVnaXN0ZXIuCSovCisjZGVmaW5lIExBTkFJX1JFR19TSVpFCTB4MTBjVUwKKworLyogSW50ZXJydXB0IHN0YXR1cyBiaXRzLiAqLworI2RlZmluZSBJU1RBVF9ERUJVRwkweDgwMDAwMDAwCisjZGVmaW5lIElTVEFUX0hPU1QJMHg0MDAwMDAwMAorI2RlZmluZSBJU1RBVF9MQU43CTB4MDA4MDAwMDAKKyNkZWZpbmUgSVNUQVRfTEFONgkweDAwNDAwMDAwCisjZGVmaW5lIElTVEFUX0xBTjUJMHgwMDIwMDAwMAorI2RlZmluZSBJU1RBVF9MQU40CTB4MDAxMDAwMDAKKyNkZWZpbmUgSVNUQVRfTEFOMwkweDAwMDgwMDAwCisjZGVmaW5lIElTVEFUX0xBTjIJMHgwMDA0MDAwMAorI2RlZmluZSBJU1RBVF9MQU4xCTB4MDAwMjAwMDAKKyNkZWZpbmUgSVNUQVRfTEFOMAkweDAwMDEwMDAwCisjZGVmaW5lIElTVEFUX1dSRFkJMHgwMDAwODAwMAorI2RlZmluZSBJU1RBVF9IUkRZCTB4MDAwMDQwMDAKKyNkZWZpbmUgSVNUQVRfU1JEWQkweDAwMDAyMDAwCisjZGVmaW5lIElTVEFUX0xJTksJMHgwMDAwMTAwMAorI2RlZmluZSBJU1RBVF9GUkVTCTB4MDAwMDA4MDAKKyNkZWZpbmUgSVNUQVRfTlJFUwkweDAwMDAwODAwCisjZGVmaW5lIElTVEFUX1dBS0UJMHgwMDAwMDQwMAorI2RlZmluZSBJU1RBVF9PQjIJMHgwMDAwMDIwMAorI2RlZmluZSBJU1RBVF9PQjEJMHgwMDAwMDEwMAorI2RlZmluZSBJU1RBVF9UQUlMCTB4MDAwMDAwODAKKyNkZWZpbmUgSVNUQVRfV0RPRwkweDAwMDAwMDQwCisjZGVmaW5lIElTVEFUX1RJTUUJMHgwMDAwMDAyMAorI2RlZmluZSBJU1RBVF9ETUEJMHgwMDAwMDAxMAorI2RlZmluZSBJU1RBVF9TRU5ECTB4MDAwMDAwMDgKKyNkZWZpbmUgSVNUQVRfQlVGCTB4MDAwMDAwMDQKKyNkZWZpbmUgSVNUQVRfUkVDVgkweDAwMDAwMDAyCisjZGVmaW5lIElTVEFUX0JSRFkJMHgwMDAwMDAwMQorCisvKiBNWVJJIFJlZ2lzdGVycyAqLworI2RlZmluZSBNWVJJX1JFU0VUT0ZGCTB4MDBVTAorI2RlZmluZSBNWVJJX1JFU0VUT04JMHgwNFVMCisjZGVmaW5lIE1ZUklfSVJRT0ZGCTB4MDhVTAorI2RlZmluZSBNWVJJX0lSUU9OCTB4MGNVTAorI2RlZmluZSBNWVJJX1dBS0VVUE9GRgkweDEwVUwKKyNkZWZpbmUgTVlSSV9XQUtFVVBPTgkweDE0VUwKKyNkZWZpbmUgTVlSSV9JUlFSRUFECTB4MThVTAorCS8qIDB4MWMtLT4weDNmZmMsIHJlc2VydmVkICovCisjZGVmaW5lIE1ZUklfTE9DQUxNRU0JMHg0MDAwVUwKKyNkZWZpbmUgTVlSSV9SRUdfU0laRQkweDI1MDAwVUwKKworLyogU2hhcmVkIG1lbW9yeSBpbnRlcnJ1cHQgbWFzay4gKi8KKyNkZWZpbmUgU0hNRU1fSU1BU0tfUlgJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU0hNRU1fSU1BU0tfVFgJCTB4MDAwMDAwMDEKKworLyogSnVzdCB0byBtYWtlIHRoaW5ncyByZWFkYWJsZS4gKi8KKyNkZWZpbmUgS0VSTkVMX0NIQU5ORUwJCTAKKworLyogVGhlIHNpemUgb2YgdGhpcyBtdXN0IGJlID49IDEyOSBieXRlcy4gKi8KK3N0cnVjdCBteXJpX2VlcHJvbSB7CisJdW5zaWduZWQgaW50CQljdmFsOworCXVuc2lnbmVkIHNob3J0CQljcHV2ZXJzOworCXVuc2lnbmVkIGNoYXIJCWlkWzZdOworCXVuc2lnbmVkIGludAkJcmFtc3o7CisJdW5zaWduZWQgY2hhcgkJZnZlcnNbMzJdOworCXVuc2lnbmVkIGNoYXIJCW12ZXJzWzE2XTsKKwl1bnNpZ25lZCBzaG9ydAkJZGx2YWw7CisJdW5zaWduZWQgc2hvcnQJCWJyZF90eXBlOworCXVuc2lnbmVkIHNob3J0CQlidXNfdHlwZTsKKwl1bnNpZ25lZCBzaG9ydAkJcHJvZF9jb2RlOworCXVuc2lnbmVkIGludAkJc2VyaWFsX251bTsKKwl1bnNpZ25lZCBzaG9ydAkJX3Jlc2VydmVkWzI0XTsKKwl1bnNpZ25lZCBpbnQJCV91bnVzZWRbMl07Cit9OworCisvKiBFRVBST00gYnVzIHR5cGVzLCBvbmx5IFNCVVMgaXMgdmFsaWQgaW4gdGhpcyBkcml2ZXIuICovCisjZGVmaW5lIEJVU19UWVBFX1NCVVMJCTEKKworLyogRUVQUk9NIENQVSByZXZpc2lvbnMuICovCisjZGVmaW5lIENQVVZFUlNfMl8zCQkweDAyMDMKKyNkZWZpbmUgQ1BVVkVSU18zXzAJCTB4MDMwMAorI2RlZmluZSBDUFVWRVJTXzNfMQkJMHgwMzAxCisjZGVmaW5lIENQVVZFUlNfM18yCQkweDAzMDIKKyNkZWZpbmUgQ1BVVkVSU180XzAJCTB4MDQwMAorI2RlZmluZSBDUFVWRVJTXzRfMQkJMHgwNDAxCisjZGVmaW5lIENQVVZFUlNfNF8yCQkweDA0MDIKKyNkZWZpbmUgQ1BVVkVSU181XzAJCTB4MDUwMAorCisvKiBNWVJJIENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1ZUklDVFJMX0NUUkwJCTB4MDBVTAorI2RlZmluZSBNWVJJQ1RSTF9JUlFMVkwJCTB4MDJVTAorI2RlZmluZSBNWVJJQ1RSTF9SRUdfU0laRQkweDA0VUwKKworLyogR2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXIgZGVmaW5lcy4gKi8KKyNkZWZpbmUgQ09OVFJPTF9ST0ZGCQkweDgwMDAJLyogUmVzZXQgT0ZGLgkJKi8KKyNkZWZpbmUgQ09OVFJPTF9ST04JCTB4NDAwMAkvKiBSZXNldCBPTi4JCSovCisjZGVmaW5lIENPTlRST0xfRUlSUQkJMHgyMDAwCS8qIEVuYWJsZSBJUlEncy4JKi8KKyNkZWZpbmUgQ09OVFJPTF9ESVJRCQkweDEwMDAJLyogRGlzYWJsZSBJUlEncy4JKi8KKyNkZWZpbmUgQ09OVFJPTF9XT04JCTB4MDgwMAkvKiBXYWtlLXVwIE9OLgkJKi8KKworI2RlZmluZSBNWVJJX1NDQVRURVJfRU5UUklFUwk4CisjZGVmaW5lIE1ZUklfR0FUSEVSX0VOVFJJRVMJMTYKKworc3RydWN0IG15cmlfc2dsaXN0IHsKKwl1MzIgYWRkcjsKKwl1MzIgbGVuOworfTsKKworc3RydWN0IG15cmlfcnhkIHsKKwlzdHJ1Y3QgbXlyaV9zZ2xpc3QgbXlyaV9zY2F0dGVyc1tNWVJJX1NDQVRURVJfRU5UUklFU107CS8qIERNQSBzY2F0dGVyIGxpc3QuKi8KKwl1MzIgY3N1bTsJLyogSFcgY29tcHV0ZWQgY2hlY2tzdW0uICAgICovCisJdTMyIGN0eDsKKwl1MzIgbnVtX3NnOwkvKiBUb3RhbCBzY2F0dGVyIGVudHJpZXMuICAgKi8KK307CisKK3N0cnVjdCBteXJpX3R4ZCB7CisJc3RydWN0IG15cmlfc2dsaXN0IG15cmlfZ2F0aGVyc1tNWVJJX0dBVEhFUl9FTlRSSUVTXTsgLyogRE1BIHNjYXR0ZXIgbGlzdC4gICovCisJdTMyIG51bV9zZzsJLyogVG90YWwgc2NhdHRlciBlbnRyaWVzLiAgICovCisJdTE2IGFkZHJbNF07CS8qIFhYWCBhZGRyZXNzICAgICAgICAgICAgICAqLworCXUzMiBjaGFuOworCXUzMiBsZW47CS8qIFRvdGFsIGxlbmd0aCBvZiBwYWNrZXQuICAqLworCXUzMiBjc3VtX29mZjsJLyogV2hlcmUgZGF0YSB0byBjc3VtIGlzLiAgICovCisJdTMyIGNzdW1fZmllbGQ7CS8qIFdoZXJlIGNzdW0gZ29lcyBpbiBwa3QuICAqLworfTsKKworI2RlZmluZSBNWVJJTkVUX01UVSAgICAgICAgODQzMgorI2RlZmluZSBSWF9BTExPQ19TSVpFICAgICAgODQ0OAorI2RlZmluZSBNWVJJX1BBRF9MRU4gICAgICAgMgorI2RlZmluZSBSWF9DT1BZX1RIUkVTSE9MRCAgMjU2CisKKy8qIFRoZXNlIG51bWJlcnMgYXJlIGNhc3QgaW4gc3RvbmUsIG5ldyBmaXJtd2FyZSBpcyBuZWVkZWQgaWYKKyAqIHlvdSB3YW50IHRvIGNoYW5nZSB0aGVtLgorICovCisjZGVmaW5lIFRYX1JJTkdfTUFYU0laRSAgICAxNgorI2RlZmluZSBSWF9SSU5HX01BWFNJWkUgICAgMTYKKworI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAgMTYKKyNkZWZpbmUgUlhfUklOR19TSVpFICAgICAgIDE2CisKKy8qIEdSUlIuLi4gKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBORVhUX1JYKGludCBudW0pCit7CisJLyogWFhYID49Pz8/ICovCisJaWYoKytudW0gPiBSWF9SSU5HX1NJWkUpCisJCW51bSA9IDA7CisJcmV0dXJuIG51bTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IFBSRVZfUlgoaW50IG51bSkKK3sKKwlpZigtLW51bSA8IDApCisJCW51bSA9IFJYX1JJTkdfU0laRTsKKwlyZXR1cm4gbnVtOworfQorCisjZGVmaW5lIE5FWFRfVFgobnVtKQkoKChudW0pICsgMSkgJiAoVFhfUklOR19TSVpFIC0gMSkpCisjZGVmaW5lIFBSRVZfVFgobnVtKQkoKChudW0pIC0gMSkgJiAoVFhfUklOR19TSVpFIC0gMSkpCisKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwoaGVhZCwgdGFpbCkJCVwKKwkoKGhlYWQpIDw9ICh0YWlsKSA/CQkJXAorCSAoaGVhZCkgKyAoVFhfUklOR19TSVpFIC0gMSkgLSAodGFpbCkgOglcCisJIChoZWFkKSAtICh0YWlsKSAtIDEpCisKK3N0cnVjdCBzZW5kcSB7CisJdTMyCXRhaWw7CisJdTMyCWhlYWQ7CisJdTMyCWhkZWJ1ZzsKKwl1MzIJbWRlYnVnOworCXN0cnVjdCBteXJpX3R4ZAlteXJpX3R4ZFtUWF9SSU5HX01BWFNJWkVdOworfTsKKworc3RydWN0IHJlY3ZxIHsKKwl1MzIJaGVhZDsKKwl1MzIJdGFpbDsKKwl1MzIJaGRlYnVnOworCXUzMgltZGVidWc7CisJc3RydWN0IG15cmlfcnhkCW15cmlfcnhkW1JYX1JJTkdfTUFYU0laRSArIDFdOworfTsKKworI2RlZmluZSBNWVJJX01MSVNUX1NJWkUgOAorCitzdHJ1Y3QgbWNsaXN0IHsKKwl1MzIgbWF4bGVuOworCXUzMiBsZW47CisJdTMyIGNhY2hlOworCXN0cnVjdCBwYWlyIHsKKwkJdTggYWRkcls4XTsKKwkJdTMyIHZhbDsKKwl9IG1jX3BhaXJzW01ZUklfTUxJU1RfU0laRV07CisJdTggYmNhc3RfYWRkcls4XTsKK307CisKK3N0cnVjdCBteXJpX2NoYW5uZWwgeworCXUzMgkJc3RhdGU7CQkvKiBTdGF0ZSBvZiB0aGUgY2hhbm5lbC4JKi8KKwl1MzIJCWJ1c3k7CQkvKiBDaGFubmVsIGlzIGJ1c3kuCQkqLworCXN0cnVjdCBzZW5kcQlzZW5kcTsJCS8qIERldmljZSB0eCBxdWV1ZS4JCSovCisJc3RydWN0IHJlY3ZxCXJlY3ZxOwkJLyogRGV2aWNlIHJ4IHF1ZXVlLgkJKi8KKwlzdHJ1Y3QgcmVjdnEJcmVjdnFhOwkJLyogRGV2aWNlIHJ4IHF1ZXVlIGFja2VkLgkqLworCXUzMgkJcmJ5dGVzOwkJLyogUmVjZWl2ZSBieXRlcy4JCSovCisJdTMyCQlzYnl0ZXM7CQkvKiBTZW5kIGJ5dGVzLgkJCSovCisJdTMyCQlybXNnczsJCS8qIFJlY2VpdmUgbWVzc2FnZXMuCQkqLworCXUzMgkJc21zZ3M7CQkvKiBTZW5kIG1lc3NhZ2VzLgkJKi8KKwlzdHJ1Y3QgbWNsaXN0CW1jbGlzdDsJCS8qIERldmljZSBtdWx0aWNhc3QgbGlzdC4JKi8KK307CisKKy8qIFZhbHVlcyBmb3IgcGVyLWNoYW5uZWwgc3RhdGUuICovCisjZGVmaW5lIFNUQVRFX1dGSAkwCQkvKiBXYWl0aW5nIGZvciBIT1NULgkJKi8KKyNkZWZpbmUgU1RBVEVfV0ZOCTEJCS8qIFdhaXRpbmcgZm9yIE5FVC4JCSovCisjZGVmaW5lIFNUQVRFX1JFQURZCTIJCS8qIFJlYWR5LgkJCSovCisKK3N0cnVjdCBteXJpX3NobWVtIHsKKwl1OAlhZGRyWzhdOwkJLyogQm9hcmQncyBhZGRyZXNzLgkJKi8KKwl1MzIJbmNoYW47CQkJLyogTnVtYmVyIG9mIGNoYW5uZWxzLgkJKi8KKwl1MzIJYnVyc3Q7CQkJLyogU0JVUyBkbWEgYnVyc3QgZW5hYmxlLgkqLworCXUzMglzaGFrZWRvd247CQkvKiBEYXJra2trU3RhcnJyIENyYXNoZXNzcy4uLgkqLworCXUzMglzZW5kOwkJCS8qIFNlbmQgd2FudGVkLgkJCSovCisJdTMyCWltYXNrOwkJCS8qIEludGVycnVwdCBlbmFibGUgbWFzay4JKi8KKwl1MzIJbWxldmVsOwkJCS8qIE1hcCBsZXZlbC4JCQkqLworCXUzMglkZWJ1Z1s0XTsJCS8qIE1pc2MuIGRlYnVnIGFyZWFzLgkJKi8KKwlzdHJ1Y3QgbXlyaV9jaGFubmVsIGNoYW5uZWw7CS8qIE9ubHkgb25lIGNoYW5uZWwgb24gYSBob3N0LgkqLworfTsKKworc3RydWN0IG15cmlfZXRoIHsKKwkvKiBUaGVzZSBhcmUgZnJlcXVlbnRseSBhY2Nlc3NlZCwga2VlcCB0b2dldGhlcgorCSAqIHRvIG9idGFpbiBnb29kIGNhY2hlIGhpdCByYXRlcy4KKwkgKi8KKwlzcGlubG9ja190CQkJaXJxX2xvY2s7CisJc3RydWN0IG15cmlfc2htZW0gX19pb21lbQkqc2htZW07CQkvKiBTaGFyZWQgZGF0YSBzdHJ1Y3R1cmVzLiAgICAqLworCXZvaWQgX19pb21lbQkJCSpjcmVnczsJCS8qIENvbnRyb2wgcmVnaXN0ZXIgc3BhY2UuICAgICovCisJc3RydWN0IHJlY3ZxIF9faW9tZW0JCSpycWFjazsJCS8qIFdoZXJlIHdlIGFjayByeCdzLiAgICAgICAgICovCisJc3RydWN0IHJlY3ZxIF9faW9tZW0JCSpycTsJCS8qIFdoZXJlIHdlIHB1dCBidWZmZXJzLiAgICAgICovCisJc3RydWN0IHNlbmRxIF9faW9tZW0JCSpzcTsJCS8qIFdoZXJlIHdlIHN0dWZmIHR4J3MuICAgICAgICovCisJc3RydWN0IG5ldF9kZXZpY2UJCSpkZXY7CQkvKiBMaW51eC9ORVQgZGV2IHN0cnVjdC4gICAgICAqLworCWludAkJCQl0eF9vbGQ7CQkvKiBUbyBzcGVlZCB1cCB0eCBjbGVhbmluZy4gICAqLworCXZvaWQgX19pb21lbQkJCSpscmVnczsJCS8qIFF1aWNrIHB0ciB0byBMQU5BSSByZWdzLiAgICovCisJc3RydWN0IHNrX2J1ZmYJICAgICAgICpyeF9za2JzW1JYX1JJTkdfU0laRSsxXTsvKiBSWCBza2IncyAgICAgICAgICAgICAgICAgICAqLworCXN0cnVjdCBza19idWZmCSAgICAgICAqdHhfc2tic1tUWF9SSU5HX1NJWkVdOyAgLyogVFggc2tiJ3MgICAgICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwkJZW5ldF9zdGF0czsJLyogSW50ZXJmYWNlIHN0YXRzLiAgICAgICAgICAgKi8KKworCS8qIFRoZXNlIGFyZSBsZXNzIGZyZXF1ZW50bHkgYWNjZXNzZWQuICovCisJdm9pZCBfX2lvbWVtCQkJKnJlZ3M7ICAgICAgICAgIC8qIE15cmlDT00gcmVnaXN0ZXIgc3BhY2UuICAgICovCisJdm9pZCBfX2lvbWVtCQkJKmxhbmFpOwkJLyogVmlldyAyIG9mIHJlZ2lzdGVyIHNwYWNlLiAgKi8KKwl1bnNpZ25lZCBpbnQJCQlteXJpX2J1cnN0czsJLyogU0JVUyBidXJzdHMuICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3QgbXlyaV9lZXByb20JCWVlcHJvbTsJCS8qIExvY2FsIGNvcHkgb2YgRUVQUk9NLiAgICAgICovCisJdW5zaWduZWQgaW50CQkJcmVnX3NpemU7CS8qIFNpemUgb2YgcmVnaXN0ZXIgc3BhY2UuICAgICovCisJdW5zaWduZWQgaW50CQkJc2htZW1fYmFzZTsJLyogT2Zmc2V0IHRvIHNoYXJlZCByYW0uICAgICAgKi8KKwlzdHJ1Y3Qgc2J1c19kZXYJCQkqbXlyaV9zZGV2OwkvKiBPdXIgU0JVUyBkZXZpY2Ugc3RydWN0LiAgICAqLworCXN0cnVjdCBteXJpX2V0aAkJCSpuZXh0X21vZHVsZTsJLyogTmV4dCBpbiBhZGFwdGVyIGNoYWluLiAgICAgKi8KK307CisKKy8qIFdlIHVzZSB0aGlzIHRvIGFjcXVpcmUgcmVjZWl2ZSBza2IncyB0aGF0IHdlIGNhbiBETUEgZGlyZWN0bHkgaW50by4gKi8KKyNkZWZpbmUgQUxJR05FRF9SWF9TS0JfQUREUihhZGRyKSBcCisgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShhZGRyKSArICg2NCAtIDEpKSAmIH4oNjQgLSAxKSkgLSAodW5zaWduZWQgbG9uZykoYWRkcikpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpteXJpX2FsbG9jX3NrYih1bnNpZ25lZCBpbnQgbGVuZ3RoLCBpbnQgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBhbGxvY19za2IobGVuZ3RoICsgNjQsIGdmcF9mbGFncyk7CisJaWYoc2tiKSB7CisJCWludCBvZmZzZXQgPSBBTElHTkVEX1JYX1NLQl9BRERSKHNrYi0+ZGF0YSk7CisKKwkJaWYob2Zmc2V0KQorCQkJc2tiX3Jlc2VydmUoc2tiLCBvZmZzZXQpOworCX0KKwlyZXR1cm4gc2tiOworfQorCisjZW5kaWYgLyogIShfTVlSSV9TQlVTX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uYXRzZW1pLmMgYi9kcml2ZXJzL25ldC9uYXRzZW1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzYmRhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25hdHNlbWkuYwpAQCAtMCwwICsxLDMyNzMgQEAKKy8qIG5hdHNlbWkuYzogQSBMaW51eCBQQ0kgRXRoZXJuZXQgZHJpdmVyIGZvciB0aGUgTmF0U2VtaSBEUDgzODF4IHNlcmllcy4gKi8KKy8qCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5OS0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCisJUG9ydGlvbnMgY29weXJpZ2h0IChjKSAyMDAxLDIwMDIgU3VuIE1pY3Jvc3lzdGVtcyAodGhvY2tpbkBzdW4uY29tKQorCVBvcnRpb25zIGNvcHlyaWdodCAyMDAxLDIwMDIgTWFuZnJlZCBTcHJhdWwgKG1hbmZyZWRAY29sb3JmdWxsaWZlLmNvbSkKKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKwl0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCURyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKwlyZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90CisJYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKwlzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4gIExpY2Vuc2UgZm9yIHVuZGVyIG90aGVyIHRlcm1zIG1heSBiZQorCWF2YWlsYWJsZS4gIENvbnRhY3QgdGhlIG9yaWdpbmFsIGF1dGhvciBmb3IgZGV0YWlscy4KKworCVRoZSBvcmlnaW5hbCBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgYXQKKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJU3VwcG9ydCBpbmZvcm1hdGlvbiBhbmQgdXBkYXRlcyBhdmFpbGFibGUgYXQKKwlodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL25ldHNlbWkuaHRtbAorCisKKwlMaW51eCBrZXJuZWwgbW9kaWZpY2F0aW9uczoKKworCVZlcnNpb24gMS4wLjE6CisJCS0gU3BpbmxvY2sgZml4ZXMKKwkJLSBCdWcgZml4ZXMgYW5kIGJldHRlciBpbnRyIHBlcmZvcm1hbmNlIChUamVlcmQpCisJVmVyc2lvbiAxLjAuMjoKKwkJLSBOb3cgcmVhZHMgY29ycmVjdCBNQUMgYWRkcmVzcyBmcm9tIGVlcHJvbQorCVZlcnNpb24gMS4wLjM6CisJCS0gRWxpbWluYXRlIHJlZHVuZGFudCBwcml2LT50eF9mdWxsIGZsYWcKKwkJLSBDYWxsIG5ldGlmX3N0YXJ0X3F1ZXVlIGZyb20gZGV2LT50eF90aW1lb3V0CisJCS0gd21iKCkgaW4gc3RhcnRfdHgoKSB0byBmbHVzaCBkYXRhCisJCS0gVXBkYXRlIFR4IGxvY2tpbmcKKwkJLSBDbGVhbiB1cCBQQ0kgZW5hYmxlIChkYXZlaikKKwlWZXJzaW9uIDEuMC40OgorCQktIE1lcmdlIERvbmFsZCBCZWNrZXIncyBuYXRzZW1pLmMgdmVyc2lvbiAxLjA3CisJVmVyc2lvbiAxLjAuNToKKwkJLSB7IGZpbGwgbWUgaW4gfQorCVZlcnNpb24gMS4wLjY6CisJCSogZXRodG9vbCBzdXBwb3J0IChqZ2FyemlrKQorCQkqIFByb3BlciBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2FyZCAod2hpY2ggc29tZXRpbWVzCisJCWZhaWxzIHRvIG9jY3VyIGFuZCBsZWF2ZXMgdGhlIGNhcmQgaW4gYSBub24tZnVuY3Rpb25hbAorCQlzdGF0ZSkuICh1emkpCisKKwkJKiBTb21lIGRvY3VtZW50ZWQgcmVnaXN0ZXIgc2V0dGluZ3MgdG8gb3B0aW1pemUgc29tZQorCQlvZiB0aGUgMTAwTWJpdCBhdXRvZGV0ZWN0aW9uIGNpcmN1aXRyeSBpbiByZXYgQyBjYXJkcy4gKHV6aSkKKworCQkqIFBvbGxpbmcgb2YgdGhlIFBIWSBpbnRyIGZvciBzdHVmZiBsaWtlIGxpbmsgc3RhdGUKKwkJY2hhbmdlIGFuZCBhdXRvLSBuZWdvdGlhdGlvbiB0byBmaW5hbGx5IHdvcmsgcHJvcGVybHkuICh1emkpCisKKwkJKiBPbmUtbGluZXIgcmVtb3ZhbCBvZiBhIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZgorCQluZXRkZXZfZXJyb3IoKS4gKHV6aSkKKworCVZlcnNpb24gMS4wLjc6IChNYW5mcmVkIFNwcmF1bCkKKwkJKiBwY2kgZG1hCisJCSogU01QIGxvY2tpbmcgdXBkYXRlCisJCSogZnVsbCByZXNldCBhZGRlZCBpbnRvIHR4X3RpbWVvdXQKKwkJKiBjb3JyZWN0IG11bHRpY2FzdCBoYXNoIGdlbmVyYXRpb24gKGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuKQorCQkJW2NvcGllZCBmcm9tIGEgbmF0c2VtaSBkcml2ZXIgdmVyc2lvbgorCQkJIGZyb20gTXlyaW8gQ29ycG9yYXRpb24sIEdyZWcgU21pdGhdCisJCSogc3VzcGVuZC9yZXN1bWUKKworCXZlcnNpb24gMS4wLjggKFRpbSBIb2NraW4gPHRob2NraW5Ac3VuLmNvbT4pCisJCSogRVRIVE9PTF8qIHN1cHBvcnQKKwkJKiBXYWtlIG9uIGxhbiBzdXBwb3J0IChFcmlrIEdpbGxpbmcpCisJCSogTVhETUEgZml4ZXMgZm9yIHNlcnZlcndvcmtzCisJCSogRUVQUk9NIHJlbG9hZAorCisJdmVyc2lvbiAxLjAuOSAoTWFuZnJlZCBTcHJhdWwpCisJCSogTWFpbiBjaGFuZ2U6IGZpeCBsYWNrIG9mIHN5bmNocm9uaXplCisJCW5ldGlmX2Nsb3NlL25ldGlmX3N1c3BlbmQgYWdhaW5zdCBhIGxhc3QgaW50ZXJydXB0CisJCW9yIHBhY2tldC4KKwkJKiBkbyBub3QgZW5hYmxlIHN1cGVyZmxvdXMgaW50ZXJydXB0cyAoZS5nLiB0aGUKKwkJZHJpdmVycyByZWxpZXMgb24gVHhEb25lIC0gVHhJbnRyIG5vdCBuZWVkZWQpCisJCSogd2FpdCB0aGF0IHRoZSBoYXJkd2FyZSBoYXMgcmVhbGx5IHN0b3BwZWQgaW4gY2xvc2UKKwkJYW5kIHN1c3BlbmQuCisJCSogd29ya2Fyb3VuZCBmb3IgdGhlIChhdCBsZWFzdCkgZ2NjLTIuOTUuMSBjb21waWxlcgorCQlwcm9ibGVtLiBBbHNvIHNpbXBsaWZpZXMgdGhlIGNvZGUgYSBiaXQuCisJCSogZGlzYWJsZV9pcnEoKSBpbiB0eF90aW1lb3V0IC0gbmVlZGVkIHRvIHByb3RlY3QKKwkJYWdhaW5zdCByeCBpbnRlcnJ1cHRzLgorCQkqIHN0b3AgdGhlIG5pYyBiZWZvcmUgc3dpdGNoaW5nIGludG8gc2lsZW50IHJ4IG1vZGUKKwkJZm9yIHdvbCAocmVxdWlyZWQgYWNjb3JkaW5nIHRvIGRvY3UpLgorCisJdmVyc2lvbiAxLjAuMTA6CisJCSogdXNlIGxvbmcgZm9yIGVlX2FkZHIgKHZhcmlvdXMpCisJCSogcHJpbnQgcG9pbnRlcnMgcHJvcGVybHkgKERhdmVNKQorCQkqIGluY2x1ZGUgYXNtL2lycS5oICg/KQorCisJdmVyc2lvbiAxLjAuMTE6CisJCSogY2hlY2sgYW5kIHJlc2V0IGlmIFBIWSBlcnJvcnMgYXBwZWFyIChBZHJpYW4gU3VuKQorCQkqIFdvTCBjbGVhbnVwIChUaW0gSG9ja2luKQorCQkqIE1hZ2ljIG51bWJlciBjbGVhbnVwIChUaW0gSG9ja2luKQorCQkqIERvbid0IHJlbG9hZCBFRVBST00gb24gZXZlcnkgcmVzZXQgKFRpbSBIb2NraW4pCisJCSogU2F2ZSBhbmQgcmVzdG9yZSBFRVBST00gc3RhdGUgYWNyb3NzIHJlc2V0IChUaW0gSG9ja2luKQorCQkqIE1ESU8gQ2xlYW51cCAoVGltIEhvY2tpbikKKwkJKiBSZWZvcm1hdCByZWdpc3RlciBvZmZzZXRzL2JpdHMgKGpnYXJ6aWspCisKKwl2ZXJzaW9uIDEuMC4xMjoKKwkJKiBFVEhUT09MXyogZnVydGhlciBzdXBwb3J0IChUaW0gSG9ja2luKQorCisJdmVyc2lvbiAxLjAuMTM6CisJCSogRVRIVE9PTF9bR11FRVBST00gc3VwcG9ydCAoVGltIEhvY2tpbikKKworCXZlcnNpb24gMS4wLjEzOgorCQkqIGNyYyBjbGVhbnVwIChNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+KQorCisJdmVyc2lvbiAxLjAuMTQ6CisJCSogQ2xlYW51cCBzb21lIG1lc3NhZ2VzIGFuZCBhdXRvbmVnIGluIGV0aHRvb2wgKFRpbSBIb2NraW4pCisKKwl2ZXJzaW9uIDEuMC4xNToKKwkJKiBHZXQgcmlkIG9mIGNhYmxlX21hZ2ljIGZsYWcKKwkJKiB1c2UgbmV3IChOYXRpb25hbCBwcm92aWRlZCkgc29sdXRpb24gZm9yIGNhYmxlIG1hZ2ljIGlzc3VlCisKKwl2ZXJzaW9uIDEuMC4xNjoKKwkJKiBjYWxsIG5ldGRldl9yeCgpIGZvciBSeEVycm9ycyAoTWFuZnJlZCBTcHJhdWwpCisJCSogZm9ybWF0dGluZyBhbmQgY2xlYW51cHMKKwkJKiBjaGFuZ2Ugb3B0aW9ucyBhbmQgZnVsbF9kdXBsZXggYXJyYXlzIHRvIGJlIHplcm8KKwkJICBpbml0aWFsaXplZAorCQkqIGVuYWJsZSBvbmx5IHRoZSBXb0wgYW5kIFBIWSBpbnRlcnJ1cHRzIGluIHdvbCBtb2RlCisKKwl2ZXJzaW9uIDEuMC4xNzoKKwkJKiBvbmx5IGRvIGNhYmxlX21hZ2ljIG9uIDgzODE1IGFuZCBlYXJseSA4MzgxNiAoVGltIEhvY2tpbikKKwkJKiBjcmVhdGUgYSBmdW5jdGlvbiBmb3IgcnggcmVmaWxsIChNYW5mcmVkIFNwcmF1bCkKKwkJKiBjb21iaW5lIGRyYWluX3JpbmcgYW5kIGluaXRfcmluZyAoTWFuZnJlZCBTcHJhdWwpCisJCSogb29tIGhhbmRsaW5nIChNYW5mcmVkIFNwcmF1bCkKKwkJKiBoYW5kc19vZmYgaW5zdGVhZCBvZiBwbGF5aW5nIHdpdGggbmV0aWZfZGV2aWNlX3tkZSxhfXR0YWNoCisJCSAgKE1hbmZyZWQgU3ByYXVsKQorCQkqIGJlIHN1cmUgdG8gd3JpdGUgdGhlIE1BQyBiYWNrIHRvIHRoZSBjaGlwIChNYW5mcmVkIFNwcmF1bCkKKwkJKiBsZW5ndGhlbiBFRVBST00gdGltZW91dCwgYW5kIGFsd2F5cyB3YXJuIGFib3V0IHRpbWVvdXRzCisJCSAgKE1hbmZyZWQgU3ByYXVsKQorCQkqIGNvbW1lbnRzIHVwZGF0ZSAoTWFuZnJlZCkKKwkJKiBkbyB0aGUgcmlnaHQgdGhpbmcgb24gYSBwaHktcmVzZXQgKE1hbmZyZWQgYW5kIFRpbSkKKworCVRPRE86CisJKiBiaWcgZW5kaWFuIHN1cHBvcnQgd2l0aCBDRkc6QkVNIGluc3RlYWQgb2YgY3B1X3RvX2xlMzIKKwkqIHN1cHBvcnQgZm9yIGFuIGV4dGVybmFsIFBIWQorCSogTkFQSQorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBEUlZfTkFNRQkibmF0c2VtaSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMDcrTEsxLjAuMTciCisjZGVmaW5lIERSVl9SRUxEQVRFCSJTZXAgMjcsIDIwMDIiCisKKyNkZWZpbmUgUlhfT0ZGU0VUCTIKKworLyogVXBkYXRlZCB0byByZWNvbW1lbmRhdGlvbnMgaW4gcGNpLXNrZWxldG9uIHYyLjAzLiAqLworCisvKiBUaGUgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLgorICAgVGhlc2UgbWF5IGJlIG1vZGlmaWVkIHdoZW4gYSBkcml2ZXIgbW9kdWxlIGlzIGxvYWRlZC4qLworCisjZGVmaW5lIE5BVFNFTUlfREVGX01TRwkJKE5FVElGX01TR19EUlYJCXwgXAorCQkJCSBORVRJRl9NU0dfTElOSwkJfCBcCisJCQkJIE5FVElGX01TR19XT0wJCXwgXAorCQkJCSBORVRJRl9NU0dfUlhfRVJSCXwgXAorCQkJCSBORVRJRl9NU0dfVFhfRVJSKQorc3RhdGljIGludCBkZWJ1ZyA9IC0xOworCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0LiAqLworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyMDsKK3N0YXRpYyBpbnQgbXR1OworCisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIHJ4LWFsbC1tdWx0aWNhc3QpLgorICAgVGhpcyBjaGlwIHVzZXMgYSA1MTIgZWxlbWVudCBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZSBFdGhlcm5ldCBDUkMuICAqLworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMTAwOworCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWZyYW1lcyBzY2hlbWUuCisgICBTZXR0aW5nIHRvID4gMTUxOCBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuICovCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhazsKKworLyogVXNlZCB0byBwYXNzIHRoZSBtZWRpYSB0eXBlLCBldGMuCisgICBCb3RoICdvcHRpb25zW10nIGFuZCAnZnVsbF9kdXBsZXhbXScgc2hvdWxkIGV4aXN0IGZvciBkcml2ZXIKKyAgIGludGVyb3BlcmFiaWxpdHkuCisgICBUaGUgbWVkaWEgdHlwZSBpcyB1c3VhbGx5IHBhc3NlZCBpbiAnb3B0aW9uc1tdJy4KKyovCisjZGVmaW5lIE1BWF9VTklUUyA4CQkvKiBNb3JlIGFyZSBzdXBwb3J0ZWQsIGxpbWl0IG9ubHkgb24gb3B0aW9ucyAqLworc3RhdGljIGludCBvcHRpb25zW01BWF9VTklUU107CitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4W01BWF9VTklUU107CisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZS4gKi8KKworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgY29tcGlsZSBlZmZpY2llbmN5LgorICAgVGhlIGNvbXBpbGVyIHdpbGwgY29udmVydCA8dW5zaWduZWQ+JyUnPDJeTj4gaW50byBhIGJpdCBtYXNrLgorICAgTWFraW5nIHRoZSBUeCByaW5nIHRvbyBsYXJnZSBkZWNyZWFzZXMgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgY2hhbm5lbAorICAgYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LgorICAgVGhlcmUgYXJlIG5vIGlsbCBlZmZlY3RzIGZyb20gdG9vLWxhcmdlIHJlY2VpdmUgcmluZ3MuICovCisjZGVmaW5lIFRYX1JJTkdfU0laRQkxNgorI2RlZmluZSBUWF9RVUVVRV9MRU4JMTAgLyogTGltaXQgcmluZyBlbnRyaWVzIGFjdHVhbGx5IHVzZWQsIG1pbiA0LiAqLworI2RlZmluZSBSWF9SSU5HX1NJWkUJMzIKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoMipIWikKKworI2RlZmluZSBOQVRTRU1JX0hXX1RJTUVPVVQJNDAwCisjZGVmaW5lIE5BVFNFTUlfVElNRVJfRlJFUQkzKkhaCisjZGVmaW5lIE5BVFNFTUlfUEcwX05SRUdTCTY0CisjZGVmaW5lIE5BVFNFTUlfUkZEUl9OUkVHUwk4CisjZGVmaW5lIE5BVFNFTUlfUEcxX05SRUdTCTQKKyNkZWZpbmUgTkFUU0VNSV9OUkVHUwkJKE5BVFNFTUlfUEcwX05SRUdTICsgTkFUU0VNSV9SRkRSX05SRUdTICsgXAorCQkJCSBOQVRTRU1JX1BHMV9OUkVHUykKKyNkZWZpbmUgTkFUU0VNSV9SRUdTX1ZFUgkxIC8qIHYxIGFkZGVkIFJGRFIgcmVnaXN0ZXJzICovCisjZGVmaW5lIE5BVFNFTUlfUkVHU19TSVpFCShOQVRTRU1JX05SRUdTICogc2l6ZW9mKHUzMikpCisjZGVmaW5lIE5BVFNFTUlfRUVQUk9NX1NJWkUJMjQgLyogMTIgMTYtYml0IHZhbHVlcyAqLworCisvKiBCdWZmZXIgc2l6ZXM6CisgKiBUaGUgbmljIHdyaXRlcyAzMi1iaXQgdmFsdWVzLCBldmVuIGlmIHRoZSB1cHBlciBieXRlcyBvZgorICogYSAzMi1iaXQgdmFsdWUgYXJlIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgKi8KKyNkZWZpbmUgTkFUU0VNSV9IRUFERVJTCQkyMgkvKiAyKm1hYyx0eXBlLHZsYW4sY3JjICovCisjZGVmaW5lIE5BVFNFTUlfUEFERElORwkJMTYJLyogMiBieXRlcyBzaG91bGQgYmUgc3VmZmljaWVudCAqLworI2RlZmluZSBOQVRTRU1JX0xPTkdQS1QJCTE1MTgJLyogbGltaXQgZm9yIG5vcm1hbCBwYWNrZXRzICovCisjZGVmaW5lIE5BVFNFTUlfUlhfTElNSVQJMjA0NgkvKiBtYXhpbXVtIHN1cHBvcnRlZCBieSBoYXJkd2FyZSAqLworCisvKiBUaGVzZSBpZGVudGlmeSB0aGUgZHJpdmVyIGJhc2UgdmVyc2lvbiBhbmQgbWF5IG5vdCBiZSByZW1vdmVkLiAqLworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorICBLRVJOX0lORk8gRFJWX05BTUUgIiBkcDgzODF4IGRyaXZlciwgdmVyc2lvbiAiCisgICAgICBEUlZfVkVSU0lPTiAiLCAiIERSVl9SRUxEQVRFICJcbiIKKyAgS0VSTl9JTkZPICIgIG9yaWdpbmFsbHkgYnkgRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT5cbiIKKyAgS0VSTl9JTkZPICIgIGh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvbmF0c2VtaS5odG1sXG4iCisgIEtFUk5fSU5GTyAiICAyLjQueCBrZXJuZWwgcG9ydCBieSBKZWZmIEdhcnppaywgVGplZXJkIE11bGRlclxuIjsKKworTU9EVUxFX0FVVEhPUigiRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBEUDgzODF4IHNlcmllcyBQQ0kgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShtYXhfaW50ZXJydXB0X3dvcmssIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXR1LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfaW50ZXJydXB0X3dvcmssIAorCSJEUDgzODF4IG1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworTU9EVUxFX1BBUk1fREVTQyhtdHUsICJEUDgzODF4IE1UVSAoYWxsIGJvYXJkcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEUDgzODF4IGRlZmF1bHQgZGVidWcgbGV2ZWwiKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfY29weWJyZWFrLCAKKwkiRFA4MzgxeCBjb3B5IGJyZWFrcG9pbnQgZm9yIGNvcHktb25seS10aW55LWZyYW1lcyIpOworTU9EVUxFX1BBUk1fREVTQyhvcHRpb25zLCAKKwkiRFA4MzgxeDogQml0cyAwLTM6IG1lZGlhIHR5cGUsIGJpdCAxNzogZnVsbCBkdXBsZXgiKTsKK01PRFVMRV9QQVJNX0RFU0MoZnVsbF9kdXBsZXgsICJEUDgzODF4IGZ1bGwgZHVwbGV4IHNldHRpbmcocykgKDEpIik7CisKKy8qCisJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCitJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisKK1RoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIERQODM4MTUgUENJIEV0aGVybmV0IE5JQy4KK0l0IGFsc28gd29ya3Mgd2l0aCBvdGhlciBjaGlwcyBpbiBpbiB0aGUgRFA4MzgxMCBzZXJpZXMuCisKK0lJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworCitUaGlzIGRyaXZlciByZXF1aXJlcyB0aGUgUENJIGludGVycnVwdCBsaW5lIHRvIGJlIHZhbGlkLgorSXQgaG9ub3JzIHRoZSBFRVBST00tc2V0IHZhbHVlcy4KKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK0lJSWEuIFJpbmcgYnVmZmVycworCitUaGlzIGRyaXZlciB1c2VzIHR3byBzdGF0aWNhbGx5IGFsbG9jYXRlZCBmaXhlZC1zaXplIGRlc2NyaXB0b3IgbGlzdHMKK2Zvcm1lZCBpbnRvIHJpbmdzIGJ5IGEgYnJhbmNoIGZyb20gdGhlIGZpbmFsIGRlc2NyaXB0b3IgdG8gdGhlIGJlZ2lubmluZyBvZgordGhlIGxpc3QuICBUaGUgcmluZyBzaXplcyBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZSBieSBSWC9UWF9SSU5HX1NJWkUuCitUaGUgTmF0U2VtaSBkZXNpZ24gdXNlcyBhICduZXh0IGRlc2NyaXB0b3InIHBvaW50ZXIgdGhhdCB0aGUgZHJpdmVyIGZvcm1zCitpbnRvIGEgbGlzdC4KKworSUlJYi9jLiBUcmFuc21pdC9SZWNlaXZlIFN0cnVjdHVyZQorCitUaGlzIGRyaXZlciB1c2VzIGEgemVyby1jb3B5IHJlY2VpdmUgYW5kIHRyYW5zbWl0IHNjaGVtZS4KK1RoZSBkcml2ZXIgYWxsb2NhdGVzIGZ1bGwgZnJhbWUgc2l6ZSBza2J1ZmZzIGZvciB0aGUgUnggcmluZyBidWZmZXJzIGF0CitvcGVuKCkgdGltZSBhbmQgcGFzc2VzIHRoZSBza2ItPmRhdGEgZmllbGQgdG8gdGhlIGNoaXAgYXMgcmVjZWl2ZSBkYXRhCitidWZmZXJzLiAgV2hlbiBhbiBpbmNvbWluZyBmcmFtZSBpcyBsZXNzIHRoYW4gUlhfQ09QWUJSRUFLIGJ5dGVzIGxvbmcsCithIGZyZXNoIHNrYnVmZiBpcyBhbGxvY2F0ZWQgYW5kIHRoZSBmcmFtZSBpcyBjb3BpZWQgdG8gdGhlIG5ldyBza2J1ZmYuCitXaGVuIHRoZSBpbmNvbWluZyBmcmFtZSBpcyBsYXJnZXIsIHRoZSBza2J1ZmYgaXMgcGFzc2VkIGRpcmVjdGx5IHVwIHRoZQorcHJvdG9jb2wgc3RhY2suICBCdWZmZXJzIGNvbnN1bWVkIHRoaXMgd2F5IGFyZSByZXBsYWNlZCBieSBuZXdseSBhbGxvY2F0ZWQKK3NrYnVmZnMgaW4gYSBsYXRlciBwaGFzZSBvZiByZWNlaXZlcy4KKworVGhlIFJYX0NPUFlCUkVBSyB2YWx1ZSBpcyBjaG9zZW4gdG8gdHJhZGUtb2ZmIHRoZSBtZW1vcnkgd2FzdGVkIGJ5Cit1c2luZyBhIGZ1bGwtc2l6ZWQgc2tidWZmIGZvciBzbWFsbCBmcmFtZXMgdnMuIHRoZSBjb3B5aW5nIGNvc3RzIG9mIGxhcmdlcgorZnJhbWVzLiAgTmV3IGJvYXJkcyBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gZ2VuZXJvdXNseSBjb25maWd1cmVkIG1hY2hpbmVzCithbmQgdGhlIHVuZGVyZmlsbGVkIGJ1ZmZlcnMgaGF2ZSBuZWdsaWdpYmxlIGltcGFjdCBjb21wYXJlZCB0byB0aGUgYmVuZWZpdCBvZgorYSBzaW5nbGUgYWxsb2NhdGlvbiBzaXplLCBzbyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB6ZXJvIHJlc3VsdHMgaW4gbmV2ZXIKK2NvcHlpbmcgcGFja2V0cy4gIFdoZW4gY29weWluZyBpcyBkb25lLCB0aGUgY29zdCBpcyB1c3VhbGx5IG1pdGlnYXRlZCBieSB1c2luZworYSBjb21iaW5lZCBjb3B5L2NoZWNrc3VtIHJvdXRpbmUuICBDb3B5aW5nIGFsc28gcHJlbG9hZHMgdGhlIGNhY2hlLCB3aGljaCBpcworbW9zdCB1c2VmdWwgd2l0aCBzbWFsbCBmcmFtZXMuCisKK0Egc3VidGxlIGFzcGVjdCBvZiB0aGUgb3BlcmF0aW9uIGlzIHRoYXQgdW5hbGlnbmVkIGJ1ZmZlcnMgYXJlIG5vdCBwZXJtaXR0ZWQKK2J5IHRoZSBoYXJkd2FyZS4gIFRodXMgdGhlIElQIGhlYWRlciBhdCBvZmZzZXQgMTQgaW4gYW4gZXRoZXJuZXQgZnJhbWUgaXNuJ3QKK2xvbmd3b3JkIGFsaWduZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gIE9uIGNvcGllcyBmcmFtZXMgYXJlIHB1dCBpbnRvIHRoZQorc2tidWZmIGF0IGFuIG9mZnNldCBvZiAiKzIiLCAxNi1ieXRlIGFsaWduaW5nIHRoZSBJUCBoZWFkZXIuCisKK0lJSWQuIFN5bmNocm9uaXphdGlvbgorCitNb3N0IG9wZXJhdGlvbnMgYXJlIHN5bmNocm9uaXplZCBvbiB0aGUgbnAtPmxvY2sgaXJxIHNwaW5sb2NrLCBleGNlcHQgdGhlCitwZXJmb3JtYW5jZSBjcml0aWNhbCBjb2RlcGF0aHM6CisKK1RoZSByeCBwcm9jZXNzIG9ubHkgcnVucyBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIuIEFjY2VzcyBmcm9tIG91dHNpZGUKK3RoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcyBvbmx5IHBlcm1pdHRlZCBhZnRlciBkaXNhYmxlX2lycSgpLgorCitUaGUgcnggcHJvY2VzcyB1c3VhbGx5IHJ1bnMgdW5kZXIgdGhlIGRldi0+eG1pdF9sb2NrLiBJZiBucC0+aW50cl90eF9yZWFwCitpcyBzZXQsIHRoZW4gYWNjZXNzIGlzIHBlcm1pdHRlZCB1bmRlciBzcGluX2xvY2tfaXJxKCZucC0+bG9jaykuCisKK1RodXMgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgdGhhdCB3YW50IHRvIGFjY2VzcyBldmVyeXRoaW5nIG11c3QgY2FsbAorCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlzcGluX2xvY2tfYmgoZGV2LT54bWl0X2xvY2spOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKworSVYuIE5vdGVzCisKK05hdFNlbWkgUENJIG5ldHdvcmsgY29udHJvbGxlcnMgYXJlIHZlcnkgdW5jb21tb24uCisKK0lWYi4gUmVmZXJlbmNlcworCitodHRwOi8vd3d3LnNjeWxkLmNvbS9leHBlcnQvMTAwbWJwcy5odG1sCitodHRwOi8vd3d3LnNjeWxkLmNvbS9leHBlcnQvTldheS5odG1sCitEYXRhc2hlZXQgaXMgYXZhaWxhYmxlIGZyb206CitodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9EUC9EUDgzODE1Lmh0bWwKKworSVZjLiBFcnJhdGEKKworTm9uZSBjaGFyYWN0ZXJpc2VkLgorKi8KKworCisKK2VudW0gcGNpc3R1ZmYgeworCVBDSV9VU0VTX0lPID0gMHgwMSwKKwlQQ0lfVVNFU19NRU0gPSAweDAyLAorCVBDSV9VU0VTX01BU1RFUiA9IDB4MDQsCisJUENJX0FERFIwID0gMHgwOCwKKwlQQ0lfQUREUjEgPSAweDEwLAorfTsKKworLyogTU1JTyBvcGVyYXRpb25zIHJlcXVpcmVkICovCisjZGVmaW5lIFBDSV9JT1RZUEUgKFBDSV9VU0VTX01BU1RFUiB8IFBDSV9VU0VTX01FTSB8IFBDSV9BRERSMSkKKworCisvKgorICogU3VwcG9ydCBmb3IgZmlicmUgY29ubmVjdGlvbnMgb24gQW03OUM4NzQ6CisgKiBUaGlzIHBoeSBuZWVkcyBhIHNwZWNpYWwgc2V0dXAgd2hlbiBjb25uZWN0ZWQgdG8gYSBmaWJyZSBjYWJsZS4KKyAqIGh0dHA6Ly93d3cuYW1kLmNvbS9maWxlcy9jb25uZWN0aXZpdHlzb2x1dGlvbnMvbmV0d29ya2luZy9hcmNoaXZlZG5ldHdvcmtpbmcvMjIyMzUucGRmCisgKi8KKyNkZWZpbmUgUEhZSURfQU03OUM4NzQJMHgwMDIyNTYxYgorCisjZGVmaW5lIE1JSV9NQ1RSTAkweDE1CS8qIG1vZGUgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBNSUlfRlhfU0VMCTB4MDAwMQkvKiAxMDBCQVNFLUZYIChmaWJlcikgKi8KKyNkZWZpbmUgTUlJX0VOX1NDUk0JMHgwMDA0CS8qIGVuYWJsZSBzY3JhbWJsZXIgKHRwKSAqLworCisgCisvKiBhcnJheSBvZiBib2FyZCBkYXRhIGRpcmVjdGx5IGluZGV4ZWQgYnkgcGNpX3RibFt4XS5kcml2ZXJfZGF0YSAqLworc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworfSBuYXRzZW1pX3BjaV9pbmZvW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7ICJOYXRTZW1pIERQODM4MVs1Nl0iLCBQQ0lfSU9UWVBFIH0sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbmF0c2VtaV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX05TLCBQQ0lfREVWSUNFX0lEX05TXzgzODE1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMCwgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbmF0c2VtaV9wY2lfdGJsKTsKKworLyogT2Zmc2V0cyB0byB0aGUgZGV2aWNlIHJlZ2lzdGVycy4KKyAgIFVubGlrZSBzb2Z0d2FyZS1vbmx5IHN5c3RlbXMsIGRldmljZSBkcml2ZXJzIGludGVyYWN0IHdpdGggY29tcGxleCBoYXJkd2FyZS4KKyAgIEl0J3Mgbm90IHVzZWZ1bCB0byBkZWZpbmUgc3ltYm9saWMgbmFtZXMgZm9yIGV2ZXJ5IHJlZ2lzdGVyIGJpdCBpbiB0aGUKKyAgIGRldmljZS4KKyovCitlbnVtIHJlZ2lzdGVyX29mZnNldHMgeworCUNoaXBDbWQJCQk9IDB4MDAsCisJQ2hpcENvbmZpZwkJPSAweDA0LAorCUVFQ3RybAkJCT0gMHgwOCwKKwlQQ0lCdXNDZmcJCT0gMHgwQywKKwlJbnRyU3RhdHVzCQk9IDB4MTAsCisJSW50ck1hc2sJCT0gMHgxNCwKKwlJbnRyRW5hYmxlCQk9IDB4MTgsCisJSW50ckhvbGRvZmYJCT0gMHgxQywgLyogRFA4MzgxNiBvbmx5ICovCisJVHhSaW5nUHRyCQk9IDB4MjAsCisJVHhDb25maWcJCT0gMHgyNCwKKwlSeFJpbmdQdHIJCT0gMHgzMCwKKwlSeENvbmZpZwkJPSAweDM0LAorCUNsa1J1bgkJCT0gMHgzQywKKwlXT0xDbWQJCQk9IDB4NDAsCisJUGF1c2VDbWQJCT0gMHg0NCwKKwlSeEZpbHRlckFkZHIJCT0gMHg0OCwKKwlSeEZpbHRlckRhdGEJCT0gMHg0QywKKwlCb290Um9tQWRkcgkJPSAweDUwLAorCUJvb3RSb21EYXRhCQk9IDB4NTQsCisJU2lsaWNvblJldgkJPSAweDU4LAorCVN0YXRzQ3RybAkJPSAweDVDLAorCVN0YXRzRGF0YQkJPSAweDYwLAorCVJ4UGt0RXJycwkJPSAweDYwLAorCVJ4TWlzc2VkCQk9IDB4NjgsCisJUnhDUkNFcnJzCQk9IDB4NjQsCisJQmFzaWNDb250cm9sCQk9IDB4ODAsCisJQmFzaWNTdGF0dXMJCT0gMHg4NCwKKwlBbmVnQWR2CQkJPSAweDkwLAorCUFuZWdQZWVyCQk9IDB4OTQsCisJUGh5U3RhdHVzCQk9IDB4QzAsCisJTUludHJDdHJsCQk9IDB4QzQsCisJTUludHJTdGF0dXMJCT0gMHhDOCwKKwlQaHlDdHJsCQkJPSAweEU0LAorCisJLyogVGhlc2UgYXJlIGZyb20gdGhlIHNwZWMsIGFyb3VuZCBwYWdlIDc4Li4uIG9uIGEgc2VwYXJhdGUgdGFibGUuCisJICogVGhlIG1lYW5pbmcgb2YgdGhlc2UgcmVnaXN0ZXJzIGRlcGVuZCBvbiB0aGUgdmFsdWUgb2YgUEdTRUwuICovCisJUEdTRUwJCQk9IDB4Q0MsCisJUE1EQ1NSCQkJPSAweEU0LAorCVRTVERBVAkJCT0gMHhGQywKKwlEU1BDRkcJCQk9IDB4RjQsCisJU0RDRkcJCQk9IDB4RjgKK307CisvKiB0aGUgdmFsdWVzIGZvciB0aGUgJ21hZ2ljJyByZWdpc3RlcnMgYWJvdmUgKFBHU0VMPTEpICovCisjZGVmaW5lIFBNRENTUl9WQUwJMHgxODljCS8qIGVuYWJsZSBwcmVmZXJyZWQgYWRhcHRhdGlvbiBjaXJjdWl0cnkgKi8KKyNkZWZpbmUgVFNUREFUX1ZBTAkweDAKKyNkZWZpbmUgRFNQQ0ZHX1ZBTAkweDUwNDAKKyNkZWZpbmUgU0RDRkdfVkFMCTB4MDA4YwkvKiBzZXQgdm9sdGFnZSB0aHJlc2hvbGRzIGZvciBTaWduYWwgRGV0ZWN0ICovCisjZGVmaW5lIERTUENGR19MT0NLCTB4MjAJLyogY29lZmZpY2llbnQgbG9jayBiaXQgaW4gRFNQQ0ZHICovCisjZGVmaW5lIERTUENGR19DT0VGCTB4MTAwMAkvKiBzZWUgY29lZmZpY2llbnQgKGluIFRTVERBVCkgYml0IGluIERTUENGRyAqLworI2RlZmluZSBUU1REQVRfRklYRUQJMHhlOAkvKiBtYWdpYyBudW1iZXIgZm9yIGJhZCBjb2VmZmljaWVudHMgKi8KKworLyogbWlzYyBQQ0kgc3BhY2UgcmVnaXN0ZXJzICovCitlbnVtIHBjaV9yZWdpc3Rlcl9vZmZzZXRzIHsKKwlQQ0lQTQkJCT0gMHg0NCwKK307CisKK2VudW0gQ2hpcENtZF9iaXRzIHsKKwlDaGlwUmVzZXQJCT0gMHgxMDAsCisJUnhSZXNldAkJCT0gMHgyMCwKKwlUeFJlc2V0CQkJPSAweDEwLAorCVJ4T2ZmCQkJPSAweDA4LAorCVJ4T24JCQk9IDB4MDQsCisJVHhPZmYJCQk9IDB4MDIsCisJVHhPbgkJCT0gMHgwMSwKK307CisKK2VudW0gQ2hpcENvbmZpZ19iaXRzIHsKKwlDZmdQaHlEaXMJCT0gMHgyMDAsCisJQ2ZnUGh5UnN0CQk9IDB4NDAwLAorCUNmZ0V4dFBoeQkJPSAweDEwMDAsCisJQ2ZnQW5lZ0VuYWJsZQkJPSAweDIwMDAsCisJQ2ZnQW5lZzEwMAkJPSAweDQwMDAsCisJQ2ZnQW5lZ0Z1bGwJCT0gMHg4MDAwLAorCUNmZ0FuZWdEb25lCQk9IDB4ODAwMDAwMCwKKwlDZmdGdWxsRHVwbGV4CQk9IDB4MjAwMDAwMDAsCisJQ2ZnU3BlZWQxMDAJCT0gMHg0MDAwMDAwMCwKKwlDZmdMaW5rCQkJPSAweDgwMDAwMDAwLAorfTsKKworZW51bSBFRUN0cmxfYml0cyB7CisJRUVfU2hpZnRDbGsJCT0gMHgwNCwKKwlFRV9EYXRhSW4JCT0gMHgwMSwKKwlFRV9DaGlwU2VsZWN0CQk9IDB4MDgsCisJRUVfRGF0YU91dAkJPSAweDAyLAorCU1JSV9EYXRhIAkJPSAweDEwLAorCU1JSV9Xcml0ZQkJPSAweDIwLAorCU1JSV9TaGlmdENsawkJPSAweDQwLAorfTsKKworZW51bSBQQ0lCdXNDZmdfYml0cyB7CisJRWVwcm9tUmVsb2FkCQk9IDB4NCwKK307CisKKy8qIEJpdHMgaW4gdGhlIGludGVycnVwdCBzdGF0dXMvbWFzayByZWdpc3RlcnMuICovCitlbnVtIEludHJTdGF0dXNfYml0cyB7CisJSW50clJ4RG9uZQkJPSAweDAwMDEsCisJSW50clJ4SW50cgkJPSAweDAwMDIsCisJSW50clJ4RXJyCQk9IDB4MDAwNCwKKwlJbnRyUnhFYXJseQkJPSAweDAwMDgsCisJSW50clJ4SWRsZQkJPSAweDAwMTAsCisJSW50clJ4T3ZlcnJ1bgkJPSAweDAwMjAsCisJSW50clR4RG9uZQkJPSAweDAwNDAsCisJSW50clR4SW50cgkJPSAweDAwODAsCisJSW50clR4RXJyCQk9IDB4MDEwMCwKKwlJbnRyVHhJZGxlCQk9IDB4MDIwMCwKKwlJbnRyVHhVbmRlcnJ1bgkJPSAweDA0MDAsCisJU3RhdHNNYXgJCT0gMHgwODAwLAorCVNXSW50CQkJPSAweDEwMDAsCisJV09MUGt0CQkJPSAweDIwMDAsCisJTGlua0NoYW5nZQkJPSAweDQwMDAsCisJSW50ckhpZ2hCaXRzCQk9IDB4ODAwMCwKKwlSeFN0YXR1c0ZJRk9PdmVyCT0gMHgxMDAwMCwKKwlJbnRyUENJRXJyCQk9IDB4ZjAwMDAwLAorCVJ4UmVzZXREb25lCQk9IDB4MTAwMDAwMCwKKwlUeFJlc2V0RG9uZQkJPSAweDIwMDAwMDAsCisJSW50ckFibm9ybWFsU3VtbWFyeQk9IDB4Q0QyMCwKK307CisKKy8qCisgKiBEZWZhdWx0IEludGVycnVwdHM6CisgKiBSeCBPSywgUnggUGFja2V0IEVycm9yLCBSeCBPdmVycnVuLAorICogVHggT0ssIFR4IFBhY2tldCBFcnJvciwgVHggVW5kZXJydW4sCisgKiBNSUIgU2VydmljZSwgUGh5IEludGVycnVwdCwgSGlnaCBCaXRzLAorICogUnggU3RhdHVzIEZJRk8gb3ZlcnJ1biwKKyAqIFJlY2VpdmVkIFRhcmdldCBBYm9ydCwgUmVjZWl2ZWQgTWFzdGVyIEFib3J0LAorICogU2lnbmFsbGVkIFN5c3RlbSBFcnJvciwgUmVjZWl2ZWQgUGFyaXR5IEVycm9yCisgKi8KKyNkZWZpbmUgREVGQVVMVF9JTlRSIDB4MDBmMWNkNjUKKworZW51bSBUeENvbmZpZ19iaXRzIHsKKwlUeERydGhNYXNrCQk9IDB4M2YsCisJVHhGbHRoTWFzawkJPSAweDNmMDAsCisJVHhNeGRtYU1hc2sJCT0gMHg3MDAwMDAsCisJVHhNeGRtYV81MTIJCT0gMHgwLAorCVR4TXhkbWFfNAkJPSAweDEwMDAwMCwKKwlUeE14ZG1hXzgJCT0gMHgyMDAwMDAsCisJVHhNeGRtYV8xNgkJPSAweDMwMDAwMCwKKwlUeE14ZG1hXzMyCQk9IDB4NDAwMDAwLAorCVR4TXhkbWFfNjQJCT0gMHg1MDAwMDAsCisJVHhNeGRtYV8xMjgJCT0gMHg2MDAwMDAsCisJVHhNeGRtYV8yNTYJCT0gMHg3MDAwMDAsCisJVHhDb2xsUmV0cnkJCT0gMHg4MDAwMDAsCisJVHhBdXRvUGFkCQk9IDB4MTAwMDAwMDAsCisJVHhNYWNMb29wCQk9IDB4MjAwMDAwMDAsCisJVHhIZWFydElnbgkJPSAweDQwMDAwMDAwLAorCVR4Q2FycmllcklnbgkJPSAweDgwMDAwMDAwCit9OworCisvKiAKKyAqIFR4IENvbmZpZ3VyYXRpb246CisgKiAtIDI1NiBieXRlIERNQSBidXJzdCBsZW5ndGgKKyAqIC0gZmlsbCB0aHJlc2hvbGQgNTEyIGJ5dGVzIChpLmUuIHJlc3RhcnQgRE1BIHdoZW4gNTEyIGJ5dGVzIGFyZSBmcmVlKQorICogLSA2NCBieXRlcyBpbml0aWFsIGRyYWluIHRocmVzaG9sZCAoaS5lLiBiZWdpbiBhY3R1YWwgdHJhbnNtaXNzaW9uCisgKiAgIHdoZW4gNjQgYnl0ZSBhcmUgaW4gdGhlIGZpZm8pCisgKiAtIG9uIHR4IHVuZGVycnVucywgaW5jcmVhc2UgZHJhaW4gdGhyZXNob2xkIGJ5IDY0LgorICogLSBhdCBtb3N0IHVzZSBhIGRyYWluIHRocmVzaG9sZCBvZiAxNDcyIGJ5dGVzOiBUaGUgc3VtIG9mIHRoZSBmaWxsCisgKiAgIHRocmVzaG9sZCBhbmQgdGhlIGRyYWluIHRocmVzaG9sZCBtdXN0IGJlIGxlc3MgdGhhbiAyMDE2IGJ5dGVzLgorICoKKyAqLworI2RlZmluZSBUWF9GTFRIX1ZBTAkJKCg1MTIvMzIpIDw8IDgpCisjZGVmaW5lIFRYX0RSVEhfVkFMX1NUQVJUCSg2NC8zMikKKyNkZWZpbmUgVFhfRFJUSF9WQUxfSU5DCQkyCisjZGVmaW5lIFRYX0RSVEhfVkFMX0xJTUlUCSgxNDcyLzMyKQorCitlbnVtIFJ4Q29uZmlnX2JpdHMgeworCVJ4RHJ0aE1hc2sJCT0gMHgzZSwKKwlSeE14ZG1hTWFzawkJPSAweDcwMDAwMCwKKwlSeE14ZG1hXzUxMgkJPSAweDAsCisJUnhNeGRtYV80CQk9IDB4MTAwMDAwLAorCVJ4TXhkbWFfOAkJPSAweDIwMDAwMCwKKwlSeE14ZG1hXzE2CQk9IDB4MzAwMDAwLAorCVJ4TXhkbWFfMzIJCT0gMHg0MDAwMDAsCisJUnhNeGRtYV82NAkJPSAweDUwMDAwMCwKKwlSeE14ZG1hXzEyOAkJPSAweDYwMDAwMCwKKwlSeE14ZG1hXzI1NgkJPSAweDcwMDAwMCwKKwlSeEFjY2VwdExvbmcJCT0gMHg4MDAwMDAwLAorCVJ4QWNjZXB0VHgJCT0gMHgxMDAwMDAwMCwKKwlSeEFjY2VwdFJ1bnQJCT0gMHg0MDAwMDAwMCwKKwlSeEFjY2VwdEVycgkJPSAweDgwMDAwMDAwCit9OworI2RlZmluZSBSWF9EUlRIX1ZBTAkJKDEyOC84KQorCitlbnVtIENsa1J1bl9iaXRzIHsKKwlQTUVFbmFibGUJCT0gMHgxMDAsCisJUE1FU3RhdHVzCQk9IDB4ODAwMCwKK307CisKK2VudW0gV29sQ21kX2JpdHMgeworCVdha2VQaHkJCQk9IDB4MSwKKwlXYWtlVW5pY2FzdAkJPSAweDIsCisJV2FrZU11bHRpY2FzdAkJPSAweDQsCisJV2FrZUJyb2FkY2FzdAkJPSAweDgsCisJV2FrZUFycAkJCT0gMHgxMCwKKwlXYWtlUE1hdGNoMAkJPSAweDIwLAorCVdha2VQTWF0Y2gxCQk9IDB4NDAsCisJV2FrZVBNYXRjaDIJCT0gMHg4MCwKKwlXYWtlUE1hdGNoMwkJPSAweDEwMCwKKwlXYWtlTWFnaWMJCT0gMHgyMDAsCisJV2FrZU1hZ2ljU2VjdXJlCQk9IDB4NDAwLAorCVNlY3VyZUhhY2sJCT0gMHgxMDAwMDAsCisJV29rZVBoeQkJCT0gMHg0MDAwMDAsCisJV29rZVVuaWNhc3QJCT0gMHg4MDAwMDAsCisJV29rZU11bHRpY2FzdAkJPSAweDEwMDAwMDAsCisJV29rZUJyb2FkY2FzdAkJPSAweDIwMDAwMDAsCisJV29rZUFycAkJCT0gMHg0MDAwMDAwLAorCVdva2VQTWF0Y2gwCQk9IDB4ODAwMDAwMCwKKwlXb2tlUE1hdGNoMQkJPSAweDEwMDAwMDAwLAorCVdva2VQTWF0Y2gyCQk9IDB4MjAwMDAwMDAsCisJV29rZVBNYXRjaDMJCT0gMHg0MDAwMDAwMCwKKwlXb2tlTWFnaWMJCT0gMHg4MDAwMDAwMCwKKwlXYWtlT3B0c1N1bW1hcnkJCT0gMHg3ZmYKK307CisKK2VudW0gUnhGaWx0ZXJBZGRyX2JpdHMgeworCVJGQ1JBZGRyZXNzTWFzawkJPSAweDNmZiwKKwlBY2NlcHRNdWx0aWNhc3QJCT0gMHgwMDIwMDAwMCwKKwlBY2NlcHRNeVBoeXMJCT0gMHgwODAwMDAwMCwKKwlBY2NlcHRBbGxQaHlzCQk9IDB4MTAwMDAwMDAsCisJQWNjZXB0QWxsTXVsdGljYXN0CT0gMHgyMDAwMDAwMCwKKwlBY2NlcHRCcm9hZGNhc3QJCT0gMHg0MDAwMDAwMCwKKwlSeEZpbHRlckVuYWJsZQkJPSAweDgwMDAwMDAwCit9OworCitlbnVtIFN0YXRzQ3RybF9iaXRzIHsKKwlTdGF0c1dhcm4JCT0gMHgxLAorCVN0YXRzRnJlZXplCQk9IDB4MiwKKwlTdGF0c0NsZWFyCQk9IDB4NCwKKwlTdGF0c1N0cm9iZQkJPSAweDgsCit9OworCitlbnVtIE1JbnRyQ3RybF9iaXRzIHsKKwlNSUNSSW50RW4JCT0gMHgyLAorfTsKKworZW51bSBQaHlDdHJsX2JpdHMgeworCVBoeUFkZHJNYXNrCQk9IDB4MWYsCit9OworCisjZGVmaW5lIFBIWV9BRERSX05PTkUJCTMyCisjZGVmaW5lIFBIWV9BRERSX0lOVEVSTkFMCTEKKworLyogdmFsdWVzIHdlIG1pZ2h0IGZpbmQgaW4gdGhlIHNpbGljb24gcmV2aXNpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1JSX0RQODM4MTVfQwkweDAzMDIKKyNkZWZpbmUgU1JSX0RQODM4MTVfRAkweDA0MDMKKyNkZWZpbmUgU1JSX0RQODM4MTZfQTQJMHgwNTA0CisjZGVmaW5lIFNSUl9EUDgzODE2X0E1CTB4MDUwNQorCisvKiBUaGUgUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KKy8qIE5vdGUgdGhhdCB1c2luZyBvbmx5IDMyIGJpdCBmaWVsZHMgc2ltcGxpZmllcyBjb252ZXJzaW9uIHRvIGJpZy1lbmRpYW4KKyAgIGFyY2hpdGVjdHVyZXMuICovCitzdHJ1Y3QgbmV0ZGV2X2Rlc2MgeworCXUzMiBuZXh0X2Rlc2M7CisJczMyIGNtZF9zdGF0dXM7CisJdTMyIGFkZHI7CisJdTMyIHNvZnR3YXJlX3VzZTsKK307CisKKy8qIEJpdHMgaW4gbmV0d29ya19kZXNjLnN0YXR1cyAqLworZW51bSBkZXNjX3N0YXR1c19iaXRzIHsKKwlEZXNjT3duPTB4ODAwMDAwMDAsIERlc2NNb3JlPTB4NDAwMDAwMDAsIERlc2NJbnRyPTB4MjAwMDAwMDAsCisJRGVzY05vQ1JDPTB4MTAwMDAwMDAsIERlc2NQa3RPSz0weDA4MDAwMDAwLAorCURlc2NTaXplTWFzaz0weGZmZiwKKworCURlc2NUeEFib3J0PTB4MDQwMDAwMDAsIERlc2NUeEZJRk89MHgwMjAwMDAwMCwKKwlEZXNjVHhDYXJyaWVyPTB4MDEwMDAwMDAsIERlc2NUeERlZmVyPTB4MDA4MDAwMDAsCisJRGVzY1R4RXhjRGVmZXI9MHgwMDQwMDAwMCwgRGVzY1R4T09XQ29sPTB4MDAyMDAwMDAsCisJRGVzY1R4RXhjQ29sbD0weDAwMTAwMDAwLCBEZXNjVHhDb2xsQ291bnQ9MHgwMDBmMDAwMCwKKworCURlc2NSeEFib3J0PTB4MDQwMDAwMDAsIERlc2NSeE92ZXI9MHgwMjAwMDAwMCwKKwlEZXNjUnhEZXN0PTB4MDE4MDAwMDAsIERlc2NSeExvbmc9MHgwMDQwMDAwMCwKKwlEZXNjUnhSdW50PTB4MDAyMDAwMDAsIERlc2NSeEludmFsaWQ9MHgwMDEwMDAwMCwKKwlEZXNjUnhDUkM9MHgwMDA4MDAwMCwgRGVzY1J4QWxpZ249MHgwMDA0MDAwMCwKKwlEZXNjUnhMb29wPTB4MDAwMjAwMDAsIERlc1J4Q29sbD0weDAwMDEwMDAwLAorfTsKKworc3RydWN0IG5ldGRldl9wcml2YXRlIHsKKwkvKiBEZXNjcmlwdG9yIHJpbmdzIGZpcnN0IGZvciBhbGlnbm1lbnQgKi8KKwlkbWFfYWRkcl90IHJpbmdfZG1hOworCXN0cnVjdCBuZXRkZXZfZGVzYyAqcnhfcmluZzsKKwlzdHJ1Y3QgbmV0ZGV2X2Rlc2MgKnR4X3Jpbmc7CisJLyogVGhlIGFkZHJlc3NlcyBvZiByZWNlaXZlLWluLXBsYWNlIHNrYnVmZnMgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJZG1hX2FkZHJfdCByeF9kbWFbUlhfUklOR19TSVpFXTsKKwkvKiBhZGRyZXNzIG9mIGEgc2VudC1pbi1wbGFjZSBwYWNrZXQvYnVmZmVyLCBmb3IgbGF0ZXIgZnJlZSgpICovCisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworCWRtYV9hZGRyX3QgdHhfZG1hW1RYX1JJTkdfU0laRV07CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJLyogTWVkaWEgbW9uaXRvcmluZyB0aW1lciAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCS8qIEZyZXF1ZW50bHkgdXNlZCB2YWx1ZXM6IGtlZXAgc29tZSBhZGphY2VudCBmb3IgY2FjaGUgZWZmZWN0ICovCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJc3RydWN0IG5ldGRldl9kZXNjICpyeF9oZWFkX2Rlc2M7CisJLyogUHJvZHVjZXIvY29uc3VtZXIgcmluZyBpbmRpY2VzICovCisJdW5zaWduZWQgaW50IGN1cl9yeCwgZGlydHlfcng7CisJdW5zaWduZWQgaW50IGN1cl90eCwgZGlydHlfdHg7CisJLyogQmFzZWQgb24gTVRVK3NsYWNrLiAqLworCXVuc2lnbmVkIGludCByeF9idWZfc3o7CisJaW50IG9vbTsKKwkvKiBEbyBub3QgdG91Y2ggdGhlIG5pYyByZWdpc3RlcnMgKi8KKwlpbnQgaGFuZHNfb2ZmOworCS8qIGV4dGVybmFsIHBoeSB0aGF0IGlzIHVzZWQ6IG9ubHkgdmFsaWQgaWYgZGV2LT5pZl9wb3J0ICE9IFBPUlRfVFAgKi8KKwlpbnQgbWlpOworCWludCBwaHlfYWRkcl9leHRlcm5hbDsKKwl1bnNpZ25lZCBpbnQgZnVsbF9kdXBsZXg7CisJLyogUnggZmlsdGVyICovCisJdTMyIGN1cl9yeF9tb2RlOworCXUzMiByeF9maWx0ZXJbMTZdOworCS8qIEZJRk8gYW5kIFBDSSBidXJzdCB0aHJlc2hvbGRzICovCisJdTMyIHR4X2NvbmZpZywgcnhfY29uZmlnOworCS8qIG9yaWdpbmFsIGNvbnRlbnRzIG9mIENsa1J1biByZWdpc3RlciAqLworCXUzMiBTYXZlZENsa1J1bjsKKwkvKiBzaWxpY29uIHJldmlzaW9uICovCisJdTMyIHNycjsKKwkvKiBleHBlY3RlZCBEU1BDRkcgdmFsdWUgKi8KKwl1MTYgZHNwY2ZnOworCS8qIHBhcm1zIHNhdmVkIGluIGV0aHRvb2wgZm9ybWF0ICovCisJdTE2CXNwZWVkOwkJLyogVGhlIGZvcmNlZCBzcGVlZCwgMTBNYiwgMTAwTWIsIGdpZ2FiaXQgKi8KKwl1OAlkdXBsZXg7CQkvKiBEdXBsZXgsIGhhbGYgb3IgZnVsbCAqLworCXU4CWF1dG9uZWc7CS8qIEF1dG9uZWdvdGlhdGlvbiBlbmFibGVkICovCisJLyogTUlJIHRyYW5zY2VpdmVyIHNlY3Rpb24gKi8KKwl1MTYgYWR2ZXJ0aXNpbmc7CisJdW5zaWduZWQgaW50IGlvc2l6ZTsKKwlzcGlubG9ja190IGxvY2s7CisJdTMyIG1zZ19lbmFibGU7Cit9OworCitzdGF0aWMgdm9pZCBtb3ZlX2ludF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFkZHIpOworc3RhdGljIGludCBlZXByb21fcmVhZCh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWcpOworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVnLCB1MTYgZGF0YSk7CitzdGF0aWMgdm9pZCBpbml0X3BoeV9maXh1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWlpcG9ydF9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCByZWcpOworc3RhdGljIHZvaWQgbWlpcG9ydF93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnLCB1MTYgZGF0YSk7CitzdGF0aWMgaW50IGZpbmRfbWlpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmF0c2VtaV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5hdHNlbWlfcmVsb2FkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5hdHNlbWlfc3RvcF9yeHR4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRvX2NhYmxlX21hZ2ljKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdW5kb19jYWJsZV9tYWdpYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNoZWNrX2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBuZXRkZXZfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGR1bXBfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGFsbG9jX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByZWZpbGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBkcmFpbl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRyYWluX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBmcmVlX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByZWluaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGluaXRfcmVnaXN0ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBuZXRkZXZfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIG5ldGRldl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5ldGRldl90eF9kb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuYXRzZW1pX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBuYXRzZW1pX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorc3RhdGljIHZvaWQgX19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgX19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0ZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIGludCBuZXRkZXZfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgbmV3dmFsKTsKK3N0YXRpYyBpbnQgbmV0ZGV2X2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyICpzdXBwb3J0ZWQsIHUzMiAqY3VyKTsKK3N0YXRpYyBpbnQgbmV0ZGV2X3NldF9zb3Bhc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKm5ld3ZhbCk7CitzdGF0aWMgaW50IG5ldGRldl9nZXRfc29wYXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpkYXRhKTsKK3N0YXRpYyBpbnQgbmV0ZGV2X2dldF9lY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCk7CitzdGF0aWMgaW50IG5ldGRldl9zZXRfZWNtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpOworc3RhdGljIHZvaWQgZW5hYmxlX3dvbF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBlbmFibGVfaW50cik7CitzdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0ZGV2X2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpidWYpOworc3RhdGljIGludCBuZXRkZXZfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqYnVmKTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHM7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpuc19pb2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSBkZXYtPmJhc2VfYWRkcjsKK30KKworc3RhdGljIHZvaWQgbW92ZV9pbnRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhZGRyKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisJaW50IHRhcmdldCA9IDMxOworCisJLyogCisJICogVGhlIGludGVybmFsIHBoeSBpcyB2aXNpYmxlIG9uIHRoZSBleHRlcm5hbCBtaWkgYnVzLiBUaGVyZWZvcmUgd2UgbXVzdAorCSAqIG1vdmUgaXQgYXdheSBiZWZvcmUgd2UgY2FuIHNlbmQgY29tbWFuZHMgdG8gYW4gZXh0ZXJuYWwgcGh5LgorCSAqIFRoZXJlIGFyZSB0d28gYWRkcmVzc2VzIHdlIG11c3QgYXZvaWQ6CisJICogLSB0aGUgYWRkcmVzcyBvbiB0aGUgZXh0ZXJuYWwgcGh5IHRoYXQgaXMgdXNlZCBmb3IgdHJhbnNtaXNzaW9uLgorCSAqIC0gdGhlIGFkZHJlc3MgdGhhdCB3ZSB3YW50IHRvIGFjY2Vzcy4gVXNlciBzcGFjZSBjYW4gYWNjZXNzIHBoeXMKKwkgKiAgIG9uIHRoZSBtaWkgYnVzIHdpdGggU0lPQ0dNSUlSRUcvU0lPQ1NNSUlSRUcsIGluZGVwZW5kYW50IGZyb20gdGhlCisJICogICBwaHkgdGhhdCBpcyB1c2VkIGZvciB0cmFuc21pc3Npb24uCisJICovCisKKwlpZiAodGFyZ2V0ID09IGFkZHIpCisJCXRhcmdldC0tOworCWlmICh0YXJnZXQgPT0gbnAtPnBoeV9hZGRyX2V4dGVybmFsKQorCQl0YXJnZXQtLTsKKwl3cml0ZXcodGFyZ2V0LCBpb2FkZHIgKyBQaHlDdHJsKTsKKwlyZWFkdyhpb2FkZHIgKyBQaHlDdHJsKTsKKwl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG5hdHNlbWlfcHJvYmUxIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucDsKKwlpbnQgaSwgb3B0aW9uLCBpcnEsIGNoaXBfaWR4ID0gZW50LT5kcml2ZXJfZGF0YTsKKwlzdGF0aWMgaW50IGZpbmRfY250ID0gLTE7CisJdW5zaWduZWQgbG9uZyBpb3N0YXJ0LCBpb3NpemU7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJY29uc3QgaW50IHBjaWJhciA9IDE7IC8qIFBDSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwlpbnQgcHJldl9lZWRhdGE7CisJdTMyIHRtcDsKKworLyogd2hlbiBidWlsdCBpbnRvIHRoZSBrZXJuZWwsIHdlIG9ubHkgcHJpbnQgdmVyc2lvbiBpZiBkZXZpY2UgaXMgZm91bmQgKi8KKyNpZm5kZWYgTU9EVUxFCisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisKKwlpID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGkpIHJldHVybiBpOworCisJLyogbmF0c2VtaSBoYXMgYSBub24tc3RhbmRhcmQgUE0gY29udHJvbCByZWdpc3RlcgorCSAqIGluIFBDSSBjb25maWcgc3BhY2UuICBTb21lIGJvYXJkcyBhcHBhcmVudGx5IG5lZWQKKwkgKiB0byBiZSBicm91Z2h0IHRvIEQwIGluIHRoaXMgbWFubmVyLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lQTSwgJnRtcCk7CisJaWYgKHRtcCAmIFBDSV9QTV9DVFJMX1NUQVRFX01BU0spIHsKKwkJLyogRDAgc3RhdGUsIGRpc2FibGUgUE1FIGFzc2VydGlvbiAqLworCQl1MzIgbmV3dG1wID0gdG1wICYgflBDSV9QTV9DVFJMX1NUQVRFX01BU0s7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUENJUE0sIG5ld3RtcCk7CisJfQorCisJZmluZF9jbnQrKzsKKwlpb3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIHBjaWJhcik7CisJaW9zaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBwY2liYXIpOworCWlycSA9IHBkZXYtPmlycTsKKworCWlmIChuYXRzZW1pX3BjaV9pbmZvW2NoaXBfaWR4XS5mbGFncyAmIFBDSV9VU0VTX01BU1RFUikKKwkJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YgKHN0cnVjdCBuZXRkZXZfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWkgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAoaSkKKwkJZ290byBlcnJfcGNpX3JlcXVlc3RfcmVnaW9uczsKKworCWlvYWRkciA9IGlvcmVtYXAoaW9zdGFydCwgaW9zaXplKTsKKwlpZiAoIWlvYWRkcikgeworCQlpID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW9yZW1hcDsKKwl9CisKKwkvKiBXb3JrIGFyb3VuZCB0aGUgZHJvcHBlZCBzZXJpYWwgYml0LiAqLworCXByZXZfZWVkYXRhID0gZWVwcm9tX3JlYWQoaW9hZGRyLCA2KTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWludCBlZWRhdGEgPSBlZXByb21fcmVhZChpb2FkZHIsIGkgKyA3KTsKKwkJZGV2LT5kZXZfYWRkcltpKjJdID0gKGVlZGF0YSA8PCAxKSArIChwcmV2X2VlZGF0YSA+PiAxNSk7CisJCWRldi0+ZGV2X2FkZHJbaSoyKzFdID0gZWVkYXRhID4+IDc7CisJCXByZXZfZWVkYXRhID0gZWVkYXRhOworCX0KKworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcgX19mb3JjZSkgaW9hZGRyOworCWRldi0+aXJxID0gaXJxOworCisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbnAtPnBjaV9kZXYgPSBwZGV2OworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCW5wLT5pb3NpemUgPSBpb3NpemU7CisJc3Bpbl9sb2NrX2luaXQoJm5wLT5sb2NrKTsKKwlucC0+bXNnX2VuYWJsZSA9IChkZWJ1ZyA+PSAwKSA/ICgxPDxkZWJ1ZyktMSA6IE5BVFNFTUlfREVGX01TRzsKKwlucC0+aGFuZHNfb2ZmID0gMDsKKworCS8qIEluaXRpYWwgcG9ydDoKKwkgKiAtIElmIHRoZSBuaWMgd2FzIGNvbmZpZ3VyZWQgdG8gdXNlIGFuIGV4dGVybmFsIHBoeSBhbmQgaWYgZmluZF9taWkKKwkgKiAgIGZpbmRzIGEgcGh5OiB1c2UgZXh0ZXJuYWwgcG9ydCwgZmlyc3QgcGh5IHRoYXQgcmVwbGllcy4KKwkgKiAtIE90aGVyd2lzZTogaW50ZXJuYWwgcG9ydC4KKwkgKiBOb3RlIHRoYXQgdGhlIHBoeSBhZGRyZXNzIGZvciB0aGUgaW50ZXJuYWwgcGh5IGRvZXNuJ3QgbWF0dGVyOgorCSAqIFRoZSBhZGRyZXNzIHdvdWxkIGJlIHVzZWQgdG8gYWNjZXNzIGEgcGh5IG92ZXIgdGhlIG1paSBidXMsIGJ1dAorCSAqIHRoZSBpbnRlcm5hbCBwaHkgaXMgYWNjZXNzZWQgdGhyb3VnaCBtYXBwZWQgcmVnaXN0ZXJzLgorCSAqLworCWlmIChyZWFkbChpb2FkZHIgKyBDaGlwQ29uZmlnKSAmIENmZ0V4dFBoeSkKKwkJZGV2LT5pZl9wb3J0ID0gUE9SVF9NSUk7CisJZWxzZQorCQlkZXYtPmlmX3BvcnQgPSBQT1JUX1RQOworCS8qIFJlc2V0IHRoZSBjaGlwIHRvIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24uICovCisJbmF0c2VtaV9yZWxvYWRfZWVwcm9tKGRldik7CisJbmF0c2VtaV9yZXNldChkZXYpOworCisJaWYgKGRldi0+aWZfcG9ydCAhPSBQT1JUX1RQKSB7CisJCW5wLT5waHlfYWRkcl9leHRlcm5hbCA9IGZpbmRfbWlpKGRldik7CisJCWlmIChucC0+cGh5X2FkZHJfZXh0ZXJuYWwgPT0gUEhZX0FERFJfTk9ORSkgeworCQkJZGV2LT5pZl9wb3J0ID0gUE9SVF9UUDsKKwkJCW5wLT5waHlfYWRkcl9leHRlcm5hbCA9IFBIWV9BRERSX0lOVEVSTkFMOworCQl9CisJfSBlbHNlIHsKKwkJbnAtPnBoeV9hZGRyX2V4dGVybmFsID0gUEhZX0FERFJfSU5URVJOQUw7CisJfQorCisJb3B0aW9uID0gZmluZF9jbnQgPCBNQVhfVU5JVFMgPyBvcHRpb25zW2ZpbmRfY250XSA6IDA7CisJaWYgKGRldi0+bWVtX3N0YXJ0KQorCQlvcHRpb24gPSBkZXYtPm1lbV9zdGFydDsKKworCS8qIFRoZSBsb3dlciBmb3VyIGJpdHMgYXJlIHRoZSBtZWRpYSB0eXBlLiAqLworCWlmIChvcHRpb24pIHsKKwkJaWYgKG9wdGlvbiAmIDB4MjAwKQorCQkJbnAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJaWYgKG9wdGlvbiAmIDE1KQorCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJuYXRzZW1pICVzOiBpZ25vcmluZyB1c2VyIHN1cHBsaWVkIG1lZGlhIHR5cGUgJWQiLAorCQkJCXBjaV9uYW1lKG5wLT5wY2lfZGV2KSwgb3B0aW9uICYgMTUpOworCX0KKwlpZiAoZmluZF9jbnQgPCBNQVhfVU5JVFMgICYmICBmdWxsX2R1cGxleFtmaW5kX2NudF0pCisJCW5wLT5mdWxsX2R1cGxleCA9IDE7CisKKwkvKiBUaGUgY2hpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZuZXRkZXZfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzdGFydF90eDsKKwlkZXYtPnN0b3AgPSAmbmV0ZGV2X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJmdldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKwlkZXYtPmNoYW5nZV9tdHUgPSAmbmF0c2VtaV9jaGFuZ2VfbXR1OworCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOworCWRldi0+dHhfdGltZW91dCA9ICZ0eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmbmF0c2VtaV9wb2xsX2NvbnRyb2xsZXI7CisjZW5kaWYKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOworCisJaWYgKG10dSkKKwkJZGV2LT5tdHUgPSBtdHU7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJLyogZ2V0IHRoZSBpbml0aWFsIHNldHRpbmdzIGZyb20gaGFyZHdhcmUgKi8KKwl0bXAgICAgICAgICAgICA9IG1kaW9fcmVhZChkZXYsIE1JSV9CTUNSKTsKKwlucC0+c3BlZWQgICAgICA9ICh0bXAgJiBCTUNSX1NQRUVEMTAwKT8gU1BFRURfMTAwICAgICA6IFNQRUVEXzEwOworCW5wLT5kdXBsZXggICAgID0gKHRtcCAmIEJNQ1JfRlVMTERQTFgpPyBEVVBMRVhfRlVMTCAgIDogRFVQTEVYX0hBTEY7CisJbnAtPmF1dG9uZWcgICAgPSAodG1wICYgQk1DUl9BTkVOQUJMRSk/IEFVVE9ORUdfRU5BQkxFOiBBVVRPTkVHX0RJU0FCTEU7CisJbnAtPmFkdmVydGlzaW5nPSBtZGlvX3JlYWQoZGV2LCBNSUlfQURWRVJUSVNFKTsKKworCWlmICgobnAtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFX0FMTCkgIT0gQURWRVJUSVNFX0FMTAorCSAmJiBuZXRpZl9tc2dfcHJvYmUobnApKSB7CisJCXByaW50ayhLRVJOX0lORk8gIm5hdHNlbWkgJXM6IFRyYW5zY2VpdmVyIGRlZmF1bHQgYXV0b25lZ290aWF0aW9uICVzICIKKwkJCSIxMCVzICVzIGR1cGxleC5cbiIsCisJCQlwY2lfbmFtZShucC0+cGNpX2RldiksCisJCQkobWRpb19yZWFkKGRldiwgTUlJX0JNQ1IpICYgQk1DUl9BTkVOQUJMRSk/CisJCQkgICJlbmFibGVkLCBhZHZlcnRpc2UiIDogImRpc2FibGVkLCBmb3JjZSIsCisJCQkobnAtPmFkdmVydGlzaW5nICYKKwkJCSAgKEFEVkVSVElTRV8xMDBGVUxMfEFEVkVSVElTRV8xMDBIQUxGKSk/CisJCQkgICAgIjAiIDogIiIsCisJCQkobnAtPmFkdmVydGlzaW5nICYKKwkJCSAgKEFEVkVSVElTRV8xMDBGVUxMfEFEVkVSVElTRV8xMEZVTEwpKT8KKwkJCSAgICAiZnVsbCIgOiAiaGFsZiIpOworCX0KKwlpZiAobmV0aWZfbXNnX3Byb2JlKG5wKSkKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIm5hdHNlbWkgJXM6IFRyYW5zY2VpdmVyIHN0YXR1cyAlIzA0eCBhZHZlcnRpc2luZyAlIzA0eC5cbiIsCisJCQlwY2lfbmFtZShucC0+cGNpX2RldiksIG1kaW9fcmVhZChkZXYsIE1JSV9CTVNSKSwKKwkJCW5wLT5hZHZlcnRpc2luZyk7CisKKwkvKiBzYXZlIHRoZSBzaWxpY29uIHJldmlzaW9uIGZvciBsYXRlciBxdWVyeWluZyAqLworCW5wLT5zcnIgPSByZWFkbChpb2FkZHIgKyBTaWxpY29uUmV2KTsKKwlpZiAobmV0aWZfbXNnX2h3KG5wKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAibmF0c2VtaSAlczogc2lsaWNvbiByZXZpc2lvbiAlIzA0eC5cbiIsCisJCQkJcGNpX25hbWUobnAtPnBjaV9kZXYpLCBucC0+c3JyKTsKKworCWkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoaSkKKwkJZ290byBlcnJfcmVnaXN0ZXJfbmV0ZGV2OworCisJaWYgKG5ldGlmX21zZ19kcnYobnApKSB7CisJCXByaW50ayhLRVJOX0lORk8gIm5hdHNlbWkgJXM6ICVzIGF0ICUjMDhseCAoJXMpLCAiLAorCQkJZGV2LT5uYW1lLCBuYXRzZW1pX3BjaV9pbmZvW2NoaXBfaWR4XS5uYW1lLCBpb3N0YXJ0LAorCQkJcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOLTE7IGkrKykKKwkJCQlwcmludGsoIiUwMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJCXByaW50aygiJTAyeCwgSVJRICVkIiwgZGV2LT5kZXZfYWRkcltpXSwgaXJxKTsKKwkJaWYgKGRldi0+aWZfcG9ydCA9PSBQT1JUX1RQKQorCQkJcHJpbnRrKCIsIHBvcnQgVFAuXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIsIHBvcnQgTUlJLCBwaHkgYWQgJWQuXG4iLCBucC0+cGh5X2FkZHJfZXh0ZXJuYWwpOworCX0KKwlyZXR1cm4gMDsKKworIGVycl9yZWdpc3Rlcl9uZXRkZXY6CisJaW91bm1hcChpb2FkZHIpOworCisgZXJyX2lvcmVtYXA6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKyBlcnJfcGNpX3JlcXVlc3RfcmVnaW9uczoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBpOworfQorCisKKy8qIFJlYWQgdGhlIEVFUFJPTSBhbmQgTUlJIE1hbmFnZW1lbnQgRGF0YSBJL08gKE1ESU8pIGludGVyZmFjZXMuCisgICBUaGUgRUVQUk9NIGNvZGUgaXMgZm9yIHRoZSBjb21tb24gOTNjMDYvNDYgRUVQUk9NcyB3aXRoIDYgYml0IGFkZHJlc3Nlcy4gKi8KKworLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuCisgICBObyBleHRyYSBkZWxheSBpcyBuZWVkZWQgd2l0aCAzM01oeiBQQ0ksIGJ1dCBmdXR1cmUgNjZNaHogYWNjZXNzIG1heSBuZWVkCisgICBhIGRlbGF5LiAgTm90ZSB0aGF0IHByZS0yLjAuMzQga2VybmVscyBoYWQgYSBjYWNoZS1hbGlnbm1lbnQgYnVnIHRoYXQKKyAgIG1hZGUgdWRlbGF5KCkgdW5yZWxpYWJsZS4KKyAgIFRoZSBvbGQgbWV0aG9kIG9mIHVzaW5nIGFuIElTQSBhY2Nlc3MgYXMgYSBkZWxheSwgX19TTE9XX0RPV05fSU9fXywgaXMKKyAgIGRlcHJpY2F0ZWQuCisqLworI2RlZmluZSBlZXByb21fZGVsYXkoZWVfYWRkcikJcmVhZGwoZWVfYWRkcikKKworI2RlZmluZSBFRV9Xcml0ZTAgKEVFX0NoaXBTZWxlY3QpCisjZGVmaW5lIEVFX1dyaXRlMSAoRUVfQ2hpcFNlbGVjdCB8IEVFX0RhdGFJbikKKworLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCitlbnVtIEVFUFJPTV9DbWRzIHsKKwlFRV9Xcml0ZUNtZD0oNSA8PCA2KSwgRUVfUmVhZENtZD0oNiA8PCA2KSwgRUVfRXJhc2VDbWQ9KDcgPDwgNiksCit9OworCitzdGF0aWMgaW50IGVlcHJvbV9yZWFkKHZvaWQgX19pb21lbSAqYWRkciwgaW50IGxvY2F0aW9uKQoreworCWludCBpOworCWludCByZXR2YWwgPSAwOworCXZvaWQgX19pb21lbSAqZWVfYWRkciA9IGFkZHIgKyBFRUN0cmw7CisJaW50IHJlYWRfY21kID0gbG9jYXRpb24gfCBFRV9SZWFkQ21kOworCisJd3JpdGVsKEVFX1dyaXRlMCwgZWVfYWRkcik7CisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDEwOyBpID49IDA7IGktLSkgeworCQlzaG9ydCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfV3JpdGUxIDogRUVfV3JpdGUwOworCQl3cml0ZWwoZGF0YXZhbCwgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKKwkJd3JpdGVsKGRhdGF2YWwgfCBFRV9TaGlmdENsaywgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKKwl9CisJd3JpdGVsKEVFX0NoaXBTZWxlY3QsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXdyaXRlbChFRV9DaGlwU2VsZWN0IHwgRUVfU2hpZnRDbGssIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoZWVfYWRkcik7CisJCXJldHZhbCB8PSAocmVhZGwoZWVfYWRkcikgJiBFRV9EYXRhT3V0KSA/IDEgPDwgaSA6IDA7CisJCXdyaXRlbChFRV9DaGlwU2VsZWN0LCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKwl3cml0ZWwoRUVfV3JpdGUwLCBlZV9hZGRyKTsKKwl3cml0ZWwoMCwgZWVfYWRkcik7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogTUlJIHRyYW5zY2VpdmVyIGNvbnRyb2wgc2VjdGlvbi4KKyAqIFRoZSA4MzgxNSBzZXJpZXMgaGFzIGFuIGludGVybmFsIHRyYW5zY2VpdmVyLCBhbmQgd2UgcHJlc2VudCB0aGUKKyAqIGludGVybmFsIG1hbmFnZW1lbnQgcmVnaXN0ZXJzIGFzIGlmIHRoZXkgd2VyZSBNSUkgY29ubmVjdGVkLgorICogRXh0ZXJuYWwgUGh5IHJlZ2lzdGVycyBhcmUgcmVmZXJlbmNlZCB0aHJvdWdoIHRoZSBNSUkgaW50ZXJmYWNlLgorICovCisKKy8qIGNsb2NrIHRyYW5zaXRpb25zID49IDIwbnMgKDI1TUh6KQorICogT25lIHJlYWRsIHNob3VsZCBiZSBnb29kIHRvIFBDSSBAIDEwME1IegorICovCisjZGVmaW5lIG1paV9kZWxheShpb2FkZHIpICByZWFkbChpb2FkZHIgKyBFRUN0cmwpCisKK3N0YXRpYyBpbnQgbWlpX2dldGJpdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgZGF0YTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCisJd3JpdGVsKE1JSV9TaGlmdENsaywgaW9hZGRyICsgRUVDdHJsKTsKKwlkYXRhID0gcmVhZGwoaW9hZGRyICsgRUVDdHJsKTsKKwl3cml0ZWwoMCwgaW9hZGRyICsgRUVDdHJsKTsKKwltaWlfZGVsYXkoaW9hZGRyKTsKKwlyZXR1cm4gKGRhdGEgJiBNSUlfRGF0YSk/IDEgOiAwOworfQorCitzdGF0aWMgdm9pZCBtaWlfc2VuZF9iaXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSwgaW50IGxlbikKK3sKKwl1MzIgaTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCisJZm9yIChpID0gKDEgPDwgKGxlbi0xKSk7IGk7IGkgPj49IDEpCisJeworCQl1MzIgbWRpb192YWwgPSBNSUlfV3JpdGUgfCAoKGRhdGEgJiBpKT8gTUlJX0RhdGEgOiAwKTsKKwkJd3JpdGVsKG1kaW9fdmFsLCBpb2FkZHIgKyBFRUN0cmwpOworCQltaWlfZGVsYXkoaW9hZGRyKTsKKwkJd3JpdGVsKG1kaW9fdmFsIHwgTUlJX1NoaWZ0Q2xrLCBpb2FkZHIgKyBFRUN0cmwpOworCQltaWlfZGVsYXkoaW9hZGRyKTsKKwl9CisJd3JpdGVsKDAsIGlvYWRkciArIEVFQ3RybCk7CisJbWlpX2RlbGF5KGlvYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgbWlpcG9ydF9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCByZWcpCit7CisJdTMyIGNtZDsKKwlpbnQgaTsKKwl1MzIgcmV0dmFsID0gMDsKKworCS8qIEVuc3VyZSBzeW5jICovCisJbWlpX3NlbmRfYml0cyAoZGV2LCAweGZmZmZmZmZmLCAzMik7CisJLyogU1QoMiksIE9QKDIpLCBBRERSKDUpLCBSRUcjKDUpLCBUQSgyKSwgRGF0YSgxNikgdG90YWwgMzIgYml0cyAqLworCS8qIFNULE9QID0gMDExMCdiIGZvciByZWFkIG9wZXJhdGlvbiAqLworCWNtZCA9ICgweDA2IDw8IDEwKSB8IChwaHlfaWQgPDwgNSkgfCByZWc7CisJbWlpX3NlbmRfYml0cyAoZGV2LCBjbWQsIDE0KTsKKwkvKiBUdXJuYXJvdW5kICovCisJaWYgKG1paV9nZXRiaXQgKGRldikpCisJCXJldHVybiAwOworCS8qIFJlYWQgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXJldHZhbCA8PD0gMTsKKwkJcmV0dmFsIHw9IG1paV9nZXRiaXQgKGRldik7CisJfQorCS8qIEVuZCBjeWNsZSAqLworCW1paV9nZXRiaXQgKGRldik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgbWlpcG9ydF93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnLCB1MTYgZGF0YSkKK3sKKwl1MzIgY21kOworCisJLyogRW5zdXJlIHN5bmMgKi8KKwltaWlfc2VuZF9iaXRzIChkZXYsIDB4ZmZmZmZmZmYsIDMyKTsKKwkvKiBTVCgyKSwgT1AoMiksIEFERFIoNSksIFJFRyMoNSksIFRBKDIpLCBEYXRhKDE2KSB0b3RhbCAzMiBiaXRzICovCisJLyogU1QsT1AsQUFBQUEsUlJSUlIsVEEgPSAwMTAxeHh4eHh4eHh4eDEwJ2IgPSAweDUwMDIgZm9yIHdyaXRlICovCisJY21kID0gKDB4NTAwMiA8PCAxNikgfCAocGh5X2lkIDw8IDIzKSB8IChyZWcgPDwgMTgpIHwgZGF0YTsKKwltaWlfc2VuZF9iaXRzIChkZXYsIGNtZCwgMzIpOworCS8qIEVuZCBjeWNsZSAqLworCW1paV9nZXRiaXQgKGRldik7Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWcpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKworCS8qIFRoZSA4MzgxNSBzZXJpZXMgaGFzIHR3byBwb3J0czoKKwkgKiAtIGFuIGludGVybmFsIHRyYW5zY2VpdmVyCisJICogLSBhbiBleHRlcm5hbCBtaWkgYnVzCisJICovCisJaWYgKGRldi0+aWZfcG9ydCA9PSBQT1JUX1RQKQorCQlyZXR1cm4gcmVhZHcoaW9hZGRyK0Jhc2ljQ29udHJvbCsocmVnPDwyKSk7CisJZWxzZQorCQlyZXR1cm4gbWlpcG9ydF9yZWFkKGRldiwgbnAtPnBoeV9hZGRyX2V4dGVybmFsLCByZWcpOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWcsIHUxNiBkYXRhKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisKKwkvKiBUaGUgODM4MTUgc2VyaWVzIGhhcyBhbiBpbnRlcm5hbCB0cmFuc2NlaXZlcjsgaGFuZGxlIHNlcGFyYXRlbHkgKi8KKwlpZiAoZGV2LT5pZl9wb3J0ID09IFBPUlRfVFApCisJCXdyaXRldyhkYXRhLCBpb2FkZHIrQmFzaWNDb250cm9sKyhyZWc8PDIpKTsKKwllbHNlCisJCW1paXBvcnRfd3JpdGUoZGV2LCBucC0+cGh5X2FkZHJfZXh0ZXJuYWwsIHJlZywgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcGh5X2ZpeHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKwlpbnQgaTsKKwl1MzIgY2ZnOworCXUxNiB0bXA7CisKKwkvKiByZXN0b3JlIHN0dWZmIGxvc3Qgd2hlbiBwb3dlciB3YXMgb3V0ICovCisJdG1wID0gbWRpb19yZWFkKGRldiwgTUlJX0JNQ1IpOworCWlmIChucC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkvKiByZW5lZ290aWF0ZSBpZiBzb21ldGhpbmcgY2hhbmdlZCAqLworCQlpZiAoKHRtcCAmIEJNQ1JfQU5FTkFCTEUpID09IDAKKwkJIHx8IG5wLT5hZHZlcnRpc2luZyAhPSBtZGlvX3JlYWQoZGV2LCBNSUlfQURWRVJUSVNFKSkKKwkJeworCQkJLyogdHVybiBvbiBhdXRvbmVnb3RpYXRpb24gYW5kIGZvcmNlIG5lZ290aWF0aW9uICovCisJCQl0bXAgfD0gKEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJCQltZGlvX3dyaXRlKGRldiwgTUlJX0FEVkVSVElTRSwgbnAtPmFkdmVydGlzaW5nKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHR1cm4gb2ZmIGF1dG8gbmVnb3RpYXRpb24sIHNldCBzcGVlZCBhbmQgZHVwbGV4aXR5ICovCisJCXRtcCAmPSB+KEJNQ1JfQU5FTkFCTEUgfCBCTUNSX1NQRUVEMTAwIHwgQk1DUl9GVUxMRFBMWCk7CisJCWlmIChucC0+c3BlZWQgPT0gU1BFRURfMTAwKQorCQkJdG1wIHw9IEJNQ1JfU1BFRUQxMDA7CisJCWlmIChucC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJdG1wIHw9IEJNQ1JfRlVMTERQTFg7CisJCS8qIAorCQkgKiBOb3RlOiB0aGVyZSBpcyBubyBnb29kIHdheSB0byBpbmZvcm0gdGhlIGxpbmsgcGFydG5lcgorCQkgKiB0aGF0IG91ciBjYXBhYmlsaXRpZXMgY2hhbmdlZC4gVGhlIHVzZXIgaGFzIHRvIHVucGx1ZworCQkgKiBhbmQgcmVwbHVnIHRoZSBuZXR3b3JrIGNhYmxlIGFmdGVyIHNvbWUgY2hhbmdlcywgZS5nLgorCQkgKiBhZnRlciBzd2l0Y2hpbmcgZnJvbSAxMEhELCBhdXRvbmVnIG9mZiB0byAxMDAgSEQsCisJCSAqIGF1dG9uZWcgb2ZmLgorCQkgKi8KKwl9CisJbWRpb193cml0ZShkZXYsIE1JSV9CTUNSLCB0bXApOworCXJlYWRsKGlvYWRkciArIENoaXBDb25maWcpOworCXVkZWxheSgxKTsKKworCS8qIGZpbmQgb3V0IHdoYXQgcGh5IHRoaXMgaXMgKi8KKwlucC0+bWlpID0gKG1kaW9fcmVhZChkZXYsIE1JSV9QSFlTSUQxKSA8PCAxNikKKwkJCQkrIG1kaW9fcmVhZChkZXYsIE1JSV9QSFlTSUQyKTsKKworCS8qIGhhbmRsZSBleHRlcm5hbCBwaHlzIGhlcmUgKi8KKwlzd2l0Y2ggKG5wLT5taWkpIHsKKwljYXNlIFBIWUlEX0FNNzlDODc0OgorCQkvKiBwaHkgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgZmlicmUvdHAgb3BlcmF0aW9uICovCisJCXRtcCA9IG1kaW9fcmVhZChkZXYsIE1JSV9NQ1RSTCk7CisJCXRtcCAmPSB+KE1JSV9GWF9TRUwgfCBNSUlfRU5fU0NSTSk7CisJCWlmIChkZXYtPmlmX3BvcnQgPT0gUE9SVF9GSUJSRSkKKwkJCXRtcCB8PSBNSUlfRlhfU0VMOworCQllbHNlCisJCQl0bXAgfD0gTUlJX0VOX1NDUk07CisJCW1kaW9fd3JpdGUoZGV2LCBNSUlfTUNUUkwsIHRtcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwljZmcgPSByZWFkbChpb2FkZHIgKyBDaGlwQ29uZmlnKTsKKwlpZiAoY2ZnICYgQ2ZnRXh0UGh5KQorCQlyZXR1cm47CisKKwkvKiBPbiBwYWdlIDc4IG9mIHRoZSBzcGVjLCB0aGV5IHJlY29tbWVuZCBzb21lIHNldHRpbmdzIGZvciAib3B0aW11bQorCSAgIHBlcmZvcm1hbmNlIiB0byBiZSBkb25lIGluIHNlcXVlbmNlLiAgVGhlc2Ugc2V0dGluZ3Mgb3B0aW1pemUgc29tZQorCSAgIG9mIHRoZSAxMDBNYml0IGF1dG9kZXRlY3Rpb24gY2lyY3VpdHJ5LiAgVGhleSBzYXkgd2Ugb25seSB3YW50IHRvCisJICAgZG8gdGhpcyBmb3IgcmV2IEMgb2YgdGhlIGNoaXAsIGJ1dCBlbmdpbmVlcnMgYXQgTlNDIChCcmFkbGV5CisJICAgS2VubmVkeSkgcmVjb21tZW5kcyBhbHdheXMgc2V0dGluZyB0aGVtLiAgSWYgeW91IGRvbid0LCB5b3UgZ2V0CisJICAgZXJyb3JzIG9uIHNvbWUgYXV0b25lZ290aWF0aW9ucyB0aGF0IG1ha2UgdGhlIGRldmljZSB1bnVzYWJsZS4KKworCSAgIEl0IHNlZW1zIHRoYXQgdGhlIERTUCBuZWVkcyBhIGZldyB1c2VjIHRvIHJlaW5pdGlhbGl6ZSBhZnRlcgorCSAgIHRoZSBzdGFydCBvZiB0aGUgcGh5LiBKdXN0IHJldHJ5IHdyaXRpbmcgdGhlc2UgdmFsdWVzIHVudGlsIHRoZXkKKwkgICBzdGljay4KKwkqLworCWZvciAoaT0wO2k8TkFUU0VNSV9IV19USU1FT1VUO2krKykgeworCisJCWludCBkc3BjZmc7CisJCXdyaXRldygxLCBpb2FkZHIgKyBQR1NFTCk7CisJCXdyaXRldyhQTURDU1JfVkFMLCBpb2FkZHIgKyBQTURDU1IpOworCQl3cml0ZXcoVFNUREFUX1ZBTCwgaW9hZGRyICsgVFNUREFUKTsKKwkJbnAtPmRzcGNmZyA9IChucC0+c3JyIDw9IFNSUl9EUDgzODE1X0MpPworCQkJRFNQQ0ZHX1ZBTCA6IChEU1BDRkdfQ09FRiB8IHJlYWR3KGlvYWRkciArIERTUENGRykpOworCQl3cml0ZXcobnAtPmRzcGNmZywgaW9hZGRyICsgRFNQQ0ZHKTsKKwkJd3JpdGV3KFNEQ0ZHX1ZBTCwgaW9hZGRyICsgU0RDRkcpOworCQl3cml0ZXcoMCwgaW9hZGRyICsgUEdTRUwpOworCQlyZWFkbChpb2FkZHIgKyBDaGlwQ29uZmlnKTsKKwkJdWRlbGF5KDEwKTsKKworCQl3cml0ZXcoMSwgaW9hZGRyICsgUEdTRUwpOworCQlkc3BjZmcgPSByZWFkdyhpb2FkZHIgKyBEU1BDRkcpOworCQl3cml0ZXcoMCwgaW9hZGRyICsgUEdTRUwpOworCQlpZiAobnAtPmRzcGNmZyA9PSBkc3BjZmcpCisJCQlicmVhazsKKwl9CisKKwlpZiAobmV0aWZfbXNnX2xpbmsobnApKSB7CisJCWlmIChpPT1OQVRTRU1JX0hXX1RJTUVPVVQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IERTUENGRyBtaXNtYXRjaCBhZnRlciByZXRyeWluZyBmb3IgJWQgdXNlYy5cbiIsCisJCQkJZGV2LT5uYW1lLCBpKjEwKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IERTUENGRyBhY2NlcHRlZCBhZnRlciAlZCB1c2VjLlxuIiwKKwkJCQlkZXYtPm5hbWUsIGkqMTApOworCQl9CisJfQorCS8qCisJICogRW5hYmxlIFBIWSBTcGVjaWZpYyBldmVudCBiYXNlZCBpbnRlcnJ1cHRzLiAgTGluayBzdGF0ZSBjaGFuZ2UKKwkgKiBhbmQgQXV0by1OZWdvdGlhdGlvbiBDb21wbGV0aW9uIGFyZSBhbW9uZyB0aGUgYWZmZWN0ZWQuCisJICogUmVhZCB0aGUgaW50ciBzdGF0dXMgdG8gY2xlYXIgaXQgKG5lZWRlZCBmb3Igd2FrZSBldmVudHMpLgorCSAqLworCXJlYWR3KGlvYWRkciArIE1JbnRyU3RhdHVzKTsKKwl3cml0ZXcoTUlDUkludEVuLCBpb2FkZHIgKyBNSW50ckN0cmwpOworfQorCitzdGF0aWMgaW50IHN3aXRjaF9wb3J0X2V4dGVybmFsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKwl1MzIgY2ZnOworCisJY2ZnID0gcmVhZGwoaW9hZGRyICsgQ2hpcENvbmZpZyk7CisJaWYgKGNmZyAmIENmZ0V4dFBoeSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobmV0aWZfbXNnX2xpbmsobnApKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hpbmcgdG8gZXh0ZXJuYWwgdHJhbnNjZWl2ZXIuXG4iLAorCQkJCWRldi0+bmFtZSk7CisJfQorCisJLyogMSkgc3dpdGNoIGJhY2sgdG8gZXh0ZXJuYWwgcGh5ICovCisJd3JpdGVsKGNmZyB8IChDZmdFeHRQaHkgfCBDZmdQaHlEaXMpLCBpb2FkZHIgKyBDaGlwQ29uZmlnKTsKKwlyZWFkbChpb2FkZHIgKyBDaGlwQ29uZmlnKTsKKwl1ZGVsYXkoMSk7CisKKwkvKiAyKSByZXNldCB0aGUgZXh0ZXJuYWwgcGh5OiAqLworCS8qIHJlc2V0dGluZyB0aGUgZXh0ZXJuYWwgUEhZIGhhcyBiZWVuIGtub3duIHRvIGNhdXNlIGEgaHViIHN1cHBseWluZworCSAqIHBvd2VyIG92ZXIgRXRoZXJuZXQgdG8ga2lsbCB0aGUgcG93ZXIuICBXZSBkb24ndCB3YW50IHRvIGtpbGwKKwkgKiBwb3dlciB0byB0aGlzIGNvbXB1dGVyLCBzbyB3ZSBhdm9pZCByZXNldHRpbmcgdGhlIHBoeS4KKwkgKi8KKworCS8qIDMpIHJlaW5pdCB0aGUgcGh5IGZpeHVwLCBpdCBnb3QgbG9zdCBkdXJpbmcgcG93ZXIgZG93bi4gKi8KKwltb3ZlX2ludF9waHkoZGV2LCBucC0+cGh5X2FkZHJfZXh0ZXJuYWwpOworCWluaXRfcGh5X2ZpeHVwKGRldik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzd2l0Y2hfcG9ydF9pbnRlcm5hbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisJaW50IGk7CisJdTMyIGNmZzsKKwl1MTYgYm1jcjsKKworCWNmZyA9IHJlYWRsKGlvYWRkciArIENoaXBDb25maWcpOworCWlmICghKGNmZyAmQ2ZnRXh0UGh5KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobmV0aWZfbXNnX2xpbmsobnApKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hpbmcgdG8gaW50ZXJuYWwgdHJhbnNjZWl2ZXIuXG4iLAorCQkJCWRldi0+bmFtZSk7CisJfQorCS8qIDEpIHN3aXRjaCBiYWNrIHRvIGludGVybmFsIHBoeTogKi8KKwljZmcgPSBjZmcgJiB+KENmZ0V4dFBoeSB8IENmZ1BoeURpcyk7CisJd3JpdGVsKGNmZywgaW9hZGRyICsgQ2hpcENvbmZpZyk7CisJcmVhZGwoaW9hZGRyICsgQ2hpcENvbmZpZyk7CisJdWRlbGF5KDEpOworCQorCS8qIDIpIHJlc2V0IHRoZSBpbnRlcm5hbCBwaHk6ICovCisJYm1jciA9IHJlYWR3KGlvYWRkcitCYXNpY0NvbnRyb2wrKE1JSV9CTUNSPDwyKSk7CisJd3JpdGVsKGJtY3IgfCBCTUNSX1JFU0VULCBpb2FkZHIrQmFzaWNDb250cm9sKyhNSUlfQk1DUjw8MikpOworCXJlYWRsKGlvYWRkciArIENoaXBDb25maWcpOworCXVkZWxheSgxMCk7CisJZm9yIChpPTA7aTxOQVRTRU1JX0hXX1RJTUVPVVQ7aSsrKSB7CisJCWJtY3IgPSByZWFkdyhpb2FkZHIrQmFzaWNDb250cm9sKyhNSUlfQk1DUjw8MikpOworCQlpZiAoIShibWNyICYgQk1DUl9SRVNFVCkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKGk9PU5BVFNFTUlfSFdfVElNRU9VVCAmJiBuZXRpZl9tc2dfbGluayhucCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiBwaHkgcmVzZXQgZGlkIG5vdCBjb21wbGV0ZSBpbiAlZCB1c2VjLlxuIiwKKwkJCWRldi0+bmFtZSwgaSoxMCk7CisJfQorCS8qIDMpIHJlaW5pdCB0aGUgcGh5IGZpeHVwLCBpdCBnb3QgbG9zdCBkdXJpbmcgcG93ZXIgZG93bi4gKi8KKwlpbml0X3BoeV9maXh1cChkZXYpOworCisJcmV0dXJuIDE7Cit9CisKKy8qIFNjYW4gZm9yIGEgUEhZIG9uIHRoZSBleHRlcm5hbCBtaWkgYnVzLgorICogVGhlcmUgYXJlIHR3byB0cmlja3kgcG9pbnRzOgorICogLSBEbyBub3Qgc2NhbiB3aGlsZSB0aGUgaW50ZXJuYWwgcGh5IGlzIGVuYWJsZWQuIFRoZSBpbnRlcm5hbCBwaHkgd2lsbAorICogICBjcmFzaDogZS5nLiByZWFkcyBmcm9tIHRoZSBEU1BDRkcgcmVnaXN0ZXIgd2lsbCByZXR1cm4gb2RkIHZhbHVlcyBhbmQKKyAqICAgdGhlIG5hc3R5IHJhbmRvbSBwaHkgcmVzZXQgY29kZSB3aWxsIHJlc2V0IHRoZSBuaWMgZXZlcnkgZmV3IHNlY29uZHMuCisgKiAtIFRoZSBpbnRlcm5hbCBwaHkgbXVzdCBiZSBtb3ZlZCBhcm91bmQsIGFuIGV4dGVybmFsIHBoeSBjb3VsZAorICogICBoYXZlIHRoZSBzYW1lIGFkZHJlc3MgYXMgdGhlIGludGVybmFsIHBoeS4KKyAqLworc3RhdGljIGludCBmaW5kX21paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB0bXA7CisJaW50IGk7CisJaW50IGRpZF9zd2l0Y2g7CisKKwkvKiBTd2l0Y2ggdG8gZXh0ZXJuYWwgcGh5ICovCisJZGlkX3N3aXRjaCA9IHN3aXRjaF9wb3J0X2V4dGVybmFsKGRldik7CisJCQorCS8qIFNjYW4gdGhlIHBvc3NpYmxlIHBoeSBhZGRyZXNzZXM6CisJICoKKwkgKiBQSFkgYWRkcmVzcyAwIG1lYW5zIHRoYXQgdGhlIHBoeSBpcyBpbiBpc29sYXRlIG1vZGUuIE5vdCB5ZXQKKwkgKiBzdXBwb3J0ZWQgZHVlIHRvIGxhY2sgb2YgdGVzdCBoYXJkd2FyZS4gVXNlciBzcGFjZSBzaG91bGQKKwkgKiBoYW5kbGUgaXQgdGhyb3VnaCBldGh0b29sLgorCSAqLworCWZvciAoaSA9IDE7IGkgPD0gMzE7IGkrKykgeworCQltb3ZlX2ludF9waHkoZGV2LCBpKTsKKwkJdG1wID0gbWlpcG9ydF9yZWFkKGRldiwgaSwgTUlJX0JNU1IpOworCQlpZiAodG1wICE9IDB4ZmZmZiAmJiB0bXAgIT0gMHgwMDAwKSB7CisJCQkvKiBmb3VuZCBzb21ldGhpbmchICovCisJCQlucC0+bWlpID0gKG1kaW9fcmVhZChkZXYsIE1JSV9QSFlTSUQxKSA8PCAxNikKKwkJCQkJKyBtZGlvX3JlYWQoZGV2LCBNSUlfUEhZU0lEMik7CisJIAkJaWYgKG5ldGlmX21zZ19wcm9iZShucCkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJuYXRzZW1pICVzOiBmb3VuZCBleHRlcm5hbCBwaHkgJTA4eCBhdCBhZGRyZXNzICVkLlxuIiwKKwkJCQkJCXBjaV9uYW1lKG5wLT5wY2lfZGV2KSwgbnAtPm1paSwgaSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBBbmQgc3dpdGNoIGJhY2sgdG8gaW50ZXJuYWwgcGh5OiAqLworCWlmIChkaWRfc3dpdGNoKQorCQlzd2l0Y2hfcG9ydF9pbnRlcm5hbChkZXYpOworCXJldHVybiBpOworfQorCisvKiBDRkcgYml0cyBbMTM6MTZdIFsxODoyM10gKi8KKyNkZWZpbmUgQ0ZHX1JFU0VUX1NBVkUgMHhmZGUwMDAKKy8qIFdDU1IgYml0cyBbMDo0XSBbOToxMF0gKi8KKyNkZWZpbmUgV0NTUl9SRVNFVF9TQVZFIDB4NjFmCisvKiBSRkNSIGJpdHMgWzIwXSBbMjJdIFsyNzozMV0gKi8KKyNkZWZpbmUgUkZDUl9SRVNFVF9TQVZFIDB4Zjg1MDAwMDA7CisKK3N0YXRpYyB2b2lkIG5hdHNlbWlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwl1MzIgY2ZnOworCXUzMiB3Y3NyOworCXUzMiByZmNyOworCXUxNiBwbWF0Y2hbM107CisJdTE2IHNvcGFzc1szXTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCisJLyoKKwkgKiBSZXNldHRpbmcgdGhlIGNoaXAgY2F1c2VzIHNvbWUgcmVnaXN0ZXJzIHRvIGJlIGxvc3QuCisJICogTmF0c2VtaSBzdWdnZXN0cyBOT1QgcmVsb2FkaW5nIHRoZSBFRVBST00gd2hpbGUgbGl2ZSwgc28gaW5zdGVhZAorCSAqIHdlIHNhdmUgdGhlIHN0YXRlIHRoYXQgd291bGQgaGF2ZSBiZWVuIGxvYWRlZCBmcm9tIEVFUFJPTQorCSAqIG9uIGEgbm9ybWFsIHBvd2VyLXVwIChzZWUgdGhlIHNwZWMgRUVQUk9NIG1hcCkuICBUaGlzIGFzc3VtZXMKKwkgKiB3aG9ldmVyIGNhbGxzIHRoaXMgd2lsbCBmb2xsb3cgdXAgd2l0aCBpbml0X3JlZ2lzdGVycygpIGV2ZW50dWFsbHkuCisJICovCisKKwkvKiBDRkcgKi8KKwljZmcgPSByZWFkbChpb2FkZHIgKyBDaGlwQ29uZmlnKSAmIENGR19SRVNFVF9TQVZFOworCS8qIFdDU1IgKi8KKwl3Y3NyID0gcmVhZGwoaW9hZGRyICsgV09MQ21kKSAmIFdDU1JfUkVTRVRfU0FWRTsKKwkvKiBSRkNSICovCisJcmZjciA9IHJlYWRsKGlvYWRkciArIFJ4RmlsdGVyQWRkcikgJiBSRkNSX1JFU0VUX1NBVkU7CisJLyogUE1BVENIICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl3cml0ZWwoaSoyLCBpb2FkZHIgKyBSeEZpbHRlckFkZHIpOworCQlwbWF0Y2hbaV0gPSByZWFkdyhpb2FkZHIgKyBSeEZpbHRlckRhdGEpOworCX0KKwkvKiBTT1BBUyAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJd3JpdGVsKDB4YSsoaSoyKSwgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwkJc29wYXNzW2ldID0gcmVhZHcoaW9hZGRyICsgUnhGaWx0ZXJEYXRhKTsKKwl9CisKKwkvKiBub3cgd2hhY2sgdGhlIGNoaXAgKi8KKwl3cml0ZWwoQ2hpcFJlc2V0LCBpb2FkZHIgKyBDaGlwQ21kKTsKKwlmb3IgKGk9MDtpPE5BVFNFTUlfSFdfVElNRU9VVDtpKyspIHsKKwkJaWYgKCEocmVhZGwoaW9hZGRyICsgQ2hpcENtZCkgJiBDaGlwUmVzZXQpKQorCQkJYnJlYWs7CisJCXVkZWxheSg1KTsKKwl9CisJaWYgKGk9PU5BVFNFTUlfSFdfVElNRU9VVCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVzZXQgZGlkIG5vdCBjb21wbGV0ZSBpbiAlZCB1c2VjLlxuIiwKKwkJCWRldi0+bmFtZSwgaSo1KTsKKwl9IGVsc2UgaWYgKG5ldGlmX21zZ19odyhucCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZXNldCBjb21wbGV0ZWQgaW4gJWQgdXNlYy5cbiIsCisJCQlkZXYtPm5hbWUsIGkqNSk7CisJfQorCisJLyogcmVzdG9yZSBDRkcgKi8KKwljZmcgfD0gcmVhZGwoaW9hZGRyICsgQ2hpcENvbmZpZykgJiB+Q0ZHX1JFU0VUX1NBVkU7CisJLyogdHVybiBvbiBleHRlcm5hbCBwaHkgaWYgaXQgd2FzIHNlbGVjdGVkICovCisJaWYgKGRldi0+aWZfcG9ydCA9PSBQT1JUX1RQKQorCQljZmcgJj0gfihDZmdFeHRQaHkgfCBDZmdQaHlEaXMpOworCWVsc2UKKwkJY2ZnIHw9IChDZmdFeHRQaHkgfCBDZmdQaHlEaXMpOworCXdyaXRlbChjZmcsIGlvYWRkciArIENoaXBDb25maWcpOworCS8qIHJlc3RvcmUgV0NTUiAqLworCXdjc3IgfD0gcmVhZGwoaW9hZGRyICsgV09MQ21kKSAmIH5XQ1NSX1JFU0VUX1NBVkU7CisJd3JpdGVsKHdjc3IsIGlvYWRkciArIFdPTENtZCk7CisJLyogcmVhZCBSRkNSICovCisJcmZjciB8PSByZWFkbChpb2FkZHIgKyBSeEZpbHRlckFkZHIpICYgflJGQ1JfUkVTRVRfU0FWRTsKKwkvKiByZXN0b3JlIFBNQVRDSCAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJd3JpdGVsKGkqMiwgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwkJd3JpdGV3KHBtYXRjaFtpXSwgaW9hZGRyICsgUnhGaWx0ZXJEYXRhKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl3cml0ZWwoMHhhKyhpKjIpLCBpb2FkZHIgKyBSeEZpbHRlckFkZHIpOworCQl3cml0ZXcoc29wYXNzW2ldLCBpb2FkZHIgKyBSeEZpbHRlckRhdGEpOworCX0KKwkvKiByZXN0b3JlIFJGQ1IgKi8KKwl3cml0ZWwocmZjciwgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKK30KKworc3RhdGljIHZvaWQgbmF0c2VtaV9yZWxvYWRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKwlpbnQgaTsKKworCXdyaXRlbChFZXByb21SZWxvYWQsIGlvYWRkciArIFBDSUJ1c0NmZyk7CisJZm9yIChpPTA7aTxOQVRTRU1JX0hXX1RJTUVPVVQ7aSsrKSB7CisJCXVkZWxheSg1MCk7CisJCWlmICghKHJlYWRsKGlvYWRkciArIFBDSUJ1c0NmZykgJiBFZXByb21SZWxvYWQpKQorCQkJYnJlYWs7CisJfQorCWlmIChpPT1OQVRTRU1JX0hXX1RJTUVPVVQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibmF0c2VtaSAlczogRUVQUk9NIGRpZCBub3QgcmVsb2FkIGluICVkIHVzZWMuXG4iLAorCQkJcGNpX25hbWUobnAtPnBjaV9kZXYpLCBpKjUwKTsKKwl9IGVsc2UgaWYgKG5ldGlmX21zZ19odyhucCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm5hdHNlbWkgJXM6IEVFUFJPTSByZWxvYWRlZCBpbiAlZCB1c2VjLlxuIiwKKwkJCXBjaV9uYW1lKG5wLT5wY2lfZGV2KSwgaSo1MCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBuYXRzZW1pX3N0b3Bfcnh0eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvaWQgX19pb21lbSAqIGlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJd3JpdGVsKFJ4T2ZmIHwgVHhPZmYsIGlvYWRkciArIENoaXBDbWQpOworCWZvcihpPTA7aTwgTkFUU0VNSV9IV19USU1FT1VUO2krKykgeworCQlpZiAoKHJlYWRsKGlvYWRkciArIENoaXBDbWQpICYgKFR4T258UnhPbikpID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDUpOworCX0KKwlpZiAoaT09TkFUU0VNSV9IV19USU1FT1VUKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUeC9SeCBwcm9jZXNzIGRpZCBub3Qgc3RvcCBpbiAlZCB1c2VjLlxuIiwKKwkJCWRldi0+bmFtZSwgaSo1KTsKKwl9IGVsc2UgaWYgKG5ldGlmX21zZ19odyhucCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeC9SeCBwcm9jZXNzIHN0b3BwZWQgaW4gJWQgdXNlYy5cbiIsCisJCQlkZXYtPm5hbWUsIGkqNSk7CisJfQorfQorCitzdGF0aWMgaW50IG5ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisJaW50IGk7CisKKwkvKiBSZXNldCB0aGUgY2hpcCwganVzdCBpbiBjYXNlLiAqLworCW5hdHNlbWlfcmVzZXQoZGV2KTsKKworCWkgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJmludHJfaGFuZGxlciwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoaSkgcmV0dXJuIGk7CisKKwlpZiAobmV0aWZfbXNnX2lmdXAobnApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5ldGRldl9vcGVuKCkgaXJxICVkLlxuIiwKKwkJCWRldi0+bmFtZSwgZGV2LT5pcnEpOworCWkgPSBhbGxvY19yaW5nKGRldik7CisJaWYgKGkgPCAwKSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gaTsKKwl9CisJaW5pdF9yaW5nKGRldik7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCWluaXRfcmVnaXN0ZXJzKGRldik7CisJLyogbm93IHNldCB0aGUgTUFDIGFkZHJlc3MgYWNjb3JkaW5nIHRvIGRldi0+ZGV2X2FkZHIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXUxNiBtYWMgPSAoZGV2LT5kZXZfYWRkclsyKmkrMV08PDgpICsgZGV2LT5kZXZfYWRkclsyKmldOworCisJCXdyaXRlbChpKjIsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisJCXdyaXRldyhtYWMsIGlvYWRkciArIFJ4RmlsdGVyRGF0YSk7CisJfQorCXdyaXRlbChucC0+Y3VyX3J4X21vZGUsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJaWYgKG5ldGlmX21zZ19pZnVwKG5wKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBEb25lIG5ldGRldl9vcGVuKCksIHN0YXR1czogJSMwOHguXG4iLAorCQkJZGV2LT5uYW1lLCAoaW50KXJlYWRsKGlvYWRkciArIENoaXBDbWQpKTsKKworCS8qIFNldCB0aGUgdGltZXIgdG8gY2hlY2sgZm9yIGxpbmsgYmVhdC4gKi8KKwlpbml0X3RpbWVyKCZucC0+dGltZXIpOworCW5wLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIE5BVFNFTUlfVElNRVJfRlJFUTsKKwlucC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlucC0+dGltZXIuZnVuY3Rpb24gPSAmbmV0ZGV2X3RpbWVyOyAvKiB0aW1lciBoYW5kbGVyICovCisJYWRkX3RpbWVyKCZucC0+dGltZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2NhYmxlX21hZ2ljKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKworCWlmIChkZXYtPmlmX3BvcnQgIT0gUE9SVF9UUCkKKwkJcmV0dXJuOworCisJaWYgKG5wLT5zcnIgPj0gU1JSX0RQODM4MTZfQTUpCisJCXJldHVybjsKKworCS8qCisJICogMTAwIE1CaXQgbGlua3Mgd2l0aCBzaG9ydCBjYWJsZXMgY2FuIHRyaXAgYW4gaXNzdWUgd2l0aCB0aGUgY2hpcC4KKwkgKiBUaGUgcHJvYmxlbSBtYW5pZmVzdHMgYXMgbG90cyBvZiBDUkMgZXJyb3JzIGFuZC9vciBmbGlja2VyaW5nCisJICogYWN0aXZpdHkgTEVEIHdoaWxlIGlkbGUuICBUaGlzIHByb2Nlc3MgaXMgYmFzZWQgb24gaW5zdHJ1Y3Rpb25zCisJICogZnJvbSBlbmdpbmVlcnMgYXQgTmF0aW9uYWwuCisJICovCisJaWYgKHJlYWRsKGlvYWRkciArIENoaXBDb25maWcpICYgQ2ZnU3BlZWQxMDApIHsKKwkJdTE2IGRhdGE7CisKKwkJd3JpdGV3KDEsIGlvYWRkciArIFBHU0VMKTsKKwkJLyoKKwkJICogY29lZmZpY2llbnQgdmlzaWJpbGl0eSBzaG91bGQgYWxyZWFkeSBiZSBlbmFibGVkIHZpYQorCQkgKiBEU1BDRkcgfCAweDEwMDAKKwkJICovCisJCWRhdGEgPSByZWFkdyhpb2FkZHIgKyBUU1REQVQpICYgMHhmZjsKKwkJLyoKKwkJICogdGhlIHZhbHVlIG11c3QgYmUgbmVnYXRpdmUsIGFuZCB3aXRoaW4gY2VydGFpbiB2YWx1ZXMKKwkJICogKHRoZXNlIHZhbHVlcyBhbGwgY29tZSBmcm9tIE5hdGlvbmFsKQorCQkgKi8KKwkJaWYgKCEoZGF0YSAmIDB4ODApIHx8ICgoZGF0YSA+PSAweGQ4KSAmJiAoZGF0YSA8PSAweGZmKSkpIHsKKwkJCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCQkvKiB0aGUgYnVnIGhhcyBiZWVuIHRyaWdnZXJlZCAtIGZpeCB0aGUgY29lZmZpY2llbnQgKi8KKwkJCXdyaXRldyhUU1REQVRfRklYRUQsIGlvYWRkciArIFRTVERBVCk7CisJCQkvKiBsb2NrIHRoZSB2YWx1ZSAqLworCQkJZGF0YSA9IHJlYWR3KGlvYWRkciArIERTUENGRyk7CisJCQlucC0+ZHNwY2ZnID0gZGF0YSB8IERTUENGR19MT0NLOworCQkJd3JpdGV3KG5wLT5kc3BjZmcsIGlvYWRkciArIERTUENGRyk7CisJCX0KKwkJd3JpdGV3KDAsIGlvYWRkciArIFBHU0VMKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVuZG9fY2FibGVfbWFnaWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MTYgZGF0YTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKworCWlmIChkZXYtPmlmX3BvcnQgIT0gUE9SVF9UUCkKKwkJcmV0dXJuOworCisJaWYgKG5wLT5zcnIgPj0gU1JSX0RQODM4MTZfQTUpCisJCXJldHVybjsKKworCXdyaXRldygxLCBpb2FkZHIgKyBQR1NFTCk7CisJLyogbWFrZSBzdXJlIHRoZSBsb2NrIGJpdCBpcyBjbGVhciAqLworCWRhdGEgPSByZWFkdyhpb2FkZHIgKyBEU1BDRkcpOworCW5wLT5kc3BjZmcgPSBkYXRhICYgfkRTUENGR19MT0NLOworCXdyaXRldyhucC0+ZHNwY2ZnLCBpb2FkZHIgKyBEU1BDRkcpOworCXdyaXRldygwLCBpb2FkZHIgKyBQR1NFTCk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKwlpbnQgZHVwbGV4OworCXUxNiBibXNyOworICAgICAgIAorCS8qIFRoZSBsaW5rIHN0YXR1cyBmaWVsZCBpcyBsYXRjaGVkOiBpdCByZW1haW5zIGxvdyBhZnRlciBhIHRlbXBvcmFyeQorCSAqIGxpbmsgZmFpbHVyZSB1bnRpbCBpdCdzIHJlYWQuIFdlIG5lZWQgdGhlIGN1cnJlbnQgbGluayBzdGF0dXMsCisJICogdGh1cyByZWFkIHR3aWNlLgorCSAqLworCW1kaW9fcmVhZChkZXYsIE1JSV9CTVNSKTsKKwlibXNyID0gbWRpb19yZWFkKGRldiwgTUlJX0JNU1IpOworCisJaWYgKCEoYm1zciAmIEJNU1JfTFNUQVRVUykpIHsKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQkJaWYgKG5ldGlmX21zZ19saW5rKG5wKSkKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBsaW5rIGRvd24uXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJCXVuZG9fY2FibGVfbWFnaWMoZGV2KTsKKwkJfQorCQlyZXR1cm47CisJfQorCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCWlmIChuZXRpZl9tc2dfbGluayhucCkpCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBsaW5rIHVwLlxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQlkb19jYWJsZV9tYWdpYyhkZXYpOworCX0KKworCWR1cGxleCA9IG5wLT5mdWxsX2R1cGxleDsKKwlpZiAoIWR1cGxleCkgeworCQlpZiAoYm1zciAmIEJNU1JfQU5FR0NPTVBMRVRFKSB7CisJCQlpbnQgdG1wID0gbWlpX253YXlfcmVzdWx0KAorCQkJCW5wLT5hZHZlcnRpc2luZyAmIG1kaW9fcmVhZChkZXYsIE1JSV9MUEEpKTsKKwkJCWlmICh0bXAgPT0gTFBBXzEwMEZVTEwgfHwgdG1wID09IExQQV8xMEZVTEwpCisJCQkJZHVwbGV4ID0gMTsKKwkJfSBlbHNlIGlmIChtZGlvX3JlYWQoZGV2LCBNSUlfQk1DUikgJiBCTUNSX0ZVTExEUExYKQorCQkJZHVwbGV4ID0gMTsKKwl9CisKKwkvKiBpZiBkdXBsZXggaXMgc2V0IHRoZW4gYml0IDI4IG11c3QgYmUgc2V0LCB0b28gKi8KKwlpZiAoZHVwbGV4IF4gISEobnAtPnJ4X2NvbmZpZyAmIFJ4QWNjZXB0VHgpKSB7CisJCWlmIChuZXRpZl9tc2dfbGluayhucCkpCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBTZXR0aW5nICVzLWR1cGxleCBiYXNlZCBvbiBuZWdvdGlhdGVkICIKKwkJCQkibGluayBjYXBhYmlsaXR5LlxuIiwgZGV2LT5uYW1lLAorCQkJCWR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIik7CisJCWlmIChkdXBsZXgpIHsKKwkJCW5wLT5yeF9jb25maWcgfD0gUnhBY2NlcHRUeDsKKwkJCW5wLT50eF9jb25maWcgfD0gVHhDYXJyaWVySWduIHwgVHhIZWFydElnbjsKKwkJfSBlbHNlIHsKKwkJCW5wLT5yeF9jb25maWcgJj0gflJ4QWNjZXB0VHg7CisJCQlucC0+dHhfY29uZmlnICY9IH4oVHhDYXJyaWVySWduIHwgVHhIZWFydElnbik7CisJCX0KKwkJd3JpdGVsKG5wLT50eF9jb25maWcsIGlvYWRkciArIFR4Q29uZmlnKTsKKwkJd3JpdGVsKG5wLT5yeF9jb25maWcsIGlvYWRkciArIFJ4Q29uZmlnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcmVnaXN0ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisKKwlpbml0X3BoeV9maXh1cChkZXYpOworCisJLyogY2xlYXIgYW55IGludGVycnVwdHMgdGhhdCBhcmUgcGVuZGluZywgc3VjaCBhcyB3YWtlIGV2ZW50cyAqLworCXJlYWRsKGlvYWRkciArIEludHJTdGF0dXMpOworCisJd3JpdGVsKG5wLT5yaW5nX2RtYSwgaW9hZGRyICsgUnhSaW5nUHRyKTsKKwl3cml0ZWwobnAtPnJpbmdfZG1hICsgUlhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCBuZXRkZXZfZGVzYyksCisJCWlvYWRkciArIFR4UmluZ1B0cik7CisKKwkvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVycy4KKwkgKiBDb25maWd1cmUgdGhlIFBDSSBidXMgYnVyc3RzIGFuZCBGSUZPIHRocmVzaG9sZHMuCisJICogQ29uZmlndXJlIGZvciBzdGFuZGFyZCwgaW4tc3BlYyBFdGhlcm5ldC4KKwkgKiBTdGFydCB3aXRoIGhhbGYtZHVwbGV4LiBjaGVja19saW5rIHdpbGwgdXBkYXRlCisJICogdG8gdGhlIGNvcnJlY3Qgc2V0dGluZ3MuCisJICovCisKKwkvKiBEUlRIOiAyOiBzdGFydCB0eCBpZiA2NCBieXRlcyBhcmUgaW4gdGhlIGZpZm8KKwkgKiBGTFRIOiAweDEwOiByZWZpbGwgd2l0aCBuZXh0IHBhY2tldCBpZiA1MTIgYnl0ZXMgYXJlIGZyZWUKKwkgKiBNWERNQTogMDogdXAgdG8gMjU2IGJ5dGUgYnVyc3RzLgorCSAqIAlNWERNQSBtdXN0IGJlIDw9IEZMVEgKKwkgKiBFQ1JFVFJZPTEKKwkgKiBBVFA9MQorCSAqLworCW5wLT50eF9jb25maWcgPSBUeEF1dG9QYWQgfCBUeENvbGxSZXRyeSB8IFR4TXhkbWFfMjU2IHwKKwkJCQlUWF9GTFRIX1ZBTCB8IFRYX0RSVEhfVkFMX1NUQVJUOworCXdyaXRlbChucC0+dHhfY29uZmlnLCBpb2FkZHIgKyBUeENvbmZpZyk7CisKKwkvKiBEUlRIIDB4MTA6IHN0YXJ0IGNvcHlpbmcgdG8gbWVtb3J5IGlmIDEyOCBieXRlcyBhcmUgaW4gdGhlIGZpZm8KKwkgKiBNWERNQSAwOiB1cCB0byAyNTYgYnl0ZSBidXJzdHMKKwkgKi8KKwlucC0+cnhfY29uZmlnID0gUnhNeGRtYV8yNTYgfCBSWF9EUlRIX1ZBTDsKKwkvKiBpZiByZWNlaXZlIHJpbmcgbm93IGhhcyBiaWdnZXIgYnVmZmVycyB0aGFuIG5vcm1hbCwgZW5hYmxlIGp1bWJvICovCisJaWYgKG5wLT5yeF9idWZfc3ogPiBOQVRTRU1JX0xPTkdQS1QpCisJCW5wLT5yeF9jb25maWcgfD0gUnhBY2NlcHRMb25nOworCisJd3JpdGVsKG5wLT5yeF9jb25maWcsIGlvYWRkciArIFJ4Q29uZmlnKTsKKworCS8qIERpc2FibGUgUE1FOgorCSAqIFRoZSBQTUUgYml0IGlzIGluaXRpYWxpemVkIGZyb20gdGhlIEVFUFJPTSBjb250ZW50cy4KKwkgKiBQQ0kgY2FyZHMgcHJvYmFibHkgaGF2ZSBQTUUgZGlzYWJsZWQsIGJ1dCBtb3RoZXJib2FyZAorCSAqIGltcGxlbWVudGF0aW9ucyBtYXkgaGF2ZSBQTUUgc2V0IHRvIGVuYWJsZSBXYWtlT25MYW4uCisJICogV2l0aCBQTUUgc2V0IHRoZSBjaGlwIHdpbGwgc2NhbiBpbmNvbWluZyBwYWNrZXRzIGJ1dAorCSAqIG5vdGhpbmcgd2lsbCBiZSB3cml0dGVuIHRvIG1lbW9yeS4gKi8KKwlucC0+U2F2ZWRDbGtSdW4gPSByZWFkbChpb2FkZHIgKyBDbGtSdW4pOworCXdyaXRlbChucC0+U2F2ZWRDbGtSdW4gJiB+UE1FRW5hYmxlLCBpb2FkZHIgKyBDbGtSdW4pOworCWlmIChucC0+U2F2ZWRDbGtSdW4gJiBQTUVTdGF0dXMgJiYgbmV0aWZfbXNnX3dvbChucCkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogV2FrZS11cCBldmVudCAlIzA4eFxuIiwKKwkJCWRldi0+bmFtZSwgcmVhZGwoaW9hZGRyICsgV09MQ21kKSk7CisJfQorCisJY2hlY2tfbGluayhkZXYpOworCV9fc2V0X3J4X21vZGUoZGV2KTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCXdyaXRlbChERUZBVUxUX0lOVFIsIGlvYWRkciArIEludHJNYXNrKTsKKwl3cml0ZWwoMSwgaW9hZGRyICsgSW50ckVuYWJsZSk7CisKKwl3cml0ZWwoUnhPbiB8IFR4T24sIGlvYWRkciArIENoaXBDbWQpOworCXdyaXRlbChTdGF0c0NsZWFyLCBpb2FkZHIgKyBTdGF0c0N0cmwpOyAvKiBDbGVhciBTdGF0cyAqLworfQorCisvKgorICogbmV0ZGV2X3RpbWVyOgorICogUHVycG9zZToKKyAqIDEpIGNoZWNrIGZvciBsaW5rIGNoYW5nZXMuIFVzdWFsbHkgdGhleSBhcmUgaGFuZGxlZCBieSB0aGUgTUlJIGludGVycnVwdAorICogICAgYnV0IGl0IGRvZXNuJ3QgaHVydCB0byBjaGVjayB0d2ljZS4KKyAqIDIpIGNoZWNrIGZvciBzdWRkZW4gZGVhdGggb2YgdGhlIE5JQzoKKyAqICAgIEl0IHNlZW1zIHRoYXQgYSByZWZlcmVuY2Ugc2V0IGZvciB0aGlzIGNoaXAgd2VudCBvdXQgd2l0aCBpbmNvcnJlY3QgaW5mbywKKyAqICAgIGFuZCB0aGVyZSBleGlzdCBib2FyZHMgdGhhdCBhcmVuJ3QgcXVpdGUgcmlnaHQuICBBbiB1bmV4cGVjdGVkIHZvbHRhZ2UKKyAqICAgIGRyb3AgY2FuIGNhdXNlIHRoZSBQSFkgdG8gZ2V0IGl0c2VsZiBpbiBhIHdlaXJkIHN0YXRlIChiYXNpY2FsbHkgcmVzZXQpLgorICogICAgTk9URTogdGhpcyBvbmx5IHNlZW1zIHRvIGFmZmVjdCByZXZDIGNoaXBzLgorICogMykgY2hlY2sgb2YgZGVhdGggb2YgdGhlIFJYIHBhdGggZHVlIHRvIE9PTQorICovCitzdGF0aWMgdm9pZCBuZXRkZXZfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqIGlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCWludCBuZXh0X3RpY2sgPSA1KkhaOworCisJaWYgKG5ldGlmX21zZ190aW1lcihucCkpIHsKKwkJLyogRE8gTk9UIHJlYWQgdGhlIEludHJTdGF0dXMgcmVnaXN0ZXIsCisJCSAqIGEgcmVhZCBjbGVhcnMgYW55IHBlbmRpbmcgaW50ZXJydXB0cy4KKwkJICovCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTWVkaWEgc2VsZWN0aW9uIHRpbWVyIHRpY2suXG4iLAorCQkJZGV2LT5uYW1lKTsKKwl9CisKKwlpZiAoZGV2LT5pZl9wb3J0ID09IFBPUlRfVFApIHsKKwkJdTE2IGRzcGNmZzsKKworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJCS8qIGNoZWNrIGZvciBhIG5hc3R5IHJhbmRvbSBwaHktcmVzZXQgLSB1c2UgZHNwY2ZnIGFzIGEgZmxhZyAqLworCQl3cml0ZXcoMSwgaW9hZGRyK1BHU0VMKTsKKwkJZHNwY2ZnID0gcmVhZHcoaW9hZGRyK0RTUENGRyk7CisJCXdyaXRldygwLCBpb2FkZHIrUEdTRUwpOworCQlpZiAoZHNwY2ZnICE9IG5wLT5kc3BjZmcpIHsKKwkJCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJCQkJaWYgKG5ldGlmX21zZ19odyhucCkpCisJCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHBvc3NpYmxlIHBoeSByZXNldDogIgorCQkJCQkJInJlLWluaXRpYWxpemluZ1xuIiwgZGV2LT5uYW1lKTsKKwkJCQlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJCQkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCQkJCW5hdHNlbWlfc3RvcF9yeHR4KGRldik7CisJCQkJZHVtcF9yaW5nKGRldik7CisJCQkJcmVpbml0X3JpbmcoZGV2KTsKKwkJCQlpbml0X3JlZ2lzdGVycyhkZXYpOworCQkJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQkJCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBodXJyeSBiYWNrICovCisJCQkJbmV4dF90aWNrID0gSFo7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBpbml0X3JlZ2lzdGVycygpIGNhbGxzIGNoZWNrX2xpbmsoKSBmb3IgdGhlIGFib3ZlIGNhc2UgKi8KKwkJCWNoZWNrX2xpbmsoZGV2KTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQl9CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCQljaGVja19saW5rKGRldik7CisJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCX0KKwlpZiAobnAtPm9vbSkgeworCQlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJCW5wLT5vb20gPSAwOworCQlyZWZpbGxfcngoZGV2KTsKKwkJZW5hYmxlX2lycShkZXYtPmlycSk7CisJCWlmICghbnAtPm9vbSkgeworCQkJd3JpdGVsKFJ4T24sIGlvYWRkciArIENoaXBDbWQpOworCQl9IGVsc2UgeworCQkJbmV4dF90aWNrID0gMTsKKwkJfQorCX0KKwltb2RfdGltZXIoJm5wLT50aW1lciwgamlmZmllcyArIG5leHRfdGljayk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ldGlmX21zZ19wa3RkYXRhKG5wKSkgeworCQlpbnQgaTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgVHggcmluZyBhdCAlcDpcbiIsIG5wLT50eF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiICMlZCBkZXNjLiAlIzA4eCAlIzA4eCAlIzA4eC5cbiIsCisJCQkJaSwgbnAtPnR4X3JpbmdbaV0ubmV4dF9kZXNjLAorCQkJCW5wLT50eF9yaW5nW2ldLmNtZF9zdGF0dXMsCisJCQkJbnAtPnR4X3JpbmdbaV0uYWRkcik7CisJCX0KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgUnggcmluZyAlcDpcbiIsIG5wLT5yeF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiICMlZCBkZXNjLiAlIzA4eCAlIzA4eCAlIzA4eC5cbiIsCisJCQkJaSwgbnAtPnJ4X3JpbmdbaV0ubmV4dF9kZXNjLAorCQkJCW5wLT5yeF9yaW5nW2ldLmNtZF9zdGF0dXMsCisJCQkJbnAtPnJ4X3JpbmdbaV0uYWRkcik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJaWYgKCFucC0+aGFuZHNfb2ZmKSB7CisJCWlmIChuZXRpZl9tc2dfdHhfZXJyKG5wKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkiJXM6IFRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUjMDh4LCIKKwkJCQkiIHJlc2V0dGluZy4uLlxuIiwKKwkJCQlkZXYtPm5hbWUsIHJlYWRsKGlvYWRkciArIEludHJTdGF0dXMpKTsKKwkJZHVtcF9yaW5nKGRldik7CisKKwkJbmF0c2VtaV9yZXNldChkZXYpOworCQlyZWluaXRfcmluZyhkZXYpOworCQlpbml0X3JlZ2lzdGVycyhkZXYpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlczogdHhfdGltZW91dCB3aGlsZSBpbiBoYW5kc19vZmYgc3RhdGU/XG4iLAorCQkJZGV2LT5uYW1lKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGFsbG9jX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlucC0+cnhfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG5wLT5wY2lfZGV2LAorCQlzaXplb2Yoc3RydWN0IG5ldGRldl9kZXNjKSAqIChSWF9SSU5HX1NJWkUrVFhfUklOR19TSVpFKSwKKwkJJm5wLT5yaW5nX2RtYSk7CisJaWYgKCFucC0+cnhfcmluZykKKwkJcmV0dXJuIC1FTk9NRU07CisJbnAtPnR4X3JpbmcgPSAmbnAtPnJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVmaWxsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBSZWZpbGwgdGhlIFJ4IHJpbmcgYnVmZmVycy4gKi8KKwlmb3IgKDsgbnAtPmN1cl9yeCAtIG5wLT5kaXJ0eV9yeCA+IDA7IG5wLT5kaXJ0eV9yeCsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWludCBlbnRyeSA9IG5wLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwkJaWYgKG5wLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJCXVuc2lnbmVkIGludCBidWZsZW4gPSBucC0+cnhfYnVmX3N6K05BVFNFTUlfUEFERElORzsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IoYnVmbGVuKTsKKwkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWJyZWFrOyAvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kLiAqLworCQkJc2tiLT5kZXYgPSBkZXY7IC8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJCW5wLT5yeF9kbWFbZW50cnldID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsCisJCQkJc2tiLT50YWlsLCBidWZsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlucC0+cnhfcmluZ1tlbnRyeV0uYWRkciA9IGNwdV90b19sZTMyKG5wLT5yeF9kbWFbZW50cnldKTsKKwkJfQorCQlucC0+cnhfcmluZ1tlbnRyeV0uY21kX3N0YXR1cyA9IGNwdV90b19sZTMyKG5wLT5yeF9idWZfc3opOworCX0KKwlpZiAobnAtPmN1cl9yeCAtIG5wLT5kaXJ0eV9yeCA9PSBSWF9SSU5HX1NJWkUpIHsKKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIobnApKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGdvaW5nIE9PTS5cbiIsIGRldi0+bmFtZSk7CisJCW5wLT5vb20gPSAxOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X2J1ZnNpemUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAoZGV2LT5tdHUgPD0gRVRIX0RBVEFfTEVOKQorCQlucC0+cnhfYnVmX3N6ID0gRVRIX0RBVEFfTEVOICsgTkFUU0VNSV9IRUFERVJTOworCWVsc2UKKwkJbnAtPnJ4X2J1Zl9zeiA9IGRldi0+bXR1ICsgTkFUU0VNSV9IRUFERVJTOworfQorCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQgaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwkvKiAxKSBUWCByaW5nICovCisJbnAtPmRpcnR5X3R4ID0gbnAtPmN1cl90eCA9IDA7CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQlucC0+dHhfcmluZ1tpXS5uZXh0X2Rlc2MgPSBjcHVfdG9fbGUzMihucC0+cmluZ19kbWEKKwkJCStzaXplb2Yoc3RydWN0IG5ldGRldl9kZXNjKQorCQkJKigoaSsxKSVUWF9SSU5HX1NJWkUrUlhfUklOR19TSVpFKSk7CisJCW5wLT50eF9yaW5nW2ldLmNtZF9zdGF0dXMgPSAwOworCX0KKworCS8qIDIpIFJYIHJpbmcgKi8KKwlucC0+ZGlydHlfcnggPSAwOworCW5wLT5jdXJfcnggPSBSWF9SSU5HX1NJWkU7CisJbnAtPm9vbSA9IDA7CisJc2V0X2J1ZnNpemUoZGV2KTsKKworCW5wLT5yeF9oZWFkX2Rlc2MgPSAmbnAtPnJ4X3JpbmdbMF07CisKKwkvKiBQbGVhc2UgYmUgY2FyZWZ1bGwgYmVmb3JlIGNoYW5naW5nIHRoaXMgbG9vcCAtIGF0IGxlYXN0IGdjYy0yLjk1LjEKKwkgKiBtaXNjb21waWxlcyBpdCBvdGhlcndpc2UuCisJICovCisJLyogSW5pdGlhbGl6ZSBhbGwgUnggZGVzY3JpcHRvcnMuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT5yeF9yaW5nW2ldLm5leHRfZGVzYyA9IGNwdV90b19sZTMyKG5wLT5yaW5nX2RtYQorCQkJCStzaXplb2Yoc3RydWN0IG5ldGRldl9kZXNjKQorCQkJCSooKGkrMSklUlhfUklOR19TSVpFKSk7CisJCW5wLT5yeF9yaW5nW2ldLmNtZF9zdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duKTsKKwkJbnAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJfQorCXJlZmlsbF9yeChkZXYpOworCWR1bXBfcmluZyhkZXYpOworfQorCitzdGF0aWMgdm9pZCBkcmFpbl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChucC0+dHhfc2tidWZmW2ldKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCW5wLT50eF9kbWFbaV0sIG5wLT50eF9za2J1ZmZbaV0tPmxlbiwKKwkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IobnAtPnR4X3NrYnVmZltpXSk7CisJCQlucC0+c3RhdHMudHhfZHJvcHBlZCsrOworCQl9CisJCW5wLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgZHJhaW5fcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgYnVmbGVuID0gbnAtPnJ4X2J1Zl9zejsKKwlpbnQgaTsKKworCS8qIEZyZWUgYWxsIHRoZSBza2J1ZmZzIGluIHRoZSBSeCBxdWV1ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJbnAtPnJ4X3JpbmdbaV0uY21kX3N0YXR1cyA9IDA7CisJCW5wLT5yeF9yaW5nW2ldLmFkZHIgPSAweEJBREYwMEQwOyAvKiBBbiBpbnZhbGlkIGFkZHJlc3MuICovCisJCWlmIChucC0+cnhfc2tidWZmW2ldKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCW5wLT5yeF9kbWFbaV0sIGJ1ZmxlbiwKKwkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihucC0+cnhfc2tidWZmW2ldKTsKKwkJfQorCQlucC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRyYWluX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkcmFpbl9yeChkZXYpOworCWRyYWluX3R4KGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQobnAtPnBjaV9kZXYsCisJCXNpemVvZihzdHJ1Y3QgbmV0ZGV2X2Rlc2MpICogKFJYX1JJTkdfU0laRStUWF9SSU5HX1NJWkUpLAorCQlucC0+cnhfcmluZywgbnAtPnJpbmdfZG1hKTsKK30KKworc3RhdGljIHZvaWQgcmVpbml0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwkvKiBSWCBSaW5nICovCisJbnAtPmRpcnR5X3J4ID0gMDsKKwlucC0+Y3VyX3J4ID0gUlhfUklOR19TSVpFOworCW5wLT5yeF9oZWFkX2Rlc2MgPSAmbnAtPnJ4X3JpbmdbMF07CisJLyogSW5pdGlhbGl6ZSBhbGwgUnggZGVzY3JpcHRvcnMuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQlucC0+cnhfcmluZ1tpXS5jbWRfc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bik7CisKKwlyZWZpbGxfcngoZGV2KTsKK30KKworc3RhdGljIHZvaWQgcmVpbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCS8qIGRyYWluIFRYIHJpbmcgKi8KKwlkcmFpbl90eChkZXYpOworCW5wLT5kaXJ0eV90eCA9IG5wLT5jdXJfdHggPSAwOworCWZvciAoaT0wO2k8VFhfUklOR19TSVpFO2krKykKKwkJbnAtPnR4X3JpbmdbaV0uY21kX3N0YXR1cyA9IDA7CisKKwlyZWluaXRfcngoZGV2KTsKK30KKworc3RhdGljIGludCBzdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqIGlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCXVuc2lnbmVkIGVudHJ5OworCisJLyogTm90ZTogT3JkZXJpbmcgaXMgaW1wb3J0YW50IGhlcmUsIHNldCB0aGUgZmllbGQgd2l0aCB0aGUKKwkgICAib3duZXJzaGlwIiBiaXQgbGFzdCwgYW5kIG9ubHkgdGhlbiBpbmNyZW1lbnQgY3VyX3R4LiAqLworCisJLyogQ2FsY3VsYXRlIHRoZSBuZXh0IFR4IGRlc2NyaXB0b3IgZW50cnkuICovCisJZW50cnkgPSBucC0+Y3VyX3R4ICUgVFhfUklOR19TSVpFOworCisJbnAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJbnAtPnR4X2RtYVtlbnRyeV0gPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQlza2ItPmRhdGEsc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJbnAtPnR4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihucC0+dHhfZG1hW2VudHJ5XSk7CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisKKwlpZiAoIW5wLT5oYW5kc19vZmYpIHsKKwkJbnAtPnR4X3JpbmdbZW50cnldLmNtZF9zdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duIHwgc2tiLT5sZW4pOworCQkvKiBTdHJvbmdBUk06IEV4cGxpY2l0bHkgY2FjaGUgZmx1c2ggbnAtPnR4X3JpbmcgYW5kCisJCSAqIHNrYi0+ZGF0YSxza2ItPmxlbi4gKi8KKwkJd21iKCk7CisJCW5wLT5jdXJfdHgrKzsKKwkJaWYgKG5wLT5jdXJfdHggLSBucC0+ZGlydHlfdHggPj0gVFhfUVVFVUVfTEVOIC0gMSkgeworCQkJbmV0ZGV2X3R4X2RvbmUoZGV2KTsKKwkJCWlmIChucC0+Y3VyX3R4IC0gbnAtPmRpcnR5X3R4ID49IFRYX1FVRVVFX0xFTiAtIDEpCisJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQl9CisJCS8qIFdha2UgdGhlIHBvdGVudGlhbGx5LWlkbGUgdHJhbnNtaXQgY2hhbm5lbC4gKi8KKwkJd3JpdGVsKFR4T24sIGlvYWRkciArIENoaXBDbWQpOworCX0gZWxzZSB7CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCW5wLT5zdGF0cy50eF9kcm9wcGVkKys7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlpZiAobmV0aWZfbXNnX3R4X3F1ZXVlZChucCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBmcmFtZSAjJWQgcXVldWVkIGluIHNsb3QgJWQuXG4iLAorCQkJZGV2LT5uYW1lLCBucC0+Y3VyX3R4LCBlbnRyeSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfdHhfZG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZm9yICg7IG5wLT5jdXJfdHggLSBucC0+ZGlydHlfdHggPiAwOyBucC0+ZGlydHlfdHgrKykgeworCQlpbnQgZW50cnkgPSBucC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CisJCWlmIChucC0+dHhfcmluZ1tlbnRyeV0uY21kX3N0YXR1cyAmIGNwdV90b19sZTMyKERlc2NPd24pKQorCQkJYnJlYWs7CisJCWlmIChuZXRpZl9tc2dfdHhfZG9uZShucCkpCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSIlczogdHggZnJhbWUgIyVkIGZpbmlzaGVkLCBzdGF0dXMgJSMwOHguXG4iLAorCQkJCQlkZXYtPm5hbWUsIG5wLT5kaXJ0eV90eCwKKwkJCQkJbGUzMl90b19jcHUobnAtPnR4X3JpbmdbZW50cnldLmNtZF9zdGF0dXMpKTsKKwkJaWYgKG5wLT50eF9yaW5nW2VudHJ5XS5jbWRfc3RhdHVzICYgY3B1X3RvX2xlMzIoRGVzY1BrdE9LKSkgeworCQkJbnAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCW5wLT5zdGF0cy50eF9ieXRlcyArPSBucC0+dHhfc2tidWZmW2VudHJ5XS0+bGVuOworCQl9IGVsc2UgeyAvKiBWYXJpb3VzIFR4IGVycm9ycyAqLworCQkJaW50IHR4X3N0YXR1cyA9CisJCQkJbGUzMl90b19jcHUobnAtPnR4X3JpbmdbZW50cnldLmNtZF9zdGF0dXMpOworCQkJaWYgKHR4X3N0YXR1cyAmIChEZXNjVHhBYm9ydHxEZXNjVHhFeGNDb2xsKSkKKwkJCQlucC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiBEZXNjVHhGSUZPKQorCQkJCW5wLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIERlc2NUeENhcnJpZXIpCisJCQkJbnAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlpZiAodHhfc3RhdHVzICYgRGVzY1R4T09XQ29sKQorCQkJCW5wLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJCX0KKwkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldixucC0+dHhfZG1hW2VudHJ5XSwKKwkJCQkJbnAtPnR4X3NrYnVmZltlbnRyeV0tPmxlbiwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KKwkJZGV2X2tmcmVlX3NrYl9pcnEobnAtPnR4X3NrYnVmZltlbnRyeV0pOworCQlucC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJfQorCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikKKwkJJiYgbnAtPmN1cl90eCAtIG5wLT5kaXJ0eV90eCA8IFRYX1FVRVVFX0xFTiAtIDQpIHsKKwkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIHdha2UgcXVldWUuICovCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9Cit9CisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIGFsbCBvZiB0aGUgUnggdGhyZWFkIHdvcmsgYW5kIGNsZWFucyB1cAorICAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisJaW50IGJvZ3VzY250ID0gbWF4X2ludGVycnVwdF93b3JrOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKworCWlmIChucC0+aGFuZHNfb2ZmKQorCQlyZXR1cm4gSVJRX05PTkU7CisJZG8geworCQkvKiBSZWFkaW5nIGF1dG9tYXRpY2FsbHkgYWNrbm93bGVkZ2VzIGFsbCBpbnQgc291cmNlcy4gKi8KKwkJdTMyIGludHJfc3RhdHVzID0gcmVhZGwoaW9hZGRyICsgSW50clN0YXR1cyk7CisKKwkJaWYgKG5ldGlmX21zZ19pbnRyKG5wKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJIiVzOiBJbnRlcnJ1cHQsIHN0YXR1cyAlIzA4eCwgbWFzayAlIzA4eC5cbiIsCisJCQkJZGV2LT5uYW1lLCBpbnRyX3N0YXR1cywKKwkJCQlyZWFkbChpb2FkZHIgKyBJbnRyTWFzaykpOworCisJCWlmIChpbnRyX3N0YXR1cyA9PSAwKQorCQkJYnJlYWs7CisJCWhhbmRsZWQgPSAxOworCisJCWlmIChpbnRyX3N0YXR1cyAmCisJCSAgIChJbnRyUnhEb25lIHwgSW50clJ4SW50ciB8IFJ4U3RhdHVzRklGT092ZXIgfAorCQkgICAgSW50clJ4RXJyIHwgSW50clJ4T3ZlcnJ1bikpIHsKKwkJCW5ldGRldl9yeChkZXYpOworCQl9CisKKwkJaWYgKGludHJfc3RhdHVzICYKKwkJICAgKEludHJUeERvbmUgfCBJbnRyVHhJbnRyIHwgSW50clR4SWRsZSB8IEludHJUeEVycikpIHsKKwkJCXNwaW5fbG9jaygmbnAtPmxvY2spOworCQkJbmV0ZGV2X3R4X2RvbmUoZGV2KTsKKwkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJCX0KKworCQkvKiBBYm5vcm1hbCBlcnJvciBzdW1tYXJ5L3VuY29tbW9uIGV2ZW50cyBoYW5kbGVycy4gKi8KKwkJaWYgKGludHJfc3RhdHVzICYgSW50ckFibm9ybWFsU3VtbWFyeSkKKwkJCW5ldGRldl9lcnJvcihkZXYsIGludHJfc3RhdHVzKTsKKworCQlpZiAoLS1ib2d1c2NudCA8IDApIHsKKwkJCWlmIChuZXRpZl9tc2dfaW50cihucCkpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkiJXM6IFRvbyBtdWNoIHdvcmsgYXQgaW50ZXJydXB0LCAiCisJCQkJCSJzdGF0dXM9JSMwOHguXG4iLAorCQkJCQlkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlpZiAobmV0aWZfbXNnX2ludHIobnApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LlxuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgbG9naWNhbGx5IHBhcnQgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyLCBidXQgc2VwYXJhdGVkCisgICBmb3IgY2xhcml0eSBhbmQgYmV0dGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uICovCitzdGF0aWMgdm9pZCBuZXRkZXZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnkgPSBucC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCWludCBib2d1c2NudCA9IG5wLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSAtIG5wLT5jdXJfcng7CisJczMyIGRlc2Nfc3RhdHVzID0gbGUzMl90b19jcHUobnAtPnJ4X2hlYWRfZGVzYy0+Y21kX3N0YXR1cyk7CisJdW5zaWduZWQgaW50IGJ1ZmxlbiA9IG5wLT5yeF9idWZfc3o7CisJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisKKwkvKiBJZiB0aGUgZHJpdmVyIG93bnMgdGhlIG5leHQgZW50cnkgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKGRlc2Nfc3RhdHVzIDwgMCkgeyAvKiBlLmcuICYgRGVzY093biAqLworCQlpbnQgcGt0X2xlbjsKKwkJaWYgKG5ldGlmX21zZ19yeF9zdGF0dXMobnApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkiICBuZXRkZXZfcngoKSBlbnRyeSAlZCBzdGF0dXMgd2FzICUjMDh4LlxuIiwKKwkJCQllbnRyeSwgZGVzY19zdGF0dXMpOworCQlpZiAoLS1ib2d1c2NudCA8IDApCisJCQlicmVhazsKKwkJcGt0X2xlbiA9IChkZXNjX3N0YXR1cyAmIERlc2NTaXplTWFzaykgLSA0OworCQlpZiAoKGRlc2Nfc3RhdHVzJihEZXNjTW9yZXxEZXNjUGt0T0t8RGVzY1J4TG9uZykpICE9IERlc2NQa3RPSyl7CisJCQlpZiAoZGVzY19zdGF0dXMgJiBEZXNjTW9yZSkgeworCQkJCWlmIChuZXRpZl9tc2dfcnhfZXJyKG5wKSkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkJIiVzOiBPdmVyc2l6ZWQoPykgRXRoZXJuZXQgIgorCQkJCQkJImZyYW1lIHNwYW5uZWQgbXVsdGlwbGUgIgorCQkJCQkJImJ1ZmZlcnMsIGVudHJ5ICUjMDh4ICIKKwkJCQkJCSJzdGF0dXMgJSMwOHguXG4iLCBkZXYtPm5hbWUsCisJCQkJCQlucC0+Y3VyX3J4LCBkZXNjX3N0YXR1cyk7CisJCQkJbnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCX0gZWxzZSB7CisJCQkJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLworCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlpZiAoZGVzY19zdGF0dXMgJiAoRGVzY1J4QWJvcnR8RGVzY1J4T3ZlcikpCisJCQkJCW5wLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJCWlmIChkZXNjX3N0YXR1cyAmIChEZXNjUnhMb25nfERlc2NSeFJ1bnQpKQorCQkJCQlucC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCWlmIChkZXNjX3N0YXR1cyAmIChEZXNjUnhJbnZhbGlkfERlc2NSeEFsaWduKSkKKwkJCQkJbnAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCWlmIChkZXNjX3N0YXR1cyAmIERlc2NSeENSQykKKwkJCQkJbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCX0KKwkJfSBlbHNlIGlmIChwa3RfbGVuID4gbnAtPnJ4X2J1Zl9zeikgeworCQkJLyogaWYgdGhpcyBpcyB0aGUgdGFpbCBvZiBhIGRvdWJsZSBidWZmZXIKKwkJCSAqIHBhY2tldCwgd2UndmUgYWxyZWFkeSBjb3VudGVkIHRoZSBlcnJvcgorCQkJICogb24gdGhlIGZpcnN0IHBhcnQuICBJZ25vcmUgdGhlIHNlY29uZCBoYWxmLgorCQkJICovCisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJLyogT21pdCBDUkMgc2l6ZS4gKi8KKwkJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8gYWNjZXB0CisJCQkgKiB3aXRob3V0IGNvcHlpbmcgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLworCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKKwkJCSAgICAmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgUlhfT0ZGU0VUKSkgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLworCQkJCXNrYl9yZXNlcnZlKHNrYiwgUlhfT0ZGU0VUKTsKKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobnAtPnBjaV9kZXYsCisJCQkJCW5wLT5yeF9kbWFbZW50cnldLAorCQkJCQlidWZsZW4sCisJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCisJCQkJCW5wLT5yeF9za2J1ZmZbZW50cnldLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5wLT5wY2lfZGV2LAorCQkJCQlucC0+cnhfZG1hW2VudHJ5XSwKKwkJCQkJYnVmbGVuLAorCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJfSBlbHNlIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBucC0+cnhfZG1hW2VudHJ5XSwKKwkJCQkJYnVmbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXNrYl9wdXQoc2tiID0gbnAtPnJ4X3NrYnVmZltlbnRyeV0sIHBrdF9sZW4pOworCQkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCX0KKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCW5wLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlucC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCQllbnRyeSA9ICgrK25wLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworCQlucC0+cnhfaGVhZF9kZXNjID0gJm5wLT5yeF9yaW5nW2VudHJ5XTsKKwkJZGVzY19zdGF0dXMgPSBsZTMyX3RvX2NwdShucC0+cnhfaGVhZF9kZXNjLT5jbWRfc3RhdHVzKTsKKwl9CisJcmVmaWxsX3J4KGRldik7CisKKwkvKiBSZXN0YXJ0IFJ4IGVuZ2luZSBpZiBzdG9wcGVkLiAqLworCWlmIChucC0+b29tKQorCQltb2RfdGltZXIoJm5wLT50aW1lciwgamlmZmllcyArIDEpOworCWVsc2UKKwkJd3JpdGVsKFJ4T24sIGlvYWRkciArIENoaXBDbWQpOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqIGlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCisJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJaWYgKGludHJfc3RhdHVzICYgTGlua0NoYW5nZSkgeworCQl1MTYgbHBhID0gbWRpb19yZWFkKGRldiwgTUlJX0xQQSk7CisJCWlmIChtZGlvX3JlYWQoZGV2LCBNSUlfQk1DUikgJiBCTUNSX0FORU5BQkxFCisJCSAmJiBuZXRpZl9tc2dfbGluayhucCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IEF1dG9uZWdvdGlhdGlvbiBhZHZlcnRpc2luZyIKKwkJCQkiICUjMDR4ICBwYXJ0bmVyICUjMDR4LlxuIiwgZGV2LT5uYW1lLAorCQkJCW5wLT5hZHZlcnRpc2luZywgbHBhKTsKKwkJfQorCisJCS8qIHJlYWQgTUlJIGludCBzdGF0dXMgdG8gY2xlYXIgdGhlIGZsYWcgKi8KKwkJcmVhZHcoaW9hZGRyICsgTUludHJTdGF0dXMpOworCQljaGVja19saW5rKGRldik7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIFN0YXRzTWF4KSB7CisJCV9fZ2V0X3N0YXRzKGRldik7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIEludHJUeFVuZGVycnVuKSB7CisJCWlmICgobnAtPnR4X2NvbmZpZyAmIFR4RHJ0aE1hc2spIDwgVFhfRFJUSF9WQUxfTElNSVQpIHsKKwkJCW5wLT50eF9jb25maWcgKz0gVFhfRFJUSF9WQUxfSU5DOworCQkJaWYgKG5ldGlmX21zZ190eF9lcnIobnApKQorCQkJCXByaW50ayhLRVJOX05PVElDRQorCQkJCQkiJXM6IGluY3JlYXNlZCB0eCB0aHJlc2hvbGQsIHR4Y2ZnICUjMDh4LlxuIiwKKwkJCQkJZGV2LT5uYW1lLCBucC0+dHhfY29uZmlnKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChuZXRpZl9tc2dfdHhfZXJyKG5wKSkKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCQkJIiVzOiB0eCB1bmRlcnJ1biB3aXRoIG1heGltdW0gdHggdGhyZXNob2xkLCB0eGNmZyAlIzA4eC5cbiIsCisJCQkJCWRldi0+bmFtZSwgbnAtPnR4X2NvbmZpZyk7CisJCX0KKwkJd3JpdGVsKG5wLT50eF9jb25maWcsIGlvYWRkciArIFR4Q29uZmlnKTsKKwl9CisJaWYgKGludHJfc3RhdHVzICYgV09MUGt0ICYmIG5ldGlmX21zZ193b2wobnApKSB7CisJCWludCB3b2xfc3RhdHVzID0gcmVhZGwoaW9hZGRyICsgV09MQ21kKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogTGluayB3YWtlLXVwIGV2ZW50ICUjMDh4XG4iLAorCQkJZGV2LT5uYW1lLCB3b2xfc3RhdHVzKTsKKwl9CisJaWYgKGludHJfc3RhdHVzICYgUnhTdGF0dXNGSUZPT3ZlcikgeworCQlpZiAobmV0aWZfbXNnX3J4X2VycihucCkgJiYgbmV0aWZfbXNnX2ludHIobnApKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBSeCBzdGF0dXMgRklGTyBvdmVycnVuXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCX0KKwkJbnAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJfQorCS8qIEhtbW1tbSwgaXQncyBub3QgY2xlYXIgaG93IHRvIHJlY292ZXIgZnJvbSBQQ0kgZmF1bHRzLiAqLworCWlmIChpbnRyX3N0YXR1cyAmIEludHJQQ0lFcnIpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUENJIGVycm9yICUjMDh4XG4iLCBkZXYtPm5hbWUsCisJCQlpbnRyX3N0YXR1cyAmIEludHJQQ0lFcnIpOworCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJbnAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJfQorCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBUaGUgY2hpcCBvbmx5IG5lZWQgcmVwb3J0IGZyYW1lIHNpbGVudGx5IGRyb3BwZWQuICovCisJbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMJKz0gcmVhZGwoaW9hZGRyICsgUnhDUkNFcnJzKTsKKwlucC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSByZWFkbChpb2FkZHIgKyBSeE1pc3NlZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBUaGUgY2hpcCBvbmx5IG5lZWQgcmVwb3J0IGZyYW1lIHNpbGVudGx5IGRyb3BwZWQuICovCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCWlmIChuZXRpZl9ydW5uaW5nKGRldikgJiYgIW5wLT5oYW5kc19vZmYpCisJCV9fZ2V0X3N0YXRzKGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlyZXR1cm4gJm5wLT5zdGF0czsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBuYXRzZW1pX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlpbnRyX2hhbmRsZXIoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworI2RlZmluZSBIQVNIX1RBQkxFCTB4MjAwCitzdGF0aWMgdm9pZCBfX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdTggbWNfZmlsdGVyWzY0XTsgLyogTXVsdGljYXN0IGhhc2ggZmlsdGVyICovCisJdTMyIHJ4X21vZGU7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7IC8qIFNldCBwcm9taXNjdW91cy4gKi8KKwkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwKKwkJCWRldi0+bmFtZSk7CisJCXJ4X21vZGUgPSBSeEZpbHRlckVuYWJsZSB8IEFjY2VwdEJyb2FkY2FzdAorCQkJfCBBY2NlcHRBbGxNdWx0aWNhc3QgfCBBY2NlcHRBbGxQaHlzIHwgQWNjZXB0TXlQaHlzOworCX0gZWxzZSBpZiAoKGRldi0+bWNfY291bnQgPiBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0KQorCSAgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCXJ4X21vZGUgPSBSeEZpbHRlckVuYWJsZSB8IEFjY2VwdEJyb2FkY2FzdAorCQkJfCBBY2NlcHRBbGxNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXM7CisJfSBlbHNlIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCWludCBpOworCQltZW1zZXQobWNfZmlsdGVyLCAwLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkJIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQlpbnQgaSA9IChldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDIzKSAmIDB4MWZmOworCQkJbWNfZmlsdGVyW2kvOF0gfD0gKDEgPDwgKGkgJiAweDA3KSk7CisJCX0KKwkJcnhfbW9kZSA9IFJ4RmlsdGVyRW5hYmxlIHwgQWNjZXB0QnJvYWRjYXN0CisJCQl8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDIpIHsKKwkJCXdyaXRldyhIQVNIX1RBQkxFICsgaSwgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwkJCXdyaXRldygobWNfZmlsdGVyW2krMV08PDgpICsgbWNfZmlsdGVyW2ldLAorCQkJCWlvYWRkciArIFJ4RmlsdGVyRGF0YSk7CisJCX0KKwl9CisJd3JpdGVsKHJ4X21vZGUsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisJbnAtPmN1cl9yeF9tb2RlID0gcnhfbW9kZTsKK30KKworc3RhdGljIGludCBuYXRzZW1pX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKG5ld19tdHUgPCA2NCB8fCBuZXdfbXR1ID4gTkFUU0VNSV9SWF9MSU1JVC1OQVRTRU1JX0hFQURFUlMpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCisJLyogc3luY2hyb25pemVkIGFnYWluc3Qgb3BlbiA6IHJ0bmxfbG9jaygpIGhlbGQgYnkgY2FsbGVyICovCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisKKwkJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJLyogc3RvcCBlbmdpbmVzICovCisJCW5hdHNlbWlfc3RvcF9yeHR4KGRldik7CisJCS8qIGRyYWluIHJ4IHF1ZXVlICovCisJCWRyYWluX3J4KGRldik7CisJCS8qIGNoYW5nZSBidWZmZXJzICovCisJCXNldF9idWZzaXplKGRldik7CisJCXJlaW5pdF9yeChkZXYpOworCQl3cml0ZWwobnAtPnJpbmdfZG1hLCBpb2FkZHIgKyBSeFJpbmdQdHIpOworCQkvKiByZXN0YXJ0IGVuZ2luZXMgKi8KKwkJd3JpdGVsKFJ4T24gfCBUeE9uLCBpb2FkZHIgKyBDaGlwQ21kKTsKKwkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJZW5hYmxlX2lycShkZXYtPmlycSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlpZiAoIW5wLT5oYW5kc19vZmYpCisJCV9fc2V0X3J4X21vZGUoZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJuY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIEVUSFRPT0xfQlVTSU5GT19MRU4pOworCXN0cm5jcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIEVUSFRPT0xfQlVTSU5GT19MRU4pOworCXN0cm5jcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSwgRVRIVE9PTF9CVVNJTkZPX0xFTik7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIE5BVFNFTUlfUkVHU19TSVpFOworfQorCitzdGF0aWMgaW50IGdldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIE5BVFNFTUlfRUVQUk9NX1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbmV0ZGV2X2dldF9lY21kKGRldiwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmVzOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXMgPSBuZXRkZXZfc2V0X2VjbWQoZGV2LCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBnZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbmV0ZGV2X2dldF93b2woZGV2LCAmd29sLT5zdXBwb3J0ZWQsICZ3b2wtPndvbG9wdHMpOworCW5ldGRldl9nZXRfc29wYXNzKGRldiwgd29sLT5zb3Bhc3MpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworfQorCitzdGF0aWMgaW50IHNldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXM7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCW5ldGRldl9zZXRfd29sKGRldiwgd29sLT53b2xvcHRzKTsKKwlyZXMgPSBuZXRkZXZfc2V0X3NvcGFzcyhkZXYsIHdvbC0+c29wYXNzKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBnZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpidWYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJcmVncy0+dmVyc2lvbiA9IE5BVFNFTUlfUkVHU19WRVI7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCW5ldGRldl9nZXRfcmVncyhkZXYsIGJ1Zik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIG5wLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZCBzZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlucC0+bXNnX2VuYWJsZSA9IHZhbDsKK30KKworc3RhdGljIGludCBud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHRtcDsKKwlpbnQgciA9IC1FSU5WQUw7CisJLyogaWYgYXV0b25lZyBpcyBvZmYsIGl0J3MgYW4gZXJyb3IgKi8KKwl0bXAgPSBtZGlvX3JlYWQoZGV2LCBNSUlfQk1DUik7CisJaWYgKHRtcCAmIEJNQ1JfQU5FTkFCTEUpIHsKKwkJdG1wIHw9IChCTUNSX0FOUkVTVEFSVCk7CisJCW1kaW9fd3JpdGUoZGV2LCBNSUlfQk1DUiwgdG1wKTsKKwkJciA9IDA7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgdTMyIGdldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogTFNUQVRVUyBpcyBsYXRjaGVkIGxvdyB1bnRpbCBhIHJlYWQgLSBzbyByZWFkIHR3aWNlICovCisJbWRpb19yZWFkKGRldiwgTUlJX0JNU1IpOworCXJldHVybiAobWRpb19yZWFkKGRldiwgTUlJX0JNU1IpJkJNU1JfTFNUQVRVUykgPyAxOjA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdTggZWVidWZbTkFUU0VNSV9FRVBST01fU0laRV07CisJaW50IHJlczsKKworCWVlcHJvbS0+bWFnaWMgPSBQQ0lfVkVORE9SX0lEX05TIHwgKFBDSV9ERVZJQ0VfSURfTlNfODM4MTU8PDE2KTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJcmVzID0gbmV0ZGV2X2dldF9lZXByb20oZGV2LCBlZWJ1Zik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJaWYgKCFyZXMpCisJCW1lbWNweShkYXRhLCBlZWJ1ZitlZXByb20tPm9mZnNldCwgZWVwcm9tLT5sZW4pOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvID0gZ2V0X2RydmluZm8sCisJLmdldF9yZWdzX2xlbiA9IGdldF9yZWdzX2xlbiwKKwkuZ2V0X2VlcHJvbV9sZW4gPSBnZXRfZWVwcm9tX2xlbiwKKwkuZ2V0X3NldHRpbmdzID0gZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBzZXRfc2V0dGluZ3MsCisJLmdldF93b2wgPSBnZXRfd29sLAorCS5zZXRfd29sID0gc2V0X3dvbCwKKwkuZ2V0X3JlZ3MgPSBnZXRfcmVncywKKwkuZ2V0X21zZ2xldmVsID0gZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwgPSBzZXRfbXNnbGV2ZWwsCisJLm53YXlfcmVzZXQgPSBud2F5X3Jlc2V0LAorCS5nZXRfbGluayA9IGdldF9saW5rLAorCS5nZXRfZWVwcm9tID0gZ2V0X2VlcHJvbSwKK307CisKK3N0YXRpYyBpbnQgbmV0ZGV2X3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIG5ld3ZhbCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKwl1MzIgZGF0YSA9IHJlYWRsKGlvYWRkciArIFdPTENtZCkgJiB+V2FrZU9wdHNTdW1tYXJ5OworCisJLyogdHJhbnNsYXRlIHRvIGJpdG1hc2tzIHRoaXMgY2hpcCB1bmRlcnN0YW5kcyAqLworCWlmIChuZXd2YWwgJiBXQUtFX1BIWSkKKwkJZGF0YSB8PSBXYWtlUGh5OworCWlmIChuZXd2YWwgJiBXQUtFX1VDQVNUKQorCQlkYXRhIHw9IFdha2VVbmljYXN0OworCWlmIChuZXd2YWwgJiBXQUtFX01DQVNUKQorCQlkYXRhIHw9IFdha2VNdWx0aWNhc3Q7CisJaWYgKG5ld3ZhbCAmIFdBS0VfQkNBU1QpCisJCWRhdGEgfD0gV2FrZUJyb2FkY2FzdDsKKwlpZiAobmV3dmFsICYgV0FLRV9BUlApCisJCWRhdGEgfD0gV2FrZUFycDsKKwlpZiAobmV3dmFsICYgV0FLRV9NQUdJQykKKwkJZGF0YSB8PSBXYWtlTWFnaWM7CisJaWYgKG5wLT5zcnIgPj0gU1JSX0RQODM4MTVfRCkgeworCQlpZiAobmV3dmFsICYgV0FLRV9NQUdJQ1NFQ1VSRSkgeworCQkJZGF0YSB8PSBXYWtlTWFnaWNTZWN1cmU7CisJCX0KKwl9CisKKwl3cml0ZWwoZGF0YSwgaW9hZGRyICsgV09MQ21kKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldGRldl9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiAqc3VwcG9ydGVkLCB1MzIgKmN1cikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKwl1MzIgcmVndmFsID0gcmVhZGwoaW9hZGRyICsgV09MQ21kKTsKKworCSpzdXBwb3J0ZWQgPSAoV0FLRV9QSFkgfCBXQUtFX1VDQVNUIHwgV0FLRV9NQ0FTVCB8IFdBS0VfQkNBU1QKKwkJCXwgV0FLRV9BUlAgfCBXQUtFX01BR0lDKTsKKworCWlmIChucC0+c3JyID49IFNSUl9EUDgzODE1X0QpIHsKKwkJLyogU09QQVNTIHdvcmtzIG9uIHJldkQgYW5kIGhpZ2hlciAqLworCQkqc3VwcG9ydGVkIHw9IFdBS0VfTUFHSUNTRUNVUkU7CisJfQorCSpjdXIgPSAwOworCisJLyogdHJhbnNsYXRlIGZyb20gY2hpcCBiaXRtYXNrcyAqLworCWlmIChyZWd2YWwgJiBXYWtlUGh5KQorCQkqY3VyIHw9IFdBS0VfUEhZOworCWlmIChyZWd2YWwgJiBXYWtlVW5pY2FzdCkKKwkJKmN1ciB8PSBXQUtFX1VDQVNUOworCWlmIChyZWd2YWwgJiBXYWtlTXVsdGljYXN0KQorCQkqY3VyIHw9IFdBS0VfTUNBU1Q7CisJaWYgKHJlZ3ZhbCAmIFdha2VCcm9hZGNhc3QpCisJCSpjdXIgfD0gV0FLRV9CQ0FTVDsKKwlpZiAocmVndmFsICYgV2FrZUFycCkKKwkJKmN1ciB8PSBXQUtFX0FSUDsKKwlpZiAocmVndmFsICYgV2FrZU1hZ2ljKQorCQkqY3VyIHw9IFdBS0VfTUFHSUM7CisJaWYgKHJlZ3ZhbCAmIFdha2VNYWdpY1NlY3VyZSkgeworCQkvKiB0aGlzIGNhbiBiZSBvbiBpbiByZXZDLCBidXQgaXQncyBicm9rZW4gKi8KKwkJKmN1ciB8PSBXQUtFX01BR0lDU0VDVVJFOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldGRldl9zZXRfc29wYXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpuZXd2YWwpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisJdTE2ICpzdmFsID0gKHUxNiAqKW5ld3ZhbDsKKwl1MzIgYWRkcjsKKworCWlmIChucC0+c3JyIDwgU1JSX0RQODM4MTVfRCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBlbmFibGUgd3JpdGluZyB0byB0aGVzZSByZWdpc3RlcnMgYnkgZGlzYWJsaW5nIHRoZSBSWCBmaWx0ZXIgKi8KKwlhZGRyID0gcmVhZGwoaW9hZGRyICsgUnhGaWx0ZXJBZGRyKSAmIH5SRkNSQWRkcmVzc01hc2s7CisJYWRkciAmPSB+UnhGaWx0ZXJFbmFibGU7CisJd3JpdGVsKGFkZHIsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisKKwkvKiB3cml0ZSB0aGUgdGhyZWUgd29yZHMgdG8gKHVuZG9jdW1lbnRlZCkgUkZDUiB2YWxzIDB4YSwgMHhjLCAweGUgKi8KKwl3cml0ZWwoYWRkciB8IDB4YSwgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwl3cml0ZXcoc3ZhbFswXSwgaW9hZGRyICsgUnhGaWx0ZXJEYXRhKTsKKworCXdyaXRlbChhZGRyIHwgMHhjLCBpb2FkZHIgKyBSeEZpbHRlckFkZHIpOworCXdyaXRldyhzdmFsWzFdLCBpb2FkZHIgKyBSeEZpbHRlckRhdGEpOworCisJd3JpdGVsKGFkZHIgfCAweGUsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisJd3JpdGV3KHN2YWxbMl0sIGlvYWRkciArIFJ4RmlsdGVyRGF0YSk7CisKKwkvKiByZS1lbmFibGUgdGhlIFJYIGZpbHRlciAqLworCXdyaXRlbChhZGRyIHwgUnhGaWx0ZXJFbmFibGUsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRkZXZfZ2V0X3NvcGFzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKwl1MTYgKnN2YWwgPSAodTE2ICopZGF0YTsKKwl1MzIgYWRkcjsKKworCWlmIChucC0+c3JyIDwgU1JSX0RQODM4MTVfRCkgeworCQlzdmFsWzBdID0gc3ZhbFsxXSA9IHN2YWxbMl0gPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiByZWFkIHRoZSB0aHJlZSB3b3JkcyBmcm9tICh1bmRvY3VtZW50ZWQpIFJGQ1IgdmFscyAweGEsIDB4YywgMHhlICovCisJYWRkciA9IHJlYWRsKGlvYWRkciArIFJ4RmlsdGVyQWRkcikgJiB+UkZDUkFkZHJlc3NNYXNrOworCisJd3JpdGVsKGFkZHIgfCAweGEsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisJc3ZhbFswXSA9IHJlYWR3KGlvYWRkciArIFJ4RmlsdGVyRGF0YSk7CisKKwl3cml0ZWwoYWRkciB8IDB4YywgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwlzdmFsWzFdID0gcmVhZHcoaW9hZGRyICsgUnhGaWx0ZXJEYXRhKTsKKworCXdyaXRlbChhZGRyIHwgMHhlLCBpb2FkZHIgKyBSeEZpbHRlckFkZHIpOworCXN2YWxbMl0gPSByZWFkdyhpb2FkZHIgKyBSeEZpbHRlckRhdGEpOworCisJd3JpdGVsKGFkZHIsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRkZXZfZ2V0X2VjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiB0bXA7CisKKwllY21kLT5wb3J0ICAgICAgICA9IGRldi0+aWZfcG9ydDsKKwllY21kLT5zcGVlZCAgICAgICA9IG5wLT5zcGVlZDsKKwllY21kLT5kdXBsZXggICAgICA9IG5wLT5kdXBsZXg7CisJZWNtZC0+YXV0b25lZyAgICAgPSBucC0+YXV0b25lZzsKKwllY21kLT5hZHZlcnRpc2luZyA9IDA7CisJaWYgKG5wLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRV8xMEhBTEYpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOworCWlmIChucC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VfMTBGVUxMKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbDsKKwlpZiAobnAtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFXzEwMEhBTEYpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKKwlpZiAobnAtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFXzEwMEZVTEwpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbDsKKwllY21kLT5zdXBwb3J0ZWQgICA9IChTVVBQT1JURURfQXV0b25lZyB8CisJCVNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCAgfAorCQlTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX01JSSB8IFNVUFBPUlRFRF9GSUJSRSk7CisJZWNtZC0+cGh5X2FkZHJlc3MgPSBucC0+cGh5X2FkZHJfZXh0ZXJuYWw7CisJLyoKKwkgKiBXZSBpbnRlbnRpb25hbGx5IHJlcG9ydCB0aGUgcGh5IGFkZHJlc3Mgb2YgdGhlIGV4dGVybmFsCisJICogcGh5LCBldmVuIGlmIHRoZSBpbnRlcm5hbCBwaHkgaXMgdXNlZC4gVGhpcyBpcyBuZWNlc3NhcnkKKwkgKiB0byB3b3JrIGFyb3VuZCBhIGRlZmljaWVuY3kgb2YgdGhlIGV0aHRvb2wgaW50ZXJmYWNlOgorCSAqIEl0J3Mgb25seSBwb3NzaWJsZSB0byBxdWVyeSB0aGUgc2V0dGluZ3Mgb2YgdGhlIGFjdGl2ZQorCSAqIHBvcnQuIFRoZXJlZm9yZSAKKwkgKiAjIGV0aHRvb2wgLXMgZXRoWCBwb3J0IG1paQorCSAqIGFjdHVhbGx5IHNlbmRzIGFuIGlvY3RsIHRvIHN3aXRjaCB0byBwb3J0IG1paSB3aXRoIHRoZQorCSAqIHNldHRpbmdzIHRoYXQgYXJlIHVzZWQgZm9yIHRoZSBjdXJyZW50IGFjdGl2ZSBwb3J0LgorCSAqIElmIHdlIHdvdWxkIHJlcG9ydCBhIGRpZmZlcmVudCBwaHkgYWRkcmVzcyBpbiB0aGlzCisJICogY29tbWFuZCwgdGhlbgorCSAqICMgZXRodG9vbCAtcyBldGhYIHBvcnQgdHA7ZXRodG9vbCAtcyBldGhYIHBvcnQgbWlpCisJICogd291bGQgdW5pbnRlbnRpb25hbGx5IGNoYW5nZSB0aGUgcGh5IGFkZHJlc3MuCisJICoKKwkgKiBGb3J0dW5hdGVseSB0aGUgcGh5IGFkZHJlc3MgZG9lc24ndCBtYXR0ZXIgd2l0aCB0aGUKKwkgKiBpbnRlcm5hbCBwaHkuLi4KKwkgKi8KKworCS8qIHNldCBpbmZvcm1hdGlvbiBiYXNlZCBvbiBhY3RpdmUgcG9ydCB0eXBlICovCisJc3dpdGNoIChlY21kLT5wb3J0KSB7CisJZGVmYXVsdDoKKwljYXNlIFBPUlRfVFA6CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfVFA7CisJCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX01JSToKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9NSUk7CisJCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0ZJQlJFOgorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0ZJQlJFOworCQllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisJCWJyZWFrOworCX0KKworCS8qIGlmIGF1dG9uZWdvdGlhdGlvbiBpcyBvbiwgdHJ5IHRvIHJldHVybiB0aGUgYWN0aXZlIHNwZWVkL2R1cGxleCAqLworCWlmIChlY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKKwkJdG1wID0gbWlpX253YXlfcmVzdWx0KAorCQkJbnAtPmFkdmVydGlzaW5nICYgbWRpb19yZWFkKGRldiwgTUlJX0xQQSkpOworCQlpZiAodG1wID09IExQQV8xMDBGVUxMIHx8IHRtcCA9PSBMUEFfMTAwSEFMRikKKwkJCWVjbWQtPnNwZWVkICA9IFNQRUVEXzEwMDsKKwkJZWxzZQorCQkJZWNtZC0+c3BlZWQgID0gU1BFRURfMTA7CisJCWlmICh0bXAgPT0gTFBBXzEwMEZVTEwgfHwgdG1wID09IExQQV8xMEZVTEwpCisJCQllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJZWxzZQorCQkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJfQorCisJLyogaWdub3JlIG1heHR4cGt0LCBtYXhyeHBrdCBmb3Igbm93ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRkZXZfc2V0X2VjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGVjbWQtPnBvcnQgIT0gUE9SVF9UUCAmJiBlY21kLT5wb3J0ICE9IFBPUlRfTUlJICYmIGVjbWQtPnBvcnQgIT0gUE9SVF9GSUJSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPnRyYW5zY2VpdmVyICE9IFhDVlJfSU5URVJOQUwgJiYgZWNtZC0+dHJhbnNjZWl2ZXIgIT0gWENWUl9FWFRFUk5BTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJaWYgKChlY21kLT5hZHZlcnRpc2luZyAmIChBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CisJCQkJCSAgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCQkgIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8CisJCQkJCSAgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKSkgPT0gMCkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKSB7CisJCWlmIChlY21kLT5zcGVlZCAhPSBTUEVFRF8xMCAmJiBlY21kLT5zcGVlZCAhPSBTUEVFRF8xMDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJiBlY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIG1heHR4cGt0LCBtYXhyeHBrdDogaWdub3JlZCBmb3Igbm93LgorCSAqCisJICogdHJhbnNjZWl2ZXI6CisJICogUE9SVF9UUCBpcyBhbHdheXMgWENWUl9JTlRFUk5BTCwgUE9SVF9NSUkgYW5kIFBPUlRfRklCUkUgYXJlIGFsd2F5cworCSAqIFhDVlJfRVhURVJOQUwuIFRoZSBpbXBsZW1lbnRhdGlvbiB0aHVzIGlnbm9yZXMgZWNtZC0+dHJhbnNjZWl2ZXIgYW5kCisJICogc2VsZWN0cyBiYXNlZCBvbiBlY21kLT5wb3J0LgorCSAqCisJICogQWN0dWFsbHkgUE9SVF9GSUJSRSBpcyBuZWFybHkgaWRlbnRpY2FsIHRvIFBPUlRfTUlJOiBpdCdzIGZvciBmaWJyZQorCSAqIHBoeXMgdGhhdCBhcmUgY29ubmVjdGVkIHRvIHRoZSBtaWkgYnVzLiBJdCdzIHVzZWQgdG8gYXBwbHkgZmlicmUKKwkgKiBzcGVjaWZpYyB1cGRhdGVzLgorCSAqLworCisJLyogV0hFVyEgbm93IGxldHMgYmFuZyBzb21lIGJpdHMgKi8KKworCS8qIHNhdmUgdGhlIHBhcm1zICovCisJZGV2LT5pZl9wb3J0ICAgICAgICAgID0gZWNtZC0+cG9ydDsKKwlucC0+YXV0b25lZyAgICAgICAgICAgPSBlY21kLT5hdXRvbmVnOworCW5wLT5waHlfYWRkcl9leHRlcm5hbCA9IGVjbWQtPnBoeV9hZGRyZXNzICYgUGh5QWRkck1hc2s7CisJaWYgKG5wLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCS8qIGFkdmVydGlzZSBvbmx5IHdoYXQgaGFzIGJlZW4gcmVxdWVzdGVkICovCisJCW5wLT5hZHZlcnRpc2luZyAmPSB+KEFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfMTAwQkFTRTQpOworCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKKwkJCW5wLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJCW5wLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VfMTBGVUxMOworCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCQlucC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJCWlmIChlY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKKwkJCW5wLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwl9IGVsc2UgeworCQlucC0+c3BlZWQgID0gZWNtZC0+c3BlZWQ7CisJCW5wLT5kdXBsZXggPSBlY21kLT5kdXBsZXg7CisJCS8qIHVzZXIgb3ZlcnJpZGluZyB0aGUgaW5pdGlhbCBmdWxsIGR1cGxleCBwYXJtPyAqLworCQlpZiAobnAtPmR1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJCW5wLT5mdWxsX2R1cGxleCA9IDA7CisJfQorCisJLyogZ2V0IHRoZSByaWdodCBwaHkgZW5hYmxlZCAqLworCWlmIChlY21kLT5wb3J0ID09IFBPUlRfVFApCisJCXN3aXRjaF9wb3J0X2ludGVybmFsKGRldik7CisJZWxzZQorCQlzd2l0Y2hfcG9ydF9leHRlcm5hbChkZXYpOworCisJLyogc2V0IHBhcm1zIGFuZCBzZWUgaG93IHRoaXMgYWZmZWN0ZWQgb3VyIGxpbmsgc3RhdHVzICovCisJaW5pdF9waHlfZml4dXAoZGV2KTsKKwljaGVja19saW5rKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZGV2X2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpidWYpCit7CisJaW50IGk7CisJaW50IGo7CisJdTMyIHJmY3I7CisJdTMyICpyYnVmID0gKHUzMiAqKWJ1ZjsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKworCS8qIHJlYWQgbm9uLW1paSBwYWdlIDAgb2YgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IE5BVFNFTUlfUEcwX05SRUdTLzI7IGkrKykgeworCQlyYnVmW2ldID0gcmVhZGwoaW9hZGRyICsgaSo0KTsKKwl9CisKKwkvKiByZWFkIGN1cnJlbnQgbWlpIHJlZ2lzdGVycyAqLworCWZvciAoaSA9IE5BVFNFTUlfUEcwX05SRUdTLzI7IGkgPCBOQVRTRU1JX1BHMF9OUkVHUzsgaSsrKQorCQlyYnVmW2ldID0gbWRpb19yZWFkKGRldiwgaSAmIDB4MWYpOworCisJLyogcmVhZCBvbmx5IHRoZSAnbWFnaWMnIHJlZ2lzdGVycyBmcm9tIHBhZ2UgMSAqLworCXdyaXRldygxLCBpb2FkZHIgKyBQR1NFTCk7CisJcmJ1ZltpKytdID0gcmVhZHcoaW9hZGRyICsgUE1EQ1NSKTsKKwlyYnVmW2krK10gPSByZWFkdyhpb2FkZHIgKyBUU1REQVQpOworCXJidWZbaSsrXSA9IHJlYWR3KGlvYWRkciArIERTUENGRyk7CisJcmJ1ZltpKytdID0gcmVhZHcoaW9hZGRyICsgU0RDRkcpOworCXdyaXRldygwLCBpb2FkZHIgKyBQR1NFTCk7CisKKwkvKiByZWFkIFJGQ1IgaW5kZXhlZCByZWdpc3RlcnMgKi8KKwlyZmNyID0gcmVhZGwoaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwlmb3IgKGogPSAwOyBqIDwgTkFUU0VNSV9SRkRSX05SRUdTOyBqKyspIHsKKwkJd3JpdGVsKGoqMiwgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwkJcmJ1ZltpKytdID0gcmVhZHcoaW9hZGRyICsgUnhGaWx0ZXJEYXRhKTsKKwl9CisJd3JpdGVsKHJmY3IsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisKKwkvKiB0aGUgaW50ZXJydXB0IHN0YXR1cyBpcyBjbGVhci1vbi1yZWFkIC0gc2VlIGlmIHdlIG1pc3NlZCBhbnkgKi8KKwlpZiAocmJ1Zls0XSAmIHJidWZbNV0pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIiVzOiBzaG9vdCwgd2UgZHJvcHBlZCBhbiBpbnRlcnJ1cHQgKCUjMDh4KVxuIiwKKwkJCWRldi0+bmFtZSwgcmJ1Zls0XSAmIHJidWZbNV0pOworCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFNXQVBfQklUUyh4KQkoICgoKHgpICYgMHgwMDAxKSA8PCAxNSkgfCAoKCh4KSAmIDB4MDAwMikgPDwgMTMpIFwKKwkJCXwgKCgoeCkgJiAweDAwMDQpIDw8IDExKSB8ICgoKHgpICYgMHgwMDA4KSA8PCA5KSAgXAorCQkJfCAoKCh4KSAmIDB4MDAxMCkgPDwgNykgIHwgKCgoeCkgJiAweDAwMjApIDw8IDUpICBcCisJCQl8ICgoKHgpICYgMHgwMDQwKSA8PCAzKSAgfCAoKCh4KSAmIDB4MDA4MCkgPDwgMSkgIFwKKwkJCXwgKCgoeCkgJiAweDAxMDApID4+IDEpICB8ICgoKHgpICYgMHgwMjAwKSA+PiAzKSAgXAorCQkJfCAoKCh4KSAmIDB4MDQwMCkgPj4gNSkgIHwgKCgoeCkgJiAweDA4MDApID4+IDcpICBcCisJCQl8ICgoKHgpICYgMHgxMDAwKSA+PiA5KSAgfCAoKCh4KSAmIDB4MjAwMCkgPj4gMTEpIFwKKwkJCXwgKCgoeCkgJiAweDQwMDApID4+IDEzKSB8ICgoKHgpICYgMHg4MDAwKSA+PiAxNSkgKQorCitzdGF0aWMgaW50IG5ldGRldl9nZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpidWYpCit7CisJaW50IGk7CisJdTE2ICplYnVmID0gKHUxNiAqKWJ1ZjsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKworCS8qIGVlcHJvbV9yZWFkIHJlYWRzIDE2IGJpdHMsIGFuZCBpbmRleGVzIGJ5IDE2IGJpdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTkFUU0VNSV9FRVBST01fU0laRS8yOyBpKyspIHsKKwkJZWJ1ZltpXSA9IGVlcHJvbV9yZWFkKGlvYWRkciwgaSk7CisJCS8qIFRoZSBFRVBST00gaXRzZWxmIHN0b3JlcyBkYXRhIGJpdC1zd2FwcGVkLCBidXQgZWVwcm9tX3JlYWQKKwkJICogcmVhZHMgaXQgYmFjayAic2FuZWx5Ii4gU28gd2Ugc3dhcCBpdCBiYWNrIGhlcmUgaW4gb3JkZXIgdG8KKwkJICogcHJlc2VudCBpdCB0byB1c2VybGFuZCBhcyBpdCBpcyBzdG9yZWQuICovCisJCWVidWZbaV0gPSBTV0FQX0JJVFMoZWJ1ZltpXSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShycSk7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToJCS8qIEdldCBhZGRyZXNzIG9mIE1JSSBQSFkgaW4gdXNlLiAqLworCWNhc2UgU0lPQ0RFVlBSSVZBVEU6CQkvKiBmb3IgYmluYXJ5IGNvbXBhdCwgcmVtb3ZlIGluIDIuNSAqLworCQlkYXRhLT5waHlfaWQgPSBucC0+cGh5X2FkZHJfZXh0ZXJuYWw7CisJCS8qIEZhbGwgVGhyb3VnaCAqLworCisJY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwljYXNlIFNJT0NERVZQUklWQVRFKzE6CQkvKiBmb3IgYmluYXJ5IGNvbXBhdCwgcmVtb3ZlIGluIDIuNSAqLworCQkvKiBUaGUgcGh5X2lkIGlzIG5vdCBlbm91Z2ggdG8gdW5pcXVlbHkgaWRlbnRpZnkKKwkJICogdGhlIGludGVuZGVkIHRhcmdldC4gVGhlcmVmb3JlIHRoZSBjb21tYW5kIGlzIHNlbnQgdG8KKwkJICogdGhlIGdpdmVuIG1paSBvbiB0aGUgY3VycmVudCBwb3J0LgorCQkgKi8KKwkJaWYgKGRldi0+aWZfcG9ydCA9PSBQT1JUX1RQKSB7CisJCQlpZiAoKGRhdGEtPnBoeV9pZCAmIDB4MWYpID09IG5wLT5waHlfYWRkcl9leHRlcm5hbCkKKwkJCQlkYXRhLT52YWxfb3V0ID0gbWRpb19yZWFkKGRldiwKKwkJCQkJCQlkYXRhLT5yZWdfbnVtICYgMHgxZik7CisJCQllbHNlCisJCQkJZGF0YS0+dmFsX291dCA9IDA7CisJCX0gZWxzZSB7CisJCQltb3ZlX2ludF9waHkoZGV2LCBkYXRhLT5waHlfaWQgJiAweDFmKTsKKwkJCWRhdGEtPnZhbF9vdXQgPSBtaWlwb3J0X3JlYWQoZGV2LCBkYXRhLT5waHlfaWQgJiAweDFmLAorCQkJCQkJCWRhdGEtPnJlZ19udW0gJiAweDFmKTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCWNhc2UgU0lPQ0RFVlBSSVZBVEUrMjoJCS8qIGZvciBiaW5hcnkgY29tcGF0LCByZW1vdmUgaW4gMi41ICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChkZXYtPmlmX3BvcnQgPT0gUE9SVF9UUCkgeworCQkJaWYgKChkYXRhLT5waHlfaWQgJiAweDFmKSA9PSBucC0+cGh5X2FkZHJfZXh0ZXJuYWwpIHsKKyAJCQkJaWYgKChkYXRhLT5yZWdfbnVtICYgMHgxZikgPT0gTUlJX0FEVkVSVElTRSkKKwkJCQkJbnAtPmFkdmVydGlzaW5nID0gZGF0YS0+dmFsX2luOworCQkJCW1kaW9fd3JpdGUoZGV2LCBkYXRhLT5yZWdfbnVtICYgMHgxZiwKKwkJCQkJCQlkYXRhLT52YWxfaW4pOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChkYXRhLT5waHlfaWQgJiAweDFmKSA9PSBucC0+cGh5X2FkZHJfZXh0ZXJuYWwpIHsKKyAJCQkJaWYgKChkYXRhLT5yZWdfbnVtICYgMHgxZikgPT0gTUlJX0FEVkVSVElTRSkKKwkJCQkJbnAtPmFkdmVydGlzaW5nID0gZGF0YS0+dmFsX2luOworCQkJfQorCQkJbW92ZV9pbnRfcGh5KGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZik7CisJCQltaWlwb3J0X3dyaXRlKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwKKwkJCQkJCWRhdGEtPnJlZ19udW0gJiAweDFmLAorCQkJCQkJZGF0YS0+dmFsX2luKTsKKwkJfQorCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFibGVfd29sX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGVuYWJsZV9pbnRyKQoreworCXZvaWQgX19pb21lbSAqIGlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ldGlmX21zZ193b2wobnApKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVtYWluaW5nIGFjdGl2ZSBmb3Igd2FrZS1vbi1sYW5cbiIsCisJCQlkZXYtPm5hbWUpOworCisJLyogRm9yIFdPTCB3ZSBtdXN0IHJlc3RhcnQgdGhlIHJ4IHByb2Nlc3MgaW4gc2lsZW50IG1vZGUuCisJICogV3JpdGUgTlVMTCB0byB0aGUgUnhSaW5nUHRyLiBPbmx5IHBvc3NpYmxlIGlmCisJICogcnggcHJvY2VzcyBpcyBzdG9wcGVkCisJICovCisJd3JpdGVsKDAsIGlvYWRkciArIFJ4UmluZ1B0cik7CisKKwkvKiByZWFkIFdvTCBzdGF0dXMgdG8gY2xlYXIgKi8KKwlyZWFkbChpb2FkZHIgKyBXT0xDbWQpOworCisJLyogUE1FIG9uLCBjbGVhciBzdGF0dXMgKi8KKwl3cml0ZWwobnAtPlNhdmVkQ2xrUnVuIHwgUE1FRW5hYmxlIHwgUE1FU3RhdHVzLCBpb2FkZHIgKyBDbGtSdW4pOworCisJLyogYW5kIHJlc3RhcnQgdGhlIHJ4IHByb2Nlc3MgKi8KKwl3cml0ZWwoUnhPbiwgaW9hZGRyICsgQ2hpcENtZCk7CisKKwlpZiAoZW5hYmxlX2ludHIpIHsKKwkJLyogZW5hYmxlIHRoZSBXT0wgaW50ZXJydXB0LgorCQkgKiBDb3VsZCBiZSB1c2VkIHRvIHNlbmQgYSBuZXRsaW5rIG1lc3NhZ2UuCisJCSAqLworCQl3cml0ZWwoV09MUGt0IHwgTGlua0NoYW5nZSwgaW9hZGRyICsgSW50ck1hc2spOworCQl3cml0ZWwoMSwgaW9hZGRyICsgSW50ckVuYWJsZSk7CisJfQorfQorCitzdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvaWQgX19pb21lbSAqIGlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ldGlmX21zZ19pZmRvd24obnApKQorCQlwcmludGsoS0VSTl9ERUJVRworCQkJIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlIzA0eC5cbiIsCisJCQlkZXYtPm5hbWUsIChpbnQpcmVhZGwoaW9hZGRyICsgQ2hpcENtZCkpOworCWlmIChuZXRpZl9tc2dfcGt0ZGF0YShucCkpCisJCXByaW50ayhLRVJOX0RFQlVHCisJCQkiJXM6IFF1ZXVlIHBvaW50ZXJzIHdlcmUgVHggJWQgLyAlZCwgIFJ4ICVkIC8gJWQuXG4iLAorCQkJZGV2LT5uYW1lLCBucC0+Y3VyX3R4LCBucC0+ZGlydHlfdHgsCisJCQlucC0+Y3VyX3J4LCBucC0+ZGlydHlfcngpOworCisJLyoKKwkgKiBGSVhNRTogd2hhdCBpZiBzb21lb25lIHRyaWVzIHRvIGNsb3NlIGEgZGV2aWNlCisJICogdGhhdCBpcyBzdXNwZW5kZWQ/CisJICogU2hvdWxkIHdlIHJlZW5hYmxlIHRoZSBuaWMgdG8gc3dpdGNoIHRvCisJICogdGhlIGZpbmFsIFdPTCBzZXR0aW5ncz8KKwkgKi8KKworCWRlbF90aW1lcl9zeW5jKCZucC0+dGltZXIpOworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLCBhbmQgZmx1c2ggcG9zdGVkIHdyaXRlcyAqLworCXdyaXRlbCgwLCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwlyZWFkbChpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwlucC0+aGFuZHNfb2ZmID0gMTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJLyogSW50ZXJydXB0IGRpc2FibGVkLCBpbnRlcnJ1cHQgaGFuZGxlciByZWxlYXNlZCwKKwkgKiBxdWV1ZSBzdG9wcGVkLCB0aW1lciBkZWxldGVkLCBydG5sX2xvY2sgaGVsZAorCSAqIEFsbCBhc3luYyBjb2RlcGF0aHMgdGhhdCBhY2Nlc3MgdGhlIGRyaXZlciBhcmUgZGlzYWJsZWQuCisJICovCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCW5wLT5oYW5kc19vZmYgPSAwOworCXJlYWRsKGlvYWRkciArIEludHJNYXNrKTsKKwlyZWFkdyhpb2FkZHIgKyBNSW50clN0YXR1cyk7CisKKwkvKiBGcmVlemUgU3RhdHMgKi8KKwl3cml0ZWwoU3RhdHNGcmVlemUsIGlvYWRkciArIFN0YXRzQ3RybCk7CisKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKwluYXRzZW1pX3N0b3Bfcnh0eChkZXYpOworCisJX19nZXRfc3RhdHMoZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCS8qIGNsZWFyIHRoZSBjYXJyaWVyIGxhc3QgLSBhbiBpbnRlcnJ1cHQgY291bGQgcmVlbmFibGUgaXQgb3RoZXJ3aXNlICovCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlkdW1wX3JpbmcoZGV2KTsKKwlkcmFpbl9yaW5nKGRldik7CisJZnJlZV9yaW5nKGRldik7CisKKwl7CisJCXUzMiB3b2wgPSByZWFkbChpb2FkZHIgKyBXT0xDbWQpICYgV2FrZU9wdHNTdW1tYXJ5OworCQlpZiAod29sKSB7CisJCQkvKiByZXN0YXJ0IHRoZSBOSUMgaW4gV09MIG1vZGUuCisJCQkgKiBUaGUgbmljIG11c3QgYmUgc3RvcHBlZCBmb3IgdGhpcy4KKwkJCSAqLworCQkJZW5hYmxlX3dvbF9tb2RlKGRldiwgMCk7CisJCX0gZWxzZSB7CisJCQkvKiBSZXN0b3JlIFBNRSBlbmFibGUgYml0IHVubW9sZXN0ZWQgKi8KKwkJCXdyaXRlbChucC0+U2F2ZWRDbGtSdW4sIGlvYWRkciArIENsa1J1bik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IG5hdHNlbWlfcmVtb3ZlMSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMgKHBkZXYpOworCWlvdW5tYXAoaW9hZGRyKTsKKwlmcmVlX25ldGRldiAoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworLyoKKyAqIFRoZSBuczgzODE1IGNoaXAgZG9lc24ndCBoYXZlIGV4cGxpY2l0IFJ4U3RvcCBiaXRzLgorICogS2lja2luZyB0aGUgUnggb3IgVHggcHJvY2VzcyBmb3IgYSBuZXcgcGFja2V0IHJlZW5hYmxlcyB0aGUgUnggcHJvY2VzcworICogb2YgdGhlIG5pYywgdGh1cyB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgdmVyeSBjYXJlZnVsOgorICoKKyAqIHN1c3BlbmQvcmVzdW1lIHN5bmNocm9uaXphdGlvbjoKKyAqIGVudHJ5IHBvaW50czoKKyAqICAgbmV0ZGV2X29wZW4sIG5ldGRldl9jbG9zZSwgbmV0ZGV2X2lvY3RsLCBzZXRfcnhfbW9kZSwgaW50cl9oYW5kbGVyLAorICogICBzdGFydF90eCwgdHhfdGltZW91dAorICoKKyAqIE5vIGZ1bmN0aW9uIGFjY2Vzc2VzIHRoZSBoYXJkd2FyZSB3aXRob3V0IGNoZWNraW5nIG5wLT5oYW5kc19vZmYuCisgKgl0aGUgY2hlY2sgb2NjdXJzIHVuZGVyIHNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKyAqIGV4Y2VwdGlvbnM6CisgKgkqIG5ldGRldl9pb2N0bDogbm9uY3JpdGljYWwgYWNjZXNzLgorICoJKiBuZXRkZXZfb3BlbjogY2Fubm90IGhhcHBlbiBkdWUgdG8gdGhlIGRldmljZV9kZXRhY2gKKyAqCSogbmV0ZGV2X2Nsb3NlOiBkb2Vzbid0IGh1cnQuCisgKgkqIG5ldGRldl90aW1lcjogdGltZXIgc3RvcHBlZCBieSBuYXRzZW1pX3N1c3BlbmQuCisgKgkqIGludHJfaGFuZGxlcjogZG9lc24ndCBhY3F1aXJlIHRoZSBzcGlubG9jay4gc3VzcGVuZCBjYWxscworICoJCWRpc2FibGVfaXJxKCkgdG8gZW5mb3JjZSBzeW5jaHJvbml6YXRpb24uCisgKgorICogSW50ZXJydXB0cyBtdXN0IGJlIGRpc2FibGVkLCBvdGhlcndpc2UgaGFuZHNfb2ZmIGNhbiBjYXVzZSBpcnEgc3Rvcm1zLgorICovCisKK3N0YXRpYyBpbnQgbmF0c2VtaV9zdXNwZW5kIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqIGlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCisJcnRubF9sb2NrKCk7CisJaWYgKG5ldGlmX3J1bm5pbmcgKGRldikpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJm5wLT50aW1lcik7CisKKwkJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisKKwkJd3JpdGVsKDAsIGlvYWRkciArIEludHJFbmFibGUpOworCQlucC0+aGFuZHNfb2ZmID0gMTsKKwkJbmF0c2VtaV9zdG9wX3J4dHgoZGV2KTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQllbmFibGVfaXJxKGRldi0+aXJxKTsKKworCQkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50cy4gKi8KKwkJX19nZXRfc3RhdHMoZGV2KTsKKworCQkvKiBwY2lfcG93ZXJfb2ZmKHBkZXYsIC0xKTsgKi8KKwkJZHJhaW5fcmluZyhkZXYpOworCQl7CisJCQl1MzIgd29sID0gcmVhZGwoaW9hZGRyICsgV09MQ21kKSAmIFdha2VPcHRzU3VtbWFyeTsKKwkJCS8qIFJlc3RvcmUgUE1FIGVuYWJsZSBiaXQgKi8KKwkJCWlmICh3b2wpIHsKKwkJCQkvKiByZXN0YXJ0IHRoZSBOSUMgaW4gV09MIG1vZGUuCisJCQkJICogVGhlIG5pYyBtdXN0IGJlIHN0b3BwZWQgZm9yIHRoaXMuCisJCQkJICogRklYTUU6IHVzZSB0aGUgV09MIGludGVycnVwdAorCQkJCSAqLworCQkJCWVuYWJsZV93b2xfbW9kZShkZXYsIDApOworCQkJfSBlbHNlIHsKKwkJCQkvKiBSZXN0b3JlIFBNRSBlbmFibGUgYml0IHVubW9sZXN0ZWQgKi8KKwkJCQl3cml0ZWwobnAtPlNhdmVkQ2xrUnVuLCBpb2FkZHIgKyBDbGtSdW4pOworCQkJfQorCQl9CisJfQorCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlydG5sX3VubG9jaygpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbmF0c2VtaV9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcnRubF9sb2NrKCk7CisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCWdvdG8gb3V0OworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJQlVHX09OKCFucC0+aGFuZHNfb2ZmKTsKKwkJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJLyoJcGNpX3Bvd2VyX29uKHBkZXYpOyAqLworCisJCW5hdHNlbWlfcmVzZXQoZGV2KTsKKwkJaW5pdF9yaW5nKGRldik7CisJCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCQlucC0+aGFuZHNfb2ZmID0gMDsKKwkJaW5pdF9yZWdpc3RlcnMoZGV2KTsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCQlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJZW5hYmxlX2lycShkZXYtPmlycSk7CisKKwkJbW9kX3RpbWVyKCZucC0+dGltZXIsIGppZmZpZXMgKyAxKkhaKTsKKwl9CisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworb3V0OgorCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG5hdHNlbWlfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IG5hdHNlbWlfcGNpX3RibCwKKwkucHJvYmUJCT0gbmF0c2VtaV9wcm9iZTEsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChuYXRzZW1pX3JlbW92ZTEpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gbmF0c2VtaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gbmF0c2VtaV9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5hdHNlbWlfaW5pdF9tb2QgKHZvaWQpCit7CisvKiB3aGVuIGEgbW9kdWxlLCB0aGlzIGlzIHByaW50ZWQgd2hldGhlciBvciBub3QgZGV2aWNlcyBhcmUgZm91bmQgaW4gcHJvYmUgKi8KKyNpZmRlZiBNT0RVTEUKKwlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZuYXRzZW1pX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuYXRzZW1pX2V4aXRfbW9kICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJm5hdHNlbWlfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobmF0c2VtaV9pbml0X21vZCk7Cittb2R1bGVfZXhpdChuYXRzZW1pX2V4aXRfbW9kKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUtaDgzMDAuYyBiL2RyaXZlcnMvbmV0L25lLWg4MzAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRlMjkxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25lLWg4MzAwLmMKQEAgLTAsMCArMSw2NzAgQEAKKy8qIG5lLWg4MzAwLmM6IEEgTkUyMDAwIGNsb25lIG9uIEg4LzMwMCBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKyAgICBvcmlnaW5hbCBuZS5jCisgICAgV3JpdHRlbiAxOTkyLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisKKyAgICBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKworICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisgICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKyAgICBTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24sIDQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwLCBBbm5hcG9saXMgTUQgMjE0MDMKKworICAgIEg4LzMwMCBtb2RpZmllZAorICAgIFlvc2hpbm9yaSBTYXRvIDx5c2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5qcD4KKyovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb24xW10gPQorIm5lLWg4MzAwLmM6djEuMDAgMjAwNC8wNC8xMSB5c2F0b1xuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgIm5lLWg4MzAwIgorCisvKiBTb21lIGRlZmluZXMgdGhhdCBwZW9wbGUgY2FuIHBsYXkgd2l0aCBpZiBzbyBpbmNsaW5lZC4gKi8KKworLyogRG8gd2UgcGVyZm9ybSBleHRyYSBzYW5pdHkgY2hlY2tzIG9uIHN0dWZmID8gKi8KKy8qICNkZWZpbmUgTkVfU0FOSVRZX0NIRUNLICovCisKKy8qIERvIHdlIGltcGxlbWVudCB0aGUgcmVhZCBiZWZvcmUgd3JpdGUgYnVnZml4ID8gKi8KKy8qICNkZWZpbmUgTkVfUldfQlVHRklYICovCisKKy8qIERvIHdlIGhhdmUgYSBub24gc3RkLiBhbW91bnQgb2YgbWVtb3J5PyAoaW4gdW5pdHMgb2YgMjU2IGJ5dGUgcGFnZXMpICovCisvKiAjZGVmaW5lIFBBQ0tFVEJVRl9NRU1TSVpFCTB4NDAgKi8KKworLyogQSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBJL08gYWRkcmVzc2VzIHRvIGJlIHByb2JlZCBhdCBib290LiAqLworCisvKiAtLS0tIE5vIHVzZXItc2VydmljZWFibGUgcGFydHMgYmVsb3cgLS0tLSAqLworCisjZGVmaW5lIE5FX0JBU0UJIChkZXYtPmJhc2VfYWRkcikKKyNkZWZpbmUgTkVfQ01ECSAJMHgwMAorI2RlZmluZSBORV9EQVRBUE9SVAkoZWlfc3RhdHVzLndvcmQxNj8weDIwOjB4MTApCS8qIE5hdFNlbWktZGVmaW5lZCBwb3J0IHdpbmRvdyBvZmZzZXQuICovCisjZGVmaW5lIE5FX1JFU0VUCShlaV9zdGF0dXMud29yZDE2PzB4M2Y6MHgxZikJLyogSXNzdWUgYSByZWFkIHRvIHJlc2V0LCBhIHdyaXRlIHRvIGNsZWFyLiAqLworI2RlZmluZSBORV9JT19FWFRFTlQJKGVpX3N0YXR1cy53b3JkMTY/MHg0MDoweDIwKQorCisjZGVmaW5lIE5FU01fU1RBUlRfUEcJMHg0MAkvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlciAqLworI2RlZmluZSBORVNNX1NUT1BfUEcJMHg4MAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworCitzdGF0aWMgaW50IG5lX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKKworc3RhdGljIGludCBuZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgbmVfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5lX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJICBpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIG5lX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIG5lX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBpbnQgY291bnQsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpOworCisKK3N0YXRpYyB1MzIgcmVnX29mZnNldFsxNl07CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcmVnX29mZnNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyKQoreworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGJ1c193aWR0aDsKKworCWJ1c193aWR0aCA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKUFCV0NSOworCWJ1c193aWR0aCAmPSAxIDw8ICgoYmFzZV9hZGRyID4+IDIxKSAmIDcpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihyZWdfb2Zmc2V0KSAvIHNpemVvZih1MzIpOyBpKyspCisJCWlmIChidXNfd2lkdGggPT0gMCkKKwkJCXJlZ19vZmZzZXRbaV0gPSBpICogMiArIDE7CisJCWVsc2UKKwkJCXJlZ19vZmZzZXRbaV0gPSBpOworCisJZWlfbG9jYWwtPnJlZ19vZmZzZXQgPSByZWdfb2Zmc2V0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaDgzMDBfbmVfY291bnQgPSAwOworI2lmZGVmIENPTkZJR19IODMwMEhfSDhNQVgKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgaDgzMDBfbmVfYmFzZVtdID0geyAweDgwMDYwMCB9Oworc3RhdGljIGludCBoODMwMF9uZV9pcnFbXSA9IHtFWFRfSVJRNH07CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSDgzMDBIX0FLSTMwNjhORVQKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgaDgzMDBfbmVfYmFzZVtdID0geyAweDIwMDAwMCB9Oworc3RhdGljIGludCBoODMwMF9uZV9pcnFbXSA9IHtFWFRfSVJRNX07CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgaW5pdF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoaDgzMDBfbmVfY291bnQgPCAoc2l6ZW9mKGg4MzAwX25lX2Jhc2UpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkgeworCQlkZXYtPmJhc2VfYWRkciA9IGg4MzAwX25lX2Jhc2VbaDgzMDBfbmVfY291bnRdOworCQlkZXYtPmlycSAgICAgICA9IGg4MzAwX25lX2lycVtoODMwMF9uZV9jb3VudF07CisJCWg4MzAwX25lX2NvdW50Kys7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogIFByb2JlIGZvciB2YXJpb3VzIG5vbi1zaGFyZWQtbWVtb3J5IGV0aGVyY2FyZHMuCisKKyAgIE5FeDAwMC1jbG9uZSBib2FyZHMgaGF2ZSBhIFN0YXRpb24gQWRkcmVzcyBQUk9NIChTQVBST00pIGluIHRoZSBwYWNrZXQKKyAgIGJ1ZmZlciBtZW1vcnkgc3BhY2UuICBORTIwMDAgY2xvbmVzIGhhdmUgMHg1NywweDU3IGluIGJ5dGVzIDB4MGUsMHgwZiBvZgorICAgdGhlIFNBUFJPTSwgd2hpbGUgb3RoZXIgc3VwcG9zZWQgTkUyMDAwIGNsb25lcyBtdXN0IGJlIGRldGVjdGVkIGJ5IHRoZWlyCisgICBTQSBwcmVmaXguCisKKyAgIFJlYWRpbmcgdGhlIFNBUFJPTSBmcm9tIGEgd29yZC13aWRlIGNhcmQgd2l0aCB0aGUgODM5MCBzZXQgaW4gYnl0ZS13aWRlCisgICBtb2RlIHJlc3VsdHMgaW4gZG91YmxlZCB2YWx1ZXMsIHdoaWNoIGNhbiBiZSBkZXRlY3RlZCBhbmQgY29tcGVuc2F0ZWQgZm9yLgorCisgICBUaGUgcHJvYmUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZSBjYXJkIGFuZCBmaWxsaW5nCisgICBpbiB0aGUgJ2RldicgYW5kICdlaV9zdGF0dXMnIHN0cnVjdHVyZXMuCisKKyAgIFdlIHVzZSB0aGUgbWluaW11bSBtZW1vcnkgc2l6ZSBmb3Igc29tZSBldGhlcmNhcmQgcHJvZHVjdCBsaW5lcywgaWZmIHdlIGNhbid0CisgICBkaXN0aW5ndWlzaCBtb2RlbHMuICBZb3UgY2FuIGluY3JlYXNlIHRoZSBwYWNrZXQgYnVmZmVyIHNpemUgYnkgc2V0dGluZworICAgUEFDS0VUQlVGX01FTVNJWkUuICBSZXBvcnRlZCBDYWJsZXRyb24gcGFja2V0IGJ1ZmZlciBsb2NhdGlvbnMgYXJlOgorCUUxMDEwICAgc3RhcnRzIGF0IDB4MTAwIGFuZCBlbmRzIGF0IDB4MjAwMC4KKwlFMTAxMC14IHN0YXJ0cyBhdCAweDEwMCBhbmQgZW5kcyBhdCAweDgwMDAuICgiLXgiIG1lYW5zICJtb3JlIG1lbW9yeSIpCisJRTIwMTAJIHN0YXJ0cyBhdCAweDEwMCBhbmQgZW5kcyBhdCAweDQwMDAuCisJRTIwMTAteCBzdGFydHMgYXQgMHgxMDAgYW5kIGVuZHMgYXQgMHhmZmZmLiAgKi8KKworc3RhdGljIGludCBfX2luaXQgZG9fbmVfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBGaXJzdCBjaGVjayBhbnkgc3VwcGxpZWQgaS9vIGxvY2F0aW9ucy4gVXNlciBrbm93cyBiZXN0LiA8Y291Z2g+ICovCisJaWYgKGJhc2VfYWRkciA+IDB4MWZmKQkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCXJldHVybiBuZV9wcm9iZTEoZGV2LCBiYXNlX2FkZHIpOworCWVsc2UgaWYgKGJhc2VfYWRkciAhPSAwKQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIE5FX0lPX0VYVEVOVCk7Cit9CisKKyNpZm5kZWYgTU9EVUxFCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBuZV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmIChpbml0X2RldihkZXYpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gaW5pdF9yZWdfb2Zmc2V0KGRldiwgZGV2LT5iYXNlX2FkZHIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gZG9fbmVfcHJvYmUoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJY2xlYW51cF9jYXJkKGRldik7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IG5lX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgU0FfcHJvbVsxNl07CisJaW50IHdvcmRsZW5ndGggPSAyOworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCWludCBzdGFydF9wYWdlLCBzdG9wX3BhZ2U7CisJaW50IHJlZzAsIHJldDsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIGJ1c193aWR0aDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBORV9JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJlZzAgPSBpbmJfcChpb2FkZHIpOworCWlmIChyZWcwID09IDB4RkYpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIERvIGEgcHJlbGltaW5hcnkgdmVyaWZpY2F0aW9uIHRoYXQgd2UgaGF2ZSBhIDgzOTAuICovCisJeworCQlpbnQgcmVnZDsKKwkJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UxK0U4MzkwX1NUT1AsIGlvYWRkciArIEU4MzkwX0NNRCk7CisJCXJlZ2QgPSBpbmJfcChpb2FkZHIgKyBFSV9TSElGVCgweDBkKSk7CisJCW91dGJfcCgweGZmLCBpb2FkZHIgKyBFSV9TSElGVCgweDBkKSk7CisJCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKwkJaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIwKTsgLyogQ2xlYXIgdGhlIGNvdW50ZXIgYnkgcmVhZGluZy4gKi8KKwkJaWYgKGluYl9wKGlvYWRkciArIEVOMF9DT1VOVEVSMCkgIT0gMCkgeworCQkJb3V0Yl9wKHJlZzAsIGlvYWRkciArIEVJX1NISUZUKDApKTsKKwkJCW91dGJfcChyZWdkLCBpb2FkZHIgKyBFSV9TSElGVCgweDBkKSk7CS8qIFJlc3RvcmUgdGhlIG9sZCB2YWx1ZXMuICovCisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCisJaWYgKGVpX2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uMSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJORSowMDAgZXRoZXJjYXJkIHByb2JlIGF0ICUwOHg6IiwgaW9hZGRyKTsKKworCS8qIFJlYWQgdGhlIDE2IGJ5dGVzIG9mIHN0YXRpb24gYWRkcmVzcyBQUk9NLgorCSAgIFdlIG11c3QgZmlyc3QgaW5pdGlhbGl6ZSByZWdpc3RlcnMsIHNpbWlsYXIgdG8gTlM4MzkwX2luaXQoZWlmZGV2LCAwKS4KKwkgICBXZSBjYW4ndCByZWxpYWJseSByZWFkIHRoZSBTQVBST00gYWRkcmVzcyB3aXRob3V0IHRoaXMuCisJICAgKEkgbGVhcm5lZCB0aGUgaGFyZCB3YXkhKS4gKi8KKwl7CisJCXN0cnVjdCB7dW5zaWduZWQgY2hhciB2YWx1ZSwgb2Zmc2V0OyB9IHByb2dyYW1fc2VxW10gPQorCQl7CisJCQl7RTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgRTgzOTBfQ01EfSwgLyogU2VsZWN0IHBhZ2UgMCovCisJCQl7MHg0OCwJRU4wX0RDRkd9LAkvKiBTZXQgYnl0ZS13aWRlICgweDQ4KSBhY2Nlc3MuICovCisJCQl7MHgwMCwJRU4wX1JDTlRMT30sCS8qIENsZWFyIHRoZSBjb3VudCByZWdzLiAqLworCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9JTVJ9LAkvKiBNYXNrIGNvbXBsZXRpb24gaXJxLiAqLworCQkJezB4RkYsCUVOMF9JU1J9LAorCQkJe0U4MzkwX1JYT0ZGLCBFTjBfUlhDUn0sCS8qIDB4MjAgIFNldCB0byBtb25pdG9yICovCisJCQl7RTgzOTBfVFhPRkYsIEVOMF9UWENSfSwJLyogMHgwMiAgYW5kIGxvb3BiYWNrIG1vZGUuICovCisJCQl7MzIsCUVOMF9SQ05UTE99LAorCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9SU0FSTE99LAkvKiBETUEgc3RhcnRpbmcgYXQgMHgwMDAwLiAqLworCQkJezB4MDAsCUVOMF9SU0FSSEl9LAorCQkJe0U4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBFODM5MF9DTUR9LAorCQl9OworCisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHJvZ3JhbV9zZXEpL3NpemVvZihwcm9ncmFtX3NlcVswXSk7IGkrKykKKwkJCW91dGJfcChwcm9ncmFtX3NlcVtpXS52YWx1ZSwgaW9hZGRyICsgcHJvZ3JhbV9zZXFbaV0ub2Zmc2V0KTsKKworCX0KKwlidXNfd2lkdGggPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilBQldDUjsKKwlidXNfd2lkdGggJj0gMSA8PCAoKGlvYWRkciA+PiAyMSkgJiA3KTsKKwllaV9zdGF0dXMud29yZDE2ID0gKGJ1c193aWR0aCA9PSAwKTsgLyogdGVtcG9yYXJ5IHNldHRpbmcgKi8KKwlmb3IoaSA9IDA7IGkgPCAxNiAvKnNpemVvZihTQV9wcm9tKSovOyBpKyspIHsKKwkJU0FfcHJvbVtpXSA9IGluYl9wKGlvYWRkciArIE5FX0RBVEFQT1JUKTsKKwkJaW5iX3AoaW9hZGRyICsgTkVfREFUQVBPUlQpOyAvKiBkdW1teSByZWFkICovCisJfQorCisJc3RhcnRfcGFnZSA9IE5FU01fU1RBUlRfUEc7CisJc3RvcF9wYWdlID0gTkVTTV9TVE9QX1BHOworCisJaWYgKGJ1c193aWR0aCkKKwkJd29yZGxlbmd0aCA9IDE7CisJZWxzZQorCQlvdXRiX3AoMHg0OSwgaW9hZGRyICsgRU4wX0RDRkcpOworCisJLyogU2V0IHVwIHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzLiAqLworCW5hbWUgPSAod29yZGxlbmd0aCA9PSAyKSA/ICJORTIwMDAiIDogIk5FMTAwMCI7CisKKwlpZiAoISBkZXYtPmlycSkgeworCQlwcmludGsoIiBmYWlsZWQgdG8gZGV0ZWN0IElSUSBsaW5lLlxuIik7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBTbmFyZiB0aGUgaW50ZXJydXB0IG5vdy4gIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gd2FpdGluZyBzaW5jZSB3ZSBjYW5ub3QKKwkgICBzaGFyZSBhbmQgdGhlIGJvYXJkIHdpbGwgdXN1YWxseSBiZSBlbmFibGVkLiAqLworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIDAsIG5hbWUsIGRldik7CisJaWYgKHJldCkgeworCQlwcmludGsgKCIgdW5hYmxlIHRvIGdldCBJUlEgJWQgKGVycm5vPSVkKS5cbiIsIGRldi0+aXJxLCByZXQpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKwlmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKSB7CisJCXByaW50aygiICUyLjJ4IiwgU0FfcHJvbVtpXSk7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSBTQV9wcm9tW2ldOworCX0KKworCXByaW50aygiXG4lczogJXMgZm91bmQgYXQgJSN4LCB1c2luZyBJUlEgJWQuXG4iLAorCQlkZXYtPm5hbWUsIG5hbWUsIGlvYWRkciwgZGV2LT5pcnEpOworCisJZWlfc3RhdHVzLm5hbWUgPSBuYW1lOworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZTsKKwllaV9zdGF0dXMuc3RvcF9wYWdlID0gc3RvcF9wYWdlOworCWVpX3N0YXR1cy53b3JkMTYgPSAod29yZGxlbmd0aCA9PSAyKTsKKworCWVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZSArIFRYX1BBR0VTOworI2lmZGVmIFBBQ0tFVEJVRl9NRU1TSVpFCisJIC8qIEFsbG93IHRoZSBwYWNrZXQgYnVmZmVyIHNpemUgdG8gYmUgb3ZlcnJpZGRlbiBieSBrbm93LWl0LWFsbHMuICovCisJZWlfc3RhdHVzLnN0b3BfcGFnZSA9IGVpX3N0YXR1cy50eF9zdGFydF9wYWdlICsgUEFDS0VUQlVGX01FTVNJWkU7CisjZW5kaWYKKworCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJm5lX3Jlc2V0XzgzOTA7CisJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJm5lX2Jsb2NrX2lucHV0OworCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmbmVfYmxvY2tfb3V0cHV0OworCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmbmVfZ2V0XzgzOTBfaGRyOworCWVpX3N0YXR1cy5wcml2ID0gMDsKKwlkZXYtPm9wZW4gPSAmbmVfb3BlbjsKKwlkZXYtPnN0b3AgPSAmbmVfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKwlOUzgzOTBfaW5pdChkZXYsIDApOworCXJldHVybiAwOworCitlcnJfb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgTkVfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG5lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllaV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKwllaV9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisvKiBIYXJkIHJlc2V0IHRoZSBjYXJkLiAgVGhpcyB1c2VkIHRvIHBhdXNlIGZvciB0aGUgc2FtZSBwZXJpb2QgdGhhdCBhCisgICA4MzkwIHJlc2V0IGNvbW1hbmQgcmVxdWlyZWQsIGJ1dCB0aGF0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuICovCisKK3N0YXRpYyB2b2lkIG5lX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHJlc2V0X3N0YXJ0X3RpbWUgPSBqaWZmaWVzOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICJyZXNldHRpbmcgdGhlIDgzOTAgdD0lbGQuLi4iLCBqaWZmaWVzKTsKKworCS8qIERPTidUIGNoYW5nZSB0aGVzZSB0byBpbmJfcC9vdXRiX3Agb3IgcmVzZXQgd2lsbCBmYWlsIG9uIGNsb25lcy4gKi8KKwlvdXRiKGluYihORV9CQVNFICsgTkVfUkVTRVQpLCBORV9CQVNFICsgTkVfUkVTRVQpOworCisJZWlfc3RhdHVzLnR4aW5nID0gMDsKKwllaV9zdGF0dXMuZG1haW5nID0gMDsKKworCS8qIFRoaXMgY2hlY2sgX3Nob3VsZF9ub3RfIGJlIG5lY2Vzc2FyeSwgb21pdCBldmVudHVhbGx5LiAqLworCXdoaWxlICgoaW5iX3AoTkVfQkFTRStFTjBfSVNSKSAmIEVOSVNSX1JFU0VUKSA9PSAwKQorCQlpZiAoamlmZmllcyAtIHJlc2V0X3N0YXJ0X3RpbWUgPiAyKkhaLzEwMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG5lX3Jlc2V0XzgzOTAoKSBkaWQgbm90IGNvbXBsZXRlLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJb3V0Yl9wKEVOSVNSX1JFU0VULCBORV9CQVNFICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworfQorCisvKiBHcmFiIHRoZSA4MzkwIHNwZWNpZmljIGhlYWRlci4gU2ltaWxhciB0byB0aGUgYmxvY2tfaW5wdXQgcm91dGluZSwgYnV0CisgICB3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcCBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQKKyAgIHRoZSBzdGFydCBvZiBhIHBhZ2UsIHNvIHdlIG9wdGltaXplIGFjY29yZGluZ2x5LiAqLworCitzdGF0aWMgdm9pZCBuZV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCisJaWYgKGVpX3N0YXR1cy5kbWFpbmcpCisJeworCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IERNQWluZyBjb25mbGljdCBpbiBuZV9nZXRfODM5MF9oZHIgIgorCQkJIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsCisJCQlkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIE5FX0JBU0UgKyBORV9DTUQpOworCW91dGJfcChzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpLCBORV9CQVNFICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDAsIE5FX0JBU0UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AoMCwgTkVfQkFTRSArIEVOMF9SU0FSTE8pOwkJLyogT24gcGFnZSBib3VuZGFyeSAqLworCW91dGJfcChyaW5nX3BhZ2UsIE5FX0JBU0UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIE5FX0JBU0UgKyBORV9DTUQpOworCisJaWYgKGVpX3N0YXR1cy53b3JkMTYpIHsKKwkJaW50IGxlbjsKKwkJdW5zaWduZWQgc2hvcnQgKnAgPSAodW5zaWduZWQgc2hvcnQgKiloZHI7CisJCWZvciAobGVuID0gc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKT4+MTsgbGVuID4gMDsgbGVuLS0pCisJCQkqcCsrID0gaW53KE5FX0JBU0UgKyBORV9EQVRBUE9SVCk7CisJfSBlbHNlCisJCWluc2IoTkVfQkFTRSArIE5FX0RBVEFQT1JULCBoZHIsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworCisJb3V0Yl9wKEVOSVNSX1JEQywgTkVfQkFTRSArIEVOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKwllaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworCisJbGUxNl90b19jcHVzKCZoZHItPmNvdW50KTsKK30KKworLyogQmxvY2sgaW5wdXQgYW5kIG91dHB1dCwgc2ltaWxhciB0byB0aGUgQ3J5bndyIHBhY2tldCBkcml2ZXIuICBJZiB5b3UKKyAgIGFyZSBwb3J0aW5nIHRvIGEgbmV3IGV0aGVyY2FyZCwgbG9vayBhdCB0aGUgcGFja2V0IGRyaXZlciBzb3VyY2UgZm9yIGhpbnRzLgorICAgVGhlIE5FeDAwMCBkb2Vzbid0IHNoYXJlIHRoZSBvbi1ib2FyZCBwYWNrZXQgbWVtb3J5IC0tIHlvdSBoYXZlIHRvIHB1dAorICAgdGhlIHBhY2tldCBvdXQgdGhyb3VnaCB0aGUgInJlbW90ZSBETUEiIGRhdGFwb3J0IHVzaW5nIG91dGIuICovCisKK3N0YXRpYyB2b2lkIG5lX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKKwlpbnQgeGZlcl9jb3VudCA9IGNvdW50OworI2VuZGlmCisJY2hhciAqYnVmID0gc2tiLT5kYXRhOworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCWlmIChlaV9zdGF0dXMuZG1haW5nKQorCXsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gbmVfYmxvY2tfaW5wdXQgIgorCQkJIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsCisJCQlkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwkJcmV0dXJuOworCX0KKwllaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7CisJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBORV9CQVNFICsgTkVfQ01EKTsKKwlvdXRiX3AoY291bnQgJiAweGZmLCBORV9CQVNFICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKGNvdW50ID4+IDgsIE5FX0JBU0UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AocmluZ19vZmZzZXQgJiAweGZmLCBORV9CQVNFICsgRU4wX1JTQVJMTyk7CisJb3V0Yl9wKHJpbmdfb2Zmc2V0ID4+IDgsIE5FX0JBU0UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIE5FX0JBU0UgKyBORV9DTUQpOworCWlmIChlaV9zdGF0dXMud29yZDE2KQorCXsKKwkJaW50IGxlbjsKKwkJdW5zaWduZWQgc2hvcnQgKnAgPSAodW5zaWduZWQgc2hvcnQgKilidWY7CisJCWZvciAobGVuID0gY291bnQ+PjE7IGxlbiA+IDA7IGxlbi0tKQorCQkJKnArKyA9IGludyhORV9CQVNFICsgTkVfREFUQVBPUlQpOworCQlpZiAoY291bnQgJiAweDAxKQorCQl7CisJCQlidWZbY291bnQtMV0gPSBpbmIoTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKKwkJCXhmZXJfY291bnQrKzsKKyNlbmRpZgorCQl9CisJfSBlbHNlIHsKKwkJaW5zYihORV9CQVNFICsgTkVfREFUQVBPUlQsIGJ1ZiwgY291bnQpOworCX0KKworI2lmZGVmIE5FX1NBTklUWV9DSEVDSworCS8qIFRoaXMgd2FzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCBidXQgZW5vdWdoIHBlb3BsZSBoYXZlCisJICAgYmVlbiBlbmNvdW50ZXJpbmcgcHJvYmxlbXMgc28gaXQgaXMgc3RpbGwgaGVyZS4gIElmIHlvdSBzZWUKKwkgICB0aGlzIG1lc3NhZ2UgeW91IGVpdGhlciAxKSBoYXZlIGEgc2xpZ2h0bHkgaW5jb21wYXRpYmxlIGNsb25lCisJICAgb3IgMikgaGF2ZSBub2lzZS9zcGVlZCBwcm9ibGVtcyB3aXRoIHlvdXIgYnVzLiAqLworCisJaWYgKGVpX2RlYnVnID4gMSkKKwl7CisJCS8qIERNQSB0ZXJtaW5hdGlvbiBhZGRyZXNzIGNoZWNrLi4uICovCisJCWludCBhZGRyLCB0cmllcyA9IDIwOworCQlkbyB7CisJCQkvKiBET04nVCBjaGVjayBmb3IgJ2luYl9wKEVOMF9JU1IpICYgRU5JU1JfUkRDJyBoZXJlCisJCQkgICAtLSBpdCdzIGJyb2tlbiBmb3IgUnggb24gc29tZSBjYXJkcyEgKi8KKwkJCWludCBoaWdoID0gaW5iX3AoTkVfQkFTRSArIEVOMF9SU0FSSEkpOworCQkJaW50IGxvdyA9IGluYl9wKE5FX0JBU0UgKyBFTjBfUlNBUkxPKTsKKwkJCWFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkJCWlmICgoKHJpbmdfb2Zmc2V0ICsgeGZlcl9jb3VudCkgJiAweGZmKSA9PSBsb3cpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tdHJpZXMgPiAwKTsKKwkgCWlmICh0cmllcyA8PSAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJYIHRyYW5zZmVyIGFkZHJlc3MgbWlzbWF0Y2gsIgorCQkJCSIlIzQuNHggKGV4cGVjdGVkKSB2cy4gJSM0LjR4IChhY3R1YWwpLlxuIiwKKwkJCQlkZXYtPm5hbWUsIHJpbmdfb2Zmc2V0ICsgeGZlcl9jb3VudCwgYWRkcik7CisJfQorI2VuZGlmCisJb3V0Yl9wKEVOSVNSX1JEQywgTkVfQkFTRSArIEVOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKwllaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworfQorCitzdGF0aWMgdm9pZCBuZV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKQoreworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGRtYV9zdGFydDsKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKKwlpbnQgcmV0cmllcyA9IDA7CisjZW5kaWYKKworCS8qIFJvdW5kIHRoZSBjb3VudCB1cCBmb3Igd29yZCB3cml0ZXMuICBEbyB3ZSBuZWVkIHRvIGRvIHRoaXM/CisJICAgV2hhdCBlZmZlY3Qgd2lsbCBhbiBvZGQgYnl0ZSBjb3VudCBoYXZlIG9uIHRoZSA4MzkwPworCSAgIEkgc2hvdWxkIGNoZWNrIHNvbWVkYXkuICovCisKKwlpZiAoZWlfc3RhdHVzLndvcmQxNiAmJiAoY291bnQgJiAweDAxKSkKKwkJY291bnQrKzsKKworCS8qIFRoaXMgKnNob3VsZG4ndCogaGFwcGVuLiBJZiBpdCBkb2VzLCBpdCdzIHRoZSBsYXN0IHRoaW5nIHlvdSdsbCBzZWUgKi8KKwlpZiAoZWlfc3RhdHVzLmRtYWluZykKKwl7CisJCXByaW50ayhLRVJOX0VNRVJHICIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2Jsb2NrX291dHB1dC4iCisJCQkiW0RNQXN0YXQ6JWRdW2lycWxvY2s6JWRdXG4iLAorCQkJZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jayk7CisJCXJldHVybjsKKwl9CisJZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworCS8qIFdlIHNob3VsZCBhbHJlYWR5IGJlIGluIHBhZ2UgMCwgYnV0IHRvIGJlIHNhZmUuLi4gKi8KKwlvdXRiX3AoRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQrRTgzOTBfTk9ETUEsIE5FX0JBU0UgKyBORV9DTUQpOworCisjaWZkZWYgTkVfU0FOSVRZX0NIRUNLCityZXRyeToKKyNlbmRpZgorCisjaWZkZWYgTkU4MzkwX1JXX0JVR0ZJWAorCS8qIEhhbmRsZSB0aGUgcmVhZC1iZWZvcmUtd3JpdGUgYnVnIHRoZSBzYW1lIHdheSBhcyB0aGUKKwkgICBDcnlud3IgcGFja2V0IGRyaXZlciAtLSB0aGUgTmF0U2VtaSBtZXRob2QgZG9lc24ndCB3b3JrLgorCSAgIEFjdHVhbGx5IHRoaXMgZG9lc24ndCBhbHdheXMgd29yayBlaXRoZXIsIGJ1dCBpZiB5b3UgaGF2ZQorCSAgIHByb2JsZW1zIHdpdGggeW91ciBORXgwMDAgdGhpcyBpcyBiZXR0ZXIgdGhhbiBub3RoaW5nISAqLworCisJb3V0Yl9wKDB4NDIsIE5FX0JBU0UgKyBFTjBfUkNOVExPKTsKKwlvdXRiX3AoMHgwMCwgTkVfQkFTRSArIEVOMF9SQ05USEkpOworCW91dGJfcCgweDQyLCBORV9CQVNFICsgRU4wX1JTQVJMTyk7CisJb3V0Yl9wKDB4MDAsIE5FX0JBU0UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIE5FX0JBU0UgKyBORV9DTUQpOworCS8qIE1ha2UgY2VydGFpbiB0aGF0IHRoZSBkdW1teSByZWFkIGhhcyBvY2N1cnJlZC4gKi8KKwl1ZGVsYXkoNik7CisjZW5kaWYKKworCW91dGJfcChFTklTUl9SREMsIE5FX0JBU0UgKyBFTjBfSVNSKTsKKworCS8qIE5vdyB0aGUgbm9ybWFsIG91dHB1dC4gKi8KKwlvdXRiX3AoY291bnQgJiAweGZmLCBORV9CQVNFICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKGNvdW50ID4+IDgsICAgTkVfQkFTRSArIEVOMF9SQ05USEkpOworCW91dGJfcCgweDAwLCBORV9CQVNFICsgRU4wX1JTQVJMTyk7CisJb3V0Yl9wKHN0YXJ0X3BhZ2UsIE5FX0JBU0UgKyBFTjBfUlNBUkhJKTsKKworCW91dGJfcChFODM5MF9SV1JJVEUrRTgzOTBfU1RBUlQsIE5FX0JBU0UgKyBORV9DTUQpOworCWlmIChlaV9zdGF0dXMud29yZDE2KSB7CisJCWludCBsZW47CisJCXVuc2lnbmVkIHNob3J0ICpwID0gKHVuc2lnbmVkIHNob3J0ICopYnVmOworCQlmb3IgKGxlbiA9IGNvdW50Pj4xOyBsZW4gPiAwOyBsZW4tLSkKKwkJCW91dHcoKnArKywgTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKKwl9IGVsc2UgeworCQlvdXRzYihORV9CQVNFICsgTkVfREFUQVBPUlQsIGJ1ZiwgY291bnQpOworCX0KKworCWRtYV9zdGFydCA9IGppZmZpZXM7CisKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKKwkvKiBUaGlzIHdhcyBmb3IgdGhlIEFMUEhBIHZlcnNpb24gb25seSwgYnV0IGVub3VnaCBwZW9wbGUgaGF2ZQorCSAgIGJlZW4gZW5jb3VudGVyaW5nIHByb2JsZW1zIHNvIGl0IGlzIHN0aWxsIGhlcmUuICovCisKKwlpZiAoZWlfZGVidWcgPiAxKQorCXsKKwkJLyogRE1BIHRlcm1pbmF0aW9uIGFkZHJlc3MgY2hlY2suLi4gKi8KKwkJaW50IGFkZHIsIHRyaWVzID0gMjA7CisJCWRvIHsKKwkJCWludCBoaWdoID0gaW5iX3AoTkVfQkFTRSArIEVOMF9SU0FSSEkpOworCQkJaW50IGxvdyA9IGluYl9wKE5FX0JBU0UgKyBFTjBfUlNBUkxPKTsKKwkJCWFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkJCWlmICgoc3RhcnRfcGFnZSA8PCA4KSArIGNvdW50ID09IGFkZHIpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tdHJpZXMgPiAwKTsKKworCQlpZiAodHJpZXMgPD0gMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFR4IHBhY2tldCB0cmFuc2ZlciBhZGRyZXNzIG1pc21hdGNoLCIKKwkJCQkiJSM0LjR4IChleHBlY3RlZCkgdnMuICUjNC40eCAoYWN0dWFsKS5cbiIsCisJCQkJZGV2LT5uYW1lLCAoc3RhcnRfcGFnZSA8PCA4KSArIGNvdW50LCBhZGRyKTsKKwkJCWlmIChyZXRyaWVzKysgPT0gMCkKKwkJCQlnb3RvIHJldHJ5OworCQl9CisJfQorI2VuZGlmCisKKwl3aGlsZSAoKGluYl9wKE5FX0JBU0UgKyBFTjBfSVNSKSAmIEVOSVNSX1JEQykgPT0gMCkKKwkJaWYgKGppZmZpZXMgLSBkbWFfc3RhcnQgPiAyKkhaLzEwMCkgewkJLyogMjBtcyAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgVHggUkRDLlxuIiwgZGV2LT5uYW1lKTsKKwkJCW5lX3Jlc2V0XzgzOTAoZGV2KTsKKwkJCU5TODM5MF9pbml0KGRldiwxKTsKKwkJCWJyZWFrOworCQl9CisKKwlvdXRiX3AoRU5JU1JfUkRDLCBORV9CQVNFICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7CisJcmV0dXJuOworfQorCisMCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIE1BWF9ORV9DQVJEUwkxCS8qIE1heCBudW1iZXIgb2YgTkUgY2FyZHMgcGVyIG1vZHVsZSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfbmVbTUFYX05FX0NBUkRTXTsKK3N0YXRpYyBpbnQgaW9bTUFYX05FX0NBUkRTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF9ORV9DQVJEU107CitzdGF0aWMgaW50IGJhZFtNQVhfTkVfQ0FSRFNdOwkvKiAweGJhZCA9IGJhZCBzaWcgb3Igbm8gcmVzZXQgYWNrICovCisKK01PRFVMRV9QQVJNKGlvLCAiMS0iIF9fTU9EVUxFX1NUUklORyhNQVhfTkVfQ0FSRFMpICJpIik7CitNT0RVTEVfUEFSTShpcnEsICIxLSIgX19NT0RVTEVfU1RSSU5HKE1BWF9ORV9DQVJEUykgImkiKTsKK01PRFVMRV9QQVJNKGJhZCwgIjEtIiBfX01PRFVMRV9TVFJJTkcoTUFYX05FX0NBUkRTKSAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBudW1iZXIocykiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSDgvMzAwIE5FMjAwMCBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogVGhpcyBpcyBzZXQgdXAgc28gdGhhdCBubyBJU0EgYXV0b3Byb2JlIHRha2VzIHBsYWNlLiBXZSBjYW4ndCBndWFyYW50ZWUKK3RoYXQgdGhlIG5lMmsgcHJvYmUgaXMgdGhlIGxhc3QgODM5MCBiYXNlZCBwcm9iZSB0byB0YWtlIHBsYWNlIChhcyBpdAoraXMgYXQgYm9vdCkgYW5kIHNvIHRoZSBwcm9iZSB3aWxsIGdldCBjb25mdXNlZCBieSBhbnkgb3RoZXIgODM5MCBjYXJkcy4KK0lTQSBkZXZpY2UgYXV0b3Byb2JlcyBvbiBhIHJ1bm5pbmcgbWFjaGluZSBhcmUgbm90IHJlY29tbWVuZGVkIGFueXdheS4gKi8KKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2LCBmb3VuZCA9IDA7CisJaW50IGVycjsKKworCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IE1BWF9ORV9DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWlmIChpb1t0aGlzX2Rldl0pIHsKKwkJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKKwkJCWRldi0+bWVtX2VuZCA9IGJhZFt0aGlzX2Rldl07CisJCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKKwkJfSBlbHNlIHsKKwkJCWRldi0+YmFzZV9hZGRyID0gaDgzMDBfbmVfYmFzZVt0aGlzX2Rldl07CisJCQlkZXYtPmlycSA9IGg4MzAwX25lX2lycVt0aGlzX2Rldl07CisJCX0KKwkJZXJyID0gaW5pdF9yZWdfb2Zmc2V0KGRldiwgZGV2LT5iYXNlX2FkZHIpOworCQlpZiAoIWVycikgeworCQkJaWYgKGRvX25lX3Byb2JlKGRldikgPT0gMCkgeworCQkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7CisJCQkJCWRldl9uZVtmb3VuZCsrXSA9IGRldjsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJfQorCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCWlmIChmb3VuZCkKKwkJCWJyZWFrOworCQlpZiAoaW9bdGhpc19kZXZdICE9IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJuZS5jOiBObyBORSowMDAgY2FyZCBmb3VuZCBhdCBpL28gPSAlI3hcbiIsIGRldi0+YmFzZV9hZGRyKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fTk9USUNFICJuZS5jOiBZb3UgbXVzdCBzdXBwbHkgXCJpbz0weE5OTlwiIHZhbHVlKHMpIGZvciBJU0EgY2FyZHMuXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJaWYgKGZvdW5kKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldjsKKworCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IE1BWF9ORV9DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X25lW3RoaXNfZGV2XTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25lLmMgYi9kcml2ZXJzL25ldC9uZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NjQzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uZS5jCkBAIC0wLDAgKzEsODYyIEBACisvKiBuZS5jOiBBIGdlbmVyYWwgbm9uLXNoYXJlZC1tZW1vcnkgTlM4MzkwIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguICovCisvKgorICAgIFdyaXR0ZW4gMTk5Mi05NCBieSBEb25hbGQgQmVja2VyLgorCisgICAgQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisKKyAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworICAgIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisgICAgU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uLCA0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMCwgQW5uYXBvbGlzIE1EIDIxNDAzCisKKyAgICBUaGlzIGRyaXZlciBzaG91bGQgd29yayB3aXRoIG1hbnkgcHJvZ3JhbW1lZC1JL08gODM5MC1iYXNlZCBldGhlcm5ldAorICAgIGJvYXJkcy4gIEN1cnJlbnRseSBpdCBzdXBwb3J0cyB0aGUgTkUxMDAwLCBORTIwMDAsIG1hbnkgY2xvbmVzLAorICAgIGFuZCBzb21lIENhYmxldHJvbiBwcm9kdWN0cy4KKworICAgIENoYW5nZWxvZzoKKworICAgIFBhdWwgR29ydG1ha2VyCTogdXNlIEVOSVNSX1JEQyB0byBtb25pdG9yIFR4IFBJTyB1cGxvYWRzLCBtYWRlCisJCQkgIHNhbml0eSBjaGVja3MgYW5kIGJhZCBjbG9uZSBzdXBwb3J0IG9wdGlvbmFsLgorICAgIFBhdWwgR29ydG1ha2VyCTogbmV3IHJlc2V0IGNvZGUsIHJlc2V0IGNhcmQgYWZ0ZXIgcHJvYmUgYXQgYm9vdC4KKyAgICBQYXVsIEdvcnRtYWtlcgk6IG11bHRpcGxlIGNhcmQgc3VwcG9ydCBmb3IgbW9kdWxlIHVzZXJzLgorICAgIFBhdWwgR29ydG1ha2VyCTogU3VwcG9ydCBmb3IgUENJIG5lMmsgY2xvbmVzLCBzaW1pbGFyIHRvIGxhbmNlLmMKKyAgICBQYXVsIEdvcnRtYWtlcgk6IEFsbG93IHVzZXJzIHdpdGggYmFkIGNhcmRzIHRvIGF2b2lkIGZ1bGwgcHJvYmUuCisgICAgUGF1bCBHb3J0bWFrZXIJOiBQQ0kgcHJvYmUgY2hhbmdlcywgbW9yZSBQQ0kgY2FyZHMgc3VwcG9ydGVkLgorICAgIHJqb2huc29uQGFuYWxvZ2ljLmNvbSA6IENoYW5nZWQgaW5pdCBvcmRlciBzbyBhbiBpbnRlcnJ1cHQgd2lsbCBvbmx5CisgICAgb2NjdXIgYWZ0ZXIgbWVtb3J5IGlzIGFsbG9jYXRlZCBmb3IgZGV2LT5wcml2LiBEZWFsbG9jYXRlZCBtZW1vcnkKKyAgICBsYXN0IGluIGNsZWFudXBfbW9kdWUoKQorICAgIFJpY2hhcmQgR3VlbnRoZXIgICAgOiBBZGRlZCBzdXBwb3J0IGZvciBJU0FQblAgY2FyZHMKKyAgICBQYXVsIEdvcnRtYWtlcgk6IERpc2NvbnRpbnVlZCBQQ0kgc3VwcG9ydCAtIHVzZSBuZTJrLXBjaS5jIGluc3RlYWQuCisgICAgSGF5YXRvIEZ1aml3YXJhCTogQWRkIG0zMnIgc3VwcG9ydC4KKworKi8KKworLyogUm91dGluZXMgZm9yIHRoZSBOYXRTZW1pLWJhc2VkIGRlc2lnbnMgKE5FWzEyXTAwMCkuICovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb24xW10gPQorIm5lLmM6djEuMTAgOS8yMy85NCBEb25hbGQgQmVja2VyIChiZWNrZXJAc2N5bGQuY29tKVxuIjsKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb24yW10gPQorIkxhc3QgbW9kaWZpZWQgTm92IDEsIDIwMDAgYnkgUGF1bCBHb3J0bWFrZXJcbiI7CisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaXNhcG5wLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworI2RlZmluZSBEUlZfTkFNRSAibmUiCisKKy8qIFNvbWUgZGVmaW5lcyB0aGF0IHBlb3BsZSBjYW4gcGxheSB3aXRoIGlmIHNvIGluY2xpbmVkLiAqLworCisvKiBEbyB3ZSBzdXBwb3J0IGNsb25lcyB0aGF0IGRvbid0IGFkaGVyZSB0byAxNCwxNSBvZiB0aGUgU0Fwcm9tID8gKi8KKyNkZWZpbmUgU1VQUE9SVF9ORV9CQURfQ0xPTkVTCisKKy8qIERvIHdlIHBlcmZvcm0gZXh0cmEgc2FuaXR5IGNoZWNrcyBvbiBzdHVmZiA/ICovCisvKiAjZGVmaW5lIE5FX1NBTklUWV9DSEVDSyAqLworCisvKiBEbyB3ZSBpbXBsZW1lbnQgdGhlIHJlYWQgYmVmb3JlIHdyaXRlIGJ1Z2ZpeCA/ICovCisvKiAjZGVmaW5lIE5FX1JXX0JVR0ZJWCAqLworCisvKiBEbyB3ZSBoYXZlIGEgbm9uIHN0ZC4gYW1vdW50IG9mIG1lbW9yeT8gKGluIHVuaXRzIG9mIDI1NiBieXRlIHBhZ2VzKSAqLworLyogI2RlZmluZSBQQUNLRVRCVUZfTUVNU0laRQkweDQwICovCisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSS9PIGFkZHJlc3NlcyB0byBiZSBwcm9iZWQgYXQgYm9vdC4gKi8KKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0geworCTB4MzAwLCAweDI4MCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMHgzODAsIDAKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpc2FwbnBfZGV2aWNlX2lkIGlzYXBucF9jbG9uZV9saXN0W10gX19pbml0ZGF0YSA9IHsKKwl7CUlTQVBOUF9DQVJEX0lEKCdBJywnWCcsJ0UnLDB4MjAxMSksCisJCUlTQVBOUF9WRU5ET1IoJ0EnLCdYJywnRScpLCBJU0FQTlBfRlVOQ1RJT04oMHgyMDExKSwKKwkJKGxvbmcpICJOZXRHZWFyIEVBMjAxIiB9LAorCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignRScsJ0QnLCdJJyksIElTQVBOUF9GVU5DVElPTigweDAyMTYpLAorCQkobG9uZykgIk5OIE5FMjAwMCIgfSwKKwl7CUlTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ1AnLCdOJywnUCcpLCBJU0FQTlBfRlVOQ1RJT04oMHg4MGQ2KSwKKwkJKGxvbmcpICJHZW5lcmljIFBOUCIgfSwKKwl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaXNhcG5wLCBpc2FwbnBfY2xvbmVfbGlzdCk7CisKKyNpZmRlZiBTVVBQT1JUX05FX0JBRF9DTE9ORVMKKy8qIEEgbGlzdCBvZiBiYWQgY2xvbmVzIHRoYXQgd2Ugbm9uZS10aGUtbGVzcyByZWNvZ25pemUuICovCitzdGF0aWMgc3RydWN0IHsgY29uc3QgY2hhciAqbmFtZTgsICpuYW1lMTY7IHVuc2lnbmVkIGNoYXIgU0FwcmVmaXhbNF07fQorYmFkX2Nsb25lX2xpc3RbXSBfX2luaXRkYXRhID0geworICAgIHsiREUxMDAiLCAiREUyMDAiLCB7MHgwMCwgMHhERSwgMHgwMSx9fSwKKyAgICB7IkRFMTIwIiwgIkRFMjIwIiwgezB4MDAsIDB4ODAsIDB4YzgsfX0sCisgICAgeyJERkkxMDAwIiwgIkRGSTIwMDAiLCB7J0QnLCAnRicsICdJJyx9fSwgLyogT3JpZ2luYWwsIGVoPyAgKi8KKyAgICB7IkV0aGVyTmV4dCBVVFA4IiwgIkV0aGVyTmV4dCBVVFAxNiIsIHsweDAwLCAweDAwLCAweDc5fX0sCisgICAgeyJORTEwMDAiLCJORTIwMDAtaW52YWxpZCIsIHsweDAwLCAweDAwLCAweGQ4fX0sIC8qIEFuY2llbnQgcmVhbCBORTEwMDAuICovCisgICAgeyJOTjEwMDAiLCAiTk4yMDAwIiwgIHsweDA4LCAweDAzLCAweDA4fX0sIC8qIE91dGxhdyBuby1uYW1lIGNsb25lLiAqLworICAgIHsiNC1ESU04IiwiNC1ESU0xNiIsIHsweDAwLDB4MDAsMHg0ZCx9fSwgIC8qIE91dGxhdyA0LURpbWVuc2lvbiBjYXJkcy4gKi8KKyAgICB7IkNvbi1JbnRsXzgiLCAiQ29uLUludGxfMTYiLCB7MHgwMCwgMHgwMCwgMHgyNH19LCAvKiBDb25uZWN0IEludCdubCAqLworICAgIHsiRVQtMTAwIiwiRVQtMjAwIiwgezB4MDAsIDB4NDUsIDB4NTR9fSwgLyogWUFORyBhbmQgWUEgY2xvbmUgKi8KKyAgICB7IkNPTVBFWCIsIkNPTVBFWDE2Iix7MHgwMCwweDgwLDB4NDh9fSwgLyogQnJva2VuIElTQSBDb21wZXggY2FyZHMgKi8KKyAgICB7IkUtTEFOMTAwIiwgIkUtTEFOMjAwIiwgezB4MDAsIDB4MDAsIDB4NWR9fSwgLyogQnJva2VuIG5lMTAwMCBjbG9uZXMgKi8KKyAgICB7IlBDTS00ODIzIiwgIlBDTS00ODIzIiwgezB4MDAsIDB4YzAsIDB4NmN9fSwgLyogQnJva2VuIEFkdmFudGVjaCBNb0JvICovCisgICAgeyJSRUFMVEVLIiwgIlJUTDgwMTkiLCB7MHgwMCwgMHgwMCwgMHhlOH19LCAvKiBuby1uYW1lIHdpdGggUmVhbHRlayBjaGlwICovCisgICAgeyJMQ1MtODgzNCIsICJMQ1MtODgzNiIsIHsweDA0LCAweDA0LCAweDM3fX0sIC8qIFNoaW55TmV0IChTRVQpICovCisgICAge05VTEwsfQorfTsKKyNlbmRpZgorCisvKiAtLS0tIE5vIHVzZXItc2VydmljZWFibGUgcGFydHMgYmVsb3cgLS0tLSAqLworCisjZGVmaW5lIE5FX0JBU0UJIChkZXYtPmJhc2VfYWRkcikKKyNkZWZpbmUgTkVfQ01ECSAJMHgwMAorI2RlZmluZSBORV9EQVRBUE9SVAkweDEwCS8qIE5hdFNlbWktZGVmaW5lZCBwb3J0IHdpbmRvdyBvZmZzZXQuICovCisjZGVmaW5lIE5FX1JFU0VUCTB4MWYJLyogSXNzdWUgYSByZWFkIHRvIHJlc2V0LCBhIHdyaXRlIHRvIGNsZWFyLiAqLworI2RlZmluZSBORV9JT19FWFRFTlQJMHgyMAorCisjZGVmaW5lIE5FMVNNX1NUQVJUX1BHCTB4MjAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgTkUxU01fU1RPUF9QRyAJMHg0MAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworI2RlZmluZSBORVNNX1NUQVJUX1BHCTB4NDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgTkVTTV9TVE9QX1BHCTB4ODAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKworI2lmZGVmIENPTkZJR19QTEFUX01BUFBJCisjICBkZWZpbmUgRENSX1ZBTCAweDRiCisjZWxpZiBDT05GSUdfUExBVF9PQUtTMzJSCisjICBkZWZpbmUgRENSX1ZBTCAweDQ4CisjZWxzZQorIyAgZGVmaW5lIERDUl9WQUwgMHg0OQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbmVfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworc3RhdGljIGludCBuZV9wcm9iZV9pc2FwbnAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgbmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIG5lX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBuZV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCSAgaW50IHJpbmdfcGFnZSk7CitzdGF0aWMgdm9pZCBuZV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkgIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCBuZV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgaW50IGNvdW50LAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKTsKKworDAorLyogIFByb2JlIGZvciB2YXJpb3VzIG5vbi1zaGFyZWQtbWVtb3J5IGV0aGVyY2FyZHMuCisKKyAgIE5FeDAwMC1jbG9uZSBib2FyZHMgaGF2ZSBhIFN0YXRpb24gQWRkcmVzcyBQUk9NIChTQVBST00pIGluIHRoZSBwYWNrZXQKKyAgIGJ1ZmZlciBtZW1vcnkgc3BhY2UuICBORTIwMDAgY2xvbmVzIGhhdmUgMHg1NywweDU3IGluIGJ5dGVzIDB4MGUsMHgwZiBvZgorICAgdGhlIFNBUFJPTSwgd2hpbGUgb3RoZXIgc3VwcG9zZWQgTkUyMDAwIGNsb25lcyBtdXN0IGJlIGRldGVjdGVkIGJ5IHRoZWlyCisgICBTQSBwcmVmaXguCisKKyAgIFJlYWRpbmcgdGhlIFNBUFJPTSBmcm9tIGEgd29yZC13aWRlIGNhcmQgd2l0aCB0aGUgODM5MCBzZXQgaW4gYnl0ZS13aWRlCisgICBtb2RlIHJlc3VsdHMgaW4gZG91YmxlZCB2YWx1ZXMsIHdoaWNoIGNhbiBiZSBkZXRlY3RlZCBhbmQgY29tcGVuc2F0ZWQgZm9yLgorCisgICBUaGUgcHJvYmUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZSBjYXJkIGFuZCBmaWxsaW5nCisgICBpbiB0aGUgJ2RldicgYW5kICdlaV9zdGF0dXMnIHN0cnVjdHVyZXMuCisKKyAgIFdlIHVzZSB0aGUgbWluaW11bSBtZW1vcnkgc2l6ZSBmb3Igc29tZSBldGhlcmNhcmQgcHJvZHVjdCBsaW5lcywgaWZmIHdlIGNhbid0CisgICBkaXN0aW5ndWlzaCBtb2RlbHMuICBZb3UgY2FuIGluY3JlYXNlIHRoZSBwYWNrZXQgYnVmZmVyIHNpemUgYnkgc2V0dGluZworICAgUEFDS0VUQlVGX01FTVNJWkUuICBSZXBvcnRlZCBDYWJsZXRyb24gcGFja2V0IGJ1ZmZlciBsb2NhdGlvbnMgYXJlOgorCUUxMDEwICAgc3RhcnRzIGF0IDB4MTAwIGFuZCBlbmRzIGF0IDB4MjAwMC4KKwlFMTAxMC14IHN0YXJ0cyBhdCAweDEwMCBhbmQgZW5kcyBhdCAweDgwMDAuICgiLXgiIG1lYW5zICJtb3JlIG1lbW9yeSIpCisJRTIwMTAJIHN0YXJ0cyBhdCAweDEwMCBhbmQgZW5kcyBhdCAweDQwMDAuCisJRTIwMTAteCBzdGFydHMgYXQgMHgxMDAgYW5kIGVuZHMgYXQgMHhmZmZmLiAgKi8KKworc3RhdGljIGludCBfX2luaXQgZG9fbmVfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisjaWZuZGVmIE1PRFVMRQorCWludCBvcmlnX2lycSA9IGRldi0+aXJxOworI2VuZGlmCisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBGaXJzdCBjaGVjayBhbnkgc3VwcGxpZWQgaS9vIGxvY2F0aW9ucy4gVXNlciBrbm93cyBiZXN0LiA8Y291Z2g+ICovCisJaWYgKGJhc2VfYWRkciA+IDB4MWZmKQkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCXJldHVybiBuZV9wcm9iZTEoZGV2LCBiYXNlX2FkZHIpOworCWVsc2UgaWYgKGJhc2VfYWRkciAhPSAwKQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisKKwkvKiBUaGVuIGxvb2sgZm9yIGFueSBpbnN0YWxsZWQgSVNBUG5QIGNsb25lcyAqLworCWlmIChpc2FwbnBfcHJlc2VudCgpICYmIChuZV9wcm9iZV9pc2FwbnAoZGV2KSA9PSAwKSkKKwkJcmV0dXJuIDA7CisKKyNpZm5kZWYgTU9EVUxFCisJLyogTGFzdCByZXNvcnQuIFRoZSBzZW1pLXJpc2t5IElTQSBhdXRvLXByb2JlLiAqLworCWZvciAoYmFzZV9hZGRyID0gMDsgbmV0Y2FyZF9wb3J0bGlzdFtiYXNlX2FkZHJdICE9IDA7IGJhc2VfYWRkcisrKSB7CisJCWludCBpb2FkZHIgPSBuZXRjYXJkX3BvcnRsaXN0W2Jhc2VfYWRkcl07CisJCWRldi0+aXJxID0gb3JpZ19pcnE7CisJCWlmIChuZV9wcm9iZTEoZGV2LCBpb2FkZHIpID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcG5wX2RldiAqaWRldiA9IChzdHJ1Y3QgcG5wX2RldiAqKWVpX3N0YXR1cy5wcml2OworCWlmIChpZGV2KQorCQlwbnBfZGV2aWNlX2RldGFjaChpZGV2KTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTkVfSU9fRVhURU5UKTsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IG5lX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwlpbnQgZXJyOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwllcnIgPSBkb19uZV9wcm9iZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwljbGVhbnVwX2NhcmQoZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgbmVfcHJvYmVfaXNhcG5wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpc2FwbnBfY2xvbmVfbGlzdFtpXS52ZW5kb3IgIT0gMDsgaSsrKSB7CisJCXN0cnVjdCBwbnBfZGV2ICppZGV2ID0gTlVMTDsKKworCQl3aGlsZSAoKGlkZXYgPSBwbnBfZmluZF9kZXYoTlVMTCwKKwkJCQkJICAgIGlzYXBucF9jbG9uZV9saXN0W2ldLnZlbmRvciwKKwkJCQkJICAgIGlzYXBucF9jbG9uZV9saXN0W2ldLmZ1bmN0aW9uLAorCQkJCQkgICAgaWRldikpKSB7CisJCQkvKiBBdm9pZCBhbHJlYWR5IGZvdW5kIGNhcmRzIGZyb20gcHJldmlvdXMgY2FsbHMgKi8KKwkJCWlmIChwbnBfZGV2aWNlX2F0dGFjaChpZGV2KSA8IDApCisJCQkJY29udGludWU7CisJCQlpZiAocG5wX2FjdGl2YXRlX2RldihpZGV2KSA8IDApIHsKKwkJCSAgICAgIAlwbnBfZGV2aWNlX2RldGFjaChpZGV2KTsKKwkJCSAgICAgIAljb250aW51ZTsKKwkJCX0KKwkJCS8qIGlmIG5vIGlvIGFuZCBpcnEsIHNlYXJjaCBmb3IgbmV4dCAqLworCQkJaWYgKCFwbnBfcG9ydF92YWxpZChpZGV2LCAwKSB8fCAhcG5wX2lycV92YWxpZChpZGV2LCAwKSkgeworCQkJCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogZm91bmQgaXQgKi8KKwkJCWRldi0+YmFzZV9hZGRyID0gcG5wX3BvcnRfc3RhcnQoaWRldiwgMCk7CisJCQlkZXYtPmlycSA9IHBucF9pcnEoaWRldiwgMCk7CisJCQlwcmludGsoS0VSTl9JTkZPICJuZS5jOiBJU0FQblAgcmVwb3J0cyAlcyBhdCBpL28gJSNseCwgaXJxICVkLlxuIiwKKwkJCQkoY2hhciAqKSBpc2FwbnBfY2xvbmVfbGlzdFtpXS5kcml2ZXJfZGF0YSwKKwkJCQlkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCQkJaWYgKG5lX3Byb2JlMShkZXYsIGRldi0+YmFzZV9hZGRyKSAhPSAwKSB7CS8qIFNob3VsZG4ndCBoYXBwZW4uICovCisJCQkJcHJpbnRrKEtFUk5fRVJSICJuZS5jOiBQcm9iZSBvZiBJU0FQblAgY2FyZCBhdCAlI2x4IGZhaWxlZC5cbiIsIGRldi0+YmFzZV9hZGRyKTsKKwkJCQlwbnBfZGV2aWNlX2RldGFjaChpZGV2KTsKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJfQorCQkJZWlfc3RhdHVzLnByaXYgPSAodW5zaWduZWQgbG9uZylpZGV2OworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFpZGV2KQorCQkJY29udGludWU7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IF9faW5pdCBuZV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIFNBX3Byb21bMzJdOworCWludCB3b3JkbGVuZ3RoID0gMjsKKwljb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKwlpbnQgc3RhcnRfcGFnZSwgc3RvcF9wYWdlOworCWludCBuZVgwMDAsIGN0cm9uLCBjb3BhbSwgYmFkX2NhcmQ7CisJaW50IHJlZzAsIHJldDsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIE5FX0lPX0VYVEVOVCwgRFJWX05BTUUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmVnMCA9IGluYl9wKGlvYWRkcik7CisJaWYgKHJlZzAgPT0gMHhGRikgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogRG8gYSBwcmVsaW1pbmFyeSB2ZXJpZmljYXRpb24gdGhhdCB3ZSBoYXZlIGEgODM5MC4gKi8KKwl7CisJCWludCByZWdkOworCQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTErRTgzOTBfU1RPUCwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKwkJcmVnZCA9IGluYl9wKGlvYWRkciArIDB4MGQpOworCQlvdXRiX3AoMHhmZiwgaW9hZGRyICsgMHgwZCk7CisJCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKwkJaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIwKTsgLyogQ2xlYXIgdGhlIGNvdW50ZXIgYnkgcmVhZGluZy4gKi8KKwkJaWYgKGluYl9wKGlvYWRkciArIEVOMF9DT1VOVEVSMCkgIT0gMCkgeworCQkJb3V0Yl9wKHJlZzAsIGlvYWRkcik7CisJCQlvdXRiX3AocmVnZCwgaW9hZGRyICsgMHgwZCk7CS8qIFJlc3RvcmUgdGhlIG9sZCB2YWx1ZXMuICovCisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCisJaWYgKGVpX2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiIEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uMSwgdmVyc2lvbjIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiTkUqMDAwIGV0aGVyY2FyZCBwcm9iZSBhdCAlIzN4OiIsIGlvYWRkcik7CisKKwkvKiBBIHVzZXIgd2l0aCBhIHBvb3IgY2FyZCB0aGF0IGZhaWxzIHRvIGFjayB0aGUgcmVzZXQsIG9yIHRoYXQKKwkgICBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgMHg1NywweDU3IHNpZ25hdHVyZSBjYW4gc3RpbGwgdXNlIHRoaXMKKwkgICB3aXRob3V0IGhhdmluZyB0byByZWNvbXBpbGUuIFNwZWNpZnlpbmcgYW4gaS9vIGFkZHJlc3MgYWxvbmcKKwkgICB3aXRoIGFuIG90aGVyd2lzZSB1bnVzZWQgZGV2LT5tZW1fZW5kIHZhbHVlIG9mICIweEJBRCIgd2lsbAorCSAgIGNhdXNlIHRoZSBkcml2ZXIgdG8gc2tpcCB0aGVzZSBwYXJ0cyBvZiB0aGUgcHJvYmUuICovCisKKwliYWRfY2FyZCA9ICgoZGV2LT5iYXNlX2FkZHIgIT0gMCkgJiYgKGRldi0+bWVtX2VuZCA9PSAweGJhZCkpOworCisJLyogUmVzZXQgY2FyZC4gV2hvIGtub3dzIHdoYXQgZGFpbi1icmFtYWdlZCBzdGF0ZSBpdCB3YXMgbGVmdCBpbi4gKi8KKworCXsKKwkJdW5zaWduZWQgbG9uZyByZXNldF9zdGFydF90aW1lID0gamlmZmllczsKKworCQkvKiBET04nVCBjaGFuZ2UgdGhlc2UgdG8gaW5iX3Avb3V0Yl9wIG9yIHJlc2V0IHdpbGwgZmFpbCBvbiBjbG9uZXMuICovCisJCW91dGIoaW5iKGlvYWRkciArIE5FX1JFU0VUKSwgaW9hZGRyICsgTkVfUkVTRVQpOworCisJCXdoaWxlICgoaW5iX3AoaW9hZGRyICsgRU4wX0lTUikgJiBFTklTUl9SRVNFVCkgPT0gMCkKKwkJaWYgKGppZmZpZXMgLSByZXNldF9zdGFydF90aW1lID4gMipIWi8xMDApIHsKKwkJCWlmIChiYWRfY2FyZCkgeworCQkJCXByaW50aygiICh3YXJuaW5nOiBubyByZXNldCBhY2spIik7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXByaW50aygiIG5vdCBmb3VuZCAobm8gcmVzZXQgYWNrKS5cbiIpOworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byBlcnJfb3V0OworCQkJfQorCQl9CisKKwkJb3V0Yl9wKDB4ZmYsIGlvYWRkciArIEVOMF9JU1IpOwkJLyogQWNrIGFsbCBpbnRyLiAqLworCX0KKworCS8qIFJlYWQgdGhlIDE2IGJ5dGVzIG9mIHN0YXRpb24gYWRkcmVzcyBQUk9NLgorCSAgIFdlIG11c3QgZmlyc3QgaW5pdGlhbGl6ZSByZWdpc3RlcnMsIHNpbWlsYXIgdG8gTlM4MzkwX2luaXQoZWlmZGV2LCAwKS4KKwkgICBXZSBjYW4ndCByZWxpYWJseSByZWFkIHRoZSBTQVBST00gYWRkcmVzcyB3aXRob3V0IHRoaXMuCisJICAgKEkgbGVhcm5lZCB0aGUgaGFyZCB3YXkhKS4gKi8KKwl7CisJCXN0cnVjdCB7dW5zaWduZWQgY2hhciB2YWx1ZSwgb2Zmc2V0OyB9IHByb2dyYW1fc2VxW10gPQorCQl7CisJCQl7RTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgRTgzOTBfQ01EfSwgLyogU2VsZWN0IHBhZ2UgMCovCisJCQl7MHg0OCwJRU4wX0RDRkd9LAkvKiBTZXQgYnl0ZS13aWRlICgweDQ4KSBhY2Nlc3MuICovCisJCQl7MHgwMCwJRU4wX1JDTlRMT30sCS8qIENsZWFyIHRoZSBjb3VudCByZWdzLiAqLworCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9JTVJ9LAkvKiBNYXNrIGNvbXBsZXRpb24gaXJxLiAqLworCQkJezB4RkYsCUVOMF9JU1J9LAorCQkJe0U4MzkwX1JYT0ZGLCBFTjBfUlhDUn0sCS8qIDB4MjAgIFNldCB0byBtb25pdG9yICovCisJCQl7RTgzOTBfVFhPRkYsIEVOMF9UWENSfSwJLyogMHgwMiAgYW5kIGxvb3BiYWNrIG1vZGUuICovCisJCQl7MzIsCUVOMF9SQ05UTE99LAorCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9SU0FSTE99LAkvKiBETUEgc3RhcnRpbmcgYXQgMHgwMDAwLiAqLworCQkJezB4MDAsCUVOMF9SU0FSSEl9LAorCQkJe0U4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBFODM5MF9DTUR9LAorCQl9OworCisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHJvZ3JhbV9zZXEpL3NpemVvZihwcm9ncmFtX3NlcVswXSk7IGkrKykKKwkJCW91dGJfcChwcm9ncmFtX3NlcVtpXS52YWx1ZSwgaW9hZGRyICsgcHJvZ3JhbV9zZXFbaV0ub2Zmc2V0KTsKKworCX0KKwlmb3IoaSA9IDA7IGkgPCAzMiAvKnNpemVvZihTQV9wcm9tKSovOyBpKz0yKSB7CisJCVNBX3Byb21baV0gPSBpbmIoaW9hZGRyICsgTkVfREFUQVBPUlQpOworCQlTQV9wcm9tW2krMV0gPSBpbmIoaW9hZGRyICsgTkVfREFUQVBPUlQpOworCQlpZiAoU0FfcHJvbVtpXSAhPSBTQV9wcm9tW2krMV0pCisJCQl3b3JkbGVuZ3RoID0gMTsKKwl9CisKKwlpZiAod29yZGxlbmd0aCA9PSAyKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlTQV9wcm9tW2ldID0gU0FfcHJvbVtpK2ldOworCQkvKiBXZSBtdXN0IHNldCB0aGUgODM5MCBmb3Igd29yZCBtb2RlLiAqLworCQlvdXRiX3AoRENSX1ZBTCwgaW9hZGRyICsgRU4wX0RDRkcpOworCQlzdGFydF9wYWdlID0gTkVTTV9TVEFSVF9QRzsKKwkJc3RvcF9wYWdlID0gTkVTTV9TVE9QX1BHOworCX0gZWxzZSB7CisJCXN0YXJ0X3BhZ2UgPSBORTFTTV9TVEFSVF9QRzsKKwkJc3RvcF9wYWdlID0gTkUxU01fU1RPUF9QRzsKKwl9CisKKyNpZiAgZGVmaW5lZChDT05GSUdfUExBVF9NQVBQSSkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9PQUtTMzJSKQorCW5lWDAwMCA9ICgoU0FfcHJvbVsxNF0gPT0gMHg1NyAgJiYgIFNBX3Byb21bMTVdID09IDB4NTcpCisJCXx8IChTQV9wcm9tWzE0XSA9PSAweDQyICYmIFNBX3Byb21bMTVdID09IDB4NDIpKTsKKyNlbHNlCisJbmVYMDAwID0gKFNBX3Byb21bMTRdID09IDB4NTcgICYmICBTQV9wcm9tWzE1XSA9PSAweDU3KTsKKyNlbmRpZgorCWN0cm9uID0gIChTQV9wcm9tWzBdID09IDB4MDAgJiYgU0FfcHJvbVsxXSA9PSAweDAwICYmIFNBX3Byb21bMl0gPT0gMHgxZCk7CisJY29wYW0gPSAgKFNBX3Byb21bMTRdID09IDB4NDkgJiYgU0FfcHJvbVsxNV0gPT0gMHgwMCk7CisKKwkvKiBTZXQgdXAgdGhlIHJlc3Qgb2YgdGhlIHBhcmFtZXRlcnMuICovCisJaWYgKG5lWDAwMCB8fCBiYWRfY2FyZCB8fCBjb3BhbSkgeworCQluYW1lID0gKHdvcmRsZW5ndGggPT0gMikgPyAiTkUyMDAwIiA6ICJORTEwMDAiOworCX0KKwllbHNlIGlmIChjdHJvbikKKwl7CisJCW5hbWUgPSAod29yZGxlbmd0aCA9PSAyKSA/ICJDdHJvbi04IiA6ICJDdHJvbi0xNiI7CisJCXN0YXJ0X3BhZ2UgPSAweDAxOworCQlzdG9wX3BhZ2UgPSAod29yZGxlbmd0aCA9PSAyKSA/IDB4NDAgOiAweDIwOworCX0KKwllbHNlCisJeworI2lmZGVmIFNVUFBPUlRfTkVfQkFEX0NMT05FUworCQkvKiBBY2shICBXZWxsLCB0aGVyZSBtaWdodCBiZSBhICpiYWQqIE5FKjAwMCBjbG9uZSB0aGVyZS4KKwkJICAgQ2hlY2sgZm9yIHRvdGFsIGJvZ3VzIGFkZHJlc3Nlcy4gKi8KKwkJZm9yIChpID0gMDsgYmFkX2Nsb25lX2xpc3RbaV0ubmFtZTg7IGkrKykKKwkJeworCQkJaWYgKFNBX3Byb21bMF0gPT0gYmFkX2Nsb25lX2xpc3RbaV0uU0FwcmVmaXhbMF0gJiYKKwkJCQlTQV9wcm9tWzFdID09IGJhZF9jbG9uZV9saXN0W2ldLlNBcHJlZml4WzFdICYmCisJCQkJU0FfcHJvbVsyXSA9PSBiYWRfY2xvbmVfbGlzdFtpXS5TQXByZWZpeFsyXSkKKwkJCXsKKwkJCQlpZiAod29yZGxlbmd0aCA9PSAyKQorCQkJCXsKKwkJCQkJbmFtZSA9IGJhZF9jbG9uZV9saXN0W2ldLm5hbWUxNjsKKwkJCQl9IGVsc2UgeworCQkJCQluYW1lID0gYmFkX2Nsb25lX2xpc3RbaV0ubmFtZTg7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChiYWRfY2xvbmVfbGlzdFtpXS5uYW1lOCA9PSBOVUxMKQorCQl7CisJCQlwcmludGsoIiBub3QgZm91bmQgKGludmFsaWQgc2lnbmF0dXJlICUyLjJ4ICUyLjJ4KS5cbiIsCisJCQkJU0FfcHJvbVsxNF0sIFNBX3Byb21bMTVdKTsKKwkJCXJldCA9IC1FTlhJTzsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorI2Vsc2UKKwkJcHJpbnRrKCIgbm90IGZvdW5kLlxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBlcnJfb3V0OworI2VuZGlmCisJfQorCisJaWYgKGRldi0+aXJxIDwgMikKKwl7CisJCXVuc2lnbmVkIGxvbmcgY29va2llID0gcHJvYmVfaXJxX29uKCk7CisJCW91dGJfcCgweDUwLCBpb2FkZHIgKyBFTjBfSU1SKTsJLyogRW5hYmxlIG9uZSBpbnRlcnJ1cHQuICovCisJCW91dGJfcCgweDAwLCBpb2FkZHIgKyBFTjBfUkNOVExPKTsKKwkJb3V0Yl9wKDB4MDAsIGlvYWRkciArIEVOMF9SQ05USEkpOworCQlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIGlvYWRkcik7IC8qIFRyaWdnZXIgaXQuLi4gKi8KKwkJbWRlbGF5KDEwKTsJCS8qIHdhaXQgMTBtcyBmb3IgaW50ZXJydXB0IHRvIHByb3BhZ2F0ZSAqLworCQlvdXRiX3AoMHgwMCwgaW9hZGRyICsgRU4wX0lNUik7IAkJLyogTWFzayBpdCBhZ2Fpbi4gKi8KKwkJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmKGNvb2tpZSk7CisJCWlmIChlaV9kZWJ1ZyA+IDIpCisJCQlwcmludGsoIiBhdXRvaXJxIGlzICVkXG4iLCBkZXYtPmlycSk7CisJfSBlbHNlIGlmIChkZXYtPmlycSA9PSAyKQorCQkvKiBGaXh1cCBmb3IgdXNlcnMgdGhhdCBkb24ndCBrbm93IHRoYXQgSVJRIDIgaXMgcmVhbGx5IElSUSA5LAorCQkgICBvciBkb24ndCBrbm93IHdoaWNoIG9uZSB0byBzZXQuICovCisJCWRldi0+aXJxID0gOTsKKworCWlmICghIGRldi0+aXJxKSB7CisJCXByaW50aygiIGZhaWxlZCB0byBkZXRlY3QgSVJRIGxpbmUuXG4iKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIFNuYXJmIHRoZSBpbnRlcnJ1cHQgbm93LiAgVGhlcmUncyBubyBwb2ludCBpbiB3YWl0aW5nIHNpbmNlIHdlIGNhbm5vdAorCSAgIHNoYXJlIGFuZCB0aGUgYm9hcmQgd2lsbCB1c3VhbGx5IGJlIGVuYWJsZWQuICovCisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgbmFtZSwgZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayAoIiB1bmFibGUgdG8gZ2V0IElSUSAlZCAoZXJybm89JWQpLlxuIiwgZGV2LT5pcnEsIHJldCk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworI2lmZGVmIENPTkZJR19QTEFUX01BUFBJCisJb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTEgKyBFODM5MF9TVE9QLAorCQlpb2FkZHIgKyBFODM5MF9DTUQpOyAvKiAweDYxICovCisJZm9yIChpID0gMCA7IGkgPCBFVEhFUl9BRERSX0xFTiA7IGkrKykgeworCQlkZXYtPmRldl9hZGRyW2ldID0gU0FfcHJvbVtpXQorCQkJPSBpbmJfcChpb2FkZHIgKyBFTjFfUEhZU19TSElGVChpKSk7CisJCXByaW50aygiICUyLjJ4IiwgU0FfcHJvbVtpXSk7CisJfQorI2Vsc2UKKwlmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKSB7CisJCXByaW50aygiICUyLjJ4IiwgU0FfcHJvbVtpXSk7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSBTQV9wcm9tW2ldOworCX0KKyNlbmRpZgorCisJcHJpbnRrKCJcbiVzOiAlcyBmb3VuZCBhdCAlI3gsIHVzaW5nIElSUSAlZC5cbiIsCisJCWRldi0+bmFtZSwgbmFtZSwgaW9hZGRyLCBkZXYtPmlycSk7CisKKwllaV9zdGF0dXMubmFtZSA9IG5hbWU7CisJZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wYWdlOworCWVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBzdG9wX3BhZ2U7CisjaWZkZWYgQ09ORklHX1BMQVRfT0FLUzMyUgorCWVpX3N0YXR1cy53b3JkMTYgPSAwOworI2Vsc2UKKwllaV9zdGF0dXMud29yZDE2ID0gKHdvcmRsZW5ndGggPT0gMik7CisjZW5kaWYKKworCWVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZSArIFRYX1BBR0VTOworI2lmZGVmIFBBQ0tFVEJVRl9NRU1TSVpFCisJIC8qIEFsbG93IHRoZSBwYWNrZXQgYnVmZmVyIHNpemUgdG8gYmUgb3ZlcnJpZGRlbiBieSBrbm93LWl0LWFsbHMuICovCisJZWlfc3RhdHVzLnN0b3BfcGFnZSA9IGVpX3N0YXR1cy50eF9zdGFydF9wYWdlICsgUEFDS0VUQlVGX01FTVNJWkU7CisjZW5kaWYKKworCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJm5lX3Jlc2V0XzgzOTA7CisJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJm5lX2Jsb2NrX2lucHV0OworCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmbmVfYmxvY2tfb3V0cHV0OworCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmbmVfZ2V0XzgzOTBfaGRyOworCWVpX3N0YXR1cy5wcml2ID0gMDsKKwlkZXYtPm9wZW4gPSAmbmVfb3BlbjsKKwlkZXYtPnN0b3AgPSAmbmVfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKwlOUzgzOTBfaW5pdChkZXYsIDApOworCXJldHVybiAwOworCitlcnJfb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgTkVfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG5lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllaV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKwllaV9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisvKiBIYXJkIHJlc2V0IHRoZSBjYXJkLiAgVGhpcyB1c2VkIHRvIHBhdXNlIGZvciB0aGUgc2FtZSBwZXJpb2QgdGhhdCBhCisgICA4MzkwIHJlc2V0IGNvbW1hbmQgcmVxdWlyZWQsIGJ1dCB0aGF0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuICovCisKK3N0YXRpYyB2b2lkIG5lX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHJlc2V0X3N0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJlc2V0dGluZyB0aGUgODM5MCB0PSVsZC4uLiIsIGppZmZpZXMpOworCisJLyogRE9OJ1QgY2hhbmdlIHRoZXNlIHRvIGluYl9wL291dGJfcCBvciByZXNldCB3aWxsIGZhaWwgb24gY2xvbmVzLiAqLworCW91dGIoaW5iKE5FX0JBU0UgKyBORV9SRVNFVCksIE5FX0JBU0UgKyBORV9SRVNFVCk7CisKKwllaV9zdGF0dXMudHhpbmcgPSAwOworCWVpX3N0YXR1cy5kbWFpbmcgPSAwOworCisJLyogVGhpcyBjaGVjayBfc2hvdWxkX25vdF8gYmUgbmVjZXNzYXJ5LCBvbWl0IGV2ZW50dWFsbHkuICovCisJd2hpbGUgKChpbmJfcChORV9CQVNFK0VOMF9JU1IpICYgRU5JU1JfUkVTRVQpID09IDApCisJCWlmIChqaWZmaWVzIC0gcmVzZXRfc3RhcnRfdGltZSA+IDIqSFovMTAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbmVfcmVzZXRfODM5MCgpIGRpZCBub3QgY29tcGxldGUuXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwlvdXRiX3AoRU5JU1JfUkVTRVQsIE5FX0JBU0UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCit9CisKKy8qIEdyYWIgdGhlIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiBTaW1pbGFyIHRvIHRoZSBibG9ja19pbnB1dCByb3V0aW5lLCBidXQKKyAgIHdlIGRvbid0IG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGggcmluZyB3cmFwIGFzIHRoZSBoZWFkZXIgd2lsbCBiZSBhdAorICAgdGhlIHN0YXJ0IG9mIGEgcGFnZSwgc28gd2Ugb3B0aW1pemUgYWNjb3JkaW5nbHkuICovCisKK3N0YXRpYyB2b2lkIG5lX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCWludCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCisJaWYgKGVpX3N0YXR1cy5kbWFpbmcpCisJeworCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IERNQWluZyBjb25mbGljdCBpbiBuZV9nZXRfODM5MF9oZHIgIgorCQkJIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsCisJCQlkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIG5pY19iYXNlKyBORV9DTUQpOworCW91dGJfcChzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpLCBuaWNfYmFzZSArIEVOMF9SQ05UTE8pOworCW91dGJfcCgwLCBuaWNfYmFzZSArIEVOMF9SQ05USEkpOworCW91dGJfcCgwLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOwkJLyogT24gcGFnZSBib3VuZGFyeSAqLworCW91dGJfcChyaW5nX3BhZ2UsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJb3V0Yl9wKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisKKwlpZiAoZWlfc3RhdHVzLndvcmQxNikKKwkJaW5zdyhORV9CQVNFICsgTkVfREFUQVBPUlQsIGhkciwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKT4+MSk7CisJZWxzZQorCQlpbnNiKE5FX0JBU0UgKyBORV9EQVRBUE9SVCwgaGRyLCBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpKTsKKworCW91dGJfcChFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7CisKKwlsZTE2X3RvX2NwdXMoJmhkci0+Y291bnQpOworfQorCisvKiBCbG9jayBpbnB1dCBhbmQgb3V0cHV0LCBzaW1pbGFyIHRvIHRoZSBDcnlud3IgcGFja2V0IGRyaXZlci4gIElmIHlvdQorICAgYXJlIHBvcnRpbmcgdG8gYSBuZXcgZXRoZXJjYXJkLCBsb29rIGF0IHRoZSBwYWNrZXQgZHJpdmVyIHNvdXJjZSBmb3IgaGludHMuCisgICBUaGUgTkV4MDAwIGRvZXNuJ3Qgc2hhcmUgdGhlIG9uLWJvYXJkIHBhY2tldCBtZW1vcnkgLS0geW91IGhhdmUgdG8gcHV0CisgICB0aGUgcGFja2V0IG91dCB0aHJvdWdoIHRoZSAicmVtb3RlIERNQSIgZGF0YXBvcnQgdXNpbmcgb3V0Yi4gKi8KKworc3RhdGljIHZvaWQgbmVfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisjaWZkZWYgTkVfU0FOSVRZX0NIRUNLCisJaW50IHhmZXJfY291bnQgPSBjb3VudDsKKyNlbmRpZgorCWludCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCWNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKworCS8qIFRoaXMgKnNob3VsZG4ndCogaGFwcGVuLiBJZiBpdCBkb2VzLCBpdCdzIHRoZSBsYXN0IHRoaW5nIHlvdSdsbCBzZWUgKi8KKwlpZiAoZWlfc3RhdHVzLmRtYWluZykKKwl7CisJCXByaW50ayhLRVJOX0VNRVJHICIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2Jsb2NrX2lucHV0ICIKKwkJCSJbRE1Bc3RhdDolZF1baXJxbG9jazolZF0uXG4iLAorCQkJZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jayk7CisJCXJldHVybjsKKwl9CisJZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UrIE5FX0NNRCk7CisJb3V0Yl9wKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBFTjBfUkNOVExPKTsKKwlvdXRiX3AoY291bnQgPj4gOCwgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AocmluZ19vZmZzZXQgJiAweGZmLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOworCW91dGJfcChyaW5nX29mZnNldCA+PiA4LCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCW91dGJfcChFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworCWlmIChlaV9zdGF0dXMud29yZDE2KQorCXsKKwkJaW5zdyhORV9CQVNFICsgTkVfREFUQVBPUlQsYnVmLGNvdW50Pj4xKTsKKwkJaWYgKGNvdW50ICYgMHgwMSkKKwkJeworCQkJYnVmW2NvdW50LTFdID0gaW5iKE5FX0JBU0UgKyBORV9EQVRBUE9SVCk7CisjaWZkZWYgTkVfU0FOSVRZX0NIRUNLCisJCQl4ZmVyX2NvdW50Kys7CisjZW5kaWYKKwkJfQorCX0gZWxzZSB7CisJCWluc2IoTkVfQkFTRSArIE5FX0RBVEFQT1JULCBidWYsIGNvdW50KTsKKwl9CisKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKKwkvKiBUaGlzIHdhcyBmb3IgdGhlIEFMUEhBIHZlcnNpb24gb25seSwgYnV0IGVub3VnaCBwZW9wbGUgaGF2ZQorCSAgIGJlZW4gZW5jb3VudGVyaW5nIHByb2JsZW1zIHNvIGl0IGlzIHN0aWxsIGhlcmUuICBJZiB5b3Ugc2VlCisJICAgdGhpcyBtZXNzYWdlIHlvdSBlaXRoZXIgMSkgaGF2ZSBhIHNsaWdodGx5IGluY29tcGF0aWJsZSBjbG9uZQorCSAgIG9yIDIpIGhhdmUgbm9pc2Uvc3BlZWQgcHJvYmxlbXMgd2l0aCB5b3VyIGJ1cy4gKi8KKworCWlmIChlaV9kZWJ1ZyA+IDEpCisJeworCQkvKiBETUEgdGVybWluYXRpb24gYWRkcmVzcyBjaGVjay4uLiAqLworCQlpbnQgYWRkciwgdHJpZXMgPSAyMDsKKwkJZG8geworCQkJLyogRE9OJ1QgY2hlY2sgZm9yICdpbmJfcChFTjBfSVNSKSAmIEVOSVNSX1JEQycgaGVyZQorCQkJICAgLS0gaXQncyBicm9rZW4gZm9yIFJ4IG9uIHNvbWUgY2FyZHMhICovCisJCQlpbnQgaGlnaCA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJCQlpbnQgbG93ID0gaW5iX3AobmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwkJCWFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkJCWlmICgoKHJpbmdfb2Zmc2V0ICsgeGZlcl9jb3VudCkgJiAweGZmKSA9PSBsb3cpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tdHJpZXMgPiAwKTsKKwkgCWlmICh0cmllcyA8PSAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJYIHRyYW5zZmVyIGFkZHJlc3MgbWlzbWF0Y2gsIgorCQkJCSIlIzQuNHggKGV4cGVjdGVkKSB2cy4gJSM0LjR4IChhY3R1YWwpLlxuIiwKKwkJCQlkZXYtPm5hbWUsIHJpbmdfb2Zmc2V0ICsgeGZlcl9jb3VudCwgYWRkcik7CisJfQorI2VuZGlmCisJb3V0Yl9wKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCisJZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKK30KKworc3RhdGljIHZvaWQgbmVfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSkKK3sKKwlpbnQgbmljX2Jhc2UgPSBORV9CQVNFOworCXVuc2lnbmVkIGxvbmcgZG1hX3N0YXJ0OworI2lmZGVmIE5FX1NBTklUWV9DSEVDSworCWludCByZXRyaWVzID0gMDsKKyNlbmRpZgorCisJLyogUm91bmQgdGhlIGNvdW50IHVwIGZvciB3b3JkIHdyaXRlcy4gIERvIHdlIG5lZWQgdG8gZG8gdGhpcz8KKwkgICBXaGF0IGVmZmVjdCB3aWxsIGFuIG9kZCBieXRlIGNvdW50IGhhdmUgb24gdGhlIDgzOTA/CisJICAgSSBzaG91bGQgY2hlY2sgc29tZWRheS4gKi8KKworCWlmIChlaV9zdGF0dXMud29yZDE2ICYmIChjb3VudCAmIDB4MDEpKQorCQljb3VudCsrOworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCWlmIChlaV9zdGF0dXMuZG1haW5nKQorCXsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gbmVfYmxvY2tfb3V0cHV0LiIKKwkJCSJbRE1Bc3RhdDolZF1baXJxbG9jazolZF1cbiIsCisJCQlkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwkJcmV0dXJuOworCX0KKwllaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7CisJLyogV2Ugc2hvdWxkIGFscmVhZHkgYmUgaW4gcGFnZSAwLCBidXQgdG8gYmUgc2FmZS4uLiAqLworCW91dGJfcChFODM5MF9QQUdFMCtFODM5MF9TVEFSVCtFODM5MF9OT0RNQSwgbmljX2Jhc2UgKyBORV9DTUQpOworCisjaWZkZWYgTkVfU0FOSVRZX0NIRUNLCityZXRyeToKKyNlbmRpZgorCisjaWZkZWYgTkU4MzkwX1JXX0JVR0ZJWAorCS8qIEhhbmRsZSB0aGUgcmVhZC1iZWZvcmUtd3JpdGUgYnVnIHRoZSBzYW1lIHdheSBhcyB0aGUKKwkgICBDcnlud3IgcGFja2V0IGRyaXZlciAtLSB0aGUgTmF0U2VtaSBtZXRob2QgZG9lc24ndCB3b3JrLgorCSAgIEFjdHVhbGx5IHRoaXMgZG9lc24ndCBhbHdheXMgd29yayBlaXRoZXIsIGJ1dCBpZiB5b3UgaGF2ZQorCSAgIHByb2JsZW1zIHdpdGggeW91ciBORXgwMDAgdGhpcyBpcyBiZXR0ZXIgdGhhbiBub3RoaW5nISAqLworCisJb3V0Yl9wKDB4NDIsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDB4MDAsICAgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AoMHg0MiwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwlvdXRiX3AoMHgwMCwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgTkVfQ01EKTsKKwkvKiBNYWtlIGNlcnRhaW4gdGhhdCB0aGUgZHVtbXkgcmVhZCBoYXMgb2NjdXJyZWQuICovCisJdWRlbGF5KDYpOworI2VuZGlmCisKKwlvdXRiX3AoRU5JU1JfUkRDLCBuaWNfYmFzZSArIEVOMF9JU1IpOworCisJLyogTm93IHRoZSBub3JtYWwgb3V0cHV0LiAqLworCW91dGJfcChjb3VudCAmIDB4ZmYsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKGNvdW50ID4+IDgsICAgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AoMHgwMCwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwlvdXRiX3Aoc3RhcnRfcGFnZSwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKworCW91dGJfcChFODM5MF9SV1JJVEUrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgTkVfQ01EKTsKKwlpZiAoZWlfc3RhdHVzLndvcmQxNikgeworCQlvdXRzdyhORV9CQVNFICsgTkVfREFUQVBPUlQsIGJ1ZiwgY291bnQ+PjEpOworCX0gZWxzZSB7CisJCW91dHNiKE5FX0JBU0UgKyBORV9EQVRBUE9SVCwgYnVmLCBjb3VudCk7CisJfQorCisJZG1hX3N0YXJ0ID0gamlmZmllczsKKworI2lmZGVmIE5FX1NBTklUWV9DSEVDSworCS8qIFRoaXMgd2FzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCBidXQgZW5vdWdoIHBlb3BsZSBoYXZlCisJICAgYmVlbiBlbmNvdW50ZXJpbmcgcHJvYmxlbXMgc28gaXQgaXMgc3RpbGwgaGVyZS4gKi8KKworCWlmIChlaV9kZWJ1ZyA+IDEpCisJeworCQkvKiBETUEgdGVybWluYXRpb24gYWRkcmVzcyBjaGVjay4uLiAqLworCQlpbnQgYWRkciwgdHJpZXMgPSAyMDsKKwkJZG8geworCQkJaW50IGhpZ2ggPSBpbmJfcChuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCQkJaW50IGxvdyA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisJCQlhZGRyID0gKGhpZ2ggPDwgOCkgKyBsb3c7CisJCQlpZiAoKHN0YXJ0X3BhZ2UgPDwgOCkgKyBjb3VudCA9PSBhZGRyKQorCQkJCWJyZWFrOworCQl9IHdoaWxlICgtLXRyaWVzID4gMCk7CisKKwkJaWYgKHRyaWVzIDw9IDApCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUeCBwYWNrZXQgdHJhbnNmZXIgYWRkcmVzcyBtaXNtYXRjaCwiCisJCQkJIiUjNC40eCAoZXhwZWN0ZWQpIHZzLiAlIzQuNHggKGFjdHVhbCkuXG4iLAorCQkJCWRldi0+bmFtZSwgKHN0YXJ0X3BhZ2UgPDwgOCkgKyBjb3VudCwgYWRkcik7CisJCQlpZiAocmV0cmllcysrID09IDApCisJCQkJZ290byByZXRyeTsKKwkJfQorCX0KKyNlbmRpZgorCisJd2hpbGUgKChpbmJfcChuaWNfYmFzZSArIEVOMF9JU1IpICYgRU5JU1JfUkRDKSA9PSAwKQorCQlpZiAoamlmZmllcyAtIGRtYV9zdGFydCA+IDIqSFovMTAwKSB7CQkvKiAyMG1zICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdGltZW91dCB3YWl0aW5nIGZvciBUeCBSREMuXG4iLCBkZXYtPm5hbWUpOworCQkJbmVfcmVzZXRfODM5MChkZXYpOworCQkJTlM4MzkwX2luaXQoZGV2LDEpOworCQkJYnJlYWs7CisJCX0KKworCW91dGJfcChFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7CisJcmV0dXJuOworfQorCisMCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIE1BWF9ORV9DQVJEUwk0CS8qIE1heCBudW1iZXIgb2YgTkUgY2FyZHMgcGVyIG1vZHVsZSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfbmVbTUFYX05FX0NBUkRTXTsKK3N0YXRpYyBpbnQgaW9bTUFYX05FX0NBUkRTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF9ORV9DQVJEU107CitzdGF0aWMgaW50IGJhZFtNQVhfTkVfQ0FSRFNdOwkvKiAweGJhZCA9IGJhZCBzaWcgb3Igbm8gcmVzZXQgYWNrICovCisKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoYmFkLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBiYXNlIGFkZHJlc3MoZXMpLHJlcXVpcmVkIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBudW1iZXIocykiKTsKK01PRFVMRV9QQVJNX0RFU0MoYmFkLCAiQWNjZXB0IGNhcmQocykgd2l0aCBiYWQgc2lnbmF0dXJlcyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJORTEwMDAvTkUyMDAwIElTQS9QblAgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFRoaXMgaXMgc2V0IHVwIHNvIHRoYXQgbm8gSVNBIGF1dG9wcm9iZSB0YWtlcyBwbGFjZS4gV2UgY2FuJ3QgZ3VhcmFudGVlCit0aGF0IHRoZSBuZTJrIHByb2JlIGlzIHRoZSBsYXN0IDgzOTAgYmFzZWQgcHJvYmUgdG8gdGFrZSBwbGFjZSAoYXMgaXQKK2lzIGF0IGJvb3QpIGFuZCBzbyB0aGUgcHJvYmUgd2lsbCBnZXQgY29uZnVzZWQgYnkgYW55IG90aGVyIDgzOTAgY2FyZHMuCitJU0EgZGV2aWNlIGF1dG9wcm9iZXMgb24gYSBydW5uaW5nIG1hY2hpbmUgYXJlIG5vdCByZWNvbW1lbmRlZCBhbnl3YXkuICovCisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX05FX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwkJaWYgKCFkZXYpCisJCQlicmVhazsKKwkJZGV2LT5pcnEgPSBpcnFbdGhpc19kZXZdOworCQlkZXYtPm1lbV9lbmQgPSBiYWRbdGhpc19kZXZdOworCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKKwkJaWYgKGRvX25lX3Byb2JlKGRldikgPT0gMCkgeworCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCQlkZXZfbmVbZm91bmQrK10gPSBkZXY7CisJCQkJY29udGludWU7CisJCQl9CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJfQorCQlmcmVlX25ldGRldihkZXYpOworCQlpZiAoZm91bmQpCisJCQlicmVhazsKKwkJaWYgKGlvW3RoaXNfZGV2XSAhPSAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibmUuYzogTm8gTkUqMDAwIGNhcmQgZm91bmQgYXQgaS9vID0gJSN4XG4iLCBpb1t0aGlzX2Rldl0pOworCQllbHNlCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIm5lLmM6IFlvdSBtdXN0IHN1cHBseSBcImlvPTB4Tk5OXCIgdmFsdWUocykgZm9yIElTQSBjYXJkcy5cbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiAtRU5PREVWOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX05FX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfbmVbdGhpc19kZXZdOworCQlpZiAoZGV2KSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorfQorI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUyLmMgYi9kcml2ZXJzL25ldC9uZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWJlZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmUyLmMKQEAgLTAsMCArMSw4MjkgQEAKKy8qIG5lMi5jOiBBIE5FLzIgRXRoZXJuZXQgRHJpdmVyIGZvciBMaW51eC4gKi8KKy8qCisgICBCYXNlZCBvbiB0aGUgTkUyMDAwIGRyaXZlciB3cml0dGVuIGJ5IERvbmFsZCBCZWNrZXIgKDE5OTItOTQpLgorICAgbW9kaWZpZWQgYnkgV2ltIER1bW9uIChBcHIgMTk5NikKKworICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyB3aW1waWVAbGludXguY2Mua3VsZXV2ZW4uYWMuYmUKKworICAgQ3VycmVudGx5IHN1cHBvcnRlZDogTkUvMgorICAgVGhpcyBwYXRjaCB3YXMgbmV2ZXIgdGVzdGVkIG9uIG90aGVyIE1DQS1ldGhlcm5ldCBhZGFwdGVycywgYnV0IGl0CisgICBtaWdodCB3b3JrLiBKdXN0IGdpdmUgaXQgYSB0cnkgYW5kIGxldCBtZSBrbm93IGlmIHlvdSBoYXZlIHByb2JsZW1zLgorICAgQWxzbyBtYWlsIG1lIGlmIGl0IHJlYWxseSB3b3JrcywgcGxlYXNlIQorCisgICBDaGFuZ2Vsb2c6CisgICBNb24gRmViICAzIDE2OjI2OjAyIE1FVCAxOTk3CisgICAtIGFkYXB0ZWQgdGhlIGRyaXZlciB0byB3b3JrIHdpdGggdGhlIDIuMS4yNSBrZXJuZWwKKyAgIC0gbXVsdGlwbGUgbmUyIHN1cHBvcnQgKHVudGVzdGVkKQorICAgLSBtb2R1bGUgc3VwcG9ydCAodW50ZXN0ZWQpCisKKyAgIEZyaSBBdWcgMjggMDA6MTg6MzYgQ0VUIDE5OTggKERhdmlkIFdlaW5laGFsbCkKKyAgIC0gZml4ZWQgYSBmZXcgbWlub3IgdHlwb3MKKyAgIC0gbWFkZSB0aGUgTU9EVUxFX1BBUk0gY29uZGl0aW9uYWwgKGl0IG9ubHkgd29ya3Mgd2l0aCB0aGUgdjIuMS54IGtlcm5lbHMpCisgICAtIGZpeGVkIHRoZSBtb2R1bGUgc3VwcG9ydCAoTm93IGl0J3Mgd29ya2luZy4uLikKKworICAgTW9uIFNlcCAgNyAxOTowMTo0NCBDRVQgMTk5OCAoRGF2aWQgV2VpbmVoYWxsKQorICAgLSBhZGRlZCBzdXBwb3J0IGZvciBBcmNvIEVsZWN0cm9uaWNzIEFFLzItY2FyZCAoZXhwZXJpbWVudGFsKQorCisgICBNb24gU2VwIDE0IDA5OjUzOjQyIENFVCAxOTk4IChEYXZpZCBXZWluZWhhbGwpCisgICAtIGFkZGVkIHN1cHBvcnQgZm9yIENvbXBleCBFTkVULTE2TUMvUCAoZXhwZXJpbWVudGFsKSAKKworICAgVHVlIFNlcCAxNSAxNjoyMToxMiBDRVQgMTk5OCAoRGF2aWQgV2VpbmVoYWxsLCBNYWdudXMgSm9uc3NvbiwgVG9tYXMgT2dyZW4pCisgICAtIE1pc2NlbGxhbmVvdXMgYnVnZml4ZXMKKworICAgVHVlIFNlcCAxOSAxNjoyMToxMiBDRVQgMTk5OCAoTWFnbnVzIEpvbnNzb24pCisgICAtIENsZWFudXAKKworICAgV2VkIFNlcCAyMyAxNDozMzozNCBDRVQgMTk5OCAoRGF2aWQgV2VpbmVoYWxsKQorICAgLSBSZXN0cnVjdHVyaW5nIGFuZCByZXdyaXRpbmcgZm9yIHYyLjEueCBjb21wbGlhbmNlCisKKyAgIFdlZCBPY3QgMTQgMTc6MTk6MjEgQ0VUIDE5OTggKERhdmlkIFdlaW5laGFsbCkKKyAgIC0gQWRkZWQgY29kZSB0aGF0IHVucmVnaXN0ZXJzIGlycSBhbmQgcHJvYy1pbmZvCisgICAtIFZlcnNpb24jIGJ1bXAKKworICAgTW9uIE5vdiAxNiAxNToyODoyMyBDRVQgMTk5OCAoV2ltIER1bW9uKQorICAgLSBwYXNzICdkZXYnIGFzIGxhc3QgcGFyYW1ldGVyIG9mIHJlcXVlc3RfaXJxIGluIHN0ZWFkIG9mICdOVUxMJyAgIAorCisgICBXZWQgRmViICA3IDIxOjI0OjAwIENFVCAyMDAxIChBbGZyZWQgQXJub2xkKQorICAgLSBhZGRlZCBzdXBwb3J0IGZvciB0aGUgRC1MaW5rIERFLTMyMENUCisgICAKKyAgICogICAgV0FSTklORworCS0tLS0tLS0KKwlUaGlzIGlzIGFscGhhLXRlc3Qgc29mdHdhcmUuICBJdCBpcyBub3QgZ3VhcmFudGVlZCB0byB3b3JrLiBBcyBhCisJbWF0dGVyIG9mIGZhY3QsIEknbSBxdWl0ZSBzdXJlIHRoZXJlIGFyZSAqTE9UUyogb2YgYnVncyBpbiBoZXJlLiBJCisJd291bGQgbGlrZSB0byBoZWFyIGZyb20geW91IGlmIHlvdSB1c2UgdGhpcyBkcml2ZXIsIGV2ZW4gaWYgaXQgd29ya3MuCisJSWYgaXQgZG9lc24ndCB3b3JrLCBiZSBzdXJlIHRvIHNlbmQgbWUgYSBtYWlsIHdpdGggdGhlIHByb2JsZW1zICEKKyovCisKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzaW9uID0gIm5lMi5jOnYwLjkxIE5vdiAxNiAxOTk4IFdpbSBEdW1vbiA8d2ltcGllQGtvdG5ldC5vcmc+XG4iOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS1sZWdhY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworI2RlZmluZSBEUlZfTkFNRSAibmUyIgorCisvKiBTb21lIGRlZmluZXMgdGhhdCBwZW9wbGUgY2FuIHBsYXkgd2l0aCBpZiBzbyBpbmNsaW5lZC4gKi8KKworLyogRG8gd2UgcGVyZm9ybSBleHRyYSBzYW5pdHkgY2hlY2tzIG9uIHN0dWZmID8gKi8KKy8qICNkZWZpbmUgTkVfU0FOSVRZX0NIRUNLICovCisKKy8qIERvIHdlIGltcGxlbWVudCB0aGUgcmVhZCBiZWZvcmUgd3JpdGUgYnVnZml4ID8gKi8KKy8qICNkZWZpbmUgTkVfUldfQlVHRklYICovCisKKy8qIERvIHdlIGhhdmUgYSBub24gc3RkLiBhbW91bnQgb2YgbWVtb3J5PyAoaW4gdW5pdHMgb2YgMjU2IGJ5dGUgcGFnZXMpICovCisvKiAjZGVmaW5lIFBBQ0tFVEJVRl9NRU1TSVpFCTB4NDAgKi8KKworCisvKiAtLS0tIE5vIHVzZXItc2VydmljZWFibGUgcGFydHMgYmVsb3cgLS0tLSAqLworCisjZGVmaW5lIE5FX0JBU0UJIChkZXYtPmJhc2VfYWRkcikKKyNkZWZpbmUgTkVfQ01ECSAJMHgwMAorI2RlZmluZSBORV9EQVRBUE9SVAkweDEwCS8qIE5hdFNlbWktZGVmaW5lZCBwb3J0IHdpbmRvdyBvZmZzZXQuICovCisjZGVmaW5lIE5FX1JFU0VUCTB4MjAJLyogSXNzdWUgYSByZWFkIHRvIHJlc2V0LCBhIHdyaXRlIHRvIGNsZWFyLiAqLworI2RlZmluZSBORV9JT19FWFRFTlQJMHgzMAorCisjZGVmaW5lIE5FMVNNX1NUQVJUX1BHCTB4MjAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgTkUxU01fU1RPUF9QRyAJMHg0MAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworI2RlZmluZSBORVNNX1NUQVJUX1BHCTB4NDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgTkVTTV9TVE9QX1BHCTB4ODAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKworLyogRnJvbSB0aGUgLkFERiBmaWxlOiAqLworc3RhdGljIHVuc2lnbmVkIGludCBhZGRyZXNzZXNbN10gX19pbml0ZGF0YSA9CisJCXsweDEwMDAsIDB4MjAyMCwgMHg4MDIwLCAweGEwYTAsIDB4YjBiMCwgMHhjMGMwLCAweGMzZDB9Oworc3RhdGljIGludCBpcnFzWzRdIF9faW5pdGRhdGEgPSB7MywgNCwgNSwgOX07CisKKy8qIEZyb20gdGhlIEQtTGluayBBREYgZmlsZTogKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGxpbmtfYWRkcmVzc2VzWzRdIF9faW5pdGRhdGEgPQorICAgICAgICAgICAgICAgIHsweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MH07CitzdGF0aWMgaW50IGRsaW5rX2lycXNbOF0gX19pbml0ZGF0YSA9IHszLCA0LCA1LCA5LCAxMCwgMTEsIDE0LCAxNX07CisKK3N0cnVjdCBuZTJfYWRhcHRlcnNfdCB7CisJdW5zaWduZWQgaW50CWlkOworCWNoYXIJCSpuYW1lOworfTsKKworc3RhdGljIHN0cnVjdCBuZTJfYWRhcHRlcnNfdCBuZTJfYWRhcHRlcnNbXSBfX2luaXRkYXRhID0geworCXsgMHg2MzU0LCAiQXJjbyBFdGhlcm5ldCBBZGFwdGVyIEFFLzIiIH0sCisJeyAweDcwREUsICJDb21wZXggRU5FVC0xNiBNQy9QIiB9LAorCXsgMHg3MTU0LCAiTm92ZWxsIEV0aGVybmV0IEFkYXB0ZXIgTkUvMiIgfSwKKyAgICAgICAgeyAweDU2ZWEsICJELUxpbmsgREUtMzIwQ1QiIH0sCisJeyAweDAwMDAsIE5VTEwgfQorfTsKKworZXh0ZXJuIGludCBuZXRjYXJkX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IG5lMl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNsb3QpOworCitzdGF0aWMgaW50IG5lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5lX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBuZV9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmVfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsCisJCWludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgbmVfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgbmVfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGludCBjb3VudCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSk7CisKKworLyoKKyAqIHNwZWNpYWwgY29kZSB0byByZWFkIHRoZSBERS0zMjAncyBNQUMgYWRkcmVzcyBFRVBST00uICBJbiBjb250cmFzdCB0byBhIAorICogc3RhbmRhcmQgTkUgZGVzaWduLCB0aGlzIGlzIGEgc2VyaWFsIEVFUFJPTSAoOTNDNDYpIHRoYXQgaGFzIHRvIGJlIHJlYWQKKyAqIGJpdCBieSBiaXQuICBUaGUgRUVQUk9NIGNvdHJvbCBwb3J0IGF0IGJhc2UgKyAweDFlIGhhcyB0aGUgZm9sbG93aW5nIAorICogbGF5b3V0OgorICoKKyAqIEJpdCAwID0gRGF0YSBvdXQgKHJlYWQgZnJvbSBFRVBST00pCisgKiBCaXQgMSA9IERhdGEgaW4gICh3cml0ZSB0byBFRVBST00pCisgKiBCaXQgMiA9IENsb2NrCisgKiBCaXQgMyA9IENoaXAgU2VsZWN0CisgKiBCaXQgNyA9IH41MCBrSHogY2xvY2sgZm9yIGRlZmluZWQgZGVsYXlzCisgKgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBkbGlua19wdXRfZWVwcm9tKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGludCBhZGRyKQoreworCWludCB6OworCXVuc2lnbmVkIGNoYXIgdjEsIHYyOworCisJLyogd3JpdGUgdGhlIHZhbHVlIHRvIHRoZSBOSUMgRUVQUk9NIHJlZ2lzdGVyICovCisKKwlvdXRiKHZhbHVlLCBhZGRyICsgMHgxZSk7CisKKwkvKiBub3cgd2FpdCB0aGUgY2xvY2sgbGluZSB0byB0b2dnbGUgdHdpY2UuICBFZmZlY3RpdmVseSwgd2UgYXJlCisJICAgd2FpdGluZyAoYXQgbGVhc3QpIGZvciBvbmUgY2xvY2sgY3ljbGUgKi8KKworCWZvciAoeiA9IDA7IHogPCAyOyB6KyspIHsKKwkJZG8geworCQkJdjEgPSBpbmIoYWRkciArIDB4MWUpOworCQkJdjIgPSBpbmIoYWRkciArIDB4MWUpOworCQl9CisJCXdoaWxlICghKCh2MSBeIHYyKSAmIDB4ODApKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkbGlua19zZW5kX2VlcHJvbV9iaXQodW5zaWduZWQgaW50IGJpdCwgdW5zaWduZWQgaW50IGFkZHIpCit7CisJLyogc2hpZnQgZGF0YSBiaXQgaW50byBjb3JyZWN0IHBvc2l0aW9uICovCisKKwliaXQgPSBiaXQgPDwgMTsKKworCS8qIHdyaXRlIHZhbHVlLCBrZWVwIGNsb2NrIGxpbmUgaGlnaCBmb3IgdHdvIGN5Y2xlcyAqLworCisJZGxpbmtfcHV0X2VlcHJvbSgweDA5IHwgYml0LCBhZGRyKTsKKwlkbGlua19wdXRfZWVwcm9tKDB4MGQgfCBiaXQsIGFkZHIpOworCWRsaW5rX3B1dF9lZXByb20oMHgwZCB8IGJpdCwgYWRkcik7CisJZGxpbmtfcHV0X2VlcHJvbSgweDA5IHwgYml0LCBhZGRyKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGRsaW5rX3NlbmRfZWVwcm9tX3dvcmQodW5zaWduZWQgaW50IHZhbHVlLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwlpbnQgejsKKworCS8qIGFkanVzdCBiaXRzIHNvIHRoYXQgdGhleSBhcmUgbGVmdC1hbGlnbmVkIGluIGEgMTYtYml0LXdvcmQgKi8KKworCXZhbHVlID0gdmFsdWUgPDwgKDE2IC0gbGVuKTsKKworCS8qIHNoaWZ0IGJpdHMgb3V0IHRvIHRoZSBFRVBST00gKi8KKworCWZvciAoeiA9IDA7IHogPCBsZW47IHorKykgeworCQlkbGlua19zZW5kX2VlcHJvbV9iaXQoKHZhbHVlICYgMHg4MDAwKSA+PiAxNSwgYWRkcik7CisJCXZhbHVlID0gdmFsdWUgPDwgMTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGRsaW5rX2dldF9lZXByb20odW5zaWduZWQgaW50IGVlYWRkciwgdW5zaWduZWQgaW50IGFkZHIpCit7CisJaW50IHo7CisJdW5zaWduZWQgaW50IHZhbHVlID0gMDsKKyAKKwkvKiBwdWxsIHRoZSBDUyBsaW5lIGxvdyBmb3IgYSBtb21lbnQuICBUaGlzIHJlc2V0cyB0aGUgRUVQUk9NLQorCSAgIGludGVybmFsIGxvZ2ljLCBhbmQgbWFrZXMgaXQgcmVhZHkgZm9yIGEgbmV3IGNvbW1hbmQuICovCisKKwlkbGlua19wdXRfZWVwcm9tKDB4MDEsIGFkZHIpOworCWRsaW5rX3B1dF9lZXByb20oMHgwOSwgYWRkcik7CisKKwkvKiBzZW5kIG9uZSBzdGFydCBiaXQsIHJlYWQgY29tbWFuZCAoMSAtIDApLCBwbHVzIHRoZSBhZGRyZXNzIHRvCisgICAgICAgICAgIHRoZSBFRVBST00gKi8KKworCWRsaW5rX3NlbmRfZWVwcm9tX3dvcmQoMHgwMTgwIHwgKGVlYWRkciAmIDB4M2YpLCA5LCBhZGRyKTsKKworCS8qIGdldCB0aGUgZGF0YSB3b3JkLiAgV2UgY2xvY2sgYnkgc2VuZGluZyAwcyB0byB0aGUgRUVQUk9NLCB3aGljaAorCSAgIGdldCBpZ25vcmVkIGR1cmluZyB0aGUgcmVhZCBwcm9jZXNzICovCisKKwlmb3IgKHogPSAwOyB6IDwgMTY7IHorKykgeworCQlkbGlua19zZW5kX2VlcHJvbV9iaXQoMCwgYWRkcik7CisJCXZhbHVlID0gKHZhbHVlIDw8IDEpIHwgKGluYihhZGRyICsgMHgxZSkgJiAweDAxKTsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBOb3RlIHRoYXQgYXQgYm9vdCwgdGhpcyBwcm9iZSBvbmx5IHBpY2tzIHVwIG9uZSBjYXJkIGF0IGEgdGltZS4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBkb19uZTJfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdGF0aWMgaW50IGN1cnJlbnRfbWNhX3Nsb3QgPSAtMTsKKwlpbnQgaTsKKwlpbnQgYWRhcHRlcl9mb3VuZCA9IDA7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBEbyBub3QgY2hlY2sgYW55IHN1cHBsaWVkIGkvbyBsb2NhdGlvbnMuIAorCSAgIFBPUyByZWdpc3RlcnMgdXN1YWxseSBkb24ndCBmYWlsIDopICovCisKKwkvKiBNQ0EgY2FyZHMgaGF2ZSBQT1MgcmVnaXN0ZXJzLiAgCisJICAgQXV0b2RldGVjdGluZyBNQ0EgY2FyZHMgaXMgZXh0cmVtZWx5IHNpbXBsZS4gCisJICAgSnVzdCBzZWFyY2ggZm9yIHRoZSBjYXJkLiAqLworCisJZm9yKGkgPSAwOyAobmUyX2FkYXB0ZXJzW2ldLm5hbWUgIT0gTlVMTCkgJiYgIWFkYXB0ZXJfZm91bmQ7IGkrKykgeworCQljdXJyZW50X21jYV9zbG90ID0gCisJCQltY2FfZmluZF91bnVzZWRfYWRhcHRlcihuZTJfYWRhcHRlcnNbaV0uaWQsIDApOworCisJCWlmKChjdXJyZW50X21jYV9zbG90ICE9IE1DQV9OT1RGT1VORCkgJiYgIWFkYXB0ZXJfZm91bmQpIHsKKwkJCWludCByZXM7CisJCQltY2Ffc2V0X2FkYXB0ZXJfbmFtZShjdXJyZW50X21jYV9zbG90LCAKKwkJCQkJbmUyX2FkYXB0ZXJzW2ldLm5hbWUpOworCQkJbWNhX21hcmtfYXNfdXNlZChjdXJyZW50X21jYV9zbG90KTsKKwkJCQorCQkJcmVzID0gbmUyX3Byb2JlMShkZXYsIGN1cnJlbnRfbWNhX3Nsb3QpOworCQkJaWYgKHJlcykKKwkJCQltY2FfbWFya19hc191bnVzZWQoY3VycmVudF9tY2Ffc2xvdCk7CisJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwltY2FfbWFya19hc191bnVzZWQoZWlfc3RhdHVzLnByaXYpOworCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oIGVpX3N0YXR1cy5wcml2LCBOVUxMLCBOVUxMKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTkVfSU9fRVhURU5UKTsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IG5lMl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gZG9fbmUyX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IG5lMl9wcm9jaW5mbyhjaGFyICpidWYsIGludCBzbG90LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBsZW49MDsKKworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJUaGUgTkUvMiBFdGhlcm5ldCBBZGFwdGVyXG4iICk7CisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIkRyaXZlciB3cml0dGVuIGJ5IFdpbSBEdW1vbiAiKTsKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiPHdpbXBpZUBrb3RuZXQub3JnPlxuIik7IAorCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJNb2RpZmllZCBieSAiKTsKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiRGF2aWQgV2VpbmVoYWxsIDx0YW9AYWNjLnVtdS5zZT5cbiIpOworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJhbmQgYnkgTWFnbnVzIEpvbnNzb24gPGJpZ2Zvb3RAYWNjLnVtdS5zZT5cbiIpOworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJCYXNlZCBvbiB0aGUgb3JpZ2luYWwgTkUyMDAwIGRyaXZlcnNcbiIgKTsKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiQmFzZSBJTzogJSN4XG4iLCAodW5zaWduZWQgaW50KWRldi0+YmFzZV9hZGRyKTsKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiSVJRICAgIDogJWRcbiIsIGRldi0+aXJxKTsKKworI2RlZmluZSBIV19BRERSKGkpIGRldi0+ZGV2X2FkZHJbaV0KKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiSFcgYWRkciA6ICV4OiV4OiV4OiV4OiV4OiV4XG4iLCAKKwkJCUhXX0FERFIoMCksIEhXX0FERFIoMSksIEhXX0FERFIoMiksIAorCQkJSFdfQUREUigzKSwgSFdfQUREUig0KSwgSFdfQUREUig1KSApOworI3VuZGVmIEhXX0FERFIKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG5lMl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNsb3QpCit7CisJaW50IGksIGJhc2VfYWRkciwgaXJxLCByZXR2YWw7CisJdW5zaWduZWQgY2hhciBQT1M7CisJdW5zaWduZWQgY2hhciBTQV9wcm9tWzMyXTsKKwljb25zdCBjaGFyICpuYW1lID0gIk5FLzIiOworCWludCBzdGFydF9wYWdlLCBzdG9wX3BhZ2U7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKworCWlmIChlaV9kZWJ1ZyAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwlwcmludGsoIk5FLzIgZXRoZXJjYXJkIGZvdW5kIGluIHNsb3QgJWQ6Iiwgc2xvdCk7CisKKwkvKiBSZWFkIGJhc2UgSU8gYW5kIElSUSBmcm9tIHRoZSBQT1MtcmVnaXN0ZXJzICovCisJUE9TID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCAyKTsKKwlpZighKFBPUyAlIDIpKSB7CisJCXByaW50aygiIGRpc2FibGVkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGhhbmRsZSBkaWZmZXJlbnQgUE9TIHJlZ2lzdGVyIHN0cnVjdHVyZSBmb3IgRC1MaW5rIGNhcmQgKi8KKworCWlmIChtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDApID09IDB4ZWEpIHsKKwkJYmFzZV9hZGRyID0gZGxpbmtfYWRkcmVzc2VzWyhQT1MgPj4gNSkgJiAweDAzXTsKKwkJaXJxID0gZGxpbmtfaXJxc1soUE9TID4+IDIpICYgMHgwN107CisJfQorICAgICAgICBlbHNlIHsKKwkJaSA9IChQT1MgJiAweEUpPj4xOworCQkvKiBwcmludGsoIkhhbGxlbHVqYSBzZG9nLCBhbHMgZXIgbmEgZGUgcGlqbCBlZW4gMSBzdGFhdCBpcyAxIC0gMSA9PSAwIgorCSAgIAkiIGVuIHpvdSBoZXQgbW9ldGVuIHdlcmtlbiAtPiAlZFxuIiwgaSk7CisJICAgCVRoZSBhYm92ZSBsaW5lIHdhcyBmb3IgcmVtb3RlIHRlc3RpbmcsIHRoYW54IHRvIHNkb2cgLi4uICovCisJCWJhc2VfYWRkciA9IGFkZHJlc3Nlc1tpIC0gMV07CisJCWlycSA9IGlycXNbKFBPUyAmIDB4NjApPj41XTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGJhc2VfYWRkciwgTkVfSU9fRVhURU5ULCBEUlZfTkFNRSkpCisJCXJldHVybiAtRUJVU1k7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiUE9TIGluZm8gOiBwb3MgMiA9ICUjeCA7IGJhc2UgPSAlI3ggOyBpcnEgPSAlbGRcbiIsIFBPUywKKwkJCWJhc2VfYWRkciwgaXJxKTsKKyNlbmRpZgorCisjaWZuZGVmIENSWU5XUl9XQVkKKwkvKiBSZXNldCB0aGUgY2FyZCB0aGUgd2F5IHRoZXkgZG8gaXQgaW4gdGhlIENyeW53ciBwYWNrZXQgZHJpdmVyICovCisJZm9yIChpPTA7IGk8ODsgaSsrKSAKKwkJb3V0YigweDAsIGJhc2VfYWRkciArIE5FX1JFU0VUKTsKKwlpbmIoYmFzZV9hZGRyICsgTkVfUkVTRVQpOworCW91dGIoMHgyMSwgYmFzZV9hZGRyICsgTkVfQ01EKTsKKwlpZiAoaW5iKGJhc2VfYWRkciArIE5FX0NNRCkgIT0gMHgyMSkgeworCQlwcmludGsoIk5FLzIgYWRhcHRlciBub3QgcmVzcG9uZGluZ1xuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEluIHRoZSBjcnlud3Igc291cmNlcyB0aGV5IGRvIGEgUkFNLXRlc3QgaGVyZS4gSSBza2lwIGl0LiBJIHN1cHBvc2UKKwkgICBteSBSQU0gaXMgb2theS4gIFN1cHBvc2UgeW91ciBtZW1vcnkgaXMgYnJva2VuLiAgVGhlbiB0aGlzIHRlc3QKKwkgICBzaG91bGQgZmFpbCBhbmQgeW91IHdvbid0IGJlIGFibGUgdG8gdXNlIHlvdXIgY2FyZC4gIEJ1dCBpZiBJIGRvIG5vdAorCSAgIHRlc3QsIHlvdSB3b24ndCBiZSBhYmxlIHRvIHVzZSB5b3VyIGNhcmQsIG5laXRoZXIuICBTbyB0aGlzIHRlc3QKKwkgICB3b24ndCBoZWxwIHlvdS4gKi8KKworI2Vsc2UgIC8qIF9JXyBuZXZlciB0ZXN0ZWQgaXQgdGhpcyB3YXkgLi4gR28gYWhlYWQgYW5kIHRyeSAuLi4qLworCS8qIFJlc2V0IGNhcmQuIFdobyBrbm93cyB3aGF0IGRhaW4tYnJhbWFnZWQgc3RhdGUgaXQgd2FzIGxlZnQgaW4uICovCisJeyAKKwkJdW5zaWduZWQgbG9uZyByZXNldF9zdGFydF90aW1lID0gamlmZmllczsKKworCQkvKiBET04nVCBjaGFuZ2UgdGhlc2UgdG8gaW5iX3Avb3V0Yl9wIG9yIHJlc2V0IHdpbGwgZmFpbCBvbiAKKwkJICAgY2xvbmVzLi4gKi8KKwkJb3V0YihpbmIoYmFzZV9hZGRyICsgTkVfUkVTRVQpLCBiYXNlX2FkZHIgKyBORV9SRVNFVCk7CisKKwkJd2hpbGUgKChpbmJfcChiYXNlX2FkZHIgKyBFTjBfSVNSKSAmIEVOSVNSX1JFU0VUKSA9PSAwKQorCQkJaWYgKGppZmZpZXMgLSByZXNldF9zdGFydF90aW1lID4gMipIWi8xMDApIHsKKwkJCQlwcmludGsoIiBub3QgZm91bmQgKG5vIHJlc2V0IGFjaykuXG4iKTsKKwkJCQlyZXR2YWwgPSAtRU5PREVWOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCW91dGJfcCgweGZmLCBiYXNlX2FkZHIgKyBFTjBfSVNSKTsgICAgICAgICAvKiBBY2sgYWxsIGludHIuICovCisJfQorI2VuZGlmCisKKworCS8qIFJlYWQgdGhlIDE2IGJ5dGVzIG9mIHN0YXRpb24gYWRkcmVzcyBQUk9NLgorCSAgIFdlIG11c3QgZmlyc3QgaW5pdGlhbGl6ZSByZWdpc3RlcnMsIHNpbWlsYXIgdG8gCisJICAgTlM4MzkwX2luaXQoZWlmZGV2LCAwKS4KKwkgICBXZSBjYW4ndCByZWxpYWJseSByZWFkIHRoZSBTQVBST00gYWRkcmVzcyB3aXRob3V0IHRoaXMuCisJICAgKEkgbGVhcm5lZCB0aGUgaGFyZCB3YXkhKS4gKi8KKwl7CisJCXN0cnVjdCB7IAorCQkJdW5zaWduZWQgY2hhciB2YWx1ZSwgb2Zmc2V0OyAKKwkJfSBwcm9ncmFtX3NlcVtdID0geworCQkJCQkJLyogU2VsZWN0IHBhZ2UgMCAqLworCQkJe0U4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIEU4MzkwX0NNRH0sIAorCQkJezB4NDksCUVOMF9EQ0ZHfSwgIC8qIFNldCBXT1JELXdpZGUgKDB4NDkpIGFjY2Vzcy4gKi8KKwkJCXsweDAwLAlFTjBfUkNOVExPfSwgIC8qIENsZWFyIHRoZSBjb3VudCByZWdzLiAqLworCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9JTVJ9LCAgLyogTWFzayBjb21wbGV0aW9uIGlycS4gKi8KKwkJCXsweEZGLAlFTjBfSVNSfSwKKwkJCXtFODM5MF9SWE9GRiwgRU4wX1JYQ1J9LCAgLyogMHgyMCAgU2V0IHRvIG1vbml0b3IgKi8KKwkJCXtFODM5MF9UWE9GRiwgRU4wX1RYQ1J9LCAgLyogMHgwMiAgYW5kIGxvb3BiYWNrIG1vZGUuICovCisJCQl7MzIsCUVOMF9SQ05UTE99LAorCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9SU0FSTE99LCAgLyogRE1BIHN0YXJ0aW5nIGF0IDB4MDAwMC4gKi8KKwkJCXsweDAwLAlFTjBfUlNBUkhJfSwKKwkJCXtFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgRTgzOTBfQ01EfSwKKwkJfTsKKworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHByb2dyYW1fc2VxKS9zaXplb2YocHJvZ3JhbV9zZXFbMF0pOyBpKyspCisJCQlvdXRiX3AocHJvZ3JhbV9zZXFbaV0udmFsdWUsIGJhc2VfYWRkciArIAorCQkJCXByb2dyYW1fc2VxW2ldLm9mZnNldCk7CisKKwl9CisJZm9yKGkgPSAwOyBpIDwgNiAvKnNpemVvZihTQV9wcm9tKSovOyBpKz0xKSB7CisJCVNBX3Byb21baV0gPSBpbmIoYmFzZV9hZGRyICsgTkVfREFUQVBPUlQpOworCX0KKworCS8qIEkgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSBwcmV2aW91cyBzZXF1ZW5jZSBpbmNsdWRlcyB0aGUgZ2VuZXJhbAorICAgICAgICAgICBib2FyZCByZXNldCBwcm9jZWR1cmUsIHNvIGJldHRlciBkb24ndCBvbWl0IGl0IGFuZCBqdXN0IG92ZXJ3cml0ZQorICAgICAgICAgICB0aGUgZ2FyYmFnZSByZWFkIGZyb20gYSBERS0zMjAgd2l0aCBjb3JyZWN0IHN0dWZmLiAqLworCisJaWYgKG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgMCkgPT0gMHhlYSkgeworCQl1bnNpZ25lZCBpbnQgdjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgCQkJdiA9IGRsaW5rX2dldF9lZXByb20oaSwgYmFzZV9hZGRyKTsKKwkJCVNBX3Byb21bKGkgPDwgMSkgICAgXSA9IHYgJiAweGZmOworCQkJU0FfcHJvbVsoaSA8PCAxKSArIDFdID0gKHYgPj4gOCkgJiAweGZmOworCQl9CisJfQorCisJc3RhcnRfcGFnZSA9IE5FU01fU1RBUlRfUEc7CisJc3RvcF9wYWdlID0gTkVTTV9TVE9QX1BHOworCisJZGV2LT5pcnE9aXJxOworCisJLyogU25hcmYgdGhlIGludGVycnVwdCBub3cuICBUaGVyZSdzIG5vIHBvaW50IGluIHdhaXRpbmcgc2luY2Ugd2UgY2Fubm90CisJICAgc2hhcmUgYW5kIHRoZSBib2FyZCB3aWxsIHVzdWFsbHkgYmUgZW5hYmxlZC4gKi8KKwlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCAwLCBEUlZfTkFNRSwgZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayAoIiB1bmFibGUgdG8gZ2V0IElSUSAlZCAoaXJxdmFsPSVkKS5cbiIsIAorCQkJCWRldi0+aXJxLCByZXR2YWwpOworCQlnb3RvIG91dDsKKwl9CisKKwlkZXYtPmJhc2VfYWRkciA9IGJhc2VfYWRkcjsKKworCWZvcihpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspIHsKKwkJcHJpbnRrKCIgJTIuMngiLCBTQV9wcm9tW2ldKTsKKwkJZGV2LT5kZXZfYWRkcltpXSA9IFNBX3Byb21baV07CisJfQorCisJcHJpbnRrKCJcbiVzOiAlcyBmb3VuZCBhdCAlI3gsIHVzaW5nIElSUSAlZC5cbiIsCisJCQlkZXYtPm5hbWUsIG5hbWUsIGJhc2VfYWRkciwgZGV2LT5pcnEpOworCisJbWNhX3NldF9hZGFwdGVyX3Byb2NmbihzbG90LCAoTUNBX1Byb2NGbikgbmUyX3Byb2NpbmZvLCBkZXYpOworCisJZWlfc3RhdHVzLm5hbWUgPSBuYW1lOworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZTsKKwllaV9zdGF0dXMuc3RvcF9wYWdlID0gc3RvcF9wYWdlOworCWVpX3N0YXR1cy53b3JkMTYgPSAoMiA9PSAyKTsKKworCWVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZSArIFRYX1BBR0VTOworI2lmZGVmIFBBQ0tFVEJVRl9NRU1TSVpFCisJLyogQWxsb3cgdGhlIHBhY2tldCBidWZmZXIgc2l6ZSB0byBiZSBvdmVycmlkZGVuIGJ5IGtub3ctaXQtYWxscy4gKi8KKwllaV9zdGF0dXMuc3RvcF9wYWdlID0gZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgKyBQQUNLRVRCVUZfTUVNU0laRTsKKyNlbmRpZgorCisJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmbmVfcmVzZXRfODM5MDsKKwllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmbmVfYmxvY2tfaW5wdXQ7CisJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZuZV9ibG9ja19vdXRwdXQ7CisJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZuZV9nZXRfODM5MF9oZHI7CisJCisJZWlfc3RhdHVzLnByaXYgPSBzbG90OworCQorCWRldi0+b3BlbiA9ICZuZV9vcGVuOworCWRldi0+c3RvcCA9ICZuZV9jbG9zZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCU5TODM5MF9pbml0KGRldiwgMCk7CisJcmV0dXJuIDA7CitvdXQ6CisJcmVsZWFzZV9yZWdpb24oYmFzZV9hZGRyLCBORV9JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgbmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVpX29wZW4oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKwllaV9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisvKiBIYXJkIHJlc2V0IHRoZSBjYXJkLiAgVGhpcyB1c2VkIHRvIHBhdXNlIGZvciB0aGUgc2FtZSBwZXJpb2QgdGhhdCBhCisgICA4MzkwIHJlc2V0IGNvbW1hbmQgcmVxdWlyZWQsIGJ1dCB0aGF0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuICovCitzdGF0aWMgdm9pZCBuZV9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyByZXNldF9zdGFydF90aW1lID0gamlmZmllczsKKworCWlmIChlaV9kZWJ1ZyA+IDEpIAorCQlwcmludGsoInJlc2V0dGluZyB0aGUgODM5MCB0PSVsZC4uLiIsIGppZmZpZXMpOworCisJLyogRE9OJ1QgY2hhbmdlIHRoZXNlIHRvIGluYl9wL291dGJfcCBvciByZXNldCB3aWxsIGZhaWwgb24gY2xvbmVzLiAqLworCW91dGIoaW5iKE5FX0JBU0UgKyBORV9SRVNFVCksIE5FX0JBU0UgKyBORV9SRVNFVCk7CisKKwllaV9zdGF0dXMudHhpbmcgPSAwOworCWVpX3N0YXR1cy5kbWFpbmcgPSAwOworCisJLyogVGhpcyBjaGVjayBfc2hvdWxkX25vdF8gYmUgbmVjZXNzYXJ5LCBvbWl0IGV2ZW50dWFsbHkuICovCisJd2hpbGUgKChpbmJfcChORV9CQVNFK0VOMF9JU1IpICYgRU5JU1JfUkVTRVQpID09IDApCisJCWlmIChqaWZmaWVzIC0gcmVzZXRfc3RhcnRfdGltZSA+IDIqSFovMTAwKSB7CisJCQlwcmludGsoIiVzOiBuZV9yZXNldF84MzkwKCkgZGlkIG5vdCBjb21wbGV0ZS5cbiIsIAorCQkJCQlkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwlvdXRiX3AoRU5JU1JfUkVTRVQsIE5FX0JBU0UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCit9CisKKy8qIEdyYWIgdGhlIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiBTaW1pbGFyIHRvIHRoZSBibG9ja19pbnB1dCByb3V0aW5lLCBidXQKKyAgIHdlIGRvbid0IG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGggcmluZyB3cmFwIGFzIHRoZSBoZWFkZXIgd2lsbCBiZSBhdAorICAgdGhlIHN0YXJ0IG9mIGEgcGFnZSwgc28gd2Ugb3B0aW1pemUgYWNjb3JkaW5nbHkuICovCisKK3N0YXRpYyB2b2lkIG5lX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCAKKwkJaW50IHJpbmdfcGFnZSkKK3sKKworCWludCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIAorCSAgIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJCXByaW50aygiJXM6IERNQWluZyBjb25mbGljdCBpbiBuZV9nZXRfODM5MF9oZHIgIgorCQkJCSJbRE1Bc3RhdDolZF1baXJxbG9jazolZF0uXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfc3RhdHVzLmRtYWluZywgZWlfc3RhdHVzLmlycWxvY2spOworCQlyZXR1cm47CisJfQorCisJZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UrIE5FX0NNRCk7CisJb3V0Yl9wKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkciksIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDAsIG5pY19iYXNlICsgRU4wX1JDTlRISSk7CisJb3V0Yl9wKDAsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CQkvKiBPbiBwYWdlIGJvdW5kYXJ5ICovCisJb3V0Yl9wKHJpbmdfcGFnZSwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgTkVfQ01EKTsKKworCWlmIChlaV9zdGF0dXMud29yZDE2KQorCQlpbnN3KE5FX0JBU0UgKyBORV9EQVRBUE9SVCwgaGRyLCAKKwkJCQlzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpPj4xKTsKKwllbHNlCisJCWluc2IoTkVfQkFTRSArIE5FX0RBVEFQT1JULCBoZHIsIAorCQkJCXNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworCisJb3V0Yl9wKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCisJZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKK30KKworLyogQmxvY2sgaW5wdXQgYW5kIG91dHB1dCwgc2ltaWxhciB0byB0aGUgQ3J5bndyIHBhY2tldCBkcml2ZXIuICBJZiB5b3UKKyAgIGFyZSBwb3J0aW5nIHRvIGEgbmV3IGV0aGVyY2FyZCwgbG9vayBhdCB0aGUgcGFja2V0IGRyaXZlciBzb3VyY2UgZm9yCisgICBoaW50cy4gVGhlIE5FeDAwMCBkb2Vzbid0IHNoYXJlIHRoZSBvbi1ib2FyZCBwYWNrZXQgbWVtb3J5IC0tIHlvdSBoYXZlCisgICB0byBwdXQgdGhlIHBhY2tldCBvdXQgdGhyb3VnaCB0aGUgInJlbW90ZSBETUEiIGRhdGFwb3J0IHVzaW5nIG91dGIuICovCisKK3N0YXRpYyB2b2lkIG5lX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCWludCByaW5nX29mZnNldCkKK3sKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKKwlpbnQgeGZlcl9jb3VudCA9IGNvdW50OworI2VuZGlmCisJaW50IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJY2hhciAqYnVmID0gc2tiLT5kYXRhOworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIAorCSAgIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJCXByaW50aygiJXM6IERNQWluZyBjb25mbGljdCBpbiBuZV9ibG9ja19pbnB1dCAiCisJCQkJIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsCisJCQkJZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jayk7CisJCXJldHVybjsKKwl9CisJZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UrIE5FX0NNRCk7CisJb3V0Yl9wKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBFTjBfUkNOVExPKTsKKwlvdXRiX3AoY291bnQgPj4gOCwgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AocmluZ19vZmZzZXQgJiAweGZmLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOworCW91dGJfcChyaW5nX29mZnNldCA+PiA4LCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCW91dGJfcChFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworCWlmIChlaV9zdGF0dXMud29yZDE2KSB7CisJCWluc3coTkVfQkFTRSArIE5FX0RBVEFQT1JULGJ1Zixjb3VudD4+MSk7CisJCWlmIChjb3VudCAmIDB4MDEpIHsKKwkJCWJ1Zltjb3VudC0xXSA9IGluYihORV9CQVNFICsgTkVfREFUQVBPUlQpOworI2lmZGVmIE5FX1NBTklUWV9DSEVDSworCQkJeGZlcl9jb3VudCsrOworI2VuZGlmCisJCX0KKwl9IGVsc2UgeworCQlpbnNiKE5FX0JBU0UgKyBORV9EQVRBUE9SVCwgYnVmLCBjb3VudCk7CisJfQorCisjaWZkZWYgTkVfU0FOSVRZX0NIRUNLCisJLyogVGhpcyB3YXMgZm9yIHRoZSBBTFBIQSB2ZXJzaW9uIG9ubHksIGJ1dCBlbm91Z2ggcGVvcGxlIGhhdmUKKwkgICBiZWVuIGVuY291bnRlcmluZyBwcm9ibGVtcyBzbyBpdCBpcyBzdGlsbCBoZXJlLiAgSWYgeW91IHNlZQorCSAgIHRoaXMgbWVzc2FnZSB5b3UgZWl0aGVyIDEpIGhhdmUgYSBzbGlnaHRseSBpbmNvbXBhdGlibGUgY2xvbmUKKwkgICBvciAyKSBoYXZlIG5vaXNlL3NwZWVkIHByb2JsZW1zIHdpdGggeW91ciBidXMuICovCisJaWYgKGVpX2RlYnVnID4gMSkgewkvKiBETUEgdGVybWluYXRpb24gYWRkcmVzcyBjaGVjay4uLiAqLworCQlpbnQgYWRkciwgdHJpZXMgPSAyMDsKKwkJZG8geworCQkJLyogRE9OJ1QgY2hlY2sgZm9yICdpbmJfcChFTjBfSVNSKSAmIEVOSVNSX1JEQycgaGVyZQorCQkJICAgLS0gaXQncyBicm9rZW4gZm9yIFJ4IG9uIHNvbWUgY2FyZHMhICovCisJCQlpbnQgaGlnaCA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJCQlpbnQgbG93ID0gaW5iX3AobmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwkJCWFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkJCWlmICgoKHJpbmdfb2Zmc2V0ICsgeGZlcl9jb3VudCkgJiAweGZmKSA9PSBsb3cpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tdHJpZXMgPiAwKTsKKwkJaWYgKHRyaWVzIDw9IDApCisJCQlwcmludGsoIiVzOiBSWCB0cmFuc2ZlciBhZGRyZXNzIG1pc21hdGNoLCIKKwkJCQkiJSM0LjR4IChleHBlY3RlZCkgdnMuICUjNC40eCAoYWN0dWFsKS5cbiIsCisJCQkJZGV2LT5uYW1lLCByaW5nX29mZnNldCArIHhmZXJfY291bnQsIGFkZHIpOworCX0KKyNlbmRpZgorCW91dGJfcChFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7Cit9CisKK3N0YXRpYyB2b2lkIG5lX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpCit7CisJaW50IG5pY19iYXNlID0gTkVfQkFTRTsKKwl1bnNpZ25lZCBsb25nIGRtYV9zdGFydDsKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKKwlpbnQgcmV0cmllcyA9IDA7CisjZW5kaWYKKworCS8qIFJvdW5kIHRoZSBjb3VudCB1cCBmb3Igd29yZCB3cml0ZXMuIERvIHdlIG5lZWQgdG8gZG8gdGhpcz8KKwkgICBXaGF0IGVmZmVjdCB3aWxsIGFuIG9kZCBieXRlIGNvdW50IGhhdmUgb24gdGhlIDgzOTA/CisJICAgSSBzaG91bGQgY2hlY2sgc29tZWRheS4gKi8KKwlpZiAoZWlfc3RhdHVzLndvcmQxNiAmJiAoY291bnQgJiAweDAxKSkKKwkJY291bnQrKzsKKworCS8qIFRoaXMgKnNob3VsZG4ndCogaGFwcGVuLiAKKwkgICBJZiBpdCBkb2VzLCBpdCdzIHRoZSBsYXN0IHRoaW5nIHlvdSdsbCBzZWUgKi8KKwlpZiAoZWlfc3RhdHVzLmRtYWluZykgeworCQlwcmludGsoIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gbmVfYmxvY2tfb3V0cHV0LiIKKwkJCQkiW0RNQXN0YXQ6JWRdW2lycWxvY2s6JWRdXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfc3RhdHVzLmRtYWluZywgZWlfc3RhdHVzLmlycWxvY2spOworCQlyZXR1cm47CisJfQorCWVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKwkvKiBXZSBzaG91bGQgYWxyZWFkeSBiZSBpbiBwYWdlIDAsIGJ1dCB0byBiZSBzYWZlLi4uICovCisJb3V0Yl9wKEU4MzkwX1BBR0UwK0U4MzkwX1NUQVJUK0U4MzkwX05PRE1BLCBuaWNfYmFzZSArIE5FX0NNRCk7CisKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKK3JldHJ5OgorI2VuZGlmCisKKyNpZmRlZiBORTgzOTBfUldfQlVHRklYCisJLyogSGFuZGxlIHRoZSByZWFkLWJlZm9yZS13cml0ZSBidWcgdGhlIHNhbWUgd2F5IGFzIHRoZQorCSAgIENyeW53ciBwYWNrZXQgZHJpdmVyIC0tIHRoZSBOYXRTZW1pIG1ldGhvZCBkb2Vzbid0IHdvcmsuCisJICAgQWN0dWFsbHkgdGhpcyBkb2Vzbid0IGFsd2F5cyB3b3JrIGVpdGhlciwgYnV0IGlmIHlvdSBoYXZlCisJICAgcHJvYmxlbXMgd2l0aCB5b3VyIE5FeDAwMCB0aGlzIGlzIGJldHRlciB0aGFuIG5vdGhpbmchICovCisJb3V0Yl9wKDB4NDIsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDB4MDAsIG5pY19iYXNlICsgRU4wX1JDTlRISSk7CisJb3V0Yl9wKDB4NDIsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisJb3V0Yl9wKDB4MDAsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJb3V0Yl9wKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisJLyogTWFrZSBjZXJ0YWluIHRoYXQgdGhlIGR1bW15IHJlYWQgaGFzIG9jY3VycmVkLiAqLworCVNMT1dfRE9XTl9JTzsKKwlTTE9XX0RPV05fSU87CisJU0xPV19ET1dOX0lPOworI2VuZGlmCisKKwlvdXRiX3AoRU5JU1JfUkRDLCBuaWNfYmFzZSArIEVOMF9JU1IpOworCisJLyogTm93IHRoZSBub3JtYWwgb3V0cHV0LiAqLworCW91dGJfcChjb3VudCAmIDB4ZmYsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKGNvdW50ID4+IDgsICAgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AoMHgwMCwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwlvdXRiX3Aoc3RhcnRfcGFnZSwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKworCW91dGJfcChFODM5MF9SV1JJVEUrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgTkVfQ01EKTsKKwlpZiAoZWlfc3RhdHVzLndvcmQxNikgeworCQlvdXRzdyhORV9CQVNFICsgTkVfREFUQVBPUlQsIGJ1ZiwgY291bnQ+PjEpOworCX0gZWxzZSB7CisJCW91dHNiKE5FX0JBU0UgKyBORV9EQVRBUE9SVCwgYnVmLCBjb3VudCk7CisJfQorCisJZG1hX3N0YXJ0ID0gamlmZmllczsKKworI2lmZGVmIE5FX1NBTklUWV9DSEVDSworCS8qIFRoaXMgd2FzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCBidXQgZW5vdWdoIHBlb3BsZSBoYXZlCisJICAgYmVlbiBlbmNvdW50ZXJpbmcgcHJvYmxlbXMgc28gaXQgaXMgc3RpbGwgaGVyZS4gKi8KKworCWlmIChlaV9kZWJ1ZyA+IDEpIHsJCS8qIERNQSB0ZXJtaW5hdGlvbiBhZGRyZXNzIGNoZWNrLi4uICovCisJCWludCBhZGRyLCB0cmllcyA9IDIwOworCQlkbyB7CisJCQlpbnQgaGlnaCA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJCQlpbnQgbG93ID0gaW5iX3AobmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwkJCWFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkJCWlmICgoc3RhcnRfcGFnZSA8PCA4KSArIGNvdW50ID09IGFkZHIpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tdHJpZXMgPiAwKTsKKwkJaWYgKHRyaWVzIDw9IDApIHsKKwkJCXByaW50aygiJXM6IFR4IHBhY2tldCB0cmFuc2ZlciBhZGRyZXNzIG1pc21hdGNoLCIKKwkJCQkJIiUjNC40eCAoZXhwZWN0ZWQpIHZzLiAlIzQuNHggKGFjdHVhbCkuXG4iLAorCQkJCQlkZXYtPm5hbWUsIChzdGFydF9wYWdlIDw8IDgpICsgY291bnQsIGFkZHIpOworCQkJaWYgKHJldHJpZXMrKyA9PSAwKQorCQkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisjZW5kaWYKKworCXdoaWxlICgoaW5iX3AobmljX2Jhc2UgKyBFTjBfSVNSKSAmIEVOSVNSX1JEQykgPT0gMCkKKwkJaWYgKGppZmZpZXMgLSBkbWFfc3RhcnQgPiAyKkhaLzEwMCkgewkJLyogMjBtcyAqLworCQkJcHJpbnRrKCIlczogdGltZW91dCB3YWl0aW5nIGZvciBUeCBSREMuXG4iLCBkZXYtPm5hbWUpOworCQkJbmVfcmVzZXRfODM5MChkZXYpOworCQkJTlM4MzkwX2luaXQoZGV2LDEpOworCQkJYnJlYWs7CisJCX0KKworCW91dGJfcChFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7CisJcmV0dXJuOworfQorCisKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUgTUFYX05FX0NBUkRTCTQJLyogTWF4IG51bWJlciBvZiBORSBjYXJkcyBwZXIgbW9kdWxlICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9uZVtNQVhfTkVfQ0FSRFNdOworc3RhdGljIGludCBpb1tNQVhfTkVfQ0FSRFNdOworc3RhdGljIGludCBpcnFbTUFYX05FX0NBUkRTXTsKK3N0YXRpYyBpbnQgYmFkW01BWF9ORV9DQVJEU107CS8qIDB4YmFkID0gYmFkIHNpZyBvciBubyByZXNldCBhY2sgKi8KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShiYWQsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiKGlnbm9yZWQpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIihpZ25vcmVkKSIpOworTU9EVUxFX1BBUk1fREVTQyhiYWQsICIoaWdub3JlZCkiKTsKKworLyogTW9kdWxlIGNvZGUgZml4ZWQgYnkgRGF2aWQgV2VpbmVoYWxsICovCisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHRoaXNfZGV2LCBmb3VuZCA9IDA7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfTkVfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKKwkJZGV2LT5tZW1fZW5kID0gYmFkW3RoaXNfZGV2XTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CisJCWlmIChkb19uZTJfcHJvYmUoZGV2KSA9PSAwKSB7CisJCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgeworCQkJCWRldl9uZVtmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCWJyZWFrOworCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworCXByaW50ayhLRVJOX1dBUk5JTkcgIm5lMi5jOiBObyBORS8yIGNhcmQgZm91bmRcbiIpOworCXJldHVybiAtRU5YSU87Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXY7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfTkVfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9uZVt0aGlzX2Rldl07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZTJrLXBjaS5jIGIvZHJpdmVycy9uZXQvbmUyay1wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWE2YzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmUyay1wY2kuYwpAQCAtMCwwICsxLDcxMiBAQAorLyogbmUyay1wY2kuYzogQSBORTIwMDAgY2xvbmUgb24gUENJIGJ1cyBkcml2ZXIgZm9yIExpbnV4LiAqLworLyoKKwlBIExpbnV4IGRldmljZSBkcml2ZXIgZm9yIFBDSSBORTIwMDAgY2xvbmVzLgorCisJQXV0aG9ycyBhbmQgb3RoZXIgY29weXJpZ2h0IGhvbGRlcnM6CisJMTk5Mi0yMDAwIGJ5IERvbmFsZCBCZWNrZXIsIE5FMjAwMCBjb3JlIGFuZCB2YXJpb3VzIG1vZGlmaWNhdGlvbnMuCisJMTk5NS0xOTk4IGJ5IFBhdWwgR29ydG1ha2VyLCBjb3JlIG1vZGlmaWNhdGlvbnMgYW5kIFBDSSBzdXBwb3J0LgorCUNvcHlyaWdodCAxOTkzIGFzc2lnbmVkIHRvIHRoZSBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQKKwlieSB0aGUgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKwl0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCURyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKwlyZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90CisJYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKwlzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCUlzc3VlcyByZW1haW5pbmc6CisJUGVvcGxlIGFyZSBtYWtpbmcgUENJIG5lMjAwMCBjbG9uZXMhIE9oIHRoZSBob3Jyb3IsIHRoZSBob3Jyb3IuLi4KKwlMaW1pdGVkIGZ1bGwtZHVwbGV4IHN1cHBvcnQuCisqLworCisjZGVmaW5lIERSVl9OQU1FCSJuZTJrLXBjaSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMDMiCisjZGVmaW5lIERSVl9SRUxEQVRFCSI5LzIyLzIwMDMiCisKKworLyogVGhlIHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4KKyAgIFRoZXNlIG1heSBiZSBtb2RpZmllZCB3aGVuIGEgZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQuKi8KKworc3RhdGljIGludCBkZWJ1ZyA9IDE7CQkJLyogMSBub3JtYWwgbWVzc2FnZXMsIDAgcXVpZXQgLi4gNyB2ZXJib3NlLiAqLworCisjZGVmaW5lIE1BWF9VTklUUyA4CQkJCS8qIE1vcmUgYXJlIHN1cHBvcnRlZCwgbGltaXQgb25seSBvbiBvcHRpb25zICovCisvKiBVc2VkIHRvIHBhc3MgdGhlIGZ1bGwtZHVwbGV4IGZsYWcsIGV0Yy4gKi8KK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXTsKK3N0YXRpYyBpbnQgb3B0aW9uc1tNQVhfVU5JVFNdOworCisvKiBGb3JjZSBhIG5vbiBzdGQuIGFtb3VudCBvZiBtZW1vcnkuICBVbml0cyBhcmUgMjU2IGJ5dGUgcGFnZXMuICovCisvKiAjZGVmaW5lIFBBQ0tFVEJVRl9NRU1TSVpFCTB4NDAgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKy8qIFRoZXNlIGlkZW50aWZ5IHRoZSBkcml2ZXIgYmFzZSB2ZXJzaW9uIGFuZCBtYXkgbm90IGJlIHJlbW92ZWQuICovCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiIEQuIEJlY2tlci9QLiBHb3J0bWFrZXJcbiIKK0tFUk5fSU5GTyAiICBodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL25lMmstcGNpLmh0bWxcbiI7CisKKyNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQorI2RlZmluZSBpbmxfbGUoYWRkcikgIGxlMzJfdG9fY3B1KGlubChhZGRyKSkKKyNkZWZpbmUgaW53X2xlKGFkZHIpICBsZTE2X3RvX2NwdShpbncoYWRkcikpCisjZW5kaWYKKworI2RlZmluZSBQRlggRFJWX05BTUUgIjogIgorCitNT0RVTEVfQVVUSE9SKCJEb25hbGQgQmVja2VyIC8gUGF1bCBHb3J0bWFrZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIE5FMjAwMCBjbG9uZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZnVsbF9kdXBsZXgsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZGVidWcgbGV2ZWwgKDEtMikiKTsKK01PRFVMRV9QQVJNX0RFU0Mob3B0aW9ucywgIkJpdCA1OiBmdWxsIGR1cGxleCIpOworTU9EVUxFX1BBUk1fREVTQyhmdWxsX2R1cGxleCwgImZ1bGwgZHVwbGV4IHNldHRpbmcocykgKDEpIik7CisKKy8qIFNvbWUgZGVmaW5lcyB0aGF0IHBlb3BsZSBjYW4gcGxheSB3aXRoIGlmIHNvIGluY2xpbmVkLiAqLworCisvKiBVc2UgMzIgYml0IGRhdGEtbW92ZW1lbnQgb3BlcmF0aW9ucyBpbnN0ZWFkIG9mIDE2IGJpdC4gKi8KKyNkZWZpbmUgVVNFX0xPTkdJTworCisvKiBEbyB3ZSBpbXBsZW1lbnQgdGhlIHJlYWQgYmVmb3JlIHdyaXRlIGJ1Z2ZpeCA/ICovCisvKiAjZGVmaW5lIE5FX1JXX0JVR0ZJWCAqLworCisvKiBGbGFncy4gIFdlIHJlbmFtZSBhbiBleGlzdGluZyBlaV9zdGF0dXMgZmllbGQgdG8gc3RvcmUgZmxhZ3MhICovCisvKiBUaHVzIG9ubHkgdGhlIGxvdyA4IGJpdHMgYXJlIHVzYWJsZSBmb3Igbm9uLWluaXQtdGltZSBmbGFncy4gKi8KKyNkZWZpbmUgbmUya19mbGFncyByZWcwCitlbnVtIHsKKwlPTkxZXzE2QklUX0lPPTgsIE9OTFlfMzJCSVRfSU89NCwJLyogQ2hpcCBjYW4gZG8gb25seSAxNi8zMi1iaXQgeGZlcnMuICovCisJRk9SQ0VfRkRYPTB4MjAsCQkJCQkJLyogVXNlciBvdmVycmlkZS4gKi8KKwlSRUFMVEVLX0ZEWD0weDQwLCBIT0xURUtfRkRYPTB4ODAsCisJU1RPUF9QR18weDYwPTB4MTAwLAorfTsKKworZW51bSBuZTJrX3BjaV9jaGlwc2V0cyB7CisJQ0hfUmVhbFRla19SVExfODAyOSA9IDAsCisJQ0hfV2luYm9uZF84OUM5NDAsCisJQ0hfQ29tcGV4X1JMMjAwMCwKKwlDSF9LVElfRVQzMlAyLAorCUNIX05ldFZpbl9OVjUwMDBTQywKKwlDSF9WaWFfODZDOTI2LAorCUNIX1N1cmVDb21fTkUzNCwKKwlDSF9XaW5ib25kX1c4OUM5NDBGLAorCUNIX0hvbHRla19IVDgwMjMyLAorCUNIX0hvbHRla19IVDgwMjI5LAorCUNIX1dpbmJvbmRfODlDOTQwXzhjNGEsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgeworCWNoYXIgKm5hbWU7CisJaW50IGZsYWdzOworfSBwY2lfY2xvbmVfbGlzdFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyJSZWFsVGVrIFJUTC04MDI5IiwgUkVBTFRFS19GRFh9LAorCXsiV2luYm9uZCA4OUM5NDAiLCAwfSwKKwl7IkNvbXBleCBSTDIwMDAiLCAwfSwKKwl7IktUSSBFVDMyUDIiLCAwfSwKKwl7Ik5ldFZpbiBOVjUwMDBTQyIsIDB9LAorCXsiVmlhIDg2QzkyNiIsIE9OTFlfMTZCSVRfSU99LAorCXsiU3VyZUNvbSBORTM0IiwgMH0sCisJeyJXaW5ib25kIFc4OUM5NDBGIiwgMH0sCisJeyJIb2x0ZWsgSFQ4MDIzMiIsIE9OTFlfMTZCSVRfSU8gfCBIT0xURUtfRkRYfSwKKwl7IkhvbHRlayBIVDgwMjI5IiwgT05MWV8zMkJJVF9JTyB8IEhPTFRFS19GRFggfCBTVE9QX1BHXzB4NjAgfSwKKwl7IldpbmJvbmQgVzg5Qzk0MChtaXNwcm9ncmFtbWVkKSIsIDB9LAorCXtOVUxMLH0KK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG5lMmtfcGNpX3RibFtdID0geworCXsgMHgxMGVjLCAweDgwMjksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX1JlYWxUZWtfUlRMXzgwMjkgfSwKKwl7IDB4MTA1MCwgMHgwOTQwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF9XaW5ib25kXzg5Qzk0MCB9LAorCXsgMHgxMWY2LCAweDE0MDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0NvbXBleF9STDIwMDAgfSwKKwl7IDB4OGUyZSwgMHgzMDAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF9LVElfRVQzMlAyIH0sCisJeyAweDRhMTQsIDB4NTAwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfTmV0VmluX05WNTAwMFNDIH0sCisJeyAweDExMDYsIDB4MDkyNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfVmlhXzg2QzkyNiB9LAorCXsgMHgxMGJkLCAweDBlMzQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX1N1cmVDb21fTkUzNCB9LAorCXsgMHgxMDUwLCAweDVhNWEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX1dpbmJvbmRfVzg5Qzk0MEYgfSwKKwl7IDB4MTJjMywgMHgwMDU4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF9Ib2x0ZWtfSFQ4MDIzMiB9LAorCXsgMHgxMmMzLCAweDU1OTgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0hvbHRla19IVDgwMjI5IH0sCisJeyAweDhjNGEsIDB4MTk4MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfV2luYm9uZF84OUM5NDBfOGM0YSB9LAorCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBuZTJrX3BjaV90YmwpOworCisKKy8qIC0tLS0gTm8gdXNlci1zZXJ2aWNlYWJsZSBwYXJ0cyBiZWxvdyAtLS0tICovCisKKyNkZWZpbmUgTkVfQkFTRQkgKGRldi0+YmFzZV9hZGRyKQorI2RlZmluZSBORV9DTUQJIAkweDAwCisjZGVmaW5lIE5FX0RBVEFQT1JUCTB4MTAJLyogTmF0U2VtaS1kZWZpbmVkIHBvcnQgd2luZG93IG9mZnNldC4gKi8KKyNkZWZpbmUgTkVfUkVTRVQJMHgxZgkvKiBJc3N1ZSBhIHJlYWQgdG8gcmVzZXQsIGEgd3JpdGUgdG8gY2xlYXIuICovCisjZGVmaW5lIE5FX0lPX0VYVEVOVAkweDIwCisKKyNkZWZpbmUgTkVTTV9TVEFSVF9QRwkweDQwCS8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyICovCisjZGVmaW5lIE5FU01fU1RPUF9QRwkweDgwCS8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nICovCisKKworc3RhdGljIGludCBuZTJrX3BjaV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuZTJrX3BjaV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgbmUya19wY2lfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5lMmtfcGNpX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJICBpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIG5lMmtfcGNpX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIG5lMmtfcGNpX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBpbnQgY291bnQsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZTJrX3BjaV9ldGh0b29sX29wczsKKworDAorCisvKiBUaGVyZSBpcyBubyByb29tIGluIHRoZSBzdGFuZGFyZCA4MzkwIHN0cnVjdHVyZSBmb3IgZXh0cmEgaW5mbyB3ZSBuZWVkLAorICAgc28gd2UgYnVpbGQgYSBtZXRhL291dGVyLXdyYXBwZXIgc3RydWN0dXJlLi4gKi8KK3N0cnVjdCBuZTJrX3BjaV9jYXJkIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworfTsKKworCisKKy8qCisgIE5FeDAwMC1jbG9uZSBib2FyZHMgaGF2ZSBhIFN0YXRpb24gQWRkcmVzcyAoU0EpIFBST00gKFNBUFJPTSkgaW4gdGhlIHBhY2tldAorICBidWZmZXIgbWVtb3J5IHNwYWNlLiAgQnktdGhlLXNwZWMgTkUyMDAwIGNsb25lcyBoYXZlIDB4NTcsMHg1NyBpbiBieXRlcworICAweDBlLDB4MGYgb2YgdGhlIFNBUFJPTSwgd2hpbGUgb3RoZXIgc3VwcG9zZWQgTkUyMDAwIGNsb25lcyBtdXN0IGJlCisgIGRldGVjdGVkIGJ5IHRoZWlyIFNBIHByZWZpeC4KKworICBSZWFkaW5nIHRoZSBTQVBST00gZnJvbSBhIHdvcmQtd2lkZSBjYXJkIHdpdGggdGhlIDgzOTAgc2V0IGluIGJ5dGUtd2lkZQorICBtb2RlIHJlc3VsdHMgaW4gZG91YmxlZCB2YWx1ZXMsIHdoaWNoIGNhbiBiZSBkZXRlY3RlZCBhbmQgY29tcGVuc2F0ZWQgZm9yLgorCisgIFRoZSBwcm9iZSBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgdGhlIGNhcmQgYW5kIGZpbGxpbmcKKyAgaW4gdGhlICdkZXYnIGFuZCAnZWlfc3RhdHVzJyBzdHJ1Y3R1cmVzLgorKi8KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBuZTJrX3BjaV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBTQV9wcm9tWzMyXTsKKwlpbnQgc3RhcnRfcGFnZSwgc3RvcF9wYWdlOworCWludCBpcnEsIHJlZzAsIGNoaXBfaWR4ID0gZW50LT5kcml2ZXJfZGF0YTsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGZuZF9jbnQ7CisJbG9uZyBpb2FkZHI7CisJaW50IGZsYWdzID0gcGNpX2Nsb25lX2xpc3RbY2hpcF9pZHhdLmZsYWdzOworCisvKiB3aGVuIGJ1aWx0IGludG8gdGhlIGtlcm5lbCwgd2Ugb25seSBwcmludCB2ZXJzaW9uIGlmIGRldmljZSBpcyBmb3VuZCAqLworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCWZuZF9jbnQrKzsKKworCWkgPSBwY2lfZW5hYmxlX2RldmljZSAocGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCisJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKKwlpcnEgPSBwZGV2LT5pcnE7CisKKwlpZiAoIWlvYWRkciB8fCAoKHBjaV9yZXNvdXJjZV9mbGFncyAocGRldiwgMCkgJiBJT1JFU09VUkNFX0lPKSA9PSAwKSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAibm8gSS9PIHJlc291cmNlIGF0IFBDSSBCQVIgIzBcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAocmVxdWVzdF9yZWdpb24gKGlvYWRkciwgTkVfSU9fRVhURU5ULCBEUlZfTkFNRSkgPT0gTlVMTCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiSS9PIHJlc291cmNlIDB4JXggQCAweCVseCBidXN5XG4iLAorCQkJTkVfSU9fRVhURU5ULCBpb2FkZHIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJlZzAgPSBpbmIoaW9hZGRyKTsKKwlpZiAocmVnMCA9PSAweEZGKQorCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisKKwkvKiBEbyBhIHByZWxpbWluYXJ5IHZlcmlmaWNhdGlvbiB0aGF0IHdlIGhhdmUgYSA4MzkwLiAqLworCXsKKwkJaW50IHJlZ2Q7CisJCW91dGIoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTErRTgzOTBfU1RPUCwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKwkJcmVnZCA9IGluYihpb2FkZHIgKyAweDBkKTsKKwkJb3V0YigweGZmLCBpb2FkZHIgKyAweDBkKTsKKwkJb3V0YihFODM5MF9OT0RNQStFODM5MF9QQUdFMCwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKwkJaW5iKGlvYWRkciArIEVOMF9DT1VOVEVSMCk7IC8qIENsZWFyIHRoZSBjb3VudGVyIGJ5IHJlYWRpbmcuICovCisJCWlmIChpbmIoaW9hZGRyICsgRU4wX0NPVU5URVIwKSAhPSAwKSB7CisJCQlvdXRiKHJlZzAsIGlvYWRkcik7CisJCQlvdXRiKHJlZ2QsIGlvYWRkciArIDB4MGQpOwkvKiBSZXN0b3JlIHRoZSBvbGQgdmFsdWVzLiAqLworCQkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCQl9CisJfQorCisJLyogQWxsb2NhdGUgbmV0X2RldmljZSwgZGV2LT5wcml2OyBmaWxsIGluIDgzOTAgc3BlY2lmaWMgZGV2IGZpZWxkcy4gKi8KKwlkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwlpZiAoIWRldikgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IGFsbG9jYXRlIGV0aGVybmV0IGRldmljZVxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwkvKiBSZXNldCBjYXJkLiBXaG8ga25vd3Mgd2hhdCBkYWluLWJyYW1hZ2VkIHN0YXRlIGl0IHdhcyBsZWZ0IGluLiAqLworCXsKKwkJdW5zaWduZWQgbG9uZyByZXNldF9zdGFydF90aW1lID0gamlmZmllczsKKworCQlvdXRiKGluYihpb2FkZHIgKyBORV9SRVNFVCksIGlvYWRkciArIE5FX1JFU0VUKTsKKworCQkvKiBUaGlzIGxvb2tzIGxpa2UgYSBob3JyaWJsZSB0aW1pbmcgbG9vcCwgYnV0IGl0IHNob3VsZCBuZXZlciB0YWtlCisJCSAgIG1vcmUgdGhhbiBhIGZldyBjeWNsZXMuCisJCSovCisJCXdoaWxlICgoaW5iKGlvYWRkciArIEVOMF9JU1IpICYgRU5JU1JfUkVTRVQpID09IDApCisJCQkvKiBMaW1pdCB3YWl0OiAnMicgYXZvaWRzIGppZmZ5IHJvbGwtb3Zlci4gKi8KKwkJCWlmIChqaWZmaWVzIC0gcmVzZXRfc3RhcnRfdGltZSA+IDIpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYXJkIGZhaWx1cmUgKG5vIHJlc2V0IGFjaykuXG4iKTsKKwkJCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CisJCQl9CisKKwkJb3V0YigweGZmLCBpb2FkZHIgKyBFTjBfSVNSKTsJCS8qIEFjayBhbGwgaW50ci4gKi8KKwl9CisKKwkvKiBSZWFkIHRoZSAxNiBieXRlcyBvZiBzdGF0aW9uIGFkZHJlc3MgUFJPTS4KKwkgICBXZSBtdXN0IGZpcnN0IGluaXRpYWxpemUgcmVnaXN0ZXJzLCBzaW1pbGFyIHRvIE5TODM5MF9pbml0KGVpZmRldiwgMCkuCisJICAgV2UgY2FuJ3QgcmVsaWFibHkgcmVhZCB0aGUgU0FQUk9NIGFkZHJlc3Mgd2l0aG91dCB0aGlzLgorCSAgIChJIGxlYXJuZWQgdGhlIGhhcmQgd2F5ISkuICovCisJeworCQlzdHJ1Y3Qge3Vuc2lnbmVkIGNoYXIgdmFsdWUsIG9mZnNldDsgfSBwcm9ncmFtX3NlcVtdID0geworCQkJe0U4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIEU4MzkwX0NNRH0sIC8qIFNlbGVjdCBwYWdlIDAqLworCQkJezB4NDksCUVOMF9EQ0ZHfSwJLyogU2V0IHdvcmQtd2lkZSBhY2Nlc3MuICovCisJCQl7MHgwMCwJRU4wX1JDTlRMT30sCS8qIENsZWFyIHRoZSBjb3VudCByZWdzLiAqLworCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9JTVJ9LAkvKiBNYXNrIGNvbXBsZXRpb24gaXJxLiAqLworCQkJezB4RkYsCUVOMF9JU1J9LAorCQkJe0U4MzkwX1JYT0ZGLCBFTjBfUlhDUn0sCS8qIDB4MjAgIFNldCB0byBtb25pdG9yICovCisJCQl7RTgzOTBfVFhPRkYsIEVOMF9UWENSfSwJLyogMHgwMiAgYW5kIGxvb3BiYWNrIG1vZGUuICovCisJCQl7MzIsCUVOMF9SQ05UTE99LAorCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9SU0FSTE99LAkvKiBETUEgc3RhcnRpbmcgYXQgMHgwMDAwLiAqLworCQkJezB4MDAsCUVOMF9SU0FSSEl9LAorCQkJe0U4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBFODM5MF9DTUR9LAorCQl9OworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHByb2dyYW1fc2VxKS9zaXplb2YocHJvZ3JhbV9zZXFbMF0pOyBpKyspCisJCQlvdXRiKHByb2dyYW1fc2VxW2ldLnZhbHVlLCBpb2FkZHIgKyBwcm9ncmFtX3NlcVtpXS5vZmZzZXQpOworCisJfQorCisJLyogTm90ZTogYWxsIFBDSSBjYXJkcyBoYXZlIGF0IGxlYXN0IDE2IGJpdCBhY2Nlc3MsIHNvIHdlIGRvbid0IGhhdmUKKwkgICB0byBjaGVjayBmb3IgOCBiaXQgY2FyZHMuICBNb3N0IGNhcmRzIHBlcm1pdCAzMiBiaXQgYWNjZXNzLiAqLworCWlmIChmbGFncyAmIE9OTFlfMzJCSVRfSU8pIHsKKwkJZm9yIChpID0gMDsgaSA8IDQgOyBpKyspCisJCQkoKHUzMiAqKVNBX3Byb20pW2ldID0gbGUzMl90b19jcHUoaW5sKGlvYWRkciArIE5FX0RBVEFQT1JUKSk7CisJfSBlbHNlCisJCWZvcihpID0gMDsgaSA8IDMyIC8qc2l6ZW9mKFNBX3Byb20pKi87IGkrKykKKwkJCVNBX3Byb21baV0gPSBpbmIoaW9hZGRyICsgTkVfREFUQVBPUlQpOworCisJLyogV2UgYWx3YXlzIHNldCB0aGUgODM5MCByZWdpc3RlcnMgZm9yIHdvcmQgbW9kZS4gKi8KKwlvdXRiKDB4NDksIGlvYWRkciArIEVOMF9EQ0ZHKTsKKwlzdGFydF9wYWdlID0gTkVTTV9TVEFSVF9QRzsKKworCXN0b3BfcGFnZSA9IGZsYWdzICYgU1RPUF9QR18weDYwID8gMHg2MCA6IE5FU01fU1RPUF9QRzsKKworCS8qIFNldCB1cCB0aGUgcmVzdCBvZiB0aGUgcGFyYW1ldGVycy4gKi8KKwlkZXYtPmlycSA9IGlycTsKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCWVpX3N0YXR1cy5uYW1lID0gcGNpX2Nsb25lX2xpc3RbY2hpcF9pZHhdLm5hbWU7CisJZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wYWdlOworCWVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBzdG9wX3BhZ2U7CisJZWlfc3RhdHVzLndvcmQxNiA9IDE7CisJZWlfc3RhdHVzLm5lMmtfZmxhZ3MgPSBmbGFnczsKKwlpZiAoZm5kX2NudCA8IE1BWF9VTklUUykgeworCQlpZiAoZnVsbF9kdXBsZXhbZm5kX2NudF0gPiAwICB8fCAgKG9wdGlvbnNbZm5kX2NudF0gJiBGT1JDRV9GRFgpKQorCQkJZWlfc3RhdHVzLm5lMmtfZmxhZ3MgfD0gRk9SQ0VfRkRYOworCX0KKworCWVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZSArIFRYX1BBR0VTOworI2lmZGVmIFBBQ0tFVEJVRl9NRU1TSVpFCisJLyogQWxsb3cgdGhlIHBhY2tldCBidWZmZXIgc2l6ZSB0byBiZSBvdmVycmlkZGVuIGJ5IGtub3ctaXQtYWxscy4gKi8KKwllaV9zdGF0dXMuc3RvcF9wYWdlID0gZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgKyBQQUNLRVRCVUZfTUVNU0laRTsKKyNlbmRpZgorCisJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmbmUya19wY2lfcmVzZXRfODM5MDsKKwllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmbmUya19wY2lfYmxvY2tfaW5wdXQ7CisJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZuZTJrX3BjaV9ibG9ja19vdXRwdXQ7CisJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZuZTJrX3BjaV9nZXRfODM5MF9oZHI7CisJZWlfc3RhdHVzLnByaXYgPSAodW5zaWduZWQgbG9uZykgcGRldjsKKwlkZXYtPm9wZW4gPSAmbmUya19wY2lfb3BlbjsKKwlkZXYtPnN0b3AgPSAmbmUya19wY2lfY2xvc2U7CisJZGV2LT5ldGh0b29sX29wcyA9ICZuZTJrX3BjaV9ldGh0b29sX29wczsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCU5TODM5MF9pbml0KGRldiwgMCk7CisKKwlpID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGkpCisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKworCXByaW50aygiJXM6ICVzIGZvdW5kIGF0ICUjbHgsIElSUSAlZCwgIiwKKwkJICAgZGV2LT5uYW1lLCBwY2lfY2xvbmVfbGlzdFtjaGlwX2lkeF0ubmFtZSwgaW9hZGRyLCBkZXYtPmlycSk7CisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCXByaW50aygiJTIuMlglcyIsIFNBX3Byb21baV0sIGkgPT0gNSA/ICIuXG4iOiAiOiIpOworCQlkZXYtPmRldl9hZGRyW2ldID0gU0FfcHJvbVtpXTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldiAoZGV2KTsKK2Vycl9vdXRfZnJlZV9yZXM6CisJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgTkVfSU9fRVhURU5UKTsKKwlwY2lfc2V0X2RydmRhdGEgKHBkZXYsIE5VTEwpOworCXJldHVybiAtRU5PREVWOworCit9CisKKy8qIAorICogTWFnaWMgaW5jYW50YXRpb24gc2VxdWVuY2UgZm9yIGZ1bGwgZHVwbGV4IG9uIHRoZSBzdXBwb3J0ZWQgY2FyZHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNldF9yZWFsdGVrX2ZkeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlvdXRiKDB4QzAgKyBFODM5MF9OT0RNQSwgaW9hZGRyICsgTkVfQ01EKTsgLyogUGFnZSAzICovCisJb3V0YigweEMwLCBpb2FkZHIgKyAweDAxKTsgLyogRW5hYmxlIHdyaXRlcyB0byBDT05GSUczICovCisJb3V0YigweDQwLCBpb2FkZHIgKyAweDA2KTsgLyogRW5hYmxlIGZ1bGwgZHVwbGV4ICovCisJb3V0YigweDAwLCBpb2FkZHIgKyAweDAxKTsgLyogRGlzYWJsZSB3cml0ZXMgdG8gQ09ORklHMyAqLworCW91dGIoRTgzOTBfUEFHRTAgKyBFODM5MF9OT0RNQSwgaW9hZGRyICsgTkVfQ01EKTsgLyogUGFnZSAwICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNldF9ob2x0ZWtfZmR4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW91dGIoaW5iKGlvYWRkciArIDB4MjApIHwgMHg4MCwgaW9hZGRyICsgMHgyMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmUya19wY2lfc2V0X2ZkeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChlaV9zdGF0dXMubmUya19mbGFncyAmIFJFQUxURUtfRkRYKSAKKwkJcmV0dXJuIHNldF9yZWFsdGVrX2ZkeChkZXYpOworCWVsc2UgaWYgKGVpX3N0YXR1cy5uZTJrX2ZsYWdzICYgSE9MVEVLX0ZEWCkKKwkJcmV0dXJuIHNldF9ob2x0ZWtfZmR4KGRldik7CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQgbmUya19wY2lfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoZWlfc3RhdHVzLm5lMmtfZmxhZ3MgJiBGT1JDRV9GRFgpCisJCW5lMmtfcGNpX3NldF9mZHgoZGV2KTsKKworCWVpX29wZW4oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZTJrX3BjaV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVpX2Nsb3NlKGRldik7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qIEhhcmQgcmVzZXQgdGhlIGNhcmQuICBUaGlzIHVzZWQgdG8gcGF1c2UgZm9yIHRoZSBzYW1lIHBlcmlvZCB0aGF0IGEKKyAgIDgzOTAgcmVzZXQgY29tbWFuZCByZXF1aXJlZCwgYnV0IHRoYXQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeS4gKi8KK3N0YXRpYyB2b2lkIG5lMmtfcGNpX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHJlc2V0X3N0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJaWYgKGRlYnVnID4gMSkgcHJpbnRrKCIlczogUmVzZXR0aW5nIHRoZSA4MzkwIHQ9JWxkLi4uIiwKKwkJCQkJCSAgZGV2LT5uYW1lLCBqaWZmaWVzKTsKKworCW91dGIoaW5iKE5FX0JBU0UgKyBORV9SRVNFVCksIE5FX0JBU0UgKyBORV9SRVNFVCk7CisKKwllaV9zdGF0dXMudHhpbmcgPSAwOworCWVpX3N0YXR1cy5kbWFpbmcgPSAwOworCisJLyogVGhpcyBjaGVjayBfc2hvdWxkX25vdF8gYmUgbmVjZXNzYXJ5LCBvbWl0IGV2ZW50dWFsbHkuICovCisJd2hpbGUgKChpbmIoTkVfQkFTRStFTjBfSVNSKSAmIEVOSVNSX1JFU0VUKSA9PSAwKQorCQlpZiAoamlmZmllcyAtIHJlc2V0X3N0YXJ0X3RpbWUgPiAyKSB7CisJCQlwcmludGsoIiVzOiBuZTJrX3BjaV9yZXNldF84MzkwKCkgZGlkIG5vdCBjb21wbGV0ZS5cbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCW91dGIoRU5JU1JfUkVTRVQsIE5FX0JBU0UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCit9CisKKy8qIEdyYWIgdGhlIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiBTaW1pbGFyIHRvIHRoZSBibG9ja19pbnB1dCByb3V0aW5lLCBidXQKKyAgIHdlIGRvbid0IG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGggcmluZyB3cmFwIGFzIHRoZSBoZWFkZXIgd2lsbCBiZSBhdAorICAgdGhlIHN0YXJ0IG9mIGEgcGFnZSwgc28gd2Ugb3B0aW1pemUgYWNjb3JkaW5nbHkuICovCisKK3N0YXRpYyB2b2lkIG5lMmtfcGNpX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCisJbG9uZyBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJCXByaW50aygiJXM6IERNQWluZyBjb25mbGljdCBpbiBuZTJrX3BjaV9nZXRfODM5MF9oZHIgIgorCQkJICAgIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKwlvdXRiKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBuaWNfYmFzZSsgTkVfQ01EKTsKKwlvdXRiKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkciksIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0YigwLCBuaWNfYmFzZSArIEVOMF9SQ05USEkpOworCW91dGIoMCwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsJCS8qIE9uIHBhZ2UgYm91bmRhcnkgKi8KKwlvdXRiKHJpbmdfcGFnZSwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisKKwlpZiAoZWlfc3RhdHVzLm5lMmtfZmxhZ3MgJiBPTkxZXzE2QklUX0lPKSB7CisJCWluc3coTkVfQkFTRSArIE5FX0RBVEFQT1JULCBoZHIsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik+PjEpOworCX0gZWxzZSB7CisJCSoodTMyKiloZHIgPSBsZTMyX3RvX2NwdShpbmwoTkVfQkFTRSArIE5FX0RBVEFQT1JUKSk7CisJCWxlMTZfdG9fY3B1cygmaGRyLT5jb3VudCk7CisJfQorCisJb3V0YihFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7Cit9CisKKy8qIEJsb2NrIGlucHV0IGFuZCBvdXRwdXQsIHNpbWlsYXIgdG8gdGhlIENyeW53ciBwYWNrZXQgZHJpdmVyLiAgSWYgeW91CisgICBhcmUgcG9ydGluZyB0byBhIG5ldyBldGhlcmNhcmQsIGxvb2sgYXQgdGhlIHBhY2tldCBkcml2ZXIgc291cmNlIGZvciBoaW50cy4KKyAgIFRoZSBORXgwMDAgZG9lc24ndCBzaGFyZSB0aGUgb24tYm9hcmQgcGFja2V0IG1lbW9yeSAtLSB5b3UgaGF2ZSB0byBwdXQKKyAgIHRoZSBwYWNrZXQgb3V0IHRocm91Z2ggdGhlICJyZW1vdGUgRE1BIiBkYXRhcG9ydCB1c2luZyBvdXRiLiAqLworCitzdGF0aWMgdm9pZCBuZTJrX3BjaV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKwlsb25nIG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJY2hhciAqYnVmID0gc2tiLT5kYXRhOworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJCXByaW50aygiJXM6IERNQWluZyBjb25mbGljdCBpbiBuZTJrX3BjaV9ibG9ja19pbnB1dCAiCisJCQkgICAiW0RNQXN0YXQ6JWRdW2lycWxvY2s6JWRdLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgZWlfc3RhdHVzLmRtYWluZywgZWlfc3RhdHVzLmlycWxvY2spOworCQlyZXR1cm47CisJfQorCWVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKwlpZiAoZWlfc3RhdHVzLm5lMmtfZmxhZ3MgJiBPTkxZXzMyQklUX0lPKQorCQljb3VudCA9IChjb3VudCArIDMpICYgMHhGRkZDOworCW91dGIoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIG5pY19iYXNlKyBORV9DTUQpOworCW91dGIoY291bnQgJiAweGZmLCBuaWNfYmFzZSArIEVOMF9SQ05UTE8pOworCW91dGIoY291bnQgPj4gOCwgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiKHJpbmdfb2Zmc2V0ICYgMHhmZiwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwlvdXRiKHJpbmdfb2Zmc2V0ID4+IDgsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJb3V0YihFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworCisJaWYgKGVpX3N0YXR1cy5uZTJrX2ZsYWdzICYgT05MWV8xNkJJVF9JTykgeworCQlpbnN3KE5FX0JBU0UgKyBORV9EQVRBUE9SVCxidWYsY291bnQ+PjEpOworCQlpZiAoY291bnQgJiAweDAxKSB7CisJCQlidWZbY291bnQtMV0gPSBpbmIoTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKKwkJfQorCX0gZWxzZSB7CisJCWluc2woTkVfQkFTRSArIE5FX0RBVEFQT1JULCBidWYsIGNvdW50Pj4yKTsKKwkJaWYgKGNvdW50ICYgMykgeworCQkJYnVmICs9IGNvdW50ICYgfjM7CisJCQlpZiAoY291bnQgJiAyKSB7CisJCQkJdTE2ICpiID0gKHUxNiAqKWJ1ZjsKKworCQkJCSpiKysgPSBsZTE2X3RvX2NwdShpbncoTkVfQkFTRSArIE5FX0RBVEFQT1JUKSk7CisJCQkJYnVmID0gKGNoYXIgKiliOworCQkJfQorCQkJaWYgKGNvdW50ICYgMSkKKwkJCQkqYnVmID0gaW5iKE5FX0JBU0UgKyBORV9EQVRBUE9SVCk7CisJCX0KKwl9CisKKwlvdXRiKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCisJZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKK30KKworc3RhdGljIHZvaWQgbmUya19wY2lfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpCit7CisJbG9uZyBuaWNfYmFzZSA9IE5FX0JBU0U7CisJdW5zaWduZWQgbG9uZyBkbWFfc3RhcnQ7CisKKwkvKiBPbiBsaXR0bGUtZW5kaWFuIGl0J3MgYWx3YXlzIHNhZmUgdG8gcm91bmQgdGhlIGNvdW50IHVwIGZvcgorCSAgIHdvcmQgd3JpdGVzLiAqLworCWlmIChlaV9zdGF0dXMubmUya19mbGFncyAmIE9OTFlfMzJCSVRfSU8pCisJCWNvdW50ID0gKGNvdW50ICsgMykgJiAweEZGRkM7CisJZWxzZQorCQlpZiAoY291bnQgJiAweDAxKQorCQkJY291bnQrKzsKKworCS8qIFRoaXMgKnNob3VsZG4ndCogaGFwcGVuLiBJZiBpdCBkb2VzLCBpdCdzIHRoZSBsYXN0IHRoaW5nIHlvdSdsbCBzZWUgKi8KKwlpZiAoZWlfc3RhdHVzLmRtYWluZykgeworCQlwcmludGsoIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gbmUya19wY2lfYmxvY2tfb3V0cHV0LiIKKwkJCSAgICJbRE1Bc3RhdDolZF1baXJxbG9jazolZF1cbiIsCisJCQkgICBkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwkJcmV0dXJuOworCX0KKwllaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7CisJLyogV2Ugc2hvdWxkIGFscmVhZHkgYmUgaW4gcGFnZSAwLCBidXQgdG8gYmUgc2FmZS4uLiAqLworCW91dGIoRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQrRTgzOTBfTk9ETUEsIG5pY19iYXNlICsgTkVfQ01EKTsKKworI2lmZGVmIE5FODM5MF9SV19CVUdGSVgKKwkvKiBIYW5kbGUgdGhlIHJlYWQtYmVmb3JlLXdyaXRlIGJ1ZyB0aGUgc2FtZSB3YXkgYXMgdGhlCisJICAgQ3J5bndyIHBhY2tldCBkcml2ZXIgLS0gdGhlIE5hdFNlbWkgbWV0aG9kIGRvZXNuJ3Qgd29yay4KKwkgICBBY3R1YWxseSB0aGlzIGRvZXNuJ3QgYWx3YXlzIHdvcmsgZWl0aGVyLCBidXQgaWYgeW91IGhhdmUKKwkgICBwcm9ibGVtcyB3aXRoIHlvdXIgTkV4MDAwIHRoaXMgaXMgYmV0dGVyIHRoYW4gbm90aGluZyEgKi8KKwlvdXRiKDB4NDIsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0YigweDAwLCBuaWNfYmFzZSArIEVOMF9SQ05USEkpOworCW91dGIoMHg0MiwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwlvdXRiKDB4MDAsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJb3V0YihFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworI2VuZGlmCisJb3V0YihFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CisKKyAgIC8qIE5vdyB0aGUgbm9ybWFsIG91dHB1dC4gKi8KKwlvdXRiKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBFTjBfUkNOVExPKTsKKwlvdXRiKGNvdW50ID4+IDgsICAgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiKDB4MDAsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisJb3V0YihzdGFydF9wYWdlLCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCW91dGIoRTgzOTBfUldSSVRFK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisJaWYgKGVpX3N0YXR1cy5uZTJrX2ZsYWdzICYgT05MWV8xNkJJVF9JTykgeworCQlvdXRzdyhORV9CQVNFICsgTkVfREFUQVBPUlQsIGJ1ZiwgY291bnQ+PjEpOworCX0gZWxzZSB7CisJCW91dHNsKE5FX0JBU0UgKyBORV9EQVRBUE9SVCwgYnVmLCBjb3VudD4+Mik7CisJCWlmIChjb3VudCAmIDMpIHsKKwkJCWJ1ZiArPSBjb3VudCAmIH4zOworCQkJaWYgKGNvdW50ICYgMikgeworCQkJCXUxNiAqYiA9ICh1MTYgKilidWY7CisKKwkJCQlvdXR3KGNwdV90b19sZTE2KCpiKyspLCBORV9CQVNFICsgTkVfREFUQVBPUlQpOworCQkJCWJ1ZiA9IChjaGFyICopYjsKKwkJCX0KKwkJfQorCX0KKworCWRtYV9zdGFydCA9IGppZmZpZXM7CisKKwl3aGlsZSAoKGluYihuaWNfYmFzZSArIEVOMF9JU1IpICYgRU5JU1JfUkRDKSA9PSAwKQorCQlpZiAoamlmZmllcyAtIGRtYV9zdGFydCA+IDIpIHsJCQkvKiBBdm9pZCBjbG9jayByb2xsLW92ZXIuICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdGltZW91dCB3YWl0aW5nIGZvciBUeCBSREMuXG4iLCBkZXYtPm5hbWUpOworCQkJbmUya19wY2lfcmVzZXRfODM5MChkZXYpOworCQkJTlM4MzkwX2luaXQoZGV2LDEpOworCQkJYnJlYWs7CisJCX0KKworCW91dGIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIEVOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKwllaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgbmUya19wY2lfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaSA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IChzdHJ1Y3QgcGNpX2RldiAqKSBlaS0+cHJpdjsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocGNpX2RldikpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5lMmtfcGNpX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZTJrX3BjaV9nZXRfZHJ2aW5mbywKKwkuZ2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKK307CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBuZTJrX3BjaV9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKCFkZXYpCisJCUJVRygpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTkVfSU9fRVhURU5UKTsKKwlmcmVlX25ldGRldihkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgbmUya19wY2lfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5lMmtfcGNpX3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCU5TODM5MF9pbml0KGRldiwgMSk7CisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbmUya19kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLnByb2JlCQk9IG5lMmtfcGNpX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobmUya19wY2lfcmVtb3ZlX29uZSksCisJLmlkX3RhYmxlCT0gbmUya19wY2lfdGJsLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gbmUya19wY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG5lMmtfcGNpX3Jlc3VtZSwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBuZTJrX3BjaV9pbml0KHZvaWQpCit7CisvKiB3aGVuIGEgbW9kdWxlLCB0aGlzIGlzIHByaW50ZWQgd2hldGhlciBvciBub3QgZGV2aWNlcyBhcmUgZm91bmQgaW4gcHJvYmUgKi8KKyNpZmRlZiBNT0RVTEUKKwlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0ICgmbmUya19kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZTJrX3BjaV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmbmUya19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChuZTJrX3BjaV9pbml0KTsKK21vZHVsZV9leGl0KG5lMmtfcGNpX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUzMjEwLmMgYi9kcml2ZXJzL25ldC9uZTMyMTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzkyZjA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmUzMjEwLmMKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisJbmUzMjEwLmMKKworCUxpbnV4IGRyaXZlciBmb3IgTm92ZWxsIE5FMzIxMCBFSVNBIE5ldHdvcmsgQWRhcHRlcgorCisJQ29weXJpZ2h0IChDKSAxOTk4LCBQYXVsIEdvcnRtYWtlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJSW5mb3JtYXRpb24gYW5kIENvZGUgU291cmNlczoKKworCTEpIEJhc2VkIHVwb24gbXkgb3RoZXIgRUlTQSA4MzkwIGRyaXZlcnMgKGxuZTM5MCwgZXMzMjEwLCBzbWMtdWx0cmEzMikKKwkyKSBUaGUgZXhpc3RpbmcgbXlyaWFkIG9mIG90aGVyIExpbnV4IDgzOTAgZHJpdmVycyBieSBEb25hbGQgQmVja2VyLgorCTMpIEluZm8gZm9yIGdldHRpbmcgSVJRIGFuZCBzaC1tZW0gZ2xlYW5lZCBmcm9tIHRoZSBFSVNBIGNmZyBmaWxlCisKKwlUaGUgTkUzMjEwIGlzIGFuIEVJU0Egc2hhcmVkIG1lbW9yeSBOUzgzOTAgaW1wbGVtZW50YXRpb24uICBTaGFyZWQgCisJbWVtb3J5IGFkZHJlc3MgPiAxTUIgc2hvdWxkIHdvcmsgd2l0aCB0aGlzIGRyaXZlci4KKworCU5vdGUgdGhhdCB0aGUgLmNmZyBmaWxlICgzLzExLzkzLCB2MS4wKSBoYXMgQVVJIGFuZCBCTkMgc3dpdGNoZWQgCisJYXJvdW5kIChvciBwZXJoYXBzIHRoZXJlIGFyZSBzb21lIGRlZmVjdGl2ZS9iYWNrd2FyZHMgY2FyZHMgPz8/KQorCisJVGhpcyBkcml2ZXIgV0lMTCBOT1QgV09SSyBGT1IgVEhFIE5FMzIwMCAtIGl0IGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50CisJYW5kIGRvZXMgbm90IHVzZSBhbiA4MzkwIGF0IGFsbC4KKworCVVwZGF0ZWQgdG8gRUlTQSBwcm9iaW5nIEFQSSA1LzIwMDMgYnkgTWFyYyBaeW5naWVyLgorKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQorCSJuZTMyMTAuYzogRHJpdmVyIHJldmlzaW9uIHYwLjAzLCAzMC8wOS85OFxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgIm5lMzIxMCIKKworc3RhdGljIGludCBuZTMyMTBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmUzMjEwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBuZTMyMTBfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgbmUzMjEwX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIG5lMzIxMF9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCBuZTMyMTBfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSk7CisKKyNkZWZpbmUgTkUzMjEwX1NUQVJUX1BHCQkweDAwICAgIC8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyCSovCisjZGVmaW5lIE5FMzIxMF9TVE9QX1BHCQkweDgwICAgIC8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nCSovCisKKyNkZWZpbmUgTkUzMjEwX0lPX0VYVEVOVAkweDIwCisjZGVmaW5lIE5FMzIxMF9TQV9QUk9NCQkweDE2CS8qIFN0YXJ0IG9mIGUnbmV0IGFkZHIuCQkqLworI2RlZmluZSBORTMyMTBfUkVTRVRfUE9SVAkweGM4NAorI2RlZmluZSBORTMyMTBfTklDX09GRlNFVAkweDAwCS8qIEhlbGxvLCB0aGUgODM5MCBpcyAqaGVyZSoJKi8KKworI2RlZmluZSBORTMyMTBfQUREUjAJCTB4MDAJLyogMyBieXRlIHZlbmRvciBwcmVmaXgJCSovCisjZGVmaW5lIE5FMzIxMF9BRERSMQkJMHgwMAorI2RlZmluZSBORTMyMTBfQUREUjIJCTB4MWIKKworI2RlZmluZSBORTMyMTBfQ0ZHMQkJMHhjODQJLyogTkI6IDB4Yzg0IGlzIGFsc28gInJlc2V0IiBwb3J0LiAqLworI2RlZmluZSBORTMyMTBfQ0ZHMgkJMHhjOTAKKyNkZWZpbmUgTkUzMjEwX0NGR19FWFRFTlQgICAgICAgKE5FMzIxMF9DRkcyIC0gTkUzMjEwX0NGRzEgKyAxKQorCisvKgorICoJWW91IGNhbiBPUiBhbnkgb2YgdGhlIGZvbGxvd2luZyBiaXRzIHRvZ2V0aGVyIGFuZCBhc3NpZ24gaXQKKyAqCXRvIE5FMzIxMF9ERUJVRyB0byBnZXQgdmVyYm9zZSBkcml2ZXIgaW5mbyBkdXJpbmcgb3BlcmF0aW9uLgorICoJQ3VycmVudGx5IG9ubHkgdGhlIHByb2JlIG9uZSBpcyBpbXBsZW1lbnRlZC4KKyAqLworCisjZGVmaW5lIE5FMzIxMF9EX1BST0JFCTB4MDEKKyNkZWZpbmUgTkUzMjEwX0RfUlhfUEtUCTB4MDIKKyNkZWZpbmUgTkUzMjEwX0RfVFhfUEtUCTB4MDQKKyNkZWZpbmUgTkUzMjEwX0RfSVJRCTB4MDgKKworI2RlZmluZSBORTMyMTBfREVCVUcJMHgwCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlycV9tYXBbXSBfX2luaXRkYXRhID0gezE1LCAxMiwgMTEsIDEwLCA5LCA3LCA1LCAzfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2htZW1fbWFwW10gX19pbml0ZGF0YSA9IHsweGZmMCwgMHhmZTAsIDB4ZmZmMCwgMHhkOCwgMHhmZmUwLCAweGZmYzAsIDB4ZDAsIDB4MH07CitzdGF0aWMgY29uc3QgY2hhciAqaWZtYXBbXSBfX2luaXRkYXRhID0geyJVVFAiLCAiPyIsICJCTkMiLCAiQVVJIn07CitzdGF0aWMgaW50IGlmbWFwX3ZhbFtdIF9faW5pdGRhdGEgPSB7CisJCUlGX1BPUlRfMTBCQVNFVCwKKwkJSUZfUE9SVF9VTktOT1dOLAorCQlJRl9QT1JUXzEwQkFTRTIsCisJCUlGX1BPUlRfQVVJLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbmUzMjEwX2Vpc2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciwgcGh5c19tZW07CisJaW50IGksIHJldHZhbCwgcG9ydF9pbmRleDsKKwlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXYgPSB0b19laXNhX2RldmljZSAoZGV2aWNlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJLyogQWxsb2NhdGUgZGV2LT5wcml2IGFuZCBmaWxsIGluIDgzOTAgc3BlY2lmaWMgZGV2IGZpZWxkcy4gKi8KKwlpZiAoIShkZXYgPSBhbGxvY19laV9uZXRkZXYgKCkpKSB7CisJCXByaW50ayAoIm5lMzIxMC5jOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkZXYhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgZGV2aWNlKTsKKwlkZXZpY2UtPmRyaXZlcl9kYXRhID0gZGV2OworCWlvYWRkciA9IGVkZXYtPmJhc2VfYWRkcjsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBORTMyMTBfSU9fRVhURU5ULCBEUlZfTkFNRSkpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciArIE5FMzIxMF9DRkcxLAorCQkJICAgIE5FMzIxMF9DRkdfRVhURU5ULCBEUlZfTkFNRSkpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIG91dDE7CisJfQorCisjaWYgTkUzMjEwX0RFQlVHICYgTkUzMjEwX0RfUFJPQkUKKwlwcmludGsoIm5lMzIxMC1kZWJ1ZzogcHJvYmUgYXQgJSN4LCBJRCAlc1xuIiwgaW9hZGRyLCBlZGV2LT5pZC5zaWcpOworCXByaW50aygibmUzMjEwLWRlYnVnOiBjb25maWcgcmVnczogJSN4ICUjeFxuIiwKKwkJaW5iKGlvYWRkciArIE5FMzIxMF9DRkcxKSwgaW5iKGlvYWRkciArIE5FMzIxMF9DRkcyKSk7CisjZW5kaWYKKworCisJcG9ydF9pbmRleCA9IGluYihpb2FkZHIgKyBORTMyMTBfQ0ZHMikgPj4gNjsKKwlwcmludGsoIm5lMzIxMC5jOiBORTMyMTAgaW4gRUlTQSBzbG90ICVkLCBtZWRpYTogJXMsIGFkZHI6IiwKKwkJZWRldi0+c2xvdCwgaWZtYXBbcG9ydF9pbmRleF0pOworCWZvcihpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspCisJCXByaW50aygiICUwMngiLCAoZGV2LT5kZXZfYWRkcltpXSA9IGluYihpb2FkZHIgKyBORTMyMTBfU0FfUFJPTSArIGkpKSk7CisJCisKKwkvKiBTbmFyZiB0aGUgaW50ZXJydXB0IG5vdy4gQ0ZHIGZpbGUgaGFzIHRoZW0gYWxsIGxpc3RlZCBhcyBgZWRnZScgd2l0aCBzaGFyZT1OTyAqLworCWRldi0+aXJxID0gaXJxX21hcFsoaW5iKGlvYWRkciArIE5FMzIxMF9DRkcyKSA+PiAzKSAmIDB4MDddOworCXByaW50aygiLlxubmUzMjEwLmM6IHVzaW5nIElSUSAlZCwgIiwgZGV2LT5pcnEpOworCisJcmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgRFJWX05BTUUsIGRldik7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsgKCIgdW5hYmxlIHRvIGdldCBJUlEgJWQuXG4iLCBkZXYtPmlycSk7CisJCWdvdG8gb3V0MjsKKwl9CisKKwlwaHlzX21lbSA9IHNobWVtX21hcFtpbmIoaW9hZGRyICsgTkUzMjEwX0NGRzIpICYgMHgwN10gKiAweDEwMDA7CisKKwkvKgorCSAgIEJFV0FSRSEhIFNvbWUgZGFpbi1icmFtYWdlZCBFSVNBIFNDVXMgd2lsbCBhbGxvdyB5b3UgdG8gcHV0CisJICAgdGhlIGNhcmQgbWVtIHdpdGhpbiB0aGUgcmVnaW9uIGNvdmVyZWQgYnkgYG5vcm1hbCcgUkFNICAhISEKKwkqLworCWlmIChwaHlzX21lbSA+IDEwMjQqMTAyNCkgewkvKiBwaHlzIGFkZHIgPiAxTUIgKi8KKwkJaWYgKHBoeXNfbWVtIDwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSkgeworCQkJcHJpbnRrKEtFUk5fQ1JJVCAibmUzMjEwLmM6IENhcmQgUkFNIG92ZXJsYXBzIHdpdGggbm9ybWFsIG1lbW9yeSEhIVxuIik7CisJCQlwcmludGsoS0VSTl9DUklUICJuZTMyMTAuYzogVXNlIEVJU0EgU0NVIHRvIHNldCBjYXJkIG1lbW9yeSBiZWxvdyAxTUIsXG4iKTsKKwkJCXByaW50ayhLRVJOX0NSSVQgIm5lMzIxMC5jOiBvciB0byBhbiBhZGRyZXNzIGFib3ZlIDB4JWx4LlxuIiwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSk7CisJCQlwcmludGsoS0VSTl9DUklUICJuZTMyMTAuYzogRHJpdmVyIE5PVCBpbnN0YWxsZWQuXG4iKTsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDM7CisJCX0KKwl9CisJCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24gKHBoeXNfbWVtLCBORTMyMTBfU1RPUF9QRyoweDEwMCwgRFJWX05BTUUpKSB7CisJCXByaW50ayAoIm5lMzIxMC5jOiBVbmFibGUgdG8gcmVxdWVzdCBzaGFyZWQgbWVtb3J5IGF0IHBoeXNpY2FsIGFkZHJlc3MgJSNseFxuIiwKKwkJCXBoeXNfbWVtKTsKKwkJZ290byBvdXQzOworCX0KKwkKKwlwcmludGsoIiVka0IgbWVtb3J5IGF0IHBoeXNpY2FsIGFkZHJlc3MgJSNseFxuIiwKKwkgICAgICAgTkUzMjEwX1NUT1BfUEcvNCwgcGh5c19tZW0pOworCisJZWlfc3RhdHVzLm1lbSA9IGlvcmVtYXAocGh5c19tZW0sIE5FMzIxMF9TVE9QX1BHKjB4MTAwKTsKKwlpZiAoIWVpX3N0YXR1cy5tZW0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJuZTMyMTAuYzogVW5hYmxlIHRvIHJlbWFwIGNhcmQgbWVtb3J5ICEhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJuZTMyMTAuYzogRHJpdmVyIE5PVCBpbnN0YWxsZWQuXG4iKTsKKwkJcmV0dmFsID0gLUVBR0FJTjsKKwkJZ290byBvdXQ0OworCX0KKwlwcmludGsoIm5lMzIxMC5jOiByZW1hcHBlZCAlZGtCIGNhcmQgbWVtb3J5IHRvIHZpcnR1YWwgYWRkcmVzcyAlcFxuIiwKKwkgICAgICAgTkUzMjEwX1NUT1BfUEcvNCwgZWlfc3RhdHVzLm1lbSk7CisJZGV2LT5tZW1fc3RhcnQgPSAodW5zaWduZWQgbG9uZyllaV9zdGF0dXMubWVtOworCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgKE5FMzIxMF9TVE9QX1BHIC0gTkUzMjEwX1NUQVJUX1BHKSoyNTY7CisKKwkvKiBUaGUgODM5MCBvZmZzZXQgaXMgemVybyBmb3IgdGhlIE5FMzIxMCAqLworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJZWlfc3RhdHVzLm5hbWUgPSAiTkUzMjEwIjsKKwllaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA9IE5FMzIxMF9TVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IE5FMzIxMF9TVEFSVF9QRyArIFRYX1BBR0VTOworCWVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBORTMyMTBfU1RPUF9QRzsKKwllaV9zdGF0dXMud29yZDE2ID0gMTsKKwllaV9zdGF0dXMucHJpdiA9IHBoeXNfbWVtOworCisJaWYgKGVpX2RlYnVnID4gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmbmUzMjEwX3Jlc2V0XzgzOTA7CisJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJm5lMzIxMF9ibG9ja19pbnB1dDsKKwllaV9zdGF0dXMuYmxvY2tfb3V0cHV0ID0gJm5lMzIxMF9ibG9ja19vdXRwdXQ7CisJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZuZTMyMTBfZ2V0XzgzOTBfaGRyOworCisJZGV2LT5vcGVuID0gJm5lMzIxMF9vcGVuOworCWRldi0+c3RvcCA9ICZuZTMyMTBfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKwlkZXYtPmlmX3BvcnQgPSBpZm1hcF92YWxbcG9ydF9pbmRleF07CisKKwlpZiAoKHJldHZhbCA9IHJlZ2lzdGVyX25ldGRldiAoZGV2KSkpCisJCWdvdG8gb3V0NTsKKwkJCisJTlM4MzkwX2luaXQoZGV2LCAwKTsKKwlyZXR1cm4gMDsKKworIG91dDU6CisJaW91bm1hcChlaV9zdGF0dXMubWVtKTsKKyBvdXQ0OgorCXJlbGVhc2VfbWVtX3JlZ2lvbiAocGh5c19tZW0sIE5FMzIxMF9TVE9QX1BHKjB4MTAwKTsKKyBvdXQzOgorCWZyZWVfaXJxIChkZXYtPmlycSwgZGV2KTsKKyBvdXQyOgorCXJlbGVhc2VfcmVnaW9uIChpb2FkZHIgKyBORTMyMTBfQ0ZHMSwgTkUzMjEwX0NGR19FWFRFTlQpOworIG91dDE6CisJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgTkUzMjEwX0lPX0VYVEVOVCk7Cisgb3V0OgorCWZyZWVfbmV0ZGV2IChkZXYpOworCQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG5lMzIxMF9laXNhX3JlbW92ZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICAgID0gZGV2aWNlLT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nICAgICAgIGlvYWRkciA9IHRvX2Vpc2FfZGV2aWNlIChkZXZpY2UpLT5iYXNlX2FkZHI7CisKKwl1bnJlZ2lzdGVyX25ldGRldiAoZGV2KTsKKwlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOworCXJlbGVhc2VfbWVtX3JlZ2lvbiAoZWlfc3RhdHVzLnByaXYsIE5FMzIxMF9TVE9QX1BHKjB4MTAwKTsKKwlmcmVlX2lycSAoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24gKGlvYWRkciArIE5FMzIxMF9DRkcxLCBORTMyMTBfQ0ZHX0VYVEVOVCk7CisJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgTkUzMjEwX0lPX0VYVEVOVCk7CisJZnJlZV9uZXRkZXYgKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVJlc2V0IGJ5IHRvZ2dsaW5nIHRoZSAiQm9hcmQgRW5hYmxlIiBiaXRzIChiaXQgMiBhbmQgMCkuCisgKi8KKworc3RhdGljIHZvaWQgbmUzMjEwX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW91dGIoMHgwNCwgaW9hZGRyICsgTkUzMjEwX1JFU0VUX1BPUlQpOworCWlmIChlaV9kZWJ1ZyA+IDEpIHByaW50aygiJXM6IHJlc2V0dGluZyB0aGUgTkUzMjEwLi4uIiwgZGV2LT5uYW1lKTsKKworCW1kZWxheSgyKTsKKworCWVpX3N0YXR1cy50eGluZyA9IDA7CisJb3V0YigweDAxLCBpb2FkZHIgKyBORTMyMTBfUkVTRVRfUE9SVCk7CisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldCBkb25lXG4iKTsKKworCXJldHVybjsKK30KKworLyoKKyAqCU5vdGU6IEluIHRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGlzIHRoZSBpbXBsaWNpdCBhc3N1bXB0aW9uCisgKgl0aGF0IHRoZSBhc3NvY2lhdGVkIG1lbWNweSB3aWxsIG9ubHkgdXNlICJyZXA7IG1vdnNsIiBhcyBsb25nIGFzCisgKgl3ZSBrZWVwIHRoZSBjb3VudHMgYXMgc29tZSBtdWx0aXBsZSBvZiBkb3VibGV3b3Jkcy4gVGhpcyBpcyBhCisgKglyZXF1aXJlbWVudCBvZiB0aGUgaGFyZHdhcmUsIGFuZCBhbHNvIHByZXZlbnRzIHVzIGZyb20gdXNpbmcKKyAqCWV0aF9pb19jb3B5X2FuZF9zdW0oKSBzaW5jZSB3ZSBjYW4ndCBndWFyYW50ZWUgaXQgd2lsbCBsaW1pdAorICoJaXRzZWxmIHRvIGRvdWJsZXdvcmQgYWNjZXNzLgorICovCisKKy8qCisgKglHcmFiIHRoZSA4MzkwIHNwZWNpZmljIGhlYWRlci4gU2ltaWxhciB0byB0aGUgYmxvY2tfaW5wdXQgcm91dGluZSwgYnV0CisgKgl3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcCBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQKKyAqCXRoZSBzdGFydCBvZiBhIHBhZ2UsIHNvIHdlIG9wdGltaXplIGFjY29yZGluZ2x5LiAoQSBzaW5nbGUgZG91Ymxld29yZC4pCisgKi8KKworc3RhdGljIHZvaWQKK25lMzIxMF9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKwl2b2lkIF9faW9tZW0gKmhkcl9zdGFydCA9IGVpX3N0YXR1cy5tZW0gKyAoKHJpbmdfcGFnZSAtIE5FMzIxMF9TVEFSVF9QRyk8PDgpOworCW1lbWNweV9mcm9taW8oaGRyLCBoZHJfc3RhcnQsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworCWhkci0+Y291bnQgPSAoaGRyLT5jb3VudCArIDMpICYgfjM7ICAgICAvKiBSb3VuZCB1cCBhbGxvY2F0aW9uLiAqLworfQorCisvKgkKKyAqCUJsb2NrIGlucHV0IGFuZCBvdXRwdXQgYXJlIGVhc3kgb24gc2hhcmVkIG1lbW9yeSBldGhlcmNhcmRzLCB0aGUgb25seQorICoJY29tcGxpY2F0aW9uIGlzIHdoZW4gdGhlIHJpbmcgYnVmZmVyIHdyYXBzLiBUaGUgY291bnQgd2lsbCBhbHJlYWR5CisgKgliZSByb3VuZGVkIHVwIHRvIGEgZG91Ymxld29yZCB2YWx1ZSB2aWEgbmUzMjEwX2dldF84MzkwX2hkcigpIGFib3ZlLgorICovCisKK3N0YXRpYyB2b2lkIG5lMzIxMF9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkgIGludCByaW5nX29mZnNldCkKK3sKKwl2b2lkIF9faW9tZW0gKnN0YXJ0ID0gZWlfc3RhdHVzLm1lbSArIHJpbmdfb2Zmc2V0IC0gTkUzMjEwX1NUQVJUX1BHKjI1NjsKKworCWlmIChyaW5nX29mZnNldCArIGNvdW50ID4gTkUzMjEwX1NUT1BfUEcqMjU2KSB7CisJCS8qIFBhY2tldCB3cmFwcyBvdmVyIGVuZCBvZiByaW5nIGJ1ZmZlci4gKi8KKwkJaW50IHNlbWlfY291bnQgPSBORTMyMTBfU1RPUF9QRyoyNTYgLSByaW5nX29mZnNldDsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIHN0YXJ0LCBzZW1pX2NvdW50KTsKKwkJY291bnQgLT0gc2VtaV9jb3VudDsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEgKyBzZW1pX2NvdW50LAorCQkJCWVpX3N0YXR1cy5tZW0gKyBUWF9QQUdFUyoyNTYsIGNvdW50KTsKKwl9IGVsc2UgeworCQkvKiBQYWNrZXQgaXMgaW4gb25lIGNodW5rLiAqLworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgc3RhcnQsIGNvdW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5lMzIxMF9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHN0YXJ0X3BhZ2UpCit7CisJdm9pZCBfX2lvbWVtICpzaG1lbSA9IGVpX3N0YXR1cy5tZW0gKyAoKHN0YXJ0X3BhZ2UgLSBORTMyMTBfU1RBUlRfUEcpPDw4KTsKKworCWNvdW50ID0gKGNvdW50ICsgMykgJiB+MzsgICAgIC8qIFJvdW5kIHVwIHRvIGRvdWJsZXdvcmQgKi8KKwltZW1jcHlfdG9pbyhzaG1lbSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgbmUzMjEwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllaV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmUzMjEwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsoIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZC5cbiIsIGRldi0+bmFtZSk7CisKKwllaV9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVpc2FfZGV2aWNlX2lkIG5lMzIxMF9pZHNbXSA9IHsKKwl7ICJFR0wwMTAxIiB9LAorCXsgIk5WTDE4MDEiIH0sCisJeyAiIiB9LAorfTsKKworc3RhdGljIHN0cnVjdCBlaXNhX2RyaXZlciBuZTMyMTBfZWlzYV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gbmUzMjEwX2lkcywKKwkuZHJpdmVyICAgPSB7CisJCS5uYW1lICAgPSAibmUzMjEwIiwKKwkJLnByb2JlICA9IG5lMzIxMF9laXNhX3Byb2JlLAorCQkucmVtb3ZlID0gX19kZXZleGl0X3AgKG5lMzIxMF9laXNhX3JlbW92ZSksCisJfSwKK307CisKK01PRFVMRV9ERVNDUklQVElPTigiTkUzMjEwIEVJU0EgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKGVpc2EsIG5lMzIxMF9pZHMpOworCitpbnQgbmUzMjEwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZWlzYV9kcml2ZXJfcmVnaXN0ZXIgKCZuZTMyMTBfZWlzYV9kcml2ZXIpOworfQorCit2b2lkIG5lMzIxMF9jbGVhbnVwKHZvaWQpCit7CisJZWlzYV9kcml2ZXJfdW5yZWdpc3RlciAoJm5lMzIxMF9laXNhX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0IChuZTMyMTBfaW5pdCk7Cittb2R1bGVfZXhpdCAobmUzMjEwX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0Y29uc29sZS5jIGIvZHJpdmVycy9uZXQvbmV0Y29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZDFiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uZXRjb25zb2xlLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9uZXQvbmV0Y29uc29sZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMSAgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKgorICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYW4gSVJRLXNhZmUsIGNyYXNoLXNhZmUKKyAqICBrZXJuZWwgY29uc29sZSBpbXBsZW1lbnRhdGlvbiB0aGF0IG91dHB1dHMga2VybmVsIG1lc3NhZ2VzIHRvIHRoZQorICogIG5ldHdvcmsuCisgKgorICogTW9kaWZpY2F0aW9uIGhpc3Rvcnk6CisgKgorICogMjAwMS0wOS0xNyAgICBzdGFydGVkIGJ5IEluZ28gTW9sbmFyLgorICogMjAwMy0wOC0xMSAgICAyLjYgcG9ydCBieSBNYXR0IE1hY2thbGwKKyAqICAgICAgICAgICAgICAgc2ltcGxpZmllZCBvcHRpb25zCisgKiAgICAgICAgICAgICAgIGdlbmVyaWMgY2FyZCBob29rcworICogICAgICAgICAgICAgICB3b3JrcyBub24tbW9kdWxhcgorICogMjAwMy0wOS0wNyAgICByZXdyaXR0ZW4gd2l0aCBuZXRwb2xsIGFwaQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqICAgICAgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRwb2xsLmg+CisKK01PRFVMRV9BVVRIT1IoIk1haW50YWluZXI6IE1hdHQgTWFja2FsbCA8bXBtQHNlbGVuaWMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb25zb2xlIGRyaXZlciBmb3IgbmV0d29yayBpbnRlcmZhY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBjaGFyIGNvbmZpZ1syNTZdOworbW9kdWxlX3BhcmFtX3N0cmluZyhuZXRjb25zb2xlLCBjb25maWcsIDI1NiwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5ldGNvbnNvbGUsICIgbmV0Y29uc29sZT1bc3JjLXBvcnRdQFtzcmMtaXBdL1tkZXZdLFt0Z3QtcG9ydF1APHRndC1pcD4vW3RndC1tYWNhZGRyXVxuIik7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0cG9sbCBucCA9IHsKKwkubmFtZSA9ICJuZXRjb25zb2xlIiwKKwkuZGV2X25hbWUgPSAiZXRoMCIsCisJLmxvY2FsX3BvcnQgPSA2NjY1LAorCS5yZW1vdGVfcG9ydCA9IDY2NjYsCisJLnJlbW90ZV9tYWMgPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn0sCisJLmRyb3AgPSBuZXRwb2xsX3F1ZXVlLAorfTsKK3N0YXRpYyBpbnQgY29uZmlndXJlZCA9IDA7CisKKyNkZWZpbmUgTUFYX1BSSU5UX0NIVU5LIDEwMDAKKworc3RhdGljIHZvaWQgd3JpdGVfbXNnKHN0cnVjdCBjb25zb2xlICpjb24sIGNvbnN0IGNoYXIgKm1zZywgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgZnJhZywgbGVmdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFucC5kZXYpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWZvcihsZWZ0ID0gbGVuOyBsZWZ0OyApIHsKKwkJZnJhZyA9IG1pbihsZWZ0LCBNQVhfUFJJTlRfQ0hVTkspOworCQluZXRwb2xsX3NlbmRfdWRwKCZucCwgbXNnLCBmcmFnKTsKKwkJbXNnICs9IGZyYWc7CisJCWxlZnQgLT0gZnJhZzsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSBuZXRjb25zb2xlID0geworCS5mbGFncyA9IENPTl9FTkFCTEVEIHwgQ09OX1BSSU5UQlVGRkVSLAorCS53cml0ZSA9IHdyaXRlX21zZworfTsKKworc3RhdGljIGludCBvcHRpb25fc2V0dXAoY2hhciAqb3B0KQoreworCWNvbmZpZ3VyZWQgPSAhbmV0cG9sbF9wYXJzZV9vcHRpb25zKCZucCwgb3B0KTsKKwlyZXR1cm4gMDsKK30KKworX19zZXR1cCgibmV0Y29uc29sZT0iLCBvcHRpb25fc2V0dXApOworCitzdGF0aWMgaW50IGluaXRfbmV0Y29uc29sZSh2b2lkKQoreworCWlmKHN0cmxlbihjb25maWcpKQorCQlvcHRpb25fc2V0dXAoY29uZmlnKTsKKworCWlmKCFjb25maWd1cmVkKSB7CisJCXByaW50aygibmV0Y29uc29sZTogbm90IGNvbmZpZ3VyZWQsIGFib3J0aW5nXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYobmV0cG9sbF9zZXR1cCgmbnApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZ2lzdGVyX2NvbnNvbGUoJm5ldGNvbnNvbGUpOworCXByaW50ayhLRVJOX0lORk8gIm5ldGNvbnNvbGU6IG5ldHdvcmsgbG9nZ2luZyBzdGFydGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9uZXRjb25zb2xlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9jb25zb2xlKCZuZXRjb25zb2xlKTsKKwluZXRwb2xsX2NsZWFudXAoJm5wKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9uZXRjb25zb2xlKTsKK21vZHVsZV9leGl0KGNsZWFudXBfbmV0Y29uc29sZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uaTUwMTAuYyBiL2RyaXZlcnMvbmV0L25pNTAxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjAxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uaTUwMTAuYwpAQCAtMCwwICsxLDgxMiBAQAorLyoJbmk1MDEwLmM6IEEgbmV0d29yayBkcml2ZXIgZm9yIHRoZSBNaUNvbS1JbnRlcmxhbiBOSTUwMTAgZXRoZXJjYXJkLgorICoKKyAqCUNvcHlyaWdodCAxOTk2LDE5OTcgSmFuLVBhc2NhbCB2YW4gQmVzdCBhbmQgQW5kcmVhcyBNb2hyLgorICoKKyAqCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogCVRoZSBhdXRob3JzIG1heSBiZSByZWFjaGVkIGFzOgorICoJCWp2YmVzdEB3aS5sZWlkZW51bml2Lm5sCQlhLm1vaHJAbWFpbHRvLmRlCisgKiAJb3IgYnkgc25haWwgbWFpbCBhcworICogCQlKYW4tUGFzY2FsIHZhbiBCZXN0CQlBbmRyZWFzIE1vaHIKKyAqCQlLbGlrc3BhYW53ZWcgNTgtNAkJU3RhdWZlcnN0ci4gNgorICoJCTIzMjQgTFogIExlaWRlbgkJCUQtNzEyNzIgUmVubmluZ2VuCisgKgkJVGhlIE5ldGhlcmxhbmRzCQkJR2VybWFueQorICoKKyAqCVNvdXJjZXM6CisgKiAJIAlEb25hbGQgQmVja2VyJ3MgInNrZWxldG9uLmMiCisgKiAgCQlDcnlud3Igbmk1MDEwIHBhY2tldCBkcml2ZXIKKyAqCisgKglDaGFuZ2VzOgorICoJCXYwLjA6IEZpcnN0IHRlc3QgdmVyc2lvbgorICoJCXYwLjE6IEZpcnN0IHdvcmtpbmcgdmVyc2lvbgorICoJCXYwLjI6CisgKgkJdjAuMy0+djAuOTA6IE5vdyBkZW1hbmQgc2V0dGluZyBpbyBhbmQgaXJxIHdoZW4gbG9hZGluZyBhcyBtb2R1bGUKKyAqCTk3MDQzMAl2MC45MTogbW9kaWZpZWQgZm9yIExpbnV4IDIuMS4xNAorICoJCXYwLjkyOiBJbXBsZW1lbnRlZCBBbmRyZWFzJyAoYmV0dGVyKSBOSTUwMTAgcHJvYmUKKyAqCTk3MDUwMwl2MC45MzogRml4ZWQgYXV0by1pcnEgZmFpbHVyZSBvbiB3YXJtIHJlYm9vdCAoSkIpCisgKgk5NzA2MjMJdjEuMDA6IEZpcnN0IGtlcm5lbCB2ZXJzaW9uIChBTSkKKyAqCTk3MDgxNAl2MS4wMTogQWRkZWQgZGV0ZWN0aW9uIG9mIG9uYm9hcmQgcmVjZWl2ZSBidWZmZXIgc2l6ZSAoQU0pCisgKglCdWdzOgorICoJCS0gTm9uZSBrbm93bi4uLgorICoJCS0gTm90ZSB0aGF0IHlvdSBoYXZlIHRvIHBhdGNoIGlmY29uZmlnIGZvciB0aGUgbmV3IC9wcm9jL25ldC9kZXYKKyAqCQlmb3JtYXQuIEl0IGdpdmVzIGluY29ycmVjdCBzdGF0cyBvdGhlcndpc2UuCisgKgorICoJVG8gZG86CisgKgkJRml4IGFsbCBidWdzIDotKQorICoJCU1vdmUgc29tZSBzdHVmZiB0byBjaGlwc2V0X2luaXQoKQorICoJCUhhbmRsZSB4bXQgZXJyb3JzIG90aGVyIHRoYW4gY29sbGlzaW9ucworICoJCUNvbXBsZXRlIG1lcmdlIHdpdGggQW5kcmVhcycgZHJpdmVyCisgKgkJSW1wbGVtZW50IHJpbmcgYnVmZmVycyAoSXMgdGhpcyB1c2VmdWw/IFlvdSBjYW4ndCBzcXVlZXplCisgKgkJCXRvbyBtYW55IHBhY2tldCBpbiBhIDJrIGJ1ZmZlciEpCisgKgkJSW1wbGVtZW50IERNQSAoQWdhaW4sIGlzIHRoaXMgdXNlZnVsPyBTb21lIGRvY3Mgc2F5cyBETUEgaXMKKyAqCQkJc2xvd2VyIHRoYW4gcHJvZ3JhbW1lZCBJL08pCisgKgorICoJQ29tcGlsZSB3aXRoOgorICoJCWdjYyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLW00ODYgLURfX0tFUk5FTF9fIFwKKyAqCQkJLURNT0RVTEUgLWMgbmk1MDEwLmMgCisgKgorICoJSW5zZXJ0IHdpdGggZS5nLjoKKyAqCQlpbnNtb2Qgbmk1MDEwLm8gaW89MHgzMDAgaXJxPTUgCQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSAibmk1MDEwLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpib2FyZG5hbWUgPSAiTkk1MDEwIjsKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0KKwkibmk1MDEwLmM6IHYxLjAwIDA2LzIzLzk3IEphbi1QYXNjYWwgdmFuIEJlc3QgYW5kIEFuZHJlYXMgTW9oclxuIjsKKwkKKy8qIGJ1ZnNpemVfcmN2ID09IDAgbWVhbnMgYXV0b3Byb2JpbmcgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnVmc2l6ZV9yY3Y7CisKKyNkZWZpbmUganVtcGVyZWRfaW50ZXJydXB0cwkvKiBJUlEgbGluZSBqdW1wZXJlZCBvbiBib2FyZCAqLworI3VuZGVmIGp1bXBlcmVkX2RtYQkJLyogTm8gRE1BIHVzZWQgKi8KKyN1bmRlZiBGVUxMX0lPREVURUNUCQkvKiBPbmx5IGRldGVjdCBpbiBwb3J0bGlzdCAqLworCisjaWZuZGVmIEZVTExfSU9ERVRFQ1QKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSS9PIGFkZHJlc3NlcyB0byBiZSBwcm9iZWQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBvcnRzW10gX19pbml0ZGF0YSA9CisJeyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMHgzODAsIDB4M2EwLCAwIH07CisjZW5kaWYKKworLyogVXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnICovCisjaWZuZGVmIE5JNTAxMF9ERUJVRworI2RlZmluZSBOSTUwMTBfREVCVUcgMAorI2VuZGlmCisKKy8qIEluZm9ybWF0aW9uIHRoYXQgbmVlZHMgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3N0cnVjdCBuaTUwMTBfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWludCBvX3BrdF9zaXplOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KKworc3RhdGljIGludAluaTUwMTBfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworc3RhdGljIGludAluaTUwMTBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJbmk1MDEwX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IG5pNTAxMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZAluaTUwMTBfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAluaTUwMTBfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJbmk1MDEwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuaTUwMTBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCW5pNTAxMF9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAlyZXNldF9yZWNlaXZlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGludAlwcm9jZXNzX3htdF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZGVmaW5lIHR4X2RvbmUoZGV2KSAxCitzdGF0aWMgdm9pZAloYXJkd2FyZV9zZW5kX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBsZW5ndGgsIGludCBwYWQpOworc3RhdGljIHZvaWQgCWNoaXBzZXRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhcnRwKTsKK3N0YXRpYyB2b2lkCWR1bXBfcGFja2V0KHZvaWQgKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgdm9pZCAJbmk1MDEwX3Nob3dfcmVnaXN0ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IGlvOworc3RhdGljIGludCBpcnE7CisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IG5pNTAxMF9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuaTUwMTBfbG9jYWwpKTsKKwlpbnQgKnBvcnQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwkJaW8gPSBkZXYtPmJhc2VfYWRkcjsKKwkJaXJxID0gZGV2LT5pcnE7CisJfQorCisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IEVudGVyaW5nIG5pNTAxMF9wcm9iZVxuIiwgZGV2LT5uYW1lKSk7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoaW8gPiAweDFmZikJewkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCWVyciA9IG5pNTAxMF9wcm9iZTEoZGV2LCBpbyk7CisJfSBlbHNlIGlmIChpbyAhPSAwKSB7CS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJZXJyID0gLUVOWElPOworCX0gZWxzZSB7CisjaWZkZWYgRlVMTF9JT0RFVEVDVAorCQlmb3IgKGlvPTB4MjAwOyBpbzwweDQwMCAmJiBuaTUwMTBfcHJvYmUxKGRldiwgaW8pIDsgaW8rPTB4MjApCisJCQk7CisJCWlmIChpbyA9PSAweDQwMCkKKwkJCWVyciA9IC1FTk9ERVY7CisKKyNlbHNlCisJCWZvciAocG9ydCA9IHBvcnRzOyAqcG9ydCAmJiBuaTUwMTBfcHJvYmUxKGRldiwgKnBvcnQpOyBwb3J0KyspCisJCQk7CisJCWlmICghKnBvcnQpCisJCQllcnIgPSAtRU5PREVWOworI2VuZGlmCS8qIEZVTExfSU9ERVRFQ1QgKi8KKwl9CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBOSTUwMTBfSU9fRVhURU5UKTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJkX3BvcnQoaW50IGlvYWRkcikKK3sKKwlpbmIoSUVfUkJVRik7CisJcmV0dXJuIGluYihJRV9TQVBST00pOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdHJpZ2dlcl9pcnEoaW50IGlvYWRkcikKK3sKKwkJb3V0YigweDAwLCBFRExDX1JFU0VUKTsJLyogQ2xlYXIgRURMQyBob2xkIFJFU0VUIHN0YXRlICovCisJCW91dGIoMHgwMCwgSUVfUkVTRVQpOwkvKiBCb2FyZCByZXNldCAqLworCQlvdXRiKDB4MDAsIEVETENfWE1BU0spOwkvKiBEaXNhYmxlIGFsbCBYbXQgaW50ZXJydXB0cyAqLworCQlvdXRiKDB4MDAsIEVETENfUk1BU0spOyAvKiBEaXNhYmxlIGFsbCBSY3YgaW50ZXJydXB0ICovCisJCW91dGIoMHhmZiwgRURMQ19YQ0xSKTsJLyogQ2xlYXIgYWxsIHBlbmRpbmcgWG10IGludGVycnVwdHMgKi8KKwkJb3V0YigweGZmLCBFRExDX1JDTFIpOwkvKiBDbGVhciBhbGwgcGVuZGluZyBSY3YgaW50ZXJydXB0cyAqLworCQkvKgorCQkgKiBUcmFuc21pdCBwYWNrZXQgbW9kZTogSWdub3JlIHBhcml0eSwgUG93ZXIgeGN2ciwKKwkJICogCUVuYWJsZSBsb29wYmFjaworCQkgKi8KKwkJb3V0YihYTURfSUdfUEFSIHwgWE1EX1RfTU9ERSB8IFhNRF9MQkMsIEVETENfWE1PREUpOworCQlvdXRiKFJNRF9CUk9BRENBU1QsIEVETENfUk1PREUpOyAvKiBSZWNlaXZlIG5vcm1hbCZicm9hZGNhc3QgKi8KKwkJb3V0YihYTV9BTEwsIEVETENfWE1BU0spOwkvKiBFbmFibGUgYWxsIFhtdCBpbnRlcnJ1cHRzICovCisJCXVkZWxheSg1MCk7CQkJLyogRklYTUU6IE5lY2Vzc2FyeT8gKi8KKwkJb3V0YihNTV9FTl9YTVR8TU1fTVVYLCBJRV9NTU9ERSk7IC8qIFN0YXJ0IHRyYW5zbWlzc2lvbiAqLworfQorCisvKgorICogICAgICBUaGlzIGlzIHRoZSByZWFsIHByb2JlIHJvdXRpbmUuICBMaW51eCBoYXMgYSBoaXN0b3J5IG9mIGZyaWVuZGx5IGRldmljZQorICogICAgICBwcm9iZXMgb24gdGhlIElTQSBidXMuICBBIGdvb2QgZGV2aWNlIHByb2JlcyBhdm9pZHMgZG9pbmcgd3JpdGVzLCBhbmQKKyAqICAgICAgdmVyaWZpZXMgdGhhdCB0aGUgY29ycmVjdCBkZXZpY2UgZXhpc3RzIGFuZCBmdW5jdGlvbnMuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgbmk1MDEwX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKQoreworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisJc3RydWN0IG5pNTAxMF9sb2NhbCAqbHA7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGRhdGEgPSAwOworCWludCBib2d1c2NvdW50ID0gNDA7CisJaW50IGVyciA9IC1FTk9ERVY7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBOSTUwMTBfSU9fRVhURU5ULCBib2FyZG5hbWUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyoKKwkgKiBUaGlzIGlzIG5vICJvZmZpY2lhbCIgcHJvYmUgbWV0aG9kLCBJJ3ZlIHJhdGhlciB0ZXN0ZWQgd2hpY2gKKwkgKiBwcm9iZSB3b3JrcyBiZXN0IHdpdGggbXkgc2V2ZW4gTkk1MDEwIGNhcmRzCisJICogKHRoZXkgaGF2ZSB2ZXJ5IGRpZmZlcmVudCBzZXJpYWwgbnVtYmVycykKKwkgKiBTdWdnZXN0aW9ucyBvciBmYWlsdXJlIHJlcG9ydHMgYXJlIHZlcnksIHZlcnkgd2VsY29tZSAhCisJICogQnV0IEkgdGhpbmsgaXQgaXMgYSByZWxhdGl2ZWx5IGdvb2QgcHJvYmUgbWV0aG9kCisJICogc2luY2UgaXQgZG9lc24ndCB1c2UgYW55ICJvdXRiIgorCSAqIEl0IHNob3VsZCBiZSBuZWFybHkgMTAwJSByZWxpYWJsZSAhCisJICogd2VsbC1rbm93biBXQVJOSU5HOiB0aGlzIHByb2JlIG1ldGhvZCAobGlrZSBtYW55IG90aGVycykKKwkgKiB3aWxsIGhhbmcgdGhlIHN5c3RlbSBpZiBhIE5FMjAwMCBjYXJkIHJlZ2lvbiBpcyBwcm9iZWQgIQorCSAqCisJICogICAtIEFuZHJlYXMKKwkgKi8KKworIAlQUklOVEsyKChLRVJOX0RFQlVHICIlczogZW50ZXJpbmcgbmk1MDEwX3Byb2JlMSglIzN4KVxuIiwgCisgCQlkZXYtPm5hbWUsIGlvYWRkcikpOworCisJaWYgKGluYihpb2FkZHIrMCkgPT0gMHhmZikKKwkJZ290byBvdXQ7CisKKwl3aGlsZSAoIChyZF9wb3J0KGlvYWRkcikgJiByZF9wb3J0KGlvYWRkcikgJiByZF9wb3J0KGlvYWRkcikgJgorCQkgcmRfcG9ydChpb2FkZHIpICYgcmRfcG9ydChpb2FkZHIpICYgcmRfcG9ydChpb2FkZHIpKSAhPSAweGZmKQorCXsKKwkJaWYgKGJvZ3VzY291bnQtLSA9PSAwKQorCQkJZ290byBvdXQ7CisJfQorCisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IEkvTyAjMSBwYXNzZWQhXG4iLCBkZXYtPm5hbWUpKTsKKworCWZvciAoaT0wOyBpPDMyOyBpKyspCisJCWlmICggKGRhdGEgPSByZF9wb3J0KGlvYWRkcikpICE9IDB4ZmYpIGJyZWFrOworCWlmIChkYXRhPT0weGZmKQorCQlnb3RvIG91dDsKKworCVBSSU5USzIoKEtFUk5fREVCVUcgIiVzOiBJL08gIzIgcGFzc2VkIVxuIiwgZGV2LT5uYW1lKSk7CisKKwlpZiAoKGRhdGEgIT0gU0FfQUREUjApIHx8IChyZF9wb3J0KGlvYWRkcikgIT0gU0FfQUREUjEpIHx8CisJICAgIChyZF9wb3J0KGlvYWRkcikgIT0gU0FfQUREUjIpKQorCQlnb3RvIG91dDsKKworCWZvciAoaT0wOyBpPDQ7IGkrKykKKwkJcmRfcG9ydChpb2FkZHIpOworCisJaWYgKCAocmRfcG9ydChpb2FkZHIpICE9IE5JNTAxMF9NQUdJQ1ZBTDEpIHx8CisJICAgICAocmRfcG9ydChpb2FkZHIpICE9IE5JNTAxMF9NQUdJQ1ZBTDIpICkKKwkJZ290byBvdXQ7CisKKwlQUklOVEsyKChLRVJOX0RFQlVHICIlczogSS9PICMzIHBhc3NlZCFcbiIsIGRldi0+bmFtZSkpOworCisJaWYgKE5JNTAxMF9ERUJVRyAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisJcHJpbnRrKCJOSTUwMTAgZXRoZXJjYXJkIHByb2JlIGF0IDB4JXg6ICIsIGlvYWRkcik7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworCWZvciAoaT0wOyBpPDY7IGkrKykgeworCQlvdXR3KGksIElFX0dQKTsKKwkJcHJpbnRrKCIlMi4yeCAiLCBkZXYtPmRldl9hZGRyW2ldID0gaW5iKElFX1NBUFJPTSkpOworCX0KKworCVBSSU5USzIoKEtFUk5fREVCVUcgIiVzOiBJL08gIzQgcGFzc2VkIVxuIiwgZGV2LT5uYW1lKSk7CisKKyNpZmRlZiBqdW1wZXJlZF9pbnRlcnJ1cHRzCisJaWYgKGRldi0+aXJxID09IDB4ZmYpCisJCTsKKwllbHNlIGlmIChkZXYtPmlycSA8IDIpIHsKKwkJdW5zaWduZWQgbG9uZyBpcnFfbWFzazsKKworCQlQUklOVEsyKChLRVJOX0RFQlVHICIlczogSS9PICM1IHBhc3NlZCFcbiIsIGRldi0+bmFtZSkpOworCisJCWlycV9tYXNrID0gcHJvYmVfaXJxX29uKCk7CisJCXRyaWdnZXJfaXJxKGlvYWRkcik7CisJCW1kZWxheSgyMCk7CisJCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZihpcnFfbWFzayk7CisKKwkJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IEkvTyAjNiBwYXNzZWQhXG4iLCBkZXYtPm5hbWUpKTsKKworCQlpZiAoZGV2LT5pcnEgPT0gMCkgeworCQkJZXJyID0gLUVBR0FJTjsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBubyBJUlEgZm91bmQhXG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKwkJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IEkvTyAjNyBwYXNzZWQhXG4iLCBkZXYtPm5hbWUpKTsKKwl9IGVsc2UgaWYgKGRldi0+aXJxID09IDIpIHsKKwkJZGV2LT5pcnEgPSA5OworCX0KKyNlbmRpZgkvKiBqdW1wZXJlZF9pcnEgKi8KKwlQUklOVEsyKChLRVJOX0RFQlVHICIlczogSS9PICM5IHBhc3NlZCFcbiIsIGRldi0+bmFtZSkpOworCisJLyogRE1BIGlzIG5vdCBzdXBwb3J0ZWQgKHlldD8pLCBzbyBubyB1c2UgZGV0ZWN0aW5nIGl0ICovCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworCVBSSU5USzIoKEtFUk5fREVCVUcgIiVzOiBJL08gIzEwIHBhc3NlZCFcbiIsIGRldi0+bmFtZSkpOworCisvKiBnZXQgdGhlIHNpemUgb2YgdGhlIG9uYm9hcmQgcmVjZWl2ZSBidWZmZXIKKyAqIGhpZ2hlciBhZGRyZXNzZXMgdGhhbiBidWZzaXplIGFyZSB3cmFwcGVkIGludG8gcmVhbCBidWZmZXIKKyAqIGkuZS4gZGF0YSBmb3Igb2Zmcy4gMHg4MDEgaXMgd3JpdHRlbiB0byAweDEgd2l0aCBhIDJLIG9uYm9hcmQgYnVmZmVyCisgKi8KKwlpZiAoIWJ1ZnNpemVfcmN2KSB7CisgICAgICAgIAlvdXRiKDEsIElFX01NT0RFKTsgICAgICAvKiBQdXQgUmN2IGJ1ZmZlciBvbiBzeXN0ZW0gYnVzICovCisgICAgICAgIAlvdXR3KDAsIElFX0dQKTsJCS8qIFBvaW50IEdQIGF0IHN0YXJ0IG9mIHBhY2tldCAqLworICAgICAgICAJb3V0YigwLCBJRV9SQlVGKTsJLyogc2V0IGJ1ZmZlciBieXRlIDAgdG8gMCAqLworICAgICAgICAJZm9yIChpID0gMTsgaSA8IDB4ZmY7IGkrKykgeworICAgICAgICAgICAgICAgIAlvdXR3KGkgPDwgOCwgSUVfR1ApOyAvKiBQb2ludCBHUCBhdCBwYWNrZXQgc2l6ZSB0byBiZSB0ZXN0ZWQgKi8KKyAgICAgICAgICAgICAgICAJb3V0YihpLCBJRV9SQlVGKTsKKyAgICAgICAgICAgICAgICAJb3V0dygweDAsIElFX0dQKTsgLyogUG9pbnQgR1AgYXQgc3RhcnQgb2YgcGFja2V0ICovCisgICAgICAgICAgICAgICAgCWRhdGEgPSBpbmIoSUVfUkJVRik7CisgICAgICAgICAgICAgICAgCWlmIChkYXRhID09IGkpIGJyZWFrOworICAgICAgICAJfQorCQlidWZzaXplX3JjdiA9IGkgPDwgODsKKyAgICAgICAgCW91dHcoMCwgSUVfR1ApOwkJLyogUG9pbnQgR1AgYXQgc3RhcnQgb2YgcGFja2V0ICovCisgICAgICAgIAlvdXRiKDAsIElFX1JCVUYpOwkvKiBzZXQgYnVmZmVyIGJ5dGUgMCB0byAwIGFnYWluICovCisJfQorICAgICAgICBwcmludGsoIi8vIGJ1ZnNpemUgcmN2L3htdD0lZC8lZFxuIiwgYnVmc2l6ZV9yY3YsIE5JNTAxMF9CVUZTSVpFKTsKKwltZW1zZXQoZGV2LT5wcml2LCAwLCBzaXplb2Yoc3RydWN0IG5pNTAxMF9sb2NhbCkpOworCQorCWRldi0+b3BlbgkJPSBuaTUwMTBfb3BlbjsKKwlkZXYtPnN0b3AJCT0gbmk1MDEwX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gbmk1MDEwX3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzCQk9IG5pNTAxMF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBuaTUwMTBfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+dHhfdGltZW91dAkJPSBuaTUwMTBfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gSFovMjA7CisKKwlkZXYtPmZsYWdzICY9IH5JRkZfTVVMVElDQVNUOwkvKiBNdWx0aWNhc3QgZG9lc24ndCB3b3JrICovCisKKwkvKiBTaHV0IHVwIHRoZSBuaTUwMTAgKi8KKwlvdXRiKDAsIEVETENfUk1BU0spOwkvKiBNYXNrIGFsbCByZWNlaXZlIGludGVycnVwdHMgKi8KKwlvdXRiKDAsIEVETENfWE1BU0spOwkvKiBNYXNrIGFsbCB4bWl0IGludGVycnVwdHMgKi8KKwlvdXRiKDB4ZmYsIEVETENfUkNMUik7CS8qIEtpbGwgYWxsIHBlbmRpbmcgcmN2IGludGVycnVwdHMgKi8KKwlvdXRiKDB4ZmYsIEVETENfWENMUik7IAkvKiBLaWxsIGFsbCBwZW5kaW5nIHhtdCBpbnRlcnJ1cHRzICovCisKKwlwcmludGsoS0VSTl9JTkZPICIlczogTkk1MDEwIGZvdW5kIGF0IDB4JXgsIHVzaW5nIElSUSAlZCIsIGRldi0+bmFtZSwgaW9hZGRyLCBkZXYtPmlycSk7CisJaWYgKGRldi0+ZG1hKSBwcmludGsoIiAmIERNQSAlZCIsIGRldi0+ZG1hKTsKKwlwcmludGsoIi5cbiIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSm9pbiB0aGUgTkk1MDEwIGRyaXZlciBkZXZlbG9wbWVudCB0ZWFtIVxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiTWFpbCB0byBhLm1vaHJAbWFpbHRvLmRlIG9yIGp2YmVzdEB3aS5sZWlkZW51bml2Lm5sXG4iKTsKKwlyZXR1cm4gMDsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTkk1MDEwX0lPX0VYVEVOVCk7CisJcmV0dXJuIGVycjsKK30KKworLyogCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKKyAqIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgKiByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICogdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworICAgCitzdGF0aWMgaW50IG5pNTAxMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIG5pNTAxMF9vcGVuKClcbiIsIGRldi0+bmFtZSkpOyAKKwkKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZuaTUwMTBfaW50ZXJydXB0LCAwLCBib2FyZG5hbWUsIGRldikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhbm5vdCBnZXQgaXJxICUjMnhcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJUFJJTlRLMygoS0VSTl9ERUJVRyAiJXM6IHBhc3NlZCBvcGVuKCkgIzFcbiIsIGRldi0+bmFtZSkpOworICAgICAgICAvKgorICAgICAgICAgKiBBbHdheXMgYWxsb2NhdGUgdGhlIERNQSBjaGFubmVsIGFmdGVyIHRoZSBJUlEsCisgICAgICAgICAqIGFuZCBjbGVhbiB1cCBvbiBmYWlsdXJlLgorICAgICAgICAgKi8KKyNpZmRlZiBqdW1wZXJlZF9kbWEKKyAgICAgICAgaWYgKHJlcXVlc3RfZG1hKGRldi0+ZG1hLCBjYXJkbmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhbm5vdCBnZXQgZG1hICUjMnhcbiIsIGRldi0+bmFtZSwgZGV2LT5kbWEpOworICAgICAgICAgICAgICAgIGZyZWVfaXJxKGRldi0+aXJxLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgfQorI2VuZGlmCS8qIGp1bXBlcmVkX2RtYSAqLworCisJUFJJTlRLMygoS0VSTl9ERUJVRyAiJXM6IHBhc3NlZCBvcGVuKCkgIzJcbiIsIGRldi0+bmFtZSkpOworCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSBoZXJlLiAgRG9uJ3QgZm9yZ2V0IHRvIHNldCB0aGUgc3RhdGlvbiBhZGRyZXNzLiAqLworCisJb3V0YihSU19SRVNFVCwgRURMQ19SRVNFVCk7CS8qIEhvbGQgdXAgRURMQ19SRVNFVCB3aGlsZSBjb25maWdpbmcgYm9hcmQgKi8KKwlvdXRiKDAsIElFX1JFU0VUKTsJCS8qIEhhcmR3YXJlIHJlc2V0IG9mIG5pNTAxMCBib2FyZCAqLworCW91dGIoWE1EX0xCQywgRURMQ19YTU9ERSk7CS8qIE9ubHkgbG9vcGJhY2sgeG1pdHMgKi8KKworCVBSSU5USzMoKEtFUk5fREVCVUcgIiVzOiBwYXNzZWQgb3BlbigpICMzXG4iLCBkZXYtPm5hbWUpKTsKKwkvKiBTZXQgdGhlIHN0YXRpb24gYWRkcmVzcyAqLworCWZvcihpID0gMDtpIDwgNjsgaSsrKSB7CisJCW91dGIoZGV2LT5kZXZfYWRkcltpXSwgRURMQ19BRERSICsgaSk7CisJfQorCQorCVBSSU5USzMoKEtFUk5fREVCVUcgIiVzOiBJbml0aWFsaXNpbmcgbmk1MDEwXG4iLCBkZXYtPm5hbWUpKTsgCisJb3V0YigwLCBFRExDX1hNQVNLKTsJLyogTm8geG1pdCBpbnRlcnJ1cHRzIGZvciBub3cgKi8KKwlvdXRiKFhNRF9JR19QQVIgfCBYTURfVF9NT0RFIHwgWE1EX0xCQywgRURMQ19YTU9ERSk7IAorCQkJCS8qIE5vcm1hbCBwYWNrZXQgeG1pdCBtb2RlICovCisJb3V0YigweGZmLCBFRExDX1hDTFIpOwkvKiBDbGVhciBhbGwgcGVuZGluZyB4bWl0IGludGVycnVwdHMgKi8KKwlvdXRiKFJNRF9CUk9BRENBU1QsIEVETENfUk1PREUpOworCQkJCS8qIFJlY2VpdmUgYnJvYWRjYXN0IGFuZCBub3JtYWwgcGFja2V0cyAqLworCXJlc2V0X3JlY2VpdmVyKGRldik7CS8qIFJlYWR5IG5pNTAxMCBmb3IgcmVjZWl2aW5nIHBhY2tldHMgKi8KKwkKKwlvdXRiKDAsIEVETENfUkVTRVQpOwkvKiBVbi1yZXNldCB0aGUgbmk1MDEwICovCisJCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCisJaWYgKE5JNTAxMF9ERUJVRykgbmk1MDEwX3Nob3dfcmVnaXN0ZXJzKGRldik7IAorCisJUFJJTlRLKChLRVJOX0RFQlVHICIlczogb3BlbiBzdWNjZXNzZnVsXG4iLCBkZXYtPm5hbWUpKTsKKyAgICAgCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZXNldF9yZWNlaXZlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkKKwlQUklOVEszKChLRVJOX0RFQlVHICIlczogcmVzZXR0aW5nIHJlY2VpdmVyXG4iLCBkZXYtPm5hbWUpKTsKKwlvdXR3KDAsIElFX0dQKTsJCS8qIFJlY2VpdmUgcGFja2V0IGF0IHN0YXJ0IG9mIGJ1ZmZlciAqLworCW91dGIoMHhmZiwgRURMQ19SQ0xSKTsJLyogQ2xlYXIgYWxsIHBlbmRpbmcgcmN2IGludGVycnVwdHMgKi8KKwlvdXRiKDAsIElFX01NT0RFKTsJLyogUHV0IEVETEMgdG8gcmN2IGJ1ZmZlciAqLworCW91dGIoTU1fRU5fUkNWLCBJRV9NTU9ERSk7IC8qIEVuYWJsZSByY3YgKi8KKwlvdXRiKDB4ZmYsIEVETENfUk1BU0spOwkvKiBFbmFibGUgYWxsIHJjdiBpbnRlcnJ1cHRzICovCit9CisKK3N0YXRpYyB2b2lkIG5pNTAxMF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/XG4iLCBkZXYtPm5hbWUsCisJCSAgIHR4X2RvbmUoZGV2KSA/ICJJUlEgY29uZmxpY3QiIDogIm5ldHdvcmsgY2FibGUgcHJvYmxlbSIpOworCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLiAqLworCS8qIEZJWE1FOiBHaXZlIGl0IGEgcmVhbCBraWNrIGhlcmUgKi8KKwljaGlwc2V0X2luaXQoZGV2LCAxKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQgbmk1MDEwX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIG5pNTAxMF9zZW5kX3BhY2tldFxuIiwgZGV2LT5uYW1lKSk7CisKKwkvKiAKKyAgICAgICAgICogQmxvY2sgc2VuZGluZworCSAqLworCQorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwloYXJkd2FyZV9zZW5kX3BhY2tldChkZXYsICh1bnNpZ25lZCBjaGFyICopc2tiLT5kYXRhLCBza2ItPmxlbiwgbGVuZ3RoLXNrYi0+bGVuKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlkZXZfa2ZyZWVfc2tiIChza2IpOworCXJldHVybiAwOworfQorCisvKiAKKyAqIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisgKiBIYW5kbGUgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGludGVycnVwdHMuIAorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgbmk1MDEwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IG5pNTAxMF9sb2NhbCAqbHA7CisJaW50IGlvYWRkciwgc3RhdHVzOworCWludCB4bWl0X3dhc19lcnJvciA9IDA7CisKKwlQUklOVEsyKChLRVJOX0RFQlVHICIlczogZW50ZXJpbmcgbmk1MDEwX2ludGVycnVwdFxuIiwgZGV2LT5uYW1lKSk7CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJCisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisJc3RhdHVzID0gaW5iKElFX0lTVEFUKTsgCisJUFJJTlRLMygoS0VSTl9ERUJVRyAiJXM6IElFX0lTVEFUID0gJSMwMnhcbiIsIGRldi0+bmFtZSwgc3RhdHVzKSk7CisJCQorICAgICAgICBpZiAoKHN0YXR1cyAmIElTX1JfSU5UKSA9PSAwKSBuaTUwMTBfcngoZGV2KTsKKworICAgICAgICBpZiAoKHN0YXR1cyAmIElTX1hfSU5UKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgeG1pdF93YXNfZXJyb3IgPSBwcm9jZXNzX3htdF9pbnRlcnJ1cHQoZGV2KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoc3RhdHVzICYgSVNfRE1BX0lOVCkgPT0gMCkgeworICAgICAgICAgICAgICAgIFBSSU5USygoS0VSTl9ERUJVRyAiJXM6IERNQSBjb21wbGV0ZSAoPylcbiIsIGRldi0+bmFtZSkpOworICAgICAgICAgICAgICAgIG91dGIoMCwgSUVfRE1BX1JTVCk7IC8qIFJlc2V0IERNQSBpbnQgKi8KKyAgICAgICAgfQorCisJaWYgKCF4bWl0X3dhc19lcnJvcikgCisJCXJlc2V0X3JlY2VpdmVyKGRldik7IAorCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyB2b2lkIGR1bXBfcGFja2V0KHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwkKKwlwcmludGsoS0VSTl9ERUJVRyAiUGFja2V0IGxlbmd0aCA9ICUjNHhcbiIsIGxlbik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKXsKKwkJaWYgKGkgJSAxNiA9PSAwKSBwcmludGsoS0VSTl9ERUJVRyAiJSM0LjR4IiwgaSk7CisJCWlmIChpICUgMiA9PSAwKSBwcmludGsoIiAiKTsKKwkJcHJpbnRrKCIlMi4yeCIsICgodW5zaWduZWQgY2hhciAqKWJ1ZilbaV0pOworCQlpZiAoaSAlIDE2ID09IDE1KSBwcmludGsoIlxuIik7CisJfQorCXByaW50aygiXG4iKTsKKwkKKwlyZXR1cm47Cit9CisKKy8qIFdlIGhhdmUgYSBnb29kIHBhY2tldCwgZ2V0IGl0IG91dCBvZiB0aGUgYnVmZmVyLiAqLworc3RhdGljIHZvaWQgbmk1MDEwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5pNTAxMF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHJjdl9zdGF0OworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGlfcGt0X3NpemU7CisJCisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIG5pNTAxMF9yeCgpXG4iLCBkZXYtPm5hbWUpKTsgCisJCisJcmN2X3N0YXQgPSBpbmIoRURMQ19SU1RBVCk7CisJUFJJTlRLMygoS0VSTl9ERUJVRyAiJXM6IEVETENfUlNUQVQgPSAlIzJ4XG4iLCBkZXYtPm5hbWUsIHJjdl9zdGF0KSk7IAorCQorCWlmICggKHJjdl9zdGF0ICYgUlNfVkFMSURfQklUUykgIT0gUlNfUEtUX09LKSB7CisJCVBSSU5USygoS0VSTl9JTkZPICIlczogcmVjZWl2ZSBlcnJvci5cbiIsIGRldi0+bmFtZSkpOworCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWlmIChyY3Zfc3RhdCAmIFJTX1JVTlQpIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWlmIChyY3Zfc3RhdCAmIFJTX0FMSUdOKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCWlmIChyY3Zfc3RhdCAmIFJTX0NSQ19FUlIpIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCWlmIChyY3Zfc3RhdCAmIFJTX09GTFcpIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworICAgICAgICAJb3V0YigweGZmLCBFRExDX1JDTFIpOyAvKiBDbGVhciB0aGUgaW50ZXJydXB0ICovCisJCXJldHVybjsKKwl9CisJCisgICAgICAgIG91dGIoMHhmZiwgRURMQ19SQ0xSKTsgIC8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKworCWlfcGt0X3NpemUgPSBpbncoSUVfUkNOVCk7CisJaWYgKGlfcGt0X3NpemUgPiBFVEhfRlJBTUVfTEVOIHx8IGlfcGt0X3NpemUgPCAxMCApIHsKKwkJUFJJTlRLKChLRVJOX0RFQlVHICIlczogUGFja2V0IHNpemUgZXJyb3IsIHBhY2tldCBzaXplID0gJSM0LjR4XG4iLCAKKwkJCWRldi0+bmFtZSwgaV9wa3Rfc2l6ZSkpOworCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCXJldHVybjsKKwl9CisKKwkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4gKi8KKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGlfcGt0X3NpemUgKyAzKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCQorCXNrYi0+ZGV2ID0gZGV2OworCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCisJLyogUmVhZCBwYWNrZXQgaW50byBidWZmZXIgKi8KKyAgICAgICAgb3V0YihNTV9NVVgsIElFX01NT0RFKTsgLyogUmN2IGJ1ZmZlciB0byBzeXN0ZW0gYnVzICovCisJb3V0dygwLCBJRV9HUCk7CS8qIFNlZWsgdG8gYmVnaW5uaW5nIG9mIHBhY2tldCAqLworCWluc2IoSUVfUkJVRiwgc2tiX3B1dChza2IsIGlfcGt0X3NpemUpLCBpX3BrdF9zaXplKTsgCisJCisJaWYgKE5JNTAxMF9ERUJVRyA+PSA0KSAKKwkJZHVtcF9wYWNrZXQoc2tiLT5kYXRhLCBza2ItPmxlbik7IAorCQkKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGlfcGt0X3NpemU7CisKKwlQUklOVEsyKChLRVJOX0RFQlVHICIlczogUmVjZWl2ZWQgcGFja2V0LCBzaXplPSUjNC40eFxuIiwgCisJCWRldi0+bmFtZSwgaV9wa3Rfc2l6ZSkpOworCQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfeG10X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuaTUwMTBfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHhtaXRfc3RhdDsKKworCVBSSU5USzIoKEtFUk5fREVCVUcgIiVzOiBlbnRlcmluZyBwcm9jZXNzX3htdF9pbnRlcnJ1cHRcbiIsIGRldi0+bmFtZSkpOworCisJeG1pdF9zdGF0ID0gaW5iKEVETENfWFNUQVQpOworCVBSSU5USzMoKEtFUk5fREVCVUcgIiVzOiBFRExDX1hTVEFUID0gJTIuMnhcbiIsIGRldi0+bmFtZSwgeG1pdF9zdGF0KSk7CisJCisJb3V0YigwLCBFRExDX1hNQVNLKTsJLyogRGlzYWJsZSB4bWl0IElSUSdzICovCisJb3V0YigweGZmLCBFRExDX1hDTFIpOwkvKiBDbGVhciBhbGwgcGVuZGluZyB4bWl0IElSUSdzICovCisJCisJaWYgKHhtaXRfc3RhdCAmIFhTX0NPTEwpeworCQlQUklOVEsoKEtFUk5fREVCVUcgIiVzOiBjb2xsaXNpb24gZGV0ZWN0ZWQsIHJldHJhbnNtaXR0aW5nXG4iLCAKKwkJCWRldi0+bmFtZSkpOworCQlvdXR3KE5JNTAxMF9CVUZTSVpFIC0gbHAtPm9fcGt0X3NpemUsIElFX0dQKTsKKwkJLyogb3V0YigwLCBJRV9NTU9ERSk7ICovIC8qIHhtdCBidWYgb24gc3lzYnVzIEZJWE1FOiBuZWVkZWQgPyAqLworCQlvdXRiKE1NX0VOX1hNVCB8IE1NX01VWCwgSUVfTU1PREUpOworCQlvdXRiKFhNX0FMTCwgRURMQ19YTUFTSyk7IC8qIEVuYWJsZSB4bXQgSVJRJ3MgKi8KKwkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogRklYTUU6IGhhbmRsZSBvdGhlciB4bXQgZXJyb3IgY29uZGl0aW9ucyAqLworCisJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbHAtPm9fcGt0X3NpemU7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IHNlbnQgcGFja2V0LCBzaXplPSUjNC40eFxuIiwgCisJCWRldi0+bmFtZSwgbHAtPm9fcGt0X3NpemUpKTsKKworCXJldHVybiAwOworfQorCisvKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIG5pNTAxMF9vcGVuKCkuICovCitzdGF0aWMgaW50IG5pNTAxMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCVBSSU5USzIoKEtFUk5fREVCVUcgIiVzOiBlbnRlcmluZyBuaTUwMTBfY2xvc2VcbiIsIGRldi0+bmFtZSkpOworI2lmZGVmIGp1bXBlcmVkX2ludGVycnVwdHMJCisJZnJlZV9pcnEoZGV2LT5pcnEsIE5VTEwpOworI2VuZGlmCisJLyogUHV0IGNhcmQgaW4gaGVsZC1SRVNFVCBzdGF0ZSAqLworCW91dGIoMCwgSUVfTU1PREUpOworCW91dGIoUlNfUkVTRVQsIEVETENfUkVTRVQpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCVBSSU5USygoS0VSTl9ERUJVRyAiJXM6ICVzIGNsb3NlZCBkb3duXG4iLCBkZXYtPm5hbWUsIGJvYXJkbmFtZSkpOworCXJldHVybiAwOworCit9CisKKy8qIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLglUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yCisgICBjbG9zZWQuICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5pNTAxMF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgbmk1MDEwX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlQUklOVEsyKChLRVJOX0RFQlVHICIlczogZW50ZXJpbmcgbmk1MDEwX2dldF9zdGF0c1xuIiwgZGV2LT5uYW1lKSk7CisJCisJaWYgKE5JNTAxMF9ERUJVRykgbmk1MDEwX3Nob3dfcmVnaXN0ZXJzKGRldik7CisJCisJLyogY2xpKCk7ICovCisJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGZyb20gdGhlIGRldmljZSByZWdpc3RlcnMuICovCisJLyogV2UgZG8gdGhpcyBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwkvKiBzdGkoKTsgKi8KKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAgIG51bV9hZGRycyA9PSAtMSAgICAgIFByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKyAgIG51bV9hZGRycyA9PSAwICAgICAgIE5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICAgbnVtX2FkZHJzID4gMCAgICAgICAgTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLCBhbmQgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QtZWZmb3J0IGZpbHRlcmluZy4KKyovCitzdGF0aWMgdm9pZCBuaTUwMTBfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7ICAKKworCVBSSU5USzIoKEtFUk5fREVCVUcgIiVzOiBlbnRlcmluZyBzZXRfbXVsdGljYXN0X2xpc3RcbiIsIGRldi0+bmFtZSkpOworCisJaWYgKGRldi0+ZmxhZ3MmSUZGX1BST01JU0MgfHwgZGV2LT5mbGFncyZJRkZfQUxMTVVMVEkpIHsKKwkJZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKKwkJb3V0YihSTURfUFJPTUlTQywgRURMQ19STU9ERSk7IC8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCVBSSU5USygoS0VSTl9ERUJVRyAiJXM6IEVudGVyaW5nIHByb21pc2N1b3VzIG1vZGVcbiIsIGRldi0+bmFtZSkpOworCX0gZWxzZSBpZiAoZGV2LT5tY19saXN0KSB7CisJCS8qIFNvcnJ5LCBtdWx0aWNhc3Qgbm90IHN1cHBvcnRlZCAqLworCQlQUklOVEsoKEtFUk5fREVCVUcgIiVzOiBObyBtdWx0aWNhc3QsIGVudGVyaW5nIGJyb2FkY2FzdCBtb2RlXG4iLCBkZXYtPm5hbWUpKTsKKwkJb3V0YihSTURfQlJPQURDQVNULCBFRExDX1JNT0RFKTsKKwl9IGVsc2UgeworCQlQUklOVEsoKEtFUk5fREVCVUcgIiVzOiBFbnRlcmluZyBicm9hZGNhc3QgbW9kZVxuIiwgZGV2LT5uYW1lKSk7CisJCW91dGIoUk1EX0JST0FEQ0FTVCwgRURMQ19STU9ERSk7ICAvKiBEaXNhYmxlIHByb21pc2N1b3VzIG1vZGUsIHVzZSBub3JtYWwgbW9kZSAqLworCX0KK30KKworc3RhdGljIHZvaWQgaGFyZHdhcmVfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbGVuZ3RoLCBpbnQgcGFkKQoreworCXN0cnVjdCBuaTUwMTBfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgYnVmX29mZnM7CisKKwlQUklOVEsyKChLRVJOX0RFQlVHICIlczogZW50ZXJpbmcgaGFyZHdhcmVfc2VuZF9wYWNrZXRcbiIsIGRldi0+bmFtZSkpOworCQorICAgICAgICBpZiAobGVuZ3RoID4gRVRIX0ZSQU1FX0xFTikgeworICAgICAgICAgICAgICAgIFBSSU5USygoS0VSTl9XQVJOSU5HICIlczogcGFja2V0IHRvbyBsYXJnZSwgbm90IHBvc3NpYmxlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwlpZiAoTkk1MDEwX0RFQlVHKSBuaTUwMTBfc2hvd19yZWdpc3RlcnMoZGV2KTsKKworCWlmIChpbmIoSUVfSVNUQVQpICYgSVNfRU5fWE1UKSB7CisJCVBSSU5USygoS0VSTl9XQVJOSU5HICIlczogc2VuZGluZyBwYWNrZXQgd2hpbGUgYWxyZWFkeSB0cmFuc21pdHRpbmcsIG5vdCBwb3NzaWJsZVxuIiwgCisJCQlkZXYtPm5hbWUpKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoTkk1MDEwX0RFQlVHID4gMykgZHVtcF9wYWNrZXQoYnVmLCBsZW5ndGgpOworCisJYnVmX29mZnMgPSBOSTUwMTBfQlVGU0laRSAtIGxlbmd0aCAtIHBhZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCWxwLT5vX3BrdF9zaXplID0gbGVuZ3RoICsgcGFkOworCisJb3V0YigwLCBFRExDX1JNQVNLKTsJLyogTWFzayBhbGwgcmVjZWl2ZSBpbnRlcnJ1cHRzICovCisJb3V0YigwLCBJRV9NTU9ERSk7CS8qIFB1dCBYbWl0IGJ1ZmZlciBvbiBzeXN0ZW0gYnVzICovCisJb3V0YigweGZmLCBFRExDX1JDTFIpOwkvKiBDbGVhciBvdXQgcGVuZGluZyByY3YgaW50ZXJydXB0cyAqLworCisJb3V0dyhidWZfb2ZmcywgSUVfR1ApOyAvKiBQb2ludCBHUCBhdCBzdGFydCBvZiBwYWNrZXQgKi8KKwlvdXRzYihJRV9YQlVGLCBidWYsIGxlbmd0aCk7IC8qIFB1dCBkYXRhIGluIGJ1ZmZlciAqLworCXdoaWxlKHBhZC0tKQorCQlvdXRiKDAsIElFX1hCVUYpOworCQkKKwlvdXR3KGJ1Zl9vZmZzLCBJRV9HUCk7IC8qIFJld3JpdGUgd2hlcmUgcGFja2V0IHN0YXJ0cyAqLworCisJLyogc2hvdWxkIHdvcmsgd2l0aG91dCB0aGF0IG91dGIoKSAoQ3J5bndyIHVzZWQgaXQpICovCisJLypvdXRiKE1NX01VWCwgSUVfTU1PREUpOyovIC8qIFhtdCBidWZmZXIgdG8gRURMQyBidXMgKi8KKwlvdXRiKE1NX0VOX1hNVCB8IE1NX01VWCwgSUVfTU1PREUpOyAvKiBCZWdpbiB0cmFuc21pc3Npb24gKi8KKwlvdXRiKFhNX0FMTCwgRURMQ19YTUFTSyk7IC8qIENhdXNlIGludGVycnVwdCBhZnRlciBjb21wbGV0aW9uIG9yIGZhaWwgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCisJaWYgKE5JNTAxMF9ERUJVRykgbmk1MDEwX3Nob3dfcmVnaXN0ZXJzKGRldik7CQorfQorCitzdGF0aWMgdm9pZCBjaGlwc2V0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXJ0cCkKK3sKKwkvKiBGSVhNRTogTW92ZSBzb21lIHN0dWZmIGhlcmUgKi8KKwlQUklOVEszKChLRVJOX0RFQlVHICIlczogZG9pbmcgTk9USElORyBpbiBjaGlwc2V0X2luaXRcbiIsIGRldi0+bmFtZSkpOworfQorCitzdGF0aWMgdm9pZCBuaTUwMTBfc2hvd19yZWdpc3RlcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJCisJUFJJTlRLMygoS0VSTl9ERUJVRyAiJXM6IFhTVEFUICUjMi4yeFxuIiwgZGV2LT5uYW1lLCBpbmIoRURMQ19YU1RBVCkpKTsKKwlQUklOVEszKChLRVJOX0RFQlVHICIlczogWE1BU0sgJSMyLjJ4XG4iLCBkZXYtPm5hbWUsIGluYihFRExDX1hNQVNLKSkpOworCVBSSU5USzMoKEtFUk5fREVCVUcgIiVzOiBSU1RBVCAlIzIuMnhcbiIsIGRldi0+bmFtZSwgaW5iKEVETENfUlNUQVQpKSk7CisJUFJJTlRLMygoS0VSTl9ERUJVRyAiJXM6IFJNQVNLICUjMi4yeFxuIiwgZGV2LT5uYW1lLCBpbmIoRURMQ19STUFTSykpKTsKKwlQUklOVEszKChLRVJOX0RFQlVHICIlczogUk1PREUgJSMyLjJ4XG4iLCBkZXYtPm5hbWUsIGluYihFRExDX1JNT0RFKSkpOworCVBSSU5USzMoKEtFUk5fREVCVUcgIiVzOiBYTU9ERSAlIzIuMnhcbiIsIGRldi0+bmFtZSwgaW5iKEVETENfWE1PREUpKSk7CisJUFJJTlRLMygoS0VSTl9ERUJVRyAiJXM6IElTVEFUICUjMi4yeFxuIiwgZGV2LT5uYW1lLCBpbmIoSUVfSVNUQVQpKSk7Cit9CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X25pNTAxMDsKKworTU9EVUxFX1BBUk0oaW8sICJpIik7CitNT0RVTEVfUEFSTShpcnEsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAibmk1MDEwIEkvTyBiYXNlIGFkZHJlc3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAibmk1MDEwIElSUSBudW1iZXIiKTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIGluaXRfbW9kdWxlXG4iLCBib2FyZG5hbWUpKTsKKwkvKgorCWlmKGlvIDw9IDAgfHwgaXJxID09IDApeworCSAgIAlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQXV0b3Byb2Jpbmcgbm90IGFsbG93ZWQgZm9yIG1vZHVsZXMuXG4iLCBib2FyZG5hbWUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU2V0IHN5bWJvbHMgJ2lvJyBhbmQgJ2lycSdcbiIsIGJvYXJkbmFtZSk7CisJICAgCXJldHVybiAtRUlOVkFMOworCX0KKwkqLworCWlmIChpbyA8PSAwKXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEF1dG9wcm9iaW5nIGZvciBtb2R1bGVzIGlzIGhhemFyZG91cywgdHJ5aW5nIGFueXdheS4uXG4iLCBib2FyZG5hbWUpOworCX0KKworCVBSSU5USzIoKEtFUk5fREVCVUcgIiVzOiBpbml0X21vZHVsZSBpcnE9JSMyeCwgaW89JSMzeFxuIiwgYm9hcmRuYW1lLCBpcnEsIGlvKSk7CisJZGV2X25pNTAxMCA9IG5pNTAxMF9wcm9iZSgtMSk7CisJaWYgKElTX0VSUihkZXZfbmk1MDEwKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGV2X25pNTAxMCk7CisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIGNsZWFudXBfbW9kdWxlXG4iLCBib2FyZG5hbWUpKTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfbmk1MDEwKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXZfbmk1MDEwLT5iYXNlX2FkZHIsIE5JNTAxMF9JT19FWFRFTlQpOworCWZyZWVfbmV0ZGV2KGRldl9uaTUwMTApOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRF9fS0VSTkVMX18gLUkvdXNyL3NyYy9saW51eC9uZXQvaW5ldCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtbTQ4NiAtYyBuaTUwMTAuYyIKKyAqICB2ZXJzaW9uLWNvbnRyb2w6IHQKKyAqICBrZXB0LW5ldy12ZXJzaW9uczogNQorICogIHRhYi13aWR0aDogNAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uaTUwMTAuaCBiL2RyaXZlcnMvbmV0L25pNTAxMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMGU3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uaTUwMTAuaApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIFJhY2FsLUludGVybGFuIG5pNTAxMCBFdGhlcm5ldCBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgaXMgY292ZXJlZCBieSB0aGUKKyAqIHNhbWUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhhdCBjb3ZlcnMgdGhhdCB3b3JrLgorICoKKyAqIGNvcHlyaWdodHMgKGMpIDE5OTYgYnkgSmFuLVBhc2NhbCB2YW4gQmVzdCAoanZiZXN0QHdpLmxlaWRlbnVuaXYubmwpCisgKgorICogSSBoYXZlIGRvbmUgYSBsb29rIGluIHRoZSBmb2xsb3dpbmcgc291cmNlczoKKyAqICAgY3J5bndyLXBhY2tldC1kcml2ZXIgYnkgUnVzcyBOZWxzb24KKyAqLworCisjZGVmaW5lIE5JNTAxMF9CVUZTSVpFCTIwNDgJLyogbnVtYmVyIG9mIGJ5dGVzIGluIGEgYnVmZmVyICovCisKKyNkZWZpbmUgTkk1MDEwX01BR0lDVkFMMCAweDAwICAvKiBtYWdpYy12YWx1ZXMgZm9yIG5pNTAxMCBjYXJkICovCisjZGVmaW5lIE5JNTAxMF9NQUdJQ1ZBTDEgMHg1NQorI2RlZmluZSBOSTUwMTBfTUFHSUNWQUwyIDB4QUEKKworI2RlZmluZSBTQV9BRERSMCAweDAyCisjZGVmaW5lIFNBX0FERFIxIDB4MDcKKyNkZWZpbmUgU0FfQUREUjIgMHgwMQorCisvKiBUaGUgbnVtYmVyIG9mIGxvdyBJL08gcG9ydHMgdXNlZCBieSB0aGUgbmk1MDEwIGV0aGVyY2FyZC4gKi8KKyNkZWZpbmUgTkk1MDEwX0lPX0VYVEVOVCAgICAgICAzMgorCisjZGVmaW5lIFBSSU5USyh4KSBpZiAoTkk1MDEwX0RFQlVHKSBwcmludGsgeAorI2RlZmluZSBQUklOVEsyKHgpIGlmIChOSTUwMTBfREVCVUc+PTIpIHByaW50ayB4CisjZGVmaW5lIFBSSU5USzMoeCkgaWYgKE5JNTAxMF9ERUJVRz49MykgcHJpbnRrIHgKKworLyogVGhlIHZhcmlvdXMgSUUgY29tbWFuZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRURMQ19YU1RBVAkoaW9hZGRyICsgMHgwMCkJLyogRURMQyB0cmFuc21pdCBjc3IgKi8KKyNkZWZpbmUgRURMQ19YQ0xSCShpb2FkZHIgKyAweDAwKQkvKiBFRExDIHRyYW5zbWl0ICJDbGVhciBJUlEiICovCisjZGVmaW5lIEVETENfWE1BU0sJKGlvYWRkciArIDB4MDEpCS8qIEVETEMgdHJhbnNtaXQgIklSUSBNYXNrcyIgKi8KKyNkZWZpbmUgRURMQ19SU1RBVAkoaW9hZGRyICsgMHgwMikJLyogRURMQyByZWNlaXZlIGNzciAqLworI2RlZmluZSBFRExDX1JDTFIJKGlvYWRkciArIDB4MDIpCS8qIEVETEMgcmVjZWl2ZSAiQ2xlYXIgSVJRIiAqLworI2RlZmluZSBFRExDX1JNQVNLCShpb2FkZHIgKyAweDAzKQkvKiBFRExDIHJlY2VpdmUgIklSUSBNYXNrcyIgKi8KKyNkZWZpbmUgRURMQ19YTU9ERQkoaW9hZGRyICsgMHgwNCkJLyogRURMQyB0cmFuc21pdCBNb2RlICovCisjZGVmaW5lIEVETENfUk1PREUJKGlvYWRkciArIDB4MDUpCS8qIEVETEMgcmVjZWl2ZSBNb2RlICovCisjZGVmaW5lIEVETENfUkVTRVQJKGlvYWRkciArIDB4MDYpCS8qIEVETEMgUkVTRVQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRURMQ19URFIxCShpb2FkZHIgKyAweDA3KQkvKiAiVGltZSBEb21haW4gUmVmbGVjdG9tZXRyeSIgcmVnMSAqLworI2RlZmluZSBFRExDX0FERFIJKGlvYWRkciArIDB4MDgpCS8qIEVETEMgc3RhdGlvbiBhZGRyZXNzLCA2IGJ5dGVzICovCisJIAkJCS8qIDB4MEUgZG9lc24ndCBleGlzdCBmb3Igci93ICovCisjZGVmaW5lIEVETENfVERSMgkoaW9hZGRyICsgMHgwZikJLyogIlRpbWUgRG9tYWluIFJlZmxlY3RvbWV0cnkiIHJlZzIgKi8KKyNkZWZpbmUgSUVfR1AJCShpb2FkZHIgKyAweDEwKQkvKiBHUCBwb2ludGVyICh3b3JkIHJlZ2lzdGVyKSAqLworCQkJCS8qIDB4MTEgaXMgMm5kIGJ5dGUgb2YgR1AgUG9pbnRlciAqLworI2RlZmluZSBJRV9SQ05UCQkoaW9hZGRyICsgMHgxMCkJLyogQ291bnQgb2YgYnl0ZXMgaW4gcmN2J2QgcGFja2V0ICovCisgCQkJCS8qIDB4MTEgaXMgMm5kIGJ5dGUgb2YgIkJ5dGUgQ291bnQiICovCisjZGVmaW5lIElFX01NT0RFCShpb2FkZHIgKyAweDEyKQkvKiBNZW1vcnkgTW9kZSByZWdpc3RlciAqLworI2RlZmluZSBJRV9ETUFfUlNUCShpb2FkZHIgKyAweDEzKQkvKiBJRSBETUEgUmVzZXQuICB3cml0ZSBvbmx5ICovCisjZGVmaW5lIElFX0lTVEFUCShpb2FkZHIgKyAweDEzKQkvKiBJRSBJbnRlcnJ1cHQgU3RhdHVzLiAgcmVhZCBvbmx5ICovCisjZGVmaW5lIElFX1JCVUYJCShpb2FkZHIgKyAweDE0KQkvKiBJRSBSZWNlaXZlIEJ1ZmZlciBwb3J0ICovCisjZGVmaW5lIElFX1hCVUYJCShpb2FkZHIgKyAweDE1KQkvKiBJRSBUcmFuc21pdCBCdWZmZXIgcG9ydCAqLworI2RlZmluZSBJRV9TQVBST00JKGlvYWRkciArIDB4MTYpCS8qIHdpbmRvdyBvbiBzdGF0aW9uIGFkZHIgcHJvbSAqLworI2RlZmluZSBJRV9SRVNFVAkoaW9hZGRyICsgMHgxNykJLyogYW55IHdyaXRlIGNhdXNlcyBCb2FyZCBSZXNldCAqLworCisvKiBiaXRzIGluIEVETENfWFNUQVQsIGludGVycnVwdCBjbGVhciBvbiB3cml0ZSwgc3RhdHVzIHdoZW4gcmVhZCAqLworI2RlZmluZSBYU19UUE9LCQkweDgwCS8qIHRyYW5zbWl0IHBhY2tldCBzdWNjZXNzZnVsICovCisjZGVmaW5lIFhTX0NTCQkweDQwCS8qIGNhcnJpZXIgc2Vuc2UgKi8KKyNkZWZpbmUgWFNfUkNWRAkJMHgyMAkvKiB0cmFuc21pdHRlZCBwYWNrZXQgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgWFNfU0hPUlQJMHgxMAkvKiB0cmFuc21pc3Npb24gbWVkaWEgaXMgc2hvcnRlZCAqLworI2RlZmluZSBYU19VRkxXCQkweDA4CS8qIHVuZGVyZmxvdy4gIGlmZiBmYWlsZWQgYm9hcmQgKi8KKyNkZWZpbmUgWFNfQ09MTAkJMHgwNAkvKiBjb2xsaXNpb24gb2NjdXJyZWQgKi8KKyNkZWZpbmUgWFNfMTZDT0xMCTB4MDIJLyogMTZ0aCBjb2xsaXNpb24gb2NjdXJyZWQgKi8KKyNkZWZpbmUgWFNfUEVSUgkJMHgwMQkvKiBwYXJpdHkgZXJyb3IgKi8KKworI2RlZmluZSBYU19DTFJfVUZMVwkweDA4CS8qIGNsZWFyIHVuZGVyZmxvdyAqLworI2RlZmluZSBYU19DTFJfQ09MTAkweDA0CS8qIGNsZWFyIGNvbGxpc2lvbiAqLworI2RlZmluZSBYU19DTFJfMTZDT0xMCTB4MDIJLyogY2xlYXIgMTZ0aCBjb2xsaXNpb24gKi8KKyNkZWZpbmUgWFNfQ0xSX1BFUlIJMHgwMQkvKiBjbGVhciBwYXJpdHkgZXJyb3IgKi8KKworLyogYml0cyBpbiBFRExDX1hNQVNLLCBtYXNrL2VuYWJsZSB0cmFuc21pdCBpbnRlcnJ1cHRzLiAgcmVnaXN0ZXIgaXMgci93ICovCisjZGVmaW5lIFhNX1RQT0sJCTB4ODAJLyogPTEgdG8gZW5hYmxlIFhtdCBQa3QgT0sgaW50ZXJydXB0cyAqLworI2RlZmluZSBYTV9SQ1ZECQkweDIwCS8qID0xIHRvIGVuYWJsZSBYbXQgUGt0IFJjdmQgaW50cyAqLworI2RlZmluZSBYTV9VRkxXCQkweDA4CS8qID0xIHRvIGVuYWJsZSBYbXQgVW5kZXJmbG93IGludHMgKi8KKyNkZWZpbmUgWE1fQ09MTAkJMHgwNAkvKiA9MSB0byBlbmFibGUgWG10IENvbGxpc2lvbiBpbnRzICovCisjZGVmaW5lIFhNX0NPTEwxNgkweDAyCS8qID0xIHRvIGVuYWJsZSBYbXQgMTZ0aCBDb2xsIGludHMgKi8KKyNkZWZpbmUgWE1fUEVSUgkJMHgwMQkvKiA9MSB0byBlbmFibGUgWG10IFBhcml0eSBFcnJvciBpbnRzICovCisgCQkJCS8qIG5vdGU6IGFsd2F5cyBjbGVhciB0aGlzIGJpdCAqLworI2RlZmluZSBYTV9BTEwJCShYTV9UUE9LIHwgWE1fUkNWRCB8IFhNX1VGTFcgfCBYTV9DT0xMIHwgWE1fQ09MTDE2KQorCisvKiBiaXRzIGluIEVETENfUlNUQVQsIGludGVycnVwdCBjbGVhciBvbiB3cml0ZSwgc3RhdHVzIHdoZW4gcmVhZCAqLworI2RlZmluZSBSU19QS1RfT0sJMHg4MAkvKiByZWNlaXZlZCBnb29kIHBhY2tldCAqLworI2RlZmluZSBSU19SU1RfUEtUCTB4MTAJLyogUkVTRVQgcGFja2V0IHJlY2VpdmVkICovCisjZGVmaW5lIFJTX1JVTlQJCTB4MDgJLyogUnVudCBQa3QgcmN2ZC4gIExlbiA8IDY0IEJ5dGVzICovCisjZGVmaW5lIFJTX0FMSUdOCTB4MDQJLyogQWxpZ25tZW50IGVycm9yLiBub3QgOCBiaXQgYWxpZ25lZCAqLworI2RlZmluZSBSU19DUkNfRVJSCTB4MDIJLyogQmFkIENSQyBvbiByY3ZkIHBrdCAqLworI2RlZmluZSBSU19PRkxXCQkweDAxCS8qIG92ZXJmbG93IGZvciByY3YgRklGTyAqLworI2RlZmluZSBSU19WQUxJRF9CSVRTCSggUlNfUEtUX09LIHwgUlNfUlNUX1BLVCB8IFJTX1JVTlQgfCBSU19BTElHTiB8IFJTX0NSQ19FUlIgfCBSU19PRkxXICkKKyAJCQkJLyogYWxsIHZhbGlkIFJTVEFUIGJpdHMgKi8KKworI2RlZmluZSBSU19DTFJfUEtUX09LCTB4ODAJLyogY2xlYXIgcmN2ZCBwYWNrZXQgaW50ZXJydXB0ICovCisjZGVmaW5lIFJTX0NMUl9SU1RfUEtUCTB4MTAJLyogY2xlYXIgUkVTRVQgcGFja2V0IHJlY2VpdmVkICovCisjZGVmaW5lIFJTX0NMUl9SVU5UCTB4MDgJLyogY2xlYXIgUnVudCBQY2t0IHJlY2VpdmVkICovCisjZGVmaW5lIFJTX0NMUl9BTElHTgkweDA0CS8qIGNsZWFyIEFsaWdubWVudCBlcnJvciAqLworI2RlZmluZSBSU19DTFJfQ1JDX0VSUgkweDAyCS8qIGNsZWFyIENSQyBlcnJvciAqLworI2RlZmluZSBSU19DTFJfT0ZMVwkweDAxCS8qIGNsZWFyIHJjdiBGSUZPIE92ZXJmbG93ICovCisKKy8qIGJpdHMgaW4gRURMQ19STUFTSywgbWFzay9lbmFibGUgcmVjZWl2ZSBpbnRlcnJ1cHRzLiAgcmVnaXN0ZXIgaXMgci93ICovCisjZGVmaW5lIFJNX1BLVF9PSwkweDgwCS8qID0xIHRvIGVuYWJsZSByY3ZkIGdvb2QgcGFja2V0IGludHMgKi8KKyNkZWZpbmUgUk1fUlNUX1BLVAkweDEwCS8qID0xIHRvIGVuYWJsZSBSRVNFVCBwYWNrZXQgaW50cyAqLworI2RlZmluZSBSTV9SVU5UCQkweDA4CS8qID0xIHRvIGVuYWJsZSBSdW50IFBrdCByY3ZkIGludHMgKi8KKyNkZWZpbmUgUk1fQUxJR04JMHgwNAkvKiA9MSB0byBlbmFibGUgQWxpZ25tZW50IGVycm9yIGludHMgKi8KKyNkZWZpbmUgUk1fQ1JDX0VSUgkweDAyCS8qID0xIHRvIGVuYWJsZSBCYWQgQ1JDIGVycm9yIGludHMgKi8KKyNkZWZpbmUgUk1fT0ZMVwkJMHgwMQkvKiA9MSB0byBlbmFibGUgb3ZlcmZsb3cgZXJyb3IgaW50cyAqLworCisvKiBiaXRzIGluIEVETENfUk1PREUsIHNldCBSZWNlaXZlIFBhY2tldCBtb2RlLiAgcmVnaXN0ZXIgaXMgci93ICovCisjZGVmaW5lIFJNRF9URVNUCTB4ODAJLyogPTEgZm9yIENoaXAgdGVzdGluZy4gIG5vcm1hbGx5IDAgKi8KKyNkZWZpbmUgUk1EX0FERF9TSVoJMHgxMAkvKiA9MSA1LWJ5dGUgYWRkciBtYXRjaC4gIG5vcm1hbGx5IDAgKi8KKyNkZWZpbmUgUk1EX0VOX1JVTlQJMHgwOAkvKiA9MSBlbmFibGUgcnVudCByY3YuICBub3JtYWxseSAwICovCisjZGVmaW5lIFJNRF9FTl9SU1QJMHgwNAkvKiA9MSB0byByY3YgUkVTRVQgcGt0LiAgbm9ybWFsbHkgMCAqLworCisjZGVmaW5lIFJNRF9QUk9NSVNDCTB4MDMJLyogcmVjZWl2ZSAqYWxsKiBwYWNrZXRzLiAgdW51c3VhbCAqLworI2RlZmluZSBSTURfTVVMVElDQVNUCTB4MDIJLyogcmVjZWl2ZSBtdWx0aWNhc3RzIHRvby4gIHVudXN1YWwgKi8KKyNkZWZpbmUgUk1EX0JST0FEQ0FTVAkweDAxCS8qIHJlY2VpdmUgYnJvYWRjYXN0cyAmIG5vcm1hbC4gdXN1YWwgKi8KKyNkZWZpbmUgUk1EX05PX1BBQ0tFVFMJMHgwMAkvKiBkb24ndCByZWNlaXZlIGFueSBwYWNrZXRzLiB1bnVzdWFsICovCisKKy8qIGJpdHMgaW4gRURMQ19YTU9ERSwgc2V0IFRyYW5zbWl0IFBhY2tldCBtb2RlLiAgcmVnaXN0ZXIgaXMgci93ICovCisjZGVmaW5lIFhNRF9DT0xMX0NOVAkweGYwCS8qIGNvbGwncyBzaW5jZSBzdWNjZXNzLiAgcmVhZC1vbmx5ICovCisjZGVmaW5lIFhNRF9JR19QQVIJMHgwOAkvKiA9MSB0byBpZ25vcmUgcGFyaXR5LiAgQUxXQVlTIHNldCAqLworI2RlZmluZSBYTURfVF9NT0RFCTB4MDQJLyogPTEgdG8gcG93ZXIgeGN2ci4gQUxXQVlTIHNldCB0aGlzICovCisjZGVmaW5lIFhNRF9MQkMJCTB4MDIJLyogPTEgZm9yIGxvb3BiYWtjLiAgbm9ybWFsbHkgc2V0ICovCisjZGVmaW5lIFhNRF9ESVNfQwkweDAxCS8qID0xIGRpc2FibGVzIGNvbnRlbnRpb24uIG5vcm1hbGx5IDAgKi8KKworLyogYml0cyBpbiBFRExDX1JFU0VULCB3cml0ZSBvbmx5ICovCisjZGVmaW5lIFJTX1JFU0VUCTB4ODAJLyogPTEgdG8gaG9sZCBFRExDIGluIHJlc2V0IHN0YXRlICovCisKKy8qIGJpdHMgaW4gSUVfTU1PREUsIHdyaXRlIG9ubHkgKi8KKyNkZWZpbmUgTU1fRU5fRE1BCTB4ODAJLyogPTEgYmVnaW4gRE1BIHhmZXIsIENwbHQgY2xycyBpdCAqLworI2RlZmluZSBNTV9FTl9SQ1YJMHg0MAkvKiA9MSBhbGxvd3MgUGt0IHJjdi4gIGNscidkIGJ5IHJjdiAqLworI2RlZmluZSBNTV9FTl9YTVQJMHgyMAkvKiA9MSBiZWdpbiBYbXQgcGt0LiAgQ3BsdCBjbHJzIGl0ICovCisjZGVmaW5lIE1NX0JVU19QQUdFCTB4MTgJLyogPTAwIEFMV0FZUy4gIFVzZWQgd2hlbiBNVVg9MSAqLworI2RlZmluZSBNTV9ORVRfUEFHRQkweDA2CS8qID0wMCBBTFdBWVMuICBVc2VkIHdoZW4gTVVYPTAgKi8KKyNkZWZpbmUgTU1fTVVYCQkweDAxCS8qID0xIG1lYW5zIFJjdiBCdWZmIG9uIHN5c3RlbSBidXMgKi8KKwkJCQkvKiA9MCBtZWFucyBYbXQgQnVmZiBvbiBzeXN0ZW0gYnVzICovCisKKy8qIGJpdHMgaW4gSUVfSVNUQVQsIHJlYWQgb25seSAqLworI2RlZmluZSBJU19URElBRwkweDgwCS8qID0xIGlmIERpYWdub3N0aWMgcHJvYmxlbSAqLworI2RlZmluZSBJU19FTl9SQ1YJMHgyMAkvKiA9MSB1bnRpbCBmcmFtZSBpcyByY3YnZCBjcGx0ICovCisjZGVmaW5lIElTX0VOX1hNVAkweDEwCS8qID0xIHVudGlsIGZyYW1lIGlzIHhtdCdkIGNwbHQgKi8KKyNkZWZpbmUgSVNfRU5fRE1BCTB4MDgJLyogPTEgdW50aWwgRE1BIGlzIGNwbHQgb3IgYWJvcnRlZCAqLworI2RlZmluZSBJU19ETUFfSU5UCTB4MDQJLyogPTAgaWZmIERNQSBkb25lIGludGVycnVwdC4gKi8KKyNkZWZpbmUgSVNfUl9JTlQJMHgwMgkvKiA9MCBpZmYgdW5tYXNrZWQgUmN2IGludGVycnVwdCAqLworI2RlZmluZSBJU19YX0lOVAkweDAxCS8qID0wIGlmZiB1bm1hc2tlZCBYbXQgaW50ZXJydXB0ICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25pNTIuYyBiL2RyaXZlcnMvbmV0L25pNTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTg1NGM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmk1Mi5jCkBAIC0wLDAgKzEsMTM4NiBAQAorLyoKKyAqIG5ldC0zLWRyaXZlciBmb3IgdGhlIE5JNTIxMCBjYXJkIChpODI1ODYgRXRoZXJuZXQgY2hpcCkKKyAqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGlzIGNvdmVyZWQgYnkgdGhlCisgKiBzYW1lIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoYXQgY292ZXJzIHRoYXQgd29yay4KKyAqCisgKiBBbHBoYWNvZGUgMC44MiAoOTYvMDkvMjkpIGZvciBMaW51eCAyLjAuMCAob3IgbGF0ZXIpCisgKiBDb3B5cmlnaHRzIChjKSAxOTk0LDE5OTUsMTk5NiBieSBNLkhpcHAgKGhpcHBtQGluZm9ybWF0aWsudW5pLXR1ZWJpbmdlbi5kZSkKKyAqICAgIFtmZWVsIGZyZWUgdG8gbWFpbCAuLi4uXQorICoKKyAqIHdoZW4gdXNpbmcgYXMgbW9kdWxlOiAobm8gYXV0b3Byb2JpbmchKQorICogICBjb21waWxlIHdpdGg6CisgKiAgICAgICBnY2MgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1tNDg2IC1EX19LRVJORUxfXyAtRE1PRFVMRSAtYyBuaTUyLmMKKyAqICAgcnVuIHdpdGggZS5nOgorICogICAgICAgaW5zbW9kIG5pNTIubyBpbz0weDM2MCBpcnE9OSBtZW1zdGFydD0weGQwMDAwIG1lbWVuZD0weGQ0MDAwCisgKgorICogQ0FOIFlPVSBQTEVBU0UgUkVQT1JUIE1FIFlPVVIgUEVSRk9STUFOQ0UgRVhQRVJJRU5DRVMgISEuCisgKgorICogSWYgeW91IGZpbmQgYSBidWcsIHBsZWFzZSByZXBvcnQgbWU6CisgKiAgIFRoZSBrZXJuZWwgcGFuaWMgb3V0cHV0IGFuZCBhbnkga21zZyBmcm9tIHRoZSBuaTUyIGRyaXZlcgorICogICB0aGUgbmk1MjEwLWRyaXZlci12ZXJzaW9uIGFuZCB0aGUgbGludXgta2VybmVsIHZlcnNpb24KKyAqICAgaG93IG1hbnkgc2hhcmVkIG1lbW9yeSAobWVtc2l6ZSkgb24gdGhlIG5ldGNhcmQsCisgKiAgIGJvb3Rwcm9tOiB5ZXMvbm8sIGJhc2VfYWRkciwgbWVtX3N0YXJ0CisgKiAgIG1heWJlIHRoZSBuaTUyMTAtY2FyZCByZXZpc2lvbiBhbmQgdGhlIGk4MjU4NiB2ZXJzaW9uCisgKgorICogYXV0b3Byb2JlIGZvcjogYmFzZV9hZGRyOiAweDMwMCwweDI4MCwweDM2MCwweDMyMCwweDM0MAorICogICAgICAgICAgICAgICAgbWVtX3N0YXJ0OiAweGQwMDAwLDB4ZDIwMDAsMHhjODAwMCwweGNhMDAwLDB4ZDQwMDAsMHhkNjAwMCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhkODAwMCwweGNjMDAwLDB4Y2UwMDAsMHhkYTAwMCwweGRjMDAwCisgKgorICogc291cmNlczoKKyAqICAgc2tlbGV0b24uYyBmcm9tIERvbmFsZCBCZWNrZXIKKyAqCisgKiBJIGhhdmUgYWxzbyBkb25lIGEgbG9vayBpbiB0aGUgZm9sbG93aW5nIHNvdXJjZXM6IChtYWlsIG1lIGlmIHlvdSBuZWVkIHRoZW0pCisgKiAgIGNyeW53ci1wYWNrZXQtZHJpdmVyIGJ5IFJ1c3MgTmVsc29uCisgKiAgIEdhcnJldCBBLiBXb2xsbWFuJ3MgKGZvdXJ0aCkgaTgyNTg2LWRyaXZlciBmb3IgQlNECisgKiAgIChiZWZvcmUgZ2V0dGluZyBhbiBpODI1OTYgKHllcyA1OTYgbm90IDU4NikgbWFudWFsLCB0aGUgZXhpc3RpbmcgZHJpdmVycyBoZWxwZWQKKyAqICAgIG1lIGEgbG90IHRvIHVuZGVyc3RhbmQgdGhpcyB0cmlja3kgY2hpcC4pCisgKgorICogS25vd24gUHJvYmxlbXM6CisgKiAgIFRoZSBpbnRlcm5hbCBzeXNidXMgc2VlbXMgdG8gYmUgc2xvdy4gU28gd2Ugb2Z0ZW4gbG9zZSBwYWNrZXRzIGJlY2F1c2Ugb2YKKyAqICAgb3ZlcnJ1bnMgd2hpbGUgcmVjZWl2aW5nIGZyb20gYSBmYXN0IHJlbW90ZSBob3N0LgorICogICBUaGlzIGNhbiBzbG93IGRvd24gVENQIGNvbm5lY3Rpb25zLiBNYXliZSB0aGUgbmV3ZXIgbmk1MjEwIGNhcmRzIGFyZSBiZXR0ZXIuCisgKiAgIG15IGV4cGVyaWVuY2UgaXMsIHRoYXQgaWYgYSBtYWNoaW5lIHNlbmRzIHdpdGggbW9yZSB0aGFuIGFib3V0IDUwMC02MDBLL3MKKyAqICAgdGhlIGZpZm8vc3lzYnVzIG92ZXJmbG93cy4KKyAqCisgKiBJTVBPUlRBTlQgTk9URToKKyAqICAgT24gZmFzdCBuZXR3b3JrcywgaXQncyBhICh2ZXJ5KSBnb29kIGlkZWEgdG8gaGF2ZSAxNksgc2hhcmVkIG1lbW9yeS4gV2l0aAorICogICA4Sywgd2UgY2FuIHN0b3JlIG9ubHkgNCByZWNlaXZlIGZyYW1lcywgc28gaXQgY2FuIChlYXNpbHkpIGhhcHBlbiB0aGF0IGEgcmVtb3RlCisgKiAgIG1hY2hpbmUgJ292ZXJydW5zJyBvdXIgc3lzdGVtLgorICoKKyAqIEtub3duIGk4MjU4Ni9jYXJkIHByb2JsZW1zIChJJ20gc3VyZSwgdGhlcmUgYXJlIG1hbnkgbW9yZSEpOgorICogICBSdW5uaW5nIHRoZSBOT1AtbW9kZSwgdGhlIGk4MjU4NiBzb21ldGltZXMgc2VlbXMgdG8gZm9yZ2V0IHRvIHJlcG9ydAorICogICBldmVyeSB4bWl0LWludGVycnVwdCB1bnRpbCB3ZSByZXN0YXJ0IHRoZSBDVS4KKyAqICAgQW5vdGhlciBNQUpPUiBidWcgaXMsIHRoYXQgdGhlIFJVIHNvbWV0aW1lcyBzZWVtcyB0byBpZ25vcmUgdGhlIEVMLUJpdAorICogICBpbiB0aGUgUkJELVN0cnVjdCB3aGljaCBpbmRpY2F0ZXMgYW4gZW5kIG9mIHRoZSBSQkQgcXVldWUuCisgKiAgIEluc3RlYWQsIHRoZSBSVSBmZXRjaGVzIGFub3RoZXIgKHJhbmRvbWx5IHNlbGVjdGVkIGFuZAorICogICB1c3VhbGx5IHVzZWQpIFJCRCBhbmQgYmVnaW5zIHRvIGZpbGwgaXQuIChNYXliZSwgdGhpcyBoYXBwZW5zIG9ubHkgaWYKKyAqICAgdGhlIGxhc3QgYnVmZmVyIGZyb20gdGhlIHByZXZpb3VzIFJGRCBmaXRzIGV4YWN0IGludG8gdGhlIHF1ZXVlIGFuZAorICogICB0aGUgbmV4dCBSRkQgY2FuJ3QgZmV0Y2ggYW4gaW5pdGlhbCBSQkQuIEFueW9uZSBrbm93cyBtb3JlPyApCisgKgorICogcmVzdWx0cyBmcm9tIGZ0cCBwZXJmb3JtYW5jZSB0ZXN0cyB3aXRoIExpbnV4IDEuMi41CisgKiAgIHNlbmQgYW5kIHJlY2VpdmUgYWJvdXQgMzUwLTQwMCBLQnl0ZS9zIChwZWFrIHVwIHRvIDQ2MCBrYnl0ZXMvcykKKyAqICAgc2VuZGluZyBpbiBOT1AtbW9kZTogcGVhayBwZXJmb3JtYW5jZSB1cCB0byA1MzBLL3MgKGJ1dCBiZXR0ZXIgZG9uJ3QgcnVuIHRoaXMgbW9kZSkKKyAqLworCisvKgorICogMjkuU2VwdC45NjogdmlydF90b19idXMgY2hhbmdlcyBmb3IgbmV3IG1lbW9yeSBzY2hlbWUKKyAqIDE5LkZlYi45NjogbW9yZSBNY2FzdCBjaGFuZ2VzLCBtb2R1bGUgc3VwcG9ydCAoTUgpCisgKgorICogMTguTm92Ljk1OiBNY2FzdCBjaGFuZ2VzIChBQykuCisgKgorICogMjMuQXByaWwuOTU6IGZpeGVkKD8pIHJlY2VpdmluZyBwcm9ibGVtcyBieSBjb25maWd1cmluZyBhIFJGRCBtb3JlCisgKiAgICAgICAgICAgICAgdGhhbiB0aGUgbnVtYmVyIG9mIFJCRCdzLiBDYW4gbWF5YmUgY2F1c2Ugb3RoZXIgcHJvYmxlbXMuCisgKiAxOC5BcHJpbC45NTogQWRkZWQgTU9EVUxFIHN1cHBvcnQgKE1IKQorICogMTcuQXByaWwuOTU6IE1DIHJlbGF0ZWQgY2hhbmdlcyBpbiBpbml0NTg2KCkgYW5kIHNldF9tdWx0aWNhc3RfbGlzdCgpLgorICogICAgICAgICAgICAgIHJlbW92ZWQgdXNlIG9mICdqaWZmaWVzJyBpbiBpbml0NTg2KCkgKE1IKQorICoKKyAqIDE5LlNlcC45NDogQWRkZWQgTXVsdGljYXN0IHN1cHBvcnQgKG5vdCB0ZXN0ZWQgeWV0KSAoTUgpCisgKgorICogMTguU2VwLjk0OiBXb3JrYXJvdW5kIGZvciAnRUwtQnVnJy4gUmVtb3ZlZCBmbGV4aWJsZSBSQkQtaGFuZGxpbmcuCisgKiAgICAgICAgICAgIE5vdywgZXZlcnkgUkZEIGhhcyBleGFjdCBvbmUgUkJELiAoTUgpCisgKgorICogMTQuU2VwLjk0OiBhZGRlZCBwcm9taXNjdW91cyBtb2RlLCBhIGZldyBjbGVhbnVwcyAoTUgpCisgKgorICogMTkuQXVnLjk0OiBjaGFuZ2VkIHJlcXVlc3RfaXJxKCkgcGFyYW1ldGVyIChNSCkKKyAqCisgKiAyMC5KdWx5Ljk0OiByZW1vdmVkIGNsZWFudXAgYnVncywgcmVtb3ZlZCBhIDE2Sy1tZW0tcHJvYmUtYnVnIChNSCkKKyAqCisgKiAxOS5KdWx5Ljk0OiBsb3RzYSBjbGVhbnVwcyAuLiAoTUgpCisgKgorICogMTcuSnVseS45NDogc29tZSBwYXRjaGVzIC4uLiB2ZXJpZmllZCB0byBydW4gd2l0aCAxLjEuMjkgKE1IKQorICoKKyAqIDQuSnVseS45NDogcGF0Y2hlcyBmb3IgTGludXggMS4xLjI0ICAoTUgpCisgKgorICogMjYuTWFyY2guOTQ6IHBhdGNoZXMgZm9yIExpbnV4IDEuMCBhbmQgaW9tZW0tYXV0by1wcm9iZSAoTUgpCisgKgorICogMzAuU2VwLjkzOiBBZGRlZCBub3AtY2hhaW4gLi4gZHJpdmVyIG5vdyBydW5zIHdpdGggb25seSBvbmUgWG1pdC1CdWZmLCB0b28gKE1IKQorICoKKyAqIDwgMzAuU2VwLjkzOiBmaXJzdCB2ZXJzaW9ucworICovCisKK3N0YXRpYyBpbnQgZGVidWdsZXZlbDsJLyogZGVidWctcHJpbnRrIDA6IG9mZiAxOiBhIGZldyAyOiBtb3JlICovCitzdGF0aWMgaW50IGF1dG9tYXRpY19yZXN1bWU7IC8qIGV4cGVyaW1lbnRhbCAuLiBiZXR0ZXIgc2hvdWxkIGJlIHplcm8gKi8KK3N0YXRpYyBpbnQgcmZkYWRkOwkvKiByZmRhZGQ9MSBtYXkgYmUgYmV0dGVyIGZvciA4SyBNRU0gY2FyZHMgKi8KK3N0YXRpYyBpbnQgZmlmbz0weDg7CS8qIGRvbid0IGNoYW5nZSAqLworCisvKiAjZGVmaW5lIFJFQUxMWV9TTE9XX0lPICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlICJuaTUyLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgIm5pNTIiCisKKyNkZWZpbmUgREVCVUcgICAgICAgLyogZGVidWcgb24gKi8KKyNkZWZpbmUgU1lTQlVTVkFMIDEgLyogOCBCaXQgKi8KKworI2RlZmluZSBuaV9hdHRuNTg2KCkgIHtvdXRiKDAsZGV2LT5iYXNlX2FkZHIrTkk1Ml9BVFRFTlRJT04pO30KKyNkZWZpbmUgbmlfcmVzZXQ1ODYoKSB7b3V0YigwLGRldi0+YmFzZV9hZGRyK05JNTJfUkVTRVQpO30KKyNkZWZpbmUgbmlfZGlzaW50KCkgICB7b3V0YigwLGRldi0+YmFzZV9hZGRyK05JNTJfSU5URElTKTt9CisjZGVmaW5lIG5pX2VuYWludCgpICAge291dGIoMCxkZXYtPmJhc2VfYWRkcitOSTUyX0lOVEVOQSk7fQorCisjZGVmaW5lIG1ha2UzMihwdHIxNikgKHAtPm1lbXRvcCArIChzaG9ydCkgKHB0cjE2KSApCisjZGVmaW5lIG1ha2UyNChwdHIzMikgKCAoKGNoYXIgKikgKHB0cjMyKSkgLSBwLT5iYXNlKQorI2RlZmluZSBtYWtlMTYocHRyMzIpICgodW5zaWduZWQgc2hvcnQpICgodW5zaWduZWQgbG9uZykocHRyMzIpIC0gKHVuc2lnbmVkIGxvbmcpIHAtPm1lbXRvcCApKQorCisvKioqKioqKioqKioqKioqKioqKiBob3cgdG8gY2FsY3VsYXRlIHRoZSBidWZmZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKiBJTVBPUlRBTlQgTk9URTogaWYgeW91IGNvbmZpZ3VyZSBvbmx5IG9uZSBOVU1fWE1JVF9CVUZGUywgdGhlIGRyaXZlciB3b3JrcworICAqIC0tLS0tLS0tLS0tLS0tLSBpbiBhIGRpZmZlcmVudCAobW9yZSBzdGFibGU/KSBtb2RlLiBPbmx5IGluIHRoaXMgbW9kZSBpdCdzCisgICogICAgICAgICAgICAgICAgIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyIHdpdGggJ05PX05PUENPTU1BTkRTJworCitzaXplb2Yoc2NwKT0xMjsgc2l6ZW9mKHNjYik9MTY7IHNpemVvZihpc2NwKT04Oworc2l6ZW9mKHNjcCkrc2l6ZW9mKGlzY3ApK3NpemVvZihzY2IpID0gMzYgPSBJTklUCitzaXplb2YocmZkKSA9IDI0OyBzaXplb2YocmJkKSA9IDEyOworc2l6ZW9mKHRiZCkgPSA4OyBzaXplb2YodHJhbnNtaXRfY21kKSA9IDE2Oworc2l6ZW9mKG5vcF9jbWQpID0gODsKKworICAqIGlmIHlvdSBkb24ndCBrbm93IHRoZSBkcml2ZXIsIGJldHRlciBkbyBub3QgY2hhbmdlIHRoZXNlIHZhbHVlczogKi8KKworI2RlZmluZSBSRUNWX0JVRkZfU0laRSAxNTI0IC8qIHNsaWdodGx5IG92ZXJzaXplZCAqLworI2RlZmluZSBYTUlUX0JVRkZfU0laRSAxNTI0IC8qIHNsaWdodGx5IG92ZXJzaXplZCAqLworI2RlZmluZSBOVU1fWE1JVF9CVUZGUyAxICAgIC8qIGNvbmZpZyBmb3IgYm90aCwgOEsgYW5kIDE2SyBzaG1lbSAqLworI2RlZmluZSBOVU1fUkVDVl9CVUZGU184ICA0IC8qIGNvbmZpZyBmb3IgOEsgc2hhcmVkIG1lbSAqLworI2RlZmluZSBOVU1fUkVDVl9CVUZGU18xNiA5IC8qIGNvbmZpZyBmb3IgMTZLIHNoYXJlZCBtZW0gKi8KKyNkZWZpbmUgTk9fTk9QQ09NTUFORFMgICAgICAvKiBvbmx5IHBvc3NpYmxlIHdpdGggTlVNX1hNSVRfQlVGRlM9MSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRpZmZlcmVudCBERUxBWXMgKi8KKyNkZWZpbmUgREVMQVkoeCkgbWRlbGF5KDMyICogeCk7CisjZGVmaW5lIERFTEFZXzE2KCk7IHsgdWRlbGF5KDE2KTsgfQorI2RlZmluZSBERUxBWV8xOCgpOyB7IHVkZWxheSg0KTsgfQorCisvKiB3YWl0IGZvciBjb21tYW5kIHdpdGggdGltZW91dDogKi8KKyNkZWZpbmUgV0FJVF80X1NDQl9DTUQoKSBcCit7IGludCBpOyBcCisgIGZvcihpPTA7aTwxNjM4NDtpKyspIHsgXAorICAgIGlmKCFwLT5zY2ItPmNtZF9jdWMpIGJyZWFrOyBcCisgICAgREVMQVlfMTgoKTsgXAorICAgIGlmKGkgPT0gMTYzODMpIHsgXAorICAgICAgcHJpbnRrKCIlczogc2NiX2NtZCB0aW1lZCBvdXQ6ICUwNHgsJTA0eCAuLiBkaXNhYmxpbmcgaTgyNTg2ISFcbiIsZGV2LT5uYW1lLHAtPnNjYi0+Y21kX2N1YyxwLT5zY2ItPmN1cyk7IFwKKyAgICAgICBpZighcC0+cmVzZXRlZCkgeyBwLT5yZXNldGVkID0gMTsgbmlfcmVzZXQ1ODYoKTsgfSB9IH0gfQorCisjZGVmaW5lIFdBSVRfNF9TQ0JfQ01EX1JVQygpIHsgaW50IGk7IFwKKyAgZm9yKGk9MDtpPDE2Mzg0O2krKykgeyBcCisgICAgaWYoIXAtPnNjYi0+Y21kX3J1YykgYnJlYWs7IFwKKyAgICBERUxBWV8xOCgpOyBcCisgICAgaWYoaSA9PSAxNjM4MykgeyBcCisgICAgICBwcmludGsoIiVzOiBzY2JfY21kIChydWMpIHRpbWVkIG91dDogJTA0eCwlMDR4IC4uIGRpc2FibGluZyBpODI1ODYhIVxuIixkZXYtPm5hbWUscC0+c2NiLT5jbWRfcnVjLHAtPnNjYi0+cnVzKTsgXAorICAgICAgIGlmKCFwLT5yZXNldGVkKSB7IHAtPnJlc2V0ZWQgPSAxOyBuaV9yZXNldDU4NigpOyB9IH0gfSB9CisKKyNkZWZpbmUgV0FJVF80X1NUQVRfQ09NUEwoYWRkcikgeyBpbnQgaTsgXAorICAgZm9yKGk9MDtpPDMyNzY3O2krKykgeyBcCisgICAgIGlmKChhZGRyKS0+Y21kX3N0YXR1cyAmIFNUQVRfQ09NUEwpIGJyZWFrOyBcCisgICAgIERFTEFZXzE2KCk7IERFTEFZXzE2KCk7IH0gfQorCisjZGVmaW5lIE5JNTJfVE9UQUxfU0laRSAxNgorI2RlZmluZSBOSTUyX0FERFIwIDB4MDIKKyNkZWZpbmUgTkk1Ml9BRERSMSAweDA3CisjZGVmaW5lIE5JNTJfQUREUjIgMHgwMQorCitzdGF0aWMgaW50ICAgICBuaTUyX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCBpb2FkZHIpOworc3RhdGljIGlycXJldHVybl90IG5pNTJfaW50ZXJydXB0KGludCBpcnEsdm9pZCAqZGV2X2lkLHN0cnVjdCBwdF9yZWdzICpyZWdfcHRyKTsKK3N0YXRpYyBpbnQgICAgIG5pNTJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIG5pNTJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBuaTUyX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICosc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgc3RydWN0ICBuZXRfZGV2aWNlX3N0YXRzICpuaTUyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIG5pNTJfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZiAwCitzdGF0aWMgdm9pZCAgICBuaTUyX2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKix2b2lkICopOworI2VuZGlmCisKKy8qIGhlbHBlci1mdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgICAgIGluaXQ1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBjaGVjazU4NihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGNoYXIgKndoZXJlLHVuc2lnbmVkIHNpemUpOworc3RhdGljIHZvaWQgICAgYWxsb2M1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBzdGFydHJlY3Y1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICphbGxvY19yZmEoc3RydWN0IG5ldF9kZXZpY2UgKmRldix2b2lkICpwdHIpOworc3RhdGljIHZvaWQgICAgbmk1Ml9yY3ZfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgbmk1Ml94bXRfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgbmk1Ml9ybnJfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdHJ1Y3QgcHJpdgoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwljaGFyICptZW10b3A7CisJbG9uZyBpbnQgbG9jazsKKwlpbnQgcmVzZXRlZDsKKwl2b2xhdGlsZSBzdHJ1Y3QgcmZkX3N0cnVjdAkqcmZkX2xhc3QsKnJmZF90b3AsKnJmZF9maXJzdDsKKwl2b2xhdGlsZSBzdHJ1Y3Qgc2NwX3N0cnVjdAkqc2NwOwkvKiB2b2xhdGlsZSBpcyBpbXBvcnRhbnQgKi8KKwl2b2xhdGlsZSBzdHJ1Y3QgaXNjcF9zdHJ1Y3QJKmlzY3A7CS8qIHZvbGF0aWxlIGlzIGltcG9ydGFudCAqLworCXZvbGF0aWxlIHN0cnVjdCBzY2Jfc3RydWN0CSpzY2I7CS8qIHZvbGF0aWxlIGlzIGltcG9ydGFudCAqLworCXZvbGF0aWxlIHN0cnVjdCB0YmRfc3RydWN0CSp4bWl0X2J1ZmZzW05VTV9YTUlUX0JVRkZTXTsKKyNpZiAoTlVNX1hNSVRfQlVGRlMgPT0gMSkKKwl2b2xhdGlsZSBzdHJ1Y3QgdHJhbnNtaXRfY21kX3N0cnVjdCAqeG1pdF9jbWRzWzJdOworCXZvbGF0aWxlIHN0cnVjdCBub3BfY21kX3N0cnVjdCAqbm9wX2NtZHNbMl07CisjZWxzZQorCXZvbGF0aWxlIHN0cnVjdCB0cmFuc21pdF9jbWRfc3RydWN0ICp4bWl0X2NtZHNbTlVNX1hNSVRfQlVGRlNdOworCXZvbGF0aWxlIHN0cnVjdCBub3BfY21kX3N0cnVjdCAqbm9wX2NtZHNbTlVNX1hNSVRfQlVGRlNdOworI2VuZGlmCisJdm9sYXRpbGUgaW50CQlub3BfcG9pbnQsbnVtX3JlY3ZfYnVmZnM7CisJdm9sYXRpbGUgY2hhcgkJKnhtaXRfY2J1ZmZzW05VTV9YTUlUX0JVRkZTXTsKKwl2b2xhdGlsZSBpbnQJCXhtaXRfY291bnQseG1pdF9sYXN0OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNsb3NlIGRldmljZQorICovCitzdGF0aWMgaW50IG5pNTJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCW5pX3Jlc2V0NTg2KCk7IC8qIHRoZSBoYXJkIHdheSB0byBzdG9wIHRoZSByZWNlaXZlciAqLworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBvcGVuIGRldmljZQorICovCitzdGF0aWMgaW50IG5pNTJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXQ7CisKKwluaV9kaXNpbnQoKTsKKwlhbGxvYzU4NihkZXYpOworCWluaXQ1ODYoZGV2KTsKKwlzdGFydHJlY3Y1ODYoZGV2KTsKKwluaV9lbmFpbnQoKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmbmk1Ml9pbnRlcnJ1cHQsMCxkZXYtPm5hbWUsZGV2KTsKKwlpZiAocmV0KQorCXsKKwkJbmlfcmVzZXQ1ODYoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7IC8qIG1vc3QgZG9uZSBieSBpbml0ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbiA4MjU4NiBvdXQgdGhlcmUuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2s1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldixjaGFyICp3aGVyZSx1bnNpZ25lZCBzaXplKQoreworCXN0cnVjdCBwcml2IHBiOworCXN0cnVjdCBwcml2ICpwID0gLyogKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdiovICZwYjsKKwljaGFyICppc2NwX2FkZHJzWzJdOworCWludCBpOworCisJcC0+YmFzZSA9ICh1bnNpZ25lZCBsb25nKSBpc2FfYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpd2hlcmUpICsgc2l6ZSAtIDB4MDEwMDAwMDA7CisJcC0+bWVtdG9wID0gaXNhX2J1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKXdoZXJlKSArIHNpemU7CisJcC0+c2NwID0gKHN0cnVjdCBzY3Bfc3RydWN0ICopKHAtPmJhc2UgKyBTQ1BfREVGQVVMVF9BRERSRVNTKTsKKwltZW1zZXQoKGNoYXIgKilwLT5zY3AsMCwgc2l6ZW9mKHN0cnVjdCBzY3Bfc3RydWN0KSk7CisJZm9yKGk9MDtpPHNpemVvZihzdHJ1Y3Qgc2NwX3N0cnVjdCk7aSsrKSAvKiBtZW1vcnkgd2FzIHdyaXRlYWJsZT8gKi8KKwkJaWYoKChjaGFyICopcC0+c2NwKVtpXSkKKwkJCXJldHVybiAwOworCXAtPnNjcC0+c3lzYnVzID0gU1lTQlVTVkFMOwkJCQkvKiAxID0gOEJpdC1CdXMsIDAgPSAxNiBCaXQgKi8KKwlpZihwLT5zY3AtPnN5c2J1cyAhPSBTWVNCVVNWQUwpCisJCXJldHVybiAwOworCisJaXNjcF9hZGRyc1swXSA9IGlzYV9idXNfdG9fdmlydCgodW5zaWduZWQgbG9uZyl3aGVyZSk7CisJaXNjcF9hZGRyc1sxXT0gKGNoYXIgKikgcC0+c2NwIC0gc2l6ZW9mKHN0cnVjdCBpc2NwX3N0cnVjdCk7CisKKwlmb3IoaT0wO2k8MjtpKyspCisJeworCQlwLT5pc2NwID0gKHN0cnVjdCBpc2NwX3N0cnVjdCAqKSBpc2NwX2FkZHJzW2ldOworCQltZW1zZXQoKGNoYXIgKilwLT5pc2NwLDAsIHNpemVvZihzdHJ1Y3QgaXNjcF9zdHJ1Y3QpKTsKKworCQlwLT5zY3AtPmlzY3AgPSBtYWtlMjQocC0+aXNjcCk7CisJCXAtPmlzY3AtPmJ1c3kgPSAxOworCisJCW5pX3Jlc2V0NTg2KCk7CisJCW5pX2F0dG41ODYoKTsKKwkJREVMQVkoMSk7CS8qIHdhaXQgYSB3aGlsZS4uLiAqLworCisJCWlmKHAtPmlzY3AtPmJ1c3kpIC8qIGk4MjU4NiBjbGVhcnMgJ2J1c3knIGFmdGVyIHN1Y2Nlc3NmdWwgaW5pdCAqLworCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzZXQgaXNjcCBhdCB0aGUgcmlnaHQgcGxhY2UsIGNhbGxlZCBieSBuaTUyX3Byb2JlMSBhbmQgb3BlbjU4Ni4KKyAqLworc3RhdGljIHZvaWQgYWxsb2M1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9CShzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwluaV9yZXNldDU4NigpOworCURFTEFZKDEpOworCisJcC0+c2NwCT0gKHN0cnVjdCBzY3Bfc3RydWN0ICopCShwLT5iYXNlICsgU0NQX0RFRkFVTFRfQUREUkVTUyk7CisJcC0+c2NiCT0gKHN0cnVjdCBzY2Jfc3RydWN0ICopCWlzYV9idXNfdG9fdmlydChkZXYtPm1lbV9zdGFydCk7CisJcC0+aXNjcCA9IChzdHJ1Y3QgaXNjcF9zdHJ1Y3QgKikgKChjaGFyICopcC0+c2NwIC0gc2l6ZW9mKHN0cnVjdCBpc2NwX3N0cnVjdCkpOworCisJbWVtc2V0KChjaGFyICopIHAtPmlzY3AsMCxzaXplb2Yoc3RydWN0IGlzY3Bfc3RydWN0KSk7CisJbWVtc2V0KChjaGFyICopIHAtPnNjcCAsMCxzaXplb2Yoc3RydWN0IHNjcF9zdHJ1Y3QpKTsKKworCXAtPnNjcC0+aXNjcCA9IG1ha2UyNChwLT5pc2NwKTsKKwlwLT5zY3AtPnN5c2J1cyA9IFNZU0JVU1ZBTDsKKwlwLT5pc2NwLT5zY2Jfb2Zmc2V0ID0gbWFrZTE2KHAtPnNjYik7CisKKwlwLT5pc2NwLT5idXN5ID0gMTsKKwluaV9yZXNldDU4NigpOworCW5pX2F0dG41ODYoKTsKKworCURFTEFZKDEpOworCisJaWYocC0+aXNjcC0+YnVzeSkKKwkJcHJpbnRrKCIlczogSW5pdC1Qcm9ibGVtcyAoYWxsb2MpLlxuIixkZXYtPm5hbWUpOworCisJcC0+cmVzZXRlZCA9IDA7CisKKwltZW1zZXQoKGNoYXIgKilwLT5zY2IsMCxzaXplb2Yoc3RydWN0IHNjYl9zdHJ1Y3QpKTsKK30KKworLyogc2V0OiBpbyxpcnEsbWVtc3RhcnQsbWVtZW5kIG9yIHNldCBpdCB3aGVuIGNhbGxpbmcgaW5zbW9kICovCitzdGF0aWMgaW50IGlycT05Oworc3RhdGljIGludCBpbz0weDMwMDsKK3N0YXRpYyBsb25nIG1lbXN0YXJ0OwkvKiBlLmcgMHhkMDAwMCAqLworc3RhdGljIGxvbmcgbWVtZW5kOwkvKiBlLmcgMHhkNDAwMCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcHJvYmUgdGhlIG5pNTIxMC1jYXJkCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IG5pNTJfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgcHJpdikpOworCXN0YXRpYyBpbnQgcG9ydHNbXSA9IHsweDMwMCwgMHgyODAsIDB4MzYwICwgMHgzMjAgLCAweDM0MCwgMH07CisJaW50ICpwb3J0OworCWludCBlcnIgPSAwOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJCWlvID0gZGV2LT5iYXNlX2FkZHI7CisJCWlycSA9IGRldi0+aXJxOworCQltZW1zdGFydCA9IGRldi0+bWVtX3N0YXJ0OworCQltZW1lbmQgPSBkZXYtPm1lbV9lbmQ7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKGlvID4gMHgxZmYpCXsJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQllcnIgPSBuaTUyX3Byb2JlMShkZXYsIGlvKTsKKwl9IGVsc2UgaWYgKGlvID4gMCkgewkJLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCQllcnIgPSAtRU5YSU87CisJfSBlbHNlIHsKKwkJZm9yIChwb3J0ID0gcG9ydHM7ICpwb3J0ICYmIG5pNTJfcHJvYmUxKGRldiwgKnBvcnQpIDsgcG9ydCsrKQorCQkJOworCQlpZiAoKnBvcnQpCisJCQlnb3RvIGdvdF9pdDsKKyNpZmRlZiBGVUxMX0lPX1BST0JFCisJCWZvciAoaW8gPSAweDIwMDsgaW8gPCAweDQwMCAmJiBuaTUyX3Byb2JlMShkZXYsIGlvKTsgaW8gKz0gOCkKKwkJCTsKKwkJaWYgKGlvIDwgMHg0MDApCisJCQlnb3RvIGdvdF9pdDsKKyNlbmRpZgorCQllcnIgPSAtRU5PREVWOworCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKK2dvdF9pdDoKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIE5JNTJfVE9UQUxfU0laRSk7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBuaTUyX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCBpb2FkZHIpCit7CisJaW50IGksIHNpemUsIHJldHZhbDsKKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCWRldi0+aXJxID0gaXJxOworCWRldi0+bWVtX3N0YXJ0ID0gbWVtc3RhcnQ7CisJZGV2LT5tZW1fZW5kID0gbWVtZW5kOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIE5JNTJfVE9UQUxfU0laRSwgRFJWX05BTUUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYoICEoaW5iKGlvYWRkcitOSTUyX01BR0lDMSkgPT0gTkk1Ml9NQUdJQ1ZBTDEpIHx8CisJICAgICEoaW5iKGlvYWRkcitOSTUyX01BR0lDMikgPT0gTkk1Ml9NQUdJQ1ZBTDIpKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWZvcihpPTA7aTxFVEhfQUxFTjtpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoZGV2LT5iYXNlX2FkZHIraSk7CisKKwlpZihkZXYtPmRldl9hZGRyWzBdICE9IE5JNTJfQUREUjAgfHwgZGV2LT5kZXZfYWRkclsxXSAhPSBOSTUyX0FERFIxCisJCSB8fCBkZXYtPmRldl9hZGRyWzJdICE9IE5JNTJfQUREUjIpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5JNTIxMCBmb3VuZCBhdCAlIzNseCwgIixkZXYtPm5hbWUsZGV2LT5iYXNlX2FkZHIpOworCisJLyoKKwkgKiBjaGVjayAob3Igc2VhcmNoKSBJTy1NZW1vcnksIDhLIGFuZCAxNksKKwkgKi8KKyNpZmRlZiBNT0RVTEUKKwlzaXplID0gZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQ7CisJaWYoc2l6ZSAhPSAweDIwMDAgJiYgc2l6ZSAhPSAweDQwMDApIHsKKwkJcHJpbnRrKCJcbiVzOiBJbGxlZ2FsIG1lbW9yeSBzaXplICVkLiBBbGxvd2VkIGlzIDB4MjAwMCBvciAweDQwMDAgYnl0ZXMuXG4iLGRldi0+bmFtZSxzaXplKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCWlmKCFjaGVjazU4NihkZXYsKGNoYXIgKikgZGV2LT5tZW1fc3RhcnQsc2l6ZSkpIHsKKwkJcHJpbnRrKCI/bWVtY2hlY2ssIENhbid0IGZpbmQgbWVtb3J5IGF0IDB4JWx4IHdpdGggc2l6ZSAlZCFcbiIsZGV2LT5tZW1fc3RhcnQsc2l6ZSk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKyNlbHNlCisJaWYoZGV2LT5tZW1fc3RhcnQgIT0gMCkgLyogbm8gYXV0by1tZW0tcHJvYmUgKi8KKwl7CisJCXNpemUgPSAweDQwMDA7IC8qIGNoZWNrIGZvciAxNksgbWVtICovCisJCWlmKCFjaGVjazU4NihkZXYsKGNoYXIgKikgZGV2LT5tZW1fc3RhcnQsc2l6ZSkpIHsKKwkJCXNpemUgPSAweDIwMDA7IC8qIGNoZWNrIGZvciA4SyBtZW0gKi8KKwkJCWlmKCFjaGVjazU4NihkZXYsKGNoYXIgKikgZGV2LT5tZW1fc3RhcnQsc2l6ZSkpIHsKKwkJCQlwcmludGsoIj9tZW1wcm9iZSwgQ2FuJ3QgZmluZCBtZW1vcnkgYXQgMHglbHghXG4iLGRldi0+bWVtX3N0YXJ0KTsKKwkJCQlyZXR2YWwgPSAtRU5PREVWOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCXN0YXRpYyBsb25nIG1lbWFkZHJzW10gPSB7IDB4YzgwMDAsMHhjYTAwMCwweGNjMDAwLDB4Y2UwMDAsMHhkMDAwMCwweGQyMDAwLAorCQkJCQkweGQ0MDAwLDB4ZDYwMDAsMHhkODAwMCwweGRhMDAwLDB4ZGMwMDAsIDAgfTsKKwkJZm9yKGk9MDs7aSsrKQorCQl7CisJCQlpZighbWVtYWRkcnNbaV0pIHsKKwkJCQlwcmludGsoIj9tZW1wcm9iZSwgQ2FuJ3QgZmluZCBpby1tZW1vcnkhXG4iKTsKKwkJCQlyZXR2YWwgPSAtRU5PREVWOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZGV2LT5tZW1fc3RhcnQgPSBtZW1hZGRyc1tpXTsKKwkJCXNpemUgPSAweDIwMDA7IC8qIGNoZWNrIGZvciA4SyBtZW0gKi8KKwkJCWlmKGNoZWNrNTg2KGRldiwoY2hhciAqKWRldi0+bWVtX3N0YXJ0LHNpemUpKSAvKiA4Sy1jaGVjayAqLworCQkJCWJyZWFrOworCQkJc2l6ZSA9IDB4NDAwMDsgLyogY2hlY2sgZm9yIDE2SyBtZW0gKi8KKwkJCWlmKGNoZWNrNTg2KGRldiwoY2hhciAqKWRldi0+bWVtX3N0YXJ0LHNpemUpKSAvKiAxNkstY2hlY2sgKi8KKwkJCQlicmVhazsKKwkJfQorCX0KKwlkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIHNpemU7IC8qIHNldCBtZW1fZW5kIHNob3dlZCBieSAnaWZjb25maWcnICovCisjZW5kaWYKKworCW1lbXNldCgoY2hhciAqKSBkZXYtPnByaXYsMCxzaXplb2Yoc3RydWN0IHByaXYpKTsKKworCSgoc3RydWN0IHByaXYgKikgKGRldi0+cHJpdikpLT5tZW10b3AgPSBpc2FfYnVzX3RvX3ZpcnQoZGV2LT5tZW1fc3RhcnQpICsgc2l6ZTsKKwkoKHN0cnVjdCBwcml2ICopIChkZXYtPnByaXYpKS0+YmFzZSA9CSh1bnNpZ25lZCBsb25nKSBpc2FfYnVzX3RvX3ZpcnQoZGV2LT5tZW1fc3RhcnQpICsgc2l6ZSAtIDB4MDEwMDAwMDA7CisJYWxsb2M1ODYoZGV2KTsKKworCS8qIHNldCBudW1iZXIgb2YgcmVjZWl2ZS1idWZmcyBhY2NvcmRpbmcgdG8gbWVtc2l6ZSAqLworCWlmKHNpemUgPT0gMHgyMDAwKQorCQkoKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdiktPm51bV9yZWN2X2J1ZmZzID0gTlVNX1JFQ1ZfQlVGRlNfODsKKwllbHNlCisJCSgoc3RydWN0IHByaXYgKikgZGV2LT5wcml2KS0+bnVtX3JlY3ZfYnVmZnMgPSBOVU1fUkVDVl9CVUZGU18xNjsKKworCXByaW50aygiTWVtYWRkcjogMHglbHgsIE1lbXNpemU6ICVkLCAiLGRldi0+bWVtX3N0YXJ0LHNpemUpOworCisJaWYoZGV2LT5pcnEgPCAyKQorCXsKKwkJdW5zaWduZWQgbG9uZyBpcnFfbWFzazsKKworCQlpcnFfbWFzayA9IHByb2JlX2lycV9vbigpOworCQluaV9yZXNldDU4NigpOworCQluaV9hdHRuNTg2KCk7CisKKwkJbWRlbGF5KDIwKTsKKwkJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmKGlycV9tYXNrKTsKKwkJaWYoIWRldi0+aXJxKQorCQl7CisJCQlwcmludGsoIj9hdXRvaXJxLCBGYWlsZWQgdG8gZGV0ZWN0IElSUSBsaW5lIVxuIik7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byBvdXQ7CisJCX0KKwkJcHJpbnRrKCJJUlEgJWQgKGF1dG9kZXRlY3RlZCkuXG4iLGRldi0+aXJxKTsKKwl9CisJZWxzZQl7CisJCWlmKGRldi0+aXJxID09IDIpCisJCQlkZXYtPmlycSA9IDk7CisJCXByaW50aygiSVJRICVkIChhc3NpZ25lZCBhbmQgbm90IGNoZWNrZWQhKS5cbiIsZGV2LT5pcnEpOworCX0KKworCWRldi0+b3BlbgkJPSBuaTUyX29wZW47CisJZGV2LT5zdG9wCQk9IG5pNTJfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMJCT0gbmk1Ml9nZXRfc3RhdHM7CisJZGV2LT50eF90aW1lb3V0IAk9IG5pNTJfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gSFovMjA7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgCT0gbmk1Ml9zZW5kX3BhY2tldDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9tdWx0aWNhc3RfbGlzdDsKKworCWRldi0+aWZfcG9ydCAJCT0gMDsKKworCXJldHVybiAwOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgTkk1Ml9UT1RBTF9TSVpFKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5pdCB0aGUgY2hpcCAobmk1Mi1pbnRlcnJ1cHQgc2hvdWxkIGJlIGRpc2FibGVkPyEpCisgKiBuZWVkcyBhIGNvcnJlY3QgJ2FsbG9jYXRlZCcgbWVtb3J5CisgKi8KKworc3RhdGljIGludCBpbml0NTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdm9pZCAqcHRyOworCWludCBpLHJlc3VsdD0wOworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKwl2b2xhdGlsZSBzdHJ1Y3QgY29uZmlndXJlX2NtZF9zdHJ1Y3QJKmNmZ19jbWQ7CisJdm9sYXRpbGUgc3RydWN0IGlhc2V0dXBfY21kX3N0cnVjdCAqaWFzX2NtZDsKKwl2b2xhdGlsZSBzdHJ1Y3QgdGRyX2NtZF9zdHJ1Y3QgKnRkcl9jbWQ7CisJdm9sYXRpbGUgc3RydWN0IG1jc2V0dXBfY21kX3N0cnVjdCAqbWNfY21kOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pPWRldi0+bWNfbGlzdDsKKwlpbnQgbnVtX2FkZHJzPWRldi0+bWNfY291bnQ7CisKKwlwdHIgPSAodm9pZCAqKSAoKGNoYXIgKilwLT5zY2IgKyBzaXplb2Yoc3RydWN0IHNjYl9zdHJ1Y3QpKTsKKworCWNmZ19jbWQgPSAoc3RydWN0IGNvbmZpZ3VyZV9jbWRfc3RydWN0ICopcHRyOyAvKiBjb25maWd1cmUtY29tbWFuZCAqLworCWNmZ19jbWQtPmNtZF9zdGF0dXMJPSAwOworCWNmZ19jbWQtPmNtZF9jbWQJPSBDTURfQ09ORklHVVJFIHwgQ01EX0xBU1Q7CisJY2ZnX2NtZC0+Y21kX2xpbmsJPSAweGZmZmY7CisKKwljZmdfY21kLT5ieXRlX2NudAk9IDB4MGE7IC8qIG51bWJlciBvZiBjZmcgYnl0ZXMgKi8KKwljZmdfY21kLT5maWZvCQk9IGZpZm87IC8qIGZpZm8tbGltaXQgKDg9dHg6MzIvcng6NjQpICovCisJY2ZnX2NtZC0+c2F2X2JmCQk9IDB4NDA7IC8qIGhvbGQgb3IgZGlzY2FyZCBiYWQgcmVjdiBmcmFtZXMgKGJpdCA3KSAqLworCWNmZ19jbWQtPmFkcl9sZW4JPSAweDJlOyAvKiBhZGRyX2xlbiB8IXNyY19pbnNlcnQgfHByZS1sZW4gfGxvb3BiYWNrICovCisJY2ZnX2NtZC0+cHJpb3JpdHkJPSAweDAwOworCWNmZ19jbWQtPmlmcwkJPSAweDYwOworCWNmZ19jbWQtPnRpbWVfbG93CT0gMHgwMDsKKwljZmdfY21kLT50aW1lX2hpZ2gJPSAweGYyOworCWNmZ19jbWQtPnByb21pc2MJPSAwOworCWlmKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJaW50IGxlbiA9ICgoY2hhciAqKSBwLT5pc2NwIC0gKGNoYXIgKikgcHRyIC0gOCkgLyA2OworCQlpZihudW1fYWRkcnMgPiBsZW4pCXsKKwkJCXByaW50aygiJXM6IHN3aXRjaGluZyB0byBwcm9taXNjLiBtb2RlXG4iLGRldi0+bmFtZSk7CisJCQlkZXYtPmZsYWdzfD1JRkZfUFJPTUlTQzsKKwkJfQorCX0KKwlpZihkZXYtPmZsYWdzJklGRl9QUk9NSVNDKQorCXsKKwkJCSBjZmdfY21kLT5wcm9taXNjPTE7CisJCQkgZGV2LT5mbGFnc3w9SUZGX1BST01JU0M7CisJfQorCWNmZ19jbWQtPmNhcnJfY29sbAk9IDB4MDA7CisKKwlwLT5zY2ItPmNibF9vZmZzZXQJPSBtYWtlMTYoY2ZnX2NtZCk7CisJcC0+c2NiLT5jbWRfcnVjCQk9IDA7CisKKwlwLT5zY2ItPmNtZF9jdWMJCT0gQ1VDX1NUQVJUOyAvKiBjbWQuLXVuaXQgc3RhcnQgKi8KKwluaV9hdHRuNTg2KCk7CisKKwlXQUlUXzRfU1RBVF9DT01QTChjZmdfY21kKTsKKworCWlmKChjZmdfY21kLT5jbWRfc3RhdHVzICYgKFNUQVRfT0t8U1RBVF9DT01QTCkpICE9IChTVEFUX0NPTVBMfFNUQVRfT0spKQorCXsKKwkJcHJpbnRrKCIlczogY29uZmlndXJlIGNvbW1hbmQgZmFpbGVkOiAleFxuIixkZXYtPm5hbWUsY2ZnX2NtZC0+Y21kX3N0YXR1cyk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogaW5kaXZpZHVhbCBhZGRyZXNzIHNldHVwCisJICovCisKKwlpYXNfY21kID0gKHN0cnVjdCBpYXNldHVwX2NtZF9zdHJ1Y3QgKilwdHI7CisKKwlpYXNfY21kLT5jbWRfc3RhdHVzCT0gMDsKKwlpYXNfY21kLT5jbWRfY21kCT0gQ01EX0lBU0VUVVAgfCBDTURfTEFTVDsKKwlpYXNfY21kLT5jbWRfbGluawk9IDB4ZmZmZjsKKworCW1lbWNweSgoY2hhciAqKSZpYXNfY21kLT5pYWRkciwoY2hhciAqKSBkZXYtPmRldl9hZGRyLEVUSF9BTEVOKTsKKworCXAtPnNjYi0+Y2JsX29mZnNldCA9IG1ha2UxNihpYXNfY21kKTsKKworCXAtPnNjYi0+Y21kX2N1YyA9IENVQ19TVEFSVDsgLyogY21kLi11bml0IHN0YXJ0ICovCisJbmlfYXR0bjU4NigpOworCisJV0FJVF80X1NUQVRfQ09NUEwoaWFzX2NtZCk7CisKKwlpZigoaWFzX2NtZC0+Y21kX3N0YXR1cyAmIChTVEFUX09LfFNUQVRfQ09NUEwpKSAhPSAoU1RBVF9PS3xTVEFUX0NPTVBMKSkgeworCQlwcmludGsoIiVzIChuaTUyKTogaW5kaXZpZHVhbCBhZGRyZXNzIHNldHVwIGNvbW1hbmQgZmFpbGVkOiAlMDR4XG4iLGRldi0+bmFtZSxpYXNfY21kLT5jbWRfc3RhdHVzKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBURFIsIHdpcmUgY2hlY2sgLi4gZS5nLiBubyByZXNpc3RvciBlLnQuYworCSAqLworCSAKKwl0ZHJfY21kID0gKHN0cnVjdCB0ZHJfY21kX3N0cnVjdCAqKXB0cjsKKworCXRkcl9jbWQtPmNtZF9zdGF0dXMJPSAwOworCXRkcl9jbWQtPmNtZF9jbWQJPSBDTURfVERSIHwgQ01EX0xBU1Q7CisJdGRyX2NtZC0+Y21kX2xpbmsJPSAweGZmZmY7CisJdGRyX2NtZC0+c3RhdHVzCQk9IDA7CisKKwlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYodGRyX2NtZCk7CisJcC0+c2NiLT5jbWRfY3VjID0gQ1VDX1NUQVJUOyAvKiBjbWQuLXVuaXQgc3RhcnQgKi8KKwluaV9hdHRuNTg2KCk7CisKKwlXQUlUXzRfU1RBVF9DT01QTCh0ZHJfY21kKTsKKworCWlmKCEodGRyX2NtZC0+Y21kX3N0YXR1cyAmIFNUQVRfQ09NUEwpKQorCXsKKwkJcHJpbnRrKCIlczogUHJvYmxlbXMgd2hpbGUgcnVubmluZyB0aGUgVERSLlxuIixkZXYtPm5hbWUpOworCX0KKwllbHNlCisJeworCQlERUxBWV8xNigpOyAvKiB3YWl0IGZvciByZXN1bHQgKi8KKwkJcmVzdWx0ID0gdGRyX2NtZC0+c3RhdHVzOworCisJCXAtPnNjYi0+Y21kX2N1YyA9IHAtPnNjYi0+Y3VzICYgU1RBVF9NQVNLOworCQluaV9hdHRuNTg2KCk7IC8qIGFjayB0aGUgaW50ZXJydXB0cyAqLworCisJCWlmKHJlc3VsdCAmIFREUl9MTktfT0spCisJCQk7CisJCWVsc2UgaWYocmVzdWx0ICYgVERSX1hDVlJfUFJCKQorCQkJcHJpbnRrKCIlczogVERSOiBUcmFuc2NlaXZlciBwcm9ibGVtLiBDaGVjayB0aGUgY2FibGUocykhXG4iLGRldi0+bmFtZSk7CisJCWVsc2UgaWYocmVzdWx0ICYgVERSX0VUX09QTikKKwkJCXByaW50aygiJXM6IFREUjogTm8gY29ycmVjdCB0ZXJtaW5hdGlvbiAlZCBjbG9ja3MgYXdheS5cbiIsZGV2LT5uYW1lLHJlc3VsdCAmIFREUl9USU1FTUFTSyk7CisJCWVsc2UgaWYocmVzdWx0ICYgVERSX0VUX1NSVCkKKwkJeworCQkJaWYgKHJlc3VsdCAmIFREUl9USU1FTUFTSykgLyogdGltZSA9PSAwIC0+IHN0cmFuZ2UgOi0pICovCisJCQkJcHJpbnRrKCIlczogVERSOiBEZXRlY3RlZCBhIHNob3J0IGNpcmN1aXQgJWQgY2xvY2tzIGF3YXkuXG4iLGRldi0+bmFtZSxyZXN1bHQgJiBURFJfVElNRU1BU0spOworCQl9CisJCWVsc2UKKwkJCXByaW50aygiJXM6IFREUjogVW5rbm93biBzdGF0dXMgJTA0eFxuIixkZXYtPm5hbWUscmVzdWx0KTsKKwl9CisKKwkvKgorCSAqIE11bHRpY2FzdCBzZXR1cAorCSAqLworCWlmKG51bV9hZGRycyAmJiAhKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgKQorCXsKKwkJbWNfY21kID0gKHN0cnVjdCBtY3NldHVwX2NtZF9zdHJ1Y3QgKikgcHRyOworCQltY19jbWQtPmNtZF9zdGF0dXMgPSAwOworCQltY19jbWQtPmNtZF9jbWQgPSBDTURfTUNTRVRVUCB8IENNRF9MQVNUOworCQltY19jbWQtPmNtZF9saW5rID0gMHhmZmZmOworCQltY19jbWQtPm1jX2NudCA9IG51bV9hZGRycyAqIDY7CisKKwkJZm9yKGk9MDtpPG51bV9hZGRycztpKyssZG1pPWRtaS0+bmV4dCkKKwkJCW1lbWNweSgoY2hhciAqKSBtY19jbWQtPm1jX2xpc3RbaV0sIGRtaS0+ZG1pX2FkZHIsNik7CisKKwkJcC0+c2NiLT5jYmxfb2Zmc2V0ID0gbWFrZTE2KG1jX2NtZCk7CisJCXAtPnNjYi0+Y21kX2N1YyA9IENVQ19TVEFSVDsKKwkJbmlfYXR0bjU4NigpOworCisJCVdBSVRfNF9TVEFUX0NPTVBMKG1jX2NtZCk7CisKKwkJaWYoIChtY19jbWQtPmNtZF9zdGF0dXMgJiAoU1RBVF9DT01QTHxTVEFUX09LKSkgIT0gKFNUQVRfQ09NUEx8U1RBVF9PSykgKQorCQkJcHJpbnRrKCIlczogQ2FuJ3QgYXBwbHkgbXVsdGljYXN0LWFkZHJlc3MtbGlzdC5cbiIsZGV2LT5uYW1lKTsKKwl9CisKKwkvKgorCSAqIGFsbG9jIG5vcC94bWl0LWNtZHMKKwkgKi8KKyNpZiAoTlVNX1hNSVRfQlVGRlMgPT0gMSkKKwlmb3IoaT0wO2k8MjtpKyspCisJeworCQlwLT5ub3BfY21kc1tpXSAJCQk9IChzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QgKilwdHI7CisJCXAtPm5vcF9jbWRzW2ldLT5jbWRfY21kCQk9IENNRF9OT1A7CisJCXAtPm5vcF9jbWRzW2ldLT5jbWRfc3RhdHVzIAk9IDA7CisJCXAtPm5vcF9jbWRzW2ldLT5jbWRfbGluawk9IG1ha2UxNigocC0+bm9wX2NtZHNbaV0pKTsKKwkJcHRyID0gKGNoYXIgKikgcHRyICsgc2l6ZW9mKHN0cnVjdCBub3BfY21kX3N0cnVjdCk7CisJfQorI2Vsc2UKKwlmb3IoaT0wO2k8TlVNX1hNSVRfQlVGRlM7aSsrKQorCXsKKwkJcC0+bm9wX2NtZHNbaV0JCQk9IChzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QgKilwdHI7CisJCXAtPm5vcF9jbWRzW2ldLT5jbWRfY21kCQk9IENNRF9OT1A7CisJCXAtPm5vcF9jbWRzW2ldLT5jbWRfc3RhdHVzCT0gMDsKKwkJcC0+bm9wX2NtZHNbaV0tPmNtZF9saW5rCT0gbWFrZTE2KChwLT5ub3BfY21kc1tpXSkpOworCQlwdHIgPSAoY2hhciAqKSBwdHIgKyBzaXplb2Yoc3RydWN0IG5vcF9jbWRfc3RydWN0KTsKKwl9CisjZW5kaWYKKworCXB0ciA9IGFsbG9jX3JmYShkZXYsKHZvaWQgKilwdHIpOyAvKiBpbml0IHJlY2VpdmUtZnJhbWUtYXJlYSAqLworCisJLyoKKwkgKiBhbGxvYyB4bWl0LWJ1ZmZzIC8gaW5pdCB4bWl0X2NtZHMKKwkgKi8KKwlmb3IoaT0wO2k8TlVNX1hNSVRfQlVGRlM7aSsrKQorCXsKKwkJcC0+eG1pdF9jbWRzW2ldID0gKHN0cnVjdCB0cmFuc21pdF9jbWRfc3RydWN0ICopcHRyOyAvKnRyYW5zbWl0IGNtZC9idWZmIDAqLworCQlwdHIgPSAoY2hhciAqKSBwdHIgKyBzaXplb2Yoc3RydWN0IHRyYW5zbWl0X2NtZF9zdHJ1Y3QpOworCQlwLT54bWl0X2NidWZmc1tpXSA9IChjaGFyICopcHRyOyAvKiBjaGFyLWJ1ZmZzICovCisJCXB0ciA9IChjaGFyICopIHB0ciArIFhNSVRfQlVGRl9TSVpFOworCQlwLT54bWl0X2J1ZmZzW2ldID0gKHN0cnVjdCB0YmRfc3RydWN0ICopcHRyOyAvKiBUQkQgKi8KKwkJcHRyID0gKGNoYXIgKikgcHRyICsgc2l6ZW9mKHN0cnVjdCB0YmRfc3RydWN0KTsKKwkJaWYoKHZvaWQgKilwdHIgPiAodm9pZCAqKXAtPmlzY3ApCisJCXsKKwkJCXByaW50aygiJXM6IG5vdCBlbm91Z2ggc2hhcmVkLW1lbSBmb3IgeW91ciBjb25maWd1cmF0aW9uIVxuIixkZXYtPm5hbWUpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbWVtc2V0KChjaGFyICopKHAtPnhtaXRfY21kc1tpXSkgLDAsIHNpemVvZihzdHJ1Y3QgdHJhbnNtaXRfY21kX3N0cnVjdCkpOworCQltZW1zZXQoKGNoYXIgKikocC0+eG1pdF9idWZmc1tpXSksMCwgc2l6ZW9mKHN0cnVjdCB0YmRfc3RydWN0KSk7CisJCXAtPnhtaXRfY21kc1tpXS0+Y21kX2xpbmsgPSBtYWtlMTYocC0+bm9wX2NtZHNbKGkrMSklTlVNX1hNSVRfQlVGRlNdKTsKKwkJcC0+eG1pdF9jbWRzW2ldLT5jbWRfc3RhdHVzID0gU1RBVF9DT01QTDsKKwkJcC0+eG1pdF9jbWRzW2ldLT5jbWRfY21kID0gQ01EX1hNSVQgfCBDTURfSU5UOworCQlwLT54bWl0X2NtZHNbaV0tPnRiZF9vZmZzZXQgPSBtYWtlMTYoKHAtPnhtaXRfYnVmZnNbaV0pKTsKKwkJcC0+eG1pdF9idWZmc1tpXS0+bmV4dCA9IDB4ZmZmZjsKKwkJcC0+eG1pdF9idWZmc1tpXS0+YnVmZmVyID0gbWFrZTI0KChwLT54bWl0X2NidWZmc1tpXSkpOworCX0KKworCXAtPnhtaXRfY291bnQgPSAwOworCXAtPnhtaXRfbGFzdAk9IDA7CisjaWZuZGVmIE5PX05PUENPTU1BTkRTCisJcC0+bm9wX3BvaW50CT0gMDsKKyNlbmRpZgorCisJIC8qCisJCSogJ3N0YXJ0IHRyYW5zbWl0dGVyJworCQkqLworI2lmbmRlZiBOT19OT1BDT01NQU5EUworCXAtPnNjYi0+Y2JsX29mZnNldCA9IG1ha2UxNihwLT5ub3BfY21kc1swXSk7CisJcC0+c2NiLT5jbWRfY3VjID0gQ1VDX1NUQVJUOworCW5pX2F0dG41ODYoKTsKKwlXQUlUXzRfU0NCX0NNRCgpOworI2Vsc2UKKwlwLT54bWl0X2NtZHNbMF0tPmNtZF9saW5rID0gbWFrZTE2KHAtPnhtaXRfY21kc1swXSk7CisJcC0+eG1pdF9jbWRzWzBdLT5jbWRfY21kCT0gQ01EX1hNSVQgfCBDTURfU1VTUEVORCB8IENNRF9JTlQ7CisjZW5kaWYKKworCS8qCisJICogYWNrLiBpbnRlcnJ1cHRzCisJICovCisJcC0+c2NiLT5jbWRfY3VjID0gcC0+c2NiLT5jdXMgJiBTVEFUX01BU0s7CisJbmlfYXR0bjU4NigpOworCURFTEFZXzE2KCk7CisKKwluaV9lbmFpbnQoKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGlzIGEgaGVscGVyIHJvdXRpbmUgZm9yIG5pNTJfcm5yX2ludCgpIGFuZCBpbml0NTg2KCkuCisgKiBJdCBzZXRzIHVwIHRoZSBSZWNlaXZlIEZyYW1lIEFyZWEgKFJGQSkuCisgKi8KKworc3RhdGljIHZvaWQgKmFsbG9jX3JmYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHZvaWQgKnB0cikKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgcmZkX3N0cnVjdCAqcmZkID0gKHN0cnVjdCByZmRfc3RydWN0ICopcHRyOworCXZvbGF0aWxlIHN0cnVjdCByYmRfc3RydWN0ICpyYmQ7CisJaW50IGk7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJbWVtc2V0KChjaGFyICopIHJmZCwwLHNpemVvZihzdHJ1Y3QgcmZkX3N0cnVjdCkqKHAtPm51bV9yZWN2X2J1ZmZzK3JmZGFkZCkpOworCXAtPnJmZF9maXJzdCA9IHJmZDsKKworCWZvcihpID0gMDsgaSA8IChwLT5udW1fcmVjdl9idWZmcytyZmRhZGQpOyBpKyspIHsKKwkJcmZkW2ldLm5leHQgPSBtYWtlMTYocmZkICsgKGkrMSkgJSAocC0+bnVtX3JlY3ZfYnVmZnMrcmZkYWRkKSApOworCQlyZmRbaV0ucmJkX29mZnNldCA9IDB4ZmZmZjsKKwl9CisJcmZkW3AtPm51bV9yZWN2X2J1ZmZzLTErcmZkYWRkXS5sYXN0ID0gUkZEX1NVU1A7CSAvKiBSVSBzdXNwZW5kICovCisKKwlwdHIgPSAodm9pZCAqKSAocmZkICsgKHAtPm51bV9yZWN2X2J1ZmZzICsgcmZkYWRkKSApOworCisJcmJkID0gKHN0cnVjdCByYmRfc3RydWN0ICopIHB0cjsKKwlwdHIgPSAodm9pZCAqKSAocmJkICsgcC0+bnVtX3JlY3ZfYnVmZnMpOworCisJIC8qIGNsciBkZXNjcmlwdG9ycyAqLworCW1lbXNldCgoY2hhciAqKSByYmQsMCxzaXplb2Yoc3RydWN0IHJiZF9zdHJ1Y3QpKihwLT5udW1fcmVjdl9idWZmcykpOworCisJZm9yKGk9MDtpPHAtPm51bV9yZWN2X2J1ZmZzO2krKykKKwl7CisJCXJiZFtpXS5uZXh0ID0gbWFrZTE2KChyYmQgKyAoaSsxKSAlIHAtPm51bV9yZWN2X2J1ZmZzKSk7CisJCXJiZFtpXS5zaXplID0gUkVDVl9CVUZGX1NJWkU7CisJCXJiZFtpXS5idWZmZXIgPSBtYWtlMjQocHRyKTsKKwkJcHRyID0gKGNoYXIgKikgcHRyICsgUkVDVl9CVUZGX1NJWkU7CisJfQorCisJcC0+cmZkX3RvcAk9IHAtPnJmZF9maXJzdDsKKwlwLT5yZmRfbGFzdCA9IHAtPnJmZF9maXJzdCArIChwLT5udW1fcmVjdl9idWZmcyAtIDEgKyByZmRhZGQpOworCisJcC0+c2NiLT5yZmFfb2Zmc2V0CQk9IG1ha2UxNihwLT5yZmRfZmlyc3QpOworCXAtPnJmZF9maXJzdC0+cmJkX29mZnNldAk9IG1ha2UxNihyYmQpOworCisJcmV0dXJuIHB0cjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEludGVycnVwdCBIYW5kbGVyIC4uLgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBuaTUyX2ludGVycnVwdChpbnQgaXJxLHZvaWQgKmRldl9pZCxzdHJ1Y3QgcHRfcmVncyAqcmVnX3B0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXVuc2lnbmVkIHNob3J0IHN0YXQ7CisJaW50IGNudD0wOworCXN0cnVjdCBwcml2ICpwOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrICgibmk1MjEwLWludGVycnVwdDogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwlwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCWlmKGRlYnVnbGV2ZWwgPiAxKQorCQlwcmludGsoIkkiKTsKKworCVdBSVRfNF9TQ0JfQ01EKCk7IC8qIHdhaXQgZm9yIGxhc3QgY29tbWFuZAkqLworCisJd2hpbGUoKHN0YXQ9cC0+c2NiLT5jdXMgJiBTVEFUX01BU0spKQorCXsKKwkJcC0+c2NiLT5jbWRfY3VjID0gc3RhdDsKKwkJbmlfYXR0bjU4NigpOworCisJCWlmKHN0YXQgJiBTVEFUX0ZSKQkgLyogcmVjZWl2ZWQgYSBmcmFtZSAqLworCQkJbmk1Ml9yY3ZfaW50KGRldik7CisKKwkJaWYoc3RhdCAmIFNUQVRfUk5SKSAvKiBSVSB3ZW50ICdub3QgcmVhZHknICovCisJCXsKKwkJCXByaW50aygiKFIpIik7CisJCQlpZihwLT5zY2ItPnJ1cyAmIFJVX1NVU1BFTkQpIC8qIHNwZWNpYWwgY2FzZTogUlVfU1VTUEVORCAqLworCQkJeworCQkJCVdBSVRfNF9TQ0JfQ01EKCk7CisJCQkJcC0+c2NiLT5jbWRfcnVjID0gUlVDX1JFU1VNRTsKKwkJCQluaV9hdHRuNTg2KCk7CisJCQkJV0FJVF80X1NDQl9DTURfUlVDKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcHJpbnRrKCIlczogUmVjZWl2ZXItVW5pdCB3ZW50ICdOT1QgUkVBRFknOiAlMDR4LyUwMnguXG4iLGRldi0+bmFtZSwoaW50KSBzdGF0LChpbnQpIHAtPnNjYi0+cnVzKTsKKwkJCQluaTUyX3Jucl9pbnQoZGV2KTsKKwkJCX0KKwkJfQorCisJCWlmKHN0YXQgJiBTVEFUX0NYKQkJLyogY29tbWFuZCB3aXRoIEktYml0IHNldCBjb21wbGV0ZSAqLworCQkJIG5pNTJfeG10X2ludChkZXYpOworCisjaWZuZGVmIE5PX05PUENPTU1BTkRTCisJCWlmKHN0YXQgJiBTVEFUX0NOQSkJLyogQ1Ugd2VudCAnbm90IHJlYWR5JyAqLworCQl7CisJCQlpZihuZXRpZl9ydW5uaW5nKGRldikpCisJCQkJcHJpbnRrKCIlczogb29wcyEgQ1UgaGFzIGxlZnQgYWN0aXZlIHN0YXRlLiBzdGF0OiAlMDR4LyUwMnguXG4iLGRldi0+bmFtZSwoaW50KSBzdGF0LChpbnQpIHAtPnNjYi0+Y3VzKTsKKwkJfQorI2VuZGlmCisKKwkJaWYoZGVidWdsZXZlbCA+IDEpCisJCQlwcmludGsoIiVkIixjbnQrKyk7CisKKwkJV0FJVF80X1NDQl9DTUQoKTsgLyogd2FpdCBmb3IgYWNrLiAobmk1Ml94bXRfaW50IGNhbiBiZSBmYXN0ZXIgdGhhbiBhY2shISkgKi8KKwkJaWYocC0+c2NiLT5jbWRfY3VjKQkgLyogdGltZWQgb3V0PyAqLworCQl7CisJCQlwcmludGsoIiVzOiBBY2tub3dsZWRnZSB0aW1lZCBvdXQuXG4iLGRldi0+bmFtZSk7CisJCQluaV9kaXNpbnQoKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYoZGVidWdsZXZlbCA+IDEpCisJCXByaW50aygiaSIpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJlY2VpdmUtaW50ZXJydXB0CisgKi8KKworc3RhdGljIHZvaWQgbmk1Ml9yY3ZfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHN0YXR1cyxjbnQ9MDsKKwl1bnNpZ25lZCBzaG9ydCB0b3RsZW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgcmJkX3N0cnVjdCAqcmJkOworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCWlmKGRlYnVnbGV2ZWwgPiAwKQorCQlwcmludGsoIlIiKTsKKworCWZvcig7KHN0YXR1cyA9IHAtPnJmZF90b3AtPnN0YXRfaGlnaCkgJiBSRkRfQ09NUEw7KQorCXsKKwkJCXJiZCA9IChzdHJ1Y3QgcmJkX3N0cnVjdCAqKSBtYWtlMzIocC0+cmZkX3RvcC0+cmJkX29mZnNldCk7CisKKwkJCWlmKHN0YXR1cyAmIFJGRF9PSykgLyogZnJhbWUgcmVjZWl2ZWQgd2l0aG91dCBlcnJvcj8gKi8KKwkJCXsKKwkJCQlpZiggKHRvdGxlbiA9IHJiZC0+c3RhdHVzKSAmIFJCRF9MQVNUKSAvKiB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGJ1ZmZlcj8gKi8KKwkJCQl7CisJCQkJCXRvdGxlbiAmPSBSQkRfTUFTSzsgLyogbGVuZ3RoIG9mIHRoaXMgZnJhbWUgKi8KKwkJCQkJcmJkLT5zdGF0dXMgPSAwOworCQkJCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgZGV2X2FsbG9jX3NrYih0b3RsZW4rMik7CisJCQkJCWlmKHNrYiAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQlza2ItPmRldiA9IGRldjsKKwkJCQkJCXNrYl9yZXNlcnZlKHNrYiwyKTsKKwkJCQkJCXNrYl9wdXQoc2tiLHRvdGxlbik7CisJCQkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwoY2hhciAqKSBwLT5iYXNlKyh1bnNpZ25lZCBsb25nKSByYmQtPmJ1ZmZlcix0b3RsZW4sMCk7CisJCQkJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJCQlwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJCQlwLT5zdGF0cy5yeF9ieXRlcyArPSB0b3RsZW47CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpbnQgcnN0YXQ7CisJCQkJCQkgLyogZnJlZSBhbGwgUkJEJ3MgdW50aWwgUkJEX0xBU1QgaXMgc2V0ICovCisJCQkJCXRvdGxlbiA9IDA7CisJCQkJCXdoaWxlKCEoKHJzdGF0PXJiZC0+c3RhdHVzKSAmIFJCRF9MQVNUKSkKKwkJCQkJeworCQkJCQkJdG90bGVuICs9IHJzdGF0ICYgUkJEX01BU0s7CisJCQkJCQlpZighcnN0YXQpCisJCQkJCQl7CisJCQkJCQkJcHJpbnRrKCIlczogV2hvb3BzIC4uIG5vIGVuZCBtYXJrIGluIFJCRCBsaXN0XG4iLGRldi0+bmFtZSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlyYmQtPnN0YXR1cyA9IDA7CisJCQkJCQlyYmQgPSAoc3RydWN0IHJiZF9zdHJ1Y3QgKikgbWFrZTMyKHJiZC0+bmV4dCk7CisJCQkJCX0KKwkJCQkJdG90bGVuICs9IHJzdGF0ICYgUkJEX01BU0s7CisJCQkJCXJiZC0+c3RhdHVzID0gMDsKKwkJCQkJcHJpbnRrKCIlczogcmVjZWl2ZWQgb3ZlcnNpemVkIGZyYW1lISBsZW5ndGg6ICVkXG4iLGRldi0+bmFtZSx0b3RsZW4pOworCQkJCQlwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkgfQorCQl9CisJCWVsc2UgLyogZnJhbWUgIShvayksIG9ubHkgd2l0aCAnc2F2ZS1iYWQtZnJhbWVzJyAqLworCQl7CisJCQlwcmludGsoIiVzOiBvb3BzISByZmQtZXJyb3Itc3RhdHVzOiAlMDR4XG4iLGRldi0+bmFtZSxzdGF0dXMpOworCQkJcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCX0KKwkJcC0+cmZkX3RvcC0+c3RhdF9oaWdoID0gMDsKKwkJcC0+cmZkX3RvcC0+bGFzdCA9IFJGRF9TVVNQOyAvKiBtYXliZSBleGNoYW5nZSBieSBSRkRfTEFTVCAqLworCQlwLT5yZmRfdG9wLT5yYmRfb2Zmc2V0ID0gMHhmZmZmOworCQlwLT5yZmRfbGFzdC0+bGFzdCA9IDA7CQkJCS8qIGRlbGV0ZSBSRkRfU1VTUAkqLworCQlwLT5yZmRfbGFzdCA9IHAtPnJmZF90b3A7CisJCXAtPnJmZF90b3AgPSAoc3RydWN0IHJmZF9zdHJ1Y3QgKikgbWFrZTMyKHAtPnJmZF90b3AtPm5leHQpOyAvKiBzdGVwIHRvIG5leHQgUkZEICovCisJCXAtPnNjYi0+cmZhX29mZnNldCA9IG1ha2UxNihwLT5yZmRfdG9wKTsKKworCQlpZihkZWJ1Z2xldmVsID4gMCkKKwkJCXByaW50aygiJWQiLGNudCsrKTsKKwl9CisKKwlpZihhdXRvbWF0aWNfcmVzdW1lKQorCXsKKwkJV0FJVF80X1NDQl9DTUQoKTsKKwkJcC0+c2NiLT5jbWRfcnVjID0gUlVDX1JFU1VNRTsKKwkJbmlfYXR0bjU4NigpOworCQlXQUlUXzRfU0NCX0NNRF9SVUMoKTsKKwl9CisKKyNpZmRlZiBXQUlUXzRfQlVTWQorCXsKKwkJaW50IGk7CisJCWZvcihpPTA7aTwxMDI0O2krKykKKwkJeworCQkJaWYocC0+cmZkX3RvcC0+c3RhdHVzKQorCQkJCWJyZWFrOworCQkJREVMQVlfMTYoKTsKKwkJCWlmKGkgPT0gMTAyMykKKwkJCQlwcmludGsoIiVzOiBSVSBoYXNuJ3QgZmV0Y2hlZCBuZXh0IFJGRCAobm90IGJ1c3kvY29tcGxldGUpXG4iLGRldi0+bmFtZSk7CisJCX0KKwl9CisjZW5kaWYKKworI2lmIDAKKwlpZighYXRfbGVhc3Rfb25lKQorCXsKKwkJaW50IGk7CisJCXZvbGF0aWxlIHN0cnVjdCByZmRfc3RydWN0ICpyZmRzPXAtPnJmZF90b3A7CisJCXZvbGF0aWxlIHN0cnVjdCByYmRfc3RydWN0ICpyYmRzOworCQlwcmludGsoIiVzOiByZWNlaXZlZCBhIEZDIGludHIuIHdpdGhvdXQgaGF2aW5nIGEgZnJhbWU6ICUwNHggJWRcbiIsZGV2LT5uYW1lLHN0YXR1cyxvbGRfYXRfbGVhc3QpOworCQlmb3IoaT0wO2k8IChwLT5udW1fcmVjdl9idWZmcys0KTtpKyspCisJCXsKKwkJCXJiZHMgPSAoc3RydWN0IHJiZF9zdHJ1Y3QgKikgbWFrZTMyKHJmZHMtPnJiZF9vZmZzZXQpOworCQkJcHJpbnRrKCIlMDR4OiUwNHggIixyZmRzLT5zdGF0dXMscmJkcy0+c3RhdHVzKTsKKwkJCXJmZHMgPSAoc3RydWN0IHJmZF9zdHJ1Y3QgKikgbWFrZTMyKHJmZHMtPm5leHQpOworCQl9CisJCXByaW50aygiXG5lcnJzOiAlMDR4ICUwNHggc3RhdDogJTA0eFxuIiwoaW50KXAtPnNjYi0+cnNjX2VycnMsKGludClwLT5zY2ItPm92cm5fZXJycywoaW50KXAtPnNjYi0+c3RhdHVzKTsKKwkJcHJpbnRrKCJcbmVycnM6ICUwNHggJTA0eCBydXM6ICUwMngsIGN1czogJTAyeFxuIiwoaW50KXAtPnNjYi0+cnNjX2VycnMsKGludClwLT5zY2ItPm92cm5fZXJycywoaW50KXAtPnNjYi0+cnVzLChpbnQpcC0+c2NiLT5jdXMpOworCX0KKwlvbGRfYXRfbGVhc3QgPSBhdF9sZWFzdF9vbmU7CisjZW5kaWYKKworCWlmKGRlYnVnbGV2ZWwgPiAwKQorCQlwcmludGsoInIiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGhhbmRsZSAnUmVjZWl2ZXIgd2VudCBub3QgcmVhZHknLgorICovCisKK3N0YXRpYyB2b2lkIG5pNTJfcm5yX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCisJV0FJVF80X1NDQl9DTUQoKTsJCS8qIHdhaXQgZm9yIHRoZSBsYXN0IGNtZCwgV0FJVF80X0ZVTExTVEFUPz8gKi8KKwlwLT5zY2ItPmNtZF9ydWMgPSBSVUNfQUJPUlQ7IC8qIHVzdWFsbHkgdGhlIFJVIGlzIGluIHRoZSAnbm8gcmVzb3VyY2UnLXN0YXRlIC4uIGFib3J0IGl0IG5vdy4gKi8KKwluaV9hdHRuNTg2KCk7CisJV0FJVF80X1NDQl9DTURfUlVDKCk7CQkvKiB3YWl0IGZvciBhY2NlcHQgY21kLiAqLworCisJYWxsb2NfcmZhKGRldiwoY2hhciAqKXAtPnJmZF9maXJzdCk7CisvKiBtYXliZSBhZGQgYSBjaGVjayBoZXJlLCBiZWZvcmUgcmVzdGFydGluZyB0aGUgUlUgKi8KKwlzdGFydHJlY3Y1ODYoZGV2KTsgLyogcmVzdGFydCBSVSAqLworCisJcHJpbnRrKCIlczogUmVjZWl2ZS1Vbml0IHJlc3RhcnRlZC4gU3RhdHVzOiAlMDR4XG4iLGRldi0+bmFtZSxwLT5zY2ItPnJ1cyk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGhhbmRsZSB4bWl0IC0gaW50ZXJydXB0CisgKi8KKworc3RhdGljIHZvaWQgbmk1Ml94bXRfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwlpZihkZWJ1Z2xldmVsID4gMCkKKwkJcHJpbnRrKCJYIik7CisKKwlzdGF0dXMgPSBwLT54bWl0X2NtZHNbcC0+eG1pdF9sYXN0XS0+Y21kX3N0YXR1czsKKwlpZighKHN0YXR1cyAmIFNUQVRfQ09NUEwpKQorCQlwcmludGsoIiVzOiBzdHJhbmdlIC4uIHhtaXQtaW50IHdpdGhvdXQgYSAnQ09NUExFVEUnXG4iLGRldi0+bmFtZSk7CisKKwlpZihzdGF0dXMgJiBTVEFUX09LKQorCXsKKwkJcC0+c3RhdHMudHhfcGFja2V0cysrOworCQlwLT5zdGF0cy5jb2xsaXNpb25zICs9IChzdGF0dXMgJiBUQ01EX01BWENPTExNQVNLKTsKKwl9CisJZWxzZQorCXsKKwkJcC0+c3RhdHMudHhfZXJyb3JzKys7CisJCWlmKHN0YXR1cyAmIFRDTURfTEFURUNPTEwpIHsKKwkJCXByaW50aygiJXM6IGxhdGUgY29sbGlzaW9uIGRldGVjdGVkLlxuIixkZXYtPm5hbWUpOworCQkJcC0+c3RhdHMuY29sbGlzaW9ucysrOworCQl9CisJCWVsc2UgaWYoc3RhdHVzICYgVENNRF9OT0NBUlJJRVIpIHsKKwkJCXAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlwcmludGsoIiVzOiBubyBjYXJyaWVyIGRldGVjdGVkLlxuIixkZXYtPm5hbWUpOworCQl9CisJCWVsc2UgaWYoc3RhdHVzICYgVENNRF9MT1NUQ1RTKQorCQkJcHJpbnRrKCIlczogbG9zcyBvZiBDVFMgZGV0ZWN0ZWQuXG4iLGRldi0+bmFtZSk7CisJCWVsc2UgaWYoc3RhdHVzICYgVENNRF9VTkRFUlJVTikgeworCQkJcC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCXByaW50aygiJXM6IERNQSB1bmRlcnJ1biBkZXRlY3RlZC5cbiIsZGV2LT5uYW1lKTsKKwkJfQorCQllbHNlIGlmKHN0YXR1cyAmIFRDTURfTUFYQ09MTCkgeworCQkJcHJpbnRrKCIlczogTWF4LiBjb2xsaXNpb25zIGV4Y2VlZGVkLlxuIixkZXYtPm5hbWUpOworCQkJcC0+c3RhdHMuY29sbGlzaW9ucyArPSAxNjsKKwkJfQorCX0KKworI2lmIChOVU1fWE1JVF9CVUZGUyA+IDEpCisJaWYoICgrK3AtPnhtaXRfbGFzdCkgPT0gTlVNX1hNSVRfQlVGRlMpCisJCXAtPnhtaXRfbGFzdCA9IDA7CisjZW5kaWYKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKHJlKXN0YXJ0IHRoZSByZWNlaXZlcgorICovCisKK3N0YXRpYyB2b2lkIHN0YXJ0cmVjdjU4NihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCVdBSVRfNF9TQ0JfQ01EKCk7CisJV0FJVF80X1NDQl9DTURfUlVDKCk7CisJcC0+c2NiLT5yZmFfb2Zmc2V0ID0gbWFrZTE2KHAtPnJmZF9maXJzdCk7CisJcC0+c2NiLT5jbWRfcnVjID0gUlVDX1NUQVJUOworCW5pX2F0dG41ODYoKTsJCS8qIHN0YXJ0IGNtZC4gKi8KKwlXQUlUXzRfU0NCX0NNRF9SVUMoKTsJLyogd2FpdCBmb3IgYWNjZXB0IGNtZC4gKG5vIHRpbWVvdXQhISkgKi8KK30KKworc3RhdGljIHZvaWQgbmk1Ml90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworI2lmbmRlZiBOT19OT1BDT01NQU5EUworCWlmKHAtPnNjYi0+Y3VzICYgQ1VfQUNUSVZFKSAvKiBDT01NQU5ELVVOSVQgYWN0aXZlPyAqLworCXsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworI2lmZGVmIERFQlVHCisJCXByaW50aygiJXM6IHN0cmFuZ2UgLi4uIHRpbWVvdXQgd2l0aCBDVSBhY3RpdmU/IT9cbiIsZGV2LT5uYW1lKTsKKwkJcHJpbnRrKCIlczogWDA6ICUwNHggTjA6ICUwNHggTjE6ICUwNHggJWRcbiIsZGV2LT5uYW1lLChpbnQpcC0+eG1pdF9jbWRzWzBdLT5jbWRfc3RhdHVzLChpbnQpcC0+bm9wX2NtZHNbMF0tPmNtZF9zdGF0dXMsKGludClwLT5ub3BfY21kc1sxXS0+Y21kX3N0YXR1cywoaW50KXAtPm5vcF9wb2ludCk7CisjZW5kaWYKKwkJcC0+c2NiLT5jbWRfY3VjID0gQ1VDX0FCT1JUOworCQluaV9hdHRuNTg2KCk7CisJCVdBSVRfNF9TQ0JfQ01EKCk7CisJCXAtPnNjYi0+Y2JsX29mZnNldCA9IG1ha2UxNihwLT5ub3BfY21kc1twLT5ub3BfcG9pbnRdKTsKKwkJcC0+c2NiLT5jbWRfY3VjID0gQ1VDX1NUQVJUOworCQluaV9hdHRuNTg2KCk7CisJCVdBSVRfNF9TQ0JfQ01EKCk7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwl7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCIlczogeG1pdHRlciB0aW1lZCBvdXQsIHRyeSB0byByZXN0YXJ0ISBzdGF0OiAlMDJ4XG4iLGRldi0+bmFtZSxwLT5zY2ItPmN1cyk7CisJCXByaW50aygiJXM6IGNvbW1hbmQtc3RhdHM6ICUwNHggJTA0eFxuIixkZXYtPm5hbWUscC0+eG1pdF9jbWRzWzBdLT5jbWRfc3RhdHVzLHAtPnhtaXRfY21kc1sxXS0+Y21kX3N0YXR1cyk7CisJCXByaW50aygiJXM6IGNoZWNrLCB3aGV0aGVyIHlvdSBzZXQgdGhlIHJpZ2h0IGludGVycnVwdCBudW1iZXIhXG4iLGRldi0+bmFtZSk7CisjZW5kaWYKKwkJbmk1Ml9jbG9zZShkZXYpOworCQluaTUyX29wZW4oZGV2KTsKKwl9CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHNlbmQgZnJhbWUKKyAqLworCitzdGF0aWMgaW50IG5pNTJfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgbGVuLGk7CisjaWZuZGVmIE5PX05PUENPTU1BTkRTCisJaW50IG5leHRfbm9wOworI2VuZGlmCisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJaWYoc2tiLT5sZW4gPiBYTUlUX0JVRkZfU0laRSkKKwl7CisJCXByaW50aygiJXM6IFNvcnJ5LCBtYXguIGZyYW1lbGVuZ3RoIGlzICVkIGJ5dGVzLiBUaGUgbGVuZ3RoIG9mIHlvdXIgZnJhbWUgaXMgJWQgYnl0ZXMuXG4iLGRldi0+bmFtZSxYTUlUX0JVRkZfU0laRSxza2ItPmxlbik7CisJCXJldHVybiAwOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworI2lmKE5VTV9YTUlUX0JVRkZTID4gMSkKKwlpZih0ZXN0X2FuZF9zZXRfYml0KDAsKHZvaWQgKikgJnAtPmxvY2spKSB7CisJCXByaW50aygiJXM6IFF1ZXVlIHdhcyBsb2NrZWRcbiIsZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCWVsc2UKKyNlbmRpZgorCXsKKwkJbWVtY3B5KChjaGFyICopcC0+eG1pdF9jYnVmZnNbcC0+eG1pdF9jb3VudF0sKGNoYXIgKikoc2tiLT5kYXRhKSxza2ItPmxlbik7CisJCWxlbiA9IHNrYi0+bGVuOworCQlpZiAobGVuIDwgRVRIX1pMRU4pIHsKKwkJCWxlbiA9IEVUSF9aTEVOOworCQkJbWVtc2V0KChjaGFyICopcC0+eG1pdF9jYnVmZnNbcC0+eG1pdF9jb3VudF0rc2tiLT5sZW4sIDAsIGxlbiAtIHNrYi0+bGVuKTsKKwkJfQorCisjaWYgKE5VTV9YTUlUX0JVRkZTID09IDEpCisjCWlmZGVmIE5PX05PUENPTU1BTkRTCisKKyNpZmRlZiBERUJVRworCQlpZihwLT5zY2ItPmN1cyAmIENVX0FDVElWRSkKKwkJeworCQkJcHJpbnRrKCIlczogSG1tbSAuLiBDVSBpcyBzdGlsbCBydW5uaW5nIGFuZCB3ZSB3YW5uYSBzZW5kIGEgbmV3IHBhY2tldC5cbiIsZGV2LT5uYW1lKTsKKwkJCXByaW50aygiJXM6IHN0YXQ6ICUwNHggJTA0eFxuIixkZXYtPm5hbWUscC0+c2NiLT5jdXMscC0+eG1pdF9jbWRzWzBdLT5jbWRfc3RhdHVzKTsKKwkJfQorI2VuZGlmCisKKwkJcC0+eG1pdF9idWZmc1swXS0+c2l6ZSA9IFRCRF9MQVNUIHwgbGVuOworCQlmb3IoaT0wO2k8MTY7aSsrKQorCQl7CisJCQlwLT54bWl0X2NtZHNbMF0tPmNtZF9zdGF0dXMgPSAwOworCQkJV0FJVF80X1NDQl9DTUQoKTsKKwkJCWlmKCAocC0+c2NiLT5jdXMgJiBDVV9TVEFUVVMpID09IENVX1NVU1BFTkQpCisJCQkJcC0+c2NiLT5jbWRfY3VjID0gQ1VDX1JFU1VNRTsKKwkJCWVsc2UKKwkJCXsKKwkJCQlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYocC0+eG1pdF9jbWRzWzBdKTsKKwkJCQlwLT5zY2ItPmNtZF9jdWMgPSBDVUNfU1RBUlQ7CisJCQl9CisKKwkJCW5pX2F0dG41ODYoKTsKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJaWYoIWkpCisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJV0FJVF80X1NDQl9DTUQoKTsKKwkJCWlmKCAocC0+c2NiLT5jdXMgJiBDVV9BQ1RJVkUpKSAvKiB0ZXN0IGl0LCBiZWNhdXNlIENVIHNvbWV0aW1lcyBkb2Vzbid0IHN0YXJ0IGltbWVkaWF0ZWx5ICovCisJCQkJYnJlYWs7CisJCQlpZihwLT54bWl0X2NtZHNbMF0tPmNtZF9zdGF0dXMpCisJCQkJYnJlYWs7CisJCQlpZihpPT0xNSkKKwkJCQlwcmludGsoIiVzOiBDYW4ndCBzdGFydCB0cmFuc21pdC1jb21tYW5kLlxuIixkZXYtPm5hbWUpOworCQl9CisjCWVsc2UKKwkJbmV4dF9ub3AgPSAocC0+bm9wX3BvaW50ICsgMSkgJiAweDE7CisJCXAtPnhtaXRfYnVmZnNbMF0tPnNpemUgPSBUQkRfTEFTVCB8IGxlbjsKKworCQlwLT54bWl0X2NtZHNbMF0tPmNtZF9saW5rCSA9IHAtPm5vcF9jbWRzW25leHRfbm9wXS0+Y21kX2xpbmsKKwkJCQkJCQkJCQkJCQkJCQk9IG1ha2UxNigocC0+bm9wX2NtZHNbbmV4dF9ub3BdKSk7CisJCXAtPnhtaXRfY21kc1swXS0+Y21kX3N0YXR1cyA9IHAtPm5vcF9jbWRzW25leHRfbm9wXS0+Y21kX3N0YXR1cyA9IDA7CisKKwkJcC0+bm9wX2NtZHNbcC0+bm9wX3BvaW50XS0+Y21kX2xpbmsgPSBtYWtlMTYoKHAtPnhtaXRfY21kc1swXSkpOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJcC0+bm9wX3BvaW50ID0gbmV4dF9ub3A7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKyMJZW5kaWYKKyNlbHNlCisJCXAtPnhtaXRfYnVmZnNbcC0+eG1pdF9jb3VudF0tPnNpemUgPSBUQkRfTEFTVCB8IGxlbjsKKwkJaWYoIChuZXh0X25vcCA9IHAtPnhtaXRfY291bnQgKyAxKSA9PSBOVU1fWE1JVF9CVUZGUyApCisJCQluZXh0X25vcCA9IDA7CisKKwkJcC0+eG1pdF9jbWRzW3AtPnhtaXRfY291bnRdLT5jbWRfc3RhdHVzCT0gMDsKKwkJLyogbGlua3BvaW50ZXIgb2YgeG1pdC1jb21tYW5kIGFscmVhZHkgcG9pbnRzIHRvIG5leHQgbm9wIGNtZCAqLworCQlwLT5ub3BfY21kc1tuZXh0X25vcF0tPmNtZF9saW5rID0gbWFrZTE2KChwLT5ub3BfY21kc1tuZXh0X25vcF0pKTsKKwkJcC0+bm9wX2NtZHNbbmV4dF9ub3BdLT5jbWRfc3RhdHVzID0gMDsKKworCQlwLT5ub3BfY21kc1twLT54bWl0X2NvdW50XS0+Y21kX2xpbmsgPSBtYWtlMTYoKHAtPnhtaXRfY21kc1twLT54bWl0X2NvdW50XSkpOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJcC0+eG1pdF9jb3VudCA9IG5leHRfbm9wOworCisJCXsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJCWNsaSgpOworCQkJaWYocC0+eG1pdF9jb3VudCAhPSBwLT54bWl0X2xhc3QpCisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJcC0+bG9jayA9IDA7CisJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJfQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisjZW5kaWYKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb21lb25lIHdhbm5hIGhhdmUgdGhlIHN0YXRpc3RpY3MKKyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5pNTJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIHNob3J0IGNyYyxhbG4scnNjLG92cm47CisKKwljcmMgPSBwLT5zY2ItPmNyY19lcnJzOyAvKiBnZXQgZXJyb3Itc3RhdGlzdGljIGZyb20gdGhlIG5pODI1ODYgKi8KKwlwLT5zY2ItPmNyY19lcnJzID0gMDsKKwlhbG4gPSBwLT5zY2ItPmFsbl9lcnJzOworCXAtPnNjYi0+YWxuX2VycnMgPSAwOworCXJzYyA9IHAtPnNjYi0+cnNjX2VycnM7CisJcC0+c2NiLT5yc2NfZXJycyA9IDA7CisJb3ZybiA9IHAtPnNjYi0+b3Zybl9lcnJzOworCXAtPnNjYi0+b3Zybl9lcnJzID0gMDsKKworCXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gY3JjOworCXAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzICs9IG92cm47CisJcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGFsbjsKKwlwLT5zdGF0cy5yeF9kcm9wcGVkICs9IHJzYzsKKworCXJldHVybiAmcC0+c3RhdHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0IE1DIGxpc3QgLi4KKyAqLworCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbmlfZGlzaW50KCk7CisJYWxsb2M1ODYoZGV2KTsKKwlpbml0NTg2KGRldik7CisJc3RhcnRyZWN2NTg2KGRldik7CisJbmlfZW5haW50KCk7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9uaTUyOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1lbXN0YXJ0LCBsb25nLCAwKTsKK21vZHVsZV9wYXJhbShtZW1lbmQsIGxvbmcsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIk5JNTIxMCBJL08gYmFzZSBhZGRyZXNzLHJlcXVpcmVkIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIk5JNTIxMCBJUlEgbnVtYmVyLHJlcXVpcmVkIik7CitNT0RVTEVfUEFSTV9ERVNDKG1lbXN0YXJ0LCAiTkk1MjEwIG1lbW9yeSBiYXNlIGFkZHJlc3MscmVxdWlyZWQiKTsKK01PRFVMRV9QQVJNX0RFU0MobWVtZW5kLCAiTkk1MjEwIG1lbW9yeSBlbmQgYWRkcmVzcyxyZXF1aXJlZCIpOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpZihpbyA8PSAweDAgfHwgIW1lbWVuZCB8fCAhbWVtc3RhcnQgfHwgaXJxIDwgMikgeworCQlwcmludGsoIm5pNTI6IEF1dG9wcm9iaW5nIG5vdCBhbGxvd2VkIGZvciBtb2R1bGVzLlxubmk1MjogU2V0IHN5bWJvbHMgJ2lvJyAnaXJxJyAnbWVtc3RhcnQnIGFuZCAnbWVtZW5kJ1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkZXZfbmk1MiA9IG5pNTJfcHJvYmUoLTEpOworCWlmIChJU19FUlIoZGV2X25pNTIpKQorCQlyZXR1cm4gUFRSX0VSUihkZXZfbmk1Mik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfbmk1Mik7CisJcmVsZWFzZV9yZWdpb24oZGV2X25pNTItPmJhc2VfYWRkciwgTkk1Ml9UT1RBTF9TSVpFKTsKKwlmcmVlX25ldGRldihkZXZfbmk1Mik7Cit9CisjZW5kaWYgLyogTU9EVUxFICovCisKKyNpZiAwCisvKgorICogRFVNUCAuLiB3ZSBleHBlY3QgYSBub3QgcnVubmluZyBDTUQgdW5pdCBhbmQgZW5vdWdoIHNwYWNlCisgKi8KK3ZvaWQgbmk1Ml9kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdm9pZCAqcHRyKQoreworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgZHVtcF9jbWRfc3RydWN0ICpkdW1wX2NtZCA9IChzdHJ1Y3QgZHVtcF9jbWRfc3RydWN0ICopIHB0cjsKKwlpbnQgaTsKKworCXAtPnNjYi0+Y21kX2N1YyA9IENVQ19BQk9SVDsKKwluaV9hdHRuNTg2KCk7CisJV0FJVF80X1NDQl9DTUQoKTsKKwlXQUlUXzRfU0NCX0NNRF9SVUMoKTsKKworCWR1bXBfY21kLT5jbWRfc3RhdHVzID0gMDsKKwlkdW1wX2NtZC0+Y21kX2NtZCA9IENNRF9EVU1QIHwgQ01EX0xBU1Q7CisJZHVtcF9jbWQtPmR1bXBfb2Zmc2V0ID0gbWFrZTE2KChkdW1wX2NtZCArIDEpKTsKKwlkdW1wX2NtZC0+Y21kX2xpbmsgPSAweGZmZmY7CisKKwlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYoZHVtcF9jbWQpOworCXAtPnNjYi0+Y21kX2N1YyA9IENVQ19TVEFSVDsKKwluaV9hdHRuNTg2KCk7CisJV0FJVF80X1NUQVRfQ09NUEwoZHVtcF9jbWQpOworCisJaWYoIChkdW1wX2NtZC0+Y21kX3N0YXR1cyAmIChTVEFUX0NPTVBMfFNUQVRfT0spKSAhPSAoU1RBVF9DT01QTHxTVEFUX09LKSApCisJCQkJcHJpbnRrKCIlczogQ2FuJ3QgZ2V0IGR1bXAgaW5mb3JtYXRpb24uXG4iLGRldi0+bmFtZSk7CisKKwlmb3IoaT0wO2k8MTcwO2krKykgeworCQlwcmludGsoIiUwMnggIiwoaW50KSAoKHVuc2lnbmVkIGNoYXIgKikgKGR1bXBfY21kICsgMSkpW2ldKTsKKwkJaWYoaSAlIDI0ID09IDIzKQorCQkJcHJpbnRrKCJcbiIpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIEVORDogbGludXgvZHJpdmVycy9uZXQvbmk1Mi5jCisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25pNTIuaCBiL2RyaXZlcnMvbmV0L25pNTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGYxOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmk1Mi5oCkBAIC0wLDAgKzEsMzEwIEBACisvKgorICogSW50ZWwgaTgyNTg2IEV0aGVybmV0IGRlZmluaXRpb25zCisgKgorICogVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0sIGFuZCBpcyBjb3ZlcmVkIGJ5IHRoZQorICogc2FtZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGF0IGNvdmVycyB0aGF0IHdvcmsuCisgKgorICogY29weXJpZ2h0cyAoYykgMTk5NCBieSBNaWNoYWVsIEhpcHAgKGhpcHBtQGluZm9ybWF0aWsudW5pLXR1ZWJpbmdlbi5kZSkKKyAqCisgKiBJIGhhdmUgZG9uZSBhIGxvb2sgaW4gdGhlIGZvbGxvd2luZyBzb3VyY2VzOgorICogICBjcnlud3ItcGFja2V0LWRyaXZlciBieSBSdXNzIE5lbHNvbgorICogICBHYXJyZXQgQS4gV29sbG1hbidzIGk4MjU4Ni1kcml2ZXIgZm9yIEJTRAorICovCisKKyAKKyNkZWZpbmUgTkk1Ml9SRVNFVCAgICAgMCAgLyogd3JpdGluZyB0byB0aGlzIGFkZHJlc3MsIHJlc2V0cyB0aGUgaTgyNTg2ICovCisjZGVmaW5lIE5JNTJfQVRURU5USU9OIDEgIC8qIGNoYW5uZWwgYXR0ZW50aW9uLCBraWNrIHRoZSA1ODYgKi8KKyNkZWZpbmUgTkk1Ml9URU5BICAgICAgMyAgLyogMi01IHBvc3NpYmx5IHdyb25nLCBYbWl0IGVuYWJsZSAqLworI2RlZmluZSBOSTUyX1RESVMgICAgICAyICAvKiBYbWl0IGRpc2FibGUgKi8KKyNkZWZpbmUgTkk1Ml9JTlRFTkEgICAgNSAgLyogSW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBOSTUyX0lOVERJUyAgICA0ICAvKiBJbnRlcnJ1cHQgZGlzYWJsZSAqLworI2RlZmluZSBOSTUyX01BR0lDMSAgICA2ICAvKiBkdW5ubyBleGFjdCBmdW5jdGlvbiAqLworI2RlZmluZSBOSTUyX01BR0lDMiAgICA3ICAvKiBkdW5ubyBleGFjdCBmdW5jdGlvbiAqLworCisjZGVmaW5lIE5JNTJfTUFHSUNWQUwxIDB4MDAgIC8qIG1hZ2ljLXZhbHVlcyBmb3Igbmk1MjEwIGNhcmQgKi8KKyNkZWZpbmUgTkk1Ml9NQUdJQ1ZBTDIgMHg1NQorCisvKgorICogd2hlcmUgdG8gZmluZCB0aGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAoU0NQKQorICovCisjZGVmaW5lIFNDUF9ERUZBVUxUX0FERFJFU1MgMHhmZmZmZjQKKworCisvKgorICogU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciBTdHJ1Y3QKKyAqLworCitzdHJ1Y3Qgc2NwX3N0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCB6ZXJvX2R1bTA7CS8qIGhhcyB0byBiZSB6ZXJvICovCisgIHVuc2lnbmVkIGNoYXIgIHN5c2J1czsJLyogMD0xNkJpdCwxPThCaXQgKi8KKyAgdW5zaWduZWQgY2hhciAgemVyb19kdW0xOwkvKiBoYXMgdG8gYmUgemVybyBmb3IgNTg2ICovCisgIHVuc2lnbmVkIHNob3J0IHplcm9fZHVtMjsKKyAgdW5zaWduZWQgc2hvcnQgemVyb19kdW0zOworICBjaGFyICAgICAgICAgICppc2NwOwkJLyogcG9pbnRlciB0byB0aGUgaXNjcC1ibG9jayAqLworfTsKKworCisvKgorICogSW50ZXJtZWRpYXRlIFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIgKElTQ1ApCisgKi8KK3N0cnVjdCBpc2NwX3N0cnVjdAoreworICB1bnNpZ25lZCBjaGFyICBidXN5OyAgICAgICAgICAvKiA1ODYgY2xlYXJzIGFmdGVyIHN1Y2Nlc3NmdWwgaW5pdCAqLworICB1bnNpZ25lZCBjaGFyICB6ZXJvX2R1bW15OyAgICAvKiBoYXMgdG8gYmUgemVybyAqLworICB1bnNpZ25lZCBzaG9ydCBzY2Jfb2Zmc2V0OyAgICAvKiBwb2ludGVyb2Zmc2V0IHRvIHRoZSBzY2JfYmFzZSAqLworICBjaGFyICAgICAgICAgICpzY2JfYmFzZTsgICAgICAvKiBiYXNlLWFkZHJlc3Mgb2YgYWxsIDE2LWJpdCBvZmZzZXRzICovCit9OworCisvKgorICogU3lzdGVtIENvbnRyb2wgQmxvY2sgKFNDQikKKyAqLworc3RydWN0IHNjYl9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciBydXM7CisgIHVuc2lnbmVkIGNoYXIgY3VzOworICB1bnNpZ25lZCBjaGFyIGNtZF9ydWM7ICAgICAgICAgICAvKiBjb21tYW5kIHdvcmQ6IFJVIHBhcnQgKi8KKyAgdW5zaWduZWQgY2hhciBjbWRfY3VjOyAgICAgICAgICAgLyogY29tbWFuZCB3b3JkOiBDVSBwYXJ0ICYgQUNLICovCisgIHVuc2lnbmVkIHNob3J0IGNibF9vZmZzZXQ7ICAgIC8qIHBvaW50ZXJvZmZzZXQsIGNvbW1hbmQgYmxvY2sgbGlzdCAqLworICB1bnNpZ25lZCBzaG9ydCByZmFfb2Zmc2V0OyAgICAvKiBwb2ludGVyb2Zmc2V0LCByZWNlaXZlIGZyYW1lIGFyZWEgKi8KKyAgdW5zaWduZWQgc2hvcnQgY3JjX2VycnM7ICAgICAgLyogQ1JDLUVycm9yIGNvdW50ZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgYWxuX2VycnM7ICAgICAgLyogYWxpZ25tZW50ZXJyb3IgY291bnRlciAqLworICB1bnNpZ25lZCBzaG9ydCByc2NfZXJyczsgICAgICAvKiBSZXNvdXJjZWVycm9yIGNvdW50ZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgb3Zybl9lcnJzOyAgICAgLyogT1ZlcnJ1bmVycm9yIGNvdW50ZXIgKi8KK307CisKKy8qCisgKiBwb3NzaWJsZSBjb21tYW5kIHZhbHVlcyBmb3IgdGhlIGNvbW1hbmQgd29yZAorICovCisjZGVmaW5lIFJVQ19NQVNLCTB4MDA3MAkvKiBtYXNrIGZvciBSVSBjb21tYW5kcyAqLworI2RlZmluZSBSVUNfTk9QCQkweDAwMDAJLyogTk9QLWNvbW1hbmQgKi8KKyNkZWZpbmUgUlVDX1NUQVJUCTB4MDAxMAkvKiBzdGFydCBSVSAqLworI2RlZmluZSBSVUNfUkVTVU1FCTB4MDAyMAkvKiByZXN1bWUgUlUgYWZ0ZXIgc3VzcGVuZCAqLworI2RlZmluZSBSVUNfU1VTUEVORAkweDAwMzAJLyogc3VzcGVuZCBSVSAqLworI2RlZmluZSBSVUNfQUJPUlQJMHgwMDQwCS8qIGFib3J0IHJlY2VpdmVyIG9wZXJhdGlvbiBpbW1lZGlhdGVseSAqLworCisjZGVmaW5lIENVQ19NQVNLICAgICAgICAweDA3ICAvKiBtYXNrIGZvciBDVSBjb21tYW5kICovCisjZGVmaW5lIENVQ19OT1AgICAgICAgICAweDAwICAvKiBOT1AtY29tbWFuZCAqLworI2RlZmluZSBDVUNfU1RBUlQgICAgICAgMHgwMSAgLyogc3RhcnQgZXhlY3V0aW9uIG9mIDEuIGNtZCBvbiB0aGUgQ0JMICovCisjZGVmaW5lIENVQ19SRVNVTUUgICAgICAweDAyICAvKiByZXN1bWUgYWZ0ZXIgc3VzcGVuZCAqLworI2RlZmluZSBDVUNfU1VTUEVORCAgICAgMHgwMyAgLyogU3VzcGVuZCBDVSAqLworI2RlZmluZSBDVUNfQUJPUlQgICAgICAgMHgwNCAgLyogYWJvcnQgY29tbWFuZCBvcGVyYXRpb24gaW1tZWRpYXRlbHkgKi8KKworI2RlZmluZSBBQ0tfTUFTSyAgICAgICAgMHhmMCAgLyogbWFzayBmb3IgQUNLIGNvbW1hbmQgKi8KKyNkZWZpbmUgQUNLX0NYICAgICAgICAgIDB4ODAgIC8qIGFja25vd2xlZGdlcyBTVEFUX0NYICovCisjZGVmaW5lIEFDS19GUiAgICAgICAgICAweDQwICAvKiBhY2suIFNUQVRfRlIgKi8KKyNkZWZpbmUgQUNLX0NOQSAgICAgICAgIDB4MjAgIC8qIGFjay4gU1RBVF9DTkEgKi8KKyNkZWZpbmUgQUNLX1JOUiAgICAgICAgIDB4MTAgIC8qIGFjay4gU1RBVF9STlIgKi8KKworLyoKKyAqIHBvc3NpYmxlIHN0YXR1cyB2YWx1ZXMgZm9yIHRoZSBzdGF0dXMgd29yZAorICovCisjZGVmaW5lIFNUQVRfTUFTSyAgICAgICAweGYwICAvKiBtYXNrIGZvciBjYXVzZSBvZiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU1RBVF9DWCAgICAgICAgIDB4ODAgIC8qIENVIGZpbmlzaGVkIGNtZCB3aXRoIGl0cyBJIGJpdCBzZXQgKi8KKyNkZWZpbmUgU1RBVF9GUiAgICAgICAgIDB4NDAgIC8qIFJVIGZpbmlzaGVkIHJlY2VpdmluZyBhIGZyYW1lICovCisjZGVmaW5lIFNUQVRfQ05BICAgICAgICAweDIwICAvKiBDVSBsZWZ0IGFjdGl2ZSBzdGF0ZSAqLworI2RlZmluZSBTVEFUX1JOUiAgICAgICAgMHgxMCAgLyogUlUgbGVmdCByZWFkeSBzdGF0ZSAqLworCisjZGVmaW5lIENVX1NUQVRVUyAgICAgICAweDcgICAvKiBDVSBzdGF0dXMsIDA9aWRsZSAqLworI2RlZmluZSBDVV9TVVNQRU5EICAgICAgMHgxICAgLyogQ1UgaXMgc3VzcGVuZGVkICovCisjZGVmaW5lIENVX0FDVElWRSAgICAgICAweDIgICAvKiBDVSBpcyBhY3RpdmUgKi8KKworI2RlZmluZSBSVV9TVEFUVVMJMHg3MAkvKiBSVSBzdGF0dXMsIDA9aWRsZSAqLworI2RlZmluZSBSVV9TVVNQRU5ECTB4MTAJLyogUlUgc3VzcGVuZGVkICovCisjZGVmaW5lIFJVX05PU1BBQ0UJMHgyMAkvKiBSVSBubyByZXNvdXJjZXMgKi8KKyNkZWZpbmUgUlVfUkVBRFkJMHg0MAkvKiBSVSBpcyByZWFkeSAqLworCisvKgorICogUmVjZWl2ZSBGcmFtZSBEZXNjcmlwdG9yIChSRkQpCisgKi8KK3N0cnVjdCByZmRfc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIgIHN0YXRfbG93OwkvKiBzdGF0dXMgd29yZCAqLworICB1bnNpZ25lZCBjaGFyICBzdGF0X2hpZ2g7CS8qIHN0YXR1cyB3b3JkICovCisgIHVuc2lnbmVkIGNoYXIgIHJmZF9zZjsJLyogODI1OTYgbW9kZSBvbmx5ICovCisgIHVuc2lnbmVkIGNoYXIgIGxhc3Q7CQkvKiBCaXQxNSxMYXN0IEZyYW1lIG9uIExpc3QgLyBCaXQxNCxzdXNwZW5kICovCisgIHVuc2lnbmVkIHNob3J0IG5leHQ7CQkvKiBsaW5rb2Zmc2V0IHRvIG5leHQgUkZEICovCisgIHVuc2lnbmVkIHNob3J0IHJiZF9vZmZzZXQ7CS8qIHBvaW50ZXJvZmZzZXQgdG8gUkJELWJ1ZmZlciAqLworICB1bnNpZ25lZCBjaGFyICBkZXN0WzZdOwkvKiBldGhlcm5ldC1hZGRyZXNzLCBkZXN0aW5hdGlvbiAqLworICB1bnNpZ25lZCBjaGFyICBzb3VyY2VbNl07CS8qIGV0aGVybmV0LWFkZHJlc3MsIHNvdXJjZSAqLworICB1bnNpZ25lZCBzaG9ydCBsZW5ndGg7CS8qIDgwMi4zIGZyYW1lLWxlbmd0aCAqLworICB1bnNpZ25lZCBzaG9ydCB6ZXJvX2R1bW15OwkvKiBkdW1teSAqLworfTsKKworI2RlZmluZSBSRkRfTEFTVCAgICAgMHg4MAkvKiBsYXN0OiBsYXN0IHJmZCBpbiB0aGUgbGlzdCAqLworI2RlZmluZSBSRkRfU1VTUCAgICAgMHg0MAkvKiBsYXN0OiBzdXNwZW5kIFJVIGFmdGVyICAqLworI2RlZmluZSBSRkRfQ09NUEwgICAgMHg4MAorI2RlZmluZSBSRkRfT0sgICAgICAgMHgyMAorI2RlZmluZSBSRkRfQlVTWSAgICAgMHg0MAorI2RlZmluZSBSRkRfRVJSX0xFTiAgMHgxMCAgICAgLyogTGVuZ3RoIGVycm9yIChpZiBlbmFibGVkIGxlbmd0aC1jaGVja2luZyAqLworI2RlZmluZSBSRkRfRVJSX0NSQyAgMHgwOCAgICAgLyogQ1JDIGVycm9yICovCisjZGVmaW5lIFJGRF9FUlJfQUxHTiAweDA0ICAgICAvKiBBbGlnbm1lbnQgZXJyb3IgKi8KKyNkZWZpbmUgUkZEX0VSUl9STlIgIDB4MDIgICAgIC8qIHN0YXR1czogcmVjZWl2ZXIgb3V0IG9mIHJlc291cmNlcyAqLworI2RlZmluZSBSRkRfRVJSX09WUiAgMHgwMSAgICAgLyogRE1BIE92ZXJydW4hICovCisKKyNkZWZpbmUgUkZEX0VSUl9GVFMgIDB4MDA4MAkvKiBGcmFtZSB0byBzaG9ydCAqLworI2RlZmluZSBSRkRfRVJSX05FT1AgMHgwMDQwCS8qIE5vIEVPUCBmbGFnIChmb3IgYml0c3R1ZmZpbmcgb25seSkgKi8KKyNkZWZpbmUgUkZEX0VSUl9UUlVOIDB4MDAyMAkvKiAoODI1OTYgb25seS9TRiBtb2RlKSBpbmRpY2F0ZXMgdHJ1bmNhdGVkIGZyYW1lICovCisjZGVmaW5lIFJGRF9NQVRDSEFERCAweDAwMDIgICAgIC8qIHN0YXR1czogRGVzdGluYXRpb25hZGRyZXNzICFtYXRjaGVzIElBIChvbmx5IDgyNTk2KSAqLworI2RlZmluZSBSRkRfQ09MTERFVCAgMHgwMDAxCS8qIERldGVjdGVkIGNvbGxpc2lvbiBkdXJpbmcgcmVjZXB0aW9uICovCisKKy8qCisgKiBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIChSQkQpCisgKi8KK3N0cnVjdCByYmRfc3RydWN0IAoreworICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CS8qIHN0YXR1cyB3b3JkLG51bWJlciBvZiB1c2VkIGJ5dGVzIGluIGJ1ZmYgKi8KKyAgdW5zaWduZWQgc2hvcnQgbmV4dDsJCS8qIHBvaW50ZXJvZmZzZXQgdG8gbmV4dCBSQkQgKi8KKyAgY2hhciAgICAgICAgICAqYnVmZmVyOwkvKiByZWNlaXZlIGJ1ZmZlciBhZGRyZXNzIHBvaW50ZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgc2l6ZTsJCS8qIHNpemUgb2YgdGhpcyBidWZmZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgemVyb19kdW1teTsgICAgLyogZHVtbXkgKi8KK307CisKKyNkZWZpbmUgUkJEX0xBU1QJMHg4MDAwCS8qIGxhc3QgYnVmZmVyICovCisjZGVmaW5lIFJCRF9VU0VECTB4NDAwMAkvKiB0aGlzIGJ1ZmZlciBoYXMgZGF0YSAqLworI2RlZmluZSBSQkRfTUFTSwkweDNmZmYJLyogc2l6ZS1tYXNrIGZvciBsZW5ndGggKi8KKworLyoKKyAqIFN0YXR1c3ZhbHVlcyBmb3IgQ29tbWFuZHMvUkZECisgKi8KKyNkZWZpbmUgU1RBVF9DT01QTCAgIDB4ODAwMAkvKiBzdGF0dXM6IGZyYW1lL2NvbW1hbmQgaXMgY29tcGxldGUgKi8KKyNkZWZpbmUgU1RBVF9CVVNZICAgIDB4NDAwMAkvKiBzdGF0dXM6IGZyYW1lL2NvbW1hbmQgaXMgYnVzeSAqLworI2RlZmluZSBTVEFUX09LICAgICAgMHgyMDAwCS8qIHN0YXR1czogZnJhbWUvY29tbWFuZCBpcyBvayAqLworCisvKgorICogQWN0aW9uLUNvbW1hbmRzCisgKi8KKyNkZWZpbmUgQ01EX05PUAkJMHgwMDAwCS8qIE5PUCAqLworI2RlZmluZSBDTURfSUFTRVRVUAkweDAwMDEJLyogaW5pdGlhbCBhZGRyZXNzIHNldHVwIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX0NPTkZJR1VSRQkweDAwMDIJLyogY29uZmlndXJlIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX01DU0VUVVAJMHgwMDAzCS8qIE1DIHNldHVwIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX1hNSVQJMHgwMDA0CS8qIHRyYW5zbWl0IGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX1REUgkJMHgwMDA1CS8qIHRpbWUgZG9tYWluIHJlZmxlY3RvbWV0ZXIgKFREUikgY29tbWFuZCAqLworI2RlZmluZSBDTURfRFVNUAkweDAwMDYJLyogZHVtcCBjb21tYW5kICovCisjZGVmaW5lIENNRF9ESUFHTk9TRQkweDAwMDcJLyogZGlhZ25vc2UgY29tbWFuZCAqLworCisvKgorICogQWN0aW9uIGNvbW1hbmQgYml0cworICovCisjZGVmaW5lIENNRF9MQVNUCTB4ODAwMAkvKiBpbmRpY2F0ZXMgbGFzdCBjb21tYW5kIGluIHRoZSBDQkwgKi8KKyNkZWZpbmUgQ01EX1NVU1BFTkQJMHg0MDAwCS8qIHN1c3BlbmQgQ1UgYWZ0ZXIgdGhpcyBDQiAqLworI2RlZmluZSBDTURfSU5UCQkweDIwMDAJLyogZ2VuZXJhdGUgaW50ZXJydXB0IGFmdGVyIGV4ZWN1dGlvbiAqLworCisvKgorICogTk9QIC0gY29tbWFuZAorICovCitzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgY21kX3N0YXR1czsJLyogc3RhdHVzIG9mIHRoaXMgY29tbWFuZCAqLworICB1bnNpZ25lZCBzaG9ydCBjbWRfY21kOyAgICAgICAvKiB0aGUgY29tbWFuZCBpdHNlbGYgKCtiaXRzKSAqLworICB1bnNpZ25lZCBzaG9ydCBjbWRfbGluazsgICAgICAvKiBvZmZzZXRwb2ludGVyIHRvIG5leHQgY29tbWFuZCAqLworfTsKKworLyoKKyAqIElBIFNldHVwIGNvbW1hbmQKKyAqLworc3RydWN0IGlhc2V0dXBfY21kX3N0cnVjdCAKK3sKKyAgdW5zaWduZWQgc2hvcnQgY21kX3N0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2NtZDsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2xpbms7CisgIHVuc2lnbmVkIGNoYXIgIGlhZGRyWzZdOworfTsKKworLyoKKyAqIENvbmZpZ3VyZSBjb21tYW5kIAorICovCitzdHJ1Y3QgY29uZmlndXJlX2NtZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgY21kX3N0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2NtZDsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2xpbms7CisgIHVuc2lnbmVkIGNoYXIgIGJ5dGVfY250OyAgIC8qIHNpemUgb2YgdGhlIGNvbmZpZy1jbWQgKi8KKyAgdW5zaWduZWQgY2hhciAgZmlmbzsgICAgICAgLyogZmlmby9yZWN2IG1vbml0b3IgKi8KKyAgdW5zaWduZWQgY2hhciAgc2F2X2JmOyAgICAgLyogc2F2ZSBiYWQgZnJhbWVzIChiaXQ3PTEpKi8KKyAgdW5zaWduZWQgY2hhciAgYWRyX2xlbjsgICAgLyogYWRyX2xlbigwLTIpLGFsX2xvYygzKSxwcmVhbSg0LTUpLGxvb3BiYWsoNi03KSovCisgIHVuc2lnbmVkIGNoYXIgIHByaW9yaXR5OyAgIC8qIGxpbl9wcmlvKDAtMiksZXhwX3ByaW8oNC02KSxib2ZfbWV0ZCg3KSAqLworICB1bnNpZ25lZCBjaGFyICBpZnM7ICAgICAgICAvKiBpbnRlciBmcmFtZSBzcGFjaW5nICovCisgIHVuc2lnbmVkIGNoYXIgIHRpbWVfbG93OyAgIC8qIHNsb3QgdGltZSBsb3cgKi8KKyAgdW5zaWduZWQgY2hhciAgdGltZV9oaWdoOyAgLyogc2xvdCB0aW1lIGhpZ2goMC0yKSBhbmQgbWF4LiByZXRyaWVzKDQtNykgKi8KKyAgdW5zaWduZWQgY2hhciAgcHJvbWlzYzsgICAgLyogcHJvbWlzYy1tb2RlKDApICwgZXQgYWwgKDEtNykgKi8KKyAgdW5zaWduZWQgY2hhciAgY2Fycl9jb2xsOyAgLyogY2FycmllcigwLTMpL2NvbGxpc2lvbig0LTcpIHN0dWZmICovCisgIHVuc2lnbmVkIGNoYXIgIGZyYW1fbGVuOyAgIC8qIG1pbmltYWwgZnJhbWUgbGVuICovCisgIHVuc2lnbmVkIGNoYXIgIGR1bW15OwkgICAgIC8qIGR1bW15ICovCit9OworCisvKgorICogTXVsdGljYXN0IFNldHVwIGNvbW1hbmQgCisgKi8KK3N0cnVjdCBtY3NldHVwX2NtZF9zdHJ1Y3QgCit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9jbWQ7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9saW5rOworICB1bnNpZ25lZCBzaG9ydCBtY19jbnQ7CQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIE1DLUxpc3QgKi8KKyAgdW5zaWduZWQgY2hhciAgbWNfbGlzdFswXVs2XTsgIAkvKiBwb2ludGVyIHRvIDYgYnl0ZXMgZW50cmllcyAqLworfTsKKworLyoKKyAqIERVTVAgY29tbWFuZAorICovCitzdHJ1Y3QgZHVtcF9jbWRfc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9jbWQ7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9saW5rOworICB1bnNpZ25lZCBzaG9ydCBkdW1wX29mZnNldDsgICAgLyogcG9pbnRlcm9mZnNldCB0byBEVU1QIHNwYWNlICovCit9OworCisvKgorICogdHJhbnNtaXQgY29tbWFuZCAKKyAqLworc3RydWN0IHRyYW5zbWl0X2NtZF9zdHJ1Y3QgCit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9jbWQ7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9saW5rOworICB1bnNpZ25lZCBzaG9ydCB0YmRfb2Zmc2V0OwkvKiBwb2ludGVyb2Zmc2V0IHRvIFRCRCAqLworICB1bnNpZ25lZCBjaGFyICBkZXN0WzZdOyAgICAgICAvKiBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIHRoZSBmcmFtZSAqLworICB1bnNpZ25lZCBzaG9ydCBsZW5ndGg7CS8qIHVzZXIgZGVmaW5lZDogODAyLjMgbGVuZ3RoIC8gRXRoZXIgdHlwZSAqLworfTsKKworI2RlZmluZSBUQ01EX0VSUk1BU0sgICAgIDB4MGZhMAorI2RlZmluZSBUQ01EX01BWENPTExNQVNLIDB4MDAwZgorI2RlZmluZSBUQ01EX01BWENPTEwgICAgIDB4MDAyMAorI2RlZmluZSBUQ01EX0hFQVJUQkVBVCAgIDB4MDA0MAorI2RlZmluZSBUQ01EX0RFRkVSUkVEICAgIDB4MDA4MAorI2RlZmluZSBUQ01EX1VOREVSUlVOICAgIDB4MDEwMAorI2RlZmluZSBUQ01EX0xPU1RDVFMgICAgIDB4MDIwMAorI2RlZmluZSBUQ01EX05PQ0FSUklFUiAgIDB4MDQwMAorI2RlZmluZSBUQ01EX0xBVEVDT0xMICAgIDB4MDgwMAorCitzdHJ1Y3QgdGRyX2NtZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgY21kX3N0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2NtZDsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2xpbms7CisgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKK307CisKKyNkZWZpbmUgVERSX0xOS19PSwkweDgwMDAJLyogTm8gbGluayBwcm9ibGVtIGlkZW50aWZpZWQgKi8KKyNkZWZpbmUgVERSX1hDVlJfUFJCCTB4NDAwMAkvKiBpbmRpY2F0ZXMgYSB0cmFuc2NlaXZlciBwcm9ibGVtICovCisjZGVmaW5lIFREUl9FVF9PUE4JMHgyMDAwCS8qIG9wZW4sIG5vIGNvcnJlY3QgdGVybWluYXRpb24gKi8KKyNkZWZpbmUgVERSX0VUX1NSVAkweDEwMDAJLyogVERSIGRldGVjdGVkIGEgc2hvcnQgY2lyY3VpdCAqLworI2RlZmluZSBURFJfVElNRU1BU0sJMHgwN2ZmCS8qIG1hc2sgZm9yIHRoZSB0aW1lIGZpZWxkICovCisKKy8qCisgKiBUcmFuc21pdCBCdWZmZXIgRGVzY3JpcHRvciAoVEJEKQorICovCitzdHJ1Y3QgdGJkX3N0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCBzaXplOwkJLyogc2l6ZSArIEVPRi1GbGFnKDE1KSAqLworICB1bnNpZ25lZCBzaG9ydCBuZXh0OyAgICAgICAgICAvKiBwb2ludGVyb2Zmc2V0IHRvIG5leHQgVEJEICovCisgIGNoYXIgICAgICAgICAgKmJ1ZmZlcjsgICAgICAgIC8qIHBvaW50ZXIgdG8gYnVmZmVyICovCit9OworCisjZGVmaW5lIFRCRF9MQVNUIDB4ODAwMCAgICAgICAgIC8qIEVPRi1GbGFnLCBpbmRpY2F0ZXMgbGFzdCBidWZmZXIgaW4gbGlzdCAqLworCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uaTY1LmMgYi9kcml2ZXJzL25ldC9uaTY1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1ZDFkZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25pNjUuYwpAQCAtMCwwICsxLDEyNzcgQEAKKy8qCisgKiBuaTY1MTAgKGFtNzk5MCAnbGFuY2UnIGNoaXApIGRyaXZlciBmb3IgTGludXgtbmV0LTMKKyAqIEJFVEFjb2RlIHYwLjcxICg5Ni8wOS8yOSkgZm9yIDIuMC4wIChvciBsYXRlcikKKyAqIGNvcHlyaWdodHMgKGMpIDE5OTQsMTk5NSwxOTk2IGJ5IE0uSGlwcAorICoKKyAqIFRoaXMgZHJpdmVyIGNhbiBoYW5kbGUgdGhlIG9sZCBuaTY1MTAgYm9hcmQgYW5kIHRoZSBuZXdlciBuaTY1MTAKKyAqIEV0aGVyQmxhc3Rlci4gKHByb2JhYmx5IGl0IGFsc28gd29ya3Mgd2l0aCBldmVyeSBmdWxsIE5FMjEwMAorICogY29tcGF0aWJsZSBjYXJkKQorICoKKyAqIFRvIGNvbXBpbGUgYXMgbW9kdWxlLCB0eXBlOgorICogICAgIGdjYyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLW00ODYgLURfX0tFUk5FTF9fIC1ETU9EVUxFIC1jIG5pNjUuYworICogZHJpdmVyIHByb2JlczogaW86IDB4MzYwLDB4MzAwLDB4MzIwLDB4MzQwIC8gZG1hOiAzLDUsNiw3CisgKgorICogVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0sIGFuZCBpcyBjb3ZlcmVkIGJ5IHRoZQorICogc2FtZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGF0IGNvdmVycyB0aGUgTGludXgta2VybmVsLgorICoKKyAqIGNvbW1lbnRzL2J1Z3Mvc3VnZ2VzdGlvbnMgY2FuIGJlIHNlbnQgdG86CisgKiAgIE1pY2hhZWwgSGlwcAorICogICBlbWFpbDogaGlwcG1AaW5mb3JtYXRpay51bmktdHVlYmluZ2VuLmRlCisgKgorICogc291cmNlczoKKyAqICAgc29tZSB0aGluZ3MgYXJlIGZyb20gdGhlICduaTY1MTAtcGFja2V0LWRyaXZlciBmb3IgZG9zIGJ5IFJ1c3MgTmVsc29uJworICogICBhbmQgZnJvbSB0aGUgb3JpZ2luYWwgZHJpdmVycyBieSBELkJlY2tlcgorICoKKyAqIGtub3duIHByb2JsZW1zOgorICogICAtIG9uIHNvbWUgUENJIGJvYXJkcyAoaW5jbHVkaW5nIG15IG93bikgdGhlIGNhcmQvYm9hcmQvSVNBLWJyaWRnZSBoYXMKKyAqICAgICBwcm9ibGVtcyB3aXRoIGJ1cyBtYXN0ZXIgRE1BLiBUaGlzIHJlc3VsdHMgaW4gbG90c2Egb3ZlcnJ1bnMuCisgKiAgICAgSXQgbWF5IGhlbHAgdG8gJyNkZWZpbmUgUkNWX1BBUkFOT0lBX0NIRUNLJyBvciB0cnkgdG8gI3VuZGVmCisgKiAgICAgdGhlIFhNVCBhbmQgUkNWX1ZJQV9TS0Igb3B0aW9uIC4uIHRoaXMgcmVkdWNlcyBkcml2ZXIgcGVyZm9ybWFuY2UuCisgKiAgICAgT3IganVzdCBwbGF5IHdpdGggeW91ciBCSU9TIG9wdGlvbnMgdG8gb3B0aW1pemUgSVNBLURNQSBhY2Nlc3MuCisgKiAgICAgTWF5YmUgeW91IGFsc28gd2FubmEgcGxheSB3aXRoIHRoZSBMT1dfUEVSRk9SQU1DRSBhbmQgTUlEX1BFUkZPUk1BTkNFCisgKiAgICAgZGVmaW5lcyAtPiBwbGVhc2UgcmVwb3J0IG1lIHlvdXIgZXhwZXJpZW5jZSB0aGVuCisgKiAgIC0gSGFyYWxkIHJlcG9ydGVkIGZvciBBU1VTIFNQM0cgbWFpbmJvYXJkcywgdGhhdCB5b3Ugc2hvdWxkIHVzZQorICogICAgIHRoZSAnb3B0aW1hbCBzZXR0aW5ncycgZnJvbSB0aGUgdXNlcidzIG1hbnVhbCBvbiBwYWdlIDMtMTIhCisgKgorICogY3JlZGl0czoKKyAqICAgdGhhbnggdG8gSmFzb24gU3VsbGl2YW4gZm9yIHNlbmRpbmcgbWUgYSBuaTY1MTAgY2FyZCEKKyAqICAgbG90IG9mIGRlYnVnIHJ1bnMgd2l0aCBBU1VTIFNQM0cgQm9hcmRzIChJbnRlbCBTYXR1cm4pIGJ5IEhhcmFsZCBLb2VuaWcKKyAqCisgKiBzaW1wbGUgcGVyZm9ybWFuY2UgdGVzdDogKDQ4NkRYLTMzL05pNjUxMC1FQiByZWNlaXZlcyBmcm9tIDQ4NkRYNC0xMDAvTmk2NTEwLUVCKQorICogICAgYXZlcmFnZTogRlRQIC0+IDgzODQ0MjEgYnl0ZXMgcmVjZWl2ZWQgaW4gOC41IHNlY29uZHMKKyAqICAgICAgICAgICAobm8gUkNWX1ZJQV9TS0Isbm8gWE1UX1ZJQV9TS0IsUEFSQU5PSUFfQ0hFQ0ssNCBYTUlUIEJVRlMsIDggUkNWX0JVRkZTKQorICogICAgcGVhazogRlRQIC0+IDgzODQ0MjEgYnl0ZXMgcmVjZWl2ZWQgaW4gNy41IHNlY29uZHMKKyAqICAgICAgICAgICAoUkNWX1ZJQV9TS0IsWE1UX1ZJQV9TS0Isbm8gUEFSQU5PSUFfQ0hFQ0ssMSghKSBYTUlUIEJVRiwgMTYgUkNWIEJVRkZTKQorICovCisKKy8qCisgKiA5OS5KdW4uODogYWRkZWQgc3VwcG9ydCBmb3IgL3Byb2MvbmV0L2RldiBieXRlIGNvdW50IGZvciB4b3N2aWV3IChISykKKyAqIDk2LlNlcHQuMjk6IHZpcnRfdG9fYnVzIHN0dWZmIGFkZGVkIGZvciBuZXcgbWVtb3J5IG1vZGVsbAorICogOTYuQXByaWwuMjk6IEFkZGVkIEhhcmFsZCBLb2VuaWcncyBQYXRjaGVzIChNSCkKKyAqIDk2LkFwcmlsLjEzOiBlbmhhbmNlZCBlcnJvciBoYW5kbGluZyAuLiBtb3JlIHRlc3RzIChNSCkKKyAqIDk2LkFwcmlsLjUvNjogYSBsb3Qgb2YgcGVyZm9ybWFuY2UgdGVzdHMuIEdvdCBpdCBzdGFibGUgbm93IChob3BlZnVsbHkpIChNSCkKKyAqIDk2LkFwcmlsLjE6IChubyBqb2tlIDspIC4uIGFkZGVkIEV0aGVyQmxhc3RlciBhbmQgTW9kdWxlIHN1cHBvcnQgKE1IKQorICogOTYuRmViLjE5OiBmaXhlZCBhIGZldyBidWdzIC4uIGNsZWFudXBzIC4uIHRlc3RlZCBmb3IgMS4zLjY2IChNSCkKKyAqICAgICAgICAgICAgaG9wZWZ1bGx5IG5vIG1vcmUgMTZNQiBsaW1pdAorICoKKyAqIDk1Lk5vdi4xODogbXVsdGljYXN0IHR3ZWFrZWQgKEFDKS4KKyAqCisgKiA5NC5BdWcuMjI6IGNoYW5nZXMgaW4geG1pdF9pbnRyIChhY2sgbW9yZSB0aGFuIG9uZSB4bWl0dGVkLXBhY2tldCksIG5pNjVfc2VuZF9wYWNrZXQgKHAtPmxvY2spIChNSCkKKyAqCisgKiA5NC5KdWx5LjE2OiBmaXhlZCBidWdzIGluIHJlY3Zfc2tiIGFuZCBza2ItYWxsb2Mgc3R1ZmYgIChNSCkKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgIm5pNjUuaCIKKworLyoKKyAqIHRoZSBjdXJyZW50IHNldHRpbmcgYWxsb3dzIGFuIGFjY2VwdGFibGUgcGVyZm9ybWFuY2UKKyAqIGZvciAnUkNWX1BBUkFOT0lBX0NIRUNLJyByZWFkIHRoZSAna25vd24gcHJvYmxlbXMnIHBhcnQgaW4KKyAqIHRoZSBoZWFkZXIgb2YgdGhpcyBmaWxlCisgKiAnaW52ZXJ0JyB0aGUgZGVmaW5lcyBmb3IgbWF4LiBwZXJmb3JtYW5jZS4gVGhpcyBtYXkgY2F1c2UgRE1BIHByb2JsZW1zCisgKiBvbiBzb21lIGJvYXJkcyAoZS5nIG9uIG15IEFTVVMgU1AzRykKKyAqLworI3VuZGVmIFhNVF9WSUFfU0tCCisjdW5kZWYgUkNWX1ZJQV9TS0IKKyNkZWZpbmUgUkNWX1BBUkFOT0lBX0NIRUNLCisKKyNkZWZpbmUgTUlEX1BFUkZPUk1BTkNFCisKKyNpZiAgIGRlZmluZWQoIExPV19QRVJGT1JNQU5DRSApCisgc3RhdGljIGludCBpc2EwPTcsaXNhMT03LGNzcjgwPTB4MGMxMDsKKyNlbGlmIGRlZmluZWQoIE1JRF9QRVJGT1JNQU5DRSApCisgc3RhdGljIGludCBpc2EwPTUsaXNhMT01LGNzcjgwPTB4MjgxMDsKKyNlbHNlCS8qIGhpZ2ggcGVyZm9ybWFuY2UgKi8KKyBzdGF0aWMgaW50IGlzYTA9NCxpc2ExPTQsY3NyODA9MHgwMDE3OworI2VuZGlmCisKKy8qCisgKiBhIGZldyBjYXJkL3ZlbmRvciBzcGVjaWZpYyBkZWZpbmVzCisgKi8KKyNkZWZpbmUgTkk2NV9JRDAgICAgMHgwMAorI2RlZmluZSBOSTY1X0lEMSAgICAweDU1CisjZGVmaW5lIE5JNjVfRUJfSUQwIDB4NTIKKyNkZWZpbmUgTkk2NV9FQl9JRDEgMHg0NAorI2RlZmluZSBORTIxMDBfSUQwICAweDU3CisjZGVmaW5lIE5FMjEwMF9JRDEgIDB4NTcKKworI2RlZmluZSBQT1JUIHAtPmNtZHJfYWRkcgorCisvKgorICogYnVmZmVyIGNvbmZpZ3VyYXRpb24KKyAqLworI2lmIDEKKyNkZWZpbmUgUk1ETlVNIDE2CisjZGVmaW5lIFJNRE5VTU1BU0sgMHg4MDAwMDAwMAorI2Vsc2UKKyNkZWZpbmUgUk1ETlVNIDgKKyNkZWZpbmUgUk1ETlVNTUFTSyAweDYwMDAwMDAwIC8qIGxvZzIoUk1ETlVNKTw8MjkgKi8KKyNlbmRpZgorCisjaWYgMAorI2RlZmluZSBUTUROVU0gMQorI2RlZmluZSBUTUROVU1NQVNLIDB4MDAwMDAwMDAKKyNlbHNlCisjZGVmaW5lIFRNRE5VTSA0CisjZGVmaW5lIFRNRE5VTU1BU0sgMHg0MDAwMDAwMCAvKiBsb2cyKFRNRE5VTSk8PDI5ICovCisjZW5kaWYKKworLyogc2xpZ2h0bHkgb3ZlcnNpemVkICovCisjZGVmaW5lIFJfQlVGX1NJWkUgMTU0NAorI2RlZmluZSBUX0JVRl9TSVpFIDE1NDQKKworLyoKKyAqIGxhbmNlIHJlZ2lzdGVyIGRlZmluZXMKKyAqLworI2RlZmluZSBMX0RBVEFSRUcgMHgwMAorI2RlZmluZSBMX0FERFJSRUcgMHgwMgorI2RlZmluZSBMX1JFU0VUICAgMHgwNAorI2RlZmluZSBMX0NPTkZJRyAgMHgwNQorI2RlZmluZSBMX0JVU0lGICAgMHgwNgorCisvKgorICogdG8gYWNjZXNzIHRoZSBsYW5jZS9hbTc5OTAtcmVncywgeW91IGhhdmUgdG8gd3JpdGUKKyAqIHJlZy1udW1iZXIgaW50byBMX0FERFJSRUcsIHRoZW4geW91IGNhbiBhY2Nlc3MgaXQgdXNpbmcgTF9EQVRBUkVHCisgKi8KKyNkZWZpbmUgQ1NSMCAgMHgwMAorI2RlZmluZSBDU1IxICAweDAxCisjZGVmaW5lIENTUjIgIDB4MDIKKyNkZWZpbmUgQ1NSMyAgMHgwMworCisjZGVmaW5lIElOSVRfUklOR19CRUZPUkVfU1RBUlQJMHgxCisjZGVmaW5lIEZVTExfUkVTRVRfT05fRVJST1IJMHgyCisKKyNpZiAwCisjZGVmaW5lIHdyaXRlcmVnKHZhbCxyZWcpIHtvdXR3KHJlZyxQT1JUK0xfQUREUlJFRyk7aW53KFBPUlQrTF9BRERSUkVHKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0dyh2YWwsUE9SVCtMX0RBVEFSRUcpO2ludyhQT1JUK0xfREFUQVJFRyk7fQorI2RlZmluZSByZWFkcmVnKHJlZykgKG91dHcocmVnLFBPUlQrTF9BRERSUkVHKSxpbncoUE9SVCtMX0FERFJSRUcpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgaW53KFBPUlQrTF9EQVRBUkVHKSkKKyNpZiAwCisjZGVmaW5lIHdyaXRlZGF0YXJlZyh2YWwpIHtvdXR3KHZhbCxQT1JUK0xfREFUQVJFRyk7aW53KFBPUlQrTF9EQVRBUkVHKTt9CisjZWxzZQorI2RlZmluZSB3cml0ZWRhdGFyZWcodmFsKSB7ICB3cml0ZXJlZyh2YWwsQ1NSMCk7IH0KKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgd3JpdGVyZWcodmFsLHJlZykge291dHcocmVnLFBPUlQrTF9BRERSUkVHKTtvdXR3KHZhbCxQT1JUK0xfREFUQVJFRyk7fQorI2RlZmluZSByZWFkcmVnKHJlZykgKG91dHcocmVnLFBPUlQrTF9BRERSUkVHKSxpbncoUE9SVCtMX0RBVEFSRUcpKQorI2RlZmluZSB3cml0ZWRhdGFyZWcodmFsKSB7IHdyaXRlcmVnKHZhbCxDU1IwKTsgfQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5pX3ZlbmRvcltdID0geyAweDAyLDB4MDcsMHgwMSB9OworCitzdGF0aWMgc3RydWN0IGNhcmQgeworCXVuc2lnbmVkIGNoYXIgaWQwLGlkMTsKKwlzaG9ydCBpZF9vZmZzZXQ7CisJc2hvcnQgdG90YWxfc2l6ZTsKKwlzaG9ydCBjbWRfb2Zmc2V0OworCXNob3J0IGFkZHJfb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgKnZlbmRvcl9pZDsKKwljaGFyICpjYXJkbmFtZTsKKwlsb25nIGNvbmZpZzsKK30gY2FyZHNbXSA9IHsKKwl7CisJCS5pZDAJICAgICA9IE5JNjVfSUQwLAorCQkuaWQxCSAgICAgPSBOSTY1X0lEMSwKKwkJLmlkX29mZnNldCAgID0gMHgwZSwKKwkJLnRvdGFsX3NpemUgID0gMHgxMCwKKwkJLmNtZF9vZmZzZXQgID0gMHgwLAorCQkuYWRkcl9vZmZzZXQgPSAweDgsCisJCS52ZW5kb3JfaWQgICA9IG5pX3ZlbmRvciwKKwkJLmNhcmRuYW1lICAgID0gIm5pNjUxMCIsCisJCS5jb25maWcJICAgICA9IDB4MSwKKyAgICAgICAJfSwKKwl7CisJCS5pZDAJICAgICA9IE5JNjVfRUJfSUQwLAorCQkuaWQxCSAgICAgPSBOSTY1X0VCX0lEMSwKKwkJLmlkX29mZnNldCAgID0gMHgwZSwKKwkJLnRvdGFsX3NpemUgID0gMHgxOCwKKwkJLmNtZF9vZmZzZXQgID0gMHgxMCwKKwkJLmFkZHJfb2Zmc2V0ID0gMHgwLAorCQkudmVuZG9yX2lkICAgPSBuaV92ZW5kb3IsCisJCS5jYXJkbmFtZSAgICA9ICJuaTY1MTAgRXRoZXJCbGFzdGVyIiwKKwkJLmNvbmZpZwkgICAgID0gMHgyLAorICAgICAgIAl9LAorCXsKKwkJLmlkMAkgICAgID0gTkUyMTAwX0lEMCwKKwkJLmlkMQkgICAgID0gTkUyMTAwX0lEMSwKKwkJLmlkX29mZnNldCAgID0gMHgwZSwKKwkJLnRvdGFsX3NpemUgID0gMHgxOCwKKwkJLmNtZF9vZmZzZXQgID0gMHgxMCwKKwkJLmFkZHJfb2Zmc2V0ID0gMHgwLAorCQkudmVuZG9yX2lkICAgPSBOVUxMLAorCQkuY2FyZG5hbWUgICAgPSAiZ2VuZXJpYyBORTIxMDAiLAorCQkuY29uZmlnCSAgICAgPSAweDAsCisJfSwKK307CisjZGVmaW5lIE5VTV9DQVJEUyAzCisKK3N0cnVjdCBwcml2Cit7CisJc3RydWN0IHJtZCBybWRoZWFkW1JNRE5VTV07CisJc3RydWN0IHRtZCB0bWRoZWFkW1RNRE5VTV07CisJc3RydWN0IGluaXRfYmxvY2sgaWI7CisJaW50IHJtZG51bTsKKwlpbnQgdG1kbnVtLHRtZGxhc3Q7CisjaWZkZWYgUkNWX1ZJQV9TS0IKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVjdl9za2JbUk1ETlVNXTsKKyNlbHNlCisJdm9pZCAqcmVjdmJvdW5jZVtSTUROVU1dOworI2VuZGlmCisjaWZkZWYgWE1UX1ZJQV9TS0IKKwlzdHJ1Y3Qgc2tfYnVmZiAqdG1kX3NrYltUTUROVU1dOworI2VuZGlmCisJdm9pZCAqdG1kYm91bmNlW1RNRE5VTV07CisJaW50IHRtZGJvdW5jZW51bTsKKwlpbnQgbG9jayx4bWl0X3F1ZXVlZDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl2b2lkICpzZWxmOworCWludCBjbWRyX2FkZHI7CisJaW50IGNhcmRubzsKKwlpbnQgZmVhdHVyZXM7CisJc3BpbmxvY2tfdCByaW5nX2xvY2s7Cit9OworCitzdGF0aWMgaW50ICBuaTY1X3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCk7CitzdGF0aWMgaXJxcmV0dXJuX3Qgbmk2NV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgbmk2NV9yZWN2X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQpOworc3RhdGljIHZvaWQgbmk2NV94bWl0X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQpOworc3RhdGljIGludCAgbmk2NV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgbmk2NV9sYW5jZV9yZWluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBuaTY1X2luaXRfbGFuY2Uoc3RydWN0IHByaXYgKnAsdW5zaWduZWQgY2hhciosaW50LGludCk7CitzdGF0aWMgaW50ICBuaTY1X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgIG5pNjVfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIG5pNjVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBuaTY1X2FsbG9jX2J1ZmZlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5pNjVfZnJlZV9idWZmZXIoc3RydWN0IHByaXYgKnApOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuaTY1X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGludCBpcnF0YWJbXSBfX2luaXRkYXRhID0geyA5LDEyLDE1LDUgfTsgLyogaXJxIGNvbmZpZy10cmFuc2xhdGUgKi8KK3N0YXRpYyBpbnQgZG1hdGFiW10gX19pbml0ZGF0YSA9IHsgMCwzLDUsNiw3IH07IC8qIGRtYSBjb25maWctdHJhbnNsYXRlIGFuZCBhdXRvZGV0ZWN0ICovCisKK3N0YXRpYyBpbnQgZGVidWdsZXZlbCA9IDE7CisKKy8qCisgKiBzZXQgJ3BlcmZvcm1hbmNlJyByZWdpc3RlcnMgLi4gd2UgbXVzdCBTVE9QIGxhbmNlIGZvciB0aGF0CisgKi8KK3N0YXRpYyB2b2lkIG5pNjVfc2V0X3BlcmZvcm1hbmNlKHN0cnVjdCBwcml2ICpwKQoreworCXdyaXRlcmVnKENTUjBfU1RPUCB8IENTUjBfQ0xSQUxMLENTUjApOyAvKiBTVE9QICovCisKKwlpZiggIShjYXJkc1twLT5jYXJkbm9dLmNvbmZpZyAmIDB4MDIpICkKKwkJcmV0dXJuOworCisJb3V0dyg4MCxQT1JUK0xfQUREUlJFRyk7CisJaWYoaW53KFBPUlQrTF9BRERSUkVHKSAhPSA4MCkKKwkJcmV0dXJuOworCisJd3JpdGVyZWcoIChjc3I4MCAmIDB4M2ZmZikgLDgwKTsgLyogRklGTyB3YXRlcm1hcmtzICovCisJb3V0dygwLFBPUlQrTF9BRERSUkVHKTsKKwlvdXR3KChzaG9ydClpc2EwLFBPUlQrTF9CVVNJRik7IC8qIHdyaXRlIElTQSAwOiBETUFfUiA6IGlzYTAgKiA1MG5zICovCisJb3V0dygxLFBPUlQrTF9BRERSUkVHKTsKKwlvdXR3KChzaG9ydClpc2ExLFBPUlQrTF9CVVNJRik7IC8qIHdyaXRlIElTQSAxOiBETUFfVyA6IGlzYTEgKiA1MG5zCSovCisKKwlvdXR3KENTUjAsUE9SVCtMX0FERFJSRUcpOwkvKiBzd2l0Y2ggYmFjayB0byBDU1IwICovCit9CisKKy8qCisgKiBvcGVuIGludGVyZmFjZSAodXApCisgKi8KK3N0YXRpYyBpbnQgbmk2NV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCWludCBpcnF2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJm5pNjVfaW50ZXJydXB0LDAsCisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkc1twLT5jYXJkbm9dLmNhcmRuYW1lLGRldik7CisJaWYgKGlycXZhbCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZCAoaXJxdmFsPSVkKS5cbiIsCisJCSAgICAgICAgICBkZXYtPm5hbWUsZGV2LT5pcnEsIGlycXZhbCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlmKG5pNjVfbGFuY2VfcmVpbml0KGRldikpCisJeworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorCXsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsZGV2KTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorfQorCisvKgorICogY2xvc2UgaW50ZXJmYWNlIChkb3duKQorICovCitzdGF0aWMgaW50IG5pNjVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJb3V0dyhpbncoUE9SVCtMX1JFU0VUKSxQT1JUK0xfUkVTRVQpOyAvKiB0aGF0J3MgdGhlIGhhcmQgd2F5ICovCisKKyNpZmRlZiBYTVRfVklBX1NLQgorCXsKKwkJaW50IGk7CisJCWZvcihpPTA7aTxUTUROVU07aSsrKQorCQl7CisJCQlpZihwLT50bWRfc2tiW2ldKSB7CisJCQkJZGV2X2tmcmVlX3NrYihwLT50bWRfc2tiW2ldKTsKKwkJCQlwLT50bWRfc2tiW2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCWZyZWVfaXJxKGRldi0+aXJxLGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKwlkaXNhYmxlX2RtYShkZXYtPmRtYSk7CisJZnJlZV9kbWEoZGV2LT5kbWEpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBjYXJkc1twLT5jYXJkbm9dLnRvdGFsX3NpemUpOworCW5pNjVfZnJlZV9idWZmZXIocCk7Cit9CisKKy8qIHNldDogaW8saXJxLGRtYSBvciBzZXQgaXQgd2hlbiBjYWxsaW5nIGluc21vZCAqLworc3RhdGljIGludCBpcnE7CitzdGF0aWMgaW50IGlvOworc3RhdGljIGludCBkbWE7CisKKy8qCisgKiBQcm9iZSBUaGUgQ2FyZCAobm90IHRoZSBsYW5jZS1jaGlwKQorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBuaTY1X3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldigwKTsKKwlzdGF0aWMgaW50IHBvcnRzW10gPSB7MHgzNjAsMHgzMDAsMHgzMjAsMHgzNDAsIDB9OworCWludCAqcG9ydDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQlpcnEgPSBkZXYtPmlycTsKKwkJZG1hID0gZGV2LT5kbWE7CisJfSBlbHNlIHsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpbzsKKwl9CisKKwlpZiAoZGV2LT5iYXNlX2FkZHIgPiAweDFmZikgeyAvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCWVyciA9IG5pNjVfcHJvYmUxKGRldiwgZGV2LT5iYXNlX2FkZHIpOworCX0gZWxzZSBpZiAoZGV2LT5iYXNlX2FkZHIgPiAwKSB7IC8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJZXJyID0gLUVOWElPOworCX0gZWxzZSB7CisJCWZvciAocG9ydCA9IHBvcnRzOyAqcG9ydCAmJiBuaTY1X3Byb2JlMShkZXYsICpwb3J0KTsgcG9ydCsrKQorCQkJOworCQlpZiAoISpwb3J0KQorCQkJZXJyID0gLUVOT0RFVjsKKwl9CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJY2xlYW51cF9jYXJkKGRldik7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCisvKgorICogdGhpcyBpcyB0aGUgcmVhbCBjYXJkIHByb2JlIC4uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG5pNjVfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IGlvYWRkcikKK3sKKwlpbnQgaSxqOworCXN0cnVjdCBwcml2ICpwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXYtPmlycSA9IGlycTsKKwlkZXYtPmRtYSA9IGRtYTsKKworCWZvcihpPTA7aTxOVU1fQ0FSRFM7aSsrKSB7CisJCWlmKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIGNhcmRzW2ldLnRvdGFsX3NpemUsIGNhcmRzW2ldLmNhcmRuYW1lKSkKKwkJCWNvbnRpbnVlOworCQlpZihjYXJkc1tpXS5pZF9vZmZzZXQgPj0gMCkgeworCQkJaWYoaW5iKGlvYWRkcitjYXJkc1tpXS5pZF9vZmZzZXQrMCkgIT0gY2FyZHNbaV0uaWQwIHx8CisJCQkJIGluYihpb2FkZHIrY2FyZHNbaV0uaWRfb2Zmc2V0KzEpICE9IGNhcmRzW2ldLmlkMSkgeworCQkJCSByZWxlYXNlX3JlZ2lvbihpb2FkZHIsIGNhcmRzW2ldLnRvdGFsX3NpemUpOworCQkJCSBjb250aW51ZTsKKwkJCX0KKwkJfQorCQlpZihjYXJkc1tpXS52ZW5kb3JfaWQpIHsKKwkJCWZvcihqPTA7ajwzO2orKykKKwkJCQlpZihpbmIoaW9hZGRyK2NhcmRzW2ldLmFkZHJfb2Zmc2V0K2opICE9IGNhcmRzW2ldLnZlbmRvcl9pZFtqXSkgeworCQkJCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIGNhcmRzW2ldLnRvdGFsX3NpemUpOworCQkJCQljb250aW51ZTsKKwkJCSAgfQorCQl9CisJCWJyZWFrOworCX0KKwlpZihpID09IE5VTV9DQVJEUykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlmb3Ioaj0wO2o8NjtqKyspCisJCWRldi0+ZGV2X2FkZHJbal0gPSBpbmIoaW9hZGRyK2NhcmRzW2ldLmFkZHJfb2Zmc2V0K2opOworCisJaWYoIChqPW5pNjVfYWxsb2NfYnVmZmVyKGRldikpIDwgMCkgeworCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIGNhcmRzW2ldLnRvdGFsX3NpemUpOworCQlyZXR1cm4gajsKKwl9CisJcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisJcC0+Y21kcl9hZGRyID0gaW9hZGRyICsgY2FyZHNbaV0uY21kX29mZnNldDsKKwlwLT5jYXJkbm8gPSBpOworCXNwaW5fbG9ja19pbml0KCZwLT5yaW5nX2xvY2spOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGZvdW5kIGF0ICUjM3gsICIsIGRldi0+bmFtZSwgY2FyZHNbcC0+Y2FyZG5vXS5jYXJkbmFtZSAsIGlvYWRkcik7CisKKwlvdXR3KGludyhQT1JUK0xfUkVTRVQpLFBPUlQrTF9SRVNFVCk7IC8qIGZpcnN0OiByZXNldCB0aGUgY2FyZCAqLworCWlmKCAoaj1yZWFkcmVnKENTUjApKSAhPSAweDQpIHsKKwkJIHByaW50aygiZmFpbGVkLlxuIik7CisJCSBwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBSRVNFVCBjYXJkOiAlMDR4XG4iLCBkZXYtPm5hbWUsIGopOworCQkgbmk2NV9mcmVlX2J1ZmZlcihwKTsKKwkJIHJlbGVhc2VfcmVnaW9uKGlvYWRkciwgY2FyZHNbcC0+Y2FyZG5vXS50b3RhbF9zaXplKTsKKwkJIHJldHVybiAtRUFHQUlOOworCX0KKworCW91dHcoODgsUE9SVCtMX0FERFJSRUcpOworCWlmKGludyhQT1JUK0xfQUREUlJFRykgPT0gODgpIHsKKwkJdW5zaWduZWQgbG9uZyB2OworCQl2ID0gaW53KFBPUlQrTF9EQVRBUkVHKTsKKwkJdiA8PD0gMTY7CisJCW91dHcoODksUE9SVCtMX0FERFJSRUcpOworCQl2IHw9IGludyhQT1JUK0xfREFUQVJFRyk7CisJCXByaW50aygiVmVyc2lvbiAlIzA4bHgsICIsdik7CisJCXAtPmZlYXR1cmVzID0gSU5JVF9SSU5HX0JFRk9SRV9TVEFSVDsKKwl9CisJZWxzZSB7CisJCXByaW50aygiYW5jaWVudCBMQU5DRSwgIik7CisJCXAtPmZlYXR1cmVzID0gMHgwOworCX0KKworCWlmKHRlc3RfYml0KDAsJmNhcmRzW2ldLmNvbmZpZykpIHsKKwkJZGV2LT5pcnEgPSBpcnF0YWJbKGludyhpb2FkZHIrTF9DT05GSUcpPj4yKSYzXTsKKwkJZGV2LT5kbWEgPSBkbWF0YWJbaW53KGlvYWRkcitMX0NPTkZJRykmM107CisJCXByaW50aygiSVJRICVkIChmcm9tIGNhcmQpLCBETUEgJWQgKGZyb20gY2FyZCkuXG4iLGRldi0+aXJxLGRldi0+ZG1hKTsKKwl9CisJZWxzZSB7CisJCWlmKGRldi0+ZG1hID09IDApIHsKKwkJLyogJ3N0dWNrIHRlc3QnIGZyb20gbGFuY2UuYyAqLworCQkJbG9uZyBkbWFfY2hhbm5lbHMgPSAoKGluYihETUExX1NUQVRfUkVHKSA+PiA0KSAmIDB4MGYpIHwKKwkJCQkJICAgIChpbmIoRE1BMl9TVEFUX1JFRykgJiAweGYwKTsKKwkJCWZvcihpPTE7aTw1O2krKykgeworCQkJCWludCBkbWEgPSBkbWF0YWJbaV07CisJCQkJaWYodGVzdF9iaXQoZG1hLCZkbWFfY2hhbm5lbHMpIHx8IHJlcXVlc3RfZG1hKGRtYSwibmk2NTEwIikpCisJCQkJCWNvbnRpbnVlOworCQkJCQkKKwkJCQlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCQkJCWRpc2FibGVfZG1hKGRtYSk7CisJCQkJc2V0X2RtYV9tb2RlKGRtYSxETUFfTU9ERV9DQVNDQURFKTsKKwkJCQllbmFibGVfZG1hKGRtYSk7CisJCQkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCQkJCisJCQkJbmk2NV9pbml0X2xhbmNlKHAsZGV2LT5kZXZfYWRkciwwLDApOyAvKiB0cmlnZ2VyIG1lbW9yeSBhY2Nlc3MgKi8KKwkJCQkKKwkJCQlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCQkJCWRpc2FibGVfZG1hKGRtYSk7CisJCQkJZnJlZV9kbWEoZG1hKTsKKwkJCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkJCQkKKwkJCQlpZihyZWFkcmVnKENTUjApICYgQ1NSMF9JRE9OKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmKGkgPT0gNSkgeworCQkJCXByaW50aygiZmFpbGVkLlxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgZGV0ZWN0IERNQSBjaGFubmVsIVxuIiwgZGV2LT5uYW1lKTsKKwkJCQluaTY1X2ZyZWVfYnVmZmVyKHApOworCQkJCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgY2FyZHNbcC0+Y2FyZG5vXS50b3RhbF9zaXplKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KKwkJCWRldi0+ZG1hID0gZG1hdGFiW2ldOworCQkJcHJpbnRrKCJETUEgJWQgKGF1dG9kZXRlY3RlZCksICIsZGV2LT5kbWEpOworCQl9CisJCWVsc2UKKwkJCXByaW50aygiRE1BICVkIChhc3NpZ25lZCksICIsZGV2LT5kbWEpOworCisJCWlmKGRldi0+aXJxIDwgMikKKwkJeworCQkJdW5zaWduZWQgbG9uZyBpcnFfbWFzazsKKworCQkJbmk2NV9pbml0X2xhbmNlKHAsZGV2LT5kZXZfYWRkciwwLDApOworCQkJaXJxX21hc2sgPSBwcm9iZV9pcnFfb24oKTsKKwkJCXdyaXRlcmVnKENTUjBfSU5JVHxDU1IwX0lORUEsQ1NSMCk7IC8qIHRyaWdnZXIgaW50ZXJydXB0ICovCisJCQltc2xlZXAoMjApOworCQkJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmKGlycV9tYXNrKTsKKwkJCWlmKCFkZXYtPmlycSkKKwkJCXsKKwkJCQlwcmludGsoIkZhaWxlZCB0byBkZXRlY3QgSVJRIGxpbmUhXG4iKTsKKwkJCQluaTY1X2ZyZWVfYnVmZmVyKHApOworCQkJCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgY2FyZHNbcC0+Y2FyZG5vXS50b3RhbF9zaXplKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KKwkJCXByaW50aygiSVJRICVkIChhdXRvZGV0ZWN0ZWQpLlxuIixkZXYtPmlycSk7CisJCX0KKwkJZWxzZQorCQkJcHJpbnRrKCJJUlEgJWQgKGFzc2lnbmVkKS5cbiIsZGV2LT5pcnEpOworCX0KKworCWlmKHJlcXVlc3RfZG1hKGRldi0+ZG1hLCBjYXJkc1twLT5jYXJkbm9dLmNhcmRuYW1lICkgIT0gMCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IHJlcXVlc3QgZG1hLWNoYW5uZWwgJWRcbiIsZGV2LT5uYW1lLChpbnQpIGRldi0+ZG1hKTsKKwkJbmk2NV9mcmVlX2J1ZmZlcihwKTsKKwkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBjYXJkc1twLT5jYXJkbm9dLnRvdGFsX3NpemUpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJZGV2LT5vcGVuCQk9IG5pNjVfb3BlbjsKKwlkZXYtPnN0b3AJCT0gbmk2NV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IG5pNjVfc2VuZF9wYWNrZXQ7CisJZGV2LT50eF90aW1lb3V0CQk9IG5pNjVfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gSFovMjsKKwlkZXYtPmdldF9zdGF0cwkJPSBuaTY1X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9tdWx0aWNhc3RfbGlzdDsKKwlyZXR1cm4gMDsgLyogZXZlcnl0aGluZyBpcyBPSyAqLworfQorCisvKgorICogc2V0IGxhbmNlIHJlZ2lzdGVyIGFuZCB0cmlnZ2VyIGluaXQKKyAqLworc3RhdGljIHZvaWQgbmk2NV9pbml0X2xhbmNlKHN0cnVjdCBwcml2ICpwLHVuc2lnbmVkIGNoYXIgKmRhZGRyLGludCBmaWx0ZXIsaW50IG1vZGUpCit7CisJaW50IGk7CisJdTMyIHBpYjsKKworCXdyaXRlcmVnKENTUjBfQ0xSQUxMfENTUjBfU1RPUCxDU1IwKTsKKworCWZvcihpPTA7aTw2O2krKykKKwkJcC0+aWIuZWFkZHJbaV0gPSBkYWRkcltpXTsKKworCWZvcihpPTA7aTw4O2krKykKKwkJcC0+aWIuZmlsdGVyW2ldID0gZmlsdGVyOworCXAtPmliLm1vZGUgPSBtb2RlOworCisJcC0+aWIudHJwID0gKHUzMikgaXNhX3ZpcnRfdG9fYnVzKHAtPnRtZGhlYWQpIHwgVE1ETlVNTUFTSzsKKwlwLT5pYi5ycnAgPSAodTMyKSBpc2FfdmlydF90b19idXMocC0+cm1kaGVhZCkgfCBSTUROVU1NQVNLOworCXdyaXRlcmVnKDAsQ1NSMyk7CS8qIGJ1c21hc3Rlci9ubyB3b3JkLXN3YXAgKi8KKwlwaWIgPSAodTMyKSBpc2FfdmlydF90b19idXMoJnAtPmliKTsKKwl3cml0ZXJlZyhwaWIgJiAweGZmZmYsQ1NSMSk7CisJd3JpdGVyZWcocGliID4+IDE2LENTUjIpOworCisJd3JpdGVyZWcoQ1NSMF9JTklULENTUjApOyAvKiB0aGlzIGNoYW5nZXMgTF9BRERSUkVHIHRvIENTUjAgKi8KKworCWZvcihpPTA7aTwzMjtpKyspCisJeworCQltZGVsYXkoNCk7CisJCWlmKGludyhQT1JUK0xfREFUQVJFRykgJiAoQ1NSMF9JRE9OIHwgQ1NSMF9NRVJSKSApCisJCQlicmVhazsgLyogaW5pdCBvayA/ICovCisJfQorfQorCisvKgorICogYWxsb2NhdGUgbWVtb3J5IGFyZWEgYW5kIGNoZWNrIHRoZSAxNk1CIGJvcmRlcgorICovCitzdGF0aWMgdm9pZCAqbmk2NV9hbGxvY19tZW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldixjaGFyICp3aGF0LGludCBzaXplLGludCB0eXBlKQoreworCXN0cnVjdCBza19idWZmICpza2I9TlVMTDsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisJdm9pZCAqcmV0OworCisJaWYodHlwZSkgeworCQlyZXQgPSBza2IgPSBhbGxvY19za2IoMisxNitzaXplLEdGUF9LRVJORUx8R0ZQX0RNQSk7CisJCWlmKCFza2IpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgJXMgbWVtb3J5LlxuIixkZXYtPm5hbWUsd2hhdCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlza2ItPmRldiA9IGRldjsKKwkJc2tiX3Jlc2VydmUoc2tiLDIrMTYpOworCQlza2JfcHV0KHNrYixSX0JVRl9TSVpFKTsJIC8qIGdyYWIgdGhlIHdob2xlIHNwYWNlIC4uIChub3QgbmVjZXNzYXJ5KSAqLworCQlwdHIgPSBza2ItPmRhdGE7CisJfQorCWVsc2UgeworCQlyZXQgPSBwdHIgPSBrbWFsbG9jKFRfQlVGX1NJWkUsR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCQlpZighcmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIGFsbG9jYXRlICVzIG1lbW9yeS5cbiIsZGV2LT5uYW1lLHdoYXQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJaWYoICh1MzIpIHZpcnRfdG9fcGh5cyhwdHIrc2l6ZSkgPiAweDEwMDAwMDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSAlcyBtZW1vcnkgaW4gbG93ZXIgMTZNQiFcbiIsZGV2LT5uYW1lLHdoYXQpOworCQlpZih0eXBlKQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCWVsc2UKKwkJCWtmcmVlKHB0cik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogYWxsb2NhdGUgYWxsIG1lbW9yeSBzdHJ1Y3R1cmVzIC4uIHNlbmQvcmVjdiBidWZmZXJzIGV0YyAuLi4KKyAqLworc3RhdGljIGludCBuaTY1X2FsbG9jX2J1ZmZlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwlzdHJ1Y3QgcHJpdiAqcDsKKwlpbnQgaTsKKworCS8qCisJICogd2UgbmVlZCA4LWFsaWduZWQgbWVtb3J5IC4uCisJICovCisJcHRyID0gbmk2NV9hbGxvY19tZW0oZGV2LCJCVUZGRVIiLHNpemVvZihzdHJ1Y3QgcHJpdikrOCwwKTsKKwlpZighcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXAgPSBkZXYtPnByaXYgPSAoc3RydWN0IHByaXYgKikgKCgodW5zaWduZWQgbG9uZykgcHRyICsgNykgJiB+MHg3KTsKKwltZW1zZXQoKGNoYXIgKikgZGV2LT5wcml2LDAsc2l6ZW9mKHN0cnVjdCBwcml2KSk7CisJcC0+c2VsZiA9IHB0cjsKKworCWZvcihpPTA7aTxUTUROVU07aSsrKQorCXsKKyNpZmRlZiBYTVRfVklBX1NLQgorCQlwLT50bWRfc2tiW2ldID0gTlVMTDsKKyNlbmRpZgorCQlwLT50bWRib3VuY2VbaV0gPSBuaTY1X2FsbG9jX21lbShkZXYsIlhNSVQiLFRfQlVGX1NJWkUsMCk7CisJCWlmKCFwLT50bWRib3VuY2VbaV0pIHsKKwkJCW5pNjVfZnJlZV9idWZmZXIocCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWZvcihpPTA7aTxSTUROVU07aSsrKQorCXsKKyNpZmRlZiBSQ1ZfVklBX1NLQgorCQlwLT5yZWN2X3NrYltpXSA9IG5pNjVfYWxsb2NfbWVtKGRldiwiUkVDViIsUl9CVUZfU0laRSwxKTsKKwkJaWYoIXAtPnJlY3Zfc2tiW2ldKSB7CisJCQluaTY1X2ZyZWVfYnVmZmVyKHApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKyNlbHNlCisJCXAtPnJlY3Zib3VuY2VbaV0gPSBuaTY1X2FsbG9jX21lbShkZXYsIlJFQ1YiLFJfQlVGX1NJWkUsMCk7CisJCWlmKCFwLT5yZWN2Ym91bmNlW2ldKSB7CisJCQluaTY1X2ZyZWVfYnVmZmVyKHApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKyNlbmRpZgorCX0KKworCXJldHVybiAwOyAvKiBldmVyeXRoaW5nIGlzIE9LICovCit9CisKKy8qCisgKiBmcmVlIGJ1ZmZlcnMgYW5kIHByaXZhdGUgc3RydWN0CisgKi8KK3N0YXRpYyB2b2lkIG5pNjVfZnJlZV9idWZmZXIoc3RydWN0IHByaXYgKnApCit7CisJaW50IGk7CisKKwlpZighcCkKKwkJcmV0dXJuOworCisJZm9yKGk9MDtpPFRNRE5VTTtpKyspIHsKKwkJaWYocC0+dG1kYm91bmNlW2ldKQorCQkJa2ZyZWUocC0+dG1kYm91bmNlW2ldKTsKKyNpZmRlZiBYTVRfVklBX1NLQgorCQlpZihwLT50bWRfc2tiW2ldKQorCQkJZGV2X2tmcmVlX3NrYihwLT50bWRfc2tiW2ldKTsKKyNlbmRpZgorCX0KKworCWZvcihpPTA7aTxSTUROVU07aSsrKQorCXsKKyNpZmRlZiBSQ1ZfVklBX1NLQgorCQlpZihwLT5yZWN2X3NrYltpXSkKKwkJCWRldl9rZnJlZV9za2IocC0+cmVjdl9za2JbaV0pOworI2Vsc2UKKwkJaWYocC0+cmVjdmJvdW5jZVtpXSkKKwkJCWtmcmVlKHAtPnJlY3Zib3VuY2VbaV0pOworI2VuZGlmCisJfQorCWlmKHAtPnNlbGYpCisJCWtmcmVlKHAtPnNlbGYpOworfQorCisKKy8qCisgKiBzdG9wIGFuZCAocmUpc3RhcnQgbGFuY2UgLi4gZS5nIGFmdGVyIGFuIGVycm9yCisgKi8KK3N0YXRpYyB2b2lkIG5pNjVfc3RvcF9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHN0cnVjdCBwcml2ICpwKQoreworCWludCBjc3IwID0gQ1NSMF9JTkVBOworCisJd3JpdGVkYXRhcmVnKENTUjBfU1RPUCk7CisKKwlpZihkZWJ1Z2xldmVsID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm5pNjVfc3RvcF9zdGFydFxuIik7CisKKwlpZihwLT5mZWF0dXJlcyAmIElOSVRfUklOR19CRUZPUkVfU1RBUlQpIHsKKwkJaW50IGk7CisjaWZkZWYgWE1UX1ZJQV9TS0IKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYl9zYXZlW1RNRE5VTV07CisjZW5kaWYKKwkJdW5zaWduZWQgbG9uZyBidWZmZXJbVE1ETlVNXTsKKwkJc2hvcnQgYmxlbltUTUROVU1dOworCisJCWlmKHAtPnhtaXRfcXVldWVkKSB7CisJCQl3aGlsZSgxKSB7CisJCQkJaWYoKHAtPnRtZGhlYWRbcC0+dG1kbGFzdF0udS5zLnN0YXR1cyAmIFhNSVRfT1dOKSkKKwkJCQkJYnJlYWs7CisJCQkJcC0+dG1kbGFzdCA9IChwLT50bWRsYXN0ICsgMSkgJiAoVE1ETlVNLTEpOworCQkJCWlmKHAtPnRtZGxhc3QgPT0gcC0+dG1kbnVtKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWZvcihpPTA7aTxUTUROVU07aSsrKSB7CisJCQlzdHJ1Y3QgdG1kICp0bWRwID0gcC0+dG1kaGVhZCArIGk7CisjaWZkZWYgWE1UX1ZJQV9TS0IKKwkJCXNrYl9zYXZlW2ldID0gcC0+dG1kX3NrYltpXTsKKyNlbmRpZgorCQkJYnVmZmVyW2ldID0gKHUzMikgaXNhX2J1c190b192aXJ0KHRtZHAtPnUuYnVmZmVyKTsKKwkJCWJsZW5baV0gPSB0bWRwLT5ibGVuOworCQkJdG1kcC0+dS5zLnN0YXR1cyA9IDB4MDsKKwkJfQorCisJCWZvcihpPTA7aTxSTUROVU07aSsrKSB7CisJCQlzdHJ1Y3Qgcm1kICpybWRwID0gcC0+cm1kaGVhZCArIGk7CisJCQlybWRwLT51LnMuc3RhdHVzID0gUkNWX09XTjsKKwkJfQorCQlwLT50bWRudW0gPSBwLT54bWl0X3F1ZXVlZCA9IDA7CisJCXdyaXRlZGF0YXJlZyhDU1IwX1NUUlQgfCBjc3IwKTsKKworCQlmb3IoaT0wO2k8VE1ETlVNO2krKykgeworCQkJaW50IG51bSA9IChpICsgcC0+dG1kbGFzdCkgJiAoVE1ETlVNLTEpOworCQkJcC0+dG1kaGVhZFtpXS51LmJ1ZmZlciA9ICh1MzIpIGlzYV92aXJ0X3RvX2J1cygoY2hhciAqKWJ1ZmZlcltudW1dKTsgLyogc3RhdHVzIGlzIHBhcnQgb2YgYnVmZmVyIGZpZWxkICovCisJCQlwLT50bWRoZWFkW2ldLmJsZW4gPSBibGVuW251bV07CisJCQlpZihwLT50bWRoZWFkW2ldLnUucy5zdGF0dXMgJiBYTUlUX09XTikgeworCQkJCSBwLT50bWRudW0gPSAocC0+dG1kbnVtICsgMSkgJiAoVE1ETlVNLTEpOworCQkJCSBwLT54bWl0X3F1ZXVlZCA9IDE7CisJIHdyaXRlZGF0YXJlZyhDU1IwX1RETUQgfCBDU1IwX0lORUEgfCBjc3IwKTsKKwkJCX0KKyNpZmRlZiBYTVRfVklBX1NLQgorCQkJcC0+dG1kX3NrYltpXSA9IHNrYl9zYXZlW251bV07CisjZW5kaWYKKwkJfQorCQlwLT5ybWRudW0gPSBwLT50bWRsYXN0ID0gMDsKKwkJaWYoIXAtPmxvY2spCisJCQlpZiAocC0+dG1kbnVtIHx8ICFwLT54bWl0X3F1ZXVlZCkKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCX0KKwllbHNlCisJCXdyaXRlZGF0YXJlZyhDU1IwX1NUUlQgfCBjc3IwKTsKK30KKworLyoKKyAqIGluaXQgbGFuY2UgKHdyaXRlIGluaXQtdmFsdWVzIC4uIGluaXQtYnVmZmVycykgKG9wZW4taGVscGVyKQorICovCitzdGF0aWMgaW50IG5pNjVfbGFuY2VfcmVpbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJIGludCBpOworCSBzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisJIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkgcC0+bG9jayA9IDA7CisJIHAtPnhtaXRfcXVldWVkID0gMDsKKworCSBmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCSBkaXNhYmxlX2RtYShkZXYtPmRtYSk7IC8qIEkndmUgbmV2ZXIgd29ya2VkIHdpdGggZG1hLCBidXQgd2UgZG8gaXQgbGlrZSB0aGUgcGFja2V0ZHJpdmVyICovCisJIHNldF9kbWFfbW9kZShkZXYtPmRtYSxETUFfTU9ERV9DQVNDQURFKTsKKwkgZW5hYmxlX2RtYShkZXYtPmRtYSk7CisJIHJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCisJIG91dHcoaW53KFBPUlQrTF9SRVNFVCksUE9SVCtMX1JFU0VUKTsgLyogZmlyc3Q6IHJlc2V0IHRoZSBjYXJkICovCisJIGlmKCAoaT1yZWFkcmVnKENTUjApICkgIT0gMHg0KQorCSB7CisJCSBwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBSRVNFVCAlcyBjYXJkOiAlMDR4XG4iLGRldi0+bmFtZSwKKwkJCQkJCQljYXJkc1twLT5jYXJkbm9dLmNhcmRuYW1lLChpbnQpIGkpOworCQkgZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJIGRpc2FibGVfZG1hKGRldi0+ZG1hKTsKKwkJIHJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQkgcmV0dXJuIDA7CisJIH0KKworCSBwLT5ybWRudW0gPSBwLT50bWRudW0gPSBwLT50bWRsYXN0ID0gcC0+dG1kYm91bmNlbnVtID0gMDsKKwkgZm9yKGk9MDtpPFRNRE5VTTtpKyspCisJIHsKKwkJIHN0cnVjdCB0bWQgKnRtZHAgPSBwLT50bWRoZWFkICsgaTsKKyNpZmRlZiBYTVRfVklBX1NLQgorCQkgaWYocC0+dG1kX3NrYltpXSkgeworCQkJIGRldl9rZnJlZV9za2IocC0+dG1kX3NrYltpXSk7CisJCQkgcC0+dG1kX3NrYltpXSA9IE5VTEw7CisJCSB9CisjZW5kaWYKKwkJIHRtZHAtPnUuYnVmZmVyID0gMHgwOworCQkgdG1kcC0+dS5zLnN0YXR1cyA9IFhNSVRfU1RBUlQgfCBYTUlUX0VORDsKKwkJIHRtZHAtPmJsZW4gPSB0bWRwLT5zdGF0dXMyID0gMDsKKwkgfQorCisJIGZvcihpPTA7aTxSTUROVU07aSsrKQorCSB7CisJCSBzdHJ1Y3Qgcm1kICpybWRwID0gcC0+cm1kaGVhZCArIGk7CisjaWZkZWYgUkNWX1ZJQV9TS0IKKwkJIHJtZHAtPnUuYnVmZmVyID0gKHUzMikgaXNhX3ZpcnRfdG9fYnVzKHAtPnJlY3Zfc2tiW2ldLT5kYXRhKTsKKyNlbHNlCisJCSBybWRwLT51LmJ1ZmZlciA9ICh1MzIpIGlzYV92aXJ0X3RvX2J1cyhwLT5yZWN2Ym91bmNlW2ldKTsKKyNlbmRpZgorCQkgcm1kcC0+YmxlbiA9IC0oUl9CVUZfU0laRS04KTsKKwkJIHJtZHAtPm1sZW4gPSAwOworCQkgcm1kcC0+dS5zLnN0YXR1cyA9IFJDVl9PV047CisJIH0KKworCSBpZihkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCSBuaTY1X2luaXRfbGFuY2UocCxkZXYtPmRldl9hZGRyLDB4MDAsTV9QUk9NKTsKKwkgZWxzZSBpZihkZXYtPm1jX2NvdW50IHx8IGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCisJCSBuaTY1X2luaXRfbGFuY2UocCxkZXYtPmRldl9hZGRyLDB4ZmYsMHgwKTsKKwkgZWxzZQorCQkgbmk2NV9pbml0X2xhbmNlKHAsZGV2LT5kZXZfYWRkciwweDAwLDB4MDApOworCisJLyoKKwkgKiBuaTY1X3NldF9sYW5jZV9tZW0oKSBzZXRzIExfQUREUlJFRyB0byBDU1IwCisJICogTk9XLCBXRSBXSUxMIE5FVkVSIENIQU5HRSBUSEUgTF9BRERSUkVHLCBDU1IwIElTIEFMV0FZUyBTRUxFQ1RFRAorCSAqLworCisJIGlmKGludyhQT1JUK0xfREFUQVJFRykgJiBDU1IwX0lET04pCXsKKwkJIG5pNjVfc2V0X3BlcmZvcm1hbmNlKHApOworCQkJCQkgLyogaW5pdCBPSzogc3RhcnQgbGFuY2UgLCBlbmFibGUgaW50ZXJydXB0cyAqLworCQkgd3JpdGVkYXRhcmVnKENTUjBfQ0xSQUxMIHwgQ1NSMF9JTkVBIHwgQ1NSMF9TVFJUKTsKKwkJIHJldHVybiAxOyAvKiAtPk9LICovCisJIH0KKwkgcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgaW5pdCBsYW5jZSwgc3RhdHVzOiAlMDR4XG4iLGRldi0+bmFtZSwoaW50KSBpbncoUE9SVCtMX0RBVEFSRUcpKTsKKwkgZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkgZGlzYWJsZV9kbWEoZGV2LT5kbWEpOworCSByZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkgcmV0dXJuIDA7IC8qIC0+RXJyb3IgKi8KK30KKworLyoKKyAqIGludGVycnVwdCBoYW5kbGVyCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBuaTY1X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJaW50IGNzcjAgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IHByaXYgKnA7CisJaW50IGJjbnQgPSAzMjsKKworCXAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJc3Bpbl9sb2NrKCZwLT5yaW5nX2xvY2spOworCQorCXdoaWxlKC0tYmNudCkgeworCQljc3IwID0gaW53KFBPUlQrTF9EQVRBUkVHKTsKKworI2lmIDAKKwkJd3JpdGVkYXRhcmVnKCAoY3NyMCAmIENTUjBfQ0xSQUxMKSApOyAvKiBhY2sgaW50ZXJydXB0cywgZGlzYWJsZSBpbnQuICovCisjZWxzZQorCQl3cml0ZWRhdGFyZWcoIChjc3IwICYgQ1NSMF9DTFJBTEwpIHwgQ1NSMF9JTkVBICk7IC8qIGFjayBpbnRlcnJ1cHRzLCBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KKyNlbmRpZgorCisJCWlmKCEoY3NyMCAmIChDU1IwX0VSUiB8IENTUjBfUklOVCB8IENTUjBfVElOVCkpKQorCQkJYnJlYWs7CisKKwkJaWYoY3NyMCAmIENTUjBfUklOVCkgLyogUkVDVi1pbnQ/ICovCisJCQluaTY1X3JlY3ZfaW50cihkZXYsY3NyMCk7CisJCWlmKGNzcjAgJiBDU1IwX1RJTlQpIC8qIFhNSVQtaW50PyAqLworCQkJbmk2NV94bWl0X2ludHIoZGV2LGNzcjApOworCisJCWlmKGNzcjAgJiBDU1IwX0VSUikKKwkJeworCQkJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCQkJaWYoZGVidWdsZXZlbCA+IDEpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZ2VuZXJhbCBlcnJvcjogJTA0eC5cbiIsZGV2LT5uYW1lLGNzcjApOworCQkJaWYoY3NyMCAmIENTUjBfQkFCTCkKKwkJCQlwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmKGNzcjAgJiBDU1IwX01JU1MpIHsKKwkJCQlpbnQgaTsKKwkJCQlmb3IoaT0wO2k8Uk1ETlVNO2krKykKKwkJCQkJcHJpbnRrKCIlMDJ4ICIscC0+cm1kaGVhZFtpXS51LnMuc3RhdHVzKTsKKwkJCQlwcmludGsoIlxuIik7CisJCQkJcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQl9CisJCQlpZihjc3IwICYgQ1NSMF9NRVJSKSB7CisJCQkJaWYoZGVidWdsZXZlbCA+IDEpCisJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE9vb3BzIC4uIG1lbW9yeSBlcnJvcjogJTA0eC5cbiIsZGV2LT5uYW1lLGNzcjApOworCQkJCW5pNjVfc3RvcF9zdGFydChkZXYscCk7CisJCQl9CisJCX0KKwl9CisKKyNpZmRlZiBSQ1ZfUEFSQU5PSUFfQ0hFQ0sKK3sKKyBpbnQgajsKKyBmb3Ioaj0wO2o8Uk1ETlVNO2orKykKKyB7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCWludCBpLGssbnVtMSxudW0yOworCWZvcihpPVJNRE5VTS0xO2k+MDtpLS0pIHsKKwkJIG51bTIgPSAocC0+cm1kbnVtICsgaSkgJiAoUk1ETlVNLTEpOworCQkgaWYoIShwLT5ybWRoZWFkW251bTJdLnUucy5zdGF0dXMgJiBSQ1ZfT1dOKSkKKwkJCQlicmVhazsKKwl9CisKKwlpZihpKSB7CisJCWZvcihrPTA7azxSTUROVU07aysrKSB7CisJCQludW0xID0gKHAtPnJtZG51bSArIGspICYgKFJNRE5VTS0xKTsKKwkJCWlmKCEocC0+cm1kaGVhZFtudW0xXS51LnMuc3RhdHVzICYgUkNWX09XTikpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYoIWspCisJCQlicmVhazsKKworCQlpZihkZWJ1Z2xldmVsID4gMCkKKwkJeworCQkJY2hhciBidWZbMjU2XSwqYnVmMTsKKwkJCWludCBrOworCQkJYnVmMSA9IGJ1ZjsKKwkJCWZvcihrPTA7azxSTUROVU07aysrKSB7CisJCQkJc3ByaW50ZihidWYxLCIlMDJ4ICIsKHAtPnJtZGhlYWRba10udS5zLnN0YXR1cykpOyAvKiAmIFJDVl9PV04pICk7ICovCisJCQkJYnVmMSArPSAzOworCQkJfQorCQkJKmJ1ZjEgPSAwOworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogT29vcHMsIHJlY2VpdmUgcmluZyBjb3JydXB0ZWQgJTJkICUyZCB8ICVzXG4iLGRldi0+bmFtZSxwLT5ybWRudW0saSxidWYpOworCQl9CisKKwkJcC0+cm1kbnVtID0gbnVtMTsKKwkJbmk2NV9yZWN2X2ludHIoZGV2LGNzcjApOworCQlpZigocC0+cm1kaGVhZFtudW0yXS51LnMuc3RhdHVzICYgUkNWX09XTikpCisJCQlicmVhazsJLyogb2ssIHdlIGFyZSAnaW4gc3luYycgYWdhaW4gKi8KKwl9CisJZWxzZQorCQlicmVhazsKKyB9Cit9CisjZW5kaWYKKworCWlmKCAoY3NyMCAmIChDU1IwX1JYT04gfCBDU1IwX1RYT04pKSAhPSAoQ1NSMF9SWE9OIHwgQ1NSMF9UWE9OKSApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSWCBvciBUWCB3YXMgb2ZmbGluZSAtPiByZXN0YXJ0XG4iLGRldi0+bmFtZSk7CisJCW5pNjVfc3RvcF9zdGFydChkZXYscCk7CisJfQorCWVsc2UKKwkJd3JpdGVkYXRhcmVnKENTUjBfSU5FQSk7CisKKwlzcGluX3VubG9jaygmcC0+cmluZ19sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBXZSBoYXZlIHJlY2VpdmVkIGFuIFhtaXQtSW50ZXJydXB0IC4uCisgKiBzZW5kIGEgbmV3IHBhY2tldCBpZiBuZWNlc3NhcnkKKyAqLworc3RhdGljIHZvaWQgbmk2NV94bWl0X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgY3NyMCkKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwl3aGlsZShwLT54bWl0X3F1ZXVlZCkKKwl7CisJCXN0cnVjdCB0bWQgKnRtZHAgPSBwLT50bWRoZWFkICsgcC0+dG1kbGFzdDsKKwkJaW50IHRtZHN0YXQgPSB0bWRwLT51LnMuc3RhdHVzOworCisJCWlmKHRtZHN0YXQgJiBYTUlUX09XTikKKwkJCWJyZWFrOworCisJCWlmKHRtZHN0YXQgJiBYTUlUX0VSUikKKwkJeworI2lmIDAKKwkJCWlmKHRtZHAtPnN0YXR1czIgJiBYTUlUX1REUk1BU0sgJiYgZGVidWdsZXZlbCA+IDMpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGRyLXByb2JsZW1zIChlLmcuIG5vIHJlc2lzdG9yKVxuIixkZXYtPm5hbWUpOworI2VuZGlmCisJCSAvKiBjaGVja2luZyBzb21lIGVycm9ycyAqLworCQkJaWYodG1kcC0+c3RhdHVzMiAmIFhNSVRfUlRSWSkKKwkJCQlwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJaWYodG1kcC0+c3RhdHVzMiAmIFhNSVRfTENBUikKKwkJCQlwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJaWYodG1kcC0+c3RhdHVzMiAmIChYTUlUX0JVRkYgfCBYTUlUX1VGTE8gKSkgeworCQkvKiB0aGlzIHN0b3BzIHRoZSB4bWl0dGVyICovCisJCQkJcC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQlpZihkZWJ1Z2xldmVsID4gMCkKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogWG1pdCBGSUZPL0JVRkYgZXJyb3JcbiIsZGV2LT5uYW1lKTsKKwkJCQlpZihwLT5mZWF0dXJlcyAmIElOSVRfUklOR19CRUZPUkVfU1RBUlQpIHsKKwkJCQkJdG1kcC0+dS5zLnN0YXR1cyA9IFhNSVRfT1dOIHwgWE1JVF9TVEFSVCB8IFhNSVRfRU5EOwkvKiB0ZXN0OiByZXNlbmQgdGhpcyBmcmFtZSAqLworCQkJCQluaTY1X3N0b3Bfc3RhcnQoZGV2LHApOworCQkJCQlicmVhazsJLyogbm8gbW9yZSBYbWl0IHByb2Nlc3NpbmcgLi4gKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCSBuaTY1X3N0b3Bfc3RhcnQoZGV2LHApOworCQkJfQorCQkJaWYoZGVidWdsZXZlbCA+IDIpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogeG1pdC1lcnJvcjogJTA0eCAlMDJ4LSUwNHhcbiIsZGV2LT5uYW1lLGNzcjAsKGludCkgdG1kc3RhdCwoaW50KSB0bWRwLT5zdGF0dXMyKTsKKwkJCWlmKCEoY3NyMCAmIENTUjBfQkFCTCkpIC8qIGRvbid0IGNvdW50IGVycm9ycyB0d2ljZSAqLworCQkJCXAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJdG1kcC0+c3RhdHVzMiA9IDA7CisJCX0KKwkJZWxzZSB7CisJCQlwLT5zdGF0cy50eF9ieXRlcyAtPSAoc2hvcnQpKHRtZHAtPmJsZW4pOworCQkJcC0+c3RhdHMudHhfcGFja2V0cysrOworCQl9CisKKyNpZmRlZiBYTVRfVklBX1NLQgorCQlpZihwLT50bWRfc2tiW3AtPnRtZGxhc3RdKSB7CisJCQkgZGV2X2tmcmVlX3NrYl9pcnEocC0+dG1kX3NrYltwLT50bWRsYXN0XSk7CisJCQkgcC0+dG1kX3NrYltwLT50bWRsYXN0XSA9IE5VTEw7CisJCX0KKyNlbmRpZgorCisJCXAtPnRtZGxhc3QgPSAocC0+dG1kbGFzdCArIDEpICYgKFRNRE5VTS0xKTsKKwkJaWYocC0+dG1kbGFzdCA9PSBwLT50bWRudW0pCisJCQlwLT54bWl0X3F1ZXVlZCA9IDA7CisJfQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoKKyAqIFdlIGhhdmUgcmVjZWl2ZWQgYSBwYWNrZXQKKyAqLworc3RhdGljIHZvaWQgbmk2NV9yZWN2X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgY3NyMCkKK3sKKwlzdHJ1Y3Qgcm1kICpybWRwOworCWludCBybWRzdGF0LGxlbjsKKwlpbnQgY250PTA7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJcm1kcCA9IHAtPnJtZGhlYWQgKyBwLT5ybWRudW07CisJd2hpbGUoISggKHJtZHN0YXQgPSBybWRwLT51LnMuc3RhdHVzKSAmIFJDVl9PV04pKQorCXsKKwkJY250Kys7CisJCWlmKCAocm1kc3RhdCAmIChSQ1ZfU1RBUlQgfCBSQ1ZfRU5EIHwgUkNWX0VSUikpICE9IChSQ1ZfU1RBUlQgfCBSQ1ZfRU5EKSApIC8qIGVycm9yIG9yIG92ZXJzaXplZD8gKi8KKwkJeworCQkJaWYoIShybWRzdGF0ICYgUkNWX0VSUikpIHsKKwkJCQlpZihybWRzdGF0ICYgUkNWX1NUQVJUKQorCQkJCXsKKwkJCQkJcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWN2LCBwYWNrZXQgdG9vIGxvbmc6ICVkXG4iLGRldi0+bmFtZSxybWRwLT5tbGVuICYgMHgwZmZmKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZihkZWJ1Z2xldmVsID4gMikKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVjZWl2ZS1lcnJvcjogJTA0eCwgbGFuY2Utc3RhdHVzOiAlMDR4LyUwNHhcbiIsCisJCQkJCQkJCQlkZXYtPm5hbWUsKGludCkgcm1kc3RhdCxjc3IwLChpbnQpIGludyhQT1JUK0xfREFUQVJFRykgKTsKKwkJCQlpZihybWRzdGF0ICYgUkNWX0ZSQU0pCisJCQkJCXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCWlmKHJtZHN0YXQgJiBSQ1ZfT0ZMTykKKwkJCQkJcC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCQlpZihybWRzdGF0ICYgUkNWX0NSQykKKwkJCQkJcC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCWlmKHJtZHN0YXQgJiBSQ1ZfQlVGX0VSUikKKwkJCQkJcC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCX0KKwkJCWlmKCEoY3NyMCAmIENTUjBfTUlTUykpIC8qIGRvbid0IGNvdW50IGVycm9ycyB0d2ljZSAqLworCQkJCXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQl9CisJCWVsc2UgaWYoIChsZW4gPSAocm1kcC0+bWxlbiAmIDB4MGZmZikgLSA0KSA+PSA2MCkKKwkJeworI2lmZGVmIFJDVl9WSUFfU0tCCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKFJfQlVGX1NJWkUrMisxNixHRlBfQVRPTUlDKTsKKwkJCWlmIChza2IpCisJCQkJc2tiX3Jlc2VydmUoc2tiLDE2KTsKKyNlbHNlCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihsZW4rMik7CisjZW5kaWYKKwkJCWlmKHNrYikKKwkJCXsKKwkJCQlza2JfcmVzZXJ2ZShza2IsMik7CisJc2tiLT5kZXYgPSBkZXY7CisjaWZkZWYgUkNWX1ZJQV9TS0IKKwkJCQlpZiggKHVuc2lnbmVkIGxvbmcpIChza2ItPmRhdGEgKyBSX0JVRl9TSVpFKSA+IDB4MTAwMDAwMCkgeworCQkJCQlza2JfcHV0KHNrYixsZW4pOworCQkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgKHVuc2lnbmVkIGNoYXIgKikocC0+cmVjdl9za2JbcC0+cm1kbnVtXS0+ZGF0YSksbGVuLDApOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjEgPSBwLT5yZWN2X3NrYltwLT5ybWRudW1dOworCQkJCQlza2JfcHV0KHNrYixSX0JVRl9TSVpFKTsKKwkJCQkJcC0+cmVjdl9za2JbcC0+cm1kbnVtXSA9IHNrYjsKKwkJCQkJcm1kcC0+dS5idWZmZXIgPSAodTMyKSBpc2FfdmlydF90b19idXMoc2tiLT5kYXRhKTsKKwkJCQkJc2tiID0gc2tiMTsKKwkJCQkJc2tiX3RyaW0oc2tiLGxlbik7CisJCQkJfQorI2Vsc2UKKwkJCQlza2JfcHV0KHNrYixsZW4pOworCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCAodW5zaWduZWQgY2hhciAqKSBwLT5yZWN2Ym91bmNlW3AtPnJtZG51bV0sbGVuLDApOworI2VuZGlmCisJCQkJcC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCXAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBhbGxvYyBuZXcgc2tfYnVmZlxuIixkZXYtPm5hbWUpOworCQkJCXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWNlaXZlZCBydW50IHBhY2tldFxuIixkZXYtPm5hbWUpOworCQkJcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCX0KKwkJcm1kcC0+YmxlbiA9IC0oUl9CVUZfU0laRS04KTsKKwkJcm1kcC0+bWxlbiA9IDA7CisJCXJtZHAtPnUucy5zdGF0dXMgPSBSQ1ZfT1dOOyAvKiBjaGFuZ2Ugb3duZXIgKi8KKwkJcC0+cm1kbnVtID0gKHAtPnJtZG51bSArIDEpICYgKFJNRE5VTS0xKTsKKwkJcm1kcCA9IHAtPnJtZGhlYWQgKyBwLT5ybWRudW07CisJfQorfQorCisvKgorICoga2ljayB4bWl0dGVyIC4uCisgKi8KKyAKK3N0YXRpYyB2b2lkIG5pNjVfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHhtaXR0ZXIgdGltZWQgb3V0LCB0cnkgdG8gcmVzdGFydCFcbiIsZGV2LT5uYW1lKTsKKwlmb3IoaT0wO2k8VE1ETlVNO2krKykKKwkJcHJpbnRrKCIlMDJ4ICIscC0+dG1kaGVhZFtpXS51LnMuc3RhdHVzKTsKKwlwcmludGsoIlxuIik7CisJbmk2NV9sYW5jZV9yZWluaXQoZGV2KTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKglTZW5kIGEgcGFja2V0CisgKi8KKworc3RhdGljIGludCBuaTY1X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkKikmcC0+bG9jaykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUXVldWUgd2FzIGxvY2tlZC5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCXsKKwkJc2hvcnQgbGVuID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47CisJCXN0cnVjdCB0bWQgKnRtZHA7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBYTVRfVklBX1NLQgorCQlpZiggKHVuc2lnbmVkIGxvbmcpIChza2ItPmRhdGEgKyBza2ItPmxlbikgPiAweDEwMDAwMDApIHsKKyNlbmRpZgorCisJCQltZW1jcHkoKGNoYXIgKikgcC0+dG1kYm91bmNlW3AtPnRtZGJvdW5jZW51bV0gLChjaGFyICopc2tiLT5kYXRhLAorCQkJCQkJCSAoc2tiLT5sZW4gPiBUX0JVRl9TSVpFKSA/IFRfQlVGX1NJWkUgOiBza2ItPmxlbik7CisJCQlpZiAobGVuID4gc2tiLT5sZW4pCisJCQkJbWVtc2V0KChjaGFyICopcC0+dG1kYm91bmNlW3AtPnRtZGJvdW5jZW51bV0rc2tiLT5sZW4sIDAsIGxlbi1za2ItPmxlbik7CisJCQlkZXZfa2ZyZWVfc2tiIChza2IpOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+cmluZ19sb2NrLCBmbGFncyk7CisJCQl0bWRwID0gcC0+dG1kaGVhZCArIHAtPnRtZG51bTsKKwkJCXRtZHAtPnUuYnVmZmVyID0gKHUzMikgaXNhX3ZpcnRfdG9fYnVzKHAtPnRtZGJvdW5jZVtwLT50bWRib3VuY2VudW1dKTsKKwkJCXAtPnRtZGJvdW5jZW51bSA9IChwLT50bWRib3VuY2VudW0gKyAxKSAmIChUTUROVU0gLSAxKTsKKworI2lmZGVmIFhNVF9WSUFfU0tCCisJCX0KKwkJZWxzZSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+cmluZ19sb2NrLCBmbGFncyk7CisKKwkJCXRtZHAgPSBwLT50bWRoZWFkICsgcC0+dG1kbnVtOworCQkJdG1kcC0+dS5idWZmZXIgPSAodTMyKSBpc2FfdmlydF90b19idXMoc2tiLT5kYXRhKTsKKwkJCXAtPnRtZF9za2JbcC0+dG1kbnVtXSA9IHNrYjsKKwkJfQorI2VuZGlmCisJCXRtZHAtPmJsZW4gPSAtbGVuOworCisJCXRtZHAtPnUucy5zdGF0dXMgPSBYTUlUX09XTiB8IFhNSVRfU1RBUlQgfCBYTUlUX0VORDsKKwkJd3JpdGVkYXRhcmVnKENTUjBfVERNRCB8IENTUjBfSU5FQSk7IC8qIGVuYWJsZSB4bWl0ICYgaW50ZXJydXB0ICovCisKKwkJcC0+eG1pdF9xdWV1ZWQgPSAxOworCQlwLT50bWRudW0gPSAocC0+dG1kbnVtICsgMSkgJiAoVE1ETlVNLTEpOworCisJCWlmKHAtPnRtZG51bSAhPSBwLT50bWRsYXN0KQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCisJCXAtPmxvY2sgPSAwOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnJpbmdfbG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5pNjVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKyNpZiAwCisJaW50IGk7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCWZvcihpPTA7aTxSTUROVU07aSsrKQorCXsKKwkJc3RydWN0IHJtZCAqcm1kcCA9IHAtPnJtZGhlYWQgKyAoKHAtPnJtZG51bSArIGkpICYgKFJNRE5VTS0xKSk7CisJCXByaW50aygiJTAyeCAiLHJtZHAtPnUucy5zdGF0dXMpOworCX0KKwlwcmludGsoIlxuIik7CisjZW5kaWYKKworCXJldHVybiAmKChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXYpLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYoIW5pNjVfbGFuY2VfcmVpbml0KGRldikpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IHN3aXRjaCBjYXJkIGludG8gTUMgbW9kZSFcbiIsZGV2LT5uYW1lKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X25pNjU7CisKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJuaTY1MTAgSVJRIG51bWJlciAoaWdub3JlZCBmb3Igc29tZSBjYXJkcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJuaTY1MTAgSS9PIGJhc2UgYWRkcmVzcyIpOworTU9EVUxFX1BBUk1fREVTQyhkbWEsICJuaTY1MTAgSVNBIERNQSBjaGFubmVsIChpZ25vcmVkIGZvciBzb21lIGNhcmRzKSIpOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKyAJZGV2X25pNjUgPSBuaTY1X3Byb2JlKC0xKTsKKwlyZXR1cm4gSVNfRVJSKGRldl9uaTY1KSA/IFBUUl9FUlIoZGV2X25pNjUpIDogMDsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworIAl1bnJlZ2lzdGVyX25ldGRldihkZXZfbmk2NSk7CisgCWNsZWFudXBfY2FyZChkZXZfbmk2NSk7CisgCWZyZWVfbmV0ZGV2KGRldl9uaTY1KTsKK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogRU5EIG9mIG5pNjUuYworICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uaTY1LmggYi9kcml2ZXJzL25ldC9uaTY1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxY2VmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25pNjUuaApAQCAtMCwwICsxLDEyMSBAQAorLyogYW03OTkwIChsYW5jZSkgZGVmaW5pdGlvbnMKKyAqIAorICogVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0sIGFuZCBpcyBjb3ZlcmVkIGJ5CisgKiBzYW1lIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoYXQgY292ZXJzIHRoYXQgd29yay4KKyAqIAorICogTWljaGFlbCBIaXBwCisgKiBlbWFpbDogbWhpcHBAc3R1ZGVudC51bmktdHVlYmluZ2VuLmRlCisgKgorICogc291cmNlczogKG1haWwgbWUgb3IgYXNrIGFyY2hpZSBpZiB5b3UgbmVlZCB0aGVtKSAKKyAqICAgIGNyeW53ci1wYWNrZXQtZHJpdmVyCisgKi8KKworLyoKKyAqIAlDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgMCAoQ1NSMCkgYml0IGRlZmluaXRpb25zCisgKiAoUj1SZWFkYWJsZSkgKFc9V3JpdGVhYmxlKSAoUz1TZXQgb24gd3JpdGUpIChDLUNsZWFyIG9uIHdyaXRlKQorICoKKyAqLworCisjZGVmaW5lIENTUjBfRVJSCTB4ODAwMAkvKiBFcnJvciBzdW1tYXJ5IChSKSAqLworI2RlZmluZSBDU1IwX0JBQkwJMHg0MDAwCS8qIEJhYmJsZSB0cmFuc21pdHRlciB0aW1lb3V0IGVycm9yIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9DRVJSCTB4MjAwMAkvKiBDb2xsaXNpb24gRXJyb3IgKFJDKSAqLworI2RlZmluZSBDU1IwX01JU1MJMHgxMDAwCS8qIE1pc3NlZCBwYWNrZXQgKFJDKSAqLworI2RlZmluZSBDU1IwX01FUlIJMHgwODAwCS8qIE1lbW9yeSBFcnJvciAoUkMpICovCisjZGVmaW5lIENTUjBfUklOVAkweDA0MDAJLyogUmVjZWl2ZXIgSW50ZXJydXB0IChSQykgKi8KKyNkZWZpbmUgQ1NSMF9USU5UICAgICAgIDB4MDIwMAkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgKFJDKSAqLworI2RlZmluZSBDU1IwX0lET04JMHgwMTAwCS8qIEluaXRpYWxpemF0aW9uIERvbmUgKFJDKSAqLworI2RlZmluZSBDU1IwX0lOVFIJMHgwMDgwCS8qIEludGVycnVwdCBGbGFnIChSKSAqLworI2RlZmluZSBDU1IwX0lORUEJMHgwMDQwCS8qIEludGVycnVwdCBFbmFibGUgKFJXKSAqLworI2RlZmluZSBDU1IwX1JYT04JMHgwMDIwCS8qIFJlY2VpdmVyIG9uIChSKSAqLworI2RlZmluZSBDU1IwX1RYT04JMHgwMDEwCS8qIFRyYW5zbWl0dGVyIG9uIChSKSAqLworI2RlZmluZSBDU1IwX1RETUQJMHgwMDA4CS8qIFRyYW5zbWl0IERlbWFuZCAoUlMpICovCisjZGVmaW5lIENTUjBfU1RPUAkweDAwMDQJLyogU3RvcCAoUlMpICovCisjZGVmaW5lIENTUjBfU1RSVAkweDAwMDIJLyogU3RhcnQgKFJTKSAqLworI2RlZmluZSBDU1IwX0lOSVQJMHgwMDAxCS8qIEluaXRpYWxpemUgKFJTKSAqLworCisjZGVmaW5lIENTUjBfQ0xSQUxMICAgIDB4N2YwMAkvKiBtYXNrIGZvciBhbGwgY2xlYXJhYmxlIGJpdHMgKi8KKy8qCisgKglJbml0aWFsaXphdGlvbiBCbG9jayAgTW9kZSBvcGVyYXRpb24gQml0IERlZmluaXRpb25zLgorICovCisKKyNkZWZpbmUgTV9QUk9NCQkweDgwMDAJLyogUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBNX0lOVEwJCTB4MDA0MAkvKiBJbnRlcm5hbCBMb29wYmFjayAqLworI2RlZmluZSBNX0RSVFkJCTB4MDAyMAkvKiBEaXNhYmxlIFJldHJ5ICovCisjZGVmaW5lIE1fQ09MTAkJMHgwMDEwCS8qIEZvcmNlIENvbGxpc2lvbiAqLworI2RlZmluZSBNX0RUQ1IJCTB4MDAwOAkvKiBEaXNhYmxlIFRyYW5zbWl0IENSQykgKi8KKyNkZWZpbmUgTV9MT09QCQkweDAwMDQJLyogTG9vcGJhY2sgKi8KKyNkZWZpbmUgTV9EVFgJCTB4MDAwMgkvKiBEaXNhYmxlIHRoZSBUcmFuc21pdHRlciAqLworI2RlZmluZSBNX0RSWAkJMHgwMDAxCS8qIERpc2FibGUgdGhlIFJlY2VpdmVyICovCisKKworLyoKKyAqIAlSZWNlaXZlIG1lc3NhZ2UgZGVzY3JpcHRvciBiaXQgZGVmaW5pdGlvbnMuCisgKi8KKworI2RlZmluZSBSQ1ZfT1dOCQkweDgwCS8qIG93bmVyIGJpdCAwID0gaG9zdCwgMSA9IGxhbmNlICovCisjZGVmaW5lIFJDVl9FUlIJCTB4NDAJLyogRXJyb3IgU3VtbWFyeSAqLworI2RlZmluZSBSQ1ZfRlJBTQkweDIwCS8qIEZyYW1pbmcgRXJyb3IgKi8KKyNkZWZpbmUgUkNWX09GTE8JMHgxMAkvKiBPdmVyZmxvdyBFcnJvciAqLworI2RlZmluZSBSQ1ZfQ1JDCQkweDA4CS8qIENSQyBFcnJvciAqLworI2RlZmluZSBSQ1ZfQlVGX0VSUgkweDA0CS8qIEJ1ZmZlciBFcnJvciAqLworI2RlZmluZSBSQ1ZfU1RBUlQJMHgwMgkvKiBTdGFydCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgUkNWX0VORAkJMHgwMQkvKiBFbmQgb2YgUGFja2V0ICovCisKKworLyoKKyAqCVRyYW5zbWl0ICBtZXNzYWdlIGRlc2NyaXB0b3IgYml0IGRlZmluaXRpb25zLgorICovCisKKyNkZWZpbmUgWE1JVF9PV04JMHg4MAkvKiBvd25lciBiaXQgMCA9IGhvc3QsIDEgPSBsYW5jZSAqLworI2RlZmluZSBYTUlUX0VSUgkweDQwCS8qIEVycm9yIFN1bW1hcnkgKi8KKyNkZWZpbmUgWE1JVF9SRVRSWQkweDEwCS8qIG1vcmUgdGhlIDEgcmV0cnkgbmVlZGVkIHRvIFhtaXQgKi8KKyNkZWZpbmUgWE1JVF8xX1JFVFJZCTB4MDgJLyogb25lIHJldHJ5IG5lZWRlZCB0byBYbWl0ICovCisjZGVmaW5lIFhNSVRfREVGCTB4MDQJLyogRGVmZXJyZWQgKi8KKyNkZWZpbmUgWE1JVF9TVEFSVAkweDAyCS8qIFN0YXJ0IG9mIFBhY2tldCAqLworI2RlZmluZSBYTUlUX0VORAkweDAxCS8qIEVuZCBvZiBQYWNrZXQgKi8KKworLyoKKyAqIHRyYW5zbWl0IHN0YXR1cyAoMikgKHZhbGlkIGlmIFhNSVRfRVJSID09IDEpCisgKi8KKworI2RlZmluZSBYTUlUX1REUk1BU0sgICAgMHgwM2ZmCS8qIHRpbWUtZG9tYWluLXJlZmxlY3RvbWV0ZXItdmFsdWUgKi8KKyNkZWZpbmUgWE1JVF9SVFJZIAkweDA0MDAJLyogRmFpbGVkIGFmdGVyIDE2IHJldHJhbnNtaXNzaW9ucyAgKi8KKyNkZWZpbmUgWE1JVF9MQ0FSIAkweDA4MDAJLyogTG9zcyBvZiBDYXJyaWVyICovCisjZGVmaW5lIFhNSVRfTENPTCAJMHgxMDAwCS8qIExhdGUgY29sbGlzaW9uICovCisjZGVmaW5lIFhNSVRfUkVTRVJWIAkweDIwMDAJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1JVF9VRkxPIAkweDQwMDAJLyogVW5kZXJmbG93IChsYXRlIG1lbW9yeSkgKi8KKyNkZWZpbmUgWE1JVF9CVUZGIAkweDgwMDAJLyogQnVmZmVyaW5nIGVycm9yIChubyBFTlApICovCisKK3N0cnVjdCBpbml0X2Jsb2NrIHsKKwl1bnNpZ25lZCBzaG9ydCBtb2RlOworCXVuc2lnbmVkIGNoYXIgZWFkZHJbNl07CisJdW5zaWduZWQgY2hhciBmaWx0ZXJbOF07CisJLyogYml0IDI5LTMxOiBudW1iZXIgb2Ygcm1kJ3MgKHBvd2VyIG9mIDIpICovCisJdTMyIHJycDsJCS8qIHJlY2VpdmUgcmluZyBwb2ludGVyIChhbGlnbiA4KSAqLworCS8qIGJpdCAyOS0zMTogbnVtYmVyIG9mIHRtZCdzIChwb3dlciBvZiAyKSAqLworCXUzMiB0cnA7CQkvKiB0cmFuc21pdCByaW5nIHBvaW50ZXIgKGFsaWduIDgpICovCit9OworCitzdHJ1Y3Qgcm1kIHsJCQkvKiBSZWNlaXZlIE1lc3NhZ2UgRGVzY3JpcHRvciAqLworCXVuaW9uIHsKKwkJdm9sYXRpbGUgdTMyIGJ1ZmZlcjsKKwkJc3RydWN0IHsKKwkJCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZHVtbXlbM107CisJCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwkJfSBzOworCX0gdTsKKwl2b2xhdGlsZSBzaG9ydCBibGVuOworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IG1sZW47Cit9OworCitzdHJ1Y3QgdG1kIHsKKwl1bmlvbiB7CisJCXZvbGF0aWxlIHUzMiBidWZmZXI7CisJCXN0cnVjdCB7CisJCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGR1bW15WzNdOworCQkJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBzdGF0dXM7CisJCX0gczsKKwl9IHU7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgYmxlbjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBzdGF0dXMyOworfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25zODM4MjAuYyBiL2RyaXZlcnMvbmV0L25zODM4MjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmNjMTgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbnM4MzgyMC5jCkBAIC0wLDAgKzEsMjIyMiBAQAorI2RlZmluZSBfVkVSU0lPTiAiMC4yMCIKKy8qIG5zODM4MjAuYyBieSBCZW5qYW1pbiBMYUhhaXNlIHdpdGggY29udHJpYnV0aW9ucy4KKyAqCisgKiBRdWVzdGlvbnMvY29tbWVudHMvZGlzY3Vzc2lvbiB0byBsaW51eC1uczgzODIwQGt2YWNrLm9yZy4KKyAqCisgKiAkUmV2aXNpb246IDEuMzQuMi4yMyAkCisgKgorICogQ29weXJpZ2h0IDIwMDEgQmVuamFtaW4gTGFIYWlzZS4KKyAqIENvcHlyaWdodCAyMDAxLCAyMDAyIFJlZCBIYXQuCisgKgorICogTW1tbSwgY2hvY29sYXRlIHZhbmlsbGEgbW9jaGEuLi4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqCisgKiBDaGFuZ2VMb2cKKyAqID09PT09PT09PQorICoJMjAwMTA0MTQJMC4xIC0gY3JlYXRlZAorICoJMjAwMTA2MjIJMC4yIC0gYmFzaWMgcnggYW5kIHR4LgorICoJMjAwMTA3MTEJMC4zIC0gYWRkZWQgZHVwbGV4IGFuZCBsaW5rIHN0YXRlIGRldGVjdGlvbiBzdXBwb3J0LgorICoJMjAwMTA3MTMJMC40IC0gemVybyBjb3B5LCBubyBoYW5ncy4KKyAqCQkJMC41IC0gNjQgYml0IGRtYSBzdXBwb3J0IChkYXZlbSB3aWxsIGhhdGUgbWUgZm9yIHRoaXMpCisgKgkJCSAgICAtIGRpc2FibGUganVtYm8gZnJhbWVzIHRvIGF2b2lkIHR4IGhhbmdzCisgKgkJCSAgICAtIHdvcmsgYXJvdW5kIHR4IGRlYWRsb2NrcyBvbiBteSAxLjAyIGNhcmQgdmlhCisgKgkJCSAgICAgIGZpZGRsaW5nIHdpdGggVFhDRkcKKyAqCTIwMDEwODEwCTAuNiAtIHVzZSBwY2kgZG1hIGFwaSBmb3IgcmluZ2J1ZmZlcnMsIHdvcmsgb24gaWE2NAorICoJMjAwMTA4MTYJMC43IC0gbWlzYyBjbGVhbnVwcworICoJMjAwMTA4MjYJMC44IC0gZml4IGNyaXRpY2FsIHplcm8gY29weSBidWdzCisgKgkJCTAuOSAtIGludGVybmFsIGV4cGVyaW1lbnQKKyAqCTIwMDEwODI3CTAuMTAgLSBmaXggaWE2NCB1bmFsaWduZWQgYWNjZXNzLgorICoJMjAwMTA5MDYJMC4xMSAtIGFjY2VwdCBhbGwgcGFja2V0cyB3aXRoIGNoZWNrc3VtIGVycm9ycyBhcworICoJCQkgICAgICAgb3RoZXJ3aXNlIGZyYWdtZW50cyBnZXQgbG9zdAorICoJCQkgICAgIC0gZml4ID4+IDMyIGJ1Z3MKKyAqCQkJMC4xMiAtIGFkZCBzdGF0aXN0aWNzIGNvdW50ZXJzCisgKgkJCSAgICAgLSBhZGQgYWxsbXVsdGkvcHJvbWlzYyBzdXBwb3J0CisgKgkyMDAxMTAwOQkwLjEzIC0gaG90cGx1ZyBzdXBwb3J0LCBvdGhlciBzbWFsbGVyIHBjaSBhcGkgY2xlYW51cHMKKyAqCTIwMDExMjA0CTAuMTNhIC0gb3B0aWNhbCB0cmFuc2NlaXZlciBzdXBwb3J0IGFkZGVkCisgKgkJCQlieSBNaWNoYWVsIENsYXJrIDxtaWNoYWVsQG1ldGFwYXJhZGlnbS5jb20+CisgKgkyMDAxMTIwNQkwLjEzYiAtIGNhbGwgcmVnaXN0ZXJfbmV0ZGV2IGVhcmxpZXIgaW4gaW5pdGlhbGl6YXRpb24KKyAqCQkJCXN1cHByZXNzIGR1cGxpY2F0ZSBsaW5rIHN0YXR1cyBtZXNzYWdlcworICoJMjAwMTExMTcgCTAuMTQgLSBldGh0b29sIEdEUlZJTkZPLCBHTElOSyBzdXBwb3J0IGZyb20gamdhcnppaworICoJMjAwMTEyMDQgCTAuMTUJZ2V0IHBwYyAoYmlnIGVuZGlhbikgd29ya2luZworICoJMjAwMTEyMTgJMC4xNgl2YXJpb3VzIGNsZWFudXBzCisgKgkyMDAyMDMxMAkwLjE3CXNwZWVkdXBzCisgKgkyMDAyMDYxMAkwLjE4IC0JYWN0dWFsbHkgdXNlIHRoZSBwY2kgZG1hIGFwaSBmb3IgaGlnaG1lbQorICoJCQkgICAgIC0JcmVtb3ZlIHBjaSBsYXRlbmN5IHJlZ2lzdGVyIGZpZGRsaW5nCisgKgkJCTAuMTkgLQliZXR0ZXIgYmlzdCBzdXBwb3J0CisgKgkJCSAgICAgLQlhZGQgaWhyIGFuZCByZXNldF9waHkgcGFyYW1ldGVycworICoJCQkgICAgIC0JZ21paSBidXMgcHJvYmluZworICoJCQkgICAgIC0JZml4IG1pc3NlZCB0eG9rIGludHJvZHVjZWQgZHVyaW5nIHBlcmZvcm1hbmNlCisgKgkJCQl0dW5pbmcKKyAqCQkJMC4yMCAtCWZpeCBzdHVwaWQgUkZFTiB0aGlua28uICBpIGFtIHN1Y2ggYSBzbXVyZi4KKyAqCisgKgkyMDA0MDgyOAkwLjIxIC0JYWRkIGhhcmR3YXJlIHZsYW4gYWNjbGVyYXRpb24KKyAqCQkJCWJ5IE5laWwgSG9ybWFuIDxuaG9ybWFuQHJlZGhhdC5jb20+CisgKiBEcml2ZXIgT3ZlcnZpZXcKKyAqID09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgZHJpdmVyIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yCisgKiA4MzgyMCBjaGlwLCBhIDEwLzEwMC8xMDAwIE1icHMgNjQgYml0IFBDSSBldGhlcm5ldCBOSUMuICBIb3BlZnVsbHkKKyAqIHRoaXMgY29kZSB3aWxsIHR1cm4gb3V0IHRvIGJlIGEpIGNsZWFuLCBiKSBjb3JyZWN0LCBhbmQgYykgZmFzdC4KKyAqIFdpdGggdGhhdCBpbiBtaW5kLCBJJ20gYWltaW5nIHRvIHNwbGl0IHRoZSBjb2RlIHVwIGFzIG11Y2ggYXMKKyAqIHJlYXNvbmFibHkgcG9zc2libGUuICBBdCBwcmVzZW50IHRoZXJlIGFyZSBYIG1ham9yIHNlY3Rpb25zIHRoYXQKKyAqIGJyZWFrIGRvd24gaW50byBhKSBwYWNrZXQgcmVjZWl2ZSwgYikgcGFja2V0IHRyYW5zbWl0LCBjKSBsaW5rCisgKiBtYW5hZ2VtZW50LCBkKSBpbml0aWFsaXphdGlvbiBhbmQgY29uZmlndXJhdGlvbi4gIFdoZXJlIHBvc3NpYmxlLAorICogdGhlc2UgY29kZSBwYXRocyBhcmUgZGVzaWduZWQgdG8gcnVuIGluIHBhcmFsbGVsLgorICoKKyAqIFRoaXMgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCBhbmQgZm91bmQgdG8gd29yayB3aXRoIHRoZSBmb2xsb3dpbmcKKyAqIGNhcmRzIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKToKKyAqCisgKglDYW1lbwkJU09ITy1HQTIwMDBUCVNPSE8tR0EyNTAwVAorICoJRC1MaW5rCQlER0UtNTAwVAorICoJUHVyZURhdGEJUERQODAyM1otVEcKKyAqCVNNQwkJU01DOTQ1MlRYCVNNQzk0NjJUWAorICoJTmV0Z2VhcgkJR0E2MjEKKyAqCisgKiBTcGVjaWFsIHRoYW5rcyB0byBTTUMgZm9yIHByb3ZpZGluZyBoYXJkd2FyZSB0byB0ZXN0IHRoaXMgZHJpdmVyIG9uLgorICoKKyAqIFJlcG9ydHMgb2Ygc3VjY2VzcyBvciBmYWlsdXJlIHdvdWxkIGJlIGdyZWF0bHkgYXBwcmVjaWF0ZWQuCisgKi8KKy8vI2RlZmluZSBkcHJpbnRrCQlwcmludGsKKyNkZWZpbmUgZHByaW50ayh4Li4uKQkJZG8geyB9IHdoaWxlICgwKQorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgkvKiBmb3IgaXBoICovCisjaW5jbHVkZSA8bGludXgvaW4uaD4JLyogZm9yIElQUFJPVE9fLi4uICovCisjaW5jbHVkZSA8bGludXgvZWVwcm9tLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIERSVl9OQU1FICJuczgzODIwIgorCisvKiBHbG9iYWwgcGFyYW1ldGVycy4gIFNlZSBtb2R1bGVfcGFyYW0gbmVhciB0aGUgYm90dG9tLiAqLworc3RhdGljIGludCBpaHIgPSAyOworc3RhdGljIGludCByZXNldF9waHkgPSAwOworc3RhdGljIGludCBsbmtzdHMgPSAwOwkJLyogQ0ZHX0xOS1NUUyBiaXQgcG9sYXJpdHkgKi8KKworLyogRHByaW50ayBpcyB1c2VkIGZvciBtb3JlIGludGVyZXN0aW5nIGRlYnVnIGV2ZW50cyAqLworI3VuZGVmIERwcmludGsKKyNkZWZpbmUJRHByaW50awkJCWRwcmludGsKKworI2lmIGRlZmluZWQoQ09ORklHX0hJR0hNRU02NEcpIHx8IGRlZmluZWQoX19pYTY0X18pCisjZGVmaW5lIFVTRV82NEJJVF9BRERSCSIrIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVTRV82NEJJVF9BRERSKQorI2RlZmluZQlWRVJTSU9OCV9WRVJTSU9OIFVTRV82NEJJVF9BRERSCisjZGVmaW5lIFRSWV9EQUMJMQorI2Vsc2UKKyNkZWZpbmUJVkVSU0lPTglfVkVSU0lPTgorI2RlZmluZSBUUllfREFDCTAKKyNlbmRpZgorCisvKiB0dW5hYmxlcyAqLworI2RlZmluZSBSWF9CVUZfU0laRQkxNTAwCS8qIDgxOTIgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNkZWZpbmUgTlM4MzgyMF9WTEFOX0FDQ0VMX1NVUFBPUlQKKyNlbmRpZgorCisvKiBNdXN0IG5vdCBleGNlZWQgfjY1MDAwLiAqLworI2RlZmluZSBOUl9SWF9ERVNDCTY0CisjZGVmaW5lIE5SX1RYX0RFU0MJMTI4CisKKy8qIG5vdCB0dW5hYmxlICovCisjZGVmaW5lIFJFQUxfUlhfQlVGX1NJWkUgKFJYX0JVRl9TSVpFICsgMTQpCS8qIHJ4L3R4IG1hYyBhZGRyICsgdHlwZSAqLworCisjZGVmaW5lIE1JTl9UWF9ERVNDX0ZSRUUJOAorCisvKiByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIENGR0NTCQkweDA0CisKKyNkZWZpbmUgQ1JfVFhFCQkweDAwMDAwMDAxCisjZGVmaW5lIENSX1RYRAkJMHgwMDAwMDAwMgorLyogUmFtaXQgOiBIZXJlJ3MgYSB0aXAsIGRvbid0IGRvIGEgUlhEIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFuIFJYRQorICogVGhlIFJlY2VpdmUgZW5naW5lIHNraXBzIG9uZSBkZXNjcmlwdG9yIGFuZCBtb3ZlcworICogb250byB0aGUgbmV4dCBvbmUhISAqLworI2RlZmluZSBDUl9SWEUJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ1JfUlhECQkweDAwMDAwMDA4CisjZGVmaW5lIENSX1RYUgkJMHgwMDAwMDAxMAorI2RlZmluZSBDUl9SWFIJCTB4MDAwMDAwMjAKKyNkZWZpbmUgQ1JfU1dJCQkweDAwMDAwMDgwCisjZGVmaW5lIENSX1JTVAkJMHgwMDAwMDEwMAorCisjZGVmaW5lIFBUU0NSX0VFQklTVF9GQUlMICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUFRTQ1JfRUVCSVNUX0VOICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBQVFNDUl9FRUxPQURfRU4gICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFBUU0NSX1JCSVNUX0ZBSUwgICAgICAgIDB4MDAwMDAxYjgKKyNkZWZpbmUgUFRTQ1JfUkJJU1RfRE9ORSAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBQVFNDUl9SQklTVF9FTiAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFBUU0NSX1JCSVNUX1JTVCAgICAgICAgIDB4MDAwMDIwMDAKKworI2RlZmluZSBNRUFSX0VFREkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUVBUl9FRURPCQkweDAwMDAwMDAyCisjZGVmaW5lIE1FQVJfRUVDTEsJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUVBUl9FRVNFTAkJMHgwMDAwMDAwOAorI2RlZmluZSBNRUFSX01ESU8JCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUVBUl9NRERJUgkJMHgwMDAwMDAyMAorI2RlZmluZSBNRUFSX01EQwkJMHgwMDAwMDA0MAorCisjZGVmaW5lIElTUl9UWERFU0MzCTB4NDAwMDAwMDAKKyNkZWZpbmUgSVNSX1RYREVTQzIJMHgyMDAwMDAwMAorI2RlZmluZSBJU1JfVFhERVNDMQkweDEwMDAwMDAwCisjZGVmaW5lIElTUl9UWERFU0MwCTB4MDgwMDAwMDAKKyNkZWZpbmUgSVNSX1JYREVTQzMJMHgwNDAwMDAwMAorI2RlZmluZSBJU1JfUlhERVNDMgkweDAyMDAwMDAwCisjZGVmaW5lIElTUl9SWERFU0MxCTB4MDEwMDAwMDAKKyNkZWZpbmUgSVNSX1JYREVTQzAJMHgwMDgwMDAwMAorI2RlZmluZSBJU1JfVFhSQ01QCTB4MDA0MDAwMDAKKyNkZWZpbmUgSVNSX1JYUkNNUAkweDAwMjAwMDAwCisjZGVmaW5lIElTUl9EUEVSUgkweDAwMTAwMDAwCisjZGVmaW5lIElTUl9TU0VSUgkweDAwMDgwMDAwCisjZGVmaW5lIElTUl9STUFCVAkweDAwMDQwMDAwCisjZGVmaW5lIElTUl9SVEFCVAkweDAwMDIwMDAwCisjZGVmaW5lIElTUl9SWFNPVlIJMHgwMDAxMDAwMAorI2RlZmluZSBJU1JfSElCSU5UCTB4MDAwMDgwMDAKKyNkZWZpbmUgSVNSX1BIWQkJMHgwMDAwNDAwMAorI2RlZmluZSBJU1JfUE1FCQkweDAwMDAyMDAwCisjZGVmaW5lIElTUl9TV0kJCTB4MDAwMDEwMDAKKyNkZWZpbmUgSVNSX01JQgkJMHgwMDAwMDgwMAorI2RlZmluZSBJU1JfVFhVUk4JMHgwMDAwMDQwMAorI2RlZmluZSBJU1JfVFhJRExFCTB4MDAwMDAyMDAKKyNkZWZpbmUgSVNSX1RYRVJSCTB4MDAwMDAxMDAKKyNkZWZpbmUgSVNSX1RYREVTQwkweDAwMDAwMDgwCisjZGVmaW5lIElTUl9UWE9LCTB4MDAwMDAwNDAKKyNkZWZpbmUgSVNSX1JYT1JOCTB4MDAwMDAwMjAKKyNkZWZpbmUgSVNSX1JYSURMRQkweDAwMDAwMDEwCisjZGVmaW5lIElTUl9SWEVBUkxZCTB4MDAwMDAwMDgKKyNkZWZpbmUgSVNSX1JYRVJSCTB4MDAwMDAwMDQKKyNkZWZpbmUgSVNSX1JYREVTQwkweDAwMDAwMDAyCisjZGVmaW5lIElTUl9SWE9LCTB4MDAwMDAwMDEKKworI2RlZmluZSBUWENGR19DU0kJMHg4MDAwMDAwMAorI2RlZmluZSBUWENGR19IQkkJMHg0MDAwMDAwMAorI2RlZmluZSBUWENGR19NTEIJMHgyMDAwMDAwMAorI2RlZmluZSBUWENGR19BVFAJMHgxMDAwMDAwMAorI2RlZmluZSBUWENGR19FQ1JFVFJZCTB4MDA4MDAwMDAKKyNkZWZpbmUgVFhDRkdfQlJTVF9ESVMJMHgwMDA4MDAwMAorI2RlZmluZSBUWENGR19NWERNQTEwMjQJMHgwMDAwMDAwMAorI2RlZmluZSBUWENGR19NWERNQTUxMgkweDAwNzAwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BMjU2CTB4MDA2MDAwMDAKKyNkZWZpbmUgVFhDRkdfTVhETUExMjgJMHgwMDUwMDAwMAorI2RlZmluZSBUWENGR19NWERNQTY0CTB4MDA0MDAwMDAKKyNkZWZpbmUgVFhDRkdfTVhETUEzMgkweDAwMzAwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BMTYJMHgwMDIwMDAwMAorI2RlZmluZSBUWENGR19NWERNQTgJMHgwMDEwMDAwMAorCisjZGVmaW5lIENGR19MTktTVFMJMHg4MDAwMDAwMAorI2RlZmluZSBDRkdfU1BEU1RTCTB4NjAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1NQRFNUUzEJMHg0MDAwMDAwMAorI2RlZmluZSBDRkdfU1BEU1RTMAkweDIwMDAwMDAwCisjZGVmaW5lIENGR19EVVBTVFMJMHgxMDAwMDAwMAorI2RlZmluZSBDRkdfVEJJX0VOCTB4MDEwMDAwMDAKKyNkZWZpbmUgQ0ZHX01PREVfMTAwMAkweDAwNDAwMDAwCisvKiBSYW1pdCA6IERvbnQnIGV2ZXIgdXNlIEFVVE9fMTAwMCwgaXQgbmV2ZXIgd29ya3MgYW5kIGlzIGJ1Z2d5LgorICogUmVhZCB0aGUgUGh5IHJlc3BvbnNlIGFuZCB0aGVuIGNvbmZpZ3VyZSB0aGUgTUFDIGFjY29yZGluZ2x5ICovCisjZGVmaW5lIENGR19BVVRPXzEwMDAJMHgwMDIwMDAwMAorI2RlZmluZSBDRkdfUElOVF9DVEwJMHgwMDFjMDAwMAorI2RlZmluZSBDRkdfUElOVF9EVVBTVFMJMHgwMDEwMDAwMAorI2RlZmluZSBDRkdfUElOVF9MTktTVFMJMHgwMDA4MDAwMAorI2RlZmluZSBDRkdfUElOVF9TUERTVFMJMHgwMDA0MDAwMAorI2RlZmluZSBDRkdfVE1SVEVTVAkweDAwMDIwMDAwCisjZGVmaW5lIENGR19NUk1fRElTCTB4MDAwMTAwMDAKKyNkZWZpbmUgQ0ZHX01XSV9ESVMJMHgwMDAwODAwMAorI2RlZmluZSBDRkdfVDY0QUREUgkweDAwMDA0MDAwCisjZGVmaW5lIENGR19QQ0k2NF9ERVQJMHgwMDAwMjAwMAorI2RlZmluZSBDRkdfREFUQTY0X0VOCTB4MDAwMDEwMDAKKyNkZWZpbmUgQ0ZHX002NEFERFIJMHgwMDAwMDgwMAorI2RlZmluZSBDRkdfUEhZX1JTVAkweDAwMDAwNDAwCisjZGVmaW5lIENGR19QSFlfRElTCTB4MDAwMDAyMDAKKyNkZWZpbmUgQ0ZHX0VYVFNUU19FTgkweDAwMDAwMTAwCisjZGVmaW5lIENGR19SRVFBTEcJMHgwMDAwMDA4MAorI2RlZmluZSBDRkdfU0IJCTB4MDAwMDAwNDAKKyNkZWZpbmUgQ0ZHX1BPVwkJMHgwMDAwMDAyMAorI2RlZmluZSBDRkdfRVhECQkweDAwMDAwMDEwCisjZGVmaW5lIENGR19QRVNFTAkweDAwMDAwMDA4CisjZGVmaW5lIENGR19CUk9NX0RJUwkweDAwMDAwMDA0CisjZGVmaW5lIENGR19FWFRfMTI1CTB4MDAwMDAwMDIKKyNkZWZpbmUgQ0ZHX0JFTQkJMHgwMDAwMDAwMQorCisjZGVmaW5lIEVYVFNUU19VRFBQS1QJMHgwMDIwMDAwMAorI2RlZmluZSBFWFRTVFNfVENQUEtUCTB4MDAwODAwMDAKKyNkZWZpbmUgRVhUU1RTX0lQUEtUCTB4MDAwMjAwMDAKKyNkZWZpbmUgRVhUU1RTX1ZQS1QJMHgwMDAxMDAwMAorI2RlZmluZSBFWFRTVFNfVlRHX01BU0sJMHgwMDAwZmZmZgorCisjZGVmaW5lIFNQRFNUU19QT0xBUklUWQkoQ0ZHX1NQRFNUUzEgfCBDRkdfU1BEU1RTMCB8IENGR19EVVBTVFMgfCAobG5rc3RzID8gQ0ZHX0xOS1NUUyA6IDApKQorCisjZGVmaW5lIE1JQkNfTUlCUwkweDAwMDAwMDA4CisjZGVmaW5lIE1JQkNfQUNMUgkweDAwMDAwMDA0CisjZGVmaW5lIE1JQkNfRlJaCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUlCQ19XUk4JMHgwMDAwMDAwMQorCisjZGVmaW5lIFBDUl9QU0VOCSgxIDw8IDMxKQorI2RlZmluZSBQQ1JfUFNfTUNBU1QJKDEgPDwgMzApCisjZGVmaW5lIFBDUl9QU19EQQkoMSA8PCAyOSkKKyNkZWZpbmUgUENSX1NUSElfOAkoMyA8PCAyMykKKyNkZWZpbmUgUENSX1NUTE9fNAkoMSA8PCAyMykKKyNkZWZpbmUgUENSX0ZGSElfOEsJKDMgPDwgMjEpCisjZGVmaW5lIFBDUl9GRkxPXzRLCSgxIDw8IDIxKQorI2RlZmluZSBQQ1JfUEFVU0VfQ05UCTB4RkZGRQorCisjZGVmaW5lIFJYQ0ZHX0FFUAkweDgwMDAwMDAwCisjZGVmaW5lIFJYQ0ZHX0FSUAkweDQwMDAwMDAwCisjZGVmaW5lIFJYQ0ZHX1NUUklQQ1JDCTB4MjAwMDAwMDAKKyNkZWZpbmUgUlhDRkdfUlhfRkQJMHgxMDAwMDAwMAorI2RlZmluZSBSWENGR19BTFAJMHgwODAwMDAwMAorI2RlZmluZSBSWENGR19BSVJMCTB4MDQwMDAwMDAKKyNkZWZpbmUgUlhDRkdfTVhETUE1MTIJMHgwMDcwMDAwMAorI2RlZmluZSBSWENGR19EUlRICTB4MDAwMDAwM2UKKyNkZWZpbmUgUlhDRkdfRFJUSDAJMHgwMDAwMDAwMgorCisjZGVmaW5lIFJGQ1JfUkZFTgkweDgwMDAwMDAwCisjZGVmaW5lIFJGQ1JfQUFCCTB4NDAwMDAwMDAKKyNkZWZpbmUgUkZDUl9BQU0JMHgyMDAwMDAwMAorI2RlZmluZSBSRkNSX0FBVQkweDEwMDAwMDAwCisjZGVmaW5lIFJGQ1JfQVBNCTB4MDgwMDAwMDAKKyNkZWZpbmUgUkZDUl9BUEFUCTB4MDc4MDAwMDAKKyNkZWZpbmUgUkZDUl9BUEFUMwkweDA0MDAwMDAwCisjZGVmaW5lIFJGQ1JfQVBBVDIJMHgwMjAwMDAwMAorI2RlZmluZSBSRkNSX0FQQVQxCTB4MDEwMDAwMDAKKyNkZWZpbmUgUkZDUl9BUEFUMAkweDAwODAwMDAwCisjZGVmaW5lIFJGQ1JfQUFSUAkweDAwNDAwMDAwCisjZGVmaW5lIFJGQ1JfTUhFTgkweDAwMjAwMDAwCisjZGVmaW5lIFJGQ1JfVUhFTgkweDAwMTAwMDAwCisjZGVmaW5lIFJGQ1JfVUxNCTB4MDAwODAwMDAKKworI2RlZmluZSBWUkNSX1JVRFBFCTB4MDAwMDAwODAKKyNkZWZpbmUgVlJDUl9SVENQRQkweDAwMDAwMDQwCisjZGVmaW5lIFZSQ1JfUklQRQkweDAwMDAwMDIwCisjZGVmaW5lIFZSQ1JfSVBFTgkweDAwMDAwMDEwCisjZGVmaW5lIFZSQ1JfRFVURgkweDAwMDAwMDA4CisjZGVmaW5lIFZSQ1JfRFZURgkweDAwMDAwMDA0CisjZGVmaW5lIFZSQ1JfVlRSRU4JMHgwMDAwMDAwMgorI2RlZmluZSBWUkNSX1ZUREVOCTB4MDAwMDAwMDEKKworI2RlZmluZSBWVENSX1BQQ0hLCTB4MDAwMDAwMDgKKyNkZWZpbmUgVlRDUl9HQ0hLCTB4MDAwMDAwMDQKKyNkZWZpbmUgVlRDUl9WUFBUSQkweDAwMDAwMDAyCisjZGVmaW5lIFZUQ1JfVkdUSQkweDAwMDAwMDAxCisKKyNkZWZpbmUgQ1IJCTB4MDAKKyNkZWZpbmUgQ0ZHCQkweDA0CisjZGVmaW5lIE1FQVIJCTB4MDgKKyNkZWZpbmUgUFRTQ1IJCTB4MGMKKyNkZWZpbmUJSVNSCQkweDEwCisjZGVmaW5lCUlNUgkJMHgxNAorI2RlZmluZQlJRVIJCTB4MTgKKyNkZWZpbmUJSUhSCQkweDFjCisjZGVmaW5lIFRYRFAJCTB4MjAKKyNkZWZpbmUgVFhEUF9ISQkJMHgyNAorI2RlZmluZSBUWENGRwkJMHgyOAorI2RlZmluZSBHUElPUgkJMHgyYworI2RlZmluZSBSWERQCQkweDMwCisjZGVmaW5lIFJYRFBfSEkJCTB4MzQKKyNkZWZpbmUgUlhDRkcJCTB4MzgKKyNkZWZpbmUgUFFDUgkJMHgzYworI2RlZmluZSBXQ1NSCQkweDQwCisjZGVmaW5lIFBDUgkJMHg0NAorI2RlZmluZSBSRkNSCQkweDQ4CisjZGVmaW5lIFJGRFIJCTB4NGMKKworI2RlZmluZSBTUlIJCTB4NTgKKworI2RlZmluZSBWUkNSCQkweGJjCisjZGVmaW5lIFZUQ1IJCTB4YzAKKyNkZWZpbmUgVkRSCQkweGM0CisjZGVmaW5lIENDU1IJCTB4Y2MKKworI2RlZmluZSBUQklDUgkJMHhlMAorI2RlZmluZSBUQklTUgkJMHhlNAorI2RlZmluZSBUQU5BUgkJMHhlOAorI2RlZmluZSBUQU5MUEFSCQkweGVjCisjZGVmaW5lIFRBTkVSCQkweGYwCisjZGVmaW5lIFRFU1IJCTB4ZjQKKworI2RlZmluZSBUQklDUl9NUl9BTl9FTkFCTEUJMHgwMDAwMTAwMAorI2RlZmluZSBUQklDUl9NUl9SRVNUQVJUX0FOCTB4MDAwMDAyMDAKKworI2RlZmluZSBUQklTUl9NUl9MSU5LX1NUQVRVUwkweDAwMDAwMDIwCisjZGVmaW5lIFRCSVNSX01SX0FOX0NPTVBMRVRFCTB4MDAwMDAwMDQKKworI2RlZmluZSBUQU5BUl9QUzIgCQkweDAwMDAwMTAwCisjZGVmaW5lIFRBTkFSX1BTMSAJCTB4MDAwMDAwODAKKyNkZWZpbmUgVEFOQVJfSEFMRl9EVVAgCQkweDAwMDAwMDQwCisjZGVmaW5lIFRBTkFSX0ZVTExfRFVQIAkJMHgwMDAwMDAyMAorCisjZGVmaW5lIEdQSU9SX0dQNV9PRQkJMHgwMDAwMDIwMAorI2RlZmluZSBHUElPUl9HUDRfT0UJCTB4MDAwMDAxMDAKKyNkZWZpbmUgR1BJT1JfR1AzX09FCQkweDAwMDAwMDgwCisjZGVmaW5lIEdQSU9SX0dQMl9PRQkJMHgwMDAwMDA0MAorI2RlZmluZSBHUElPUl9HUDFfT0UJCTB4MDAwMDAwMjAKKyNkZWZpbmUgR1BJT1JfR1AzX09VVAkJMHgwMDAwMDAwNAorI2RlZmluZSBHUElPUl9HUDFfT1VUCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgTElOS19BVVRPTkVHT1RJQVRFCTB4MDEKKyNkZWZpbmUgTElOS19ET1dOCQkweDAyCisjZGVmaW5lIExJTktfVVAJCQkweDA0CisKKyNpZmRlZiBVU0VfNjRCSVRfQUREUgorI2RlZmluZSBIV19BRERSX0xFTgk4CisjZGVmaW5lIGRlc2NfYWRkcl9zZXQoZGVzYywgYWRkcikJCQkJXAorCWRvIHsJCQkJCQkJXAorCQl1NjQgX19hZGRyID0gKGFkZHIpOwkJCQlcCisJCShkZXNjKVswXSA9IGNwdV90b19sZTMyKF9fYWRkcik7CQlcCisJCShkZXNjKVsxXSA9IGNwdV90b19sZTMyKF9fYWRkciA+PiAzMik7CQlcCisJfSB3aGlsZSgwKQorI2RlZmluZSBkZXNjX2FkZHJfZ2V0KGRlc2MpCQkJCQlcCisJCSgoKHU2NClsZTMyX3RvX2NwdSgoZGVzYylbMV0pIDw8IDMyKQkJXAorCQkgICAgIHwgbGUzMl90b19jcHUoKGRlc2MpWzBdKSkKKyNlbHNlCisjZGVmaW5lIEhXX0FERFJfTEVOCTQKKyNkZWZpbmUgZGVzY19hZGRyX3NldChkZXNjLCBhZGRyKQkoKGRlc2MpWzBdID0gY3B1X3RvX2xlMzIoYWRkcikpCisjZGVmaW5lIGRlc2NfYWRkcl9nZXQoZGVzYykJCShsZTMyX3RvX2NwdSgoZGVzYylbMF0pKQorI2VuZGlmCisKKyNkZWZpbmUgREVTQ19MSU5LCQkwCisjZGVmaW5lIERFU0NfQlVGUFRSCQkoREVTQ19MSU5LICsgSFdfQUREUl9MRU4vNCkKKyNkZWZpbmUgREVTQ19DTURTVFMJCShERVNDX0JVRlBUUiArIEhXX0FERFJfTEVOLzQpCisjZGVmaW5lIERFU0NfRVhUU1RTCQkoREVTQ19DTURTVFMgKyA0LzQpCisKKyNkZWZpbmUgQ01EU1RTX09XTgkweDgwMDAwMDAwCisjZGVmaW5lIENNRFNUU19NT1JFCTB4NDAwMDAwMDAKKyNkZWZpbmUgQ01EU1RTX0lOVFIJMHgyMDAwMDAwMAorI2RlZmluZSBDTURTVFNfRVJSCTB4MTAwMDAwMDAKKyNkZWZpbmUgQ01EU1RTX09LCTB4MDgwMDAwMDAKKyNkZWZpbmUgQ01EU1RTX1JVTlQJMHgwMDIwMDAwMAorI2RlZmluZSBDTURTVFNfTEVOX01BU0sJMHgwMDAwZmZmZgorCisjZGVmaW5lIENNRFNUU19ERVNUX01BU0sJMHgwMTgwMDAwMAorI2RlZmluZSBDTURTVFNfREVTVF9TRUxGCTB4MDA4MDAwMDAKKyNkZWZpbmUgQ01EU1RTX0RFU1RfTVVMVEkJMHgwMTAwMDAwMAorCisjZGVmaW5lIERFU0NfU0laRQk4CQkvKiBTaG91bGQgYmUgY2FjaGUgbGluZSBzaXplZCAqLworCitzdHJ1Y3QgcnhfaW5mbyB7CisJc3BpbmxvY2tfdAlsb2NrOworCWludAkJdXA7CisJbG9uZwkJaWRsZTsKKworCXN0cnVjdCBza19idWZmCSpza2JzW05SX1JYX0RFU0NdOworCisJdTMyCQkqbmV4dF9yeF9kZXNjOworCXUxNgkJbmV4dF9yeCwgbmV4dF9lbXB0eTsKKworCXUzMgkJKmRlc2NzOworCWRtYV9hZGRyX3QJcGh5X2Rlc2NzOworfTsKKworCitzdHJ1Y3QgbnM4MzgyMCB7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisJdTgJCQlfX2lvbWVtICpiYXNlOworCisJc3RydWN0IHBjaV9kZXYJCSpwY2lfZGV2OworCisjaWZkZWYgTlM4MzgyMF9WTEFOX0FDQ0VMX1NVUFBPUlQKKwlzdHJ1Y3Qgdmxhbl9ncm91cAkqdmxncnA7CisjZW5kaWYKKworCXN0cnVjdCByeF9pbmZvCQlyeF9pbmZvOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlyeF90YXNrbGV0OworCisJdW5zaWduZWQJCWlocjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdHFfcmVmaWxsOworCisJLyogcHJvdGVjdHMgZXZlcnl0aGluZyBiZWxvdy4gIGlycXNhdmUgd2hlbiB1c2luZy4gKi8KKwlzcGlubG9ja190CQltaXNjX2xvY2s7CisKKwl1MzIJCQlDRkdfY2FjaGU7CisKKwl1MzIJCQlNRUFSX2NhY2hlOworCXUzMgkJCUlNUl9jYWNoZTsKKwlzdHJ1Y3QgZWVwcm9tCQllZTsKKworCXVuc2lnbmVkCQlsaW5rc3RhdGU7CisKKwlzcGlubG9ja190CXR4X2xvY2s7CisKKwl1MTYJCXR4X2RvbmVfaWR4OworCXUxNgkJdHhfaWR4OworCXZvbGF0aWxlIHUxNgl0eF9mcmVlX2lkeDsJLyogaWR4IG9mIGZyZWUgZGVzYyBjaGFpbiAqLworCXUxNgkJdHhfaW50cl9pZHg7CisKKwlhdG9taWNfdAlucl90eF9za2JzOworCXN0cnVjdCBza19idWZmCSp0eF9za2JzW05SX1RYX0RFU0NdOworCisJY2hhcgkJcGFkWzE2XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOworCXUzMgkJKnR4X2Rlc2NzOworCWRtYV9hZGRyX3QJdHhfcGh5X2Rlc2NzOworCisJc3RydWN0IHRpbWVyX2xpc3QJdHhfd2F0Y2hkb2c7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuczgzODIwICpQUklWKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIG5ldGRldl9wcml2KGRldik7Cit9CisKKyNkZWZpbmUgX19raWNrX3J4KGRldikJd3JpdGVsKENSX1JYRSwgZGV2LT5iYXNlICsgQ1IpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBraWNrX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCWRwcmludGsoImtpY2tfcng6IG1heWJlIGtpY2tpbmdcbiIpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJmRldi0+cnhfaW5mby5pZGxlKSkgeworCQlkcHJpbnRrKCJhY3R1YWxseSBraWNraW5nXG4iKTsKKwkJd3JpdGVsKGRldi0+cnhfaW5mby5waHlfZGVzY3MgKworCQkJKDQgKiBERVNDX1NJWkUgKiBkZXYtPnJ4X2luZm8ubmV4dF9yeCksCisJCSAgICAgICBkZXYtPmJhc2UgKyBSWERQKTsKKwkJaWYgKGRldi0+cnhfaW5mby5uZXh0X3J4ID09IGRldi0+cnhfaW5mby5uZXh0X2VtcHR5KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1aC1vaDogbmV4dF9yeCA9PSBuZXh0X2VtcHR5Pz8/XG4iLAorCQkJCW5kZXYtPm5hbWUpOworCQlfX2tpY2tfcngoZGV2KTsKKwl9Cit9CisKKy8vZnJlZSA9ICh0eF9kb25lX2lkeCArIE5SX1RYX0RFU0MtMiAtIGZyZWVfaWR4KSAlIE5SX1RYX0RFU0MKKyNkZWZpbmUgc3RhcnRfdHhfb2theShkZXYpCVwKKwkoKChOUl9UWF9ERVNDLTIgKyBkZXYtPnR4X2RvbmVfaWR4IC0gZGV2LT50eF9mcmVlX2lkeCkgJSBOUl9UWF9ERVNDKSA+IE1JTl9UWF9ERVNDX0ZSRUUpCisKKworI2lmZGVmIE5TODM4MjBfVkxBTl9BQ0NFTF9TVVBQT1JUIAorc3RhdGljIHZvaWQgbnM4MzgyMF92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCisJc3Bpbl9sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCXNwaW5fbG9jaygmZGV2LT50eF9sb2NrKTsKKworCWRldi0+dmxncnAgPSBncnA7CisKKwlzcGluX3VubG9jaygmZGV2LT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCit7CisJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7CisKKwlzcGluX2xvY2tfaXJxKCZkZXYtPm1pc2NfbG9jayk7CisJc3Bpbl9sb2NrKCZkZXYtPnR4X2xvY2spOworCWlmIChkZXYtPnZsZ3JwKQorCQlkZXYtPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmRldi0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPm1pc2NfbG9jayk7Cit9CisjZW5kaWYKKworLyogUGFja2V0IFJlY2VpdmVyCisgKgorICogVGhlIGhhcmR3YXJlIHN1cHBvcnRzIGxpbmtlZCBsaXN0cyBvZiByZWNlaXZlIGRlc2NyaXB0b3JzIGZvcgorICogd2hpY2ggb3duZXJzaGlwIGlzIHRyYW5zZmVyZWQgYmFjayBhbmQgZm9ydGggYnkgbWVhbnMgb2YgYW4KKyAqIG93bmVyc2hpcCBiaXQuICBXaGlsZSB0aGUgaGFyZHdhcmUgZG9lcyBzdXBwb3J0IHRoZSB1c2Ugb2YgYQorICogcmluZyBmb3IgcmVjZWl2ZSBkZXNjcmlwdG9ycywgd2Ugb25seSBtYWtlIHVzZSBvZiBhIGNoYWluIGluCisgKiBhbiBhdHRlbXB0IHRvIHJlZHVjZSBidXMgdHJhZmZpYyB1bmRlciBoZWF2eSBsb2FkIHNjZW5hcmlvcy4KKyAqIFRoaXMgd2lsbCBhbHNvIG1ha2UgYnVncyBhIGJpdCBtb3JlIG9idmlvdXMuICBUaGUgY3VycmVudCBjb2RlCisgKiBvbmx5IG1ha2VzIHVzZSBvZiBhIHNpbmdsZSByeCBjaGFpbjsgSSBob3BlIHRvIGltcGxlbWVudAorICogcHJpb3JpdHkgYmFzZWQgcnggZm9yIHZlcnNpb24gMS4wLiAgR29hbDogZXZlbiB1bmRlciBvdmVybG9hZAorICogY29uZGl0aW9ucywgc3RpbGwgcm91dGUgcmVhbHRpbWUgdHJhZmZpYyB3aXRoIGFzIGxvdyBqaXR0ZXIgYXMKKyAqIHBvc3NpYmxlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYnVpbGRfcnhfZGVzYyhzdHJ1Y3QgbnM4MzgyMCAqZGV2LCB1MzIgKmRlc2MsIGRtYV9hZGRyX3QgbGluaywgZG1hX2FkZHJfdCBidWYsIHUzMiBjbWRzdHMsIHUzMiBleHRzdHMpCit7CisJZGVzY19hZGRyX3NldChkZXNjICsgREVTQ19MSU5LLCBsaW5rKTsKKwlkZXNjX2FkZHJfc2V0KGRlc2MgKyBERVNDX0JVRlBUUiwgYnVmKTsKKwlkZXNjW0RFU0NfRVhUU1RTXSA9IGNwdV90b19sZTMyKGV4dHN0cyk7CisJbWIoKTsKKwlkZXNjW0RFU0NfQ01EU1RTXSA9IGNwdV90b19sZTMyKGNtZHN0cyk7Cit9CisKKyNkZWZpbmUgbnJfcnhfZW1wdHkoZGV2KSAoKE5SX1JYX0RFU0MtMiArIGRldi0+cnhfaW5mby5uZXh0X3J4IC0gZGV2LT5yeF9pbmZvLm5leHRfZW1wdHkpICUgTlJfUlhfREVTQykKK3N0YXRpYyBpbmxpbmUgaW50IG5zODM4MjBfYWRkX3J4X3NrYihzdHJ1Y3QgbnM4MzgyMCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuc2lnbmVkIG5leHRfZW1wdHk7CisJdTMyIGNtZHN0czsKKwl1MzIgKnNnOworCWRtYV9hZGRyX3QgYnVmOworCisJbmV4dF9lbXB0eSA9IGRldi0+cnhfaW5mby5uZXh0X2VtcHR5OworCisJLyogZG9uJ3Qgb3ZlcnJ1biBsYXN0IHJ4IG1hcmtlciAqLworCWlmICh1bmxpa2VseShucl9yeF9lbXB0eShkZXYpIDw9IDIpKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMTsKKwl9CisKKyNpZiAwCisJZHByaW50aygibmV4dF9lbXB0eVslZF0gbnJfdXNlZFslZF0gbmV4dF9yeFslZF1cbiIsCisJCWRldi0+cnhfaW5mby5uZXh0X2VtcHR5LAorCQlkZXYtPnJ4X2luZm8ubnJfdXNlZCwKKwkJZGV2LT5yeF9pbmZvLm5leHRfcngKKwkJKTsKKyNlbmRpZgorCisJc2cgPSBkZXYtPnJ4X2luZm8uZGVzY3MgKyAobmV4dF9lbXB0eSAqIERFU0NfU0laRSk7CisJaWYgKHVubGlrZWx5KE5VTEwgIT0gZGV2LT5yeF9pbmZvLnNrYnNbbmV4dF9lbXB0eV0pKQorCQlCVUcoKTsKKwlkZXYtPnJ4X2luZm8uc2tic1tuZXh0X2VtcHR5XSA9IHNrYjsKKworCWRldi0+cnhfaW5mby5uZXh0X2VtcHR5ID0gKG5leHRfZW1wdHkgKyAxKSAlIE5SX1JYX0RFU0M7CisJY21kc3RzID0gUkVBTF9SWF9CVUZfU0laRSB8IENNRFNUU19JTlRSOworCWJ1ZiA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGNpX2Rldiwgc2tiLT50YWlsLAorCQkJICAgICBSRUFMX1JYX0JVRl9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWJ1aWxkX3J4X2Rlc2MoZGV2LCBzZywgMCwgYnVmLCBjbWRzdHMsIDApOworCS8qIHVwZGF0ZSBsaW5rIG9mIHByZXZpb3VzIHJ4ICovCisJaWYgKGxpa2VseShuZXh0X2VtcHR5ICE9IGRldi0+cnhfaW5mby5uZXh0X3J4KSkKKwkJZGV2LT5yeF9pbmZvLmRlc2NzWygoTlJfUlhfREVTQyArIG5leHRfZW1wdHkgLSAxKSAlIE5SX1JYX0RFU0MpICogREVTQ19TSVpFXSA9IGNwdV90b19sZTMyKGRldi0+cnhfaW5mby5waHlfZGVzY3MgKyAobmV4dF9lbXB0eSAqIERFU0NfU0laRSAqIDQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCByeF9yZWZpbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGludCBnZnApCit7CisJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCWlmICh1bmxpa2VseShucl9yeF9lbXB0eShkZXYpIDw9IDIpKQorCQlyZXR1cm4gMDsKKworCWRwcmludGsoInJ4X3JlZmlsbCglcClcbiIsIG5kZXYpOworCWlmIChnZnAgPT0gR0ZQX0FUT01JQykKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cnhfaW5mby5sb2NrLCBmbGFncyk7CisJZm9yIChpPTA7IGk8TlJfUlhfREVTQzsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWxvbmcgcmVzOworCQkvKiBleHRyYSAxNiBieXRlcyBmb3IgYWxpZ25tZW50ICovCisJCXNrYiA9IF9fZGV2X2FsbG9jX3NrYihSRUFMX1JYX0JVRl9TSVpFKzE2LCBnZnApOworCQlpZiAodW5saWtlbHkoIXNrYikpCisJCQlicmVhazsKKworCQlyZXMgPSAobG9uZylza2ItPnRhaWwgJiAweGY7CisJCXJlcyA9IDB4MTAgLSByZXM7CisJCXJlcyAmPSAweGY7CisJCXNrYl9yZXNlcnZlKHNrYiwgcmVzKTsKKworCQlza2ItPmRldiA9IG5kZXY7CisJCWlmIChnZnAgIT0gR0ZQX0FUT01JQykKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJ4X2luZm8ubG9jaywgZmxhZ3MpOworCQlyZXMgPSBuczgzODIwX2FkZF9yeF9za2IoZGV2LCBza2IpOworCQlpZiAoZ2ZwICE9IEdGUF9BVE9NSUMpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJ4X2luZm8ubG9jaywgZmxhZ3MpOworCQlpZiAocmVzKSB7CisJCQlpID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChnZnAgPT0gR0ZQX0FUT01JQykKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5yeF9pbmZvLmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBpID8gMCA6IC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RDQUxMKHJ4X3JlZmlsbF9hdG9taWMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpKTsKK3N0YXRpYyB2b2lkIGZhc3RjYWxsIHJ4X3JlZmlsbF9hdG9taWMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJcnhfcmVmaWxsKG5kZXYsIEdGUF9BVE9NSUMpOworfQorCisvKiBSRUZJTEwgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBxdWV1ZV9yZWZpbGwodm9pZCAqX2RldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IF9kZXY7CisJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7CisKKwlyeF9yZWZpbGwobmRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldi0+cnhfaW5mby51cCkKKwkJa2lja19yeChuZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3J4X2Rlc2Moc3RydWN0IG5zODM4MjAgKmRldiwgdW5zaWduZWQgaSkKK3sKKwlidWlsZF9yeF9kZXNjKGRldiwgZGV2LT5yeF9pbmZvLmRlc2NzICsgKERFU0NfU0laRSAqIGkpLCAwLCAwLCBDTURTVFNfT1dOLCAwKTsKK30KKworc3RhdGljIHZvaWQgRkFTVENBTEwocGh5X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpKTsKK3N0YXRpYyB2b2lkIGZhc3RjYWxsIHBoeV9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCXN0YXRpYyBjaGFyICpzcGVlZHNbXSA9IHsgIjEwIiwgIjEwMCIsICIxMDAwIiwgIjEwMDAoPykiLCAiMTAwMEYiIH07CisJdTMyIGNmZywgbmV3X2NmZzsKKwl1MzIgdGJpc3IsIHRhbmFyLCB0YW5scGFyOworCWludCBzcGVlZCwgZnVsbGR1cGxleCwgbmV3bGlua3N0YXRlOworCisJY2ZnID0gcmVhZGwoZGV2LT5iYXNlICsgQ0ZHKSBeIFNQRFNUU19QT0xBUklUWTsKKworCWlmIChkZXYtPkNGR19jYWNoZSAmIENGR19UQklfRU4pIHsKKwkJLyogd2UgaGF2ZSBhbiBvcHRpY2FsIHRyYW5zY2VpdmVyICovCisJCXRiaXNyID0gcmVhZGwoZGV2LT5iYXNlICsgVEJJU1IpOworCQl0YW5hciA9IHJlYWRsKGRldi0+YmFzZSArIFRBTkFSKTsKKwkJdGFubHBhciA9IHJlYWRsKGRldi0+YmFzZSArIFRBTkxQQVIpOworCQlkcHJpbnRrKCJwaHlfaW50cjogdGJpc3I9JTA4eCwgdGFuYXI9JTA4eCwgdGFubHBhcj0lMDh4XG4iLAorCQkJdGJpc3IsIHRhbmFyLCB0YW5scGFyKTsKKworCQlpZiAoIChmdWxsZHVwbGV4ID0gKHRhbmxwYXIgJiBUQU5BUl9GVUxMX0RVUCkKKwkJICAgICAgJiYgKHRhbmFyICYgVEFOQVJfRlVMTF9EVVApKSApIHsKKworCQkJLyogYm90aCBvZiB1cyBhcmUgZnVsbCBkdXBsZXggKi8KKwkJCXdyaXRlbChyZWFkbChkZXYtPmJhc2UgKyBUWENGRykKKwkJCSAgICAgICB8IFRYQ0ZHX0NTSSB8IFRYQ0ZHX0hCSSB8IFRYQ0ZHX0FUUCwKKwkJCSAgICAgICBkZXYtPmJhc2UgKyBUWENGRyk7CisJCQl3cml0ZWwocmVhZGwoZGV2LT5iYXNlICsgUlhDRkcpIHwgUlhDRkdfUlhfRkQsCisJCQkgICAgICAgZGV2LT5iYXNlICsgUlhDRkcpOworCQkJLyogTGlnaHQgdXAgZnVsbCBkdXBsZXggTEVEICovCisJCQl3cml0ZWwocmVhZGwoZGV2LT5iYXNlICsgR1BJT1IpIHwgR1BJT1JfR1AxX09VVCwKKwkJCSAgICAgICBkZXYtPmJhc2UgKyBHUElPUik7CisKKwkJfSBlbHNlIGlmKCgodGFubHBhciAmIFRBTkFSX0hBTEZfRFVQKQorCQkJICAgJiYgKHRhbmFyICYgVEFOQVJfSEFMRl9EVVApKQorCQkJfHwgKCh0YW5scGFyICYgVEFOQVJfRlVMTF9EVVApCisJCQkgICAgJiYgKHRhbmFyICYgVEFOQVJfSEFMRl9EVVApKQorCQkJfHwgKCh0YW5scGFyICYgVEFOQVJfSEFMRl9EVVApCisJCQkgICAgJiYgKHRhbmFyICYgVEFOQVJfRlVMTF9EVVApKSkgeworCisJCQkvKiBvbmUgb3IgYm90aCBvZiB1cyBhcmUgaGFsZiBkdXBsZXggKi8KKwkJCXdyaXRlbCgocmVhZGwoZGV2LT5iYXNlICsgVFhDRkcpCisJCQkJJiB+KFRYQ0ZHX0NTSSB8IFRYQ0ZHX0hCSSkpIHwgVFhDRkdfQVRQLAorCQkJICAgICAgIGRldi0+YmFzZSArIFRYQ0ZHKTsKKwkJCXdyaXRlbChyZWFkbChkZXYtPmJhc2UgKyBSWENGRykgJiB+UlhDRkdfUlhfRkQsCisJCQkgICAgICAgZGV2LT5iYXNlICsgUlhDRkcpOworCQkJLyogVHVybiBvZmYgZnVsbCBkdXBsZXggTEVEICovCisJCQl3cml0ZWwocmVhZGwoZGV2LT5iYXNlICsgR1BJT1IpICYgfkdQSU9SX0dQMV9PVVQsCisJCQkgICAgICAgZGV2LT5iYXNlICsgR1BJT1IpOworCQl9CisKKwkJc3BlZWQgPSA0OyAvKiAxMDAwRiAqLworCisJfSBlbHNlIHsKKwkJLyogd2UgaGF2ZSBhIGNvcHBlciB0cmFuc2NlaXZlciAqLworCQluZXdfY2ZnID0gZGV2LT5DRkdfY2FjaGUgJiB+KENGR19TQiB8IENGR19NT0RFXzEwMDAgfCBDRkdfU1BEU1RTKTsKKworCQlpZiAoY2ZnICYgQ0ZHX1NQRFNUUzEpCisJCQluZXdfY2ZnIHw9IENGR19NT0RFXzEwMDA7CisJCWVsc2UKKwkJCW5ld19jZmcgJj0gfkNGR19NT0RFXzEwMDA7CisKKwkJc3BlZWQgPSAoKGNmZyAvIENGR19TUERTVFMwKSAmIDMpOworCQlmdWxsZHVwbGV4ID0gKGNmZyAmIENGR19EVVBTVFMpOworCisJCWlmIChmdWxsZHVwbGV4KQorCQkJbmV3X2NmZyB8PSBDRkdfU0I7CisKKwkJaWYgKChjZmcgJiBDRkdfTE5LU1RTKSAmJgorCQkgICAgKChuZXdfY2ZnIF4gZGV2LT5DRkdfY2FjaGUpICYgQ0ZHX01PREVfMTAwMCkpIHsKKwkJCXdyaXRlbChuZXdfY2ZnLCBkZXYtPmJhc2UgKyBDRkcpOworCQkJZGV2LT5DRkdfY2FjaGUgPSBuZXdfY2ZnOworCQl9CisKKwkJZGV2LT5DRkdfY2FjaGUgJj0gfkNGR19TUERTVFM7CisJCWRldi0+Q0ZHX2NhY2hlIHw9IGNmZyAmIENGR19TUERTVFM7CisJfQorCisJbmV3bGlua3N0YXRlID0gKGNmZyAmIENGR19MTktTVFMpID8gTElOS19VUCA6IExJTktfRE9XTjsKKworCWlmIChuZXdsaW5rc3RhdGUgJiBMSU5LX1VQCisJICAgICYmIGRldi0+bGlua3N0YXRlICE9IG5ld2xpbmtzdGF0ZSkgeworCQluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgbm93ICVzIG1icHMsICVzIGR1cGxleCBhbmQgdXAuXG4iLAorCQkJbmRldi0+bmFtZSwKKwkJCXNwZWVkc1tzcGVlZF0sCisJCQlmdWxsZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKTsKKwl9IGVsc2UgaWYgKG5ld2xpbmtzdGF0ZSAmIExJTktfRE9XTgorCQkgICAmJiBkZXYtPmxpbmtzdGF0ZSAhPSBuZXdsaW5rc3RhdGUpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgbm93IGRvd24uXG4iLCBuZGV2LT5uYW1lKTsKKwl9CisKKwlkZXYtPmxpbmtzdGF0ZSA9IG5ld2xpbmtzdGF0ZTsKK30KKworc3RhdGljIGludCBuczgzODIwX3NldHVwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCXVuc2lnbmVkIGk7CisJaW50IHJldDsKKworCWRwcmludGsoIm5zODM4MjBfc2V0dXBfcngoJXApXG4iLCBuZGV2KTsKKworCWRldi0+cnhfaW5mby5pZGxlID0gMTsKKwlkZXYtPnJ4X2luZm8ubmV4dF9yeCA9IDA7CisJZGV2LT5yeF9pbmZvLm5leHRfcnhfZGVzYyA9IGRldi0+cnhfaW5mby5kZXNjczsKKwlkZXYtPnJ4X2luZm8ubmV4dF9lbXB0eSA9IDA7CisKKwlmb3IgKGk9MDsgaTxOUl9SWF9ERVNDOyBpKyspCisJCWNsZWFyX3J4X2Rlc2MoZGV2LCBpKTsKKworCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBSWERQX0hJKTsKKwl3cml0ZWwoZGV2LT5yeF9pbmZvLnBoeV9kZXNjcywgZGV2LT5iYXNlICsgUlhEUCk7CisKKwlyZXQgPSByeF9yZWZpbGwobmRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXQpIHsKKwkJZHByaW50aygic3RhcnRpbmcgcmVjZWl2ZXJcbiIpOworCQkvKiBwcmV2ZW50IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBmcm9tIHN0b21waW5nIG9uIHVzICovCisJCXNwaW5fbG9ja19pcnEoJmRldi0+cnhfaW5mby5sb2NrKTsKKworCQl3cml0ZWwoMHgwMDAxLCBkZXYtPmJhc2UgKyBDQ1NSKTsKKwkJd3JpdGVsKDAsIGRldi0+YmFzZSArIFJGQ1IpOworCQl3cml0ZWwoMHg3ZmMwMDAwMCwgZGV2LT5iYXNlICsgUkZDUik7CisJCXdyaXRlbCgweGZmYzAwMDAwLCBkZXYtPmJhc2UgKyBSRkNSKTsKKworCQlkZXYtPnJ4X2luZm8udXAgPSAxOworCisJCXBoeV9pbnRyKG5kZXYpOworCisJCS8qIE9rYXksIGxldCBpdCByaXAgKi8KKwkJc3Bpbl9sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCQlkZXYtPklNUl9jYWNoZSB8PSBJU1JfUEhZOworCQlkZXYtPklNUl9jYWNoZSB8PSBJU1JfUlhSQ01QOworCQkvL2Rldi0+SU1SX2NhY2hlIHw9IElTUl9SWEVSUjsKKwkJLy9kZXYtPklNUl9jYWNoZSB8PSBJU1JfUlhPSzsKKwkJZGV2LT5JTVJfY2FjaGUgfD0gSVNSX1JYT1JOOworCQlkZXYtPklNUl9jYWNoZSB8PSBJU1JfUlhTT1ZSOworCQlkZXYtPklNUl9jYWNoZSB8PSBJU1JfUlhERVNDOworCQlkZXYtPklNUl9jYWNoZSB8PSBJU1JfUlhJRExFOworCQlkZXYtPklNUl9jYWNoZSB8PSBJU1JfVFhERVNDOworCQlkZXYtPklNUl9jYWNoZSB8PSBJU1JfVFhJRExFOworCisJCXdyaXRlbChkZXYtPklNUl9jYWNoZSwgZGV2LT5iYXNlICsgSU1SKTsKKwkJd3JpdGVsKDEsIGRldi0+YmFzZSArIElFUik7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCisJCWtpY2tfcngobmRldik7CisKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnJ4X2luZm8ubG9jayk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG5zODM4MjBfY2xlYW51cF9yeChzdHJ1Y3QgbnM4MzgyMCAqZGV2KQoreworCXVuc2lnbmVkIGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRwcmludGsoIm5zODM4MjBfY2xlYW51cF9yeCglcClcbiIsIGRldik7CisKKwkvKiBkaXNhYmxlIHJlY2VpdmUgaW50ZXJydXB0cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPm1pc2NfbG9jaywgZmxhZ3MpOworCWRldi0+SU1SX2NhY2hlICY9IH4oSVNSX1JYT0sgfCBJU1JfUlhERVNDIHwgSVNSX1JYRVJSIHwgSVNSX1JYRUFSTFkgfCBJU1JfUlhJRExFKTsKKwl3cml0ZWwoZGV2LT5JTVJfY2FjaGUsIGRldi0+YmFzZSArIElNUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5taXNjX2xvY2ssIGZsYWdzKTsKKworCS8qIHN5bmNocm9uaXplIHdpdGggdGhlIGludGVycnVwdCBoYW5kbGVyIGFuZCBraWxsIGl0ICovCisJZGV2LT5yeF9pbmZvLnVwID0gMDsKKwlzeW5jaHJvbml6ZV9pcnEoZGV2LT5wY2lfZGV2LT5pcnEpOworCisJLyogdG91Y2ggdGhlIHBjaSBidXMuLi4gKi8KKwlyZWFkbChkZXYtPmJhc2UgKyBJTVIpOworCisJLyogYXNzdW1lcyB0aGUgdHJhbnNtaXR0ZXIgaXMgYWxyZWFkeSBkaXNhYmxlZCBhbmQgcmVzZXQgKi8KKwl3cml0ZWwoMCwgZGV2LT5iYXNlICsgUlhEUF9ISSk7CisJd3JpdGVsKDAsIGRldi0+YmFzZSArIFJYRFApOworCisJZm9yIChpPTA7IGk8TlJfUlhfREVTQzsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXYtPnJ4X2luZm8uc2tic1tpXTsKKwkJZGV2LT5yeF9pbmZvLnNrYnNbaV0gPSBOVUxMOworCQljbGVhcl9yeF9kZXNjKGRldiwgaSk7CisJCWlmIChza2IpCisJCQlrZnJlZV9za2Ioc2tiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RDQUxMKG5zODM4MjBfcnhfa2ljayhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikpOworc3RhdGljIHZvaWQgZmFzdGNhbGwgbnM4MzgyMF9yeF9raWNrKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCS8qaWYgKG5yX3J4X2VtcHR5KGRldikgPj0gTlJfUlhfREVTQy80KSovIHsKKwkJaWYgKGRldi0+cnhfaW5mby51cCkgeworCQkJcnhfcmVmaWxsX2F0b21pYyhuZGV2KTsKKwkJCWtpY2tfcngobmRldik7CisJCX0KKwl9CisKKwlpZiAoZGV2LT5yeF9pbmZvLnVwICYmIG5yX3J4X2VtcHR5KGRldikgPiBOUl9SWF9ERVNDKjMvNCkKKwkJc2NoZWR1bGVfd29yaygmZGV2LT50cV9yZWZpbGwpOworCWVsc2UKKwkJa2lja19yeChuZGV2KTsKKwlpZiAoZGV2LT5yeF9pbmZvLmlkbGUpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogQkFEXG4iLCBuZGV2LT5uYW1lKTsKK30KKworLyogcnhfaXJxCisgKgkKKyAqLworc3RhdGljIHZvaWQgRkFTVENBTEwocnhfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KSk7CitzdGF0aWMgdm9pZCBmYXN0Y2FsbCByeF9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7CisJc3RydWN0IHJ4X2luZm8gKmluZm8gPSAmZGV2LT5yeF9pbmZvOworCXVuc2lnbmVkIG5leHRfcng7CisJaW50IHJ4X3JjLCBsZW47CisJdTMyIGNtZHN0cywgKmRlc2M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbnIgPSAwOworCisJZHByaW50aygicnhfaXJxKCVwKVxuIiwgbmRldik7CisJZHByaW50aygicnhkcDogJTA4eCwgZGVzY3M6ICUwOGx4IG5leHRfcnhbJWRdOiAlcCBuZXh0X2VtcHR5WyVkXTogJXBcbiIsCisJCXJlYWRsKGRldi0+YmFzZSArIFJYRFApLAorCQkobG9uZykoZGV2LT5yeF9pbmZvLnBoeV9kZXNjcyksCisJCShpbnQpZGV2LT5yeF9pbmZvLm5leHRfcngsCisJCShkZXYtPnJ4X2luZm8uZGVzY3MgKyAoREVTQ19TSVpFICogZGV2LT5yeF9pbmZvLm5leHRfcngpKSwKKwkJKGludClkZXYtPnJ4X2luZm8ubmV4dF9lbXB0eSwKKwkJKGRldi0+cnhfaW5mby5kZXNjcyArIChERVNDX1NJWkUgKiBkZXYtPnJ4X2luZm8ubmV4dF9lbXB0eSkpCisJCSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWlmICghaW5mby0+dXApCisJCWdvdG8gb3V0OworCisJZHByaW50aygid2Fsa2luZyBkZXNjc1xuIik7CisJbmV4dF9yeCA9IGluZm8tPm5leHRfcng7CisJZGVzYyA9IGluZm8tPm5leHRfcnhfZGVzYzsKKwl3aGlsZSAoKENNRFNUU19PV04gJiAoY21kc3RzID0gbGUzMl90b19jcHUoZGVzY1tERVNDX0NNRFNUU10pKSkgJiYKKwkgICAgICAgKGNtZHN0cyAhPSBDTURTVFNfT1dOKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQl1MzIgZXh0c3RzID0gbGUzMl90b19jcHUoZGVzY1tERVNDX0VYVFNUU10pOworCQlkbWFfYWRkcl90IGJ1ZnB0ciA9IGRlc2NfYWRkcl9nZXQoZGVzYyArIERFU0NfQlVGUFRSKTsKKworCQlkcHJpbnRrKCJjbWRzdHM6ICUwOHhcbiIsIGNtZHN0cyk7CisJCWRwcmludGsoImxpbms6ICUwOHhcbiIsIGNwdV90b19sZTMyKGRlc2NbREVTQ19MSU5LXSkpOworCQlkcHJpbnRrKCJleHRzdHM6ICUwOHhcbiIsIGV4dHN0cyk7CisKKwkJc2tiID0gaW5mby0+c2tic1tuZXh0X3J4XTsKKwkJaW5mby0+c2tic1tuZXh0X3J4XSA9IE5VTEw7CisJCWluZm8tPm5leHRfcnggPSAobmV4dF9yeCArIDEpICUgTlJfUlhfREVTQzsKKworCQltYigpOworCQljbGVhcl9yeF9kZXNjKGRldiwgbmV4dF9yeCk7CisKKwkJcGNpX3VubWFwX3NpbmdsZShkZXYtPnBjaV9kZXYsIGJ1ZnB0ciwKKwkJCQkgUlhfQlVGX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWxlbiA9IGNtZHN0cyAmIENNRFNUU19MRU5fTUFTSzsKKyNpZmRlZiBOUzgzODIwX1ZMQU5fQUNDRUxfU1VQUE9SVAorCQkvKiBOSDogQXMgd2FzIG1lbnRpb25lZCBiZWxvdywgdGhpcyBjaGlwIGlzIGtpbmRhCisJCSAqIGJyYWluIGRlYWQgYWJvdXQgdmxhbiB0YWcgc3RyaXBwaW5nLiAgRnJhbWVzCisJCSAqIHRoYXQgYXJlIDY0IGJ5dGVzIHdpdGggYSB2bGFuIGhlYWRlciBhcHBlbmRlZAorCQkgKiBsaWtlIGFycCBmcmFtZXMsIG9yIHBpbmdzLCBhcmUgZmxhZ2dlZCBhcyBSdW50cworCQkgKiB3aGVuIHRoZSB0YWcgaXMgc3RyaXBwZWQgYW5kIGhhcmR3YXJlLiAgVGhpcworCQkgKiBhbHNvIG1lYW5zIHRoYXQgdGhlIE9LIGJpdCBpbiB0aGUgZGVzY3JpcHRvciAKKwkJICogaXMgY2xlYXJlZCB3aGVuIHRoZSBmcmFtZSBjb21lcyBpbiBzbyB3ZSBoYXZlCisJCSAqIHRvIGRvIGEgc3BlY2lmaWMgbGVuZ3RoIGNoZWNrIGhlcmUgdG8gbWFrZSBzdXJlCisJCSAqIHRoZSBmcmFtZSB3b3VsZCBoYXZlIGJlZW4gb2ssIGhhZCB3ZSBub3Qgc3RyaXBwZWQKKwkJICogdGhlIHRhZy4KKwkJICovIAorCQlpZiAobGlrZWx5KChDTURTVFNfT0sgJiBjbWRzdHMpIHx8CisJCQkoKGNtZHN0cyAmIENNRFNUU19SVU5UKSAmJiBsZW4gPj0gNTYpKSkgeyAgIAorI2Vsc2UKKwkJaWYgKGxpa2VseShDTURTVFNfT0sgJiBjbWRzdHMpKSB7CisjZW5kaWYKKwkJCXNrYl9wdXQoc2tiLCBsZW4pOworCQkJaWYgKHVubGlrZWx5KCFza2IpKQorCQkJCWdvdG8gbmV0ZGV2X21hbmdsZV9tZV9oYXJkZXJfZmFpbGVkOworCQkJaWYgKGNtZHN0cyAmIENNRFNUU19ERVNUX01VTFRJKQorCQkJCWRldi0+c3RhdHMubXVsdGljYXN0ICsrOworCQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzICsrOworCQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQlpZiAoKGV4dHN0cyAmIDB4MDAyYTAwMDApICYmICEoZXh0c3RzICYgMHgwMDU0MDAwMCkpIHsKKwkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQkJfSBlbHNlIHsKKwkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCQl9CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZGV2KTsKKyNpZmRlZiBOUzgzODIwX1ZMQU5fQUNDRUxfU1VQUE9SVCAKKwkJCWlmKGV4dHN0cyAmIEVYVFNUU19WUEtUKSB7CisJCQkJdW5zaWduZWQgc2hvcnQgdGFnOworCQkJCXRhZyA9IG50b2hzKGV4dHN0cyAmIEVYVFNUU19WVEdfTUFTSyk7CisJCQkJcnhfcmMgPSB2bGFuX2h3YWNjZWxfcngoc2tiLGRldi0+dmxncnAsdGFnKTsKKwkJCX0gZWxzZSB7CisJCQkJcnhfcmMgPSBuZXRpZl9yeChza2IpOworCQkJfQorI2Vsc2UKKwkJCXJ4X3JjID0gbmV0aWZfcngoc2tiKTsKKyNlbmRpZgorCQkJaWYgKE5FVF9SWF9EUk9QID09IHJ4X3JjKSB7CituZXRkZXZfbWFuZ2xlX21lX2hhcmRlcl9mYWlsZWQ6CisJCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkICsrOworCQkJfQorCQl9IGVsc2UgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKworCQlucisrOworCQluZXh0X3J4ID0gaW5mby0+bmV4dF9yeDsKKwkJZGVzYyA9IGluZm8tPmRlc2NzICsgKERFU0NfU0laRSAqIG5leHRfcngpOworCX0KKwlpbmZvLT5uZXh0X3J4ID0gbmV4dF9yeDsKKwlpbmZvLT5uZXh0X3J4X2Rlc2MgPSBpbmZvLT5kZXNjcyArIChERVNDX1NJWkUgKiBuZXh0X3J4KTsKKworb3V0OgorCWlmICgwICYmICFucikgeworCQlEcHJpbnRrKCJkYXplZDogY21kc3RzX2Y6ICUwOHhcbiIsIGNtZHN0cyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByeF9hY3Rpb24odW5zaWduZWQgbG9uZyBfZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gKHZvaWQgKilfZGV2OworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCXJ4X2lycShuZGV2KTsKKwl3cml0ZWwoaWhyLCBkZXYtPmJhc2UgKyBJSFIpOworCisJc3Bpbl9sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCWRldi0+SU1SX2NhY2hlIHw9IElTUl9SWERFU0M7CisJd3JpdGVsKGRldi0+SU1SX2NhY2hlLCBkZXYtPmJhc2UgKyBJTVIpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCisJcnhfaXJxKG5kZXYpOworCW5zODM4MjBfcnhfa2ljayhuZGV2KTsKK30KKworLyogUGFja2V0IFRyYW5zbWl0IGNvZGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGtpY2tfdHgoc3RydWN0IG5zODM4MjAgKmRldikKK3sKKwlkcHJpbnRrKCJraWNrX3R4KCVwKTogdHhfaWR4PSVkIGZyZWVfaWR4PSVkXG4iLAorCQlkZXYsIGRldi0+dHhfaWR4LCBkZXYtPnR4X2ZyZWVfaWR4KTsKKwl3cml0ZWwoQ1JfVFhFLCBkZXYtPmJhc2UgKyBDUik7Cit9CisKKy8qIE5vIHNwaW5sb2NrIG5lZWRlZCBvbiB0aGUgdHJhbnNtaXQgaXJxIHBhdGggYXMgdGhlIGludGVycnVwdCBoYW5kbGVyIGlzCisgKiBzZXJpYWxpemVkLgorICovCitzdGF0aWMgdm9pZCBkb190eF9kb25lKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCXUzMiBjbWRzdHMsIHR4X2RvbmVfaWR4LCAqZGVzYzsKKworCXNwaW5fbG9ja19pcnEoJmRldi0+dHhfbG9jayk7CisKKwlkcHJpbnRrKCJkb190eF9kb25lKCVwKVxuIiwgbmRldik7CisJdHhfZG9uZV9pZHggPSBkZXYtPnR4X2RvbmVfaWR4OworCWRlc2MgPSBkZXYtPnR4X2Rlc2NzICsgKHR4X2RvbmVfaWR4ICogREVTQ19TSVpFKTsKKworCWRwcmludGsoInR4X2RvbmVfaWR4PSVkIGZyZWVfaWR4PSVkIGNtZHN0cz0lMDh4XG4iLAorCQl0eF9kb25lX2lkeCwgZGV2LT50eF9mcmVlX2lkeCwgbGUzMl90b19jcHUoZGVzY1tERVNDX0NNRFNUU10pKTsKKwl3aGlsZSAoKHR4X2RvbmVfaWR4ICE9IGRldi0+dHhfZnJlZV9pZHgpICYmCisJICAgICAgICEoQ01EU1RTX09XTiAmIChjbWRzdHMgPSBsZTMyX3RvX2NwdShkZXNjW0RFU0NfQ01EU1RTXSkpKSApIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdW5zaWduZWQgbGVuOworCQlkbWFfYWRkcl90IGFkZHI7CisKKwkJaWYgKGNtZHN0cyAmIENNRFNUU19FUlIpCisJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycyArKzsKKwkJaWYgKGNtZHN0cyAmIENNRFNUU19PSykKKwkJCWRldi0+c3RhdHMudHhfcGFja2V0cyArKzsKKwkJaWYgKGNtZHN0cyAmIENNRFNUU19PSykKKwkJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gY21kc3RzICYgMHhmZmZmOworCisJCWRwcmludGsoInR4X2RvbmVfaWR4PSVkIGZyZWVfaWR4PSVkIGNtZHN0cz0lMDh4XG4iLAorCQkJdHhfZG9uZV9pZHgsIGRldi0+dHhfZnJlZV9pZHgsIGNtZHN0cyk7CisJCXNrYiA9IGRldi0+dHhfc2tic1t0eF9kb25lX2lkeF07CisJCWRldi0+dHhfc2tic1t0eF9kb25lX2lkeF0gPSBOVUxMOworCQlkcHJpbnRrKCJkb25lKCVwKVxuIiwgc2tiKTsKKworCQlsZW4gPSBjbWRzdHMgJiBDTURTVFNfTEVOX01BU0s7CisJCWFkZHIgPSBkZXNjX2FkZHJfZ2V0KGRlc2MgKyBERVNDX0JVRlBUUik7CisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wY2lfZGV2LAorCQkJCQlhZGRyLAorCQkJCQlsZW4sCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCWF0b21pY19kZWMoJmRldi0+bnJfdHhfc2ticyk7CisJCX0gZWxzZQorCQkJcGNpX3VubWFwX3BhZ2UoZGV2LT5wY2lfZGV2LCAKKwkJCQkJYWRkciwKKwkJCQkJbGVuLAorCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKworCQl0eF9kb25lX2lkeCA9ICh0eF9kb25lX2lkeCArIDEpICUgTlJfVFhfREVTQzsKKwkJZGV2LT50eF9kb25lX2lkeCA9IHR4X2RvbmVfaWR4OworCQlkZXNjW0RFU0NfQ01EU1RTXSA9IGNwdV90b19sZTMyKDApOworCQltYigpOworCQlkZXNjID0gZGV2LT50eF9kZXNjcyArICh0eF9kb25lX2lkeCAqIERFU0NfU0laRSk7CisJfQorCisJLyogQWxsb3cgbmV0d29yayBzdGFjayB0byByZXN1bWUgcXVldWVpbmcgcGFja2V0cyBhZnRlciB3ZSd2ZQorCSAqIGZpbmlzaGVkIHRyYW5zbWl0dGluZyBhdCBsZWFzdCAxLzQgb2YgdGhlIHBhY2tldHMgaW4gdGhlIHF1ZXVlLgorCSAqLworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5kZXYpICYmIHN0YXJ0X3R4X29rYXkoZGV2KSkgeworCQlkcHJpbnRrKCJzdGFydF9xdWV1ZSglcClcbiIsIG5kZXYpOworCQluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnR4X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBuczgzODIwX2NsZWFudXBfdHgoc3RydWN0IG5zODM4MjAgKmRldikKK3sKKwl1bnNpZ25lZCBpOworCisJZm9yIChpPTA7IGk8TlJfVFhfREVTQzsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXYtPnR4X3NrYnNbaV07CisJCWRldi0+dHhfc2tic1tpXSA9IE5VTEw7CisJCWlmIChza2IpIHsKKwkJCXUzMiAqZGVzYyA9IGRldi0+dHhfZGVzY3MgKyAoaSAqIERFU0NfU0laRSk7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGRldi0+cGNpX2RldiwKKwkJCQkJZGVzY19hZGRyX2dldChkZXNjICsgREVTQ19CVUZQVFIpLAorCQkJCQlsZTMyX3RvX2NwdShkZXNjW0RFU0NfQ01EU1RTXSkgJiBDTURTVFNfTEVOX01BU0ssCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCWF0b21pY19kZWMoJmRldi0+bnJfdHhfc2ticyk7CisJCX0KKwl9CisKKwltZW1zZXQoZGV2LT50eF9kZXNjcywgMCwgTlJfVFhfREVTQyAqIERFU0NfU0laRSAqIDQpOworfQorCisvKiB0cmFuc21pdCByb3V0aW5lLiAgVGhpcyBjb2RlIHJlbGllcyBvbiB0aGUgbmV0d29yayBsYXllciBzZXJpYWxpemluZworICogaXRzIGNhbGxzIGluLCBidXQgd2lsbCBydW4gaGFwcGlseSBpbiBwYXJhbGxlbCB3aXRoIHRoZSBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIuICBUaGlzIGNvZGUgY3VycmVudGx5IGhhcyBwcm92aXNpb25zIGZvciBmcmFnbWVudGluZyB0eCBidWZmZXJzCisgKiB3aGlsZSB0cnlpbmcgdG8gdHJhY2sgZG93biBhIGJ1ZyBpbiBlaXRoZXIgdGhlIHplcm8gY29weSBjb2RlIG9yCisgKiB0aGUgdHggZmlmbyAoaGVuY2UgdGhlIE1BWF9GUkFHX0xFTikuCisgKi8KK3N0YXRpYyBpbnQgbnM4MzgyMF9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7CisJdTMyIGZyZWVfaWR4LCBjbWRzdHMsIGV4dHN0czsKKwlpbnQgbnJfZnJlZSwgbnJfZnJhZ3M7CisJdW5zaWduZWQgdHhfZG9uZV9pZHgsIGxhc3RfaWR4OworCWRtYV9hZGRyX3QgYnVmOworCXVuc2lnbmVkIGxlbjsKKwlza2JfZnJhZ190ICpmcmFnOworCWludCBzdG9wcGVkID0gMDsKKwlpbnQgZG9faW50ciA9IDA7CisJdm9sYXRpbGUgdTMyICpmaXJzdF9kZXNjOworCisJZHByaW50aygibnM4MzgyMF9oYXJkX3N0YXJ0X3htaXRcbiIpOworCisJbnJfZnJhZ3MgPSAgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKK2FnYWluOgorCWlmICh1bmxpa2VseShkZXYtPkNGR19jYWNoZSAmIENGR19MTktTVFMpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJCWlmICh1bmxpa2VseShkZXYtPkNGR19jYWNoZSAmIENGR19MTktTVFMpKQorCQkJcmV0dXJuIDE7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOworCX0KKworCWxhc3RfaWR4ID0gZnJlZV9pZHggPSBkZXYtPnR4X2ZyZWVfaWR4OworCXR4X2RvbmVfaWR4ID0gZGV2LT50eF9kb25lX2lkeDsKKwlucl9mcmVlID0gKHR4X2RvbmVfaWR4ICsgTlJfVFhfREVTQy0yIC0gZnJlZV9pZHgpICUgTlJfVFhfREVTQzsKKwlucl9mcmVlIC09IDE7CisJaWYgKG5yX2ZyZWUgPD0gbnJfZnJhZ3MpIHsKKwkJZHByaW50aygic3RvcF9xdWV1ZSAtIG5vdCBlbm91Z2goJXApXG4iLCBuZGV2KTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKworCQkvKiBDaGVjayBhZ2Fpbjogd2UgbWF5IGhhdmUgcmFjZWQgd2l0aCBhIHR4IGRvbmUgaXJxICovCisJCWlmIChkZXYtPnR4X2RvbmVfaWR4ICE9IHR4X2RvbmVfaWR4KSB7CisJCQlkcHJpbnRrKCJyZXN0YXJ0IHF1ZXVlKCVwKVxuIiwgbmRldik7CisJCQluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGZyZWVfaWR4ID09IGRldi0+dHhfaW50cl9pZHgpIHsKKwkJZG9faW50ciA9IDE7CisJCWRldi0+dHhfaW50cl9pZHggPSAoZGV2LT50eF9pbnRyX2lkeCArIE5SX1RYX0RFU0MvNCkgJSBOUl9UWF9ERVNDOworCX0KKworCW5yX2ZyZWUgLT0gbnJfZnJhZ3M7CisJaWYgKG5yX2ZyZWUgPCBNSU5fVFhfREVTQ19GUkVFKSB7CisJCWRwcmludGsoInN0b3BfcXVldWUgLSBsYXN0IGVudHJ5KCVwKVxuIiwgbmRldik7CisJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJCXN0b3BwZWQgPSAxOworCX0KKworCWZyYWcgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzOworCWlmICghbnJfZnJhZ3MpCisJCWZyYWcgPSBOVUxMOworCWV4dHN0cyA9IDA7CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCWV4dHN0cyB8PSBFWFRTVFNfSVBQS1Q7CisJCWlmIChJUFBST1RPX1RDUCA9PSBza2ItPm5oLmlwaC0+cHJvdG9jb2wpCisJCQlleHRzdHMgfD0gRVhUU1RTX1RDUFBLVDsKKwkJZWxzZSBpZiAoSVBQUk9UT19VRFAgPT0gc2tiLT5uaC5pcGgtPnByb3RvY29sKQorCQkJZXh0c3RzIHw9IEVYVFNUU19VRFBQS1Q7CisJfQorCisjaWZkZWYgTlM4MzgyMF9WTEFOX0FDQ0VMX1NVUFBPUlQKKwlpZih2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpIHsKKwkJLyogZmV0Y2ggdGhlIHZsYW4gdGFnIGluZm8gb3V0IG9mIHRoZQorCQkgKiBhbmNpbGxpYXJ5IGRhdGEgaWYgdGhlIHZsYW4gY29kZQorCQkgKiBpcyB1c2luZyBodyB2bGFuIGFjY2VsZXJhdGlvbgorCQkgKi8KKwkJc2hvcnQgdGFnID0gdmxhbl90eF90YWdfZ2V0KHNrYik7CisJCWV4dHN0cyB8PSAoRVhUU1RTX1ZQS1QgfCBodG9ucyh0YWcpKTsKKwl9CisjZW5kaWYKKworCWxlbiA9IHNrYi0+bGVuOworCWlmIChucl9mcmFncykKKwkJbGVuIC09IHNrYi0+ZGF0YV9sZW47CisJYnVmID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wY2lfZGV2LCBza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwlmaXJzdF9kZXNjID0gZGV2LT50eF9kZXNjcyArIChmcmVlX2lkeCAqIERFU0NfU0laRSk7CisKKwlmb3IgKDs7KSB7CisJCXZvbGF0aWxlIHUzMiAqZGVzYyA9IGRldi0+dHhfZGVzY3MgKyAoZnJlZV9pZHggKiBERVNDX1NJWkUpOworCQl1MzIgcmVzaWR1ZSA9IDA7CisKKwkJZHByaW50aygiZnJhZ1slM3VdOiAlNHUgQCAweCUwOEx4XG4iLCBmcmVlX2lkeCwgbGVuLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylidWYpOworCQlsYXN0X2lkeCA9IGZyZWVfaWR4OworCQlmcmVlX2lkeCA9IChmcmVlX2lkeCArIDEpICUgTlJfVFhfREVTQzsKKwkJZGVzY1tERVNDX0xJTktdID0gY3B1X3RvX2xlMzIoZGV2LT50eF9waHlfZGVzY3MgKyAoZnJlZV9pZHggKiBERVNDX1NJWkUgKiA0KSk7CisJCWRlc2NfYWRkcl9zZXQoZGVzYyArIERFU0NfQlVGUFRSLCBidWYpOworCQlkZXNjW0RFU0NfRVhUU1RTXSA9IGNwdV90b19sZTMyKGV4dHN0cyk7CisKKwkJY21kc3RzID0gKChucl9mcmFnc3xyZXNpZHVlKSA/IENNRFNUU19NT1JFIDogZG9faW50ciA/IENNRFNUU19JTlRSIDogMCk7CisJCWNtZHN0cyB8PSAoZGVzYyA9PSBmaXJzdF9kZXNjKSA/IDAgOiBDTURTVFNfT1dOOworCQljbWRzdHMgfD0gbGVuOworCQlkZXNjW0RFU0NfQ01EU1RTXSA9IGNwdV90b19sZTMyKGNtZHN0cyk7CisKKwkJaWYgKHJlc2lkdWUpIHsKKwkJCWJ1ZiArPSBsZW47CisJCQlsZW4gPSByZXNpZHVlOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIW5yX2ZyYWdzKQorCQkJYnJlYWs7CisKKwkJYnVmID0gcGNpX21hcF9wYWdlKGRldi0+cGNpX2RldiwgZnJhZy0+cGFnZSwKKwkJCQkgICBmcmFnLT5wYWdlX29mZnNldCwKKwkJCQkgICBmcmFnLT5zaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZHByaW50aygiZnJhZzogYnVmPSUwOEx4ICBwYWdlPSUwOGx4IG9mZnNldD0lMDhseFxuIiwKKwkJCShsb25nIGxvbmcpYnVmLCAobG9uZykgcGFnZV90b19wZm4oZnJhZy0+cGFnZSksCisJCQlmcmFnLT5wYWdlX29mZnNldCk7CisJCWxlbiA9IGZyYWctPnNpemU7CisJCWZyYWcrKzsKKwkJbnJfZnJhZ3MtLTsKKwl9CisJZHByaW50aygiZG9uZSBwa3RcbiIpOworCisJc3Bpbl9sb2NrX2lycSgmZGV2LT50eF9sb2NrKTsKKwlkZXYtPnR4X3NrYnNbbGFzdF9pZHhdID0gc2tiOworCWZpcnN0X2Rlc2NbREVTQ19DTURTVFNdIHw9IGNwdV90b19sZTMyKENNRFNUU19PV04pOworCWRldi0+dHhfZnJlZV9pZHggPSBmcmVlX2lkeDsKKwlhdG9taWNfaW5jKCZkZXYtPm5yX3R4X3NrYnMpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT50eF9sb2NrKTsKKworCWtpY2tfdHgoZGV2KTsKKworCS8qIENoZWNrIGFnYWluOiB3ZSBtYXkgaGF2ZSByYWNlZCB3aXRoIGEgdHggZG9uZSBpcnEgKi8KKwlpZiAoc3RvcHBlZCAmJiAoZGV2LT50eF9kb25lX2lkeCAhPSB0eF9kb25lX2lkeCkgJiYgc3RhcnRfdHhfb2theShkZXYpKQorCQluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKKworCS8qIHNldCB0aGUgdHJhbnNtaXQgc3RhcnQgdGltZSB0byBjYXRjaCB0cmFuc21pdCB0aW1lb3V0cyAqLworCW5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF91cGRhdGVfc3RhdHMoc3RydWN0IG5zODM4MjAgKmRldikKK3sKKwl1OCBfX2lvbWVtICpiYXNlID0gZGV2LT5iYXNlOworCisJLyogdGhlIERQODM4MjAgd2lsbCBmcmVlemUgY291bnRlcnMsIHNvIHdlIG5lZWQgdG8gcmVhZCBhbGwgb2YgdGhlbSAqLworCWRldi0+c3RhdHMucnhfZXJyb3JzCQkrPSByZWFkbChiYXNlICsgMHg2MCkgJiAweGZmZmY7CisJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzCSs9IHJlYWRsKGJhc2UgKyAweDY0KSAmIDB4ZmZmZjsKKwlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMJKz0gcmVhZGwoYmFzZSArIDB4NjgpICYgMHhmZmZmOworCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzCSs9IHJlYWRsKGJhc2UgKyAweDZjKSAmIDB4ZmZmZjsKKwkvKmRldi0+c3RhdHMucnhfc3ltYm9sX2Vycm9ycyArPSovIHJlYWRsKGJhc2UgKyAweDcwKTsKKwlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMJKz0gcmVhZGwoYmFzZSArIDB4NzQpICYgMHhmZmZmOworCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycwkrPSByZWFkbChiYXNlICsgMHg3OCkgJiAweGZmZmY7CisJLypkZXYtPnN0YXRzLnJ4X2JhZG9wY29kZV9lcnJvcnMgKz0gKi8gcmVhZGwoYmFzZSArIDB4N2MpOworCS8qZGV2LT5zdGF0cy5yeF9wYXVzZV9jb3VudCArPSAqLyAgcmVhZGwoYmFzZSArIDB4ODApOworCS8qZGV2LT5zdGF0cy50eF9wYXVzZV9jb3VudCArPSAqLyAgcmVhZGwoYmFzZSArIDB4ODQpOworCWRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMJKz0gcmVhZGwoYmFzZSArIDB4ODgpICYgMHhmZjsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuczgzODIwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKworCS8qIHNvbWV3aGF0IG92ZXJraWxsICovCisJc3Bpbl9sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCW5zODM4MjBfdXBkYXRlX3N0YXRzKGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPm1pc2NfbG9jayk7CisKKwlyZXR1cm4gJmRldi0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIG5zODM4MjBfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgIm5zODM4MjAiKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShkZXYtPnBjaV9kZXYpKTsKK30KKworc3RhdGljIHUzMiBuczgzODIwX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCXUzMiBjZmcgPSByZWFkbChkZXYtPmJhc2UgKyBDRkcpIF4gU1BEU1RTX1BPTEFSSVRZOworCXJldHVybiBjZmcgJiBDRkdfTE5LU1RTID8gMSA6IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IG5zODM4MjBfZ2V0X2RydmluZm8sCisJLmdldF9saW5rID0gbnM4MzgyMF9nZXRfbGluaworfTsKKworc3RhdGljIHZvaWQgbnM4MzgyMF9taWJfaXNyKHN0cnVjdCBuczgzODIwICpkZXYpCit7CisJc3Bpbl9sb2NrKCZkZXYtPm1pc2NfbG9jayk7CisJbnM4MzgyMF91cGRhdGVfc3RhdHMoZGV2KTsKKwlzcGluX3VubG9jaygmZGV2LT5taXNjX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBuczgzODIwX2RvX2lzcihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTMyIGlzcik7CitzdGF0aWMgaXJxcmV0dXJuX3QgbnM4MzgyMF9pcnEoaW50IGZvbywgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBkYXRhOworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCXUzMiBpc3I7CisJZHByaW50aygibnM4MzgyMF9pcnEoJXApXG4iLCBuZGV2KTsKKworCWRldi0+aWhyID0gMDsKKworCWlzciA9IHJlYWRsKGRldi0+YmFzZSArIElTUik7CisJZHByaW50aygiaXJxOiAlMDh4XG4iLCBpc3IpOworCW5zODM4MjBfZG9faXNyKG5kZXYsIGlzcik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBuczgzODIwX2RvX2lzcihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTMyIGlzcikKK3sKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKyNpZmRlZiBERUJVRworCWlmIChpc3IgJiB+KElTUl9QSFkgfCBJU1JfUlhERVNDIHwgSVNSX1JYRUFSTFkgfCBJU1JfUlhPSyB8IElTUl9SWEVSUiB8IElTUl9UWElETEUgfCBJU1JfVFhPSyB8IElTUl9UWERFU0MpKQorCQlEcHJpbnRrKCJvZGQgaXNyPyAweCUwOHhcbiIsIGlzcik7CisjZW5kaWYKKworCWlmIChJU1JfUlhJRExFICYgaXNyKSB7CisJCWRldi0+cnhfaW5mby5pZGxlID0gMTsKKwkJRHByaW50aygib2ggZGVhciwgd2UgYXJlIGlkbGVcbiIpOworCQluczgzODIwX3J4X2tpY2sobmRldik7CisJfQorCisJaWYgKChJU1JfUlhERVNDIHwgSVNSX1JYT0spICYgaXNyKSB7CisJCXByZWZldGNoKGRldi0+cnhfaW5mby5uZXh0X3J4X2Rlc2MpOworCisJCXNwaW5fbG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKKwkJZGV2LT5JTVJfY2FjaGUgJj0gfihJU1JfUlhERVNDIHwgSVNSX1JYT0spOworCQl3cml0ZWwoZGV2LT5JTVJfY2FjaGUsIGRldi0+YmFzZSArIElNUik7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCisJCXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+cnhfdGFza2xldCk7CisJCS8vcnhfaXJxKG5kZXYpOworCQkvL3dyaXRlbCg0LCBkZXYtPmJhc2UgKyBJSFIpOworCX0KKworCWlmICgoSVNSX1JYSURMRSB8IElTUl9SWE9STiB8IElTUl9SWERFU0MgfCBJU1JfUlhPSyB8IElTUl9SWEVSUikgJiBpc3IpCisJCW5zODM4MjBfcnhfa2ljayhuZGV2KTsKKworCWlmICh1bmxpa2VseShJU1JfUlhTT1ZSICYgaXNyKSkgeworCQkvL3ByaW50aygib3ZlcnJ1bjogcnhzb3ZyXG4iKTsKKwkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycyArKzsKKwl9CisKKwlpZiAodW5saWtlbHkoSVNSX1JYT1JOICYgaXNyKSkgeworCQkvL3ByaW50aygib3ZlcnJ1bjogcnhvcm5cbiIpOworCQlkZXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzICsrOworCX0KKworCWlmICgoSVNSX1JYUkNNUCAmIGlzcikgJiYgZGV2LT5yeF9pbmZvLnVwKQorCQl3cml0ZWwoQ1JfUlhFLCBkZXYtPmJhc2UgKyBDUik7CisKKwlpZiAoSVNSX1RYSURMRSAmIGlzcikgeworCQl1MzIgdHhkcDsKKwkJdHhkcCA9IHJlYWRsKGRldi0+YmFzZSArIFRYRFApOworCQlkcHJpbnRrKCJ0eGRwOiAlMDh4XG4iLCB0eGRwKTsKKwkJdHhkcCAtPSBkZXYtPnR4X3BoeV9kZXNjczsKKwkJZGV2LT50eF9pZHggPSB0eGRwIC8gKERFU0NfU0laRSAqIDQpOworCQlpZiAoZGV2LT50eF9pZHggPj0gTlJfVFhfREVTQykgeworCQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBCVUcgLS0gdHhkcCBvdXQgb2YgcmFuZ2VcbiIsIG5kZXYtPm5hbWUpOworCQkJZGV2LT50eF9pZHggPSAwOworCQl9CisJCS8qIFRoZSBtYXkgaGF2ZSBiZWVuIGEgcmFjZSBiZXR3ZWVuIGEgcGNpIG9yaWdpbmF0ZWQgcmVhZAorCQkgKiBhbmQgdGhlIGRlc2NyaXB0b3IgdXBkYXRlIGZyb20gdGhlIGNwdS4gIEp1c3QgaW4gY2FzZSwgCisJCSAqIGtpY2sgdGhlIHRyYW5zbWl0dGVyIGlmIHRoZSBoYXJkd2FyZSB0aGlua3MgaXQgaXMgb24gYSAKKwkJICogZGlmZmVyZW50IGRlc2NyaXB0b3IgdGhhbiB3ZSBhcmUuCisJCSAqLworCQlpZiAoZGV2LT50eF9pZHggIT0gZGV2LT50eF9mcmVlX2lkeCkKKwkJCWtpY2tfdHgoZGV2KTsKKwl9CisKKwkvKiBEZWZlciB0eCByaW5nIHByb2Nlc3NpbmcgdW50aWwgbW9yZSB0aGFuIGEgbWluaW11bSBhbW91bnQgb2YKKwkgKiB3b3JrIGhhcyBhY2N1bXVsYXRlZAorCSAqLworCWlmICgoSVNSX1RYREVTQyB8IElTUl9UWElETEUgfCBJU1JfVFhPSyB8IElTUl9UWEVSUikgJiBpc3IpIHsKKwkJZG9fdHhfZG9uZShuZGV2KTsKKworCQkvKiBEaXNhYmxlIFR4T2sgaWYgdGhlcmUgYXJlIG5vIG91dHN0YW5kaW5nIHR4IHBhY2tldHMuCisJCSAqLworCQlpZiAoKGRldi0+dHhfZG9uZV9pZHggPT0gZGV2LT50eF9mcmVlX2lkeCkgJiYKKwkJICAgIChkZXYtPklNUl9jYWNoZSAmIElTUl9UWE9LKSkgeworCQkJc3Bpbl9sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCQkJZGV2LT5JTVJfY2FjaGUgJj0gfklTUl9UWE9LOworCQkJd3JpdGVsKGRldi0+SU1SX2NhY2hlLCBkZXYtPmJhc2UgKyBJTVIpOworCQkJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPm1pc2NfbG9jayk7CisJCX0KKwl9CisKKwkvKiBUaGUgVHhJZGxlIGludGVycnVwdCBjYW4gY29tZSBpbiBiZWZvcmUgdGhlIHRyYW5zbWl0IGhhcworCSAqIGNvbXBsZXRlZC4gIE5vcm1hbGx5IHdlIHJlYXAgcGFja2V0cyBvZmYgb2YgdGhlIGNvbWJpbmF0aW9uCisJICogb2YgVHhEZXNjIGFuZCBUeElkbGUgYW5kIGxlYXZlIFR4T2sgZGlzYWJsZWQgKHNpbmNlIGl0IAorCSAqIG9jY3VycyBvbiBldmVyeSBwYWNrZXQpLCBidXQgd2hlbiBubyBmdXJ0aGVyIGlycXMgb2YgdGhpcyAKKwkgKiBuYXR1cmUgYXJlIGV4cGVjdGVkLCB3ZSBtdXN0IGVuYWJsZSBUeE9rLgorCSAqLworCWlmICgoSVNSX1RYSURMRSAmIGlzcikgJiYgKGRldi0+dHhfZG9uZV9pZHggIT0gZGV2LT50eF9mcmVlX2lkeCkpIHsKKwkJc3Bpbl9sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCQlkZXYtPklNUl9jYWNoZSB8PSBJU1JfVFhPSzsKKwkJd3JpdGVsKGRldi0+SU1SX2NhY2hlLCBkZXYtPmJhc2UgKyBJTVIpOworCQlzcGluX3VubG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKKwl9CisKKwkvKiBNSUIgaW50ZXJydXB0OiBvbmUgb2YgdGhlIHN0YXRpc3RpY3MgY291bnRlcnMgaXMgYWJvdXQgdG8gb3ZlcmZsb3cgKi8KKwlpZiAodW5saWtlbHkoSVNSX01JQiAmIGlzcikpCisJCW5zODM4MjBfbWliX2lzcihkZXYpOworCisJLyogUEhZOiBMaW5rIHVwL2Rvd24vbmVnb3RpYXRpb24gc3RhdGUgY2hhbmdlICovCisJaWYgKHVubGlrZWx5KElTUl9QSFkgJiBpc3IpKQorCQlwaHlfaW50cihuZGV2KTsKKworI2lmIDAJLyogU3RpbGwgd29ya2luZyBvbiB0aGUgaW50ZXJydXB0IG1pdGlnYXRpb24gc3RyYXRlZ3kgKi8KKwlpZiAoZGV2LT5paHIpCisJCXdyaXRlbChkZXYtPmlociwgZGV2LT5iYXNlICsgSUhSKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBuczgzODIwX2RvX3Jlc2V0KHN0cnVjdCBuczgzODIwICpkZXYsIHUzMiB3aGljaCkKK3sKKwlEcHJpbnRrKCJyZXNldHRpbmcgY2hpcC4uLlxuIik7CisJd3JpdGVsKHdoaWNoLCBkZXYtPmJhc2UgKyBDUik7CisJZG8geworCQlzY2hlZHVsZSgpOworCX0gd2hpbGUgKHJlYWRsKGRldi0+YmFzZSArIENSKSAmIHdoaWNoKTsKKwlEcHJpbnRrKCJva2F5IVxuIik7Cit9CisKK3N0YXRpYyBpbnQgbnM4MzgyMF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCisJLyogRklYTUU6IHByb3RlY3QgYWdhaW5zdCBpbnRlcnJ1cHQgaGFuZGxlcj8gKi8KKwlkZWxfdGltZXJfc3luYygmZGV2LT50eF93YXRjaGRvZyk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwl3cml0ZWwoMCwgZGV2LT5iYXNlICsgSU1SKTsKKwl3cml0ZWwoMCwgZGV2LT5iYXNlICsgSUVSKTsKKwlyZWFkbChkZXYtPmJhc2UgKyBJRVIpOworCisJZGV2LT5yeF9pbmZvLnVwID0gMDsKKwlzeW5jaHJvbml6ZV9pcnEoZGV2LT5wY2lfZGV2LT5pcnEpOworCisJbnM4MzgyMF9kb19yZXNldChkZXYsIENSX1JTVCk7CisKKwlzeW5jaHJvbml6ZV9pcnEoZGV2LT5wY2lfZGV2LT5pcnEpOworCisJc3Bpbl9sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCWRldi0+SU1SX2NhY2hlICY9IH4oSVNSX1RYVVJOIHwgSVNSX1RYSURMRSB8IElTUl9UWEVSUiB8IElTUl9UWERFU0MgfCBJU1JfVFhPSyk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPm1pc2NfbG9jayk7CisKKwluczgzODIwX2NsZWFudXBfcngoZGV2KTsKKwluczgzODIwX2NsZWFudXBfdHgoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuczgzODIwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7CisgICAgICAgIHUzMiB0eF9kb25lX2lkeCwgKmRlc2M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXR4X2RvbmVfaWR4ID0gZGV2LT50eF9kb25lX2lkeDsKKwlkZXNjID0gZGV2LT50eF9kZXNjcyArICh0eF9kb25lX2lkeCAqIERFU0NfU0laRSk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogdHhfdGltZW91dDogdHhfZG9uZV9pZHg9JWQgZnJlZV9pZHg9JWQgY21kc3RzPSUwOHhcbiIsCisJCW5kZXYtPm5hbWUsCisJCXR4X2RvbmVfaWR4LCBkZXYtPnR4X2ZyZWVfaWR4LCBsZTMyX3RvX2NwdShkZXNjW0RFU0NfQ01EU1RTXSkpOworCisjaWYgZGVmaW5lZChERUJVRykKKwl7CisJCXUzMiBpc3I7CisJCWlzciA9IHJlYWRsKGRldi0+YmFzZSArIElTUik7CisJCXByaW50aygiaXJxOiAlMDh4IGltcjogJTA4eFxuIiwgaXNyLCBkZXYtPklNUl9jYWNoZSk7CisJCW5zODM4MjBfZG9faXNyKG5kZXYsIGlzcik7CisJfQorI2VuZGlmCisKKwlkb190eF9kb25lKG5kZXYpOworCisJdHhfZG9uZV9pZHggPSBkZXYtPnR4X2RvbmVfaWR4OworCWRlc2MgPSBkZXYtPnR4X2Rlc2NzICsgKHR4X2RvbmVfaWR4ICogREVTQ19TSVpFKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBhZnRlcjogdHhfZG9uZV9pZHg9JWQgZnJlZV9pZHg9JWQgY21kc3RzPSUwOHhcbiIsCisJCW5kZXYtPm5hbWUsCisJCXR4X2RvbmVfaWR4LCBkZXYtPnR4X2ZyZWVfaWR4LCBsZTMyX3RvX2NwdShkZXNjW0RFU0NfQ01EU1RTXSkpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBuczgzODIwX3R4X3dhdGNoKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9ICh2b2lkICopZGF0YTsKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKworI2lmIGRlZmluZWQoREVCVUcpCisJcHJpbnRrKCJuczgzODIwX3R4X3dhdGNoOiAldSAldSAlZFxuIiwKKwkJZGV2LT50eF9kb25lX2lkeCwgZGV2LT50eF9mcmVlX2lkeCwgYXRvbWljX3JlYWQoJmRldi0+bnJfdHhfc2ticykKKwkJKTsKKyNlbmRpZgorCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbmRldi0+dHJhbnNfc3RhcnQgKyAxKkhaKSAmJgorCSAgICBkZXYtPnR4X2RvbmVfaWR4ICE9IGRldi0+dHhfZnJlZV9pZHgpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBuczgzODIwX3R4X3dhdGNoOiAldSAldSAlZFxuIiwKKwkJCW5kZXYtPm5hbWUsCisJCQlkZXYtPnR4X2RvbmVfaWR4LCBkZXYtPnR4X2ZyZWVfaWR4LAorCQkJYXRvbWljX3JlYWQoJmRldi0+bnJfdHhfc2ticykpOworCQluczgzODIwX3R4X3RpbWVvdXQobmRldik7CisJfQorCisJbW9kX3RpbWVyKCZkZXYtPnR4X3dhdGNoZG9nLCBqaWZmaWVzICsgMipIWik7Cit9CisKK3N0YXRpYyBpbnQgbnM4MzgyMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCXVuc2lnbmVkIGk7CisJdTMyIGRlc2M7CisJaW50IHJldDsKKworCWRwcmludGsoIm5zODM4MjBfb3BlblxuIik7CisKKwl3cml0ZWwoMCwgZGV2LT5iYXNlICsgUFFDUik7CisKKwlyZXQgPSBuczgzODIwX3NldHVwX3J4KG5kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbGVkOworCisJbWVtc2V0KGRldi0+dHhfZGVzY3MsIDAsIDQgKiBOUl9UWF9ERVNDICogREVTQ19TSVpFKTsKKwlmb3IgKGk9MDsgaTxOUl9UWF9ERVNDOyBpKyspIHsKKwkJZGV2LT50eF9kZXNjc1soaSAqIERFU0NfU0laRSkgKyBERVNDX0xJTktdCisJCQkJPSBjcHVfdG9fbGUzMigKKwkJCQkgIGRldi0+dHhfcGh5X2Rlc2NzCisJCQkJICArICgoaSsxKSAlIE5SX1RYX0RFU0MpICogREVTQ19TSVpFICogNCk7CisJfQorCisJZGV2LT50eF9pZHggPSAwOworCWRldi0+dHhfZG9uZV9pZHggPSAwOworCWRlc2MgPSBkZXYtPnR4X3BoeV9kZXNjczsKKwl3cml0ZWwoMCwgZGV2LT5iYXNlICsgVFhEUF9ISSk7CisJd3JpdGVsKGRlc2MsIGRldi0+YmFzZSArIFRYRFApOworCisJaW5pdF90aW1lcigmZGV2LT50eF93YXRjaGRvZyk7CisJZGV2LT50eF93YXRjaGRvZy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpbmRldjsKKwlkZXYtPnR4X3dhdGNoZG9nLmZ1bmN0aW9uID0gbnM4MzgyMF90eF93YXRjaDsKKwltb2RfdGltZXIoJmRldi0+dHhfd2F0Y2hkb2csIGppZmZpZXMgKyAyKkhaKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOwkvKiBGSVhNRTogd2FpdCBmb3IgcGh5IHRvIGNvbWUgdXAgKi8KKworCXJldHVybiAwOworCitmYWlsZWQ6CisJbnM4MzgyMF9zdG9wKG5kZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG5zODM4MjBfZ2V0bWFjKHN0cnVjdCBuczgzODIwICpkZXYsIHU4ICptYWMpCit7CisJdW5zaWduZWQgaTsKKwlmb3IgKGk9MDsgaTwzOyBpKyspIHsKKwkJdTMyIGRhdGE7CisjaWYgMAkvKiBJJ3ZlIGxlZnQgdGhpcyBpbiBhcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgZWVwcm9tLmggKi8KKwkJZGF0YSA9IGVlcHJvbV9yZWFkdygmZGV2LT5lZSwgMHhhICsgMiAtIGkpOworI2Vsc2UKKwkJLyogUmVhZCBmcm9tIHRoZSBwZXJmZWN0IG1hdGNoIG1lbW9yeTogdGhpcyBpcyBsb2FkZWQgYnkKKwkJICogdGhlIGNoaXAgZnJvbSB0aGUgRUVQUk9NIHZpYSB0aGUgRUVMT0FEIHNlbGYgdGVzdC4KKwkJICovCisJCXdyaXRlbChpKjIsIGRldi0+YmFzZSArIFJGQ1IpOworCQlkYXRhID0gcmVhZGwoZGV2LT5iYXNlICsgUkZEUik7CisjZW5kaWYKKwkJKm1hYysrID0gZGF0YTsKKwkJKm1hYysrID0gZGF0YSA+PiA4OworCX0KK30KKworc3RhdGljIGludCBuczgzODIwX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGludCBuZXdfbXR1KQoreworCWlmIChuZXdfbXR1ID4gUlhfQlVGX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCW5kZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5zODM4MjBfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKwl1OCBfX2lvbWVtICpyZmNyID0gZGV2LT5iYXNlICsgUkZDUjsKKwl1MzIgYW5kX21hc2sgPSAweGZmZmZmZmZmOworCXUzMiBvcl9tYXNrID0gMDsKKwl1MzIgdmFsOworCisJaWYgKG5kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCW9yX21hc2sgfD0gUkZDUl9BQVUgfCBSRkNSX0FBTTsKKwllbHNlCisJCWFuZF9tYXNrICY9IH4oUkZDUl9BQVUgfCBSRkNSX0FBTSk7CisKKwlpZiAobmRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCisJCW9yX21hc2sgfD0gUkZDUl9BQU07CisJZWxzZQorCQlhbmRfbWFzayAmPSB+UkZDUl9BQU07CisKKwlzcGluX2xvY2tfaXJxKCZkZXYtPm1pc2NfbG9jayk7CisJdmFsID0gKHJlYWRsKHJmY3IpICYgYW5kX21hc2spIHwgb3JfbWFzazsKKwkvKiBSYW1pdCA6IFJGQ1IgV3JpdGUgRml4IGRvYyBzYXlzIFJGRU4gbXVzdCBiZSAwIG1vZGlmeSBvdGhlciBiaXRzICovCisJd3JpdGVsKHZhbCAmIH5SRkNSX1JGRU4sIHJmY3IpOworCXdyaXRlbCh2YWwsIHJmY3IpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBuczgzODIwX3J1bl9iaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBjb25zdCBjaGFyICpuYW1lLCB1MzIgZW5hYmxlLCB1MzIgZG9uZSwgdTMyIGZhaWwpCit7CisJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7CisJaW50IHRpbWVkX291dCA9IDA7CisJbG9uZyBzdGFydDsKKwl1MzIgc3RhdHVzOworCWludCBsb29wcyA9IDA7CisKKwlkcHJpbnRrKCIlczogc3RhcnQgJXNcbiIsIG5kZXYtPm5hbWUsIG5hbWUpOworCisJc3RhcnQgPSBqaWZmaWVzOworCisJd3JpdGVsKGVuYWJsZSwgZGV2LT5iYXNlICsgUFRTQ1IpOworCWZvciAoOzspIHsKKwkJbG9vcHMrKzsKKwkJc3RhdHVzID0gcmVhZGwoZGV2LT5iYXNlICsgUFRTQ1IpOworCQlpZiAoIShzdGF0dXMgJiBlbmFibGUpKQorCQkJYnJlYWs7CisJCWlmIChzdGF0dXMgJiBkb25lKQorCQkJYnJlYWs7CisJCWlmIChzdGF0dXMgJiBmYWlsKQorCQkJYnJlYWs7CisJCWlmICgoamlmZmllcyAtIHN0YXJ0KSA+PSBIWikgeworCQkJdGltZWRfb3V0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgZmFpbCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGZhaWxlZCEgKDB4JTA4eCAmIDB4JTA4eClcbiIsCisJCQluZGV2LT5uYW1lLCBuYW1lLCBzdGF0dXMsIGZhaWwpOworCWVsc2UgaWYgKHRpbWVkX291dCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJ1bl9iaXN0ICVzIHRpbWVkIG91dCEgKCUwOHgpXG4iLAorCQkJbmRldi0+bmFtZSwgbmFtZSwgc3RhdHVzKTsKKworCWRwcmludGsoIiVzOiBkb25lICVzIGluICVkIGxvb3BzXG4iLCBuZGV2LT5uYW1lLCBuYW1lLCBsb29wcyk7Cit9CisKKyNpZmRlZiBQSFlfQ09ERV9JU19GSU5JU0hFRAorc3RhdGljIHZvaWQgbnM4MzgyMF9taWlfd3JpdGVfYml0KHN0cnVjdCBuczgzODIwICpkZXYsIGludCBiaXQpCit7CisJLyogZHJpdmUgTURDIGxvdyAqLworCWRldi0+TUVBUl9jYWNoZSAmPSB+TUVBUl9NREM7CisJd3JpdGVsKGRldi0+TUVBUl9jYWNoZSwgZGV2LT5iYXNlICsgTUVBUik7CisJcmVhZGwoZGV2LT5iYXNlICsgTUVBUik7CisKKwkvKiBlbmFibGUgb3V0cHV0LCBzZXQgYml0ICovCisJZGV2LT5NRUFSX2NhY2hlIHw9IE1FQVJfTURESVI7CisJaWYgKGJpdCkKKwkJZGV2LT5NRUFSX2NhY2hlIHw9IE1FQVJfTURJTzsKKwllbHNlCisJCWRldi0+TUVBUl9jYWNoZSAmPSB+TUVBUl9NRElPOworCisJLyogc2V0IHRoZSBvdXRwdXQgYml0ICovCisJd3JpdGVsKGRldi0+TUVBUl9jYWNoZSwgZGV2LT5iYXNlICsgTUVBUik7CisJcmVhZGwoZGV2LT5iYXNlICsgTUVBUik7CisKKwkvKiBXYWl0LiAgTWF4IGNsb2NrIHJhdGUgaXMgMi41TUh6LCB0aGlzIHdheSB3ZSBjb21lIGluIHVuZGVyIDFNSHogKi8KKwl1ZGVsYXkoMSk7CisKKwkvKiBkcml2ZSBNREMgaGlnaCBjYXVzaW5nIHRoZSBkYXRhIGJpdCB0byBiZSBsYXRjaGVkICovCisJZGV2LT5NRUFSX2NhY2hlIHw9IE1FQVJfTURDOworCXdyaXRlbChkZXYtPk1FQVJfY2FjaGUsIGRldi0+YmFzZSArIE1FQVIpOworCXJlYWRsKGRldi0+YmFzZSArIE1FQVIpOworCisJLyogV2FpdCBhZ2Fpbi4uLiAqLworCXVkZWxheSgxKTsKK30KKworc3RhdGljIGludCBuczgzODIwX21paV9yZWFkX2JpdChzdHJ1Y3QgbnM4MzgyMCAqZGV2KQoreworCWludCBiaXQ7CisKKwkvKiBkcml2ZSBNREMgbG93LCBkaXNhYmxlIG91dHB1dCAqLworCWRldi0+TUVBUl9jYWNoZSAmPSB+TUVBUl9NREM7CisJZGV2LT5NRUFSX2NhY2hlICY9IH5NRUFSX01ERElSOworCXdyaXRlbChkZXYtPk1FQVJfY2FjaGUsIGRldi0+YmFzZSArIE1FQVIpOworCXJlYWRsKGRldi0+YmFzZSArIE1FQVIpOworCisJLyogV2FpdC4gIE1heCBjbG9jayByYXRlIGlzIDIuNU1IeiwgdGhpcyB3YXkgd2UgY29tZSBpbiB1bmRlciAxTUh6ICovCisJdWRlbGF5KDEpOworCisJLyogZHJpdmUgTURDIGhpZ2ggY2F1c2luZyB0aGUgZGF0YSBiaXQgdG8gYmUgbGF0Y2hlZCAqLworCWJpdCA9IChyZWFkbChkZXYtPmJhc2UgKyBNRUFSKSAmIE1FQVJfTURJTykgPyAxIDogMDsKKwlkZXYtPk1FQVJfY2FjaGUgfD0gTUVBUl9NREM7CisJd3JpdGVsKGRldi0+TUVBUl9jYWNoZSwgZGV2LT5iYXNlICsgTUVBUik7CisKKwkvKiBXYWl0IGFnYWluLi4uICovCisJdWRlbGF5KDEpOworCisJcmV0dXJuIGJpdDsKK30KKworc3RhdGljIHVuc2lnbmVkIG5zODM4MjBfbWlpX3JlYWRfcmVnKHN0cnVjdCBuczgzODIwICpkZXYsIHVuc2lnbmVkIHBoeSwgdW5zaWduZWQgcmVnKQoreworCXVuc2lnbmVkIGRhdGEgPSAwOworCWludCBpOworCisJLyogcmVhZCBzb21lIGdhcmJhZ2Ugc28gdGhhdCB3ZSBldmVudHVhbGx5IHN5bmMgdXAgKi8KKwlmb3IgKGk9MDsgaTw2NDsgaSsrKQorCQluczgzODIwX21paV9yZWFkX2JpdChkZXYpOworCisJbnM4MzgyMF9taWlfd3JpdGVfYml0KGRldiwgMCk7CS8qIHN0YXJ0ICovCisJbnM4MzgyMF9taWlfd3JpdGVfYml0KGRldiwgMSk7CisJbnM4MzgyMF9taWlfd3JpdGVfYml0KGRldiwgMSk7CS8qIG9wY29kZSByZWFkICovCisJbnM4MzgyMF9taWlfd3JpdGVfYml0KGRldiwgMCk7CisKKwkvKiB3cml0ZSBvdXQgdGhlIHBoeSBhZGRyZXNzOiA1IGJpdHMsIG1zYiBmaXJzdCAqLworCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJbnM4MzgyMF9taWlfd3JpdGVfYml0KGRldiwgcGh5ICYgKDB4MTAgPj4gaSkpOworCisJLyogd3JpdGUgb3V0IHRoZSByZWdpc3RlciBhZGRyZXNzLCA1IGJpdHMsIG1zYiBmaXJzdCAqLworCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJbnM4MzgyMF9taWlfd3JpdGVfYml0KGRldiwgcmVnICYgKDB4MTAgPj4gaSkpOworCisJbnM4MzgyMF9taWlfcmVhZF9iaXQoZGV2KTsJLyogdHVybiBhcm91bmQgY3ljbGVzICovCisJbnM4MzgyMF9taWlfcmVhZF9iaXQoZGV2KTsKKworCS8qIHJlYWQgaW4gdGhlIHJlZ2lzdGVyIGRhdGEsIDE2IGJpdHMgbXNiIGZpcnN0ICovCisJZm9yIChpPTA7IGk8MTY7IGkrKykgeworCQlkYXRhIDw8PSAxOworCQlkYXRhIHw9IG5zODM4MjBfbWlpX3JlYWRfYml0KGRldik7CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBuczgzODIwX21paV93cml0ZV9yZWcoc3RydWN0IG5zODM4MjAgKmRldiwgdW5zaWduZWQgcGh5LCB1bnNpZ25lZCByZWcsIHVuc2lnbmVkIGRhdGEpCit7CisJaW50IGk7CisKKwkvKiByZWFkIHNvbWUgZ2FyYmFnZSBzbyB0aGF0IHdlIGV2ZW50dWFsbHkgc3luYyB1cCAqLworCWZvciAoaT0wOyBpPDY0OyBpKyspCisJCW5zODM4MjBfbWlpX3JlYWRfYml0KGRldik7CisKKwluczgzODIwX21paV93cml0ZV9iaXQoZGV2LCAwKTsJLyogc3RhcnQgKi8KKwluczgzODIwX21paV93cml0ZV9iaXQoZGV2LCAxKTsKKwluczgzODIwX21paV93cml0ZV9iaXQoZGV2LCAwKTsJLyogb3Bjb2RlIHJlYWQgKi8KKwluczgzODIwX21paV93cml0ZV9iaXQoZGV2LCAxKTsKKworCS8qIHdyaXRlIG91dCB0aGUgcGh5IGFkZHJlc3M6IDUgYml0cywgbXNiIGZpcnN0ICovCisJZm9yIChpPTA7IGk8NTsgaSsrKQorCQluczgzODIwX21paV93cml0ZV9iaXQoZGV2LCBwaHkgJiAoMHgxMCA+PiBpKSk7CisKKwkvKiB3cml0ZSBvdXQgdGhlIHJlZ2lzdGVyIGFkZHJlc3MsIDUgYml0cywgbXNiIGZpcnN0ICovCisJZm9yIChpPTA7IGk8NTsgaSsrKQorCQluczgzODIwX21paV93cml0ZV9iaXQoZGV2LCByZWcgJiAoMHgxMCA+PiBpKSk7CisKKwluczgzODIwX21paV9yZWFkX2JpdChkZXYpOwkvKiB0dXJuIGFyb3VuZCBjeWNsZXMgKi8KKwluczgzODIwX21paV9yZWFkX2JpdChkZXYpOworCisJLyogcmVhZCBpbiB0aGUgcmVnaXN0ZXIgZGF0YSwgMTYgYml0cyBtc2IgZmlyc3QgKi8KKwlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCQluczgzODIwX21paV93cml0ZV9iaXQoZGV2LCAoZGF0YSA+PiAoMTUgLSBpKSkgJiAxKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZCBuczgzODIwX3Byb2JlX3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKwlzdGF0aWMgaW50IGZpcnN0OworCWludCBpOworI2RlZmluZSBNSUlfUEhZSURSMQkweDAyCisjZGVmaW5lIE1JSV9QSFlJRFIyCTB4MDMKKworI2lmIDAKKwlpZiAoIWZpcnN0KSB7CisJCXVuc2lnbmVkIHRtcDsKKwkJbnM4MzgyMF9taWlfcmVhZF9yZWcoZGV2LCAxLCAweDA5KTsKKwkJbnM4MzgyMF9taWlfd3JpdGVfcmVnKGRldiwgMSwgMHgxMCwgMHgwZDNlKTsKKworCQl0bXAgPSBuczgzODIwX21paV9yZWFkX3JlZyhkZXYsIDEsIDB4MDApOworCQluczgzODIwX21paV93cml0ZV9yZWcoZGV2LCAxLCAweDAwLCB0bXAgfCAweDgwMDApOworCQl1ZGVsYXkoMTMwMCk7CisJCW5zODM4MjBfbWlpX3JlYWRfcmVnKGRldiwgMSwgMHgwOSk7CisJfQorI2VuZGlmCisJZmlyc3QgPSAxOworCisJZm9yIChpPTE7IGk8MjsgaSsrKSB7CisJCWludCBqOworCQl1bnNpZ25lZCBhLCBiOworCQlhID0gbnM4MzgyMF9taWlfcmVhZF9yZWcoZGV2LCBpLCBNSUlfUEhZSURSMSk7CisJCWIgPSBuczgzODIwX21paV9yZWFkX3JlZyhkZXYsIGksIE1JSV9QSFlJRFIyKTsKKworCQkvL3ByaW50aygiJXM6IHBoeSAlZDogMHglMDR4IDB4JTA0eFxuIiwKKwkJLy8JbmRldi0+bmFtZSwgaSwgYSwgYik7CisKKwkJZm9yIChqPTA7IGo8MHgxNjsgais9NCkgeworCQkJZHByaW50aygiJXM6IFsweCUwMnhdICUwNHggJTA0eCAlMDR4ICUwNHhcbiIsCisJCQkJbmRldi0+bmFtZSwgaiwKKwkJCQluczgzODIwX21paV9yZWFkX3JlZyhkZXYsIGksIDAgKyBqKSwKKwkJCQluczgzODIwX21paV9yZWFkX3JlZyhkZXYsIGksIDEgKyBqKSwKKwkJCQluczgzODIwX21paV9yZWFkX3JlZyhkZXYsIGksIDIgKyBqKSwKKwkJCQluczgzODIwX21paV9yZWFkX3JlZyhkZXYsIGksIDMgKyBqKQorCQkJCSk7CisJCX0KKwl9CisJeworCQl1bnNpZ25lZCBhLCBiOworCQkvKiByZWFkIGZpcm13YXJlIHZlcnNpb246IG1lbW9yeSBhZGRyIGlzIDB4ODQwMiBhbmQgMHg4NDAzICovCisJCW5zODM4MjBfbWlpX3dyaXRlX3JlZyhkZXYsIDEsIDB4MTYsIDB4MDAwZCk7CisJCW5zODM4MjBfbWlpX3dyaXRlX3JlZyhkZXYsIDEsIDB4MWUsIDB4ODEwZSk7CisJCWEgPSBuczgzODIwX21paV9yZWFkX3JlZyhkZXYsIDEsIDB4MWQpOworCisJCW5zODM4MjBfbWlpX3dyaXRlX3JlZyhkZXYsIDEsIDB4MTYsIDB4MDAwZCk7CisJCW5zODM4MjBfbWlpX3dyaXRlX3JlZyhkZXYsIDEsIDB4MWUsIDB4ODEwZSk7CisJCWIgPSBuczgzODIwX21paV9yZWFkX3JlZyhkZXYsIDEsIDB4MWQpOworCQlkcHJpbnRrKCJ2ZXJzaW9uOiAweCUwNHggMHglMDR4XG4iLCBhLCBiKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgbnM4MzgyMF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCBuczgzODIwICpkZXY7CisJbG9uZyBhZGRyOworCWludCBlcnI7CisJaW50IHVzaW5nX2RhYyA9IDA7CisKKwkvKiBTZWUgaWYgd2UgY2FuIHNldCB0aGUgZG1hIG1hc2sgZWFybHkgb247IGZhaWx1cmUgaXMgZmF0YWwuICovCisJaWYgKFRSWV9EQUMgJiYgIXBjaV9zZXRfZG1hX21hc2socGNpX2RldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworCQl1c2luZ19kYWMgPSAxOworCX0gZWxzZSBpZiAoIXBjaV9zZXRfZG1hX21hc2socGNpX2RldiwgMHhmZmZmZmZmZikpIHsKKwkJdXNpbmdfZGFjID0gMDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJuczgzODIwLmM6IHBjaV9zZXRfZG1hX21hc2sgZmFpbGVkIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW5kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5zODM4MjApKTsKKwlkZXYgPSBQUklWKG5kZXYpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0OworCisJc3Bpbl9sb2NrX2luaXQoJmRldi0+cnhfaW5mby5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT50eF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5taXNjX2xvY2spOworCWRldi0+cGNpX2RldiA9IHBjaV9kZXY7CisKKwlkZXYtPmVlLmNhY2hlID0gJmRldi0+TUVBUl9jYWNoZTsKKwlkZXYtPmVlLmxvY2sgPSAmZGV2LT5taXNjX2xvY2s7CisJU0VUX01PRFVMRV9PV05FUihuZGV2KTsKKwlTRVRfTkVUREVWX0RFVihuZGV2LCAmcGNpX2Rldi0+ZGV2KTsKKworCUlOSVRfV09SSygmZGV2LT50cV9yZWZpbGwsIHF1ZXVlX3JlZmlsbCwgbmRldik7CisJdGFza2xldF9pbml0KCZkZXYtPnJ4X3Rhc2tsZXQsIHJ4X2FjdGlvbiwgKHVuc2lnbmVkIGxvbmcpbmRldik7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0lORk8gIm5zODM4MjA6IHBjaV9lbmFibGVfZGV2IGZhaWxlZDogJWRcbiIsIGVycik7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7CisJYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAxKTsKKwlkZXYtPmJhc2UgPSBpb3JlbWFwX25vY2FjaGUoYWRkciwgUEFHRV9TSVpFKTsKKwlkZXYtPnR4X2Rlc2NzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2RldiwKKwkJCTQgKiBERVNDX1NJWkUgKiBOUl9UWF9ERVNDLCAmZGV2LT50eF9waHlfZGVzY3MpOworCWRldi0+cnhfaW5mby5kZXNjcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaV9kZXYsCisJCQk0ICogREVTQ19TSVpFICogTlJfUlhfREVTQywgJmRldi0+cnhfaW5mby5waHlfZGVzY3MpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFkZXYtPmJhc2UgfHwgIWRldi0+dHhfZGVzY3MgfHwgIWRldi0+cnhfaW5mby5kZXNjcykKKwkJZ290byBvdXRfZGlzYWJsZTsKKworCWRwcmludGsoIiVwOiAlMDhseCAgJXA6ICUwOGx4XG4iLAorCQlkZXYtPnR4X2Rlc2NzLCAobG9uZylkZXYtPnR4X3BoeV9kZXNjcywKKwkJZGV2LT5yeF9pbmZvLmRlc2NzLCAobG9uZylkZXYtPnJ4X2luZm8ucGh5X2Rlc2NzKTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBJTVIpOworCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBJRVIpOworCXJlYWRsKGRldi0+YmFzZSArIElFUik7CisKKwlkZXYtPklNUl9jYWNoZSA9IDA7CisKKwlzZXR1cF9lZV9tZW1fYml0YmFuZ2VyKCZkZXYtPmVlLCBkZXYtPmJhc2UgKyBNRUFSLCAzLCAyLCAxLCAwLAorCQkwKTsKKworCWVyciA9IHJlcXVlc3RfaXJxKHBjaV9kZXYtPmlycSwgbnM4MzgyMF9pcnEsIFNBX1NISVJRLAorCQkJICBEUlZfTkFNRSwgbmRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9JTkZPICJuczgzODIwOiB1bmFibGUgdG8gcmVnaXN0ZXIgaXJxICVkXG4iLAorCQkJcGNpX2Rldi0+aXJxKTsKKwkJZ290byBvdXRfZGlzYWJsZTsKKwl9CisKKwkvKgorCSAqIEZJWE1FOiB3ZSBhcmUgaG9sZGluZyBydG5sX2xvY2soKSBvdmVyIG9ic2NlbmVseSBsb25nIGFyZWEgb25seQorCSAqIGJlY2F1c2Ugc29tZSBvZiB0aGUgc2V0dXAgY29kZSB1c2VzIGRldi0+bmFtZS4gIEl0J3MgV3JvbmcodG0pIC0KKwkgKiB3ZSBzaG91bGQgYmUgdXNpbmcgZHJpdmVyLXNwZWNpZmljIG5hbWVzIGZvciBhbGwgdGhhdCBzdHVmZi4KKwkgKiBGb3Igbm93IHRoYXQgd2lsbCBkbywgYnV0IHdlIHJlYWxseSBuZWVkIHRvIGNvbWUgYmFjayBhbmQga2lsbAorCSAqIG1vc3Qgb2YgdGhlIGRldl9hbGxvY19uYW1lKCkgdXNlcnMgbGF0ZXIuCisJICovCisJcnRubF9sb2NrKCk7CisJZXJyID0gZGV2X2FsbG9jX25hbWUobmRldiwgbmRldi0+bmFtZSk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAibnM4MzgyMDogdW5hYmxlIHRvIGdldCBuZXRkZXYgbmFtZTogJWRcbiIsIGVycik7CisJCWdvdG8gb3V0X2ZyZWVfaXJxOworCX0KKworCXByaW50aygiJXM6IG5zODM4MjAuYzogMHgyMmM6ICUwOHgsIHN1YnN5c3RlbTogJTA0eDolMDR4XG4iLAorCQluZGV2LT5uYW1lLCBsZTMyX3RvX2NwdShyZWFkbChkZXYtPmJhc2UgKyAweDIyYykpLAorCQlwY2lfZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBwY2lfZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKKworCW5kZXYtPm9wZW4gPSBuczgzODIwX29wZW47CisJbmRldi0+c3RvcCA9IG5zODM4MjBfc3RvcDsKKwluZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBuczgzODIwX2hhcmRfc3RhcnRfeG1pdDsKKwluZGV2LT5nZXRfc3RhdHMgPSBuczgzODIwX2dldF9zdGF0czsKKwluZGV2LT5jaGFuZ2VfbXR1ID0gbnM4MzgyMF9jaGFuZ2VfbXR1OworCW5kZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IG5zODM4MjBfc2V0X211bHRpY2FzdDsKKwlTRVRfRVRIVE9PTF9PUFMobmRldiwgJm9wcyk7CisJbmRldi0+dHhfdGltZW91dCA9IG5zODM4MjBfdHhfdGltZW91dDsKKwluZGV2LT53YXRjaGRvZ190aW1lbyA9IDUgKiBIWjsKKwlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgbmRldik7CisKKwluczgzODIwX2RvX3Jlc2V0KGRldiwgQ1JfUlNUKTsKKworCS8qIE11c3QgcmVzZXQgdGhlIHJhbSBiaXN0IGJlZm9yZSBydW5uaW5nIGl0ICovCisJd3JpdGVsKFBUU0NSX1JCSVNUX1JTVCwgZGV2LT5iYXNlICsgUFRTQ1IpOworCW5zODM4MjBfcnVuX2Jpc3QobmRldiwgInNyYW0gYmlzdCIsICAgUFRTQ1JfUkJJU1RfRU4sCisJCQkgUFRTQ1JfUkJJU1RfRE9ORSwgUFRTQ1JfUkJJU1RfRkFJTCk7CisJbnM4MzgyMF9ydW5fYmlzdChuZGV2LCAiZWVwcm9tIGJpc3QiLCBQVFNDUl9FRUJJU1RfRU4sIDAsCisJCQkgUFRTQ1JfRUVCSVNUX0ZBSUwpOworCW5zODM4MjBfcnVuX2Jpc3QobmRldiwgImVlcHJvbSBsb2FkIiwgUFRTQ1JfRUVMT0FEX0VOLCAwLCAwKTsKKworCS8qIEkgbG92ZSBjb25maWcgcmVnaXN0ZXJzICovCisJZGV2LT5DRkdfY2FjaGUgPSByZWFkbChkZXYtPmJhc2UgKyBDRkcpOworCisJaWYgKChkZXYtPkNGR19jYWNoZSAmIENGR19QQ0k2NF9ERVQpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBkZXRlY3RlZCA2NCBiaXQgUENJIGRhdGEgYnVzLlxuIiwKKwkJCW5kZXYtPm5hbWUpOworCQkvKmRldi0+Q0ZHX2NhY2hlIHw9IENGR19EQVRBNjRfRU47Ki8KKwkJaWYgKCEoZGV2LT5DRkdfY2FjaGUgJiBDRkdfREFUQTY0X0VOKSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFRVBST00gZGlkIG5vdCBlbmFibGUgNjQgYml0IGJ1cy4gIERpc2FibGVkLlxuIiwKKwkJCQluZGV2LT5uYW1lKTsKKwl9IGVsc2UKKwkJZGV2LT5DRkdfY2FjaGUgJj0gfihDRkdfREFUQTY0X0VOKTsKKworCWRldi0+Q0ZHX2NhY2hlICY9IChDRkdfVEJJX0VOICB8IENGR19NUk1fRElTICAgfCBDRkdfTVdJX0RJUyB8CisJCQkgICBDRkdfVDY0QUREUiB8IENGR19EQVRBNjRfRU4gfCBDRkdfRVhUXzEyNSB8CisJCQkgICBDRkdfTTY0QUREUik7CisJZGV2LT5DRkdfY2FjaGUgfD0gQ0ZHX1BJTlRfRFVQU1RTIHwgQ0ZHX1BJTlRfTE5LU1RTIHwgQ0ZHX1BJTlRfU1BEU1RTIHwKKwkJCSAgQ0ZHX0VYVFNUU19FTiAgIHwgQ0ZHX0VYRCAgICAgICAgIHwgQ0ZHX1BFU0VMOworCWRldi0+Q0ZHX2NhY2hlIHw9IENGR19SRVFBTEc7CisJZGV2LT5DRkdfY2FjaGUgfD0gQ0ZHX1BPVzsKKwlkZXYtPkNGR19jYWNoZSB8PSBDRkdfVE1SVEVTVDsKKworCS8qIFdoZW4gY29tcGlsZWQgd2l0aCA2NCBiaXQgYWRkcmVzc2luZywgd2UgbXVzdCBhbHdheXMgZW5hYmxlCisJICogdGhlIDY0IGJpdCBkZXNjcmlwdG9yIGZvcm1hdC4KKwkgKi8KKyNpZmRlZiBVU0VfNjRCSVRfQUREUgorCWRldi0+Q0ZHX2NhY2hlIHw9IENGR19NNjRBRERSOworI2VuZGlmCisJaWYgKHVzaW5nX2RhYykKKwkJZGV2LT5DRkdfY2FjaGUgfD0gQ0ZHX1Q2NEFERFI7CisKKwkvKiBCaWcgZW5kaWFuIG1vZGUgZG9lcyBub3Qgc2VlbSB0byBkbyB3aGF0IHRoZSBkb2NzIHN1Z2dlc3QgKi8KKwlkZXYtPkNGR19jYWNoZSAmPSB+Q0ZHX0JFTTsKKworCS8qIHNldHVwIG9wdGljYWwgdHJhbnNjZWl2ZXIgaWYgd2UgaGF2ZSBvbmUgKi8KKwlpZiAoZGV2LT5DRkdfY2FjaGUgJiBDRkdfVEJJX0VOKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBlbmFibGluZyBvcHRpY2FsIHRyYW5zY2VpdmVyXG4iLAorCQkJbmRldi0+bmFtZSk7CisJCXdyaXRlbChyZWFkbChkZXYtPmJhc2UgKyBHUElPUikgfCAweDNlOCwgZGV2LT5iYXNlICsgR1BJT1IpOworCisJCS8qIHNldHVwIGF1dG8gbmVnb3RpYXRpb24gZmVhdHVyZSBhZHZlcnRpc2VtZW50ICovCisJCXdyaXRlbChyZWFkbChkZXYtPmJhc2UgKyBUQU5BUikKKwkJICAgICAgIHwgVEFOQVJfSEFMRl9EVVAgfCBUQU5BUl9GVUxMX0RVUCwKKwkJICAgICAgIGRldi0+YmFzZSArIFRBTkFSKTsKKworCQkvKiBzdGFydCBhdXRvIG5lZ290aWF0aW9uICovCisJCXdyaXRlbChUQklDUl9NUl9BTl9FTkFCTEUgfCBUQklDUl9NUl9SRVNUQVJUX0FOLAorCQkgICAgICAgZGV2LT5iYXNlICsgVEJJQ1IpOworCQl3cml0ZWwoVEJJQ1JfTVJfQU5fRU5BQkxFLCBkZXYtPmJhc2UgKyBUQklDUik7CisJCWRldi0+bGlua3N0YXRlID0gTElOS19BVVRPTkVHT1RJQVRFOworCisJCWRldi0+Q0ZHX2NhY2hlIHw9IENGR19NT0RFXzEwMDA7CisJfQorCisJd3JpdGVsKGRldi0+Q0ZHX2NhY2hlLCBkZXYtPmJhc2UgKyBDRkcpOworCWRwcmludGsoIkNGRzogJTA4eFxuIiwgZGV2LT5DRkdfY2FjaGUpOworCisJaWYgKHJlc2V0X3BoeSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVzZXR0aW5nIHBoeVxuIiwgbmRldi0+bmFtZSk7CisJCXdyaXRlbChkZXYtPkNGR19jYWNoZSB8IENGR19QSFlfUlNULCBkZXYtPmJhc2UgKyBDRkcpOworCQltc2xlZXAoMTApOworCQl3cml0ZWwoZGV2LT5DRkdfY2FjaGUsIGRldi0+YmFzZSArIENGRyk7CisJfQorCisjaWYgMAkvKiBIdWg/ICBUaGlzIHNldHMgdGhlIFBDSSBsYXRlbmN5IHJlZ2lzdGVyLiAgU2hvdWxkIGJlIGRvbmUgdmlhIAorCSAqIHRoZSBQQ0kgbGF5ZXIuICBGSVhNRS4KKwkgKi8KKwlpZiAocmVhZGwoZGV2LT5iYXNlICsgU1JSKSkKKwkJd3JpdGVsKHJlYWRsKGRldi0+YmFzZSsweDIwYykgfCAweGZlMDAsIGRldi0+YmFzZSArIDB4MjBjKTsKKyNlbmRpZgorCisJLyogTm90ZSEgIFRoZSBETUEgYnVyc3Qgc2l6ZSBpbnRlcmFjdHMgd2l0aCBwYWNrZXQKKwkgKiB0cmFuc21pc3Npb24sIHN1Y2ggdGhhdCB0aGUgbGFyZ2VzdCBwYWNrZXQgdGhhdAorCSAqIGNhbiBiZSB0cmFuc21pdHRlZCBpcyA4MTkyIC0gRkxUSCAtIGJ1cnN0IHNpemUuCisJICogSWYgb25seSB0aGUgdHJhbnNtaXQgZmlmbyB3YXMgbGFyZ2VyLi4uCisJICovCisJLyogUmFtaXQgOiAxMDI0IERNQSBpcyBub3QgYSBnb29kIGlkZWEsIGl0IGVuZHMgdXAgYmFuZ2luZyAKKwkgKiBzb21lIERFTEwgYW5kIENPTVBBUSBTTVAgc3lzdGVtcyAqLworCXdyaXRlbChUWENGR19DU0kgfCBUWENGR19IQkkgfCBUWENGR19BVFAgfCBUWENGR19NWERNQTUxMgorCQl8ICgoMTYwMCAvIDMyKSAqIDB4MTAwKSwKKwkJZGV2LT5iYXNlICsgVFhDRkcpOworCisJLyogRmx1c2ggdGhlIGludGVycnVwdCBob2xkb2ZmIHRpbWVyICovCisJd3JpdGVsKDB4MDAwLCBkZXYtPmJhc2UgKyBJSFIpOworCXdyaXRlbCgweDEwMCwgZGV2LT5iYXNlICsgSUhSKTsKKwl3cml0ZWwoMHgwMDAsIGRldi0+YmFzZSArIElIUik7CisKKwkvKiBTZXQgUnggdG8gZnVsbCBkdXBsZXgsIGRvbid0IGFjY2VwdCBydW50LCBlcnJvcmVkLCBsb25nIG9yIGxlbmd0aAorCSAqIHJhbmdlIGVycm9yZWQgcGFja2V0cy4gIFVzZSA1MTIgYnl0ZSBETUEuCisJICovCisJLyogUmFtaXQgOiAxMDI0IERNQSBpcyBub3QgYSBnb29kIGlkZWEsIGl0IGVuZHMgdXAgYmFuZ2luZyAKKwkgKiBzb21lIERFTEwgYW5kIENPTVBBUSBTTVAgc3lzdGVtcyAKKwkgKiBUdXJuIG9uIEFMUCwgb25seSB3ZSBhcmUgYWNjcGV0aW5nIEp1bWJvIFBhY2tldHMgKi8KKwl3cml0ZWwoUlhDRkdfQUVQIHwgUlhDRkdfQVJQIHwgUlhDRkdfQUlSTCB8IFJYQ0ZHX1JYX0ZECisJCXwgUlhDRkdfU1RSSVBDUkMKKwkJLy98IFJYQ0ZHX0FMUAorCQl8IChSWENGR19NWERNQTUxMikgfCAwLCBkZXYtPmJhc2UgKyBSWENGRyk7CisKKwkvKiBEaXNhYmxlIHByaW9yaXR5IHF1ZXVlaW5nICovCisJd3JpdGVsKDAsIGRldi0+YmFzZSArIFBRQ1IpOworCisJLyogRW5hYmxlIElQIGNoZWNrc3VtIHZhbGlkYXRpb24gYW5kIGRldGV0aW9uIG9mIFZMQU4gaGVhZGVycy4KKwkgKiBOb3RlOiBkbyBub3Qgc2V0IHRoZSByZWplY3Qgb3B0aW9ucyBhcyBhdCBsZWFzdCB0aGUgMHgxMDIKKwkgKiByZXZpc2lvbiBvZiB0aGUgY2hpcCBkb2VzIG5vdCBwcm9wZXJseSBhY2NlcHQgSVAgZnJhZ21lbnRzCisJICogYXQgbGVhc3QgZm9yIFVEUC4KKwkgKi8KKwkvKiBSYW1pdCA6IEJlIHN1cmUgdG8gdHVybiBvbiBSWENGR19BUlAgaWYgVkxBTidzIGFyZSBlbmFibGVkLCBzaW5jZQorCSAqIHRoZSBNQUMgaXQgY2FsY3VsYXRlcyB0aGUgcGFja2V0c2l6ZSBBRlRFUiBzdHJpcHBpbmcgdGhlIFZMQU4KKwkgKiBoZWFkZXIsIGFuZCBpZiBhIFZMQU4gVGFnZ2VkIHBhY2tldCBvZiA2NCBieXRlcyBpcyByZWNlaXZlZCAobGlrZQorCSAqIGEgcGluZyB3aXRoIGEgVkxBTiBoZWFkZXIpIHRoZW4gdGhlIGNhcmQsIHN0cmlwcyB0aGUgNCBieXRlIFZMQU4KKwkgKiB0YWcgYW5kIHRoZW4gY2hlY2tzIHRoZSBwYWNrZXQgc2l6ZSwgc28gaWYgUlhDRkdfQVJQIGlzIG5vdCBlbmFibGVkLAorCSAqIGl0IGRpc2NyYXJkcyBpdCEuICBUaGVzZSBndXlzLi4uLi4uCisJICogYWxzbyB0dXJuIG9uIHRhZyBzdHJpcHBpbmcgaWYgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGVuYWJsZWQKKwkgKi8KKyNpZmRlZiBOUzgzODIwX1ZMQU5fQUNDRUxfU1VQUE9SVAorI2RlZmluZSBWUkNSX0lOSVRfVkFMVUUgKFZSQ1JfSVBFTnxWUkNSX1ZUREVOfFZSQ1JfVlRSRU4pIAorI2Vsc2UKKyNkZWZpbmUgVlJDUl9JTklUX1ZBTFVFIChWUkNSX0lQRU58VlJDUl9WVERFTikKKyNlbmRpZgorCXdyaXRlbChWUkNSX0lOSVRfVkFMVUUsIGRldi0+YmFzZSArIFZSQ1IpOworCisJLyogRW5hYmxlIHBlci1wYWNrZXQgVENQL1VEUC9JUCBjaGVja3N1bW1pbmcKKwkgKiBhbmQgcGVyIHBhY2tldCB2bGFuIHRhZyBpbnNlcnRpb24gaWYKKwkgKiB2bGFuIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBlbmFibGVkCisJICovCisjaWZkZWYgTlM4MzgyMF9WTEFOX0FDQ0VMX1NVUFBPUlQKKyNkZWZpbmUgVlRDUl9JTklUX1ZBTFVFIChWVENSX1BQQ0hLfFZUQ1JfVlBQVEkpCisjZWxzZQorI2RlZmluZSBWVENSX0lOSVRfVkFMVUUgVlRDUl9QUENISworI2VuZGlmCisJd3JpdGVsKFZUQ1JfSU5JVF9WQUxVRSwgZGV2LT5iYXNlICsgVlRDUik7CisKKwkvKiBSYW1pdCA6IEVuYWJsZSBhc3luYyBhbmQgc3luYyBwYXVzZSBmcmFtZXMgKi8KKwkvKiB3cml0ZWwoMCwgZGV2LT5iYXNlICsgUENSKTsgKi8KKwl3cml0ZWwoKFBDUl9QU19NQ0FTVCB8IFBDUl9QU19EQSB8IFBDUl9QU0VOIHwgUENSX0ZGTE9fNEsgfAorCQlQQ1JfRkZISV84SyB8IFBDUl9TVExPXzQgfCBQQ1JfU1RISV84IHwgUENSX1BBVVNFX0NOVCksCisJCWRldi0+YmFzZSArIFBDUik7CisKKwkvKiBEaXNhYmxlIFdha2UgT24gTGFuICovCisJd3JpdGVsKDAsIGRldi0+YmFzZSArIFdDU1IpOworCisJbnM4MzgyMF9nZXRtYWMoZGV2LCBuZGV2LT5kZXZfYWRkcik7CisKKwkvKiBZZXMsIHdlIHN1cHBvcnQgZHVtYiBJUCBjaGVja3N1bSBvbiB0cmFuc21pdCAqLworCW5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0c7CisJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNOworCisjaWZkZWYgTlM4MzgyMF9WTEFOX0FDQ0VMX1NVUFBPUlQKKwkvKiBXZSBhbHNvIHN1cHBvcnQgaGFyZHdhcmUgdmxhbiBhY2NlbGVyYXRpb24gKi8KKwluZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlg7CisJbmRldi0+dmxhbl9yeF9yZWdpc3RlciA9IG5zODM4MjBfdmxhbl9yeF9yZWdpc3RlcjsKKwluZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gbnM4MzgyMF92bGFuX3J4X2tpbGxfdmlkOworI2VuZGlmCisKKwlpZiAodXNpbmdfZGFjKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB1c2luZyA2NCBiaXQgYWRkcmVzc2luZy5cbiIsCisJCQluZGV2LT5uYW1lKTsKKwkJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBuczgzODIwIHYiIFZFUlNJT04gIjogRFA4MzgyMCB2JXUuJXU6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IGlvPTB4JTA4bHggaXJxPSVkIGY9JXNcbiIsCisJCW5kZXYtPm5hbWUsCisJCSh1bnNpZ25lZClyZWFkbChkZXYtPmJhc2UgKyBTUlIpID4+IDgsCisJCSh1bnNpZ25lZClyZWFkbChkZXYtPmJhc2UgKyBTUlIpICYgMHhmZiwKKwkJbmRldi0+ZGV2X2FkZHJbMF0sIG5kZXYtPmRldl9hZGRyWzFdLAorCQluZGV2LT5kZXZfYWRkclsyXSwgbmRldi0+ZGV2X2FkZHJbM10sCisJCW5kZXYtPmRldl9hZGRyWzRdLCBuZGV2LT5kZXZfYWRkcls1XSwKKwkJYWRkciwgcGNpX2Rldi0+aXJxLAorCQkobmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hJR0hETUEpID8gImgsc2ciIDogInNnIgorCQkpOworCisjaWZkZWYgUEhZX0NPREVfSVNfRklOSVNIRUQKKwluczgzODIwX3Byb2JlX3BoeShuZGV2KTsKKyNlbmRpZgorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKG5kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAibnM4MzgyMDogdW5hYmxlIHRvIHJlZ2lzdGVyIG5ldGRldjogJWRcbiIsIGVycik7CisJCWdvdG8gb3V0X2NsZWFudXA7CisJfQorCXJ0bmxfdW5sb2NrKCk7CisKKwlyZXR1cm4gMDsKKworb3V0X2NsZWFudXA6CisJd3JpdGVsKDAsIGRldi0+YmFzZSArIElNUik7CS8qIHBhcmFub2lhICovCisJd3JpdGVsKDAsIGRldi0+YmFzZSArIElFUik7CisJcmVhZGwoZGV2LT5iYXNlICsgSUVSKTsKK291dF9mcmVlX2lycToKKwlydG5sX3VubG9jaygpOworCWZyZWVfaXJxKHBjaV9kZXYtPmlycSwgbmRldik7CitvdXRfZGlzYWJsZToKKwlpZiAoZGV2LT5iYXNlKQorCQlpb3VubWFwKGRldi0+YmFzZSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwY2lfZGV2LCA0ICogREVTQ19TSVpFICogTlJfVFhfREVTQywgZGV2LT50eF9kZXNjcywgZGV2LT50eF9waHlfZGVzY3MpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpX2RldiwgNCAqIERFU0NfU0laRSAqIE5SX1JYX0RFU0MsIGRldi0+cnhfaW5mby5kZXNjcywgZGV2LT5yeF9pbmZvLnBoeV9kZXNjcyk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOworb3V0X2ZyZWU6CisJZnJlZV9uZXRkZXYobmRldik7CisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIE5VTEwpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBuczgzODIwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7IC8qIG9rIGV2ZW4gaWYgTlVMTCAqLworCisJaWYgKCFuZGV2KQkJCS8qIHBhcmFub2lhICovCisJCXJldHVybjsKKworCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBJTVIpOwkvKiBwYXJhbm9pYSAqLworCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBJRVIpOworCXJlYWRsKGRldi0+YmFzZSArIElFUik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwlmcmVlX2lycShkZXYtPnBjaV9kZXYtPmlycSwgbmRldik7CisJaW91bm1hcChkZXYtPmJhc2UpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wY2lfZGV2LCA0ICogREVTQ19TSVpFICogTlJfVFhfREVTQywKKwkJCWRldi0+dHhfZGVzY3MsIGRldi0+dHhfcGh5X2Rlc2NzKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGNpX2RldiwgNCAqIERFU0NfU0laRSAqIE5SX1JYX0RFU0MsCisJCQlkZXYtPnJ4X2luZm8uZGVzY3MsIGRldi0+cnhfaW5mby5waHlfZGVzY3MpOworCXBjaV9kaXNhYmxlX2RldmljZShkZXYtPnBjaV9kZXYpOworCWZyZWVfbmV0ZGV2KG5kZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG5zODM4MjBfcGNpX3RibFtdID0geworCXsgMHgxMDBiLCAweDAwMjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIC5kcml2ZXJfZGF0YSA9IDAsIH0sCisJeyAwLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZQkJPSAibnM4MzgyMCIsCisJLmlkX3RhYmxlCT0gbnM4MzgyMF9wY2lfdGJsLAorCS5wcm9iZQkJPSBuczgzODIwX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobnM4MzgyMF9yZW1vdmVfb25lKSwKKyNpZiAwCS8qIEZJWE1FOiBpbXBsZW1lbnQgKi8KKwkuc3VzcGVuZAk9ICwKKwkucmVzdW1lCQk9ICwKKyNlbmRpZgorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBuczgzODIwX2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJuczgzODIwLmM6IE5hdGlvbmFsIFNlbWljb25kdWN0b3IgRFA4MzgyMCAxMC8xMDAvMTAwMCBkcml2ZXIuXG4iKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbnM4MzgyMF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJCZW5qYW1pbiBMYUhhaXNlIDxiY3JsQGt2YWNrLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBEUDgzODIwIDEwLzEwMC8xMDAwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbnM4MzgyMF9wY2lfdGJsKTsKKworbW9kdWxlX3BhcmFtKGxua3N0cywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobG5rc3RzLCAiUG9sYXJpdHkgb2YgTE5LU1RTIGJpdCIpOworCittb2R1bGVfcGFyYW0oaWhyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpaHIsICJUaW1lIGluIDEwMCB1cyBpbmNyZW1lbnRzIHRvIGRlbGF5IGludGVycnVwdHMgKHJhbmdlIDAtMTI3KSIpOworCittb2R1bGVfcGFyYW0ocmVzZXRfcGh5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZXNldF9waHksICJTZXQgdG8gMSB0byByZXNldCB0aGUgUEhZIG9uIHN0YXJ0dXAiKTsKKworbW9kdWxlX2luaXQobnM4MzgyMF9pbml0KTsKK21vZHVsZV9leGl0KG5zODM4MjBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9vYWtuZXQuYyBiL2RyaXZlcnMvbmV0L29ha25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMTY3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9vYWtuZXQuYwpAQCAtMCwwICsxLDY2NSBAQAorLyoKKyAqCisgKiAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBHcmFudCBFcmlja3NvbiA8Z3JhbnRAbGNzZS51bW4uZWR1PgorICoKKyAqICAgIE1vZHVsZSBuYW1lOiBvYWtuZXQuYworICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBEcml2ZXIgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIERQODM5MDJBViBFdGhlcm5ldCBjb250cm9sbGVyCisgKiAgICAgIG9uLWJvYXJkIHRoZSBJQk0gUG93ZXJQQyAiT2FrIiBldmFsdWF0aW9uIGJvYXJkLiBBZGFwdGVkIGZyb20gdGhlCisgKiAgICAgIHZhcmlvdXMgb3RoZXIgODM5MCBkcml2ZXJzIHdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlciBhbmQgUGF1bCBHb3J0bWFrZXIuCisgKgorICogICAgICBBZGRpdGlvbmFsIGluc3BpcmF0aW9uIGZyb20gdGhlICJ0Y2Q4MzkwLmMiIGRyaXZlciBmcm9tIFRpVm8sIEluYy4gCisgKiAgICAgIGFuZCAiZW5ldExpYi5jIiBmcm9tIElCTS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiODM5MC5oIgorCisKKy8qIFByZXByb2Nlc3NvciBEZWZpbmVzICovCisKKyNpZiAhZGVmaW5lZChUUlVFKSB8fCBUUlVFICE9IDEKKyNkZWZpbmUJVFJVRQkxCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEZBTFNFKSB8fCBGQUxTRSAhPSAwCisjZGVmaW5lCUZBTFNFCTAKKyNlbmRpZgorCisjZGVmaW5lCU9BS05FVF9TVEFSVF9QRwkJMHgyMAkvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlciAqLworI2RlZmluZQlPQUtORVRfU1RPUF9QRwkJMHg0MAkvKiBMYXN0IHBhZ2dlICsxIG9mIFJYIHJpbmcgKi8KKworI2RlZmluZQlPQUtORVRfV0FJVAkJKDIgKiBIWiAvIDEwMCkJLyogMjAgbXMgKi8KKworLyogRXhwZXJpbWVudGluZyB3aXRoIHNvbWUgZml4ZXMgZm9yIGEgYnJva2VuIGRyaXZlci4uLiAqLworCisjZGVmaW5lCU9BS05FVF9ESVNJTlQKKyNkZWZpbmUJT0FLTkVUX0hFQURDSEVDSworI2RlZmluZQlPQUtORVRfUldGSVgKKworCisvKiBHbG9iYWwgVmFyaWFibGVzICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpuYW1lID0gIk5hdGlvbmFsIERQODM5MDJBViI7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqb2FrbmV0X2RldnM7CisKKworLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLworCitzdGF0aWMgaW50CSBvYWtuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJIG9ha25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQJIG9ha25ldF9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJIG9ha25ldF9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQJIG9ha25ldF9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZAkgb2FrbmV0X2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKKworc3RhdGljIHZvaWQJIG9ha25ldF9kbWFfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSk7CisKKworLyoKKyAqIGludCBvYWtuZXRfaW5pdCgpCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbGwgdGhlIG5lY2Vzc2FyeSBwbGF0Zm9ybS1zcGVjaWZpYyBpbml0aWFsaS0KKyAqICAgemF0aW9uIGFuZCBzZXQtdXAgZm9yIHRoZSBJQk0gIk9hayIgZXZhbHVhdGlvbiBib2FyZCdzIE5hdGlvbmFsCisgKiAgIFNlbWljb25kdWN0b3IgRFA4MzkwMkFWICJTVC1OSUMiIEV0aGVybmV0IGNvbnRyb2xsZXIuCisgKgorICogSW5wdXQocyk6CisgKiAgIE4vQQorICoKKyAqIE91dHB1dChzKToKKyAqICAgTi9BCisgKgorICogUmV0dXJuczoKKyAqICAgMCBpZiBPSywgb3RoZXJ3aXNlIHN5c3RlbSBlcnJvciBudW1iZXIgb24gZXJyb3IuCisgKgorICovCitzdGF0aWMgaW50IF9faW5pdCBvYWtuZXRfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyIGludCBpOworCWludCByZWcwLCByZWdkOworCWludCByZXQgPSAtRU5PTUVNOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisjaWYgMAorCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gT0FLTkVUX0lPX0JBU0U7IAorI2Vsc2UKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGlvcmVtYXAoT0FLTkVUX0lPX0JBU0UsIE9BS05FVF9JT19TSVpFKTsKKyNlbmRpZgorCWJkX3QgKmJpcCA9IChiZF90ICopX19yZXM7CisKKwlpZiAoIWlvYWRkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwlpZiAoIWRldikKKwkJZ290byBvdXRfdW5tYXA7CisKKwlyZXQgPSAtRUJVU1k7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihPQUtORVRfSU9fQkFTRSwgT0FLTkVUX0lPX1NJWkUsIG5hbWUpKQorCQlnb3RvIG91dF9kZXY7CisKKwkvKiBRdWljayByZWdpc3RlciBjaGVjayB0byBzZWUgaWYgdGhlIGRldmljZSBpcyByZWFsbHkgdGhlcmUuICovCisKKwlyZXQgPSAtRU5PREVWOworCWlmICgocmVnMCA9IGVpX2licChpb2FkZHIpKSA9PSAweEZGKQorCQlnb3RvIG91dF9yZWdpb247CisKKwkvKgorCSAqIFRoYXQgd29ya2VkLiBOb3cgYSBtb3JlIHRob3JvdWdoIGNoZWNrLCB1c2luZyB0aGUgbXVsdGljYXN0CisJICogYWRkcmVzcyByZWdpc3RlcnMsIHRoYXQgdGhlIGRldmljZSBpcyBkZWZpbml0ZWx5IG91dCB0aGVyZQorCSAqIGFuZCBzZW1pLWZ1bmN0aW9uYWwuCisJICovCisKKwllaV9vYnAoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMSArIEU4MzkwX1NUT1AsIGlvYWRkciArIEU4MzkwX0NNRCk7CisJcmVnZCA9IGVpX2licChpb2FkZHIgKyAweDBEKTsKKwllaV9vYnAoMHhGRiwgaW9hZGRyICsgMHgwRCk7CisJZWlfb2JwKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAsIGlvYWRkciArIEU4MzkwX0NNRCk7CisJZWlfaWJwKGlvYWRkciArIEVOMF9DT1VOVEVSMCk7CisKKwkvKiBJdCdzIG5vIGdvb2QuIEZpeCB0aGluZ3MgYmFjayB1cCBhbmQgbGVhdmUuICovCisKKwlyZXQgPSAtRU5PREVWOworCWlmIChlaV9pYnAoaW9hZGRyICsgRU4wX0NPVU5URVIwKSAhPSAwKSB7CisJCWVpX29icChyZWcwLCBpb2FkZHIpOworCQllaV9vYnAocmVnZCwgaW9hZGRyICsgMHgwRCk7CisJCWdvdG8gb3V0X3JlZ2lvbjsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKgorCSAqIFRoaXMgY29udHJvbGxlciBpcyBvbiBhbiBlbWJlZGRlZCBib2FyZCwgc28gdGhlIGJhc2UgYWRkcmVzcworCSAqIGFuZCBpbnRlcnJ1cHQgYXNzaWdubWVudHMgYXJlIHByZS1hc3NpZ25lZCBhbmQgdW5jaGFnZWFibGUuCisJICovCisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlkZXYtPmlycSA9IE9BS05FVF9JTlQ7CisKKwkvKgorCSAqIERpc2FibGUgYWxsIGNoaXAgaW50ZXJydXB0cyBmb3Igbm93IGFuZCBBQ0sgYWxsIHBlbmRpbmcKKwkgKiBpbnRlcnJ1cHRzLgorCSAqLworCisJZWlfb2JwKDB4MCwgaW9hZGRyICsgRU4wX0lNUik7CisJZWlfb2JwKDB4RkYsIGlvYWRkciArIEVOMF9JU1IpOworCisJLyogQXR0ZW1wdCB0byBnZXQgdGhlIGludGVycnVwdCBsaW5lICovCisKKwlyZXQgPSAtRUFHQUlOOworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCAwLCBuYW1lLCBkZXYpKSB7CisJCXByaW50aygiJXM6IHVuYWJsZSB0byByZXF1ZXN0IGludGVycnVwdCAlZC5cbiIsCisJCSAgICAgICBuYW1lLCBkZXYtPmlycSk7CisJCWdvdG8gb3V0X3JlZ2lvbjsKKwl9CisKKwkvKiBUZWxsIHRoZSB3b3JsZCBhYm91dCB3aGF0IGFuZCB3aGVyZSB3ZSd2ZSBmb3VuZC4gKi8KKworCXByaW50aygiJXM6ICVzIGF0IiwgZGV2LT5uYW1lLCBuYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgRVRIRVJfQUREUl9MRU47ICsraSkgeworCQlkZXYtPmRldl9hZGRyW2ldID0gYmlwLT5iaV9lbmV0YWRkcltpXTsKKwkJcHJpbnRrKCIlYyUuMngiLCAoaSA/ICc6JyA6ICcgJyksIGRldi0+ZGV2X2FkZHJbaV0pOworCX0KKwlwcmludGsoIiwgZm91bmQgYXQgJSNseCwgdXNpbmcgSVJRICVkLlxuIiwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKworCS8qIFNldCB1cCBzb21lIHJlcXVpcmVkIGRyaXZlciBmaWVsZHMgYW5kIHRoZW4gd2UncmUgZG9uZS4gKi8KKworCWVpX3N0YXR1cy5uYW1lCQk9IG5hbWU7CisJZWlfc3RhdHVzLndvcmQxNgk9IEZBTFNFOworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlCT0gT0FLTkVUX1NUQVJUX1BHOworCWVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gT0FLTkVUX1NUQVJUX1BHICsgVFhfUEFHRVM7CisJZWlfc3RhdHVzLnN0b3BfcGFnZQk9IE9BS05FVF9TVE9QX1BHOworCisJZWlfc3RhdHVzLnJlc2V0XzgzOTAJPSAmb2FrbmV0X3Jlc2V0XzgzOTA7CisJZWlfc3RhdHVzLmJsb2NrX2lucHV0CT0gJm9ha25ldF9ibG9ja19pbnB1dDsKKwllaV9zdGF0dXMuYmxvY2tfb3V0cHV0CT0gJm9ha25ldF9ibG9ja19vdXRwdXQ7CisJZWlfc3RhdHVzLmdldF84MzkwX2hkcgk9ICZvYWtuZXRfZ2V0XzgzOTBfaGRyOworCisJZGV2LT5vcGVuID0gb2FrbmV0X29wZW47CisJZGV2LT5zdG9wID0gb2FrbmV0X2Nsb3NlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworI2VuZGlmCisKKwlOUzgzOTBfaW5pdChkZXYsIEZBTFNFKTsKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9pcnE7CisJCisJb2FrbmV0X2RldnMgPSBkZXY7CisJcmV0dXJuIDA7CisKK291dF9pcnE7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitvdXRfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKE9BS05FVF9JT19CQVNFLCBPQUtORVRfSU9fU0laRSk7CitvdXRfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CitvdXRfdW5tYXA6CisJaW91bm1hcChpb2FkZHIpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBzdGF0aWMgaW50IG9ha25ldF9vcGVuKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyByb3V0aW5lIGlzIGEgbW9kZXN0IHdyYXBwZXIgYXJvdW5kIGVpX29wZW4sIHRoZSA4MzkwLWdlbmVyaWMsCisgKiAgIGRyaXZlciBvcGVuIHJvdXRpbmUuIFRoaXMganVzdCBpbmNyZW1lbnRzIHRoZSBtb2R1bGUgdXNhZ2UgY291bnQKKyAqICAgYW5kIHBhc3NlcyBhbG9uZyB0aGUgc3RhdHVzIGZyb20gZWlfb3Blbi4KKyAqCisgKiBJbnB1dChzKToKKyAqICAqZGV2IC0gUG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhpcyBkcml2ZXIuCisgKgorICogT3V0cHV0KHMpOgorICogICpkZXYgLSBQb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGZvciB0aGlzIGRyaXZlciwgcG90ZW50aWFsbHkKKyAqICAgICAgICAgbW9kaWZpZWQgYnkgZWlfb3Blbi4KKyAqCisgKiBSZXR1cm5zOgorICogICAwIGlmIE9LLCBvdGhlcndpc2UgPCAwIG9uIGVycm9yLgorICoKKyAqLworc3RhdGljIGludAorb2FrbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzID0gZWlfb3BlbihkZXYpOworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoKKyAqIHN0YXRpYyBpbnQgb2FrbmV0X2Nsb3NlKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyByb3V0aW5lIGlzIGEgbW9kZXN0IHdyYXBwZXIgYXJvdW5kIGVpX2Nsb3NlLCB0aGUgODM5MC1nZW5lcmljLAorICogICBkcml2ZXIgY2xvc2Ugcm91dGluZS4gVGhpcyBqdXN0IGRlY3JlbWVudHMgdGhlIG1vZHVsZSB1c2FnZSBjb3VudAorICogICBhbmQgcGFzc2VzIGFsb25nIHRoZSBzdGF0dXMgZnJvbSBlaV9jbG9zZS4KKyAqCisgKiBJbnB1dChzKToKKyAqICAqZGV2IC0gUG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhpcyBkcml2ZXIuCisgKgorICogT3V0cHV0KHMpOgorICogICpkZXYgLSBQb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGZvciB0aGlzIGRyaXZlciwgcG90ZW50aWFsbHkKKyAqICAgICAgICAgbW9kaWZpZWQgYnkgZWlfY2xvc2UuCisgKgorICogUmV0dXJuczoKKyAqICAgMCBpZiBPSywgb3RoZXJ3aXNlIDwgMCBvbiBlcnJvci4KKyAqCisgKi8KK3N0YXRpYyBpbnQKK29ha25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBzdGF0dXMgPSBlaV9jbG9zZShkZXYpOworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoKKyAqIHN0YXRpYyB2b2lkIG9ha25ldF9yZXNldF84MzkwKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyByb3V0aW5lIHJlc2V0cyB0aGUgRFA4MzkwMiBjaGlwLgorICoKKyAqIElucHV0KHMpOgorICogICpkZXYgLSBQb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGZvciB0aGlzIGRyaXZlci4KKyAqCisgKiBPdXRwdXQocyk6CisgKiAgIE4vQQorICoKKyAqIFJldHVybnM6CisgKiAgIE4vQQorICoKKyAqLworc3RhdGljIHZvaWQKK29ha25ldF9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGJhc2UgPSBFODM5MF9CQVNFOworCisJLyoKKwkgKiBXZSBoYXZlIG5vIHByb3Zpc2lvbiBvZiByZXNldGluZyB0aGUgY29udHJvbGxlciBhcyBpcyBkb25lCisJICogaW4gb3RoZXIgZHJpdmVycywgc3VjaCBhcyAibmUuYyIuIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcKKwkgKiBzZWVtcyB0byB3b3JrIHdlbGwgZW5vdWdoIGluIHRoZSBUaVZvIGRyaXZlci4KKwkgKi8KKworCXByaW50aygiUmVzZXR0aW5nICVzLi4uXG4iLCBkZXYtPm5hbWUpOworCWVpX29icChFODM5MF9TVE9QIHwgRTgzOTBfTk9ETUEgfCBFODM5MF9QQUdFMCwgYmFzZSArIEU4MzkwX0NNRCk7CisJZWlfc3RhdHVzLnR4aW5nID0gMDsKKwllaV9zdGF0dXMuZG1haW5nID0gMDsKK30KKworLyoKKyAqIHN0YXRpYyB2b2lkIG9ha25ldF9nZXRfODM5MF9oZHIoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBUaGlzIHJvdXRpbmUgZ3JhYnMgdGhlIDgzOTAtc3BlY2lmaWMgaGVhZGVyLiBJdCdzIHNpbWlsYXIgdG8gdGhlCisgKiAgIGJsb2NrIGlucHV0IHJvdXRpbmUsIGJ1dCB3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcAorICogICBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQgdGhlIHN0YXJ0IG9mIGEgcGFnZSwgc28gd2Ugb3B0aW1pemUgYWNjb3JkaW5nbHkuCisgKgorICogSW5wdXQocyk6CisgKiAgKmRldiAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgZHJpdmVyLgorICogICpoZHIgICAgICAgLSBQb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSA4MzkwLXNwZWNpZmljIHBhY2tldCBoZWFkZXIuCisgKiAgIHJpbmdfcGFnZSAtID8KKyAqCisgKiBPdXRwdXQocyk6CisgKiAgKmhkciAgICAgICAtIFBvaW50ZXIgdG8gdGhlIDgzOTAtc3BlY2lmaWMgcGFja2V0IGhlYWRlciBmb3IgdGhlIGp1c3QtCisgKiAgICAgICAgICAgICAgIHJlY2VpdmVkIGZyYW1lLgorICoKKyAqIFJldHVybnM6CisgKiAgIE4vQQorICoKKyAqLworc3RhdGljIHZvaWQKK29ha25ldF9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJICAgIGludCByaW5nX3BhZ2UpCit7CisJaW50IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8qCisJICogVGhpcyBzaG91bGQgTk9UIGhhcHBlbi4gSWYgaXQgZG9lcywgaXQgaXMgdGhlIExBU1QgdGhpbmcgeW91J2xsCisJICogc2VlLgorCSAqLworCisJaWYgKGVpX3N0YXR1cy5kbWFpbmcpIHsKKwkJb2FrbmV0X2RtYV9lcnJvcihkZXYsICJvYWtuZXRfZ2V0XzgzOTBfaGRyIik7CisJCXJldHVybjsKKwl9CisKKwllaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7CisJb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAgKyBFODM5MF9TVEFSVCwgYmFzZSArIE9BS05FVF9DTUQpOworCW91dGJfcChzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpLCBiYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDAsIGJhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AoMCwgYmFzZSArIEVOMF9SU0FSTE8pOwkJLyogT24gcGFnZSBib3VuZGFyeSAqLworCW91dGJfcChyaW5nX3BhZ2UsIGJhc2UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiX3AoRTgzOTBfUlJFQUQgKyBFODM5MF9TVEFSVCwgYmFzZSArIE9BS05FVF9DTUQpOworCisJaWYgKGVpX3N0YXR1cy53b3JkMTYpCisJCWluc3coYmFzZSArIE9BS05FVF9EQVRBLCBoZHIsCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSA+PiAxKTsKKwllbHNlCisJCWluc2IoYmFzZSArIE9BS05FVF9EQVRBLCBoZHIsCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSk7CisKKwkvKiBCeXRlLXN3YXAgdGhlIHBhY2tldCBieXRlIGNvdW50ICovCisKKwloZHItPmNvdW50ID0gbGUxNl90b19jcHUoaGRyLT5jb3VudCk7CisKKwlvdXRiX3AoRU5JU1JfUkRDLCBiYXNlICsgRU4wX0lTUik7CS8qIEFDSyBSZW1vdGUgRE1BIGludGVycnVwdCAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7Cit9CisKKy8qCisgKiBYWFggLSBEb2N1bWVudCBtZS4KKyAqLworc3RhdGljIHZvaWQKK29ha25ldF9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgIGludCByaW5nX29mZnNldCkKK3sKKwlpbnQgYmFzZSA9IE9BS05FVF9CQVNFOworCWNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKworCS8qCisJICogVGhpcyBzaG91bGQgTk9UIGhhcHBlbi4gSWYgaXQgZG9lcywgaXQgaXMgdGhlIExBU1QgdGhpbmcgeW91J2xsCisJICogc2VlLgorCSAqLworCisJaWYgKGVpX3N0YXR1cy5kbWFpbmcpIHsKKwkJb2FrbmV0X2RtYV9lcnJvcihkZXYsICJvYWtuZXRfYmxvY2tfaW5wdXQiKTsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIE9BS05FVF9ESVNJTlQKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKyNlbmRpZgorCisJZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworCWVpX29icChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwICsgRTgzOTBfU1RBUlQsIGJhc2UgKyBFODM5MF9DTUQpOworCWVpX29icChjb3VudCAmIDB4ZmYsIGJhc2UgKyBFTjBfUkNOVExPKTsKKwllaV9vYnAoY291bnQgPj4gOCwgYmFzZSArIEVOMF9SQ05USEkpOworCWVpX29icChyaW5nX29mZnNldCAmIDB4ZmYsIGJhc2UgKyBFTjBfUlNBUkxPKTsKKwllaV9vYnAocmluZ19vZmZzZXQgPj4gOCwgYmFzZSArIEVOMF9SU0FSSEkpOworCWVpX29icChFODM5MF9SUkVBRCArIEU4MzkwX1NUQVJULCBiYXNlICsgRTgzOTBfQ01EKTsKKwlpZiAoZWlfc3RhdHVzLndvcmQxNikgeworCQllaV9pc3coYmFzZSArIEU4MzkwX0RBVEEsIGJ1ZiwgY291bnQgPj4gMSk7CisJCWlmIChjb3VudCAmIDB4MDEpIHsKKwkJCWJ1Zltjb3VudCAtIDFdID0gZWlfaWIoYmFzZSArIEU4MzkwX0RBVEEpOworI2lmZGVmIE9BS05FVF9IRUFEQ0hFQ0sKKwkJCWJ5dGVzKys7CisjZW5kaWYKKwkJfQorCX0gZWxzZSB7CisJCWVpX2lzYihiYXNlICsgRTgzOTBfREFUQSwgYnVmLCBjb3VudCk7CisJfQorI2lmZGVmIE9BS05FVF9IRUFEQ0hFQ0sKKwkvKgorCSAqIFRoaXMgd2FzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCBidXQgZW5vdWdoIHBlb3BsZSBoYXZlCisJICogYmVlbiBlbmNvdW50ZXJpbmcgcHJvYmxlbXMgc28gaXQgaXMgc3RpbGwgaGVyZS4gIElmIHlvdSBzZWUKKwkgKiB0aGlzIG1lc3NhZ2UgeW91IGVpdGhlciAxKSBoYXZlIGEgc2xpZ2h0bHkgaW5jb21wYXRpYmxlIGNsb25lCisJICogb3IgMikgaGF2ZSBub2lzZS9zcGVlZCBwcm9ibGVtcyB3aXRoIHlvdXIgYnVzLgorCSAqLworCisJLyogRE1BIHRlcm1pbmF0aW9uIGFkZHJlc3MgY2hlY2suLi4gKi8KKwl7CisJCWludCBhZGRyLCB0cmllcyA9IDIwOworCQlkbyB7CisJCQkvKiBET04nVCBjaGVjayBmb3IgJ2VpX2licChFTjBfSVNSKSAmIEVOSVNSX1JEQycgaGVyZQorCQkJICAgLS0gaXQncyBicm9rZW4gZm9yIFJ4IG9uIHNvbWUgY2FyZHMhICovCisJCQlpbnQgaGlnaCA9IGVpX2licChiYXNlICsgRU4wX1JTQVJISSk7CisJCQlpbnQgbG93ID0gZWlfaWJwKGJhc2UgKyBFTjBfUlNBUkxPKTsKKwkJCWFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkJCWlmICgoKHJpbmdfb2Zmc2V0ICsgYnl0ZXMpICYgMHhmZikgPT0gbG93KQorCQkJCWJyZWFrOworCQl9IHdoaWxlICgtLXRyaWVzID4gMCk7CisJIAlpZiAodHJpZXMgPD0gMCkKKwkJCXByaW50aygiJXM6IFJYIHRyYW5zZmVyIGFkZHJlc3MgbWlzbWF0Y2gsIgorCQkJICAgICAgICIlIzQuNHggKGV4cGVjdGVkKSB2cy4gJSM0LjR4IChhY3R1YWwpLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHJpbmdfb2Zmc2V0ICsgYnl0ZXMsIGFkZHIpOworCX0KKyNlbmRpZgorCWVpX29icChFTklTUl9SREMsIGJhc2UgKyBFTjBfSVNSKTsJLyogQUNLIFJlbW90ZSBETUEgaW50ZXJydXB0ICovCisJZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKKworI2lmZGVmIE9BS05FVF9ESVNJTlQKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKyNlbmRpZgorfQorCisvKgorICogc3RhdGljIHZvaWQgb2FrbmV0X2Jsb2NrX291dHB1dCgpCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFRoaXMgcm91dGluZS4uLgorICoKKyAqIElucHV0KHMpOgorICogICpkZXYgICAgICAgIC0gUG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhpcyBkcml2ZXIuCisgKiAgIGNvdW50ICAgICAgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgdHJhbnNmZXJyZWQuCisgKiAgKmJ1ZiAgICAgICAgLSAKKyAqICAgc3RhcnRfcGFnZSAtIAorICoKKyAqIE91dHB1dChzKToKKyAqICAgTi9BCisgKgorICogUmV0dXJuczoKKyAqICAgTi9BCisgKgorICovCitzdGF0aWMgdm9pZAorb2FrbmV0X2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKQoreworCWludCBiYXNlID0gRTgzOTBfQkFTRTsKKyNpZiAwCisJaW50IGJ1ZzsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisjaWZkZWYgT0FLTkVUX0RJU0lOVAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjZW5kaWYKKyNpZmRlZiBPQUtORVRfSEVBRENIRUNLCisJaW50IHJldHJpZXMgPSAwOworI2VuZGlmCisKKwkvKiBSb3VuZCB0aGUgY291bnQgdXAgZm9yIHdvcmQgd3JpdGVzLiAqLworCisJaWYgKGVpX3N0YXR1cy53b3JkMTYgJiYgKGNvdW50ICYgMHgxKSkKKwkJY291bnQrKzsKKworCS8qCisJICogVGhpcyBzaG91bGQgTk9UIGhhcHBlbi4gSWYgaXQgZG9lcywgaXQgaXMgdGhlIExBU1QgdGhpbmcgeW91J2xsCisJICogc2VlLgorCSAqLworCisJaWYgKGVpX3N0YXR1cy5kbWFpbmcpIHsKKwkJb2FrbmV0X2RtYV9lcnJvcihkZXYsICJvYWtuZXRfYmxvY2tfb3V0cHV0Iik7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBPQUtORVRfRElTSU5UCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisjZW5kaWYKKworCWVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gcGFnZSAwLiAqLworCisJZWlfb2JwKEU4MzkwX1BBR0UwICsgRTgzOTBfU1RBUlQgKyBFODM5MF9OT0RNQSwgYmFzZSArIEU4MzkwX0NNRCk7CisKKyNpZmRlZiBPQUtORVRfSEVBRENIRUNLCityZXRyeToKKyNlbmRpZgorCisjaWYgMAorCS8qCisJICogVGhlIDgzOTAyIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgdGhlIHByb2Nlc3NvciBuZWVkcyB0bworCSAqIGRvIGEgImR1bW15IHJlYWQiIGJlZm9yZSBkb2luZyB0aGUgcmVtb3RlIHdyaXRlIHRvIHdvcmsKKwkgKiBhcm91bmQgYSBjaGlwIGJ1ZyB0aGV5IGRvbid0IGZlZWwgbGlrZSBmaXhpbmcuCisJICovCisKKwlidWcgPSAwOworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIGludCByZGhpOworCQl1bnNpZ25lZCBpbnQgcmRsbzsKKworCQkvKiBOb3cgdGhlIG5vcm1hbCBvdXRwdXQuICovCisJCWVpX29icChFTklTUl9SREMsIGJhc2UgKyBFTjBfSVNSKTsKKwkJZWlfb2JwKGNvdW50ICYgMHhmZiwgYmFzZSArIEVOMF9SQ05UTE8pOworCQllaV9vYnAoY291bnQgPj4gOCwgICBiYXNlICsgRU4wX1JDTlRISSk7CisJCWVpX29icCgweDAwLCBiYXNlICsgRU4wX1JTQVJMTyk7CisJCWVpX29icChzdGFydF9wYWdlLCBiYXNlICsgRU4wX1JTQVJISSk7CisKKwkJaWYgKGJ1ZysrKQorCQkJYnJlYWs7CisKKwkJLyogUGVyZm9ybSB0aGUgZHVtbXkgcmVhZCAqLworCQlyZGhpID0gZWlfaWJwKGJhc2UgKyBFTjBfQ1JEQUhJKTsKKwkJcmRsbyA9IGVpX2licChiYXNlICsgRU4wX0NSREFMTyk7CisJCWVpX29icChFODM5MF9SUkVBRCArIEU4MzkwX1NUQVJULCBiYXNlICsgRTgzOTBfQ01EKTsKKworCQl3aGlsZSAoMSkgeworCQkJdW5zaWduZWQgaW50IG5yZGhpOworCQkJdW5zaWduZWQgaW50IG5yZGxvOworCQkJbnJkaGkgPSBlaV9pYnAoYmFzZSArIEVOMF9DUkRBSEkpOworCQkJbnJkbG8gPSBlaV9pYnAoYmFzZSArIEVOMF9DUkRBTE8pOworCQkJaWYgKChyZGhpICE9IG5yZGhpKSB8fCAocmRsbyAhPSBucmRsbykpCisJCQkJYnJlYWs7CisJCX0KKwl9CisjZWxzZQorI2lmZGVmIE9BS05FVF9SV0ZJWAorCS8qCisJICogSGFuZGxlIHRoZSByZWFkLWJlZm9yZS13cml0ZSBidWcgdGhlIHNhbWUgd2F5IGFzIHRoZQorCSAqIENyeW53ciBwYWNrZXQgZHJpdmVyIC0tIHRoZSBOYXQnbCBTZW1pLiBtZXRob2QgZG9lc24ndCB3b3JrLgorCSAqIEFjdHVhbGx5IHRoaXMgZG9lc24ndCBhbHdheXMgd29yayBlaXRoZXIsIGJ1dCBpZiB5b3UgaGF2ZQorCSAqIHByb2JsZW1zIHdpdGggeW91ciA4MzkwMiB0aGlzIGlzIGJldHRlciB0aGFuIG5vdGhpbmchCisJICovCisKKwllaV9vYnAoMHg0MiwgYmFzZSArIEVOMF9SQ05UTE8pOworCWVpX29icCgweDAwLCBiYXNlICsgRU4wX1JDTlRISSk7CisJZWlfb2JwKDB4NDIsIGJhc2UgKyBFTjBfUlNBUkxPKTsKKwllaV9vYnAoMHgwMCwgYmFzZSArIEVOMF9SU0FSSEkpOworCWVpX29icChFODM5MF9SUkVBRCArIEU4MzkwX1NUQVJULCBiYXNlICsgRTgzOTBfQ01EKTsKKwkvKiBNYWtlIGNlcnRhaW4gdGhhdCB0aGUgZHVtbXkgcmVhZCBoYXMgb2NjdXJyZWQuICovCisJdWRlbGF5KDYpOworI2VuZGlmCisKKwllaV9vYnAoRU5JU1JfUkRDLCBiYXNlICsgRU4wX0lTUik7CisKKwkvKiBOb3cgdGhlIG5vcm1hbCBvdXRwdXQuICovCisJZWlfb2JwKGNvdW50ICYgMHhmZiwgYmFzZSArIEVOMF9SQ05UTE8pOworCWVpX29icChjb3VudCA+PiA4LCAgIGJhc2UgKyBFTjBfUkNOVEhJKTsKKwllaV9vYnAoMHgwMCwgYmFzZSArIEVOMF9SU0FSTE8pOworCWVpX29icChzdGFydF9wYWdlLCBiYXNlICsgRU4wX1JTQVJISSk7CisjZW5kaWYgLyogMC8xICovCisKKwllaV9vYnAoRTgzOTBfUldSSVRFICsgRTgzOTBfU1RBUlQsIGJhc2UgKyBFODM5MF9DTUQpOworCWlmIChlaV9zdGF0dXMud29yZDE2KSB7CisJCWVpX29zdyhFODM5MF9CQVNFICsgRTgzOTBfREFUQSwgYnVmLCBjb3VudCA+PiAxKTsKKwl9IGVsc2UgeworCQllaV9vc2IoRTgzOTBfQkFTRSArIEU4MzkwX0RBVEEsIGJ1ZiwgY291bnQpOworCX0KKworI2lmZGVmIE9BS05FVF9ESVNJTlQKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKyNlbmRpZgorCisJc3RhcnQgPSBqaWZmaWVzOworCisjaWZkZWYgT0FLTkVUX0hFQURDSEVDSworCS8qCisJICogVGhpcyB3YXMgZm9yIHRoZSBBTFBIQSB2ZXJzaW9uIG9ubHksIGJ1dCBlbm91Z2ggcGVvcGxlIGhhdmUKKwkgKiBiZWVuIGVuY291bnRlcmluZyBwcm9ibGVtcyBzbyBpdCBpcyBzdGlsbCBoZXJlLgorCSAqLworCQorCXsKKwkJLyogRE1BIHRlcm1pbmF0aW9uIGFkZHJlc3MgY2hlY2suLi4gKi8KKwkJaW50IGFkZHIsIHRyaWVzID0gMjA7CisJCWRvIHsKKwkJCWludCBoaWdoID0gZWlfaWJwKGJhc2UgKyBFTjBfUlNBUkhJKTsKKwkJCWludCBsb3cgPSBlaV9pYnAoYmFzZSArIEVOMF9SU0FSTE8pOworCQkJYWRkciA9IChoaWdoIDw8IDgpICsgbG93OworCQkJaWYgKChzdGFydF9wYWdlIDw8IDgpICsgY291bnQgPT0gYWRkcikKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoLS10cmllcyA+IDApOworCisJCWlmICh0cmllcyA8PSAwKSB7CisJCQlwcmludGsoIiVzOiBUeCBwYWNrZXQgdHJhbnNmZXIgYWRkcmVzcyBtaXNtYXRjaCwiCisJCQkgICAgICAgIiUjNC40eCAoZXhwZWN0ZWQpIHZzLiAlIzQuNHggKGFjdHVhbCkuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgKHN0YXJ0X3BhZ2UgPDwgOCkgKyBjb3VudCwgYWRkcik7CisJCQlpZiAocmV0cmllcysrID09IDApCisJCQkJZ290byByZXRyeTsKKwkJfQorCX0KKyNlbmRpZgorCisJd2hpbGUgKChlaV9pYnAoYmFzZSArIEVOMF9JU1IpICYgRU5JU1JfUkRDKSA9PSAwKSB7CisJCWlmIChqaWZmaWVzIC0gc3RhcnQgPiBPQUtORVRfV0FJVCkgeworCQkJcHJpbnRrKCIlczogdGltZW91dCB3YWl0aW5nIGZvciBUeCBSREMuXG4iLCBkZXYtPm5hbWUpOworCQkJb2FrbmV0X3Jlc2V0XzgzOTAoZGV2KTsKKwkJCU5TODM5MF9pbml0KGRldiwgVFJVRSk7CisJCQlicmVhazsKKwkJfQorCX0KKwkKKwllaV9vYnAoRU5JU1JfUkRDLCBiYXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7Cit9CisKKy8qCisgKiBzdGF0aWMgdm9pZCBvYWtuZXRfZG1hX2Vycm9yKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyByb3V0aW5lIHByaW50cyBvdXQgYSBsYXN0LWRpdGNoIGluZm9ybWF0aXZlIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUKKyAqICAgaW5kaWNhdGluZyB0aGF0IGEgRE1BIGVycm9yIG9jY3VycmVkLiBJZiB5b3Ugc2VlIHRoaXMsIGl0J3MgdGhlIGxhc3QKKyAqICAgdGhpbmcgeW91J2xsIHNlZS4KKyAqCisgKiBJbnB1dChzKToKKyAqICAqZGV2ICAtIFBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgZHJpdmVyLgorICogICpuYW1lIC0gSW5mb3JtYXRpdmUgdGV4dCAoZS5nLiBmdW5jdGlvbiBuYW1lKSBpbmRpY2F0aW5nIHdoZXJlIHRoZQorICogICAgICAgICAgRE1BIGVycm9yIG9jY3VycmVkLgorICoKKyAqIE91dHB1dChzKToKKyAqICAgTi9BCisgKgorICogUmV0dXJuczoKKyAqICAgTi9BCisgKgorICovCitzdGF0aWMgdm9pZAorb2FrbmV0X2RtYV9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQoreworCXByaW50ayhLRVJOX0VNRVJHICIlczogRE1BaW5nIGNvbmZsaWN0IGluICVzLiIKKwkgICAgICAgIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXVtpbnRyOiVsZF1cbiIsCisJICAgICAgIGRldi0+bmFtZSwgbmFtZSwgZWlfc3RhdHVzLmRtYWluZywgZWlfc3RhdHVzLmlycWxvY2ssCisJICAgICAgIGRldi0+aW50ZXJydXB0KTsKK30KKworLyoKKyAqIE9hayBFdGhlcm5ldCBtb2R1bGUgdW5sb2FkIGludGVyZmFjZS4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IG9ha25ldF9jbGVhbnVwX21vZHVsZSAodm9pZCkKK3sKKwkvKiBDb252ZXJ0IHRvIGxvb3Agb25jZSBkcml2ZXIgc3VwcG9ydHMgbXVsdGlwbGUgZGV2aWNlcy4gKi8KKwl1bnJlZ2lzdGVyX25ldGRldihvYWtuZXRfZGV2KTsKKwlmcmVlX2lycShvYWtuZXRfZGV2cy0+aXJxLCBvYWtuZXRfZGV2cyk7CisJcmVsZWFzZV9yZWdpb24ob2FrbmV0X2RldnMtPmJhc2VfYWRkciwgT0FLTkVUX0lPX1NJWkUpOworCWlvdW5tYXAoaW9hZGRyKTsKKwlmcmVlX25ldGRldihvYWtuZXRfZGV2cyk7Cit9CisKK21vZHVsZV9pbml0KG9ha25ldF9pbml0KTsKK21vZHVsZV9leGl0KG9ha25ldF9jbGVhbnVwX21vZHVsZSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY2ktc2tlbGV0b24uYyBiL2RyaXZlcnMvbmV0L3BjaS1za2VsZXRvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMWMzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY2ktc2tlbGV0b24uYwpAQCAtMCwwICsxLDE5NzcgQEAKKy8qCisKKwlkcml2ZXJzL25ldC9wY2ktc2tlbGV0b24uYworCisJTWFpbnRhaW5lZCBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisKKwlPcmlnaW5hbCBjb2RlIGNhbWUgZnJvbSA4MTM5dG9vLmMsIHdoaWNoIGluIHR1cm5zIHdhcyBiYXNlZAorCW9yaWdpbmFsbHkgb24gRG9uYWxkIEJlY2tlcidzIHJ0bDgxMzkuYyBkcml2ZXIsIHZlcnNpb25zIDEuMTEKKwlhbmQgb2xkZXIuICBUaGlzIGRyaXZlciB3YXMgb3JpZ2luYWxseSBiYXNlZCBvbiBydGw4MTM5LmMKKwl2ZXJzaW9uIDEuMDcuICBIZWFkZXIgb2YgcnRsODEzOS5jIHZlcnNpb24gMS4xMToKKworCS0tLS0tPHNuaXA+LS0tLS0KKworICAgICAgICAJV3JpdHRlbiAxOTk3LTIwMDAgYnkgRG9uYWxkIEJlY2tlci4KKwkJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZQorCQl0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZAorCQloZXJlaW4gYnkgcmVmZXJlbmNlLiAgRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcworCQljb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdCByZXRhaW4gdGhlIGF1dGhvcnNoaXAsCisJCWNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90IGEgY29tcGxldGUKKwkJcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJCVRoaXMgZHJpdmVyIGlzIGZvciBib2FyZHMgYmFzZWQgb24gdGhlIFJUTDgxMjkgYW5kIFJUTDgxMzkKKwkJUENJIGV0aGVybmV0IGNoaXBzLgorCisJCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PIFNjeWxkCisJCUNvbXB1dGluZyBDb3Jwb3JhdGlvbiA0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMCBBbm5hcG9saXMKKwkJTUQgMjE0MDMKKworCQlTdXBwb3J0IGFuZCB1cGRhdGVzIGF2YWlsYWJsZSBhdAorCQlodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL3J0bDgxMzkuaHRtbAorCisJCVR3aXN0ZXItdHVuaW5nIHRhYmxlIHByb3ZpZGVkIGJ5IEtpbnN0b24KKwkJPHNoYW5naEByZWFsdGVrLmNvbS50dz4uCisKKwktLS0tLTxzbmlwPi0tLS0tCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCitJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisKK1RoaXMgZGV2aWNlIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIFJlYWxUZWsgUlRMODEzOSBzZXJpZXMsIHRoZSBSZWFsVGVrCitGYXN0IEV0aGVybmV0IGNvbnRyb2xsZXJzIGZvciBQQ0kgYW5kIENhcmRCdXMuICBUaGlzIGNoaXAgaXMgdXNlZCBvbiBtYW55Citsb3ctZW5kIGJvYXJkcywgc29tZXRpbWVzIHdpdGggaXRzIG1hcmtpbmdzIGNoYW5nZWQuCisKKworSUkuIEJvYXJkLXNwZWNpZmljIHNldHRpbmdzCisKK1BDSSBidXMgZGV2aWNlcyBhcmUgY29uZmlndXJlZCBieSB0aGUgc3lzdGVtIGF0IGJvb3QgdGltZSwgc28gbm8ganVtcGVycworbmVlZCB0byBiZSBzZXQgb24gdGhlIGJvYXJkLiAgVGhlIHN5c3RlbSBCSU9TIHdpbGwgYXNzaWduIHRoZQorUENJIElOVEEgc2lnbmFsIHRvIGEgKHByZWZlcmFibHkgb3RoZXJ3aXNlIHVudXNlZCkgc3lzdGVtIElSUSBsaW5lLgorCitJSUkuIERyaXZlciBvcGVyYXRpb24KKworSUlJYS4gUnggUmluZyBidWZmZXJzCisKK1RoZSByZWNlaXZlIHVuaXQgdXNlcyBhIHNpbmdsZSBsaW5lYXIgcmluZyBidWZmZXIgcmF0aGVyIHRoYW4gdGhlIG1vcmUKK2NvbW1vbiAoYW5kIG1vcmUgZWZmaWNpZW50KSBkZXNjcmlwdG9yLWJhc2VkIGFyY2hpdGVjdHVyZS4gIEluY29taW5nIGZyYW1lcworYXJlIHNlcXVlbnRpYWxseSBzdG9yZWQgaW50byB0aGUgUnggcmVnaW9uLCBhbmQgdGhlIGhvc3QgY29waWVzIHRoZW0gaW50bworc2tidWZmcy4KKworQ29tbWVudDogV2hpbGUgaXQgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0byBwcm9jZXNzIG1hbnkgZnJhbWVzIGluIHBsYWNlLAorYW55IGRlbGF5IGluIFJ4IHByb2Nlc3Npbmcgd291bGQgY2F1c2UgdXMgdG8gZHJvcCBmcmFtZXMuICBNb3JlIGltcG9ydGFudGx5LAordGhlIExpbnV4IHByb3RvY29sIHN0YWNrIGlzIG5vdCBkZXNpZ25lZCB0byBvcGVyYXRlIGluIHRoaXMgbWFubmVyLgorCitJSUliLiBUeCBvcGVyYXRpb24KKworVGhlIFJUTDgxMzkgdXNlcyBhIGZpeGVkIHNldCBvZiBmb3VyIFR4IGRlc2NyaXB0b3JzIGluIHJlZ2lzdGVyIHNwYWNlLgorSW4gYSBzdHVubmluZ2x5IGJhZCBkZXNpZ24gY2hvaWNlLCBUeCBmcmFtZXMgbXVzdCBiZSAzMiBiaXQgYWxpZ25lZC4gIExpbnV4CithbGlnbnMgdGhlIElQIGhlYWRlciBvbiB3b3JkIGJvdW5kYXJpZXMsIGFuZCAxNCBieXRlIGV0aGVybmV0IGhlYWRlciBtZWFucwordGhhdCBhbG1vc3QgYWxsIGZyYW1lcyB3aWxsIG5lZWQgdG8gYmUgY29waWVkIHRvIGFuIGFsaWdubWVudCBidWZmZXIuCisKK0lWYi4gUmVmZXJlbmNlcworCitodHRwOi8vd3d3LnJlYWx0ZWsuY29tLnR3L2NuL2NuLmh0bWwKK2h0dHA6Ly93d3cuc2N5bGQuY29tL2V4cGVydC9OV2F5Lmh0bWwKKworSVZjLiBFcnJhdGEKKworKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgTkVURFJWX1ZFUlNJT04JCSIxLjAuMCIKKyNkZWZpbmUgTU9ETkFNRQkJCSJuZXRkcnYiCisjZGVmaW5lIE5FVERSVl9EUklWRVJfTE9BRF9NU0cJIk15VmVuZG9yIEZhc3QgRXRoZXJuZXQgZHJpdmVyICIgTkVURFJWX1ZFUlNJT04gIiBsb2FkZWQiCisjZGVmaW5lIFBGWAkJCU1PRE5BTUUgIjogIgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gTkVURFJWX0RSSVZFUl9MT0FEX01TRyAiXG4iCitLRVJOX0lORk8gIiAgU3VwcG9ydCBhdmFpbGFibGUgZnJvbSBodHRwOi8vZm9vLmNvbS9iYXIvYmF6Lmh0bWxcbiI7CisKKy8qIGRlZmluZSB0byAxIHRvIGVuYWJsZSBQSU8gaW5zdGVhZCBvZiBNTUlPICovCisjdW5kZWYgVVNFX0lPX09QUworCisvKiBkZWZpbmUgdG8gMSB0byBlbmFibGUgY29waW91cyBkZWJ1Z2dpbmcgaW5mbyAqLworI3VuZGVmIE5FVERSVl9ERUJVRworCisvKiBkZWZpbmUgdG8gMSB0byBkaXNhYmxlIGxpZ2h0d2VpZ2h0IHJ1bnRpbWUgZGVidWdnaW5nIGNoZWNrcyAqLworI3VuZGVmIE5FVERSVl9OREVCVUcKKworCisjaWZkZWYgTkVURFJWX0RFQlVHCisvKiBub3RlOiBwcmludHMgZnVuY3Rpb24gbmFtZSBmb3IgeW91ICovCisjICBkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHICIlczogIiBmbXQsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCisjZWxzZQorIyAgZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKyNpZmRlZiBORVREUlZfTkRFQlVHCisjICBkZWZpbmUgYXNzZXJ0KGV4cHIpIGRvIHt9IHdoaWxlICgwKQorI2Vsc2UKKyMgIGRlZmluZSBhc3NlcnQoZXhwcikgXAorICAgICAgICBpZighKGV4cHIpKSB7CQkJCQlcCisgICAgICAgIHByaW50ayggIkFzc2VydGlvbiBmYWlsZWQhICVzLCVzLCVzLGxpbmU9JWRcbiIsCVwKKyAgICAgICAgI2V4cHIsX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fKTsJCVwKKyAgICAgICAgfQorI2VuZGlmCisKKworLyogQSBmZXcgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLiAqLworLyogbWVkaWEgb3B0aW9ucyAqLworc3RhdGljIGludCBtZWRpYVtdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CisKKy8qIE1heGltdW0gZXZlbnRzIChSeCBwYWNrZXRzLCBldGMuKSB0byBoYW5kbGUgYXQgZWFjaCBpbnRlcnJ1cHQuICovCitzdGF0aWMgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDIwOworCisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIFJ4LWFsbC1tdWx0aWNhc3QpLgorICAgVGhlIFJUTCBjaGlwcyB1c2UgYSA2NCBlbGVtZW50IGhhc2ggdGFibGUgYmFzZWQgb24gdGhlIEV0aGVybmV0IENSQy4gICovCitzdGF0aWMgaW50IG11bHRpY2FzdF9maWx0ZXJfbGltaXQgPSAzMjsKKworLyogU2l6ZSBvZiB0aGUgaW4tbWVtb3J5IHJlY2VpdmUgcmluZy4gKi8KKyNkZWZpbmUgUlhfQlVGX0xFTl9JRFgJMgkvKiAwPT04SywgMT09MTZLLCAyPT0zMkssIDM9PTY0SyAqLworI2RlZmluZSBSWF9CVUZfTEVOICg4MTkyIDw8IFJYX0JVRl9MRU5fSURYKQorI2RlZmluZSBSWF9CVUZfUEFEIDE2CisjZGVmaW5lIFJYX0JVRl9XUkFQX1BBRCAyMDQ4IC8qIHNwYXJlIHBhZGRpbmcgdG8gaGFuZGxlIGxhY2sgb2YgcGFja2V0IHdyYXAgKi8KKyNkZWZpbmUgUlhfQlVGX1RPVF9MRU4gKFJYX0JVRl9MRU4gKyBSWF9CVUZfUEFEICsgUlhfQlVGX1dSQVBfUEFEKQorCisvKiBOdW1iZXIgb2YgVHggZGVzY3JpcHRvciByZWdpc3RlcnMuICovCisjZGVmaW5lIE5VTV9UWF9ERVNDCTQKKworLyogbWF4IHN1cHBvcnRlZCBldGhlcm5ldCBmcmFtZSBzaXplIC0tIG11c3QgYmUgYXQgbGVhc3QgKGRldi0+bXR1KzE0KzQpLiovCisjZGVmaW5lIE1BWF9FVEhfRlJBTUVfU0laRQkxNTM2CisKKy8qIFNpemUgb2YgdGhlIFR4IGJvdW5jZSBidWZmZXJzIC0tIG11c3QgYmUgYXQgbGVhc3QgKGRldi0+bXR1KzE0KzQpLiAqLworI2RlZmluZSBUWF9CVUZfU0laRQlNQVhfRVRIX0ZSQU1FX1NJWkUKKyNkZWZpbmUgVFhfQlVGX1RPVF9MRU4JKFRYX0JVRl9TSVpFICogTlVNX1RYX0RFU0MpCisKKy8qIFBDSSBUdW5pbmcgUGFyYW1ldGVycworICAgVGhyZXNob2xkIGlzIGJ5dGVzIHRyYW5zZmVycmVkIHRvIGNoaXAgYmVmb3JlIHRyYW5zbWlzc2lvbiBzdGFydHMuICovCisjZGVmaW5lIFRYX0ZJRk9fVEhSRVNIIDI1NgkvKiBJbiBieXRlcywgcm91bmRlZCBkb3duIHRvIDMyIGJ5dGUgdW5pdHMuICovCisKKy8qIFRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgYXJlIGxvZ18yKGJ5dGVzKS00OiAgMCA9PSAxNiBieXRlcyAuLiA2PT0xMDI0LCA3PT1lbmQgb2YgcGFja2V0LiAqLworI2RlZmluZSBSWF9GSUZPX1RIUkVTSAk2CS8qIFJ4IGJ1ZmZlciBsZXZlbCBiZWZvcmUgZmlyc3QgUENJIHhmZXIuICAqLworI2RlZmluZSBSWF9ETUFfQlVSU1QJNgkvKiBNYXhpbXVtIFBDSSBidXJzdCwgJzYnIGlzIDEwMjQgKi8KKyNkZWZpbmUgVFhfRE1BX0JVUlNUCTYJLyogTWF4aW11bSBQQ0kgYnVyc3QsICc2JyBpcyAxMDI0ICovCisKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoNipIWikKKworCitlbnVtIHsKKwlIQVNfQ0hJUF9YQ1ZSID0gMHgwMjAwMDAsCisJSEFTX0xOS19DSE5HID0gMHgwNDAwMDAsCit9OworCisjZGVmaW5lIE5FVERSVl9NSU5fSU9fU0laRSAweDgwCisjZGVmaW5lIFJUTDgxMzlCX0lPX1NJWkUgMjU2CisKKyNkZWZpbmUgTkVURFJWX0NBUFMJSEFTX0NISVBfWENWUnxIQVNfTE5LX0NITkcKKwordHlwZWRlZiBlbnVtIHsKKwlSVEw4MTM5ID0gMCwKKwlORVREUlZfQ0IsCisJU01DMTIxMVRYLAorCS8qTVBYNTAzMCwqLworCURFTFRBODEzOSwKKwlBRERUUk9OODEzOSwKK30gYm9hcmRfdDsKKworCisvKiBpbmRleGVkIGJ5IGJvYXJkX3QsIGFib3ZlICovCitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworfSBib2FyZF9pbmZvW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7ICJSZWFsVGVrIFJUTDgxMzkgRmFzdCBFdGhlcm5ldCIgfSwKKwl7ICJSZWFsVGVrIFJUTDgxMzlCIFBDSS9DYXJkQnVzIiB9LAorCXsgIlNNQzEyMTFUWCBFWkNhcmQgMTAvMTAwIChSZWFsVGVrIFJUTDgxMzkpIiB9LAorLyoJeyBNUFg1MDMwLCAiQWNjdG9uIE1QWDUwMzAgKFJlYWxUZWsgUlRMODEzOSkiIH0sKi8KKwl7ICJEZWx0YSBFbGVjdHJvbmljcyA4MTM5IDEwLzEwMEJhc2VUWCIgfSwKKwl7ICJBZGR0cm9uIFRlY2hub2xneSA4MTM5IDEwLzEwMEJhc2VUWCIgfSwKK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG5ldGRydl9wY2lfdGJsW10gPSB7CisJezB4MTBlYywgMHg4MTM5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBSVEw4MTM5IH0sCisJezB4MTBlYywgMHg4MTM4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBORVREUlZfQ0IgfSwKKwl7MHgxMTEzLCAweDEyMTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFNNQzEyMTFUWCB9LAorLyoJezB4MTExMywgMHgxMjExLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNUFg1MDMwIH0sKi8KKwl7MHgxNTAwLCAweDEzNjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERFTFRBODEzOSB9LAorCXsweDQwMzMsIDB4MTM2MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQUREVFJPTjgxMzkgfSwKKwl7MCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBuZXRkcnZfcGNpX3RibCk7CisKKworLyogVGhlIHJlc3Qgb2YgdGhlc2UgdmFsdWVzIHNob3VsZCBuZXZlciBjaGFuZ2UuICovCisKKy8qIFN5bWJvbGljIG9mZnNldHMgdG8gcmVnaXN0ZXJzLiAqLworZW51bSBORVREUlZfcmVnaXN0ZXJzIHsKKwlNQUMwID0gMCwJCS8qIEV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MuICovCisJTUFSMCA9IDgsCQkvKiBNdWx0aWNhc3QgZmlsdGVyLiAqLworCVR4U3RhdHVzMCA9IDB4MTAsCS8qIFRyYW5zbWl0IHN0YXR1cyAoRm91ciAzMmJpdCByZWdpc3RlcnMpLiAqLworCVR4QWRkcjAgPSAweDIwLAkJLyogVHggZGVzY3JpcHRvcnMgKGFsc28gZm91ciAzMmJpdCkuICovCisJUnhCdWYgPSAweDMwLAorCVJ4RWFybHlDbnQgPSAweDM0LAorCVJ4RWFybHlTdGF0dXMgPSAweDM2LAorCUNoaXBDbWQgPSAweDM3LAorCVJ4QnVmUHRyID0gMHgzOCwKKwlSeEJ1ZkFkZHIgPSAweDNBLAorCUludHJNYXNrID0gMHgzQywKKwlJbnRyU3RhdHVzID0gMHgzRSwKKwlUeENvbmZpZyA9IDB4NDAsCisJQ2hpcFZlcnNpb24gPSAweDQzLAorCVJ4Q29uZmlnID0gMHg0NCwKKwlUaW1lciA9IDB4NDgsCQkvKiBBIGdlbmVyYWwtcHVycG9zZSBjb3VudGVyLiAqLworCVJ4TWlzc2VkID0gMHg0QywJLyogMjQgYml0cyB2YWxpZCwgd3JpdGUgY2xlYXJzLiAqLworCUNmZzkzNDYgPSAweDUwLAorCUNvbmZpZzAgPSAweDUxLAorCUNvbmZpZzEgPSAweDUyLAorCUZsYXNoUmVnID0gMHg1NCwKKwlNZWRpYVN0YXR1cyA9IDB4NTgsCisJQ29uZmlnMyA9IDB4NTksCisJQ29uZmlnNCA9IDB4NUEsCQkvKiBhYnNlbnQgb24gUlRMLTgxMzlBICovCisJSGx0Q2xrID0gMHg1QiwKKwlNdWx0aUludHIgPSAweDVDLAorCVR4U3VtbWFyeSA9IDB4NjAsCisJQmFzaWNNb2RlQ3RybCA9IDB4NjIsCisJQmFzaWNNb2RlU3RhdHVzID0gMHg2NCwKKwlOV2F5QWR2ZXJ0ID0gMHg2NiwKKwlOV2F5TFBBUiA9IDB4NjgsCisJTldheUV4cGFuc2lvbiA9IDB4NkEsCisJLyogVW5kb2N1bWVudGVkIHJlZ2lzdGVycywgYnV0IHJlcXVpcmVkIGZvciBwcm9wZXIgb3BlcmF0aW9uLiAqLworCUZJRk9UTVMgPSAweDcwLAkJLyogRklGTyBDb250cm9sIGFuZCB0ZXN0LiAqLworCUNTQ1IgPSAweDc0LAkJLyogQ2hpcCBTdGF0dXMgYW5kIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuICovCisJUEFSQTc4ID0gMHg3OCwKKwlQQVJBN2MgPSAweDdjLAkJLyogTWFnaWMgdHJhbnNjZWl2ZXIgcGFyYW1ldGVyIHJlZ2lzdGVyLiAqLworCUNvbmZpZzUgPSAweEQ4LAkJLyogYWJzZW50IG9uIFJUTC04MTM5QSAqLworfTsKKworZW51bSBDbGVhckJpdE1hc2tzIHsKKwlNdWx0aUludHJDbGVhciA9IDB4RjAwMCwKKwlDaGlwQ21kQ2xlYXIgPSAweEUyLAorCUNvbmZpZzFDbGVhciA9ICgxPDw3KXwoMTw8Nil8KDE8PDMpfCgxPDwyKXwoMTw8MSksCit9OworCitlbnVtIENoaXBDbWRCaXRzIHsKKwlDbWRSZXNldCA9IDB4MTAsCisJQ21kUnhFbmIgPSAweDA4LAorCUNtZFR4RW5iID0gMHgwNCwKKwlSeEJ1ZkVtcHR5ID0gMHgwMSwKK307CisKKy8qIEludGVycnVwdCByZWdpc3RlciBiaXRzLCB1c2luZyBteSBvd24gbWVhbmluZ2Z1bCBuYW1lcy4gKi8KK2VudW0gSW50clN0YXR1c0JpdHMgeworCVBDSUVyciA9IDB4ODAwMCwKKwlQQ1NUaW1lb3V0ID0gMHg0MDAwLAorCVJ4RklGT092ZXIgPSAweDQwLAorCVJ4VW5kZXJydW4gPSAweDIwLAorCVJ4T3ZlcmZsb3cgPSAweDEwLAorCVR4RXJyID0gMHgwOCwKKwlUeE9LID0gMHgwNCwKKwlSeEVyciA9IDB4MDIsCisJUnhPSyA9IDB4MDEsCit9OworZW51bSBUeFN0YXR1c0JpdHMgeworCVR4SG9zdE93bnMgPSAweDIwMDAsCisJVHhVbmRlcnJ1biA9IDB4NDAwMCwKKwlUeFN0YXRPSyA9IDB4ODAwMCwKKwlUeE91dE9mV2luZG93ID0gMHgyMDAwMDAwMCwKKwlUeEFib3J0ZWQgPSAweDQwMDAwMDAwLAorCVR4Q2Fycmllckxvc3QgPSAweDgwMDAwMDAwLAorfTsKK2VudW0gUnhTdGF0dXNCaXRzIHsKKwlSeE11bHRpY2FzdCA9IDB4ODAwMCwKKwlSeFBoeXNpY2FsID0gMHg0MDAwLAorCVJ4QnJvYWRjYXN0ID0gMHgyMDAwLAorCVJ4QmFkU3ltYm9sID0gMHgwMDIwLAorCVJ4UnVudCA9IDB4MDAxMCwKKwlSeFRvb0xvbmcgPSAweDAwMDgsCisJUnhDUkNFcnIgPSAweDAwMDQsCisJUnhCYWRBbGlnbiA9IDB4MDAwMiwKKwlSeFN0YXR1c09LID0gMHgwMDAxLAorfTsKKworLyogQml0cyBpbiBSeENvbmZpZy4gKi8KK2VudW0gcnhfbW9kZV9iaXRzIHsKKwlBY2NlcHRFcnIgPSAweDIwLAorCUFjY2VwdFJ1bnQgPSAweDEwLAorCUFjY2VwdEJyb2FkY2FzdCA9IDB4MDgsCisJQWNjZXB0TXVsdGljYXN0ID0gMHgwNCwKKwlBY2NlcHRNeVBoeXMgPSAweDAyLAorCUFjY2VwdEFsbFBoeXMgPSAweDAxLAorfTsKKworLyogQml0cyBpbiBUeENvbmZpZy4gKi8KK2VudW0gdHhfY29uZmlnX2JpdHMgeworCVR4SUZHMSA9ICgxIDw8IDI1KSwJLyogSW50ZXJmcmFtZSBHYXAgVGltZSAqLworCVR4SUZHMCA9ICgxIDw8IDI0KSwJLyogRW5hYmxpbmcgdGhlc2UgYml0cyB2aW9sYXRlcyBJRUVFIDgwMi4zICovCisJVHhMb29wQmFjayA9ICgxIDw8IDE4KSB8ICgxIDw8IDE3KSwgLyogZW5hYmxlIGxvb3BiYWNrIHRlc3QgbW9kZSAqLworCVR4Q1JDID0gKDEgPDwgMTYpLAkvKiBESVNBQkxFIGFwcGVuZGluZyBDUkMgdG8gZW5kIG9mIFR4IHBhY2tldHMgKi8KKwlUeENsZWFyQWJ0ID0gKDEgPDwgMCksCS8qIENsZWFyIGFib3J0IChXTykgKi8KKwlUeERNQVNoaWZ0ID0gOCwJCS8qIERNQSBidXJzdCB2YWx1ZSAoMC03KSBpcyBzaGlmdCB0aGlzIG1hbnkgYml0cyAqLworCisJVHhWZXJzaW9uTWFzayA9IDB4N0M4MDAwMDAsIC8qIG1hc2sgb3V0IHZlcnNpb24gYml0cyAzMC0yNiwgMjMgKi8KK307CisKKy8qIEJpdHMgaW4gQ29uZmlnMSAqLworZW51bSBDb25maWcxQml0cyB7CisJQ2ZnMV9QTV9FbmFibGUgPSAweDAxLAorCUNmZzFfVlBEX0VuYWJsZSA9IDB4MDIsCisJQ2ZnMV9QSU8gPSAweDA0LAorCUNmZzFfTU1JTyA9IDB4MDgsCisJQ2ZnMV9MV0FLRSA9IDB4MTAsCisJQ2ZnMV9Ecml2ZXJfTG9hZCA9IDB4MjAsCisJQ2ZnMV9MRUQwID0gMHg0MCwKKwlDZmcxX0xFRDEgPSAweDgwLAorfTsKKworZW51bSBSeENvbmZpZ0JpdHMgeworCS8qIEVhcmx5IFJ4IHRocmVzaG9sZCwgbm9uZSBvciBYLzE2ICovCisJUnhDZmdFYXJseVJ4Tm9uZSA9IDAsCisJUnhDZmdFYXJseVJ4U2hpZnQgPSAyNCwKKworCS8qIHJ4IGZpZm8gdGhyZXNob2xkICovCisJUnhDZmdGSUZPU2hpZnQgPSAxMywKKwlSeENmZ0ZJRk9Ob25lID0gKDcgPDwgUnhDZmdGSUZPU2hpZnQpLAorCisJLyogTWF4IERNQSBidXJzdCAqLworCVJ4Q2ZnRE1BU2hpZnQgPSA4LAorCVJ4Q2ZnRE1BVW5saW1pdGVkID0gKDcgPDwgUnhDZmdETUFTaGlmdCksCisKKwkvKiByeCByaW5nIGJ1ZmZlciBsZW5ndGggKi8KKwlSeENmZ1JjdjhLID0gMCwKKwlSeENmZ1JjdjE2SyA9ICgxIDw8IDExKSwKKwlSeENmZ1JjdjMySyA9ICgxIDw8IDEyKSwKKwlSeENmZ1JjdjY0SyA9ICgxIDw8IDExKSB8ICgxIDw8IDEyKSwKKworCS8qIERpc2FibGUgcGFja2V0IHdyYXAgYXQgZW5kIG9mIFJ4IGJ1ZmZlciAqLworCVJ4Tm9XcmFwID0gKDEgPDwgNyksCit9OworCisKKy8qIFR3aXN0ZXIgdHVuaW5nIHBhcmFtZXRlcnMgZnJvbSBSZWFsVGVrLgorICAgQ29tcGxldGVseSB1bmRvY3VtZW50ZWQsIGJ1dCByZXF1aXJlZCB0byB0dW5lIGJhZCBsaW5rcy4gKi8KK2VudW0gQ1NDUkJpdHMgeworCUNTQ1JfTGlua09LQml0ID0gMHgwNDAwLAorCUNTQ1JfTGlua0NoYW5nZUJpdCA9IDB4MDgwMCwKKwlDU0NSX0xpbmtTdGF0dXNCaXRzID0gMHgwZjAwMCwKKwlDU0NSX0xpbmtEb3duT2ZmQ21kID0gMHgwMDNjMCwKKwlDU0NSX0xpbmtEb3duQ21kID0gMHgwZjNjMCwKK307CisKKworZW51bSBDZmc5MzQ2Qml0cyB7CisJQ2ZnOTM0Nl9Mb2NrID0gMHgwMCwKKwlDZmc5MzQ2X1VubG9jayA9IDB4QzAsCit9OworCisKKyNkZWZpbmUgUEFSQTc4X2RlZmF1bHQJMHg3OGZhODM4OAorI2RlZmluZSBQQVJBN2NfZGVmYXVsdAkweGNiMzhkZTQzCS8qIHBhcmFtWzBdWzNdICovCisjZGVmaW5lIFBBUkE3Y194eHgJCTB4Y2IzOGRlNDMKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHBhcmFtWzRdWzRdID0geworCXsweGNiMzlkZTQzLCAweGNiMzljZTQzLCAweGZiMzhkZTAzLCAweGNiMzhkZTQzfSwKKwl7MHhjYjM5ZGU0MywgMHhjYjM5Y2U0MywgMHhjYjM5Y2U4MywgMHhjYjM5Y2U4M30sCisJezB4Y2IzOWRlNDMsIDB4Y2IzOWNlNDMsIDB4Y2IzOWNlODMsIDB4Y2IzOWNlODN9LAorCXsweGJiMzlkZTQzLCAweGJiMzljZTQzLCAweGJiMzljZTgzLCAweGJiMzljZTgzfQorfTsKKworc3RydWN0IHJpbmdfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlkbWFfYWRkcl90IG1hcHBpbmc7Cit9OworCisKK3R5cGVkZWYgZW51bSB7CisJQ0hfODEzOSA9IDAsCisJQ0hfODEzOV9LLAorCUNIXzgxMzlBLAorCUNIXzgxMzlCLAorCUNIXzgxMzAsCisJQ0hfODEzOUMsCit9IGNoaXBfdDsKKworCisvKiBkaXJlY3RseSBpbmRleGVkIGJ5IGNoaXBfdCwgYWJvdmUgKi8KK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTggdmVyc2lvbjsgLyogZnJvbSBSVEw4MTM5QyBkb2NzICovCisJdTMyIFJ4Q29uZmlnTWFzazsgLyogc2hvdWxkIGNsZWFyIHRoZSBiaXRzIHN1cHBvcnRlZCBieSB0aGlzIGNoaXAgKi8KK30gcnRsX2NoaXBfaW5mb1tdID0geworCXsgIlJUTC04MTM5IiwKKwkgIDB4NDAsCisJICAweGYwZmUwMDQwLCAvKiBYWFggY29waWVkIGZyb20gUlRMODEzOUEsIHZlcmlmeSAqLworCX0sCisKKwl7ICJSVEwtODEzOSByZXYgSyIsCisJICAweDYwLAorCSAgMHhmMGZlMDA0MCwKKwl9LAorCisJeyAiUlRMLTgxMzlBIiwKKwkgIDB4NzAsCisJICAweGYwZmUwMDQwLAorCX0sCisKKwl7ICJSVEwtODEzOUIiLAorCSAgMHg3OCwKKwkgIDB4ZjBmYzAwNDAKKwl9LAorCisJeyAiUlRMLTgxMzAiLAorCSAgMHg3QywKKwkgIDB4ZjBmZTAwNDAsIC8qIFhYWCBjb3BpZWQgZnJvbSBSVEw4MTM5QSwgdmVyaWZ5ICovCisJfSwKKworCXsgIlJUTC04MTM5QyIsCisJICAweDc0LAorCSAgMHhmMGZjMDA0MCwgLyogWFhYIGNvcGllZCBmcm9tIFJUTDgxMzlCLCB2ZXJpZnkgKi8KKwl9LAorCit9OworCisKK3N0cnVjdCBuZXRkcnZfcHJpdmF0ZSB7CisJYm9hcmRfdCBib2FyZDsKKwl2b2lkICptbWlvX2FkZHI7CisJaW50IGRydl9mbGFnczsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogTWVkaWEgc2VsZWN0aW9uIHRpbWVyLiAqLworCXVuc2lnbmVkIGNoYXIgKnJ4X3Jpbmc7CisJdW5zaWduZWQgaW50IGN1cl9yeDsJLyogSW5kZXggaW50byB0aGUgUnggYnVmZmVyIG9mIG5leHQgUnggcGt0LiAqLworCXVuc2lnbmVkIGludCB0eF9mbGFnOworCWF0b21pY190IGN1cl90eDsKKwlhdG9taWNfdCBkaXJ0eV90eDsKKwkvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQtaW4tcGxhY2UgcGFja2V0L2J1ZmZlciwgZm9yIHNrZnJlZSgpLiAqLworCXN0cnVjdCByaW5nX2luZm8gdHhfaW5mb1tOVU1fVFhfREVTQ107CisJdW5zaWduZWQgY2hhciAqdHhfYnVmW05VTV9UWF9ERVNDXTsJLyogVHggYm91bmNlIGJ1ZmZlcnMgKi8KKwl1bnNpZ25lZCBjaGFyICp0eF9idWZzOwkvKiBUeCBib3VuY2UgYnVmZmVyIHJlZ2lvbi4gKi8KKwlkbWFfYWRkcl90IHJ4X3JpbmdfZG1hOworCWRtYV9hZGRyX3QgdHhfYnVmc19kbWE7CisJY2hhciBwaHlzWzRdOwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisJY2hhciB0d2lzdGllLCB0d2lzdF9yb3csIHR3aXN0X2NvbDsJLyogVHdpc3RlciB0dW5lIHN0YXRlLiAqLworCXVuc2lnbmVkIGludCBmdWxsX2R1cGxleDoxOwkvKiBGdWxsLWR1cGxleCBvcGVyYXRpb24gcmVxdWVzdGVkLiAqLworCXVuc2lnbmVkIGludCBkdXBsZXhfbG9jazoxOworCXVuc2lnbmVkIGludCBkZWZhdWx0X3BvcnQ6NDsJLyogTGFzdCBkZXYtPmlmX3BvcnQgdmFsdWUuICovCisJdW5zaWduZWQgaW50IG1lZGlhMjo0OwkvKiBTZWNvbmRhcnkgbW9uaXRvcmVkIG1lZGlhIHBvcnQuICovCisJdW5zaWduZWQgaW50IG1lZGlhbG9jazoxOwkvKiBEb24ndCBzZW5zZSBtZWRpYSB0eXBlLiAqLworCXVuc2lnbmVkIGludCBtZWRpYXNlbnNlOjE7CS8qIE1lZGlhIHNlbnNpbmcgaW4gcHJvZ3Jlc3MuICovCisJc3BpbmxvY2tfdCBsb2NrOworCWNoaXBfdCBjaGlwc2V0OworfTsKKworTU9EVUxFX0FVVEhPUiAoIkplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTiAoIlNrZWxldG9uIGZvciBhIFBDSSBGYXN0IEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1BBUk0gKG11bHRpY2FzdF9maWx0ZXJfbGltaXQsICJpIik7CitNT0RVTEVfUEFSTSAobWF4X2ludGVycnVwdF93b3JrLCAiaSIpOworTU9EVUxFX1BBUk0gKG1lZGlhLCAiMS0iIF9fTU9EVUxFX1NUUklORyg4KSAiaSIpOworTU9EVUxFX1BBUk1fREVTQyAobXVsdGljYXN0X2ZpbHRlcl9saW1pdCwgInBjaS1za2VsZXRvbiBtYXhpbXVtIG51bWJlciBvZiBmaWx0ZXJlZCBtdWx0aWNhc3QgYWRkcmVzc2VzIik7CitNT0RVTEVfUEFSTV9ERVNDIChtYXhfaW50ZXJydXB0X3dvcmssICJwY2ktc2tlbGV0b24gbWF4aW11bSBldmVudHMgaGFuZGxlZCBwZXIgaW50ZXJydXB0Iik7CitNT0RVTEVfUEFSTV9ERVNDIChtZWRpYSwgInBjaS1za2VsZXRvbjogQml0cyAwLTM6IG1lZGlhIHR5cGUsIGJpdCAxNzogZnVsbCBkdXBsZXgiKTsKKworc3RhdGljIGludCByZWFkX2VlcHJvbSAodm9pZCAqaW9hZGRyLCBpbnQgbG9jYXRpb24sIGludCBhZGRyX2xlbik7CitzdGF0aWMgaW50IG5ldGRydl9vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWRpb19yZWFkIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworc3RhdGljIHZvaWQgbWRpb193cml0ZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLAorCQkJaW50IHZhbCk7CitzdGF0aWMgdm9pZCBuZXRkcnZfdGltZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBuZXRkcnZfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBuZXRkcnZfaW5pdF9yaW5nIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0ZHJ2X3N0YXJ0X3htaXQgKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgbmV0ZHJ2X2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLAorCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgbmV0ZHJ2X2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0ZHJ2X2lvY3RsIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0ZHJ2X2dldF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBuZXRkcnZfc2V0X3J4X21vZGUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmV0ZHJ2X2h3X3N0YXJ0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCisjaWZkZWYgVVNFX0lPX09QUworCisjZGVmaW5lIE5FVERSVl9SOChyZWcpCQlpbmIgKCgodW5zaWduZWQgbG9uZylpb2FkZHIpICsgKHJlZykpCisjZGVmaW5lIE5FVERSVl9SMTYocmVnKQkJaW53ICgoKHVuc2lnbmVkIGxvbmcpaW9hZGRyKSArIChyZWcpKQorI2RlZmluZSBORVREUlZfUjMyKHJlZykJCSgodW5zaWduZWQgbG9uZykgaW5sICgoKHVuc2lnbmVkIGxvbmcpaW9hZGRyKSArIChyZWcpKSkKKyNkZWZpbmUgTkVURFJWX1c4KHJlZywgdmFsOCkJb3V0YiAoKHZhbDgpLCAoKHVuc2lnbmVkIGxvbmcpaW9hZGRyKSArIChyZWcpKQorI2RlZmluZSBORVREUlZfVzE2KHJlZywgdmFsMTYpCW91dHcgKCh2YWwxNiksICgodW5zaWduZWQgbG9uZylpb2FkZHIpICsgKHJlZykpCisjZGVmaW5lIE5FVERSVl9XMzIocmVnLCB2YWwzMikJb3V0bCAoKHZhbDMyKSwgKCh1bnNpZ25lZCBsb25nKWlvYWRkcikgKyAocmVnKSkKKyNkZWZpbmUgTkVURFJWX1c4X0YJCU5FVERSVl9XOAorI2RlZmluZSBORVREUlZfVzE2X0YJCU5FVERSVl9XMTYKKyNkZWZpbmUgTkVURFJWX1czMl9GCQlORVREUlZfVzMyCisjdW5kZWYgcmVhZGIKKyN1bmRlZiByZWFkdworI3VuZGVmIHJlYWRsCisjdW5kZWYgd3JpdGViCisjdW5kZWYgd3JpdGV3CisjdW5kZWYgd3JpdGVsCisjZGVmaW5lIHJlYWRiKGFkZHIpIGluYigodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHJlYWR3KGFkZHIpIGludygodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHJlYWRsKGFkZHIpIGlubCgodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHdyaXRlYih2YWwsYWRkcikgb3V0YigodmFsKSwodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHdyaXRldyh2YWwsYWRkcikgb3V0dygodmFsKSwodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHdyaXRlbCh2YWwsYWRkcikgb3V0bCgodmFsKSwodW5zaWduZWQgbG9uZykoYWRkcikpCisKKyNlbHNlCisKKy8qIHdyaXRlIE1NSU8gcmVnaXN0ZXIsIHdpdGggZmx1c2ggKi8KKy8qIEZsdXNoIGF2b2lkcyBydGw4MTM5IGJ1ZyB3LyBwb3N0ZWQgTU1JTyB3cml0ZXMgKi8KKyNkZWZpbmUgTkVURFJWX1c4X0YocmVnLCB2YWw4KQlkbyB7IHdyaXRlYiAoKHZhbDgpLCBpb2FkZHIgKyAocmVnKSk7IHJlYWRiIChpb2FkZHIgKyAocmVnKSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIE5FVERSVl9XMTZfRihyZWcsIHZhbDE2KQlkbyB7IHdyaXRldyAoKHZhbDE2KSwgaW9hZGRyICsgKHJlZykpOyByZWFkdyAoaW9hZGRyICsgKHJlZykpOyB9IHdoaWxlICgwKQorI2RlZmluZSBORVREUlZfVzMyX0YocmVnLCB2YWwzMikJZG8geyB3cml0ZWwgKCh2YWwzMiksIGlvYWRkciArIChyZWcpKTsgcmVhZGwgKGlvYWRkciArIChyZWcpKTsgfSB3aGlsZSAoMCkKKworCisjaWYgTU1JT19GTFVTSF9BVURJVF9DT01QTEVURQorCisvKiB3cml0ZSBNTUlPIHJlZ2lzdGVyICovCisjZGVmaW5lIE5FVERSVl9XOChyZWcsIHZhbDgpCXdyaXRlYiAoKHZhbDgpLCBpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgTkVURFJWX1cxNihyZWcsIHZhbDE2KQl3cml0ZXcgKCh2YWwxNiksIGlvYWRkciArIChyZWcpKQorI2RlZmluZSBORVREUlZfVzMyKHJlZywgdmFsMzIpCXdyaXRlbCAoKHZhbDMyKSwgaW9hZGRyICsgKHJlZykpCisKKyNlbHNlCisKKy8qIHdyaXRlIE1NSU8gcmVnaXN0ZXIsIHRoZW4gZmx1c2ggKi8KKyNkZWZpbmUgTkVURFJWX1c4CQlORVREUlZfVzhfRgorI2RlZmluZSBORVREUlZfVzE2CQlORVREUlZfVzE2X0YKKyNkZWZpbmUgTkVURFJWX1czMgkJTkVURFJWX1czMl9GCisKKyNlbmRpZiAvKiBNTUlPX0ZMVVNIX0FVRElUX0NPTVBMRVRFICovCisKKy8qIHJlYWQgTU1JTyByZWdpc3RlciAqLworI2RlZmluZSBORVREUlZfUjgocmVnKQkJcmVhZGIgKGlvYWRkciArIChyZWcpKQorI2RlZmluZSBORVREUlZfUjE2KHJlZykJCXJlYWR3IChpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgTkVURFJWX1IzMihyZWcpCQkoKHVuc2lnbmVkIGxvbmcpIHJlYWRsIChpb2FkZHIgKyAocmVnKSkpCisKKyNlbmRpZiAvKiBVU0VfSU9fT1BTICovCisKKworc3RhdGljIGNvbnN0IHUxNiBuZXRkcnZfaW50cl9tYXNrID0KKwlQQ0lFcnIgfCBQQ1NUaW1lb3V0IHwgUnhVbmRlcnJ1biB8IFJ4T3ZlcmZsb3cgfCBSeEZJRk9PdmVyIHwKKwlUeEVyciB8IFR4T0sgfCBSeEVyciB8IFJ4T0s7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmV0ZHJ2X3J4X2NvbmZpZyA9CisJICBSeENmZ0Vhcmx5UnhOb25lIHwgUnhDZmdSY3YzMksgfCBSeE5vV3JhcCB8CisJICAoUlhfRklGT19USFJFU0ggPDwgUnhDZmdGSUZPU2hpZnQpIHwKKwkgIChSWF9ETUFfQlVSU1QgPDwgUnhDZmdETUFTaGlmdCk7CisKKworc3RhdGljIGludCBfX2RldmluaXQgbmV0ZHJ2X2luaXRfYm9hcmQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKipkZXZfb3V0LAorCQkJCQkgdm9pZCAqKmlvYWRkcl9vdXQpCit7CisJdm9pZCAqaW9hZGRyID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHA7CisJaW50IHJjLCBpOworCXUzMiBwaW9fc3RhcnQsIHBpb19lbmQsIHBpb19mbGFncywgcGlvX2xlbjsKKwl1bnNpZ25lZCBsb25nIG1taW9fc3RhcnQsIG1taW9fZW5kLCBtbWlvX2ZsYWdzLCBtbWlvX2xlbjsKKwl1MzIgdG1wOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCWFzc2VydCAocGRldiAhPSBOVUxMKTsKKwlhc3NlcnQgKGlvYWRkcl9vdXQgIT0gTlVMTCk7CisKKwkqaW9hZGRyX291dCA9IE5VTEw7CisJKmRldl9vdXQgPSBOVUxMOworCisJLyogZGV2IHplcm9lZCBpbiBhbGxvY19ldGhlcmRldiAqLworCWRldiA9IGFsbG9jX2V0aGVyZGV2IChzaXplb2YgKCp0cCkpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGFsbG9jIG5ldyBldGhlcm5ldFxuIik7CisJCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgLUVOT01FTVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKwl0cCA9IGRldi0+cHJpdjsKKworCS8qIGVuYWJsZSBkZXZpY2UgKGluY2wuIFBDSSBQTSB3YWtldXApLCBhbmQgYnVzLW1hc3RlcmluZyAqLworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UgKHBkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJcGlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKKwlwaW9fZW5kID0gcGNpX3Jlc291cmNlX2VuZCAocGRldiwgMCk7CisJcGlvX2ZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzIChwZGV2LCAwKTsKKwlwaW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbiAocGRldiwgMCk7CisKKwltbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAxKTsKKwltbWlvX2VuZCA9IHBjaV9yZXNvdXJjZV9lbmQgKHBkZXYsIDEpOworCW1taW9fZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MgKHBkZXYsIDEpOworCW1taW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbiAocGRldiwgMSk7CisKKwkvKiBzZXQgdGhpcyBpbW1lZGlhdGVseSwgd2UgbmVlZCB0byBrbm93IGJlZm9yZQorCSAqIHdlIHRhbGsgdG8gdGhlIGNoaXAgZGlyZWN0bHkgKi8KKwlEUFJJTlRLKCJQSU8gcmVnaW9uIHNpemUgPT0gMHglMDJYXG4iLCBwaW9fbGVuKTsKKwlEUFJJTlRLKCJNTUlPIHJlZ2lvbiBzaXplID09IDB4JTAybFhcbiIsIG1taW9fbGVuKTsKKworCS8qIG1ha2Ugc3VyZSBQQ0kgYmFzZSBhZGRyIDAgaXMgUElPICovCisJaWYgKCEocGlvX2ZsYWdzICYgSU9SRVNPVVJDRV9JTykpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggInJlZ2lvbiAjMCBub3QgYSBQSU8gcmVzb3VyY2UsIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogbWFrZSBzdXJlIFBDSSBiYXNlIGFkZHIgMSBpcyBNTUlPICovCisJaWYgKCEobW1pb19mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAicmVnaW9uICMxIG5vdCBhbiBNTUlPIHJlc291cmNlLCBhYm9ydGluZ1xuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIGNoZWNrIGZvciB3ZWlyZC9icm9rZW4gUENJIHJlZ2lvbiByZXBvcnRpbmcgKi8KKwlpZiAoKHBpb19sZW4gPCBORVREUlZfTUlOX0lPX1NJWkUpIHx8CisJICAgIChtbWlvX2xlbiA8IE5FVERSVl9NSU5fSU9fU0laRSkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIkludmFsaWQgUENJIHJlZ2lvbiBzaXplKHMpLCBhYm9ydGluZ1xuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyAocGRldiwgInBjaS1za2VsZXRvbiIpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJcGNpX3NldF9tYXN0ZXIgKHBkZXYpOworCisjaWZkZWYgVVNFX0lPX09QUworCWlvYWRkciA9ICh2b2lkICopIHBpb19zdGFydDsKKyNlbHNlCisJLyogaW9yZW1hcCBNTUlPIHJlZ2lvbiAqLworCWlvYWRkciA9IGlvcmVtYXAgKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKKwlpZiAoaW9hZGRyID09IE5VTEwpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCByZW1hcCBNTUlPLCBhYm9ydGluZ1xuIik7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCX0KKyNlbmRpZiAvKiBVU0VfSU9fT1BTICovCisKKwkvKiBTb2Z0IHJlc2V0IHRoZSBjaGlwLiAqLworCU5FVERSVl9XOCAoQ2hpcENtZCwgKE5FVERSVl9SOCAoQ2hpcENtZCkgJiBDaGlwQ21kQ2xlYXIpIHwgQ21kUmVzZXQpOworCisJLyogQ2hlY2sgdGhhdCB0aGUgY2hpcCBoYXMgZmluaXNoZWQgdGhlIHJlc2V0LiAqLworCWZvciAoaSA9IDEwMDA7IGkgPiAwOyBpLS0pCisJCWlmICgoTkVURFJWX1I4IChDaGlwQ21kKSAmIENtZFJlc2V0KSA9PSAwKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCXVkZWxheSAoMTApOworCisJLyogQnJpbmcgdGhlIGNoaXAgb3V0IG9mIGxvdy1wb3dlciBtb2RlLiAqLworCS8qIDxpbnNlcnQgZGV2aWNlLXNwZWNpZmljIGNvZGUgaGVyZT4gKi8KKworI2lmbmRlZiBVU0VfSU9fT1BTCisJLyogc2FuaXR5IGNoZWNrcyAtLSBlbnN1cmUgUElPIGFuZCBNTUlPIHJlZ2lzdGVycyBhZ3JlZSAqLworCWFzc2VydCAoaW5iIChwaW9fc3RhcnQrQ29uZmlnMCkgPT0gcmVhZGIgKGlvYWRkcitDb25maWcwKSk7CisJYXNzZXJ0IChpbmIgKHBpb19zdGFydCtDb25maWcxKSA9PSByZWFkYiAoaW9hZGRyK0NvbmZpZzEpKTsKKwlhc3NlcnQgKGluYiAocGlvX3N0YXJ0K1R4Q29uZmlnKSA9PSByZWFkYiAoaW9hZGRyK1R4Q29uZmlnKSk7CisJYXNzZXJ0IChpbmIgKHBpb19zdGFydCtSeENvbmZpZykgPT0gcmVhZGIgKGlvYWRkcitSeENvbmZpZykpOworI2VuZGlmIC8qICFVU0VfSU9fT1BTICovCisKKwkvKiBpZGVudGlmeSBjaGlwIGF0dGFjaGVkIHRvIGJvYXJkICovCisJdG1wID0gTkVURFJWX1I4IChDaGlwVmVyc2lvbik7CisJZm9yIChpID0gQVJSQVlfU0laRSAocnRsX2NoaXBfaW5mbykgLSAxOyBpID49IDA7IGktLSkKKwkJaWYgKHRtcCA9PSBydGxfY2hpcF9pbmZvW2ldLnZlcnNpb24pIHsKKwkJCXRwLT5jaGlwc2V0ID0gaTsKKwkJCWdvdG8gbWF0Y2g7CisJCX0KKworCS8qIGlmIHVua25vd24gY2hpcCwgYXNzdW1lIGFycmF5IGVsZW1lbnQgIzAsIG9yaWdpbmFsIFJUTC04MTM5IGluIHRoaXMgY2FzZSAqLworCXByaW50ayAoS0VSTl9ERUJVRyBQRlggIlBDSSBkZXZpY2UgJXM6IHVua25vd24gY2hpcCB2ZXJzaW9uLCBhc3N1bWluZyBSVEwtODEzOVxuIiwKKwkJcGNpX25hbWUocGRldikpOworCXByaW50ayAoS0VSTl9ERUJVRyBQRlggIlBDSSBkZXZpY2UgJXM6IFR4Q29uZmlnID0gMHglbHhcbiIsIHBjaV9uYW1lKHBkZXYpLCBORVREUlZfUjMyIChUeENvbmZpZykpOworCXRwLT5jaGlwc2V0ID0gMDsKKworbWF0Y2g6CisJRFBSSU5USyAoImNoaXBzZXQgaWQgKCVkKSA9PSBpbmRleCAlZCwgJyVzJ1xuIiwKKwkJdG1wLAorCQl0cC0+Y2hpcHNldCwKKwkJcnRsX2NoaXBfaW5mb1t0cC0+Y2hpcHNldF0ubmFtZSk7CisKKwlpID0gcmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCWlmIChpKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCSppb2FkZHJfb3V0ID0gaW9hZGRyOworCSpkZXZfb3V0ID0gZGV2OworCXJldHVybiAwOworCitlcnJfb3V0X3VubWFwOgorI2lmbmRlZiBVU0VfSU9fT1BTCisJaW91bm1hcChpb2FkZHIpOworZXJyX291dF9mcmVlX3JlczoKKyNlbmRpZgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMgKHBkZXYpOworZXJyX291dDoKKwlmcmVlX25ldGRldiAoZGV2KTsKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG5ldGRydl9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IG5ldGRydl9wcml2YXRlICp0cDsKKwlpbnQgaSwgYWRkcl9sZW4sIG9wdGlvbjsKKwl2b2lkICppb2FkZHIgPSBOVUxMOworCXN0YXRpYyBpbnQgYm9hcmRfaWR4ID0gLTE7CisKKy8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCWFzc2VydCAocGRldiAhPSBOVUxMKTsKKwlhc3NlcnQgKGVudCAhPSBOVUxMKTsKKworCWJvYXJkX2lkeCsrOworCisJaSA9IG5ldGRydl9pbml0X2JvYXJkIChwZGV2LCAmZGV2LCAmaW9hZGRyKTsKKwlpZiAoaSA8IDApIHsKKwkJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgaSk7CisJCXJldHVybiBpOworCX0KKworCXRwID0gZGV2LT5wcml2OworCisJYXNzZXJ0IChpb2FkZHIgIT0gTlVMTCk7CisJYXNzZXJ0IChkZXYgIT0gTlVMTCk7CisJYXNzZXJ0ICh0cCAhPSBOVUxMKTsKKworCWFkZHJfbGVuID0gcmVhZF9lZXByb20gKGlvYWRkciwgMCwgOCkgPT0gMHg4MTI5ID8gOCA6IDY7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJKCh1MTYgKikgKGRldi0+ZGV2X2FkZHIpKVtpXSA9CisJCSAgICBsZTE2X3RvX2NwdSAocmVhZF9lZXByb20gKGlvYWRkciwgaSArIDcsIGFkZHJfbGVuKSk7CisKKwkvKiBUaGUgUnRsODEzOS1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9IG5ldGRydl9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbmV0ZHJ2X3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gbmV0ZHJ2X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gbmV0ZHJ2X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IG5ldGRydl9zZXRfcnhfbW9kZTsKKwlkZXYtPmRvX2lvY3RsID0gbmV0ZHJ2X2lvY3RsOworCWRldi0+dHhfdGltZW91dCA9IG5ldGRydl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZykgaW9hZGRyOworCisJLyogZGV2LT5wcml2L3RwIHplcm9lZCBhbmQgYWxpZ25lZCBpbiBhbGxvY19ldGhlcmRldiAqLworCXRwID0gZGV2LT5wcml2OworCisJLyogbm90ZTogdHAtPmNoaXBzZXQgc2V0IGluIG5ldGRydl9pbml0X2JvYXJkICovCisJdHAtPmRydl9mbGFncyA9IFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZIHwKKwkJCVBDSV9DT01NQU5EX01BU1RFUiB8IE5FVERSVl9DQVBTOworCXRwLT5wY2lfZGV2ID0gcGRldjsKKwl0cC0+Ym9hcmQgPSBlbnQtPmRyaXZlcl9kYXRhOworCXRwLT5tbWlvX2FkZHIgPSBpb2FkZHI7CisJc3Bpbl9sb2NrX2luaXQoJnRwLT5sb2NrKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJdHAtPnBoeXNbMF0gPSAzMjsKKworCXByaW50ayAoS0VSTl9JTkZPICIlczogJXMgYXQgMHglbHgsICIKKwkJIiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4LCAiCisJCSJJUlEgJWRcbiIsCisJCWRldi0+bmFtZSwKKwkJYm9hcmRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXS5uYW1lLAorCQlkZXYtPmJhc2VfYWRkciwKKwkJZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwKKwkJZGV2LT5kZXZfYWRkclsyXSwgZGV2LT5kZXZfYWRkclszXSwKKwkJZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSwKKwkJZGV2LT5pcnEpOworCisJcHJpbnRrIChLRVJOX0RFQlVHICIlczogIElkZW50aWZpZWQgODEzOSBjaGlwIHR5cGUgJyVzJ1xuIiwKKwkJZGV2LT5uYW1lLCBydGxfY2hpcF9pbmZvW3RwLT5jaGlwc2V0XS5uYW1lKTsKKworCS8qIFB1dCB0aGUgY2hpcCBpbnRvIGxvdy1wb3dlciBtb2RlLiAqLworCU5FVERSVl9XOF9GIChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisKKwkvKiBUaGUgbG93ZXIgZm91ciBiaXRzIGFyZSB0aGUgbWVkaWEgdHlwZS4gKi8KKwlvcHRpb24gPSAoYm9hcmRfaWR4ID4gNykgPyAwIDogbWVkaWFbYm9hcmRfaWR4XTsKKwlpZiAob3B0aW9uID4gMCkgeworCQl0cC0+ZnVsbF9kdXBsZXggPSAob3B0aW9uICYgMHgyMDApID8gMSA6IDA7CisJCXRwLT5kZWZhdWx0X3BvcnQgPSBvcHRpb24gJiAxNTsKKwkJaWYgKHRwLT5kZWZhdWx0X3BvcnQpCisJCQl0cC0+bWVkaWFsb2NrID0gMTsKKwl9CisKKwlpZiAodHAtPmZ1bGxfZHVwbGV4KSB7CisJCXByaW50ayAoS0VSTl9JTkZPCisJCQkiJXM6IE1lZGlhIHR5cGUgZm9yY2VkIHRvIEZ1bGwgRHVwbGV4LlxuIiwKKwkJCWRldi0+bmFtZSk7CisJCW1kaW9fd3JpdGUgKGRldiwgdHAtPnBoeXNbMF0sIE1JSV9BRFZFUlRJU0UsIEFEVkVSVElTRV9GVUxMKTsKKwkJdHAtPmR1cGxleF9sb2NrID0gMTsKKwl9CisKKwlEUFJJTlRLICgiRVhJVCAtIHJldHVybmluZyAwXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgbmV0ZHJ2X3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCXN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqbnA7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJYXNzZXJ0IChkZXYgIT0gTlVMTCk7CisKKwlucCA9IGRldi0+cHJpdjsKKwlhc3NlcnQgKG5wICE9IE5VTEwpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYgKGRldik7CisKKyNpZm5kZWYgVVNFX0lPX09QUworCWlvdW5tYXAgKG5wLT5tbWlvX2FkZHIpOworI2VuZGlmIC8qICFVU0VfSU9fT1BTICovCisKKwlwY2lfcmVsZWFzZV9yZWdpb25zIChwZGV2KTsKKworCWZyZWVfbmV0ZGV2IChkZXYpOworCisJcGNpX3NldF9kcnZkYXRhIChwZGV2LCBOVUxMKTsKKworCXBjaV9kaXNhYmxlX2RldmljZSAocGRldik7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKKworLyogU2VyaWFsIEVFUFJPTSBzZWN0aW9uLiAqLworCisvKiAgRUVQUk9NX0N0cmwgYml0cy4gKi8KKyNkZWZpbmUgRUVfU0hJRlRfQ0xLCTB4MDQJLyogRUVQUk9NIHNoaWZ0IGNsb2NrLiAqLworI2RlZmluZSBFRV9DUwkJCTB4MDgJLyogRUVQUk9NIGNoaXAgc2VsZWN0LiAqLworI2RlZmluZSBFRV9EQVRBX1dSSVRFCTB4MDIJLyogRUVQUk9NIGNoaXAgZGF0YSBpbi4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfMAkJMHgwMAorI2RlZmluZSBFRV9XUklURV8xCQkweDAyCisjZGVmaW5lIEVFX0RBVEFfUkVBRAkweDAxCS8qIEVFUFJPTSBjaGlwIGRhdGEgb3V0LiAqLworI2RlZmluZSBFRV9FTkIJCQkoMHg4MCB8IEVFX0NTKQorCisvKiBEZWxheSBiZXR3ZWVuIEVFUFJPTSBjbG9jayB0cmFuc2l0aW9ucy4KKyAgIE5vIGV4dHJhIGRlbGF5IGlzIG5lZWRlZCB3aXRoIDMzTWh6IFBDSSwgYnV0IDY2TWh6IG1heSBjaGFuZ2UgdGhpcy4KKyAqLworCisjZGVmaW5lIGVlcHJvbV9kZWxheSgpCXJlYWRsKGVlX2FkZHIpCisKKy8qIFRoZSBFRVBST00gY29tbWFuZHMgaW5jbHVkZSB0aGUgYWx3YXktc2V0IGxlYWRpbmcgYml0LiAqLworI2RlZmluZSBFRV9XUklURV9DTUQJKDUpCisjZGVmaW5lIEVFX1JFQURfQ01ECQkoNikKKyNkZWZpbmUgRUVfRVJBU0VfQ01ECSg3KQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCByZWFkX2VlcHJvbSAodm9pZCAqaW9hZGRyLCBpbnQgbG9jYXRpb24sIGludCBhZGRyX2xlbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCByZXR2YWwgPSAwOworCXZvaWQgKmVlX2FkZHIgPSBpb2FkZHIgKyBDZmc5MzQ2OworCWludCByZWFkX2NtZCA9IGxvY2F0aW9uIHwgKEVFX1JFQURfQ01EIDw8IGFkZHJfbGVuKTsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwl3cml0ZWIgKEVFX0VOQiAmIH5FRV9DUywgZWVfYWRkcik7CisJd3JpdGViIChFRV9FTkIsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSAoKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gNCArIGFkZHJfbGVuOyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFX0RBVEFfV1JJVEUgOiAwOworCQl3cml0ZWIgKEVFX0VOQiB8IGRhdGF2YWwsIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkgKCk7CisJCXdyaXRlYiAoRUVfRU5CIHwgZGF0YXZhbCB8IEVFX1NISUZUX0NMSywgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSAoKTsKKwl9CisJd3JpdGViIChFRV9FTkIsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSAoKTsKKworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCXdyaXRlYiAoRUVfRU5CIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5ICgpOworCQlyZXR2YWwgPQorCQkgICAgKHJldHZhbCA8PCAxKSB8ICgocmVhZGIgKGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOgorCQkJCSAgICAgMCk7CisJCXdyaXRlYiAoRUVfRU5CLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5ICgpOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKwl3cml0ZWIgKH5FRV9DUywgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5ICgpOworCisJRFBSSU5USyAoIkVYSVQgLSByZXR1cm5pbmcgJWRcbiIsIHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogTUlJIHNlcmlhbCBtYW5hZ2VtZW50OiBtb3N0bHkgYm9ndXMgZm9yIG5vdy4gKi8KKy8qIFJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgbWFuYWdlbWVudCByZWdpc3RlcnMgdXNpbmcgc29mdHdhcmUtZ2VuZXJhdGVkCisgICBzZXJpYWwgTURJTyBwcm90b2NvbC4KKyAgIFRoZSBtYXhpbXVtIGRhdGEgY2xvY2sgcmF0ZSBpcyAyLjUgTWh6LiAgVGhlIG1pbmltdW0gdGltaW5nIGlzIHVzdWFsbHkKKyAgIG1ldCBieSBiYWNrLXRvLWJhY2sgUENJIEkvTyBjeWNsZXMsIGJ1dCB3ZSBpbnNlcnQgYSBkZWxheSB0byBhdm9pZAorICAgIm92ZXJjbG9ja2luZyIgaXNzdWVzLiAqLworI2RlZmluZSBNRElPX0RJUgkJMHg4MAorI2RlZmluZSBNRElPX0RBVEFfT1VUCTB4MDQKKyNkZWZpbmUgTURJT19EQVRBX0lOCTB4MDIKKyNkZWZpbmUgTURJT19DTEsJCTB4MDEKKyNkZWZpbmUgTURJT19XUklURTAgKE1ESU9fRElSKQorI2RlZmluZSBNRElPX1dSSVRFMSAoTURJT19ESVIgfCBNRElPX0RBVEFfT1VUKQorCisjZGVmaW5lIG1kaW9fZGVsYXkoKQlyZWFkYihtZGlvX2FkZHIpCisKKworc3RhdGljIGNoYXIgbWlpXzJfODEzOV9tYXBbOF0gPSB7CisJQmFzaWNNb2RlQ3RybCwKKwlCYXNpY01vZGVTdGF0dXMsCisJMCwKKwkwLAorCU5XYXlBZHZlcnQsCisJTldheUxQQVIsCisJTldheUV4cGFuc2lvbiwKKwkwCit9OworCisKKy8qIFN5bmNyb25pemUgdGhlIE1JSSBtYW5hZ2VtZW50IGludGVyZmFjZSBieSBzaGlmdGluZyAzMiBvbmUgYml0cyBvdXQuICovCitzdGF0aWMgdm9pZCBtZGlvX3N5bmMgKHZvaWQgKm1kaW9fYWRkcikKK3sKKwlpbnQgaTsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlmb3IgKGkgPSAzMjsgaSA+PSAwOyBpLS0pIHsKKwkJd3JpdGViIChNRElPX1dSSVRFMSwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSAoKTsKKwkJd3JpdGViIChNRElPX1dSSVRFMSB8IE1ESU9fQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5ICgpOworCX0KKworCURQUklOVEsgKCJFWElUXG4iKTsKK30KKworCitzdGF0aWMgaW50IG1kaW9fcmVhZCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCXN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHAgPSBkZXYtPnByaXY7CisJdm9pZCAqbWRpb19hZGRyID0gdHAtPm1taW9fYWRkciArIENvbmZpZzQ7CisJaW50IG1paV9jbWQgPSAoMHhmNiA8PCAxMCkgfCAocGh5X2lkIDw8IDUpIHwgbG9jYXRpb247CisJaW50IHJldHZhbCA9IDA7CisJaW50IGk7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJaWYgKHBoeV9pZCA+IDMxKSB7CS8qIFJlYWxseSBhIDgxMzkuICBVc2UgaW50ZXJuYWwgcmVnaXN0ZXJzLiAqLworCQlEUFJJTlRLICgiRVhJVCBhZnRlciBkaXJlY3RseSB1c2luZyA4MTM5IGludGVybmFsIHJlZ3NcbiIpOworCQlyZXR1cm4gbG9jYXRpb24gPCA4ICYmIG1paV8yXzgxMzlfbWFwW2xvY2F0aW9uXSA/CisJCSAgICByZWFkdyAodHAtPm1taW9fYWRkciArIG1paV8yXzgxMzlfbWFwW2xvY2F0aW9uXSkgOiAwOworCX0KKwltZGlvX3N5bmMgKG1kaW9fYWRkcik7CisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAobWlpX2NtZCAmICgxIDw8IGkpKSA/IE1ESU9fREFUQV9PVVQgOiAwOworCisJCXdyaXRlYiAoTURJT19ESVIgfCBkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5ICgpOworCQl3cml0ZWIgKE1ESU9fRElSIHwgZGF0YXZhbCB8IE1ESU9fQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5ICgpOworCX0KKworCS8qIFJlYWQgdGhlIHR3byB0cmFuc2l0aW9uLCAxNiBkYXRhLCBhbmQgd2lyZS1pZGxlIGJpdHMuICovCisJZm9yIChpID0gMTk7IGkgPiAwOyBpLS0pIHsKKwkJd3JpdGViICgwLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5ICgpOworCQlyZXR2YWwgPQorCQkgICAgKHJldHZhbCA8PCAxKSB8ICgocmVhZGIgKG1kaW9fYWRkcikgJiBNRElPX0RBVEFfSU4pID8gMQorCQkJCSAgICAgOiAwKTsKKwkJd3JpdGViIChNRElPX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSAoKTsKKwl9CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nICVkXG4iLCAocmV0dmFsID4+IDEpICYgMHhmZmZmKTsKKwlyZXR1cm4gKHJldHZhbCA+PiAxKSAmIDB4ZmZmZjsKK30KKworCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sCisJCQlpbnQgdmFsdWUpCit7CisJc3RydWN0IG5ldGRydl9wcml2YXRlICp0cCA9IGRldi0+cHJpdjsKKwl2b2lkICptZGlvX2FkZHIgPSB0cC0+bW1pb19hZGRyICsgQ29uZmlnNDsKKwlpbnQgbWlpX2NtZCA9CisJICAgICgweDUwMDIgPDwgMTYpIHwgKHBoeV9pZCA8PCAyMykgfCAobG9jYXRpb24gPDwgMTgpIHwgdmFsdWU7CisJaW50IGk7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJaWYgKHBoeV9pZCA+IDMxKSB7CS8qIFJlYWxseSBhIDgxMzkuICBVc2UgaW50ZXJuYWwgcmVnaXN0ZXJzLiAqLworCQlpZiAobG9jYXRpb24gPCA4ICYmIG1paV8yXzgxMzlfbWFwW2xvY2F0aW9uXSkgeworCQkJd3JpdGV3ICh2YWx1ZSwKKwkJCQl0cC0+bW1pb19hZGRyICsgbWlpXzJfODEzOV9tYXBbbG9jYXRpb25dKTsKKwkJCXJlYWR3ICh0cC0+bW1pb19hZGRyICsgbWlpXzJfODEzOV9tYXBbbG9jYXRpb25dKTsKKwkJfQorCQlEUFJJTlRLICgiRVhJVCBhZnRlciBkaXJlY3RseSB1c2luZyA4MTM5IGludGVybmFsIHJlZ3NcbiIpOworCQlyZXR1cm47CisJfQorCW1kaW9fc3luYyAobWRpb19hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9CisJCSAgICAobWlpX2NtZCAmICgxIDw8IGkpKSA/IE1ESU9fV1JJVEUxIDogTURJT19XUklURTA7CisJCXdyaXRlYiAoZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSAoKTsKKwkJd3JpdGViIChkYXRhdmFsIHwgTURJT19DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkgKCk7CisJfQorCisJLyogQ2xlYXIgb3V0IGV4dHJhIGJpdHMuICovCisJZm9yIChpID0gMjsgaSA+IDA7IGktLSkgeworCQl3cml0ZWIgKDAsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkgKCk7CisJCXdyaXRlYiAoTURJT19DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkgKCk7CisJfQorCisJRFBSSU5USyAoIkVYSVRcbiIpOworfQorCisKK3N0YXRpYyBpbnQgbmV0ZHJ2X29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRydl9wcml2YXRlICp0cCA9IGRldi0+cHJpdjsKKwlpbnQgcmV0dmFsOworI2lmZGVmIE5FVERSVl9ERUJVRworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisjZW5kaWYKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlyZXR2YWwgPSByZXF1ZXN0X2lycSAoZGV2LT5pcnEsIG5ldGRydl9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldHZhbCkgeworCQlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nICVkXG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXRwLT50eF9idWZzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodHAtPnBjaV9kZXYsIFRYX0JVRl9UT1RfTEVOLAorCQkJCQkgICAmdHAtPnR4X2J1ZnNfZG1hKTsKKwl0cC0+cnhfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHRwLT5wY2lfZGV2LCBSWF9CVUZfVE9UX0xFTiwKKwkJCQkJICAgJnRwLT5yeF9yaW5nX2RtYSk7CisJaWYgKHRwLT50eF9idWZzID09IE5VTEwgfHwgdHAtPnJ4X3JpbmcgPT0gTlVMTCkgeworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCQlpZiAodHAtPnR4X2J1ZnMpCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHRwLT5wY2lfZGV2LCBUWF9CVUZfVE9UX0xFTiwKKwkJCQkJICAgIHRwLT50eF9idWZzLCB0cC0+dHhfYnVmc19kbWEpOworCQlpZiAodHAtPnJ4X3JpbmcpCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHRwLT5wY2lfZGV2LCBSWF9CVUZfVE9UX0xFTiwKKwkJCQkJICAgIHRwLT5yeF9yaW5nLCB0cC0+cnhfcmluZ19kbWEpOworCisJCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgLUVOT01FTVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCisJfQorCisJdHAtPmZ1bGxfZHVwbGV4ID0gdHAtPmR1cGxleF9sb2NrOworCXRwLT50eF9mbGFnID0gKFRYX0ZJRk9fVEhSRVNIIDw8IDExKSAmIDB4MDAzZjAwMDA7CisKKwluZXRkcnZfaW5pdF9yaW5nIChkZXYpOworCW5ldGRydl9od19zdGFydCAoZGV2KTsKKworCURQUklOVEsgKCIlczogbmV0ZHJ2X29wZW4oKSBpb2FkZHIgJSNseCBJUlEgJWQiCisJCQkiIEdQIFBpbnMgJTIuMnggJXMtZHVwbGV4LlxuIiwKKwkJCWRldi0+bmFtZSwgcGNpX3Jlc291cmNlX3N0YXJ0ICh0cC0+cGNpX2RldiwgMSksCisJCQlkZXYtPmlycSwgTkVURFJWX1I4IChNZWRpYVN0YXR1cyksCisJCQl0cC0+ZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIpOworCisJLyogU2V0IHRoZSB0aW1lciB0byBzd2l0Y2ggdG8gY2hlY2sgZm9yIGxpbmsgYmVhdCBhbmQgcGVyaGFwcyBzd2l0Y2gKKwkgICB0byBhbiBhbHRlcm5hdGUgbWVkaWEgdHlwZS4gKi8KKwlpbml0X3RpbWVyICgmdHAtPnRpbWVyKTsKKwl0cC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAzICogSFo7CisJdHAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCXRwLT50aW1lci5mdW5jdGlvbiA9ICZuZXRkcnZfdGltZXI7CisJYWRkX3RpbWVyICgmdHAtPnRpbWVyKTsKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworLyogU3RhcnQgdGhlIGhhcmR3YXJlIGF0IG9wZW4gb3IgcmVzdW1lLiAqLworc3RhdGljIHZvaWQgbmV0ZHJ2X2h3X3N0YXJ0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHAgPSBkZXYtPnByaXY7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1MzIgaTsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwkvKiBTb2Z0IHJlc2V0IHRoZSBjaGlwLiAqLworCU5FVERSVl9XOCAoQ2hpcENtZCwgKE5FVERSVl9SOCAoQ2hpcENtZCkgJiBDaGlwQ21kQ2xlYXIpIHwgQ21kUmVzZXQpOworCXVkZWxheSAoMTAwKTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGNoaXAgaGFzIGZpbmlzaGVkIHRoZSByZXNldC4gKi8KKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKQorCQlpZiAoKE5FVERSVl9SOCAoQ2hpcENtZCkgJiBDbWRSZXNldCkgPT0gMCkKKwkJCWJyZWFrOworCisJLyogUmVzdG9yZSBvdXIgaWRlYSBvZiB0aGUgTUFDIGFkZHJlc3MuICovCisJTkVURFJWX1czMl9GIChNQUMwICsgMCwgY3B1X3RvX2xlMzIgKCoodTMyICopIChkZXYtPmRldl9hZGRyICsgMCkpKTsKKwlORVREUlZfVzMyX0YgKE1BQzAgKyA0LCBjcHVfdG9fbGUzMiAoKih1MzIgKikgKGRldi0+ZGV2X2FkZHIgKyA0KSkpOworCisJLyogTXVzdCBlbmFibGUgVHgvUnggYmVmb3JlIHNldHRpbmcgdHJhbnNmZXIgdGhyZXNob2xkcyEgKi8KKwlORVREUlZfVzhfRiAoQ2hpcENtZCwgKE5FVERSVl9SOCAoQ2hpcENtZCkgJiBDaGlwQ21kQ2xlYXIpIHwKKwkJCSAgIENtZFJ4RW5iIHwgQ21kVHhFbmIpOworCisJaSA9IG5ldGRydl9yeF9jb25maWcgfAorCSAgICAoTkVURFJWX1IzMiAoUnhDb25maWcpICYgcnRsX2NoaXBfaW5mb1t0cC0+Y2hpcHNldF0uUnhDb25maWdNYXNrKTsKKwlORVREUlZfVzMyX0YgKFJ4Q29uZmlnLCBpKTsKKworCS8qIENoZWNrIHRoaXMgdmFsdWU6IHRoZSBkb2N1bWVudGF0aW9uIGZvciBJRkcgY29udHJhZGljdHMgaWZzZWxmLiAqLworCU5FVERSVl9XMzIgKFR4Q29uZmlnLCAoVFhfRE1BX0JVUlNUIDw8IFR4RE1BU2hpZnQpKTsKKworCS8qIHVubG9jayBDb25maWdbMDEyMzRdIGFuZCBCTUNSIHJlZ2lzdGVyIHdyaXRlcyAqLworCU5FVERSVl9XOF9GIChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJdWRlbGF5ICgxMCk7CisKKwl0cC0+Y3VyX3J4ID0gMDsKKworCS8qIExvY2sgQ29uZmlnWzAxMjM0XSBhbmQgQk1DUiByZWdpc3RlciB3cml0ZXMgKi8KKwlORVREUlZfVzhfRiAoQ2ZnOTM0NiwgQ2ZnOTM0Nl9Mb2NrKTsKKwl1ZGVsYXkgKDEwKTsKKworCS8qIGluaXQgUnggcmluZyBidWZmZXIgRE1BIGFkZHJlc3MgKi8KKwlORVREUlZfVzMyX0YgKFJ4QnVmLCB0cC0+cnhfcmluZ19kbWEpOworCisJLyogaW5pdCBUeCBidWZmZXIgRE1BIGFkZHJlc3NlcyAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrKQorCQlORVREUlZfVzMyX0YgKFR4QWRkcjAgKyAoaSAqIDQpLCB0cC0+dHhfYnVmc19kbWEgKyAodHAtPnR4X2J1ZltpXSAtIHRwLT50eF9idWZzKSk7CisKKwlORVREUlZfVzMyX0YgKFJ4TWlzc2VkLCAwKTsKKworCW5ldGRydl9zZXRfcnhfbW9kZSAoZGV2KTsKKworCS8qIG5vIGVhcmx5LXJ4IGludGVycnVwdHMgKi8KKwlORVREUlZfVzE2IChNdWx0aUludHIsIE5FVERSVl9SMTYgKE11bHRpSW50cikgJiBNdWx0aUludHJDbGVhcik7CisKKwkvKiBtYWtlIHN1cmUgUnhUeCBoYXMgc3RhcnRlZCAqLworCU5FVERSVl9XOF9GIChDaGlwQ21kLCAoTkVURFJWX1I4IChDaGlwQ21kKSAmIENoaXBDbWRDbGVhcikgfAorCQkJICAgQ21kUnhFbmIgfCBDbWRUeEVuYik7CisKKwkvKiBFbmFibGUgYWxsIGtub3duIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJTkVURFJWX1cxNl9GIChJbnRyTWFzaywgbmV0ZHJ2X2ludHJfbWFzayk7CisKKwluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKworCURQUklOVEsgKCJFWElUXG4iKTsKK30KKworCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQgbmV0ZHJ2X2luaXRfcmluZyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwID0gZGV2LT5wcml2OworCWludCBpOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCXRwLT5jdXJfcnggPSAwOworCWF0b21pY19zZXQgKCZ0cC0+Y3VyX3R4LCAwKTsKKwlhdG9taWNfc2V0ICgmdHAtPmRpcnR5X3R4LCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrKSB7CisJCXRwLT50eF9pbmZvW2ldLnNrYiA9IE5VTEw7CisJCXRwLT50eF9pbmZvW2ldLm1hcHBpbmcgPSAwOworCQl0cC0+dHhfYnVmW2ldID0gJnRwLT50eF9idWZzW2kgKiBUWF9CVUZfU0laRV07CisJfQorCisJRFBSSU5USyAoIkVYSVRcbiIpOworfQorCisKK3N0YXRpYyB2b2lkIG5ldGRydl90aW1lciAodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwID0gZGV2LT5wcml2OworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJaW50IG5leHRfdGljayA9IDYwICogSFo7CisJaW50IG1paV9scGE7CisKKwltaWlfbHBhID0gbWRpb19yZWFkIChkZXYsIHRwLT5waHlzWzBdLCBNSUlfTFBBKTsKKworCWlmICghdHAtPmR1cGxleF9sb2NrICYmIG1paV9scGEgIT0gMHhmZmZmKSB7CisJCWludCBkdXBsZXggPSAobWlpX2xwYSAmIExQQV8xMDBGVUxMKQorCQkgICAgfHwgKG1paV9scGEgJiAweDAxQzApID09IDB4MDA0MDsKKwkJaWYgKHRwLT5mdWxsX2R1cGxleCAhPSBkdXBsZXgpIHsKKwkJCXRwLT5mdWxsX2R1cGxleCA9IGR1cGxleDsKKwkJCXByaW50ayAoS0VSTl9JTkZPCisJCQkJIiVzOiBTZXR0aW5nICVzLWR1cGxleCBiYXNlZCBvbiBNSUkgIyVkIGxpbmsiCisJCQkJIiBwYXJ0bmVyIGFiaWxpdHkgb2YgJTQuNHguXG4iLCBkZXYtPm5hbWUsCisJCQkJdHAtPmZ1bGxfZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiLAorCQkJCXRwLT5waHlzWzBdLCBtaWlfbHBhKTsKKwkJCU5FVERSVl9XOCAoQ2ZnOTM0NiwgQ2ZnOTM0Nl9VbmxvY2spOworCQkJTkVURFJWX1c4IChDb25maWcxLCB0cC0+ZnVsbF9kdXBsZXggPyAweDYwIDogMHgyMCk7CisJCQlORVREUlZfVzggKENmZzkzNDYsIENmZzkzNDZfTG9jayk7CisJCX0KKwl9CisKKwlEUFJJTlRLICgiJXM6IE1lZGlhIHNlbGVjdGlvbiB0aWNrLCBMaW5rIHBhcnRuZXIgJTQuNHguXG4iLAorCQkgZGV2LT5uYW1lLCBORVREUlZfUjE2IChOV2F5TFBBUikpOworCURQUklOVEsgKCIlczogIE90aGVyIHJlZ2lzdGVycyBhcmUgSW50TWFzayAlNC40eCBJbnRTdGF0dXMgJTQuNHgiCisJCSAiIFJ4U3RhdHVzICU0LjR4LlxuIiwgZGV2LT5uYW1lLAorCQkgTkVURFJWX1IxNiAoSW50ck1hc2spLAorCQkgTkVURFJWX1IxNiAoSW50clN0YXR1cyksCisJCSBORVREUlZfUjMyIChSeEVhcmx5U3RhdHVzKSk7CisJRFBSSU5USyAoIiVzOiAgQ2hpcCBjb25maWcgJTIuMnggJTIuMnguXG4iLAorCQkgZGV2LT5uYW1lLCBORVREUlZfUjggKENvbmZpZzApLAorCQkgTkVURFJWX1I4IChDb25maWcxKSk7CisKKwl0cC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBuZXh0X3RpY2s7CisJYWRkX3RpbWVyICgmdHAtPnRpbWVyKTsKK30KKworCitzdGF0aWMgdm9pZCBuZXRkcnZfdHhfY2xlYXIgKHN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHApCit7CisJaW50IGk7CisKKwlhdG9taWNfc2V0ICgmdHAtPmN1cl90eCwgMCk7CisJYXRvbWljX3NldCAoJnRwLT5kaXJ0eV90eCwgMCk7CisKKwkvKiBEdW1wIHRoZSB1bnNlbnQgVHggcGFja2V0cy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKykgeworCQlzdHJ1Y3QgcmluZ19pbmZvICpycCA9ICZ0cC0+dHhfaW5mb1tpXTsKKwkJaWYgKHJwLT5tYXBwaW5nICE9IDApIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUgKHRwLT5wY2lfZGV2LCBycC0+bWFwcGluZywKKwkJCQkJICBycC0+c2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJcnAtPm1hcHBpbmcgPSAwOworCQl9CisJCWlmIChycC0+c2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiIChycC0+c2tiKTsKKwkJCXJwLT5za2IgPSBOVUxMOworCQkJdHAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCBuZXRkcnZfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwID0gZGV2LT5wcml2OworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJaW50IGk7CisJdTggdG1wODsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRFBSSU5USyAoIiVzOiBUcmFuc21pdCB0aW1lb3V0LCBzdGF0dXMgJTIuMnggJTQuNHggIgorCQkgIm1lZGlhICUyLjJ4LlxuIiwgZGV2LT5uYW1lLAorCQkgTkVURFJWX1I4IChDaGlwQ21kKSwKKwkJIE5FVERSVl9SMTYgKEludHJTdGF0dXMpLAorCQkgTkVURFJWX1I4IChNZWRpYVN0YXR1cykpOworCisJLyogZGlzYWJsZSBUeCBBU0FQLCBpZiBub3QgYWxyZWFkeSAqLworCXRtcDggPSBORVREUlZfUjggKENoaXBDbWQpOworCWlmICh0bXA4ICYgQ21kVHhFbmIpCisJCU5FVERSVl9XOCAoQ2hpcENtZCwgdG1wOCAmIH5DbWRUeEVuYik7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCU5FVERSVl9XMTYgKEludHJNYXNrLCAweDAwMDApOworCisJLyogRW1pdCBpbmZvIHRvIGZpZ3VyZSBvdXQgd2hhdCB3ZW50IHdyb25nLiAqLworCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IFR4IHF1ZXVlIHN0YXJ0IGVudHJ5ICVkICBkaXJ0eSBlbnRyeSAlZC5cbiIsCisJCWRldi0+bmFtZSwgYXRvbWljX3JlYWQgKCZ0cC0+Y3VyX3R4KSwKKwkJYXRvbWljX3JlYWQgKCZ0cC0+ZGlydHlfdHgpKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKykKKwkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogIFR4IGRlc2NyaXB0b3IgJWQgaXMgJTguOGx4LiVzXG4iLAorCQkJZGV2LT5uYW1lLCBpLCBORVREUlZfUjMyIChUeFN0YXR1czAgKyAoaSAqIDQpKSwKKwkJCWkgPT0gYXRvbWljX3JlYWQgKCZ0cC0+ZGlydHlfdHgpICUgTlVNX1RYX0RFU0MgPworCQkJCSIgKHF1ZXVlIGhlYWQpIiA6ICIiKTsKKworCS8qIFN0b3AgYSBzaGFyZWQgaW50ZXJydXB0IGZyb20gc2NhdmVuZ2luZyB3aGlsZSB3ZSBhcmUuICovCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCQorCW5ldGRydl90eF9jbGVhciAodHApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnRwLT5sb2NrLCBmbGFncyk7CisKKwkvKiAuLi5hbmQgZmluYWxseSwgcmVzZXQgZXZlcnl0aGluZyAqLworCW5ldGRydl9od19zdGFydCAoZGV2KTsKKworCW5ldGlmX3dha2VfcXVldWUgKGRldik7Cit9CisKKworCitzdGF0aWMgaW50IG5ldGRydl9zdGFydF94bWl0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHAgPSBkZXYtPnByaXY7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgZW50cnk7CisKKwkvKiBDYWxjdWxhdGUgdGhlIG5leHQgVHggZGVzY3JpcHRvciBlbnRyeS4gKi8KKwllbnRyeSA9IGF0b21pY19yZWFkICgmdHAtPmN1cl90eCkgJSBOVU1fVFhfREVTQzsKKworCWFzc2VydCAodHAtPnR4X2luZm9bZW50cnldLnNrYiA9PSBOVUxMKTsKKwlhc3NlcnQgKHRwLT50eF9pbmZvW2VudHJ5XS5tYXBwaW5nID09IDApOworCisJdHAtPnR4X2luZm9bZW50cnldLnNrYiA9IHNrYjsKKwkvKiB0cC0+dHhfaW5mb1tlbnRyeV0ubWFwcGluZyA9IDA7ICovCisJbWVtY3B5ICh0cC0+dHhfYnVmW2VudHJ5XSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwkvKiBOb3RlOiB0aGUgY2hpcCBkb2Vzbid0IGhhdmUgYXV0by1wYWQhICovCisJTkVURFJWX1czMiAoVHhTdGF0dXMwICsgKGVudHJ5ICogc2l6ZW9mKHUzMikpLAorCQkgdHAtPnR4X2ZsYWcgfCAoc2tiLT5sZW4gPj0gRVRIX1pMRU4gPyBza2ItPmxlbiA6IEVUSF9aTEVOKSk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlhdG9taWNfaW5jICgmdHAtPmN1cl90eCk7CisJaWYgKChhdG9taWNfcmVhZCAoJnRwLT5jdXJfdHgpIC0gYXRvbWljX3JlYWQgKCZ0cC0+ZGlydHlfdHgpKSA+PSBOVU1fVFhfREVTQykKKwkJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCURQUklOVEsgKCIlczogUXVldWVkIFR4IHBhY2tldCBhdCAlcCBzaXplICV1IHRvIHNsb3QgJWQuXG4iLAorCQkgZGV2LT5uYW1lLCBza2ItPmRhdGEsIHNrYi0+bGVuLCBlbnRyeSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBuZXRkcnZfdHhfaW50ZXJydXB0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IG5ldGRydl9wcml2YXRlICp0cCwKKwkJCQkgIHZvaWQgKmlvYWRkcikKK3sKKwlpbnQgY3VyX3R4LCBkaXJ0eV90eCwgdHhfbGVmdDsKKworCWFzc2VydCAoZGV2ICE9IE5VTEwpOworCWFzc2VydCAodHAgIT0gTlVMTCk7CisJYXNzZXJ0IChpb2FkZHIgIT0gTlVMTCk7CisKKwlkaXJ0eV90eCA9IGF0b21pY19yZWFkICgmdHAtPmRpcnR5X3R4KTsKKworCWN1cl90eCA9IGF0b21pY19yZWFkICgmdHAtPmN1cl90eCk7CisJdHhfbGVmdCA9IGN1cl90eCAtIGRpcnR5X3R4OworCXdoaWxlICh0eF9sZWZ0ID4gMCkgeworCQlpbnQgZW50cnkgPSBkaXJ0eV90eCAlIE5VTV9UWF9ERVNDOworCQlpbnQgdHhzdGF0dXM7CisKKwkJdHhzdGF0dXMgPSBORVREUlZfUjMyIChUeFN0YXR1czAgKyAoZW50cnkgKiBzaXplb2YgKHUzMikpKTsKKworCQlpZiAoISh0eHN0YXR1cyAmIChUeFN0YXRPSyB8IFR4VW5kZXJydW4gfCBUeEFib3J0ZWQpKSkKKwkJCWJyZWFrOwkvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBUeGVkICovCisKKwkJLyogTm90ZTogVHhDYXJyaWVyTG9zdCBpcyBhbHdheXMgYXNzZXJ0ZWQgYXQgMTAwbWJwcy4gKi8KKwkJaWYgKHR4c3RhdHVzICYgKFR4T3V0T2ZXaW5kb3cgfCBUeEFib3J0ZWQpKSB7CisJCQkvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KKwkJCURQUklOVEsgKCIlczogVHJhbnNtaXQgZXJyb3IsIFR4IHN0YXR1cyAlOC44eC5cbiIsCisJCQkJIGRldi0+bmFtZSwgdHhzdGF0dXMpOworCQkJdHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHR4c3RhdHVzICYgVHhBYm9ydGVkKSB7CisJCQkJdHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJTkVURFJWX1czMiAoVHhDb25maWcsIFR4Q2xlYXJBYnQgfCAoVFhfRE1BX0JVUlNUIDw8IFR4RE1BU2hpZnQpKTsKKwkJCX0KKwkJCWlmICh0eHN0YXR1cyAmIFR4Q2Fycmllckxvc3QpCisJCQkJdHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlpZiAodHhzdGF0dXMgJiBUeE91dE9mV2luZG93KQorCQkJCXRwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCX0gZWxzZSB7CisJCQlpZiAodHhzdGF0dXMgJiBUeFVuZGVycnVuKSB7CisJCQkJLyogQWRkIDY0IHRvIHRoZSBUeCBGSUZPIHRocmVzaG9sZC4gKi8KKwkJCQlpZiAodHAtPnR4X2ZsYWcgPCAweDAwMzAwMDAwKQorCQkJCQl0cC0+dHhfZmxhZyArPSAweDAwMDIwMDAwOworCQkJCXRwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJfQorCQkJdHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHR4c3RhdHVzID4+IDI0KSAmIDE1OworCQkJdHAtPnN0YXRzLnR4X2J5dGVzICs9IHR4c3RhdHVzICYgMHg3ZmY7CisJCQl0cC0+c3RhdHMudHhfcGFja2V0cysrOworCQl9CisKKwkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQlpZiAodHAtPnR4X2luZm9bZW50cnldLm1hcHBpbmcgIT0gMCkgeworCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGNpX2RldiwKKwkJCQkJIHRwLT50eF9pbmZvW2VudHJ5XS5tYXBwaW5nLAorCQkJCQkgdHAtPnR4X2luZm9bZW50cnldLnNrYi0+bGVuLAorCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQl0cC0+dHhfaW5mb1tlbnRyeV0ubWFwcGluZyA9IDA7CisJCX0KKwkJZGV2X2tmcmVlX3NrYl9pcnEgKHRwLT50eF9pbmZvW2VudHJ5XS5za2IpOworCQl0cC0+dHhfaW5mb1tlbnRyeV0uc2tiID0gTlVMTDsKKwkJZGlydHlfdHgrKzsKKwkJaWYgKGRpcnR5X3R4IDwgMCkgeyAvKiBoYW5kbGUgc2lnbmVkIGludCBvdmVyZmxvdyAqLworCQkJYXRvbWljX3N1YiAoY3VyX3R4LCAmdHAtPmN1cl90eCk7IC8qIFhYWCByYWN5PyAqLworCQkJZGlydHlfdHggPSBjdXJfdHggLSB0eF9sZWZ0ICsgMTsKKwkJfQorCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZCAoZGV2KSkKKwkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisKKwkJY3VyX3R4ID0gYXRvbWljX3JlYWQgKCZ0cC0+Y3VyX3R4KTsKKwkJdHhfbGVmdCA9IGN1cl90eCAtIGRpcnR5X3R4OworCisJfQorCisjaWZuZGVmIE5FVERSVl9OREVCVUcKKwlpZiAoYXRvbWljX3JlYWQgKCZ0cC0+Y3VyX3R4KSAtIGRpcnR5X3R4ID4gTlVNX1RYX0RFU0MpIHsKKwkJcHJpbnRrIChLRVJOX0VSUgorCQkgICIlczogT3V0LW9mLXN5bmMgZGlydHkgcG9pbnRlciwgJWQgdnMuICVkLlxuIiwKKwkJICAgICBkZXYtPm5hbWUsIGRpcnR5X3R4LCBhdG9taWNfcmVhZCAoJnRwLT5jdXJfdHgpKTsKKwkJZGlydHlfdHggKz0gTlVNX1RYX0RFU0M7CisJfQorI2VuZGlmIC8qIE5FVERSVl9OREVCVUcgKi8KKworCWF0b21pY19zZXQgKCZ0cC0+ZGlydHlfdHgsIGRpcnR5X3R4KTsKK30KKworCisvKiBUT0RPOiBjbGVhbiB0aGlzIHVwISAgUnggcmVzZXQgbmVlZCBub3QgYmUgdGhpcyBpbnRlbnNpdmUgKi8KK3N0YXRpYyB2b2lkIG5ldGRydl9yeF9lcnIgKHUzMiByeF9zdGF0dXMsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IG5ldGRydl9wcml2YXRlICp0cCwgdm9pZCAqaW9hZGRyKQoreworCXU4IHRtcDg7CisJaW50IHRtcF93b3JrID0gMTAwMDsKKworCURQUklOVEsgKCIlczogRXRoZXJuZXQgZnJhbWUgaGFkIGVycm9ycywgc3RhdHVzICU4Ljh4LlxuIiwKKwkgICAgICAgICBkZXYtPm5hbWUsIHJ4X3N0YXR1cyk7CisJaWYgKHJ4X3N0YXR1cyAmIFJ4VG9vTG9uZykgeworCQlEUFJJTlRLICgiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCBmcmFtZSwgc3RhdHVzICU0LjR4IVxuIiwKKwkJCSBkZXYtPm5hbWUsIHJ4X3N0YXR1cyk7CisJCS8qIEEuQy46IFRoZSBjaGlwIGhhbmdzIGhlcmUuICovCisJfQorCXRwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwlpZiAocnhfc3RhdHVzICYgKFJ4QmFkU3ltYm9sIHwgUnhCYWRBbGlnbikpCisJCXRwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwlpZiAocnhfc3RhdHVzICYgKFJ4UnVudCB8IFJ4VG9vTG9uZykpCisJCXRwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJaWYgKHJ4X3N0YXR1cyAmIFJ4Q1JDRXJyKQorCQl0cC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCS8qIFJlc2V0IHRoZSByZWNlaXZlciwgYmFzZWQgb24gUmVhbFRlayByZWNvbW1lbmRhdGlvbi4gKEJ1Zz8pICovCisJdHAtPmN1cl9yeCA9IDA7CisKKwkvKiBkaXNhYmxlIHJlY2VpdmUgKi8KKwl0bXA4ID0gTkVURFJWX1I4IChDaGlwQ21kKSAmIENoaXBDbWRDbGVhcjsKKwlORVREUlZfVzhfRiAoQ2hpcENtZCwgdG1wOCB8IENtZFR4RW5iKTsKKworCS8qIEEuQy46IFJlc2V0IHRoZSBtdWx0aWNhc3QgbGlzdC4gKi8KKwluZXRkcnZfc2V0X3J4X21vZGUgKGRldik7CisKKwkvKiBYWFggcG90ZW50aWFsbHkgdGVtcG9yYXJ5IGhhY2sgdG8KKwkgKiByZXN0YXJ0IGh1bmcgcmVjZWl2ZXIgKi8KKwl3aGlsZSAoLS10bXBfd29yayA+IDApIHsKKwkJdG1wOCA9IE5FVERSVl9SOCAoQ2hpcENtZCk7CisJCWlmICgodG1wOCAmIENtZFJ4RW5iKSAmJiAodG1wOCAmIENtZFR4RW5iKSkKKwkJCWJyZWFrOworCQlORVREUlZfVzhfRiAoQ2hpcENtZCwKKwkJCSAgKHRtcDggJiBDaGlwQ21kQ2xlYXIpIHwgQ21kUnhFbmIgfCBDbWRUeEVuYik7CisJfQorCisJLyogRy5TLjogUmUtZW5hYmxlIHJlY2VpdmVyICovCisJLyogWFhYIHRlbXBvcmFyeSBoYWNrIHRvIHdvcmsgYXJvdW5kIHJlY2VpdmVyIGhhbmcgKi8KKwluZXRkcnZfc2V0X3J4X21vZGUgKGRldik7CisKKwlpZiAodG1wX3dvcmsgPD0gMCkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgUEZYICJ0eC9yeCBlbmFibGUgd2FpdCB0b28gbG9uZ1xuIik7Cit9CisKKworLyogVGhlIGRhdGEgc2hlZXQgZG9lc24ndCBkZXNjcmliZSB0aGUgUnggcmluZyBhdCBhbGwsIHNvIEknbSBndWVzc2luZyBhdCB0aGUKKyAgIGZpZWxkIGFsaWdubWVudHMgYW5kIHNlbWFudGljcy4gKi8KK3N0YXRpYyB2b2lkIG5ldGRydl9yeF9pbnRlcnJ1cHQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwLCB2b2lkICppb2FkZHIpCit7CisJdW5zaWduZWQgY2hhciAqcnhfcmluZzsKKwl1MTYgY3VyX3J4OworCisJYXNzZXJ0IChkZXYgIT0gTlVMTCk7CisJYXNzZXJ0ICh0cCAhPSBOVUxMKTsKKwlhc3NlcnQgKGlvYWRkciAhPSBOVUxMKTsKKworCXJ4X3JpbmcgPSB0cC0+cnhfcmluZzsKKwljdXJfcnggPSB0cC0+Y3VyX3J4OworCisJRFBSSU5USyAoIiVzOiBJbiBuZXRkcnZfcngoKSwgY3VycmVudCAlNC40eCBCdWZBZGRyICU0LjR4LCIKKwkJICIgZnJlZSB0byAlNC40eCwgQ21kICUyLjJ4LlxuIiwgZGV2LT5uYW1lLCBjdXJfcngsCisJCSBORVREUlZfUjE2IChSeEJ1ZkFkZHIpLAorCQkgTkVURFJWX1IxNiAoUnhCdWZQdHIpLCBORVREUlZfUjggKENoaXBDbWQpKTsKKworCXdoaWxlICgoTkVURFJWX1I4IChDaGlwQ21kKSAmIFJ4QnVmRW1wdHkpID09IDApIHsKKwkJaW50IHJpbmdfb2Zmc2V0ID0gY3VyX3J4ICUgUlhfQlVGX0xFTjsKKwkJdTMyIHJ4X3N0YXR1czsKKwkJdW5zaWduZWQgaW50IHJ4X3NpemU7CisJCXVuc2lnbmVkIGludCBwa3Rfc2l6ZTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkvKiByZWFkIHNpemUrc3RhdHVzIG9mIG5leHQgZnJhbWUgZnJvbSBETUEgcmluZyBidWZmZXIgKi8KKwkJcnhfc3RhdHVzID0gbGUzMl90b19jcHUgKCoodTMyICopIChyeF9yaW5nICsgcmluZ19vZmZzZXQpKTsKKwkJcnhfc2l6ZSA9IHJ4X3N0YXR1cyA+PiAxNjsKKwkJcGt0X3NpemUgPSByeF9zaXplIC0gNDsKKworCQlEUFJJTlRLICgiJXM6ICBuZXRkcnZfcngoKSBzdGF0dXMgJTQuNHgsIHNpemUgJTQuNHgsIgorCQkJICIgY3VyICU0LjR4LlxuIiwgZGV2LT5uYW1lLCByeF9zdGF0dXMsCisJCQkgcnhfc2l6ZSwgY3VyX3J4KTsKKyNpZiBORVREUlZfREVCVUcgPiAyCisJCXsKKwkJCWludCBpOworCQkJRFBSSU5USyAoIiVzOiBGcmFtZSBjb250ZW50cyAiLCBkZXYtPm5hbWUpOworCQkJZm9yIChpID0gMDsgaSA8IDcwOyBpKyspCisJCQkJcHJpbnRrICgiICUyLjJ4IiwKKwkJCQkJcnhfcmluZ1tyaW5nX29mZnNldCArIGldKTsKKwkJCXByaW50ayAoIi5cbiIpOworCQl9CisjZW5kaWYKKworCQkvKiBJZiBSeCBlcnIgb3IgaW52YWxpZCByeF9zaXplL3J4X3N0YXR1cyByZWNlaXZlZAorCQkgKiAod2hpY2ggaGFwcGVucyBpZiB3ZSBnZXQgbG9zdCBpbiB0aGUgcmluZyksCisJCSAqIFJ4IHByb2Nlc3MgZ2V0cyByZXNldCwgc28gd2UgYWJvcnQgYW55IGZ1cnRoZXIKKwkJICogUnggcHJvY2Vzc2luZy4KKwkJICovCisJCWlmICgocnhfc2l6ZSA+IChNQVhfRVRIX0ZSQU1FX1NJWkUrNCkpIHx8CisJCSAgICAoIShyeF9zdGF0dXMgJiBSeFN0YXR1c09LKSkpIHsKKwkJCW5ldGRydl9yeF9lcnIgKHJ4X3N0YXR1cywgZGV2LCB0cCwgaW9hZGRyKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLCBjb21wYXRpYmxlIHdpdGggbmV0LTJlLiAqLworCQkvKiBPbWl0IHRoZSBmb3VyIG9jdGV0IENSQyBmcm9tIHRoZSBsZW5ndGguICovCisKKwkJLyogVE9ETzogY29uc2lkZXIgYWxsb2NhdGluZyBza2IncyBvdXRzaWRlIG9mCisJCSAqIGludGVycnVwdCBjb250ZXh0LCBib3RoIHRvIHNwZWVkIGludGVycnVwdCBwcm9jZXNzaW5nLAorCQkgKiBhbmQgYWxzbyB0byByZWR1Y2UgdGhlIGNoYW5jZXMgb2YgaGF2aW5nIHRvCisJCSAqIGRyb3AgcGFja2V0cyBoZXJlIHVuZGVyIG1lbW9yeSBwcmVzc3VyZS4KKwkJICovCisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYiAocGt0X3NpemUgKyAyKTsKKwkJaWYgKHNrYikgeworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgZmllbGRzLiAqLworCisJCQlldGhfY29weV9hbmRfc3VtIChza2IsICZyeF9yaW5nW3Jpbmdfb2Zmc2V0ICsgNF0sIHBrdF9zaXplLCAwKTsKKwkJCXNrYl9wdXQgKHNrYiwgcGt0X3NpemUpOworCisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMgKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4IChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXRwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3Rfc2l6ZTsKKwkJCXRwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCX0gZWxzZSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORworCQkJCSIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCXRwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCX0KKworCQljdXJfcnggPSAoY3VyX3J4ICsgcnhfc2l6ZSArIDQgKyAzKSAmIH4zOworCQlORVREUlZfVzE2X0YgKFJ4QnVmUHRyLCBjdXJfcnggLSAxNik7CisJfQorCisJRFBSSU5USyAoIiVzOiBEb25lIG5ldGRydl9yeCgpLCBjdXJyZW50ICU0LjR4IEJ1ZkFkZHIgJTQuNHgsIgorCQkgIiBmcmVlIHRvICU0LjR4LCBDbWQgJTIuMnguXG4iLCBkZXYtPm5hbWUsIGN1cl9yeCwKKwkJIE5FVERSVl9SMTYgKFJ4QnVmQWRkciksCisJCSBORVREUlZfUjE2IChSeEJ1ZlB0ciksIE5FVERSVl9SOCAoQ2hpcENtZCkpOworCisJdHAtPmN1cl9yeCA9IGN1cl9yeDsKK30KKworCitzdGF0aWMgdm9pZCBuZXRkcnZfd2VpcmRfaW50ZXJydXB0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IG5ldGRydl9wcml2YXRlICp0cCwKKwkJCQkgICAgIHZvaWQgKmlvYWRkciwKKwkJCQkgICAgIGludCBzdGF0dXMsIGludCBsaW5rX2NoYW5nZWQpCit7CisJcHJpbnRrIChLRVJOX0RFQlVHICIlczogQWJub3JtYWwgaW50ZXJydXB0LCBzdGF0dXMgJTguOHguXG4iLAorCQlkZXYtPm5hbWUsIHN0YXR1cyk7CisKKwlhc3NlcnQgKGRldiAhPSBOVUxMKTsKKwlhc3NlcnQgKHRwICE9IE5VTEwpOworCWFzc2VydCAoaW9hZGRyICE9IE5VTEwpOworCisJLyogVXBkYXRlIHRoZSBlcnJvciBjb3VudC4gKi8KKwl0cC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBORVREUlZfUjMyIChSeE1pc3NlZCk7CisJTkVURFJWX1czMiAoUnhNaXNzZWQsIDApOworCisJaWYgKChzdGF0dXMgJiBSeFVuZGVycnVuKSAmJiBsaW5rX2NoYW5nZWQgJiYKKwkgICAgKHRwLT5kcnZfZmxhZ3MgJiBIQVNfTE5LX0NITkcpKSB7CisJCS8qIFJlYWxseSBsaW5rLWNoYW5nZSBvbiBuZXcgY2hpcHMuICovCisJCWludCBscGFyID0gTkVURFJWX1IxNiAoTldheUxQQVIpOworCQlpbnQgZHVwbGV4ID0gKGxwYXIgJiAweDAxMDApIHx8IChscGFyICYgMHgwMUMwKSA9PSAweDAwNDAKKwkJCQl8fCB0cC0+ZHVwbGV4X2xvY2s7CisJCWlmICh0cC0+ZnVsbF9kdXBsZXggIT0gZHVwbGV4KSB7CisJCQl0cC0+ZnVsbF9kdXBsZXggPSBkdXBsZXg7CisJCQlORVREUlZfVzggKENmZzkzNDYsIENmZzkzNDZfVW5sb2NrKTsKKwkJCU5FVERSVl9XOCAoQ29uZmlnMSwgdHAtPmZ1bGxfZHVwbGV4ID8gMHg2MCA6IDB4MjApOworCQkJTkVURFJWX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCQl9CisJCXN0YXR1cyAmPSB+UnhVbmRlcnJ1bjsKKwl9CisKKwkvKiBYWFggYWxvbmcgd2l0aCBuZXRkcnZfcnhfZXJyLCBhcmUgd2UgZG91YmxlLWNvdW50aW5nIGVycm9ycz8gKi8KKwlpZiAoc3RhdHVzICYKKwkgICAgKFJ4VW5kZXJydW4gfCBSeE92ZXJmbG93IHwgUnhFcnIgfCBSeEZJRk9PdmVyKSkKKwkJdHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCisJaWYgKHN0YXR1cyAmIChQQ1NUaW1lb3V0KSkKKwkJdHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgKFJ4VW5kZXJydW4gfCBSeEZJRk9PdmVyKSkKKwkJdHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFJ4T3ZlcmZsb3cpIHsKKwkJdHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCXRwLT5jdXJfcnggPSBORVREUlZfUjE2IChSeEJ1ZkFkZHIpICUgUlhfQlVGX0xFTjsKKwkJTkVURFJWX1cxNl9GIChSeEJ1ZlB0ciwgdHAtPmN1cl9yeCAtIDE2KTsKKwl9CisJaWYgKHN0YXR1cyAmIFBDSUVycikgeworCQl1MTYgcGNpX2NtZF9zdGF0dXM7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkICh0cC0+cGNpX2RldiwgUENJX1NUQVRVUywgJnBjaV9jbWRfc3RhdHVzKTsKKworCQlwcmludGsgKEtFUk5fRVJSICIlczogUENJIEJ1cyBlcnJvciAlNC40eC5cbiIsCisJCQlkZXYtPm5hbWUsIHBjaV9jbWRfc3RhdHVzKTsKKwl9Cit9CisKKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworc3RhdGljIGlycXJldHVybl90IG5ldGRydl9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwKKwkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwID0gZGV2LT5wcml2OworCWludCBib2d1c2NudCA9IG1heF9pbnRlcnJ1cHRfd29yazsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCWludCBzdGF0dXMgPSAwLCBsaW5rX2NoYW5nZWQgPSAwOyAvKiBhdm9pZCBib2d1cyAidW5pbml0IiB3YXJuaW5nICovCisJaW50IGhhbmRsZWQgPSAwOworCisJc3Bpbl9sb2NrICgmdHAtPmxvY2spOworCisJZG8geworCQlzdGF0dXMgPSBORVREUlZfUjE2IChJbnRyU3RhdHVzKTsKKworCQkvKiBoL3cgbm8gbG9uZ2VyIHByZXNlbnQgKGhvdHBsdWc/KSBvciBtYWpvciBlcnJvciwgYmFpbCAqLworCQlpZiAoc3RhdHVzID09IDB4RkZGRikKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCQkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUCAqLworCQlORVREUlZfVzE2X0YgKEludHJTdGF0dXMsIHN0YXR1cyk7CisKKwkJRFBSSU5USyAoIiVzOiBpbnRlcnJ1cHQgIHN0YXR1cz0lIzQuNHggbmV3IGludHN0YXQ9JSM0LjR4LlxuIiwKKwkJCQlkZXYtPm5hbWUsIHN0YXR1cywKKwkJCQlORVREUlZfUjE2IChJbnRyU3RhdHVzKSk7CisKKwkJaWYgKChzdGF0dXMgJgorCQkgICAgIChQQ0lFcnIgfCBQQ1NUaW1lb3V0IHwgUnhVbmRlcnJ1biB8IFJ4T3ZlcmZsb3cgfAorCQkgICAgICBSeEZJRk9PdmVyIHwgVHhFcnIgfCBUeE9LIHwgUnhFcnIgfCBSeE9LKSkgPT0gMCkKKwkJCWJyZWFrOworCisJCS8qIENoZWNrIHVuY29tbW9uIGV2ZW50cyB3aXRoIG9uZSB0ZXN0LiAqLworCQlpZiAoc3RhdHVzICYgKFBDSUVyciB8IFBDU1RpbWVvdXQgfCBSeFVuZGVycnVuIHwgUnhPdmVyZmxvdyB8CisJCSAgCSAgICAgIFJ4RklGT092ZXIgfCBUeEVyciB8IFJ4RXJyKSkKKwkJCW5ldGRydl93ZWlyZF9pbnRlcnJ1cHQgKGRldiwgdHAsIGlvYWRkciwKKwkJCQkJCSBzdGF0dXMsIGxpbmtfY2hhbmdlZCk7CisKKwkJaWYgKHN0YXR1cyAmIChSeE9LIHwgUnhVbmRlcnJ1biB8IFJ4T3ZlcmZsb3cgfCBSeEZJRk9PdmVyKSkJLyogUnggaW50ZXJydXB0ICovCisJCQluZXRkcnZfcnhfaW50ZXJydXB0IChkZXYsIHRwLCBpb2FkZHIpOworCisJCWlmIChzdGF0dXMgJiAoVHhPSyB8IFR4RXJyKSkKKwkJCW5ldGRydl90eF9pbnRlcnJ1cHQgKGRldiwgdHAsIGlvYWRkcik7CisKKwkJYm9ndXNjbnQtLTsKKwl9IHdoaWxlIChib2d1c2NudCA+IDApOworCisJaWYgKGJvZ3VzY250IDw9IDApIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcKKwkJCSIlczogVG9vIG11Y2ggd29yayBhdCBpbnRlcnJ1cHQsICIKKwkJCSJJbnRyU3RhdHVzPTB4JTQuNHguXG4iLCBkZXYtPm5hbWUsCisJCQlzdGF0dXMpOworCisJCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHQgc291cmNlcy4gKi8KKwkJTkVURFJWX1cxNiAoSW50clN0YXR1cywgMHhmZmZmKTsKKwl9CisKKwlzcGluX3VubG9jayAoJnRwLT5sb2NrKTsKKworCURQUklOVEsgKCIlczogZXhpdGluZyBpbnRlcnJ1cHQsIGludHJfc3RhdHVzPSUjNC40eC5cbiIsCisJCSBkZXYtPm5hbWUsIE5FVERSVl9SMTYgKEludHJTdGF0dXMpKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCitzdGF0aWMgaW50IG5ldGRydl9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwID0gZGV2LT5wcml2OworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCisJRFBSSU5USyAoIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAweCU0LjR4LlxuIiwKKwkJCWRldi0+bmFtZSwgTkVURFJWX1IxNiAoSW50clN0YXR1cykpOworCisJZGVsX3RpbWVyX3N5bmMgKCZ0cC0+dGltZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBETUEgcHJvY2Vzc2VzLiAqLworCU5FVERSVl9XOCAoQ2hpcENtZCwgKE5FVERSVl9SOCAoQ2hpcENtZCkgJiBDaGlwQ21kQ2xlYXIpKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJTkVURFJWX1cxNiAoSW50ck1hc2ssIDB4MDAwMCk7CisKKwkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50cy4gKi8KKwl0cC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBORVREUlZfUjMyIChSeE1pc3NlZCk7CisJTkVURFJWX1czMiAoUnhNaXNzZWQsIDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlzeW5jaHJvbml6ZV9pcnEgKCk7CisJZnJlZV9pcnEgKGRldi0+aXJxLCBkZXYpOworCisJbmV0ZHJ2X3R4X2NsZWFyICh0cCk7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHRwLT5wY2lfZGV2LCBSWF9CVUZfVE9UX0xFTiwKKwkJCSAgICB0cC0+cnhfcmluZywgdHAtPnJ4X3JpbmdfZG1hKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHRwLT5wY2lfZGV2LCBUWF9CVUZfVE9UX0xFTiwKKwkJCSAgICB0cC0+dHhfYnVmcywgdHAtPnR4X2J1ZnNfZG1hKTsKKwl0cC0+cnhfcmluZyA9IE5VTEw7CisJdHAtPnR4X2J1ZnMgPSBOVUxMOworCisJLyogR3JlZW4hIFB1dCB0aGUgY2hpcCBpbiBsb3ctcG93ZXIgbW9kZS4gKi8KKwlORVREUlZfVzggKENmZzkzNDYsIENmZzkzNDZfVW5sb2NrKTsKKwlORVREUlZfVzggKENvbmZpZzEsIDB4MDMpOworCU5FVERSVl9XOCAoQ2ZnOTM0NiwgQ2ZnOTM0Nl9Mb2NrKTsKKworCURQUklOVEsgKCJFWElUXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG5ldGRydl9pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwID0gZGV2LT5wcml2OworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShycSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAwOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToJCS8qIEdldCBhZGRyZXNzIG9mIE1JSSBQSFkgaW4gdXNlLiAqLworCQlkYXRhLT5waHlfaWQgPSB0cC0+cGh5c1swXSAmIDB4M2Y7CisJCS8qIEZhbGwgVGhyb3VnaCAqLworCisJY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCQlkYXRhLT52YWxfb3V0ID0gbWRpb19yZWFkIChkZXYsIGRhdGEtPnBoeV9pZCAmIDB4MWYsIGRhdGEtPnJlZ19udW0gJiAweDFmKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnRwLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCWlmICghY2FwYWJsZSAoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJjID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSAoJnRwLT5sb2NrLCBmbGFncyk7CisJCW1kaW9fd3JpdGUgKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYsIGRhdGEtPnZhbF9pbik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJjID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgJWRcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRkcnZfZ2V0X3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHAgPSBkZXYtPnByaXY7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKHRwICE9IE5VTEwpOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlICgmdHAtPmxvY2ssIGZsYWdzKTsKKworCQl0cC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBORVREUlZfUjMyIChSeE1pc3NlZCk7CisJCU5FVERSVl9XMzIgKFJ4TWlzc2VkLCAwKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmdHAtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlEUFJJTlRLICgiRVhJVFxuIik7CisJcmV0dXJuICZ0cC0+c3RhdHM7Cit9CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICAgVGhpcyByb3V0aW5lIGlzIG5vdCBzdGF0ZSBzZW5zaXRpdmUgYW5kIG5lZWQgbm90IGJlIFNNUCBsb2NrZWQuICovCisKK3N0YXRpYyB2b2lkIG5ldGRydl9zZXRfcnhfbW9kZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwID0gZGV2LT5wcml2OworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdTMyIG1jX2ZpbHRlclsyXTsJLyogTXVsdGljYXN0IGhhc2ggZmlsdGVyICovCisJaW50IGksIHJ4X21vZGU7CisJdTMyIHRtcDsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlEUFJJTlRLICgiJXM6ICAgbmV0ZHJ2X3NldF9yeF9tb2RlKCU0LjR4KSBkb25lIC0tIFJ4IGNvbmZpZyAlOC44eC5cbiIsCisJCQlkZXYtPm5hbWUsIGRldi0+ZmxhZ3MsIE5FVERSVl9SMzIgKFJ4Q29uZmlnKSk7CisKKwkvKiBOb3RlOiBkbyBub3QgcmVvcmRlciwgR0NDIGlzIGNsZXZlciBhYm91dCBjb21tb24gc3RhdGVtZW50cy4gKi8KKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayAoS0VSTl9OT1RJQ0UgIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJcnhfbW9kZSA9CisJCSAgICBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXMgfAorCQkgICAgQWNjZXB0QWxsUGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMHhmZmZmZmZmZjsKKwl9IGVsc2UgaWYgKChkZXYtPm1jX2NvdW50ID4gbXVsdGljYXN0X2ZpbHRlcl9saW1pdCkKKwkJICAgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIGZpbHRlciBwZXJmZWN0bHkgLS0gYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQlyeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzOworCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAweGZmZmZmZmZmOworCX0gZWxzZSB7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQlyeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzOworCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAwOworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsKKwkJICAgICBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJaW50IGJpdF9uciA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcikgPj4gMjY7CisKKwkJCW1jX2ZpbHRlcltiaXRfbnIgPj4gNV0gfD0gMSA8PCAoYml0X25yICYgMzEpOworCQl9CisJfQorCisJLyogaWYgY2FsbGVkIGZyb20gaXJxIGhhbmRsZXIsIGxvY2sgYWxyZWFkeSBhY3F1aXJlZCAqLworCWlmICghaW5faXJxICgpKQorCQlzcGluX2xvY2tfaXJxICgmdHAtPmxvY2spOworCisJLyogV2UgY2FuIHNhZmVseSB1cGRhdGUgd2l0aG91dCBzdG9wcGluZyB0aGUgY2hpcC4gKi8KKwl0bXAgPSBuZXRkcnZfcnhfY29uZmlnIHwgcnhfbW9kZSB8CisJCShORVREUlZfUjMyIChSeENvbmZpZykgJiBydGxfY2hpcF9pbmZvW3RwLT5jaGlwc2V0XS5SeENvbmZpZ01hc2spOworCU5FVERSVl9XMzJfRiAoUnhDb25maWcsIHRtcCk7CisJTkVURFJWX1czMl9GIChNQVIwICsgMCwgbWNfZmlsdGVyWzBdKTsKKwlORVREUlZfVzMyX0YgKE1BUjAgKyA0LCBtY19maWx0ZXJbMV0pOworCisJaWYgKCFpbl9pcnEgKCkpCisJCXNwaW5fdW5sb2NrX2lycSAoJnRwLT5sb2NrKTsKKworCURQUklOVEsgKCJFWElUXG4iKTsKK30KKworCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgbmV0ZHJ2X3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisJc3RydWN0IG5ldGRydl9wcml2YXRlICp0cCA9IGRldi0+cHJpdjsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIDA7CisJbmV0aWZfZGV2aWNlX2RldGFjaCAoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmdHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cywgc3RvcCBUeCBhbmQgUnguICovCisJTkVURFJWX1cxNiAoSW50ck1hc2ssIDB4MDAwMCk7CisJTkVURFJWX1c4IChDaGlwQ21kLCAoTkVURFJWX1I4IChDaGlwQ21kKSAmIENoaXBDbWRDbGVhcikpOworCisJLyogVXBkYXRlIHRoZSBlcnJvciBjb3VudHMuICovCisJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gTkVURFJWX1IzMiAoUnhNaXNzZWQpOworCU5FVERSVl9XMzIgKFJ4TWlzc2VkLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJcGNpX3NhdmVfc3RhdGUgKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUgKHBkZXYsIFBDSV9EM2hvdCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG5ldGRydl9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCXN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHAgPSBkZXYtPnByaXY7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIDA7CisJcGNpX3NldF9wb3dlcl9zdGF0ZSAocGRldiwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZSAocGRldik7CisJbmV0aWZfZGV2aWNlX2F0dGFjaCAoZGV2KTsKKwluZXRkcnZfaHdfc3RhcnQgKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBuZXRkcnZfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBNT0ROQU1FLAorCS5pZF90YWJsZQk9IG5ldGRydl9wY2lfdGJsLAorCS5wcm9iZQkJPSBuZXRkcnZfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChuZXRkcnZfcmVtb3ZlX29uZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBuZXRkcnZfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG5ldGRydl9yZXN1bWUsCisjZW5kaWYgLyogQ09ORklHX1BNICovCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IG5ldGRydl9pbml0X21vZHVsZSAodm9pZCkKK3sKKy8qIHdoZW4gYSBtb2R1bGUsIHRoaXMgaXMgcHJpbnRlZCB3aGV0aGVyIG9yIG5vdCBkZXZpY2VzIGFyZSBmb3VuZCBpbiBwcm9iZSAqLworI2lmZGVmIE1PRFVMRQorCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZuZXRkcnZfcGNpX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IG5ldGRydl9jbGVhbnVwX21vZHVsZSAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZuZXRkcnZfcGNpX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQobmV0ZHJ2X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KG5ldGRydl9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU3NF9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTUxNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYwpAQCAtMCwwICsxLDEzMDcgQEAKKy8qIDNjNTc0LmM6IEEgUENNQ0lBIGV0aGVybmV0IGRyaXZlciBmb3IgdGhlIDNjb20gM2M1NzQgIlJvYWRSdW5uZXIiLgorCisJV3JpdHRlbiAxOTkzLTE5OTggYnkKKwlEb25hbGQgQmVja2VyLCBiZWNrZXJAc2N5bGQuY29tLCAoZHJpdmVyIGNvcmUpIGFuZAorCURhdmlkIEhpbmRzLCBkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCAoZnJvbSBoaXMgUEMgY2FyZCBjb2RlKS4KKwlMb2NraW5nIGZpeGVzIChDKSBDb3B5cmlnaHQgMjAwMyBSZWQgSGF0IEluYworCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGlzIGRyaXZlciBkZXJpdmVzIGZyb20gRG9uYWxkIEJlY2tlcidzIDNjNTA5IGNvcmUsIHdoaWNoIGhhcyB0aGUKKwlmb2xsb3dpbmcgY29weXJpZ2h0OgorCUNvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKwlEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorCQorCisqLworCisvKgorCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworSS4gQm9hcmQgQ29tcGF0aWJpbGl0eQorCitUaGlzIGRldmljZSBkcml2ZXIgaXMgZGVzaWduZWQgZm9yIHRoZSAzQ29tIDNjNTc0IFBDIGNhcmQgRmFzdCBFdGhlcm5ldAorQWRhcHRlci4KKworSUkuIEJvYXJkLXNwZWNpZmljIHNldHRpbmdzCisKK05vbmUgLS0gUEMgY2FyZHMgYXJlIGF1dG9jb25maWd1cmVkLgorCitJSUkuIERyaXZlciBvcGVyYXRpb24KKworVGhlIDNjNTc0IHVzZXMgYSBCb29tZXJhbmctc3R5bGUgaW50ZXJmYWNlLCB3aXRob3V0IHRoZSBidXMtbWFzdGVyIGNhcGFiaWxpdHkuCitTZWUgdGhlIEJvb21lcmFuZyBkcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gZm9yIG1vc3QgZGV0YWlscy4KKworSVYuIE5vdGVzIGFuZCBjaGlwIGRvY3VtZW50YXRpb24uCisKK1R3byBhZGRlZCByZWdpc3RlcnMgYXJlIHVzZWQgdG8gZW5oYW5jZSBQSU8gcGVyZm9ybWFuY2UsIFJ1bm5lclJkQ3RybCBhbmQKK1J1bm5lcldyQ3RybC4gIFRoZXNlIGFyZSAxMSBiaXQgZG93bi1jb3VudGVycyB0aGF0IGFyZSBwcmVsb2FkZWQgd2l0aCB0aGUKK2NvdW50IG9mIHdvcmQgKDE2IGJpdHMpIHJlYWRzIG9yIHdyaXRlcyB0aGUgZHJpdmVyIGlzIGFib3V0IHRvIGRvIHRvIHRoZSBSeAorb3IgVHggRklGTy4gIFRoZSBjaGlwIGlzIHRoZW4gYWJsZSB0byBoaWRlIHRoZSBpbnRlcm5hbC1QQ0ktYnVzIHRvIFBDLWNhcmQKK3RyYW5zbGF0aW9uIGxhdGVuY3kgYnkgYnVmZmVyaW5nIHRoZSBJL08gb3BlcmF0aW9ucyB3aXRoIGFuIDggd29yZCBGSUZPLgorTm90ZTogTm8gb3RoZXIgY2hpcCBhY2Nlc3NlcyBhcmUgcGVybWl0dGVkIHdoZW4gdGhpcyBidWZmZXIgaXMgdXNlZC4KKworQSBzZWNvbmQgZW5oYW5jZW1lbnQgaXMgdGhhdCBib3RoIGF0dHJpYnV0ZSBhbmQgY29tbW9uIG1lbW9yeSBzcGFjZQorMHgwODAwLTB4MGZmZiBjYW4gdHJhbnNsYXRlZCB0byB0aGUgUElPIEZJRk8uICBUaHVzIG1lbW9yeSBvcGVyYXRpb25zIChmYXN0ZXIKK3dpdGggKnNvbWUqIFBDY2FyZCBicmlkZ2VzKSBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIEkvTyBvcGVyYXRpb25zLgorVGhpcyBpcyBlbmFibGVkIGJ5IHNldHRpbmcgdGhlIDB4MTAgYml0IGluIHRoZSBQQ01DSUEgTEFOIENPUi4KKworU29tZSBzbG93IFBDIGNhcmQgYnJpZGdlcyB3b3JrIGJldHRlciBpZiB0aGV5IG5ldmVyIHNlZSBhIFdBSVQgc2lnbmFsLgorVGhpcyBpcyBjb25maWd1cmVkIGJ5IHNldHRpbmcgdGhlIDB4MjAgYml0IGluIHRoZSBQQ01DSUEgTEFOIENPUi4KK09ubHkgZG8gdGhpcyBhZnRlciB0ZXN0aW5nIHRoYXQgaXQgaXMgcmVsaWFibGUgYW5kIGltcHJvdmVzIHBlcmZvcm1hbmNlLgorCitUaGUgdXBwZXIgZml2ZSBiaXRzIG9mIFJ1bm5lclJkQ3RybCBhcmUgdXNlZCB0byB3aW5kb3cgaW50byBQQ2NhcmQKK2NvbmZpZ3VyYXRpb24gc3BhY2UgcmVnaXN0ZXJzLiAgV2luZG93IDAgaXMgdGhlIHJlZ3VsYXIgQm9vbWVyYW5nL09kaWUKK3JlZ2lzdGVyIHNldCwgMS01IGFyZSB2YXJpb3VzIFBDIGNhcmQgY29udHJvbCByZWdpc3RlcnMsIGFuZCAxNi0zMSBhcmUKK3RoZSAocmV2ZXJzZWQhKSBDSVMgdGFibGUuCisKK0EgZmluYWwgbm90ZTogd3JpdGluZyB0aGUgSW50ZXJuYWxDb25maWcgcmVnaXN0ZXIgaW4gd2luZG93IDMgd2l0aCBhbgoraW52YWxpZCByYW1XaWR0aCBpcyBWZXJ5IEJhZC4KKworVi4gUmVmZXJlbmNlcworCitodHRwOi8vd3d3LnNjeWxkLmNvbS9leHBlcnQvTldheS5odG1sCitodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9EUC9EUDgzODQwLmh0bWwKKworVGhhbmtzIHRvIFRlcnJ5IE11cnBoeSBvZiAzQ29tIGZvciBwcm92aWRpbmcgZGV2ZWxvcG1lbnQgaW5mb3JtYXRpb24gZm9yCitlYXJsaWVyIDNDb20gcHJvZHVjdHMuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisjaW5jbHVkZSA8cGNtY2lhL21lbV9vcC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBIaW5kcyA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjNDb20gM2M1NzQgc2VyaWVzIFBDTUNJQSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBJTlRfTU9EVUxFX1BBUk0obiwgdikgc3RhdGljIGludCBuID0gdjsgbW9kdWxlX3BhcmFtKG4sIGludCwgMCkKKworLyogTWF4aW11bSBldmVudHMgKFJ4IHBhY2tldHMsIGV0Yy4pIHRvIGhhbmRsZSBhdCBlYWNoIGludGVycnVwdC4gKi8KK0lOVF9NT0RVTEVfUEFSTShtYXhfaW50ZXJydXB0X3dvcmssIDMyKTsKKworLyogRm9yY2UgZnVsbCBkdXBsZXggbW9kZXM/ICovCitJTlRfTU9EVUxFX1BBUk0oZnVsbF9kdXBsZXgsIDApOworCisvKiBBdXRvZGV0ZWN0IGxpbmsgcG9sYXJpdHkgcmV2ZXJzYWw/ICovCitJTlRfTU9EVUxFX1BBUk0oYXV0b19wb2xhcml0eSwgMSk7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK0lOVF9NT0RVTEVfUEFSTShwY19kZWJ1ZywgUENNQ0lBX0RFQlVHKTsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0KKyIzYzU3NF9jcy5jIDEuNjVhYzEgMjAwMy8wNC8wNyBEb25hbGQgQmVja2VyL0RhdmlkIEhpbmRzLCBiZWNrZXJAc2N5bGQuY29tLlxuIjsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAgKCg4MDAqSFopLzEwMDApCisKKy8qIFRvIG1pbmltaXplIHRoZSBzaXplIG9mIHRoZSBkcml2ZXIgc291cmNlIGFuZCBtYWtlIHRoZSBkcml2ZXIgbW9yZQorICAgcmVhZGFibGUgbm90IGFsbCBjb25zdGFudHMgYXJlIHN5bWJvbGljYWxseSBkZWZpbmVkLgorICAgWW91J2xsIG5lZWQgdGhlIG1hbnVhbCBpZiB5b3Ugd2FudCB0byB1bmRlcnN0YW5kIGRyaXZlciBkZXRhaWxzIGFueXdheS4gKi8KKy8qIE9mZnNldHMgZnJvbSBiYXNlIEkvTyBhZGRyZXNzLiAqLworI2RlZmluZSBFTDNfREFUQQkweDAwCisjZGVmaW5lIEVMM19DTUQJCTB4MGUKKyNkZWZpbmUgRUwzX1NUQVRVUwkweDBlCisKKyNkZWZpbmUgRUwzV0lORE9XKHdpbl9udW0pIG91dHcoU2VsZWN0V2luZG93ICsgKHdpbl9udW0pLCBpb2FkZHIgKyBFTDNfQ01EKQorCisvKiBUaGUgdG9wIGZpdmUgYml0cyB3cml0dGVuIHRvIEVMM19DTUQgYXJlIGEgY29tbWFuZCwgdGhlIGxvd2VyCisgICAxMSBiaXRzIGFyZSB0aGUgcGFyYW1ldGVyLCBpZiBhcHBsaWNhYmxlLiAqLworZW51bSBlbDNfY21kcyB7CisJVG90YWxSZXNldCA9IDA8PDExLCBTZWxlY3RXaW5kb3cgPSAxPDwxMSwgU3RhcnRDb2F4ID0gMjw8MTEsCisJUnhEaXNhYmxlID0gMzw8MTEsIFJ4RW5hYmxlID0gNDw8MTEsIFJ4UmVzZXQgPSA1PDwxMSwgUnhEaXNjYXJkID0gODw8MTEsCisJVHhFbmFibGUgPSA5PDwxMSwgVHhEaXNhYmxlID0gMTA8PDExLCBUeFJlc2V0ID0gMTE8PDExLAorCUZha2VJbnRyID0gMTI8PDExLCBBY2tJbnRyID0gMTM8PDExLCBTZXRJbnRyRW5iID0gMTQ8PDExLAorCVNldFN0YXR1c0VuYiA9IDE1PDwxMSwgU2V0UnhGaWx0ZXIgPSAxNjw8MTEsIFNldFJ4VGhyZXNob2xkID0gMTc8PDExLAorCVNldFR4VGhyZXNob2xkID0gMTg8PDExLCBTZXRUeFN0YXJ0ID0gMTk8PDExLCBTdGF0c0VuYWJsZSA9IDIxPDwxMSwKKwlTdGF0c0Rpc2FibGUgPSAyMjw8MTEsIFN0b3BDb2F4ID0gMjM8PDExLAorfTsKKworZW51bSBlbHhsX3N0YXR1cyB7CisJSW50TGF0Y2ggPSAweDAwMDEsIEFkYXB0ZXJGYWlsdXJlID0gMHgwMDAyLCBUeENvbXBsZXRlID0gMHgwMDA0LAorCVR4QXZhaWxhYmxlID0gMHgwMDA4LCBSeENvbXBsZXRlID0gMHgwMDEwLCBSeEVhcmx5ID0gMHgwMDIwLAorCUludFJlcSA9IDB4MDA0MCwgU3RhdHNGdWxsID0gMHgwMDgwLCBDbWRCdXN5ID0gMHgxMDAwIH07CisKKy8qIFRoZSBTZXRSeEZpbHRlciBjb21tYW5kIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzOiAqLworZW51bSBSeEZpbHRlciB7CisJUnhTdGF0aW9uID0gMSwgUnhNdWx0aWNhc3QgPSAyLCBSeEJyb2FkY2FzdCA9IDQsIFJ4UHJvbSA9IDgKK307CisKK2VudW0gV2luZG93MCB7CisJV24wRWVwcm9tQ21kID0gMTAsIFduMEVlcHJvbURhdGEgPSAxMiwgLyogRUVQUk9NIGNvbW1hbmQvYWRkcmVzcywgZGF0YS4gKi8KKwlJbnRyU3RhdHVzPTB4MEUsCQkvKiBWYWxpZCBpbiBhbGwgd2luZG93cy4gKi8KK307CisvKiBUaGVzZSBhc3N1bWVzIHRoZSBsYXJnZXIgRUVQUk9NLiAqLworZW51bSBXaW4wX0VFUFJPTV9jbWRzIHsKKwlFRVBST01fUmVhZCA9IDB4MjAwLCBFRVBST01fV1JJVEUgPSAweDEwMCwgRUVQUk9NX0VSQVNFID0gMHgzMDAsCisJRUVQUk9NX0VXRU5CID0gMHgzMCwJCS8qIEVuYWJsZSBlcmFzaW5nL3dyaXRpbmcgZm9yIDEwIG1zZWMuICovCisJRUVQUk9NX0VXRElTID0gMHgwMCwJCS8qIERpc2FibGUgRVdFTkIgYmVmb3JlIDEwIG1zZWMgdGltZW91dC4gKi8KK307CisKKy8qIFJlZ2lzdGVyIHdpbmRvdyAxIG9mZnNldHMsIHRoZSB3aW5kb3cgdXNlZCBpbiBub3JtYWwgb3BlcmF0aW9uLgorICAgT24gdGhlICJPZGllIiB0aGlzIHdpbmRvdyBpcyBhbHdheXMgbWFwcGVkIGF0IG9mZnNldHMgMHgxMC0weDFmLgorICAgRXhjZXB0IGZvciBUeEZyZWUsIHdoaWNoIGlzIG92ZXJsYXBwZWQgYnkgUnVubmVyV3JDdHJsLiAqLworZW51bSBXaW5kb3cxIHsKKwlUWF9GSUZPID0gMHgxMCwgIFJYX0ZJRk8gPSAweDEwLCAgUnhFcnJvcnMgPSAweDE0LAorCVJ4U3RhdHVzID0gMHgxOCwgIFRpbWVyPTB4MUEsIFR4U3RhdHVzID0gMHgxQiwKKwlUeEZyZWUgPSAweDBDLCAvKiBSZW1haW5pbmcgZnJlZSBieXRlcyBpbiBUeCBidWZmZXIuICovCisJUnVubmVyUmRDdHJsID0gMHgxNiwgUnVubmVyV3JDdHJsID0gMHgxYywKK307CisKK2VudW0gV2luZG93MyB7CQkJLyogV2luZG93IDM6IE1BQy9jb25maWcgYml0cy4gKi8KKwlXbjNfQ29uZmlnPTAsIFduM19NQUNfQ3RybD02LCBXbjNfT3B0aW9ucz04LAorfTsKK3VuaW9uIHduM19jb25maWcgeworCWludCBpOworCXN0cnVjdCB3M19jb25maWdfZmllbGRzIHsKKwkJdW5zaWduZWQgaW50IHJhbV9zaXplOjMsIHJhbV93aWR0aDoxLCByYW1fc3BlZWQ6Miwgcm9tX3NpemU6MjsKKwkJaW50IHBhZDg6ODsKKwkJdW5zaWduZWQgaW50IHJhbV9zcGxpdDoyLCBwYWQxODoyLCB4Y3ZyOjMsIHBhZDIxOjEsIGF1dG9zZWxlY3Q6MTsKKwkJaW50IHBhZDI0Ojc7CisJfSB1OworfTsKKworZW51bSBXaW5kb3c0IHsJCS8qIFdpbmRvdyA0OiBYY3ZyL21lZGlhIGJpdHMuICovCisJV240X0ZJRk9EaWFnID0gNCwgV240X05ldERpYWcgPSA2LCBXbjRfUGh5c2ljYWxNZ210PTgsIFduNF9NZWRpYSA9IDEwLAorfTsKKworI2RlZmluZSBNRURJQV9UUAkweDAwQzAJLyogRW5hYmxlIGxpbmsgYmVhdCBhbmQgamFiYmVyIGZvciAxMGJhc2VULiAqLworCitzdHJ1Y3QgZWwzX3ByaXZhdGUgeworCWRldl9saW5rX3QgbGluazsKKwlkZXZfbm9kZV90IG5vZGU7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdTE2IGFkdmVydGlzaW5nLCBwYXJ0bmVyOwkJLyogTldheSBtZWRpYSBhZHZlcnRpc2VtZW50ICovCisJdW5zaWduZWQgY2hhciBwaHlzOwkJCS8qIE1JSSBkZXZpY2UgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCBhdXRvc2VsZWN0OjEsIGRlZmF1bHRfbWVkaWE6MzsJLyogUmVhZCBmcm9tIHRoZSBFRVBST00vV24zX0NvbmZpZy4gKi8KKwkvKiBmb3IgdHJhbnNjZWl2ZXIgbW9uaXRvcmluZyAqLworCXN0cnVjdCB0aW1lcl9saXN0IG1lZGlhOworCXVuc2lnbmVkIHNob3J0IG1lZGlhX3N0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBmYXN0X3BvbGw7CisJdW5zaWduZWQgbG9uZyBsYXN0X2lycTsKKwlzcGlubG9ja190IHdpbmRvd19sb2NrOwkJCS8qIEd1YXJkcyB0aGUgV2luZG93IHNlbGVjdGlvbiAqLworfTsKKworLyogU2V0IGlmZiBhIE1JSSB0cmFuc2NlaXZlciBvbiBhbnkgaW50ZXJmYWNlIHJlcXVpcmVzIG1kaW8gcHJlYW1ibGUuCisgICBUaGlzIG9ubHkgc2V0IHdpdGggdGhlIG9yaWdpbmFsIERQODM4NDAgb24gb2xkZXIgM2M5MDUgYm9hcmRzLCBzbyB0aGUgZXh0cmEKKyAgIGNvZGUgc2l6ZSBvZiBhIHBlci1pbnRlcmZhY2UgZmxhZyBpcyBub3Qgd29ydGh3aGlsZS4gKi8KK3N0YXRpYyBjaGFyIG1paV9wcmVhbWJsZV9yZXF1aXJlZCA9IDA7CisKKy8qIEluZGV4IG9mIGZ1bmN0aW9ucy4gKi8KKworc3RhdGljIHZvaWQgdGM1NzRfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgdGM1NzRfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgdGM1NzRfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJCQkgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworCitzdGF0aWMgdm9pZCBtZGlvX3N5bmMoa2lvX2FkZHJfdCBpb2FkZHIsIGludCBiaXRzKTsKK3N0YXRpYyBpbnQgbWRpb19yZWFkKGtpb19hZGRyX3QgaW9hZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworc3RhdGljIHZvaWQgbWRpb193cml0ZShraW9fYWRkcl90IGlvYWRkciwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJlYWRfZWVwcm9tKGtpb19hZGRyX3QgaW9hZGRyLCBpbnQgaW5kZXgpOworc3RhdGljIHZvaWQgdGM1NzRfd2FpdF9mb3JfY29tcGxldGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY21kKTsKKworc3RhdGljIHZvaWQgdGM1NzRfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBtZWRpYV9jaGVjayh1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IGVsM19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlbDNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBlbDNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplbDNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlbDNfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHdvcmtsaW1pdCk7CitzdGF0aWMgaW50IGVsM19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVsM190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlbDNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICIzYzU3NF9jcyI7CisKK3N0YXRpYyBkZXZfbGlua190ICp0YzU3NF9hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCB0YzU3NF9kZXRhY2goZGV2X2xpbmtfdCAqKTsKKworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0OworCisvKgorCXRjNTc0X2F0dGFjaCgpIGNyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nCisJbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkCisJd2l0aCBDYXJkIFNlcnZpY2VzLgorKi8KKworc3RhdGljIGRldl9saW5rX3QgKnRjNTc0X2F0dGFjaCh2b2lkKQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHA7CisJY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisJZGV2X2xpbmtfdCAqbGluazsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCByZXQ7CisKKwlERUJVRygwLCAiM2M1NzRfYXR0YWNoKClcbiIpOworCisJLyogQ3JlYXRlIHRoZSBQQyBjYXJkIGRldmljZSBvYmplY3QuICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBlbDNfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJbGluayA9ICZscC0+bGluazsKKwlsaW5rLT5wcml2ID0gZGV2OworCisJc3Bpbl9sb2NrX2luaXQoJmxwLT53aW5kb3dfbG9jayk7CisJbGluay0+aW8uTnVtUG9ydHMxID0gMzI7CisJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworCWxpbmstPmlycS5IYW5kbGVyID0gJmVsM19pbnRlcnJ1cHQ7CisJbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKwlsaW5rLT5jb25mLlZjYyA9IDUwOworCWxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAxOworCWxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOworCisJLyogVGhlIEVMMy1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmVsM19zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gJmVsM19nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9ICZlbDNfaW9jdGw7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7CisJZGV2LT5vcGVuID0gJmVsM19vcGVuOworCWRldi0+c3RvcCA9ICZlbDNfY2xvc2U7CisjaWZkZWYgSEFWRV9UWF9USU1FT1VUCisJZGV2LT50eF90aW1lb3V0ID0gZWwzX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjZW5kaWYKKworCS8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKKwlkZXZfbGlzdCA9IGxpbms7CisJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKwljbGllbnRfcmVnLkV2ZW50TWFzayA9CisJCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwkJCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJCQkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKwljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmdGM1NzRfZXZlbnQ7CisJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJCXRjNTc0X2RldGFjaChsaW5rKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGxpbms7Cit9IC8qIHRjNTc0X2F0dGFjaCAqLworCisvKgorCisJVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKwl3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKwlzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorCXdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKworKi8KKworc3RhdGljIHZvaWQgdGM1NzRfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisJZGV2X2xpbmtfdCAqKmxpbmtwOworCisJREVCVUcoMCwgIjNjNTc0X2RldGFjaCgweCVwKVxuIiwgbGluayk7CisKKwkvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworCWZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisJaWYgKCpsaW5rcCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAobGluay0+ZGV2KQorCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkJdGM1NzRfcmVsZWFzZShsaW5rKTsKKworCWlmIChsaW5rLT5oYW5kbGUpCisJCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisJLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgYml0cyAqLworCSpsaW5rcCA9IGxpbmstPm5leHQ7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30gLyogdGM1NzRfZGV0YWNoICovCisKKy8qCisJdGM1NzRfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50CisJaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCisJZXRoZXJuZXQgZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorKi8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCisgIGRvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBjaGFyICpyYW1fc3BsaXRbXSA9IHsiNTozIiwgIjM6MSIsICIxOjEiLCAiMzo1In07CisKK3N0YXRpYyB2b2lkIHRjNTc0X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworCWNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdHVwbGVfdCB0dXBsZTsKKwljaXNwYXJzZV90IHBhcnNlOworCXVuc2lnbmVkIHNob3J0IGJ1ZlszMl07CisJaW50IGxhc3RfZm4sIGxhc3RfcmV0LCBpLCBqOworCWtpb19hZGRyX3QgaW9hZGRyOworCXUxNiAqcGh5c19hZGRyOworCWNoYXIgKmNhcmRuYW1lOworCXVuaW9uIHduM19jb25maWcgY29uZmlnOworCisJcGh5c19hZGRyID0gKHUxNiAqKWRldi0+ZGV2X2FkZHI7CisKKwlERUJVRygwLCAiM2M1NzRfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCXR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKwlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKwlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisKKwkvKiBDb25maWd1cmUgY2FyZCAqLworCWxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKwlsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDE2OworCWZvciAoaSA9IGogPSAwOyBqIDwgMHg0MDA7IGogKz0gMHgyMCkgeworCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBqIF4gMHgzMDA7CisJCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJCWlmIChpID09IENTX1NVQ0NFU1MpIGJyZWFrOworCX0KKwlpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdElPLCBpKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKKwlDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSk7CisKKwlkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKwlkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJLyogVGhlIDNjNTc0IG5vcm1hbGx5IHVzZXMgYW4gRUVQUk9NIGZvciBjb25maWd1cmF0aW9uIGluZm8sIGluY2x1ZGluZworCSAgIHRoZSBoYXJkd2FyZSBhZGRyZXNzLiAgVGhlIGZ1dHVyZSBwcm9kdWN0cyBtYXkgaW5jbHVkZSBhIG1vZGVtIGNoaXAKKwkgICBhbmQgcHV0IHRoZSBhZGRyZXNzIGluIHRoZSBDSVMuICovCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gMHg4ODsKKwlpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykgeworCQlwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpOworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJcGh5c19hZGRyW2ldID0gaHRvbnMoYnVmW2ldKTsKKwl9IGVsc2UgeworCQlFTDNXSU5ET1coMCk7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlwaHlzX2FkZHJbaV0gPSBodG9ucyhyZWFkX2VlcHJvbShpb2FkZHIsIGkgKyAxMCkpOworCQlpZiAocGh5c19hZGRyWzBdID09IDB4NjA2MCkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIzYzU3NF9jczogSU8gcG9ydCBjb25mbGljdCBhdCAweCUwM2x4IgorCQkJCSAgICItMHglMDNseFxuIiwgZGV2LT5iYXNlX2FkZHIsIGRldi0+YmFzZV9hZGRyKzE1KTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJfQorCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7CisJaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpID09IENTX1NVQ0NFU1MgJiYKKwkJcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTICYmCisJCXBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSA9PSBDU19TVUNDRVNTKSB7CisJCWNhcmRuYW1lID0gcGFyc2UudmVyc2lvbl8xLnN0ciArIHBhcnNlLnZlcnNpb25fMS5vZnNbMV07CisJfSBlbHNlCisJCWNhcmRuYW1lID0gIjNDb20gM2M1NzQiOworCisJeworCQl1X2NoYXIgbWNyOworCQlvdXR3KDI8PDExLCBpb2FkZHIgKyBSdW5uZXJSZEN0cmwpOworCQltY3IgPSBpbmIoaW9hZGRyICsgMik7CisJCW91dHcoMDw8MTEsIGlvYWRkciArIFJ1bm5lclJkQ3RybCk7CisJCXByaW50ayhLRVJOX0lORk8gIiAgQVNJQyByZXYgJWQsIiwgbWNyPj4zKTsKKwkJRUwzV0lORE9XKDMpOworCQljb25maWcuaSA9IGlubChpb2FkZHIgKyBXbjNfQ29uZmlnKTsKKwkJbHAtPmRlZmF1bHRfbWVkaWEgPSBjb25maWcudS54Y3ZyOworCQlscC0+YXV0b3NlbGVjdCA9IGNvbmZpZy51LmF1dG9zZWxlY3Q7CisJfQorCisJaW5pdF90aW1lcigmbHAtPm1lZGlhKTsKKworCXsKKwkJaW50IHBoeTsKKwkJCisJCS8qIFJvYWRydW5uZXIgb25seTogVHVybiBvbiB0aGUgTUlJIHRyYW5zY2VpdmVyICovCisJCW91dHcoMHg4MDQwLCBpb2FkZHIgKyBXbjNfT3B0aW9ucyk7CisJCW1kZWxheSgxKTsKKwkJb3V0dygweGMwNDAsIGlvYWRkciArIFduM19PcHRpb25zKTsKKwkJdGM1NzRfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFR4UmVzZXQpOworCQl0YzU3NF93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgUnhSZXNldCk7CisJCW1kZWxheSgxKTsKKwkJb3V0dygweDgwNDAsIGlvYWRkciArIFduM19PcHRpb25zKTsKKwkJCisJCUVMM1dJTkRPVyg0KTsKKwkJZm9yIChwaHkgPSAxOyBwaHkgPD0gMzI7IHBoeSsrKSB7CisJCQlpbnQgbWlpX3N0YXR1czsKKwkJCW1kaW9fc3luYyhpb2FkZHIsIDMyKTsKKwkJCW1paV9zdGF0dXMgPSBtZGlvX3JlYWQoaW9hZGRyLCBwaHkgJiAweDFmLCAxKTsKKwkJCWlmIChtaWlfc3RhdHVzICE9IDB4ZmZmZikgeworCQkJCWxwLT5waHlzID0gcGh5ICYgMHgxZjsKKwkJCQlERUJVRygwLCAiICBNSUkgdHJhbnNjZWl2ZXIgYXQgaW5kZXggJWQsIHN0YXR1cyAleC5cbiIsCisJCQkJCSAgcGh5LCBtaWlfc3RhdHVzKTsKKwkJCQlpZiAoKG1paV9zdGF0dXMgJiAweDAwNDApID09IDApCisJCQkJCW1paV9wcmVhbWJsZV9yZXF1aXJlZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHBoeSA+IDMyKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgTm8gTUlJIHRyYW5zY2VpdmVycyBmb3VuZCFcbiIpOworCQkJZ290byBmYWlsZWQ7CisJCX0KKwkJaSA9IG1kaW9fcmVhZChpb2FkZHIsIGxwLT5waHlzLCAxNikgfCAweDQwOworCQltZGlvX3dyaXRlKGlvYWRkciwgbHAtPnBoeXMsIDE2LCBpKTsKKwkJbHAtPmFkdmVydGlzaW5nID0gbWRpb19yZWFkKGlvYWRkciwgbHAtPnBoeXMsIDQpOworCQlpZiAoZnVsbF9kdXBsZXgpIHsKKwkJCS8qIE9ubHkgYWR2ZXJ0aXNlIHRoZSBGRCBtZWRpYSB0eXBlcy4gKi8KKwkJCWxwLT5hZHZlcnRpc2luZyAmPSB+MHgwMmEwOworCQkJbWRpb193cml0ZShpb2FkZHIsIGxwLT5waHlzLCA0LCBscC0+YWR2ZXJ0aXNpbmcpOworCQl9CisJfQorCisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKwlsaW5rLT5kZXYgPSAmbHAtPm5vZGU7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiM2M1NzRfY3M6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJCWxpbmstPmRldiA9IE5VTEw7CisJCWdvdG8gZmFpbGVkOworCX0KKworCXN0cmNweShscC0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBhdCBpbyAlIzNseCwgaXJxICVkLCBod19hZGRyICIsCisJCSAgIGRldi0+bmFtZSwgY2FyZG5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMDJYJXMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGk8NSkgPyAiOiIgOiAiLlxuIikpOworCXByaW50aygiICVkSyBGSUZPIHNwbGl0ICVzIFJ4OlR4LCAlc01JSSBpbnRlcmZhY2UuXG4iLAorCQkgICA4IDw8IGNvbmZpZy51LnJhbV9zaXplLCByYW1fc3BsaXRbY29uZmlnLnUucmFtX3NwbGl0XSwKKwkJICAgY29uZmlnLnUuYXV0b3NlbGVjdCA/ICJhdXRvc2VsZWN0ICIgOiAiIik7CisKKwlyZXR1cm47CisKK2NzX2ZhaWxlZDoKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKK2ZhaWxlZDoKKwl0YzU3NF9yZWxlYXNlKGxpbmspOworCXJldHVybjsKKworfSAvKiB0YzU3NF9jb25maWcgKi8KKworLyoKKwlBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgdGM1NzRfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUgbmV0CisJZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisJc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisqLworCitzdGF0aWMgdm9pZCB0YzU3NF9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisJREVCVUcoMCwgIjNjNTc0X3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCXBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCisvKgorCVRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorCXN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4gIEEgQ0FSRF9SRU1PVkFMIGV2ZW50CisJYWxzbyBzZXRzIHNvbWUgZmxhZ3MgdG8gZGlzY291cmFnZSB0aGUgbmV0IGRyaXZlcnMgZnJvbSB0cnlpbmcKKwl0byB0YWxrIHRvIHRoZSBjYXJkIGFueSBtb3JlLgorKi8KKworc3RhdGljIGludCB0YzU3NF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQkJCSAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKwlkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKwlERUJVRygxLCAiM2M1NzRfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCQl0YzU3NF9jb25maWcobGluayk7CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCWlmIChsaW5rLT5vcGVuKQorCQkJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwkJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCXBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJCQlpZiAobGluay0+b3BlbikgeworCQkJCXRjNTc0X3Jlc2V0KGRldik7CisJCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30gLyogdGM1NzRfZXZlbnQgKi8KKworc3RhdGljIHZvaWQgZHVtcF9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCUVMM1dJTkRPVygxKTsKKwlwcmludGsoS0VSTl9JTkZPICIgIGlycSBzdGF0dXMgJTA0eCwgcnggc3RhdHVzICUwNHgsIHR4IHN0YXR1cyAiCisJCSAgICIlMDJ4LCB0eCBmcmVlICUwNHhcbiIsIGludyhpb2FkZHIrRUwzX1NUQVRVUyksCisJCSAgIGludyhpb2FkZHIrUnhTdGF0dXMpLCBpbmIoaW9hZGRyK1R4U3RhdHVzKSwKKwkJICAgaW53KGlvYWRkcitUeEZyZWUpKTsKKwlFTDNXSU5ET1coNCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiICBkaWFnbm9zdGljczogZmlmbyAlMDR4IG5ldCAlMDR4IGV0aGVybmV0ICUwNHgiCisJCSAgICIgbWVkaWEgJTA0eFxuIiwgaW53KGlvYWRkcisweDA0KSwgaW53KGlvYWRkcisweDA2KSwKKwkJICAgaW53KGlvYWRkcisweDA4KSwgaW53KGlvYWRkcisweDBhKSk7CisJRUwzV0lORE9XKDEpOworfQorCisvKgorICBVc2UgdGhpcyBmb3IgY29tbWFuZHMgdGhhdCBtYXkgdGFrZSB0aW1lIHRvIGZpbmlzaAorKi8KK3N0YXRpYyB2b2lkIHRjNTc0X3dhaXRfZm9yX2NvbXBsZXRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNtZCkKK3sKKwlpbnQgaSA9IDE1MDA7CisJb3V0dyhjbWQsIGRldi0+YmFzZV9hZGRyICsgRUwzX0NNRCk7CisJd2hpbGUgKC0taSA+IDApCisJCWlmICghKGludyhkZXYtPmJhc2VfYWRkciArIEVMM19TVEFUVVMpICYgMHgxMDAwKSkgYnJlYWs7CisJaWYgKGkgPT0gMCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogY29tbWFuZCAweCUwNHggZGlkIG5vdCBjb21wbGV0ZSFcbiIsIGRldi0+bmFtZSwgY21kKTsKK30KKworLyogUmVhZCBhIHdvcmQgZnJvbSB0aGUgRUVQUk9NIHVzaW5nIHRoZSByZWd1bGFyIEVFUFJPTSBhY2Nlc3MgcmVnaXN0ZXIuCisgICBBc3N1bWUgdGhhdCB3ZSBhcmUgaW4gcmVnaXN0ZXIgd2luZG93IHplcm8uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByZWFkX2VlcHJvbShraW9fYWRkcl90IGlvYWRkciwgaW50IGluZGV4KQoreworCWludCB0aW1lcjsKKwlvdXR3KEVFUFJPTV9SZWFkICsgaW5kZXgsIGlvYWRkciArIFduMEVlcHJvbUNtZCk7CisJLyogUGF1c2UgZm9yIGF0IGxlYXN0IDE2MiB1c2VjIGZvciB0aGUgcmVhZCB0byB0YWtlIHBsYWNlLiAqLworCWZvciAodGltZXIgPSAxNjIwOyB0aW1lciA+PSAwOyB0aW1lci0tKSB7CisJCWlmICgoaW53KGlvYWRkciArIFduMEVlcHJvbUNtZCkgJiAweDgwMDApID09IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGludyhpb2FkZHIgKyBXbjBFZXByb21EYXRhKTsKK30KKworLyogTUlJIHRyYW5zY2VpdmVyIGNvbnRyb2wgc2VjdGlvbi4KKyAgIFJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKyAgIE1ESU8gcHJvdG9jb2wuICBTZWUgdGhlIE1JSSBzcGVjaWZpY2F0aW9ucyBvciBEUDgzODQwQSBkYXRhIHNoZWV0CisgICBmb3IgZGV0YWlscy4KKyAgIFRoZSBtYXhpdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICBUaGUgdGltaW5nIGlzIGVhc2lseSBtZXQgYnkgdGhlCisgICBzbG93IFBDIGNhcmQgaW50ZXJmYWNlLiAqLworCisjZGVmaW5lIE1ESU9fU0hJRlRfQ0xLCTB4MDEKKyNkZWZpbmUgTURJT19ESVJfV1JJVEUJMHgwNAorI2RlZmluZSBNRElPX0RBVEFfV1JJVEUwICgweDAwIHwgTURJT19ESVJfV1JJVEUpCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTEgKDB4MDIgfCBNRElPX0RJUl9XUklURSkKKyNkZWZpbmUgTURJT19EQVRBX1JFQUQJMHgwMgorI2RlZmluZSBNRElPX0VOQl9JTgkJMHgwMAorCisvKiBHZW5lcmF0ZSB0aGUgcHJlYW1ibGUgcmVxdWlyZWQgZm9yIGluaXRpYWwgc3luY2hyb25pemF0aW9uIGFuZAorICAgYSBmZXcgb2xkZXIgdHJhbnNjZWl2ZXJzLiAqLworc3RhdGljIHZvaWQgbWRpb19zeW5jKGtpb19hZGRyX3QgaW9hZGRyLCBpbnQgYml0cykKK3sKKwlraW9fYWRkcl90IG1kaW9fYWRkciA9IGlvYWRkciArIFduNF9QaHlzaWNhbE1nbXQ7CisKKwkvKiBFc3RhYmxpc2ggc3luYyBieSBzZW5kaW5nIGF0IGxlYXN0IDMyIGxvZ2ljIG9uZXMuICovCisJd2hpbGUgKC0tIGJpdHMgPj0gMCkgeworCQlvdXR3KE1ESU9fREFUQV9XUklURTEsIG1kaW9fYWRkcik7CisJCW91dHcoTURJT19EQVRBX1dSSVRFMSB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOworCX0KK30KKworc3RhdGljIGludCBtZGlvX3JlYWQoa2lvX2FkZHJfdCBpb2FkZHIsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwlpbnQgaTsKKwlpbnQgcmVhZF9jbWQgPSAoMHhmNiA8PCAxMCkgfCAocGh5X2lkIDw8IDUpIHwgbG9jYXRpb247CisJdW5zaWduZWQgaW50IHJldHZhbCA9IDA7CisJa2lvX2FkZHJfdCBtZGlvX2FkZHIgPSBpb2FkZHIgKyBXbjRfUGh5c2ljYWxNZ210OworCisJaWYgKG1paV9wcmVhbWJsZV9yZXF1aXJlZCkKKwkJbWRpb19zeW5jKGlvYWRkciwgMzIpOworCisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAxNDsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAocmVhZF9jbWQmKDE8PGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiBNRElPX0RBVEFfV1JJVEUwOworCQlvdXR3KGRhdGF2YWwsIG1kaW9fYWRkcik7CisJCW91dHcoZGF0YXZhbCB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOworCX0KKwkvKiBSZWFkIHRoZSB0d28gdHJhbnNpdGlvbiwgMTYgZGF0YSwgYW5kIHdpcmUtaWRsZSBiaXRzLiAqLworCWZvciAoaSA9IDE5OyBpID4gMDsgaS0tKSB7CisJCW91dHcoTURJT19FTkJfSU4sIG1kaW9fYWRkcik7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGludyhtZGlvX2FkZHIpICYgTURJT19EQVRBX1JFQUQpID8gMSA6IDApOworCQlvdXR3KE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJfQorCXJldHVybiAocmV0dmFsPj4xKSAmIDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShraW9fYWRkcl90IGlvYWRkciwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpCit7CisJaW50IHdyaXRlX2NtZCA9IDB4NTAwMjAwMDAgfCAocGh5X2lkIDw8IDIzKSB8IChsb2NhdGlvbiA8PCAxOCkgfCB2YWx1ZTsKKwlraW9fYWRkcl90IG1kaW9fYWRkciA9IGlvYWRkciArIFduNF9QaHlzaWNhbE1nbXQ7CisJaW50IGk7CisKKwlpZiAobWlpX3ByZWFtYmxlX3JlcXVpcmVkKQorCQltZGlvX3N5bmMoaW9hZGRyLCAzMik7CisKKwkvKiBTaGlmdCB0aGUgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAod3JpdGVfY21kJigxPDxpKSkgPyBNRElPX0RBVEFfV1JJVEUxIDogTURJT19EQVRBX1dSSVRFMDsKKwkJb3V0dyhkYXRhdmFsLCBtZGlvX2FkZHIpOworCQlvdXR3KGRhdGF2YWwgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwl9CisJLyogTGVhdmUgdGhlIGludGVyZmFjZSBpZGxlLiAqLworCWZvciAoaSA9IDE7IGkgPj0gMDsgaS0tKSB7CisJCW91dHcoTURJT19FTkJfSU4sIG1kaW9fYWRkcik7CisJCW91dHcoTURJT19FTkJfSU4gfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qIFJlc2V0IGFuZCByZXN0b3JlIGFsbCBvZiB0aGUgM2M1NzQgcmVnaXN0ZXJzLiAqLworc3RhdGljIHZvaWQgdGM1NzRfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0YzU3NF93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgVG90YWxSZXNldHwweDEwKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwkvKiBDbGVhciBhbnkgdHJhbnNhY3Rpb25zIGluIHByb2dyZXNzLiAqLworCW91dHcoMCwgaW9hZGRyICsgUnVubmVyV3JDdHJsKTsKKwlvdXR3KDAsIGlvYWRkciArIFJ1bm5lclJkQ3RybCk7CisKKwkvKiBTZXQgdGhlIHN0YXRpb24gYWRkcmVzcyBhbmQgbWFzay4gKi8KKwlFTDNXSU5ET1coMik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJb3V0YihkZXYtPmRldl9hZGRyW2ldLCBpb2FkZHIgKyBpKTsKKwlmb3IgKDsgaSA8IDEyOyBpKz0yKQorCQlvdXR3KDAsIGlvYWRkciArIGkpOworCisJLyogUmVzZXQgY29uZmlnIG9wdGlvbnMgKi8KKwlFTDNXSU5ET1coMyk7CisJb3V0YigoZGV2LT5tdHUgPiAxNTAwID8gMHg0MCA6IDApLCBpb2FkZHIgKyBXbjNfTUFDX0N0cmwpOworCW91dGwoKGxwLT5hdXRvc2VsZWN0ID8gMHgwMTAwMDAwMCA6IDApIHwgMHgwMDYyMDAxYiwKKwkJIGlvYWRkciArIFduM19Db25maWcpOworCS8qIFJvYWRydW5uZXIgb25seTogVHVybiBvbiB0aGUgTUlJIHRyYW5zY2VpdmVyLiAqLworCW91dHcoMHg4MDQwLCBpb2FkZHIgKyBXbjNfT3B0aW9ucyk7CisJbWRlbGF5KDEpOworCW91dHcoMHhjMDQwLCBpb2FkZHIgKyBXbjNfT3B0aW9ucyk7CisJRUwzV0lORE9XKDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCQorCXRjNTc0X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBUeFJlc2V0KTsKKwl0YzU3NF93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgUnhSZXNldCk7CisJbWRlbGF5KDEpOworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwlFTDNXSU5ET1coMyk7CisJb3V0dygweDgwNDAsIGlvYWRkciArIFduM19PcHRpb25zKTsKKworCS8qIFN3aXRjaCB0byB0aGUgc3RhdHMgd2luZG93LCBhbmQgY2xlYXIgYWxsIHN0YXRzIGJ5IHJlYWRpbmcuICovCisJb3V0dyhTdGF0c0Rpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCUVMM1dJTkRPVyg2KTsKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJaW5iKGlvYWRkciArIGkpOworCWludyhpb2FkZHIgKyAxMCk7CisJaW53KGlvYWRkciArIDEyKTsKKwlFTDNXSU5ET1coNCk7CisJaW5iKGlvYWRkciArIDEyKTsKKwlpbmIoaW9hZGRyICsgMTMpOworCisJLyogLi4gZW5hYmxlIGFueSBleHRyYSBzdGF0aXN0aWNzIGJpdHMuLiAqLworCW91dHcoMHgwMDQwLCBpb2FkZHIgKyBXbjRfTmV0RGlhZyk7CisJCisJRUwzV0lORE9XKDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCQorCS8qIC4uIHJlLXN5bmMgTUlJIGFuZCByZS1maWxsIHdoYXQgTldheSBpcyBhZHZlcnRpc2luZy4gKi8KKwltZGlvX3N5bmMoaW9hZGRyLCAzMik7CisJbWRpb193cml0ZShpb2FkZHIsIGxwLT5waHlzLCA0LCBscC0+YWR2ZXJ0aXNpbmcpOworCWlmICghYXV0b19wb2xhcml0eSkgeworCQkvKiB3b3JrcyBmb3IgVERLIDc4UTIxMjAgc2VyaWVzIE1JSSdzICovCisJCWludCBpID0gbWRpb19yZWFkKGlvYWRkciwgbHAtPnBoeXMsIDE2KSB8IDB4MjA7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCBscC0+cGh5cywgMTYsIGkpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwkvKiBTd2l0Y2ggdG8gcmVnaXN0ZXIgc2V0IDEgZm9yIG5vcm1hbCB1c2UsIGp1c3QgZm9yIFR4RnJlZS4gKi8KKwlzZXRfcnhfbW9kZShkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCW91dHcoU3RhdHNFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBUdXJuIG9uIHN0YXRpc3RpY3MuICovCisJb3V0dyhSeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIEVuYWJsZSB0aGUgcmVjZWl2ZXIuICovCisJb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIEVuYWJsZSB0cmFuc21pdHRlci4gKi8KKwkvKiBBbGxvdyBzdGF0dXMgYml0cyB0byBiZSBzZWVuLiAqLworCW91dHcoU2V0U3RhdHVzRW5iIHwgMHhmZiwgaW9hZGRyICsgRUwzX0NNRCk7CisJLyogQWNrIGFsbCBwZW5kaW5nIGV2ZW50cywgYW5kIHNldCBhY3RpdmUgaW5kaWNhdG9yIG1hc2suICovCisJb3V0dyhBY2tJbnRyIHwgSW50TGF0Y2ggfCBUeEF2YWlsYWJsZSB8IFJ4RWFybHkgfCBJbnRSZXEsCisJCSBpb2FkZHIgKyBFTDNfQ01EKTsKKwlvdXR3KFNldEludHJFbmIgfCBJbnRMYXRjaCB8IFR4QXZhaWxhYmxlIHwgUnhDb21wbGV0ZSB8IFN0YXRzRnVsbAorCQkgfCBBZGFwdGVyRmFpbHVyZSB8IFJ4RWFybHksIGlvYWRkciArIEVMM19DTUQpOworfQorCitzdGF0aWMgaW50IGVsM19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJZGV2X2xpbmtfdCAqbGluayA9ICZscC0+bGluazsKKworCWlmICghREVWX09LKGxpbmspKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwlsaW5rLT5vcGVuKys7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkKKwl0YzU3NF9yZXNldChkZXYpOworCWxwLT5tZWRpYS5mdW5jdGlvbiA9ICZtZWRpYV9jaGVjazsKKwlscC0+bWVkaWEuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJbHAtPm1lZGlhLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJYWRkX3RpbWVyKCZscC0+bWVkaWEpOworCQorCURFQlVHKDIsICIlczogb3BlbmVkLCBzdGF0dXMgJTQuNHguXG4iLAorCQkgIGRldi0+bmFtZSwgaW53KGRldi0+YmFzZV9hZGRyICsgRUwzX1NUQVRVUykpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbDNfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJCisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogVHJhbnNtaXQgdGltZWQgb3V0IVxuIiwgZGV2LT5uYW1lKTsKKwlkdW1wX3N0YXR1cyhkZXYpOworCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkvKiBJc3N1ZSBUWF9SRVNFVCBhbmQgVFhfU1RBUlQgY29tbWFuZHMuICovCisJdGM1NzRfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFR4UmVzZXQpOworCW91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgcG9wX3R4X3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisgICAgCisJLyogQ2xlYXIgdGhlIFR4IHN0YXR1cyBzdGFjay4gKi8KKwlmb3IgKGkgPSAzMjsgaSA+IDA7IGktLSkgeworCQl1X2NoYXIgdHhfc3RhdHVzID0gaW5iKGlvYWRkciArIFR4U3RhdHVzKTsKKwkJaWYgKCEodHhfc3RhdHVzICYgMHg4NCkpCisJCQlicmVhazsKKwkJLyogcmVzZXQgdHJhbnNtaXR0ZXIgb24gamFiYmVyIGVycm9yIG9yIHVuZGVycnVuICovCisJCWlmICh0eF9zdGF0dXMgJiAweDMwKQorCQkJdGM1NzRfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFR4UmVzZXQpOworCQlpZiAodHhfc3RhdHVzICYgMHgzOCkgeworCQkJREVCVUcoMSwgIiVzOiB0cmFuc21pdCBlcnJvcjogc3RhdHVzIDB4JTAyeFxuIiwKKwkJCQkgIGRldi0+bmFtZSwgdHhfc3RhdHVzKTsKKwkJCW91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCQkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCX0KKwkJb3V0YigweDAwLCBpb2FkZHIgKyBUeFN0YXR1cyk7IC8qIFBvcCB0aGUgc3RhdHVzIHN0YWNrLiAqLworCX0KK30KKworc3RhdGljIGludCBlbDNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURFQlVHKDMsICIlczogZWwzX3N0YXJ0X3htaXQobGVuZ3RoID0gJWxkKSBjYWxsZWQsICIKKwkJICAic3RhdHVzICU0LjR4LlxuIiwgZGV2LT5uYW1lLCAobG9uZylza2ItPmxlbiwKKwkJICBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCW91dHcoc2tiLT5sZW4sIGlvYWRkciArIFRYX0ZJRk8pOworCW91dHcoMCwgaW9hZGRyICsgVFhfRklGTyk7CisJb3V0c2woaW9hZGRyICsgVFhfRklGTywgc2tiLT5kYXRhLCAoc2tiLT5sZW4rMyk+PjIpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwkvKiBUeEZyZWUgYXBwZWFycyBvbmx5IGluIFdpbmRvdyAxLCBub3Qgb2Zmc2V0IDB4MWMuICovCisJaWYgKGludyhpb2FkZHIgKyBUeEZyZWUpIDw9IDE1MzYpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkvKiBJbnRlcnJ1cHQgdXMgd2hlbiB0aGUgRklGTyBoYXMgcm9vbSBmb3IgbWF4LXNpemVkIHBhY2tldC4gCisJCSAgIFRoZSB0aHJlc2hvbGQgaXMgaW4gdW5pdHMgb2YgZHdvcmRzLiAqLworCQlvdXR3KFNldFR4VGhyZXNob2xkICsgKDE1MzY+PjIpLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwl9CisKKwlwb3BfdHhfc3RhdHVzKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisvKiBUaGUgRUwzIGludGVycnVwdCBoYW5kbGVyLiAqLworc3RhdGljIGlycXJldHVybl90IGVsM19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlraW9fYWRkcl90IGlvYWRkcjsKKwl1bnNpZ25lZCBzdGF0dXM7CisJaW50IHdvcmtfYnVkZ2V0ID0gbWF4X2ludGVycnVwdF93b3JrOworCWludCBoYW5kbGVkID0gMDsKKworCWlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJcmV0dXJuIElSUV9OT05FOworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJREVCVUcoMywgIiVzOiBpbnRlcnJ1cHQsIHN0YXR1cyAlNC40eC5cbiIsCisJCSAgZGV2LT5uYW1lLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOworCisJc3Bpbl9sb2NrKCZscC0+d2luZG93X2xvY2spOworCQorCXdoaWxlICgoc3RhdHVzID0gaW53KGlvYWRkciArIEVMM19TVEFUVVMpKSAmCisJCSAgIChJbnRMYXRjaCB8IFJ4Q29tcGxldGUgfCBSeEVhcmx5IHwgU3RhdHNGdWxsKSkgeworCQlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikgfHwKKwkJCSgoc3RhdHVzICYgMHhlMDAwKSAhPSAweDIwMDApKSB7CisJCQlERUJVRygxLCAiJXM6IEludGVycnVwdCBmcm9tIGRlYWQgY2FyZFxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaGFuZGxlZCA9IDE7CisKKwkJaWYgKHN0YXR1cyAmIFJ4Q29tcGxldGUpCisJCQl3b3JrX2J1ZGdldCA9IGVsM19yeChkZXYsIHdvcmtfYnVkZ2V0KTsKKworCQlpZiAoc3RhdHVzICYgVHhBdmFpbGFibGUpIHsKKwkJCURFQlVHKDMsICIgIFRYIHJvb20gYml0IHdhcyBoYW5kbGVkLlxuIik7CisJCQkvKiBUaGVyZSdzIHJvb20gaW4gdGhlIEZJRk8gZm9yIGEgZnVsbC1zaXplZCBwYWNrZXQuICovCisJCQlvdXR3KEFja0ludHIgfCBUeEF2YWlsYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKworCQlpZiAoc3RhdHVzICYgVHhDb21wbGV0ZSkKKwkJCXBvcF90eF9zdGF0dXMoZGV2KTsKKworCQlpZiAoc3RhdHVzICYgKEFkYXB0ZXJGYWlsdXJlIHwgUnhFYXJseSB8IFN0YXRzRnVsbCkpIHsKKwkJCS8qIEhhbmRsZSBhbGwgdW5jb21tb24gaW50ZXJydXB0cy4gKi8KKwkJCWlmIChzdGF0dXMgJiBTdGF0c0Z1bGwpCisJCQkJdXBkYXRlX3N0YXRzKGRldik7CisJCQlpZiAoc3RhdHVzICYgUnhFYXJseSkgeworCQkJCXdvcmtfYnVkZ2V0ID0gZWwzX3J4KGRldiwgd29ya19idWRnZXQpOworCQkJCW91dHcoQWNrSW50ciB8IFJ4RWFybHksIGlvYWRkciArIEVMM19DTUQpOworCQkJfQorCQkJaWYgKHN0YXR1cyAmIEFkYXB0ZXJGYWlsdXJlKSB7CisJCQkJdTE2IGZpZm9fZGlhZzsKKwkJCQlFTDNXSU5ET1coNCk7CisJCQkJZmlmb19kaWFnID0gaW53KGlvYWRkciArIFduNF9GSUZPRGlhZyk7CisJCQkJRUwzV0lORE9XKDEpOworCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGFkYXB0ZXIgZmFpbHVyZSwgRklGTyBkaWFnbm9zdGljIgorCQkJCQkgICAiIHJlZ2lzdGVyICUwNHguXG4iLCBkZXYtPm5hbWUsIGZpZm9fZGlhZyk7CisJCQkJaWYgKGZpZm9fZGlhZyAmIDB4MDQwMCkgeworCQkJCQkvKiBUeCBvdmVycnVuICovCisJCQkJCXRjNTc0X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBUeFJlc2V0KTsKKwkJCQkJb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQkJfQorCQkJCWlmIChmaWZvX2RpYWcgJiAweDIwMDApIHsKKwkJCQkJLyogUnggdW5kZXJydW4gKi8KKwkJCQkJdGM1NzRfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFJ4UmVzZXQpOworCQkJCQlzZXRfcnhfbW9kZShkZXYpOworCQkJCQlvdXR3KFJ4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCQl9CisJCQkJb3V0dyhBY2tJbnRyIHwgQWRhcHRlckZhaWx1cmUsIGlvYWRkciArIEVMM19DTUQpOworCQkJfQorCQl9CisKKwkJaWYgKC0td29ya19idWRnZXQgPCAwKSB7CisJCQlERUJVRygwLCAiJXM6IFRvbyBtdWNoIHdvcmsgaW4gaW50ZXJydXB0LCAiCisJCQkJICAic3RhdHVzICU0LjR4LlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJLyogQ2xlYXIgYWxsIGludGVycnVwdHMgKi8KKwkJCW91dHcoQWNrSW50ciB8IDB4RkYsIGlvYWRkciArIEVMM19DTUQpOworCQkJYnJlYWs7CisJCX0KKwkJLyogQWNrbm93bGVkZ2UgdGhlIElSUS4gKi8KKwkJb3V0dyhBY2tJbnRyIHwgSW50UmVxIHwgSW50TGF0Y2gsIGlvYWRkciArIEVMM19DTUQpOworCX0KKworCURFQlVHKDMsICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIHN0YXR1cyAlNC40eC5cbiIsCisJCSAgZGV2LT5uYW1lLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOworCQkgIAorCXNwaW5fdW5sb2NrKCZscC0+d2luZG93X2xvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKgorICAgIFRoaXMgdGltZXIgc2VydmVzIHR3byBwdXJwb3NlczogdG8gY2hlY2sgZm9yIG1pc3NlZCBpbnRlcnJ1cHRzCisJKGFuZCBhcyBhIGxhc3QgcmVzb3J0LCBwb2xsIHRoZSBOSUMgZm9yIGV2ZW50cyksIGFuZCB0byBtb25pdG9yCisJdGhlIE1JSSwgcmVwb3J0aW5nIGNoYW5nZXMgaW4gY2FibGUgc3RhdHVzLgorKi8KK3N0YXRpYyB2b2lkIG1lZGlhX2NoZWNrKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgYXJnOworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCAvKiBjYWJsZSwgKi8gbWVkaWEsIHBhcnRuZXI7CisKKwlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCWdvdG8gcmVzY2hlZHVsZTsKKwkKKwkvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHQgd2l0aCBleHBpcmVkIGxhdGVuY3kgdGltZXI6IHdpdGgKKwkgICB0aGlzLCB3ZSBjYW4gbGltcCBhbG9uZyBldmVuIGlmIHRoZSBpbnRlcnJ1cHQgaXMgYmxvY2tlZCAqLworCWlmICgoaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgSW50TGF0Y2gpICYmIChpbmIoaW9hZGRyICsgVGltZXIpID09IDB4ZmYpKSB7CisJCWlmICghbHAtPmZhc3RfcG9sbCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnRlcnJ1cHQocykgZHJvcHBlZCFcbiIsIGRldi0+bmFtZSk7CisJCWVsM19pbnRlcnJ1cHQoZGV2LT5pcnEsIGxwLCBOVUxMKTsKKwkJbHAtPmZhc3RfcG9sbCA9IEhaOworCX0KKwlpZiAobHAtPmZhc3RfcG9sbCkgeworCQlscC0+ZmFzdF9wb2xsLS07CisJCWxwLT5tZWRpYS5leHBpcmVzID0gamlmZmllcyArIDIqSFovMTAwOworCQlhZGRfdGltZXIoJmxwLT5tZWRpYSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJRUwzV0lORE9XKDQpOworCW1lZGlhID0gbWRpb19yZWFkKGlvYWRkciwgbHAtPnBoeXMsIDEpOworCXBhcnRuZXIgPSBtZGlvX3JlYWQoaW9hZGRyLCBscC0+cGh5cywgNSk7CisJRUwzV0lORE9XKDEpOworCQorCWlmIChtZWRpYSAhPSBscC0+bWVkaWFfc3RhdHVzKSB7CisJCWlmICgobWVkaWEgXiBscC0+bWVkaWFfc3RhdHVzKSAmIDB4MDAwNCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBsaW5rIGJlYXRcbiIsIGRldi0+bmFtZSwKKwkJCQkgICAobHAtPm1lZGlhX3N0YXR1cyAmIDB4MDAwNCkgPyAibG9zdCIgOiAiZm91bmQiKTsKKwkJaWYgKChtZWRpYSBeIGxwLT5tZWRpYV9zdGF0dXMpICYgMHgwMDIwKSB7CisJCQlscC0+cGFydG5lciA9IDA7CisJCQlpZiAobHAtPm1lZGlhX3N0YXR1cyAmIDB4MDAyMCkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBhdXRvbmVnb3RpYXRpb24gcmVzdGFydGVkXG4iLAorCQkJCQkgICBkZXYtPm5hbWUpOworCQkJfSBlbHNlIGlmIChwYXJ0bmVyKSB7CisJCQkJcGFydG5lciAmPSBscC0+YWR2ZXJ0aXNpbmc7CisJCQkJbHAtPnBhcnRuZXIgPSBwYXJ0bmVyOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBhdXRvbmVnb3RpYXRpb24gY29tcGxldGU6ICIKKwkJCQkJICAgIiVzYmFzZVQtJWNEIHNlbGVjdGVkXG4iLCBkZXYtPm5hbWUsCisJCQkJCSAgICgocGFydG5lciAmIDB4MDE4MCkgPyAiMTAwIiA6ICIxMCIpLAorCQkJCQkgICAoKHBhcnRuZXIgJiAweDAxNDApID8gJ0YnIDogJ0gnKSk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHBhcnRuZXIgZGlkIG5vdCBhdXRvbmVnb3RpYXRlXG4iLAorCQkJCQkgICBkZXYtPm5hbWUpOworCQkJfQorCisJCQlFTDNXSU5ET1coMyk7CisJCQlvdXRiKChwYXJ0bmVyICYgMHgwMTQwID8gMHgyMCA6IDApIHwKKwkJCQkgKGRldi0+bXR1ID4gMTUwMCA/IDB4NDAgOiAwKSwgaW9hZGRyICsgV24zX01BQ19DdHJsKTsKKwkJCUVMM1dJTkRPVygxKTsKKworCQl9CisJCWlmIChtZWRpYSAmIDB4MDAxMCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiByZW1vdGUgZmF1bHQgZGV0ZWN0ZWRcbiIsCisJCQkJICAgZGV2LT5uYW1lKTsKKwkJaWYgKG1lZGlhICYgMHgwMDAyKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGphYmJlciBkZXRlY3RlZFxuIiwgZGV2LT5uYW1lKTsKKwkJbHAtPm1lZGlhX3N0YXR1cyA9IG1lZGlhOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKworcmVzY2hlZHVsZToKKwlscC0+bWVkaWEuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwlhZGRfdGltZXIoJmxwLT5tZWRpYSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWwzX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCQl1cGRhdGVfc3RhdHMoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKiAgVXBkYXRlIHN0YXRpc3RpY3MuCisJU3VwcmlzaW5nbHkgdGhpcyBuZWVkIG5vdCBiZSBydW4gc2luZ2xlLXRocmVhZGVkLCBidXQgaXQgZWZmZWN0aXZlbHkgaXMuCisJVGhlIGNvdW50ZXJzIGNsZWFyIHdoZW4gcmVhZCwgc28gdGhlIGFkZHMgbXVzdCBtZXJlbHkgYmUgYXRvbWljLgorICovCitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXU4IHJ4LCB0eCwgdXA7CisKKwlERUJVRygyLCAiJXM6IHVwZGF0aW5nIHRoZSBzdGF0aXN0aWNzLlxuIiwgZGV2LT5uYW1lKTsKKworCWlmIChpbncoaW9hZGRyK0VMM19TVEFUVVMpID09IDB4ZmZmZikgLyogTm8gY2FyZC4gKi8KKwkJcmV0dXJuOworCQkKKwkvKiBVbmxpa2UgdGhlIDNjNTA5IHdlIG5lZWQgbm90IHR1cm4gb2ZmIHN0YXRzIHVwZGF0ZXMgd2hpbGUgcmVhZGluZy4gKi8KKwkvKiBTd2l0Y2ggdG8gdGhlIHN0YXRzIHdpbmRvdywgYW5kIHJlYWQgZXZlcnl0aGluZy4gKi8KKwlFTDNXSU5ET1coNik7CisJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzIAkJKz0gaW5iKGlvYWRkciArIDApOworCWxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzCQkrPSBpbmIoaW9hZGRyICsgMSk7CisJLyogTXVsdGlwbGUgY29sbGlzaW9ucy4gKi8JICAgCWluYihpb2FkZHIgKyAyKTsKKwlscC0+c3RhdHMuY29sbGlzaW9ucwkJCSs9IGluYihpb2FkZHIgKyAzKTsKKwlscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycwkJKz0gaW5iKGlvYWRkciArIDQpOworCWxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycwkJKz0gaW5iKGlvYWRkciArIDUpOworCWxwLT5zdGF0cy50eF9wYWNrZXRzCQkJKz0gaW5iKGlvYWRkciArIDYpOworCXVwCQkgCQkJID0gaW5iKGlvYWRkciArIDkpOworCWxwLT5zdGF0cy50eF9wYWNrZXRzCQkJKz0gKHVwJjB4MzApIDw8IDQ7CisJLyogUnggcGFja2V0cyAgICovCQkJICAgaW5iKGlvYWRkciArIDcpOworCS8qIFR4IGRlZmVycmFscyAqLwkJCSAgIGluYihpb2FkZHIgKyA4KTsKKwlyeAkJIAkJCSA9IGludyhpb2FkZHIgKyAxMCk7CisJdHgJCQkJCSA9IGludyhpb2FkZHIgKyAxMik7CisKKwlFTDNXSU5ET1coNCk7CisJLyogQmFkU1NEICovCQkJCSAgIGluYihpb2FkZHIgKyAxMik7CisJdXAJCQkJCSA9IGluYihpb2FkZHIgKyAxMyk7CisKKwlscC0+c3RhdHMudHhfYnl0ZXMgCQkJKz0gdHggKyAoKHVwICYgMHhmMCkgPDwgMTIpOworCisJRUwzV0lORE9XKDEpOworfQorCitzdGF0aWMgaW50IGVsM19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgd29ya2xpbWl0KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc2hvcnQgcnhfc3RhdHVzOworCQorCURFQlVHKDMsICIlczogaW4gcnhfcGFja2V0KCksIHN0YXR1cyAlNC40eCwgcnhfc3RhdHVzICU0LjR4LlxuIiwKKwkJICBkZXYtPm5hbWUsIGludyhpb2FkZHIrRUwzX1NUQVRVUyksIGludyhpb2FkZHIrUnhTdGF0dXMpKTsKKwl3aGlsZSAoISgocnhfc3RhdHVzID0gaW53KGlvYWRkciArIFJ4U3RhdHVzKSkgJiAweDgwMDApICYmCisJCSAgICgtLXdvcmtsaW1pdCA+PSAwKSkgeworCQlpZiAocnhfc3RhdHVzICYgMHg0MDAwKSB7IC8qIEVycm9yLCB1cGRhdGUgc3RhdHMuICovCisJCQlzaG9ydCBlcnJvciA9IHJ4X3N0YXR1cyAmIDB4MzgwMDsKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCXN3aXRjaCAoZXJyb3IpIHsKKwkJCWNhc2UgMHgwMDAwOglscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsgYnJlYWs7CisJCQljYXNlIDB4MDgwMDoJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsgYnJlYWs7CisJCQljYXNlIDB4MTAwMDoJbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOyBicmVhazsKKwkJCWNhc2UgMHgxODAwOglscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOyBicmVhazsKKwkJCWNhc2UgMHgyMDAwOglscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7IGJyZWFrOworCQkJY2FzZSAweDI4MDA6CWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7IGJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJc2hvcnQgcGt0X2xlbiA9IHJ4X3N0YXR1cyAmIDB4N2ZmOworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzUpOworCisJCQlERUJVRygzLCAiICBSZWNlaXZpbmcgcGFja2V0IHNpemUgJWQgc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkgIHBrdF9sZW4sIHJ4X3N0YXR1cyk7CisJCQlpZiAoc2tiICE9IE5VTEwpIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQkJCWluc2woaW9hZGRyK1JYX0ZJRk8sIHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwKKwkJCQkJCSgocGt0X2xlbiszKT4+MikpOworCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQl9IGVsc2UgeworCQkJCURFQlVHKDEsICIlczogY291bGRuJ3QgYWxsb2NhdGUgYSBza19idWZmIG9mIgorCQkJCQkgICIgc2l6ZSAlZC5cbiIsIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCX0KKwkJfQorCQl0YzU3NF93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgUnhEaXNjYXJkKTsKKwl9CisKKwlyZXR1cm4gd29ya2xpbWl0OworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsICIzYzU3NF9jcyIpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorfTsKKworLyogUHJvdmlkZSBpb2N0bCgpIGNhbGxzIHRvIGV4YW1pbmUgdGhlIE1JSSB4Y3ZyIHN0YXRlLiAqLworc3RhdGljIGludCBlbDNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXUxNiAqZGF0YSA9ICh1MTYgKikmcnEtPmlmcl9pZnJ1OworCWludCBwaHkgPSBscC0+cGh5cyAmIDB4MWY7CisKKwlERUJVRygyLCAiJXM6IEluIGlvY3QoJS0uNnMsICUjNC40eCkgJTQuNHggJTQuNHggJTQuNHggJTQuNHguXG4iLAorCQkgIGRldi0+bmFtZSwgcnEtPmlmcl9pZnJuLmlmcm5fbmFtZSwgY21kLAorCQkgIGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10pOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIFBIWSBpbiB1c2UuICovCisJCWRhdGFbMF0gPSBwaHk7CisJY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgdGhlIHNwZWNpZmllZCBNSUkgcmVnaXN0ZXIuICovCisJCXsKKwkJCWludCBzYXZlZF93aW5kb3c7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJCQlzYXZlZF93aW5kb3cgPSBpbncoaW9hZGRyICsgRUwzX0NNRCkgPj4gMTM7CisJCQlFTDNXSU5ET1coNCk7CisJCQlkYXRhWzNdID0gbWRpb19yZWFkKGlvYWRkciwgZGF0YVswXSAmIDB4MWYsIGRhdGFbMV0gJiAweDFmKTsKKwkJCUVMM1dJTkRPVyhzYXZlZF93aW5kb3cpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSB0aGUgc3BlY2lmaWVkIE1JSSByZWdpc3RlciAqLworCQl7CisJCQlpbnQgc2F2ZWRfd2luZG93OworICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwkJCXNhdmVkX3dpbmRvdyA9IGludyhpb2FkZHIgKyBFTDNfQ01EKSA+PiAxMzsKKwkJCUVMM1dJTkRPVyg0KTsKKwkJCW1kaW9fd3JpdGUoaW9hZGRyLCBkYXRhWzBdICYgMHgxZiwgZGF0YVsxXSAmIDB4MWYsIGRhdGFbMl0pOworCQkJRUwzV0lORE9XKHNhdmVkX3dpbmRvdyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAwOworCQl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworLyogVGhlIE9kaWUgY2hpcCBoYXMgYSA2NCBiaW4gbXVsdGljYXN0IGZpbHRlciwgYnV0IHRoZSBiaXQgbGF5b3V0IGlzIG5vdAorICAgZG9jdW1lbnRlZC4gIFVudGlsIGl0IGlzIHdlIHJldmVydCB0byByZWNlaXZpbmcgYWxsIG11bHRpY2FzdCBmcmFtZXMgd2hlbgorICAgYW55IG11bHRpY2FzdCByZWNlcHRpb24gaXMgZGVzaXJlZC4KKyAgIE5vdGU6IE15IG90aGVyIGRyaXZlcnMgZW1pdCBhIGxvZyBtZXNzYWdlIHdoZW5ldmVyIHByb21pc2N1b3VzIG1vZGUgaXMKKyAgIGVudGVyZWQgdG8gaGVscCBkZXRlY3QgcGFzc3dvcmQgc25pZmZlcnMuICBUaGlzIGlzIGxlc3MgZGVzaXJhYmxlIG9uCisgICB0eXBpY2FsIFBDIGNhcmQgbWFjaGluZXMsIHNvIHdlIG9taXQgdGhlIG1lc3NhZ2UuCisgICAqLworCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQlvdXR3KFNldFJ4RmlsdGVyIHwgUnhTdGF0aW9uIHwgUnhNdWx0aWNhc3QgfCBSeEJyb2FkY2FzdCB8IFJ4UHJvbSwKKwkJCSBpb2FkZHIgKyBFTDNfQ01EKTsKKwllbHNlIGlmIChkZXYtPm1jX2NvdW50IHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkKKwkJb3V0dyhTZXRSeEZpbHRlcnxSeFN0YXRpb258UnhNdWx0aWNhc3R8UnhCcm9hZGNhc3QsIGlvYWRkciArIEVMM19DTUQpOworCWVsc2UKKwkJb3V0dyhTZXRSeEZpbHRlciB8IFJ4U3RhdGlvbiB8IFJ4QnJvYWRjYXN0LCBpb2FkZHIgKyBFTDNfQ01EKTsKK30KKworc3RhdGljIGludCBlbDNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisKKwlERUJVRygyLCAiJXM6IHNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKwkKKwlpZiAoREVWX09LKGxpbmspKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJLyogVHVybiBvZmYgc3RhdGlzdGljcyBBU0FQLiAgV2UgdXBkYXRlIGxwLT5zdGF0cyBiZWxvdy4gKi8KKwkJb3V0dyhTdGF0c0Rpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCQkKKwkJLyogRGlzYWJsZSB0aGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyLiAqLworCQlvdXR3KFJ4RGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCW91dHcoVHhEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCisJCS8qIE5vdGU6IFN3aXRjaGluZyB0byB3aW5kb3cgMCBtYXkgZGlzYWJsZSB0aGUgSVJRLiAqLworCQlFTDNXSU5ET1coMCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwkJdXBkYXRlX3N0YXRzKGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCX0KKworCWxpbmstPm9wZW4tLTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJZGVsX3RpbWVyX3N5bmMoJmxwLT5tZWRpYSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHRjNTc0X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gIjNjNTc0X2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gdGM1NzRfYXR0YWNoLAorCS5kZXRhY2gJCT0gdGM1NzRfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF90YzU3NCh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZ0YzU3NF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF90YzU3NCh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmdGM1NzRfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdGM1NzQpOworbW9kdWxlX2V4aXQoZXhpdF90YzU3NCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU4OV9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YWJkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYwpAQCAtMCwwICsxLDEwODEgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQSBQQ01DSUEgZXRoZXJuZXQgZHJpdmVyIGZvciB0aGUgM2NvbSAzYzU4OSBjYXJkLgorICAgIAorICAgIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcyAtLSBkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorCisgICAgM2M1ODlfY3MuYyAxLjE2MiAyMDAxLzEwLzEzIDAwOjA4OjUwCisKKyAgICBUaGUgbmV0d29yayBkcml2ZXIgY29kZSBpcyBiYXNlZCBvbiBEb25hbGQgQmVja2VyJ3MgM2M1ODkgY29kZToKKyAgICAKKyAgICBXcml0dGVuIDE5OTQgYnkgRG9uYWxkIEJlY2tlci4KKyAgICBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kCisgICAgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgICAgRG9uYWxkIEJlY2tlciBtYXkgYmUgcmVhY2hlZCBhdCBiZWNrZXJAc2N5bGQuY29tCisgICAgCisgICAgVXBkYXRlZCBmb3IgMi41LnggYnkgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgRFJWX05BTUUJIjNjNTg5X2NzIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4xNjItYWMiCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyogVG8gbWluaW1pemUgdGhlIHNpemUgb2YgdGhlIGRyaXZlciBzb3VyY2UgSSBvbmx5IGRlZmluZSBvcGVyYXRpbmcKKyAgIGNvbnN0YW50cyBpZiB0aGV5IGFyZSB1c2VkIHNldmVyYWwgdGltZXMuICBZb3UnbGwgbmVlZCB0aGUgbWFudWFsCisgICBpZiB5b3Ugd2FudCB0byB1bmRlcnN0YW5kIGRyaXZlciBkZXRhaWxzLiAqLworLyogT2Zmc2V0cyBmcm9tIGJhc2UgSS9PIGFkZHJlc3MuICovCisjZGVmaW5lIEVMM19EQVRBCTB4MDAKKyNkZWZpbmUgRUwzX1RJTUVSCTB4MGEKKyNkZWZpbmUgRUwzX0NNRAkJMHgwZQorI2RlZmluZSBFTDNfU1RBVFVTCTB4MGUKKworI2RlZmluZSBFRVBST01fUkVBRAkweDAwODAKKyNkZWZpbmUgRUVQUk9NX0JVU1kJMHg4MDAwCisKKyNkZWZpbmUgRUwzV0lORE9XKHdpbl9udW0pIG91dHcoU2VsZWN0V2luZG93ICsgKHdpbl9udW0pLCBpb2FkZHIgKyBFTDNfQ01EKQorCisvKiBUaGUgdG9wIGZpdmUgYml0cyB3cml0dGVuIHRvIEVMM19DTUQgYXJlIGEgY29tbWFuZCwgdGhlIGxvd2VyCisgICAxMSBiaXRzIGFyZSB0aGUgcGFyYW1ldGVyLCBpZiBhcHBsaWNhYmxlLiAqLworZW51bSBjNTA5Y21kIHsKKyAgICBUb3RhbFJlc2V0ID0gMDw8MTEsIFNlbGVjdFdpbmRvdyA9IDE8PDExLCBTdGFydENvYXggPSAyPDwxMSwKKyAgICBSeERpc2FibGUgPSAzPDwxMSwgUnhFbmFibGUgPSA0PDwxMSwgUnhSZXNldCA9IDU8PDExLCBSeERpc2NhcmQgPSA4PDwxMSwKKyAgICBUeEVuYWJsZSA9IDk8PDExLCBUeERpc2FibGUgPSAxMDw8MTEsIFR4UmVzZXQgPSAxMTw8MTEsCisgICAgRmFrZUludHIgPSAxMjw8MTEsIEFja0ludHIgPSAxMzw8MTEsIFNldEludHJFbmIgPSAxNDw8MTEsCisgICAgU2V0U3RhdHVzRW5iID0gMTU8PDExLCBTZXRSeEZpbHRlciA9IDE2PDwxMSwgU2V0UnhUaHJlc2hvbGQgPSAxNzw8MTEsCisgICAgU2V0VHhUaHJlc2hvbGQgPSAxODw8MTEsIFNldFR4U3RhcnQgPSAxOTw8MTEsIFN0YXRzRW5hYmxlID0gMjE8PDExLAorICAgIFN0YXRzRGlzYWJsZSA9IDIyPDwxMSwgU3RvcENvYXggPSAyMzw8MTEsCit9OworCitlbnVtIGM1MDlzdGF0dXMgeworICAgIEludExhdGNoID0gMHgwMDAxLCBBZGFwdGVyRmFpbHVyZSA9IDB4MDAwMiwgVHhDb21wbGV0ZSA9IDB4MDAwNCwKKyAgICBUeEF2YWlsYWJsZSA9IDB4MDAwOCwgUnhDb21wbGV0ZSA9IDB4MDAxMCwgUnhFYXJseSA9IDB4MDAyMCwKKyAgICBJbnRSZXEgPSAweDAwNDAsIFN0YXRzRnVsbCA9IDB4MDA4MCwgQ21kQnVzeSA9IDB4MTAwMAorfTsKKworLyogVGhlIFNldFJ4RmlsdGVyIGNvbW1hbmQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGNsYXNzZXM6ICovCitlbnVtIFJ4RmlsdGVyIHsKKyAgICBSeFN0YXRpb24gPSAxLCBSeE11bHRpY2FzdCA9IDIsIFJ4QnJvYWRjYXN0ID0gNCwgUnhQcm9tID0gOAorfTsKKworLyogUmVnaXN0ZXIgd2luZG93IDEgb2Zmc2V0cywgdGhlIHdpbmRvdyB1c2VkIGluIG5vcm1hbCBvcGVyYXRpb24uICovCisjZGVmaW5lIFRYX0ZJRk8JCTB4MDAKKyNkZWZpbmUgUlhfRklGTwkJMHgwMAorI2RlZmluZSBSWF9TVEFUVVMgCTB4MDgKKyNkZWZpbmUgVFhfU1RBVFVTIAkweDBCCisjZGVmaW5lIFRYX0ZSRUUJCTB4MEMJLyogUmVtYWluaW5nIGZyZWUgYnl0ZXMgaW4gVHggYnVmZmVyLiAqLworCisjZGVmaW5lIFdOMF9JUlEJCTB4MDgJLyogV2luZG93IDA6IFNldCBJUlEgbGluZSBpbiBiaXRzIDEyLTE1LiAqLworI2RlZmluZSBXTjRfTUVESUEJMHgwQQkvKiBXaW5kb3cgNDogVmFyaW91cyB0cmFuc2N2ci9tZWRpYSBiaXRzLiAqLworI2RlZmluZSBNRURJQV9UUAkweDAwQzAJLyogRW5hYmxlIGxpbmsgYmVhdCBhbmQgamFiYmVyIGZvciAxMGJhc2VULiAqLworI2RlZmluZSBNRURJQV9MRUQJMHgwMDAxCS8qIEVuYWJsZSBsaW5rIGxpZ2h0IG9uIDNDNTg5RSBjYXJkcy4gKi8KKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIFR4IGh1bmcgKi8KKyNkZWZpbmUgVFhfVElNRU9VVAkoKDQwMCpIWikvMTAwMCkKKworc3RydWN0IGVsM19wcml2YXRlIHsKKyAgICBkZXZfbGlua190CQlsaW5rOworICAgIGRldl9ub2RlX3QgCQlub2RlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworICAgIC8qIEZvciB0cmFuc2NlaXZlciBtb25pdG9yaW5nICovCisgICAgc3RydWN0IHRpbWVyX2xpc3QJbWVkaWE7CisgICAgdTE2CQkJbWVkaWFfc3RhdHVzOworICAgIHUxNgkJCWZhc3RfcG9sbDsKKyAgICB1bnNpZ25lZCBsb25nCWxhc3RfaXJxOworICAgIHNwaW5sb2NrX3QJCWxvY2s7Cit9OworCitzdGF0aWMgY2hhciAqaWZfbmFtZXNbXSA9IHsgImF1dG8iLCAiMTBiYXNlVCIsICIxMGJhc2UyIiwgIkFVSSIgfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEhpbmRzIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiM0NvbSAzYzU4OSBzZXJpZXMgUENNQ0lBIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIElOVF9NT0RVTEVfUEFSTShuLCB2KSBzdGF0aWMgaW50IG4gPSB2OyBtb2R1bGVfcGFyYW0obiwgaW50LCAwKQorCisvKiBTcGVjaWFsIGhvb2sgZm9yIHNldHRpbmcgaWZfcG9ydCB3aGVuIG1vZHVsZSBpcyBsb2FkZWQgKi8KK0lOVF9NT0RVTEVfUEFSTShpZl9wb3J0LCAwKTsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworSU5UX01PRFVMRV9QQVJNKHBjX2RlYnVnLCBQQ01DSUFfREVCVUcpOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKQorc3RhdGljIGNoYXIgKnZlcnNpb24gPQorRFJWX05BTUUgIi5jICIgRFJWX1ZFUlNJT04gIiAyMDAxLzEwLzEzIDAwOjA4OjUwIChEYXZpZCBIaW5kcykiOworI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgdGM1ODlfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgdGM1ODlfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgdGM1ODlfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKKworc3RhdGljIHUxNiByZWFkX2VlcHJvbShraW9fYWRkcl90IGlvYWRkciwgaW50IGluZGV4KTsKK3N0YXRpYyB2b2lkIHRjNTg5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbWVkaWFfY2hlY2sodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBlbDNfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKTsKK3N0YXRpYyBpbnQgZWwzX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsM19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGVsM19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVsM19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsM19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZWwzX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWwzX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAiM2M1ODlfY3MiOworCitzdGF0aWMgZGV2X2xpbmtfdCAqdGM1ODlfYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgdGM1ODlfZGV0YWNoKGRldl9saW5rX3QgKik7CisKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICB0YzU4OV9hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworICAgIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZAorICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBkZXZfbGlua190ICp0YzU4OV9hdHRhY2godm9pZCkKK3sKKyAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwOworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBpbnQgcmV0OworCisgICAgREVCVUcoMCwgIjNjNTg5X2F0dGFjaCgpXG4iKTsKKyAgICAKKyAgICAvKiBDcmVhdGUgbmV3IGV0aGVybmV0IGRldmljZSAqLworICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZWwzX3ByaXZhdGUpKTsKKyAgICBpZiAoIWRldikKKwkgcmV0dXJuIE5VTEw7CisgICAgbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGxpbmsgPSAmbHAtPmxpbms7CisgICAgbGluay0+cHJpdiA9IGRldjsKKworICAgIHNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTY7CisgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisgICAgbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworICAgIGxpbmstPmlycS5IYW5kbGVyID0gJmVsM19pbnRlcnJ1cHQ7CisgICAgbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IDUwOworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAxOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOworICAgIAorICAgIC8qIFRoZSBFTDMtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZWwzX3N0YXJ0X3htaXQ7CisgICAgZGV2LT5zZXRfY29uZmlnID0gJmVsM19jb25maWc7CisgICAgZGV2LT5nZXRfc3RhdHMgPSAmZWwzX2dldF9zdGF0czsKKyAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisgICAgZGV2LT5vcGVuID0gJmVsM19vcGVuOworICAgIGRldi0+c3RvcCA9ICZlbDNfY2xvc2U7CisjaWZkZWYgSEFWRV9UWF9USU1FT1VUCisgICAgZGV2LT50eF90aW1lb3V0ID0gZWwzX3R4X3RpbWVvdXQ7CisgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjZW5kaWYKKyAgICBTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbmV0ZGV2X2V0aHRvb2xfb3BzKTsKKworICAgIC8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKKyAgICBkZXZfbGlzdCA9IGxpbms7CisgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKyAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9CisJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmdGM1ODlfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwl0YzU4OV9kZXRhY2gobGluayk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorICAgIAorICAgIHJldHVybiBsaW5rOworfSAvKiB0YzU4OV9hdHRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGlzIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIi4gIFRoZSBkZXZpY2UgaXMgZGUtcmVnaXN0ZXJlZAorICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YQorICAgIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCisgICAgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbGVhc2VkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgdGM1ODlfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworICAgIAorICAgIERFQlVHKDAsICIzYzU4OV9kZXRhY2goMHglcClcbiIsIGxpbmspOworICAgIAorICAgIC8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwlpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworICAgIGlmICgqbGlua3AgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBpZiAobGluay0+ZGV2KQorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKyAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCXRjNTg5X3JlbGVhc2UobGluayk7CisgICAgCisgICAgaWYgKGxpbmstPmhhbmRsZSkKKwlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKyAgICAKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBiaXRzICovCisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBmcmVlX25ldGRldihkZXYpOworfSAvKiB0YzU4OV9kZXRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICB0YzU4OV9jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKKyAgICBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAgICBldGhlcm5ldCBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisgICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCB0YzU4OV9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICB1MTYgYnVmWzMyXSwgKnBoeXNfYWRkcjsKKyAgICBpbnQgbGFzdF9mbiwgbGFzdF9yZXQsIGksIGosIG11bHRpID0gMCwgZmlmbzsKKyAgICBraW9fYWRkcl90IGlvYWRkcjsKKyAgICBjaGFyICpyYW1fc3BsaXRbXSA9IHsiNTozIiwgIjM6MSIsICIxOjEiLCAiMzo1In07CisgICAgCisgICAgREVCVUcoMCwgIjNjNTg5X2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgICBwaHlzX2FkZHIgPSAodTE2ICopZGV2LT5kZXZfYWRkcjsKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworICAgIAorICAgIC8qIElzIHRoaXMgYSAzYzU2Mj8gKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOworICAgIGlmICgocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykgJiYKKwkocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSkgeworCWlmIChsZTE2X3RvX2NwdShidWZbMF0pICE9IE1BTkZJRF8zQ09NKQorCSAgICBwcmludGsoS0VSTl9JTkZPICIzYzU4OV9jczogaG1tbSwgaXMgdGhpcyByZWFsbHkgYSAiCisJCSAgICIzQ29tIGNhcmQ/P1xuIik7CisJbXVsdGkgPSAobGUxNl90b19jcHUoYnVmWzFdKSA9PSBQUk9ESURfM0NPTV8zQzU2Mik7CisgICAgfQorICAgIAorICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIC8qIEZvciB0aGUgM2M1NjIsIHRoZSBiYXNlIGFkZHJlc3MgbXVzdCBiZSB4eDAwLXh4N2YgKi8KKyAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDE2OworICAgIGZvciAoaSA9IGogPSAwOyBqIDwgMHg0MDA7IGogKz0gMHgxMCkgeworCWlmIChtdWx0aSAmJiAoaiAmIDB4ODApKSBjb250aW51ZTsKKwlsaW5rLT5pby5CYXNlUG9ydDEgPSBqIF4gMHgzMDA7CisJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKKyAgICB9CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdElPLCBpKTsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOworICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKwkKKyAgICBkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKyAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgICBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBFTDNXSU5ET1coMCk7CisKKyAgICAvKiBUaGUgM2M1ODkgaGFzIGFuIGV4dHJhIEVFUFJPTSBmb3IgY29uZmlndXJhdGlvbiBpbmZvLCBpbmNsdWRpbmcKKyAgICAgICB0aGUgaGFyZHdhcmUgYWRkcmVzcy4gIFRoZSAzYzU2MiBwdXRzIHRoZSBhZGRyZXNzIGluIHRoZSBDSVMuICovCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gMHg4ODsKKyAgICBpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykgeworCXBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSk7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkgICAgcGh5c19hZGRyW2ldID0gaHRvbnMoYnVmW2ldKTsKKyAgICB9IGVsc2UgeworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJICAgIHBoeXNfYWRkcltpXSA9IGh0b25zKHJlYWRfZWVwcm9tKGlvYWRkciwgaSkpOworCWlmIChwaHlzX2FkZHJbMF0gPT0gMHg2MDYwKSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAiM2M1ODlfY3M6IElPIHBvcnQgY29uZmxpY3QgYXQgMHglMDNseCIKKwkJICAgIi0weCUwM2x4XG4iLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5iYXNlX2FkZHIrMTUpOworCSAgICBnb3RvIGZhaWxlZDsKKwl9CisgICAgfQorCisgICAgLyogVGhlIGFkZHJlc3MgYW5kIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYXJlbid0IGxvYWRlZCBmcm9tCisgICAgICAgdGhlIEVFUFJPTSBhbmQgKm11c3QqIGJlIHNldCB0byAwIGFuZCBJUlEzIGZvciB0aGUgUENNQ0lBIHZlcnNpb24uICovCisgICAgb3V0dygweDNmMDAsIGlvYWRkciArIDgpOworICAgIGZpZm8gPSBpbmwoaW9hZGRyKTsKKworICAgIC8qIFRoZSBpZl9wb3J0IHN5bWJvbCBjYW4gYmUgc2V0IHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgKi8KKyAgICBpZiAoKGlmX3BvcnQgPj0gMCkgJiYgKGlmX3BvcnQgPD0gMykpCisJZGV2LT5pZl9wb3J0ID0gaWZfcG9ydDsKKyAgICBlbHNlCisJcHJpbnRrKEtFUk5fRVJSICIzYzU4OV9jczogaW52YWxpZCBpZl9wb3J0IHJlcXVlc3RlZFxuIik7CisgICAgCisgICAgbGluay0+ZGV2ID0gJmxwLT5ub2RlOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKworICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisJcHJpbnRrKEtFUk5fRVJSICIzYzU4OV9jczogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKwlsaW5rLT5kZXYgPSBOVUxMOworCWdvdG8gZmFpbGVkOworICAgIH0KKworICAgIHN0cmNweShscC0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiAzQ29tIDNjJXMsIGlvICUjM2x4LCBpcnEgJWQsIGh3X2FkZHIgIiwKKwkgICBkZXYtPm5hbWUsIChtdWx0aSA/ICI1NjIiIDogIjU4OSIpLCBkZXYtPmJhc2VfYWRkciwKKwkgICBkZXYtPmlycSk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlwcmludGsoIiUwMlglcyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaTw1KSA/ICI6IiA6ICJcbiIpKTsKKyAgICBwcmludGsoS0VSTl9JTkZPICIgICVkSyBGSUZPIHNwbGl0ICVzIFJ4OlR4LCAlcyB4Y3ZyXG4iLAorCSAgIChmaWZvICYgNykgPyAzMiA6IDgsIHJhbV9zcGxpdFsoZmlmbyA+PiAxNikgJiAzXSwKKwkgICBpZl9uYW1lc1tkZXYtPmlmX3BvcnRdKTsKKyAgICByZXR1cm47CisKK2NzX2ZhaWxlZDoKKyAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKK2ZhaWxlZDoKKyAgICB0YzU4OV9yZWxlYXNlKGxpbmspOworICAgIHJldHVybjsKKyAgICAKK30gLyogdGM1ODlfY29uZmlnICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIHRjNTg5X3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorICAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHRjNTg5X3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBERUJVRygwLCAiM2M1ODlfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisgICAgCisgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKyAgICAKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAgICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuICBBIENBUkRfUkVNT1ZBTCBldmVudAorICAgIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgICAgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKyAgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHRjNTg5X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJICAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKyAgICBkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgCisgICAgREVCVUcoMSwgIjNjNTg5X2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKyAgICAKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICAgIG5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCXRjNTg5X2NvbmZpZyhsaW5rKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIGlmIChsaW5rLT5vcGVuKQorCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJICAgIGlmIChsaW5rLT5vcGVuKSB7CisJCXRjNTg5X3Jlc2V0KGRldik7CisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkgICAgfQorCX0KKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIHRjNTg5X2V2ZW50ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICBVc2UgdGhpcyBmb3IgY29tbWFuZHMgdGhhdCBtYXkgdGFrZSB0aW1lIHRvIGZpbmlzaAorKi8KK3N0YXRpYyB2b2lkIHRjNTg5X3dhaXRfZm9yX2NvbXBsZXRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNtZCkKK3sKKyAgICBpbnQgaSA9IDEwMDsKKyAgICBvdXR3KGNtZCwgZGV2LT5iYXNlX2FkZHIgKyBFTDNfQ01EKTsKKyAgICB3aGlsZSAoLS1pID4gMCkKKwlpZiAoIShpbncoZGV2LT5iYXNlX2FkZHIgKyBFTDNfU1RBVFVTKSAmIDB4MTAwMCkpIGJyZWFrOworICAgIGlmIChpID09IDApCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvbW1hbmQgMHglMDR4IGRpZCBub3QgY29tcGxldGUhXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGNtZCk7Cit9CisKKy8qCisgIFJlYWQgYSB3b3JkIGZyb20gdGhlIEVFUFJPTSB1c2luZyB0aGUgcmVndWxhciBFRVBST00gYWNjZXNzIHJlZ2lzdGVyLgorICBBc3N1bWUgdGhhdCB3ZSBhcmUgaW4gcmVnaXN0ZXIgd2luZG93IHplcm8uCisqLworc3RhdGljIHUxNiByZWFkX2VlcHJvbShraW9fYWRkcl90IGlvYWRkciwgaW50IGluZGV4KQoreworICAgIGludCBpOworICAgIG91dHcoRUVQUk9NX1JFQUQgKyBpbmRleCwgaW9hZGRyICsgMTApOworICAgIC8qIFJlYWRpbmcgdGhlIGVlcHJvbSB0YWtlcyAxNjIgdXMgKi8KKyAgICBmb3IgKGkgPSAxNjIwOyBpID49IDA7IGktLSkKKwlpZiAoKGludyhpb2FkZHIgKyAxMCkgJiBFRVBST01fQlVTWSkgPT0gMCkKKwkgICAgYnJlYWs7CisgICAgcmV0dXJuIGludyhpb2FkZHIgKyAxMik7Cit9CisKKy8qCisgIFNldCB0cmFuc2NlaXZlciB0eXBlLCBwZXJoYXBzIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHdoYXQgdGhlIHVzZXIKKyAgc3BlY2lmaWVkIGluIGRldi0+aWZfcG9ydC4KKyovCitzdGF0aWMgdm9pZCB0YzU4OV9zZXRfeGN2cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaWZfcG9ydCkKK3sKKyAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIAorICAgIEVMM1dJTkRPVygwKTsKKyAgICBzd2l0Y2ggKGlmX3BvcnQpIHsKKyAgICBjYXNlIDA6IGNhc2UgMTogb3V0dygwLCBpb2FkZHIgKyA2KTsgYnJlYWs7CisgICAgY2FzZSAyOiBvdXR3KDM8PDE0LCBpb2FkZHIgKyA2KTsgYnJlYWs7CisgICAgY2FzZSAzOiBvdXR3KDE8PDE0LCBpb2FkZHIgKyA2KTsgYnJlYWs7CisgICAgfQorICAgIC8qIE9uIFBDTUNJQSwgdGhpcyBqdXN0IHR1cm5zIG9uIHRoZSBMRUQgKi8KKyAgICBvdXR3KChpZl9wb3J0ID09IDIpID8gU3RhcnRDb2F4IDogU3RvcENvYXgsIGlvYWRkciArIEVMM19DTUQpOworICAgIC8qIDEwYmFzZVQgaW50ZXJmYWNlLCBlbmFibGUgbGluayBiZWF0IGFuZCBqYWJiZXIgY2hlY2suICovCisgICAgRUwzV0lORE9XKDQpOworICAgIG91dHcoTUVESUFfTEVEIHwgKChpZl9wb3J0IDwgMikgPyBNRURJQV9UUCA6IDApLCBpb2FkZHIgKyBXTjRfTUVESUEpOworICAgIEVMM1dJTkRPVygxKTsKKyAgICBpZiAoaWZfcG9ydCA9PSAyKQorCWxwLT5tZWRpYV9zdGF0dXMgPSAoKGRldi0+aWZfcG9ydCA9PSAwKSA/IDB4ODAwMCA6IDB4NDAwMCk7CisgICAgZWxzZQorCWxwLT5tZWRpYV9zdGF0dXMgPSAoKGRldi0+aWZfcG9ydCA9PSAwKSA/IDB4NDAxMCA6IDB4ODgwMCk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBFTDNXSU5ET1coMSk7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiICBpcnEgc3RhdHVzICUwNHgsIHJ4IHN0YXR1cyAlMDR4LCB0eCBzdGF0dXMgIgorCSAgICIlMDJ4ICB0eCBmcmVlICUwNHhcbiIsIGludyhpb2FkZHIrRUwzX1NUQVRVUyksCisJICAgaW53KGlvYWRkcitSWF9TVEFUVVMpLCBpbmIoaW9hZGRyK1RYX1NUQVRVUyksCisJICAgaW53KGlvYWRkcitUWF9GUkVFKSk7CisgICAgRUwzV0lORE9XKDQpOworICAgIHByaW50ayhLRVJOX0lORk8gIiAgZGlhZ25vc3RpY3M6IGZpZm8gJTA0eCBuZXQgJTA0eCBldGhlcm5ldCAlMDR4IgorCSAgICIgbWVkaWEgJTA0eFxuIiwgaW53KGlvYWRkcisweDA0KSwgaW53KGlvYWRkcisweDA2KSwKKwkgICBpbncoaW9hZGRyKzB4MDgpLCBpbncoaW9hZGRyKzB4MGEpKTsKKyAgICBFTDNXSU5ET1coMSk7Cit9CisKKy8qIFJlc2V0IGFuZCByZXN0b3JlIGFsbCBvZiB0aGUgM2M1ODkgcmVnaXN0ZXJzLiAqLworc3RhdGljIHZvaWQgdGM1ODlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpOworICAgIAorICAgIEVMM1dJTkRPVygwKTsKKyAgICBvdXR3KDB4MDAwMSwgaW9hZGRyICsgNCk7CQkJLyogQWN0aXZhdGUgYm9hcmQuICovIAorICAgIG91dHcoMHgzZjAwLCBpb2FkZHIgKyA4KTsJCQkvKiBTZXQgdGhlIElSUSBsaW5lLiAqLworICAgIAorICAgIC8qIFNldCB0aGUgc3RhdGlvbiBhZGRyZXNzIGluIHdpbmRvdyAyLiAqLworICAgIEVMM1dJTkRPVygyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCW91dGIoZGV2LT5kZXZfYWRkcltpXSwgaW9hZGRyICsgaSk7CisKKyAgICB0YzU4OV9zZXRfeGN2cihkZXYsIGRldi0+aWZfcG9ydCk7CisgICAgCisgICAgLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCBjbGVhciBhbGwgc3RhdHMgYnkgcmVhZGluZy4gKi8KKyAgICBvdXR3KFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisgICAgRUwzV0lORE9XKDYpOworICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisJaW5iKGlvYWRkcitpKTsKKyAgICBpbncoaW9hZGRyICsgMTApOworICAgIGludyhpb2FkZHIgKyAxMik7CisgICAgCisgICAgLyogU3dpdGNoIHRvIHJlZ2lzdGVyIHNldCAxIGZvciBub3JtYWwgdXNlLiAqLworICAgIEVMM1dJTkRPVygxKTsKKworICAgIC8qIEFjY2VwdCBiLWNhc3QgYW5kIHBoeXMgYWRkciBvbmx5LiAqLworICAgIG91dHcoU2V0UnhGaWx0ZXIgfCBSeFN0YXRpb24gfCBSeEJyb2FkY2FzdCwgaW9hZGRyICsgRUwzX0NNRCk7CisgICAgb3V0dyhTdGF0c0VuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIFR1cm4gb24gc3RhdGlzdGljcy4gKi8KKyAgICBvdXR3KFJ4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsgLyogRW5hYmxlIHRoZSByZWNlaXZlci4gKi8KKyAgICBvdXR3KFR4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsgLyogRW5hYmxlIHRyYW5zbWl0dGVyLiAqLworICAgIC8qIEFsbG93IHN0YXR1cyBiaXRzIHRvIGJlIHNlZW4uICovCisgICAgb3V0dyhTZXRTdGF0dXNFbmIgfCAweGZmLCBpb2FkZHIgKyBFTDNfQ01EKTsKKyAgICAvKiBBY2sgYWxsIHBlbmRpbmcgZXZlbnRzLCBhbmQgc2V0IGFjdGl2ZSBpbmRpY2F0b3IgbWFzay4gKi8KKyAgICBvdXR3KEFja0ludHIgfCBJbnRMYXRjaCB8IFR4QXZhaWxhYmxlIHwgUnhFYXJseSB8IEludFJlcSwKKwkgaW9hZGRyICsgRUwzX0NNRCk7CisgICAgb3V0dyhTZXRJbnRyRW5iIHwgSW50TGF0Y2ggfCBUeEF2YWlsYWJsZSB8IFJ4Q29tcGxldGUgfCBTdGF0c0Z1bGwKKwkgfCBBZGFwdGVyRmFpbHVyZSwgaW9hZGRyICsgRUwzX0NNRCk7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlBDTUNJQSAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKK30KKworI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIHUzMiBuZXRkZXZfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHBjX2RlYnVnOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwlwY19kZWJ1ZyA9IGxldmVsOworfQorI2VuZGlmIC8qIFBDTUNJQV9ERUJVRyAqLworCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorI2lmZGVmIFBDTUNJQV9ERUJVRworCS5nZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IG5ldGRldl9zZXRfbXNnbGV2ZWwsCisjZW5kaWYgLyogUENNQ0lBX0RFQlVHICovCit9OworCitzdGF0aWMgaW50IGVsM19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApCit7CisgICAgaWYgKChtYXAtPnBvcnQgIT0gKHVfY2hhcikoLTEpKSAmJiAobWFwLT5wb3J0ICE9IGRldi0+aWZfcG9ydCkpIHsKKwlpZiAobWFwLT5wb3J0IDw9IDMpIHsKKwkgICAgZGV2LT5pZl9wb3J0ID0gbWFwLT5wb3J0OworCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogc3dpdGNoZWQgdG8gJXMgcG9ydFxuIiwKKwkJICAgZGV2LT5uYW1lLCBpZl9uYW1lc1tkZXYtPmlmX3BvcnRdKTsKKwkgICAgdGM1ODlfc2V0X3hjdnIoZGV2LCBkZXYtPmlmX3BvcnQpOworCX0gZWxzZQorCSAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWwzX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJmxwLT5saW5rOworICAgIAorICAgIGlmICghREVWX09LKGxpbmspKQorCXJldHVybiAtRU5PREVWOworCisgICAgbGluay0+b3BlbisrOworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgCisgICAgdGM1ODlfcmVzZXQoZGV2KTsKKyAgICBpbml0X3RpbWVyKCZscC0+bWVkaWEpOworICAgIGxwLT5tZWRpYS5mdW5jdGlvbiA9ICZtZWRpYV9jaGVjazsKKyAgICBscC0+bWVkaWEuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisgICAgbHAtPm1lZGlhLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisgICAgYWRkX3RpbWVyKCZscC0+bWVkaWEpOworCisgICAgREVCVUcoMSwgIiVzOiBvcGVuZWQsIHN0YXR1cyAlNC40eC5cbiIsCisJICBkZXYtPm5hbWUsIGludyhkZXYtPmJhc2VfYWRkciArIEVMM19TVEFUVVMpKTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZWwzX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIAorICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQhXG4iLCBkZXYtPm5hbWUpOworICAgIGR1bXBfc3RhdHVzKGRldik7CisgICAgbHAtPnN0YXRzLnR4X2Vycm9ycysrOworICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworICAgIC8qIElzc3VlIFRYX1JFU0VUIGFuZCBUWF9TVEFSVCBjb21tYW5kcy4gKi8KKyAgICB0YzU4OV93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgVHhSZXNldCk7CisgICAgb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBwb3BfdHhfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaTsKKyAgICAKKyAgICAvKiBDbGVhciB0aGUgVHggc3RhdHVzIHN0YWNrLiAqLworICAgIGZvciAoaSA9IDMyOyBpID4gMDsgaS0tKSB7CisJdV9jaGFyIHR4X3N0YXR1cyA9IGluYihpb2FkZHIgKyBUWF9TVEFUVVMpOworCWlmICghKHR4X3N0YXR1cyAmIDB4ODQpKSBicmVhazsKKwkvKiByZXNldCB0cmFuc21pdHRlciBvbiBqYWJiZXIgZXJyb3Igb3IgdW5kZXJydW4gKi8KKwlpZiAodHhfc3RhdHVzICYgMHgzMCkKKwkgICAgdGM1ODlfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFR4UmVzZXQpOworCWlmICh0eF9zdGF0dXMgJiAweDM4KSB7CisJICAgIERFQlVHKDEsICIlczogdHJhbnNtaXQgZXJyb3I6IHN0YXR1cyAweCUwMnhcbiIsCisJCSAgZGV2LT5uYW1lLCB0eF9zdGF0dXMpOworCSAgICBvdXR3KFR4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkgICAgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJfQorCW91dGIoMHgwMCwgaW9hZGRyICsgVFhfU1RBVFVTKTsgLyogUG9wIHRoZSBzdGF0dXMgc3RhY2suICovCisgICAgfQorfQorCitzdGF0aWMgaW50IGVsM19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgREVCVUcoMywgIiVzOiBlbDNfc3RhcnRfeG1pdChsZW5ndGggPSAlbGQpIGNhbGxlZCwgIgorCSAgInN0YXR1cyAlNC40eC5cbiIsIGRldi0+bmFtZSwgKGxvbmcpc2tiLT5sZW4sCisJICBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOworCisgICAgcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKyAgICAvKiBQdXQgb3V0IHRoZSBkb3VibGV3b3JkIGhlYWRlci4uLiAqLworICAgIG91dHcoc2tiLT5sZW4sIGlvYWRkciArIFRYX0ZJRk8pOworICAgIG91dHcoMHgwMCwgaW9hZGRyICsgVFhfRklGTyk7CisgICAgLyogLi4uIGFuZCB0aGUgcGFja2V0IHJvdW5kZWQgdG8gYSBkb3VibGV3b3JkLiAqLworICAgIG91dHNsKGlvYWRkciArIFRYX0ZJRk8sIHNrYi0+ZGF0YSwgKHNrYi0+bGVuICsgMykgPj4gMik7CisKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICBpZiAoaW53KGlvYWRkciArIFRYX0ZSRUUpIDw9IDE1MzYpIHsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJLyogSW50ZXJydXB0IHVzIHdoZW4gdGhlIEZJRk8gaGFzIHJvb20gZm9yIG1heC1zaXplZCBwYWNrZXQuICovCisJb3V0dyhTZXRUeFRocmVzaG9sZCArIDE1MzYsIGlvYWRkciArIEVMM19DTUQpOworICAgIH0KKworICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKyAgICBwb3BfdHhfc3RhdHVzKGRldik7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBFTDMgaW50ZXJydXB0IGhhbmRsZXIuICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZWwzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyOworICAgIF9fdTE2IHN0YXR1czsKKyAgICBpbnQgaSA9IDAsIGhhbmRsZWQgPSAxOworICAgIAorICAgIGlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwlyZXR1cm4gSVJRX05PTkU7CisKKyAgICBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIERFQlVHKDMsICIlczogaW50ZXJydXB0LCBzdGF0dXMgJTQuNHguXG4iLAorCSAgZGV2LT5uYW1lLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOworCisgICAgc3Bpbl9sb2NrKCZscC0+bG9jayk7ICAgIAorICAgIHdoaWxlICgoc3RhdHVzID0gaW53KGlvYWRkciArIEVMM19TVEFUVVMpKSAmCisJKEludExhdGNoIHwgUnhDb21wbGV0ZSB8IFN0YXRzRnVsbCkpIHsKKwlpZiAoKHN0YXR1cyAmIDB4ZTAwMCkgIT0gMHgyMDAwKSB7CisJICAgIERFQlVHKDEsICIlczogaW50ZXJydXB0IGZyb20gZGVhZCBjYXJkXG4iLCBkZXYtPm5hbWUpOworCSAgICBoYW5kbGVkID0gMDsKKwkgICAgYnJlYWs7CisJfQorCQorCWlmIChzdGF0dXMgJiBSeENvbXBsZXRlKQorCSAgICBlbDNfcngoZGV2KTsKKwkKKwlpZiAoc3RhdHVzICYgVHhBdmFpbGFibGUpIHsKKwkgICAgREVCVUcoMywgIiAgICBUWCByb29tIGJpdCB3YXMgaGFuZGxlZC5cbiIpOworCSAgICAvKiBUaGVyZSdzIHJvb20gaW4gdGhlIEZJRk8gZm9yIGEgZnVsbC1zaXplZCBwYWNrZXQuICovCisJICAgIG91dHcoQWNrSW50ciB8IFR4QXZhaWxhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKwkKKwlpZiAoc3RhdHVzICYgVHhDb21wbGV0ZSkKKwkgICAgcG9wX3R4X3N0YXR1cyhkZXYpOworCisJaWYgKHN0YXR1cyAmIChBZGFwdGVyRmFpbHVyZSB8IFJ4RWFybHkgfCBTdGF0c0Z1bGwpKSB7CisJICAgIC8qIEhhbmRsZSBhbGwgdW5jb21tb24gaW50ZXJydXB0cy4gKi8KKwkgICAgaWYgKHN0YXR1cyAmIFN0YXRzRnVsbCkJCS8qIEVtcHR5IHN0YXRpc3RpY3MuICovCisJCXVwZGF0ZV9zdGF0cyhkZXYpOworCSAgICBpZiAoc3RhdHVzICYgUnhFYXJseSkgewkJLyogUnggZWFybHkgaXMgdW51c2VkLiAqLworCQllbDNfcngoZGV2KTsKKwkJb3V0dyhBY2tJbnRyIHwgUnhFYXJseSwgaW9hZGRyICsgRUwzX0NNRCk7CisJICAgIH0KKwkgICAgaWYgKHN0YXR1cyAmIEFkYXB0ZXJGYWlsdXJlKSB7CisJCXUxNiBmaWZvX2RpYWc7CisJCUVMM1dJTkRPVyg0KTsKKwkJZmlmb19kaWFnID0gaW53KGlvYWRkciArIDQpOworCQlFTDNXSU5ET1coMSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBhZGFwdGVyIGZhaWx1cmUsIEZJRk8gZGlhZ25vc3RpYyIKKwkJICAgICAgICIgcmVnaXN0ZXIgJTA0eC5cbiIsIGRldi0+bmFtZSwgZmlmb19kaWFnKTsKKwkJaWYgKGZpZm9fZGlhZyAmIDB4MDQwMCkgeworCQkgICAgLyogVHggb3ZlcnJ1biAqLworCQkgICAgdGM1ODlfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFR4UmVzZXQpOworCQkgICAgb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCX0KKwkJaWYgKGZpZm9fZGlhZyAmIDB4MjAwMCkgeworCQkgICAgLyogUnggdW5kZXJydW4gKi8KKwkJICAgIHRjNTg5X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBSeFJlc2V0KTsKKwkJICAgIHNldF9tdWx0aWNhc3RfbGlzdChkZXYpOworCQkgICAgb3V0dyhSeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCX0KKwkJb3V0dyhBY2tJbnRyIHwgQWRhcHRlckZhaWx1cmUsIGlvYWRkciArIEVMM19DTUQpOworCSAgICB9CisJfQorCQorCWlmICgrK2kgPiAxMCkgeworCSAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBpbmZpbml0ZSBsb29wIGluIGludGVycnVwdCwgIgorCQkgICAic3RhdHVzICU0LjR4LlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCSAgICAvKiBDbGVhciBhbGwgaW50ZXJydXB0cyAqLworCSAgICBvdXR3KEFja0ludHIgfCAweEZGLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkgICAgYnJlYWs7CisJfQorCS8qIEFja25vd2xlZGdlIHRoZSBJUlEuICovCisJb3V0dyhBY2tJbnRyIHwgSW50UmVxIHwgSW50TGF0Y2gsIGlvYWRkciArIEVMM19DTUQpOworICAgIH0KKworICAgIGxwLT5sYXN0X2lycSA9IGppZmZpZXM7CisgICAgc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsgICAgCisgICAgREVCVUcoMywgIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwKKwkgIGRldi0+bmFtZSwgaW53KGlvYWRkciArIEVMM19TVEFUVVMpKTsKKyAgICByZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIHZvaWQgbWVkaWFfY2hlY2sodW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKShhcmcpOworICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdTE2IG1lZGlhLCBlcnJzOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIGdvdG8gcmVzY2hlZHVsZTsKKworICAgIEVMM1dJTkRPVygxKTsKKyAgICAvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHQgd2l0aCBleHBpcmVkIGxhdGVuY3kgdGltZXI6IHdpdGgKKyAgICAgICB0aGlzLCB3ZSBjYW4gbGltcCBhbG9uZyBldmVuIGlmIHRoZSBpbnRlcnJ1cHQgaXMgYmxvY2tlZCAqLworICAgIGlmICgoaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgSW50TGF0Y2gpICYmCisJKGluYihpb2FkZHIgKyBFTDNfVElNRVIpID09IDB4ZmYpKSB7CisJaWYgKCFscC0+ZmFzdF9wb2xsKQorCSAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogaW50ZXJydXB0KHMpIGRyb3BwZWQhXG4iLCBkZXYtPm5hbWUpOworCWVsM19pbnRlcnJ1cHQoZGV2LT5pcnEsIGxwLCBOVUxMKTsKKwlscC0+ZmFzdF9wb2xsID0gSFo7CisgICAgfQorICAgIGlmIChscC0+ZmFzdF9wb2xsKSB7CisJbHAtPmZhc3RfcG9sbC0tOworCWxwLT5tZWRpYS5leHBpcmVzID0gamlmZmllcyArIEhaLzEwMDsKKwlhZGRfdGltZXIoJmxwLT5tZWRpYSk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIGxwLT5sb2NrIGd1YXJkcyB0aGUgRUwzIHdpbmRvdy4gV2luZG93IHNob3VsZCBhbHdheXMgYmUgMSBleGNlcHQKKyAgICAgICB3aGVuIHRoZSBsb2NrIGlzIGhlbGQgKi8KKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsgICAgCisgICAgRUwzV0lORE9XKDQpOworICAgIG1lZGlhID0gaW53KGlvYWRkcitXTjRfTUVESUEpICYgMHhjODEwOworCisgICAgLyogSWdub3JlIGNvbGxpc2lvbnMgdW5sZXNzIHdlJ3ZlIGhhZCBubyBpcnEncyByZWNlbnRseSAqLworICAgIGlmIChqaWZmaWVzIC0gbHAtPmxhc3RfaXJxIDwgSFopIHsKKwltZWRpYSAmPSB+MHgwMDEwOworICAgIH0gZWxzZSB7CisJLyogVHJ5IGhhcmRlciB0byBkZXRlY3QgY2FycmllciBlcnJvcnMgKi8KKwlFTDNXSU5ET1coNik7CisJb3V0dyhTdGF0c0Rpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCWVycnMgPSBpbmIoaW9hZGRyICsgMCk7CisJb3V0dyhTdGF0c0VuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzICs9IGVycnM7CisJaWYgKGVycnMgfHwgKGxwLT5tZWRpYV9zdGF0dXMgJiAweDAwMTApKSBtZWRpYSB8PSAweDAwMTA7CisgICAgfQorCisgICAgaWYgKG1lZGlhICE9IGxwLT5tZWRpYV9zdGF0dXMpIHsKKwlpZiAoKG1lZGlhICYgbHAtPm1lZGlhX3N0YXR1cyAmIDB4ODAwMCkgJiYKKwkgICAgKChscC0+bWVkaWFfc3RhdHVzIF4gbWVkaWEpICYgMHgwODAwKSkKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGxpbmsgYmVhdFxuIiwgZGV2LT5uYW1lLAorCQkgICAobHAtPm1lZGlhX3N0YXR1cyAmIDB4MDgwMCA/ICJsb3N0IiA6ICJmb3VuZCIpKTsKKwllbHNlIGlmICgobWVkaWEgJiBscC0+bWVkaWFfc3RhdHVzICYgMHg0MDAwKSAmJgorCQkgKChscC0+bWVkaWFfc3RhdHVzIF4gbWVkaWEpICYgMHgwMDEwKSkKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvYXggY2FibGUgJXNcbiIsIGRldi0+bmFtZSwKKwkJICAgKGxwLT5tZWRpYV9zdGF0dXMgJiAweDAwMTAgPyAib2siIDogInByb2JsZW0iKSk7CisJaWYgKGRldi0+aWZfcG9ydCA9PSAwKSB7CisJICAgIGlmIChtZWRpYSAmIDB4ODAwMCkgeworCQlpZiAobWVkaWEgJiAweDA4MDApCisJCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogZmxpcHBlZCB0byAxMGJhc2VUXG4iLAorCQkJICAgZGV2LT5uYW1lKTsKKwkJZWxzZQorCQkgICAgdGM1ODlfc2V0X3hjdnIoZGV2LCAyKTsKKwkgICAgfSBlbHNlIGlmIChtZWRpYSAmIDB4NDAwMCkgeworCQlpZiAobWVkaWEgJiAweDAwMTApCisJCSAgICB0YzU4OV9zZXRfeGN2cihkZXYsIDEpOworCQllbHNlCisJCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogZmxpcHBlZCB0byAxMGJhc2UyXG4iLAorCQkJICAgZGV2LT5uYW1lKTsKKwkgICAgfQorCX0KKwlscC0+bWVkaWFfc3RhdHVzID0gbWVkaWE7CisgICAgfQorICAgIAorICAgIEVMM1dJTkRPVygxKTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOyAgICAKKworcmVzY2hlZHVsZToKKyAgICBscC0+bWVkaWEuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKyAgICBhZGRfdGltZXIoJmxwLT5tZWRpYSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWwzX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZscC0+bGluazsKKworICAgIGlmIChERVZfT0sobGluaykpIHsKKyAgICAJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJdXBkYXRlX3N0YXRzKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICB9CisgICAgcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qCisgIFVwZGF0ZSBzdGF0aXN0aWNzLiAgV2UgY2hhbmdlIHRvIHJlZ2lzdGVyIHdpbmRvdyA2LCBzbyB0aGlzIHNob3VsZCBiZSBydW4KKyAgc2luZ2xlLXRocmVhZGVkIGlmIHRoZSBkZXZpY2UgaXMgYWN0aXZlLiBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlIGEgcmFyZQorICBvcGVyYXRpb24sIGFuZCBpdCdzIHNpbXBsZXIgZm9yIHRoZSByZXN0IG9mIHRoZSBkcml2ZXIgdG8gYXNzdW1lIHRoYXQKKyAgd2luZG93IDEgaXMgYWx3YXlzIHZhbGlkIHJhdGhlciB0aGFuIHVzZSBhIHNwZWNpYWwgd2luZG93LXN0YXRlIHZhcmlhYmxlLgorICAKKyAgQ2FsbGVyIG11c3QgaG9sZCB0aGUgbG9jayBmb3IgdGhpcworKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBERUJVRygyLCAiJXM6IHVwZGF0aW5nIHRoZSBzdGF0aXN0aWNzLlxuIiwgZGV2LT5uYW1lKTsKKyAgICAvKiBUdXJuIG9mZiBzdGF0aXN0aWNzIHVwZGF0ZXMgd2hpbGUgcmVhZGluZy4gKi8KKyAgICBvdXR3KFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisgICAgLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCByZWFkIGV2ZXJ5dGhpbmcuICovCisgICAgRUwzV0lORE9XKDYpOworICAgIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyAJKz0gaW5iKGlvYWRkciArIDApOworICAgIGxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzCSs9IGluYihpb2FkZHIgKyAxKTsKKyAgICAvKiBNdWx0aXBsZSBjb2xsaXNpb25zLiAqLwkgICAJaW5iKGlvYWRkciArIDIpOworICAgIGxwLT5zdGF0cy5jb2xsaXNpb25zCQkrPSBpbmIoaW9hZGRyICsgMyk7CisgICAgbHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMJCSs9IGluYihpb2FkZHIgKyA0KTsKKyAgICBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMJCSs9IGluYihpb2FkZHIgKyA1KTsKKyAgICBscC0+c3RhdHMudHhfcGFja2V0cwkJKz0gaW5iKGlvYWRkciArIDYpOworICAgIC8qIFJ4IHBhY2tldHMgICAqLwkJCWluYihpb2FkZHIgKyA3KTsKKyAgICAvKiBUeCBkZWZlcnJhbHMgKi8JCQlpbmIoaW9hZGRyICsgOCk7CisgICAgLyogUnggb2N0ZXRzICovCQkJaW53KGlvYWRkciArIDEwKTsKKyAgICAvKiBUeCBvY3RldHMgKi8JCQlpbncoaW9hZGRyICsgMTIpOworICAgIAorICAgIC8qIEJhY2sgdG8gd2luZG93IDEsIGFuZCB0dXJuIHN0YXRpc3RpY3MgYmFjayBvbi4gKi8KKyAgICBFTDNXSU5ET1coMSk7CisgICAgb3V0dyhTdGF0c0VuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7Cit9CisKK3N0YXRpYyBpbnQgZWwzX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgd29ya2xpbWl0ID0gMzI7CisgICAgc2hvcnQgcnhfc3RhdHVzOworICAgIAorICAgIERFQlVHKDMsICIlczogaW4gcnhfcGFja2V0KCksIHN0YXR1cyAlNC40eCwgcnhfc3RhdHVzICU0LjR4LlxuIiwKKwkgIGRldi0+bmFtZSwgaW53KGlvYWRkcitFTDNfU1RBVFVTKSwgaW53KGlvYWRkcitSWF9TVEFUVVMpKTsKKyAgICB3aGlsZSAoISgocnhfc3RhdHVzID0gaW53KGlvYWRkciArIFJYX1NUQVRVUykpICYgMHg4MDAwKSAmJgorCSAgICgtLXdvcmtsaW1pdCA+PSAwKSkgeworCWlmIChyeF9zdGF0dXMgJiAweDQwMDApIHsgLyogRXJyb3IsIHVwZGF0ZSBzdGF0cy4gKi8KKwkgICAgc2hvcnQgZXJyb3IgPSByeF9zdGF0dXMgJiAweDM4MDA7CisJICAgIGxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkgICAgc3dpdGNoIChlcnJvcikgeworCSAgICBjYXNlIDB4MDAwMDoJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7IGJyZWFrOworCSAgICBjYXNlIDB4MDgwMDoJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsgYnJlYWs7CisJICAgIGNhc2UgMHgxMDAwOglscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7IGJyZWFrOworCSAgICBjYXNlIDB4MTgwMDoJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsgYnJlYWs7CisJICAgIGNhc2UgMHgyMDAwOglscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7IGJyZWFrOworCSAgICBjYXNlIDB4MjgwMDoJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsgYnJlYWs7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBzaG9ydCBwa3RfbGVuID0gcnhfc3RhdHVzICYgMHg3ZmY7CisJICAgIHN0cnVjdCBza19idWZmICpza2I7CisJICAgIAorCSAgICBza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rNSk7CisJICAgIAorCSAgICBERUJVRygzLCAiICAgIFJlY2VpdmluZyBwYWNrZXQgc2l6ZSAlZCBzdGF0dXMgJTQuNHguXG4iLAorCQkgIHBrdF9sZW4sIHJ4X3N0YXR1cyk7CisJICAgIGlmIChza2IgIT0gTlVMTCkgeworCQlza2ItPmRldiA9IGRldjsKKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJaW5zbChpb2FkZHIrUlhfRklGTywgc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJKHBrdF9sZW4rMyk+PjIpOworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQluZXRpZl9yeChza2IpOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkgICAgfSBlbHNlIHsKKwkJREVCVUcoMSwgIiVzOiBjb3VsZG4ndCBhbGxvY2F0ZSBhIHNrX2J1ZmYgb2YiCisJCSAgICAgICIgc2l6ZSAlZC5cbiIsIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJICAgIH0KKwl9CisJLyogUG9wIHRoZSB0b3Agb2YgdGhlIFJ4IEZJRk8gKi8KKwl0YzU4OV93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgUnhEaXNjYXJkKTsKKyAgICB9CisgICAgaWYgKHdvcmtsaW1pdCA9PSAwKQorCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0b28gbXVjaCB3b3JrIGluIGVsM19yeCFcbiIsIGRldi0+bmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1MTYgb3B0cyA9IFNldFJ4RmlsdGVyIHwgUnhTdGF0aW9uIHwgUnhCcm9hZGNhc3Q7CisKKyAgICBpZiAoIShERVZfT0sobGluaykpKSByZXR1cm47CisgICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwlvcHRzIHw9IFJ4TXVsdGljYXN0IHwgUnhQcm9tOworICAgIGVsc2UgaWYgKGRldi0+bWNfY291bnQgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKQorCW9wdHMgfD0gUnhNdWx0aWNhc3Q7CisgICAgb3V0dyhvcHRzLCBpb2FkZHIgKyBFTDNfQ01EKTsKK30KKworc3RhdGljIGludCBlbDNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJmxwLT5saW5rOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgCisgICAgREVCVUcoMSwgIiVzOiBzaHV0dGluZyBkb3duIGV0aGVyY2FyZC5cbiIsIGRldi0+bmFtZSk7CisKKyAgICBpZiAoREVWX09LKGxpbmspKSB7CisJLyogVHVybiBvZmYgc3RhdGlzdGljcyBBU0FQLiAgV2UgdXBkYXRlIGxwLT5zdGF0cyBiZWxvdy4gKi8KKwlvdXR3KFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCisJLyogRGlzYWJsZSB0aGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyLiAqLworCW91dHcoUnhEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwlvdXR3KFR4RGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCisJaWYgKGRldi0+aWZfcG9ydCA9PSAyKQorCSAgICAvKiBUdXJuIG9mZiB0aGlubmV0IHBvd2VyLiAgR3JlZW4hICovCisJICAgIG91dHcoU3RvcENvYXgsIGlvYWRkciArIEVMM19DTUQpOworCWVsc2UgaWYgKGRldi0+aWZfcG9ydCA9PSAxKSB7CisJICAgIC8qIERpc2FibGUgbGluayBiZWF0IGFuZCBqYWJiZXIgKi8KKwkgICAgRUwzV0lORE9XKDQpOworCSAgICBvdXR3KDAsIGlvYWRkciArIFdONF9NRURJQSk7CisJfQorCQorCS8qIFN3aXRjaGluZyBiYWNrIHRvIHdpbmRvdyAwIGRpc2FibGVzIHRoZSBJUlEuICovCisJRUwzV0lORE9XKDApOworCS8qIEJ1dCB3ZSBleHBsaWNpdGx5IHplcm8gdGhlIElSUSBsaW5lIHNlbGVjdCBhbnl3YXkuICovCisJb3V0dygweDBmMDAsIGlvYWRkciArIFdOMF9JUlEpOworICAgICAgICAKKwkvKiBDaGVjayBpZiB0aGUgY2FyZCBzdGlsbCBleGlzdHMgKi8KKwlpZiAoKGludyhpb2FkZHIrRUwzX1NUQVRVUykgJiAweGUwMDApID09IDB4MjAwMCkKKwkgICAgdXBkYXRlX3N0YXRzKGRldik7CisgICAgfQorCisgICAgbGluay0+b3Blbi0tOworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICBkZWxfdGltZXJfc3luYygmbHAtPm1lZGlhKTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHRjNTg5X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gIjNjNTg5X2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gdGM1ODlfYXR0YWNoLAorCS5kZXRhY2gJCT0gdGM1ODlfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF90YzU4OSh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZ0YzU4OV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF90YzU4OSh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmdGM1ODlfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdGM1ODkpOworbW9kdWxlX2V4aXQoZXhpdF90YzU4OSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Zjg2MjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY21jaWEvS2NvbmZpZwpAQCAtMCwwICsxLDEzMiBAQAorIworIyBQQ01DSUEgTmV0d29yayBkZXZpY2UgY29uZmlndXJhdGlvbgorIworCittZW51ICJQQ01DSUEgbmV0d29yayBkZXZpY2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMgJiYgUENNQ0lBIT1uCisKK2NvbmZpZyBORVRfUENNQ0lBCisJYm9vbCAiUENNQ0lBIG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgU2F5IFkgaWYgeW91IHdvdWxkIGxpa2UgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBhbnkgUENNQ0lBIG9yIENhcmRCdXMKKwkgIG5ldHdvcmsgYWRhcHRlcnMsIHRoZW4gc2F5IFkgdG8gdGhlIGRyaXZlciBmb3IgeW91ciBwYXJ0aWN1bGFyIGNhcmQKKwkgIGJlbG93LiAgUENNQ0lBLSBvciBQQy1jYXJkcyBhcmUgY3JlZGl0LWNhcmQgc2l6ZSBkZXZpY2VzIG9mdGVuIHVzZWQKKwkgIHdpdGggbGFwdG9wcyBjb21wdXRlcnM7IENhcmRCdXMgaXMgdGhlIG5ld2VyIGFuZCBmYXN0ZXIgdmVyc2lvbiBvZgorCSAgUENNQ0lBLgorCisJICBUbyB1c2UgeW91ciBQQy1jYXJkcywgeW91IHdpbGwgbmVlZCBzdXBwb3J0aW5nIHNvZnR3YXJlIGZyb20gRGF2aWQKKwkgIEhpbmRzJyBwY21jaWEtY3MgcGFja2FnZSAoc2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlcz4KKwkgIGZvciBsb2NhdGlvbikuICBZb3UgYWxzbyB3YW50IHRvIGNoZWNrIG91dCB0aGUgUENNQ0lBLUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBDTUNJQV8zQzU4OQorCXRyaXN0YXRlICIzQ29tIDNjNTg5IFBDTUNJQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDTUNJQSAmJiBQQ01DSUEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGEgM0NvbSAzYzU4OSBvciBjb21wYXRpYmxlIFBDTUNJQQorCSAgKFBDLWNhcmQpIEV0aGVybmV0IGNhcmQgdG8geW91ciBjb21wdXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgM2M1ODlfY3MuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUENNQ0lBXzNDNTc0CisJdHJpc3RhdGUgIjNDb20gM2M1NzQgUENNQ0lBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENNQ0lBICYmIFBDTUNJQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYSAzQ29tIDNjNTc0IG9yIGNvbXBhdGlibGUgUENNQ0lBCisJICAoUEMtY2FyZCkgRmFzdCBFdGhlcm5ldCBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIDNjNTc0X2NzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBDTUNJQV9GTVZKMThYCisJdHJpc3RhdGUgIkZ1aml0c3UgRk1WLUoxOHggUENNQ0lBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENNQ0lBICYmIFBDTUNJQQorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYSBGdWppdHN1IEZNVi1KMTh4IG9yIGNvbXBhdGlibGUKKwkgIFBDTUNJQSAoUEMtY2FyZCkgRXRoZXJuZXQgY2FyZCB0byB5b3VyIGNvbXB1dGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBmbXZqMTh4X2NzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBDTUNJQV9QQ05FVAorCXRyaXN0YXRlICJORTIwMDAgY29tcGF0aWJsZSBQQ01DSUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ01DSUEgJiYgUENNQ0lBCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCBhbiBORTIwMDAgY29tcGF0aWJsZSBQQ01DSUEKKwkgIChQQy1jYXJkKSBFdGhlcm5ldCBvciBGYXN0IEV0aGVybmV0IGNhcmQgdG8geW91ciBjb21wdXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgcGNuZXRfY3MuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUENNQ0lBX05NQ0xBTgorCXRyaXN0YXRlICJOZXcgTWVkaWEgUENNQ0lBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENNQ0lBICYmIFBDTUNJQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYSBOZXcgTWVkaWEgRXRoZXJuZXQgb3IgTGl2ZVdpcmUKKwkgIFBDTUNJQSAoUEMtY2FyZCkgRXRoZXJuZXQgY2FyZCB0byB5b3VyIGNvbXB1dGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBubWNsYW5fY3MuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUENNQ0lBX1NNQzkxQzkyCisJdHJpc3RhdGUgIlNNQyA5MUN4eCBQQ01DSUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ01DSUEgJiYgUENNQ0lBCisJc2VsZWN0IENSQzMyCisJc2VsZWN0IE1JSQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYW4gU01DIDkxQ3h4IGNvbXBhdGlibGUgUENNQ0lBCisJICAoUEMtY2FyZCkgRXRoZXJuZXQgb3IgRmFzdCBFdGhlcm5ldCBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHNtYzkxYzkyX2NzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBDTUNJQV9YSVJDMlBTCisJdHJpc3RhdGUgIlhpcmNvbSAxNi1iaXQgUENNQ0lBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENNQ0lBICYmIFBDTUNJQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYSBYaXJjb20gMTYtYml0IFBDTUNJQSAoUEMtY2FyZCkKKwkgIEV0aGVybmV0IG9yIEZhc3QgRXRoZXJuZXQgY2FyZCB0byB5b3VyIGNvbXB1dGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCB4aXJjMnBzX2NzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBDTUNJQV9BWE5FVAorCXRyaXN0YXRlICJBc2l4IEFYODgxOTAgUENNQ0lBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENNQ0lBICYmIFBDTUNJQQorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYW4gQXNpeCBBWDg4MTkwLWJhc2VkIFBDTUNJQQorCSAgKFBDLWNhcmQpIEZhc3QgRXRoZXJuZXQgY2FyZCB0byB5b3VyIGNvbXB1dGVyLiAgVGhlc2UgY2FyZHMgYXJlCisJICBuZWFybHkgTkUyMDAwIGNvbXBhdGlibGUgYnV0IG5lZWQgYSBzZXBhcmF0ZSBkcml2ZXIgZHVlIHRvIGEgZmV3CisJICBtaXNmZWF0dXJlcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgYXhuZXRfY3MuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQVJDTkVUX0NPTTIwMDIwX0NTCisJdHJpc3RhdGUgIkNPTTIwMDIwIEFSQ25ldCBQQ01DSUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ01DSUEgJiYgQVJDTkVUX0NPTTIwMDIwICYmIFBDTUNJQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggdGhpcyB0eXBlIG9mIEFSQ25ldCBQQ01DSUEgY2FyZAorCSAgdG8geW91ciBjb21wdXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgY29tMjAwMjBfY3MuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUENNQ0lBX0lCTVRSCisJdHJpc3RhdGUgIklCTSBQQ01DSUEgdG9rZW5yaW5nIGFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ01DSUEgJiYgSUJNVFIhPXkgJiYgVFIgJiYgUENNQ0lBICYmICE2NEJJVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggdGhpcyB0eXBlIG9mIFRva2VuIFJpbmcgUENNQ0lBCisJICBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuIFlvdSB0aGVuIGFsc28gbmVlZCB0byBzYXkgWSB0byAiVG9rZW4gUmluZworCSAgZHJpdmVyIHN1cHBvcnQiLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBpYm10cl9jcy4KKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9wY21jaWEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdkMmQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9NYWtlZmlsZQpAQCAtMCwwICsxLDE2IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggUENNQ0lBIG5ldHdvcmsgZGV2aWNlIGRyaXZlcnMuCisjCisKKyMgMTYtYml0IGNsaWVudCBkcml2ZXJzCitvYmotJChDT05GSUdfUENNQ0lBXzNDNTg5KQkrPSAzYzU4OV9jcy5vCitvYmotJChDT05GSUdfUENNQ0lBXzNDNTc0KQkrPSAzYzU3NF9jcy5vCitvYmotJChDT05GSUdfUENNQ0lBX0ZNVkoxOFgpCSs9IGZtdmoxOHhfY3Mubworb2JqLSQoQ09ORklHX1BDTUNJQV9OTUNMQU4pCSs9IG5tY2xhbl9jcy5vCitvYmotJChDT05GSUdfUENNQ0lBX1BDTkVUKQkrPSBwY25ldF9jcy5vCitvYmotJChDT05GSUdfUENNQ0lBX1NNQzkxQzkyKQkrPSBzbWM5MWM5Ml9jcy5vCitvYmotJChDT05GSUdfUENNQ0lBX1hJUkMyUFMpCSs9IHhpcmMycHNfY3Mubworb2JqLSQoQ09ORklHX0FSQ05FVF9DT00yMDAyMF9DUykrPSBjb20yMDAyMF9jcy5vCitvYmotJChDT05GSUdfUENNQ0lBX0FYTkVUKQkrPSBheG5ldF9jcy5vCisKK29iai0kKENPTkZJR19QQ01DSUFfSUJNVFIpCSs9IGlibXRyX2NzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzYjU4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jCkBAIC0wLDAgKzEsMTg2NCBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBIFBDTUNJQSBldGhlcm5ldCBkcml2ZXIgZm9yIEFzaXggQVg4ODE5MC1iYXNlZCBjYXJkcworCisgICAgVGhlIEFzaXggQVg4ODE5MCBpcyBhIE5TODM5MC1kZXJpdmVkIGNoaXBzZXQgd2l0aCBhIGZldyBuYXN0eQorICAgIGlkaW9zeW5jcmFjaWVzIHRoYXQgbWFrZSBpdCB2ZXJ5IGluY29udmVuaWVudCB0byBzdXBwb3J0IHdpdGggYQorICAgIHN0YW5kYXJkIDgzOTAgZHJpdmVyLiAgVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gcGNuZXRfY3MsIHdpdGggdGhlCisgICAgdHdlYWtlZCA4MzkwIGNvZGUgZ3JhZnRlZCBvbiB0aGUgZW5kLiAgTXVjaCBvZiB3aGF0IEkgZGlkIHdhcyB0bworICAgIGNsZWFuIHVwIGFuZCB1cGRhdGUgYSBzaW1pbGFyIGRyaXZlciBzdXBwbGllZCBieSBBc2l4LCB3aGljaCB3YXMKKyAgICBhZGFwdGVkIGJ5IFdpbGxpYW0gTGVlLCB3aWxsaWFtQGFzaXguY29tLnR3LgorCisgICAgQ29weXJpZ2h0IChDKSAyMDAxIERhdmlkIEEuIEhpbmRzIC0tIGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0CisKKyAgICBheG5ldF9jcy5jIDEuMjggMjAwMi8wNi8yOSAwNjoyNzozNworCisgICAgVGhlIG5ldHdvcmsgZHJpdmVyIGNvZGUgaXMgYmFzZWQgb24gRG9uYWxkIEJlY2tlcidzIE5FMjAwMCBjb2RlOgorCisgICAgV3JpdHRlbiAxOTkyLDE5OTMgYnkgRG9uYWxkIEJlY2tlci4KKyAgICBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kCisgICAgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgICAgRG9uYWxkIEJlY2tlciBtYXkgYmUgcmVhY2hlZCBhdCBiZWNrZXJAc2N5bGQuY29tCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSAiLi4vODM5MC5oIgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgQVhORVRfQ01ECTB4MDAKKyNkZWZpbmUgQVhORVRfREFUQVBPUlQJMHgxMAkvKiBOYXRTZW1pLWRlZmluZWQgcG9ydCB3aW5kb3cgb2Zmc2V0LiAqLworI2RlZmluZSBBWE5FVF9SRVNFVAkweDFmCS8qIElzc3VlIGEgcmVhZCB0byByZXNldCwgYSB3cml0ZSB0byBjbGVhci4gKi8KKyNkZWZpbmUgQVhORVRfTUlJX0VFUAkweDE0CS8qIE9mZnNldCBvZiBNSUkgYWNjZXNzIHBvcnQgKi8KKyNkZWZpbmUgQVhORVRfVEVTVAkweDE1CS8qIE9mZnNldCBvZiBURVNUIFJlZ2lzdGVyIHBvcnQgKi8KKyNkZWZpbmUgQVhORVRfR1BJTwkweDE3CS8qIE9mZnNldCBvZiBHZW5lcmFsIFB1cnBvc2UgUmVnaXN0ZXIgUG9ydCAqLworCisjZGVmaW5lIEFYTkVUX1NUQVJUX1BHCTB4NDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgQVhORVRfU1RPUF9QRwkweDgwCS8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nICovCisKKyNkZWZpbmUgQVhORVRfUkRDX1RJTUVPVVQgMHgwMgkvKiBNYXggd2FpdCBpbiBqaWZmaWVzIGZvciBUeCBSREMgKi8KKworI2RlZmluZSBJU19BWDg4MTkwCTB4MDAwMQorI2RlZmluZSBJU19BWDg4NzkwCTB4MDAwMgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworTU9EVUxFX0FVVEhPUigiRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBc2l4IEFYODgxOTAgUENNQ0lBIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCisjZGVmaW5lIElOVF9NT0RVTEVfUEFSTShuLCB2KSBzdGF0aWMgaW50IG4gPSB2OyBtb2R1bGVfcGFyYW0obiwgaW50LCAwKQorCitJTlRfTU9EVUxFX1BBUk0ocGNfZGVidWcsIFBDTUNJQV9ERUJVRyk7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9CisiYXhuZXRfY3MuYyAxLjI4IDIwMDIvMDYvMjkgMDY6Mjc6MzcgKERhdmlkIEhpbmRzKSI7CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBheG5ldF9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCBheG5ldF9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCBheG5ldF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCSAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworc3RhdGljIGludCBheG5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBheG5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYXhuZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKK3N0YXRpYyBpcnFyZXR1cm5fdCBlaV9pcnFfd3JhcHBlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGVpX3dhdGNoZG9nKHVfbG9uZyBhcmcpOworc3RhdGljIHZvaWQgYXhuZXRfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGludCBtZGlvX3JlYWQoa2lvX2FkZHJfdCBhZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoa2lvX2FkZHJfdCBhZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jLCBpbnQgdmFsdWUpOworCitzdGF0aWMgdm9pZCBnZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKiwKKwkJCSBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqLCBpbnQpOworc3RhdGljIHZvaWQgYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIGJsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkgY29uc3QgdV9jaGFyICpidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKTsKKworc3RhdGljIGRldl9saW5rX3QgKmF4bmV0X2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIGF4bmV0X2RldGFjaChkZXZfbGlua190ICopOworCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJheG5ldF9jcyI7CitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CisKK3N0YXRpYyB2b2lkIGF4ZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgQVg4ODE5MF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGFydHApOworc3RhdGljIGludCBheF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBheF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBheF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCBheG5ldF9kZXZfdCB7CisgICAgZGV2X2xpbmtfdAkJbGluazsKKyAgICBkZXZfbm9kZV90CQlub2RlOworICAgIGNhZGRyX3QJCWJhc2U7CisgICAgc3RydWN0IHRpbWVyX2xpc3QJd2F0Y2hkb2c7CisgICAgaW50CQkJc3RhbGUsIGZhc3RfcG9sbDsKKyAgICB1X3Nob3J0CQlsaW5rX3N0YXR1czsKKyAgICB1X2NoYXIJCWR1cGxleF9mbGFnOworICAgIGludAkJCXBoeV9pZDsKKyAgICBpbnQJCQlmbGFnczsKK30gYXhuZXRfZGV2X3Q7CisKK3N0YXRpYyBpbmxpbmUgYXhuZXRfZGV2X3QgKlBSSVYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl2b2lkICpwID0gKGNoYXIgKiluZXRkZXZfcHJpdihkZXYpICsgc2l6ZW9mKHN0cnVjdCBlaV9kZXZpY2UpOworCXJldHVybiBwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIGF4bmV0X2F0dGFjaCgpIGNyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nCisgICAgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGRldl9saW5rX3QgKmF4bmV0X2F0dGFjaCh2b2lkKQoreworICAgIGF4bmV0X2Rldl90ICppbmZvOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKyAgICBpbnQgcmV0OworCisgICAgREVCVUcoMCwgImF4bmV0X2F0dGFjaCgpXG4iKTsKKworICAgIGRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGVpX2RldmljZSkgKyBzaXplb2YoYXhuZXRfZGV2X3QpLAorCQkJImV0aCVkIiwgYXhkZXZfc2V0dXApOworCisgICAgaWYgKCFkZXYpCisJcmV0dXJuIE5VTEw7CisKKyAgICBpbmZvID0gUFJJVihkZXYpOworICAgIGxpbmsgPSAmaW5mby0+bGluazsKKyAgICBsaW5rLT5wcml2ID0gZGV2OworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFOworICAgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisKKyAgICBkZXYtPm9wZW4gPSAmYXhuZXRfb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmYXhuZXRfY2xvc2U7CisgICAgZGV2LT5kb19pb2N0bCA9ICZheG5ldF9pb2N0bDsKKyAgICBTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbmV0ZGV2X2V0aHRvb2xfb3BzKTsKKworICAgIC8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKKyAgICBkZXZfbGlzdCA9IGxpbms7CisgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKyAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9CisJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmYXhuZXRfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwlheG5ldF9kZXRhY2gobGluayk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGxpbms7Cit9IC8qIGF4bmV0X2F0dGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgICAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAgICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBheG5ldF9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBkZXZfbGlua190ICoqbGlua3A7CisKKyAgICBERUJVRygwLCAiYXhuZXRfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKworICAgIC8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwlpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworICAgIGlmICgqbGlua3AgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBpZiAobGluay0+ZGV2KQorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKyAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCWF4bmV0X3JlbGVhc2UobGluayk7CisKKyAgICBpZiAobGluay0+aGFuZGxlKQorCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisgICAgLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgYml0cyAqLworICAgICpsaW5rcCA9IGxpbmstPm5leHQ7CisgICAgZnJlZV9uZXRkZXYoZGV2KTsKK30gLyogYXhuZXRfZGV0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhpcyBwcm9iZXMgZm9yIGEgY2FyZCdzIGhhcmR3YXJlIGFkZHJlc3MgYnkgcmVhZGluZyB0aGUgUFJPTS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgZ2V0X3Byb20oZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpLCBqOworCisgICAgLyogVGhpcyBpcyBiYXNlZCBvbiBkcml2ZXJzL25ldC9uZS5jICovCisgICAgc3RydWN0IHsKKwl1X2NoYXIgdmFsdWUsIG9mZnNldDsKKyAgICB9IHByb2dyYW1fc2VxW10gPSB7CisJe0U4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIEU4MzkwX0NNRH0sIC8qIFNlbGVjdCBwYWdlIDAqLworCXsweDAxLAlFTjBfRENGR30sCS8qIFNldCB3b3JkLXdpZGUgYWNjZXNzLiAqLworCXsweDAwLAlFTjBfUkNOVExPfSwJLyogQ2xlYXIgdGhlIGNvdW50IHJlZ3MuICovCisJezB4MDAsCUVOMF9SQ05USEl9LAorCXsweDAwLAlFTjBfSU1SfSwJLyogTWFzayBjb21wbGV0aW9uIGlycS4gKi8KKwl7MHhGRiwJRU4wX0lTUn0sCisJe0U4MzkwX1JYT0ZGfDB4NDAsIEVOMF9SWENSfSwJLyogMHg2MCAgU2V0IHRvIG1vbml0b3IgKi8KKwl7RTgzOTBfVFhPRkYsIEVOMF9UWENSfSwJLyogMHgwMiAgYW5kIGxvb3BiYWNrIG1vZGUuICovCisJezB4MTAsCUVOMF9SQ05UTE99LAorCXsweDAwLAlFTjBfUkNOVEhJfSwKKwl7MHgwMCwJRU4wX1JTQVJMT30sCS8qIERNQSBzdGFydGluZyBhdCAweDA0MDAuICovCisJezB4MDQsCUVOMF9SU0FSSEl9LAorCXtFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgRTgzOTBfQ01EfSwKKyAgICB9OworCisgICAgLyogTm90IG11Y2ggb2YgYSB0ZXN0LCBidXQgdGhlIGFsdGVybmF0aXZlcyBhcmUgbWVzc3kgKi8KKyAgICBpZiAobGluay0+Y29uZi5Db25maWdCYXNlICE9IDB4MDNjMCkKKwlyZXR1cm4gMDsKKworICAgIGF4bmV0X3Jlc2V0XzgzOTAoZGV2KTsKKyAgICBtZGVsYXkoMTApOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihwcm9ncmFtX3NlcSkvc2l6ZW9mKHByb2dyYW1fc2VxWzBdKTsgaSsrKQorCW91dGJfcChwcm9ncmFtX3NlcVtpXS52YWx1ZSwgaW9hZGRyICsgcHJvZ3JhbV9zZXFbaV0ub2Zmc2V0KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpICs9IDIpIHsKKwlqID0gaW53KGlvYWRkciArIEFYTkVUX0RBVEFQT1JUKTsKKwlkZXYtPmRldl9hZGRyW2ldID0gaiAmIDB4ZmY7CisJZGV2LT5kZXZfYWRkcltpKzFdID0gaiA+PiA4OworICAgIH0KKyAgICByZXR1cm4gMTsKK30gLyogZ2V0X3Byb20gKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBheG5ldF9jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKKyAgICBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAgICBldGhlcm5ldCBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgdHJ5X2lvX3BvcnQoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBpbnQgaiwgcmV0OworICAgIGlmIChsaW5rLT5pby5OdW1Qb3J0czEgPT0gMzIpIHsKKwlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czIgPiAwKSB7CisJICAgIC8qIGZvciBtYXN0ZXIvc2xhdmUgbXVsdGlmdW5jdGlvbiBjYXJkcyAqLworCSAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OworCSAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IAorCQlJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkd8SVJRX0ZJUlNUX1NIQVJFRDsKKwl9CisgICAgfSBlbHNlIHsKKwkvKiBUaGlzIHNob3VsZCBiZSB0d28gMTYtcG9ydCB3aW5kb3dzICovCisJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKKyAgICB9CisgICAgaWYgKGxpbmstPmlvLkJhc2VQb3J0MSA9PSAwKSB7CisJbGluay0+aW8uSU9BZGRyTGluZXMgPSAxNjsKKwlmb3IgKGogPSAwOyBqIDwgMHg0MDA7IGogKz0gMHgyMCkgeworCSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBqIF4gMHgzMDA7CisJICAgIGxpbmstPmlvLkJhc2VQb3J0MiA9IChqIF4gMHgzMDApICsgMHgxMDsKKwkgICAgcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCSAgICBpZiAocmV0ID09IENTX1NVQ0NFU1MpIHJldHVybiByZXQ7CisJfQorCXJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYXhuZXRfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBheG5ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgaW50IGksIGosIGxhc3RfcmV0LCBsYXN0X2ZuOworICAgIHVfc2hvcnQgYnVmWzY0XTsKKyAgICBjb25maWdfaW5mb190IGNvbmY7CisKKyAgICBERUJVRygwLCAiYXhuZXRfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICAvKiBkb24ndCB0cnVzdCB0aGUgQ0lTIG9uIHRoaXM7IExpbmtzeXMgZ290IGl0IHdyb25nICovCisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gMHg2MzsKKworICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIC8qIExvb2sgdXAgY3VycmVudCBWY2MgKi8KKyAgICBDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8oaGFuZGxlLCAmY29uZikpOworICAgIGxpbmstPmNvbmYuVmNjID0gY29uZi5WY2M7CisKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgd2hpbGUgKGxhc3RfcmV0ID09IENTX1NVQ0NFU1MpIHsKKwljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOworCWNpc3RwbF9pb190ICppbyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeS5pbyk7CisJCisJaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgIT0gMCB8fAorCQlwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gMCB8fAorCQljZmctPmluZGV4ID09IDAgfHwgY2ZnLT5pby5ud2luID09IDApCisJICAgIGdvdG8gbmV4dF9lbnRyeTsKKwkKKwlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMHgwNTsKKwkvKiBGb3IgbXVsdGlmdW5jdGlvbiBjYXJkcywgYnkgY29udmVudGlvbiwgd2UgY29uZmlndXJlIHRoZQorCSAgIG5ldHdvcmsgZnVuY3Rpb24gd2l0aCB3aW5kb3cgMCwgYW5kIHNlcmlhbCB3aXRoIHdpbmRvdyAxICovCisJaWYgKGlvLT5ud2luID4gMSkgeworCSAgICBpID0gKGlvLT53aW5bMV0ubGVuID4gaW8tPndpblswXS5sZW4pOworCSAgICBsaW5rLT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzEtaV0uYmFzZTsKKwkgICAgbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxLWldLmxlbjsKKwl9IGVsc2UgeworCSAgICBpID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKKwl9CisJbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpbltpXS5iYXNlOworCWxpbmstPmlvLk51bVBvcnRzMSA9IGlvLT53aW5baV0ubGVuOworCWxpbmstPmlvLklPQWRkckxpbmVzID0gaW8tPmZsYWdzICYgQ0lTVFBMX0lPX0xJTkVTX01BU0s7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMSArIGxpbmstPmlvLk51bVBvcnRzMiA+PSAzMikgeworCSAgICBsYXN0X3JldCA9IHRyeV9pb19wb3J0KGxpbmspOworCSAgICBpZiAobGFzdF9yZXQgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CisJfQorICAgIG5leHRfZW50cnk6CisJbGFzdF9yZXQgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUpOworICAgIH0KKyAgICBpZiAobGFzdF9yZXQgIT0gQ1NfU1VDQ0VTUykgeworCWNzX2Vycm9yKGhhbmRsZSwgUmVxdWVzdElPLCBsYXN0X3JldCk7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGhhbmRsZSwgJmxpbmstPmlycSkpOworICAgIAorICAgIGlmIChsaW5rLT5pby5OdW1Qb3J0czIgPT0gOCkgeworCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOworCWxpbmstPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7CisgICAgfQorICAgIAorICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKyAgICBkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKyAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKworICAgIGlmICghZ2V0X3Byb20obGluaykpIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgImF4bmV0X2NzOiB0aGlzIGlzIG5vdCBhbiBBWDg4MTkwIGNhcmQhXG4iKTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgImF4bmV0X2NzOiB1c2UgcGNuZXRfY3MgaW5zdGVhZC5cbiIpOworCWdvdG8gZmFpbGVkOworICAgIH0KKworICAgIGVpX3N0YXR1cy5uYW1lID0gIkFYODgxOTAiOworICAgIGVpX3N0YXR1cy53b3JkMTYgPSAxOworICAgIGVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gQVhORVRfU1RBUlRfUEc7CisgICAgZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBBWE5FVF9TVEFSVF9QRyArIFRYX1BBR0VTOworICAgIGVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBBWE5FVF9TVE9QX1BHOworICAgIGVpX3N0YXR1cy5yZXNldF84MzkwID0gJmF4bmV0X3Jlc2V0XzgzOTA7CisgICAgZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZnZXRfODM5MF9oZHI7CisgICAgZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJmJsb2NrX2lucHV0OworICAgIGVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmYmxvY2tfb3V0cHV0OworCisgICAgaWYgKGluYihkZXYtPmJhc2VfYWRkciArIEFYTkVUX1RFU1QpICE9IDApCisJaW5mby0+ZmxhZ3MgfD0gSVNfQVg4ODc5MDsKKyAgICBlbHNlCisJaW5mby0+ZmxhZ3MgfD0gSVNfQVg4ODE5MDsKKworICAgIGlmIChpbmZvLT5mbGFncyAmIElTX0FYODg3OTApCisJb3V0YigweDEwLCBkZXYtPmJhc2VfYWRkciArIEFYTkVUX0dQSU8pOyAgLyogc2VsZWN0IEludGVybmFsIFBIWSAqLworCisgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwlqID0gbWRpb19yZWFkKGRldi0+YmFzZV9hZGRyICsgQVhORVRfTUlJX0VFUCwgaSwgMSk7CisJaWYgKChqICE9IDApICYmIChqICE9IDB4ZmZmZikpIGJyZWFrOworICAgIH0KKworICAgIC8qIE1heWJlIFBIWSBpcyBpbiBwb3dlciBkb3duIG1vZGUuIChQUERfU0VUID0gMSkgCisgICAgICAgQml0IDIgb2YgQ0NTUiBpcyBhY3RpdmUgbG93LiAqLyAKKyAgICBpZiAoaSA9PSAzMikgeworCWNvbmZfcmVnX3QgcmVnID0geyAwLCBDU19XUklURSwgQ0lTUkVHX0NDU1IsIDB4MDQgfTsKKyAJcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmstPmhhbmRsZSwgJnJlZyk7CisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkgICAgaiA9IG1kaW9fcmVhZChkZXYtPmJhc2VfYWRkciArIEFYTkVUX01JSV9FRVAsIGksIDEpOworCSAgICBpZiAoKGogIT0gMCkgJiYgKGogIT0gMHhmZmZmKSkgYnJlYWs7CisJfQorICAgIH0KKworICAgIGluZm8tPnBoeV9pZCA9IChpIDwgMzIpID8gaSA6IC0xOworICAgIGxpbmstPmRldiA9ICZpbmZvLT5ub2RlOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKworICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICJheG5ldF9jczogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKwlsaW5rLT5kZXYgPSBOVUxMOworCWdvdG8gZmFpbGVkOworICAgIH0KKworICAgIHN0cmNweShpbmZvLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFzaXggQVg4OCVkOTA6IGlvICUjM2x4LCBpcnEgJWQsIGh3X2FkZHIgIiwKKwkgICBkZXYtPm5hbWUsICgoaW5mby0+ZmxhZ3MgJiBJU19BWDg4NzkwKSA/IDcgOiAxKSwKKwkgICBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJcHJpbnRrKCIlMDJYJXMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGk8NSkgPyAiOiIgOiAiXG4iKSk7CisgICAgaWYgKGluZm8tPnBoeV9pZCAhPSAtMSkgeworCURFQlVHKDAsICIgIE1JSSB0cmFuc2NlaXZlciBhdCBpbmRleCAlZCwgc3RhdHVzICV4LlxuIiwgaW5mby0+cGh5X2lkLCBqKTsKKyAgICB9IGVsc2UgeworCXByaW50ayhLRVJOX05PVElDRSAiICBObyBNSUkgdHJhbnNjZWl2ZXJzIGZvdW5kIVxuIik7CisgICAgfQorICAgIHJldHVybjsKKworY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgorICAgIGF4bmV0X3JlbGVhc2UobGluayk7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICByZXR1cm47Cit9IC8qIGF4bmV0X2NvbmZpZyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCBheG5ldF9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKKyAgICBkZXZpY2UsIGFuZCByZWxlYXNlIHRoZSBQQ01DSUEgY29uZmlndXJhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKKyAgICBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGF4bmV0X3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBERUJVRygwLCAiYXhuZXRfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisKKyAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuICBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyCisgICAgc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiAgQSBDQVJEX1JFTU9WQUwgZXZlbnQKKyAgICBhbHNvIHNldHMgc29tZSBmbGFncyB0byBkaXNjb3VyYWdlIHRoZSBuZXQgZHJpdmVycyBmcm9tIHRyeWluZworICAgIHRvIHRhbGsgdG8gdGhlIGNhcmQgYW55IG1vcmUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGF4bmV0X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJICAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKyAgICBkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKyAgICBERUJVRygyLCAiYXhuZXRfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworCisgICAgc3dpdGNoIChldmVudCkgeworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCSAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwlheG5ldF9jb25maWcobGluayk7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBpZiAobGluay0+b3BlbikKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCSAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJfQorCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCSAgICBpZiAobGluay0+b3BlbikgeworCQlheG5ldF9yZXNldF84MzkwKGRldik7CisJCUFYODgxOTBfaW5pdChkZXYsIDEpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBheG5ldF9ldmVudCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIE1JSSBpbnRlcmZhY2Ugc3VwcG9ydAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRElPX1NISUZUX0NMSwkJMHgwMQorI2RlZmluZSBNRElPX0RBVEFfV1JJVEUwCTB4MDAKKyNkZWZpbmUgTURJT19EQVRBX1dSSVRFMQkweDA4CisjZGVmaW5lIE1ESU9fREFUQV9SRUFECQkweDA0CisjZGVmaW5lIE1ESU9fTUFTSwkJMHgwZgorI2RlZmluZSBNRElPX0VOQl9JTgkJMHgwMgorCitzdGF0aWMgdm9pZCBtZGlvX3N5bmMoa2lvX2FkZHJfdCBhZGRyKQoreworICAgIGludCBiaXRzOworICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPCAzMjsgYml0cysrKSB7CisJb3V0Yl9wKE1ESU9fREFUQV9XUklURTEsIGFkZHIpOworCW91dGJfcChNRElPX0RBVEFfV1JJVEUxIHwgTURJT19TSElGVF9DTEssIGFkZHIpOworICAgIH0KK30KKworc3RhdGljIGludCBtZGlvX3JlYWQoa2lvX2FkZHJfdCBhZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jKQoreworICAgIHVfaW50IGNtZCA9ICgweGY2PDwxMCl8KHBoeV9pZDw8NSl8bG9jOworICAgIGludCBpLCByZXR2YWwgPSAwOworCisgICAgbWRpb19zeW5jKGFkZHIpOworICAgIGZvciAoaSA9IDE0OyBpID49IDA7IGktLSkgeworCWludCBkYXQgPSAoY21kJigxPDxpKSkgPyBNRElPX0RBVEFfV1JJVEUxIDogTURJT19EQVRBX1dSSVRFMDsKKwlvdXRiX3AoZGF0LCBhZGRyKTsKKwlvdXRiX3AoZGF0IHwgTURJT19TSElGVF9DTEssIGFkZHIpOworICAgIH0KKyAgICBmb3IgKGkgPSAxOTsgaSA+IDA7IGktLSkgeworCW91dGJfcChNRElPX0VOQl9JTiwgYWRkcik7CisJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW5iX3AoYWRkcikgJiBNRElPX0RBVEFfUkVBRCkgIT0gMCk7CisJb3V0Yl9wKE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIGFkZHIpOworICAgIH0KKyAgICByZXR1cm4gKHJldHZhbD4+MSkgJiAweGZmZmY7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoa2lvX2FkZHJfdCBhZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jLCBpbnQgdmFsdWUpCit7CisgICAgdV9pbnQgY21kID0gKDB4MDU8PDI4KXwocGh5X2lkPDwyMyl8KGxvYzw8MTgpfCgxPDwxNyl8dmFsdWU7CisgICAgaW50IGk7CisKKyAgICBtZGlvX3N5bmMoYWRkcik7CisgICAgZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJaW50IGRhdCA9IChjbWQmKDE8PGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiBNRElPX0RBVEFfV1JJVEUwOworCW91dGJfcChkYXQsIGFkZHIpOworCW91dGJfcChkYXQgfCBNRElPX1NISUZUX0NMSywgYWRkcik7CisgICAgfQorICAgIGZvciAoaSA9IDE7IGkgPj0gMDsgaS0tKSB7CisJb3V0Yl9wKE1ESU9fRU5CX0lOLCBhZGRyKTsKKwlvdXRiX3AoTURJT19FTkJfSU4gfCBNRElPX1NISUZUX0NMSywgYWRkcik7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBheG5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgYXhuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZpbmZvLT5saW5rOworICAgIAorICAgIERFQlVHKDIsICJheG5ldF9vcGVuKCclcycpXG4iLCBkZXYtPm5hbWUpOworCisgICAgaWYgKCFERVZfT0sobGluaykpCisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICBsaW5rLT5vcGVuKys7CisKKyAgICByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaXJxX3dyYXBwZXIsIFNBX1NISVJRLCBkZXZfaW5mbywgZGV2KTsKKworICAgIGluZm8tPmxpbmtfc3RhdHVzID0gMHgwMDsKKyAgICBpbml0X3RpbWVyKCZpbmZvLT53YXRjaGRvZyk7CisgICAgaW5mby0+d2F0Y2hkb2cuZnVuY3Rpb24gPSAmZWlfd2F0Y2hkb2c7CisgICAgaW5mby0+d2F0Y2hkb2cuZGF0YSA9ICh1X2xvbmcpZGV2OworICAgIGluZm8tPndhdGNoZG9nLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisgICAgYWRkX3RpbWVyKCZpbmZvLT53YXRjaGRvZyk7CisKKyAgICByZXR1cm4gYXhfb3BlbihkZXYpOworfSAvKiBheG5ldF9vcGVuICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGF4bmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgYXhuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZpbmZvLT5saW5rOworCisgICAgREVCVUcoMiwgImF4bmV0X2Nsb3NlKCclcycpXG4iLCBkZXYtPm5hbWUpOworCisgICAgYXhfY2xvc2UoZGV2KTsKKyAgICBmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKyAgICAKKyAgICBsaW5rLT5vcGVuLS07CisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgIGRlbF90aW1lcl9zeW5jKCZpbmZvLT53YXRjaGRvZyk7CisKKyAgICByZXR1cm4gMDsKK30gLyogYXhuZXRfY2xvc2UgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBIYXJkIHJlc2V0IHRoZSBjYXJkLiAgVGhpcyB1c2VkIHRvIHBhdXNlIGZvciB0aGUgc2FtZSBwZXJpb2QgdGhhdAorICAgIGEgODM5MCByZXNldCBjb21tYW5kIHJlcXVpcmVkLCBidXQgdGhhdCBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgYXhuZXRfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaTsKKworICAgIGVpX3N0YXR1cy50eGluZyA9IGVpX3N0YXR1cy5kbWFpbmcgPSAwOworCisgICAgb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIG5pY19iYXNlICsgRTgzOTBfQ01EKTsKKworICAgIG91dGIoaW5iKG5pY19iYXNlICsgQVhORVRfUkVTRVQpLCBuaWNfYmFzZSArIEFYTkVUX1JFU0VUKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCWlmICgoaW5iX3AobmljX2Jhc2UrRU4wX0lTUikgJiBFTklTUl9SRVNFVCkgIT0gMCkKKwkgICAgYnJlYWs7CisJdWRlbGF5KDEwMCk7CisgICAgfQorICAgIG91dGJfcChFTklTUl9SRVNFVCwgbmljX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrIGludHIuICovCisgICAgCisgICAgaWYgKGkgPT0gMTAwKQorCXByaW50ayhLRVJOX0VSUiAiJXM6IGF4bmV0X3Jlc2V0XzgzOTAoKSBkaWQgbm90IGNvbXBsZXRlLlxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKyAgICAKK30gLyogYXhuZXRfcmVzZXRfODM5MCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGlycXJldHVybl90IGVpX2lycV93cmFwcGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKyAgICBQUklWKGRldiktPnN0YWxlID0gMDsKKyAgICByZXR1cm4gYXhfaW50ZXJydXB0KGlycSwgZGV2X2lkLCByZWdzKTsKK30KKworc3RhdGljIHZvaWQgZWlfd2F0Y2hkb2codV9sb25nIGFyZykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopKGFyZyk7CisgICAgYXhuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAga2lvX2FkZHJfdCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGtpb19hZGRyX3QgbWlpX2FkZHIgPSBuaWNfYmFzZSArIEFYTkVUX01JSV9FRVA7CisgICAgdV9zaG9ydCBsaW5rOworCisgICAgaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSBnb3RvIHJlc2NoZWR1bGU7CisKKyAgICAvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHQgd2l0aCBleHBpcmVkIGxhdGVuY3kgdGltZXI6IHdpdGgKKyAgICAgICB0aGlzLCB3ZSBjYW4gbGltcCBhbG9uZyBldmVuIGlmIHRoZSBpbnRlcnJ1cHQgaXMgYmxvY2tlZCAqLworICAgIGlmIChpbmZvLT5zdGFsZSsrICYmIChpbmJfcChuaWNfYmFzZSArIEVOMF9JU1IpICYgRU5JU1JfQUxMKSkgeworCWlmICghaW5mby0+ZmFzdF9wb2xsKQorCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogaW50ZXJydXB0KHMpIGRyb3BwZWQhXG4iLCBkZXYtPm5hbWUpOworCWVpX2lycV93cmFwcGVyKGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWluZm8tPmZhc3RfcG9sbCA9IEhaOworICAgIH0KKyAgICBpZiAoaW5mby0+ZmFzdF9wb2xsKSB7CisJaW5mby0+ZmFzdF9wb2xsLS07CisJaW5mby0+d2F0Y2hkb2cuZXhwaXJlcyA9IGppZmZpZXMgKyAxOworCWFkZF90aW1lcigmaW5mby0+d2F0Y2hkb2cpOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaW5mby0+cGh5X2lkIDwgMCkKKwlnb3RvIHJlc2NoZWR1bGU7CisgICAgbGluayA9IG1kaW9fcmVhZChtaWlfYWRkciwgaW5mby0+cGh5X2lkLCAxKTsKKyAgICBpZiAoIWxpbmsgfHwgKGxpbmsgPT0gMHhmZmZmKSkgeworCXByaW50ayhLRVJOX0lORk8gIiVzOiBNSUkgaXMgbWlzc2luZyFcbiIsIGRldi0+bmFtZSk7CisJaW5mby0+cGh5X2lkID0gLTE7CisJZ290byByZXNjaGVkdWxlOworICAgIH0KKworICAgIGxpbmsgJj0gMHgwMDA0OworICAgIGlmIChsaW5rICE9IGluZm8tPmxpbmtfc3RhdHVzKSB7CisJdV9zaG9ydCBwID0gbWRpb19yZWFkKG1paV9hZGRyLCBpbmZvLT5waHlfaWQsIDUpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBsaW5rIGJlYXRcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgKGxpbmspID8gImZvdW5kIiA6ICJsb3N0Iik7CisJaWYgKGxpbmspIHsKKwkgICAgaW5mby0+ZHVwbGV4X2ZsYWcgPSAocCAmIDB4MDE0MCkgPyAweDgwIDogMHgwMDsKKwkgICAgaWYgKHApCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBhdXRvbmVnb3RpYXRpb24gY29tcGxldGU6ICIKKwkJICAgICAgICIlc2Jhc2VULSVjRCBzZWxlY3RlZFxuIiwgZGV2LT5uYW1lLAorCQkgICAgICAgKChwICYgMHgwMTgwKSA/ICIxMDAiIDogIjEwIiksCisJCSAgICAgICAoKHAgJiAweDAxNDApID8gJ0YnIDogJ0gnKSk7CisJICAgIGVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgcGFydG5lciBkaWQgbm90IGF1dG9uZWdvdGlhdGVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCSAgICBBWDg4MTkwX2luaXQoZGV2LCAxKTsKKwl9CisJaW5mby0+bGlua19zdGF0dXMgPSBsaW5rOworICAgIH0KKworcmVzY2hlZHVsZToKKyAgICBpbmZvLT53YXRjaGRvZy5leHBpcmVzID0gamlmZmllcyArIEhaOworICAgIGFkZF90aW1lcigmaW5mby0+d2F0Y2hkb2cpOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsICJheG5ldF9jcyIpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgYXhuZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKyAgICBheG5ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICB1MTYgKmRhdGEgPSAodTE2ICopJnJxLT5pZnJfaWZydTsKKyAgICBraW9fYWRkcl90IG1paV9hZGRyID0gZGV2LT5iYXNlX2FkZHIgKyBBWE5FVF9NSUlfRUVQOworICAgIHN3aXRjaCAoY21kKSB7CisgICAgY2FzZSBTSU9DR01JSVBIWToKKwlkYXRhWzBdID0gaW5mby0+cGh5X2lkOworICAgIGNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJZGF0YVszXSA9IG1kaW9fcmVhZChtaWlfYWRkciwgZGF0YVswXSwgZGF0YVsxXSAmIDB4MWYpOworCXJldHVybiAwOworICAgIGNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkgICAgcmV0dXJuIC1FUEVSTTsKKwltZGlvX3dyaXRlKG1paV9hZGRyLCBkYXRhWzBdLCBkYXRhWzFdICYgMHgxZiwgZGF0YVsyXSk7CisJcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtRU9QTk9UU1VQUDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGdldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsCisJCQkgaW50IHJpbmdfcGFnZSkKK3sKKyAgICBraW9fYWRkcl90IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBvdXRiX3AoMCwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsJCS8qIE9uIHBhZ2UgYm91bmRhcnkgKi8KKyAgICBvdXRiX3AocmluZ19wYWdlLCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworICAgIG91dGJfcChFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBBWE5FVF9DTUQpOworCisgICAgaW5zdyhuaWNfYmFzZSArIEFYTkVUX0RBVEFQT1JULCBoZHIsCisJICAgIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik+PjEpOworICAgIC8qIEZpeCBmb3IgYmlnIGVuZGlhbiBzeXN0ZW1zICovCisgICAgaGRyLT5jb3VudCA9IGxlMTZfdG9fY3B1KGhkci0+Y291bnQpOworCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisgICAga2lvX2FkZHJfdCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCB4ZmVyX2NvdW50ID0gY291bnQ7CisgICAgY2hhciAqYnVmID0gc2tiLT5kYXRhOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCisgICAgaWYgKChlaV9kZWJ1ZyA+IDQpICYmIChjb3VudCAhPSA0KSkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFtiaT0lZF1cbiIsIGRldi0+bmFtZSwgY291bnQrNCk7CisjZW5kaWYKKyAgICBvdXRiX3AocmluZ19vZmZzZXQgJiAweGZmLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOworICAgIG91dGJfcChyaW5nX29mZnNldCA+PiA4LCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworICAgIG91dGJfcChFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBBWE5FVF9DTUQpOworCisgICAgaW5zdyhuaWNfYmFzZSArIEFYTkVUX0RBVEFQT1JULGJ1Zixjb3VudD4+MSk7CisgICAgaWYgKGNvdW50ICYgMHgwMSkKKwlidWZbY291bnQtMV0gPSBpbmIobmljX2Jhc2UgKyBBWE5FVF9EQVRBUE9SVCksIHhmZXJfY291bnQrKzsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSBjb25zdCB1X2NoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpCit7CisgICAga2lvX2FkZHJfdCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCisgICAgaWYgKGVpX2RlYnVnID4gNCkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFtibz0lZF1cbiIsIGRldi0+bmFtZSwgY291bnQpOworI2VuZGlmCisKKyAgICAvKiBSb3VuZCB0aGUgY291bnQgdXAgZm9yIHdvcmQgd3JpdGVzLiAgRG8gd2UgbmVlZCB0byBkbyB0aGlzPworICAgICAgIFdoYXQgZWZmZWN0IHdpbGwgYW4gb2RkIGJ5dGUgY291bnQgaGF2ZSBvbiB0aGUgODM5MD8KKyAgICAgICBJIHNob3VsZCBjaGVjayBzb21lZGF5LiAqLworICAgIGlmIChjb3VudCAmIDB4MDEpCisJY291bnQrKzsKKworICAgIG91dGJfcCgweDAwLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOworICAgIG91dGJfcChzdGFydF9wYWdlLCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworICAgIG91dGJfcChFODM5MF9SV1JJVEUrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgQVhORVRfQ01EKTsKKyAgICBvdXRzdyhuaWNfYmFzZSArIEFYTkVUX0RBVEFQT1JULCBidWYsIGNvdW50Pj4xKTsKK30KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGF4bmV0X2NzX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gImF4bmV0X2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gYXhuZXRfYXR0YWNoLAorCS5kZXRhY2gJCT0gYXhuZXRfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9heG5ldF9jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZheG5ldF9jc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9heG5ldF9jcyh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmYXhuZXRfY3NfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfYXhuZXRfY3MpOworbW9kdWxlX2V4aXQoZXhpdF9heG5ldF9jcyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiA4MzkwLmM6IEEgZ2VuZXJhbCBOUzgzOTAgZXRoZXJuZXQgZHJpdmVyIGNvcmUgZm9yIGxpbnV4LiAqLworLyoKKwlXcml0dGVuIDE5OTItOTQgYnkgRG9uYWxkIEJlY2tlci4KKyAgCisJQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworICBUaGlzIGlzIHRoZSBjaGlwLXNwZWNpZmljIGNvZGUgZm9yIG1hbnkgODM5MC1iYXNlZCBldGhlcm5ldCBhZGFwdG9ycy4KKyAgVGhpcyBpcyBub3QgYSBjb21wbGV0ZSBkcml2ZXIsIGl0IG11c3QgYmUgY29tYmluZWQgd2l0aCBib2FyZC1zcGVjaWZpYworICBjb2RlIHN1Y2ggYXMgbmUuYywgd2QuYywgM2M1MDMuYywgZXRjLgorCisgIFNlZWluZyBob3cgYXQgbGVhc3QgZWlnaHQgZHJpdmVycyB1c2UgdGhpcyBjb2RlLCAobm90IGNvdW50aW5nIHRoZQorICBQQ01DSUEgb25lcyBlaXRoZXIpIGl0IGlzIGVhc3kgdG8gYnJlYWsgc29tZSBjYXJkIGJ5IHdoYXQgc2VlbXMgbGlrZQorICBhIHNpbXBsZSBpbm5vY2VudCBjaGFuZ2UuIFBsZWFzZSBjb250YWN0IG1lIG9yIERvbmFsZCBpZiB5b3UgdGhpbmsKKyAgeW91IGhhdmUgZm91bmQgc29tZXRoaW5nIHRoYXQgbmVlZHMgY2hhbmdpbmcuIC0tIFBHCisKKyAgQ2hhbmdlbG9nOgorCisgIFBhdWwgR29ydG1ha2VyCTogcmVtb3ZlIHNldF9iaXQgbG9jaywgb3RoZXIgY2xlYW51cHMuCisgIFBhdWwgR29ydG1ha2VyCTogYWRkIGVpX2dldF84MzkwX2hkcigpIHNvIHdlIGNhbiBwYXNzIHNrYidzIHRvIAorCQkJICBlaV9ibG9ja19pbnB1dCgpIGZvciBldGhfaW9fY29weV9hbmRfc3VtKCkuCisgIFBhdWwgR29ydG1ha2VyCTogZXhjaGFuZ2Ugc3RhdGljIGludCBlaV9waW5ncG9uZyBmb3IgYSAjZGVmaW5lLAorCQkJICBhbHNvIGFkZCBiZXR0ZXIgVHggZXJyb3IgaGFuZGxpbmcuCisgIFBhdWwgR29ydG1ha2VyCTogcmV3cml0ZSBSeCBvdmVycnVuIGhhbmRsaW5nIGFzIHBlciBOUyBzcGVjcy4KKyAgQWxleGV5IEt1em5ldHNvdgk6IHVzZSB0aGUgODM5MCdzIHNpeCBiaXQgaGFzaCBtdWx0aWNhc3QgZmlsdGVyLgorICBQYXVsIEdvcnRtYWtlcgk6IHR3ZWFrIEFOSydzIGFib3ZlIG11bHRpY2FzdCBjaGFuZ2VzIGEgYml0LgorICBQYXVsIEdvcnRtYWtlcgk6IHVwZGF0ZSBwYWNrZXQgc3RhdGlzdGljcyBmb3IgdjIuMS54CisgIEFsYW4gQ294CQk6IHN1cHBvcnQgYXJiaXRhcnkgc3R1cGlkIHBvcnQgbWFwcGluZ3Mgb24gdGhlCisgIAkJCSAgNjhLIE1hY2ludG9zaC4gU3VwcG9ydCA+MTZiaXQgSS9PIHNwYWNlcworICBQYXVsIEdvcnRtYWtlcgk6IGFkZCBrbW9kIHN1cHBvcnQgZm9yIGF1dG8tbG9hZGluZyBvZiB0aGUgODM5MAorCQkJICBtb2R1bGUgYnkgYWxsIGRyaXZlcnMgdGhhdCByZXF1aXJlIGl0LgorICBBbGFuIENveAkJOiBTcGlubG9ja2luZyB3b3JrLCBhZGRlZCAnQlVHXzgzQzY5MCcKKyAgUGF1bCBHb3J0bWFrZXIJOiBTZXBhcmF0ZSBvdXQgVHggdGltZW91dCBjb2RlIGZyb20gVHggcGF0aC4KKworICBTb3VyY2VzOgorICBUaGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMQU4gRGF0YWJvb2ssIGFuZCB0aGUgM0NvbSAzYzUwMyBkYXRhYm9vay4KKworICAqLworCitzdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbl84MzkwID0KKyAgICAiODM5MC5jOnYxLjEwY3ZzIDkvMjMvOTQgRG9uYWxkIEJlY2tlciAoYmVja2VyQHNjeWxkLmNvbSlcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2RlZmluZSBCVUdfODNDNjkwCisKKy8qIFRoZXNlIGFyZSB0aGUgb3BlcmF0aW9uYWwgZnVuY3Rpb24gaW50ZXJmYWNlcyB0byBib2FyZC1zcGVjaWZpYworICAgcm91dGluZXMuCisJdm9pZCByZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCisJCVJlc2V0cyB0aGUgYm9hcmQgYXNzb2NpYXRlZCB3aXRoIERFViwgaW5jbHVkaW5nIGEgaGFyZHdhcmUgcmVzZXQgb2YKKwkJdGhlIDgzOTAuICBUaGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSB0cmFuc21pdCB0aW1lb3V0LCBhbmQKKwkJaXQgaXMgYWx3YXlzIGZvbGxvd2VkIGJ5IDgzOTBfaW5pdCgpLgorCXZvaWQgYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCQkgIGludCBzdGFydF9wYWdlKQorCQlXcml0ZSB0aGUgQ09VTlQgYnl0ZXMgb2YgQlVGIHRvIHRoZSBwYWNrZXQgYnVmZmVyIGF0IFNUQVJUX1BBR0UuICBUaGUKKwkJInBhZ2UiIHZhbHVlIHVzZXMgdGhlIDgzOTAncyAyNTYtYnl0ZSBwYWdlcy4KKwl2b2lkIGdldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpCisJCVJlYWQgdGhlIDQgYnl0ZSwgcGFnZSBhbGlnbmVkIDgzOTAgaGVhZGVyLiAqSWYqIHRoZXJlIGlzIGEKKwkJc3Vic2VxdWVudCByZWFkLCBpdCB3aWxsIGJlIG9mIHRoZSByZXN0IG9mIHRoZSBwYWNrZXQuCisJdm9pZCBibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKKwkJUmVhZCBDT1VOVCBieXRlcyBmcm9tIHRoZSBwYWNrZXQgYnVmZmVyIGludG8gdGhlIHNrYiBkYXRhIGFyZWEuIFN0YXJ0IAorCQlyZWFkaW5nIGZyb20gUklOR19PRkZTRVQsIHRoZSBhZGRyZXNzIGFzIHRoZSA4MzkwIHNlZXMgaXQuICBUaGlzIHdpbGwgYWx3YXlzCisJCWZvbGxvdyB0aGUgcmVhZCBvZiB0aGUgODM5MCBoZWFkZXIuIAorKi8KKyNkZWZpbmUgZWlfcmVzZXRfODM5MCAoZWlfbG9jYWwtPnJlc2V0XzgzOTApCisjZGVmaW5lIGVpX2Jsb2NrX291dHB1dCAoZWlfbG9jYWwtPmJsb2NrX291dHB1dCkKKyNkZWZpbmUgZWlfYmxvY2tfaW5wdXQgKGVpX2xvY2FsLT5ibG9ja19pbnB1dCkKKyNkZWZpbmUgZWlfZ2V0XzgzOTBfaGRyIChlaV9sb2NhbC0+Z2V0XzgzOTBfaGRyKQorCisvKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcgKi8KKyNpZm5kZWYgZWlfZGVidWcKK2ludCBlaV9kZWJ1ZyA9IDE7CisjZW5kaWYKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLiAqLworc3RhdGljIHZvaWQgZWlfdHhfaW50cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVpX3R4X2VycihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVpX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlaV9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWlfcnhfb3ZlcnJ1bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogUm91dGluZXMgZ2VuZXJpYyB0byBOUzgzOTAtYmFzZWQgYm9hcmRzLiAqLworc3RhdGljIHZvaWQgTlM4MzkwX3RyaWdnZXJfc2VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbGVuZ3RoLAorCQkJCQkJCQlpbnQgc3RhcnRfcGFnZSk7CitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBkb19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qCisgKglTTVAgYW5kIHRoZSA4MzkwIHNldHVwLgorICoKKyAqCVRoZSA4MzkwIGlzbnQgZXhhY3RseSBkZXNpZ25lZCB0byBiZSBtdWx0aXRocmVhZGVkIG9uIFJYL1RYLiBUaGVyZSBpcworICoJYSBwYWdlIHJlZ2lzdGVyIHRoYXQgY29udHJvbHMgYmFuayBhbmQgcGFja2V0IGJ1ZmZlciBhY2Nlc3MuIFdlIGd1YXJkCisgKgl0aGlzIHdpdGggZWlfbG9jYWwtPnBhZ2VfbG9jay4gTm9ib2R5IHNob3VsZCBhc3N1bWUgb3Igc2V0IHRoZSBwYWdlIG90aGVyCisgKgl0aGFuIHplcm8gd2hlbiB0aGUgbG9jayBpcyBub3QgaGVsZC4gTG9jayBob2xkZXJzIG11c3QgcmVzdG9yZSBwYWdlIDAKKyAqCWJlZm9yZSB1bmxvY2tpbmcuIEV2ZW4gcHVyZSByZWFkZXJzIG11c3QgdGFrZSB0aGUgbG9jayB0byBwcm90ZWN0IGluIAorICoJcGFnZSAwLgorICoKKyAqCVRvIG1ha2UgbGlmZSBkaWZmaWN1bHQgdGhlIGNoaXAgY2FuIGFsc28gYmUgdmVyeSBzbG93LiBXZSB0aGVyZWZvcmUgY2FuJ3QKKyAqCWp1c3QgdXNlIHNwaW5sb2Nrcy4gRm9yIHRoZSBsb25nZXIgbG9ja3VwcyB3ZSBkaXNhYmxlIHRoZSBpcnEgdGhlIGRldmljZQorICoJc2l0cyBvbiBhbmQgaG9sZCB0aGUgbG9jay4gV2UgbXVzdCBob2xkIHRoZSBsb2NrIGJlY2F1c2UgdGhlcmUgaXMgYSBkdWFsCisgKglwcm9jZXNzb3IgY2FzZSBvdGhlciB0aGFuIGludGVycnVwdHMgKGdldCBzdGF0cy9zZXQgbXVsdGljYXN0IGxpc3QgaW4KKyAqCXBhcmFsbGVsIHdpdGggZWFjaCBvdGhlciBhbmQgdHJhbnNtaXQpLgorICoKKyAqCU5vdGU6IGluIHRoZW9yeSB3ZSBjYW4ganVzdCBkaXNhYmxlIHRoZSBpcnEgb24gdGhlIGNhcmQgX2J1dF8gdGhlcmUgaXMKKyAqCWEgbGF0ZW5jeSBvbiBTTVAgaXJxIGRlbGl2ZXJ5LiBTbyB3ZSBjYW4gZWFzaWx5IGdvICJkaXNhYmxlIGlycSIgInN5bmMgaXJxcyIKKyAqCWVudGVyIGxvY2ssIHRha2UgdGhlIHF1ZXVlZCBpcnEuIFNvIHdlIHdhZGRsZSBpbnN0ZWFkIG9mIGZseWluZy4KKyAqCisgKglGaW5hbGx5IGJ5IHNwZWNpYWwgYXJyYW5nZW1lbnQgZm9yIHRoZSBwdXJwb3NlIG9mIGJlaW5nIGdlbmVyYWxseSAKKyAqCWFubm95aW5nIHRoZSB0cmFuc21pdCBmdW5jdGlvbiBpcyBjYWxsZWQgYmggYXRvbWljLiBUaGF0IHBsYWNlcworICoJcmVzdHJpY3Rpb25zIG9uIHRoZSB1c2VyIGNvbnRleHQgY2FsbGVycyBhcyBkaXNhYmxlX2lycSB3b24ndCBzYXZlCisgKgl0aGVtLgorICovCisgCisvKioKKyAqIGF4X29wZW4gLSBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLgorICogQGRldjogbmV0d29yayBkZXZpY2UgdG8gaW5pdGlhbGl6ZQorICoKKyAqIFRoaXMgcm91dGluZSBnb2VzIGFsbC1vdXQsIHNldHRpbmcgZXZlcnl0aGluZworICogdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4gdGhvdWdoIG1hbnkgb2YgdGhlc2UgcmVnaXN0ZXJzIHNob3VsZCBvbmx5CisgKiBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QuCisgKi8KK3N0YXRpYyBpbnQgYXhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgSEFWRV9UWF9USU1FT1VUCisJLyogVGhlIGNhcmQgSS9PIHBhcnQgb2YgdGhlIGRyaXZlciAoZS5nLiAzYzUwMykgY2FuIGhvb2sgYSBUeCB0aW1lb3V0CisJICAgIHdyYXBwZXIgdGhhdCBkb2VzIGUuZy4gbWVkaWEgY2hlY2sgJiB0aGVuIGNhbGxzIGVpX3R4X3RpbWVvdXQuICovCisJaWYgKGRldi0+dHhfdGltZW91dCA9PSBOVUxMKQorCQkgZGV2LT50eF90aW1lb3V0ID0gZWlfdHhfdGltZW91dDsKKwlpZiAoZGV2LT53YXRjaGRvZ190aW1lbyA8PSAwKQorCQkgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjZW5kaWYKKworCS8qCisJICoJR3JhYiB0aGUgcGFnZSBsb2NrIHNvIHdlIG93biB0aGUgcmVnaXN0ZXIgc2V0LCB0aGVuIGNhbGwKKwkgKgl0aGUgaW5pdCBmdW5jdGlvbi4KKwkgKi8KKyAgICAgIAorICAgICAgCXNwaW5fbG9ja19pcnFzYXZlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CisJQVg4ODE5MF9pbml0KGRldiwgMSk7CisJLyogU2V0IHRoZSBmbGFnIGJlZm9yZSB3ZSBkcm9wIHRoZSBsb2NrLCBUaGF0IHdheSB0aGUgSVJRIGFycml2ZXMKKwkgICBhZnRlciBpdHMgc2V0IGFuZCB3ZSBnZXQgbm8gc2lsbHkgd2FybmluZ3MgKi8KKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICAgICAgCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwllaV9sb2NhbC0+aXJxbG9jayA9IDA7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgZGV2X2xvY2soZGV2KSAoKChzdHJ1Y3QgZWlfZGV2aWNlICopbmV0ZGV2X3ByaXYoZGV2KSktPnBhZ2VfbG9jaykKKworLyoqCisgKiBheF9jbG9zZSAtIHNodXQgZG93biBuZXR3b3JrIGRldmljZQorICogQGRldjogbmV0d29yayBkZXZpY2UgdG8gY2xvc2UKKyAqCisgKiBPcHBvc2l0ZSBvZiBheF9vcGVuKCkuIE9ubHkgdXNlZCB3aGVuICJpZmNvbmZpZyA8ZGV2bmFtZT4gZG93biIgaXMgZG9uZS4KKyAqLworaW50IGF4X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogICAgICBIb2xkIHRoZSBwYWdlIGxvY2sgZHVyaW5nIGNsb3NlCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X2xvY2soZGV2KSwgZmxhZ3MpOworCUFYODgxOTBfaW5pdChkZXYsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9sb2NrKGRldiksIGZsYWdzKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZWlfdHhfdGltZW91dCAtIGhhbmRsZSB0cmFuc21pdCB0aW1lIG91dCBjb25kaXRpb24KKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdoaWNoIGhhcyBhcHBhcmVudGx5IGZhbGxlbiBhc2xlZXAKKyAqCisgKiBDYWxsZWQgYnkga2VybmVsIHdoZW4gZGV2aWNlIG5ldmVyIGFja25vd2xlZGdlcyBhIHRyYW5zbWl0IGhhcworICogY29tcGxldGVkIChvciBmYWlsZWQpIC0gaS5lLiBuZXZlciBwb3N0ZWQgYSBUeCByZWxhdGVkIGludGVycnVwdC4KKyAqLworCit2b2lkIGVpX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJaW50IHR4c3IsIGlzciwgdGlja3Nzb2ZhciA9IGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwllaV9sb2NhbC0+c3RhdC50eF9lcnJvcnMrKzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CisJdHhzciA9IGluYihlODM5MF9iYXNlK0VOMF9UU1IpOworCWlzciA9IGluYihlODM5MF9iYXNlK0VOMF9JU1IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogVHggdGltZWQgb3V0LCAlcyBUU1I9JSMyeCwgSVNSPSUjMngsIHQ9JWQuXG4iLAorCQlkZXYtPm5hbWUsICh0eHNyICYgRU5UU1JfQUJUKSA/ICJleGNlc3MgY29sbGlzaW9ucy4iIDoKKwkJKGlzcikgPyAibG9zdCBpbnRlcnJ1cHQ/IiA6ICJjYWJsZSBwcm9ibGVtPyIsIHR4c3IsIGlzciwgdGlja3Nzb2Zhcik7CisKKwlpZiAoIWlzciAmJiAhZWlfbG9jYWwtPnN0YXQudHhfcGFja2V0cykgCisJeworCQkvKiBUaGUgODM5MCBwcm9iYWJseSBoYXNuJ3QgZ290dGVuIG9uIHRoZSBjYWJsZSB5ZXQuICovCisJCWVpX2xvY2FsLT5pbnRlcmZhY2VfbnVtIF49IDE7ICAgLyogVHJ5IGEgZGlmZmVyZW50IHhjdnIuICAqLworCX0KKworCS8qIFVnbHkgYnV0IGEgcmVzZXQgY2FuIGJlIHNsb3csIHlldCBtdXN0IGJlIHByb3RlY3RlZCAqLworCQkKKwlkaXNhYmxlX2lycV9ub3N5bmMoZGV2LT5pcnEpOworCXNwaW5fbG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisJCQorCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBjYXJkLiAgUGVyaGFwcyB0aGUgdXNlciBoYXMgZml4ZWQgc29tZXRoaW5nLiAqLworCWVpX3Jlc2V0XzgzOTAoZGV2KTsKKwlBWDg4MTkwX2luaXQoZGV2LCAxKTsKKwkJCisJc3Bpbl91bmxvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKyAgICAKKy8qKgorICogZWlfc3RhcnRfeG1pdCAtIGJlZ2luIHBhY2tldCB0cmFuc21pc3Npb24KKyAqIEBza2I6IHBhY2tldCB0byBiZSBzZW50CisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byB3aGljaCBwYWNrZXQgaXMgc2VudAorICoKKyAqIFNlbmRzIGEgcGFja2V0IHRvIGFuIDgzOTAgbmV0d29yayBkZXZpY2UuCisgKi8KKyAKK3N0YXRpYyBpbnQgZWlfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgbGVuZ3RoLCBzZW5kX2xlbmd0aCwgb3V0cHV0X3BhZ2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBwYWNrZXRbRVRIX1pMRU5dOworCQorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWxlbmd0aCA9IHNrYi0+bGVuOworCisJLyogTWFzayBpbnRlcnJ1cHRzIGZyb20gdGhlIGV0aGVyY2FyZC4gCisJICAgU01QOiBXZSBoYXZlIHRvIGdyYWIgdGhlIGxvY2sgaGVyZSBvdGhlcndpc2UgdGhlIElSUSBoYW5kbGVyCisJICAgb24gYW5vdGhlciBDUFUgY2FuIGZsaXAgd2luZG93IGFuZCByYWNlIHRoZSBJUlEgbWFzayBzZXQuIFdlIGVuZAorCSAgIHVwIHRyYXNoaW5nIHRoZSBtY2FzdCBmaWx0ZXIgbm90IGRpc2FibGluZyBpcnFzIGlmIHdlIGRvbid0IGxvY2sgKi8KKwkgICAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCW91dGJfcCgweDAwLCBlODM5MF9iYXNlICsgRU4wX0lNUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCQorCS8qCisJICoJU2xvdyBwaGFzZSB3aXRoIGxvY2sgaGVsZC4KKwkgKi8KKwkgCisJZGlzYWJsZV9pcnFfbm9zeW5jKGRldi0+aXJxKTsKKwkKKwlzcGluX2xvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCQorCWVpX2xvY2FsLT5pcnFsb2NrID0gMTsKKworCXNlbmRfbGVuZ3RoID0gRVRIX1pMRU4gPCBsZW5ndGggPyBsZW5ndGggOiBFVEhfWkxFTjsKKwkKKwkvKgorCSAqIFdlIGhhdmUgdHdvIFR4IHNsb3RzIGF2YWlsYWJsZSBmb3IgdXNlLiBGaW5kIHRoZSBmaXJzdCBmcmVlCisJICogc2xvdCwgYW5kIHRoZW4gcGVyZm9ybSBzb21lIHNhbml0eSBjaGVja3MuIFdpdGggdHdvIFR4IGJ1ZnMsCisJICogeW91IGdldCB2ZXJ5IGNsb3NlIHRvIHRyYW5zbWl0dGluZyBiYWNrLXRvLWJhY2sgcGFja2V0cy4gV2l0aAorCSAqIG9ubHkgb25lIFR4IGJ1ZiwgdGhlIHRyYW5zbWl0dGVyIHNpdHMgaWRsZSB3aGlsZSB5b3UgcmVsb2FkIHRoZQorCSAqIGNhcmQsIGxlYXZpbmcgYSBzdWJzdGFudGlhbCBnYXAgYmV0d2VlbiBlYWNoIHRyYW5zbWl0dGVkIHBhY2tldC4KKwkgKi8KKworCWlmIChlaV9sb2NhbC0+dHgxID09IDApIAorCXsKKwkJb3V0cHV0X3BhZ2UgPSBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZTsKKwkJZWlfbG9jYWwtPnR4MSA9IHNlbmRfbGVuZ3RoOworCQlpZiAoZWlfZGVidWcgICYmICBlaV9sb2NhbC0+dHgyID4gMCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogaWRsZSB0cmFuc21pdHRlciB0eDI9JWQsIGxhc3R0eD0lZCwgdHhpbmc9JWQuXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MiwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4aW5nKTsKKwl9CisJZWxzZSBpZiAoZWlfbG9jYWwtPnR4MiA9PSAwKSAKKwl7CisJCW91dHB1dF9wYWdlID0gZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UgKyBUWF9QQUdFUy8yOworCQllaV9sb2NhbC0+dHgyID0gc2VuZF9sZW5ndGg7CisJCWlmIChlaV9kZWJ1ZyAgJiYgIGVpX2xvY2FsLT50eDEgPiAwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpZGxlIHRyYW5zbWl0dGVyLCB0eDE9JWQsIGxhc3R0eD0lZCwgdHhpbmc9JWQuXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MSwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4aW5nKTsKKwl9CisJZWxzZQorCXsJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLiAqLworCQlpZiAoZWlfZGVidWcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5vIFR4IGJ1ZmZlcnMgZnJlZSEgdHgxPSVkIHR4Mj0lZCBsYXN0PSVkXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MSwgZWlfbG9jYWwtPnR4MiwgZWlfbG9jYWwtPmxhc3R0eCk7CisJCWVpX2xvY2FsLT5pcnFsb2NrID0gMDsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlvdXRiX3AoRU5JU1JfQUxMLCBlODM5MF9iYXNlICsgRU4wX0lNUik7CisJCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwkJZW5hYmxlX2lycShkZXYtPmlycSk7CisJCWVpX2xvY2FsLT5zdGF0LnR4X2Vycm9ycysrOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIE9rYXksIG5vdyB1cGxvYWQgdGhlIHBhY2tldCBhbmQgdHJpZ2dlciBhIHNlbmQgaWYgdGhlIHRyYW5zbWl0dGVyCisJICogaXNuJ3QgYWxyZWFkeSBzZW5kaW5nLiBJZiBpdCBpcyBidXN5LCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbAorCSAqIHRyaWdnZXIgdGhlIHNlbmQgbGF0ZXIsIHVwb24gcmVjZWl2aW5nIGEgVHggZG9uZSBpbnRlcnJ1cHQuCisJICovCisKKwlpZiAobGVuZ3RoID09IHNrYi0+bGVuKQorCQllaV9ibG9ja19vdXRwdXQoZGV2LCBsZW5ndGgsIHNrYi0+ZGF0YSwgb3V0cHV0X3BhZ2UpOworCWVsc2UgeworCQltZW1zZXQocGFja2V0LCAwLCBFVEhfWkxFTik7CisJCW1lbWNweShwYWNrZXQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQllaV9ibG9ja19vdXRwdXQoZGV2LCBsZW5ndGgsIHBhY2tldCwgb3V0cHV0X3BhZ2UpOworCX0KKwkKKwlpZiAoISBlaV9sb2NhbC0+dHhpbmcpIAorCXsKKwkJZWlfbG9jYWwtPnR4aW5nID0gMTsKKwkJTlM4MzkwX3RyaWdnZXJfc2VuZChkZXYsIHNlbmRfbGVuZ3RoLCBvdXRwdXRfcGFnZSk7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlpZiAob3V0cHV0X3BhZ2UgPT0gZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UpIAorCQl7CisJCQllaV9sb2NhbC0+dHgxID0gLTE7CisJCQllaV9sb2NhbC0+bGFzdHR4ID0gLTE7CisJCX0KKwkJZWxzZSAKKwkJeworCQkJZWlfbG9jYWwtPnR4MiA9IC0xOworCQkJZWlfbG9jYWwtPmxhc3R0eCA9IC0yOworCQl9CisJfQorCWVsc2UgZWlfbG9jYWwtPnR4cXVldWUrKzsKKworCWlmIChlaV9sb2NhbC0+dHgxICAmJiAgZWlfbG9jYWwtPnR4MikKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWVsc2UKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCS8qIFR1cm4gODM5MCBpbnRlcnJ1cHRzIGJhY2sgb24uICovCisJZWlfbG9jYWwtPmlycWxvY2sgPSAwOworCW91dGJfcChFTklTUl9BTEwsIGU4MzkwX2Jhc2UgKyBFTjBfSU1SKTsKKwkKKwlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7CisKKwlkZXZfa2ZyZWVfc2tiIChza2IpOworCWVpX2xvY2FsLT5zdGF0LnR4X2J5dGVzICs9IHNlbmRfbGVuZ3RoOworICAgIAorCXJldHVybiAwOworfQorCisvKioKKyAqIGF4X2ludGVycnVwdCAtIGhhbmRsZSB0aGUgaW50ZXJydXB0cyBmcm9tIGFuIDgzOTAKKyAqIEBpcnE6IGludGVycnVwdCBudW1iZXIKKyAqIEBkZXZfaWQ6IGEgcG9pbnRlciB0byB0aGUgbmV0X2RldmljZQorICogQHJlZ3M6IHVudXNlZAorICoKKyAqIEhhbmRsZSB0aGUgZXRoZXIgaW50ZXJmYWNlIGludGVycnVwdHMuIFdlIHB1bGwgcGFja2V0cyBmcm9tCisgKiB0aGUgODM5MCB2aWEgdGhlIGNhcmQgc3BlY2lmaWMgZnVuY3Rpb25zIGFuZCBmaXJlIHRoZW0gYXQgdGhlIG5ldHdvcmtpbmcKKyAqIHN0YWNrLiBXZSBhbHNvIGhhbmRsZSB0cmFuc21pdCBjb21wbGV0aW9ucyBhbmQgd2FrZSB0aGUgdHJhbnNtaXQgcGF0aCBpZgorICogbmVjZXNzYXJ5LiBXZSBhbHNvIHVwZGF0ZSB0aGUgY291bnRlcnMgYW5kIGRvIG90aGVyIGhvdXNla2VlcGluZyBhcworICogbmVlZGVkLgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBheF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlsb25nIGU4MzkwX2Jhc2U7CisJaW50IGludGVycnVwdHMsIG5yX3NlcnZpY2VkID0gMCwgaTsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbDsKKyAgICAJaW50IGhhbmRsZWQgPSAwOworCisJaWYgKGRldiA9PSBOVUxMKSAKKwl7CisJCXByaW50ayAoIm5ldF9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisgICAgCisJZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCWVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qCisJICoJUHJvdGVjdCB0aGUgaXJxIHRlc3QgdG9vLgorCSAqLworCSAKKwlzcGluX2xvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCisJaWYgKGVpX2xvY2FsLT5pcnFsb2NrKSAKKwl7CisjaWYgMSAvKiBUaGlzIG1pZ2h0IGp1c3QgYmUgYW4gaW50ZXJydXB0IGZvciBhIFBDSSBkZXZpY2Ugc2hhcmluZyB0aGlzIGxpbmUgKi8KKwkJLyogVGhlICJpcnFsb2NrIiBjaGVjayBpcyBvbmx5IGZvciB0ZXN0aW5nLiAqLworCQlwcmludGsoZWlfbG9jYWwtPmlycWxvY2sKKwkJCSAgID8gIiVzOiBJbnRlcnJ1cHRlZCB3aGlsZSBpbnRlcnJ1cHRzIGFyZSBtYXNrZWQhIGlzcj0lIzJ4IGltcj0lIzJ4LlxuIgorCQkJICAgOiAiJXM6IFJlZW50ZXJpbmcgdGhlIGludGVycnVwdCBoYW5kbGVyISBpc3I9JSMyeCBpbXI9JSMyeC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSVNSKSwKKwkJCSAgIGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSU1SKSk7CisjZW5kaWYKKwkJc3Bpbl91bmxvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorICAgIAorCWlmIChlaV9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJydXB0KGlzcj0lIzIuMngpLlxuIiwgZGV2LT5uYW1lLAorCQkJICAgaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JU1IpKTsKKworCW91dGJfcCgweDAwLCBlODM5MF9iYXNlICsgRU4wX0lTUik7CisJZWlfbG9jYWwtPmlycWxvY2sgPSAxOworICAgCisJLyogISFBc3N1bXB0aW9uISEgLS0gd2Ugc3RheSBpbiBwYWdlIDAuCSBEb24ndCBicmVhayB0aGlzLiAqLworCXdoaWxlICgoaW50ZXJydXB0cyA9IGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSVNSKSkgIT0gMAorCQkgICAmJiArK25yX3NlcnZpY2VkIDwgTUFYX1NFUlZJQ0UpIAorCXsKKwkJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikgfHwgKGludGVycnVwdHMgPT0gMHhmZikpIHsKKwkJCWlmIChlaV9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludGVycnVwdCBmcm9tIHN0b3BwZWQgY2FyZFxuIiwgZGV2LT5uYW1lKTsKKwkJCW91dGJfcChpbnRlcnJ1cHRzLCBlODM5MF9iYXNlICsgRU4wX0lTUik7CisJCQlpbnRlcnJ1cHRzID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWhhbmRsZWQgPSAxOworCisJCS8qIEFYODgxOTAgYnVnIGZpeC4gKi8KKwkJb3V0Yl9wKGludGVycnVwdHMsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCWlmICghKGluYihlODM5MF9iYXNlICsgRU4wX0lTUikgJiBpbnRlcnJ1cHRzKSkKKwkJCQlicmVhazsKKwkJCW91dGJfcCgwLCBlODM5MF9iYXNlICsgRU4wX0lTUik7CisJCQlvdXRiX3AoaW50ZXJydXB0cywgZTgzOTBfYmFzZSArIEVOMF9JU1IpOworCQl9CisJCWlmIChpbnRlcnJ1cHRzICYgRU5JU1JfT1ZFUikgCisJCQllaV9yeF9vdmVycnVuKGRldik7CisJCWVsc2UgaWYgKGludGVycnVwdHMgJiAoRU5JU1JfUlgrRU5JU1JfUlhfRVJSKSkgCisJCXsKKwkJCS8qIEdvdCBhIGdvb2QgKD8pIHBhY2tldC4gKi8KKwkJCWVpX3JlY2VpdmUoZGV2KTsKKwkJfQorCQkvKiBQdXNoIHRoZSBuZXh0IHRvLXRyYW5zbWl0IHBhY2tldCB0aHJvdWdoLiAqLworCQlpZiAoaW50ZXJydXB0cyAmIEVOSVNSX1RYKQorCQkJZWlfdHhfaW50cihkZXYpOworCQllbHNlIGlmIChpbnRlcnJ1cHRzICYgRU5JU1JfVFhfRVJSKQorCQkJZWlfdHhfZXJyKGRldik7CisKKwkJaWYgKGludGVycnVwdHMgJiBFTklTUl9DT1VOVEVSUykgCisJCXsKKwkJCWVpX2xvY2FsLT5zdGF0LnJ4X2ZyYW1lX2Vycm9ycyArPSBpbmJfcChlODM5MF9iYXNlICsgRU4wX0NPVU5URVIwKTsKKwkJCWVpX2xvY2FsLT5zdGF0LnJ4X2NyY19lcnJvcnMgICArPSBpbmJfcChlODM5MF9iYXNlICsgRU4wX0NPVU5URVIxKTsKKwkJCWVpX2xvY2FsLT5zdGF0LnJ4X21pc3NlZF9lcnJvcnMrPSBpbmJfcChlODM5MF9iYXNlICsgRU4wX0NPVU5URVIyKTsKKwkJfQorCX0KKyAgICAKKwlpZiAoaW50ZXJydXB0cyAmJiBlaV9kZWJ1ZykgCisJeworCQloYW5kbGVkID0gMTsKKwkJaWYgKG5yX3NlcnZpY2VkID49IE1BWF9TRVJWSUNFKSAKKwkJeworCQkJLyogMHhGRiBpcyB2YWxpZCBmb3IgYSBjYXJkIHJlbW92YWwgKi8KKwkJCWlmKGludGVycnVwdHMhPTB4RkYpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtdWNoIHdvcmsgYXQgaW50ZXJydXB0LCBzdGF0dXMgJSMyLjJ4XG4iLAorCQkJCSAgIGRldi0+bmFtZSwgaW50ZXJydXB0cyk7CisJCQlvdXRiX3AoRU5JU1JfQUxMLCBlODM5MF9iYXNlICsgRU4wX0lTUik7IC8qIEFjay4gbW9zdCBpbnRycy4gKi8KKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmtub3duIGludGVycnVwdCAlIzJ4XG4iLCBkZXYtPm5hbWUsIGludGVycnVwdHMpOworCQkJb3V0Yl9wKDB4ZmYsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrLiBhbGwgaW50cnMuICovCisJCX0KKwl9CisKKwkvKiBUdXJuIDgzOTAgaW50ZXJydXB0cyBiYWNrIG9uLiAqLworCWVpX2xvY2FsLT5pcnFsb2NrID0gMDsKKwlvdXRiX3AoRU5JU1JfQUxMLCBlODM5MF9iYXNlICsgRU4wX0lNUik7CisKKwlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qKgorICogZWlfdHhfZXJyIC0gaGFuZGxlIHRyYW5zbWl0dGVyIGVycm9yCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB3aGljaCB0aHJldyB0aGUgZXhjZXB0aW9uCisgKgorICogQSB0cmFuc21pdHRlciBlcnJvciBoYXMgaGFwcGVuZWQuIE1vc3QgbGlrZWx5IGV4Y2VzcyBjb2xsaXNpb25zICh3aGljaAorICogaXMgYSBmYWlybHkgbm9ybWFsIGNvbmRpdGlvbikuIElmIHRoZSBlcnJvciBpcyBvbmUgd2hlcmUgdGhlIFR4IHdpbGwKKyAqIGhhdmUgYmVlbiBhYm9ydGVkLCB3ZSB0cnkgYW5kIHNlbmQgYW5vdGhlciBvbmUgcmlnaHQgYXdheSwgaW5zdGVhZCBvZgorICogbGV0dGluZyB0aGUgZmFpbGVkIHBhY2tldCBzaXQgYW5kIGNvbGxlY3QgZHVzdCBpbiB0aGUgVHggYnVmZmVyLiBUaGlzCisgKiBpcyBhIG11Y2ggYmV0dGVyIHNvbHV0aW9uIGFzIGl0IGF2b2lkcyBrZXJuZWwgYmFzZWQgVHggdGltZW91dHMsIGFuZAorICogYW4gdW5uZWNlc3NhcnkgY2FyZCByZXNldC4KKyAqCisgKiBDYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKworc3RhdGljIHZvaWQgZWlfdHhfZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgdHhzciA9IGluYl9wKGU4MzkwX2Jhc2UrRU4wX1RTUik7CisJdW5zaWduZWQgY2hhciB0eF93YXNfYWJvcnRlZCA9IHR4c3IgJiAoRU5UU1JfQUJUK0VOVFNSX0ZVKTsKKworI2lmZGVmIFZFUkJPU0VfRVJST1JfRFVNUAorCXByaW50ayhLRVJOX0RFQlVHICIlczogdHJhbnNtaXR0ZXIgZXJyb3IgKCUjMngpOiAiLCBkZXYtPm5hbWUsIHR4c3IpOworCWlmICh0eHNyICYgRU5UU1JfQUJUKQorCQlwcmludGsoImV4Y2Vzcy1jb2xsaXNpb25zICIpOworCWlmICh0eHNyICYgRU5UU1JfTkQpCisJCXByaW50aygibm9uLWRlZmVycmFsICIpOworCWlmICh0eHNyICYgRU5UU1JfQ1JTKQorCQlwcmludGsoImxvc3QtY2FycmllciAiKTsKKwlpZiAodHhzciAmIEVOVFNSX0ZVKQorCQlwcmludGsoIkZJRk8tdW5kZXJydW4gIik7CisJaWYgKHR4c3IgJiBFTlRTUl9DREgpCisJCXByaW50aygibG9zdC1oZWFydGJlYXQgIik7CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKwlpZiAodHhfd2FzX2Fib3J0ZWQpCisJCWVpX3R4X2ludHIoZGV2KTsKKwllbHNlIAorCXsKKwkJZWlfbG9jYWwtPnN0YXQudHhfZXJyb3JzKys7CisJCWlmICh0eHNyICYgRU5UU1JfQ1JTKSBlaV9sb2NhbC0+c3RhdC50eF9jYXJyaWVyX2Vycm9ycysrOworCQlpZiAodHhzciAmIEVOVFNSX0NESCkgZWlfbG9jYWwtPnN0YXQudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQlpZiAodHhzciAmIEVOVFNSX09XQykgZWlfbG9jYWwtPnN0YXQudHhfd2luZG93X2Vycm9ycysrOworCX0KK30KKworLyoqCisgKiBlaV90eF9pbnRyIC0gdHJhbnNtaXQgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIGZvciB3aGljaCB0eCBpbnRyIGlzIGhhbmRsZWQKKyAqCisgKiBXZSBoYXZlIGZpbmlzaGVkIGEgdHJhbnNtaXQ6IGNoZWNrIGZvciBlcnJvcnMgYW5kIHRoZW4gdHJpZ2dlciB0aGUgbmV4dAorICogcGFja2V0IHRvIGJlIHNlbnQuIENhbGxlZCB3aXRoIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgdm9pZCBlaV90eF9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCWludCBzdGF0dXMgPSBpbmIoZTgzOTBfYmFzZSArIEVOMF9UU1IpOworICAgIAorCS8qCisJICogVGhlcmUgYXJlIHR3byBUeCBidWZmZXJzLCBzZWUgd2hpY2ggb25lIGZpbmlzaGVkLCBhbmQgdHJpZ2dlcgorCSAqIHRoZSBzZW5kIG9mIGFub3RoZXIgb25lIGlmIGl0IGV4aXN0cy4KKwkgKi8KKwllaV9sb2NhbC0+dHhxdWV1ZS0tOworCisJaWYgKGVpX2xvY2FsLT50eDEgPCAwKSAKKwl7CisJCWlmIChlaV9sb2NhbC0+bGFzdHR4ICE9IDEgJiYgZWlfbG9jYWwtPmxhc3R0eCAhPSAtMSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJvZ3VzIGxhc3RfdHhfYnVmZmVyICVkLCB0eDE9JWQuXG4iLAorCQkJCWVpX2xvY2FsLT5uYW1lLCBlaV9sb2NhbC0+bGFzdHR4LCBlaV9sb2NhbC0+dHgxKTsKKwkJZWlfbG9jYWwtPnR4MSA9IDA7CisJCWlmIChlaV9sb2NhbC0+dHgyID4gMCkgCisJCXsKKwkJCWVpX2xvY2FsLT50eGluZyA9IDE7CisJCQlOUzgzOTBfdHJpZ2dlcl9zZW5kKGRldiwgZWlfbG9jYWwtPnR4MiwgZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UgKyA2KTsKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJZWlfbG9jYWwtPnR4MiA9IC0xLAorCQkJZWlfbG9jYWwtPmxhc3R0eCA9IDI7CisJCX0KKwkJZWxzZSBlaV9sb2NhbC0+bGFzdHR4ID0gMjAsIGVpX2xvY2FsLT50eGluZyA9IDA7CQorCX0KKwllbHNlIGlmIChlaV9sb2NhbC0+dHgyIDwgMCkgCisJeworCQlpZiAoZWlfbG9jYWwtPmxhc3R0eCAhPSAyICAmJiAgZWlfbG9jYWwtPmxhc3R0eCAhPSAtMikKKwkJCXByaW50aygiJXM6IGJvZ3VzIGxhc3RfdHhfYnVmZmVyICVkLCB0eDI9JWQuXG4iLAorCQkJCWVpX2xvY2FsLT5uYW1lLCBlaV9sb2NhbC0+bGFzdHR4LCBlaV9sb2NhbC0+dHgyKTsKKwkJZWlfbG9jYWwtPnR4MiA9IDA7CisJCWlmIChlaV9sb2NhbC0+dHgxID4gMCkgCisJCXsKKwkJCWVpX2xvY2FsLT50eGluZyA9IDE7CisJCQlOUzgzOTBfdHJpZ2dlcl9zZW5kKGRldiwgZWlfbG9jYWwtPnR4MSwgZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UpOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQllaV9sb2NhbC0+dHgxID0gLTE7CisJCQllaV9sb2NhbC0+bGFzdHR4ID0gMTsKKwkJfQorCQllbHNlCisJCQllaV9sb2NhbC0+bGFzdHR4ID0gMTAsIGVpX2xvY2FsLT50eGluZyA9IDA7CisJfQorLy8JZWxzZSBwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5leHBlY3RlZCBUWC1kb25lIGludGVycnVwdCwgbGFzdHR4PSVkLlxuIiwKKy8vCQkJZGV2LT5uYW1lLCBlaV9sb2NhbC0+bGFzdHR4KTsKKworCS8qIE1pbmltaXplIFR4IGxhdGVuY3k6IHVwZGF0ZSB0aGUgc3RhdGlzdGljcyBhZnRlciB3ZSByZXN0YXJ0IFRYaW5nLiAqLworCWlmIChzdGF0dXMgJiBFTlRTUl9DT0wpCisJCWVpX2xvY2FsLT5zdGF0LmNvbGxpc2lvbnMrKzsKKwlpZiAoc3RhdHVzICYgRU5UU1JfUFRYKQorCQllaV9sb2NhbC0+c3RhdC50eF9wYWNrZXRzKys7CisJZWxzZSAKKwl7CisJCWVpX2xvY2FsLT5zdGF0LnR4X2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgRU5UU1JfQUJUKSAKKwkJeworCQkJZWlfbG9jYWwtPnN0YXQudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWVpX2xvY2FsLT5zdGF0LmNvbGxpc2lvbnMgKz0gMTY7CisJCX0KKwkJaWYgKHN0YXR1cyAmIEVOVFNSX0NSUykgCisJCQllaV9sb2NhbC0+c3RhdC50eF9jYXJyaWVyX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgRU5UU1JfRlUpIAorCQkJZWlfbG9jYWwtPnN0YXQudHhfZmlmb19lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIEVOVFNSX0NESCkKKwkJCWVpX2xvY2FsLT5zdGF0LnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIEVOVFNSX09XQykKKwkJCWVpX2xvY2FsLT5zdGF0LnR4X3dpbmRvd19lcnJvcnMrKzsKKwl9CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKioKKyAqIGVpX3JlY2VpdmUgLSByZWNlaXZlIHNvbWUgcGFja2V0cworICogQGRldjogbmV0d29yayBkZXZpY2Ugd2l0aCB3aGljaCByZWNlaXZlIHdpbGwgYmUgcnVuCisgKgorICogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuIAorICogQ2FsbGVkIHdpdGggbG9jayBoZWxkLgorICovCisKK3N0YXRpYyB2b2lkIGVpX3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgY2hhciByeGluZ19wYWdlLCB0aGlzX2ZyYW1lLCBuZXh0X2ZyYW1lOworCXVuc2lnbmVkIHNob3J0IGN1cnJlbnRfb2Zmc2V0OworCWludCByeF9wa3RfY291bnQgPSAwOworCXN0cnVjdCBlODM5MF9wa3RfaGRyIHJ4X2ZyYW1lOworICAgIAorCXdoaWxlICgrK3J4X3BrdF9jb3VudCA8IDEwKSAKKwl7CisJCWludCBwa3RfbGVuLCBwa3Rfc3RhdDsKKwkJCisJCS8qIEdldCB0aGUgcnggcGFnZSAoaW5jb21pbmcgcGFja2V0IHBvaW50ZXIpLiAqLworCQlyeGluZ19wYWdlID0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMV9DVVJQQUcgLTEpOworCQkKKwkJLyogUmVtb3ZlIG9uZSBmcmFtZSBmcm9tIHRoZSByaW5nLiAgQm91bmRhcnkgaXMgYWx3YXlzIGEgcGFnZSBiZWhpbmQuICovCisJCXRoaXNfZnJhbWUgPSBpbmJfcChlODM5MF9iYXNlICsgRU4wX0JPVU5EQVJZKSArIDE7CisJCWlmICh0aGlzX2ZyYW1lID49IGVpX2xvY2FsLT5zdG9wX3BhZ2UpCisJCQl0aGlzX2ZyYW1lID0gZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2U7CisJCQorCQkvKiBTb21lZGF5IHdlJ2xsIG9taXQgdGhlIHByZXZpb3VzLCBpZmYgd2UgbmV2ZXIgZ2V0IHRoaXMgbWVzc2FnZS4KKwkJICAgKFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjbG9uZSBjbGFpbWVkIHRvIGhhdmUgYSBwcm9ibGVtLikgIAorCQkgICAKKwkJICAgS2VlcCBxdWlldCBpZiBpdCBsb29rcyBsaWtlIGEgY2FyZCByZW1vdmFsLiBPbmUgcHJvYmxlbSBoZXJlCisJCSAgIGlzIHRoYXQgc29tZSBjbG9uZXMgY3Jhc2ggaW4gcm91Z2hseSB0aGUgc2FtZSB3YXkuCisJCSAqLworCQlpZiAoZWlfZGVidWcgPiAwICAmJiAgdGhpc19mcmFtZSAhPSBlaV9sb2NhbC0+Y3VycmVudF9wYWdlICYmICh0aGlzX2ZyYW1lIT0weDAgfHwgcnhpbmdfcGFnZSE9MHhGRikpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtaXNtYXRjaGVkIHJlYWQgcGFnZSBwb2ludGVycyAlMnggdnMgJTJ4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHRoaXNfZnJhbWUsIGVpX2xvY2FsLT5jdXJyZW50X3BhZ2UpOworCQkKKwkJaWYgKHRoaXNfZnJhbWUgPT0gcnhpbmdfcGFnZSkJLyogUmVhZCBhbGwgdGhlIGZyYW1lcz8gKi8KKwkJCWJyZWFrOwkJCQkvKiBEb25lIGZvciBub3cgKi8KKwkJCisJCWN1cnJlbnRfb2Zmc2V0ID0gdGhpc19mcmFtZSA8PCA4OworCQllaV9nZXRfODM5MF9oZHIoZGV2LCAmcnhfZnJhbWUsIHRoaXNfZnJhbWUpOworCQkKKwkJcGt0X2xlbiA9IHJ4X2ZyYW1lLmNvdW50IC0gc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKTsKKwkJcGt0X3N0YXQgPSByeF9mcmFtZS5zdGF0dXM7CisJCQorCQluZXh0X2ZyYW1lID0gdGhpc19mcmFtZSArIDEgKyAoKHBrdF9sZW4rNCk+PjgpOworCQkKKwkJaWYgKHBrdF9sZW4gPCA2MCAgfHwgIHBrdF9sZW4gPiAxNTE4KSAKKwkJeworCQkJaWYgKGVpX2RlYnVnKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYm9ndXMgcGFja2V0IHNpemU6ICVkLCBzdGF0dXM9JSMyeCBueHBnPSUjMnguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHJ4X2ZyYW1lLmNvdW50LCByeF9mcmFtZS5zdGF0dXMsCisJCQkJCSAgIHJ4X2ZyYW1lLm5leHQpOworCQkJZWlfbG9jYWwtPnN0YXQucnhfZXJyb3JzKys7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9sZW5ndGhfZXJyb3JzKys7CisJCX0KKwkJIGVsc2UgaWYgKChwa3Rfc3RhdCAmIDB4MEYpID09IEVOUlNSX1JYT0spIAorCQl7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMik7CisJCQlpZiAoc2tiID09IE5VTEwpIAorCQkJeworCQkJCWlmIChlaV9kZWJ1ZyA+IDEpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ291bGRuJ3QgYWxsb2NhdGUgYSBza19idWZmIG9mIHNpemUgJWQuXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKwkJCQllaV9sb2NhbC0+c3RhdC5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc2tiX3Jlc2VydmUoc2tiLDIpOwkvKiBJUCBoZWFkZXJzIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsJLyogTWFrZSByb29tICovCisJCQkJZWlfYmxvY2tfaW5wdXQoZGV2LCBwa3RfbGVuLCBza2IsIGN1cnJlbnRfb2Zmc2V0ICsgc2l6ZW9mKHJ4X2ZyYW1lKSk7CisJCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJZWlfbG9jYWwtPnN0YXQucnhfcGFja2V0cysrOworCQkJCWVpX2xvY2FsLT5zdGF0LnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQkJaWYgKHBrdF9zdGF0ICYgRU5SU1JfUEhZKQorCQkJCQllaV9sb2NhbC0+c3RhdC5tdWx0aWNhc3QrKzsKKwkJCX0KKwkJfSAKKwkJZWxzZSAKKwkJeworCQkJaWYgKGVpX2RlYnVnKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYm9ndXMgcGFja2V0OiBzdGF0dXM9JSMyeCBueHBnPSUjMnggc2l6ZT0lZFxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCByeF9mcmFtZS5zdGF0dXMsIHJ4X2ZyYW1lLm5leHQsCisJCQkJCSAgIHJ4X2ZyYW1lLmNvdW50KTsKKwkJCWVpX2xvY2FsLT5zdGF0LnJ4X2Vycm9ycysrOworCQkJLyogTkI6IFRoZSBOSUMgY291bnRzIENSQywgZnJhbWUgYW5kIG1pc3NlZCBlcnJvcnMuICovCisJCQlpZiAocGt0X3N0YXQgJiBFTlJTUl9GTykKKwkJCQllaV9sb2NhbC0+c3RhdC5yeF9maWZvX2Vycm9ycysrOworCQl9CisJCW5leHRfZnJhbWUgPSByeF9mcmFtZS5uZXh0OworCQkKKwkJLyogVGhpcyBfc2hvdWxkXyBuZXZlciBoYXBwZW46IGl0J3MgaGVyZSBmb3IgYXZvaWRpbmcgYmFkIGNsb25lcy4gKi8KKwkJaWYgKG5leHRfZnJhbWUgPj0gZWlfbG9jYWwtPnN0b3BfcGFnZSkgeworCQkJcHJpbnRrKCIlczogbmV4dCBmcmFtZSBpbmNvbnNpc3RlbmN5LCAlIzJ4XG4iLCBkZXYtPm5hbWUsCisJCQkJICAgbmV4dF9mcmFtZSk7CisJCQluZXh0X2ZyYW1lID0gZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2U7CisJCX0KKwkJZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSA9IG5leHRfZnJhbWU7CisJCW91dGJfcChuZXh0X2ZyYW1lLTEsIGU4MzkwX2Jhc2UrRU4wX0JPVU5EQVJZKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogZWlfcnhfb3ZlcnJ1biAtIGhhbmRsZSByZWNlaXZlciBvdmVycnVuCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB3aGljaCB0aHJldyBleGNlcHRpb24KKyAqCisgKiBXZSBoYXZlIGEgcmVjZWl2ZXIgb3ZlcnJ1bjogd2UgaGF2ZSB0byBraWNrIHRoZSA4MzkwIHRvIGdldCBpdCBzdGFydGVkCisgKiBhZ2Fpbi4gUHJvYmxlbSBpcyB0aGF0IHlvdSBoYXZlIHRvIGtpY2sgaXQgZXhhY3RseSBhcyBOUyBwcmVzY3JpYmVzIGluCisgKiB0aGUgdXBkYXRlZCBkYXRhc2hlZXRzLCBvciAidGhlIE5JQyBtYXkgYWN0IGluIGFuIHVucHJlZGljdGFibGUgbWFubmVyLiIKKyAqIFRoaXMgaW5jbHVkZXMgY2F1c2luZyAidGhlIE5JQyB0byBkZWZlciBpbmRlZmluaXRlbHkgd2hlbiBpdCBpcyBzdG9wcGVkCisgKiBvbiBhIGJ1c3kgbmV0d29yay4iICBVZ2guCisgKiBDYWxsZWQgd2l0aCBsb2NrIGhlbGQuIERvbid0IGNhbGwgdGhpcyB3aXRoIHRoZSBpbnRlcnJ1cHRzIG9mZiBvciB5b3VyCisgKiBjb21wdXRlciB3aWxsIGhhdGUgeW91IC0gaXQgdGFrZXMgMTBtcyBvciBzby4gCisgKi8KKworc3RhdGljIHZvaWQgZWlfcnhfb3ZlcnJ1bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWF4bmV0X2Rldl90ICppbmZvID0gKGF4bmV0X2Rldl90ICopZGV2OworCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGNoYXIgd2FzX3R4aW5nLCBtdXN0X3Jlc2VuZCA9IDA7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworICAgIAorCS8qCisJICogUmVjb3JkIHdoZXRoZXIgYSBUeCB3YXMgaW4gcHJvZ3Jlc3MgYW5kIHRoZW4gaXNzdWUgdGhlCisJICogc3RvcCBjb21tYW5kLgorCSAqLworCXdhc190eGluZyA9IGluYl9wKGU4MzkwX2Jhc2UrRTgzOTBfQ01EKSAmIEU4MzkwX1RSQU5TOworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7CisgICAgCisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWNlaXZlciBvdmVycnVuLlxuIiwgZGV2LT5uYW1lKTsKKwllaV9sb2NhbC0+c3RhdC5yeF9vdmVyX2Vycm9ycysrOworICAgIAorCS8qIAorCSAqIFdhaXQgYSBmdWxsIFR4IHRpbWUgKDEuMm1zKSArIHNvbWUgZ3VhcmQgdGltZSwgTlMgc2F5cyAxLjZtcyB0b3RhbC4KKwkgKiBFYXJseSBkYXRhc2hlZXRzIHNhaWQgdG8gcG9sbCB0aGUgcmVzZXQgYml0LCBidXQgbm93IHRoZXkgc2F5IHRoYXQKKwkgKiBpdCAiaXMgbm90IGEgcmVsaWFibGUgaW5kaWNhdG9yIGFuZCBzdWJzZXF1ZW50bHkgc2hvdWxkIGJlIGlnbm9yZWQuIgorCSAqIFdlIHdhaXQgYXQgbGVhc3QgMTBtcy4KKwkgKi8KKworCW1kZWxheSgxMCk7CisKKwkvKgorCSAqIFJlc2V0IFJCQ1JbMDFdIGJhY2sgdG8gemVybyBhcyBwZXIgbWFnaWMgaW5jYW50YXRpb24uCisJICovCisJb3V0Yl9wKDB4MDAsIGU4MzkwX2Jhc2UrRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDB4MDAsIGU4MzkwX2Jhc2UrRU4wX1JDTlRISSk7CisKKwkvKgorCSAqIFNlZSBpZiBhbnkgVHggd2FzIGludGVycnVwdGVkIG9yIG5vdC4gQWNjb3JkaW5nIHRvIE5TLCB0aGlzCisJICogc3RlcCBpcyB2aXRhbCwgYW5kIHNraXBwaW5nIGl0IHdpbGwgY2F1c2Ugbm8gZW5kIG9mIGhhdm9jLgorCSAqLworCisJaWYgKHdhc190eGluZykKKwl7IAorCQl1bnNpZ25lZCBjaGFyIHR4X2NvbXBsZXRlZCA9IGluYl9wKGU4MzkwX2Jhc2UrRU4wX0lTUikgJiAoRU5JU1JfVFgrRU5JU1JfVFhfRVJSKTsKKwkJaWYgKCF0eF9jb21wbGV0ZWQpCisJCQltdXN0X3Jlc2VuZCA9IDE7CisJfQorCisJLyoKKwkgKiBIYXZlIHRvIGVudGVyIGxvb3BiYWNrIG1vZGUgYW5kIHRoZW4gcmVzdGFydCB0aGUgTklDIGJlZm9yZQorCSAqIHlvdSBhcmUgYWxsb3dlZCB0byBzbHVycCBwYWNrZXRzIHVwIG9mZiB0aGUgcmluZy4KKwkgKi8KKwlvdXRiX3AoRTgzOTBfVFhPRkYsIGU4MzkwX2Jhc2UgKyBFTjBfVFhDUik7CisJb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAgKyBFODM5MF9TVEFSVCwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7CisKKwkvKgorCSAqIENsZWFyIHRoZSBSeCByaW5nIG9mIGFsbCB0aGUgZGVicmlzLCBhbmQgYWNrIHRoZSBpbnRlcnJ1cHQuCisJICovCisJZWlfcmVjZWl2ZShkZXYpOworCisJLyoKKwkgKiBMZWF2ZSBsb29wYmFjayBtb2RlLCBhbmQgcmVzZW5kIGFueSBwYWNrZXQgdGhhdCBnb3Qgc3RvcHBlZC4KKwkgKi8KKwlvdXRiX3AoRTgzOTBfVFhDT05GSUcgfCBpbmZvLT5kdXBsZXhfZmxhZywgZTgzOTBfYmFzZSArIEVOMF9UWENSKTsgCisJaWYgKG11c3RfcmVzZW5kKQorICAgIAkJb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAgKyBFODM5MF9TVEFSVCArIEU4MzkwX1RSQU5TLCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKK30KKworLyoKKyAqCUNvbGxlY3QgdGhlIHN0YXRzLiBUaGlzIGlzIGNhbGxlZCB1bmxvY2tlZCBhbmQgZnJvbSBzZXZlcmFsIGNvbnRleHRzLgorICovCisgCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgCisJLyogSWYgdGhlIGNhcmQgaXMgc3RvcHBlZCwganVzdCByZXR1cm4gdGhlIHByZXNlbnQgc3RhdHMuICovCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAmZWlfbG9jYWwtPnN0YXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jayxmbGFncyk7CisJLyogUmVhZCB0aGUgY291bnRlciByZWdpc3RlcnMsIGFzc3VtaW5nIHdlIGFyZSBpbiBwYWdlIDAuICovCisJZWlfbG9jYWwtPnN0YXQucnhfZnJhbWVfZXJyb3JzICs9IGluYl9wKGlvYWRkciArIEVOMF9DT1VOVEVSMCk7CisJZWlfbG9jYWwtPnN0YXQucnhfY3JjX2Vycm9ycyAgICs9IGluYl9wKGlvYWRkciArIEVOMF9DT1VOVEVSMSk7CisJZWlfbG9jYWwtPnN0YXQucnhfbWlzc2VkX2Vycm9ycys9IGluYl9wKGlvYWRkciArIEVOMF9DT1VOVEVSMik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworICAgIAorCXJldHVybiAmZWlfbG9jYWwtPnN0YXQ7Cit9CisKKy8qKgorICogZG9fc2V0X211bHRpY2FzdF9saXN0IC0gc2V0L2NsZWFyIG11bHRpY2FzdCBmaWx0ZXIKKyAqIEBkZXY6IG5ldCBkZXZpY2UgZm9yIHdoaWNoIG11bHRpY2FzdCBmaWx0ZXIgaXMgYWRqdXN0ZWQKKyAqCisgKglTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4gTWF5IGJlIGNhbGxlZAorICoJZnJvbSBhIEJIIGluIDIuMS54LiBNdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2sgaGVsZC4gCisgKi8KKyAKK3N0YXRpYyB2b2lkIGRvX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisgIAlpZihkZXYtPmZsYWdzJklGRl9QUk9NSVNDKQorICAJCW91dGJfcChFODM5MF9SWENPTkZJRyB8IDB4NTgsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7CisJZWxzZSBpZihkZXYtPmZsYWdzJklGRl9BTExNVUxUSSB8fCBkZXYtPm1jX2xpc3QpCisgIAkJb3V0Yl9wKEU4MzkwX1JYQ09ORklHIHwgMHg0OCwgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsKKyAgCWVsc2UKKyAgCQlvdXRiX3AoRTgzOTBfUlhDT05GSUcgfCAweDQwLCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOworfQorCisvKgorICoJQ2FsbGVkIHdpdGhvdXQgbG9jayBoZWxkLiBUaGlzIGlzIGludm9rZWQgZnJvbSB1c2VyIGNvbnRleHQgYW5kIG1heQorICoJYmUgcGFyYWxsZWwgdG8ganVzdCBhYm91dCBldmVyeXRoaW5nIGVsc2UuIEl0cyBhbHNvIGZhaXJseSBxdWljayBhbmQKKyAqCW5vdCBjYWxsZWQgdG9vIG9mdGVuLiBNdXN0IHByb3RlY3QgYWdhaW5zdCBib3RoIGJoIGFuZCBpcnEgdXNlcnMKKyAqLworCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9sb2NrKGRldiksIGZsYWdzKTsKKwlkb19zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfbG9jayhkZXYpLCBmbGFncyk7Cit9CQorCisvKioKKyAqIGF4ZGV2X3NldHVwIC0gaW5pdCByZXN0IG9mIDgzOTAgZGV2aWNlIHN0cnVjdAorICogQGRldjogbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlIHRvIGluaXQKKyAqCisgKiBJbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSA4MzkwIGRldmljZSBzdHJ1Y3R1cmUuICBEbyBOT1QgX19pbml0CisgKiB0aGlzLCBhcyBpdCBpcyB1c2VkIGJ5IDgzOTAgYmFzZWQgbW9kdWxhciBkcml2ZXJzIHRvby4KKyAqLworCitzdGF0aWMgdm9pZCBheGRldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsOworCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50ayh2ZXJzaW9uXzgzOTApOworICAgIAorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCQkKKwllaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaW5pdCgmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisgICAgCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZWlfc3RhcnRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cwk9IGdldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisKKwlldGhlcl9zZXR1cChkZXYpOworfQorCisvKiBUaGlzIHBhZ2Ugb2YgZnVuY3Rpb25zIHNob3VsZCBiZSA4MzkwIGdlbmVyaWMgKi8KKy8qIEZvbGxvdyBOYXRpb25hbCBTZW1pJ3MgcmVjb21tZW5kYXRpb25zIGZvciBpbml0aWFsaXppbmcgdGhlICJOSUMiLiAqLworCisvKioKKyAqIEFYODgxOTBfaW5pdCAtIGluaXRpYWxpemUgODM5MCBoYXJkd2FyZQorICogQGRldjogbmV0d29yayBkZXZpY2UgdG8gaW5pdGlhbGl6ZQorICogQHN0YXJ0cDogYm9vbGVhbi4gIG5vbi16ZXJvIHZhbHVlIHRvIGluaXRpYXRlIGNoaXAgcHJvY2Vzc2luZworICoKKyAqCU11c3QgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkLgorICovCisKK3N0YXRpYyB2b2lkIEFYODgxOTBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhcnRwKQoreworCWF4bmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlpbnQgZW5kY2ZnID0gZWlfbG9jYWwtPndvcmQxNiA/ICgweDQ4IHwgRU5EQ0ZHX1dUUykgOiAweDQ4OworICAgIAorCWlmKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikhPTQpCisgICAgCQlwYW5pYygiODM5MC5jOiBoZWFkZXIgc3RydWN0IG1pc3BhY2tlZFxuIik7ICAgIAorCS8qIEZvbGxvdyBOYXRpb25hbCBTZW1pJ3MgcmVjb21tZW5kYXRpb25zIGZvciBpbml0aW5nIHRoZSBEUDgzOTAyLiAqLworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7IC8qIDB4MjEgKi8KKwlvdXRiX3AoZW5kY2ZnLCBlODM5MF9iYXNlICsgRU4wX0RDRkcpOwkvKiAweDQ4IG9yIDB4NDkgKi8KKwkvKiBDbGVhciB0aGUgcmVtb3RlIGJ5dGUgY291bnQgcmVnaXN0ZXJzLiAqLworCW91dGJfcCgweDAwLCAgZTgzOTBfYmFzZSArIEVOMF9SQ05UTE8pOworCW91dGJfcCgweDAwLCAgZTgzOTBfYmFzZSArIEVOMF9SQ05USEkpOworCS8qIFNldCB0byBtb25pdG9yIGFuZCBsb29wYmFjayBtb2RlIC0tIHRoaXMgaXMgdml0YWwhLiAqLworCW91dGJfcChFODM5MF9SWE9GRnwweDQwLCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOyAvKiAweDYwICovCisJb3V0Yl9wKEU4MzkwX1RYT0ZGLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOyAvKiAweDAyICovCisJLyogU2V0IHRoZSB0cmFuc21pdCBwYWdlIGFuZCByZWNlaXZlIHJpbmcuICovCisJb3V0Yl9wKGVpX2xvY2FsLT50eF9zdGFydF9wYWdlLCBlODM5MF9iYXNlICsgRU4wX1RQU1IpOworCWVpX2xvY2FsLT50eDEgPSBlaV9sb2NhbC0+dHgyID0gMDsKKwlvdXRiX3AoZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2UsIGU4MzkwX2Jhc2UgKyBFTjBfU1RBUlRQRyk7CisJb3V0Yl9wKGVpX2xvY2FsLT5zdG9wX3BhZ2UtMSwgZTgzOTBfYmFzZSArIEVOMF9CT1VOREFSWSk7CS8qIDNjNTAzIHNheXMgMHgzZixOUzB4MjYqLworCWVpX2xvY2FsLT5jdXJyZW50X3BhZ2UgPSBlaV9sb2NhbC0+cnhfc3RhcnRfcGFnZTsJCS8qIGFzc2VydCBib3VuZGFyeSsxICovCisJb3V0Yl9wKGVpX2xvY2FsLT5zdG9wX3BhZ2UsIGU4MzkwX2Jhc2UgKyBFTjBfU1RPUFBHKTsKKwkvKiBDbGVhciB0aGUgcGVuZGluZyBpbnRlcnJ1cHRzIGFuZCBtYXNrLiAqLworCW91dGJfcCgweEZGLCBlODM5MF9iYXNlICsgRU4wX0lTUik7CisJb3V0Yl9wKDB4MDAsICBlODM5MF9iYXNlICsgRU4wX0lNUik7CisgICAgCisJLyogQ29weSB0aGUgc3RhdGlvbiBhZGRyZXNzIGludG8gdGhlIERTODM5MCByZWdpc3RlcnMuICovCisKKwlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMSArIEU4MzkwX1NUT1AsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsgLyogMHg2MSAqLworCWZvcihpID0gMDsgaSA8IDY7IGkrKykgCisJeworCQlvdXRiX3AoZGV2LT5kZXZfYWRkcltpXSwgZTgzOTBfYmFzZSArIEVOMV9QSFlTX1NISUZUKGkpKTsKKwkJaWYoaW5iX3AoZTgzOTBfYmFzZSArIEVOMV9QSFlTX1NISUZUKGkpKSE9ZGV2LT5kZXZfYWRkcltpXSkKKwkJCXByaW50ayhLRVJOX0VSUiAiSHcuIGFkZHJlc3MgcmVhZC93cml0ZSBtaXNtYXAgJWRcbiIsaSk7CisJfQorCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgbXVsdGljYXN0IGxpc3QgdG8gYWNjZXB0LWFsbC4gIElmIHdlIGVuYWJsZSBtdWx0aWNhc3QKKwkgKiB0aGUgaGlnaGVyIGxldmVscyBjYW4gZG8gdGhlIGZpbHRlcmluZy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlvdXRiX3AoMHhmZiwgZTgzOTBfYmFzZSArIEVOMV9NVUxUICsgaSk7CisKKwlvdXRiX3AoZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2UsIGU4MzkwX2Jhc2UgKyBFTjFfQ1VSUEFHKTsKKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwllaV9sb2NhbC0+dHgxID0gZWlfbG9jYWwtPnR4MiA9IDA7CisJZWlfbG9jYWwtPnR4aW5nID0gMDsKKworCWlmIChzdGFydHApIAorCXsKKwkJb3V0Yl9wKDB4ZmYsICBlODM5MF9iYXNlICsgRU4wX0lTUik7CisJCW91dGJfcChFTklTUl9BTEwsICBlODM5MF9iYXNlICsgRU4wX0lNUik7CisJCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOworCQlvdXRiX3AoRTgzOTBfVFhDT05GSUcgfCBpbmZvLT5kdXBsZXhfZmxhZywKKwkJICAgICAgIGU4MzkwX2Jhc2UgKyBFTjBfVFhDUik7IC8qIHhtaXQgb24uICovCisJCS8qIDNjNTAzIFRlY2hNYW4gc2F5cyByeGNvbmZpZyBvbmx5IGFmdGVyIHRoZSBOSUMgaXMgc3RhcnRlZC4gKi8KKwkJb3V0Yl9wKEU4MzkwX1JYQ09ORklHIHwgMHg0MCwgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsgLyogcnggb24sICovCisJCWRvX3NldF9tdWx0aWNhc3RfbGlzdChkZXYpOwkvKiAocmUpbG9hZCB0aGUgbWNhc3QgdGFibGUgKi8KKwl9Cit9CisKKy8qIFRyaWdnZXIgYSB0cmFuc21pdCBzdGFydCwgYXNzdW1pbmcgdGhlIGxlbmd0aCBpcyB2YWxpZC4gCisgICBBbHdheXMgY2FsbGVkIHdpdGggdGhlIHBhZ2UgbG9jayBoZWxkICovCisgICAKK3N0YXRpYyB2b2lkIE5TODM5MF90cmlnZ2VyX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGxlbmd0aCwKKwkJCQkJCQkJaW50IHN0YXJ0X3BhZ2UpCit7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisgICAgCisJaWYgKGluYl9wKGU4MzkwX2Jhc2UpICYgRTgzOTBfVFJBTlMpIAorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyaWdnZXJfc2VuZCgpIGNhbGxlZCB3aXRoIHRoZSB0cmFuc21pdHRlciBidXN5LlxuIiwKKwkJCWRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJb3V0Yl9wKGxlbmd0aCAmIDB4ZmYsIGU4MzkwX2Jhc2UgKyBFTjBfVENOVExPKTsKKwlvdXRiX3AobGVuZ3RoID4+IDgsIGU4MzkwX2Jhc2UgKyBFTjBfVENOVEhJKTsKKwlvdXRiX3Aoc3RhcnRfcGFnZSwgZTgzOTBfYmFzZSArIEVOMF9UUFNSKTsKKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfVFJBTlMrRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9jb20yMDAyMF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2NvbTIwMDIwX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5NGUxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9jb20yMDAyMF9jcy5jCkBAIC0wLDAgKzEsNTA5IEBACisvKgorICogTGludXggQVJDbmV0IGRyaXZlciAtIENPTTIwMDIwIFBDTUNJQSBzdXBwb3J0CisgKiAKKyAqIFdyaXR0ZW4gMTk5NC0xOTk5IGJ5IEF2ZXJ5IFBlbm5hcnVuLAorICogICAgYmFzZWQgb24gYW4gSVNBIHZlcnNpb24gYnkgRGF2aWQgV29vZGhvdXNlLgorICogRGVyaXZlZCBmcm9tIGlibXRyX2NzLmMgYnkgU3RldmUgS2lwaXN6IChwY21jaWEtY3MgMy4xLjQpCisgKiAgICB3aGljaCB3YXMgZGVyaXZlZCBmcm9tIHBjbmV0X2NzLmMgYnkgRGF2aWQgSGluZHMuCisgKiBTb21lIGFkZGl0aW9uYWwgcG9ydGlvbnMgZGVyaXZlZCBmcm9tIHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiBTcGVjaWFsIHRoYW5rcyB0byBDb250ZW1wb3JhcnkgQ29udHJvbHMsIEluYy4gKHd3dy5jY29udHJvbHMuY29tKQorICogIGZvciBzcG9uc29yaW5nIHRoZSBmdXJ0aGVyIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgb3JpZ2luYWwgY29weXJpZ2h0IG9mIHNrZWxldG9uLmMgd2FzIGFzIGZvbGxvd3M6CisgKgorICogc2tlbGV0b24uYyBXcml0dGVuIDE5OTMgYnkgRG9uYWxkIEJlY2tlci4KKyAqIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBvbmx5IGJlIHVzZWQKKyAqIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogbW9kaWZpZWQgYnkgU1JDLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqIAorICogKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hhbmdlczoKKyAqIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiAtIDA4LzA4LzIwMDAKKyAqIC0gcmVvcmdhbml6ZSBrbWFsbG9jcyBpbiBjb20yMDAyMF9hdHRhY2gsIGNoZWNraW5nIGFsbCBmb3IgZmFpbHVyZQorICogICBhbmQgcmVsZWFzaW5nIHRoZSBwcmV2aW91cyBhbGxvY2F0aW9ucyBpZiBvbmUgZmFpbHMKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogRm9yIG1vcmUgZGV0YWlscywgc2VlIGRyaXZlcnMvbmV0L2FyY25ldC5jCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYXJjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY29tMjAwMjAuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIFZFUlNJT04gImFyY25ldDogQ09NMjAwMjAgUENNQ0lBIHN1cHBvcnQgbG9hZGVkLlxuIgorCisjaWZkZWYgUENNQ0lBX0RFQlVHCisKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCisKK3N0YXRpYyB2b2lkIHJlZ2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGNvdW50OworICAgIAorICAgIHByaW50aygiY29tMjAwMjAgcmVnaXN0ZXIgZHVtcDpcbiIpOworICAgIGZvciAoY291bnQgPSBpb2FkZHI7IGNvdW50IDwgaW9hZGRyICsgMTY7IGNvdW50KyspCisgICAgeworCWlmICghKGNvdW50ICUgMTYpKQorCSAgICBwcmludGsoIlxuJTA0WDogIiwgY291bnQpOworCXByaW50aygiJTAyWCAiLCBpbmIoY291bnQpKTsKKyAgICB9CisgICAgcHJpbnRrKCJcbiIpOworICAgIAorICAgIHByaW50aygiYnVmZmVyMCBkdW1wOlxuIik7CisJLyogc2V0IHVwIHRoZSBhZGRyZXNzIHJlZ2lzdGVyICovCisgICAgICAgIGNvdW50ID0gMDsKKwlvdXRiKChjb3VudCA+PiA4KSB8IFJEREFUQWZsYWcgfCBBVVRPSU5DZmxhZywgX0FERFJfSEkpOworCW91dGIoY291bnQgJiAweGZmLCBfQUREUl9MTyk7CisgICAgCisgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMjU2KzMyOyBjb3VudCsrKQorICAgIHsKKwlpZiAoIShjb3VudCAlIDE2KSkKKwkgICAgcHJpbnRrKCJcbiUwNFg6ICIsIGNvdW50KTsKKwkKKwkvKiBjb3B5IHRoZSBkYXRhICovCisJcHJpbnRrKCIlMDJYICIsIGluYihfTUVNREFUQSkpOworICAgIH0KKyAgICBwcmludGsoIlxuIik7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgZG8geyB9IHdoaWxlICgwKQorc3RhdGljIGlubGluZSB2b2lkIHJlZ2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeyB9CisKKyNlbmRpZgorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCB3aXRoICdpbnNtb2QnICovCisKK3N0YXRpYyBpbnQgbm9kZTsKK3N0YXRpYyBpbnQgdGltZW91dCA9IDM7CitzdGF0aWMgaW50IGJhY2twbGFuZTsKK3N0YXRpYyBpbnQgY2xvY2twOworc3RhdGljIGludCBjbG9ja207CisKK21vZHVsZV9wYXJhbShub2RlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oYmFja3BsYW5lLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNsb2NrcCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjbG9ja20sIGludCwgMCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGNvbTIwMDIwX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkIGNvbTIwMDIwX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50IGNvbTIwMDIwX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAiY29tMjAwMjBfY3MiOworCitzdGF0aWMgZGV2X2xpbmtfdCAqY29tMjAwMjBfYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgY29tMjAwMjBfZGV0YWNoKGRldl9saW5rX3QgKik7CisKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IGNvbTIwMDIwX2Rldl90IHsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqZGV2OworICAgIGRldl9ub2RlX3QgICAgICAgICAgbm9kZTsKK30gY29tMjAwMjBfZGV2X3Q7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgY29tMjAwMjBfYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAgICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgZGV2X2xpbmtfdCAqY29tMjAwMjBfYXR0YWNoKHZvaWQpCit7CisgICAgY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICBjb20yMDAyMF9kZXZfdCAqaW5mbzsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIGludCByZXQ7CisgICAgc3RydWN0IGFyY25ldF9sb2NhbCAqbHA7CisgICAgCisgICAgREVCVUcoMCwgImNvbTIwMDIwX2F0dGFjaCgpXG4iKTsKKworICAgIC8qIENyZWF0ZSBuZXcgbmV0d29yayBkZXZpY2UgKi8KKyAgICBsaW5rID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWxpbmspCisJcmV0dXJuIE5VTEw7CisKKyAgICBpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNvbTIwMDIwX2Rldl90KSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFpbmZvKQorCWdvdG8gZmFpbF9hbGxvY19pbmZvOworCisgICAgZGV2ID0gYWxsb2NfYXJjZGV2KCIiKTsKKyAgICBpZiAoIWRldikKKwlnb3RvIGZhaWxfYWxsb2NfZGV2OworCisgICAgbWVtc2V0KGluZm8sIDAsIHNpemVvZihzdHJ1Y3QgY29tMjAwMjBfZGV2X3QpKTsKKyAgICBtZW1zZXQobGluaywgMCwgc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSk7CisgICAgbHAgPSBkZXYtPnByaXY7CisgICAgbHAtPnRpbWVvdXQgPSB0aW1lb3V0OworICAgIGxwLT5iYWNrcGxhbmUgPSBiYWNrcGxhbmU7CisgICAgbHAtPmNsb2NrcCA9IGNsb2NrcDsKKyAgICBscC0+Y2xvY2ttID0gY2xvY2ttICYgMzsKKyAgICBscC0+aHcub3duZXIgPSBUSElTX01PRFVMRTsKKworICAgIC8qIGZpbGwgaW4gb3VyIG1vZHVsZSBwYXJhbWV0ZXJzIGFzIGRlZmF1bHRzICovCisgICAgZGV2LT5kZXZfYWRkclswXSA9IG5vZGU7CisKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OworICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDE2OworICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gMTY7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisgICAgbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IDUwOworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOworCisKKyAgICBsaW5rLT5pcnEuSW5zdGFuY2UgPSBpbmZvLT5kZXYgPSBkZXY7CisgICAgbGluay0+cHJpdiA9IGluZm87CisKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorICAgICAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisgICAgICAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisgICAgICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmNvbTIwMDIwX2V2ZW50OworICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworICAgICAgICBjb20yMDAyMF9kZXRhY2gobGluayk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBsaW5rOworCitmYWlsX2FsbG9jX2RldjoKKyAgICBrZnJlZShpbmZvKTsKK2ZhaWxfYWxsb2NfaW5mbzoKKyAgICBrZnJlZShsaW5rKTsKKyAgICByZXR1cm4gTlVMTDsKK30gLyogY29tMjAwMjBfYXR0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAgICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICAgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGNvbTIwMDIwX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBjb20yMDAyMF9kZXZfdCAqaW5mbyA9IGxpbmstPnByaXY7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7IAorICAgIAorICAgIERFQlVHKDEsImRldGFjaC4uLlxuIik7CisKKyAgICBERUJVRygwLCAiY29tMjAwMjBfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKworICAgIC8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKyAgICAgICAgaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKyAgICBpZiAoKmxpbmtwID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIGRldiA9IGluZm8tPmRldjsKKworICAgIGlmIChsaW5rLT5kZXYpIHsKKwlERUJVRygxLCJ1bnJlZ2lzdGVyLi4uXG4iKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJICAgIAorCS8qCisJICogdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSByZWdpc3RlciBvdXIgSVJRIHNlcGFyYXRlbHkKKwkgKiBmcm9tIGNhcmQgc2VydmljZXMuCisJICovCisJaWYgKGRldi0+aXJxKQorCSAgICBmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKyAgICB9CisKKyAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorICAgICAgICBjb20yMDAyMF9yZWxlYXNlKGxpbmspOworCisgICAgaWYgKGxpbmstPmhhbmRsZSkKKyAgICAgICAgcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBiaXRzICovCisgICAgREVCVUcoMSwidW5saW5raW5nLi4uXG4iKTsKKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGlmIChsaW5rLT5wcml2KQorICAgIHsKKwlkZXYgPSBpbmZvLT5kZXY7CisJaWYgKGRldikKKwl7CisJICAgIERFQlVHKDEsImtmcmVlLi4uXG4iKTsKKwkgICAgZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisJREVCVUcoMSwia2ZyZWUyLi4uXG4iKTsKKwlrZnJlZShpbmZvKTsKKyAgICB9CisgICAgREVCVUcoMSwia2ZyZWUzLi4uXG4iKTsKKyAgICBrZnJlZShsaW5rKTsKKworfSAvKiBjb20yMDAyMF9kZXRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBjb20yMDAyMF9jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKKyAgICBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAgICBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGNvbTIwMDIwX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwOworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGU7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIGNvbTIwMDIwX2Rldl90ICppbmZvOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgaW50IGksIGxhc3RfcmV0LCBsYXN0X2ZuOworICAgIHVfY2hhciBidWZbNjRdOworICAgIGludCBpb2FkZHI7CisKKyAgICBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgaW5mbyA9IGxpbmstPnByaXY7CisgICAgZGV2ID0gaW5mby0+ZGV2OworCisgICAgREVCVUcoMSwiY29uZmlnLi4uXG4iKTsKKworICAgIERFQlVHKDAsICJjb20yMDAyMF9jb25maWcoMHglcClcbiIsIGxpbmspOworCisgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OworICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisKKyAgICAvKiBDb25maWd1cmUgY2FyZCAqLworICAgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKyAgICBERUJVRygxLCJhcmNuZXQ6IGJhc2Vwb3J0MSBpcyAlWGhcbiIsIGxpbmstPmlvLkJhc2VQb3J0MSk7CisgICAgaSA9ICFDU19TVUNDRVNTOworICAgIGlmICghbGluay0+aW8uQmFzZVBvcnQxKQorICAgIHsKKwlmb3IgKGlvYWRkciA9IDB4MTAwOyBpb2FkZHIgPCAweDQwMDsgaW9hZGRyICs9IDB4MTApCisJeworCSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBpb2FkZHI7CisJICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJICAgIGlmIChpID09IENTX1NVQ0NFU1MpCisJCWJyZWFrOworCX0KKyAgICB9CisgICAgZWxzZQorCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgCisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykKKyAgICB7CisJREVCVUcoMSwiYXJjbmV0OiByZXF1ZXN0SU8gZmFpbGVkIHRvdGFsbHkhXG4iKTsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisJCisgICAgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisgICAgREVCVUcoMSwiYXJjbmV0OiBnb3QgaW9hZGRyICVYaFxuIiwgaW9hZGRyKTsKKworICAgIERFQlVHKDEsImFyY25ldDogcmVxdWVzdCBJUlEgJWQgKCVYaC8lWGgpXG4iLAorCSAgIGxpbmstPmlycS5Bc3NpZ25lZElSUSwKKwkgICBsaW5rLT5pcnEuSVJRSW5mbzEsIGxpbmstPmlycS5JUlFJbmZvMik7CisgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgIGlmIChpICE9IENTX1NVQ0NFU1MpCisgICAgeworCURFQlVHKDEsImFyY25ldDogcmVxdWVzdElSUSBmYWlsZWQgdG90YWxseSFcbiIpOworCWdvdG8gZmFpbGVkOworICAgIH0KKworICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworCisgICAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOworCisgICAgaWYgKGNvbTIwMDIwX2NoZWNrKGRldikpCisgICAgeworCXJlZ2R1bXAoZGV2KTsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgCisgICAgbHAgPSBkZXYtPnByaXY7CisgICAgbHAtPmNhcmRfbmFtZSA9ICJQQ01DSUEgQ09NMjAwMjAiOworICAgIGxwLT5jYXJkX2ZsYWdzID0gQVJDX0NBTl8xME1CSVQ7IC8qIHByZXRlbmQgYWxsIG9mIHRoZW0gY2FuIDEwTWJpdCAqLworCisgICAgbGluay0+ZGV2ID0gJmluZm8tPm5vZGU7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCisgICAgaSA9IGNvbTIwMDIwX2ZvdW5kKGRldiwgMCk7CS8qIGNhbGxzIHJlZ2lzdGVyX25ldGRldiAqLworICAgIAorICAgIGlmIChpICE9IDApIHsKKwlERUJVRygxLEtFUk5fTk9USUNFICJjb20yMDAyMF9jczogY29tMjAwMjBfZm91bmQoKSBmYWlsZWRcbiIpOworCWxpbmstPmRldiA9IE5VTEw7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgc3RyY3B5KGluZm8tPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisKKyAgICBERUJVRygxLEtFUk5fSU5GTyAiJXM6IHBvcnQgJSMzbHgsIGlycSAlZFxuIiwKKyAgICAgICAgICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworICAgIHJldHVybjsKKworY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgorICAgIERFQlVHKDEsImNvbTIwMDIwX2NvbmZpZyBmYWlsZWQuLi5cbiIpOworICAgIGNvbTIwMDIwX3JlbGVhc2UobGluayk7Cit9IC8qIGNvbTIwMDIwX2NvbmZpZyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCBjb20yMDAyMF9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKKyAgICBkZXZpY2UsIGFuZCByZWxlYXNlIHRoZSBQQ01DSUEgY29uZmlndXJhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKKyAgICBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGNvbTIwMDIwX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKworICAgIERFQlVHKDEsInJlbGVhc2UuLi5cbiIpOworCisgICAgREVCVUcoMCwgImNvbTIwMDIwX3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKworICAgIGxpbmstPnN0YXRlICY9IH4oREVWX0NPTkZJRyB8IERFVl9SRUxFQVNFX1BFTkRJTkcpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICAgIHN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4gIEEgQ0FSRF9SRU1PVkFMIGV2ZW50CisgICAgYWxzbyBzZXRzIHNvbWUgZmxhZ3MgdG8gZGlzY291cmFnZSB0aGUgbmV0IGRyaXZlcnMgZnJvbSB0cnlpbmcKKyAgICB0byB0YWxrIHRvIHRoZSBjYXJkIGFueSBtb3JlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBjb20yMDAyMF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQkgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKyAgICBkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisgICAgY29tMjAwMjBfZGV2X3QgKmluZm8gPSBsaW5rLT5wcml2OworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT5kZXY7CisKKyAgICBERUJVRygxLCAiY29tMjAwMjBfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworICAgIAorICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKyAgICAgICAgbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorICAgICAgICAgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorICAgICAgICBsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVDsKKwljb20yMDAyMF9jb25maWcobGluayk7IAorCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKyAgICAgICAgbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisgICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKyAgICAgICAgICAgIGlmIChsaW5rLT5vcGVuKSB7CisgICAgICAgICAgICAgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorICAgICAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKyAgICAgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworICAgICAgICAgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKyAgICAgICAgICAgIGlmIChsaW5rLT5vcGVuKSB7CisJCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJCUFSQ1JFU0VUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogY29tMjAwMjBfZXZlbnQgKi8KKworCisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBjb20yMDAyMF9jc19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJjb20yMDAyMF9jcyIsCisJfSwKKwkuYXR0YWNoCQk9IGNvbTIwMDIwX2F0dGFjaCwKKwkuZGV0YWNoCQk9IGNvbTIwMDIwX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfY29tMjAwMjBfY3Modm9pZCkKK3sKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmY29tMjAwMjBfY3NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfY29tMjAwMjBfY3Modm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJmNvbTIwMDIwX2NzX2RyaXZlcik7CisJQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfQorCittb2R1bGVfaW5pdChpbml0X2NvbTIwMDIwX2NzKTsKK21vZHVsZV9leGl0KGV4aXRfY29tMjAwMjBfY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyNDg2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMKQEAgLTAsMCArMSwxMjg2IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBmbXZqMTh4X2NzLmMgMi44IDIwMDIvMDMvMjMKKworICAgIEEgZm12ajE4eCAoYW5kIGl0cyBjb21wYXRpYmxlcykgUENNQ0lBIGNsaWVudCBkcml2ZXIKKworICAgIENvbnRyaWJ1dGVkIGJ5IFNoaW5nbyBGdWppbW90bywgc2hpbmdvQGZsYWIuZnVqaXRzdS5jby5qcAorCisgICAgVERLIExBSy1DRDAyMSBhbmQgQ09OVEVDIEMtTkVUKFBDKUMgc3VwcG9ydCBhZGRlZCBieSAKKyAgICBOb2J1aGlybyBLYXRheWFtYSwga2F0YS1uQHBvLmlpam5ldC5vci5qcAorCisgICAgVGhlIFBDTUNJQSBjbGllbnQgY29kZSBpcyBiYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgRGF2aWQgSGluZHMuCisgICAgTmV0d29yayBjb2RlIGlzIGJhc2VkIG9uIHRoZSAiRk1WLTE4eCBkcml2ZXIiIGJ5IFl1dGFrYSBUQU1JWUEKKyAgICBidXQgaXMgYWN0dWFsbHkgbGFyZ2VseSBEb25hbGQgQmVja2VyJ3MgQVQxNzAwIGRyaXZlciwgd2hpY2gKKyAgICBjYXJyaWVzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRpb246CisKKyAgICBXcml0dGVuIDE5OTMtOTQgYnkgRG9uYWxkIEJlY2tlci4KKworICAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAgICBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorICAgIAorICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAgIAorICAgIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisgICAgU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisgICAgNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKyAgICBBbm5hcG9saXMgTUQgMjE0MDMKKyAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgRFJWX05BTUUJImZtdmoxOHhfY3MiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIyLjgiCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCitNT0RVTEVfREVTQ1JJUFRJT04oImZtdmoxOHggYW5kIGNvbXBhdGlibGUgUENNQ0lBIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIElOVF9NT0RVTEVfUEFSTShuLCB2KSBzdGF0aWMgaW50IG4gPSB2OyBtb2R1bGVfcGFyYW0obiwgaW50LCAwKQorCisvKiBTUkFNIGNvbmZpZ3VyYXRpb24gKi8KKy8qIDA6NEtCKjIgVFggYnVmZmVyICAgZWxzZTo4S0IqMiBUWCBidWZmZXIgKi8KK0lOVF9NT0RVTEVfUEFSTShzcmFtX2NvbmZpZywgMCk7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK0lOVF9NT0RVTEVfUEFSTShwY19kZWJ1ZywgUENNQ0lBX0RFQlVHKTsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0gRFJWX05BTUUgIi5jICIgRFJWX1ZFUlNJT04gIiAyMDAyLzAzLzIzIjsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKgorICAgIFBDTUNJQSBldmVudCBoYW5kbGVycworICovCitzdGF0aWMgdm9pZCBmbXZqMTh4X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgZm12ajE4eF9nZXRfaHdpbmZvKGRldl9saW5rX3QgKmxpbmssIHVfY2hhciAqbm9kZV9pZCk7CitzdGF0aWMgaW50IGZtdmoxOHhfc2V0dXBfbWZjKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgZm12ajE4eF9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCBmbXZqMTh4X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCSAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKK3N0YXRpYyBkZXZfbGlua190ICpmbXZqMTh4X2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIGZtdmoxOHhfZGV0YWNoKGRldl9saW5rX3QgKik7CisKKy8qCisgICAgTEFOIGNvbnRyb2xsZXIoTUJIODY5NjBBKSBzcGVjaWZpYyByb3V0aW5lcworICovCitzdGF0aWMgaW50IGZqbl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApOworc3RhdGljIGludCBmam5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZmpuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBmam5fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBmam5faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgZmpuX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZmpuX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpmam5fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBmam5fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJmbXZqMTh4X2NzIjsKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsKKworLyoKKyAgICBjYXJkIHR5cGUKKyAqLwordHlwZWRlZiBlbnVtIHsgTUJIMTAzMDIsIE1CSDEwMzA0LCBUREssIENPTlRFQywgTEE1MDEsIFVOR0VSTUFOTiwgCisJICAgICAgIFhYWDEwMzA0Cit9IGNhcmR0eXBlX3Q7CisKKy8qCisgICAgZHJpdmVyIHNwZWNpZmljIGRhdGEgc3RydWN0dXJlCisqLwordHlwZWRlZiBzdHJ1Y3QgbG9jYWxfaW5mb190IHsKKyAgICBkZXZfbGlua190IGxpbms7CisgICAgZGV2X25vZGVfdCBub2RlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworICAgIGxvbmcgb3Blbl90aW1lOworICAgIHVpbnQgdHhfc3RhcnRlZDoxOworICAgIHVpbnQgdHhfcXVldWU7CisgICAgdV9zaG9ydCB0eF9xdWV1ZV9sZW47CisgICAgY2FyZHR5cGVfdCBjYXJkdHlwZTsKKyAgICB1X3Nob3J0IHNlbnQ7CisgICAgdV9jaGFyIG1jX2ZpbHRlcls4XTsKK30gbG9jYWxfaW5mb190OworCisjZGVmaW5lIE1DX0ZJTFRFUkJSRUFLIDY0CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogCisgICAgaW9wb3J0IG9mZnNldCBmcm9tIHRoZSBiYXNlIGFkZHJlc3MgCisgKi8KKyNkZWZpbmUgVFhfU1RBVFVTICAgICAgICAgICAgICAgMCAvKiB0cmFuc21pdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlhfU1RBVFVTICAgICAgICAgICAgICAgMSAvKiByZWNlaXZlIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBUWF9JTlRSICAgICAgICAgICAgICAgICAyIC8qIHRyYW5zbWl0IGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisjZGVmaW5lIFJYX0lOVFIgICAgICAgICAgICAgICAgIDMgLyogcmVjZWl2ZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworI2RlZmluZSBUWF9NT0RFICAgICAgICAgICAgICAgICA0IC8qIHRyYW5zbWl0IG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlhfTU9ERSAgICAgICAgICAgICAgICAgNSAvKiByZWNlaXZlIG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ09ORklHXzAgICAgICAgICAgICAgICAgNiAvKiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgQ09ORklHXzEgICAgICAgICAgICAgICAgNyAvKiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDEgKi8KKworI2RlZmluZSBOT0RFX0lEICAgICAgICAgICAgICAgICA4IC8qIG5vZGUgSUQgcmVnaXN0ZXIgICAgICAgICAgICAoYmFuayAwKSAqLworI2RlZmluZSBNQVJfQURSICAgICAgICAgICAgICAgICA4IC8qIG11bHRpY2FzdCBhZGRyZXNzIHJlZ2lzdGVycyAoYmFuayAxKSAqLworCisjZGVmaW5lIERBVEFQT1JUICAgICAgICAgICAgICAgIDggLyogYnVmZmVyIG1lbSBwb3J0IHJlZ2lzdGVycyAgIChiYW5rIDIpICovCisjZGVmaW5lIFRYX1NUQVJUICAgICAgICAgICAgICAgMTAgLyogdHJhbnNtaXQgc3RhcnQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ09MX0NUUkwgICAgICAgICAgICAgICAxMSAvKiAxNiBjb2xsaXNpb24gY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBCTVBSMTIgICAgICAgICAgICAgICAgIDEyIC8qIHJlc2VydmVkICovCisjZGVmaW5lIEJNUFIxMyAgICAgICAgICAgICAgICAgMTMgLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUlhfU0tJUCAgICAgICAgICAgICAgICAxNCAvKiBza2lwIHJlY2VpdmVkIHBhY2tldCByZWdpc3RlciAqLworCisjZGVmaW5lIExBTl9DVFJMICAgICAgICAgICAgICAgMTYgLyogTEFOIGNhcmQgY29udHJvbCByZWdpc3RlciAqLworCisjZGVmaW5lIE1BQ19JRCAgICAgICAgICAgICAgIDB4MWEgLyogaGFyZHdhcmUgYWRkcmVzcyAqLworI2RlZmluZSBVTkdFUk1BTk5fTUFDX0lEICAgICAweDE4IC8qIFVOR0VSTUFOTi1CQVNTIGhhcmR3YXJlIGFkZHJlc3MgKi8KKworLyogCisgICAgY29udHJvbCBiaXRzIAorICovCisjZGVmaW5lIEVOQV9UTVRfT0sgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgRU5BX1RNVF9SRUMgICAgICAgICAgMHgyMAorI2RlZmluZSBFTkFfQ09MICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEVOQV8xNl9DT0wgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRU5BX1RCVVNfRVJSICAgICAgICAgMHgwMQorCisjZGVmaW5lIEVOQV9QS1RfUkRZICAgICAgICAgIDB4ODAKKyNkZWZpbmUgRU5BX0JVU19FUlIgICAgICAgICAgMHg0MAorI2RlZmluZSBFTkFfTEVOX0VSUiAgICAgICAgICAweDA4CisjZGVmaW5lIEVOQV9BTEdfRVJSICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRU5BX0NSQ19FUlIgICAgICAgICAgMHgwMgorI2RlZmluZSBFTkFfT1ZSX0ZMTyAgICAgICAgICAweDAxCisKKy8qIGZsYWdzICovCisjZGVmaW5lIEZfVE1UX1JEWSAgICAgICAgICAgIDB4ODAgLyogY2FuIGFjY2VwdCBuZXcgcGFja2V0ICovCisjZGVmaW5lIEZfTkVUX0JTWSAgICAgICAgICAgIDB4NDAgLyogY2FycmllciBpcyBkZXRlY3RlZCAqLworI2RlZmluZSBGX1RNVF9PSyAgICAgICAgICAgICAweDIwIC8qIHNlbmQgcGFja2V0IHN1Y2Nlc3NmdWxseSAqLworI2RlZmluZSBGX1NSVF9QS1QgICAgICAgICAgICAweDEwIC8qIHNob3J0IHBhY2tldCBlcnJvciAqLworI2RlZmluZSBGX0NPTF9FUlIgICAgICAgICAgICAweDA0IC8qIGNvbGxpc2lvbiBlcnJvciAqLworI2RlZmluZSBGXzE2X0NPTCAgICAgICAgICAgICAweDAyIC8qIDE2IGNvbGxpc2lvbiBlcnJvciAqLworI2RlZmluZSBGX1RCVVNfRVJSICAgICAgICAgICAweDAxIC8qIGJ1cyByZWFkIGVycm9yICovCisKKyNkZWZpbmUgRl9QS1RfUkRZICAgICAgICAgICAgMHg4MCAvKiBwYWNrZXQocykgaW4gYnVmZmVyICovCisjZGVmaW5lIEZfQlVTX0VSUiAgICAgICAgICAgIDB4NDAgLyogYnVzIHJlYWQgZXJyb3IgKi8KKyNkZWZpbmUgRl9MRU5fRVJSICAgICAgICAgICAgMHgwOCAvKiBzaG9ydCBwYWNrZXQgKi8KKyNkZWZpbmUgRl9BTEdfRVJSICAgICAgICAgICAgMHgwNCAvKiBmcmFtZSBlcnJvciAqLworI2RlZmluZSBGX0NSQ19FUlIgICAgICAgICAgICAweDAyIC8qIENSQyBlcnJvciAqLworI2RlZmluZSBGX09WUl9GTE8gICAgICAgICAgICAweDAxIC8qIG92ZXJmbG93IGVycm9yICovCisKKyNkZWZpbmUgRl9CVUZfRU1QICAgICAgICAgICAgMHg0MCAvKiByZWNlaXZlIGJ1ZmZlciBpcyBlbXB0eSAqLworCisjZGVmaW5lIEZfU0tQX1BLVCAgICAgICAgICAgIDB4MDUgLyogZHJvcCBwYWNrZXQgaW4gYnVmZmVyICovCisKKy8qIGRlZmF1bHQgYml0bWFwcyAqLworI2RlZmluZSBEX1RYX0lOVFIgICggRU5BX1RNVF9PSyApCisjZGVmaW5lIERfUlhfSU5UUiAgKCBFTkFfUEtUX1JEWSB8IEVOQV9MRU5fRVJSIFwKKwkJICAgfCBFTkFfQUxHX0VSUiB8IEVOQV9DUkNfRVJSIHwgRU5BX09WUl9GTE8gKQorI2RlZmluZSBUWF9TVEFUX00gICggRl9UTVRfUkRZICkKKyNkZWZpbmUgUlhfU1RBVF9NICAoIEZfUEtUX1JEWSB8IEZfTEVOX0VSUiBcCisgICAgICAgICAgICAgICAgICAgfCBGX0FMR19FUlIgfCBGX0NSQ19FUlIgfCBGX09WUl9GTE8gKQorCisvKiBjb21tYW5kcyAqLworI2RlZmluZSBEX1RYX01PREUgICAgICAgICAgICAweDA2IC8qIG5vIHRlc3RzLCBkZXRlY3QgY2FycmllciAqLworI2RlZmluZSBJRF9NQVRDSEVEICAgICAgICAgICAweDAyIC8qIChSWF9NT0RFKSAqLworI2RlZmluZSBSRUNWX0FMTCAgICAgICAgICAgICAweDAzIC8qIChSWF9NT0RFKSAqLworI2RlZmluZSBDT05GSUcwX0RGTCAgICAgICAgICAweDVhIC8qIDE2Yml0IGJ1cywgNEsgeCAyIFR4IHF1ZXVlcyAqLworI2RlZmluZSBDT05GSUcwX0RGTF8xICAgICAgICAweDVlIC8qIDE2Yml0IGJ1cywgOEsgeCAyIFR4IHF1ZXVlcyAqLworI2RlZmluZSBDT05GSUcwX1JTVCAgICAgICAgICAweGRhIC8qIERhdGEgTGluayBDb250cm9sbGVyIG9mZiAoQ09ORklHXzApICovCisjZGVmaW5lIENPTkZJRzBfUlNUXzEgICAgICAgIDB4ZGUgLyogRGF0YSBMaW5rIENvbnRyb2xsZXIgb2ZmIChDT05GSUdfMCkgKi8KKyNkZWZpbmUgQkFOS18wICAgICAgICAgICAgICAgMHhhMCAvKiBiYW5rIDAgKENPTkZJR18xKSAqLworI2RlZmluZSBCQU5LXzEgICAgICAgICAgICAgICAweGE0IC8qIGJhbmsgMSAoQ09ORklHXzEpICovCisjZGVmaW5lIEJBTktfMiAgICAgICAgICAgICAgIDB4YTggLyogYmFuayAyIChDT05GSUdfMSkgKi8KKyNkZWZpbmUgQ0hJUF9PRkYgICAgICAgICAgICAgMHg4MCAvKiBjb250cmwgY2hpcCBwb3dlciBvZmYgKENPTkZJR18xKSAqLworI2RlZmluZSBET19UWCAgICAgICAgICAgICAgICAweDgwIC8qIGRvIHRyYW5zbWl0IHBhY2tldCAqLworI2RlZmluZSBTRU5EX1BLVCAgICAgICAgICAgICAweDgxIC8qIHNlbmQgYSBwYWNrZXQgKi8KKyNkZWZpbmUgQVVUT19NT0RFICAgICAgICAgICAgMHgwNyAvKiBBdXRvIHNraXAgcGFja2V0IG9uIDE2IGNvbCBkZXRlY3RlZCAqLworI2RlZmluZSBNQU5VX01PREUgICAgICAgICAgICAweDAzIC8qIFN0b3AgYW5kIHNraXAgcGFja2V0IG9uIDE2IGNvbCAqLworI2RlZmluZSBUREtfQVVUT19NT0RFICAgICAgICAweDQ3IC8qIEF1dG8gc2tpcCBwYWNrZXQgb24gMTYgY29sIGRldGVjdGVkICovCisjZGVmaW5lIFRES19NQU5VX01PREUgICAgICAgIDB4NDMgLyogU3RvcCBhbmQgc2tpcCBwYWNrZXQgb24gMTYgY29sICovCisjZGVmaW5lIElOVFJfT0ZGICAgICAgICAgICAgIDB4MGQgLyogTEFOIGNvbnRyb2xsZXIgaWdub3JlcyBpbnRlcnJ1cHRzICovCisjZGVmaW5lIElOVFJfT04gICAgICAgICAgICAgIDB4MWQgLyogTEFOIGNvbnRyb2xsZXIgd2lsbCBjYXRjaCBpbnRlcnJ1cHRzICovCisKKyNkZWZpbmUgVFhfVElNRU9VVAkJKCg0MDAqSFopLzEwMDApCisKKyNkZWZpbmUgQkFOS18wVSAgICAgICAgICAgICAgMHgyMCAvKiBiYW5rIDAgKENPTkZJR18xKSAqLworI2RlZmluZSBCQU5LXzFVICAgICAgICAgICAgICAweDI0IC8qIGJhbmsgMSAoQ09ORklHXzEpICovCisjZGVmaW5lIEJBTktfMlUgICAgICAgICAgICAgIDB4MjggLyogYmFuayAyIChDT05GSUdfMSkgKi8KKworc3RhdGljIGRldl9saW5rX3QgKmZtdmoxOHhfYXR0YWNoKHZvaWQpCit7CisgICAgbG9jYWxfaW5mb190ICpscDsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisgICAgaW50IHJldDsKKyAgICAKKyAgICBERUJVRygwLCAiZm12ajE4eF9hdHRhY2goKVxuIik7CisKKyAgICAvKiBNYWtlIHVwIGEgRk1WSjE4eCBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZSAqLworICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihsb2NhbF9pbmZvX3QpKTsKKyAgICBpZiAoIWRldikKKwlyZXR1cm4gTlVMTDsKKyAgICBscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgbGluayA9ICZscC0+bGluazsKKyAgICBsaW5rLT5wcml2ID0gZGV2OworCisgICAgLyogVGhlIGlvIHN0cnVjdHVyZSBkZXNjcmliZXMgSU8gcG9ydCBtYXBwaW5nICovCisgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMzI7CisgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKKyAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDU7CisKKyAgICAvKiBJbnRlcnJ1cHQgc2V0dXAgKi8KKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+aXJxLkhhbmRsZXIgPSAmZmpuX2ludGVycnVwdDsKKyAgICBsaW5rLT5pcnEuSW5zdGFuY2UgPSBkZXY7CisgICAgCisgICAgLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiAqLworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IDUwOworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworCisgICAgLyogVGhlIEZNVkoxOHggc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZmpuX3N0YXJ0X3htaXQ7CisgICAgZGV2LT5zZXRfY29uZmlnID0gJmZqbl9jb25maWc7CisgICAgZGV2LT5nZXRfc3RhdHMgPSAmZmpuX2dldF9zdGF0czsKKyAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKyAgICBkZXYtPm9wZW4gPSAmZmpuX29wZW47CisgICAgZGV2LT5zdG9wID0gJmZqbl9jbG9zZTsKKyNpZmRlZiBIQVZFX1RYX1RJTUVPVVQKKyAgICBkZXYtPnR4X3RpbWVvdXQgPSBmam5fdHhfdGltZW91dDsKKyAgICBkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKyNlbmRpZgorICAgIFNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOworICAgIAorICAgIC8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKKyAgICBkZXZfbGlzdCA9IGxpbms7CisgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKyAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9CisJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmZm12ajE4eF9ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKyAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCWZtdmoxOHhfZGV0YWNoKGxpbmspOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBsaW5rOworfSAvKiBmbXZqMTh4X2F0dGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgZm12ajE4eF9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBkZXZfbGlua190ICoqbGlua3A7CisgICAgCisgICAgREVCVUcoMCwgImZtdmoxOHhfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKyAgICAKKyAgICAvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKyAgICBpZiAoKmxpbmtwID09IE5VTEwpCisJcmV0dXJuOworCisgICAgaWYgKGxpbmstPmRldikKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwlmbXZqMTh4X3JlbGVhc2UobGluayk7CisKKyAgICAvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBpZiAobGluay0+aGFuZGxlKQorCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworICAgIAorICAgIC8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIHBpZWNlcyAqLworICAgICpsaW5rcCA9IGxpbmstPm5leHQ7CisgICAgZnJlZV9uZXRkZXYoZGV2KTsKK30gLyogZm12ajE4eF9kZXRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBtZmNfdHJ5X2lvX3BvcnQoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBpbnQgaSwgcmV0OworICAgIHN0YXRpYyBraW9fYWRkcl90IHNlcmlhbF9iYXNlWzVdID0geyAweDNmOCwgMHgyZjgsIDB4M2U4LCAweDJlOCwgMHgwIH07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJbGluay0+aW8uQmFzZVBvcnQyID0gc2VyaWFsX2Jhc2VbaV07CisJbGluay0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwlpZiAobGluay0+aW8uQmFzZVBvcnQyID09IDApIHsKKwkgICAgbGluay0+aW8uTnVtUG9ydHMyID0gMDsKKwkgICAgcHJpbnRrKEtFUk5fTk9USUNFICJmbXZqMTh4X2NzOiBvdXQgb2YgcmVzb3VyY2UgZm9yIHNlcmlhbFxuIik7CisJfQorCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlpZiAocmV0ID09IENTX1NVQ0NFU1MpIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdW5nZXJtYW5uX3RyeV9pb19wb3J0KGRldl9saW5rX3QgKmxpbmspCit7CisgICAgaW50IHJldDsKKyAgICBraW9fYWRkcl90IGlvYWRkcjsKKyAgICAvKgorCVVuZ2VybWFubi1CYXNzIEFjY2Vzcy9DQVJEIGFjY2VwdHMgMHgzMDAsMHgzMjAsMHgzNDAsMHgzNjAKKwkweDM4MCwweDNjMCBvbmx5IGZvciBpb3BvcnQuCisgICAgKi8KKyAgICBmb3IgKGlvYWRkciA9IDB4MzAwOyBpb2FkZHIgPCAweDNlMDsgaW9hZGRyICs9IDB4MjApIHsKKwlsaW5rLT5pby5CYXNlUG9ydDEgPSBpb2FkZHI7CisJcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCWlmIChyZXQgPT0gQ1NfU1VDQ0VTUykgeworCSAgICAvKiBjYWxjdWxhdGUgQ29uZmlnSW5kZXggdmFsdWUgKi8KKwkgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IAorCQkoKGxpbmstPmlvLkJhc2VQb3J0MSAmIDB4MGYwKSA+PiAzKSB8IDB4MjI7CisJICAgIHJldHVybiByZXQ7CisJfQorICAgIH0KKyAgICByZXR1cm4gcmV0OwkvKiBSZXF1ZXN0SU8gZmFpbGVkICovCit9CisKK3N0YXRpYyB2b2lkIGZtdmoxOHhfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgdV9zaG9ydCBidWZbMzJdOworICAgIGludCBpLCBsYXN0X2ZuLCBsYXN0X3JldCwgcmV0OworICAgIGtpb19hZGRyX3QgaW9hZGRyOworICAgIGNhcmR0eXBlX3QgY2FyZHR5cGU7CisgICAgY2hhciAqY2FyZF9uYW1lID0gInVua25vd24iOworICAgIHVfY2hhciAqbm9kZV9pZDsKKworICAgIERFQlVHKDAsICJmbXZqMTh4X2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgICAvKgorICAgICAgIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbgorICAgICAgIHJlZ2lzdGVycy4KKyAgICAqLworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIHR1cGxlLlR1cGxlRGF0YSA9ICh1X2NoYXIgKilidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgICAKKyAgICAvKiBDb25maWd1cmUgY2FyZCAqLworICAgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsgCisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0ZVTkNFOworICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICBpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykgeworCS8qIFllcywgSSBoYXZlIENJU1RQTF9GVU5DRS4gTGV0J3MgY2hlY2sgQ0lTVFBMX01BTkZJRCAqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisJbGluay0+Y29uZi5Db25maWdJbmRleCA9IHBhcnNlLmNmdGFibGVfZW50cnkuaW5kZXg7CisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX01BTkZJRDsKKwlpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykKKwkgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwllbHNlCisJICAgIGJ1ZlswXSA9IDB4ZmZmZjsKKwlzd2l0Y2ggKGxlMTZfdG9fY3B1KGJ1ZlswXSkpIHsKKwljYXNlIE1BTkZJRF9UREs6CisJICAgIGNhcmR0eXBlID0gVERLOworCSAgICBpZiAobGUxNl90b19jcHUoYnVmWzFdKSA9PSBQUk9ESURfVERLX0NGMDEwKSB7CisJCWNzX3N0YXR1c190IHN0YXR1czsKKwkJcGNtY2lhX2dldF9zdGF0dXMoaGFuZGxlLCAmc3RhdHVzKTsKKwkJaWYgKHN0YXR1cy5DYXJkU3RhdGUgJiBDU19FVkVOVF8zVkNBUkQpCisJCSAgICBsaW5rLT5jb25mLlZjYyA9IDMzOyAvKiBpbnNlcnRlZCBpbiAzLjNWIHNsb3QgKi8KKwkgICAgfSBlbHNlIGlmIChsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF9UREtfR04zNDEwKSB7CisJCS8qIE11bHRpRnVuY3Rpb24gQ2FyZCAqLworCQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSAweDgwMDsKKwkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IDB4NDc7CisJCWxpbmstPmlvLk51bVBvcnRzMiA9IDg7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBNQU5GSURfQ09OVEVDOgorCSAgICBjYXJkdHlwZSA9IENPTlRFQzsKKwkgICAgYnJlYWs7CisJY2FzZSBNQU5GSURfRlVKSVRTVToKKwkgICAgaWYgKGxlMTZfdG9fY3B1KGJ1ZlsxXSkgPT0gUFJPRElEX0ZVSklUU1VfTUJIMTAzMDIpCisgICAgICAgICAgICAgICAgLyogUkFUT0MgUkVYLTU1ODgvOTgyMi80ODg2J3MgUFJPRElEIGFyZSAwMDA0KD1NQkgxMDMwMiksCisgICAgICAgICAgICAgICAgICAgYnV0IHRoZXNlIGFyZSBNQkgxMDMwNCBiYXNlZCBjYXJkLiAqLyAKKwkJY2FyZHR5cGUgPSBNQkgxMDMwNDsKKwkgICAgZWxzZSBpZiAobGUxNl90b19jcHUoYnVmWzFdKSA9PSBQUk9ESURfRlVKSVRTVV9NQkgxMDMwNCkKKwkJY2FyZHR5cGUgPSBNQkgxMDMwNDsKKwkgICAgZWxzZQorCQljYXJkdHlwZSA9IExBNTAxOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBjYXJkdHlwZSA9IE1CSDEwMzA0OworCX0KKyAgICB9IGVsc2UgeworCS8qIG9sZCB0eXBlIGNhcmQgKi8KKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOworCWlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTKQorCSAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCWVsc2UKKwkgICAgYnVmWzBdID0gMHhmZmZmOworCXN3aXRjaCAobGUxNl90b19jcHUoYnVmWzBdKSkgeworCWNhc2UgTUFORklEX0ZVSklUU1U6CisJICAgIGlmIChsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF9GVUpJVFNVX01CSDEwMzA0KSB7CisJCWNhcmR0eXBlID0gWFhYMTAzMDQ7ICAgIC8qIE1CSDEwMzA0IHdpdGggYnVnZ3kgQ0lTICovCisJICAgICAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMHgyMDsKKwkgICAgfSBlbHNlIHsKKwkJY2FyZHR5cGUgPSBNQkgxMDMwMjsgICAgLyogTmV4dENvbSBOQzUzMTAsIGV0Yy4gKi8KKwkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBNQU5GSURfVU5HRVJNQU5OOgorCSAgICBjYXJkdHlwZSA9IFVOR0VSTUFOTjsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgY2FyZHR5cGUgPSBNQkgxMDMwMjsKKwkgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IDE7CisJfQorICAgIH0KKworICAgIGlmIChsaW5rLT5pby5OdW1Qb3J0czIgIT0gMCkgeworICAgIAlsaW5rLT5pcnEuQXR0cmlidXRlcyA9CisJCUlSUV9UWVBFX0RZTkFNSUNfU0hBUklOR3xJUlFfRklSU1RfU0hBUkVEfElSUV9IQU5ETEVfUFJFU0VOVDsKKwlyZXQgPSBtZmNfdHJ5X2lvX3BvcnQobGluayk7CisJaWYgKHJldCAhPSBDU19TVUNDRVNTKSBnb3RvIGNzX2ZhaWxlZDsKKyAgICB9IGVsc2UgaWYgKGNhcmR0eXBlID09IFVOR0VSTUFOTikgeworCXJldCA9IHVuZ2VybWFubl90cnlfaW9fcG9ydChsaW5rKTsKKwlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIGdvdG8gY3NfZmFpbGVkOworICAgIH0gZWxzZSB7IAorCUNTX0NIRUNLKFJlcXVlc3RJTywgcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pKTsKKyAgICB9CisgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOworICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKyAgICBkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKyAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKworICAgIGlmIChsaW5rLT5pby5CYXNlUG9ydDIgIT0gMCkKKwlmbXZqMTh4X3NldHVwX21mYyhsaW5rKTsKKworICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgLyogUmVzZXQgY29udHJvbGxlciAqLworICAgIGlmIChzcmFtX2NvbmZpZyA9PSAwKSAKKwlvdXRiKENPTkZJRzBfUlNULCBpb2FkZHIgKyBDT05GSUdfMCk7CisgICAgZWxzZQorCW91dGIoQ09ORklHMF9SU1RfMSwgaW9hZGRyICsgQ09ORklHXzApOworCisgICAgLyogUG93ZXIgT24gY2hpcCBhbmQgc2VsZWN0IGJhbmsgMCAqLworICAgIGlmIChjYXJkdHlwZSA9PSBNQkgxMDMwMikKKwlvdXRiKEJBTktfMCwgaW9hZGRyICsgQ09ORklHXzEpOworICAgIGVsc2UKKwlvdXRiKEJBTktfMFUsIGlvYWRkciArIENPTkZJR18xKTsKKyAgICAKKyAgICAvKiBTZXQgaGFyZHdhcmUgYWRkcmVzcyAqLworICAgIHN3aXRjaCAoY2FyZHR5cGUpIHsKKyAgICBjYXNlIE1CSDEwMzA0OgorICAgIGNhc2UgVERLOgorICAgIGNhc2UgTEE1MDE6CisgICAgY2FzZSBDT05URUM6CisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0ZVTkNFOworCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisJaWYgKGNhcmR0eXBlID09IE1CSDEwMzA0KSB7CisJICAgIC8qIE1CSDEwMzA0J3MgQ0lTX0ZVTkNFIGlzIGNvcnJ1cHRlZCAqLworCSAgICBub2RlX2lkID0gJih0dXBsZS5UdXBsZURhdGFbNV0pOworCSAgICBjYXJkX25hbWUgPSAiRk1WLUoxODIiOworCX0gZWxzZSB7CisJICAgIHdoaWxlICh0dXBsZS5UdXBsZURhdGFbMF0gIT0gQ0lTVFBMX0ZVTkNFX0xBTl9OT0RFX0lEICkgeworCQlDU19DSEVDSyhHZXROZXh0VHVwbGUsIHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCSAgICB9CisJICAgIG5vZGVfaWQgPSAmKHR1cGxlLlR1cGxlRGF0YVsyXSk7CisJICAgIGlmKCBjYXJkdHlwZSA9PSBUREsgKSB7CisJCWNhcmRfbmFtZSA9ICJUREsgTEFLLUNEMDIxIjsKKwkgICAgfSBlbHNlIGlmKCBjYXJkdHlwZSA9PSBMQTUwMSApIHsKKwkJY2FyZF9uYW1lID0gIkxBNTAxIjsKKwkgICAgfSBlbHNlIHsKKwkJY2FyZF9uYW1lID0gIkMtTkVUKFBDKUMiOworCSAgICB9CisJfQorCS8qIFJlYWQgTUFDSUQgZnJvbSBDSVMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCSAgICBkZXYtPmRldl9hZGRyW2ldID0gbm9kZV9pZFtpXTsKKwlicmVhazsKKyAgICBjYXNlIFVOR0VSTUFOTjoKKwkvKiBSZWFkIE1BQ0lEIGZyb20gcmVnaXN0ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSAKKwkgICAgZGV2LT5kZXZfYWRkcltpXSA9IGluYihpb2FkZHIgKyBVTkdFUk1BTk5fTUFDX0lEICsgaSk7CisJY2FyZF9uYW1lID0gIkFjY2Vzcy9DQVJEIjsKKwlicmVhazsKKyAgICBjYXNlIFhYWDEwMzA0OgorCS8qIFJlYWQgTUFDSUQgZnJvbSBCdWdneSBDSVMgKi8KKwlpZiAoZm12ajE4eF9nZXRfaHdpbmZvKGxpbmssIHR1cGxlLlR1cGxlRGF0YSkgPT0gLTEpIHsKKwkgICAgcHJpbnRrKEtFUk5fTk9USUNFICJmbXZqMTh4X2NzOiB1bmFibGUgdG8gcmVhZCBoYXJkd2FyZSBuZXQgYWRkcmVzcy5cbiIpOworCSAgICBnb3RvIGZhaWxlZDsKKwl9CisJZm9yIChpID0gMCA7IGkgPCA2OyBpKyspIHsKKwkgICAgZGV2LT5kZXZfYWRkcltpXSA9IHR1cGxlLlR1cGxlRGF0YVtpXTsKKwl9CisJY2FyZF9uYW1lID0gIkZNVi1KMTgyIjsKKwlicmVhazsKKyAgICBjYXNlIE1CSDEwMzAyOgorICAgIGRlZmF1bHQ6CisJLyogUmVhZCBNQUNJRCBmcm9tIHJlZ2lzdGVyICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgCisJICAgIGRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgTUFDX0lEICsgaSk7CisJY2FyZF9uYW1lID0gIkZNVi1KMTgxIjsKKwlicmVhazsKKyAgICB9CisKKyAgICBscC0+Y2FyZHR5cGUgPSBjYXJkdHlwZTsKKyAgICBsaW5rLT5kZXYgPSAmbHAtPm5vZGU7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCisgICAgaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgImZtdmoxOHhfY3M6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJbGluay0+ZGV2ID0gTlVMTDsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBzdHJjcHkobHAtPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisKKyAgICAvKiBwcmludCBjdXJyZW50IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogJXMsIHNyYW0gJXMsIHBvcnQgJSMzbHgsIGlycSAlZCwgaHdfYWRkciAiLCAKKwkgICBkZXYtPm5hbWUsIGNhcmRfbmFtZSwgc3JhbV9jb25maWcgPT0gMCA/ICI0SyBUWCoyIiA6ICI4SyBUWCoyIiwgCisJICAgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXByaW50aygiJTAyWCVzIiwgZGV2LT5kZXZfYWRkcltpXSwgKChpPDUpID8gIjoiIDogIlxuIikpOworCisgICAgcmV0dXJuOworICAgIAorY3NfZmFpbGVkOgorICAgIC8qIEFsbCBDYXJkIFNlcnZpY2VzIGVycm9ycyBlbmQgdXAgaGVyZSAqLworICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgorICAgIGZtdmoxOHhfcmVsZWFzZShsaW5rKTsKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworCit9IC8qIGZtdmoxOHhfY29uZmlnICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBmbXZqMTh4X2dldF9od2luZm8oZGV2X2xpbmtfdCAqbGluaywgdV9jaGFyICpub2RlX2lkKQoreworICAgIHdpbl9yZXFfdCByZXE7CisgICAgbWVtcmVxX3QgbWVtOworICAgIHVfY2hhciBfX2lvbWVtICpiYXNlOworICAgIGludCBpLCBqOworCisgICAgLyogQWxsb2NhdGUgYSBzbWFsbCBtZW1vcnkgd2luZG93ICovCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84fFdJTl9NRU1PUllfVFlQRV9BTXxXSU5fRU5BQkxFOworICAgIHJlcS5CYXNlID0gMDsgcmVxLlNpemUgPSAwOworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IDA7CisgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKTsKKyAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0V2luZG93LCBpKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgYmFzZSA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKKyAgICBtZW0uUGFnZSA9IDA7CisgICAgbWVtLkNhcmRPZmZzZXQgPSAwOworICAgIHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWVtKTsKKworICAgIC8qCisgICAgICogIE1CSDEwMzA0IENJU1RQTF9GVU5DRV9MQU5fTk9ERV9JRCBmb3JtYXQKKyAgICAgKiAgMjIgMGQgeHggeHggeHggMDQgMDYgeXkgeXkgeXkgeXkgeXkgeXkgZmYKKyAgICAgKiAgJ3h4JyBpcyBnYXJiYWdlLgorICAgICAqICAneXknIGlzIE1BQyBhZGRyZXNzLgorICAgICovIAorICAgIGZvciAoaSA9IDA7IGkgPCAweDIwMDsgaSsrKSB7CisJaWYgKHJlYWRiKGJhc2UraSoyKSA9PSAweDIyKSB7CQorCSAgICBpZiAocmVhZGIoYmFzZSsoaS0xKSoyKSA9PSAweGZmCisJICAgICAmJiByZWFkYihiYXNlKyhpKzUpKjIpID09IDB4MDQKKwkgICAgICYmIHJlYWRiKGJhc2UrKGkrNikqMikgPT0gMHgwNgorCSAgICAgJiYgcmVhZGIoYmFzZSsoaSsxMykqMikgPT0gMHhmZikgCisJCWJyZWFrOworCX0KKyAgICB9CisKKyAgICBpZiAoaSAhPSAweDIwMCkgeworCWZvciAoaiA9IDAgOyBqIDwgNjsgaisrLGkrKykgeworCSAgICBub2RlX2lkW2pdID0gcmVhZGIoYmFzZSsoaSs3KSoyKTsKKwl9CisgICAgfQorCisgICAgaW91bm1hcChiYXNlKTsKKyAgICBqID0gcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmstPndpbik7CisgICAgaWYgKGogIT0gQ1NfU1VDQ0VTUykKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlbGVhc2VXaW5kb3csIGopOworICAgIHJldHVybiAoaSAhPSAweDIwMCkgPyAwIDogLTE7CisKK30gLyogZm12ajE4eF9nZXRfaHdpbmZvICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBmbXZqMTh4X3NldHVwX21mYyhkZXZfbGlua190ICpsaW5rKQoreworICAgIHdpbl9yZXFfdCByZXE7CisgICAgbWVtcmVxX3QgbWVtOworICAgIHVfY2hhciBfX2lvbWVtICpiYXNlOworICAgIGludCBpLCBqOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGtpb19hZGRyX3QgaW9hZGRyOworCisgICAgLyogQWxsb2NhdGUgYSBzbWFsbCBtZW1vcnkgd2luZG93ICovCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84fFdJTl9NRU1PUllfVFlQRV9BTXxXSU5fRU5BQkxFOworICAgIHJlcS5CYXNlID0gMDsgcmVxLlNpemUgPSAwOworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IDA7CisgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKTsKKyAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0V2luZG93LCBpKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgYmFzZSA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKKyAgICBtZW0uUGFnZSA9IDA7CisgICAgbWVtLkNhcmRPZmZzZXQgPSAwOworICAgIHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWVtKTsKKworICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHdyaXRlYigweDQ3LCBiYXNlKzB4ODAwKTsJLyogQ29uZmlnIE9wdGlvbiBSZWdpc3RlciBvZiBMQU4gKi8KKyAgICB3cml0ZWIoMHgwLCBiYXNlKzB4ODAyKTsJLyogQ29uZmlnIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKworICAgIHdyaXRlYihpb2FkZHIgJiAweGZmLCBiYXNlKzB4ODBhKTsJCS8qIEkvTyBCYXNlKExvdykgb2YgTEFOICovCisgICAgd3JpdGViKChpb2FkZHIgPj4gOCkgJiAweGZmLCBiYXNlKzB4ODBjKTsJLyogSS9PIEJhc2UoSGlnaCkgb2YgTEFOICovCisgICAKKyAgICB3cml0ZWIoMHg0NSwgYmFzZSsweDgyMCk7CS8qIENvbmZpZyBPcHRpb24gUmVnaXN0ZXIgb2YgTW9kZW0gKi8KKyAgICB3cml0ZWIoMHg4LCBiYXNlKzB4ODIyKTsJLyogQ29uZmlnIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKworICAgIGlvdW5tYXAoYmFzZSk7CisgICAgaiA9IHBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworICAgIGlmIChqICE9IENTX1NVQ0NFU1MpCisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWxlYXNlV2luZG93LCBqKTsKKyAgICByZXR1cm4gMDsKKworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGZtdmoxOHhfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworCisgICAgREVCVUcoMCwgImZtdmoxOHhfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisKKyAgICAvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXNlIHN1Y2NlZWQgb3Igbm90ICovCisgICAgcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmstPndpbik7CisgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKyAgICAKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgZm12ajE4eF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQkgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKyAgICBkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKyAgICBERUJVRygxLCAiZm12ajE4eF9ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisgICAgCisgICAgc3dpdGNoIChldmVudCkgeworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCSAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwlmbXZqMTh4X2NvbmZpZyhsaW5rKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIGlmIChsaW5rLT5vcGVuKQorCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJICAgIGlmIChsaW5rLT5vcGVuKSB7CisJCWZqbl9yZXNldChkZXYpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBmbXZqMTh4X2V2ZW50ICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBmbXZqMTh4X2NzX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gImZtdmoxOHhfY3MiLAorCX0sCisJLmF0dGFjaAkJPSBmbXZqMTh4X2F0dGFjaCwKKwkuZGV0YWNoCQk9IGZtdmoxOHhfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9mbXZqMTh4X2NzKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJmZtdmoxOHhfY3NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfZm12ajE4eF9jcyh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmZm12ajE4eF9jc19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9mbXZqMTh4X2NzKTsKK21vZHVsZV9leGl0KGV4aXRfZm12ajE4eF9jcyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaXJxcmV0dXJuX3QgZmpuX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisgICAgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHI7CisgICAgdW5zaWduZWQgc2hvcnQgdHhfc3RhdCwgcnhfc3RhdDsKKworICAgIGlmIChscCA9PSBOVUxMKSB7CisgICAgICAgIHByaW50ayhLRVJOX05PVElDRSAiZmpuX2ludGVycnVwdCgpOiBpcnEgJWQgZm9yICIKKwkgICAgICAgInVua25vd24gZGV2aWNlLlxuIiwgaXJxKTsKKyAgICAgICAgcmV0dXJuIElSUV9OT05FOworICAgIH0KKyAgICBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIC8qIGF2b2lkIG11bHRpcGxlIGludGVycnVwdHMgKi8KKyAgICBvdXR3KDB4MDAwMCwgaW9hZGRyICsgVFhfSU5UUik7CisKKyAgICAvKiB3YWl0IGZvciBhIHdoaWxlICovCisgICAgdWRlbGF5KDEpOworCisgICAgLyogZ2V0IHN0YXR1cyAqLworICAgIHR4X3N0YXQgPSBpbmIoaW9hZGRyICsgVFhfU1RBVFVTKTsKKyAgICByeF9zdGF0ID0gaW5iKGlvYWRkciArIFJYX1NUQVRVUyk7CisKKyAgICAvKiBjbGVhciBzdGF0dXMgKi8KKyAgICBvdXRiKHR4X3N0YXQsIGlvYWRkciArIFRYX1NUQVRVUyk7CisgICAgb3V0YihyeF9zdGF0LCBpb2FkZHIgKyBSWF9TVEFUVVMpOworICAgIAorICAgIERFQlVHKDQsICIlczogaW50ZXJydXB0LCByeF9zdGF0dXMgJTAyeC5cbiIsIGRldi0+bmFtZSwgcnhfc3RhdCk7CisgICAgREVCVUcoNCwgIiAgICAgICAgICAgICAgIHR4X3N0YXR1cyAlMDJ4LlxuIiwgdHhfc3RhdCk7CisgICAgCisgICAgaWYgKHJ4X3N0YXQgfHwgKGluYihpb2FkZHIgKyBSWF9NT0RFKSAmIEZfQlVGX0VNUCkgPT0gMCkgeworCS8qIHRoZXJlIGlzIHBhY2tldChzKSBpbiByeCBidWZmZXIgKi8KKwlmam5fcngoZGV2KTsKKyAgICB9CisgICAgaWYgKHR4X3N0YXQgJiBGX1RNVF9SRFkpIHsKKwlscC0+c3RhdHMudHhfcGFja2V0cyArPSBscC0+c2VudCA7CisgICAgICAgIGxwLT5zZW50ID0gMCA7CisJaWYgKGxwLT50eF9xdWV1ZSkgeworCSAgICBvdXRiKERPX1RYIHwgbHAtPnR4X3F1ZXVlLCBpb2FkZHIgKyBUWF9TVEFSVCk7CisJICAgIGxwLT5zZW50ID0gbHAtPnR4X3F1ZXVlIDsKKwkgICAgbHAtPnR4X3F1ZXVlID0gMDsKKwkgICAgbHAtPnR4X3F1ZXVlX2xlbiA9IDA7CisJICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCX0gZWxzZSB7CisJICAgIGxwLT50eF9zdGFydGVkID0gMDsKKwl9CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworICAgIH0KKyAgICBERUJVRyg0LCAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LFxuIiwgZGV2LT5uYW1lKTsKKyAgICBERUJVRyg0LCAiICAgIHR4X3N0YXR1cyAlMDJ4LCByeF9zdGF0dXMgJTAyeC5cbiIsIHR4X3N0YXQsIHJ4X3N0YXQpOworCisgICAgb3V0YihEX1RYX0lOVFIsIGlvYWRkciArIFRYX0lOVFIpOworICAgIG91dGIoRF9SWF9JTlRSLCBpb2FkZHIgKyBSWF9JTlRSKTsKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CisKK30gLyogZmpuX2ludGVycnVwdCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgZmpuX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCB3aXRoIHN0YXR1cyAlMDR4LCAlcz9cbiIsCisJICAgZGV2LT5uYW1lLCBodG9ucyhpbncoaW9hZGRyICsgVFhfU1RBVFVTKSksCisJICAgaW5iKGlvYWRkciArIFRYX1NUQVRVUykgJiBGX1RNVF9SRFkKKwkgICA/ICJJUlEgY29uZmxpY3QiIDogIm5ldHdvcmsgY2FibGUgcHJvYmxlbSIpOworICAgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IHRpbWVvdXQgcmVnaXN0ZXJzOiAlMDR4ICUwNHggJTA0eCAiCisJICAgIiUwNHggJTA0eCAlMDR4ICUwNHggJTA0eC5cbiIsCisJICAgZGV2LT5uYW1lLCBodG9ucyhpbncoaW9hZGRyICsgMCkpLAorCSAgIGh0b25zKGludyhpb2FkZHIgKyAyKSksIGh0b25zKGludyhpb2FkZHIgKyA0KSksCisJICAgaHRvbnMoaW53KGlvYWRkciArIDYpKSwgaHRvbnMoaW53KGlvYWRkciArIDgpKSwKKwkgICBodG9ucyhpbncoaW9hZGRyICsxMCkpLCBodG9ucyhpbncoaW9hZGRyICsxMikpLAorCSAgIGh0b25zKGludyhpb2FkZHIgKzE0KSkpOworICAgIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICAvKiBUb0RvOiBXZSBzaG91bGQgdHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuLi4gKi8KKyAgICBsb2NhbF9pcnFfZGlzYWJsZSgpOworICAgIGZqbl9yZXNldChkZXYpOworCisgICAgbHAtPnR4X3N0YXJ0ZWQgPSAwOworICAgIGxwLT50eF9xdWV1ZSA9IDA7CisgICAgbHAtPnR4X3F1ZXVlX2xlbiA9IDA7CisgICAgbHAtPnNlbnQgPSAwOworICAgIGxwLT5vcGVuX3RpbWUgPSBqaWZmaWVzOworICAgIGxvY2FsX2lycV9lbmFibGUoKTsKKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQgZmpuX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzaG9ydCBsZW5ndGggPSBza2ItPmxlbjsKKyAgICAKKyAgICBpZiAobGVuZ3RoIDwgRVRIX1pMRU4pCisgICAgeworICAgIAlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisgICAgCWlmIChza2IgPT0gTlVMTCkKKyAgICAJCXJldHVybiAwOworICAgIAlsZW5ndGggPSBFVEhfWkxFTjsKKyAgICB9CisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICB7CisJdW5zaWduZWQgY2hhciAqYnVmID0gc2tiLT5kYXRhOworCisJaWYgKGxlbmd0aCA+IEVUSF9GUkFNRV9MRU4pIHsKKwkgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlczogQXR0ZW1wdGluZyB0byBzZW5kIGEgbGFyZ2UgcGFja2V0IgorCQkgICAiICglZCBieXRlcykuXG4iLCBkZXYtPm5hbWUsIGxlbmd0aCk7CisJICAgIHJldHVybiAxOworCX0KKworCURFQlVHKDQsICIlczogVHJhbnNtaXR0aW5nIGEgcGFja2V0IG9mIGxlbmd0aCAlbHUuXG4iLAorCSAgICAgIGRldi0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpc2tiLT5sZW4pOworCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCS8qIERpc2FibGUgYm90aCBpbnRlcnJ1cHRzLiAqLworCW91dHcoMHgwMDAwLCBpb2FkZHIgKyBUWF9JTlRSKTsKKworCS8qIHdhaXQgZm9yIGEgd2hpbGUgKi8KKwl1ZGVsYXkoMSk7CisKKwlvdXR3KGxlbmd0aCwgaW9hZGRyICsgREFUQVBPUlQpOworCW91dHN3KGlvYWRkciArIERBVEFQT1JULCBidWYsIChsZW5ndGggKyAxKSA+PiAxKTsKKworCWxwLT50eF9xdWV1ZSsrOworCWxwLT50eF9xdWV1ZV9sZW4gKz0gKChsZW5ndGgrMykgJiB+MSk7CisKKwlpZiAobHAtPnR4X3N0YXJ0ZWQgPT0gMCkgeworCSAgICAvKiBJZiB0aGUgVHggaXMgaWRsZSwgYWx3YXlzIHRyaWdnZXIgYSB0cmFuc21pdC4gKi8KKwkgICAgb3V0YihET19UWCB8IGxwLT50eF9xdWV1ZSwgaW9hZGRyICsgVFhfU1RBUlQpOworCSAgICBscC0+c2VudCA9IGxwLT50eF9xdWV1ZSA7CisJICAgIGxwLT50eF9xdWV1ZSA9IDA7CisJICAgIGxwLT50eF9xdWV1ZV9sZW4gPSAwOworCSAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkgICAgbHAtPnR4X3N0YXJ0ZWQgPSAxOworCSAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCX0gZWxzZSB7CisJICAgIGlmKCBzcmFtX2NvbmZpZyA9PSAwICkgeworCQlpZiAobHAtPnR4X3F1ZXVlX2xlbiA8ICg0MDk2IC0gKEVUSF9GUkFNRV9MRU4gKzIpKSApCisJCSAgICAvKiBZZXMsIHRoZXJlIGlzIHJvb20gZm9yIG9uZSBtb3JlIHBhY2tldC4gKi8KKwkJICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJICAgIH0gZWxzZSB7CisJCWlmIChscC0+dHhfcXVldWVfbGVuIDwgKDgxOTIgLSAoRVRIX0ZSQU1FX0xFTiArMikpICYmIAorCQkJCQkJbHAtPnR4X3F1ZXVlIDwgMTI3ICkKKwkJICAgIC8qIFllcywgdGhlcmUgaXMgcm9vbSBmb3Igb25lIG1vcmUgcGFja2V0LiAqLworCQkgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkgICAgfQorCX0KKworCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCisJb3V0YihEX1RYX0lOVFIsIGlvYWRkciArIFRYX0lOVFIpOworCW91dGIoRF9SWF9JTlRSLCBpb2FkZHIgKyBSWF9JTlRSKTsKKyAgICB9CisgICAgZGV2X2tmcmVlX3NrYiAoc2tiKTsKKworICAgIHJldHVybiAwOworfSAvKiBmam5fc3RhcnRfeG1pdCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgZmpuX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGk7CisKKyAgICBERUJVRyg0LCAiZmpuX3Jlc2V0KCVzKSBjYWxsZWQuXG4iLGRldi0+bmFtZSk7CisKKyAgICAvKiBSZXNldCBjb250cm9sbGVyICovCisgICAgaWYoIHNyYW1fY29uZmlnID09IDAgKSAKKwlvdXRiKENPTkZJRzBfUlNULCBpb2FkZHIgKyBDT05GSUdfMCk7CisgICAgZWxzZQorCW91dGIoQ09ORklHMF9SU1RfMSwgaW9hZGRyICsgQ09ORklHXzApOworCisgICAgLyogUG93ZXIgT24gY2hpcCBhbmQgc2VsZWN0IGJhbmsgMCAqLworICAgIGlmIChscC0+Y2FyZHR5cGUgPT0gTUJIMTAzMDIpCisJb3V0YihCQU5LXzAsIGlvYWRkciArIENPTkZJR18xKTsKKyAgICBlbHNlCisJb3V0YihCQU5LXzBVLCBpb2FkZHIgKyBDT05GSUdfMSk7CisKKyAgICAvKiBTZXQgVHggbW9kZXMgKi8KKyAgICBvdXRiKERfVFhfTU9ERSwgaW9hZGRyICsgVFhfTU9ERSk7CisgICAgLyogc2V0IFJ4IG1vZGVzICovCisgICAgb3V0YihJRF9NQVRDSEVELCBpb2FkZHIgKyBSWF9NT0RFKTsKKworICAgIC8qIFNldCBoYXJkd2FyZSBhZGRyZXNzICovCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgCisgICAgICAgIG91dGIoZGV2LT5kZXZfYWRkcltpXSwgaW9hZGRyICsgTk9ERV9JRCArIGkpOworCisgICAgLyogU3dpdGNoIHRvIGJhbmsgMSAqLworICAgIGlmIChscC0+Y2FyZHR5cGUgPT0gTUJIMTAzMDIpCisJb3V0YihCQU5LXzEsIGlvYWRkciArIENPTkZJR18xKTsKKyAgICBlbHNlCisJb3V0YihCQU5LXzFVLCBpb2FkZHIgKyBDT05GSUdfMSk7CisKKyAgICAvKiBzZXQgdGhlIG11bHRpY2FzdCB0YWJsZSB0byBhY2NlcHQgbm9uZS4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSAKKyAgICAgICAgb3V0YigweDAwLCBpb2FkZHIgKyBNQVJfQURSICsgaSk7CisKKyAgICAvKiBTd2l0Y2ggdG8gYmFuayAyIChydW50aW1lIG1vZGUpICovCisgICAgaWYgKGxwLT5jYXJkdHlwZSA9PSBNQkgxMDMwMikKKwlvdXRiKEJBTktfMiwgaW9hZGRyICsgQ09ORklHXzEpOworICAgIGVsc2UKKwlvdXRiKEJBTktfMlUsIGlvYWRkciArIENPTkZJR18xKTsKKworICAgIC8qIHNldCAxNmNvbCBjdHJsIGJpdHMgKi8KKyAgICBpZiggbHAtPmNhcmR0eXBlID09IFRESyB8fCBscC0+Y2FyZHR5cGUgPT0gQ09OVEVDKSAKKyAgICAgICAgb3V0YihUREtfQVVUT19NT0RFLCBpb2FkZHIgKyBDT0xfQ1RSTCk7CisgICAgZWxzZQorICAgICAgICBvdXRiKEFVVE9fTU9ERSwgaW9hZGRyICsgQ09MX0NUUkwpOworCisgICAgLyogY2xlYXIgUmVzZXJ2ZWQgUmVncyAqLworICAgIG91dGIoMHgwMCwgaW9hZGRyICsgQk1QUjEyKTsKKyAgICBvdXRiKDB4MDAsIGlvYWRkciArIEJNUFIxMyk7CisKKyAgICAvKiByZXNldCBTa2lwIHBhY2tldCByZWcuICovCisgICAgb3V0YigweDAxLCBpb2FkZHIgKyBSWF9TS0lQKTsKKworICAgIC8qIEVuYWJsZSBUeCBhbmQgUnggKi8KKyAgICBpZiggc3JhbV9jb25maWcgPT0gMCApCisJb3V0YihDT05GSUcwX0RGTCwgaW9hZGRyICsgQ09ORklHXzApOworICAgIGVsc2UKKwlvdXRiKENPTkZJRzBfREZMXzEsIGlvYWRkciArIENPTkZJR18wKTsKKworICAgIC8qIEluaXQgcmVjZWl2ZSBwb2ludGVyID8gKi8KKyAgICBpbncoaW9hZGRyICsgREFUQVBPUlQpOworICAgIGludyhpb2FkZHIgKyBEQVRBUE9SVCk7CisKKyAgICAvKiBDbGVhciBhbGwgc3RhdHVzICovCisgICAgb3V0YigweGZmLCBpb2FkZHIgKyBUWF9TVEFUVVMpOworICAgIG91dGIoMHhmZiwgaW9hZGRyICsgUlhfU1RBVFVTKTsKKworICAgIGlmIChscC0+Y2FyZHR5cGUgPT0gTUJIMTAzMDIpCisJb3V0YihJTlRSX09GRiwgaW9hZGRyICsgTEFOX0NUUkwpOworCisgICAgLyogVHVybiBvbiBSeCBpbnRlcnJ1cHRzICovCisgICAgb3V0YihEX1RYX0lOVFIsIGlvYWRkciArIFRYX0lOVFIpOworICAgIG91dGIoRF9SWF9JTlRSLCBpb2FkZHIgKyBSWF9JTlRSKTsKKworICAgIC8qIFR1cm4gb24gaW50ZXJydXB0cyBmcm9tIExBTiBjYXJkIGNvbnRyb2xsZXIgKi8KKyAgICBpZiAobHAtPmNhcmR0eXBlID09IE1CSDEwMzAyKQorCW91dGIoSU5UUl9PTiwgaW9hZGRyICsgTEFOX0NUUkwpOworfSAvKiBmam5fcmVzZXQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGZqbl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBib2d1c2NvdW50ID0gMTA7CS8qIDUgLT4gMTA6IGJ5IGFneSAxOTk0MDkyMiAqLworCisgICAgREVCVUcoNCwgIiVzOiBpbiByeF9wYWNrZXQoKSwgcnhfc3RhdHVzICUwMnguXG4iLAorCSAgZGV2LT5uYW1lLCBpbmIoaW9hZGRyICsgUlhfU1RBVFVTKSk7CisKKyAgICB3aGlsZSAoKGluYihpb2FkZHIgKyBSWF9NT0RFKSAmIEZfQlVGX0VNUCkgPT0gMCkgeworCXVfc2hvcnQgc3RhdHVzID0gaW53KGlvYWRkciArIERBVEFQT1JUKTsKKworCURFQlVHKDQsICIlczogUnhpbmcgcGFja2V0IG1vZGUgJTAyeCBzdGF0dXMgJTA0eC5cbiIsCisJICAgICAgZGV2LT5uYW1lLCBpbmIoaW9hZGRyICsgUlhfTU9ERSksIHN0YXR1cyk7CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwlpZiAoc3RhdHVzID09IDApIHsKKwkgICAgb3V0YihGX1NLUF9QS1QsIGlvYWRkciArIFJYX1NLSVApOworCSAgICBicmVhazsKKwl9CisjZW5kaWYKKwlpZiAoKHN0YXR1cyAmIDB4RjApICE9IDB4MjApIHsJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLworCSAgICBscC0+c3RhdHMucnhfZXJyb3JzKys7CisJICAgIGlmIChzdGF0dXMgJiBGX0xFTl9FUlIpIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJICAgIGlmIChzdGF0dXMgJiBGX0FMR19FUlIpIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkgICAgaWYgKHN0YXR1cyAmIEZfQ1JDX0VSUikgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkgICAgaWYgKHN0YXR1cyAmIEZfT1ZSX0ZMTykgbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJfSBlbHNlIHsKKwkgICAgdV9zaG9ydCBwa3RfbGVuID0gaW53KGlvYWRkciArIERBVEFQT1JUKTsKKwkgICAgLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJICAgIHN0cnVjdCBza19idWZmICpza2I7CisKKwkgICAgaWYgKHBrdF9sZW4gPiAxNTUwKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFRoZSBGTVYtMTh4IGNsYWltZWQgYSB2ZXJ5ICIKKwkJICAgICAgICJsYXJnZSBwYWNrZXQsIHNpemUgJWQuXG4iLCBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQlvdXRiKEZfU0tQX1BLVCwgaW9hZGRyICsgUlhfU0tJUCk7CisJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzIpOworCSAgICBpZiAoc2tiID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nICIKKwkJICAgICAgICJwYWNrZXQgKGxlbiAlZCkuXG4iLCBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQlvdXRiKEZfU0tQX1BLVCwgaW9hZGRyICsgUlhfU0tJUCk7CisJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWJyZWFrOworCSAgICB9CisJICAgIHNrYi0+ZGV2ID0gZGV2OworCisJICAgIHNrYl9yZXNlcnZlKHNrYiwgMik7CisJICAgIGluc3coaW9hZGRyICsgREFUQVBPUlQsIHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwKKwkJIChwa3RfbGVuICsgMSkgPj4gMSk7CisJICAgIHNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKwkgICAgaWYgKHBjX2RlYnVnID4gNSkgeworCQlpbnQgaTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSeGVkIHBhY2tldCBvZiBsZW5ndGggJWQ6ICIsCisJCSAgICAgICBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykKKwkJICAgIHByaW50aygiICUwMngiLCBza2ItPmRhdGFbaV0pOworCQlwcmludGsoIi5cbiIpOworCSAgICB9CisjZW5kaWYKKworCSAgICBuZXRpZl9yeChza2IpOworCSAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCSAgICBscC0+c3RhdHMucnhfcGFja2V0cysrOworCSAgICBscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwl9CisJaWYgKC0tYm9ndXNjb3VudCA8PSAwKQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBJZiBhbnkgd29ydGgtd2hpbGUgcGFja2V0cyBoYXZlIGJlZW4gcmVjZWl2ZWQsIGRldl9yaW50KCkKKwkgICBoYXMgZG9uZSBhIG5ldGlmX3dha2VfcXVldWUoKSBmb3IgdXMgYW5kIHdpbGwgd29yayBvbiB0aGVtCisJICAgd2hlbiB3ZSBnZXQgdG8gdGhlIGJvdHRvbS1oYWxmIHJvdXRpbmUuICovCisvKgorICAgIGlmIChscC0+Y2FyZHR5cGUgIT0gVERLKSB7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkgICAgaWYgKChpbmIoaW9hZGRyICsgUlhfTU9ERSkgJiBGX0JVRl9FTVApID09IEZfQlVGX0VNUCkKKwkJYnJlYWs7CisJICAgICh2b2lkKWludyhpb2FkZHIgKyBEQVRBUE9SVCk7ICAvKyBkdW1teSBzdGF0dXMgcmVhZCArLworCSAgICBvdXRiKEZfU0tQX1BLVCwgaW9hZGRyICsgUlhfU0tJUCk7CisJfQorCisJaWYgKGkgPiAwKQorCSAgICBERUJVRyg1LCAiJXM6IEV4aW50IFJ4IHBhY2tldCB3aXRoIG1vZGUgJTAyeCBhZnRlciAiCisJCSAgIiVkIHRpY2tzLlxuIiwgZGV2LT5uYW1lLCBpbmIoaW9hZGRyICsgUlhfTU9ERSksIGkpOworICAgIH0KKyovCisKKyAgICByZXR1cm47Cit9IC8qIGZqbl9yeCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiUENNQ0lBIDB4JWx4IiwgZGV2LT5iYXNlX2FkZHIpOworfQorCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgdTMyIG5ldGRldl9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gcGNfZGVidWc7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCXBjX2RlYnVnID0gbGV2ZWw7Cit9CisjZW5kaWYgLyogUENNQ0lBX0RFQlVHICovCisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisjaWZkZWYgUENNQ0lBX0RFQlVHCisJLmdldF9tc2dsZXZlbAkJPSBuZXRkZXZfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X3NldF9tc2dsZXZlbCwKKyNlbmRpZiAvKiBQQ01DSUFfREVCVUcgKi8KK307CisKK3N0YXRpYyBpbnQgZmpuX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCl7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmpuX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZscC0+bGluazsKKworICAgIERFQlVHKDQsICJmam5fb3BlbignJXMnKS5cbiIsIGRldi0+bmFtZSk7CisKKyAgICBpZiAoIURFVl9PSyhsaW5rKSkKKwlyZXR1cm4gLUVOT0RFVjsKKyAgICAKKyAgICBsaW5rLT5vcGVuKys7CisgICAgCisgICAgZmpuX3Jlc2V0KGRldik7CisgICAgCisgICAgbHAtPnR4X3N0YXJ0ZWQgPSAwOworICAgIGxwLT50eF9xdWV1ZSA9IDA7CisgICAgbHAtPnR4X3F1ZXVlX2xlbiA9IDA7CisgICAgbHAtPm9wZW5fdGltZSA9IGppZmZpZXM7CisgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30gLyogZmpuX29wZW4gKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgZmpuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIERFQlVHKDQsICJmam5fY2xvc2UoJyVzJykuXG4iLCBkZXYtPm5hbWUpOworCisgICAgbHAtPm9wZW5fdGltZSA9IDA7CisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgLyogU2V0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMCB0byBkaXNhYmxlIFR4IGFuZCBSeC4gKi8KKyAgICBpZiggc3JhbV9jb25maWcgPT0gMCApIAorCW91dGIoQ09ORklHMF9SU1QgLGlvYWRkciArIENPTkZJR18wKTsKKyAgICBlbHNlCisJb3V0YihDT05GSUcwX1JTVF8xICxpb2FkZHIgKyBDT05GSUdfMCk7CisKKyAgICAvKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3MgLS0gVG9Eby4gKi8KKworICAgIC8qIFBvd2VyLWRvd24gdGhlIGNoaXAuICBHcmVlbiwgZ3JlZW4sIGdyZWVuISAqLworICAgIG91dGIoQ0hJUF9PRkYgLGlvYWRkciArIENPTkZJR18xKTsKKworICAgIC8qIFNldCB0aGUgZXRoZXJuZXQgYWRhcHRvciBkaXNhYmxlIElSUSAqLworICAgIGlmIChscC0+Y2FyZHR5cGUgPT0gTUJIMTAzMDIpCisJb3V0YihJTlRSX09GRiwgaW9hZGRyICsgTEFOX0NUUkwpOworCisgICAgbGluay0+b3Blbi0tOworCisgICAgcmV0dXJuIDA7Cit9IC8qIGZqbl9jbG9zZSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpmam5fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgcmV0dXJuICZscC0+c3RhdHM7Cit9IC8qIGZqbl9nZXRfc3RhdHMgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgIFNldCB0aGUgbXVsdGljYXN0L3Byb21pc2N1b3VzIG1vZGUgZm9yIHRoaXMgYWRhcHRvci4KKyovCisKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzdHJ1Y3QgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIG1jX2ZpbHRlcls4XTsJCSAvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKyAgICB1X2xvbmcgZmxhZ3M7CisgICAgaW50IGk7CisgICAgCisgICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJcHJpbnRrKCIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwltZW1zZXQobWNfZmlsdGVyLCAweGZmLCBzaXplb2YobWNfZmlsdGVyKSk7CisJb3V0YigzLCBpb2FkZHIgKyBSWF9NT0RFKTsJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKyAgICB9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPiBNQ19GSUxURVJCUkVBSworCSAgICAgICB8fCAgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJLyogVG9vIG1hbnkgdG8gZmlsdGVyIHBlcmZlY3RseSAtLSBhY2NlcHQgYWxsIG11bHRpY2FzdHMuICovCisJbWVtc2V0KG1jX2ZpbHRlciwgMHhmZiwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCW91dGIoMiwgaW9hZGRyICsgUlhfTU9ERSk7CS8qIFVzZSBub3JtYWwgbW9kZS4gKi8KKyAgICB9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPT0gMCkgeworCW1lbXNldChtY19maWx0ZXIsIDB4MDAsIHNpemVvZihtY19maWx0ZXIpKTsKKwlvdXRiKDEsIGlvYWRkciArIFJYX01PREUpOwkvKiBJZ25vcmUgYWxtb3N0IGFsbCBtdWx0aWNhc3RzLiAqLworICAgIH0gZWxzZSB7CisJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJaW50IGk7CisJCisJbWVtc2V0KG1jX2ZpbHRlciwgMCwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkgICAgdW5zaWduZWQgaW50IGJpdCA9CisJICAgIAlldGhlcl9jcmNfbGUoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpICYgMHgzZjsKKwkgICAgbWNfZmlsdGVyW2JpdCA+PiAzXSB8PSAoMSA8PCBiaXQpOworCX0KKyAgICB9CisKKyAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7IAorICAgIGlmIChtZW1jbXAobWNfZmlsdGVyLCBscC0+bWNfZmlsdGVyLCBzaXplb2YobWNfZmlsdGVyKSkpIHsKKwlpbnQgc2F2ZWRfYmFuayA9IGluYihpb2FkZHIgKyBDT05GSUdfMSk7CisJLyogU3dpdGNoIHRvIGJhbmsgMSBhbmQgc2V0IHRoZSBtdWx0aWNhc3QgdGFibGUuICovCisJb3V0YigweGU0LCBpb2FkZHIgKyBDT05GSUdfMSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkgICAgb3V0YihtY19maWx0ZXJbaV0sIGlvYWRkciArIDggKyBpKTsKKwltZW1jcHkobHAtPm1jX2ZpbHRlciwgbWNfZmlsdGVyLCBzaXplb2YobWNfZmlsdGVyKSk7CisJb3V0YihzYXZlZF9iYW5rLCBpb2FkZHIgKyBDT05GSUdfMSk7CisgICAgfQorICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2libXRyX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwN2NjZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jCkBAIC0wLDAgKzEsNTM1IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEEgUENNQ0lBIHRva2VuLXJpbmcgZHJpdmVyIGZvciBJQk0tYmFzZWQgY2FyZHMKKworICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBJQk0gUENNQ0lBIFRva2VuLVJpbmcgQ2FyZC4KKyAgICBXcml0dGVuIGJ5IFN0ZXZlIEtpcGlzeiwga2lwaXN6QHZuZXQuaWJtLmNvbSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5neUBpYm0ubmV0CisKKyAgICBXcml0dGVuIDE5OTUsMTk5Ni4KKworICAgIFRoaXMgY29kZSBpcyBiYXNlZCBvbiBwY25ldF9jcy5jIGZyb20gRGF2aWQgSGluZHMuCisgICAgCisgICAgVjIuMi4wIEZlYnJ1YXJ5IDE5OTkgLSBNaWtlIFBoaWxsaXBzIHBoaWxsaW1AYW10cmFrLmNvbQorCisgICAgTGludXggVjIuMi54IHByZXNlbnRlZCBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nCisgICAgaWJtdHIuYyBjb2RlLiAgTWFpbmx5IHRoZSBjb2RlIGJlY2FtZSBhIGxvdCBtb3JlIG9yZ2FuaXplZCBhbmQKKyAgICBtb2R1bGFyLgorCisgICAgVGhpcyBjYXVzZWQgdGhlIG9sZCBQQ01DSUEgVG9rZW4gUmluZyBkcml2ZXIgdG8gZ2l2ZSB1cCBhbmQgZ28gCisgICAgaG9tZSBlYXJseS4gSW5zdGVhZCBvZiBqdXN0IHBhdGNoaW5nIHRoZSBvbGQgY29kZSB0byBtYWtlIGl0IAorICAgIHdvcmssIHRoZSBQQ01DSUEgY29kZSBoYXMgYmVlbiBzdHJlYW1saW5lZCwgdXBkYXRlZCBhbmQgcG9zc2libHkKKyAgICBpbXByb3ZlZC4KKworICAgIFRoaXMgY29kZSBub3cgb25seSBjb250YWlucyBjb2RlIHJlcXVpcmVkIGZvciB0aGUgQ2FyZCBTZXJ2aWNlcy4KKyAgICBBbGwgd2UgZG8gaGVyZSBpcyBzZXQgdGhlIGNhcmQgdXAgZW5vdWdoIHNvIHRoYXQgdGhlIHJlYWwgaWJtdHIuYworICAgIGRyaXZlciBjYW4gZmluZCBpdCBhbmQgd29yayB3aXRoIGl0IHByb3Blcmx5LgorCisgICAgaS5lLiBXZSBzZXQgdXAgdGhlIGlvIHBvcnQsIGlycSwgbW1pbyBtZW1vcnkgYW5kIHNoYXJlZCByYW0KKyAgICBtZW1vcnkuICBUaGlzIGVuYWJsZXMgaWJtdHJfcHJvYmUgaW4gaWJtdHIuYyB0byBmaW5kIHRoZSBjYXJkIGFuZAorICAgIGNvbmZpZ3VyZSBpdCBhcyB0aG91Z2ggaXQgd2FzIGEgbm9ybWFsIElTQSBhbmQvb3IgUG5QIGNhcmQuCisKKyAgICBDSEFOR0VTCisKKyAgICB2Mi4yLjUgQXByaWwgMTk5OSBNaWtlIFBoaWxsaXBzIChwaGlsbGltQGFtdHJhay5jb20pCisgICAgT2JzY3VyZSBidWcgZml4LCByZXF1aXJlZCBjaGFuZ2VkIHRvIGlibXRyLmMgbm90IGlibXRyX2NzLmMKKyAgICAKKyAgICB2Mi4yLjcgTWF5IDE5OTkgTWlrZSBQaGlsbGlwcyAocGhpbGxpbUBhbXRyYWsuY29tKQorICAgIFVwZGF0ZWQgdG8gdmVyc2lvbiAyLjIuNyB0byBtYXRjaCB0aGUgZmlyc3QgdmVyc2lvbiBvZiB0aGUga2VybmVsCisgICAgdGhhdCB0aGUgbW9kaWZpY2F0aW9uIHRvIGlibXRyLmMgd2VyZSBpbmNvcnBvcmF0ZWQgaW50by4KKyAgICAKKyAgICB2Mi4yLjE3IEp1bHkgMjAwMCBCdXJ0IFNpbHZlcm1hbiAoYnVydHNAdXMuaWJtLmNvbSkKKyAgICBBZGRyZXNzIHRyYW5zbGF0aW9uIGZlYXR1cmUgb2YgUENNQ0lBIGNvbnRyb2xsZXIgaXMgdXNhYmxlIHNvCisgICAgbWVtb3J5IHdpbmRvd3MgY2FuIGJlIHBsYWNlZCBpbiBIaWdoIG1lbW9yeSAobWVhbmluZyBhYm92ZQorICAgIDB4RkZGRkYuKQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pYm10ci5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBQQ01DSUEKKyNpbmNsdWRlICIuLi90b2tlbnJpbmcvaWJtdHIuYyIKKworI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIGludCBwY19kZWJ1ZyA9IFBDTUNJQV9ERUJVRzsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwKTsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0KKyJpYm10cl9jcy5jIDEuMTAgICAxOTk2LzAxLzA2IDA1OjE5OjAwIChTdGV2ZSBLaXBpc3opXG4iCisiICAgICAgICAgICAyLjIuNyAgMTk5OS8wNS8wMyAxMjowMDowMCAoTWlrZSBQaGlsbGlwcylcbiIKKyIgICAgICAgICAgIDIuNC4yICAyMDAxLzMwLzI4IE1pZG5pZ2h0IChCdXJ0IFNpbHZlcm1hbilcbiI7CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCB3aXRoICdpbnNtb2QnICovCisKKy8qIE1NSU8gYmFzZSBhZGRyZXNzICovCitzdGF0aWMgdV9sb25nIG1taW9iYXNlID0gMHhjZTAwMDsKKworLyogU1JBTSBiYXNlIGFkZHJlc3MgKi8KK3N0YXRpYyB1X2xvbmcgc3JhbWJhc2UgPSAweGQwMDAwOworCisvKiBTUkFNIHNpemUgOCwxNiwzMiw2NCAqLworc3RhdGljIHVfbG9uZyBzcmFtc2l6ZSA9IDY0OworCisvKiBSaW5nc3BlZWQgNCwxNiAqLworc3RhdGljIGludCByaW5nc3BlZWQgPSAxNjsKKworbW9kdWxlX3BhcmFtKG1taW9iYXNlLCB1bG9uZywgMCk7Cittb2R1bGVfcGFyYW0oc3JhbWJhc2UsIHVsb25nLCAwKTsKK21vZHVsZV9wYXJhbShzcmFtc2l6ZSwgdWxvbmcsIDApOworbW9kdWxlX3BhcmFtKHJpbmdzcGVlZCwgaW50LCAwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGlibXRyX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkIGlibXRyX2h3X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfaW50IG1taW9iYXNlKTsKK3N0YXRpYyB2b2lkIGlibXRyX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50IGlibXRyX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAiaWJtdHJfY3MiOworCitzdGF0aWMgZGV2X2xpbmtfdCAqaWJtdHJfYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgaWJtdHJfZGV0YWNoKGRldl9saW5rX3QgKik7CisKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsKKworZXh0ZXJuIGludCBpYm10cl9wcm9iZV9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGlycXJldHVybl90IHRva19pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgaWJtdHJfZGV2X3QgeworICAgIGRldl9saW5rX3QJCWxpbms7CisgICAgc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKyAgICBkZXZfbm9kZV90ICAgICAgICAgIG5vZGU7CisgICAgd2luZG93X2hhbmRsZV90ICAgICBzcmFtX3dpbl9oYW5kbGU7CisgICAgc3RydWN0IHRva19pbmZvCSp0aTsKK30gaWJtdHJfZGV2X3Q7CisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgImlibXRyX2NzIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIGlibXRyX2F0dGFjaCgpIGNyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nCisgICAgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGRldl9saW5rX3QgKmlibXRyX2F0dGFjaCh2b2lkKQoreworICAgIGlibXRyX2Rldl90ICppbmZvOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKyAgICBpbnQgcmV0OworICAgIAorICAgIERFQlVHKDAsICJpYm10cl9hdHRhY2goKVxuIik7CisKKyAgICAvKiBDcmVhdGUgbmV3IHRva2VuLXJpbmcgZGV2aWNlICovCisgICAgaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7IAorICAgIGlmICghaW5mbykgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KGluZm8sMCxzaXplb2YoKmluZm8pKTsKKyAgICBkZXYgPSBhbGxvY190cmRldihzaXplb2Yoc3RydWN0IHRva19pbmZvKSk7CisgICAgaWYgKCFkZXYpIHsgCisJa2ZyZWUoaW5mbyk7IAorCXJldHVybiBOVUxMOworICAgIH0gCisKKyAgICBsaW5rID0gJmluZm8tPmxpbms7CisgICAgbGluay0+cHJpdiA9IGluZm87CisgICAgaW5mby0+dGkgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKyAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSA0OworICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gMTY7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisgICAgbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworICAgIGxpbmstPmlycS5IYW5kbGVyID0gJnRva19pbnRlcnJ1cHQ7CisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CisKKyAgICBsaW5rLT5pcnEuSW5zdGFuY2UgPSBpbmZvLT5kZXYgPSBkZXY7CisgICAgCisgICAgU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7CisKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorICAgICAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisgICAgICAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisgICAgICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmlibXRyX2V2ZW50OworICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCWdvdG8gb3V0X2RldGFjaDsKKyAgICB9CisKK291dDoKKyAgICByZXR1cm4gbGluazsKKworb3V0X2RldGFjaDoKKyAgICBpYm10cl9kZXRhY2gobGluayk7CisgICAgbGluayA9IE5VTEw7CisgICAgZ290byBvdXQ7Cit9IC8qIGlibXRyX2F0dGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgICAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAgICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBpYm10cl9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgaWJtdHJfZGV2X3QgKmluZm8gPSBsaW5rLT5wcml2OworICAgIGRldl9saW5rX3QgKipsaW5rcDsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisgICAgREVCVUcoMCwgImlibXRyX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisKKyAgICAvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisgICAgICAgIGlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisgICAgaWYgKCpsaW5rcCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICBkZXYgPSBpbmZvLT5kZXY7CisKKyAgICBpZiAobGluay0+ZGV2KQorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKyAgICB7CisJc3RydWN0IHRva19pbmZvICp0aSA9IG5ldGRldl9wcml2KGRldik7CisJZGVsX3RpbWVyX3N5bmMoJih0aS0+dHJfdGltZXIpKTsKKyAgICB9CisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKyAgICAgICAgaWJtdHJfcmVsZWFzZShsaW5rKTsKKworICAgIGlmIChsaW5rLT5oYW5kbGUpCisgICAgICAgIHBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisgICAgLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgYml0cyAqLworICAgICpsaW5rcCA9IGxpbmstPm5leHQ7CisgICAgZnJlZV9uZXRkZXYoZGV2KTsKKyAgICBrZnJlZShpbmZvKTsgCit9IC8qIGlibXRyX2RldGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIGlibXRyX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorICAgIGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICAgIHRva2VuLXJpbmcgZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBpYm10cl9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworICAgIGlibXRyX2Rldl90ICppbmZvID0gbGluay0+cHJpdjsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+ZGV2OworICAgIHN0cnVjdCB0b2tfaW5mbyAqdGkgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICB3aW5fcmVxX3QgcmVxOworICAgIG1lbXJlcV90IG1lbTsKKyAgICBpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm47CisgICAgdV9jaGFyIGJ1Zls2NF07CisKKyAgICBERUJVRygwLCAiaWJtdHJfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworCisgICAgLyogQ29uZmlndXJlIGNhcmQgKi8KKyAgICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IDB4NjE7CisKKyAgICAvKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBQUklNQVJZIG9yIEFMVEVSTkFURS4gKi8KKworICAgIC8qIFRyeSBQUklNQVJZIGNhcmQgYXQgMHhBMjAtMHhBMjMgKi8KKyAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSAweEEyMDsKKyAgICBpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwkvKiBDb3VsZG4ndCBnZXQgMHhBMjAtMHhBMjMuICBUcnkgQUxURVJOQVRFIGF0IDB4QTI0LTB4QTI3LiAqLworCWxpbmstPmlvLkJhc2VQb3J0MSA9IDB4QTI0OworCUNTX0NIRUNLKFJlcXVlc3RJTywgcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pKTsKKyAgICB9CisgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisKKyAgICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKSk7CisgICAgZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisgICAgdGktPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKyAgICB0aS0+Z2xvYmFsX2ludF9lbmFibGU9R0xPQkFMX0lOVF9FTkFCTEUrKChkZXYtPmlycT09OSkgPyAyIDogZGV2LT5pcnEpOworCisgICAgLyogQWxsb2NhdGUgdGhlIE1NSU8gbWVtb3J5IHdpbmRvdyAqLworICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfMTZ8V0lOX01FTU9SWV9UWVBFX0NNfFdJTl9FTkFCTEU7CisgICAgcmVxLkF0dHJpYnV0ZXMgfD0gV0lOX1VTRV9XQUlUOworICAgIHJlcS5CYXNlID0gMDsgCisgICAgcmVxLlNpemUgPSAweDIwMDA7CisgICAgcmVxLkFjY2Vzc1NwZWVkID0gMjUwOworICAgIENTX0NIRUNLKFJlcXVlc3RXaW5kb3csIHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKSk7CisKKyAgICBtZW0uQ2FyZE9mZnNldCA9IG1taW9iYXNlOworICAgIG1lbS5QYWdlID0gMDsKKyAgICBDU19DSEVDSyhNYXBNZW1QYWdlLCBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmstPndpbiwgJm1lbSkpOworICAgIHRpLT5tbWlvID0gaW9yZW1hcChyZXEuQmFzZSwgcmVxLlNpemUpOworCisgICAgLyogQWxsb2NhdGUgdGhlIFNSQU0gbWVtb3J5IHdpbmRvdyAqLworICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfMTZ8V0lOX01FTU9SWV9UWVBFX0NNfFdJTl9FTkFCTEU7CisgICAgcmVxLkF0dHJpYnV0ZXMgfD0gV0lOX1VTRV9XQUlUOworICAgIHJlcS5CYXNlID0gMDsKKyAgICByZXEuU2l6ZSA9IHNyYW1zaXplICogMTAyNDsKKyAgICByZXEuQWNjZXNzU3BlZWQgPSAyNTA7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdFdpbmRvdywgcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZpbmZvLT5zcmFtX3dpbl9oYW5kbGUpKTsKKworICAgIG1lbS5DYXJkT2Zmc2V0ID0gc3JhbWJhc2U7CisgICAgbWVtLlBhZ2UgPSAwOworICAgIENTX0NIRUNLKE1hcE1lbVBhZ2UsIHBjbWNpYV9tYXBfbWVtX3BhZ2UoaW5mby0+c3JhbV93aW5faGFuZGxlLCAmbWVtKSk7CisKKyAgICB0aS0+c3JhbV9iYXNlID0gbWVtLkNhcmRPZmZzZXQgPj4gMTI7CisgICAgdGktPnNyYW1fdmlydCA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKKyAgICB0aS0+c3JhbV9waHlzID0gcmVxLkJhc2U7CisKKyAgICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSk7CisKKyAgICAvKiAgU2V0IHVwIHRoZSBUb2tlbi1SaW5nIENvbnRyb2xsZXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBhbmQKKyAgICAgICAgdHVybiBvbiB0aGUgY2FyZC4gIENoZWNrIHRoZSAiTG9jYWwgQXJlYSBOZXR3b3JrIENyZWRpdCBDYXJkCisgICAgICAgIEFkYXB0ZXJzIFRlY2huaWNhbCBSZWZlcmVuY2UiICBTQzMwLTM1ODUgZm9yIHRoaXMgaW5mby4gICovCisgICAgaWJtdHJfaHdfc2V0dXAoZGV2LCBtbWlvYmFzZSk7CisKKyAgICBsaW5rLT5kZXYgPSAmaW5mby0+bm9kZTsKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisKKyAgICBpID0gaWJtdHJfcHJvYmVfY2FyZChkZXYpOworICAgIGlmIChpICE9IDApIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgImlibXRyX2NzOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworCWxpbmstPmRldiA9IE5VTEw7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgc3RyY3B5KGluZm8tPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogcG9ydCAlIzNseCwgaXJxICVkLCIsCisgICAgICAgICAgIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKyAgICBwcmludGsgKCIgbW1pbyAlIzVseCwiLCAodV9sb25nKXRpLT5tbWlvKTsKKyAgICBwcmludGsgKCIgc3JhbSAlIzVseCwiLCAodV9sb25nKXRpLT5zcmFtX2Jhc2UgPDwgMTIpOworICAgIHByaW50ayAoIlxuIiBLRVJOX0lORk8gIiAgaHdhZGRyPSIpOworICAgIGZvciAoaSA9IDA7IGkgPCBUUl9BTEVOOyBpKyspCisgICAgICAgIHByaW50aygiJTAyWCIsIGRldi0+ZGV2X2FkZHJbaV0pOworICAgIHByaW50aygiXG4iKTsKKyAgICByZXR1cm47CisKK2NzX2ZhaWxlZDoKKyAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKK2ZhaWxlZDoKKyAgICBpYm10cl9yZWxlYXNlKGxpbmspOworfSAvKiBpYm10cl9jb25maWcgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgaWJtdHJfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUgbmV0CisgICAgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgICAgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBpYm10cl9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgaWJtdHJfZGV2X3QgKmluZm8gPSBsaW5rLT5wcml2OworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT5kZXY7CisKKyAgICBERUJVRygwLCAiaWJtdHJfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisKKyAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgIGlmIChsaW5rLT53aW4pIHsKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpb3VubWFwKHRpLT5tbWlvKTsKKwlwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKwlwY21jaWFfcmVsZWFzZV93aW5kb3coaW5mby0+c3JhbV93aW5faGFuZGxlKTsKKyAgICB9CisKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAgICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuICBBIENBUkRfUkVNT1ZBTCBldmVudAorICAgIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgICAgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgaWJtdHJfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICAgIGlibXRyX2Rldl90ICppbmZvID0gbGluay0+cHJpdjsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+ZGV2OworCisgICAgREVCVUcoMSwgImlibXRyX2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKworICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKyAgICAgICAgbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIC8qIHNldCBmbGFnIHRvIGJ5cGFzcyBub3JtYWwgaW50ZXJydXB0IGNvZGUgKi8KKwkgICAgc3RydWN0IHRva19pbmZvICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkgICAgcHJpdi0+c3JhbV9waHlzIHw9IDE7CisJICAgIG5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorICAgICAgICBsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVDsKKwlpYm10cl9jb25maWcobGluayk7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorICAgICAgICBsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKyAgICAgICAgLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKyAgICAgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworICAgICAgICAgICAgaWYgKGxpbmstPm9wZW4pCisJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKyAgICAgICAgICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKyAgICAgICAgbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworICAgICAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisgICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKyAgICAgICAgICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisgICAgICAgICAgICBpZiAobGluay0+b3BlbikgeworCQlpYm10cl9wcm9iZShkZXYpOwkvKiByZWFsbHk/ICovCisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIGlibXRyX2V2ZW50ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBpYm10cl9od19zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2ludCBtbWlvYmFzZSkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIEJpemFycmUgSUJNIGJlaGF2aW9yLCB0aGVyZSBhcmUgMTYgYml0cyBvZiBpbmZvcm1hdGlvbiB3ZQorICAgICAgIG5lZWQgdG8gc2V0LCBidXQgdGhlIGNhcmQgb25seSBhbGxvd3MgdXMgdG8gc2VuZCA0IGJpdHMgYXQgYSAKKyAgICAgICB0aW1lLiAgRm9yIGVhY2ggYnl0ZSBzZW50IHRvIGJhc2VfYWRkciwgYml0cyA3LTQgdGVsbCB0aGUKKyAgICAgICBjYXJkIHdoaWNoIHBhcnQgb2YgdGhlIDE2IGJpdHMgd2UgYXJlIHNldHRpbmcsIGJpdHMgMy0wIGNvbnRhaW4gCisgICAgICAgdGhlIGFjdHVhbCBpbmZvcm1hdGlvbiAqLworCisgICAgLyogRmlyc3QgbmliYmxlIHByb3ZpZGVzIDQgYml0cyBvZiBtbWlvICovCisgICAgaSA9IChtbWlvYmFzZSA+PiAxNikgJiAweDBGOworICAgIG91dGIoaSwgZGV2LT5iYXNlX2FkZHIpOworCisgICAgLyogU2Vjb25kIG5pYmJsZSBwcm92aWRlcyAzIGJpdHMgb2YgbW1pbyAqLworICAgIGkgPSAweDEwIHwgKChtbWlvYmFzZSA+PiAxMikgJiAweDBFKTsKKyAgICBvdXRiKGksIGRldi0+YmFzZV9hZGRyKTsKKworICAgIC8qIFRoaXJkIG5pYmJsZSwgaGFyZC1jb2RlZCB2YWx1ZXMgKi8KKyAgICBpID0gMHgyNjsKKyAgICBvdXRiKGksIGRldi0+YmFzZV9hZGRyKTsKKworICAgIC8qIEZvdXJ0aCBuaWJibGUgc2V0cyBzaGFyZWQgcmFtIHBhZ2Ugc2l6ZSAqLworCisgICAgLyogOCA9IDAwLCAxNiA9IDAxLCAzMiA9IDEwLCA2NCA9IDExICovICAgICAgICAgIAorICAgIGkgPSAoc3JhbXNpemUgPj4gNCkgJiAweDA3OworICAgIGkgPSAoKGkgPT0gNCkgPyAzIDogaSkgPDwgMjsKKyAgICBpIHw9IDB4MzA7CisKKyAgICBpZiAocmluZ3NwZWVkID09IDE2KQorCWkgfD0gMjsKKyAgICBpZiAoZGV2LT5iYXNlX2FkZHIgPT0gMHhBMjQpCisJaSB8PSAxOworICAgIG91dGIoaSwgZGV2LT5iYXNlX2FkZHIpOworCisgICAgLyogMHg0MCB3aWxsIHJlbGVhc2UgdGhlIGNhcmQgZm9yIHVzZSAqLworICAgIG91dGIoMHg0MCwgZGV2LT5iYXNlX2FkZHIpOworCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgaWJtdHJfY3NfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAiaWJtdHJfY3MiLAorCX0sCisJLmF0dGFjaAkJPSBpYm10cl9hdHRhY2gsCisJLmRldGFjaAkJPSBpYm10cl9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2libXRyX2NzKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJmlibXRyX2NzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2libXRyX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZpYm10cl9jc19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9pYm10cl9jcyk7Cittb2R1bGVfZXhpdChleGl0X2libXRyX2NzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjAzODA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jCkBAIC0wLDAgKzEsMTY5OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTGludXggUENNQ0lBIGV0aGVybmV0IGFkYXB0ZXIgZHJpdmVyIGZvciB0aGUgTmV3IE1lZGlhIEV0aGVybmV0IExBTi4KKyAgbm1jbGFuX2NzLmMsdiAwLjE2IDE5OTUvMDcvMDEgMDY6NDI6MTcgcnBhbyBFeHAgcnBhbworCisgIFRoZSBFdGhlcm5ldCBMQU4gdXNlcyB0aGUgQWR2YW5jZWQgTWljcm8gRGV2aWNlcyAoQU1EKSBBbTc5Qzk0MCBNZWRpYQorICBBY2Nlc3MgQ29udHJvbGxlciBmb3IgRXRoZXJuZXQgKE1BQ0UpLiAgSXQgaXMgZXNzZW50aWFsbHkgdGhlIEFtMjE1MAorICBQQ01DSUEgRXRoZXJuZXQgY2FyZCBjb250YWluZWQgaW4gdGhlIEFtMjE1MCBEZW1vIEtpdC4KKworV3JpdHRlbiBieSBSb2dlciBDLiBQYW8gPHJwYW9AcGFvbmV0Lm9yZz4KKyAgQ29weXJpZ2h0IDE5OTUgUm9nZXIgQy4gUGFvCisgIExpbnV4IDIuNSBjbGVhbnVwcyBDb3B5cmlnaHQgUmVkIEhhdCAyMDAzCisKKyAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKK1BvcnRlZCB0byBMaW51eCAxLjMuKiBuZXR3b3JrIGRyaXZlciBlbnZpcm9ubWVudCBieQorICBNYXR0aSBBYXJuaW8gPG1lYUB1dHUuZmk+CisKK1JlZmVyZW5jZXMKKworICBBbTIxNTAgVGVjaG5pY2FsIFJlZmVyZW5jZSBNYW51YWwsIFJldmlzaW9uIDEuMCwgQXVndXN0IDE3LCAxOTkzCisgIEFtNzlDOTQwIChNQUNFKSBEYXRhIFNoZWV0LCAxOTk0CisgIEFtNzlDOTAgKEMtTEFOQ0UpIERhdGEgU2hlZXQsIDE5OTQKKyAgTGludXggUENNQ0lBIFByb2dyYW1tZXIncyBHdWlkZSB2MS4xNworICAvdXNyL3NyYy9saW51eC9uZXQvaW5ldC9kZXYuYywgTGludXgga2VybmVsIDEuMi44CisKKyAgRXJpYyBNZWFycywgTmV3IE1lZGlhIENvcnBvcmF0aW9uCisgIFRvbSBQb2xsYXJkLCBOZXcgTWVkaWEgQ29ycG9yYXRpb24KKyAgRGVhbiBTaWFzb3ljbywgTmV3IE1lZGlhIENvcnBvcmF0aW9uCisgIEtlbiBMZXNuaWFrLCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIDxsZXNuaWFrQGJvc3Rvbi5zZ2kuY29tPgorICBEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPgorICBEYXZpZCBIaW5kcyA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKyAgVGhlIExpbnV4IGNsaWVudCBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIDNjNTg5X2NzLmMgY2xpZW50IGRyaXZlciBieQorICBEYXZpZCBIaW5kcy4KKworICBUaGUgTGludXggbmV0d29yayBkcml2ZXIgb3V0bGluZSBpcyBiYXNlZCBvbiB0aGUgM2M1ODlfY3MuYyBkcml2ZXIsCisgIHRoZSA4MzkwLmMgZHJpdmVyLCBhbmQgdGhlIGV4YW1wbGUgc2tlbGV0b24uYyBrZXJuZWwgY29kZSwgd2hpY2ggYXJlCisgIGJ5IERvbmFsZCBCZWNrZXIuCisKKyAgVGhlIEFtMjE1MCBuZXR3b3JrIGRyaXZlciBoYXJkd2FyZSBpbnRlcmZhY2UgY29kZSBpcyBiYXNlZCBvbiB0aGUKKyAgT1MvOTAwMCBkcml2ZXIgZm9yIHRoZSBOZXcgTWVkaWEgRXRoZXJuZXQgTEFOIGJ5IEVyaWMgTWVhcnMuCisKKyAgU3BlY2lhbCB0aGFua3MgZm9yIHRlc3RpbmcgYW5kIGhlbHAgaW4gZGVidWdnaW5nIHRoaXMgZHJpdmVyIGdvZXMKKyAgdG8gS2VuIExlc25pYWsuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RyaXZlciBOb3RlcyBhbmQgSXNzdWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEuIERldmVsb3BlZCBvbiBhIERlbGwgMzIwU0xpCisgICBQQ01DSUEgQ2FyZCBTZXJ2aWNlcyAyLjYuMgorICAgTGludXggZGVsbCAxLjIuMTAgIzEgVGh1IEp1biAyOSAyMDoyMzo0MSBQRFQgMTk5NSBpMzg2CisKKzIuIHJjLnBjbWNpYSBtYXkgcmVxdWlyZSBsb2FkaW5nIHBjbWNpYV9jb3JlIHdpdGggaW9fc3BlZWQ9MzAwOgorICAgJ2luc21vZCBwY21jaWFfY29yZS5vIGlvX3NwZWVkPTMwMCcuCisgICBUaGlzIHdpbGwgYXZvaWQgcHJvYmxlbXMgd2l0aCBmYXN0IHN5c3RlbXMgd2hpY2ggY2F1c2VzIHJ4X2ZyYW1lY250CisgICB0byByZXR1cm4gcmFuZG9tIHZhbHVlcy4KKworMy4gSWYgaG90IGV4dHJhY3Rpb24gZG9lcyBub3Qgd29yayBmb3IgeW91LCB1c2UgJ2lmY29uZmlnIGV0aDAgZG93bicKKyAgIGJlZm9yZSBleHRyYWN0aW9uLgorCis0LiBUaGVyZSBpcyBhIGJhZCBzbG93LWRvd24gcHJvYmxlbSBpbiB0aGlzIGRyaXZlci4KKworNS4gRnV0dXJlOiBNdWx0aWNhc3QgcHJvY2Vzc2luZy4gIEluIHRoZSBtZWFudGltZSwgZG8gX25vdF8gY29tcGlsZSB5b3VyCisgICBrZXJuZWwgd2l0aCBtdWx0aWNhc3QgaXAgZW5hYmxlZC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSGlzdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTG9nOiBubWNsYW5fY3MuYyx2CisgKiAyLjUuNzUtYWMxIDIwMDMvMDcvMTEgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqIEZpeGVkIGhhbmcgb24gY2FyZCBlamVjdCBhcyB3ZSBwcm9iZSBpdAorICogQ2xlYW5lZCB1cCB0byB1c2UgbmV3IHN0eWxlIGxvY2tpbmcuCisgKgorICogUmV2aXNpb24gMC4xNiAgMTk5NS8wNy8wMSAgMDY6NDI6MTcgIHJwYW8KKyAqIEJ1ZyBmaXg6IG5tY2xhbl9yZXNldCgpIGNhbGxlZCBDYXJkU2VydmljZXMgaW5jb3JyZWN0bHkuCisgKgorICogUmV2aXNpb24gMC4xNSAgMTk5NS8wNS8yNCAgMDg6MDk6NDcgIHJwYW8KKyAqIFJlLWltcGxlbWVudCBNVUxUSV9UWCBkZXYtPnRidXN5IGhhbmRsaW5nLgorICoKKyAqIFJldmlzaW9uIDAuMTQgIDE5OTUvMDUvMjMgIDAzOjE5OjMwICBycGFvCisgKiBBZGRlZCwgaW4gbm1jbGFuX2NvbmZpZygpLCAidHVwbGUuQXR0cmlidXRlcyA9IDA7Ii4KKyAqIE1vZGlmaWVkIE1BQ0UgSUQgY2hlY2sgdG8gaWdub3JlIGNoaXAgcmV2aXNpb24gbGV2ZWwuCisgKiBBdm9pZCB0eF9mcmVlX2ZyYW1lcyByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIF9zdGFydF94bWl0IGFuZCBfaW50ZXJydXB0LgorICoKKyAqIFJldmlzaW9uIDAuMTMgIDE5OTUvMDUvMTggIDA1OjU2OjM0ICBycGFvCisgKiBTdGF0aXN0aWNzIGNoYW5nZXMuCisgKiBCdWcgZml4OiBubWNsYW5fcmVzZXQgZGlkIG5vdCBlbmFibGUgVFggYW5kIFJYOiBjYWxsIHJlc3RvcmVfbXVsdGljYXN0X2xpc3QuCisgKiBCdWcgZml4OiBtYWNlX2ludGVycnVwdCBjaGVja3Mgfk1BQ0VfSU1SX0RFRkFVTFQuICBGaXhlcyBkcml2ZXIgbG9ja3VwLgorICoKKyAqIFJldmlzaW9uIDAuMTIgIDE5OTUvMDUvMTQgIDAwOjEyOjIzICBycGFvCisgKiBTdGF0aXN0aWNzIG92ZXJoYXVsLgorICoKKworOTUvMDUvMTMgcnBhbwlWMC4xMGEKKwkJQnVnIGZpeDogTUFDRSBzdGF0aXN0aWNzIGNvdW50ZXJzIHVzZWQgd3JvbmcgSS9PIHBvcnRzLgorCQlCdWcgZml4OiBtYWNlX2ludGVycnVwdCgpIG5lZWRlZCB0byBhbGxvdyBzdGF0aXN0aWNzIHRvIGJlCisJCXByb2Nlc3NlZCB3aXRob3V0IFJYIG9yIFRYIGludGVycnVwdHMgcGVuZGluZy4KKzk1LzA1LzExIHJwYW8JVjAuMTAKKwkJTXVsdGlwbGUgdHJhbnNtaXQgcmVxdWVzdCBwcm9jZXNzaW5nLgorCQlNb2RpZmllZCBzdGF0aXN0aWNzIHRvIHVzZSBNQUNFIGNvdW50ZXJzIHdoZXJlIHBvc3NpYmxlLgorOTUvMDUvMTAgcnBhbwlWMC4wOSBCdWcgZml4OiBNdXN0IHVzZSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTy4KKwkJKlJlbGVhc2VkCis5NS8wNS8xMCBycGFvCVYwLjA4CisJCUJ1ZyBmaXg6IE1ha2UgYWxsIG5vbi1leHBvcnRlZCBmdW5jdGlvbnMgcHJpdmF0ZSBieSB1c2luZworCQlzdGF0aWMga2V5d29yZC4KKwkJQnVnIGZpeDogVGVzdCBJbnRyQ250IF9iZWZvcmVfIHJlYWRpbmcgTUFDRV9JUi4KKzk1LzA1LzEwIHJwYW8JVjAuMDcgU3RhdGlzdGljcy4KKzk1LzA1LzA5IHJwYW8JVjAuMDYgRml4IHJ4X2ZyYW1lY250IHByb2JsZW0gYnkgYWRkaXRpb24gb2YgUENJQyB3YWl0IHN0YXRlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIERSVl9OQU1FCSJubWNsYW5fY3MiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjE2IgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbmRpdGlvbmFsIENvbXBpbGF0aW9uIE9wdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBNVUxUSV9UWAkJCTAKKyNkZWZpbmUgUkVTRVRfT05fVElNRU9VVAkJMQorI2RlZmluZSBUWF9JTlRFUlJVUFRBQkxFCQkxCisjZGVmaW5lIFJFU0VUX1hJTElOWAkJCTAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSW5jbHVkZSBGaWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRVRIRVJfQUREUl9MRU4JCQlFVEhfQUxFTgorCQkJCQkvKiA2IGJ5dGVzIGluIGFuIEV0aGVybmV0IEFkZHJlc3MgKi8KKyNkZWZpbmUgTUFDRV9MQURSRl9MRU4JCQk4CisJCQkJCS8qIDggYnl0ZXMgaW4gTG9naWNhbCBBZGRyZXNzIEZpbHRlciAqLworCisvKiBMb29wIENvbnRyb2wgRGVmaW5lcyAqLworI2RlZmluZSBNQUNFX01BWF9JUl9JVEVSQVRJT05TCQkxMAorI2RlZmluZSBNQUNFX01BWF9SWF9JVEVSQVRJT05TCQkxMgorCS8qCisJVEJEOiBEZWFuIGJyb3VnaHQgdGhpcyB1cCwgYW5kIEkgYXNzdW1lZCB0aGUgaGFyZHdhcmUgd291bGQKKwloYW5kbGUgaXQ6CisKKwlJZiBNQUNFX01BWF9SWF9JVEVSQVRJT05TIGlzID4gMSwgcnhfZnJhbWVjbnQgbWF5IHN0aWxsIGJlCisJbm9uLXplcm8gd2hlbiB0aGUgaXNyIGV4aXRzLiAgV2UgbWF5IG5vdCBnZXQgYW5vdGhlciBpbnRlcnJ1cHQKKwl0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgcGFja2V0cyBmb3Igc29tZSB0aW1lLgorCSovCisKKy8qCitUaGUgQW0yMTUwIGhhcyBhIFhpbGlueCBYQzMwNDIgZmllbGQgcHJvZ3JhbW1hYmxlIGdhdGUgYXJyYXkgKEZQR0EpCit3aGljaCBtYW5hZ2VzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgTUFDRSBhbmQgdGhlIFBDTUNJQSBidXMuICBJdAorYWxzbyBpbmNsdWRlcyBidWZmZXIgbWFuYWdlbWVudCBmb3IgdGhlIDMySyB4IDggU1JBTSB0byBjb250cm9sIHVwIHRvCitmb3VyIHRyYW5zbWl0IGFuZCAxMiByZWNlaXZlIGZyYW1lcyBhdCBhIHRpbWUuCisqLworI2RlZmluZSBBTTIxNTBfTUFYX1RYX0ZSQU1FUwkJNAorI2RlZmluZSBBTTIxNTBfTUFYX1JYX0ZSQU1FUwkJMTIKKworLyogQW0yMTUwIEV0aGVybmV0IENhcmQgSS9PIE1hcHBpbmcgKi8KKyNkZWZpbmUgQU0yMTUwX1JDVgkJCTB4MDAKKyNkZWZpbmUgQU0yMTUwX1hNVAkJCTB4MDQKKyNkZWZpbmUgQU0yMTUwX1hNVF9TS0lQCQkJMHgwOQorI2RlZmluZSBBTTIxNTBfUkNWX05FWFQJCQkweDBBCisjZGVmaW5lIEFNMjE1MF9SQ1ZfRlJBTUVfQ09VTlQJCTB4MEIKKyNkZWZpbmUgQU0yMTUwX01BQ0VfQkFOSwkJMHgwQworI2RlZmluZSBBTTIxNTBfTUFDRV9CQVNFCQkweDEwCisKKy8qIE1BQ0UgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1BQ0VfUkNWRklGTwkJCTAKKyNkZWZpbmUgTUFDRV9YTVRGSUZPCQkJMQorI2RlZmluZSBNQUNFX1hNVEZDCQkJMgorI2RlZmluZSBNQUNFX1hNVEZTCQkJMworI2RlZmluZSBNQUNFX1hNVFJDCQkJNAorI2RlZmluZSBNQUNFX1JDVkZDCQkJNQorI2RlZmluZSBNQUNFX1JDVkZTCQkJNgorI2RlZmluZSBNQUNFX0ZJRk9GQwkJCTcKKyNkZWZpbmUgTUFDRV9JUgkJCQk4CisjZGVmaW5lIE1BQ0VfSU1SCQkJOQorI2RlZmluZSBNQUNFX1BSCQkJCTEwCisjZGVmaW5lIE1BQ0VfQklVQ0MJCQkxMQorI2RlZmluZSBNQUNFX0ZJRk9DQwkJCTEyCisjZGVmaW5lIE1BQ0VfTUFDQ0MJCQkxMworI2RlZmluZSBNQUNFX1BMU0NDCQkJMTQKKyNkZWZpbmUgTUFDRV9QSFlDQwkJCTE1CisjZGVmaW5lIE1BQ0VfQ0hJUElETAkJCTE2CisjZGVmaW5lIE1BQ0VfQ0hJUElESAkJCTE3CisjZGVmaW5lIE1BQ0VfSUFDCQkJMTgKKy8qIFJlc2VydmVkICovCisjZGVmaW5lIE1BQ0VfTEFEUkYJCQkyMAorI2RlZmluZSBNQUNFX1BBRFIJCQkyMQorLyogUmVzZXJ2ZWQgKi8KKy8qIFJlc2VydmVkICovCisjZGVmaW5lIE1BQ0VfTVBDCQkJMjQKKy8qIFJlc2VydmVkICovCisjZGVmaW5lIE1BQ0VfUk5UUEMJCQkyNgorI2RlZmluZSBNQUNFX1JDVkNDCQkJMjcKKy8qIFJlc2VydmVkICovCisjZGVmaW5lIE1BQ0VfVVRSCQkJMjkKKyNkZWZpbmUgTUFDRV9SVFIxCQkJMzAKKyNkZWZpbmUgTUFDRV9SVFIyCQkJMzEKKworLyogTUFDRSBCaXQgTWFza3MgKi8KKyNkZWZpbmUgTUFDRV9YTVRSQ19FWERFRgkJMHg4MAorI2RlZmluZSBNQUNFX1hNVFJDX1hNVFJDCQkweDBGCisKKyNkZWZpbmUgTUFDRV9YTVRGU19YTVRTVgkJMHg4MAorI2RlZmluZSBNQUNFX1hNVEZTX1VGTE8JCQkweDQwCisjZGVmaW5lIE1BQ0VfWE1URlNfTENPTAkJCTB4MjAKKyNkZWZpbmUgTUFDRV9YTVRGU19NT1JFCQkJMHgxMAorI2RlZmluZSBNQUNFX1hNVEZTX09ORQkJCTB4MDgKKyNkZWZpbmUgTUFDRV9YTVRGU19ERUZFUgkJMHgwNAorI2RlZmluZSBNQUNFX1hNVEZTX0xDQVIJCQkweDAyCisjZGVmaW5lIE1BQ0VfWE1URlNfUlRSWQkJCTB4MDEKKworI2RlZmluZSBNQUNFX1JDVkZTX1JDVlNUUwkJMHhGMDAwCisjZGVmaW5lIE1BQ0VfUkNWRlNfT0ZMTwkJCTB4ODAwMAorI2RlZmluZSBNQUNFX1JDVkZTX0NMU04JCQkweDQwMDAKKyNkZWZpbmUgTUFDRV9SQ1ZGU19GUkFNCQkJMHgyMDAwCisjZGVmaW5lIE1BQ0VfUkNWRlNfRkNTCQkJMHgxMDAwCisKKyNkZWZpbmUgTUFDRV9GSUZPRkNfUkNWRkMJCTB4RjAKKyNkZWZpbmUgTUFDRV9GSUZPRkNfWE1URkMJCTB4MEYKKworI2RlZmluZSBNQUNFX0lSX0pBQgkJCTB4ODAKKyNkZWZpbmUgTUFDRV9JUl9CQUJMCQkJMHg0MAorI2RlZmluZSBNQUNFX0lSX0NFUlIJCQkweDIwCisjZGVmaW5lIE1BQ0VfSVJfUkNWQ0NPCQkJMHgxMAorI2RlZmluZSBNQUNFX0lSX1JOVFBDTwkJCTB4MDgKKyNkZWZpbmUgTUFDRV9JUl9NUENPCQkJMHgwNAorI2RlZmluZSBNQUNFX0lSX1JDVklOVAkJCTB4MDIKKyNkZWZpbmUgTUFDRV9JUl9YTVRJTlQJCQkweDAxCisKKyNkZWZpbmUgTUFDRV9NQUNDQ19QUk9NCQkJMHg4MAorI2RlZmluZSBNQUNFX01BQ0NDX0RYTVQyUEQJCTB4NDAKKyNkZWZpbmUgTUFDRV9NQUNDQ19FTUJBCQkJMHgyMAorI2RlZmluZSBNQUNFX01BQ0NDX1JFU0VSVkVECQkweDEwCisjZGVmaW5lIE1BQ0VfTUFDQ0NfRFJDVlBBCQkweDA4CisjZGVmaW5lIE1BQ0VfTUFDQ0NfRFJDVkJDCQkweDA0CisjZGVmaW5lIE1BQ0VfTUFDQ0NfRU5YTVQJCTB4MDIKKyNkZWZpbmUgTUFDRV9NQUNDQ19FTlJDVgkJMHgwMQorCisjZGVmaW5lIE1BQ0VfUEhZQ0NfTE5LRkwJCTB4ODAKKyNkZWZpbmUgTUFDRV9QSFlDQ19ETE5LVFNUCQkweDQwCisjZGVmaW5lIE1BQ0VfUEhZQ0NfUkVWUE9MCQkweDIwCisjZGVmaW5lIE1BQ0VfUEhZQ0NfREFQQwkJCTB4MTAKKyNkZWZpbmUgTUFDRV9QSFlDQ19MUlQJCQkweDA4CisjZGVmaW5lIE1BQ0VfUEhZQ0NfQVNFTAkJCTB4MDQKKyNkZWZpbmUgTUFDRV9QSFlDQ19SV0FLRQkJMHgwMgorI2RlZmluZSBNQUNFX1BIWUNDX0FXQUtFCQkweDAxCisKKyNkZWZpbmUgTUFDRV9JQUNfQUREUkNIRwkJMHg4MAorI2RlZmluZSBNQUNFX0lBQ19QSFlBRERSCQkweDA0CisjZGVmaW5lIE1BQ0VfSUFDX0xPR0FERFIJCTB4MDIKKworI2RlZmluZSBNQUNFX1VUUl9SVFJFCQkJMHg4MAorI2RlZmluZSBNQUNFX1VUUl9SVFJECQkJMHg0MAorI2RlZmluZSBNQUNFX1VUUl9SUEEJCQkweDIwCisjZGVmaW5lIE1BQ0VfVVRSX0ZDT0xMCQkJMHgxMAorI2RlZmluZSBNQUNFX1VUUl9SQ1ZGQ1NFCQkweDA4CisjZGVmaW5lIE1BQ0VfVVRSX0xPT1BfSU5DTF9NRU5ERUMJMHgwNgorI2RlZmluZSBNQUNFX1VUUl9MT09QX05PX01FTkRFQwkJMHgwNAorI2RlZmluZSBNQUNFX1VUUl9MT09QX0VYVEVSTkFMCQkweDAyCisjZGVmaW5lIE1BQ0VfVVRSX0xPT1BfTk9ORQkJMHgwMAorI2RlZmluZSBNQUNFX1VUUl9SRVNFUlZFRAkJMHgwMQorCisvKiBTd2l0Y2ggTUFDRSByZWdpc3RlciBiYW5rIChvbmx5IDAgYW5kIDEgYXJlIHZhbGlkKSAqLworI2RlZmluZSBNQUNFQkFOSyh3aW5fbnVtKSBvdXRiKCh3aW5fbnVtKSwgaW9hZGRyICsgQU0yMTUwX01BQ0VfQkFOSykKKworI2RlZmluZSBNQUNFX0lNUl9ERUZBVUxUIFwKKyAgKDB4RkYgLSBcCisgICAgKCBcCisgICAgICBNQUNFX0lSX0NFUlIgfCBcCisgICAgICBNQUNFX0lSX1JDVkNDTyB8IFwKKyAgICAgIE1BQ0VfSVJfUk5UUENPIHwgXAorICAgICAgTUFDRV9JUl9NUENPIHwgXAorICAgICAgTUFDRV9JUl9SQ1ZJTlQgfCBcCisgICAgICBNQUNFX0lSX1hNVElOVCBcCisgICAgKSBcCisgICkKKyN1bmRlZiBNQUNFX0lNUl9ERUZBVUxUCisjZGVmaW5lIE1BQ0VfSU1SX0RFRkFVTFQgMHgwMCAvKiBOZXcgc3RhdGlzdGljcyBoYW5kbGluZzogZ3JhYiBldmVyeXRoaW5nICovCisKKyNkZWZpbmUgVFhfVElNRU9VVAkJKCg0MDAqSFopLzEwMDApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1R5cGUgRGVmaW5pdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordHlwZWRlZiBzdHJ1Y3QgX21hY2Vfc3RhdGlzdGljcyB7CisgICAgLyogTUFDRV9YTVRGUyAqLworICAgIGludCB4bXRzdjsKKyAgICBpbnQgdWZsbzsKKyAgICBpbnQgbGNvbDsKKyAgICBpbnQgbW9yZTsKKyAgICBpbnQgb25lOworICAgIGludCBkZWZlcjsKKyAgICBpbnQgbGNhcjsKKyAgICBpbnQgcnRyeTsKKworICAgIC8qIE1BQ0VfWE1UUkMgKi8KKyAgICBpbnQgZXhkZWY7CisgICAgaW50IHhtdHJjOworCisgICAgLyogUkZTMS0tUmVjZWl2ZSBTdGF0dXMgKFJDVlNUUykgKi8KKyAgICBpbnQgb2ZsbzsKKyAgICBpbnQgY2xzbjsKKyAgICBpbnQgZnJhbTsKKyAgICBpbnQgZmNzOworCisgICAgLyogUkZTMi0tUnVudCBQYWNrZXQgQ291bnQgKFJOVFBDKSAqLworICAgIGludCByZnNfcm50cGM7CisKKyAgICAvKiBSRlMzLS1SZWNlaXZlIENvbGxpc2lvbiBDb3VudCAoUkNWQ0MpICovCisgICAgaW50IHJmc19yY3ZjYzsKKworICAgIC8qIE1BQ0VfSVIgKi8KKyAgICBpbnQgamFiOworICAgIGludCBiYWJsOworICAgIGludCBjZXJyOworICAgIGludCByY3ZjY287CisgICAgaW50IHJudHBjbzsKKyAgICBpbnQgbXBjbzsKKworICAgIC8qIE1BQ0VfTVBDICovCisgICAgaW50IG1wYzsKKworICAgIC8qIE1BQ0VfUk5UUEMgKi8KKyAgICBpbnQgcm50cGM7CisKKyAgICAvKiBNQUNFX1JDVkNDICovCisgICAgaW50IHJjdmNjOworfSBtYWNlX3N0YXRpc3RpY3M7CisKK3R5cGVkZWYgc3RydWN0IF9tYWNlX3ByaXZhdGUgeworICAgIGRldl9saW5rX3QgbGluazsKKyAgICBkZXZfbm9kZV90IG5vZGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbGludXhfc3RhdHM7IC8qIExpbnV4IHN0YXRpc3RpY3MgY291bnRlcnMgKi8KKyAgICBtYWNlX3N0YXRpc3RpY3MgbWFjZV9zdGF0czsgLyogTUFDRSBjaGlwIHN0YXRpc3RpY3MgY291bnRlcnMgKi8KKworICAgIC8qIHJlc3RvcmVfbXVsdGljYXN0X2xpc3QoKSBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgICBpbnQgbXVsdGljYXN0X2xhZHJmW01BQ0VfTEFEUkZfTEVOXTsgLyogTG9naWNhbCBhZGRyZXNzIGZpbHRlciAqLworICAgIGludCBtdWx0aWNhc3RfbnVtX2FkZHJzOworCisgICAgY2hhciB0eF9mcmVlX2ZyYW1lczsgLyogTnVtYmVyIG9mIGZyZWUgdHJhbnNtaXQgZnJhbWUgYnVmZmVycyAqLworICAgIGNoYXIgdHhfaXJxX2Rpc2FibGVkOyAvKiBNQUNFIFRYIGludGVycnVwdCBkaXNhYmxlZCAqLworICAgIAorICAgIHNwaW5sb2NrX3QgYmFua19sb2NrOyAvKiBNdXN0IGJlIGhlbGQgaWYgeW91IHN0ZXAgb2ZmIGJhbmsgMCAqLworfSBtYWNlX3ByaXZhdGU7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1ByaXZhdGUgR2xvYmFsIFZhcmlhYmxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgY2hhciByY3NpZFtdID0KKyJubWNsYW5fY3MuYyx2IDAuMTYgMTk5NS8wNy8wMSAwNjo0MjoxNyBycGFvIEV4cCBycGFvIjsKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0KK0RSVl9OQU1FICIgIiBEUlZfVkVSU0lPTiAiIChSb2dlciBDLiBQYW8pIjsKKyNlbmRpZgorCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbz0ibm1jbGFuX2NzIjsKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsKKworc3RhdGljIGNoYXIgKmlmX25hbWVzW109eworICAgICJBdXRvIiwgIjEwYmFzZVQiLCAiQk5DIiwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BhcmFtZXRlcnMKKwlUaGVzZSBhcmUgdGhlIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IGR1cmluZyBsb2FkaW5nIHdpdGgKKwknaW5zbW9kJy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJOZXcgTWVkaWEgUENNQ0lBIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIElOVF9NT0RVTEVfUEFSTShuLCB2KSBzdGF0aWMgaW50IG4gPSB2OyBtb2R1bGVfcGFyYW0obiwgaW50LCAwKQorCisvKiAwPWF1dG8sIDE9MTBiYXNlVCwgMiA9IDEwYmFzZTIsIGRlZmF1bHQ9YXV0byAqLworSU5UX01PRFVMRV9QQVJNKGlmX3BvcnQsIDApOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCitJTlRfTU9EVUxFX1BBUk0ocGNfZGVidWcsIFBDTUNJQV9ERUJVRyk7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Z1bmN0aW9uIFByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgbm1jbGFuX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkIG5tY2xhbl9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCBubWNsYW5fZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKKworc3RhdGljIHZvaWQgbm1jbGFuX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtYWNlX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCk7CitzdGF0aWMgaW50IG1hY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWFjZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWFjZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbWFjZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IG1hY2VfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptYWNlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWFjZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIFJ4Q250KTsKK3N0YXRpYyB2b2lkIHJlc3RvcmVfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKKworCitzdGF0aWMgZGV2X2xpbmtfdCAqbm1jbGFuX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIG5tY2xhbl9kZXRhY2goZGV2X2xpbmtfdCAqKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbm1jbGFuX2F0dGFjaAorCUNyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nIGxvY2FsIGRhdGEKKwlzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGggQ2FyZAorCVNlcnZpY2VzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqbm1jbGFuX2F0dGFjaCh2b2lkKQoreworICAgIG1hY2VfcHJpdmF0ZSAqbHA7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIGludCByZXQ7CisKKyAgICBERUJVRygwLCAibm1jbGFuX2F0dGFjaCgpXG4iKTsKKyAgICBERUJVRygxLCAiJXNcbiIsIHJjc2lkKTsKKworICAgIC8qIENyZWF0ZSBuZXcgZXRoZXJuZXQgZGV2aWNlICovCisgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG1hY2VfcHJpdmF0ZSkpOworICAgIGlmICghZGV2KQorCXJldHVybiBOVUxMOworICAgIGxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBsaW5rID0gJmxwLT5saW5rOworICAgIGxpbmstPnByaXYgPSBkZXY7CisgICAgCisgICAgc3Bpbl9sb2NrX2luaXQoJmxwLT5iYW5rX2xvY2spOworICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDMyOworICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSA1OworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworICAgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKyAgICBsaW5rLT5pcnEuSGFuZGxlciA9ICZtYWNlX2ludGVycnVwdDsKKyAgICBsaW5rLT5pcnEuSW5zdGFuY2UgPSBkZXY7CisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IDE7CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CisKKyAgICBscC0+dHhfZnJlZV9mcmFtZXM9QU0yMTUwX01BWF9UWF9GUkFNRVM7CisKKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmbWFjZV9zdGFydF94bWl0OworICAgIGRldi0+c2V0X2NvbmZpZyA9ICZtYWNlX2NvbmZpZzsKKyAgICBkZXYtPmdldF9zdGF0cyA9ICZtYWNlX2dldF9zdGF0czsKKyAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisgICAgU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7CisgICAgZGV2LT5vcGVuID0gJm1hY2Vfb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmbWFjZV9jbG9zZTsKKyNpZmRlZiBIQVZFX1RYX1RJTUVPVVQKKyAgICBkZXYtPnR4X3RpbWVvdXQgPSBtYWNlX3R4X3RpbWVvdXQ7CisgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjZW5kaWYKKworICAgIC8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKKyAgICBkZXZfbGlzdCA9IGxpbms7CisgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKyAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9CisJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmbm1jbGFuX2V2ZW50OworICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworICAgIGlmIChyZXQgIT0gMCkgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJbm1jbGFuX2RldGFjaChsaW5rKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbGluazsKK30gLyogbm1jbGFuX2F0dGFjaCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitubWNsYW5fZGV0YWNoCisJVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKwl3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKwlzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorCXdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgbm1jbGFuX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGRldl9saW5rX3QgKipsaW5rcDsKKworICAgIERFQlVHKDAsICJubWNsYW5fZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKworICAgIC8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwlpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworICAgIGlmICgqbGlua3AgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBpZiAobGluay0+ZGV2KQorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKyAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCW5tY2xhbl9yZWxlYXNlKGxpbmspOworCisgICAgaWYgKGxpbmstPmhhbmRsZSkKKwlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKworICAgIC8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIGJpdHMgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGZyZWVfbmV0ZGV2KGRldik7Cit9IC8qIG5tY2xhbl9kZXRhY2ggKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWFjZV9yZWFkCisJUmVhZHMgYSBNQUNFIHJlZ2lzdGVyLiAgVGhpcyBpcyBiYW5rIGluZGVwZW5kZW50OyBob3dldmVyLCB0aGUKKwljYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGlzIGNhbGwgaXMgbm90IGludGVycnVwdGFibGUuICBXZSBhcmUKKwlhc3N1bWluZyB0aGF0IGR1cmluZyBub3JtYWwgb3BlcmF0aW9uLCB0aGUgTUFDRSBpcyBhbHdheXMgaW4KKwliYW5rIDAuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IG1hY2VfcmVhZChtYWNlX3ByaXZhdGUgKmxwLCBraW9fYWRkcl90IGlvYWRkciwgaW50IHJlZykKK3sKKyAgaW50IGRhdGEgPSAweEZGOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgIHN3aXRjaCAocmVnID4+IDQpIHsKKyAgICBjYXNlIDA6IC8qIHJlZ2lzdGVyIDAtMTUgKi8KKyAgICAgIGRhdGEgPSBpbmIoaW9hZGRyICsgQU0yMTUwX01BQ0VfQkFTRSArIHJlZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8qIHJlZ2lzdGVyIDE2LTMxICovCisgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmJhbmtfbG9jaywgZmxhZ3MpOworICAgICAgTUFDRUJBTksoMSk7CisgICAgICBkYXRhID0gaW5iKGlvYWRkciArIEFNMjE1MF9NQUNFX0JBU0UgKyAocmVnICYgMHgwRikpOworICAgICAgTUFDRUJBTksoMCk7CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+YmFua19sb2NrLCBmbGFncyk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gKGRhdGEgJiAweEZGKTsKK30gLyogbWFjZV9yZWFkICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21hY2Vfd3JpdGUKKwlXcml0ZXMgdG8gYSBNQUNFIHJlZ2lzdGVyLiAgVGhpcyBpcyBiYW5rIGluZGVwZW5kZW50OyBob3dldmVyLAorCXRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGlzIGNhbGwgaXMgbm90IGludGVycnVwdGFibGUuICBXZQorCWFyZSBhc3N1bWluZyB0aGF0IGR1cmluZyBub3JtYWwgb3BlcmF0aW9uLCB0aGUgTUFDRSBpcyBhbHdheXMgaW4KKwliYW5rIDAuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCBtYWNlX3dyaXRlKG1hY2VfcHJpdmF0ZSAqbHAsIGtpb19hZGRyX3QgaW9hZGRyLCBpbnQgcmVnLCBpbnQgZGF0YSkKK3sKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICBzd2l0Y2ggKHJlZyA+PiA0KSB7CisgICAgY2FzZSAwOiAvKiByZWdpc3RlciAwLTE1ICovCisgICAgICBvdXRiKGRhdGEgJiAweEZGLCBpb2FkZHIgKyBBTTIxNTBfTUFDRV9CQVNFICsgcmVnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTogLyogcmVnaXN0ZXIgMTYtMzEgKi8KKyAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+YmFua19sb2NrLCBmbGFncyk7CisgICAgICBNQUNFQkFOSygxKTsKKyAgICAgIG91dGIoZGF0YSAmIDB4RkYsIGlvYWRkciArIEFNMjE1MF9NQUNFX0JBU0UgKyAocmVnICYgMHgwRikpOworICAgICAgTUFDRUJBTksoMCk7CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+YmFua19sb2NrLCBmbGFncyk7CisgICAgICBicmVhazsKKyAgfQorfSAvKiBtYWNlX3dyaXRlICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21hY2VfaW5pdAorCVJlc2V0cyB0aGUgTUFDRSBjaGlwLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBtYWNlX2luaXQobWFjZV9wcml2YXRlICpscCwga2lvX2FkZHJfdCBpb2FkZHIsIGNoYXIgKmVuZXRfYWRkcikKK3sKKyAgaW50IGk7CisgIGludCBjdCA9IDA7CisKKyAgLyogTUFDRSBTb2Z0d2FyZSByZXNldCAqLworICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfQklVQ0MsIDEpOworICB3aGlsZSAobWFjZV9yZWFkKGxwLCBpb2FkZHIsIE1BQ0VfQklVQ0MpICYgMHgwMSkgeworICAgIC8qIFdhaXQgZm9yIHJlc2V0IGJpdCB0byBiZSBjbGVhcmVkIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgPD0gMjAwbnMgKi87CisgICAgaWYoKytjdCA+IDUwMCkKKyAgICB7CisgICAgCXByaW50ayhLRVJOX0VSUiAibWFjZTogcmVzZXQgZmFpbGVkLCBjYXJkIHJlbW92ZWQgP1xuIik7CisgICAgCXJldHVybiAtMTsKKyAgICB9CisgICAgdWRlbGF5KDEpOworICB9CisgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9CSVVDQywgMCk7CisKKyAgLyogVGhlIEFtMjE1MCByZXF1aXJlcyB0aGF0IHRoZSBNQUNFIEZJRk9zIG9wZXJhdGUgaW4gYnVyc3QgbW9kZS4gKi8KKyAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX0ZJRk9DQywgMHgwRik7CisKKyAgbWFjZV93cml0ZShscCxpb2FkZHIsIE1BQ0VfUkNWRkMsIDApOyAvKiBEaXNhYmxlIEF1dG8gU3RyaXAgUmVjZWl2ZSAqLworICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfSU1SLCAweEZGKTsgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyB1bnRpbCBfb3BlbiAqLworCisgIC8qCisgICAqIEJpdCAyLTEgUE9SVFNFTFsxLTBdIFBvcnQgU2VsZWN0LgorICAgKiAwMCBBVUkvMTBCYXNlLTIKKyAgICogMDEgMTBCYXNlLVQKKyAgICogMTAgREFJIFBvcnQgKHJlc2VydmVkIGluIEFtMjE1MCkKKyAgICogMTEgR1BTSQorICAgKiBGb3IgdGhpcyBjYXJkLCBvbmx5IHRoZSBmaXJzdCB0d28gYXJlIHZhbGlkLgorICAgKiBTbywgUExTQ0Mgc2hvdWxkIGJlIHNldCB0bworICAgKiAweDAwIGZvciAxMEJhc2UtMgorICAgKiAweDAyIGZvciAxMEJhc2UtVAorICAgKiBPciBqdXN0IHNldCBBU0VMIGluIFBIWUNDIGJlbG93IQorICAgKi8KKyAgc3dpdGNoIChpZl9wb3J0KSB7CisgICAgY2FzZSAxOgorICAgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX1BMU0NDLCAweDAyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9QTFNDQywgMHgwMCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX1BIWUNDLCAvKiBBU0VMICovIDQpOworICAgICAgLyogQVNFTCBBdXRvIFNlbGVjdC4gIFdoZW4gc2V0LCB0aGUgUE9SVFNFTFsxLTBdIGJpdHMgYXJlIG92ZXJyaWRkZW4sCisJIGFuZCB0aGUgTUFDRSBkZXZpY2Ugd2lsbCBhdXRvbWF0aWNhbGx5IHNlbGVjdCB0aGUgb3BlcmF0aW5nIG1lZGlhCisJIGludGVyZmFjZSBwb3J0LiAqLworICAgICAgYnJlYWs7CisgIH0KKworICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfSUFDLCBNQUNFX0lBQ19BRERSQ0hHIHwgTUFDRV9JQUNfUEhZQUREUik7CisgIC8qIFBvbGwgQUREUkNIRyBiaXQgKi8KKyAgY3QgPSAwOworICB3aGlsZSAobWFjZV9yZWFkKGxwLCBpb2FkZHIsIE1BQ0VfSUFDKSAmIE1BQ0VfSUFDX0FERFJDSEcpCisgIHsKKyAgCWlmKCsrIGN0ID4gNTAwKQorICAJeworICAJCXByaW50ayhLRVJOX0VSUiAibWFjZTogQUREUkNIRyB0aW1lb3V0LCBjYXJkIHJlbW92ZWQgP1xuIik7CisgIAkJcmV0dXJuIC0xOworICAJfQorICB9CisgIC8qIFNldCBQQURSIHJlZ2lzdGVyICovCisgIGZvciAoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKQorICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9QQURSLCBlbmV0X2FkZHJbaV0pOworCisgIC8qIE1BQyBDb25maWd1cmF0aW9uIENvbnRyb2wgUmVnaXN0ZXIgc2hvdWxkIGJlIHdyaXR0ZW4gbGFzdCAqLworICAvKiBMZXQgc2V0X211bHRpY2FzdF9saXN0IHNldCB0aGlzLiAqLworICAvKiBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfTUFDQ0MsIE1BQ0VfTUFDQ0NfRU5YTVQgfCBNQUNFX01BQ0NDX0VOUkNWKTsgKi8KKyAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX01BQ0NDLCAweDAwKTsKKyAgcmV0dXJuIDA7Cit9IC8qIG1hY2VfaW5pdCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitubWNsYW5fY29uZmlnCisJVGhpcyByb3V0aW5lIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorCWlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorCWV0aGVybmV0IGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCisgIGRvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIG5tY2xhbl9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICB0dXBsZV90IHR1cGxlOworICBjaXNwYXJzZV90IHBhcnNlOworICB1X2NoYXIgYnVmWzY0XTsKKyAgaW50IGksIGxhc3RfcmV0LCBsYXN0X2ZuOworICBraW9fYWRkcl90IGlvYWRkcjsKKworICBERUJVRygwLCAibm1jbGFuX2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKyAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKworICAvKiBDb25maWd1cmUgY2FyZCAqLworICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisgIENTX0NIRUNLKFJlcXVlc3RJTywgcGNtY2lhX3JlcXVlc3RfaW8oaGFuZGxlLCAmbGluay0+aW8pKTsKKyAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGhhbmRsZSwgJmxpbmstPmlycSkpOworICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihoYW5kbGUsICZsaW5rLT5jb25mKSk7CisgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKworICBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAvKiBSZWFkIHRoZSBldGhlcm5ldCBhZGRyZXNzIGZyb20gdGhlIENJUy4gKi8KKyAgdHVwbGUuRGVzaXJlZFR1cGxlID0gMHg4MCAvKiBDSVNUUExfQ0ZUQUJMRV9FTlRSWV9NSVNDICovOworICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CisgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OworICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKyAgbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHR1cGxlLlR1cGxlRGF0YSwgRVRIRVJfQUREUl9MRU4pOworCisgIC8qIFZlcmlmeSBjb25maWd1cmF0aW9uIGJ5IHJlYWRpbmcgdGhlIE1BQ0UgSUQuICovCisgIHsKKyAgICBjaGFyIHNpZ1syXTsKKworICAgIHNpZ1swXSA9IG1hY2VfcmVhZChscCwgaW9hZGRyLCBNQUNFX0NISVBJREwpOworICAgIHNpZ1sxXSA9IG1hY2VfcmVhZChscCwgaW9hZGRyLCBNQUNFX0NISVBJREgpOworICAgIGlmICgoc2lnWzBdID09IDB4NDApICYmICgoc2lnWzFdICYgMHgwRikgPT0gMHgwOSkpIHsKKyAgICAgIERFQlVHKDAsICJubWNsYW5fY3MgY29uZmlndXJlZDogbWFjZSBpZD0leCAleFxuIiwKKwkgICAgc2lnWzBdLCBzaWdbMV0pOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgIm5tY2xhbl9jczogbWFjZSBpZCBub3QgZm91bmQ6ICV4ICV4IHNob3VsZCIKKwkgICAgICIgYmUgMHg0MCAweD85XG4iLCBzaWdbMF0sIHNpZ1sxXSk7CisgICAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGlmKG1hY2VfaW5pdChscCwgaW9hZGRyLCBkZXYtPmRldl9hZGRyKSA9PSAtMSkKKyAgCWdvdG8gZmFpbGVkOworCisgIC8qIFRoZSBpZl9wb3J0IHN5bWJvbCBjYW4gYmUgc2V0IHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgKi8KKyAgaWYgKGlmX3BvcnQgPD0gMikKKyAgICBkZXYtPmlmX3BvcnQgPSBpZl9wb3J0OworICBlbHNlCisgICAgcHJpbnRrKEtFUk5fTk9USUNFICJubWNsYW5fY3M6IGludmFsaWQgaWZfcG9ydCByZXF1ZXN0ZWRcbiIpOworCisgIGxpbmstPmRldiA9ICZscC0+bm9kZTsKKyAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKworICBpID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgIGlmIChpICE9IDApIHsKKyAgICBwcmludGsoS0VSTl9OT1RJQ0UgIm5tY2xhbl9jczogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKyAgICBsaW5rLT5kZXYgPSBOVUxMOworICAgIGdvdG8gZmFpbGVkOworICB9CisKKyAgc3RyY3B5KGxwLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworCisgIHByaW50ayhLRVJOX0lORk8gIiVzOiBubWNsYW46IHBvcnQgJSMzbHgsIGlycSAlZCwgJXMgcG9ydCwgaHdfYWRkciAiLAorCSBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwgaWZfbmFtZXNbZGV2LT5pZl9wb3J0XSk7CisgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICBwcmludGsoIiUwMlglcyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaTw1KSA/ICI6IiA6ICJcbiIpKTsKKyAgcmV0dXJuOworCitjc19mYWlsZWQ6CisgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CitmYWlsZWQ6CisgICAgbm1jbGFuX3JlbGVhc2UobGluayk7CisgICAgcmV0dXJuOworCit9IC8qIG5tY2xhbl9jb25maWcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbm1jbGFuX3JlbGVhc2UKKwlBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgbm1jbGFuX3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlCisJbmV0IGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZQorCWlzIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQgbm1jbGFuX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKworICBERUJVRygwLCAibm1jbGFuX3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKworICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbm1jbGFuX2V2ZW50CisJVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuICBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyCisJc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiAgQSBDQVJEX1JFTU9WQUwgZXZlbnQKKwlhbHNvIHNldHMgc29tZSBmbGFncyB0byBkaXNjb3VyYWdlIHRoZSBuZXQgZHJpdmVycyBmcm9tIHRyeWluZworCXRvIHRhbGsgdG8gdGhlIGNhcmQgYW55IG1vcmUuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IG5tY2xhbl9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCSAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKyAgREVCVUcoMSwgIm5tY2xhbl9ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisKKyAgc3dpdGNoIChldmVudCkgeworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorICAgICAgbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworICAgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisgICAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorICAgICAgbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisgICAgICBubWNsYW5fY29uZmlnKGxpbmspOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorICAgICAgbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisgICAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorICAgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCWlmIChsaW5rLT5vcGVuKQorCSAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorICAgICAgbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworICAgICAgLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorICAgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCXBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJaWYgKGxpbmstPm9wZW4pIHsKKwkgIG5tY2xhbl9yZXNldChkZXYpOworCSAgbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCX0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUkVRVUVTVDoKKyAgICAgIHJldHVybiAxOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9IC8qIG5tY2xhbl9ldmVudCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitubWNsYW5fcmVzZXQKKwlSZXNldCBhbmQgcmVzdG9yZSBhbGwgb2YgdGhlIFhpbGlueCBhbmQgTUFDRSByZWdpc3RlcnMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCBubWNsYW5fcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZiBSRVNFVF9YSUxJTlgKKyAgZGV2X2xpbmtfdCAqbGluayA9ICZscC0+bGluazsKKyAgY29uZl9yZWdfdCByZWc7CisgIHVfbG9uZyBPcmlnQ29yVmFsdWU7IAorCisgIC8qIFNhdmUgb3JpZ2luYWwgQ09SIHZhbHVlICovCisgIHJlZy5GdW5jdGlvbiA9IDA7CisgIHJlZy5BY3Rpb24gPSBDU19SRUFEOworICByZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKKyAgcmVnLlZhbHVlID0gMDsKKyAgcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmstPmhhbmRsZSwgJnJlZyk7CisgIE9yaWdDb3JWYWx1ZSA9IHJlZy5WYWx1ZTsKKworICAvKiBSZXNldCBYaWxpbnggKi8KKyAgcmVnLkFjdGlvbiA9IENTX1dSSVRFOworICByZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKKyAgREVCVUcoMSwgIm5tY2xhbl9yZXNldDogT3JpZ0NvclZhbHVlPTB4JWxYLCByZXNldHRpbmcuLi5cbiIsCisJT3JpZ0NvclZhbHVlKTsKKyAgcmVnLlZhbHVlID0gQ09SX1NPRlRfUkVTRVQ7CisgIHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLT5oYW5kbGUsICZyZWcpOworICAvKiBOZWVkIHRvIHdhaXQgZm9yIDIwIG1zIGZvciBQQ01DSUEgdG8gZmluaXNoIHJlc2V0LiAqLworCisgIC8qIFJlc3RvcmUgb3JpZ2luYWwgQ09SIGNvbmZpZ3VyYXRpb24gaW5kZXggKi8KKyAgcmVnLlZhbHVlID0gQ09SX0xFVkVMX1JFUSB8IChPcmlnQ29yVmFsdWUgJiBDT1JfQ09ORklHX01BU0spOworICBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluay0+aGFuZGxlLCAmcmVnKTsKKyAgLyogWGlsaW54IGlzIG5vdyBjb21wbGV0ZWx5IHJlc2V0IGFsb25nIHdpdGggdGhlIE1BQ0UgY2hpcC4gKi8KKyAgbHAtPnR4X2ZyZWVfZnJhbWVzPUFNMjE1MF9NQVhfVFhfRlJBTUVTOworCisjZW5kaWYgLyogI2lmIFJFU0VUX1hJTElOWCAqLworCisgIC8qIFhpbGlueCBpcyBub3cgY29tcGxldGVseSByZXNldCBhbG9uZyB3aXRoIHRoZSBNQUNFIGNoaXAuICovCisgIGxwLT50eF9mcmVlX2ZyYW1lcz1BTTIxNTBfTUFYX1RYX0ZSQU1FUzsKKworICAvKiBSZWluaXRpYWxpemUgdGhlIE1BQ0UgY2hpcCBmb3Igb3BlcmF0aW9uLiAqLworICBtYWNlX2luaXQobHAsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmRldl9hZGRyKTsKKyAgbWFjZV93cml0ZShscCwgZGV2LT5iYXNlX2FkZHIsIE1BQ0VfSU1SLCBNQUNFX0lNUl9ERUZBVUxUKTsKKworICAvKiBSZXN0b3JlIHRoZSBtdWx0aWNhc3QgbGlzdCBhbmQgZW5hYmxlIFRYIGFuZCBSWC4gKi8KKyAgcmVzdG9yZV9tdWx0aWNhc3RfbGlzdChkZXYpOworfSAvKiBubWNsYW5fcmVzZXQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWFjZV9jb25maWcKKwlbU29tZW9uZSB0ZWxsIG1lIHdoYXQgdGhpcyBpcyBzdXBwb3NlZCB0byBkbz8gIElzIGlmX3BvcnQgYSBkZWZpbmVkCisJc3RhbmRhcmQ/ICBJZiBzbywgdGhlcmUgc2hvdWxkIGJlIGRlZmluZXMgdG8gaW5kaWNhdGUgMT0xMEJhc2UtVCwKKwkyPTEwQmFzZS0yLCBldGMuIGluY2x1ZGluZyBsaW1pdGVkIGF1dG9tYXRpYyBkZXRlY3Rpb24uXQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBtYWNlX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKK3sKKyAgaWYgKChtYXAtPnBvcnQgIT0gKHVfY2hhcikoLTEpKSAmJiAobWFwLT5wb3J0ICE9IGRldi0+aWZfcG9ydCkpIHsKKyAgICBpZiAobWFwLT5wb3J0IDw9IDIpIHsKKyAgICAgIGRldi0+aWZfcG9ydCA9IG1hcC0+cG9ydDsKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hlZCB0byAlcyBwb3J0XG4iLCBkZXYtPm5hbWUsCisJICAgICBpZl9uYW1lc1tkZXYtPmlmX3BvcnRdKTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiAtRUlOVkFMOworICB9CisgIHJldHVybiAwOworfSAvKiBtYWNlX2NvbmZpZyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYWNlX29wZW4KKwlPcGVuIGRldmljZSBkcml2ZXIuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IG1hY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICBtYWNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgZGV2X2xpbmtfdCAqbGluayA9ICZscC0+bGluazsKKworICBpZiAoIURFVl9PSyhsaW5rKSkKKyAgICByZXR1cm4gLUVOT0RFVjsKKworICBsaW5rLT5vcGVuKys7CisKKyAgTUFDRUJBTksoMCk7CisKKyAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgbm1jbGFuX3Jlc2V0KGRldik7CisKKyAgcmV0dXJuIDA7IC8qIEFsd2F5cyBzdWNjZWVkICovCit9IC8qIG1hY2Vfb3BlbiAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYWNlX2Nsb3NlCisJQ2xvc2VzIGRldmljZSBkcml2ZXIuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IG1hY2VfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgIGRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisKKyAgREVCVUcoMiwgIiVzOiBzaHV0dGluZyBkb3duIGV0aGVyY2FyZC5cbiIsIGRldi0+bmFtZSk7CisKKyAgLyogTWFzayBvZmYgYWxsIGludGVycnVwdHMgZnJvbSB0aGUgTUFDRSBjaGlwLiAqLworICBvdXRiKDB4RkYsIGlvYWRkciArIEFNMjE1MF9NQUNFX0JBU0UgKyBNQUNFX0lNUik7CisKKyAgbGluay0+b3Blbi0tOworICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgcmV0dXJuIDA7Cit9IC8qIG1hY2VfY2xvc2UgKi8KKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiUENNQ0lBIDB4JWx4IiwgZGV2LT5iYXNlX2FkZHIpOworfQorCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgdTMyIG5ldGRldl9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gcGNfZGVidWc7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCXBjX2RlYnVnID0gbGV2ZWw7Cit9CisjZW5kaWYgLyogUENNQ0lBX0RFQlVHICovCisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisjaWZkZWYgUENNQ0lBX0RFQlVHCisJLmdldF9tc2dsZXZlbAkJPSBuZXRkZXZfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X3NldF9tc2dsZXZlbCwKKyNlbmRpZiAvKiBQQ01DSUFfREVCVUcgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21hY2Vfc3RhcnRfeG1pdAorCVRoaXMgcm91dGluZSBiZWdpbnMgdGhlIHBhY2tldCB0cmFuc21pdCBmdW5jdGlvbi4gIFdoZW4gY29tcGxldGVkLAorCWl0IHdpbGwgZ2VuZXJhdGUgYSB0cmFuc21pdCBpbnRlcnJ1cHQuCisKKwlBY2NvcmRpbmcgdG8gL3Vzci9zcmMvbGludXgvbmV0L2luZXQvZGV2LmMsIGlmIF9zdGFydF94bWl0CisJcmV0dXJucyAwLCB0aGUgInBhY2tldCBpcyBub3cgc29sZWx5IHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUKKwlkcml2ZXIuIiAgSWYgX3N0YXJ0X3htaXQgcmV0dXJucyBub24temVybywgdGhlICJ0cmFuc21pc3Npb24KKwlmYWlsZWQsIHB1dCBza2IgYmFjayBpbnRvIGEgbGlzdC4iCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIG1hY2VfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBtYWNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgZGV2X2xpbmtfdCAqbGluayA9ICZscC0+bGluazsKKworICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQgLS0gIiwgZGV2LT5uYW1lKTsKKyNpZiBSRVNFVF9PTl9USU1FT1VUCisgIHByaW50aygicmVzZXR0aW5nIGNhcmRcbiIpOworICBwY21jaWFfcmVzZXRfY2FyZChsaW5rLT5oYW5kbGUsIE5VTEwpOworI2Vsc2UgLyogI2lmIFJFU0VUX09OX1RJTUVPVVQgKi8KKyAgcHJpbnRrKCJOT1QgcmVzZXR0aW5nIGNhcmRcbiIpOworI2VuZGlmIC8qICNpZiBSRVNFVF9PTl9USU1FT1VUICovCisgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQgbWFjZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICBERUJVRygzLCAiJXM6IG1hY2Vfc3RhcnRfeG1pdChsZW5ndGggPSAlbGQpIGNhbGxlZC5cbiIsCisJZGV2LT5uYW1lLCAobG9uZylza2ItPmxlbik7CisKKyNpZiAoIVRYX0lOVEVSUlVQVEFCTEUpCisgIC8qIERpc2FibGUgTUFDRSBUWCBpbnRlcnJ1cHRzLiAqLworICBvdXRiKE1BQ0VfSU1SX0RFRkFVTFQgfCBNQUNFX0lSX1hNVElOVCwKKyAgICBpb2FkZHIgKyBBTTIxNTBfTUFDRV9CQVNFICsgTUFDRV9JTVIpOworICBscC0+dHhfaXJxX2Rpc2FibGVkPTE7CisjZW5kaWYgLyogI2lmICghVFhfSU5URVJSVVBUQUJMRSkgKi8KKworICB7CisgICAgLyogVGhpcyBibG9jayBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSBhbm90aGVyIHRyYW5zbWl0IHJlcXVlc3QhCisgICAgICAgbWFjZV90eF90aW1lb3V0IHdpbGwgdGFrZSBjYXJlIG9mIHRpbWVyLWJhc2VkIHJldHJhbnNtaXNzaW9ucyBmcm9tCisgICAgICAgdGhlIHVwcGVyIGxheWVycy4gIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcyBndWFyYW50ZWVkIG5ldmVyIHRvCisgICAgICAgc2VydmljZSBhIHRyYW5zbWl0IGludGVycnVwdCB3aGlsZSB3ZSBhcmUgaW4gaGVyZS4KKyAgICAqLworCisgICAgbHAtPmxpbnV4X3N0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworICAgIGxwLT50eF9mcmVlX2ZyYW1lcy0tOworCisgICAgLyogV0FSTklORzogV3JpdGUgdGhlIF9leGFjdF8gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW4gdGhlIGhlYWRlciEgKi8KKyAgICAvKiBQdXQgb3V0IHRoZSB3b3JkIGhlYWRlciBbbXVzdCBiZSBhbiBvdXR3KCldIC4gLiAuICovCisgICAgb3V0dyhza2ItPmxlbiwgaW9hZGRyICsgQU0yMTUwX1hNVCk7CisgICAgLyogLiAuIC4gYW5kIHRoZSBwYWNrZXQgW21heSBiZSBhbnkgY29tYmluYXRpb24gb2Ygb3V0dygpIGFuZCBvdXRiKCldICovCisgICAgb3V0c3coaW9hZGRyICsgQU0yMTUwX1hNVCwgc2tiLT5kYXRhLCBza2ItPmxlbiA+PiAxKTsKKyAgICBpZiAoc2tiLT5sZW4gJiAxKSB7CisgICAgICAvKiBPZGQgYnl0ZSB0cmFuc2ZlciAqLworICAgICAgb3V0Yihza2ItPmRhdGFbc2tiLT5sZW4tMV0sIGlvYWRkciArIEFNMjE1MF9YTVQpOworICAgIH0KKworICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisjaWYgTVVMVElfVFgKKyAgICBpZiAobHAtPnR4X2ZyZWVfZnJhbWVzID4gMCkKKyAgICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisjZW5kaWYgLyogI2lmIE1VTFRJX1RYICovCisgIH0KKworI2lmICghVFhfSU5URVJSVVBUQUJMRSkKKyAgLyogUmUtZW5hYmxlIE1BQ0UgVFggaW50ZXJydXB0cy4gKi8KKyAgbHAtPnR4X2lycV9kaXNhYmxlZD0wOworICBvdXRiKE1BQ0VfSU1SX0RFRkFVTFQsIGlvYWRkciArIEFNMjE1MF9NQUNFX0JBU0UgKyBNQUNFX0lNUik7CisjZW5kaWYgLyogI2lmICghVFhfSU5URVJSVVBUQUJMRSkgKi8KKworICBkZXZfa2ZyZWVfc2tiKHNrYik7CisKKyAgcmV0dXJuIDA7Cit9IC8qIG1hY2Vfc3RhcnRfeG1pdCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYWNlX2ludGVycnVwdAorCVRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBtYWNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKyAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgIGludCBzdGF0dXM7CisgIGludCBJbnRyQ250ID0gTUFDRV9NQVhfSVJfSVRFUkFUSU9OUzsKKworICBpZiAoZGV2ID09IE5VTEwpIHsKKyAgICBERUJVRygyLCAibWFjZV9pbnRlcnJ1cHQoKTogaXJxIDB4JVggZm9yIHVua25vd24gZGV2aWNlLlxuIiwKKwkgIGlycSk7CisgICAgcmV0dXJuIElSUV9OT05FOworICB9CisKKyAgaWYgKGxwLT50eF9pcnFfZGlzYWJsZWQpIHsKKyAgICBwcmludGsoCisgICAgICAobHAtPnR4X2lycV9kaXNhYmxlZD8KKyAgICAgICBLRVJOX05PVElDRSAiJXM6IEludGVycnVwdCB3aXRoIHR4X2lycV9kaXNhYmxlZCAiCisgICAgICAgIltpc3I9JTAyWCwgaW1yPSUwMlhdXG4iOiAKKyAgICAgICBLRVJOX05PVElDRSAiJXM6IFJlLWVudGVyaW5nIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAiCisgICAgICAgIltpc3I9JTAyWCwgaW1yPSUwMlhdXG4iKSwKKyAgICAgIGRldi0+bmFtZSwKKyAgICAgIGluYihpb2FkZHIgKyBBTTIxNTBfTUFDRV9CQVNFICsgTUFDRV9JUiksCisgICAgICBpbmIoaW9hZGRyICsgQU0yMTUwX01BQ0VfQkFTRSArIE1BQ0VfSU1SKQorICAgICk7CisgICAgLyogV0FSTklORzogTUFDRV9JUiBoYXMgYmVlbiByZWFkISAqLworICAgIHJldHVybiBJUlFfTk9ORTsKKyAgfQorCisgIGlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkgeworICAgIERFQlVHKDIsICIlczogaW50ZXJydXB0IGZyb20gZGVhZCBjYXJkXG4iLCBkZXYtPm5hbWUpOworICAgIHJldHVybiBJUlFfTk9ORTsKKyAgfQorCisgIGRvIHsKKyAgICAvKiBXQVJOSU5HOiBNQUNFX0lSIGlzIGEgUkVBRC9DTEVBUiBwb3J0ISAqLworICAgIHN0YXR1cyA9IGluYihpb2FkZHIgKyBBTTIxNTBfTUFDRV9CQVNFICsgTUFDRV9JUik7CisKKyAgICBERUJVRygzLCAibWFjZV9pbnRlcnJ1cHQ6IGlycSAweCVYIHN0YXR1cyAweCVYLlxuIiwgaXJxLCBzdGF0dXMpOworCisgICAgaWYgKHN0YXR1cyAmIE1BQ0VfSVJfUkNWSU5UKSB7CisgICAgICBtYWNlX3J4KGRldiwgTUFDRV9NQVhfUlhfSVRFUkFUSU9OUyk7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyAmIE1BQ0VfSVJfWE1USU5UKSB7CisgICAgICB1bnNpZ25lZCBjaGFyIGZpZm9mYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgeG10cmM7CisgICAgICB1bnNpZ25lZCBjaGFyIHhtdGZzOworCisgICAgICBmaWZvZmMgPSBpbmIoaW9hZGRyICsgQU0yMTUwX01BQ0VfQkFTRSArIE1BQ0VfRklGT0ZDKTsKKyAgICAgIGlmICgoZmlmb2ZjICYgTUFDRV9GSUZPRkNfWE1URkMpPT0wKSB7CisJbHAtPmxpbnV4X3N0YXRzLnR4X2Vycm9ycysrOworCW91dGIoMHhGRiwgaW9hZGRyICsgQU0yMTUwX1hNVF9TS0lQKTsKKyAgICAgIH0KKworICAgICAgLyogVHJhbnNtaXQgUmV0cnkgQ291bnQgKFhNVFJDLCByZWcgNCkgKi8KKyAgICAgIHhtdHJjID0gaW5iKGlvYWRkciArIEFNMjE1MF9NQUNFX0JBU0UgKyBNQUNFX1hNVFJDKTsKKyAgICAgIGlmICh4bXRyYyAmIE1BQ0VfWE1UUkNfRVhERUYpIGxwLT5tYWNlX3N0YXRzLmV4ZGVmKys7CisgICAgICBscC0+bWFjZV9zdGF0cy54bXRyYyArPSAoeG10cmMgJiBNQUNFX1hNVFJDX1hNVFJDKTsKKworICAgICAgaWYgKAorICAgICAgICAoeG10ZnMgPSBpbmIoaW9hZGRyICsgQU0yMTUwX01BQ0VfQkFTRSArIE1BQ0VfWE1URlMpKSAmCisgICAgICAgIE1BQ0VfWE1URlNfWE1UU1YgLyogVHJhbnNtaXQgU3RhdHVzIFZhbGlkICovCisgICAgICApIHsKKwlscC0+bWFjZV9zdGF0cy54bXRzdisrOworCisJaWYgKHhtdGZzICYgfk1BQ0VfWE1URlNfWE1UU1YpIHsKKwkgIGlmICh4bXRmcyAmIE1BQ0VfWE1URlNfVUZMTykgeworCSAgICAvKiBVbmRlcmZsb3cuICBJbmRpY2F0ZXMgdGhhdCB0aGUgVHJhbnNtaXQgRklGTyBlbXB0aWVkIGJlZm9yZQorCSAgICAgICB0aGUgZW5kIG9mIGZyYW1lIHdhcyByZWFjaGVkLiAqLworCSAgICBscC0+bWFjZV9zdGF0cy51ZmxvKys7CisJICB9CisJICBpZiAoeG10ZnMgJiBNQUNFX1hNVEZTX0xDT0wpIHsKKwkgICAgLyogTGF0ZSBDb2xsaXNpb24gKi8KKwkgICAgbHAtPm1hY2Vfc3RhdHMubGNvbCsrOworCSAgfQorCSAgaWYgKHhtdGZzICYgTUFDRV9YTVRGU19NT1JFKSB7CisJICAgIC8qIE1PUkUgdGhhbiBvbmUgcmV0cnkgd2FzIG5lZWRlZCAqLworCSAgICBscC0+bWFjZV9zdGF0cy5tb3JlKys7CisJICB9CisJICBpZiAoeG10ZnMgJiBNQUNFX1hNVEZTX09ORSkgeworCSAgICAvKiBFeGFjdGx5IE9ORSByZXRyeSBvY2N1cnJlZCAqLworCSAgICBscC0+bWFjZV9zdGF0cy5vbmUrKzsKKwkgIH0KKwkgIGlmICh4bXRmcyAmIE1BQ0VfWE1URlNfREVGRVIpIHsKKwkgICAgLyogVHJhbnNtaXNzaW9uIHdhcyBkZWZlcmVkICovCisJICAgIGxwLT5tYWNlX3N0YXRzLmRlZmVyKys7CisJICB9CisJICBpZiAoeG10ZnMgJiBNQUNFX1hNVEZTX0xDQVIpIHsKKwkgICAgLyogTG9zcyBvZiBjYXJyaWVyICovCisJICAgIGxwLT5tYWNlX3N0YXRzLmxjYXIrKzsKKwkgIH0KKwkgIGlmICh4bXRmcyAmIE1BQ0VfWE1URlNfUlRSWSkgeworCSAgICAvKiBSZXRyeSBlcnJvcjogdHJhbnNtaXQgYWJvcnRlZCBhZnRlciAxNiBhdHRlbXB0cyAqLworCSAgICBscC0+bWFjZV9zdGF0cy5ydHJ5Kys7CisJICB9CisgICAgICAgIH0gLyogaWYgKHhtdGZzICYgfk1BQ0VfWE1URlNfWE1UU1YpICovCisKKyAgICAgIH0gLyogaWYgKHhtdGZzICYgTUFDRV9YTVRGU19YTVRTVikgKi8KKworICAgICAgbHAtPmxpbnV4X3N0YXRzLnR4X3BhY2tldHMrKzsKKyAgICAgIGxwLT50eF9mcmVlX2ZyYW1lcysrOworICAgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworICAgIH0gLyogaWYgKHN0YXR1cyAmIE1BQ0VfSVJfWE1USU5UKSAqLworCisgICAgaWYgKHN0YXR1cyAmIH5NQUNFX0lNUl9ERUZBVUxUICYgfk1BQ0VfSVJfUkNWSU5UICYgfk1BQ0VfSVJfWE1USU5UKSB7CisgICAgICBpZiAoc3RhdHVzICYgTUFDRV9JUl9KQUIpIHsKKyAgICAgICAgLyogSmFiYmVyIEVycm9yLiAgRXhjZXNzaXZlIHRyYW5zbWl0IGR1cmF0aW9uICgyMC0xNTBtcykuICovCisgICAgICAgIGxwLT5tYWNlX3N0YXRzLmphYisrOworICAgICAgfQorICAgICAgaWYgKHN0YXR1cyAmIE1BQ0VfSVJfQkFCTCkgeworICAgICAgICAvKiBCYWJibGUgRXJyb3IuICA+MTUxOCBieXRlcyB0cmFuc21pdHRlZC4gKi8KKyAgICAgICAgbHAtPm1hY2Vfc3RhdHMuYmFibCsrOworICAgICAgfQorICAgICAgaWYgKHN0YXR1cyAmIE1BQ0VfSVJfQ0VSUikgeworCS8qIENvbGxpc2lvbiBFcnJvci4gIENFUlIgaW5kaWNhdGVzIHRoZSBhYnNlbmNlIG9mIHRoZQorCSAgIFNpZ25hbCBRdWFsaXR5IEVycm9yIFRlc3QgbWVzc2FnZSBhZnRlciBhIHBhY2tldAorCSAgIHRyYW5zbWlzc2lvbi4gKi8KKyAgICAgICAgbHAtPm1hY2Vfc3RhdHMuY2VycisrOworICAgICAgfQorICAgICAgaWYgKHN0YXR1cyAmIE1BQ0VfSVJfUkNWQ0NPKSB7CisgICAgICAgIC8qIFJlY2VpdmUgQ29sbGlzaW9uIENvdW50IE92ZXJmbG93OyAqLworICAgICAgICBscC0+bWFjZV9zdGF0cy5yY3ZjY28rKzsKKyAgICAgIH0KKyAgICAgIGlmIChzdGF0dXMgJiBNQUNFX0lSX1JOVFBDTykgeworICAgICAgICAvKiBSdW50IFBhY2tldCBDb3VudCBPdmVyZmxvdyAqLworICAgICAgICBscC0+bWFjZV9zdGF0cy5ybnRwY28rKzsKKyAgICAgIH0KKyAgICAgIGlmIChzdGF0dXMgJiBNQUNFX0lSX01QQ08pIHsKKyAgICAgICAgLyogTWlzc2VkIFBhY2tldCBDb3VudCBPdmVyZmxvdyAqLworICAgICAgICBscC0+bWFjZV9zdGF0cy5tcGNvKys7CisgICAgICB9CisgICAgfSAvKiBpZiAoc3RhdHVzICYgfk1BQ0VfSU1SX0RFRkFVTFQgJiB+TUFDRV9JUl9SQ1ZJTlQgJiB+TUFDRV9JUl9YTVRJTlQpICovCisKKyAgfSB3aGlsZSAoKHN0YXR1cyAmIH5NQUNFX0lNUl9ERUZBVUxUKSAmJiAoLS1JbnRyQ250KSk7CisKKyAgcmV0dXJuIElSUV9IQU5ETEVEOworfSAvKiBtYWNlX2ludGVycnVwdCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYWNlX3J4CisJUmVjZWl2ZXMgcGFja2V0cy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgbWFjZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIFJ4Q250KQoreworICBtYWNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgdW5zaWduZWQgY2hhciByeF9mcmFtZWNudDsKKyAgdW5zaWduZWQgc2hvcnQgcnhfc3RhdHVzOworCisgIHdoaWxlICgKKyAgICAoKHJ4X2ZyYW1lY250ID0gaW5iKGlvYWRkciArIEFNMjE1MF9SQ1ZfRlJBTUVfQ09VTlQpKSA+IDApICYmCisgICAgKHJ4X2ZyYW1lY250IDw9IDEyKSAmJiAvKiByeF9mcmFtZWNudD09MHhGRiBpZiBjYXJkIGlzIGV4dHJhY3RlZC4gKi8KKyAgICAoUnhDbnQtLSkKKyAgKSB7CisgICAgcnhfc3RhdHVzID0gaW53KGlvYWRkciArIEFNMjE1MF9SQ1YpOworCisgICAgREVCVUcoMywgIiVzOiBpbiBtYWNlX3J4KCksIGZyYW1lY250IDB4JVgsIHJ4X3N0YXR1cyIKKwkgICIgMHglWC5cbiIsIGRldi0+bmFtZSwgcnhfZnJhbWVjbnQsIHJ4X3N0YXR1cyk7CisKKyAgICBpZiAocnhfc3RhdHVzICYgTUFDRV9SQ1ZGU19SQ1ZTVFMpIHsgLyogRXJyb3IsIHVwZGF0ZSBzdGF0cy4gKi8KKyAgICAgIGxwLT5saW51eF9zdGF0cy5yeF9lcnJvcnMrKzsKKyAgICAgIGlmIChyeF9zdGF0dXMgJiBNQUNFX1JDVkZTX09GTE8pIHsKKyAgICAgICAgbHAtPm1hY2Vfc3RhdHMub2ZsbysrOworICAgICAgfQorICAgICAgaWYgKHJ4X3N0YXR1cyAmIE1BQ0VfUkNWRlNfQ0xTTikgeworICAgICAgICBscC0+bWFjZV9zdGF0cy5jbHNuKys7CisgICAgICB9CisgICAgICBpZiAocnhfc3RhdHVzICYgTUFDRV9SQ1ZGU19GUkFNKSB7CisJbHAtPm1hY2Vfc3RhdHMuZnJhbSsrOworICAgICAgfQorICAgICAgaWYgKHJ4X3N0YXR1cyAmIE1BQ0VfUkNWRlNfRkNTKSB7CisgICAgICAgIGxwLT5tYWNlX3N0YXRzLmZjcysrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzaG9ydCBwa3RfbGVuID0gKHJ4X3N0YXR1cyAmIH5NQUNFX1JDVkZTX1JDVlNUUykgLSA0OworICAgICAgICAvKiBBdXRvIFN0cmlwIGlzIG9mZiwgYWx3YXlzIHN1YnRyYWN0IDQgKi8KKyAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisKKyAgICAgIGxwLT5tYWNlX3N0YXRzLnJmc19ybnRwYyArPSBpbmIoaW9hZGRyICsgQU0yMTUwX1JDVik7CisgICAgICAgIC8qIHJ1bnQgcGFja2V0IGNvdW50ICovCisgICAgICBscC0+bWFjZV9zdGF0cy5yZnNfcmN2Y2MgKz0gaW5iKGlvYWRkciArIEFNMjE1MF9SQ1YpOworICAgICAgICAvKiByY3YgY29sbGlzaW9uIGNvdW50ICovCisKKyAgICAgIERFQlVHKDMsICIgICAgcmVjZWl2aW5nIHBhY2tldCBzaXplIDB4JVggcnhfc3RhdHVzIgorCSAgICAiIDB4JVguXG4iLCBwa3RfbGVuLCByeF9zdGF0dXMpOworCisgICAgICBza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMik7CisKKyAgICAgIGlmIChza2IgIT0gTlVMTCkgeworCXNrYi0+ZGV2ID0gZGV2OworCisJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwlpbnN3KGlvYWRkciArIEFNMjE1MF9SQ1YsIHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwgcGt0X2xlbj4+MSk7CisJaWYgKHBrdF9sZW4gJiAxKQorCSAgICAqKHNrYi0+dGFpbC0xKSA9IGluYihpb2FkZHIgKyBBTTIxNTBfUkNWKTsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQorCW5ldGlmX3J4KHNrYik7IC8qIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgdXBwZXIgKHByb3RvY29sKSBsYXllcnMuICovCisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCWxwLT5saW51eF9zdGF0cy5yeF9wYWNrZXRzKys7CisJbHAtPmxpbnV4X3N0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCW91dGIoMHhGRiwgaW9hZGRyICsgQU0yMTUwX1JDVl9ORVhUKTsgLyogc2tpcCB0byBuZXh0IGZyYW1lICovCisJY29udGludWU7CisgICAgICB9IGVsc2UgeworCURFQlVHKDEsICIlczogY291bGRuJ3QgYWxsb2NhdGUgYSBza19idWZmIG9mIHNpemUiCisJICAgICAgIiAlZC5cbiIsIGRldi0+bmFtZSwgcGt0X2xlbik7CisJbHAtPmxpbnV4X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0YigweEZGLCBpb2FkZHIgKyBBTTIxNTBfUkNWX05FWFQpOyAvKiBza2lwIHRvIG5leHQgZnJhbWUgKi8KKyAgfSAvKiB3aGlsZSAqLworCisgIHJldHVybiAwOworfSAvKiBtYWNlX3J4ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ByX2xpbnV4X3N0YXRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCBwcl9saW51eF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcHN0YXRzKQoreworICBERUJVRygyLCAicHJfbGludXhfc3RhdHNcbiIpOworICBERUJVRygyLCAiIHJ4X3BhY2tldHM9JS03bGQgICAgICAgIHR4X3BhY2tldHM9JWxkXG4iLAorCShsb25nKXBzdGF0cy0+cnhfcGFja2V0cywgKGxvbmcpcHN0YXRzLT50eF9wYWNrZXRzKTsKKyAgREVCVUcoMiwgIiByeF9lcnJvcnM9JS03bGQgICAgICAgICB0eF9lcnJvcnM9JWxkXG4iLAorCShsb25nKXBzdGF0cy0+cnhfZXJyb3JzLCAobG9uZylwc3RhdHMtPnR4X2Vycm9ycyk7CisgIERFQlVHKDIsICIgcnhfZHJvcHBlZD0lLTdsZCAgICAgICAgdHhfZHJvcHBlZD0lbGRcbiIsCisJKGxvbmcpcHN0YXRzLT5yeF9kcm9wcGVkLCAobG9uZylwc3RhdHMtPnR4X2Ryb3BwZWQpOworICBERUJVRygyLCAiIG11bHRpY2FzdD0lLTdsZCAgICAgICAgIGNvbGxpc2lvbnM9JWxkXG4iLAorCShsb25nKXBzdGF0cy0+bXVsdGljYXN0LCAobG9uZylwc3RhdHMtPmNvbGxpc2lvbnMpOworCisgIERFQlVHKDIsICIgcnhfbGVuZ3RoX2Vycm9ycz0lLTdsZCAgcnhfb3Zlcl9lcnJvcnM9JWxkXG4iLAorCShsb25nKXBzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycywgKGxvbmcpcHN0YXRzLT5yeF9vdmVyX2Vycm9ycyk7CisgIERFQlVHKDIsICIgcnhfY3JjX2Vycm9ycz0lLTdsZCAgICAgcnhfZnJhbWVfZXJyb3JzPSVsZFxuIiwKKwkobG9uZylwc3RhdHMtPnJ4X2NyY19lcnJvcnMsIChsb25nKXBzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKTsKKyAgREVCVUcoMiwgIiByeF9maWZvX2Vycm9ycz0lLTdsZCAgICByeF9taXNzZWRfZXJyb3JzPSVsZFxuIiwKKwkobG9uZylwc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzLCAobG9uZylwc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMpOworCisgIERFQlVHKDIsICIgdHhfYWJvcnRlZF9lcnJvcnM9JS03bGQgdHhfY2Fycmllcl9lcnJvcnM9JWxkXG4iLAorCShsb25nKXBzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMsIChsb25nKXBzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMpOworICBERUJVRygyLCAiIHR4X2ZpZm9fZXJyb3JzPSUtN2xkICAgIHR4X2hlYXJ0YmVhdF9lcnJvcnM9JWxkXG4iLAorCShsb25nKXBzdGF0cy0+dHhfZmlmb19lcnJvcnMsIChsb25nKXBzdGF0cy0+dHhfaGVhcnRiZWF0X2Vycm9ycyk7CisgIERFQlVHKDIsICIgdHhfd2luZG93X2Vycm9ycz0lbGRcbiIsCisJKGxvbmcpcHN0YXRzLT50eF93aW5kb3dfZXJyb3JzKTsKK30gLyogcHJfbGludXhfc3RhdHMgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcHJfbWFjZV9zdGF0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQgcHJfbWFjZV9zdGF0cyhtYWNlX3N0YXRpc3RpY3MgKnBzdGF0cykKK3sKKyAgREVCVUcoMiwgInByX21hY2Vfc3RhdHNcbiIpOworCisgIERFQlVHKDIsICIgeG10c3Y9JS03ZCAgICAgICAgICAgICB1ZmxvPSVkXG4iLAorCXBzdGF0cy0+eG10c3YsIHBzdGF0cy0+dWZsbyk7CisgIERFQlVHKDIsICIgbGNvbD0lLTdkICAgICAgICAgICAgICBtb3JlPSVkXG4iLAorCXBzdGF0cy0+bGNvbCwgcHN0YXRzLT5tb3JlKTsKKyAgREVCVUcoMiwgIiBvbmU9JS03ZCAgICAgICAgICAgICAgIGRlZmVyPSVkXG4iLAorCXBzdGF0cy0+b25lLCBwc3RhdHMtPmRlZmVyKTsKKyAgREVCVUcoMiwgIiBsY2FyPSUtN2QgICAgICAgICAgICAgIHJ0cnk9JWRcbiIsCisJcHN0YXRzLT5sY2FyLCBwc3RhdHMtPnJ0cnkpOworCisgIC8qIE1BQ0VfWE1UUkMgKi8KKyAgREVCVUcoMiwgIiBleGRlZj0lLTdkICAgICAgICAgICAgIHhtdHJjPSVkXG4iLAorCXBzdGF0cy0+ZXhkZWYsIHBzdGF0cy0+eG10cmMpOworCisgIC8qIFJGUzEtLVJlY2VpdmUgU3RhdHVzIChSQ1ZTVFMpICovCisgIERFQlVHKDIsICIgb2Zsbz0lLTdkICAgICAgICAgICAgICBjbHNuPSVkXG4iLAorCXBzdGF0cy0+b2ZsbywgcHN0YXRzLT5jbHNuKTsKKyAgREVCVUcoMiwgIiBmcmFtPSUtN2QgICAgICAgICAgICAgIGZjcz0lZFxuIiwKKwlwc3RhdHMtPmZyYW0sIHBzdGF0cy0+ZmNzKTsKKworICAvKiBSRlMyLS1SdW50IFBhY2tldCBDb3VudCAoUk5UUEMpICovCisgIC8qIFJGUzMtLVJlY2VpdmUgQ29sbGlzaW9uIENvdW50IChSQ1ZDQykgKi8KKyAgREVCVUcoMiwgIiByZnNfcm50cGM9JS03ZCAgICAgICAgIHJmc19yY3ZjYz0lZFxuIiwKKwlwc3RhdHMtPnJmc19ybnRwYywgcHN0YXRzLT5yZnNfcmN2Y2MpOworCisgIC8qIE1BQ0VfSVIgKi8KKyAgREVCVUcoMiwgIiBqYWI9JS03ZCAgICAgICAgICAgICAgIGJhYmw9JWRcbiIsCisJcHN0YXRzLT5qYWIsIHBzdGF0cy0+YmFibCk7CisgIERFQlVHKDIsICIgY2Vycj0lLTdkICAgICAgICAgICAgICByY3ZjY289JWRcbiIsCisJcHN0YXRzLT5jZXJyLCBwc3RhdHMtPnJjdmNjbyk7CisgIERFQlVHKDIsICIgcm50cGNvPSUtN2QgICAgICAgICAgICBtcGNvPSVkXG4iLAorCXBzdGF0cy0+cm50cGNvLCBwc3RhdHMtPm1wY28pOworCisgIC8qIE1BQ0VfTVBDICovCisgIERFQlVHKDIsICIgbXBjPSVkXG4iLCBwc3RhdHMtPm1wYyk7CisKKyAgLyogTUFDRV9STlRQQyAqLworICBERUJVRygyLCAiIHJudHBjPSVkXG4iLCBwc3RhdHMtPnJudHBjKTsKKworICAvKiBNQUNFX1JDVkNDICovCisgIERFQlVHKDIsICIgcmN2Y2M9JWRcbiIsIHBzdGF0cy0+cmN2Y2MpOworCit9IC8qIHByX21hY2Vfc3RhdHMgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordXBkYXRlX3N0YXRzCisJVXBkYXRlIHN0YXRpc3RpY3MuICBXZSBjaGFuZ2UgdG8gcmVnaXN0ZXIgd2luZG93IDEsIHNvIHRoaXMKKwlzaG91bGQgYmUgcnVuIHNpbmdsZS10aHJlYWRlZCBpZiB0aGUgZGV2aWNlIGlzIGFjdGl2ZS4gVGhpcyBpcworCWV4cGVjdGVkIHRvIGJlIGEgcmFyZSBvcGVyYXRpb24sIGFuZCBpdCdzIHNpbXBsZXIgZm9yIHRoZSByZXN0CisJb2YgdGhlIGRyaXZlciB0byBhc3N1bWUgdGhhdCB3aW5kb3cgMCBpcyBhbHdheXMgdmFsaWQgcmF0aGVyCisJdGhhbiB1c2UgYSBzcGVjaWFsIHdpbmRvdy1zdGF0ZSB2YXJpYWJsZS4KKworCW9mbG8gJiB1ZmxvIHNob3VsZCBfbmV2ZXJfIG9jY3VyIHNpbmNlIGl0IHdvdWxkIG1lYW4gdGhlIFhpbGlueAorCXdhcyBub3QgYWJsZSB0byB0cmFuc2ZlciBkYXRhIGJldHdlZW4gdGhlIE1BQ0UgRklGTyBhbmQgdGhlCisJY2FyZCdzIFNSQU0gZmFzdCBlbm91Z2guICBJZiB0aGlzIGhhcHBlbnMsIHNvbWV0aGluZyBpcworCXNlcmlvdXNseSB3cm9uZyB3aXRoIHRoZSBoYXJkd2FyZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhraW9fYWRkcl90IGlvYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgbHAtPm1hY2Vfc3RhdHMucmN2Y2MgKz0gbWFjZV9yZWFkKGxwLCBpb2FkZHIsIE1BQ0VfUkNWQ0MpOworICBscC0+bWFjZV9zdGF0cy5ybnRwYyArPSBtYWNlX3JlYWQobHAsIGlvYWRkciwgTUFDRV9STlRQQyk7CisgIGxwLT5tYWNlX3N0YXRzLm1wYyArPSBtYWNlX3JlYWQobHAsIGlvYWRkciwgTUFDRV9NUEMpOworICAvKiBBdCB0aGlzIHBvaW50LCBtYWNlX3N0YXRzIGlzIGZ1bGx5IHVwZGF0ZWQgZm9yIHRoaXMgY2FsbC4KKyAgICAgV2UgbWF5IG5vdyB1cGRhdGUgdGhlIGxpbnV4X3N0YXRzLiAqLworCisgIC8qIFRoZSBNQUNFIGhhcyBubyBlcXVpdmFsZW50IGZvciBsaW51eF9zdGF0cyBmaWVsZCB3aGljaCBhcmUgY29tbWVudGVkCisgICAgIG91dC4gKi8KKworICAvKiBscC0+bGludXhfc3RhdHMubXVsdGljYXN0OyAqLworICBscC0+bGludXhfc3RhdHMuY29sbGlzaW9ucyA9IAorICAgIGxwLT5tYWNlX3N0YXRzLnJjdmNjbyAqIDI1NiArIGxwLT5tYWNlX3N0YXRzLnJjdmNjOworICAgIC8qIENvbGxpc2lvbjogVGhlIE1BQ0UgbWF5IHJldHJ5IHNlbmRpbmcgYSBwYWNrZXQgMTUgdGltZXMKKyAgICAgICBiZWZvcmUgZ2l2aW5nIHVwLiAgVGhlIHJldHJ5IGNvdW50IGlzIGluIFhNVFJDLgorICAgICAgIERvZXMgZWFjaCByZXRyeSBjb25zdGl0dXRlIGEgY29sbGlzaW9uPworICAgICAgIElmIHNvLCB3aHkgZG9lc24ndCB0aGUgUkNWQ0MgcmVjb3JkIHRoZXNlIGNvbGxpc2lvbnM/ICovCisKKyAgLyogZGV0YWlsZWQgcnhfZXJyb3JzOiAqLworICBscC0+bGludXhfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IAorICAgIGxwLT5tYWNlX3N0YXRzLnJudHBjbyAqIDI1NiArIGxwLT5tYWNlX3N0YXRzLnJudHBjOworICAvKiBscC0+bGludXhfc3RhdHMucnhfb3Zlcl9lcnJvcnMgKi8KKyAgbHAtPmxpbnV4X3N0YXRzLnJ4X2NyY19lcnJvcnMgPSBscC0+bWFjZV9zdGF0cy5mY3M7CisgIGxwLT5saW51eF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSBscC0+bWFjZV9zdGF0cy5mcmFtOworICBscC0+bGludXhfc3RhdHMucnhfZmlmb19lcnJvcnMgPSBscC0+bWFjZV9zdGF0cy5vZmxvOworICBscC0+bGludXhfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IAorICAgIGxwLT5tYWNlX3N0YXRzLm1wY28gKiAyNTYgKyBscC0+bWFjZV9zdGF0cy5tcGM7CisKKyAgLyogZGV0YWlsZWQgdHhfZXJyb3JzICovCisgIGxwLT5saW51eF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9IGxwLT5tYWNlX3N0YXRzLnJ0cnk7CisgIGxwLT5saW51eF9zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyA9IGxwLT5tYWNlX3N0YXRzLmxjYXI7CisgICAgLyogTENBUiB1c3VhbGx5IHJlc3VsdHMgZnJvbSBiYWQgY2FibGluZy4gKi8KKyAgbHAtPmxpbnV4X3N0YXRzLnR4X2ZpZm9fZXJyb3JzID0gbHAtPm1hY2Vfc3RhdHMudWZsbzsKKyAgbHAtPmxpbnV4X3N0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMgPSBscC0+bWFjZV9zdGF0cy5jZXJyOworICAvKiBscC0+bGludXhfc3RhdHMudHhfd2luZG93X2Vycm9yczsgKi8KKworICByZXR1cm47Cit9IC8qIHVwZGF0ZV9zdGF0cyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYWNlX2dldF9zdGF0cworCUdhdGhlcnMgZXRoZXJuZXQgc3RhdGlzdGljcyBmcm9tIHRoZSBNQUNFIGNoaXAuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm1hY2VfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgIHVwZGF0ZV9zdGF0cyhkZXYtPmJhc2VfYWRkciwgZGV2KTsKKworICBERUJVRygxLCAiJXM6IHVwZGF0aW5nIHRoZSBzdGF0aXN0aWNzLlxuIiwgZGV2LT5uYW1lKTsKKyAgcHJfbGludXhfc3RhdHMoJmxwLT5saW51eF9zdGF0cyk7CisgIHByX21hY2Vfc3RhdHMoJmxwLT5tYWNlX3N0YXRzKTsKKworICByZXR1cm4gJmxwLT5saW51eF9zdGF0czsKK30gLyogbmV0X2RldmljZV9zdGF0cyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit1cGRhdGVDUkMKKwlNb2RpZmllZCBmcm9tIEFtNzlDOTAgZGF0YSBzaGVldC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEJST0tFTl9NVUxUSUNBU1QKKworc3RhdGljIHZvaWQgdXBkYXRlQ1JDKGludCAqQ1JDLCBpbnQgYml0KQoreworICBpbnQgcG9seVtdPXsKKyAgICAxLDEsMSwwLCAxLDEsMCwxLAorICAgIDEsMCwxLDEsIDEsMCwwLDAsCisgICAgMSwwLDAsMCwgMCwwLDEsMSwKKyAgICAwLDAsMSwwLCAwLDAsMCwwCisgIH07IC8qIENSQyBwb2x5bm9taWFsLiAgcG9seVtuXSA9IGNvZWZmaWNpZW50IG9mIHRoZSB4KipuIHRlcm0gb2YgdGhlCisJQ1JDIGdlbmVyYXRvciBwb2x5bm9taWFsLiAqLworCisgIGludCBqOworCisgIC8qIHNoaWZ0IENSQyBhbmQgY29udHJvbCBiaXQgKENSQ1szMl0pICovCisgIGZvciAoaiA9IDMyOyBqID4gMDsgai0tKQorICAgIENSQ1tqXSA9IENSQ1tqLTFdOworICBDUkNbMF0gPSAwOworCisgIC8qIElmIGJpdCBYT1IoY29udHJvbCBiaXQpID0gMSwgc2V0IENSQyA9IENSQyBYT1IgcG9seW5vbWlhbC4gKi8KKyAgaWYgKGJpdCBeIENSQ1szMl0pCisgICAgZm9yIChqID0gMDsgaiA8IDMyOyBqKyspCisgICAgICBDUkNbal0gXj0gcG9seVtqXTsKK30gLyogdXBkYXRlQ1JDICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0J1aWxkTEFGCisJQnVpbGQgbG9naWNhbCBhZGRyZXNzIGZpbHRlci4KKwlNb2RpZmllZCBmcm9tIEFtNzlDOTAgZGF0YSBzaGVldC4KKworSW5wdXQKKwlsYWRyZjogbG9naWNhbCBhZGRyZXNzIGZpbHRlciAoY29udGVudHMgaW5pdGlhbGl6ZWQgdG8gMCkKKwlhZHI6IGV0aGVybmV0IGFkZHJlc3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIEJ1aWxkTEFGKGludCAqbGFkcmYsIGludCAqYWRyKQoreworICBpbnQgQ1JDWzMzXT17MX07IC8qIENSQyByZWdpc3RlciwgMSB3b3JkL2JpdCArIGV4dHJhIGNvbnRyb2wgYml0ICovCisKKyAgaW50IGksIGJ5dGU7IC8qIHRlbXBvcmFyeSBhcnJheSBpbmRpY2VzICovCisgIGludCBoYXNoY29kZTsgLyogdGhlIG91dHB1dCBvYmplY3QgKi8KKworICBDUkNbMzJdPTA7CisKKyAgZm9yIChieXRlID0gMDsgYnl0ZSA8IDY7IGJ5dGUrKykKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgdXBkYXRlQ1JDKENSQywgKGFkcltieXRlXSA+PiBpKSAmIDEpOworCisgIGhhc2hjb2RlID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICBoYXNoY29kZSA9IChoYXNoY29kZSA8PCAxKSArIENSQ1tpXTsKKworICBieXRlID0gaGFzaGNvZGUgPj4gMzsKKyAgbGFkcmZbYnl0ZV0gfD0gKDEgPDwgKGhhc2hjb2RlICYgNykpOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCisgIGlmIChwY19kZWJ1ZyA+IDIpIHsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAiICAgIGFkciA9Iik7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgIHByaW50aygiICUwMlgiLCBhZHJbaV0pOworICAgIHByaW50aygiXG4iIEtFUk5fREVCVUcgIiAgICBoYXNoY29kZSA9ICVkKGRlY2ltYWwpLCBsYWRyZlswOjYzXSIKKwkgICAiID0iLCBoYXNoY29kZSk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgIHByaW50aygiICUwMlgiLCBsYWRyZltpXSk7CisgICAgcHJpbnRrKCJcbiIpOworICB9CisjZW5kaWYKK30gLyogQnVpbGRMQUYgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmVzdG9yZV9tdWx0aWNhc3RfbGlzdAorCVJlc3RvcmVzIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciBNQUNFIGNoaXAgdG8gdGhlIGxhc3QKKwlzZXRfbXVsdGljYXN0X2xpc3QoKSBjYWxsLgorCitJbnB1dAorCW11bHRpY2FzdF9udW1fYWRkcnMKKwltdWx0aWNhc3RfbGFkcmZbXQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQgcmVzdG9yZV9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBtYWNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgaW50IG51bV9hZGRycyA9IGxwLT5tdWx0aWNhc3RfbnVtX2FkZHJzOworICBpbnQgKmxhZHJmID0gbHAtPm11bHRpY2FzdF9sYWRyZjsKKyAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgaW50IGk7CisKKyAgREVCVUcoMiwgIiVzOiByZXN0b3JpbmcgUnggbW9kZSB0byAlZCBhZGRyZXNzZXMuXG4iLAorCWRldi0+bmFtZSwgbnVtX2FkZHJzKTsKKworICBpZiAobnVtX2FkZHJzID4gMCkgeworCisgICAgREVCVUcoMSwgIkF0dGVtcHQgdG8gcmVzdG9yZSBtdWx0aWNhc3QgbGlzdCBkZXRlY3RlZC5cbiIpOworCisgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX0lBQywgTUFDRV9JQUNfQUREUkNIRyB8IE1BQ0VfSUFDX0xPR0FERFIpOworICAgIC8qIFBvbGwgQUREUkNIRyBiaXQgKi8KKyAgICB3aGlsZSAobWFjZV9yZWFkKGxwLCBpb2FkZHIsIE1BQ0VfSUFDKSAmIE1BQ0VfSUFDX0FERFJDSEcpCisgICAgICA7CisgICAgLyogU2V0IExBRFJGIHJlZ2lzdGVyICovCisgICAgZm9yIChpID0gMDsgaSA8IE1BQ0VfTEFEUkZfTEVOOyBpKyspCisgICAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfTEFEUkYsIGxhZHJmW2ldKTsKKworICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9VVFIsIE1BQ0VfVVRSX1JDVkZDU0UgfCBNQUNFX1VUUl9MT09QX0VYVEVSTkFMKTsKKyAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfTUFDQ0MsIE1BQ0VfTUFDQ0NfRU5YTVQgfCBNQUNFX01BQ0NDX0VOUkNWKTsKKworICB9IGVsc2UgaWYgKG51bV9hZGRycyA8IDApIHsKKworICAgIC8qIFByb21pc2N1b3VzIG1vZGU6IHJlY2VpdmUgYWxsIHBhY2tldHMgKi8KKyAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfVVRSLCBNQUNFX1VUUl9MT09QX0VYVEVSTkFMKTsKKyAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfTUFDQ0MsCisgICAgICBNQUNFX01BQ0NDX1BST00gfCBNQUNFX01BQ0NDX0VOWE1UIHwgTUFDRV9NQUNDQ19FTlJDVgorICAgICk7CisKKyAgfSBlbHNlIHsKKworICAgIC8qIE5vcm1hbCBtb2RlICovCisgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX1VUUiwgTUFDRV9VVFJfTE9PUF9FWFRFUk5BTCk7CisgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX01BQ0NDLCBNQUNFX01BQ0NDX0VOWE1UIHwgTUFDRV9NQUNDQ19FTlJDVik7CisKKyAgfQorfSAvKiByZXN0b3JlX211bHRpY2FzdF9saXN0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NldF9tdWx0aWNhc3RfbGlzdAorCVNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorCitJbnB1dAorCW51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisJbnVtX2FkZHJzID09IDAJTm9ybWFsIG1vZGUsIGNsZWFyIG11bHRpY2FzdCBsaXN0CisJbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsIGFuZCBkbworCQkJYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorT3V0cHV0CisJbXVsdGljYXN0X251bV9hZGRycworCW11bHRpY2FzdF9sYWRyZltdCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBtYWNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgaW50IGFkcltFVEhFUl9BRERSX0xFTl0gPSB7MH07IC8qIEV0aGVybmV0IGFkZHJlc3MgKi8KKyAgaW50IGk7CisgIHN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCisjaWZkZWYgUENNQ0lBX0RFQlVHCisgIGlmIChwY19kZWJ1ZyA+IDEpIHsKKyAgICBzdGF0aWMgaW50IG9sZDsKKyAgICBpZiAoZGV2LT5tY19jb3VudCAhPSBvbGQpIHsKKyAgICAgIG9sZCA9IGRldi0+bWNfY291bnQ7CisgICAgICBERUJVRygwLCAiJXM6IHNldHRpbmcgUnggbW9kZSB0byAlZCBhZGRyZXNzZXMuXG4iLAorCSAgICBkZXYtPm5hbWUsIG9sZCk7CisgICAgfQorICB9CisjZW5kaWYKKworICAvKiBTZXQgbXVsdGljYXN0X251bV9hZGRycy4gKi8KKyAgbHAtPm11bHRpY2FzdF9udW1fYWRkcnMgPSBkZXYtPm1jX2NvdW50OworCisgIC8qIFNldCBtdWx0aWNhc3RfbGFkcmYuICovCisgIGlmIChudW1fYWRkcnMgPiAwKSB7CisgICAgLyogQ2FsY3VsYXRlIG11bHRpY2FzdCBsb2dpY2FsIGFkZHJlc3MgZmlsdGVyICovCisgICAgbWVtc2V0KGxwLT5tdWx0aWNhc3RfbGFkcmYsIDAsIE1BQ0VfTEFEUkZfTEVOKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrKSB7CisgICAgICBtZW1jcHkoYWRyLCBkbWktPmRtaV9hZGRyLCBFVEhFUl9BRERSX0xFTik7CisgICAgICBkbWkgPSBkbWktPm5leHQ7CisgICAgICBCdWlsZExBRihscC0+bXVsdGljYXN0X2xhZHJmLCBhZHIpOworICAgIH0KKyAgfQorCisgIHJlc3RvcmVfbXVsdGljYXN0X2xpc3QoZGV2KTsKKworfSAvKiBzZXRfbXVsdGljYXN0X2xpc3QgKi8KKworI2VuZGlmIC8qIEJST0tFTl9NVUxUSUNBU1QgKi8KKworc3RhdGljIHZvaWQgcmVzdG9yZV9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICBtYWNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICBERUJVRygyLCAiJXM6IHJlc3RvcmluZyBSeCBtb2RlIHRvICVkIGFkZHJlc3Nlcy5cbiIsIGRldi0+bmFtZSwKKwlscC0+bXVsdGljYXN0X251bV9hZGRycyk7CisKKyAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworICAgIC8qIFByb21pc2N1b3VzIG1vZGU6IHJlY2VpdmUgYWxsIHBhY2tldHMgKi8KKyAgICBtYWNlX3dyaXRlKGxwLGlvYWRkciwgTUFDRV9VVFIsIE1BQ0VfVVRSX0xPT1BfRVhURVJOQUwpOworICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9NQUNDQywKKyAgICAgIE1BQ0VfTUFDQ0NfUFJPTSB8IE1BQ0VfTUFDQ0NfRU5YTVQgfCBNQUNFX01BQ0NDX0VOUkNWCisgICAgKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBOb3JtYWwgbW9kZSAqLworICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9VVFIsIE1BQ0VfVVRSX0xPT1BfRVhURVJOQUwpOworICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9NQUNDQywgTUFDRV9NQUNDQ19FTlhNVCB8IE1BQ0VfTUFDQ0NfRU5SQ1YpOworICB9Cit9IC8qIHJlc3RvcmVfbXVsdGljYXN0X2xpc3QgKi8KKworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCisgIGlmIChwY19kZWJ1ZyA+IDEpIHsKKyAgICBzdGF0aWMgaW50IG9sZDsKKyAgICBpZiAoZGV2LT5tY19jb3VudCAhPSBvbGQpIHsKKyAgICAgIG9sZCA9IGRldi0+bWNfY291bnQ7CisgICAgICBERUJVRygwLCAiJXM6IHNldHRpbmcgUnggbW9kZSB0byAlZCBhZGRyZXNzZXMuXG4iLAorCSAgICBkZXYtPm5hbWUsIG9sZCk7CisgICAgfQorICB9CisjZW5kaWYKKworICBscC0+bXVsdGljYXN0X251bV9hZGRycyA9IGRldi0+bWNfY291bnQ7CisgIHJlc3RvcmVfbXVsdGljYXN0X2xpc3QoZGV2KTsKKworfSAvKiBzZXRfbXVsdGljYXN0X2xpc3QgKi8KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIG5tY2xhbl9jc19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJubWNsYW5fY3MiLAorCX0sCisJLmF0dGFjaAkJPSBubWNsYW5fYXR0YWNoLAorCS5kZXRhY2gJCT0gbm1jbGFuX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbm1jbGFuX2NzKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJm5tY2xhbl9jc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubWNsYW5fY3Modm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJm5tY2xhbl9jc19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubWNsYW5fY3MpOworbW9kdWxlX2V4aXQoZXhpdF9ubWNsYW5fY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL29zaXRlY2guaCBiL2RyaXZlcnMvbmV0L3BjbWNpYS9vc2l0ZWNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyNmVmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9vc2l0ZWNoLmgKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmaXJtd2FyZSBvZiBTZXZlbiBvZiBEaWFtb25kcyBmcm9tIE9TSVRFQ0guCisgICAgKFNwZWNpYWwgdGhhbmtzIHRvIEtldmluIE1hY1BoZXJzb24gb2YgT1NJVEVDSCkKKworICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorKi8KKworICAgIHN0YXRpYyBjb25zdCB1X2NoYXIgX19YaWxpbng3T0RbXSA9IHsKKyAgICAweEZGLCAweDA0LCAweEEwLCAweDM2LCAweEYzLCAweEVDLCAweEZGLCAweEZGLCAweEZGLCAweERGLCAweEZCLCAweEZGLAorICAgIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RUYsIDB4M0YsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4N0YsIDB4RkUsIDB4RkYsCisgICAgMHhDRSwgMHhGRSwgMHhGRSwgMHhGRSwgCisgICAgMHhGRSwgMHhERSwgMHhCRCwgMHhERCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhDRiwgMHhGNywgMHhCRiwgMHg3RiwgMHhGRiwKKyAgICAweDdGLCAweDNGLCAweEZFLCAweEJGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEJDLCAweEZGLCAweEZGLCAweEJELCAweEI1LCAweDdGLCAweDdGLCAweEJGLCAweEJGLAorICAgIDB4N0YsIDB4RkYsIDB4RUYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RjcsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4REUsCisgICAgMHhGRSwgMHhGRSwgMHhGQSwgMHhERSwgCisgICAgMHhCRCwgMHhGRCwgMHhFRCwgMHhGRCwgMHhGRCwgMHhDRiwgMHhFRiwgMHhFRiwgMHhFRiwgMHhFRiwgMHhDNywgMHhERiwKKyAgICAweERGLCAweERGLCAweERGLCAweERGLCAKKyAgICAweEZGLCAweDdFLCAweEZFLCAweEZELCAweDdELCAweDZELCAweEVFLCAweEZFLCAweDdDLCAweEZCLCAweEY0LCAweEZCLAorICAgIDB4Q0YsIDB4REIsIDB4REYsIDB4RkYsIAorICAgIDB4RkYsIDB4QkIsIDB4N0YsIDB4RkYsIDB4N0YsIDB4RkYsIDB4RjcsIDB4RkYsIDB4OUUsIDB4QkYsIDB4M0IsIDB4QkYsCisgICAgMHhCRiwgMHg3RiwgMHg3RiwgMHg3RiwgCisgICAgMHg3RSwgMHg2RiwgMHhERiwgMHhFRiwgMHhGNSwgMHhGNiwgMHhGRCwgMHhGNiwgMHhGNSwgMHhFRCwgMHhFQiwgMHhGRiwKKyAgICAweEVGLCAweEVGLCAweEVGLCAweDdFLCAKKyAgICAweDdGLCAweDdGLCAweDZGLCAweDdGLCAweEZGLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEVGLCAweEJGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkMsIDB4MUYsIDB4MUYsIDB4RUUsIDB4RkYsIDB4QkMsCisgICAgMHhCNywgMHhGRiwgMHhERiwgMHhGRiwgCisgICAgMHhERiwgMHhFRiwgMHgzQiwgMHhFMywgMHhEMywgMHhGRiwgMHhGQiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEJBLCAweEJGLCAweDJELCAKKyAgICAweERCLCAweEJELCAweEZELCAweERCLCAweERGLCAweEZBLCAweEZCLCAweEZGLCAweEVGLCAweEZCLCAweERCLCAweEYzLAorICAgIDB4RkYsIDB4REYsIDB4RkQsIDB4N0YsIAorICAgIDB4RUYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4QkUsIDB4QkYsIDB4MjcsIDB4QkEsIDB4RkUsIDB4RkIsIDB4REYsIDB4RkYsCisgICAgMHhGNiwgMHhGRiwgMHhGRiwgMHhFRiwgCisgICAgMHhGQiwgMHhEQiwgMHhGMywgMHhEOSwgMHg5QSwgMHgzRiwgMHhGRiwgMHhBRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhCRSwKKyAgICAweDNGLCAweDM3LCAweEJELCAweDk2LCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFFLCAweEZCLCAweEYzLCAweEYzLCAweEVCLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RjcsIDB4RkEsIDB4QkMsIDB4QUUsIDB4RkUsIDB4QkUsIDB4RkUsIDB4QkIsIDB4N0YsIDB4RkQsIDB4RkYsCisgICAgMHg3RiwgMHhFRiwgMHhGNywgMHhGQiwgCisgICAgMHhCQiwgMHhENywgMHhGNywgMHg3RiwgMHhGRiwgMHhGNywgMHhGRiwgMHhGRiwgMHhGNywgMHhCQywgMHhFRCwgMHhGRCwKKyAgICAweEJELCAweDlELCAweDdELCAweDdCLCAKKyAgICAweEZCLCAweDdCLCAweDdCLCAweEZCLCAweEFGLCAweEZGLCAweEZFLCAweEZELCAweEZELCAweEZFLCAweEZFLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIAorICAgIDB4QUEsIDB4QjksIDB4QkYsIDB4OEYsIDB4QkYsIDB4REYsIDB4RkYsIDB4N0YsIDB4RkYsIDB4RkYsIDB4N0YsIDB4Q0YsCisgICAgMHhGQiwgMHhFQiwgMHhDQiwgMHhFQiwgCisgICAgMHhFRSwgMHhGRiwgMHhGRiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHgzRSwgMHgzMywgMHgzRiwgMHgxQywgMHg3QywKKyAgICAweEZDLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweENGLCAweEQzLCAweEYzLCAweEUzLCAweEYzLCAweEZCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RUIsIDB4RkUsIDB4MzUsIAorICAgIDB4M0YsIDB4M0QsIDB4RkQsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RUYsIDB4NkYsIDB4RTMsCisgICAgMHhFMywgMHhFMywgMHhFRiwgMHhGRiwgCisgICAgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGNywgMHhGRSwgMHgzRSwgMHg1RSwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZELCAweEZGLCAweEZGLCAKKyAgICAweEFGLCAweENGLCAweEYyLCAweENCLCAweENGLCAweDhFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZELAorICAgIDB4RkMsIDB4M0UsIDB4MUYsIDB4OUUsIAorICAgIDB4QUQsIDB4RkQsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4QjMsIDB4RjcsIDB4RTcsCisgICAgMHhGNywgMHhGQSwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRSwgMHhFQiwgMHhBQiwgMHhBRiwgMHg5RiwgMHhFMywgMHg3RiwgMHhGRiwgMHhERSwKKyAgICAweEZGLCAweDdGLCAweEVFLCAweEZGLCAKKyAgICAweEZGLCAweEZCLCAweDNBLCAweEZBLCAweEZGLCAweEYyLCAweDc3LCAweEZGLCAweEZGLCAweEY3LCAweEZFLCAweEZGLAorICAgIDB4RkUsIDB4QkQsIDB4QUUsIDB4REUsIAorICAgIDB4N0QsIDB4N0QsIDB4RkQsIDB4RkYsIDB4QkYsIDB4RUUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4REIsIDB4RkIsIDB4RkYsCisgICAgMHhGNywgMHhFRiwgMHhGQiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRSwgMHhGRiwgMHgyRCwgMHhBRiwgMHhCOSwgMHhGRCwgMHg3OSwgMHhGQiwgMHhGQSwgMHhGRiwgMHhCRiwKKyAgICAweEVGLCAweEZGLCAweEZGLCAweDkxLCAKKyAgICAweEZBLCAweEZCLCAweERGLCAweEY3LCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZDLCAweENGLCAweDM3LCAweEJGLAorICAgIDB4QkYsIDB4RkYsIDB4N0YsIDB4N0YsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RjMsIDB4RkIsIDB4RkIsIDB4RkYsIDB4RjUsIDB4RUYsCisgICAgMHhGRiwgMHhGRiwgMHhGNywgMHhGQSwgCisgICAgMHhGRiwgMHhGRiwgMHhFRSwgMHhGQSwgMHhGRSwgMHhGQiwgMHg1NSwgMHhERCwgMHhGRiwgMHg3RiwgMHhBRiwgMHhGRSwKKyAgICAweEZGLCAweEZCLCAweEZCLCAweEY1LCAKKyAgICAweEZGLCAweEY3LCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEJFLCAweEJELCAweEJELCAweEJELCAweEJELCAweDdELAorICAgIDB4N0IsIDB4N0IsIDB4N0IsIDB4N0IsIAorICAgIDB4RkIsIDB4QUUsIDB4RkYsIDB4RkQsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGNywgMHhEQSwgMHhCNywgMHg2MSwgCisgICAgMHhGRiwgMHhCOSwgMHg1OSwgMHhGMywgMHg3MywgMHhGMywgMHhERiwgMHg3RiwgMHg2RiwgMHhERiwgMHhFRiwgMHhGNywKKyAgICAweEVCLCAweEVCLCAweEQ3LCAweEZGLCAKKyAgICAweEQ3LCAweEZGLCAweEZGLCAweEY3LCAweEZFLCAweDdGLCAweEZCLCAweDNFLCAweDM4LCAweDczLCAweEY2LCAweDdGLAorICAgIDB4RkMsIDB4RkYsIDB4RkYsIDB4Q0YsIAorICAgIDB4RkYsIDB4QjcsIDB4RkIsIDB4QjMsIDB4QjMsIDB4NjcsIDB4RkYsIDB4RTcsIDB4RkQsIDB4RkYsIDB4RUYsIDB4RjYsCisgICAgMHg3RiwgMHhCNywgMHhCQywgMHhGNSwgCisgICAgMHg3QiwgMHhGNiwgMHhGNywgMHhGNSwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGNywgMHhGRiwgMHhGNywgMHhDRSwKKyAgICAweEU3LCAweEZGLCAweDlGLCAweEZGLCAKKyAgICAweEZGLCAweEY1LCAweEZFLCAweDdELCAweEZGLCAweDVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RUYsIDB4RkYsIDB4RjYsIAorICAgIDB4Q0IsIDB4REIsIDB4RUUsIDB4RkUsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4N0YsIDB4QkUsCisgICAgMHgxRSwgMHgzRSwgMHhGRSwgMHhGRiwgCisgICAgMHg3RCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhFRiwgMHhCRiwgMHhFNywgMHhGRiwgMHhFMywgMHhFMywgMHhGRiwgMHhERiwKKyAgICAweEU3LCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEI4LCAweEVGLCAweEI3LCAweDJGLCAweEVFLCAweEZGLCAweERGLCAweEZGLCAweEJGLCAweEZGLCAweDdGLCAweEVGLAorICAgIDB4RUIsIDB4QkYsIDB4QTMsIDB4RDMsIAorICAgIDB4RkYsIDB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4QkUsIDB4RkQsIDB4M0YsIDB4Q0YsIDB4RkQsCisgICAgMHhGQiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhBRiwgMHhGQiwgMHhCRiwgMHhCQiwgMHhCRiwgMHhEQiwgMHhGRCwgMHhGQiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweDNFLCAweEZFLCAKKyAgICAweDNGLCAweEJBLCAweEJBLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEVGLCAweEMzLCAweDdGLAorICAgIDB4QjIsIDB4OUIsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4M0MsIDB4RkYsIDB4M0YsIDB4M0MsIDB4RkYsIDB4RkUsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhBRiwgMHhGMywgMHhGRSwgMHhGMywgMHhFMywgMHhFQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQiwgMHhGRiwgMHhGNywKKyAgICAweDlBLCAweEZFLCAweEFGLCAweDlFLCAKKyAgICAweEJFLCAweEZFLCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweDdCLCAweEVGLCAweEY3LCAweEJGLCAweEZCLCAweEZCLAorICAgIDB4RkIsIDB4RkYsIDB4RkYsIDB4N0YsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkMsIDB4QkQsIDB4RkQsIDB4QkQsIDB4REQsIDB4N0QsIDB4N0IsIDB4N0IsIDB4N0IsCisgICAgMHg3QiwgMHhGQiwgMHhBRSwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRSwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHg5QSwgMHhGRiwKKyAgICAweDlGLCAweEZGLCAweEFGLCAweEVGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweENGLCAweEYzLCAweEZGLCAweEVCLCAweEZGLCAweEVCLCAweEZGLAorICAgIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RUYsIDB4RkUsIDB4RkYsIDB4MzcsIDB4RkMsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhDRiwgMHhFRiwgMHhGRCwgMHhGMywgCisgICAgMHhGRiwgMHhFRSwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2RSwgMHhGRCwgMHgyRiwgMHhGRCwKKyAgICAweEZGLCAweEZELCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweENGLCAweEZGLCAweEYzLCAweEJGLCAweDY5LCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIAorICAgIDB4RkIsIDB4OUYsIDB4RkYsIDB4QkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4ODcsCisgICAgMHhGRSwgMHhEQSwgMHhFRiwgMHhDRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhFRiwgMHhCRiwgMHhFRiwgMHhFRiwgMHhGRCwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEVGLCAweEZELCAweEZGLCAweDdCLCAweEZGLCAweEVCLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RUIsIDB4RjgsIDB4RkYsIDB4RUYsIAorICAgIDB4QUYsIDB4RkYsIDB4RkYsIDB4QkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RUUsIDB4N0YsIDB4RUYsIDB4RkYsCisgICAgMHhCQiwgMHhGRiwgMHhCRiwgMHhGQiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHhGNiwgMHhGQiwgMHhCRCwgMHhGRCwgMHhERCwgMHhGNSwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEFGLCAKKyAgICAweEZGLCAweDVGLCAweEY1LCAweERGLCAweEZGLCAweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY2LAorICAgIDB4RjMsIDB4RkYsIDB4REUsIDB4RkUsIAorICAgIDB4RUYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4REUsIDB4REYsIDB4NUYsIDB4REYsCisgICAgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRSwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEFGLCAweEZGLCAweEZGLCAKKyAgICAweEVGLCAweEVELCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweEZCLCAweEZGLCAweEZGLCAweERBLCAweEJELCAweEJFLAorICAgIDB4QUUsIDB4RkUsIDB4N0YsIDB4RkQsIAorICAgIDB4REYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RUYsIDB4RkYsIDB4RkIsIDB4RkIsIDB4RkIsIDB4N0YsIDB4RjcsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgCisgICAgMHhCQywgMHhGRCwgMHhCRCwgMHhCRCwgMHhCRCwgMHhGRCwgMHg3QiwgMHg3QiwgMHg3QiwgMHg3QiwgMHhGQiwgMHhBRSwKKyAgICAweEZGLCAweEZGLCAweEZELCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZBLCAweDlGLCAweEJGLCAweEJGLCAweENGLAorICAgIDB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4QUYsIDB4RkYsIDB4RUIsIDB4RUIsIDB4RUIsIDB4RkYsIDB4RDcsIDB4RkUsIDB4RkYsIDB4RkYsCisgICAgMHhCRiwgMHhFNywgMHhGRSwgMHhCRiwgCisgICAgMHg3RiwgMHhGQywgMHhGRiwgMHhGRiwgMHhFRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg0RiwgMHhGRiwgMHhGQiwKKyAgICAweEZCLCAweEZGLCAweEZGLCAweERELCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEJELCAweERGLCAweDlELCAweEZELCAweERGLCAweEI5LAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RUYsIDB4RkYsIDB4RkIsIDB4RUYsIDB4RUIsIDB4RkYsIDB4REUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGNiwgMHg5RiwgMHhGRiwgMHhGQywgCisgICAgMHhGRSwgMHhGQiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhERiwgMHhGQSwgMHhDRCwgMHhDRiwKKyAgICAweEJGLCAweDlGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEY3LCAweEZFLCAweEJGLCAweEZGLCAweERGLCAweEVGLCAweDVGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4N0YsIDB4NkYsIDB4RkYsIAorICAgIDB4QkIsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0UsIDB4RkYsCisgICAgMHg1RiwgMHhGRiwgMHhCRiwgMHhCRiwgCisgICAgMHhGOSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHg2RSwgMHg3QiwgMHhGRiwgMHhFRiwgMHhGRCwgMHhFQiwgMHhERiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEY3LCAweEI2LCAweDNFLCAweEZDLCAweEZELCAweEJGLCAweDdFLCAweEZCLCAweEZGLCAweEZGLCAweEZGLCAweEY3LAorICAgIDB4RUYsIDB4RjcsIDB4RjMsIDB4RjcsIAorICAgIDB4RkYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkUsIDB4MzUsIDB4NzksIDB4RkYsCisgICAgMHhCRiwgMHhGQywgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGQiwgMHg1MywgMHhERiwgMHhGRiwgMHhFQiwgMHhCRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEJDLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFGLCAweEY1LAorICAgIDB4RkYsIDB4RjcsIDB4RkYsIDB4RkIsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkEsIDB4QUEsIDB4RUUsIDB4RkUsIDB4M0YsIDB4N0QsCisgICAgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHg3RiwgMHhBRiwgMHg3NywgMHhGQiwgMHhGQiwgMHhGRiwgMHhGQiwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEY3LCAweEJFLCAweEJELCAweEJELCAKKyAgICAweEJELCAweEJELCAweEZELCAweDdCLCAweDdCLCAweDdCLCAweDdCLCAweEZCLCAweEFFLCAweEZGLCAweEVGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OUEsIDB4RDksIDB4QjgsIDB4RkYsIDB4RkYsIDB4NzksIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgCisgICAgMHhGQiwgMHhGRiwgMHhFQiwgMHhGRiwgMHhFQiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFNywgMHhERSwKKyAgICAweEY4LCAweEZCLCAweEZFLCAweDNGLCAKKyAgICAweEZCLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENGLCAweEFELCAweEJGLCAweEZBLCAweEZGLCAweDczLAorICAgIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4M0EsIDB4RjUsIDB4QjcsIDB4RkMsIDB4M0YsIDB4RjksIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHg3RiwgMHhFRiwgMHhGMywgMHhGRiwgCisgICAgMHhCRiwgMHhGRSwgMHhGMywgMHg5RiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHgzRSwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEJGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFGLCAweEQzLCAweEZFLCAweERCLCAweEZGLCAweERCLCAweERGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4M0UsIDB4RkYsIDB4QkYsIDB4RkYsIDB4N0YsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OEYsCisgICAgMHhGMywgMHhGRiwgMHhFRCwgMHhGRiwgCisgICAgMHhGNywgMHhGQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGNiwgMHgzQywgMHhGRSwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweDlGLCAweEVGLCAweEVGLCAweEQxLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4N0UsIDB4QkYsIAorICAgIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkIsIDB4RUYsIDB4REYsIDB4RjEsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRSwgMHgzRSwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEJGLCAKKyAgICAweEVGLCAweEZELCAweEMzLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEJGLCAweEZGLAorICAgIDB4RkMsIDB4M0UsIDB4RkUsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkUsIDB4RUYsIDB4RjMsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGNywgMHhCQSwgMHhCRSwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweDdGLCAweEFGLCAweEZCLCAKKyAgICAweEZCLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEYyLCAweEQ2LCAweEVELAorICAgIDB4QkQsIDB4QkQsIDB4QkQsIDB4N0QsIAorICAgIDB4N0IsIDB4N0IsIDB4N0IsIDB4N0IsIDB4RkIsIDB4QUYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHg5MiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwKKyAgICAweEFGLCAweEVCLCAweEVCLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEU3LCAweEZFLCAweDJFLCAweEZFLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4NEYsIDB4RUYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgCisgICAgMHgzQywgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhDRSwKKyAgICAweEMzLCAweEZELCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweDVELCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RUYsIDB4Q0YsIDB4RUIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGNywgMHhFRSwgMHgzRSwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhFRiwgMHhERiwgMHhFMiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZCLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY2LCAweEJFLCAweEZDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4N0YsIDB4RUUsIAorICAgIDB4NUYsIDB4RTYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0UsCisgICAgMHg3RCwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGMywgMHhGQiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEJGLCAweEY3LCAweDM2LCAweEJFLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RUYsIDB4RDMsIDB4RjYsIAorICAgIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4N0YsIDB4RUUsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHhFRiwgMHhFQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEJBLCAweEJFLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVFLAorICAgIDB4RkIsIDB4RkEsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RDYsIDB4RkQsIDB4QkQsIDB4QkQsIDB4QkQsCisgICAgMHg3RCwgMHg3QiwgMHg3QiwgMHg3QiwgCisgICAgMHg3QiwgMHhGQiwgMHhBRSwgMHhGRiwgMHg3RSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEY3LCAweEJBLCAweEJGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweEVGLCAweEVCLCAweDZCLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkUsIDB4QkUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHg0RiwgMHhFRiwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwKKyAgICAweDNFLCAweDZFLCAweEZDLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEMzLCAweEM5LCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0UsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhFRiwgMHhGQiwgCisgICAgMHhENSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRSwKKyAgICAweEZFLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDZGLCAweEVGLCAweEZCLCAweEZGLCAweEZGLCAweEZGLCAweEZCLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RjYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RkUsCisgICAgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFNywgMHhGRiwgMHhGRSwgMHhGRiwgMHhGNywgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweDdGLCAweEZBLCAweEVGLCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RTcsIDB4RkYsIDB4RkUsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RkUsIDB4RUYsIDB4QkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBNywgMHhGRiwgMHhGQywgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweDdGLCAKKyAgICAweEZFLCAweEFFLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEU3LAorICAgIDB4RjcsIDB4RkEsIDB4RkYsIDB4RkQsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QUYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHhCRSwgMHhCRCwgMHhCRCwgMHhCRCwgMHhCRCwgMHg3RCwgMHg3QiwgMHg3QiwKKyAgICAweDdCLCAweDdCLCAweEZCLCAweEFGLCAKKyAgICAweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENBLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhFNywgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweENGLCAweEZFLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweERGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhFNywgMHhGMiwgMHhGQywgCisgICAgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhBRSwgMHhFRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweDdFLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RUYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsCisgICAgMHhGRSwgMHhGRSwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhFRiwgMHhERCwgMHhGRSwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4QUYsIDB4RUYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkEsIDB4RkUsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGQSwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEY2LCAweDlDLCAweEJELCAweEJELCAweEJELCAweEJELCAweDdELCAweDdCLCAweDdCLCAweDdCLCAweDdCLCAweEZCLAorICAgIDB4QUUsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4N0EsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHg2RiwgMHhFRiwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEY3LCAweEZFLCAKKyAgICAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweENGLCAweEVCLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4OUUsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhFRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZFLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweEVGLCAweENCLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgCisgICAgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOCwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGQiwgMHhBRiwgMHg3RiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhFRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIAorICAgIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUUsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHhGQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweDdGLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RjcsIDB4QkMsIDB4QkQsIAorICAgIDB4QkQsIDB4QkQsIDB4QkQsIDB4N0QsIDB4N0IsIDB4N0IsIDB4N0IsIDB4N0IsIDB4RkIsIDB4QUYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHhGQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweDdGLCAKKyAgICAweEFGLCAweDdGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLAorICAgIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEVGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEVGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZFLCAweEZGLCAweDlGLCAweDlGLAorICAgIDB4OUYsIDB4M0YsIDB4M0YsIDB4M0YsIAorICAgIDB4M0YsIDB4M0YsIDB4RkYsIDB4RUYsIDB4REYsIDB4REYsIDB4REYsIDB4REYsIDB4Q0YsIDB4QjcsIDB4QkYsIDB4QkYsCisgICAgMHhCRiwgMHhCRiwgMHhGRiwgMHhCQywgCisgICAgMHhCOSwgMHg5RCwgMHhCRCwgMHhCRCwgMHg3RCwgMHg3QiwgMHg3QiwgMHg3QiwgMHg3QiwgMHhGQiwgMHhFRiwgMHhENywKKyAgICAweEY1LCAweEYzLCAweEYxLCAweEQxLCAKKyAgICAweDY1LCAweEUzLCAweEUzLCAweEUzLCAweEEzLCAweEZGLCAweEZFLCAweDdGLCAweEZFLCAweERFLCAweERFLCAweEZGLAorICAgIDB4QkQsIDB4QkQsIDB4QkQsIDB4QkQsIAorICAgIDB4REYsIDB4RUYsIDB4RkIsIDB4RjcsIDB4RjMsIDB4RjMsIDB4RjMsIDB4RTcsIDB4RTcsIDB4RTcsIDB4RTcsIDB4RTcsCisgICAgMHhGQiwgMHhGRSwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRgorICAgIAorICAgIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvcGNuZXRfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTI2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY21jaWEvcGNuZXRfY3MuYwpAQCAtMCwwICsxLDE2NTkgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQSBQQ01DSUEgZXRoZXJuZXQgZHJpdmVyIGZvciBOUzgzOTAtYmFzZWQgY2FyZHMKKworICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBELUxpbmsgREUtNjUwIGFuZCBMaW5rc3lzIEV0aGVybmV0Q2FyZAorICAgIGNhcmRzLCB0aGUgbmV3ZXIgRC1MaW5rIGFuZCBMaW5rc3lzIGNvbWJvIGNhcmRzLCBBY2N0b24gRU4yMjEyCisgICAgY2FyZHMsIHRoZSBSUFRJIEVQNDAwLCBhbmQgdGhlIFByZU1heCBQRS0yMDAgaW4gbm9uLXNoYXJlZC1tZW1vcnkKKyAgICBtb2RlLCBhbmQgdGhlIElCTSBDcmVkaXQgQ2FyZCBBZGFwdGVyLCB0aGUgTkU0MTAwLCB0aGUgVGhvbWFzCisgICAgQ29ucmFkIGV0aGVybmV0IGNhcmQsIGFuZCB0aGUgS2luZ3N0b24gS05FLVBDTS94IGluIHNoYXJlZC1tZW1vcnkKKyAgICBtb2RlLiAgSXQgd2lsbCBhbHNvIGhhbmRsZSB0aGUgU29ja2V0IEVBIGNhcmQgaW4gZWl0aGVyIG1vZGUuCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gSGluZHMgLS0gZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKKworICAgIHBjbmV0X2NzLmMgMS4xNTMgMjAwMy8xMS8wOSAxODo1MzowOQorICAgIAorICAgIFRoZSBuZXR3b3JrIGRyaXZlciBjb2RlIGlzIGJhc2VkIG9uIERvbmFsZCBCZWNrZXIncyBORTIwMDAgY29kZToKKworICAgIFdyaXR0ZW4gMTk5MiwxOTkzIGJ5IERvbmFsZCBCZWNrZXIuCisgICAgQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZAorICAgIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAgIERvbmFsZCBCZWNrZXIgbWF5IGJlIHJlYWNoZWQgYXQgYmVja2VyQHNjeWxkLmNvbQorCisgICAgQmFzZWQgYWxzbyBvbiBLZWl0aCBNb29yZSdzIGNoYW5nZXMgdG8gRG9uIEJlY2tlcidzIGNvZGUsIGZvciBJQk0KKyAgICBDQ0FFIHN1cHBvcnQuICBEcml2ZXJzIG1lcmdlZCBiYWNrIHRvZ2V0aGVyLCBhbmQgc2hhcmVkLW1lbW9yeQorICAgIFNvY2tldCBFQSBzdXBwb3J0IGFkZGVkLCBieSBLZW4gUmFlYnVybiwgU2VwdGVtYmVyIDE5OTUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPC4uL2RyaXZlcnMvbmV0LzgzOTAuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIFBDTkVUX0NNRAkweDAwCisjZGVmaW5lIFBDTkVUX0RBVEFQT1JUCTB4MTAJLyogTmF0U2VtaS1kZWZpbmVkIHBvcnQgd2luZG93IG9mZnNldC4gKi8KKyNkZWZpbmUgUENORVRfUkVTRVQJMHgxZgkvKiBJc3N1ZSBhIHJlYWQgdG8gcmVzZXQsIGEgd3JpdGUgdG8gY2xlYXIuICovCisjZGVmaW5lIFBDTkVUX01JU0MJMHgxOAkvKiBGb3IgSUJNIENDQUUgYW5kIFNvY2tldCBFQSBjYXJkcyAqLworCisjZGVmaW5lIFBDTkVUX1NUQVJUX1BHCTB4NDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgUENORVRfU1RPUF9QRwkweDgwCS8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nICovCisKKy8qIFNvY2tldCBFQSBjYXJkcyBoYXZlIGEgbGFyZ2VyIHBhY2tldCBidWZmZXIgKi8KKyNkZWZpbmUgU09DS0VUX1NUQVJUX1BHCTB4MDEKKyNkZWZpbmUgU09DS0VUX1NUT1BfUEcJMHhmZgorCisjZGVmaW5lIFBDTkVUX1JEQ19USU1FT1VUICgyKkhaLzEwMCkJLyogTWF4IHdhaXQgaW4gamlmZmllcyBmb3IgVHggUkRDICovCisKK3N0YXRpYyBjaGFyICppZl9uYW1lc1tdID0geyAiYXV0byIsICIxMGJhc2VUIiwgIjEwYmFzZTIifTsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIGludCBwY19kZWJ1ZyA9IFBDTUNJQV9ERUJVRzsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwKTsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0KKyJwY25ldF9jcy5jIDEuMTUzIDIwMDMvMTEvMDkgMTg6NTM6MDkgKERhdmlkIEhpbmRzKSI7CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBIaW5kcyA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5FMjAwMCBjb21wYXRpYmxlIFBDTUNJQSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBJTlRfTU9EVUxFX1BBUk0obiwgdikgc3RhdGljIGludCBuID0gdjsgbW9kdWxlX3BhcmFtKG4sIGludCwgMCkKKworSU5UX01PRFVMRV9QQVJNKGlmX3BvcnQsCTEpOwkvKiBUcmFuc2NlaXZlciB0eXBlICovCitJTlRfTU9EVUxFX1BBUk0odXNlX2JpZ19idWYsCTEpOwkvKiB1c2UgNjRLIHBhY2tldCBidWZmZXI/ICovCitJTlRfTU9EVUxFX1BBUk0obWVtX3NwZWVkLAkwKTsJLyogc2hhcmVkIG1lbSBzcGVlZCwgaW4gbnMgKi8KK0lOVF9NT0RVTEVfUEFSTShkZWxheV9vdXRwdXQsCTApOwkvKiBwYXVzZSBhZnRlciB4bWl0PyAqLworSU5UX01PRFVMRV9QQVJNKGRlbGF5X3RpbWUsCTQpOwkvKiBpbiB1c2VjICovCitJTlRfTU9EVUxFX1BBUk0odXNlX3NobWVtLAktMSk7CS8qIHVzZSBzaGFyZWQgbWVtb3J5PyAqLworSU5UX01PRFVMRV9QQVJNKGZ1bGxfZHVwbGV4LAkwKTsJLyogZnVsbCBkdXBsZXg/ICovCisKKy8qIFVnaCEgIExldCB0aGUgdXNlciBoYXJkd2lyZSB0aGUgaGFyZHdhcmUgYWRkcmVzcyBmb3IgcXVlZXIgY2FyZHMgKi8KK3N0YXRpYyBpbnQgaHdfYWRkcls2XSA9IHsgMCwgLyogLi4uICovIH07Cittb2R1bGVfcGFyYW1fYXJyYXkoaHdfYWRkciwgaW50LCBOVUxMLCAwKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIG1paV9waHlfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBwY25ldF9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCBwY25ldF9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCBwY25ldF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCSAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworc3RhdGljIGludCBwY25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBwY25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZWlfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKK3N0YXRpYyBpcnFyZXR1cm5fdCBlaV9pcnFfd3JhcHBlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGVpX3dhdGNoZG9nKHVfbG9uZyBhcmcpOworc3RhdGljIHZvaWQgcGNuZXRfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2V0X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCk7CitzdGF0aWMgaW50IHNldHVwX3NobWVtX3dpbmRvdyhkZXZfbGlua190ICpsaW5rLCBpbnQgc3RhcnRfcGcsCisJCQkgICAgICBpbnQgc3RvcF9wZywgaW50IGNtX29mZnNldCk7CitzdGF0aWMgaW50IHNldHVwX2RtYV9jb25maWcoZGV2X2xpbmtfdCAqbGluaywgaW50IHN0YXJ0X3BnLAorCQkJICAgIGludCBzdG9wX3BnKTsKKworc3RhdGljIGRldl9saW5rX3QgKnBjbmV0X2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIHBjbmV0X2RldGFjaChkZXZfbGlua190ICopOworCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJwY25ldF9jcyI7CitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCBod19pbmZvX3QgeworICAgIHVfaW50CW9mZnNldDsKKyAgICB1X2NoYXIJYTAsIGExLCBhMjsKKyAgICB1X2ludAlmbGFnczsKK30gaHdfaW5mb190OworCisjZGVmaW5lIERFTEFZX09VVFBVVAkweDAxCisjZGVmaW5lIEhBU19NSVNDX1JFRwkweDAyCisjZGVmaW5lIFVTRV9CSUdfQlVGCTB4MDQKKyNkZWZpbmUgSEFTX0lCTV9NSVNDCTB4MDgKKyNkZWZpbmUgSVNfREwxMDAxOQkweDEwCisjZGVmaW5lIElTX0RMMTAwMjIJMHgyMAorI2RlZmluZSBIQVNfTUlJCQkweDQwCisjZGVmaW5lIFVTRV9TSE1FTQkweDgwCS8qIGF1dG9kZXRlY3RlZCAqLworCisjZGVmaW5lIEFNNzlDOVhYX0hPTUVfUEhZCTB4MDAwMDZCOTAgIC8qIEhvbWVQTkEgUEhZICovCisjZGVmaW5lIEFNNzlDOVhYX0VUSF9QSFkJMHgwMDAwNkI3MCAgLyogMTBiYXNlVCBQSFkgKi8KKyNkZWZpbmUgTUlJX1BIWUlEX1JFVl9NQVNLCTB4ZmZmZmZmZjAKKyNkZWZpbmUgTUlJX1BIWUlEX1JFRzEJCTB4MDIKKyNkZWZpbmUgTUlJX1BIWUlEX1JFRzIJCTB4MDMKKworc3RhdGljIGh3X2luZm9fdCBod19pbmZvW10gPSB7CisgICAgeyAvKiBBY2N0b24gRU4yMjEyICovIDB4MGZmMCwgMHgwMCwgMHgwMCwgMHhlOCwgREVMQVlfT1VUUFVUIH0sIAorICAgIHsgLyogQWxsaWVkIFRlbGVzaXMgTEEtUENNICovIDB4MGZmMCwgMHgwMCwgMHgwMCwgMHhmNCwgMCB9LAorICAgIHsgLyogQVBFWCBNdWx0aUNhcmQgKi8gMHgwM2Y0LCAweDAwLCAweDIwLCAweGU1LCAwIH0sCisgICAgeyAvKiBBU0FOVEUgRnJpZW5kbHlOZXQgKi8gMHg0OTEwLCAweDAwLCAweDAwLCAweDk0LAorICAgICAgREVMQVlfT1VUUFVUIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBEYW5wZXggRU4tNjIwMFAyICovIDB4MDExMCwgMHgwMCwgMHg0MCwgMHhjNywgMCB9LAorICAgIHsgLyogRGF0YVRyZWsgTmV0Q2FyZCAqLyAweDBmZjAsIDB4MDAsIDB4MjAsIDB4ZTgsIDAgfSwKKyAgICB7IC8qIERheW5hIENvbW11bmlDYXJkIEUgKi8gMHgwMTEwLCAweDAwLCAweDgwLCAweDE5LCAwIH0sCisgICAgeyAvKiBELUxpbmsgREUtNjUwICovIDB4MDA0MCwgMHgwMCwgMHg4MCwgMHhjOCwgMCB9LAorICAgIHsgLyogRVAtMjEwIEV0aGVybmV0ICovIDB4MDExMCwgMHgwMCwgMHg0MCwgMHgzMywgMCB9LAorICAgIHsgLyogRVA0MDAwIEV0aGVybmV0ICovIDB4MDFjMCwgMHgwMCwgMHgwMCwgMHhiNCwgMCB9LAorICAgIHsgLyogRXBzb24gRUVOMTBCICovIDB4MGZmMCwgMHgwMCwgMHgwMCwgMHg0OCwKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogRUxFQ09NIExhbmVlZCBMRC1DRFdBICovIDB4YjgsIDB4MDgsIDB4MDAsIDB4NDIsIDAgfSwKKyAgICB7IC8qIEh5cGVydGVjIEV0aGVybmV0ICovIDB4MDFjMCwgMHgwMCwgMHg0MCwgMHg0YywgMCB9LAorICAgIHsgLyogSUJNIENDQUUgKi8gMHgwZmYwLCAweDA4LCAweDAwLCAweDVhLAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBJQk0gQ0NBRSAqLyAweDBmZjAsIDB4MDAsIDB4MDQsIDB4YWMsCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIElCTSBDQ0FFICovIDB4MGZmMCwgMHgwMCwgMHgwNiwgMHgyOSwKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogSUJNIEZNRSAqLyAweDAzNzQsIDB4MDgsIDB4MDAsIDB4NWEsCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIElCTSBGTUUgKi8gMHgwMzc0LCAweDAwLCAweDA0LCAweGFjLAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBLYW5zYWkgS0xBLVBDTS9UICovIDB4MGZmMCwgMHgwMCwgMHg2MCwgMHg4NywKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogTlNDIERQODM5MDMgKi8gMHgwMzc0LCAweDA4LCAweDAwLCAweDE3LAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBOU0MgRFA4MzkwMyAqLyAweDAzNzQsIDB4MDAsIDB4YzAsIDB4YTgsCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIE5TQyBEUDgzOTAzICovIDB4MDM3NCwgMHgwMCwgMHhhMCwgMHhiMCwKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogTlNDIERQODM5MDMgKi8gMHgwMTk4LCAweDAwLCAweDIwLCAweGUwLAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBJLU8gREFUQSBQQ0xBL1QgKi8gMHgwZmYwLCAweDAwLCAweGEwLCAweGIwLCAwIH0sCisgICAgeyAvKiBLYXRyb24gUEUtNTIwICovIDB4MDExMCwgMHgwMCwgMHg0MCwgMHhmNiwgMCB9LAorICAgIHsgLyogS2luZ3N0b24gS05FLVBDTS94ICovIDB4MGZmMCwgMHgwMCwgMHhjMCwgMHhmMCwKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogS2luZ3N0b24gS05FLVBDTS94ICovIDB4MGZmMCwgMHhlMiwgMHgwYywgMHgwZiwKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogS2luZ3N0b24gS05FLVBDMiAqLyAweDAxODAsIDB4MDAsIDB4YzAsIDB4ZjAsIDAgfSwKKyAgICB7IC8qIE1heHRlY2ggUENOMjAwMCAqLyAweDUwMDAsIDB4MDAsIDB4MDAsIDB4ZTgsIDAgfSwKKyAgICB7IC8qIE5EQyBJbnN0YW50LUxpbmsgKi8gMHgwMDNhLCAweDAwLCAweDgwLCAweGM2LCAwIH0sCisgICAgeyAvKiBORTIwMDAgQ29tcGF0aWJsZSAqLyAweDBmZjAsIDB4MDAsIDB4YTAsIDB4MGMsIDAgfSwKKyAgICB7IC8qIE5ldHdvcmsgR2VuZXJhbCBTbmlmZmVyICovIDB4MGZmMCwgMHgwMCwgMHgwMCwgMHg2NSwKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogUGFuYXNvbmljIFZFTDIxMSAqLyAweDBmZjAsIDB4MDAsIDB4ODAsIDB4NDUsIAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBQcmVNYXggUEUtMjAwICovIDB4MDdmMCwgMHgwMCwgMHgyMCwgMHhlMCwgMCB9LAorICAgIHsgLyogUlBUSSBFUDQwMCAqLyAweDAxMTAsIDB4MDAsIDB4NDAsIDB4OTUsIDAgfSwKKyAgICB7IC8qIFNDTSBFdGhlcm5ldCAqLyAweDBmZjAsIDB4MDAsIDB4MjAsIDB4Y2IsIDAgfSwKKyAgICB7IC8qIFNvY2tldCBFQSAqLyAweDQwMDAsIDB4MDAsIDB4YzAsIDB4MWIsCisgICAgICBERUxBWV9PVVRQVVQgfCBIQVNfTUlTQ19SRUcgfCBVU0VfQklHX0JVRiB9LAorICAgIHsgLyogU29ja2V0IExQLUUgQ0YrICovIDB4MDFjMCwgMHgwMCwgMHhjMCwgMHgxYiwgMCB9LAorICAgIHsgLyogU3VwZXJTb2NrZXQgUkU0NTBUICovIDB4MDExMCwgMHgwMCwgMHhlMCwgMHg5OCwgMCB9LAorICAgIHsgLyogVm9sa3RlayBOUEwtNDAyQ1QgKi8gMHgwMDYwLCAweDAwLCAweDQwLCAweDA1LCAwIH0sCisgICAgeyAvKiBORUMgUEMtOTgwMU4tSjEyICovIDB4MGZmMCwgMHgwMCwgMHgwMCwgMHg0YywgMCB9LAorICAgIHsgLyogUENNQ0lBIFRlY2hub2xvZ3kgT0VNICovIDB4MDFjOCwgMHgwMCwgMHhhMCwgMHgwYywgMCB9Cit9OworCisjZGVmaW5lIE5SX0lORk8JCShzaXplb2YoaHdfaW5mbykvc2l6ZW9mKGh3X2luZm9fdCkpCisKK3N0YXRpYyBod19pbmZvX3QgZGVmYXVsdF9pbmZvID0geyAwLCAwLCAwLCAwLCAwIH07CitzdGF0aWMgaHdfaW5mb190IGRsMTAwMTlfaW5mbyA9IHsgMCwgMCwgMCwgMCwgSVNfREwxMDAxOXxIQVNfTUlJIH07CitzdGF0aWMgaHdfaW5mb190IGRsMTAwMjJfaW5mbyA9IHsgMCwgMCwgMCwgMCwgSVNfREwxMDAyMnxIQVNfTUlJIH07CisKK3R5cGVkZWYgc3RydWN0IHBjbmV0X2Rldl90IHsKKyAgICBkZXZfbGlua190CQlsaW5rOworICAgIGRldl9ub2RlX3QJCW5vZGU7CisgICAgdV9pbnQJCWZsYWdzOworICAgIHZvaWQJCV9faW9tZW0gKmJhc2U7CisgICAgc3RydWN0IHRpbWVyX2xpc3QJd2F0Y2hkb2c7CisgICAgaW50CQkJc3RhbGUsIGZhc3RfcG9sbDsKKyAgICB1X2NoYXIJCXBoeV9pZDsKKyAgICB1X2NoYXIJCWV0aF9waHksIHBuYV9waHk7CisgICAgdV9zaG9ydAkJbGlua19zdGF0dXM7CisgICAgdV9sb25nCQltaWlfcmVzZXQ7Cit9IHBjbmV0X2Rldl90OworCitzdGF0aWMgaW5saW5lIHBjbmV0X2Rldl90ICpQUklWKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJY2hhciAqcCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIChwY25ldF9kZXZfdCAqKShwICsgc2l6ZW9mKHN0cnVjdCBlaV9kZXZpY2UpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBwY25ldF9hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworICAgIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZAorICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBkZXZfbGlua190ICpwY25ldF9hdHRhY2godm9pZCkKK3sKKyAgICBwY25ldF9kZXZfdCAqaW5mbzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisgICAgaW50IHJldDsKKworICAgIERFQlVHKDAsICJwY25ldF9hdHRhY2goKVxuIik7CisKKyAgICAvKiBDcmVhdGUgbmV3IGV0aGVybmV0IGRldmljZSAqLworICAgIGRldiA9IF9fYWxsb2NfZWlfbmV0ZGV2KHNpemVvZihwY25ldF9kZXZfdCkpOworICAgIGlmICghZGV2KSByZXR1cm4gTlVMTDsKKyAgICBpbmZvID0gUFJJVihkZXYpOworICAgIGxpbmsgPSAmaW5mby0+bGluazsKKyAgICBsaW5rLT5wcml2ID0gZGV2OworCisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisgICAgbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBkZXYtPm9wZW4gPSAmcGNuZXRfb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmcGNuZXRfY2xvc2U7CisgICAgZGV2LT5zZXRfY29uZmlnID0gJnNldF9jb25maWc7CisKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnBjbmV0X2V2ZW50OworICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworICAgIGlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJcGNuZXRfZGV0YWNoKGxpbmspOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBsaW5rOworfSAvKiBwY25ldF9hdHRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGlzIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIi4gIFRoZSBkZXZpY2UgaXMgZGUtcmVnaXN0ZXJlZAorICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YQorICAgIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCisgICAgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbGVhc2VkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgcGNuZXRfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworCisgICAgREVCVUcoMCwgInBjbmV0X2RldGFjaCgweCVwKVxuIiwgbGluayk7CisKKyAgICAvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKyAgICBpZiAoKmxpbmtwID09IE5VTEwpCisJcmV0dXJuOworCisgICAgaWYgKGxpbmstPmRldikKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwlwY25ldF9yZWxlYXNlKGxpbmspOworCisgICAgaWYgKGxpbmstPmhhbmRsZSkKKwlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKworICAgIC8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIGJpdHMgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGZyZWVfbmV0ZGV2KGRldik7Cit9IC8qIHBjbmV0X2RldGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoaXMgcHJvYmVzIGZvciBhIGNhcmQncyBoYXJkd2FyZSBhZGRyZXNzLCBmb3IgY2FyZCB0eXBlcyB0aGF0CisgICAgZW5jb2RlIHRoaXMgaW5mb3JtYXRpb24gaW4gdGhlaXIgQ0lTLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGh3X2luZm9fdCAqZ2V0X2h3aW5mbyhkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHdpbl9yZXFfdCByZXE7CisgICAgbWVtcmVxX3QgbWVtOworICAgIHVfY2hhciBfX2lvbWVtICpiYXNlLCAqdmlydDsKKyAgICBpbnQgaSwgajsKKworICAgIC8qIEFsbG9jYXRlIGEgc21hbGwgbWVtb3J5IHdpbmRvdyAqLworICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOHxXSU5fTUVNT1JZX1RZUEVfQU18V0lOX0VOQUJMRTsKKyAgICByZXEuQmFzZSA9IDA7IHJlcS5TaXplID0gMDsKKyAgICByZXEuQWNjZXNzU3BlZWQgPSAwOworICAgIGkgPSBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbik7CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdFdpbmRvdywgaSk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdmlydCA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKKyAgICBtZW0uUGFnZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IE5SX0lORk87IGkrKykgeworCW1lbS5DYXJkT2Zmc2V0ID0gaHdfaW5mb1tpXS5vZmZzZXQgJiB+KHJlcS5TaXplLTEpOworCXBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWVtKTsKKwliYXNlID0gJnZpcnRbaHdfaW5mb1tpXS5vZmZzZXQgJiAocmVxLlNpemUtMSldOworCWlmICgocmVhZGIoYmFzZSswKSA9PSBod19pbmZvW2ldLmEwKSAmJgorCSAgICAocmVhZGIoYmFzZSsyKSA9PSBod19pbmZvW2ldLmExKSAmJgorCSAgICAocmVhZGIoYmFzZSs0KSA9PSBod19pbmZvW2ldLmEyKSkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpIDwgTlJfSU5GTykgeworCWZvciAoaiA9IDA7IGogPCA2OyBqKyspCisJICAgIGRldi0+ZGV2X2FkZHJbal0gPSByZWFkYihiYXNlICsgKGo8PDEpKTsKKyAgICB9CisgICAgCisgICAgaW91bm1hcCh2aXJ0KTsKKyAgICBqID0gcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmstPndpbik7CisgICAgaWYgKGogIT0gQ1NfU1VDQ0VTUykKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlbGVhc2VXaW5kb3csIGopOworICAgIHJldHVybiAoaSA8IE5SX0lORk8pID8gaHdfaW5mbytpIDogTlVMTDsKK30gLyogZ2V0X2h3aW5mbyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoaXMgcHJvYmVzIGZvciBhIGNhcmQncyBoYXJkd2FyZSBhZGRyZXNzIGJ5IHJlYWRpbmcgdGhlIFBST00uCisgICAgSXQgY2hlY2tzIHRoZSBhZGRyZXNzIGFnYWluc3QgYSBsaXN0IG9mIGtub3duIHR5cGVzLCB0aGVuIGZhbGxzCisgICAgYmFjayB0byBhIHNpbXBsZSBORTIwMDAgY2xvbmUgc2lnbmF0dXJlIGNoZWNrLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGh3X2luZm9fdCAqZ2V0X3Byb20oZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHVfY2hhciBwcm9tWzMyXTsKKyAgICBpbnQgaSwgajsKKworICAgIC8qIFRoaXMgaXMgbGlmdGVkIHN0cmFpZ2h0IGZyb20gZHJpdmVycy9uZXQvbmUuYyAqLworICAgIHN0cnVjdCB7CisJdV9jaGFyIHZhbHVlLCBvZmZzZXQ7CisgICAgfSBwcm9ncmFtX3NlcVtdID0geworCXtFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBFODM5MF9DTUR9LCAvKiBTZWxlY3QgcGFnZSAwKi8KKwl7MHg0OCwJRU4wX0RDRkd9LAkvKiBTZXQgYnl0ZS13aWRlICgweDQ4KSBhY2Nlc3MuICovCisJezB4MDAsCUVOMF9SQ05UTE99LAkvKiBDbGVhciB0aGUgY291bnQgcmVncy4gKi8KKwl7MHgwMCwJRU4wX1JDTlRISX0sCisJezB4MDAsCUVOMF9JTVJ9LAkvKiBNYXNrIGNvbXBsZXRpb24gaXJxLiAqLworCXsweEZGLAlFTjBfSVNSfSwKKwl7RTgzOTBfUlhPRkYsIEVOMF9SWENSfSwJLyogMHgyMCAgU2V0IHRvIG1vbml0b3IgKi8KKwl7RTgzOTBfVFhPRkYsIEVOMF9UWENSfSwJLyogMHgwMiAgYW5kIGxvb3BiYWNrIG1vZGUuICovCisJezMyLAlFTjBfUkNOVExPfSwKKwl7MHgwMCwJRU4wX1JDTlRISX0sCisJezB4MDAsCUVOMF9SU0FSTE99LAkvKiBETUEgc3RhcnRpbmcgYXQgMHgwMDAwLiAqLworCXsweDAwLAlFTjBfUlNBUkhJfSwKKwl7RTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIEU4MzkwX0NNRH0sCisgICAgfTsKKworICAgIHBjbmV0X3Jlc2V0XzgzOTAoZGV2KTsKKyAgICBtZGVsYXkoMTApOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihwcm9ncmFtX3NlcSkvc2l6ZW9mKHByb2dyYW1fc2VxWzBdKTsgaSsrKQorCW91dGJfcChwcm9ncmFtX3NlcVtpXS52YWx1ZSwgaW9hZGRyICsgcHJvZ3JhbV9zZXFbaV0ub2Zmc2V0KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCXByb21baV0gPSBpbmIoaW9hZGRyICsgUENORVRfREFUQVBPUlQpOworICAgIGZvciAoaSA9IDA7IGkgPCBOUl9JTkZPOyBpKyspIHsKKwlpZiAoKHByb21bMF0gPT0gaHdfaW5mb1tpXS5hMCkgJiYKKwkgICAgKHByb21bMl0gPT0gaHdfaW5mb1tpXS5hMSkgJiYKKwkgICAgKHByb21bNF0gPT0gaHdfaW5mb1tpXS5hMikpCisJICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKGkgPCBOUl9JTkZPKSB8fCAoKHByb21bMjhdID09IDB4NTcpICYmIChwcm9tWzMwXSA9PSAweDU3KSkpIHsKKwlmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorCSAgICBkZXYtPmRldl9hZGRyW2pdID0gcHJvbVtqPDwxXTsKKwlyZXR1cm4gKGkgPCBOUl9JTkZPKSA/IGh3X2luZm8raSA6ICZkZWZhdWx0X2luZm87CisgICAgfQorICAgIHJldHVybiBOVUxMOworfSAvKiBnZXRfcHJvbSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEZvciBETDEwMDE5IGJhc2VkIGNhcmRzLCBsaWtlIHRoZSBMaW5rc3lzIEV0aGVyRmFzdAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGh3X2luZm9fdCAqZ2V0X2RsMTAwMTkoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBpbnQgaTsKKyAgICB1X2NoYXIgc3VtOworCisgICAgZm9yIChzdW0gPSAwLCBpID0gMHgxNDsgaSA8IDB4MWM7IGkrKykKKwlzdW0gKz0gaW5iX3AoZGV2LT5iYXNlX2FkZHIgKyBpKTsKKyAgICBpZiAoc3VtICE9IDB4ZmYpCisJcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlkZXYtPmRldl9hZGRyW2ldID0gaW5iX3AoZGV2LT5iYXNlX2FkZHIgKyAweDE0ICsgaSk7CisgICAgaSA9IGluYihkZXYtPmJhc2VfYWRkciArIDB4MWYpOworICAgIHJldHVybiAoKGkgPT0gMHg5MSl8fChpID09IDB4OTkpKSA/ICZkbDEwMDIyX2luZm8gOiAmZGwxMDAxOV9pbmZvOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEZvciBBc2l4IEFYODgxOTAgYmFzZWQgY2FyZHMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBod19pbmZvX3QgKmdldF9heDg4MTkwKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaSwgajsKKworICAgIC8qIE5vdCBtdWNoIG9mIGEgdGVzdCwgYnV0IHRoZSBhbHRlcm5hdGl2ZXMgYXJlIG1lc3N5ICovCisgICAgaWYgKGxpbmstPmNvbmYuQ29uZmlnQmFzZSAhPSAweDAzYzApCisJcmV0dXJuIE5VTEw7CisKKyAgICBvdXRiX3AoMHgwMSwgaW9hZGRyICsgRU4wX0RDRkcpOwkvKiBTZXQgd29yZC13aWRlIGFjY2Vzcy4gKi8KKyAgICBvdXRiX3AoMHgwMCwgaW9hZGRyICsgRU4wX1JTQVJMTyk7CS8qIERNQSBzdGFydGluZyBhdCAweDA0MDAuICovCisgICAgb3V0Yl9wKDB4MDQsIGlvYWRkciArIEVOMF9SU0FSSEkpOworICAgIG91dGJfcChFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpICs9IDIpIHsKKwlqID0gaW53KGlvYWRkciArIFBDTkVUX0RBVEFQT1JUKTsKKwlkZXYtPmRldl9hZGRyW2ldID0gaiAmIDB4ZmY7CisJZGV2LT5kZXZfYWRkcltpKzFdID0gaiA+PiA4OworICAgIH0KKyAgICBwcmludGsoS0VSTl9OT1RJQ0UgInBjbmV0X2NzOiB0aGlzIGlzIGFuIEFYODgxOTAgY2FyZCFcbiIpOworICAgIHByaW50ayhLRVJOX05PVElDRSAicGNuZXRfY3M6IHVzZSBheG5ldF9jcyBpbnN0ZWFkLlxuIik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhpcyBzaG91bGQgYmUgdG90YWxseSB1bm5lY2Vzc2FyeS4uLiBidXQgd2hlbiB3ZSBjYW4ndCBmaWd1cmUKKyAgICBvdXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgYW55IG90aGVyIHdheSwgd2UnbGwgbGV0IHRoZSB1c2VyIGhhcmQKKyAgICB3aXJlIGl0IHdoZW4gdGhlIG1vZHVsZSBpcyBpbml0aWFsaXplZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBod19pbmZvX3QgKmdldF9od2lyZWQoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJaWYgKGh3X2FkZHJbaV0gIT0gMCkgYnJlYWs7CisgICAgaWYgKGkgPT0gNikKKwlyZXR1cm4gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJZGV2LT5kZXZfYWRkcltpXSA9IGh3X2FkZHJbaV07CisKKyAgICByZXR1cm4gJmRlZmF1bHRfaW5mbzsKK30gLyogZ2V0X2h3aXJlZCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIHBjbmV0X2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorICAgIGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICAgIGV0aGVybmV0IGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIGludCB0cnlfaW9fcG9ydChkZXZfbGlua190ICpsaW5rKQoreworICAgIGludCBqLCByZXQ7CisgICAgaWYgKGxpbmstPmlvLk51bVBvcnRzMSA9PSAzMikgeworCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMiA+IDApIHsKKwkgICAgLyogZm9yIG1hc3Rlci9zbGF2ZSBtdWx0aWZ1bmN0aW9uIGNhcmRzICovCisJICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gCisJCUlSUV9UWVBFX0RZTkFNSUNfU0hBUklOR3xJUlFfRklSU1RfU0hBUkVEOworCX0KKyAgICB9IGVsc2UgeworCS8qIFRoaXMgc2hvdWxkIGJlIHR3byAxNi1wb3J0IHdpbmRvd3MgKi8KKwlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OworCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworICAgIH0KKyAgICBpZiAobGluay0+aW8uQmFzZVBvcnQxID09IDApIHsKKwlsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDE2OworCWZvciAoaiA9IDA7IGogPCAweDQwMDsgaiArPSAweDIwKSB7CisJICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IGogXiAweDMwMDsKKwkgICAgbGluay0+aW8uQmFzZVBvcnQyID0gKGogXiAweDMwMCkgKyAweDEwOworCSAgICByZXQgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJICAgIGlmIChyZXQgPT0gQ1NfU1VDQ0VTUykgcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworCXJldHVybiBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwY25ldF9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHBjbmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICBpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm4sIHN0YXJ0X3BnLCBzdG9wX3BnLCBjbV9vZmZzZXQ7CisgICAgaW50IG1hbmZpZCA9IDAsIHByb2RpZCA9IDAsIGhhc19zaG1lbSA9IDA7CisgICAgdV9zaG9ydCBidWZbNjRdOworICAgIGNvbmZpZ19pbmZvX3QgY29uZjsKKyAgICBod19pbmZvX3QgKmh3X2luZm87CisKKyAgICBERUJVRygwLCAicGNuZXRfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisKKyAgICAvKiBDb25maWd1cmUgY2FyZCAqLworICAgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKyAgICAvKiBMb29rIHVwIGN1cnJlbnQgVmNjICovCisgICAgQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGhhbmRsZSwgJmNvbmYpKTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IGNvbmYuVmNjOworCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX01BTkZJRDsKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gVFVQTEVfUkVUVVJOX0NPTU1PTjsKKyAgICBpZiAoKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpICYmCisgCShwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpKSB7CisJbWFuZmlkID0gbGUxNl90b19jcHUoYnVmWzBdKTsKKwlwcm9kaWQgPSBsZTE2X3RvX2NwdShidWZbMV0pOworICAgIH0KKyAgICAKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgd2hpbGUgKGxhc3RfcmV0ID09IENTX1NVQ0NFU1MpIHsKKwljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOworCWNpc3RwbF9pb190ICppbyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeS5pbyk7CisJCisJaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgIT0gMCB8fAorCQkJcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IDAgfHwKKwkJCWNmZy0+aW5kZXggPT0gMCB8fCBjZmctPmlvLm53aW4gPT0gMCkKKwkJZ290byBuZXh0X2VudHJ5OworCQorCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OworCS8qIEZvciBtdWx0aWZ1bmN0aW9uIGNhcmRzLCBieSBjb252ZW50aW9uLCB3ZSBjb25maWd1cmUgdGhlCisJICAgbmV0d29yayBmdW5jdGlvbiB3aXRoIHdpbmRvdyAwLCBhbmQgc2VyaWFsIHdpdGggd2luZG93IDEgKi8KKwlpZiAoaW8tPm53aW4gPiAxKSB7CisJICAgIGkgPSAoaW8tPndpblsxXS5sZW4gPiBpby0+d2luWzBdLmxlbik7CisJICAgIGxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMS1pXS5iYXNlOworCSAgICBsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzEtaV0ubGVuOworCX0gZWxzZSB7CisJICAgIGkgPSBsaW5rLT5pby5OdW1Qb3J0czIgPSAwOworCX0KKwloYXNfc2htZW0gPSAoKGNmZy0+bWVtLm53aW4gPT0gMSkgJiYKKwkJICAgICAoY2ZnLT5tZW0ud2luWzBdLmxlbiA+PSAweDQwMDApKTsKKwlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luW2ldLmJhc2U7CisJbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpbltpXS5sZW47CisJbGluay0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMxICsgbGluay0+aW8uTnVtUG9ydHMyID49IDMyKSB7CisJICAgIGxhc3RfcmV0ID0gdHJ5X2lvX3BvcnQobGluayk7CisJICAgIGlmIChsYXN0X3JldCA9PSBDU19TVUNDRVNTKSBicmVhazsKKwl9CisgICAgbmV4dF9lbnRyeToKKwlsYXN0X3JldCA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSk7CisgICAgfQorICAgIGlmIChsYXN0X3JldCAhPSBDU19TVUNDRVNTKSB7CisJY3NfZXJyb3IoaGFuZGxlLCBSZXF1ZXN0SU8sIGxhc3RfcmV0KTsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEoaGFuZGxlLCAmbGluay0+aXJxKSk7CisgICAgCisgICAgaWYgKGxpbmstPmlvLk51bVBvcnRzMiA9PSA4KSB7CisJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7CisJbGluay0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKKyAgICB9CisgICAgaWYgKChtYW5maWQgPT0gTUFORklEX0lCTSkgJiYKKwkocHJvZGlkID09IFBST0RJRF9JQk1fSE9NRV9BTkRfQVdBWSkpCisJbGluay0+Y29uZi5Db25maWdJbmRleCB8PSAweDEwOworICAgIAorICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKyAgICBkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKyAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgICBpZiAoaW5mby0+ZmxhZ3MgJiBIQVNfTUlTQ19SRUcpIHsKKwlpZiAoKGlmX3BvcnQgPT0gMSkgfHwgKGlmX3BvcnQgPT0gMikpCisJICAgIGRldi0+aWZfcG9ydCA9IGlmX3BvcnQ7CisJZWxzZQorCSAgICBwcmludGsoS0VSTl9OT1RJQ0UgInBjbmV0X2NzOiBpbnZhbGlkIGlmX3BvcnQgcmVxdWVzdGVkXG4iKTsKKyAgICB9IGVsc2UgeworCWRldi0+aWZfcG9ydCA9IDA7CisgICAgfQorCisgICAgaHdfaW5mbyA9IGdldF9od2luZm8obGluayk7CisgICAgaWYgKGh3X2luZm8gPT0gTlVMTCkKKwlod19pbmZvID0gZ2V0X3Byb20obGluayk7CisgICAgaWYgKGh3X2luZm8gPT0gTlVMTCkKKwlod19pbmZvID0gZ2V0X2RsMTAwMTkobGluayk7CisgICAgaWYgKGh3X2luZm8gPT0gTlVMTCkKKwlod19pbmZvID0gZ2V0X2F4ODgxOTAobGluayk7CisgICAgaWYgKGh3X2luZm8gPT0gTlVMTCkKKwlod19pbmZvID0gZ2V0X2h3aXJlZChsaW5rKTsKKyAgICAKKyAgICBpZiAoaHdfaW5mbyA9PSBOVUxMKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICJwY25ldF9jczogdW5hYmxlIHRvIHJlYWQgaGFyZHdhcmUgbmV0IgorCSAgICAgICAiIGFkZHJlc3MgZm9yIGlvIGJhc2UgJSMzbHhcbiIsIGRldi0+YmFzZV9hZGRyKTsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBpbmZvLT5mbGFncyA9IGh3X2luZm8tPmZsYWdzOworICAgIC8qIENoZWNrIGZvciB1c2VyIG92ZXJyaWRlcyAqLworICAgIGluZm8tPmZsYWdzIHw9IChkZWxheV9vdXRwdXQpID8gREVMQVlfT1VUUFVUIDogMDsKKyAgICBpZiAoKG1hbmZpZCA9PSBNQU5GSURfU09DS0VUKSAmJgorCSgocHJvZGlkID09IFBST0RJRF9TT0NLRVRfTFBFKSB8fAorCSAocHJvZGlkID09IFBST0RJRF9TT0NLRVRfTFBFX0NGKSB8fAorCSAocHJvZGlkID09IFBST0RJRF9TT0NLRVRfRUlPKSkpCisJaW5mby0+ZmxhZ3MgJj0gflVTRV9CSUdfQlVGOworICAgIGlmICghdXNlX2JpZ19idWYpCisJaW5mby0+ZmxhZ3MgJj0gflVTRV9CSUdfQlVGOworICAgIAorICAgIGlmIChpbmZvLT5mbGFncyAmIFVTRV9CSUdfQlVGKSB7CisJc3RhcnRfcGcgPSBTT0NLRVRfU1RBUlRfUEc7CisJc3RvcF9wZyA9IFNPQ0tFVF9TVE9QX1BHOworCWNtX29mZnNldCA9IDB4MTAwMDA7CisgICAgfSBlbHNlIHsKKwlzdGFydF9wZyA9IFBDTkVUX1NUQVJUX1BHOworCXN0b3BfcGcgPSBQQ05FVF9TVE9QX1BHOworCWNtX29mZnNldCA9IDA7CisgICAgfQorCisgICAgLyogaGFzX3NobWVtIGlzIGlnbm9yZWQgaWYgdXNlX3NobWVtICE9IC0xICovCisgICAgaWYgKCh1c2Vfc2htZW0gPT0gMCkgfHwgKCFoYXNfc2htZW0gJiYgKHVzZV9zaG1lbSA9PSAtMSkpIHx8CisJKHNldHVwX3NobWVtX3dpbmRvdyhsaW5rLCBzdGFydF9wZywgc3RvcF9wZywgY21fb2Zmc2V0KSAhPSAwKSkKKwlzZXR1cF9kbWFfY29uZmlnKGxpbmssIHN0YXJ0X3BnLCBzdG9wX3BnKTsKKworICAgIGVpX3N0YXR1cy5uYW1lID0gIk5FMjAwMCI7CisgICAgZWlfc3RhdHVzLndvcmQxNiA9IDE7CisgICAgZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmcGNuZXRfcmVzZXRfODM5MDsKKworICAgIFNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOworCisgICAgaWYgKGluZm8tPmZsYWdzICYgKElTX0RMMTAwMTl8SVNfREwxMDAyMikpIHsKKwl1X2NoYXIgaWQgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyAweDFhKTsKKwlkZXYtPmRvX2lvY3RsID0gJmVpX2lvY3RsOworCW1paV9waHlfcHJvYmUoZGV2KTsKKwlpZiAoKGlkID09IDB4MzApICYmICFpbmZvLT5wbmFfcGh5ICYmIChpbmZvLT5ldGhfcGh5ID09IDQpKQorCSAgICBpbmZvLT5ldGhfcGh5ID0gMDsKKyAgICB9CisKKyAgICBsaW5rLT5kZXYgPSAmaW5mby0+bm9kZTsKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorICAgIGRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCisgICAgaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgInBjbmV0X2NzOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworCWxpbmstPmRldiA9IE5VTEw7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgc3RyY3B5KGluZm8tPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisKKyAgICBpZiAoaW5mby0+ZmxhZ3MgJiAoSVNfREwxMDAxOXxJU19ETDEwMDIyKSkgeworCXVfY2hhciBpZCA9IGluYihkZXYtPmJhc2VfYWRkciArIDB4MWEpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBORTIwMDAgKERMMTAwJWQgcmV2ICUwMngpOiAiLAorCSAgICAgICBkZXYtPm5hbWUsICgoaW5mby0+ZmxhZ3MgJiBJU19ETDEwMDIyKSA/IDIyIDogMTkpLCBpZCk7CisJaWYgKGluZm8tPnBuYV9waHkpCisJICAgIHByaW50aygiUE5BLCAiKTsKKyAgICB9IGVsc2UgeworCXByaW50ayhLRVJOX0lORk8gIiVzOiBORTIwMDAgQ29tcGF0aWJsZTogIiwgZGV2LT5uYW1lKTsKKyAgICB9CisgICAgcHJpbnRrKCJpbyAlIzNseCwgaXJxICVkLCIsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisgICAgaWYgKGluZm8tPmZsYWdzICYgVVNFX1NITUVNKQorCXByaW50ayAoIiBtZW0gJSM1bHgsIiwgZGV2LT5tZW1fc3RhcnQpOworICAgIGlmIChpbmZvLT5mbGFncyAmIEhBU19NSVNDX1JFRykKKwlwcmludGsoIiAlcyB4Y3ZyLCIsIGlmX25hbWVzW2Rldi0+aWZfcG9ydF0pOworICAgIHByaW50aygiIGh3X2FkZHIgIik7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlwcmludGsoIiUwMlglcyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaTw1KSA/ICI6IiA6ICJcbiIpKTsKKyAgICByZXR1cm47CisKK2NzX2ZhaWxlZDoKKyAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKK2ZhaWxlZDoKKyAgICBwY25ldF9yZWxlYXNlKGxpbmspOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgcmV0dXJuOworfSAvKiBwY25ldF9jb25maWcgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgcGNuZXRfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUgbmV0CisgICAgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgICAgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBwY25ldF9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgcGNuZXRfZGV2X3QgKmluZm8gPSBQUklWKGxpbmstPnByaXYpOworCisgICAgREVCVUcoMCwgInBjbmV0X3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisgICAgaWYgKGluZm8tPmZsYWdzICYgVVNFX1NITUVNKSB7CisJaW91bm1hcChpbmZvLT5iYXNlKTsKKwlwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKyAgICB9CisgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICAgIHN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4gIEEgQ0FSRF9SRU1PVkFMIGV2ZW50CisgICAgYWxzbyBzZXRzIHNvbWUgZmxhZ3MgdG8gZGlzY291cmFnZSB0aGUgbmV0IGRyaXZlcnMgZnJvbSB0cnlpbmcKKyAgICB0byB0YWxrIHRvIHRoZSBjYXJkIGFueSBtb3JlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBwY25ldF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCSAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCisgICAgREVCVUcoMiwgInBjbmV0X2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKworICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJcGNuZXRfY29uZmlnKGxpbmspOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgaWYgKGxpbmstPm9wZW4pCisJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCX0KKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkgICAgaWYgKGxpbmstPm9wZW4pIHsKKwkJcGNuZXRfcmVzZXRfODM5MChkZXYpOworCQlOUzgzOTBfaW5pdChkZXYsIDEpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBwY25ldF9ldmVudCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIE1JSSBpbnRlcmZhY2Ugc3VwcG9ydCBmb3IgREwxMDAxOSBhbmQgREwxMDAyMiBiYXNlZCBjYXJkcworCisgICAgT24gdGhlIERMMTAwMTksIHRoZSBNSUkgSU8gZGlyZWN0aW9uIGJpdCBpcyAweDEwOyBvbiB0aGUgREwxMDAyMgorICAgIGl0IGlzIDB4MjAuICBTZXR0aW5nIGJvdGggYml0cyBzZWVtcyB0byB3b3JrIG9uIGJvdGggY2FyZCB0eXBlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgRExJTktfR1BJTwkJMHgxYworI2RlZmluZSBETElOS19ESUFHCQkweDFkCisjZGVmaW5lIERMSU5LX0VFUFJPTQkJMHgxZQorCisjZGVmaW5lIE1ESU9fU0hJRlRfQ0xLCQkweDgwCisjZGVmaW5lIE1ESU9fREFUQV9PVVQJCTB4NDAKKyNkZWZpbmUgTURJT19ESVJfV1JJVEUJCTB4MzAKKyNkZWZpbmUgTURJT19EQVRBX1dSSVRFMAkoTURJT19ESVJfV1JJVEUpCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTEJKE1ESU9fRElSX1dSSVRFIHwgTURJT19EQVRBX09VVCkKKyNkZWZpbmUgTURJT19EQVRBX1JFQUQJCTB4MTAKKyNkZWZpbmUgTURJT19NQVNLCQkweDBmCisKK3N0YXRpYyB2b2lkIG1kaW9fc3luYyhraW9fYWRkcl90IGFkZHIpCit7CisgICAgaW50IGJpdHMsIG1hc2sgPSBpbmIoYWRkcikgJiBNRElPX01BU0s7CisgICAgZm9yIChiaXRzID0gMDsgYml0cyA8IDMyOyBiaXRzKyspIHsKKwlvdXRiKG1hc2sgfCBNRElPX0RBVEFfV1JJVEUxLCBhZGRyKTsKKwlvdXRiKG1hc2sgfCBNRElPX0RBVEFfV1JJVEUxIHwgTURJT19TSElGVF9DTEssIGFkZHIpOworICAgIH0KK30KKworc3RhdGljIGludCBtZGlvX3JlYWQoa2lvX2FkZHJfdCBhZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jKQoreworICAgIHVfaW50IGNtZCA9ICgweDA2PDwxMCl8KHBoeV9pZDw8NSl8bG9jOworICAgIGludCBpLCByZXR2YWwgPSAwLCBtYXNrID0gaW5iKGFkZHIpICYgTURJT19NQVNLOworCisgICAgbWRpb19zeW5jKGFkZHIpOworICAgIGZvciAoaSA9IDEzOyBpID49IDA7IGktLSkgeworCWludCBkYXQgPSAoY21kJigxPDxpKSkgPyBNRElPX0RBVEFfV1JJVEUxIDogTURJT19EQVRBX1dSSVRFMDsKKwlvdXRiKG1hc2sgfCBkYXQsIGFkZHIpOworCW91dGIobWFzayB8IGRhdCB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9CisgICAgZm9yIChpID0gMTk7IGkgPiAwOyBpLS0pIHsKKwlvdXRiKG1hc2ssIGFkZHIpOworCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGluYihhZGRyKSAmIE1ESU9fREFUQV9SRUFEKSAhPSAwKTsKKwlvdXRiKG1hc2sgfCBNRElPX1NISUZUX0NMSywgYWRkcik7CisgICAgfQorICAgIHJldHVybiAocmV0dmFsPj4xKSAmIDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShraW9fYWRkcl90IGFkZHIsIGludCBwaHlfaWQsIGludCBsb2MsIGludCB2YWx1ZSkKK3sKKyAgICB1X2ludCBjbWQgPSAoMHgwNTw8MjgpfChwaHlfaWQ8PDIzKXwobG9jPDwxOCl8KDE8PDE3KXx2YWx1ZTsKKyAgICBpbnQgaSwgbWFzayA9IGluYihhZGRyKSAmIE1ESU9fTUFTSzsKKworICAgIG1kaW9fc3luYyhhZGRyKTsKKyAgICBmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwlpbnQgZGF0ID0gKGNtZCYoMTw8aSkpID8gTURJT19EQVRBX1dSSVRFMSA6IE1ESU9fREFUQV9XUklURTA7CisJb3V0YihtYXNrIHwgZGF0LCBhZGRyKTsKKwlvdXRiKG1hc2sgfCBkYXQgfCBNRElPX1NISUZUX0NMSywgYWRkcik7CisgICAgfQorICAgIGZvciAoaSA9IDE7IGkgPj0gMDsgaS0tKSB7CisJb3V0YihtYXNrLCBhZGRyKTsKKwlvdXRiKG1hc2sgfCBNRElPX1NISUZUX0NMSywgYWRkcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtZGlvX3Jlc2V0KGtpb19hZGRyX3QgYWRkciwgaW50IHBoeV9pZCkKK3sKKyAgICBvdXRiX3AoMHgwOCwgYWRkcik7CisgICAgb3V0Yl9wKDB4MGMsIGFkZHIpOworICAgIG91dGJfcCgweDA4LCBhZGRyKTsKKyAgICBvdXRiX3AoMHgwYywgYWRkcik7CisgICAgb3V0Yl9wKDB4MDAsIGFkZHIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEVFUFJPTSBhY2Nlc3Mgcm91dGluZXMgZm9yIERMMTAwMTkgYW5kIERMMTAwMjIgYmFzZWQgY2FyZHMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgRUVfRUVQCQkweDQwCisjZGVmaW5lIEVFX0FTSUMJCTB4MTAKKyNkZWZpbmUgRUVfQ1MJCTB4MDgKKyNkZWZpbmUgRUVfQ0sJCTB4MDQKKyNkZWZpbmUgRUVfRE8JCTB4MDIKKyNkZWZpbmUgRUVfREkJCTB4MDEKKyNkZWZpbmUgRUVfQURPVAkJMHgwMQkvKiBEYXRhT3V0IGZvciBBU0lDICovCisjZGVmaW5lIEVFX1JFQURfQ01ECTB4MDYKKworI2RlZmluZSBETDE5RkRVUExYCTB4MDQwMAkvKiBETDEwMDE5IEZ1bGwgZHVwbGV4IG1vZGUgKi8KKworc3RhdGljIGludCByZWFkX2VlcHJvbShraW9fYWRkcl90IGlvYWRkciwgaW50IGxvY2F0aW9uKQoreworICAgIGludCBpLCByZXR2YWwgPSAwOworICAgIGtpb19hZGRyX3QgZWVfYWRkciA9IGlvYWRkciArIERMSU5LX0VFUFJPTTsKKyAgICBpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IChFRV9SRUFEX0NNRCA8PCA4KTsKKworICAgIG91dGIoMCwgZWVfYWRkcik7CisgICAgb3V0YihFRV9FRVB8RUVfQ1MsIGVlX2FkZHIpOworCisgICAgLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKyAgICBmb3IgKGkgPSAxMDsgaSA+PSAwOyBpLS0pIHsKKwlzaG9ydCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfRE8gOiAwOworCW91dGJfcChFRV9FRVB8RUVfQ1N8ZGF0YXZhbCwgZWVfYWRkcik7CisJb3V0Yl9wKEVFX0VFUHxFRV9DU3xkYXRhdmFsfEVFX0NLLCBlZV9hZGRyKTsKKyAgICB9CisgICAgb3V0YihFRV9FRVB8RUVfQ1MsIGVlX2FkZHIpOworCisgICAgZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwlvdXRiX3AoRUVfRUVQfEVFX0NTIHwgRUVfQ0ssIGVlX2FkZHIpOworCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGluYihlZV9hZGRyKSAmIEVFX0RJKSA/IDEgOiAwKTsKKwlvdXRiX3AoRUVfRUVQfEVFX0NTLCBlZV9hZGRyKTsKKyAgICB9CisKKyAgICAvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisgICAgb3V0YigwLCBlZV9hZGRyKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKgorICAgIFRoZSBpbnRlcm5hbCBBU0lDIHJlZ2lzdGVycyBjYW4gYmUgY2hhbmdlZCBieSBFRVBST00gUkVBRCBhY2Nlc3MKKyAgICB3aXRoIEVFX0FTSUMgYml0IHNldC4KKyAgICBJbiBBU0lDIG1vZGUsIEVFX0FET1QgaXMgdXNlZCB0byBvdXRwdXQgdGhlIGRhdGEgdG8gdGhlIEFTSUMuCisqLworCitzdGF0aWMgdm9pZCB3cml0ZV9hc2ljKGtpb19hZGRyX3QgaW9hZGRyLCBpbnQgbG9jYXRpb24sIHNob3J0IGFzaWNfZGF0YSkKK3sKKwlpbnQgaTsKKwlraW9fYWRkcl90IGVlX2FkZHIgPSBpb2FkZHIgKyBETElOS19FRVBST007CisJc2hvcnQgZGF0YXZhbDsKKwlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IChFRV9SRUFEX0NNRCA8PCA4KTsKKworCWFzaWNfZGF0YSB8PSByZWFkX2VlcHJvbShpb2FkZHIsIGxvY2F0aW9uKTsKKworCW91dGIoMCwgZWVfYWRkcik7CisJb3V0YihFRV9BU0lDfEVFX0NTfEVFX0RJLCBlZV9hZGRyKTsKKworCXJlYWRfY21kID0gcmVhZF9jbWQgPj4gMTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gOTsgaSA+PSAwOyBpLS0pIHsKKwkJZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFX0RPIDogMDsKKwkJb3V0Yl9wKEVFX0FTSUN8RUVfQ1N8RUVfREl8ZGF0YXZhbCwgZWVfYWRkcik7CisJCW91dGJfcChFRV9BU0lDfEVFX0NTfEVFX0RJfGRhdGF2YWx8RUVfQ0ssIGVlX2FkZHIpOworCQlvdXRiX3AoRUVfQVNJQ3xFRV9DU3xFRV9ESXxkYXRhdmFsLCBlZV9hZGRyKTsKKwl9CisJLy8gc3luYworCW91dGIoRUVfQVNJQ3xFRV9DUywgZWVfYWRkcik7CisJb3V0YihFRV9BU0lDfEVFX0NTfEVFX0NLLCBlZV9hZGRyKTsKKwlvdXRiKEVFX0FTSUN8RUVfQ1MsIGVlX2FkZHIpOworCisJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJCWRhdGF2YWwgPSAoYXNpY19kYXRhICYgKDEgPDwgaSkpID8gRUVfQURPVCA6IDA7CisJCW91dGJfcChFRV9BU0lDfEVFX0NTfGRhdGF2YWwsIGVlX2FkZHIpOworCQlvdXRiX3AoRUVfQVNJQ3xFRV9DU3xkYXRhdmFsfEVFX0NLLCBlZV9hZGRyKTsKKwkJb3V0Yl9wKEVFX0FTSUN8RUVfQ1N8ZGF0YXZhbCwgZWVfYWRkcik7CisJfQorCisJLyogVGVybWluYXRlIHRoZSBBU0lDIGFjY2Vzcy4gKi8KKwlvdXRiKEVFX0FTSUN8RUVfREksIGVlX2FkZHIpOworCW91dGIoRUVfQVNJQ3xFRV9ESXwgRUVfQ0ssIGVlX2FkZHIpOworCW91dGIoRUVfQVNJQ3xFRV9ESSwgZWVfYWRkcik7CisKKwlvdXRiKDAsIGVlX2FkZHIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc2V0X21pc2NfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIHBjbmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIHVfY2hhciB0bXA7CisgICAgCisgICAgaWYgKGluZm8tPmZsYWdzICYgSEFTX01JU0NfUkVHKSB7CisJdG1wID0gaW5iX3AobmljX2Jhc2UgKyBQQ05FVF9NSVNDKSAmIH4zOworCWlmIChkZXYtPmlmX3BvcnQgPT0gMikKKwkgICAgdG1wIHw9IDE7CisJaWYgKGluZm8tPmZsYWdzICYgVVNFX0JJR19CVUYpCisJICAgIHRtcCB8PSAyOworCWlmIChpbmZvLT5mbGFncyAmIEhBU19JQk1fTUlTQykKKwkgICAgdG1wIHw9IDg7CisJb3V0Yl9wKHRtcCwgbmljX2Jhc2UgKyBQQ05FVF9NSVNDKTsKKyAgICB9CisgICAgaWYgKGluZm8tPmZsYWdzICYgSVNfREwxMDAyMikgeworCWlmIChpbmZvLT5mbGFncyAmIEhBU19NSUkpIHsKKwkgICAgbWRpb19yZXNldChuaWNfYmFzZSArIERMSU5LX0dQSU8sIGluZm8tPmV0aF9waHkpOworCSAgICAvKiBSZXN0YXJ0IE1JSSBhdXRvbmVnb3RpYXRpb24gKi8KKwkgICAgbWRpb193cml0ZShuaWNfYmFzZSArIERMSU5LX0dQSU8sIGluZm8tPmV0aF9waHksIDAsIDB4MDAwMCk7CisJICAgIG1kaW9fd3JpdGUobmljX2Jhc2UgKyBETElOS19HUElPLCBpbmZvLT5ldGhfcGh5LCAwLCAweDEyMDApOworCSAgICBpbmZvLT5taWlfcmVzZXQgPSBqaWZmaWVzOworCX0gZWxzZSB7CisJICAgIG91dGIoZnVsbF9kdXBsZXggPyA0IDogMCwgbmljX2Jhc2UgKyBETElOS19ESUFHKTsKKwl9CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgbWlpX3BoeV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHBjbmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIGtpb19hZGRyX3QgbWlpX2FkZHIgPSBkZXYtPmJhc2VfYWRkciArIERMSU5LX0dQSU87CisgICAgaW50IGk7CisgICAgdV9pbnQgdG1wLCBwaHlpZDsKKworICAgIGZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCXRtcCA9IG1kaW9fcmVhZChtaWlfYWRkciwgaSwgMSk7CisJaWYgKCh0bXAgPT0gMCkgfHwgKHRtcCA9PSAweGZmZmYpKQorCSAgICBjb250aW51ZTsKKwl0bXAgPSBtZGlvX3JlYWQobWlpX2FkZHIsIGksIE1JSV9QSFlJRF9SRUcxKTsKKwlwaHlpZCA9IHRtcCA8PCAxNjsKKwlwaHlpZCB8PSBtZGlvX3JlYWQobWlpX2FkZHIsIGksIE1JSV9QSFlJRF9SRUcyKTsKKwlwaHlpZCAmPSBNSUlfUEhZSURfUkVWX01BU0s7CisJREVCVUcoMCwgIiVzOiBNSUkgYXQgJWQgaXMgMHglMDh4XG4iLCBkZXYtPm5hbWUsIGksIHBoeWlkKTsKKwlpZiAocGh5aWQgPT0gQU03OUM5WFhfSE9NRV9QSFkpIHsKKwkgICAgaW5mby0+cG5hX3BoeSA9IGk7CisJfSBlbHNlIGlmIChwaHlpZCAhPSBBTTc5QzlYWF9FVEhfUEhZKSB7CisJICAgIGluZm8tPmV0aF9waHkgPSBpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcGNuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHBjbmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmaW5mby0+bGluazsKKyAgICAKKyAgICBERUJVRygyLCAicGNuZXRfb3BlbignJXMnKVxuIiwgZGV2LT5uYW1lKTsKKworICAgIGlmICghREVWX09LKGxpbmspKQorCXJldHVybiAtRU5PREVWOworCisgICAgbGluay0+b3BlbisrOworCisgICAgc2V0X21pc2NfcmVnKGRldik7CisgICAgcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2lycV93cmFwcGVyLCBTQV9TSElSUSwgZGV2X2luZm8sIGRldik7CisKKyAgICBpbmZvLT5waHlfaWQgPSBpbmZvLT5ldGhfcGh5OworICAgIGluZm8tPmxpbmtfc3RhdHVzID0gMHgwMDsKKyAgICBpbml0X3RpbWVyKCZpbmZvLT53YXRjaGRvZyk7CisgICAgaW5mby0+d2F0Y2hkb2cuZnVuY3Rpb24gPSAmZWlfd2F0Y2hkb2c7CisgICAgaW5mby0+d2F0Y2hkb2cuZGF0YSA9ICh1X2xvbmcpZGV2OworICAgIGluZm8tPndhdGNoZG9nLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisgICAgYWRkX3RpbWVyKCZpbmZvLT53YXRjaGRvZyk7CisKKyAgICByZXR1cm4gZWlfb3BlbihkZXYpOworfSAvKiBwY25ldF9vcGVuICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHBjbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcGNuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZpbmZvLT5saW5rOworCisgICAgREVCVUcoMiwgInBjbmV0X2Nsb3NlKCclcycpXG4iLCBkZXYtPm5hbWUpOworCisgICAgZWlfY2xvc2UoZGV2KTsKKyAgICBmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKyAgICAKKyAgICBsaW5rLT5vcGVuLS07CisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgIGRlbF90aW1lcl9zeW5jKCZpbmZvLT53YXRjaGRvZyk7CisKKyAgICByZXR1cm4gMDsKK30gLyogcGNuZXRfY2xvc2UgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBIYXJkIHJlc2V0IHRoZSBjYXJkLiAgVGhpcyB1c2VkIHRvIHBhdXNlIGZvciB0aGUgc2FtZSBwZXJpb2QgdGhhdAorICAgIGEgODM5MCByZXNldCBjb21tYW5kIHJlcXVpcmVkLCBidXQgdGhhdCBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgcGNuZXRfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaTsKKworICAgIGVpX3N0YXR1cy50eGluZyA9IGVpX3N0YXR1cy5kbWFpbmcgPSAwOworCisgICAgb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIG5pY19iYXNlICsgRTgzOTBfQ01EKTsKKworICAgIG91dGIoaW5iKG5pY19iYXNlICsgUENORVRfUkVTRVQpLCBuaWNfYmFzZSArIFBDTkVUX1JFU0VUKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCWlmICgoaW5iX3AobmljX2Jhc2UrRU4wX0lTUikgJiBFTklTUl9SRVNFVCkgIT0gMCkKKwkgICAgYnJlYWs7CisJdWRlbGF5KDEwMCk7CisgICAgfQorICAgIG91dGJfcChFTklTUl9SRVNFVCwgbmljX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrIGludHIuICovCisgICAgCisgICAgaWYgKGkgPT0gMTAwKQorCXByaW50ayhLRVJOX0VSUiAiJXM6IHBjbmV0X3Jlc2V0XzgzOTAoKSBkaWQgbm90IGNvbXBsZXRlLlxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKyAgICBzZXRfbWlzY19yZWcoZGV2KTsKKyAgICAKK30gLyogcGNuZXRfcmVzZXRfODM5MCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBzZXRfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQoreworICAgIHBjbmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIGlmICgobWFwLT5wb3J0ICE9ICh1X2NoYXIpKC0xKSkgJiYgKG1hcC0+cG9ydCAhPSBkZXYtPmlmX3BvcnQpKSB7CisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBIQVNfTUlTQ19SRUcpKQorCSAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisJZWxzZSBpZiAoKG1hcC0+cG9ydCA8IDEpIHx8IChtYXAtPnBvcnQgPiAyKSkKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5pZl9wb3J0ID0gbWFwLT5wb3J0OworCXByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hlZCB0byAlcyBwb3J0XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGlmX25hbWVzW2Rldi0+aWZfcG9ydF0pOworCU5TODM5MF9pbml0KGRldiwgMSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGlycXJldHVybl90IGVpX2lycV93cmFwcGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKyAgICBwY25ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICBpcnFyZXR1cm5fdCByZXQgPSBlaV9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQsIHJlZ3MpOworCisgICAgaWYgKHJldCA9PSBJUlFfSEFORExFRCkKKwkgICAgaW5mby0+c3RhbGUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVpX3dhdGNoZG9nKHVfbG9uZyBhcmcpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWFyZzsKKyAgICBwY25ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICBraW9fYWRkcl90IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAga2lvX2FkZHJfdCBtaWlfYWRkciA9IG5pY19iYXNlICsgRExJTktfR1BJTzsKKyAgICB1X3Nob3J0IGxpbms7CisKKyAgICBpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIGdvdG8gcmVzY2hlZHVsZTsKKworICAgIC8qIENoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdCB3aXRoIGV4cGlyZWQgbGF0ZW5jeSB0aW1lcjogd2l0aAorICAgICAgIHRoaXMsIHdlIGNhbiBsaW1wIGFsb25nIGV2ZW4gaWYgdGhlIGludGVycnVwdCBpcyBibG9ja2VkICovCisgICAgb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwLCBuaWNfYmFzZSArIEU4MzkwX0NNRCk7CisgICAgaWYgKGluZm8tPnN0YWxlKysgJiYgKGluYl9wKG5pY19iYXNlICsgRU4wX0lTUikgJiBFTklTUl9BTEwpKSB7CisJaWYgKCFpbmZvLT5mYXN0X3BvbGwpCisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBpbnRlcnJ1cHQocykgZHJvcHBlZCFcbiIsIGRldi0+bmFtZSk7CisJZWlfaXJxX3dyYXBwZXIoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJaW5mby0+ZmFzdF9wb2xsID0gSFo7CisgICAgfQorICAgIGlmIChpbmZvLT5mYXN0X3BvbGwpIHsKKwlpbmZvLT5mYXN0X3BvbGwtLTsKKwlpbmZvLT53YXRjaGRvZy5leHBpcmVzID0gamlmZmllcyArIDE7CisJYWRkX3RpbWVyKCZpbmZvLT53YXRjaGRvZyk7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmICghKGluZm8tPmZsYWdzICYgSEFTX01JSSkpCisJZ290byByZXNjaGVkdWxlOworCisgICAgbWRpb19yZWFkKG1paV9hZGRyLCBpbmZvLT5waHlfaWQsIDEpOworICAgIGxpbmsgPSBtZGlvX3JlYWQobWlpX2FkZHIsIGluZm8tPnBoeV9pZCwgMSk7CisgICAgaWYgKCFsaW5rIHx8IChsaW5rID09IDB4ZmZmZikpIHsKKwlpZiAoaW5mby0+ZXRoX3BoeSkgeworCSAgICBpbmZvLT5waHlfaWQgPSBpbmZvLT5ldGhfcGh5ID0gMDsKKwl9IGVsc2UgeworCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogTUlJIGlzIG1pc3NpbmchXG4iLCBkZXYtPm5hbWUpOworCSAgICBpbmZvLT5mbGFncyAmPSB+SEFTX01JSTsKKwl9CisJZ290byByZXNjaGVkdWxlOworICAgIH0KKworICAgIGxpbmsgJj0gMHgwMDA0OworICAgIGlmIChsaW5rICE9IGluZm8tPmxpbmtfc3RhdHVzKSB7CisJdV9zaG9ydCBwID0gbWRpb19yZWFkKG1paV9hZGRyLCBpbmZvLT5waHlfaWQsIDUpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBsaW5rIGJlYXRcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgKGxpbmspID8gImZvdW5kIiA6ICJsb3N0Iik7CisJaWYgKGxpbmsgJiYgKGluZm8tPmZsYWdzICYgSVNfREwxMDAyMikpIHsKKwkgICAgLyogRGlzYWJsZSBjb2xsaXNpb24gZGV0ZWN0aW9uIG9uIGZ1bGwgZHVwbGV4IGxpbmtzICovCisJICAgIG91dGIoKHAgJiAweDAxNDApID8gNCA6IDAsIG5pY19iYXNlICsgRExJTktfRElBRyk7CisJfSBlbHNlIGlmIChsaW5rICYmIChpbmZvLT5mbGFncyAmIElTX0RMMTAwMTkpKSB7CisJICAgIC8qIERpc2FibGUgY29sbGlzaW9uIGRldGVjdGlvbiBvbiBmdWxsIGR1cGxleCBsaW5rcyAqLworCSAgICB3cml0ZV9hc2ljKGRldi0+YmFzZV9hZGRyLCA0LCAocCAmIDB4MTQwKSA/IERMMTlGRFVQTFggOiAwKTsKKwl9CisJaWYgKGxpbmspIHsKKwkgICAgaWYgKGluZm8tPnBoeV9pZCA9PSBpbmZvLT5ldGhfcGh5KSB7CisJCWlmIChwKQorCQkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGF1dG9uZWdvdGlhdGlvbiBjb21wbGV0ZTogIgorCQkJICAgIiVzYmFzZVQtJWNEIHNlbGVjdGVkXG4iLCBkZXYtPm5hbWUsCisJCQkgICAoKHAgJiAweDAxODApID8gIjEwMCIgOiAiMTAiKSwKKwkJCSAgICgocCAmIDB4MDE0MCkgPyAnRicgOiAnSCcpKTsKKwkJZWxzZQorCQkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgcGFydG5lciBkaWQgbm90ICIKKwkJCSAgICJhdXRvbmVnb3RpYXRlXG4iLCBkZXYtPm5hbWUpOworCSAgICB9CisJICAgIE5TODM5MF9pbml0KGRldiwgMSk7CisJfQorCWluZm8tPmxpbmtfc3RhdHVzID0gbGluazsKKyAgICB9CisgICAgaWYgKGluZm8tPnBuYV9waHkgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBpbmZvLT5taWlfcmVzZXQgKyA2KkhaKSkgeworCWxpbmsgPSBtZGlvX3JlYWQobWlpX2FkZHIsIGluZm8tPmV0aF9waHksIDEpICYgMHgwMDA0OworCWlmICgoKGluZm8tPnBoeV9pZCA9PSBpbmZvLT5wbmFfcGh5KSAmJiBsaW5rKSB8fAorCSAgICAoKGluZm8tPnBoeV9pZCAhPSBpbmZvLT5wbmFfcGh5KSAmJiAhbGluaykpIHsKKwkgICAgLyogaXNvbGF0ZSB0aGlzIE1JSSBhbmQgdHJ5IGZsaXBwaW5nIHRvIHRoZSBvdGhlciBvbmUgKi8KKwkgICAgbWRpb193cml0ZShtaWlfYWRkciwgaW5mby0+cGh5X2lkLCAwLCAweDA0MDApOworCSAgICBpbmZvLT5waHlfaWQgXj0gaW5mby0+cG5hX3BoeSBeIGluZm8tPmV0aF9waHk7CisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hlZCB0byAlcyB0cmFuc2NlaXZlclxuIiwgZGV2LT5uYW1lLAorCQkgICAoaW5mby0+cGh5X2lkID09IGluZm8tPmV0aF9waHkpID8gImV0aGVybmV0IiA6ICJQTkEiKTsKKwkgICAgbWRpb193cml0ZShtaWlfYWRkciwgaW5mby0+cGh5X2lkLCAwLAorCQkgICAgICAgKGluZm8tPnBoeV9pZCA9PSBpbmZvLT5ldGhfcGh5KSA/IDB4MTAwMCA6IDApOworCSAgICBpbmZvLT5saW5rX3N0YXR1cyA9IDA7CisJICAgIGluZm8tPm1paV9yZXNldCA9IGppZmZpZXM7CisJfQorICAgIH0KKworcmVzY2hlZHVsZToKKyAgICBpbmZvLT53YXRjaGRvZy5leHBpcmVzID0gamlmZmllcyArIEhaOworICAgIGFkZF90aW1lcigmaW5mby0+d2F0Y2hkb2cpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAicGNuZXRfY3MiKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKK3N0YXRpYyBpbnQgZWlfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKyAgICBwY25ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICB1MTYgKmRhdGEgPSAodTE2ICopJnJxLT5pZnJfaWZydTsKKyAgICBraW9fYWRkcl90IG1paV9hZGRyID0gZGV2LT5iYXNlX2FkZHIgKyBETElOS19HUElPOworICAgIHN3aXRjaCAoY21kKSB7CisgICAgY2FzZSBTSU9DR01JSVBIWToKKwlkYXRhWzBdID0gaW5mby0+cGh5X2lkOworICAgIGNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJZGF0YVszXSA9IG1kaW9fcmVhZChtaWlfYWRkciwgZGF0YVswXSwgZGF0YVsxXSAmIDB4MWYpOworCXJldHVybiAwOworICAgIGNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkgICAgcmV0dXJuIC1FUEVSTTsKKwltZGlvX3dyaXRlKG1paV9hZGRyLCBkYXRhWzBdLCBkYXRhWzFdICYgMHgxZiwgZGF0YVsyXSk7CisJcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtRU9QTk9UU1VQUDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGRtYV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCSAgICAgaW50IHJpbmdfcGFnZSkKK3sKKyAgICBraW9fYWRkcl90IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBpZiAoZWlfc3RhdHVzLmRtYWluZykgeworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IERNQWluZyBjb25mbGljdCBpbiBkbWFfYmxvY2tfaW5wdXQuIgorCSAgICAgICAiW0RNQXN0YXQ6JTF4XVtpcnFsb2NrOiUxeF1cbiIsCisJICAgICAgIGRldi0+bmFtZSwgZWlfc3RhdHVzLmRtYWluZywgZWlfc3RhdHVzLmlycWxvY2spOworCXJldHVybjsKKyAgICB9CisgICAgCisgICAgZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworICAgIG91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBQQ05FVF9DTUQpOworICAgIG91dGJfcChzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpLCBuaWNfYmFzZSArIEVOMF9SQ05UTE8pOworICAgIG91dGJfcCgwLCBuaWNfYmFzZSArIEVOMF9SQ05USEkpOworICAgIG91dGJfcCgwLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOwkJLyogT24gcGFnZSBib3VuZGFyeSAqLworICAgIG91dGJfcChyaW5nX3BhZ2UsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisgICAgb3V0Yl9wKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIFBDTkVUX0NNRCk7CisKKyAgICBpbnN3KG5pY19iYXNlICsgUENORVRfREFUQVBPUlQsIGhkciwKKwkgICAgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKT4+MSk7CisgICAgLyogRml4IGZvciBiaWcgZW5kaWFuIHN5c3RlbXMgKi8KKyAgICBoZHItPmNvdW50ID0gbGUxNl90b19jcHUoaGRyLT5jb3VudCk7CisKKyAgICBvdXRiX3AoRU5JU1JfUkRDLCBuaWNfYmFzZSArIEVOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKyAgICBlaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgZG1hX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisgICAga2lvX2FkZHJfdCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCB4ZmVyX2NvdW50ID0gY291bnQ7CisgICAgY2hhciAqYnVmID0gc2tiLT5kYXRhOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCisgICAgaWYgKChlaV9kZWJ1ZyA+IDQpICYmIChjb3VudCAhPSA0KSkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFtiaT0lZF1cbiIsIGRldi0+bmFtZSwgY291bnQrNCk7CisjZW5kaWYKKyAgICBpZiAoZWlfc3RhdHVzLmRtYWluZykgeworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IERNQWluZyBjb25mbGljdCBpbiBkbWFfYmxvY2tfaW5wdXQuIgorCSAgICAgICAiW0RNQXN0YXQ6JTF4XVtpcnFsb2NrOiUxeF1cbiIsCisJICAgICAgIGRldi0+bmFtZSwgZWlfc3RhdHVzLmRtYWluZywgZWlfc3RhdHVzLmlycWxvY2spOworCXJldHVybjsKKyAgICB9CisgICAgZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworICAgIG91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBQQ05FVF9DTUQpOworICAgIG91dGJfcChjb3VudCAmIDB4ZmYsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisgICAgb3V0Yl9wKGNvdW50ID4+IDgsIG5pY19iYXNlICsgRU4wX1JDTlRISSk7CisgICAgb3V0Yl9wKHJpbmdfb2Zmc2V0ICYgMHhmZiwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKyAgICBvdXRiX3AocmluZ19vZmZzZXQgPj4gOCwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKyAgICBvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgUENORVRfQ01EKTsKKworICAgIGluc3cobmljX2Jhc2UgKyBQQ05FVF9EQVRBUE9SVCxidWYsY291bnQ+PjEpOworICAgIGlmIChjb3VudCAmIDB4MDEpCisJYnVmW2NvdW50LTFdID0gaW5iKG5pY19iYXNlICsgUENORVRfREFUQVBPUlQpLCB4ZmVyX2NvdW50Kys7CisKKyAgICAvKiBUaGlzIHdhcyBmb3IgdGhlIEFMUEhBIHZlcnNpb24gb25seSwgYnV0IGVub3VnaCBwZW9wbGUgaGF2ZQorICAgICAgIGVuY291bnRlcmluZyBwcm9ibGVtcyB0aGF0IGl0IGlzIHN0aWxsIGhlcmUuICovCisjaWZkZWYgUENNQ0lBX0RFQlVHCisgICAgaWYgKGVpX2RlYnVnID4gNCkgewkJLyogRE1BIHRlcm1pbmF0aW9uIGFkZHJlc3MgY2hlY2suLi4gKi8KKwlpbnQgYWRkciwgdHJpZXMgPSAyMDsKKwlkbyB7CisJICAgIC8qIERPTidUIGNoZWNrIGZvciAnaW5iX3AoRU4wX0lTUikgJiBFTklTUl9SREMnIGhlcmUKKwkgICAgICAgLS0gaXQncyBicm9rZW4gZm9yIFJ4IG9uIHNvbWUgY2FyZHMhICovCisJICAgIGludCBoaWdoID0gaW5iX3AobmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKwkgICAgaW50IGxvdyA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisJICAgIGFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkgICAgaWYgKCgocmluZ19vZmZzZXQgKyB4ZmVyX2NvdW50KSAmIDB4ZmYpID09IChhZGRyICYgMHhmZikpCisJCWJyZWFrOworCX0gd2hpbGUgKC0tdHJpZXMgPiAwKTsKKwlpZiAodHJpZXMgPD0gMCkKKwkgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlczogUlggdHJhbnNmZXIgYWRkcmVzcyBtaXNtYXRjaCwiCisJCSAgICIlIzQuNHggKGV4cGVjdGVkKSB2cy4gJSM0LjR4IChhY3R1YWwpLlxuIiwKKwkJICAgZGV2LT5uYW1lLCByaW5nX29mZnNldCArIHhmZXJfY291bnQsIGFkZHIpOworICAgIH0KKyNlbmRpZgorICAgIG91dGJfcChFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworICAgIGVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7Cit9IC8qIGRtYV9ibG9ja19pbnB1dCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgZG1hX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkgICAgIGNvbnN0IHVfY2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSkKK3sKKyAgICBraW9fYWRkcl90IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgcGNuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisjaWZkZWYgUENNQ0lBX0RFQlVHCisgICAgaW50IHJldHJpZXMgPSAwOworI2VuZGlmCisgICAgdV9sb25nIGRtYV9zdGFydDsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworICAgIGlmIChlaV9kZWJ1ZyA+IDQpCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBbYm89JWRdXG4iLCBkZXYtPm5hbWUsIGNvdW50KTsKKyNlbmRpZgorCisgICAgLyogUm91bmQgdGhlIGNvdW50IHVwIGZvciB3b3JkIHdyaXRlcy4gIERvIHdlIG5lZWQgdG8gZG8gdGhpcz8KKyAgICAgICBXaGF0IGVmZmVjdCB3aWxsIGFuIG9kZCBieXRlIGNvdW50IGhhdmUgb24gdGhlIDgzOTA/CisgICAgICAgSSBzaG91bGQgY2hlY2sgc29tZWRheS4gKi8KKyAgICBpZiAoY291bnQgJiAweDAxKQorCWNvdW50Kys7CisgICAgaWYgKGVpX3N0YXR1cy5kbWFpbmcpIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gZG1hX2Jsb2NrX291dHB1dC4iCisJICAgICAgICJbRE1Bc3RhdDolMXhdW2lycWxvY2s6JTF4XVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jayk7CisJcmV0dXJuOworICAgIH0KKyAgICBlaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7CisgICAgLyogV2Ugc2hvdWxkIGFscmVhZHkgYmUgaW4gcGFnZSAwLCBidXQgdG8gYmUgc2FmZS4uLiAqLworICAgIG91dGJfcChFODM5MF9QQUdFMCtFODM5MF9TVEFSVCtFODM5MF9OT0RNQSwgbmljX2Jhc2UrUENORVRfQ01EKTsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworICByZXRyeToKKyNlbmRpZgorCisgICAgb3V0Yl9wKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBFTjBfSVNSKTsKKworICAgIC8qIE5vdyB0aGUgbm9ybWFsIG91dHB1dC4gKi8KKyAgICBvdXRiX3AoY291bnQgJiAweGZmLCBuaWNfYmFzZSArIEVOMF9SQ05UTE8pOworICAgIG91dGJfcChjb3VudCA+PiA4LCAgIG5pY19iYXNlICsgRU4wX1JDTlRISSk7CisgICAgb3V0Yl9wKDB4MDAsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisgICAgb3V0Yl9wKHN0YXJ0X3BhZ2UsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisKKyAgICBvdXRiX3AoRTgzOTBfUldSSVRFK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIFBDTkVUX0NNRCk7CisgICAgb3V0c3cobmljX2Jhc2UgKyBQQ05FVF9EQVRBUE9SVCwgYnVmLCBjb3VudD4+MSk7CisKKyAgICBkbWFfc3RhcnQgPSBqaWZmaWVzOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCisgICAgLyogVGhpcyB3YXMgZm9yIHRoZSBBTFBIQSB2ZXJzaW9uIG9ubHksIGJ1dCBlbm91Z2ggcGVvcGxlIGhhdmUKKyAgICAgICBlbmNvdW50ZXJpbmcgcHJvYmxlbXMgdGhhdCBpdCBpcyBzdGlsbCBoZXJlLiAqLworICAgIGlmIChlaV9kZWJ1ZyA+IDQpIHsJLyogRE1BIHRlcm1pbmF0aW9uIGFkZHJlc3MgY2hlY2suLi4gKi8KKwlpbnQgYWRkciwgdHJpZXMgPSAyMDsKKwlkbyB7CisJICAgIGludCBoaWdoID0gaW5iX3AobmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKwkgICAgaW50IGxvdyA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisJICAgIGFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkgICAgaWYgKChzdGFydF9wYWdlIDw8IDgpICsgY291bnQgPT0gYWRkcikKKwkJYnJlYWs7CisJfSB3aGlsZSAoLS10cmllcyA+IDApOworCWlmICh0cmllcyA8PSAwKSB7CisJICAgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IFR4IHBhY2tldCB0cmFuc2ZlciBhZGRyZXNzIG1pc21hdGNoLCIKKwkJICAgIiUjNC40eCAoZXhwZWN0ZWQpIHZzLiAlIzQuNHggKGFjdHVhbCkuXG4iLAorCQkgICBkZXYtPm5hbWUsIChzdGFydF9wYWdlIDw8IDgpICsgY291bnQsIGFkZHIpOworCSAgICBpZiAocmV0cmllcysrID09IDApCisJCWdvdG8gcmV0cnk7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgd2hpbGUgKChpbmJfcChuaWNfYmFzZSArIEVOMF9JU1IpICYgRU5JU1JfUkRDKSA9PSAwKQorCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRtYV9zdGFydCArIFBDTkVUX1JEQ19USU1FT1VUKSkgeworCSAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIFR4IFJEQy5cbiIsCisJCSAgIGRldi0+bmFtZSk7CisJICAgIHBjbmV0X3Jlc2V0XzgzOTAoZGV2KTsKKwkgICAgTlM4MzkwX2luaXQoZGV2LCAxKTsKKwkgICAgYnJlYWs7CisJfQorCisgICAgb3V0Yl9wKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCisgICAgaWYgKGluZm8tPmZsYWdzICYgREVMQVlfT1VUUFVUKQorCXVkZWxheSgobG9uZylkZWxheV90aW1lKTsKKyAgICBlaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBzZXR1cF9kbWFfY29uZmlnKGRldl9saW5rX3QgKmxpbmssIGludCBzdGFydF9wZywKKwkJCSAgICBpbnQgc3RvcF9wZykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKworICAgIGVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gc3RhcnRfcGc7CisgICAgZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wZyArIFRYX1BBR0VTOworICAgIGVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBzdG9wX3BnOworCisgICAgLyogc2V0IHVwIGJsb2NrIGkvbyBmdW5jdGlvbnMgKi8KKyAgICBlaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJmRtYV9nZXRfODM5MF9oZHI7CisgICAgZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJmRtYV9ibG9ja19pbnB1dDsKKyAgICBlaV9zdGF0dXMuYmxvY2tfb3V0cHV0ID0gJmRtYV9ibG9ja19vdXRwdXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGNvcHlpbih2b2lkICpkZXN0LCB2b2lkIF9faW9tZW0gKnNyYywgaW50IGMpCit7CisgICAgdV9zaG9ydCAqZCA9IGRlc3Q7CisgICAgdV9zaG9ydCBfX2lvbWVtICpzID0gc3JjOworICAgIGludCBvZGQ7CisKKyAgICBpZiAoYyA8PSAwKQorCXJldHVybjsKKyAgICBvZGQgPSAoYyAmIDEpOyBjID4+PSAxOworCisgICAgaWYgKGMpIHsKKwlkbyB7ICpkKysgPSBfX3Jhd19yZWFkdyhzKyspOyB9IHdoaWxlICgtLWMpOworICAgIH0KKyAgICAvKiBnZXQgbGFzdCBieXRlIGJ5IGZldGNoaW5nIGEgd29yZCBhbmQgbWFza2luZyAqLworICAgIGlmIChvZGQpCisJKigodV9jaGFyICopZCkgPSByZWFkdyhzKSAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlvdXQodm9pZCBfX2lvbWVtICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIGludCBjKQoreworICAgIHVfc2hvcnQgX19pb21lbSAqZCA9IGRlc3Q7CisgICAgY29uc3QgdV9zaG9ydCAqcyA9IHNyYzsKKyAgICBpbnQgb2RkOworCisgICAgaWYgKGMgPD0gMCkKKwlyZXR1cm47CisgICAgb2RkID0gKGMgJiAxKTsgYyA+Pj0gMTsKKworICAgIGlmIChjKSB7CisJZG8geyBfX3Jhd193cml0ZXcoKnMrKywgZCsrKTsgfSB3aGlsZSAoLS1jKTsKKyAgICB9CisgICAgLyogY29weSBsYXN0IGJ5dGUgZG9pbmcgYSByZWFkLW1vZGlmeS13cml0ZSAqLworICAgIGlmIChvZGQpCisJd3JpdGV3KChyZWFkdyhkKSAmIDB4ZmYwMCkgfCAqKHVfY2hhciAqKXMsIGQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc2htZW1fZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCSAgICAgICBpbnQgcmluZ19wYWdlKQoreworICAgIHZvaWQgX19pb21lbSAqeGZlcl9zdGFydCA9IGVpX3N0YXR1cy5tZW0gKyAoVFhfUEFHRVM8PDgpCisJCQkJKyAocmluZ19wYWdlIDw8IDgpCisJCQkJLSAoZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPDwgOCk7CisgICAgCisgICAgY29weWluKGhkciwgeGZlcl9zdGFydCwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSk7CisgICAgLyogRml4IGZvciBiaWcgZW5kaWFuIHN5c3RlbXMgKi8KKyAgICBoZHItPmNvdW50ID0gbGUxNl90b19jcHUoaGRyLT5jb3VudCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBzaG1lbV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisgICAgdm9pZCBfX2lvbWVtICp4ZmVyX3N0YXJ0ID0gZWlfc3RhdHVzLm1lbSArIChUWF9QQUdFUzw8OCkKKwkJCQkrIHJpbmdfb2Zmc2V0CisJCQkJLSAoZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPDwgOCk7CisgICAgY2hhciAqYnVmID0gc2tiLT5kYXRhOworICAgIAorICAgIGlmICh4ZmVyX3N0YXJ0ICsgY291bnQgPiAodm9pZCBfX2lvbWVtICopZWlfc3RhdHVzLnJtZW1fZW5kKSB7CisJLyogV2UgbXVzdCB3cmFwIHRoZSBpbnB1dCBtb3ZlLiAqLworCWludCBzZW1pX2NvdW50ID0gKHZvaWQgX19pb21lbSAqKWVpX3N0YXR1cy5ybWVtX2VuZCAtIHhmZXJfc3RhcnQ7CisJY29weWluKGJ1ZiwgeGZlcl9zdGFydCwgc2VtaV9jb3VudCk7CisJYnVmICs9IHNlbWlfY291bnQ7CisJeGZlcl9zdGFydCA9IGVpX3N0YXR1cy5tZW0gKyAoVFhfUEFHRVM8PDgpOworCWNvdW50IC09IHNlbWlfY291bnQ7CisgICAgfQorICAgIGNvcHlpbihidWYsIHhmZXJfc3RhcnQsIGNvdW50KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNobWVtX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkgICAgICAgY29uc3QgdV9jaGFyICpidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKQoreworICAgIHZvaWQgX19pb21lbSAqc2htZW0gPSBlaV9zdGF0dXMubWVtICsgKHN0YXJ0X3BhZ2UgPDwgOCk7CisgICAgc2htZW0gLT0gZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPDwgODsKKyAgICBjb3B5b3V0KHNobWVtLCBidWYsIGNvdW50KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgc2V0dXBfc2htZW1fd2luZG93KGRldl9saW5rX3QgKmxpbmssIGludCBzdGFydF9wZywKKwkJCSAgICAgIGludCBzdG9wX3BnLCBpbnQgY21fb2Zmc2V0KQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHBjbmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIHdpbl9yZXFfdCByZXE7CisgICAgbWVtcmVxX3QgbWVtOworICAgIGludCBpLCB3aW5kb3dfc2l6ZSwgb2Zmc2V0LCBsYXN0X3JldCwgbGFzdF9mbjsKKworICAgIHdpbmRvd19zaXplID0gKHN0b3BfcGcgLSBzdGFydF9wZykgPDwgODsKKyAgICBpZiAod2luZG93X3NpemUgPiAzMiAqIDEwMjQpCisJd2luZG93X3NpemUgPSAzMiAqIDEwMjQ7CisKKyAgICAvKiBNYWtlIHN1cmUgaXQncyBhIHBvd2VyIG9mIHR3by4gICovCisgICAgd2hpbGUgKCh3aW5kb3dfc2l6ZSAmICh3aW5kb3dfc2l6ZSAtIDEpKSAhPSAwKQorCXdpbmRvd19zaXplICs9IHdpbmRvd19zaXplICYgfih3aW5kb3dfc2l6ZSAtIDEpOworCisgICAgLyogQWxsb2NhdGUgYSBtZW1vcnkgd2luZG93ICovCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF8xNnxXSU5fTUVNT1JZX1RZUEVfQ018V0lOX0VOQUJMRTsKKyAgICByZXEuQXR0cmlidXRlcyB8PSBXSU5fVVNFX1dBSVQ7CisgICAgcmVxLkJhc2UgPSAwOyByZXEuU2l6ZSA9IHdpbmRvd19zaXplOworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IG1lbV9zcGVlZDsKKyAgICBDU19DSEVDSyhSZXF1ZXN0V2luZG93LCBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbikpOworCisgICAgbWVtLkNhcmRPZmZzZXQgPSAoc3RhcnRfcGcgPDwgOCkgKyBjbV9vZmZzZXQ7CisgICAgb2Zmc2V0ID0gbWVtLkNhcmRPZmZzZXQgJSB3aW5kb3dfc2l6ZTsKKyAgICBtZW0uQ2FyZE9mZnNldCAtPSBvZmZzZXQ7CisgICAgbWVtLlBhZ2UgPSAwOworICAgIENTX0NIRUNLKE1hcE1lbVBhZ2UsIHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWVtKSk7CisKKyAgICAvKiBUcnkgc2NyaWJibGluZyBvbiB0aGUgYnVmZmVyICovCisgICAgaW5mby0+YmFzZSA9IGlvcmVtYXAocmVxLkJhc2UsIHdpbmRvd19zaXplKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKFRYX1BBR0VTPDw4KTsgaSArPSAyKQorCV9fcmF3X3dyaXRldygoaT4+MSksIGluZm8tPmJhc2Urb2Zmc2V0K2kpOworICAgIHVkZWxheSgxMDApOworICAgIGZvciAoaSA9IDA7IGkgPCAoVFhfUEFHRVM8PDgpOyBpICs9IDIpCisJaWYgKF9fcmF3X3JlYWR3KGluZm8tPmJhc2Urb2Zmc2V0K2kpICE9IChpPj4xKSkgYnJlYWs7CisgICAgcGNuZXRfcmVzZXRfODM5MChkZXYpOworICAgIGlmIChpICE9IChUWF9QQUdFUzw8OCkpIHsKKwlpb3VubWFwKGluZm8tPmJhc2UpOworCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworCWluZm8tPmJhc2UgPSBOVUxMOyBsaW5rLT53aW4gPSBOVUxMOworCWdvdG8gZmFpbGVkOworICAgIH0KKyAgICAKKyAgICBlaV9zdGF0dXMubWVtID0gaW5mby0+YmFzZSArIG9mZnNldDsKKyAgICBkZXYtPm1lbV9zdGFydCA9ICh1X2xvbmcpZWlfc3RhdHVzLm1lbTsKKyAgICBkZXYtPm1lbV9lbmQgPSBlaV9zdGF0dXMucm1lbV9lbmQgPSAodV9sb25nKWluZm8tPmJhc2UgKyByZXEuU2l6ZTsKKworICAgIGVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gc3RhcnRfcGc7CisgICAgZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wZyArIFRYX1BBR0VTOworICAgIGVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBzdGFydF9wZyArICgocmVxLlNpemUgLSBvZmZzZXQpID4+IDgpOworCisgICAgLyogc2V0IHVwIGJsb2NrIGkvbyBmdW5jdGlvbnMgKi8KKyAgICBlaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJnNobWVtX2dldF84MzkwX2hkcjsKKyAgICBlaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmc2htZW1fYmxvY2tfaW5wdXQ7CisgICAgZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZzaG1lbV9ibG9ja19vdXRwdXQ7CisKKyAgICBpbmZvLT5mbGFncyB8PSBVU0VfU0hNRU07CisgICAgcmV0dXJuIDA7CisKK2NzX2ZhaWxlZDoKKyAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKK2ZhaWxlZDoKKyAgICByZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBwY25ldF9kcml2ZXIgPSB7CisJLmRydgkJPSB7CisJCS5uYW1lCT0gInBjbmV0X2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gcGNuZXRfYXR0YWNoLAorCS5kZXRhY2gJCT0gcGNuZXRfZGV0YWNoLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcGNuZXRfY3Modm9pZCkKK3sKKyAgICByZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmcGNuZXRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcGNuZXRfY3Modm9pZCkKK3sKKyAgICBERUJVRygwLCAicGNuZXRfY3M6IHVubG9hZGluZ1xuIik7CisgICAgcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZwY25ldF9kcml2ZXIpOworICAgIEJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9wY25ldF9jcyk7Cittb2R1bGVfZXhpdChleGl0X3BjbmV0X2NzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhMTUyMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCkBAIC0wLDAgKzEsMjI2MCBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBIFBDTUNJQSBldGhlcm5ldCBkcml2ZXIgZm9yIFNNQzkxYzkyLWJhc2VkIGNhcmRzLgorCisgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWVnYWhlcnR6IFBDTUNJQSBldGhlcm5ldCBjYXJkczsgYW5kCisgICAgTWVnYWhlcnR6LCBNb3Rvcm9sYSwgT3NpdGVjaCwgYW5kIFBzaW9uIERhY29tIGV0aGVybmV0L21vZGVtCisgICAgbXVsdGlmdW5jdGlvbiBjYXJkcy4KKworICAgIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcyAtLSBkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorCisgICAgc21jOTFjOTJfY3MuYyAxLjEyMiAyMDAyLzEwLzI1IDA2OjI2OjM5CisKKyAgICBUaGlzIGRyaXZlciBjb250YWlucyBjb2RlIHdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlcgorICAgIChiZWNrZXJAc2N5bGQuY29tKSwgUm93YW4gSHVnaGVzICh4LWNzcmRoQGpjdS5lZHUuYXUpLAorICAgIERhdmlkIEhpbmRzIChkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCksIGFuZCBFcmlrIFN0YWhsbWFuCisgICAgKGVyaWtAdnQuZWR1KS4gIERvbmFsZCB3cm90ZSB0aGUgU01DIDkxYzkyIGNvZGUgdXNpbmcgcGFydHMgb2YKKyAgICBFcmlrJ3MgU01DIDkxYzk0IGRyaXZlci4gIFJvd2FuIHdyb3RlIGEgc2ltaWxhciBkcml2ZXIsIGFuZCBJJ3ZlCisgICAgaW5jb3Jwb3JhdGVkIHNvbWUgcGFydHMgb2YgaGlzIGRyaXZlciBoZXJlLiAgSSAoRGF2ZSkgd3JvdGUgbW9zdAorICAgIG9mIHRoZSBQQ01DSUEgZ2x1ZSBjb2RlLCBhbmQgdGhlIE9zaXRlY2ggc3VwcG9ydCBjb2RlLiAgS2VsbHkKKyAgICBTdGVwaGVucyAoa3N0ZXBoZW5AaG9sbGkuY29tKSBhZGRlZCBzdXBwb3J0IGZvciB0aGUgTW90b3JvbGEKKyAgICBNYXJpbmVyLCB3aXRoIGhlbHAgZnJvbSBBbGxlbiBCcm9zdC4KKworICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiBPc2l0ZWNoIFNldmVuIG9mIERpYW1vbmRzIGZpcm13YXJlICovCisjaW5jbHVkZSAib3NpdGVjaC5oIgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGNoYXIgKmlmX25hbWVzW10gPSB7ICJhdXRvIiwgIjEwYmFzZVQiLCAiMTBiYXNlMiJ9OworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNNQyA5MWM5MiBzZXJpZXMgUENNQ0lBIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIElOVF9NT0RVTEVfUEFSTShuLCB2KSBzdGF0aWMgaW50IG4gPSB2OyBtb2R1bGVfcGFyYW0obiwgaW50LCAwKQorCisvKgorICBUcmFuc2NlaXZlci9tZWRpYSB0eXBlLgorICAgMCA9IGF1dG8KKyAgIDEgPSAxMGJhc2VUIChhbmQgYXV0b3NlbGVjdCBpZiAjZGVmaW5lIEFVVE9TRUxFQ1QpLAorICAgMiA9IEFVSS8xMGJhc2UyLAorKi8KK0lOVF9NT0RVTEVfUEFSTShpZl9wb3J0LCAwKTsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworSU5UX01PRFVMRV9QQVJNKHBjX2RlYnVnLCBQQ01DSUFfREVCVUcpOworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQorInNtYzkxYzkyX2NzLmMgMC4wOSAxOTk2LzgvNCBEb25hbGQgQmVja2VyLCBiZWNrZXJAc2N5bGQuY29tLlxuIjsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBEUlZfTkFNRQkic21jOTFjOTJfY3MiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjEyMiIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlciB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgVHggaHVuZyAqLworI2RlZmluZSBUWF9USU1FT1VUCQkoKDQwMCpIWikvMTAwMCkKKworLyogTWF4aW11bSBldmVudHMgKFJ4IHBhY2tldHMsIGV0Yy4pIHRvIGhhbmRsZSBhdCBlYWNoIGludGVycnVwdC4gKi8KKyNkZWZpbmUgSU5UUl9XT1JLCQk0CisKKy8qIFRpbWVzIHRvIGNoZWNrIHRoZSBjaGVjayB0aGUgY2hpcCBiZWZvcmUgY29uY2x1ZGluZyB0aGF0IGl0IGRvZXNuJ3QKKyAgIGN1cnJlbnRseSBoYXZlIHJvb20gZm9yIGFub3RoZXIgVHggcGFja2V0LiAqLworI2RlZmluZSBNRU1PUllfV0FJVF9USU1FICAgICAgIAk4CisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gInNtYzkxYzkyX2NzIjsKKworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0OworCitzdHJ1Y3Qgc21jX3ByaXZhdGUgeworICAgIGRldl9saW5rX3QJCQlsaW5rOworICAgIHNwaW5sb2NrX3QJCQlsb2NrOworICAgIHVfc2hvcnQJCQltYW5maWQ7CisgICAgdV9zaG9ydAkJCWNhcmRpZDsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKyAgICBkZXZfbm9kZV90CQkJbm9kZTsKKyAgICBzdHJ1Y3Qgc2tfYnVmZgkJKnNhdmVkX3NrYjsKKyAgICBpbnQJCQkJcGFja2V0c193YWl0aW5nOworICAgIHZvaWQJCQlfX2lvbWVtICpiYXNlOworICAgIHVfc2hvcnQJCQljZmc7CisgICAgc3RydWN0IHRpbWVyX2xpc3QJCW1lZGlhOworICAgIGludAkJCQl3YXRjaGRvZywgdHhfZXJyOworICAgIHVfc2hvcnQJCQltZWRpYV9zdGF0dXM7CisgICAgdV9zaG9ydAkJCWZhc3RfcG9sbDsKKyAgICB1X3Nob3J0CQkJbGlua19zdGF0dXM7CisgICAgc3RydWN0IG1paV9pZl9pbmZvCQltaWlfaWY7CisgICAgaW50CQkJCWR1cGxleDsKKyAgICBpbnQJCQkJcnhfb3ZybjsKK307CisKKy8qIFNwZWNpYWwgZGVmaW5pdGlvbnMgZm9yIE1lZ2FoZXJ0eiBtdWx0aWZ1bmN0aW9uIGNhcmRzICovCisjZGVmaW5lIE1FR0FIRVJUWl9JU1IJCTB4MDM4MAorCisvKiBTcGVjaWFsIGZ1bmN0aW9uIHJlZ2lzdGVycyBmb3IgTW90b3JvbGEgTWFyaW5lciAqLworI2RlZmluZSBNT1RfTEFOCQkJMHgwMDAwCisjZGVmaW5lIE1PVF9VQVJUCQkweDAwMjAKKyNkZWZpbmUgTU9UX0VFUFJPTQkJMHgyMAorCisjZGVmaW5lIE1PVF9OT1JNQUwgXAorKENPUl9MRVZFTF9SRVEgfCBDT1JfRlVOQ19FTkEgfCBDT1JfQUREUl9ERUNPREUgfCBDT1JfSVJFUV9FTkEpCisKKy8qIFNwZWNpYWwgZnVuY3Rpb24gcmVnaXN0ZXJzIGZvciBPc2l0ZWNoIGNhcmRzICovCisjZGVmaW5lIE9TSVRFQ0hfQVVJX0NUTAkJMHgwYworI2RlZmluZSBPU0lURUNIX1BXUkRPV04JCTB4MGQKKyNkZWZpbmUgT1NJVEVDSF9SRVNFVAkJMHgwZQorI2RlZmluZSBPU0lURUNIX0lTUgkJMHgwZgorI2RlZmluZSBPU0lURUNIX0FVSV9QV1IJCTB4MGMKKyNkZWZpbmUgT1NJVEVDSF9SRVNFVF9JU1IJMHgwZQorCisjZGVmaW5lIE9TSV9BVUlfUFdSCQkweDQwCisjZGVmaW5lIE9TSV9MQU5fUFdSRE9XTgkJMHgwMgorI2RlZmluZSBPU0lfTU9ERU1fUFdSRE9XTgkweDAxCisjZGVmaW5lIE9TSV9MQU5fUkVTRVQJCTB4MDIKKyNkZWZpbmUgT1NJX01PREVNX1JFU0VUCQkweDAxCisKKy8qIFN5bWJvbGljIGNvbnN0YW50cyBmb3IgdGhlIFNNQzkxYzkqIHNlcmllcyBjaGlwcywgZnJvbSBFcmlrIFN0YWhsbWFuLiAqLworI2RlZmluZQlCQU5LX1NFTEVDVAkJMTQJCS8qIFdpbmRvdyBzZWxlY3QgcmVnaXN0ZXIuICovCisjZGVmaW5lIFNNQ19TRUxFQ1RfQkFOSyh4KSAgeyBvdXR3KHgsIGlvYWRkciArIEJBTktfU0VMRUNUKTsgfQorCisvKiBCYW5rIDAgcmVnaXN0ZXJzLiAqLworI2RlZmluZQlUQ1IgCQkwCS8qIHRyYW5zbWl0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJIFRDUl9DTEVBUgkwCS8qIGRvIE5PVEhJTkcgKi8KKyNkZWZpbmUgIFRDUl9FTkFCTEUJMHgwMDAxCS8qIGlmIHRoaXMgaXMgMSwgd2UgY2FuIHRyYW5zbWl0ICovCisjZGVmaW5lCSBUQ1JfUEFEX0VOCTB4MDA4MAkvKiBwYWRzIHNob3J0IHBhY2tldHMgdG8gNjQgYnl0ZXMgKi8KKyNkZWZpbmUgIFRDUl9NT05DU04JMHgwNDAwICAvKiBNb25pdG9yIENhcnJpZXIuICovCisjZGVmaW5lICBUQ1JfRkRVUExYCTB4MDgwMCAgLyogRnVsbCBkdXBsZXggbW9kZS4gKi8KKyNkZWZpbmUJIFRDUl9OT1JNQUwgVENSX0VOQUJMRSB8IFRDUl9QQURfRU4KKworI2RlZmluZSBFUEgJCTIJLyogRXRoZXJuZXQgUHJvdG9jb2wgSGFuZGxlciByZXBvcnQuICovCisjZGVmaW5lICBFUEhfVFhfU1VDCTB4MDAwMQorI2RlZmluZSAgRVBIX1NOR0xDT0wJMHgwMDAyCisjZGVmaW5lICBFUEhfTVVMQ09MCTB4MDAwNAorI2RlZmluZSAgRVBIX0xUWF9NVUxUCTB4MDAwOAorI2RlZmluZSAgRVBIXzE2Q09MCTB4MDAxMAorI2RlZmluZSAgRVBIX1NRRVQJMHgwMDIwCisjZGVmaW5lICBFUEhfTFRYX0JSRAkweDAwNDAKKyNkZWZpbmUgIEVQSF9UWF9ERUZSCTB4MDA4MAorI2RlZmluZSAgRVBIX0xBVF9DT0wJMHgwMjAwCisjZGVmaW5lICBFUEhfTE9TVF9DQVIJMHgwNDAwCisjZGVmaW5lICBFUEhfRVhDX0RFRgkweDA4MDAKKyNkZWZpbmUgIEVQSF9DVFJfUk9MCTB4MTAwMAorI2RlZmluZSAgRVBIX1JYX09WUk4JMHgyMDAwCisjZGVmaW5lICBFUEhfTElOS19PSwkweDQwMDAKKyNkZWZpbmUgIEVQSF9UWF9VTlJOCTB4ODAwMAorI2RlZmluZSBNRU1JTkZPCQk4CS8qIE1lbW9yeSBJbmZvcm1hdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBNRU1DRkcJCTEwCS8qIE1lbW9yeSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisKKy8qIEJhbmsgMSByZWdpc3RlcnMuICovCisjZGVmaW5lIENPTkZJRwkJCTAKKyNkZWZpbmUgIENGR19NSUlfU0VMRUNUCQkweDgwMDAJLyogOTFDMTAwIG9ubHkgKi8KKyNkZWZpbmUgIENGR19OT19XQUlUCQkweDEwMDAKKyNkZWZpbmUgIENGR19GVUxMX1NURVAJCTB4MDQwMAorI2RlZmluZSAgQ0ZHX1NFVF9TUUxDSAkJMHgwMjAwCisjZGVmaW5lICBDRkdfQVVJX1NFTEVDVAkgCTB4MDEwMAorI2RlZmluZSAgQ0ZHXzE2QklUCQkweDAwODAKKyNkZWZpbmUgIENGR19ESVNfTElOSwkJMHgwMDQwCisjZGVmaW5lICBDRkdfU1RBVElDCQkweDAwMzAKKyNkZWZpbmUgIENGR19JUlFfU0VMXzEJCTB4MDAwNAorI2RlZmluZSAgQ0ZHX0lSUV9TRUxfMAkJMHgwMDAyCisjZGVmaW5lIEJBU0VfQUREUgkJMgorI2RlZmluZQlBRERSMAkJCTQKKyNkZWZpbmUJR0VORVJBTAkJCTEwCisjZGVmaW5lCUNPTlRST0wJCQkxMgorI2RlZmluZSAgQ1RMX1NUT1JFCQkweDAwMDEKKyNkZWZpbmUgIENUTF9SRUxPQUQJCTB4MDAwMgorI2RlZmluZSAgQ1RMX0VFX1NFTEVDVAkJMHgwMDA0CisjZGVmaW5lICBDVExfVEVfRU5BQkxFCQkweDAwMjAKKyNkZWZpbmUgIENUTF9DUl9FTkFCTEUJCTB4MDA0MAorI2RlZmluZSAgQ1RMX0xFX0VOQUJMRQkJMHgwMDgwCisjZGVmaW5lICBDVExfQVVUT19SRUxFQVNFCTB4MDgwMAorI2RlZmluZQkgQ1RMX1BPV0VSRE9XTgkJMHgyMDAwCisKKy8qIEJhbmsgMiByZWdpc3RlcnMuICovCisjZGVmaW5lIE1NVV9DTUQJCTAKKyNkZWZpbmUJIE1DX0FMTE9DCTB4MjAgIAkvKiBvciB3aXRoIG51bWJlciBvZiAyNTYgYnl0ZSBwYWNrZXRzICovCisjZGVmaW5lCSBNQ19SRVNFVAkweDQwCisjZGVmaW5lICBNQ19SRUxFQVNFICAJMHg4MCAgCS8qIHJlbW92ZSBhbmQgcmVsZWFzZSB0aGUgY3VycmVudCByeCBwYWNrZXQgKi8KKyNkZWZpbmUgIE1DX0ZSRUVQS1QgIAkweEEwICAJLyogUmVsZWFzZSBwYWNrZXQgaW4gUE5SIHJlZ2lzdGVyICovCisjZGVmaW5lICBNQ19FTlFVRVVFCTB4QzAgCS8qIEVucXVldWUgdGhlIHBhY2tldCBmb3IgdHJhbnNtaXQgKi8KKyNkZWZpbmUJUE5SX0FSUgkJMgorI2RlZmluZSBGSUZPX1BPUlRTCTQKKyNkZWZpbmUgIEZQX1JYRU1QVFkJMHg4MDAwCisjZGVmaW5lCVBPSU5URVIJCTYKKyNkZWZpbmUgIFBUUl9BVVRPX0lOQwkweDAwNDAKKyNkZWZpbmUgIFBUUl9SRUFECTB4MjAwMAorI2RlZmluZQkgUFRSX0FVVE9JTkMgCTB4NDAwMAorI2RlZmluZQkgUFRSX1JDVgkweDgwMDAKKyNkZWZpbmUJREFUQV8xCQk4CisjZGVmaW5lCUlOVEVSUlVQVAkxMgorI2RlZmluZSAgSU1fUkNWX0lOVAkJMHgxCisjZGVmaW5lCSBJTV9UWF9JTlQJCTB4MgorI2RlZmluZQkgSU1fVFhfRU1QVFlfSU5UCTB4NAorI2RlZmluZQkgSU1fQUxMT0NfSU5UCQkweDgKKyNkZWZpbmUJIElNX1JYX09WUk5fSU5UCQkweDEwCisjZGVmaW5lCSBJTV9FUEhfSU5UCQkweDIwCisKKyNkZWZpbmUJUkNSCQk0CitlbnVtIFJ4Q2ZnIHsgUnhBbGxNdWx0aSA9IDB4MDAwNCwgUnhQcm9taXNjID0gMHgwMDAyLAorCSAgICAgUnhFbmFibGUgPSAweDAxMDAsIFJ4U3RyaXBDUkMgPSAweDAyMDB9OworI2RlZmluZSAgUkNSX1NPRlRSRVNFVAkweDgwMDAgCS8qIHJlc2V0cyB0aGUgY2hpcCAqLworI2RlZmluZQkgUkNSX1NUUklQX0NSQwkweDIwMAkvKiBzdHJpcHMgQ1JDICovCisjZGVmaW5lICBSQ1JfRU5BQkxFCTB4MTAwCS8qIElGRiB0aGlzIGlzIHNldCwgd2UgY2FuIHJlY2VpdmUgcGFja2V0cyAqLworI2RlZmluZSAgUkNSX0FMTVVMCTB4NCAJLyogcmVjZWl2ZSBhbGwgbXVsdGljYXN0IHBhY2tldHMgKi8KKyNkZWZpbmUJIFJDUl9QUk9NSVNDCTB4MgkvKiBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCisvKiB0aGUgbm9ybWFsIHNldHRpbmdzIGZvciB0aGUgUkNSIHJlZ2lzdGVyIDogKi8KKyNkZWZpbmUJIFJDUl9OT1JNQUwJKFJDUl9TVFJJUF9DUkMgfCBSQ1JfRU5BQkxFKQorI2RlZmluZSAgUkNSX0NMRUFSCTB4MAkJLyogc2V0IGl0IHRvIGEgYmFzZSBzdGF0ZSAqLworI2RlZmluZQlDT1VOVEVSCQk2CisKKy8qIEJBTksgMyAtLSBub3QgdGhlIHNhbWUgdmFsdWVzIGFzIGluIHNtYzkxOTQhICovCisjZGVmaW5lCU1VTFRJQ0FTVDAJMAorI2RlZmluZQlNVUxUSUNBU1QyCTIKKyNkZWZpbmUJTVVMVElDQVNUNAk0CisjZGVmaW5lCU1VTFRJQ0FTVDYJNgorI2RlZmluZSBNR01UICAgIAk4CisjZGVmaW5lIFJFVklTSU9OCTB4MGEKKworLyogVHJhbnNtaXQgc3RhdHVzIGJpdHMuICovCisjZGVmaW5lIFRTX1NVQ0NFU1MgMHgwMDAxCisjZGVmaW5lIFRTXzE2Q09MICAgMHgwMDEwCisjZGVmaW5lIFRTX0xBVENPTCAgMHgwMjAwCisjZGVmaW5lIFRTX0xPU1RDQVIgMHgwNDAwCisKKy8qIFJlY2VpdmUgc3RhdHVzIGJpdHMuICovCisjZGVmaW5lIFJTX0FMR05FUlIJMHg4MDAwCisjZGVmaW5lIFJTX0JBRENSQwkweDIwMDAKKyNkZWZpbmUgUlNfT0RERlJBTUUJMHgxMDAwCisjZGVmaW5lIFJTX1RPT0xPTkcJMHgwODAwCisjZGVmaW5lIFJTX1RPT1NIT1JUCTB4MDQwMAorI2RlZmluZSBSU19NVUxUSUNBU1QJMHgwMDAxCisjZGVmaW5lIFJTX0VSUk9SUwkoUlNfQUxHTkVSUiB8IFJTX0JBRENSQyB8IFJTX1RPT0xPTkcgfCBSU19UT09TSE9SVCkKKworI2RlZmluZSBzZXRfYml0cyh2LCBwKSBvdXR3KGludyhwKXwodiksIChwKSkKKyNkZWZpbmUgbWFza19iaXRzKHYsIHApIG91dHcoaW53KHApJih2KSwgKHApKQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGRldl9saW5rX3QgKnNtYzkxYzkyX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIHNtYzkxYzkyX2RldGFjaChkZXZfbGlua190ICopOworc3RhdGljIHZvaWQgc21jOTFjOTJfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgc21jOTFjOTJfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgc21jOTFjOTJfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworCitzdGF0aWMgaW50IHNtY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyB2b2lkIHNtY190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgc21jX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzbWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHM5a19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApOworc3RhdGljIHZvaWQgc21jX3NldF94Y3ZyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpZl9wb3J0KTsKK3N0YXRpYyB2b2lkIHNtY19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG1lZGlhX2NoZWNrKHVfbG9uZyBhcmcpOworc3RhdGljIHZvaWQgbWRpb19zeW5jKGtpb19hZGRyX3QgYWRkcik7CitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvYywgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgc21jX2xpbmtfb2soc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBzbWM5MWM5Ml9hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAgd2l0aCBDYXJkIFNlcnZpY2VzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGRldl9saW5rX3QgKnNtYzkxYzkyX2F0dGFjaCh2b2lkKQoreworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBpbnQgcmV0OworCisgICAgREVCVUcoMCwgInNtYzkxYzkyX2F0dGFjaCgpXG4iKTsKKworICAgIC8qIENyZWF0ZSBuZXcgZXRoZXJuZXQgZGV2aWNlICovCisgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBzbWNfcHJpdmF0ZSkpOworICAgIGlmICghZGV2KQorCXJldHVybiBOVUxMOworICAgIHNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAgbGluayA9ICZzbWMtPmxpbms7CisgICAgbGluay0+cHJpdiA9IGRldjsKKworICAgIHNwaW5fbG9ja19pbml0KCZzbWMtPmxvY2spOworICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDE2OworICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSA0OworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworICAgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKyAgICBsaW5rLT5pcnEuSGFuZGxlciA9ICZzbWNfaW50ZXJydXB0OworICAgIGxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5WY2MgPSA1MDsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKworICAgIC8qIFRoZSBTTUM5MWM5Mi1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzbWNfc3RhcnRfeG1pdDsKKyAgICBkZXYtPmdldF9zdGF0cyA9ICZzbWNfZ2V0X3N0YXRzOworICAgIGRldi0+c2V0X2NvbmZpZyA9ICZzOWtfY29uZmlnOworICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOworICAgIGRldi0+b3BlbiA9ICZzbWNfb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmc21jX2Nsb3NlOworICAgIGRldi0+ZG9faW9jdGwgPSAmc21jX2lvY3RsOworICAgIFNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CisjaWZkZWYgSEFWRV9UWF9USU1FT1VUCisgICAgZGV2LT50eF90aW1lb3V0ID0gc21jX3R4X3RpbWVvdXQ7CisgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjZW5kaWYKKworICAgIHNtYy0+bWlpX2lmLmRldiA9IGRldjsKKyAgICBzbWMtPm1paV9pZi5tZGlvX3JlYWQgPSBtZGlvX3JlYWQ7CisgICAgc21jLT5taWlfaWYubWRpb193cml0ZSA9IG1kaW9fd3JpdGU7CisgICAgc21jLT5taWlfaWYucGh5X2lkX21hc2sgPSAweDFmOworICAgIHNtYy0+bWlpX2lmLnJlZ19udW1fbWFzayA9IDB4MWY7CisKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZzbWM5MWM5Ml9ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKyAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCXNtYzkxYzkyX2RldGFjaChsaW5rKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbGluazsKK30gLyogc21jOTFjOTJfYXR0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAgICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICAgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNtYzkxYzkyX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGRldl9saW5rX3QgKipsaW5rcDsKKworICAgIERFQlVHKDAsICJzbWM5MWM5Ml9kZXRhY2goMHglcClcbiIsIGxpbmspOworCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisgICAgaWYgKCpsaW5rcCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmIChsaW5rLT5kZXYpCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJc21jOTFjOTJfcmVsZWFzZShsaW5rKTsKKworICAgIGlmIChsaW5rLT5oYW5kbGUpCisJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBiaXRzICovCisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBmcmVlX25ldGRldihkZXYpOworfSAvKiBzbWM5MWM5Ml9kZXRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgY3Z0X2FzY2lpX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqcykKK3sKKyAgICBpbnQgaSwgaiwgZGEsIGM7CisKKyAgICBpZiAoc3RybGVuKHMpICE9IDEyKQorCXJldHVybiAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJZGEgPSAwOworCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkgICAgYyA9ICpzKys7CisJICAgIGRhIDw8PSA0OworCSAgICBkYSArPSAoKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSA/CisJCShjIC0gJzAnKSA6ICgoYyAmIDB4MGYpICsgOSk7CisJfQorCWRldi0+ZGV2X2FkZHJbaV0gPSBkYTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGZpcnN0X3R1cGxlKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLAorCQljaXNwYXJzZV90ICpwYXJzZSkKK3sKKwlpbnQgaTsKKworCWlmICgoaSA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSkpICE9IENTX1NVQ0NFU1MgfHwKKwkJCShpID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgdHVwbGUpKSAhPSBDU19TVUNDRVNTKQorCQlyZXR1cm4gaTsKKwlyZXR1cm4gcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgdHVwbGUsIHBhcnNlKTsKK30KKworc3RhdGljIGludCBuZXh0X3R1cGxlKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLAorCQljaXNwYXJzZV90ICpwYXJzZSkKK3sKKwlpbnQgaTsKKworCWlmICgoaSA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsIHR1cGxlKSkgIT0gQ1NfU1VDQ0VTUyB8fAorCQkJKGkgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCB0dXBsZSkpICE9IENTX1NVQ0NFU1MpCisJCXJldHVybiBpOworCXJldHVybiBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIENvbmZpZ3VyYXRpb24gc3R1ZmYgZm9yIE1lZ2FoZXJ0eiBjYXJkcworCisgICAgbWh6XzMyODhfcG93ZXIoKSBpcyB1c2VkIHRvIHBvd2VyIHVwIGEgMzI4OCdzIGV0aGVybmV0IGNoaXAuCisgICAgbWh6X21mY19jb25maWcoKSBoYW5kbGVzIHNvY2tldCBzZXR1cCBmb3IgbXVsdGlmdW5jdGlvbiAoMTE0NAorICAgIGFuZCAzMjg4KSBjYXJkcy4gIG1oel9zZXR1cCgpIGdldHMgYSBjYXJkJ3MgaGFyZHdhcmUgZXRoZXJuZXQKKyAgICBhZGRyZXNzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBtaHpfMzI4OF9wb3dlcihkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgdG1wOworCisgICAgLyogUmVhZCB0aGUgSVNSIHR3aWNlLi4uICovCisgICAgcmVhZGIoc21jLT5iYXNlK01FR0FIRVJUWl9JU1IpOworICAgIHVkZWxheSg1KTsKKyAgICByZWFkYihzbWMtPmJhc2UrTUVHQUhFUlRaX0lTUik7CisKKyAgICAvKiBQYXVzZSAyMDBtcy4uLiAqLworICAgIG1kZWxheSgyMDApOworCisgICAgLyogTm93IHJlYWQgYW5kIHdyaXRlIHRoZSBDT1IuLi4gKi8KKyAgICB0bXAgPSByZWFkYihzbWMtPmJhc2UgKyBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgKyBDSVNSRUdfQ09SKTsKKyAgICB1ZGVsYXkoNSk7CisgICAgd3JpdGViKHRtcCwgc21jLT5iYXNlICsgbGluay0+Y29uZi5Db25maWdCYXNlICsgQ0lTUkVHX0NPUik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaHpfbWZjX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgdV9jaGFyIGJ1ZlsyNTVdOworICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmID0gJnBhcnNlLmNmdGFibGVfZW50cnk7CisgICAgd2luX3JlcV90IHJlcTsKKyAgICBtZW1yZXFfdCBtZW07CisgICAgaW50IGksIGs7CisKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKKyAgICBsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0KKwlJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkd8SVJRX0ZJUlNUX1NIQVJFRHxJUlFfSEFORExFX1BSRVNFTlQ7CisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSAxNjsKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OworICAgIGxpbmstPmlvLk51bVBvcnRzMiA9IDg7CisKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisKKyAgICBpID0gZmlyc3RfdHVwbGUobGluay0+aGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisgICAgLyogVGhlIE1lZ2FoZXJ0eiBjb21ibyBjYXJkcyBoYXZlIG1vZGVtLWxpa2UgQ0lTIGVudHJpZXMsIHNvCisgICAgICAgd2UgaGF2ZSB0byBleHBsaWNpdGx5IHRyeSBhIGJ1bmNoIG9mIHBvcnQgY29tYmluYXRpb25zLiAqLworICAgIHdoaWxlIChpID09IENTX1NVQ0NFU1MpIHsKKwlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2YtPmluZGV4OworCWxpbmstPmlvLkJhc2VQb3J0MiA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwlmb3IgKGsgPSAwOyBrIDwgMHg0MDA7IGsgKz0gMHgxMCkgeworCSAgICBpZiAoayAmIDB4ODApIGNvbnRpbnVlOworCSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBrIF4gMHgzMDA7CisJICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJICAgIGlmIChpID09IENTX1NVQ0NFU1MpIGJyZWFrOworCX0KKwlpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKKwlpID0gbmV4dF90dXBsZShsaW5rLT5oYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsKKyAgICB9CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykKKwlyZXR1cm4gaTsKKyAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKworICAgIC8qIEFsbG9jYXRlIGEgbWVtb3J5IHdpbmRvdywgZm9yIGFjY2Vzc2luZyB0aGUgSVNSICovCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84fFdJTl9NRU1PUllfVFlQRV9BTXxXSU5fRU5BQkxFOworICAgIHJlcS5CYXNlID0gcmVxLlNpemUgPSAwOworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IDA7CisgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKTsKKyAgICBpZiAoaSAhPSBDU19TVUNDRVNTKQorCXJldHVybiBpOworICAgIHNtYy0+YmFzZSA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKKyAgICBtZW0uQ2FyZE9mZnNldCA9IG1lbS5QYWdlID0gMDsKKyAgICBpZiAoc21jLT5tYW5maWQgPT0gTUFORklEX01PVE9ST0xBKQorCW1lbS5DYXJkT2Zmc2V0ID0gbGluay0+Y29uZi5Db25maWdCYXNlOworICAgIGkgPSBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmstPndpbiwgJm1lbSk7CisKKyAgICBpZiAoKGkgPT0gQ1NfU1VDQ0VTUykKKwkmJiAoc21jLT5tYW5maWQgPT0gTUFORklEX01FR0FIRVJUWikKKwkmJiAoc21jLT5jYXJkaWQgPT0gUFJPRElEX01FR0FIRVJUWl9FTTMyODgpKQorCW1oel8zMjg4X3Bvd2VyKGxpbmspOworCisgICAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgbWh6X3NldHVwKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgdV9jaGFyIGJ1ZlsyNTVdLCAqc3RhdGlvbl9hZGRyOworCisgICAgdHVwbGUuQXR0cmlidXRlcyA9IHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisKKyAgICAvKiBSZWFkIHRoZSBzdGF0aW9uIGFkZHJlc3MgZnJvbSB0aGUgQ0lTLiAgSXQgaXMgc3RvcmVkIGFzIHRoZSBsYXN0CisgICAgICAgKGZvdXJ0aCkgc3RyaW5nIGluIHRoZSBWZXJzaW9uIDEgVmVyc2lvbi9JRCB0dXBsZS4gKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOworICAgIGlmIChmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSAhPSBDU19TVUNDRVNTKQorCXJldHVybiAtMTsKKyAgICAvKiBVZ2ggLS0gdGhlIEVNMTE0NCBjYXJkIGhhcyB0d28gVkVSU18xIHR1cGxlcyE/ISAqLworICAgIGlmIChuZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IENTX1NVQ0NFU1MpCisJZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisgICAgaWYgKHBhcnNlLnZlcnNpb25fMS5ucyA+IDMpIHsKKwlzdGF0aW9uX2FkZHIgPSBwYXJzZS52ZXJzaW9uXzEuc3RyICsgcGFyc2UudmVyc2lvbl8xLm9mc1szXTsKKwlpZiAoY3Z0X2FzY2lpX2FkZHJlc3MoZGV2LCBzdGF0aW9uX2FkZHIpID09IDApCisJICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIEFub3RoZXIgcG9zc2liaWxpdHk6IGZvciB0aGUgRU0zMjg4LCBpbiBhIHNwZWNpYWwgdHVwbGUgKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSAweDgxOworICAgIGlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSAhPSBDU19TVUNDRVNTKQorCXJldHVybiAtMTsKKyAgICBpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSAhPSBDU19TVUNDRVNTKQorCXJldHVybiAtMTsKKyAgICBidWZbMTJdID0gJ1wwJzsKKyAgICBpZiAoY3Z0X2FzY2lpX2FkZHJlc3MoZGV2LCBidWYpID09IDApCisJcmV0dXJuIDA7CisKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQ29uZmlndXJhdGlvbiBzdHVmZiBmb3IgdGhlIE1vdG9yb2xhIE1hcmluZXIKKworICAgIG1vdF9jb25maWcoKSB3cml0ZXMgZGlyZWN0bHkgdG8gdGhlIE1hcmluZXIgY29uZmlndXJhdGlvbgorICAgIHJlZ2lzdGVycyBiZWNhdXNlIHRoZSBDSVMgaXMganVzdCBib2d1cy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIG1vdF9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBraW9fYWRkcl90IGlvdWFydCA9IGxpbmstPmlvLkJhc2VQb3J0MjsKKworICAgIC8qIFNldCBVQVJUIGJhc2UgYWRkcmVzcyBhbmQgZm9yY2UgbWFwIHdpdGggQ09SIGJpdCAxICovCisgICAgd3JpdGViKGlvdWFydCAmIDB4ZmYsICAgICAgICBzbWMtPmJhc2UgKyBNT1RfVUFSVCArIENJU1JFR19JT0JBU0VfMCk7CisgICAgd3JpdGViKChpb3VhcnQgPj4gOCkgJiAweGZmLCBzbWMtPmJhc2UgKyBNT1RfVUFSVCArIENJU1JFR19JT0JBU0VfMSk7CisgICAgd3JpdGViKE1PVF9OT1JNQUwsICAgICAgICAgICBzbWMtPmJhc2UgKyBNT1RfVUFSVCArIENJU1JFR19DT1IpOworCisgICAgLyogU2V0IFNNQyBiYXNlIGFkZHJlc3MgYW5kIGZvcmNlIG1hcCB3aXRoIENPUiBiaXQgMSAqLworICAgIHdyaXRlYihpb2FkZHIgJiAweGZmLCAgICAgICAgc21jLT5iYXNlICsgTU9UX0xBTiArIENJU1JFR19JT0JBU0VfMCk7CisgICAgd3JpdGViKChpb2FkZHIgPj4gOCkgJiAweGZmLCBzbWMtPmJhc2UgKyBNT1RfTEFOICsgQ0lTUkVHX0lPQkFTRV8xKTsKKyAgICB3cml0ZWIoTU9UX05PUk1BTCwgICAgICAgICAgIHNtYy0+YmFzZSArIE1PVF9MQU4gKyBDSVNSRUdfQ09SKTsKKworICAgIC8qIFdhaXQgZm9yIHRoaW5ncyB0byBzZXR0bGUgZG93biAqLworICAgIG1kZWxheSgxMDApOworfQorCitzdGF0aWMgaW50IG1vdF9zZXR1cChkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGksIHdhaXQsIGxvb3A7CisgICAgdV9pbnQgYWRkcjsKKworICAgIC8qIFJlYWQgRXRoZXJuZXQgYWRkcmVzcyBmcm9tIFNlcmlhbCBFRVBST00gKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwlTTUNfU0VMRUNUX0JBTksoMik7CisJb3V0dyhNT1RfRUVQUk9NICsgaSwgaW9hZGRyICsgUE9JTlRFUik7CisJU01DX1NFTEVDVF9CQU5LKDEpOworCW91dHcoKENUTF9SRUxPQUQgfCBDVExfRUVfU0VMRUNUKSwgaW9hZGRyICsgQ09OVFJPTCk7CisKKwlmb3IgKGxvb3AgPSB3YWl0ID0gMDsgbG9vcCA8IDIwMDsgbG9vcCsrKSB7CisJICAgIHVkZWxheSgxMCk7CisJICAgIHdhaXQgPSAoKENUTF9SRUxPQUQgfCBDVExfU1RPUkUpICYgaW53KGlvYWRkciArIENPTlRST0wpKTsKKwkgICAgaWYgKHdhaXQgPT0gMCkgYnJlYWs7CisJfQorCQorCWlmICh3YWl0KQorCSAgICByZXR1cm4gLTE7CisJCisJYWRkciA9IGludyhpb2FkZHIgKyBHRU5FUkFMKTsKKwlkZXYtPmRldl9hZGRyWzIqaV0gICA9IGFkZHIgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbMippKzFdID0gKGFkZHIgPj4gOCkgJiAweGZmOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBzbWNfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIHVfY2hhciBidWZbMjU1XTsKKyAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiA9ICZwYXJzZS5jZnRhYmxlX2VudHJ5OworICAgIGludCBpOworCisgICAgdHVwbGUuQXR0cmlidXRlcyA9IHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCisgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTY7CisgICAgaSA9IGZpcnN0X3R1cGxlKGxpbmstPmhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOworICAgIHdoaWxlIChpICE9IENTX05PX01PUkVfSVRFTVMpIHsKKwlpZiAoaSA9PSBDU19TVUNDRVNTKSB7CisJICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZi0+aW5kZXg7CisJICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwkgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSBjZi0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKKwkgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwkgICAgaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CisJfQorCWkgPSBuZXh0X3R1cGxlKGxpbmstPmhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOworICAgIH0KKyAgICBpZiAoaSA9PSBDU19TVUNDRVNTKQorCWRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworICAgIHJldHVybiBpOworfQorCitzdGF0aWMgaW50IHNtY19zZXR1cChkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIGNpc3RwbF9sYW5fbm9kZV9pZF90ICpub2RlX2lkOworICAgIHVfY2hhciBidWZbMjU1XSwgKnN0YXRpb25fYWRkcjsKKyAgICBpbnQgaTsKKworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworCisgICAgLyogQ2hlY2sgZm9yIGEgTEFOIGZ1bmN0aW9uIGV4dGVuc2lvbiB0dXBsZSAqLworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9GVU5DRTsKKyAgICBpID0gZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisgICAgd2hpbGUgKGkgPT0gQ1NfU1VDQ0VTUykgeworCWlmIChwYXJzZS5mdW5jZS50eXBlID09IENJU1RQTF9GVU5DRV9MQU5fTk9ERV9JRCkKKwkgICAgYnJlYWs7CisJaSA9IG5leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisgICAgfQorICAgIGlmIChpID09IENTX1NVQ0NFU1MpIHsKKwlub2RlX2lkID0gKGNpc3RwbF9sYW5fbm9kZV9pZF90ICopcGFyc2UuZnVuY2UuZGF0YTsKKwlpZiAobm9kZV9pZC0+bmIgPT0gNikgeworCSAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gbm9kZV9pZC0+aWRbaV07CisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisgICAgLyogVHJ5IHRoZSB0aGlyZCBzdHJpbmcgaW4gdGhlIFZlcnNpb24gMSBWZXJzaW9uL0lEIHR1cGxlLiAqLworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7CisgICAgaWYgKGZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IENTX1NVQ0NFU1MpCisJcmV0dXJuIC0xOworICAgIHN0YXRpb25fYWRkciA9IHBhcnNlLnZlcnNpb25fMS5zdHIgKyBwYXJzZS52ZXJzaW9uXzEub2ZzWzJdOworICAgIGlmIChjdnRfYXNjaWlfYWRkcmVzcyhkZXYsIHN0YXRpb25fYWRkcikgPT0gMCkKKwlyZXR1cm4gMDsKKworICAgIHJldHVybiAtMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgb3NpX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHN0YXRpYyBraW9fYWRkcl90IGNvbVs0XSA9IHsgMHgzZjgsIDB4MmY4LCAweDNlOCwgMHgyZTggfTsKKyAgICBpbnQgaSwgajsKKworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOworICAgIGxpbmstPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPQorCUlSUV9UWVBFX0RZTkFNSUNfU0hBUklOR3xJUlFfRklSU1RfU0hBUkVEfElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSA2NDsKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OworICAgIGxpbmstPmlvLk51bVBvcnRzMiA9IDg7CisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSAxNjsKKworICAgIC8qIEVuYWJsZSBIYXJkIERlY29kZSwgTEFOLCBNb2RlbSAqLworICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDIzOworCisgICAgZm9yIChpID0gaiA9IDA7IGogPCA0OyBqKyspIHsKKwlsaW5rLT5pby5CYXNlUG9ydDIgPSBjb21bal07CisJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKKyAgICB9CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCS8qIEZhbGxiYWNrOiB0dXJuIG9mZiBoYXJkIGRlY29kZSAqLworCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDAzOworCWxpbmstPmlvLk51bVBvcnRzMiA9IDA7CisJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICB9CisgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDEgKyAweDEwOworICAgIHJldHVybiBpOworfQorCitzdGF0aWMgaW50IG9zaV9zZXR1cChkZXZfbGlua190ICpsaW5rLCB1X3Nob3J0IG1hbmZpZCwgdV9zaG9ydCBjYXJkaWQpCit7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIHVfY2hhciBidWZbMjU1XTsKKyAgICBpbnQgaTsKKworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisKKyAgICAvKiBSZWFkIHRoZSBzdGF0aW9uIGFkZHJlc3MgZnJvbSB0dXBsZSAweDkwLCBzdWJ0dXBsZSAweDA0ICovCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gMHg5MDsKKyAgICBpID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSk7CisgICAgd2hpbGUgKGkgPT0gQ1NfU1VDQ0VTUykgeworCWkgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpOworCWlmICgoaSAhPSBDU19TVUNDRVNTKSB8fCAoYnVmWzBdID09IDB4MDQpKQorCSAgICBicmVhazsKKwlpID0gcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKTsKKyAgICB9CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykKKwlyZXR1cm4gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlkZXYtPmRldl9hZGRyW2ldID0gYnVmW2krMl07CisKKyAgICBpZiAoKChtYW5maWQgPT0gTUFORklEX09TSVRFQ0gpICYmCisJIChjYXJkaWQgPT0gUFJPRElEX09TSVRFQ0hfU0VWRU4pKSB8fAorCSgobWFuZmlkID09IE1BTkZJRF9QU0lPTikgJiYKKwkgKGNhcmRpZCA9PSBQUk9ESURfUFNJT05fTkVUMTAwKSkpIHsKKwkvKiBEb3dubG9hZCB0aGUgU2V2ZW4gb2YgRGlhbW9uZHMgZmlybXdhcmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKF9fWGlsaW54N09EKTsgaSsrKSB7CisJICAgIG91dGIoX19YaWxpbng3T0RbaV0sIGxpbmstPmlvLkJhc2VQb3J0MSsyKTsKKwkgICAgdWRlbGF5KDUwKTsKKwl9CisgICAgfSBlbHNlIGlmIChtYW5maWQgPT0gTUFORklEX09TSVRFQ0gpIHsKKwkvKiBNYWtlIHN1cmUgYm90aCBmdW5jdGlvbnMgYXJlIHBvd2VyZWQgdXAgKi8KKwlzZXRfYml0cygweDMwMCwgbGluay0+aW8uQmFzZVBvcnQxICsgT1NJVEVDSF9BVUlfUFdSKTsKKwkvKiBOb3csIHR1cm4gb24gdGhlIGludGVycnVwdCBmb3IgYm90aCBjYXJkIGZ1bmN0aW9ucyAqLworCXNldF9iaXRzKDB4MzAwLCBsaW5rLT5pby5CYXNlUG9ydDEgKyBPU0lURUNIX1JFU0VUX0lTUik7CisJREVCVUcoMiwgIkFVSS9QV1I6ICU0LjR4IFJFU0VUL0lTUjogJTQuNHhcbiIsCisJICAgICAgaW53KGxpbmstPmlvLkJhc2VQb3J0MSArIE9TSVRFQ0hfQVVJX1BXUiksCisJICAgICAgaW53KGxpbmstPmlvLkJhc2VQb3J0MSArIE9TSVRFQ0hfUkVTRVRfSVNSKSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhpcyB2ZXJpZmllcyB0aGF0IHRoZSBjaGlwIGlzIHNvbWUgU01DOTFjWFggdmFyaWFudCwgYW5kIHJldHVybnMKKyAgICB0aGUgcmV2aXNpb24gY29kZSBpZiBzdWNjZXNzZnVsLiAgT3RoZXJ3aXNlLCBpdCByZXR1cm5zIC1FTk9ERVYuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGNoZWNrX3NpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IHdpZHRoOworICAgIHVfc2hvcnQgczsKKworICAgIFNNQ19TRUxFQ1RfQkFOSygxKTsKKyAgICBpZiAoaW53KGlvYWRkciArIEJBTktfU0VMRUNUKSA+PiA4ICE9IDB4MzMpIHsKKwkvKiBUcnkgcG93ZXJpbmcgdXAgdGhlIGNoaXAgKi8KKwlvdXR3KDAsIGlvYWRkciArIENPTlRST0wpOworCW1kZWxheSg1NSk7CisgICAgfQorCisgICAgLyogVHJ5IHNldHRpbmcgYnVzIHdpZHRoICovCisgICAgd2lkdGggPSAobGluay0+aW8uQXR0cmlidXRlczEgPT0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE8pOworICAgIHMgPSBpbmIoaW9hZGRyICsgQ09ORklHKTsKKyAgICBpZiAod2lkdGgpCisJcyB8PSBDRkdfMTZCSVQ7CisgICAgZWxzZQorCXMgJj0gfkNGR18xNkJJVDsKKyAgICBvdXRiKHMsIGlvYWRkciArIENPTkZJRyk7CisKKyAgICAvKiBDaGVjayBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgdG8gbWFrZSBzdXJlIGJ1cyB3aWR0aCBpcyBPSyAqLworICAgIHMgPSBpbncoaW9hZGRyICsgQkFTRV9BRERSKTsKKyAgICBpZiAoKGludyhpb2FkZHIgKyBCQU5LX1NFTEVDVCkgPj4gOCA9PSAweDMzKSAmJgorCSgocyA+PiA4KSAhPSAocyAmIDB4ZmYpKSkgeworCVNNQ19TRUxFQ1RfQkFOSygzKTsKKwlzID0gaW53KGlvYWRkciArIFJFVklTSU9OKTsKKwlyZXR1cm4gKHMgJiAweGZmKTsKKyAgICB9CisKKyAgICBpZiAod2lkdGgpIHsKKwlldmVudF9jYWxsYmFja19hcmdzX3QgYXJnczsKKwlwcmludGsoS0VSTl9JTkZPICJzbWM5MWM5Ml9jczogdXNpbmcgOC1iaXQgSU8gd2luZG93LlxuIik7CisJYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisJc21jOTFjOTJfZXZlbnQoQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwsIDAsICZhcmdzKTsKKwlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwlwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJc21jOTFjOTJfZXZlbnQoQ1NfRVZFTlRfQ0FSRF9SRVNFVCwgMCwgJmFyZ3MpOworCXJldHVybiBjaGVja19zaWcobGluayk7CisgICAgfQorICAgIHJldHVybiAtRU5PREVWOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIHNtYzkxYzkyX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorICAgIGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICAgIGV0aGVybmV0IGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1NfRVhJVF9URVNUKHJldCwgc3ZjLCBsYWJlbCkgXAoraWYgKHJldCAhPSBDU19TVUNDRVNTKSB7IGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgc3ZjLCByZXQpOyBnb3RvIGxhYmVsOyB9CisKK3N0YXRpYyB2b2lkIHNtYzkxYzkyX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICB1X3Nob3J0IGJ1ZlszMl07CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgaSwgaiwgcmV2OworICAgIGtpb19hZGRyX3QgaW9hZGRyOworICAgIHVfbG9uZyBtaXI7CisKKyAgICBERUJVRygwLCAic21jOTFjOTJfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgaSA9IGZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOworICAgIENTX0VYSVRfVEVTVChpLCBQYXJzZVR1cGxlLCBjb25maWdfZmFpbGVkKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOworICAgIGlmIChmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSA9PSBDU19TVUNDRVNTKSB7CisJc21jLT5tYW5maWQgPSBwYXJzZS5tYW5maWQubWFuZjsKKwlzbWMtPmNhcmRpZCA9IHBhcnNlLm1hbmZpZC5jYXJkOworICAgIH0KKworICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIGlmICgoc21jLT5tYW5maWQgPT0gTUFORklEX09TSVRFQ0gpICYmCisJKHNtYy0+Y2FyZGlkICE9IFBST0RJRF9PU0lURUNIX1NFVkVOKSkgeworCWkgPSBvc2lfY29uZmlnKGxpbmspOworICAgIH0gZWxzZSBpZiAoKHNtYy0+bWFuZmlkID09IE1BTkZJRF9NT1RPUk9MQSkgfHwKKwkgICAgICAgKChzbWMtPm1hbmZpZCA9PSBNQU5GSURfTUVHQUhFUlRaKSAmJgorCQkoKHNtYy0+Y2FyZGlkID09IFBST0RJRF9NRUdBSEVSVFpfVkFSSU9VUykgfHwKKwkJIChzbWMtPmNhcmRpZCA9PSBQUk9ESURfTUVHQUhFUlRaX0VNMzI4OCkpKSkgeworCWkgPSBtaHpfbWZjX2NvbmZpZyhsaW5rKTsKKyAgICB9IGVsc2UgeworCWkgPSBzbWNfY29uZmlnKGxpbmspOworICAgIH0KKyAgICBDU19FWElUX1RFU1QoaSwgUmVxdWVzdElPLCBjb25maWdfZmFpbGVkKTsKKworICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKyAgICBDU19FWElUX1RFU1QoaSwgUmVxdWVzdElSUSwgY29uZmlnX2ZhaWxlZCk7CisgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisgICAgQ1NfRVhJVF9URVNUKGksIFJlcXVlc3RDb25maWd1cmF0aW9uLCBjb25maWdfZmFpbGVkKTsKKworICAgIGlmIChzbWMtPm1hbmZpZCA9PSBNQU5GSURfTU9UT1JPTEEpCisJbW90X2NvbmZpZyhsaW5rKTsKKworICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworCisgICAgaWYgKChpZl9wb3J0ID49IDApICYmIChpZl9wb3J0IDw9IDIpKQorCWRldi0+aWZfcG9ydCA9IGlmX3BvcnQ7CisgICAgZWxzZQorCXByaW50ayhLRVJOX05PVElDRSAic21jOTFjOTJfY3M6IGludmFsaWQgaWZfcG9ydCByZXF1ZXN0ZWRcbiIpOworCisgICAgc3dpdGNoIChzbWMtPm1hbmZpZCkgeworICAgIGNhc2UgTUFORklEX09TSVRFQ0g6CisgICAgY2FzZSBNQU5GSURfUFNJT046CisJaSA9IG9zaV9zZXR1cChsaW5rLCBzbWMtPm1hbmZpZCwgc21jLT5jYXJkaWQpOyBicmVhazsKKyAgICBjYXNlIE1BTkZJRF9TTUM6CisgICAgY2FzZSBNQU5GSURfTkVXX01FRElBOgorCWkgPSBzbWNfc2V0dXAobGluayk7IGJyZWFrOworICAgIGNhc2UgMHgxMjg6IC8qIEZvciBicm9rZW4gTWVnYWhlcnR6IGNhcmRzICovCisgICAgY2FzZSBNQU5GSURfTUVHQUhFUlRaOgorCWkgPSBtaHpfc2V0dXAobGluayk7IGJyZWFrOworICAgIGNhc2UgTUFORklEX01PVE9ST0xBOgorICAgIGRlZmF1bHQ6IC8qIGdldCB0aGUgaHcgYWRkcmVzcyBmcm9tIEVFUFJPTSAqLworCWkgPSBtb3Rfc2V0dXAobGluayk7IGJyZWFrOworICAgIH0KKworICAgIGlmIChpICE9IDApIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgInNtYzkxYzkyX2NzOiBVbmFibGUgdG8gZmluZCBoYXJkd2FyZSBhZGRyZXNzLlxuIik7CisJZ290byBjb25maWdfdW5kbzsKKyAgICB9CisKKyAgICBzbWMtPmR1cGxleCA9IDA7CisgICAgc21jLT5yeF9vdnJuID0gMDsKKworICAgIHJldiA9IGNoZWNrX3NpZyhsaW5rKTsKKyAgICBuYW1lID0gIj8/PyI7CisgICAgaWYgKHJldiA+IDApCisJc3dpdGNoIChyZXYgPj4gNCkgeworCWNhc2UgMzogbmFtZSA9ICI5MiI7IGJyZWFrOworCWNhc2UgNDogbmFtZSA9ICgocmV2ICYgMTUpID49IDYpID8gIjk2IiA6ICI5NCI7IGJyZWFrOworCWNhc2UgNTogbmFtZSA9ICI5NSI7IGJyZWFrOworCWNhc2UgNzogbmFtZSA9ICIxMDAiOyBicmVhazsKKwljYXNlIDg6IG5hbWUgPSAiMTAwLUZEIjsgYnJlYWs7CisJY2FzZSA5OiBuYW1lID0gIjExMCI7IGJyZWFrOworCX0KKworICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGlmIChyZXYgPiAwKSB7CisJdV9sb25nIG1jcjsKKwlTTUNfU0VMRUNUX0JBTksoMCk7CisJbWlyID0gaW53KGlvYWRkciArIE1FTUlORk8pICYgMHhmZjsKKwlpZiAobWlyID09IDB4ZmYpIG1pcisrOworCS8qIEdldCBzY2FsZSBmYWN0b3IgZm9yIG1lbW9yeSBzaXplICovCisJbWNyID0gKChyZXYgPj4gNCkgPiAzKSA/IGludyhpb2FkZHIgKyBNRU1DRkcpIDogMHgwMjAwOworCW1pciAqPSAxMjggKiAoMTw8KChtY3IgPj4gOSkgJiA3KSk7CisJU01DX1NFTEVDVF9CQU5LKDEpOworCXNtYy0+Y2ZnID0gaW53KGlvYWRkciArIENPTkZJRykgJiB+Q0ZHX0FVSV9TRUxFQ1Q7CisJc21jLT5jZmcgfD0gQ0ZHX05PX1dBSVQgfCBDRkdfMTZCSVQgfCBDRkdfU1RBVElDOworCWlmIChzbWMtPm1hbmZpZCA9PSBNQU5GSURfT1NJVEVDSCkKKwkgICAgc21jLT5jZmcgfD0gQ0ZHX0lSUV9TRUxfMSB8IENGR19JUlFfU0VMXzA7CisJaWYgKChyZXYgPj4gNCkgPj0gNykKKwkgICAgc21jLT5jZmcgfD0gQ0ZHX01JSV9TRUxFQ1Q7CisgICAgfSBlbHNlCisJbWlyID0gMDsKKworICAgIGlmIChzbWMtPmNmZyAmIENGR19NSUlfU0VMRUNUKSB7CisJU01DX1NFTEVDVF9CQU5LKDMpOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkgICAgaiA9IG1kaW9fcmVhZChkZXYsIGksIDEpOworCSAgICBpZiAoKGogIT0gMCkgJiYgKGogIT0gMHhmZmZmKSkgYnJlYWs7CisJfQorCXNtYy0+bWlpX2lmLnBoeV9pZCA9IChpIDwgMzIpID8gaSA6IC0xOworCisJU01DX1NFTEVDVF9CQU5LKDApOworICAgIH0KKworICAgIGxpbmstPmRldiA9ICZzbWMtPm5vZGU7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCisgICAgaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwlwcmludGsoS0VSTl9FUlIgInNtYzkxYzkyX2NzOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworCWxpbmstPmRldiA9IE5VTEw7CisJZ290byBjb25maWdfdW5kbzsKKyAgICB9CisKKyAgICBzdHJjcHkoc21jLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNtYzkxYyVzIHJldiAlZDogaW8gJSMzbHgsIGlycSAlZCwgIgorCSAgICJod19hZGRyICIsIGRldi0+bmFtZSwgbmFtZSwgKHJldiAmIDB4MGYpLCBkZXYtPmJhc2VfYWRkciwKKwkgICBkZXYtPmlycSk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlwcmludGsoIiUwMlglcyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaTw1KSA/ICI6IiA6ICJcbiIpKTsKKworICAgIGlmIChyZXYgPiAwKSB7CisJaWYgKG1pciAmIDB4M2ZmKQorCSAgICBwcmludGsoS0VSTl9JTkZPICIgICVsdSBieXRlIiwgbWlyKTsKKwllbHNlCisJICAgIHByaW50ayhLRVJOX0lORk8gIiAgJWx1IGtiIiwgbWlyPj4xMCk7CisJcHJpbnRrKCIgYnVmZmVyLCAlcyB4Y3ZyXG4iLCAoc21jLT5jZmcgJiBDRkdfTUlJX1NFTEVDVCkgPworCSAgICAgICAiTUlJIiA6IGlmX25hbWVzW2Rldi0+aWZfcG9ydF0pOworICAgIH0KKworICAgIGlmIChzbWMtPmNmZyAmIENGR19NSUlfU0VMRUNUKSB7CisJaWYgKHNtYy0+bWlpX2lmLnBoeV9pZCAhPSAtMSkgeworCSAgICBERUJVRygwLCAiICBNSUkgdHJhbnNjZWl2ZXIgYXQgaW5kZXggJWQsIHN0YXR1cyAleC5cbiIsCisJCSAgc21jLT5taWlfaWYucGh5X2lkLCBqKTsKKwl9IGVsc2UgeworICAgIAkgICAgcHJpbnRrKEtFUk5fTk9USUNFICIgIE5vIE1JSSB0cmFuc2NlaXZlcnMgZm91bmQhXG4iKTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuOworCitjb25maWdfdW5kbzoKKyAgICB1bnJlZ2lzdGVyX25ldGRldihkZXYpOworY29uZmlnX2ZhaWxlZDoJCQkvKiBDU19FWElUX1RFU1QoKSBjYWxscyBqdW1wIHRvIGhlcmUuLi4gKi8KKyAgICBzbWM5MWM5Ml9yZWxlYXNlKGxpbmspOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisKK30gLyogc21jOTFjOTJfY29uZmlnICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIHNtYzkxYzkyX3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc21jOTFjOTJfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworCisgICAgREVCVUcoMCwgInNtYzkxYzkyX3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKyAgICBpZiAobGluay0+d2luKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisJc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCWlvdW5tYXAoc21jLT5iYXNlKTsKKwlwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKyAgICB9CisKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAgICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuICBBIENBUkRfUkVNT1ZBTCBldmVudAorICAgIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgICAgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgc21jOTFjOTJfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgaTsKKworICAgIERFQlVHKDEsICJzbWM5MWM5Ml9ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICAgIG5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCXNtYzkxYzkyX2NvbmZpZyhsaW5rKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIGlmIChsaW5rLT5vcGVuKQorCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIGlmICgoc21jLT5tYW5maWQgPT0gTUFORklEX01FR0FIRVJUWikgJiYKKwkJKHNtYy0+Y2FyZGlkID09IFBST0RJRF9NRUdBSEVSVFpfRU0zMjg4KSkKKwkJbWh6XzMyODhfcG93ZXIobGluayk7CisJICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJICAgIGlmIChzbWMtPm1hbmZpZCA9PSBNQU5GSURfTU9UT1JPTEEpCisJCW1vdF9jb25maWcobGluayk7CisJICAgIGlmICgoc21jLT5tYW5maWQgPT0gTUFORklEX09TSVRFQ0gpICYmCisJCShzbWMtPmNhcmRpZCAhPSBQUk9ESURfT1NJVEVDSF9TRVZFTikpIHsKKwkJLyogUG93ZXIgdXAgdGhlIGNhcmQgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCXNldF9iaXRzKDB4MDMwMCwgZGV2LT5iYXNlX2FkZHItMHgxMCtPU0lURUNIX0FVSV9QV1IpOworCQlzZXRfYml0cygweDAzMDAsIGRldi0+YmFzZV9hZGRyLTB4MTArT1NJVEVDSF9SRVNFVF9JU1IpOworCSAgICB9CisJICAgIGlmICgoKHNtYy0+bWFuZmlkID09IE1BTkZJRF9PU0lURUNIKSAmJgorCSAJKHNtYy0+Y2FyZGlkID09IFBST0RJRF9PU0lURUNIX1NFVkVOKSkgfHwKKwkJKChzbWMtPm1hbmZpZCA9PSBNQU5GSURfUFNJT04pICYmCisJIAkoc21jLT5jYXJkaWQgPT0gUFJPRElEX1BTSU9OX05FVDEwMCkpKSB7CisJCS8qIERvd25sb2FkIHRoZSBTZXZlbiBvZiBEaWFtb25kcyBmaXJtd2FyZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKF9fWGlsaW54N09EKTsgaSsrKSB7CisJICAgIAkgICAgb3V0YihfX1hpbGlueDdPRFtpXSwgbGluay0+aW8uQmFzZVBvcnQxKzIpOworCSAgIAkgICAgdWRlbGF5KDUwKTsKKwkJfQorCSAgICB9CisJICAgIGlmIChsaW5rLT5vcGVuKSB7CisJCXNtY19yZXNldChkZXYpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBzbWM5MWM5Ml9ldmVudCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIE1JSSBpbnRlcmZhY2Ugc3VwcG9ydCBmb3IgU01DOTFjWFggYmFzZWQgY2FyZHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1ESU9fU0hJRlRfQ0xLCQkweDA0CisjZGVmaW5lIE1ESU9fREFUQV9PVVQJCTB4MDEKKyNkZWZpbmUgTURJT19ESVJfV1JJVEUJCTB4MDgKKyNkZWZpbmUgTURJT19EQVRBX1dSSVRFMAkoTURJT19ESVJfV1JJVEUpCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTEJKE1ESU9fRElSX1dSSVRFIHwgTURJT19EQVRBX09VVCkKKyNkZWZpbmUgTURJT19EQVRBX1JFQUQJCTB4MDIKKworc3RhdGljIHZvaWQgbWRpb19zeW5jKGtpb19hZGRyX3QgYWRkcikKK3sKKyAgICBpbnQgYml0czsKKyAgICBmb3IgKGJpdHMgPSAwOyBiaXRzIDwgMzI7IGJpdHMrKykgeworCW91dGIoTURJT19EQVRBX1dSSVRFMSwgYWRkcik7CisJb3V0YihNRElPX0RBVEFfV1JJVEUxIHwgTURJT19TSElGVF9DTEssIGFkZHIpOworICAgIH0KK30KKworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvYykKK3sKKyAgICBraW9fYWRkcl90IGFkZHIgPSBkZXYtPmJhc2VfYWRkciArIE1HTVQ7CisgICAgdV9pbnQgY21kID0gKDB4MDY8PDEwKXwocGh5X2lkPDw1KXxsb2M7CisgICAgaW50IGksIHJldHZhbCA9IDA7CisKKyAgICBtZGlvX3N5bmMoYWRkcik7CisgICAgZm9yIChpID0gMTM7IGkgPj0gMDsgaS0tKSB7CisJaW50IGRhdCA9IChjbWQmKDE8PGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiBNRElPX0RBVEFfV1JJVEUwOworCW91dGIoZGF0LCBhZGRyKTsKKwlvdXRiKGRhdCB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9CisgICAgZm9yIChpID0gMTk7IGkgPiAwOyBpLS0pIHsKKwlvdXRiKDAsIGFkZHIpOworCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGluYihhZGRyKSAmIE1ESU9fREFUQV9SRUFEKSAhPSAwKTsKKwlvdXRiKE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9CisgICAgcmV0dXJuIChyZXR2YWw+PjEpICYgMHhmZmZmOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2MsIGludCB2YWx1ZSkKK3sKKyAgICBraW9fYWRkcl90IGFkZHIgPSBkZXYtPmJhc2VfYWRkciArIE1HTVQ7CisgICAgdV9pbnQgY21kID0gKDB4MDU8PDI4KXwocGh5X2lkPDwyMyl8KGxvYzw8MTgpfCgxPDwxNyl8dmFsdWU7CisgICAgaW50IGk7CisKKyAgICBtZGlvX3N5bmMoYWRkcik7CisgICAgZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJaW50IGRhdCA9IChjbWQmKDE8PGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiBNRElPX0RBVEFfV1JJVEUwOworCW91dGIoZGF0LCBhZGRyKTsKKwlvdXRiKGRhdCB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9CisgICAgZm9yIChpID0gMTsgaSA+PSAwOyBpLS0pIHsKKwlvdXRiKDAsIGFkZHIpOworCW91dGIoTURJT19TSElGVF9DTEssIGFkZHIpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGUgZHJpdmVyIGNvcmUgY29kZSwgbW9zdCBvZiB3aGljaCBzaG91bGQgYmUgY29tbW9uIHdpdGggYQorICAgIG5vbi1QQ01DSUEgaW1wbGVtZW50YXRpb24uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgdm9pZCBzbWNfZHVtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdV9zaG9ydCBpLCB3LCBzYXZlOworICAgIHNhdmUgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOworICAgIGZvciAodyA9IDA7IHcgPCA0OyB3KyspIHsKKwlTTUNfU0VMRUNUX0JBTksodyk7CisJcHJpbnRrKEtFUk5fREVCVUcgImJhbmsgJWQ6ICIsIHcpOworCWZvciAoaSA9IDA7IGkgPCAxNDsgaSArPSAyKQorCSAgICBwcmludGsoIiAlMDR4IiwgaW53KGlvYWRkciArIGkpKTsKKwlwcmludGsoIlxuIik7CisgICAgfQorICAgIG91dHcoc2F2ZSwgaW9hZGRyICsgQkFOS19TRUxFQ1QpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc21jX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZzbWMtPmxpbms7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBERUJVRygwLCAiJXM6IHNtY19vcGVuKCVwKSwgSUQvV2luZG93ICU0LjR4LlxuIiwKKwkgIGRldi0+bmFtZSwgZGV2LCBpbncoZGV2LT5iYXNlX2FkZHIgKyBCQU5LX1NFTEVDVCkpOworICAgIGlmIChwY19kZWJ1ZyA+IDEpIHNtY19kdW1wKGRldik7CisjZW5kaWYKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIFBDTUNJQSBjYXJkIGlzIHN0aWxsIGhlcmUuICovCisgICAgaWYgKCFERVZfT0sobGluaykpCisJcmV0dXJuIC1FTk9ERVY7CisgICAgLyogUGh5c2ljYWwgZGV2aWNlIHByZXNlbnQgc2lnbmF0dXJlLiAqLworICAgIGlmIChjaGVja19zaWcobGluaykgPCAwKSB7CisJcHJpbnRrKCJzbWM5MWM5Ml9jczogWWlrZXMhICBCYWQgY2hpcCBzaWduYXR1cmUhXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgbGluay0+b3BlbisrOworCisgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICBzbWMtPnNhdmVkX3NrYiA9IE5VTEw7CisgICAgc21jLT5wYWNrZXRzX3dhaXRpbmcgPSAwOworCisgICAgc21jX3Jlc2V0KGRldik7CisgICAgaW5pdF90aW1lcigmc21jLT5tZWRpYSk7CisgICAgc21jLT5tZWRpYS5mdW5jdGlvbiA9ICZtZWRpYV9jaGVjazsKKyAgICBzbWMtPm1lZGlhLmRhdGEgPSAodV9sb25nKSBkZXY7CisgICAgc21jLT5tZWRpYS5leHBpcmVzID0gamlmZmllcyArIEhaOworICAgIGFkZF90aW1lcigmc21jLT5tZWRpYSk7CisKKyAgICByZXR1cm4gMDsKK30gLyogc21jX29wZW4gKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgc21jX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmc21jLT5saW5rOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBERUJVRygwLCAiJXM6IHNtY19jbG9zZSgpLCBzdGF0dXMgJTQuNHguXG4iLAorCSAgZGV2LT5uYW1lLCBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpKTsKKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgIC8qIFNodXQgb2ZmIGFsbCBpbnRlcnJ1cHRzLCBhbmQgdHVybiBvZmYgdGhlIFR4IGFuZCBSeCBzZWN0aW9ucy4KKyAgICAgICBEb24ndCBib3RoZXIgdG8gY2hlY2sgZm9yIGNoaXAgcHJlc2VudC4gKi8KKyAgICBTTUNfU0VMRUNUX0JBTksoMik7CS8qIE5vbWluYWxseSBwYXJhbm9pYSwgYnV0IGRvIG5vIGFzc3VtZS4uLiAqLworICAgIG91dHcoMCwgaW9hZGRyICsgSU5URVJSVVBUKTsKKyAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisgICAgbWFza19iaXRzKDB4ZmYwMCwgaW9hZGRyICsgUkNSKTsKKyAgICBtYXNrX2JpdHMoMHhmZjAwLCBpb2FkZHIgKyBUQ1IpOworCisgICAgLyogUHV0IHRoZSBjaGlwIGludG8gcG93ZXItZG93biBtb2RlLiAqLworICAgIFNNQ19TRUxFQ1RfQkFOSygxKTsKKyAgICBvdXR3KENUTF9QT1dFUkRPV04sIGlvYWRkciArIENPTlRST0wgKTsKKworICAgIGxpbmstPm9wZW4tLTsKKyAgICBkZWxfdGltZXJfc3luYygmc21jLT5tZWRpYSk7CisKKyAgICByZXR1cm4gMDsKK30gLyogc21jX2Nsb3NlICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBUcmFuc2ZlciBhIHBhY2tldCB0byB0aGUgaGFyZHdhcmUgYW5kIHRyaWdnZXIgdGhlIHBhY2tldCBzZW5kLgorICAgVGhpcyBtYXkgYmUgY2FsbGVkIGF0IGVpdGhlciBmcm9tIGVpdGhlciB0aGUgVHggcXVldWUgY29kZQorICAgb3IgdGhlIGludGVycnVwdCBoYW5kbGVyLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc21jX2hhcmR3YXJlX3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc21jLT5zYXZlZF9za2I7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1X2NoYXIgcGFja2V0X25vOworCisgICAgaWYgKCFza2IpIHsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBJbiBYTUlUIHdpdGggbm8gcGFja2V0IHRvIHNlbmQuXG4iLCBkZXYtPm5hbWUpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBUaGVyZSBzaG91bGQgYmUgYSBwYWNrZXQgc2xvdCB3YWl0aW5nLiAqLworICAgIHBhY2tldF9ubyA9IGludyhpb2FkZHIgKyBQTlJfQVJSKSA+PiA4OworICAgIGlmIChwYWNrZXRfbm8gJiAweDgwKSB7CisJLyogSWYgbm90LCB0aGVyZSBpcyBhIGhhcmR3YXJlIHByb2JsZW0hICBMaWtlbHkgYW4gZWplY3RlZCBjYXJkLiAqLworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiA5MWM5MiBoYXJkd2FyZSBUeCBidWZmZXIgYWxsb2NhdGlvbiIKKwkgICAgICAgIiBmYWlsZWQsIHN0YXR1cyAlIzIuMnguXG4iLCBkZXYtPm5hbWUsIHBhY2tldF9ubyk7CisJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwlzbWMtPnNhdmVkX3NrYiA9IE5VTEw7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm47CisgICAgfQorCisgICAgc21jLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKyAgICAvKiBUaGUgY2FyZCBzaG91bGQgdXNlIHRoZSBqdXN0LWFsbG9jYXRlZCBidWZmZXIuICovCisgICAgb3V0dyhwYWNrZXRfbm8sIGlvYWRkciArIFBOUl9BUlIpOworICAgIC8qIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldCAqLworICAgIG91dHcoUFRSX0FVVE9JTkMgLCBpb2FkZHIgKyBQT0lOVEVSKTsKKworICAgIC8qIFNlbmQgdGhlIHBhY2tldCBsZW5ndGggKCs2IGZvciBzdGF0dXMsIGxlbmd0aCBhbmQgY3RsIGJ5dGUpCisgICAgICAgYW5kIHRoZSBzdGF0dXMgd29yZCAoc2V0IHRvIHplcm9zKS4gKi8KKyAgICB7CisJdV9jaGFyICpidWYgPSBza2ItPmRhdGE7CisJdV9pbnQgbGVuZ3RoID0gc2tiLT5sZW47IC8qIFRoZSBjaGlwIHdpbGwgcGFkIHRvIGV0aGVybmV0IG1pbi4gKi8KKworCURFQlVHKDIsICIlczogVHJ5aW5nIHRvIHhtaXQgcGFja2V0IG9mIGxlbmd0aCAlZC5cbiIsCisJICAgICAgZGV2LT5uYW1lLCBsZW5ndGgpOworCQorCS8qIHNlbmQgdGhlIHBhY2tldCBsZW5ndGg6ICs2IGZvciBzdGF0dXMgd29yZCwgbGVuZ3RoLCBhbmQgY3RsICovCisJb3V0dygwLCBpb2FkZHIgKyBEQVRBXzEpOworCW91dHcobGVuZ3RoICsgNiwgaW9hZGRyICsgREFUQV8xKTsKKwlvdXRzdyhpb2FkZHIgKyBEQVRBXzEsIGJ1ZiwgbGVuZ3RoID4+IDEpOworCQorCS8qIFRoZSBvZGQgbGFzdCBieXRlLCBpZiB0aGVyZSBpcyBvbmUsIGdvZXMgaW4gdGhlIGNvbnRyb2wgd29yZC4gKi8KKwlvdXR3KChsZW5ndGggJiAxKSA/IDB4MjAwMCB8IGJ1ZltsZW5ndGgtMV0gOiAwLCBpb2FkZHIgKyBEQVRBXzEpOworICAgIH0KKworICAgIC8qIEVuYWJsZSB0aGUgVHggaW50ZXJydXB0cywgYm90aCBUeCAoVHhFcnIpIGFuZCBUeEVtcHR5LiAqLworICAgIG91dHcoKChJTV9UWF9JTlR8SU1fVFhfRU1QVFlfSU5UKTw8OCkgfAorCSAoaW53KGlvYWRkciArIElOVEVSUlVQVCkgJiAweGZmMDApLAorCSBpb2FkZHIgKyBJTlRFUlJVUFQpOworCisgICAgLyogVGhlIGNoaXAgZG9lcyB0aGUgcmVzdCBvZiB0aGUgd29yay4gKi8KKyAgICBvdXR3KE1DX0VOUVVFVUUgLCBpb2FkZHIgKyBNTVVfQ01EKTsKKworICAgIHNtYy0+c2F2ZWRfc2tiID0gTlVMTDsKKyAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOworICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc21jX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IFNNQzkxYzkyIHRyYW5zbWl0IHRpbWVkIG91dCwgIgorCSAgICJUeF9zdGF0dXMgJTIuMnggc3RhdHVzICU0LjR4LlxuIiwKKwkgICBkZXYtPm5hbWUsIGludyhpb2FkZHIpJjB4ZmYsIGludyhpb2FkZHIgKyAyKSk7CisgICAgc21jLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICBzbWNfcmVzZXQoZGV2KTsKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICBzbWMtPnNhdmVkX3NrYiA9IE5VTEw7CisgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IHNtY19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdV9zaG9ydCBudW1fcGFnZXM7CisgICAgc2hvcnQgdGltZV9vdXQsIGlyOworCisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgREVCVUcoMiwgIiVzOiBzbWNfc3RhcnRfeG1pdChsZW5ndGggPSAlZCkgY2FsbGVkLCIKKwkgICIgc3RhdHVzICU0LjR4LlxuIiwgZGV2LT5uYW1lLCBza2ItPmxlbiwgaW53KGlvYWRkciArIDIpKTsKKworICAgIGlmIChzbWMtPnNhdmVkX3NrYikgeworCS8qIFRISVMgU0hPVUxEIE5FVkVSIEhBUFBFTi4gKi8KKwlzbWMtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbnRlcm5hbCBlcnJvciAtLSBzZW50IHBhY2tldCB3aGlsZSBidXN5LlxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgc21jLT5zYXZlZF9za2IgPSBza2I7CisKKyAgICBudW1fcGFnZXMgPSBza2ItPmxlbiA+PiA4OworCisgICAgaWYgKG51bV9wYWdlcyA+IDcpIHsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBGYXIgdG9vIGJpZyBwYWNrZXQgZXJyb3IuXG4iLCBkZXYtPm5hbWUpOworCWRldl9rZnJlZV9za2IgKHNrYik7CisJc21jLT5zYXZlZF9za2IgPSBOVUxMOworCXNtYy0+c3RhdHMudHhfZHJvcHBlZCsrOworCXJldHVybiAwOwkJLyogRG8gbm90IHJlLXF1ZXVlIHRoaXMgcGFja2V0LiAqLworICAgIH0KKyAgICAvKiBBIHBhY2tldCBpcyBub3cgd2FpdGluZy4gKi8KKyAgICBzbWMtPnBhY2tldHNfd2FpdGluZysrOworCisgICAgU01DX1NFTEVDVF9CQU5LKDIpOwkvKiBQYXJhbm9pYSwgd2Ugc2hvdWxkIGFsd2F5cyBiZSBpbiB3aW5kb3cgMiAqLworCisgICAgLyogbmVlZCBNQ19SRVNFVCB0byBrZWVwIHRoZSBtZW1vcnkgY29uc2lzdGVudC4gZXJyYXRhPyAqLworICAgIGlmIChzbWMtPnJ4X292cm4pIHsKKwlvdXR3KE1DX1JFU0VULCBpb2FkZHIgKyBNTVVfQ01EKTsKKwlzbWMtPnJ4X292cm4gPSAwOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIHRoZSBtZW1vcnk7IHNlbmQgdGhlIHBhY2tldCBub3cgaWYgd2Ugd2luLiAqLworICAgIG91dHcoTUNfQUxMT0MgfCBudW1fcGFnZXMsIGlvYWRkciArIE1NVV9DTUQpOworICAgIGZvciAodGltZV9vdXQgPSBNRU1PUllfV0FJVF9USU1FOyB0aW1lX291dCA+PSAwOyB0aW1lX291dC0tKSB7CisJaXIgPSBpbncoaW9hZGRyK0lOVEVSUlVQVCk7CisJaWYgKGlyICYgSU1fQUxMT0NfSU5UKSB7CisJICAgIC8qIEFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQsIHNlbmQgdGhlIHBhY2tldC4gKi8KKwkgICAgb3V0dygoaXImMHhmZjAwKSB8IElNX0FMTE9DX0lOVCwgaW9hZGRyICsgSU5URVJSVVBUKTsKKwkgICAgc21jX2hhcmR3YXJlX3NlbmRfcGFja2V0KGRldik7CS8qIFNlbmQgdGhlIHBhY2tldCBub3cuLiAqLworCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorCisgICAgLyogT3RoZXJ3aXNlIGRlZmVyIHVudGlsIHRoZSBUeC1zcGFjZS1hbGxvY2F0ZWQgaW50ZXJydXB0LiAqLworICAgIERFQlVHKDIsICIlczogbWVtb3J5IGFsbG9jYXRpb24gZGVmZXJyZWQuXG4iLCBkZXYtPm5hbWUpOworICAgIG91dHcoKElNX0FMTE9DX0lOVCA8PCA4KSB8IChpciAmIDB4ZmYwMCksIGlvYWRkciArIElOVEVSUlVQVCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBIYW5kbGUgYSBUeCBhbm9tb2xvdXMgZXZlbnQuICBFbnRlcmVkIHdoaWxlIGluIFdpbmRvdyAyLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc21jX3R4X2VycihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgc2F2ZWRfcGFja2V0ID0gaW53KGlvYWRkciArIFBOUl9BUlIpICYgMHhmZjsKKyAgICBpbnQgcGFja2V0X25vID0gaW53KGlvYWRkciArIEZJRk9fUE9SVFMpICYgMHg3ZjsKKyAgICBpbnQgdHhfc3RhdHVzOworCisgICAgLyogc2VsZWN0IHRoaXMgYXMgdGhlIHBhY2tldCB0byByZWFkIGZyb20gKi8KKyAgICBvdXR3KHBhY2tldF9ubywgaW9hZGRyICsgUE5SX0FSUik7CisKKyAgICAvKiByZWFkIHRoZSBmaXJzdCB3b3JkIGZyb20gdGhpcyBwYWNrZXQgKi8KKyAgICBvdXR3KFBUUl9BVVRPSU5DIHwgUFRSX1JFQUQgfCAwLCBpb2FkZHIgKyBQT0lOVEVSKTsKKworICAgIHR4X3N0YXR1cyA9IGludyhpb2FkZHIgKyBEQVRBXzEpOworCisgICAgc21jLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICBpZiAodHhfc3RhdHVzICYgVFNfTE9TVENBUikgc21jLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworICAgIGlmICh0eF9zdGF0dXMgJiBUU19MQVRDT0wpICBzbWMtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKyAgICBpZiAodHhfc3RhdHVzICYgVFNfMTZDT0wpIHsKKwlzbWMtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJc21jLT50eF9lcnIrKzsKKyAgICB9CisKKyAgICBpZiAodHhfc3RhdHVzICYgVFNfU1VDQ0VTUykgeworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFN1Y2Nlc3NmdWwgcGFja2V0IGNhdXNlZCBlcnJvciAiCisJICAgICAgICJpbnRlcnJ1cHQ/XG4iLCBkZXYtPm5hbWUpOworICAgIH0KKyAgICAvKiByZS1lbmFibGUgdHJhbnNtaXQgKi8KKyAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisgICAgb3V0dyhpbncoaW9hZGRyICsgVENSKSB8IFRDUl9FTkFCTEUgfCBzbWMtPmR1cGxleCwgaW9hZGRyICsgVENSKTsKKyAgICBTTUNfU0VMRUNUX0JBTksoMik7CisKKyAgICBvdXR3KE1DX0ZSRUVQS1QsIGlvYWRkciArIE1NVV9DTUQpOyAJLyogRnJlZSB0aGUgcGFja2V0IG1lbW9yeS4gKi8KKworICAgIC8qIG9uZSBsZXNzIHBhY2tldCB3YWl0aW5nIGZvciBtZSAqLworICAgIHNtYy0+cGFja2V0c193YWl0aW5nLS07CisKKyAgICBvdXR3KHNhdmVkX3BhY2tldCwgaW9hZGRyICsgUE5SX0FSUik7CisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc21jX2VwaF9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1X3Nob3J0IGNhcmRfc3RhdHMsIGVwaHM7CisKKyAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisgICAgZXBocyA9IGludyhpb2FkZHIgKyBFUEgpOworICAgIERFQlVHKDIsICIlczogRXRoZXJuZXQgcHJvdG9jb2wgaGFuZGxlciBpbnRlcnJ1cHQsIHN0YXR1cyIKKwkgICIgJTQuNHguXG4iLCBkZXYtPm5hbWUsIGVwaHMpOworICAgIC8qIENvdWxkIGJlIGEgY291bnRlciByb2xsLW92ZXIgd2FybmluZzogdXBkYXRlIHN0YXRzLiAqLworICAgIGNhcmRfc3RhdHMgPSBpbncoaW9hZGRyICsgQ09VTlRFUik7CisgICAgLyogc2luZ2xlIGNvbGxpc2lvbnMgKi8KKyAgICBzbWMtPnN0YXRzLmNvbGxpc2lvbnMgKz0gY2FyZF9zdGF0cyAmIDB4RjsKKyAgICBjYXJkX3N0YXRzID4+PSA0OworICAgIC8qIG11bHRpcGxlIGNvbGxpc2lvbnMgKi8KKyAgICBzbWMtPnN0YXRzLmNvbGxpc2lvbnMgKz0gY2FyZF9zdGF0cyAmIDB4RjsKKyNpZiAwIAkJLyogVGhlc2UgYXJlIGZvciB3aGVuIGxpbnV4IHN1cHBvcnRzIHRoZXNlIHN0YXRpc3RpY3MgKi8KKyAgICBjYXJkX3N0YXRzID4+PSA0OwkJCS8qIGRlZmVycmVkICovCisgICAgY2FyZF9zdGF0cyA+Pj0gNDsJCQkvKiBleGNlc3MgZGVmZXJyZWQgKi8KKyNlbmRpZgorICAgIC8qIElmIHdlIGhhZCBhIHRyYW5zbWl0IGVycm9yIHdlIG11c3QgcmUtZW5hYmxlIHRoZSB0cmFuc21pdHRlci4gKi8KKyAgICBvdXR3KGludyhpb2FkZHIgKyBUQ1IpIHwgVENSX0VOQUJMRSB8IHNtYy0+ZHVwbGV4LCBpb2FkZHIgKyBUQ1IpOworCisgICAgLyogQ2xlYXIgYSBsaW5rIGVycm9yIGludGVycnVwdC4gKi8KKyAgICBTTUNfU0VMRUNUX0JBTksoMSk7CisgICAgb3V0dyhDVExfQVVUT19SRUxFQVNFIHwgMHgwMDAwLCBpb2FkZHIgKyBDT05UUk9MKTsKKyAgICBvdXR3KENUTF9BVVRPX1JFTEVBU0UgfCBDVExfVEVfRU5BQkxFIHwgQ1RMX0NSX0VOQUJMRSwKKwkgaW9hZGRyICsgQ09OVFJPTCk7CisgICAgU01DX1NFTEVDVF9CQU5LKDIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGlycXJldHVybl90IHNtY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkcjsKKyAgICB1X3Nob3J0IHNhdmVkX2JhbmssIHNhdmVkX3BvaW50ZXIsIG1hc2ssIHN0YXR1czsKKyAgICB1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDE7CisgICAgY2hhciBib2d1c19jbnQgPSBJTlRSX1dPUks7CQkvKiBXb3JrIHdlIGFyZSB3aWxsaW5nIHRvIGRvLiAqLworCisgICAgaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCXJldHVybiBJUlFfTk9ORTsKKworICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgREVCVUcoMywgIiVzOiBTTUM5MWM5MiBpbnRlcnJ1cHQgJWQgYXQgJSN4LlxuIiwgZGV2LT5uYW1lLAorCSAgaXJxLCBpb2FkZHIpOworCisgICAgc21jLT53YXRjaGRvZyA9IDA7CisgICAgc2F2ZWRfYmFuayA9IGludyhpb2FkZHIgKyBCQU5LX1NFTEVDVCk7CisgICAgaWYgKChzYXZlZF9iYW5rICYgMHhmZjAwKSAhPSAweDMzMDApIHsKKwkvKiBUaGUgZGV2aWNlIGRvZXMgbm90IGV4aXN0IC0tIHRoZSBjYXJkIGNvdWxkIGJlIG9mZi1saW5lLCBvcgorCSAgIG1heWJlIGl0IGhhcyBiZWVuIGVqZWN0ZWQuICovCisJREVCVUcoMSwgIiVzOiBTTUM5MWM5MiBpbnRlcnJ1cHQgJWQgZm9yIG5vbi1leGlzdGVudCIKKwkgICAgICAiL2VqZWN0ZWQgZGV2aWNlLlxuIiwgZGV2LT5uYW1lLCBpcnEpOworCWhhbmRsZWQgPSAwOworCWdvdG8gaXJxX2RvbmU7CisgICAgfQorCisgICAgU01DX1NFTEVDVF9CQU5LKDIpOworICAgIHNhdmVkX3BvaW50ZXIgPSBpbncoaW9hZGRyICsgUE9JTlRFUik7CisgICAgbWFzayA9IGludyhpb2FkZHIgKyBJTlRFUlJVUFQpID4+IDg7CisgICAgLyogY2xlYXIgYWxsIGludGVycnVwdHMgKi8KKyAgICBvdXR3KDAsIGlvYWRkciArIElOVEVSUlVQVCk7CisKKyAgICBkbyB7IC8qIHJlYWQgdGhlIHN0YXR1cyBmbGFnLCBhbmQgbWFzayBpdCAqLworCXN0YXR1cyA9IGludyhpb2FkZHIgKyBJTlRFUlJVUFQpICYgMHhmZjsKKwlERUJVRygzLCAiJXM6IFN0YXR1cyBpcyAlIzIuMnggKG1hc2sgJSMyLjJ4KS5cbiIsIGRldi0+bmFtZSwKKwkgICAgICBzdGF0dXMsIG1hc2spOworCWlmICgoc3RhdHVzICYgbWFzaykgPT0gMCkgeworCSAgICBpZiAoYm9ndXNfY250ID09IElOVFJfV09SSykKKwkJaGFuZGxlZCA9IDA7CisJICAgIGJyZWFrOworCX0KKwlpZiAoc3RhdHVzICYgSU1fUkNWX0lOVCkgeworCSAgICAvKiBHb3QgYSBwYWNrZXQocykuICovCisJICAgIHNtY19yeChkZXYpOworCX0KKwlpZiAoc3RhdHVzICYgSU1fVFhfSU5UKSB7CisJICAgIHNtY190eF9lcnIoZGV2KTsKKwkgICAgb3V0dyhJTV9UWF9JTlQsIGlvYWRkciArIElOVEVSUlVQVCk7CisJfQorCXN0YXR1cyAmPSBtYXNrOworCWlmIChzdGF0dXMgJiBJTV9UWF9FTVBUWV9JTlQpIHsKKwkgICAgb3V0dyhJTV9UWF9FTVBUWV9JTlQsIGlvYWRkciArIElOVEVSUlVQVCk7CisJICAgIG1hc2sgJj0gfklNX1RYX0VNUFRZX0lOVDsKKwkgICAgc21jLT5zdGF0cy50eF9wYWNrZXRzICs9IHNtYy0+cGFja2V0c193YWl0aW5nOworCSAgICBzbWMtPnBhY2tldHNfd2FpdGluZyA9IDA7CisJfQorCWlmIChzdGF0dXMgJiBJTV9BTExPQ19JTlQpIHsKKwkgICAgLyogQ2xlYXIgdGhpcyBpbnRlcnJ1cHQgc28gaXQgZG9lc24ndCBoYXBwZW4gYWdhaW4gKi8KKwkgICAgbWFzayAmPSB+SU1fQUxMT0NfSU5UOworCQorCSAgICBzbWNfaGFyZHdhcmVfc2VuZF9wYWNrZXQoZGV2KTsKKwkKKwkgICAgLyogZW5hYmxlIHhtaXQgaW50ZXJydXB0cyBiYXNlZCBvbiB0aGlzICovCisJICAgIG1hc2sgfD0gKElNX1RYX0VNUFRZX0lOVCB8IElNX1RYX0lOVCk7CisJCisJICAgIC8qIGFuZCBsZXQgdGhlIGNhcmQgc2VuZCBtb3JlIHBhY2tldHMgdG8gbWUgKi8KKwkgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKwlpZiAoc3RhdHVzICYgSU1fUlhfT1ZSTl9JTlQpIHsKKwkgICAgc21jLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkgICAgc21jLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCSAgICBpZiAoc21jLT5kdXBsZXgpCisJCXNtYy0+cnhfb3ZybiA9IDE7IC8qIG5lZWQgTUNfUkVTRVQgb3V0c2lkZSBzbWNfaW50ZXJydXB0ICovCisJICAgIG91dHcoSU1fUlhfT1ZSTl9JTlQsIGlvYWRkciArIElOVEVSUlVQVCk7CisJfQorCWlmIChzdGF0dXMgJiBJTV9FUEhfSU5UKQorCSAgICBzbWNfZXBoX2lycShkZXYpOworICAgIH0gd2hpbGUgKC0tYm9ndXNfY250KTsKKworICAgIERFQlVHKDMsICIgIFJlc3RvcmluZyBzYXZlZCByZWdpc3RlcnMgbWFzayAlMi4yeCBiYW5rICU0LjR4IgorCSAgIiBwb2ludGVyICU0LjR4LlxuIiwgbWFzaywgc2F2ZWRfYmFuaywgc2F2ZWRfcG9pbnRlcik7CisKKyAgICAvKiByZXN0b3JlIHN0YXRlIHJlZ2lzdGVyICovCisgICAgb3V0dygobWFzazw8OCksIGlvYWRkciArIElOVEVSUlVQVCk7CisgICAgb3V0dyhzYXZlZF9wb2ludGVyLCBpb2FkZHIgKyBQT0lOVEVSKTsKKyAgICBTTUNfU0VMRUNUX0JBTksoc2F2ZWRfYmFuayk7CisKKyAgICBERUJVRygzLCAiJXM6IEV4aXRpbmcgaW50ZXJydXB0IElSUSVkLlxuIiwgZGV2LT5uYW1lLCBpcnEpOworCitpcnFfZG9uZToKKworICAgIGlmICgoc21jLT5tYW5maWQgPT0gTUFORklEX09TSVRFQ0gpICYmCisJKHNtYy0+Y2FyZGlkICE9IFBST0RJRF9PU0lURUNIX1NFVkVOKSkgeworCS8qIFJldHJpZ2dlciBpbnRlcnJ1cHQgaWYgbmVlZGVkICovCisJbWFza19iaXRzKDB4MDBmZiwgaW9hZGRyLTB4MTArT1NJVEVDSF9SRVNFVF9JU1IpOworCXNldF9iaXRzKDB4MDMwMCwgaW9hZGRyLTB4MTArT1NJVEVDSF9SRVNFVF9JU1IpOworICAgIH0KKyAgICBpZiAoc21jLT5tYW5maWQgPT0gTUFORklEX01PVE9ST0xBKSB7CisJdV9jaGFyIGNvcjsKKwljb3IgPSByZWFkYihzbWMtPmJhc2UgKyBNT1RfVUFSVCArIENJU1JFR19DT1IpOworCXdyaXRlYihjb3IgJiB+Q09SX0lSRVFfRU5BLCBzbWMtPmJhc2UgKyBNT1RfVUFSVCArIENJU1JFR19DT1IpOworCXdyaXRlYihjb3IsIHNtYy0+YmFzZSArIE1PVF9VQVJUICsgQ0lTUkVHX0NPUik7CisJY29yID0gcmVhZGIoc21jLT5iYXNlICsgTU9UX0xBTiArIENJU1JFR19DT1IpOworCXdyaXRlYihjb3IgJiB+Q09SX0lSRVFfRU5BLCBzbWMtPmJhc2UgKyBNT1RfTEFOICsgQ0lTUkVHX0NPUik7CisJd3JpdGViKGNvciwgc21jLT5iYXNlICsgTU9UX0xBTiArIENJU1JFR19DT1IpOworICAgIH0KKyNpZmRlZiBET0VTX05PVF9XT1JLCisgICAgaWYgKHNtYy0+YmFzZSAhPSBOVUxMKSB7IC8qIE1lZ2FoZXJ0eiBNRkMncyAqLworCXJlYWRiKHNtYy0+YmFzZStNRUdBSEVSVFpfSVNSKTsKKwlyZWFkYihzbWMtPmJhc2UrTUVHQUhFUlRaX0lTUik7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBzbWNfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgcnhfc3RhdHVzOworICAgIGludCBwYWNrZXRfbGVuZ3RoOwkvKiBDYXV0aW9uOiBub3QgZnJhbWUgbGVuZ3RoLCByYXRoZXIgd29yZHMKKwkJCSAgIHRvIHRyYW5zZmVyIGZyb20gdGhlIGNoaXAuICovCisKKyAgICAvKiBBc3NlcnRpb246IHdlIGFyZSBpbiBXaW5kb3cgMi4gKi8KKworICAgIGlmIChpbncoaW9hZGRyICsgRklGT19QT1JUUykgJiBGUF9SWEVNUFRZKSB7CisJcHJpbnRrKEtFUk5fRVJSICIlczogc21jX3J4KCkgd2l0aCBub3RoaW5nIG9uIFJ4IEZJRk8uXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiAgUmVzZXQgdGhlIHJlYWQgcG9pbnRlciwgYW5kIHJlYWQgdGhlIHN0YXR1cyBhbmQgcGFja2V0IGxlbmd0aC4gKi8KKyAgICBvdXR3KFBUUl9SRUFEIHwgUFRSX1JDViB8IFBUUl9BVVRPSU5DLCBpb2FkZHIgKyBQT0lOVEVSKTsKKyAgICByeF9zdGF0dXMgPSBpbncoaW9hZGRyICsgREFUQV8xKTsKKyAgICBwYWNrZXRfbGVuZ3RoID0gaW53KGlvYWRkciArIERBVEFfMSkgJiAweDA3ZmY7CisKKyAgICBERUJVRygyLCAiJXM6IFJlY2VpdmUgc3RhdHVzICU0LjR4IGxlbmd0aCAlZC5cbiIsCisJICBkZXYtPm5hbWUsIHJ4X3N0YXR1cywgcGFja2V0X2xlbmd0aCk7CisKKyAgICBpZiAoIShyeF9zdGF0dXMgJiBSU19FUlJPUlMpKSB7CQkKKwkvKiBkbyBzdHVmZiB0byBtYWtlIGEgbmV3IHBhY2tldCAqLworCXN0cnVjdCBza19idWZmICpza2I7CisJCisJLyogTm90ZTogcGFja2V0X2xlbmd0aCBhZGRzIDUgb3IgNiBleHRyYSBieXRlcyBoZXJlISAqLworCXNrYiA9IGRldl9hbGxvY19za2IocGFja2V0X2xlbmd0aCsyKTsKKwkKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkgICAgREVCVUcoMSwgIiVzOiBMb3cgbWVtb3J5LCBwYWNrZXQgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSk7CisJICAgIHNtYy0+c3RhdHMucnhfZHJvcHBlZCsrOworCSAgICBvdXR3KE1DX1JFTEVBU0UsIGlvYWRkciArIE1NVV9DTUQpOworCSAgICByZXR1cm47CisJfQorCQorCXBhY2tldF9sZW5ndGggLT0gKHJ4X3N0YXR1cyAmIFJTX09EREZSQU1FID8gNSA6IDYpOworCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJaW5zdyhpb2FkZHIrREFUQV8xLCBza2JfcHV0KHNrYiwgcGFja2V0X2xlbmd0aCksCisJICAgICAocGFja2V0X2xlbmd0aCsxKT4+MSk7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkKKwlza2ItPmRldiA9IGRldjsKKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJc21jLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc21jLT5zdGF0cy5yeF9ieXRlcyArPSBwYWNrZXRfbGVuZ3RoOworCWlmIChyeF9zdGF0dXMgJiBSU19NVUxUSUNBU1QpCisJICAgIHNtYy0+c3RhdHMubXVsdGljYXN0Kys7CisgICAgfSBlbHNlIHsKKwkvKiBlcnJvciAuLi4gKi8KKwlzbWMtPnN0YXRzLnJ4X2Vycm9ycysrOworCQorCWlmIChyeF9zdGF0dXMgJiBSU19BTEdORVJSKSAgc21jLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwlpZiAocnhfc3RhdHVzICYgKFJTX1RPT1NIT1JUIHwgUlNfVE9PTE9ORykpCisJICAgIHNtYy0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCWlmIChyeF9zdGF0dXMgJiBSU19CQURDUkMpCXNtYy0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworICAgIH0KKyAgICAvKiBMZXQgdGhlIE1NVSBmcmVlIHRoZSBtZW1vcnkgb2YgdGhpcyBwYWNrZXQuICovCisgICAgb3V0dyhNQ19SRUxFQVNFLCBpb2FkZHIgKyBNTVVfQ01EKTsKKworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc21jX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAvKiBOb3RoaW5nIHRvIHVwZGF0ZSAtIHRoZSA5MWM5MiBpcyBhIHByZXR0eSBwcmltYXRpdmUgY2hpcC4gKi8KKyAgICByZXR1cm4gJnNtYy0+c3RhdHM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQ2FsY3VsYXRlIHZhbHVlcyBmb3IgdGhlIGhhcmR3YXJlIG11bHRpY2FzdCBmaWx0ZXIgaGFzaCB0YWJsZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGZpbGxfbXVsdGljYXN0X3RibChpbnQgY291bnQsIHN0cnVjdCBkZXZfbWNfbGlzdCAqYWRkcnMsCisJCQkgICAgICAgdV9jaGFyICptdWx0aWNhc3RfdGFibGUpCit7CisgICAgc3RydWN0IGRldl9tY19saXN0CSptY19hZGRyOworCisgICAgZm9yIChtY19hZGRyID0gYWRkcnM7ICBtY19hZGRyICYmIC0tY291bnQgPiAwOyAgbWNfYWRkciA9IG1jX2FkZHItPm5leHQpIHsKKwl1X2ludCBwb3NpdGlvbiA9IGV0aGVyX2NyYyg2LCBtY19hZGRyLT5kbWlfYWRkcik7CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24JCS8qIFZlcmlmeSBtdWx0aWNhc3QgYWRkcmVzcy4gKi8KKwlpZiAoKG1jX2FkZHItPmRtaV9hZGRyWzBdICYgMSkgPT0gMCkKKwkgICAgY29udGludWU7CisjZW5kaWYKKwltdWx0aWNhc3RfdGFibGVbcG9zaXRpb24gPj4gMjldIHw9IDEgPDwgKChwb3NpdGlvbiA+PiAyNikgJiA3KTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgU2V0IHRoZSByZWNlaXZlIG1vZGUuCisKKyAgICBUaGlzIHJvdXRpbmUgaXMgdXNlZCBieSBib3RoIHRoZSBwcm90b2NvbCBsZXZlbCB0byBub3RpZnkgdXMgb2YKKyAgICBwcm9taXNjdW91cy9tdWx0aWNhc3QgbW9kZSBjaGFuZ2VzLCBhbmQgYnkgdGhlIG9wZW4vcmVzZXQgY29kZSB0bworICAgIGluaXRpYWxpemUgdGhlIFJ4IHJlZ2lzdGVycy4gIFdlIGFsd2F5cyBzZXQgdGhlIG11bHRpY2FzdCBsaXN0IGFuZAorICAgIGxlYXZlIHRoZSByZWNlaXZlciBydW5uaW5nLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2ludCBtdWx0aWNhc3RfdGFibGVbIDIgXSA9IHsgMCwgfTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHVfc2hvcnQgcnhfY2ZnX3NldHRpbmc7CisKKyAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogc2V0dGluZyBSeCBtb2RlIHRvIHByb21pc2N1b3VzLlxuIiwgZGV2LT5uYW1lKTsKKwlyeF9jZmdfc2V0dGluZyA9IFJ4U3RyaXBDUkMgfCBSeEVuYWJsZSB8IFJ4UHJvbWlzYyB8IFJ4QWxsTXVsdGk7CisgICAgfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCXJ4X2NmZ19zZXR0aW5nID0gUnhTdHJpcENSQyB8IFJ4RW5hYmxlIHwgUnhBbGxNdWx0aTsKKyAgICBlbHNlIHsKKwlpZiAoZGV2LT5tY19jb3VudCkgIHsKKwkgICAgZmlsbF9tdWx0aWNhc3RfdGJsKGRldi0+bWNfY291bnQsIGRldi0+bWNfbGlzdCwKKwkJCSAgICAgICAodV9jaGFyICopbXVsdGljYXN0X3RhYmxlKTsKKwl9CisJcnhfY2ZnX3NldHRpbmcgPSBSeFN0cmlwQ1JDIHwgUnhFbmFibGU7CisgICAgfQorCisgICAgLyogTG9hZCBNQyB0YWJsZSBhbmQgUnggc2V0dGluZyBpbnRvIHRoZSBjaGlwIHdpdGhvdXQgaW50ZXJydXB0cy4gKi8KKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc21jLT5sb2NrLCBmbGFncyk7CisgICAgU01DX1NFTEVDVF9CQU5LKDMpOworICAgIG91dGwobXVsdGljYXN0X3RhYmxlWzBdLCBpb2FkZHIgKyBNVUxUSUNBU1QwKTsKKyAgICBvdXRsKG11bHRpY2FzdF90YWJsZVsxXSwgaW9hZGRyICsgTVVMVElDQVNUNCk7CisgICAgU01DX1NFTEVDVF9CQU5LKDApOworICAgIG91dHcocnhfY2ZnX3NldHRpbmcsIGlvYWRkciArIFJDUik7CisgICAgU01DX1NFTEVDVF9CQU5LKDIpOworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtYy0+bG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFNlbnNlcyB3aGVuIGEgY2FyZCdzIGNvbmZpZyBjaGFuZ2VzLiBIZXJlLCBpdCdzIGNvYXggb3IgVFAuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHM5a19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApCit7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGlmICgobWFwLT5wb3J0ICE9ICh1X2NoYXIpKC0xKSkgJiYgKG1hcC0+cG9ydCAhPSBkZXYtPmlmX3BvcnQpKSB7CisJaWYgKHNtYy0+Y2ZnICYgQ0ZHX01JSV9TRUxFQ1QpCisJICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwllbHNlIGlmIChtYXAtPnBvcnQgPiAyKQorCSAgICByZXR1cm4gLUVJTlZBTDsKKwlkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN3aXRjaGVkIHRvICVzIHBvcnRcbiIsCisJICAgICAgIGRldi0+bmFtZSwgaWZfbmFtZXNbZGV2LT5pZl9wb3J0XSk7CisJc21jX3Jlc2V0KGRldik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJlc2V0IHRoZSBjaGlwLCByZWxvYWRpbmcgZXZlcnkgcmVnaXN0ZXIgdGhhdCBtaWdodCBiZSBjb3JydXB0ZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICBTZXQgdHJhbnNjZWl2ZXIgdHlwZSwgcGVyaGFwcyB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGF0IHRoZSB1c2VyCisgIHNwZWNpZmllZCBpbiBkZXYtPmlmX3BvcnQuCisqLworc3RhdGljIHZvaWQgc21jX3NldF94Y3ZyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpZl9wb3J0KQoreworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHVfc2hvcnQgc2F2ZWRfYmFuazsKKworICAgIHNhdmVkX2JhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOworICAgIFNNQ19TRUxFQ1RfQkFOSygxKTsKKyAgICBpZiAoaWZfcG9ydCA9PSAyKSB7CisJb3V0dyhzbWMtPmNmZyB8IENGR19BVUlfU0VMRUNULCBpb2FkZHIgKyBDT05GSUcpOworCWlmICgoc21jLT5tYW5maWQgPT0gTUFORklEX09TSVRFQ0gpICYmCisJICAgIChzbWMtPmNhcmRpZCAhPSBQUk9ESURfT1NJVEVDSF9TRVZFTikpCisJICAgIHNldF9iaXRzKE9TSV9BVUlfUFdSLCBpb2FkZHIgLSAweDEwICsgT1NJVEVDSF9BVUlfUFdSKTsKKwlzbWMtPm1lZGlhX3N0YXR1cyA9ICgoZGV2LT5pZl9wb3J0ID09IDApID8gMHgwMDAxIDogMHgwMDAyKTsKKyAgICB9IGVsc2UgeworCW91dHcoc21jLT5jZmcsIGlvYWRkciArIENPTkZJRyk7CisJaWYgKChzbWMtPm1hbmZpZCA9PSBNQU5GSURfT1NJVEVDSCkgJiYKKwkgICAgKHNtYy0+Y2FyZGlkICE9IFBST0RJRF9PU0lURUNIX1NFVkVOKSkKKwkgICAgbWFza19iaXRzKH5PU0lfQVVJX1BXUiwgaW9hZGRyIC0gMHgxMCArIE9TSVRFQ0hfQVVJX1BXUik7CisJc21jLT5tZWRpYV9zdGF0dXMgPSAoKGRldi0+aWZfcG9ydCA9PSAwKSA/IDB4MDAxMiA6IDB4NDAwMSk7CisgICAgfQorICAgIFNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKK30KKworc3RhdGljIHZvaWQgc21jX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGk7CisKKyAgICBERUJVRygwLCAiJXM6IHNtYzkxYzkyIHJlc2V0IGNhbGxlZC5cbiIsIGRldi0+bmFtZSk7CisKKyAgICAvKiBUaGUgZmlyc3QgaW50ZXJhY3Rpb24gbXVzdCBiZSBhIHdyaXRlIHRvIGJyaW5nIHRoZSBjaGlwIG91dAorICAgICAgIG9mIHNsZWVwIG1vZGUuICovCisgICAgU01DX1NFTEVDVF9CQU5LKDApOworICAgIC8qIFJlc2V0IHRoZSBjaGlwLiAqLworICAgIG91dHcoUkNSX1NPRlRSRVNFVCwgaW9hZGRyICsgUkNSKTsKKyAgICB1ZGVsYXkoMTApOworCisgICAgLyogQ2xlYXIgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLworICAgIG91dHcoUkNSX0NMRUFSLCBpb2FkZHIgKyBSQ1IpOworICAgIG91dHcoVENSX0NMRUFSLCBpb2FkZHIgKyBUQ1IpOworCisgICAgLyogU2V0IHRoZSBXaW5kb3cgMSBjb250cm9sLCBjb25maWd1cmF0aW9uIGFuZCBzdGF0aW9uIGFkZHIgcmVnaXN0ZXJzLgorICAgICAgIE5vIHBvaW50IGluIHdyaXRpbmcgdGhlIEkvTyBiYXNlIHJlZ2lzdGVyIDstPiAqLworICAgIFNNQ19TRUxFQ1RfQkFOSygxKTsKKyAgICAvKiBBdXRvbWF0aWNhbGx5IHJlbGVhc2Ugc3VjY2VzZnVsbHkgdHJhbnNtaXR0ZWQgcGFja2V0cywKKyAgICAgICBBY2NlcHQgbGluayBlcnJvcnMsIGNvdW50ZXIgYW5kIFR4IGVycm9yIGludGVycnVwdHMuICovCisgICAgb3V0dyhDVExfQVVUT19SRUxFQVNFIHwgQ1RMX1RFX0VOQUJMRSB8IENUTF9DUl9FTkFCTEUsCisJIGlvYWRkciArIENPTlRST0wpOworICAgIHNtY19zZXRfeGN2cihkZXYsIGRldi0+aWZfcG9ydCk7CisgICAgaWYgKChzbWMtPm1hbmZpZCA9PSBNQU5GSURfT1NJVEVDSCkgJiYKKwkoc21jLT5jYXJkaWQgIT0gUFJPRElEX09TSVRFQ0hfU0VWRU4pKQorCW91dHcoKGRldi0+aWZfcG9ydCA9PSAyID8gT1NJX0FVSV9QV1IgOiAwKSB8CisJICAgICAoaW53KGlvYWRkci0weDEwK09TSVRFQ0hfQVVJX1BXUikgJiAweGZmMDApLAorCSAgICAgaW9hZGRyIC0gMHgxMCArIE9TSVRFQ0hfQVVJX1BXUik7CisKKyAgICAvKiBGaWxsIGluIHRoZSBwaHlzaWNhbCBhZGRyZXNzLiAgVGhlIGRhdGFib29rIGlzIHdyb25nIGFib3V0IHRoZSBvcmRlciEgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSArPSAyKQorCW91dHcoKGRldi0+ZGV2X2FkZHJbaSsxXTw8OCkrZGV2LT5kZXZfYWRkcltpXSwKKwkgICAgIGlvYWRkciArIEFERFIwICsgaSk7CisKKyAgICAvKiBSZXNldCB0aGUgTU1VICovCisgICAgU01DX1NFTEVDVF9CQU5LKDIpOworICAgIG91dHcoTUNfUkVTRVQsIGlvYWRkciArIE1NVV9DTUQpOworICAgIG91dHcoMCwgaW9hZGRyICsgSU5URVJSVVBUKTsKKworICAgIC8qIFJlLWVuYWJsZSB0aGUgY2hpcC4gKi8KKyAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisgICAgb3V0dygoKHNtYy0+Y2ZnICYgQ0ZHX01JSV9TRUxFQ1QpID8gMCA6IFRDUl9NT05DU04pIHwKKwkgVENSX0VOQUJMRSB8IFRDUl9QQURfRU4gfCBzbWMtPmR1cGxleCwgaW9hZGRyICsgVENSKTsKKyAgICBzZXRfcnhfbW9kZShkZXYpOworCisgICAgaWYgKHNtYy0+Y2ZnICYgQ0ZHX01JSV9TRUxFQ1QpIHsKKwlTTUNfU0VMRUNUX0JBTksoMyk7CisKKwkvKiBSZXNldCBNSUkgKi8KKwltZGlvX3dyaXRlKGRldiwgc21jLT5taWlfaWYucGh5X2lkLCAwLCAweDgwMDApOworCisJLyogQWR2ZXJ0aXNlIDEwMEYsIDEwMEgsIDEwRiwgMTBIICovCisJbWRpb193cml0ZShkZXYsIHNtYy0+bWlpX2lmLnBoeV9pZCwgNCwgMHgwMWUxKTsKKworCS8qIFJlc3RhcnQgTUlJIGF1dG9uZWdvdGlhdGlvbiAqLworCW1kaW9fd3JpdGUoZGV2LCBzbWMtPm1paV9pZi5waHlfaWQsIDAsIDB4MDAwMCk7CisJbWRpb193cml0ZShkZXYsIHNtYy0+bWlpX2lmLnBoeV9pZCwgMCwgMHgxMjAwKTsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgaW50ZXJydXB0cy4gKi8KKyAgICBTTUNfU0VMRUNUX0JBTksoMik7CisgICAgb3V0dygoSU1fRVBIX0lOVCB8IElNX1JYX09WUk5fSU5UIHwgSU1fUkNWX0lOVCkgPDwgOCwKKwkgaW9hZGRyICsgSU5URVJSVVBUKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBNZWRpYSBzZWxlY3Rpb24gdGltZXIgcm91dGluZQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgbWVkaWFfY2hlY2sodV9sb25nIGFyZykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGFyZzsKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1X3Nob3J0IGksIG1lZGlhLCBzYXZlZF9iYW5rOworICAgIHVfc2hvcnQgbGluazsKKworICAgIHNhdmVkX2JhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOworCisgICAgaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCWdvdG8gcmVzY2hlZHVsZTsKKworICAgIFNNQ19TRUxFQ1RfQkFOSygyKTsKKworICAgIC8qIG5lZWQgTUNfUkVTRVQgdG8ga2VlcCB0aGUgbWVtb3J5IGNvbnNpc3RlbnQuIGVycmF0YT8gKi8KKyAgICBpZiAoc21jLT5yeF9vdnJuKSB7CisJb3V0dyhNQ19SRVNFVCwgaW9hZGRyICsgTU1VX0NNRCk7CisJc21jLT5yeF9vdnJuID0gMDsKKyAgICB9CisgICAgaSA9IGludyhpb2FkZHIgKyBJTlRFUlJVUFQpOworICAgIFNNQ19TRUxFQ1RfQkFOSygwKTsKKyAgICBtZWRpYSA9IGludyhpb2FkZHIgKyBFUEgpICYgRVBIX0xJTktfT0s7CisgICAgU01DX1NFTEVDVF9CQU5LKDEpOworICAgIG1lZGlhIHw9IChpbncoaW9hZGRyICsgQ09ORklHKSAmIENGR19BVUlfU0VMRUNUKSA/IDIgOiAxOworCisgICAgLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0IHdpdGggd2F0Y2hkb2cgZmxhZyBzZXQ6IHdpdGgKKyAgICAgICB0aGlzLCB3ZSBjYW4gbGltcCBhbG9uZyBldmVuIGlmIHRoZSBpbnRlcnJ1cHQgaXMgYmxvY2tlZCAqLworICAgIGlmIChzbWMtPndhdGNoZG9nKysgJiYgKChpPj44KSAmIGkpKSB7CisJaWYgKCFzbWMtPmZhc3RfcG9sbCkKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludGVycnVwdChzKSBkcm9wcGVkIVxuIiwgZGV2LT5uYW1lKTsKKwlzbWNfaW50ZXJydXB0KGRldi0+aXJxLCBzbWMsIE5VTEwpOworCXNtYy0+ZmFzdF9wb2xsID0gSFo7CisgICAgfQorICAgIGlmIChzbWMtPmZhc3RfcG9sbCkgeworCXNtYy0+ZmFzdF9wb2xsLS07CisJc21jLT5tZWRpYS5leHBpcmVzID0gamlmZmllcyArIEhaLzEwMDsKKwlhZGRfdGltZXIoJnNtYy0+bWVkaWEpOworCVNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKHNtYy0+Y2ZnICYgQ0ZHX01JSV9TRUxFQ1QpIHsKKwlpZiAoc21jLT5taWlfaWYucGh5X2lkIDwgMCkKKwkgICAgZ290byByZXNjaGVkdWxlOworCisJU01DX1NFTEVDVF9CQU5LKDMpOworCWxpbmsgPSBtZGlvX3JlYWQoZGV2LCBzbWMtPm1paV9pZi5waHlfaWQsIDEpOworCWlmICghbGluayB8fCAobGluayA9PSAweGZmZmYpKSB7CisgIAkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSBpcyBtaXNzaW5nIVxuIiwgZGV2LT5uYW1lKTsKKwkgICAgc21jLT5taWlfaWYucGh5X2lkID0gLTE7CisJICAgIGdvdG8gcmVzY2hlZHVsZTsKKwl9CisKKwlsaW5rICY9IDB4MDAwNDsKKwlpZiAobGluayAhPSBzbWMtPmxpbmtfc3RhdHVzKSB7CisJICAgIHVfc2hvcnQgcCA9IG1kaW9fcmVhZChkZXYsIHNtYy0+bWlpX2lmLnBoeV9pZCwgNSk7CisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBsaW5rIGJlYXRcbiIsIGRldi0+bmFtZSwKKwkJKGxpbmspID8gImZvdW5kIiA6ICJsb3N0Iik7CisJICAgIHNtYy0+ZHVwbGV4ID0gKCgocCAmIDB4MDEwMCkgfHwgKChwICYgMHgxYzApID09IDB4NDApKQorCQkJICAgPyBUQ1JfRkRVUExYIDogMCk7CisJICAgIGlmIChsaW5rKSB7CisJICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogYXV0b25lZ290aWF0aW9uIGNvbXBsZXRlOiAiCisJCSAgICAgICAiJXNiYXNlVC0lY0Qgc2VsZWN0ZWRcbiIsIGRldi0+bmFtZSwKKwkJICAgICAgICgocCAmIDB4MDE4MCkgPyAiMTAwIiA6ICIxMCIpLAorCQkgICAgICAgKHNtYy0+ZHVwbGV4ID8gJ0YnIDogJ0gnKSk7CisJICAgIH0KKwkgICAgU01DX1NFTEVDVF9CQU5LKDApOworCSAgICBvdXR3KGludyhpb2FkZHIgKyBUQ1IpIHwgc21jLT5kdXBsZXgsIGlvYWRkciArIFRDUik7CisJICAgIHNtYy0+bGlua19zdGF0dXMgPSBsaW5rOworCX0KKwlnb3RvIHJlc2NoZWR1bGU7CisgICAgfQorCisgICAgLyogSWdub3JlIGNvbGxpc2lvbnMgdW5sZXNzIHdlJ3ZlIGhhZCBubyByeCdzIHJlY2VudGx5ICovCisgICAgaWYgKGppZmZpZXMgLSBkZXYtPmxhc3RfcnggPiBIWikgeworCWlmIChzbWMtPnR4X2VyciB8fCAoc21jLT5tZWRpYV9zdGF0dXMgJiBFUEhfMTZDT0wpKQorCSAgICBtZWRpYSB8PSBFUEhfMTZDT0w7CisgICAgfQorICAgIHNtYy0+dHhfZXJyID0gMDsKKworICAgIGlmIChtZWRpYSAhPSBzbWMtPm1lZGlhX3N0YXR1cykgeworCWlmICgobWVkaWEgJiBzbWMtPm1lZGlhX3N0YXR1cyAmIDEpICYmCisJICAgICgoc21jLT5tZWRpYV9zdGF0dXMgXiBtZWRpYSkgJiBFUEhfTElOS19PSykpCisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBsaW5rIGJlYXRcbiIsIGRldi0+bmFtZSwKKwkJICAgKHNtYy0+bWVkaWFfc3RhdHVzICYgRVBIX0xJTktfT0sgPyAibG9zdCIgOiAiZm91bmQiKSk7CisJZWxzZSBpZiAoKG1lZGlhICYgc21jLT5tZWRpYV9zdGF0dXMgJiAyKSAmJgorCQkgKChzbWMtPm1lZGlhX3N0YXR1cyBeIG1lZGlhKSAmIEVQSF8xNkNPTCkpCisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBjb2F4IGNhYmxlICVzXG4iLCBkZXYtPm5hbWUsCisJCSAgIChtZWRpYSAmIEVQSF8xNkNPTCA/ICJwcm9ibGVtIiA6ICJvayIpKTsKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDApIHsKKwkgICAgaWYgKG1lZGlhICYgMSkgeworCQlpZiAobWVkaWEgJiBFUEhfTElOS19PSykKKwkJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBmbGlwcGVkIHRvIDEwYmFzZVRcbiIsCisJCQkgICBkZXYtPm5hbWUpOworCQllbHNlCisJCSAgICBzbWNfc2V0X3hjdnIoZGV2LCAyKTsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKG1lZGlhICYgRVBIXzE2Q09MKQorCQkgICAgc21jX3NldF94Y3ZyKGRldiwgMSk7CisJCWVsc2UKKwkJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBmbGlwcGVkIHRvIDEwYmFzZTJcbiIsCisJCQkgICBkZXYtPm5hbWUpOworCSAgICB9CisJfQorCXNtYy0+bWVkaWFfc3RhdHVzID0gbWVkaWE7CisgICAgfQorCityZXNjaGVkdWxlOgorICAgIHNtYy0+bWVkaWEuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKyAgICBhZGRfdGltZXIoJnNtYy0+bWVkaWEpOworICAgIFNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKK30KKworc3RhdGljIGludCBzbWNfbGlua19vayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgaWYgKHNtYy0+Y2ZnICYgQ0ZHX01JSV9TRUxFQ1QpIHsKKwlyZXR1cm4gbWlpX2xpbmtfb2soJnNtYy0+bWlpX2lmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisJcmV0dXJuIGludyhpb2FkZHIgKyBFUEgpICYgRVBIX0xJTktfT0s7CisgICAgfQorfQorCitzdGF0aWMgaW50IHNtY19uZXRkZXZfZ2V0X2VjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworICAgIHUxNiB0bXA7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIGVjbWQtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfVFAgfCBTVVBQT1JURURfQVVJIHwKKwlTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCk7CisJCQorICAgIFNNQ19TRUxFQ1RfQkFOSygxKTsKKyAgICB0bXAgPSBpbncoaW9hZGRyICsgQ09ORklHKTsKKyAgICBlY21kLT5wb3J0ID0gKHRtcCAmIENGR19BVUlfU0VMRUNUKSA/IFBPUlRfQVVJIDogUE9SVF9UUDsKKyAgICBlY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisgICAgZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKKyAgICBlY21kLT5waHlfYWRkcmVzcyA9IGlvYWRkciArIE1HTVQ7CisKKyAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisgICAgdG1wID0gaW53KGlvYWRkciArIFRDUik7CisgICAgZWNtZC0+ZHVwbGV4ID0gKHRtcCAmIFRDUl9GRFVQTFgpID8gRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtY19uZXRkZXZfc2V0X2VjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworICAgIHUxNiB0bXA7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIGlmIChlY21kLT5zcGVlZCAhPSBTUEVFRF8xMCkKKyAgICAJcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJiBlY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisgICAgCXJldHVybiAtRUlOVkFMOworICAgIGlmIChlY21kLT5wb3J0ICE9IFBPUlRfVFAgJiYgZWNtZC0+cG9ydCAhPSBQT1JUX0FVSSkKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoZWNtZC0+dHJhbnNjZWl2ZXIgIT0gWENWUl9JTlRFUk5BTCkKKyAgICAJcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoZWNtZC0+cG9ydCA9PSBQT1JUX0FVSSkKKwlzbWNfc2V0X3hjdnIoZGV2LCAxKTsKKyAgICBlbHNlCisJc21jX3NldF94Y3ZyKGRldiwgMCk7CisKKyAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisgICAgdG1wID0gaW53KGlvYWRkciArIFRDUik7CisgICAgaWYgKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwl0bXAgfD0gVENSX0ZEVVBMWDsKKyAgICBlbHNlCisJdG1wICY9IH5UQ1JfRkRVUExYOworICAgIG91dHcodG1wLCBpb2FkZHIgKyBUQ1IpOworCQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2lmX3J1bm5pbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNtY19nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworfQorCitzdGF0aWMgaW50IHNtY19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXUxNiBzYXZlZF9iYW5rID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKKwlpbnQgcmV0OworCisJU01DX1NFTEVDVF9CQU5LKDMpOworCXNwaW5fbG9ja19pcnEoJnNtYy0+bG9jayk7CisJaWYgKHNtYy0+Y2ZnICYgQ0ZHX01JSV9TRUxFQ1QpCisJCXJldCA9IG1paV9ldGh0b29sX2dzZXQoJnNtYy0+bWlpX2lmLCBlY21kKTsKKwllbHNlCisJCXJldCA9IHNtY19uZXRkZXZfZ2V0X2VjbWQoZGV2LCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJnNtYy0+bG9jayk7CisJU01DX1NFTEVDVF9CQU5LKHNhdmVkX2JhbmspOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc21jX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTE2IHNhdmVkX2JhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOworCWludCByZXQ7CisKKwlTTUNfU0VMRUNUX0JBTksoMyk7CisJc3Bpbl9sb2NrX2lycSgmc21jLT5sb2NrKTsKKwlpZiAoc21jLT5jZmcgJiBDRkdfTUlJX1NFTEVDVCkKKwkJcmV0ID0gbWlpX2V0aHRvb2xfc3NldCgmc21jLT5taWlfaWYsIGVjbWQpOworCWVsc2UKKwkJcmV0ID0gc21jX25ldGRldl9zZXRfZWNtZChkZXYsIGVjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmc21jLT5sb2NrKTsKKwlTTUNfU0VMRUNUX0JBTksoc2F2ZWRfYmFuayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBzbWNfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisJa2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgc2F2ZWRfYmFuayA9IGludyhpb2FkZHIgKyBCQU5LX1NFTEVDVCk7CisJdTMyIHJldDsKKworCVNNQ19TRUxFQ1RfQkFOSygzKTsKKwlzcGluX2xvY2tfaXJxKCZzbWMtPmxvY2spOworCXJldCA9IHNtY19saW5rX29rKGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZzbWMtPmxvY2spOworCVNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgdTMyIHNtY19nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gcGNfZGVidWc7Cit9CisKK3N0YXRpYyB2b2lkIHNtY19zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbCkKK3sKKwlwY19kZWJ1ZyA9IHZhbDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHNtY19ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCWlmIChzbWMtPmNmZyAmIENGR19NSUlfU0VMRUNUKSB7CisJCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJCXUxNiBzYXZlZF9iYW5rID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKKwkJaW50IHJlczsKKworCQlTTUNfU0VMRUNUX0JBTksoMyk7CisJCXJlcyA9IG1paV9ud2F5X3Jlc3RhcnQoJnNtYy0+bWlpX2lmKTsKKwkJU01DX1NFTEVDVF9CQU5LKHNhdmVkX2JhbmspOworCisJCXJldHVybiByZXM7CisJfSBlbHNlCisJCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBldGh0b29sX29wcyA9IHsKKwkuYmVnaW4gPSBjaGVja19pZl9ydW5uaW5nLAorCS5nZXRfZHJ2aW5mbyA9IHNtY19nZXRfZHJ2aW5mbywKKwkuZ2V0X3NldHRpbmdzID0gc21jX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzID0gc21jX3NldF9zZXR0aW5ncywKKwkuZ2V0X2xpbmsgPSBzbWNfZ2V0X2xpbmssCisjaWZkZWYgUENNQ0lBX0RFQlVHCisJLmdldF9tc2dsZXZlbCA9IHNtY19nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbCA9IHNtY19zZXRfbXNnbGV2ZWwsCisjZW5kaWYKKwkubndheV9yZXNldCA9IHNtY19ud2F5X3Jlc2V0LAorfTsKKworc3RhdGljIGludCBzbWNfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqbWlpID0gaWZfbWlpKHJxKTsKKwlpbnQgcmMgPSAwOworCXUxNiBzYXZlZF9iYW5rOworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxKCZzbWMtPmxvY2spOworCXNhdmVkX2JhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOworCVNNQ19TRUxFQ1RfQkFOSygzKTsKKwlyYyA9IGdlbmVyaWNfbWlpX2lvY3RsKCZzbWMtPm1paV9pZiwgbWlpLCBjbWQsIE5VTEwpOworCVNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKKwlzcGluX3VubG9ja19pcnEoJnNtYy0+bG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgc21jOTFjOTJfY3NfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAic21jOTFjOTJfY3MiLAorCX0sCisJLmF0dGFjaAkJPSBzbWM5MWM5Ml9hdHRhY2gsCisJLmRldGFjaAkJPSBzbWM5MWM5Ml9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NtYzkxYzkyX2NzKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJnNtYzkxYzkyX2NzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3NtYzkxYzkyX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZzbWM5MWM5Ml9jc19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9zbWM5MWM5Ml9jcyk7Cittb2R1bGVfZXhpdChleGl0X3NtYzkxYzkyX2NzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MTc3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCkBAIC0wLDAgKzEsMjAzMSBAQAorLyogW3hpcmMycHNfY3MuYyB3ayAwMy4xMS45OV0gKDEuNDAgMTk5OS8xMS8xOCAwMDowNjowMykKKyAqIFhpcmNvbSBDcmVkaXRDYXJkIEV0aGVybmV0IEFkYXB0ZXIgSUlwcyBkcml2ZXIKKyAqIFhpcmNvbSBSZWFscG9ydCAxMC8xMDAgKFJFLTEwMCkgZHJpdmVyIAorICoKKyAqIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHZhcmlvdXMgWGlyY29tIENyZWRpdENhcmQgRXRoZXJuZXQgYWRhcHRlcnMKKyAqIGluY2x1ZGluZyB0aGUgQ0UyLCBDRSBJSXBzLCBSRS0xMCwgQ0VNMjgsIENFTTMzLCBDRTMzLCBDRU01NiwKKyAqIENFMy0xMDAsIENFM0IsIFJFLTEwMCwgUkVNMTBCVCwgYW5kIFJFTTU2Ry0xMDAuCisgKgorICogMjAwMC0wOS0yNCA8cHNoZWVyQGljb24uY28uemE+IFRoZSBYaXJjb20gQ0UzQi0xMDAgbWF5IG5vdAorICogYXV0b2RldGVjdCB0aGUgbWVkaWEgcHJvcGVybHkuIEluIHRoaXMgY2FzZSB1c2UgdGhlCisgKiBpZl9wb3J0PTEgKGZvciAxMEJhc2VUKSBvciBpZl9wb3J0PTQgKGZvciAxMDBCYXNlVCkgb3B0aW9ucworICogdG8gZm9yY2UgdGhlIG1lZGlhIHR5cGUuCisgKiAKKyAqIFdyaXR0ZW4gb3JpZ2luYWxseSBieSBXZXJuZXIgS29jaCBiYXNlZCBvbiBEYXZpZCBIaW5kcycgc2tlbGV0b24gb2YgdGhlCisgKiBQQ01DSUEgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NywxOTk4IFdlcm5lciBLb2NoIChkZDlqbikKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogSXQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIGRyaXZlciBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhpcyBsaWNlbnNlCisgKiBhcmUgcmVxdWlyZWQgSU5TVEVBRCBPRiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICAoVGhpcyBjbGF1c2UKKyAqIGlzIG5lY2Vzc2FyeSBkdWUgdG8gYSBwb3RlbnRpYWwgYmFkIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIEdQTCBhbmQKKyAqIHRoZSByZXN0cmljdGlvbnMgY29udGFpbmVkIGluIGEgQlNELXN0eWxlIGNvcHlyaWdodC4pCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmbmRlZiBNQU5GSURfQ09NUEFRCisgICNkZWZpbmUgTUFORklEX0NPTVBBUSAJICAgMHgwMTM4CisgICNkZWZpbmUgTUFORklEX0NPTVBBUTIJICAgMHgwMTgzICAvKiBpcyB0aGlzIGNvcnJlY3Q/ICovCisjZW5kaWYKKworI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgVHggaHVuZyAqLworI2RlZmluZSBUWF9USU1FT1VUCSgoNDAwKkhaKS8xMDAwKQorCisvKioqKioqKioqKioqKioqKgorICogU29tZSBjb25zdGFudHMgdXNlZCB0byBhY2Nlc3MgdGhlIGhhcmR3YXJlCisgKi8KKworLyogUmVnaXN0ZXIgb2Zmc2V0cyBhbmQgdmFsdWUgY29uc3RhbnMgKi8KKyNkZWZpbmUgWElSQ1JFR19DUiAgMAkvKiBDb21tYW5kIHJlZ2lzdGVyICh3cikgKi8KK2VudW0geGlyY19jciB7CisgICAgVHJhbnNtaXRQYWNrZXQgPSAweDAxLAorICAgIFNvZnRSZXNldCA9IDB4MDIsCisgICAgRW5hYmxlSW50ciA9IDB4MDQsCisgICAgRm9yY2VJbnRyICA9IDB4MDgsCisgICAgQ2xlYXJUeEZJRk8gPSAweDEwLAorICAgIENsZWFyUnhPdnJ1biA9IDB4MjAsCisgICAgUmVzdGFydFR4CSA9IDB4NDAKK307CisjZGVmaW5lIFhJUkNSRUdfRVNSIDAJLyogRXRoZXJuZXQgc3RhdHVzIHJlZ2lzdGVyIChyZCkgKi8KK2VudW0geGlyY19lc3IgeworICAgIEZ1bGxQa3RSY3ZkID0gMHgwMSwgLyogZnVsbCBwYWNrZXQgaW4gcmVjZWl2ZSBidWZmZXIgKi8KKyAgICBQa3RSZWplY3RlZCA9IDB4MDQsIC8qIGEgcGFja2V0IGhhcyBiZWVuIHJlamVjdGVkICovCisgICAgVHhQa3RQZW5kID0gMHgwOCwJLyogVFggUGFja2V0IFBlbmRpbmcgKi8KKyAgICBJbmNvclBvbGFyaXR5ID0gMHgxMCwKKyAgICBNZWRpYVNlbGVjdCA9IDB4MjAJLyogc2V0IGlmIFRQLCBjbGVhciBpZiBBVUkgKi8KK307CisjZGVmaW5lIFhJUkNSRUdfUFIgIDEJLyogUGFnZSBSZWdpc3RlciBzZWxlY3QgKi8KKyNkZWZpbmUgWElSQ1JFR19FRFAgNAkvKiBFdGhlcm5ldCBEYXRhIFBvcnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWElSQ1JFR19JU1IgNgkvKiBFdGhlcm5ldCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCitlbnVtIHhpcmNfaXNyIHsKKyAgICBUeEJ1Zk92ciA9IDB4MDEsCS8qIFRYIEJ1ZmZlciBPdmVyZmxvdyAqLworICAgIFBrdFR4ZWQgID0gMHgwMiwJLyogUGFja2V0IFRyYW5zbWl0dGVkICovCisgICAgTUFDSW50ciAgPSAweDA0LAkvKiBNQUMgSW50ZXJydXB0IG9jY3VycmVkICovCisgICAgVHhSZXNHcmFudCA9IDB4MDgsCS8qIFR4IFJlc2VydmF0aW9uIEdyYW50ZWQgKi8KKyAgICBSeEZ1bGxQa3QgPSAweDIwLAkvKiBSeCBGdWxsIFBhY2tldCAqLworICAgIFJ4UGt0UmVqICA9IDB4NDAsCS8qIFJ4IFBhY2tldCBSZWplY3RlZCAqLworICAgIEZvcmNlZEludHI9IDB4ODAJLyogRm9yY2VkIEludGVycnVwdCAqLworfTsKKyNkZWZpbmUgWElSQ1JFRzFfSU1SMCAxMiAvKiBFdGhlcm5ldCBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAob24gcGFnZSAxKSovCisjZGVmaW5lIFhJUkNSRUcxX0lNUjEgMTMKKyNkZWZpbmUgWElSQ1JFRzBfVFNPICA4ICAvKiBUcmFuc21pdCBTcGFjZSBPcGVuIFJlZ2lzdGVyIChvbiBwYWdlIDApKi8KKyNkZWZpbmUgWElSQ1JFRzBfVFJTICAxMCAvKiBUcmFuc21pdCByZXNlcnZhdGlvbiBTaXplIFJlZ2lzdGVyIChwYWdlIDApKi8KKyNkZWZpbmUgWElSQ1JFRzBfRE8gICAxMiAvKiBEYXRhIE9mZnNldCBSZWdpc3RlciAocGFnZSAwKSAod3IpICovCisjZGVmaW5lIFhJUkNSRUcwX1JTUiAgMTIgLyogUmVjZWl2ZSBTdGF0dXMgUmVnaXN0ZXIgKHBhZ2UgMCkgKHJkKSAqLworZW51bSB4aXJjX3JzciB7CisgICAgUGh5UGt0ID0gMHgwMSwJLyogc2V0OnBoeXNpY2FsIHBhY2tldCwgY2xlYXI6IG11bHRpY2FzdCBwYWNrZXQgKi8KKyAgICBCcmRjc3RQa3QgPSAweDAyLAkvKiBzZXQgaWYgaXQgaXMgYSBicm9hZGNhc3QgcGFja2V0ICovCisgICAgUGt0VG9vTG9uZyA9IDB4MDQsCS8qIHNldCBpZiBwYWNrZXQgbGVuZ3RoID4gMTUxOCAqLworICAgIEFsaWduRXJyID0gMHgxMCwJLyogaW5jb3JyZWN0IENSQyBhbmQgbGFzdCBvY3RldCBub3QgY29tcGxldGUgKi8KKyAgICBDUkNFcnIgPSAweDIwLAkvKiBpbmNvcnJlY3QgQ1JDIGFuZCBsYXN0IG9jdGV0IGlzIGNvbXBsZXRlICovCisgICAgUGt0UnhPayA9IDB4ODAJLyogcmVjZWl2ZWQgb2sgKi8KK307CisjZGVmaW5lIFhJUkNSRUcwX1BUUiAxMyAvKiBwYWNrZXRzIHRyYW5zbWl0dGVkIHJlZ2lzdGVyIChyZCkgKi8KKyNkZWZpbmUgWElSQ1JFRzBfUkJDIDE0IC8qIHJlY2VpdmUgYnl0ZSBjb3VudCByZWdzaXN0ZXIgKHJkKSAqLworI2RlZmluZSBYSVJDUkVHMV9FQ1IgMTQgLyogZXRoZXJuZXQgY29uZmlndXJhdGlvbm4gcmVnaXN0ZXIgKi8KK2VudW0geGlyY19lY3IgeworICAgIEZ1bGxEdXBsZXggPSAweDA0LAkvKiBlbmFibGUgZnVsbCBkdXBsZXggbW9kZSAqLworICAgIExvbmdUUE1vZGUgPSAweDA4LAkvKiBhZGp1c3QgZm9yIGxvbmdlciBsZW5ndGhzIG9mIFRQIGNhYmxlICovCisgICAgRGlzYWJsZVBvbENvciA9IDB4MTAsLyogZGlzYWJsZSBhdXRvIHBvbGFyaXR5IGNvcnJlY3Rpb24gKi8KKyAgICBEaXNhYmxlTGlua1B1bHNlID0gMHgyMCwgLyogZGlzYWJsZSBsaW5rIHB1bHNlIGdlbmVyYXRpb24gKi8KKyAgICBEaXNhYmxlQXV0b1R4ID0gMHg0MCwgLyogZGlzYWJsZSBhdXRvLXRyYW5zbWl0ICovCit9OworI2RlZmluZSBYSVJDUkVHMl9SQlMgOAkvKiByZWNlaXZlIGJ1ZmZlciBzdGFydCByZWdpc3RlciAqLworI2RlZmluZSBYSVJDUkVHMl9MRUQgMTAgLyogTEVEIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKy8qIHZhbHVlcyBmb3IgdGhlIGxlZHM6ICAgIEJpdHMgMi0wIGZvciBsZWQgMQorICogIDAgZGlzYWJsZWQJCSAgIEJpdHMgNS0zIGZvciBsZWQgMgorICogIDEgY29sbGlzaW9uCisgKiAgMiBub25jb2xsaXNpb24KKyAqICAzIGxpbmtfZGV0ZWN0ZWQKKyAqICA0IGluY29yX3BvbGFyaXR5CisgKiAgNSBqYWJiZXIKKyAqICA2IGF1dG9fYXNzZXJ0aW9uCisgKiAgNyByeF90eF9hY3Rpdml0eQorICovCisjZGVmaW5lIFhJUkNSRUcyX01TUiAxMiAvKiBNb2hhd2sgc3BlY2lmaWMgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBYSVJDUkVHNF9HUFIwIDggLyogR2VuZXJhbCBQdXJwb3NlIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgWElSQ1JFRzRfR1BSMSA5IC8qIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlciAxICovCisjZGVmaW5lIFhJUkNSRUcyX0dQUjIgMTMgLyogR2VuZXJhbCBQdXJwb3NlIFJlZ2lzdGVyIDIgKHBhZ2UyISkqLworI2RlZmluZSBYSVJDUkVHNF9CT1YgMTAgLyogQm9uZGluZyBWZXJzaW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFhJUkNSRUc0X0xNQSAxMiAvKiBMb2NhbCBNZW1vcnkgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBYSVJDUkVHNF9MTUQgMTQgLyogTG9jYWwgTWVtb3J5IERhdGEgUG9ydCAqLworLyogTUFDIHJlZ2lzdGVyIGNhbiBvbmx5IGJ5IGFjY2Vzc2VkIHdpdGggOCBiaXQgb3BlcmF0aW9ucyAqLworI2RlZmluZSBYSVJDUkVHNDBfQ01EMCA4ICAgIC8qIENvbW1hbmQgUmVnaXN0ZXIgKHdyKSAqLworZW51bSB4aXJjX2NtZCB7IAkgICAgLyogQ29tbWFuZHMgKi8KKyAgICBUcmFuc21pdCA9IDB4MDEsCisgICAgRW5hYmxlUmVjdiA9IDB4MDQsCisgICAgRGlzYWJsZVJlY3YgPSAweDA4LAorICAgIEFib3J0ID0gMHgxMCwKKyAgICBPbmxpbmUgPSAweDIwLAorICAgIEludHJBY2sgPSAweDQwLAorICAgIE9mZmxpbmUgPSAweDgwCit9OworI2RlZmluZSBYSVJDUkVHNV9SSFNBMAkxMCAgLyogUnggSG9zdCBTdGFydCBBZGRyZXNzICovCisjZGVmaW5lIFhJUkNSRUc0MF9SWFNUMCA5ICAgLyogUmVjZWl2ZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWElSQ1JFRzQwX1RYU1QwIDExICAvKiBUcmFuc21pdCBTdGF0dXMgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBYSVJDUkVHNDBfVFhTVDEgMTIgIC8qIFRyYW5zbWl0IFN0YXR1cyBSZWdpc3RlciAxMCAqLworI2RlZmluZSBYSVJDUkVHNDBfUk1BU0swIDEzICAvKiBSZWNlaXZlIE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWElSQ1JFRzQwX1RNQVNLMCAxNCAgLyogVHJhbnNtaXQgTWFzayBSZWdpc3RlciAwICovCisjZGVmaW5lIFhJUkNSRUc0MF9UTUFTSzEgMTUgIC8qIFRyYW5zbWl0IE1hc2sgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBYSVJDUkVHNDJfU1dDMAk4ICAgLyogU29mdHdhcmUgQ29uZmlndXJhdGlvbiAwICovCisjZGVmaW5lIFhJUkNSRUc0Ml9TV0MxCTkgICAvKiBTb2Z0d2FyZSBDb25maWd1cmF0aW9uIDEgKi8KKyNkZWZpbmUgWElSQ1JFRzQyX0JPQwkxMCAgLyogQmFjay1PZmYgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBYSVJDUkVHNDRfVERSMAk4ICAgLyogVGltZSBEb21haW4gUmVmbGVjdG9tZXRyeSAwICovCisjZGVmaW5lIFhJUkNSRUc0NF9URFIxCTkgICAvKiBUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5IDEgKi8KKyNkZWZpbmUgWElSQ1JFRzQ0X1JYQkNfTE8gMTAgLyogUnggQnl0ZSBDb3VudCAwIChyZCkgKi8KKyNkZWZpbmUgWElSQ1JFRzQ0X1JYQkNfSEkgMTEgLyogUnggQnl0ZSBDb3VudCAxIChyZCkgKi8KKyNkZWZpbmUgWElSQ1JFRzQ1X1JFVgkgMTUgLyogUmV2aXNpb24gUmVnaXN0ZXIgKHJkKSAqLworI2RlZmluZSBYSVJDUkVHNTBfSUEJOCAgIC8qIEluZGl2aWR1YWwgQWRkcmVzcyAoOC0xMykgKi8KKworc3RhdGljIGNoYXIgKmlmX25hbWVzW10gPSB7ICJBdXRvIiwgIjEwQmFzZVQiLCAiMTBCYXNlMiIsICJBVUkiLCAiMTAwQmFzZVQiIH07CisKKy8qKioqKioqKioqKioqKioqCisgKiBBbGwgdGhlIFBDTUNJQSBtb2R1bGVzIHVzZSBQQ01DSUFfREVCVUcgdG8gY29udHJvbCBkZWJ1Z2dpbmcuICBJZgorICogeW91IGRvIG5vdCBkZWZpbmUgUENNQ0lBX0RFQlVHIGF0IGFsbCwgYWxsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwgYmUKKyAqIGxlZnQgb3V0LiAgSWYgeW91IGNvbXBpbGUgd2l0aCBQQ01DSUFfREVCVUc9MCwgdGhlIGRlYnVnIGNvZGUgd2lsbAorICogYmUgcHJlc2VudCBidXQgZGlzYWJsZWQgLS0gYnV0IGl0IGNhbiB0aGVuIGJlIGVuYWJsZWQgZm9yIHNwZWNpZmljCisgKiBtb2R1bGVzIGF0IGxvYWQgdGltZSB3aXRoIGEgJ3BjX2RlYnVnPSMnIG9wdGlvbiB0byBpbnNtb2QuCisgKi8KKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLREJHX1hJUkMgYXJncykKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBLREJHX1hJUkMgS0VSTl9ERUJVRyAgICJ4aXJjMnBzX2NzOiAiCisjZGVmaW5lIEtFUlJfWElSQyBLRVJOX0VSUiAgICAgInhpcmMycHNfY3M6ICIKKyNkZWZpbmUgS1dSTl9YSVJDIEtFUk5fV0FSTklORyAieGlyYzJwc19jczogIgorI2RlZmluZSBLTk9UX1hJUkMgS0VSTl9OT1RJQ0UgICJ4aXJjMnBzX2NzOiAiCisjZGVmaW5lIEtJTkZfWElSQyBLRVJOX0lORk8gICAgInhpcmMycHNfY3M6ICIKKworLyogY2FyZCB0eXBlcyAqLworI2RlZmluZSBYSVJfVU5LTk9XTiAgMAkvKiB1bmtub3duOiBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIFhJUl9DRQkgICAgIDEJLyogKHByb2RpZCAxKSBkaWZmZXJlbnQgaGFyZHdhcmU6IG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgWElSX0NFMiAgICAgIDIJLyogKHByb2RpZCAyKSAqLworI2RlZmluZSBYSVJfQ0UzICAgICAgMwkvKiAocHJvZGlkIDMpICovCisjZGVmaW5lIFhJUl9DRU0gICAgICA0CS8qIChwcm9kaWQgMSkgZGlmZmVyZW50IGhhcmR3YXJlOiBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIFhJUl9DRU0yICAgICA1CS8qIChwcm9kaWQgMikgKi8KKyNkZWZpbmUgWElSX0NFTTMgICAgIDYJLyogKHByb2RpZCAzKSAqLworI2RlZmluZSBYSVJfQ0VNMzMgICAgNwkvKiAocHJvZGlkIDQpICovCisjZGVmaW5lIFhJUl9DRU01Nk0gICA4CS8qIChwcm9kaWQgNSkgKi8KKyNkZWZpbmUgWElSX0NFTTU2ICAgIDkJLyogKHByb2RpZCA2KSAqLworI2RlZmluZSBYSVJfQ00yOCAgICAxMAkvKiAocHJvZGlkIDMpIG1vZGVtIG9ubHk6IG5vdCBzdXBwb3J0ZWQgaGVyZSAqLworI2RlZmluZSBYSVJfQ00zMyAgICAxMQkvKiAocHJvZGlkIDQpIG1vZGVtIG9ubHk6IG5vdCBzdXBwb3J0ZWQgaGVyZSAqLworI2RlZmluZSBYSVJfQ001NiAgICAxMgkvKiAocHJvZGlkIDUpIG1vZGVtIG9ubHk6IG5vdCBzdXBwb3J0ZWQgaGVyZSAqLworI2RlZmluZSBYSVJfQ0cJICAgIDEzCS8qIChwcm9kaWQgMSkgR1NNIG1vZGVtIG9ubHk6IG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgWElSX0NCRSAgICAgMTQJLyogKHByb2RpZCAxKSBjYXJkYnVzIGV0aGVybmV0OiBub3Qgc3VwcG9ydGVkICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJYaXJjb20gUENNQ0lBIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOworCisjZGVmaW5lIElOVF9NT0RVTEVfUEFSTShuLCB2KSBzdGF0aWMgaW50IG4gPSB2OyBtb2R1bGVfcGFyYW0obiwgaW50LCAwKQorCitJTlRfTU9EVUxFX1BBUk0oaWZfcG9ydCwJMCk7CitJTlRfTU9EVUxFX1BBUk0oZnVsbF9kdXBsZXgsCTApOworSU5UX01PRFVMRV9QQVJNKGRvX3NvdW5kLCAJMSk7CitJTlRfTU9EVUxFX1BBUk0obG9ja3VwX2hhY2ssCTApOyAgLyogYW50aSBsb2NrdXAgaGFjayAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogV2UgZG8gbm90IHByb2Nlc3MgbW9yZSB0aGFuIHRoZXNlIG51bWJlciBvZiBieXRlcyBkdXJpbmcgb25lCisgKiBpbnRlcnJ1cHQuIChPZiBjb3Vyc2Ugd2UgcmVjZWl2ZSBjb21wbGV0ZSBwYWNrZXRzLCBzbyB0aGlzIGlzIG5vdAorICogYW4gZXhhY3QgdmFsdWUpLgorICogU29tZXRoaW5nIGJldHdlZW4gMjAwMC4uMjIwMDA7IGZpcnN0IHZhbHVlIGdpdmVzIGJlc3QgaW50ZXJydXB0IGxhdGVuY3ksCisgKiB0aGUgc2Vjb25kIGVuYWJsZXMgdGhlIHVzYWdlIG9mIHRoZSBjb21wbGV0ZSBvbi1jaGlwIGJ1ZmZlci4gV2UgdXNlIHRoZQorICogaGlnaCB2YWx1ZSBhcyB0aGUgaW5pdGlhbCB2YWx1ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIG1heHJ4X2J5dGVzID0gMjIwMDA7CisKKy8qIE1JSSBtYW5hZ2VtZW50IHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIG1paV9pZGxlKGtpb19hZGRyX3QgaW9hZGRyKTsKK3N0YXRpYyB2b2lkIG1paV9wdXRiaXQoa2lvX2FkZHJfdCBpb2FkZHIsIHVuc2lnbmVkIGRhdGEpOworc3RhdGljIGludCAgbWlpX2dldGJpdChraW9fYWRkcl90IGlvYWRkcik7CitzdGF0aWMgdm9pZCBtaWlfd2JpdHMoa2lvX2FkZHJfdCBpb2FkZHIsIHVuc2lnbmVkIGRhdGEsIGludCBsZW4pOworc3RhdGljIHVuc2lnbmVkIG1paV9yZChraW9fYWRkcl90IGlvYWRkciwgdV9jaGFyIHBoeWFkZHIsIHVfY2hhciBwaHlyZWcpOworc3RhdGljIHZvaWQgbWlpX3dyKGtpb19hZGRyX3QgaW9hZGRyLCB1X2NoYXIgcGh5YWRkciwgdV9jaGFyIHBoeXJlZywKKwkJICAgdW5zaWduZWQgZGF0YSwgaW50IGxlbik7CisKKy8qCisgKiBUaGUgZXZlbnQoKSBmdW5jdGlvbiBpcyB0aGlzIGRyaXZlcidzIENhcmQgU2VydmljZXMgZXZlbnQgaGFuZGxlci4KKyAqIEl0IHdpbGwgYmUgY2FsbGVkIGJ5IENhcmQgU2VydmljZXMgd2hlbiBhbiBhcHByb3ByaWF0ZSBjYXJkIHN0YXR1cworICogZXZlbnQgaXMgcmVjZWl2ZWQuICBUaGUgY29uZmlnKCkgYW5kIHJlbGVhc2UoKSBlbnRyeSBwb2ludHMgYXJlCisgKiB1c2VkIHRvIGNvbmZpZ3VyZSBvciByZWxlYXNlIGEgc29ja2V0LCBpbiByZXNwb25zZSB0byBjYXJkIGluc2VydGlvbgorICogYW5kIGVqZWN0aW9uIGV2ZW50cy4gIFRoZXkgYXJlIGludm9rZWQgZnJvbSB0aGUgZXZlbnQgaGFuZGxlci4KKyAqLworCitzdGF0aWMgaW50IGhhc19jZTJfc3RyaW5nKGRldl9saW5rX3QgKiBsaW5rKTsKK3N0YXRpYyB2b2lkIHhpcmMycHNfY29uZmlnKGRldl9saW5rX3QgKiBsaW5rKTsKK3N0YXRpYyB2b2lkIHhpcmMycHNfcmVsZWFzZShkZXZfbGlua190ICogbGluayk7CitzdGF0aWMgaW50IHhpcmMycHNfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqIGFyZ3MpOworCisvKioqKioqKioqKioqKioqKgorICogVGhlIGF0dGFjaCgpIGFuZCBkZXRhY2goKSBlbnRyeSBwb2ludHMgYXJlIHVzZWQgdG8gY3JlYXRlIGFuZCBkZXN0cm95CisgKiAiaW5zdGFuY2VzIiBvZiB0aGUgZHJpdmVyLCB3aGVyZSBlYWNoIGluc3RhbmNlIHJlcHJlc2VudHMgZXZlcnl0aGluZworICogbmVlZGVkIHRvIG1hbmFnZSBvbmUgYWN0dWFsIFBDTUNJQSBjYXJkLgorICovCisKK3N0YXRpYyBkZXZfbGlua190ICp4aXJjMnBzX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIHhpcmMycHNfZGV0YWNoKGRldl9saW5rX3QgKik7CisKKy8qKioqKioqKioqKioqKioqCisgKiBZb3UnbGwgYWxzbyBuZWVkIHRvIHByb3RvdHlwZSBhbGwgdGhlIGZ1bmN0aW9ucyB0aGF0IHdpbGwgYWN0dWFsbHkKKyAqIGJlIHVzZWQgdG8gdGFsayB0byB5b3VyIGRldmljZS4gIFNlZSAncGNtZW1fY3MnIGZvciBhIGdvb2QgZXhhbXBsZQorICogb2YgYSBmdWxseSBzZWxmLXN1ZmZpY2llbnQgZHJpdmVyOyB0aGUgb3RoZXIgZHJpdmVycyByZWx5IG1vcmUgb3IKKyAqIGxlc3Mgb24gb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbC4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgeGlyYzJwc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qCisgKiBUaGUgZGV2X2luZm8gdmFyaWFibGUgaXMgdGhlICJrZXkiIHRoYXQgaXMgdXNlZCB0byBtYXRjaCB1cCB0aGlzCisgKiBkZXZpY2UgZHJpdmVyIHdpdGggYXBwcm9wcmlhdGUgY2FyZHMsIHRocm91Z2ggdGhlIGNhcmQgY29uZmlndXJhdGlvbgorICogZGF0YWJhc2UuCisgKi8KKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAieGlyYzJwc19jcyI7CisKKy8qKioqKioqKioqKioqKioqCisgKiBBIGxpbmtlZCBsaXN0IG9mICJpbnN0YW5jZXMiIG9mIHRoZSBkZXZpY2UuICBFYWNoIGFjdHVhbAorICogUENNQ0lBIGNhcmQgY29ycmVzcG9uZHMgdG8gb25lIGRldmljZSBpbnN0YW5jZSwgYW5kIGlzIGRlc2NyaWJlZAorICogYnkgb25lIGRldl9saW5rX3Qgc3RydWN0dXJlIChkZWZpbmVkIGluIGRzLmgpLgorICoKKyAqIFlvdSBtYXkgbm90IHdhbnQgdG8gdXNlIGEgbGlua2VkIGxpc3QgZm9yIHRoaXMgLS0gZm9yIGV4YW1wbGUsIHRoZQorICogbWVtb3J5IGNhcmQgZHJpdmVyIHVzZXMgYW4gYXJyYXkgb2YgZGV2X2xpbmtfdCBwb2ludGVycywgd2hlcmUgbWlub3IKKyAqIGRldmljZSBudW1iZXJzIGFyZSB1c2VkIHRvIGRlcml2ZSB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBpbmRleC4KKyAqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CisKKy8qKioqKioqKioqKioqKioqCisgKiBBIGRldl9saW5rX3Qgc3RydWN0dXJlIGhhcyBmaWVsZHMgZm9yIG1vc3QgdGhpbmdzIHRoYXQgYXJlIG5lZWRlZAorICogdG8ga2VlcCB0cmFjayBvZiBhIHNvY2tldCwgYnV0IHRoZXJlIHdpbGwgdXN1YWxseSBiZSBzb21lIGRldmljZQorICogc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBhbHNvIG5lZWRzIHRvIGJlIGtlcHQgdHJhY2sgb2YuICBUaGUKKyAqICdwcml2JyBwb2ludGVyIGluIGEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8KKyAqIGEgZGV2aWNlLXNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsIGxpa2UgdGhpcy4KKyAqCisgKiBBIGRyaXZlciBuZWVkcyB0byBwcm92aWRlIGEgZGV2X25vZGVfdCBzdHJ1Y3R1cmUgZm9yIGVhY2ggZGV2aWNlCisgKiBvbiBhIGNhcmQuICBJbiBzb21lIGNhc2VzLCB0aGVyZSBpcyBvbmx5IG9uZSBkZXZpY2UgcGVyIGNhcmQgKGZvcgorICogZXhhbXBsZSwgZXRoZXJuZXQgY2FyZHMsIG1vZGVtcykuICBJbiBvdGhlciBjYXNlcywgdGhlcmUgbWF5IGJlCisgKiBtYW55IGFjdHVhbCBvciBsb2dpY2FsIGRldmljZXMgKFNDU0kgYWRhcHRlcnMsIG1lbW9yeSBjYXJkcyB3aXRoCisgKiBtdWx0aXBsZSBwYXJ0aXRpb25zKS4gIFRoZSBkZXZfbm9kZV90IHN0cnVjdHVyZXMgbmVlZCB0byBiZSBrZXB0CisgKiBpbiBhIGxpbmtlZCBsaXN0IHN0YXJ0aW5nIGF0IHRoZSAnZGV2JyBmaWVsZCBvZiBhIGRldl9saW5rX3QKKyAqIHN0cnVjdHVyZS4gIFdlIGFsbG9jYXRlIHRoZW0gaW4gdGhlIGNhcmQncyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLAorICogYmVjYXVzZSB0aGV5IGdlbmVyYWxseSBjYW4ndCBiZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbG9jYWxfaW5mb190IHsKKyAgICBkZXZfbGlua190IGxpbms7CisgICAgZGV2X25vZGVfdCBub2RlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworICAgIGludCBjYXJkX3R5cGU7CisgICAgaW50IHByb2JlX3BvcnQ7CisgICAgaW50IHNpbGljb247IC8qIHNpbGljb24gcmV2aXNpb24uIDA9b2xkIENFMiwgMT1TY2lwcGVyLCA0PU1vaGF3ayAqLworICAgIGludCBtb2hhd2s7ICAvKiBhIENFMyB0eXBlIGNhcmQgKi8KKyAgICBpbnQgZGluZ287CSAvKiBhIENFTTU2IHR5cGUgY2FyZCAqLworICAgIGludCBuZXdfbWlpOyAvKiBoYXMgZnVsbCAxMGJhc2VULzEwMGJhc2VUIE1JSSAqLworICAgIGludCBtb2RlbTsJIC8qIGlzIGEgbXVsdGkgZnVuY3Rpb24gY2FyZCAoaS5lIHdpdGggYSBtb2RlbSkgKi8KKyAgICB2b2lkIF9faW9tZW0gKmRpbmdvX2NjcjsgLyogb25seSB1c2VkIGZvciBDRU01NiBjYXJkcyAqLworICAgIHVuc2lnbmVkIGxhc3RfcHRyX3ZhbHVlOyAvKiBsYXN0IHBhY2tldHMgdHJhbnNtaXR0ZWQgdmFsdWUgKi8KKyAgICBjb25zdCBjaGFyICptYW5mX3N0cjsKK30gbG9jYWxfaW5mb190OworCisvKioqKioqKioqKioqKioqKgorICogU29tZSBtb3JlIHByb3RvdHlwZXMKKyAqLworc3RhdGljIGludCBkb19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZG9fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZG9fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X2FkZHJlc3NlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2V0X2NhcmRfdHlwZShkZXZfbGlua190ICpsaW5rLCBjb25zdCB2b2lkICpzKTsKK3N0YXRpYyBpbnQgZG9fY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKTsKK3N0YXRpYyBpbnQgZG9fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKK3N0YXRpYyB2b2lkIGhhcmRyZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRvX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmdWxsKTsKK3N0YXRpYyBpbnQgaW5pdF9taWkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBkb19wb3dlcmRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGRvX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qPT09PT09PT09PT09PT09IEhlbHBlciBmdW5jdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50CitmaXJzdF90dXBsZShjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCB0dXBsZV90ICp0dXBsZSwgY2lzcGFyc2VfdCAqcGFyc2UpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsIHR1cGxlKSkgPT0gMCAmJgorCQkJKGVyciA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKSkgPT0gMCkKKwkJZXJyID0gcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgdHVwbGUsIHBhcnNlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CituZXh0X3R1cGxlKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLCBjaXNwYXJzZV90ICpwYXJzZSkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSkpID09IDAgJiYKKwkJCShlcnIgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCB0dXBsZSkpID09IDApCisJCWVyciA9IHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7CisJcmV0dXJuIGVycjsKK30KKworI2RlZmluZSBTZWxlY3RQYWdlKHBnbnIpICAgb3V0YigocGduciksIGlvYWRkciArIFhJUkNSRUdfUFIpCisjZGVmaW5lIEdldEJ5dGUocmVnKQkgICAoKHVuc2lnbmVkKWluYihpb2FkZHIgKyAocmVnKSkpCisjZGVmaW5lIEdldFdvcmQocmVnKQkgICAoKHVuc2lnbmVkKWludyhpb2FkZHIgKyAocmVnKSkpCisjZGVmaW5lIFB1dEJ5dGUocmVnLHZhbHVlKSBvdXRiKCh2YWx1ZSksIGlvYWRkcisocmVnKSkKKyNkZWZpbmUgUHV0V29yZChyZWcsdmFsdWUpIG91dHcoKHZhbHVlKSwgaW9hZGRyKyhyZWcpKQorCisvKj09PT09PSBGdW5jdGlvbnMgdXNlZCBmb3IgZGVidWdnaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaWYgZGVmaW5lZChQQ01DSUFfREVCVUcpICYmIDAgLyogcmVhZGluZyByZWdzIG1heSBjaGFuZ2Ugc3lzdGVtIHN0YXR1cyAqLworc3RhdGljIHZvaWQKK1ByaW50UmVnaXN0ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIGlmIChwY19kZWJ1ZyA+IDEpIHsKKwlpbnQgaSwgcGFnZTsKKworCXByaW50ayhLREJHX1hJUkMgIlJlZ2lzdGVyICBjb21tb246ICIpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJICAgIHByaW50aygiICUyLjJ4IiwgR2V0Qnl0ZShpKSk7CisJcHJpbnRrKCJcbiIpOworCWZvciAocGFnZSA9IDA7IHBhZ2UgPD0gODsgcGFnZSsrKSB7CisJICAgIHByaW50ayhLREJHX1hJUkMgIlJlZ2lzdGVyIHBhZ2UgJTJ4OiAiLCBwYWdlKTsKKwkgICAgU2VsZWN0UGFnZShwYWdlKTsKKwkgICAgZm9yIChpID0gODsgaSA8IDE2OyBpKyspCisJCXByaW50aygiICUyLjJ4IiwgR2V0Qnl0ZShpKSk7CisJICAgIHByaW50aygiXG4iKTsKKwl9CisJZm9yIChwYWdlPTB4NDAgOyBwYWdlIDw9IDB4NWY7IHBhZ2UrKykgeworCSAgICBpZiAocGFnZSA9PSAweDQzIHx8IChwYWdlID49IDB4NDYgJiYgcGFnZSA8PSAweDRmKQorCQl8fCAocGFnZSA+PSAweDUxICYmIHBhZ2UgPD0weDVlKSkKKwkJY29udGludWU7CisJICAgIHByaW50ayhLREJHX1hJUkMgIlJlZ2lzdGVyIHBhZ2UgJTJ4OiAiLCBwYWdlKTsKKwkgICAgU2VsZWN0UGFnZShwYWdlKTsKKwkgICAgZm9yIChpID0gODsgaSA8IDE2OyBpKyspCisJCXByaW50aygiICUyLjJ4IiwgR2V0Qnl0ZShpKSk7CisJICAgIHByaW50aygiXG4iKTsKKwl9CisgICAgfQorfQorI2VuZGlmIC8qIFBDTUNJQV9ERUJVRyAqLworCisvKj09PT09PT09PT09PT09IE1JSSBNYW5hZ2VtZW50IGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKgorICogVHVybiBhcm91bmQgZm9yIHJlYWQKKyAqLworc3RhdGljIHZvaWQKK21paV9pZGxlKGtpb19hZGRyX3QgaW9hZGRyKQoreworICAgIFB1dEJ5dGUoWElSQ1JFRzJfR1BSMiwgMHgwNHwwKTsgLyogZHJpdmUgTURDSyBsb3cgKi8KKyAgICB1ZGVsYXkoMSk7CisgICAgUHV0Qnl0ZShYSVJDUkVHMl9HUFIyLCAweDA0fDEpOyAvKiBhbmQgZHJpdmUgTURDSyBoaWdoICovCisgICAgdWRlbGF5KDEpOworfQorCisvKioqKioqKioqKioqKioqKgorICogV3JpdGUgYSBiaXQgdG8gTURJL08KKyAqLworc3RhdGljIHZvaWQKK21paV9wdXRiaXQoa2lvX2FkZHJfdCBpb2FkZHIsIHVuc2lnbmVkIGRhdGEpCit7CisgICNpZiAxCisgICAgaWYgKGRhdGEpIHsKKwlQdXRCeXRlKFhJUkNSRUcyX0dQUjIsIDB4MGN8MnwwKTsgLyogc2V0IE1ESU8gKi8KKwl1ZGVsYXkoMSk7CisJUHV0Qnl0ZShYSVJDUkVHMl9HUFIyLCAweDBjfDJ8MSk7IC8qIGFuZCBkcml2ZSBNRENLIGhpZ2ggKi8KKwl1ZGVsYXkoMSk7CisgICAgfSBlbHNlIHsKKwlQdXRCeXRlKFhJUkNSRUcyX0dQUjIsIDB4MGN8MHwwKTsgLyogY2xlYXIgTURJTyAqLworCXVkZWxheSgxKTsKKwlQdXRCeXRlKFhJUkNSRUcyX0dQUjIsIDB4MGN8MHwxKTsgLyogYW5kIGRyaXZlIE1EQ0sgaGlnaCAqLworCXVkZWxheSgxKTsKKyAgICB9CisgICNlbHNlCisgICAgaWYgKGRhdGEpIHsKKwlQdXRXb3JkKFhJUkNSRUcyX0dQUjItMSwgMHgwZTBlKTsKKwl1ZGVsYXkoMSk7CisJUHV0V29yZChYSVJDUkVHMl9HUFIyLTEsIDB4MGYwZik7CisJdWRlbGF5KDEpOworICAgIH0gZWxzZSB7CisJUHV0V29yZChYSVJDUkVHMl9HUFIyLTEsIDB4MGMwYyk7CisJdWRlbGF5KDEpOworCVB1dFdvcmQoWElSQ1JFRzJfR1BSMi0xLCAweDBkMGQpOworCXVkZWxheSgxKTsKKyAgICB9CisgICNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKgorICogR2V0IGEgYml0IGZyb20gTURJL08KKyAqLworc3RhdGljIGludAorbWlpX2dldGJpdChraW9fYWRkcl90IGlvYWRkcikKK3sKKyAgICB1bnNpZ25lZCBkOworCisgICAgUHV0Qnl0ZShYSVJDUkVHMl9HUFIyLCA0fDApOyAvKiBkcml2ZSBNRENLIGxvdyAqLworICAgIHVkZWxheSgxKTsKKyAgICBkID0gR2V0Qnl0ZShYSVJDUkVHMl9HUFIyKTsgLyogcmVhZCBNRElPICovCisgICAgUHV0Qnl0ZShYSVJDUkVHMl9HUFIyLCA0fDEpOyAvKiBkcml2ZSBNRENLIGhpZ2ggYWdhaW4gKi8KKyAgICB1ZGVsYXkoMSk7CisgICAgcmV0dXJuIGQgJiAweDIwOyAvKiByZWFkIE1ESU8gKi8KK30KKworc3RhdGljIHZvaWQKK21paV93Yml0cyhraW9fYWRkcl90IGlvYWRkciwgdW5zaWduZWQgZGF0YSwgaW50IGxlbikKK3sKKyAgICB1bnNpZ25lZCBtID0gMSA8PCAobGVuLTEpOworICAgIGZvciAoOyBtOyBtID4+PSAxKQorCW1paV9wdXRiaXQoaW9hZGRyLCBkYXRhICYgbSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorbWlpX3JkKGtpb19hZGRyX3QgaW9hZGRyLAl1X2NoYXIgcGh5YWRkciwgdV9jaGFyIHBoeXJlZykKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBkYXRhPTAsIG07CisKKyAgICBTZWxlY3RQYWdlKDIpOworICAgIGZvciAoaT0wOyBpIDwgMzI7IGkrKykJCS8qIDMyIGJpdCBwcmVhbWJsZSAqLworCW1paV9wdXRiaXQoaW9hZGRyLCAxKTsKKyAgICBtaWlfd2JpdHMoaW9hZGRyLCAweDA2LCA0KTsgCS8qIFN0YXJ0IGFuZCBvcGNvZGUgZm9yIHJlYWQgKi8KKyAgICBtaWlfd2JpdHMoaW9hZGRyLCBwaHlhZGRyLCA1KTsJLyogUEhZIGFkZHJlc3MgdG8gYmUgYWNjZXNzZWQgKi8KKyAgICBtaWlfd2JpdHMoaW9hZGRyLCBwaHlyZWcsIDUpOwkvKiBQSFkgcmVnaXN0ZXIgdG8gcmVhZCAqLworICAgIG1paV9pZGxlKGlvYWRkcik7CQkJLyogdHVybiBhcm91bmQgKi8KKyAgICBtaWlfZ2V0Yml0KGlvYWRkcik7CisKKyAgICBmb3IgKG0gPSAxPDwxNTsgbTsgbSA+Pj0gMSkKKwlpZiAobWlpX2dldGJpdChpb2FkZHIpKQorCSAgICBkYXRhIHw9IG07CisgICAgbWlpX2lkbGUoaW9hZGRyKTsKKyAgICByZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK21paV93cihraW9fYWRkcl90IGlvYWRkciwgdV9jaGFyIHBoeWFkZHIsIHVfY2hhciBwaHlyZWcsIHVuc2lnbmVkIGRhdGEsIGludCBsZW4pCit7CisgICAgaW50IGk7CisKKyAgICBTZWxlY3RQYWdlKDIpOworICAgIGZvciAoaT0wOyBpIDwgMzI7IGkrKykJCS8qIDMyIGJpdCBwcmVhbWJsZSAqLworCW1paV9wdXRiaXQoaW9hZGRyLCAxKTsKKyAgICBtaWlfd2JpdHMoaW9hZGRyLCAweDA1LCA0KTsgCS8qIFN0YXJ0IGFuZCBvcGNvZGUgZm9yIHdyaXRlICovCisgICAgbWlpX3diaXRzKGlvYWRkciwgcGh5YWRkciwgNSk7CS8qIFBIWSBhZGRyZXNzIHRvIGJlIGFjY2Vzc2VkICovCisgICAgbWlpX3diaXRzKGlvYWRkciwgcGh5cmVnLCA1KTsJLyogUEhZIFJlZ2lzdGVyIHRvIHdyaXRlICovCisgICAgbWlpX3B1dGJpdChpb2FkZHIsIDEpOwkJLyogdHVybiBhcm91bmQgKi8KKyAgICBtaWlfcHV0Yml0KGlvYWRkciwgMCk7CisgICAgbWlpX3diaXRzKGlvYWRkciwgZGF0YSwgbGVuKTsJLyogQW5kIHdyaXRlIHRoZSBkYXRhICovCisgICAgbWlpX2lkbGUoaW9hZGRyKTsKK30KKworLyo9PT09PT09PT09PT09IE1haW4gYnVsayBvZiBmdW5jdGlvbnMJPT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqCisgKiB4aXJjMnBzX2F0dGFjaCgpIGNyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nCisgKiBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAqIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAqCisgKiBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKKyAqIGNvbmZpZ3VyZSB0aGUgY2FyZCBhdCB0aGlzIHBvaW50IC0tIHdlIHdhaXQgdW50aWwgd2UgcmVjZWl2ZSBhCisgKiBjYXJkIGluc2VydGlvbiBldmVudC4KKyAqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqCit4aXJjMnBzX2F0dGFjaCh2b2lkKQoreworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBsb2NhbF9pbmZvX3QgKmxvY2FsOworICAgIGludCBlcnI7CisKKyAgICBERUJVRygwLCAiYXR0YWNoKClcbiIpOworCisgICAgLyogQWxsb2NhdGUgdGhlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YobG9jYWxfaW5mb190KSk7CisgICAgaWYgKCFkZXYpCisJICAgIHJldHVybiBOVUxMOworICAgIGxvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBsaW5rID0gJmxvY2FsLT5saW5rOworICAgIGxpbmstPnByaXYgPSBkZXY7CisKKyAgICAvKiBHZW5lcmFsIHNvY2tldCBjb25maWd1cmF0aW9uICovCisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IDE7CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CisgICAgbGluay0+aXJxLkhhbmRsZXIgPSB4aXJjMnBzX2ludGVycnVwdDsKKyAgICBsaW5rLT5pcnEuSW5zdGFuY2UgPSBkZXY7CisKKyAgICAvKiBGaWxsIGluIGNhcmQgc3BlY2lmaWMgZW50cmllcyAqLworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZkb19zdGFydF94bWl0OworICAgIGRldi0+c2V0X2NvbmZpZyA9ICZkb19jb25maWc7CisgICAgZGV2LT5nZXRfc3RhdHMgPSAmZG9fZ2V0X3N0YXRzOworICAgIGRldi0+ZG9faW9jdGwgPSAmZG9faW9jdGw7CisgICAgU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7CisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworICAgIGRldi0+b3BlbiA9ICZkb19vcGVuOworICAgIGRldi0+c3RvcCA9ICZkb19zdG9wOworI2lmZGVmIEhBVkVfVFhfVElNRU9VVAorICAgIGRldi0+dHhfdGltZW91dCA9IGRvX3R4X3RpbWVvdXQ7CisgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjZW5kaWYKKworICAgIC8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKKyAgICBkZXZfbGlzdCA9IGxpbms7CisgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKyAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9CisJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmeGlyYzJwc19ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKyAgICBpZiAoKGVyciA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpKSkgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIGVycik7CisJeGlyYzJwc19kZXRhY2gobGluayk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGxpbms7Cit9IC8qIHhpcmMycHNfYXR0YWNoICovCisKKy8qKioqKioqKioqKioqKioqCisgKiAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAqICB3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAqICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICogIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKyAqLworCitzdGF0aWMgdm9pZAoreGlyYzJwc19kZXRhY2goZGV2X2xpbmtfdCAqIGxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworCisgICAgREVCVUcoMCwgImRldGFjaCgweCVwKVxuIiwgbGluayk7CisKKyAgICAvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJaWYgKCpsaW5rcCA9PSBsaW5rKQorCSAgICBicmVhazsKKyAgICBpZiAoISpsaW5rcCkgeworCURFQlVHKDAsICJkZXRhY2goMHglcCk6IGRldl9saW5rIGxvc3RcbiIsIGxpbmspOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAobGluay0+ZGV2KQorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgYW5kIGFjdGl2ZSwgd2Ugd29uJ3QKKyAgICAgKiBhY3R1YWxseSBkZWxldGUgaXQgeWV0LglJbnN0ZWFkLCBpdCBpcyBtYXJrZWQgc28gdGhhdCB3aGVuCisgICAgICogdGhlIHJlbGVhc2UoKSBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoYXQgd2lsbCB0cmlnZ2VyIGEgcHJvcGVyCisgICAgICogZGV0YWNoKCkuCisgICAgICovCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwl4aXJjMnBzX3JlbGVhc2UobGluayk7CisKKyAgICAvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBpZiAobGluay0+aGFuZGxlKQorCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisgICAgLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgaXQgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGZyZWVfbmV0ZGV2KGRldik7Cit9IC8qIHhpcmMycHNfZGV0YWNoICovCisKKy8qKioqKioqKioqKioqKioqCisgKiBEZXRlY3QgdGhlIHR5cGUgb2YgdGhlIGNhcmQuIHMgaXMgdGhlIGJ1ZmZlciB3aXRoIHRoZSBkYXRhIG9mIHR1cGxlIDB4MjAKKyAqIFJldHVybnM6IDAgOj0gbm90IHN1cHBvcnRlZAorICoJCSAgICAgICBtZWRpYWlkPTExIGFuZCBwcm9kaWQ9NDcKKyAqIE1lZGlhLUlkIGJpdHM6CisgKiAgRXRoZXJuZXQJICAgIDB4MDEKKyAqICBUb2tlbnJpbmcJICAgIDB4MDIKKyAqICBBcmNuZXQJICAgIDB4MDQKKyAqICBXaXJlbGVzcwkgICAgMHgwOAorICogIE1vZGVtCSAgICAweDEwCisgKiAgR1NNIG9ubHkJICAgIDB4MjAKKyAqIFByb2QtSWQgYml0czoKKyAqICBQb2NrZXQJICAgIDB4MTAKKyAqICBFeHRlcm5hbAkgICAgMHgyMAorICogIENyZWRpdGNhcmQJICAgIDB4NDAKKyAqICBDYXJkYnVzCSAgICAweDgwCisgKgorICovCitzdGF0aWMgaW50CitzZXRfY2FyZF90eXBlKGRldl9saW5rX3QgKmxpbmssIGNvbnN0IHZvaWQgKnMpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgbG9jYWxfaW5mb190ICpsb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisgICNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICB1bnNpZ25lZCBjaXNyZXYgPSAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzKVsyXTsKKyAgI2VuZGlmCisgICAgdW5zaWduZWQgbWVkaWFpZD0gKChjb25zdCB1bnNpZ25lZCBjaGFyICopcylbM107CisgICAgdW5zaWduZWQgcHJvZGlkID0gKChjb25zdCB1bnNpZ25lZCBjaGFyICopcylbNF07CisKKyAgICBERUJVRygwLCAiY2lzcmV2PSUwMnggbWVkaWFpZD0lMDJ4IHByb2RpZD0lMDJ4XG4iLAorCSAgY2lzcmV2LCBtZWRpYWlkLCBwcm9kaWQpOworCisgICAgbG9jYWwtPm1vaGF3ayA9IDA7CisgICAgbG9jYWwtPmRpbmdvID0gMDsKKyAgICBsb2NhbC0+bW9kZW0gPSAwOworICAgIGxvY2FsLT5jYXJkX3R5cGUgPSBYSVJfVU5LTk9XTjsKKyAgICBpZiAoIShwcm9kaWQgJiAweDQwKSkgeworCXByaW50ayhLTk9UX1hJUkMgIk9vb3BzOiBOb3QgYSBjcmVkaXRjYXJkXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCEobWVkaWFpZCAmIDB4MDEpKSB7CisJcHJpbnRrKEtOT1RfWElSQyAiTm90IGFuIEV0aGVybmV0IGNhcmRcbiIpOworCXJldHVybiAwOworICAgIH0KKyAgICBpZiAobWVkaWFpZCAmIDB4MTApIHsKKwlsb2NhbC0+bW9kZW0gPSAxOworCXN3aXRjaChwcm9kaWQgJiAxNSkgeworCSAgY2FzZSAxOiBsb2NhbC0+Y2FyZF90eXBlID0gWElSX0NFTSAgIDsgYnJlYWs7CisJICBjYXNlIDI6IGxvY2FsLT5jYXJkX3R5cGUgPSBYSVJfQ0VNMiAgOyBicmVhazsKKwkgIGNhc2UgMzogbG9jYWwtPmNhcmRfdHlwZSA9IFhJUl9DRU0zICA7IGJyZWFrOworCSAgY2FzZSA0OiBsb2NhbC0+Y2FyZF90eXBlID0gWElSX0NFTTMzIDsgYnJlYWs7CisJICBjYXNlIDU6IGxvY2FsLT5jYXJkX3R5cGUgPSBYSVJfQ0VNNTZNOworCQkgIGxvY2FsLT5tb2hhd2sgPSAxOworCQkgIGJyZWFrOworCSAgY2FzZSA2OgorCSAgY2FzZSA3OiAvKiA3IGlzIHRoZSBSZWFsUG9ydCAxMC81NiAqLworCQkgIGxvY2FsLT5jYXJkX3R5cGUgPSBYSVJfQ0VNNTYgOworCQkgIGxvY2FsLT5tb2hhd2sgPSAxOworCQkgIGxvY2FsLT5kaW5nbyA9IDE7CisJCSAgYnJlYWs7CisJfQorICAgIH0gZWxzZSB7CisJc3dpdGNoKHByb2RpZCAmIDE1KSB7CisJICBjYXNlIDE6IGxvY2FsLT5jYXJkX3R5cGUgPSBoYXNfY2UyX3N0cmluZyhsaW5rKT8gWElSX0NFMiA6IFhJUl9DRSA7CisJCSAgYnJlYWs7CisJICBjYXNlIDI6IGxvY2FsLT5jYXJkX3R5cGUgPSBYSVJfQ0UyOyBicmVhazsKKwkgIGNhc2UgMzogbG9jYWwtPmNhcmRfdHlwZSA9IFhJUl9DRTM7CisJCSAgbG9jYWwtPm1vaGF3ayA9IDE7CisJCSAgYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAobG9jYWwtPmNhcmRfdHlwZSA9PSBYSVJfQ0UgfHwgbG9jYWwtPmNhcmRfdHlwZSA9PSBYSVJfQ0VNKSB7CisJcHJpbnRrKEtOT1RfWElSQyAiU29ycnksIHRoaXMgaXMgYW4gb2xkIENFIGNhcmRcbiIpOworCXJldHVybiAwOworICAgIH0KKyAgICBpZiAobG9jYWwtPmNhcmRfdHlwZSA9PSBYSVJfVU5LTk9XTikKKwlwcmludGsoS05PVF9YSVJDICJ1bmtub3duIGNhcmQgKG1lZGlhaWQ9JTAyeCBwcm9kaWQ9JTAyeClcbiIsCisJICAgICAgIG1lZGlhaWQsIHByb2RpZCk7CisKKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIFRoZXJlIGFyZSBzb21lIENFMiBjYXJkcyBvdXQgd2hpY2ggY2xhaW0gdG8gYmUgYSBDRSBjYXJkLgorICogVGhpcyBmdW5jdGlvbiBsb29rcyBmb3IgYSAiQ0UyIiBpbiB0aGUgM3JkIHZlcnNpb24gZmllbGQuCisgKiBSZXR1cm5zOiB0cnVlIGlmIHRoaXMgaXMgYSBDRTIKKyAqLworc3RhdGljIGludAoraGFzX2NlMl9zdHJpbmcoZGV2X2xpbmtfdCAqIGxpbmspCit7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgdV9jaGFyIGJ1ZlsyNTZdOworCisgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDI1NDsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX1ZFUlNfMTsKKyAgICBpZiAoIWZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICYmIHBhcnNlLnZlcnNpb25fMS5ucyA+IDIpIHsKKwlpZiAoc3Ryc3RyKHBhcnNlLnZlcnNpb25fMS5zdHIgKyBwYXJzZS52ZXJzaW9uXzEub2ZzWzJdLCAiQ0UyIikpCisJICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIHhpcmMycHNfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50CisgKiBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAqIGV0aGVybmV0IGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQKK3hpcmMycHNfY29uZmlnKGRldl9saW5rX3QgKiBsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgbG9jYWxfaW5mb190ICpsb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIGtpb19hZGRyX3QgaW9hZGRyOworICAgIGludCBlcnIsIGk7CisgICAgdV9jaGFyIGJ1Zls2NF07CisgICAgY2lzdHBsX2xhbl9ub2RlX2lkX3QgKm5vZGVfaWQgPSAoY2lzdHBsX2xhbl9ub2RlX2lkX3QqKXBhcnNlLmZ1bmNlLmRhdGE7CisgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2YgPSAmcGFyc2UuY2Z0YWJsZV9lbnRyeTsKKworICAgIGxvY2FsLT5kaW5nb19jY3IgPSBOVUxMOworCisgICAgREVCVUcoMCwgImNvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgICAvKgorICAgICAqIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbgorICAgICAqIHJlZ2lzdGVycy4KKyAgICAgKi8KKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCisgICAgLyogSXMgdGhpcyBhIHZhbGlkCWNhcmQgKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOworICAgIGlmICgoZXJyPWZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKSkgeworCXByaW50ayhLTk9UX1hJUkMgIm1hbmZpZCBub3QgZm91bmQgaW4gQ0lTXG4iKTsKKwlnb3RvIGZhaWx1cmU7CisgICAgfQorCisgICAgc3dpdGNoKHBhcnNlLm1hbmZpZC5tYW5mKSB7CisgICAgICBjYXNlIE1BTkZJRF9YSVJDT006CisJbG9jYWwtPm1hbmZfc3RyID0gIlhpcmNvbSI7CisJYnJlYWs7CisgICAgICBjYXNlIE1BTkZJRF9BQ0NUT046CisJbG9jYWwtPm1hbmZfc3RyID0gIkFjY3RvbiI7CisJYnJlYWs7CisgICAgICBjYXNlIE1BTkZJRF9DT01QQVE6CisgICAgICBjYXNlIE1BTkZJRF9DT01QQVEyOgorCWxvY2FsLT5tYW5mX3N0ciA9ICJDb21wYXEiOworCWJyZWFrOworICAgICAgY2FzZSBNQU5GSURfSU5URUw6CisJbG9jYWwtPm1hbmZfc3RyID0gIkludGVsIjsKKwlicmVhazsKKyAgICAgIGNhc2UgTUFORklEX1RPU0hJQkE6CisJbG9jYWwtPm1hbmZfc3RyID0gIlRvc2hpYmEiOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlwcmludGsoS05PVF9YSVJDICJVbmtub3duIENhcmQgTWFudWZhY3R1cmVyIElEOiAweCUwNHhcbiIsCisJICAgICAgICh1bnNpZ25lZClwYXJzZS5tYW5maWQubWFuZik7CisJZ290byBmYWlsdXJlOworICAgIH0KKyAgICBERUJVRygwLCAiZm91bmQgJXMgY2FyZFxuIiwgbG9jYWwtPm1hbmZfc3RyKTsKKworICAgIGlmICghc2V0X2NhcmRfdHlwZShsaW5rLCBidWYpKSB7CisJcHJpbnRrKEtOT1RfWElSQyAidGhpcyBjYXJkIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworCWdvdG8gZmFpbHVyZTsKKyAgICB9CisKKyAgICAvKiBnZXQgY29uZmlndXJhdGlvbiBzdHVmZiAqLworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgaWYgKChlcnI9Zmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpKQorCWdvdG8gY2lzX2Vycm9yOworICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9ICAgIHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKworICAgIC8qIGdldCB0aGUgZXRoZXJuZXQgYWRkcmVzcyBmcm9tIHRoZSBDSVMgKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfRlVOQ0U7CisgICAgZm9yIChlcnIgPSBmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsgIWVycjsKKwkJCSAgICAgZXJyID0gbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSkgeworCS8qIE9uY2UgSSBzYXcgdHdvIENJU1RQTF9GVU5DRV9MQU5fTk9ERV9JRCBlbnRyaWVzOgorCSAqIHRoZSBmaXJzdCBvbmUgd2l0aCBhIGxlbmd0aCBvZiB6ZXJvIHRoZSBzZWNvbmQgY29ycmVjdCAtCisJICogc28gSSBza2lwIGFsbCBlbnRyaWVzIHdpdGggbGVuZ3RoIDAgKi8KKwlpZiAocGFyc2UuZnVuY2UudHlwZSA9PSBDSVNUUExfRlVOQ0VfTEFOX05PREVfSUQKKwkgICAgJiYgKChjaXN0cGxfbGFuX25vZGVfaWRfdCAqKXBhcnNlLmZ1bmNlLmRhdGEpLT5uYikKKwkgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChlcnIpIHsgLyogbm90IGZvdW5kOiB0cnkgdG8gZ2V0IHRoZSBub2RlLWlkIGZyb20gdHVwbGUgMHg4OSAqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IDB4ODk7ICAvKiBkYXRhIGxheW91dCBsb29rcyBsaWtlIHR1cGxlIDB4MjIgKi8KKwlpZiAoKGVyciA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKSA9PSAwICYmCisJCShlcnIgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKSA9PSAwKSB7CisJICAgIGlmICh0dXBsZS5UdXBsZURhdGFMZW4gPT0gOCAmJiAqYnVmID09IENJU1RQTF9GVU5DRV9MQU5fTk9ERV9JRCkKKwkJbWVtY3B5KCZwYXJzZSwgYnVmLCA4KTsKKwkgICAgZWxzZQorCQllcnIgPSAtMTsKKwl9CisgICAgfQorICAgIGlmIChlcnIpIHsgLyogYW5vdGhlciB0cnkJKEphbWVzIExlaG1lcidzIENFMiB2ZXJzaW9uIDQuMSkqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9GVU5DRTsKKwlmb3IgKGVyciA9IGZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOyAhZXJyOworCQkJCSBlcnIgPSBuZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKSB7CisJICAgIGlmIChwYXJzZS5mdW5jZS50eXBlID09IDB4MDIgJiYgcGFyc2UuZnVuY2UuZGF0YVswXSA9PSAxCisJCSYmIHBhcnNlLmZ1bmNlLmRhdGFbMV0gPT0gNiAmJiB0dXBsZS5UdXBsZURhdGFMZW4gPT0gMTMpIHsKKwkJYnVmWzFdID0gNDsKKwkJbWVtY3B5KCZwYXJzZSwgYnVmKzEsIDgpOworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKGVycikgeworCXByaW50ayhLTk9UX1hJUkMgIm5vZGUtaWQgbm90IGZvdW5kIGluIENJU1xuIik7CisJZ290byBmYWlsdXJlOworICAgIH0KKyAgICBub2RlX2lkID0gKGNpc3RwbF9sYW5fbm9kZV9pZF90ICopcGFyc2UuZnVuY2UuZGF0YTsKKyAgICBpZiAobm9kZV9pZC0+bmIgIT0gNikgeworCXByaW50ayhLTk9UX1hJUkMgIm1hbGZvcm1lZCBub2RlLWlkIGluIENJU1xuIik7CisJZ290byBmYWlsdXJlOworICAgIH0KKyAgICBmb3IgKGk9MDsgaSA8IDY7IGkrKykKKwlkZXYtPmRldl9hZGRyW2ldID0gbm9kZV9pZC0+aWRbaV07CisKKyAgICAvKiBDb25maWd1cmUgY2FyZCAqLworICAgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKyAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9MTA7CisgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfSEFORExFX1BSRVNFTlQ7CisgICAgbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworICAgIGlmIChsb2NhbC0+bW9kZW0pIHsKKwlpbnQgcGFzczsKKworCWlmIChkb19zb3VuZCkgeworCSAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKKwkgICAgbGluay0+Y29uZi5TdGF0dXMgfD0gQ0NTUl9BVURJT19FTkE7CisJfQorCWxpbmstPmlycS5BdHRyaWJ1dGVzIHw9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklOR3xJUlFfRklSU1RfU0hBUkVEIDsKKwlsaW5rLT5pby5OdW1Qb3J0czIgPSA4OworCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJaWYgKGxvY2FsLT5kaW5nbykgeworCSAgICAvKiBUYWtlIHRoZSBNb2RlbSBJTyBwb3J0IGZyb20gdGhlIENJUyBhbmQgc2NhbiBmb3IgYSBmcmVlCisJICAgICAqIEV0aGVybmV0IHBvcnQgKi8KKwkgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTY7IC8qIG5vIE1ha28gc3R1ZmYgYW55bW9yZSAqLworCSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKwkgICAgZm9yIChlcnIgPSBmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsgIWVycjsKKwkJCQkgZXJyID0gbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSkgeworCQlpZiAoY2YtPmlvLm53aW4gPiAwICAmJiAgKGNmLT5pby53aW5bMF0uYmFzZSAmIDB4ZikgPT0gOCkgeworCQkgICAgZm9yIChpb2FkZHIgPSAweDMwMDsgaW9hZGRyIDwgMHg0MDA7IGlvYWRkciArPSAweDEwKSB7CisJCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2YtPmluZGV4IDsKKwkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGlvYWRkcjsKKwkJCWlmICghKGVycj1wY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbykpKQorCQkJICAgIGdvdG8gcG9ydF9mb3VuZDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTg7CisJICAgIC8qIFdlIGRvIDIgcGFzc2VzIGhlcmU6IFRoZSBmaXJzdCBvbmUgdXNlcyB0aGUgcmVndWxhciBtYXBwaW5nIGFuZAorCSAgICAgKiB0aGUgc2Vjb25kIHRyaWVzIGFnYWluLCB0aGVyZWJ5IGNvbnNpZGVyaW5nIHRoYXQgdGhlIDMyIHBvcnRzIGFyZQorCSAgICAgKiBtaXJyb3JlZCBldmVyeSAzMiBieXRlcy4gQWN0dWFsbHkgd2UgdXNlIGEgbWlycm9yZWQgcG9ydCBmb3IKKwkgICAgICogdGhlIE1ha28gaWYgKG9uIHRoZSBmaXJzdCBwYXNzKSB0aGUgQ09SIGJpdCA1IGlzIHNldC4KKwkgICAgICovCisJICAgIGZvciAocGFzcz0wOyBwYXNzIDwgMjsgcGFzcysrKSB7CisJCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCQlmb3IgKGVyciA9IGZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOyAhZXJyOworCQkJCSAgICAgZXJyID0gbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSl7CisJCSAgICBpZiAoY2YtPmlvLm53aW4gPiAwICAmJiAgKGNmLT5pby53aW5bMF0uYmFzZSAmIDB4ZikgPT0gOCl7CisJCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2YtPmluZGV4IDsKKwkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGxpbmstPmlvLkJhc2VQb3J0MgorCQkJCSAgICArIChwYXNzID8gKGNmLT5pbmRleCAmIDB4MjAgPyAtMjQ6OCkKKwkJCQkJICAgIDogKGNmLT5pbmRleCAmIDB4MjAgPyAgIDg6LTI0KSk7CisJCQlpZiAoIShlcnI9cGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pKSkKKwkJCSAgICBnb3RvIHBvcnRfZm91bmQ7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICAvKiBpZiBzcGVjaWFsIG9wdGlvbjoKKwkgICAgICogdHJ5IHRvIGNvbmZpZ3VyZSBhcyBFdGhlcm5ldCBvbmx5LgorCSAgICAgKiAuLi4uICovCisJfQorCXByaW50ayhLTk9UX1hJUkMgIm5vIHBvcnRzIGF2YWlsYWJsZVxuIik7CisgICAgfSBlbHNlIHsKKwlsaW5rLT5pcnEuQXR0cmlidXRlcyB8PSBJUlFfVFlQRV9FWENMVVNJVkU7CisJbGluay0+aW8uTnVtUG9ydHMxID0gMTY7CisJZm9yIChpb2FkZHIgPSAweDMwMDsgaW9hZGRyIDwgMHg0MDA7IGlvYWRkciArPSAweDEwKSB7CisJICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IGlvYWRkcjsKKwkgICAgaWYgKCEoZXJyPXBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSkpCisJCWdvdG8gcG9ydF9mb3VuZDsKKwl9CisJbGluay0+aW8uQmFzZVBvcnQxID0gMDsgLyogbGV0IENTIGRlY2lkZSAqLworCWlmICgoZXJyPXBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSkpIHsKKwkgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0SU8sIGVycik7CisJICAgIGdvdG8gY29uZmlnX2Vycm9yOworCX0KKyAgICB9CisgIHBvcnRfZm91bmQ6CisgICAgaWYgKGVycikKKwkgZ290byBjb25maWdfZXJyb3I7CisKKyAgICAvKioqKioqKioqKioqKioqKgorICAgICAqIE5vdyBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4JTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKKyAgICAgKiBhY3R1YWxseSBhc3NpZ24gYSBoYW5kbGVyIHRvIHRoZSBpbnRlcnJ1cHQuCisgICAgICovCisgICAgaWYgKChlcnI9cGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0SVJRLCBlcnIpOworCWdvdG8gY29uZmlnX2Vycm9yOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqCisgICAgICogVGhpcyBhY3R1YWxseSBjb25maWd1cmVzIHRoZSBQQ01DSUEgc29ja2V0IC0tIHNldHRpbmcgdXAKKyAgICAgKiB0aGUgSS9PIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZy4KKyAgICAgKi8KKyAgICBpZiAoKGVycj1wY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKSkgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdENvbmZpZ3VyYXRpb24sIGVycik7CisJZ290byBjb25maWdfZXJyb3I7CisgICAgfQorCisgICAgaWYgKGxvY2FsLT5kaW5nbykgeworCWNvbmZfcmVnX3QgcmVnOworCXdpbl9yZXFfdCByZXE7CisJbWVtcmVxX3QgbWVtOworCisJLyogUmVzZXQgdGhlIG1vZGVtJ3MgQkFSIHRvIHRoZSBjb3JyZWN0IHZhbHVlCisJICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBpbiB0aGUgUmVxdWVzdENvbmZpZ3VyYXRpb24gY2FsbCwKKwkgKiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBldGhlcm5ldCBwb3J0IChCYXNlUG9ydDEpIGlzIHdyaXR0ZW4KKwkgKiB0byB0aGUgQkFSIHJlZ2lzdGVycyBvZiB0aGUgbW9kZW0uCisJICovCisJcmVnLkFjdGlvbiA9IENTX1dSSVRFOworCXJlZy5PZmZzZXQgPSBDSVNSRUdfSU9CQVNFXzA7CisJcmVnLlZhbHVlID0gbGluay0+aW8uQmFzZVBvcnQyICYgMHhmZjsKKwlpZiAoKGVyciA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLT5oYW5kbGUsICZyZWcpKSkgeworCSAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlciwgZXJyKTsKKwkgICAgZ290byBjb25maWdfZXJyb3I7CisJfQorCXJlZy5BY3Rpb24gPSBDU19XUklURTsKKwlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0lPQkFTRV8xOworCXJlZy5WYWx1ZSA9IChsaW5rLT5pby5CYXNlUG9ydDIgPj4gOCkgJiAweGZmOworCWlmICgoZXJyID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmstPmhhbmRsZSwgJnJlZykpKSB7CisJICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyLCBlcnIpOworCSAgICBnb3RvIGNvbmZpZ19lcnJvcjsKKwl9CisKKwkvKiBUaGVyZSBpcyBubyBjb25maWcgZW50cnkgZm9yIHRoZSBFdGhlcm5ldCBwYXJ0IHdoaWNoCisJICogaXMgYXQgMHgwODAwLiBTbyB3ZSBhbGxvY2F0ZSBhIHdpbmRvdyBpbnRvIHRoZSBhdHRyaWJ1dGUKKwkgKiBtZW1vcnkgYW5kIHdyaXRlIGRpcmVjdCB0byB0aGUgQ0lTIHJlZ2lzdGVycworCSAqLworCXJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOHxXSU5fTUVNT1JZX1RZUEVfQU18V0lOX0VOQUJMRTsKKwlyZXEuQmFzZSA9IHJlcS5TaXplID0gMDsKKwlyZXEuQWNjZXNzU3BlZWQgPSAwOworCWlmICgoZXJyID0gcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsaW5rLT53aW4pKSkgeworCSAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlcXVlc3RXaW5kb3csIGVycik7CisJICAgIGdvdG8gY29uZmlnX2Vycm9yOworCX0KKwlsb2NhbC0+ZGluZ29fY2NyID0gaW9yZW1hcChyZXEuQmFzZSwweDEwMDApICsgMHgwODAwOworCW1lbS5DYXJkT2Zmc2V0ID0gMHgwOworCW1lbS5QYWdlID0gMDsKKwlpZiAoKGVyciA9IHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWVtKSkpIHsKKwkgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBNYXBNZW1QYWdlLCBlcnIpOworCSAgICBnb3RvIGNvbmZpZ19lcnJvcjsKKwl9CisKKwkvKiBTZXR1cCB0aGUgQ0NSczsgdGhlcmUgYXJlIG5vIGluZm9zIGluIHRoZSBDSVMgYWJvdXQgdGhlIEV0aGVybmV0CisJICogcGFydC4KKwkgKi8KKwl3cml0ZWIoMHg0NywgbG9jYWwtPmRpbmdvX2NjciArIENJU1JFR19DT1IpOworCWlvYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKwl3cml0ZWIoaW9hZGRyICYgMHhmZgkgICwgbG9jYWwtPmRpbmdvX2NjciArIENJU1JFR19JT0JBU0VfMCk7CisJd3JpdGViKChpb2FkZHIgPj4gOCkmMHhmZiAsIGxvY2FsLT5kaW5nb19jY3IgKyBDSVNSRUdfSU9CQVNFXzEpOworCisgICAgICAjaWYgMAorCXsKKwkgICAgdV9jaGFyIHRtcDsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiRUNPUjoiKTsKKwkgICAgZm9yIChpPTA7IGkgPCA3OyBpKyspIHsKKwkJdG1wID0gcmVhZGIobG9jYWwtPmRpbmdvX2NjciArIGkqMik7CisJCXByaW50aygiICUwMngiLCB0bXApOworCSAgICB9CisJICAgIHByaW50aygiXG4iKTsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiRENPUjoiKTsKKwkgICAgZm9yIChpPTA7IGkgPCA0OyBpKyspIHsKKwkJdG1wID0gcmVhZGIobG9jYWwtPmRpbmdvX2NjciArIDB4MjAgKyBpKjIpOworCQlwcmludGsoIiAlMDJ4IiwgdG1wKTsKKwkgICAgfQorCSAgICBwcmludGsoIlxuIik7CisJICAgIHByaW50ayhLRVJOX0lORk8gIlNDT1I6Iik7CisJICAgIGZvciAoaT0wOyBpIDwgMTA7IGkrKykgeworCQl0bXAgPSByZWFkYihsb2NhbC0+ZGluZ29fY2NyICsgMHg0MCArIGkqMik7CisJCXByaW50aygiICUwMngiLCB0bXApOworCSAgICB9CisJICAgIHByaW50aygiXG4iKTsKKwl9CisgICAgICAjZW5kaWYKKworCXdyaXRlYigweDAxLCBsb2NhbC0+ZGluZ29fY2NyICsgMHgyMCk7CisJd3JpdGViKDB4MGMsIGxvY2FsLT5kaW5nb19jY3IgKyAweDIyKTsKKwl3cml0ZWIoMHgwMCwgbG9jYWwtPmRpbmdvX2NjciArIDB4MjQpOworCXdyaXRlYigweDAwLCBsb2NhbC0+ZGluZ29fY2NyICsgMHgyNik7CisJd3JpdGViKDB4MDAsIGxvY2FsLT5kaW5nb19jY3IgKyAweDI4KTsKKyAgICB9CisKKyAgICAvKiBUaGUgaWZfcG9ydCBzeW1ib2wgY2FuIGJlIHNldCB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkICovCisgICAgbG9jYWwtPnByb2JlX3BvcnQ9MDsKKyAgICBpZiAoIWlmX3BvcnQpIHsKKwlsb2NhbC0+cHJvYmVfcG9ydCA9IGRldi0+aWZfcG9ydCA9IDE7CisgICAgfSBlbHNlIGlmICgoaWZfcG9ydCA+PSAxICYmIGlmX3BvcnQgPD0gMikgfHwKKwkgICAgICAgKGxvY2FsLT5tb2hhd2sgJiYgaWZfcG9ydD09NCkpCisJZGV2LT5pZl9wb3J0ID0gaWZfcG9ydDsKKyAgICBlbHNlCisJcHJpbnRrKEtOT1RfWElSQyAiaW52YWxpZCBpZl9wb3J0IHJlcXVlc3RlZFxuIik7CisKKyAgICAvKiB3ZSBjYW4gbm93IHJlZ2lzdGVyIHRoZSBkZXZpY2Ugd2l0aCB0aGUgbmV0IHN1YnN5c3RlbSAqLworICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworCisgICAgaWYgKGxvY2FsLT5kaW5nbykKKwlkb19yZXNldChkZXYsIDEpOyAvKiBhIGtsdWRnZSB0byBtYWtlIHRoZSBjZW01NiB3b3JrICovCisKKyAgICBsaW5rLT5kZXYgPSAmbG9jYWwtPm5vZGU7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCisgICAgaWYgKChlcnI9cmVnaXN0ZXJfbmV0ZGV2KGRldikpKSB7CisJcHJpbnRrKEtOT1RfWElSQyAicmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKwlsaW5rLT5kZXYgPSBOVUxMOworCWdvdG8gY29uZmlnX2Vycm9yOworICAgIH0KKworICAgIHN0cmNweShsb2NhbC0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKworICAgIC8qIGdpdmUgc29tZSBpbmZvcyBhYm91dCB0aGUgaGFyZHdhcmUgKi8KKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogJXM6IHBvcnQgJSMzbHgsIGlycSAlZCwgaHdhZGRyIiwKKwkgZGV2LT5uYW1lLCBsb2NhbC0+bWFuZl9zdHIsKHVfbG9uZylkZXYtPmJhc2VfYWRkciwgKGludClkZXYtPmlycSk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlwcmludGsoIiVjJTAyWCIsIGk/JzonOicgJywgZGV2LT5kZXZfYWRkcltpXSk7CisgICAgcHJpbnRrKCJcbiIpOworCisgICAgcmV0dXJuOworCisgIGNvbmZpZ19lcnJvcjoKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgIHhpcmMycHNfcmVsZWFzZShsaW5rKTsKKyAgICByZXR1cm47CisKKyAgY2lzX2Vycm9yOgorICAgIHByaW50ayhLTk9UX1hJUkMgInVuYWJsZSB0byBwYXJzZSBDSVNcbiIpOworICBmYWlsdXJlOgorICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7Cit9IC8qIHhpcmMycHNfY29uZmlnICovCisKKy8qKioqKioqKioqKioqKioqCisgKiBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgeGlyYzJwc19yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKKyAqIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICogc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgKi8KK3N0YXRpYyB2b2lkCit4aXJjMnBzX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKworICAgIERFQlVHKDAsICJyZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworICAgIGlmIChsaW5rLT53aW4pIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAobG9jYWwtPmRpbmdvKQorCSAgICBpb3VubWFwKGxvY2FsLT5kaW5nb19jY3IgLSAweDA4MDApOworCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworICAgIH0KKyAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworCit9IC8qIHhpcmMycHNfcmVsZWFzZSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioKKyAqIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICogc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiAgQSBDQVJEX1JFTU9WQUwgZXZlbnQKKyAqIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgKiB0byB0YWxrIHRvIHRoZSBjYXJkIGFueSBtb3JlLgorICoKKyAqIFdoZW4gYSBDQVJEX1JFTU9WQUwgZXZlbnQgaXMgcmVjZWl2ZWQsIHdlIGltbWVkaWF0ZWx5IHNldCBhIGZsYWcKKyAqIHRvIGJsb2NrIGZ1dHVyZSBhY2Nlc3NlcyB0byB0aGlzIGRldmljZS4gIEFsbCB0aGUgZnVuY3Rpb25zIHRoYXQKKyAqIGFjdHVhbGx5IGFjY2VzcyB0aGUgZGV2aWNlIHNob3VsZCBjaGVjayB0aGlzIGZsYWcgdG8gbWFrZSBzdXJlCisgKiB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50LgorICovCisKK3N0YXRpYyBpbnQKK3hpcmMycHNfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCSAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqIGFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCisgICAgREVCVUcoMCwgImV2ZW50KCVkKVxuIiwgKGludClldmVudCk7CisKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9SRUdJU1RSQVRJT05fQ09NUExFVEU6CisJREVCVUcoMCwgInJlZ2lzdHJhdGlvbiBjb21wbGV0ZVxuIik7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICAgIG5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCXhpcmMycHNfY29uZmlnKGxpbmspOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgaWYgKGxpbmstPm9wZW4pIHsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQlkb19wb3dlcmRvd24oZGV2KTsKKwkgICAgfQorCSAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJfQorCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCSAgICBpZiAobGluay0+b3BlbikgeworCQlkb19yZXNldChkZXYsMSk7CisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkgICAgfQorCX0KKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIHhpcmMycHNfZXZlbnQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqCisgKiBUaGlzIGlzIHRoZSBJbnRlcnJ1cHQgc2VydmljZSByb3V0ZS4KKyAqLworc3RhdGljIGlycXJldHVybl90Cit4aXJjMnBzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisgICAgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHI7CisgICAgdV9jaGFyIHNhdmVkX3BhZ2U7CisgICAgdW5zaWduZWQgYnl0ZXNfcmN2ZDsKKyAgICB1bnNpZ25lZCBpbnRfc3RhdHVzLCBldGhfc3RhdHVzLCByeF9zdGF0dXMsIHR4X3N0YXR1czsKKyAgICB1bnNpZ25lZCByc3IsIHBrdGxlbjsKKyAgICB1bG9uZyBzdGFydF90aWNrcyA9IGppZmZpZXM7IC8qIGZpeG1lOiBqaWZmaWVzIHJvbGxvdmVyIGV2ZXJ5IDQ5NyBkYXlzCisJCQkJICAqIGlzIHRoaXMgc29tZXRoaW5nIHRvIHdvcnJ5IGFib3V0PworCQkJCSAgKiAtLSBvbiBhIGxhcHRvcD8KKwkJCQkgICovCisKKyAgICBpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJcmV0dXJuIElSUV9IQU5ETEVEOworCisgICAgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaWYgKGxwLT5tb2hhd2spIHsgLyogbXVzdCBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KKwlQdXRCeXRlKFhJUkNSRUdfQ1IsIDApOworICAgIH0KKworICAgIERFQlVHKDYsICIlczogaW50ZXJydXB0ICVkIGF0ICUjeC5cbiIsIGRldi0+bmFtZSwgaXJxLCBpb2FkZHIpOworCisgICAgc2F2ZWRfcGFnZSA9IEdldEJ5dGUoWElSQ1JFR19QUik7CisgICAgLyogUmVhZCB0aGUgSVNSIHRvIHNlZSB3aGF0cyB0aGUgY2F1c2UgZm9yIHRoZSBpbnRlcnJ1cHQuCisgICAgICogVGhpcyBhbHNvIGNsZWFycyB0aGUgaW50ZXJydXB0IGZsYWdzIG9uIENFMiBjYXJkcworICAgICAqLworICAgIGludF9zdGF0dXMgPSBHZXRCeXRlKFhJUkNSRUdfSVNSKTsKKyAgICBieXRlc19yY3ZkID0gMDsKKyAgbG9vcF9lbnRyeToKKyAgICBpZiAoaW50X3N0YXR1cyA9PSAweGZmKSB7IC8qIGNhcmQgbWF5IGJlIGVqZWN0ZWQgKi8KKwlERUJVRygzLCAiJXM6IGludGVycnVwdCAlZCBmb3IgZGVhZCBjYXJkXG4iLCBkZXYtPm5hbWUsIGlycSk7CisJZ290byBsZWF2ZTsKKyAgICB9CisgICAgZXRoX3N0YXR1cyA9IEdldEJ5dGUoWElSQ1JFR19FU1IpOworCisgICAgU2VsZWN0UGFnZSgweDQwKTsKKyAgICByeF9zdGF0dXMgID0gR2V0Qnl0ZShYSVJDUkVHNDBfUlhTVDApOworICAgIFB1dEJ5dGUoWElSQ1JFRzQwX1JYU1QwLCAofnJ4X3N0YXR1cyAmIDB4ZmYpKTsKKyAgICB0eF9zdGF0dXMgPSBHZXRCeXRlKFhJUkNSRUc0MF9UWFNUMCk7CisgICAgdHhfc3RhdHVzIHw9IEdldEJ5dGUoWElSQ1JFRzQwX1RYU1QxKSA8PCA4OworICAgIFB1dEJ5dGUoWElSQ1JFRzQwX1RYU1QwLCAwKTsKKyAgICBQdXRCeXRlKFhJUkNSRUc0MF9UWFNUMSwgMCk7CisKKyAgICBERUJVRygzLCAiJXM6IElTUj0lIzIuMnggRVNSPSUjMi4yeCBSU1I9JSMyLjJ4IFRTUj0lIzQuNHhcbiIsCisJICBkZXYtPm5hbWUsIGludF9zdGF0dXMsIGV0aF9zdGF0dXMsIHJ4X3N0YXR1cywgdHhfc3RhdHVzKTsKKworICAgIC8qKioqKiByZWNlaXZlIHNlY3Rpb24gKioqKioqLworICAgIFNlbGVjdFBhZ2UoMCk7CisgICAgd2hpbGUgKGV0aF9zdGF0dXMgJiBGdWxsUGt0UmN2ZCkgeworCXJzciA9IEdldEJ5dGUoWElSQ1JFRzBfUlNSKTsKKwlpZiAoYnl0ZXNfcmN2ZCA+IG1heHJ4X2J5dGVzICYmIChyc3IgJiBQa3RSeE9rKSkgeworCSAgICAvKiB0b28gbWFueSBieXRlcyByZWNlaXZlZCBkdXJpbmcgdGhpcyBpbnQsIGRyb3AgdGhlIHJlc3Qgb2YgdGhlCisJICAgICAqIHBhY2tldHMgKi8KKwkgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkgICAgREVCVUcoMiwgIiVzOiBSWCBkcm9wLCB0b28gbXVjaCBkb25lXG4iLCBkZXYtPm5hbWUpOworCX0gZWxzZSBpZiAocnNyICYgUGt0UnhPaykgeworCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJICAgIHBrdGxlbiA9IEdldFdvcmQoWElSQ1JFRzBfUkJDKTsKKwkgICAgYnl0ZXNfcmN2ZCArPSBwa3RsZW47CisKKwkgICAgREVCVUcoNSwgInJzcj0lIzAyeCBwYWNrZXRfbGVuZ3RoPSV1XG4iLCByc3IsIHBrdGxlbik7CisKKwkgICAgc2tiID0gZGV2X2FsbG9jX3NrYihwa3RsZW4rMyk7IC8qIDEgZXh0cmEgc28gd2UgY2FuIHVzZSBpbnN3ICovCisJICAgIGlmICghc2tiKSB7CisJCXByaW50ayhLTk9UX1hJUkMgImxvdyBtZW1vcnksIHBhY2tldCBkcm9wcGVkIChzaXplPSV1KVxuIiwKKwkJICAgICAgIHBrdGxlbik7CisJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJICAgIH0gZWxzZSB7IC8qIG9rYXkgZ2V0IHRoZSBwYWNrZXQgKi8KKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJaWYgKGxwLT5zaWxpY29uID09IDAgKSB7IC8qIHdvcmsgYXJvdW5kIGEgaGFyZHdhcmUgYnVnICovCisJCSAgICB1bnNpZ25lZCByaHNhOyAvKiByZWNlaXZlIHN0YXJ0IGFkZHJlc3MgKi8KKworCQkgICAgU2VsZWN0UGFnZSg1KTsKKwkJICAgIHJoc2EgPSBHZXRXb3JkKFhJUkNSRUc1X1JIU0EwKTsKKwkJICAgIFNlbGVjdFBhZ2UoMCk7CisJCSAgICByaHNhICs9IDM7IC8qIHNraXAgY29udHJvbCBpbmZvcyAqLworCQkgICAgaWYgKHJoc2EgPj0gMHg4MDAwKQorCQkJcmhzYSA9IDA7CisJCSAgICBpZiAocmhzYSArIHBrdGxlbiA+IDB4ODAwMCkgeworCQkJdW5zaWduZWQgaTsKKwkJCXVfY2hhciAqYnVmID0gc2tiX3B1dChza2IsIHBrdGxlbik7CisJCQlmb3IgKGk9MDsgaSA8IHBrdGxlbiA7IGkrKywgcmhzYSsrKSB7CisJCQkgICAgYnVmW2ldID0gR2V0Qnl0ZShYSVJDUkVHX0VEUCk7CisJCQkgICAgaWYgKHJoc2EgPT0gMHg4MDAwKSB7CisJCQkJcmhzYSA9IDA7CisJCQkJaS0tOworCQkJICAgIH0KKwkJCX0KKwkJICAgIH0gZWxzZSB7CisJCQlpbnN3KGlvYWRkcitYSVJDUkVHX0VEUCwKKwkJCQlza2JfcHV0KHNrYiwgcGt0bGVuKSwgKHBrdGxlbisxKT4+MSk7CisJCSAgICB9CisJCX0KKwkgICAgICAjaWYgMAorCQllbHNlIGlmIChscC0+bW9oYXdrKSB7CisJCSAgICAvKiBUbyB1c2UgdGhpcyAzMiBiaXQgYWNjZXNzIHdlIHNob3VsZCB1c2UKKwkJICAgICAqIGEgbWFudWFsIG9wdGltaXplZCBsb29wCisJCSAgICAgKiBBbHNvIHRoZSB3b3JkcyBhcmUgc3dhcHBlZCwgd2UgY2FuIGdldCBtb3JlCisJCSAgICAgKiBwZXJmb3JtYW5jZSBieSB1c2luZyAzMiBiaXQgYWNjZXNzIGFuZCBzd2FwcGluZworCQkgICAgICogdGhlIHdvcmRzIGluIGEgcmVnaXN0ZXIuIFdpbGwgbmVlZCB0aGlzIGZvciBjYXJkYnVzCisJCSAgICAgKgorCQkgICAgICogTm90ZTogZG9uJ3QgZm9yZ2V0IHRvIGNoYW5nZSB0aGUgQUxMT0NfU0tCIHRvIC4uICszCisJCSAgICAgKi8KKwkJICAgIHVuc2lnbmVkIGk7CisJCSAgICB1X2xvbmcgKnAgPSBza2JfcHV0KHNrYiwgcGt0bGVuKTsKKwkJICAgIHJlZ2lzdGVyIHVfbG9uZyBhOworCQkgICAga2lvX2FkZHJfdCBlZHByZWcgPSBpb2FkZHIrWElSQ1JFR19FRFAtMjsKKwkJICAgIGZvciAoaT0wOyBpIDwgbGVuIDsgaSArPSA0LCBwKyspIHsKKwkJCWEgPSBpbmwoZWRwcmVnKTsKKwkJCV9fYXNtX18oInJvcmwgJDE2LCUwXG5cdCIKKwkJCQk6Ij1xIiAoYSkKKwkJCQk6ICIwIiAoYSkpOworCQkJKnAgPSBhOworCQkgICAgfQorCQl9CisJICAgICAgI2VuZGlmCisJCWVsc2UgeworCQkgICAgaW5zdyhpb2FkZHIrWElSQ1JFR19FRFAsIHNrYl9wdXQoc2tiLCBwa3RsZW4pLAorCQkJICAgIChwa3RsZW4rMSk+PjEpOworCQl9CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCXNrYi0+ZGV2ID0gZGV2OworCQluZXRpZl9yeChza2IpOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOworCQlpZiAoIShyc3IgJiBQaHlQa3QpKQorCQkgICAgbHAtPnN0YXRzLm11bHRpY2FzdCsrOworCSAgICB9CisJfSBlbHNlIHsgLyogYmFkIHBhY2tldCAqLworCSAgICBERUJVRyg1LCAicnNyPSUjMDJ4XG4iLCByc3IpOworCX0KKwlpZiAocnNyICYgUGt0VG9vTG9uZykgeworCSAgICBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJICAgIERFQlVHKDMsICIlczogUGFja2V0IHRvbyBsb25nXG4iLCBkZXYtPm5hbWUpOworCX0KKwlpZiAocnNyICYgQ1JDRXJyKSB7CisJICAgIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJICAgIERFQlVHKDMsICIlczogQ1JDIGVycm9yXG4iLCBkZXYtPm5hbWUpOworCX0KKwlpZiAocnNyICYgQWxpZ25FcnIpIHsKKwkgICAgbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7IC8qIG9rYXkgPyAqLworCSAgICBERUJVRygzLCAiJXM6IEFsaWdubWVudCBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwl9CisKKwkvKiBjbGVhciB0aGUgcmVjZWl2ZWQvZHJvcHBlZC9lcnJvciBwYWNrZXQgKi8KKwlQdXRXb3JkKFhJUkNSRUcwX0RPLCAweDgwMDApOyAvKiBpc3N1ZSBjbWQ6IHNraXBfcnhfcGFja2V0ICovCisKKwkvKiBnZXQgdGhlIG5ldyBldGhlcm5ldCBzdGF0dXMgKi8KKwlldGhfc3RhdHVzID0gR2V0Qnl0ZShYSVJDUkVHX0VTUik7CisgICAgfQorICAgIGlmIChyeF9zdGF0dXMgJiAweDEwKSB7IC8qIFJlY2VpdmUgb3ZlcnJ1biAqLworCWxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCVB1dEJ5dGUoWElSQ1JFR19DUiwgQ2xlYXJSeE92cnVuKTsKKwlERUJVRygzLCAicmVjZWl2ZSBvdmVycnVuIGNsZWFyZWRcbiIpOworICAgIH0KKworICAgIC8qKioqKiB0cmFuc21pdCBzZWN0aW9uICoqKioqKi8KKyAgICBpZiAoaW50X3N0YXR1cyAmIFBrdFR4ZWQpIHsKKwl1bnNpZ25lZCBuLCBubjsKKworCW4gPSBscC0+bGFzdF9wdHJfdmFsdWU7CisJbm4gPSBHZXRCeXRlKFhJUkNSRUcwX1BUUik7CisJbHAtPmxhc3RfcHRyX3ZhbHVlID0gbm47CisJaWYgKG5uIDwgbikgLyogcm9sbG92ZXIgKi8KKwkgICAgbHAtPnN0YXRzLnR4X3BhY2tldHMgKz0gMjU2IC0gbjsKKwllbHNlIGlmIChuID09IG5uKSB7IC8qIGhhcHBlbnMgc29tZXRpbWVzIC0gZG9uJ3Qga25vdyB3aHkgKi8KKwkgICAgREVCVUcoMCwgIlBUUiBub3QgY2hhbmdlZD9cbiIpOworCX0gZWxzZQorCSAgICBscC0+c3RhdHMudHhfcGFja2V0cyArPSBscC0+bGFzdF9wdHJfdmFsdWUgLSBuOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICB9CisgICAgaWYgKHR4X3N0YXR1cyAmIDB4MDAwMikgewkvKiBFeGVjZXNzaXZlIGNvbGxpc3Npb25zICovCisJREVCVUcoMCwgInR4IHJlc3RhcnRlZCBkdWUgdG8gZXhlY3NzaXZlIGNvbGxpc3Npb25zXG4iKTsKKwlQdXRCeXRlKFhJUkNSRUdfQ1IsIFJlc3RhcnRUeCk7ICAvKiByZXN0YXJ0IHRyYW5zbWl0dGVyIHByb2Nlc3MgKi8KKyAgICB9CisgICAgaWYgKHR4X3N0YXR1cyAmIDB4MDA0MCkKKwlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKworICAgIC8qIHJlY2FsY3VsYXRlIG91ciB3b3JrIGNodW5rIHNvIHRoYXQgd2UgbGltaXQgdGhlIGR1cmF0aW9uIG9mIHRoaXMKKyAgICAgKiBJU1IgdG8gYWJvdXQgMS8xMCBvZiBhIHNlY29uZC4KKyAgICAgKiBDYWxjdWxhdGUgb25seSBpZiB3ZSByZWNlaXZlZCBhIHJlYXNvbmFibGUgYW1vdW50IG9mIGJ5dGVzLgorICAgICAqLworICAgIGlmIChieXRlc19yY3ZkID4gMTAwMCkgeworCXVfbG9uZyBkdXJhdGlvbiA9IGppZmZpZXMgLSBzdGFydF90aWNrczsKKworCWlmIChkdXJhdGlvbiA+PSBIWi8xMCkgeyAvKiBpZiBtb3JlIHRoYW4gYWJvdXQgMS8xMCBzZWNvbmQgKi8KKwkgICAgbWF4cnhfYnl0ZXMgPSAoYnl0ZXNfcmN2ZCAqIChIWi8xMCkpIC8gZHVyYXRpb247CisJICAgIGlmIChtYXhyeF9ieXRlcyA8IDIwMDApCisJCW1heHJ4X2J5dGVzID0gMjAwMDsKKwkgICAgZWxzZSBpZiAobWF4cnhfYnl0ZXMgPiAyMjAwMCkKKwkJbWF4cnhfYnl0ZXMgPSAyMjAwMDsKKwkgICAgREVCVUcoMSwgInNldCBtYXhyeD0ldSAocmN2ZD0ldSB0aWNrcz0lbHUpXG4iLAorCQkgIG1heHJ4X2J5dGVzLCBieXRlc19yY3ZkLCBkdXJhdGlvbik7CisJfSBlbHNlIGlmICghZHVyYXRpb24gJiYgbWF4cnhfYnl0ZXMgPCAyMjAwMCkgeworCSAgICAvKiBub3cgbXVjaCBmYXN0ZXIgKi8KKwkgICAgbWF4cnhfYnl0ZXMgKz0gMjAwMDsKKwkgICAgaWYgKG1heHJ4X2J5dGVzID4gMjIwMDApCisJCW1heHJ4X2J5dGVzID0gMjIwMDA7CisJICAgIERFQlVHKDEsICJzZXQgbWF4cng9JXVcbiIsIG1heHJ4X2J5dGVzKTsKKwl9CisgICAgfQorCisgIGxlYXZlOgorICAgIGlmIChsb2NrdXBfaGFjaykgeworCWlmIChpbnRfc3RhdHVzICE9IDB4ZmYgJiYgKGludF9zdGF0dXMgPSBHZXRCeXRlKFhJUkNSRUdfSVNSKSkgIT0gMCkKKwkgICAgZ290byBsb29wX2VudHJ5OworICAgIH0KKyAgICBTZWxlY3RQYWdlKHNhdmVkX3BhZ2UpOworICAgIFB1dEJ5dGUoWElSQ1JFR19DUiwgRW5hYmxlSW50cik7ICAvKiByZS1lbmFibGUgaW50ZXJydXB0cyAqLworICAgIC8qIEluc3RlYWQgb2YgZHJvcHBpbmcgcGFja2V0cyBkdXJpbmcgYSByZWNlaXZlLCB3ZSBjb3VsZAorICAgICAqIGZvcmNlIGFuIGludGVycnVwdCB3aXRoIHRoaXMgY29tbWFuZDoKKyAgICAgKgkgIFB1dEJ5dGUoWElSQ1JFR19DUiwgRW5hYmxlSW50cnxGb3JjZUludHIpOworICAgICAqLworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30gLyogeGlyYzJwc19pbnRlcnJ1cHQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkCitkb190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlczogdHJhbnNtaXQgdGltZWQgb3V0XG4iLCBkZXYtPm5hbWUpOworICAgIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICAvKiByZXNldCB0aGUgY2FyZCAqLworICAgIGRvX3Jlc2V0KGRldiwxKTsKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQKK2RvX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBva2F5OworICAgIHVuc2lnbmVkIGZyZWVzcGFjZTsKKyAgICB1bnNpZ25lZCBwa3RsZW4gPSBza2I/IHNrYi0+bGVuIDogMDsKKworICAgIERFQlVHKDEsICJkb19zdGFydF94bWl0KHNrYj0lcCwgZGV2PSVwKSBsZW49JXVcbiIsCisJICBza2IsIGRldiwgcGt0bGVuKTsKKworCisgICAgLyogYWRqdXN0IHRoZSBwYWNrZXQgbGVuZ3RoIHRvIG1pbi4gcmVxdWlyZWQKKyAgICAgKiBhbmQgaG9wZSB0aGF0IHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoCisgICAgICogdG8gcHJvdmlkZSBzb21lIHJhbmRvbSBkYXRhLgorICAgICAqIGZpeG1lOiBGb3IgTW9oYXdrIHdlIGNhbiBjaGFuZ2UgdGhpcyBieSBzZW5kaW5nCisgICAgICogYSBsYXJnZXIgcGFja2V0bGVuIHRoYW4gd2UgYWN0dWFsbHkgaGF2ZTsgdGhlIGNoaXAgd2lsbAorICAgICAqIHBhZCB0aGlzIGluIGhpcyBidWZmZXIgd2l0aCByYW5kb20gYnl0ZXMKKyAgICAgKi8KKyAgICBpZiAocGt0bGVuIDwgRVRIX1pMRU4pCisgICAgeworICAgICAgICBza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisgICAgICAgIGlmIChza2IgPT0gTlVMTCkKKyAgICAgICAgCXJldHVybiAwOworCXBrdGxlbiA9IEVUSF9aTEVOOworICAgIH0KKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICBTZWxlY3RQYWdlKDApOworICAgIFB1dFdvcmQoWElSQ1JFRzBfVFJTLCAodV9zaG9ydClwa3RsZW4rMik7CisgICAgZnJlZXNwYWNlID0gR2V0V29yZChYSVJDUkVHMF9UU08pOworICAgIG9rYXkgPSBmcmVlc3BhY2UgJiAweDgwMDA7CisgICAgZnJlZXNwYWNlICY9IDB4N2ZmZjsKKyAgICAvKiBUUlMgZG9lc24ndCB3b3JrIC0gKGluZGVlZCBpdCBpcyBlbGltaW5hdGVkIHdpdGggc2lsLXJldiAxKSAqLworICAgIG9rYXkgPSBwa3RsZW4gKzIgPCBmcmVlc3BhY2U7CisgICAgREVCVUcoMiArIChva2F5ID8gMiA6IDApLCAiJXM6IGF2YWlsLiB0eCBzcGFjZT0ldSVzXG4iLAorCSAgZGV2LT5uYW1lLCBmcmVlc3BhY2UsIG9rYXkgPyAiIChva2F5KSI6IiAobm90IGVub3VnaCkiKTsKKyAgICBpZiAoIW9rYXkpIHsgLyogbm90IGVub3VnaCBzcGFjZSAqLworCXJldHVybiAxOyAgLyogdXBwZXIgbGF5ZXIgbWF5IGRlY2lkZSB0byByZXF1ZXVlIHRoaXMgcGFja2V0ICovCisgICAgfQorICAgIC8qIHNlbmQgdGhlIHBhY2tldCAqLworICAgIFB1dFdvcmQoWElSQ1JFR19FRFAsICh1X3Nob3J0KXBrdGxlbik7CisgICAgb3V0c3coaW9hZGRyK1hJUkNSRUdfRURQLCBza2ItPmRhdGEsIHBrdGxlbj4+MSk7CisgICAgaWYgKHBrdGxlbiAmIDEpCisJUHV0Qnl0ZShYSVJDUkVHX0VEUCwgc2tiLT5kYXRhW3BrdGxlbi0xXSk7CisKKyAgICBpZiAobHAtPm1vaGF3aykKKwlQdXRCeXRlKFhJUkNSRUdfQ1IsIFRyYW5zbWl0UGFja2V0fEVuYWJsZUludHIpOworCisgICAgZGV2X2tmcmVlX3NrYiAoc2tiKTsKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICBscC0+c3RhdHMudHhfYnl0ZXMgKz0gcGt0bGVuOworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitkb19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIC8qCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gR2V0Qnl0ZSg/KSAqLworICAgIHJldHVybiAmbHAtPnN0YXRzOworfQorCisvKioqKioqKioqKioqKioqKgorICogU2V0IGFsbCBhZGRyZXNzZXM6IFRoaXMgZmlyc3Qgb25lIGlzIHRoZSBpbmRpdmlkdWFsIGFkZHJlc3MsCisgKiB0aGUgbmV4dCA5IGFkZHJlc3NlcyBhcmUgdGFrZW4gZnJvbSB0aGUgbXVsdGljYXN0IGxpc3QgYW5kCisgKiB0aGUgcmVzdCBpcyBmaWxsZWQgd2l0aCB0aGUgaW5kaXZpZHVhbCBhZGRyZXNzLgorICovCitzdGF0aWMgdm9pZAorc2V0X2FkZHJlc3NlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisgICAgY2hhciAqYWRkcjsKKyAgICBpbnQgaSxqLGssbjsKKworICAgIFNlbGVjdFBhZ2Uoaz0weDUwKTsKKyAgICBmb3IgKGk9MCxqPTgsbj0wOyA7IGkrKywgaisrKSB7CisJaWYgKGkgPiA1KSB7CisJICAgIGlmICgrK24gPiA5KQorCQlicmVhazsKKwkgICAgaSA9IDA7CisJfQorCWlmIChqID4gMTUpIHsKKwkgICAgaiA9IDg7CisJICAgIGsrKzsKKwkgICAgU2VsZWN0UGFnZShrKTsKKwl9CisKKwlpZiAobiAmJiBuIDw9IGRldi0+bWNfY291bnQgJiYgZG1pKSB7CisJICAgIGFkZHIgPSBkbWktPmRtaV9hZGRyOworCSAgICBkbWkgPSBkbWktPm5leHQ7CisJfSBlbHNlCisJICAgIGFkZHIgPSBkZXYtPmRldl9hZGRyOworCisJaWYgKGxwLT5tb2hhd2spCisJICAgIFB1dEJ5dGUoaiwgYWRkcls1LWldKTsKKwllbHNlCisJICAgIFB1dEJ5dGUoaiwgYWRkcltpXSk7CisgICAgfQorICAgIFNlbGVjdFBhZ2UoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIFdlIGNhbiBmaWx0ZXIgdXAgdG8gOSBhZGRyZXNzZXMsIGlmIG1vcmUgYXJlIHJlcXVlc3RlZCB3ZSBzZXQKKyAqIG11bHRpY2FzdCBwcm9taXNjdW91cyBtb2RlLgorICovCisKK3N0YXRpYyB2b2lkCitzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgU2VsZWN0UGFnZSgweDQyKTsKKyAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7IC8qIHNub29wICovCisJUHV0Qnl0ZShYSVJDUkVHNDJfU1dDMSwgMHgwNik7IC8qIHNldCBNUEUgYW5kIFBNRSAqLworICAgIH0gZWxzZSBpZiAoZGV2LT5tY19jb3VudCA+IDkgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJUHV0Qnl0ZShYSVJDUkVHNDJfU1dDMSwgMHgwNik7IC8qIHNldCBNUEUgKi8KKyAgICB9IGVsc2UgaWYgKGRldi0+bWNfY291bnQpIHsKKwkvKiB0aGUgY2hpcCBjYW4gZmlsdGVyIDkgYWRkcmVzc2VzIHBlcmZlY3RseSAqLworCVB1dEJ5dGUoWElSQ1JFRzQyX1NXQzEsIDB4MDApOworCVNlbGVjdFBhZ2UoMHg0MCk7CisJUHV0Qnl0ZShYSVJDUkVHNDBfQ01EMCwgT2ZmbGluZSk7CisJc2V0X2FkZHJlc3NlcyhkZXYpOworCVNlbGVjdFBhZ2UoMHg0MCk7CisJUHV0Qnl0ZShYSVJDUkVHNDBfQ01EMCwgRW5hYmxlUmVjdiB8IE9ubGluZSk7CisgICAgfSBlbHNlIHsgLyogc3RhbmRhcmQgdXNhZ2UgKi8KKwlQdXRCeXRlKFhJUkNSRUc0Ml9TV0MxLCAweDAwKTsKKyAgICB9CisgICAgU2VsZWN0UGFnZSgwKTsKK30KKworc3RhdGljIGludAorZG9fY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQoreworICAgIGxvY2FsX2luZm9fdCAqbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgREVCVUcoMCwgImRvX2NvbmZpZyglcClcbiIsIGRldik7CisgICAgaWYgKG1hcC0+cG9ydCAhPSAyNTUgJiYgbWFwLT5wb3J0ICE9IGRldi0+aWZfcG9ydCkgeworCWlmIChtYXAtPnBvcnQgPiA0KQorCSAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoIW1hcC0+cG9ydCkgeworCSAgICBsb2NhbC0+cHJvYmVfcG9ydCA9IDE7CisJICAgIGRldi0+aWZfcG9ydCA9IDE7CisJfSBlbHNlIHsKKwkgICAgbG9jYWwtPnByb2JlX3BvcnQgPSAwOworCSAgICBkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hpbmcgdG8gJXMgcG9ydFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBpZl9uYW1lc1tkZXYtPmlmX3BvcnRdKTsKKwlkb19yZXNldChkZXYsMSk7ICAvKiBub3QgdGhlIGZpbmUgd2F5IDotKSAqLworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIE9wZW4gdGhlIGRyaXZlcgorICovCitzdGF0aWMgaW50Citkb19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZscC0+bGluazsKKworICAgIERFQlVHKDAsICJkb19vcGVuKCVwKVxuIiwgZGV2KTsKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIFBDTUNJQSBjYXJkIGlzIHN0aWxsIGhlcmUuICovCisgICAgLyogUGh5c2ljYWwgZGV2aWNlIHByZXNlbnQgc2lnbmF0dXJlLiAqLworICAgIGlmICghREVWX09LKGxpbmspKQorCXJldHVybiAtRU5PREVWOworCisgICAgLyogb2theSAqLworICAgIGxpbmstPm9wZW4rKzsKKworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgZG9fcmVzZXQoZGV2LDEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgInhpcmMycHNfY3MiKTsKKwlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiUENNQ0lBIDB4JWx4IiwgZGV2LT5iYXNlX2FkZHIpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorfTsKKworc3RhdGljIGludAorZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKyAgICBsb2NhbF9pbmZvX3QgKmxvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHUxNiAqZGF0YSA9ICh1MTYgKikmcnEtPmlmcl9pZnJ1OworCisgICAgREVCVUcoMSwgIiVzOiBpb2N0bCglLS42cywgJSMwNHgpICUwNHggJTA0eCAlMDR4ICUwNHhcbiIsCisJICBkZXYtPm5hbWUsIHJxLT5pZnJfaWZybi5pZnJuX25hbWUsIGNtZCwKKwkgIGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10pOworCisgICAgaWYgKCFsb2NhbC0+bW9oYXdrKQorCXJldHVybiAtRU9QTk9UU1VQUDsKKworICAgIHN3aXRjaChjbWQpIHsKKyAgICAgIGNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIFBIWSBpbiB1c2UuICovCisJZGF0YVswXSA9IDA7CQkvKiB3ZSBoYXZlIG9ubHkgdGhpcyBhZGRyZXNzICovCisJLyogZmFsbCB0cm91Z2ggKi8KKyAgICAgIGNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIHRoZSBzcGVjaWZpZWQgTUlJIHJlZ2lzdGVyLiAqLworCWRhdGFbM10gPSBtaWlfcmQoaW9hZGRyLCBkYXRhWzBdICYgMHgxZiwgZGF0YVsxXSAmIDB4MWYpOworCWJyZWFrOworICAgICAgY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIHRoZSBzcGVjaWZpZWQgTUlJIHJlZ2lzdGVyICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCSAgICByZXR1cm4gLUVQRVJNOworCW1paV93cihpb2FkZHIsIGRhdGFbMF0gJiAweDFmLCBkYXRhWzFdICYgMHgxZiwgZGF0YVsyXSwgMTYpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraGFyZHJlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgbG9jYWxfaW5mb190ICpsb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIFNlbGVjdFBhZ2UoNCk7CisgICAgdWRlbGF5KDEpOworICAgIFB1dEJ5dGUoWElSQ1JFRzRfR1BSMSwgMCk7CSAgICAgLyogY2xlYXIgYml0IDA6IHBvd2VyIGRvd24gKi8KKyAgICBtc2xlZXAoNDApOwkJCQkgICAgIC8qIHdhaXQgNDAgbXNlYyAqLworICAgIGlmIChsb2NhbC0+bW9oYXdrKQorCVB1dEJ5dGUoWElSQ1JFRzRfR1BSMSwgMSk7CSAvKiBzZXQgYml0IDA6IHBvd2VyIHVwICovCisgICAgZWxzZQorCVB1dEJ5dGUoWElSQ1JFRzRfR1BSMSwgMSB8IDQpOwkgLyogc2V0IGJpdCAwOiBwb3dlciB1cCwgYml0IDI6IEFJQyAqLworICAgIG1zbGVlcCgyMCk7CQkJICAgICAvKiB3YWl0IDIwIG1zZWMgKi8KK30KKworc3RhdGljIHZvaWQKK2RvX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmdWxsKQoreworICAgIGxvY2FsX2luZm9fdCAqbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdW5zaWduZWQgdmFsdWU7CisKKyAgICBERUJVRygwLCAiJXM6IGRvX3Jlc2V0KCVwLCVkKVxuIiwgZGV2PyBkZXYtPm5hbWU6ImV0aD8iLCBkZXYsIGZ1bGwpOworCisgICAgaGFyZHJlc2V0KGRldik7CisgICAgUHV0Qnl0ZShYSVJDUkVHX0NSLCBTb2Z0UmVzZXQpOyAvKiBzZXQgKi8KKyAgICBtc2xlZXAoMjApOwkJCSAgICAgLyogd2FpdCAyMCBtc2VjICovCisgICAgUHV0Qnl0ZShYSVJDUkVHX0NSLCAwKTsJICAgICAvKiBjbGVhciAqLworICAgIG1zbGVlcCg0MCk7CQkJICAgICAvKiB3YWl0IDQwIG1zZWMgKi8KKyAgICBpZiAobG9jYWwtPm1vaGF3aykgeworCVNlbGVjdFBhZ2UoNCk7CisJLyogc2V0IHBpbiBHUDEgYW5kIEdQMiB0byBvdXRwdXQgICgweDBjKQorCSAqIHNldCBHUDEgdG8gbG93IHRvIHBvd2VyIHVwIHRoZSBNTDY2OTIgKDB4MDApCisJICogc2V0IEdQMiB0byBoaWdoIHRvIHBvd2VyIHVwIHRoZSAxME1oeiBjaGlwICAoMHgwMikKKwkgKi8KKwlQdXRCeXRlKFhJUkNSRUc0X0dQUjAsIDB4MGUpOworICAgIH0KKworICAgIC8qIGdpdmUgdGhlIGNpcmN1aXRzIHNvbWUgdGltZSB0byBwb3dlciB1cCAqLworICAgIG1zbGVlcCg1MDApOwkJCS8qIGFib3V0IDUwMG1zICovCisKKyAgICBsb2NhbC0+bGFzdF9wdHJfdmFsdWUgPSAwOworICAgIGxvY2FsLT5zaWxpY29uID0gbG9jYWwtPm1vaGF3ayA/IChHZXRCeXRlKFhJUkNSRUc0X0JPVikgJiAweDcwKSA+PiA0CisJCQkJICAgOiAoR2V0Qnl0ZShYSVJDUkVHNF9CT1YpICYgMHgzMCkgPj4gNDsKKworICAgIGlmIChsb2NhbC0+cHJvYmVfcG9ydCkgeworCWlmICghbG9jYWwtPm1vaGF3aykgeworCSAgICBTZWxlY3RQYWdlKDQpOworCSAgICBQdXRCeXRlKFhJUkNSRUc0X0dQUjAsIDQpOworCSAgICBsb2NhbC0+cHJvYmVfcG9ydCA9IDA7CisJfQorICAgIH0gZWxzZSBpZiAoZGV2LT5pZl9wb3J0ID09IDIpIHsgLyogZW5hYmxlIDEwQmFzZTIgKi8KKwlTZWxlY3RQYWdlKDB4NDIpOworCVB1dEJ5dGUoWElSQ1JFRzQyX1NXQzEsIDB4QzApOworICAgIH0gZWxzZSB7IC8qIGVuYWJsZSAxMEJhc2VUICovCisJU2VsZWN0UGFnZSgweDQyKTsKKwlQdXRCeXRlKFhJUkNSRUc0Ml9TV0MxLCAweDgwKTsKKyAgICB9CisgICAgbXNsZWVwKDQwKTsJCQkgICAgIC8qIHdhaXQgNDAgbXNlYyB0byBsZXQgaXQgY29tcGxldGUgKi8KKworICAjaWZkZWYgUENNQ0lBX0RFQlVHCisgICAgaWYgKHBjX2RlYnVnKSB7CisJU2VsZWN0UGFnZSgwKTsKKwl2YWx1ZSA9IEdldEJ5dGUoWElSQ1JFR19FU1IpOwkgLyogcmVhZCB0aGUgRVNSICovCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBFU1IgaXM6ICUjMDJ4XG4iLCBkZXYtPm5hbWUsIHZhbHVlKTsKKyAgICB9CisgICNlbmRpZgorCisgICAgLyogc2V0dXAgdGhlIEVDUiAqLworICAgIFNlbGVjdFBhZ2UoMSk7CisgICAgUHV0Qnl0ZShYSVJDUkVHMV9JTVIwLCAweGZmKTsgLyogYWxsb3cgYWxsIGludHMgKi8KKyAgICBQdXRCeXRlKFhJUkNSRUcxX0lNUjEsIDEJKTsgLyogYW5kIFNldCBUeFVuZGVycnVuRGV0ZWN0ICovCisgICAgdmFsdWUgPSBHZXRCeXRlKFhJUkNSRUcxX0VDUik7CisgICNpZiAwCisgICAgaWYgKGxvY2FsLT5tb2hhd2spCisJdmFsdWUgfD0gRGlzYWJsZUxpbmtQdWxzZTsKKyAgICBQdXRCeXRlKFhJUkNSRUcxX0VDUiwgdmFsdWUpOworICAjZW5kaWYKKyAgICBERUJVRygwLCAiJXM6IEVDUiBpczogJSMwMnhcbiIsIGRldi0+bmFtZSwgdmFsdWUpOworCisgICAgU2VsZWN0UGFnZSgweDQyKTsKKyAgICBQdXRCeXRlKFhJUkNSRUc0Ml9TV0MwLCAweDIwKTsgLyogZGlzYWJsZSBzb3VyY2UgaW5zZXJ0aW9uICovCisKKyAgICBpZiAobG9jYWwtPnNpbGljb24gIT0gMSkgeworCS8qIHNldCB0aGUgbG9jYWwgbWVtb3J5IGRpdmlkaW5nIGxpbmUuCisJICogVGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgY29kZSBzYXkgdGhhdCB0aGlzIGlzIG9ubHkKKwkgKiBzZXR0YWJsZSB3aXRoIHRoZSBzY2lwcGVyIHZlcnNpb24gMiB3aGljaCBpcyByZXZpc2lvbiAwLgorCSAqIEFsd2F5cyBmb3IgQ0UzIGNhcmRzCisJICovCisJU2VsZWN0UGFnZSgyKTsKKwlQdXRXb3JkKFhJUkNSRUcyX1JCUywgMHgyMDAwKTsKKyAgICB9CisKKyAgICBpZiAoZnVsbCkKKwlzZXRfYWRkcmVzc2VzKGRldik7CisKKyAgICAvKiBIYXJkd2FyZSB3b3JrYXJvdW5kOgorICAgICAqIFRoZSByZWNlaXZlIGJ5dGUgcG9pbnRlciBhZnRlciByZXNldCBpcyBvZmYgYnkgMSBzbyB3ZSBuZWVkCisgICAgICogdG8gbW92ZSB0aGUgb2Zmc2V0IHBvaW50ZXIgYmFjayB0byAwLgorICAgICAqLworICAgIFNlbGVjdFBhZ2UoMCk7CisgICAgUHV0V29yZChYSVJDUkVHMF9ETywgMHgyMDAwKTsgLyogY2hhbmdlIG9mZnNldCBjb21tYW5kLCBvZmY9MCAqLworCisgICAgLyogc2V0dXAgTUFDIElNUnMgYW5kIGNsZWFyIHN0YXR1cyByZWdpc3RlcnMgKi8KKyAgICBTZWxlY3RQYWdlKDB4NDApOwkJICAgICAvKiBCaXQgNyAuLi4gYml0IDAgKi8KKyAgICBQdXRCeXRlKFhJUkNSRUc0MF9STUFTSzAsIDB4ZmYpOyAvKiBST0ssIFJBQiwgcnN2LCBSTywgQ1JDLCBBRSwgUFRMLCBNUCAqLworICAgIFB1dEJ5dGUoWElSQ1JFRzQwX1RNQVNLMCwgMHhmZik7IC8qIFRPSywgVEFCLCBTUUUsIExMLCBUVSwgSkFCLCBFWEMsIENSUyAqLworICAgIFB1dEJ5dGUoWElSQ1JFRzQwX1RNQVNLMSwgMHhiMCk7IC8qIHJzdiwgcnN2LCBQVEQsIEVYVCwgcnN2LHJzdixyc3YsIHJzdiovCisgICAgUHV0Qnl0ZShYSVJDUkVHNDBfUlhTVDAsICAweDAwKTsgLyogUk9LLCBSQUIsIFJFTiwgUk8sIENSQywgQUUsIFBUTCwgTVAgKi8KKyAgICBQdXRCeXRlKFhJUkNSRUc0MF9UWFNUMCwgIDB4MDApOyAvKiBUT0ssIFRBQiwgU1FFLCBMTCwgVFUsIEpBQiwgRVhDLCBDUlMgKi8KKyAgICBQdXRCeXRlKFhJUkNSRUc0MF9UWFNUMSwgIDB4MDApOyAvKiBURU4sIHJzdiwgUFRELCBFWFQsIHJldHJ5X2NvdW50ZXI6NCAgKi8KKworICAgIGlmIChmdWxsICYmIGxvY2FsLT5tb2hhd2sgJiYgaW5pdF9taWkoZGV2KSkgeworCWlmIChkZXYtPmlmX3BvcnQgPT0gNCB8fCBsb2NhbC0+ZGluZ28gfHwgbG9jYWwtPm5ld19taWkpIHsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSBzZWxlY3RlZFxuIiwgZGV2LT5uYW1lKTsKKwkgICAgU2VsZWN0UGFnZSgyKTsKKwkgICAgUHV0Qnl0ZShYSVJDUkVHMl9NU1IsIEdldEJ5dGUoWElSQ1JFRzJfTVNSKSB8IDB4MDgpOworCSAgICBtc2xlZXAoMjApOworCX0gZWxzZSB7CisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBNSUkgZGV0ZWN0ZWQ7IHVzaW5nIDEwbWJzXG4iLAorCQkgICBkZXYtPm5hbWUpOworCSAgICBTZWxlY3RQYWdlKDB4NDIpOworCSAgICBpZiAoZGV2LT5pZl9wb3J0ID09IDIpIC8qIGVuYWJsZSAxMEJhc2UyICovCisJCVB1dEJ5dGUoWElSQ1JFRzQyX1NXQzEsIDB4QzApOworCSAgICBlbHNlICAvKiBlbmFibGUgMTBCYXNlVCAqLworCQlQdXRCeXRlKFhJUkNSRUc0Ml9TV0MxLCAweDgwKTsKKwkgICAgbXNsZWVwKDQwKTsJCQkvKiB3YWl0IDQwIG1zZWMgdG8gbGV0IGl0IGNvbXBsZXRlICovCisJfQorCWlmIChmdWxsX2R1cGxleCkKKwkgICAgUHV0Qnl0ZShYSVJDUkVHMV9FQ1IsIEdldEJ5dGUoWElSQ1JFRzFfRUNSIHwgRnVsbER1cGxleCkpOworICAgIH0gZWxzZSB7ICAvKiBObyBNSUkgKi8KKwlTZWxlY3RQYWdlKDApOworCXZhbHVlID0gR2V0Qnl0ZShYSVJDUkVHX0VTUik7CSAvKiByZWFkIHRoZSBFU1IgKi8KKwlkZXYtPmlmX3BvcnQgPSAodmFsdWUgJiBNZWRpYVNlbGVjdCkgPyAxIDogMjsKKyAgICB9CisKKyAgICAvKiBjb25maWd1cmUgdGhlIExFRHMgKi8KKyAgICBTZWxlY3RQYWdlKDIpOworICAgIGlmIChkZXYtPmlmX3BvcnQgPT0gMSB8fCBkZXYtPmlmX3BvcnQgPT0gNCkgLyogVFA6IExpbmsgYW5kIEFjdGl2aXR5ICovCisJUHV0Qnl0ZShYSVJDUkVHMl9MRUQsIDB4M2IpOworICAgIGVsc2UJCQkgICAgICAvKiBDb2F4OiBOb3QtQ29sbGlzaW9uIGFuZCBBY3Rpdml0eSAqLworCVB1dEJ5dGUoWElSQ1JFRzJfTEVELCAweDNhKTsKKworICAgIGlmIChsb2NhbC0+ZGluZ28pCisJUHV0Qnl0ZSgweDBiLCAweDA0KTsgLyogMTAwIE1iaXQgTEVEICovCisKKyAgICAvKiBlbmFibGUgcmVjZWl2ZXIgYW5kIHB1dCB0aGUgbWFjIG9ubGluZSAqLworICAgIGlmIChmdWxsKSB7CisJU2VsZWN0UGFnZSgweDQwKTsKKwlQdXRCeXRlKFhJUkNSRUc0MF9DTUQwLCBFbmFibGVSZWN2IHwgT25saW5lKTsKKyAgICB9CisKKyAgICAvKiBzZXR1cCBFdGhlcm5ldCBJTVIgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovCisgICAgU2VsZWN0UGFnZSgxKTsKKyAgICBQdXRCeXRlKFhJUkNSRUcxX0lNUjAsIDB4ZmYpOworICAgIHVkZWxheSgxKTsKKyAgICBTZWxlY3RQYWdlKDApOworICAgIFB1dEJ5dGUoWElSQ1JFR19DUiwgRW5hYmxlSW50cik7CisgICAgaWYgKGxvY2FsLT5tb2RlbSAmJiAhbG9jYWwtPmRpbmdvKSB7IC8qIGRvIHNvbWUgbWFnaWMgKi8KKwlpZiAoIShHZXRCeXRlKDB4MTApICYgMHgwMSkpCisJICAgIFB1dEJ5dGUoMHgxMCwgMHgxMSk7IC8qIHVubWFzayBtYXN0ZXItaW50IGJpdCAqLworICAgIH0KKworICAgIGlmIChmdWxsKQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBtZWRpYSAlcywgc2lsaWNvbiByZXZpc2lvbiAlZFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBpZl9uYW1lc1tkZXYtPmlmX3BvcnRdLCBsb2NhbC0+c2lsaWNvbik7CisgICAgLyogV2Ugc2hvdWxkIHN3aXRjaCBiYWNrIHRvIHBhZ2UgMCB0byBhdm9pZCBhIGJ1ZyBpbiByZXZpc2lvbiAwCisgICAgICogd2hlcmUgcmVncyB3aXRoIG9mZnNldCBiZWxvdyA4IGNhbid0IGJlIHJlYWQgYWZ0ZXIgYW4gYWNjZXNzCisgICAgICogdG8gdGhlIE1BQyByZWdpc3RlcnMgKi8KKyAgICBTZWxlY3RQYWdlKDApOworfQorCisvKioqKioqKioqKioqKioqKgorICogSW5pdGlhbGl6ZSB0aGUgTWVkaWEtSW5kZXBlbmRlbnQtSW50ZXJmYWNlCisgKiBSZXR1cm5zOiBUcnVlIGlmIHdlIGhhdmUgYSBnb29kIE1JSQorICovCitzdGF0aWMgaW50Citpbml0X21paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGxvY2FsX2luZm9fdCAqbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdW5zaWduZWQgY29udHJvbCwgc3RhdHVzLCBsaW5rcGFydG5lcjsKKyAgICBpbnQgaTsKKworICAgIGlmIChpZl9wb3J0ID09IDQgfHwgaWZfcG9ydCA9PSAxKSB7IC8qIGZvcmNlIDEwMEJhc2VUIG9yIDEwQmFzZVQgKi8KKwlkZXYtPmlmX3BvcnQgPSBpZl9wb3J0OworCWxvY2FsLT5wcm9iZV9wb3J0ID0gMDsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBtaWlfcmQoaW9hZGRyLCAgMCwgMSk7CisgICAgaWYgKChzdGF0dXMgJiAweGZmMDApICE9IDB4NzgwMCkKKwlyZXR1cm4gMDsgLyogTm8gTUlJICovCisKKyAgICBsb2NhbC0+bmV3X21paSA9IChtaWlfcmQoaW9hZGRyLCAwLCAyKSAhPSAweGZmZmYpOworICAgIAorICAgIGlmIChsb2NhbC0+cHJvYmVfcG9ydCkKKwljb250cm9sID0gMHgxMDAwOyAvKiBhdXRvIG5lZyAqLworICAgIGVsc2UgaWYgKGRldi0+aWZfcG9ydCA9PSA0KQorCWNvbnRyb2wgPSAweDIwMDA7IC8qIG5vIGF1dG8gbmVnLCAxMDBtYnMgbW9kZSAqLworICAgIGVsc2UKKwljb250cm9sID0gMHgwMDAwOyAvKiBubyBhdXRvIG5lZywgMTBtYnMgbW9kZSAqLworICAgIG1paV93cihpb2FkZHIsICAwLCAwLCBjb250cm9sLCAxNik7CisgICAgdWRlbGF5KDEwMCk7CisgICAgY29udHJvbCA9IG1paV9yZChpb2FkZHIsIDAsIDApOworCisgICAgaWYgKGNvbnRyb2wgJiAweDA0MDApIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIGNhbid0IHRha2UgUEhZIG91dCBvZiBpc29sYXRpb24gbW9kZVxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKwlsb2NhbC0+cHJvYmVfcG9ydCA9IDA7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGxvY2FsLT5wcm9iZV9wb3J0KSB7CisJLyogYWNjb3JkaW5nIHRvIHRoZSBEUDgzODQwQSBzcGVjcyB0aGUgYXV0byBuZWdvdGlhdGlvbiBwcm9jZXNzCisJICogbWF5IHRha2UgdXAgdG8gMy41IHNlYywgc28gd2UgdXNlIHRoaXMgYWxzbyBmb3Igb3VyIE1MNjY5MgorCSAqIEZpeG1lOiBCZXR0ZXIgdG8gdXNlIGEgdGltZXIgaGVyZSEKKwkgKi8KKwlmb3IgKGk9MDsgaSA8IDM1OyBpKyspIHsKKwkgICAgbXNsZWVwKDEwMCk7CSAvKiB3YWl0IDEwMCBtc2VjICovCisJICAgIHN0YXR1cyA9IG1paV9yZChpb2FkZHIsICAwLCAxKTsKKwkgICAgaWYgKChzdGF0dXMgJiAweDAwMjApICYmIChzdGF0dXMgJiAweDAwMDQpKQorCQlicmVhazsKKwl9CisKKwlpZiAoIShzdGF0dXMgJiAweDAwMjApKSB7CisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBhdXRvbmVnb3RpYXRpb24gZmFpbGVkOyIKKwkJICAgIiB1c2luZyAxMG1ic1xuIiwgZGV2LT5uYW1lKTsKKwkgICAgaWYgKCFsb2NhbC0+bmV3X21paSkgeworCQljb250cm9sID0gMHgwMDAwOworCQltaWlfd3IoaW9hZGRyLCAgMCwgMCwgY29udHJvbCwgMTYpOworCQl1ZGVsYXkoMTAwKTsKKwkJU2VsZWN0UGFnZSgwKTsKKwkJZGV2LT5pZl9wb3J0ID0gKEdldEJ5dGUoWElSQ1JFR19FU1IpICYgTWVkaWFTZWxlY3QpID8gMSA6IDI7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBsaW5rcGFydG5lciA9IG1paV9yZChpb2FkZHIsIDAsIDUpOworCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogTUlJIGxpbmsgcGFydG5lcjogJTA0eFxuIiwKKwkJICAgZGV2LT5uYW1lLCBsaW5rcGFydG5lcik7CisJICAgIGlmIChsaW5rcGFydG5lciAmIDB4MDA4MCkgeworCQlkZXYtPmlmX3BvcnQgPSA0OworCSAgICB9IGVsc2UKKwkJZGV2LT5pZl9wb3J0ID0gMTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitkb19wb3dlcmRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBERUJVRygwLCAiZG9fcG93ZXJkb3duKCVwKVxuIiwgZGV2KTsKKworICAgIFNlbGVjdFBhZ2UoNCk7CisgICAgUHV0Qnl0ZShYSVJDUkVHNF9HUFIxLCAwKTsJICAgICAvKiBjbGVhciBiaXQgMDogcG93ZXIgZG93biAqLworICAgIFNlbGVjdFBhZ2UoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2RvX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisKKyAgICBERUJVRygwLCAiZG9fc3RvcCglcClcbiIsIGRldik7CisKKyAgICBpZiAoIWxpbmspCisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICBTZWxlY3RQYWdlKDApOworICAgIFB1dEJ5dGUoWElSQ1JFR19DUiwgMCk7ICAvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICBTZWxlY3RQYWdlKDB4MDEpOworICAgIFB1dEJ5dGUoWElSQ1JFRzFfSU1SMCwgMHgwMCk7IC8qIGZvcmJpZCBhbGwgaW50cyAqLworICAgIFNlbGVjdFBhZ2UoNCk7CisgICAgUHV0Qnl0ZShYSVJDUkVHNF9HUFIxLCAwKTsJLyogY2xlYXIgYml0IDA6IHBvd2VyIGRvd24gKi8KKyAgICBTZWxlY3RQYWdlKDApOworCisgICAgbGluay0+b3Blbi0tOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgeGlyYzJwc19jc19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJ4aXJjMnBzX2NzIiwKKwl9LAorCS5hdHRhY2gJCT0geGlyYzJwc19hdHRhY2gsCisJLmRldGFjaAkJPSB4aXJjMnBzX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0Citpbml0X3hpcmMycHNfY3Modm9pZCkKK3sKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmeGlyYzJwc19jc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4aXRfeGlyYzJwc19jcyh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmeGlyYzJwc19jc19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF94aXJjMnBzX2NzKTsKK21vZHVsZV9leGl0KGV4aXRfeGlyYzJwc19jcyk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF94aXJjMnBzX2NzKGNoYXIgKnN0cikKK3sKKwkvKiBpZl9wb3J0LCBmdWxsX2R1cGxleCwgZG9fc291bmQsIGxvY2t1cF9oYWNrCisJICovCisJaW50IGludHNbMTBdID0geyAtMSB9OworCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCA5LCBpbnRzKTsKKworI2RlZmluZSBNQVlCRV9TRVQoWCxZKSBpZiAoaW50c1swXSA+PSBZICYmIGludHNbWV0gIT0gLTEpIHsgWCA9IGludHNbWV07IH0KKwlNQVlCRV9TRVQoaWZfcG9ydCwgMyk7CisJTUFZQkVfU0VUKGZ1bGxfZHVwbGV4LCA0KTsKKwlNQVlCRV9TRVQoZG9fc291bmQsIDUpOworCU1BWUJFX1NFVChsb2NrdXBfaGFjaywgNik7CisjdW5kZWYgIE1BWUJFX1NFVAorCisJcmV0dXJuIDA7Cit9CisKK19fc2V0dXAoInhpcmMycHNfY3M9Iiwgc2V0dXBfeGlyYzJwc19jcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbmV0MzIuYyBiL2RyaXZlcnMvbmV0L3BjbmV0MzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzk0N2U2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNuZXQzMi5jCkBAIC0wLDAgKzEsMjM1OCBAQAorLyogcGNuZXQzMi5jOiBBbiBBTUQgUENuZXQzMiBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKyAqCUNvcHlyaWdodCAxOTk2LTE5OTkgVGhvbWFzIEJvZ2VuZG9lcmZlcgorICoKKyAqCURlcml2ZWQgZnJvbSB0aGUgbGFuY2UgZHJpdmVyIHdyaXR0ZW4gMTk5MywxOTk0LDE5OTUgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKglDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKglEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorICoKKyAqCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICoJVGhpcyBkcml2ZXIgaXMgZm9yIFBDbmV0MzIgYW5kIFBDbmV0UENJIGJhc2VkIGV0aGVyY2FyZHMKKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgMjMgT2N0LCAyMDAwLgorICogIEZpeGVkIGEgZmV3IGJ1Z3MsIHJlbGF0ZWQgdG8gcnVubmluZyB0aGUgY29udHJvbGxlciBpbiAzMmJpdCBtb2RlLgorICoKKyAqICBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRFJWX05BTUUJInBjbmV0MzIiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjMwaSIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIjA2LjI4LjIwMDQiCisjZGVmaW5lIFBGWAkJRFJWX05BTUUgIjogIgorCitzdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbiA9CitEUlZfTkFNRSAiLmM6diIgRFJWX1ZFUlNJT04gIiAiIERSVl9SRUxEQVRFICIgdHNib2dlbmRAYWxwaGEuZnJhbmtlbi5kZVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisvKgorICogUENJIGRldmljZSBpZGVudGlmaWVycyBmb3IgIm5ldyBzdHlsZSIgTGludXggUENJIERldmljZSBEcml2ZXJzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY25ldDMyX3BjaV90YmxbXSA9IHsKKyAgICB7IFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9MQU5DRV9IT01FLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisgICAgeyBQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfTEFOQ0UsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKyAgICAvKgorICAgICAqIEFkYXB0ZXJzIHRoYXQgd2VyZSBzb2xkIHdpdGggSUJNJ3MgUlMvNjAwMCBvciBwU2VyaWVzIGhhcmR3YXJlIGhhdmUKKyAgICAgKiB0aGUgaW5jb3JyZWN0IHZlbmRvciBpZC4KKyAgICAgKi8KKyAgICB7IFBDSV9WRU5ET1JfSURfVFJJREVOVCwgUENJX0RFVklDRV9JRF9BTURfTEFOQ0UsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJICAgIFBDSV9DTEFTU19ORVRXT1JLX0VUSEVSTkVUIDw8IDgsIDB4ZmZmZjAwLCAwIH0sCisgICAgeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIHBjbmV0MzJfcGNpX3RibCk7CisKK3N0YXRpYyBpbnQgY2FyZHNfZm91bmQ7CisKKy8qCisgKiBWTEIgSS9PIGFkZHJlc3NlcworICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBjbmV0MzJfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0KKwl7IDB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MzYwLCAwIH07CisKKworCitzdGF0aWMgaW50IHBjbmV0MzJfZGVidWcgPSAwOworc3RhdGljIGludCB0eF9zdGFydCA9IDE7IC8qIE1hcHBpbmcgLS0gMDoyMCwgMTo2NCwgMjoxMjgsIDM6fjIyMCAoZGVwZW5kcyBvbiBjaGlwIHZlcnMpICovCitzdGF0aWMgaW50IHBjbmV0MzJ2bGI7CSAvKiBjaGVjayBmb3IgVkxCIGNhcmRzID8gKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpwY25ldDMyX2RldjsKKworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyOworc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAyMDA7CisKKyNkZWZpbmUgUENORVQzMl9QT1JUX0FVSSAgICAgIDB4MDAKKyNkZWZpbmUgUENORVQzMl9QT1JUXzEwQlQgICAgIDB4MDEKKyNkZWZpbmUgUENORVQzMl9QT1JUX0dQU0kgICAgIDB4MDIKKyNkZWZpbmUgUENORVQzMl9QT1JUX01JSSAgICAgIDB4MDMKKworI2RlZmluZSBQQ05FVDMyX1BPUlRfUE9SVFNFTCAgMHgwMworI2RlZmluZSBQQ05FVDMyX1BPUlRfQVNFTCAgICAgMHgwNAorI2RlZmluZSBQQ05FVDMyX1BPUlRfMTAwICAgICAgMHg0MAorI2RlZmluZSBQQ05FVDMyX1BPUlRfRkQJICAgICAgMHg4MAorCisjZGVmaW5lIFBDTkVUMzJfRE1BX01BU0sgMHhmZmZmZmZmZgorCisjZGVmaW5lIFBDTkVUMzJfV0FUQ0hET0dfVElNRU9VVCAoamlmZmllcyArICgyICogSFopKQorI2RlZmluZSBQQ05FVDMyX0JMSU5LX1RJTUVPVVQJKGppZmZpZXMgKyAoSFovNCkpCisKKy8qCisgKiB0YWJsZSB0byB0cmFuc2xhdGUgb3B0aW9uIHZhbHVlcyBmcm9tIHR1bGlwCisgKiB0byBpbnRlcm5hbCBvcHRpb25zCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG9wdGlvbnNfbWFwcGluZ1tdID0geworICAgIFBDTkVUMzJfUE9SVF9BU0VMLAkJCSAgIC8qICAwIEF1dG8tc2VsZWN0CSAgKi8KKyAgICBQQ05FVDMyX1BPUlRfQVVJLAkJCSAgIC8qICAxIEJOQy9BVUkJICAqLworICAgIFBDTkVUMzJfUE9SVF9BVUksCQkJICAgLyogIDIgQVVJL0JOQwkgICovCisgICAgUENORVQzMl9QT1JUX0FTRUwsCQkJICAgLyogIDMgbm90IHN1cHBvcnRlZAkgICovCisgICAgUENORVQzMl9QT1JUXzEwQlQgfCBQQ05FVDMyX1BPUlRfRkQsICAgLyogIDQgMTBiYXNlVC1GRAkgICovCisgICAgUENORVQzMl9QT1JUX0FTRUwsCQkJICAgLyogIDUgbm90IHN1cHBvcnRlZAkgICovCisgICAgUENORVQzMl9QT1JUX0FTRUwsCQkJICAgLyogIDYgbm90IHN1cHBvcnRlZAkgICovCisgICAgUENORVQzMl9QT1JUX0FTRUwsCQkJICAgLyogIDcgbm90IHN1cHBvcnRlZAkgICovCisgICAgUENORVQzMl9QT1JUX0FTRUwsCQkJICAgLyogIDggbm90IHN1cHBvcnRlZAkgICovCisgICAgUENORVQzMl9QT1JUX01JSSwJCQkgICAvKiAgOSBNSUkgMTBiYXNlVAkgICovCisgICAgUENORVQzMl9QT1JUX01JSSB8IFBDTkVUMzJfUE9SVF9GRCwJICAgLyogMTAgTUlJIDEwYmFzZVQtRkQJICAqLworICAgIFBDTkVUMzJfUE9SVF9NSUksCQkJICAgLyogMTEgTUlJIChhdXRvc2VsKQkgICovCisgICAgUENORVQzMl9QT1JUXzEwQlQsCQkJICAgLyogMTIgMTBCYXNlVAkgICovCisgICAgUENORVQzMl9QT1JUX01JSSB8IFBDTkVUMzJfUE9SVF8xMDAsICAgLyogMTMgTUlJIDEwMEJhc2VUeAkgICovCisgICAgUENORVQzMl9QT1JUX01JSSB8IFBDTkVUMzJfUE9SVF8xMDAgfCBQQ05FVDMyX1BPUlRfRkQsIC8qIDE0IE1JSSAxMDBCYXNlVHgtRkQgKi8KKyAgICBQQ05FVDMyX1BPUlRfQVNFTAkJCSAgIC8qIDE1IG5vdCBzdXBwb3J0ZWQJICAqLworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgcGNuZXQzMl9nc3RyaW5nc190ZXN0W11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKyAgICAiTG9vcGJhY2sgdGVzdCAgKG9mZmxpbmUpIgorfTsKKyNkZWZpbmUgUENORVQzMl9URVNUX0xFTiAoc2l6ZW9mKHBjbmV0MzJfZ3N0cmluZ3NfdGVzdCkgLyBFVEhfR1NUUklOR19MRU4pCisKKyNkZWZpbmUgUENORVQzMl9OVU1fUkVHUyAxNjgKKworI2RlZmluZSBNQVhfVU5JVFMgOAkvKiBNb3JlIGFyZSBzdXBwb3J0ZWQsIGxpbWl0IG9ubHkgb24gb3B0aW9ucyAqLworc3RhdGljIGludCBvcHRpb25zW01BWF9VTklUU107CitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4W01BWF9VTklUU107CitzdGF0aWMgaW50IGhvbWVwbmFbTUFYX1VOSVRTXTsKKworLyoKKyAqCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKyAqCisgKiBUaGlzIGRyaXZlciB1c2VzIHRoZSBzYW1lIHNvZnR3YXJlIHN0cnVjdHVyZSBhcyB0aGUgbm9ybWFsIGxhbmNlCisgKiBkcml2ZXIuIFNvIGxvb2sgZm9yIGEgdmVyYm9zZSBkZXNjcmlwdGlvbiBpbiBsYW5jZS5jLiBUaGUgZGlmZmVyZW5jZXMKKyAqIHRvIHRoZSBub3JtYWwgbGFuY2UgZHJpdmVyIGlzIHRoZSB1c2Ugb2YgdGhlIDMyYml0IG1vZGUgb2YgUENuZXQzMgorICogYW5kIFBDbmV0UENJIGNoaXBzLiBCZWNhdXNlIHRoZXNlIGNoaXBzIGFyZSAzMmJpdCBjaGlwcywgdGhlcmUgaXMgbm8KKyAqIDE2TUIgbGltaXRhdGlvbiBhbmQgd2UgZG9uJ3QgbmVlZCBib3VuY2UgYnVmZmVycy4KKyAqLworCisvKgorICogSGlzdG9yeToKKyAqIHYwLjAxOiAgSW5pdGlhbCB2ZXJzaW9uCisgKgkgICBvbmx5IHRlc3RlZCBvbiBBbHBoYSBOb25hbWUgQm9hcmQKKyAqIHYwLjAyOiAgY2hhbmdlZCBJUlEgaGFuZGxpbmcgZm9yIG5ldyBpbnRlcnJ1cHQgc2NoZW1lIChkZXZfaWQpCisgKgkgICB0ZXN0ZWQgb24gYSBBU1VTIFNQM0cKKyAqIHYwLjEwOiAgZml4ZWQgYW4gb2RkIHByb2JsZW0gd2l0aCB0aGUgNzlDOTc0IGluIGEgQ29tcGFxIERlc2twcm8gWEwKKyAqCSAgIGxvb2tzIGxpa2UgdGhlIDk3NCBkb2Vzbid0IGxpa2Ugc3RvcHBpbmcgYW5kIHJlc3RhcnRpbmcgaW4gYQorICoJICAgc2hvcnQgcGVyaW9kIG9mIHRpbWU7IG5vdyB3ZSBkbyBhIHJlaW5pdCBvZiB0aGUgbGFuY2U7IHRoZQorICoJICAgYnVnIHdhcyB0cmlnZ2VyZWQgYnkgZG9pbmcgaWZjb25maWcgZXRoMCA8aXA+IGJyb2FkY2FzdCA8YWRkcj4KKyAqCSAgIGFuZCBoYW5ncyB0aGUgbWFjaGluZSAodGhhbmtzIHRvIEtsYXVzIExpZWRsIGZvciBkZWJ1Z2dpbmcpCisgKiB2MC4xMjogIGJ5IHN1Z2dlc3Rpb24gZnJvbSBEb25hbGQgQmVja2VyOiBSZW5hbWVkIGRyaXZlciB0byBwY25ldDMyLAorICoJICAgbWFkZSBpdCBzdGFuZGFsb25lIChubyBuZWVkIGZvciBsYW5jZS5jKQorICogdjAuMTM6ICBhZGRlZCBhZGRpdGlvbmFsIFBDSSBkZXRlY3RpbmcgZm9yIHNwZWNpYWwgUENJIGRldmljZXMgKENvbXBhcSkKKyAqIHYwLjE0OiAgc3RyaXBwZWQgZG93biBhZGRpdGlvbmFsIFBDSSBwcm9iZSAodGhhbmtzIHRvIERhdmlkIEMgTmllbWkKKyAqCSAgIGFuZCBzdmVuZXJpY0B4czRhbGwubmwgZm9yIHRlc3RpbmcgdGhpcyBvbiB0aGVpciBDb21wYXEgYm94ZXMpCisgKiB2MC4xNTogIGFkZGVkIDc5Qzk2NSAoVkxCKSBwcm9iZQorICoJICAgYWRkZWQgaW50ZXJydXB0IHNoYXJpbmcgZm9yIFBDSSBjaGlwcworICogdjAuMTY6ICBmaXhlZCBzZXRfbXVsdGljYXN0X2xpc3Qgb24gQWxwaGEgbWFjaGluZXMKKyAqIHYwLjE3OiAgcmVtb3ZlZCBoYWNrIGZyb20gZGV2LmM7IG5vdyBwY25ldDMyIHVzZXMgZXRoaWZfcHJvYmUgaW4gU3BhY2UuYworICogdjAuMTk6ICBjaGFuZ2VkIHNldHRpbmcgb2YgYXV0b3NlbGVjdCBiaXQKKyAqIHYwLjIwOiAgcmVtb3ZlZCBhZGRpdGlvbmFsIENvbXBhcSBQQ0kgcHJvYmU7IHRoZXJlIGlzIG5vdyBhIHdvcmtpbmcgb25lCisgKgkgICBpbiBhcmNoL2kzODYvYmlvczMyLmMKKyAqIHYwLjIxOiAgYWRkZWQgZW5kaWFuIGNvbnZlcnNpb24gZm9yIHBwYywgZnJvbSB3b3JrIGJ5IGNvcnRAY3Mubm10LmVkdQorICogdjAuMjI6ICBhZGRlZCBwcmludGluZyBvZiBzdGF0dXMgdG8gcmluZyBkdW1wCisgKiB2MC4yMzogIGNoYW5nZWQgZW5ldF9zdGF0aXN0aWNzIHRvIG5ldF9kZXZpdmVfc3RhdHMKKyAqIHYwLjkwOiAgYWRkZWQgbXVsdGljYXN0IGZpbHRlcgorICoJICAgYWRkZWQgbW9kdWxlIHN1cHBvcnQKKyAqCSAgIGNoYW5nZWQgaXJxIHByb2JlIHRvIG5ldyBzdHlsZQorICoJICAgYWRkZWQgUENuZXRGYXN0IGNoaXAgaWQKKyAqCSAgIGFkZGVkIGZpeCBmb3IgcmVjZWl2ZSBzdGFsbHMgd2l0aCBJbnRlbCBzYXR1cm4gY2hpcHNldHMKKyAqCSAgIGFkZGVkIGluLXBsYWNlIHJ4IHNrYnMgbGlrZSBpbiB0aGUgdHVsaXAgZHJpdmVyCisgKgkgICBtaW5vciBjbGVhbnVwcworICogdjAuOTE6ICBhZGRlZCBQQ25ldEZhc3QrIGNoaXAgaWQKKyAqCSAgIGJhY2sgcG9ydCB0byAyLjAueAorICogdjEuMDA6ICBhZGRlZCBzb21lIHN0dWZmIGZyb20gRG9uYWxkIEJlY2tlcidzIDIuMC4zNCB2ZXJzaW9uCisgKgkgICBhZGRlZCBzdXBwb3J0IGZvciBieXRlIGNvdW50ZXJzIGluIG5ldF9kZXZfc3RhdHMKKyAqIHYxLjAxOiAgZG8gcmluZyBkdW1wcywgb25seSB3aGVuIGRlYnVnZ2luZyB0aGUgZHJpdmVyCisgKgkgICBpbmNyZWFzZWQgdGhlIHRyYW5zbWl0IHRpbWVvdXQKKyAqIHYxLjAyOiAgZml4ZWQgbWVtb3J5IGxlYWsgaW4gcGNuZXQzMl9pbml0X3JpbmcoKQorICogdjEuMTA6ICB3b3JrYXJvdW5kIGZvciBzdG9wcGVkIHRyYW5zbWl0dGVyCisgKgkgICBhZGRlZCBwb3J0IHNlbGVjdGlvbiBmb3IgbW9kdWxlcworICoJICAgZGV0ZWN0IHNwZWNpYWwgVDEvRTEgV0FOIGNhcmQgYW5kIHNldHVwIHBvcnQgc2VsZWN0aW9uCisgKiB2MS4xMTogIGZpeGVkIHdyb25nIGNoZWNraW5nIG9mIFR4IGVycm9ycworICogdjEuMjA6ICBhZGRlZCBjaGVjayBvZiByZXR1cm4gdmFsdWUga21hbGxvYyAoY3BldGVyc29AY3Mud2FzaGluZ3Rvbi5lZHUpCisgKgkgICBhZGRlZCBzYXZlIG9yaWdpbmFsIGttYWxsb2MgYWRkciBmb3IgZnJlZWluZyAobWNyQHNvbGlkdW0uY29tKQorICoJICAgYWRkZWQgc3VwcG9ydCBmb3IgUENuZXRIb21lIGNoaXAgKGpvZUBNSVQuRURVKQorICoJICAgcmV3cml0dGVuIFBDSSBjYXJkIGRldGVjdGlvbgorICoJICAgYWRkZWQgZHdpbyBtb2RlIHRvIGdldCBkcml2ZXIgd29ya2luZyBvbiBzb21lIFBQQyBtYWNoaW5lcworICogdjEuMjE6ICBhZGRlZCBtaWkgc2VsZWN0aW9uIGFuZCBtaWkgaW9jdGwKKyAqIHYxLjIyOiAgY2hhbmdlZCBwY2kgc2Nhbm5pbmcgY29kZSB0byBtYWtlIFBQQyBwZW9wbGUgaGFwcHkKKyAqCSAgIGZpeGVkIHN3aXRjaGluZyB0byAzMmJpdCBtb2RlIGluIHBjbmV0MzJfb3BlbigpICh0aGFua3MKKyAqCSAgIHRvIE1pY2hhZWwgUmljaGFyZCA8bWNyQHNvbGlkdW0uY29tPiBmb3Igbm90aWNpbmcgdGhpcyBvbmUpCisgKgkgICBhZGRlZCBzdWIgdmVuZG9yL2RldmljZSBpZCBtYXRjaGluZyAodGhhbmtzIGFnYWluIHRvCisgKgkgICBNaWNoYWVsIFJpY2hhcmQgPG1jckBzb2xpZHVtLmNvbT4pCisgKgkgICBhZGRlZCBjaGlwIGlkIGZvciA3OWM5NzMvOTc1ICh0aGFua3MgdG8gWmFjaCBCcm93biA8emFiQHphYmJvLm5ldD4pCisgKiB2MS4yMyAgIGZpeGVkIHNtYWxsIGJ1Zywgd2hlbiBtYW51YWwgc2VsZWN0aW5nIE1JSSBzcGVlZC9kdXBsZXgKKyAqIHYxLjI0ICAgQXBwbGllZCBUaG9tYXMnIHBhdGNoIHRvIHVzZSBUeFN0YXJ0UG9pbnQgYW5kIHRodXMgZGVjcmVhc2UgVHhGSUZPCisgKgkgICB1bmRlcmZsb3dzLglBZGRlZCB0eF9zdGFydF9wdCBtb2R1bGUgcGFyYW1ldGVyLiBJbmNyZWFzZWQKKyAqCSAgIFRYX1JJTkdfU0laRSBmcm9tIDE2IHRvIDMyLglBZGRlZCAjaWZkZWYnZCBjb2RlIHRvIHVzZSBEWFNVRkxPCisgKgkgICBmb3IgRkFTVFsrXSBjaGlwc2V0cy4gPGthZkBmYy5ocC5jb20+CisgKiB2MS4yNGFjIEFkZGVkIFNNUCBzcGlubG9ja2luZyAtIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKiB2MS4yNWtmIEFkZGVkIE5vIEludGVycnVwdCBvbiBzdWNjZXNzZnVsIFR4IGZvciBzb21lIFR4J3MgPGthZkBmYy5ocC5jb20+CisgKiB2MS4yNiAgIENvbnZlcnRlZCB0byBwY2lfYWxsb2NfY29uc2lzdGVudCwgSmFtZXkgSGlja3MgLyBHZW9yZ2UgRnJhbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amFtZXlAY3JsLmRlYy5jb20+CisgKiAtCSAgIEZpeGVkIGEgZmV3IGJ1Z3MsIHJlbGF0ZWQgdG8gcnVubmluZyB0aGUgY29udHJvbGxlciBpbiAzMmJpdCBtb2RlLgorICoJICAgMjMgT2N0LCAyMDAwLiAgQ2Fyc3RlbiBMYW5nZ2FhcmQsIGNhcnN0ZW5sQG1pcHMuY29tCisgKgkgICBDb3B5cmlnaHQgKEMpIDIwMDAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiB2MS4yNnAgIEZpeCBvb3BzIG9uIHJtbW9kK2luc21vZDsgcGx1ZyBpL28gcmVzb3VyY2UgbGVhayAtIFBhdWwgR29ydG1ha2VyCisgKiB2MS4yNyAgIGltcHJvdmVkIENTUi9QUk9NIGFkZHJlc3MgZGV0ZWN0aW9uLCBsb3RzIG9mIGNsZWFudXBzLAorICogCSAgIG5ldyBwY25ldDMydmxiIG1vZHVsZSBvcHRpb24sIEhQLVBBUklTQyBzdXBwb3J0LAorICogCSAgIGFkZGVkIG1vZHVsZSBwYXJhbWV0ZXIgZGVzY3JpcHRpb25zLAorICogCSAgIGluaXRpYWwgZXRodG9vbCBzdXBwb3J0IC0gSGVsZ2UgRGVsbGVyIDxkZWxsZXJAZ214LmRlPgorICogdjEuMjdhICBTdW4gRmViIDEwIDIwMDIgR28gVGFuaWd1Y2hpIDxnb0B0dXJib2xpbnV4LmNvLmpwPgorICoJICAgdXNlIGFsbG9jX2V0aGVyZGV2IGFuZCByZWdpc3Rlcl9uZXRkZXYKKyAqCSAgIGZpeCBwY2kgcHJvYmUgbm90IGluY3JlbWVudCBjYXJkc19mb3VuZAorICoJICAgRkQgYXV0byBuZWdvdGlhdGUgZXJyb3Igd29ya2Fyb3VuZCBmb3IgeFNlcmllczI1MAorICoJICAgY2xlYW4gdXAgYW5kIHVzaW5nIG5ldyBtaWkgbW9kdWxlCisgKiB2MS4yN2IgIFNlcCAzMCAyMDAyIEtlbnQgWW9kZXIgPHlvZGVyMUB1cy5pYm0uY29tPgorICogCSAgIEFkZGVkIHRpbWVyIGZvciBjYWJsZSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZXMuCisgKiB2MS4yOCAgIDIwIEZlYiAyMDA0IERvbiBGcnkgPGJyYXppbG51dEB1cy5pYm0uY29tPgorICoJICAgSm9uIE1hc29uIDxqb25tYXNvbkB1cy5pYm0uY29tPiwgQ2hpbm1heSBBbGJhbCA8YWxiYWxAaW4uaWJtLmNvbT4KKyAqCSAgIE5vdyB1c2VzIGV0aHRvb2xfb3BzLCBuZXRpZl9tc2dfKiBhbmQgZ2VuZXJpY19taWlfaW9jdGwuCisgKgkgICBGaXhlcyBib2d1cyAnQnVzIG1hc3RlciBhcmJpdHJhdGlvbiBmYWlsdXJlJywgcGNpX1t1bl1tYXBfc2luZ2xlCisgKgkgICBsZW5ndGggZXJyb3JzLCBhbmQgdHJhbnNtaXQgaGFuZ3MuICBDbGVhbnMgdXAgYWZ0ZXIgZXJyb3JzIGluIG9wZW4uCisgKgkgICBKaW0gTGV3aXMgPGprbGV3aXNAdXMuaWJtLmNvbT4gYWRkZWQgZXRoZXJuZXQgbG9vcGJhY2sgdGVzdC4KKyAqCSAgIFRob21hcyBNdW5jayBTdGVlbmhvbGR0IDx0bXVzQHRtdXMuZGs+IG5vbi1taWkgaW9jdGwgY29ycmVjdGlvbnMuCisgKiB2MS4yOSAgIDYgQXByIDIwMDQgSmltIExld2lzIDxqa2xld2lzQHVzLmlibS5jb20+IGFkZGVkIHBoeXNpY2FsCisgKgkgICBpZGVudGlmaWNhdGlvbiBjb2RlIChibGluayBsZWQncykgYW5kIHJlZ2lzdGVyIGR1bXAuCisgKgkgICBEb24gRnJ5IGFkZGVkIHRpbWVyIGZvciA5NzEvOTcyIHNvIHNrYnVmcyBkb24ndCByZW1haW4gb24gdHggcmluZworICoJICAgZm9yZXZlci4KKyAqIHYxLjMwICAgMTggTWF5IDIwMDQgRG9uIEZyeSByZW1vdmVkIHRpbWVyIGFuZCBMYXN0IFRyYW5zbWl0IEludGVycnVwdAorICoJICAgKGx0aW50KSBhcyB0aGV5IGFkZGVkIGNvbXBsZXhpdHkgYW5kIGRpZG4ndCBnaXZlIGdvb2QgdGhyb3VnaHB1dC4KKyAqIHYxLjMwYSAgMjIgTWF5IDIwMDQgRG9uIEZyeSBsaW1pdCBmcmFtZXMgcmVjZWl2ZWQgZHVyaW5nIGludGVycnVwdC4KKyAqIHYxLjMwYiAgMjQgTWF5IDIwMDQgRG9uIEZyeSBmaXggYm9ndXMgdHggY2FycmllciBlcnJvcnMgd2l0aCA3OWM5NzMsCisgKgkgICBhc3Npc3RlZCBieSBCcnVjZSBQZW5yb2QgPGJtcGVucm9kQGVuZHJ1bnRlY2hub2xvZ2llcy5jb20+LgorICogdjEuMzBjICAyNSBNYXkgMjAwNCBEb24gRnJ5IGFkZGVkIG5ldGlmX3dha2VfcXVldWUgYWZ0ZXIgcGNuZXQzMl9yZXN0YXJ0LgorICogdjEuMzBkICAwMSBKdW4gMjAwNCBEb24gRnJ5IGRpc2NhcmQgb3ZlcnNpemUgcnggcGFja2V0cy4KKyAqIHYxLjMwZSAgMTEgSnVuIDIwMDQgRG9uIEZyeSByZWNvdmVyIGFmdGVyIGZpZm8gZXJyb3IgYW5kIHJ4IGhhbmcuCisgKiB2MS4zMGYgIDE2IEp1biAyMDA0IERvbiBGcnkgY2xlYW51cCBJUlEgdG8gYWxsb3cgMCBhbmQgMSBmb3IgUENJLAorICogCSAgIGV4cGFuZGluZyBvbiBzdWdnZXN0aW9ucyBmcm9tIFJhbGYgQmFlY2hsZSA8cmFsZkBsaW51eC1taXBzLm9yZz4sCisgKiAJICAgYW5kIEJyaWFuIE11cnBoeSA8YnJpYW5AbXVycGh5LmRrPi4KKyAqIHYxLjMwZyAgMjIgSnVuIDIwMDQgUGF0cmljayBTaW1tb25zIDxwc2ltbW9uc0BmbGFzaC5uZXQ+IGFkZGVkIG9wdGlvbgorICoJICAgaG9tZXBuYSBmb3Igc2VsZWN0aW5nIEhvbWVQTkEgbW9kZSBmb3IgUENOZXQvSG9tZSA3OUM5NzguCisgKiB2MS4zMGggIDI0IEp1biAyMDA0IERvbiBGcnkgY29ycmVjdGx5IHNlbGVjdCBhdXRvLCBzcGVlZCwgZHVwbGV4IGluIGJjcjMyLgorICogdjEuMzBpICAyOCBKdW4gMjAwNCBEb24gRnJ5IGNoYW5nZSB0byB1c2UgbW9kdWxlX3BhcmFtLgorICovCisKKworLyoKKyAqIFNldCB0aGUgbnVtYmVyIG9mIFR4IGFuZCBSeCBidWZmZXJzLCB1c2luZyBMb2dfMigjIGJ1ZmZlcnMpLgorICogUmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcyBhcmUgNCBUeCBidWZmZXJzLCBhbmQgMTYgUnggYnVmZmVycy4KKyAqIFRoYXQgdHJhbnNsYXRlcyB0byAyICg0ID09IDJeXjIpIGFuZCA0ICgxNiA9PSAyXl40KS4KKyAqLworI2lmbmRlZiBQQ05FVDMyX0xPR19UWF9CVUZGRVJTCisjZGVmaW5lIFBDTkVUMzJfTE9HX1RYX0JVRkZFUlMgNAorI2RlZmluZSBQQ05FVDMyX0xPR19SWF9CVUZGRVJTIDUKKyNlbmRpZgorCisjZGVmaW5lIFRYX1JJTkdfU0laRQkJKDEgPDwgKFBDTkVUMzJfTE9HX1RYX0JVRkZFUlMpKQorI2RlZmluZSBUWF9SSU5HX01PRF9NQVNLCShUWF9SSU5HX1NJWkUgLSAxKQorI2RlZmluZSBUWF9SSU5HX0xFTl9CSVRTCSgoUENORVQzMl9MT0dfVFhfQlVGRkVSUykgPDwgMTIpCisKKyNkZWZpbmUgUlhfUklOR19TSVpFCQkoMSA8PCAoUENORVQzMl9MT0dfUlhfQlVGRkVSUykpCisjZGVmaW5lIFJYX1JJTkdfTU9EX01BU0sJKFJYX1JJTkdfU0laRSAtIDEpCisjZGVmaW5lIFJYX1JJTkdfTEVOX0JJVFMJKChQQ05FVDMyX0xPR19SWF9CVUZGRVJTKSA8PCA0KQorCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1NDQKKworLyogT2Zmc2V0cyBmcm9tIGJhc2UgSS9PIGFkZHJlc3MuICovCisjZGVmaW5lIFBDTkVUMzJfV0lPX1JEUAkJMHgxMAorI2RlZmluZSBQQ05FVDMyX1dJT19SQVAJCTB4MTIKKyNkZWZpbmUgUENORVQzMl9XSU9fUkVTRVQJMHgxNAorI2RlZmluZSBQQ05FVDMyX1dJT19CRFAJCTB4MTYKKworI2RlZmluZSBQQ05FVDMyX0RXSU9fUkRQCTB4MTAKKyNkZWZpbmUgUENORVQzMl9EV0lPX1JBUAkweDE0CisjZGVmaW5lIFBDTkVUMzJfRFdJT19SRVNFVAkweDE4CisjZGVmaW5lIFBDTkVUMzJfRFdJT19CRFAJMHgxQworCisjZGVmaW5lIFBDTkVUMzJfVE9UQUxfU0laRQkweDIwCisKKy8qIFRoZSBQQ05FVDMyIFJ4IGFuZCBUeCByaW5nIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IHBjbmV0MzJfcnhfaGVhZCB7CisgICAgdTMyIGJhc2U7CisgICAgczE2IGJ1Zl9sZW5ndGg7CisgICAgczE2IHN0YXR1czsKKyAgICB1MzIgbXNnX2xlbmd0aDsKKyAgICB1MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgcGNuZXQzMl90eF9oZWFkIHsKKyAgICB1MzIgYmFzZTsKKyAgICBzMTYgbGVuZ3RoOworICAgIHMxNiBzdGF0dXM7CisgICAgdTMyIG1pc2M7CisgICAgdTMyIHJlc2VydmVkOworfTsKKworLyogVGhlIFBDTkVUMzIgMzItQml0IGluaXRpYWxpemF0aW9uIGJsb2NrLCBkZXNjcmliZWQgaW4gZGF0YWJvb2suICovCitzdHJ1Y3QgcGNuZXQzMl9pbml0X2Jsb2NrIHsKKyAgICB1MTYgbW9kZTsKKyAgICB1MTYgdGxlbl9ybGVuOworICAgIHU4CXBoeXNfYWRkcls2XTsKKyAgICB1MTYgcmVzZXJ2ZWQ7CisgICAgdTMyIGZpbHRlclsyXTsKKyAgICAvKiBSZWNlaXZlIGFuZCB0cmFuc21pdCByaW5nIGJhc2UsIGFsb25nIHdpdGggZXh0cmEgYml0cy4gKi8KKyAgICB1MzIgcnhfcmluZzsKKyAgICB1MzIgdHhfcmluZzsKK307CisKKy8qIFBDbmV0MzIgYWNjZXNzIGZ1bmN0aW9ucyAqLworc3RydWN0IHBjbmV0MzJfYWNjZXNzIHsKKyAgICB1MTYgKCpyZWFkX2NzcikodW5zaWduZWQgbG9uZywgaW50KTsKKyAgICB2b2lkICgqd3JpdGVfY3NyKSh1bnNpZ25lZCBsb25nLCBpbnQsIHUxNik7CisgICAgdTE2ICgqcmVhZF9iY3IpKHVuc2lnbmVkIGxvbmcsIGludCk7CisgICAgdm9pZCAoKndyaXRlX2JjcikodW5zaWduZWQgbG9uZywgaW50LCB1MTYpOworICAgIHUxNiAoKnJlYWRfcmFwKSh1bnNpZ25lZCBsb25nKTsKKyAgICB2b2lkICgqd3JpdGVfcmFwKSh1bnNpZ25lZCBsb25nLCB1MTYpOworICAgIHZvaWQgKCpyZXNldCkodW5zaWduZWQgbG9uZyk7Cit9OworCisvKgorICogVGhlIGZpcnN0IHRocmVlIGZpZWxkcyBvZiBwY25ldDMyX3ByaXZhdGUgYXJlIHJlYWQgYnkgdGhlIGV0aGVybmV0IGRldmljZQorICogc28gd2UgYWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBzaG91bGQgYmUgYWxsb2NhdGVkIGJ5IHBjaV9hbGxvY19jb25zaXN0ZW50KCkuCisgKi8KK3N0cnVjdCBwY25ldDMyX3ByaXZhdGUgeworICAgIC8qIFRoZSBUeCBhbmQgUnggcmluZyBlbnRyaWVzIG11c3QgYmUgYWxpZ25lZCBvbiAxNi1ieXRlIGJvdW5kYXJpZXMgaW4gMzJiaXQgbW9kZS4gKi8KKyAgICBzdHJ1Y3QgcGNuZXQzMl9yeF9oZWFkICAgIHJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKyAgICBzdHJ1Y3QgcGNuZXQzMl90eF9oZWFkICAgIHR4X3JpbmdbVFhfUklOR19TSVpFXTsKKyAgICBzdHJ1Y3QgcGNuZXQzMl9pbml0X2Jsb2NrIGluaXRfYmxvY2s7CisgICAgZG1hX2FkZHJfdAkJZG1hX2FkZHI7CS8qIERNQSBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiB0aGlzCisJCQkJCSAgIG9iamVjdCwgcmV0dXJuZWQgYnkKKwkJCQkJICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQgKi8KKyAgICBzdHJ1Y3QgcGNpX2RldgkqcGNpX2RldjsJLyogUG9pbnRlciB0byB0aGUgYXNzb2NpYXRlZCBwY2kgZGV2aWNlCisJCQkJCSAgIHN0cnVjdHVyZSAqLworICAgIGNvbnN0IGNoYXIJCSpuYW1lOworICAgIC8qIFRoZSBzYXZlZCBhZGRyZXNzIG9mIGEgc2VudC1pbi1wbGFjZSBwYWNrZXQvYnVmZmVyLCBmb3Igc2tmcmVlKCkuICovCisgICAgc3RydWN0IHNrX2J1ZmYJKnR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworICAgIHN0cnVjdCBza19idWZmCSpyeF9za2J1ZmZbUlhfUklOR19TSVpFXTsKKyAgICBkbWFfYWRkcl90CQl0eF9kbWFfYWRkcltUWF9SSU5HX1NJWkVdOworICAgIGRtYV9hZGRyX3QJCXJ4X2RtYV9hZGRyW1JYX1JJTkdfU0laRV07CisgICAgc3RydWN0IHBjbmV0MzJfYWNjZXNzCWE7CisgICAgc3BpbmxvY2tfdAkJbG9jazsJCS8qIEd1YXJkIGxvY2sgKi8KKyAgICB1bnNpZ25lZCBpbnQJY3VyX3J4LCBjdXJfdHg7CS8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSAqLworICAgIHVuc2lnbmVkIGludAlkaXJ0eV9yeCwgZGlydHlfdHg7IC8qIFRoZSByaW5nIGVudHJpZXMgdG8gYmUgZnJlZSgpZWQuICovCisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisgICAgY2hhcgkJdHhfZnVsbDsKKyAgICBpbnQJCQlvcHRpb25zOworICAgIHVuc2lnbmVkIGludAlzaGFyZWRfaXJxOjEsCS8qIHNoYXJlZCBpcnEgcG9zc2libGUgKi8KKwkJCWR4c3VmbG86MSwJLyogZGlzYWJsZSB0cmFuc21pdCBzdG9wIG9uIHVmbG8gKi8KKwkJCW1paToxOwkJLyogbWlpIHBvcnQgYXZhaWxhYmxlICovCisgICAgc3RydWN0IG5ldF9kZXZpY2UJKm5leHQ7CisgICAgc3RydWN0IG1paV9pZl9pbmZvCW1paV9pZjsKKyAgICBzdHJ1Y3QgdGltZXJfbGlzdAl3YXRjaGRvZ190aW1lcjsKKyAgICBzdHJ1Y3QgdGltZXJfbGlzdAlibGlua190aW1lcjsKKyAgICB1MzIJCQltc2dfZW5hYmxlOwkvKiBkZWJ1ZyBtZXNzYWdlIGxldmVsICovCit9OworCitzdGF0aWMgdm9pZCBwY25ldDMyX3Byb2JlX3ZsYnVzKHZvaWQpOworc3RhdGljIGludCAgcGNuZXQzMl9wcm9iZV9wY2koc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CitzdGF0aWMgaW50ICBwY25ldDMyX3Byb2JlMSh1bnNpZ25lZCBsb25nLCBpbnQsIHN0cnVjdCBwY2lfZGV2ICopOworc3RhdGljIGludCAgcGNuZXQzMl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCAgcGNuZXQzMl9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50ICBwY25ldDMyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50ICBwY25ldDMyX3J4KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQgcGNuZXQzMl90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBwY25ldDMyX2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgaW50ICBwY25ldDMyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwY25ldDMyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIHBjbmV0MzJfbG9hZF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBwY25ldDMyX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgIHBjbmV0MzJfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCk7CitzdGF0aWMgdm9pZCBwY25ldDMyX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0pOworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSwgaW50IHZhbCk7CitzdGF0aWMgdm9pZCBwY25ldDMyX3Jlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNzcjBfYml0cyk7CitzdGF0aWMgdm9pZCBwY25ldDMyX2V0aHRvb2xfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXN0cnVjdCBldGh0b29sX3Rlc3QgKmV0aF90ZXN0LCB1NjQgKmRhdGEpOworc3RhdGljIGludCBwY25ldDMyX2xvb3BiYWNrX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdWludDY0X3QgKmRhdGExKTsKK3N0YXRpYyBpbnQgcGNuZXQzMl9waHlzX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKTsKK3N0YXRpYyB2b2lkIHBjbmV0MzJfbGVkX2JsaW5rX2NhbGxiYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBwY25ldDMyX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywKKwl2b2lkICpwdHIpOworCitlbnVtIHBjaV9mbGFnc19iaXQgeworICAgIFBDSV9VU0VTX0lPPTEsIFBDSV9VU0VTX01FTT0yLCBQQ0lfVVNFU19NQVNURVI9NCwKKyAgICBQQ0lfQUREUjA9MHgxMDw8MCwgUENJX0FERFIxPTB4MTA8PDEsIFBDSV9BRERSMj0weDEwPDwyLCBQQ0lfQUREUjM9MHgxMDw8MywKK307CisKKworc3RhdGljIHUxNiBwY25ldDMyX3dpb19yZWFkX2NzciAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgpCit7CisgICAgb3V0dyAoaW5kZXgsIGFkZHIrUENORVQzMl9XSU9fUkFQKTsKKyAgICByZXR1cm4gaW53IChhZGRyK1BDTkVUMzJfV0lPX1JEUCk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfd2lvX3dyaXRlX2NzciAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgsIHUxNiB2YWwpCit7CisgICAgb3V0dyAoaW5kZXgsIGFkZHIrUENORVQzMl9XSU9fUkFQKTsKKyAgICBvdXR3ICh2YWwsIGFkZHIrUENORVQzMl9XSU9fUkRQKTsKK30KKworc3RhdGljIHUxNiBwY25ldDMyX3dpb19yZWFkX2JjciAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgpCit7CisgICAgb3V0dyAoaW5kZXgsIGFkZHIrUENORVQzMl9XSU9fUkFQKTsKKyAgICByZXR1cm4gaW53IChhZGRyK1BDTkVUMzJfV0lPX0JEUCk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfd2lvX3dyaXRlX2JjciAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgsIHUxNiB2YWwpCit7CisgICAgb3V0dyAoaW5kZXgsIGFkZHIrUENORVQzMl9XSU9fUkFQKTsKKyAgICBvdXR3ICh2YWwsIGFkZHIrUENORVQzMl9XSU9fQkRQKTsKK30KKworc3RhdGljIHUxNiBwY25ldDMyX3dpb19yZWFkX3JhcCAodW5zaWduZWQgbG9uZyBhZGRyKQoreworICAgIHJldHVybiBpbncgKGFkZHIrUENORVQzMl9XSU9fUkFQKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl93aW9fd3JpdGVfcmFwICh1bnNpZ25lZCBsb25nIGFkZHIsIHUxNiB2YWwpCit7CisgICAgb3V0dyAodmFsLCBhZGRyK1BDTkVUMzJfV0lPX1JBUCk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfd2lvX3Jlc2V0ICh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisgICAgaW53IChhZGRyK1BDTkVUMzJfV0lPX1JFU0VUKTsKK30KKworc3RhdGljIGludCBwY25ldDMyX3dpb19jaGVjayAodW5zaWduZWQgbG9uZyBhZGRyKQoreworICAgIG91dHcgKDg4LCBhZGRyK1BDTkVUMzJfV0lPX1JBUCk7CisgICAgcmV0dXJuIChpbncgKGFkZHIrUENORVQzMl9XSU9fUkFQKSA9PSA4OCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgcGNuZXQzMl93aW8gPSB7CisgICAgLnJlYWRfY3NyCT0gcGNuZXQzMl93aW9fcmVhZF9jc3IsCisgICAgLndyaXRlX2Nzcgk9IHBjbmV0MzJfd2lvX3dyaXRlX2NzciwKKyAgICAucmVhZF9iY3IJPSBwY25ldDMyX3dpb19yZWFkX2JjciwKKyAgICAud3JpdGVfYmNyCT0gcGNuZXQzMl93aW9fd3JpdGVfYmNyLAorICAgIC5yZWFkX3JhcAk9IHBjbmV0MzJfd2lvX3JlYWRfcmFwLAorICAgIC53cml0ZV9yYXAJPSBwY25ldDMyX3dpb193cml0ZV9yYXAsCisgICAgLnJlc2V0CT0gcGNuZXQzMl93aW9fcmVzZXQKK307CisKK3N0YXRpYyB1MTYgcGNuZXQzMl9kd2lvX3JlYWRfY3NyICh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBpbmRleCkKK3sKKyAgICBvdXRsIChpbmRleCwgYWRkcitQQ05FVDMyX0RXSU9fUkFQKTsKKyAgICByZXR1cm4gKGlubCAoYWRkcitQQ05FVDMyX0RXSU9fUkRQKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZHdpb193cml0ZV9jc3IgKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4LCB1MTYgdmFsKQoreworICAgIG91dGwgKGluZGV4LCBhZGRyK1BDTkVUMzJfRFdJT19SQVApOworICAgIG91dGwgKHZhbCwgYWRkcitQQ05FVDMyX0RXSU9fUkRQKTsKK30KKworc3RhdGljIHUxNiBwY25ldDMyX2R3aW9fcmVhZF9iY3IgKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4KQoreworICAgIG91dGwgKGluZGV4LCBhZGRyK1BDTkVUMzJfRFdJT19SQVApOworICAgIHJldHVybiAoaW5sIChhZGRyK1BDTkVUMzJfRFdJT19CRFApICYgMHhmZmZmKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9kd2lvX3dyaXRlX2JjciAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgsIHUxNiB2YWwpCit7CisgICAgb3V0bCAoaW5kZXgsIGFkZHIrUENORVQzMl9EV0lPX1JBUCk7CisgICAgb3V0bCAodmFsLCBhZGRyK1BDTkVUMzJfRFdJT19CRFApOworfQorCitzdGF0aWMgdTE2IHBjbmV0MzJfZHdpb19yZWFkX3JhcCAodW5zaWduZWQgbG9uZyBhZGRyKQoreworICAgIHJldHVybiAoaW5sIChhZGRyK1BDTkVUMzJfRFdJT19SQVApICYgMHhmZmZmKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9kd2lvX3dyaXRlX3JhcCAodW5zaWduZWQgbG9uZyBhZGRyLCB1MTYgdmFsKQoreworICAgIG91dGwgKHZhbCwgYWRkcitQQ05FVDMyX0RXSU9fUkFQKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9kd2lvX3Jlc2V0ICh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisgICAgaW5sIChhZGRyK1BDTkVUMzJfRFdJT19SRVNFVCk7Cit9CisKK3N0YXRpYyBpbnQgcGNuZXQzMl9kd2lvX2NoZWNrICh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisgICAgb3V0bCAoODgsIGFkZHIrUENORVQzMl9EV0lPX1JBUCk7CisgICAgcmV0dXJuICgoaW5sIChhZGRyK1BDTkVUMzJfRFdJT19SQVApICYgMHhmZmZmKSA9PSA4OCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgcGNuZXQzMl9kd2lvID0geworICAgIC5yZWFkX2Nzcgk9IHBjbmV0MzJfZHdpb19yZWFkX2NzciwKKyAgICAud3JpdGVfY3NyCT0gcGNuZXQzMl9kd2lvX3dyaXRlX2NzciwKKyAgICAucmVhZF9iY3IJPSBwY25ldDMyX2R3aW9fcmVhZF9iY3IsCisgICAgLndyaXRlX2Jjcgk9IHBjbmV0MzJfZHdpb193cml0ZV9iY3IsCisgICAgLnJlYWRfcmFwCT0gcGNuZXQzMl9kd2lvX3JlYWRfcmFwLAorICAgIC53cml0ZV9yYXAJPSBwY25ldDMyX2R3aW9fd3JpdGVfcmFwLAorICAgIC5yZXNldAk9IHBjbmV0MzJfZHdpb19yZXNldAorfTsKKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBwY25ldDMyX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGRpc2FibGVfaXJxKGRldi0+aXJxKTsKKyAgICBwY25ldDMyX2ludGVycnVwdCgwLCBkZXYsIE5VTEwpOworICAgIGVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKKworc3RhdGljIGludCBwY25ldDMyX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCByID0gLUVPUE5PVFNVUFA7CisKKyAgICBpZiAobHAtPm1paSkgeworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCW1paV9ldGh0b29sX2dzZXQoJmxwLT5taWlfaWYsIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlyID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgcGNuZXQzMl9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgciA9IC1FT1BOT1RTVVBQOworCisgICAgaWYgKGxwLT5taWkpIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlyID0gbWlpX2V0aHRvb2xfc3NldCgmbHAtPm1paV9pZiwgY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIH0KKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCisgICAgc3RyY3B5IChpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKyAgICBzdHJjcHkgKGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKyAgICBpZiAobHAtPnBjaV9kZXYpCisJc3RyY3B5IChpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobHAtPnBjaV9kZXYpKTsKKyAgICBlbHNlCisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlZMQiAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKK30KKworc3RhdGljIHUzMiBwY25ldDMyX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgcjsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIGlmIChscC0+bWlpKSB7CisJciA9IG1paV9saW5rX29rKCZscC0+bWlpX2lmKTsKKyAgICB9IGVsc2UgeworCXVsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwkvKiBjYXJkIGJhc2UgSS9PIGFkZHJlc3MgKi8KKwlyID0gKGxwLT5hLnJlYWRfYmNyKGlvYWRkciwgNCkgIT0gMHhjMCk7CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIHUzMiBwY25ldDMyX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHJldHVybiBscC0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIGxwLT5tc2dfZW5hYmxlID0gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgcGNuZXQzMl9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgciA9IC1FT1BOT1RTVVBQOworCisgICAgaWYgKGxwLT5taWkpIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlyID0gbWlpX253YXlfcmVzdGFydCgmbHAtPm1paV9pZik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKmVyaW5nKQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCisgICAgZXJpbmctPnR4X21heF9wZW5kaW5nID0gVFhfUklOR19TSVpFIC0gMTsKKyAgICBlcmluZy0+dHhfcGVuZGluZyA9IGxwLT5jdXJfdHggLSBscC0+ZGlydHlfdHg7CisgICAgZXJpbmctPnJ4X21heF9wZW5kaW5nID0gUlhfUklOR19TSVpFIC0gMTsKKyAgICBlcmluZy0+cnhfcGVuZGluZyA9IGxwLT5jdXJfcnggJiBSWF9SSU5HX01PRF9NQVNLOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQoreworICAgIG1lbWNweShkYXRhLCBwY25ldDMyX2dzdHJpbmdzX3Rlc3QsIHNpemVvZihwY25ldDMyX2dzdHJpbmdzX3Rlc3QpKTsKK30KKworc3RhdGljIGludCBwY25ldDMyX3NlbGZfdGVzdF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHJldHVybiBQQ05FVDMyX1RFU1RfTEVOOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX2V0aHRvb2xfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXN0cnVjdCBldGh0b29sX3Rlc3QgKnRlc3QsIHU2NCAqZGF0YSkKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAodGVzdC0+ZmxhZ3MgPT0gRVRIX1RFU1RfRkxfT0ZGTElORSkgeworCXJjID0gcGNuZXQzMl9sb29wYmFja190ZXN0KGRldiwgZGF0YSk7CisJaWYgKHJjKSB7CisJICAgIGlmIChuZXRpZl9tc2dfaHcobHApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IExvb3BiYWNrIHRlc3QgZmFpbGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkgICAgdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCX0gZWxzZSBpZiAobmV0aWZfbXNnX2h3KGxwKSkKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBMb29wYmFjayB0ZXN0IHBhc3NlZC5cbiIsIGRldi0+bmFtZSk7CisgICAgfSBlbHNlIGlmIChuZXRpZl9tc2dfaHcobHApKQorCXByaW50ayhLRVJOX0RFQlVHICIlczogTm8gdGVzdHMgdG8gcnVuIChzcGVjaWZ5ICdPZmZsaW5lJyBvbiBldGh0b29sKS4iLAkgICAgZGV2LT5uYW1lKTsKK30gLyogZW5kIHBjbmV0MzJfZXRodG9vbF90ZXN0ICovCisKK3N0YXRpYyBpbnQgcGNuZXQzMl9sb29wYmFja190ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVpbnQ2NF90ICpkYXRhMSkKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICBzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgKmEgPSAmbHAtPmE7CS8qIGFjY2VzcyB0byByZWdpc3RlcnMgKi8KKyAgICB1bG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsJLyogY2FyZCBiYXNlIEkvTyBhZGRyZXNzICovCisgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsJCS8qIHNrIGJ1ZmYgKi8KKyAgICBpbnQgeCwgaTsJCQkJLyogY291bnRlcnMgKi8KKyAgICBpbnQgbnVtYnVmZnMgPSA0OwkJCS8qIG51bWJlciBvZiBUWC9SWCBidWZmZXJzIGFuZCBkZXNjcyAqLworICAgIHUxNiBzdGF0dXMgPSAweDgzMDA7CQkvKiBUWCByaW5nIHN0YXR1cyAqLworICAgIHUxNiB0ZXN0c3RhdHVzOwkJCS8qIHRlc3Qgb2YgcmluZyBzdGF0dXMgKi8KKyAgICBpbnQgcmM7CQkJCS8qIHJldHVybiBjb2RlICovCisgICAgaW50IHNpemU7CQkJCS8qIHNpemUgb2YgcGFja2V0cyAqLworICAgIHVuc2lnbmVkIGNoYXIgKnBhY2tldDsJCS8qIHNvdXJjZSBwYWNrZXQgZGF0YSAqLworICAgIHN0YXRpYyBpbnQgZGF0YV9sZW4gPSA2MDsJCS8qIGxlbmd0aCBvZiBzb3VyY2UgcGFja2V0cyAqLworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgdW5zaWduZWQgbG9uZyB0aWNrczsKKworICAgICpkYXRhMSA9IDE7CQkJLyogc3RhdHVzIG9mIHRlc3QsIGRlZmF1bHQgdG8gZmFpbCAqLworICAgIHJjID0gMTsJCQkvKiBkZWZhdWx0IHRvIGZhaWwgKi8KKworICAgIGlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJcGNuZXQzMl9jbG9zZShkZXYpOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKyAgICAvKiBSZXNldCB0aGUgUENORVQzMiAqLworICAgIGxwLT5hLnJlc2V0IChpb2FkZHIpOworCisgICAgLyogc3dpdGNoIHBjbmV0MzIgdG8gMzJiaXQgbW9kZSAqLworICAgIGxwLT5hLndyaXRlX2JjciAoaW9hZGRyLCAyMCwgMik7CisKKyAgICBscC0+aW5pdF9ibG9jay5tb2RlID0gbGUxNl90b19jcHUoKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX1BPUlRTRUwpIDw8IDcpOworICAgIGxwLT5pbml0X2Jsb2NrLmZpbHRlclswXSA9IDA7CisgICAgbHAtPmluaXRfYmxvY2suZmlsdGVyWzFdID0gMDsKKworICAgIC8qIHB1cmdlICYgaW5pdCByaW5ncyBidXQgZG9uJ3QgYWN0dWFsbHkgcmVzdGFydCAqLworICAgIHBjbmV0MzJfcmVzdGFydChkZXYsIDB4MDAwMCk7CisKKyAgICBscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAwLCAweDAwMDQpOwkvKiBTZXQgU1RPUCBiaXQgKi8KKworICAgIC8qIEluaXRpYWxpemUgVHJhbnNtaXQgYnVmZmVycy4gKi8KKyAgICBzaXplID0gZGF0YV9sZW4gKyAxNTsKKyAgICBmb3IgKHg9MDsgeDxudW1idWZmczsgeCsrKSB7CisJaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKSkpIHsKKwkgICAgaWYgKG5ldGlmX21zZ19odyhscCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ2Fubm90IGFsbG9jYXRlIHNrYiBhdCBsaW5lOiAlZCFcbiIsCisJCSAgICBkZXYtPm5hbWUsIF9fTElORV9fKTsKKwkgICAgZ290byBjbGVhbl91cDsKKwl9IGVsc2UgeworCSAgICBwYWNrZXQgPSBza2ItPmRhdGE7CisJICAgIHNrYl9wdXQoc2tiLCBzaXplKTsJCS8qIGNyZWF0ZSBzcGFjZSBmb3IgZGF0YSAqLworCSAgICBscC0+dHhfc2tidWZmW3hdID0gc2tiOworCSAgICBscC0+dHhfcmluZ1t4XS5sZW5ndGggPSBsZTE2X3RvX2NwdSgtc2tiLT5sZW4pOworCSAgICBscC0+dHhfcmluZ1t4XS5taXNjID0gMDsKKworICAgICAgICAgICAgLyogcHV0IERBIGFuZCBTQSBpbnRvIHRoZSBza2IgKi8KKwkgICAgZm9yIChpPTA7IGk8NjsgaSsrKQorCQkqcGFja2V0KysgPSBkZXYtPmRldl9hZGRyW2ldOworCSAgICBmb3IgKGk9MDsgaTw2OyBpKyspCisJCSpwYWNrZXQrKyA9IGRldi0+ZGV2X2FkZHJbaV07CisJICAgIC8qIHR5cGUgKi8KKwkgICAgKnBhY2tldCsrID0gMHgwODsKKwkgICAgKnBhY2tldCsrID0gMHgwNjsKKwkgICAgLyogcGFja2V0IG51bWJlciAqLworCSAgICAqcGFja2V0KysgPSB4OworCSAgICAvKiBmaWxsIHBhY2tldCB3aXRoIGRhdGEgKi8KKwkgICAgZm9yIChpPTA7IGk8ZGF0YV9sZW47IGkrKykKKwkJKnBhY2tldCsrID0gaTsKKworCSAgICBscC0+dHhfZG1hX2FkZHJbeF0gPSBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2Rldiwgc2tiLT5kYXRhLAorCQkgICAgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCSAgICBscC0+dHhfcmluZ1t4XS5iYXNlID0gKHUzMilsZTMyX3RvX2NwdShscC0+dHhfZG1hX2FkZHJbeF0pOworCSAgICB3bWIoKTsgLyogTWFrZSBzdXJlIG93bmVyIGNoYW5nZXMgYWZ0ZXIgYWxsIG90aGVycyBhcmUgdmlzaWJsZSAqLworCSAgICBscC0+dHhfcmluZ1t4XS5zdGF0dXMgPSBsZTE2X3RvX2NwdShzdGF0dXMpOworCX0KKyAgICB9CisKKyAgICB4ID0gYS0+cmVhZF9iY3IoaW9hZGRyLCAzMik7CS8qIHNldCBpbnRlcm5hbCBsb29wYmFjayBpbiBCU1IzMiAqLworICAgIHggPSB4IHwgMHgwMDAyOworICAgIGEtPndyaXRlX2Jjcihpb2FkZHIsIDMyLCB4KTsKKworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAxNSwgMHgwMDQ0KTsJLyogc2V0IGludCBsb29wYmFjayBpbiBDU1IxNSAqLworCisgICAgdGVzdHN0YXR1cyA9IGxlMTZfdG9fY3B1KDB4ODAwMCk7CisgICAgbHAtPmEud3JpdGVfY3NyKGlvYWRkciwgMCwgMHgwMDAyKTsJCS8qIFNldCBTVFJUIGJpdCAqLworCisgICAgLyogQ2hlY2sgc3RhdHVzIG9mIGRlc2NyaXB0b3JzICovCisgICAgZm9yICh4PTA7IHg8bnVtYnVmZnM7IHgrKykgeworCXRpY2tzID0gMDsKKwlybWIoKTsKKwl3aGlsZSAoKGxwLT5yeF9yaW5nW3hdLnN0YXR1cyAmIHRlc3RzdGF0dXMpICYmICh0aWNrcyA8IDIwMCkpIHsKKwkgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkgICAgbWRlbGF5KDEpOworCSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkgICAgcm1iKCk7CisJICAgIHRpY2tzKys7CisJfQorCWlmICh0aWNrcyA9PSAyMDApIHsKKwkgICAgaWYgKG5ldGlmX21zZ19odyhscCkpCisJCXByaW50aygiJXM6IERlc2MgJWQgZmFpbGVkIHRvIHJlc2V0IVxuIixkZXYtPm5hbWUseCk7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICBscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAwLCAweDAwMDQpOwkJLyogU2V0IFNUT1AgYml0ICovCisgICAgd21iKCk7CisgICAgaWYgKG5ldGlmX21zZ19odyhscCkgJiYgbmV0aWZfbXNnX3BrdGRhdGEobHApKSB7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSWCBsb29wYmFjayBwYWNrZXRzOlxuIiwgZGV2LT5uYW1lKTsKKworCWZvciAoeD0wOyB4PG51bWJ1ZmZzOyB4KyspIHsKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBQYWNrZXQgJWQ6XG4iLCBkZXYtPm5hbWUsIHgpOworCSAgICBza2IgPSBscC0+cnhfc2tidWZmW3hdOworCSAgICBmb3IgKGk9MDsgaTxzaXplOyBpKyspIHsKKwkJcHJpbnRrKCIlMDJ4ICIsICooc2tiLT5kYXRhK2kpKTsKKwkgICAgfQorCSAgICBwcmludGsoIlxuIik7CisJfQorICAgIH0KKworICAgIHggPSAwOworICAgIHJjID0gMDsKKyAgICB3aGlsZSAoeDxudW1idWZmcyAmJiAhcmMpIHsKKwlza2IgPSBscC0+cnhfc2tidWZmW3hdOworCXBhY2tldCA9IGxwLT50eF9za2J1ZmZbeF0tPmRhdGE7CisJZm9yIChpPTA7IGk8c2l6ZTsgaSsrKSB7CisJICAgIGlmICgqKHNrYi0+ZGF0YStpKSAhPSBwYWNrZXRbaV0pIHsKKwkJaWYgKG5ldGlmX21zZ19odyhscCkpCisJCSAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IEVycm9yIGluIGNvbXBhcmUhICUyeCAtICUwMnggJTAyeFxuIiwKKwkJCSAgICBkZXYtPm5hbWUsIGksICooc2tiLT5kYXRhK2kpLCBwYWNrZXRbaV0pOworCQlyYyA9IDE7CisJCWJyZWFrOworCSAgICB9CisJfQorCXgrKzsKKyAgICB9CisgICAgaWYgKCFyYykgeworCSpkYXRhMSA9IDA7CisgICAgfQorCitjbGVhbl91cDoKKyAgICB4ID0gYS0+cmVhZF9jc3IoaW9hZGRyLCAxNSkgJiAweEZGRkY7CisgICAgYS0+d3JpdGVfY3NyKGlvYWRkciwgMTUsICh4ICYgfjB4MDA0NCkpOwkvKiByZXNldCBiaXRzIDYgYW5kIDIgKi8KKworICAgIHggPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDMyKTsJCS8qIHJlc2V0IGludGVybmFsIGxvb3BiYWNrICovCisgICAgeCA9IHggJiB+MHgwMDAyOworICAgIGEtPndyaXRlX2Jjcihpb2FkZHIsIDMyLCB4KTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKyAgICBpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJcGNuZXQzMl9vcGVuKGRldik7CisgICAgfSBlbHNlIHsKKwlscC0+YS53cml0ZV9iY3IgKGlvYWRkciwgMjAsIDQpOwkvKiByZXR1cm4gdG8gMTZiaXQgbW9kZSAqLworICAgIH0KKworICAgIHJldHVybihyYyk7Cit9IC8qIGVuZCBwY25ldDMyX2xvb3BiYWNrX3Rlc3QgICovCisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfbGVkX2JsaW5rX2NhbGxiYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgc3RydWN0IHBjbmV0MzJfYWNjZXNzICphID0gJmxwLT5hOworICAgIHVsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgaW50IGk7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICBmb3IgKGk9NDsgaTw4OyBpKyspIHsKKwlhLT53cml0ZV9iY3IoaW9hZGRyLCBpLCBhLT5yZWFkX2Jjcihpb2FkZHIsIGkpIF4gMHg0MDAwKTsKKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIG1vZF90aW1lcigmbHAtPmJsaW5rX3RpbWVyLCBQQ05FVDMyX0JMSU5LX1RJTUVPVVQpOworfQorCitzdGF0aWMgaW50IHBjbmV0MzJfcGh5c19pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICBzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgKmEgPSAmbHAtPmE7CisgICAgdWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgaSwgcmVnc1s0XTsKKworICAgIGlmICghbHAtPmJsaW5rX3RpbWVyLmZ1bmN0aW9uKSB7CisJaW5pdF90aW1lcigmbHAtPmJsaW5rX3RpbWVyKTsKKwlscC0+YmxpbmtfdGltZXIuZnVuY3Rpb24gPSAodm9pZCAqKSBwY25ldDMyX2xlZF9ibGlua19jYWxsYmFjazsKKwlscC0+YmxpbmtfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisgICAgfQorCisgICAgLyogU2F2ZSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYmNycyAqLworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIGZvciAoaT00OyBpPDg7IGkrKykgeworCXJlZ3NbaS00XSA9IGEtPnJlYWRfYmNyKGlvYWRkciwgaSk7CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKyAgICBtb2RfdGltZXIoJmxwLT5ibGlua190aW1lciwgamlmZmllcyk7CisgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworICAgIGlmICgoIWRhdGEpIHx8IChkYXRhID4gKHUzMikoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWikpKQorICAgIGRhdGEgPSAodTMyKShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKTsKKworICAgIHNjaGVkdWxlX3RpbWVvdXQoZGF0YSAqIEhaKTsKKyAgICBkZWxfdGltZXJfc3luYygmbHAtPmJsaW5rX3RpbWVyKTsKKworICAgIC8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBiY3JzICovCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisgICAgZm9yIChpPTQ7IGk8ODsgaSsrKSB7CisJYS0+d3JpdGVfYmNyKGlvYWRkciwgaSwgcmVnc1tpLTRdKTsKKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjbmV0MzJfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcmV0dXJuKFBDTkVUMzJfTlVNX1JFR1MgKiBzaXplb2YodTE2KSk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywKKwl2b2lkICpwdHIpCit7CisgICAgaW50IGksIGNzcjA7CisgICAgdTE2ICpidWZmID0gcHRyOworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHN0cnVjdCBwY25ldDMyX2FjY2VzcyAqYSA9ICZscC0+YTsKKyAgICB1bG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgdGlja3M7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgY3NyMCA9IGEtPnJlYWRfY3NyKGlvYWRkciwgMCk7CisgICAgaWYgKCEoY3NyMCAmIDB4MDAwNCkpIHsJLyogSWYgbm90IHN0b3BwZWQgKi8KKwkvKiBzZXQgU1VTUEVORCAoU1BORCkgLSBDU1I1IGJpdCAwICovCisJYS0+d3JpdGVfY3NyKGlvYWRkciwgNSwgMHgwMDAxKTsKKworCS8qIHBvbGwgd2FpdGluZyBmb3IgYml0IHRvIGJlIHNldCAqLworCXRpY2tzID0gMDsKKwl3aGlsZSAoIShhLT5yZWFkX2Nzcihpb2FkZHIsIDUpICYgMHgwMDAxKSkgeworCSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCSAgICBtZGVsYXkoMSk7CisJICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCSAgICB0aWNrcysrOworCSAgICBpZiAodGlja3MgPiAyMDApIHsKKwkJaWYgKG5ldGlmX21zZ19odyhscCkpCisJCSAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IEVycm9yIGdldHRpbmcgaW50byBzdXNwZW5kIVxuIiwKKwkJCSAgICBkZXYtPm5hbWUpOworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKiByZWFkIGFkZHJlc3MgUFJPTSAqLworICAgIGZvciAoaT0wOyBpPDE2OyBpICs9IDIpCisJKmJ1ZmYrKyA9IGludyhpb2FkZHIgKyBpKTsKKworICAgIC8qIHJlYWQgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVycyAqLworICAgIGZvciAoaT0wOyBpPDkwOyBpKyspIHsKKwkqYnVmZisrID0gYS0+cmVhZF9jc3IoaW9hZGRyLCBpKTsKKyAgICB9CisKKyAgICAqYnVmZisrID0gYS0+cmVhZF9jc3IoaW9hZGRyLCAxMTIpOworICAgICpidWZmKysgPSBhLT5yZWFkX2Nzcihpb2FkZHIsIDExNCk7CisKKyAgICAvKiByZWFkIGJ1cyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworICAgIGZvciAoaT0wOyBpPDM2OyBpKyspIHsKKwkqYnVmZisrID0gYS0+cmVhZF9iY3IoaW9hZGRyLCBpKTsKKyAgICB9CisKKyAgICAvKiByZWFkIG1paSBwaHkgcmVnaXN0ZXJzICovCisgICAgaWYgKGxwLT5taWkpIHsKKwlmb3IgKGk9MDsgaTwzMjsgaSsrKSB7CisJICAgIGxwLT5hLndyaXRlX2Jjcihpb2FkZHIsIDMzLCAoKGxwLT5taWlfaWYucGh5X2lkKSA8PCA1KSB8IGkpOworCSAgICAqYnVmZisrID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzNCk7CisJfQorICAgIH0KKworICAgIGlmICghKGNzcjAgJiAweDAwMDQpKSB7CS8qIElmIG5vdCBzdG9wcGVkICovCisJLyogY2xlYXIgU1VTUEVORCAoU1BORCkgLSBDU1I1IGJpdCAwICovCisJYS0+d3JpdGVfY3NyKGlvYWRkciwgNSwgMHgwMDAwKTsKKyAgICB9CisKKyAgICBpID0gYnVmZiAtICh1MTYgKilwdHI7CisgICAgZm9yICg7IGkgPCBQQ05FVDMyX05VTV9SRUdTOyBpKyspCisJKmJ1ZmYrKyA9IDA7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHBjbmV0MzJfZXRodG9vbF9vcHMgPSB7CisgICAgLmdldF9zZXR0aW5ncwk9IHBjbmV0MzJfZ2V0X3NldHRpbmdzLAorICAgIC5zZXRfc2V0dGluZ3MJPSBwY25ldDMyX3NldF9zZXR0aW5ncywKKyAgICAuZ2V0X2RydmluZm8JPSBwY25ldDMyX2dldF9kcnZpbmZvLAorICAgIC5nZXRfbXNnbGV2ZWwJPSBwY25ldDMyX2dldF9tc2dsZXZlbCwKKyAgICAuc2V0X21zZ2xldmVsCT0gcGNuZXQzMl9zZXRfbXNnbGV2ZWwsCisgICAgLm53YXlfcmVzZXQJCT0gcGNuZXQzMl9ud2F5X3Jlc2V0LAorICAgIC5nZXRfbGluawkJPSBwY25ldDMyX2dldF9saW5rLAorICAgIC5nZXRfcmluZ3BhcmFtCT0gcGNuZXQzMl9nZXRfcmluZ3BhcmFtLAorICAgIC5nZXRfdHhfY3N1bQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisgICAgLmdldF9zZwkJPSBldGh0b29sX29wX2dldF9zZywKKyAgICAuZ2V0X3RzbwkJPSBldGh0b29sX29wX2dldF90c28sCisgICAgLmdldF9zdHJpbmdzCT0gcGNuZXQzMl9nZXRfc3RyaW5ncywKKyAgICAuc2VsZl90ZXN0X2NvdW50CT0gcGNuZXQzMl9zZWxmX3Rlc3RfY291bnQsCisgICAgLnNlbGZfdGVzdAkJPSBwY25ldDMyX2V0aHRvb2xfdGVzdCwKKyAgICAucGh5c19pZAkJPSBwY25ldDMyX3BoeXNfaWQsCisgICAgLmdldF9yZWdzX2xlbgk9IHBjbmV0MzJfZ2V0X3JlZ3NfbGVuLAorICAgIC5nZXRfcmVncwkJPSBwY25ldDMyX2dldF9yZWdzLAorfTsKKworLyogb25seSBwcm9iZXMgZm9yIG5vbi1QQ0kgZGV2aWNlcywgdGhlIHJlc3QgYXJlIGhhbmRsZWQgYnkKKyAqIHBjaV9yZWdpc3Rlcl9kcml2ZXIgdmlhIHBjbmV0MzJfcHJvYmVfcGNpICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorcGNuZXQzMl9wcm9iZV92bGJ1cyh2b2lkKQoreworICAgIHVuc2lnbmVkIGludCAqcG9ydCwgaW9hZGRyOworCisgICAgLyogc2VhcmNoIGZvciBQQ25ldDMyIFZMQiBjYXJkcyBhdCBrbm93biBhZGRyZXNzZXMgKi8KKyAgICBmb3IgKHBvcnQgPSBwY25ldDMyX3BvcnRsaXN0OyAoaW9hZGRyID0gKnBvcnQpOyBwb3J0KyspIHsKKwlpZiAocmVxdWVzdF9yZWdpb24oaW9hZGRyLCBQQ05FVDMyX1RPVEFMX1NJWkUsICJwY25ldDMyX3Byb2JlX3ZsYnVzIikpIHsKKwkgICAgLyogY2hlY2sgaWYgdGhlcmUgaXMgcmVhbGx5IGEgcGNuZXQgY2hpcCBvbiB0aGF0IGlvYWRkciAqLworCSAgICBpZiAoKGluYihpb2FkZHIgKyAxNCkgPT0gMHg1NykgJiYgKGluYihpb2FkZHIgKyAxNSkgPT0gMHg1NykpIHsKKwkJcGNuZXQzMl9wcm9iZTEoaW9hZGRyLCAwLCBOVUxMKTsKKwkgICAgfSBlbHNlIHsKKwkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBQQ05FVDMyX1RPVEFMX1NJWkUpOworCSAgICB9CisJfQorICAgIH0KK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcGNuZXQzMl9wcm9iZV9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisgICAgdW5zaWduZWQgbG9uZyBpb2FkZHI7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworICAgIGlmIChlcnIgPCAwKSB7CisJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJICAgIHByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byBlbmFibGUgZGV2aWNlIC0tIGVycj0lZFxuIiwgZXJyKTsKKwlyZXR1cm4gZXJyOworICAgIH0KKyAgICBwY2lfc2V0X21hc3RlcihwZGV2KTsKKworICAgIGlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCk7CisgICAgaWYgKCFpb2FkZHIpIHsKKwlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkKKwkgICAgcHJpbnRrIChLRVJOX0VSUiBQRlggImNhcmQgaGFzIG5vIFBDSSBJTyByZXNvdXJjZXMsIGFib3J0aW5nXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBpZiAoIXBjaV9kbWFfc3VwcG9ydGVkKHBkZXYsIFBDTkVUMzJfRE1BX01BU0spKSB7CisJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJICAgIHByaW50ayhLRVJOX0VSUiBQRlggImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgaWYgKHJlcXVlc3RfcmVnaW9uKGlvYWRkciwgUENORVQzMl9UT1RBTF9TSVpFLCAicGNuZXQzMl9wcm9iZV9wY2kiKSA9PSBOVUxMKSB7CisJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJICAgIHByaW50ayhLRVJOX0VSUiBQRlggImlvIGFkZHJlc3MgcmFuZ2UgYWxyZWFkeSBhbGxvY2F0ZWRcbiIpOworCXJldHVybiAtRUJVU1k7CisgICAgfQorCisgICAgZXJyID0gIHBjbmV0MzJfcHJvYmUxKGlvYWRkciwgMSwgcGRldik7CisgICAgaWYgKGVyciA8IDApIHsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKKworLyogcGNuZXQzMl9wcm9iZTEKKyAqICBDYWxsZWQgZnJvbSBib3RoIHBjbmV0MzJfcHJvYmVfdmxidXMgYW5kIHBjbmV0X3Byb2JlX3BjaS4KKyAqICBwZGV2IHdpbGwgYmUgTlVMTCB3aGVuIGNhbGxlZCBmcm9tIHBjbmV0MzJfcHJvYmVfdmxidXMuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0CitwY25ldDMyX3Byb2JlMSh1bnNpZ25lZCBsb25nIGlvYWRkciwgaW50IHNoYXJlZCwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHA7CisgICAgZG1hX2FkZHJfdCBscF9kbWFfYWRkcjsKKyAgICBpbnQgaSwgbWVkaWE7CisgICAgaW50IGZkeCwgbWlpLCBmc2V0LCBkeHN1ZmxvOworICAgIGludCBjaGlwX3ZlcnNpb247CisgICAgY2hhciAqY2hpcG5hbWU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgKmEgPSBOVUxMOworICAgIHU4IHByb21hZGRyWzZdOworICAgIGludCByZXQgPSAtRU5PREVWOworCisgICAgLyogcmVzZXQgdGhlIGNoaXAgKi8KKyAgICBwY25ldDMyX3dpb19yZXNldChpb2FkZHIpOworCisgICAgLyogTk9URTogMTYtYml0IGNoZWNrIGlzIGZpcnN0LCBvdGhlcndpc2Ugc29tZSBvbGRlciBQQ25ldCBjaGlwcyBmYWlsICovCisgICAgaWYgKHBjbmV0MzJfd2lvX3JlYWRfY3NyKGlvYWRkciwgMCkgPT0gNCAmJiBwY25ldDMyX3dpb19jaGVjayhpb2FkZHIpKSB7CisJYSA9ICZwY25ldDMyX3dpbzsKKyAgICB9IGVsc2UgeworCXBjbmV0MzJfZHdpb19yZXNldChpb2FkZHIpOworCWlmIChwY25ldDMyX2R3aW9fcmVhZF9jc3IoaW9hZGRyLCAwKSA9PSA0ICYmIHBjbmV0MzJfZHdpb19jaGVjayhpb2FkZHIpKSB7CisJICAgIGEgPSAmcGNuZXQzMl9kd2lvOworCX0gZWxzZQorCSAgICBnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKKyAgICB9CisKKyAgICBjaGlwX3ZlcnNpb24gPSBhLT5yZWFkX2Nzcihpb2FkZHIsIDg4KSB8IChhLT5yZWFkX2Nzcihpb2FkZHIsODkpIDw8IDE2KTsKKyAgICBpZiAoKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpICYmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX0hXKSkKKwlwcmludGsoS0VSTl9JTkZPICIgIFBDbmV0IGNoaXAgdmVyc2lvbiBpcyAlI3guXG4iLCBjaGlwX3ZlcnNpb24pOworICAgIGlmICgoY2hpcF92ZXJzaW9uICYgMHhmZmYpICE9IDB4MDAzKSB7CisJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJICAgIHByaW50ayhLRVJOX0lORk8gUEZYICJVbnN1cHBvcnRlZCBjaGlwIHZlcnNpb24uXG4iKTsKKwlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIHZhcmlhYmxlcyAqLworICAgIGZkeCA9IG1paSA9IGZzZXQgPSBkeHN1ZmxvID0gMDsKKyAgICBjaGlwX3ZlcnNpb24gPSAoY2hpcF92ZXJzaW9uID4+IDEyKSAmIDB4ZmZmZjsKKworICAgIHN3aXRjaCAoY2hpcF92ZXJzaW9uKSB7CisgICAgY2FzZSAweDI0MjA6CisJY2hpcG5hbWUgPSAiUENuZXQvUENJIDc5Qzk3MCI7IC8qIFBDSSAqLworCWJyZWFrOworICAgIGNhc2UgMHgyNDMwOgorCWlmIChzaGFyZWQpCisJICAgIGNoaXBuYW1lID0gIlBDbmV0L1BDSSA3OUM5NzAiOyAvKiA5NzAgZ2l2ZXMgdGhlIHdyb25nIGNoaXAgaWQgYmFjayAqLworCWVsc2UKKwkgICAgY2hpcG5hbWUgPSAiUENuZXQvMzIgNzlDOTY1IjsgLyogNDg2L1ZMIGJ1cyAqLworCWJyZWFrOworICAgIGNhc2UgMHgyNjIxOgorCWNoaXBuYW1lID0gIlBDbmV0L1BDSSBJSSA3OUM5NzBBIjsgLyogUENJICovCisJZmR4ID0gMTsKKwlicmVhazsKKyAgICBjYXNlIDB4MjYyMzoKKwljaGlwbmFtZSA9ICJQQ25ldC9GQVNUIDc5Qzk3MSI7IC8qIFBDSSAqLworCWZkeCA9IDE7IG1paSA9IDE7IGZzZXQgPSAxOworCWJyZWFrOworICAgIGNhc2UgMHgyNjI0OgorCWNoaXBuYW1lID0gIlBDbmV0L0ZBU1QrIDc5Qzk3MiI7IC8qIFBDSSAqLworCWZkeCA9IDE7IG1paSA9IDE7IGZzZXQgPSAxOworCWJyZWFrOworICAgIGNhc2UgMHgyNjI1OgorCWNoaXBuYW1lID0gIlBDbmV0L0ZBU1QgSUlJIDc5Qzk3MyI7IC8qIFBDSSAqLworCWZkeCA9IDE7IG1paSA9IDE7CisJYnJlYWs7CisgICAgY2FzZSAweDI2MjY6CisJY2hpcG5hbWUgPSAiUENuZXQvSG9tZSA3OUM5NzgiOyAvKiBQQ0kgKi8KKwlmZHggPSAxOworCS8qCisJICogVGhpcyBpcyBiYXNlZCBvbiBzcGVjcyBwdWJsaXNoZWQgYXQgd3d3LmFtZC5jb20uICBUaGlzIHNlY3Rpb24KKwkgKiBhc3N1bWVzIHRoYXQgYSBjYXJkIHdpdGggYSA3OUM5Nzggd2FudHMgdG8gZ28gaW50byBzdGFuZGFyZAorCSAqIGV0aGVybmV0IG1vZGUuICBUaGUgNzlDOTc4IGNhbiBhbHNvIGdvIGludG8gMU1iIEhvbWVQTkEgbW9kZSwKKwkgKiBhbmQgdGhlIG1vZHVsZSBvcHRpb24gaG9tZXBuYT0xIGNhbiBzZWxlY3QgdGhpcyBpbnN0ZWFkLgorCSAqLworCW1lZGlhID0gYS0+cmVhZF9iY3IoaW9hZGRyLCA0OSk7CisJbWVkaWEgJj0gfjM7CQkvKiBkZWZhdWx0IHRvIDEwTWIgZXRoZXJuZXQgKi8KKwlpZiAoY2FyZHNfZm91bmQgPCBNQVhfVU5JVFMgJiYgaG9tZXBuYVtjYXJkc19mb3VuZF0pCisJICAgIG1lZGlhIHw9IDE7IAkvKiBzd2l0Y2ggdG8gaG9tZSB3aXJpbmcgbW9kZSAqLworCWlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCSAgICBwcmludGsoS0VSTl9ERUJVRyBQRlggIm1lZGlhIHNldCB0byAlc01iaXQgbW9kZS5cbiIsIAorCQkgICAgKG1lZGlhICYgMSkgPyAiMSIgOiAiMTAiKTsKKwlhLT53cml0ZV9iY3IoaW9hZGRyLCA0OSwgbWVkaWEpOworCWJyZWFrOworICAgIGNhc2UgMHgyNjI3OgorCWNoaXBuYW1lID0gIlBDbmV0L0ZBU1QgSUlJIDc5Qzk3NSI7IC8qIFBDSSAqLworCWZkeCA9IDE7IG1paSA9IDE7CisJYnJlYWs7CisgICAgY2FzZSAweDI2Mjg6CisJY2hpcG5hbWUgPSAiUENuZXQvUFJPIDc5Qzk3NiI7CisJZmR4ID0gMTsgbWlpID0gMTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCSAgICBwcmludGsoS0VSTl9JTkZPIFBGWCAiUENuZXQgdmVyc2lvbiAlI3gsIG5vIFBDbmV0MzIgY2hpcC5cbiIsCisJCSAgICBjaGlwX3ZlcnNpb24pOworCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uOworICAgIH0KKworICAgIC8qCisgICAgICoJT24gc2VsZWN0ZWQgY2hpcHMgdHVybiBvbiB0aGUgQkNSMTg6Tk9VRkxPIGJpdC4gVGhpcyBzdG9wcyB0cmFuc21pdAorICAgICAqCXN0YXJ0aW5nIHVudGlsIHRoZSBwYWNrZXQgaXMgbG9hZGVkLiBTdHJpa2Ugb25lIGZvciByZWxpYWJpbGl0eSwgbG9zZQorICAgICAqCW9uZSBmb3IgbGF0ZW5jeSAtIGFsdGhvdWdoIG9uIFBDSSB0aGlzIGlzbnQgYSBiaWcgbG9zcy4gT2xkZXIgY2hpcHMKKyAgICAgKgloYXZlIEZJRk8ncyBzbWFsbGVyIHRoYW4gYSBwYWNrZXQsIHNvIHlvdSBjYW4ndCBkbyB0aGlzLgorICAgICAqCVR1cm4gb24gQkNSMTg6QnVyc3RSZEVuIGFuZCBCQ1IxODpCdXJzdFdyRW4uCisgICAgICovCisKKyAgICBpZiAoZnNldCkgeworCWEtPndyaXRlX2Jjcihpb2FkZHIsIDE4LCAoYS0+cmVhZF9iY3IoaW9hZGRyLCAxOCkgfCAweDA4NjApKTsKKwlhLT53cml0ZV9jc3IoaW9hZGRyLCA4MCwgKGEtPnJlYWRfY3NyKGlvYWRkciwgODApICYgMHgwQzAwKSB8IDB4MGMwMCk7CisJZHhzdWZsbyA9IDE7CisgICAgfQorCisgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoMCk7CisgICAgaWYgKCFkZXYpIHsKKwlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkKKwkgICAgcHJpbnRrKEtFUk5fRVJSIFBGWCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxuIik7CisJcmV0ID0gLUVOT01FTTsKKwlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKKyAgICB9CisgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworICAgIGlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCXByaW50ayhLRVJOX0lORk8gUEZYICIlcyBhdCAlIzNseCwiLCBjaGlwbmFtZSwgaW9hZGRyKTsKKworICAgIC8qIEluIG1vc3QgY2hpcHMsIGFmdGVyIGEgY2hpcCByZXNldCwgdGhlIGV0aGVybmV0IGFkZHJlc3MgaXMgcmVhZCBmcm9tIHRoZQorICAgICAqIHN0YXRpb24gYWRkcmVzcyBQUk9NIGF0IHRoZSBiYXNlIGFkZHJlc3MgYW5kIHByb2dyYW1tZWQgaW50byB0aGUKKyAgICAgKiAiUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlcnMiIENTUjEyLTE0LgorICAgICAqIEFzIGEgcHJlY2F1dGlvbmFyeSBtZWFzdXJlLCB3ZSByZWFkIHRoZSBQUk9NIHZhbHVlcyBhbmQgY29tcGxhaW4gaWYKKyAgICAgKiB0aGV5IGRpc2FncmVlIHdpdGggdGhlIENTUnMuICBFaXRoZXIgd2F5LCB3ZSB1c2UgdGhlIENTUiB2YWx1ZXMsIGFuZAorICAgICAqIGRvdWJsZSBjaGVjayB0aGF0IHRoZXkgYXJlIHZhbGlkLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXZhbCA9IGEtPnJlYWRfY3NyKGlvYWRkciwgaSsxMikgJiAweDBmZmZmOworCS8qIFRoZXJlIG1heSBiZSBlbmRpYW5uZXNzIGlzc3VlcyBoZXJlLiAqLworCWRldi0+ZGV2X2FkZHJbMippXSA9IHZhbCAmIDB4MGZmOworCWRldi0+ZGV2X2FkZHJbMippKzFdID0gKHZhbCA+PiA4KSAmIDB4MGZmOworICAgIH0KKworICAgIC8qIHJlYWQgUFJPTSBhZGRyZXNzIGFuZCBjb21wYXJlIHdpdGggQ1NSIGFkZHJlc3MgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXByb21hZGRyW2ldID0gaW5iKGlvYWRkciArIGkpOworCisgICAgaWYgKG1lbWNtcChwcm9tYWRkciwgZGV2LT5kZXZfYWRkciwgNikKKwl8fCAhaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkgeworI2lmbmRlZiBfX3Bvd2VycGNfXworCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKHByb21hZGRyKSkgeworI2Vsc2UKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikKKwkgICAgJiYgaXNfdmFsaWRfZXRoZXJfYWRkcihwcm9tYWRkcikpIHsKKyNlbmRpZgorCSAgICBpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkgeworCQlwcmludGsoIiB3YXJuaW5nOiBDU1IgYWRkcmVzcyBpbnZhbGlkLFxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIiAgICB1c2luZyBpbnN0ZWFkIFBST00gYWRkcmVzcyBvZiIpOworCSAgICB9CisJICAgIG1lbWNweShkZXYtPmRldl9hZGRyLCBwcm9tYWRkciwgNik7CisJfQorICAgIH0KKworICAgIC8qIGlmIHRoZSBldGhlcm5ldCBhZGRyZXNzIGlzIG5vdCB2YWxpZCwgZm9yY2UgdG8gMDA6MDA6MDA6MDA6MDA6MDAgKi8KKyAgICBpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpCisJbWVtc2V0KGRldi0+ZGV2X2FkZHIsIDAsIHNpemVvZihkZXYtPmRldl9hZGRyKSk7CisKKyAgICBpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkgeworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJICAgIHByaW50aygiICUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSk7CisKKwkvKiBWZXJzaW9uIDB4MjYyMyBhbmQgMHgyNjI0ICovCisJaWYgKCgoY2hpcF92ZXJzaW9uICsgMSkgJiAweGZmZmUpID09IDB4MjYyNCkgeworCSAgICBpID0gYS0+cmVhZF9jc3IoaW9hZGRyLCA4MCkgJiAweDBDMDA7ICAvKiBDaGVjayB0eF9zdGFydF9wdCAqLworCSAgICBwcmludGsoIlxuIiBLRVJOX0lORk8gIiAgICB0eF9zdGFydF9wdCgweCUwNHgpOiIsaSk7CisJICAgIHN3aXRjaChpPj4xMCkgeworCQljYXNlIDA6IHByaW50aygiICAyMCBieXRlcywiKTsgYnJlYWs7CisJCWNhc2UgMTogcHJpbnRrKCIgIDY0IGJ5dGVzLCIpOyBicmVhazsKKwkJY2FzZSAyOiBwcmludGsoIiAxMjggYnl0ZXMsIik7IGJyZWFrOworCQljYXNlIDM6IHByaW50aygifjIyMCBieXRlcywiKTsgYnJlYWs7CisJICAgIH0KKwkgICAgaSA9IGEtPnJlYWRfYmNyKGlvYWRkciwgMTgpOyAgLyogQ2hlY2sgQnVyc3QvQnVzIGNvbnRyb2wgKi8KKwkgICAgcHJpbnRrKCIgQkNSMTgoJXgpOiIsaSYweGZmZmYpOworCSAgICBpZiAoaSAmICgxPDw1KSkgcHJpbnRrKCJCdXJzdFdyRW4gIik7CisJICAgIGlmIChpICYgKDE8PDYpKSBwcmludGsoIkJ1cnN0UmRFbiAiKTsKKwkgICAgaWYgKGkgJiAoMTw8NykpIHByaW50aygiRFdvcmRJTyAiKTsKKwkgICAgaWYgKGkgJiAoMTw8MTEpKSBwcmludGsoIk5vVUZsb3cgIik7CisJICAgIGkgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDI1KTsKKwkgICAgcHJpbnRrKCJcbiIgS0VSTl9JTkZPICIgICAgU1JBTVNJWkU9MHglMDR4LCIsaTw8OCk7CisJICAgIGkgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDI2KTsKKwkgICAgcHJpbnRrKCIgU1JBTV9CTkQ9MHglMDR4LCIsaTw8OCk7CisJICAgIGkgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDI3KTsKKwkgICAgaWYgKGkgJiAoMTw8MTQpKSBwcmludGsoIkxvd0xhdFJ4Iik7CisJfQorICAgIH0KKworICAgIGRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworICAgIC8qIHBjaV9hbGxvY19jb25zaXN0ZW50IHJldHVybnMgcGFnZS1hbGlnbmVkIG1lbW9yeSwgc28gd2UgZG8gbm90IGhhdmUgdG8gY2hlY2sgdGhlIGFsaWdubWVudCAqLworICAgIGlmICgobHAgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplb2YoKmxwKSwgJmxwX2RtYV9hZGRyKSkgPT0gTlVMTCkgeworCWlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCSAgICBwcmludGsoS0VSTl9FUlIgUEZYICJDb25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOworCXJldCA9IC1FTk9NRU07CisJZ290byBlcnJfZnJlZV9uZXRkZXY7CisgICAgfQorCisgICAgbWVtc2V0KGxwLCAwLCBzaXplb2YoKmxwKSk7CisgICAgbHAtPmRtYV9hZGRyID0gbHBfZG1hX2FkZHI7CisgICAgbHAtPnBjaV9kZXYgPSBwZGV2OworCisgICAgc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworICAgIGRldi0+cHJpdiA9IGxwOworICAgIGxwLT5uYW1lID0gY2hpcG5hbWU7CisgICAgbHAtPnNoYXJlZF9pcnEgPSBzaGFyZWQ7CisgICAgbHAtPm1paV9pZi5mdWxsX2R1cGxleCA9IGZkeDsKKyAgICBscC0+bWlpX2lmLnBoeV9pZF9tYXNrID0gMHgxZjsKKyAgICBscC0+bWlpX2lmLnJlZ19udW1fbWFzayA9IDB4MWY7CisgICAgbHAtPmR4c3VmbG8gPSBkeHN1ZmxvOworICAgIGxwLT5taWkgPSBtaWk7CisgICAgbHAtPm1zZ19lbmFibGUgPSBwY25ldDMyX2RlYnVnOworICAgIGlmICgoY2FyZHNfZm91bmQgPj0gTUFYX1VOSVRTKSB8fCAob3B0aW9uc1tjYXJkc19mb3VuZF0gPiBzaXplb2Yob3B0aW9uc19tYXBwaW5nKSkpCisJbHAtPm9wdGlvbnMgPSBQQ05FVDMyX1BPUlRfQVNFTDsKKyAgICBlbHNlCisJbHAtPm9wdGlvbnMgPSBvcHRpb25zX21hcHBpbmdbb3B0aW9uc1tjYXJkc19mb3VuZF1dOworICAgIGxwLT5taWlfaWYuZGV2ID0gZGV2OworICAgIGxwLT5taWlfaWYubWRpb19yZWFkID0gbWRpb19yZWFkOworICAgIGxwLT5taWlfaWYubWRpb193cml0ZSA9IG1kaW9fd3JpdGU7CisKKyAgICBpZiAoZmR4ICYmICEobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfQVNFTCkgJiYKKwkJKChjYXJkc19mb3VuZD49TUFYX1VOSVRTKSB8fCBmdWxsX2R1cGxleFtjYXJkc19mb3VuZF0pKQorCWxwLT5vcHRpb25zIHw9IFBDTkVUMzJfUE9SVF9GRDsKKworICAgIGlmICghYSkgeworCWlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCSAgICBwcmludGsoS0VSTl9FUlIgUEZYICJObyBhY2Nlc3MgbWV0aG9kc1xuIik7CisJcmV0ID0gLUVOT0RFVjsKKwlnb3RvIGVycl9mcmVlX2NvbnNpc3RlbnQ7CisgICAgfQorICAgIGxwLT5hID0gKmE7CisKKyAgICAvKiBkZXRlY3Qgc3BlY2lhbCBUMS9FMSBXQU4gY2FyZCBieSBjaGVja2luZyBmb3IgTUFDIGFkZHJlc3MgKi8KKyAgICBpZiAoZGV2LT5kZXZfYWRkclswXSA9PSAweDAwICYmIGRldi0+ZGV2X2FkZHJbMV0gPT0gMHhlMAorCSAgICAmJiBkZXYtPmRldl9hZGRyWzJdID09IDB4NzUpCisJbHAtPm9wdGlvbnMgPSBQQ05FVDMyX1BPUlRfRkQgfCBQQ05FVDMyX1BPUlRfR1BTSTsKKworICAgIGxwLT5pbml0X2Jsb2NrLm1vZGUgPSBsZTE2X3RvX2NwdSgweDAwMDMpOwkvKiBEaXNhYmxlIFJ4IGFuZCBUeC4gKi8KKyAgICBscC0+aW5pdF9ibG9jay50bGVuX3JsZW4gPSBsZTE2X3RvX2NwdShUWF9SSU5HX0xFTl9CSVRTIHwgUlhfUklOR19MRU5fQklUUyk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlscC0+aW5pdF9ibG9jay5waHlzX2FkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworICAgIGxwLT5pbml0X2Jsb2NrLmZpbHRlclswXSA9IDB4MDAwMDAwMDA7CisgICAgbHAtPmluaXRfYmxvY2suZmlsdGVyWzFdID0gMHgwMDAwMDAwMDsKKyAgICBscC0+aW5pdF9ibG9jay5yeF9yaW5nID0gKHUzMilsZTMyX3RvX2NwdShscC0+ZG1hX2FkZHIgKworCSAgICBvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLCByeF9yaW5nKSk7CisgICAgbHAtPmluaXRfYmxvY2sudHhfcmluZyA9ICh1MzIpbGUzMl90b19jcHUobHAtPmRtYV9hZGRyICsKKwkgICAgb2Zmc2V0b2Yoc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSwgdHhfcmluZykpOworCisgICAgLyogc3dpdGNoIHBjbmV0MzIgdG8gMzJiaXQgbW9kZSAqLworICAgIGEtPndyaXRlX2Jjcihpb2FkZHIsIDIwLCAyKTsKKworICAgIGEtPndyaXRlX2Nzcihpb2FkZHIsIDEsIChscC0+ZG1hX2FkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLAorCQkgICAgaW5pdF9ibG9jaykpICYgMHhmZmZmKTsKKyAgICBhLT53cml0ZV9jc3IoaW9hZGRyLCAyLCAobHAtPmRtYV9hZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSwKKwkJICAgIGluaXRfYmxvY2spKSA+PiAxNik7CisKKyAgICBpZiAocGRldikgewkJLyogdXNlIHRoZSBJUlEgcHJvdmlkZWQgYnkgUENJICovCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJICAgIHByaW50aygiIGFzc2lnbmVkIElSUSAlZC5cbiIsIGRldi0+aXJxKTsKKyAgICB9IGVsc2UgeworCXVuc2lnbmVkIGxvbmcgaXJxX21hc2sgPSBwcm9iZV9pcnFfb24oKTsKKworCS8qCisJICogVG8gYXV0by1JUlEgd2UgZW5hYmxlIHRoZSBpbml0aWFsaXphdGlvbi1kb25lIGFuZCBETUEgZXJyb3IKKwkgKiBpbnRlcnJ1cHRzLiBGb3IgSVNBIGJvYXJkcyB3ZSBnZXQgYSBETUEgZXJyb3IsIGJ1dCBWTEIgYW5kIFBDSQorCSAqIGJvYXJkcyB3aWxsIHdvcmsuCisJICovCisJLyogVHJpZ2dlciBhbiBpbml0aWFsaXphdGlvbiBqdXN0IGZvciB0aGUgaW50ZXJydXB0LiAqLworCWEtPndyaXRlX2NzciAoaW9hZGRyLCAwLCAweDQxKTsKKwltZGVsYXkgKDEpOworCisJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmIChpcnFfbWFzayk7CisJaWYgKCFkZXYtPmlycSkgeworCSAgICBpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkKKwkJcHJpbnRrKCIsIGZhaWxlZCB0byBkZXRlY3QgSVJRIGxpbmUuXG4iKTsKKwkgICAgcmV0ID0gLUVOT0RFVjsKKwkgICAgZ290byBlcnJfZnJlZV9jb25zaXN0ZW50OworCX0KKwlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkKKwkgICAgcHJpbnRrKCIsIHByb2JlZCBJUlEgJWQuXG4iLCBkZXYtPmlycSk7CisgICAgfQorCisgICAgLyogU2V0IHRoZSBtaWkgcGh5X2lkIHNvIHRoYXQgd2UgY2FuIHF1ZXJ5IHRoZSBsaW5rIHN0YXRlICovCisgICAgaWYgKGxwLT5taWkpCisJbHAtPm1paV9pZi5waHlfaWQgPSAoKGxwLT5hLnJlYWRfYmNyIChpb2FkZHIsIDMzKSkgPj4gNSkgJiAweDFmOworCisgICAgaW5pdF90aW1lciAoJmxwLT53YXRjaGRvZ190aW1lcik7CisgICAgbHAtPndhdGNoZG9nX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworICAgIGxwLT53YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9ICh2b2lkICopICZwY25ldDMyX3dhdGNoZG9nOworCisgICAgLyogVGhlIFBDTkVUMzItc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKyAgICBkZXYtPm9wZW4gPSAmcGNuZXQzMl9vcGVuOworICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJnBjbmV0MzJfc3RhcnRfeG1pdDsKKyAgICBkZXYtPnN0b3AgPSAmcGNuZXQzMl9jbG9zZTsKKyAgICBkZXYtPmdldF9zdGF0cyA9ICZwY25ldDMyX2dldF9zdGF0czsKKyAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZwY25ldDMyX3NldF9tdWx0aWNhc3RfbGlzdDsKKyAgICBkZXYtPmRvX2lvY3RsID0gJnBjbmV0MzJfaW9jdGw7CisgICAgZGV2LT5ldGh0b29sX29wcyA9ICZwY25ldDMyX2V0aHRvb2xfb3BzOworICAgIGRldi0+dHhfdGltZW91dCA9IHBjbmV0MzJfdHhfdGltZW91dDsKKyAgICBkZXYtPndhdGNoZG9nX3RpbWVvID0gKDUqSFopOworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKyAgICBkZXYtPnBvbGxfY29udHJvbGxlciA9IHBjbmV0MzJfcG9sbF9jb250cm9sbGVyOworI2VuZGlmCisKKyAgICAvKiBGaWxsIGluIHRoZSBnZW5lcmljIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKyAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpCisJZ290byBlcnJfZnJlZV9jb25zaXN0ZW50OworCisgICAgaWYgKHBkZXYpIHsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKyAgICB9IGVsc2UgeworCWxwLT5uZXh0ID0gcGNuZXQzMl9kZXY7CisJcGNuZXQzMl9kZXYgPSBkZXY7CisgICAgfQorCisgICAgaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlZ2lzdGVyZWQgYXMgJXNcbiIsIGRldi0+bmFtZSwgbHAtPm5hbWUpOworICAgIGNhcmRzX2ZvdW5kKys7CisKKyAgICAvKiBlbmFibGUgTEVEIHdyaXRlcyAqLworICAgIGEtPndyaXRlX2Jjcihpb2FkZHIsIDIsIGEtPnJlYWRfYmNyKGlvYWRkciwgMikgfCAweDEwMDApOworCisgICAgcmV0dXJuIDA7CisKK2Vycl9mcmVlX2NvbnNpc3RlbnQ6CisgICAgcGNpX2ZyZWVfY29uc2lzdGVudChscC0+cGNpX2Rldiwgc2l6ZW9mKCpscCksIGxwLCBscC0+ZG1hX2FkZHIpOworZXJyX2ZyZWVfbmV0ZGV2OgorICAgIGZyZWVfbmV0ZGV2KGRldik7CitlcnJfcmVsZWFzZV9yZWdpb246CisgICAgcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBQQ05FVDMyX1RPVEFMX1NJWkUpOworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludAorcGNuZXQzMl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1MTYgdmFsOworICAgIGludCBpOworICAgIGludCByYzsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmcGNuZXQzMl9pbnRlcnJ1cHQsCisJCSAgICBscC0+c2hhcmVkX2lycSA/IFNBX1NISVJRIDogMCwgZGV2LT5uYW1lLCAodm9pZCAqKWRldikpIHsKKwlyZXR1cm4gLUVBR0FJTjsKKyAgICB9CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBzdGF0aW9uIGFkZHJlc3MgKi8KKyAgICBpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpIHsKKwlyYyA9IC1FSU5WQUw7CisJZ290byBlcnJfZnJlZV9pcnE7CisgICAgfQorCisgICAgLyogUmVzZXQgdGhlIFBDTkVUMzIgKi8KKyAgICBscC0+YS5yZXNldCAoaW9hZGRyKTsKKworICAgIC8qIHN3aXRjaCBwY25ldDMyIHRvIDMyYml0IG1vZGUgKi8KKyAgICBscC0+YS53cml0ZV9iY3IgKGlvYWRkciwgMjAsIDIpOworCisgICAgaWYgKG5ldGlmX21zZ19pZnVwKGxwKSkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHBjbmV0MzJfb3BlbigpIGlycSAlZCB0eC9yeCByaW5ncyAlI3gvJSN4IGluaXQgJSN4LlxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmlycSwKKwkgICAgICAgKHUzMikgKGxwLT5kbWFfYWRkciArIG9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsIHR4X3JpbmcpKSwKKwkgICAgICAgKHUzMikgKGxwLT5kbWFfYWRkciArIG9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsIHJ4X3JpbmcpKSwKKwkgICAgICAgKHUzMikgKGxwLT5kbWFfYWRkciArIG9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsIGluaXRfYmxvY2spKSk7CisKKyAgICAvKiBzZXQvcmVzZXQgYXV0b3NlbGVjdCBiaXQgKi8KKyAgICB2YWwgPSBscC0+YS5yZWFkX2JjciAoaW9hZGRyLCAyKSAmIH4yOworICAgIGlmIChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9BU0VMKQorCXZhbCB8PSAyOworICAgIGxwLT5hLndyaXRlX2JjciAoaW9hZGRyLCAyLCB2YWwpOworCisgICAgLyogaGFuZGxlIGZ1bGwgZHVwbGV4IHNldHRpbmcgKi8KKyAgICBpZiAobHAtPm1paV9pZi5mdWxsX2R1cGxleCkgeworCXZhbCA9IGxwLT5hLnJlYWRfYmNyIChpb2FkZHIsIDkpICYgfjM7CisJaWYgKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0ZEKSB7CisJICAgIHZhbCB8PSAxOworCSAgICBpZiAobHAtPm9wdGlvbnMgPT0gKFBDTkVUMzJfUE9SVF9GRCB8IFBDTkVUMzJfUE9SVF9BVUkpKQorCQl2YWwgfD0gMjsKKwl9IGVsc2UgaWYgKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpIHsKKwkvKiB3b3JrYXJvdW5kIG9mIHhTZXJpZXMyNTAsIHR1cm4gb24gZm9yIDc5Qzk3NSBvbmx5ICovCisJICAgIGkgPSAoKGxwLT5hLnJlYWRfY3NyKGlvYWRkciwgODgpIHwKKwkJCShscC0+YS5yZWFkX2Nzcihpb2FkZHIsODkpIDw8IDE2KSkgPj4gMTIpICYgMHhmZmZmOworCSAgICBpZiAoaSA9PSAweDI2MjcpCisJCXZhbCB8PSAzOworCX0KKwlscC0+YS53cml0ZV9iY3IgKGlvYWRkciwgOSwgdmFsKTsKKyAgICB9CisKKyAgICAvKiBzZXQvcmVzZXQgR1BTSSBiaXQgaW4gdGVzdCByZWdpc3RlciAqLworICAgIHZhbCA9IGxwLT5hLnJlYWRfY3NyIChpb2FkZHIsIDEyNCkgJiB+MHgxMDsKKyAgICBpZiAoKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX1BPUlRTRUwpID09IFBDTkVUMzJfUE9SVF9HUFNJKQorCXZhbCB8PSAweDEwOworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAxMjQsIHZhbCk7CisKKyAgICAvKiBBbGxpZWQgVGVsZXN5biBBVCAyNzAwLzI3MDEgRlggbG9vc2VzIHRoZSBsaW5rLCBzbyBza2lwIHRoYXQgKi8KKyAgICBpZiAobHAtPnBjaV9kZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BVCAmJgorICAgICAgICAobHAtPnBjaV9kZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gUENJX1NVQkRFVklDRV9JRF9BVF8yNzAwRlggfHwKKwkgbHAtPnBjaV9kZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gUENJX1NVQkRFVklDRV9JRF9BVF8yNzAxRlgpKSB7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTa2lwcGluZyBQSFkgc2VsZWN0aW9uLlxuIiwgZGV2LT5uYW1lKTsKKyAgICB9IGVsc2UgeworCS8qCisJICogMjQgSnVuIDIwMDQgYWNjb3JkaW5nIEFNRCwgaW4gb3JkZXIgdG8gY2hhbmdlIHRoZSBQSFksCisJICogREFOQVMgKG9yIERJU1BNIGZvciA3OUM5NzYpIG11c3QgYmUgc2V0OyB0aGVuIHNlbGVjdCB0aGUgc3BlZWQsCisJICogZHVwbGV4LCBhbmQvb3IgZW5hYmxlIGF1dG8gbmVnb3RpYXRpb24sIGFuZCBjbGVhciBEQU5BUworCSAqLworCWlmIChscC0+bWlpICYmICEobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfQVNFTCkpIHsKKwkgICAgbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzIsCisJCQkJbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzMikgfCAweDAwODApOworCSAgICAvKiBkaXNhYmxlIEF1dG8gTmVnb3RpYXRpb24sIHNldCAxME1wYnMsIEhEICovCisJICAgIHZhbCA9IGxwLT5hLnJlYWRfYmNyKGlvYWRkciwgMzIpICYgfjB4Yjg7CisJICAgIGlmIChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9GRCkKKwkJdmFsIHw9IDB4MTA7CisJICAgIGlmIChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF8xMDApCisJCXZhbCB8PSAweDA4OworCSAgICBscC0+YS53cml0ZV9iY3IgKGlvYWRkciwgMzIsIHZhbCk7CisJfSBlbHNlIHsKKwkgICAgaWYgKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpIHsKKwkJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzIsCisJCQlscC0+YS5yZWFkX2Jjcihpb2FkZHIsIDMyKSB8IDB4MDA4MCk7CisJCS8qIGVuYWJsZSBhdXRvIG5lZ290aWF0ZSwgc2V0dXAsIGRpc2FibGUgZmQgKi8KKwkJdmFsID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzMikgJiB+MHg5ODsKKwkJdmFsIHw9IDB4MjA7CisJCWxwLT5hLndyaXRlX2Jjcihpb2FkZHIsIDMyLCB2YWwpOworCSAgICB9CisJfQorICAgIH0KKworI2lmZGVmIERPX0RYU1VGTE8KKyAgICBpZiAobHAtPmR4c3VmbG8pIHsgLyogRGlzYWJsZSB0cmFuc21pdCBzdG9wIG9uIHVuZGVyZmxvdyAqLworCXZhbCA9IGxwLT5hLnJlYWRfY3NyIChpb2FkZHIsIDMpOworCXZhbCB8PSAweDQwOworCWxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAzLCB2YWwpOworICAgIH0KKyNlbmRpZgorCisgICAgbHAtPmluaXRfYmxvY2subW9kZSA9IGxlMTZfdG9fY3B1KChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9QT1JUU0VMKSA8PCA3KTsKKyAgICBwY25ldDMyX2xvYWRfbXVsdGljYXN0KGRldik7CisKKyAgICBpZiAocGNuZXQzMl9pbml0X3JpbmcoZGV2KSkgeworCXJjID0gLUVOT01FTTsKKwlnb3RvIGVycl9mcmVlX3Jpbmc7CisgICAgfQorCisgICAgLyogUmUtaW5pdGlhbGl6ZSB0aGUgUENORVQzMiwgYW5kIHN0YXJ0IGl0IHdoZW4gZG9uZS4gKi8KKyAgICBscC0+YS53cml0ZV9jc3IgKGlvYWRkciwgMSwgKGxwLT5kbWFfYWRkciArCisJCW9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsIGluaXRfYmxvY2spKSAmIDB4ZmZmZik7CisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDIsIChscC0+ZG1hX2FkZHIgKworCQlvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLCBpbml0X2Jsb2NrKSkgPj4gMTYpOworCisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDQsIDB4MDkxNSk7CisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDAsIDB4MDAwMSk7CisKKyAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisgICAgLyogSWYgd2UgaGF2ZSBtaWksIHByaW50IHRoZSBsaW5rIHN0YXR1cyBhbmQgc3RhcnQgdGhlIHdhdGNoZG9nICovCisgICAgaWYgKGxwLT5taWkpIHsKKwltaWlfY2hlY2tfbWVkaWEgKCZscC0+bWlpX2lmLCBuZXRpZl9tc2dfbGluayhscCksIDEpOworCW1vZF90aW1lciAoJihscC0+d2F0Y2hkb2dfdGltZXIpLCBQQ05FVDMyX1dBVENIRE9HX1RJTUVPVVQpOworICAgIH0KKworICAgIGkgPSAwOworICAgIHdoaWxlIChpKysgPCAxMDApCisJaWYgKGxwLT5hLnJlYWRfY3NyIChpb2FkZHIsIDApICYgMHgwMTAwKQorCSAgICBicmVhazsKKyAgICAvKgorICAgICAqIFdlIHVzZWQgdG8gY2xlYXIgdGhlIEluaXREb25lIGJpdCwgMHgwMTAwLCBoZXJlIGJ1dCBNYXJrIFN0b2NrdG9uCisgICAgICogcmVwb3J0cyB0aGF0IGRvaW5nIHNvIHRyaWdnZXJzIGEgYnVnIGluIHRoZSAnOTc0LgorICAgICAqLworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAwLCAweDAwNDIpOworCisgICAgaWYgKG5ldGlmX21zZ19pZnVwKGxwKSkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHBjbmV0MzIgb3BlbiBhZnRlciAlZCB0aWNrcywgaW5pdCBibG9jayAlI3ggY3NyMCAlNC40eC5cbiIsCisJCWRldi0+bmFtZSwgaSwgKHUzMikgKGxwLT5kbWFfYWRkciArCisJCSAgICBvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLCBpbml0X2Jsb2NrKSksCisJCWxwLT5hLnJlYWRfY3NyKGlvYWRkciwgMCkpOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiAwOwkvKiBBbHdheXMgc3VjY2VlZCAqLworCitlcnJfZnJlZV9yaW5nOgorICAgIC8qIGZyZWUgYW55IGFsbG9jYXRlZCBza2J1ZmZzICovCisgICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJbHAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwlpZiAobHAtPnJ4X3NrYnVmZltpXSkgeworCSAgICBwY2lfdW5tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCBscC0+cnhfZG1hX2FkZHJbaV0sIFBLVF9CVUZfU1otMiwKKwkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJICAgIGRldl9rZnJlZV9za2IobHAtPnJ4X3NrYnVmZltpXSk7CisJfQorCWxwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCWxwLT5yeF9kbWFfYWRkcltpXSA9IDA7CisgICAgfQorICAgIC8qCisgICAgICogU3dpdGNoIGJhY2sgdG8gMTZiaXQgbW9kZSB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGR1bWIKKyAgICAgKiBET1MgcGFja2V0IGRyaXZlciBhZnRlciBhIHdhcm0gcmVib290CisgICAgICovCisgICAgbHAtPmEud3JpdGVfYmNyIChpb2FkZHIsIDIwLCA0KTsKKworZXJyX2ZyZWVfaXJxOgorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisgICAgZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisgICAgcmV0dXJuIHJjOworfQorCisvKgorICogVGhlIExBTkNFIGhhcyBiZWVuIGhhbHRlZCBmb3Igb25lIHJlYXNvbiBvciBhbm90aGVyIChidXNtYXN0ZXIgbWVtb3J5CisgKiBhcmJpdHJhdGlvbiBlcnJvciwgVHggRklGTyB1bmRlcmZsb3csIGRyaXZlciBzdG9wcGVkIGl0IHRvIHJlY29uZmlndXJlLAorICogZXRjLikuICBNb2Rlcm4gTEFOQ0UgdmFyaWFudHMgYWx3YXlzIHJlbG9hZCB0aGVpciByaW5nLWJ1ZmZlcgorICogY29uZmlndXJhdGlvbiB3aGVuIHJlc3RhcnRlZCwgc28gd2UgbXVzdCByZWluaXRpYWxpemUgb3VyIHJpbmcKKyAqIGNvbnRleHQgYmVmb3JlIHJlc3RhcnRpbmcuICBBcyBwYXJ0IG9mIHRoaXMgcmVpbml0aWFsaXphdGlvbiwKKyAqIGZpbmQgYWxsIHBhY2tldHMgc3RpbGwgb24gdGhlIFR4IHJpbmcgYW5kIHByZXRlbmQgdGhhdCB0aGV5IGhhZCBiZWVuCisgKiBzZW50IChpbiBlZmZlY3QsIGRyb3AgdGhlIHBhY2tldHMgb24gdGhlIGZsb29yKSAtIHRoZSBoaWdoZXItbGV2ZWwKKyAqIHByb3RvY29scyB3aWxsIHRpbWUgb3V0IGFuZCByZXRyYW5zbWl0LiAgSXQnZCBiZSBiZXR0ZXIgdG8gc2h1ZmZsZQorICogdGhlc2Ugc2ticyB0byBhIHRlbXAgbGlzdCBhbmQgdGhlbiBhY3R1YWxseSByZS1UeCB0aGVtIGFmdGVyCisgKiByZXN0YXJ0aW5nIHRoZSBjaGlwLCBidXQgSSdtIHRvbyBsYXp5IHRvIGRvIHNvIHJpZ2h0IG5vdy4gIGRwbGF0dEAzZG8uY29tCisgKi8KKworc3RhdGljIHZvaWQKK3BjbmV0MzJfcHVyZ2VfdHhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJbHAtPnR4X3JpbmdbaV0uc3RhdHVzID0gMDsJLyogQ1BVIG93bnMgYnVmZmVyICovCisJd21iKCk7CS8qIE1ha2Ugc3VyZSBhZGFwdGVyIHNlZXMgb3duZXIgY2hhbmdlICovCisJaWYgKGxwLT50eF9za2J1ZmZbaV0pIHsKKwkgICAgcGNpX3VubWFwX3NpbmdsZShscC0+cGNpX2RldiwgbHAtPnR4X2RtYV9hZGRyW2ldLAorCQkgICAgbHAtPnR4X3NrYnVmZltpXS0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkgICAgZGV2X2tmcmVlX3NrYl9hbnkobHAtPnR4X3NrYnVmZltpXSk7CisJfQorCWxwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCWxwLT50eF9kbWFfYWRkcltpXSA9IDA7CisgICAgfQorfQorCisKKy8qIEluaXRpYWxpemUgdGhlIFBDTkVUMzIgUnggYW5kIFR4IHJpbmdzLiAqLworc3RhdGljIGludAorcGNuZXQzMl9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGxwLT50eF9mdWxsID0gMDsKKyAgICBscC0+Y3VyX3J4ID0gbHAtPmN1cl90eCA9IDA7CisgICAgbHAtPmRpcnR5X3J4ID0gbHAtPmRpcnR5X3R4ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCXN0cnVjdCBza19idWZmICpyeF9za2J1ZmYgPSBscC0+cnhfc2tidWZmW2ldOworCWlmIChyeF9za2J1ZmYgPT0gTlVMTCkgeworCSAgICBpZiAoIShyeF9za2J1ZmYgPSBscC0+cnhfc2tidWZmW2ldID0gZGV2X2FsbG9jX3NrYiAoUEtUX0JVRl9TWikpKSB7CisJCS8qIHRoZXJlIGlzIG5vdCBtdWNoLCB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludCAqLworCQlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19EUlYpCisJCSAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBwY25ldDMyX2luaXRfcmluZyBkZXZfYWxsb2Nfc2tiIGZhaWxlZC5cbiIsCisJCQkgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJICAgIHNrYl9yZXNlcnZlIChyeF9za2J1ZmYsIDIpOworCX0KKworCXJtYigpOworCWlmIChscC0+cnhfZG1hX2FkZHJbaV0gPT0gMCkKKwkgICAgbHAtPnJ4X2RtYV9hZGRyW2ldID0gcGNpX21hcF9zaW5nbGUobHAtPnBjaV9kZXYsIHJ4X3NrYnVmZi0+dGFpbCwKKwkJICAgIFBLVF9CVUZfU1otMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlscC0+cnhfcmluZ1tpXS5iYXNlID0gKHUzMilsZTMyX3RvX2NwdShscC0+cnhfZG1hX2FkZHJbaV0pOworCWxwLT5yeF9yaW5nW2ldLmJ1Zl9sZW5ndGggPSBsZTE2X3RvX2NwdSgyLVBLVF9CVUZfU1opOworCXdtYigpOwkvKiBNYWtlIHN1cmUgb3duZXIgY2hhbmdlcyBhZnRlciBhbGwgb3RoZXJzIGFyZSB2aXNpYmxlICovCisJbHAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gbGUxNl90b19jcHUoMHg4MDAwKTsKKyAgICB9CisgICAgLyogVGhlIFR4IGJ1ZmZlciBhZGRyZXNzIGlzIGZpbGxlZCBpbiBhcyBuZWVkZWQsIGJ1dCB3ZSBkbyBuZWVkIHRvIGNsZWFyCisgICAgICogdGhlIHVwcGVyIG93bmVyc2hpcCBiaXQuICovCisgICAgZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJbHAtPnR4X3JpbmdbaV0uc3RhdHVzID0gMDsJLyogQ1BVIG93bnMgYnVmZmVyICovCisJd21iKCk7CS8qIE1ha2Ugc3VyZSBhZGFwdGVyIHNlZXMgb3duZXIgY2hhbmdlICovCisJbHAtPnR4X3JpbmdbaV0uYmFzZSA9IDA7CisJbHAtPnR4X2RtYV9hZGRyW2ldID0gMDsKKyAgICB9CisKKyAgICBscC0+aW5pdF9ibG9jay50bGVuX3JsZW4gPSBsZTE2X3RvX2NwdShUWF9SSU5HX0xFTl9CSVRTIHwgUlhfUklOR19MRU5fQklUUyk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlscC0+aW5pdF9ibG9jay5waHlzX2FkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworICAgIGxwLT5pbml0X2Jsb2NrLnJ4X3JpbmcgPSAodTMyKWxlMzJfdG9fY3B1KGxwLT5kbWFfYWRkciArCisJICAgIG9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsIHJ4X3JpbmcpKTsKKyAgICBscC0+aW5pdF9ibG9jay50eF9yaW5nID0gKHUzMilsZTMyX3RvX2NwdShscC0+ZG1hX2FkZHIgKworCSAgICBvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLCB0eF9yaW5nKSk7CisgICAgd21iKCk7CS8qIE1ha2Ugc3VyZSBhbGwgY2hhbmdlcyBhcmUgdmlzaWJsZSAqLworICAgIHJldHVybiAwOworfQorCisvKiB0aGUgcGNuZXQzMiBoYXMgYmVlbiBpc3N1ZWQgYSBzdG9wIG9yIHJlc2V0LiAgV2FpdCBmb3IgdGhlIHN0b3AgYml0CisgKiB0aGVuIGZsdXNoIHRoZSBwZW5kaW5nIHRyYW5zbWl0IG9wZXJhdGlvbnMsIHJlLWluaXRpYWxpemUgdGhlIHJpbmcsCisgKiBhbmQgdGVsbCB0aGUgY2hpcCB0byBpbml0aWFsaXplLgorICovCitzdGF0aWMgdm9pZAorcGNuZXQzMl9yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjc3IwX2JpdHMpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaTsKKworICAgIC8qIHdhaXQgZm9yIHN0b3AgKi8KKyAgICBmb3IgKGk9MDsgaTwxMDA7IGkrKykKKwlpZiAobHAtPmEucmVhZF9jc3IoaW9hZGRyLCAwKSAmIDB4MDAwNCkKKwkgICBicmVhazsKKworICAgIGlmIChpID49IDEwMCAmJiBuZXRpZl9tc2dfZHJ2KGxwKSkKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBwY25ldDMyX3Jlc3RhcnQgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHN0b3AuXG4iLAorCQlkZXYtPm5hbWUpOworCisgICAgcGNuZXQzMl9wdXJnZV90eF9yaW5nKGRldik7CisgICAgaWYgKHBjbmV0MzJfaW5pdF9yaW5nKGRldikpCisJcmV0dXJuOworCisgICAgLyogUmVJbml0IFJpbmcgKi8KKyAgICBscC0+YS53cml0ZV9jc3IgKGlvYWRkciwgMCwgMSk7CisgICAgaSA9IDA7CisgICAgd2hpbGUgKGkrKyA8IDEwMDApCisJaWYgKGxwLT5hLnJlYWRfY3NyIChpb2FkZHIsIDApICYgMHgwMTAwKQorCSAgICBicmVhazsKKworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAwLCBjc3IwX2JpdHMpOworfQorCisKK3N0YXRpYyB2b2lkCitwY25ldDMyX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciwgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICAvKiBUcmFuc21pdHRlciB0aW1lb3V0LCBzZXJpb3VzIHByb2JsZW1zLiAqLworICAgIGlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX0RSVikKKwlwcmludGsoS0VSTl9FUlIgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlNC40eCwgcmVzZXR0aW5nLlxuIiwKKwkJZGV2LT5uYW1lLCBscC0+YS5yZWFkX2Nzcihpb2FkZHIsIDApKTsKKyAgICBscC0+YS53cml0ZV9jc3IgKGlvYWRkciwgMCwgMHgwMDA0KTsKKyAgICBscC0+c3RhdHMudHhfZXJyb3JzKys7CisgICAgaWYgKG5ldGlmX21zZ190eF9lcnIobHApKSB7CisJaW50IGk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBSaW5nIGRhdGEgZHVtcDogZGlydHlfdHggJWQgY3VyX3R4ICVkJXMgY3VyX3J4ICVkLiIsCisJICAgbHAtPmRpcnR5X3R4LCBscC0+Y3VyX3R4LCBscC0+dHhfZnVsbCA/ICIgKGZ1bGwpIiA6ICIiLAorCSAgIGxwLT5jdXJfcngpOworCWZvciAoaSA9IDAgOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJcHJpbnRrKCIlcyAlMDh4ICUwNHggJTA4eCAlMDR4IiwgaSAmIDEgPyAiIiA6ICJcbiAiLAorCSAgICAgICBsZTMyX3RvX2NwdShscC0+cnhfcmluZ1tpXS5iYXNlKSwKKwkgICAgICAgKC1sZTE2X3RvX2NwdShscC0+cnhfcmluZ1tpXS5idWZfbGVuZ3RoKSkgJiAweGZmZmYsCisJICAgICAgIGxlMzJfdG9fY3B1KGxwLT5yeF9yaW5nW2ldLm1zZ19sZW5ndGgpLAorCSAgICAgICBsZTE2X3RvX2NwdShscC0+cnhfcmluZ1tpXS5zdGF0dXMpKTsKKwlmb3IgKGkgPSAwIDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCXByaW50aygiJXMgJTA4eCAlMDR4ICUwOHggJTA0eCIsIGkgJiAxID8gIiIgOiAiXG4gIiwKKwkgICAgICAgbGUzMl90b19jcHUobHAtPnR4X3JpbmdbaV0uYmFzZSksCisJICAgICAgICgtbGUxNl90b19jcHUobHAtPnR4X3JpbmdbaV0ubGVuZ3RoKSkgJiAweGZmZmYsCisJICAgICAgIGxlMzJfdG9fY3B1KGxwLT50eF9yaW5nW2ldLm1pc2MpLAorCSAgICAgICBsZTE2X3RvX2NwdShscC0+dHhfcmluZ1tpXS5zdGF0dXMpKTsKKwlwcmludGsoIlxuIik7CisgICAgfQorICAgIHBjbmV0MzJfcmVzdGFydChkZXYsIDB4MDA0Mik7CisKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyBpbnQKK3BjbmV0MzJfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdTE2IHN0YXR1czsKKyAgICBpbnQgZW50cnk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgaWYgKG5ldGlmX21zZ190eF9xdWV1ZWQobHApKSB7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwY25ldDMyX3N0YXJ0X3htaXQoKSBjYWxsZWQsIGNzcjAgJTQuNHguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGxwLT5hLnJlYWRfY3NyKGlvYWRkciwgMCkpOworICAgIH0KKworICAgIC8qIERlZmF1bHQgc3RhdHVzIC0tIHdpbGwgbm90IGVuYWJsZSBTdWNjZXNzZnVsLVR4RG9uZQorICAgICAqIGludGVycnVwdCB3aGVuIHRoYXQgb3B0aW9uIGlzIGF2YWlsYWJsZSB0byB1cy4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSAweDgzMDA7CisKKyAgICAvKiBGaWxsIGluIGEgVHggcmluZyBlbnRyeSAqLworCisgICAgLyogTWFzayB0byByaW5nIGJ1ZmZlciBib3VuZGFyeS4gKi8KKyAgICBlbnRyeSA9IGxwLT5jdXJfdHggJiBUWF9SSU5HX01PRF9NQVNLOworCisgICAgLyogQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLCBzZXQgdGhlIHN0YXR1cworICAgICAqIHdpdGggdGhlICJvd25lcnNoaXAiIGJpdHMgbGFzdC4gKi8KKworICAgIGxwLT50eF9yaW5nW2VudHJ5XS5sZW5ndGggPSBsZTE2X3RvX2NwdSgtc2tiLT5sZW4pOworCisgICAgbHAtPnR4X3JpbmdbZW50cnldLm1pc2MgPSAweDAwMDAwMDAwOworCisgICAgbHAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisgICAgbHAtPnR4X2RtYV9hZGRyW2VudHJ5XSA9IHBjaV9tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCSAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKyAgICBscC0+dHhfcmluZ1tlbnRyeV0uYmFzZSA9ICh1MzIpbGUzMl90b19jcHUobHAtPnR4X2RtYV9hZGRyW2VudHJ5XSk7CisgICAgd21iKCk7IC8qIE1ha2Ugc3VyZSBvd25lciBjaGFuZ2VzIGFmdGVyIGFsbCBvdGhlcnMgYXJlIHZpc2libGUgKi8KKyAgICBscC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gbGUxNl90b19jcHUoc3RhdHVzKTsKKworICAgIGxwLT5jdXJfdHgrKzsKKyAgICBscC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKyAgICAvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSBzZW5kIHBvbGwuICovCisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDAsIDB4MDA0OCk7CisKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworICAgIGlmIChscC0+dHhfcmluZ1soZW50cnkrMSkgJiBUWF9SSU5HX01PRF9NQVNLXS5iYXNlICE9IDApIHsKKwlscC0+dHhfZnVsbCA9IDE7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIHJldHVybiAwOworfQorCisvKiBUaGUgUENORVQzMiBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorcGNuZXQzMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscDsKKyAgICB1bnNpZ25lZCBsb25nIGlvYWRkcjsKKyAgICB1MTYgY3NyMCxyYXA7CisgICAgaW50IGJvZ3VzY250ID0gIG1heF9pbnRlcnJ1cHRfd29yazsKKyAgICBpbnQgbXVzdF9yZXN0YXJ0OworCisgICAgaWYgKCFkZXYpIHsKKwlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19JTlRSKQorCSAgICBwcmludGsgKEtFUk5fREVCVUcgIiVzKCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2VcbiIsCisJCV9fRlVOQ1RJT05fXywgaXJxKTsKKwlyZXR1cm4gSVJRX05PTkU7CisgICAgfQorCisgICAgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgbHAgPSBkZXYtPnByaXY7CisKKyAgICBzcGluX2xvY2soJmxwLT5sb2NrKTsKKworICAgIHJhcCA9IGxwLT5hLnJlYWRfcmFwKGlvYWRkcik7CisgICAgd2hpbGUgKChjc3IwID0gbHAtPmEucmVhZF9jc3IgKGlvYWRkciwgMCkpICYgMHg4ZjAwICYmIC0tYm9ndXNjbnQgPj0gMCkgeworCWlmIChjc3IwID09IDB4ZmZmZikgeworCSAgICBicmVhazsJCQkvKiBQQ01DSUEgcmVtb3ZlIGhhcHBlbmVkICovCisJfQorCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworCWxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAwLCBjc3IwICYgfjB4MDA0Zik7CisKKwltdXN0X3Jlc3RhcnQgPSAwOworCisJaWYgKG5ldGlmX21zZ19pbnRyKGxwKSkKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQgIGNzcjA9JSMyLjJ4IG5ldyBjc3I9JSMyLjJ4LlxuIiwKKwkJICAgZGV2LT5uYW1lLCBjc3IwLCBscC0+YS5yZWFkX2NzciAoaW9hZGRyLCAwKSk7CisKKwlpZiAoY3NyMCAmIDB4MDQwMCkJCS8qIFJ4IGludGVycnVwdCAqLworCSAgICBwY25ldDMyX3J4KGRldik7CisKKwlpZiAoY3NyMCAmIDB4MDIwMCkgewkJLyogVHgtZG9uZSBpbnRlcnJ1cHQgKi8KKwkgICAgdW5zaWduZWQgaW50IGRpcnR5X3R4ID0gbHAtPmRpcnR5X3R4OworCSAgICBpbnQgZGVsdGE7CisKKwkgICAgd2hpbGUgKGRpcnR5X3R4ICE9IGxwLT5jdXJfdHgpIHsKKwkJaW50IGVudHJ5ID0gZGlydHlfdHggJiBUWF9SSU5HX01PRF9NQVNLOworCQlpbnQgc3RhdHVzID0gKHNob3J0KWxlMTZfdG9fY3B1KGxwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCisJCWlmIChzdGF0dXMgPCAwKQorCQkgICAgYnJlYWs7CQkvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBUeGVkICovCisKKwkJbHAtPnR4X3JpbmdbZW50cnldLmJhc2UgPSAwOworCisJCWlmIChzdGF0dXMgJiAweDQwMDApIHsKKwkJICAgIC8qIFRoZXJlIHdhcyBhbiBtYWpvciBlcnJvciwgbG9nIGl0LiAqLworCQkgICAgaW50IGVycl9zdGF0dXMgPSBsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tlbnRyeV0ubWlzYyk7CisJCSAgICBscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCSAgICBpZiAobmV0aWZfbXNnX3R4X2VycihscCkpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUeCBlcnJvciBzdGF0dXM9JTA0eCBlcnJfc3RhdHVzPSUwOHhcbiIsCisJCQkJZGV2LT5uYW1lLCBzdGF0dXMsIGVycl9zdGF0dXMpOworCQkgICAgaWYgKGVycl9zdGF0dXMgJiAweDA0MDAwMDAwKSBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJICAgIGlmIChlcnJfc3RhdHVzICYgMHgwODAwMDAwMCkgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCSAgICBpZiAoZXJyX3N0YXR1cyAmIDB4MTAwMDAwMDApIGxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisjaWZuZGVmIERPX0RYU1VGTE8KKwkJICAgIGlmIChlcnJfc3RhdHVzICYgMHg0MDAwMDAwMCkgeworCQkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkvKiBBY2trISAgT24gRklGTyBlcnJvcnMgdGhlIFR4IHVuaXQgaXMgdHVybmVkIG9mZiEgKi8KKwkJCS8qIFJlbW92ZSB0aGlzIHZlcmJvc2l0eSBsYXRlciEgKi8KKwkJCWlmIChuZXRpZl9tc2dfdHhfZXJyKGxwKSkKKwkJCSAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBUeCBGSUZPIGVycm9yISBDU1IwPSU0LjR4XG4iLAorCQkJCSAgICBkZXYtPm5hbWUsIGNzcjApOworCQkJbXVzdF9yZXN0YXJ0ID0gMTsKKwkJICAgIH0KKyNlbHNlCisJCSAgICBpZiAoZXJyX3N0YXR1cyAmIDB4NDAwMDAwMDApIHsKKwkJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJaWYgKCEgbHAtPmR4c3VmbG8pIHsgIC8qIElmIGNvbnRyb2xsZXIgZG9lc24ndCByZWNvdmVyIC4uLiAqLworCQkJICAgIC8qIEFja2shICBPbiBGSUZPIGVycm9ycyB0aGUgVHggdW5pdCBpcyB0dXJuZWQgb2ZmISAqLworCQkJICAgIC8qIFJlbW92ZSB0aGlzIHZlcmJvc2l0eSBsYXRlciEgKi8KKwkJCSAgICBpZiAobmV0aWZfbXNnX3R4X2VycihscCkpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVHggRklGTyBlcnJvciEgQ1NSMD0lNC40eFxuIiwKKwkJCQkJZGV2LT5uYW1lLCBjc3IwKTsKKwkJCSAgICBtdXN0X3Jlc3RhcnQgPSAxOworCQkJfQorCQkgICAgfQorI2VuZGlmCisJCX0gZWxzZSB7CisJCSAgICBpZiAoc3RhdHVzICYgMHgxODAwKQorCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJICAgIGxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCX0KKworCQkvKiBXZSBtdXN0IGZyZWUgdGhlIG9yaWdpbmFsIHNrYiAqLworCQlpZiAobHAtPnR4X3NrYnVmZltlbnRyeV0pIHsKKwkJICAgIHBjaV91bm1hcF9zaW5nbGUobHAtPnBjaV9kZXYsIGxwLT50eF9kbWFfYWRkcltlbnRyeV0sCisJCQlscC0+dHhfc2tidWZmW2VudHJ5XS0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJICAgIGRldl9rZnJlZV9za2JfaXJxKGxwLT50eF9za2J1ZmZbZW50cnldKTsKKwkJICAgIGxwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJICAgIGxwLT50eF9kbWFfYWRkcltlbnRyeV0gPSAwOworCQl9CisJCWRpcnR5X3R4Kys7CisJICAgIH0KKworCSAgICBkZWx0YSA9IChscC0+Y3VyX3R4IC0gZGlydHlfdHgpICYgKFRYX1JJTkdfTU9EX01BU0sgKyBUWF9SSU5HX1NJWkUpOworCSAgICBpZiAoZGVsdGEgPiBUWF9SSU5HX1NJWkUpIHsKKwkJaWYgKG5ldGlmX21zZ19kcnYobHApKQorCQkgICAgcHJpbnRrKEtFUk5fRVJSICIlczogb3V0LW9mLXN5bmMgZGlydHkgcG9pbnRlciwgJWQgdnMuICVkLCBmdWxsPSVkLlxuIiwKKwkJCSAgICBkZXYtPm5hbWUsIGRpcnR5X3R4LCBscC0+Y3VyX3R4LCBscC0+dHhfZnVsbCk7CisJCWRpcnR5X3R4ICs9IFRYX1JJTkdfU0laRTsKKwkJZGVsdGEgLT0gVFhfUklOR19TSVpFOworCSAgICB9CisKKwkgICAgaWYgKGxwLT50eF9mdWxsICYmCisJCW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCQlkZWx0YSA8IFRYX1JJTkdfU0laRSAtIDIpIHsKKwkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIGNsZWFyIHRidXN5LiAqLworCQlscC0+dHhfZnVsbCA9IDA7CisJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJICAgIH0KKwkgICAgbHAtPmRpcnR5X3R4ID0gZGlydHlfdHg7CisJfQorCisJLyogTG9nIG1pc2MgZXJyb3JzLiAqLworCWlmIChjc3IwICYgMHg0MDAwKSBscC0+c3RhdHMudHhfZXJyb3JzKys7IC8qIFR4IGJhYmJsZS4gKi8KKwlpZiAoY3NyMCAmIDB4MTAwMCkgeworCSAgICAvKgorCSAgICAgKiB0aGlzIGhhcHBlbnMgd2hlbiBvdXIgcmVjZWl2ZSByaW5nIGlzIGZ1bGwuIFRoaXMgc2hvdWxkbid0CisJICAgICAqIGJlIGEgcHJvYmxlbSBhcyB3ZSB3aWxsIHNlZSBub3JtYWwgcnggaW50ZXJydXB0cyBmb3IgdGhlIGZyYW1lcworCSAgICAgKiBpbiB0aGUgcmVjZWl2ZSByaW5nLiBCdXQgdGhlcmUgYXJlIHNvbWUgUENJIGNoaXBzZXRzIChJIGNhbgorCSAgICAgKiByZXByb2R1Y2UgdGhpcyBvbiBTUDNHIHdpdGggSW50ZWwgc2F0dXJuIGNoaXBzZXQpIHdoaWNoIGhhdmUKKwkgICAgICogc29tZXRpbWVzIHByb2JsZW1zIGFuZCB3aWxsIGZpbGwgdXAgdGhlIHJlY2VpdmUgcmluZyB3aXRoCisJICAgICAqIGVycm9yIGRlc2NyaXB0b3JzLiBJbiB0aGlzIHNpdHVhdGlvbiB3ZSBkb24ndCBnZXQgYSByeAorCSAgICAgKiBpbnRlcnJ1cHQsIGJ1dCBhIG1pc3NlZCBmcmFtZSBpbnRlcnJ1cHQgc29vbmVyIG9yIGxhdGVyLgorCSAgICAgKiBTbyB3ZSB0cnkgdG8gY2xlYW4gdXAgb3VyIHJlY2VpdmUgcmluZyBoZXJlLgorCSAgICAgKi8KKwkgICAgcGNuZXQzMl9yeChkZXYpOworCSAgICBscC0+c3RhdHMucnhfZXJyb3JzKys7IC8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLworCX0KKwlpZiAoY3NyMCAmIDB4MDgwMCkgeworCSAgICBpZiAobmV0aWZfbXNnX2RydihscCkpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gZmFpbHVyZSwgc3RhdHVzICU0LjR4LlxuIiwKKwkJCWRldi0+bmFtZSwgY3NyMCk7CisJICAgIC8qIHVubGlrZSBmb3IgdGhlIGxhbmNlLCB0aGVyZSBpcyBubyByZXN0YXJ0IG5lZWRlZCAqLworCX0KKworCWlmIChtdXN0X3Jlc3RhcnQpIHsKKwkgICAgLyogcmVzZXQgdGhlIGNoaXAgdG8gY2xlYXIgdGhlIGVycm9yIGNvbmRpdGlvbiwgdGhlbiByZXN0YXJ0ICovCisJICAgIGxwLT5hLnJlc2V0KGlvYWRkcik7CisJICAgIGxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDQsIDB4MDkxNSk7CisJICAgIHBjbmV0MzJfcmVzdGFydChkZXYsIDB4MDAwMik7CisJICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisgICAgfQorCisgICAgLyogU2V0IGludGVycnVwdCBlbmFibGUuICovCisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDAsIDB4MDA0MCk7CisgICAgbHAtPmEud3JpdGVfcmFwIChpb2FkZHIscmFwKTsKKworICAgIGlmIChuZXRpZl9tc2dfaW50cihscCkpCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGludGVycnVwdCwgY3NyMD0lIzQuNHguXG4iLAorCQlkZXYtPm5hbWUsIGxwLT5hLnJlYWRfY3NyIChpb2FkZHIsIDApKTsKKworICAgIHNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQKK3BjbmV0MzJfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICBpbnQgZW50cnkgPSBscC0+Y3VyX3J4ICYgUlhfUklOR19NT0RfTUFTSzsKKyAgICBpbnQgYm9ndXNjbnQgPSBSWF9SSU5HX1NJWkUgLyAyOworCisgICAgLyogSWYgd2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKyAgICB3aGlsZSAoKHNob3J0KWxlMTZfdG9fY3B1KGxwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpID49IDApIHsKKwlpbnQgc3RhdHVzID0gKHNob3J0KWxlMTZfdG9fY3B1KGxwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpID4+IDg7CisKKwlpZiAoc3RhdHVzICE9IDB4MDMpIHsJCQkvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCisJICAgIC8qCisJICAgICAqIFRoZXJlIGlzIGEgdHJpY2t5IGVycm9yIG5vdGVkIGJ5IEpvaG4gTXVycGh5LAorCSAgICAgKiA8bXVyZkBwZXJmdGVjaC5jb20+IHRvIFJ1c3MgTmVsc29uOiBFdmVuIHdpdGggZnVsbC1zaXplZAorCSAgICAgKiBidWZmZXJzIGl0J3MgcG9zc2libGUgZm9yIGEgamFiYmVyIHBhY2tldCB0byB1c2UgdHdvCisJICAgICAqIGJ1ZmZlcnMsIHdpdGggb25seSB0aGUgbGFzdCBjb3JyZWN0bHkgbm90aW5nIHRoZSBlcnJvci4KKwkgICAgICovCisJICAgIGlmIChzdGF0dXMgJiAweDAxKQkvKiBPbmx5IGNvdW50IGEgZ2VuZXJhbCBlcnJvciBhdCB0aGUgKi8KKwkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBlbmQgb2YgYSBwYWNrZXQuKi8KKwkgICAgaWYgKHN0YXR1cyAmIDB4MjApIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkgICAgaWYgKHN0YXR1cyAmIDB4MTApIGxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCSAgICBpZiAoc3RhdHVzICYgMHgwOCkgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkgICAgaWYgKHN0YXR1cyAmIDB4MDQpIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCSAgICBscC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzICY9IGxlMTZfdG9fY3B1KDB4MDNmZik7CisJfSBlbHNlIHsKKwkgICAgLyogTWFsbG9jIHVwIG5ldyBidWZmZXIsIGNvbXBhdGlibGUgd2l0aCBuZXQtMmUuICovCisJICAgIHNob3J0IHBrdF9sZW4gPSAobGUzMl90b19jcHUobHAtPnJ4X3JpbmdbZW50cnldLm1zZ19sZW5ndGgpICYgMHhmZmYpLTQ7CisJICAgIHN0cnVjdCBza19idWZmICpza2I7CisKKwkgICAgLyogRGlzY2FyZCBvdmVyc2l6ZSBmcmFtZXMuICovCisJICAgIGlmICh1bmxpa2VseShwa3RfbGVuID4gUEtUX0JVRl9TWiAtIDIpKSB7CisJCWlmIChuZXRpZl9tc2dfZHJ2KGxwKSkKKwkJICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IEltcG9zc2libGUgcGFja2V0IHNpemUgJWQhXG4iLAorCQkJICAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkgICAgfSBlbHNlIGlmIChwa3RfbGVuIDwgNjApIHsKKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIobHApKQorCQkgICAgcHJpbnRrKEtFUk5fRVJSICIlczogUnVudCBwYWNrZXQhXG4iLCBkZXYtPm5hbWUpOworCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJICAgIH0gZWxzZSB7CisJCWludCByeF9pbl9wbGFjZSA9IDA7CisKKwkJaWYgKHBrdF9sZW4gPiByeF9jb3B5YnJlYWspIHsKKwkJICAgIHN0cnVjdCBza19idWZmICpuZXdza2I7CisKKwkJICAgIGlmICgobmV3c2tiID0gZGV2X2FsbG9jX3NrYihQS1RfQlVGX1NaKSkpIHsKKwkJCXNrYl9yZXNlcnZlIChuZXdza2IsIDIpOworCQkJc2tiID0gbHAtPnJ4X3NrYnVmZltlbnRyeV07CisJCQlwY2lfdW5tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCBscC0+cnhfZG1hX2FkZHJbZW50cnldLAorCQkJCVBLVF9CVUZfU1otMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNrYl9wdXQgKHNrYiwgcGt0X2xlbik7CisJCQlscC0+cnhfc2tidWZmW2VudHJ5XSA9IG5ld3NrYjsKKwkJCW5ld3NrYi0+ZGV2ID0gZGV2OworCQkJbHAtPnJ4X2RtYV9hZGRyW2VudHJ5XSA9CisJCQkgICAgcGNpX21hcF9zaW5nbGUobHAtPnBjaV9kZXYsIG5ld3NrYi0+dGFpbCwKKwkJCQkgICAgUEtUX0JVRl9TWi0yLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJbHAtPnJ4X3JpbmdbZW50cnldLmJhc2UgPSBsZTMyX3RvX2NwdShscC0+cnhfZG1hX2FkZHJbZW50cnldKTsKKwkJCXJ4X2luX3BsYWNlID0gMTsKKwkJICAgIH0gZWxzZQorCQkJc2tiID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJICAgIHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbisyKTsKKwkJfQorCisJCWlmIChza2IgPT0gTlVMTCkgeworCQkgICAgaW50IGk7CisJCSAgICBpZiAobmV0aWZfbXNnX2RydihscCkpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJICAgIGZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykKKwkJCWlmICgoc2hvcnQpbGUxNl90b19jcHUobHAtPnJ4X3JpbmdbKGVudHJ5K2kpCisJCQkJICAgICYgUlhfUklOR19NT0RfTUFTS10uc3RhdHVzKSA8IDApCisJCQkgICAgYnJlYWs7CisKKwkJICAgIGlmIChpID4gUlhfUklOR19TSVpFIC0yKSB7CisJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJbHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyB8PSBsZTE2X3RvX2NwdSgweDgwMDApOworCQkJd21iKCk7CS8qIE1ha2Ugc3VyZSBhZGFwdGVyIHNlZXMgb3duZXIgY2hhbmdlICovCisJCQlscC0+Y3VyX3J4Kys7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJfQorCQlza2ItPmRldiA9IGRldjsKKwkJaWYgKCFyeF9pbl9wbGFjZSkgeworCQkgICAgc2tiX3Jlc2VydmUoc2tiLDIpOyAvKiAxNiBieXRlIGFsaWduICovCisJCSAgICBza2JfcHV0KHNrYixwa3RfbGVuKTsJLyogTWFrZSByb29tICovCisJCSAgICBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobHAtPnBjaV9kZXYsCisJCQkJCQlscC0+cnhfZG1hX2FkZHJbZW50cnldLAorCQkJCQkJUEtUX0JVRl9TWi0yLAorCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJICAgIGV0aF9jb3B5X2FuZF9zdW0oc2tiLAorCQkJICAgICh1bnNpZ25lZCBjaGFyICopKGxwLT5yeF9za2J1ZmZbZW50cnldLT50YWlsKSwKKwkJCSAgICBwa3RfbGVuLDApOworCQkgICAgcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGxwLT5wY2lfZGV2LAorCQkJCQkJICAgbHAtPnJ4X2RtYV9hZGRyW2VudHJ5XSwKKwkJCQkJCSAgIFBLVF9CVUZfU1otMiwKKwkJCQkJCSAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCX0KKwkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQluZXRpZl9yeChza2IpOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCSAgICB9CisJfQorCS8qCisJICogVGhlIGRvY3Mgc2F5IHRoYXQgdGhlIGJ1ZmZlciBsZW5ndGggaXNuJ3QgdG91Y2hlZCwgYnV0IEFuZHJldyBCb3lkCisJICogb2YgUU5YIHJlcG9ydHMgdGhhdCBzb21lIHJldnMgb2YgdGhlIDc5Qzk2NSBjbGVhciBpdC4KKwkgKi8KKwlscC0+cnhfcmluZ1tlbnRyeV0uYnVmX2xlbmd0aCA9IGxlMTZfdG9fY3B1KDItUEtUX0JVRl9TWik7CisJd21iKCk7IC8qIE1ha2Ugc3VyZSBvd25lciBjaGFuZ2VzIGFmdGVyIGFsbCBvdGhlcnMgYXJlIHZpc2libGUgKi8KKwlscC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzIHw9IGxlMTZfdG9fY3B1KDB4ODAwMCk7CisJZW50cnkgPSAoKytscC0+Y3VyX3J4KSAmIFJYX1JJTkdfTU9EX01BU0s7CisJaWYgKC0tYm9ndXNjbnQgPD0gMCkgYnJlYWs7CS8qIGRvbid0IHN0YXkgaW4gbG9vcCBmb3JldmVyICovCisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BjbmV0MzJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICB1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIGludCBpOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBkZWxfdGltZXJfc3luYygmbHAtPndhdGNoZG9nX3RpbWVyKTsKKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgbHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBscC0+YS5yZWFkX2NzciAoaW9hZGRyLCAxMTIpOworCisgICAgaWYgKG5ldGlmX21zZ19pZmRvd24obHApKQorCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgJTIuMnguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGxwLT5hLnJlYWRfY3NyIChpb2FkZHIsIDApKTsKKworICAgIC8qIFdlIHN0b3AgdGhlIFBDTkVUMzIgaGVyZSAtLSBpdCBvY2Nhc2lvbmFsbHkgcG9sbHMgbWVtb3J5IGlmIHdlIGRvbid0LiAqLworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAwLCAweDAwMDQpOworCisgICAgLyoKKyAgICAgKiBTd2l0Y2ggYmFjayB0byAxNmJpdCBtb2RlIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggZHVtYgorICAgICAqIERPUyBwYWNrZXQgZHJpdmVyIGFmdGVyIGEgd2FybSByZWJvb3QKKyAgICAgKi8KKyAgICBscC0+YS53cml0ZV9iY3IgKGlvYWRkciwgMjAsIDQpOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIGZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKyAgICAvKiBmcmVlIGFsbCBhbGxvY2F0ZWQgc2tidWZmcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCWxwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJd21iKCk7CQkvKiBNYWtlIHN1cmUgYWRhcHRlciBzZWVzIG93bmVyIGNoYW5nZSAqLworCWlmIChscC0+cnhfc2tidWZmW2ldKSB7CisJICAgIHBjaV91bm1hcF9zaW5nbGUobHAtPnBjaV9kZXYsIGxwLT5yeF9kbWFfYWRkcltpXSwgUEtUX0JVRl9TWi0yLAorCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkgICAgZGV2X2tmcmVlX3NrYihscC0+cnhfc2tidWZmW2ldKTsKKwl9CisJbHAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJbHAtPnJ4X2RtYV9hZGRyW2ldID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwlscC0+dHhfcmluZ1tpXS5zdGF0dXMgPSAwOwkvKiBDUFUgb3ducyBidWZmZXIgKi8KKwl3bWIoKTsJCS8qIE1ha2Ugc3VyZSBhZGFwdGVyIHNlZXMgb3duZXIgY2hhbmdlICovCisJaWYgKGxwLT50eF9za2J1ZmZbaV0pIHsKKwkgICAgcGNpX3VubWFwX3NpbmdsZShscC0+cGNpX2RldiwgbHAtPnR4X2RtYV9hZGRyW2ldLAorCQkgICAgbHAtPnR4X3NrYnVmZltpXS0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkgICAgZGV2X2tmcmVlX3NrYihscC0+dHhfc2tidWZmW2ldKTsKKwl9CisJbHAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJbHAtPnR4X2RtYV9hZGRyW2ldID0gMDsKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitwY25ldDMyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdTE2IHNhdmVkX2FkZHI7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIHNhdmVkX2FkZHIgPSBscC0+YS5yZWFkX3JhcChpb2FkZHIpOworICAgIGxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gbHAtPmEucmVhZF9jc3IgKGlvYWRkciwgMTEyKTsKKyAgICBscC0+YS53cml0ZV9yYXAoaW9hZGRyLCBzYXZlZF9hZGRyKTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qIHRha2VuIGZyb20gdGhlIHN1bmxhbmNlIGRyaXZlciwgd2hpY2ggaXQgdG9vayBmcm9tIHRoZSBkZXBjYSBkcml2ZXIgKi8KK3N0YXRpYyB2b2lkIHBjbmV0MzJfbG9hZF9tdWx0aWNhc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdm9sYXRpbGUgc3RydWN0IHBjbmV0MzJfaW5pdF9ibG9jayAqaWIgPSAmbHAtPmluaXRfYmxvY2s7CisgICAgdm9sYXRpbGUgdTE2ICptY2FzdF90YWJsZSA9ICh1MTYgKikmaWItPmZpbHRlcjsKKyAgICBzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaT1kZXYtPm1jX2xpc3Q7CisgICAgY2hhciAqYWRkcnM7CisgICAgaW50IGk7CisgICAgdTMyIGNyYzsKKworICAgIC8qIHNldCBhbGwgbXVsdGljYXN0IGJpdHMgKi8KKyAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCWliLT5maWx0ZXJbMF0gPSAweGZmZmZmZmZmOworCWliLT5maWx0ZXJbMV0gPSAweGZmZmZmZmZmOworCXJldHVybjsKKyAgICB9CisgICAgLyogY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgKi8KKyAgICBpYi0+ZmlsdGVyWzBdID0gMDsKKyAgICBpYi0+ZmlsdGVyWzFdID0gMDsKKworICAgIC8qIEFkZCBhZGRyZXNzZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrKSB7CisJYWRkcnMgPSBkbWktPmRtaV9hZGRyOworCWRtaSAgID0gZG1pLT5uZXh0OworCisJLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCisJaWYgKCEoKmFkZHJzICYgMSkpCisJICAgIGNvbnRpbnVlOworCisJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwljcmMgPSBjcmMgPj4gMjY7CisJbWNhc3RfdGFibGUgW2NyYyA+PiA0XSA9IGxlMTZfdG9fY3B1KAorCQlsZTE2X3RvX2NwdShtY2FzdF90YWJsZSBbY3JjID4+IDRdKSB8ICgxIDw8IChjcmMgJiAweGYpKSk7CisgICAgfQorICAgIHJldHVybjsKK30KKworCisvKgorICogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgKi8KK3N0YXRpYyB2b2lkIHBjbmV0MzJfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciwgZmxhZ3M7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICBpZiAoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykgeworCS8qIExvZyBhbnkgbmV0IHRhcHMuICovCisJaWYgKG5ldGlmX21zZ19odyhscCkpCisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUpOworCWxwLT5pbml0X2Jsb2NrLm1vZGUgPSBsZTE2X3RvX2NwdSgweDgwMDAgfCAobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfUE9SVFNFTCkgPDwgNyk7CisgICAgfSBlbHNlIHsKKwlscC0+aW5pdF9ibG9jay5tb2RlID0gbGUxNl90b19jcHUoKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX1BPUlRTRUwpIDw8IDcpOworCXBjbmV0MzJfbG9hZF9tdWx0aWNhc3QgKGRldik7CisgICAgfQorCisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDAsIDB4MDAwNCk7IC8qIFRlbXBvcmFyaWx5IHN0b3AgdGhlIGxhbmNlLiAqLworICAgIHBjbmV0MzJfcmVzdGFydChkZXYsIDB4MDA0Mik7IC8qICBSZXN1bWUgbm9ybWFsIG9wZXJhdGlvbiAqLworICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgdGhlIGxwLT5sb2NrIGlzIGhlbGQgKi8KK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCByZWdfbnVtKQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdTE2IHZhbF9vdXQ7CisKKyAgICBpZiAoIWxwLT5taWkpCisJcmV0dXJuIDA7CisKKyAgICBscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMywgKChwaHlfaWQgJiAweDFmKSA8PCA1KSB8IChyZWdfbnVtICYgMHgxZikpOworICAgIHZhbF9vdXQgPSBscC0+YS5yZWFkX2Jjcihpb2FkZHIsIDM0KTsKKworICAgIHJldHVybiB2YWxfb3V0OworfQorCisvKiBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IHRoZSBscC0+bG9jayBpcyBoZWxkICovCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCByZWdfbnVtLCBpbnQgdmFsKQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBpZiAoIWxwLT5taWkpCisJcmV0dXJuOworCisgICAgbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzMsICgocGh5X2lkICYgMHgxZikgPDwgNSkgfCAocmVnX251bSAmIDB4MWYpKTsKKyAgICBscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzNCwgdmFsKTsKK30KKworc3RhdGljIGludCBwY25ldDMyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgaW50IHJjOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAvKiBTSU9DW0dTXU1JSXh4eCBpb2N0bHMgKi8KKyAgICBpZiAobHAtPm1paSkgeworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJmxwLT5taWlfaWYsIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICB9IGVsc2UgeworCXJjID0gLUVPUE5PVFNVUFA7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIC8qIFByaW50IHRoZSBsaW5rIHN0YXR1cyBpZiBpdCBoYXMgY2hhbmdlZCAqLworICAgIGlmIChscC0+bWlpKSB7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJbWlpX2NoZWNrX21lZGlhICgmbHAtPm1paV9pZiwgbmV0aWZfbXNnX2xpbmsobHApLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIH0KKworICAgIG1vZF90aW1lciAoJihscC0+d2F0Y2hkb2dfdGltZXIpLCBQQ05FVDMyX1dBVENIRE9HX1RJTUVPVVQpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcGNuZXQzMl9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKyAgICBpZiAoZGV2KSB7CisJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBQQ05FVDMyX1RPVEFMX1NJWkUpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsIHNpemVvZigqbHApLCBscCwgbHAtPmRtYV9hZGRyKTsKKwlmcmVlX25ldGRldihkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisgICAgfQorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGNuZXQzMl9kcml2ZXIgPSB7CisgICAgLm5hbWUJPSBEUlZfTkFNRSwKKyAgICAucHJvYmUJPSBwY25ldDMyX3Byb2JlX3BjaSwKKyAgICAucmVtb3ZlCT0gX19kZXZleGl0X3AocGNuZXQzMl9yZW1vdmVfb25lKSwKKyAgICAuaWRfdGFibGUJPSBwY25ldDMyX3BjaV90YmwsCit9OworCisvKiBBbiBhZGRpdGlvbmFsIHBhcmFtZXRlciB0aGF0IG1heSBiZSBwYXNzZWQgaW4uLi4gKi8KK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsKK3N0YXRpYyBpbnQgdHhfc3RhcnRfcHQgPSAtMTsKK3N0YXRpYyBpbnQgcGNuZXQzMl9oYXZlX3BjaTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgRFJWX05BTUUgIiBkZWJ1ZyBsZXZlbCIpOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2ludGVycnVwdF93b3JrLCBEUlZfTkFNRSAiIG1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfY29weWJyZWFrLCBEUlZfTkFNRSAiIGNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7Cittb2R1bGVfcGFyYW0odHhfc3RhcnRfcHQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHR4X3N0YXJ0X3B0LCBEUlZfTkFNRSAiIHRyYW5zbWl0IHN0YXJ0IHBvaW50ICgwLTMpIik7Cittb2R1bGVfcGFyYW0ocGNuZXQzMnZsYiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGNuZXQzMnZsYiwgRFJWX05BTUUgIiBWZXNhIGxvY2FsIGJ1cyAoVkxCKSBzdXBwb3J0ICgwLzEpIik7Cittb2R1bGVfcGFyYW1fYXJyYXkob3B0aW9ucywgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mob3B0aW9ucywgRFJWX05BTUUgIiBpbml0aWFsIG9wdGlvbiBzZXR0aW5nKHMpICgwLTE1KSIpOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhmdWxsX2R1cGxleCwgRFJWX05BTUUgIiBmdWxsIGR1cGxleCBzZXR0aW5nKHMpICgxKSIpOworLyogTW9kdWxlIFBhcmFtZXRlciBmb3IgSG9tZVBOQSBjYXJkcyBhZGRlZCBieSBQYXRyaWNrIFNpbW1vbnMsIDIwMDQgKi8KK21vZHVsZV9wYXJhbV9hcnJheShob21lcG5hLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhob21lcG5hLCBEUlZfTkFNRSAiIG1vZGUgZm9yIDc5Qzk3OCBjYXJkcyAoMSBmb3IgSG9tZVBOQSwgMCBmb3IgRXRoZXJuZXQsIGRlZmF1bHQgRXRoZXJuZXQiKTsKKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIEJvZ2VuZG9lcmZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFBDbmV0MzIgYW5kIFBDbmV0UENJIGJhc2VkIGV0aGVyY2FyZHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBQQ05FVDMyX01TR19ERUZBVUxUIChORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX1BST0JFIHwgTkVUSUZfTVNHX0xJTkspCisKK3N0YXRpYyBpbnQgX19pbml0IHBjbmV0MzJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKyAgICBwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisgICAgcGNuZXQzMl9kZWJ1ZyA9IG5ldGlmX21zZ19pbml0KGRlYnVnLCBQQ05FVDMyX01TR19ERUZBVUxUKTsKKworICAgIGlmICgodHhfc3RhcnRfcHQgPj0gMCkgJiYgKHR4X3N0YXJ0X3B0IDw9IDMpKQorCXR4X3N0YXJ0ID0gdHhfc3RhcnRfcHQ7CisKKyAgICAvKiBmaW5kIHRoZSBQQ0kgZGV2aWNlcyAqLworICAgIGlmICghcGNpX21vZHVsZV9pbml0KCZwY25ldDMyX2RyaXZlcikpCisJcGNuZXQzMl9oYXZlX3BjaSA9IDE7CisKKyAgICAvKiBzaG91bGQgd2UgZmluZCBhbnkgcmVtYWluaW5nIFZMYnVzIGRldmljZXMgPyAqLworICAgIGlmIChwY25ldDMydmxiKQorCXBjbmV0MzJfcHJvYmVfdmxidXMoKTsKKworICAgIGlmIChjYXJkc19mb3VuZCAmJiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkpCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVkIGNhcmRzX2ZvdW5kLlxuIiwgY2FyZHNfZm91bmQpOworCisgICAgcmV0dXJuIChwY25ldDMyX2hhdmVfcGNpICsgY2FyZHNfZm91bmQpID8gMCA6IC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwY25ldDMyX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5leHRfZGV2OworCisgICAgd2hpbGUgKHBjbmV0MzJfZGV2KSB7CisJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBwY25ldDMyX2Rldi0+cHJpdjsKKwluZXh0X2RldiA9IGxwLT5uZXh0OworCXVucmVnaXN0ZXJfbmV0ZGV2KHBjbmV0MzJfZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihwY25ldDMyX2Rldi0+YmFzZV9hZGRyLCBQQ05FVDMyX1RPVEFMX1NJWkUpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsIHNpemVvZigqbHApLCBscCwgbHAtPmRtYV9hZGRyKTsKKwlmcmVlX25ldGRldihwY25ldDMyX2Rldik7CisJcGNuZXQzMl9kZXYgPSBuZXh0X2RldjsKKyAgICB9CisKKyAgICBpZiAocGNuZXQzMl9oYXZlX3BjaSkKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBjbmV0MzJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGNuZXQzMl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChwY25ldDMyX2NsZWFudXBfbW9kdWxlKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWluZGVudC1sZXZlbDogNAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wbGlwLmMgYi9kcml2ZXJzL25ldC9wbGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiNjI0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BsaXAuYwpAQCAtMCwwICsxLDE0MjcgQEAKKy8qICRJZDogcGxpcC5jLHYgMS4zLjYuMiAxOTk3LzA0LzE2IDE1OjA3OjU2IHBoaWwgRXhwICQgKi8KKy8qIFBMSVA6IEEgcGFyYWxsZWwgcG9ydCAibmV0d29yayIgZHJpdmVyIGZvciBMaW51eC4gKi8KKy8qIFRoaXMgZHJpdmVyIGlzIGZvciBwYXJhbGxlbCBwb3J0IHdpdGggNS1iaXQgY2FibGUgKExhcExpbmsgKFIpIGNhYmxlKS4gKi8KKy8qCisgKiBBdXRob3JzOglEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPgorICoJCVRvbW15IFRob3JuIDx0aG9ybkBkYWltaS5hYXUuZGs+CisgKgkJVGFuYWJlIEhpcm95YXN1IDxoaXJvQHNhbnBvLnQudS10b2t5by5hYy5qcD4KKyAqCQlBbGFuIENveCA8Z3c0cHRzQGd3NHB0cy5hbXByLm9yZz4KKyAqCQlQZXRlciBCYXVlciA8MTAwMTM2LjM1MzBAY29tcHVzZXJ2ZS5jb20+CisgKgkJTmlpYmUgWXV0YWthIDxnbmlpYmVAbXJpLmNvLmpwPgorICoJCU5pbXJvZCBaaW1lcm1hbiA8emltZXJtYW5AbWFpbGFuZG5ld3MuY29tPgorICoKKyAqIEVuaGFuY2VtZW50czoKKyAqCQlNb2R1bGFyaXphdGlvbiBhbmQgaWZyZXEvaWZtYXAgc3VwcG9ydCBieSBBbGFuIENveC4KKyAqCQlSZXdyaXR0ZW4gYnkgTmlpYmUgWXV0YWthLgorICoJCXBhcnBvcnQtc2hhcmluZyBhd2FyZW5lc3MgY29kZSBieSBQaGlsaXAgQmx1bmRlbGwuCisgKgkJU01QIGxvY2tpbmcgYnkgTmlpYmUgWXV0YWthLgorICoJCVN1cHBvcnQgZm9yIHBhcmFsbGVsIHBvcnRzIHdpdGggbm8gSVJRIChwb2xsIG1vZGUpLAorICoJCU1vZGlmaWNhdGlvbnMgdG8gdXNlIHRoZSBwYXJhbGxlbCBwb3J0IEFQSSAKKyAqCQlieSBOaW1yb2QgWmltZXJtYW4uCisgKgorICogRml4ZXM6CisgKgkJTmlpYmUgWXV0YWthCisgKgkJICAtIE1vZHVsZSBpbml0aWFsaXphdGlvbi4KKyAqCQkgIC0gTVRVIGZpeC4KKyAqCQkgIC0gTWFrZSBzdXJlIG90aGVyIGVuZCBpcyBPSywgYmVmb3JlIHNlbmRpbmcgYSBwYWNrZXQuCisgKgkJICAtIEZpeCBpbW1lZGlhdGUgdGltZXIgcHJvYmxlbS4KKyAqCisgKgkJQWwgVmlybworICoJCSAgLSBDaGFuZ2VkIHtlbmFibGUsZGlzYWJsZX1faXJxIGhhbmRsaW5nIHRvIG1ha2UgaXQgd29yaworICoJCSAgICB3aXRoIG5ldyAoInN0YWNrIikgc2VtYW50aWNzLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qCisgKiBPcmlnaW5hbCB2ZXJzaW9uIGFuZCB0aGUgbmFtZSAnUExJUCcgZnJvbSBEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPgorICogaW5zcGlyZWQgYnkgUnVzcyBOZWxzb24ncyBwYXJhbGxlbCBwb3J0IHBhY2tldCBkcml2ZXIuCisgKgorICogTk9URToKKyAqICAgICBUYW5hYmUgSGlyb3lhc3UgaGFkIGNoYW5nZWQgdGhlIHByb3RvY29sLCBhbmQgaXQgd2FzIGluIExpbnV4IHYxLjAuCisgKiAgICAgQmVjYXVzZSBvZiB0aGUgbmVjZXNzaXR5IHRvIGNvbW11bmljYXRlIHRvIERPUyBtYWNoaW5lcyB3aXRoIHRoZQorICogICAgIENyeW53ciBwYWNrZXQgZHJpdmVyLCBQZXRlciBCYXVlciBjaGFuZ2VkIHRoZSBwcm90b2NvbCBhZ2FpbgorICogICAgIGJhY2sgdG8gb3JpZ2luYWwgcHJvdG9jb2wuCisgKgorICogICAgIFRoaXMgdmVyc2lvbiBmb2xsb3dzIG9yaWdpbmFsIFBMSVAgcHJvdG9jb2wuCisgKiAgICAgU28sIHRoaXMgUExJUCBjYW4ndCBjb21tdW5pY2F0ZSB0aGUgUExJUCBvZiBMaW51eCB2MS4wLgorICovCisKKy8qCisgKiAgICAgVG8gdXNlIHdpdGggRE9TIGJveCwgcGxlYXNlIGRvIChUdXJuIG9uIEFSUCBzd2l0Y2gpOgorICoJIyBpZmNvbmZpZyBwbGlwWzAtMl0gYXJwCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9ICJORVQzIFBMSVAgdmVyc2lvbiAyLjQtcGFycG9ydCBnbmlpYmVAbXJpLmNvLmpwXG4iOworCisvKgorICBTb3VyY2VzOgorCUlkZWFzIGFuZCBwcm90b2NvbHMgY2FtZSBmcm9tIFJ1c3MgTmVsc29uJ3MgPG5lbHNvbkBjcnlud3IuY29tPgorCSJwYXJhbGxlbC5hc20iIHBhcmFsbGVsIHBvcnQgcGFja2V0IGRyaXZlci4KKworICBUaGUgIkNyeW53ciIgcGFyYWxsZWwgcG9ydCBzdGFuZGFyZCBzcGVjaWZpZXMgdGhlIGZvbGxvd2luZyBwcm90b2NvbDoKKyAgICBUcmlnZ2VyIGJ5IHNlbmRpbmcgbmliYmxlICcweDgnICh0aGlzIGNhdXNlcyBpbnRlcnJ1cHQgb24gb3RoZXIgZW5kKQorICAgIGNvdW50LWxvdyBvY3RldAorICAgIGNvdW50LWhpZ2ggb2N0ZXQKKyAgICAuLi4gZGF0YSBvY3RldHMKKyAgICBjaGVja3N1bSBvY3RldAorICBFYWNoIG9jdGV0IGlzIHNlbnQgYXMgPHdhaXQgZm9yIHJ4LiAnMHgxPyc+IDxzZW5kIDB4MTArKG9jdGV0JjB4MEYpPgorCQkJPHdhaXQgZm9yIHJ4LiAnMHgwPyc+IDxzZW5kIDB4MDArKChvY3RldD4+NCkmMHgwRik+CisKKyAgVGhlIHBhY2tldCBpcyBlbmNhcHN1bGF0ZWQgYXMgaWYgaXQgd2VyZSBldGhlcm5ldC4KKworICBUaGUgY2FibGUgdXNlZCBpcyBhIGRlIGZhY3RvIHN0YW5kYXJkIHBhcmFsbGVsIG51bGwgY2FibGUgLS0gc29sZCBhcworICBhICJMYXBMaW5rIiBjYWJsZSBieSB2YXJpb3VzIHBsYWNlcy4gIFlvdSdsbCBuZWVkIGEgMTItY29uZHVjdG9yIGNhYmxlIHRvCisgIG1ha2Ugb25lIHlvdXJzZWxmLiAgVGhlIHdpcmluZyBpczoKKyAgICBTTENUSU4JMTcgLSAxNworICAgIEdST1VORAkyNSAtIDI1CisgICAgRDAtPkVSUk9SCTIgLSAxNQkJMTUgLSAyCisgICAgRDEtPlNMQ1QJMyAtIDEzCQkxMyAtIDMKKyAgICBEMi0+UEFQT1VUCTQgLSAxMgkJMTIgLSA0CisgICAgRDMtPkFDSwk1IC0gMTAJCTEwIC0gNQorICAgIEQ0LT5CVVNZCTYgLSAxMQkJMTEgLSA2CisgIERvIG5vdCBjb25uZWN0IHRoZSBvdGhlciBwaW5zLiAgVGhleSBhcmUKKyAgICBENSxENixENyBhcmUgNyw4LDkKKyAgICBTVFJPQkUgaXMgMSwgRkVFRCBpcyAxNCwgSU5JVCBpcyAxNgorICAgIGV4dHJhIGdyb3VuZHMgYXJlIDE4LDE5LDIwLDIxLDIyLDIzLDI0CisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcGxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzIHRvIHN1cHBvcnQuICovCisjZGVmaW5lIFBMSVBfTUFYICA4CisKKy8qIFVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLworI2lmbmRlZiBORVRfREVCVUcKKyNkZWZpbmUgTkVUX0RFQlVHIDEKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludCBuZXRfZGVidWcgPSBORVRfREVCVUc7CisKKyNkZWZpbmUgRU5BQkxFKGlycSkgIGlmIChpcnEgIT0gLTEpIGVuYWJsZV9pcnEoaXJxKQorI2RlZmluZSBESVNBQkxFKGlycSkgaWYgKGlycSAhPSAtMSkgZGlzYWJsZV9pcnEoaXJxKQorCisvKiBJbiBtaWNybyBzZWNvbmQgKi8KKyNkZWZpbmUgUExJUF9ERUxBWV9VTklUCQkgICAxCisKKy8qIENvbm5lY3Rpb24gdGltZSBvdXQgPSBQTElQX1RSSUdHRVJfV0FJVCAqIFBMSVBfREVMQVlfVU5JVCB1c2VjICovCisjZGVmaW5lIFBMSVBfVFJJR0dFUl9XQUlUCSA1MDAKKworLyogTmliYmxlIHRpbWUgb3V0ID0gUExJUF9OSUJCTEVfV0FJVCAqIFBMSVBfREVMQVlfVU5JVCB1c2VjICovCisjZGVmaW5lIFBMSVBfTklCQkxFX1dBSVQgICAgICAgIDMwMDAKKworLyogQm90dG9tIGhhbHZlcyAqLworc3RhdGljIHZvaWQgcGxpcF9raWNrX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcGxpcF9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHBsaXBfdGltZXJfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgdm9pZCBwbGlwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworLyogRnVuY3Rpb25zIGZvciBERVYgbWV0aG9kcyAqLworc3RhdGljIGludCBwbGlwX3R4X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcGxpcF9oYXJkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pOworc3RhdGljIGludCBwbGlwX2hhcmRfaGVhZGVyX2NhY2hlKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBoaF9jYWNoZSAqaGgpOworc3RhdGljIGludCBwbGlwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHBsaXBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBsaXBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBwbGlwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgcGxpcF9wcmVlbXB0KHZvaWQgKmhhbmRsZSk7CitzdGF0aWMgdm9pZCBwbGlwX3dha2V1cCh2b2lkICpoYW5kbGUpOworDAorZW51bSBwbGlwX2Nvbm5lY3Rpb25fc3RhdGUgeworCVBMSVBfQ05fTk9ORT0wLAorCVBMSVBfQ05fUkVDRUlWRSwKKwlQTElQX0NOX1NFTkQsCisJUExJUF9DTl9DTE9TSU5HLAorCVBMSVBfQ05fRVJST1IKK307CisKK2VudW0gcGxpcF9wYWNrZXRfc3RhdGUgeworCVBMSVBfUEtfRE9ORT0wLAorCVBMSVBfUEtfVFJJR0dFUiwKKwlQTElQX1BLX0xFTkdUSF9MU0IsCisJUExJUF9QS19MRU5HVEhfTVNCLAorCVBMSVBfUEtfREFUQSwKKwlQTElQX1BLX0NIRUNLU1VNCit9OworCitlbnVtIHBsaXBfbmliYmxlX3N0YXRlIHsKKwlQTElQX05CX0JFR0lOLAorCVBMSVBfTkJfMSwKKwlQTElQX05CXzIsCit9OworCitzdHJ1Y3QgcGxpcF9sb2NhbCB7CisJZW51bSBwbGlwX3BhY2tldF9zdGF0ZSBzdGF0ZTsKKwllbnVtIHBsaXBfbmliYmxlX3N0YXRlIG5pYmJsZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJCQl1bnNpZ25lZCBjaGFyIGxzYjsKKwkJCXVuc2lnbmVkIGNoYXIgbXNiOworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJCQl1bnNpZ25lZCBjaGFyIG1zYjsKKwkJCXVuc2lnbmVkIGNoYXIgbHNiOworI2Vsc2UKKyNlcnJvcgkiUGxlYXNlIGZpeCB0aGUgZW5kaWFubmVzcyBkZWZpbmVzIGluIDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisJCX0gYjsKKwkJdW5zaWduZWQgc2hvcnQgaDsKKwl9IGxlbmd0aDsKKwl1bnNpZ25lZCBzaG9ydCBieXRlOworCXVuc2lnbmVkIGNoYXIgIGNoZWNrc3VtOworCXVuc2lnbmVkIGNoYXIgIGRhdGE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKK307CisKK3N0cnVjdCBuZXRfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIGVuZXRfc3RhdHM7CisJc3RydWN0IHdvcmtfc3RydWN0IGltbWVkaWF0ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZGVmZXJyZWQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHRpbWVyOworCXN0cnVjdCBwbGlwX2xvY2FsIHNuZF9kYXRhOworCXN0cnVjdCBwbGlwX2xvY2FsIHJjdl9kYXRhOworCXN0cnVjdCBwYXJkZXZpY2UgKnBhcmRldjsKKwl1bnNpZ25lZCBsb25nICB0cmlnZ2VyOworCXVuc2lnbmVkIGxvbmcgIG5pYmJsZTsKKwllbnVtIHBsaXBfY29ubmVjdGlvbl9zdGF0ZSBjb25uZWN0aW9uOworCXVuc2lnbmVkIHNob3J0IHRpbWVvdXRfY291bnQ7CisJaW50IGlzX2RlZmVycmVkOworCWludCBwb3J0X293bmVyOworCWludCBzaG91bGRfcmVsaW5xdWlzaDsKKwlpbnQgKCpvcmlnX2hhcmRfaGVhZGVyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLAorCSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pOworCWludCAoKm9yaWdfaGFyZF9oZWFkZXJfY2FjaGUpKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBoaF9jYWNoZSAqaGgpOworCXNwaW5sb2NrX3QgbG9jazsKKwlhdG9taWNfdCBraWxsX3RpbWVyOworCXN0cnVjdCBzZW1hcGhvcmUga2lsbGVkX3RpbWVyX3NlbTsKK307CisMCitpbmxpbmUgc3RhdGljIHZvaWQgZW5hYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5pcnEgIT0gLTEpCisJeworCQlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9CisJCSAgICgoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdiktPnBhcmRldi0+cG9ydDsKKwkJcG9ydC0+b3BzLT5lbmFibGVfaXJxIChwb3J0KTsKKwl9Cit9CisKK2lubGluZSBzdGF0aWMgdm9pZCBkaXNhYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5pcnEgIT0gLTEpCisJeworCQlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9CisJCSAgICgoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdiktPnBhcmRldi0+cG9ydDsKKwkJcG9ydC0+b3BzLT5kaXNhYmxlX2lycSAocG9ydCk7CisJfQorfQorCitpbmxpbmUgc3RhdGljIHZvaWQgd3JpdGVfZGF0YSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXN0cnVjdCBwYXJwb3J0ICpwb3J0ID0KKwkgICAoKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXYpLT5wYXJkZXYtPnBvcnQ7CisKKwlwb3J0LT5vcHMtPndyaXRlX2RhdGEgKHBvcnQsIGRhdGEpOworfQorCitpbmxpbmUgc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVhZF9zdGF0dXMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBhcnBvcnQgKnBvcnQgPQorCSAgICgoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdiktPnBhcmRldi0+cG9ydDsKKworCXJldHVybiBwb3J0LT5vcHMtPnJlYWRfc3RhdHVzIChwb3J0KTsKK30KKwwKKy8qIEVudHJ5IHBvaW50IG9mIFBMSVAgZHJpdmVyLgorICAgUHJvYmUgdGhlIGhhcmR3YXJlLCBhbmQgcmVnaXN0ZXIvaW5pdGlhbGl6ZSB0aGUgZHJpdmVyLgorCisgICBQTElQIGlzIHJhdGhlciB3ZWlyZCwgYmVjYXVzZSBvZiB0aGUgd2F5IGl0IGludGVyYWN0cyB3aXRoIHRoZSBwYXJwb3J0CisgICBzeXN0ZW0uICBJdCBpcyBfbm90XyBpbml0aWFsaXNlZCBmcm9tIFNwYWNlLmMuICBJbnN0ZWFkLCBwbGlwX2luaXQoKQorICAgaXMgY2FsbGVkLCBhbmQgdGhhdCBmdW5jdGlvbiBtYWtlcyB1cCBhICJzdHJ1Y3QgbmV0X2RldmljZSIgZm9yIGVhY2ggcG9ydCwgYW5kCisgICB0aGVuIGNhbGxzIHVzIGhlcmUuCisKKyAgICovCitzdGF0aWMgdm9pZAorcGxpcF9pbml0X25ldGRldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5sID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIFRoZW4sIG92ZXJyaWRlIHBhcnRzIG9mIGl0ICovCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJID0gcGxpcF90eF9wYWNrZXQ7CisJZGV2LT5vcGVuCQkgPSBwbGlwX29wZW47CisJZGV2LT5zdG9wCQkgPSBwbGlwX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzIAkJID0gcGxpcF9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bAkJID0gcGxpcF9pb2N0bDsKKwlkZXYtPmhlYWRlcl9jYWNoZV91cGRhdGUgPSBOVUxMOworCWRldi0+dHhfcXVldWVfbGVuIAkgPSAxMDsKKwlkZXYtPmZsYWdzCSAgICAgICAgID0gSUZGX1BPSU5UT1BPSU5UfElGRl9OT0FSUDsKKwltZW1zZXQoZGV2LT5kZXZfYWRkciwgMHhmYywgRVRIX0FMRU4pOworCisJLyogU2V0IHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLworCW5sLT5vcmlnX2hhcmRfaGVhZGVyICAgID0gZGV2LT5oYXJkX2hlYWRlcjsKKwlkZXYtPmhhcmRfaGVhZGVyICAgICAgICA9IHBsaXBfaGFyZF9oZWFkZXI7CisKKwlubC0+b3JpZ19oYXJkX2hlYWRlcl9jYWNoZSA9IGRldi0+aGFyZF9oZWFkZXJfY2FjaGU7CisJZGV2LT5oYXJkX2hlYWRlcl9jYWNoZSAgICAgPSBwbGlwX2hhcmRfaGVhZGVyX2NhY2hlOworCisKKwlubC0+cG9ydF9vd25lciA9IDA7CisKKwkvKiBJbml0aWFsaXplIGNvbnN0YW50cyAqLworCW5sLT50cmlnZ2VyCT0gUExJUF9UUklHR0VSX1dBSVQ7CisJbmwtPm5pYmJsZQk9IFBMSVBfTklCQkxFX1dBSVQ7CisKKwkvKiBJbml0aWFsaXplIHRhc2sgcXVldWUgc3RydWN0dXJlcyAqLworCUlOSVRfV09SSygmbmwtPmltbWVkaWF0ZSwgKHZvaWQgKCopKHZvaWQgKikpcGxpcF9iaCwgZGV2KTsKKwlJTklUX1dPUksoJm5sLT5kZWZlcnJlZCwgKHZvaWQgKCopKHZvaWQgKikpcGxpcF9raWNrX2JoLCBkZXYpOworCisJaWYgKGRldi0+aXJxID09IC0xKQorCQlJTklUX1dPUksoJm5sLT50aW1lciwgKHZvaWQgKCopKHZvaWQgKikpcGxpcF90aW1lcl9iaCwgZGV2KTsKKworCXNwaW5fbG9ja19pbml0KCZubC0+bG9jayk7Cit9CisMCisvKiBCb3R0b20gaGFsZiBoYW5kbGVyIGZvciB0aGUgZGVsYXllZCByZXF1ZXN0LgorICAgVGhpcyByb3V0aW5lIGlzIGtpY2tlZCBieSBkb190aW1lcigpLgorICAgUmVxdWVzdCBgcGxpcF9iaCcgdG8gYmUgaW52b2tlZC4gKi8KK3N0YXRpYyB2b2lkCitwbGlwX2tpY2tfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobmwtPmlzX2RlZmVycmVkKQorCQlzY2hlZHVsZV93b3JrKCZubC0+aW1tZWRpYXRlKTsKK30KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgaW50ZXJuYWwgcm91dGluZXMgKi8KK3N0YXRpYyBpbnQgcGxpcF9ub25lKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBuZXRfbG9jYWwgKiwKKwkJICAgICBzdHJ1Y3QgcGxpcF9sb2NhbCAqLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqKTsKK3N0YXRpYyBpbnQgcGxpcF9yZWNlaXZlX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgbmV0X2xvY2FsICosCisJCQkgICAgICAgc3RydWN0IHBsaXBfbG9jYWwgKiwgc3RydWN0IHBsaXBfbG9jYWwgKik7CitzdGF0aWMgaW50IHBsaXBfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IG5ldF9sb2NhbCAqLAorCQkJICAgIHN0cnVjdCBwbGlwX2xvY2FsICosIHN0cnVjdCBwbGlwX2xvY2FsICopOworc3RhdGljIGludCBwbGlwX2Nvbm5lY3Rpb25fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IG5ldF9sb2NhbCAqLAorCQkJCSBzdHJ1Y3QgcGxpcF9sb2NhbCAqLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqKTsKK3N0YXRpYyBpbnQgcGxpcF9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgbmV0X2xvY2FsICosCisJCSAgICAgIHN0cnVjdCBwbGlwX2xvY2FsICosIHN0cnVjdCBwbGlwX2xvY2FsICopOworc3RhdGljIGludCBwbGlwX2JoX3RpbWVvdXRfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9sb2NhbCAqbmwsCisJCQkJIHN0cnVjdCBwbGlwX2xvY2FsICpzbmQsCisJCQkJIHN0cnVjdCBwbGlwX2xvY2FsICpyY3YsCisJCQkJIGludCBlcnJvcik7CisKKyNkZWZpbmUgT0sgICAgICAgIDAKKyNkZWZpbmUgVElNRU9VVCAgIDEKKyNkZWZpbmUgRVJST1IgICAgIDIKKyNkZWZpbmUgSFNfVElNRU9VVAkzCisKK3R5cGVkZWYgaW50ICgqcGxpcF9mdW5jKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0X2xvY2FsICpubCwKKwkJCSBzdHJ1Y3QgcGxpcF9sb2NhbCAqc25kLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2KTsKKworc3RhdGljIHBsaXBfZnVuYyBjb25uZWN0aW9uX3N0YXRlX3RhYmxlW10gPQoreworCXBsaXBfbm9uZSwKKwlwbGlwX3JlY2VpdmVfcGFja2V0LAorCXBsaXBfc2VuZF9wYWNrZXQsCisJcGxpcF9jb25uZWN0aW9uX2Nsb3NlLAorCXBsaXBfZXJyb3IKK307CisKKy8qIEJvdHRvbSBoYWxmIGhhbmRsZXIgb2YgUExJUC4gKi8KK3N0YXRpYyB2b2lkCitwbGlwX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwbGlwX2xvY2FsICpzbmQgPSAmbmwtPnNuZF9kYXRhOworCXN0cnVjdCBwbGlwX2xvY2FsICpyY3YgPSAmbmwtPnJjdl9kYXRhOworCXBsaXBfZnVuYyBmOworCWludCByOworCisJbmwtPmlzX2RlZmVycmVkID0gMDsKKwlmID0gY29ubmVjdGlvbl9zdGF0ZV90YWJsZVtubC0+Y29ubmVjdGlvbl07CisJaWYgKChyID0gKCpmKShkZXYsIG5sLCBzbmQsIHJjdikpICE9IE9LCisJICAgICYmIChyID0gcGxpcF9iaF90aW1lb3V0X2Vycm9yKGRldiwgbmwsIHNuZCwgcmN2LCByKSkgIT0gT0spIHsKKwkJbmwtPmlzX2RlZmVycmVkID0gMTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZubC0+ZGVmZXJyZWQsIDEpOworCX0KK30KKworc3RhdGljIHZvaWQKK3BsaXBfdGltZXJfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisJCisJaWYgKCEoYXRvbWljX3JlYWQgKCZubC0+a2lsbF90aW1lcikpKSB7CisJCXBsaXBfaW50ZXJydXB0ICgtMSwgZGV2LCBOVUxMKTsKKworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm5sLT50aW1lciwgMSk7CisJfQorCWVsc2UgeworCQl1cCAoJm5sLT5raWxsZWRfdGltZXJfc2VtKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3BsaXBfYmhfdGltZW91dF9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0X2xvY2FsICpubCwKKwkJICAgICAgc3RydWN0IHBsaXBfbG9jYWwgKnNuZCwgc3RydWN0IHBsaXBfbG9jYWwgKnJjdiwKKwkJICAgICAgaW50IGVycm9yKQoreworCXVuc2lnbmVkIGNoYXIgYzA7CisJLyoKKwkgKiBUaGlzIGlzIHRyaWNreS4gSWYgd2UgZ290IGhlcmUgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHNlbmQgKGVpdGhlcgorCSAqIHdpdGggRVJST1Igb3IgSFNfVElNRU9VVCkgd2UgaGF2ZSBJUlEgZW5hYmxlZC4gT3RoZXJ3aXNlIGl0J3MKKwkgKiBhbHJlYWR5IGRpc2FibGVkLiBXaXRoIHRoZSBvbGQgdmFyaWFudCBvZiB7ZW5hYmxlLGRpc2FibGV9X2lycSgpCisJICogZXh0cmEgZGlzYWJsZV9pcnEoKSB3YXMgYSBuby1vcC4gTm93IGl0IGJlY2FtZSBtb3J0YWwgLSBpdCdzCisJICogdW5iYWxhbmNlZCBhbmQgdGh1cyB3ZSdsbCBuZXZlciByZS1lbmFibGUgSVJRICh1bnRpbCBybW1vZCBwbGlwLAorCSAqIHRoYXQgaXMpLiBTbyB3ZSBoYXZlIHRvIHRyZWF0IEhTX1RJTUVPVVQgYW5kIEVSUk9SIGZyb20gc2VuZAorCSAqIGluIGEgc3BlY2lhbCB3YXkuCisJICovCisKKwlzcGluX2xvY2tfaXJxKCZubC0+bG9jayk7CisJaWYgKG5sLT5jb25uZWN0aW9uID09IFBMSVBfQ05fU0VORCkgeworCisJCWlmIChlcnJvciAhPSBFUlJPUikgeyAvKiBUaW1lb3V0ICovCisJCQlubC0+dGltZW91dF9jb3VudCsrOworCQkJaWYgKChlcnJvciA9PSBIU19USU1FT1VUCisJCQkgICAgICYmIG5sLT50aW1lb3V0X2NvdW50IDw9IDEwKQorCQkJICAgIHx8IG5sLT50aW1lb3V0X2NvdW50IDw9IDMpIHsKKwkJCQlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKKwkJCQkvKiBUcnkgYWdhaW4gbGF0ZXIgKi8KKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJCX0KKwkJCWMwID0gcmVhZF9zdGF0dXMoZGV2KTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lb3V0KCVkLCUwMngpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc25kLT5zdGF0ZSwgYzApOworCQl9IGVsc2UKKwkJCWVycm9yID0gSFNfVElNRU9VVDsKKwkJbmwtPmVuZXRfc3RhdHMudHhfZXJyb3JzKys7CisJCW5sLT5lbmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJfSBlbHNlIGlmIChubC0+Y29ubmVjdGlvbiA9PSBQTElQX0NOX1JFQ0VJVkUpIHsKKwkJaWYgKHJjdi0+c3RhdGUgPT0gUExJUF9QS19UUklHR0VSKSB7CisJCQkvKiBUcmFuc21pc3Npb24gd2FzIGludGVycnVwdGVkLiAqLworCQkJc3Bpbl91bmxvY2tfaXJxKCZubC0+bG9jayk7CisJCQlyZXR1cm4gT0s7CisJCX0KKwkJaWYgKGVycm9yICE9IEVSUk9SKSB7IC8qIFRpbWVvdXQgKi8KKwkJCWlmICgrK25sLT50aW1lb3V0X2NvdW50IDw9IDMpIHsKKwkJCQlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKKwkJCQkvKiBUcnkgYWdhaW4gbGF0ZXIgKi8KKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJCX0KKwkJCWMwID0gcmVhZF9zdGF0dXMoZGV2KTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZWNlaXZlIHRpbWVvdXQoJWQsJTAyeClcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCByY3YtPnN0YXRlLCBjMCk7CisJCX0KKwkJbmwtPmVuZXRfc3RhdHMucnhfZHJvcHBlZCsrOworCX0KKwlyY3YtPnN0YXRlID0gUExJUF9QS19ET05FOworCWlmIChyY3YtPnNrYikgeworCQlrZnJlZV9za2IocmN2LT5za2IpOworCQlyY3YtPnNrYiA9IE5VTEw7CisJfQorCXNuZC0+c3RhdGUgPSBQTElQX1BLX0RPTkU7CisJaWYgKHNuZC0+c2tiKSB7CisJCWRldl9rZnJlZV9za2Ioc25kLT5za2IpOworCQlzbmQtPnNrYiA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmbmwtPmxvY2spOworCWlmIChlcnJvciA9PSBIU19USU1FT1VUKSB7CisJCURJU0FCTEUoZGV2LT5pcnEpOworCQlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCX0KKwlkaXNhYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCW5sLT5jb25uZWN0aW9uID0gUExJUF9DTl9FUlJPUjsKKwl3cml0ZV9kYXRhIChkZXYsIDB4MDApOworCisJcmV0dXJuIFRJTUVPVVQ7Cit9CisMCitzdGF0aWMgaW50CitwbGlwX25vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9sb2NhbCAqbmwsCisJICBzdHJ1Y3QgcGxpcF9sb2NhbCAqc25kLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2KQoreworCXJldHVybiBPSzsKK30KKworLyogUExJUF9SRUNFSVZFIC0tLSByZWNlaXZlIGEgYnl0ZSh0d28gbmliYmxlcykKKyAgIFJldHVybnMgT0sgb24gc3VjY2VzcywgVElNRU9VVCBvbiB0aW1lb3V0ICovCitpbmxpbmUgc3RhdGljIGludAorcGxpcF9yZWNlaXZlKHVuc2lnbmVkIHNob3J0IG5pYmJsZV90aW1lb3V0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCSAgICAgZW51bSBwbGlwX25pYmJsZV9zdGF0ZSAqbnNfcCwgdW5zaWduZWQgY2hhciAqZGF0YV9wKQoreworCXVuc2lnbmVkIGNoYXIgYzAsIGMxOworCXVuc2lnbmVkIGludCBjeDsKKworCXN3aXRjaCAoKm5zX3ApIHsKKwljYXNlIFBMSVBfTkJfQkVHSU46CisJCWN4ID0gbmliYmxlX3RpbWVvdXQ7CisJCXdoaWxlICgxKSB7CisJCQljMCA9IHJlYWRfc3RhdHVzKGRldik7CisJCQl1ZGVsYXkoUExJUF9ERUxBWV9VTklUKTsKKwkJCWlmICgoYzAgJiAweDgwKSA9PSAwKSB7CisJCQkJYzEgPSByZWFkX3N0YXR1cyhkZXYpOworCQkJCWlmIChjMCA9PSBjMSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoLS1jeCA9PSAwKQorCQkJCXJldHVybiBUSU1FT1VUOworCQl9CisJCSpkYXRhX3AgPSAoYzAgPj4gMykgJiAweDBmOworCQl3cml0ZV9kYXRhIChkZXYsIDB4MTApOyAvKiBzZW5kIEFDSyAqLworCQkqbnNfcCA9IFBMSVBfTkJfMTsKKworCWNhc2UgUExJUF9OQl8xOgorCQljeCA9IG5pYmJsZV90aW1lb3V0OworCQl3aGlsZSAoMSkgeworCQkJYzAgPSByZWFkX3N0YXR1cyhkZXYpOworCQkJdWRlbGF5KFBMSVBfREVMQVlfVU5JVCk7CisJCQlpZiAoYzAgJiAweDgwKSB7CisJCQkJYzEgPSByZWFkX3N0YXR1cyhkZXYpOworCQkJCWlmIChjMCA9PSBjMSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoLS1jeCA9PSAwKQorCQkJCXJldHVybiBUSU1FT1VUOworCQl9CisJCSpkYXRhX3AgfD0gKGMwIDw8IDEpICYgMHhmMDsKKwkJd3JpdGVfZGF0YSAoZGV2LCAweDAwKTsgLyogc2VuZCBBQ0sgKi8KKwkJKm5zX3AgPSBQTElQX05CX0JFR0lOOworCWNhc2UgUExJUF9OQl8yOgorCQlicmVhazsKKwl9CisJcmV0dXJuIE9LOworfQorCisvKgorICoJRGV0ZXJtaW5lIHRoZSBwYWNrZXQncyBwcm90b2NvbCBJRC4gVGhlIHJ1bGUgaGVyZSBpcyB0aGF0IHdlIAorICoJYXNzdW1lIDgwMi4zIGlmIHRoZSB0eXBlIGZpZWxkIGlzIHNob3J0IGVub3VnaCB0byBiZSBhIGxlbmd0aC4KKyAqCVRoaXMgaXMgbm9ybWFsIHByYWN0aWNlIGFuZCB3b3JrcyBmb3IgYW55ICdub3cgaW4gdXNlJyBwcm90b2NvbC4KKyAqCisgKglQTElQIGlzIGV0aGVybmV0IGlzaCBidXQgdGhlIGRhZGRyIG1pZ2h0IG5vdCBiZSB2YWxpZCBpZiB1bmljYXN0LgorICoJUExJUCBmb3J0dW5hdGVseSBoYXMgbm8gYnVzIGFyY2hpdGVjdHVyZSAoaXRzIFBvaW50LXRvLXBvaW50KS4KKyAqCisgKglXZSBjYW4ndCBmaXggdGhlIGRhZGRyIHRoaW5nIGFzIHRoYXQgcXVpcmsgKG1vcmUgYnVnKSBpcyBlbWJlZGRlZAorICoJaW4gZmFyIHRvbyBtYW55IG9sZCBzeXN0ZW1zIG5vdCBhbGwgZXZlbiBydW5uaW5nIExpbnV4LgorICovCisgCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcGxpcF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0aGhkciAqZXRoOworCXVuc2lnbmVkIGNoYXIgKnJhd3A7CisJCisJc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKKwlza2JfcHVsbChza2IsZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCWV0aCA9IGV0aF9oZHIoc2tiKTsKKwkKKwlpZigqZXRoLT5oX2Rlc3QmMSkKKwl7CisJCWlmKG1lbWNtcChldGgtPmhfZGVzdCxkZXYtPmJyb2FkY2FzdCwgRVRIX0FMRU4pPT0wKQorCQkJc2tiLT5wa3RfdHlwZT1QQUNLRVRfQlJPQURDQVNUOworCQllbHNlCisJCQlza2ItPnBrdF90eXBlPVBBQ0tFVF9NVUxUSUNBU1Q7CisJfQorCQorCS8qCisJICoJVGhpcyBBTExNVUxUSSBjaGVjayBzaG91bGQgYmUgcmVkdW5kYW50IGJ5IDEuNAorCSAqCXNvIGRvbid0IGZvcmdldCB0byByZW1vdmUgaXQuCisJICovCisJIAorCWlmIChudG9ocyhldGgtPmhfcHJvdG8pID49IDE1MzYpCisJCXJldHVybiBldGgtPmhfcHJvdG87CisJCQorCXJhd3AgPSBza2ItPmRhdGE7CisJCisJLyoKKwkgKglUaGlzIGlzIGEgbWFnaWMgaGFjayB0byBzcG90IElQWCBwYWNrZXRzLiBPbGRlciBOb3ZlbGwgYnJlYWtzCisJICoJdGhlIHByb3RvY29sIGRlc2lnbiBhbmQgcnVucyBJUFggb3ZlciA4MDIuMyB3aXRob3V0IGFuIDgwMi4yIExMQworCSAqCWxheWVyLiBXZSBsb29rIGZvciBGRkZGIHdoaWNoIGlzbid0IGEgdXNlZCA4MDIuMiBTU0FQL0RTQVAuIFRoaXMKKwkgKgl3b24ndCB3b3JrIGZvciBmYXVsdCB0b2xlcmFudCBuZXR3YXJlIGJ1dCBkb2VzIGZvciB0aGUgcmVzdC4KKwkgKi8KKwlpZiAoKih1bnNpZ25lZCBzaG9ydCAqKXJhd3AgPT0gMHhGRkZGKQorCQlyZXR1cm4gaHRvbnMoRVRIX1BfODAyXzMpOworCQkKKwkvKgorCSAqCVJlYWwgODAyLjIgTExDCisJICovCisJcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8yKTsKK30KKworCisvKiBQTElQX1JFQ0VJVkVfUEFDS0VUIC0tLSByZWNlaXZlIGEgcGFja2V0ICovCitzdGF0aWMgaW50CitwbGlwX3JlY2VpdmVfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRfbG9jYWwgKm5sLAorCQkgICAgc3RydWN0IHBsaXBfbG9jYWwgKnNuZCwgc3RydWN0IHBsaXBfbG9jYWwgKnJjdikKK3sKKwl1bnNpZ25lZCBzaG9ydCBuaWJibGVfdGltZW91dCA9IG5sLT5uaWJibGU7CisJdW5zaWduZWQgY2hhciAqbGJ1ZjsKKworCXN3aXRjaCAocmN2LT5zdGF0ZSkgeworCWNhc2UgUExJUF9QS19UUklHR0VSOgorCQlESVNBQkxFKGRldi0+aXJxKTsKKwkJLyogRG9uJ3QgbmVlZCB0byBzeW5jaHJvbml6ZSBpcnEsIGFzIHdlIGNhbiBzYWZlbHkgaWdub3JlIGl0ICovCisJCWRpc2FibGVfcGFycG9ydF9pbnRlcnJ1cHRzIChkZXYpOworCQl3cml0ZV9kYXRhIChkZXYsIDB4MDEpOyAvKiBzZW5kIEFDSyAqLworCQlpZiAobmV0X2RlYnVnID4gMikKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZSBzdGFydFxuIiwgZGV2LT5uYW1lKTsKKwkJcmN2LT5zdGF0ZSA9IFBMSVBfUEtfTEVOR1RIX0xTQjsKKwkJcmN2LT5uaWJibGUgPSBQTElQX05CX0JFR0lOOworCisJY2FzZSBQTElQX1BLX0xFTkdUSF9MU0I6CisJCWlmIChzbmQtPnN0YXRlICE9IFBMSVBfUEtfRE9ORSkgeworCQkJaWYgKHBsaXBfcmVjZWl2ZShubC0+dHJpZ2dlciwgZGV2LAorCQkJCQkgJnJjdi0+bmliYmxlLCAmcmN2LT5sZW5ndGguYi5sc2IpKSB7CisJCQkJLyogY29sbGlzaW9uLCBoZXJlIGRldi0+dGJ1c3kgPT0gMSAqLworCQkJCXJjdi0+c3RhdGUgPSBQTElQX1BLX0RPTkU7CisJCQkJbmwtPmlzX2RlZmVycmVkID0gMTsKKwkJCQlubC0+Y29ubmVjdGlvbiA9IFBMSVBfQ05fU0VORDsKKwkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm5sLT5kZWZlcnJlZCwgMSk7CisJCQkJZW5hYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoZGV2KTsKKwkJCQlFTkFCTEUoZGV2LT5pcnEpOworCQkJCXJldHVybiBPSzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwbGlwX3JlY2VpdmUobmliYmxlX3RpbWVvdXQsIGRldiwKKwkJCQkJICZyY3YtPm5pYmJsZSwgJnJjdi0+bGVuZ3RoLmIubHNiKSkKKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJfQorCQlyY3YtPnN0YXRlID0gUExJUF9QS19MRU5HVEhfTVNCOworCisJY2FzZSBQTElQX1BLX0xFTkdUSF9NU0I6CisJCWlmIChwbGlwX3JlY2VpdmUobmliYmxlX3RpbWVvdXQsIGRldiwKKwkJCQkgJnJjdi0+bmliYmxlLCAmcmN2LT5sZW5ndGguYi5tc2IpKQorCQkJcmV0dXJuIFRJTUVPVVQ7CisJCWlmIChyY3YtPmxlbmd0aC5oID4gZGV2LT5tdHUgKyBkZXYtPmhhcmRfaGVhZGVyX2xlbgorCQkgICAgfHwgcmN2LT5sZW5ndGguaCA8IDgpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBib2d1cyBwYWNrZXQgc2l6ZSAlZC5cbiIsIGRldi0+bmFtZSwgcmN2LT5sZW5ndGguaCk7CisJCQlyZXR1cm4gRVJST1I7CisJCX0KKwkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJCXJjdi0+c2tiID0gZGV2X2FsbG9jX3NrYihyY3YtPmxlbmd0aC5oICsgMik7CisJCWlmIChyY3YtPnNrYiA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBNZW1vcnkgc3F1ZWV6ZS5cbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gRVJST1I7CisJCX0KKwkJc2tiX3Jlc2VydmUocmN2LT5za2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KKwkJc2tiX3B1dChyY3YtPnNrYixyY3YtPmxlbmd0aC5oKTsKKwkJcmN2LT5za2ItPmRldiA9IGRldjsKKwkJcmN2LT5zdGF0ZSA9IFBMSVBfUEtfREFUQTsKKwkJcmN2LT5ieXRlID0gMDsKKwkJcmN2LT5jaGVja3N1bSA9IDA7CisKKwljYXNlIFBMSVBfUEtfREFUQToKKwkJbGJ1ZiA9IHJjdi0+c2tiLT5kYXRhOworCQlkbworCQkJaWYgKHBsaXBfcmVjZWl2ZShuaWJibGVfdGltZW91dCwgZGV2LAorCQkJCQkgJnJjdi0+bmliYmxlLCAmbGJ1ZltyY3YtPmJ5dGVdKSkKKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJd2hpbGUgKCsrcmN2LT5ieXRlIDwgcmN2LT5sZW5ndGguaCk7CisJCWRvCisJCQlyY3YtPmNoZWNrc3VtICs9IGxidWZbLS1yY3YtPmJ5dGVdOworCQl3aGlsZSAocmN2LT5ieXRlKTsKKwkJcmN2LT5zdGF0ZSA9IFBMSVBfUEtfQ0hFQ0tTVU07CisKKwljYXNlIFBMSVBfUEtfQ0hFQ0tTVU06CisJCWlmIChwbGlwX3JlY2VpdmUobmliYmxlX3RpbWVvdXQsIGRldiwKKwkJCQkgJnJjdi0+bmliYmxlLCAmcmN2LT5kYXRhKSkKKwkJCXJldHVybiBUSU1FT1VUOworCQlpZiAocmN2LT5kYXRhICE9IHJjdi0+Y2hlY2tzdW0pIHsKKwkJCW5sLT5lbmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChuZXRfZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjaGVja3N1bSBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybiBFUlJPUjsKKwkJfQorCQlyY3YtPnN0YXRlID0gUExJUF9QS19ET05FOworCisJY2FzZSBQTElQX1BLX0RPTkU6CisJCS8qIEluZm9ybSB0aGUgdXBwZXIgbGF5ZXIgZm9yIHRoZSBhcnJpdmFsIG9mIGEgcGFja2V0LiAqLworCQlyY3YtPnNrYi0+cHJvdG9jb2w9cGxpcF90eXBlX3RyYW5zKHJjdi0+c2tiLCBkZXYpOworCQluZXRpZl9yeChyY3YtPnNrYik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW5sLT5lbmV0X3N0YXRzLnJ4X2J5dGVzICs9IHJjdi0+bGVuZ3RoLmg7CisJCW5sLT5lbmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKKwkJcmN2LT5za2IgPSBOVUxMOworCQlpZiAobmV0X2RlYnVnID4gMikKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZSBlbmRcbiIsIGRldi0+bmFtZSk7CisKKwkJLyogQ2xvc2UgdGhlIGNvbm5lY3Rpb24uICovCisJCXdyaXRlX2RhdGEgKGRldiwgMHgwMCk7CisJCXNwaW5fbG9ja19pcnEoJm5sLT5sb2NrKTsKKwkJaWYgKHNuZC0+c3RhdGUgIT0gUExJUF9QS19ET05FKSB7CisJCQlubC0+Y29ubmVjdGlvbiA9IFBMSVBfQ05fU0VORDsKKwkJCXNwaW5fdW5sb2NrX2lycSgmbmwtPmxvY2spOworCQkJc2NoZWR1bGVfd29yaygmbmwtPmltbWVkaWF0ZSk7CisJCQllbmFibGVfcGFycG9ydF9pbnRlcnJ1cHRzIChkZXYpOworCQkJRU5BQkxFKGRldi0+aXJxKTsKKwkJCXJldHVybiBPSzsKKwkJfSBlbHNlIHsKKwkJCW5sLT5jb25uZWN0aW9uID0gUExJUF9DTl9OT05FOworCQkJc3Bpbl91bmxvY2tfaXJxKCZubC0+bG9jayk7CisJCQllbmFibGVfcGFycG9ydF9pbnRlcnJ1cHRzIChkZXYpOworCQkJRU5BQkxFKGRldi0+aXJxKTsKKwkJCXJldHVybiBPSzsKKwkJfQorCX0KKwlyZXR1cm4gT0s7Cit9CisKKy8qIFBMSVBfU0VORCAtLS0gc2VuZCBhIGJ5dGUgKHR3byBuaWJibGVzKQorICAgUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBUSU1FT1VUIHdoZW4gdGltZW91dCAgICAqLworaW5saW5lIHN0YXRpYyBpbnQKK3BsaXBfc2VuZCh1bnNpZ25lZCBzaG9ydCBuaWJibGVfdGltZW91dCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkgIGVudW0gcGxpcF9uaWJibGVfc3RhdGUgKm5zX3AsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyIGMwOworCXVuc2lnbmVkIGludCBjeDsKKworCXN3aXRjaCAoKm5zX3ApIHsKKwljYXNlIFBMSVBfTkJfQkVHSU46CisJCXdyaXRlX2RhdGEgKGRldiwgZGF0YSAmIDB4MGYpOworCQkqbnNfcCA9IFBMSVBfTkJfMTsKKworCWNhc2UgUExJUF9OQl8xOgorCQl3cml0ZV9kYXRhIChkZXYsIDB4MTAgfCAoZGF0YSAmIDB4MGYpKTsKKwkJY3ggPSBuaWJibGVfdGltZW91dDsKKwkJd2hpbGUgKDEpIHsKKwkJCWMwID0gcmVhZF9zdGF0dXMoZGV2KTsKKwkJCWlmICgoYzAgJiAweDgwKSA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKC0tY3ggPT0gMCkKKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJCXVkZWxheShQTElQX0RFTEFZX1VOSVQpOworCQl9CisJCXdyaXRlX2RhdGEgKGRldiwgMHgxMCB8IChkYXRhID4+IDQpKTsKKwkJKm5zX3AgPSBQTElQX05CXzI7CisKKwljYXNlIFBMSVBfTkJfMjoKKwkJd3JpdGVfZGF0YSAoZGV2LCAoZGF0YSA+PiA0KSk7CisJCWN4ID0gbmliYmxlX3RpbWVvdXQ7CisJCXdoaWxlICgxKSB7CisJCQljMCA9IHJlYWRfc3RhdHVzKGRldik7CisJCQlpZiAoYzAgJiAweDgwKQorCQkJCWJyZWFrOworCQkJaWYgKC0tY3ggPT0gMCkKKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJCXVkZWxheShQTElQX0RFTEFZX1VOSVQpOworCQl9CisJCSpuc19wID0gUExJUF9OQl9CRUdJTjsKKwkJcmV0dXJuIE9LOworCX0KKwlyZXR1cm4gT0s7Cit9CisKKy8qIFBMSVBfU0VORF9QQUNLRVQgLS0tIHNlbmQgYSBwYWNrZXQgKi8KK3N0YXRpYyBpbnQKK3BsaXBfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9sb2NhbCAqbmwsCisJCSBzdHJ1Y3QgcGxpcF9sb2NhbCAqc25kLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2KQoreworCXVuc2lnbmVkIHNob3J0IG5pYmJsZV90aW1lb3V0ID0gbmwtPm5pYmJsZTsKKwl1bnNpZ25lZCBjaGFyICpsYnVmOworCXVuc2lnbmVkIGNoYXIgYzA7CisJdW5zaWduZWQgaW50IGN4OworCisJaWYgKHNuZC0+c2tiID09IE5VTEwgfHwgKGxidWYgPSBzbmQtPnNrYi0+ZGF0YSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNlbmQgc2tiIGxvc3RcbiIsIGRldi0+bmFtZSk7CisJCXNuZC0+c3RhdGUgPSBQTElQX1BLX0RPTkU7CisJCXNuZC0+c2tiID0gTlVMTDsKKwkJcmV0dXJuIEVSUk9SOworCX0KKworCXN3aXRjaCAoc25kLT5zdGF0ZSkgeworCWNhc2UgUExJUF9QS19UUklHR0VSOgorCQlpZiAoKHJlYWRfc3RhdHVzKGRldikgJiAweGY4KSAhPSAweDgwKQorCQkJcmV0dXJuIEhTX1RJTUVPVVQ7CisKKwkJLyogVHJpZ2dlciByZW1vdGUgcnggaW50ZXJydXB0LiAqLworCQl3cml0ZV9kYXRhIChkZXYsIDB4MDgpOworCQljeCA9IG5sLT50cmlnZ2VyOworCQl3aGlsZSAoMSkgeworCQkJdWRlbGF5KFBMSVBfREVMQVlfVU5JVCk7CisJCQlzcGluX2xvY2tfaXJxKCZubC0+bG9jayk7CisJCQlpZiAobmwtPmNvbm5lY3Rpb24gPT0gUExJUF9DTl9SRUNFSVZFKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZubC0+bG9jayk7CisJCQkJLyogSW50ZXJydXB0ZWQuICovCisJCQkJbmwtPmVuZXRfc3RhdHMuY29sbGlzaW9ucysrOworCQkJCXJldHVybiBPSzsKKwkJCX0KKwkJCWMwID0gcmVhZF9zdGF0dXMoZGV2KTsKKwkJCWlmIChjMCAmIDB4MDgpIHsKKwkJCQlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKKwkJCQlESVNBQkxFKGRldi0+aXJxKTsKKwkJCQlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCQkJCWlmIChubC0+Y29ubmVjdGlvbiA9PSBQTElQX0NOX1JFQ0VJVkUpIHsKKwkJCQkJLyogSW50ZXJydXB0ZWQuCisJCQkJCSAgIFdlIGRvbid0IG5lZWQgdG8gZW5hYmxlIGlycSwKKwkJCQkJICAgYXMgaXQgaXMgc29vbiBkaXNhYmxlZC4gICAgKi8KKwkJCQkJLyogWWVzLCB3ZSBkby4gTmV3IHZhcmlhbnQgb2YKKwkJCQkJICAge2VuYWJsZSxkaXNhYmxlfV9pcnEgKmNvdW50cyoKKwkJCQkJICAgdGhlbS4gIC0tIEFWICAqLworCQkJCQlFTkFCTEUoZGV2LT5pcnEpOworCQkJCQlubC0+ZW5ldF9zdGF0cy5jb2xsaXNpb25zKys7CisJCQkJCXJldHVybiBPSzsKKwkJCQl9CisJCQkJZGlzYWJsZV9wYXJwb3J0X2ludGVycnVwdHMgKGRldik7CisJCQkJaWYgKG5ldF9kZWJ1ZyA+IDIpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2VuZCBzdGFydFxuIiwgZGV2LT5uYW1lKTsKKwkJCQlzbmQtPnN0YXRlID0gUExJUF9QS19MRU5HVEhfTFNCOworCQkJCXNuZC0+bmliYmxlID0gUExJUF9OQl9CRUdJTjsKKwkJCQlubC0+dGltZW91dF9jb3VudCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKKwkJCWlmICgtLWN4ID09IDApIHsKKwkJCQl3cml0ZV9kYXRhIChkZXYsIDB4MDApOworCQkJCXJldHVybiBIU19USU1FT1VUOworCQkJfQorCQl9CisKKwljYXNlIFBMSVBfUEtfTEVOR1RIX0xTQjoKKwkJaWYgKHBsaXBfc2VuZChuaWJibGVfdGltZW91dCwgZGV2LAorCQkJICAgICAgJnNuZC0+bmliYmxlLCBzbmQtPmxlbmd0aC5iLmxzYikpCisJCQlyZXR1cm4gVElNRU9VVDsKKwkJc25kLT5zdGF0ZSA9IFBMSVBfUEtfTEVOR1RIX01TQjsKKworCWNhc2UgUExJUF9QS19MRU5HVEhfTVNCOgorCQlpZiAocGxpcF9zZW5kKG5pYmJsZV90aW1lb3V0LCBkZXYsCisJCQkgICAgICAmc25kLT5uaWJibGUsIHNuZC0+bGVuZ3RoLmIubXNiKSkKKwkJCXJldHVybiBUSU1FT1VUOworCQlzbmQtPnN0YXRlID0gUExJUF9QS19EQVRBOworCQlzbmQtPmJ5dGUgPSAwOworCQlzbmQtPmNoZWNrc3VtID0gMDsKKworCWNhc2UgUExJUF9QS19EQVRBOgorCQlkbworCQkJaWYgKHBsaXBfc2VuZChuaWJibGVfdGltZW91dCwgZGV2LAorCQkJCSAgICAgICZzbmQtPm5pYmJsZSwgbGJ1ZltzbmQtPmJ5dGVdKSkKKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJd2hpbGUgKCsrc25kLT5ieXRlIDwgc25kLT5sZW5ndGguaCk7CisJCWRvCisJCQlzbmQtPmNoZWNrc3VtICs9IGxidWZbLS1zbmQtPmJ5dGVdOworCQl3aGlsZSAoc25kLT5ieXRlKTsKKwkJc25kLT5zdGF0ZSA9IFBMSVBfUEtfQ0hFQ0tTVU07CisKKwljYXNlIFBMSVBfUEtfQ0hFQ0tTVU06CisJCWlmIChwbGlwX3NlbmQobmliYmxlX3RpbWVvdXQsIGRldiwKKwkJCSAgICAgICZzbmQtPm5pYmJsZSwgc25kLT5jaGVja3N1bSkpCisJCQlyZXR1cm4gVElNRU9VVDsKKworCQlubC0+ZW5ldF9zdGF0cy50eF9ieXRlcyArPSBzbmQtPnNrYi0+bGVuOworCQlkZXZfa2ZyZWVfc2tiKHNuZC0+c2tiKTsKKwkJbmwtPmVuZXRfc3RhdHMudHhfcGFja2V0cysrOworCQlzbmQtPnN0YXRlID0gUExJUF9QS19ET05FOworCisJY2FzZSBQTElQX1BLX0RPTkU6CisJCS8qIENsb3NlIHRoZSBjb25uZWN0aW9uICovCisJCXdyaXRlX2RhdGEgKGRldiwgMHgwMCk7CisJCXNuZC0+c2tiID0gTlVMTDsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDIpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNlbmQgZW5kXG4iLCBkZXYtPm5hbWUpOworCQlubC0+Y29ubmVjdGlvbiA9IFBMSVBfQ05fQ0xPU0lORzsKKwkJbmwtPmlzX2RlZmVycmVkID0gMTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZubC0+ZGVmZXJyZWQsIDEpOworCQllbmFibGVfcGFycG9ydF9pbnRlcnJ1cHRzIChkZXYpOworCQlFTkFCTEUoZGV2LT5pcnEpOworCQlyZXR1cm4gT0s7CisJfQorCXJldHVybiBPSzsKK30KKworc3RhdGljIGludAorcGxpcF9jb25uZWN0aW9uX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRfbG9jYWwgKm5sLAorCQkgICAgICBzdHJ1Y3QgcGxpcF9sb2NhbCAqc25kLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2KQoreworCXNwaW5fbG9ja19pcnEoJm5sLT5sb2NrKTsKKwlpZiAobmwtPmNvbm5lY3Rpb24gPT0gUExJUF9DTl9DTE9TSU5HKSB7CisJCW5sLT5jb25uZWN0aW9uID0gUExJUF9DTl9OT05FOworCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCX0KKwlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKKwlpZiAobmwtPnNob3VsZF9yZWxpbnF1aXNoKSB7CisJCW5sLT5zaG91bGRfcmVsaW5xdWlzaCA9IG5sLT5wb3J0X293bmVyID0gMDsKKwkJcGFycG9ydF9yZWxlYXNlKG5sLT5wYXJkZXYpOworCX0KKwlyZXR1cm4gT0s7Cit9CisKKy8qIFBMSVBfRVJST1IgLS0tIHdhaXQgdGlsbCBvdGhlciBlbmQgc2V0dGxlZCAqLworc3RhdGljIGludAorcGxpcF9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0X2xvY2FsICpubCwKKwkgICBzdHJ1Y3QgcGxpcF9sb2NhbCAqc25kLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2KQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZF9zdGF0dXMoZGV2KTsKKwlpZiAoKHN0YXR1cyAmIDB4ZjgpID09IDB4ODApIHsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDIpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlc2V0IGludGVyZmFjZS5cbiIsIGRldi0+bmFtZSk7CisJCW5sLT5jb25uZWN0aW9uID0gUExJUF9DTl9OT05FOworCQlubC0+c2hvdWxkX3JlbGlucXVpc2ggPSAwOworCQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKwkJZW5hYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoZGV2KTsKKwkJRU5BQkxFKGRldi0+aXJxKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwl9IGVsc2UgeworCQlubC0+aXNfZGVmZXJyZWQgPSAxOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm5sLT5kZWZlcnJlZCwgMSk7CisJfQorCisJcmV0dXJuIE9LOworfQorDAorLyogSGFuZGxlIHRoZSBwYXJhbGxlbCBwb3J0IGludGVycnVwdHMuICovCitzdGF0aWMgdm9pZAorcGxpcF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubDsKKwlzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2OworCXVuc2lnbmVkIGNoYXIgYzA7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInBsaXBfaW50ZXJydXB0OiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgaXJxKTsKKwkJcmV0dXJuOworCX0KKworCW5sID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyY3YgPSAmbmwtPnJjdl9kYXRhOworCisJc3Bpbl9sb2NrX2lycSAoJm5sLT5sb2NrKTsKKworCWMwID0gcmVhZF9zdGF0dXMoZGV2KTsKKwlpZiAoKGMwICYgMHhmOCkgIT0gMHhjMCkgeworCQlpZiAoKGRldi0+aXJxICE9IC0xKSAmJiAobmV0X2RlYnVnID4gMSkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNwdXJpb3VzIGludGVycnVwdFxuIiwgZGV2LT5uYW1lKTsKKwkJc3Bpbl91bmxvY2tfaXJxICgmbmwtPmxvY2spOworCQlyZXR1cm47CisJfQorCisJaWYgKG5ldF9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJydXB0LlxuIiwgZGV2LT5uYW1lKTsKKworCXN3aXRjaCAobmwtPmNvbm5lY3Rpb24pIHsKKwljYXNlIFBMSVBfQ05fQ0xPU0lORzoKKwkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwljYXNlIFBMSVBfQ05fTk9ORToKKwljYXNlIFBMSVBfQ05fU0VORDoKKwkJcmN2LT5zdGF0ZSA9IFBMSVBfUEtfVFJJR0dFUjsKKwkJbmwtPmNvbm5lY3Rpb24gPSBQTElQX0NOX1JFQ0VJVkU7CisJCW5sLT50aW1lb3V0X2NvdW50ID0gMDsKKwkJc2NoZWR1bGVfd29yaygmbmwtPmltbWVkaWF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBQTElQX0NOX1JFQ0VJVkU6CisJCS8qIE1heSBvY2N1ciBiZWNhdXNlIHRoZXJlIGlzIHJhY2UgY29uZGl0aW9uCisJCSAgIGFyb3VuZCB0ZXN0IGFuZCBzZXQgb2YgZGV2LT5pbnRlcnJ1cHQuCisJCSAgIElnbm9yZSB0aGlzIGludGVycnVwdC4gKi8KKwkJYnJlYWs7CisKKwljYXNlIFBMSVBfQ05fRVJST1I6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlY2VpdmUgaW50ZXJydXB0IGluIGVycm9yIHN0YXRlXG4iLCBkZXYtPm5hbWUpOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKK30KKwwKK3N0YXRpYyBpbnQKK3BsaXBfdHhfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwbGlwX2xvY2FsICpzbmQgPSAmbmwtPnNuZF9kYXRhOworCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJcmV0dXJuIDE7CisKKwkvKiBXZSBtYXkgbmVlZCB0byBncmFiIHRoZSBidXMgKi8KKwlpZiAoIW5sLT5wb3J0X293bmVyKSB7CisJCWlmIChwYXJwb3J0X2NsYWltKG5sLT5wYXJkZXYpKQorCQkJcmV0dXJuIDE7CisJCW5sLT5wb3J0X293bmVyID0gMTsKKwl9CisKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCQorCWlmIChza2ItPmxlbiA+IGRldi0+bXR1ICsgZGV2LT5oYXJkX2hlYWRlcl9sZW4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHBhY2tldCB0b28gYmlnLCAlZC5cbiIsIGRldi0+bmFtZSwgKGludClza2ItPmxlbik7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobmV0X2RlYnVnID4gMikKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzZW5kIHJlcXVlc3RcbiIsIGRldi0+bmFtZSk7CisKKwlzcGluX2xvY2tfaXJxKCZubC0+bG9jayk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc25kLT5za2IgPSBza2I7CisJc25kLT5sZW5ndGguaCA9IHNrYi0+bGVuOworCXNuZC0+c3RhdGUgPSBQTElQX1BLX1RSSUdHRVI7CisJaWYgKG5sLT5jb25uZWN0aW9uID09IFBMSVBfQ05fTk9ORSkgeworCQlubC0+Y29ubmVjdGlvbiA9IFBMSVBfQ05fU0VORDsKKwkJbmwtPnRpbWVvdXRfY291bnQgPSAwOworCX0KKwlzY2hlZHVsZV93b3JrKCZubC0+aW1tZWRpYXRlKTsKKwlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3BsaXBfcmV3cml0ZV9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGhoZHIgKmV0aCkKK3sKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKwlpZiAoKGluX2Rldj1kZXYtPmlwX3B0cikgIT0gTlVMTCkgeworCQkvKiBBbnkgYWRkcmVzcyB3aWxsIGRvIC0gd2UgdGFrZSB0aGUgZmlyc3QgKi8KKwkJc3RydWN0IGluX2lmYWRkciAqaWZhPWluX2Rldi0+aWZhX2xpc3Q7CisJCWlmIChpZmEgIT0gTlVMTCkgeworCQkJbWVtY3B5KGV0aC0+aF9zb3VyY2UsIGRldi0+ZGV2X2FkZHIsIDYpOworCQkJbWVtc2V0KGV0aC0+aF9kZXN0LCAweGZjLCAyKTsKKwkJCW1lbWNweShldGgtPmhfZGVzdCsyLCAmaWZhLT5pZmFfYWRkcmVzcywgNCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQKK3BsaXBfaGFyZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsCisJICAgICAgICAgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldDsKKworCWlmICgocmV0ID0gbmwtPm9yaWdfaGFyZF9oZWFkZXIoc2tiLCBkZXYsIHR5cGUsIGRhZGRyLCBzYWRkciwgbGVuKSkgPj0gMCkKKwkJcGxpcF9yZXdyaXRlX2FkZHJlc3MgKGRldiwgKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHBsaXBfaGFyZF9oZWFkZXJfY2FjaGUoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGhfY2FjaGUgKmhoKQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5sID0gbmVpZ2gtPmRldi0+cHJpdjsKKwlpbnQgcmV0OworCQorCWlmICgocmV0ID0gbmwtPm9yaWdfaGFyZF9oZWFkZXJfY2FjaGUobmVpZ2gsIGhoKSkgPT0gMCkKKwl7CisJCXN0cnVjdCBldGhoZHIgKmV0aDsKKworCQlldGggPSAoc3RydWN0IGV0aGhkciopKCgodTgqKWhoLT5oaF9kYXRhKSArCisJCQkJICAgICAgIEhIX0RBVEFfT0ZGKHNpemVvZigqZXRoKSkpOworCQlwbGlwX3Jld3JpdGVfYWRkcmVzcyAobmVpZ2gtPmRldiwgZXRoKTsKKwl9CisJCisJcmV0dXJuIHJldDsKK30gICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKKyAgIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKworICAgVGhpcyByb3V0aW5lIGdldHMgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgcGFyYWxsZWwgcG9ydCBieSBhbGxvY2F0aW5nCisgICBpdHMgSVJRIGxpbmUuCisgKi8KK3N0YXRpYyBpbnQKK3BsaXBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5sID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKwkvKiBHcmFiIHRoZSBwb3J0ICovCisJaWYgKCFubC0+cG9ydF9vd25lcikgeworCQlpZiAocGFycG9ydF9jbGFpbShubC0+cGFyZGV2KSkgcmV0dXJuIC1FQUdBSU47CisJCW5sLT5wb3J0X293bmVyID0gMTsKKwl9CisKKwlubC0+c2hvdWxkX3JlbGlucXVpc2ggPSAwOworCisJLyogQ2xlYXIgdGhlIGRhdGEgcG9ydC4gKi8KKwl3cml0ZV9kYXRhIChkZXYsIDB4MDApOworCisJLyogRW5hYmxlIHJ4IGludGVycnVwdC4gKi8KKwllbmFibGVfcGFycG9ydF9pbnRlcnJ1cHRzIChkZXYpOworCWlmIChkZXYtPmlycSA9PSAtMSkKKwl7CisJCWF0b21pY19zZXQgKCZubC0+a2lsbF90aW1lciwgMCk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbmwtPnRpbWVyLCAxKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBzdGF0ZSBtYWNoaW5lLiAqLworCW5sLT5yY3ZfZGF0YS5zdGF0ZSA9IG5sLT5zbmRfZGF0YS5zdGF0ZSA9IFBMSVBfUEtfRE9ORTsKKwlubC0+cmN2X2RhdGEuc2tiID0gbmwtPnNuZF9kYXRhLnNrYiA9IE5VTEw7CisJbmwtPmNvbm5lY3Rpb24gPSBQTElQX0NOX05PTkU7CisJbmwtPmlzX2RlZmVycmVkID0gMDsKKworCS8qIEZpbGwgaW4gdGhlIE1BQy1sZXZlbCBoZWFkZXIuCisJICAgV2UgdXNlZCB0byBhYnVzZSBkZXYtPmJyb2FkY2FzdCB0byBzdG9yZSB0aGUgcG9pbnQtdG8tcG9pbnQKKwkgICBNQUMgYWRkcmVzcywgYnV0IHdlIG5vIGxvbmdlciBkbyBpdC4gSW5zdGVhZCwgd2UgZmV0Y2ggdGhlCisJICAgaW50ZXJmYWNlIGFkZHJlc3Mgd2hlbmV2ZXIgaXQgaXMgbmVlZGVkLCB3aGljaCBpcyBjaGVhcCBlbm91Z2gKKwkgICBiZWNhdXNlIHdlIHVzZSB0aGUgaGhfY2FjaGUuIEFjdHVhbGx5LCBhYnVzaW5nIGRldi0+YnJvYWRjYXN0CisJICAgZGlkbid0IHdvcmssIGJlY2F1c2Ugd2hlbiB1c2luZyBwbGlwX29wZW4gdGhlIHBvaW50LXRvLXBvaW50CisJICAgYWRkcmVzcyBpc24ndCB5ZXQga25vd24uCisJICAgUExJUCBkb2Vzbid0IGhhdmUgYSByZWFsIE1BQyBhZGRyZXNzLCBidXQgd2UgbmVlZCBpdCB0byBiZQorCSAgIERPUyBjb21wYXRpYmxlLCBhbmQgdG8gcHJvcGVybHkgc3VwcG9ydCB0YXBzIChvdGhlcndpc2UsCisJICAgd2hlbiB0aGUgZGV2aWNlIGFkZHJlc3MgaXNuJ3QgaWRlbnRpY2FsIHRvIHRoZSBhZGRyZXNzIG9mIGEKKwkgICByZWNlaXZlZCBmcmFtZSwgdGhlIGtlcm5lbCBpbmNvcnJlY3RseSBkcm9wcyBpdCkuICAgICAgICAgICAgICovCisKKwlpZiAoKGluX2Rldj1kZXYtPmlwX3B0cikgIT0gTlVMTCkgeworCQkvKiBBbnkgYWRkcmVzcyB3aWxsIGRvIC0gd2UgdGFrZSB0aGUgZmlyc3QuIFdlIGFscmVhZHkKKwkJICAgaGF2ZSB0aGUgZmlyc3QgdHdvIGJ5dGVzIGZpbGxlZCB3aXRoIDB4ZmMsIGZyb20KKwkJICAgcGxpcF9pbml0X2RldigpLiAqLworCQlzdHJ1Y3QgaW5faWZhZGRyICppZmE9aW5fZGV2LT5pZmFfbGlzdDsKKwkJaWYgKGlmYSAhPSBOVUxMKSB7CisJCQltZW1jcHkoZGV2LT5kZXZfYWRkcisyLCAmaWZhLT5pZmFfbG9jYWwsIDQpOworCQl9CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGludmVyc2Ugcm91dGluZSB0byBwbGlwX29wZW4gKCkuICovCitzdGF0aWMgaW50CitwbGlwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwbGlwX2xvY2FsICpzbmQgPSAmbmwtPnNuZF9kYXRhOworCXN0cnVjdCBwbGlwX2xvY2FsICpyY3YgPSAmbmwtPnJjdl9kYXRhOworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwlESVNBQkxFKGRldi0+aXJxKTsKKwlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCisJaWYgKGRldi0+aXJxID09IC0xKQorCXsKKwkJaW5pdF9NVVRFWF9MT0NLRUQgKCZubC0+a2lsbGVkX3RpbWVyX3NlbSk7CisJCWF0b21pY19zZXQgKCZubC0+a2lsbF90aW1lciwgMSk7CisJCWRvd24gKCZubC0+a2lsbGVkX3RpbWVyX3NlbSk7CisJfQorCisjaWZkZWYgTk9UREVGCisJb3V0YigweDAwLCBQQVJfREFUQShkZXYpKTsKKyNlbmRpZgorCW5sLT5pc19kZWZlcnJlZCA9IDA7CisJbmwtPmNvbm5lY3Rpb24gPSBQTElQX0NOX05PTkU7CisJaWYgKG5sLT5wb3J0X293bmVyKSB7CisJCXBhcnBvcnRfcmVsZWFzZShubC0+cGFyZGV2KTsKKwkJbmwtPnBvcnRfb3duZXIgPSAwOworCX0KKworCXNuZC0+c3RhdGUgPSBQTElQX1BLX0RPTkU7CisJaWYgKHNuZC0+c2tiKSB7CisJCWRldl9rZnJlZV9za2Ioc25kLT5za2IpOworCQlzbmQtPnNrYiA9IE5VTEw7CisJfQorCXJjdi0+c3RhdGUgPSBQTElQX1BLX0RPTkU7CisJaWYgKHJjdi0+c2tiKSB7CisJCWtmcmVlX3NrYihyY3YtPnNrYik7CisJCXJjdi0+c2tiID0gTlVMTDsKKwl9CisKKyNpZmRlZiBOT1RERUYKKwkvKiBSZXNldC4gKi8KKwlvdXRiKDB4MDAsIFBBUl9DT05UUk9MKGRldikpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BsaXBfcHJlZW1wdCh2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWhhbmRsZTsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBTdGFuZCBvdXIgZ3JvdW5kIGlmIGEgZGF0YWdyYW0gaXMgb24gdGhlIHdpcmUgKi8KKwlpZiAobmwtPmNvbm5lY3Rpb24gIT0gUExJUF9DTl9OT05FKSB7CisJCW5sLT5zaG91bGRfcmVsaW5xdWlzaCA9IDE7CisJCXJldHVybiAxOworCX0KKworCW5sLT5wb3J0X293bmVyID0gMDsJLyogUmVtZW1iZXIgdGhhdCB3ZSByZWxlYXNlZCB0aGUgYnVzICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitwbGlwX3dha2V1cCh2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWhhbmRsZTsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobmwtPnBvcnRfb3duZXIpIHsKKwkJLyogV2h5IGFyZSB3ZSBiZWluZyB3b2tlbiB1cD8gKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3aHkgYW0gSSBiZWluZyB3b2tlbiB1cD9cbiIsIGRldi0+bmFtZSk7CisJCWlmICghcGFycG9ydF9jbGFpbShubC0+cGFyZGV2KSkKKwkJCS8qIGJ1c19vd25lciBpcyBhbHJlYWR5IHNldCAoYnV0IHdoeT8pICovCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEknbSBicm9rZW4uXG4iLCBkZXYtPm5hbWUpOworCQllbHNlCisJCQlyZXR1cm47CisJfQorCQorCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQkvKiBEb24ndCBuZWVkIHRoZSBwb3J0IHdoZW4gdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJCXJldHVybjsKKworCWlmICghcGFycG9ydF9jbGFpbShubC0+cGFyZGV2KSkgeworCQlubC0+cG9ydF9vd25lciA9IDE7CisJCS8qIENsZWFyIHRoZSBkYXRhIHBvcnQuICovCisJCXdyaXRlX2RhdGEgKGRldiwgMHgwMCk7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorcGxpcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnIgPSAmbmwtPmVuZXRfc3RhdHM7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludAorcGxpcF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5sID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGxpcGNvbmYgKnBjID0gKHN0cnVjdCBwbGlwY29uZiAqKSAmcnEtPmlmcl9pZnJ1OworCisJaWYgKGNtZCAhPSBTSU9DREVWUExJUCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc3dpdGNoKHBjLT5wY21kKSB7CisJY2FzZSBQTElQX0dFVF9USU1FT1VUOgorCQlwYy0+dHJpZ2dlciA9IG5sLT50cmlnZ2VyOworCQlwYy0+bmliYmxlICA9IG5sLT5uaWJibGU7CisJCWJyZWFrOworCWNhc2UgUExJUF9TRVRfVElNRU9VVDoKKwkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlubC0+dHJpZ2dlciA9IHBjLT50cmlnZ2VyOworCQlubC0+bmliYmxlICA9IHBjLT5uaWJibGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIDA7Cit9CisMCitzdGF0aWMgaW50IHBhcnBvcnRbUExJUF9NQVhdID0geyBbMCAuLi4gUExJUF9NQVgtMV0gPSAtMSB9Oworc3RhdGljIGludCB0aW1pZDsKKworbW9kdWxlX3BhcmFtX2FycmF5KHBhcnBvcnQsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0odGltaWQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBhcnBvcnQsICJMaXN0IG9mIHBhcnBvcnQgZGV2aWNlIG51bWJlcnMgdG8gdXNlIGJ5IHBsaXAiKTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfcGxpcFtQTElQX01BWF0gPSB7IE5VTEwsIH07CisKK3N0YXRpYyBpbmxpbmUgaW50CitwbGlwX3NlYXJjaGZvcihpbnQgbGlzdFtdLCBpbnQgYSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgUExJUF9NQVggJiYgbGlzdFtpXSAhPSAtMTsgaSsrKSB7CisJCWlmIChsaXN0W2ldID09IGEpIHJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogcGxpcF9hdHRhY2goKSBpcyBjYWxsZWQgKGJ5IHRoZSBwYXJwb3J0IGNvZGUpIHdoZW4gYSBwb3J0IGlzCisgKiBhdmFpbGFibGUgdG8gdXNlLiAqLworc3RhdGljIHZvaWQgcGxpcF9hdHRhY2ggKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCXN0YXRpYyBpbnQgdW5pdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRfbG9jYWwgKm5sOworCWNoYXIgbmFtZVtJRk5BTVNJWl07CisKKwlpZiAoKHBhcnBvcnRbMF0gPT0gLTEgJiYgKCF0aW1pZCB8fCAhcG9ydC0+ZGV2aWNlcykpIHx8IAorCSAgICBwbGlwX3NlYXJjaGZvcihwYXJwb3J0LCBwb3J0LT5udW1iZXIpKSB7CisJCWlmICh1bml0ID09IFBMSVBfTUFYKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInBsaXA6IHRvbyBtYW55IGRldmljZXNcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJc3ByaW50ZihuYW1lLCAicGxpcCVkIiwgdW5pdCk7CisJCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJCWlmICghZGV2KSB7CisJCQlwcmludGsoS0VSTl9FUlIgInBsaXA6IG1lbW9yeSBzcXVlZXplXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJc3RyY3B5KGRldi0+bmFtZSwgbmFtZSk7CisKKwkJU0VUX01PRFVMRV9PV05FUihkZXYpOworCQlkZXYtPmlycSA9IHBvcnQtPmlycTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBwb3J0LT5iYXNlOworCQlpZiAocG9ydC0+aXJxID09IC0xKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJwbGlwOiAlcyBoYXMgbm8gSVJRLiBVc2luZyBJUlEtbGVzcyBtb2RlLCIKKwkJICAgICAgICAgICAgICAgICAid2hpY2ggaXMgZmFpcmx5IGluZWZmaWNpZW50IVxuIiwgcG9ydC0+bmFtZSk7CisJCX0KKworCQlubCA9IG5ldGRldl9wcml2KGRldik7CisJCW5sLT5wYXJkZXYgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwb3J0LCBuYW1lLCBwbGlwX3ByZWVtcHQsCisJCQkJCQkgcGxpcF93YWtldXAsIHBsaXBfaW50ZXJydXB0LCAKKwkJCQkJCSAwLCBkZXYpOworCisJCWlmICghbmwtPnBhcmRldikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcGFycG9ydF9yZWdpc3RlciBmYWlsZWRcbiIsIG5hbWUpOworCQkJZ290byBlcnJfZnJlZV9kZXY7CisJCQlyZXR1cm47CisJCX0KKworCQlwbGlwX2luaXRfbmV0ZGV2KGRldik7CisKKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBuZXR3b3JrIHJlZ2lzdGVyIGZhaWxlZFxuIiwgbmFtZSk7CisJCQlnb3RvIGVycl9wYXJwb3J0X3VucmVnaXN0ZXI7CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCQlpZiAoZGV2LT5pcnEgIT0gLTEpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUGFyYWxsZWwgcG9ydCBhdCAlIzNseCwgIgorCQkJCQkgInVzaW5nIElSUSAlZC5cbiIsCisJCQkJICAgICAgICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUGFyYWxsZWwgcG9ydCBhdCAlIzNseCwgIgorCQkJCQkgIm5vdCB1c2luZyBJUlEuXG4iLAorCQkJCQkgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkcik7CisJCWRldl9wbGlwW3VuaXQrK10gPSBkZXY7CisJfQorCXJldHVybjsKKworZXJyX3BhcnBvcnRfdW5yZWdpc3RlcjoKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKG5sLT5wYXJkZXYpOworZXJyX2ZyZWVfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuOworfQorCisvKiBwbGlwX2RldGFjaCgpIGlzIGNhbGxlZCAoYnkgdGhlIHBhcnBvcnQgY29kZSkgd2hlbiBhIHBvcnQgaXMKKyAqIG5vIGxvbmdlciBhdmFpbGFibGUgdG8gdXNlLiAqLworc3RhdGljIHZvaWQgcGxpcF9kZXRhY2ggKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCS8qIE5vdGhpbmcgdG8gZG8gKi8KK30KKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBwbGlwX2RyaXZlciA9IHsKKwkubmFtZQk9ICJwbGlwIiwKKwkuYXR0YWNoID0gcGxpcF9hdHRhY2gsCisJLmRldGFjaCA9IHBsaXBfZGV0YWNoCit9OworCitzdGF0aWMgdm9pZCBfX2V4aXQgcGxpcF9jbGVhbnVwX21vZHVsZSAodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpOworCisJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlciAoJnBsaXBfZHJpdmVyKTsKKworCWZvciAoaT0wOyBpIDwgUExJUF9NQVg7IGkrKykgeworCQlpZiAoKGRldiA9IGRldl9wbGlwW2ldKSkgeworCQkJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWlmIChubC0+cG9ydF9vd25lcikKKwkJCQlwYXJwb3J0X3JlbGVhc2UobmwtPnBhcmRldik7CisJCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKG5sLT5wYXJkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWRldl9wbGlwW2ldID0gTlVMTDsKKwkJfQorCX0KK30KKworI2lmbmRlZiBNT0RVTEUKKworc3RhdGljIGludCBwYXJwb3J0X3B0cjsKKworc3RhdGljIGludCBfX2luaXQgcGxpcF9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbNF07CisKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJLyogVWdoLiAqLworCWlmICghc3RybmNtcChzdHIsICJwYXJwb3J0IiwgNykpIHsKKwkJaW50IG4gPSBzaW1wbGVfc3RydG91bChzdHIrNywgTlVMTCwgMTApOworCQlpZiAocGFycG9ydF9wdHIgPCBQTElQX01BWCkKKwkJCXBhcnBvcnRbcGFycG9ydF9wdHIrK10gPSBuOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICJwbGlwOiB0b28gbWFueSBwb3J0cywgJXMgaWdub3JlZC5cbiIsCisJCQkgICAgICAgc3RyKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAidGltaWQiKSkgeworCQl0aW1pZCA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKGludHNbMF0gPT0gMCB8fCBpbnRzWzFdID09IDApIHsKKwkJCS8qIGRpc2FibGUgZHJpdmVyIG9uICJwbGlwPSIgb3IgInBsaXA9MCIgKi8KKwkJCXBhcnBvcnRbMF0gPSAtMjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhcm5pbmc6ICdwbGlwPTB4JXgnIGlnbm9yZWRcbiIsIAorCQkJICAgICAgIGludHNbMV0pOworCQl9CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJwbGlwPSIsIHBsaXBfc2V0dXApOworCisjZW5kaWYgLyogIU1PRFVMRSAqLworCitzdGF0aWMgaW50IF9faW5pdCBwbGlwX2luaXQgKHZvaWQpCit7CisJaWYgKHBhcnBvcnRbMF0gPT0gLTIpCisJCXJldHVybiAwOworCisJaWYgKHBhcnBvcnRbMF0gIT0gLTEgJiYgdGltaWQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGxpcDogd2FybmluZywgaWdub3JpbmcgYHRpbWlkJyBzaW5jZSBzcGVjaWZpYyBwb3J0cyBnaXZlbi5cbiIpOworCQl0aW1pZCA9IDA7CisJfQorCisJaWYgKHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyICgmcGxpcF9kcml2ZXIpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJwbGlwOiBjb3VsZG4ndCByZWdpc3RlciBkcml2ZXJcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQocGxpcF9pbml0KTsKK21vZHVsZV9leGl0KHBsaXBfY2xlYW51cF9tb2R1bGUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1ETU9EVkVSU0lPTlMgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1nIC1mb21pdC1mcmFtZS1wb2ludGVyIC1waXBlIC1jIHBsaXAuYyIKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2FzeW5jLmMgYi9kcml2ZXJzL25ldC9wcHBfYXN5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I5ZDc5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcHBwX2FzeW5jLmMKQEAgLTAsMCArMSwxMDMzIEBACisvKgorICogUFBQIGFzeW5jIHNlcmlhbCBjaGFubmVsIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IDE5OTkgUGF1bCBNYWNrZXJyYXMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBkcml2ZXIgcHJvdmlkZXMgdGhlIGVuY2Fwc3VsYXRpb24gYW5kIGZyYW1pbmcgZm9yIHNlbmRpbmcKKyAqIGFuZCByZWNlaXZpbmcgUFBQIGZyYW1lcyBvdmVyIGFzeW5jIHNlcmlhbCBsaW5lcy4gIEl0IHJlbGllcyBvbgorICogdGhlIGdlbmVyaWMgUFBQIGxheWVyIHRvIGdpdmUgaXQgZnJhbWVzIHRvIHNlbmQgYW5kIHRvIHByb2Nlc3MKKyAqIHJlY2VpdmVkIGZyYW1lcy4gIEl0IGltcGxlbWVudHMgdGhlIFBQUCBsaW5lIGRpc2NpcGxpbmUuCisgKgorICogUGFydCBvZiB0aGUgY29kZSBpbiB0aGlzIGRyaXZlciB3YXMgaW5zcGlyZWQgYnkgdGhlIG9sZCBhc3luYy1vbmx5CisgKiBQUFAgZHJpdmVyLCB3cml0dGVuIGJ5IE1pY2hhZWwgQ2FsbGFoYW4gYW5kIEFsIExvbmd5ZWFyLCBhbmQKKyAqIHN1YnNlcXVlbnRseSBoYWNrZWQgYnkgUGF1bCBNYWNrZXJyYXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMtY2NpdHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BwcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9jaGFubmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBQUFBfVkVSU0lPTgkiMi40LjIiCisKKyNkZWZpbmUgT0JVRlNJWkUJMjU2CisKKy8qIFN0cnVjdHVyZSBmb3Igc3RvcmluZyBsb2NhbCBzdGF0ZS4gKi8KK3N0cnVjdCBhc3luY3BwcCB7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBpbnQJZmxhZ3M7CisJdW5zaWduZWQgaW50CXN0YXRlOworCXVuc2lnbmVkIGludAlyYml0czsKKwlpbnQJCW1ydTsKKwlzcGlubG9ja190CXhtaXRfbG9jazsKKwlzcGlubG9ja190CXJlY3ZfbG9jazsKKwl1bnNpZ25lZCBsb25nCXhtaXRfZmxhZ3M7CisJdTMyCQl4YWNjbVs4XTsKKwl1MzIJCXJhY2NtOworCXVuc2lnbmVkIGludAlieXRlc19zZW50OworCXVuc2lnbmVkIGludAlieXRlc19yY3ZkOworCisJc3RydWN0IHNrX2J1ZmYJKnRwa3Q7CisJaW50CQl0cGt0X3BvczsKKwl1MTYJCXRmY3M7CisJdW5zaWduZWQgY2hhcgkqb3B0cjsKKwl1bnNpZ25lZCBjaGFyCSpvbGltOworCXVuc2lnbmVkIGxvbmcJbGFzdF94bWl0OworCisJc3RydWN0IHNrX2J1ZmYJKnJwa3Q7CisJaW50CQlsY3BfZmNzOworCXN0cnVjdCBza19idWZmX2hlYWQgcnF1ZXVlOworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRzazsKKworCWF0b21pY190CXJlZmNudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGRlYWRfc2VtOworCXN0cnVjdCBwcHBfY2hhbm5lbCBjaGFuOwkvKiBpbnRlcmZhY2UgdG8gZ2VuZXJpYyBwcHAgbGF5ZXIgKi8KKwl1bnNpZ25lZCBjaGFyCW9idWZbT0JVRlNJWkVdOworfTsKKworLyogQml0IG51bWJlcnMgaW4geG1pdF9mbGFncyAqLworI2RlZmluZSBYTUlUX1dBS0VVUAkwCisjZGVmaW5lIFhNSVRfRlVMTAkxCisjZGVmaW5lIFhNSVRfQlVTWQkyCisKKy8qIFN0YXRlIGJpdHMgKi8KKyNkZWZpbmUgU0NfVE9TUwkJMQorI2RlZmluZSBTQ19FU0NBUEUJMgorI2RlZmluZSBTQ19QUkVWX0VSUk9SCTQKKworLyogQml0cyBpbiByYml0cyAqLworI2RlZmluZSBTQ19SQ1ZfQklUUwkoU0NfUkNWX0I3XzF8U0NfUkNWX0I3XzB8U0NfUkNWX09ERFB8U0NfUkNWX0VWTlApCisKK3N0YXRpYyBpbnQgZmxhZ190aW1lID0gSFo7Cittb2R1bGVfcGFyYW0oZmxhZ190aW1lLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmbGFnX3RpbWUsICJwcHBfYXN5bmM6IGludGVydmFsIGJldHdlZW4gZmxhZ2dlZCBwYWNrZXRzIChpbiBjbG9jayB0aWNrcykiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19MRElTQyhOX1BQUCk7CisKKy8qCisgKiBQcm90b3R5cGVzLgorICovCitzdGF0aWMgaW50IHBwcF9hc3luY19lbmNvZGUoc3RydWN0IGFzeW5jcHBwICphcCk7CitzdGF0aWMgaW50IHBwcF9hc3luY19zZW5kKHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50IHBwcF9hc3luY19wdXNoKHN0cnVjdCBhc3luY3BwcCAqYXApOworc3RhdGljIHZvaWQgcHBwX2FzeW5jX2ZsdXNoX291dHB1dChzdHJ1Y3QgYXN5bmNwcHAgKmFwKTsKK3N0YXRpYyB2b2lkIHBwcF9hc3luY19pbnB1dChzdHJ1Y3QgYXN5bmNwcHAgKmFwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgICAgY2hhciAqZmxhZ3MsIGludCBjb3VudCk7CitzdGF0aWMgaW50IHBwcF9hc3luY19pb2N0bChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdm9pZCBwcHBfYXN5bmNfcHJvY2Vzcyh1bnNpZ25lZCBsb25nIGFyZyk7CisKK3N0YXRpYyB2b2lkIGFzeW5jX2xjcF9wZWVrKHN0cnVjdCBhc3luY3BwcCAqYXAsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgICBpbnQgbGVuLCBpbnQgaW5ib3VuZCk7CisKK3N0YXRpYyBzdHJ1Y3QgcHBwX2NoYW5uZWxfb3BzIGFzeW5jX29wcyA9IHsKKwlwcHBfYXN5bmNfc2VuZCwKKwlwcHBfYXN5bmNfaW9jdGwKK307CisKKy8qCisgKiBSb3V0aW5lcyBpbXBsZW1lbnRpbmcgdGhlIFBQUCBsaW5lIGRpc2NpcGxpbmUuCisgKi8KKworLyoKKyAqIFdlIGhhdmUgYSBwb3RlbnRpYWwgcmFjZSBvbiBkZXJlZmVyZW5jaW5nIHR0eS0+ZGlzY19kYXRhLAorICogYmVjYXVzZSB0aGUgdHR5IGxheWVyIHByb3ZpZGVzIG5vIGxvY2tpbmcgYXQgYWxsIC0gdGh1cyBvbmUKKyAqIGNwdSBjb3VsZCBiZSBydW5uaW5nIHBwcF9hc3luY3R0eV9yZWNlaXZlIHdoaWxlIGFub3RoZXIKKyAqIGNhbGxzIHBwcF9hc3luY3R0eV9jbG9zZSwgd2hpY2ggemVyb2VzIHR0eS0+ZGlzY19kYXRhIGFuZAorICogZnJlZXMgdGhlIG1lbW9yeSB0aGF0IHBwcF9hc3luY3R0eV9yZWNlaXZlIGlzIHVzaW5nLiAgVGhlIGJlc3QKKyAqIHdheSB0byBmaXggdGhpcyBpcyB0byB1c2UgYSByd2xvY2sgaW4gdGhlIHR0eSBzdHJ1Y3QsIGJ1dCBmb3Igbm93CisgKiB3ZSB1c2UgYSBzaW5nbGUgZ2xvYmFsIHJ3bG9jayBmb3IgYWxsIHR0eXMgaW4gcHBwIGxpbmUgZGlzY2lwbGluZS4KKyAqCisgKiBGSVhNRTogdGhpcyBpcyBubyBsb25nZXIgdHJ1ZS4gVGhlIF9jbG9zZSBwYXRoIGZvciB0aGUgbGRpc2MgaXMgCisgKiBub3cgZ3VhcmFudGVlZCB0byBiZSBzYW5lLiAKKyAqLworc3RhdGljIERFRklORV9SV0xPQ0soZGlzY19kYXRhX2xvY2spOworCitzdGF0aWMgc3RydWN0IGFzeW5jcHBwICphcF9nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgYXN5bmNwcHAgKmFwOworCisJcmVhZF9sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisJYXAgPSB0dHktPmRpc2NfZGF0YTsKKwlpZiAoYXAgIT0gTlVMTCkKKwkJYXRvbWljX2luYygmYXAtPnJlZmNudCk7CisJcmVhZF91bmxvY2soJmRpc2NfZGF0YV9sb2NrKTsKKwlyZXR1cm4gYXA7Cit9CisKK3N0YXRpYyB2b2lkIGFwX3B1dChzdHJ1Y3QgYXN5bmNwcHAgKmFwKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZhcC0+cmVmY250KSkKKwkJdXAoJmFwLT5kZWFkX3NlbSk7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBhIHR0eSBpcyBwdXQgaW50byBQUFAgbGluZSBkaXNjaXBsaW5lLiBDYWxsZWQgaW4gcHJvY2VzcworICogY29udGV4dC4KKyAqLworc3RhdGljIGludAorcHBwX2FzeW5jdHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgYXN5bmNwcHAgKmFwOworCWludCBlcnI7CisKKwllcnIgPSAtRU5PTUVNOworCWFwID0ga21hbGxvYyhzaXplb2YoKmFwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFwID09IDApCisJCWdvdG8gb3V0OworCisJLyogaW5pdGlhbGl6ZSB0aGUgYXN5bmNwcHAgc3RydWN0dXJlICovCisJbWVtc2V0KGFwLCAwLCBzaXplb2YoKmFwKSk7CisJYXAtPnR0eSA9IHR0eTsKKwlhcC0+bXJ1ID0gUFBQX01SVTsKKwlzcGluX2xvY2tfaW5pdCgmYXAtPnhtaXRfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFwLT5yZWN2X2xvY2spOworCWFwLT54YWNjbVswXSA9IH4wVTsKKwlhcC0+eGFjY21bM10gPSAweDYwMDAwMDAwVTsKKwlhcC0+cmFjY20gPSB+MFU7CisJYXAtPm9wdHIgPSBhcC0+b2J1ZjsKKwlhcC0+b2xpbSA9IGFwLT5vYnVmOworCWFwLT5sY3BfZmNzID0gLTE7CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZhcC0+cnF1ZXVlKTsKKwl0YXNrbGV0X2luaXQoJmFwLT50c2ssIHBwcF9hc3luY19wcm9jZXNzLCAodW5zaWduZWQgbG9uZykgYXApOworCisJYXRvbWljX3NldCgmYXAtPnJlZmNudCwgMSk7CisJaW5pdF9NVVRFWF9MT0NLRUQoJmFwLT5kZWFkX3NlbSk7CisKKwlhcC0+Y2hhbi5wcml2YXRlID0gYXA7CisJYXAtPmNoYW4ub3BzID0gJmFzeW5jX29wczsKKwlhcC0+Y2hhbi5tdHUgPSBQUFBfTVJVOworCWVyciA9IHBwcF9yZWdpc3Rlcl9jaGFubmVsKCZhcC0+Y2hhbik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKworCXR0eS0+ZGlzY19kYXRhID0gYXA7CisKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlOgorCWtmcmVlKGFwKTsKKyBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSB0dHkgaXMgcHV0IGludG8gYW5vdGhlciBsaW5lIGRpc2NpcGxpbmUKKyAqIG9yIGl0IGhhbmdzIHVwLiAgV2UgaGF2ZSB0byB3YWl0IGZvciBhbnkgY3B1IGN1cnJlbnRseQorICogZXhlY3V0aW5nIGluIGFueSBvZiB0aGUgb3RoZXIgcHBwX2FzeW5jdHR5Xyogcm91dGluZXMgdG8KKyAqIGZpbmlzaCBiZWZvcmUgd2UgY2FuIGNhbGwgcHBwX3VucmVnaXN0ZXJfY2hhbm5lbCBhbmQgZnJlZQorICogdGhlIGFzeW5jcHBwIHN0cnVjdC4gIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBmcm9tCisgKiBwcm9jZXNzIGNvbnRleHQsIG5vdCBpbnRlcnJ1cHQgb3Igc29mdGlycSBjb250ZXh0LgorICovCitzdGF0aWMgdm9pZAorcHBwX2FzeW5jdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGFzeW5jcHBwICphcDsKKworCXdyaXRlX2xvY2tfaXJxKCZkaXNjX2RhdGFfbG9jayk7CisJYXAgPSB0dHktPmRpc2NfZGF0YTsKKwl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CisJd3JpdGVfdW5sb2NrX2lycSgmZGlzY19kYXRhX2xvY2spOworCWlmIChhcCA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdlIGhhdmUgbm93IGVuc3VyZWQgdGhhdCBub2JvZHkgY2FuIHN0YXJ0IHVzaW5nIGFwIGZyb20gbm93CisJICogb24sIGJ1dCB3ZSBoYXZlIHRvIHdhaXQgZm9yIGFsbCBleGlzdGluZyB1c2VycyB0byBmaW5pc2guCisJICogTm90ZSB0aGF0IHBwcF91bnJlZ2lzdGVyX2NoYW5uZWwgZW5zdXJlcyB0aGF0IG5vIGNhbGxzIHRvCisJICogb3VyIGNoYW5uZWwgb3BzIChpLmUuIHBwcF9hc3luY19zZW5kL2lvY3RsKSBhcmUgaW4gcHJvZ3Jlc3MKKwkgKiBieSB0aGUgdGltZSBpdCByZXR1cm5zLgorCSAqLworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmYXAtPnJlZmNudCkpCisJCWRvd24oJmFwLT5kZWFkX3NlbSk7CisJdGFza2xldF9raWxsKCZhcC0+dHNrKTsKKworCXBwcF91bnJlZ2lzdGVyX2NoYW5uZWwoJmFwLT5jaGFuKTsKKwlpZiAoYXAtPnJwa3QgIT0gMCkKKwkJa2ZyZWVfc2tiKGFwLT5ycGt0KTsKKwlza2JfcXVldWVfcHVyZ2UoJmFwLT5ycXVldWUpOworCWlmIChhcC0+dHBrdCAhPSAwKQorCQlrZnJlZV9za2IoYXAtPnRwa3QpOworCWtmcmVlKGFwKTsKK30KKworLyoKKyAqIENhbGxlZCBvbiB0dHkgaGFuZ3VwIGluIHByb2Nlc3MgY29udGV4dC4KKyAqCisgKiBXYWl0IGZvciBJL08gdG8gZHJpdmVyIHRvIGNvbXBsZXRlIGFuZCB1bnJlZ2lzdGVyIFBQUCBjaGFubmVsLgorICogVGhpcyBpcyBhbHJlYWR5IGRvbmUgYnkgdGhlIGNsb3NlIHJvdXRpbmUsIHNvIGp1c3QgY2FsbCB0aGF0LgorICovCitzdGF0aWMgaW50IHBwcF9hc3luY3R0eV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlwcHBfYXN5bmN0dHlfY2xvc2UodHR5KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgZG9lcyBub3RoaW5nIC0gbm8gZGF0YSBpcyBldmVyIGF2YWlsYWJsZSB0aGlzIHdheS4KKyAqIFBwcGQgcmVhZHMgYW5kIHdyaXRlcyBwYWNrZXRzIHZpYSAvZGV2L3BwcCBpbnN0ZWFkLgorICovCitzdGF0aWMgc3NpemVfdAorcHBwX2FzeW5jdHR5X3JlYWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgdW5zaWduZWQgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiAtRUFHQUlOOworfQorCisvKgorICogV3JpdGUgb24gdGhlIHR0eSBkb2VzIG5vdGhpbmcsIHRoZSBwYWNrZXRzIGFsbCBjb21lIGluCisgKiBmcm9tIHRoZSBwcHAgZ2VuZXJpYyBzdHVmZi4KKyAqLworc3RhdGljIHNzaXplX3QKK3BwcF9hc3luY3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKKy8qCisgKiBDYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0IG9ubHkuIE1heSBiZSByZS1lbnRlcmVkIGJ5IG11bHRpcGxlCisgKiBpb2N0bCBjYWxsaW5nIHRocmVhZHMuCisgKi8KKyAKK3N0YXRpYyBpbnQKK3BwcF9hc3luY3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFzeW5jcHBwICphcCA9IGFwX2dldCh0dHkpOworCWludCBlcnIsIHZhbDsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlpZiAoYXAgPT0gMCkKKwkJcmV0dXJuIC1FTlhJTzsKKwllcnIgPSAtRUZBVUxUOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQUFBJT0NHQ0hBTjoKKwkJZXJyID0gLUVOWElPOworCQlpZiAoYXAgPT0gMCkKKwkJCWJyZWFrOworCQllcnIgPSAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIocHBwX2NoYW5uZWxfaW5kZXgoJmFwLT5jaGFuKSwgcCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dVTklUOgorCQllcnIgPSAtRU5YSU87CisJCWlmIChhcCA9PSAwKQorCQkJYnJlYWs7CisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChwdXRfdXNlcihwcHBfdW5pdF9udW1iZXIoJmFwLT5jaGFuKSwgcCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFRDR0VUUzoKKwljYXNlIFRDR0VUQToKKwkJZXJyID0gbl90dHlfaW9jdGwodHR5LCBmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBUQ0ZMU0g6CisJCS8qIGZsdXNoIG91ciBidWZmZXJzIGFuZCB0aGUgc2VyaWFsIHBvcnQncyBidWZmZXIgKi8KKwkJaWYgKGFyZyA9PSBUQ0lPRkxVU0ggfHwgYXJnID09IFRDT0ZMVVNIKQorCQkJcHBwX2FzeW5jX2ZsdXNoX291dHB1dChhcCk7CisJCWVyciA9IG5fdHR5X2lvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKworCWNhc2UgRklPTlJFQUQ6CisJCXZhbCA9IDA7CisJCWlmIChwdXRfdXNlcih2YWwsIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0lPQ1RMQ01EOworCX0KKworCWFwX3B1dChhcCk7CisJcmV0dXJuIGVycjsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSBmaW5lICovCitzdGF0aWMgdW5zaWduZWQgaW50CitwcHBfYXN5bmN0dHlfcG9sbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHBwX2FzeW5jdHR5X3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm4gNjU1MzU7Cit9CisKKy8qCisgKiBUaGlzIGNhbiBub3cgYmUgY2FsbGVkIGZyb20gaGFyZCBpbnRlcnJ1cHQgbGV2ZWwgYXMgd2VsbAorICogYXMgc29mdCBpbnRlcnJ1cHQgbGV2ZWwgb3IgbWFpbmxpbmUuCisgKi8KK3N0YXRpYyB2b2lkCitwcHBfYXN5bmN0dHlfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCSAgY2hhciAqY2ZsYWdzLCBpbnQgY291bnQpCit7CisJc3RydWN0IGFzeW5jcHBwICphcCA9IGFwX2dldCh0dHkpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYXAgPT0gMCkKKwkJcmV0dXJuOworCXNwaW5fbG9ja19pcnFzYXZlKCZhcC0+cmVjdl9sb2NrLCBmbGFncyk7CisJcHBwX2FzeW5jX2lucHV0KGFwLCBidWYsIGNmbGFncywgY291bnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwLT5yZWN2X2xvY2ssIGZsYWdzKTsKKwlpZiAoc2tiX3F1ZXVlX2xlbigmYXAtPnJxdWV1ZSkpCisJCXRhc2tsZXRfc2NoZWR1bGUoJmFwLT50c2spOworCWFwX3B1dChhcCk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykKKwkgICAgJiYgdHR5LT5kcml2ZXItPnVudGhyb3R0bGUpCisJCXR0eS0+ZHJpdmVyLT51bnRocm90dGxlKHR0eSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcHBfYXN5bmN0dHlfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGFzeW5jcHBwICphcCA9IGFwX2dldCh0dHkpOworCisJY2xlYXJfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKTsKKwlpZiAoYXAgPT0gMCkKKwkJcmV0dXJuOworCXNldF9iaXQoWE1JVF9XQUtFVVAsICZhcC0+eG1pdF9mbGFncyk7CisJdGFza2xldF9zY2hlZHVsZSgmYXAtPnRzayk7CisJYXBfcHV0KGFwKTsKK30KKworCitzdGF0aWMgc3RydWN0IHR0eV9sZGlzYyBwcHBfbGRpc2MgPSB7CisJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCS5tYWdpYwk9IFRUWV9MRElTQ19NQUdJQywKKwkubmFtZQk9ICJwcHAiLAorCS5vcGVuCT0gcHBwX2FzeW5jdHR5X29wZW4sCisJLmNsb3NlCT0gcHBwX2FzeW5jdHR5X2Nsb3NlLAorCS5oYW5ndXAJPSBwcHBfYXN5bmN0dHlfaGFuZ3VwLAorCS5yZWFkCT0gcHBwX2FzeW5jdHR5X3JlYWQsCisJLndyaXRlCT0gcHBwX2FzeW5jdHR5X3dyaXRlLAorCS5pb2N0bAk9IHBwcF9hc3luY3R0eV9pb2N0bCwKKwkucG9sbAk9IHBwcF9hc3luY3R0eV9wb2xsLAorCS5yZWNlaXZlX3Jvb20gPSBwcHBfYXN5bmN0dHlfcm9vbSwKKwkucmVjZWl2ZV9idWYgPSBwcHBfYXN5bmN0dHlfcmVjZWl2ZSwKKwkud3JpdGVfd2FrZXVwID0gcHBwX2FzeW5jdHR5X3dha2V1cCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitwcHBfYXN5bmNfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9QUFAsICZwcHBfbGRpc2MpOworCWlmIChlcnIgIT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJQUFBfYXN5bmM6IGVycm9yICVkIHJlZ2lzdGVyaW5nIGxpbmUgZGlzYy5cbiIsCisJCSAgICAgICBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIHByb3ZpZGUgdGhlIFBQUCBjaGFubmVsIGludGVyZmFjZS4KKyAqLworc3RhdGljIGludAorcHBwX2FzeW5jX2lvY3RsKHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbiwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFzeW5jcHBwICphcCA9IGNoYW4tPnByaXZhdGU7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJaW50IGVyciwgdmFsOworCXUzMiBhY2NtWzhdOworCisJZXJyID0gLUVGQVVMVDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBQSU9DR0ZMQUdTOgorCQl2YWwgPSBhcC0+ZmxhZ3MgfCBhcC0+cmJpdHM7CisJCWlmIChwdXRfdXNlcih2YWwsIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCWNhc2UgUFBQSU9DU0ZMQUdTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCWJyZWFrOworCQlhcC0+ZmxhZ3MgPSB2YWwgJiB+U0NfUkNWX0JJVFM7CisJCXNwaW5fbG9ja19pcnEoJmFwLT5yZWN2X2xvY2spOworCQlhcC0+cmJpdHMgPSB2YWwgJiBTQ19SQ1ZfQklUUzsKKwkJc3Bpbl91bmxvY2tfaXJxKCZhcC0+cmVjdl9sb2NrKTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dBU1lOQ01BUDoKKwkJaWYgKHB1dF91c2VyKGFwLT54YWNjbVswXSwgKHUzMiBfX3VzZXIgKilhcmdwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIFBQUElPQ1NBU1lOQ01BUDoKKwkJaWYgKGdldF91c2VyKGFwLT54YWNjbVswXSwgKHUzMiBfX3VzZXIgKilhcmdwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR1JBU1lOQ01BUDoKKwkJaWYgKHB1dF91c2VyKGFwLT5yYWNjbSwgKHUzMiBfX3VzZXIgKilhcmdwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIFBQUElPQ1NSQVNZTkNNQVA6CisJCWlmIChnZXRfdXNlcihhcC0+cmFjY20sICh1MzIgX191c2VyICopYXJncCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dYQVNZTkNNQVA6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgYXAtPnhhY2NtLCBzaXplb2YoYXAtPnhhY2NtKSkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJY2FzZSBQUFBJT0NTWEFTWU5DTUFQOgorCQlpZiAoY29weV9mcm9tX3VzZXIoYWNjbSwgYXJncCwgc2l6ZW9mKGFjY20pKSkKKwkJCWJyZWFrOworCQlhY2NtWzJdICY9IH4weDQwMDAwMDAwVTsJLyogY2FuJ3QgZXNjYXBlIDB4NWUgKi8KKwkJYWNjbVszXSB8PSAweDYwMDAwMDAwVTsJCS8qIG11c3QgZXNjYXBlIDB4N2QsIDB4N2UgKi8KKwkJbWVtY3B5KGFwLT54YWNjbSwgYWNjbSwgc2l6ZW9mKGFwLT54YWNjbSkpOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR01SVToKKwkJaWYgKHB1dF91c2VyKGFwLT5tcnUsIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCWNhc2UgUFBQSU9DU01SVToKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlicmVhazsKKwkJaWYgKHZhbCA8IFBQUF9NUlUpCisJCQl2YWwgPSBQUFBfTVJVOworCQlhcC0+bXJ1ID0gdmFsOworCQllcnIgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9UVFk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGF0IHNvZnRpcnEgbGV2ZWwgdG8gZGVsaXZlciByZWNlaXZlZCBwYWNrZXRzCisgKiB0byB0aGUgcHBwX2dlbmVyaWMgY29kZSwgYW5kIHRvIHRlbGwgdGhlIHBwcF9nZW5lcmljIGNvZGUKKyAqIGlmIHdlIGNhbiBhY2NlcHQgbW9yZSBvdXRwdXQgbm93LgorICovCitzdGF0aWMgdm9pZCBwcHBfYXN5bmNfcHJvY2Vzcyh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYXN5bmNwcHAgKmFwID0gKHN0cnVjdCBhc3luY3BwcCAqKSBhcmc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCS8qIHByb2Nlc3MgcmVjZWl2ZWQgcGFja2V0cyAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmFwLT5ycXVldWUpKSAhPSBOVUxMKSB7CisJCWlmIChza2ItPmNiWzBdKQorCQkJcHBwX2lucHV0X2Vycm9yKCZhcC0+Y2hhbiwgMCk7CisJCXBwcF9pbnB1dCgmYXAtPmNoYW4sIHNrYik7CisJfQorCisJLyogdHJ5IHRvIHB1c2ggbW9yZSBzdHVmZiBvdXQgKi8KKwlpZiAodGVzdF9iaXQoWE1JVF9XQUtFVVAsICZhcC0+eG1pdF9mbGFncykgJiYgcHBwX2FzeW5jX3B1c2goYXApKQorCQlwcHBfb3V0cHV0X3dha2V1cCgmYXAtPmNoYW4pOworfQorCisvKgorICogUHJvY2VkdXJlcyBmb3IgZW5jYXBzdWxhdGlvbiBhbmQgZnJhbWluZy4KKyAqLworCisvKgorICogUHJvY2VkdXJlIHRvIGVuY29kZSB0aGUgZGF0YSBmb3IgYXN5bmMgc2VyaWFsIHRyYW5zbWlzc2lvbi4KKyAqIERvZXMgb2N0ZXQgc3R1ZmZpbmcgKGVzY2FwaW5nKSwgcHV0cyB0aGUgYWRkcmVzcy9jb250cm9sIGJ5dGVzCisgKiBvbiBpZiBBL0MgY29tcHJlc3Npb24gaXMgZGlzYWJsZWQsIGFuZCBkb2VzIHByb3RvY29sIGNvbXByZXNzaW9uLgorICogQXNzdW1lcyBhcC0+dHBrdCAhPSAwIG9uIGVudHJ5LgorICogUmV0dXJucyAxIGlmIHdlIGZpbmlzaGVkIHRoZSBjdXJyZW50IGZyYW1lLCAwIG90aGVyd2lzZS4KKyAqLworCisjZGVmaW5lIFBVVF9CWVRFKGFwLCBidWYsIGMsIGlzbGNwKQlkbyB7CQlcCisJaWYgKChpc2xjcCAmJiBjIDwgMHgyMCkgfHwgKGFwLT54YWNjbVtjID4+IDVdICYgKDEgPDwgKGMgJiAweDFmKSkpKSB7XAorCQkqYnVmKysgPSBQUFBfRVNDQVBFOwkJCVwKKwkJKmJ1ZisrID0gYyBeIDB4MjA7CQkJXAorCX0gZWxzZQkJCQkJCVwKKwkJKmJ1ZisrID0gYzsJCQkJXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGludAorcHBwX2FzeW5jX2VuY29kZShzdHJ1Y3QgYXN5bmNwcHAgKmFwKQoreworCWludCBmY3MsIGksIGNvdW50LCBjLCBwcm90bzsKKwl1bnNpZ25lZCBjaGFyICpidWYsICpidWZsaW07CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlpbnQgaXNsY3A7CisKKwlidWYgPSBhcC0+b2J1ZjsKKwlhcC0+b2xpbSA9IGJ1ZjsKKwlhcC0+b3B0ciA9IGJ1ZjsKKwlpID0gYXAtPnRwa3RfcG9zOworCWRhdGEgPSBhcC0+dHBrdC0+ZGF0YTsKKwljb3VudCA9IGFwLT50cGt0LT5sZW47CisJZmNzID0gYXAtPnRmY3M7CisJcHJvdG8gPSAoZGF0YVswXSA8PCA4KSArIGRhdGFbMV07CisKKwkvKgorCSAqIExDUCBwYWNrZXRzIHdpdGggY29kZSB2YWx1ZXMgYmV0d2VlbiAxIChjb25maWd1cmUtcmVxZXN0KQorCSAqIGFuZCA3IChjb2RlLXJlamVjdCkgbXVzdCBiZSBzZW50IGFzIHRob3VnaCBubyBvcHRpb25zCisJICogaGFkIGJlZW4gbmVnb3RpYXRlZC4KKwkgKi8KKwlpc2xjcCA9IHByb3RvID09IFBQUF9MQ1AgJiYgMSA8PSBkYXRhWzJdICYmIGRhdGFbMl0gPD0gNzsKKworCWlmIChpID09IDApIHsKKwkJaWYgKGlzbGNwKQorCQkJYXN5bmNfbGNwX3BlZWsoYXAsIGRhdGEsIGNvdW50LCAwKTsKKworCQkvKgorCQkgKiBTdGFydCBvZiBhIG5ldyBwYWNrZXQgLSBpbnNlcnQgdGhlIGxlYWRpbmcgRkxBRworCQkgKiBjaGFyYWN0ZXIgaWYgbmVjZXNzYXJ5LgorCQkgKi8KKwkJaWYgKGlzbGNwIHx8IGZsYWdfdGltZSA9PSAwCisJCSAgICB8fCBqaWZmaWVzIC0gYXAtPmxhc3RfeG1pdCA+PSBmbGFnX3RpbWUpCisJCQkqYnVmKysgPSBQUFBfRkxBRzsKKwkJYXAtPmxhc3RfeG1pdCA9IGppZmZpZXM7CisJCWZjcyA9IFBQUF9JTklURkNTOworCisJCS8qCisJCSAqIFB1dCBpbiB0aGUgYWRkcmVzcy9jb250cm9sIGJ5dGVzIGlmIG5lY2Vzc2FyeQorCQkgKi8KKwkJaWYgKChhcC0+ZmxhZ3MgJiBTQ19DT01QX0FDKSA9PSAwIHx8IGlzbGNwKSB7CisJCQlQVVRfQllURShhcCwgYnVmLCAweGZmLCBpc2xjcCk7CisJCQlmY3MgPSBQUFBfRkNTKGZjcywgMHhmZik7CisJCQlQVVRfQllURShhcCwgYnVmLCAweDAzLCBpc2xjcCk7CisJCQlmY3MgPSBQUFBfRkNTKGZjcywgMHgwMyk7CisJCX0KKwl9CisKKwkvKgorCSAqIE9uY2Ugd2UgcHV0IGluIHRoZSBsYXN0IGJ5dGUsIHdlIG5lZWQgdG8gcHV0IGluIHRoZSBGQ1MKKwkgKiBhbmQgY2xvc2luZyBmbGFnLCBzbyBtYWtlIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3QgNyBieXRlcworCSAqIG9mIGZyZWUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIuCisJICovCisJYnVmbGltID0gYXAtPm9idWYgKyBPQlVGU0laRSAtIDY7CisJd2hpbGUgKGkgPCBjb3VudCAmJiBidWYgPCBidWZsaW0pIHsKKwkJYyA9IGRhdGFbaSsrXTsKKwkJaWYgKGkgPT0gMSAmJiBjID09IDAgJiYgKGFwLT5mbGFncyAmIFNDX0NPTVBfUFJPVCkpCisJCQljb250aW51ZTsJLyogY29tcHJlc3MgcHJvdG9jb2wgZmllbGQgKi8KKwkJZmNzID0gUFBQX0ZDUyhmY3MsIGMpOworCQlQVVRfQllURShhcCwgYnVmLCBjLCBpc2xjcCk7CisJfQorCisJaWYgKGkgPCBjb3VudCkgeworCQkvKgorCQkgKiBSZW1lbWJlciB3aGVyZSB3ZSBhcmUgdXAgdG8gaW4gdGhpcyBwYWNrZXQuCisJCSAqLworCQlhcC0+b2xpbSA9IGJ1ZjsKKwkJYXAtPnRwa3RfcG9zID0gaTsKKwkJYXAtPnRmY3MgPSBmY3M7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogV2UgaGF2ZSBmaW5pc2hlZCB0aGUgcGFja2V0LiAgQWRkIHRoZSBGQ1MgYW5kIGZsYWcuCisJICovCisJZmNzID0gfmZjczsKKwljID0gZmNzICYgMHhmZjsKKwlQVVRfQllURShhcCwgYnVmLCBjLCBpc2xjcCk7CisJYyA9IChmY3MgPj4gOCkgJiAweGZmOworCVBVVF9CWVRFKGFwLCBidWYsIGMsIGlzbGNwKTsKKwkqYnVmKysgPSBQUFBfRkxBRzsKKwlhcC0+b2xpbSA9IGJ1ZjsKKworCWtmcmVlX3NrYihhcC0+dHBrdCk7CisJYXAtPnRwa3QgPSBOVUxMOworCXJldHVybiAxOworfQorCisvKgorICogVHJhbnNtaXQtc2lkZSByb3V0aW5lcy4KKyAqLworCisvKgorICogU2VuZCBhIHBhY2tldCB0byB0aGUgcGVlciBvdmVyIGFuIGFzeW5jIHR0eSBsaW5lLgorICogUmV0dXJucyAxIGlmZiB0aGUgcGFja2V0IHdhcyBhY2NlcHRlZC4KKyAqIElmIHRoZSBwYWNrZXQgd2FzIG5vdCBhY2NlcHRlZCwgd2Ugd2lsbCBjYWxsIHBwcF9vdXRwdXRfd2FrZXVwCisgKiBhdCBzb21lIGxhdGVyIHRpbWUuCisgKi8KK3N0YXRpYyBpbnQKK3BwcF9hc3luY19zZW5kKHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYXN5bmNwcHAgKmFwID0gY2hhbi0+cHJpdmF0ZTsKKworCXBwcF9hc3luY19wdXNoKGFwKTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKSkKKwkJcmV0dXJuIDA7CS8qIGFscmVhZHkgZnVsbCAqLworCWFwLT50cGt0ID0gc2tiOworCWFwLT50cGt0X3BvcyA9IDA7CisKKwlwcHBfYXN5bmNfcHVzaChhcCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBQdXNoIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSBvdXQgdG8gdGhlIHR0eS4KKyAqLworc3RhdGljIGludAorcHBwX2FzeW5jX3B1c2goc3RydWN0IGFzeW5jcHBwICphcCkKK3sKKwlpbnQgYXZhaWwsIHNlbnQsIGRvbmUgPSAwOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBhcC0+dHR5OworCWludCB0dHlfc3R1ZmZlZCA9IDA7CisKKwkvKgorCSAqIFdlIGNhbiBnZXQgY2FsbGVkIHJlY3Vyc2l2ZWx5IGhlcmUgaWYgdGhlIHR0eSB3cml0ZQorCSAqIGZ1bmN0aW9uIGNhbGxzIG91ciB3YWtldXAgZnVuY3Rpb24uICBUaGlzIGNhbiBoYXBwZW4KKwkgKiBmb3IgZXhhbXBsZSBvbiBhIHB0eSB3aXRoIGJvdGggdGhlIG1hc3RlciBhbmQgc2xhdmUKKwkgKiBzZXQgdG8gUFBQIGxpbmUgZGlzY2lwbGluZS4KKwkgKiBXZSB1c2UgdGhlIFhNSVRfQlVTWSBiaXQgdG8gZGV0ZWN0IHRoaXMgYW5kIGdldCBvdXQsCisJICogbGVhdmluZyB0aGUgWE1JVF9XQUtFVVAgYml0IHNldCB0byB0ZWxsIHRoZSBvdGhlcgorCSAqIGluc3RhbmNlIHRoYXQgaXQgbWF5IG5vdyBiZSBhYmxlIHRvIHdyaXRlIG1vcmUgbm93LgorCSAqLworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFhNSVRfQlVTWSwgJmFwLT54bWl0X2ZsYWdzKSkKKwkJcmV0dXJuIDA7CisJc3Bpbl9sb2NrX2JoKCZhcC0+eG1pdF9sb2NrKTsKKwlmb3IgKDs7KSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoWE1JVF9XQUtFVVAsICZhcC0+eG1pdF9mbGFncykpCisJCQl0dHlfc3R1ZmZlZCA9IDA7CisJCWlmICghdHR5X3N0dWZmZWQgJiYgYXAtPm9wdHIgPCBhcC0+b2xpbSkgeworCQkJYXZhaWwgPSBhcC0+b2xpbSAtIGFwLT5vcHRyOworCQkJc2V0X2JpdChUVFlfRE9fV1JJVEVfV0FLRVVQLCAmdHR5LT5mbGFncyk7CisJCQlzZW50ID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgYXAtPm9wdHIsIGF2YWlsKTsKKwkJCWlmIChzZW50IDwgMCkKKwkJCQlnb3RvIGZsdXNoOwkvKiBlcnJvciwgZS5nLiBsb3NzIG9mIENEICovCisJCQlhcC0+b3B0ciArPSBzZW50OworCQkJaWYgKHNlbnQgPCBhdmFpbCkKKwkJCQl0dHlfc3R1ZmZlZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYXAtPm9wdHIgPj0gYXAtPm9saW0gJiYgYXAtPnRwa3QgIT0gMCkgeworCQkJaWYgKHBwcF9hc3luY19lbmNvZGUoYXApKSB7CisJCQkJLyogZmluaXNoZWQgcHJvY2Vzc2luZyBhcC0+dHBrdCAqLworCQkJCWNsZWFyX2JpdChYTUlUX0ZVTEwsICZhcC0+eG1pdF9mbGFncyk7CisJCQkJZG9uZSA9IDE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBXZSBoYXZlbid0IG1hZGUgYW55IHByb2dyZXNzIHRoaXMgdGltZSBhcm91bmQuCisJCSAqIENsZWFyIFhNSVRfQlVTWSB0byBsZXQgb3RoZXIgY2FsbGVycyBpbiwgYnV0CisJCSAqIGFmdGVyIGRvaW5nIHNvIHdlIGhhdmUgdG8gY2hlY2sgaWYgYW55b25lIHNldAorCQkgKiBYTUlUX1dBS0VVUCBzaW5jZSB3ZSBsYXN0IGNoZWNrZWQgaXQuICBJZiB0aGV5CisJCSAqIGRpZCwgd2Ugc2hvdWxkIHRyeSBhZ2FpbiB0byBzZXQgWE1JVF9CVVNZIGFuZCBnbworCQkgKiBhcm91bmQgYWdhaW4gaW4gY2FzZSBYTUlUX0JVU1kgd2FzIHN0aWxsIHNldCB3aGVuCisJCSAqIHRoZSBvdGhlciBjYWxsZXIgdHJpZWQuCisJCSAqLworCQljbGVhcl9iaXQoWE1JVF9CVVNZLCAmYXAtPnhtaXRfZmxhZ3MpOworCQkvKiBhbnkgbW9yZSB3b3JrIHRvIGRvPyBpZiBub3QsIGV4aXQgdGhlIGxvb3AgKi8KKwkJaWYgKCEodGVzdF9iaXQoWE1JVF9XQUtFVVAsICZhcC0+eG1pdF9mbGFncykKKwkJICAgICAgfHwgKCF0dHlfc3R1ZmZlZCAmJiBhcC0+dHBrdCAhPSAwKSkpCisJCQlicmVhazsKKwkJLyogbW9yZSB3b3JrIHRvIGRvLCBzZWUgaWYgd2UgY2FuIGRvIGl0IG5vdyAqLworCQlpZiAodGVzdF9hbmRfc2V0X2JpdChYTUlUX0JVU1ksICZhcC0+eG1pdF9mbGFncykpCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmFwLT54bWl0X2xvY2spOworCXJldHVybiBkb25lOworCitmbHVzaDoKKwljbGVhcl9iaXQoWE1JVF9CVVNZLCAmYXAtPnhtaXRfZmxhZ3MpOworCWlmIChhcC0+dHBrdCAhPSAwKSB7CisJCWtmcmVlX3NrYihhcC0+dHBrdCk7CisJCWFwLT50cGt0ID0gTlVMTDsKKwkJY2xlYXJfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKTsKKwkJZG9uZSA9IDE7CisJfQorCWFwLT5vcHRyID0gYXAtPm9saW07CisJc3Bpbl91bmxvY2tfYmgoJmFwLT54bWl0X2xvY2spOworCXJldHVybiBkb25lOworfQorCisvKgorICogRmx1c2ggb3V0cHV0IGZyb20gb3VyIGludGVybmFsIGJ1ZmZlcnMuCisgKiBDYWxsZWQgZm9yIHRoZSBUQ0ZMU0ggaW9jdGwuIENhbiBiZSBlbnRlcmVkIGluIHBhcmFsbGVsCisgKiBidXQgdGhpcyBpcyBjb3ZlcmVkIGJ5IHRoZSB4bWl0X2xvY2suCisgKi8KK3N0YXRpYyB2b2lkCitwcHBfYXN5bmNfZmx1c2hfb3V0cHV0KHN0cnVjdCBhc3luY3BwcCAqYXApCit7CisJaW50IGRvbmUgPSAwOworCisJc3Bpbl9sb2NrX2JoKCZhcC0+eG1pdF9sb2NrKTsKKwlhcC0+b3B0ciA9IGFwLT5vbGltOworCWlmIChhcC0+dHBrdCAhPSBOVUxMKSB7CisJCWtmcmVlX3NrYihhcC0+dHBrdCk7CisJCWFwLT50cGt0ID0gTlVMTDsKKwkJY2xlYXJfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKTsKKwkJZG9uZSA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhcC0+eG1pdF9sb2NrKTsKKwlpZiAoZG9uZSkKKwkJcHBwX291dHB1dF93YWtldXAoJmFwLT5jaGFuKTsKK30KKworLyoKKyAqIFJlY2VpdmUtc2lkZSByb3V0aW5lcy4KKyAqLworCisvKiBzZWUgaG93IG1hbnkgb3JkaW5hcnkgY2hhcnMgdGhlcmUgYXJlIGF0IHRoZSBzdGFydCBvZiBidWYgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzY2FuX29yZGluYXJ5KHN0cnVjdCBhc3luY3BwcCAqYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBpLCBjOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKwkJYyA9IGJ1ZltpXTsKKwkJaWYgKGMgPT0gUFBQX0VTQ0FQRSB8fCBjID09IFBQUF9GTEFHCisJCSAgICB8fCAoYyA8IDB4MjAgJiYgKGFwLT5yYWNjbSAmICgxIDw8IGMpKSAhPSAwKSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaTsKK30KKworLyogY2FsbGVkIHdoZW4gYSBmbGFnIGlzIHNlZW4gLSBkbyBlbmQtb2YtcGFja2V0IHByb2Nlc3NpbmcgKi8KK3N0YXRpYyB2b2lkCitwcm9jZXNzX2lucHV0X3BhY2tldChzdHJ1Y3QgYXN5bmNwcHAgKmFwKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBpbnQgbGVuLCBmY3MsIHByb3RvOworCisJc2tiID0gYXAtPnJwa3Q7CisJaWYgKGFwLT5zdGF0ZSAmIChTQ19UT1NTIHwgU0NfRVNDQVBFKSkKKwkJZ290byBlcnI7CisKKwlpZiAoc2tiID09IE5VTEwpCisJCXJldHVybjsJCS8qIDAtbGVuZ3RoIHBhY2tldCAqLworCisJLyogY2hlY2sgdGhlIEZDUyAqLworCXAgPSBza2ItPmRhdGE7CisJbGVuID0gc2tiLT5sZW47CisJaWYgKGxlbiA8IDMpCisJCWdvdG8gZXJyOwkvKiB0b28gc2hvcnQgKi8KKwlmY3MgPSBQUFBfSU5JVEZDUzsKKwlmb3IgKDsgbGVuID4gMDsgLS1sZW4pCisJCWZjcyA9IFBQUF9GQ1MoZmNzLCAqcCsrKTsKKwlpZiAoZmNzICE9IFBQUF9HT09ERkNTKQorCQlnb3RvIGVycjsJLyogYmFkIEZDUyAqLworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSAyKTsKKworCS8qIGNoZWNrIGZvciBhZGRyZXNzL2NvbnRyb2wgYW5kIHByb3RvY29sIGNvbXByZXNzaW9uICovCisJcCA9IHNrYi0+ZGF0YTsKKwlpZiAocFswXSA9PSBQUFBfQUxMU1RBVElPTlMgJiYgcFsxXSA9PSBQUFBfVUkpIHsKKwkJLyogY2hvcCBvZmYgYWRkcmVzcy9jb250cm9sICovCisJCWlmIChza2ItPmxlbiA8IDMpCisJCQlnb3RvIGVycjsKKwkJcCA9IHNrYl9wdWxsKHNrYiwgMik7CisJfQorCXByb3RvID0gcFswXTsKKwlpZiAocHJvdG8gJiAxKSB7CisJCS8qIHByb3RvY29sIGlzIGNvbXByZXNzZWQgKi8KKwkJc2tiX3B1c2goc2tiLCAxKVswXSA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHNrYi0+bGVuIDwgMikKKwkJCWdvdG8gZXJyOworCQlwcm90byA9IChwcm90byA8PCA4KSArIHBbMV07CisJCWlmIChwcm90byA9PSBQUFBfTENQKQorCQkJYXN5bmNfbGNwX3BlZWsoYXAsIHAsIHNrYi0+bGVuLCAxKTsKKwl9CisKKwkvKiBxdWV1ZSB0aGUgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkICovCisJc2tiLT5jYlswXSA9IGFwLT5zdGF0ZTsKKwlza2JfcXVldWVfdGFpbCgmYXAtPnJxdWV1ZSwgc2tiKTsKKwlhcC0+cnBrdCA9IE5VTEw7CisJYXAtPnN0YXRlID0gMDsKKwlyZXR1cm47CisKKyBlcnI6CisJLyogZnJhbWUgaGFkIGFuIGVycm9yLCByZW1lbWJlciB0aGF0LCByZXNldCBTQ19UT1NTICYgU0NfRVNDQVBFICovCisJYXAtPnN0YXRlID0gU0NfUFJFVl9FUlJPUjsKKwlpZiAoc2tiKQorCQlza2JfdHJpbShza2IsIDApOworfQorCisvKiBDYWxsZWQgd2hlbiB0aGUgdHR5IGRyaXZlciBoYXMgZGF0YSBmb3IgdXMuIFJ1bnMgcGFyYWxsZWwgd2l0aCB0aGUKKyAgIG90aGVyIGxkaXNjIGZ1bmN0aW9ucyBidXQgd2lsbCBub3QgYmUgcmUtZW50ZXJlZCAqLworCitzdGF0aWMgdm9pZAorcHBwX2FzeW5jX2lucHV0KHN0cnVjdCBhc3luY3BwcCAqYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJY2hhciAqZmxhZ3MsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBjLCBpLCBqLCBuLCBzLCBmOworCXVuc2lnbmVkIGNoYXIgKnNwOworCisJLyogdXBkYXRlIGJpdHMgdXNlZCBmb3IgOC1iaXQgY2xlYW5uZXNzIGRldGVjdGlvbiAqLworCWlmICh+YXAtPnJiaXRzICYgU0NfUkNWX0JJVFMpIHsKKwkJcyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCQljID0gYnVmW2ldOworCQkJaWYgKGZsYWdzICE9IDAgJiYgZmxhZ3NbaV0gIT0gMCkKKwkJCQljb250aW51ZTsKKwkJCXMgfD0gKGMgJiAweDgwKT8gU0NfUkNWX0I3XzE6IFNDX1JDVl9CN18wOworCQkJYyA9ICgoYyA+PiA0KSBeIGMpICYgMHhmOworCQkJcyB8PSAoMHg2OTk2ICYgKDEgPDwgYykpPyBTQ19SQ1ZfT0REUDogU0NfUkNWX0VWTlA7CisJCX0KKwkJYXAtPnJiaXRzIHw9IHM7CisJfQorCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQkvKiBzY2FuIHRocm91Z2ggYW5kIHNlZSBob3cgbWFueSBjaGFycyB3ZSBjYW4gZG8gaW4gYnVsayAqLworCQlpZiAoKGFwLT5zdGF0ZSAmIFNDX0VTQ0FQRSkgJiYgYnVmWzBdID09IFBQUF9FU0NBUEUpCisJCQluID0gMTsKKwkJZWxzZQorCQkJbiA9IHNjYW5fb3JkaW5hcnkoYXAsIGJ1ZiwgY291bnQpOworCisJCWYgPSAwOworCQlpZiAoZmxhZ3MgIT0gMCAmJiAoYXAtPnN0YXRlICYgU0NfVE9TUykgPT0gMCkgeworCQkJLyogY2hlY2sgdGhlIGZsYWdzIHRvIHNlZSBpZiBhbnkgY2hhciBoYWQgYW4gZXJyb3IgKi8KKwkJCWZvciAoaiA9IDA7IGogPCBuOyArK2opCisJCQkJaWYgKChmID0gZmxhZ3Nbal0pICE9IDApCisJCQkJCWJyZWFrOworCQl9CisJCWlmIChmICE9IDApIHsKKwkJCS8qIHN0YXJ0IHRvc3NpbmcgKi8KKwkJCWFwLT5zdGF0ZSB8PSBTQ19UT1NTOworCisJCX0gZWxzZSBpZiAobiA+IDAgJiYgKGFwLT5zdGF0ZSAmIFNDX1RPU1MpID09IDApIHsKKwkJCS8qIHN0dWZmIHRoZSBjaGFycyBpbiB0aGUgc2tiICovCisJCQlza2IgPSBhcC0+cnBrdDsKKwkJCWlmIChza2IgPT0gMCkgeworCQkJCXNrYiA9IGRldl9hbGxvY19za2IoYXAtPm1ydSArIFBQUF9IRFJMRU4gKyAyKTsKKwkJCQlpZiAoc2tiID09IDApCisJCQkJCWdvdG8gbm9tZW07CisJCQkJLyogVHJ5IHRvIGdldCB0aGUgcGF5bG9hZCA0LWJ5dGUgYWxpZ25lZCAqLworCQkJCWlmIChidWZbMF0gIT0gUFBQX0FMTFNUQVRJT05TKQorCQkJCQlza2JfcmVzZXJ2ZShza2IsIDIgKyAoYnVmWzBdICYgMSkpOworCQkJCWFwLT5ycGt0ID0gc2tiOworCQkJfQorCQkJaWYgKG4gPiBza2JfdGFpbHJvb20oc2tiKSkgeworCQkJCS8qIHBhY2tldCBvdmVyZmxvd2VkIE1SVSAqLworCQkJCWFwLT5zdGF0ZSB8PSBTQ19UT1NTOworCQkJfSBlbHNlIHsKKwkJCQlzcCA9IHNrYl9wdXQoc2tiLCBuKTsKKwkJCQltZW1jcHkoc3AsIGJ1Ziwgbik7CisJCQkJaWYgKGFwLT5zdGF0ZSAmIFNDX0VTQ0FQRSkgeworCQkJCQlzcFswXSBePSAweDIwOworCQkJCQlhcC0+c3RhdGUgJj0gflNDX0VTQ0FQRTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAobiA+PSBjb3VudCkKKwkJCWJyZWFrOworCisJCWMgPSBidWZbbl07CisJCWlmIChmbGFncyAhPSBOVUxMICYmIGZsYWdzW25dICE9IDApIHsKKwkJCWFwLT5zdGF0ZSB8PSBTQ19UT1NTOworCQl9IGVsc2UgaWYgKGMgPT0gUFBQX0ZMQUcpIHsKKwkJCXByb2Nlc3NfaW5wdXRfcGFja2V0KGFwKTsKKwkJfSBlbHNlIGlmIChjID09IFBQUF9FU0NBUEUpIHsKKwkJCWFwLT5zdGF0ZSB8PSBTQ19FU0NBUEU7CisJCX0gZWxzZSBpZiAoSV9JWE9OKGFwLT50dHkpKSB7CisJCQlpZiAoYyA9PSBTVEFSVF9DSEFSKGFwLT50dHkpKQorCQkJCXN0YXJ0X3R0eShhcC0+dHR5KTsKKwkJCWVsc2UgaWYgKGMgPT0gU1RPUF9DSEFSKGFwLT50dHkpKQorCQkJCXN0b3BfdHR5KGFwLT50dHkpOworCQl9CisJCS8qIG90aGVyd2lzZSBpdCdzIGEgY2hhciBpbiB0aGUgcmVjdiBBQ0NNICovCisJCSsrbjsKKworCQlidWYgKz0gbjsKKwkJaWYgKGZsYWdzICE9IDApCisJCQlmbGFncyArPSBuOworCQljb3VudCAtPSBuOworCX0KKwlyZXR1cm47CisKKyBub21lbToKKwlwcmludGsoS0VSTl9FUlIgIlBQUGFzeW5jOiBubyBtZW1vcnkgKGlucHV0IHBrdClcbiIpOworCWFwLT5zdGF0ZSB8PSBTQ19UT1NTOworfQorCisvKgorICogV2UgbG9vayBhdCBMQ1AgZnJhbWVzIGdvaW5nIHBhc3Qgc28gdGhhdCB3ZSBjYW4gbm90aWNlCisgKiBhbmQgcmVhY3QgdG8gdGhlIExDUCBjb25maWd1cmUtYWNrIGZyb20gdGhlIHBlZXIuCisgKiBJbiB0aGUgc2l0dWF0aW9uIHdoZXJlIHRoZSBwZWVyIGhhcyBiZWVuIHNlbnQgYSBjb25maWd1cmUtYWNrCisgKiBhbHJlYWR5LCBMQ1AgaXMgdXAgb25jZSBpdCBoYXMgc2VudCBpdHMgY29uZmlndXJlLWFjaworICogc28gdGhlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBwYWNrZXQgY2FuIGJlIHNlbnQgd2l0aCB0aGUKKyAqIGNvbmZpZ3VyZWQgTENQIG9wdGlvbnMuICBUaGlzIGFsbG93cyB1cyB0byBwcm9jZXNzIHRoZSBmb2xsb3dpbmcKKyAqIHBhY2tldCBjb3JyZWN0bHkgd2l0aG91dCBwcHBkIG5lZWRpbmcgdG8gcmVzcG9uZCBxdWlja2x5LgorICoKKyAqIFdlIG9ubHkgcmVzcG9uZCB0byB0aGUgcmVjZWl2ZWQgY29uZmlndXJlLWFjayBpZiB3ZSBoYXZlIGp1c3QKKyAqIHNlbnQgYSBjb25maWd1cmUtcmVxdWVzdCwgYW5kIHRoZSBjb25maWd1cmUtYWNrIGNvbnRhaW5zIHRoZQorICogc2FtZSBkYXRhICh0aGlzIGlzIGNoZWNrZWQgdXNpbmcgYSAxNi1iaXQgY3JjIG9mIHRoZSBkYXRhKS4KKyAqLworI2RlZmluZSBDT05GUkVRCQkxCS8qIExDUCBjb2RlIGZpZWxkIHZhbHVlcyAqLworI2RlZmluZSBDT05GQUNLCQkyCisjZGVmaW5lIExDUF9NUlUJCTEJLyogTENQIG9wdGlvbiBudW1iZXJzICovCisjZGVmaW5lIExDUF9BU1lOQ01BUAkyCisKK3N0YXRpYyB2b2lkIGFzeW5jX2xjcF9wZWVrKHN0cnVjdCBhc3luY3BwcCAqYXAsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgICBpbnQgbGVuLCBpbnQgaW5ib3VuZCkKK3sKKwlpbnQgZGxlbiwgZmNzLCBpLCBjb2RlOworCXUzMiB2YWw7CisKKwlkYXRhICs9IDI7CQkvKiBza2lwIHByb3RvY29sIGJ5dGVzICovCisJbGVuIC09IDI7CisJaWYgKGxlbiA8IDQpCQkvKiA0ID0gY29kZSwgSUQsIGxlbmd0aCAqLworCQlyZXR1cm47CisJY29kZSA9IGRhdGFbMF07CisJaWYgKGNvZGUgIT0gQ09ORkFDSyAmJiBjb2RlICE9IENPTkZSRVEpCisJCXJldHVybjsKKwlkbGVuID0gKGRhdGFbMl0gPDwgOCkgKyBkYXRhWzNdOworCWlmIChsZW4gPCBkbGVuKQorCQlyZXR1cm47CQkvKiBwYWNrZXQgZ290IHRydW5jYXRlZCBvciBsZW5ndGggaXMgYm9ndXMgKi8KKworCWlmIChjb2RlID09IChpbmJvdW5kPyBDT05GQUNLOiBDT05GUkVRKSkgeworCQkvKgorCQkgKiBzZW50IGNvbmZyZXEgb3IgcmVjZWl2ZWQgY29uZmFjazoKKwkJICogY2FsY3VsYXRlIHRoZSBjcmMgb2YgdGhlIGRhdGEgZnJvbSB0aGUgSUQgZmllbGQgb24uCisJCSAqLworCQlmY3MgPSBQUFBfSU5JVEZDUzsKKwkJZm9yIChpID0gMTsgaSA8IGRsZW47ICsraSkKKwkJCWZjcyA9IFBQUF9GQ1MoZmNzLCBkYXRhW2ldKTsKKworCQlpZiAoIWluYm91bmQpIHsKKwkJCS8qIG91dGJvdW5kIGNvbmZyZXEgLSByZW1lbWJlciB0aGUgY3JjIGZvciBsYXRlciAqLworCQkJYXAtPmxjcF9mY3MgPSBmY3M7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiByZWNlaXZlZCBjb25mYWNrLCBjaGVjayB0aGUgY3JjICovCisJCWZjcyBePSBhcC0+bGNwX2ZjczsKKwkJYXAtPmxjcF9mY3MgPSAtMTsKKwkJaWYgKGZjcyAhPSAwKQorCQkJcmV0dXJuOworCX0gZWxzZSBpZiAoaW5ib3VuZCkKKwkJcmV0dXJuOwkvKiBub3QgaW50ZXJlc3RlZCBpbiByZWNlaXZlZCBjb25mcmVxICovCisKKwkvKiBwcm9jZXNzIHRoZSBvcHRpb25zIGluIHRoZSBjb25mYWNrICovCisJZGF0YSArPSA0OworCWRsZW4gLT0gNDsKKwkvKiBkYXRhWzBdIGlzIGNvZGUsIGRhdGFbMV0gaXMgbGVuZ3RoICovCisJd2hpbGUgKGRsZW4gPj0gMiAmJiBkbGVuID49IGRhdGFbMV0gJiYgZGF0YVsxXSA+PSAyKSB7CisJCXN3aXRjaCAoZGF0YVswXSkgeworCQljYXNlIExDUF9NUlU6CisJCQl2YWwgPSAoZGF0YVsyXSA8PCA4KSArIGRhdGFbM107CisJCQlpZiAoaW5ib3VuZCkKKwkJCQlhcC0+bXJ1ID0gdmFsOworCQkJZWxzZQorCQkJCWFwLT5jaGFuLm10dSA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIExDUF9BU1lOQ01BUDoKKwkJCXZhbCA9IChkYXRhWzJdIDw8IDI0KSArIChkYXRhWzNdIDw8IDE2KQorCQkJCSsgKGRhdGFbNF0gPDwgOCkgKyBkYXRhWzVdOworCQkJaWYgKGluYm91bmQpCisJCQkJYXAtPnJhY2NtID0gdmFsOworCQkJZWxzZQorCQkJCWFwLT54YWNjbVswXSA9IHZhbDsKKwkJCWJyZWFrOworCQl9CisJCWRsZW4gLT0gZGF0YVsxXTsKKwkJZGF0YSArPSBkYXRhWzFdOworCX0KK30KKworc3RhdGljIHZvaWQgX19leGl0IHBwcF9hc3luY19jbGVhbnVwKHZvaWQpCit7CisJaWYgKHR0eV9yZWdpc3Rlcl9sZGlzYyhOX1BQUCwgTlVMTCkgIT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gdW5yZWdpc3RlciBQUFAgbGluZSBkaXNjaXBsaW5lXG4iKTsKK30KKworbW9kdWxlX2luaXQocHBwX2FzeW5jX2luaXQpOworbW9kdWxlX2V4aXQocHBwX2FzeW5jX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2RlZmxhdGUuYyBiL2RyaXZlcnMvbmV0L3BwcF9kZWZsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3ZDYzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9kZWZsYXRlLmMKQEAgLTAsMCArMSw2NTkgQEAKKy8qCisgKiAgPT1GSUxFVkVSU0lPTiA5ODAzMTk9PQorICoKKyAqIHBwcF9kZWZsYXRlLmMgLSBpbnRlcmZhY2UgdGhlIHpsaWIgcHJvY2VkdXJlcyBmb3IgRGVmbGF0ZSBjb21wcmVzc2lvbgorICogYW5kIGRlY29tcHJlc3Npb24gKGFzIHVzZWQgYnkgZ3ppcCkgdG8gdGhlIFBQUCBjb2RlLgorICogVGhpcyB2ZXJzaW9uIGlzIGZvciB1c2Ugd2l0aCBMaW51eCBrZXJuZWwgMS4zLlguCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0IFRoZSBBdXN0cmFsaWFuIE5hdGlvbmFsIFVuaXZlcnNpdHkuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCB3aXRob3V0IGFueQorICogd2FycmFudHksIGV4cHJlc3Mgb3IgaW1wbGllZC4gVGhlIEF1c3RyYWxpYW4gTmF0aW9uYWwgVW5pdmVyc2l0eQorICogbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2UuCisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVU1RSQUxJQU4gTkFUSU9OQUwgVU5JVkVSU0lUWSBCRSBMSUFCTEUgVE8gQU5ZCisgKiBQQVJUWSBGT1IgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUgQU5EIElUUyBET0NVTUVOVEFUSU9OLCBFVkVOIElGCisgKiBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMKKyAqIE9OIEFOICJBUyBJUyIgQkFTSVMsIEFORCBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIEhBUyBOTworICogT0JMSUdBVElPTiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLCBTVVBQT1JULCBVUERBVEVTLCBFTkhBTkNFTUVOVFMsCisgKiBPUiBNT0RJRklDQVRJT05TLgorICoKKyAqIEZyb206IGRlZmxhdGUuYyx2IDEuMSAxOTk2LzAxLzE4IDAzOjE3OjQ4IHBhdWx1cyBFeHAKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcC1jb21wLmg+CisKKyNpbmNsdWRlIDxsaW51eC96bGliLmg+CisKKy8qCisgKiBTdGF0ZSBmb3IgYSBEZWZsYXRlIChkZSljb21wcmVzc29yLgorICovCitzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgeworICAgIGludAkJc2Vxbm87CisgICAgaW50CQl3X3NpemU7CisgICAgaW50CQl1bml0OworICAgIGludAkJbXJ1OworICAgIGludAkJZGVidWc7CisgICAgel9zdHJlYW0Jc3RybTsKKyAgICBzdHJ1Y3QgY29tcHN0YXQgc3RhdHM7Cit9OworCisjZGVmaW5lIERFRkxBVEVfT1ZIRAkyCQkvKiBEZWZsYXRlIG92ZXJoZWFkL3BhY2tldCAqLworCitzdGF0aWMgdm9pZAkqel9jb21wX2FsbG9jKHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsIGludCBvcHRfbGVuKTsKK3N0YXRpYyB2b2lkCSp6X2RlY29tcF9hbGxvYyh1bnNpZ25lZCBjaGFyICpvcHRpb25zLCBpbnQgb3B0X2xlbik7CitzdGF0aWMgdm9pZAl6X2NvbXBfZnJlZSh2b2lkICpzdGF0ZSk7CitzdGF0aWMgdm9pZAl6X2RlY29tcF9mcmVlKHZvaWQgKnN0YXRlKTsKK3N0YXRpYyBpbnQJel9jb21wX2luaXQodm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsCisJCQkJIGludCBvcHRfbGVuLAorCQkJCSBpbnQgdW5pdCwgaW50IGhkcmxlbiwgaW50IGRlYnVnKTsKK3N0YXRpYyBpbnQJel9kZWNvbXBfaW5pdCh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqb3B0aW9ucywKKwkJCQkgICBpbnQgb3B0X2xlbiwKKwkJCQkgICBpbnQgdW5pdCwgaW50IGhkcmxlbiwgaW50IG1ydSwgaW50IGRlYnVnKTsKK3N0YXRpYyBpbnQJel9jb21wcmVzcyh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqcnB0ciwKKwkJCQl1bnNpZ25lZCBjaGFyICpvYnVmLAorCQkJCWludCBpc2l6ZSwgaW50IG9zaXplKTsKK3N0YXRpYyB2b2lkCXpfaW5jb21wKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICppYnVmLCBpbnQgaWNudCk7CitzdGF0aWMgaW50CXpfZGVjb21wcmVzcyh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqaWJ1ZiwKKwkJCQlpbnQgaXNpemUsIHVuc2lnbmVkIGNoYXIgKm9idWYsIGludCBvc2l6ZSk7CitzdGF0aWMgdm9pZAl6X2NvbXBfcmVzZXQodm9pZCAqc3RhdGUpOworc3RhdGljIHZvaWQJel9kZWNvbXBfcmVzZXQodm9pZCAqc3RhdGUpOworc3RhdGljIHZvaWQJel9jb21wX3N0YXRzKHZvaWQgKnN0YXRlLCBzdHJ1Y3QgY29tcHN0YXQgKnN0YXRzKTsKKworLyoqCisgKgl6X2NvbXBfZnJlZSAtIGZyZWUgdGhlIG1lbW9yeSB1c2VkIGJ5IGEgY29tcHJlc3NvcgorICoJQGFyZzoJcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBzdGF0ZSBmb3IgdGhlIGNvbXByZXNzb3IuCisgKi8KK3N0YXRpYyB2b2lkIHpfY29tcF9mcmVlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqKSBhcmc7CisKKwlpZiAoc3RhdGUpIHsKKwkJemxpYl9kZWZsYXRlRW5kKCZzdGF0ZS0+c3RybSk7CisJCWlmIChzdGF0ZS0+c3RybS53b3Jrc3BhY2UpCisJCQl2ZnJlZShzdGF0ZS0+c3RybS53b3Jrc3BhY2UpOworCQlrZnJlZShzdGF0ZSk7CisJfQorfQorCisvKioKKyAqCXpfY29tcF9hbGxvYyAtIGFsbG9jYXRlIHNwYWNlIGZvciBhIGNvbXByZXNzb3IuCisgKglAb3B0aW9uczogcG9pbnRlciB0byBDQ1Agb3B0aW9uIGRhdGEKKyAqCUBvcHRfbGVuOiBsZW5ndGggb2YgdGhlIENDUCBvcHRpb24gYXQgQG9wdGlvbnMuCisgKgorICoJVGhlIEBvcHRpb25zIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBhIGJ1ZmZlciBjb250YWluaW5nIHRoZQorICoJQ0NQIG9wdGlvbiBkYXRhIGZvciB0aGUgY29tcHJlc3Npb24gYmVpbmcgbmVnb3RpYXRlZC4gIEl0IGlzCisgKglmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIFJGQzE5NzksIGFuZCBkZXNjcmliZXMgdGhlIHdpbmRvdworICoJc2l6ZSB0aGF0IHRoZSBwZWVyIGlzIHJlcXVlc3RpbmcgdGhhdCB3ZSB1c2UgaW4gY29tcHJlc3NpbmcKKyAqCWRhdGEgdG8gYmUgc2VudCB0byBpdC4KKyAqCisgKglSZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBwcml2YXRlIHN0YXRlIGZvciB0aGUgY29tcHJlc3NvciwKKyAqCW9yIE5VTEwgaWYgd2UgY291bGQgbm90IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkICp6X2NvbXBfYWxsb2ModW5zaWduZWQgY2hhciAqb3B0aW9ucywgaW50IG9wdF9sZW4pCit7CisJc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICpzdGF0ZTsKKwlpbnQgd19zaXplOworCisJaWYgKG9wdF9sZW4gIT0gQ0lMRU5fREVGTEFURQorCSAgICB8fCAob3B0aW9uc1swXSAhPSBDSV9ERUZMQVRFICYmIG9wdGlvbnNbMF0gIT0gQ0lfREVGTEFURV9EUkFGVCkKKwkgICAgfHwgb3B0aW9uc1sxXSAhPSBDSUxFTl9ERUZMQVRFCisJICAgIHx8IERFRkxBVEVfTUVUSE9EKG9wdGlvbnNbMl0pICE9IERFRkxBVEVfTUVUSE9EX1ZBTAorCSAgICB8fCBvcHRpb25zWzNdICE9IERFRkxBVEVfQ0hLX1NFUVVFTkNFKQorCQlyZXR1cm4gTlVMTDsKKwl3X3NpemUgPSBERUZMQVRFX1NJWkUob3B0aW9uc1syXSk7CisJaWYgKHdfc2l6ZSA8IERFRkxBVEVfTUlOX1NJWkUgfHwgd19zaXplID4gREVGTEFURV9NQVhfU0laRSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikga21hbGxvYyhzaXplb2YoKnN0YXRlKSwKKwkJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0IChzdGF0ZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUpKTsKKwlzdGF0ZS0+c3RybS5uZXh0X2luICAgPSBOVUxMOworCXN0YXRlLT53X3NpemUgICAgICAgICA9IHdfc2l6ZTsKKwlzdGF0ZS0+c3RybS53b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfZGVmbGF0ZV93b3Jrc3BhY2VzaXplKCkpOworCWlmIChzdGF0ZS0+c3RybS53b3Jrc3BhY2UgPT0gTlVMTCkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmICh6bGliX2RlZmxhdGVJbml0Migmc3RhdGUtPnN0cm0sIFpfREVGQVVMVF9DT01QUkVTU0lPTiwKKwkJCSBERUZMQVRFX01FVEhPRF9WQUwsIC13X3NpemUsIDgsIFpfREVGQVVMVF9TVFJBVEVHWSkKKwkgICAgIT0gWl9PSykKKwkJZ290byBvdXRfZnJlZTsKKwlyZXR1cm4gKHZvaWQgKikgc3RhdGU7CisKK291dF9mcmVlOgorCXpfY29tcF9mcmVlKHN0YXRlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKgl6X2NvbXBfaW5pdCAtIGluaXRpYWxpemUgYSBwcmV2aW91c2x5LWFsbG9jYXRlZCBjb21wcmVzc29yLgorICoJQGFyZzoJcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBzdGF0ZSBmb3IgdGhlIGNvbXByZXNzb3IKKyAqCUBvcHRpb25zOiBwb2ludGVyIHRvIHRoZSBDQ1Agb3B0aW9uIGRhdGEgZGVzY3JpYmluZyB0aGUKKyAqCQljb21wcmVzc2lvbiB0aGF0IHdhcyBuZWdvdGlhdGVkIHdpdGggdGhlIHBlZXIKKyAqCUBvcHRfbGVuOiBsZW5ndGggb2YgdGhlIENDUCBvcHRpb24gZGF0YSBhdCBAb3B0aW9ucworICoJQHVuaXQ6CVBQUCB1bml0IG51bWJlciBmb3IgZGlhZ25vc3RpYyBtZXNzYWdlcworICoJQGhkcmxlbjogaWdub3JlZCAocHJlc2VudCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpCisgKglAZGVidWc6CWRlYnVnIGZsYWc7IGlmIG5vbi16ZXJvLCBkZWJ1ZyBtZXNzYWdlcyBhcmUgcHJpbnRlZC4KKyAqCisgKglUaGUgQ0NQIG9wdGlvbnMgZGVzY3JpYmVkIGJ5IEBvcHRpb25zIG11c3QgbWF0Y2ggdGhlIG9wdGlvbnMKKyAqCXNwZWNpZmllZCB3aGVuIHRoZSBjb21wcmVzc29yIHdhcyBhbGxvY2F0ZWQuICBUaGUgY29tcHJlc3NvcgorICoJaGlzdG9yeSBpcyByZXNldC4gIFJldHVybnMgMCBmb3IgZmFpbHVyZSAoQ0NQIG9wdGlvbnMgZG9uJ3QKKyAqCW1hdGNoKSBvciAxIGZvciBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IHpfY29tcF9pbml0KHZvaWQgKmFyZywgdW5zaWduZWQgY2hhciAqb3B0aW9ucywgaW50IG9wdF9sZW4sCisJCSAgICAgICBpbnQgdW5pdCwgaW50IGhkcmxlbiwgaW50IGRlYnVnKQoreworCXN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICopIGFyZzsKKworCWlmIChvcHRfbGVuIDwgQ0lMRU5fREVGTEFURQorCSAgICB8fCAob3B0aW9uc1swXSAhPSBDSV9ERUZMQVRFICYmIG9wdGlvbnNbMF0gIT0gQ0lfREVGTEFURV9EUkFGVCkKKwkgICAgfHwgb3B0aW9uc1sxXSAhPSBDSUxFTl9ERUZMQVRFCisJICAgIHx8IERFRkxBVEVfTUVUSE9EKG9wdGlvbnNbMl0pICE9IERFRkxBVEVfTUVUSE9EX1ZBTAorCSAgICB8fCBERUZMQVRFX1NJWkUob3B0aW9uc1syXSkgIT0gc3RhdGUtPndfc2l6ZQorCSAgICB8fCBvcHRpb25zWzNdICE9IERFRkxBVEVfQ0hLX1NFUVVFTkNFKQorCQlyZXR1cm4gMDsKKworCXN0YXRlLT5zZXFubyA9IDA7CisJc3RhdGUtPnVuaXQgID0gdW5pdDsKKwlzdGF0ZS0+ZGVidWcgPSBkZWJ1ZzsKKworCXpsaWJfZGVmbGF0ZVJlc2V0KCZzdGF0ZS0+c3RybSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKgl6X2NvbXBfcmVzZXQgLSByZXNldCBhIHByZXZpb3VzbHktYWxsb2NhdGVkIGNvbXByZXNzb3IuCisgKglAYXJnOglwb2ludGVyIHRvIHByaXZhdGUgc3RhdGUgZm9yIHRoZSBjb21wcmVzc29yLgorICoKKyAqCVRoaXMgY2xlYXJzIHRoZSBoaXN0b3J5IGZvciB0aGUgY29tcHJlc3NvciBhbmQgbWFrZXMgaXQKKyAqCXJlYWR5IHRvIHN0YXJ0IGVtaXR0aW5nIGEgbmV3IGNvbXByZXNzZWQgc3RyZWFtLgorICovCitzdGF0aWMgdm9pZCB6X2NvbXBfcmVzZXQodm9pZCAqYXJnKQoreworCXN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICopIGFyZzsKKworCXN0YXRlLT5zZXFubyA9IDA7CisJemxpYl9kZWZsYXRlUmVzZXQoJnN0YXRlLT5zdHJtKTsKK30KKworLyoqCisgKgl6X2NvbXByZXNzIC0gY29tcHJlc3MgYSBQUFAgcGFja2V0IHdpdGggRGVmbGF0ZSBjb21wcmVzc2lvbi4KKyAqCUBhcmc6CXBvaW50ZXIgdG8gcHJpdmF0ZSBzdGF0ZSBmb3IgdGhlIGNvbXByZXNzb3IKKyAqCUBycHRyOgl1bmNvbXByZXNzZWQgcGFja2V0IChpbnB1dCkKKyAqCUBvYnVmOgljb21wcmVzc2VkIHBhY2tldCAob3V0cHV0KQorICoJQGlzaXplOglzaXplIG9mIHVuY29tcHJlc3NlZCBwYWNrZXQKKyAqCUBvc2l6ZToJc3BhY2UgYXZhaWxhYmxlIGF0IEBvYnVmCisgKgorICoJUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkIHBhY2tldCwgb3IgMCBpZiB0aGUKKyAqCXBhY2tldCBpcyBpbmNvbXByZXNzaWJsZS4KKyAqLworaW50IHpfY29tcHJlc3Modm9pZCAqYXJnLCB1bnNpZ25lZCBjaGFyICpycHRyLCB1bnNpZ25lZCBjaGFyICpvYnVmLAorCSAgICAgICBpbnQgaXNpemUsIGludCBvc2l6ZSkKK3sKKwlzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqKSBhcmc7CisJaW50IHIsIHByb3RvLCBvZmYsIG9sZW4sIG9hdmFpbDsKKwl1bnNpZ25lZCBjaGFyICp3cHRyOworCisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBwcm90b2NvbCBpcyBpbiB0aGUgcmFuZ2Ugd2UgaGFuZGxlLgorCSAqLworCXByb3RvID0gUFBQX1BST1RPQ09MKHJwdHIpOworCWlmIChwcm90byA+IDB4M2ZmZiB8fCBwcm90byA9PSAweGZkIHx8IHByb3RvID09IDB4ZmIpCisJCXJldHVybiAwOworCisJLyogRG9uJ3QgZ2VuZXJhdGUgY29tcHJlc3NlZCBwYWNrZXRzIHdoaWNoIGFyZSBsYXJnZXIgdGhhbgorCSAgIHRoZSB1bmNvbXByZXNzZWQgcGFja2V0LiAqLworCWlmIChvc2l6ZSA+IGlzaXplKQorCQlvc2l6ZSA9IGlzaXplOworCisJd3B0ciA9IG9idWY7CisKKwkvKgorCSAqIENvcHkgb3ZlciB0aGUgUFBQIGhlYWRlciBhbmQgc3RvcmUgdGhlIDItYnl0ZSBzZXF1ZW5jZSBudW1iZXIuCisJICovCisJd3B0clswXSA9IFBQUF9BRERSRVNTKHJwdHIpOworCXdwdHJbMV0gPSBQUFBfQ09OVFJPTChycHRyKTsKKwl3cHRyWzJdID0gUFBQX0NPTVAgPj4gODsKKwl3cHRyWzNdID0gUFBQX0NPTVA7CisJd3B0ciArPSBQUFBfSERSTEVOOworCXdwdHJbMF0gPSBzdGF0ZS0+c2Vxbm8gPj4gODsKKwl3cHRyWzFdID0gc3RhdGUtPnNlcW5vOworCXdwdHIgKz0gREVGTEFURV9PVkhEOworCW9sZW4gPSBQUFBfSERSTEVOICsgREVGTEFURV9PVkhEOworCXN0YXRlLT5zdHJtLm5leHRfb3V0ID0gd3B0cjsKKwlzdGF0ZS0+c3RybS5hdmFpbF9vdXQgPSBvYXZhaWwgPSBvc2l6ZSAtIG9sZW47CisJKytzdGF0ZS0+c2Vxbm87CisKKwlvZmYgPSAocHJvdG8gPiAweGZmKSA/IDIgOiAzOwkvKiBza2lwIDFzdCBwcm90byBieXRlIGlmIDAgKi8KKwlycHRyICs9IG9mZjsKKwlzdGF0ZS0+c3RybS5uZXh0X2luID0gcnB0cjsKKwlzdGF0ZS0+c3RybS5hdmFpbF9pbiA9IChpc2l6ZSAtIG9mZik7CisKKwlmb3IgKDs7KSB7CisJCXIgPSB6bGliX2RlZmxhdGUoJnN0YXRlLT5zdHJtLCBaX1BBQ0tFVF9GTFVTSCk7CisJCWlmIChyICE9IFpfT0spIHsKKwkJCWlmIChzdGF0ZS0+ZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICJ6X2NvbXByZXNzOiBkZWZsYXRlIHJldHVybmVkICVkXG4iLCByKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdGF0ZS0+c3RybS5hdmFpbF9vdXQgPT0gMCkgeworCQkJb2xlbiArPSBvYXZhaWw7CisJCQlzdGF0ZS0+c3RybS5uZXh0X291dCA9IE5VTEw7CisJCQlzdGF0ZS0+c3RybS5hdmFpbF9vdXQgPSBvYXZhaWwgPSAxMDAwMDAwOworCQl9IGVsc2UgeworCQkJYnJlYWs7CQkvKiBhbGwgZG9uZSAqLworCQl9CisJfQorCW9sZW4gKz0gb2F2YWlsIC0gc3RhdGUtPnN0cm0uYXZhaWxfb3V0OworCisJLyoKKwkgKiBTZWUgaWYgd2UgbWFuYWdlZCB0byByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHBhY2tldC4KKwkgKi8KKwlpZiAob2xlbiA8IGlzaXplKSB7CisJCXN0YXRlLT5zdGF0cy5jb21wX2J5dGVzICs9IG9sZW47CisJCXN0YXRlLT5zdGF0cy5jb21wX3BhY2tldHMrKzsKKwl9IGVsc2UgeworCQlzdGF0ZS0+c3RhdHMuaW5jX2J5dGVzICs9IGlzaXplOworCQlzdGF0ZS0+c3RhdHMuaW5jX3BhY2tldHMrKzsKKwkJb2xlbiA9IDA7CisJfQorCXN0YXRlLT5zdGF0cy51bmNfYnl0ZXMgKz0gaXNpemU7CisJc3RhdGUtPnN0YXRzLnVuY19wYWNrZXRzKys7CisKKwlyZXR1cm4gb2xlbjsKK30KKworLyoqCisgKgl6X2NvbXBfc3RhdHMgLSByZXR1cm4gY29tcHJlc3Npb24gc3RhdGlzdGljcyBmb3IgYSBjb21wcmVzc29yCisgKgkJb3IgZGVjb21wcmVzc29yLgorICoJQGFyZzoJcG9pbnRlciB0byBwcml2YXRlIHNwYWNlIGZvciB0aGUgKGRlKWNvbXByZXNzb3IKKyAqCUBzdGF0czoJcG9pbnRlciB0byBhIHN0cnVjdCBjb21wc3RhdCB0byByZWNlaXZlIHRoZSByZXN1bHQuCisgKi8KK3N0YXRpYyB2b2lkIHpfY29tcF9zdGF0cyh2b2lkICphcmcsIHN0cnVjdCBjb21wc3RhdCAqc3RhdHMpCit7CisJc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikgYXJnOworCisJKnN0YXRzID0gc3RhdGUtPnN0YXRzOworfQorCisvKioKKyAqCXpfZGVjb21wX2ZyZWUgLSBGcmVlIHRoZSBtZW1vcnkgdXNlZCBieSBhIGRlY29tcHJlc3Nvci4KKyAqCUBhcmc6CXBvaW50ZXIgdG8gcHJpdmF0ZSBzcGFjZSBmb3IgdGhlIGRlY29tcHJlc3Nvci4KKyAqLworc3RhdGljIHZvaWQgel9kZWNvbXBfZnJlZSh2b2lkICphcmcpCit7CisJc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikgYXJnOworCisJaWYgKHN0YXRlKSB7CisJCXpsaWJfaW5mbGF0ZUVuZCgmc3RhdGUtPnN0cm0pOworCQlpZiAoc3RhdGUtPnN0cm0ud29ya3NwYWNlKQorCQkJa2ZyZWUoc3RhdGUtPnN0cm0ud29ya3NwYWNlKTsKKwkJa2ZyZWUoc3RhdGUpOworCX0KK30KKworLyoqCisgKgl6X2RlY29tcF9hbGxvYyAtIGFsbG9jYXRlIHNwYWNlIGZvciBhIGRlY29tcHJlc3Nvci4KKyAqCUBvcHRpb25zOiBwb2ludGVyIHRvIENDUCBvcHRpb24gZGF0YQorICoJQG9wdF9sZW46IGxlbmd0aCBvZiB0aGUgQ0NQIG9wdGlvbiBhdCBAb3B0aW9ucy4KKyAqCisgKglUaGUgQG9wdGlvbnMgcG9pbnRlciBwb2ludHMgdG8gdGhlIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlCisgKglDQ1Agb3B0aW9uIGRhdGEgZm9yIHRoZSBjb21wcmVzc2lvbiBiZWluZyBuZWdvdGlhdGVkLiAgSXQgaXMKKyAqCWZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gUkZDMTk3OSwgYW5kIGRlc2NyaWJlcyB0aGUgd2luZG93CisgKglzaXplIHRoYXQgd2UgYXJlIHJlcXVlc3RpbmcgdGhlIHBlZXIgdG8gdXNlIGluIGNvbXByZXNzaW5nCisgKglkYXRhIHRvIGJlIHNlbnQgdG8gdXMuCisgKgorICoJUmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBzdGF0ZSBmb3IgdGhlIGRlY29tcHJlc3NvciwKKyAqCW9yIE5VTEwgaWYgd2UgY291bGQgbm90IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkICp6X2RlY29tcF9hbGxvYyh1bnNpZ25lZCBjaGFyICpvcHRpb25zLCBpbnQgb3B0X2xlbikKK3sKKwlzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKnN0YXRlOworCWludCB3X3NpemU7CisKKwlpZiAob3B0X2xlbiAhPSBDSUxFTl9ERUZMQVRFCisJICAgIHx8IChvcHRpb25zWzBdICE9IENJX0RFRkxBVEUgJiYgb3B0aW9uc1swXSAhPSBDSV9ERUZMQVRFX0RSQUZUKQorCSAgICB8fCBvcHRpb25zWzFdICE9IENJTEVOX0RFRkxBVEUKKwkgICAgfHwgREVGTEFURV9NRVRIT0Qob3B0aW9uc1syXSkgIT0gREVGTEFURV9NRVRIT0RfVkFMCisJICAgIHx8IG9wdGlvbnNbM10gIT0gREVGTEFURV9DSEtfU0VRVUVOQ0UpCisJCXJldHVybiBOVUxMOworCXdfc2l6ZSA9IERFRkxBVEVfU0laRShvcHRpb25zWzJdKTsKKwlpZiAod19zaXplIDwgREVGTEFURV9NSU5fU0laRSB8fCB3X3NpemUgPiBERUZMQVRFX01BWF9TSVpFKQorCQlyZXR1cm4gTlVMTDsKKworCXN0YXRlID0gKHN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqKSBrbWFsbG9jKHNpemVvZigqc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQgKHN0YXRlLCAwLCBzaXplb2YgKHN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSkpOworCXN0YXRlLT53X3NpemUgICAgICAgICA9IHdfc2l6ZTsKKwlzdGF0ZS0+c3RybS5uZXh0X291dCAgPSBOVUxMOworCXN0YXRlLT5zdHJtLndvcmtzcGFjZSA9IGttYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSwKKwkJCQkJR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOworCWlmIChzdGF0ZS0+c3RybS53b3Jrc3BhY2UgPT0gTlVMTCkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmICh6bGliX2luZmxhdGVJbml0Migmc3RhdGUtPnN0cm0sIC13X3NpemUpICE9IFpfT0spCisJCWdvdG8gb3V0X2ZyZWU7CisJcmV0dXJuICh2b2lkICopIHN0YXRlOworCitvdXRfZnJlZToKKwl6X2RlY29tcF9mcmVlKHN0YXRlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKgl6X2RlY29tcF9pbml0IC0gaW5pdGlhbGl6ZSBhIHByZXZpb3VzbHktYWxsb2NhdGVkIGRlY29tcHJlc3Nvci4KKyAqCUBhcmc6CXBvaW50ZXIgdG8gdGhlIHByaXZhdGUgc3RhdGUgZm9yIHRoZSBkZWNvbXByZXNzb3IKKyAqCUBvcHRpb25zOiBwb2ludGVyIHRvIHRoZSBDQ1Agb3B0aW9uIGRhdGEgZGVzY3JpYmluZyB0aGUKKyAqCQljb21wcmVzc2lvbiB0aGF0IHdhcyBuZWdvdGlhdGVkIHdpdGggdGhlIHBlZXIKKyAqCUBvcHRfbGVuOiBsZW5ndGggb2YgdGhlIENDUCBvcHRpb24gZGF0YSBhdCBAb3B0aW9ucworICoJQHVuaXQ6CVBQUCB1bml0IG51bWJlciBmb3IgZGlhZ25vc3RpYyBtZXNzYWdlcworICoJQGhkcmxlbjogaWdub3JlZCAocHJlc2VudCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpCisgKglAbXJ1OgltYXhpbXVtIGxlbmd0aCBvZiBkZWNvbXByZXNzZWQgcGFja2V0cworICoJQGRlYnVnOglkZWJ1ZyBmbGFnOyBpZiBub24temVybywgZGVidWcgbWVzc2FnZXMgYXJlIHByaW50ZWQuCisgKgorICoJVGhlIENDUCBvcHRpb25zIGRlc2NyaWJlZCBieSBAb3B0aW9ucyBtdXN0IG1hdGNoIHRoZSBvcHRpb25zCisgKglzcGVjaWZpZWQgd2hlbiB0aGUgZGVjb21wcmVzc29yIHdhcyBhbGxvY2F0ZWQuICBUaGUgZGVjb21wcmVzc29yCisgKgloaXN0b3J5IGlzIHJlc2V0LiAgUmV0dXJucyAwIGZvciBmYWlsdXJlIChDQ1Agb3B0aW9ucyBkb24ndAorICoJbWF0Y2gpIG9yIDEgZm9yIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgel9kZWNvbXBfaW5pdCh2b2lkICphcmcsIHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsIGludCBvcHRfbGVuLAorCQkJIGludCB1bml0LCBpbnQgaGRybGVuLCBpbnQgbXJ1LCBpbnQgZGVidWcpCit7CisJc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikgYXJnOworCisJaWYgKG9wdF9sZW4gPCBDSUxFTl9ERUZMQVRFCisJICAgIHx8IChvcHRpb25zWzBdICE9IENJX0RFRkxBVEUgJiYgb3B0aW9uc1swXSAhPSBDSV9ERUZMQVRFX0RSQUZUKQorCSAgICB8fCBvcHRpb25zWzFdICE9IENJTEVOX0RFRkxBVEUKKwkgICAgfHwgREVGTEFURV9NRVRIT0Qob3B0aW9uc1syXSkgIT0gREVGTEFURV9NRVRIT0RfVkFMCisJICAgIHx8IERFRkxBVEVfU0laRShvcHRpb25zWzJdKSAhPSBzdGF0ZS0+d19zaXplCisJICAgIHx8IG9wdGlvbnNbM10gIT0gREVGTEFURV9DSEtfU0VRVUVOQ0UpCisJCXJldHVybiAwOworCisJc3RhdGUtPnNlcW5vID0gMDsKKwlzdGF0ZS0+dW5pdCAgPSB1bml0OworCXN0YXRlLT5kZWJ1ZyA9IGRlYnVnOworCXN0YXRlLT5tcnUgICA9IG1ydTsKKworCXpsaWJfaW5mbGF0ZVJlc2V0KCZzdGF0ZS0+c3RybSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKgl6X2RlY29tcF9yZXNldCAtIHJlc2V0IGEgcHJldmlvdXNseS1hbGxvY2F0ZWQgZGVjb21wcmVzc29yLgorICoJQGFyZzoJcG9pbnRlciB0byBwcml2YXRlIHN0YXRlIGZvciB0aGUgZGVjb21wcmVzc29yLgorICoKKyAqCVRoaXMgY2xlYXJzIHRoZSBoaXN0b3J5IGZvciB0aGUgZGVjb21wcmVzc29yIGFuZCBtYWtlcyBpdAorICoJcmVhZHkgdG8gcmVjZWl2ZSBhIG5ldyBjb21wcmVzc2VkIHN0cmVhbS4KKyAqLworc3RhdGljIHZvaWQgel9kZWNvbXBfcmVzZXQodm9pZCAqYXJnKQoreworCXN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICopIGFyZzsKKworCXN0YXRlLT5zZXFubyA9IDA7CisJemxpYl9pbmZsYXRlUmVzZXQoJnN0YXRlLT5zdHJtKTsKK30KKworLyoqCisgKgl6X2RlY29tcHJlc3MgLSBkZWNvbXByZXNzIGEgRGVmbGF0ZS1jb21wcmVzc2VkIHBhY2tldC4KKyAqCUBhcmc6CXBvaW50ZXIgdG8gcHJpdmF0ZSBzdGF0ZSBmb3IgdGhlIGRlY29tcHJlc3NvcgorICoJQGlidWY6CXBvaW50ZXIgdG8gaW5wdXQgKGNvbXByZXNzZWQpIHBhY2tldCBkYXRhCisgKglAaXNpemU6CWxlbmd0aCBvZiBpbnB1dCBwYWNrZXQKKyAqCUBvYnVmOglwb2ludGVyIHRvIHNwYWNlIGZvciBvdXRwdXQgKGRlY29tcHJlc3NlZCkgcGFja2V0CisgKglAb3NpemU6CWFtb3VudCBvZiBzcGFjZSBhdmFpbGFibGUgYXQgQG9idWYKKyAqCisgKiBCZWNhdXNlIG9mIHBhdGVudCBwcm9ibGVtcywgd2UgcmV0dXJuIERFQ09NUF9FUlJPUiBmb3IgZXJyb3JzCisgKiBmb3VuZCBieSBpbnNwZWN0aW5nIHRoZSBpbnB1dCBkYXRhIGFuZCBmb3Igc3lzdGVtIHByb2JsZW1zLCBidXQKKyAqIERFQ09NUF9GQVRBTEVSUk9SIGZvciBhbnkgZXJyb3JzIHdoaWNoIGNvdWxkIHBvc3NpYmx5IGJlIHNhaWQgdG8KKyAqIGJlIGJlaW5nIGRldGVjdGVkICJhZnRlciIgZGVjb21wcmVzc2lvbi4gIEZvciBERUNPTVBfRVJST1IsCisgKiB3ZSBjYW4gaXNzdWUgYSBDQ1AgcmVzZXQtcmVxdWVzdDsgZm9yIERFQ09NUF9GQVRBTEVSUk9SLCB3ZSBtYXkgYmUKKyAqIGluZnJpbmdpbmcgYSBwYXRlbnQgb2YgTW90b3JvbGEncyBpZiB3ZSBkbywgc28gd2UgdGFrZSBDQ1AgZG93bgorICogaW5zdGVhZC4KKyAqCisgKiBHaXZlbiB0aGF0IHRoZSBmcmFtZSBoYXMgdGhlIGNvcnJlY3Qgc2VxdWVuY2UgbnVtYmVyIGFuZCBhIGdvb2QgRkNTLAorICogZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBjb2RlcyBpbiB0aGUgaW5wdXQgbW9zdCBsaWtlbHkgaW5kaWNhdGUgYQorICogYnVnLCBzbyB3ZSByZXR1cm4gREVDT01QX0ZBVEFMRVJST1IgZm9yIHRoZW0gaW4gb3JkZXIgdG8gdHVybiBvZmYKKyAqIGNvbXByZXNzaW9uLCBldmVuIHRob3VnaCB0aGV5IGFyZSBkZXRlY3RlZCBieSBpbnNwZWN0aW5nIHRoZSBpbnB1dC4KKyAqLworaW50IHpfZGVjb21wcmVzcyh2b2lkICphcmcsIHVuc2lnbmVkIGNoYXIgKmlidWYsIGludCBpc2l6ZSwKKwkJIHVuc2lnbmVkIGNoYXIgKm9idWYsIGludCBvc2l6ZSkKK3sKKwlzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqKSBhcmc7CisJaW50IG9sZW4sIHNlcSwgcjsKKwlpbnQgZGVjb2RlX3Byb3RvLCBvdmVyZmxvdzsKKwl1bnNpZ25lZCBjaGFyIG92ZXJmbG93X2J1ZlsxXTsKKworCWlmIChpc2l6ZSA8PSBQUFBfSERSTEVOICsgREVGTEFURV9PVkhEKSB7CisJCWlmIChzdGF0ZS0+ZGVidWcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiel9kZWNvbXByZXNzJWQ6IHNob3J0IHBrdCAoJWQpXG4iLAorCQkJICAgICAgIHN0YXRlLT51bml0LCBpc2l6ZSk7CisJCXJldHVybiBERUNPTVBfRVJST1I7CisJfQorCisJLyogQ2hlY2sgdGhlIHNlcXVlbmNlIG51bWJlci4gKi8KKwlzZXEgPSAoaWJ1ZltQUFBfSERSTEVOXSA8PCA4KSArIGlidWZbUFBQX0hEUkxFTisxXTsKKwlpZiAoc2VxICE9IChzdGF0ZS0+c2Vxbm8gJiAweGZmZmYpKSB7CisJCWlmIChzdGF0ZS0+ZGVidWcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiel9kZWNvbXByZXNzJWQ6IGJhZCBzZXEgIyAlZCwgZXhwZWN0ZWQgJWRcbiIsCisJCQkgICAgICAgc3RhdGUtPnVuaXQsIHNlcSwgc3RhdGUtPnNlcW5vICYgMHhmZmZmKTsKKwkJcmV0dXJuIERFQ09NUF9FUlJPUjsKKwl9CisJKytzdGF0ZS0+c2Vxbm87CisKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIFBQUCBoZWFkZXIuICBUaGUgcHJvdG9jb2wgZmllbGQKKwkgKiBjb21lcyBmcm9tIHRoZSBkZWNvbXByZXNzZWQgZGF0YS4KKwkgKi8KKwlvYnVmWzBdID0gUFBQX0FERFJFU1MoaWJ1Zik7CisJb2J1ZlsxXSA9IFBQUF9DT05UUk9MKGlidWYpOworCW9idWZbMl0gPSAwOworCisJLyoKKwkgKiBTZXQgdXAgdG8gY2FsbCBpbmZsYXRlLiAgV2Ugc2V0IGF2YWlsX291dCB0byAxIGluaXRpYWxseSBzbyB3ZSBjYW4KKwkgKiBsb29rIGF0IHRoZSBmaXJzdCBieXRlIG9mIHRoZSBvdXRwdXQgYW5kIGRlY2lkZSB3aGV0aGVyIHdlIGhhdmUKKwkgKiBhIDEtYnl0ZSBvciAyLWJ5dGUgcHJvdG9jb2wgZmllbGQuCisJICovCisJc3RhdGUtPnN0cm0ubmV4dF9pbiA9IGlidWYgKyBQUFBfSERSTEVOICsgREVGTEFURV9PVkhEOworCXN0YXRlLT5zdHJtLmF2YWlsX2luID0gaXNpemUgLSAoUFBQX0hEUkxFTiArIERFRkxBVEVfT1ZIRCk7CisJc3RhdGUtPnN0cm0ubmV4dF9vdXQgPSBvYnVmICsgMzsKKwlzdGF0ZS0+c3RybS5hdmFpbF9vdXQgPSAxOworCWRlY29kZV9wcm90byA9IDE7CisJb3ZlcmZsb3cgPSAwOworCisJLyoKKwkgKiBDYWxsIGluZmxhdGUsIHN1cHBseWluZyBtb3JlIGlucHV0IG9yIG91dHB1dCBhcyBuZWVkZWQuCisJICovCisJZm9yICg7OykgeworCQlyID0gemxpYl9pbmZsYXRlKCZzdGF0ZS0+c3RybSwgWl9QQUNLRVRfRkxVU0gpOworCQlpZiAociAhPSBaX09LKSB7CisJCQlpZiAoc3RhdGUtPmRlYnVnKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJ6X2RlY29tcHJlc3MlZDogaW5mbGF0ZSByZXR1cm5lZCAlZCAoJXMpXG4iLAorCQkJCSAgICAgICBzdGF0ZS0+dW5pdCwgciwgKHN0YXRlLT5zdHJtLm1zZz8gc3RhdGUtPnN0cm0ubXNnOiAiIikpOworCQkJcmV0dXJuIERFQ09NUF9GQVRBTEVSUk9SOworCQl9CisJCWlmIChzdGF0ZS0+c3RybS5hdmFpbF9vdXQgIT0gMCkKKwkJCWJyZWFrOwkJLyogYWxsIGRvbmUgKi8KKwkJaWYgKGRlY29kZV9wcm90bykgeworCQkJc3RhdGUtPnN0cm0uYXZhaWxfb3V0ID0gb3NpemUgLSBQUFBfSERSTEVOOworCQkJaWYgKChvYnVmWzNdICYgMSkgPT0gMCkgeworCQkJCS8qIDItYnl0ZSBwcm90b2NvbCBmaWVsZCAqLworCQkJCW9idWZbMl0gPSBvYnVmWzNdOworCQkJCS0tc3RhdGUtPnN0cm0ubmV4dF9vdXQ7CisJCQkJKytzdGF0ZS0+c3RybS5hdmFpbF9vdXQ7CisJCQl9CisJCQlkZWNvZGVfcHJvdG8gPSAwOworCQl9IGVsc2UgaWYgKCFvdmVyZmxvdykgeworCQkJLyoKKwkJCSAqIFdlJ3ZlIGZpbGxlZCB1cCB0aGUgb3V0cHV0IGJ1ZmZlcjsgdGhlIG9ubHkgd2F5IHRvCisJCQkgKiBmaW5kIG91dCB3aGV0aGVyIGluZmxhdGUgaGFzIGFueSBtb3JlIGNoYXJhY3RlcnMKKwkJCSAqIGxlZnQgaXMgdG8gZ2l2ZSBpdCBhbm90aGVyIGJ5dGUgb2Ygb3V0cHV0IHNwYWNlLgorCQkJICovCisJCQlzdGF0ZS0+c3RybS5uZXh0X291dCA9IG92ZXJmbG93X2J1ZjsKKwkJCXN0YXRlLT5zdHJtLmF2YWlsX291dCA9IDE7CisJCQlvdmVyZmxvdyA9IDE7CisJCX0gZWxzZSB7CisJCQlpZiAoc3RhdGUtPmRlYnVnKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJ6X2RlY29tcHJlc3MlZDogcmFuIG91dCBvZiBtcnVcbiIsCisJCQkJICAgICAgIHN0YXRlLT51bml0KTsKKwkJCXJldHVybiBERUNPTVBfRkFUQUxFUlJPUjsKKwkJfQorCX0KKworCWlmIChkZWNvZGVfcHJvdG8pIHsKKwkJaWYgKHN0YXRlLT5kZWJ1ZykKKwkJCXByaW50ayhLRVJOX0RFQlVHICJ6X2RlY29tcHJlc3MlZDogZGlkbid0IGdldCBwcm90b1xuIiwKKwkJCSAgICAgICBzdGF0ZS0+dW5pdCk7CisJCXJldHVybiBERUNPTVBfRVJST1I7CisJfQorCisJb2xlbiA9IG9zaXplICsgb3ZlcmZsb3cgLSBzdGF0ZS0+c3RybS5hdmFpbF9vdXQ7CisJc3RhdGUtPnN0YXRzLnVuY19ieXRlcyArPSBvbGVuOworCXN0YXRlLT5zdGF0cy51bmNfcGFja2V0cysrOworCXN0YXRlLT5zdGF0cy5jb21wX2J5dGVzICs9IGlzaXplOworCXN0YXRlLT5zdGF0cy5jb21wX3BhY2tldHMrKzsKKworCXJldHVybiBvbGVuOworfQorCisvKioKKyAqCXpfaW5jb21wIC0gYWRkIGluY29tcHJlc3NpYmxlIGlucHV0IGRhdGEgdG8gdGhlIGhpc3RvcnkuCisgKglAYXJnOglwb2ludGVyIHRvIHByaXZhdGUgc3RhdGUgZm9yIHRoZSBkZWNvbXByZXNzb3IKKyAqCUBpYnVmOglwb2ludGVyIHRvIGlucHV0IHBhY2tldCBkYXRhCisgKglAaWNudDoJbGVuZ3RoIG9mIGlucHV0IGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIHpfaW5jb21wKHZvaWQgKmFyZywgdW5zaWduZWQgY2hhciAqaWJ1ZiwgaW50IGljbnQpCit7CisJc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikgYXJnOworCWludCBwcm90bywgcjsKKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgcHJvdG9jb2wgaXMgb25lIHdlIGhhbmRsZS4KKwkgKi8KKwlwcm90byA9IFBQUF9QUk9UT0NPTChpYnVmKTsKKwlpZiAocHJvdG8gPiAweDNmZmYgfHwgcHJvdG8gPT0gMHhmZCB8fCBwcm90byA9PSAweGZiKQorCQlyZXR1cm47CisKKwkrK3N0YXRlLT5zZXFubzsKKworCS8qCisJICogV2Ugc3RhcnQgYXQgdGhlIGVpdGhlciB0aGUgMXN0IG9yIDJuZCBieXRlIG9mIHRoZSBwcm90b2NvbCBmaWVsZCwKKwkgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcHJvdG9jb2wgdmFsdWUgaXMgY29tcHJlc3NpYmxlLgorCSAqLworCXN0YXRlLT5zdHJtLm5leHRfaW4gPSBpYnVmICsgMzsKKwlzdGF0ZS0+c3RybS5hdmFpbF9pbiA9IGljbnQgLSAzOworCWlmIChwcm90byA+IDB4ZmYpIHsKKwkJLS1zdGF0ZS0+c3RybS5uZXh0X2luOworCQkrK3N0YXRlLT5zdHJtLmF2YWlsX2luOworCX0KKworCXIgPSB6bGliX2luZmxhdGVJbmNvbXAoJnN0YXRlLT5zdHJtKTsKKwlpZiAociAhPSBaX09LKSB7CisJCS8qIGdhayEgKi8KKwkJaWYgKHN0YXRlLT5kZWJ1ZykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInpfaW5jb21wJWQ6IGluZmxhdGVJbmNvbXAgcmV0dXJuZWQgJWQgKCVzKVxuIiwKKwkJCSAgICAgICBzdGF0ZS0+dW5pdCwgciwgKHN0YXRlLT5zdHJtLm1zZz8gc3RhdGUtPnN0cm0ubXNnOiAiIikpOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBzdGF0cy4KKwkgKi8KKwlzdGF0ZS0+c3RhdHMuaW5jX2J5dGVzICs9IGljbnQ7CisJc3RhdGUtPnN0YXRzLmluY19wYWNrZXRzKys7CisJc3RhdGUtPnN0YXRzLnVuY19ieXRlcyArPSBpY250OworCXN0YXRlLT5zdGF0cy51bmNfcGFja2V0cysrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTW9kdWxlIGludGVyZmFjZSB0YWJsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZXNlIGFyZSBpbiBwcHBfZ2VuZXJpYy5jICovCitleHRlcm4gaW50ICBwcHBfcmVnaXN0ZXJfY29tcHJlc3NvciAgIChzdHJ1Y3QgY29tcHJlc3NvciAqY3ApOworZXh0ZXJuIHZvaWQgcHBwX3VucmVnaXN0ZXJfY29tcHJlc3NvciAoc3RydWN0IGNvbXByZXNzb3IgKmNwKTsKKworLyoKKyAqIFByb2NlZHVyZXMgZXhwb3J0ZWQgdG8gaWZfcHBwLmMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY29tcHJlc3NvciBwcHBfZGVmbGF0ZSA9IHsKKwkuY29tcHJlc3NfcHJvdG8gPQlDSV9ERUZMQVRFLAorCS5jb21wX2FsbG9jID0JCXpfY29tcF9hbGxvYywKKwkuY29tcF9mcmVlID0JCXpfY29tcF9mcmVlLAorCS5jb21wX2luaXQgPQkJel9jb21wX2luaXQsCisJLmNvbXBfcmVzZXQgPQkJel9jb21wX3Jlc2V0LAorCS5jb21wcmVzcyA9CQl6X2NvbXByZXNzLAorCS5jb21wX3N0YXQgPQkJel9jb21wX3N0YXRzLAorCS5kZWNvbXBfYWxsb2MgPQkJel9kZWNvbXBfYWxsb2MsCisJLmRlY29tcF9mcmVlID0JCXpfZGVjb21wX2ZyZWUsCisJLmRlY29tcF9pbml0ID0JCXpfZGVjb21wX2luaXQsCisJLmRlY29tcF9yZXNldCA9CQl6X2RlY29tcF9yZXNldCwKKwkuZGVjb21wcmVzcyA9CQl6X2RlY29tcHJlc3MsCisJLmluY29tcCA9CQl6X2luY29tcCwKKwkuZGVjb21wX3N0YXQgPQkJel9jb21wX3N0YXRzLAorCS5vd25lciA9CQlUSElTX01PRFVMRQorfTsKKworc3RhdGljIHN0cnVjdCBjb21wcmVzc29yIHBwcF9kZWZsYXRlX2RyYWZ0ID0geworCS5jb21wcmVzc19wcm90byA9CUNJX0RFRkxBVEVfRFJBRlQsCisJLmNvbXBfYWxsb2MgPQkJel9jb21wX2FsbG9jLAorCS5jb21wX2ZyZWUgPQkJel9jb21wX2ZyZWUsCisJLmNvbXBfaW5pdCA9CQl6X2NvbXBfaW5pdCwKKwkuY29tcF9yZXNldCA9CQl6X2NvbXBfcmVzZXQsCisJLmNvbXByZXNzID0JCXpfY29tcHJlc3MsCisJLmNvbXBfc3RhdCA9CQl6X2NvbXBfc3RhdHMsCisJLmRlY29tcF9hbGxvYyA9CQl6X2RlY29tcF9hbGxvYywKKwkuZGVjb21wX2ZyZWUgPQkJel9kZWNvbXBfZnJlZSwKKwkuZGVjb21wX2luaXQgPQkJel9kZWNvbXBfaW5pdCwKKwkuZGVjb21wX3Jlc2V0ID0JCXpfZGVjb21wX3Jlc2V0LAorCS5kZWNvbXByZXNzID0JCXpfZGVjb21wcmVzcywKKwkuaW5jb21wID0JCXpfaW5jb21wLAorCS5kZWNvbXBfc3RhdCA9CQl6X2NvbXBfc3RhdHMsCisJLm93bmVyID0JCVRISVNfTU9EVUxFCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkZWZsYXRlX2luaXQodm9pZCkKK3sgIAorICAgICAgICBpbnQgYW5zd2VyID0gcHBwX3JlZ2lzdGVyX2NvbXByZXNzb3IoJnBwcF9kZWZsYXRlKTsKKyAgICAgICAgaWYgKGFuc3dlciA9PSAwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJQUFAgRGVmbGF0ZSBDb21wcmVzc2lvbiBtb2R1bGUgcmVnaXN0ZXJlZFxuIik7CisJcHBwX3JlZ2lzdGVyX2NvbXByZXNzb3IoJnBwcF9kZWZsYXRlX2RyYWZ0KTsKKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKK30KKyAgICAgCitzdGF0aWMgdm9pZCBfX2V4aXQgZGVmbGF0ZV9jbGVhbnVwKHZvaWQpCit7CisJcHBwX3VucmVnaXN0ZXJfY29tcHJlc3NvcigmcHBwX2RlZmxhdGUpOworCXBwcF91bnJlZ2lzdGVyX2NvbXByZXNzb3IoJnBwcF9kZWZsYXRlX2RyYWZ0KTsKK30KKworbW9kdWxlX2luaXQoZGVmbGF0ZV9pbml0KTsKK21vZHVsZV9leGl0KGRlZmxhdGVfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfQUxJQVMoInBwcC1jb21wcmVzcy0iIF9fc3RyaW5naWZ5KENJX0RFRkxBVEUpKTsKK01PRFVMRV9BTElBUygicHBwLWNvbXByZXNzLSIgX19zdHJpbmdpZnkoQ0lfREVGTEFURV9EUkFGVCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYyBiL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1NmRjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKQEAgLTAsMCArMSwyNzQ2IEBACisvKgorICogR2VuZXJpYyBQUFAgbGF5ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDIgUGF1bCBNYWNrZXJyYXMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIGdlbmVyaWMgUFBQIGxheWVyIGhhbmRsZXMgdGhlIFBQUCBuZXR3b3JrIGludGVyZmFjZXMsIHRoZQorICogL2Rldi9wcHAgZGV2aWNlLCBwYWNrZXQgYW5kIFZKIGNvbXByZXNzaW9uLCBhbmQgbXVsdGlsaW5rLgorICogSXQgdGFsa3MgdG8gUFBQIGBjaGFubmVscycgdmlhIHRoZSBpbnRlcmZhY2UgZGVmaW5lZCBpbgorICogaW5jbHVkZS9saW51eC9wcHBfY2hhbm5lbC5oLiAgQ2hhbm5lbHMgcHJvdmlkZSB0aGUgYmFzaWMgbWVhbnMgZm9yCisgKiBzZW5kaW5nIGFuZCByZWNlaXZpbmcgUFBQIGZyYW1lcyBvbiBzb21lIGtpbmQgb2YgY29tbXVuaWNhdGlvbnMKKyAqIGNoYW5uZWwuCisgKgorICogUGFydCBvZiB0aGUgY29kZSBpbiB0aGlzIGRyaXZlciB3YXMgaW5zcGlyZWQgYnkgdGhlIG9sZCBhc3luYy1vbmx5CisgKiBQUFAgZHJpdmVyLCB3cml0dGVuIGJ5IE1pY2hhZWwgQ2FsbGFoYW4gYW5kIEFsIExvbmd5ZWFyLCBhbmQKKyAqIHN1YnNlcXVlbnRseSBoYWNrZWQgYnkgUGF1bCBNYWNrZXJyYXMuCisgKgorICogPT1GSUxFVkVSU0lPTiAyMDA0MTEwOD09CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BwcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9jaGFubmVsLmg+CisjaW5jbHVkZSA8bGludXgvcHBwLWNvbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPG5ldC9zbGhjX3ZqLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjZGVmaW5lIFBQUF9WRVJTSU9OCSIyLjQuMiIKKworLyoKKyAqIE5ldHdvcmsgcHJvdG9jb2xzIHdlIHN1cHBvcnQuCisgKi8KKyNkZWZpbmUgTlBfSVAJMAkJLyogSW50ZXJuZXQgUHJvdG9jb2wgVjQgKi8KKyNkZWZpbmUgTlBfSVBWNgkxCQkvKiBJbnRlcm5ldCBQcm90b2NvbCBWNiAqLworI2RlZmluZSBOUF9JUFgJMgkJLyogSVBYIHByb3RvY29sICovCisjZGVmaW5lIE5QX0FUCTMJCS8qIEFwcGxldGFsayBwcm90b2NvbCAqLworI2RlZmluZSBOUF9NUExTX1VDIDQJCS8qIE1QTFMgdW5pY2FzdCAqLworI2RlZmluZSBOUF9NUExTX01DIDUJCS8qIE1QTFMgbXVsdGljYXN0ICovCisjZGVmaW5lIE5VTV9OUAk2CQkvKiBOdW1iZXIgb2YgTlBzLiAqLworCisjZGVmaW5lIE1QSERSTEVOCTYJLyogbXVsdGlsaW5rIHByb3RvY29sIGhlYWRlciBsZW5ndGggKi8KKyNkZWZpbmUgTVBIRFJMRU5fU1NOCTQJLyogZGl0dG8gd2l0aCBzaG9ydCBzZXF1ZW5jZSBudW1iZXJzICovCisjZGVmaW5lIE1JTl9GUkFHX1NJWkUJNjQKKworLyoKKyAqIEFuIGluc3RhbmNlIG9mIC9kZXYvcHBwIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZWl0aGVyIGEgcHBwCisgKiBpbnRlcmZhY2UgdW5pdCBvciBhIHBwcCBjaGFubmVsLiAgSW4gYm90aCBjYXNlcywgZmlsZS0+cHJpdmF0ZV9kYXRhCisgKiBwb2ludHMgdG8gb25lIG9mIHRoZXNlLgorICovCitzdHJ1Y3QgcHBwX2ZpbGUgeworCWVudW0geworCQlJTlRFUkZBQ0U9MSwgQ0hBTk5FTAorCX0JCWtpbmQ7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCB4cTsJCS8qIHBwcGQgdHJhbnNtaXQgcXVldWUgKi8KKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJxOwkJLyogcmVjZWl2ZSBxdWV1ZSBmb3IgcHBwZCAqLworCXdhaXRfcXVldWVfaGVhZF90IHJ3YWl0OwkvKiBmb3IgcG9sbCBvbiByZWFkaW5nIC9kZXYvcHBwICovCisJYXRvbWljX3QJcmVmY250OwkJLyogIyByZWZzIChpbmNsIC9kZXYvcHBwIGF0dGFjaGVkKSAqLworCWludAkJaGRybGVuOwkJLyogc3BhY2UgdG8gbGVhdmUgZm9yIGhlYWRlcnMgKi8KKwlpbnQJCWluZGV4OwkJLyogaW50ZXJmYWNlIHVuaXQgLyBjaGFubmVsIG51bWJlciAqLworCWludAkJZGVhZDsJCS8qIHVuaXQvY2hhbm5lbCBoYXMgYmVlbiBzaHV0IGRvd24gKi8KK307CisKKyNkZWZpbmUgUEZfVE9fWChwZiwgWCkJCSgoWCAqKSgoY2hhciAqKShwZikgLSBvZmZzZXRvZihYLCBmaWxlKSkpCisKKyNkZWZpbmUgUEZfVE9fUFBQKHBmKQkJUEZfVE9fWChwZiwgc3RydWN0IHBwcCkKKyNkZWZpbmUgUEZfVE9fQ0hBTk5FTChwZikJUEZfVE9fWChwZiwgc3RydWN0IGNoYW5uZWwpCisKKyNkZWZpbmUgUk9VTkRVUChuLCB4KQkJKCgobikgKyAoeCkgLSAxKSAvICh4KSkKKworLyoKKyAqIERhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgb25lIHBwcCB1bml0LgorICogQSBwcHAgdW5pdCBjb3JyZXNwb25kcyB0byBhIHBwcCBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2UKKyAqIGFuZCByZXByZXNlbnRzIGEgbXVsdGlsaW5rIGJ1bmRsZS4KKyAqIEl0IGNhbiBoYXZlIDAgb3IgbW9yZSBwcHAgY2hhbm5lbHMgY29ubmVjdGVkIHRvIGl0LgorICovCitzdHJ1Y3QgcHBwIHsKKwlzdHJ1Y3QgcHBwX2ZpbGUJZmlsZTsJCS8qIHN0dWZmIGZvciByZWFkL3dyaXRlL3BvbGwgMCAqLworCXN0cnVjdCBmaWxlCSpvd25lcjsJCS8qIGZpbGUgdGhhdCBvd25zIHRoaXMgdW5pdCA0OCAqLworCXN0cnVjdCBsaXN0X2hlYWQgY2hhbm5lbHM7CS8qIGxpc3Qgb2YgYXR0YWNoZWQgY2hhbm5lbHMgNGMgKi8KKwlpbnQJCW5fY2hhbm5lbHM7CS8qIGhvdyBtYW55IGNoYW5uZWxzIGFyZSBhdHRhY2hlZCA1NCAqLworCXNwaW5sb2NrX3QJcmxvY2s7CQkvKiBsb2NrIGZvciByZWNlaXZlIHNpZGUgNTggKi8KKwlzcGlubG9ja190CXdsb2NrOwkJLyogbG9jayBmb3IgdHJhbnNtaXQgc2lkZSA1YyAqLworCWludAkJbXJ1OwkJLyogbWF4IHJlY2VpdmUgdW5pdCA2MCAqLworCXVuc2lnbmVkIGludAlmbGFnczsJCS8qIGNvbnRyb2wgYml0cyA2NCAqLworCXVuc2lnbmVkIGludAl4c3RhdGU7CQkvKiB0cmFuc21pdCBzdGF0ZSBiaXRzIDY4ICovCisJdW5zaWduZWQgaW50CXJzdGF0ZTsJCS8qIHJlY2VpdmUgc3RhdGUgYml0cyA2YyAqLworCWludAkJZGVidWc7CQkvKiBkZWJ1ZyBmbGFncyA3MCAqLworCXN0cnVjdCBzbGNvbXByZXNzICp2ajsJCS8qIHN0YXRlIGZvciBWSiBoZWFkZXIgY29tcHJlc3Npb24gKi8KKwllbnVtIE5QbW9kZQlucG1vZGVbTlVNX05QXTsJLyogd2hhdCB0byBkbyB3aXRoIGVhY2ggbmV0IHByb3RvIDc4ICovCisJc3RydWN0IHNrX2J1ZmYJKnhtaXRfcGVuZGluZzsJLyogYSBwYWNrZXQgcmVhZHkgdG8gZ28gb3V0IDg4ICovCisJc3RydWN0IGNvbXByZXNzb3IgKnhjb21wOwkvKiB0cmFuc21pdCBwYWNrZXQgY29tcHJlc3NvciA4YyAqLworCXZvaWQJCSp4Y19zdGF0ZTsJLyogaXRzIGludGVybmFsIHN0YXRlIDkwICovCisJc3RydWN0IGNvbXByZXNzb3IgKnJjb21wOwkvKiByZWNlaXZlIGRlY29tcHJlc3NvciA5NCAqLworCXZvaWQJCSpyY19zdGF0ZTsJLyogaXRzIGludGVybmFsIHN0YXRlIDk4ICovCisJdW5zaWduZWQgbG9uZwlsYXN0X3htaXQ7CS8qIGppZmZpZXMgd2hlbiBsYXN0IHBrdCBzZW50IDljICovCisJdW5zaWduZWQgbG9uZwlsYXN0X3JlY3Y7CS8qIGppZmZpZXMgd2hlbiBsYXN0IHBrdCByY3ZkIGEwICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsJCS8qIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBhNCAqLworI2lmZGVmIENPTkZJR19QUFBfTVVMVElMSU5LCisJaW50CQlueGNoYW47CQkvKiBuZXh0IGNoYW5uZWwgdG8gc2VuZCBzb21ldGhpbmcgb24gKi8KKwl1MzIJCW54c2VxOwkJLyogbmV4dCBzZXF1ZW5jZSBudW1iZXIgdG8gc2VuZCAqLworCWludAkJbXJydTsJCS8qIE1QOiBtYXggcmVjb25zdC4gcmVjZWl2ZSB1bml0ICovCisJdTMyCQluZXh0c2VxOwkvKiBNUDogc2VxIG5vIG9mIG5leHQgcGFja2V0ICovCisJdTMyCQltaW5zZXE7CQkvKiBNUDogbWluIG9mIG1vc3QgcmVjZW50IHNlcW5vcyAqLworCXN0cnVjdCBza19idWZmX2hlYWQgbXJxOwkvKiBNUDogcmVjZWl2ZSByZWNvbnN0cnVjdGlvbiBxdWV1ZSAqLworI2VuZGlmIC8qIENPTkZJR19QUFBfTVVMVElMSU5LICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CS8qIHN0YXRpc3RpY3MgKi8KKyNpZmRlZiBDT05GSUdfUFBQX0ZJTFRFUgorCXN0cnVjdCBzb2NrX2ZpbHRlciAqcGFzc19maWx0ZXI7CS8qIGZpbHRlciBmb3IgcGFja2V0cyB0byBwYXNzICovCisJc3RydWN0IHNvY2tfZmlsdGVyICphY3RpdmVfZmlsdGVyOy8qIGZpbHRlciBmb3IgcGt0cyB0byByZXNldCBpZGxlICovCisJdW5zaWduZWQgcGFzc19sZW4sIGFjdGl2ZV9sZW47CisjZW5kaWYgLyogQ09ORklHX1BQUF9GSUxURVIgKi8KK307CisKKy8qCisgKiBCaXRzIGluIGZsYWdzOiBTQ19OT19UQ1BfQ0NJRCwgU0NfQ0NQX09QRU4sIFNDX0NDUF9VUCwgU0NfTE9PUF9UUkFGRklDLAorICogU0NfTVVMVElMSU5LLCBTQ19NUF9TSE9SVFNFUSwgU0NfTVBfWFNIT1JUU0VRLCBTQ19DT01QX1RDUCwgU0NfUkVKX0NPTVBfVENQLgorICogQml0cyBpbiByc3RhdGU6IFNDX0RFQ09NUF9SVU4sIFNDX0RDX0VSUk9SLCBTQ19EQ19GRVJST1IuCisgKiBCaXRzIGluIHhzdGF0ZTogU0NfQ09NUF9SVU4KKyAqLworI2RlZmluZSBTQ19GTEFHX0JJVFMJKFNDX05PX1RDUF9DQ0lEfFNDX0NDUF9PUEVOfFNDX0NDUF9VUHxTQ19MT09QX1RSQUZGSUMgXAorCQkJIHxTQ19NVUxUSUxJTkt8U0NfTVBfU0hPUlRTRVF8U0NfTVBfWFNIT1JUU0VRIFwKKwkJCSB8U0NfQ09NUF9UQ1B8U0NfUkVKX0NPTVBfVENQKQorCisvKgorICogUHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSBmb3IgZWFjaCBjaGFubmVsLgorICogVGhpcyBpbmNsdWRlcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgdXNlZCBmb3IgbXVsdGlsaW5rLgorICovCitzdHJ1Y3QgY2hhbm5lbCB7CisJc3RydWN0IHBwcF9maWxlCWZpbGU7CQkvKiBzdHVmZiBmb3IgcmVhZC93cml0ZS9wb2xsICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogbGluayBpbiBhbGwvbmV3X2NoYW5uZWxzIGxpc3QgKi8KKwlzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW47CS8qIHB1YmxpYyBjaGFubmVsIGRhdGEgc3RydWN0dXJlICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSBjaGFuX3NlbTsJLyogcHJvdGVjdHMgYGNoYW4nIGR1cmluZyBjaGFuIGlvY3RsICovCisJc3BpbmxvY2tfdAlkb3dubDsJCS8qIHByb3RlY3RzIGBjaGFuJywgZmlsZS54cSBkZXF1ZXVlICovCisJc3RydWN0IHBwcAkqcHBwOwkJLyogcHBwIHVuaXQgd2UncmUgY29ubmVjdGVkIHRvICovCisJc3RydWN0IGxpc3RfaGVhZCBjbGlzdDsJCS8qIGxpbmsgaW4gbGlzdCBvZiBjaGFubmVscyBwZXIgdW5pdCAqLworCXJ3bG9ja190CXVwbDsJCS8qIHByb3RlY3RzIGBwcHAnICovCisjaWZkZWYgQ09ORklHX1BQUF9NVUxUSUxJTksKKwl1OAkJYXZhaWw7CQkvKiBmbGFnIHVzZWQgaW4gbXVsdGlsaW5rIHN0dWZmICovCisJdTgJCWhhZF9mcmFnOwkvKiA+PSAxIGZyYWdtZW50cyBoYXZlIGJlZW4gc2VudCAqLworCXUzMgkJbGFzdHNlcTsJLyogTVA6IGxhc3Qgc2VxdWVuY2UgIyByZWNlaXZlZCAqLworI2VuZGlmIC8qIENPTkZJR19QUFBfTVVMVElMSU5LICovCit9OworCisvKgorICogU01QIGxvY2tpbmcgaXNzdWVzOgorICogQm90aCB0aGUgcHBwLnJsb2NrIGFuZCBwcHAud2xvY2sgbG9ja3MgcHJvdGVjdCB0aGUgcHBwLmNoYW5uZWxzCisgKiBsaXN0IGFuZCB0aGUgcHBwLm5fY2hhbm5lbHMgZmllbGQsIHlvdSBuZWVkIHRvIHRha2UgYm90aCBsb2NrcworICogYmVmb3JlIHlvdSBtb2RpZnkgdGhlbS4KKyAqIFRoZSBsb2NrIG9yZGVyaW5nIGlzOiBjaGFubmVsLnVwbCAtPiBwcHAud2xvY2sgLT4gcHBwLnJsb2NrIC0+CisgKiBjaGFubmVsLmRvd25sLgorICovCisKKy8qCisgKiBBIGNhcmRtYXAgcmVwcmVzZW50cyBhIG1hcHBpbmcgZnJvbSB1bnNpZ25lZCBpbnRlZ2VycyB0byBwb2ludGVycywKKyAqIGFuZCBwcm92aWRlcyBhIGZhc3QgImZpbmQgbG93ZXN0IHVudXNlZCBudW1iZXIiIG9wZXJhdGlvbi4KKyAqIEl0IHVzZXMgYSBicm9hZCAoMzItd2F5KSB0cmVlIHdpdGggYSBiaXRtYXAgYXQgZWFjaCBsZXZlbC4KKyAqIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHNwYWNlLWVmZmljaWVudCBmb3Igc21hbGwgbnVtYmVycyBvZiBlbnRyaWVzCisgKiBhbmQgdGltZS1lZmZpY2llbnQgZm9yIGxhcmdlIG51bWJlcnMgb2YgZW50cmllcy4KKyAqLworI2RlZmluZSBDQVJETUFQX09SREVSCTUKKyNkZWZpbmUgQ0FSRE1BUF9XSURUSAkoMVUgPDwgQ0FSRE1BUF9PUkRFUikKKyNkZWZpbmUgQ0FSRE1BUF9NQVNLCShDQVJETUFQX1dJRFRIIC0gMSkKKworc3RydWN0IGNhcmRtYXAgeworCWludCBzaGlmdDsKKwl1bnNpZ25lZCBsb25nIGludXNlOworCXN0cnVjdCBjYXJkbWFwICpwYXJlbnQ7CisJdm9pZCAqcHRyW0NBUkRNQVBfV0lEVEhdOworfTsKK3N0YXRpYyB2b2lkICpjYXJkbWFwX2dldChzdHJ1Y3QgY2FyZG1hcCAqbWFwLCB1bnNpZ25lZCBpbnQgbnIpOworc3RhdGljIHZvaWQgY2FyZG1hcF9zZXQoc3RydWN0IGNhcmRtYXAgKiptYXAsIHVuc2lnbmVkIGludCBuciwgdm9pZCAqcHRyKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZG1hcF9maW5kX2ZpcnN0X2ZyZWUoc3RydWN0IGNhcmRtYXAgKm1hcCk7CitzdGF0aWMgdm9pZCBjYXJkbWFwX2Rlc3Ryb3koc3RydWN0IGNhcmRtYXAgKiptYXApOworCisvKgorICogYWxsX3BwcF9zZW0gcHJvdGVjdHMgdGhlIGFsbF9wcHBfdW5pdHMgbWFwcGluZy4KKyAqIEl0IGFsc28gZW5zdXJlcyB0aGF0IGZpbmRpbmcgYSBwcHAgdW5pdCBpbiB0aGUgYWxsX3BwcF91bml0cyBtYXAKKyAqIGFuZCB1cGRhdGluZyBpdHMgZmlsZS5yZWZjbnQgZmllbGQgaXMgYXRvbWljLgorICovCitzdGF0aWMgREVDTEFSRV9NVVRFWChhbGxfcHBwX3NlbSk7CitzdGF0aWMgc3RydWN0IGNhcmRtYXAgKmFsbF9wcHBfdW5pdHM7CitzdGF0aWMgYXRvbWljX3QgcHBwX3VuaXRfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKKworLyoKKyAqIGFsbF9jaGFubmVsc19sb2NrIHByb3RlY3RzIGFsbF9jaGFubmVscyBhbmQgbGFzdF9jaGFubmVsX2luZGV4LAorICogYW5kIHRoZSBhdG9taWNpdHkgb2YgZmluZCBhIGNoYW5uZWwgYW5kIHVwZGF0aW5nIGl0cyBmaWxlLnJlZmNudAorICogZmllbGQuCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWxsX2NoYW5uZWxzX2xvY2spOworc3RhdGljIExJU1RfSEVBRChhbGxfY2hhbm5lbHMpOworc3RhdGljIExJU1RfSEVBRChuZXdfY2hhbm5lbHMpOworc3RhdGljIGludCBsYXN0X2NoYW5uZWxfaW5kZXg7CitzdGF0aWMgYXRvbWljX3QgY2hhbm5lbF9jb3VudCA9IEFUT01JQ19JTklUKDApOworCisvKiBHZXQgdGhlIFBQUCBwcm90b2NvbCBudW1iZXIgZnJvbSBhIHNrYiAqLworI2RlZmluZSBQUFBfUFJPVE8oc2tiKQkoKChza2IpLT5kYXRhWzBdIDw8IDgpICsgKHNrYiktPmRhdGFbMV0pCisKKy8qIFdlIGxpbWl0IHRoZSBsZW5ndGggb2YgcHBwLT5maWxlLnJxIHRvIHRoaXMgKGFyYml0cmFyeSkgdmFsdWUgKi8KKyNkZWZpbmUgUFBQX01BWF9SUUxFTgkzMgorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgbXVsdGlsaW5rIGZyYWdtZW50cyBxdWV1ZWQgdXAuCisgKiBUaGlzIGhhcyB0byBiZSBsYXJnZSBlbm91Z2ggdG8gY29wZSB3aXRoIHRoZSBtYXhpbXVtIGxhdGVuY3kgb2YKKyAqIHRoZSBzbG93ZXN0IGNoYW5uZWwgcmVsYXRpdmUgdG8gdGhlIG90aGVycy4gIFN0cmljdGx5IGl0IHNob3VsZAorICogZGVwZW5kIG9uIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIHRoZWlyIGNoYXJhY3RlcmlzdGljcy4KKyAqLworI2RlZmluZSBQUFBfTVBfTUFYX1FMRU4JMTI4CisKKy8qIE11bHRpbGluayBoZWFkZXIgYml0cy4gKi8KKyNkZWZpbmUgQgkweDgwCQkvKiB0aGlzIGZyYWdtZW50IGJlZ2lucyBhIHBhY2tldCAqLworI2RlZmluZSBFCTB4NDAJCS8qIHRoaXMgZnJhZ21lbnQgZW5kcyBhIHBhY2tldCAqLworCisvKiBDb21wYXJlIG11bHRpbGluayBzZXF1ZW5jZSBudW1iZXJzIChhc3N1bWVkIHRvIGJlIDMyIGJpdHMgd2lkZSkgKi8KKyNkZWZpbmUgc2VxX2JlZm9yZShhLCBiKQkoKHMzMikoKGEpIC0gKGIpKSA8IDApCisjZGVmaW5lIHNlcV9hZnRlcihhLCBiKQkJKChzMzIpKChhKSAtIChiKSkgPiAwKQorCisvKiBQcm90b3R5cGVzLiAqLworc3RhdGljIGludCBwcHBfdW5hdHRhY2hlZF9pb2N0bChzdHJ1Y3QgcHBwX2ZpbGUgKnBmLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdm9pZCBwcHBfeG1pdF9wcm9jZXNzKHN0cnVjdCBwcHAgKnBwcCk7CitzdGF0aWMgdm9pZCBwcHBfc2VuZF9mcmFtZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgcHBwX3B1c2goc3RydWN0IHBwcCAqcHBwKTsKK3N0YXRpYyB2b2lkIHBwcF9jaGFubmVsX3B1c2goc3RydWN0IGNoYW5uZWwgKnBjaCk7CitzdGF0aWMgdm9pZCBwcHBfcmVjZWl2ZV9mcmFtZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICBzdHJ1Y3QgY2hhbm5lbCAqcGNoKTsKK3N0YXRpYyB2b2lkIHBwcF9yZWNlaXZlX2Vycm9yKHN0cnVjdCBwcHAgKnBwcCk7CitzdGF0aWMgdm9pZCBwcHBfcmVjZWl2ZV9ub25tcF9mcmFtZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHN0cnVjdCBza19idWZmICpwcHBfZGVjb21wcmVzc19mcmFtZShzdHJ1Y3QgcHBwICpwcHAsCisJCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKyNpZmRlZiBDT05GSUdfUFBQX01VTFRJTElOSworc3RhdGljIHZvaWQgcHBwX3JlY2VpdmVfbXBfZnJhbWUoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXN0cnVjdCBjaGFubmVsICpwY2gpOworc3RhdGljIHZvaWQgcHBwX21wX2luc2VydChzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHN0cnVjdCBza19idWZmICpwcHBfbXBfcmVjb25zdHJ1Y3Qoc3RydWN0IHBwcCAqcHBwKTsKK3N0YXRpYyBpbnQgcHBwX21wX2V4cGxvZGUoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKyNlbmRpZiAvKiBDT05GSUdfUFBQX01VTFRJTElOSyAqLworc3RhdGljIGludCBwcHBfc2V0X2NvbXByZXNzKHN0cnVjdCBwcHAgKnBwcCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgcHBwX2NjcF9wZWVrKHN0cnVjdCBwcHAgKnBwcCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGluYm91bmQpOworc3RhdGljIHZvaWQgcHBwX2NjcF9jbG9zZWQoc3RydWN0IHBwcCAqcHBwKTsKK3N0YXRpYyBzdHJ1Y3QgY29tcHJlc3NvciAqZmluZF9jb21wcmVzc29yKGludCB0eXBlKTsKK3N0YXRpYyB2b2lkIHBwcF9nZXRfc3RhdHMoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3QgcHBwX3N0YXRzICpzdCk7CitzdGF0aWMgc3RydWN0IHBwcCAqcHBwX2NyZWF0ZV9pbnRlcmZhY2UoaW50IHVuaXQsIGludCAqcmV0cCk7CitzdGF0aWMgdm9pZCBpbml0X3BwcF9maWxlKHN0cnVjdCBwcHBfZmlsZSAqcGYsIGludCBraW5kKTsKK3N0YXRpYyB2b2lkIHBwcF9zaHV0ZG93bl9pbnRlcmZhY2Uoc3RydWN0IHBwcCAqcHBwKTsKK3N0YXRpYyB2b2lkIHBwcF9kZXN0cm95X2ludGVyZmFjZShzdHJ1Y3QgcHBwICpwcHApOworc3RhdGljIHN0cnVjdCBwcHAgKnBwcF9maW5kX3VuaXQoaW50IHVuaXQpOworc3RhdGljIHN0cnVjdCBjaGFubmVsICpwcHBfZmluZF9jaGFubmVsKGludCB1bml0KTsKK3N0YXRpYyBpbnQgcHBwX2Nvbm5lY3RfY2hhbm5lbChzdHJ1Y3QgY2hhbm5lbCAqcGNoLCBpbnQgdW5pdCk7CitzdGF0aWMgaW50IHBwcF9kaXNjb25uZWN0X2NoYW5uZWwoc3RydWN0IGNoYW5uZWwgKnBjaCk7CitzdGF0aWMgdm9pZCBwcHBfZGVzdHJveV9jaGFubmVsKHN0cnVjdCBjaGFubmVsICpwY2gpOworCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqcHBwX2NsYXNzOworCisvKiBUcmFuc2xhdGVzIGEgUFBQIHByb3RvY29sIG51bWJlciB0byBhIE5QIGluZGV4IChOUCA9PSBuZXR3b3JrIHByb3RvY29sKSAqLworc3RhdGljIGlubGluZSBpbnQgcHJvdG9fdG9fbnBpbmRleChpbnQgcHJvdG8pCit7CisJc3dpdGNoIChwcm90bykgeworCWNhc2UgUFBQX0lQOgorCQlyZXR1cm4gTlBfSVA7CisJY2FzZSBQUFBfSVBWNjoKKwkJcmV0dXJuIE5QX0lQVjY7CisJY2FzZSBQUFBfSVBYOgorCQlyZXR1cm4gTlBfSVBYOworCWNhc2UgUFBQX0FUOgorCQlyZXR1cm4gTlBfQVQ7CisJY2FzZSBQUFBfTVBMU19VQzoKKwkJcmV0dXJuIE5QX01QTFNfVUM7CisJY2FzZSBQUFBfTVBMU19NQzoKKwkJcmV0dXJuIE5QX01QTFNfTUM7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisvKiBUcmFuc2xhdGVzIGFuIE5QIGluZGV4IGludG8gYSBQUFAgcHJvdG9jb2wgbnVtYmVyICovCitzdGF0aWMgY29uc3QgaW50IG5waW5kZXhfdG9fcHJvdG9bTlVNX05QXSA9IHsKKwlQUFBfSVAsCisJUFBQX0lQVjYsCisJUFBQX0lQWCwKKwlQUFBfQVQsCisJUFBQX01QTFNfVUMsCisJUFBQX01QTFNfTUMsCit9OworCQorLyogVHJhbnNsYXRlcyBhbiBldGhlcnR5cGUgaW50byBhbiBOUCBpbmRleCAqLworc3RhdGljIGlubGluZSBpbnQgZXRoZXJ0eXBlX3RvX25waW5kZXgoaW50IGV0aGVydHlwZSkKK3sKKwlzd2l0Y2ggKGV0aGVydHlwZSkgeworCWNhc2UgRVRIX1BfSVA6CisJCXJldHVybiBOUF9JUDsKKwljYXNlIEVUSF9QX0lQVjY6CisJCXJldHVybiBOUF9JUFY2OworCWNhc2UgRVRIX1BfSVBYOgorCQlyZXR1cm4gTlBfSVBYOworCWNhc2UgRVRIX1BfUFBQVEFMSzoKKwljYXNlIEVUSF9QX0FUQUxLOgorCQlyZXR1cm4gTlBfQVQ7CisJY2FzZSBFVEhfUF9NUExTX1VDOgorCQlyZXR1cm4gTlBfTVBMU19VQzsKKwljYXNlIEVUSF9QX01QTFNfTUM6CisJCXJldHVybiBOUF9NUExTX01DOworCX0KKwlyZXR1cm4gLTE7Cit9CisKKy8qIFRyYW5zbGF0ZXMgYW4gTlAgaW5kZXggaW50byBhbiBldGhlcnR5cGUgKi8KK3N0YXRpYyBjb25zdCBpbnQgbnBpbmRleF90b19ldGhlcnR5cGVbTlVNX05QXSA9IHsKKwlFVEhfUF9JUCwKKwlFVEhfUF9JUFY2LAorCUVUSF9QX0lQWCwKKwlFVEhfUF9QUFBUQUxLLAorCUVUSF9QX01QTFNfVUMsCisJRVRIX1BfTVBMU19NQywKK307CisKKy8qCisgKiBMb2NraW5nIHNob3J0aGFuZC4KKyAqLworI2RlZmluZSBwcHBfeG1pdF9sb2NrKHBwcCkJc3Bpbl9sb2NrX2JoKCYocHBwKS0+d2xvY2spCisjZGVmaW5lIHBwcF94bWl0X3VubG9jayhwcHApCXNwaW5fdW5sb2NrX2JoKCYocHBwKS0+d2xvY2spCisjZGVmaW5lIHBwcF9yZWN2X2xvY2socHBwKQlzcGluX2xvY2tfYmgoJihwcHApLT5ybG9jaykKKyNkZWZpbmUgcHBwX3JlY3ZfdW5sb2NrKHBwcCkJc3Bpbl91bmxvY2tfYmgoJihwcHApLT5ybG9jaykKKyNkZWZpbmUgcHBwX2xvY2socHBwKQkJZG8geyBwcHBfeG1pdF9sb2NrKHBwcCk7IFwKKwkJCQkgICAgIHBwcF9yZWN2X2xvY2socHBwKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcHBwX3VubG9jayhwcHApCQlkbyB7IHBwcF9yZWN2X3VubG9jayhwcHApOyBcCisJCQkJICAgICBwcHBfeG1pdF91bmxvY2socHBwKTsgfSB3aGlsZSAoMCkKKworLyoKKyAqIC9kZXYvcHBwIGRldmljZSByb3V0aW5lcy4KKyAqIFRoZSAvZGV2L3BwcCBkZXZpY2UgaXMgdXNlZCBieSBwcHBkIHRvIGNvbnRyb2wgdGhlIHBwcCB1bml0LgorICogSXQgc3VwcG9ydHMgdGhlIHJlYWQsIHdyaXRlLCBpb2N0bCBhbmQgcG9sbCBmdW5jdGlvbnMuCisgKiBPcGVuIGluc3RhbmNlcyBvZiAvZGV2L3BwcCBjYW4gYmUgaW4gb25lIG9mIHRocmVlIHN0YXRlczoKKyAqIHVuYXR0YWNoZWQsIGF0dGFjaGVkIHRvIGEgcHBwIHVuaXQsIG9yIGF0dGFjaGVkIHRvIGEgcHBwIGNoYW5uZWwuCisgKi8KK3N0YXRpYyBpbnQgcHBwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyoKKwkgKiBUaGlzIGNvdWxkIChzaG91bGQ/KSBiZSBlbmZvcmNlZCBieSB0aGUgcGVybWlzc2lvbnMgb24gL2Rldi9wcHAuCisJICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBwcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBwcHBfZmlsZSAqcGYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBwcCAqcHBwOworCisJaWYgKHBmICE9IDApIHsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwkJaWYgKHBmLT5raW5kID09IElOVEVSRkFDRSkgeworCQkJcHBwID0gUEZfVE9fUFBQKHBmKTsKKwkJCWlmIChmaWxlID09IHBwcC0+b3duZXIpCisJCQkJcHBwX3NodXRkb3duX2ludGVyZmFjZShwcHApOworCQl9CisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwZi0+cmVmY250KSkgeworCQkJc3dpdGNoIChwZi0+a2luZCkgeworCQkJY2FzZSBJTlRFUkZBQ0U6CisJCQkJcHBwX2Rlc3Ryb3lfaW50ZXJmYWNlKFBGX1RPX1BQUChwZikpOworCQkJCWJyZWFrOworCQkJY2FzZSBDSEFOTkVMOgorCQkJCXBwcF9kZXN0cm95X2NoYW5uZWwoUEZfVE9fQ0hBTk5FTChwZikpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBwcHBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBwcHBfZmlsZSAqcGYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisKKwlyZXQgPSBjb3VudDsKKworCWlmIChwZiA9PSAwKQorCQlyZXR1cm4gLUVOWElPOworCWFkZF93YWl0X3F1ZXVlKCZwZi0+cndhaXQsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNrYiA9IHNrYl9kZXF1ZXVlKCZwZi0+cnEpOworCQlpZiAoc2tiKQorCQkJYnJlYWs7CisJCXJldCA9IDA7CisJCWlmIChwZi0+ZGVhZCkKKwkJCWJyZWFrOworCQlpZiAocGYtPmtpbmQgPT0gSU5URVJGQUNFKSB7CisJCQkvKgorCQkJICogUmV0dXJuIDAgKEVPRikgb24gYW4gaW50ZXJmYWNlIHRoYXQgaGFzIG5vCisJCQkgKiBjaGFubmVscyBjb25uZWN0ZWQsIHVubGVzcyBpdCBpcyBsb29waW5nCisJCQkgKiBuZXR3b3JrIHRyYWZmaWMgKGRlbWFuZCBtb2RlKS4KKwkJCSAqLworCQkJc3RydWN0IHBwcCAqcHBwID0gUEZfVE9fUFBQKHBmKTsKKwkJCWlmIChwcHAtPm5fY2hhbm5lbHMgPT0gMAorCQkJICAgICYmIChwcHAtPmZsYWdzICYgU0NfTE9PUF9UUkFGRklDKSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCXJldCA9IC1FQUdBSU47CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCWJyZWFrOworCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlzY2hlZHVsZSgpOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZwZi0+cndhaXQsICZ3YWl0KTsKKworCWlmIChza2IgPT0gMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSAtRU9WRVJGTE9XOworCWlmIChza2ItPmxlbiA+IGNvdW50KQorCQlnb3RvIG91dGY7CisJcmV0ID0gLUVGQVVMVDsKKwlpZiAoY29weV90b191c2VyKGJ1Ziwgc2tiLT5kYXRhLCBza2ItPmxlbikpCisJCWdvdG8gb3V0ZjsKKwlyZXQgPSBza2ItPmxlbjsKKworIG91dGY6CisJa2ZyZWVfc2tiKHNrYik7Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBwcF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcHBwX2ZpbGUgKnBmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3NpemVfdCByZXQ7CisKKwlpZiAocGYgPT0gMCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlyZXQgPSAtRU5PTUVNOworCXNrYiA9IGFsbG9jX3NrYihjb3VudCArIHBmLT5oZHJsZW4sIEdGUF9LRVJORUwpOworCWlmIChza2IgPT0gMCkKKwkJZ290byBvdXQ7CisJc2tiX3Jlc2VydmUoc2tiLCBwZi0+aGRybGVuKTsKKwlyZXQgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcihza2JfcHV0KHNrYiwgY291bnQpLCBidWYsIGNvdW50KSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2tiX3F1ZXVlX3RhaWwoJnBmLT54cSwgc2tiKTsKKworCXN3aXRjaCAocGYtPmtpbmQpIHsKKwljYXNlIElOVEVSRkFDRToKKwkJcHBwX3htaXRfcHJvY2VzcyhQRl9UT19QUFAocGYpKTsKKwkJYnJlYWs7CisJY2FzZSBDSEFOTkVMOgorCQlwcHBfY2hhbm5lbF9wdXNoKFBGX1RPX0NIQU5ORUwocGYpKTsKKwkJYnJlYWs7CisJfQorCisJcmV0ID0gY291bnQ7CisKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSBmaW5lICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBwcF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBwcHBfZmlsZSAqcGYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwlpZiAocGYgPT0gMCkKKwkJcmV0dXJuIDA7CisJcG9sbF93YWl0KGZpbGUsICZwZi0+cndhaXQsIHdhaXQpOworCW1hc2sgPSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwlpZiAoc2tiX3BlZWsoJnBmLT5ycSkgIT0gMCkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCWlmIChwZi0+ZGVhZCkKKwkJbWFzayB8PSBQT0xMSFVQOworCWVsc2UgaWYgKHBmLT5raW5kID09IElOVEVSRkFDRSkgeworCQkvKiBzZWUgY29tbWVudCBpbiBwcHBfcmVhZCAqLworCQlzdHJ1Y3QgcHBwICpwcHAgPSBQRl9UT19QUFAocGYpOworCQlpZiAocHBwLT5uX2NoYW5uZWxzID09IDAKKwkJICAgICYmIChwcHAtPmZsYWdzICYgU0NfTE9PUF9UUkFGRklDKSA9PSAwKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKworCXJldHVybiBtYXNrOworfQorCisjaWZkZWYgQ09ORklHX1BQUF9GSUxURVIKK3N0YXRpYyBpbnQgZ2V0X2ZpbHRlcih2b2lkIF9fdXNlciAqYXJnLCBzdHJ1Y3Qgc29ja19maWx0ZXIgKipwKQoreworCXN0cnVjdCBzb2NrX2Zwcm9nIHVwcm9nOworCXN0cnVjdCBzb2NrX2ZpbHRlciAqY29kZSA9IE5VTEw7CisJaW50IGxlbiwgZXJyOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1cHJvZywgYXJnLCBzaXplb2YodXByb2cpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAodXByb2cubGVuID4gQlBGX01BWElOU05TKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghdXByb2cubGVuKSB7CisJCSpwID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJbGVuID0gdXByb2cubGVuICogc2l6ZW9mKHN0cnVjdCBzb2NrX2ZpbHRlcik7CisJY29kZSA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoY29kZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihjb2RlLCB1cHJvZy5maWx0ZXIsIGxlbikpIHsKKwkJa2ZyZWUoY29kZSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWVyciA9IHNrX2Noa19maWx0ZXIoY29kZSwgdXByb2cubGVuKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKGNvZGUpOworCQlyZXR1cm4gZXJyOworCX0KKworCSpwID0gY29kZTsKKwlyZXR1cm4gdXByb2cubGVuOworfQorI2VuZGlmIC8qIENPTkZJR19QUFBfRklMVEVSICovCisKK3N0YXRpYyBpbnQgcHBwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBwcHBfZmlsZSAqcGYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBwcCAqcHBwOworCWludCBlcnIgPSAtRUZBVUxULCB2YWwsIHZhbDIsIGk7CisJc3RydWN0IHBwcF9pZGxlIGlkbGU7CisJc3RydWN0IG5waW9jdGwgbnBpOworCWludCB1bml0LCBjZmxhZ3M7CisJc3RydWN0IHNsY29tcHJlc3MgKnZqOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCisJaWYgKHBmID09IDApCisJCXJldHVybiBwcHBfdW5hdHRhY2hlZF9pb2N0bChwZiwgZmlsZSwgY21kLCBhcmcpOworCisJaWYgKGNtZCA9PSBQUFBJT0NERVRBQ0gpIHsKKwkJLyoKKwkJICogV2UgaGF2ZSB0byBiZSBjYXJlZnVsIGhlcmUuLi4gaWYgdGhlIGZpbGUgZGVzY3JpcHRvcgorCQkgKiBoYXMgYmVlbiBkdXAnZCwgd2UgY291bGQgaGF2ZSBhbm90aGVyIHByb2Nlc3MgaW4gdGhlCisJCSAqIG1pZGRsZSBvZiBhIHBvbGwgdXNpbmcgdGhlIHNhbWUgZmlsZSAqLCBzbyB3ZSBoYWQKKwkJICogYmV0dGVyIG5vdCBmcmVlIHRoZSBpbnRlcmZhY2UgZGF0YSBzdHJ1Y3R1cmVzIC0KKwkJICogaW5zdGVhZCB3ZSBmYWlsIHRoZSBpb2N0bC4gIEV2ZW4gaW4gdGhpcyBjYXNlLCB3ZQorCQkgKiBzaHV0IGRvd24gdGhlIGludGVyZmFjZSBpZiB3ZSBhcmUgdGhlIG93bmVyIG9mIGl0LgorCQkgKiBBY3R1YWxseSwgd2Ugc2hvdWxkIGdldCByaWQgb2YgUFBQSU9DREVUQUNILCB1c2VybGFuZAorCQkgKiAoaS5lLiBwcHBkKSBjb3VsZCBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCBieSBjbG9zaW5nCisJCSAqIHRoaXMgZmQgYW5kIHJlb3BlbmluZyAvZGV2L3BwcC4KKwkJICovCisJCWVyciA9IC1FSU5WQUw7CisJCWlmIChwZi0+a2luZCA9PSBJTlRFUkZBQ0UpIHsKKwkJCXBwcCA9IFBGX1RPX1BQUChwZik7CisJCQlpZiAoZmlsZSA9PSBwcHAtPm93bmVyKQorCQkJCXBwcF9zaHV0ZG93bl9pbnRlcmZhY2UocHBwKTsKKwkJfQorCQlpZiAoYXRvbWljX3JlYWQoJmZpbGUtPmZfY291bnQpIDw9IDIpIHsKKwkJCXBwcF9yZWxlYXNlKGlub2RlLCBmaWxlKTsKKwkJCWVyciA9IDA7CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIlBQUElPQ0RFVEFDSCBmaWxlLT5mX2NvdW50PSVkXG4iLAorCQkJICAgICAgIGF0b21pY19yZWFkKCZmaWxlLT5mX2NvdW50KSk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHBmLT5raW5kID09IENIQU5ORUwpIHsKKwkJc3RydWN0IGNoYW5uZWwgKnBjaCA9IFBGX1RPX0NIQU5ORUwocGYpOworCQlzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW47CisKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBQUFBJT0NDT05ORUNUOgorCQkJaWYgKGdldF91c2VyKHVuaXQsIHApKQorCQkJCWJyZWFrOworCQkJZXJyID0gcHBwX2Nvbm5lY3RfY2hhbm5lbChwY2gsIHVuaXQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQUFBJT0NESVNDT05OOgorCQkJZXJyID0gcHBwX2Rpc2Nvbm5lY3RfY2hhbm5lbChwY2gpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRvd25fcmVhZCgmcGNoLT5jaGFuX3NlbSk7CisJCQljaGFuID0gcGNoLT5jaGFuOworCQkJZXJyID0gLUVOT1RUWTsKKwkJCWlmIChjaGFuICYmIGNoYW4tPm9wcy0+aW9jdGwpCisJCQkJZXJyID0gY2hhbi0+b3BzLT5pb2N0bChjaGFuLCBjbWQsIGFyZyk7CisJCQl1cF9yZWFkKCZwY2gtPmNoYW5fc2VtKTsKKwkJfQorCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChwZi0+a2luZCAhPSBJTlRFUkZBQ0UpIHsKKwkJLyogY2FuJ3QgaGFwcGVuICovCisJCXByaW50ayhLRVJOX0VSUiAiUFBQOiBub3QgaW50ZXJmYWNlIG9yIGNoYW5uZWw/P1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBwcCA9IFBGX1RPX1BQUChwZik7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBQUElPQ1NNUlU6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJYnJlYWs7CisJCXBwcC0+bXJ1ID0gdmFsOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DU0ZMQUdTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCWJyZWFrOworCQlwcHBfbG9jayhwcHApOworCQljZmxhZ3MgPSBwcHAtPmZsYWdzICYgfnZhbDsKKwkJcHBwLT5mbGFncyA9IHZhbCAmIFNDX0ZMQUdfQklUUzsKKwkJcHBwX3VubG9jayhwcHApOworCQlpZiAoY2ZsYWdzICYgU0NfQ0NQX09QRU4pCisJCQlwcHBfY2NwX2Nsb3NlZChwcHApOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR0ZMQUdTOgorCQl2YWwgPSBwcHAtPmZsYWdzIHwgcHBwLT54c3RhdGUgfCBwcHAtPnJzdGF0ZTsKKwkJaWYgKHB1dF91c2VyKHZhbCwgcCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ1NDT01QUkVTUzoKKwkJZXJyID0gcHBwX3NldF9jb21wcmVzcyhwcHAsIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHVU5JVDoKKwkJaWYgKHB1dF91c2VyKHBwcC0+ZmlsZS5pbmRleCwgcCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ1NERUJVRzoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlicmVhazsKKwkJcHBwLT5kZWJ1ZyA9IHZhbDsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dERUJVRzoKKwkJaWYgKHB1dF91c2VyKHBwcC0+ZGVidWcsIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHSURMRToKKwkJaWRsZS54bWl0X2lkbGUgPSAoamlmZmllcyAtIHBwcC0+bGFzdF94bWl0KSAvIEhaOworCQlpZGxlLnJlY3ZfaWRsZSA9IChqaWZmaWVzIC0gcHBwLT5sYXN0X3JlY3YpIC8gSFo7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmlkbGUsIHNpemVvZihpZGxlKSkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ1NNQVhDSUQ6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJYnJlYWs7CisJCXZhbDIgPSAxNTsKKwkJaWYgKCh2YWwgPj4gMTYpICE9IDApIHsKKwkJCXZhbDIgPSB2YWwgPj4gMTY7CisJCQl2YWwgJj0gMHhmZmZmOworCQl9CisJCXZqID0gc2xoY19pbml0KHZhbDIrMSwgdmFsKzEpOworCQlpZiAodmogPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJQUFA6IG5vIG1lbW9yeSAoVkogY29tcHJlc3NvcilcbiIpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisJCXBwcF9sb2NrKHBwcCk7CisJCWlmIChwcHAtPnZqICE9IDApCisJCQlzbGhjX2ZyZWUocHBwLT52aik7CisJCXBwcC0+dmogPSB2ajsKKwkJcHBwX3VubG9jayhwcHApOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR05QTU9ERToKKwljYXNlIFBQUElPQ1NOUE1PREU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbnBpLCBhcmdwLCBzaXplb2YobnBpKSkpCisJCQlicmVhazsKKwkJZXJyID0gcHJvdG9fdG9fbnBpbmRleChucGkucHJvdG9jb2wpOworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCQlpID0gZXJyOworCQlpZiAoY21kID09IFBQUElPQ0dOUE1PREUpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlucGkubW9kZSA9IHBwcC0+bnBtb2RlW2ldOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbnBpLCBzaXplb2YobnBpKSkpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlwcHAtPm5wbW9kZVtpXSA9IG5waS5tb2RlOworCQkJLyogd2UgbWF5IGJlIGFibGUgdG8gdHJhbnNtaXQgbW9yZSBwYWNrZXRzIG5vdyAoPz8pICovCisJCQluZXRpZl93YWtlX3F1ZXVlKHBwcC0+ZGV2KTsKKwkJfQorCQllcnIgPSAwOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19QUFBfRklMVEVSCisJY2FzZSBQUFBJT0NTUEFTUzoKKwl7CisJCXN0cnVjdCBzb2NrX2ZpbHRlciAqY29kZTsKKwkJZXJyID0gZ2V0X2ZpbHRlcihhcmdwLCAmY29kZSk7CisJCWlmIChlcnIgPj0gMCkgeworCQkJcHBwX2xvY2socHBwKTsKKwkJCWtmcmVlKHBwcC0+cGFzc19maWx0ZXIpOworCQkJcHBwLT5wYXNzX2ZpbHRlciA9IGNvZGU7CisJCQlwcHAtPnBhc3NfbGVuID0gZXJyOworCQkJcHBwX3VubG9jayhwcHApOworCQkJZXJyID0gMDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBQUFBJT0NTQUNUSVZFOgorCXsKKwkJc3RydWN0IHNvY2tfZmlsdGVyICpjb2RlOworCQllcnIgPSBnZXRfZmlsdGVyKGFyZ3AsICZjb2RlKTsKKwkJaWYgKGVyciA+PSAwKSB7CisJCQlwcHBfbG9jayhwcHApOworCQkJa2ZyZWUocHBwLT5hY3RpdmVfZmlsdGVyKTsKKwkJCXBwcC0+YWN0aXZlX2ZpbHRlciA9IGNvZGU7CisJCQlwcHAtPmFjdGl2ZV9sZW4gPSBlcnI7CisJCQlwcHBfdW5sb2NrKHBwcCk7CisJCQllcnIgPSAwOworCQl9CisJCWJyZWFrOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUFBQX0ZJTFRFUiAqLworCisjaWZkZWYgQ09ORklHX1BQUF9NVUxUSUxJTksKKwljYXNlIFBQUElPQ1NNUlJVOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCWJyZWFrOworCQlwcHBfcmVjdl9sb2NrKHBwcCk7CisJCXBwcC0+bXJydSA9IHZhbDsKKwkJcHBwX3JlY3ZfdW5sb2NrKHBwcCk7CisJCWVyciA9IDA7CisJCWJyZWFrOworI2VuZGlmIC8qIENPTkZJR19QUFBfTVVMVElMSU5LICovCisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PVFRZOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcHBwX3VuYXR0YWNoZWRfaW9jdGwoc3RydWN0IHBwcF9maWxlICpwZiwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHVuaXQsIGVyciA9IC1FRkFVTFQ7CisJc3RydWN0IHBwcCAqcHBwOworCXN0cnVjdCBjaGFubmVsICpjaGFuOworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQUFBJT0NORVdVTklUOgorCQkvKiBDcmVhdGUgYSBuZXcgcHBwIHVuaXQgKi8KKwkJaWYgKGdldF91c2VyKHVuaXQsIHApKQorCQkJYnJlYWs7CisJCXBwcCA9IHBwcF9jcmVhdGVfaW50ZXJmYWNlKHVuaXQsICZlcnIpOworCQlpZiAocHBwID09IDApCisJCQlicmVhazsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gJnBwcC0+ZmlsZTsKKwkJcHBwLT5vd25lciA9IGZpbGU7CisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChwdXRfdXNlcihwcHAtPmZpbGUuaW5kZXgsIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NBVFRBQ0g6CisJCS8qIEF0dGFjaCB0byBhbiBleGlzdGluZyBwcHAgdW5pdCAqLworCQlpZiAoZ2V0X3VzZXIodW5pdCwgcCkpCisJCQlicmVhazsKKwkJZG93bigmYWxsX3BwcF9zZW0pOworCQllcnIgPSAtRU5YSU87CisJCXBwcCA9IHBwcF9maW5kX3VuaXQodW5pdCk7CisJCWlmIChwcHAgIT0gMCkgeworCQkJYXRvbWljX2luYygmcHBwLT5maWxlLnJlZmNudCk7CisJCQlmaWxlLT5wcml2YXRlX2RhdGEgPSAmcHBwLT5maWxlOworCQkJZXJyID0gMDsKKwkJfQorCQl1cCgmYWxsX3BwcF9zZW0pOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DQVRUQ0hBTjoKKwkJaWYgKGdldF91c2VyKHVuaXQsIHApKQorCQkJYnJlYWs7CisJCXNwaW5fbG9ja19iaCgmYWxsX2NoYW5uZWxzX2xvY2spOworCQllcnIgPSAtRU5YSU87CisJCWNoYW4gPSBwcHBfZmluZF9jaGFubmVsKHVuaXQpOworCQlpZiAoY2hhbiAhPSAwKSB7CisJCQlhdG9taWNfaW5jKCZjaGFuLT5maWxlLnJlZmNudCk7CisJCQlmaWxlLT5wcml2YXRlX2RhdGEgPSAmY2hhbi0+ZmlsZTsKKwkJCWVyciA9IDA7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJmFsbF9jaGFubmVsc19sb2NrKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PVFRZOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcHBfZGV2aWNlX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IHBwcF9yZWFkLAorCS53cml0ZQkJPSBwcHBfd3JpdGUsCisJLnBvbGwJCT0gcHBwX3BvbGwsCisJLmlvY3RsCQk9IHBwcF9pb2N0bCwKKwkub3BlbgkJPSBwcHBfb3BlbiwKKwkucmVsZWFzZQk9IHBwcF9yZWxlYXNlCit9OworCisjZGVmaW5lIFBQUF9NQUpPUgkxMDgKKworLyogQ2FsbGVkIGF0IGJvb3QgdGltZSBpZiBwcHAgaXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLAorICAgb3IgYXQgbW9kdWxlIGxvYWQgdGltZSAoZnJvbSBpbml0X21vZHVsZSkgaWYgY29tcGlsZWQgYXMgYSBtb2R1bGUuICovCitzdGF0aWMgaW50IF9faW5pdCBwcHBfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlwcmludGsoS0VSTl9JTkZPICJQUFAgZ2VuZXJpYyBkcml2ZXIgdmVyc2lvbiAiIFBQUF9WRVJTSU9OICJcbiIpOworCWVyciA9IHJlZ2lzdGVyX2NocmRldihQUFBfTUFKT1IsICJwcHAiLCAmcHBwX2RldmljZV9mb3BzKTsKKwlpZiAoIWVycikgeworCQlwcHBfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAicHBwIik7CisJCWlmIChJU19FUlIocHBwX2NsYXNzKSkgeworCQkJZXJyID0gUFRSX0VSUihwcHBfY2xhc3MpOworCQkJZ290byBvdXRfY2hyZGV2OworCQl9CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHBwcF9jbGFzcywgTUtERVYoUFBQX01BSk9SLCAwKSwgTlVMTCwgInBwcCIpOworCQllcnIgPSBkZXZmc19ta19jZGV2KE1LREVWKFBQUF9NQUpPUiwgMCksCisJCQkJU19JRkNIUnxTX0lSVVNSfFNfSVdVU1IsICJwcHAiKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2NsYXNzOworCX0KKworb3V0OgorCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHJlZ2lzdGVyIFBQUCBkZXZpY2UgKCVkKVxuIiwgZXJyKTsKKwlyZXR1cm4gZXJyOworCitvdXRfY2xhc3M6CisJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoUFBQX01BSk9SLDApKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShwcHBfY2xhc3MpOworb3V0X2NocmRldjoKKwl1bnJlZ2lzdGVyX2NocmRldihQUFBfTUFKT1IsICJwcHAiKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIE5ldHdvcmsgaW50ZXJmYWNlIHVuaXQgcm91dGluZXMuCisgKi8KK3N0YXRpYyBpbnQKK3BwcF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBwcCAqcHBwID0gKHN0cnVjdCBwcHAgKikgZGV2LT5wcml2OworCWludCBucGksIHByb3RvOworCXVuc2lnbmVkIGNoYXIgKnBwOworCisJbnBpID0gZXRoZXJ0eXBlX3RvX25waW5kZXgobnRvaHMoc2tiLT5wcm90b2NvbCkpOworCWlmIChucGkgPCAwKQorCQlnb3RvIG91dGY7CisKKwkvKiBEcm9wLCBhY2NlcHQgb3IgcmVqZWN0IHRoZSBwYWNrZXQgKi8KKwlzd2l0Y2ggKHBwcC0+bnBtb2RlW25waV0pIHsKKwljYXNlIE5QTU9ERV9QQVNTOgorCQlicmVhazsKKwljYXNlIE5QTU9ERV9RVUVVRToKKwkJLyogaXQgd291bGQgYmUgbmljZSB0byBoYXZlIGEgd2F5IHRvIHRlbGwgdGhlIG5ldHdvcmsKKwkJICAgc3lzdGVtIHRvIHF1ZXVlIHRoaXMgb25lIHVwIGZvciBsYXRlci4gKi8KKwkJZ290byBvdXRmOworCWNhc2UgTlBNT0RFX0RST1A6CisJY2FzZSBOUE1PREVfRVJST1I6CisJCWdvdG8gb3V0ZjsKKwl9CisKKwkvKiBQdXQgdGhlIDItYnl0ZSBQUFAgcHJvdG9jb2wgbnVtYmVyIG9uIHRoZSBmcm9udCwKKwkgICBtYWtpbmcgc3VyZSB0aGVyZSBpcyByb29tIGZvciB0aGUgYWRkcmVzcyBhbmQgY29udHJvbCBmaWVsZHMuICovCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgUFBQX0hEUkxFTikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbnM7CisKKwkJbnMgPSBhbGxvY19za2Ioc2tiLT5sZW4gKyBkZXYtPmhhcmRfaGVhZGVyX2xlbiwgR0ZQX0FUT01JQyk7CisJCWlmIChucyA9PSAwKQorCQkJZ290byBvdXRmOworCQlza2JfcmVzZXJ2ZShucywgZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCQlza2JfY29weV9iaXRzKHNrYiwgMCwgc2tiX3B1dChucywgc2tiLT5sZW4pLCBza2ItPmxlbik7CisJCWtmcmVlX3NrYihza2IpOworCQlza2IgPSBuczsKKwl9CisJcHAgPSBza2JfcHVzaChza2IsIDIpOworCXByb3RvID0gbnBpbmRleF90b19wcm90b1tucGldOworCXBwWzBdID0gcHJvdG8gPj4gODsKKwlwcFsxXSA9IHByb3RvOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNrYl9xdWV1ZV90YWlsKCZwcHAtPmZpbGUueHEsIHNrYik7CisJcHBwX3htaXRfcHJvY2VzcyhwcHApOworCXJldHVybiAwOworCisgb3V0ZjoKKwlrZnJlZV9za2Ioc2tiKTsKKwkrK3BwcC0+c3RhdHMudHhfZHJvcHBlZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK3BwcF9uZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHBwICpwcHAgPSAoc3RydWN0IHBwcCAqKSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJnBwcC0+c3RhdHM7Cit9CisKK3N0YXRpYyBpbnQKK3BwcF9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IHBwcCAqcHBwID0gZGV2LT5wcml2OworCWludCBlcnIgPSAtRUZBVUxUOworCXZvaWQgX191c2VyICphZGRyID0gKHZvaWQgX191c2VyICopIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhOworCXN0cnVjdCBwcHBfc3RhdHMgc3RhdHM7CisJc3RydWN0IHBwcF9jb21wX3N0YXRzIGNzdGF0czsKKwljaGFyICp2ZXJzOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHUFBQU1RBVFM6CisJCXBwcF9nZXRfc3RhdHMocHBwLCAmc3RhdHMpOworCQlpZiAoY29weV90b191c2VyKGFkZHIsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHUFBQQ1NUQVRTOgorCQltZW1zZXQoJmNzdGF0cywgMCwgc2l6ZW9mKGNzdGF0cykpOworCQlpZiAocHBwLT54Y19zdGF0ZSAhPSAwKQorCQkJcHBwLT54Y29tcC0+Y29tcF9zdGF0KHBwcC0+eGNfc3RhdGUsICZjc3RhdHMuYyk7CisJCWlmIChwcHAtPnJjX3N0YXRlICE9IDApCisJCQlwcHAtPnJjb21wLT5kZWNvbXBfc3RhdChwcHAtPnJjX3N0YXRlLCAmY3N0YXRzLmQpOworCQlpZiAoY29weV90b191c2VyKGFkZHIsICZjc3RhdHMsIHNpemVvZihjc3RhdHMpKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dQUFBWRVI6CisJCXZlcnMgPSBQUFBfVkVSU0lPTjsKKwkJaWYgKGNvcHlfdG9fdXNlcihhZGRyLCB2ZXJzLCBzdHJsZW4odmVycykgKyAxKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcHBwX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBQUFBfSERSTEVOOworCWRldi0+bXR1ID0gUFBQX01UVTsKKwlkZXYtPmFkZHJfbGVuID0gMDsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDM7CisJZGV2LT50eXBlID0gQVJQSFJEX1BQUDsKKwlkZXYtPmZsYWdzID0gSUZGX1BPSU5UT1BPSU5UIHwgSUZGX05PQVJQIHwgSUZGX01VTFRJQ0FTVDsKK30KKworLyoKKyAqIFRyYW5zbWl0LXNpZGUgcm91dGluZXMuCisgKi8KKworLyoKKyAqIENhbGxlZCB0byBkbyBhbnkgd29yayBxdWV1ZWQgdXAgb24gdGhlIHRyYW5zbWl0IHNpZGUKKyAqIHRoYXQgY2FuIG5vdyBiZSBkb25lLgorICovCitzdGF0aWMgdm9pZAorcHBwX3htaXRfcHJvY2VzcyhzdHJ1Y3QgcHBwICpwcHApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXBwcF94bWl0X2xvY2socHBwKTsKKwlpZiAocHBwLT5kZXYgIT0gMCkgeworCQlwcHBfcHVzaChwcHApOworCQl3aGlsZSAocHBwLT54bWl0X3BlbmRpbmcgPT0gMAorCQkgICAgICAgJiYgKHNrYiA9IHNrYl9kZXF1ZXVlKCZwcHAtPmZpbGUueHEpKSAhPSAwKQorCQkJcHBwX3NlbmRfZnJhbWUocHBwLCBza2IpOworCQkvKiBJZiB0aGVyZSdzIG5vIHdvcmsgbGVmdCB0byBkbywgdGVsbCB0aGUgY29yZSBuZXQKKwkJICAgY29kZSB0aGF0IHdlIGNhbiBhY2NlcHQgc29tZSBtb3JlLiAqLworCQlpZiAocHBwLT54bWl0X3BlbmRpbmcgPT0gMCAmJiBza2JfcGVlaygmcHBwLT5maWxlLnhxKSA9PSAwKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShwcHAtPmRldik7CisJfQorCXBwcF94bWl0X3VubG9jayhwcHApOworfQorCisvKgorICogQ29tcHJlc3MgYW5kIHNlbmQgYSBmcmFtZS4KKyAqIFRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgbG9ja2VkIHRoZSB4bWl0IHBhdGgsCisgKiBhbmQgeG1pdF9wZW5kaW5nIHNob3VsZCBiZSAwLgorICovCitzdGF0aWMgdm9pZAorcHBwX3NlbmRfZnJhbWUoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBwcm90byA9IFBQUF9QUk9UTyhza2IpOworCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCWludCBsZW47CisJdW5zaWduZWQgY2hhciAqY3A7CisKKwlpZiAocHJvdG8gPCAweDgwMDApIHsKKyNpZmRlZiBDT05GSUdfUFBQX0ZJTFRFUgorCQkvKiBjaGVjayBpZiB3ZSBzaG91bGQgcGFzcyB0aGlzIHBhY2tldCAqLworCQkvKiB0aGUgZmlsdGVyIGluc3RydWN0aW9ucyBhcmUgY29uc3RydWN0ZWQgYXNzdW1pbmcKKwkJICAgYSBmb3VyLWJ5dGUgUFBQIGhlYWRlciBvbiBlYWNoIHBhY2tldCAqLworCQkqc2tiX3B1c2goc2tiLCAyKSA9IDE7CisJCWlmIChwcHAtPnBhc3NfZmlsdGVyCisJCSAgICAmJiBza19ydW5fZmlsdGVyKHNrYiwgcHBwLT5wYXNzX2ZpbHRlciwKKwkJCQkgICAgIHBwcC0+cGFzc19sZW4pID09IDApIHsKKwkJCWlmIChwcHAtPmRlYnVnICYgMSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiUFBQOiBvdXRib3VuZCBmcmFtZSBub3QgcGFzc2VkXG4iKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuOworCQl9CisJCS8qIGlmIHRoaXMgcGFja2V0IHBhc3NlcyB0aGUgYWN0aXZlIGZpbHRlciwgcmVjb3JkIHRoZSB0aW1lICovCisJCWlmICghKHBwcC0+YWN0aXZlX2ZpbHRlcgorCQkgICAgICAmJiBza19ydW5fZmlsdGVyKHNrYiwgcHBwLT5hY3RpdmVfZmlsdGVyLAorCQkJCSAgICAgICBwcHAtPmFjdGl2ZV9sZW4pID09IDApKQorCQkJcHBwLT5sYXN0X3htaXQgPSBqaWZmaWVzOworCQlza2JfcHVsbChza2IsIDIpOworI2Vsc2UKKwkJLyogZm9yIGRhdGEgcGFja2V0cywgcmVjb3JkIHRoZSB0aW1lICovCisJCXBwcC0+bGFzdF94bWl0ID0gamlmZmllczsKKyNlbmRpZiAvKiBDT05GSUdfUFBQX0ZJTFRFUiAqLworCX0KKworCSsrcHBwLT5zdGF0cy50eF9wYWNrZXRzOworCXBwcC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW4gLSAyOworCisJc3dpdGNoIChwcm90bykgeworCWNhc2UgUFBQX0lQOgorCQlpZiAocHBwLT52aiA9PSAwIHx8IChwcHAtPmZsYWdzICYgU0NfQ09NUF9UQ1ApID09IDApCisJCQlicmVhazsKKwkJLyogdHJ5IHRvIGRvIFZKIFRDUCBoZWFkZXIgY29tcHJlc3Npb24gKi8KKwkJbmV3X3NrYiA9IGFsbG9jX3NrYihza2ItPmxlbiArIHBwcC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4gLSAyLAorCQkJCSAgICBHRlBfQVRPTUlDKTsKKwkJaWYgKG5ld19za2IgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJQUFA6IG5vIG1lbW9yeSAoVkogY29tcCBwa3QpXG4iKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCBwcHAtPmRldi0+aGFyZF9oZWFkZXJfbGVuIC0gMik7CisJCWNwID0gc2tiLT5kYXRhICsgMjsKKwkJbGVuID0gc2xoY19jb21wcmVzcyhwcHAtPnZqLCBjcCwgc2tiLT5sZW4gLSAyLAorCQkJCSAgICBuZXdfc2tiLT5kYXRhICsgMiwgJmNwLAorCQkJCSAgICAhKHBwcC0+ZmxhZ3MgJiBTQ19OT19UQ1BfQ0NJRCkpOworCQlpZiAoY3AgPT0gc2tiLT5kYXRhICsgMikgeworCQkJLyogZGlkbid0IGNvbXByZXNzICovCisJCQlrZnJlZV9za2IobmV3X3NrYik7CisJCX0gZWxzZSB7CisJCQlpZiAoY3BbMF0gJiBTTF9UWVBFX0NPTVBSRVNTRURfVENQKSB7CisJCQkJcHJvdG8gPSBQUFBfVkpDX0NPTVA7CisJCQkJY3BbMF0gJj0gflNMX1RZUEVfQ09NUFJFU1NFRF9UQ1A7CisJCQl9IGVsc2UgeworCQkJCXByb3RvID0gUFBQX1ZKQ19VTkNPTVA7CisJCQkJY3BbMF0gPSBza2ItPmRhdGFbMl07CisJCQl9CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXNrYiA9IG5ld19za2I7CisJCQljcCA9IHNrYl9wdXQoc2tiLCBsZW4gKyAyKTsKKwkJCWNwWzBdID0gMDsKKwkJCWNwWzFdID0gcHJvdG87CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBQUF9DQ1A6CisJCS8qIHBlZWsgYXQgb3V0Ym91bmQgQ0NQIGZyYW1lcyAqLworCQlwcHBfY2NwX3BlZWsocHBwLCBza2IsIDApOworCQlicmVhazsKKwl9CisKKwkvKiB0cnkgdG8gZG8gcGFja2V0IGNvbXByZXNzaW9uICovCisJaWYgKChwcHAtPnhzdGF0ZSAmIFNDX0NPTVBfUlVOKSAmJiBwcHAtPnhjX3N0YXRlICE9IDAKKwkgICAgJiYgcHJvdG8gIT0gUFBQX0xDUCAmJiBwcm90byAhPSBQUFBfQ0NQKSB7CisJCW5ld19za2IgPSBhbGxvY19za2IocHBwLT5kZXYtPm10dSArIHBwcC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4sCisJCQkJICAgIEdGUF9BVE9NSUMpOworCQlpZiAobmV3X3NrYiA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlBQUDogbm8gbWVtb3J5IChjb21wIHBrdClcbiIpOworCQkJZ290byBkcm9wOworCQl9CisJCWlmIChwcHAtPmRldi0+aGFyZF9oZWFkZXJfbGVuID4gUFBQX0hEUkxFTikKKwkJCXNrYl9yZXNlcnZlKG5ld19za2IsCisJCQkJICAgIHBwcC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4gLSBQUFBfSERSTEVOKTsKKworCQkvKiBjb21wcmVzc29yIHN0aWxsIGV4cGVjdHMgQS9DIGJ5dGVzIGluIGhkciAqLworCQlsZW4gPSBwcHAtPnhjb21wLT5jb21wcmVzcyhwcHAtPnhjX3N0YXRlLCBza2ItPmRhdGEgLSAyLAorCQkJCQkgICBuZXdfc2tiLT5kYXRhLCBza2ItPmxlbiArIDIsCisJCQkJCSAgIHBwcC0+ZGV2LT5tdHUgKyBQUFBfSERSTEVOKTsKKwkJaWYgKGxlbiA+IDAgJiYgKHBwcC0+ZmxhZ3MgJiBTQ19DQ1BfVVApKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXNrYiA9IG5ld19za2I7CisJCQlza2JfcHV0KHNrYiwgbGVuKTsKKwkJCXNrYl9wdWxsKHNrYiwgMik7CS8qIHB1bGwgb2ZmIEEvQyBieXRlcyAqLworCQl9IGVsc2UgeworCQkJLyogZGlkbid0IGNvbXByZXNzLCBvciBDQ1Agbm90IHVwIHlldCAqLworCQkJa2ZyZWVfc2tiKG5ld19za2IpOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB3ZSBhcmUgd2FpdGluZyBmb3IgdHJhZmZpYyAoZGVtYW5kIGRpYWxsaW5nKSwKKwkgKiBxdWV1ZSBpdCB1cCBmb3IgcHBwZCB0byByZWNlaXZlLgorCSAqLworCWlmIChwcHAtPmZsYWdzICYgU0NfTE9PUF9UUkFGRklDKSB7CisJCWlmIChwcHAtPmZpbGUucnEucWxlbiA+IFBQUF9NQVhfUlFMRU4pCisJCQlnb3RvIGRyb3A7CisJCXNrYl9xdWV1ZV90YWlsKCZwcHAtPmZpbGUucnEsIHNrYik7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHBwLT5maWxlLnJ3YWl0KTsKKwkJcmV0dXJuOworCX0KKworCXBwcC0+eG1pdF9wZW5kaW5nID0gc2tiOworCXBwcF9wdXNoKHBwcCk7CisJcmV0dXJuOworCisgZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKKwkrK3BwcC0+c3RhdHMudHhfZXJyb3JzOworfQorCisvKgorICogVHJ5IHRvIHNlbmQgdGhlIGZyYW1lIGluIHhtaXRfcGVuZGluZy4KKyAqIFRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgdGhlIHhtaXQgcGF0aCBsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkCitwcHBfcHVzaChzdHJ1Y3QgcHBwICpwcHApCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgY2hhbm5lbCAqcGNoOworCXN0cnVjdCBza19idWZmICpza2IgPSBwcHAtPnhtaXRfcGVuZGluZzsKKworCWlmIChza2IgPT0gMCkKKwkJcmV0dXJuOworCisJbGlzdCA9ICZwcHAtPmNoYW5uZWxzOworCWlmIChsaXN0X2VtcHR5KGxpc3QpKSB7CisJCS8qIG5vd2hlcmUgdG8gc2VuZCB0aGUgcGFja2V0LCBqdXN0IGRyb3AgaXQgKi8KKwkJcHBwLT54bWl0X3BlbmRpbmcgPSBOVUxMOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgocHBwLT5mbGFncyAmIFNDX01VTFRJTElOSykgPT0gMCkgeworCQkvKiBub3QgZG9pbmcgbXVsdGlsaW5rOiBzZW5kIGl0IGRvd24gdGhlIGZpcnN0IGNoYW5uZWwgKi8KKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCXBjaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGNoYW5uZWwsIGNsaXN0KTsKKworCQlzcGluX2xvY2tfYmgoJnBjaC0+ZG93bmwpOworCQlpZiAocGNoLT5jaGFuKSB7CisJCQlpZiAocGNoLT5jaGFuLT5vcHMtPnN0YXJ0X3htaXQocGNoLT5jaGFuLCBza2IpKQorCQkJCXBwcC0+eG1pdF9wZW5kaW5nID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCS8qIGNoYW5uZWwgZ290IHVucmVnaXN0ZXJlZCAqLworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlwcHAtPnhtaXRfcGVuZGluZyA9IE5VTEw7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJnBjaC0+ZG93bmwpOworCQlyZXR1cm47CisJfQorCisjaWZkZWYgQ09ORklHX1BQUF9NVUxUSUxJTksKKwkvKiBNdWx0aWxpbms6IGZyYWdtZW50IHRoZSBwYWNrZXQgb3ZlciBhcyBtYW55IGxpbmtzCisJICAgYXMgY2FuIHRha2UgdGhlIHBhY2tldCBhdCB0aGUgbW9tZW50LiAqLworCWlmICghcHBwX21wX2V4cGxvZGUocHBwLCBza2IpKQorCQlyZXR1cm47CisjZW5kaWYgLyogQ09ORklHX1BQUF9NVUxUSUxJTksgKi8KKworCXBwcC0+eG1pdF9wZW5kaW5nID0gTlVMTDsKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworI2lmZGVmIENPTkZJR19QUFBfTVVMVElMSU5LCisvKgorICogRGl2aWRlIGEgcGFja2V0IHRvIGJlIHRyYW5zbWl0dGVkIGludG8gZnJhZ21lbnRzIGFuZAorICogc2VuZCB0aGVtIG91dCB0aGUgaW5kaXZpZHVhbCBsaW5rcy4KKyAqLworc3RhdGljIGludCBwcHBfbXBfZXhwbG9kZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IG5jaCwgbGVuLCBmcmFnc2l6ZTsKKwlpbnQgaSwgYml0cywgaGRybGVuLCBtdHU7CisJaW50IGZsZW4sIGZuYjsKKwl1bnNpZ25lZCBjaGFyICpwLCAqcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBjaGFubmVsICpwY2g7CisJc3RydWN0IHNrX2J1ZmYgKmZyYWc7CisJc3RydWN0IHBwcF9jaGFubmVsICpjaGFuOworCisJbmNoID0gMDsKKwloZHJsZW4gPSAocHBwLT5mbGFncyAmIFNDX01QX1hTSE9SVFNFUSk/IE1QSERSTEVOX1NTTjogTVBIRFJMRU47CisJbGlzdCA9ICZwcHAtPmNoYW5uZWxzOworCXdoaWxlICgobGlzdCA9IGxpc3QtPm5leHQpICE9ICZwcHAtPmNoYW5uZWxzKSB7CisJCXBjaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGNoYW5uZWwsIGNsaXN0KTsKKwkJbmNoICs9IHBjaC0+YXZhaWwgPSAoc2tiX3F1ZXVlX2xlbigmcGNoLT5maWxlLnhxKSA9PSAwKTsKKwkJLyoKKwkJICogSWYgYSBjaGFubmVsIGhhc24ndCBoYWQgYSBmcmFnbWVudCB5ZXQsIGl0IGhhcyB0byBnZXQKKwkJICogb25lIGJlZm9yZSB3ZSBzZW5kIGFueSBmcmFnbWVudHMgb24gbGF0ZXIgY2hhbm5lbHMuCisJCSAqIElmIGl0IGNhbid0IHRha2UgYSBmcmFnbWVudCBub3csIGRvbid0IGdpdmUgYW55CisJCSAqIHRvIHN1YnNlcXVlbnQgY2hhbm5lbHMuCisJCSAqLworCQlpZiAoIXBjaC0+aGFkX2ZyYWcgJiYgIXBjaC0+YXZhaWwpIHsKKwkJCXdoaWxlICgobGlzdCA9IGxpc3QtPm5leHQpICE9ICZwcHAtPmNoYW5uZWxzKSB7CisJCQkJcGNoID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgY2hhbm5lbCwgY2xpc3QpOworCQkJCXBjaC0+YXZhaWwgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKG5jaCA9PSAwKQorCQlyZXR1cm4gMDsJLyogY2FuJ3QgdGFrZSBub3csIGxlYXZlIGl0IGluIHhtaXRfcGVuZGluZyAqLworCisJLyogRG8gcHJvdG9jb2wgZmllbGQgY29tcHJlc3Npb24gKFhYWCB0aGlzIHNob3VsZCBiZSBvcHRpb25hbCkgKi8KKwlwID0gc2tiLT5kYXRhOworCWxlbiA9IHNrYi0+bGVuOworCWlmICgqcCA9PSAwKSB7CisJCSsrcDsKKwkJLS1sZW47CisJfQorCisJLyogZGVjaWRlIG9uIGZyYWdtZW50IHNpemUgKi8KKwlmcmFnc2l6ZSA9IGxlbjsKKwlpZiAobmNoID4gMSkgeworCQlpbnQgbWF4Y2ggPSBST1VORFVQKGxlbiwgTUlOX0ZSQUdfU0laRSk7CisJCWlmIChuY2ggPiBtYXhjaCkKKwkJCW5jaCA9IG1heGNoOworCQlmcmFnc2l6ZSA9IFJPVU5EVVAoZnJhZ3NpemUsIG5jaCk7CisJfQorCisJLyogc2tpcCB0byB0aGUgY2hhbm5lbCBhZnRlciB0aGUgb25lIHdlIGxhc3QgdXNlZAorCSAgIGFuZCBzdGFydCBhdCB0aGF0IG9uZSAqLworCWZvciAoaSA9IDA7IGkgPCBwcHAtPm54Y2hhbjsgKytpKSB7CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCQlpZiAobGlzdCA9PSAmcHBwLT5jaGFubmVscykgeworCQkJaSA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIGNyZWF0ZSBhIGZyYWdtZW50IGZvciBlYWNoIGNoYW5uZWwgKi8KKwliaXRzID0gQjsKKwlkbyB7CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCQlpZiAobGlzdCA9PSAmcHBwLT5jaGFubmVscykgeworCQkJaSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlwY2ggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjaGFubmVsLCBjbGlzdCk7CisJCSsraTsKKwkJaWYgKCFwY2gtPmF2YWlsKQorCQkJY29udGludWU7CisKKwkJLyogY2hlY2sgdGhlIGNoYW5uZWwncyBtdHUgYW5kIHdoZXRoZXIgaXQgaXMgc3RpbGwgYXR0YWNoZWQuICovCisJCXNwaW5fbG9ja19iaCgmcGNoLT5kb3dubCk7CisJCWlmIChwY2gtPmNoYW4gPT0gMCB8fCAobXR1ID0gcGNoLT5jaGFuLT5tdHUpIDwgaGRybGVuKSB7CisJCQkvKiBjYW4ndCB1c2UgdGhpcyBjaGFubmVsICovCisJCQlzcGluX3VubG9ja19iaCgmcGNoLT5kb3dubCk7CisJCQlwY2gtPmF2YWlsID0gMDsKKwkJCWlmICgtLW5jaCA9PSAwKQorCQkJCWJyZWFrOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBXZSBoYXZlIHRvIGNyZWF0ZSBtdWx0aXBsZSBmcmFnbWVudHMgZm9yIHRoaXMgY2hhbm5lbAorCQkgKiBpZiBmcmFnc2l6ZSBpcyBncmVhdGVyIHRoYW4gdGhlIGNoYW5uZWwncyBtdHUuCisJCSAqLworCQlpZiAoZnJhZ3NpemUgPiBsZW4pCisJCQlmcmFnc2l6ZSA9IGxlbjsKKwkJZm9yIChmbGVuID0gZnJhZ3NpemU7IGZsZW4gPiAwOyBmbGVuIC09IGZuYikgeworCQkJZm5iID0gZmxlbjsKKwkJCWlmIChmbmIgPiBtdHUgKyAyIC0gaGRybGVuKQorCQkJCWZuYiA9IG10dSArIDIgLSBoZHJsZW47CisJCQlpZiAoZm5iID49IGxlbikKKwkJCQliaXRzIHw9IEU7CisJCQlmcmFnID0gYWxsb2Nfc2tiKGZuYiArIGhkcmxlbiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoZnJhZyA9PSAwKQorCQkJCWdvdG8gbm9za2I7CisJCQlxID0gc2tiX3B1dChmcmFnLCBmbmIgKyBoZHJsZW4pOworCQkJLyogbWFrZSB0aGUgTVAgaGVhZGVyICovCisJCQlxWzBdID0gUFBQX01QID4+IDg7CisJCQlxWzFdID0gUFBQX01QOworCQkJaWYgKHBwcC0+ZmxhZ3MgJiBTQ19NUF9YU0hPUlRTRVEpIHsKKwkJCQlxWzJdID0gYml0cyArICgocHBwLT5ueHNlcSA+PiA4KSAmIDB4Zik7CisJCQkJcVszXSA9IHBwcC0+bnhzZXE7CisJCQl9IGVsc2UgeworCQkJCXFbMl0gPSBiaXRzOworCQkJCXFbM10gPSBwcHAtPm54c2VxID4+IDE2OworCQkJCXFbNF0gPSBwcHAtPm54c2VxID4+IDg7CisJCQkJcVs1XSA9IHBwcC0+bnhzZXE7CisJCQl9CisKKwkJCS8qIGNvcHkgdGhlIGRhdGEgaW4gKi8KKwkJCW1lbWNweShxICsgaGRybGVuLCBwLCBmbmIpOworCisJCQkvKiB0cnkgdG8gc2VuZCBpdCBkb3duIHRoZSBjaGFubmVsICovCisJCQljaGFuID0gcGNoLT5jaGFuOworCQkJaWYgKCFjaGFuLT5vcHMtPnN0YXJ0X3htaXQoY2hhbiwgZnJhZykpCisJCQkJc2tiX3F1ZXVlX3RhaWwoJnBjaC0+ZmlsZS54cSwgZnJhZyk7CisJCQlwY2gtPmhhZF9mcmFnID0gMTsKKwkJCXAgKz0gZm5iOworCQkJbGVuIC09IGZuYjsKKwkJCSsrcHBwLT5ueHNlcTsKKwkJCWJpdHMgPSAwOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZwY2gtPmRvd25sKTsKKwl9IHdoaWxlIChsZW4gPiAwKTsKKwlwcHAtPm54Y2hhbiA9IGk7CisKKwlyZXR1cm4gMTsKKworIG5vc2tiOgorCXNwaW5fdW5sb2NrX2JoKCZwY2gtPmRvd25sKTsKKwlpZiAocHBwLT5kZWJ1ZyAmIDEpCisJCXByaW50ayhLRVJOX0VSUiAiUFBQOiBubyBtZW1vcnkgKGZyYWdtZW50KVxuIik7CisJKytwcHAtPnN0YXRzLnR4X2Vycm9yczsKKwkrK3BwcC0+bnhzZXE7CisJcmV0dXJuIDE7CS8qIGFiYW5kb24gdGhlIGZyYW1lICovCit9CisjZW5kaWYgLyogQ09ORklHX1BQUF9NVUxUSUxJTksgKi8KKworLyoKKyAqIFRyeSB0byBzZW5kIGRhdGEgb3V0IG9uIGEgY2hhbm5lbC4KKyAqLworc3RhdGljIHZvaWQKK3BwcF9jaGFubmVsX3B1c2goc3RydWN0IGNoYW5uZWwgKnBjaCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBwcHAgKnBwcDsKKworCXNwaW5fbG9ja19iaCgmcGNoLT5kb3dubCk7CisJaWYgKHBjaC0+Y2hhbiAhPSAwKSB7CisJCXdoaWxlIChza2JfcXVldWVfbGVuKCZwY2gtPmZpbGUueHEpID4gMCkgeworCQkJc2tiID0gc2tiX2RlcXVldWUoJnBjaC0+ZmlsZS54cSk7CisJCQlpZiAoIXBjaC0+Y2hhbi0+b3BzLT5zdGFydF94bWl0KHBjaC0+Y2hhbiwgc2tiKSkgeworCQkJCS8qIHB1dCB0aGUgcGFja2V0IGJhY2sgYW5kIHRyeSBhZ2FpbiBsYXRlciAqLworCQkJCXNrYl9xdWV1ZV9oZWFkKCZwY2gtPmZpbGUueHEsIHNrYik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBjaGFubmVsIGdvdCBkZXJlZ2lzdGVyZWQgKi8KKwkJc2tiX3F1ZXVlX3B1cmdlKCZwY2gtPmZpbGUueHEpOworCX0KKwlzcGluX3VubG9ja19iaCgmcGNoLT5kb3dubCk7CisJLyogc2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIGZyb20gdGhlIGF0dGFjaGVkIHVuaXQgdG8gYmUgc2VudCAqLworCWlmIChza2JfcXVldWVfbGVuKCZwY2gtPmZpbGUueHEpID09IDApIHsKKwkJcmVhZF9sb2NrX2JoKCZwY2gtPnVwbCk7CisJCXBwcCA9IHBjaC0+cHBwOworCQlpZiAocHBwICE9IDApCisJCQlwcHBfeG1pdF9wcm9jZXNzKHBwcCk7CisJCXJlYWRfdW5sb2NrX2JoKCZwY2gtPnVwbCk7CisJfQorfQorCisvKgorICogUmVjZWl2ZS1zaWRlIHJvdXRpbmVzLgorICovCisKKy8qIG1pc3VzZSBhIGZldyBmaWVsZHMgb2YgdGhlIHNrYiBmb3IgTVAgcmVjb25zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgc2VxdWVuY2UJcHJpb3JpdHkKKyNkZWZpbmUgQkViaXRzCQljYlswXQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3BwcF9kb19yZWN2KHN0cnVjdCBwcHAgKnBwcCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNoYW5uZWwgKnBjaCkKK3sKKwlwcHBfcmVjdl9sb2NrKHBwcCk7CisJLyogcHBwLT5kZXYgPT0gMCBtZWFucyBpbnRlcmZhY2UgaXMgY2xvc2luZyBkb3duICovCisJaWYgKHBwcC0+ZGV2ICE9IDApCisJCXBwcF9yZWNlaXZlX2ZyYW1lKHBwcCwgc2tiLCBwY2gpOworCWVsc2UKKwkJa2ZyZWVfc2tiKHNrYik7CisJcHBwX3JlY3ZfdW5sb2NrKHBwcCk7Cit9CisKK3ZvaWQKK3BwcF9pbnB1dChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGNoYW5uZWwgKnBjaCA9IGNoYW4tPnBwcDsKKwlpbnQgcHJvdG87CisKKwlpZiAocGNoID09IDAgfHwgc2tiLT5sZW4gPT0gMCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKwkKKwlwcm90byA9IFBQUF9QUk9UTyhza2IpOworCXJlYWRfbG9ja19iaCgmcGNoLT51cGwpOworCWlmIChwY2gtPnBwcCA9PSAwIHx8IHByb3RvID49IDB4YzAwMCB8fCBwcm90byA9PSBQUFBfQ0NQRlJBRykgeworCQkvKiBwdXQgaXQgb24gdGhlIGNoYW5uZWwgcXVldWUgKi8KKwkJc2tiX3F1ZXVlX3RhaWwoJnBjaC0+ZmlsZS5ycSwgc2tiKTsKKwkJLyogZHJvcCBvbGQgZnJhbWVzIGlmIHF1ZXVlIHRvbyBsb25nICovCisJCXdoaWxlIChwY2gtPmZpbGUucnEucWxlbiA+IFBQUF9NQVhfUlFMRU4KKwkJICAgICAgICYmIChza2IgPSBza2JfZGVxdWV1ZSgmcGNoLT5maWxlLnJxKSkgIT0gMCkKKwkJCWtmcmVlX3NrYihza2IpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBjaC0+ZmlsZS5yd2FpdCk7CisJfSBlbHNlIHsKKwkJcHBwX2RvX3JlY3YocGNoLT5wcHAsIHNrYiwgcGNoKTsKKwl9CisJcmVhZF91bmxvY2tfYmgoJnBjaC0+dXBsKTsKK30KKworLyogUHV0IGEgMC1sZW5ndGggc2tiIGluIHRoZSByZWNlaXZlIHF1ZXVlIGFzIGFuIGVycm9yIGluZGljYXRpb24gKi8KK3ZvaWQKK3BwcF9pbnB1dF9lcnJvcihzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIGludCBjb2RlKQoreworCXN0cnVjdCBjaGFubmVsICpwY2ggPSBjaGFuLT5wcHA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmIChwY2ggPT0gMCkKKwkJcmV0dXJuOworCisJcmVhZF9sb2NrX2JoKCZwY2gtPnVwbCk7CisJaWYgKHBjaC0+cHBwICE9IDApIHsKKwkJc2tiID0gYWxsb2Nfc2tiKDAsIEdGUF9BVE9NSUMpOworCQlpZiAoc2tiICE9IDApIHsKKwkJCXNrYi0+bGVuID0gMDsJCS8qIHByb2JhYmx5IHVubmVjZXNzYXJ5ICovCisJCQlza2ItPmNiWzBdID0gY29kZTsKKwkJCXBwcF9kb19yZWN2KHBjaC0+cHBwLCBza2IsIHBjaCk7CisJCX0KKwl9CisJcmVhZF91bmxvY2tfYmgoJnBjaC0+dXBsKTsKK30KKworLyoKKyAqIFdlIGNvbWUgaW4gaGVyZSB0byBwcm9jZXNzIGEgcmVjZWl2ZWQgZnJhbWUuCisgKiBUaGUgcmVjZWl2ZSBzaWRlIG9mIHRoZSBwcHAgdW5pdCBpcyBsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkCitwcHBfcmVjZWl2ZV9mcmFtZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjaGFubmVsICpwY2gpCit7CisJaWYgKHNrYi0+bGVuID49IDIpIHsKKyNpZmRlZiBDT05GSUdfUFBQX01VTFRJTElOSworCQkvKiBYWFggZG8gY2hhbm5lbC1sZXZlbCBkZWNvbXByZXNzaW9uIGhlcmUgKi8KKwkJaWYgKFBQUF9QUk9UTyhza2IpID09IFBQUF9NUCkKKwkJCXBwcF9yZWNlaXZlX21wX2ZyYW1lKHBwcCwgc2tiLCBwY2gpOworCQllbHNlCisjZW5kaWYgLyogQ09ORklHX1BQUF9NVUxUSUxJTksgKi8KKwkJCXBwcF9yZWNlaXZlX25vbm1wX2ZyYW1lKHBwcCwgc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChza2ItPmxlbiA+IDApCisJCS8qIG5vdGU6IGEgMC1sZW5ndGggc2tiIGlzIHVzZWQgYXMgYW4gZXJyb3IgaW5kaWNhdGlvbiAqLworCQkrK3BwcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKworCWtmcmVlX3NrYihza2IpOworCXBwcF9yZWNlaXZlX2Vycm9yKHBwcCk7Cit9CisKK3N0YXRpYyB2b2lkCitwcHBfcmVjZWl2ZV9lcnJvcihzdHJ1Y3QgcHBwICpwcHApCit7CisJKytwcHAtPnN0YXRzLnJ4X2Vycm9yczsKKwlpZiAocHBwLT52aiAhPSAwKQorCQlzbGhjX3Rvc3MocHBwLT52aik7Cit9CisKK3N0YXRpYyB2b2lkCitwcHBfcmVjZWl2ZV9ub25tcF9mcmFtZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKm5zOworCWludCBwcm90bywgbGVuLCBucGk7CisKKwkvKgorCSAqIERlY29tcHJlc3MgdGhlIGZyYW1lLCBpZiBjb21wcmVzc2VkLgorCSAqIE5vdGUgdGhhdCBzb21lIGRlY29tcHJlc3NvcnMgbmVlZCB0byBzZWUgdW5jb21wcmVzc2VkIGZyYW1lcworCSAqIHRoYXQgY29tZSBpbiBhcyB3ZWxsIGFzIGNvbXByZXNzZWQgZnJhbWVzLgorCSAqLworCWlmIChwcHAtPnJjX3N0YXRlICE9IDAgJiYgKHBwcC0+cnN0YXRlICYgU0NfREVDT01QX1JVTikKKwkgICAgJiYgKHBwcC0+cnN0YXRlICYgKFNDX0RDX0ZFUlJPUiB8IFNDX0RDX0VSUk9SKSkgPT0gMCkKKwkJc2tiID0gcHBwX2RlY29tcHJlc3NfZnJhbWUocHBwLCBza2IpOworCisJcHJvdG8gPSBQUFBfUFJPVE8oc2tiKTsKKwlzd2l0Y2ggKHByb3RvKSB7CisJY2FzZSBQUFBfVkpDX0NPTVA6CisJCS8qIGRlY29tcHJlc3MgVkogY29tcHJlc3NlZCBwYWNrZXRzICovCisJCWlmIChwcHAtPnZqID09IDAgfHwgKHBwcC0+ZmxhZ3MgJiBTQ19SRUpfQ09NUF9UQ1ApKQorCQkJZ290byBlcnI7CisKKwkJaWYgKHNrYl90YWlscm9vbShza2IpIDwgMTI0KSB7CisJCQkvKiBjb3B5IHRvIGEgbmV3IHNrX2J1ZmYgd2l0aCBtb3JlIHRhaWxyb29tICovCisJCQlucyA9IGRldl9hbGxvY19za2Ioc2tiLT5sZW4gKyAxMjgpOworCQkJaWYgKG5zID09IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIiUFBQOiBubyBtZW1vcnkgKFZKIGRlY29tcClcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJc2tiX3Jlc2VydmUobnMsIDIpOworCQkJc2tiX2NvcHlfYml0cyhza2IsIDAsIHNrYl9wdXQobnMsIHNrYi0+bGVuKSwgc2tiLT5sZW4pOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlza2IgPSBuczsKKwkJfQorCQllbHNlIGlmICghcHNrYl9tYXlfcHVsbChza2IsIHNrYi0+bGVuKSkKKwkJCWdvdG8gZXJyOworCisJCWxlbiA9IHNsaGNfdW5jb21wcmVzcyhwcHAtPnZqLCBza2ItPmRhdGEgKyAyLCBza2ItPmxlbiAtIDIpOworCQlpZiAobGVuIDw9IDApIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJQUFA6IFZKIGRlY29tcHJlc3Npb24gZXJyb3JcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwkJbGVuICs9IDI7CisJCWlmIChsZW4gPiBza2ItPmxlbikKKwkJCXNrYl9wdXQoc2tiLCBsZW4gLSBza2ItPmxlbik7CisJCWVsc2UgaWYgKGxlbiA8IHNrYi0+bGVuKQorCQkJc2tiX3RyaW0oc2tiLCBsZW4pOworCQlwcm90byA9IFBQUF9JUDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUF9WSkNfVU5DT01QOgorCQlpZiAocHBwLT52aiA9PSAwIHx8IChwcHAtPmZsYWdzICYgU0NfUkVKX0NPTVBfVENQKSkKKwkJCWdvdG8gZXJyOworCQkKKwkJLyogVW50aWwgd2UgZml4IHRoZSBkZWNvbXByZXNzb3IgbmVlZCB0byBtYWtlIHN1cmUKKwkJICogZGF0YSBwb3J0aW9uIGlzIGxpbmVhci4KKwkJICovCisJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNrYi0+bGVuKSkgCisJCQlnb3RvIGVycjsKKworCQlpZiAoc2xoY19yZW1lbWJlcihwcHAtPnZqLCBza2ItPmRhdGEgKyAyLCBza2ItPmxlbiAtIDIpIDw9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUFBQOiBWSiB1bmNvbXByZXNzZWQgZXJyb3JcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwkJcHJvdG8gPSBQUFBfSVA7CisJCWJyZWFrOworCisJY2FzZSBQUFBfQ0NQOgorCQlwcHBfY2NwX3BlZWsocHBwLCBza2IsIDEpOworCQlicmVhazsKKwl9CisKKwkrK3BwcC0+c3RhdHMucnhfcGFja2V0czsKKwlwcHAtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuIC0gMjsKKworCW5waSA9IHByb3RvX3RvX25waW5kZXgocHJvdG8pOworCWlmIChucGkgPCAwKSB7CisJCS8qIGNvbnRyb2wgb3IgdW5rbm93biBmcmFtZSAtIHBhc3MgaXQgdG8gcHBwZCAqLworCQlza2JfcXVldWVfdGFpbCgmcHBwLT5maWxlLnJxLCBza2IpOworCQkvKiBsaW1pdCBxdWV1ZSBsZW5ndGggYnkgZHJvcHBpbmcgb2xkIGZyYW1lcyAqLworCQl3aGlsZSAocHBwLT5maWxlLnJxLnFsZW4gPiBQUFBfTUFYX1JRTEVOCisJCSAgICAgICAmJiAoc2tiID0gc2tiX2RlcXVldWUoJnBwcC0+ZmlsZS5ycSkpICE9IDApCisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJLyogd2FrZSB1cCBhbnkgcHJvY2VzcyBwb2xsaW5nIG9yIGJsb2NraW5nIG9uIHJlYWQgKi8KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcHAtPmZpbGUucndhaXQpOworCisJfSBlbHNlIHsKKwkJLyogbmV0d29yayBwcm90b2NvbCBmcmFtZSAtIGdpdmUgaXQgdG8gdGhlIGtlcm5lbCAqLworCisjaWZkZWYgQ09ORklHX1BQUF9GSUxURVIKKwkJLyogY2hlY2sgaWYgdGhlIHBhY2tldCBwYXNzZXMgdGhlIHBhc3MgYW5kIGFjdGl2ZSBmaWx0ZXJzICovCisJCS8qIHRoZSBmaWx0ZXIgaW5zdHJ1Y3Rpb25zIGFyZSBjb25zdHJ1Y3RlZCBhc3N1bWluZworCQkgICBhIGZvdXItYnl0ZSBQUFAgaGVhZGVyIG9uIGVhY2ggcGFja2V0ICovCisJCSpza2JfcHVzaChza2IsIDIpID0gMDsKKwkJaWYgKHBwcC0+cGFzc19maWx0ZXIKKwkJICAgICYmIHNrX3J1bl9maWx0ZXIoc2tiLCBwcHAtPnBhc3NfZmlsdGVyLAorCQkJCSAgICAgcHBwLT5wYXNzX2xlbikgPT0gMCkgeworCQkJaWYgKHBwcC0+ZGVidWcgJiAxKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJQUFA6IGluYm91bmQgZnJhbWUgbm90IHBhc3NlZFxuIik7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIShwcHAtPmFjdGl2ZV9maWx0ZXIKKwkJICAgICAgJiYgc2tfcnVuX2ZpbHRlcihza2IsIHBwcC0+YWN0aXZlX2ZpbHRlciwKKwkJCQkgICAgICAgcHBwLT5hY3RpdmVfbGVuKSA9PSAwKSkKKwkJCXBwcC0+bGFzdF9yZWN2ID0gamlmZmllczsKKwkJc2tiX3B1bGwoc2tiLCAyKTsKKyNlbHNlCisJCXBwcC0+bGFzdF9yZWN2ID0gamlmZmllczsKKyNlbmRpZiAvKiBDT05GSUdfUFBQX0ZJTFRFUiAqLworCisJCWlmICgocHBwLT5kZXYtPmZsYWdzICYgSUZGX1VQKSA9PSAwCisJCSAgICB8fCBwcHAtPm5wbW9kZVtucGldICE9IE5QTU9ERV9QQVNTKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfSBlbHNlIHsKKwkJCXNrYl9wdWxsKHNrYiwgMik7CS8qIGNob3Agb2ZmIHByb3RvY29sICovCisJCQlza2ItPmRldiA9IHBwcC0+ZGV2OworCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKG5waW5kZXhfdG9fZXRoZXJ0eXBlW25waV0pOworCQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQkJc2tiLT5pbnB1dF9kZXYgPSBwcHAtPmRldjsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlwcHAtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCX0KKwl9CisJcmV0dXJuOworCisgZXJyOgorCWtmcmVlX3NrYihza2IpOworCXBwcF9yZWNlaXZlX2Vycm9yKHBwcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitwcHBfZGVjb21wcmVzc19mcmFtZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHByb3RvID0gUFBQX1BST1RPKHNrYik7CisJc3RydWN0IHNrX2J1ZmYgKm5zOworCWludCBsZW47CisKKwkvKiBVbnRpbCB3ZSBmaXggYWxsIHRoZSBkZWNvbXByZXNzb3IncyBuZWVkIHRvIG1ha2Ugc3VyZQorCSAqIGRhdGEgcG9ydGlvbiBpcyBsaW5lYXIuCisJICovCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2tiLT5sZW4pKQorCQlnb3RvIGVycjsKKworCWlmIChwcm90byA9PSBQUFBfQ09NUCkgeworCQlucyA9IGRldl9hbGxvY19za2IocHBwLT5tcnUgKyBQUFBfSERSTEVOKTsKKwkJaWYgKG5zID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAicHBwX2RlY29tcHJlc3NfZnJhbWU6IG5vIG1lbW9yeVxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCQkvKiB0aGUgZGVjb21wcmVzc29yIHN0aWxsIGV4cGVjdHMgdGhlIEEvQyBieXRlcyBpbiB0aGUgaGRyICovCisJCWxlbiA9IHBwcC0+cmNvbXAtPmRlY29tcHJlc3MocHBwLT5yY19zdGF0ZSwgc2tiLT5kYXRhIC0gMiwKKwkJCQlza2ItPmxlbiArIDIsIG5zLT5kYXRhLCBwcHAtPm1ydSArIFBQUF9IRFJMRU4pOworCQlpZiAobGVuIDwgMCkgeworCQkJLyogUGFzcyB0aGUgY29tcHJlc3NlZCBmcmFtZSB0byBwcHBkIGFzIGFuCisJCQkgICBlcnJvciBpbmRpY2F0aW9uLiAqLworCQkJaWYgKGxlbiA9PSBERUNPTVBfRkFUQUxFUlJPUikKKwkJCQlwcHAtPnJzdGF0ZSB8PSBTQ19EQ19GRVJST1I7CisJCQlrZnJlZV9za2IobnMpOworCQkJZ290byBlcnI7CisJCX0KKworCQlrZnJlZV9za2Ioc2tiKTsKKwkJc2tiID0gbnM7CisJCXNrYl9wdXQoc2tiLCBsZW4pOworCQlza2JfcHVsbChza2IsIDIpOwkvKiBwdWxsIG9mZiB0aGUgQS9DIGJ5dGVzICovCisKKwl9IGVsc2UgeworCQkvKiBVbmNvbXByZXNzZWQgZnJhbWUgLSBwYXNzIHRvIGRlY29tcHJlc3NvciBzbyBpdAorCQkgICBjYW4gdXBkYXRlIGl0cyBkaWN0aW9uYXJ5IGlmIG5lY2Vzc2FyeS4gKi8KKwkJaWYgKHBwcC0+cmNvbXAtPmluY29tcCkKKwkJCXBwcC0+cmNvbXAtPmluY29tcChwcHAtPnJjX3N0YXRlLCBza2ItPmRhdGEgLSAyLAorCQkJCQkgICBza2ItPmxlbiArIDIpOworCX0KKworCXJldHVybiBza2I7CisKKyBlcnI6CisJcHBwLT5yc3RhdGUgfD0gU0NfRENfRVJST1I7CisJcHBwX3JlY2VpdmVfZXJyb3IocHBwKTsKKwlyZXR1cm4gc2tiOworfQorCisjaWZkZWYgQ09ORklHX1BQUF9NVUxUSUxJTksKKy8qCisgKiBSZWNlaXZlIGEgbXVsdGlsaW5rIGZyYW1lLgorICogV2UgcHV0IGl0IG9uIHRoZSByZWNvbnN0cnVjdGlvbiBxdWV1ZSBhbmQgdGhlbiBwdWxsIG9mZgorICogYXMgbWFueSBjb21wbGV0ZWQgZnJhbWVzIGFzIHdlIGNhbi4KKyAqLworc3RhdGljIHZvaWQKK3BwcF9yZWNlaXZlX21wX2ZyYW1lKHN0cnVjdCBwcHAgKnBwcCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNoYW5uZWwgKnBjaCkKK3sKKwl1MzIgbWFzaywgc2VxOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJaW50IG1waGRybGVuID0gKHBwcC0+ZmxhZ3MgJiBTQ19NUF9TSE9SVFNFUSk/IE1QSERSTEVOX1NTTjogTVBIRFJMRU47CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBtcGhkcmxlbiArIDEpIHx8IHBwcC0+bXJydSA9PSAwKQorCQlnb3RvIGVycjsJCS8qIG5vIGdvb2QsIHRocm93IGl0IGF3YXkgKi8KKworCS8qIERlY29kZSBzZXF1ZW5jZSBudW1iZXIgYW5kIGJlZ2luL2VuZCBiaXRzICovCisJaWYgKHBwcC0+ZmxhZ3MgJiBTQ19NUF9TSE9SVFNFUSkgeworCQlzZXEgPSAoKHNrYi0+ZGF0YVsyXSAmIDB4MGYpIDw8IDgpIHwgc2tiLT5kYXRhWzNdOworCQltYXNrID0gMHhmZmY7CisJfSBlbHNlIHsKKwkJc2VxID0gKHNrYi0+ZGF0YVszXSA8PCAxNikgfCAoc2tiLT5kYXRhWzRdIDw8IDgpfCBza2ItPmRhdGFbNV07CisJCW1hc2sgPSAweGZmZmZmZjsKKwl9CisJc2tiLT5CRWJpdHMgPSBza2ItPmRhdGFbMl07CisJc2tiX3B1bGwoc2tiLCBtcGhkcmxlbik7CS8qIHB1bGwgb2ZmIFBQUCBhbmQgTVAgaGVhZGVycyAqLworCisJLyoKKwkgKiBEbyBwcm90b2NvbCBJRCBkZWNvbXByZXNzaW9uIG9uIHRoZSBmaXJzdCBmcmFnbWVudCBvZiBlYWNoIHBhY2tldC4KKwkgKi8KKwlpZiAoKHNrYi0+QkViaXRzICYgQikgJiYgKHNrYi0+ZGF0YVswXSAmIDEpKQorCQkqc2tiX3B1c2goc2tiLCAxKSA9IDA7CisKKwkvKgorCSAqIEV4cGFuZCBzZXF1ZW5jZSBudW1iZXIgdG8gMzIgYml0cywgbWFraW5nIGl0IGFzIGNsb3NlCisJICogYXMgcG9zc2libGUgdG8gcHBwLT5taW5zZXEuCisJICovCisJc2VxIHw9IHBwcC0+bWluc2VxICYgfm1hc2s7CisJaWYgKChpbnQpKHBwcC0+bWluc2VxIC0gc2VxKSA+IChpbnQpKG1hc2sgPj4gMSkpCisJCXNlcSArPSBtYXNrICsgMTsKKwllbHNlIGlmICgoaW50KShzZXEgLSBwcHAtPm1pbnNlcSkgPiAoaW50KShtYXNrID4+IDEpKQorCQlzZXEgLT0gbWFzayArIDE7CS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwlza2ItPnNlcXVlbmNlID0gc2VxOworCXBjaC0+bGFzdHNlcSA9IHNlcTsKKworCS8qCisJICogSWYgdGhpcyBwYWNrZXQgY29tZXMgYmVmb3JlIHRoZSBuZXh0IG9uZSB3ZSB3ZXJlIGV4cGVjdGluZywKKwkgKiBkcm9wIGl0LgorCSAqLworCWlmIChzZXFfYmVmb3JlKHNlcSwgcHBwLT5uZXh0c2VxKSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJKytwcHAtPnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCXBwcF9yZWNlaXZlX2Vycm9yKHBwcCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFJlZXZhbHVhdGUgbWluc2VxLCB0aGUgbWluaW11bSBvdmVyIGFsbCBjaGFubmVscyBvZiB0aGUKKwkgKiBsYXN0IHNlcXVlbmNlIG51bWJlciByZWNlaXZlZCBvbiBlYWNoIGNoYW5uZWwuICBCZWNhdXNlIG9mCisJICogdGhlIGluY3JlYXNpbmcgc2VxdWVuY2UgbnVtYmVyIHJ1bGUsIHdlIGtub3cgdGhhdCBhbnkgZnJhZ21lbnQKKwkgKiBiZWZvcmUgYG1pbnNlcScgd2hpY2ggaGFzbid0IGFycml2ZWQgaXMgbmV2ZXIgZ29pbmcgdG8gYXJyaXZlLgorCSAqIFRoZSBsaXN0IG9mIGNoYW5uZWxzIGNhbid0IGNoYW5nZSBiZWNhdXNlIHdlIGhhdmUgdGhlIHJlY2VpdmUKKwkgKiBzaWRlIG9mIHRoZSBwcHAgdW5pdCBsb2NrZWQuCisJICovCisJZm9yIChsID0gcHBwLT5jaGFubmVscy5uZXh0OyBsICE9ICZwcHAtPmNoYW5uZWxzOyBsID0gbC0+bmV4dCkgeworCQlzdHJ1Y3QgY2hhbm5lbCAqY2ggPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBjaGFubmVsLCBjbGlzdCk7CisJCWlmIChzZXFfYmVmb3JlKGNoLT5sYXN0c2VxLCBzZXEpKQorCQkJc2VxID0gY2gtPmxhc3RzZXE7CisJfQorCWlmIChzZXFfYmVmb3JlKHBwcC0+bWluc2VxLCBzZXEpKQorCQlwcHAtPm1pbnNlcSA9IHNlcTsKKworCS8qIFB1dCB0aGUgZnJhZ21lbnQgb24gdGhlIHJlY29uc3RydWN0aW9uIHF1ZXVlICovCisJcHBwX21wX2luc2VydChwcHAsIHNrYik7CisKKwkvKiBJZiB0aGUgcXVldWUgaXMgZ2V0dGluZyBsb25nLCBkb24ndCB3YWl0IGFueSBsb25nZXIgZm9yIHBhY2tldHMKKwkgICBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBxdWV1ZS4gKi8KKwlpZiAoc2tiX3F1ZXVlX2xlbigmcHBwLT5tcnEpID49IFBQUF9NUF9NQVhfUUxFTgorCSAgICAmJiBzZXFfYmVmb3JlKHBwcC0+bWluc2VxLCBwcHAtPm1ycS5uZXh0LT5zZXF1ZW5jZSkpCisJCXBwcC0+bWluc2VxID0gcHBwLT5tcnEubmV4dC0+c2VxdWVuY2U7CisKKwkvKiBQdWxsIGNvbXBsZXRlZCBwYWNrZXRzIG9mZiB0aGUgcXVldWUgYW5kIHJlY2VpdmUgdGhlbS4gKi8KKwl3aGlsZSAoKHNrYiA9IHBwcF9tcF9yZWNvbnN0cnVjdChwcHApKSAhPSAwKQorCQlwcHBfcmVjZWl2ZV9ub25tcF9mcmFtZShwcHAsIHNrYik7CisKKwlyZXR1cm47CisKKyBlcnI6CisJa2ZyZWVfc2tiKHNrYik7CisJcHBwX3JlY2VpdmVfZXJyb3IocHBwKTsKK30KKworLyoKKyAqIEluc2VydCBhIGZyYWdtZW50IG9uIHRoZSBNUCByZWNvbnN0cnVjdGlvbiBxdWV1ZS4KKyAqIFRoZSBxdWV1ZSBpcyBvcmRlcmVkIGJ5IGluY3JlYXNpbmcgc2VxdWVuY2UgbnVtYmVyLgorICovCitzdGF0aWMgdm9pZAorcHBwX21wX2luc2VydChzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnA7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCA9ICZwcHAtPm1ycTsKKwl1MzIgc2VxID0gc2tiLT5zZXF1ZW5jZTsKKworCS8qIE4uQi4gd2UgZG9uJ3QgbmVlZCB0byBsb2NrIHRoZSBsaXN0IGxvY2sgYmVjYXVzZSB3ZSBoYXZlIHRoZQorCSAgIHBwcCB1bml0IHJlY2VpdmUtc2lkZSBsb2NrLiAqLworCWZvciAocCA9IGxpc3QtPm5leHQ7IHAgIT0gKHN0cnVjdCBza19idWZmICopbGlzdDsgcCA9IHAtPm5leHQpCisJCWlmIChzZXFfYmVmb3JlKHNlcSwgcC0+c2VxdWVuY2UpKQorCQkJYnJlYWs7CisJX19za2JfaW5zZXJ0KHNrYiwgcC0+cHJldiwgcCwgbGlzdCk7Cit9CisKKy8qCisgKiBSZWNvbnN0cnVjdCBhIHBhY2tldCBmcm9tIHRoZSBNUCBmcmFnbWVudCBxdWV1ZS4KKyAqIFdlIGdvIHRocm91Z2ggaW5jcmVhc2luZyBzZXF1ZW5jZSBudW1iZXJzIHVudGlsIHdlIGZpbmQgYQorICogY29tcGxldGUgcGFja2V0LCBvciB3ZSBnZXQgdG8gdGhlIHNlcXVlbmNlIG51bWJlciBmb3IgYSBmcmFnbWVudAorICogd2hpY2ggaGFzbid0IGFycml2ZWQgYnV0IG1pZ2h0IHN0aWxsIGRvIHNvLgorICovCitzdHJ1Y3Qgc2tfYnVmZiAqCitwcHBfbXBfcmVjb25zdHJ1Y3Qoc3RydWN0IHBwcCAqcHBwKQoreworCXUzMiBzZXEgPSBwcHAtPm5leHRzZXE7CisJdTMyIG1pbnNlcSA9IHBwcC0+bWluc2VxOworCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QgPSAmcHBwLT5tcnE7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpuZXh0OworCXN0cnVjdCBza19idWZmICpoZWFkLCAqdGFpbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgbG9zdCA9IDAsIGxlbiA9IDA7CisKKwlpZiAocHBwLT5tcnJ1ID09IDApCS8qIGRvIG5vdGhpbmcgdW50aWwgbXJydSBpcyBzZXQgKi8KKwkJcmV0dXJuIE5VTEw7CisJaGVhZCA9IGxpc3QtPm5leHQ7CisJdGFpbCA9IE5VTEw7CisJZm9yIChwID0gaGVhZDsgcCAhPSAoc3RydWN0IHNrX2J1ZmYgKikgbGlzdDsgcCA9IG5leHQpIHsKKwkJbmV4dCA9IHAtPm5leHQ7CisJCWlmIChzZXFfYmVmb3JlKHAtPnNlcXVlbmNlLCBzZXEpKSB7CisJCQkvKiB0aGlzIGNhbid0IGhhcHBlbiwgYW55d2F5IGlnbm9yZSB0aGUgc2tiICovCisJCQlwcmludGsoS0VSTl9FUlIgInBwcF9tcF9yZWNvbnN0cnVjdCBiYWQgc2VxICV1IDwgJXVcbiIsCisJCQkgICAgICAgcC0+c2VxdWVuY2UsIHNlcSk7CisJCQloZWFkID0gbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChwLT5zZXF1ZW5jZSAhPSBzZXEpIHsKKwkJCS8qIEZyYWdtZW50IGBzZXEnIGlzIG1pc3NpbmcuICBJZiBpdCBpcyBhZnRlcgorCQkJICAgbWluc2VxLCBpdCBtaWdodCBhcnJpdmUgbGF0ZXIsIHNvIHN0b3AgaGVyZS4gKi8KKwkJCWlmIChzZXFfYWZ0ZXIoc2VxLCBtaW5zZXEpKQorCQkJCWJyZWFrOworCQkJLyogRnJhZ21lbnQgYHNlcScgaXMgbG9zdCwga2VlcCBnb2luZy4gKi8KKwkJCWxvc3QgPSAxOworCQkJc2VxID0gc2VxX2JlZm9yZShtaW5zZXEsIHAtPnNlcXVlbmNlKT8KKwkJCQltaW5zZXEgKyAxOiBwLT5zZXF1ZW5jZTsKKwkJCW5leHQgPSBwOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBhbGwgdGhlIGZyYWdtZW50cyBmcm9tCisJCSAqIHBwcC0+bmV4dHNlcSB0byBzZXEgYXJlIGVpdGhlciBwcmVzZW50IG9yIGxvc3QuCisJCSAqIEFsc28sIHRoZXJlIGFyZSBubyBjb21wbGV0ZSBwYWNrZXRzIGluIHRoZSBxdWV1ZQorCQkgKiB0aGF0IGhhdmUgbm8gbWlzc2luZyBmcmFnbWVudHMgYW5kIGVuZCBiZWZvcmUgdGhpcworCQkgKiBmcmFnbWVudC4KKwkJICovCisKKwkJLyogQiBiaXQgc2V0IGluZGljYXRlcyB0aGlzIGZyYWdtZW50IHN0YXJ0cyBhIHBhY2tldCAqLworCQlpZiAocC0+QkViaXRzICYgQikgeworCQkJaGVhZCA9IHA7CisJCQlsb3N0ID0gMDsKKwkJCWxlbiA9IDA7CisJCX0KKworCQlsZW4gKz0gcC0+bGVuOworCisJCS8qIEdvdCBhIGNvbXBsZXRlIHBhY2tldCB5ZXQ/ICovCisJCWlmIChsb3N0ID09IDAgJiYgKHAtPkJFYml0cyAmIEUpICYmIChoZWFkLT5CRWJpdHMgJiBCKSkgeworCQkJaWYgKGxlbiA+IHBwcC0+bXJydSArIDIpIHsKKwkJCQkrK3BwcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiUFBQOiByZWNvbnN0cnVjdGVkIHBhY2tldCIKKwkJCQkgICAgICAgIiBpcyB0b28gbG9uZyAoJWQpXG4iLCBsZW4pOworCQkJfSBlbHNlIGlmIChwID09IGhlYWQpIHsKKwkJCQkvKiBmcmFnbWVudCBpcyBjb21wbGV0ZSBwYWNrZXQgLSByZXVzZSBza2IgKi8KKwkJCQl0YWlsID0gcDsKKwkJCQlza2IgPSBza2JfZ2V0KHApOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmICgoc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pKSA9PSBOVUxMKSB7CisJCQkJKytwcHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnM7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlBQUDogbm8gbWVtb3J5IGZvciAiCisJCQkJICAgICAgICJyZWNvbnN0cnVjdGVkIHBhY2tldCIpOworCQkJfSBlbHNlIHsKKwkJCQl0YWlsID0gcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBwcC0+bmV4dHNlcSA9IHNlcSArIDE7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGlzIGlzIHRoZSBlbmRpbmcgZnJhZ21lbnQgb2YgYSBwYWNrZXQsCisJCSAqIGFuZCB3ZSBoYXZlbid0IGZvdW5kIGEgY29tcGxldGUgdmFsaWQgcGFja2V0IHlldCwKKwkJICogd2UgY2FuIGRpc2NhcmQgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIGZyYWdtZW50LgorCQkgKi8KKwkJaWYgKHAtPkJFYml0cyAmIEUpCisJCQloZWFkID0gbmV4dDsKKworCQkrK3NlcTsKKwl9CisKKwkvKiBJZiB3ZSBoYXZlIGEgY29tcGxldGUgcGFja2V0LCBjb3B5IGl0IGFsbCBpbnRvIG9uZSBza2IuICovCisJaWYgKHRhaWwgIT0gTlVMTCkgeworCQkvKiBJZiB3ZSBoYXZlIGRpc2NhcmRlZCBhbnkgZnJhZ21lbnRzLAorCQkgICBzaWduYWwgYSByZWNlaXZlIGVycm9yLiAqLworCQlpZiAoaGVhZC0+c2VxdWVuY2UgIT0gcHBwLT5uZXh0c2VxKSB7CisJCQlpZiAocHBwLT5kZWJ1ZyAmIDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbWlzc2VkIHBrdHMgJXUuLiV1XG4iLAorCQkJCSAgICAgICBwcHAtPm5leHRzZXEsIGhlYWQtPnNlcXVlbmNlLTEpOworCQkJKytwcHAtPnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQlwcHBfcmVjZWl2ZV9lcnJvcihwcHApOworCQl9CisKKwkJaWYgKGhlYWQgIT0gdGFpbCkKKwkJCS8qIGNvcHkgdG8gYSBzaW5nbGUgc2tiICovCisJCQlmb3IgKHAgPSBoZWFkOyBwICE9IHRhaWwtPm5leHQ7IHAgPSBwLT5uZXh0KQorCQkJCXNrYl9jb3B5X2JpdHMocCwgMCwgc2tiX3B1dChza2IsIHAtPmxlbiksIHAtPmxlbik7CisJCXBwcC0+bmV4dHNlcSA9IHRhaWwtPnNlcXVlbmNlICsgMTsKKwkJaGVhZCA9IHRhaWwtPm5leHQ7CisJfQorCisJLyogRGlzY2FyZCBhbGwgdGhlIHNrYnVmZnMgdGhhdCB3ZSBoYXZlIGNvcGllZCB0aGUgZGF0YSBvdXQgb2YKKwkgICBvciB0aGF0IHdlIGNhbid0IHVzZS4gKi8KKwl3aGlsZSAoKHAgPSBsaXN0LT5uZXh0KSAhPSBoZWFkKSB7CisJCV9fc2tiX3VubGluayhwLCBsaXN0KTsKKwkJa2ZyZWVfc2tiKHApOworCX0KKworCXJldHVybiBza2I7Cit9CisjZW5kaWYgLyogQ09ORklHX1BQUF9NVUxUSUxJTksgKi8KKworLyoKKyAqIENoYW5uZWwgaW50ZXJmYWNlLgorICovCisKKy8qCisgKiBDcmVhdGUgYSBuZXcsIHVuYXR0YWNoZWQgcHBwIGNoYW5uZWwuCisgKi8KK2ludAorcHBwX3JlZ2lzdGVyX2NoYW5uZWwoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBjaGFubmVsICpwY2g7CisKKwlwY2ggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbm5lbCksIEdGUF9LRVJORUwpOworCWlmIChwY2ggPT0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHBjaCwgMCwgc2l6ZW9mKHN0cnVjdCBjaGFubmVsKSk7CisJcGNoLT5wcHAgPSBOVUxMOworCXBjaC0+Y2hhbiA9IGNoYW47CisJY2hhbi0+cHBwID0gcGNoOworCWluaXRfcHBwX2ZpbGUoJnBjaC0+ZmlsZSwgQ0hBTk5FTCk7CisJcGNoLT5maWxlLmhkcmxlbiA9IGNoYW4tPmhkcmxlbjsKKyNpZmRlZiBDT05GSUdfUFBQX01VTFRJTElOSworCXBjaC0+bGFzdHNlcSA9IC0xOworI2VuZGlmIC8qIENPTkZJR19QUFBfTVVMVElMSU5LICovCisJaW5pdF9yd3NlbSgmcGNoLT5jaGFuX3NlbSk7CisJc3Bpbl9sb2NrX2luaXQoJnBjaC0+ZG93bmwpOworCXJ3bG9ja19pbml0KCZwY2gtPnVwbCk7CisJc3Bpbl9sb2NrX2JoKCZhbGxfY2hhbm5lbHNfbG9jayk7CisJcGNoLT5maWxlLmluZGV4ID0gKytsYXN0X2NoYW5uZWxfaW5kZXg7CisJbGlzdF9hZGQoJnBjaC0+bGlzdCwgJm5ld19jaGFubmVscyk7CisJYXRvbWljX2luYygmY2hhbm5lbF9jb3VudCk7CisJc3Bpbl91bmxvY2tfYmgoJmFsbF9jaGFubmVsc19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgaW5kZXggb2YgYSBjaGFubmVsLgorICovCitpbnQgcHBwX2NoYW5uZWxfaW5kZXgoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBjaGFubmVsICpwY2ggPSBjaGFuLT5wcHA7CisKKwlpZiAocGNoICE9IDApCisJCXJldHVybiBwY2gtPmZpbGUuaW5kZXg7CisJcmV0dXJuIC0xOworfQorCisvKgorICogUmV0dXJuIHRoZSBQUFAgdW5pdCBudW1iZXIgdG8gd2hpY2ggYSBjaGFubmVsIGlzIGNvbm5lY3RlZC4KKyAqLworaW50IHBwcF91bml0X251bWJlcihzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGNoYW5uZWwgKnBjaCA9IGNoYW4tPnBwcDsKKwlpbnQgdW5pdCA9IC0xOworCisJaWYgKHBjaCAhPSAwKSB7CisJCXJlYWRfbG9ja19iaCgmcGNoLT51cGwpOworCQlpZiAocGNoLT5wcHAgIT0gMCkKKwkJCXVuaXQgPSBwY2gtPnBwcC0+ZmlsZS5pbmRleDsKKwkJcmVhZF91bmxvY2tfYmgoJnBjaC0+dXBsKTsKKwl9CisJcmV0dXJuIHVuaXQ7Cit9CisKKy8qCisgKiBEaXNjb25uZWN0IGEgY2hhbm5lbCBmcm9tIHRoZSBnZW5lcmljIGxheWVyLgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQuCisgKi8KK3ZvaWQKK3BwcF91bnJlZ2lzdGVyX2NoYW5uZWwoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBjaGFubmVsICpwY2ggPSBjaGFuLT5wcHA7CisKKwlpZiAocGNoID09IDApCisJCXJldHVybjsJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwljaGFuLT5wcHAgPSBOVUxMOworCisJLyoKKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYXZlIHJldHVybmVkIGZyb20gYW55IGNhbGxzIGludG8gdGhlCisJICogdGhlIGNoYW5uZWwncyBzdGFydF94bWl0IG9yIGlvY3RsIHJvdXRpbmUgYmVmb3JlIHdlIHByb2NlZWQuCisJICovCisJZG93bl93cml0ZSgmcGNoLT5jaGFuX3NlbSk7CisJc3Bpbl9sb2NrX2JoKCZwY2gtPmRvd25sKTsKKwlwY2gtPmNoYW4gPSBOVUxMOworCXNwaW5fdW5sb2NrX2JoKCZwY2gtPmRvd25sKTsKKwl1cF93cml0ZSgmcGNoLT5jaGFuX3NlbSk7CisJcHBwX2Rpc2Nvbm5lY3RfY2hhbm5lbChwY2gpOworCXNwaW5fbG9ja19iaCgmYWxsX2NoYW5uZWxzX2xvY2spOworCWxpc3RfZGVsKCZwY2gtPmxpc3QpOworCXNwaW5fdW5sb2NrX2JoKCZhbGxfY2hhbm5lbHNfbG9jayk7CisJcGNoLT5maWxlLmRlYWQgPSAxOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGNoLT5maWxlLnJ3YWl0KTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGNoLT5maWxlLnJlZmNudCkpCisJCXBwcF9kZXN0cm95X2NoYW5uZWwocGNoKTsKK30KKworLyoKKyAqIENhbGxiYWNrIGZyb20gYSBjaGFubmVsIHdoZW4gaXQgY2FuIGFjY2VwdCBtb3JlIHRvIHRyYW5zbWl0LgorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGF0IEJIL3NvZnRpcnEgbGV2ZWwsIG5vdCBpbnRlcnJ1cHQgbGV2ZWwuCisgKi8KK3ZvaWQKK3BwcF9vdXRwdXRfd2FrZXVwKHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgY2hhbm5lbCAqcGNoID0gY2hhbi0+cHBwOworCisJaWYgKHBjaCA9PSAwKQorCQlyZXR1cm47CisJcHBwX2NoYW5uZWxfcHVzaChwY2gpOworfQorCisvKgorICogQ29tcHJlc3Npb24gY29udHJvbC4KKyAqLworCisvKiBQcm9jZXNzIHRoZSBQUFBJT0NTQ09NUFJFU1MgaW9jdGwuICovCitzdGF0aWMgaW50CitwcHBfc2V0X2NvbXByZXNzKHN0cnVjdCBwcHAgKnBwcCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgY29tcHJlc3NvciAqY3AsICpvY29tcDsKKwlzdHJ1Y3QgcHBwX29wdGlvbl9kYXRhIGRhdGE7CisJdm9pZCAqc3RhdGUsICpvc3RhdGU7CisJdW5zaWduZWQgY2hhciBjY3Bfb3B0aW9uW0NDUF9NQVhfT1BUSU9OX0xFTkdUSF07CisKKwllcnIgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKGRhdGEpKQorCSAgICB8fCAoZGF0YS5sZW5ndGggPD0gQ0NQX01BWF9PUFRJT05fTEVOR1RICisJCSYmIGNvcHlfZnJvbV91c2VyKGNjcF9vcHRpb24sICh2b2lkIF9fdXNlciAqKSBkYXRhLnB0ciwgZGF0YS5sZW5ndGgpKSkKKwkJZ290byBvdXQ7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAoZGF0YS5sZW5ndGggPiBDQ1BfTUFYX09QVElPTl9MRU5HVEgKKwkgICAgfHwgY2NwX29wdGlvblsxXSA8IDIgfHwgY2NwX29wdGlvblsxXSA+IGRhdGEubGVuZ3RoKQorCQlnb3RvIG91dDsKKworCWNwID0gZmluZF9jb21wcmVzc29yKGNjcF9vcHRpb25bMF0pOworI2lmZGVmIENPTkZJR19LTU9ECisJaWYgKGNwID09IDApIHsKKwkJcmVxdWVzdF9tb2R1bGUoInBwcC1jb21wcmVzcy0lZCIsIGNjcF9vcHRpb25bMF0pOworCQljcCA9IGZpbmRfY29tcHJlc3NvcihjY3Bfb3B0aW9uWzBdKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX0tNT0QgKi8KKwlpZiAoY3AgPT0gMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRU5PQlVGUzsKKwlpZiAoZGF0YS50cmFuc21pdCkgeworCQlzdGF0ZSA9IGNwLT5jb21wX2FsbG9jKGNjcF9vcHRpb24sIGRhdGEubGVuZ3RoKTsKKwkJaWYgKHN0YXRlICE9IDApIHsKKwkJCXBwcF94bWl0X2xvY2socHBwKTsKKwkJCXBwcC0+eHN0YXRlICY9IH5TQ19DT01QX1JVTjsKKwkJCW9jb21wID0gcHBwLT54Y29tcDsKKwkJCW9zdGF0ZSA9IHBwcC0+eGNfc3RhdGU7CisJCQlwcHAtPnhjb21wID0gY3A7CisJCQlwcHAtPnhjX3N0YXRlID0gc3RhdGU7CisJCQlwcHBfeG1pdF91bmxvY2socHBwKTsKKwkJCWlmIChvc3RhdGUgIT0gMCkgeworCQkJCW9jb21wLT5jb21wX2ZyZWUob3N0YXRlKTsKKwkJCQltb2R1bGVfcHV0KG9jb21wLT5vd25lcik7CisJCQl9CisJCQllcnIgPSAwOworCQl9IGVsc2UKKwkJCW1vZHVsZV9wdXQoY3AtPm93bmVyKTsKKworCX0gZWxzZSB7CisJCXN0YXRlID0gY3AtPmRlY29tcF9hbGxvYyhjY3Bfb3B0aW9uLCBkYXRhLmxlbmd0aCk7CisJCWlmIChzdGF0ZSAhPSAwKSB7CisJCQlwcHBfcmVjdl9sb2NrKHBwcCk7CisJCQlwcHAtPnJzdGF0ZSAmPSB+U0NfREVDT01QX1JVTjsKKwkJCW9jb21wID0gcHBwLT5yY29tcDsKKwkJCW9zdGF0ZSA9IHBwcC0+cmNfc3RhdGU7CisJCQlwcHAtPnJjb21wID0gY3A7CisJCQlwcHAtPnJjX3N0YXRlID0gc3RhdGU7CisJCQlwcHBfcmVjdl91bmxvY2socHBwKTsKKwkJCWlmIChvc3RhdGUgIT0gMCkgeworCQkJCW9jb21wLT5kZWNvbXBfZnJlZShvc3RhdGUpOworCQkJCW1vZHVsZV9wdXQob2NvbXAtPm93bmVyKTsKKwkJCX0KKwkJCWVyciA9IDA7CisJCX0gZWxzZQorCQkJbW9kdWxlX3B1dChjcC0+b3duZXIpOworCX0KKworIG91dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogTG9vayBhdCBhIENDUCBwYWNrZXQgYW5kIHVwZGF0ZSBvdXIgc3RhdGUgYWNjb3JkaW5nbHkuCisgKiBXZSBhc3N1bWUgdGhlIGNhbGxlciBoYXMgdGhlIHhtaXQgb3IgcmVjdiBwYXRoIGxvY2tlZC4KKyAqLworc3RhdGljIHZvaWQKK3BwcF9jY3BfcGVlayhzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IsIGludCBpbmJvdW5kKQoreworCXVuc2lnbmVkIGNoYXIgKmRwOworCWludCBsZW47CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBDQ1BfSERSTEVOICsgMikpCisJCXJldHVybjsJLyogbm8gaGVhZGVyICovCisJZHAgPSBza2ItPmRhdGEgKyAyOworCisJc3dpdGNoIChDQ1BfQ09ERShkcCkpIHsKKwljYXNlIENDUF9DT05GUkVROgorCisJCS8qIEEgQ29uZlJlcSBzdGFydHMgbmVnb3RpYXRpb24gb2YgY29tcHJlc3Npb24gCisJCSAqIGluIG9uZSBkaXJlY3Rpb24gb2YgdHJhbnNtaXNzaW9uLAorCQkgKiBhbmQgaGVuY2UgYnJpbmdzIGl0IGRvd24uLi5idXQgd2hpY2ggd2F5PworCQkgKgorCQkgKiBSZW1lbWJlcjoKKwkJICogQSBDb25mUmVxIGluZGljYXRlcyB3aGF0IHRoZSBzZW5kZXIgd291bGQgbGlrZSB0byByZWNlaXZlCisJCSAqLworCQlpZihpbmJvdW5kKQorCQkJLyogSGUgaXMgcHJvcG9zaW5nIHdoYXQgSSBzaG91bGQgc2VuZCAqLworCQkJcHBwLT54c3RhdGUgJj0gflNDX0NPTVBfUlVOOworCQllbHNlCQorCQkJLyogSSBhbSBwcm9wb3NpbmcgdG8gd2hhdCBoZSBzaG91bGQgc2VuZCAqLworCQkJcHBwLT5yc3RhdGUgJj0gflNDX0RFQ09NUF9SVU47CisJCQorCQlicmVhazsKKwkJCisJY2FzZSBDQ1BfVEVSTVJFUToKKwljYXNlIENDUF9URVJNQUNLOgorCQkvKgorCQkgKiBDQ1AgaXMgZ29pbmcgZG93biwgYm90aCBkaXJlY3Rpb25zIG9mIHRyYW5zbWlzc2lvbiAKKwkJICovCisJCXBwcC0+cnN0YXRlICY9IH5TQ19ERUNPTVBfUlVOOworCQlwcHAtPnhzdGF0ZSAmPSB+U0NfQ09NUF9SVU47CisJCWJyZWFrOworCisJY2FzZSBDQ1BfQ09ORkFDSzoKKwkJaWYgKChwcHAtPmZsYWdzICYgKFNDX0NDUF9PUEVOIHwgU0NfQ0NQX1VQKSkgIT0gU0NfQ0NQX09QRU4pCisJCQlicmVhazsKKwkJbGVuID0gQ0NQX0xFTkdUSChkcCk7CisJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGxlbiArIDIpKQorCQkJcmV0dXJuOwkJLyogdG9vIHNob3J0ICovCisJCWRwICs9IENDUF9IRFJMRU47CisJCWxlbiAtPSBDQ1BfSERSTEVOOworCQlpZiAobGVuIDwgQ0NQX09QVF9NSU5MRU4gfHwgbGVuIDwgQ0NQX09QVF9MRU5HVEgoZHApKQorCQkJYnJlYWs7CisJCWlmIChpbmJvdW5kKSB7CisJCQkvKiB3ZSB3aWxsIHN0YXJ0IHJlY2VpdmluZyBjb21wcmVzc2VkIHBhY2tldHMgKi8KKwkJCWlmIChwcHAtPnJjX3N0YXRlID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAocHBwLT5yY29tcC0+ZGVjb21wX2luaXQocHBwLT5yY19zdGF0ZSwgZHAsIGxlbiwKKwkJCQkJcHBwLT5maWxlLmluZGV4LCAwLCBwcHAtPm1ydSwgcHBwLT5kZWJ1ZykpIHsKKwkJCQlwcHAtPnJzdGF0ZSB8PSBTQ19ERUNPTVBfUlVOOworCQkJCXBwcC0+cnN0YXRlICY9IH4oU0NfRENfRVJST1IgfCBTQ19EQ19GRVJST1IpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogd2Ugd2lsbCBzb29uIHN0YXJ0IHNlbmRpbmcgY29tcHJlc3NlZCBwYWNrZXRzICovCisJCQlpZiAocHBwLT54Y19zdGF0ZSA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKHBwcC0+eGNvbXAtPmNvbXBfaW5pdChwcHAtPnhjX3N0YXRlLCBkcCwgbGVuLAorCQkJCQlwcHAtPmZpbGUuaW5kZXgsIDAsIHBwcC0+ZGVidWcpKQorCQkJCXBwcC0+eHN0YXRlIHw9IFNDX0NPTVBfUlVOOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDQ1BfUkVTRVRBQ0s6CisJCS8qIHJlc2V0IHRoZSBbZGVdY29tcHJlc3NvciAqLworCQlpZiAoKHBwcC0+ZmxhZ3MgJiBTQ19DQ1BfVVApID09IDApCisJCQlicmVhazsKKwkJaWYgKGluYm91bmQpIHsKKwkJCWlmIChwcHAtPnJjX3N0YXRlICYmIChwcHAtPnJzdGF0ZSAmIFNDX0RFQ09NUF9SVU4pKSB7CisJCQkJcHBwLT5yY29tcC0+ZGVjb21wX3Jlc2V0KHBwcC0+cmNfc3RhdGUpOworCQkJCXBwcC0+cnN0YXRlICY9IH5TQ19EQ19FUlJPUjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwcHAtPnhjX3N0YXRlICYmIChwcHAtPnhzdGF0ZSAmIFNDX0NPTVBfUlVOKSkKKwkJCQlwcHAtPnhjb21wLT5jb21wX3Jlc2V0KHBwcC0+eGNfc3RhdGUpOworCQl9CisJCWJyZWFrOworCX0KK30KKworLyogRnJlZSB1cCBjb21wcmVzc2lvbiByZXNvdXJjZXMuICovCitzdGF0aWMgdm9pZAorcHBwX2NjcF9jbG9zZWQoc3RydWN0IHBwcCAqcHBwKQoreworCXZvaWQgKnhzdGF0ZSwgKnJzdGF0ZTsKKwlzdHJ1Y3QgY29tcHJlc3NvciAqeGNvbXAsICpyY29tcDsKKworCXBwcF9sb2NrKHBwcCk7CisJcHBwLT5mbGFncyAmPSB+KFNDX0NDUF9PUEVOIHwgU0NfQ0NQX1VQKTsKKwlwcHAtPnhzdGF0ZSA9IDA7CisJeGNvbXAgPSBwcHAtPnhjb21wOworCXhzdGF0ZSA9IHBwcC0+eGNfc3RhdGU7CisJcHBwLT54Y19zdGF0ZSA9IE5VTEw7CisJcHBwLT5yc3RhdGUgPSAwOworCXJjb21wID0gcHBwLT5yY29tcDsKKwlyc3RhdGUgPSBwcHAtPnJjX3N0YXRlOworCXBwcC0+cmNfc3RhdGUgPSBOVUxMOworCXBwcF91bmxvY2socHBwKTsKKworCWlmICh4c3RhdGUpIHsKKwkJeGNvbXAtPmNvbXBfZnJlZSh4c3RhdGUpOworCQltb2R1bGVfcHV0KHhjb21wLT5vd25lcik7CisJfQorCWlmIChyc3RhdGUpIHsKKwkJcmNvbXAtPmRlY29tcF9mcmVlKHJzdGF0ZSk7CisJCW1vZHVsZV9wdXQocmNvbXAtPm93bmVyKTsKKwl9Cit9CisKKy8qIExpc3Qgb2YgY29tcHJlc3NvcnMuICovCitzdGF0aWMgTElTVF9IRUFEKGNvbXByZXNzb3JfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNvbXByZXNzb3JfbGlzdF9sb2NrKTsKKworc3RydWN0IGNvbXByZXNzb3JfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgY29tcHJlc3NvciAqY29tcDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY29tcHJlc3Nvcl9lbnRyeSAqCitmaW5kX2NvbXBfZW50cnkoaW50IHByb3RvKQoreworCXN0cnVjdCBjb21wcmVzc29yX2VudHJ5ICpjZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gJmNvbXByZXNzb3JfbGlzdDsKKworCXdoaWxlICgobGlzdCA9IGxpc3QtPm5leHQpICE9ICZjb21wcmVzc29yX2xpc3QpIHsKKwkJY2UgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjb21wcmVzc29yX2VudHJ5LCBsaXN0KTsKKwkJaWYgKGNlLT5jb21wLT5jb21wcmVzc19wcm90byA9PSBwcm90bykKKwkJCXJldHVybiBjZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJlZ2lzdGVyIGEgY29tcHJlc3NvciAqLworaW50CitwcHBfcmVnaXN0ZXJfY29tcHJlc3NvcihzdHJ1Y3QgY29tcHJlc3NvciAqY3ApCit7CisJc3RydWN0IGNvbXByZXNzb3JfZW50cnkgKmNlOworCWludCByZXQ7CisJc3Bpbl9sb2NrKCZjb21wcmVzc29yX2xpc3RfbG9jayk7CisJcmV0ID0gLUVFWElTVDsKKwlpZiAoZmluZF9jb21wX2VudHJ5KGNwLT5jb21wcmVzc19wcm90bykgIT0gMCkKKwkJZ290byBvdXQ7CisJcmV0ID0gLUVOT01FTTsKKwljZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21wcmVzc29yX2VudHJ5KSwgR0ZQX0FUT01JQyk7CisJaWYgKGNlID09IDApCisJCWdvdG8gb3V0OworCXJldCA9IDA7CisJY2UtPmNvbXAgPSBjcDsKKwlsaXN0X2FkZCgmY2UtPmxpc3QsICZjb21wcmVzc29yX2xpc3QpOworIG91dDoKKwlzcGluX3VubG9jaygmY29tcHJlc3Nvcl9saXN0X2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qIFVucmVnaXN0ZXIgYSBjb21wcmVzc29yICovCit2b2lkCitwcHBfdW5yZWdpc3Rlcl9jb21wcmVzc29yKHN0cnVjdCBjb21wcmVzc29yICpjcCkKK3sKKwlzdHJ1Y3QgY29tcHJlc3Nvcl9lbnRyeSAqY2U7CisKKwlzcGluX2xvY2soJmNvbXByZXNzb3JfbGlzdF9sb2NrKTsKKwljZSA9IGZpbmRfY29tcF9lbnRyeShjcC0+Y29tcHJlc3NfcHJvdG8pOworCWlmIChjZSAhPSAwICYmIGNlLT5jb21wID09IGNwKSB7CisJCWxpc3RfZGVsKCZjZS0+bGlzdCk7CisJCWtmcmVlKGNlKTsKKwl9CisJc3Bpbl91bmxvY2soJmNvbXByZXNzb3JfbGlzdF9sb2NrKTsKK30KKworLyogRmluZCBhIGNvbXByZXNzb3IuICovCitzdGF0aWMgc3RydWN0IGNvbXByZXNzb3IgKgorZmluZF9jb21wcmVzc29yKGludCB0eXBlKQoreworCXN0cnVjdCBjb21wcmVzc29yX2VudHJ5ICpjZTsKKwlzdHJ1Y3QgY29tcHJlc3NvciAqY3AgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZjb21wcmVzc29yX2xpc3RfbG9jayk7CisJY2UgPSBmaW5kX2NvbXBfZW50cnkodHlwZSk7CisJaWYgKGNlICE9IDApIHsKKwkJY3AgPSBjZS0+Y29tcDsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChjcC0+b3duZXIpKQorCQkJY3AgPSBOVUxMOworCX0KKwlzcGluX3VubG9jaygmY29tcHJlc3Nvcl9saXN0X2xvY2spOworCXJldHVybiBjcDsKK30KKworLyoKKyAqIE1pc2NlbGxlbmVvdXMgc3R1ZmYuCisgKi8KKworc3RhdGljIHZvaWQKK3BwcF9nZXRfc3RhdHMoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3QgcHBwX3N0YXRzICpzdCkKK3sKKwlzdHJ1Y3Qgc2xjb21wcmVzcyAqdmogPSBwcHAtPnZqOworCisJbWVtc2V0KHN0LCAwLCBzaXplb2YoKnN0KSk7CisJc3QtPnAucHBwX2lwYWNrZXRzID0gcHBwLT5zdGF0cy5yeF9wYWNrZXRzOworCXN0LT5wLnBwcF9pZXJyb3JzID0gcHBwLT5zdGF0cy5yeF9lcnJvcnM7CisJc3QtPnAucHBwX2lieXRlcyA9IHBwcC0+c3RhdHMucnhfYnl0ZXM7CisJc3QtPnAucHBwX29wYWNrZXRzID0gcHBwLT5zdGF0cy50eF9wYWNrZXRzOworCXN0LT5wLnBwcF9vZXJyb3JzID0gcHBwLT5zdGF0cy50eF9lcnJvcnM7CisJc3QtPnAucHBwX29ieXRlcyA9IHBwcC0+c3RhdHMudHhfYnl0ZXM7CisJaWYgKHZqID09IDApCisJCXJldHVybjsKKwlzdC0+dmoudmpzX3BhY2tldHMgPSB2ai0+c2xzX29fY29tcHJlc3NlZCArIHZqLT5zbHNfb191bmNvbXByZXNzZWQ7CisJc3QtPnZqLnZqc19jb21wcmVzc2VkID0gdmotPnNsc19vX2NvbXByZXNzZWQ7CisJc3QtPnZqLnZqc19zZWFyY2hlcyA9IHZqLT5zbHNfb19zZWFyY2hlczsKKwlzdC0+dmoudmpzX21pc3NlcyA9IHZqLT5zbHNfb19taXNzZXM7CisJc3QtPnZqLnZqc19lcnJvcmluID0gdmotPnNsc19pX2Vycm9yOworCXN0LT52ai52anNfdG9zc2VkID0gdmotPnNsc19pX3Rvc3NlZDsKKwlzdC0+dmoudmpzX3VuY29tcHJlc3NlZGluID0gdmotPnNsc19pX3VuY29tcHJlc3NlZDsKKwlzdC0+dmoudmpzX2NvbXByZXNzZWRpbiA9IHZqLT5zbHNfaV9jb21wcmVzc2VkOworfQorCisvKgorICogU3R1ZmYgZm9yIGhhbmRsaW5nIHRoZSBsaXN0cyBvZiBwcHAgdW5pdHMgYW5kIGNoYW5uZWxzCisgKiBhbmQgZm9yIGluaXRpYWxpemF0aW9uLgorICovCisKKy8qCisgKiBDcmVhdGUgYSBuZXcgcHBwIGludGVyZmFjZSB1bml0LiAgRmFpbHMgaWYgaXQgY2FuJ3QgYWxsb2NhdGUgbWVtb3J5CisgKiBvciBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgdW5pdCB3aXRoIHRoZSByZXF1ZXN0ZWQgbnVtYmVyLgorICogdW5pdCA9PSAtMSBtZWFucyBhbGxvY2F0ZSBhIG5ldyBudW1iZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHBwICoKK3BwcF9jcmVhdGVfaW50ZXJmYWNlKGludCB1bml0LCBpbnQgKnJldHApCit7CisJc3RydWN0IHBwcCAqcHBwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCWludCByZXQgPSAtRU5PTUVNOworCWludCBpOworCisJcHBwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBwcCksIEdGUF9LRVJORUwpOworCWlmICghcHBwKQorCQlnb3RvIG91dDsKKwlkZXYgPSBhbGxvY19uZXRkZXYoMCwgIiIsIHBwcF9zZXR1cCk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0MTsKKwltZW1zZXQocHBwLCAwLCBzaXplb2Yoc3RydWN0IHBwcCkpOworCisJcHBwLT5tcnUgPSBQUFBfTVJVOworCWluaXRfcHBwX2ZpbGUoJnBwcC0+ZmlsZSwgSU5URVJGQUNFKTsKKwlwcHAtPmZpbGUuaGRybGVuID0gUFBQX0hEUkxFTiAtIDI7CS8qIGRvbid0IGNvdW50IHByb3RvIGJ5dGVzICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9OUDsgKytpKQorCQlwcHAtPm5wbW9kZVtpXSA9IE5QTU9ERV9QQVNTOworCUlOSVRfTElTVF9IRUFEKCZwcHAtPmNoYW5uZWxzKTsKKwlzcGluX2xvY2tfaW5pdCgmcHBwLT5ybG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnBwcC0+d2xvY2spOworI2lmZGVmIENPTkZJR19QUFBfTVVMVElMSU5LCisJcHBwLT5taW5zZXEgPSAtMTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZwcHAtPm1ycSk7CisjZW5kaWYgLyogQ09ORklHX1BQUF9NVUxUSUxJTksgKi8KKwlwcHAtPmRldiA9IGRldjsKKwlkZXYtPnByaXYgPSBwcHA7CisKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHBwcF9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gcHBwX25ldF9zdGF0czsKKwlkZXYtPmRvX2lvY3RsID0gcHBwX25ldF9pb2N0bDsKKworCXJldCA9IC1FRVhJU1Q7CisJZG93bigmYWxsX3BwcF9zZW0pOworCWlmICh1bml0IDwgMCkKKwkJdW5pdCA9IGNhcmRtYXBfZmluZF9maXJzdF9mcmVlKGFsbF9wcHBfdW5pdHMpOworCWVsc2UgaWYgKGNhcmRtYXBfZ2V0KGFsbF9wcHBfdW5pdHMsIHVuaXQpICE9IE5VTEwpCisJCWdvdG8gb3V0MjsJLyogdW5pdCBhbHJlYWR5IGV4aXN0cyAqLworCisJLyogSW5pdGlhbGl6ZSB0aGUgbmV3IHBwcCB1bml0ICovCisJcHBwLT5maWxlLmluZGV4ID0gdW5pdDsKKwlzcHJpbnRmKGRldi0+bmFtZSwgInBwcCVkIiwgdW5pdCk7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJQUFA6IGNvdWxkbid0IHJlZ2lzdGVyIGRldmljZSAlcyAoJWQpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCByZXQpOworCQlnb3RvIG91dDI7CisJfQorCisJYXRvbWljX2luYygmcHBwX3VuaXRfY291bnQpOworCWNhcmRtYXBfc2V0KCZhbGxfcHBwX3VuaXRzLCB1bml0LCBwcHApOworCXVwKCZhbGxfcHBwX3NlbSk7CisJKnJldHAgPSAwOworCXJldHVybiBwcHA7CisKK291dDI6CisJdXAoJmFsbF9wcHBfc2VtKTsKKwlmcmVlX25ldGRldihkZXYpOworb3V0MToKKwlrZnJlZShwcHApOworb3V0OgorCSpyZXRwID0gcmV0OworCXJldHVybiBOVUxMOworfQorCisvKgorICogSW5pdGlhbGl6ZSBhIHBwcF9maWxlIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQKK2luaXRfcHBwX2ZpbGUoc3RydWN0IHBwcF9maWxlICpwZiwgaW50IGtpbmQpCit7CisJcGYtPmtpbmQgPSBraW5kOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnBmLT54cSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcGYtPnJxKTsKKwlhdG9taWNfc2V0KCZwZi0+cmVmY250LCAxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwZi0+cndhaXQpOworfQorCisvKgorICogVGFrZSBkb3duIGEgcHBwIGludGVyZmFjZSB1bml0IC0gY2FsbGVkIHdoZW4gdGhlIG93bmluZyBmaWxlCisgKiAodGhlIG9uZSB0aGF0IGNyZWF0ZWQgdGhlIHVuaXQpIGlzIGNsb3NlZCBvciBkZXRhY2hlZC4KKyAqLworc3RhdGljIHZvaWQgcHBwX3NodXRkb3duX2ludGVyZmFjZShzdHJ1Y3QgcHBwICpwcHApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWRvd24oJmFsbF9wcHBfc2VtKTsKKwlwcHBfbG9jayhwcHApOworCWRldiA9IHBwcC0+ZGV2OworCXBwcC0+ZGV2ID0gTlVMTDsKKwlwcHBfdW5sb2NrKHBwcCk7CisJLyogVGhpcyB3aWxsIGNhbGwgZGV2X2Nsb3NlKCkgZm9yIHVzLiAqLworCWlmIChkZXYpIHsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisJY2FyZG1hcF9zZXQoJmFsbF9wcHBfdW5pdHMsIHBwcC0+ZmlsZS5pbmRleCwgTlVMTCk7CisJcHBwLT5maWxlLmRlYWQgPSAxOworCXBwcC0+b3duZXIgPSBOVUxMOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHBwLT5maWxlLnJ3YWl0KTsKKwl1cCgmYWxsX3BwcF9zZW0pOworfQorCisvKgorICogRnJlZSB0aGUgbWVtb3J5IHVzZWQgYnkgYSBwcHAgdW5pdC4gIFRoaXMgaXMgb25seSBjYWxsZWQgb25jZQorICogdGhlcmUgYXJlIG5vIGNoYW5uZWxzIGNvbm5lY3RlZCB0byB0aGUgdW5pdCBhbmQgbm8gZmlsZSBzdHJ1Y3RzCisgKiB0aGF0IHJlZmVyZW5jZSB0aGUgdW5pdC4KKyAqLworc3RhdGljIHZvaWQgcHBwX2Rlc3Ryb3lfaW50ZXJmYWNlKHN0cnVjdCBwcHAgKnBwcCkKK3sKKwlhdG9taWNfZGVjKCZwcHBfdW5pdF9jb3VudCk7CisKKwlpZiAoIXBwcC0+ZmlsZS5kZWFkIHx8IHBwcC0+bl9jaGFubmVscykgeworCQkvKiAiY2FuJ3QgaGFwcGVuIiAqLworCQlwcmludGsoS0VSTl9FUlIgInBwcDogZGVzdHJveWluZyBwcHAgc3RydWN0ICVwIGJ1dCBkZWFkPSVkICIKKwkJICAgICAgICJuX2NoYW5uZWxzPSVkICFcbiIsIHBwcCwgcHBwLT5maWxlLmRlYWQsCisJCSAgICAgICBwcHAtPm5fY2hhbm5lbHMpOworCQlyZXR1cm47CisJfQorCisJcHBwX2NjcF9jbG9zZWQocHBwKTsKKwlpZiAocHBwLT52aikgeworCQlzbGhjX2ZyZWUocHBwLT52aik7CisJCXBwcC0+dmogPSBOVUxMOworCX0KKwlza2JfcXVldWVfcHVyZ2UoJnBwcC0+ZmlsZS54cSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZwcHAtPmZpbGUucnEpOworI2lmZGVmIENPTkZJR19QUFBfTVVMVElMSU5LCisJc2tiX3F1ZXVlX3B1cmdlKCZwcHAtPm1ycSk7CisjZW5kaWYgLyogQ09ORklHX1BQUF9NVUxUSUxJTksgKi8KKyNpZmRlZiBDT05GSUdfUFBQX0ZJTFRFUgorCWlmIChwcHAtPnBhc3NfZmlsdGVyKSB7CisJCWtmcmVlKHBwcC0+cGFzc19maWx0ZXIpOworCQlwcHAtPnBhc3NfZmlsdGVyID0gTlVMTDsKKwl9CisJaWYgKHBwcC0+YWN0aXZlX2ZpbHRlcikgeworCQlrZnJlZShwcHAtPmFjdGl2ZV9maWx0ZXIpOworCQlwcHAtPmFjdGl2ZV9maWx0ZXIgPSBOVUxMOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUFBQX0ZJTFRFUiAqLworCisJa2ZyZWUocHBwKTsKK30KKworLyoKKyAqIExvY2F0ZSBhbiBleGlzdGluZyBwcHAgdW5pdC4KKyAqIFRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgbG9ja2VkIHRoZSBhbGxfcHBwX3NlbS4KKyAqLworc3RhdGljIHN0cnVjdCBwcHAgKgorcHBwX2ZpbmRfdW5pdChpbnQgdW5pdCkKK3sKKwlyZXR1cm4gY2FyZG1hcF9nZXQoYWxsX3BwcF91bml0cywgdW5pdCk7Cit9CisKKy8qCisgKiBMb2NhdGUgYW4gZXhpc3RpbmcgcHBwIGNoYW5uZWwuCisgKiBUaGUgY2FsbGVyIHNob3VsZCBoYXZlIGxvY2tlZCB0aGUgYWxsX2NoYW5uZWxzX2xvY2suCisgKiBGaXJzdCB3ZSBsb29rIGluIHRoZSBuZXdfY2hhbm5lbHMgbGlzdCwgdGhlbiBpbiB0aGUKKyAqIGFsbF9jaGFubmVscyBsaXN0LiAgSWYgZm91bmQgaW4gdGhlIG5ld19jaGFubmVscyBsaXN0LAorICogd2UgbW92ZSBpdCB0byB0aGUgYWxsX2NoYW5uZWxzIGxpc3QuICBUaGlzIGlzIGZvciBzcGVlZAorICogd2hlbiB3ZSBoYXZlIGEgbG90IG9mIGNoYW5uZWxzIGluIHVzZS4KKyAqLworc3RhdGljIHN0cnVjdCBjaGFubmVsICoKK3BwcF9maW5kX2NoYW5uZWwoaW50IHVuaXQpCit7CisJc3RydWN0IGNoYW5uZWwgKnBjaDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJbGlzdCA9ICZuZXdfY2hhbm5lbHM7CisJd2hpbGUgKChsaXN0ID0gbGlzdC0+bmV4dCkgIT0gJm5ld19jaGFubmVscykgeworCQlwY2ggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjaGFubmVsLCBsaXN0KTsKKwkJaWYgKHBjaC0+ZmlsZS5pbmRleCA9PSB1bml0KSB7CisJCQlsaXN0X2RlbCgmcGNoLT5saXN0KTsKKwkJCWxpc3RfYWRkKCZwY2gtPmxpc3QsICZhbGxfY2hhbm5lbHMpOworCQkJcmV0dXJuIHBjaDsKKwkJfQorCX0KKwlsaXN0ID0gJmFsbF9jaGFubmVsczsKKwl3aGlsZSAoKGxpc3QgPSBsaXN0LT5uZXh0KSAhPSAmYWxsX2NoYW5uZWxzKSB7CisJCXBjaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGNoYW5uZWwsIGxpc3QpOworCQlpZiAocGNoLT5maWxlLmluZGV4ID09IHVuaXQpCisJCQlyZXR1cm4gcGNoOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIENvbm5lY3QgYSBQUFAgY2hhbm5lbCB0byBhIFBQUCBpbnRlcmZhY2UgdW5pdC4KKyAqLworc3RhdGljIGludAorcHBwX2Nvbm5lY3RfY2hhbm5lbChzdHJ1Y3QgY2hhbm5lbCAqcGNoLCBpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgcHBwICpwcHA7CisJaW50IHJldCA9IC1FTlhJTzsKKwlpbnQgaGRybGVuOworCisJZG93bigmYWxsX3BwcF9zZW0pOworCXBwcCA9IHBwcF9maW5kX3VuaXQodW5pdCk7CisJaWYgKHBwcCA9PSAwKQorCQlnb3RvIG91dDsKKwl3cml0ZV9sb2NrX2JoKCZwY2gtPnVwbCk7CisJcmV0ID0gLUVJTlZBTDsKKwlpZiAocGNoLT5wcHAgIT0gMCkKKwkJZ290byBvdXRsOworCisJcHBwX2xvY2socHBwKTsKKwlpZiAocGNoLT5maWxlLmhkcmxlbiA+IHBwcC0+ZmlsZS5oZHJsZW4pCisJCXBwcC0+ZmlsZS5oZHJsZW4gPSBwY2gtPmZpbGUuaGRybGVuOworCWhkcmxlbiA9IHBjaC0+ZmlsZS5oZHJsZW4gKyAyOwkvKiBmb3IgcHJvdG9jb2wgYnl0ZXMgKi8KKwlpZiAocHBwLT5kZXYgJiYgaGRybGVuID4gcHBwLT5kZXYtPmhhcmRfaGVhZGVyX2xlbikKKwkJcHBwLT5kZXYtPmhhcmRfaGVhZGVyX2xlbiA9IGhkcmxlbjsKKwlsaXN0X2FkZF90YWlsKCZwY2gtPmNsaXN0LCAmcHBwLT5jaGFubmVscyk7CisJKytwcHAtPm5fY2hhbm5lbHM7CisJcGNoLT5wcHAgPSBwcHA7CisJYXRvbWljX2luYygmcHBwLT5maWxlLnJlZmNudCk7CisJcHBwX3VubG9jayhwcHApOworCXJldCA9IDA7CisKKyBvdXRsOgorCXdyaXRlX3VubG9ja19iaCgmcGNoLT51cGwpOworIG91dDoKKwl1cCgmYWxsX3BwcF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBEaXNjb25uZWN0IGEgY2hhbm5lbCBmcm9tIGl0cyBwcHAgdW5pdC4KKyAqLworc3RhdGljIGludAorcHBwX2Rpc2Nvbm5lY3RfY2hhbm5lbChzdHJ1Y3QgY2hhbm5lbCAqcGNoKQoreworCXN0cnVjdCBwcHAgKnBwcDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCXdyaXRlX2xvY2tfYmgoJnBjaC0+dXBsKTsKKwlwcHAgPSBwY2gtPnBwcDsKKwlwY2gtPnBwcCA9IE5VTEw7CisJd3JpdGVfdW5sb2NrX2JoKCZwY2gtPnVwbCk7CisJaWYgKHBwcCAhPSAwKSB7CisJCS8qIHJlbW92ZSBpdCBmcm9tIHRoZSBwcHAgdW5pdCdzIGxpc3QgKi8KKwkJcHBwX2xvY2socHBwKTsKKwkJbGlzdF9kZWwoJnBjaC0+Y2xpc3QpOworCQlpZiAoLS1wcHAtPm5fY2hhbm5lbHMgPT0gMCkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHBwLT5maWxlLnJ3YWl0KTsKKwkJcHBwX3VubG9jayhwcHApOworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcHBwLT5maWxlLnJlZmNudCkpCisJCQlwcHBfZGVzdHJveV9pbnRlcmZhY2UocHBwKTsKKwkJZXJyID0gMDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEZyZWUgdXAgdGhlIHJlc291cmNlcyB1c2VkIGJ5IGEgcHBwIGNoYW5uZWwuCisgKi8KK3N0YXRpYyB2b2lkIHBwcF9kZXN0cm95X2NoYW5uZWwoc3RydWN0IGNoYW5uZWwgKnBjaCkKK3sKKwlhdG9taWNfZGVjKCZjaGFubmVsX2NvdW50KTsKKworCWlmICghcGNoLT5maWxlLmRlYWQpIHsKKwkJLyogImNhbid0IGhhcHBlbiIgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJwcHA6IGRlc3Ryb3lpbmcgdW5kZWFkIGNoYW5uZWwgJXAgIVxuIiwKKwkJICAgICAgIHBjaCk7CisJCXJldHVybjsKKwl9CisJc2tiX3F1ZXVlX3B1cmdlKCZwY2gtPmZpbGUueHEpOworCXNrYl9xdWV1ZV9wdXJnZSgmcGNoLT5maWxlLnJxKTsKKwlrZnJlZShwY2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcHBwX2NsZWFudXAodm9pZCkKK3sKKwkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJaWYgKGF0b21pY19yZWFkKCZwcHBfdW5pdF9jb3VudCkgfHwgYXRvbWljX3JlYWQoJmNoYW5uZWxfY291bnQpKQorCQlwcmludGsoS0VSTl9FUlIgIlBQUDogcmVtb3ZpbmcgbW9kdWxlIGJ1dCB1bml0cyByZW1haW4hXG4iKTsKKwljYXJkbWFwX2Rlc3Ryb3koJmFsbF9wcHBfdW5pdHMpOworCWlmICh1bnJlZ2lzdGVyX2NocmRldihQUFBfTUFKT1IsICJwcHAiKSAhPSAwKQorCQlwcmludGsoS0VSTl9FUlIgIlBQUDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgUFBQIGRldmljZVxuIik7CisJZGV2ZnNfcmVtb3ZlKCJwcHAiKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihQUFBfTUFKT1IsIDApKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShwcHBfY2xhc3MpOworfQorCisvKgorICogQ2FyZG1hcCBpbXBsZW1lbnRhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgKmNhcmRtYXBfZ2V0KHN0cnVjdCBjYXJkbWFwICptYXAsIHVuc2lnbmVkIGludCBucikKK3sKKwlzdHJ1Y3QgY2FyZG1hcCAqcDsKKwlpbnQgaTsKKworCWZvciAocCA9IG1hcDsgcCAhPSBOVUxMOyApIHsKKwkJaWYgKChpID0gbnIgPj4gcC0+c2hpZnQpID49IENBUkRNQVBfV0lEVEgpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHAtPnNoaWZ0ID09IDApCisJCQlyZXR1cm4gcC0+cHRyW2ldOworCQluciAmPSB+KENBUkRNQVBfTUFTSyA8PCBwLT5zaGlmdCk7CisJCXAgPSBwLT5wdHJbaV07CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBjYXJkbWFwX3NldChzdHJ1Y3QgY2FyZG1hcCAqKnBtYXAsIHVuc2lnbmVkIGludCBuciwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBjYXJkbWFwICpwOworCWludCBpOworCisJcCA9ICpwbWFwOworCWlmIChwID09IE5VTEwgfHwgKG5yID4+IHAtPnNoaWZ0KSA+PSBDQVJETUFQX1dJRFRIKSB7CisJCWRvIHsKKwkJCS8qIG5lZWQgYSBuZXcgdG9wIGxldmVsICovCisJCQlzdHJ1Y3QgY2FyZG1hcCAqbnAgPSBrbWFsbG9jKHNpemVvZigqbnApLCBHRlBfS0VSTkVMKTsKKwkJCW1lbXNldChucCwgMCwgc2l6ZW9mKCpucCkpOworCQkJbnAtPnB0clswXSA9IHA7CisJCQlpZiAocCAhPSBOVUxMKSB7CisJCQkJbnAtPnNoaWZ0ID0gcC0+c2hpZnQgKyBDQVJETUFQX09SREVSOworCQkJCXAtPnBhcmVudCA9IG5wOworCQkJfSBlbHNlCisJCQkJbnAtPnNoaWZ0ID0gMDsKKwkJCXAgPSBucDsKKwkJfSB3aGlsZSAoKG5yID4+IHAtPnNoaWZ0KSA+PSBDQVJETUFQX1dJRFRIKTsKKwkJKnBtYXAgPSBwOworCX0KKwl3aGlsZSAocC0+c2hpZnQgPiAwKSB7CisJCWkgPSAobnIgPj4gcC0+c2hpZnQpICYgQ0FSRE1BUF9NQVNLOworCQlpZiAocC0+cHRyW2ldID09IE5VTEwpIHsKKwkJCXN0cnVjdCBjYXJkbWFwICpucCA9IGttYWxsb2Moc2l6ZW9mKCpucCksIEdGUF9LRVJORUwpOworCQkJbWVtc2V0KG5wLCAwLCBzaXplb2YoKm5wKSk7CisJCQlucC0+c2hpZnQgPSBwLT5zaGlmdCAtIENBUkRNQVBfT1JERVI7CisJCQlucC0+cGFyZW50ID0gcDsKKwkJCXAtPnB0cltpXSA9IG5wOworCQl9CisJCWlmIChwdHIgPT0gTlVMTCkKKwkJCWNsZWFyX2JpdChpLCAmcC0+aW51c2UpOworCQlwID0gcC0+cHRyW2ldOworCX0KKwlpID0gbnIgJiBDQVJETUFQX01BU0s7CisJcC0+cHRyW2ldID0gcHRyOworCWlmIChwdHIgIT0gTlVMTCkKKwkJc2V0X2JpdChpLCAmcC0+aW51c2UpOworCWVsc2UKKwkJY2xlYXJfYml0KGksICZwLT5pbnVzZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZG1hcF9maW5kX2ZpcnN0X2ZyZWUoc3RydWN0IGNhcmRtYXAgKm1hcCkKK3sKKwlzdHJ1Y3QgY2FyZG1hcCAqcDsKKwl1bnNpZ25lZCBpbnQgbnIgPSAwOworCWludCBpOworCisJaWYgKChwID0gbWFwKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlmb3IgKDs7KSB7CisJCWkgPSBmaW5kX2ZpcnN0X3plcm9fYml0KCZwLT5pbnVzZSwgQ0FSRE1BUF9XSURUSCk7CisJCWlmIChpID49IENBUkRNQVBfV0lEVEgpIHsKKwkJCWlmIChwLT5wYXJlbnQgPT0gTlVMTCkKKwkJCQlyZXR1cm4gQ0FSRE1BUF9XSURUSCA8PCBwLT5zaGlmdDsKKwkJCXAgPSBwLT5wYXJlbnQ7CisJCQlpID0gKG5yID4+IHAtPnNoaWZ0KSAmIENBUkRNQVBfTUFTSzsKKwkJCXNldF9iaXQoaSwgJnAtPmludXNlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW5yID0gKG5yICYgKH5DQVJETUFQX01BU0sgPDwgcC0+c2hpZnQpKSB8IChpIDw8IHAtPnNoaWZ0KTsKKwkJaWYgKHAtPnNoaWZ0ID09IDAgfHwgcC0+cHRyW2ldID09IE5VTEwpCisJCQlyZXR1cm4gbnI7CisJCXAgPSBwLT5wdHJbaV07CisJfQorfQorCitzdGF0aWMgdm9pZCBjYXJkbWFwX2Rlc3Ryb3koc3RydWN0IGNhcmRtYXAgKipwbWFwKQoreworCXN0cnVjdCBjYXJkbWFwICpwLCAqbnA7CisJaW50IGk7CisKKwlmb3IgKHAgPSAqcG1hcDsgcCAhPSBOVUxMOyBwID0gbnApIHsKKwkJaWYgKHAtPnNoaWZ0ICE9IDApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBDQVJETUFQX1dJRFRIOyArK2kpCisJCQkJaWYgKHAtPnB0cltpXSAhPSBOVUxMKQorCQkJCQlicmVhazsKKwkJCWlmIChpIDwgQ0FSRE1BUF9XSURUSCkgeworCQkJCW5wID0gcC0+cHRyW2ldOworCQkJCXAtPnB0cltpXSA9IE5VTEw7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJbnAgPSBwLT5wYXJlbnQ7CisJCWtmcmVlKHApOworCX0KKwkqcG1hcCA9IE5VTEw7Cit9CisKKy8qIE1vZHVsZS9pbml0aWFsaXphdGlvbiBzdHVmZiAqLworCittb2R1bGVfaW5pdChwcHBfaW5pdCk7Cittb2R1bGVfZXhpdChwcHBfY2xlYW51cCk7CisKK0VYUE9SVF9TWU1CT0wocHBwX3JlZ2lzdGVyX2NoYW5uZWwpOworRVhQT1JUX1NZTUJPTChwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKTsKK0VYUE9SVF9TWU1CT0wocHBwX2NoYW5uZWxfaW5kZXgpOworRVhQT1JUX1NZTUJPTChwcHBfdW5pdF9udW1iZXIpOworRVhQT1JUX1NZTUJPTChwcHBfaW5wdXQpOworRVhQT1JUX1NZTUJPTChwcHBfaW5wdXRfZXJyb3IpOworRVhQT1JUX1NZTUJPTChwcHBfb3V0cHV0X3dha2V1cCk7CitFWFBPUlRfU1lNQk9MKHBwcF9yZWdpc3Rlcl9jb21wcmVzc29yKTsKK0VYUE9SVF9TWU1CT0wocHBwX3VucmVnaXN0ZXJfY29tcHJlc3Nvcik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfQ0hBUkRFVl9NQUpPUihQUFBfTUFKT1IpOworTU9EVUxFX0FMSUFTKCIvZGV2L3BwcCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYyBiL2RyaXZlcnMvbmV0L3BwcF9zeW5jdHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwMTUwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9zeW5jdHR5LmMKQEAgLTAsMCArMSw4MDMgQEAKKy8qCisgKiBQUFAgc3luY2hyb25vdXMgdHR5IGNoYW5uZWwgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBUaGlzIGlzIGEgcHBwIGNoYW5uZWwgZHJpdmVyIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB0dHkgZGV2aWNlIGRyaXZlcnMKKyAqIHRoYXQgYXJlIGZyYW1lIG9yaWVudGVkLCBzdWNoIGFzIHN5bmNocm9ub3VzIEhETEMgZGV2aWNlcy4KKyAqCisgKiBDb21wbGV0ZSBQUFAgZnJhbWVzIHdpdGhvdXQgZW5jb2RpbmcvZGVjb2RpbmcgYXJlIGV4Y2hhbmdlZCBiZXR3ZWVuCisgKiB0aGUgY2hhbm5lbCBkcml2ZXIgYW5kIHRoZSBkZXZpY2UgZHJpdmVyLgorICogCisgKiBUaGUgYXN5bmMgbWFwIElPQ1RMIGNvZGVzIGFyZSBpbXBsZW1lbnRlZCB0byBrZWVwIHRoZSB1c2VyIG1vZGUKKyAqIGFwcGxpY2F0aW9ucyBoYXBweSBpZiB0aGV5IGNhbGwgdGhlbS4gU3luY2hyb25vdXMgUFBQIGRvZXMgbm90IHVzZQorICogdGhlIGFzeW5jIG1hcHMuCisgKgorICogQ29weXJpZ2h0IDE5OTkgUGF1bCBNYWNrZXJyYXMuCisgKgorICogQWxzbyB0b3VjaGVkIGJ5IHRoZSBncnViYnkgaGFuZHMgb2YgUGF1bCBGdWxnaHVtIHBhdWxrZkBtaWNyb2dhdGUuY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBkcml2ZXIgcHJvdmlkZXMgdGhlIGVuY2Fwc3VsYXRpb24gYW5kIGZyYW1pbmcgZm9yIHNlbmRpbmcKKyAqIGFuZCByZWNlaXZpbmcgUFBQIGZyYW1lcyBvdmVyIHN5bmMgc2VyaWFsIGxpbmVzLiAgSXQgcmVsaWVzIG9uCisgKiB0aGUgZ2VuZXJpYyBQUFAgbGF5ZXIgdG8gZ2l2ZSBpdCBmcmFtZXMgdG8gc2VuZCBhbmQgdG8gcHJvY2VzcworICogcmVjZWl2ZWQgZnJhbWVzLiAgSXQgaW1wbGVtZW50cyB0aGUgUFBQIGxpbmUgZGlzY2lwbGluZS4KKyAqCisgKiBQYXJ0IG9mIHRoZSBjb2RlIGluIHRoaXMgZHJpdmVyIHdhcyBpbnNwaXJlZCBieSB0aGUgb2xkIGFzeW5jLW9ubHkKKyAqIFBQUCBkcml2ZXIsIHdyaXR0ZW4gYnkgTWljaGFlbCBDYWxsYWhhbiBhbmQgQWwgTG9uZ3llYXIsIGFuZAorICogc3Vic2VxdWVudGx5IGhhY2tlZCBieSBQYXVsIE1hY2tlcnJhcy4KKyAqCisgKiA9PUZJTEVWRVJTSU9OIDIwMDQwNjE2PT0KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwLmg+CisjaW5jbHVkZSA8bGludXgvcHBwX2NoYW5uZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2RlZmluZSBQUFBfVkVSU0lPTgkiMi40LjIiCisKKy8qIFN0cnVjdHVyZSBmb3Igc3RvcmluZyBsb2NhbCBzdGF0ZS4gKi8KK3N0cnVjdCBzeW5jcHBwIHsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGludAlmbGFnczsKKwl1bnNpZ25lZCBpbnQJcmJpdHM7CisJaW50CQltcnU7CisJc3BpbmxvY2tfdAl4bWl0X2xvY2s7CisJc3BpbmxvY2tfdAlyZWN2X2xvY2s7CisJdW5zaWduZWQgbG9uZwl4bWl0X2ZsYWdzOworCXUzMgkJeGFjY21bOF07CisJdTMyCQlyYWNjbTsKKwl1bnNpZ25lZCBpbnQJYnl0ZXNfc2VudDsKKwl1bnNpZ25lZCBpbnQJYnl0ZXNfcmN2ZDsKKworCXN0cnVjdCBza19idWZmCSp0cGt0OworCXVuc2lnbmVkIGxvbmcJbGFzdF94bWl0OworCisJc3RydWN0IHNrX2J1ZmZfaGVhZCBycXVldWU7CisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdHNrOworCisJYXRvbWljX3QJcmVmY250OworCXN0cnVjdCBzZW1hcGhvcmUgZGVhZF9zZW07CisJc3RydWN0IHBwcF9jaGFubmVsIGNoYW47CS8qIGludGVyZmFjZSB0byBnZW5lcmljIHBwcCBsYXllciAqLworfTsKKworLyogQml0IG51bWJlcnMgaW4geG1pdF9mbGFncyAqLworI2RlZmluZSBYTUlUX1dBS0VVUAkwCisjZGVmaW5lIFhNSVRfRlVMTAkxCisKKy8qIEJpdHMgaW4gcmJpdHMgKi8KKyNkZWZpbmUgU0NfUkNWX0JJVFMJKFNDX1JDVl9CN18xfFNDX1JDVl9CN18wfFNDX1JDVl9PRERQfFNDX1JDVl9FVk5QKQorCisjZGVmaW5lIFBQUFNZTkNfTUFYX1JRTEVOCTMyCS8qIGFyYml0cmFyeSAqLworCisvKgorICogUHJvdG90eXBlcy4KKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmKiBwcHBfc3luY190eG11bmdlKHN0cnVjdCBzeW5jcHBwICphcCwgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgaW50IHBwcF9zeW5jX3NlbmQoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgcHBwX3N5bmNfaW9jdGwoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdm9pZCBwcHBfc3luY19wcm9jZXNzKHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgcHBwX3N5bmNfcHVzaChzdHJ1Y3Qgc3luY3BwcCAqYXApOworc3RhdGljIHZvaWQgcHBwX3N5bmNfZmx1c2hfb3V0cHV0KHN0cnVjdCBzeW5jcHBwICphcCk7CitzdGF0aWMgdm9pZCBwcHBfc3luY19pbnB1dChzdHJ1Y3Qgc3luY3BwcCAqYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCSAgIGNoYXIgKmZsYWdzLCBpbnQgY291bnQpOworCitzdGF0aWMgc3RydWN0IHBwcF9jaGFubmVsX29wcyBzeW5jX29wcyA9IHsKKwlwcHBfc3luY19zZW5kLAorCXBwcF9zeW5jX2lvY3RsCit9OworCisvKgorICogVXRpbGl0eSBwcm9jZWR1cmVzIHRvIHByaW50IGEgYnVmZmVyIGluIGhleC9hc2NpaQorICovCitzdGF0aWMgdm9pZAorcHBwX3ByaW50X2hleCAocmVnaXN0ZXIgX191OCAqIG91dCwgY29uc3QgX191OCAqIGluLCBpbnQgY291bnQpCit7CisJcmVnaXN0ZXIgX191OCBuZXh0X2NoOworCXN0YXRpYyBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlBQkNERUYiOworCisJd2hpbGUgKGNvdW50LS0gPiAwKSB7CisJCW5leHRfY2ggPSAqaW4rKzsKKwkJKm91dCsrID0gaGV4WyhuZXh0X2NoID4+IDQpICYgMHgwRl07CisJCSpvdXQrKyA9IGhleFtuZXh0X2NoICYgMHgwRl07CisJCSsrb3V0OworCX0KK30KKworc3RhdGljIHZvaWQKK3BwcF9wcmludF9jaGFyIChyZWdpc3RlciBfX3U4ICogb3V0LCBjb25zdCBfX3U4ICogaW4sIGludCBjb3VudCkKK3sKKwlyZWdpc3RlciBfX3U4IG5leHRfY2g7CisKKwl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJbmV4dF9jaCA9ICppbisrOworCisJCWlmIChuZXh0X2NoIDwgMHgyMCB8fCBuZXh0X2NoID4gMHg3ZSkKKwkJCSpvdXQrKyA9ICcuJzsKKwkJZWxzZSB7CisJCQkqb3V0KysgPSBuZXh0X2NoOworCQkJaWYgKG5leHRfY2ggPT0gJyUnKSAgIC8qIHByaW50ay9zeXNsb2dkIGhhcyBhIGJ1ZyAhISAqLworCQkJCSpvdXQrKyA9ICclJzsKKwkJfQorCX0KKwkqb3V0ID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQKK3BwcF9wcmludF9idWZmZXIgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IF9fdTggKmJ1ZiwgaW50IGNvdW50KQoreworCV9fdTggbGluZVs0NF07CisKKwlpZiAobmFtZSAhPSBOVUxMKQorCQlwcmludGsoS0VSTl9ERUJVRyAicHBwX3N5bmN0dHk6ICVzLCBjb3VudCA9ICVkXG4iLCBuYW1lLCBjb3VudCk7CisKKwl3aGlsZSAoY291bnQgPiA4KSB7CisJCW1lbXNldCAobGluZSwgMzIsIDQ0KTsKKwkJcHBwX3ByaW50X2hleCAobGluZSwgYnVmLCA4KTsKKwkJcHBwX3ByaW50X2NoYXIgKCZsaW5lWzggKiAzXSwgYnVmLCA4KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBsaW5lKTsKKwkJY291bnQgLT0gODsKKwkJYnVmICs9IDg7CisJfQorCisJaWYgKGNvdW50ID4gMCkgeworCQltZW1zZXQgKGxpbmUsIDMyLCA0NCk7CisJCXBwcF9wcmludF9oZXggKGxpbmUsIGJ1ZiwgY291bnQpOworCQlwcHBfcHJpbnRfY2hhciAoJmxpbmVbOCAqIDNdLCBidWYsIGNvdW50KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBsaW5lKTsKKwl9Cit9CisKKworLyoKKyAqIFJvdXRpbmVzIGltcGxlbWVudGluZyB0aGUgc3luY2hyb25vdXMgUFBQIGxpbmUgZGlzY2lwbGluZS4KKyAqLworCisvKgorICogV2UgaGF2ZSBhIHBvdGVudGlhbCByYWNlIG9uIGRlcmVmZXJlbmNpbmcgdHR5LT5kaXNjX2RhdGEsCisgKiBiZWNhdXNlIHRoZSB0dHkgbGF5ZXIgcHJvdmlkZXMgbm8gbG9ja2luZyBhdCBhbGwgLSB0aHVzIG9uZQorICogY3B1IGNvdWxkIGJlIHJ1bm5pbmcgcHBwX3N5bmN0dHlfcmVjZWl2ZSB3aGlsZSBhbm90aGVyCisgKiBjYWxscyBwcHBfc3luY3R0eV9jbG9zZSwgd2hpY2ggemVyb2VzIHR0eS0+ZGlzY19kYXRhIGFuZAorICogZnJlZXMgdGhlIG1lbW9yeSB0aGF0IHBwcF9zeW5jdHR5X3JlY2VpdmUgaXMgdXNpbmcuICBUaGUgYmVzdAorICogd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHVzZSBhIHJ3bG9jayBpbiB0aGUgdHR5IHN0cnVjdCwgYnV0IGZvciBub3cKKyAqIHdlIHVzZSBhIHNpbmdsZSBnbG9iYWwgcndsb2NrIGZvciBhbGwgdHR5cyBpbiBwcHAgbGluZSBkaXNjaXBsaW5lLgorICoKKyAqIEZJWE1FOiBGaXhlZCBpbiB0dHlfaW8gbm93ZGF5cy4KKyAqLworc3RhdGljIERFRklORV9SV0xPQ0soZGlzY19kYXRhX2xvY2spOworCitzdGF0aWMgc3RydWN0IHN5bmNwcHAgKnNwX2dldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzeW5jcHBwICphcDsKKworCXJlYWRfbG9jaygmZGlzY19kYXRhX2xvY2spOworCWFwID0gdHR5LT5kaXNjX2RhdGE7CisJaWYgKGFwICE9IE5VTEwpCisJCWF0b21pY19pbmMoJmFwLT5yZWZjbnQpOworCXJlYWRfdW5sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisJcmV0dXJuIGFwOworfQorCitzdGF0aWMgdm9pZCBzcF9wdXQoc3RydWN0IHN5bmNwcHAgKmFwKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZhcC0+cmVmY250KSkKKwkJdXAoJmFwLT5kZWFkX3NlbSk7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBhIHR0eSBpcyBwdXQgaW50byBzeW5jLVBQUCBsaW5lIGRpc2NpcGxpbmUuCisgKi8KK3N0YXRpYyBpbnQKK3BwcF9zeW5jX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc3luY3BwcCAqYXA7CisJaW50IGVycjsKKworCWFwID0ga21hbGxvYyhzaXplb2YoKmFwKSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoYXAgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiBpbml0aWFsaXplIHRoZSBzeW5jcHBwIHN0cnVjdHVyZSAqLworCW1lbXNldChhcCwgMCwgc2l6ZW9mKCphcCkpOworCWFwLT50dHkgPSB0dHk7CisJYXAtPm1ydSA9IFBQUF9NUlU7CisJc3Bpbl9sb2NrX2luaXQoJmFwLT54bWl0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZhcC0+cmVjdl9sb2NrKTsKKwlhcC0+eGFjY21bMF0gPSB+MFU7CisJYXAtPnhhY2NtWzNdID0gMHg2MDAwMDAwMFU7CisJYXAtPnJhY2NtID0gfjBVOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXAtPnJxdWV1ZSk7CisJdGFza2xldF9pbml0KCZhcC0+dHNrLCBwcHBfc3luY19wcm9jZXNzLCAodW5zaWduZWQgbG9uZykgYXApOworCisJYXRvbWljX3NldCgmYXAtPnJlZmNudCwgMSk7CisJaW5pdF9NVVRFWF9MT0NLRUQoJmFwLT5kZWFkX3NlbSk7CisKKwlhcC0+Y2hhbi5wcml2YXRlID0gYXA7CisJYXAtPmNoYW4ub3BzID0gJnN5bmNfb3BzOworCWFwLT5jaGFuLm10dSA9IFBQUF9NUlU7CisJYXAtPmNoYW4uaGRybGVuID0gMjsJLyogZm9yIEEvQyBieXRlcyAqLworCWVyciA9IHBwcF9yZWdpc3Rlcl9jaGFubmVsKCZhcC0+Y2hhbik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKworCXR0eS0+ZGlzY19kYXRhID0gYXA7CisKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlOgorCWtmcmVlKGFwKTsKKyBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSB0dHkgaXMgcHV0IGludG8gYW5vdGhlciBsaW5lIGRpc2NpcGxpbmUKKyAqIG9yIGl0IGhhbmdzIHVwLiAgV2UgaGF2ZSB0byB3YWl0IGZvciBhbnkgY3B1IGN1cnJlbnRseQorICogZXhlY3V0aW5nIGluIGFueSBvZiB0aGUgb3RoZXIgcHBwX3N5bmN0dHlfKiByb3V0aW5lcyB0bworICogZmluaXNoIGJlZm9yZSB3ZSBjYW4gY2FsbCBwcHBfdW5yZWdpc3Rlcl9jaGFubmVsIGFuZCBmcmVlCisgKiB0aGUgc3luY3BwcCBzdHJ1Y3QuICBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgZnJvbQorICogcHJvY2VzcyBjb250ZXh0LCBub3QgaW50ZXJydXB0IG9yIHNvZnRpcnEgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQKK3BwcF9zeW5jX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHN5bmNwcHAgKmFwOworCisJd3JpdGVfbG9ja19pcnEoJmRpc2NfZGF0YV9sb2NrKTsKKwlhcCA9IHR0eS0+ZGlzY19kYXRhOworCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKKwl3cml0ZV91bmxvY2tfaXJxKCZkaXNjX2RhdGFfbG9jayk7CisJaWYgKGFwID09IDApCisJCXJldHVybjsKKworCS8qCisJICogV2UgaGF2ZSBub3cgZW5zdXJlZCB0aGF0IG5vYm9keSBjYW4gc3RhcnQgdXNpbmcgYXAgZnJvbSBub3cKKwkgKiBvbiwgYnV0IHdlIGhhdmUgdG8gd2FpdCBmb3IgYWxsIGV4aXN0aW5nIHVzZXJzIHRvIGZpbmlzaC4KKwkgKiBOb3RlIHRoYXQgcHBwX3VucmVnaXN0ZXJfY2hhbm5lbCBlbnN1cmVzIHRoYXQgbm8gY2FsbHMgdG8KKwkgKiBvdXIgY2hhbm5lbCBvcHMgKGkuZS4gcHBwX3N5bmNfc2VuZC9pb2N0bCkgYXJlIGluIHByb2dyZXNzCisJICogYnkgdGhlIHRpbWUgaXQgcmV0dXJucy4KKwkgKi8KKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmFwLT5yZWZjbnQpKQorCQlkb3duKCZhcC0+ZGVhZF9zZW0pOworCXRhc2tsZXRfa2lsbCgmYXAtPnRzayk7CisKKwlwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKCZhcC0+Y2hhbik7CisJc2tiX3F1ZXVlX3B1cmdlKCZhcC0+cnF1ZXVlKTsKKwlpZiAoYXAtPnRwa3QgIT0gMCkKKwkJa2ZyZWVfc2tiKGFwLT50cGt0KTsKKwlrZnJlZShhcCk7Cit9CisKKy8qCisgKiBDYWxsZWQgb24gdHR5IGhhbmd1cCBpbiBwcm9jZXNzIGNvbnRleHQuCisgKgorICogV2FpdCBmb3IgSS9PIHRvIGRyaXZlciB0byBjb21wbGV0ZSBhbmQgdW5yZWdpc3RlciBQUFAgY2hhbm5lbC4KKyAqIFRoaXMgaXMgYWxyZWFkeSBkb25lIGJ5IHRoZSBjbG9zZSByb3V0aW5lLCBzbyBqdXN0IGNhbGwgdGhhdC4KKyAqLworc3RhdGljIGludCBwcHBfc3luY19oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlwcHBfc3luY19jbG9zZSh0dHkpOworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBkb2VzIG5vdGhpbmcgLSBubyBkYXRhIGlzIGV2ZXIgYXZhaWxhYmxlIHRoaXMgd2F5LgorICogUHBwZCByZWFkcyBhbmQgd3JpdGVzIHBhY2tldHMgdmlhIC9kZXYvcHBwIGluc3RlYWQuCisgKi8KK3N0YXRpYyBzc2l6ZV90CitwcHBfc3luY19yZWFkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCSAgICAgICB1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKKy8qCisgKiBXcml0ZSBvbiB0aGUgdHR5IGRvZXMgbm90aGluZywgdGhlIHBhY2tldHMgYWxsIGNvbWUgaW4KKyAqIGZyb20gdGhlIHBwcCBnZW5lcmljIHN0dWZmLgorICovCitzdGF0aWMgc3NpemVfdAorcHBwX3N5bmNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiAtRUFHQUlOOworfQorCitzdGF0aWMgaW50CitwcHBfc3luY3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc3luY3BwcCAqYXAgPSBzcF9nZXQodHR5KTsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisJaW50IGVyciwgdmFsOworCisJaWYgKGFwID09IDApCisJCXJldHVybiAtRU5YSU87CisJZXJyID0gLUVGQVVMVDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBQSU9DR0NIQU46CisJCWVyciA9IC1FTlhJTzsKKwkJaWYgKGFwID09IDApCisJCQlicmVhazsKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKHBwcF9jaGFubmVsX2luZGV4KCZhcC0+Y2hhbiksIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHVU5JVDoKKwkJZXJyID0gLUVOWElPOworCQlpZiAoYXAgPT0gMCkKKwkJCWJyZWFrOworCQllcnIgPSAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIocHBwX3VuaXRfbnVtYmVyKCZhcC0+Y2hhbiksIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBUQ0dFVFM6CisJY2FzZSBUQ0dFVEE6CisJCWVyciA9IG5fdHR5X2lvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKworCWNhc2UgVENGTFNIOgorCQkvKiBmbHVzaCBvdXIgYnVmZmVycyBhbmQgdGhlIHNlcmlhbCBwb3J0J3MgYnVmZmVyICovCisJCWlmIChhcmcgPT0gVENJT0ZMVVNIIHx8IGFyZyA9PSBUQ09GTFVTSCkKKwkJCXBwcF9zeW5jX2ZsdXNoX291dHB1dChhcCk7CisJCWVyciA9IG5fdHR5X2lvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKworCWNhc2UgRklPTlJFQUQ6CisJCXZhbCA9IDA7CisJCWlmIChwdXRfdXNlcih2YWwsIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0lPQ1RMQ01EOworCX0KKworCXNwX3B1dChhcCk7CisJcmV0dXJuIGVycjsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSBmaW5lICovCitzdGF0aWMgdW5zaWduZWQgaW50CitwcHBfc3luY19wb2xsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcHBfc3luY19yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIDY1NTM1OworfQorCisvKgorICogVGhpcyBjYW4gbm93IGJlIGNhbGxlZCBmcm9tIGhhcmQgaW50ZXJydXB0IGxldmVsIGFzIHdlbGwKKyAqIGFzIHNvZnQgaW50ZXJydXB0IGxldmVsIG9yIG1haW5saW5lLgorICovCitzdGF0aWMgdm9pZAorcHBwX3N5bmNfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCSAgY2hhciAqY2ZsYWdzLCBpbnQgY291bnQpCit7CisJc3RydWN0IHN5bmNwcHAgKmFwID0gc3BfZ2V0KHR0eSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChhcCA9PSAwKQorCQlyZXR1cm47CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFwLT5yZWN2X2xvY2ssIGZsYWdzKTsKKwlwcHBfc3luY19pbnB1dChhcCwgYnVmLCBjZmxhZ3MsIGNvdW50KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcC0+cmVjdl9sb2NrLCBmbGFncyk7CisJaWYgKHNrYl9xdWV1ZV9sZW4oJmFwLT5ycXVldWUpKQorCQl0YXNrbGV0X3NjaGVkdWxlKCZhcC0+dHNrKTsKKwlzcF9wdXQoYXApOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpCisJICAgICYmIHR0eS0+ZHJpdmVyLT51bnRocm90dGxlKQorCQl0dHktPmRyaXZlci0+dW50aHJvdHRsZSh0dHkpOworfQorCitzdGF0aWMgdm9pZAorcHBwX3N5bmNfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHN5bmNwcHAgKmFwID0gc3BfZ2V0KHR0eSk7CisKKwljbGVhcl9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnR0eS0+ZmxhZ3MpOworCWlmIChhcCA9PSAwKQorCQlyZXR1cm47CisJc2V0X2JpdChYTUlUX1dBS0VVUCwgJmFwLT54bWl0X2ZsYWdzKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZhcC0+dHNrKTsKKwlzcF9wdXQoYXApOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2xkaXNjIHBwcF9zeW5jX2xkaXNjID0geworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5tYWdpYwk9IFRUWV9MRElTQ19NQUdJQywKKwkubmFtZQk9ICJwcHBzeW5jIiwKKwkub3Blbgk9IHBwcF9zeW5jX29wZW4sCisJLmNsb3NlCT0gcHBwX3N5bmNfY2xvc2UsCisJLmhhbmd1cAk9IHBwcF9zeW5jX2hhbmd1cCwKKwkucmVhZAk9IHBwcF9zeW5jX3JlYWQsCisJLndyaXRlCT0gcHBwX3N5bmNfd3JpdGUsCisJLmlvY3RsCT0gcHBwX3N5bmN0dHlfaW9jdGwsCisJLnBvbGwJPSBwcHBfc3luY19wb2xsLAorCS5yZWNlaXZlX3Jvb20gPSBwcHBfc3luY19yb29tLAorCS5yZWNlaXZlX2J1ZiA9IHBwcF9zeW5jX3JlY2VpdmUsCisJLndyaXRlX3dha2V1cCA9IHBwcF9zeW5jX3dha2V1cCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitwcHBfc3luY19pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IHR0eV9yZWdpc3Rlcl9sZGlzYyhOX1NZTkNfUFBQLCAmcHBwX3N5bmNfbGRpc2MpOworCWlmIChlcnIgIT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJQUFBfc3luYzogZXJyb3IgJWQgcmVnaXN0ZXJpbmcgbGluZSBkaXNjLlxuIiwKKwkJICAgICAgIGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgcHJvdmlkZSB0aGUgUFBQIGNoYW5uZWwgaW50ZXJmYWNlLgorICovCitzdGF0aWMgaW50CitwcHBfc3luY19pb2N0bChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzeW5jcHBwICphcCA9IGNoYW4tPnByaXZhdGU7CisJaW50IGVyciwgdmFsOworCXUzMiBhY2NtWzhdOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXUzMiBfX3VzZXIgKnAgPSBhcmdwOworCisJZXJyID0gLUVGQVVMVDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBQSU9DR0ZMQUdTOgorCQl2YWwgPSBhcC0+ZmxhZ3MgfCBhcC0+cmJpdHM7CisJCWlmIChwdXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZ3ApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCWNhc2UgUFBQSU9DU0ZMQUdTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKSBhcmdwKSkKKwkJCWJyZWFrOworCQlhcC0+ZmxhZ3MgPSB2YWwgJiB+U0NfUkNWX0JJVFM7CisJCXNwaW5fbG9ja19pcnEoJmFwLT5yZWN2X2xvY2spOworCQlhcC0+cmJpdHMgPSB2YWwgJiBTQ19SQ1ZfQklUUzsKKwkJc3Bpbl91bmxvY2tfaXJxKCZhcC0+cmVjdl9sb2NrKTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dBU1lOQ01BUDoKKwkJaWYgKHB1dF91c2VyKGFwLT54YWNjbVswXSwgcCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJY2FzZSBQUFBJT0NTQVNZTkNNQVA6CisJCWlmIChnZXRfdXNlcihhcC0+eGFjY21bMF0sIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHUkFTWU5DTUFQOgorCQlpZiAocHV0X3VzZXIoYXAtPnJhY2NtLCBwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIFBQUElPQ1NSQVNZTkNNQVA6CisJCWlmIChnZXRfdXNlcihhcC0+cmFjY20sIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHWEFTWU5DTUFQOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGFwLT54YWNjbSwgc2l6ZW9mKGFwLT54YWNjbSkpKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCWNhc2UgUFBQSU9DU1hBU1lOQ01BUDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGFjY20sIGFyZ3AsIHNpemVvZihhY2NtKSkpCisJCQlicmVhazsKKwkJYWNjbVsyXSAmPSB+MHg0MDAwMDAwMFU7CS8qIGNhbid0IGVzY2FwZSAweDVlICovCisJCWFjY21bM10gfD0gMHg2MDAwMDAwMFU7CQkvKiBtdXN0IGVzY2FwZSAweDdkLCAweDdlICovCisJCW1lbWNweShhcC0+eGFjY20sIGFjY20sIHNpemVvZihhcC0+eGFjY20pKTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dNUlU6CisJCWlmIChwdXRfdXNlcihhcC0+bXJ1LCAoaW50IF9fdXNlciAqKSBhcmdwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIFBQUElPQ1NNUlU6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZ3ApKQorCQkJYnJlYWs7CisJCWlmICh2YWwgPCBQUFBfTVJVKQorCQkJdmFsID0gUFBQX01SVTsKKwkJYXAtPm1ydSA9IHZhbDsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PVFRZOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgYXQgc29mdGlycSBsZXZlbCB0byBkZWxpdmVyIHJlY2VpdmVkIHBhY2tldHMKKyAqIHRvIHRoZSBwcHBfZ2VuZXJpYyBjb2RlLCBhbmQgdG8gdGVsbCB0aGUgcHBwX2dlbmVyaWMgY29kZQorICogaWYgd2UgY2FuIGFjY2VwdCBtb3JlIG91dHB1dCBub3cuCisgKi8KK3N0YXRpYyB2b2lkIHBwcF9zeW5jX3Byb2Nlc3ModW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHN5bmNwcHAgKmFwID0gKHN0cnVjdCBzeW5jcHBwICopIGFyZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyogcHJvY2VzcyByZWNlaXZlZCBwYWNrZXRzICovCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmYXAtPnJxdWV1ZSkpICE9IE5VTEwpIHsKKwkJaWYgKHNrYi0+bGVuID09IDApIHsKKwkJCS8qIHplcm8gbGVuZ3RoIGJ1ZmZlcnMgaW5kaWNhdGUgZXJyb3IgKi8KKwkJCXBwcF9pbnB1dF9lcnJvcigmYXAtPmNoYW4sIDApOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKwkJZWxzZQorCQkJcHBwX2lucHV0KCZhcC0+Y2hhbiwgc2tiKTsKKwl9CisKKwkvKiB0cnkgdG8gcHVzaCBtb3JlIHN0dWZmIG91dCAqLworCWlmICh0ZXN0X2JpdChYTUlUX1dBS0VVUCwgJmFwLT54bWl0X2ZsYWdzKSAmJiBwcHBfc3luY19wdXNoKGFwKSkKKwkJcHBwX291dHB1dF93YWtldXAoJmFwLT5jaGFuKTsKK30KKworLyoKKyAqIFByb2NlZHVyZXMgZm9yIGVuY2Fwc3VsYXRpb24gYW5kIGZyYW1pbmcuCisgKi8KKworc3RydWN0IHNrX2J1ZmYqCitwcHBfc3luY190eG11bmdlKHN0cnVjdCBzeW5jcHBwICphcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcHJvdG87CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlpbnQgaXNsY3A7CisKKwlkYXRhICA9IHNrYi0+ZGF0YTsKKwlwcm90byA9IChkYXRhWzBdIDw8IDgpICsgZGF0YVsxXTsKKworCS8qIExDUCBwYWNrZXRzIHdpdGggY29kZXMgYmV0d2VlbiAxIChjb25maWd1cmUtcmVxdWVzdCkKKwkgKiBhbmQgNyAoY29kZS1yZWplY3QpIG11c3QgYmUgc2VudCBhcyB0aG91Z2ggbm8gb3B0aW9ucworCSAqIGhhdmUgYmVlbiBuZWdvdGlhdGVkLgorCSAqLworCWlzbGNwID0gcHJvdG8gPT0gUFBQX0xDUCAmJiAxIDw9IGRhdGFbMl0gJiYgZGF0YVsyXSA8PSA3OworCisJLyogY29tcHJlc3MgcHJvdG9jb2wgZmllbGQgaWYgb3B0aW9uIGVuYWJsZWQgKi8KKwlpZiAoZGF0YVswXSA9PSAwICYmIChhcC0+ZmxhZ3MgJiBTQ19DT01QX1BST1QpICYmICFpc2xjcCkKKwkJc2tiX3B1bGwoc2tiLDEpOworCisJLyogcHJlcGVuZCBhZGRyZXNzL2NvbnRyb2wgZmllbGRzIGlmIG5lY2Vzc2FyeSAqLworCWlmICgoYXAtPmZsYWdzICYgU0NfQ09NUF9BQykgPT0gMCB8fCBpc2xjcCkgeworCQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCAyKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbnBrdCA9IGRldl9hbGxvY19za2Ioc2tiLT5sZW4gKyAyKTsKKwkJCWlmIChucGt0ID09IE5VTEwpIHsKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCXNrYl9yZXNlcnZlKG5wa3QsMik7CisJCQltZW1jcHkoc2tiX3B1dChucGt0LHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXNrYiA9IG5wa3Q7CisJCX0KKwkJc2tiX3B1c2goc2tiLDIpOworCQlza2ItPmRhdGFbMF0gPSBQUFBfQUxMU1RBVElPTlM7CisJCXNrYi0+ZGF0YVsxXSA9IFBQUF9VSTsKKwl9CisKKwlhcC0+bGFzdF94bWl0ID0gamlmZmllczsKKworCWlmIChza2IgJiYgYXAtPmZsYWdzICYgU0NfTE9HX09VVFBLVCkKKwkJcHBwX3ByaW50X2J1ZmZlciAoInNlbmQgYnVmZmVyIiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwlyZXR1cm4gc2tiOworfQorCisvKgorICogVHJhbnNtaXQtc2lkZSByb3V0aW5lcy4KKyAqLworCisvKgorICogU2VuZCBhIHBhY2tldCB0byB0aGUgcGVlciBvdmVyIGFuIHN5bmMgdHR5IGxpbmUuCisgKiBSZXR1cm5zIDEgaWZmIHRoZSBwYWNrZXQgd2FzIGFjY2VwdGVkLgorICogSWYgdGhlIHBhY2tldCB3YXMgbm90IGFjY2VwdGVkLCB3ZSB3aWxsIGNhbGwgcHBwX291dHB1dF93YWtldXAKKyAqIGF0IHNvbWUgbGF0ZXIgdGltZS4KKyAqLworc3RhdGljIGludAorcHBwX3N5bmNfc2VuZChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHN5bmNwcHAgKmFwID0gY2hhbi0+cHJpdmF0ZTsKKworCXBwcF9zeW5jX3B1c2goYXApOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoWE1JVF9GVUxMLCAmYXAtPnhtaXRfZmxhZ3MpKQorCQlyZXR1cm4gMDsJLyogYWxyZWFkeSBmdWxsICovCisJc2tiID0gcHBwX3N5bmNfdHhtdW5nZShhcCwgc2tiKTsKKwlpZiAoc2tiICE9IE5VTEwpCisJCWFwLT50cGt0ID0gc2tiOworCWVsc2UKKwkJY2xlYXJfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKTsKKworCXBwcF9zeW5jX3B1c2goYXApOworCXJldHVybiAxOworfQorCisvKgorICogUHVzaCBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUgb3V0IHRvIHRoZSB0dHkuCisgKi8KK3N0YXRpYyBpbnQKK3BwcF9zeW5jX3B1c2goc3RydWN0IHN5bmNwcHAgKmFwKQoreworCWludCBzZW50LCBkb25lID0gMDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gYXAtPnR0eTsKKwlpbnQgdHR5X3N0dWZmZWQgPSAwOworCisJaWYgKCFzcGluX3RyeWxvY2tfYmgoJmFwLT54bWl0X2xvY2spKQorCQlyZXR1cm4gMDsKKwlmb3IgKDs7KSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoWE1JVF9XQUtFVVAsICZhcC0+eG1pdF9mbGFncykpCisJCQl0dHlfc3R1ZmZlZCA9IDA7CisJCWlmICghdHR5X3N0dWZmZWQgJiYgYXAtPnRwa3QgIT0gMCkgeworCQkJc2V0X2JpdChUVFlfRE9fV1JJVEVfV0FLRVVQLCAmdHR5LT5mbGFncyk7CisJCQlzZW50ID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgYXAtPnRwa3QtPmRhdGEsIGFwLT50cGt0LT5sZW4pOworCQkJaWYgKHNlbnQgPCAwKQorCQkJCWdvdG8gZmx1c2g7CS8qIGVycm9yLCBlLmcuIGxvc3Mgb2YgQ0QgKi8KKwkJCWlmIChzZW50IDwgYXAtPnRwa3QtPmxlbikgeworCQkJCXR0eV9zdHVmZmVkID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJa2ZyZWVfc2tiKGFwLT50cGt0KTsKKwkJCQlhcC0+dHBrdCA9IE5VTEw7CisJCQkJY2xlYXJfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKTsKKwkJCQlkb25lID0gMTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIGhhdmVuJ3QgbWFkZSBhbnkgcHJvZ3Jlc3MgKi8KKwkJc3Bpbl91bmxvY2tfYmgoJmFwLT54bWl0X2xvY2spOworCQlpZiAoISh0ZXN0X2JpdChYTUlUX1dBS0VVUCwgJmFwLT54bWl0X2ZsYWdzKQorCQkgICAgICB8fCAoIXR0eV9zdHVmZmVkICYmIGFwLT50cGt0ICE9IDApKSkKKwkJCWJyZWFrOworCQlpZiAoIXNwaW5fdHJ5bG9ja19iaCgmYXAtPnhtaXRfbG9jaykpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGRvbmU7CisKK2ZsdXNoOgorCWlmIChhcC0+dHBrdCAhPSAwKSB7CisJCWtmcmVlX3NrYihhcC0+dHBrdCk7CisJCWFwLT50cGt0ID0gTlVMTDsKKwkJY2xlYXJfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKTsKKwkJZG9uZSA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhcC0+eG1pdF9sb2NrKTsKKwlyZXR1cm4gZG9uZTsKK30KKworLyoKKyAqIEZsdXNoIG91dHB1dCBmcm9tIG91ciBpbnRlcm5hbCBidWZmZXJzLgorICogQ2FsbGVkIGZvciB0aGUgVENGTFNIIGlvY3RsLgorICovCitzdGF0aWMgdm9pZAorcHBwX3N5bmNfZmx1c2hfb3V0cHV0KHN0cnVjdCBzeW5jcHBwICphcCkKK3sKKwlpbnQgZG9uZSA9IDA7CisKKwlzcGluX2xvY2tfYmgoJmFwLT54bWl0X2xvY2spOworCWlmIChhcC0+dHBrdCAhPSBOVUxMKSB7CisJCWtmcmVlX3NrYihhcC0+dHBrdCk7CisJCWFwLT50cGt0ID0gTlVMTDsKKwkJY2xlYXJfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKTsKKwkJZG9uZSA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhcC0+eG1pdF9sb2NrKTsKKwlpZiAoZG9uZSkKKwkJcHBwX291dHB1dF93YWtldXAoJmFwLT5jaGFuKTsKK30KKworLyoKKyAqIFJlY2VpdmUtc2lkZSByb3V0aW5lcy4KKyAqLworCisvKiBjYWxsZWQgd2hlbiB0aGUgdHR5IGRyaXZlciBoYXMgZGF0YSBmb3IgdXMuCisgKgorICogRGF0YSBpcyBmcmFtZSBvcmllbnRlZDogZWFjaCBjYWxsIHRvIHBwcF9zeW5jX2lucHV0IGlzIGNvbnNpZGVyZWQKKyAqIGEgd2hvbGUgZnJhbWUuIElmIHRoZSAxc3QgZmxhZyBieXRlIGlzIG5vbi16ZXJvIHRoZW4gdGhlIHdob2xlCisgKiBmcmFtZSBpcyBjb25zaWRlcmVkIHRvIGJlIGluIGVycm9yIGFuZCBpcyB0b3NzZWQuCisgKi8KK3N0YXRpYyB2b2lkCitwcHBfc3luY19pbnB1dChzdHJ1Y3Qgc3luY3BwcCAqYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJY2hhciAqZmxhZ3MsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKnA7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKGFwLT5mbGFncyAmIFNDX0xPR19JTlBLVCkKKwkJcHBwX3ByaW50X2J1ZmZlciAoInJlY2VpdmUgYnVmZmVyIiwgYnVmLCBjb3VudCk7CisKKwkvKiBzdHVmZiB0aGUgY2hhcnMgaW4gdGhlIHNrYiAqLworCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYihhcC0+bXJ1ICsgUFBQX0hEUkxFTiArIDIpKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUFBQc3luYzogbm8gbWVtb3J5IChpbnB1dCBwa3QpXG4iKTsKKwkJZ290byBlcnI7CisJfQorCS8qIFRyeSB0byBnZXQgdGhlIHBheWxvYWQgNC1ieXRlIGFsaWduZWQgKi8KKwlpZiAoYnVmWzBdICE9IFBQUF9BTExTVEFUSU9OUykKKwkJc2tiX3Jlc2VydmUoc2tiLCAyICsgKGJ1ZlswXSAmIDEpKTsKKworCWlmIChmbGFncyAhPSAwICYmICpmbGFncykgeworCQkvKiBlcnJvciBmbGFnIHNldCwgaWdub3JlIGZyYW1lICovCisJCWdvdG8gZXJyOworCX0gZWxzZSBpZiAoY291bnQgPiBza2JfdGFpbHJvb20oc2tiKSkgeworCQkvKiBwYWNrZXQgb3ZlcmZsb3dlZCBNUlUgKi8KKwkJZ290byBlcnI7CisJfQorCisJcCA9IHNrYl9wdXQoc2tiLCBjb3VudCk7CisJbWVtY3B5KHAsIGJ1ZiwgY291bnQpOworCisJLyogc3RyaXAgYWRkcmVzcy9jb250cm9sIGZpZWxkIGlmIHByZXNlbnQgKi8KKwlwID0gc2tiLT5kYXRhOworCWlmIChwWzBdID09IFBQUF9BTExTVEFUSU9OUyAmJiBwWzFdID09IFBQUF9VSSkgeworCQkvKiBjaG9wIG9mZiBhZGRyZXNzL2NvbnRyb2wgKi8KKwkJaWYgKHNrYi0+bGVuIDwgMykKKwkJCWdvdG8gZXJyOworCQlwID0gc2tiX3B1bGwoc2tiLCAyKTsKKwl9CisKKwkvKiBkZWNvbXByZXNzIHByb3RvY29sIGZpZWxkIGlmIGNvbXByZXNzZWQgKi8KKwlpZiAocFswXSAmIDEpIHsKKwkJLyogcHJvdG9jb2wgaXMgY29tcHJlc3NlZCAqLworCQlza2JfcHVzaChza2IsIDEpWzBdID0gMDsKKwl9IGVsc2UgaWYgKHNrYi0+bGVuIDwgMikKKwkJZ290byBlcnI7CisKKwkvKiBxdWV1ZSB0aGUgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkICovCisJc2tiX3F1ZXVlX3RhaWwoJmFwLT5ycXVldWUsIHNrYik7CisJcmV0dXJuOworCitlcnI6CisJLyogcXVldWUgemVybyBsZW5ndGggcGFja2V0IGFzIGVycm9yIGluZGljYXRpb24gKi8KKwlpZiAoc2tiIHx8IChza2IgPSBkZXZfYWxsb2Nfc2tiKDApKSkgeworCQlza2JfdHJpbShza2IsIDApOworCQlza2JfcXVldWVfdGFpbCgmYXAtPnJxdWV1ZSwgc2tiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorcHBwX3N5bmNfY2xlYW51cCh2b2lkKQoreworCWlmICh0dHlfcmVnaXN0ZXJfbGRpc2MoTl9TWU5DX1BQUCwgTlVMTCkgIT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gdW5yZWdpc3RlciBTeW5jIFBQUCBsaW5lIGRpc2NpcGxpbmVcbiIpOworfQorCittb2R1bGVfaW5pdChwcHBfc3luY19pbml0KTsKK21vZHVsZV9leGl0KHBwcF9zeW5jX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX0xESVNDKE5fU1lOQ19QUFApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwb2UuYyBiL2RyaXZlcnMvbmV0L3BwcG9lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxYTliZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BwcG9lLmMKQEAgLTAsMCArMSwxMTUzIEBACisvKiogLSotIGxpbnV4LWMgLSotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaW51eCBQUFAgb3ZlciBFdGhlcm5ldCAoUFBQb1gvUFBQb0UpIFNvY2tldHMKKyAqCisgKiBQUFBvWCAtLS0gR2VuZXJpYyBQUFAgZW5jYXBzdWxhdGlvbiBzb2NrZXQgZmFtaWx5CisgKiBQUFBvRSAtLS0gUFBQIG92ZXIgRXRoZXJuZXQgKFJGQyAyNTE2KQorICoKKyAqCisgKiBWZXJzaW9uOgkwLjcuMAorICoKKyAqIDIyMDEwMiA6CUZpeCBtb2R1bGUgdXNlIGNvdW50IG9uIGZhaWx1cmUgaW4gcHBwb2VfY3JlYXRlLCBwcHBveF9zayAtYWNtZQorICogMDMwNzAwIDoJRml4ZWQgY29ubmVjdCBsb2dpYyB0byBhbGxvdyBmb3IgZGlzY29ubmVjdC4KKyAqIDI3MDcwMCA6CUZpeGVkIHBvdGVudGlhbCBTTVAgcHJvYmxlbXM7IHdlIG11c3QgcHJvdGVjdCBhZ2FpbnN0CisgKgkJc2ltdWx0YW5lb3VzIGludm9jYXRpb24gb2YgcHBwX2lucHV0CisgKgkJYW5kIHBwcF91bnJlZ2lzdGVyX2NoYW5uZWwuCisgKiAwNDA4MDAgOglSZXNwZWN0IHJlZmVyZW5jZSBjb3VudCBtZWNoYW5pc21zIG9uIG5ldC1kZXZpY2VzLgorICogMjAwODAwIDoJZml4IGtmcmVlKHNrYikgaW4gcHBwb2VfcmN2IChhY21lKQorICoJCU1vZHVsZSByZWZlcmVuY2UgY291bnQgaXMgZGVjcmVtZW50ZWQgaW4gdGhlIHJpZ2h0IHNwb3Qgbm93LAorICoJCWd1YXJkcyBhZ2FpbnN0IHNvY2tfcHV0IG5vdCBhY3R1YWxseSBmcmVlaW5nIHRoZSBzaworICoJCWluIHBwcG9lX3JlbGVhc2UuCisgKiAwNTEwMDAgOglJbml0aWFsaXphdGlvbiBjbGVhbnVwLgorICogMTExMTAwIDoJRml4IHJlY3Ztc2cuCisgKiAwNTAxMDEgOglGaXggUEFEVCBwcm9jZXNpbmcuCisgKiAxNDA1MDEgOglVc2UgcHBwb2VfcmN2X2NvcmUgdG8gaGFuZGxlIGFsbCBiYWNrbG9nLiAoQWxleGV5KQorICogMTcwNzAxIDoJRG8gbm90IGxvY2tfc29jayB3aXRoIHJ3bG9jayBoZWxkLiAoRGF2ZU0pCisgKgkJSWdub3JlIGRpc2NvdmVyeSBmcmFtZXMgaWYgdXNlciBoYXMgc29ja2V0CisgKgkJbG9ja2VkLiAoRGF2ZU0pCisgKgkJSWdub3JlIHJldHVybiB2YWx1ZSBvZiBkZXZfcXVldWVfeG1pdCBpbiBfX3BwcG9lX3htaXQKKyAqCQlvciBlbHNlIHdlIG1heSBrZnJlZSBhbiBTS0IgdHdpY2UuIChEYXZlTSkKKyAqIDE5MDcwMSA6CVdoZW4gZG9pbmcgY29waWVzIG9mIHNrYidzIGluIF9fcHBwb2VfeG1pdCwgYWx3YXlzIGRlbGV0ZQorICoJCXRoZSBvcmlnaW5hbCBza2IgdGhhdCB3YXMgcGFzc2VkIGluIG9uIHN1Y2Nlc3MsIG5ldmVyIG9uCisgKgkJZmFpbHVyZS4gIERlbGV0ZSB0aGUgY29weSBvZiB0aGUgc2tiIG9uIGZhaWx1cmUgdG8gYXZvaWQKKyAqCQlhIG1lbW9yeSBsZWFrLgorICogMDgxMDAxIDoJTWlzYy4gY2xlYW51cCAobGljZW5jZSBzdHJpbmcsIG5vbi1ibG9ja2luZywgcHJldmVudAorICoJCXJlZmVyZW5jZSBvZiBkZXZpY2Ugb24gY2xvc2UpLgorICogMTIxMzAxIDoJTmV3IHBwcCBjaGFubmVscyBpbnRlcmZhY2U7IGNhbm5vdCB1bnJlZ2lzdGVyIGEgY2hhbm5lbAorICoJCWZyb20gaW50ZXJydXB0cy4gIFRodXMsIHdlIG1hcmsgdGhlIHNvY2tldCBhcyBhIFpPTUJJRQorICoJCWFuZCBkbyB0aGUgdW5yZWdpc3RyYXRpb24gbGF0ZXIuCisgKiAwODEwMDIgOglzZXFfZmlsZSBzdXBwb3J0IGZvciBwcm9jIHN0dWZmIC1hY21lCisgKiAxMTE2MDIgOglNZXJnZSBhbGwgMi40IGZpeGVzIGludG8gMi41LzIuNiB0cmVlLiAgTGFiZWwgMi41LzIuNgorICoJCWFzIHZlcnNpb24gMC43LiAgU3BhY2luZyBjbGVhbnVwLgorICogQXV0aG9yOglNaWNoYWwgT3N0cm93c2tpIDxtb3N0cm93c0BzcGVha2Vhc3kubmV0PgorICogQ29udHJpYnV0b3JzOgorICogCQlBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqCQlEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKgorICogTGljZW5zZToKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwb3guaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfY2hhbm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBQUFBPRV9IQVNIX0JJVFMgNAorI2RlZmluZSBQUFBPRV9IQVNIX1NJWkUgKDE8PFBQUE9FX0hBU0hfQklUUykKKworc3RhdGljIHN0cnVjdCBwcHBfY2hhbm5lbF9vcHMgcHBwb2VfY2hhbl9vcHM7CisKK3N0YXRpYyBpbnQgcHBwb2VfaW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBwcHBvZV94bWl0KHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50IF9fcHBwb2VfeG1pdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBwcHBvZV9vcHM7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhwcHBvZV9oYXNoX2xvY2spOworCitzdGF0aWMgc3RydWN0IHBwcF9jaGFubmVsX29wcyBwcHBvZV9jaGFuX29wczsKKworc3RhdGljIGlubGluZSBpbnQgY21wXzJfYWRkcihzdHJ1Y3QgcHBwb2VfYWRkciAqYSwgc3RydWN0IHBwcG9lX2FkZHIgKmIpCit7CisJcmV0dXJuIChhLT5zaWQgPT0gYi0+c2lkICYmCisJCShtZW1jbXAoYS0+cmVtb3RlLCBiLT5yZW1vdGUsIEVUSF9BTEVOKSA9PSAwKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNtcF9hZGRyKHN0cnVjdCBwcHBvZV9hZGRyICphLCB1bnNpZ25lZCBsb25nIHNpZCwgY2hhciAqYWRkcikKK3sKKwlyZXR1cm4gKGEtPnNpZCA9PSBzaWQgJiYKKwkJKG1lbWNtcChhLT5yZW1vdGUsYWRkcixFVEhfQUxFTikgPT0gMCkpOworfQorCitzdGF0aWMgaW50IGhhc2hfaXRlbSh1bnNpZ25lZCBsb25nIHNpZCwgdW5zaWduZWQgY2hhciAqYWRkcikKK3sKKwljaGFyIGhhc2ggPSAwOworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOIDsgKytpKSB7CisJCWZvciAoaiA9IDA7IGogPCA4L1BQUE9FX0hBU0hfQklUUyA7ICsraikgeworCQkJaGFzaCBePSBhZGRyW2ldID4+ICggaiAqIFBQUE9FX0hBU0hfQklUUyApOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IChzaXplb2YodW5zaWduZWQgbG9uZykqOCkgLyBQUFBPRV9IQVNIX0JJVFMgOyArK2kpCisJCWhhc2ggXj0gc2lkID4+IChpKlBQUE9FX0hBU0hfQklUUyk7CisKKwlyZXR1cm4gaGFzaCAmICggUFBQT0VfSEFTSF9TSVpFIC0gMSApOworfQorCisvKiB6ZXJvZWQgYmVjYXVzZSBpdHMgaW4gLmJzcyAqLworc3RhdGljIHN0cnVjdCBwcHBveF9zb2NrICppdGVtX2hhc2hfdGFibGVbUFBQT0VfSEFTSF9TSVpFXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgU2V0L2dldC9kZWxldGUvcmVoYXNoIGl0ZW1zICAoaW50ZXJuYWwgdmVyc2lvbnMpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHBwcG94X3NvY2sgKl9fZ2V0X2l0ZW0odW5zaWduZWQgbG9uZyBzaWQsIHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJaW50IGhhc2ggPSBoYXNoX2l0ZW0oc2lkLCBhZGRyKTsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcmV0OworCisJcmV0ID0gaXRlbV9oYXNoX3RhYmxlW2hhc2hdOworCisJd2hpbGUgKHJldCAmJiAhY21wX2FkZHIoJnJldC0+cHBwb2VfcGEsIHNpZCwgYWRkcikpCisJCXJldCA9IHJldC0+bmV4dDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19zZXRfaXRlbShzdHJ1Y3QgcHBwb3hfc29jayAqcG8pCit7CisJaW50IGhhc2ggPSBoYXNoX2l0ZW0ocG8tPnBwcG9lX3BhLnNpZCwgcG8tPnBwcG9lX3BhLnJlbW90ZSk7CisJc3RydWN0IHBwcG94X3NvY2sgKnJldDsKKworCXJldCA9IGl0ZW1faGFzaF90YWJsZVtoYXNoXTsKKwl3aGlsZSAocmV0KSB7CisJCWlmIChjbXBfMl9hZGRyKCZyZXQtPnBwcG9lX3BhLCAmcG8tPnBwcG9lX3BhKSkKKwkJCXJldHVybiAtRUFMUkVBRFk7CisKKwkJcmV0ID0gcmV0LT5uZXh0OworCX0KKworCWlmICghcmV0KSB7CisJCXBvLT5uZXh0ID0gaXRlbV9oYXNoX3RhYmxlW2hhc2hdOworCQlpdGVtX2hhc2hfdGFibGVbaGFzaF0gPSBwbzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwcHBveF9zb2NrICpfX2RlbGV0ZV9pdGVtKHVuc2lnbmVkIGxvbmcgc2lkLCBjaGFyICphZGRyKQoreworCWludCBoYXNoID0gaGFzaF9pdGVtKHNpZCwgYWRkcik7CisJc3RydWN0IHBwcG94X3NvY2sgKnJldCwgKipzcmM7CisKKwlyZXQgPSBpdGVtX2hhc2hfdGFibGVbaGFzaF07CisJc3JjID0gJml0ZW1faGFzaF90YWJsZVtoYXNoXTsKKworCXdoaWxlIChyZXQpIHsKKwkJaWYgKGNtcF9hZGRyKCZyZXQtPnBwcG9lX3BhLCBzaWQsIGFkZHIpKSB7CisJCQkqc3JjID0gcmV0LT5uZXh0OworCQkJYnJlYWs7CisJCX0KKworCQlzcmMgPSAmcmV0LT5uZXh0OworCQlyZXQgPSByZXQtPm5leHQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgU2V0L2dldC9kZWxldGUvcmVoYXNoIGl0ZW1zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwcHBveF9zb2NrICpnZXRfaXRlbSh1bnNpZ25lZCBsb25nIHNpZCwKKwkJCQkJIHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJc3RydWN0IHBwcG94X3NvY2sgKnBvOworCisJcmVhZF9sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworCXBvID0gX19nZXRfaXRlbShzaWQsIGFkZHIpOworCWlmIChwbykKKwkJc29ja19ob2xkKHNrX3BwcG94KHBvKSk7CisJcmVhZF91bmxvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisKKwlyZXR1cm4gcG87Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBwcG94X3NvY2sgKmdldF9pdGVtX2J5X2FkZHIoc3RydWN0IHNvY2thZGRyX3BwcG94ICpzcCkKK3sKKwlyZXR1cm4gZ2V0X2l0ZW0oc3AtPnNhX2FkZHIucHBwb2Uuc2lkLCBzcC0+c2FfYWRkci5wcHBvZS5yZW1vdGUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzZXRfaXRlbShzdHJ1Y3QgcHBwb3hfc29jayAqcG8pCit7CisJaW50IGk7CisKKwlpZiAoIXBvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdyaXRlX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisJaSA9IF9fc2V0X2l0ZW0ocG8pOworCXdyaXRlX3VubG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwcHBveF9zb2NrICpkZWxldGVfaXRlbSh1bnNpZ25lZCBsb25nIHNpZCwgY2hhciAqYWRkcikKK3sKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcmV0OworCisJd3JpdGVfbG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKKwlyZXQgPSBfX2RlbGV0ZV9pdGVtKHNpZCwgYWRkcik7CisJd3JpdGVfdW5sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgSGFuZGxlciBmb3IgZGV2aWNlIGV2ZW50cy4KKyAqICBDZXJ0YWluIGRldmljZSBldmVudHMgcmVxdWlyZSB0aGF0IHNvY2tldHMgYmUgdW5jb25uZWN0ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBwcHBvZV9mbHVzaF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaGFzaDsKKworCUJVR19PTihkZXYgPT0gTlVMTCk7CisKKwlyZWFkX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisJZm9yIChoYXNoID0gMDsgaGFzaCA8IFBQUE9FX0hBU0hfU0laRTsgaGFzaCsrKSB7CisJCXN0cnVjdCBwcHBveF9zb2NrICpwbyA9IGl0ZW1faGFzaF90YWJsZVtoYXNoXTsKKworCQl3aGlsZSAocG8gIT0gTlVMTCkgeworCQkJaWYgKHBvLT5wcHBvZV9kZXYgPT0gZGV2KSB7CisJCQkJc3RydWN0IHNvY2sgKnNrID0gc2tfcHBwb3gocG8pOworCisJCQkJc29ja19ob2xkKHNrKTsKKwkJCQlwby0+cHBwb2VfZGV2ID0gTlVMTDsKKworCQkJCS8qIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gU0ssIG5vdyBkcm9wIHRoZQorCQkJCSAqIGhhc2ggdGFibGUgbG9jayBzbyB0aGF0IHdlIG1heSBhdHRlbXB0CisJCQkJICogdG8gbG9jayB0aGUgc29ja2V0ICh3aGljaCBjYW4gc2xlZXApLgorCQkJCSAqLworCQkJCXJlYWRfdW5sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworCisJCQkJbG9ja19zb2NrKHNrKTsKKworCQkJCWlmIChzay0+c2tfc3RhdGUgJgorCQkJCSAgICAoUFBQT1hfQ09OTkVDVEVEIHwgUFBQT1hfQk9VTkQpKSB7CisJCQkJCXBwcG94X3VuYmluZF9zb2NrKHNrKTsKKwkJCQkJZGV2X3B1dChkZXYpOworCQkJCQlzay0+c2tfc3RhdGUgPSBQUFBPWF9aT01CSUU7CisJCQkJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQkJCX0KKworCQkJCXJlbGVhc2Vfc29jayhzayk7CisKKwkJCQlzb2NrX3B1dChzayk7CisKKwkJCQlyZWFkX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisKKwkJCQkvKiBOb3cgcmVzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhpcworCQkJCSAqIGhhc2ggY2hhaW4uICBXZSBhbHdheXMgTlVMTCBvdXQgcHBwb2VfZGV2CisJCQkJICogc28gd2UgYXJlIGd1YXJhbnRlZWQgdG8gbWFrZSBmb3J3YXJkCisJCQkJICogcHJvZ3Jlc3MuCisJCQkJICovCisJCQkJcG8gPSBpdGVtX2hhc2hfdGFibGVbaGFzaF07CisJCQkJY29udGludWU7CisJCQl9CisJCQlwbyA9IHBvLT5uZXh0OworCQl9CisJfQorCXJlYWRfdW5sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworfQorCitzdGF0aWMgaW50IHBwcG9lX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBwdHI7CisKKwkvKiBPbmx5IGxvb2sgYXQgc29ja2V0cyB0aGF0IGFyZSB1c2luZyB0aGlzIHNwZWNpZmljIGRldmljZS4gKi8KKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRERVZfQ0hBTkdFTVRVOgorCQkvKiBBIGNoYW5nZSBpbiBtdHUgaXMgYSBiYWQgdGhpbmcsIHJlcXVpcmluZworCQkgKiBMQ1AgcmUtbmVnb3RpYXRpb24uCisJCSAqLworCisJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKKwljYXNlIE5FVERFVl9ET1dOOgorCQkvKiBGaW5kIGV2ZXJ5IHNvY2tldCBvbiB0aGlzIGRldmljZSBhbmQga2lsbCBpdC4gKi8KKwkJcHBwb2VfZmx1c2hfZGV2KGRldik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBwcG9lX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gcHBwb2VfZGV2aWNlX2V2ZW50LAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRG8gdGhlIHJlYWwgd29yayBvZiByZWNlaXZpbmcgYSBQUFBvRSBTZXNzaW9uIGZyYW1lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHBwb2VfcmN2X2NvcmUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBwcHBveF9zb2NrICpwbyA9IHBwcG94X3NrKHNrKTsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcmVsYXlfcG8gPSBOVUxMOworCisJaWYgKHNrLT5za19zdGF0ZSAmIFBQUE9YX0JPVU5EKSB7CisJCXN0cnVjdCBwcHBvZV9oZHIgKnBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiLT5uaC5yYXc7CisJCWludCBsZW4gPSBudG9ocyhwaC0+bGVuZ3RoKTsKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikpOworCQlza2JfcG9zdHB1bGxfcmNzdW0oc2tiLCBwaCwgc2l6ZW9mKCpwaCkpOworCQlpZiAocHNrYl90cmltX3Jjc3VtKHNrYiwgbGVuKSkKKwkJCWdvdG8gYWJvcnRfa2ZyZWU7CisKKwkJcHBwX2lucHV0KCZwby0+Y2hhbiwgc2tiKTsKKwl9IGVsc2UgaWYgKHNrLT5za19zdGF0ZSAmIFBQUE9YX1JFTEFZKSB7CisJCXJlbGF5X3BvID0gZ2V0X2l0ZW1fYnlfYWRkcigmcG8tPnBwcG9lX3JlbGF5KTsKKworCQlpZiAocmVsYXlfcG8gPT0gTlVMTCkKKwkJCWdvdG8gYWJvcnRfa2ZyZWU7CisKKwkJaWYgKChza19wcHBveChyZWxheV9wbyktPnNrX3N0YXRlICYgUFBQT1hfQ09OTkVDVEVEKSA9PSAwKQorCQkJZ290byBhYm9ydF9wdXQ7CisKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikpOworCQlpZiAoIV9fcHBwb2VfeG1pdChza19wcHBveChyZWxheV9wbyksIHNrYikpCisJCQlnb3RvIGFib3J0X3B1dDsKKwl9IGVsc2UgeworCQlpZiAoc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpKQorCQkJZ290byBhYm9ydF9rZnJlZTsKKwl9CisKKwlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CisKK2Fib3J0X3B1dDoKKwlzb2NrX3B1dChza19wcHBveChyZWxheV9wbykpOworCithYm9ydF9rZnJlZToKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gTkVUX1JYX0RST1A7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZWNlaXZlIHdyYXBwZXIgY2FsbGVkIGluIEJIIGNvbnRleHQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcHBvZV9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQpCisKK3sKKwlzdHJ1Y3QgcHBwb2VfaGRyICpwaDsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG87CisJc3RydWN0IHNvY2sgKnNrOworCWludCByZXQ7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikpKQorCQlnb3RvIGRyb3A7CisKKwlpZiAoIShza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkpIAorCQlnb3RvIG91dDsKKworCXBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiLT5uaC5yYXc7CisKKwlwbyA9IGdldF9pdGVtKCh1bnNpZ25lZCBsb25nKSBwaC0+c2lkLCBldGhfaGRyKHNrYiktPmhfc291cmNlKTsKKwlpZiAoIXBvKSAKKwkJZ290byBkcm9wOworCisJc2sgPSBza19wcHBveChwbyk7CisJYmhfbG9ja19zb2NrKHNrKTsKKworCS8qIFNvY2tldCBzdGF0ZSBpcyB1bmtub3duLCBtdXN0IHB1dCBza2IgaW50byBiYWNrbG9nLiAqLworCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spICE9IDApIHsKKwkJc2tfYWRkX2JhY2tsb2coc2ssIHNrYik7CisJCXJldCA9IE5FVF9SWF9TVUNDRVNTOworCX0gZWxzZSB7CisJCXJldCA9IHBwcG9lX3Jjdl9jb3JlKHNrLCBza2IpOworCX0KKworCWJoX3VubG9ja19zb2NrKHNrKTsKKwlzb2NrX3B1dChzayk7CisKKwlyZXR1cm4gcmV0OworZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKK291dDoKKwlyZXR1cm4gTkVUX1JYX0RST1A7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZWNlaXZlIGEgUFBQb0UgRGlzY292ZXJ5IGZyYW1lLgorICogVGhpcyBpcyBzb2xlbHkgZm9yIGRldGVjdGlvbiBvZiBQQURUIGZyYW1lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHBwb2VfZGlzY19yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IHBhY2tldF90eXBlICpwdCkKKworeworCXN0cnVjdCBwcHBvZV9oZHIgKnBoOworCXN0cnVjdCBwcHBveF9zb2NrICpwbzsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKSkpCisJCWdvdG8gYWJvcnQ7CisKKwlpZiAoIShza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkpIAorCQlnb3RvIG91dDsKKworCXBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiLT5uaC5yYXc7CisJaWYgKHBoLT5jb2RlICE9IFBBRFRfQ09ERSkKKwkJZ290byBhYm9ydDsKKworCXBvID0gZ2V0X2l0ZW0oKHVuc2lnbmVkIGxvbmcpIHBoLT5zaWQsIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UpOworCWlmIChwbykgeworCQlzdHJ1Y3Qgc29jayAqc2sgPSBza19wcHBveChwbyk7CisKKwkJYmhfbG9ja19zb2NrKHNrKTsKKworCQkvKiBJZiB0aGUgdXNlciBoYXMgbG9ja2VkIHRoZSBzb2NrZXQsIGp1c3QgaWdub3JlCisJCSAqIHRoZSBwYWNrZXQuICBXaXRoIHRoZSB3YXkgdHdvIHJjdiBwcm90b2NvbHMgaG9vayBpbnRvCisJCSAqIG9uZSBzb2NrZXQgZmFtaWx5IHR5cGUsIHdlIGNhbm5vdCAoZWFzaWx5KSBkaXN0aW5ndWlzaAorCQkgKiB3aGF0IGtpbmQgb2YgU0tCIGl0IGlzIGR1cmluZyBiYWNrbG9nIHJjdi4KKwkJICovCisJCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spID09IDApIHsKKwkJCS8qIFdlJ3JlIG5vIGxvbmdlciBjb25uZWN0IGF0IHRoZSBQUFBPRSBsYXllciwKKwkJCSAqIGFuZCBtdXN0IHdhaXQgZm9yIHBwcCBjaGFubmVsIHRvIGRpc2Nvbm5lY3QgdXMuCisJCQkgKi8KKwkJCXNrLT5za19zdGF0ZSA9IFBQUE9YX1pPTUJJRTsKKwkJfQorCisJCWJoX3VubG9ja19zb2NrKHNrKTsKKwkJc29ja19wdXQoc2spOworCX0KKworYWJvcnQ6CisJa2ZyZWVfc2tiKHNrYik7CitvdXQ6CisJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOyAvKiBMaWVzLi4uIDotKSAqLworfQorCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIHBwcG9lc19wdHlwZSA9IHsKKwkudHlwZQk9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfUFBQX1NFUyksCisJLmZ1bmMJPSBwcHBvZV9yY3YsCit9OworCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIHBwcG9lZF9wdHlwZSA9IHsKKwkudHlwZQk9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfUFBQX0RJU0MpLAorCS5mdW5jCT0gcHBwb2VfZGlzY19yY3YsCit9OworCitzdGF0aWMgc3RydWN0IHByb3RvIHBwcG9lX3NrX3Byb3RvID0geworCS5uYW1lCSAgPSAiUFBQT0UiLAorCS5vd25lcgkgID0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplID0gc2l6ZW9mKHN0cnVjdCBwcHBveF9zb2NrKSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEluaXRpYWxpemUgYSBuZXcgc3RydWN0IHNvY2suCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHBwcG9lX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCWludCBlcnJvciA9IC1FTk9NRU07CisJc3RydWN0IHNvY2sgKnNrOworCisJc2sgPSBza19hbGxvYyhQRl9QUFBPWCwgR0ZQX0tFUk5FTCwgJnBwcG9lX3NrX3Byb3RvLCAxKTsKKwlpZiAoIXNrKQorCQlnb3RvIG91dDsKKworCXNvY2tfaW5pdF9kYXRhKHNvY2ssIHNrKTsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisJc29jay0+b3BzICAgPSAmcHBwb2Vfb3BzOworCisJc2stPnNrX2JhY2tsb2dfcmN2ID0gcHBwb2VfcmN2X2NvcmU7CisJc2stPnNrX3N0YXRlCSAgID0gUFBQT1hfTk9ORTsKKwlzay0+c2tfdHlwZQkgICA9IFNPQ0tfU1RSRUFNOworCXNrLT5za19mYW1pbHkJICAgPSBQRl9QUFBPWDsKKwlzay0+c2tfcHJvdG9jb2wJICAgPSBQWF9QUk9UT19PRTsKKworCWVycm9yID0gMDsKK291dDoJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHBwcG9lX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG87CisJaW50IGVycm9yID0gMDsKKworCWlmICghc2spCisJCXJldHVybiAwOworCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkKKwkJcmV0dXJuIC1FQkFERjsKKworCXBwcG94X3VuYmluZF9zb2NrKHNrKTsKKworCS8qIFNpZ25hbCB0aGUgZGVhdGggb2YgdGhlIHNvY2tldC4gKi8KKwlzay0+c2tfc3RhdGUgPSBQUFBPWF9ERUFEOworCisJcG8gPSBwcHBveF9zayhzayk7CisJaWYgKHBvLT5wcHBvZV9wYS5zaWQpIHsKKwkJZGVsZXRlX2l0ZW0ocG8tPnBwcG9lX3BhLnNpZCwgcG8tPnBwcG9lX3BhLnJlbW90ZSk7CisJfQorCisJaWYgKHBvLT5wcHBvZV9kZXYpCisJCWRldl9wdXQocG8tPnBwcG9lX2Rldik7CisKKwlwby0+cHBwb2VfZGV2ID0gTlVMTDsKKworCXNvY2tfb3JwaGFuKHNrKTsKKwlzb2NrLT5zayA9IE5VTEw7CisKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlzb2NrX3B1dChzayk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworc3RhdGljIGludCBwcHBvZV9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdXNlcnZhZGRyLAorCQkgIGludCBzb2NrYWRkcl9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3Qgc29ja2FkZHJfcHBwb3ggKnNwID0gKHN0cnVjdCBzb2NrYWRkcl9wcHBveCAqKSB1c2VydmFkZHI7CisJc3RydWN0IHBwcG94X3NvY2sgKnBvID0gcHBwb3hfc2soc2spOworCWludCBlcnJvcjsKKworCWxvY2tfc29jayhzayk7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKHNwLT5zYV9wcm90b2NvbCAhPSBQWF9QUk9UT19PRSkKKwkJZ290byBlbmQ7CisKKwkvKiBDaGVjayBmb3IgYWxyZWFkeSBib3VuZCBzb2NrZXRzICovCisJZXJyb3IgPSAtRUJVU1k7CisJaWYgKChzay0+c2tfc3RhdGUgJiBQUFBPWF9DT05ORUNURUQpICYmIHNwLT5zYV9hZGRyLnBwcG9lLnNpZCkKKwkJZ290byBlbmQ7CisKKwkvKiBDaGVjayBmb3IgYWxyZWFkeSBkaXNjb25uZWN0ZWQgc29ja2V0cywgb24gYXR0ZW1wdHMgdG8gZGlzY29ubmVjdCAqLworCWVycm9yID0gLUVBTFJFQURZOworCWlmICgoc2stPnNrX3N0YXRlICYgUFBQT1hfREVBRCkgJiYgIXNwLT5zYV9hZGRyLnBwcG9lLnNpZCApCisJCWdvdG8gZW5kOworCisJZXJyb3IgPSAwOworCWlmIChwby0+cHBwb2VfcGEuc2lkKSB7CisJCXBwcG94X3VuYmluZF9zb2NrKHNrKTsKKworCQkvKiBEZWxldGUgdGhlIG9sZCBiaW5kaW5nICovCisJCWRlbGV0ZV9pdGVtKHBvLT5wcHBvZV9wYS5zaWQscG8tPnBwcG9lX3BhLnJlbW90ZSk7CisKKwkJaWYocG8tPnBwcG9lX2RldikKKwkJCWRldl9wdXQocG8tPnBwcG9lX2Rldik7CisKKwkJbWVtc2V0KHNrX3BwcG94KHBvKSArIDEsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHBwcG94X3NvY2spIC0gc2l6ZW9mKHN0cnVjdCBzb2NrKSk7CisKKwkJc2stPnNrX3N0YXRlID0gUFBQT1hfTk9ORTsKKwl9CisKKwkvKiBEb24ndCByZS1iaW5kIGlmIHNpZD09MCAqLworCWlmIChzcC0+c2FfYWRkci5wcHBvZS5zaWQgIT0gMCkgeworCQlkZXYgPSBkZXZfZ2V0X2J5X25hbWUoc3AtPnNhX2FkZHIucHBwb2UuZGV2KTsKKworCQllcnJvciA9IC1FTk9ERVY7CisJCWlmICghZGV2KQorCQkJZ290byBlbmQ7CisKKwkJcG8tPnBwcG9lX2RldiA9IGRldjsKKworCQlpZiAoIShkZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJCWdvdG8gZXJyX3B1dDsKKworCQltZW1jcHkoJnBvLT5wcHBvZV9wYSwKKwkJICAgICAgICZzcC0+c2FfYWRkci5wcHBvZSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgcHBwb2VfYWRkcikpOworCisJCWVycm9yID0gc2V0X2l0ZW0ocG8pOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBlcnJfcHV0OworCisJCXBvLT5jaGFuLmhkcmxlbiA9IChzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikgKworCQkJCSAgIGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKworCQlwby0+Y2hhbi5wcml2YXRlID0gc2s7CisJCXBvLT5jaGFuLm9wcyA9ICZwcHBvZV9jaGFuX29wczsKKworCQllcnJvciA9IHBwcF9yZWdpc3Rlcl9jaGFubmVsKCZwby0+Y2hhbik7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyX3B1dDsKKworCQlzay0+c2tfc3RhdGUgPSBQUFBPWF9DT05ORUNURUQ7CisJfQorCisJcG8tPm51bSA9IHNwLT5zYV9hZGRyLnBwcG9lLnNpZDsKKworIGVuZDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnJvcjsKK2Vycl9wdXQ6CisJaWYgKHBvLT5wcHBvZV9kZXYpIHsKKwkJZGV2X3B1dChwby0+cHBwb2VfZGV2KTsKKwkJcG8tPnBwcG9lX2RldiA9IE5VTEw7CisJfQorCWdvdG8gZW5kOworfQorCisKK3N0YXRpYyBpbnQgcHBwb2VfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAorCQkgIGludCAqdXNvY2thZGRyX2xlbiwgaW50IHBlZXIpCit7CisJaW50IGxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfcHBwb3gpOworCXN0cnVjdCBzb2NrYWRkcl9wcHBveCBzcDsKKworCXNwLnNhX2ZhbWlseQk9IEFGX1BQUE9YOworCXNwLnNhX3Byb3RvY29sCT0gUFhfUFJPVE9fT0U7CisJbWVtY3B5KCZzcC5zYV9hZGRyLnBwcG9lLCAmcHBwb3hfc2soc29jay0+c2spLT5wcHBvZV9wYSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBwcHBvZV9hZGRyKSk7CisKKwltZW1jcHkodWFkZHIsICZzcCwgbGVuKTsKKworCSp1c29ja2FkZHJfbGVuID0gbGVuOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcHBvZV9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG8gPSBwcHBveF9zayhzayk7CisJaW50IHZhbCA9IDA7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBQSU9DR01SVToKKwkJZXJyID0gLUVOWElPOworCisJCWlmICghKHNrLT5za19zdGF0ZSAmIFBQUE9YX0NPTk5FQ1RFRCkpCisJCQlicmVhazsKKworCQllcnIgPSAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIocG8tPnBwcG9lX2Rldi0+bXR1IC0KKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpIC0KKwkJCSAgICAgUFBQX0hEUkxFTiwKKwkJCSAgICAgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DU01SVToKKwkJZXJyID0gLUVOWElPOworCQlpZiAoIShzay0+c2tfc3RhdGUgJiBQUFBPWF9DT05ORUNURUQpKQorCQkJYnJlYWs7CisKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKGdldF91c2VyKHZhbCwoaW50IF9fdXNlciAqKSBhcmcpKQorCQkJYnJlYWs7CisKKwkJaWYgKHZhbCA8IChwby0+cHBwb2VfZGV2LT5tdHUKKwkJCSAgIC0gc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpCisJCQkgICAtIFBQUF9IRFJMRU4pKQorCQkJZXJyID0gMDsKKwkJZWxzZQorCQkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ1NGTEFHUzoKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQT0VJT0NTRldEOgorCXsKKwkJc3RydWN0IHBwcG94X3NvY2sgKnJlbGF5X3BvOworCisJCWVyciA9IC1FQlVTWTsKKwkJaWYgKHNrLT5za19zdGF0ZSAmIChQUFBPWF9CT1VORCB8IFBQUE9YX1pPTUJJRSB8IFBQUE9YX0RFQUQpKQorCQkJYnJlYWs7CisKKwkJZXJyID0gLUVOT1RDT05OOworCQlpZiAoIShzay0+c2tfc3RhdGUgJiBQUFBPWF9DT05ORUNURUQpKQorCQkJYnJlYWs7CisKKwkJLyogUFBQb0UgYWRkcmVzcyBmcm9tIHRoZSB1c2VyIHNwZWNpZmllcyBhbiBvdXRib3VuZAorCQkgICBQUFBvRSBhZGRyZXNzIHRvIHdoaWNoIGZyYW1lcyBhcmUgZm9yd2FyZGVkIHRvICovCisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcG8tPnBwcG9lX3JlbGF5LAorCQkJCSAgICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3BwcG94KSkpCisJCQlicmVhazsKKworCQllcnIgPSAtRUlOVkFMOworCQlpZiAocG8tPnBwcG9lX3JlbGF5LnNhX2ZhbWlseSAhPSBBRl9QUFBPWCB8fAorCQkgICAgcG8tPnBwcG9lX3JlbGF5LnNhX3Byb3RvY29sIT0gUFhfUFJPVE9fT0UpCisJCQlicmVhazsKKworCQkvKiBDaGVjayB0aGF0IHRoZSBzb2NrZXQgcmVmZXJlbmNlZCBieSB0aGUgYWRkcmVzcworCQkgICBhY3R1YWxseSBleGlzdHMuICovCisJCXJlbGF5X3BvID0gZ2V0X2l0ZW1fYnlfYWRkcigmcG8tPnBwcG9lX3JlbGF5KTsKKworCQlpZiAoIXJlbGF5X3BvKQorCQkJYnJlYWs7CisKKwkJc29ja19wdXQoc2tfcHBwb3gocmVsYXlfcG8pKTsKKwkJc2stPnNrX3N0YXRlIHw9IFBQUE9YX1JFTEFZOworCQllcnIgPSAwOworCQlicmVhazsKKwl9CisKKwljYXNlIFBQUE9FSU9DREZXRDoKKwkJZXJyID0gLUVBTFJFQURZOworCQlpZiAoIShzay0+c2tfc3RhdGUgJiBQUFBPWF9SRUxBWSkpCisJCQlicmVhazsKKworCQlzay0+c2tfc3RhdGUgJj0gflBQUE9YX1JFTEFZOworCQllcnIgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6OworCX07CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgcHBwb2Vfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIAorCQkgIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCB0b3RhbF9sZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHBwcG94X3NvY2sgKnBvID0gcHBwb3hfc2soc2spOworCWludCBlcnJvciA9IDA7CisJc3RydWN0IHBwcG9lX2hkciBoZHI7CisJc3RydWN0IHBwcG9lX2hkciAqcGg7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwljaGFyICpzdGFydDsKKworCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkgfHwgIShzay0+c2tfc3RhdGUgJiBQUFBPWF9DT05ORUNURUQpKSB7CisJCWVycm9yID0gLUVOT1RDT05OOworCQlnb3RvIGVuZDsKKwl9CisKKwloZHIudmVyID0gMTsKKwloZHIudHlwZSA9IDE7CisJaGRyLmNvZGUgPSAwOworCWhkci5zaWQgPSBwby0+bnVtOworCisJbG9ja19zb2NrKHNrKTsKKworCWRldiA9IHBvLT5wcHBvZV9kZXY7CisKKwllcnJvciA9IC1FTVNHU0laRTsKKyAJaWYgKHRvdGFsX2xlbiA+IChkZXYtPm10dSArIGRldi0+aGFyZF9oZWFkZXJfbGVuKSkKKwkJZ290byBlbmQ7CisKKworCXNrYiA9IHNvY2tfd21hbGxvYyhzaywgdG90YWxfbGVuICsgZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyAzMiwKKwkJCSAgIDAsIEdGUF9LRVJORUwpOworCWlmICghc2tiKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlbmQ7CisJfQorCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgaGVhZGVycy4gKi8KKwlza2JfcmVzZXJ2ZShza2IsIGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKworCXNrYi0+ZGV2ID0gZGV2OworCisJc2tiLT5wcmlvcml0eSA9IHNrLT5za19wcmlvcml0eTsKKwlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9QUFBfU0VTKTsKKworCXBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiX3B1dChza2IsIHRvdGFsX2xlbiArIHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKSk7CisJc3RhcnQgPSAoY2hhciAqKSAmcGgtPnRhZ1swXTsKKworCWVycm9yID0gbWVtY3B5X2Zyb21pb3ZlYyhzdGFydCwgbS0+bXNnX2lvdiwgdG90YWxfbGVuKTsKKworCWlmIChlcnJvciA8IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZW5kOworCX0KKworCWVycm9yID0gdG90YWxfbGVuOworCWRldi0+aGFyZF9oZWFkZXIoc2tiLCBkZXYsIEVUSF9QX1BQUF9TRVMsCisJCQkgcG8tPnBwcG9lX3BhLnJlbW90ZSwgTlVMTCwgdG90YWxfbGVuKTsKKworCW1lbWNweShwaCwgJmhkciwgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpKTsKKworCXBoLT5sZW5ndGggPSBodG9ucyh0b3RhbF9sZW4pOworCisJZGV2X3F1ZXVlX3htaXQoc2tiKTsKKworZW5kOgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycm9yOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB4bWl0IGZ1bmN0aW9uIGZvciBpbnRlcm5hbCB1c2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBfX3BwcG9lX3htaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBwcHBveF9zb2NrICpwbyA9IHBwcG94X3NrKHNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG8tPnBwcG9lX2RldjsKKwlzdHJ1Y3QgcHBwb2VfaGRyIGhkcjsKKwlzdHJ1Y3QgcHBwb2VfaGRyICpwaDsKKwlpbnQgaGVhZHJvb20gPSBza2JfaGVhZHJvb20oc2tiKTsKKwlpbnQgZGF0YV9sZW4gPSBza2ItPmxlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKworCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkgfHwgIShzay0+c2tfc3RhdGUgJiBQUFBPWF9DT05ORUNURUQpKQorCQlnb3RvIGFib3J0OworCisJaGRyLnZlcgk9IDE7CisJaGRyLnR5cGUgPSAxOworCWhkci5jb2RlID0gMDsKKwloZHIuc2lkCT0gcG8tPm51bTsKKwloZHIubGVuZ3RoID0gaHRvbnMoc2tiLT5sZW4pOworCisJaWYgKCFkZXYpCisJCWdvdG8gYWJvcnQ7CisKKwkvKiBDb3B5IHRoZSBza2IgaWYgdGhlcmUgaXMgbm8gc3BhY2UgZm9yIHRoZSBoZWFkZXIuICovCisJaWYgKGhlYWRyb29tIDwgKHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKSArIGRldi0+aGFyZF9oZWFkZXJfbGVuKSkgeworCQlza2IyID0gZGV2X2FsbG9jX3NrYigzMitza2ItPmxlbiArCisJCQkJICAgICBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikgKworCQkJCSAgICAgZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCisJCWlmIChza2IyID09IE5VTEwpCisJCQlnb3RvIGFib3J0OworCisJCXNrYl9yZXNlcnZlKHNrYjIsIGRldi0+aGFyZF9oZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpKTsKKwkJbWVtY3B5KHNrYl9wdXQoc2tiMiwgc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwl9IGVsc2UgeworCQkvKiBNYWtlIGEgY2xvbmUgc28gYXMgdG8gbm90IGRpc3R1cmIgdGhlIG9yaWdpbmFsIHNrYiwKKwkJICogZ2l2ZSBkZXZfcXVldWVfeG1pdCBzb21ldGhpbmcgaXQgY2FuIGZyZWUuCisJCSAqLworCQlza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJfQorCisJcGggPSAoc3RydWN0IHBwcG9lX2hkciAqKSBza2JfcHVzaChza2IyLCBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikpOworCW1lbWNweShwaCwgJmhkciwgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpKTsKKwlza2IyLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfUFBQX1NFUyk7CisKKwlza2IyLT5uaC5yYXcgPSBza2IyLT5kYXRhOworCisJc2tiMi0+ZGV2ID0gZGV2OworCisJZGV2LT5oYXJkX2hlYWRlcihza2IyLCBkZXYsIEVUSF9QX1BQUF9TRVMsCisJCQkgcG8tPnBwcG9lX3BhLnJlbW90ZSwgTlVMTCwgZGF0YV9sZW4pOworCisJLyogV2UncmUgdHJhbnNtaXR0aW5nIHNrYjIsIGFuZCBhc3N1bWluZyB0aGF0IGRldl9xdWV1ZV94bWl0CisJICogd2lsbCBmcmVlIGl0LiAgVGhlIGdlbmVyaWMgcHBwIGxheWVyIGhvd2V2ZXIsIGlzIGV4cGVjdGluZworCSAqIHRoYXQgd2UgZ2l2ZSBiYWNrICdza2InIChub3QgJ3NrYjInKSBpbiBjYXNlIG9mIGZhaWx1cmUsCisJICogYnV0IGZyZWUgaXQgaW4gY2FzZSBvZiBzdWNjZXNzLgorCSAqLworCisJaWYgKGRldl9xdWV1ZV94bWl0KHNrYjIpIDwgMCkKKwkJZ290byBhYm9ydDsKKworCWtmcmVlX3NrYihza2IpOworCXJldHVybiAxOworCithYm9ydDoKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogeG1pdCBmdW5jdGlvbiBjYWxsZWQgYnkgZ2VuZXJpYyBQUFAgZHJpdmVyCisgKiBzZW5kcyBQUFAgZnJhbWUgb3ZlciBQUFBvRSBzb2NrZXQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHBwcG9lX3htaXQoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKSBjaGFuLT5wcml2YXRlOworCXJldHVybiBfX3BwcG9lX3htaXQoc2ssIHNrYik7Cit9CisKKworc3RhdGljIHN0cnVjdCBwcHBfY2hhbm5lbF9vcHMgcHBwb2VfY2hhbl9vcHMgPSB7IAorCS5zdGFydF94bWl0ID0gcHBwb2VfeG1pdCwgCit9OworCitzdGF0aWMgaW50IHBwcG9lX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkgIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCB0b3RhbF9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAwOworCWludCBsZW47CisJc3RydWN0IHBwcG9lX2hkciAqcGggPSBOVUxMOworCisJaWYgKHNrLT5za19zdGF0ZSAmIFBQUE9YX0JPVU5EKSB7CisJCWVycm9yID0gLUVJTzsKKwkJZ290byBlbmQ7CisJfQorCisJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzICYgfk1TR19ET05UV0FJVCwKKwkJCQlmbGFncyAmIE1TR19ET05UV0FJVCwgJmVycm9yKTsKKworCWlmIChlcnJvciA8IDApIHsKKwkJZ290byBlbmQ7CisJfQorCisJbS0+bXNnX25hbWVsZW4gPSAwOworCisJaWYgKHNrYikgeworCQllcnJvciA9IDA7CisJCXBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiLT5uaC5yYXc7CisJCWxlbiA9IG50b2hzKHBoLT5sZW5ndGgpOworCisJCWVycm9yID0gbWVtY3B5X3RvaW92ZWMobS0+bXNnX2lvdiwgKHVuc2lnbmVkIGNoYXIgKikgJnBoLT50YWdbMF0sIGxlbik7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIGRvX3NrYl9mcmVlOworCQllcnJvciA9IGxlbjsKKwl9CisKK2RvX3NrYl9mcmVlOgorCWlmIChza2IpCisJCWtmcmVlX3NrYihza2IpOworZW5kOgorCXJldHVybiBlcnJvcjsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50IHBwcG9lX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBwcHBveF9zb2NrICpwbzsKKwljaGFyICpkZXZfbmFtZTsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHV0cyhzZXEsICJJZCAgICAgICBBZGRyZXNzICAgICAgICAgICAgICBEZXZpY2VcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlwbyA9IHY7CisJZGV2X25hbWUgPSBwby0+cHBwb2VfcGEuZGV2OworCisJc2VxX3ByaW50ZihzZXEsICIlMDhYICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICU4c1xuIiwKKwkJICAgcG8tPnBwcG9lX3BhLnNpZCwKKwkJICAgcG8tPnBwcG9lX3BhLnJlbW90ZVswXSwgcG8tPnBwcG9lX3BhLnJlbW90ZVsxXSwKKwkJICAgcG8tPnBwcG9lX3BhLnJlbW90ZVsyXSwgcG8tPnBwcG9lX3BhLnJlbW90ZVszXSwKKwkJICAgcG8tPnBwcG9lX3BhLnJlbW90ZVs0XSwgcG8tPnBwcG9lX3BhLnJlbW90ZVs1XSwgZGV2X25hbWUpOworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgcHBwb3hfc29jayAqcHBwb2VfZ2V0X2lkeChsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBwcHBveF9zb2NrICpwbyA9IE5VTEw7CisJaW50IGkgPSAwOworCisJZm9yICg7IGkgPCBQUFBPRV9IQVNIX1NJWkU7IGkrKykgeworCQlwbyA9IGl0ZW1faGFzaF90YWJsZVtpXTsKKwkJd2hpbGUgKHBvKSB7CisJCQlpZiAoIXBvcy0tKQorCQkJCWdvdG8gb3V0OworCQkJcG8gPSBwby0+bmV4dDsKKwkJfQorCX0KK291dDoKKwlyZXR1cm4gcG87Cit9CisKK3N0YXRpYyB2b2lkICpwcHBvZV9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCWxvZmZfdCBsID0gKnBvczsKKworCXJlYWRfbG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKKwlyZXR1cm4gbCA/IHBwcG9lX2dldF9pZHgoLS1sKSA6IFNFUV9TVEFSVF9UT0tFTjsKK30KKworc3RhdGljIHZvaWQgKnBwcG9lX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG87CisKKwkrKypwb3M7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXBvID0gcHBwb2VfZ2V0X2lkeCgwKTsKKwkJZ290byBvdXQ7CisJfQorCXBvID0gdjsKKwlpZiAocG8tPm5leHQpIAorCQlwbyA9IHBvLT5uZXh0OworCWVsc2UgeworCQlpbnQgaGFzaCA9IGhhc2hfaXRlbShwby0+cHBwb2VfcGEuc2lkLCBwby0+cHBwb2VfcGEucmVtb3RlKTsKKworCQl3aGlsZSAoKytoYXNoIDwgUFBQT0VfSEFTSF9TSVpFKSB7CisJCQlwbyA9IGl0ZW1faGFzaF90YWJsZVtoYXNoXTsKKwkJCWlmIChwbykKKwkJCQlicmVhazsKKwkJfQorCX0KK291dDoKKwlyZXR1cm4gcG87Cit9CisKK3N0YXRpYyB2b2lkIHBwcG9lX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXJlYWRfdW5sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHBwcG9lX3NlcV9vcHMgPSB7CisJLnN0YXJ0CQk9IHBwcG9lX3NlcV9zdGFydCwKKwkubmV4dAkJPSBwcHBvZV9zZXFfbmV4dCwKKwkuc3RvcAkJPSBwcHBvZV9zZXFfc3RvcCwKKwkuc2hvdwkJPSBwcHBvZV9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgcHBwb2Vfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZwcHBvZV9zZXFfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHBwb2Vfc2VxX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHBwcG9lX3NlcV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcHBvZV9wcm9jX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnA7CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoInBwcG9lIiwgU19JUlVHTywgcHJvY19uZXQpOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwLT5wcm9jX2ZvcHMgPSAmcHBwb2Vfc2VxX2ZvcHM7CisJcmV0dXJuIDA7Cit9CisjZWxzZSAvKiBDT05GSUdfUFJPQ19GUyAqLworc3RhdGljIGlubGluZSBpbnQgcHBwb2VfcHJvY19pbml0KHZvaWQpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisvKiAtPmlvY3RsIGFyZSBzZXQgYXQgcHBwb3hfY3JlYXRlICovCisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHBwcG9lX29wcyA9IHsKKyAgICAuZmFtaWx5CQk9IEFGX1BQUE9YLAorICAgIC5vd25lcgkJPSBUSElTX01PRFVMRSwKKyAgICAucmVsZWFzZQkJPSBwcHBvZV9yZWxlYXNlLAorICAgIC5iaW5kCQk9IHNvY2tfbm9fYmluZCwKKyAgICAuY29ubmVjdAkJPSBwcHBvZV9jb25uZWN0LAorICAgIC5zb2NrZXRwYWlyCQk9IHNvY2tfbm9fc29ja2V0cGFpciwKKyAgICAuYWNjZXB0CQk9IHNvY2tfbm9fYWNjZXB0LAorICAgIC5nZXRuYW1lCQk9IHBwcG9lX2dldG5hbWUsCisgICAgLnBvbGwJCT0gZGF0YWdyYW1fcG9sbCwKKyAgICAubGlzdGVuCQk9IHNvY2tfbm9fbGlzdGVuLAorICAgIC5zaHV0ZG93bgkJPSBzb2NrX25vX3NodXRkb3duLAorICAgIC5zZXRzb2Nrb3B0CQk9IHNvY2tfbm9fc2V0c29ja29wdCwKKyAgICAuZ2V0c29ja29wdAkJPSBzb2NrX25vX2dldHNvY2tvcHQsCisgICAgLnNlbmRtc2cJCT0gcHBwb2Vfc2VuZG1zZywKKyAgICAucmVjdm1zZwkJPSBwcHBvZV9yZWN2bXNnLAorICAgIC5tbWFwCQk9IHNvY2tfbm9fbW1hcAorfTsKKworc3RhdGljIHN0cnVjdCBwcHBveF9wcm90byBwcHBvZV9wcm90byA9IHsKKyAgICAuY3JlYXRlCT0gcHBwb2VfY3JlYXRlLAorICAgIC5pb2N0bAk9IHBwcG9lX2lvY3RsLAorICAgIC5vd25lcgk9IFRISVNfTU9EVUxFLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBwcHBvZV9pbml0KHZvaWQpCit7CisJaW50IGVyciA9IHByb3RvX3JlZ2lzdGVyKCZwcHBvZV9za19wcm90bywgMCk7CisKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworIAllcnIgPSByZWdpc3Rlcl9wcHBveF9wcm90byhQWF9QUk9UT19PRSwgJnBwcG9lX3Byb3RvKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bnJlZ2lzdGVyX3BwcG9lX3Byb3RvOworCisJZXJyID0gcHBwb2VfcHJvY19pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5yZWdpc3Rlcl9wcHBveF9wcm90bzsKKwkKKwlkZXZfYWRkX3BhY2soJnBwcG9lc19wdHlwZSk7CisJZGV2X2FkZF9wYWNrKCZwcHBvZWRfcHR5cGUpOworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcHBwb2Vfbm90aWZpZXIpOworb3V0OgorCXJldHVybiBlcnI7CitvdXRfdW5yZWdpc3Rlcl9wcHBveF9wcm90bzoKKwl1bnJlZ2lzdGVyX3BwcG94X3Byb3RvKFBYX1BST1RPX09FKTsKK291dF91bnJlZ2lzdGVyX3BwcG9lX3Byb3RvOgorCXByb3RvX3VucmVnaXN0ZXIoJnBwcG9lX3NrX3Byb3RvKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBwcG9lX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3BwcG94X3Byb3RvKFBYX1BST1RPX09FKTsKKwlkZXZfcmVtb3ZlX3BhY2soJnBwcG9lc19wdHlwZSk7CisJZGV2X3JlbW92ZV9wYWNrKCZwcHBvZWRfcHR5cGUpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZwcHBvZV9ub3RpZmllcik7CisJcmVtb3ZlX3Byb2NfZW50cnkoInBwcG9lIiwgcHJvY19uZXQpOworCXByb3RvX3VucmVnaXN0ZXIoJnBwcG9lX3NrX3Byb3RvKTsKK30KKworbW9kdWxlX2luaXQocHBwb2VfaW5pdCk7Cittb2R1bGVfZXhpdChwcHBvZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWljaGFsIE9zdHJvd3NraSA8bW9zdHJvd3NAc3BlYWtlYXN5Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUFBQIG92ZXIgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfUFBQT1gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwb3guYyBiL2RyaXZlcnMvbmV0L3BwcG94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxZTExNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BwcG94LmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qKiAtKi0gbGludXgtYyAtKi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpbnV4IFBQUCBvdmVyIFgvRXRoZXJuZXQgKFBQUG9YL1BQUG9FKSBTb2NrZXRzCisgKgorICogUFBQb1ggLS0tIEdlbmVyaWMgUFBQIGVuY2Fwc3VsYXRpb24gc29ja2V0IGZhbWlseQorICogUFBQb0UgLS0tIFBQUCBvdmVyIEV0aGVybmV0IChSRkMgMjUxNikKKyAqCisgKgorICogVmVyc2lvbjoJMC41LjIKKyAqCisgKiBBdXRob3I6CU1pY2hhbCBPc3Ryb3dza2kgPG1vc3Ryb3dzQHNwZWFrZWFzeS5uZXQ+CisgKgorICogMDUxMDAwIDoJSW5pdGlhbGl6YXRpb24gY2xlYW51cAorICoKKyAqIExpY2Vuc2U6CisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wcHBveC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwLmg+CisjaW5jbHVkZSA8bGludXgvcHBwX2NoYW5uZWwuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgc3RydWN0IHBwcG94X3Byb3RvICpwcHBveF9wcm90b3NbUFhfTUFYX1BST1RPICsgMV07CisKK2ludCByZWdpc3Rlcl9wcHBveF9wcm90byhpbnQgcHJvdG9fbnVtLCBzdHJ1Y3QgcHBwb3hfcHJvdG8gKnBwKQoreworCWlmIChwcm90b19udW0gPCAwIHx8IHByb3RvX251bSA+IFBYX01BWF9QUk9UTykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBwcG94X3Byb3Rvc1twcm90b19udW1dKQorCQlyZXR1cm4gLUVBTFJFQURZOworCXBwcG94X3Byb3Rvc1twcm90b19udW1dID0gcHA7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdW5yZWdpc3Rlcl9wcHBveF9wcm90byhpbnQgcHJvdG9fbnVtKQoreworCWlmIChwcm90b19udW0gPj0gMCAmJiBwcm90b19udW0gPD0gUFhfTUFYX1BST1RPKQorCQlwcHBveF9wcm90b3NbcHJvdG9fbnVtXSA9IE5VTEw7Cit9CisKK3ZvaWQgcHBwb3hfdW5iaW5kX3NvY2soc3RydWN0IHNvY2sgKnNrKQoreworCS8qIENsZWFyIGNvbm5lY3Rpb24gdG8gcHBwIGRldmljZSwgaWYgYXR0YWNoZWQuICovCisKKwlpZiAoc2stPnNrX3N0YXRlICYgKFBQUE9YX0JPVU5EIHwgUFBQT1hfWk9NQklFKSkgeworCQlwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKCZwcHBveF9zayhzayktPmNoYW4pOworCQlzay0+c2tfc3RhdGUgPSBQUFBPWF9ERUFEOworCX0KK30KKworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9wcHBveF9wcm90byk7CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfcHBwb3hfcHJvdG8pOworRVhQT1JUX1NZTUJPTChwcHBveF91bmJpbmRfc29jayk7CisKK3N0YXRpYyBpbnQgcHBwb3hfaW9jdGwoc3RydWN0IHNvY2tldCogc29jaywgdW5zaWduZWQgaW50IGNtZCwgCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG8gPSBwcHBveF9zayhzayk7CisJaW50IHJjID0gMDsKKworCWxvY2tfc29jayhzayk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBQSU9DR0NIQU46IHsKKwkJaW50IGluZGV4OworCQlyYyA9IC1FTk9UQ09OTjsKKwkJaWYgKCEoc2stPnNrX3N0YXRlICYgUFBQT1hfQ09OTkVDVEVEKSkKKwkJCWJyZWFrOworCisJCXJjID0gLUVJTlZBTDsKKwkJaW5kZXggPSBwcHBfY2hhbm5lbF9pbmRleCgmcG8tPmNoYW4pOworCQlpZiAocHV0X3VzZXIoaW5kZXggLCAoaW50IF9fdXNlciAqKSBhcmcpKQorCQkJYnJlYWs7CisKKwkJcmMgPSAwOworCQlzay0+c2tfc3RhdGUgfD0gUFBQT1hfQk9VTkQ7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlpZiAocHBwb3hfcHJvdG9zW3NrLT5za19wcm90b2NvbF0tPmlvY3RsKQorCQkJcmMgPSBwcHBveF9wcm90b3Nbc2stPnNrX3Byb3RvY29sXS0+aW9jdGwoc29jaywgY21kLAorCQkJCQkJCQkgIGFyZyk7CisKKwkJYnJlYWs7CisJfTsKKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgcHBwb3hfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlpbnQgcmMgPSAtRVBST1RPVFlQRTsKKworCWlmIChwcm90b2NvbCA8IDAgfHwgcHJvdG9jb2wgPiBQWF9NQVhfUFJPVE8pCisJCWdvdG8gb3V0OworCisJcmMgPSAtRVBST1RPTk9TVVBQT1JUOworCWlmICghcHBwb3hfcHJvdG9zW3Byb3RvY29sXSB8fAorCSAgICAhdHJ5X21vZHVsZV9nZXQocHBwb3hfcHJvdG9zW3Byb3RvY29sXS0+b3duZXIpKQorCQlnb3RvIG91dDsKKworCXJjID0gcHBwb3hfcHJvdG9zW3Byb3RvY29sXS0+Y3JlYXRlKHNvY2spOworCWlmICghcmMpIHsKKwkJLyogV2UgZ2V0IHRvIHNldCB0aGUgaW9jdGwgaGFuZGxlci4gKi8KKwkJLyogRm9yIGV2ZXJ5dGhpbmcgZWxzZSwgcHBwb3ggaXMganVzdCBhIHNoZWxsLiAqLworCQlzb2NrLT5vcHMtPmlvY3RsID0gcHBwb3hfaW9jdGw7CisJfQorCW1vZHVsZV9wdXQocHBwb3hfcHJvdG9zW3Byb3RvY29sXS0+b3duZXIpOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IHBwcG94X3Byb3RvX2ZhbWlseSA9IHsKKwkuZmFtaWx5CT0gUEZfUFBQT1gsCisJLmNyZWF0ZQk9IHBwcG94X2NyZWF0ZSwKKwkub3duZXIJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBwcG94X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc29ja19yZWdpc3RlcigmcHBwb3hfcHJvdG9fZmFtaWx5KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBwcG94X2V4aXQodm9pZCkKK3sKKwlzb2NrX3VucmVnaXN0ZXIoUEZfUFBQT1gpOworfQorCittb2R1bGVfaW5pdChwcHBveF9pbml0KTsKK21vZHVsZV9leGl0KHBwcG94X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaWNoYWwgT3N0cm93c2tpIDxtb3N0cm93c0BzcGVha2Vhc3kubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQUFAgb3ZlciBFdGhlcm5ldCBkcml2ZXIgKGdlbmVyaWMgc29ja2V0IGxheWVyKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcjgxNjkuYyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0ZTRmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKQEAgLTAsMCArMSwyNTIzIEBACisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIHI4MTY5LmM6IEEgUmVhbFRlayBSVEwtODE2OSBHaWdhYml0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXgga2VybmVsIDIuNC54LgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyBIaXN0b3J5OgorIEZlYiAgNCAyMDAyCS0gY3JlYXRlZCBpbml0aWFsbHkgYnkgU2h1Q2hlbiA8c2h1Y2hlbkByZWFsdGVrLmNvbS50dz4uCisgTWF5IDIwIDIwMDIJLSBBZGQgbGluayBzdGF0dXMgZm9yY2UtbW9kZSBhbmQgVEJJIG1vZGUgc3VwcG9ydC4KKyAgICAgICAgMjAwNAktIE1hc3NpdmUgdXBkYXRlcy4gU2VlIGtlcm5lbCBTQ00gc3lzdGVtIGZvciBkZXRhaWxzLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAxLiBbREVQUkVDQVRFRDogdXNlIGV0aHRvb2wgaW5zdGVhZF0gVGhlIG1lZGlhIGNhbiBiZSBmb3JjZWQgaW4gNSBtb2Rlcy4KKwkgQ29tbWFuZDogJ2luc21vZCByODE2OSBtZWRpYSA9IFNFVF9NRURJQScKKwkgRXg6CSAgJ2luc21vZCByODE2OSBtZWRpYSA9IDB4MDQnIHdpbGwgZm9yY2UgUEhZIHRvIG9wZXJhdGUgaW4gMTAwTXBicyBIYWxmLWR1cGxleC4KKwkKKwkgU0VUX01FRElBIGNhbiBiZToKKyAJCV8xMF9IYWxmCT0gMHgwMQorIAkJXzEwX0Z1bGwJPSAweDAyCisgCQlfMTAwX0hhbGYJPSAweDA0CisgCQlfMTAwX0Z1bGwJPSAweDA4CisgCQlfMTAwMF9GdWxsCT0gMHgxMAorICAKKyAgMi4gU3VwcG9ydCBUQkkgbW9kZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1ZFUlNJT04gMS4xCTwyMDAyLzEwLzQ+CisKKwlUaGUgYml0NDowIG9mIE1JSSByZWdpc3RlciA0IGlzIGNhbGxlZCAic2VsZWN0b3IgZmllbGQiLCBhbmQgaGF2ZSB0byBiZQorCTAwMDAxYiB0byBpbmRpY2F0ZSBzdXBwb3J0IG9mIElFRUUgc3RkIDgwMi4zIGR1cmluZyBOV2F5IHByb2Nlc3Mgb2YKKwlleGNoYW5naW5nIExpbmsgQ29kZSBXb3JkIChGTFApLiAKKworVkVSU0lPTiAxLjIJPDIwMDIvMTEvMzA+CisKKwktIExhcmdlIHN0eWxlIGNsZWFudXAKKwktIFVzZSBldGhlcl9jcmMgaW4gc3RvY2sga2VybmVsIChsaW51eC9jcmMzMi5oKQorCS0gQ29weSBtY19maWx0ZXIgc2V0dXAgY29kZSBmcm9tIDgxMzljcAorCSAgKGluY2x1ZGVzIGFuIG9wdGltaXphdGlvbiwgYW5kIGF2b2lkcyBzZXRfYml0IHVzZSkKKworVkVSU0lPTiAxLjZMSwk8MjAwNC8wNC8xND4KKworCS0gTWVyZ2Ugb2YgUmVhbHRlaydzIHZlcnNpb24gMS42CisJLSBDb252ZXJzaW9uIHRvIERNQSBBUEkKKwktIFN1c3BlbmQvcmVzdW1lCisJLSBFbmRpYW5uZXNzCisJLSBNaXNjIFJ4L1R4IGJ1Z3MKKworVkVSU0lPTiAyLjJMSwk8MjAwNS8wMS8yNT4KKworCS0gUlggY3N1bSwgVFggY3N1bS9TRywgVFNPCisJLSBWTEFOCisJLSBiYWJ5ICg8IDcyMDApIEp1bWJvIGZyYW1lcyBzdXBwb3J0CisJLSBNZXJnZSBvZiBSZWFsdGVrJ3MgdmVyc2lvbiAyLjIgKG5ldyBwaHkpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNkZWZpbmUgUlRMODE2OV9WRVJTSU9OICIyLjJMSyIKKyNkZWZpbmUgTU9EVUxFTkFNRSAicjgxNjkiCisjZGVmaW5lIFBGWCBNT0RVTEVOQU1FICI6ICIKKworI2lmZGVmIFJUTDgxNjlfREVCVUcKKyNkZWZpbmUgYXNzZXJ0KGV4cHIpIFwKKyAgICAgICAgaWYoIShleHByKSkgewkJCQkJXAorCSAgICAgICAgcHJpbnRrKCAiQXNzZXJ0aW9uIGZhaWxlZCEgJXMsJXMsJXMsbGluZT0lZFxuIiwJXAorICAgICAgICAJI2V4cHIsX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fKTsJCVwKKyAgICAgICAgfQorI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJncy4uLikJZG8geyBwcmludGsoUEZYIGZtdCwgIyMgYXJncyk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBhc3NlcnQoZXhwcikgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBSVEw4MTY5X0RFQlVHICovCisKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwodHApIFwKKwkodHAtPmRpcnR5X3R4ICsgTlVNX1RYX0RFU0MgLSB0cC0+Y3VyX3R4IC0gMSkKKworI2lmZGVmIENPTkZJR19SODE2OV9OQVBJCisjZGVmaW5lIHJ0bDgxNjlfcnhfc2tiCQkJbmV0aWZfcmVjZWl2ZV9za2IKKyNkZWZpbmUgcnRsODE2OV9yeF9od2FjY2VsX3NrYgkJdmxhbl9od2FjY2VsX3J4CisjZGVmaW5lIHJ0bDgxNjlfcnhfcXVvdGEoY291bnQsIHF1b3RhKQltaW4oY291bnQsIHF1b3RhKQorI2Vsc2UKKyNkZWZpbmUgcnRsODE2OV9yeF9za2IJCQluZXRpZl9yeAorI2RlZmluZSBydGw4MTY5X3J4X2h3YWNjZWxfc2tiCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2IKKyNkZWZpbmUgcnRsODE2OV9yeF9xdW90YShjb3VudCwgcXVvdGEpCWNvdW50CisjZW5kaWYKKworLyogbWVkaWEgb3B0aW9ucyAqLworI2RlZmluZSBNQVhfVU5JVFMgOAorc3RhdGljIGludCBtZWRpYVtNQVhfVU5JVFNdID0geyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfTsKK3N0YXRpYyBpbnQgbnVtX21lZGlhID0gMDsKKworLyogTWF4aW11bSBldmVudHMgKFJ4IHBhY2tldHMsIGV0Yy4pIHRvIGhhbmRsZSBhdCBlYWNoIGludGVycnVwdC4gKi8KK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gMjA7CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gZmlsdGVyICh2cy4gUngtYWxsLW11bHRpY2FzdCkuCisgICBUaGUgUlRMIGNoaXBzIHVzZSBhIDY0IGVsZW1lbnQgaGFzaCB0YWJsZSBiYXNlZCBvbiB0aGUgRXRoZXJuZXQgQ1JDLiAqLworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CisKKy8qIE1BQyBhZGRyZXNzIGxlbmd0aCAqLworI2RlZmluZSBNQUNfQUREUl9MRU4JNgorCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNICTcJLyogNyBtZWFucyBOTyB0aHJlc2hvbGQsIFJ4IGJ1ZmZlciBsZXZlbCBiZWZvcmUgZmlyc3QgUENJIHhmZXIuICovCisjZGVmaW5lIFJYX0RNQV9CVVJTVAk2CS8qIE1heGltdW0gUENJIGJ1cnN0LCAnNicgaXMgMTAyNCAqLworI2RlZmluZSBUWF9ETUFfQlVSU1QJNgkvKiBNYXhpbXVtIFBDSSBidXJzdCwgJzYnIGlzIDEwMjQgKi8KKyNkZWZpbmUgRWFybHlUeFRobGQgCTB4M0YJLyogMHgzRiBtZWFucyBOTyBlYXJseSB0cmFuc21pdCAqLworI2RlZmluZSBSeFBhY2tldE1heFNpemUJMHgzRkU4CS8qIDE2SyAtIDEgLSBFVEhfSExFTiAtIFZMQU4gLSBDUkMuLi4gKi8KKyNkZWZpbmUgU2FmZU10dQkJMHgxYzIwCS8qIC4uLiBhY3R1YWxseSBsaWZlIHN1Y2tzIGJleW9uZCB+N2sgKi8KKyNkZWZpbmUgSW50ZXJGcmFtZUdhcAkweDAzCS8qIDMgbWVhbnMgSW50ZXJGcmFtZUdhcCA9IHRoZSBzaG9ydGVzdCBvbmUgKi8KKworI2RlZmluZSBSODE2OV9SRUdTX1NJWkUJCTI1NgorI2RlZmluZSBSODE2OV9OQVBJX1dFSUdIVAk2NAorI2RlZmluZSBOVU1fVFhfREVTQwk2NAkvKiBOdW1iZXIgb2YgVHggZGVzY3JpcHRvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlVNX1JYX0RFU0MJMjU2CS8qIE51bWJlciBvZiBSeCBkZXNjcmlwdG9yIHJlZ2lzdGVycyAqLworI2RlZmluZSBSWF9CVUZfU0laRQkxNTM2CS8qIFJ4IEJ1ZmZlciBzaXplICovCisjZGVmaW5lIFI4MTY5X1RYX1JJTkdfQllURVMJKE5VTV9UWF9ERVNDICogc2l6ZW9mKHN0cnVjdCBUeERlc2MpKQorI2RlZmluZSBSODE2OV9SWF9SSU5HX0JZVEVTCShOVU1fUlhfREVTQyAqIHNpemVvZihzdHJ1Y3QgUnhEZXNjKSkKKworI2RlZmluZSBSVEw4MTY5X1RYX1RJTUVPVVQJKDYqSFopCisjZGVmaW5lIFJUTDgxNjlfUEhZX1RJTUVPVVQJKDEwKkhaKQorCisvKiB3cml0ZS9yZWFkIE1NSU8gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRMX1c4KHJlZywgdmFsOCkJd3JpdGViICgodmFsOCksIGlvYWRkciArIChyZWcpKQorI2RlZmluZSBSVExfVzE2KHJlZywgdmFsMTYpCXdyaXRldyAoKHZhbDE2KSwgaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9XMzIocmVnLCB2YWwzMikJd3JpdGVsICgodmFsMzIpLCBpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1I4KHJlZykJCXJlYWRiIChpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1IxNihyZWcpCQlyZWFkdyAoaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9SMzIocmVnKQkJKCh1bnNpZ25lZCBsb25nKSByZWFkbCAoaW9hZGRyICsgKHJlZykpKQorCitlbnVtIG1hY192ZXJzaW9uIHsKKwlSVExfR0lHQV9NQUNfVkVSX0IgPSAweDAwLAorCS8qIFJUTF9HSUdBX01BQ19WRVJfQyA9IDB4MDMsICovCisJUlRMX0dJR0FfTUFDX1ZFUl9EID0gMHgwMSwKKwlSVExfR0lHQV9NQUNfVkVSX0UgPSAweDAyLAorCVJUTF9HSUdBX01BQ19WRVJfWCA9IDB4MDQJLyogR3JlYXRlciB0aGFuIFJUTF9HSUdBX01BQ19WRVJfRSAqLworfTsKKworZW51bSBwaHlfdmVyc2lvbiB7CisJUlRMX0dJR0FfUEhZX1ZFUl9DID0gMHgwMywgLyogUEhZIFJlZyAweDAzIGJpdDAtMyA9PSAweDAwMDAgKi8KKwlSVExfR0lHQV9QSFlfVkVSX0QgPSAweDA0LCAvKiBQSFkgUmVnIDB4MDMgYml0MC0zID09IDB4MDAwMCAqLworCVJUTF9HSUdBX1BIWV9WRVJfRSA9IDB4MDUsIC8qIFBIWSBSZWcgMHgwMyBiaXQwLTMgPT0gMHgwMDAwICovCisJUlRMX0dJR0FfUEhZX1ZFUl9GID0gMHgwNiwgLyogUEhZIFJlZyAweDAzIGJpdDAtMyA9PSAweDAwMDEgKi8KKwlSVExfR0lHQV9QSFlfVkVSX0cgPSAweDA3LCAvKiBQSFkgUmVnIDB4MDMgYml0MC0zID09IDB4MDAwMiAqLworCVJUTF9HSUdBX1BIWV9WRVJfSCA9IDB4MDgsIC8qIFBIWSBSZWcgMHgwMyBiaXQwLTMgPT0gMHgwMDAzICovCit9OworCisKKyNkZWZpbmUgX1IoTkFNRSxNQUMsTUFTSykgXAorCXsgLm5hbWUgPSBOQU1FLCAubWFjX3ZlcnNpb24gPSBNQUMsIC5SeENvbmZpZ01hc2sgPSBNQVNLIH0KKworY29uc3Qgc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1OCBtYWNfdmVyc2lvbjsKKwl1MzIgUnhDb25maWdNYXNrOwkvKiBDbGVhcnMgdGhlIGJpdHMgc3VwcG9ydGVkIGJ5IHRoaXMgY2hpcCAqLworfSBydGxfY2hpcF9pbmZvW10gPSB7CisJX1IoIlJUTDgxNjkiLAkJUlRMX0dJR0FfTUFDX1ZFUl9CLCAweGZmN2UxODgwKSwKKwlfUigiUlRMODE2OXMvODExMHMiLAlSVExfR0lHQV9NQUNfVkVSX0QsIDB4ZmY3ZTE4ODApLAorCV9SKCJSVEw4MTY5cy84MTEwcyIsCVJUTF9HSUdBX01BQ19WRVJfRSwgMHhmZjdlMTg4MCksCisJX1IoIlJUTDgxNjlzLzgxMTBzIiwJUlRMX0dJR0FfTUFDX1ZFUl9YLCAweGZmN2UxODgwKSwKK307CisjdW5kZWYgX1IKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0bDgxNjlfcGNpX3RibFtdID0geworCXsweDEwZWMsIDB4ODE2OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJezB4MTE4NiwgMHg0MzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7MCx9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJ0bDgxNjlfcGNpX3RibCk7CisKK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMjAwOworc3RhdGljIGludCB1c2VfZGFjOworCitlbnVtIFJUTDgxNjlfcmVnaXN0ZXJzIHsKKwlNQUMwID0gMCwJCS8qIEV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MuICovCisJTUFSMCA9IDgsCQkvKiBNdWx0aWNhc3QgZmlsdGVyLiAqLworCVR4RGVzY1N0YXJ0QWRkckxvdyA9IDB4MjAsCisJVHhEZXNjU3RhcnRBZGRySGlnaCA9IDB4MjQsCisJVHhIRGVzY1N0YXJ0QWRkckxvdyA9IDB4MjgsCisJVHhIRGVzY1N0YXJ0QWRkckhpZ2ggPSAweDJjLAorCUZMQVNIID0gMHgzMCwKKwlFUlNSID0gMHgzNiwKKwlDaGlwQ21kID0gMHgzNywKKwlUeFBvbGwgPSAweDM4LAorCUludHJNYXNrID0gMHgzQywKKwlJbnRyU3RhdHVzID0gMHgzRSwKKwlUeENvbmZpZyA9IDB4NDAsCisJUnhDb25maWcgPSAweDQ0LAorCVJ4TWlzc2VkID0gMHg0QywKKwlDZmc5MzQ2ID0gMHg1MCwKKwlDb25maWcwID0gMHg1MSwKKwlDb25maWcxID0gMHg1MiwKKwlDb25maWcyID0gMHg1MywKKwlDb25maWczID0gMHg1NCwKKwlDb25maWc0ID0gMHg1NSwKKwlDb25maWc1ID0gMHg1NiwKKwlNdWx0aUludHIgPSAweDVDLAorCVBIWUFSID0gMHg2MCwKKwlUQklDU1IgPSAweDY0LAorCVRCSV9BTkFSID0gMHg2OCwKKwlUQklfTFBBUiA9IDB4NkEsCisJUEhZc3RhdHVzID0gMHg2QywKKwlSeE1heFNpemUgPSAweERBLAorCUNQbHVzQ21kID0gMHhFMCwKKwlJbnRyTWl0aWdhdGUgPSAweEUyLAorCVJ4RGVzY0FkZHJMb3cgPSAweEU0LAorCVJ4RGVzY0FkZHJIaWdoID0gMHhFOCwKKwlFYXJseVR4VGhyZXMgPSAweEVDLAorCUZ1bmNFdmVudCA9IDB4RjAsCisJRnVuY0V2ZW50TWFzayA9IDB4RjQsCisJRnVuY1ByZXNldFN0YXRlID0gMHhGOCwKKwlGdW5jRm9yY2VFdmVudCA9IDB4RkMsCit9OworCitlbnVtIFJUTDgxNjlfcmVnaXN0ZXJfY29udGVudCB7CisJLyogSW50ZXJydXB0U3RhdHVzQml0cyAqLworCVNZU0VyciA9IDB4ODAwMCwKKwlQQ1NUaW1lb3V0ID0gMHg0MDAwLAorCVNXSW50ID0gMHgwMTAwLAorCVR4RGVzY1VuYXZhaWwgPSAweDgwLAorCVJ4RklGT092ZXIgPSAweDQwLAorCUxpbmtDaGcgPSAweDIwLAorCVJ4T3ZlcmZsb3cgPSAweDEwLAorCVR4RXJyID0gMHgwOCwKKwlUeE9LID0gMHgwNCwKKwlSeEVyciA9IDB4MDIsCisJUnhPSyA9IDB4MDEsCisKKwkvKiBSeFN0YXR1c0Rlc2MgKi8KKwlSeFJFUyA9IDB4MDAyMDAwMDAsCisJUnhDUkMgPSAweDAwMDgwMDAwLAorCVJ4UlVOVCA9IDB4MDAxMDAwMDAsCisJUnhSV1QgPSAweDAwNDAwMDAwLAorCisJLyogQ2hpcENtZEJpdHMgKi8KKwlDbWRSZXNldCA9IDB4MTAsCisJQ21kUnhFbmIgPSAweDA4LAorCUNtZFR4RW5iID0gMHgwNCwKKwlSeEJ1ZkVtcHR5ID0gMHgwMSwKKworCS8qIENmZzkzNDZCaXRzICovCisJQ2ZnOTM0Nl9Mb2NrID0gMHgwMCwKKwlDZmc5MzQ2X1VubG9jayA9IDB4QzAsCisKKwkvKiByeF9tb2RlX2JpdHMgKi8KKwlBY2NlcHRFcnIgPSAweDIwLAorCUFjY2VwdFJ1bnQgPSAweDEwLAorCUFjY2VwdEJyb2FkY2FzdCA9IDB4MDgsCisJQWNjZXB0TXVsdGljYXN0ID0gMHgwNCwKKwlBY2NlcHRNeVBoeXMgPSAweDAyLAorCUFjY2VwdEFsbFBoeXMgPSAweDAxLAorCisJLyogUnhDb25maWdCaXRzICovCisJUnhDZmdGSUZPU2hpZnQgPSAxMywKKwlSeENmZ0RNQVNoaWZ0ID0gOCwKKworCS8qIFR4Q29uZmlnQml0cyAqLworCVR4SW50ZXJGcmFtZUdhcFNoaWZ0ID0gMjQsCisJVHhETUFTaGlmdCA9IDgsCS8qIERNQSBidXJzdCB2YWx1ZSAoMC03KSBpcyBzaGlmdCB0aGlzIG1hbnkgYml0cyAqLworCisJLyogVEJJQ1NSIHAuMjggKi8KKwlUQklSZXNldAk9IDB4ODAwMDAwMDAsCisJVEJJTG9vcGJhY2sJPSAweDQwMDAwMDAwLAorCVRCSU53RW5hYmxlCT0gMHgyMDAwMDAwMCwKKwlUQklOd1Jlc3RhcnQJPSAweDEwMDAwMDAwLAorCVRCSUxpbmtPawk9IDB4MDIwMDAwMDAsCisJVEJJTndDb21wbGV0ZQk9IDB4MDEwMDAwMDAsCisKKwkvKiBDUGx1c0NtZCBwLjMxICovCisJUnhWbGFuCQk9ICgxIDw8IDYpLAorCVJ4Q2hrU3VtCT0gKDEgPDwgNSksCisJUENJREFDCQk9ICgxIDw8IDQpLAorCVBDSU11bFJXCT0gKDEgPDwgMyksCisKKwkvKiBydGw4MTY5X1BIWXN0YXR1cyAqLworCVRCSV9FbmFibGUgPSAweDgwLAorCVR4Rmxvd0N0cmwgPSAweDQwLAorCVJ4Rmxvd0N0cmwgPSAweDIwLAorCV8xMDAwYnBzRiA9IDB4MTAsCisJXzEwMGJwcyA9IDB4MDgsCisJXzEwYnBzID0gMHgwNCwKKwlMaW5rU3RhdHVzID0gMHgwMiwKKwlGdWxsRHVwID0gMHgwMSwKKworCS8qIEdJR0FCSVRfUEhZX3JlZ2lzdGVycyAqLworCVBIWV9DVFJMX1JFRyA9IDAsCisJUEhZX1NUQVRfUkVHID0gMSwKKwlQSFlfQVVUT19ORUdPX1JFRyA9IDQsCisJUEhZXzEwMDBfQ1RSTF9SRUcgPSA5LAorCisJLyogR0lHQUJJVF9QSFlfUkVHX0JJVCAqLworCVBIWV9SZXN0YXJ0X0F1dG9fTmVnbyA9IDB4MDIwMCwKKwlQSFlfRW5hYmxlX0F1dG9fTmVnbyA9IDB4MTAwMCwKKworCS8qIFBIWV9TVEFUX1JFRyA9IDEgKi8KKwlQSFlfQXV0b19OZWNvX0NvbXAgPSAweDAwMjAsCisKKwkvKiBQSFlfQVVUT19ORUdPX1JFRyA9IDQgKi8KKwlQSFlfQ2FwXzEwX0hhbGYgPSAweDAwMjAsCisJUEhZX0NhcF8xMF9GdWxsID0gMHgwMDQwLAorCVBIWV9DYXBfMTAwX0hhbGYgPSAweDAwODAsCisJUEhZX0NhcF8xMDBfRnVsbCA9IDB4MDEwMCwKKworCS8qIFBIWV8xMDAwX0NUUkxfUkVHID0gOSAqLworCVBIWV9DYXBfMTAwMF9GdWxsID0gMHgwMjAwLAorCisJUEhZX0NhcF9OdWxsID0gMHgwLAorCisJLyogX01lZGlhVHlwZSAqLworCV8xMF9IYWxmID0gMHgwMSwKKwlfMTBfRnVsbCA9IDB4MDIsCisJXzEwMF9IYWxmID0gMHgwNCwKKwlfMTAwX0Z1bGwgPSAweDA4LAorCV8xMDAwX0Z1bGwgPSAweDEwLAorCisJLyogX1RCSUNTUkJpdCAqLworCVRCSUxpbmtPSyA9IDB4MDIwMDAwMDAsCit9OworCitlbnVtIF9EZXNjU3RhdHVzQml0IHsKKwlEZXNjT3duCQk9ICgxIDw8IDMxKSwgLyogRGVzY3JpcHRvciBpcyBvd25lZCBieSBOSUMgKi8KKwlSaW5nRW5kCQk9ICgxIDw8IDMwKSwgLyogRW5kIG9mIGRlc2NyaXB0b3IgcmluZyAqLworCUZpcnN0RnJhZwk9ICgxIDw8IDI5KSwgLyogRmlyc3Qgc2VnbWVudCBvZiBhIHBhY2tldCAqLworCUxhc3RGcmFnCT0gKDEgPDwgMjgpLCAvKiBGaW5hbCBzZWdtZW50IG9mIGEgcGFja2V0ICovCisKKwkvKiBUeCBwcml2YXRlICovCisJTGFyZ2VTZW5kCT0gKDEgPDwgMjcpLCAvKiBUQ1AgTGFyZ2UgU2VuZCBPZmZsb2FkIChUU08pICovCisJTVNTU2hpZnQJPSAxNiwgICAgICAgIC8qIE1TUyB2YWx1ZSBwb3NpdGlvbiAqLworCU1TU01hc2sJCT0gMHhmZmYsICAgICAvKiBNU1MgdmFsdWUgKyBMYXJnZVNlbmQgYml0OiAxMiBiaXRzICovCisJSVBDUwkJPSAoMSA8PCAxOCksIC8qIENhbGN1bGF0ZSBJUCBjaGVja3N1bSAqLworCVVEUENTCQk9ICgxIDw8IDE3KSwgLyogQ2FsY3VsYXRlIFVEUC9JUCBjaGVja3N1bSAqLworCVRDUENTCQk9ICgxIDw8IDE2KSwgLyogQ2FsY3VsYXRlIFRDUC9JUCBjaGVja3N1bSAqLworCVR4VmxhblRhZwk9ICgxIDw8IDE3KSwgLyogQWRkIFZMQU4gdGFnICovCisKKwkvKiBSeCBwcml2YXRlICovCisJUElEMQkJPSAoMSA8PCAxOCksIC8qIFByb3RvY29sIElEIGJpdCAxLzIgKi8KKwlQSUQwCQk9ICgxIDw8IDE3KSwgLyogUHJvdG9jb2wgSUQgYml0IDIvMiAqLworCisjZGVmaW5lIFJ4UHJvdG9VRFAJKFBJRDEpCisjZGVmaW5lIFJ4UHJvdG9UQ1AJKFBJRDApCisjZGVmaW5lIFJ4UHJvdG9JUAkoUElEMSB8IFBJRDApCisjZGVmaW5lIFJ4UHJvdG9NYXNrCVJ4UHJvdG9JUAorCisJSVBGYWlsCQk9ICgxIDw8IDE2KSwgLyogSVAgY2hlY2tzdW0gZmFpbGVkICovCisJVURQRmFpbAkJPSAoMSA8PCAxNSksIC8qIFVEUC9JUCBjaGVja3N1bSBmYWlsZWQgKi8KKwlUQ1BGYWlsCQk9ICgxIDw8IDE0KSwgLyogVENQL0lQIGNoZWNrc3VtIGZhaWxlZCAqLworCVJ4VmxhblRhZwk9ICgxIDw8IDE2KSwgLyogVkxBTiB0YWcgYXZhaWxhYmxlICovCit9OworCisjZGVmaW5lIFJzdmRNYXNrCTB4M2ZmZmMwMDAKKworc3RydWN0IFR4RGVzYyB7CisJdTMyIG9wdHMxOworCXUzMiBvcHRzMjsKKwl1NjQgYWRkcjsKK307CisKK3N0cnVjdCBSeERlc2MgeworCXUzMiBvcHRzMTsKKwl1MzIgb3B0czI7CisJdTY0IGFkZHI7Cit9OworCitzdHJ1Y3QgcmluZ19pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCXUzMgkJbGVuOworCXU4CQlfX3BhZFtzaXplb2Yodm9pZCAqKSAtIHNpemVvZih1MzIpXTsKK307CisKK3N0cnVjdCBydGw4MTY5X3ByaXZhdGUgeworCXZvaWQgX19pb21lbSAqbW1pb19hZGRyOwkvKiBtZW1vcnkgbWFwIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsJLyogSW5kZXggb2YgUENJIGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBzdGF0aXN0aWNzIG9mIG5ldCBkZXZpY2UgKi8KKwlzcGlubG9ja190IGxvY2s7CQkvKiBzcGluIGxvY2sgZmxhZyAqLworCWludCBjaGlwc2V0OworCWludCBtYWNfdmVyc2lvbjsKKwlpbnQgcGh5X3ZlcnNpb247CisJdTMyIGN1cl9yeDsgLyogSW5kZXggaW50byB0aGUgUnggZGVzY3JpcHRvciBidWZmZXIgb2YgbmV4dCBSeCBwa3QuICovCisJdTMyIGN1cl90eDsgLyogSW5kZXggaW50byB0aGUgVHggZGVzY3JpcHRvciBidWZmZXIgb2YgbmV4dCBSeCBwa3QuICovCisJdTMyIGRpcnR5X3J4OworCXUzMiBkaXJ0eV90eDsKKwlzdHJ1Y3QgVHhEZXNjICpUeERlc2NBcnJheTsJLyogMjU2LWFsaWduZWQgVHggZGVzY3JpcHRvciByaW5nICovCisJc3RydWN0IFJ4RGVzYyAqUnhEZXNjQXJyYXk7CS8qIDI1Ni1hbGlnbmVkIFJ4IGRlc2NyaXB0b3IgcmluZyAqLworCWRtYV9hZGRyX3QgVHhQaHlBZGRyOworCWRtYV9hZGRyX3QgUnhQaHlBZGRyOworCXN0cnVjdCBza19idWZmICpSeF9za2J1ZmZbTlVNX1JYX0RFU0NdOwkvKiBSeCBkYXRhIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgcmluZ19pbmZvIHR4X3NrYltOVU1fVFhfREVTQ107CS8qIFR4IGRhdGEgYnVmZmVycyAqLworCXVuc2lnbmVkIHJ4X2J1Zl9zejsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwl1MTYgY3BfY21kOworCXUxNiBpbnRyX21hc2s7CisJaW50IHBoeV9hdXRvX25lZ29fcmVnOworCWludCBwaHlfMTAwMF9jdHJsX3JlZzsKKyNpZmRlZiBDT05GSUdfUjgxNjlfVkxBTgorCXN0cnVjdCB2bGFuX2dyb3VwICp2bGdycDsKKyNlbmRpZgorCWludCAoKnNldF9zcGVlZCkoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTggYXV0b25lZywgdTE2IHNwZWVkLCB1OCBkdXBsZXgpOworCXZvaWQgKCpnZXRfc2V0dGluZ3MpKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBldGh0b29sX2NtZCAqKTsKKwl2b2lkICgqcGh5X3Jlc2V0X2VuYWJsZSkodm9pZCBfX2lvbWVtICopOworCXVuc2lnbmVkIGludCAoKnBoeV9yZXNldF9wZW5kaW5nKSh2b2lkIF9faW9tZW0gKik7CisJdW5zaWduZWQgaW50ICgqbGlua19vaykodm9pZCBfX2lvbWVtICopOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0YXNrOworfTsKKworTU9EVUxFX0FVVEhPUigiUmVhbHRlayBhbmQgdGhlIExpbnV4IHI4MTY5IGNyZXcgPG5ldGRldkBvc3Muc2dpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVhbFRlayBSVEwtODE2OSBHaWdhYml0IEV0aGVybmV0IGRyaXZlciIpOworbW9kdWxlX3BhcmFtX2FycmF5KG1lZGlhLCBpbnQsICZudW1fbWVkaWEsIDApOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh1c2VfZGFjLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh1c2VfZGFjLCAiRW5hYmxlIFBDSSBEQUMuIFVuc2FmZSBvbiAzMiBiaXQgUENJIHNsb3QuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihSVEw4MTY5X1ZFUlNJT04pOworCitzdGF0aWMgaW50IHJ0bDgxNjlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcnRsODE2OV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHJ0bDgxNjlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwKKwkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgcnRsODE2OV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBydGw4MTY5X2h3X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBydGw4MTY5X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcnRsODE2OV9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnRsODE2OV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgaW50IHJ0bDgxNjlfcnhfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKiwKKwkJCQl2b2lkIF9faW9tZW0gKik7CitzdGF0aWMgaW50IHJ0bDgxNjlfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSk7CitzdGF0aWMgdm9pZCBydGw4MTY5X2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNpZmRlZiBDT05GSUdfUjgxNjlfTkFQSQorc3RhdGljIGludCBydGw4MTY5X3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCB1MTYgcnRsODE2OV9pbnRyX21hc2sgPQorCVNZU0VyciB8IExpbmtDaGcgfCBSeE92ZXJmbG93IHwgUnhGSUZPT3ZlciB8IFR4RXJyIHwgVHhPSyB8IFJ4RXJyIHwgUnhPSzsKK3N0YXRpYyBjb25zdCB1MTYgcnRsODE2OV9uYXBpX2V2ZW50ID0KKwlSeE9LIHwgUnhPdmVyZmxvdyB8IFJ4RklGT092ZXIgfCBUeE9LIHwgVHhFcnI7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ0bDgxNjlfcnhfY29uZmlnID0KKyAgICAoUlhfRklGT19USFJFU0ggPDwgUnhDZmdGSUZPU2hpZnQpIHwgKFJYX0RNQV9CVVJTVCA8PCBSeENmZ0RNQVNoaWZ0KTsKKworI2RlZmluZSBQSFlfQ2FwXzEwX0hhbGZfT3JfTGVzcyBQSFlfQ2FwXzEwX0hhbGYKKyNkZWZpbmUgUEhZX0NhcF8xMF9GdWxsX09yX0xlc3MgUEhZX0NhcF8xMF9GdWxsIHwgUEhZX0NhcF8xMF9IYWxmX09yX0xlc3MKKyNkZWZpbmUgUEhZX0NhcF8xMDBfSGFsZl9Pcl9MZXNzIFBIWV9DYXBfMTAwX0hhbGYgfCBQSFlfQ2FwXzEwX0Z1bGxfT3JfTGVzcworI2RlZmluZSBQSFlfQ2FwXzEwMF9GdWxsX09yX0xlc3MgUEhZX0NhcF8xMDBfRnVsbCB8IFBIWV9DYXBfMTAwX0hhbGZfT3JfTGVzcworCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgUmVnQWRkciwgaW50IHZhbHVlKQoreworCWludCBpOworCisJUlRMX1czMihQSFlBUiwgMHg4MDAwMDAwMCB8IChSZWdBZGRyICYgMHhGRikgPDwgMTYgfCB2YWx1ZSk7CisJdWRlbGF5KDEwMDApOworCisJZm9yIChpID0gMjAwMDsgaSA+IDA7IGktLSkgeworCQkvKiBDaGVjayBpZiB0aGUgUlRMODE2OSBoYXMgY29tcGxldGVkIHdyaXRpbmcgdG8gdGhlIHNwZWNpZmllZCBNSUkgcmVnaXN0ZXIgKi8KKwkJaWYgKCEoUlRMX1IzMihQSFlBUikgJiAweDgwMDAwMDAwKSkgCisJCQlicmVhazsKKwkJdWRlbGF5KDEwMCk7CisJfQorfQorCitzdGF0aWMgaW50IG1kaW9fcmVhZCh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IFJlZ0FkZHIpCit7CisJaW50IGksIHZhbHVlID0gLTE7CisKKwlSVExfVzMyKFBIWUFSLCAweDAgfCAoUmVnQWRkciAmIDB4RkYpIDw8IDE2KTsKKwl1ZGVsYXkoMTAwMCk7CisKKwlmb3IgKGkgPSAyMDAwOyBpID4gMDsgaS0tKSB7CisJCS8qIENoZWNrIGlmIHRoZSBSVEw4MTY5IGhhcyBjb21wbGV0ZWQgcmV0cmlldmluZyBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBNSUkgcmVnaXN0ZXIgKi8KKwkJaWYgKFJUTF9SMzIoUEhZQVIpICYgMHg4MDAwMDAwMCkgeworCQkJdmFsdWUgPSAoaW50KSAoUlRMX1IzMihQSFlBUikgJiAweEZGRkYpOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwMCk7CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9pcnFfbWFza19hbmRfYWNrKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCVJUTF9XMTYoSW50ck1hc2ssIDB4MDAwMCk7CisKKwlSVExfVzE2KEludHJTdGF0dXMsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfYXNpY19kb3duKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCVJUTF9XOChDaGlwQ21kLCAweDAwKTsKKwlydGw4MTY5X2lycV9tYXNrX2FuZF9hY2soaW9hZGRyKTsKKwlSVExfUjE2KENQbHVzQ21kKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBydGw4MTY5X3RiaV9yZXNldF9wZW5kaW5nKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXJldHVybiBSVExfUjMyKFRCSUNTUikgJiBUQklSZXNldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBydGw4MTY5X3htaWlfcmVzZXRfcGVuZGluZyh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlyZXR1cm4gbWRpb19yZWFkKGlvYWRkciwgMCkgJiAweDgwMDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnRsODE2OV90YmlfbGlua19vayh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlyZXR1cm4gUlRMX1IzMihUQklDU1IpICYgVEJJTGlua09rOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJ0bDgxNjlfeG1paV9saW5rX29rKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXJldHVybiBSVExfUjgoUEhZc3RhdHVzKSAmIExpbmtTdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfdGJpX3Jlc2V0X2VuYWJsZSh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlSVExfVzMyKFRCSUNTUiwgUlRMX1IzMihUQklDU1IpIHwgVEJJUmVzZXQpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3htaWlfcmVzZXRfZW5hYmxlKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwl2YWwgPSAobWRpb19yZWFkKGlvYWRkciwgUEhZX0NUUkxfUkVHKSB8IDB4ODAwMCkgJiAweGZmZmY7CisJbWRpb193cml0ZShpb2FkZHIsIFBIWV9DVFJMX1JFRywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9jaGVja19saW5rX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLCB2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisJaWYgKHRwLT5saW5rX29rKGlvYWRkcikpIHsKKwkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IGxpbmsgdXBcbiIsIGRldi0+bmFtZSk7CisJfSBlbHNlCisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9saW5rX29wdGlvbihpbnQgaWR4LCB1OCAqYXV0b25lZywgdTE2ICpzcGVlZCwgdTggKmR1cGxleCkKK3sKKwlzdHJ1Y3QgeworCQl1MTYgc3BlZWQ7CisJCXU4IGR1cGxleDsKKwkJdTggYXV0b25lZzsKKwkJdTggbWVkaWE7CisJfSBsaW5rX3NldHRpbmdzW10gPSB7CisJCXsgU1BFRURfMTAsCURVUExFWF9IQUxGLCBBVVRPTkVHX0RJU0FCTEUsCV8xMF9IYWxmIH0sCisJCXsgU1BFRURfMTAsCURVUExFWF9GVUxMLCBBVVRPTkVHX0RJU0FCTEUsCV8xMF9GdWxsIH0sCisJCXsgU1BFRURfMTAwLAlEVVBMRVhfSEFMRiwgQVVUT05FR19ESVNBQkxFLAlfMTAwX0hhbGYgfSwKKwkJeyBTUEVFRF8xMDAsCURVUExFWF9GVUxMLCBBVVRPTkVHX0RJU0FCTEUsCV8xMDBfRnVsbCB9LAorCQl7IFNQRUVEXzEwMDAsCURVUExFWF9GVUxMLCBBVVRPTkVHX0RJU0FCTEUsCV8xMDAwX0Z1bGwgfSwKKwkJLyogTWFrZSBUQkkgaGFwcHkgKi8KKwkJeyBTUEVFRF8xMDAwLAlEVVBMRVhfRlVMTCwgQVVUT05FR19FTkFCTEUsCTB4ZmYgfQorCX0sICpwOworCXVuc2lnbmVkIGNoYXIgb3B0aW9uOworCQorCW9wdGlvbiA9ICgoaWR4IDwgTUFYX1VOSVRTKSAmJiAoaWR4ID49IDApKSA/IG1lZGlhW2lkeF0gOiAweGZmOworCisJaWYgKChvcHRpb24gIT0gMHhmZikgJiYgIWlkeCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIm1lZGlhIG9wdGlvbiBpcyBkZXByZWNhdGVkLlxuIik7CisKKwlmb3IgKHAgPSBsaW5rX3NldHRpbmdzOyBwLT5tZWRpYSAhPSAweGZmOyBwKyspIHsKKwkJaWYgKHAtPm1lZGlhID09IG9wdGlvbikKKwkJCWJyZWFrOworCX0KKwkqYXV0b25lZyA9IHAtPmF1dG9uZWc7CisJKnNwZWVkID0gcC0+c3BlZWQ7CisJKmR1cGxleCA9IHAtPmR1cGxleDsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgTU9EVUxFTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIFJUTDgxNjlfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZSh0cC0+cGNpX2RldikpOworfQorCitzdGF0aWMgaW50IHJ0bDgxNjlfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIFI4MTY5X1JFR1NfU0laRTsKK30KKworc3RhdGljIGludCBydGw4MTY5X3NldF9zcGVlZF90Ymkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgdTggYXV0b25lZywgdTE2IHNwZWVkLCB1OCBkdXBsZXgpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgcmVnOworCisJcmVnID0gUlRMX1IzMihUQklDU1IpOworCWlmICgoYXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUpICYmIChzcGVlZCA9PSBTUEVFRF8xMDAwKSAmJgorCSAgICAoZHVwbGV4ID09IERVUExFWF9GVUxMKSkgeworCQlSVExfVzMyKFRCSUNTUiwgcmVnICYgfihUQklOd0VuYWJsZSB8IFRCSU53UmVzdGFydCkpOworCX0gZWxzZSBpZiAoYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkKKwkJUlRMX1czMihUQklDU1IsIHJlZyB8IFRCSU53RW5hYmxlIHwgVEJJTndSZXN0YXJ0KTsKKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJICAgICAgICIlczogaW5jb3JyZWN0IHNwZWVkIHNldHRpbmcgcmVmdXNlZCBpbiBUQkkgbW9kZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9zZXRfc3BlZWRfeG1paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgdTggYXV0b25lZywgdTE2IHNwZWVkLCB1OCBkdXBsZXgpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgYXV0b19uZWdvLCBnaWdhX2N0cmw7CisKKwlhdXRvX25lZ28gPSBtZGlvX3JlYWQoaW9hZGRyLCBQSFlfQVVUT19ORUdPX1JFRyk7CisJYXV0b19uZWdvICY9IH4oUEhZX0NhcF8xMF9IYWxmIHwgUEhZX0NhcF8xMF9GdWxsIHwKKwkJICAgICAgIFBIWV9DYXBfMTAwX0hhbGYgfCBQSFlfQ2FwXzEwMF9GdWxsKTsKKwlnaWdhX2N0cmwgPSBtZGlvX3JlYWQoaW9hZGRyLCBQSFlfMTAwMF9DVFJMX1JFRyk7CisJZ2lnYV9jdHJsICY9IH4oUEhZX0NhcF8xMDAwX0Z1bGwgfCBQSFlfQ2FwX051bGwpOworCisJaWYgKGF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJYXV0b19uZWdvIHw9IChQSFlfQ2FwXzEwX0hhbGYgfCBQSFlfQ2FwXzEwX0Z1bGwgfAorCQkJICAgICAgUEhZX0NhcF8xMDBfSGFsZiB8IFBIWV9DYXBfMTAwX0Z1bGwpOworCQlnaWdhX2N0cmwgfD0gUEhZX0NhcF8xMDAwX0Z1bGw7CisJfSBlbHNlIHsKKwkJaWYgKHNwZWVkID09IFNQRUVEXzEwKQorCQkJYXV0b19uZWdvIHw9IFBIWV9DYXBfMTBfSGFsZiB8IFBIWV9DYXBfMTBfRnVsbDsKKwkJZWxzZSBpZiAoc3BlZWQgPT0gU1BFRURfMTAwKQorCQkJYXV0b19uZWdvIHw9IFBIWV9DYXBfMTAwX0hhbGYgfCBQSFlfQ2FwXzEwMF9GdWxsOworCQllbHNlIGlmIChzcGVlZCA9PSBTUEVFRF8xMDAwKQorCQkJZ2lnYV9jdHJsIHw9IFBIWV9DYXBfMTAwMF9GdWxsOworCisJCWlmIChkdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCQlhdXRvX25lZ28gJj0gfihQSFlfQ2FwXzEwX0Z1bGwgfCBQSFlfQ2FwXzEwMF9GdWxsKTsKKwl9CisKKwl0cC0+cGh5X2F1dG9fbmVnb19yZWcgPSBhdXRvX25lZ287CisJdHAtPnBoeV8xMDAwX2N0cmxfcmVnID0gZ2lnYV9jdHJsOworCisJbWRpb193cml0ZShpb2FkZHIsIFBIWV9BVVRPX05FR09fUkVHLCBhdXRvX25lZ28pOworCW1kaW9fd3JpdGUoaW9hZGRyLCBQSFlfMTAwMF9DVFJMX1JFRywgZ2lnYV9jdHJsKTsKKwltZGlvX3dyaXRlKGlvYWRkciwgUEhZX0NUUkxfUkVHLCBQSFlfRW5hYmxlX0F1dG9fTmVnbyB8CisJCQkJCSBQSFlfUmVzdGFydF9BdXRvX05lZ28pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0bDgxNjlfc2V0X3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHU4IGF1dG9uZWcsIHUxNiBzcGVlZCwgdTggZHVwbGV4KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gdHAtPnNldF9zcGVlZChkZXYsIGF1dG9uZWcsIHNwZWVkLCBkdXBsZXgpOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiAodHAtPnBoeV8xMDAwX2N0cmxfcmVnICYgUEhZX0NhcF8xMDAwX0Z1bGwpKQorCQltb2RfdGltZXIoJnRwLT50aW1lciwgamlmZmllcyArIFJUTDgxNjlfUEhZX1RJTUVPVVQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBydGw4MTY5X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gcnRsODE2OV9zZXRfc3BlZWQoZGV2LCBjbWQtPmF1dG9uZWcsIGNtZC0+c3BlZWQsIGNtZC0+ZHVwbGV4KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgcnRsODE2OV9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiB0cC0+Y3BfY21kICYgUnhDaGtTdW07Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChkYXRhKQorCQl0cC0+Y3BfY21kIHw9IFJ4Q2hrU3VtOworCWVsc2UKKwkJdHAtPmNwX2NtZCAmPSB+UnhDaGtTdW07CisKKwlSVExfVzE2KENQbHVzQ21kLCB0cC0+Y3BfY21kKTsKKwlSVExfUjE2KENQbHVzQ21kKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19SODE2OV9WTEFOCisKK3N0YXRpYyBpbmxpbmUgdTMyIHJ0bDgxNjlfdHhfdmxhbl90YWcoc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHRwLT52bGdycCAmJiB2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpID8KKwkJVHhWbGFuVGFnIHwgc3dhYjE2KHZsYW5fdHhfdGFnX2dldChza2IpKSA6IDB4MDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwl0cC0+dmxncnAgPSBncnA7CisJaWYgKHRwLT52bGdycCkKKwkJdHAtPmNwX2NtZCB8PSBSeFZsYW47CisJZWxzZQorCQl0cC0+Y3BfY21kICY9IH5SeFZsYW47CisJUlRMX1cxNihDUGx1c0NtZCwgdHAtPmNwX2NtZCk7CisJUlRMX1IxNihDUGx1c0NtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCWlmICh0cC0+dmxncnApCisJCXRwLT52bGdycC0+dmxhbl9kZXZpY2VzW3ZpZF0gPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9yeF92bGFuX3NrYihzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwgc3RydWN0IFJ4RGVzYyAqZGVzYywKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUzMiBvcHRzMiA9IGxlMzJfdG9fY3B1KGRlc2MtPm9wdHMyKTsKKwlpbnQgcmV0OworCisJaWYgKHRwLT52bGdycCAmJiAob3B0czIgJiBSeFZsYW5UYWcpKSB7CisJCXJ0bDgxNjlfcnhfaHdhY2NlbF9za2Ioc2tiLCB0cC0+dmxncnAsCisJCQkJICAgICAgIHN3YWIxNihvcHRzMiAmIDB4ZmZmZikpOworCQlyZXQgPSAwOworCX0gZWxzZQorCQlyZXQgPSAtMTsKKwlkZXNjLT5vcHRzMiA9IDA7CisJcmV0dXJuIHJldDsKK30KKworI2Vsc2UgLyogIUNPTkZJR19SODE2OV9WTEFOICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIHJ0bDgxNjlfdHhfdmxhbl90YWcoc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGw4MTY5X3J4X3ZsYW5fc2tiKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLCBzdHJ1Y3QgUnhEZXNjICpkZXNjLAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIC0xOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQgcnRsODE2OV9nc2V0X3RiaShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXUzMiBzdGF0dXM7CisKKwljbWQtPnN1cHBvcnRlZCA9CisJCVNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX0ZJQlJFOworCWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7CisJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisKKwlzdGF0dXMgPSBSVExfUjMyKFRCSUNTUik7CisJY21kLT5hZHZlcnRpc2luZyA9IChzdGF0dXMgJiBUQklOd0VuYWJsZSkgPyAgQURWRVJUSVNFRF9BdXRvbmVnIDogMDsKKwljbWQtPmF1dG9uZWcgPSAhIShzdGF0dXMgJiBUQklOd0VuYWJsZSk7CisKKwljbWQtPnNwZWVkID0gU1BFRURfMTAwMDsKKwljbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOyAvKiBBbHdheXMgc2V0ICovCit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfZ3NldF94bWlpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdTggc3RhdHVzOworCisJY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJCSBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8CisJCQkgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCQkJIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkgU1VQUE9SVEVEX0F1dG9uZWcgfAorCQkgICAgICAgICBTVVBQT1JURURfVFA7CisKKwljbWQtPmF1dG9uZWcgPSAxOworCWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEX1RQIHwgQURWRVJUSVNFRF9BdXRvbmVnOworCisJaWYgKHRwLT5waHlfYXV0b19uZWdvX3JlZyAmIFBIWV9DYXBfMTBfSGFsZikKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZjsKKwlpZiAodHAtPnBoeV9hdXRvX25lZ29fcmVnICYgUEhZX0NhcF8xMF9GdWxsKQorCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsOworCWlmICh0cC0+cGh5X2F1dG9fbmVnb19yZWcgJiBQSFlfQ2FwXzEwMF9IYWxmKQorCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKKwlpZiAodHAtPnBoeV9hdXRvX25lZ29fcmVnICYgUEhZX0NhcF8xMDBfRnVsbCkKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7CisJaWYgKHRwLT5waHlfMTAwMF9jdHJsX3JlZyAmIFBIWV9DYXBfMTAwMF9GdWxsKQorCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7CisKKwlzdGF0dXMgPSBSVExfUjgoUEhZc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiBfMTAwMGJwc0YpCisJCWNtZC0+c3BlZWQgPSBTUEVFRF8xMDAwOworCWVsc2UgaWYgKHN0YXR1cyAmIF8xMDBicHMpCisJCWNtZC0+c3BlZWQgPSBTUEVFRF8xMDA7CisJZWxzZSBpZiAoc3RhdHVzICYgXzEwYnBzKQorCQljbWQtPnNwZWVkID0gU1BFRURfMTA7CisKKwljbWQtPmR1cGxleCA9ICgoc3RhdHVzICYgXzEwMDBicHNGKSB8fCAoc3RhdHVzICYgRnVsbER1cCkpID8KKwkJICAgICAgRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKK30KKworc3RhdGljIGludCBydGw4MTY5X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJdHAtPmdldF9zZXR0aW5ncyhkZXYsIGNtZCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsCisJCQkgICAgIHZvaWQgKnApCit7CisgICAgICAgIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBpZiAocmVncy0+bGVuID4gUjgxNjlfUkVHU19TSVpFKQorICAgICAgICAJcmVncy0+bGVuID0gUjgxNjlfUkVHU19TSVpFOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworICAgICAgICBtZW1jcHlfZnJvbWlvKHAsIHRwLT5tbWlvX2FkZHIsIHJlZ3MtPmxlbik7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgcnRsODE2OV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gcnRsODE2OV9nZXRfZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuCQk9IHJ0bDgxNjlfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfc2V0dGluZ3MJCT0gcnRsODE2OV9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBydGw4MTY5X3NldF9zZXR0aW5ncywKKwkuZ2V0X3J4X2NzdW0JCT0gcnRsODE2OV9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0JCT0gcnRsODE2OV9zZXRfcnhfY3N1bSwKKwkuZ2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKKwkuc2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3RzbwkJPSBldGh0b29sX29wX2dldF90c28sCisJLnNldF90c28JCT0gZXRodG9vbF9vcF9zZXRfdHNvLAorCS5nZXRfcmVncwkJPSBydGw4MTY5X2dldF9yZWdzLAorfTsKKworc3RhdGljIHZvaWQgcnRsODE2OV93cml0ZV9nbWlpX3JlZ19iaXQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCByZWcsIGludCBiaXRudW0sCisJCQkJICAgICAgIGludCBiaXR2YWwpCit7CisJaW50IHZhbDsKKworCXZhbCA9IG1kaW9fcmVhZChpb2FkZHIsIHJlZyk7CisJdmFsID0gKGJpdHZhbCA9PSAxKSA/CisJCXZhbCB8IChiaXR2YWwgPDwgYml0bnVtKSA6ICB2YWwgJiB+KDB4MDAwMSA8PCBiaXRudW0pOworCW1kaW9fd3JpdGUoaW9hZGRyLCByZWcsIHZhbCAmIDB4ZmZmZik7IAorfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X2dldF9tYWNfdmVyc2lvbihzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwgdm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJY29uc3Qgc3RydWN0IHsKKwkJdTMyIG1hc2s7CisJCWludCBtYWNfdmVyc2lvbjsKKwl9IG1hY19pbmZvW10gPSB7CisJCXsgMHgxIDw8IDI4LAlSVExfR0lHQV9NQUNfVkVSX1ggfSwKKwkJeyAweDEgPDwgMjYsCVJUTF9HSUdBX01BQ19WRVJfRSB9LAorCQl7IDB4MSA8PCAyMywJUlRMX0dJR0FfTUFDX1ZFUl9EIH0sIAorCQl7IDB4MDAwMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfQiB9IC8qIENhdGNoLWFsbCAqLworCX0sICpwID0gbWFjX2luZm87CisJdTMyIHJlZzsKKworCXJlZyA9IFJUTF9SMzIoVHhDb25maWcpICYgMHg3YzgwMDAwMDsKKwl3aGlsZSAoKHJlZyAmIHAtPm1hc2spICE9IHAtPm1hc2spCisJCXArKzsKKwl0cC0+bWFjX3ZlcnNpb24gPSBwLT5tYWNfdmVyc2lvbjsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9wcmludF9tYWNfdmVyc2lvbihzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3sKKwlzdHJ1Y3QgeworCQlpbnQgdmVyc2lvbjsKKwkJY2hhciAqbXNnOworCX0gbWFjX3ByaW50W10gPSB7CisJCXsgUlRMX0dJR0FfTUFDX1ZFUl9FLCAiUlRMX0dJR0FfTUFDX1ZFUl9FIiB9LAorCQl7IFJUTF9HSUdBX01BQ19WRVJfRCwgIlJUTF9HSUdBX01BQ19WRVJfRCIgfSwKKwkJeyBSVExfR0lHQV9NQUNfVkVSX0IsICJSVExfR0lHQV9NQUNfVkVSX0IiIH0sCisJCXsgMCwgTlVMTCB9CisJfSwgKnA7CisKKwlmb3IgKHAgPSBtYWNfcHJpbnQ7IHAtPm1zZzsgcCsrKSB7CisJCWlmICh0cC0+bWFjX3ZlcnNpb24gPT0gcC0+dmVyc2lvbikgeworCQkJZHByaW50aygibWFjX3ZlcnNpb24gPT0gJXMgKCUwNGQpXG4iLCBwLT5tc2csCisJCQkJICBwLT52ZXJzaW9uKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlkcHJpbnRrKCJtYWNfdmVyc2lvbiA9PSBVbmtub3duXG4iKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9nZXRfcGh5X3ZlcnNpb24oc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsIHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCWNvbnN0IHN0cnVjdCB7CisJCXUxNiBtYXNrOworCQl1MTYgc2V0OworCQlpbnQgcGh5X3ZlcnNpb247CisJfSBwaHlfaW5mb1tdID0geworCQl7IDB4MDAwZiwgMHgwMDAyLCBSVExfR0lHQV9QSFlfVkVSX0cgfSwKKwkJeyAweDAwMGYsIDB4MDAwMSwgUlRMX0dJR0FfUEhZX1ZFUl9GIH0sCisJCXsgMHgwMDBmLCAweDAwMDAsIFJUTF9HSUdBX1BIWV9WRVJfRSB9LAorCQl7IDB4MDAwMCwgMHgwMDAwLCBSVExfR0lHQV9QSFlfVkVSX0QgfSAvKiBDYXRjaC1hbGwgKi8KKwl9LCAqcCA9IHBoeV9pbmZvOworCXUxNiByZWc7CisKKwlyZWcgPSBtZGlvX3JlYWQoaW9hZGRyLCAzKSAmIDB4ZmZmZjsKKwl3aGlsZSAoKHJlZyAmIHAtPm1hc2spICE9IHAtPnNldCkKKwkJcCsrOworCXRwLT5waHlfdmVyc2lvbiA9IHAtPnBoeV92ZXJzaW9uOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3ByaW50X3BoeV92ZXJzaW9uKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQoreworCXN0cnVjdCB7CisJCWludCB2ZXJzaW9uOworCQljaGFyICptc2c7CisJCXUzMiByZWc7CisJfSBwaHlfcHJpbnRbXSA9IHsKKwkJeyBSVExfR0lHQV9QSFlfVkVSX0csICJSVExfR0lHQV9QSFlfVkVSX0ciLCAweDAwMDIgfSwKKwkJeyBSVExfR0lHQV9QSFlfVkVSX0YsICJSVExfR0lHQV9QSFlfVkVSX0YiLCAweDAwMDEgfSwKKwkJeyBSVExfR0lHQV9QSFlfVkVSX0UsICJSVExfR0lHQV9QSFlfVkVSX0UiLCAweDAwMDAgfSwKKwkJeyBSVExfR0lHQV9QSFlfVkVSX0QsICJSVExfR0lHQV9QSFlfVkVSX0QiLCAweDAwMDAgfSwKKwkJeyAwLCBOVUxMLCAweDAwMDAgfQorCX0sICpwOworCisJZm9yIChwID0gcGh5X3ByaW50OyBwLT5tc2c7IHArKykgeworCQlpZiAodHAtPnBoeV92ZXJzaW9uID09IHAtPnZlcnNpb24pIHsKKwkJCWRwcmludGsoInBoeV92ZXJzaW9uID09ICVzICglMDR4KVxuIiwgcC0+bXNnLCBwLT5yZWcpOworCQkJcmV0dXJuOworCQl9CisJfQorCWRwcmludGsoInBoeV92ZXJzaW9uID09IFVua25vd25cbiIpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X2h3X3BoeV9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXN0cnVjdCB7CisJCXUxNiByZWdzWzVdOyAvKiBCZXdhcmUgb2YgYml0LXNpZ24gcHJvcGFnYXRpb24gKi8KKwl9IHBoeV9tYWdpY1s1XSA9IHsgeworCQl7IDB4MDAwMCwJLy93IDQgMTUgMTIgMAorCQkgIDB4MDBhMSwJLy93IDMgMTUgMCAwMGExCisJCSAgMHgwMDA4LAkvL3cgMiAxNSAwIDAwMDgKKwkJICAweDEwMjAsCS8vdyAxIDE1IDAgMTAyMAorCQkgIDB4MTAwMCB9IH0sewkvL3cgMCAxNSAwIDEwMDAKKwkJeyAweDcwMDAsCS8vdyA0IDE1IDEyIDcKKwkJICAweGZmNDEsCS8vdyAzIDE1IDAgZmY0MQorCQkgIDB4ZGU2MCwJLy93IDIgMTUgMCBkZTYwCisJCSAgMHgwMTQwLAkvL3cgMSAxNSAwIDAxNDAKKwkJICAweDAwNzcgfSB9LHsJLy93IDAgMTUgMCAwMDc3CisJCXsgMHhhMDAwLAkvL3cgNCAxNSAxMiBhCisJCSAgMHhkZjAxLAkvL3cgMyAxNSAwIGRmMDEKKwkJICAweGRmMjAsCS8vdyAyIDE1IDAgZGYyMAorCQkgIDB4ZmY5NSwJLy93IDEgMTUgMCBmZjk1CisJCSAgMHhmYTAwIH0gfSx7CS8vdyAwIDE1IDAgZmEwMAorCQl7IDB4YjAwMCwJLy93IDQgMTUgMTIgYgorCQkgIDB4ZmY0MSwJLy93IDMgMTUgMCBmZjQxCisJCSAgMHhkZTIwLAkvL3cgMiAxNSAwIGRlMjAKKwkJICAweDAxNDAsCS8vdyAxIDE1IDAgMDE0MAorCQkgIDB4MDBiYiB9IH0sewkvL3cgMCAxNSAwIDAwYmIKKwkJeyAweGYwMDAsCS8vdyA0IDE1IDEyIGYKKwkJICAweGRmMDEsCS8vdyAzIDE1IDAgZGYwMQorCQkgIDB4ZGYyMCwJLy93IDIgMTUgMCBkZjIwCisJCSAgMHhmZjk1LAkvL3cgMSAxNSAwIGZmOTUKKwkJICAweGJmMDAgfQkvL3cgMCAxNSAwIGJmMDAKKwkJfQorCX0sICpwID0gcGh5X21hZ2ljOworCWludCBpOworCisJcnRsODE2OV9wcmludF9tYWNfdmVyc2lvbih0cCk7CisJcnRsODE2OV9wcmludF9waHlfdmVyc2lvbih0cCk7CisKKwlpZiAodHAtPm1hY192ZXJzaW9uIDw9IFJUTF9HSUdBX01BQ19WRVJfQikKKwkJcmV0dXJuOworCWlmICh0cC0+cGh5X3ZlcnNpb24gPj0gUlRMX0dJR0FfUEhZX1ZFUl9IKQorCQlyZXR1cm47CisKKwlkcHJpbnRrKCJNQUMgdmVyc2lvbiAhPSAwICYmIFBIWSB2ZXJzaW9uID09IDAgb3IgMVxuIik7CisJZHByaW50aygiRG8gZmluYWxfcmVnMi5jZmdcbiIpOworCisJLyogU2hhemFtICEgKi8KKworCWlmICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl9YKSB7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCAzMSwgMHgwMDAxKTsKKwkJbWRpb193cml0ZShpb2FkZHIsICA5LCAweDI3M2EpOworCQltZGlvX3dyaXRlKGlvYWRkciwgMTQsIDB4N2JmYik7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCAyNywgMHg4NDFlKTsKKworCQltZGlvX3dyaXRlKGlvYWRkciwgMzEsIDB4MDAwMik7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCAgMSwgMHg5MGQwKTsKKwkJbWRpb193cml0ZShpb2FkZHIsIDMxLCAweDAwMDApOworCQlyZXR1cm47CisJfQorCisJLyogcGh5IGNvbmZpZyBmb3IgUlRMODE2OXMgbWFjX3ZlcnNpb24gQyBjaGlwICovCisJbWRpb193cml0ZShpb2FkZHIsIDMxLCAweDAwMDEpOwkJCS8vdyAzMSAyIDAgMQorCW1kaW9fd3JpdGUoaW9hZGRyLCAyMSwgMHgxMDAwKTsJCQkvL3cgMjEgMTUgMCAxMDAwCisJbWRpb193cml0ZShpb2FkZHIsIDI0LCAweDY1YzcpOwkJCS8vdyAyNCAxNSAwIDY1YzcKKwlydGw4MTY5X3dyaXRlX2dtaWlfcmVnX2JpdChpb2FkZHIsIDQsIDExLCAwKTsJLy93IDQgMTEgMTEgMAorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGh5X21hZ2ljKTsgaSsrLCBwKyspIHsKKwkJaW50IHZhbCwgcG9zID0gNDsKKworCQl2YWwgPSAobWRpb19yZWFkKGlvYWRkciwgcG9zKSAmIDB4MGZmZikgfCAocC0+cmVnc1swXSAmIDB4ZmZmZik7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCBwb3MsIHZhbCk7CisJCXdoaWxlICgtLXBvcyA+PSAwKQorCQkJbWRpb193cml0ZShpb2FkZHIsIHBvcywgcC0+cmVnc1s0IC0gcG9zXSAmIDB4ZmZmZik7CisJCXJ0bDgxNjlfd3JpdGVfZ21paV9yZWdfYml0KGlvYWRkciwgNCwgMTEsIDEpOyAvL3cgNCAxMSAxMSAxCisJCXJ0bDgxNjlfd3JpdGVfZ21paV9yZWdfYml0KGlvYWRkciwgNCwgMTEsIDApOyAvL3cgNCAxMSAxMSAwCisJfQorCW1kaW9fd3JpdGUoaW9hZGRyLCAzMSwgMHgwMDAwKTsgLy93IDMxIDIgMCAwCit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfcGh5X3RpbWVyKHVuc2lnbmVkIGxvbmcgX19vcGFxdWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKV9fb3BhcXVlOworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIgPSAmdHAtPnRpbWVyOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBSVEw4MTY5X1BIWV9USU1FT1VUOworCisJYXNzZXJ0KHRwLT5tYWNfdmVyc2lvbiA+IFJUTF9HSUdBX01BQ19WRVJfQik7CisJYXNzZXJ0KHRwLT5waHlfdmVyc2lvbiA8IFJUTF9HSUdBX1BIWV9WRVJfSCk7CisKKwlpZiAoISh0cC0+cGh5XzEwMDBfY3RybF9yZWcgJiBQSFlfQ2FwXzEwMDBfRnVsbCkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKworCWlmICh0cC0+cGh5X3Jlc2V0X3BlbmRpbmcoaW9hZGRyKSkgeworCQkvKiAKKwkJICogQSBidXN5IGxvb3AgY291bGQgYnVybiBxdWl0ZSBhIGZldyBjeWNsZXMgb24gbm93YWRheXMgQ1BVLgorCQkgKiBMZXQncyBkZWxheSB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0aW1lciBmb3IgYSBmZXcgdGlja3MuCisJCSAqLworCQl0aW1lb3V0ID0gSFovMTA7CisJCWdvdG8gb3V0X21vZF90aW1lcjsKKwl9CisKKwlpZiAodHAtPmxpbmtfb2soaW9hZGRyKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIiVzOiBQSFkgcmVzZXQgdW50aWwgbGluayB1cFxuIiwgZGV2LT5uYW1lKTsKKworCXRwLT5waHlfcmVzZXRfZW5hYmxlKGlvYWRkcik7CisKK291dF9tb2RfdGltZXI6CisJbW9kX3RpbWVyKHRpbWVyLCBqaWZmaWVzICsgdGltZW91dCk7CitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsODE2OV9kZWxldGVfdGltZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyID0gJnRwLT50aW1lcjsKKworCWlmICgodHAtPm1hY192ZXJzaW9uIDw9IFJUTF9HSUdBX01BQ19WRVJfQikgfHwKKwkgICAgKHRwLT5waHlfdmVyc2lvbiA+PSBSVExfR0lHQV9QSFlfVkVSX0gpKQorCQlyZXR1cm47CisKKwlkZWxfdGltZXJfc3luYyh0aW1lcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGw4MTY5X3JlcXVlc3RfdGltZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyID0gJnRwLT50aW1lcjsKKworCWlmICgodHAtPm1hY192ZXJzaW9uIDw9IFJUTF9HSUdBX01BQ19WRVJfQikgfHwKKwkgICAgKHRwLT5waHlfdmVyc2lvbiA+PSBSVExfR0lHQV9QSFlfVkVSX0gpKQorCQlyZXR1cm47CisKKwlpbml0X3RpbWVyKHRpbWVyKTsKKwl0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyBSVEw4MTY5X1BIWV9USU1FT1VUOworCXRpbWVyLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpKGRldik7CisJdGltZXItPmZ1bmN0aW9uID0gcnRsODE2OV9waHlfdGltZXI7CisJYWRkX3RpbWVyKHRpbWVyKTsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisvKgorICogUG9sbGluZyAnaW50ZXJydXB0JyAtIHVzZWQgYnkgdGhpbmdzIGxpa2UgbmV0Y29uc29sZSB0byBzZW5kIHNrYnMKKyAqIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWVuYWJsZSBpbnRlcnJ1cHRzLiBJdCdzIG5vdCBjYWxsZWQgd2hpbGUKKyAqIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBpcyBleGVjdXRpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHJ0bDgxNjlfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRwLT5wY2lfZGV2OworCisJZGlzYWJsZV9pcnEocGRldi0+aXJxKTsKKwlydGw4MTY5X2ludGVycnVwdChwZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShwZGV2LT5pcnEpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfcmVsZWFzZV9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCWlvdW5tYXAoaW9hZGRyKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcnRsODE2OV9pbml0X2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqKmRldl9vdXQsCisJCSAgIHZvaWQgX19pb21lbSAqKmlvYWRkcl9vdXQpCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cDsKKwlpbnQgcmMgPSAtRU5PTUVNLCBpLCBhY3BpX2lkbGVfc3RhdGUgPSAwLCBwbV9jYXA7CisKKwlhc3NlcnQoaW9hZGRyX291dCAhPSBOVUxMKTsKKworCS8qIGRldiB6ZXJvZWQgaW4gYWxsb2NfZXRoZXJkZXYgKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YgKCp0cCkpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2MgbmV3IGV0aGVybmV0XG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIGVuYWJsZSBkZXZpY2UgKGluY2wuIFBDSSBQTSB3YWtldXAgYW5kIGhvdHBsdWcgc2V0dXApICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IGVuYWJsZSBmYWlsdXJlXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwl9CisKKwlyYyA9IHBjaV9zZXRfbXdpKHBkZXYpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCisJLyogc2F2ZSBwb3dlciBzdGF0ZSBiZWZvcmUgcGNpX2VuYWJsZV9kZXZpY2Ugb3ZlcndyaXRlcyBpdCAqLworCXBtX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QTSk7CisJaWYgKHBtX2NhcCkgeworCQl1MTYgcHdyX2NvbW1hbmQ7CisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG1fY2FwICsgUENJX1BNX0NUUkwsICZwd3JfY29tbWFuZCk7CisJCWFjcGlfaWRsZV9zdGF0ZSA9IHB3cl9jb21tYW5kICYgUENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiQ2Fubm90IGZpbmQgUG93ZXJNYW5hZ2VtZW50IGNhcGFiaWxpdHksIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9td2k7CisJfQorCisJLyogbWFrZSBzdXJlIFBDSSBiYXNlIGFkZHIgMSBpcyBNTUlPICovCisJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDEpICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICJyZWdpb24gIzEgbm90IGFuIE1NSU8gcmVzb3VyY2UsIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfbXdpOworCX0KKwkvKiBjaGVjayBmb3Igd2VpcmQvYnJva2VuIFBDSSByZWdpb24gcmVwb3J0aW5nICovCisJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkgPCBSODE2OV9SRUdTX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSW52YWxpZCBQQ0kgcmVnaW9uIHNpemUocyksIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfbXdpOworCX0KKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBNT0RVTEVOQU1FKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IGNvdWxkIG5vdCByZXF1ZXN0IHJlZ2lvbnMuXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9vdXRfbXdpOworCX0KKworCXRwLT5jcF9jbWQgPSBQQ0lNdWxSVyB8IFJ4Q2hrU3VtOworCisJaWYgKChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSAmJgorCSAgICAhcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykgJiYgdXNlX2RhYykgeworCQl0cC0+Y3BfY21kIHw9IFBDSURBQzsKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisJfSBlbHNlIHsKKwkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRE1BIGNvbmZpZ3VyYXRpb24gZmFpbGVkLlxuIik7CisJCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJCX0KKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qIGlvcmVtYXAgTU1JTyByZWdpb24gKi8KKwlpb2FkZHIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKSwgUjgxNjlfUkVHU19TSVpFKTsKKwlpZiAoaW9hZGRyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlbWFwIE1NSU8sIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisJLyogVW5uZWVkZWQgPyBEb24ndCBtZXNzIHdpdGggTXJzLiBNdXJwaHkuICovCisJcnRsODE2OV9pcnFfbWFza19hbmRfYWNrKGlvYWRkcik7CisKKwkvKiBTb2Z0IHJlc2V0IHRoZSBjaGlwLiAqLworCVJUTF9XOChDaGlwQ21kLCBDbWRSZXNldCk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBjaGlwIGhhcyBmaW5pc2hlZCB0aGUgcmVzZXQuICovCisJZm9yIChpID0gMTAwMDsgaSA+IDA7IGktLSkgeworCQlpZiAoKFJUTF9SOChDaGlwQ21kKSAmIENtZFJlc2V0KSA9PSAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCisJLyogSWRlbnRpZnkgY2hpcCBhdHRhY2hlZCB0byBib2FyZCAqLworCXJ0bDgxNjlfZ2V0X21hY192ZXJzaW9uKHRwLCBpb2FkZHIpOworCXJ0bDgxNjlfZ2V0X3BoeV92ZXJzaW9uKHRwLCBpb2FkZHIpOworCisJcnRsODE2OV9wcmludF9tYWNfdmVyc2lvbih0cCk7CisJcnRsODE2OV9wcmludF9waHlfdmVyc2lvbih0cCk7CisKKwlmb3IgKGkgPSBBUlJBWV9TSVpFKHJ0bF9jaGlwX2luZm8pIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKHRwLT5tYWNfdmVyc2lvbiA9PSBydGxfY2hpcF9pbmZvW2ldLm1hY192ZXJzaW9uKQorCQkJYnJlYWs7CisJfQorCWlmIChpIDwgMCkgeworCQkvKiBVbmtub3duIGNoaXA6IGFzc3VtZSBhcnJheSBlbGVtZW50ICMwLCBvcmlnaW5hbCBSVEwtODE2OSAqLworCQlwcmludGsoS0VSTl9ERUJVRyBQRlgKKwkJICAgICAgICJQQ0kgZGV2aWNlICVzOiB1bmtub3duIGNoaXAgdmVyc2lvbiwgYXNzdW1pbmcgJXNcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcnRsX2NoaXBfaW5mb1swXS5uYW1lKTsKKwkJaSsrOworCX0KKwl0cC0+Y2hpcHNldCA9IGk7CisKKwkqaW9hZGRyX291dCA9IGlvYWRkcjsKKwkqZGV2X291dCA9IGRldjsKK291dDoKKwlyZXR1cm4gcmM7CisKK2Vycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworZXJyX291dF9td2k6CisJcGNpX2NsZWFyX213aShwZGV2KTsKKworZXJyX291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworZXJyX291dF9mcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworZXJyX291dDoKKwkqaW9hZGRyX291dCA9IE5VTEw7CisJKmRldl9vdXQgPSBOVUxMOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcnRsODE2OV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IE5VTEw7CisJc3RhdGljIGludCBib2FyZF9pZHggPSAtMTsKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbiA9IDA7CisJdTggYXV0b25lZywgZHVwbGV4OworCXUxNiBzcGVlZDsKKwlpbnQgaSwgcmM7CisKKwlhc3NlcnQocGRldiAhPSBOVUxMKTsKKwlhc3NlcnQoZW50ICE9IE5VTEwpOworCisJYm9hcmRfaWR4Kys7CisKKwlpZiAoIXByaW50ZWRfdmVyc2lvbikgeworCQlwcmludGsoS0VSTl9JTkZPICIlcyBHaWdhYml0IEV0aGVybmV0IGRyaXZlciAlcyBsb2FkZWRcbiIsCisJCSAgICAgICBNT0RVTEVOQU1FLCBSVEw4MTY5X1ZFUlNJT04pOworCQlwcmludGVkX3ZlcnNpb24gPSAxOworCX0KKworCXJjID0gcnRsODE2OV9pbml0X2JvYXJkKHBkZXYsICZkZXYsICZpb2FkZHIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWFzc2VydChpb2FkZHIgIT0gTlVMTCk7CisKKwlpZiAoUlRMX1I4KFBIWXN0YXR1cykgJiBUQklfRW5hYmxlKSB7CisJCXRwLT5zZXRfc3BlZWQgPSBydGw4MTY5X3NldF9zcGVlZF90Ymk7CisJCXRwLT5nZXRfc2V0dGluZ3MgPSBydGw4MTY5X2dzZXRfdGJpOworCQl0cC0+cGh5X3Jlc2V0X2VuYWJsZSA9IHJ0bDgxNjlfdGJpX3Jlc2V0X2VuYWJsZTsKKwkJdHAtPnBoeV9yZXNldF9wZW5kaW5nID0gcnRsODE2OV90YmlfcmVzZXRfcGVuZGluZzsKKwkJdHAtPmxpbmtfb2sgPSBydGw4MTY5X3RiaV9saW5rX29rOworCisJCXRwLT5waHlfMTAwMF9jdHJsX3JlZyA9IFBIWV9DYXBfMTAwMF9GdWxsOyAvKiBJbXBsaWVkIGJ5IFRCSSAqLworCX0gZWxzZSB7CisJCXRwLT5zZXRfc3BlZWQgPSBydGw4MTY5X3NldF9zcGVlZF94bWlpOworCQl0cC0+Z2V0X3NldHRpbmdzID0gcnRsODE2OV9nc2V0X3htaWk7CisJCXRwLT5waHlfcmVzZXRfZW5hYmxlID0gcnRsODE2OV94bWlpX3Jlc2V0X2VuYWJsZTsKKwkJdHAtPnBoeV9yZXNldF9wZW5kaW5nID0gcnRsODE2OV94bWlpX3Jlc2V0X3BlbmRpbmc7CisJCXRwLT5saW5rX29rID0gcnRsODE2OV94bWlpX2xpbmtfb2s7CisJfQorCisJLyogR2V0IE1BQyBhZGRyZXNzLiAgRklYTUU6IHJlYWQgRUVQUk9NICovCisJZm9yIChpID0gMDsgaSA8IE1BQ19BRERSX0xFTjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gUlRMX1I4KE1BQzAgKyBpKTsKKworCWRldi0+b3BlbiA9IHJ0bDgxNjlfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHJ0bDgxNjlfc3RhcnRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9IHJ0bDgxNjlfZ2V0X3N0YXRzOworCVNFVF9FVEhUT09MX09QUyhkZXYsICZydGw4MTY5X2V0aHRvb2xfb3BzKTsKKwlkZXYtPnN0b3AgPSBydGw4MTY5X2Nsb3NlOworCWRldi0+dHhfdGltZW91dCA9IHJ0bDgxNjlfdHhfdGltZW91dDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHJ0bDgxNjlfc2V0X3J4X21vZGU7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFJUTDgxNjlfVFhfVElNRU9VVDsKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKSBpb2FkZHI7CisJZGV2LT5jaGFuZ2VfbXR1ID0gcnRsODE2OV9jaGFuZ2VfbXR1OworCisjaWZkZWYgQ09ORklHX1I4MTY5X05BUEkKKwlkZXYtPnBvbGwgPSBydGw4MTY5X3BvbGw7CisJZGV2LT53ZWlnaHQgPSBSODE2OV9OQVBJX1dFSUdIVDsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiTkFQSSBlbmFibGVkXG4iKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1I4MTY5X1ZMQU4KKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWDsKKwlkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSBydGw4MTY5X3ZsYW5fcnhfcmVnaXN0ZXI7CisJZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gcnRsODE2OV92bGFuX3J4X2tpbGxfdmlkOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gcnRsODE2OV9uZXRwb2xsOworI2VuZGlmCisKKwl0cC0+aW50cl9tYXNrID0gMHhmZmZmOworCXRwLT5wY2lfZGV2ID0gcGRldjsKKwl0cC0+bW1pb19hZGRyID0gaW9hZGRyOworCisJc3Bpbl9sb2NrX2luaXQoJnRwLT5sb2NrKTsKKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKSB7CisJCXJ0bDgxNjlfcmVsZWFzZV9ib2FyZChwZGV2LCBkZXYsIGlvYWRkcik7CisJCXJldHVybiByYzsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IElkZW50aWZpZWQgY2hpcCB0eXBlIGlzICclcycuXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIHJ0bF9jaGlwX2luZm9bdHAtPmNoaXBzZXRdLm5hbWUpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgYXQgMHglbHgsICIKKwkgICAgICAgIiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4LCAiCisJICAgICAgICJJUlEgJWRcbiIsCisJICAgICAgIGRldi0+bmFtZSwKKwkgICAgICAgcnRsX2NoaXBfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXS5uYW1lLAorCSAgICAgICBkZXYtPmJhc2VfYWRkciwKKwkgICAgICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwKKwkgICAgICAgZGV2LT5kZXZfYWRkclsyXSwgZGV2LT5kZXZfYWRkclszXSwKKwkgICAgICAgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSwgZGV2LT5pcnEpOworCisJcnRsODE2OV9od19waHlfY29uZmlnKGRldik7CisKKwlkcHJpbnRrKCJTZXQgTUFDIFJlZyBDK0NSIE9mZnNldCAweDgyaCA9IDB4MDFoXG4iKTsKKwlSVExfVzgoMHg4MiwgMHgwMSk7CisKKwlpZiAodHAtPm1hY192ZXJzaW9uIDwgUlRMX0dJR0FfTUFDX1ZFUl9FKSB7CisJCWRwcmludGsoIlNldCBQQ0kgTGF0ZW5jeT0weDQwXG4iKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDQwKTsKKwl9CisKKwlpZiAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfRCkgeworCQlkcHJpbnRrKCJTZXQgTUFDIFJlZyBDK0NSIE9mZnNldCAweDgyaCA9IDB4MDFoXG4iKTsKKwkJUlRMX1c4KDB4ODIsIDB4MDEpOworCQlkcHJpbnRrKCJTZXQgUEhZIFJlZyAweDBiaCA9IDB4MDBoXG4iKTsKKwkJbWRpb193cml0ZShpb2FkZHIsIDB4MGIsIDB4MDAwMCk7IC8vdyAweDBiIDE1IDAgMAorCX0KKworCXJ0bDgxNjlfbGlua19vcHRpb24oYm9hcmRfaWR4LCAmYXV0b25lZywgJnNwZWVkLCAmZHVwbGV4KTsKKworCXJ0bDgxNjlfc2V0X3NwZWVkKGRldiwgYXV0b25lZywgc3BlZWQsIGR1cGxleCk7CisJCisJaWYgKFJUTF9SOChQSFlzdGF0dXMpICYgVEJJX0VuYWJsZSkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBUQkkgYXV0by1uZWdvdGlhdGluZ1xuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQKK3J0bDgxNjlfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWFzc2VydChkZXYgIT0gTlVMTCk7CisJYXNzZXJ0KHRwICE9IE5VTEwpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlydGw4MTY5X3JlbGVhc2VfYm9hcmQocGRldiwgZGV2LCB0cC0+bW1pb19hZGRyKTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBydGw4MTY5X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKwkKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLCBzdG9wIFJ4IGFuZCBUeCAqLworCVJUTF9XMTYoSW50ck1hc2ssIDApOworCVJUTF9XOChDaGlwQ21kLCAwKTsKKwkJCisJLyogVXBkYXRlIHRoZSBlcnJvciBjb3VudHMuICovCisJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gUlRMX1IzMihSeE1pc3NlZCk7CisJUlRMX1czMihSeE1pc3NlZCwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGw4MTY5X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJICAgIHJldHVybiAwOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCXJ0bDgxNjlfaHdfc3RhcnQoZGV2KTsKKworCXJldHVybiAwOworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHZvaWQgcnRsODE2OV9zZXRfcnhidWZzaXplKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgbXR1ID0gZGV2LT5tdHU7CisKKwl0cC0+cnhfYnVmX3N6ID0gKG10dSA+IFJYX0JVRl9TSVpFKSA/IG10dSArIEVUSF9ITEVOICsgOCA6IFJYX0JVRl9TSVpFOworfQorCitzdGF0aWMgaW50IHJ0bDgxNjlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRwLT5wY2lfZGV2OworCWludCByZXR2YWw7CisKKwlydGw4MTY5X3NldF9yeGJ1ZnNpemUodHAsIGRldik7CisKKwlyZXR2YWwgPQorCSAgICByZXF1ZXN0X2lycShkZXYtPmlycSwgcnRsODE2OV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0gLUVOT01FTTsKKworCS8qCisJICogUnggYW5kIFR4IGRlc3NjcmlwdG9ycyBuZWVkcyAyNTYgYnl0ZXMgYWxpZ25tZW50LgorCSAqIHBjaV9hbGxvY19jb25zaXN0ZW50IHByb3ZpZGVzIG1vcmUuCisJICovCisJdHAtPlR4RGVzY0FycmF5ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUjgxNjlfVFhfUklOR19CWVRFUywKKwkJCQkJICAgICAgICZ0cC0+VHhQaHlBZGRyKTsKKwlpZiAoIXRwLT5UeERlc2NBcnJheSkKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwl0cC0+UnhEZXNjQXJyYXkgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBSODE2OV9SWF9SSU5HX0JZVEVTLAorCQkJCQkgICAgICAgJnRwLT5SeFBoeUFkZHIpOworCWlmICghdHAtPlJ4RGVzY0FycmF5KQorCQlnb3RvIGVycl9mcmVlX3R4OworCisJcmV0dmFsID0gcnRsODE2OV9pbml0X3JpbmcoZGV2KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlcnJfZnJlZV9yeDsKKworCUlOSVRfV09SSygmdHAtPnRhc2ssIE5VTEwsIGRldik7CisKKwlydGw4MTY5X2h3X3N0YXJ0KGRldik7CisKKwlydGw4MTY5X3JlcXVlc3RfdGltZXIoZGV2KTsKKworCXJ0bDgxNjlfY2hlY2tfbGlua19zdGF0dXMoZGV2LCB0cCwgdHAtPm1taW9fYWRkcik7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKKworZXJyX2ZyZWVfcng6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSODE2OV9SWF9SSU5HX0JZVEVTLCB0cC0+UnhEZXNjQXJyYXksCisJCQkgICAgdHAtPlJ4UGh5QWRkcik7CitlcnJfZnJlZV90eDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFI4MTY5X1RYX1JJTkdfQllURVMsIHRwLT5UeERlc2NBcnJheSwKKwkJCSAgICB0cC0+VHhQaHlBZGRyKTsKK2Vycl9mcmVlX2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9od19yZXNldCh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlydGw4MTY5X2lycV9tYXNrX2FuZF9hY2soaW9hZGRyKTsKKworCS8qIFJlc2V0IHRoZSBjaGlwc2V0ICovCisJUlRMX1c4KENoaXBDbWQsIENtZFJlc2V0KTsKKworCS8qIFBDSSBjb21taXQgKi8KKwlSVExfUjgoQ2hpcENtZCk7Cit9CisKK3N0YXRpYyB2b2lkCitydGw4MTY5X2h3X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1MzIgaTsKKworCS8qIFNvZnQgcmVzZXQgdGhlIGNoaXAuICovCisJUlRMX1c4KENoaXBDbWQsIENtZFJlc2V0KTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGNoaXAgaGFzIGZpbmlzaGVkIHRoZSByZXNldC4gKi8KKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKSB7CisJCWlmICgoUlRMX1I4KENoaXBDbWQpICYgQ21kUmVzZXQpID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlSVExfVzgoQ2ZnOTM0NiwgQ2ZnOTM0Nl9VbmxvY2spOworCVJUTF9XOChDaGlwQ21kLCBDbWRUeEVuYiB8IENtZFJ4RW5iKTsKKwlSVExfVzgoRWFybHlUeFRocmVzLCBFYXJseVR4VGhsZCk7CisKKwkvKiBGb3IgZ2lnYWJpdCBydGw4MTY5LCBNVFUgKyBoZWFkZXIgKyBDUkMgKyBWTEFOICovCisJUlRMX1cxNihSeE1heFNpemUsIHRwLT5yeF9idWZfc3opOworCisJLyogU2V0IFJ4IENvbmZpZyByZWdpc3RlciAqLworCWkgPSBydGw4MTY5X3J4X2NvbmZpZyB8CisJCShSVExfUjMyKFJ4Q29uZmlnKSAmIHJ0bF9jaGlwX2luZm9bdHAtPmNoaXBzZXRdLlJ4Q29uZmlnTWFzayk7CisJUlRMX1czMihSeENvbmZpZywgaSk7CisKKwkvKiBTZXQgRE1BIGJ1cnN0IHNpemUgYW5kIEludGVyZnJhbWUgR2FwIFRpbWUgKi8KKwlSVExfVzMyKFR4Q29uZmlnLAorCQkoVFhfRE1BX0JVUlNUIDw8IFR4RE1BU2hpZnQpIHwgKEludGVyRnJhbWVHYXAgPDwKKwkJCQkJCVR4SW50ZXJGcmFtZUdhcFNoaWZ0KSk7CisJdHAtPmNwX2NtZCB8PSBSVExfUjE2KENQbHVzQ21kKTsKKwlSVExfVzE2KENQbHVzQ21kLCB0cC0+Y3BfY21kKTsKKworCWlmICgodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfRCkgfHwKKwkgICAgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSX0UpKSB7CisJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiU2V0IE1BQyBSZWcgQytDUiBPZmZzZXQgMHhFMC4gIgorCQkJIkJpdC0zIGFuZCBiaXQtMTQgTVVTVCBiZSAxXG4iKTsKKwkJdHAtPmNwX2NtZCB8PSAoMSA8PCAxNCkgfCBQQ0lNdWxSVzsKKwkJUlRMX1cxNihDUGx1c0NtZCwgdHAtPmNwX2NtZCk7CisJfQorCisJLyoKKwkgKiBVbmRvY3VtZW50ZWQgY29ybmVyLiBTdXBwb3NlZGx5OgorCSAqIChUeFRpbWVyIDw8IDEyKSB8IChUeFBhY2tldHMgPDwgOCkgfCAoUnhUaW1lciA8PCA0KSB8IFJ4UGFja2V0cworCSAqLworCVJUTF9XMTYoSW50ck1pdGlnYXRlLCAweDAwMDApOworCisJUlRMX1czMihUeERlc2NTdGFydEFkZHJMb3csICgodTY0KSB0cC0+VHhQaHlBZGRyICYgRE1BXzMyQklUX01BU0spKTsKKwlSVExfVzMyKFR4RGVzY1N0YXJ0QWRkckhpZ2gsICgodTY0KSB0cC0+VHhQaHlBZGRyID4+IDMyKSk7CisJUlRMX1czMihSeERlc2NBZGRyTG93LCAoKHU2NCkgdHAtPlJ4UGh5QWRkciAmIERNQV8zMkJJVF9NQVNLKSk7CisJUlRMX1czMihSeERlc2NBZGRySGlnaCwgKCh1NjQpIHRwLT5SeFBoeUFkZHIgPj4gMzIpKTsKKwlSVExfVzgoQ2ZnOTM0NiwgQ2ZnOTM0Nl9Mb2NrKTsKKwl1ZGVsYXkoMTApOworCisJUlRMX1czMihSeE1pc3NlZCwgMCk7CisKKwlydGw4MTY5X3NldF9yeF9tb2RlKGRldik7CisKKwkvKiBubyBlYXJseS1yeCBpbnRlcnJ1cHRzICovCisJUlRMX1cxNihNdWx0aUludHIsIFJUTF9SMTYoTXVsdGlJbnRyKSAmIDB4RjAwMCk7CisKKwkvKiBFbmFibGUgYWxsIGtub3duIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJUlRMX1cxNihJbnRyTWFzaywgcnRsODE2OV9pbnRyX21hc2spOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBydGw4MTY5X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXQgPSAwOworCisJaWYgKG5ld19tdHUgPCBFVEhfWkxFTiB8fCBuZXdfbXR1ID4gU2FmZU10dSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYtPm10dSA9IG5ld19tdHU7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJZ290byBvdXQ7CisKKwlydGw4MTY5X2Rvd24oZGV2KTsKKworCXJ0bDgxNjlfc2V0X3J4YnVmc2l6ZSh0cCwgZGV2KTsKKworCXJldCA9IHJ0bDgxNjlfaW5pdF9yaW5nKGRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJbmV0aWZfcG9sbF9lbmFibGUoZGV2KTsKKworCXJ0bDgxNjlfaHdfc3RhcnQoZGV2KTsKKworCXJ0bDgxNjlfcmVxdWVzdF90aW1lcihkZXYpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bDgxNjlfbWFrZV91bnVzYWJsZV9ieV9hc2ljKHN0cnVjdCBSeERlc2MgKmRlc2MpCit7CisJZGVzYy0+YWRkciA9IDB4MGJhZGJhZGJhZGJhZGJhZHVsbDsKKwlkZXNjLT5vcHRzMSAmPSB+Y3B1X3RvX2xlMzIoRGVzY093biB8IFJzdmRNYXNrKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9mcmVlX3J4X3NrYihzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqKnNrX2J1ZmYsIHN0cnVjdCBSeERlc2MgKmRlc2MpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGNpX2RldjsKKworCXBjaV91bm1hcF9zaW5nbGUocGRldiwgbGU2NF90b19jcHUoZGVzYy0+YWRkciksIHRwLT5yeF9idWZfc3osCisJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlkZXZfa2ZyZWVfc2tiKCpza19idWZmKTsKKwkqc2tfYnVmZiA9IE5VTEw7CisJcnRsODE2OV9tYWtlX3VudXNhYmxlX2J5X2FzaWMoZGVzYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGw4MTY5X21hcmtfdG9fYXNpYyhzdHJ1Y3QgUnhEZXNjICpkZXNjLCB1MzIgcnhfYnVmX3N6KQoreworCXUzMiBlb3IgPSBsZTMyX3RvX2NwdShkZXNjLT5vcHRzMSkgJiBSaW5nRW5kOworCisJZGVzYy0+b3B0czEgPSBjcHVfdG9fbGUzMihEZXNjT3duIHwgZW9yIHwgcnhfYnVmX3N6KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bDgxNjlfbWFwX3RvX2FzaWMoc3RydWN0IFJ4RGVzYyAqZGVzYywgZG1hX2FkZHJfdCBtYXBwaW5nLAorCQkJCSAgICAgICB1MzIgcnhfYnVmX3N6KQoreworCWRlc2MtPmFkZHIgPSBjcHVfdG9fbGU2NChtYXBwaW5nKTsKKwl3bWIoKTsKKwlydGw4MTY5X21hcmtfdG9fYXNpYyhkZXNjLCByeF9idWZfc3opOworfQorCitzdGF0aWMgaW50IHJ0bDgxNjlfYWxsb2Nfcnhfc2tiKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrX2J1ZmYsCisJCQkJc3RydWN0IFJ4RGVzYyAqZGVzYywgaW50IHJ4X2J1Zl9zeikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKwlpbnQgcmV0ID0gMDsKKworCXNrYiA9IGRldl9hbGxvY19za2IocnhfYnVmX3N6ICsgTkVUX0lQX0FMSUdOKTsKKwlpZiAoIXNrYikKKwkJZ290byBlcnJfb3V0OworCisJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCSpza19idWZmID0gc2tiOworCisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+dGFpbCwgcnhfYnVmX3N6LAorCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJcnRsODE2OV9tYXBfdG9fYXNpYyhkZXNjLCBtYXBwaW5nLCByeF9idWZfc3opOworCitvdXQ6CisJcmV0dXJuIHJldDsKKworZXJyX291dDoKKwlyZXQgPSAtRU5PTUVNOworCXJ0bDgxNjlfbWFrZV91bnVzYWJsZV9ieV9hc2ljKGRlc2MpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3J4X2NsZWFyKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKyspIHsKKwkJaWYgKHRwLT5SeF9za2J1ZmZbaV0pIHsKKwkJCXJ0bDgxNjlfZnJlZV9yeF9za2IodHAsIHRwLT5SeF9za2J1ZmYgKyBpLAorCQkJCQkgICAgdHAtPlJ4RGVzY0FycmF5ICsgaSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1MzIgcnRsODE2OV9yeF9maWxsKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgdTMyIHN0YXJ0LCB1MzIgZW5kKQoreworCXUzMiBjdXI7CisJCisJZm9yIChjdXIgPSBzdGFydDsgZW5kIC0gY3VyID4gMDsgY3VyKyspIHsKKwkJaW50IHJldCwgaSA9IGN1ciAlIE5VTV9SWF9ERVNDOworCisJCWlmICh0cC0+Unhfc2tidWZmW2ldKQorCQkJY29udGludWU7CisJCQkKKwkJcmV0ID0gcnRsODE2OV9hbGxvY19yeF9za2IodHAtPnBjaV9kZXYsIHRwLT5SeF9za2J1ZmYgKyBpLAorCQkJCQkgICB0cC0+UnhEZXNjQXJyYXkgKyBpLCB0cC0+cnhfYnVmX3N6KTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGN1ciAtIHN0YXJ0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsODE2OV9tYXJrX2FzX2xhc3RfZGVzY3JpcHRvcihzdHJ1Y3QgUnhEZXNjICpkZXNjKQoreworCWRlc2MtPm9wdHMxIHw9IGNwdV90b19sZTMyKFJpbmdFbmQpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X2luaXRfcmluZ19pbmRleGVzKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQoreworCXRwLT5kaXJ0eV90eCA9IHRwLT5kaXJ0eV9yeCA9IHRwLT5jdXJfdHggPSB0cC0+Y3VyX3J4ID0gMDsKK30KKworc3RhdGljIGludCBydGw4MTY5X2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJ0bDgxNjlfaW5pdF9yaW5nX2luZGV4ZXModHApOworCisJbWVtc2V0KHRwLT50eF9za2IsIDB4MCwgTlVNX1RYX0RFU0MgKiBzaXplb2Yoc3RydWN0IHJpbmdfaW5mbykpOworCW1lbXNldCh0cC0+Unhfc2tidWZmLCAweDAsIE5VTV9SWF9ERVNDICogc2l6ZW9mKHN0cnVjdCBza19idWZmICopKTsKKworCWlmIChydGw4MTY5X3J4X2ZpbGwodHAsIGRldiwgMCwgTlVNX1JYX0RFU0MpICE9IE5VTV9SWF9ERVNDKQorCQlnb3RvIGVycl9vdXQ7CisKKwlydGw4MTY5X21hcmtfYXNfbGFzdF9kZXNjcmlwdG9yKHRwLT5SeERlc2NBcnJheSArIE5VTV9SWF9ERVNDIC0gMSk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlydGw4MTY5X3J4X2NsZWFyKHRwKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV91bm1hcF90eF9za2Ioc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCByaW5nX2luZm8gKnR4X3NrYiwKKwkJCQkgc3RydWN0IFR4RGVzYyAqZGVzYykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuID0gdHhfc2tiLT5sZW47CisKKwlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIGxlNjRfdG9fY3B1KGRlc2MtPmFkZHIpLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCWRlc2MtPm9wdHMxID0gMHgwMDsKKwlkZXNjLT5vcHRzMiA9IDB4MDA7CisJZGVzYy0+YWRkciA9IDB4MDA7CisJdHhfc2tiLT5sZW4gPSAwOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3R4X2NsZWFyKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gdHAtPmRpcnR5X3R4OyBpIDwgdHAtPmRpcnR5X3R4ICsgTlVNX1RYX0RFU0M7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgZW50cnkgPSBpICUgTlVNX1RYX0RFU0M7CisJCXN0cnVjdCByaW5nX2luZm8gKnR4X3NrYiA9IHRwLT50eF9za2IgKyBlbnRyeTsKKwkJdW5zaWduZWQgaW50IGxlbiA9IHR4X3NrYi0+bGVuOworCisJCWlmIChsZW4pIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSB0eF9za2ItPnNrYjsKKworCQkJcnRsODE2OV91bm1hcF90eF9za2IodHAtPnBjaV9kZXYsIHR4X3NrYiwKKwkJCQkJICAgICB0cC0+VHhEZXNjQXJyYXkgKyBlbnRyeSk7CisJCQlpZiAoc2tiKSB7CisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJCXR4X3NrYi0+c2tiID0gTlVMTDsKKwkJCX0KKwkJCXRwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCX0KKwl9CisJdHAtPmN1cl90eCA9IHRwLT5kaXJ0eV90eCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfc2NoZWR1bGVfd29yayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICgqdGFzaykodm9pZCAqKSkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlQUkVQQVJFX1dPUksoJnRwLT50YXNrLCB0YXNrLCBkZXYpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHAtPnRhc2ssIDQpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3dhaXRfZm9yX3F1aWVzY2VuY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCisJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKworCS8qIFdhaXQgZm9yIGFueSBwZW5kaW5nIE5BUEkgdGFzayB0byBjb21wbGV0ZSAqLworCW5ldGlmX3BvbGxfZGlzYWJsZShkZXYpOworCisJcnRsODE2OV9pcnFfbWFza19hbmRfYWNrKGlvYWRkcik7CisKKwluZXRpZl9wb2xsX2VuYWJsZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3JlaW5pdF90YXNrKHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBfZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlydGw4MTY5X3dhaXRfZm9yX3F1aWVzY2VuY2UoZGV2KTsKKwkJcnRsODE2OV9jbG9zZShkZXYpOworCX0KKworCXJldCA9IHJ0bDgxNjlfb3BlbihkZXYpOworCWlmICh1bmxpa2VseShyZXQgPCAwKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoUEZYIEtFUk5fRVJSICIlczogcmVpbml0IGZhaWx1cmUgKHN0YXR1cyA9ICVkKS4iCisJCQkgICAgICAgIiBSZXNjaGVkdWxpbmcuXG4iLCBkZXYtPm5hbWUsIHJldCk7CisJCX0KKwkJcnRsODE2OV9zY2hlZHVsZV93b3JrKGRldiwgcnRsODE2OV9yZWluaXRfdGFzayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3Jlc2V0X3Rhc2sodm9pZCAqX2RhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IF9kYXRhOworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm47CisKKwlydGw4MTY5X3dhaXRfZm9yX3F1aWVzY2VuY2UoZGV2KTsKKworCXJ0bDgxNjlfcnhfaW50ZXJydXB0KGRldiwgdHAsIHRwLT5tbWlvX2FkZHIpOworCXJ0bDgxNjlfdHhfY2xlYXIodHApOworCisJaWYgKHRwLT5kaXJ0eV9yeCA9PSB0cC0+Y3VyX3J4KSB7CisJCXJ0bDgxNjlfaW5pdF9yaW5nX2luZGV4ZXModHApOworCQlydGw4MTY5X2h3X3N0YXJ0KGRldik7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9IGVsc2UgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoUEZYIEtFUk5fRU1FUkcgIiVzOiBSeCBidWZmZXJzIHNob3J0YWdlXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCX0KKwkJcnRsODE2OV9zY2hlZHVsZV93b3JrKGRldiwgcnRsODE2OV9yZXNldF90YXNrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJ0bDgxNjlfaHdfcmVzZXQodHAtPm1taW9fYWRkcik7CisKKwkvKiBMZXQncyB3YWl0IGEgYml0IHdoaWxlIGFueSAoYXN5bmMpIGlycSBsYW5kcyBvbiAqLworCXJ0bDgxNjlfc2NoZWR1bGVfd29yayhkZXYsIHJ0bDgxNjlfcmVzZXRfdGFzayk7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV94bWl0X2ZyYWdzKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgdTMyIG9wdHMxKQoreworCXN0cnVjdCBza2Jfc2hhcmVkX2luZm8gKmluZm8gPSBza2Jfc2hpbmZvKHNrYik7CisJdW5zaWduZWQgaW50IGN1cl9mcmFnLCBlbnRyeTsKKwlzdHJ1Y3QgVHhEZXNjICp0eGQ7CisKKwllbnRyeSA9IHRwLT5jdXJfdHg7CisJZm9yIChjdXJfZnJhZyA9IDA7IGN1cl9mcmFnIDwgaW5mby0+bnJfZnJhZ3M7IGN1cl9mcmFnKyspIHsKKwkJc2tiX2ZyYWdfdCAqZnJhZyA9IGluZm8tPmZyYWdzICsgY3VyX2ZyYWc7CisJCWRtYV9hZGRyX3QgbWFwcGluZzsKKwkJdTMyIHN0YXR1cywgbGVuOworCQl2b2lkICphZGRyOworCisJCWVudHJ5ID0gKGVudHJ5ICsgMSkgJSBOVU1fVFhfREVTQzsKKworCQl0eGQgPSB0cC0+VHhEZXNjQXJyYXkgKyBlbnRyeTsKKwkJbGVuID0gZnJhZy0+c2l6ZTsKKwkJYWRkciA9ICgodm9pZCAqKSBwYWdlX2FkZHJlc3MoZnJhZy0+cGFnZSkpICsgZnJhZy0+cGFnZV9vZmZzZXQ7CisJCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGNpX2RldiwgYWRkciwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQkvKiBhbnRpIGdjYyAyLjk1LjMgYnVnd2FyZSAoc2ljKSAqLworCQlzdGF0dXMgPSBvcHRzMSB8IGxlbiB8IChSaW5nRW5kICogISgoZW50cnkgKyAxKSAlIE5VTV9UWF9ERVNDKSk7CisKKwkJdHhkLT5vcHRzMSA9IGNwdV90b19sZTMyKHN0YXR1cyk7CisJCXR4ZC0+YWRkciA9IGNwdV90b19sZTY0KG1hcHBpbmcpOworCisJCXRwLT50eF9za2JbZW50cnldLmxlbiA9IGxlbjsKKwl9CisKKwlpZiAoY3VyX2ZyYWcpIHsKKwkJdHAtPnR4X3NrYltlbnRyeV0uc2tiID0gc2tiOworCQl0eGQtPm9wdHMxIHw9IGNwdV90b19sZTMyKExhc3RGcmFnKTsKKwl9CisKKwlyZXR1cm4gY3VyX2ZyYWc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJ0bDgxNjlfdHNvX2NzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVFNPKSB7CisJCXUzMiBtc3MgPSBza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplOworCisJCWlmIChtc3MpCisJCQlyZXR1cm4gTGFyZ2VTZW5kIHwgKChtc3MgJiBNU1NNYXNrKSA8PCBNU1NTaGlmdCk7CisJfQorCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwID0gc2tiLT5uaC5pcGg7CisKKwkJaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKwkJCXJldHVybiBJUENTIHwgVENQQ1M7CisJCWVsc2UgaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKKwkJCXJldHVybiBJUENTIHwgVURQQ1M7CisJCVdBUk5fT04oMSk7CS8qIHdlIG5lZWQgYSBXQVJOKCkgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBmcmFncywgZW50cnkgPSB0cC0+Y3VyX3R4ICUgTlVNX1RYX0RFU0M7CisJc3RydWN0IFR4RGVzYyAqdHhkID0gdHAtPlR4RGVzY0FycmF5ICsgZW50cnk7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKwl1MzIgc3RhdHVzLCBsZW47CisJdTMyIG9wdHMxOworCWludCByZXQgPSAwOworCQorCWlmICh1bmxpa2VseShUWF9CVUZGU19BVkFJTCh0cCkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQlVHISBUeCBSaW5nIGZ1bGwgd2hlbiBxdWV1ZSBhd2FrZSFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIGVycl9zdG9wOworCX0KKworCWlmICh1bmxpa2VseShsZTMyX3RvX2NwdSh0eGQtPm9wdHMxKSAmIERlc2NPd24pKQorCQlnb3RvIGVycl9zdG9wOworCisJb3B0czEgPSBEZXNjT3duIHwgcnRsODE2OV90c29fY3N1bShza2IsIGRldik7CisKKwlmcmFncyA9IHJ0bDgxNjlfeG1pdF9mcmFncyh0cCwgc2tiLCBvcHRzMSk7CisJaWYgKGZyYWdzKSB7CisJCWxlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisJCW9wdHMxIHw9IEZpcnN0RnJhZzsKKwl9IGVsc2UgeworCQlsZW4gPSBza2ItPmxlbjsKKworCQlpZiAodW5saWtlbHkobGVuIDwgRVRIX1pMRU4pKSB7CisJCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCQlpZiAoIXNrYikKKwkJCQlnb3RvIGVycl91cGRhdGVfc3RhdHM7CisJCQlsZW4gPSBFVEhfWkxFTjsKKwkJfQorCisJCW9wdHMxIHw9IEZpcnN0RnJhZyB8IExhc3RGcmFnOworCQl0cC0+dHhfc2tiW2VudHJ5XS5za2IgPSBza2I7CisJfQorCisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wY2lfZGV2LCBza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwl0cC0+dHhfc2tiW2VudHJ5XS5sZW4gPSBsZW47CisJdHhkLT5hZGRyID0gY3B1X3RvX2xlNjQobWFwcGluZyk7CisJdHhkLT5vcHRzMiA9IGNwdV90b19sZTMyKHJ0bDgxNjlfdHhfdmxhbl90YWcodHAsIHNrYikpOworCisJd21iKCk7CisKKwkvKiBhbnRpIGdjYyAyLjk1LjMgYnVnd2FyZSAoc2ljKSAqLworCXN0YXR1cyA9IG9wdHMxIHwgbGVuIHwgKFJpbmdFbmQgKiAhKChlbnRyeSArIDEpICUgTlVNX1RYX0RFU0MpKTsKKwl0eGQtPm9wdHMxID0gY3B1X3RvX2xlMzIoc3RhdHVzKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJdHAtPmN1cl90eCArPSBmcmFncyArIDE7CisKKwlzbXBfd21iKCk7CisKKwlSVExfVzgoVHhQb2xsLCAweDQwKTsJLyogc2V0IHBvbGxpbmcgYml0ICovCisKKwlpZiAoVFhfQlVGRlNfQVZBSUwodHApIDwgTUFYX1NLQl9GUkFHUykgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNtcF9ybWIoKTsKKwkJaWYgKFRYX0JVRkZTX0FWQUlMKHRwKSA+PSBNQVhfU0tCX0ZSQUdTKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworb3V0OgorCXJldHVybiByZXQ7CisKK2Vycl9zdG9wOgorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlyZXQgPSAxOworZXJyX3VwZGF0ZV9zdGF0czoKKwl0cC0+c3RhdHMudHhfZHJvcHBlZCsrOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3BjaWVycl9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGNpX2RldjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdTE2IHBjaV9zdGF0dXMsIHBjaV9jbWQ7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jbWQpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVEFUVVMsICZwY2lfc3RhdHVzKTsKKworCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBQQ0kgZXJyb3IgKGNtZCA9IDB4JTA0eCwgc3RhdHVzID0gMHglMDR4KS5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgcGNpX2NtZCwgcGNpX3N0YXR1cyk7CisKKwkvKgorCSAqIFRoZSByZWNvdmVyeSBzZXF1ZW5jZSBiZWxvdyBhZG1pdHMgYSB2ZXJ5IGVsYWJvcmF0ZWQgZXhwbGFuYXRpb246CisJICogLSBpdCBzZWVtcyB0byB3b3JrOworCSAqIC0gSSBkaWQgbm90IHNlZSB3aGF0IGVsc2UgY291bGQgYmUgZG9uZS4KKwkgKgorCSAqIEZlZWwgZnJlZSB0byBhZGp1c3QgdG8geW91ciBuZWVkcy4KKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsCisJCQkgICAgICBwY2lfY21kIHwgUENJX0NPTU1BTkRfU0VSUiB8IFBDSV9DT01NQU5EX1BBUklUWSk7CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX1NUQVRVUywKKwkJcGNpX3N0YXR1cyAmIChQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWSB8CisJCVBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUiB8IFBDSV9TVEFUVVNfUkVDX01BU1RFUl9BQk9SVCB8CisJCVBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVCB8IFBDSV9TVEFUVVNfU0lHX1RBUkdFVF9BQk9SVCkpOworCisJLyogVGhlIGluZmFtb3VzIERBQyBmKmNrdXAgb25seSBoYXBwZW5zIGF0IGJvb3QgdGltZSAqLworCWlmICgodHAtPmNwX2NtZCAmIFBDSURBQykgJiYgIXRwLT5kaXJ0eV9yeCAmJiAhdHAtPmN1cl9yeCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IGRpc2FibGluZyBQQ0kgREFDLlxuIiwgZGV2LT5uYW1lKTsKKwkJdHAtPmNwX2NtZCAmPSB+UENJREFDOworCQlSVExfVzE2KENQbHVzQ21kLCB0cC0+Y3BfY21kKTsKKwkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9ISUdIRE1BOworCQlydGw4MTY5X3NjaGVkdWxlX3dvcmsoZGV2LCBydGw4MTY5X3JlaW5pdF90YXNrKTsKKwl9CisKKwlydGw4MTY5X2h3X3Jlc2V0KGlvYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkCitydGw4MTY5X3R4X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwKKwkJICAgICB2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgZGlydHlfdHgsIHR4X2xlZnQ7CisKKwlhc3NlcnQoZGV2ICE9IE5VTEwpOworCWFzc2VydCh0cCAhPSBOVUxMKTsKKwlhc3NlcnQoaW9hZGRyICE9IE5VTEwpOworCisJZGlydHlfdHggPSB0cC0+ZGlydHlfdHg7CisJc21wX3JtYigpOworCXR4X2xlZnQgPSB0cC0+Y3VyX3R4IC0gZGlydHlfdHg7CisKKwl3aGlsZSAodHhfbGVmdCA+IDApIHsKKwkJdW5zaWduZWQgaW50IGVudHJ5ID0gZGlydHlfdHggJSBOVU1fVFhfREVTQzsKKwkJc3RydWN0IHJpbmdfaW5mbyAqdHhfc2tiID0gdHAtPnR4X3NrYiArIGVudHJ5OworCQl1MzIgbGVuID0gdHhfc2tiLT5sZW47CisJCXUzMiBzdGF0dXM7CisKKwkJcm1iKCk7CisJCXN0YXR1cyA9IGxlMzJfdG9fY3B1KHRwLT5UeERlc2NBcnJheVtlbnRyeV0ub3B0czEpOworCQlpZiAoc3RhdHVzICYgRGVzY093bikKKwkJCWJyZWFrOworCisJCXRwLT5zdGF0cy50eF9ieXRlcyArPSBsZW47CisJCXRwLT5zdGF0cy50eF9wYWNrZXRzKys7CisKKwkJcnRsODE2OV91bm1hcF90eF9za2IodHAtPnBjaV9kZXYsIHR4X3NrYiwgdHAtPlR4RGVzY0FycmF5ICsgZW50cnkpOworCisJCWlmIChzdGF0dXMgJiBMYXN0RnJhZykgeworCQkJZGV2X2tmcmVlX3NrYl9pcnEodHhfc2tiLT5za2IpOworCQkJdHhfc2tiLT5za2IgPSBOVUxMOworCQl9CisJCWRpcnR5X3R4Kys7CisJCXR4X2xlZnQtLTsKKwl9CisKKwlpZiAodHAtPmRpcnR5X3R4ICE9IGRpcnR5X3R4KSB7CisJCXRwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCQlzbXBfd21iKCk7CisJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkJICAgIChUWF9CVUZGU19BVkFJTCh0cCkgPj0gTUFYX1NLQl9GUkFHUykpIHsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bDgxNjlfcnhfY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUnhEZXNjICpkZXNjKQoreworCXUzMiBvcHRzMSA9IGxlMzJfdG9fY3B1KGRlc2MtPm9wdHMxKTsKKwl1MzIgc3RhdHVzID0gb3B0czEgJiBSeFByb3RvTWFzazsKKworCWlmICgoKHN0YXR1cyA9PSBSeFByb3RvVENQKSAmJiAhKG9wdHMxICYgVENQRmFpbCkpIHx8CisJICAgICgoc3RhdHVzID09IFJ4UHJvdG9VRFApICYmICEob3B0czEgJiBVRFBGYWlsKSkgfHwKKwkgICAgKChzdGF0dXMgPT0gUnhQcm90b0lQKSAmJiAhKG9wdHMxICYgSVBGYWlsKSkpCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJZWxzZQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJ0bDgxNjlfdHJ5X3J4X2NvcHkoc3RydWN0IHNrX2J1ZmYgKipza19idWZmLCBpbnQgcGt0X3NpemUsCisJCQkJICAgICAgc3RydWN0IFJ4RGVzYyAqZGVzYywgaW50IHJ4X2J1Zl9zeikKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAocGt0X3NpemUgPCByeF9jb3B5YnJlYWspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9zaXplICsgTkVUX0lQX0FMSUdOKTsKKwkJaWYgKHNrYikgeworCQkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIHNrX2J1ZmZbMF0tPnRhaWwsIHBrdF9zaXplLCAwKTsKKwkJCSpza19idWZmID0gc2tiOworCQkJcnRsODE2OV9tYXJrX3RvX2FzaWMoZGVzYywgcnhfYnVmX3N6KTsKKwkJCXJldCA9IDA7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorcnRsODE2OV9yeF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsCisJCSAgICAgdm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJdW5zaWduZWQgaW50IGN1cl9yeCwgcnhfbGVmdDsKKwl1bnNpZ25lZCBpbnQgZGVsdGEsIGNvdW50OworCisJYXNzZXJ0KGRldiAhPSBOVUxMKTsKKwlhc3NlcnQodHAgIT0gTlVMTCk7CisJYXNzZXJ0KGlvYWRkciAhPSBOVUxMKTsKKworCWN1cl9yeCA9IHRwLT5jdXJfcng7CisJcnhfbGVmdCA9IE5VTV9SWF9ERVNDICsgdHAtPmRpcnR5X3J4IC0gY3VyX3J4OworCXJ4X2xlZnQgPSBydGw4MTY5X3J4X3F1b3RhKHJ4X2xlZnQsICh1MzIpIGRldi0+cXVvdGEpOworCisJd2hpbGUgKHJ4X2xlZnQgPiAwKSB7CisJCXVuc2lnbmVkIGludCBlbnRyeSA9IGN1cl9yeCAlIE5VTV9SWF9ERVNDOworCQl1MzIgc3RhdHVzOworCisJCXJtYigpOworCQlzdGF0dXMgPSBsZTMyX3RvX2NwdSh0cC0+UnhEZXNjQXJyYXlbZW50cnldLm9wdHMxKTsKKworCQlpZiAoc3RhdHVzICYgRGVzY093bikKKwkJCWJyZWFrOworCQlpZiAoc3RhdHVzICYgUnhSRVMpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSeCBFUlJPUiEhIVxuIiwgZGV2LT5uYW1lKTsKKwkJCXRwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAoUnhSV1QgfCBSeFJVTlQpKQorCQkJCXRwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUnhDUkMpCisJCQkJdHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBSeERlc2MgKmRlc2MgPSB0cC0+UnhEZXNjQXJyYXkgKyBlbnRyeTsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSB0cC0+Unhfc2tidWZmW2VudHJ5XTsKKwkJCWludCBwa3Rfc2l6ZSA9IChzdGF0dXMgJiAweDAwMDAxRkZGKSAtIDQ7CisJCQl2b2lkICgqcGNpX2FjdGlvbikoc3RydWN0IHBjaV9kZXYgKiwgZG1hX2FkZHJfdCwKKwkJCQlzaXplX3QsIGludCkgPSBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2U7CisKKwkJCXJ0bDgxNjlfcnhfY3N1bShza2IsIGRlc2MpOworCQkJCisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodHAtPnBjaV9kZXYsCisJCQkJbGU2NF90b19jcHUoZGVzYy0+YWRkciksIHRwLT5yeF9idWZfc3osCisJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJaWYgKHJ0bDgxNjlfdHJ5X3J4X2NvcHkoJnNrYiwgcGt0X3NpemUsIGRlc2MsCisJCQkJCQl0cC0+cnhfYnVmX3N6KSkgeworCQkJCXBjaV9hY3Rpb24gPSBwY2lfdW5tYXBfc2luZ2xlOworCQkJCXRwLT5SeF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCX0KKworCQkJcGNpX2FjdGlvbih0cC0+cGNpX2RldiwgbGU2NF90b19jcHUoZGVzYy0+YWRkciksCisJCQkJICAgdHAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcHV0KHNrYiwgcGt0X3NpemUpOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCQkJaWYgKHJ0bDgxNjlfcnhfdmxhbl9za2IodHAsIGRlc2MsIHNrYikgPCAwKQorCQkJCXJ0bDgxNjlfcnhfc2tiKHNrYik7CisKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQl0cC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X3NpemU7CisJCQl0cC0+c3RhdHMucnhfcGFja2V0cysrOworCQl9CisJCQorCQljdXJfcngrKzsgCisJCXJ4X2xlZnQtLTsKKwl9CisKKwljb3VudCA9IGN1cl9yeCAtIHRwLT5jdXJfcng7CisJdHAtPmN1cl9yeCA9IGN1cl9yeDsKKworCWRlbHRhID0gcnRsODE2OV9yeF9maWxsKHRwLCBkZXYsIHRwLT5kaXJ0eV9yeCwgdHAtPmN1cl9yeCk7CisJaWYgKCFkZWx0YSAmJiBjb3VudCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIFJ4IGJ1ZmZlciBhbGxvY2F0ZWRcbiIsIGRldi0+bmFtZSk7CisJdHAtPmRpcnR5X3J4ICs9IGRlbHRhOworCisJLyoKKwkgKiBGSVhNRTogdW50aWwgdGhlcmUgaXMgcGVyaW9kaWMgdGltZXIgdG8gdHJ5IGFuZCByZWZpbGwgdGhlIHJpbmcsCisJICogYSB0ZW1wb3Jhcnkgc2hvcnRhZ2UgbWF5IGRlZmluaXRlbHkga2lsbCB0aGUgUnggcHJvY2Vzcy4KKwkgKiAtIGRpc2FibGUgdGhlIGFzaWMgdG8gdHJ5IGFuZCBhdm9pZCBhbiBvdmVyZmxvdyBhbmQga2ljayBpdCBhZ2FpbgorCSAqICAgYWZ0ZXIgcmVmaWxsID8KKwkgKiAtIGhvdyBkbyBvdGhlcnMgZHJpdmVyIGhhbmRsZSB0aGlzIGNvbmRpdGlvbiAoVWggb2guLi4pLgorCSAqLworCWlmICh0cC0+ZGlydHlfcnggKyBOVU1fUlhfREVTQyA9PSB0cC0+Y3VyX3J4KQorCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IFJ4IGJ1ZmZlcnMgZXhoYXVzdGVkXG4iLCBkZXYtPm5hbWUpOworCisJcmV0dXJuIGNvdW50OworfQorCisvKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhbGwgb2YgdGhlIFJ4IHRocmVhZCB3b3JrIGFuZCBjbGVhbnMgdXAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorcnRsODE2OV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGJvZ3VzY250ID0gbWF4X2ludGVycnVwdF93b3JrOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgc3RhdHVzOworCWludCBoYW5kbGVkID0gMDsKKworCWRvIHsKKwkJc3RhdHVzID0gUlRMX1IxNihJbnRyU3RhdHVzKTsKKworCQkvKiBob3RwbHVnL21ham9yIGVycm9yL25vIG1vcmUgd29yay9zaGFyZWQgaXJxICovCisJCWlmICgoc3RhdHVzID09IDB4RkZGRikgfHwgIXN0YXR1cykKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisJCWlmICh1bmxpa2VseSghbmV0aWZfcnVubmluZyhkZXYpKSkgeworCQkJcnRsODE2OV9hc2ljX2Rvd24oaW9hZGRyKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3RhdHVzICY9IHRwLT5pbnRyX21hc2s7CisJCVJUTF9XMTYoSW50clN0YXR1cywKKwkJCShzdGF0dXMgJiBSeEZJRk9PdmVyKSA/IChzdGF0dXMgfCBSeE92ZXJmbG93KSA6IHN0YXR1cyk7CisKKwkJaWYgKCEoc3RhdHVzICYgcnRsODE2OV9pbnRyX21hc2spKQorCQkJYnJlYWs7CisKKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIFNZU0VycikpIHsKKwkJCXJ0bDgxNjlfcGNpZXJyX2ludGVycnVwdChkZXYpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc3RhdHVzICYgTGlua0NoZykKKwkJCXJ0bDgxNjlfY2hlY2tfbGlua19zdGF0dXMoZGV2LCB0cCwgaW9hZGRyKTsKKworI2lmZGVmIENPTkZJR19SODE2OV9OQVBJCisJCVJUTF9XMTYoSW50ck1hc2ssIHJ0bDgxNjlfaW50cl9tYXNrICYgfnJ0bDgxNjlfbmFwaV9ldmVudCk7CisJCXRwLT5pbnRyX21hc2sgPSB+cnRsODE2OV9uYXBpX2V2ZW50OworCisJCWlmIChsaWtlbHkobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChkZXYpKSkKKwkJCV9fbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogaW50ZXJydXB0ICUwNHggdGFrZW4gaW4gcG9sbFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CQorCQl9CisJCWJyZWFrOworI2Vsc2UKKwkJLyogUnggaW50ZXJydXB0ICovCisJCWlmIChzdGF0dXMgJiAoUnhPSyB8IFJ4T3ZlcmZsb3cgfCBSeEZJRk9PdmVyKSkgeworCQkJcnRsODE2OV9yeF9pbnRlcnJ1cHQoZGV2LCB0cCwgaW9hZGRyKTsKKwkJfQorCQkvKiBUeCBpbnRlcnJ1cHQgKi8KKwkJaWYgKHN0YXR1cyAmIChUeE9LIHwgVHhFcnIpKQorCQkJcnRsODE2OV90eF9pbnRlcnJ1cHQoZGV2LCB0cCwgaW9hZGRyKTsKKyNlbmRpZgorCisJCWJvZ3VzY250LS07CisJfSB3aGlsZSAoYm9ndXNjbnQgPiAwKTsKKworCWlmIChib2d1c2NudCA8PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQkvKiBDbGVhciBhbGwgaW50ZXJydXB0IHNvdXJjZXMuICovCisJCVJUTF9XMTYoSW50clN0YXR1cywgMHhmZmZmKTsKKwl9CitvdXQ6CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUjgxNjlfTkFQSQorc3RhdGljIGludCBydGw4MTY5X3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCit7CisJdW5zaWduZWQgaW50IHdvcmtfZG9uZSwgd29ya190b19kbyA9IG1pbigqYnVkZ2V0LCBkZXYtPnF1b3RhKTsKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCisJd29ya19kb25lID0gcnRsODE2OV9yeF9pbnRlcnJ1cHQoZGV2LCB0cCwgaW9hZGRyKTsKKwlydGw4MTY5X3R4X2ludGVycnVwdChkZXYsIHRwLCBpb2FkZHIpOworCisJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CisJZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisKKwlpZiAod29ya19kb25lIDwgd29ya190b19kbykgeworCQluZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCQl0cC0+aW50cl9tYXNrID0gMHhmZmZmOworCQkvKgorCQkgKiAyMDA0MDQyNjogdGhlIGJhcnJpZXIgaXMgbm90IHN0cmljdGx5IHJlcXVpcmVkIGJ1dCB0aGUKKwkJICogYmVoYXZpb3Igb2YgdGhlIGlycSBoYW5kbGVyIGNvdWxkIGJlIGxlc3MgcHJlZGljdGFibGUKKwkJICogd2l0aG91dCBpdC4gQnR3LCB0aGUgbGFjayBvZiBmbHVzaCBmb3IgdGhlIHBvc3RlZCBwY2kKKwkJICogd3JpdGUgaXMgc2FmZSAtIEZSCisJCSAqLworCQlzbXBfd21iKCk7CisJCVJUTF9XMTYoSW50ck1hc2ssIHJ0bDgxNjlfaW50cl9tYXNrKTsKKwl9CisKKwlyZXR1cm4gKHdvcmtfZG9uZSA+PSB3b3JrX3RvX2RvKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBydGw4MTY5X2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGludCBwb2xsX2xvY2tlZCA9IDA7CisKKwlydGw4MTY5X2RlbGV0ZV90aW1lcihkZXYpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworY29yZV9kb3duOgorCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKworCXJ0bDgxNjlfYXNpY19kb3duKGlvYWRkcik7CisKKwkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50cy4gKi8KKwl0cC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBSVExfUjMyKFJ4TWlzc2VkKTsKKwlSVExfVzMyKFJ4TWlzc2VkLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKworCWlmICghcG9sbF9sb2NrZWQpIHsKKwkJbmV0aWZfcG9sbF9kaXNhYmxlKGRldik7CisJCXBvbGxfbG9ja2VkKys7CisJfQorCisJLyogR2l2ZSBhIHJhY2luZyBoYXJkX3N0YXJ0X3htaXQgYSBmZXcgY3ljbGVzIHRvIGNvbXBsZXRlLiAqLworCXN5bmNocm9uaXplX2tlcm5lbCgpOworCisJLyoKKwkgKiBBbmQgbm93IGZvciB0aGUgNTBrJCBxdWVzdGlvbjogYXJlIElSUSBkaXNhYmxlZCBvciBub3QgPworCSAqCisJICogVHdvIHBhdGhzIGxlYWQgaGVyZToKKwkgKiAxKSBkZXYtPmNsb3NlCisJICogICAgLT4gbmV0aWZfcnVubmluZygpIGlzIGF2YWlsYWJsZSB0byBzeW5jIHRoZSBjdXJyZW50IGNvZGUgYW5kIHRoZQorCSAqICAgICAgIElSUSBoYW5kbGVyLiBTZWUgcnRsODE2OV9pbnRlcnJ1cHQgZm9yIGRldGFpbHMuCisJICogMikgZGV2LT5jaGFuZ2VfbXR1CisJICogICAgLT4gcnRsODE2OV9wb2xsIGNhbiBub3QgYmUgaXNzdWVkIGFnYWluIGFuZCByZS1lbmFibGUgdGhlCisJICogICAgICAgaW50ZXJydXB0aW9ucy4gTGV0J3Mgc2ltcGx5IGlzc3VlIHRoZSBJUlEgZG93biBzZXF1ZW5jZSBhZ2Fpbi4KKwkgKi8KKwlpZiAoUlRMX1IxNihJbnRyTWFzaykpCisJCWdvdG8gY29yZV9kb3duOworCisJcnRsODE2OV90eF9jbGVhcih0cCk7CisKKwlydGw4MTY5X3J4X2NsZWFyKHRwKTsKK30KKworc3RhdGljIGludCBydGw4MTY5X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdHAtPnBjaV9kZXY7CisKKwlydGw4MTY5X2Rvd24oZGV2KTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJbmV0aWZfcG9sbF9lbmFibGUoZGV2KTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUjgxNjlfUlhfUklOR19CWVRFUywgdHAtPlJ4RGVzY0FycmF5LAorCQkJICAgIHRwLT5SeFBoeUFkZHIpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUjgxNjlfVFhfUklOR19CWVRFUywgdHAtPlR4RGVzY0FycmF5LAorCQkJICAgIHRwLT5UeFBoeUFkZHIpOworCXRwLT5UeERlc2NBcnJheSA9IE5VTEw7CisJdHAtPlJ4RGVzY0FycmF5ID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcnRsODE2OV9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgbWNfZmlsdGVyWzJdOwkvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKwlpbnQgaSwgcnhfbW9kZTsKKwl1MzIgdG1wID0gMDsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJ4X21vZGUgPQorCQkgICAgQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzIHwKKwkJICAgIEFjY2VwdEFsbFBoeXM7CisJCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IDB4ZmZmZmZmZmY7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpCisJCSAgIHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBmaWx0ZXIgcGVyZmVjdGx5IC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMHhmZmZmZmZmZjsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMDsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWludCBiaXRfbnIgPSBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDI2OworCQkJbWNfZmlsdGVyW2JpdF9uciA+PiA1XSB8PSAxIDw8IChiaXRfbnIgJiAzMSk7CisJCQlyeF9tb2RlIHw9IEFjY2VwdE11bHRpY2FzdDsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJdG1wID0gcnRsODE2OV9yeF9jb25maWcgfCByeF9tb2RlIHwKKwkgICAgICAoUlRMX1IzMihSeENvbmZpZykgJiBydGxfY2hpcF9pbmZvW3RwLT5jaGlwc2V0XS5SeENvbmZpZ01hc2spOworCisJUlRMX1czMihSeENvbmZpZywgdG1wKTsKKwlSVExfVzMyKE1BUjAgKyAwLCBtY19maWx0ZXJbMF0pOworCVJUTF9XMzIoTUFSMCArIDQsIG1jX2ZpbHRlclsxXSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqICBydGw4MTY5X2dldF9zdGF0cyAtIEdldCBydGw4MTY5IHJlYWQvd3JpdGUgc3RhdGlzdGljcworICogIEBkZXY6IFRoZSBFdGhlcm5ldCBEZXZpY2UgdG8gZ2V0IHN0YXRpc3RpY3MgZm9yCisgKgorICogIEdldCBUWC9SWCBzdGF0aXN0aWNzIGZvciBydGw4MTY5CisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnRsODE2OV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCQl0cC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBSVExfUjMyKFJ4TWlzc2VkKTsKKwkJUlRMX1czMihSeE1pc3NlZCwgMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisJfQorCQkKKwlyZXR1cm4gJnRwLT5zdGF0czsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHJ0bDgxNjlfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBNT0RVTEVOQU1FLAorCS5pZF90YWJsZQk9IHJ0bDgxNjlfcGNpX3RibCwKKwkucHJvYmUJCT0gcnRsODE2OV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHJ0bDgxNjlfcmVtb3ZlX29uZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBydGw4MTY5X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBydGw4MTY5X3Jlc3VtZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2luaXQKK3J0bDgxNjlfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZydGw4MTY5X3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3J0bDgxNjlfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnJ0bDgxNjlfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHJ0bDgxNjlfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocnRsODE2OV9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ycnVubmVyLmMgYi9kcml2ZXJzL25ldC9ycnVubmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhODZmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3JydW5uZXIuYwpAQCAtMCwwICsxLDE3NTYgQEAKKy8qCisgKiBycnVubmVyLmM6IExpbnV4IGRyaXZlciBmb3IgdGhlIEVzc2VudGlhbCBSb2FkUnVubmVyIEhJUFBJIGJvYXJkLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAyIGJ5IEplcyBTb3JlbnNlbiwgPGplc0B3aWxkb3BlbnNvdXJjZS5jb20+LgorICoKKyAqIFRoYW5rcyB0byBFc3NlbnRpYWwgQ29tbXVuaWNhdGlvbiBmb3IgcHJvdmlkaW5nIHVzIHdpdGggaGFyZHdhcmUKKyAqIGFuZCB2ZXJ5IGNvbXByZWhlbnNpdmUgZG9jdW1lbnRhdGlvbiB3aXRob3V0IHdoaWNoIEkgd291bGQgbm90IGhhdmUKKyAqIGJlZW4gYWJsZSB0byB3cml0ZSB0aGlzIGRyaXZlci4gQSBzcGVjaWFsIHRoYW5rIHlvdSB0byBKb2huIEdpYmJvbgorICogZm9yIHNvcnRpbmcgb3V0IHRoZSBsZWdhbCBpc3N1ZXMsIHdpdGggdGhlIE5EQSwgYWxsb3dpbmcgdGhlIGNvZGUgdG8KKyAqIGJlIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGFua3MgdG8gSmF5YXJhbSBCaGF0IGZyb20gT0RTL0Vzc2VudGlhbCBmb3IgZml4aW5nIHNvbWUgb2YgdGhlCisgKiBzdHVwaWQgYnVncyBpbiBteSBjb2RlLgorICoKKyAqIFNvZnRuZXQgc3VwcG9ydCBhbmQgdmFyaW91cyBvdGhlciBwYXRjaGVzIGZyb20gVmFsIEhlbnNvbiBvZgorICogT0RTL0Vzc2VudGlhbC4KKyAqCisgKiBQQ0kgRE1BIG1hcHBpbmcgY29kZSBwYXJ0bHkgYmFzZWQgb24gd29yayBieSBGcmFuY29pcyBSb21pZXUuCisgKi8KKworCisjZGVmaW5lIERFQlVHIDEKKyNkZWZpbmUgUlhfRE1BX1NLQlVGRiAxCisjZGVmaW5lIFBLVF9DT1BZX1RIUkVTSE9MRCA1MTIKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oaXBwaWRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgcnJfaWZfYnVzeShkZXYpICAgICBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikKKyNkZWZpbmUgcnJfaWZfcnVubmluZyhkZXYpICBuZXRpZl9ydW5uaW5nKGRldikKKworI2luY2x1ZGUgInJydW5uZXIuaCIKKworI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMgKyAoeCkpCisKKworTU9EVUxFX0FVVEhPUigiSmVzIFNvcmVuc2VuIDxqZXNAd2lsZG9wZW5zb3VyY2UuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFc3NlbnRpYWwgUm9hZFJ1bm5lciBISVBQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPSAicnJ1bm5lci5jOiB2MC41MCAxMS8xMS8yMDAyICBKZXMgU29yZW5zZW4gKGplc0B3aWxkb3BlbnNvdXJjZS5jb20pXG4iOworCisvKgorICogSW1wbGVtZW50YXRpb24gbm90ZXM6CisgKgorICogVGhlIERNQSBlbmdpbmUgb25seSBhbGxvd3MgZm9yIERNQSB3aXRoaW4gcGh5c2ljYWwgNjRLQiBjaHVua3Mgb2YKKyAqIG1lbW9yeS4gVGhlIGN1cnJlbnQgYXBwcm9hY2ggb2YgdGhlIGRyaXZlciAoYW5kIHN0YWNrKSBpcyB0byB1c2UKKyAqIGxpbmVhciBibG9ja3Mgb2YgbWVtb3J5IGZvciB0aGUgc2tidWZmcy4gSG93ZXZlciwgYXMgdGhlIGRhdGEgYmxvY2sKKyAqIGlzIGFsd2F5cyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgc2tiIGFuZCBza2JzIGFyZSAyXm4gYWxpZ25lZCBzbyB3ZQorICogYXJlIGd1YXJhbnR0ZWQgdG8gZ2V0IHRoZSB3aG9sZSBibG9jayB3aXRoaW4gb25lIDY0S0IgYWxpZ24gNjRLQgorICogY2h1bmsuCisgKgorICogT24gdGhlIGxvbmcgdGVybSwgcmVseWluZyBvbiBiZWluZyBhYmxlIHRvIGFsbG9jYXRlIDY0S0IgbGluZWFyCisgKiBjaHVua3Mgb2YgbWVtb3J5IGlzIG5vdCBmZWFzaWJsZSBhbmQgdGhlIHNrYiBoYW5kbGluZyBjb2RlIGFuZCB0aGUKKyAqIHN0YWNrIHdpbGwgbmVlZCB0byBrbm93IGFib3V0IEkvTyB2ZWN0b3JzIG9yIHNvbWV0aGluZyBzaW1pbGFyLgorICovCisKKy8qCisgKiBUaGVzZSBhcmUgY2hlY2tlZCBhdCBpbml0IHRpbWUgdG8gc2VlIGlmIHRoZXkgYXJlIGF0IGxlYXN0IDI1NktCCisgKiBhbmQgaW5jcmVhc2VkIHRvIDI1NktCIGlmIHRoZXkgYXJlIG5vdC4gVGhpcyBpcyBkb25lIHRvIGF2b2lkIGVuZGluZworICogdXAgd2l0aCBzb2NrZXQgYnVmZmVycyBzbWFsbGVyIHRoYW4gdGhlIE1UVSBzaXplLAorICovCitleHRlcm4gX191MzIgc3lzY3RsX3dtZW1fbWF4OworZXh0ZXJuIF9fdTMyIHN5c2N0bF9ybWVtX21heDsKKworc3RhdGljIGludCBfX2RldmluaXQgcnJfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0YXRpYyBpbnQgdmVyc2lvbl9kaXNwOworCXU4IHBjaV9sYXRlbmN5OworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXY7CisJdm9pZCAqdG1wcHRyOworCWRtYV9hZGRyX3QgcmluZ19kbWE7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwlkZXYgPSBhbGxvY19oaXBwaV9kZXYoc2l6ZW9mKHN0cnVjdCBycl9wcml2YXRlKSk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0MzsKKworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQyOworCX0KKworCXJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJycnVubmVyIikpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlycnByaXYtPnBjaV9kZXYgPSBwZGV2OworCisJc3Bpbl9sb2NrX2luaXQoJnJycHJpdi0+bG9jayk7CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPm9wZW4gPSAmcnJfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZycl9zdGFydF94bWl0OworCWRldi0+c3RvcCA9ICZycl9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZycl9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9ICZycl9pb2N0bDsKKworCWRldi0+YmFzZV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCisJLyogZGlzcGxheSB2ZXJzaW9uIGluZm8gaWYgYWRhcHRlciBpcyBmb3VuZCAqLworCWlmICghdmVyc2lvbl9kaXNwKSB7CisJCS8qIHNldCBkaXNwbGF5IGZsYWcgdG8gVFJVRSBzbyB0aGF0ICovCisJCS8qIHdlIG9ubHkgZGlzcGxheSB0aGlzIHN0cmluZyBPTkNFICovCisJCXZlcnNpb25fZGlzcCA9IDE7CisJCXByaW50ayh2ZXJzaW9uKTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJnBjaV9sYXRlbmN5KTsKKwlpZiAocGNpX2xhdGVuY3kgPD0gMHg1OCl7CisJCXBjaV9sYXRlbmN5ID0gMHg1ODsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCBwY2lfbGF0ZW5jeSk7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogRXNzZW50aWFsIFJvYWRSdW5uZXIgc2VyaWFsIEhJUFBJICIKKwkgICAgICAgImF0IDB4JTA4bHgsIGlycSAlaSwgUENJIGxhdGVuY3kgJWlcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLCBwY2lfbGF0ZW5jeSk7CisKKwkvKgorCSAqIFJlbWFwIHRoZSByZWdzIGludG8ga2VybmVsIHNwYWNlLgorCSAqLworCisJcnJwcml2LT5yZWdzID0gaW9yZW1hcChkZXYtPmJhc2VfYWRkciwgMHgxMDAwKTsKKworCWlmICghcnJwcml2LT5yZWdzKXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogIFVuYWJsZSB0byBtYXAgSS9PIHJlZ2lzdGVyLCAiCisJCQkiUm9hZFJ1bm5lciB3aWxsIGJlIGRpc2FibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJdG1wcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlycnByaXYtPnR4X3JpbmcgPSB0bXBwdHI7CisJcnJwcml2LT50eF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJaWYgKCF0bXBwdHIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJdG1wcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlycnByaXYtPnJ4X3JpbmcgPSB0bXBwdHI7CisJcnJwcml2LT5yeF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJaWYgKCF0bXBwdHIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJdG1wcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgRVZUX1JJTkdfU0laRSwgJnJpbmdfZG1hKTsKKwlycnByaXYtPmV2dF9yaW5nID0gdG1wcHRyOworCXJycHJpdi0+ZXZ0X3JpbmdfZG1hID0gcmluZ19kbWE7CisKKwlpZiAoIXRtcHB0cikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIERvbid0IGFjY2VzcyBhbnkgcmVnaXN0ZXIgYmVmb3JlIHRoaXMgcG9pbnQhCisJICovCisjaWZkZWYgX19CSUdfRU5ESUFOCisJd3JpdGVsKHJlYWRsKCZycnByaXYtPnJlZ3MtPkhvc3RDdHJsKSB8IE5PX1NXQVAsCisJCSZycnByaXYtPnJlZ3MtPkhvc3RDdHJsKTsKKyNlbmRpZgorCS8qCisJICogTmVlZCB0byBhZGQgYSBjYXNlIGZvciBsaXR0bGUtZW5kaWFuIDY0LWJpdCBob3N0cyBoZXJlLgorCSAqLworCisJcnJfaW5pdChkZXYpOworCisJZGV2LT5iYXNlX2FkZHIgPSAwOworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CisKKyBvdXQ6CisJaWYgKHJycHJpdi0+cnhfcmluZykKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCBycnByaXYtPnJ4X3JpbmcsIAorCQkJCSAgICBycnByaXYtPnJ4X3JpbmdfZG1hKTsKKwlpZiAocnJwcml2LT50eF9yaW5nKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsIHJycHJpdi0+dHhfcmluZywKKwkJCQkgICAgcnJwcml2LT50eF9yaW5nX2RtYSk7CisJaWYgKHJycHJpdi0+cmVncykKKwkJaW91bm1hcChycnByaXYtPnJlZ3MpOwkKKwlpZiAocGRldikgeworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJfQorIG91dDI6CisJZnJlZV9uZXRkZXYoZGV2KTsKKyBvdXQzOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBycl9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldikgeworCQlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCWlmICghKHJlYWRsKCZyci0+cmVncy0+SG9zdEN0cmwpICYgTklDX0hBTFRFRCkpeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdHJ5aW5nIHRvIHVubG9hZCBydW5uaW5nIE5JQ1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJd3JpdGVsKEhBTFRfTklDLCAmcnItPnJlZ3MtPkhvc3RDdHJsKTsKKwkJfQorCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgRVZUX1JJTkdfU0laRSwgcnItPmV2dF9yaW5nLAorCQkJCSAgICByci0+ZXZ0X3JpbmdfZG1hKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCByci0+cnhfcmluZywKKwkJCQkgICAgcnItPnJ4X3JpbmdfZG1hKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCByci0+dHhfcmluZywKKwkJCQkgICAgcnItPnR4X3JpbmdfZG1hKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJaW91bm1hcChyci0+cmVncyk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCX0KK30KKworCisvKgorICogQ29tbWFuZHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc2xvdywgdGh1cyB0aGVyZSBpcyBubyByZWFzb24gdG8KKyAqIGlubGluZSB0aGlzLgorICovCitzdGF0aWMgdm9pZCBycl9pc3N1ZV9jbWQoc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiwgc3RydWN0IGNtZCAqY21kKQoreworCXN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3M7CisJdTMyIGlkeDsKKworCXJlZ3MgPSBycnByaXYtPnJlZ3M7CisJLyoKKwkgKiBUaGlzIGlzIHRlbXBvcmFyeSAtIGl0IHdpbGwgZ28gYXdheSBpbiB0aGUgZmluYWwgdmVyc2lvbi4KKwkgKiBXZSBwcm9iYWJseSBhbHNvIHdhbnQgdG8gbWFrZSB0aGlzIGZ1bmN0aW9uIGlubGluZS4KKwkgKi8KKwlpZiAocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKSAmIE5JQ19IQUxURUQpeworCQlwcmludGsoImlzc3VpbmcgY29tbWFuZCBmb3IgaGFsdGVkIE5JQywgY29kZSAweCV4LCAiCisJCSAgICAgICAiSG9zdEN0cmwgJTA4eFxuIiwgY21kLT5jb2RlLCByZWFkbCgmcmVncy0+SG9zdEN0cmwpKTsKKwkJaWYgKHJlYWRsKCZyZWdzLT5Nb2RlKSAmIEZBVEFMX0VSUikKKwkJCXByaW50aygiZXJyb3IgY29kZXMgRmFpbDEgJTAyeCwgRmFpbDIgJTAyeFxuIiwKKwkJCSAgICAgICByZWFkbCgmcmVncy0+RmFpbDEpLCByZWFkbCgmcmVncy0+RmFpbDIpKTsKKwl9CisKKwlpZHggPSBycnByaXYtPmluZm8tPmNtZF9jdHJsLnBpOworCisJd3JpdGVsKCoodTMyKikoY21kKSwgJnJlZ3MtPkNtZFJpbmdbaWR4XSk7CisJd21iKCk7CisKKwlpZHggPSAoaWR4IC0gMSkgJSBDTURfUklOR19FTlRSSUVTOworCXJycHJpdi0+aW5mby0+Y21kX2N0cmwucGkgPSBpZHg7CisJd21iKCk7CisKKwlpZiAocmVhZGwoJnJlZ3MtPk1vZGUpICYgRkFUQUxfRVJSKQorCQlwcmludGsoImVycm9yIGNvZGUgJTAyeFxuIiwgcmVhZGwoJnJlZ3MtPkZhaWwxKSk7Cit9CisKKworLyoKKyAqIFJlc2V0IHRoZSBib2FyZCBpbiBhIHNlbnNpYmxlIG1hbm5lci4gVGhlIE5JQyBpcyBhbHJlYWR5IGhhbHRlZAorICogd2hlbiB3ZSBnZXQgaGVyZSBhbmQgYSBzcGluLWxvY2sgaXMgaGVsZC4KKyAqLworc3RhdGljIGludCBycl9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXY7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgZWVwcm9tICpodyA9IE5VTEw7CisJdTMyIHN0YXJ0X3BjOworCWludCBpOworCisJcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZWdzID0gcnJwcml2LT5yZWdzOworCisJcnJfbG9hZF9maXJtd2FyZShkZXYpOworCisJd3JpdGVsKDB4MDEwMDAwMDAsICZyZWdzLT5UWF9zdGF0ZSk7CisJd3JpdGVsKDB4ZmY4MDAwMDAsICZyZWdzLT5SWF9zdGF0ZSk7CisJd3JpdGVsKDAsICZyZWdzLT5Bc3Npc3RTdGF0ZSk7CisJd3JpdGVsKENMRUFSX0lOVEEsICZyZWdzLT5Mb2NhbEN0cmwpOworCXdyaXRlbCgweDAxLCAmcmVncy0+QnJrUHQpOworCXdyaXRlbCgwLCAmcmVncy0+VGltZXIpOworCXdyaXRlbCgwLCAmcmVncy0+VGltZXJSZWYpOworCXdyaXRlbChSRVNFVF9ETUEsICZyZWdzLT5EbWFSZWFkU3RhdGUpOworCXdyaXRlbChSRVNFVF9ETUEsICZyZWdzLT5EbWFXcml0ZVN0YXRlKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVdyaXRlSG9zdEhpKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVdyaXRlSG9zdExvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVJlYWRIb3N0SGkpOworCXdyaXRlbCgwLCAmcmVncy0+RG1hUmVhZEhvc3RMbyk7CisJd3JpdGVsKDAsICZyZWdzLT5EbWFSZWFkTGVuKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVdyaXRlTGVuKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVdyaXRlTGNsKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVdyaXRlSVBjaGVja3N1bSk7CisJd3JpdGVsKDAsICZyZWdzLT5EbWFSZWFkTGNsKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVJlYWRJUGNoZWNrc3VtKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlBjaVN0YXRlKTsKKyNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkgJiYgZGVmaW5lZCBfX0xJVFRMRV9FTkRJQU4KKwl3cml0ZWwoU1dBUF9EQVRBIHwgUFRSNjRCSVQgfCBQVFJfV0RfU1dBUCwgJnJlZ3MtPk1vZGUpOworI2VsaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCisJd3JpdGVsKFNXQVBfREFUQSB8IFBUUjY0QklUIHwgUFRSX1dEX05PU1dBUCwgJnJlZ3MtPk1vZGUpOworI2Vsc2UKKwl3cml0ZWwoU1dBUF9EQVRBIHwgUFRSMzJCSVQgfCBQVFJfV0RfTk9TV0FQLCAmcmVncy0+TW9kZSk7CisjZW5kaWYKKworI2lmIDAKKwkvKgorCSAqIERvbid0IHdvcnJ5LCB0aGlzIGlzIGp1c3QgYmxhY2sgbWFnaWMuCisJICovCisJd3JpdGVsKDB4ZGYwMDAsICZyZWdzLT5SeEJhc2UpOworCXdyaXRlbCgweGRmMDAwLCAmcmVncy0+UnhQcmQpOworCXdyaXRlbCgweGRmMDAwLCAmcmVncy0+UnhDb24pOworCXdyaXRlbCgweGNlMDAwLCAmcmVncy0+VHhCYXNlKTsKKwl3cml0ZWwoMHhjZTAwMCwgJnJlZ3MtPlR4UHJkKTsKKwl3cml0ZWwoMHhjZTAwMCwgJnJlZ3MtPlR4Q29uKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlJ4SW5kUHJvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlJ4SW5kQ29uKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlJ4SW5kUmVmKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlR4SW5kUHJvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlR4SW5kQ29uKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlR4SW5kUmVmKTsKKwl3cml0ZWwoMHhjYzAwMCwgJnJlZ3MtPnBhZDEwWzBdKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRyQ21uZFBybyk7CisJd3JpdGVsKDAsICZyZWdzLT5EckNtbmRDb24pOworCXdyaXRlbCgwLCAmcmVncy0+RHdDbW5kUHJvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkR3Q21uZENvbik7CisJd3JpdGVsKDAsICZyZWdzLT5Ed0NtbmRSZWYpOworCXdyaXRlbCgwLCAmcmVncy0+RHJEYXRhUHJvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRyRGF0YUNvbik7CisJd3JpdGVsKDAsICZyZWdzLT5EckRhdGFSZWYpOworCXdyaXRlbCgwLCAmcmVncy0+RHdEYXRhUHJvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkR3RGF0YUNvbik7CisJd3JpdGVsKDAsICZyZWdzLT5Ed0RhdGFSZWYpOworI2VuZGlmCisKKwl3cml0ZWwoMHhmZmZmZmZmZiwgJnJlZ3MtPk1iRXZlbnQpOworCXdyaXRlbCgwLCAmcmVncy0+RXZlbnQpOworCisJd3JpdGVsKDAsICZyZWdzLT5UeFBpKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPklwUnhQaSk7CisKKwl3cml0ZWwoMCwgJnJlZ3MtPkV2dENvbik7CisJd3JpdGVsKDAsICZyZWdzLT5FdnRQcmQpOworCisJcnJwcml2LT5pbmZvLT5ldnRfY3RybC5waSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ01EX1JJTkdfRU5UUklFUzsgaSsrKQorCQl3cml0ZWwoMCwgJnJlZ3MtPkNtZFJpbmdbaV0pOworCisvKgorICogV2h5IDMyID8gaXMgdGhpcyBub3QgY2FjaGUgbGluZSBzaXplIGRlcGVuZGVudD8KKyAqLworCXdyaXRlbChSQlVSU1RfNjR8V0JVUlNUXzY0LCAmcmVncy0+UGNpU3RhdGUpOworCXdtYigpOworCisJc3RhcnRfcGMgPSBycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgJmh3LT5ybmNkX2luZm8uRndTdGFydCk7CisKKyNpZiAoREVCVUcgPiAxKQorCXByaW50aygiJXM6IEV4ZWN1dGluZyBmaXJtd2FyZSBhdCBhZGRyZXNzIDB4JTA2eFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBzdGFydF9wYyk7CisjZW5kaWYKKworCXdyaXRlbChzdGFydF9wYyArIDB4ODAwLCAmcmVncy0+UGMpOworCXdtYigpOworCXVkZWxheSg1KTsKKworCXdyaXRlbChzdGFydF9wYywgJnJlZ3MtPlBjKTsKKwl3bWIoKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBSZWFkIGEgc3RyaW5nIGZyb20gdGhlIEVFUFJPTS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBycl9yZWFkX2VlcHJvbShzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2LAorCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCXVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQl1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzID0gcnJwcml2LT5yZWdzOworCXUzMiBtaXNjLCBpbywgaG9zdCwgaTsKKworCWlvID0gcmVhZGwoJnJlZ3MtPkV4dElvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkV4dElvKTsKKwltaXNjID0gcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJd3JpdGVsKDAsICZyZWdzLT5Mb2NhbEN0cmwpOworCWhvc3QgPSByZWFkbCgmcmVncy0+SG9zdEN0cmwpOworCXdyaXRlbChob3N0IHwgSEFMVF9OSUMsICZyZWdzLT5Ib3N0Q3RybCk7CisJbWIoKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyl7CisJCXdyaXRlbCgoRUVQUk9NX0JBU0UgKyAoKG9mZnNldCtpKSA8PCAzKSksICZyZWdzLT5XaW5CYXNlKTsKKwkJbWIoKTsKKwkJYnVmW2ldID0gKHJlYWRsKCZyZWdzLT5XaW5EYXRhKSA+PiAyNCkgJiAweGZmOworCQltYigpOworCX0KKworCXdyaXRlbChob3N0LCAmcmVncy0+SG9zdEN0cmwpOworCXdyaXRlbChtaXNjLCAmcmVncy0+TG9jYWxDdHJsKTsKKwl3cml0ZWwoaW8sICZyZWdzLT5FeHRJbyk7CisJbWIoKTsKKwlyZXR1cm4gaTsKK30KKworCisvKgorICogU2hvcnRjdXQgdG8gcmVhZCBvbmUgd29yZCAoNCBieXRlcykgb3V0IG9mIHRoZSBFRVBST00gYW5kIGNvbnZlcnQKKyAqIGl0IHRvIG91ciBDUFUgYnl0ZS1vcmRlci4KKyAqLworc3RhdGljIHUzMiBycl9yZWFkX2VlcHJvbV93b3JkKHN0cnVjdCBycl9wcml2YXRlICpycnByaXYsCisJCQkgICAgdm9pZCAqIG9mZnNldCkKK3sKKwl1MzIgd29yZDsKKworCWlmICgocnJfcmVhZF9lZXByb20ocnJwcml2LCAodW5zaWduZWQgbG9uZylvZmZzZXQsCisJCQkgICAgKGNoYXIgKikmd29yZCwgNCkgPT0gNCkpCisJCXJldHVybiBiZTMyX3RvX2NwdSh3b3JkKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIEVFUFJPTS4KKyAqCisgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gdGhlIGZpcm13YXJlIGlzIG5vdCBydW5uaW5nLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHdyaXRlX2VlcHJvbShzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2LAorCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCSB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzID0gcnJwcml2LT5yZWdzOworCXUzMiBtaXNjLCBpbywgZGF0YSwgaSwgaiwgcmVhZHksIGVycm9yID0gMDsKKworCWlvID0gcmVhZGwoJnJlZ3MtPkV4dElvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkV4dElvKTsKKwltaXNjID0gcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJd3JpdGVsKEVOQUJMRV9FRVBST01fV1JJVEUsICZyZWdzLT5Mb2NhbEN0cmwpOworCW1iKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspeworCQl3cml0ZWwoKEVFUFJPTV9CQVNFICsgKChvZmZzZXQraSkgPDwgMykpLCAmcmVncy0+V2luQmFzZSk7CisJCW1iKCk7CisJCWRhdGEgPSBidWZbaV0gPDwgMjQ7CisJCS8qCisJCSAqIE9ubHkgdHJ5IHRvIHdyaXRlIHRoZSBkYXRhIGlmIGl0IGlzIG5vdCB0aGUgc2FtZQorCQkgKiB2YWx1ZSBhbHJlYWR5LgorCQkgKi8KKwkJaWYgKChyZWFkbCgmcmVncy0+V2luRGF0YSkgJiAweGZmMDAwMDAwKSAhPSBkYXRhKXsKKwkJCXdyaXRlbChkYXRhLCAmcmVncy0+V2luRGF0YSk7CisJCQlyZWFkeSA9IDA7CisJCQlqID0gMDsKKwkJCW1iKCk7CisJCQl3aGlsZSghcmVhZHkpeworCQkJCXVkZWxheSgyMCk7CisJCQkJaWYgKChyZWFkbCgmcmVncy0+V2luRGF0YSkgJiAweGZmMDAwMDAwKSA9PQorCQkJCSAgICBkYXRhKQorCQkJCQlyZWFkeSA9IDE7CisJCQkJbWIoKTsKKwkJCQlpZiAoaisrID4gNTAwMCl7CisJCQkJCXByaW50aygiZGF0YSBtaXNtYXRjaDogJTA4eCwgIgorCQkJCQkgICAgICAgIldpbkRhdGEgJTA4eFxuIiwgZGF0YSwKKwkJCQkJICAgICAgIHJlYWRsKCZyZWdzLT5XaW5EYXRhKSk7CisJCQkJCXJlYWR5ID0gMTsKKwkJCQkJZXJyb3IgPSAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXdyaXRlbChtaXNjLCAmcmVncy0+TG9jYWxDdHJsKTsKKwl3cml0ZWwoaW8sICZyZWdzLT5FeHRJbyk7CisJbWIoKTsKKworCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBycl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdjsKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBlZXByb20gKmh3ID0gTlVMTDsKKwl1MzIgc3JhbV9zaXplLCByZXY7CisJaW50IGk7CisKKwlycnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXJlZ3MgPSBycnByaXYtPnJlZ3M7CisKKwlyZXYgPSByZWFkbCgmcmVncy0+RndSZXYpOworCXJycHJpdi0+ZndfcmV2ID0gcmV2OworCWlmIChyZXYgPiAweDAwMDIwMDI0KQorCQlwcmludGsoIiAgRmlybXdhcmUgcmV2aXNpb246ICVpLiVpLiVpXG4iLCAocmV2ID4+IDE2KSwKKwkJICAgICAgICgocmV2ID4+IDgpICYgMHhmZiksIChyZXYgJiAweGZmKSk7CisJZWxzZSBpZiAocmV2ID49IDB4MDAwMjAwMDApIHsKKwkJcHJpbnRrKCIgIEZpcm13YXJlIHJldmlzaW9uOiAlaS4laS4laSAoMi4wLjM3IG9yICIKKwkJICAgICAgICJsYXRlciBpcyByZWNvbW1lbmRlZClcbiIsIChyZXYgPj4gMTYpLAorCQkgICAgICAgKChyZXYgPj4gOCkgJiAweGZmKSwgKHJldiAmIDB4ZmYpKTsKKwl9ZWxzZXsKKwkJcHJpbnRrKCIgIEZpcm13YXJlIHJldmlzaW9uIHRvbyBvbGQ6ICVpLiVpLiVpLCBwbGVhc2UgIgorCQkgICAgICAgInVwZ3JhZGUgdG8gMi4wLjM3IG9yIGxhdGVyLlxuIiwKKwkJICAgICAgIChyZXYgPj4gMTYpLCAoKHJldiA+PiA4KSAmIDB4ZmYpLCAocmV2ICYgMHhmZikpOworCX0KKworI2lmIChERUJVRyA+IDIpCisJcHJpbnRrKCIgIE1heGltdW0gcmVjZWl2ZSByaW5ncyAlaVxuIiwgcmVhZGwoJnJlZ3MtPk1heFJ4Um5nKSk7CisjZW5kaWYKKworCS8qCisJICogUmVhZCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBmcm9tIHRoZSBlZXByb20uICBUaGUgSFcgYWRkcmVzcworCSAqIGlzIG5vdCByZWFsbHkgbmVjZXNzYXJ5IGZvciBISVBQSSBidXQgYXdmdWxseSBjb252ZW5pZW50LgorCSAqIFRoZSBwb2ludGVyIGFyaXRobWV0aWMgdG8gcHV0IGl0IGluIGRldl9hZGRyIGlzIHVnbHksIGJ1dAorCSAqIERvbmFsZCBCZWNrZXIgZG9lcyBpdCB0aGlzIHdheSBmb3IgdGhlIEdpZ0UgdmVyc2lvbiBvZiB0aGlzCisJICogY2FyZCBhbmQgaXQncyBzaG9ydGVyIGFuZCBtb3JlIHBvcnRhYmxlIHRoYW4gYW55CisJICogb3RoZXIgbWV0aG9kIEkndmUgc2Vlbi4gIC1WQUwKKwkgKi8KKworCSoodTE2ICopKGRldi0+ZGV2X2FkZHIpID0KKwkgIGh0b25zKHJyX3JlYWRfZWVwcm9tX3dvcmQocnJwcml2LCAmaHctPm1hbmYuQm9hcmRVTEEpKTsKKwkqKHUzMiAqKShkZXYtPmRldl9hZGRyKzIpID0KKwkgIGh0b25sKHJyX3JlYWRfZWVwcm9tX3dvcmQocnJwcml2LCAmaHctPm1hbmYuQm9hcmRVTEFbNF0pKTsKKwkKKwlwcmludGsoIiAgTUFDOiAiKTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIlMi4yeFxuIiwgZGV2LT5kZXZfYWRkcltpXSk7CisKKwlzcmFtX3NpemUgPSBycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgKHZvaWQgKik4KTsKKwlwcmludGsoIiAgU1JBTSBzaXplIDB4JTA2eFxuIiwgc3JhbV9zaXplKTsKKworCWlmIChzeXNjdGxfcm1lbV9tYXggPCAyNjIxNDQpeworCQlwcmludGsoIiAgUmVjZWl2ZSBzb2NrZXQgYnVmZmVyIGxpbWl0IHRvbyBsb3cgKCVpKSwgIgorCQkgICAgICAgInNldHRpbmcgdG8gMjYyMTQ0XG4iLCBzeXNjdGxfcm1lbV9tYXgpOworCQlzeXNjdGxfcm1lbV9tYXggPSAyNjIxNDQ7CisJfQorCisJaWYgKHN5c2N0bF93bWVtX21heCA8IDI2MjE0NCl7CisJCXByaW50aygiICBUcmFuc21pdCBzb2NrZXQgYnVmZmVyIGxpbWl0IHRvbyBsb3cgKCVpKSwgIgorCQkgICAgICAgInNldHRpbmcgdG8gMjYyMTQ0XG4iLCBzeXNjdGxfd21lbV9tYXgpOworCQlzeXNjdGxfd21lbV9tYXggPSAyNjIxNDQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBycl9pbml0MShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXY7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVnczsKKwl1bnNpZ25lZCBsb25nIG15amlmLCBmbGFnczsKKwlzdHJ1Y3QgY21kIGNtZDsKKwl1MzIgaG9zdGN0cmw7CisJaW50IGVjb2RlID0gMDsKKwlzaG9ydCBpOworCisJcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZWdzID0gcnJwcml2LT5yZWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCisJaG9zdGN0cmwgPSByZWFkbCgmcmVncy0+SG9zdEN0cmwpOworCXdyaXRlbChob3N0Y3RybCB8IEhBTFRfTklDIHwgUlJfQ0xFQVJfSU5ULCAmcmVncy0+SG9zdEN0cmwpOworCXdtYigpOworCisJaWYgKGhvc3RjdHJsICYgUEFSSVRZX0VSUil7CisJCXByaW50aygiJXM6IFBhcml0eSBlcnJvciBoYWx0aW5nIE5JQyAtIHRoaXMgaXMgc2VyaW91cyFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJZWNvZGUgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yOworCX0KKworCXNldF9yeGFkZHIocmVncywgcnJwcml2LT5yeF9jdHJsX2RtYSk7CisJc2V0X2luZm9hZGRyKHJlZ3MsIHJycHJpdi0+aW5mb19kbWEpOworCisJcnJwcml2LT5pbmZvLT5ldnRfY3RybC5lbnRyeV9zaXplID0gc2l6ZW9mKHN0cnVjdCBldmVudCk7CisJcnJwcml2LT5pbmZvLT5ldnRfY3RybC5lbnRyaWVzID0gRVZUX1JJTkdfRU5UUklFUzsKKwlycnByaXYtPmluZm8tPmV2dF9jdHJsLm1vZGUgPSAwOworCXJycHJpdi0+aW5mby0+ZXZ0X2N0cmwucGkgPSAwOworCXNldF9ycmFkZHIoJnJycHJpdi0+aW5mby0+ZXZ0X2N0cmwucm5ncHRyLCBycnByaXYtPmV2dF9yaW5nX2RtYSk7CisKKwlycnByaXYtPmluZm8tPmNtZF9jdHJsLmVudHJ5X3NpemUgPSBzaXplb2Yoc3RydWN0IGNtZCk7CisJcnJwcml2LT5pbmZvLT5jbWRfY3RybC5lbnRyaWVzID0gQ01EX1JJTkdfRU5UUklFUzsKKwlycnByaXYtPmluZm8tPmNtZF9jdHJsLm1vZGUgPSAwOworCXJycHJpdi0+aW5mby0+Y21kX2N0cmwucGkgPSAxNTsKKworCWZvciAoaSA9IDA7IGkgPCBDTURfUklOR19FTlRSSUVTOyBpKyspIHsKKwkJd3JpdGVsKDAsICZyZWdzLT5DbWRSaW5nW2ldKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19FTlRSSUVTOyBpKyspIHsKKwkJcnJwcml2LT50eF9yaW5nW2ldLnNpemUgPSAwOworCQlzZXRfcnJhZGRyKCZycnByaXYtPnR4X3JpbmdbaV0uYWRkciwgMCk7CisJCXJycHJpdi0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwl9CisJcnJwcml2LT5pbmZvLT50eF9jdHJsLmVudHJ5X3NpemUgPSBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpOworCXJycHJpdi0+aW5mby0+dHhfY3RybC5lbnRyaWVzID0gVFhfUklOR19FTlRSSUVTOworCXJycHJpdi0+aW5mby0+dHhfY3RybC5tb2RlID0gMDsKKwlycnByaXYtPmluZm8tPnR4X2N0cmwucGkgPSAwOworCXNldF9ycmFkZHIoJnJycHJpdi0+aW5mby0+dHhfY3RybC5ybmdwdHIsIHJycHJpdi0+dHhfcmluZ19kbWEpOworCisJLyoKKwkgKiBTZXQgZGlydHlfdHggYmVmb3JlIHdlIHN0YXJ0IHJlY2VpdmluZyBpbnRlcnJ1cHRzLCBvdGhlcndpc2UKKwkgKiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgbWlnaHQgdGhpbmsgaXQgaXMgc3VwcG9zZWQgdG8gcHJvY2VzcworCSAqIHR4IGludHMgYmVmb3JlIHdlIGFyZSB1cCBhbmQgcnVubmluZywgd2hpY2ggbWF5IGNhdXNlIGEgbnVsbAorCSAqIHBvaW50ZXIgYWNjZXNzIGluIHRoZSBpbnQgaGFuZGxlci4KKwkgKi8KKwlycnByaXYtPnR4X2Z1bGwgPSAwOworCXJycHJpdi0+Y3VyX3J4ID0gMDsKKwlycnByaXYtPmRpcnR5X3J4ID0gcnJwcml2LT5kaXJ0eV90eCA9IDA7CisKKwlycl9yZXNldChkZXYpOworCisJLyogVHVuaW5nIHZhbHVlcyAqLworCXdyaXRlbCgweDUwMDAsICZyZWdzLT5Db25SZXRyeSk7CisJd3JpdGVsKDB4MTAwLCAmcmVncy0+Q29uUmV0cnlUbXIpOworCXdyaXRlbCgweDUwMDAwMCwgJnJlZ3MtPkNvblRtb3V0KTsKKyAJd3JpdGVsKDB4NjAsICZyZWdzLT5JbnRyVG1yKTsKKwl3cml0ZWwoMHg1MDAwMDAsICZyZWdzLT5UeERhdGFNdlRpbWVvdXQpOworCXdyaXRlbCgweDIwMDAwMCwgJnJlZ3MtPlJ4RGF0YU12VGltZW91dCk7CisgCXdyaXRlbCgweDgwLCAmcmVncy0+V3JpdGVEbWFUaHJlc2gpOworIAl3cml0ZWwoMHg4MCwgJnJlZ3MtPlJlYWREbWFUaHJlc2gpOworCisJcnJwcml2LT5md19ydW5uaW5nID0gMDsKKwl3bWIoKTsKKworCWhvc3RjdHJsICY9IH4oSEFMVF9OSUMgfCBJTlZBTElEX0lOU1RfQiB8IFBBUklUWV9FUlIpOworCXdyaXRlbChob3N0Y3RybCwgJnJlZ3MtPkhvc3RDdHJsKTsKKwl3bWIoKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfRU5UUklFUzsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWRtYV9hZGRyX3QgYWRkcjsKKworCQlycnByaXYtPnJ4X3JpbmdbaV0ubW9kZSA9IDA7CisJCXNrYiA9IGFsbG9jX3NrYihkZXYtPm10dSArIEhJUFBJX0hMRU4sIEdGUF9BVE9NSUMpOworCQlpZiAoIXNrYikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgIgorCQkJICAgICAgICJmb3IgcmVjZWl2ZSByaW5nIC0gaGFsdGluZyBOSUNcbiIsIGRldi0+bmFtZSk7CisJCQllY29kZSA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisJCXJycHJpdi0+cnhfc2tidWZmW2ldID0gc2tiOworCSAgICAgICAgYWRkciA9IHBjaV9tYXBfc2luZ2xlKHJycHJpdi0+cGNpX2Rldiwgc2tiLT5kYXRhLAorCQkJZGV2LT5tdHUgKyBISVBQSV9ITEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkvKgorCQkgKiBTYW5pdHkgdGVzdCB0byBzZWUgaWYgd2UgY29uZmxpY3Qgd2l0aCB0aGUgRE1BCisJCSAqIGxpbWl0YXRpb25zIG9mIHRoZSBSb2FkcnVubmVyLgorCQkgKi8KKwkJaWYgKCgoKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhKSAmIDB4ZmZmKSA+IH42NTMyMCkKKwkJCXByaW50aygic2tiIGFsbG9jIGVycm9yXG4iKTsKKworCQlzZXRfcnJhZGRyKCZycnByaXYtPnJ4X3JpbmdbaV0uYWRkciwgYWRkcik7CisJCXJycHJpdi0+cnhfcmluZ1tpXS5zaXplID0gZGV2LT5tdHUgKyBISVBQSV9ITEVOOworCX0KKworCXJycHJpdi0+cnhfY3RybFs0XS5lbnRyeV9zaXplID0gc2l6ZW9mKHN0cnVjdCByeF9kZXNjKTsKKwlycnByaXYtPnJ4X2N0cmxbNF0uZW50cmllcyA9IFJYX1JJTkdfRU5UUklFUzsKKwlycnByaXYtPnJ4X2N0cmxbNF0ubW9kZSA9IDg7CisJcnJwcml2LT5yeF9jdHJsWzRdLnBpID0gMDsKKwl3bWIoKTsKKwlzZXRfcnJhZGRyKCZycnByaXYtPnJ4X2N0cmxbNF0ucm5ncHRyLCBycnByaXYtPnJ4X3JpbmdfZG1hKTsKKworCXVkZWxheSgxMDAwKTsKKworCS8qCisJICogTm93IHN0YXJ0IHRoZSBGaXJtV2FyZS4KKwkgKi8KKwljbWQuY29kZSA9IENfU1RBUlRfRlc7CisJY21kLnJpbmcgPSAwOworCWNtZC5pbmRleCA9IDA7CisKKwlycl9pc3N1ZV9jbWQocnJwcml2LCAmY21kKTsKKworCS8qCisJICogR2l2ZSB0aGUgRmlybVdhcmUgdGltZSB0byBjaGV3IG9uIHRoZSBgZ2V0IHJ1bm5pbmcnIGNvbW1hbmQuCisJICovCisJbXlqaWYgPSBqaWZmaWVzICsgNSAqIEhaOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBteWppZikgJiYgIXJycHJpdi0+ZndfcnVubmluZykKKwkJY3B1X3JlbGF4KCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIGVjb2RlOworCisgZXJyb3I6CisJLyoKKwkgKiBXZSBtaWdodCBoYXZlIGdvdHRlbiBoZXJlIGJlY2F1c2Ugd2UgYXJlIG91dCBvZiBtZW1vcnksCisJICogbWFrZSBzdXJlIHdlIHJlbGVhc2UgZXZlcnl0aGluZyB3ZSBhbGxvY2F0ZWQgYmVmb3JlIGZhaWxpbmcKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19FTlRSSUVTOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJycHJpdi0+cnhfc2tidWZmW2ldOworCisJCWlmIChza2IpIHsKKwkgICAgICAgIAlwY2lfdW5tYXBfc2luZ2xlKHJycHJpdi0+cGNpX2RldiwgCisJCQkJCSBycnByaXYtPnJ4X3JpbmdbaV0uYWRkci5hZGRybG8sIAorCQkJCQkgZGV2LT5tdHUgKyBISVBQSV9ITEVOLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXJycHJpdi0+cnhfcmluZ1tpXS5zaXplID0gMDsKKwkJCXNldF9ycmFkZHIoJnJycHJpdi0+cnhfcmluZ1tpXS5hZGRyLCAwKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJycHJpdi0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gZWNvZGU7Cit9CisKKworLyoKKyAqIEFsbCBldmVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc2xvdyAoUlgvVFggaW50cyBkbyBub3QgZ2VuZXJhdGUKKyAqIGV2ZW50cykgYW5kIGFyZSBoYW5kbGVkIGhlcmUsIG91dHNpZGUgdGhlIG1haW4gaW50ZXJydXB0IGhhbmRsZXIsCisgKiB0byByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGhhbmRsZXIuCisgKi8KK3N0YXRpYyB1MzIgcnJfaGFuZGxlX2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBwcm9kaWR4LCB1MzIgZWlkeCkKK3sKKwlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2OworCXN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3M7CisJdTMyIHRtcDsKKworCXJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmVncyA9IHJycHJpdi0+cmVnczsKKworCXdoaWxlIChwcm9kaWR4ICE9IGVpZHgpeworCQlzd2l0Y2ggKHJycHJpdi0+ZXZ0X3JpbmdbZWlkeF0uY29kZSl7CisJCWNhc2UgRV9OSUNfVVA6CisJCQl0bXAgPSByZWFkbCgmcmVncy0+RndSZXYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZpcm13YXJlIHJldmlzaW9uICVpLiVpLiVpICIKKwkJCSAgICAgICAidXAgYW5kIHJ1bm5pbmdcbiIsIGRldi0+bmFtZSwKKwkJCSAgICAgICAodG1wID4+IDE2KSwgKCh0bXAgPj4gOCkgJiAweGZmKSwgKHRtcCAmIDB4ZmYpKTsKKwkJCXJycHJpdi0+ZndfcnVubmluZyA9IDE7CisJCQl3cml0ZWwoUlhfUklOR19FTlRSSUVTIC0gMSwgJnJlZ3MtPklwUnhQaSk7CisJCQl3bWIoKTsKKwkJCWJyZWFrOworCQljYXNlIEVfTElOS19PTjoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPcHRpY2FsIGxpbmsgT05cbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBFX0xJTktfT0ZGOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9wdGljYWwgbGluayBPRkZcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBFX1JYX0lETEU6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUlggZGF0YSBub3QgbW92aW5nXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlnb3RvIGRyb3A7CisJCWNhc2UgRV9XQVRDSERPRzoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUaGUgd2F0Y2hkb2cgaXMgaGVyZSB0byBzZWUgIgorCQkJICAgICAgICJ1c1xuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIEVfSU5URVJOX0VSUjoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhJUFBJIEludGVybmFsIE5JQyBlcnJvclxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCl8SEFMVF9OSUN8UlJfQ0xFQVJfSU5ULCAKKwkJCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworCQkJd21iKCk7CisJCQlicmVhazsKKwkJY2FzZSBFX0hPU1RfRVJSOgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSG9zdCBzb2Z0d2FyZSBlcnJvclxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCl8SEFMVF9OSUN8UlJfQ0xFQVJfSU5ULCAKKwkJCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworCQkJd21iKCk7CisJCQlicmVhazsKKwkJLyoKKwkJICogVFggZXZlbnRzLgorCQkgKi8KKwkJY2FzZSBFX0NPTl9SRUo6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ29ubmVjdGlvbiByZWplY3RlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcnJwcml2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJYnJlYWs7CisJCWNhc2UgRV9DT05fVE1PVVQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ29ubmVjdGlvbiB0aW1lb3V0XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBFX0RJU0NfRVJSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEhJUFBJIGRpc2Nvbm5lY3QgZXJyb3JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXJycHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWJyZWFrOworCQljYXNlIEVfSU5UX1BSVFk6CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBISVBQSSBJbnRlcm5hbCBQYXJpdHkgZXJyb3JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXdyaXRlbChyZWFkbCgmcmVncy0+SG9zdEN0cmwpfEhBTFRfTklDfFJSX0NMRUFSX0lOVCwgCisJCQkgICAgICAgJnJlZ3MtPkhvc3RDdHJsKTsKKwkJCXdtYigpOworCQkJYnJlYWs7CisJCWNhc2UgRV9UWF9JRExFOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0dGVyIGlkbGVcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIEVfVFhfTElOS19EUk9QOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IExpbmsgbG9zdCBkdXJpbmcgdHJhbnNtaXRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXJycHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCXdyaXRlbChyZWFkbCgmcmVncy0+SG9zdEN0cmwpfEhBTFRfTklDfFJSX0NMRUFSX0lOVCwgCisJCQkgICAgICAgJnJlZ3MtPkhvc3RDdHJsKTsKKwkJCXdtYigpOworCQkJYnJlYWs7CisJCWNhc2UgRV9UWF9JTlZfUk5HOgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBzZW5kIHJpbmcgYmxvY2tcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXdyaXRlbChyZWFkbCgmcmVncy0+SG9zdEN0cmwpfEhBTFRfTklDfFJSX0NMRUFSX0lOVCwgCisJCQkgICAgICAgJnJlZ3MtPkhvc3RDdHJsKTsKKwkJCXdtYigpOworCQkJYnJlYWs7CisJCWNhc2UgRV9UWF9JTlZfQlVGOgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBzZW5kIGJ1ZmZlciBhZGRyZXNzXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKXxIQUxUX05JQ3xSUl9DTEVBUl9JTlQsIAorCQkJICAgICAgICZyZWdzLT5Ib3N0Q3RybCk7CisJCQl3bWIoKTsKKwkJCWJyZWFrOworCQljYXNlIEVfVFhfSU5WX0RTQzoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgZGVzY3JpcHRvciBhZGRyZXNzXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKXxIQUxUX05JQ3xSUl9DTEVBUl9JTlQsIAorCQkJICAgICAgICZyZWdzLT5Ib3N0Q3RybCk7CisJCQl3bWIoKTsKKwkJCWJyZWFrOworCQkvKgorCQkgKiBSWCBldmVudHMuCisJCSAqLworCQljYXNlIEVfUlhfUk5HX09VVDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlIHJpbmcgZnVsbFxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRV9SWF9QQVJfRVJSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmUgcGFyaXR5IGVycm9yXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlnb3RvIGRyb3A7CisJCWNhc2UgRV9SWF9MTFJDX0VSUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlIExMUkMgZXJyb3JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZHJvcDsKKwkJY2FzZSBFX1BLVF9MTl9FUlI6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZSBwYWNrZXQgbGVuZ3RoICIKKwkJCSAgICAgICAiZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIGRyb3A7CisJCWNhc2UgRV9EVEFfQ0tTTV9FUlI6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRGF0YSBjaGVja3N1bSBlcnJvclxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wOworCQljYXNlIEVfU0hUX0JTVDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmV4cGVjdGVkIHNob3J0IGJ1cnN0ICIKKwkJCSAgICAgICAiZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIGRyb3A7CisJCWNhc2UgRV9TVEFURV9FUlI6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjdi4gc3RhdGUgdHJhbnNpdGlvbiIKKwkJCSAgICAgICAiIGVycm9yXG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wOworCQljYXNlIEVfVU5FWFBfREFUQToKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmV4cGVjdGVkIGRhdGEgZXJyb3JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZHJvcDsKKwkJY2FzZSBFX0xTVF9MTktfRVJSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IExpbmsgbG9zdCBlcnJvclxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wOworCQljYXNlIEVfRlJNX0VSUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGcmFtbWluZyBFcnJvclxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wOworCQljYXNlIEVfRkxHX1NZTl9FUlI6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRmxhZyBzeW5jLiBsb3N0IGR1cmluZyIKKwkJCSAgICAgICAicGFja2V0XG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wOworCQljYXNlIEVfUlhfSU5WX0JVRjoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgcmVjZWl2ZSBidWZmZXIgIgorCQkJICAgICAgICJhZGRyZXNzXG4iLCBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCl8SEFMVF9OSUN8UlJfQ0xFQVJfSU5ULCAKKwkJCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworCQkJd21iKCk7CisJCQlicmVhazsKKwkJY2FzZSBFX1JYX0lOVl9EU0M6CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIHJlY2VpdmUgZGVzY3JpcHRvciAiCisJCQkgICAgICAgImFkZHJlc3NcbiIsIGRldi0+bmFtZSk7CisJCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKXxIQUxUX05JQ3xSUl9DTEVBUl9JTlQsIAorCQkJICAgICAgICZyZWdzLT5Ib3N0Q3RybCk7CisJCQl3bWIoKTsKKwkJCWJyZWFrOworCQljYXNlIEVfUk5HX0JMSzoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgcmluZyBibG9ja1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCl8SEFMVF9OSUN8UlJfQ0xFQVJfSU5ULCAKKwkJCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworCQkJd21iKCk7CisJCQlicmVhazsKKwkJZHJvcDoKKwkJCS8qIExhYmVsIHBhY2tldCB0byBiZSBkcm9wcGVkLgorCQkJICogQWN0dWFsIGRyb3BwaW5nIG9jY3VycyBpbiByeAorCQkJICogaGFuZGxpbmcuCisJCQkgKgorCQkJICogVGhlIGluZGV4IG9mIHBhY2tldCB3ZSBnZXQgdG8gZHJvcCBpcworCQkJICogdGhlIGluZGV4IG9mIHRoZSBwYWNrZXQgZm9sbG93aW5nCisJCQkgKiB0aGUgYmFkIHBhY2tldC4gLWtiZgorCQkJICovCisJCQl7CisJCQkJdTE2IGluZGV4ID0gcnJwcml2LT5ldnRfcmluZ1tlaWR4XS5pbmRleDsKKwkJCQlpbmRleCA9IChpbmRleCArIChSWF9SSU5HX0VOVFJJRVMgLSAxKSkgJQorCQkJCQlSWF9SSU5HX0VOVFJJRVM7CisJCQkJcnJwcml2LT5yeF9yaW5nW2luZGV4XS5tb2RlIHw9CisJCQkJCShQQUNLRVRfQkFEIHwgUEFDS0VUX0VORCk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmhhbmRsZWQgZXZlbnQgMHglMDJ4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgcnJwcml2LT5ldnRfcmluZ1tlaWR4XS5jb2RlKTsKKwkJfQorCQllaWR4ID0gKGVpZHggKyAxKSAlIEVWVF9SSU5HX0VOVFJJRVM7CisJfQorCisJcnJwcml2LT5pbmZvLT5ldnRfY3RybC5waSA9IGVpZHg7CisJd21iKCk7CisJcmV0dXJuIGVpZHg7Cit9CisKKworc3RhdGljIHZvaWQgcnhfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiByeGxpbWl0LCB1MzIgaW5kZXgpCit7CisJc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVncyA9IHJycHJpdi0+cmVnczsKKworCWRvIHsKKwkJc3RydWN0IHJ4X2Rlc2MgKmRlc2M7CisJCXUzMiBwa3RfbGVuOworCisJCWRlc2MgPSAmKHJycHJpdi0+cnhfcmluZ1tpbmRleF0pOworCQlwa3RfbGVuID0gZGVzYy0+c2l6ZTsKKyNpZiAoREVCVUcgPiAyKQorCQlwcmludGsoImluZGV4ICVpLCByeGxpbWl0ICVpXG4iLCBpbmRleCwgcnhsaW1pdCk7CisJCXByaW50aygibGVuICV4LCBtb2RlICV4XG4iLCBwa3RfbGVuLCBkZXNjLT5tb2RlKTsKKyNlbmRpZgorCQlpZiAoIChycnByaXYtPnJ4X3JpbmdbaW5kZXhdLm1vZGUgJiBQQUNLRVRfQkFEKSA9PSBQQUNLRVRfQkFEKXsKKwkJCXJycHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJZ290byBkZWZlcjsKKwkJfQorCisJCWlmIChwa3RfbGVuID4gMCl7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqcnhfc2tiOworCisJCQlyeF9za2IgPSBycnByaXYtPnJ4X3NrYnVmZltpbmRleF07CisKKwkJCWlmIChwa3RfbGVuIDwgUEtUX0NPUFlfVEhSRVNIT0xEKSB7CisJCQkJc2tiID0gYWxsb2Nfc2tiKHBrdF9sZW4sIEdGUF9BVE9NSUMpOworCQkJCWlmIChza2IgPT0gTlVMTCl7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgc2tiICglaSBieXRlcyksIGRlZmVycmluZyBwYWNrZXRcbiIsIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCQkJCXJycHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCQlnb3RvIGRlZmVyOworCQkJCX0gZWxzZSB7CisJCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShycnByaXYtPnBjaV9kZXYsCisJCQkJCQkJCSAgICBkZXNjLT5hZGRyLmFkZHJsbywKKwkJCQkJCQkJICAgIHBrdF9sZW4sCisJCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQkJCW1lbWNweShza2JfcHV0KHNrYiwgcGt0X2xlbiksCisJCQkJCSAgICAgICByeF9za2ItPmRhdGEsIHBrdF9sZW4pOworCisJCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShycnByaXYtPnBjaV9kZXYsCisJCQkJCQkJCSAgICAgICBkZXNjLT5hZGRyLmFkZHJsbywKKwkJCQkJCQkJICAgICAgIHBrdF9sZW4sCisJCQkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCX0KKwkJCX1lbHNleworCQkJCXN0cnVjdCBza19idWZmICpuZXdza2I7CisKKwkJCQluZXdza2IgPSBhbGxvY19za2IoZGV2LT5tdHUgKyBISVBQSV9ITEVOLAorCQkJCQlHRlBfQVRPTUlDKTsKKwkJCQlpZiAobmV3c2tiKXsKKwkJCQkJZG1hX2FkZHJfdCBhZGRyOworCisJICAgICAgICAJCQlwY2lfdW5tYXBfc2luZ2xlKHJycHJpdi0+cGNpX2RldiwgCisJCQkJCQlkZXNjLT5hZGRyLmFkZHJsbywgZGV2LT5tdHUgKyAKKwkJCQkJCUhJUFBJX0hMRU4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJCXNrYiA9IHJ4X3NrYjsKKwkJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCQlycnByaXYtPnJ4X3NrYnVmZltpbmRleF0gPSBuZXdza2I7CisJICAgICAgICAJCQlhZGRyID0gcGNpX21hcF9zaW5nbGUocnJwcml2LT5wY2lfZGV2LCAKKwkJCQkJCW5ld3NrYi0+ZGF0YSwgCisJCQkJCQlkZXYtPm10dSArIEhJUFBJX0hMRU4sIAorCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQkJc2V0X3JyYWRkcigmZGVzYy0+YWRkciwgYWRkcik7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRrKCIlczogT3V0IG9mIG1lbW9yeSwgZGVmZXJyaW5nICIKKwkJCQkJICAgICAgICJwYWNrZXRcbiIsIGRldi0+bmFtZSk7CisJCQkJCXJycHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCQlnb3RvIGRlZmVyOworCQkJCX0KKwkJCX0KKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiLT5wcm90b2NvbCA9IGhpcHBpX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCisJCQluZXRpZl9yeChza2IpOwkJLyogc2VuZCBpdCB1cCAqLworCisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJcnJwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlycnByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0KKwlkZWZlcjoKKwkJZGVzYy0+bW9kZSA9IDA7CisJCWRlc2MtPnNpemUgPSBkZXYtPm10dSArIEhJUFBJX0hMRU47CisKKwkJaWYgKChpbmRleCAmIDcpID09IDcpCisJCQl3cml0ZWwoaW5kZXgsICZyZWdzLT5JcFJ4UGkpOworCisJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBSWF9SSU5HX0VOVFJJRVM7CisJfSB3aGlsZShpbmRleCAhPSByeGxpbWl0KTsKKworCXJycHJpdi0+Y3VyX3J4ID0gaW5kZXg7CisJd21iKCk7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IHJyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCit7CisJc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdjsKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJdTMyIHByb2RpZHgsIHJ4aW5kZXgsIGVpZHgsIHR4Y3NtciwgcnhsaW1pdCwgdHhjb247CisKKwlycnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXJlZ3MgPSBycnByaXYtPnJlZ3M7CisKKwlpZiAoIShyZWFkbCgmcmVncy0+SG9zdEN0cmwpICYgUlJfSU5UKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJc3Bpbl9sb2NrKCZycnByaXYtPmxvY2spOworCisJcHJvZGlkeCA9IHJlYWRsKCZyZWdzLT5FdnRQcmQpOworCXR4Y3NtciA9IChwcm9kaWR4ID4+IDgpICYgMHhmZjsKKwlyeGxpbWl0ID0gKHByb2RpZHggPj4gMTYpICYgMHhmZjsKKwlwcm9kaWR4ICY9IDB4ZmY7CisKKyNpZiAoREVCVUcgPiAyKQorCXByaW50aygiJXM6IGludGVycnVwdCwgcHJvZGlkeCA9ICVpLCBlaWR4ID0gJWlcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgcHJvZGlkeCwgcnJwcml2LT5pbmZvLT5ldnRfY3RybC5waSk7CisjZW5kaWYKKwkvKgorCSAqIE9yZGVyIGhlcmUgaXMgaW1wb3J0YW50LiAgV2UgbXVzdCBoYW5kbGUgZXZlbnRzCisJICogYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UgaW4gb3JkZXIgdG8gY2F0Y2gKKwkgKiBzdWNoIHRoaW5ncyBhcyBMTFJDIGVycm9ycywgZXRjIC1rYmYKKwkgKi8KKworCWVpZHggPSBycnByaXYtPmluZm8tPmV2dF9jdHJsLnBpOworCWlmIChwcm9kaWR4ICE9IGVpZHgpCisJCWVpZHggPSBycl9oYW5kbGVfZXZlbnQoZGV2LCBwcm9kaWR4LCBlaWR4KTsKKworCXJ4aW5kZXggPSBycnByaXYtPmN1cl9yeDsKKwlpZiAocnhpbmRleCAhPSByeGxpbWl0KQorCQlyeF9pbnQoZGV2LCByeGxpbWl0LCByeGluZGV4KTsKKworCXR4Y29uID0gcnJwcml2LT5kaXJ0eV90eDsKKwlpZiAodHhjc21yICE9IHR4Y29uKSB7CisJCWRvIHsKKwkJCS8qIER1ZSB0byBvY2NhdGlvbmFsIGZpcm13YXJlIFRYIHByb2R1Y2VyL2NvbnN1bWVyIG91dAorCQkJICogb2Ygc3luYy4gZXJyb3IgbmVlZCB0byBjaGVjayBlbnRyeSBpbiByaW5nIC1rYmYKKwkJCSAqLworCQkJaWYocnJwcml2LT50eF9za2J1ZmZbdHhjb25dKXsKKwkJCQlzdHJ1Y3QgdHhfZGVzYyAqZGVzYzsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQkJZGVzYyA9ICYocnJwcml2LT50eF9yaW5nW3R4Y29uXSk7CisJCQkJc2tiID0gcnJwcml2LT50eF9za2J1ZmZbdHhjb25dOworCisJCQkJcnJwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJcnJwcml2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCQkJCXBjaV91bm1hcF9zaW5nbGUocnJwcml2LT5wY2lfZGV2LAorCQkJCQkJIGRlc2MtPmFkZHIuYWRkcmxvLCBza2ItPmxlbiwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCisJCQkJcnJwcml2LT50eF9za2J1ZmZbdHhjb25dID0gTlVMTDsKKwkJCQlkZXNjLT5zaXplID0gMDsKKwkJCQlzZXRfcnJhZGRyKCZycnByaXYtPnR4X3JpbmdbdHhjb25dLmFkZHIsIDApOworCQkJCWRlc2MtPm1vZGUgPSAwOworCQkJfQorCQkJdHhjb24gPSAodHhjb24gKyAxKSAlIFRYX1JJTkdfRU5UUklFUzsKKwkJfSB3aGlsZSAodHhjc21yICE9IHR4Y29uKTsKKwkJd21iKCk7CisKKwkJcnJwcml2LT5kaXJ0eV90eCA9IHR4Y29uOworCQlpZiAocnJwcml2LT50eF9mdWxsICYmIHJyX2lmX2J1c3koZGV2KSAmJgorCQkgICAgKCgocnJwcml2LT5pbmZvLT50eF9jdHJsLnBpICsgMSkgJSBUWF9SSU5HX0VOVFJJRVMpCisJCSAgICAgIT0gcnJwcml2LT5kaXJ0eV90eCkpeworCQkJcnJwcml2LT50eF9mdWxsID0gMDsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCX0KKworCWVpZHggfD0gKCh0eGNzbXIgPDwgOCkgfCAocnhsaW1pdCA8PCAxNikpOworCXdyaXRlbChlaWR4LCAmcmVncy0+RXZ0Q29uKTsKKwl3bWIoKTsKKworCXNwaW5fdW5sb2NrKCZycnByaXYtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJyX3Jhel90eChzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2LAorCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfRU5UUklFUzsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBycnByaXYtPnR4X3NrYnVmZltpXTsKKworCQlpZiAoc2tiKSB7CisJCQlzdHJ1Y3QgdHhfZGVzYyAqZGVzYyA9ICYocnJwcml2LT50eF9yaW5nW2ldKTsKKworCSAgICAgICAgCXBjaV91bm1hcF9zaW5nbGUocnJwcml2LT5wY2lfZGV2LCBkZXNjLT5hZGRyLmFkZHJsbywKKwkJCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXNjLT5zaXplID0gMDsKKwkJCXNldF9ycmFkZHIoJmRlc2MtPmFkZHIsIDApOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcnJwcml2LT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBycl9yYXpfcngoc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiwKKwkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX0VOVFJJRVM7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcnJwcml2LT5yeF9za2J1ZmZbaV07CisKKwkJaWYgKHNrYikgeworCQkJc3RydWN0IHJ4X2Rlc2MgKmRlc2MgPSAmKHJycHJpdi0+cnhfcmluZ1tpXSk7CisKKwkgICAgICAgIAlwY2lfdW5tYXBfc2luZ2xlKHJycHJpdi0+cGNpX2RldiwgZGVzYy0+YWRkci5hZGRybG8sCisJCQkJZGV2LT5tdHUgKyBISVBQSV9ITEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGVzYy0+c2l6ZSA9IDA7CisJCQlzZXRfcnJhZGRyKCZkZXNjLT5hZGRyLCAwKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJycHJpdi0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcnJfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3MgPSBycnByaXYtPnJlZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChyZWFkbCgmcmVncy0+SG9zdEN0cmwpICYgTklDX0hBTFRFRCl7CisJCXByaW50aygiJXM6IFJlc3RhcnRpbmcgbmljXG4iLCBkZXYtPm5hbWUpOworCQltZW1zZXQocnJwcml2LT5yeF9jdHJsLCAwLCAyNTYgKiBzaXplb2Yoc3RydWN0IHJpbmdfY3RybCkpOworCQltZW1zZXQocnJwcml2LT5pbmZvLCAwLCBzaXplb2Yoc3RydWN0IHJyX2luZm8pKTsKKwkJd21iKCk7CisKKwkJcnJfcmF6X3R4KHJycHJpdiwgZGV2KTsKKwkJcnJfcmF6X3J4KHJycHJpdiwgZGV2KTsKKworCQlpZiAocnJfaW5pdDEoZGV2KSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCQkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCl8SEFMVF9OSUN8UlJfQ0xFQVJfSU5ULCAKKwkJCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisJCX0KKwl9CisJcnJwcml2LT50aW1lci5leHBpcmVzID0gUlVOX0FUKDUqSFopOworCWFkZF90aW1lcigmcnJwcml2LT50aW1lcik7Cit9CisKKworc3RhdGljIGludCBycl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBycnByaXYtPnBjaV9kZXY7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVnczsKKwlpbnQgZWNvZGUgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCXJlZ3MgPSBycnByaXYtPnJlZ3M7CisKKwlpZiAocnJwcml2LT5md19yZXYgPCAweDAwMDIwMDAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cnlpbmcgdG8gY29uZmlndXJlIGRldmljZSB3aXRoICIKKwkJICAgICAgICJvYnNvbGV0ZSBmaXJtd2FyZVxuIiwgZGV2LT5uYW1lKTsKKwkJZWNvZGUgPSAtRUJVU1k7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcnJwcml2LT5yeF9jdHJsID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwKKwkJCQkJICAgICAgIDI1NiAqIHNpemVvZihzdHJ1Y3QgcmluZ19jdHJsKSwKKwkJCQkJICAgICAgICZkbWFfYWRkcik7CisJaWYgKCFycnByaXYtPnJ4X2N0cmwpIHsKKwkJZWNvZGUgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKwlycnByaXYtPnJ4X2N0cmxfZG1hID0gZG1hX2FkZHI7CisJbWVtc2V0KHJycHJpdi0+cnhfY3RybCwgMCwgMjU2KnNpemVvZihzdHJ1Y3QgcmluZ19jdHJsKSk7CisKKwlycnByaXYtPmluZm8gPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IHJyX2luZm8pLAorCQkJCQkgICAgJmRtYV9hZGRyKTsKKwlpZiAoIXJycHJpdi0+aW5mbykgeworCQllY29kZSA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCXJycHJpdi0+aW5mb19kbWEgPSBkbWFfYWRkcjsKKwltZW1zZXQocnJwcml2LT5pbmZvLCAwLCBzaXplb2Yoc3RydWN0IHJyX2luZm8pKTsKKwl3bWIoKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKwl3cml0ZWwocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKXxIQUxUX05JQ3xSUl9DTEVBUl9JTlQsICZyZWdzLT5Ib3N0Q3RybCk7CisJcmVhZGwoJnJlZ3MtPkhvc3RDdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgcnJfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXF1ZXN0ZWQgSVJRICVkIGlzIGJ1c3lcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJZWNvZGUgPSAtRUFHQUlOOworCQlnb3RvIGVycm9yOworCX0KKworCWlmICgoZWNvZGUgPSBycl9pbml0MShkZXYpKSkKKwkJZ290byBlcnJvcjsKKworCS8qIFNldCB0aGUgdGltZXIgdG8gc3dpdGNoIHRvIGNoZWNrIGZvciBsaW5rIGJlYXQgYW5kIHBlcmhhcHMgc3dpdGNoCisJICAgdG8gYW4gYWx0ZXJuYXRlIG1lZGlhIHR5cGUuICovCisJaW5pdF90aW1lcigmcnJwcml2LT50aW1lcik7CisJcnJwcml2LT50aW1lci5leHBpcmVzID0gUlVOX0FUKDUqSFopOyAgICAgICAgICAgLyogNSBzZWMuIHdhdGNoZG9nICovCisJcnJwcml2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXJycHJpdi0+dGltZXIuZnVuY3Rpb24gPSAmcnJfdGltZXI7ICAgICAgICAgICAgICAgLyogdGltZXIgaGFuZGxlciAqLworCWFkZF90aW1lcigmcnJwcml2LT50aW1lcik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIGVjb2RlOworCisgZXJyb3I6CisJc3Bpbl9sb2NrX2lycXNhdmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCXdyaXRlbChyZWFkbCgmcmVncy0+SG9zdEN0cmwpfEhBTFRfTklDfFJSX0NMRUFSX0lOVCwgJnJlZ3MtPkhvc3RDdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWlmIChycnByaXYtPmluZm8pIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IHJyX2luZm8pLCBycnByaXYtPmluZm8sCisJCQkJICAgIHJycHJpdi0+aW5mb19kbWEpOworCQlycnByaXYtPmluZm8gPSBOVUxMOworCX0KKwlpZiAocnJwcml2LT5yeF9jdHJsKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCByaW5nX2N0cmwpLAorCQkJCSAgICBycnByaXYtPnJ4X2N0cmwsIHJycHJpdi0+cnhfY3RybF9kbWEpOworCQlycnByaXYtPnJ4X2N0cmwgPSBOVUxMOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlyZXR1cm4gZWNvZGU7Cit9CisKKworc3RhdGljIHZvaWQgcnJfZHVtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXY7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVnczsKKwl1MzIgaW5kZXgsIGNvbnM7CisJc2hvcnQgaTsKKwlpbnQgbGVuOworCisJcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZWdzID0gcnJwcml2LT5yZWdzOworCisJcHJpbnRrKCIlczogZHVtcGluZyBOSUMgVFggcmluZ3NcbiIsIGRldi0+bmFtZSk7CisKKwlwcmludGsoIlJ4UHJkICUwOHgsIFR4UHJkICUwMngsIEV2dFByZCAlMDh4LCBUeFBpICUwMngsIFR4Q3RybFBpICUwMnhcbiIsCisJICAgICAgIHJlYWRsKCZyZWdzLT5SeFByZCksIHJlYWRsKCZyZWdzLT5UeFByZCksCisJICAgICAgIHJlYWRsKCZyZWdzLT5FdnRQcmQpLCByZWFkbCgmcmVncy0+VHhQaSksCisJICAgICAgIHJycHJpdi0+aW5mby0+dHhfY3RybC5waSk7CisKKwlwcmludGsoIkVycm9yIGNvZGUgMHgleFxuIiwgcmVhZGwoJnJlZ3MtPkZhaWwxKSk7CisKKwlpbmRleCA9ICgoKHJlYWRsKCZyZWdzLT5FdnRQcmQpID4+IDgpICYgMHhmZiApIC0gMSkgJSBFVlRfUklOR19FTlRSSUVTOworCWNvbnMgPSBycnByaXYtPmRpcnR5X3R4OworCXByaW50aygiVFggcmluZyBpbmRleCAlaSwgVFggY29uc3VtZXIgJWlcbiIsCisJICAgICAgIGluZGV4LCBjb25zKTsKKworCWlmIChycnByaXYtPnR4X3NrYnVmZltpbmRleF0peworCQlsZW4gPSBtaW5fdChpbnQsIDB4ODAsIHJycHJpdi0+dHhfc2tidWZmW2luZGV4XS0+bGVuKTsKKwkJcHJpbnRrKCJza2J1ZmYgZm9yIGluZGV4ICVpIGlzIHZhbGlkIC0gZHVtcGluZyBkYXRhICgweCV4IGJ5dGVzIC0gRE1BIGxlbiAweCV4KVxuIiwgaW5kZXgsIGxlbiwgcnJwcml2LT50eF9yaW5nW2luZGV4XS5zaXplKTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKXsKKwkJCWlmICghKGkgJiA3KSkKKwkJCQlwcmludGsoIlxuIik7CisJCQlwcmludGsoIiUwMnggIiwgKHVuc2lnbmVkIGNoYXIpIHJycHJpdi0+dHhfc2tidWZmW2luZGV4XS0+ZGF0YVtpXSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KKworCWlmIChycnByaXYtPnR4X3NrYnVmZltjb25zXSl7CisJCWxlbiA9IG1pbl90KGludCwgMHg4MCwgcnJwcml2LT50eF9za2J1ZmZbY29uc10tPmxlbik7CisJCXByaW50aygic2tidWZmIGZvciBjb25zICVpIGlzIHZhbGlkIC0gZHVtcGluZyBkYXRhICgweCV4IGJ5dGVzIC0gc2tidWZmIGxlbiAweCV4KVxuIiwgY29ucywgbGVuLCBycnByaXYtPnR4X3NrYnVmZltjb25zXS0+bGVuKTsKKwkJcHJpbnRrKCJtb2RlIDB4JXgsIHNpemUgMHgleCxcbiBwaHlzICUwOEx4LCBza2J1ZmYtYWRkciAlMDhseCwgdHJ1ZXNpemUgMHgleFxuIiwKKwkJICAgICAgIHJycHJpdi0+dHhfcmluZ1tjb25zXS5tb2RlLAorCQkgICAgICAgcnJwcml2LT50eF9yaW5nW2NvbnNdLnNpemUsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBycnByaXYtPnR4X3JpbmdbY29uc10uYWRkci5hZGRybG8sCisJCSAgICAgICAodW5zaWduZWQgbG9uZylycnByaXYtPnR4X3NrYnVmZltjb25zXS0+ZGF0YSwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpcnJwcml2LT50eF9za2J1ZmZbY29uc10tPnRydWVzaXplKTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKXsKKwkJCWlmICghKGkgJiA3KSkKKwkJCQlwcmludGsoIlxuIik7CisJCQlwcmludGsoIiUwMnggIiwgKHVuc2lnbmVkIGNoYXIpcnJwcml2LT50eF9yaW5nW2NvbnNdLnNpemUpOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9CisKKwlwcmludGsoImR1bXBpbmcgVFggcmluZyBpbmZvOlxuIik7CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfRU5UUklFUzsgaSsrKQorCQlwcmludGsoIm1vZGUgMHgleCwgc2l6ZSAweCV4LCBwaHlzLWFkZHIgJTA4THhcbiIsCisJCSAgICAgICBycnByaXYtPnR4X3JpbmdbaV0ubW9kZSwKKwkJICAgICAgIHJycHJpdi0+dHhfcmluZ1tpXS5zaXplLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcnJwcml2LT50eF9yaW5nW2ldLmFkZHIuYWRkcmxvKTsKKworfQorCisKK3N0YXRpYyBpbnQgcnJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2OworCXN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdG1wOworCXNob3J0IGk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlycnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXJlZ3MgPSBycnByaXYtPnJlZ3M7CisKKwkvKgorCSAqIExvY2sgdG8gbWFrZSBzdXJlIHdlIGFyZSBub3QgY2xlYW5pbmcgdXAgd2hpbGUgYW5vdGhlciBDUFUKKwkgKiBpcyBoYW5kbGluZyBpbnRlcnJ1cHRzLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXRtcCA9IHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCk7CisJaWYgKHRtcCAmIE5JQ19IQUxURUQpeworCQlwcmludGsoIiVzOiBOSUMgYWxyZWFkeSBoYWx0ZWRcbiIsIGRldi0+bmFtZSk7CisJCXJyX2R1bXAoZGV2KTsKKwl9ZWxzZXsKKwkJdG1wIHw9IEhBTFRfTklDIHwgUlJfQ0xFQVJfSU5UOworCQl3cml0ZWwodG1wLCAmcmVncy0+SG9zdEN0cmwpOworCQlyZWFkbCgmcmVncy0+SG9zdEN0cmwpOworCX0KKworCXJycHJpdi0+ZndfcnVubmluZyA9IDA7CisKKwlkZWxfdGltZXJfc3luYygmcnJwcml2LT50aW1lcik7CisKKwl3cml0ZWwoMCwgJnJlZ3MtPlR4UGkpOworCXdyaXRlbCgwLCAmcmVncy0+SXBSeFBpKTsKKworCXdyaXRlbCgwLCAmcmVncy0+RXZ0Q29uKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkV2dFByZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ01EX1JJTkdfRU5UUklFUzsgaSsrKQorCQl3cml0ZWwoMCwgJnJlZ3MtPkNtZFJpbmdbaV0pOworCisJcnJwcml2LT5pbmZvLT50eF9jdHJsLmVudHJpZXMgPSAwOworCXJycHJpdi0+aW5mby0+Y21kX2N0cmwucGkgPSAwOworCXJycHJpdi0+aW5mby0+ZXZ0X2N0cmwucGkgPSAwOworCXJycHJpdi0+cnhfY3RybFs0XS5lbnRyaWVzID0gMDsKKworCXJyX3Jhel90eChycnByaXYsIGRldik7CisJcnJfcmF6X3J4KHJycHJpdiwgZGV2KTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocnJwcml2LT5wY2lfZGV2LCAyNTYgKiBzaXplb2Yoc3RydWN0IHJpbmdfY3RybCksCisJCQkgICAgcnJwcml2LT5yeF9jdHJsLCBycnByaXYtPnJ4X2N0cmxfZG1hKTsKKwlycnByaXYtPnJ4X2N0cmwgPSBOVUxMOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChycnByaXYtPnBjaV9kZXYsIHNpemVvZihzdHJ1Y3QgcnJfaW5mbyksCisJCQkgICAgcnJwcml2LT5pbmZvLCBycnByaXYtPmluZm9fZG1hKTsKKwlycnByaXYtPmluZm8gPSBOVUxMOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHJyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzID0gcnJwcml2LT5yZWdzOworCXN0cnVjdCByaW5nX2N0cmwgKnR4Y3RybDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpbmRleCwgbGVuID0gc2tiLT5sZW47CisJdTMyICppZmllbGQ7CisJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisKKwlpZiAocmVhZGwoJnJlZ3MtPk1vZGUpICYgRkFUQUxfRVJSKQorCQlwcmludGsoImVycm9yIGNvZGVzIEZhaWwxICUwMngsIEZhaWwyICUwMnhcbiIsCisJCSAgICAgICByZWFkbCgmcmVncy0+RmFpbDEpLCByZWFkbCgmcmVncy0+RmFpbDIpKTsKKworCS8qCisJICogV2UgcHJvYmFibHkgbmVlZCB0byBkZWFsIHdpdGggdGJ1c3kgaGVyZSB0byBwcmV2ZW50IG92ZXJydW5zLgorCSAqLworCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgOCl7CisJCXByaW50aygiaW5jb21pbmcgc2tiIHRvbyBzbWFsbCAtIHJlYWxsb2NhdGluZ1xuIik7CisJCWlmICghKG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDgpKSkgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCA4KTsKKwkJc2tiX3B1dChuZXdfc2tiLCBsZW4pOworCQltZW1jcHkobmV3X3NrYi0+ZGF0YSwgc2tiLT5kYXRhLCBsZW4pOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXNrYiA9IG5ld19za2I7CisJfQorCisJaWZpZWxkID0gKHUzMiAqKXNrYl9wdXNoKHNrYiwgOCk7CisKKwlpZmllbGRbMF0gPSAwOworCWlmaWVsZFsxXSA9IHNrYi0+cHJpdmF0ZS5pZmllbGQ7CisKKwkvKgorCSAqIFdlIGRvbid0IG5lZWQgdGhlIGxvY2sgYmVmb3JlIHdlIGFyZSBhY3R1YWxseSBnb2luZyB0byBzdGFydAorCSAqIGZpZGRsaW5nIHdpdGggdGhlIGNvbnRyb2wgYmxvY2tzLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXR4Y3RybCA9ICZycnByaXYtPmluZm8tPnR4X2N0cmw7CisKKwlpbmRleCA9IHR4Y3RybC0+cGk7CisKKwlycnByaXYtPnR4X3NrYnVmZltpbmRleF0gPSBza2I7CisJc2V0X3JyYWRkcigmcnJwcml2LT50eF9yaW5nW2luZGV4XS5hZGRyLCBwY2lfbWFwX3NpbmdsZSgKKwkJcnJwcml2LT5wY2lfZGV2LCBza2ItPmRhdGEsIGxlbiArIDgsIFBDSV9ETUFfVE9ERVZJQ0UpKTsKKwlycnByaXYtPnR4X3JpbmdbaW5kZXhdLnNpemUgPSBsZW4gKyA4OyAvKiBpbmNsdWRlIElGSUVMRCAqLworCXJycHJpdi0+dHhfcmluZ1tpbmRleF0ubW9kZSA9IFBBQ0tFVF9TVEFSVCB8IFBBQ0tFVF9FTkQ7CisJdHhjdHJsLT5waSA9IChpbmRleCArIDEpICUgVFhfUklOR19FTlRSSUVTOworCXdtYigpOworCXdyaXRlbCh0eGN0cmwtPnBpLCAmcmVncy0+VHhQaSk7CisKKwlpZiAodHhjdHJsLT5waSA9PSBycnByaXYtPmRpcnR5X3R4KXsKKwkJcnJwcml2LT50eF9mdWxsID0gMTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpycl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2OworCisJcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybigmcnJwcml2LT5zdGF0cyk7Cit9CisKKworLyoKKyAqIFJlYWQgdGhlIGZpcm13YXJlIG91dCBvZiB0aGUgRUVQUk9NIGFuZCBwdXQgaXQgaW50byB0aGUgU1JBTQorICogKG9yIGZyb20gdXNlciBzcGFjZSAtIGxhdGVyKQorICoKKyAqIFRoaXMgb3BlcmF0aW9uIHJlcXVpcmVzIHRoZSBOSUMgdG8gYmUgaGFsdGVkIGFuZCBpcyBwZXJmb3JtZWQgd2l0aAorICogaW50ZXJydXB0cyBkaXNhYmxlZCBhbmQgd2l0aCB0aGUgc3BpbmxvY2sgaG9sZC4KKyAqLworc3RhdGljIGludCBycl9sb2FkX2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdjsKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzOworCXVuc2lnbmVkIGxvbmcgZXB0ciwgc2VncHRyOworCWludCBpLCBqOworCXUzMiBsb2NhbGN0cmwsIHNwdHIsIGxlbiwgdG1wOworCXUzMiBwMmxlbiwgcDJzaXplLCBucl9zZWcsIHJldmlzaW9uLCBpbywgc3JhbV9zaXplOworCXN0cnVjdCBlZXByb20gKmh3ID0gTlVMTDsKKworCXJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmVncyA9IHJycHJpdi0+cmVnczsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCEocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKSAmIE5JQ19IQUxURUQpKXsKKwkJcHJpbnRrKCIlczogVHJ5aW5nIHRvIGxvYWQgZmlybXdhcmUgdG8gYSBydW5uaW5nIE5JQy5cbiIsIAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlsb2NhbGN0cmwgPSByZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisKKwl3cml0ZWwoMCwgJnJlZ3MtPkV2dFByZCk7CisJd3JpdGVsKDAsICZyZWdzLT5SeFByZCk7CisJd3JpdGVsKDAsICZyZWdzLT5UeFByZCk7CisKKwkvKgorCSAqIEZpcnN0IHdpcGUgdGhlIGVudGlyZSBTUkFNLCBvdGhlcndpc2Ugd2UgbWlnaHQgcnVuIGludG8gYWxsCisJICoga2luZHMgb2YgdHJvdWJsZSAuLi4gc2lnaCwgdGhpcyB0b29rIGFsbW9zdCBhbGwgYWZ0ZXJub29uCisJICogdG8gdHJhY2sgZG93biA7LSgKKwkgKi8KKwlpbyA9IHJlYWRsKCZyZWdzLT5FeHRJbyk7CisJd3JpdGVsKDAsICZyZWdzLT5FeHRJbyk7CisJc3JhbV9zaXplID0gcnJfcmVhZF9lZXByb21fd29yZChycnByaXYsICh2b2lkICopOCk7CisKKwlmb3IgKGkgPSAyMDA7IGkgPCBzcmFtX3NpemUgLyA0OyBpKyspeworCQl3cml0ZWwoaSAqIDQsICZyZWdzLT5XaW5CYXNlKTsKKwkJbWIoKTsKKwkJd3JpdGVsKDAsICZyZWdzLT5XaW5EYXRhKTsKKwkJbWIoKTsKKwl9CisJd3JpdGVsKGlvLCAmcmVncy0+RXh0SW8pOworCW1iKCk7CisKKwllcHRyID0gKHVuc2lnbmVkIGxvbmcpcnJfcmVhZF9lZXByb21fd29yZChycnByaXYsCisJCQkJCSAgICAgICAmaHctPnJuY2RfaW5mby5BZGRyUnVuQ29kZVNlZ3MpOworCWVwdHIgPSAoKGVwdHIgJiAweDFmZmZmZikgPj4gMyk7CisKKwlwMmxlbiA9IHJyX3JlYWRfZWVwcm9tX3dvcmQocnJwcml2LCAodm9pZCAqKSgweDgzKjQpKTsKKwlwMmxlbiA9IChwMmxlbiA8PCAyKTsKKwlwMnNpemUgPSBycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgKHZvaWQgKikoMHg4NCo0KSk7CisJcDJzaXplID0gKChwMnNpemUgJiAweDFmZmZmZikgPj4gMyk7CisKKwlpZiAoKGVwdHIgPCBwMnNpemUpIHx8IChlcHRyID4gKHAyc2l6ZSArIHAybGVuKSkpeworCQlwcmludGsoIiVzOiBlcHRyIGlzIGludmFsaWRcbiIsIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCXJldmlzaW9uID0gcnJfcmVhZF9lZXByb21fd29yZChycnByaXYsICZody0+bWFuZi5IZWFkZXJGbXQpOworCisJaWYgKHJldmlzaW9uICE9IDEpeworCQlwcmludGsoIiVzOiBpbnZhbGlkIGZpcm13YXJlIGZvcm1hdCAoJWkpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCByZXZpc2lvbik7CisJCWdvdG8gb3V0OworCX0KKworCW5yX3NlZyA9IHJyX3JlYWRfZWVwcm9tX3dvcmQocnJwcml2LCAodm9pZCAqKWVwdHIpOworCWVwdHIgKz00OworI2lmIChERUJVRyA+IDEpCisJcHJpbnRrKCIlczogbnJfc2VnICVpXG4iLCBkZXYtPm5hbWUsIG5yX3NlZyk7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBucl9zZWc7IGkrKyl7CisJCXNwdHIgPSBycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgKHZvaWQgKillcHRyKTsKKwkJZXB0ciArPSA0OworCQlsZW4gPSBycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgKHZvaWQgKillcHRyKTsKKwkJZXB0ciArPSA0OworCQlzZWdwdHIgPSAodW5zaWduZWQgbG9uZylycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgKHZvaWQgKillcHRyKTsKKwkJc2VncHRyID0gKChzZWdwdHIgJiAweDFmZmZmZikgPj4gMyk7CisJCWVwdHIgKz0gNDsKKyNpZiAoREVCVUcgPiAxKQorCQlwcmludGsoIiVzOiBzZWdtZW50ICVpLCBzcmFtIGFkZHJlc3MgJTA2eCwgbGVuZ3RoICUwNHgsIHNlZ3B0ciAlMDZ4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBpLCBzcHRyLCBsZW4sIHNlZ3B0cik7CisjZW5kaWYKKwkJZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKXsKKwkJCXRtcCA9IHJyX3JlYWRfZWVwcm9tX3dvcmQocnJwcml2LCAodm9pZCAqKXNlZ3B0cik7CisJCQl3cml0ZWwoc3B0ciwgJnJlZ3MtPldpbkJhc2UpOworCQkJbWIoKTsKKwkJCXdyaXRlbCh0bXAsICZyZWdzLT5XaW5EYXRhKTsKKwkJCW1iKCk7CisJCQlzZWdwdHIgKz0gNDsKKwkJCXNwdHIgKz0gNDsKKwkJfQorCX0KKworb3V0OgorCXdyaXRlbChsb2NhbGN0cmwsICZyZWdzLT5Mb2NhbEN0cmwpOworCW1iKCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBycl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXY7CisJdW5zaWduZWQgY2hhciAqaW1hZ2UsICpvbGRpbWFnZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpOworCWludCBlcnJvciA9IC1FT1BOT1RTVVBQOworCisJcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN3aXRjaChjbWQpeworCWNhc2UgU0lPQ1JSR0ZXOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpeworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCisJCWltYWdlID0ga21hbGxvYyhFRVBST01fV09SRFMgKiBzaXplb2YodTMyKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW1hZ2UpeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSAiCisJCQkgICAgICAgImZvciBFRVBST00gaW1hZ2VcbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisKKwkJaWYgKHJycHJpdi0+ZndfcnVubmluZyl7CisJCQlwcmludGsoIiVzOiBGaXJtd2FyZSBhbHJlYWR5IHJ1bm5pbmdcbiIsIGRldi0+bmFtZSk7CisJCQllcnJvciA9IC1FUEVSTTsKKwkJCWdvdG8gZ2Zfb3V0OworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCQlpID0gcnJfcmVhZF9lZXByb20ocnJwcml2LCAwLCBpbWFnZSwgRUVQUk9NX0JZVEVTKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisJCWlmIChpICE9IEVFUFJPTV9CWVRFUyl7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciByZWFkaW5nIEVFUFJPTVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJZ290byBnZl9vdXQ7CisJCX0KKwkJZXJyb3IgPSBjb3B5X3RvX3VzZXIocnEtPmlmcl9kYXRhLCBpbWFnZSwgRUVQUk9NX0JZVEVTKTsKKwkJaWYgKGVycm9yKQorCQkJZXJyb3IgPSAtRUZBVUxUOworCWdmX291dDoKKwkJa2ZyZWUoaW1hZ2UpOworCQlyZXR1cm4gZXJyb3I7CisJCQorCWNhc2UgU0lPQ1JSUEZXOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpeworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCisJCWltYWdlID0ga21hbGxvYyhFRVBST01fV09SRFMgKiBzaXplb2YodTMyKSwgR0ZQX0tFUk5FTCk7CisJCW9sZGltYWdlID0ga21hbGxvYyhFRVBST01fV09SRFMgKiBzaXplb2YodTMyKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW1hZ2UgfHwgIW9sZGltYWdlKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ICIKKwkJCSAgICAgICAiZm9yIEVFUFJPTSBpbWFnZVxuIiwgZGV2LT5uYW1lKTsKKwkJCWVycm9yID0gLUVOT01FTTsKKwkJCWdvdG8gd2Zfb3V0OworCQl9CisKKwkJZXJyb3IgPSBjb3B5X2Zyb21fdXNlcihpbWFnZSwgcnEtPmlmcl9kYXRhLCBFRVBST01fQllURVMpOworCQlpZiAoZXJyb3IpIHsKKwkJCWVycm9yID0gLUVGQVVMVDsKKwkJCWdvdG8gd2Zfb3V0OworCQl9CisKKwkJaWYgKHJycHJpdi0+ZndfcnVubmluZyl7CisJCQlwcmludGsoIiVzOiBGaXJtd2FyZSBhbHJlYWR5IHJ1bm5pbmdcbiIsIGRldi0+bmFtZSk7CisJCQllcnJvciA9IC1FUEVSTTsKKwkJCWdvdG8gd2Zfb3V0OworCQl9CisKKwkJcHJpbnRrKCIlczogVXBkYXRpbmcgRUVQUk9NIGZpcm13YXJlXG4iLCBkZXYtPm5hbWUpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJZXJyb3IgPSB3cml0ZV9lZXByb20ocnJwcml2LCAwLCBpbWFnZSwgRUVQUk9NX0JZVEVTKTsKKwkJaWYgKGVycm9yKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igd3JpdGluZyBFRVBST01cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKworCQlpID0gcnJfcmVhZF9lZXByb20ocnJwcml2LCAwLCBvbGRpbWFnZSwgRUVQUk9NX0JZVEVTKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKGkgIT0gRUVQUk9NX0JZVEVTKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgcmVhZGluZyBiYWNrIEVFUFJPTSAiCisJCQkgICAgICAgImltYWdlXG4iLCBkZXYtPm5hbWUpOworCisJCWVycm9yID0gbWVtY21wKGltYWdlLCBvbGRpbWFnZSwgRUVQUk9NX0JZVEVTKTsKKwkJaWYgKGVycm9yKXsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHZlcmlmeWluZyBFRVBST00gaW1hZ2VcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWVycm9yID0gLUVGQVVMVDsKKwkJfQorCXdmX291dDoKKwkJaWYgKG9sZGltYWdlKQorCQkJa2ZyZWUob2xkaW1hZ2UpOworCQlpZiAoaW1hZ2UpCisJCQlrZnJlZShpbWFnZSk7CisJCXJldHVybiBlcnJvcjsKKwkJCisJY2FzZSBTSU9DUlJJRDoKKwkJcmV0dXJuIHB1dF91c2VyKDB4NTI1MjMwMzIsIChpbnQgX191c2VyICopcnEtPmlmcl9kYXRhKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZXJyb3I7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnJfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9FU1NFTlRJQUwsIFBDSV9ERVZJQ0VfSURfRVNTRU5USUFMX1JPQURSVU5ORVIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyAwLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnJfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBycl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInJydW5uZXIiLAorCS5pZF90YWJsZQk9IHJyX3BjaV90YmwsCisJLnByb2JlCQk9IHJyX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocnJfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBycl9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnJyX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBycl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcnJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocnJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocnJfY2xlYW51cF9tb2R1bGUpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSS4uLy4uL2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgLXBpcGUgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1zdHJlbmd0aC1yZWR1Y2UgLW00ODYgLW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tanVtcHM9MiAtbWFsaWduLWZ1bmN0aW9ucz0yIC1ETU9EVUxFIC1ETU9EVkVSU0lPTlMgLWluY2x1ZGUgLi4vLi4vaW5jbHVkZS9saW51eC9tb2R2ZXJzaW9ucy5oIC1jIHJydW5uZXIuYyIKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcnJ1bm5lci5oIGIvZHJpdmVycy9uZXQvcnJ1bm5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYmFhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ycnVubmVyLmgKQEAgLTAsMCArMSw4NDggQEAKKyNpZm5kZWYgX1JSVU5ORVJfSF8KKyNkZWZpbmUgX1JSVU5ORVJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaWYgKChCSVRTX1BFUl9MT05HICE9IDMyKSAmJiAoQklUU19QRVJfTE9ORyAhPSA2NCkpCisjZXJyb3IgIkJJVFNfUEVSX0xPTkcgbm90IGRlZmluZWQgb3Igbm90IHZhbGlkIgorI2VuZGlmCisKKworc3RydWN0IHJyX3JlZ3MgeworCisJdTMyCXBhZDBbMTZdOworCisJdTMyCUhvc3RDdHJsOworCXUzMglMb2NhbEN0cmw7CisJdTMyCVBjOworCXUzMglCcmtQdDsKKworLyogVGltZXIgaW5jcmVtZW50cyBldmVyeSAwLjk3IG1pY3JvLXNlY29uZHMgKHVuc2lnbmVkIGludCkgKi8KKwl1MzIJVGltZXJfSGk7CisJdTMyCVRpbWVyOworCXUzMglUaW1lclJlZjsKKwl1MzIJUGNpU3RhdGU7CisKKwl1MzIJRXZlbnQ7CisJdTMyCU1iRXZlbnQ7CisKKwl1MzIJV2luQmFzZTsKKwl1MzIJV2luRGF0YTsKKwl1MzIJUlhfc3RhdGU7CisJdTMyCVRYX3N0YXRlOworCisJdTMyCU92ZXJoZWFkOworCXUzMglFeHRJbzsKKworCXUzMglEbWFXcml0ZUhvc3RIaTsKKwl1MzIJRG1hV3JpdGVIb3N0TG87CisKKwl1MzIJcGFkMVsyXTsKKworCXUzMglEbWFSZWFkSG9zdEhpOworCXUzMglEbWFSZWFkSG9zdExvOworCisJdTMyCXBhZDI7CisKKwl1MzIJRG1hUmVhZExlbjsKKwl1MzIJRG1hV3JpdGVTdGF0ZTsKKworCXUzMglEbWFXcml0ZUxjbDsKKwl1MzIJRG1hV3JpdGVJUGNoZWNrc3VtOworCXUzMglEbWFXcml0ZUxlbjsKKwl1MzIJRG1hUmVhZFN0YXRlOworCXUzMglEbWFSZWFkTGNsOworCXUzMglEbWFSZWFkSVBjaGVja3N1bTsKKwl1MzIJcGFkMzsKKworCXUzMglSeEJhc2U7CisJdTMyCVJ4UHJkOworCXUzMglSeENvbjsKKworCXUzMglwYWQ0OworCisJdTMyCVR4QmFzZTsKKwl1MzIJVHhQcmQ7CisJdTMyCVR4Q29uOworCisJdTMyCXBhZDU7CisKKwl1MzIJUnhJbmRQcm87CisJdTMyCVJ4SW5kQ29uOworCXUzMglSeEluZFJlZjsKKworCXUzMglwYWQ2OworCisJdTMyCVR4SW5kUHJvOworCXUzMglUeEluZENvbjsKKwl1MzIJVHhJbmRSZWY7CisKKwl1MzIJcGFkN1sxN107CisKKwl1MzIJRHJDbW5kUHJvOworCXUzMglEckNtbmRDb247CisJdTMyCURyQ21uZFJlZjsKKworCXUzMglwYWQ4OworCisJdTMyCUR3Q21uZFBybzsKKwl1MzIJRHdDbW5kQ29uOworCXUzMglEd0NtbmRSZWY7CisKKwl1MzIJQXNzaXN0U3RhdGU7CisKKwl1MzIJRHJEYXRhUHJvOworCXUzMglEckRhdGFDb247CisJdTMyCURyRGF0YVJlZjsKKworCXUzMglwYWQ5OworCisJdTMyCUR3RGF0YVBybzsKKwl1MzIJRHdEYXRhQ29uOworCXUzMglEd0RhdGFSZWY7CisKKwl1MzIJcGFkMTBbMzNdOworCisJdTMyCUV2dENvbjsKKworCXUzMglwYWQxMVs1XTsKKworCXUzMglUeFBpOworCXUzMglJcFJ4UGk7CisKKwl1MzIJcGFkMTFhWzhdOworCisJdTMyCUNtZFJpbmdbMTZdOworCisvKiBUaGUgVUxBIGlzIGluIHR3byByZWdpc3RlcnMgdGhlIGhpZ2ggb3JkZXIgdHdvIGJ5dGVzIG9mIHRoZSBmaXJzdAorICogd29yZCBjb250YWluIHRoZSBSdW5Db2RlIGZlYXR1cmVzLgorICogdWxhMAkJcmVzCXJlcwlieXRlMAlieXRlMQorICogdWxhMQkJYnl0ZTIJYnl0ZTMJYnl0ZTQJYnl0ZTUKKyAqLworCXUzMglVbGEwOworCXUzMglVbGExOworCisJdTMyCVJ4UmluZ0hpOworCXUzMglSeFJpbmdMbzsKKworCXUzMglJbmZvUHRySGk7CisJdTMyCUluZm9QdHJMbzsKKworCXUzMglNb2RlOworCisJdTMyCUNvblJldHJ5OworCXUzMglDb25SZXRyeVRtcjsKKworCXUzMglDb25UbW91dDsKKwl1MzIJQ3RhdFRtcjsKKworCXUzMglNYXhSeFJuZzsKKworCXUzMglJbnRyVG1yOworCXUzMglUeERhdGFNdlRpbWVvdXQ7CisJdTMyCVJ4RGF0YU12VGltZW91dDsKKworCXUzMglFdnRQcmQ7CisJdTMyCVRyYWNlSWR4OworCisJdTMyCUZhaWwxOworCXUzMglGYWlsMjsKKworCXUzMglEcnZQcm07CisKKwl1MzIJRmlsdGVyTEE7CisKKwl1MzIJRndSZXY7CisJdTMyCUZ3UmVzMTsKKwl1MzIJRndSZXMyOworCXUzMglGd1JlczM7CisKKwl1MzIJV3JpdGVEbWFUaHJlc2g7CisJdTMyCVJlYWREbWFUaHJlc2g7CisKKwl1MzIJcGFkMTJbMzI1XTsKKwl1MzIJV2luZG93WzUxMl07Cit9OworCisvKgorICogSG9zdCBjb250cm9sIHJlZ2lzdGVyIGJpdHMuCisgKi8KKwkKKyNkZWZpbmUgUlJfSU5UCQkweDAxCisjZGVmaW5lIFJSX0NMRUFSX0lOVAkweDAyCisjZGVmaW5lIE5PX1NXQVAJCTB4MDQwMDAwMDQKKyNkZWZpbmUgTk9fU1dBUDEJMHgwMDAwMDAwNAorI2RlZmluZSBQQ0lfUkVTRVRfTklDCTB4MDgKKyNkZWZpbmUgSEFMVF9OSUMJMHgxMAorI2RlZmluZSBTU1RFUF9OSUMJMHgyMAorI2RlZmluZSBNRU1fUkVBRF9NVUxUSQkweDQwCisjZGVmaW5lIE5JQ19IQUxURUQJMHgxMDAKKyNkZWZpbmUgSEFMVF9JTlNUCTB4MjAwCisjZGVmaW5lIFBBUklUWV9FUlIJMHg0MDAKKyNkZWZpbmUgSU5WQUxJRF9JTlNUX0IJMHg4MDAKKyNkZWZpbmUgUlJfUkVWXzIJMHgyMDAwMDAwMAorI2RlZmluZSBSUl9SRVZfTUFTSwkweGYwMDAwMDAwCisKKy8qCisgKiBMb2NhbCBjb250cm9sIHJlZ2lzdGVyIGJpdHMuCisgKi8KKworI2RlZmluZSBJTlRBX1NUQVRFCQkweDAxCisjZGVmaW5lIENMRUFSX0lOVEEJCTB4MDIKKyNkZWZpbmUgRkFTVF9FRVBST01fQUNDRVNTCTB4MDgKKyNkZWZpbmUgRU5BQkxFX0VYVFJBX1NSQU0JMHgxMDAKKyNkZWZpbmUgRU5BQkxFX0VYVFJBX0RFU0MJMHgyMDAKKyNkZWZpbmUgRU5BQkxFX1BBUklUWQkJMHg0MDAKKyNkZWZpbmUgRk9SQ0VfRE1BX1BBUklUWV9FUlJPUgkweDgwMAorI2RlZmluZSBFTkFCTEVfRUVQUk9NX1dSSVRFCTB4MTAwMAorI2RlZmluZSBFTkFCTEVfREFUQV9DQUNIRQkweDIwMDAKKyNkZWZpbmUgU1JBTV9MT19QQVJJVFlfRVJSCTB4NDAwMAorI2RlZmluZSBTUkFNX0hJX1BBUklUWV9FUlIJMHg4MDAwCisKKy8qCisgKiBQQ0kgc3RhdGUgYml0cy4KKyAqLworCisjZGVmaW5lIEZPUkNFX1BDSV9SRVNFVAkJMHgwMQorI2RlZmluZSBQUk9WSURFX0xFTkdUSAkJMHgwMgorI2RlZmluZSBNQVNLX0RNQV9SRUFEX01BWAkweDFDCisjZGVmaW5lIFJCVVJTVF9ESVNBQkxFCQkweDAwCisjZGVmaW5lIFJCVVJTVF80CQkweDA0CisjZGVmaW5lIFJCVVJTVF8xNgkJMHgwOAorI2RlZmluZSBSQlVSU1RfMzIJCTB4MEMKKyNkZWZpbmUgUkJVUlNUXzY0CQkweDEwCisjZGVmaW5lIFJCVVJTVF8xMjgJCTB4MTQKKyNkZWZpbmUgUkJVUlNUXzI1NgkJMHgxOAorI2RlZmluZSBSQlVSU1RfMTAyNAkJMHgxQworI2RlZmluZSBNQVNLX0RNQV9XUklURV9NQVgJMHhFMAorI2RlZmluZSBXQlVSU1RfRElTQUJMRQkJMHgwMAorI2RlZmluZSBXQlVSU1RfNAkJMHgyMAorI2RlZmluZSBXQlVSU1RfMTYJCTB4NDAKKyNkZWZpbmUgV0JVUlNUXzMyCQkweDYwCisjZGVmaW5lIFdCVVJTVF82NAkJMHg4MAorI2RlZmluZSBXQlVSU1RfMTI4CQkweGEwCisjZGVmaW5lIFdCVVJTVF8yNTYJCTB4YzAKKyNkZWZpbmUgV0JVUlNUXzEwMjQJCTB4ZTAKKyNkZWZpbmUgTUFTS19NSU5fRE1BCQkweEZGMDAKKyNkZWZpbmUgRklGT19SRVRSWV9FTkFCTEUJMHgxMDAwMAorCisvKgorICogRXZlbnQgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIERNQV9XUklURV9ET05FCQkweDEwMDAwCisjZGVmaW5lIERNQV9SRUFEX0RPTkUJCTB4MjAwMDAKKyNkZWZpbmUgRE1BX1dSSVRFX0VSUgkJMHg0MDAwMAorI2RlZmluZSBETUFfUkVBRF9FUlIJCTB4ODAwMDAKKworLyoKKyAqIFJlY2VpdmUgc3RhdGUKKyAqCisgKiBSb2FkUnVubmVyIEhJUFBJIFJlY2VpdmUgU3RhdGUgUmVnaXN0ZXIgY29udHJvbHMgYW5kIG1vbml0b3JzIHRoZSAKKyAqIEhJUFBJIHJlY2VpdmUgaW50ZXJmYWNlIGluIHRoZSBOSUMuIExvb2sgYXQgZXJyIGJpdHMgd2hlbiBhIEhJUFBJCisgKiByZWNlaXZlIEVycm9yIEV2ZW50IG9jY3Vycy4gCisgKi8KKworI2RlZmluZSBFTkFCTEVfTkVXX0NPTgkJMHgwMQorI2RlZmluZSBSRVNFVF9SRUNWCQkweDAyCisjZGVmaW5lIFJFQ1ZfQUxMCQkweDAwCisjZGVmaW5lIFJFQ1ZfMUsJCQkweDIwCisjZGVmaW5lIFJFQ1ZfMksJCQkweDQwCisjZGVmaW5lIFJFQ1ZfNEsJCQkweDYwCisjZGVmaW5lIFJFQ1ZfOEsJCQkweDgwCisjZGVmaW5lIFJFQ1ZfMTZLCQkweGEwCisjZGVmaW5lIFJFQ1ZfMzJLCQkweGMwCisjZGVmaW5lIFJFQ1ZfNjRLCQkweGUwCisKKy8qCisgKiBUcmFuc21pdCBzdGF0dXMuCisgKi8KKworI2RlZmluZSBFTkFfWE1JVAkJMHgwMQorI2RlZmluZSBQRVJNX0NPTgkJMHgwMgorCisvKgorICogRE1BIHdyaXRlIHN0YXRlCisgKi8KKworI2RlZmluZSBSRVNFVF9ETUEJCTB4MDEKKyNkZWZpbmUgTk9fU1dBUF9ETUEJCTB4MDIKKyNkZWZpbmUgRE1BX0FDVElWRQkJMHgwNAorI2RlZmluZSBUSFJFU0hfTUFTSwkJMHgxRgorI2RlZmluZSBETUFfRVJST1JfTUFTSwkJMHhmZjAwMDAwMAorCisvKgorICogR29vZGRpZXMgc3RvcmVkIGluIHRoZSBVTEEgcmVnaXN0ZXJzLgorICovCisKKyNkZWZpbmUgVFJBQ0VfT05fV0hBVF9CSVQJMHgwMDAyMDAwMCAgICAvKiBUcmFjZXMgb24gKi8KKyNkZWZpbmUgT05FTV9CVUZfV0hBVF9CSVQJMHgwMDA0MDAwMCAgICAvKiAxTWVnIHZzIDI1NksgKi8KKyNkZWZpbmUgQ0hBUl9BUElfV0hBVF9CSVQJMHgwMDA4MDAwMCAgICAvKiBDaGFyIEFQSSB2cyBuZXR3b3JrIG9ubHkgKi8KKyNkZWZpbmUgQ01EX0VWVF9XSEFUX0JJVAkweDAwMjAwMDAwICAgIC8qIENvbW1hbmQgZXZlbnQgKi8KKyNkZWZpbmUgTE9OR19UWF9XSEFUX0JJVAkweDAwNDAwMDAwCisjZGVmaW5lIExPTkdfUlhfV0hBVF9CSVQJMHgwMDgwMDAwMAorI2RlZmluZSBXSEFUX0JJVF9NQVNLCQkweEZGRkQwMDAwICAgIC8qIEZlYXR1cmUgYml0IG1hc2sgKi8KKworLyoKKyAqIE1vZGUgc3RhdHVzCisgKi8KKworI2RlZmluZSBFVkVOVF9PVkZMCQkweDgwMDAwMDAwCisjZGVmaW5lIEZBVEFMX0VSUgkJMHg0MDAwMDAwMAorI2RlZmluZSBMT09QX0JBQ0sJCTB4MDEKKyNkZWZpbmUgTU9ERV9QSAkJCTB4MDIKKyNkZWZpbmUgTU9ERV9GUAkJCTB4MDAKKyNkZWZpbmUgUFRSNjRCSVQJCTB4MDQKKyNkZWZpbmUgUFRSMzJCSVQJCTB4MDAKKyNkZWZpbmUgUFRSX1dEX1NXQVAJCTB4MDgKKyNkZWZpbmUgUFRSX1dEX05PU1dBUAkJMHgwMAorI2RlZmluZSBQT1NUX1dBUk5fRVZFTlQJCTB4MTAKKyNkZWZpbmUgRVJSX1RFUk0JCTB4MjAKKyNkZWZpbmUgRElSRUNUX0NPTk4JCTB4NDAKKyNkZWZpbmUgTk9fTklDX1dBVENIRE9HCQkweDgwCisjZGVmaW5lIFNXQVBfREFUQQkJMHgxMDAKKyNkZWZpbmUgU1dBUF9DT05UUk9MCQkweDIwMAorI2RlZmluZSBOSUNfSEFMVF9PTl9FUlIJCTB4NDAwCisjZGVmaW5lIE5JQ19OT19SRVNUQVJUCQkweDgwMAorI2RlZmluZSBIQUxGX0RVUF9UWAkJMHgxMDAwCisjZGVmaW5lIEhBTEZfRFVQX1JYCQkweDIwMDAKKworCisvKgorICogRXJyb3IgY29kZXMKKyAqLworCisvKiBIb3N0IEVycm9yIENvZGVzIC0gdmFsdWVzIG9mIGZhaWwxICovCisjZGVmaW5lIEVSUl9VTktOT1dOX01CT1gJMHgxMDAxCisjZGVmaW5lIEVSUl9VTktOT1dOX0NNRAkJMHgxMDAyCisjZGVmaW5lIEVSUl9NQVhfUklORwkJMHgxMDAzCisjZGVmaW5lIEVSUl9SSU5HX0NMT1NFRAkJMHgxMDA0CisjZGVmaW5lIEVSUl9SSU5HX09QRU4JCTB4MTAwNQorLyogRmlybXdhcmUgaW50ZXJuYWwgZXJyb3JzICovCisjZGVmaW5lIEVSUl9FVkVOVF9SSU5HX0ZVTEwJMHgwMQorI2RlZmluZSBFUlJfRFdfUEVORF9DTU5EX0ZVTEwJMHgwMgorI2RlZmluZSBFUlJfRFJfUEVORF9DTU5EX0ZVTEwJMHgwMworI2RlZmluZSBFUlJfRFdfUEVORF9EQVRBX0ZVTEwJMHgwNAorI2RlZmluZSBFUlJfRFJfUEVORF9EQVRBX0ZVTEwJMHgwNQorI2RlZmluZSBFUlJfSUxMRUdBTF9KVU1QCTB4MDYKKyNkZWZpbmUgRVJSX1VOSU1QTEVNRU5URUQJMHgwNworI2RlZmluZSBFUlJfVFhfSU5GT19GVUxMCTB4MDgKKyNkZWZpbmUgRVJSX1JYX0lORk9fRlVMTAkweDA5CisjZGVmaW5lIEVSUl9JTExFR0FMX01PREUJMHgwQQorI2RlZmluZSBFUlJfTUFJTl9USU1FT1VUCTB4MEIKKyNkZWZpbmUgRVJSX0VWRU5UX0JJVFMJCTB4MEMKKyNkZWZpbmUgRVJSX1VOUEVORF9GVUxMCQkweDBECisjZGVmaW5lIEVSUl9USU1FUl9RVUVVRV9GVUxMCTB4MEUKKyNkZWZpbmUgRVJSX1RJTUVSX1FVRVVFX0VNUFRZCTB4MEYKKyNkZWZpbmUgRVJSX1RJTUVSX05PX0ZSRUUJMHgxMAorI2RlZmluZSBFUlJfSU5UUl9TVEFSVAkJMHgxMQorI2RlZmluZSBFUlJfQkFEX1NUQVJUVVAJCTB4MTIKKyNkZWZpbmUgRVJSX05PX1BLVF9FTkQJCTB4MTMKKyNkZWZpbmUgRVJSX0hBTFRFRF9PTl9FUlIJMHgxNAorLyogSGFyZHdhcmUgTklDIEVycm9ycyAqLworI2RlZmluZSBFUlJfV1JJVEVfRE1BCQkweDAxMDEKKyNkZWZpbmUgRVJSX1JFQURfRE1BCQkweDAxMDIKKyNkZWZpbmUgRVJSX0VYVF9TRVJJQUwJCTB4MDEwMworI2RlZmluZSBFUlJfVFhfSU5UX1BBUklUWQkweDAxMDQKKworCisvKgorICogRXZlbnQgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIEVWVF9SSU5HX0VOVFJJRVMJNjQKKyNkZWZpbmUgRVZUX1JJTkdfU0laRQkJKEVWVF9SSU5HX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IGV2ZW50KSkKKworc3RydWN0IGV2ZW50IHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKwl1MTYgICAgIGluZGV4OworCXU4ICAgICAgcmluZzsKKwl1OCAgICAgIGNvZGU7CisjZWxzZQorCXU4ICAgICAgY29kZTsKKwl1OCAgICAgIHJpbmc7CisJdTE2ICAgICBpbmRleDsKKyNlbmRpZgorCXUzMiAgICAgdGltZXN0YW1wOworfTsKKworLyoKKyAqIEdlbmVyYWwgRXZlbnRzCisgKi8KKworI2RlZmluZSBFX05JQ19VUAkweDAxCisjZGVmaW5lIEVfV0FUQ0hET0cJMHgwMgorCisjZGVmaW5lIEVfU1RBVF9VUEQJMHgwNAorI2RlZmluZSBFX0lOVkFMX0NNRAkweDA1CisjZGVmaW5lIEVfU0VUX0NNRF9DT05TCTB4MDYKKyNkZWZpbmUgRV9MSU5LX09OCTB4MDcKKyNkZWZpbmUgRV9MSU5LX09GRgkweDA4CisjZGVmaW5lIEVfSU5URVJOX0VSUgkweDA5CisjZGVmaW5lIEVfSE9TVF9FUlIJMHgwQQorI2RlZmluZSBFX1NUQVRTX1VQREFURQkweDBCCisjZGVmaW5lIEVfUkVKRUNUSU5HCTB4MEMKKworLyoKKyAqIFNlbmQgIEV2ZW50cworICovCisjZGVmaW5lIEVfQ09OX1JFSgkweDEzCisjZGVmaW5lIEVfQ09OX1RNT1VUCTB4MTQKKyNkZWZpbmUgRV9DT05fTkNfVE1PVVQJMHgxNQkvKiBJICAsIENvbm5lY3Rpb24gTm8gQ2FtcG9uIFRpbWVvdXQgKi8KKyNkZWZpbmUgRV9ESVNDX0VSUgkweDE2CisjZGVmaW5lIEVfSU5UX1BSVFkJMHgxNworI2RlZmluZSBFX1RYX0lETEUJMHgxOAorI2RlZmluZSBFX1RYX0xJTktfRFJPUAkweDE5CisjZGVmaW5lIEVfVFhfSU5WX1JORwkweDFBCisjZGVmaW5lIEVfVFhfSU5WX0JVRgkweDFCCisjZGVmaW5lIEVfVFhfSU5WX0RTQwkweDFDCisKKy8qCisgKiBEZXN0aW5hdGlvbiBFdmVudHMKKyAqLworLyoKKyAqIEdlbmVyYWwgUmVjZWl2ZSBldmVudHMKKyAqLworI2RlZmluZSBFX1ZBTF9STkcJMHgyMAorI2RlZmluZSBFX1JYX1JOR19FTkVSCTB4MjEKKyNkZWZpbmUgRV9JTlZfUk5HCTB4MjIKKyNkZWZpbmUgRV9SWF9STkdfU1BDCTB4MjMKKyNkZWZpbmUgRV9SWF9STkdfT1VUCTB4MjQKKyNkZWZpbmUgRV9QS1RfRElTQ0FSRAkweDI1CisjZGVmaW5lIEVfSU5GT19FVlQJMHgyNworCisvKgorICogRGF0YSBjb3JydXB0ZWQgZXZlbnRzCisgKi8KKyNkZWZpbmUgRV9SWF9QQVJfRVJSCTB4MkIKKyNkZWZpbmUgRV9SWF9MTFJDX0VSUgkweDJDCisjZGVmaW5lIEVfSVBfQ0tTTV9FUlIJMHgyRAorI2RlZmluZSBFX0RUQV9DS1NNX0VSUgkweDJFCisjZGVmaW5lIEVfU0hUX0JTVAkweDJGCisKKy8qCisgKiBEYXRhIGxvc3QgZXZlbnRzCisgKi8KKyNkZWZpbmUgRV9MU1RfTE5LX0VSUgkweDMwCisjZGVmaW5lIEVfRkxHX1NZTl9FUlIJMHgzMQorI2RlZmluZSBFX0ZSTV9FUlIJMHgzMgorI2RlZmluZSBFX1JYX0lETEUJMHgzMworI2RlZmluZSBFX1BLVF9MTl9FUlIJMHgzNAorI2RlZmluZSBFX1NUQVRFX0VSUgkweDM1CisjZGVmaW5lIEVfVU5FWFBfREFUQQkweDNDCisKKy8qCisgKiBGYXRhbCBldmVudHMKKyAqLworI2RlZmluZSBFX1JYX0lOVl9CVUYJMHgzNgorI2RlZmluZSBFX1JYX0lOVl9EU0MJMHgzNworI2RlZmluZSBFX1JOR19CTEsJMHgzOAorCisvKgorICogV2FybmluZyBldmVudHMKKyAqLworI2RlZmluZSBFX1JYX1RPCQkweDM5CisjZGVmaW5lIEVfQkZSX1NQQwkweDNBCisjZGVmaW5lIEVfSU5WX1VMUAkweDNCCisKKyNkZWZpbmUgRV9OT1RfSU1QTEVNRU5URUQgMHg0MAorCisKKy8qCisgKiBDb21tYW5kcworICovCisKKyNkZWZpbmUgQ01EX1JJTkdfRU5UUklFUwkxNgorCitzdHJ1Y3QgY21kIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKwl1MTYgICAgIGluZGV4OworCXU4ICAgICAgcmluZzsKKwl1OCAgICAgIGNvZGU7CisjZWxzZQorCXU4ICAgICAgY29kZTsKKwl1OCAgICAgIHJpbmc7CisJdTE2ICAgICBpbmRleDsKKyNlbmRpZgorfTsKKworI2RlZmluZSBDX1NUQVJUX0ZXCTB4MDEKKyNkZWZpbmUgQ19VUERfU1RBVAkweDAyCisjZGVmaW5lIENfV0FUQ0hET0cJMHgwNQorI2RlZmluZSBDX0RFTF9STkcJMHgwOQorI2RlZmluZSBDX05FV19STkcJMHgwQQorI2RlZmluZSBDX0NPTk4JCTB4MEQKKworCisvKgorICogTW9kZSBiaXRzCisgKi8KKworI2RlZmluZSAgUEFDS0VUX0JBRAkJMHgwMSAvKiBQYWNrZXQgaGFkIGxpbmstbGF5ZXIgZXJyb3IgKi8KKyNkZWZpbmUgIElOVEVSUlVQVAkJMHgwMgorI2RlZmluZSAgVFhfSVBfQ0tTVU0JCTB4MDQKKyNkZWZpbmUgIFBBQ0tFVF9FTkQJCTB4MDgKKyNkZWZpbmUgIFBBQ0tFVF9TVEFSVAkJMHgxMAorI2RlZmluZSAgU0FNRV9JRklFTEQJCTB4ODAKKworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCisJdTY0IGFkZHJsbzsKKyNlbHNlCisJdTMyIGFkZHJoaTsKKwl1MzIgYWRkcmxvOworI2VuZGlmCit9IHJyYWRkcjsKKworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3JyYWRkcihycmFkZHIgKnJhLCBkbWFfYWRkcl90IGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBiYWRkciA9IGFkZHI7CisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCisJcmEtPmFkZHJsbyA9IGJhZGRyOworI2Vsc2UKKyAgICAvKiBEb24ndCBib3RoZXIgc2V0dGluZyB6ZXJvIGV2ZXJ5IHRpbWUgKi8KKwlyYS0+YWRkcmxvID0gYmFkZHI7CisjZW5kaWYKKwltYigpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcnhhZGRyKHN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3MsIHZvbGF0aWxlIGRtYV9hZGRyX3QgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGJhZGRyID0gYWRkcjsKKyNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkgJiYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJd3JpdGVsKGJhZGRyICYgMHhmZmZmZmZmZiwgJnJlZ3MtPlJ4UmluZ0hpKTsKKwl3cml0ZWwoYmFkZHIgPj4gMzIsICZyZWdzLT5SeFJpbmdMbyk7CisjZWxpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKKwl3cml0ZWwoYmFkZHIgPj4gMzIsICZyZWdzLT5SeFJpbmdIaSk7CisJd3JpdGVsKGJhZGRyICYgMHhmZmZmZmZmZiwgJnJlZ3MtPlJ4UmluZ0xvKTsKKyNlbHNlCisJd3JpdGVsKDAsICZyZWdzLT5SeFJpbmdIaSk7CisJd3JpdGVsKGJhZGRyLCAmcmVncy0+UnhSaW5nTG8pOworI2VuZGlmCisJbWIoKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2luZm9hZGRyKHN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3MsIHZvbGF0aWxlIGRtYV9hZGRyX3QgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGJhZGRyID0gYWRkcjsKKyNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkgJiYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJd3JpdGVsKGJhZGRyICYgMHhmZmZmZmZmZiwgJnJlZ3MtPkluZm9QdHJIaSk7CisJd3JpdGVsKGJhZGRyID4+IDMyLCAmcmVncy0+SW5mb1B0ckxvKTsKKyNlbGlmIChCSVRTX1BFUl9MT05HID09IDY0KQorCXdyaXRlbChiYWRkciA+PiAzMiwgJnJlZ3MtPkluZm9QdHJIaSk7CisJd3JpdGVsKGJhZGRyICYgMHhmZmZmZmZmZiwgJnJlZ3MtPkluZm9QdHJMbyk7CisjZWxzZQorCXdyaXRlbCgwLCAmcmVncy0+SW5mb1B0ckhpKTsKKwl3cml0ZWwoYmFkZHIsICZyZWdzLT5JbmZvUHRyTG8pOworI2VuZGlmCisJbWIoKTsKK30KKworCisvKgorICogVFggcmluZworICovCisKKyNpZmRlZiBDT05GSUdfUk9BRFJVTk5FUl9MQVJHRV9SSU5HUworI2RlZmluZSBUWF9SSU5HX0VOVFJJRVMJMzIKKyNlbHNlCisjZGVmaW5lIFRYX1JJTkdfRU5UUklFUwkxNgorI2VuZGlmCisjZGVmaW5lIFRYX1RPVEFMX1NJWkUJKFRYX1JJTkdfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykpCisKK3N0cnVjdCB0eF9kZXNjeworCXJyYWRkcglhZGRyOworCXUzMglyZXM7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJdTE2CXNpemU7CisJdTgJcGFkOworCXU4CW1vZGU7CisjZWxzZQorCXU4CW1vZGU7CisJdTgJcGFkOworCXUxNglzaXplOworI2VuZGlmCit9OworCisKKyNpZmRlZiBDT05GSUdfUk9BRFJVTk5FUl9MQVJHRV9SSU5HUworI2RlZmluZSBSWF9SSU5HX0VOVFJJRVMJMzIKKyNlbHNlCisjZGVmaW5lIFJYX1JJTkdfRU5UUklFUyAxNgorI2VuZGlmCisjZGVmaW5lIFJYX1RPVEFMX1NJWkUJKFJYX1JJTkdfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykpCisKK3N0cnVjdCByeF9kZXNjeworCXJyYWRkcglhZGRyOworCXUzMglyZXM7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJdTE2CXNpemU7CisJdTgJcGFkOworCXU4CW1vZGU7CisjZWxzZQorCXU4CW1vZGU7CisJdTgJcGFkOworCXUxNglzaXplOworI2VuZGlmCit9OworCisKKy8qCisgKiBpb2N0bCdzCisgKi8KKworI2RlZmluZSBTSU9DUlJQRlcJU0lPQ0RFVlBSSVZBVEUJCS8qIHB1dCBmaXJtd2FyZSAqLworI2RlZmluZSBTSU9DUlJHRlcJU0lPQ0RFVlBSSVZBVEUrMQkvKiBnZXQgZmlybXdhcmUgKi8KKyNkZWZpbmUgU0lPQ1JSSUQJU0lPQ0RFVlBSSVZBVEUrMgkvKiBpZGVudGlmeSAqLworCisKK3N0cnVjdCBzZWdfaGRyIHsKKwl1MzIJc2VnX3N0YXJ0OworCXUzMglzZWdfbGVuOworCXUzMglzZWdfZWVzdGFydDsKK307CisKKworI2RlZmluZSBFRVBST01fQkFTRSAweDgwMDAwMDAwCisjZGVmaW5lIEVFUFJPTV9XT1JEUyA4MTkyCisjZGVmaW5lIEVFUFJPTV9CWVRFUyAoRUVQUk9NX1dPUkRTICogc2l6ZW9mKHUzMikpCisKK3N0cnVjdCBlZXByb21fYm9vdCB7CisJdTMyCWtleTE7CisJdTMyCWtleTI7CisJdTMyCXNyYW1fc2l6ZTsKKwlzdHJ1Y3QJc2VnX2hkciBsb2FkZXI7CisJdTMyCWluaXRfY2hrc3VtOworCXUzMglyZXNlcnZlZDE7Cit9OworCitzdHJ1Y3QgZWVwcm9tX21hbmYgeworCXUzMglIZWFkZXJGbXQ7CisJdTMyCUZpcm13YXJlOworCXUzMglCb2FyZFJldmlzaW9uOworCXUzMglSb2FkcnVubmVyUmV2OworCWNoYXIJT3B0aWNzUGFydFs4XTsKKwl1MzIJT3B0aWNzUmV2OworCXUzMglwYWQxOworCWNoYXIJU3JhbVBhcnRbOF07CisJdTMyCVNyYW1SZXY7CisJdTMyCXBhZDI7CisJY2hhcglFZXByb21QYXJ0WzhdOworCXUzMglFZXByb21SZXY7CisJdTMyCUVlcHJvbVNpemU7CisJY2hhcglQYWxQYXJ0WzhdOworCXUzMglQYWxSZXY7CisJdTMyCXBhZDM7CisJY2hhcglQYWxDb2RlRmlsZVsxMl07CisJdTMyCVBhbENvZGVSZXY7CisJY2hhcglCb2FyZFVMQVs4XTsKKwljaGFyCVNlcmlhbE5vWzhdOworCWNoYXIJTWZnRGF0ZVs4XTsKKwljaGFyCU1mZ1RpbWVbOF07CisJY2hhcglNb2RpZnlEYXRlWzhdOworCXUzMglNb2RDb3VudDsKKwl1MzIJcGFkNFsxM107Cit9OworCisKK3N0cnVjdCBlZXByb21fcGhhc2VfaW5mbyB7CisJY2hhcglwaGFzZTFGaWxlWzEyXTsKKwl1MzIJcGhhc2UxUmV2OworCWNoYXIJcGhhc2UxRGF0ZVs4XTsKKwljaGFyCXBoYXNlMkZpbGVbMTJdOworCXUzMglwaGFzZTJSZXY7CisJY2hhcglwaGFzZTJEYXRlWzhdOworCXUzMglyZXNlcnZlZDdbNF07Cit9OworCitzdHJ1Y3QgZWVwcm9tX3JuY2RfaW5mbyB7CisJdTMyCUZ3U3RhcnQ7CisJdTMyCUZ3UmV2OworCWNoYXIJRndEYXRlWzhdOworCXUzMglBZGRyUnVuQ29kZVNlZ3M7CisJdTMyCUZpbGVOYW1lczsKKwljaGFyCUZpbGVbMTNdWzhdOworfTsKKworCisvKiBQaGFzZSAxIHJlZ2lvbiAoc3RhcnRzIGFyZSB3b3JkIG9mZnNldCAweDgwKSAqLworc3RydWN0IHBoYXNlMV9oZHJ7CisJdTMyCWp1bXA7CisJdTMyCW5vb3A7CisJc3RydWN0IHNlZ19oZHIgcGhhc2UyU2VnOworfTsKKworc3RydWN0IGVlcHJvbSB7CisJc3RydWN0IGVlcHJvbV9ib290CWJvb3Q7CisJdTMyCQkJcGFkMVs4XTsKKwlzdHJ1Y3QgZWVwcm9tX21hbmYJbWFuZjsKKwlzdHJ1Y3QgZWVwcm9tX3BoYXNlX2luZm8gcGhhc2VfaW5mbzsKKwlzdHJ1Y3QgZWVwcm9tX3JuY2RfaW5mbwlybmNkX2luZm87CisJdTMyCQkJcGFkMlsxNV07CisJdTMyCQkJaGRyX2NoZWNrc3VtOworCXN0cnVjdCBwaGFzZTFfaGRyCXBoYXNlMTsKK307CisKKworc3RydWN0IHJyX3N0YXRzIHsKKwl1MzIJTmljVGltZVN0YW1wOworCXUzMglSbmdDcmVhdGVkOworCXUzMglSbmdEZWxldGVkOworCXUzMglJbnRyR2VuOworCXUzMglORXZ0T3ZmbDsKKwl1MzIJSW52Q21kOworCXUzMglEbWFSZWFkRXJyczsKKwl1MzIJRG1hV3JpdGVFcnJzOworCXUzMglTdGF0VXBkdFQ7CisJdTMyCVN0YXRVcGR0QzsKKwl1MzIJV2F0Y2hEb2c7CisJdTMyCVRyYWNlOwkKKworCS8qIFNlcmlhbCBISVBQSSAqLworCXUzMglMbmtSZHlFc3Q7CisJdTMyCUdMaW5rRXJyOworCXUzMglBbHRGbGdFcnI7CisJdTMyCU92aGRCaXQ4U3luYzsKKwl1MzIJUm10U2VyUHJ0eUVycjsKKwl1MzIJUm10UGFyUHJ0eUVycjsKKwl1MzIJUm10TG9vcEJrOworCXUzMglwYWQxOworCisJLyogSElQUEkgdHggKi8KKwl1MzIJQ29uRXN0OworCXUzMglDb25SZWpTOworCXUzMglDb25SZXRyeTsKKwl1MzIJQ29uVG1PdXQ7CisJdTMyCVNuZENvbkRpc2NvbjsKKwl1MzIJU25kUGFyRXJyOworCXUzMglQa3RTbnQ7CisJdTMyCXBhZDJbMl07CisJdTMyCVNoRkJzdFNudDsKKwl1NjQJQnl0U2VudDsKKwl1MzIJVHhUaW1lb3V0OworCXUzMglwYWQzWzNdOworCisJLyogSElQUEkgcnggKi8KKwl1MzIJQ29uQWNjOworCXUzMglDb25SZWpkaVBydHk7CisJdTMyCUNvblJlamQ2NGI7CisJdTMyCUNvblJlamRCdWY7CisJdTMyCVJ4Q29uRGlzY29uOworCXUzMglSeENvbk5vRGF0YTsKKwl1MzIJUGt0Ung7CisJdTMyCXBhZDRbMl07CisJdTMyCVNoRkJzdFJ4OworCXU2NAlCeXRSeDsKKwl1MzIJUnhQYXJFcnI7CisJdTMyCVJ4TExSQ2VycjsKKwl1MzIJUnhCc3RTWmVycjsKKwl1MzIJUnhTdGF0ZUVycjsKKwl1MzIJUnhSZHlFcnI7CisJdTMyCVJ4SW52VUxQOworCXUzMglSeFNwY0J1ZjsKKwl1MzIJUnhTcGNEZXNjOworCXUzMglSeFJuZ1NwYzsKKwl1MzIJUnhSbmdGdWxsOworCXUzMglSeFBrdExlbkVycjsKKwl1MzIJUnhDa3NtRXJyOworCXUzMglSeFBrdERycDsKKwl1MzIJUm5nTG93U3BjOworCXUzMglSbmdEYXRhQ2xvc2U7CisJdTMyCVJ4VGltZW91dDsKKwl1MzIJUnhJZGxlOworfTsKKworCisvKgorICogVGhpcyBzdHJ1Y3QgaXMgc2hhcmVkIHdpdGggdGhlIE5JQyBmaXJtd2FyZS4KKyAqLworc3RydWN0IHJpbmdfY3RybCB7CisJcnJhZGRyCXJuZ3B0cjsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKwl1MTYJZW50cmllczsKKwl1OAlwYWQ7CisJdTgJZW50cnlfc2l6ZTsKKwl1MTYJcGk7CisJdTE2CW1vZGU7CisjZWxzZQorCXU4CWVudHJ5X3NpemU7CisJdTgJcGFkOworCXUxNgllbnRyaWVzOworCXUxNgltb2RlOworCXUxNglwaTsKKyNlbmRpZgorfTsKKworc3RydWN0IHJyX2luZm8geworCXVuaW9uIHsKKwkJc3RydWN0IHJyX3N0YXRzIHN0YXRzOworCQl1MzIgc3RhdGlbMTI4XTsKKwl9IHM7CisJc3RydWN0IHJpbmdfY3RybAlldnRfY3RybDsKKwlzdHJ1Y3QgcmluZ19jdHJsCWNtZF9jdHJsOworCXN0cnVjdCByaW5nX2N0cmwJdHhfY3RybDsKKwl1OAkJCXBhZFs0NjRdOworCXU4CQkJdHJhY2VbMzA3Ml07Cit9OworCisvKgorICogVGhlIGxpbnV4IHN0cnVjdHVyZSBmb3IgdGhlIFJvYWRSdW5uZXIuCisgKgorICogUlgvVFggZGVzY3JpcHRvcnMgYXJlIHB1dCBmaXJzdCB0byBtYWtlIHN1cmUgdGhleSBhcmUgcHJvcGVybHkKKyAqIGFsaWduZWQgYW5kIGRvIG5vdCBjcm9zcyBjYWNoZS1saW5lIGJvdW5kYXJpZXMuCisgKi8KKworc3RydWN0IHJyX3ByaXZhdGUKK3sKKwlzdHJ1Y3QgcnhfZGVzYwkJKnJ4X3Jpbmc7CisJc3RydWN0IHR4X2Rlc2MJCSp0eF9yaW5nOworCXN0cnVjdCBldmVudAkJKmV2dF9yaW5nOworCWRtYV9hZGRyX3QgCQl0eF9yaW5nX2RtYTsKKwlkbWFfYWRkcl90IAkJcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCAJCWV2dF9yaW5nX2RtYTsKKwkvKiBBbGlnbm1lbnQgb2sgPyAqLworCXN0cnVjdCBza19idWZmCQkqcnhfc2tidWZmW1JYX1JJTkdfRU5UUklFU107CisJc3RydWN0IHNrX2J1ZmYJCSp0eF9za2J1ZmZbVFhfUklOR19FTlRSSUVTXTsKKwlzdHJ1Y3QgcnJfcmVncwkJX19pb21lbSAqcmVnczsJCS8qIFJlZ2lzdGVyIGJhc2UgKi8KKwlzdHJ1Y3QgcmluZ19jdHJsCSpyeF9jdHJsOwkvKiBSZWNlaXZlIHJpbmcgY29udHJvbCAqLworCXN0cnVjdCBycl9pbmZvCQkqaW5mbzsJCS8qIFNoYXJlZCBpbmZvIHBhZ2UgKi8KKwlkbWFfYWRkcl90IAkJcnhfY3RybF9kbWE7CisJZG1hX2FkZHJfdCAJCWluZm9fZG1hOworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisJdTMyCQkJY3VyX3J4LCBjdXJfY21kLCBjdXJfZXZ0OworCXUzMgkJCWRpcnR5X3J4LCBkaXJ0eV90eDsKKwl1MzIJCQl0eF9mdWxsOworCXUzMgkJCWZ3X3JldjsKKwl2b2xhdGlsZSBzaG9ydAkJZndfcnVubmluZzsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgcGNpX2RldgkJKnBjaV9kZXY7Cit9OworCisKKy8qCisgKiBQcm90b3R5cGVzCisgKi8KK3N0YXRpYyBpbnQgcnJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcnJfaW5pdDEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgcnJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgaW50IHJyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpycl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHVuc2lnbmVkIGludCBycl9yZWFkX2VlcHJvbShzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2LAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGxlbmd0aCk7CitzdGF0aWMgdTMyIHJyX3JlYWRfZWVwcm9tX3dvcmQoc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiwgdm9pZCAqIG9mZnNldCk7CitzdGF0aWMgaW50IHJyX2xvYWRfZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW5saW5lIHZvaWQgcnJfcmF6X3R4KHN0cnVjdCBycl9wcml2YXRlICosIHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGlubGluZSB2b2lkIHJyX3Jhel9yeChzdHJ1Y3QgcnJfcHJpdmF0ZSAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKyNlbmRpZiAvKiBfUlJVTk5FUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby1yZWdzLmggYi9kcml2ZXJzL25ldC9zMmlvLXJlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDkyY2E2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvczJpby1yZWdzLmgKQEAgLTAsMCArMSw3NzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJlZ3MuaDogQSBMaW51eCBQQ0ktWCBFdGhlcm5ldCBkcml2ZXIgZm9yIFMySU8gMTBHYkUgU2VydmVyIE5JQworICogQ29weXJpZ2h0KGMpIDIwMDItMjAwNSBOZXRlcmlvbiBJbmMuCisKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKiBEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisgKiByZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90CisgKiBhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworICogc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisgKiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9SRUdTX0gKKyNkZWZpbmUgX1JFR1NfSAorCisjZGVmaW5lIFRCRCAwCisKK3R5cGVkZWYgc3RydWN0IF9YRU5BX2Rldl9jb25maWcgeworLyogQ29udmVudGlvbjogbUhBTF9YWFggaXMgbWFzaywgdkhBTF9YWFggaXMgdmFsdWUgKi8KKworLyogR2VuZXJhbCBDb250cm9sLVN0YXR1cyBSZWdpc3RlcnMgKi8KKwl1NjQgZ2VuZXJhbF9pbnRfc3RhdHVzOworI2RlZmluZSBHRU5fSU5UUl9UWFBJQyAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgR0VOX0lOVFJfVFhETUEgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIEdFTl9JTlRSX1RYTUFDICAgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBHRU5fSU5UUl9UWFhHWFMgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgR0VOX0lOVFJfVFhUUkFGRklDICAgICAgICAgQklUKDgpCisjZGVmaW5lIEdFTl9JTlRSX1JYUElDICAgICAgICAgICAgIEJJVCgzMikKKyNkZWZpbmUgR0VOX0lOVFJfUlhETUEgICAgICAgICAgICAgQklUKDMzKQorI2RlZmluZSBHRU5fSU5UUl9SWE1BQyAgICAgICAgICAgICBCSVQoMzQpCisjZGVmaW5lIEdFTl9JTlRSX01DICAgICAgICAgICAgICAgIEJJVCgzNSkKKyNkZWZpbmUgR0VOX0lOVFJfUlhYR1hTICAgICAgICAgICAgQklUKDM2KQorI2RlZmluZSBHRU5fSU5UUl9SWFRSQUZGSUMgICAgICAgICBCSVQoNDApCisjZGVmaW5lIEdFTl9FUlJPUl9JTlRSICAgICAgICAgICAgIEdFTl9JTlRSX1RYUElDIHwgR0VOX0lOVFJfUlhQSUMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTl9JTlRSX1RYRE1BIHwgR0VOX0lOVFJfUlhETUEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTl9JTlRSX1RYTUFDIHwgR0VOX0lOVFJfUlhNQUMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTl9JTlRSX1RYWEdYU3wgR0VOX0lOVFJfUlhYR1hTfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTl9JTlRSX01DCisKKwl1NjQgZ2VuZXJhbF9pbnRfbWFzazsKKworCXU4IHVudXNlZDBbMHgxMDAgLSAweDEwXTsKKworCXU2NCBzd19yZXNldDsKKy8qIFhHWFMgbXVzdCBiZSByZW1vdmVkIGZyb20gcmVzZXQgb25seSBvbmNlLiAqLworI2RlZmluZSBTV19SRVNFVF9YRU5BICAgICAgICAgICAgICB2QklUKDB4QTUsMCw4KQorI2RlZmluZSBTV19SRVNFVF9GTEFTSCAgICAgICAgICAgICB2QklUKDB4QTUsOCw4KQorI2RlZmluZSBTV19SRVNFVF9FT0kgICAgICAgICAgICAgICB2QklUKDB4QTUsMTYsOCkKKyNkZWZpbmUgU1dfUkVTRVRfQUxMICAgICAgICAgICAgICAgKFNXX1JFU0VUX1hFTkEgICAgIHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV19SRVNFVF9GTEFTSCAgICB8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dfUkVTRVRfRU9JKQorLyogVGhlIFNXX1JFU0VUIHJlZ2lzdGVyIG11c3QgcmVhZCB0aGlzIHZhbHVlIGFmdGVyIGEgc3VjY2Vzc2Z1bCByZXNldC4gKi8KKyNkZWZpbmUJU1dfUkVTRVRfUkFXX1ZBTAkJCTB4QTUwMDAwMDAKKworCisJdTY0IGFkYXB0ZXJfc3RhdHVzOworI2RlZmluZSBBREFQVEVSX1NUQVRVU19URE1BX1JFQURZICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19SRE1BX1JFQURZICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19QRkNfUkVBRFkgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19UTUFDX0JVRl9FTVBUWSAgICAgIEJJVCgzKQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19QSUNfUVVJRVNDRU5UICAgICAgIEJJVCg1KQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19STUFDX1JFTU9URV9GQVVMVCAgIEJJVCg2KQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19STUFDX0xPQ0FMX0ZBVUxUICAgIEJJVCg3KQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19STUFDX1BDQ19JRExFICAgICAgIHZCSVQoMHhGRiw4LDgpCisjZGVmaW5lIEFEQVBURVJfU1RBVFVTX1JDX1BSQ19RVUlFU0NFTlQgICAgdkJJVCgweEZGLDE2LDgpCisjZGVmaW5lIEFEQVBURVJfU1RBVFVTX01DX0RSQU1fUkVBRFkgICAgICAgQklUKDI0KQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19NQ19RVUVVRVNfUkVBRFkgICAgIEJJVCgyNSkKKyNkZWZpbmUgQURBUFRFUl9TVEFUVVNfTV9QTExfTE9DSyAgICAgICAgICBCSVQoMzApCisjZGVmaW5lIEFEQVBURVJfU1RBVFVTX1BfUExMX0xPQ0sgICAgICAgICAgQklUKDMxKQorCisJdTY0IGFkYXB0ZXJfY29udHJvbDsKKyNkZWZpbmUgQURBUFRFUl9DTlRMX0VOICAgICAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgQURBUFRFUl9FT0lfVFhfT04gICAgICAgICAgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIEFEQVBURVJfTEVEX09OICAgICAgICAgICAgICAgICAgICAgQklUKDIzKQorI2RlZmluZSBBREFQVEVSX1VEUEkodmFsKSAgICAgICAgICAgICAgICAgIHZCSVQodmFsLDM2LDQpCisjZGVmaW5lIEFEQVBURVJfV0FJVF9JTlQgICAgICAgICAgICAgICAgICAgQklUKDQ4KQorI2RlZmluZSBBREFQVEVSX0VDQ19FTiAgICAgICAgICAgICAgICAgICAgIEJJVCg1NSkKKworCXU2NCBzZXJyX3NvdXJjZTsKKyNkZWZpbmUgU0VSUl9TT1VSQ0VfUElDCQkJCQlCSVQoMCkKKyNkZWZpbmUgU0VSUl9TT1VSQ0VfVFhETUEJCQkJQklUKDEpCisjZGVmaW5lIFNFUlJfU09VUkNFX1JYRE1BCQkJCUJJVCgyKQorI2RlZmluZSBTRVJSX1NPVVJDRV9NQUMgICAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBTRVJSX1NPVVJDRV9NQyAgICAgICAgICAgICAgICAgIEJJVCg0KQorI2RlZmluZSBTRVJSX1NPVVJDRV9YR1hTICAgICAgICAgICAgICAgIEJJVCg1KQorI2RlZmluZQlTRVJSX1NPVVJDRV9BTlkJCQkJCShTRVJSX1NPVVJDRV9QSUMJCXwgXAorCQkJCQkJCQkJCVNFUlJfU09VUkNFX1RYRE1BCXwgXAorCQkJCQkJCQkJCVNFUlJfU09VUkNFX1JYRE1BCXwgXAorCQkJCQkJCQkJCVNFUlJfU09VUkNFX01BQwkJfCBcCisJCQkJCQkJCQkJU0VSUl9TT1VSQ0VfTUMgICAgICB8IFwKKwkJCQkJCQkJCQlTRVJSX1NPVVJDRV9YR1hTKQorCisKKwl1OCB1bnVzZWRfMFsweDgwMCAtIDB4MTIwXTsKKworLyogUENJLVggQ29udHJvbGxlciByZWdpc3RlcnMgKi8KKwl1NjQgcGljX2ludF9zdGF0dXM7CisJdTY0IHBpY19pbnRfbWFzazsKKyNkZWZpbmUgUElDX0lOVF9UWCAgICAgICAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBQSUNfSU5UX0ZMU0ggICAgICAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFBJQ19JTlRfTURJTyAgICAgICAgICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgUElDX0lOVF9JSUMgICAgICAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBQSUNfSU5UX0dQSU8gICAgICAgICAgICAgICAgICAgQklUKDQpCisjZGVmaW5lIFBJQ19JTlRfUlggICAgICAgICAgICAgICAgICAgICBCSVQoMzIpCisKKwl1NjQgdHhwaWNfaW50X3JlZzsKKwl1NjQgdHhwaWNfaW50X21hc2s7CisjZGVmaW5lIFBDSVhfSU5UX1JFR19FQ0NfU0dfRVJSICAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfRUNDX0RCX0VSUiAgICAgICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgUENJWF9JTlRfUkVHX0ZMQVNIUl9SX0ZTTV9FUlIgICAgICAgICAgQklUKDgpCisjZGVmaW5lIFBDSVhfSU5UX1JFR19GTEFTSFJfV19GU01fRVJSICAgICAgICAgIEJJVCg5KQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfSU5JX1RYX0ZTTV9TRVJSICAgICAgICAgICBCSVQoMTApCisjZGVmaW5lIFBDSVhfSU5UX1JFR19JTklfVFhPX0ZTTV9FUlIgICAgICAgICAgIEJJVCgxMSkKKyNkZWZpbmUgUENJWF9JTlRfUkVHX1RSVF9GU01fU0VSUiAgICAgICAgICAgICAgQklUKDEzKQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfU1JUX0ZTTV9TRVJSICAgICAgICAgICAgICBCSVQoMTQpCisjZGVmaW5lIFBDSVhfSU5UX1JFR19QSUZSX0ZTTV9TRVJSICAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgUENJWF9JTlRfUkVHX1dSQ19UWF9TRU5EX0ZTTV9TRVJSICAgICAgQklUKDIxKQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfUlJDX1RYX1JFUV9GU01fU0VSUiAgICAgICBCSVQoMjMpCisjZGVmaW5lIFBDSVhfSU5UX1JFR19JTklfUlhfRlNNX1NFUlIgICAgICAgICAgIEJJVCg0OCkKKyNkZWZpbmUgUENJWF9JTlRfUkVHX1JBX1JYX0ZTTV9TRVJSICAgICAgICAgICAgQklUKDUwKQorLyoKKyNkZWZpbmUgUENJWF9JTlRfUkVHX1dSQ19SWF9TRU5EX0ZTTV9TRVJSICAgICAgQklUKDUyKQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfUlJDX1JYX1JFUV9GU01fU0VSUiAgICAgICBCSVQoNTQpCisjZGVmaW5lIFBDSVhfSU5UX1JFR19SUkNfUlhfU1BMSVRfRlNNX1NFUlIgICAgIEJJVCg1OCkKKyovCisJdTY0IHR4cGljX2FsYXJtczsKKwl1NjQgcnhwaWNfaW50X3JlZzsKKwl1NjQgcnhwaWNfaW50X21hc2s7CisJdTY0IHJ4cGljX2FsYXJtczsKKworCXU2NCBmbHNoX2ludF9yZWc7CisJdTY0IGZsc2hfaW50X21hc2s7CisjZGVmaW5lIFBJQ19GTFNIX0lOVF9SRUdfQ1lDTEVfRlNNX0VSUiAgICAgICAgIEJJVCg2MykKKyNkZWZpbmUgUElDX0ZMU0hfSU5UX1JFR19FUlIgICAgICAgICAgICAgICAgICAgQklUKDYyKQorCXU2NCBmbGFzaF9hbGFybXM7CisKKwl1NjQgbWRpb19pbnRfcmVnOworCXU2NCBtZGlvX2ludF9tYXNrOworI2RlZmluZSBNRElPX0lOVF9SRUdfTURJT19CVVNfRVJSICAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgTURJT19JTlRfUkVHX0RUWF9CVVNfRVJSICAgICAgICAgICAgICAgQklUKDgpCisjZGVmaW5lIE1ESU9fSU5UX1JFR19MQVNJICAgICAgICAgICAgICAgICAgICAgIEJJVCgzOSkKKwl1NjQgbWRpb19hbGFybXM7CisKKwl1NjQgaWljX2ludF9yZWc7CisJdTY0IGlpY19pbnRfbWFzazsKKyNkZWZpbmUgSUlDX0lOVF9SRUdfQlVTX0ZTTV9FUlIgICAgICAgICAgICAgICAgQklUKDQpCisjZGVmaW5lIElJQ19JTlRfUkVHX0JJVF9GU01fRVJSICAgICAgICAgICAgICAgIEJJVCg1KQorI2RlZmluZSBJSUNfSU5UX1JFR19DWUNMRV9GU01fRVJSICAgICAgICAgICAgICBCSVQoNikKKyNkZWZpbmUgSUlDX0lOVF9SRUdfUkVRX0ZTTV9FUlIgICAgICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIElJQ19JTlRfUkVHX0FDS19FUlIgICAgICAgICAgICAgICAgICAgIEJJVCg4KQorCXU2NCBpaWNfYWxhcm1zOworCisJdTggdW51c2VkNFsweDA4XTsKKworCXU2NCBncGlvX2ludF9yZWc7CisJdTY0IGdwaW9faW50X21hc2s7CisJdTY0IGdwaW9fYWxhcm1zOworCisJdTggdW51c2VkNVsweDM4XTsKKworCXU2NCB0eF90cmFmZmljX2ludDsKKyNkZWZpbmUgVFhfVFJBRkZJQ19JTlRfbihuKSAgICAgICAgICAgICAgICAgICAgQklUKG4pCisJdTY0IHR4X3RyYWZmaWNfbWFzazsKKworCXU2NCByeF90cmFmZmljX2ludDsKKyNkZWZpbmUgUlhfVFJBRkZJQ19JTlRfbihuKSAgICAgICAgICAgICAgICAgICAgQklUKG4pCisJdTY0IHJ4X3RyYWZmaWNfbWFzazsKKworLyogUElDIENvbnRyb2wgcmVnaXN0ZXJzICovCisJdTY0IHBpY19jb250cm9sOworI2RlZmluZSBQSUNfQ05UTF9SWF9BTEFSTV9NQVBfMSAgICAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgUElDX0NOVExfU0hBUkVEX1NQTElUUyhuKSAgICAgICAgICAgICAgdkJJVChuLDExLDQpCisKKwl1NjQgc3dhcHBlcl9jdHJsOworI2RlZmluZSBTV0FQUEVSX0NUUkxfUElGX1JfRkUgICAgICAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1BJRl9SX1NFICAgICAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9QSUZfV19GRSAgICAgICAgICAgICAgICAgIEJJVCg4KQorI2RlZmluZSBTV0FQUEVSX0NUUkxfUElGX1dfU0UgICAgICAgICAgICAgICAgICBCSVQoOSkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1RYUF9GRSAgICAgICAgICAgICAgICAgICAgQklUKDE2KQorI2RlZmluZSBTV0FQUEVSX0NUUkxfVFhQX1NFICAgICAgICAgICAgICAgICAgICBCSVQoMTcpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9UWERfUl9GRSAgICAgICAgICAgICAgICAgIEJJVCgxOCkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1RYRF9SX1NFICAgICAgICAgICAgICAgICAgQklUKDE5KQorI2RlZmluZSBTV0FQUEVSX0NUUkxfVFhEX1dfRkUgICAgICAgICAgICAgICAgICBCSVQoMjApCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9UWERfV19TRSAgICAgICAgICAgICAgICAgIEJJVCgyMSkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1RYRl9SX0ZFICAgICAgICAgICAgICAgICAgQklUKDIyKQorI2RlZmluZSBTV0FQUEVSX0NUUkxfVFhGX1JfU0UgICAgICAgICAgICAgICAgICBCSVQoMjMpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9SWERfUl9GRSAgICAgICAgICAgICAgICAgIEJJVCgzMikKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1JYRF9SX1NFICAgICAgICAgICAgICAgICAgQklUKDMzKQorI2RlZmluZSBTV0FQUEVSX0NUUkxfUlhEX1dfRkUgICAgICAgICAgICAgICAgICBCSVQoMzQpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9SWERfV19TRSAgICAgICAgICAgICAgICAgIEJJVCgzNSkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1JYRl9XX0ZFICAgICAgICAgICAgICAgICAgQklUKDM2KQorI2RlZmluZSBTV0FQUEVSX0NUUkxfUlhGX1dfU0UgICAgICAgICAgICAgICAgICBCSVQoMzcpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9YTVNJX0ZFICAgICAgICAgICAgICAgICAgIEJJVCg0MCkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1hNU0lfU0UgICAgICAgICAgICAgICAgICAgQklUKDQxKQorI2RlZmluZSBTV0FQUEVSX0NUUkxfU1RBVFNfRkUgICAgICAgICAgICAgICAgICBCSVQoNDgpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9TVEFUU19TRSAgICAgICAgICAgICAgICAgIEJJVCg0OSkKKworCXU2NCBwaWZfcmRfc3dhcHBlcl9mYjsKKyNkZWZpbmUgSUZfUkRfU1dBUFBFUl9GQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjM0NTY3ODlBQkNERUYKKworCXU2NCBzY2hlZHVsZWRfaW50X2N0cmw7CisjZGVmaW5lIFNDSEVEX0lOVF9DVFJMX1RJTUVSX0VOICAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBTQ0hFRF9JTlRfQ1RSTF9PTkVfU0hPVCAgICAgICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgU0NIRURfSU5UX0NUUkxfSU5UMk1TSSAgICAgICAgICAgICAgICAgVEJECisjZGVmaW5lIFNDSEVEX0lOVF9QRVJJT0QgICAgICAgICAgICAgICAgICAgICAgIFRCRAorCisJdTY0IHR4cmVxdGltZW91dDsKKyNkZWZpbmUgVFhSRVFUT19WQUwodmFsKQkJCQkJCXZCSVQodmFsLDAsMzIpCisjZGVmaW5lIFRYUkVRVE9fRU4JCQkJCQkJCUJJVCg2MykKKworCXU2NCBzdGF0c3JlcXRpbWVvdXQ7CisjZGVmaW5lIFNUQVRSRVFUT19WQUwobikgICAgICAgICAgICAgICAgICAgICAgIFRCRAorI2RlZmluZSBTVEFUUkVRVE9fRU4gICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoNjMpCisKKwl1NjQgcmVhZF9yZXRyeV9kZWxheTsKKwl1NjQgcmVhZF9yZXRyeV9hY2NlbGVyYXRpb247CisJdTY0IHdyaXRlX3JldHJ5X2RlbGF5OworCXU2NCB3cml0ZV9yZXRyeV9hY2NlbGVyYXRpb247CisKKwl1NjQgeG1zaV9jb250cm9sOworCXU2NCB4bXNpX2FjY2VzczsKKwl1NjQgeG1zaV9hZGRyZXNzOworCXU2NCB4bXNpX2RhdGE7CisKKwl1NjQgcnhfbWF0OworCisJdTggdW51c2VkNlsweDhdOworCisJdTY0IHR4X21hdDBfNzsKKwl1NjQgdHhfbWF0OF8xNTsKKwl1NjQgdHhfbWF0MTZfMjM7CisJdTY0IHR4X21hdDI0XzMxOworCXU2NCB0eF9tYXQzMl8zOTsKKwl1NjQgdHhfbWF0NDBfNDc7CisJdTY0IHR4X21hdDQ4XzU1OworCXU2NCB0eF9tYXQ1Nl82MzsKKworCXU4IHVudXNlZF8xWzB4MTBdOworCisJLyogQXV0b21hdGVkIHN0YXRpc3RpY3MgY29sbGVjdGlvbiAqLworCXU2NCBzdGF0X2NmZzsKKyNkZWZpbmUgU1RBVF9DRkdfU1RBVF9FTiAgICAgICAgICAgQklUKDApCisjZGVmaW5lIFNUQVRfQ0ZHX09ORV9TSE9UX0VOICAgICAgIEJJVCgxKQorI2RlZmluZSBTVEFUX0NGR19TVEFUX05TX0VOICAgICAgICBCSVQoOCkKKyNkZWZpbmUgU1RBVF9DRkdfU1RBVF9STyAgICAgICAgICAgQklUKDkpCisjZGVmaW5lIFNUQVRfVFJTRl9QRVIobikgICAgICAgICAgIFRCRAorI2RlZmluZQlQRVJfU0VDCQkJCQkgICAweDIwOGQ1CisjZGVmaW5lCVNFVF9VUERUX1BFUklPRChuKQkJICAgdkJJVCgoUEVSX1NFQypuKSwzMiwzMikKKworCXU2NCBzdGF0X2FkZHI7CisKKwkvKiBHZW5lcmFsIENvbmZpZ3VyYXRpb24gKi8KKwl1NjQgbWRpb19jb250cm9sOworCisJdTY0IGR0eF9jb250cm9sOworCisJdTY0IGkyY19jb250cm9sOworI2RlZmluZQlJMkNfQ09OVFJPTF9ERVZfSUQoaWQpCQl2QklUKGlkLDEsMykKKyNkZWZpbmUJSTJDX0NPTlRST0xfQUREUihhZGRyKQkJdkJJVChhZGRyLDUsMTEpCisjZGVmaW5lCUkyQ19DT05UUk9MX0JZVEVfQ05UKGNudCkJdkJJVChjbnQsMjIsMikKKyNkZWZpbmUJSTJDX0NPTlRST0xfUkVBRAkJCUJJVCgyNCkKKyNkZWZpbmUJSTJDX0NPTlRST0xfTkFDSwkJCUJJVCgyNSkKKyNkZWZpbmUJSTJDX0NPTlRST0xfQ05UTF9TVEFSVAkJdkJJVCgweEUsMjgsNCkKKyNkZWZpbmUJSTJDX0NPTlRST0xfQ05UTF9FTkQodmFsKQkodmFsICYgdkJJVCgweDEsMjgsNCkpCisjZGVmaW5lCUkyQ19DT05UUk9MX0dFVF9EQVRBKHZhbCkJKHUzMikodmFsICYgMHhGRkZGRkZGRikKKyNkZWZpbmUJSTJDX0NPTlRST0xfU0VUX0RBVEEodmFsKQl2QklUKHZhbCwzMiwzMikKKworCXU2NCBncGlvX2NvbnRyb2w7CisjZGVmaW5lIEdQSU9fQ1RSTF9HUElPXzAJCUJJVCg4KQorCisJdTggdW51c2VkN1sweDYwMF07CisKKy8qIFR4RE1BIHJlZ2lzdGVycyAqLworCXU2NCB0eGRtYV9pbnRfc3RhdHVzOworCXU2NCB0eGRtYV9pbnRfbWFzazsKKyNkZWZpbmUgVFhETUFfUEZDX0lOVCAgICAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBUWERNQV9UREFfSU5UICAgICAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFRYRE1BX1BDQ19JTlQgICAgICAgICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgVFhETUFfVFRJX0lOVCAgICAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBUWERNQV9MU09fSU5UICAgICAgICAgICAgICAgICAgQklUKDQpCisjZGVmaW5lIFRYRE1BX1RQQV9JTlQgICAgICAgICAgICAgICAgICBCSVQoNSkKKyNkZWZpbmUgVFhETUFfU01fSU5UICAgICAgICAgICAgICAgICAgIEJJVCg2KQorCXU2NCBwZmNfZXJyX3JlZzsKKwl1NjQgcGZjX2Vycl9tYXNrOworCXU2NCBwZmNfZXJyX2FsYXJtOworCisJdTY0IHRkYV9lcnJfcmVnOworCXU2NCB0ZGFfZXJyX21hc2s7CisJdTY0IHRkYV9lcnJfYWxhcm07CisKKwl1NjQgcGNjX2Vycl9yZWc7CisjZGVmaW5lIFBDQ19GQl9FQ0NfREJfRVJSCQl2QklUKDB4RkYsIDE2LCA4KQorCisJdTY0IHBjY19lcnJfbWFzazsKKwl1NjQgcGNjX2Vycl9hbGFybTsKKworCXU2NCB0dGlfZXJyX3JlZzsKKwl1NjQgdHRpX2Vycl9tYXNrOworCXU2NCB0dGlfZXJyX2FsYXJtOworCisJdTY0IGxzb19lcnJfcmVnOworCXU2NCBsc29fZXJyX21hc2s7CisJdTY0IGxzb19lcnJfYWxhcm07CisKKwl1NjQgdHBhX2Vycl9yZWc7CisJdTY0IHRwYV9lcnJfbWFzazsKKwl1NjQgdHBhX2Vycl9hbGFybTsKKworCXU2NCBzbV9lcnJfcmVnOworCXU2NCBzbV9lcnJfbWFzazsKKwl1NjQgc21fZXJyX2FsYXJtOworCisJdTggdW51c2VkOFsweDEwMCAtIDB4QjhdOworCisvKiBUeERNQSBhcmJpdGVyICovCisJdTY0IHR4X2RtYV93cmFwX3N0YXQ7CisKKy8qIFR4IEZJRk8gY29udHJvbGxlciAqLworI2RlZmluZSBYX01BWF9GSUZPUyAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWF9GSUZPX01BWF9MRU4gICAgICAgICAgICAgICAgICAgICAweDFGRkYJLyo4MTkxICovCisJdTY0IHR4X2ZpZm9fcGFydGl0aW9uXzA7CisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX0VOICAgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzBfUFJJKHZhbCkgICAgICAgdkJJVCh2YWwsNSwzKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl8wX0xFTih2YWwpICAgICAgIHZCSVQodmFsLDE5LDEzKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl8xX1BSSSh2YWwpICAgICAgIHZCSVQodmFsLDM3LDMpCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzFfTEVOKHZhbCkgICAgICAgdkJJVCh2YWwsNTEsMTMgICkKKworCXU2NCB0eF9maWZvX3BhcnRpdGlvbl8xOworI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl8yX1BSSSh2YWwpICAgICAgIHZCSVQodmFsLDUsMykKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fMl9MRU4odmFsKSAgICAgICB2QklUKHZhbCwxOSwxMykKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fM19QUkkodmFsKSAgICAgICB2QklUKHZhbCwzNywzKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl8zX0xFTih2YWwpICAgICAgIHZCSVQodmFsLDUxLDEzKQorCisJdTY0IHR4X2ZpZm9fcGFydGl0aW9uXzI7CisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzRfUFJJKHZhbCkgICAgICAgdkJJVCh2YWwsNSwzKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl80X0xFTih2YWwpICAgICAgIHZCSVQodmFsLDE5LDEzKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl81X1BSSSh2YWwpICAgICAgIHZCSVQodmFsLDM3LDMpCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzVfTEVOKHZhbCkgICAgICAgdkJJVCh2YWwsNTEsMTMpCisKKwl1NjQgdHhfZmlmb19wYXJ0aXRpb25fMzsKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fNl9QUkkodmFsKSAgICAgICB2QklUKHZhbCw1LDMpCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzZfTEVOKHZhbCkgICAgICAgdkJJVCh2YWwsMTksMTMpCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzdfUFJJKHZhbCkgICAgICAgdkJJVCh2YWwsMzcsMykKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fN19MRU4odmFsKSAgICAgICB2QklUKHZhbCw1MSwxMykKKworI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl9QUklfMCAgICAgICAgICAgICAgICAgMAkvKiBoaWdoZXN0ICovCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX1BSSV8xICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX1BSSV8yICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX1BSSV8zICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX1BSSV80ICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX1BSSV81ICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX1BSSV82ICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX1BSSV83ICAgICAgICAgICAgICAgICA3CS8qIGxvd2VzdCAqLworCisJdTY0IHR4X3dfcm91bmRfcm9iaW5fMDsKKwl1NjQgdHhfd19yb3VuZF9yb2Jpbl8xOworCXU2NCB0eF93X3JvdW5kX3JvYmluXzI7CisJdTY0IHR4X3dfcm91bmRfcm9iaW5fMzsKKwl1NjQgdHhfd19yb3VuZF9yb2Jpbl80OworCisJdTY0IHR0aV9jb21tYW5kX21lbTsKKyNkZWZpbmUgVFRJX0NNRF9NRU1fV0UgICAgICAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgVFRJX0NNRF9NRU1fU1RST0JFX05FV19DTUQgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIFRUSV9DTURfTUVNX1NUUk9CRV9CRUlOR19FWEVDVVRFRCAgQklUKDE1KQorI2RlZmluZSBUVElfQ01EX01FTV9PRkZTRVQobikgICAgICAgICAgICAgIHZCSVQobiwyNiw2KQorCisJdTY0IHR0aV9kYXRhMV9tZW07CisjZGVmaW5lIFRUSV9EQVRBMV9NRU1fVFhfVElNRVJfVkFMKG4pICAgICAgdkJJVChuLDYsMjYpCisjZGVmaW5lIFRUSV9EQVRBMV9NRU1fVFhfVElNRVJfQUNfQ0kobikgICAgdkJJVChuLDM4LDIpCisjZGVmaW5lIFRUSV9EQVRBMV9NRU1fVFhfVElNRVJfQUNfRU4gICAgICAgQklUKDM4KQorI2RlZmluZSBUVElfREFUQTFfTUVNX1RYX1RJTUVSX0NJX0VOICAgICAgIEJJVCgzOSkKKyNkZWZpbmUgVFRJX0RBVEExX01FTV9UWF9VUk5HX0EobikgICAgICAgICB2QklUKG4sNDEsNykKKyNkZWZpbmUgVFRJX0RBVEExX01FTV9UWF9VUk5HX0IobikgICAgICAgICB2QklUKG4sNDksNykKKyNkZWZpbmUgVFRJX0RBVEExX01FTV9UWF9VUk5HX0MobikgICAgICAgICB2QklUKG4sNTcsNykKKworCXU2NCB0dGlfZGF0YTJfbWVtOworI2RlZmluZSBUVElfREFUQTJfTUVNX1RYX1VGQ19BKG4pICAgICAgICAgIHZCSVQobiwwLDE2KQorI2RlZmluZSBUVElfREFUQTJfTUVNX1RYX1VGQ19CKG4pICAgICAgICAgIHZCSVQobiwxNiwxNikKKyNkZWZpbmUgVFRJX0RBVEEyX01FTV9UWF9VRkNfQyhuKSAgICAgICAgICB2QklUKG4sMzIsMTYpCisjZGVmaW5lIFRUSV9EQVRBMl9NRU1fVFhfVUZDX0QobikgICAgICAgICAgdkJJVChuLDQ4LDE2KQorCisvKiBUeCBQcm90b2NvbCBhc3Npc3QgKi8KKwl1NjQgdHhfcGFfY2ZnOworI2RlZmluZSBUWF9QQV9DRkdfSUdOT1JFX0ZSTV9FUlIgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBUWF9QQV9DRkdfSUdOT1JFX1NOQVBfT1VJICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBUWF9QQV9DRkdfSUdOT1JFX0xMQ19DVFJMICAgICAgICAgIEJJVCgzKQorI2RlZmluZQlUWF9QQV9DRkdfSUdOT1JFX0wyX0VSUgkJCSAgIEJJVCg2KQorCisvKiBSZWNlbnQgYWRkLCB1c2VkIG9ubHkgZGVidWcgcHVycG9zZXMuICovCisJdTY0IHBjY19lbmFibGU7CisKKwl1OCB1bnVzZWQ5WzB4NzAwIC0gMHgxNzhdOworCisJdTY0IHR4ZG1hX2RlYnVnX2N0cmw7CisKKwl1OCB1bnVzZWQxMFsweDE4MDAgLSAweDE3MDhdOworCisvKiBSeERNQSBSZWdpc3RlcnMgKi8KKwl1NjQgcnhkbWFfaW50X3N0YXR1czsKKwl1NjQgcnhkbWFfaW50X21hc2s7CisjZGVmaW5lIFJYRE1BX0lOVF9SQ19JTlRfTSAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgUlhETUFfSU5UX1JQQV9JTlRfTSAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBSWERNQV9JTlRfUkRBX0lOVF9NICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIFJYRE1BX0lOVF9SVElfSU5UX00gICAgICAgICAgICBCSVQoMykKKworCXU2NCByZGFfZXJyX3JlZzsKKwl1NjQgcmRhX2Vycl9tYXNrOworCXU2NCByZGFfZXJyX2FsYXJtOworCisJdTY0IHJjX2Vycl9yZWc7CisJdTY0IHJjX2Vycl9tYXNrOworCXU2NCByY19lcnJfYWxhcm07CisKKwl1NjQgcHJjX3BjaXhfZXJyX3JlZzsKKwl1NjQgcHJjX3BjaXhfZXJyX21hc2s7CisJdTY0IHByY19wY2l4X2Vycl9hbGFybTsKKworCXU2NCBycGFfZXJyX3JlZzsKKwl1NjQgcnBhX2Vycl9tYXNrOworCXU2NCBycGFfZXJyX2FsYXJtOworCisJdTY0IHJ0aV9lcnJfcmVnOworCXU2NCBydGlfZXJyX21hc2s7CisJdTY0IHJ0aV9lcnJfYWxhcm07CisKKwl1OCB1bnVzZWQxMVsweDEwMCAtIDB4ODhdOworCisvKiBETUEgYXJiaXRlciAqLworCXU2NCByeF9xdWV1ZV9wcmlvcml0eTsKKyNkZWZpbmUgUlhfUVVFVUVfMF9QUklPUklUWSh2YWwpICAgICAgIHZCSVQodmFsLDUsMykKKyNkZWZpbmUgUlhfUVVFVUVfMV9QUklPUklUWSh2YWwpICAgICAgIHZCSVQodmFsLDEzLDMpCisjZGVmaW5lIFJYX1FVRVVFXzJfUFJJT1JJVFkodmFsKSAgICAgICB2QklUKHZhbCwyMSwzKQorI2RlZmluZSBSWF9RVUVVRV8zX1BSSU9SSVRZKHZhbCkgICAgICAgdkJJVCh2YWwsMjksMykKKyNkZWZpbmUgUlhfUVVFVUVfNF9QUklPUklUWSh2YWwpICAgICAgIHZCSVQodmFsLDM3LDMpCisjZGVmaW5lIFJYX1FVRVVFXzVfUFJJT1JJVFkodmFsKSAgICAgICB2QklUKHZhbCw0NSwzKQorI2RlZmluZSBSWF9RVUVVRV82X1BSSU9SSVRZKHZhbCkgICAgICAgdkJJVCh2YWwsNTMsMykKKyNkZWZpbmUgUlhfUVVFVUVfN19QUklPUklUWSh2YWwpICAgICAgIHZCSVQodmFsLDYxLDMpCisKKyNkZWZpbmUgUlhfUVVFVUVfUFJJXzAgICAgICAgICAgICAgICAgIDAJLyogaGlnaGVzdCAqLworI2RlZmluZSBSWF9RVUVVRV9QUklfMSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSWF9RVUVVRV9QUklfMiAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBSWF9RVUVVRV9QUklfMyAgICAgICAgICAgICAgICAgMworI2RlZmluZSBSWF9RVUVVRV9QUklfNCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBSWF9RVUVVRV9QUklfNSAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBSWF9RVUVVRV9QUklfNiAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBSWF9RVUVVRV9QUklfNyAgICAgICAgICAgICAgICAgNwkvKiBsb3dlc3QgKi8KKworCXU2NCByeF93X3JvdW5kX3JvYmluXzA7CisJdTY0IHJ4X3dfcm91bmRfcm9iaW5fMTsKKwl1NjQgcnhfd19yb3VuZF9yb2Jpbl8yOworCXU2NCByeF93X3JvdW5kX3JvYmluXzM7CisJdTY0IHJ4X3dfcm91bmRfcm9iaW5fNDsKKworCS8qIFBlci1yaW5nIGNvbnRyb2xsZXIgcmVncyAqLworI2RlZmluZSBSWF9NQVhfUklOR1MgICAgICAgICAgICAgICAgOAorI2lmIDAKKyNkZWZpbmUgUlhfTUFYX1JJTkdTX1NaICAgICAgICAgICAgIDB4RkZGRgkvKiA2NTUzNiAqLworI2RlZmluZSBSWF9NSU5fUklOR1NfU1ogICAgICAgICAgICAgMHgzRgkvKiA2MyAqLworI2VuZGlmCisJdTY0IHByY19yeGQwX25bUlhfTUFYX1JJTkdTXTsKKwl1NjQgcHJjX2N0cmxfbltSWF9NQVhfUklOR1NdOworI2RlZmluZSBQUkNfQ1RSTF9SQ19FTkFCTEVEICAgICAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgUFJDX0NUUkxfUklOR19NT0RFICAgICAgICAgICAgICAgICAgICAgKEJJVCgxNCl8QklUKDE1KSkKKyNkZWZpbmUgUFJDX0NUUkxfUklOR19NT0RFXzEgICAgICAgICAgICAgICAgICAgdkJJVCgwLDE0LDIpCisjZGVmaW5lIFBSQ19DVFJMX1JJTkdfTU9ERV8zICAgICAgICAgICAgICAgICAgIHZCSVQoMSwxNCwyKQorI2RlZmluZSBQUkNfQ1RSTF9SSU5HX01PREVfNSAgICAgICAgICAgICAgICAgICB2QklUKDIsMTQsMikKKyNkZWZpbmUgUFJDX0NUUkxfUklOR19NT0RFX3ggICAgICAgICAgICAgICAgICAgdkJJVCgzLDE0LDIpCisjZGVmaW5lIFBSQ19DVFJMX05PX1NOT09QICAgICAgICAgICAgICAgICAgICAgIChCSVQoMjIpfEJJVCgyMykpCisjZGVmaW5lIFBSQ19DVFJMX05PX1NOT09QX0RFU0MgICAgICAgICAgICAgICAgIEJJVCgyMikKKyNkZWZpbmUgUFJDX0NUUkxfTk9fU05PT1BfQlVGRiAgICAgICAgICAgICAgICAgQklUKDIzKQorI2RlZmluZSBQUkNfQ1RSTF9SWERfQkFDS09GRl9JTlRFUlZBTCh2YWwpICAgICB2QklUKHZhbCw0MCwyNCkKKworCXU2NCBwcmNfYWxhcm1fYWN0aW9uOworI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JSX1IwX1NUT1AgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SV19SMF9TVE9QICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUlJfUjFfU1RPUCAgICAgICAgICAgIEJJVCgxMSkKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SV19SMV9TVE9QICAgICAgICAgICAgQklUKDE1KQorI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JSX1IyX1NUT1AgICAgICAgICAgICBCSVQoMTkpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUldfUjJfU1RPUCAgICAgICAgICAgIEJJVCgyMykKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SUl9SM19TVE9QICAgICAgICAgICAgQklUKDI3KQorI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JXX1IzX1NUT1AgICAgICAgICAgICBCSVQoMzEpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUlJfUjRfU1RPUCAgICAgICAgICAgIEJJVCgzNSkKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SV19SNF9TVE9QICAgICAgICAgICAgQklUKDM5KQorI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JSX1I1X1NUT1AgICAgICAgICAgICBCSVQoNDMpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUldfUjVfU1RPUCAgICAgICAgICAgIEJJVCg0NykKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SUl9SNl9TVE9QICAgICAgICAgICAgQklUKDUxKQorI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JXX1I2X1NUT1AgICAgICAgICAgICBCSVQoNTUpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUlJfUjdfU1RPUCAgICAgICAgICAgIEJJVCg1OSkKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SV19SN19TVE9QICAgICAgICAgICAgQklUKDYzKQorCisvKiBSZWNlaXZlIHRyYWZmaWMgaW50ZXJydXB0cyAqLworCXU2NCBydGlfY29tbWFuZF9tZW07CisjZGVmaW5lIFJUSV9DTURfTUVNX1dFICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgUlRJX0NNRF9NRU1fU1RST0JFICAgICAgICAgICAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgUlRJX0NNRF9NRU1fU1RST0JFX05FV19DTUQgICAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgUlRJX0NNRF9NRU1fU1RST0JFX0NNRF9CRUlOR19FWEVDVVRFRCAgIEJJVCgxNSkKKyNkZWZpbmUgUlRJX0NNRF9NRU1fT0ZGU0VUKG4pICAgICAgICAgICAgICAgICAgIHZCSVQobiwyOSwzKQorCisJdTY0IHJ0aV9kYXRhMV9tZW07CisjZGVmaW5lIFJUSV9EQVRBMV9NRU1fUlhfVElNRVJfVkFMKG4pICAgICAgdkJJVChuLDMsMjkpCisjZGVmaW5lIFJUSV9EQVRBMV9NRU1fUlhfVElNRVJfQUNfRU4gICAgICAgQklUKDM4KQorI2RlZmluZSBSVElfREFUQTFfTUVNX1JYX1RJTUVSX0NJX0VOICAgICAgIEJJVCgzOSkKKyNkZWZpbmUgUlRJX0RBVEExX01FTV9SWF9VUk5HX0EobikgICAgICAgICB2QklUKG4sNDEsNykKKyNkZWZpbmUgUlRJX0RBVEExX01FTV9SWF9VUk5HX0IobikgICAgICAgICB2QklUKG4sNDksNykKKyNkZWZpbmUgUlRJX0RBVEExX01FTV9SWF9VUk5HX0MobikgICAgICAgICB2QklUKG4sNTcsNykKKworCXU2NCBydGlfZGF0YTJfbWVtOworI2RlZmluZSBSVElfREFUQTJfTUVNX1JYX1VGQ19BKG4pICAgICAgICAgIHZCSVQobiwwLDE2KQorI2RlZmluZSBSVElfREFUQTJfTUVNX1JYX1VGQ19CKG4pICAgICAgICAgIHZCSVQobiwxNiwxNikKKyNkZWZpbmUgUlRJX0RBVEEyX01FTV9SWF9VRkNfQyhuKSAgICAgICAgICB2QklUKG4sMzIsMTYpCisjZGVmaW5lIFJUSV9EQVRBMl9NRU1fUlhfVUZDX0QobikgICAgICAgICAgdkJJVChuLDQ4LDE2KQorCisJdTY0IHJ4X3BhX2NmZzsKKyNkZWZpbmUgUlhfUEFfQ0ZHX0lHTk9SRV9GUk1fRVJSICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgUlhfUEFfQ0ZHX0lHTk9SRV9TTkFQX09VSSAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgUlhfUEFfQ0ZHX0lHTk9SRV9MTENfQ1RSTCAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgUlhfUEFfQ0ZHX0lHTk9SRV9MMl9FUlIgICAgICAgICAgICBCSVQoNikKKworCXU4IHVudXNlZDEyWzB4NzAwIC0gMHgxRDhdOworCisJdTY0IHJ4ZG1hX2RlYnVnX2N0cmw7CisKKwl1OCB1bnVzZWQxM1sweDIwMDAgLSAweDFmMDhdOworCisvKiBNZWRpYSBBY2Nlc3MgQ29udHJvbGxlciBSZWdpc3RlciAqLworCXU2NCBtYWNfaW50X3N0YXR1czsKKwl1NjQgbWFjX2ludF9tYXNrOworI2RlZmluZSBNQUNfSU5UX1NUQVRVU19UTUFDX0lOVCAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBNQUNfSU5UX1NUQVRVU19STUFDX0lOVCAgICAgICAgICAgIEJJVCgxKQorCisJdTY0IG1hY190bWFjX2Vycl9yZWc7CisjZGVmaW5lIFRNQUNfRVJSX1JFR19UTUFDX0VDQ19EQl9FUlIgICAgICAgQklUKDE1KQorI2RlZmluZSBUTUFDX0VSUl9SRUdfVE1BQ19UWF9CVUZfT1ZSTiAgICAgIEJJVCgyMykKKyNkZWZpbmUgVE1BQ19FUlJfUkVHX1RNQUNfVFhfQ1JJX0VSUiAgICAgICBCSVQoMzEpCisJdTY0IG1hY190bWFjX2Vycl9tYXNrOworCXU2NCBtYWNfdG1hY19lcnJfYWxhcm07CisKKwl1NjQgbWFjX3JtYWNfZXJyX3JlZzsKKyNkZWZpbmUgUk1BQ19FUlJfUkVHX1JYX0JVRkZfT1ZSTiAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgUk1BQ19FUlJfUkVHX1JUU19FQ0NfREJfRVJSICAgICAgICBCSVQoMTQpCisjZGVmaW5lIFJNQUNfRVJSX1JFR19FQ0NfREJfRVJSICAgICAgICAgICAgQklUKDE1KQorI2RlZmluZSBSTUFDX0xJTktfU1RBVEVfQ0hBTkdFX0lOVCAgICAgICAgIEJJVCgzMSkKKwl1NjQgbWFjX3JtYWNfZXJyX21hc2s7CisJdTY0IG1hY19ybWFjX2Vycl9hbGFybTsKKworCXU4IHVudXNlZDE0WzB4MTAwIC0gMHg0MF07CisKKwl1NjQgbWFjX2NmZzsKKyNkZWZpbmUgTUFDX0NGR19UTUFDX0VOQUJMRSAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgTUFDX0NGR19STUFDX0VOQUJMRSAgICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgTUFDX0NGR19MQU5fTk9UX1dBTiAgICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgTUFDX0NGR19UTUFDX0xPT1BCQUNLICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgTUFDX0NGR19UTUFDX0FQUEVORF9QQUQgICAgICAgICBCSVQoNCkKKyNkZWZpbmUgTUFDX0NGR19STUFDX1NUUklQX0ZDUyAgICAgICAgICBCSVQoNSkKKyNkZWZpbmUgTUFDX0NGR19STUFDX1NUUklQX1BBRCAgICAgICAgICBCSVQoNikKKyNkZWZpbmUgTUFDX0NGR19STUFDX1BST01fRU5BQkxFICAgICAgICBCSVQoNykKKyNkZWZpbmUgTUFDX1JNQUNfRElTQ0FSRF9QRlJNICAgICAgICAgICBCSVQoOCkKKyNkZWZpbmUgTUFDX1JNQUNfQkNBU1RfRU5BQkxFICAgICAgICAgICBCSVQoOSkKKyNkZWZpbmUgTUFDX1JNQUNfQUxMX0FERFJfRU5BQkxFICAgICAgICBCSVQoMTApCisjZGVmaW5lIE1BQ19STUFDX0lOVkxEX0lQR19USFIodmFsKSAgICAgdkJJVCh2YWwsMTYsOCkKKworCXU2NCB0bWFjX2F2Z19pcGc7CisjZGVmaW5lIFRNQUNfQVZHX0lQRyh2YWwpICAgICAgICAgICB2QklUKHZhbCwwLDgpCisKKwl1NjQgcm1hY19tYXhfcHlsZF9sZW47CisjZGVmaW5lIFJNQUNfTUFYX1BZTERfTEVOKHZhbCkgICAgICB2QklUKHZhbCwyLDE0KQorI2RlZmluZSBSTUFDX01BWF9QWUxEX0xFTl9ERUYgICAgICAgdkJJVCgxNTAwLDIsMTQpCisjZGVmaW5lIFJNQUNfTUFYX1BZTERfTEVOX0pVTUJPX0RFRiB2QklUKDk2MDAsMiwxNCkKKworCXU2NCBybWFjX2Vycl9jZmc7CisjZGVmaW5lIFJNQUNfRVJSX0ZDUyAgICAgICAgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIFJNQUNfRVJSX0ZDU19BQ0NFUFQgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFJNQUNfRVJSX1RPT19MT05HICAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFJNQUNfRVJSX1RPT19MT05HX0FDQ0VQVCAgICAgICAgQklUKDEpCisjZGVmaW5lIFJNQUNfRVJSX1JVTlQgICAgICAgICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIFJNQUNfRVJSX1JVTlRfQUNDRVBUICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIFJNQUNfRVJSX0xFTl9NSVNNQVRDSCAgICAgICAgICAgQklUKDMpCisjZGVmaW5lIFJNQUNfRVJSX0xFTl9NSVNNQVRDSF9BQ0NFUFQgICAgQklUKDMpCisKKwl1NjQgcm1hY19jZmdfa2V5OworI2RlZmluZSBSTUFDX0NGR19LRVkodmFsKSAgICAgICAgICAgICAgIHZCSVQodmFsLDAsMTYpCisKKyNkZWZpbmUgTUFYX01BQ19BRERSRVNTRVMgICAgICAgICAgIDE2CisjZGVmaW5lIE1BWF9NQ19BRERSRVNTRVMgICAgICAgICAgICAzMgkvKiBNdWx0aWNhc3QgYWRkcmVzc2VzICovCisjZGVmaW5lIE1BQ19NQUNfQUREUl9TVEFSVF9PRkZTRVQgICAwCisjZGVmaW5lIE1BQ19NQ19BRERSX1NUQVJUX09GRlNFVCAgICAxNgorI2RlZmluZSBNQUNfTUNfQUxMX01DX0FERFJfT0ZGU0VUICAgNjMJLyogZW5hYmxlcyBhbGwgbXVsdGljYXN0IHBrdHMgKi8KKwl1NjQgcm1hY19hZGRyX2NtZF9tZW07CisjZGVmaW5lIFJNQUNfQUREUl9DTURfTUVNX1dFICAgICAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgUk1BQ19BRERSX0NNRF9NRU1fUkQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUk1BQ19BRERSX0NNRF9NRU1fU1RST0JFX05FV19DTUQgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgUk1BQ19BRERSX0NNRF9NRU1fU1RST0JFX0NNRF9FWEVDVVRJTkcgIEJJVCgxNSkKKyNkZWZpbmUgUk1BQ19BRERSX0NNRF9NRU1fT0ZGU0VUKG4pICAgICAgICAgICAgIHZCSVQobiwyNiw2KQorCisJdTY0IHJtYWNfYWRkcl9kYXRhMF9tZW07CisjZGVmaW5lIFJNQUNfQUREUl9EQVRBMF9NRU1fQUREUihuKSAgICB2QklUKG4sMCw0OCkKKyNkZWZpbmUgUk1BQ19BRERSX0RBVEEwX01FTV9VU0VSICAgICAgIEJJVCg0OCkKKworCXU2NCBybWFjX2FkZHJfZGF0YTFfbWVtOworI2RlZmluZSBSTUFDX0FERFJfREFUQTFfTUVNX01BU0sobikgICAgdkJJVChuLDAsNDgpCisKKwl1OCB1bnVzZWQxNVsweDhdOworCisvKgorICAgICAgICB1NjQgcm1hY19hZGRyX2NmZzsKKyNkZWZpbmUgUk1BQ19BRERSX1VDQVNUbl9FTihuKSAgICAgbUJJVCgwKV9uKG4pCisjZGVmaW5lIFJNQUNfQUREUl9NQ0FTVG5fRU4obikgICAgIG1CSVQoMClfbihuKQorI2RlZmluZSBSTUFDX0FERFJfQkNBU1RfRU4gICAgICAgICB2QklUKDApXzQ4IAorI2RlZmluZSBSTUFDX0FERFJfQUxMX0FERFJfRU4gICAgICB2QklUKDApXzQ5IAorKi8KKwl1NjQgdG1hY19pcGdfY2ZnOworCisJdTY0IHJtYWNfcGF1c2VfY2ZnOworI2RlZmluZSBSTUFDX1BBVVNFX0dFTiAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgUk1BQ19QQVVTRV9HRU5fRU5BQkxFICAgICAgQklUKDApCisjZGVmaW5lIFJNQUNfUEFVU0VfUlggICAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBSTUFDX1BBVVNFX1JYX0VOQUJMRSAgICAgICBCSVQoMSkKKyNkZWZpbmUgUk1BQ19QQVVTRV9IR19QVElNRV9ERUYgICAgdkJJVCgweEZGRkYsMTYsMTYpCisjZGVmaW5lIFJNQUNfUEFVU0VfSEdfUFRJTUUodmFsKSAgICB2QklUKHZhbCwxNiwxNikKKworCXU2NCBybWFjX3JlZF9jZmc7CisKKwl1NjQgcm1hY19yZWRfcmF0ZV9xMHEzOworCXU2NCBybWFjX3JlZF9yYXRlX3E0cTc7CisKKwl1NjQgbWFjX2xpbmtfdXRpbDsKKyNkZWZpbmUgTUFDX1RYX0xJTktfVVRJTCAgICAgICAgICAgdkJJVCgweEZFLDEsNykKKyNkZWZpbmUgTUFDX1RYX0xJTktfVVRJTF9ESVNBQkxFICAgdkJJVCgweEYsIDgsNCkKKyNkZWZpbmUgTUFDX1RYX0xJTktfVVRJTF9WQUwoIG4gKSAgdkJJVChuLDgsNCkKKyNkZWZpbmUgTUFDX1JYX0xJTktfVVRJTCAgICAgICAgICAgdkJJVCgweEZFLDMzLDcpCisjZGVmaW5lIE1BQ19SWF9MSU5LX1VUSUxfRElTQUJMRSAgIHZCSVQoMHhGLDQwLDQpCisjZGVmaW5lIE1BQ19SWF9MSU5LX1VUSUxfVkFMKCBuICkgIHZCSVQobiw0MCw0KQorCisjZGVmaW5lIE1BQ19MSU5LX1VUSUxfRElTQUJMRSAgICAgIE1BQ19UWF9MSU5LX1VUSUxfRElTQUJMRSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFDX1JYX0xJTktfVVRJTF9ESVNBQkxFCisKKwl1NjQgcm1hY19pbnZhbGlkX2lwZzsKKworLyogcnggdHJhZmZpYyBzdGVlcmluZyAqLworI2RlZmluZQlNQUNfUlRTX0ZSTV9MRU5fU0VUKGxlbikJdkJJVChsZW4sMiwxNCkKKwl1NjQgcnRzX2ZybV9sZW5fbls4XTsKKworCXU2NCBydHNfcW9zX3N0ZWVyaW5nOworCisjZGVmaW5lIE1BWF9ESVhfTUFQICAgICAgICAgICAgICAgICAgICAgICAgIDQKKwl1NjQgcnRzX2RpeF9tYXBfbltNQVhfRElYX01BUF07CisjZGVmaW5lIFJUU19ESVhfTUFQX0VUWVBFKHZhbCkgICAgICAgICAgICAgdkJJVCh2YWwsMCwxNikKKyNkZWZpbmUgUlRTX0RJWF9NQVBfU0NXKHZhbCkgICAgICAgICAgICAgICBCSVQodmFsLDIxKQorCisJdTY0IHJ0c19xX2FsdGVybmF0ZXM7CisJdTY0IHJ0c19kZWZhdWx0X3E7CisKKwl1NjQgcnRzX2N0cmw7CisjZGVmaW5lIFJUU19DVFJMX0lHTk9SRV9TTkFQX09VSSAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIFJUU19DVFJMX0lHTk9SRV9MTENfQ1RSTCAgICAgICAgICAgQklUKDMpCisKKwl1NjQgcnRzX3BuX2NhbV9jdHJsOworI2RlZmluZSBSVFNfUE5fQ0FNX0NUUkxfV0UgICAgICAgICAgICAgICAgIEJJVCg3KQorI2RlZmluZSBSVFNfUE5fQ0FNX0NUUkxfU1RST0JFX05FV19DTUQgICAgIEJJVCgxNSkKKyNkZWZpbmUgUlRTX1BOX0NBTV9DVFJMX1NUUk9CRV9CRUlOR19FWEVDVVRFRCAgIEJJVCgxNSkKKyNkZWZpbmUgUlRTX1BOX0NBTV9DVFJMX09GRlNFVChuKSAgICAgICAgICB2QklUKG4sMjQsOCkKKwl1NjQgcnRzX3BuX2NhbV9kYXRhOworI2RlZmluZSBSVFNfUE5fQ0FNX0RBVEFfVENQX1NFTEVDVCAgICAgICAgIEJJVCg3KQorI2RlZmluZSBSVFNfUE5fQ0FNX0RBVEFfUE9SVCh2YWwpICAgICAgICAgIHZCSVQodmFsLDgsMTYpCisjZGVmaW5lIFJUU19QTl9DQU1fREFUQV9TQ1codmFsKSAgICAgICAgICAgdkJJVCh2YWwsMjQsOCkKKworCXU2NCBydHNfZHNfbWVtX2N0cmw7CisjZGVmaW5lIFJUU19EU19NRU1fQ1RSTF9XRSAgICAgICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIFJUU19EU19NRU1fQ1RSTF9TVFJPQkVfTkVXX0NNRCAgICAgQklUKDE1KQorI2RlZmluZSBSVFNfRFNfTUVNX0NUUkxfU1RST0JFX0NNRF9CRUlOR19FWEVDVVRFRCAgIEJJVCgxNSkKKyNkZWZpbmUgUlRTX0RTX01FTV9DVFJMX09GRlNFVChuKSAgICAgICAgICB2QklUKG4sMjYsNikKKwl1NjQgcnRzX2RzX21lbV9kYXRhOworI2RlZmluZSBSVFNfRFNfTUVNX0RBVEEobikgICAgICAgICAgICAgICAgIHZCSVQobiwwLDgpCisKKwl1OCB1bnVzZWQxNlsweDcwMCAtIDB4MjIwXTsKKworCXU2NCBtYWNfZGVidWdfY3RybDsKKyNkZWZpbmUgTUFDX0RCR19BQ1RJVklUWV9WQUxVRQkJICAgMHg0MTEwNDA0MDAwMDAwMDBVTEwKKworCXU4IHVudXNlZDE3WzB4MjgwMCAtIDB4MjcwOF07CisKKy8qIG1lbW9yeSBjb250cm9sbGVyIHJlZ2lzdGVycyAqLworCXU2NCBtY19pbnRfc3RhdHVzOworI2RlZmluZSBNQ19JTlRfU1RBVFVTX01DX0lOVCAgICAgICAgICAgICAgIEJJVCgwKQorCXU2NCBtY19pbnRfbWFzazsKKyNkZWZpbmUgTUNfSU5UX01BU0tfTUNfSU5UICAgICAgICAgICAgICAgICBCSVQoMCkKKworCXU2NCBtY19lcnJfcmVnOworI2RlZmluZSBNQ19FUlJfUkVHX0VDQ19EQl9FUlJfTCAgICAgICAgICAgIEJJVCgxNCkKKyNkZWZpbmUgTUNfRVJSX1JFR19FQ0NfREJfRVJSX1UgICAgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIE1DX0VSUl9SRUdfTUlSSV9DUklfRVJSXzAgICAgICAgICAgQklUKDIyKQorI2RlZmluZSBNQ19FUlJfUkVHX01JUklfQ1JJX0VSUl8xICAgICAgICAgIEJJVCgyMykKKyNkZWZpbmUgTUNfRVJSX1JFR19TTV9FUlIgICAgICAgICAgICAgICAgICBCSVQoMzEpCisJdTY0IG1jX2Vycl9tYXNrOworCXU2NCBtY19lcnJfYWxhcm07CisKKwl1OCB1bnVzZWQxOFsweDEwMCAtIDB4MjhdOworCisvKiBNQyBjb25maWd1cmF0aW9uICovCisJdTY0IHJ4X3F1ZXVlX2NmZzsKKyNkZWZpbmUgUlhfUVVFVUVfQ0ZHX1EwX1NaKG4pICAgICAgICAgICAgICB2QklUKG4sMCw4KQorI2RlZmluZSBSWF9RVUVVRV9DRkdfUTFfU1oobikgICAgICAgICAgICAgIHZCSVQobiw4LDgpCisjZGVmaW5lIFJYX1FVRVVFX0NGR19RMl9TWihuKSAgICAgICAgICAgICAgdkJJVChuLDE2LDgpCisjZGVmaW5lIFJYX1FVRVVFX0NGR19RM19TWihuKSAgICAgICAgICAgICAgdkJJVChuLDI0LDgpCisjZGVmaW5lIFJYX1FVRVVFX0NGR19RNF9TWihuKSAgICAgICAgICAgICAgdkJJVChuLDMyLDgpCisjZGVmaW5lIFJYX1FVRVVFX0NGR19RNV9TWihuKSAgICAgICAgICAgICAgdkJJVChuLDQwLDgpCisjZGVmaW5lIFJYX1FVRVVFX0NGR19RNl9TWihuKSAgICAgICAgICAgICAgdkJJVChuLDQ4LDgpCisjZGVmaW5lIFJYX1FVRVVFX0NGR19RN19TWihuKSAgICAgICAgICAgICAgdkJJVChuLDU2LDgpCisKKwl1NjQgbWNfcmxkcmFtX21yczsKKyNkZWZpbmUJTUNfUkxEUkFNX1FVRVVFX1NJWkVfRU5BQkxFCQkJQklUKDM5KQorI2RlZmluZQlNQ19STERSQU1fTVJTX0VOQUJMRQkJCQlCSVQoNDcpCisKKwl1NjQgbWNfcmxkcmFtX2ludGVybGVhdmU7CisKKwl1NjQgbWNfcGF1c2VfdGhyZXNoX3EwcTM7CisJdTY0IG1jX3BhdXNlX3RocmVzaF9xNHE3OworCisJdTY0IG1jX3JlZF90aHJlc2hfcVs4XTsKKworCXU4IHVudXNlZDE5WzB4MjAwIC0gMHgxNjhdOworCXU2NCBtY19ybGRyYW1fcmVmX3BlcjsKKwl1OCB1bnVzZWQyMFsweDIyMCAtIDB4MjA4XTsKKwl1NjQgbWNfcmxkcmFtX3Rlc3RfY3RybDsKKyNkZWZpbmUgTUNfUkxEUkFNX1RFU1RfTU9ERQkJQklUKDQ3KQorI2RlZmluZSBNQ19STERSQU1fVEVTVF9XUklURQlCSVQoNykKKyNkZWZpbmUgTUNfUkxEUkFNX1RFU1RfR08JCUJJVCgxNSkKKyNkZWZpbmUgTUNfUkxEUkFNX1RFU1RfRE9ORQkJQklUKDIzKQorI2RlZmluZSBNQ19STERSQU1fVEVTVF9QQVNTCQlCSVQoMzEpCisKKwl1OCB1bnVzZWQyMVsweDI0MCAtIDB4MjI4XTsKKwl1NjQgbWNfcmxkcmFtX3Rlc3RfYWRkOworCXU4IHVudXNlZDIyWzB4MjYwIC0gMHgyNDhdOworCXU2NCBtY19ybGRyYW1fdGVzdF9kMDsKKwl1OCB1bnVzZWQyM1sweDI4MCAtIDB4MjY4XTsKKwl1NjQgbWNfcmxkcmFtX3Rlc3RfZDE7CisJdTggdW51c2VkMjRbMHgzMDAgLSAweDI4OF07CisJdTY0IG1jX3JsZHJhbV90ZXN0X2QyOworCXU4IHVudXNlZDI1WzB4NzAwIC0gMHgzMDhdOworCXU2NCBtY19kZWJ1Z19jdHJsOworCisJdTggdW51c2VkMjZbMHgzMDAwIC0gMHgyZjA4XTsKKworLyogWEdYRyAqLworCS8qIFhHWFMgY29udHJvbCByZWdpc3RlcnMgKi8KKworCXU2NCB4Z3hzX2ludF9zdGF0dXM7CisjZGVmaW5lIFhHWFNfSU5UX1NUQVRVU19UWEdYUyAgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIFhHWFNfSU5UX1NUQVRVU19SWEdYUyAgICAgICAgICAgICAgQklUKDEpCisJdTY0IHhneHNfaW50X21hc2s7CisjZGVmaW5lIFhHWFNfSU5UX01BU0tfVFhHWFMgICAgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIFhHWFNfSU5UX01BU0tfUlhHWFMgICAgICAgICAgICAgICAgQklUKDEpCisKKwl1NjQgeGd4c190eGd4c19lcnJfcmVnOworI2RlZmluZSBUWEdYU19FQ0NfREJfRVJSICAgICAgICAgICAgICAgICAgIEJJVCgxNSkKKwl1NjQgeGd4c190eGd4c19lcnJfbWFzazsKKwl1NjQgeGd4c190eGd4c19lcnJfYWxhcm07CisKKwl1NjQgeGd4c19yeGd4c19lcnJfcmVnOworCXU2NCB4Z3hzX3J4Z3hzX2Vycl9tYXNrOworCXU2NCB4Z3hzX3J4Z3hzX2Vycl9hbGFybTsKKworCXU4IHVudXNlZDI3WzB4MTAwIC0gMHg0MF07CisKKwl1NjQgeGd4c19jZmc7CisJdTY0IHhneHNfc3RhdHVzOworCisJdTY0IHhneHNfY2ZnX2tleTsKKwl1NjQgeGd4c19lZmlmb19jZmc7CS8qIENIQU5HRUQgKi8KKwl1NjQgcnhneHNfYmVyXzA7CS8qIENIQU5HRUQgKi8KKwl1NjQgcnhneHNfYmVyXzE7CS8qIENIQU5HRUQgKi8KKworfSBYRU5BX2Rldl9jb25maWdfdDsKKworI2RlZmluZSBYRU5BX1JFR19TUEFDRQlzaXplb2YoWEVOQV9kZXZfY29uZmlnX3QpCisjZGVmaW5lCVhFTkFfRUVQUk9NX1NQQUNFICgweDAxIDw8IDExKQorCisjZW5kaWYJCQkJLyogX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby5jIGIvZHJpdmVycy9uZXQvczJpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMjI0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zMmlvLmMKQEAgLTAsMCArMSw0OTUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzMmlvLmM6IEEgTGludXggUENJLVggRXRoZXJuZXQgZHJpdmVyIGZvciBTMklPIDEwR2JFIFNlcnZlciBOSUMKKyAqIENvcHlyaWdodChjKSAyMDAyLTIwMDUgTmV0ZXJpb24gSW5jLgorCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICogRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorICogcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorICogYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKyAqIHN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorICogU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhpcyBkaXN0cmlidXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogQ3JlZGl0czoKKyAqIEplZmYgR2FyemlrCQk6IEZvciBwb2ludGluZyBvdXQgdGhlIGltcHJvcGVyIGVycm9yIGNvbmRpdGlvbiAKKyAqCQkJICBjaGVjayBpbiB0aGUgczJpb194bWl0IHJvdXRpbmUgYW5kIGFsc28gc29tZSAKKyAqIAkJCSAgaXNzdWVzIGluIHRoZSBUeCB3YXRjaCBkb2cgZnVuY3Rpb24uIEFsc28gZm9yCisgKgkJCSAgcGF0aWVudGx5IGFuc3dlcmluZyBhbGwgdGhvc2UgaW5udW1lcmFibGUgCisgKgkJCSAgcXVlc3Rpb25zIHJlZ2FyaW5nIHRoZSAyLjYgcG9ydGluZyBpc3N1ZXMuCisgKiBTdGVwaGVuIEhlbW1pbmdlcgk6IFByb3ZpZGluZyBwcm9wZXIgMi42IHBvcnRpbmcgbWVjaGFuaXNtIGZvciBzb21lCisgKgkJCSAgbWFjcm9zIGF2YWlsYWJsZSBvbmx5IGluIDIuNiBLZXJuZWwuCisgKiBGcmFuY29pcyBSb21pZXUJOiBGb3IgcG9pbnRpbmcgb3V0IGFsbCBjb2RlIHBhcnQgdGhhdCB3ZXJlIAorICoJCQkgIGRlcHJlY2F0ZWQgYW5kIGFsc28gc3R5bGluZyByZWxhdGVkIGNvbW1lbnRzLgorICogR3JhbnQgR3J1bmRsZXIJOiBGb3IgaGVscGluZyBtZSBnZXQgcmlkIG9mIHNvbWUgQXJjaGl0ZWN0dXJlIAorICoJCQkgIGRlcGVuZGVudCBjb2RlLgorICogQ2hyaXN0b3BoZXIgSGVsbHdpZwk6IFNvbWUgbW9yZSAyLjYgc3BlY2lmaWMgaXNzdWVzIGluIHRoZSBkcml2ZXIuCisgKgkJCSAgCQorICogVGhlIG1vZHVsZSBsb2FkYWJsZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyIGFuZCBhIGJyaWVmCisgKiBleHBsYWluYXRpb24gb2YgYWxsIHRoZSB2YXJpYWJsZXMuCisgKiByeF9yaW5nX251bSA6IFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvZ3JhbSB0aGUgbnVtYmVyIG9mIHJlY2VpdmUgcmluZ3MgdXNlZCAKKyAqIGluIHRoZSBkcml2ZXIuICAJCQkJCQorICogcnhfcmluZ19sZW46IFRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGVhY2ggcmluZyBjYW4gaGF2ZS4gVGhpcyAKKyAqIGlzIGFsc28gYW4gYXJyYXkgb2Ygc2l6ZSA4LgorICogdHhfZmlmb19udW06IFRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIFR4IEZJRk9zIHRoYXRzIHVzZWQgaW50IHRoZSBkcml2ZXIuCisgKiB0eF9maWZvX2xlbjogVGhpcyB0b28gaXMgYW4gYXJyYXkgb2YgOC4gRWFjaCBlbGVtZW50IGRlZmluZXMgdGhlIG51bWJlciBvZiAKKyAqIFR4IGRlc2NyaXB0b3JzIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGNvcnJlc3BvbmRpbmcgRklGTy4KKyAqIGluIFBDSSBDb25maWd1cmF0aW9uIHNwYWNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogbG9jYWwgaW5jbHVkZSAqLworI2luY2x1ZGUgInMyaW8uaCIKKyNpbmNsdWRlICJzMmlvLXJlZ3MuaCIKKworLyogUzJpbyBEcml2ZXIgbmFtZSAmIHZlcnNpb24uICovCitzdGF0aWMgY2hhciBzMmlvX2RyaXZlcl9uYW1lW10gPSAiczJpbyI7CitzdGF0aWMgY2hhciBzMmlvX2RyaXZlcl92ZXJzaW9uW10gPSAiVmVyc2lvbiAxLjcuNy4xIjsKKworLyogCisgKiBDYXJkcyB3aXRoIGZvbGxvd2luZyBzdWJzeXN0ZW1faWQgaGF2ZSBhIGxpbmsgc3RhdGUgaW5kaWNhdGlvbgorICogcHJvYmxlbSwgNjAwQiwgNjAwQywgNjAwRCwgNjQwQiwgNjQwQyBhbmQgNjQwRC4KKyAqIG1hY3JvIGJlbG93IGlkZW50aWZpZXMgdGhlc2UgY2FyZHMgZ2l2ZW4gdGhlIHN1YnN5c3RlbV9pZC4KKyAqLworI2RlZmluZSBDQVJEU19XSVRIX0ZBVUxUWV9MSU5LX0lORElDQVRPUlMoc3ViaWQpIFwKKwkJKCgoc3ViaWQgPj0gMHg2MDBCKSAmJiAoc3ViaWQgPD0gMHg2MDBEKSkgfHwgXAorCQkgKChzdWJpZCA+PSAweDY0MEIpICYmIChzdWJpZCA8PSAweDY0MEQpKSkgPyAxIDogMAorCisjZGVmaW5lIExJTktfSVNfVVAodmFsNjQpICghKHZhbDY0ICYgKEFEQVBURVJfU1RBVFVTX1JNQUNfUkVNT1RFX0ZBVUxUIHwgXAorCQkJCSAgICAgIEFEQVBURVJfU1RBVFVTX1JNQUNfTE9DQUxfRkFVTFQpKSkKKyNkZWZpbmUgVEFTS0xFVF9JTl9VU0UgdGVzdF9hbmRfc2V0X2JpdCgwLCAoJnNwLT50YXNrbGV0X3N0YXR1cykpCisjZGVmaW5lIFBBTklDCTEKKyNkZWZpbmUgTE9XCTIKK3N0YXRpYyBpbmxpbmUgaW50IHJ4X2J1ZmZlcl9sZXZlbChuaWNfdCAqIHNwLCBpbnQgcnhiX3NpemUsIGludCByaW5nKQoreworCWludCBsZXZlbCA9IDA7CisJaWYgKChzcC0+cGt0X2NudFtyaW5nXSAtIHJ4Yl9zaXplKSA+IDE2KSB7CisJCWxldmVsID0gTE9XOworCQlpZiAoKHNwLT5wa3RfY250W3JpbmddIC0gcnhiX3NpemUpIDwgTUFYX1JYRFNfUEVSX0JMT0NLKSB7CisJCQlsZXZlbCA9IFBBTklDOworCQl9CisJfQorCisJcmV0dXJuIGxldmVsOworfQorCisvKiBFdGh0b29sIHJlbGF0ZWQgdmFyaWFibGVzIGFuZCBNYWNyb3MuICovCitzdGF0aWMgY2hhciBzMmlvX2dzdHJpbmdzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwkiUmVnaXN0ZXIgdGVzdFx0KG9mZmxpbmUpIiwKKwkiRWVwcm9tIHRlc3RcdChvZmZsaW5lKSIsCisJIkxpbmsgdGVzdFx0KG9ubGluZSkiLAorCSJSTERSQU0gdGVzdFx0KG9mZmxpbmUpIiwKKwkiQklTVCBUZXN0XHQob2ZmbGluZSkiCit9OworCitzdGF0aWMgY2hhciBldGh0b29sX3N0YXRzX2tleXNbXVtFVEhfR1NUUklOR19MRU5dID0geworCXsidG1hY19mcm1zIn0sCisJeyJ0bWFjX2RhdGFfb2N0ZXRzIn0sCisJeyJ0bWFjX2Ryb3BfZnJtcyJ9LAorCXsidG1hY19tY3N0X2ZybXMifSwKKwl7InRtYWNfYmNzdF9mcm1zIn0sCisJeyJ0bWFjX3BhdXNlX2N0cmxfZnJtcyJ9LAorCXsidG1hY19hbnlfZXJyX2ZybXMifSwKKwl7InRtYWNfdmxkX2lwX29jdGV0cyJ9LAorCXsidG1hY192bGRfaXAifSwKKwl7InRtYWNfZHJvcF9pcCJ9LAorCXsidG1hY19pY21wIn0sCisJeyJ0bWFjX3JzdF90Y3AifSwKKwl7InRtYWNfdGNwIn0sCisJeyJ0bWFjX3VkcCJ9LAorCXsicm1hY192bGRfZnJtcyJ9LAorCXsicm1hY19kYXRhX29jdGV0cyJ9LAorCXsicm1hY19mY3NfZXJyX2ZybXMifSwKKwl7InJtYWNfZHJvcF9mcm1zIn0sCisJeyJybWFjX3ZsZF9tY3N0X2ZybXMifSwKKwl7InJtYWNfdmxkX2Jjc3RfZnJtcyJ9LAorCXsicm1hY19pbl9ybmdfbGVuX2Vycl9mcm1zIn0sCisJeyJybWFjX2xvbmdfZnJtcyJ9LAorCXsicm1hY19wYXVzZV9jdHJsX2ZybXMifSwKKwl7InJtYWNfZGlzY2FyZGVkX2ZybXMifSwKKwl7InJtYWNfdXNpemVkX2ZybXMifSwKKwl7InJtYWNfb3NpemVkX2ZybXMifSwKKwl7InJtYWNfZnJhZ19mcm1zIn0sCisJeyJybWFjX2phYmJlcl9mcm1zIn0sCisJeyJybWFjX2lwIn0sCisJeyJybWFjX2lwX29jdGV0cyJ9LAorCXsicm1hY19oZHJfZXJyX2lwIn0sCisJeyJybWFjX2Ryb3BfaXAifSwKKwl7InJtYWNfaWNtcCJ9LAorCXsicm1hY190Y3AifSwKKwl7InJtYWNfdWRwIn0sCisJeyJybWFjX2Vycl9kcnBfdWRwIn0sCisJeyJybWFjX3BhdXNlX2NudCJ9LAorCXsicm1hY19hY2NlcHRlZF9pcCJ9LAorCXsicm1hY19lcnJfdGNwIn0sCit9OworCisjZGVmaW5lIFMySU9fU1RBVF9MRU4gc2l6ZW9mKGV0aHRvb2xfc3RhdHNfa2V5cykvIEVUSF9HU1RSSU5HX0xFTgorI2RlZmluZSBTMklPX1NUQVRfU1RSSU5HU19MRU4gUzJJT19TVEFUX0xFTiAqIEVUSF9HU1RSSU5HX0xFTgorCisjZGVmaW5lIFMySU9fVEVTVF9MRU4Jc2l6ZW9mKHMyaW9fZ3N0cmluZ3MpIC8gRVRIX0dTVFJJTkdfTEVOCisjZGVmaW5lIFMySU9fU1RSSU5HU19MRU4JUzJJT19URVNUX0xFTiAqIEVUSF9HU1RSSU5HX0xFTgorCisKKy8qIAorICogQ29uc3RhbnRzIHRvIGJlIHByb2dyYW1tZWQgaW50byB0aGUgWGVuYSdzIHJlZ2lzdGVycywgdG8gY29uZmlndXJlCisgKiB0aGUgWEFVSS4KKyAqLworCisjZGVmaW5lIFNXSVRDSF9TSUdOCTB4QTVBNUE1QTVBNUE1QTVBNVVMTAorI2RlZmluZQlFTkRfU0lHTgkweDAKKworc3RhdGljIHU2NCBkZWZhdWx0X21kaW9fY2ZnW10gPSB7CisJLyogUmVzZXQgUE1BIFBMTCAqLworCTB4QzAwMTAxMDAwMDAwMDAwMFVMTCwgMHhDMDAxMDEwMDAwMDAwMEUwVUxMLAorCTB4QzAwMTAxMDAwMDgwMDBFNFVMTCwKKwkvKiBSZW1vdmUgUmVzZXQgZnJvbSBQTUEgUExMICovCisJMHhDMDAxMDEwMDAwMDAwMDAwVUxMLCAweEMwMDEwMTAwMDAwMDAwRTBVTEwsCisJMHhDMDAxMDEwMDAwMDAwMEU0VUxMLAorCUVORF9TSUdOCit9OworCitzdGF0aWMgdTY0IGRlZmF1bHRfZHR4X2NmZ1tdID0geworCTB4ODAwMDA1MTUwMDAwMDAwMFVMTCwgMHg4MDAwMDUxNTAwMDAwMEUwVUxMLAorCTB4ODAwMDA1MTVEOTM1MDBFNFVMTCwgMHg4MDAxMDUxNTAwMDAwMDAwVUxMLAorCTB4ODAwMTA1MTUwMDAwMDBFMFVMTCwgMHg4MDAxMDUxNTAwMUUwMEU0VUxMLAorCTB4ODAwMjA1MTUwMDAwMDAwMFVMTCwgMHg4MDAyMDUxNTAwMDAwMEUwVUxMLAorCTB4ODAwMjA1MTVGMjEwMDBFNFVMTCwKKwkvKiBTZXQgUEFETE9PUEJBQ0tOICovCisJMHg4MDAyMDUxNTAwMDAwMDAwVUxMLCAweDgwMDIwNTE1MDAwMDAwRTBVTEwsCisJMHg4MDAyMDUxNUIyMDAwMEU0VUxMLCAweDgwMDMwNTE1MDAwMDAwMDBVTEwsCisJMHg4MDAzMDUxNTAwMDAwMEUwVUxMLCAweDgwMDMwNTE1QjIwMDAwRTRVTEwsCisJMHg4MDA0MDUxNTAwMDAwMDAwVUxMLCAweDgwMDQwNTE1MDAwMDAwRTBVTEwsCisJMHg4MDA0MDUxNUIyMDAwMEU0VUxMLCAweDgwMDUwNTE1MDAwMDAwMDBVTEwsCisJMHg4MDA1MDUxNTAwMDAwMEUwVUxMLCAweDgwMDUwNTE1QjIwMDAwRTRVTEwsCisJU1dJVENIX1NJR04sCisJLyogUmVtb3ZlIFBBRExPT1BCQUNLTiAqLworCTB4ODAwMjA1MTUwMDAwMDAwMFVMTCwgMHg4MDAyMDUxNTAwMDAwMEUwVUxMLAorCTB4ODAwMjA1MTVGMjAwMDBFNFVMTCwgMHg4MDAzMDUxNTAwMDAwMDAwVUxMLAorCTB4ODAwMzA1MTUwMDAwMDBFMFVMTCwgMHg4MDAzMDUxNUYyMDAwMEU0VUxMLAorCTB4ODAwNDA1MTUwMDAwMDAwMFVMTCwgMHg4MDA0MDUxNTAwMDAwMEUwVUxMLAorCTB4ODAwNDA1MTVGMjAwMDBFNFVMTCwgMHg4MDA1MDUxNTAwMDAwMDAwVUxMLAorCTB4ODAwNTA1MTUwMDAwMDBFMFVMTCwgMHg4MDA1MDUxNUYyMDAwMEU0VUxMLAorCUVORF9TSUdOCit9OworCisKKy8qIAorICogQ29uc3RhbnRzIGZvciBGaXhpbmcgdGhlIE1hY0FkZHJlc3MgcHJvYmxlbSBzZWVuIG1vc3RseSBvbgorICogQWxwaGEgbWFjaGluZXMuCisgKi8KK3N0YXRpYyB1NjQgZml4X21hY1tdID0geworCTB4MDA2MDAwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDA0MDYwMDAwMDAwMDAwMFVMTCwgMHgwMDAwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDAwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDA0MDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCUVORF9TSUdOCit9OworCisvKiBNb2R1bGUgTG9hZGFibGUgcGFyYW1ldGVycy4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHhfZmlmb19udW0gPSAxOworc3RhdGljIHVuc2lnbmVkIGludCB0eF9maWZvX2xlbltNQVhfVFhfRklGT1NdID0KKyAgICB7WzAgLi4uKE1BWF9UWF9GSUZPUyAtIDEpXSA9IDAgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnhfcmluZ19udW0gPSAxOworc3RhdGljIHVuc2lnbmVkIGludCByeF9yaW5nX3N6W01BWF9SWF9SSU5HU10gPQorICAgIHtbMCAuLi4oTUFYX1JYX1JJTkdTIC0gMSldID0gMCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBTdGF0c19yZWZyZXNoX3RpbWUgPSA0Oworc3RhdGljIHVuc2lnbmVkIGludCBybWFjX3BhdXNlX3RpbWUgPSA2NTUzNTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWNfcGF1c2VfdGhyZXNob2xkX3EwcTMgPSAxODc7CitzdGF0aWMgdW5zaWduZWQgaW50IG1jX3BhdXNlX3RocmVzaG9sZF9xNHE3ID0gMTg3Oworc3RhdGljIHVuc2lnbmVkIGludCBzaGFyZWRfc3BsaXRzOworc3RhdGljIHVuc2lnbmVkIGludCB0bWFjX3V0aWxfcGVyaW9kID0gNTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcm1hY191dGlsX3BlcmlvZCA9IDU7CisjaWZuZGVmIENPTkZJR19TMklPX05BUEkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5kaWNhdGVfbWF4X3BrdHM7CisjZW5kaWYKKworLyogCisgKiBTMklPIGRldmljZSB0YWJsZS4KKyAqIFRoaXMgdGFibGUgbGlzdHMgYWxsIHRoZSBkZXZpY2VzIHRoYXQgdGhpcyBkcml2ZXIgc3VwcG9ydHMuIAorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgczJpb190YmxbXSBfX2RldmluaXRkYXRhID0geworCXtQQ0lfVkVORE9SX0lEX1MySU8sIFBDSV9ERVZJQ0VfSURfUzJJT19XSU4sCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAorCXtQQ0lfVkVORE9SX0lEX1MySU8sIFBDSV9ERVZJQ0VfSURfUzJJT19VTkksCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAorCXtQQ0lfVkVORE9SX0lEX1MySU8sIFBDSV9ERVZJQ0VfSURfSEVSQ19XSU4sCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAorCXtQQ0lfVkVORE9SX0lEX1MySU8sIFBDSV9ERVZJQ0VfSURfSEVSQ19VTkksCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAorCXswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzMmlvX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzMmlvX2RyaXZlciA9IHsKKyAgICAgIC5uYW1lID0gIlMySU8iLAorICAgICAgLmlkX3RhYmxlID0gczJpb190YmwsCisgICAgICAucHJvYmUgPSBzMmlvX2luaXRfbmljLAorICAgICAgLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHMyaW9fcmVtX25pYyksCit9OworCisvKiBBIHNpbXBsaWZpZXIgbWFjcm8gdXNlZCBib3RoIGJ5IGluaXQgYW5kIGZyZWUgc2hhcmVkX21lbSBGbnMoKS4gKi8KKyNkZWZpbmUgVFhEX01FTV9QQUdFX0NOVChsZW4sIHBlcl9lYWNoKSAoKGxlbitwZXJfZWFjaCAtIDEpIC8gcGVyX2VhY2gpCisKKy8qKgorICogaW5pdF9zaGFyZWRfbWVtIC0gQWxsb2NhdGlvbiBhbmQgSW5pdGlhbGl6YXRpb24gb2YgTWVtb3J5CisgKiBAbmljOiBEZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZS4KKyAqIERlc2NyaXB0aW9uOiBUaGUgZnVuY3Rpb24gYWxsb2NhdGVzIGFsbCB0aGUgbWVtb3J5IGFyZWFzIHNoYXJlZCAKKyAqIGJldHdlZW4gdGhlIE5JQyBhbmQgdGhlIGRyaXZlci4gVGhpcyBpbmNsdWRlcyBUeCBkZXNjcmlwdG9ycywgCisgKiBSeCBkZXNjcmlwdG9ycyBhbmQgdGhlIHN0YXRpc3RpY3MgYmxvY2suCisgKi8KKworc3RhdGljIGludCBpbml0X3NoYXJlZF9tZW0oc3RydWN0IHMyaW9fbmljICpuaWMpCit7CisJdTMyIHNpemU7CisJdm9pZCAqdG1wX3ZfYWRkciwgKnRtcF92X2FkZHJfbmV4dDsKKwlkbWFfYWRkcl90IHRtcF9wX2FkZHIsIHRtcF9wX2FkZHJfbmV4dDsKKwlSeERfYmxvY2tfdCAqcHJlX3J4ZF9ibGsgPSBOVUxMOworCWludCBpLCBqLCBibGtfY250OworCWludCBsc3Rfc2l6ZSwgbHN0X3Blcl9wYWdlOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuaWMtPmRldjsKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCXVuc2lnbmVkIGxvbmcgdG1wOworCWJ1ZmZBZGRfdCAqYmE7CisjZW5kaWYKKworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKworCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJm5pYy0+Y29uZmlnOworCisKKwkvKiBBbGxvY2F0aW9uIGFuZCBpbml0aWFsaXphdGlvbiBvZiBUWERMcyBpbiBGSU9GcyAqLworCXNpemUgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnR4X2ZpZm9fbnVtOyBpKyspIHsKKwkJc2l6ZSArPSBjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbjsKKwl9CisJaWYgKHNpemUgPiBNQVhfQVZBSUxBQkxFX1RYRFMpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogVG90YWwgbnVtYmVyIG9mIFR4IEZJRk9zICIsCisJCQkgIGRldi0+bmFtZSk7CisJCURCR19QUklOVChFUlJfREJHLCAiZXhjZWVkcyB0aGUgbWF4aW11bSB2YWx1ZSAiKTsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJ0aGF0IGNhbiBiZSB1c2VkXG4iKTsKKwkJcmV0dXJuIEZBSUxVUkU7CisJfQorCisJbHN0X3NpemUgPSAoc2l6ZW9mKFR4RF90KSAqIGNvbmZpZy0+bWF4X3R4ZHMpOworCWxzdF9wZXJfcGFnZSA9IFBBR0VfU0laRSAvIGxzdF9zaXplOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+dHhfZmlmb19udW07IGkrKykgeworCQlpbnQgZmlmb19sZW4gPSBjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbjsKKwkJaW50IGxpc3RfaG9sZGVyX3NpemUgPSBmaWZvX2xlbiAqIHNpemVvZihsaXN0X2luZm9faG9sZF90KTsKKwkJbmljLT5saXN0X2luZm9baV0gPSBrbWFsbG9jKGxpc3RfaG9sZGVyX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIW5pYy0+bGlzdF9pbmZvW2ldKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywKKwkJCQkgICJNYWxsb2MgZmFpbGVkIGZvciBsaXN0X2luZm9cbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWVtc2V0KG5pYy0+bGlzdF9pbmZvW2ldLCAwLCBsaXN0X2hvbGRlcl9zaXplKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+dHhfZmlmb19udW07IGkrKykgeworCQlpbnQgcGFnZV9udW0gPSBUWERfTUVNX1BBR0VfQ05UKGNvbmZpZy0+dHhfY2ZnW2ldLmZpZm9fbGVuLAorCQkJCQkJbHN0X3Blcl9wYWdlKTsKKwkJbWFjX2NvbnRyb2wtPnR4X2N1cnJfcHV0X2luZm9baV0ub2Zmc2V0ID0gMDsKKwkJbWFjX2NvbnRyb2wtPnR4X2N1cnJfcHV0X2luZm9baV0uZmlmb19sZW4gPQorCQkgICAgY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4gLSAxOworCQltYWNfY29udHJvbC0+dHhfY3Vycl9nZXRfaW5mb1tpXS5vZmZzZXQgPSAwOworCQltYWNfY29udHJvbC0+dHhfY3Vycl9nZXRfaW5mb1tpXS5maWZvX2xlbiA9CisJCSAgICBjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbiAtIDE7CisJCWZvciAoaiA9IDA7IGogPCBwYWdlX251bTsgaisrKSB7CisJCQlpbnQgayA9IDA7CisJCQlkbWFfYWRkcl90IHRtcF9wOworCQkJdm9pZCAqdG1wX3Y7CisJCQl0bXBfdiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG5pYy0+cGRldiwKKwkJCQkJCSAgICAgUEFHRV9TSVpFLCAmdG1wX3ApOworCQkJaWYgKCF0bXBfdikgeworCQkJCURCR19QUklOVChFUlJfREJHLAorCQkJCQkgICJwY2lfYWxsb2NfY29uc2lzdGVudCAiKTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgImZhaWxlZCBmb3IgVHhETFxuIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQl3aGlsZSAoayA8IGxzdF9wZXJfcGFnZSkgeworCQkJCWludCBsID0gKGogKiBsc3RfcGVyX3BhZ2UpICsgazsKKwkJCQlpZiAobCA9PSBjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbikKKwkJCQkJZ290byBlbmRfdHhkX2FsbG9jOworCQkJCW5pYy0+bGlzdF9pbmZvW2ldW2xdLmxpc3RfdmlydF9hZGRyID0KKwkJCQkgICAgdG1wX3YgKyAoayAqIGxzdF9zaXplKTsKKwkJCQluaWMtPmxpc3RfaW5mb1tpXVtsXS5saXN0X3BoeV9hZGRyID0KKwkJCQkgICAgdG1wX3AgKyAoayAqIGxzdF9zaXplKTsKKwkJCQlrKys7CisJCQl9CisJCX0KKwl9CisgICAgICBlbmRfdHhkX2FsbG9jOgorCisJLyogQWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gb2YgUlhEcyBpbiBSaW5ncyAqLworCXNpemUgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKKwkJaWYgKGNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQgJSAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSkpIHsKKwkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFJ4RCBjb3VudCBvZiAiLCBkZXYtPm5hbWUpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICJSaW5nJWQgaXMgbm90IGEgbXVsdGlwbGUgb2YgIiwKKwkJCQkgIGkpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICJSeERzIHBlciBCbG9jayIpOworCQkJcmV0dXJuIEZBSUxVUkU7CisJCX0KKwkJc2l6ZSArPSBjb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkOworCQluaWMtPmJsb2NrX2NvdW50W2ldID0KKwkJICAgIGNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQgLyAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCW5pYy0+cGt0X2NudFtpXSA9CisJCSAgICBjb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkIC0gbmljLT5ibG9ja19jb3VudFtpXTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLmJsb2NrX2luZGV4ID0gMDsKKwkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0ub2Zmc2V0ID0gMDsKKwkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0ucmluZ19sZW4gPQorCQkgICAgY29uZmlnLT5yeF9jZmdbaV0ubnVtX3J4ZCAtIDE7CisJCW1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW2ldLmJsb2NrX2luZGV4ID0gMDsKKwkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9baV0ub2Zmc2V0ID0gMDsKKwkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9baV0ucmluZ19sZW4gPQorCQkgICAgY29uZmlnLT5yeF9jZmdbaV0ubnVtX3J4ZCAtIDE7CisJCWJsa19jbnQgPQorCQkgICAgY29uZmlnLT5yeF9jZmdbaV0ubnVtX3J4ZCAvIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKTsKKwkJLyogIEFsbG9jYXRpbmcgYWxsIHRoZSBSeCBibG9ja3MgKi8KKwkJZm9yIChqID0gMDsgaiA8IGJsa19jbnQ7IGorKykgeworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCQkJc2l6ZSA9IChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSAqIChzaXplb2YoUnhEX3QpKTsKKyNlbHNlCisJCQlzaXplID0gU0laRV9PRl9CTE9DSzsKKyNlbmRpZgorCQkJdG1wX3ZfYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG5pYy0+cGRldiwgc2l6ZSwKKwkJCQkJCQkgICZ0bXBfcF9hZGRyKTsKKwkJCWlmICh0bXBfdl9hZGRyID09IE5VTEwpIHsKKwkJCQkvKgorCQkJCSAqIEluIGNhc2Ugb2YgZmFpbHVyZSwgZnJlZV9zaGFyZWRfbWVtKCkgCisJCQkJICogaXMgY2FsbGVkLCB3aGljaCBzaG91bGQgZnJlZSBhbnkgCisJCQkJICogbWVtb3J5IHRoYXQgd2FzIGFsbG9jZWQgdGlsbCB0aGUgCisJCQkJICogZmFpbHVyZSBoYXBwZW5lZC4KKwkJCQkgKi8KKwkJCQluaWMtPnJ4X2Jsb2Nrc1tpXVtqXS5ibG9ja192aXJ0X2FkZHIgPQorCQkJCSAgICB0bXBfdl9hZGRyOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJbWVtc2V0KHRtcF92X2FkZHIsIDAsIHNpemUpOworCQkJbmljLT5yeF9ibG9ja3NbaV1bal0uYmxvY2tfdmlydF9hZGRyID0gdG1wX3ZfYWRkcjsKKwkJCW5pYy0+cnhfYmxvY2tzW2ldW2pdLmJsb2NrX2RtYV9hZGRyID0gdG1wX3BfYWRkcjsKKwkJfQorCQkvKiBJbnRlcmxpbmtpbmcgYWxsIFJ4IEJsb2NrcyAqLworCQlmb3IgKGogPSAwOyBqIDwgYmxrX2NudDsgaisrKSB7CisJCQl0bXBfdl9hZGRyID0gbmljLT5yeF9ibG9ja3NbaV1bal0uYmxvY2tfdmlydF9hZGRyOworCQkJdG1wX3ZfYWRkcl9uZXh0ID0KKwkJCSAgICBuaWMtPnJ4X2Jsb2Nrc1tpXVsoaiArIDEpICUKKwkJCQkJICAgICAgYmxrX2NudF0uYmxvY2tfdmlydF9hZGRyOworCQkJdG1wX3BfYWRkciA9IG5pYy0+cnhfYmxvY2tzW2ldW2pdLmJsb2NrX2RtYV9hZGRyOworCQkJdG1wX3BfYWRkcl9uZXh0ID0KKwkJCSAgICBuaWMtPnJ4X2Jsb2Nrc1tpXVsoaiArIDEpICUKKwkJCQkJICAgICAgYmxrX2NudF0uYmxvY2tfZG1hX2FkZHI7CisKKwkJCXByZV9yeGRfYmxrID0gKFJ4RF9ibG9ja190ICopIHRtcF92X2FkZHI7CisJCQlwcmVfcnhkX2Jsay0+cmVzZXJ2ZWRfMSA9IEVORF9PRl9CTE9DSzsJLyogbGFzdCBSeEQgCisJCQkJCQkJCSAqIG1hcmtlci4KKwkJCQkJCQkJICovCisjaWZuZGVmCUNPTkZJR18yQlVGRl9NT0RFCisJCQlwcmVfcnhkX2Jsay0+cmVzZXJ2ZWRfMl9wTmV4dF9SeERfYmxvY2sgPQorCQkJICAgICh1bnNpZ25lZCBsb25nKSB0bXBfdl9hZGRyX25leHQ7CisjZW5kaWYKKwkJCXByZV9yeGRfYmxrLT5wTmV4dF9SeERfQmxrX3BoeXNpY2FsID0KKwkJCSAgICAodTY0KSB0bXBfcF9hZGRyX25leHQ7CisJCX0KKwl9CisKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCS8qIAorCSAqIEFsbG9jYXRpb24gb2YgU3RvcmFnZXMgZm9yIGJ1ZmZlciBhZGRyZXNzZXMgaW4gMkJVRkYgbW9kZQorCSAqIGFuZCB0aGUgYnVmZmVycyBhcyB3ZWxsLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKKwkJYmxrX2NudCA9CisJCSAgICBjb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkIC8gKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpOworCQluaWMtPmJhW2ldID0ga21hbGxvYygoc2l6ZW9mKGJ1ZmZBZGRfdCAqKSAqIGJsa19jbnQpLAorCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghbmljLT5iYVtpXSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlmb3IgKGogPSAwOyBqIDwgYmxrX2NudDsgaisrKSB7CisJCQlpbnQgayA9IDA7CisJCQluaWMtPmJhW2ldW2pdID0ga21hbGxvYygoc2l6ZW9mKGJ1ZmZBZGRfdCkgKgorCQkJCQkJIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSksCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghbmljLT5iYVtpXVtqXSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCXdoaWxlIChrICE9IE1BWF9SWERTX1BFUl9CTE9DSykgeworCQkJCWJhID0gJm5pYy0+YmFbaV1bal1ba107CisKKwkJCQliYS0+YmFfMF9vcmcgPSBrbWFsbG9jCisJCQkJICAgIChCVUYwX0xFTiArIEFMSUdOX1NJWkUsIEdGUF9LRVJORUwpOworCQkJCWlmICghYmEtPmJhXzBfb3JnKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl0bXAgPSAodW5zaWduZWQgbG9uZykgYmEtPmJhXzBfb3JnOworCQkJCXRtcCArPSBBTElHTl9TSVpFOworCQkJCXRtcCAmPSB+KCh1bnNpZ25lZCBsb25nKSBBTElHTl9TSVpFKTsKKwkJCQliYS0+YmFfMCA9ICh2b2lkICopIHRtcDsKKworCQkJCWJhLT5iYV8xX29yZyA9IGttYWxsb2MKKwkJCQkgICAgKEJVRjFfTEVOICsgQUxJR05fU0laRSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCFiYS0+YmFfMV9vcmcpCisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBiYS0+YmFfMV9vcmc7CisJCQkJdG1wICs9IEFMSUdOX1NJWkU7CisJCQkJdG1wICY9IH4oKHVuc2lnbmVkIGxvbmcpIEFMSUdOX1NJWkUpOworCQkJCWJhLT5iYV8xID0gKHZvaWQgKikgdG1wOworCQkJCWsrKzsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJLyogQWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gb2YgU3RhdGlzdGljcyBibG9jayAqLworCXNpemUgPSBzaXplb2YoU3RhdEluZm9fdCk7CisJbWFjX2NvbnRyb2wtPnN0YXRzX21lbSA9IHBjaV9hbGxvY19jb25zaXN0ZW50CisJICAgIChuaWMtPnBkZXYsIHNpemUsICZtYWNfY29udHJvbC0+c3RhdHNfbWVtX3BoeSk7CisKKwlpZiAoIW1hY19jb250cm9sLT5zdGF0c19tZW0pIHsKKwkJLyogCisJCSAqIEluIGNhc2Ugb2YgZmFpbHVyZSwgZnJlZV9zaGFyZWRfbWVtKCkgaXMgY2FsbGVkLCB3aGljaCAKKwkJICogc2hvdWxkIGZyZWUgYW55IG1lbW9yeSB0aGF0IHdhcyBhbGxvY2VkIHRpbGwgdGhlIAorCQkgKiBmYWlsdXJlIGhhcHBlbmVkLgorCQkgKi8KKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1hY19jb250cm9sLT5zdGF0c19tZW1fc3ogPSBzaXplOworCisJdG1wX3ZfYWRkciA9IG1hY19jb250cm9sLT5zdGF0c19tZW07CisJbWFjX2NvbnRyb2wtPnN0YXRzX2luZm8gPSAoU3RhdEluZm9fdCAqKSB0bXBfdl9hZGRyOworCW1lbXNldCh0bXBfdl9hZGRyLCAwLCBzaXplKTsKKworCURCR19QUklOVChJTklUX0RCRywgIiVzOlJpbmcgTWVtIFBIWTogMHglbGx4XG4iLCBkZXYtPm5hbWUsCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdG1wX3BfYWRkcik7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqICAKKyAqIGZyZWVfc2hhcmVkX21lbSAtIEZyZWUgdGhlIGFsbG9jYXRlZCBNZW1vcnkgCisgKiBAbmljOiAgRGV2aWNlIHByaXZhdGUgdmFyaWFibGUuCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyB0byBmcmVlIGFsbCBtZW1vcnkgbG9jYXRpb25zIGFsbG9jYXRlZCBieQorICogdGhlIGluaXRfc2hhcmVkX21lbSgpIGZ1bmN0aW9uIGFuZCByZXR1cm4gaXQgdG8gdGhlIGtlcm5lbC4KKyAqLworCitzdGF0aWMgdm9pZCBmcmVlX3NoYXJlZF9tZW0oc3RydWN0IHMyaW9fbmljICpuaWMpCit7CisJaW50IGksIGosIGJsa19jbnQsIHNpemU7CisJdm9pZCAqdG1wX3ZfYWRkcjsKKwlkbWFfYWRkcl90IHRtcF9wX2FkZHI7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworCWludCBsc3Rfc2l6ZSwgbHN0X3Blcl9wYWdlOworCisKKwlpZiAoIW5pYykKKwkJcmV0dXJuOworCisJbWFjX2NvbnRyb2wgPSAmbmljLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmbmljLT5jb25maWc7CisKKwlsc3Rfc2l6ZSA9IChzaXplb2YoVHhEX3QpICogY29uZmlnLT5tYXhfdHhkcyk7CisJbHN0X3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gbHN0X3NpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT50eF9maWZvX251bTsgaSsrKSB7CisJCWludCBwYWdlX251bSA9IFRYRF9NRU1fUEFHRV9DTlQoY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4sCisJCQkJCQlsc3RfcGVyX3BhZ2UpOworCQlmb3IgKGogPSAwOyBqIDwgcGFnZV9udW07IGorKykgeworCQkJaW50IG1lbV9ibGtzID0gKGogKiBsc3RfcGVyX3BhZ2UpOworCQkJaWYgKCFuaWMtPmxpc3RfaW5mb1tpXVttZW1fYmxrc10ubGlzdF92aXJ0X2FkZHIpCisJCQkJYnJlYWs7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KG5pYy0+cGRldiwgUEFHRV9TSVpFLAorCQkJCQkgICAgbmljLT5saXN0X2luZm9baV1bbWVtX2Jsa3NdLgorCQkJCQkgICAgbGlzdF92aXJ0X2FkZHIsCisJCQkJCSAgICBuaWMtPmxpc3RfaW5mb1tpXVttZW1fYmxrc10uCisJCQkJCSAgICBsaXN0X3BoeV9hZGRyKTsKKwkJfQorCQlrZnJlZShuaWMtPmxpc3RfaW5mb1tpXSk7CisJfQorCisjaWZuZGVmIENPTkZJR18yQlVGRl9NT0RFCisJc2l6ZSA9IChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSAqIChzaXplb2YoUnhEX3QpKTsKKyNlbHNlCisJc2l6ZSA9IFNJWkVfT0ZfQkxPQ0s7CisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCWJsa19jbnQgPSBuaWMtPmJsb2NrX2NvdW50W2ldOworCQlmb3IgKGogPSAwOyBqIDwgYmxrX2NudDsgaisrKSB7CisJCQl0bXBfdl9hZGRyID0gbmljLT5yeF9ibG9ja3NbaV1bal0uYmxvY2tfdmlydF9hZGRyOworCQkJdG1wX3BfYWRkciA9IG5pYy0+cnhfYmxvY2tzW2ldW2pdLmJsb2NrX2RtYV9hZGRyOworCQkJaWYgKHRtcF92X2FkZHIgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQobmljLT5wZGV2LCBzaXplLAorCQkJCQkgICAgdG1wX3ZfYWRkciwgdG1wX3BfYWRkcik7CisJCX0KKwl9CisKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCS8qIEZyZWVpbmcgYnVmZmVyIHN0b3JhZ2UgYWRkcmVzc2VzIGluIDJCVUZGIG1vZGUuICovCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQlibGtfY250ID0KKwkJICAgIGNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQgLyAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCWlmICghbmljLT5iYVtpXSkKKwkJCWdvdG8gZW5kX2ZyZWU7CisJCWZvciAoaiA9IDA7IGogPCBibGtfY250OyBqKyspIHsKKwkJCWludCBrID0gMDsKKwkJCWlmICghbmljLT5iYVtpXVtqXSkgeworCQkJCWtmcmVlKG5pYy0+YmFbaV0pOworCQkJCWdvdG8gZW5kX2ZyZWU7CisJCQl9CisJCQl3aGlsZSAoayAhPSBNQVhfUlhEU19QRVJfQkxPQ0spIHsKKwkJCQlidWZmQWRkX3QgKmJhID0gJm5pYy0+YmFbaV1bal1ba107CisJCQkJaWYgKCFiYSB8fCAhYmEtPmJhXzBfb3JnIHx8ICFiYS0+YmFfMV9vcmcpCisJCQkJeworCQkJCQlrZnJlZShuaWMtPmJhW2ldKTsKKwkJCQkJa2ZyZWUobmljLT5iYVtpXVtqXSk7CisJCQkJCWlmKGJhLT5iYV8wX29yZykKKwkJCQkJCWtmcmVlKGJhLT5iYV8wX29yZyk7CisJCQkJCWlmKGJhLT5iYV8xX29yZykKKwkJCQkJCWtmcmVlKGJhLT5iYV8xX29yZyk7CisJCQkJCWdvdG8gZW5kX2ZyZWU7CisJCQkJfQorCQkJCWtmcmVlKGJhLT5iYV8wX29yZyk7CisJCQkJa2ZyZWUoYmEtPmJhXzFfb3JnKTsKKwkJCQlrKys7CisJCQl9CisJCQlrZnJlZShuaWMtPmJhW2ldW2pdKTsKKwkJfQorCQlrZnJlZShuaWMtPmJhW2ldKTsKKwl9CitlbmRfZnJlZToKKyNlbmRpZgorCisJaWYgKG1hY19jb250cm9sLT5zdGF0c19tZW0pIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChuaWMtPnBkZXYsCisJCQkJICAgIG1hY19jb250cm9sLT5zdGF0c19tZW1fc3osCisJCQkJICAgIG1hY19jb250cm9sLT5zdGF0c19tZW0sCisJCQkJICAgIG1hY19jb250cm9sLT5zdGF0c19tZW1fcGh5KTsKKwl9Cit9CisKKy8qKiAgCisgKiAgaW5pdF9uaWMgLSBJbml0aWFsaXphdGlvbiBvZiBoYXJkd2FyZSAKKyAqICBAbmljOiBkZXZpY2UgcGVpdmF0ZSB2YXJpYWJsZQorICogIERlc2NyaXB0aW9uOiBUaGUgZnVuY3Rpb24gc2VxdWVudGlhbGx5IGNvbmZpZ3VyZXMgZXZlcnkgYmxvY2sgCisgKiAgb2YgdGhlIEgvVyBmcm9tIHRoZWlyIHJlc2V0IHZhbHVlcy4gCisgKiAgUmV0dXJuIFZhbHVlOiAgU1VDQ0VTUyBvbiBzdWNjZXNzIGFuZCAKKyAqICAnLTEnIG9uIGZhaWx1cmUgKGVuZGlhbiBzZXR0aW5ncyBpbmNvcnJlY3QpLgorICovCisKK3N0YXRpYyBpbnQgaW5pdF9uaWMoc3RydWN0IHMyaW9fbmljICpuaWMpCit7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmljLT5kZXY7CisJcmVnaXN0ZXIgdTY0IHZhbDY0ID0gMDsKKwl2b2lkIF9faW9tZW0gKmFkZDsKKwl1MzIgdGltZTsKKwlpbnQgaSwgajsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisJaW50IG1kaW9fY250ID0gMCwgZHR4X2NudCA9IDA7CisJdW5zaWduZWQgbG9uZyBsb25nIG1lbV9zaGFyZTsKKworCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJm5pYy0+Y29uZmlnOworCisJLyogSW5pdGlhbGl6ZSBzd2FwcGVyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlpZiAoczJpb19zZXRfc3dhcHBlcihuaWMpKSB7CisJCURCR19QUklOVChFUlJfREJHLCJFUlJPUjogU2V0dGluZyBTd2FwcGVyIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBSZW1vdmUgWEdYUyBmcm9tIHJlc2V0IHN0YXRlICovCisJdmFsNjQgPSAwOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnN3X3Jlc2V0KTsKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5zd19yZXNldCk7CisJbXNsZWVwKDUwMCk7CisKKwkvKiAgRW5hYmxlIFJlY2VpdmluZyBicm9hZGNhc3RzICovCisJYWRkID0gJmJhcjAtPm1hY19jZmc7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2NmZyk7CisJdmFsNjQgfD0gTUFDX1JNQUNfQkNBU1RfRU5BQkxFOworCXdyaXRlcShSTUFDX0NGR19LRVkoMHg0QzBEKSwgJmJhcjAtPnJtYWNfY2ZnX2tleSk7CisJd3JpdGVsKCh1MzIpIHZhbDY0LCBhZGQpOworCXdyaXRlcShSTUFDX0NGR19LRVkoMHg0QzBEKSwgJmJhcjAtPnJtYWNfY2ZnX2tleSk7CisJd3JpdGVsKCh1MzIpICh2YWw2NCA+PiAzMiksIChhZGQgKyA0KSk7CisKKwkvKiBSZWFkIHJlZ2lzdGVycyBpbiBhbGwgYmxvY2tzICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2ludF9tYXNrKTsKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tY19pbnRfbWFzayk7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+eGd4c19pbnRfbWFzayk7CisKKwkvKiAgU2V0IE1UVSAqLworCXZhbDY0ID0gZGV2LT5tdHU7CisJd3JpdGVxKHZCSVQodmFsNjQsIDIsIDE0KSwgJmJhcjAtPnJtYWNfbWF4X3B5bGRfbGVuKTsKKworCS8qIAorCSAqIENvbmZpZ3VyaW5nIHRoZSBYQVVJIEludGVyZmFjZSBvZiBYZW5hLiAKKwkgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBUbyBDb25maWd1cmUgdGhlIFhlbmEncyBYQVVJLCBvbmUgaGFzIHRvIHdyaXRlIGEgc2VyaWVzIAorCSAqIG9mIDY0IGJpdCB2YWx1ZXMgaW50byB0d28gcmVnaXN0ZXJzIGluIGEgcGFydGljdWxhciAKKwkgKiBzZXF1ZW5jZS4gSGVuY2UgYSBtYWNybyAnU1dJVENIX1NJR04nIGhhcyBiZWVuIGRlZmluZWQgCisJICogd2hpY2ggd2lsbCBiZSBkZWZpbmVkIGluIHRoZSBhcnJheSBvZiBjb25maWd1cmF0aW9uIHZhbHVlcyAKKwkgKiAoZGVmYXVsdF9kdHhfY2ZnICYgZGVmYXVsdF9tZGlvX2NmZykgYXQgYXBwcm9wcmlhdGUgcGxhY2VzIAorCSAqIHRvIHN3aXRjaCB3cml0aW5nIGZyb20gb25lIHJlZ3NpdGVyIHRvIGFub3RoZXIuIFdlIGNvbnRpbnVlIAorCSAqIHdyaXRpbmcgdGhlc2UgdmFsdWVzIHVudGlsIHdlIGVuY291bnRlciB0aGUgJ0VORF9TSUdOJyBtYWNyby4KKwkgKiBGb3IgZXhhbXBsZSwgQWZ0ZXIgbWFraW5nIGEgc2VyaWVzIG9mIDIxIHdyaXRlcyBpbnRvIAorCSAqIGR0eF9jb250cm9sIHJlZ2lzdGVyIHRoZSAnU1dJVENIX1NJR04nIGFwcGVhcnMgYW5kIGhlbmNlIHdlIAorCSAqIHN0YXJ0IHdyaXRpbmcgaW50byBtZGlvX2NvbnRyb2wgdW50aWwgd2UgZW5jb3VudGVyIEVORF9TSUdOLgorCSAqLworCXdoaWxlICgxKSB7CisJICAgICAgZHR4X2NmZzoKKwkJd2hpbGUgKGRlZmF1bHRfZHR4X2NmZ1tkdHhfY250XSAhPSBFTkRfU0lHTikgeworCQkJaWYgKGRlZmF1bHRfZHR4X2NmZ1tkdHhfY250XSA9PSBTV0lUQ0hfU0lHTikgeworCQkJCWR0eF9jbnQrKzsKKwkJCQlnb3RvIG1kaW9fY2ZnOworCQkJfQorCQkJU1BFQ0lBTF9SRUdfV1JJVEUoZGVmYXVsdF9kdHhfY2ZnW2R0eF9jbnRdLAorCQkJCQkgICZiYXIwLT5kdHhfY29udHJvbCwgVUYpOworCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+ZHR4X2NvbnRyb2wpOworCQkJZHR4X2NudCsrOworCQl9CisJICAgICAgbWRpb19jZmc6CisJCXdoaWxlIChkZWZhdWx0X21kaW9fY2ZnW21kaW9fY250XSAhPSBFTkRfU0lHTikgeworCQkJaWYgKGRlZmF1bHRfbWRpb19jZmdbbWRpb19jbnRdID09IFNXSVRDSF9TSUdOKSB7CisJCQkJbWRpb19jbnQrKzsKKwkJCQlnb3RvIGR0eF9jZmc7CisJCQl9CisJCQlTUEVDSUFMX1JFR19XUklURShkZWZhdWx0X21kaW9fY2ZnW21kaW9fY250XSwKKwkJCQkJICAmYmFyMC0+bWRpb19jb250cm9sLCBVRik7CisJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tZGlvX2NvbnRyb2wpOworCQkJbWRpb19jbnQrKzsKKwkJfQorCQlpZiAoKGRlZmF1bHRfZHR4X2NmZ1tkdHhfY250XSA9PSBFTkRfU0lHTikgJiYKKwkJICAgIChkZWZhdWx0X21kaW9fY2ZnW21kaW9fY250XSA9PSBFTkRfU0lHTikpIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZ290byBkdHhfY2ZnOworCQl9CisJfQorCisJLyogIFR4IERNQSBJbml0aWFsaXphdGlvbiAqLworCXZhbDY0ID0gMDsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8wKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8xKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8yKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8zKTsKKworCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBjb25maWctPnR4X2ZpZm9fbnVtOyBpKyspIHsKKwkJdmFsNjQgfD0KKwkJICAgIHZCSVQoY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4gLSAxLCAoKGkgKiAzMikgKyAxOSksCisJCQkgMTMpIHwgdkJJVChjb25maWctPnR4X2NmZ1tpXS5maWZvX3ByaW9yaXR5LAorCQkJCSAgICAoKGkgKiAzMikgKyA1KSwgMyk7CisKKwkJaWYgKGkgPT0gKGNvbmZpZy0+dHhfZmlmb19udW0gLSAxKSkgeworCQkJaWYgKGkgJSAyID09IDApCisJCQkJaSsrOworCQl9CisKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMToKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4X2ZpZm9fcGFydGl0aW9uXzApOworCQkJdmFsNjQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4X2ZpZm9fcGFydGl0aW9uXzEpOworCQkJdmFsNjQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4X2ZpZm9fcGFydGl0aW9uXzIpOworCQkJdmFsNjQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4X2ZpZm9fcGFydGl0aW9uXzMpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBFbmFibGUgVHggRklGTyBwYXJ0aXRpb24gMC4gKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8wKTsKKwl2YWw2NCB8PSBCSVQoMCk7CS8qIFRvIGVuYWJsZSB0aGUgRklGTyBwYXJ0aXRpb24uICovCisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+dHhfZmlmb19wYXJ0aXRpb25fMCk7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8wKTsKKwlEQkdfUFJJTlQoSU5JVF9EQkcsICJGaWZvIHBhcnRpdGlvbiBhdDogMHglcCBpczogMHglbGx4XG4iLAorCQkgICZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8wLCAodW5zaWduZWQgbG9uZyBsb25nKSB2YWw2NCk7CisKKwkvKiAKKwkgKiBJbml0aWFsaXphdGlvbiBvZiBUeF9QQV9DT05GSUcgcmVnaXN0ZXIgdG8gaWdub3JlIHBhY2tldCAKKwkgKiBpbnRlZ3JpdHkgY2hlY2tpbmcuCisJICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+dHhfcGFfY2ZnKTsKKwl2YWw2NCB8PSBUWF9QQV9DRkdfSUdOT1JFX0ZSTV9FUlIgfCBUWF9QQV9DRkdfSUdOT1JFX1NOQVBfT1VJIHwKKwkgICAgVFhfUEFfQ0ZHX0lHTk9SRV9MTENfQ1RSTCB8IFRYX1BBX0NGR19JR05PUkVfTDJfRVJSOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4X3BhX2NmZyk7CisKKwkvKiBSeCBETUEgaW50aWFsaXphdGlvbi4gKi8KKwl2YWw2NCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQl2YWw2NCB8PQorCQkgICAgdkJJVChjb25maWctPnJ4X2NmZ1tpXS5yaW5nX3ByaW9yaXR5LCAoNSArIChpICogOCkpLAorCQkJIDMpOworCX0KKwl3cml0ZXEodmFsNjQsICZiYXIwLT5yeF9xdWV1ZV9wcmlvcml0eSk7CisKKwkvKiAKKwkgKiBBbGxvY2F0aW5nIGVxdWFsIHNoYXJlIG9mIG1lbW9yeSB0byBhbGwgdGhlIAorCSAqIGNvbmZpZ3VyZWQgUmluZ3MuCisJICovCisJdmFsNjQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCW1lbV9zaGFyZSA9ICg2NCAvIGNvbmZpZy0+cnhfcmluZ19udW0gKworCQkJCSAgICAgNjQgJSBjb25maWctPnJ4X3JpbmdfbnVtKTsKKwkJCXZhbDY0IHw9IFJYX1FVRVVFX0NGR19RMF9TWihtZW1fc2hhcmUpOworCQkJY29udGludWU7CisJCWNhc2UgMToKKwkJCW1lbV9zaGFyZSA9ICg2NCAvIGNvbmZpZy0+cnhfcmluZ19udW0pOworCQkJdmFsNjQgfD0gUlhfUVVFVUVfQ0ZHX1ExX1NaKG1lbV9zaGFyZSk7CisJCQljb250aW51ZTsKKwkJY2FzZSAyOgorCQkJbWVtX3NoYXJlID0gKDY0IC8gY29uZmlnLT5yeF9yaW5nX251bSk7CisJCQl2YWw2NCB8PSBSWF9RVUVVRV9DRkdfUTJfU1oobWVtX3NoYXJlKTsKKwkJCWNvbnRpbnVlOworCQljYXNlIDM6CisJCQltZW1fc2hhcmUgPSAoNjQgLyBjb25maWctPnJ4X3JpbmdfbnVtKTsKKwkJCXZhbDY0IHw9IFJYX1FVRVVFX0NGR19RM19TWihtZW1fc2hhcmUpOworCQkJY29udGludWU7CisJCWNhc2UgNDoKKwkJCW1lbV9zaGFyZSA9ICg2NCAvIGNvbmZpZy0+cnhfcmluZ19udW0pOworCQkJdmFsNjQgfD0gUlhfUVVFVUVfQ0ZHX1E0X1NaKG1lbV9zaGFyZSk7CisJCQljb250aW51ZTsKKwkJY2FzZSA1OgorCQkJbWVtX3NoYXJlID0gKDY0IC8gY29uZmlnLT5yeF9yaW5nX251bSk7CisJCQl2YWw2NCB8PSBSWF9RVUVVRV9DRkdfUTVfU1oobWVtX3NoYXJlKTsKKwkJCWNvbnRpbnVlOworCQljYXNlIDY6CisJCQltZW1fc2hhcmUgPSAoNjQgLyBjb25maWctPnJ4X3JpbmdfbnVtKTsKKwkJCXZhbDY0IHw9IFJYX1FVRVVFX0NGR19RNl9TWihtZW1fc2hhcmUpOworCQkJY29udGludWU7CisJCWNhc2UgNzoKKwkJCW1lbV9zaGFyZSA9ICg2NCAvIGNvbmZpZy0+cnhfcmluZ19udW0pOworCQkJdmFsNjQgfD0gUlhfUVVFVUVfQ0ZHX1E3X1NaKG1lbV9zaGFyZSk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwl3cml0ZXEodmFsNjQsICZiYXIwLT5yeF9xdWV1ZV9jZmcpOworCisJLyogCisJICogSW5pdGlhbGl6aW5nIHRoZSBUeCByb3VuZCByb2JpbiByZWdpc3RlcnMgdG8gMC4KKwkgKiBGaWxsaW5nIFR4IGFuZCBSeCByb3VuZCByb2JpbiByZWdpc3RlcnMgYXMgcGVyIHRoZSAKKwkgKiBudW1iZXIgb2YgRklGT3MgYW5kIFJpbmdzIGlzIHN0aWxsIFRPRE8uCisJICovCisJd3JpdGVxKDAsICZiYXIwLT50eF93X3JvdW5kX3JvYmluXzApOworCXdyaXRlcSgwLCAmYmFyMC0+dHhfd19yb3VuZF9yb2Jpbl8xKTsKKwl3cml0ZXEoMCwgJmJhcjAtPnR4X3dfcm91bmRfcm9iaW5fMik7CisJd3JpdGVxKDAsICZiYXIwLT50eF93X3JvdW5kX3JvYmluXzMpOworCXdyaXRlcSgwLCAmYmFyMC0+dHhfd19yb3VuZF9yb2Jpbl80KTsKKworCS8qIAorCSAqIFRPRE8KKwkgKiBEaXNhYmxlIFJ4IHN0ZWVyaW5nLiBIYXJkIGNvZGluZyBhbGwgcGFja2V0cyBiZSBzdGVlcmVkIHRvCisJICogUXVldWUgMCBmb3Igbm93LiAKKwkgKi8KKwl2YWw2NCA9IDB4ODA4MDgwODA4MDgwODA4MFVMTDsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5ydHNfcW9zX3N0ZWVyaW5nKTsKKworCS8qIFVEUCBGaXggKi8KKwl2YWw2NCA9IDA7CisJZm9yIChpID0gMTsgaSA8IDg7IGkrKykKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnRzX2ZybV9sZW5fbltpXSk7CisKKwkvKiBTZXQgcnRzX2ZybV9sZW4gcmVnaXN0ZXIgZm9yIGZpZm8gMCAqLworCXdyaXRlcShNQUNfUlRTX0ZSTV9MRU5fU0VUKGRldi0+bXR1ICsgMjIpLAorCSAgICAgICAmYmFyMC0+cnRzX2ZybV9sZW5fblswXSk7CisKKwkvKiBFbmFibGUgc3RhdGlzdGljcyAqLworCXdyaXRlcShtYWNfY29udHJvbC0+c3RhdHNfbWVtX3BoeSwgJmJhcjAtPnN0YXRfYWRkcik7CisJdmFsNjQgPSBTRVRfVVBEVF9QRVJJT0QoU3RhdHNfcmVmcmVzaF90aW1lKSB8CisJICAgIFNUQVRfQ0ZHX1NUQVRfUk8gfCBTVEFUX0NGR19TVEFUX0VOOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnN0YXRfY2ZnKTsKKworCS8qIAorCSAqIEluaXRpYWxpemluZyB0aGUgc2FtcGxpbmcgcmF0ZSBmb3IgdGhlIGRldmljZSB0byBjYWxjdWxhdGUgdGhlCisJICogYmFuZHdpZHRoIHV0aWxpemF0aW9uLgorCSAqLworCXZhbDY0ID0gTUFDX1RYX0xJTktfVVRJTF9WQUwodG1hY191dGlsX3BlcmlvZCkgfAorCSAgICBNQUNfUlhfTElOS19VVElMX1ZBTChybWFjX3V0aWxfcGVyaW9kKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5tYWNfbGlua191dGlsKTsKKworCisJLyogCisJICogSW5pdGlhbGl6aW5nIHRoZSBUcmFuc21pdCBhbmQgUmVjZWl2ZSBUcmFmZmljIEludGVycnVwdCAKKwkgKiBTY2hlbWUuCisJICovCisJLyogVFRJIEluaXRpYWxpemF0aW9uLiBEZWZhdWx0IFR4IHRpbWVyIGdldHMgdXMgYWJvdXQKKwkgKiAyNTAgaW50ZXJydXB0cyBwZXIgc2VjLiBDb250aW51b3VzIGludGVycnVwdHMgYXJlIGVuYWJsZWQKKwkgKiBieSBkZWZhdWx0LgorCSAqLworCXZhbDY0ID0gVFRJX0RBVEExX01FTV9UWF9USU1FUl9WQUwoMHgyMDc4KSB8CisJICAgIFRUSV9EQVRBMV9NRU1fVFhfVVJOR19BKDB4QSkgfAorCSAgICBUVElfREFUQTFfTUVNX1RYX1VSTkdfQigweDEwKSB8CisJICAgIFRUSV9EQVRBMV9NRU1fVFhfVVJOR19DKDB4MzApIHwgVFRJX0RBVEExX01FTV9UWF9USU1FUl9BQ19FTiB8CisJCVRUSV9EQVRBMV9NRU1fVFhfVElNRVJfQ0lfRU47CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+dHRpX2RhdGExX21lbSk7CisKKwl2YWw2NCA9IFRUSV9EQVRBMl9NRU1fVFhfVUZDX0EoMHgxMCkgfAorCSAgICBUVElfREFUQTJfTUVNX1RYX1VGQ19CKDB4MjApIHwKKwkgICAgVFRJX0RBVEEyX01FTV9UWF9VRkNfQygweDQwKSB8IFRUSV9EQVRBMl9NRU1fVFhfVUZDX0QoMHg4MCk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+dHRpX2RhdGEyX21lbSk7CisKKwl2YWw2NCA9IFRUSV9DTURfTUVNX1dFIHwgVFRJX0NNRF9NRU1fU1RST0JFX05FV19DTUQ7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+dHRpX2NvbW1hbmRfbWVtKTsKKworCS8qIAorCSAqIE9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMsIHRoZSBTdHJvYmUgYml0IG9mIHRoZSBjb21tYW5kCisJICogcmVnaXN0ZXIgd2lsbCBiZSByZXNldC4gV2UgcG9sbCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGNvbmRpdGlvbgorCSAqIFdlIHdhaXQgZm9yIGEgbWF4aW11bSBvZiA1MDBtcyBmb3IgdGhlIG9wZXJhdGlvbiB0byBjb21wbGV0ZSwKKwkgKiBpZiBpdCdzIG5vdCBjb21wbGV0ZSBieSB0aGVuIHdlIHJldHVybiBlcnJvci4KKwkgKi8KKwl0aW1lID0gMDsKKwl3aGlsZSAoVFJVRSkgeworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT50dGlfY29tbWFuZF9tZW0pOworCQlpZiAoISh2YWw2NCAmIFRUSV9DTURfTUVNX1NUUk9CRV9ORVdfQ01EKSkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHRpbWUgPiAxMCkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogVFRJIGluaXQgRmFpbGVkXG4iLAorCQkJCSAgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltc2xlZXAoNTApOworCQl0aW1lKys7CisJfQorCisJLyogUlRJIEluaXRpYWxpemF0aW9uICovCisJdmFsNjQgPSBSVElfREFUQTFfTUVNX1JYX1RJTUVSX1ZBTCgweEZGRikgfAorCSAgICBSVElfREFUQTFfTUVNX1JYX1VSTkdfQSgweEEpIHwKKwkgICAgUlRJX0RBVEExX01FTV9SWF9VUk5HX0IoMHgxMCkgfAorCSAgICBSVElfREFUQTFfTUVNX1JYX1VSTkdfQygweDMwKSB8IFJUSV9EQVRBMV9NRU1fUlhfVElNRVJfQUNfRU47CisKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5ydGlfZGF0YTFfbWVtKTsKKworCXZhbDY0ID0gUlRJX0RBVEEyX01FTV9SWF9VRkNfQSgweDEpIHwKKwkgICAgUlRJX0RBVEEyX01FTV9SWF9VRkNfQigweDIpIHwKKwkgICAgUlRJX0RBVEEyX01FTV9SWF9VRkNfQygweDQwKSB8IFJUSV9EQVRBMl9NRU1fUlhfVUZDX0QoMHg4MCk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnRpX2RhdGEyX21lbSk7CisKKwl2YWw2NCA9IFJUSV9DTURfTUVNX1dFIHwgUlRJX0NNRF9NRU1fU1RST0JFX05FV19DTUQ7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnRpX2NvbW1hbmRfbWVtKTsKKworCS8qIAorCSAqIE9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMsIHRoZSBTdHJvYmUgYml0IG9mIHRoZSBjb21tYW5kCisJICogcmVnaXN0ZXIgd2lsbCBiZSByZXNldC4gV2UgcG9sbCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGNvbmRpdGlvbgorCSAqIFdlIHdhaXQgZm9yIGEgbWF4aW11bSBvZiA1MDBtcyBmb3IgdGhlIG9wZXJhdGlvbiB0byBjb21wbGV0ZSwKKwkgKiBpZiBpdCdzIG5vdCBjb21wbGV0ZSBieSB0aGVuIHdlIHJldHVybiBlcnJvci4KKwkgKi8KKwl0aW1lID0gMDsKKwl3aGlsZSAoVFJVRSkgeworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ydGlfY29tbWFuZF9tZW0pOworCQlpZiAoISh2YWw2NCAmIFRUSV9DTURfTUVNX1NUUk9CRV9ORVdfQ01EKSkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHRpbWUgPiAxMCkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogUlRJIGluaXQgRmFpbGVkXG4iLAorCQkJCSAgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl0aW1lKys7CisJCW1zbGVlcCg1MCk7CisJfQorCisJLyogCisJICogSW5pdGlhbGl6aW5nIHByb3BlciB2YWx1ZXMgYXMgUGF1c2UgdGhyZXNob2xkIGludG8gYWxsIAorCSAqIHRoZSA4IFF1ZXVlcyBvbiBSeCBzaWRlLgorCSAqLworCXdyaXRlcSgweGZmYmJmZmJiZmZiYmZmYmJVTEwsICZiYXIwLT5tY19wYXVzZV90aHJlc2hfcTBxMyk7CisJd3JpdGVxKDB4ZmZiYmZmYmJmZmJiZmZiYlVMTCwgJmJhcjAtPm1jX3BhdXNlX3RocmVzaF9xNHE3KTsKKworCS8qIERpc2FibGUgUk1BQyBQQUQgU1RSSVBQSU5HICovCisJYWRkID0gJmJhcjAtPm1hY19jZmc7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2NmZyk7CisJdmFsNjQgJj0gfihNQUNfQ0ZHX1JNQUNfU1RSSVBfUEFEKTsKKwl3cml0ZXEoUk1BQ19DRkdfS0VZKDB4NEMwRCksICZiYXIwLT5ybWFjX2NmZ19rZXkpOworCXdyaXRlbCgodTMyKSAodmFsNjQpLCBhZGQpOworCXdyaXRlcShSTUFDX0NGR19LRVkoMHg0QzBEKSwgJmJhcjAtPnJtYWNfY2ZnX2tleSk7CisJd3JpdGVsKCh1MzIpICh2YWw2NCA+PiAzMiksIChhZGQgKyA0KSk7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2NmZyk7CisKKwkvKiAKKwkgKiBTZXQgdGhlIHRpbWUgdmFsdWUgdG8gYmUgaW5zZXJ0ZWQgaW4gdGhlIHBhdXNlIGZyYW1lIAorCSAqIGdlbmVyYXRlZCBieSB4ZW5hLgorCSAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnJtYWNfcGF1c2VfY2ZnKTsKKwl2YWw2NCAmPSB+KFJNQUNfUEFVU0VfSEdfUFRJTUUoMHhmZmZmKSk7CisJdmFsNjQgfD0gUk1BQ19QQVVTRV9IR19QVElNRShuaWMtPm1hY19jb250cm9sLnJtYWNfcGF1c2VfdGltZSk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cm1hY19wYXVzZV9jZmcpOworCisJLyogCisJICogU2V0IHRoZSBUaHJlc2hvbGQgTGltaXQgZm9yIEdlbmVyYXRpbmcgdGhlIHBhdXNlIGZyYW1lCisJICogSWYgdGhlIGFtb3VudCBvZiBkYXRhIGluIGFueSBRdWV1ZSBleGNlZWRzIHJhdGlvIG9mCisJICogKG1hY19jb250cm9sLm1jX3BhdXNlX3RocmVzaG9sZF9xMHEzIG9yIHE0cTcpLzI1NgorCSAqIHBhdXNlIGZyYW1lIGlzIGdlbmVyYXRlZAorCSAqLworCXZhbDY0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXZhbDY0IHw9CisJCSAgICAoKCh1NjQpIDB4RkYwMCB8IG5pYy0+bWFjX2NvbnRyb2wuCisJCSAgICAgIG1jX3BhdXNlX3RocmVzaG9sZF9xMHEzKQorCQkgICAgIDw8IChpICogMiAqIDgpKTsKKwl9CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWNfcGF1c2VfdGhyZXNoX3EwcTMpOworCisJdmFsNjQgPSAwOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJdmFsNjQgfD0KKwkJICAgICgoKHU2NCkgMHhGRjAwIHwgbmljLT5tYWNfY29udHJvbC4KKwkJICAgICAgbWNfcGF1c2VfdGhyZXNob2xkX3E0cTcpCisJCSAgICAgPDwgKGkgKiAyICogOCkpOworCX0KKwl3cml0ZXEodmFsNjQsICZiYXIwLT5tY19wYXVzZV90aHJlc2hfcTRxNyk7CisKKwkvKiAKKwkgKiBUeERNQSB3aWxsIHN0b3AgUmVhZCByZXF1ZXN0IGlmIHRoZSBudW1iZXIgb2YgcmVhZCBzcGxpdCBoYXMgCisJICogZXhjZWVkZWQgdGhlIGxpbWl0IHBvaW50ZWQgYnkgc2hhcmVkX3NwbGl0cworCSAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnBpY19jb250cm9sKTsKKwl2YWw2NCB8PSBQSUNfQ05UTF9TSEFSRURfU1BMSVRTKHNoYXJlZF9zcGxpdHMpOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnBpY19jb250cm9sKTsKKworCXJldHVybiBTVUNDRVNTOworfQorCisvKiogIAorICogIGVuX2Rpc19hYmxlX25pY19pbnRycyAtIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBpbnRlcnJ1cHRzIAorICogIEBuaWM6IGRldmljZSBwcml2YXRlIHZhcmlhYmxlLAorICogIEBtYXNrOiBBIG1hc2sgaW5kaWNhdGluZyB3aGljaCBJbnRyIGJsb2NrIG11c3QgYmUgbW9kaWZpZWQgYW5kLAorICogIEBmbGFnOiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBJbnRycy4KKyAqICBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiB3aWxsIGVpdGhlciBkaXNhYmxlIG9yIGVuYWJsZSB0aGUgaW50ZXJydXB0cworICogIGRlcGVuZGluZyBvbiB0aGUgZmxhZyBhcmd1bWVudC4gVGhlIG1hc2sgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gCisgKiAgZW5hYmxlL2Rpc2FibGUgYW55IEludHIgYmxvY2suIAorICogIFJldHVybiBWYWx1ZTogTk9ORS4KKyAqLworCitzdGF0aWMgdm9pZCBlbl9kaXNfYWJsZV9uaWNfaW50cnMoc3RydWN0IHMyaW9fbmljICpuaWMsIHUxNiBtYXNrLCBpbnQgZmxhZykKK3sKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOworCXJlZ2lzdGVyIHU2NCB2YWw2NCA9IDAsIHRlbXA2NCA9IDA7CisKKwkvKiAgVG9wIGxldmVsIGludGVycnVwdCBjbGFzc2lmaWNhdGlvbiAqLworCS8qICBQSUMgSW50ZXJydXB0cyAqLworCWlmICgobWFzayAmIChUWF9QSUNfSU5UUiB8IFJYX1BJQ19JTlRSKSkpIHsKKwkJLyogIEVuYWJsZSBQSUMgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIHJlZ2lzdGVyICovCisJCXZhbDY0ID0gVFhQSUNfSU5UX00gfCBQSUNfUlhfSU5UX007CisJCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgeworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJLyogIAorCQkJICogRGlzYWJsZWQgYWxsIFBDSVgsIEZsYXNoLCBNRElPLCBJSUMgYW5kIEdQSU8KKwkJCSAqIGludGVycnVwdHMgZm9yIG5vdy4gCisJCQkgKiBUT0RPIAorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT5waWNfaW50X21hc2spOworCQkJLyogCisJCQkgKiBObyBNU0kgU3VwcG9ydCBpcyBhdmFpbGFibGUgcHJlc2VudGx5LCBzbyBUVEkgYW5kCisJCQkgKiBSVEkgaW50ZXJydXB0cyBhcmUgYWxzbyBkaXNhYmxlZC4KKwkJCSAqLworCQl9IGVsc2UgaWYgKGZsYWcgPT0gRElTQUJMRV9JTlRSUykgeworCQkJLyogIAorCQkJICogRGlzYWJsZSBQSUMgSW50cnMgaW4gdGhlIGdlbmVyYWwgCisJCQkgKiBpbnRyIG1hc2sgcmVnaXN0ZXIgCisJCQkgKi8KKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPnBpY19pbnRfbWFzayk7CisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQl2YWw2NCB8PSB0ZW1wNjQ7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJfQorCX0KKworCS8qICBETUEgSW50ZXJydXB0cyAqLworCS8qICBFbmFibGluZy9EaXNhYmxpbmcgVHggRE1BIGludGVycnVwdHMgKi8KKwlpZiAobWFzayAmIFRYX0RNQV9JTlRSKSB7CisJCS8qIEVuYWJsZSBUeERNQSBJbnRycyBpbiB0aGUgZ2VuZXJhbCBpbnRyIG1hc2sgcmVnaXN0ZXIgKi8KKwkJdmFsNjQgPSBUWERNQV9JTlRfTTsKKwkJaWYgKGZsYWcgPT0gRU5BQkxFX0lOVFJTKSB7CisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQl0ZW1wNjQgJj0gfigodTY0KSB2YWw2NCk7CisJCQl3cml0ZXEodGVtcDY0LCAmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQkvKiAKKwkJCSAqIEtlZXAgYWxsIGludGVycnVwdHMgb3RoZXIgdGhhbiBQRkMgaW50ZXJydXB0IAorCQkJICogYW5kIFBDQyBpbnRlcnJ1cHQgZGlzYWJsZWQgaW4gRE1BIGxldmVsLgorCQkJICovCisJCQl2YWw2NCA9IERJU0FCTEVfQUxMX0lOVFJTICYgfihUWERNQV9QRkNfSU5UX00gfAorCQkJCQkJICAgICAgVFhETUFfUENDX0lOVF9NKTsKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4ZG1hX2ludF9tYXNrKTsKKwkJCS8qIAorCQkJICogRW5hYmxlIG9ubHkgdGhlIE1JU0MgZXJyb3IgMSBpbnRlcnJ1cHQgaW4gUEZDIGJsb2NrIAorCQkJICovCisJCQl2YWw2NCA9IERJU0FCTEVfQUxMX0lOVFJTICYgKH5QRkNfTUlTQ19FUlJfMSk7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5wZmNfZXJyX21hc2spOworCQkJLyogCisJCQkgKiBFbmFibGUgb25seSB0aGUgRkJfRUNDIGVycm9yIGludGVycnVwdCBpbiBQQ0MgYmxvY2sgCisJCQkgKi8KKwkJCXZhbDY0ID0gRElTQUJMRV9BTExfSU5UUlMgJiAoflBDQ19GQl9FQ0NfRVJSKTsKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnBjY19lcnJfbWFzayk7CisJCX0gZWxzZSBpZiAoZmxhZyA9PSBESVNBQkxFX0lOVFJTKSB7CisJCQkvKiAKKwkJCSAqIERpc2FibGUgVHhETUEgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIAorCQkJICogcmVnaXN0ZXIgCisJCQkgKi8KKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPnR4ZG1hX2ludF9tYXNrKTsKKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPnBmY19lcnJfbWFzayk7CisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQl2YWw2NCB8PSB0ZW1wNjQ7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJfQorCX0KKworCS8qICBFbmFibGluZy9EaXNhYmxpbmcgUnggRE1BIGludGVycnVwdHMgKi8KKwlpZiAobWFzayAmIFJYX0RNQV9JTlRSKSB7CisJCS8qICBFbmFibGUgUnhETUEgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIHJlZ2lzdGVyICovCisJCXZhbDY0ID0gUlhETUFfSU5UX007CisJCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgeworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJLyogCisJCQkgKiBBbGwgUnhETUEgYmxvY2sgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgZm9yIG5vdyAKKwkJCSAqIFRPRE8gCisJCQkgKi8KKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPnJ4ZG1hX2ludF9tYXNrKTsKKwkJfSBlbHNlIGlmIChmbGFnID09IERJU0FCTEVfSU5UUlMpIHsKKwkJCS8qICAKKwkJCSAqIERpc2FibGUgUnhETUEgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIAorCQkJICogcmVnaXN0ZXIgCisJCQkgKi8KKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPnJ4ZG1hX2ludF9tYXNrKTsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXZhbDY0IHw9IHRlbXA2NDsKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQl9CisJfQorCisJLyogIE1BQyBJbnRlcnJ1cHRzICovCisJLyogIEVuYWJsaW5nL0Rpc2FibGluZyBNQUMgaW50ZXJydXB0cyAqLworCWlmIChtYXNrICYgKFRYX01BQ19JTlRSIHwgUlhfTUFDX0lOVFIpKSB7CisJCXZhbDY0ID0gVFhNQUNfSU5UX00gfCBSWE1BQ19JTlRfTTsKKwkJaWYgKGZsYWcgPT0gRU5BQkxFX0lOVFJTKSB7CisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQl0ZW1wNjQgJj0gfigodTY0KSB2YWw2NCk7CisJCQl3cml0ZXEodGVtcDY0LCAmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQkvKiAKKwkJCSAqIEFsbCBNQUMgYmxvY2sgZXJyb3IgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgZm9yIG5vdyAKKwkJCSAqIGV4Y2VwdCB0aGUgbGluayBzdGF0dXMgY2hhbmdlIGludGVycnVwdC4KKwkJCSAqIFRPRE8KKwkJCSAqLworCQkJdmFsNjQgPSBNQUNfSU5UX1NUQVRVU19STUFDX0lOVDsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5tYWNfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPm1hY19pbnRfbWFzayk7CisKKwkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1hY19ybWFjX2Vycl9tYXNrKTsKKwkJCXZhbDY0ICY9IH4oKHU2NCkgUk1BQ19MSU5LX1NUQVRFX0NIQU5HRV9JTlQpOworCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWFjX3JtYWNfZXJyX21hc2spOworCQl9IGVsc2UgaWYgKGZsYWcgPT0gRElTQUJMRV9JTlRSUykgeworCQkJLyogIAorCQkJICogRGlzYWJsZSBNQUMgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIHJlZ2lzdGVyIAorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT5tYWNfaW50X21hc2spOworCQkJd3JpdGVxKERJU0FCTEVfQUxMX0lOVFJTLAorCQkJICAgICAgICZiYXIwLT5tYWNfcm1hY19lcnJfbWFzayk7CisKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXZhbDY0IHw9IHRlbXA2NDsKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQl9CisJfQorCisJLyogIFhHWFMgSW50ZXJydXB0cyAqLworCWlmIChtYXNrICYgKFRYX1hHWFNfSU5UUiB8IFJYX1hHWFNfSU5UUikpIHsKKwkJdmFsNjQgPSBUWFhHWFNfSU5UX00gfCBSWFhHWFNfSU5UX007CisJCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgeworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJLyogCisJCQkgKiBBbGwgWEdYUyBibG9jayBlcnJvciBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBmb3Igbm93CisJCQkgKiBUT0RPIAorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT54Z3hzX2ludF9tYXNrKTsKKwkJfSBlbHNlIGlmIChmbGFnID09IERJU0FCTEVfSU5UUlMpIHsKKwkJCS8qICAKKwkJCSAqIERpc2FibGUgTUMgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIHJlZ2lzdGVyIAorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT54Z3hzX2ludF9tYXNrKTsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXZhbDY0IHw9IHRlbXA2NDsKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQl9CisJfQorCisJLyogIE1lbW9yeSBDb250cm9sbGVyKE1DKSBpbnRlcnJ1cHRzICovCisJaWYgKG1hc2sgJiBNQ19JTlRSKSB7CisJCXZhbDY0ID0gTUNfSU5UX007CisJCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgeworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJLyogCisJCQkgKiBBbGwgTUMgYmxvY2sgZXJyb3IgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgZm9yIG5vdworCQkJICogVE9ETyAKKwkJCSAqLworCQkJd3JpdGVxKERJU0FCTEVfQUxMX0lOVFJTLCAmYmFyMC0+bWNfaW50X21hc2spOworCQl9IGVsc2UgaWYgKGZsYWcgPT0gRElTQUJMRV9JTlRSUykgeworCQkJLyoKKwkJCSAqIERpc2FibGUgTUMgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIHJlZ2lzdGVyCisJCQkgKi8KKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPm1jX2ludF9tYXNrKTsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXZhbDY0IHw9IHRlbXA2NDsKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQl9CisJfQorCisKKwkvKiAgVHggdHJhZmZpYyBpbnRlcnJ1cHRzICovCisJaWYgKG1hc2sgJiBUWF9UUkFGRklDX0lOVFIpIHsKKwkJdmFsNjQgPSBUWFRSQUZGSUNfSU5UX007CisJCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgeworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJLyogCisJCQkgKiBFbmFibGUgYWxsIHRoZSBUeCBzaWRlIGludGVycnVwdHMKKwkJCSAqIHdyaXRpbmcgMCBFbmFibGVzIGFsbCA2NCBUWCBpbnRlcnJ1cHQgbGV2ZWxzIAorCQkJICovCisJCQl3cml0ZXEoMHgwLCAmYmFyMC0+dHhfdHJhZmZpY19tYXNrKTsKKwkJfSBlbHNlIGlmIChmbGFnID09IERJU0FCTEVfSU5UUlMpIHsKKwkJCS8qIAorCQkJICogRGlzYWJsZSBUeCBUcmFmZmljIEludHJzIGluIHRoZSBnZW5lcmFsIGludHIgbWFzayAKKwkJCSAqIHJlZ2lzdGVyLgorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT50eF90cmFmZmljX21hc2spOworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdmFsNjQgfD0gdGVtcDY0OworCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCX0KKwl9CisKKwkvKiAgUnggdHJhZmZpYyBpbnRlcnJ1cHRzICovCisJaWYgKG1hc2sgJiBSWF9UUkFGRklDX0lOVFIpIHsKKwkJdmFsNjQgPSBSWFRSQUZGSUNfSU5UX007CisJCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgeworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJLyogd3JpdGluZyAwIEVuYWJsZXMgYWxsIDggUlggaW50ZXJydXB0IGxldmVscyAqLworCQkJd3JpdGVxKDB4MCwgJmJhcjAtPnJ4X3RyYWZmaWNfbWFzayk7CisJCX0gZWxzZSBpZiAoZmxhZyA9PSBESVNBQkxFX0lOVFJTKSB7CisJCQkvKiAgCisJCQkgKiBEaXNhYmxlIFJ4IFRyYWZmaWMgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIAorCQkJICogcmVnaXN0ZXIuCisJCQkgKi8KKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPnJ4X3RyYWZmaWNfbWFzayk7CisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQl2YWw2NCB8PSB0ZW1wNjQ7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJfQorCX0KK30KKworLyoqICAKKyAqICB2ZXJpZnlfeGVuYV9xdWllc2NlbmNlIC0gQ2hlY2tzIHdoZXRoZXIgdGhlIEgvVyBpcyByZWFkeSAKKyAqICBAdmFsNjQgOiAgVmFsdWUgcmVhZCBmcm9tIGFkYXB0ZXIgc3RhdHVzIHJlZ2lzdGVyLgorICogIEBmbGFnIDogaW5kaWNhdGVzIGlmIHRoZSBhZGFwdGVyIGVuYWJsZSBiaXQgd2FzIGV2ZXIgd3JpdHRlbiBvbmNlCisgKiAgYmVmb3JlLgorICogIERlc2NyaXB0aW9uOiBSZXR1cm5zIHdoZXRoZXIgdGhlIEgvVyBpcyByZWFkeSB0byBnbyBvciBub3QuIERlcGVuZGluZworICogIG9uIHdoZXRoZXIgYWRhcHRlciBlbmFibGUgYml0IHdhcyB3cml0dGVuIG9yIG5vdCB0aGUgY29tcGFyaXNvbiAKKyAqICBkaWZmZXJzIGFuZCB0aGUgY2FsbGluZyBmdW5jdGlvbiBwYXNzZXMgdGhlIGlucHV0IGFyZ3VtZW50IGZsYWcgdG8KKyAqICBpbmRpY2F0ZSB0aGlzLgorICogIFJldHVybjogMSBJZiB4ZW5hIGlzIHF1aWVzY2VuY2UgCisgKiAgICAgICAgICAwIElmIFhlbmEgaXMgbm90IHF1aWVzY2VuY2UKKyAqLworCitzdGF0aWMgaW50IHZlcmlmeV94ZW5hX3F1aWVzY2VuY2UodTY0IHZhbDY0LCBpbnQgZmxhZykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1NjQgdG1wNjQgPSB+KCh1NjQpIHZhbDY0KTsKKworCWlmICghCisJICAgICh0bXA2NCAmCisJICAgICAoQURBUFRFUl9TVEFUVVNfVERNQV9SRUFEWSB8IEFEQVBURVJfU1RBVFVTX1JETUFfUkVBRFkgfAorCSAgICAgIEFEQVBURVJfU1RBVFVTX1BGQ19SRUFEWSB8IEFEQVBURVJfU1RBVFVTX1RNQUNfQlVGX0VNUFRZIHwKKwkgICAgICBBREFQVEVSX1NUQVRVU19QSUNfUVVJRVNDRU5UIHwgQURBUFRFUl9TVEFUVVNfTUNfRFJBTV9SRUFEWSB8CisJICAgICAgQURBUFRFUl9TVEFUVVNfTUNfUVVFVUVTX1JFQURZIHwgQURBUFRFUl9TVEFUVVNfTV9QTExfTE9DSyB8CisJICAgICAgQURBUFRFUl9TVEFUVVNfUF9QTExfTE9DSykpKSB7CisJCWlmIChmbGFnID09IEZBTFNFKSB7CisJCQlpZiAoISh2YWw2NCAmIEFEQVBURVJfU1RBVFVTX1JNQUNfUENDX0lETEUpICYmCisJCQkgICAgKCh2YWw2NCAmIEFEQVBURVJfU1RBVFVTX1JDX1BSQ19RVUlFU0NFTlQpID09CisJCQkgICAgIEFEQVBURVJfU1RBVFVTX1JDX1BSQ19RVUlFU0NFTlQpKSB7CisKKwkJCQlyZXQgPSAxOworCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKCh2YWw2NCAmIEFEQVBURVJfU1RBVFVTX1JNQUNfUENDX0lETEUpID09CisJCQkgICAgIEFEQVBURVJfU1RBVFVTX1JNQUNfUENDX0lETEUpICYmCisJCQkgICAgKCEodmFsNjQgJiBBREFQVEVSX1NUQVRVU19SQ19QUkNfUVVJRVNDRU5UKSB8fAorCQkJICAgICAoKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfUkNfUFJDX1FVSUVTQ0VOVCkgPT0KKwkJCSAgICAgIEFEQVBURVJfU1RBVFVTX1JDX1BSQ19RVUlFU0NFTlQpKSkgeworCisJCQkJcmV0ID0gMTsKKworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBmaXhfbWFjX2FkZHJlc3MgLSAgRml4IGZvciBNYWMgYWRkciBwcm9ibGVtIG9uIEFscGhhIHBsYXRmb3JtcworICogQHNwOiBQb2ludGVyIHRvIGRldmljZSBzcGVjaWZjIHN0cnVjdHVyZQorICogRGVzY3JpcHRpb24gOiAKKyAqIE5ldyBwcm9jZWR1cmUgdG8gY2xlYXIgbWFjIGFkZHJlc3MgcmVhZGluZyAgcHJvYmxlbXMgb24gQWxwaGEgcGxhdGZvcm1zCisgKgorICovCisKK3N0YXRpYyB2b2lkIGZpeF9tYWNfYWRkcmVzcyhuaWNfdCAqIHNwKQoreworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwl1NjQgdmFsNjQ7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGZpeF9tYWNbaV0gIT0gRU5EX1NJR04pIHsKKwkJd3JpdGVxKGZpeF9tYWNbaSsrXSwgJmJhcjAtPmdwaW9fY29udHJvbCk7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmdwaW9fY29udHJvbCk7CisJfQorfQorCisvKioKKyAqICBzdGFydF9uaWMgLSBUdXJucyB0aGUgZGV2aWNlIG9uICAgCisgKiAgQG5pYyA6IGRldmljZSBwcml2YXRlIHZhcmlhYmxlLgorICogIERlc2NyaXB0aW9uOiAKKyAqICBUaGlzIGZ1bmN0aW9uIGFjdHVhbGx5IHR1cm5zIHRoZSBkZXZpY2Ugb24uIEJlZm9yZSB0aGlzICBmdW5jdGlvbiBpcyAKKyAqICBjYWxsZWQsYWxsIFJlZ2lzdGVycyBhcmUgY29uZmlndXJlZCBmcm9tIHRoZWlyIHJlc2V0IHN0YXRlcyAKKyAqICBhbmQgc2hhcmVkIG1lbW9yeSBpcyBhbGxvY2F0ZWQgYnV0IHRoZSBOSUMgaXMgc3RpbGwgcXVpZXNjZW50LiBPbiAKKyAqICBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIHRoZSBkZXZpY2UgaW50ZXJydXB0cyBhcmUgY2xlYXJlZCBhbmQgdGhlIE5JQyBpcworICogIGxpdGVyYWxseSBzd2l0Y2hlZCBvbiBieSB3cml0aW5nIGludG8gdGhlIGFkYXB0ZXIgY29udHJvbCByZWdpc3Rlci4KKyAqICBSZXR1cm4gVmFsdWU6IAorICogIFNVQ0NFU1Mgb24gc3VjY2VzcyBhbmQgLTEgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IHN0YXJ0X25pYyhzdHJ1Y3QgczJpb19uaWMgKm5pYykKK3sKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuaWMtPmRldjsKKwlyZWdpc3RlciB1NjQgdmFsNjQgPSAwOworCXUxNiBpbnRlcnJ1cHRpYmxlLCBpOworCXUxNiBzdWJpZDsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisKKwltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKKworCS8qICBQUkMgSW5pdGlhbGl6YXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCXdyaXRlcSgodTY0KSBuaWMtPnJ4X2Jsb2Nrc1tpXVswXS5ibG9ja19kbWFfYWRkciwKKwkJICAgICAgICZiYXIwLT5wcmNfcnhkMF9uW2ldKTsKKworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5wcmNfY3RybF9uW2ldKTsKKyNpZm5kZWYgQ09ORklHXzJCVUZGX01PREUKKwkJdmFsNjQgfD0gUFJDX0NUUkxfUkNfRU5BQkxFRDsKKyNlbHNlCisJCXZhbDY0IHw9IFBSQ19DVFJMX1JDX0VOQUJMRUQgfCBQUkNfQ1RSTF9SSU5HX01PREVfMzsKKyNlbmRpZgorCQl3cml0ZXEodmFsNjQsICZiYXIwLT5wcmNfY3RybF9uW2ldKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCS8qIEVuYWJsaW5nIDIgYnVmZmVyIG1vZGUgYnkgd3JpdGluZyBpbnRvIFJ4X3BhX2NmZyByZWcuICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+cnhfcGFfY2ZnKTsKKwl2YWw2NCB8PSBSWF9QQV9DRkdfSUdOT1JFX0wyX0VSUjsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5yeF9wYV9jZmcpOworI2VuZGlmCisKKwkvKiAKKwkgKiBFbmFibGluZyBNQy1STERSQU0uIEFmdGVyIGVuYWJsaW5nIHRoZSBkZXZpY2UsIHdlIHRpbWVvdXQKKwkgKiBmb3IgYXJvdW5kIDEwMG1zLCB3aGljaCBpcyBhcHByb3hpbWF0ZWx5IHRoZSB0aW1lIHJlcXVpcmVkCisJICogZm9yIHRoZSBkZXZpY2UgdG8gYmUgcmVhZHkgZm9yIG9wZXJhdGlvbi4KKwkgKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tY19ybGRyYW1fbXJzKTsKKwl2YWw2NCB8PSBNQ19STERSQU1fUVVFVUVfU0laRV9FTkFCTEUgfCBNQ19STERSQU1fTVJTX0VOQUJMRTsKKwlTUEVDSUFMX1JFR19XUklURSh2YWw2NCwgJmJhcjAtPm1jX3JsZHJhbV9tcnMsIFVGKTsKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tY19ybGRyYW1fbXJzKTsKKworCW1zbGVlcCgxMDApOwkJCS8qIERlbGF5IGJ5IGFyb3VuZCAxMDAgbXMuICovCisKKwkvKiBFbmFibGluZyBFQ0MgUHJvdGVjdGlvbi4gKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCXZhbDY0ICY9IH5BREFQVEVSX0VDQ19FTjsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCisJLyogCisJICogQ2xlYXJpbmcgYW55IHBvc3NpYmxlIExpbmsgc3RhdGUgY2hhbmdlIGludGVycnVwdHMgdGhhdCAKKwkgKiBjb3VsZCBoYXZlIHBvcHBlZCB1cCBqdXN0IGJlZm9yZSBFbmFibGluZyB0aGUgY2FyZC4KKwkgKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tYWNfcm1hY19lcnJfcmVnKTsKKwlpZiAodmFsNjQpCisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPm1hY19ybWFjX2Vycl9yZWcpOworCisJLyogCisJICogVmVyaWZ5IGlmIHRoZSBkZXZpY2UgaXMgcmVhZHkgdG8gYmUgZW5hYmxlZCwgaWYgc28gZW5hYmxlIAorCSAqIGl0LgorCSAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfc3RhdHVzKTsKKwlpZiAoIXZlcmlmeV94ZW5hX3F1aWVzY2VuY2UodmFsNjQsIG5pYy0+ZGV2aWNlX2VuYWJsZWRfb25jZSkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogZGV2aWNlIGlzIG5vdCByZWFkeSwgIiwgZGV2LT5uYW1lKTsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJBZGFwdGVyIHN0YXR1cyByZWFkczogMHglbGx4XG4iLAorCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSB2YWw2NCk7CisJCXJldHVybiBGQUlMVVJFOworCX0KKworCS8qICBFbmFibGUgc2VsZWN0IGludGVycnVwdHMgKi8KKwlpbnRlcnJ1cHRpYmxlID0gVFhfVFJBRkZJQ19JTlRSIHwgUlhfVFJBRkZJQ19JTlRSIHwgVFhfTUFDX0lOVFIgfAorCSAgICBSWF9NQUNfSU5UUjsKKwllbl9kaXNfYWJsZV9uaWNfaW50cnMobmljLCBpbnRlcnJ1cHRpYmxlLCBFTkFCTEVfSU5UUlMpOworCisJLyogCisJICogV2l0aCBzb21lIHN3aXRjaGVzLCBsaW5rIG1pZ2h0IGJlIGFscmVhZHkgdXAgYXQgdGhpcyBwb2ludC4KKwkgKiBCZWNhdXNlIG9mIHRoaXMgd2VpcmQgYmVoYXZpb3IsIHdoZW4gd2UgZW5hYmxlIGxhc2VyLCAKKwkgKiB3ZSBtYXkgbm90IGdldCBsaW5rLiBXZSBuZWVkIHRvIGhhbmRsZSB0aGlzLiBXZSBjYW5ub3QgCisJICogZmlndXJlIG91dCB3aGljaCBzd2l0Y2ggaXMgbWlzYmVoYXZpbmcuIFNvIHdlIGFyZSBmb3JjZWQgdG8gCisJICogbWFrZSBhIGdsb2JhbCBjaGFuZ2UuIAorCSAqLworCisJLyogRW5hYmxpbmcgTGFzZXIuICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKKwl2YWw2NCB8PSBBREFQVEVSX0VPSV9UWF9PTjsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCisJLyogU1hFLTAwMjogSW5pdGlhbGl6ZSBsaW5rIGFuZCBhY3Rpdml0eSBMRUQgKi8KKwlzdWJpZCA9IG5pYy0+cGRldi0+c3Vic3lzdGVtX2RldmljZTsKKwlpZiAoKHN1YmlkICYgMHhGRikgPj0gMHgwNykgeworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQl2YWw2NCB8PSAweDAwMDA4MDAwMDAwMDAwMDBVTEw7CisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdwaW9fY29udHJvbCk7CisJCXZhbDY0ID0gMHgwNDExMDQwNDAwMDAwMDAwVUxMOworCQl3cml0ZXEodmFsNjQsICh2b2lkIF9faW9tZW0gKikgYmFyMCArIDB4MjcwMCk7CisJfQorCisJLyogCisJICogRG9uJ3Qgc2VlIGxpbmsgc3RhdGUgaW50ZXJydXB0cyBvbiBjZXJ0YWluIHN3aXRjaGVzLCBzbyAKKwkgKiBkaXJlY3RseSBzY2hlZHVsaW5nIGEgbGluayBzdGF0ZSB0YXNrIGZyb20gaGVyZS4KKwkgKi8KKwlzY2hlZHVsZV93b3JrKCZuaWMtPnNldF9saW5rX3Rhc2spOworCisJLyogCisJICogSGVyZSB3ZSBhcmUgcGVyZm9ybWluZyBzb2Z0IHJlc2V0IG9uIFhHWFMgdG8gCisJICogZm9yY2UgbGluayBkb3duLiBTaW5jZSBsaW5rIGlzIGFscmVhZHkgdXAsIHdlIHdpbGwgZ2V0CisJICogbGluayBzdGF0ZSBjaGFuZ2UgaW50ZXJydXB0IGFmdGVyIHRoaXMgcmVzZXQKKwkgKi8KKwlTUEVDSUFMX1JFR19XUklURSgweDgwMDEwNTE1MDAxRTAwMDBVTEwsICZiYXIwLT5kdHhfY29udHJvbCwgVUYpOworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmR0eF9jb250cm9sKTsKKwl1ZGVsYXkoNTApOworCVNQRUNJQUxfUkVHX1dSSVRFKDB4ODAwMTA1MTUwMDFFMDBFMFVMTCwgJmJhcjAtPmR0eF9jb250cm9sLCBVRik7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+ZHR4X2NvbnRyb2wpOworCXVkZWxheSg1MCk7CisJU1BFQ0lBTF9SRUdfV1JJVEUoMHg4MDA3MDUxNTAwMUYwMEU0VUxMLCAmYmFyMC0+ZHR4X2NvbnRyb2wsIFVGKTsKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5kdHhfY29udHJvbCk7CisJdWRlbGF5KDUwKTsKKworCXJldHVybiBTVUNDRVNTOworfQorCisvKiogCisgKiAgZnJlZV90eF9idWZmZXJzIC0gRnJlZSBhbGwgcXVldWVkIFR4IGJ1ZmZlcnMgCisgKiAgQG5pYyA6IGRldmljZSBwcml2YXRlIHZhcmlhYmxlLgorICogIERlc2NyaXB0aW9uOiAKKyAqICBGcmVlIGFsbCBxdWV1ZWQgVHggYnVmZmVycy4KKyAqICBSZXR1cm4gVmFsdWU6IHZvaWQgCisqLworCitzdGF0aWMgdm9pZCBmcmVlX3R4X2J1ZmZlcnMoc3RydWN0IHMyaW9fbmljICpuaWMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5pYy0+ZGV2OworCXN0cnVjdCBza19idWZmICpza2I7CisJVHhEX3QgKnR4ZHA7CisJaW50IGksIGo7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworCWludCBjbnQgPSAwOworCisJbWFjX2NvbnRyb2wgPSAmbmljLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmbmljLT5jb25maWc7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT50eF9maWZvX251bTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbiAtIDE7IGorKykgeworCQkJdHhkcCA9IChUeERfdCAqKSBuaWMtPmxpc3RfaW5mb1tpXVtqXS4KKwkJCSAgICBsaXN0X3ZpcnRfYWRkcjsKKwkJCXNrYiA9CisJCQkgICAgKHN0cnVjdCBza19idWZmICopICgodW5zaWduZWQgbG9uZykgdHhkcC0+CisJCQkJCQlIb3N0X0NvbnRyb2wpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJbWVtc2V0KHR4ZHAsIDAsIHNpemVvZihUeERfdCkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJbWVtc2V0KHR4ZHAsIDAsIHNpemVvZihUeERfdCkpOworCQkJY250Kys7CisJCX0KKwkJREJHX1BSSU5UKElOVFJfREJHLAorCQkJICAiJXM6Zm9yY2libHkgZnJlZWluZyAlZCBza2JzIG9uIEZJRk8lZFxuIiwKKwkJCSAgZGV2LT5uYW1lLCBjbnQsIGkpOworCQltYWNfY29udHJvbC0+dHhfY3Vycl9nZXRfaW5mb1tpXS5vZmZzZXQgPSAwOworCQltYWNfY29udHJvbC0+dHhfY3Vycl9wdXRfaW5mb1tpXS5vZmZzZXQgPSAwOworCX0KK30KKworLyoqICAKKyAqICAgc3RvcF9uaWMgLSAgVG8gc3RvcCB0aGUgbmljICAKKyAqICAgQG5pYyA7IGRldmljZSBwcml2YXRlIHZhcmlhYmxlLgorICogICBEZXNjcmlwdGlvbjogCisgKiAgIFRoaXMgZnVuY3Rpb24gZG9lcyBleGFjdGx5IHRoZSBvcHBvc2l0ZSBvZiB3aGF0IHRoZSBzdGFydF9uaWMoKSAKKyAqICAgZnVuY3Rpb24gZG9lcy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3RvcCB0aGUgZGV2aWNlLgorICogICBSZXR1cm4gVmFsdWU6CisgKiAgIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQgc3RvcF9uaWMoc3RydWN0IHMyaW9fbmljICpuaWMpCit7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlyZWdpc3RlciB1NjQgdmFsNjQgPSAwOworCXUxNiBpbnRlcnJ1cHRpYmxlLCBpOworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKworCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJm5pYy0+Y29uZmlnOworCisJLyogIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlpbnRlcnJ1cHRpYmxlID0gVFhfVFJBRkZJQ19JTlRSIHwgUlhfVFJBRkZJQ19JTlRSIHwgVFhfTUFDX0lOVFIgfAorCSAgICBSWF9NQUNfSU5UUjsKKwllbl9kaXNfYWJsZV9uaWNfaW50cnMobmljLCBpbnRlcnJ1cHRpYmxlLCBESVNBQkxFX0lOVFJTKTsKKworCS8qICBEaXNhYmxlIFBSQ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnByY19jdHJsX25baV0pOworCQl2YWw2NCAmPSB+KCh1NjQpIFBSQ19DVFJMX1JDX0VOQUJMRUQpOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5wcmNfY3RybF9uW2ldKTsKKwl9Cit9CisKKy8qKiAgCisgKiAgZmlsbF9yeF9idWZmZXJzIC0gQWxsb2NhdGVzIHRoZSBSeCBzaWRlIHNrYnMgCisgKiAgQG5pYzogIGRldmljZSBwcml2YXRlIHZhcmlhYmxlCisgKiAgQHJpbmdfbm86IHJpbmcgbnVtYmVyIAorICogIERlc2NyaXB0aW9uOiAKKyAqICBUaGUgZnVuY3Rpb24gYWxsb2NhdGVzIFJ4IHNpZGUgc2ticyBhbmQgcHV0cyB0aGUgcGh5c2ljYWwKKyAqICBhZGRyZXNzIG9mIHRoZXNlIGJ1ZmZlcnMgaW50byB0aGUgUnhEIGJ1ZmZlciBwb2ludGVycywgc28gdGhhdCB0aGUgTklDCisgKiAgY2FuIERNQSB0aGUgcmVjZWl2ZWQgZnJhbWUgaW50byB0aGVzZSBsb2NhdGlvbnMuCisgKiAgVGhlIE5JQyBzdXBwb3J0cyAzIHJlY2VpdmUgbW9kZXMsIHZpegorICogIDEuIHNpbmdsZSBidWZmZXIsCisgKiAgMi4gdGhyZWUgYnVmZmVyIGFuZAorICogIDMuIEZpdmUgYnVmZmVyIG1vZGVzLgorICogIEVhY2ggbW9kZSBkZWZpbmVzIGhvdyBtYW55IGZyYWdtZW50cyB0aGUgcmVjZWl2ZWQgZnJhbWUgd2lsbCBiZSBzcGxpdCAKKyAqICB1cCBpbnRvIGJ5IHRoZSBOSUMuIFRoZSBmcmFtZSBpcyBzcGxpdCBpbnRvIEwzIGhlYWRlciwgTDQgSGVhZGVyLCAKKyAqICBMNCBwYXlsb2FkIGluIHRocmVlIGJ1ZmZlciBtb2RlIGFuZCBpbiA1IGJ1ZmZlciBtb2RlLCBMNCBwYXlsb2FkIGl0c2VsZgorICogIGlzIHNwbGl0IGludG8gMyBmcmFnbWVudHMuIEFzIG9mIG5vdyBvbmx5IHNpbmdsZSBidWZmZXIgbW9kZSBpcworICogIHN1cHBvcnRlZC4KKyAqICAgUmV0dXJuIFZhbHVlOgorICogIFNVQ0NFU1Mgb24gc3VjY2VzcyBvciBhbiBhcHByb3ByaWF0ZSAtdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IGZpbGxfcnhfYnVmZmVycyhzdHJ1Y3QgczJpb19uaWMgKm5pYywgaW50IHJpbmdfbm8pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5pYy0+ZGV2OworCXN0cnVjdCBza19idWZmICpza2I7CisJUnhEX3QgKnJ4ZHA7CisJaW50IG9mZiwgb2ZmMSwgc2l6ZSwgYmxvY2tfbm8sIGJsb2NrX25vMTsKKwlpbnQgb2Zmc2V0LCBvZmZzZXQxOworCXUzMiBhbGxvY190YWIgPSAwOworCXUzMiBhbGxvY19jbnQgPSBuaWMtPnBrdF9jbnRbcmluZ19ub10gLQorCSAgICBhdG9taWNfcmVhZCgmbmljLT5yeF9idWZzX2xlZnRbcmluZ19ub10pOworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCVJ4RF90ICpyeGRwbmV4dDsKKwlpbnQgbmV4dGJsazsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlidWZmQWRkX3QgKmJhOworCWRtYV9hZGRyX3QgcnhkcHBoeXM7CisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1MySU9fTkFQSQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjZW5kaWYKKworCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJm5pYy0+Y29uZmlnOworCisJc2l6ZSA9IGRldi0+bXR1ICsgSEVBREVSX0VUSEVSTkVUX0lJXzgwMl8zX1NJWkUgKworCSAgICBIRUFERVJfODAyXzJfU0laRSArIEhFQURFUl9TTkFQX1NJWkU7CisKKwl3aGlsZSAoYWxsb2NfdGFiIDwgYWxsb2NfY250KSB7CisJCWJsb2NrX25vID0gbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10uCisJCSAgICBibG9ja19pbmRleDsKKwkJYmxvY2tfbm8xID0gbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9bcmluZ19ub10uCisJCSAgICBibG9ja19pbmRleDsKKwkJb2ZmID0gbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10ub2Zmc2V0OworCQlvZmYxID0gbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9bcmluZ19ub10ub2Zmc2V0OworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCQlvZmZzZXQgPSBibG9ja19ubyAqIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSArIG9mZjsKKwkJb2Zmc2V0MSA9IGJsb2NrX25vMSAqIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSArIG9mZjE7CisjZWxzZQorCQlvZmZzZXQgPSBibG9ja19ubyAqIChNQVhfUlhEU19QRVJfQkxPQ0spICsgb2ZmOworCQlvZmZzZXQxID0gYmxvY2tfbm8xICogKE1BWF9SWERTX1BFUl9CTE9DSykgKyBvZmYxOworI2VuZGlmCisKKwkJcnhkcCA9IG5pYy0+cnhfYmxvY2tzW3Jpbmdfbm9dW2Jsb2NrX25vXS4KKwkJICAgIGJsb2NrX3ZpcnRfYWRkciArIG9mZjsKKwkJaWYgKChvZmZzZXQgPT0gb2Zmc2V0MSkgJiYgKHJ4ZHAtPkhvc3RfQ29udHJvbCkpIHsKKwkJCURCR19QUklOVChJTlRSX0RCRywgIiVzOiBHZXQgYW5kIFB1dCIsIGRldi0+bmFtZSk7CisJCQlEQkdfUFJJTlQoSU5UUl9EQkcsICIgaW5mbyBlcXVhdGVkXG4iKTsKKwkJCWdvdG8gZW5kOworCQl9CisjaWZuZGVmCUNPTkZJR18yQlVGRl9NT0RFCisJCWlmIChyeGRwLT5Db250cm9sXzEgPT0gRU5EX09GX0JMT0NLKSB7CisJCQltYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tyaW5nX25vXS4KKwkJCSAgICBibG9ja19pbmRleCsrOworCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10uCisJCQkgICAgYmxvY2tfaW5kZXggJT0gbmljLT5ibG9ja19jb3VudFtyaW5nX25vXTsKKwkJCWJsb2NrX25vID0gbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm8KKwkJCSAgICBbcmluZ19ub10uYmxvY2tfaW5kZXg7CisJCQlvZmYrKzsKKwkJCW9mZiAlPSAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCQltYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tyaW5nX25vXS5vZmZzZXQgPQorCQkJICAgIG9mZjsKKwkJCXJ4ZHAgPSAoUnhEX3QgKikgKCh1bnNpZ25lZCBsb25nKSByeGRwLT5Db250cm9sXzIpOworCQkJREJHX1BSSU5UKElOVFJfREJHLCAiJXM6IE5leHQgYmxvY2sgYXQ6ICVwXG4iLAorCQkJCSAgZGV2LT5uYW1lLCByeGRwKTsKKwkJfQorI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCisJCXNwaW5fbG9ja19pcnFzYXZlKCZuaWMtPnB1dF9sb2NrLCBmbGFncyk7CisJCW5pYy0+cHV0X3Bvc1tyaW5nX25vXSA9CisJCSAgICAoYmxvY2tfbm8gKiAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSkpICsgb2ZmOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuaWMtPnB1dF9sb2NrLCBmbGFncyk7CisjZW5kaWYKKyNlbHNlCisJCWlmIChyeGRwLT5Ib3N0X0NvbnRyb2wgPT0gRU5EX09GX0JMT0NLKSB7CisJCQltYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tyaW5nX25vXS4KKwkJCSAgICBibG9ja19pbmRleCsrOworCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10uCisJCQkgICAgYmxvY2tfaW5kZXggJT0gbmljLT5ibG9ja19jb3VudFtyaW5nX25vXTsKKwkJCWJsb2NrX25vID0gbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm8KKwkJCSAgICBbcmluZ19ub10uYmxvY2tfaW5kZXg7CisJCQlvZmYgPSAwOworCQkJREJHX1BSSU5UKElOVFJfREJHLCAiJXM6IGJsb2NrJWQgYXQ6IDB4JWxseFxuIiwKKwkJCQkgIGRldi0+bmFtZSwgYmxvY2tfbm8sCisJCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSByeGRwLT5Db250cm9sXzEpOworCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10ub2Zmc2V0ID0KKwkJCSAgICBvZmY7CisJCQlyeGRwID0gbmljLT5yeF9ibG9ja3NbcmluZ19ub11bYmxvY2tfbm9dLgorCQkJICAgIGJsb2NrX3ZpcnRfYWRkcjsKKwkJfQorI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCisJCXNwaW5fbG9ja19pcnFzYXZlKCZuaWMtPnB1dF9sb2NrLCBmbGFncyk7CisJCW5pYy0+cHV0X3Bvc1tyaW5nX25vXSA9IChibG9ja19ubyAqCisJCQkJCSAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSkpICsgb2ZmOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuaWMtPnB1dF9sb2NrLCBmbGFncyk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmCUNPTkZJR18yQlVGRl9NT0RFCisJCWlmIChyeGRwLT5Db250cm9sXzEgJiBSWERfT1dOX1hFTkEpCisjZWxzZQorCQlpZiAocnhkcC0+Q29udHJvbF8yICYgQklUKDApKQorI2VuZGlmCisJCXsKKwkJCW1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW3Jpbmdfbm9dLgorCQkJICAgIG9mZnNldCA9IG9mZjsKKwkJCWdvdG8gZW5kOworCQl9CisjaWZkZWYJQ09ORklHXzJCVUZGX01PREUKKwkJLyogCisJCSAqIFJ4RHMgU3Bhbm5pbmcgY2FjaGUgbGluZXMgd2lsbCBiZSByZXBsZW5pc2hlZCBvbmx5IAorCQkgKiBpZiB0aGUgc3VjY2VlZGluZyBSeEQgaXMgYWxzbyBvd25lZCBieSBIb3N0LiBJdCAKKwkJICogd2lsbCBhbHdheXMgYmUgdGhlICgoOCppKSszKSBhbmQgKCg4KmkpKzYpIAorCQkgKiBkZXNjcmlwdG9ycyBmb3IgdGhlIDQ4IGJ5dGUgZGVzY3JpcHRvci4gVGhlIG9mZmVuZGluZyAKKwkJICogZGVjc3JpcHRvciBpcyBvZi1jb3Vyc2UgdGhlIDNyZCBkZXNjcmlwdG9yLgorCQkgKi8KKwkJcnhkcHBoeXMgPSBuaWMtPnJ4X2Jsb2Nrc1tyaW5nX25vXVtibG9ja19ub10uCisJCSAgICBibG9ja19kbWFfYWRkciArIChvZmYgKiBzaXplb2YoUnhEX3QpKTsKKwkJaWYgKCgodTY0KSAocnhkcHBoeXMpKSAlIDEyOCA+IDgwKSB7CisJCQlyeGRwbmV4dCA9IG5pYy0+cnhfYmxvY2tzW3Jpbmdfbm9dW2Jsb2NrX25vXS4KKwkJCSAgICBibG9ja192aXJ0X2FkZHIgKyAob2ZmICsgMSk7CisJCQlpZiAocnhkcG5leHQtPkhvc3RfQ29udHJvbCA9PSBFTkRfT0ZfQkxPQ0spIHsKKwkJCQluZXh0YmxrID0gKGJsb2NrX25vICsgMSkgJQorCQkJCSAgICAobmljLT5ibG9ja19jb3VudFtyaW5nX25vXSk7CisJCQkJcnhkcG5leHQgPSBuaWMtPnJ4X2Jsb2Nrc1tyaW5nX25vXQorCQkJCSAgICBbbmV4dGJsa10uYmxvY2tfdmlydF9hZGRyOworCQkJfQorCQkJaWYgKHJ4ZHBuZXh0LT5Db250cm9sXzIgJiBCSVQoMCkpCisJCQkJZ290byBlbmQ7CisJCX0KKyNlbmRpZgorCisjaWZuZGVmCUNPTkZJR18yQlVGRl9NT0RFCisJCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSArIE5FVF9JUF9BTElHTik7CisjZWxzZQorCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGRldi0+bXR1ICsgQUxJR05fU0laRSArIEJVRjBfTEVOICsgNCk7CisjZW5kaWYKKwkJaWYgKCFza2IpIHsKKwkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IE91dCBvZiAiLCBkZXYtPm5hbWUpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICJtZW1vcnkgdG8gYWxsb2NhdGUgU0tCc1xuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorI2lmbmRlZglDT05GSUdfMkJVRkZfTU9ERQorCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisJCW1lbXNldChyeGRwLCAwLCBzaXplb2YoUnhEX3QpKTsKKwkJcnhkcC0+QnVmZmVyMF9wdHIgPSBwY2lfbWFwX3NpbmdsZQorCQkgICAgKG5pYy0+cGRldiwgc2tiLT5kYXRhLCBzaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlyeGRwLT5Db250cm9sXzIgJj0gKH5NQVNLX0JVRkZFUjBfU0laRSk7CisJCXJ4ZHAtPkNvbnRyb2xfMiB8PSBTRVRfQlVGRkVSMF9TSVpFKHNpemUpOworCQlyeGRwLT5Ib3N0X0NvbnRyb2wgPSAodW5zaWduZWQgbG9uZykgKHNrYik7CisJCXJ4ZHAtPkNvbnRyb2xfMSB8PSBSWERfT1dOX1hFTkE7CisJCW9mZisrOworCQlvZmYgJT0gKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpOworCQltYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tyaW5nX25vXS5vZmZzZXQgPSBvZmY7CisjZWxzZQorCQliYSA9ICZuaWMtPmJhW3Jpbmdfbm9dW2Jsb2NrX25vXVtvZmZdOworCQlza2JfcmVzZXJ2ZShza2IsIEJVRjBfTEVOKTsKKwkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIHNrYi0+ZGF0YTsKKwkJdG1wICs9IEFMSUdOX1NJWkU7CisJCXRtcCAmPSB+QUxJR05fU0laRTsKKwkJc2tiLT5kYXRhID0gKHZvaWQgKikgdG1wOworCQlza2ItPnRhaWwgPSAodm9pZCAqKSB0bXA7CisKKwkJbWVtc2V0KHJ4ZHAsIDAsIHNpemVvZihSeERfdCkpOworCQlyeGRwLT5CdWZmZXIyX3B0ciA9IHBjaV9tYXBfc2luZ2xlCisJCSAgICAobmljLT5wZGV2LCBza2ItPmRhdGEsIGRldi0+bXR1ICsgQlVGMF9MRU4gKyA0LAorCQkgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXJ4ZHAtPkJ1ZmZlcjBfcHRyID0KKwkJICAgIHBjaV9tYXBfc2luZ2xlKG5pYy0+cGRldiwgYmEtPmJhXzAsIEJVRjBfTEVOLAorCQkJCSAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXJ4ZHAtPkJ1ZmZlcjFfcHRyID0KKwkJICAgIHBjaV9tYXBfc2luZ2xlKG5pYy0+cGRldiwgYmEtPmJhXzEsIEJVRjFfTEVOLAorCQkJCSAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJcnhkcC0+Q29udHJvbF8yID0gU0VUX0JVRkZFUjJfU0laRShkZXYtPm10dSArIDQpOworCQlyeGRwLT5Db250cm9sXzIgfD0gU0VUX0JVRkZFUjBfU0laRShCVUYwX0xFTik7CisJCXJ4ZHAtPkNvbnRyb2xfMiB8PSBTRVRfQlVGRkVSMV9TSVpFKDEpOwkvKiBkdW1teS4gKi8KKwkJcnhkcC0+Q29udHJvbF8yIHw9IEJJVCgwKTsJLyogU2V0IEJ1ZmZlcl9FbXB0eSBiaXQuICovCisJCXJ4ZHAtPkhvc3RfQ29udHJvbCA9ICh1NjQpICgodW5zaWduZWQgbG9uZykgKHNrYikpOworCQlyeGRwLT5Db250cm9sXzEgfD0gUlhEX09XTl9YRU5BOworCQlvZmYrKzsKKwkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10ub2Zmc2V0ID0gb2ZmOworI2VuZGlmCisJCWF0b21pY19pbmMoJm5pYy0+cnhfYnVmc19sZWZ0W3Jpbmdfbm9dKTsKKwkJYWxsb2NfdGFiKys7CisJfQorCisgICAgICBlbmQ6CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICogIGZyZWVfcnhfYnVmZmVycyAtIEZyZWVzIGFsbCBSeCBidWZmZXJzICAgCisgKiAgQHNwOiBkZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZS4KKyAqICBEZXNjcmlwdGlvbjogCisgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGZyZWUgYWxsIFJ4IGJ1ZmZlcnMgYWxsb2NhdGVkIGJ5IGhvc3QuCisgKiAgUmV0dXJuIFZhbHVlOgorICogIE5PTkUuCisgKi8KKworc3RhdGljIHZvaWQgZnJlZV9yeF9idWZmZXJzKHN0cnVjdCBzMmlvX25pYyAqc3ApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5kZXY7CisJaW50IGksIGosIGJsayA9IDAsIG9mZiwgYnVmX2NudCA9IDA7CisJUnhEX3QgKnJ4ZHA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisjaWZkZWYgQ09ORklHXzJCVUZGX01PREUKKwlidWZmQWRkX3QgKmJhOworI2VuZGlmCisKKwltYWNfY29udHJvbCA9ICZzcC0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJnNwLT5jb25maWc7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCWZvciAoaiA9IDAsIGJsayA9IDA7IGogPCBjb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkOyBqKyspIHsKKwkJCW9mZiA9IGogJSAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCQlyeGRwID0gc3AtPnJ4X2Jsb2Nrc1tpXVtibGtdLmJsb2NrX3ZpcnRfYWRkciArIG9mZjsKKworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCQkJaWYgKHJ4ZHAtPkNvbnRyb2xfMSA9PSBFTkRfT0ZfQkxPQ0spIHsKKwkJCQlyeGRwID0KKwkJCQkgICAgKFJ4RF90ICopICgodW5zaWduZWQgbG9uZykgcnhkcC0+CisJCQkJCSAgICAgICBDb250cm9sXzIpOworCQkJCWorKzsKKwkJCQlibGsrKzsKKwkJCX0KKyNlbHNlCisJCQlpZiAocnhkcC0+SG9zdF9Db250cm9sID09IEVORF9PRl9CTE9DSykgeworCQkJCWJsaysrOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisKKwkJCWlmICghKHJ4ZHAtPkNvbnRyb2xfMSAmIFJYRF9PV05fWEVOQSkpIHsKKwkJCQltZW1zZXQocnhkcCwgMCwgc2l6ZW9mKFJ4RF90KSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXNrYiA9CisJCQkgICAgKHN0cnVjdCBza19idWZmICopICgodW5zaWduZWQgbG9uZykgcnhkcC0+CisJCQkJCQlIb3N0X0NvbnRyb2wpOworCQkJaWYgKHNrYikgeworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCQkJCXBjaV91bm1hcF9zaW5nbGUoc3AtPnBkZXYsIChkbWFfYWRkcl90KQorCQkJCQkJIHJ4ZHAtPkJ1ZmZlcjBfcHRyLAorCQkJCQkJIGRldi0+bXR1ICsKKwkJCQkJCSBIRUFERVJfRVRIRVJORVRfSUlfODAyXzNfU0laRQorCQkJCQkJICsgSEVBREVSXzgwMl8yX1NJWkUgKworCQkJCQkJIEhFQURFUl9TTkFQX1NJWkUsCisJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKyNlbHNlCisJCQkJYmEgPSAmc3AtPmJhW2ldW2Jsa11bb2ZmXTsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHNwLT5wZGV2LCAoZG1hX2FkZHJfdCkKKwkJCQkJCSByeGRwLT5CdWZmZXIwX3B0ciwKKwkJCQkJCSBCVUYwX0xFTiwKKwkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXBjaV91bm1hcF9zaW5nbGUoc3AtPnBkZXYsIChkbWFfYWRkcl90KQorCQkJCQkJIHJ4ZHAtPkJ1ZmZlcjFfcHRyLAorCQkJCQkJIEJVRjFfTEVOLAorCQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwgKGRtYV9hZGRyX3QpCisJCQkJCQkgcnhkcC0+QnVmZmVyMl9wdHIsCisJCQkJCQkgZGV2LT5tdHUgKyBCVUYwX0xFTiArIDQsCisJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKyNlbmRpZgorCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCQlhdG9taWNfZGVjKCZzcC0+cnhfYnVmc19sZWZ0W2ldKTsKKwkJCQlidWZfY250Kys7CisJCQl9CisJCQltZW1zZXQocnhkcCwgMCwgc2l6ZW9mKFJ4RF90KSk7CisJCX0KKwkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9baV0uYmxvY2tfaW5kZXggPSAwOworCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS5ibG9ja19pbmRleCA9IDA7CisJCW1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW2ldLm9mZnNldCA9IDA7CisJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLm9mZnNldCA9IDA7CisJCWF0b21pY19zZXQoJnNwLT5yeF9idWZzX2xlZnRbaV0sIDApOworCQlEQkdfUFJJTlQoSU5JVF9EQkcsICIlczpGcmVlZCAweCV4IFJ4IEJ1ZmZlcnMgb24gcmluZyVkXG4iLAorCQkJICBkZXYtPm5hbWUsIGJ1Zl9jbnQsIGkpOworCX0KK30KKworLyoqCisgKiBzMmlvX3BvbGwgLSBSeCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgTkFQSSBzdXBwb3J0CisgKiBAZGV2IDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqIEBidWRnZXQgOiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgdGhhdCB3ZXJlIGJ1ZGdldGVkIHRvIGJlIHByb2Nlc3NlZCAKKyAqIGR1cmluZyAgb25lIHBhc3MgdGhyb3VnaCB0aGUgJ1BvbGwiIGZ1bmN0aW9uLgorICogRGVzY3JpcHRpb246CisgKiBDb21lcyBpbnRvIHBpY3R1cmUgb25seSBpZiBOQVBJIHN1cHBvcnQgaGFzIGJlZW4gaW5jb3Jwb3JhdGVkLiBJdCBkb2VzCisgKiB0aGUgc2FtZSB0aGluZyB0aGF0IHJ4X2ludHJfaGFuZGxlciBkb2VzLCBidXQgbm90IGluIGEgaW50ZXJydXB0IGNvbnRleHQKKyAqIGFsc28gSXQgd2lsbCBwcm9jZXNzIG9ubHkgYSBnaXZlbiBudW1iZXIgb2YgcGFja2V0cy4KKyAqIFJldHVybiB2YWx1ZToKKyAqIDAgb24gc3VjY2VzcyBhbmQgMSBpZiB0aGVyZSBhcmUgTm8gUnggcGFja2V0cyB0byBiZSBwcm9jZXNzZWQuCisgKi8KKworI2lmZGVmIENPTkZJR19TMklPX05BUEkKK3N0YXRpYyBpbnQgczJpb19wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCW5pY190ICpuaWMgPSBkZXYtPnByaXY7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlpbnQgcGt0c190b19wcm9jZXNzID0gKmJ1ZGdldCwgcGt0X2NudCA9IDA7CisJcmVnaXN0ZXIgdTY0IHZhbDY0ID0gMDsKKwlyeF9jdXJyX2dldF9pbmZvX3QgZ2V0X2luZm8sIHB1dF9pbmZvOworCWludCBpLCBnZXRfYmxvY2ssIHB1dF9ibG9jaywgZ2V0X29mZnNldCwgcHV0X29mZnNldCwgcmluZ19idWZzOworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCXUxNiB2YWwxNiwgY2tzdW07CisjZW5kaWYKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCVJ4RF90ICpyeGRwOworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCWJ1ZmZBZGRfdCAqYmE7CisjZW5kaWYKKworCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJm5pYy0+Y29uZmlnOworCisJaWYgKHBrdHNfdG9fcHJvY2VzcyA+IGRldi0+cXVvdGEpCisJCXBrdHNfdG9fcHJvY2VzcyA9IGRldi0+cXVvdGE7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5yeF90cmFmZmljX2ludCk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnhfdHJhZmZpY19pbnQpOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQlnZXRfaW5mbyA9IG1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldOworCQlnZXRfYmxvY2sgPSBnZXRfaW5mby5ibG9ja19pbmRleDsKKwkJcHV0X2luZm8gPSBtYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tpXTsKKwkJcHV0X2Jsb2NrID0gcHV0X2luZm8uYmxvY2tfaW5kZXg7CisJCXJpbmdfYnVmcyA9IGNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQ7CisJCXJ4ZHAgPSBuaWMtPnJ4X2Jsb2Nrc1tpXVtnZXRfYmxvY2tdLmJsb2NrX3ZpcnRfYWRkciArCisJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisjaWZuZGVmCUNPTkZJR18yQlVGRl9NT0RFCisJCWdldF9vZmZzZXQgPSAoZ2V0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCXB1dF9vZmZzZXQgPSAocHV0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCSAgICBwdXRfaW5mby5vZmZzZXQ7CisJCXdoaWxlICgoIShyeGRwLT5Db250cm9sXzEgJiBSWERfT1dOX1hFTkEpKSAmJgorCQkgICAgICAgKCgoZ2V0X29mZnNldCArIDEpICUgcmluZ19idWZzKSAhPSBwdXRfb2Zmc2V0KSkgeworCQkJaWYgKC0tcGt0c190b19wcm9jZXNzIDwgMCkgeworCQkJCWdvdG8gbm9fcng7CisJCQl9CisJCQlpZiAocnhkcC0+Q29udHJvbF8xID09IEVORF9PRl9CTE9DSykgeworCQkJCXJ4ZHAgPQorCQkJCSAgICAoUnhEX3QgKikgKCh1bnNpZ25lZCBsb25nKSByeGRwLT4KKwkJCQkJICAgICAgIENvbnRyb2xfMik7CisJCQkJZ2V0X2luZm8ub2Zmc2V0Kys7CisJCQkJZ2V0X2luZm8ub2Zmc2V0ICU9CisJCQkJICAgIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKTsKKwkJCQlnZXRfYmxvY2srKzsKKwkJCQlnZXRfYmxvY2sgJT0gbmljLT5ibG9ja19jb3VudFtpXTsKKwkJCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS4KKwkJCQkgICAgb2Zmc2V0ID0gZ2V0X2luZm8ub2Zmc2V0OworCQkJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLgorCQkJCSAgICBibG9ja19pbmRleCA9IGdldF9ibG9jazsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWdldF9vZmZzZXQgPQorCQkJICAgIChnZXRfYmxvY2sgKiAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSkpICsKKwkJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCQlza2IgPQorCQkJICAgIChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKHVuc2lnbmVkIGxvbmcpIHJ4ZHAtPgorCQkJCQkJSG9zdF9Db250cm9sKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFRoZSBza2IgaXMgIiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiTnVsbCBpbiBSeCBJbnRyXG4iKTsKKwkJCQlnb3RvIG5vX3J4OworCQkJfQorCQkJdmFsNjQgPSBSWERfR0VUX0JVRkZFUjBfU0laRShyeGRwLT5Db250cm9sXzIpOworCQkJdmFsMTYgPSAodTE2KSAodmFsNjQgPj4gNDgpOworCQkJY2tzdW0gPSBSWERfR0VUX0w0X0NLU1VNKHJ4ZHAtPkNvbnRyb2xfMSk7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCisJCQkJCSByeGRwLT5CdWZmZXIwX3B0ciwKKwkJCQkJIGRldi0+bXR1ICsKKwkJCQkJIEhFQURFUl9FVEhFUk5FVF9JSV84MDJfM19TSVpFICsKKwkJCQkJIEhFQURFUl84MDJfMl9TSVpFICsKKwkJCQkJIEhFQURFUl9TTkFQX1NJWkUsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcnhfb3NtX2hhbmRsZXIobmljLCB2YWwxNiwgcnhkcCwgaSk7CisJCQlwa3RfY250Kys7CisJCQlnZXRfaW5mby5vZmZzZXQrKzsKKwkJCWdldF9pbmZvLm9mZnNldCAlPSAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCQlyeGRwID0KKwkJCSAgICBuaWMtPnJ4X2Jsb2Nrc1tpXVtnZXRfYmxvY2tdLmJsb2NrX3ZpcnRfYWRkciArCisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0ub2Zmc2V0ID0KKwkJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCX0KKyNlbHNlCisJCWdldF9vZmZzZXQgPSAoZ2V0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCXB1dF9vZmZzZXQgPSAocHV0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCSAgICBwdXRfaW5mby5vZmZzZXQ7CisJCXdoaWxlICgoKCEocnhkcC0+Q29udHJvbF8xICYgUlhEX09XTl9YRU5BKSkgJiYKKwkJCSEocnhkcC0+Q29udHJvbF8yICYgQklUKDApKSkgJiYKKwkJICAgICAgICgoKGdldF9vZmZzZXQgKyAxKSAlIHJpbmdfYnVmcykgIT0gcHV0X29mZnNldCkpIHsKKwkJCWlmICgtLXBrdHNfdG9fcHJvY2VzcyA8IDApIHsKKwkJCQlnb3RvIG5vX3J4OworCQkJfQorCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopICgodW5zaWduZWQgbG9uZykKKwkJCQkJCSAgcnhkcC0+SG9zdF9Db250cm9sKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFRoZSBza2IgaXMgIiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiTnVsbCBpbiBSeCBJbnRyXG4iKTsKKwkJCQlnb3RvIG5vX3J4OworCQkJfQorCisJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCisJCQkJCSByeGRwLT5CdWZmZXIwX3B0ciwKKwkJCQkJIEJVRjBfTEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcGNpX3VubWFwX3NpbmdsZShuaWMtPnBkZXYsIChkbWFfYWRkcl90KQorCQkJCQkgcnhkcC0+QnVmZmVyMV9wdHIsCisJCQkJCSBCVUYxX0xFTiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LCAoZG1hX2FkZHJfdCkKKwkJCQkJIHJ4ZHAtPkJ1ZmZlcjJfcHRyLAorCQkJCQkgZGV2LT5tdHUgKyBCVUYwX0xFTiArIDQsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJYmEgPSAmbmljLT5iYVtpXVtnZXRfYmxvY2tdW2dldF9pbmZvLm9mZnNldF07CisKKwkJCXJ4X29zbV9oYW5kbGVyKG5pYywgcnhkcCwgaSwgYmEpOworCisJCQlnZXRfaW5mby5vZmZzZXQrKzsKKwkJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLm9mZnNldCA9CisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQkJcnhkcCA9CisJCQkgICAgbmljLT5yeF9ibG9ja3NbaV1bZ2V0X2Jsb2NrXS5ibG9ja192aXJ0X2FkZHIgKworCQkJICAgIGdldF9pbmZvLm9mZnNldDsKKworCQkJaWYgKGdldF9pbmZvLm9mZnNldCAmJgorCQkJICAgICghKGdldF9pbmZvLm9mZnNldCAlIE1BWF9SWERTX1BFUl9CTE9DSykpKSB7CisJCQkJZ2V0X2luZm8ub2Zmc2V0ID0gMDsKKwkJCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS4KKwkJCQkgICAgb2Zmc2V0ID0gZ2V0X2luZm8ub2Zmc2V0OworCQkJCWdldF9ibG9jaysrOworCQkJCWdldF9ibG9jayAlPSBuaWMtPmJsb2NrX2NvdW50W2ldOworCQkJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLgorCQkJCSAgICBibG9ja19pbmRleCA9IGdldF9ibG9jazsKKwkJCQlyeGRwID0KKwkJCQkgICAgbmljLT5yeF9ibG9ja3NbaV1bZ2V0X2Jsb2NrXS4KKwkJCQkgICAgYmxvY2tfdmlydF9hZGRyOworCQkJfQorCQkJZ2V0X29mZnNldCA9CisJCQkgICAgKGdldF9ibG9jayAqIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSkgKworCQkJICAgIGdldF9pbmZvLm9mZnNldDsKKwkJCXBrdF9jbnQrKzsKKwkJfQorI2VuZGlmCisJfQorCWlmICghcGt0X2NudCkKKwkJcGt0X2NudCA9IDE7CisKKwlkZXYtPnF1b3RhIC09IHBrdF9jbnQ7CisJKmJ1ZGdldCAtPSBwa3RfY250OworCW5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCWlmIChmaWxsX3J4X2J1ZmZlcnMobmljLCBpKSA9PSAtRU5PTUVNKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOk91dCBvZiBtZW1vcnkiLCBkZXYtPm5hbWUpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIgaW4gUnggUG9sbCEhXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIFJlIGVuYWJsZSB0aGUgUnggaW50ZXJydXB0cy4gKi8KKwllbl9kaXNfYWJsZV9uaWNfaW50cnMobmljLCBSWF9UUkFGRklDX0lOVFIsIEVOQUJMRV9JTlRSUyk7CisJcmV0dXJuIDA7CisKKyAgICAgIG5vX3J4OgorCWRldi0+cXVvdGEgLT0gcGt0X2NudDsKKwkqYnVkZ2V0IC09IHBrdF9jbnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCWlmIChmaWxsX3J4X2J1ZmZlcnMobmljLCBpKSA9PSAtRU5PTUVNKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOk91dCBvZiBtZW1vcnkiLCBkZXYtPm5hbWUpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIgaW4gUnggUG9sbCEhXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAxOworfQorI2Vsc2UKKy8qKiAgCisgKiAgcnhfaW50cl9oYW5kbGVyIC0gUnggaW50ZXJydXB0IGhhbmRsZXIKKyAqICBAbmljOiBkZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZS4KKyAqICBEZXNjcmlwdGlvbjogCisgKiAgSWYgdGhlIGludGVycnVwdCBpcyBiZWNhdXNlIG9mIGEgcmVjZWl2ZWQgZnJhbWUgb3IgaWYgdGhlIAorICogIHJlY2VpdmUgcmluZyBjb250YWlucyBmcmVzaCBhcyB5ZXQgdW4tcHJvY2Vzc2VkIGZyYW1lcyx0aGlzIGZ1bmN0aW9uIGlzCisgKiAgY2FsbGVkLiBJdCBwaWNrcyBvdXQgdGhlIFJ4RCBhdCB3aGljaCBwbGFjZSB0aGUgbGFzdCBSeCBwcm9jZXNzaW5nIGhhZCAKKyAqICBzdG9wcGVkIGFuZCBzZW5kcyB0aGUgc2tiIHRvIHRoZSBPU00ncyBSeCBoYW5kbGVyIGFuZCB0aGVuIGluY3JlbWVudHMgCisgKiAgdGhlIG9mZnNldC4KKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgTk9ORS4KKyAqLworCitzdGF0aWMgdm9pZCByeF9pbnRyX2hhbmRsZXIoc3RydWN0IHMyaW9fbmljICpuaWMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBuaWMtPmRldjsKKwlYRU5BX2Rldl9jb25maWdfdCAqYmFyMCA9IChYRU5BX2Rldl9jb25maWdfdCAqKSBuaWMtPmJhcjA7CisJcnhfY3Vycl9nZXRfaW5mb190IGdldF9pbmZvLCBwdXRfaW5mbzsKKwlSeERfdCAqcnhkcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCXUxNiB2YWwxNiwgY2tzdW07CisjZW5kaWYKKwlyZWdpc3RlciB1NjQgdmFsNjQgPSAwOworCWludCBnZXRfYmxvY2ssIGdldF9vZmZzZXQsIHB1dF9ibG9jaywgcHV0X29mZnNldCwgcmluZ19idWZzOworCWludCBpLCBwa3RfY250ID0gMDsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisjaWZkZWYgQ09ORklHXzJCVUZGX01PREUKKwlidWZmQWRkX3QgKmJhOworI2VuZGlmCisKKwltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKKworCS8qIAorCSAqIHJ4X3RyYWZmaWNfaW50IHJlZyBpcyBhbiBSMSByZWdpc3RlciwgaGVuY2Ugd2UgcmVhZCBhbmQgd3JpdGUgYmFjayAKKwkgKiB0aGUgc2FtZXZhbHVlIGluIHRoZSByZWdpc3RlciB0byBjbGVhciBpdC4KKwkgKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5yeF90cmFmZmljX2ludCk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnhfdHJhZmZpY19pbnQpOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQlnZXRfaW5mbyA9IG1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldOworCQlnZXRfYmxvY2sgPSBnZXRfaW5mby5ibG9ja19pbmRleDsKKwkJcHV0X2luZm8gPSBtYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tpXTsKKwkJcHV0X2Jsb2NrID0gcHV0X2luZm8uYmxvY2tfaW5kZXg7CisJCXJpbmdfYnVmcyA9IGNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQ7CisJCXJ4ZHAgPSBuaWMtPnJ4X2Jsb2Nrc1tpXVtnZXRfYmxvY2tdLmJsb2NrX3ZpcnRfYWRkciArCisJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisjaWZuZGVmCUNPTkZJR18yQlVGRl9NT0RFCisJCWdldF9vZmZzZXQgPSAoZ2V0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCXNwaW5fbG9jaygmbmljLT5wdXRfbG9jayk7CisJCXB1dF9vZmZzZXQgPSBuaWMtPnB1dF9wb3NbaV07CisJCXNwaW5fdW5sb2NrKCZuaWMtPnB1dF9sb2NrKTsKKwkJd2hpbGUgKCghKHJ4ZHAtPkNvbnRyb2xfMSAmIFJYRF9PV05fWEVOQSkpICYmCisJCSAgICAgICAoKChnZXRfb2Zmc2V0ICsgMSkgJSByaW5nX2J1ZnMpICE9IHB1dF9vZmZzZXQpKSB7CisJCQlpZiAocnhkcC0+Q29udHJvbF8xID09IEVORF9PRl9CTE9DSykgeworCQkJCXJ4ZHAgPSAoUnhEX3QgKikgKCh1bnNpZ25lZCBsb25nKQorCQkJCQkJICByeGRwLT5Db250cm9sXzIpOworCQkJCWdldF9pbmZvLm9mZnNldCsrOworCQkJCWdldF9pbmZvLm9mZnNldCAlPQorCQkJCSAgICAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCQkJZ2V0X2Jsb2NrKys7CisJCQkJZ2V0X2Jsb2NrICU9IG5pYy0+YmxvY2tfY291bnRbaV07CisJCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0uCisJCQkJICAgIG9mZnNldCA9IGdldF9pbmZvLm9mZnNldDsKKwkJCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS4KKwkJCQkgICAgYmxvY2tfaW5kZXggPSBnZXRfYmxvY2s7CisJCQkJY29udGludWU7CisJCQl9CisJCQlnZXRfb2Zmc2V0ID0KKwkJCSAgICAoZ2V0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopICgodW5zaWduZWQgbG9uZykKKwkJCQkJCSAgcnhkcC0+SG9zdF9Db250cm9sKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFRoZSBza2IgaXMgIiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiTnVsbCBpbiBSeCBJbnRyXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl2YWw2NCA9IFJYRF9HRVRfQlVGRkVSMF9TSVpFKHJ4ZHAtPkNvbnRyb2xfMik7CisJCQl2YWwxNiA9ICh1MTYpICh2YWw2NCA+PiA0OCk7CisJCQlja3N1bSA9IFJYRF9HRVRfTDRfQ0tTVU0ocnhkcC0+Q29udHJvbF8xKTsKKwkJCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LCAoZG1hX2FkZHJfdCkKKwkJCQkJIHJ4ZHAtPkJ1ZmZlcjBfcHRyLAorCQkJCQkgZGV2LT5tdHUgKworCQkJCQkgSEVBREVSX0VUSEVSTkVUX0lJXzgwMl8zX1NJWkUgKworCQkJCQkgSEVBREVSXzgwMl8yX1NJWkUgKworCQkJCQkgSEVBREVSX1NOQVBfU0laRSwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlyeF9vc21faGFuZGxlcihuaWMsIHZhbDE2LCByeGRwLCBpKTsKKwkJCWdldF9pbmZvLm9mZnNldCsrOworCQkJZ2V0X2luZm8ub2Zmc2V0ICU9IChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKTsKKwkJCXJ4ZHAgPQorCQkJICAgIG5pYy0+cnhfYmxvY2tzW2ldW2dldF9ibG9ja10uYmxvY2tfdmlydF9hZGRyICsKKwkJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS5vZmZzZXQgPQorCQkJICAgIGdldF9pbmZvLm9mZnNldDsKKwkJCXBrdF9jbnQrKzsKKwkJCWlmICgoaW5kaWNhdGVfbWF4X3BrdHMpCisJCQkgICAgJiYgKHBrdF9jbnQgPiBpbmRpY2F0ZV9tYXhfcGt0cykpCisJCQkJYnJlYWs7CisJCX0KKyNlbHNlCisJCWdldF9vZmZzZXQgPSAoZ2V0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCXNwaW5fbG9jaygmbmljLT5wdXRfbG9jayk7CisJCXB1dF9vZmZzZXQgPSBuaWMtPnB1dF9wb3NbaV07CisJCXNwaW5fdW5sb2NrKCZuaWMtPnB1dF9sb2NrKTsKKwkJd2hpbGUgKCgoIShyeGRwLT5Db250cm9sXzEgJiBSWERfT1dOX1hFTkEpKSAmJgorCQkJIShyeGRwLT5Db250cm9sXzIgJiBCSVQoMCkpKSAmJgorCQkgICAgICAgKCgoZ2V0X29mZnNldCArIDEpICUgcmluZ19idWZzKSAhPSBwdXRfb2Zmc2V0KSkgeworCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopICgodW5zaWduZWQgbG9uZykKKwkJCQkJCSAgcnhkcC0+SG9zdF9Db250cm9sKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFRoZSBza2IgaXMgIiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiTnVsbCBpbiBSeCBJbnRyXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LCAoZG1hX2FkZHJfdCkKKwkJCQkJIHJ4ZHAtPkJ1ZmZlcjBfcHRyLAorCQkJCQkgQlVGMF9MRU4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCisJCQkJCSByeGRwLT5CdWZmZXIxX3B0ciwKKwkJCQkJIEJVRjFfTEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcGNpX3VubWFwX3NpbmdsZShuaWMtPnBkZXYsIChkbWFfYWRkcl90KQorCQkJCQkgcnhkcC0+QnVmZmVyMl9wdHIsCisJCQkJCSBkZXYtPm10dSArIEJVRjBfTEVOICsgNCwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQliYSA9ICZuaWMtPmJhW2ldW2dldF9ibG9ja11bZ2V0X2luZm8ub2Zmc2V0XTsKKworCQkJcnhfb3NtX2hhbmRsZXIobmljLCByeGRwLCBpLCBiYSk7CisKKwkJCWdldF9pbmZvLm9mZnNldCsrOworCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0ub2Zmc2V0ID0KKwkJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCQlyeGRwID0KKwkJCSAgICBuaWMtPnJ4X2Jsb2Nrc1tpXVtnZXRfYmxvY2tdLmJsb2NrX3ZpcnRfYWRkciArCisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCisJCQlpZiAoZ2V0X2luZm8ub2Zmc2V0ICYmCisJCQkgICAgKCEoZ2V0X2luZm8ub2Zmc2V0ICUgTUFYX1JYRFNfUEVSX0JMT0NLKSkpIHsKKwkJCQlnZXRfaW5mby5vZmZzZXQgPSAwOworCQkJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLgorCQkJCSAgICBvZmZzZXQgPSBnZXRfaW5mby5vZmZzZXQ7CisJCQkJZ2V0X2Jsb2NrKys7CisJCQkJZ2V0X2Jsb2NrICU9IG5pYy0+YmxvY2tfY291bnRbaV07CisJCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0uCisJCQkJICAgIGJsb2NrX2luZGV4ID0gZ2V0X2Jsb2NrOworCQkJCXJ4ZHAgPQorCQkJCSAgICBuaWMtPnJ4X2Jsb2Nrc1tpXVtnZXRfYmxvY2tdLgorCQkJCSAgICBibG9ja192aXJ0X2FkZHI7CisJCQl9CisJCQlnZXRfb2Zmc2V0ID0KKwkJCSAgICAoZ2V0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQkJcGt0X2NudCsrOworCQkJaWYgKChpbmRpY2F0ZV9tYXhfcGt0cykKKwkJCSAgICAmJiAocGt0X2NudCA+IGluZGljYXRlX21heF9wa3RzKSkKKwkJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWlmICgoaW5kaWNhdGVfbWF4X3BrdHMpICYmIChwa3RfY250ID4gaW5kaWNhdGVfbWF4X3BrdHMpKQorCQkJYnJlYWs7CisJfQorfQorI2VuZGlmCisvKiogIAorICogIHR4X2ludHJfaGFuZGxlciAtIFRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyCisgKiAgQG5pYyA6IGRldmljZSBwcml2YXRlIHZhcmlhYmxlCisgKiAgRGVzY3JpcHRpb246IAorICogIElmIGFuIGludGVycnVwdCB3YXMgcmFpc2VkIHRvIGluZGljYXRlIERNQSBjb21wbGV0ZSBvZiB0aGUgCisgKiAgVHggcGFja2V0LCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gSXQgaWRlbnRpZmllcyB0aGUgbGFzdCBUeEQgCisgKiAgd2hvc2UgYnVmZmVyIHdhcyBmcmVlZCBhbmQgZnJlZXMgYWxsIHNrYnMgd2hvc2UgZGF0YSBoYXZlIGFscmVhZHkgCisgKiAgRE1BJ2VkIGludG8gdGhlIE5JQ3MgaW50ZXJuYWwgbWVtb3J5LgorICogIFJldHVybiBWYWx1ZToKKyAqICBOT05FCisgKi8KKworc3RhdGljIHZvaWQgdHhfaW50cl9oYW5kbGVyKHN0cnVjdCBzMmlvX25pYyAqbmljKQoreworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBuaWMtPmRldjsKKwl0eF9jdXJyX2dldF9pbmZvX3QgZ2V0X2luZm8sIHB1dF9pbmZvOworCXN0cnVjdCBza19idWZmICpza2I7CisJVHhEX3QgKnR4ZGxwOworCXJlZ2lzdGVyIHU2NCB2YWw2NCA9IDA7CisJaW50IGk7CisJdTE2IGosIGZyZ19jbnQ7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworCisJbWFjX2NvbnRyb2wgPSAmbmljLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmbmljLT5jb25maWc7CisKKwkvKiAKKwkgKiB0eF90cmFmZmljX2ludCByZWcgaXMgYW4gUjEgcmVnaXN0ZXIsIGhlbmNlIHdlIHJlYWQgYW5kIHdyaXRlIAorCSAqIGJhY2sgdGhlIHNhbWV2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgdG8gY2xlYXIgaXQuCisJICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+dHhfdHJhZmZpY19pbnQpOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4X3RyYWZmaWNfaW50KTsKKworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnR4X2ZpZm9fbnVtOyBpKyspIHsKKwkJZ2V0X2luZm8gPSBtYWNfY29udHJvbC0+dHhfY3Vycl9nZXRfaW5mb1tpXTsKKwkJcHV0X2luZm8gPSBtYWNfY29udHJvbC0+dHhfY3Vycl9wdXRfaW5mb1tpXTsKKwkJdHhkbHAgPSAoVHhEX3QgKikgbmljLT5saXN0X2luZm9baV1bZ2V0X2luZm8ub2Zmc2V0XS4KKwkJICAgIGxpc3RfdmlydF9hZGRyOworCQl3aGlsZSAoKCEodHhkbHAtPkNvbnRyb2xfMSAmIFRYRF9MSVNUX09XTl9YRU5BKSkgJiYKKwkJICAgICAgIChnZXRfaW5mby5vZmZzZXQgIT0gcHV0X2luZm8ub2Zmc2V0KSAmJgorCQkgICAgICAgKHR4ZGxwLT5Ib3N0X0NvbnRyb2wpKSB7CisJCQkvKiBDaGVjayBmb3IgVHhEIGVycm9ycyAqLworCQkJaWYgKHR4ZGxwLT5Db250cm9sXzEgJiBUWERfVF9DT0RFKSB7CisJCQkJdW5zaWduZWQgbG9uZyBsb25nIGVycjsKKwkJCQllcnIgPSB0eGRscC0+Q29udHJvbF8xICYgVFhEX1RfQ09ERTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIioqKlR4RCBlcnJvciAlbGx4XG4iLAorCQkJCQkgIGVycik7CisJCQl9CisKKwkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkgIHR4ZGxwLT5Ib3N0X0NvbnRyb2wpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTnVsbCBza2IgIiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiaW4gVHggRnJlZSBJbnRyXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQluaWMtPnR4X3BrdF9jb3VudCsrOworCisJCQlmcmdfY250ID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKworCQkJLyogIEZvciB1bmZyYWdtZW50ZWQgc2tiICovCisJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCisJCQkJCSB0eGRscC0+QnVmZmVyX1BvaW50ZXIsCisJCQkJCSBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4sCisJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWlmIChmcmdfY250KSB7CisJCQkJVHhEX3QgKnRlbXAgPSB0eGRscDsKKwkJCQl0eGRscCsrOworCQkJCWZvciAoaiA9IDA7IGogPCBmcmdfY250OyBqKyssIHR4ZGxwKyspIHsKKwkJCQkJc2tiX2ZyYWdfdCAqZnJhZyA9CisJCQkJCSAgICAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tqXTsKKwkJCQkJcGNpX3VubWFwX3BhZ2UobmljLT5wZGV2LAorCQkJCQkJICAgICAgIChkbWFfYWRkcl90KQorCQkJCQkJICAgICAgIHR4ZGxwLT4KKwkJCQkJCSAgICAgICBCdWZmZXJfUG9pbnRlciwKKwkJCQkJCSAgICAgICBmcmFnLT5zaXplLAorCQkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCX0KKwkJCQl0eGRscCA9IHRlbXA7CisJCQl9CisJCQltZW1zZXQodHhkbHAsIDAsCisJCQkgICAgICAgKHNpemVvZihUeERfdCkgKiBjb25maWctPm1heF90eGRzKSk7CisKKwkJCS8qIFVwZGF0aW5nIHRoZSBzdGF0aXN0aWNzIGJsb2NrICovCisJCQluaWMtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCW5pYy0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCisJCQlnZXRfaW5mby5vZmZzZXQrKzsKKwkJCWdldF9pbmZvLm9mZnNldCAlPSBnZXRfaW5mby5maWZvX2xlbiArIDE7CisJCQl0eGRscCA9IChUeERfdCAqKSBuaWMtPmxpc3RfaW5mb1tpXQorCQkJICAgIFtnZXRfaW5mby5vZmZzZXRdLmxpc3RfdmlydF9hZGRyOworCQkJbWFjX2NvbnRyb2wtPnR4X2N1cnJfZ2V0X2luZm9baV0ub2Zmc2V0ID0KKwkJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCX0KKwl9CisKKwlzcGluX2xvY2soJm5pYy0+dHhfbG9jayk7CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXNwaW5fdW5sb2NrKCZuaWMtPnR4X2xvY2spOworfQorCisvKiogIAorICogIGFsYXJtX2ludHJfaGFuZGxlciAtIEFsYXJtIEludGVycnJ1cHQgaGFuZGxlcgorICogIEBuaWM6IGRldmljZSBwcml2YXRlIHZhcmlhYmxlCisgKiAgRGVzY3JpcHRpb246IElmIHRoZSBpbnRlcnJ1cHQgd2FzIG5laXRoZXIgYmVjYXVzZSBvZiBSeCBwYWNrZXQgb3IgVHggCisgKiAgY29tcGxldGUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBJZiB0aGUgaW50ZXJydXB0IHdhcyB0byBpbmRpY2F0ZQorICogIGEgbG9zcyBvZiBsaW5rLCB0aGUgT1NNIGxpbmsgc3RhdHVzIGhhbmRsZXIgaXMgaW52b2tlZCBmb3IgYW55IG90aGVyIAorICogIGFsYXJtIGludGVycnVwdCB0aGUgYmxvY2sgdGhhdCByYWlzZWQgdGhlIGludGVycnVwdCBpcyBkaXNwbGF5ZWQgCisgKiAgYW5kIGEgSC9XIHJlc2V0IGlzIGlzc3VlZC4KKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgTk9ORQorKi8KKworc3RhdGljIHZvaWQgYWxhcm1faW50cl9oYW5kbGVyKHN0cnVjdCBzMmlvX25pYyAqbmljKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgbmljLT5kZXY7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlyZWdpc3RlciB1NjQgdmFsNjQgPSAwLCBlcnJfcmVnID0gMDsKKworCS8qIEhhbmRsaW5nIGxpbmsgc3RhdHVzIGNoYW5nZSBlcnJvciBJbnRyICovCisJZXJyX3JlZyA9IHJlYWRxKCZiYXIwLT5tYWNfcm1hY19lcnJfcmVnKTsKKwl3cml0ZXEoZXJyX3JlZywgJmJhcjAtPm1hY19ybWFjX2Vycl9yZWcpOworCWlmIChlcnJfcmVnICYgUk1BQ19MSU5LX1NUQVRFX0NIQU5HRV9JTlQpIHsKKwkJc2NoZWR1bGVfd29yaygmbmljLT5zZXRfbGlua190YXNrKTsKKwl9CisKKwkvKiBJbiBjYXNlIG9mIGEgc2VyaW91cyBlcnJvciwgdGhlIGRldmljZSB3aWxsIGJlIFJlc2V0LiAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnNlcnJfc291cmNlKTsKKwlpZiAodmFsNjQgJiBTRVJSX1NPVVJDRV9BTlkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogRGV2aWNlIGluZGljYXRlcyAiLCBkZXYtPm5hbWUpOworCQlEQkdfUFJJTlQoRVJSX0RCRywgInNlcmlvdXMgZXJyb3IhIVxuIik7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc2NoZWR1bGVfd29yaygmbmljLT5yc3RfdGltZXJfdGFzayk7CisJfQorCisJLyoKKwkgKiBBbHNvIGFzIG1lbnRpb25lZCBpbiB0aGUgbGF0ZXN0IEVycmF0YSBzaGVldHMgaWYgdGhlIFBDQ19GQl9FQ0MKKwkgKiBFcnJvciBvY2N1cnMsIHRoZSBhZGFwdGVyIHdpbGwgYmUgcmVjeWNsZWQgYnkgZGlzYWJsaW5nIHRoZQorCSAqIGFkYXB0ZXIgZW5hYmxlIGJpdCBhbmQgZW5hYmxpbmcgaXQgYWdhaW4gYWZ0ZXIgdGhlIGRldmljZSAKKwkgKiBiZWNvbWVzIFF1aWVzY2VudC4KKwkgKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5wY2NfZXJyX3JlZyk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cGNjX2Vycl9yZWcpOworCWlmICh2YWw2NCAmIFBDQ19GQl9FQ0NfREJfRVJSKSB7CisJCXU2NCBhYyA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCQlhYyAmPSB+KEFEQVBURVJfQ05UTF9FTik7CisJCXdyaXRlcShhYywgJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisJCWFjID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisJCXNjaGVkdWxlX3dvcmsoJm5pYy0+c2V0X2xpbmtfdGFzayk7CisJfQorCisJLyogT3RoZXIgdHlwZSBvZiBpbnRlcnJ1cHRzIGFyZSBub3QgYmVpbmcgaGFuZGxlZCBub3csICBUT0RPICovCit9CisKKy8qKiAKKyAqICB3YWl0X2Zvcl9jbWRfY29tcGxldGUgLSB3YWl0cyBmb3IgYSBjb21tYW5kIHRvIGNvbXBsZXRlLgorICogIEBzcCA6IHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhlIAorICogIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqICBEZXNjcmlwdGlvbjogRnVuY3Rpb24gdGhhdCB3YWl0cyBmb3IgYSBjb21tYW5kIHRvIFdyaXRlIGludG8gUk1BQyAKKyAqICBBRERSIERBVEEgcmVnaXN0ZXJzIHRvIGJlIGNvbXBsZXRlZCBhbmQgcmV0dXJucyBlaXRoZXIgc3VjY2VzcyBvciAKKyAqICBlcnJvciBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY29tbWFuZCB3YXMgY29tcGxldGUgb3Igbm90LiAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgIFNVQ0NFU1Mgb24gc3VjY2VzcyBhbmQgRkFJTFVSRSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgd2FpdF9mb3JfY21kX2NvbXBsZXRlKG5pY190ICogc3ApCit7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCWludCByZXQgPSBGQUlMVVJFLCBjbnQgPSAwOworCXU2NCB2YWw2NDsKKworCXdoaWxlIChUUlVFKSB7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnJtYWNfYWRkcl9jbWRfbWVtKTsKKwkJaWYgKCEodmFsNjQgJiBSTUFDX0FERFJfQ01EX01FTV9TVFJPQkVfQ01EX0VYRUNVVElORykpIHsKKwkJCXJldCA9IFNVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoNTApOworCQlpZiAoY250KysgPiAxMCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKiAKKyAqICBzMmlvX3Jlc2V0IC0gUmVzZXRzIHRoZSBjYXJkLiAKKyAqICBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqICBEZXNjcmlwdGlvbjogRnVuY3Rpb24gdG8gUmVzZXQgdGhlIGNhcmQuIFRoaXMgZnVuY3Rpb24gdGhlbiBhbHNvCisgKiAgcmVzdG9yZXMgdGhlIHByZXZpb3VzbHkgc2F2ZWQgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgcmVnaXN0ZXJzIGFzIAorICogIHRoZSBjYXJkIHJlc2V0IGFsc28gcmVzZXRzIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlLgorICogIFJldHVybiB2YWx1ZToKKyAqICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkIHMyaW9fcmVzZXQobmljX3QgKiBzcCkKK3sKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJdTY0IHZhbDY0OworCXUxNiBzdWJpZDsKKworCXZhbDY0ID0gU1dfUkVTRVRfQUxMOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnN3X3Jlc2V0KTsKKworCS8qIAorCSAqIEF0IHRoaXMgc3RhZ2UsIGlmIHRoZSBQQ0kgd3JpdGUgaXMgaW5kZWVkIGNvbXBsZXRlZCwgdGhlIAorCSAqIGNhcmQgaXMgcmVzZXQgYW5kIHNvIGlzIHRoZSBQQ0kgQ29uZmlnIHNwYWNlIG9mIHRoZSBkZXZpY2UuIAorCSAqIFNvIGEgcmVhZCBjYW5ub3QgYmUgaXNzdWVkIGF0IHRoaXMgc3RhZ2Ugb24gYW55IG9mIHRoZSAKKwkgKiByZWdpc3RlcnMgdG8gZW5zdXJlIHRoZSB3cml0ZSBpbnRvICJzd19yZXNldCIgcmVnaXN0ZXIKKwkgKiBoYXMgZ29uZSB0aHJvdWdoLgorCSAqIFF1ZXN0aW9uOiBJcyB0aGVyZSBhbnkgc3lzdGVtIGNhbGwgdGhhdCB3aWxsIGV4cGxpY2l0bHkgZm9yY2UKKwkgKiBhbGwgdGhlIHdyaXRlIGNvbW1hbmRzIHN0aWxsIHBlbmRpbmcgb24gdGhlIGJ1cyB0byBiZSBwdXNoZWQKKwkgKiB0aHJvdWdoPworCSAqIEFzIG9mIG5vdyBJJ2FtIGp1c3QgZ2l2aW5nIGEgMjUwbXMgZGVsYXkgYW5kIGhvcGluZyB0aGF0IHRoZQorCSAqIFBDSSB3cml0ZSB0byBzd19yZXNldCByZWdpc3RlciBpcyBkb25lIGJ5IHRoaXMgdGltZS4KKwkgKi8KKwltc2xlZXAoMjUwKTsKKworCS8qIFJlc3RvcmUgdGhlIFBDSSBzdGF0ZSBzYXZlZCBkdXJpbmcgaW5pdGlhbGl6YXJpb24uICovCisJcGNpX3Jlc3RvcmVfc3RhdGUoc3AtPnBkZXYpOworCXMyaW9faW5pdF9wY2koc3ApOworCisJbXNsZWVwKDI1MCk7CisKKwkvKiBTWEUtMDAyOiBDb25maWd1cmUgbGluayBhbmQgYWN0aXZpdHkgTEVEIHRvIHR1cm4gaXQgb2ZmICovCisJc3ViaWQgPSBzcC0+cGRldi0+c3Vic3lzdGVtX2RldmljZTsKKwlpZiAoKHN1YmlkICYgMHhGRikgPj0gMHgwNykgeworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQl2YWw2NCB8PSAweDAwMDA4MDAwMDAwMDAwMDBVTEw7CisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdwaW9fY29udHJvbCk7CisJCXZhbDY0ID0gMHgwNDExMDQwNDAwMDAwMDAwVUxMOworCQl3cml0ZXEodmFsNjQsICh2b2lkIF9faW9tZW0gKikgYmFyMCArIDB4MjcwMCk7CisJfQorCisJc3AtPmRldmljZV9lbmFibGVkX29uY2UgPSBGQUxTRTsKK30KKworLyoqCisgKiAgczJpb19zZXRfc3dhcHBlciAtIHRvIHNldCB0aGUgc3dhcHBlciBjb250cm9sZSBvbiB0aGUgY2FyZCAKKyAqICBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgCisgKiAgcG9pbnRlciB0byB0aGUgczJpb19uaWMgc3RydWN0dXJlLgorICogIERlc2NyaXB0aW9uOiBGdW5jdGlvbiB0byBzZXQgdGhlIHN3YXBwZXIgY29udHJvbCBvbiB0aGUgY2FyZCAKKyAqICBjb3JyZWN0bHkgZGVwZW5kaW5nIG9uIHRoZSAnZW5kaWFubmVzcycgb2YgdGhlIHN5c3RlbS4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgU1VDQ0VTUyBvbiBzdWNjZXNzIGFuZCBGQUlMVVJFIG9uIGZhaWx1cmUuCisgKi8KKworc3RhdGljIGludCBzMmlvX3NldF9zd2FwcGVyKG5pY190ICogc3ApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5kZXY7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXU2NCB2YWw2NCwgdmFsdCwgdmFscjsKKworCS8qIAorCSAqIFNldCBwcm9wZXIgZW5kaWFuIHNldHRpbmdzIGFuZCB2ZXJpZnkgdGhlIHNhbWUgYnkgcmVhZGluZworCSAqIHRoZSBQSUYgRmVlZC1iYWNrIHJlZ2lzdGVyLgorCSAqLworCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+cGlmX3JkX3N3YXBwZXJfZmIpOworCWlmICh2YWw2NCAhPSAweDAxMjM0NTY3ODlBQkNERUZVTEwpIHsKKwkJaW50IGkgPSAwOworCQl1NjQgdmFsdWVbXSA9IHsgMHhDMzAwMDBDM0MzMDAwMEMzVUxMLCAgIC8qIEZFPTEsIFNFPTEgKi8KKwkJCQkweDgxMDAwMDgxODEwMDAwODFVTEwsICAvKiBGRT0xLCBTRT0wICovCisJCQkJMHg0MjAwMDA0MjQyMDAwMDQyVUxMLCAgLyogRkU9MCwgU0U9MSAqLworCQkJCTB9OyAgICAgICAgICAgICAgICAgICAgIC8qIEZFPTAsIFNFPTAgKi8KKworCQl3aGlsZShpPDQpIHsKKwkJCXdyaXRlcSh2YWx1ZVtpXSwgJmJhcjAtPnN3YXBwZXJfY3RybCk7CisJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5waWZfcmRfc3dhcHBlcl9mYik7CisJCQlpZiAodmFsNjQgPT0gMHgwMTIzNDU2Nzg5QUJDREVGVUxMKQorCQkJCWJyZWFrOworCQkJaSsrOworCQl9CisJCWlmIChpID09IDQpIHsKKwkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IEVuZGlhbiBzZXR0aW5ncyBhcmUgd3JvbmcsICIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCURCR19QUklOVChFUlJfREJHLCAiZmVlZGJhY2sgcmVhZCAlbGx4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHZhbDY0KTsKKwkJCXJldHVybiBGQUlMVVJFOworCQl9CisJCXZhbHIgPSB2YWx1ZVtpXTsKKwl9IGVsc2UgeworCQl2YWxyID0gcmVhZHEoJmJhcjAtPnN3YXBwZXJfY3RybCk7CisJfQorCisJdmFsdCA9IDB4MDEyMzQ1Njc4OUFCQ0RFRlVMTDsKKwl3cml0ZXEodmFsdCwgJmJhcjAtPnhtc2lfYWRkcmVzcyk7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+eG1zaV9hZGRyZXNzKTsKKworCWlmKHZhbDY0ICE9IHZhbHQpIHsKKwkJaW50IGkgPSAwOworCQl1NjQgdmFsdWVbXSA9IHsgMHgwMEMzQzMwMDAwQzNDMzAwVUxMLCAgLyogRkU9MSwgU0U9MSAqLworCQkJCTB4MDA4MTgxMDAwMDgxODEwMFVMTCwgIC8qIEZFPTEsIFNFPTAgKi8KKwkJCQkweDAwNDI0MjAwMDA0MjQyMDBVTEwsICAvKiBGRT0wLCBTRT0xICovCisJCQkJMH07ICAgICAgICAgICAgICAgICAgICAgLyogRkU9MCwgU0U9MCAqLworCisJCXdoaWxlKGk8NCkgeworCQkJd3JpdGVxKCh2YWx1ZVtpXSB8IHZhbHIpLCAmYmFyMC0+c3dhcHBlcl9jdHJsKTsKKwkJCXdyaXRlcSh2YWx0LCAmYmFyMC0+eG1zaV9hZGRyZXNzKTsKKwkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnhtc2lfYWRkcmVzcyk7CisJCQlpZih2YWw2NCA9PSB2YWx0KQorCQkJCWJyZWFrOworCQkJaSsrOworCQl9CisJCWlmKGkgPT0gNCkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICJXcml0ZSBmYWlsZWQsIFhtc2lfYWRkciAiKTsKKwkJCURCR19QUklOVChFUlJfREJHLCAicmVhZHM6MHglbGx4XG4iLHZhbDY0KTsKKwkJCXJldHVybiBGQUlMVVJFOworCQl9CisJfQorCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnN3YXBwZXJfY3RybCk7CisJdmFsNjQgJj0gMHhGRkZGMDAwMDAwMDAwMDAwVUxMOworCisjaWZkZWYgIF9fQklHX0VORElBTgorCS8qIAorCSAqIFRoZSBkZXZpY2UgYnkgZGVmYXVsdCBzZXQgdG8gYSBiaWcgZW5kaWFuIGZvcm1hdCwgc28gYSAKKwkgKiBiaWcgZW5kaWFuIGRyaXZlciBuZWVkIG5vdCBzZXQgYW55dGhpbmcuCisJICovCisJdmFsNjQgfD0gKFNXQVBQRVJfQ1RSTF9UWFBfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1RYUF9TRSB8CisJCSBTV0FQUEVSX0NUUkxfVFhEX1JfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1RYRF9XX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9UWEZfUl9GRSB8CisJCSBTV0FQUEVSX0NUUkxfUlhEX1JfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1JYRF9XX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9SWEZfV19GRSB8CisJCSBTV0FQUEVSX0NUUkxfWE1TSV9GRSB8CisJCSBTV0FQUEVSX0NUUkxfWE1TSV9TRSB8CisJCSBTV0FQUEVSX0NUUkxfU1RBVFNfRkUgfCBTV0FQUEVSX0NUUkxfU1RBVFNfU0UpOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnN3YXBwZXJfY3RybCk7CisjZWxzZQorCS8qIAorCSAqIEluaXRpYWxseSB3ZSBlbmFibGUgYWxsIGJpdHMgdG8gbWFrZSBpdCBhY2Nlc3NpYmxlIGJ5IHRoZQorCSAqIGRyaXZlciwgdGhlbiB3ZSBzZWxlY3RpdmVseSBlbmFibGUgb25seSB0aG9zZSBiaXRzIHRoYXQgCisJICogd2Ugd2FudCB0byBzZXQuCisJICovCisJdmFsNjQgfD0gKFNXQVBQRVJfQ1RSTF9UWFBfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1RYUF9TRSB8CisJCSBTV0FQUEVSX0NUUkxfVFhEX1JfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1RYRF9SX1NFIHwKKwkJIFNXQVBQRVJfQ1RSTF9UWERfV19GRSB8CisJCSBTV0FQUEVSX0NUUkxfVFhEX1dfU0UgfAorCQkgU1dBUFBFUl9DVFJMX1RYRl9SX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9SWERfUl9GRSB8CisJCSBTV0FQUEVSX0NUUkxfUlhEX1JfU0UgfAorCQkgU1dBUFBFUl9DVFJMX1JYRF9XX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9SWERfV19TRSB8CisJCSBTV0FQUEVSX0NUUkxfUlhGX1dfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1hNU0lfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1hNU0lfU0UgfAorCQkgU1dBUFBFUl9DVFJMX1NUQVRTX0ZFIHwgU1dBUFBFUl9DVFJMX1NUQVRTX1NFKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5zd2FwcGVyX2N0cmwpOworI2VuZGlmCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+c3dhcHBlcl9jdHJsKTsKKworCS8qIAorCSAqIFZlcmlmeWluZyBpZiBlbmRpYW4gc2V0dGluZ3MgYXJlIGFjY3VyYXRlIGJ5IHJlYWRpbmcgYSAKKwkgKiBmZWVkYmFjayByZWdpc3Rlci4KKwkgKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5waWZfcmRfc3dhcHBlcl9mYik7CisJaWYgKHZhbDY0ICE9IDB4MDEyMzQ1Njc4OUFCQ0RFRlVMTCkgeworCQkvKiBFbmRpYW4gc2V0dGluZ3MgYXJlIGluY29ycmVjdCwgY2FsbHMgZm9yIGFub3RoZXIgZGVra28uICovCisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IEVuZGlhbiBzZXR0aW5ncyBhcmUgd3JvbmcsICIsCisJCQkgIGRldi0+bmFtZSk7CisJCURCR19QUklOVChFUlJfREJHLCAiZmVlZGJhY2sgcmVhZCAlbGx4XG4iLAorCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSB2YWw2NCk7CisJCXJldHVybiBGQUlMVVJFOworCX0KKworCXJldHVybiBTVUNDRVNTOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKgorICogRnVuY3Rpb25zIGRlZmluZWQgYmVsb3cgY29uY2VybiB0aGUgT1MgcGFydCBvZiB0aGUgZHJpdmVyICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiogIAorICogIHMyaW9fb3BlbiAtIG9wZW4gZW50cnkgcG9pbnQgb2YgdGhlIGRyaXZlcgorICogIEBkZXYgOiBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgorICogIERlc2NyaXB0aW9uOgorICogIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG9wZW4gZW50cnkgcG9pbnQgb2YgdGhlIGRyaXZlci4gSXQgbWFpbmx5IGNhbGxzIGEKKyAqICBmdW5jdGlvbiB0byBhbGxvY2F0ZSBSeCBidWZmZXJzIGFuZCBpbnNlcnRzIHRoZW0gaW50byB0aGUgYnVmZmVyCisgKiAgZGVzY3JpcHRvcnMgYW5kIHRoZW4gZW5hYmxlcyB0aGUgUnggcGFydCBvZiB0aGUgTklDLiAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgMCBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSAoLSl2ZSBpbnRlZ2VyIGFzIGRlZmluZWQgaW4gZXJybm8uaAorICogICBmaWxlIG9uIGZhaWx1cmUuCisgKi8KKworc3RhdGljIGludCBzMmlvX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJaW50IGVyciA9IDA7CisKKwkvKiAKKwkgKiBNYWtlIHN1cmUgeW91IGhhdmUgbGluayBvZmYgYnkgZGVmYXVsdCBldmVyeSB0aW1lIAorCSAqIE5pYyBpcyBpbml0aWFsaXplZAorCSAqLworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJc3AtPmxhc3RfbGlua19zdGF0ZSA9IExJTktfRE9XTjsKKworCS8qIEluaXRpYWxpemUgSC9XIGFuZCBlbmFibGUgaW50ZXJydXB0cyAqLworCWlmIChzMmlvX2NhcmRfdXAoc3ApKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IEgvVyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEFmdGVyIHByb3BlciBpbml0aWFsaXphdGlvbiBvZiBIL1csIHJlZ2lzdGVyIElTUiAqLworCWVyciA9IHJlcXVlc3RfaXJxKChpbnQpIHNwLT5pcnEsIHMyaW9faXNyLCBTQV9TSElSUSwKKwkJCSAgc3AtPm5hbWUsIGRldik7CisJaWYgKGVycikgeworCQlzMmlvX3Jlc2V0KHNwKTsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogSVNSIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHMyaW9fc2V0X21hY19hZGRyKGRldiwgZGV2LT5kZXZfYWRkcikgPT0gRkFJTFVSRSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIlNldCBNYWMgQWRkcmVzcyBGYWlsZWRcbiIpOworCQlzMmlvX3Jlc2V0KHNwKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgczJpb19jbG9zZSAtY2xvc2UgZW50cnkgcG9pbnQgb2YgdGhlIGRyaXZlcgorICogIEBkZXYgOiBkZXZpY2UgcG9pbnRlci4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGlzIHRoZSBzdG9wIGVudHJ5IHBvaW50IG9mIHRoZSBkcml2ZXIuIEl0IG5lZWRzIHRvIHVuZG8gZXhhY3RseQorICogIHdoYXRldmVyIHdhcyBkb25lIGJ5IHRoZSBvcGVuIGVudHJ5IHBvaW50LHRodXMgaXQncyB1c3VhbGx5IHJlZmVycmVkIHRvCisgKiAgYXMgdGhlIGNsb3NlIGZ1bmN0aW9uLkFtb25nIG90aGVyIHRoaW5ncyB0aGlzIGZ1bmN0aW9uIG1haW5seSBzdG9wcyB0aGUKKyAqICBSeCBzaWRlIG9mIHRoZSBOSUMgYW5kIGZyZWVzIGFsbCB0aGUgUnggYnVmZmVycyBpbiB0aGUgUnggcmluZ3MuCisgKiAgUmV0dXJuIHZhbHVlOgorICogIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgKC0pdmUgaW50ZWdlciBhcyBkZWZpbmVkIGluIGVycm5vLmgKKyAqICBmaWxlIG9uIGZhaWx1cmUuCisgKi8KKworc3RhdGljIGludCBzMmlvX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJLyogUmVzZXQgY2FyZCwga2lsbCB0YXNrbGV0IGFuZCBmcmVlIFR4IGFuZCBSeCBidWZmZXJzLiAqLworCXMyaW9fY2FyZF9kb3duKHNwKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXNwLT5kZXZpY2VfY2xvc2VfZmxhZyA9IFRSVUU7CS8qIERldmljZSBpcyBzaHV0IGRvd24uICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIHMyaW9feG1pdCAtIFR4IGVudHJ5IHBvaW50IG9mIHRlIGRyaXZlcgorICogIEBza2IgOiB0aGUgc29ja2V0IGJ1ZmZlciBjb250YWluaW5nIHRoZSBUeCBkYXRhLgorICogIEBkZXYgOiBkZXZpY2UgcG9pbnRlci4KKyAqICBEZXNjcmlwdGlvbiA6CisgKiAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgVHggZW50cnkgcG9pbnQgb2YgdGhlIGRyaXZlci4gUzJJTyBOSUMgc3VwcG9ydHMKKyAqICBjZXJ0YWluIHByb3RvY29sIGFzc2lzdCBmZWF0dXJlcyBvbiBUeCBzaWRlLCBuYW1lbHkgIENTTywgUy9HLCBMU08uCisgKiAgTk9URTogd2hlbiBkZXZpY2UgY2FudCBxdWV1ZSB0aGUgcGt0LGp1c3QgdGhlIHRyYW5zX3N0YXJ0IHZhcmlhYmxlIHdpbGwKKyAqICBub3QgYmUgdXBhZHRlZC4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgMCBvbiBzdWNjZXNzICYgMSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgczJpb194bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCXUxNiBmcmdfY250LCBmcmdfbGVuLCBpLCBxdWV1ZSwgcXVldWVfbGVuLCBwdXRfb2ZmLCBnZXRfb2ZmOworCXJlZ2lzdGVyIHU2NCB2YWw2NDsKKwlUeERfdCAqdHhkcDsKKwlUeEZJRk9fZWxlbWVudF90IF9faW9tZW0gKnR4X2ZpZm87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBORVRJRl9GX1RTTworCWludCBtc3M7CisjZW5kaWYKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCisJbWFjX2NvbnRyb2wgPSAmc3AtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZzcC0+Y29uZmlnOworCisJREJHX1BSSU5UKFRYX0RCRywgIiVzOiBJbiBTMklPIFR4IHJvdXRpbmVcbiIsIGRldi0+bmFtZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwLT50eF9sb2NrLCBmbGFncyk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnNwLT5jYXJkX3N0YXRlKSA9PSBDQVJEX0RPV04pIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogQ2FyZCBnb2luZyBkb3duIGZvciByZXNldFxuIiwKKwkJCSAgZGV2LT5uYW1lKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPnR4X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcXVldWUgPSAwOworCXB1dF9vZmYgPSAodTE2KSBtYWNfY29udHJvbC0+dHhfY3Vycl9wdXRfaW5mb1txdWV1ZV0ub2Zmc2V0OworCWdldF9vZmYgPSAodTE2KSBtYWNfY29udHJvbC0+dHhfY3Vycl9nZXRfaW5mb1txdWV1ZV0ub2Zmc2V0OworCXR4ZHAgPSAoVHhEX3QgKikgc3AtPmxpc3RfaW5mb1txdWV1ZV1bcHV0X29mZl0ubGlzdF92aXJ0X2FkZHI7CisKKwlxdWV1ZV9sZW4gPSBtYWNfY29udHJvbC0+dHhfY3Vycl9wdXRfaW5mb1txdWV1ZV0uZmlmb19sZW4gKyAxOworCS8qIEF2b2lkICJwdXQiIHBvaW50ZXIgZ29pbmcgYmV5b25kICJnZXQiIHBvaW50ZXIgKi8KKwlpZiAodHhkcC0+SG9zdF9Db250cm9sIHx8ICgoKHB1dF9vZmYgKyAxKSAlIHF1ZXVlX2xlbikgPT0gZ2V0X29mZikpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJFcnJvciBpbiB4bWl0LCBObyBmcmVlIFRYRHMuXG4iKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT50eF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKyNpZmRlZiBORVRJRl9GX1RTTworCW1zcyA9IHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemU7CisJaWYgKG1zcykgeworCQl0eGRwLT5Db250cm9sXzEgfD0gVFhEX1RDUF9MU09fRU47CisJCXR4ZHAtPkNvbnRyb2xfMSB8PSBUWERfVENQX0xTT19NU1MobXNzKTsKKwl9CisjZW5kaWYKKworCWZyZ19jbnQgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCWZyZ19sZW4gPSBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW47CisKKwl0eGRwLT5Ib3N0X0NvbnRyb2wgPSAodW5zaWduZWQgbG9uZykgc2tiOworCXR4ZHAtPkJ1ZmZlcl9Qb2ludGVyID0gcGNpX21hcF9zaW5nbGUKKwkgICAgKHNwLT5wZGV2LCBza2ItPmRhdGEsIGZyZ19sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQl0eGRwLT5Db250cm9sXzIgfD0KKwkJICAgIChUWERfVFhfQ0tPX0lQVjRfRU4gfCBUWERfVFhfQ0tPX1RDUF9FTiB8CisJCSAgICAgVFhEX1RYX0NLT19VRFBfRU4pOworCX0KKworCXR4ZHAtPkNvbnRyb2xfMiB8PSBjb25maWctPnR4X2ludHJfdHlwZTsKKworCXR4ZHAtPkNvbnRyb2xfMSB8PSAoVFhEX0JVRkZFUjBfU0laRShmcmdfbGVuKSB8CisJCQkgICAgVFhEX0dBVEhFUl9DT0RFX0ZJUlNUKTsKKwl0eGRwLT5Db250cm9sXzEgfD0gVFhEX0xJU1RfT1dOX1hFTkE7CisKKwkvKiBGb3IgZnJhZ21lbnRlZCBTS0IuICovCisJZm9yIChpID0gMDsgaSA8IGZyZ19jbnQ7IGkrKykgeworCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCXR4ZHArKzsKKwkJdHhkcC0+QnVmZmVyX1BvaW50ZXIgPSAodTY0KSBwY2lfbWFwX3BhZ2UKKwkJICAgIChzcC0+cGRldiwgZnJhZy0+cGFnZSwgZnJhZy0+cGFnZV9vZmZzZXQsCisJCSAgICAgZnJhZy0+c2l6ZSwgUENJX0RNQV9UT0RFVklDRSk7CisJCXR4ZHAtPkNvbnRyb2xfMSB8PSBUWERfQlVGRkVSMF9TSVpFKGZyYWctPnNpemUpOworCX0KKwl0eGRwLT5Db250cm9sXzEgfD0gVFhEX0dBVEhFUl9DT0RFX0xBU1Q7CisKKwl0eF9maWZvID0gbWFjX2NvbnRyb2wtPnR4X0ZJRk9fc3RhcnRbcXVldWVdOworCXZhbDY0ID0gc3AtPmxpc3RfaW5mb1txdWV1ZV1bcHV0X29mZl0ubGlzdF9waHlfYWRkcjsKKwl3cml0ZXEodmFsNjQsICZ0eF9maWZvLT5UeERMX1BvaW50ZXIpOworCisJdmFsNjQgPSAoVFhfRklGT19MQVNUX1RYRF9OVU0oZnJnX2NudCkgfCBUWF9GSUZPX0ZJUlNUX0xJU1QgfAorCQkgVFhfRklGT19MQVNUX0xJU1QpOworI2lmZGVmIE5FVElGX0ZfVFNPCisJaWYgKG1zcykKKwkJdmFsNjQgfD0gVFhfRklGT19TUEVDSUFMX0ZVTkM7CisjZW5kaWYKKwl3cml0ZXEodmFsNjQsICZ0eF9maWZvLT5MaXN0X0NvbnRyb2wpOworCisJLyogUGVyZm9ybSBhIFBDSSByZWFkIHRvIGZsdXNoIHByZXZpb3VzIHdyaXRlcyAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X3N0YXR1cyk7CisKKwlwdXRfb2ZmKys7CisJcHV0X29mZiAlPSBtYWNfY29udHJvbC0+dHhfY3Vycl9wdXRfaW5mb1txdWV1ZV0uZmlmb19sZW4gKyAxOworCW1hY19jb250cm9sLT50eF9jdXJyX3B1dF9pbmZvW3F1ZXVlXS5vZmZzZXQgPSBwdXRfb2ZmOworCisJLyogQXZvaWQgInB1dCIgcG9pbnRlciBnb2luZyBiZXlvbmQgImdldCIgcG9pbnRlciAqLworCWlmICgoKHB1dF9vZmYgKyAxKSAlIHF1ZXVlX2xlbikgPT0gZ2V0X29mZikgeworCQlEQkdfUFJJTlQoVFhfREJHLAorCQkJICAiTm8gZnJlZSBUeERzIGZvciB4bWl0LCBQdXQ6IDB4JXggR2V0OjB4JXhcbiIsCisJCQkgIHB1dF9vZmYsIGdldF9vZmYpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPnR4X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICBzMmlvX2lzciAtIElTUiBoYW5kbGVyIG9mIHRoZSBkZXZpY2UgLgorICogIEBpcnE6IHRoZSBpcnEgb2YgdGhlIGRldmljZS4KKyAqICBAZGV2X2lkOiBhIHZvaWQgcG9pbnRlciB0byB0aGUgZGV2IHN0cnVjdHVyZSBvZiB0aGUgTklDLgorICogIEBwdF9yZWdzOiBwb2ludGVyIHRvIHRoZSByZWdpc3RlcnMgcHVzaGVkIG9uIHRoZSBzdGFjay4KKyAqICBEZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb24gaXMgdGhlIElTUiBoYW5kbGVyIG9mIHRoZSBkZXZpY2UuIEl0IAorICogIGlkZW50aWZpZXMgdGhlIHJlYXNvbiBmb3IgdGhlIGludGVycnVwdCBhbmQgY2FsbHMgdGhlIHJlbGV2YW50IAorICogIHNlcnZpY2Ugcm91dGluZXMuIEFzIGEgY29udG9uZ2VuY3kgbWVhc3VyZSwgdGhpcyBJU1IgYWxsb2NhdGVzIHRoZSAKKyAqICByZWN2IGJ1ZmZlcnMsIGlmIHRoZWlyIG51bWJlcnMgYXJlIGJlbG93IHRoZSBwYW5pYyB2YWx1ZSB3aGljaCBpcworICogIHByZXNlbnRseSBzZXQgdG8gMjUlIG9mIHRoZSBvcmlnaW5hbCBudW1iZXIgb2YgcmN2IGJ1ZmZlcnMgYWxsb2NhdGVkLgorICogIFJldHVybiB2YWx1ZToKKyAqICAgSVJRX0hBTkRMRUQ6IHdpbGwgYmUgcmV0dXJuZWQgaWYgSVJRIHdhcyBoYW5kbGVkIGJ5IHRoaXMgcm91dGluZSAKKyAqICAgSVJRX05PTkU6IHdpbGwgYmUgcmV0dXJuZWQgaWYgaW50ZXJydXB0IGlzIG5vdCBmcm9tIG91ciBkZXZpY2UKKyAqLworc3RhdGljIGlycXJldHVybl90IHMyaW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKyNpZm5kZWYgQ09ORklHX1MySU9fTkFQSQorCWludCBpLCByZXQ7CisjZW5kaWYKKwl1NjQgcmVhc29uID0gMDsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisKKwltYWNfY29udHJvbCA9ICZzcC0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJnNwLT5jb25maWc7CisKKwkvKiAKKwkgKiBJZGVudGlmeSB0aGUgY2F1c2UgZm9yIGludGVycnVwdCBhbmQgY2FsbCB0aGUgYXBwcm9wcmlhdGUKKwkgKiBpbnRlcnJ1cHQgaGFuZGxlci4gQ2F1c2VzIGZvciB0aGUgaW50ZXJydXB0IGNvdWxkIGJlOworCSAqIDEuIFJ4IG9mIHBhY2tldC4KKwkgKiAyLiBUeCBjb21wbGV0ZS4KKwkgKiAzLiBMaW5rIGRvd24uCisJICogNC4gRXJyb3IgaW4gYW55IGZ1bmN0aW9uYWwgYmxvY2tzIG9mIHRoZSBOSUMuIAorCSAqLworCXJlYXNvbiA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9zdGF0dXMpOworCisJaWYgKCFyZWFzb24pIHsKKwkJLyogVGhlIGludGVycnVwdCB3YXMgbm90IHJhaXNlZCBieSBYZW5hLiAqLworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJLyogSWYgSW50ciBpcyBiZWNhdXNlIG9mIFR4IFRyYWZmaWMgKi8KKwlpZiAocmVhc29uICYgR0VOX0lOVFJfVFhUUkFGRklDKSB7CisJCXR4X2ludHJfaGFuZGxlcihzcCk7CisJfQorCisJLyogSWYgSW50ciBpcyBiZWNhdXNlIG9mIGFuIGVycm9yICovCisJaWYgKHJlYXNvbiAmIChHRU5fRVJST1JfSU5UUikpCisJCWFsYXJtX2ludHJfaGFuZGxlcihzcCk7CisKKyNpZmRlZiBDT05GSUdfUzJJT19OQVBJCisJaWYgKHJlYXNvbiAmIEdFTl9JTlRSX1JYVFJBRkZJQykgeworCQlpZiAobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChkZXYpKSB7CisJCQllbl9kaXNfYWJsZV9uaWNfaW50cnMoc3AsIFJYX1RSQUZGSUNfSU5UUiwKKwkJCQkJICAgICAgRElTQUJMRV9JTlRSUyk7CisJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJCX0KKwl9CisjZWxzZQorCS8qIElmIEludHIgaXMgYmVjYXVzZSBvZiBSeCBUcmFmZmljICovCisJaWYgKHJlYXNvbiAmIEdFTl9JTlRSX1JYVFJBRkZJQykgeworCQlyeF9pbnRyX2hhbmRsZXIoc3ApOworCX0KKyNlbmRpZgorCisJLyogCisJICogSWYgdGhlIFJ4IGJ1ZmZlciBjb3VudCBpcyBiZWxvdyB0aGUgcGFuaWMgdGhyZXNob2xkIHRoZW4gCisJICogcmVhbGxvY2F0ZSB0aGUgYnVmZmVycyBmcm9tIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpdHNlbGYsIAorCSAqIGVsc2Ugc2NoZWR1bGUgYSB0YXNrbGV0IHRvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlcnMuCisJICovCisjaWZuZGVmIENPTkZJR19TMklPX05BUEkKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCWludCByeGJfc2l6ZSA9IGF0b21pY19yZWFkKCZzcC0+cnhfYnVmc19sZWZ0W2ldKTsKKwkJaW50IGxldmVsID0gcnhfYnVmZmVyX2xldmVsKHNwLCByeGJfc2l6ZSwgaSk7CisKKwkJaWYgKChsZXZlbCA9PSBQQU5JQykgJiYgKCFUQVNLTEVUX0lOX1VTRSkpIHsKKwkJCURCR19QUklOVChJTlRSX0RCRywgIiVzOiBSeCBCRCBoaXQgIiwgZGV2LT5uYW1lKTsKKwkJCURCR19QUklOVChJTlRSX0RCRywgIlBBTklDIGxldmVsc1xuIik7CisJCQlpZiAoKHJldCA9IGZpbGxfcnhfYnVmZmVycyhzcCwgaSkpID09IC1FTk9NRU0pIHsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOk91dCBvZiBtZW1vcnkiLAorCQkJCQkgIGRldi0+bmFtZSk7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIgaW4gSVNSISFcbiIpOworCQkJCWNsZWFyX2JpdCgwLCAoJnNwLT50YXNrbGV0X3N0YXR1cykpOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKwkJCWNsZWFyX2JpdCgwLCAoJnNwLT50YXNrbGV0X3N0YXR1cykpOworCQl9IGVsc2UgaWYgKGxldmVsID09IExPVykgeworCQkJdGFza2xldF9zY2hlZHVsZSgmc3AtPnRhc2spOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogIHMyaW9fZ2V0X3N0YXRzIC0gVXBkYXRlcyB0aGUgZGV2aWNlIHN0YXRpc3RpY3Mgc3RydWN0dXJlLiAKKyAqICBAZGV2IDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGRldmljZSBzdGF0aXN0aWNzIHN0cnVjdHVyZSBpbiB0aGUgczJpb19uaWMgCisgKiAgc3RydWN0dXJlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc2FtZS4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBuZXRfZGV2aWNlX3N0YXRzIHN0cnVjdHVyZS4KKyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnMyaW9fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKworCW1hY19jb250cm9sID0gJnNwLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmc3AtPmNvbmZpZzsKKworCXNwLT5zdGF0cy50eF9lcnJvcnMgPSBtYWNfY29udHJvbC0+c3RhdHNfaW5mby0+dG1hY19hbnlfZXJyX2ZybXM7CisJc3AtPnN0YXRzLnJ4X2Vycm9ycyA9IG1hY19jb250cm9sLT5zdGF0c19pbmZvLT5ybWFjX2Ryb3BfZnJtczsKKwlzcC0+c3RhdHMubXVsdGljYXN0ID0gbWFjX2NvbnRyb2wtPnN0YXRzX2luZm8tPnJtYWNfdmxkX21jc3RfZnJtczsKKwlzcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9CisJICAgIG1hY19jb250cm9sLT5zdGF0c19pbmZvLT5ybWFjX2xvbmdfZnJtczsKKworCXJldHVybiAoJnNwLT5zdGF0cyk7Cit9CisKKy8qKgorICogIHMyaW9fc2V0X211bHRpY2FzdCAtIGVudHJ5IHBvaW50IGZvciBtdWx0aWNhc3QgYWRkcmVzcyBlbmFibGUvZGlzYWJsZS4KKyAqICBAZGV2IDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogIERlc2NyaXB0aW9uOgorICogIFRoaXMgZnVuY3Rpb24gaXMgYSBkcml2ZXIgZW50cnkgcG9pbnQgd2hpY2ggZ2V0cyBjYWxsZWQgYnkgdGhlIGtlcm5lbCAKKyAqICB3aGVuZXZlciBtdWx0aWNhc3QgYWRkcmVzc2VzIG11c3QgYmUgZW5hYmxlZC9kaXNhYmxlZC4gVGhpcyBhbHNvIGdldHMgCisgKiAgY2FsbGVkIHRvIHNldC9yZXNldCBwcm9taXNjdW91cyBtb2RlLiBEZXBlbmRpbmcgb24gdGhlIGRlaXZjZSBmbGFnLCB3ZQorICogIGRldGVybWluZSwgaWYgbXVsdGljYXN0IGFkZHJlc3MgbXVzdCBiZSBlbmFibGVkIG9yIGlmIHByb21pc2N1b3VzIG1vZGUKKyAqICBpcyB0byBiZSBkaXNhYmxlZCBldGMuCisgKiAgUmV0dXJuIHZhbHVlOgorICogIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQgczJpb19zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGksIGosIHByZXZfY250OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJdTY0IHZhbDY0ID0gMCwgbXVsdGlfbWFjID0gMHgwMTAyMDMwNDA1MDZVTEwsIG1hc2sgPQorCSAgICAweGZlZmZmZmZmZmZmZlVMTDsKKwl1NjQgZGlzX2FkZHIgPSAweGZmZmZmZmZmZmZmZlVMTCwgbWFjX2FkZHIgPSAwOworCXZvaWQgX19pb21lbSAqYWRkOworCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSAmJiAoIXNwLT5tX2Nhc3RfZmxnKSkgeworCQkvKiAgRW5hYmxlIGFsbCBNdWx0aWNhc3QgYWRkcmVzc2VzICovCisJCXdyaXRlcShSTUFDX0FERFJfREFUQTBfTUVNX0FERFIobXVsdGlfbWFjKSwKKwkJICAgICAgICZiYXIwLT5ybWFjX2FkZHJfZGF0YTBfbWVtKTsKKwkJd3JpdGVxKFJNQUNfQUREUl9EQVRBMV9NRU1fTUFTSyhtYXNrKSwKKwkJICAgICAgICZiYXIwLT5ybWFjX2FkZHJfZGF0YTFfbWVtKTsKKwkJdmFsNjQgPSBSTUFDX0FERFJfQ01EX01FTV9XRSB8CisJCSAgICBSTUFDX0FERFJfQ01EX01FTV9TVFJPQkVfTkVXX0NNRCB8CisJCSAgICBSTUFDX0FERFJfQ01EX01FTV9PRkZTRVQoTUFDX01DX0FMTF9NQ19BRERSX09GRlNFVCk7CisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnJtYWNfYWRkcl9jbWRfbWVtKTsKKwkJLyogV2FpdCB0aWxsIGNvbW1hbmQgY29tcGxldGVzICovCisJCXdhaXRfZm9yX2NtZF9jb21wbGV0ZShzcCk7CisKKwkJc3AtPm1fY2FzdF9mbGcgPSAxOworCQlzcC0+YWxsX211bHRpX3BvcyA9IE1BQ19NQ19BTExfTUNfQUREUl9PRkZTRVQ7CisJfSBlbHNlIGlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgJiYgKHNwLT5tX2Nhc3RfZmxnKSkgeworCQkvKiAgRGlzYWJsZSBhbGwgTXVsdGljYXN0IGFkZHJlc3NlcyAqLworCQl3cml0ZXEoUk1BQ19BRERSX0RBVEEwX01FTV9BRERSKGRpc19hZGRyKSwKKwkJICAgICAgICZiYXIwLT5ybWFjX2FkZHJfZGF0YTBfbWVtKTsKKwkJdmFsNjQgPSBSTUFDX0FERFJfQ01EX01FTV9XRSB8CisJCSAgICBSTUFDX0FERFJfQ01EX01FTV9TVFJPQkVfTkVXX0NNRCB8CisJCSAgICBSTUFDX0FERFJfQ01EX01FTV9PRkZTRVQoc3AtPmFsbF9tdWx0aV9wb3MpOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5ybWFjX2FkZHJfY21kX21lbSk7CisJCS8qIFdhaXQgdGlsbCBjb21tYW5kIGNvbXBsZXRlcyAqLworCQl3YWl0X2Zvcl9jbWRfY29tcGxldGUoc3ApOworCisJCXNwLT5tX2Nhc3RfZmxnID0gMDsKKwkJc3AtPmFsbF9tdWx0aV9wb3MgPSAwOworCX0KKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSAmJiAoIXNwLT5wcm9taXNjX2ZsZykpIHsKKwkJLyogIFB1dCB0aGUgTklDIGludG8gcHJvbWlzY3VvdXMgbW9kZSAqLworCQlhZGQgPSAmYmFyMC0+bWFjX2NmZzsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2NmZyk7CisJCXZhbDY0IHw9IE1BQ19DRkdfUk1BQ19QUk9NX0VOQUJMRTsKKworCQl3cml0ZXEoUk1BQ19DRkdfS0VZKDB4NEMwRCksICZiYXIwLT5ybWFjX2NmZ19rZXkpOworCQl3cml0ZWwoKHUzMikgdmFsNjQsIGFkZCk7CisJCXdyaXRlcShSTUFDX0NGR19LRVkoMHg0QzBEKSwgJmJhcjAtPnJtYWNfY2ZnX2tleSk7CisJCXdyaXRlbCgodTMyKSAodmFsNjQgPj4gMzIpLCAoYWRkICsgNCkpOworCisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1hY19jZmcpOworCQlzcC0+cHJvbWlzY19mbGcgPSAxOworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBlbnRlcmVkIHByb21pc2N1b3VzIG1vZGVcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJfSBlbHNlIGlmICghKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgJiYgKHNwLT5wcm9taXNjX2ZsZykpIHsKKwkJLyogIFJlbW92ZSB0aGUgTklDIGZyb20gcHJvbWlzY3VvdXMgbW9kZSAqLworCQlhZGQgPSAmYmFyMC0+bWFjX2NmZzsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2NmZyk7CisJCXZhbDY0ICY9IH5NQUNfQ0ZHX1JNQUNfUFJPTV9FTkFCTEU7CisKKwkJd3JpdGVxKFJNQUNfQ0ZHX0tFWSgweDRDMEQpLCAmYmFyMC0+cm1hY19jZmdfa2V5KTsKKwkJd3JpdGVsKCh1MzIpIHZhbDY0LCBhZGQpOworCQl3cml0ZXEoUk1BQ19DRkdfS0VZKDB4NEMwRCksICZiYXIwLT5ybWFjX2NmZ19rZXkpOworCQl3cml0ZWwoKHUzMikgKHZhbDY0ID4+IDMyKSwgKGFkZCArIDQpKTsKKworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tYWNfY2ZnKTsKKwkJc3AtPnByb21pc2NfZmxnID0gMDsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogbGVmdCBwcm9taXNjdW91cyBtb2RlXG4iLAorCQkJICBkZXYtPm5hbWUpOworCX0KKworCS8qICBVcGRhdGUgaW5kaXZpZHVhbCBNX0NBU1QgYWRkcmVzcyBsaXN0ICovCisJaWYgKCghc3AtPm1fY2FzdF9mbGcpICYmIGRldi0+bWNfY291bnQpIHsKKwkJaWYgKGRldi0+bWNfY291bnQgPgorCQkgICAgKE1BWF9BRERSU19TVVBQT1JURUQgLSBNQUNfTUNfQUREUl9TVEFSVF9PRkZTRVQgLSAxKSkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTm8gbW9yZSBSeCBmaWx0ZXJzICIsCisJCQkJICBkZXYtPm5hbWUpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICJjYW4gYmUgYWRkZWQsIHBsZWFzZSBlbmFibGUgIik7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIkFMTF9NVUxUSSBpbnN0ZWFkXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXByZXZfY250ID0gc3AtPm1jX2FkZHJfY291bnQ7CisJCXNwLT5tY19hZGRyX2NvdW50ID0gZGV2LT5tY19jb3VudDsKKworCQkvKiBDbGVhciBvdXQgdGhlIHByZXZpb3VzIGxpc3Qgb2YgTWMgaW4gdGhlIEgvVy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IHByZXZfY250OyBpKyspIHsKKwkJCXdyaXRlcShSTUFDX0FERFJfREFUQTBfTUVNX0FERFIoZGlzX2FkZHIpLAorCQkJICAgICAgICZiYXIwLT5ybWFjX2FkZHJfZGF0YTBfbWVtKTsKKwkJCXdyaXRlcShSTUFDX0FERFJfREFUQTFfTUVNX01BU0soMFVMTCksCisJCSAgICAgICAJCSZiYXIwLT5ybWFjX2FkZHJfZGF0YTFfbWVtKTsKKwkJCXZhbDY0ID0gUk1BQ19BRERSX0NNRF9NRU1fV0UgfAorCQkJICAgIFJNQUNfQUREUl9DTURfTUVNX1NUUk9CRV9ORVdfQ01EIHwKKwkJCSAgICBSTUFDX0FERFJfQ01EX01FTV9PRkZTRVQKKwkJCSAgICAoTUFDX01DX0FERFJfU1RBUlRfT0ZGU0VUICsgaSk7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5ybWFjX2FkZHJfY21kX21lbSk7CisKKwkJCS8qIFdhaXQgZm9yIGNvbW1hbmQgY29tcGxldGVzICovCisJCQlpZiAod2FpdF9mb3JfY21kX2NvbXBsZXRlKHNwKSkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IEFkZGluZyAiLAorCQkJCQkgIGRldi0+bmFtZSk7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJNdWx0aWNhc3RzIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJLyogQ3JlYXRlIHRoZSBuZXcgUnggZmlsdGVyIGxpc3QgYW5kIHVwZGF0ZSB0aGUgc2FtZSBpbiBIL1cuICovCisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgaSA8IGRldi0+bWNfY291bnQ7CisJCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCW1lbWNweShzcC0+dXNyX2FkZHJzW2ldLmFkZHIsIG1jbGlzdC0+ZG1pX2FkZHIsCisJCQkgICAgICAgRVRIX0FMRU4pOworCQkJZm9yIChqID0gMDsgaiA8IEVUSF9BTEVOOyBqKyspIHsKKwkJCQltYWNfYWRkciB8PSBtY2xpc3QtPmRtaV9hZGRyW2pdOworCQkJCW1hY19hZGRyIDw8PSA4OworCQkJfQorCQkJbWFjX2FkZHIgPj49IDg7CisJCQl3cml0ZXEoUk1BQ19BRERSX0RBVEEwX01FTV9BRERSKG1hY19hZGRyKSwKKwkJCSAgICAgICAmYmFyMC0+cm1hY19hZGRyX2RhdGEwX21lbSk7CisJCQl3cml0ZXEoUk1BQ19BRERSX0RBVEExX01FTV9NQVNLKDBVTEwpLAorCQkgICAgICAgCQkmYmFyMC0+cm1hY19hZGRyX2RhdGExX21lbSk7CisKKwkJCXZhbDY0ID0gUk1BQ19BRERSX0NNRF9NRU1fV0UgfAorCQkJICAgIFJNQUNfQUREUl9DTURfTUVNX1NUUk9CRV9ORVdfQ01EIHwKKwkJCSAgICBSTUFDX0FERFJfQ01EX01FTV9PRkZTRVQKKwkJCSAgICAoaSArIE1BQ19NQ19BRERSX1NUQVJUX09GRlNFVCk7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5ybWFjX2FkZHJfY21kX21lbSk7CisKKwkJCS8qIFdhaXQgZm9yIGNvbW1hbmQgY29tcGxldGVzICovCisJCQlpZiAod2FpdF9mb3JfY21kX2NvbXBsZXRlKHNwKSkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IEFkZGluZyAiLAorCQkJCQkgIGRldi0+bmFtZSk7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJNdWx0aWNhc3RzIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorfQorCisvKioKKyAqICBzMmlvX3NldF9tYWNfYWRkciAtIFByb2dyYW1zIHRoZSBYZnJhbWUgbWFjIGFkZHJlc3MgCisgKiAgQGRldiA6IHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgQGFkZHI6IGEgdWNoYXIgcG9pbnRlciB0byB0aGUgbmV3IG1hYyBhZGRyZXNzIHdoaWNoIGlzIHRvIGJlIHNldC4KKyAqICBEZXNjcmlwdGlvbiA6IFRoaXMgcHJvY2VkdXJlIHdpbGwgcHJvZ3JhbSB0aGUgWGZyYW1lIHRvIHJlY2VpdmUgCisgKiAgZnJhbWVzIHdpdGggbmV3IE1hYyBBZGRyZXNzCisgKiAgUmV0dXJuIHZhbHVlOiBTVUNDRVNTIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlICgtKXZlIGludGVnZXIgCisgKiAgYXMgZGVmaW5lZCBpbiBlcnJuby5oIGZpbGUgb24gZmFpbHVyZS4KKyAqLworCitpbnQgczJpb19zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKiBhZGRyKQoreworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJcmVnaXN0ZXIgdTY0IHZhbDY0LCBtYWNfYWRkciA9IDA7CisJaW50IGk7CisKKwkvKiAKKwkgKiBTZXQgdGhlIG5ldyBNQUMgYWRkcmVzcyBhcyB0aGUgbmV3IHVuaWNhc3QgZmlsdGVyIGFuZCByZWZsZWN0IHRoaXMKKwkgKiBjaGFuZ2Ugb24gdGhlIGRldmljZSBhZGRyZXNzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgT1MuIEl0IHdpbGwgYmUKKwkgKiBhdCBvZmZzZXQgMC4gCisJICovCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJbWFjX2FkZHIgPDw9IDg7CisJCW1hY19hZGRyIHw9IGFkZHJbaV07CisJfQorCisJd3JpdGVxKFJNQUNfQUREUl9EQVRBMF9NRU1fQUREUihtYWNfYWRkciksCisJICAgICAgICZiYXIwLT5ybWFjX2FkZHJfZGF0YTBfbWVtKTsKKworCXZhbDY0ID0KKwkgICAgUk1BQ19BRERSX0NNRF9NRU1fV0UgfCBSTUFDX0FERFJfQ01EX01FTV9TVFJPQkVfTkVXX0NNRCB8CisJICAgIFJNQUNfQUREUl9DTURfTUVNX09GRlNFVCgwKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5ybWFjX2FkZHJfY21kX21lbSk7CisJLyogV2FpdCB0aWxsIGNvbW1hbmQgY29tcGxldGVzICovCisJaWYgKHdhaXRfZm9yX2NtZF9jb21wbGV0ZShzcCkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogc2V0X21hY19hZGRyIGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIEZBSUxVUkU7CisJfQorCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICogczJpb19ldGh0b29sX3NzZXQgLSBTZXRzIGRpZmZlcmVudCBsaW5rIHBhcmFtZXRlcnMuIAorICogQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUgICogczJpb19uaWMgc3RydWN0dXJlLgorICogQGluZm86IHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB3aXRoIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgZXRodG9vbCB0byBzZXQKKyAqIGxpbmsgaW5mb3JtYXRpb24uCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoZSBmdW5jdGlvbiBzZXRzIGRpZmZlcmVudCBsaW5rIHBhcmFtZXRlcnMgcHJvdmlkZWQgYnkgdGhlIHVzZXIgb250byAKKyAqIHRoZSBOSUMuCisgKiBSZXR1cm4gdmFsdWU6CisgKiAwIG9uIHN1Y2Nlc3MuCisqLworCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9zc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqaW5mbykKK3sKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJaWYgKChpbmZvLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB8fAorCSAgICAoaW5mby0+c3BlZWQgIT0gU1BFRURfMTAwMDApIHx8IChpbmZvLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIHsKKwkJczJpb19jbG9zZShzcC0+ZGV2KTsKKwkJczJpb19vcGVuKHNwLT5kZXYpOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHMyaW9fZXRodG9sX2dzZXQgLSBSZXR1cm4gbGluayBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gCisgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgcG9pbnRlciB0byB0aGUKKyAqICAgICAgczJpb19uaWMgc3RydWN0dXJlLgorICogQGluZm8gOiBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgd2l0aCBwYXJhbWV0ZXJzIGdpdmVuIGJ5IGV0aHRvb2wKKyAqIHRvIHJldHVybiBsaW5rIGluZm9ybWF0aW9uLgorICogRGVzY3JpcHRpb246CisgKiBSZXR1cm5zIGxpbmsgc3BlY2lmaWMgaW5mb3JtYXRpb24gbGlrZSBzcGVlZCwgZHVwbGV4IGV0Yy4uIHRvIGV0aHRvb2wuCisgKiBSZXR1cm4gdmFsdWUgOgorICogcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9nc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqaW5mbykKK3sKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJaW5mby0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUpOworCWluZm8tPmFkdmVydGlzaW5nID0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUpOworCWluZm8tPnBvcnQgPSBQT1JUX0ZJQlJFOworCS8qIGluZm8tPnRyYW5zY2VpdmVyPz8gVE9ETyAqLworCisJaWYgKG5ldGlmX2NhcnJpZXJfb2soc3AtPmRldikpIHsKKwkJaW5mby0+c3BlZWQgPSAxMDAwMDsKKwkJaW5mby0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJfSBlbHNlIHsKKwkJaW5mby0+c3BlZWQgPSAtMTsKKwkJaW5mby0+ZHVwbGV4ID0gLTE7CisJfQorCisJaW5mby0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzMmlvX2V0aHRvb2xfZ2RydmluZm8gLSBSZXR1cm5zIGRyaXZlciBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gCisgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAKKyAqIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqIEBpbmZvIDogcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHdpdGggcGFyYW1ldGVycyBnaXZlbiBieSBldGh0b29sIHRvCisgKiByZXR1cm4gZHJpdmVyIGluZm9ybWF0aW9uLgorICogRGVzY3JpcHRpb246CisgKiBSZXR1cm5zIGRyaXZlciBzcGVjZWZpYyBpbmZvcm1hdGlvbiBsaWtlIG5hbWUsIHZlcnNpb24gZXRjLi4gdG8gZXRodG9vbC4KKyAqIFJldHVybiB2YWx1ZToKKyAqICB2b2lkCisgKi8KKworc3RhdGljIHZvaWQgczJpb19ldGh0b29sX2dkcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKworCXN0cm5jcHkoaW5mby0+ZHJpdmVyLCBzMmlvX2RyaXZlcl9uYW1lLCBzaXplb2YoczJpb19kcml2ZXJfbmFtZSkpOworCXN0cm5jcHkoaW5mby0+dmVyc2lvbiwgczJpb19kcml2ZXJfdmVyc2lvbiwKKwkJc2l6ZW9mKHMyaW9fZHJpdmVyX3ZlcnNpb24pKTsKKwlzdHJuY3B5KGluZm8tPmZ3X3ZlcnNpb24sICIiLCAzMik7CisJc3RybmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoc3AtPnBkZXYpLCAzMik7CisJaW5mby0+cmVnZHVtcF9sZW4gPSBYRU5BX1JFR19TUEFDRTsKKwlpbmZvLT5lZWR1bXBfbGVuID0gWEVOQV9FRVBST01fU1BBQ0U7CisJaW5mby0+dGVzdGluZm9fbGVuID0gUzJJT19URVNUX0xFTjsKKwlpbmZvLT5uX3N0YXRzID0gUzJJT19TVEFUX0xFTjsKK30KKworLyoqCisgKiAgczJpb19ldGh0b29sX2dyZWdzIC0gZHVtcHMgdGhlIGVudGlyZSBzcGFjZSBvZiBYZmFtZSBpbnRvIHRoZSBidWZmZXIuCisgKiAgQHNwOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAKKyAqICBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiAgQHJlZ3MgOiBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgd2l0aCBwYXJhbWV0ZXJzIGdpdmVuIGJ5IGV0aHRvb2wgZm9yIAorICogIGR1bXBpbmcgdGhlIHJlZ2lzdGVycy4KKyAqICBAcmVnX3NwYWNlOiBUaGUgaW5wdXQgYXJndW1uZXQgaW50byB3aGljaCBhbGwgdGhlIHJlZ2lzdGVycyBhcmUgZHVtcGVkLgorICogIERlc2NyaXB0aW9uOgorICogIER1bXBzIHRoZSBlbnRpcmUgcmVnaXN0ZXIgc3BhY2Ugb2YgeEZyYW1lIE5JQyBpbnRvIHRoZSB1c2VyIGdpdmVuCisgKiAgYnVmZmVyIGFyZWEuCisgKiBSZXR1cm4gdmFsdWUgOgorICogdm9pZCAuCisqLworCitzdGF0aWMgdm9pZCBzMmlvX2V0aHRvb2xfZ3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpzcGFjZSkKK3sKKwlpbnQgaTsKKwl1NjQgcmVnOworCXU4ICpyZWdfc3BhY2UgPSAodTggKikgc3BhY2U7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCisJcmVncy0+bGVuID0gWEVOQV9SRUdfU1BBQ0U7CisJcmVncy0+dmVyc2lvbiA9IHNwLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOworCisJZm9yIChpID0gMDsgaSA8IHJlZ3MtPmxlbjsgaSArPSA4KSB7CisJCXJlZyA9IHJlYWRxKHNwLT5iYXIwICsgaSk7CisJCW1lbWNweSgocmVnX3NwYWNlICsgaSksICZyZWcsIDgpOworCX0KK30KKworLyoqCisgKiAgczJpb19waHlfaWQgIC0gdGltZXIgZnVuY3Rpb24gdGhhdCBhbHRlcm5hdGVzIGFkYXB0ZXIgTEVELgorICogIEBkYXRhIDogYWRkcmVzcyBvZiB0aGUgcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIAorICogIGlzIGEgcG9pbnRlciB0byB0aGUgczJpb19uaWMgc3RydWN0dXJlLCBwcm92aWRlZCBhcyBhbiB1MzIuCisgKiBEZXNjcmlwdGlvbjogVGhpcyBpcyBhY3R1YWxseSB0aGUgdGltZXIgZnVuY3Rpb24gdGhhdCBhbHRlcm5hdGVzIHRoZSAKKyAqIGFkYXB0ZXIgTEVEIGJpdCBvZiB0aGUgYWRhcHRlciBjb250cm9sIGJpdCB0byBzZXQvcmVzZXQgZXZlcnkgdGltZSBvbiAKKyAqIGludm9jYXRpb24uIFRoZSB0aW1lciBpcyBzZXQgZm9yIDEvMiBhIHNlY29uZCwgaGVuY2UgdGhhIE5JQyBibGlua3MgCisgKiAgb25jZSBldmVyeSBzZWNvbmQuCisqLworc3RhdGljIHZvaWQgczJpb19waHlfaWQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCW5pY190ICpzcCA9IChuaWNfdCAqKSBkYXRhOworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwl1NjQgdmFsNjQgPSAwOworCXUxNiBzdWJpZDsKKworCXN1YmlkID0gc3AtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJaWYgKChzdWJpZCAmIDB4RkYpID49IDB4MDcpIHsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJdmFsNjQgXj0gR1BJT19DVFJMX0dQSU9fMDsKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwl9IGVsc2UgeworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCQl2YWw2NCBePSBBREFQVEVSX0xFRF9PTjsKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKKwl9CisKKwltb2RfdGltZXIoJnNwLT5pZF90aW1lciwgamlmZmllcyArIEhaIC8gMik7Cit9CisKKy8qKgorICogczJpb19ldGh0b29sX2lkbmljIC0gVG8gcGh5c2ljYWxseSBpZGVudGlmeSB0aGUgbmljIG9uIHRoZSBzeXN0ZW0uCisgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZQorICogczJpb19uaWMgc3RydWN0dXJlLgorICogQGlkIDogcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHdpdGggaWRlbnRpZmljYXRpb24gcGFyYW1ldGVycyBnaXZlbiBieSAKKyAqIGV0aHRvb2wuCisgKiBEZXNjcmlwdGlvbjogVXNlZCB0byBwaHlzaWNhbGx5IGlkZW50aWZ5IHRoZSBOSUMgb24gdGhlIHN5c3RlbS4KKyAqIFRoZSBMaW5rIExFRCB3aWxsIGJsaW5rIGZvciBhIHRpbWUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGZvciAKKyAqIGlkZW50aWZpY2F0aW9uLgorICogTk9URTogVGhlIExpbmsgaGFzIHRvIGJlIFVwIHRvIGJlIGFibGUgdG8gYmxpbmsgdGhlIExFRC4gSGVuY2UgCisgKiBpZGVudGlmaWNhdGlvbiBpcyBwb3NzaWJsZSBvbmx5IGlmIGl0J3MgbGluayBpcyB1cC4KKyAqIFJldHVybiB2YWx1ZToKKyAqIGludCAsIHJldHVybnMgMCBvbiBzdWNjZXNzCisgKi8KKworc3RhdGljIGludCBzMmlvX2V0aHRvb2xfaWRuaWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJdTY0IHZhbDY0ID0gMCwgbGFzdF9ncGlvX2N0cmxfdmFsOworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJdTE2IHN1YmlkOworCisJc3ViaWQgPSBzcC0+cGRldi0+c3Vic3lzdGVtX2RldmljZTsKKwlsYXN0X2dwaW9fY3RybF92YWwgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwlpZiAoKHN1YmlkICYgMHhGRikgPCAweDA3KSB7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisJCWlmICghKHZhbDY0ICYgQURBUFRFUl9DTlRMX0VOKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIkFkYXB0ZXIgTGluayBkb3duLCBjYW5ub3QgYmxpbmsgTEVEXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCWlmIChzcC0+aWRfdGltZXIuZnVuY3Rpb24gPT0gTlVMTCkgeworCQlpbml0X3RpbWVyKCZzcC0+aWRfdGltZXIpOworCQlzcC0+aWRfdGltZXIuZnVuY3Rpb24gPSBzMmlvX3BoeV9pZDsKKwkJc3AtPmlkX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgc3A7CisJfQorCW1vZF90aW1lcigmc3AtPmlkX3RpbWVyLCBqaWZmaWVzKTsKKwlpZiAoZGF0YSkKKwkJbXNsZWVwKGRhdGEgKiAxMDAwKTsKKwllbHNlCisJCW1zbGVlcCgweEZGRkZGRkZGKTsKKwlkZWxfdGltZXJfc3luYygmc3AtPmlkX3RpbWVyKTsKKworCWlmIChDQVJEU19XSVRIX0ZBVUxUWV9MSU5LX0lORElDQVRPUlMoc3ViaWQpKSB7CisJCXdyaXRlcShsYXN0X2dwaW9fY3RybF92YWwsICZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQlsYXN0X2dwaW9fY3RybF92YWwgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzMmlvX2V0aHRvb2xfZ2V0cGF1c2VfZGF0YSAtUGF1c2UgZnJhbWUgZnJhbWUgZ2VuZXJhdGlvbiBhbmQgcmVjZXB0aW9uLgorICogQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUgICogczJpb19uaWMgc3RydWN0dXJlLgorICogQGVwIDogcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHdpdGggcGF1c2UgcGFyYW1ldGVycyBnaXZlbiBieSBldGh0b29sLgorICogRGVzY3JpcHRpb246CisgKiBSZXR1cm5zIHRoZSBQYXVzZSBmcmFtZSBnZW5lcmF0aW9uIGFuZCByZWNlcHRpb24gY2FwYWJpbGl0eSBvZiB0aGUgTklDLgorICogUmV0dXJuIHZhbHVlOgorICogIHZvaWQKKyAqLworc3RhdGljIHZvaWQgczJpb19ldGh0b29sX2dldHBhdXNlX2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXApCit7CisJdTY0IHZhbDY0OworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ybWFjX3BhdXNlX2NmZyk7CisJaWYgKHZhbDY0ICYgUk1BQ19QQVVTRV9HRU5fRU5BQkxFKQorCQllcC0+dHhfcGF1c2UgPSBUUlVFOworCWlmICh2YWw2NCAmIFJNQUNfUEFVU0VfUlhfRU5BQkxFKQorCQllcC0+cnhfcGF1c2UgPSBUUlVFOworCWVwLT5hdXRvbmVnID0gRkFMU0U7Cit9CisKKy8qKgorICogczJpb19ldGh0b29sX3NldHBhdXNlX2RhdGEgLSAgc2V0L3Jlc2V0IHBhdXNlIGZyYW1lIGdlbmVyYXRpb24uCisgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAKKyAqICAgICAgczJpb19uaWMgc3RydWN0dXJlLgorICogQGVwIDogcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHdpdGggcGF1c2UgcGFyYW1ldGVycyBnaXZlbiBieSBldGh0b29sLgorICogRGVzY3JpcHRpb246CisgKiBJdCBjYW4gYmUgdXNlZCB0byBzZXQgb3IgcmVzZXQgUGF1c2UgZnJhbWUgZ2VuZXJhdGlvbiBvciByZWNlcHRpb24KKyAqIHN1cHBvcnQgb2YgdGhlIE5JQy4KKyAqIFJldHVybiB2YWx1ZToKKyAqIGludCwgcmV0dXJucyAwIG9uIFN1Y2Nlc3MKKyAqLworCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9zZXRwYXVzZV9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXApCit7CisJdTY0IHZhbDY0OworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ybWFjX3BhdXNlX2NmZyk7CisJaWYgKGVwLT50eF9wYXVzZSkKKwkJdmFsNjQgfD0gUk1BQ19QQVVTRV9HRU5fRU5BQkxFOworCWVsc2UKKwkJdmFsNjQgJj0gflJNQUNfUEFVU0VfR0VOX0VOQUJMRTsKKwlpZiAoZXAtPnJ4X3BhdXNlKQorCQl2YWw2NCB8PSBSTUFDX1BBVVNFX1JYX0VOQUJMRTsKKwllbHNlCisJCXZhbDY0ICY9IH5STUFDX1BBVVNFX1JYX0VOQUJMRTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5ybWFjX3BhdXNlX2NmZyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcmVhZF9lZXByb20gLSByZWFkcyA0IGJ5dGVzIG9mIGRhdGEgZnJvbSB1c2VyIGdpdmVuIG9mZnNldC4KKyAqIEBzcCA6IHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhlIAorICogICAgICBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiBAb2ZmIDogb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIG11c3QgYmUgd3JpdHRlbgorICogQGRhdGEgOiBJdHMgYW4gb3V0cHV0IHBhcmFtZXRlciB3aGVyZSB0aGUgZGF0YSByZWFkIGF0IHRoZSBnaXZlbgorICogCW9mZnNldCBpcyBzdG9yZWQuCisgKiBEZXNjcmlwdGlvbjoKKyAqIFdpbGwgcmVhZCA0IGJ5dGVzIG9mIGRhdGEgZnJvbSB0aGUgdXNlciBnaXZlbiBvZmZzZXQgYW5kIHJldHVybiB0aGUgCisgKiByZWFkIGRhdGEuCisgKiBOT1RFOiBXaWxsIGFsbG93IHRvIHJlYWQgb25seSBwYXJ0IG9mIHRoZSBFRVBST00gdmlzaWJsZSB0aHJvdWdoIHRoZQorICogICBJMkMgYnVzLgorICogUmV0dXJuIHZhbHVlOgorICogIC0xIG9uIGZhaWx1cmUgYW5kIDAgb24gc3VjY2Vzcy4KKyAqLworCisjZGVmaW5lIFMySU9fREVWX0lECQk1CitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKG5pY190ICogc3AsIGludCBvZmYsIHUzMiAqIGRhdGEpCit7CisJaW50IHJldCA9IC0xOworCXUzMiBleGl0X2NudCA9IDA7CisJdTY0IHZhbDY0OworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKworCXZhbDY0ID0gSTJDX0NPTlRST0xfREVWX0lEKFMySU9fREVWX0lEKSB8IEkyQ19DT05UUk9MX0FERFIob2ZmKSB8CisJICAgIEkyQ19DT05UUk9MX0JZVEVfQ05UKDB4MykgfCBJMkNfQ09OVFJPTF9SRUFEIHwKKwkgICAgSTJDX0NPTlRST0xfQ05UTF9TVEFSVDsKKwlTUEVDSUFMX1JFR19XUklURSh2YWw2NCwgJmJhcjAtPmkyY19jb250cm9sLCBMRik7CisKKwl3aGlsZSAoZXhpdF9jbnQgPCA1KSB7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmkyY19jb250cm9sKTsKKwkJaWYgKEkyQ19DT05UUk9MX0NOVExfRU5EKHZhbDY0KSkgeworCQkJKmRhdGEgPSBJMkNfQ09OVFJPTF9HRVRfREFUQSh2YWw2NCk7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDUwKTsKKwkJZXhpdF9jbnQrKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICB3cml0ZV9lZXByb20gLSBhY3R1YWxseSB3cml0ZXMgdGhlIHJlbGV2YW50IHBhcnQgb2YgdGhlIGRhdGEgdmFsdWUuCisgKiAgQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUKKyAqICAgICAgIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqICBAb2ZmIDogb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIG11c3QgYmUgd3JpdHRlbgorICogIEBkYXRhIDogVGhlIGRhdGEgdGhhdCBpcyB0byBiZSB3cml0dGVuCisgKiAgQGNudCA6IE51bWJlciBvZiBieXRlcyBvZiB0aGUgZGF0YSB0aGF0IGFyZSBhY3R1YWxseSB0byBiZSB3cml0dGVuIGludG8gCisgKiAgdGhlIEVlcHJvbS4gKG1heCBvZiAzKQorICogRGVzY3JpcHRpb246CisgKiAgQWN0dWFsbHkgd3JpdGVzIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoZSBkYXRhIHZhbHVlIGludG8gdGhlIEVlcHJvbQorICogIHRocm91Z2ggdGhlIEkyQyBidXMuCisgKiBSZXR1cm4gdmFsdWU6CisgKiAgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgd3JpdGVfZWVwcm9tKG5pY190ICogc3AsIGludCBvZmYsIHUzMiBkYXRhLCBpbnQgY250KQoreworCWludCBleGl0X2NudCA9IDAsIHJldCA9IC0xOworCXU2NCB2YWw2NDsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisKKwl2YWw2NCA9IEkyQ19DT05UUk9MX0RFVl9JRChTMklPX0RFVl9JRCkgfCBJMkNfQ09OVFJPTF9BRERSKG9mZikgfAorCSAgICBJMkNfQ09OVFJPTF9CWVRFX0NOVChjbnQpIHwgSTJDX0NPTlRST0xfU0VUX0RBVEEoZGF0YSkgfAorCSAgICBJMkNfQ09OVFJPTF9DTlRMX1NUQVJUOworCVNQRUNJQUxfUkVHX1dSSVRFKHZhbDY0LCAmYmFyMC0+aTJjX2NvbnRyb2wsIExGKTsKKworCXdoaWxlIChleGl0X2NudCA8IDUpIHsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+aTJjX2NvbnRyb2wpOworCQlpZiAoSTJDX0NPTlRST0xfQ05UTF9FTkQodmFsNjQpKSB7CisJCQlpZiAoISh2YWw2NCAmIEkyQ19DT05UUk9MX05BQ0spKQorCQkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoNTApOworCQlleGl0X2NudCsrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIHMyaW9fZXRodG9vbF9nZWVwcm9tICAtIHJlYWRzIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIEVlcHJvbS4KKyAqICBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAqICAgICAgIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqICBAZWVwcm9tIDogcG9pbnRlciB0byB0aGUgdXNlciBsZXZlbCBzdHJ1Y3R1cmUgcHJvdmlkZWQgYnkgZXRodG9vbCwgCisgKiAgY29udGFpbmluZyBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb24uCisgKiAgQGRhdGFfYnVmIDogdXNlciBkZWZpbmVkIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byBFZXByb20uCisgKiAgRGVzY3JpcHRpb246IFJlYWRzIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBFZXByb20gYXQgZ2l2ZW4gb2Zmc2V0CisgKiAgZm9yIGEgZ2l2ZW4gbGVuZ3RoLiBTdG9yZXMgdGhlc2UgdmFsdWVzIGludCB0aGUgaW5wdXQgYXJndW1lbnQgZGF0YQorICogIGJ1ZmZlciAnZGF0YV9idWYnIGFuZCByZXR1cm5zIHRoZXNlIHRvIHRoZSBjYWxsZXIgKGV0aHRvb2wuKQorICogIFJldHVybiB2YWx1ZToKKyAqICBpbnQgIDAgb24gc3VjY2VzcworICovCisKK3N0YXRpYyBpbnQgczJpb19ldGh0b29sX2dlZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKiBkYXRhX2J1ZikKK3sKKwl1MzIgZGF0YSwgaSwgdmFsaWQ7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCisJZWVwcm9tLT5tYWdpYyA9IHNwLT5wZGV2LT52ZW5kb3IgfCAoc3AtPnBkZXYtPmRldmljZSA8PCAxNik7CisKKwlpZiAoKGVlcHJvbS0+b2Zmc2V0ICsgZWVwcm9tLT5sZW4pID4gKFhFTkFfRUVQUk9NX1NQQUNFKSkKKwkJZWVwcm9tLT5sZW4gPSBYRU5BX0VFUFJPTV9TUEFDRSAtIGVlcHJvbS0+b2Zmc2V0OworCisJZm9yIChpID0gMDsgaSA8IGVlcHJvbS0+bGVuOyBpICs9IDQpIHsKKwkJaWYgKHJlYWRfZWVwcm9tKHNwLCAoZWVwcm9tLT5vZmZzZXQgKyBpKSwgJmRhdGEpKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIlJlYWQgb2YgRUVQUk9NIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQl2YWxpZCA9IElOVihkYXRhKTsKKwkJbWVtY3B5KChkYXRhX2J1ZiArIGkpLCAmdmFsaWQsIDQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgczJpb19ldGh0b29sX3NlZXByb20gLSB0cmllcyB0byB3cml0ZSB0aGUgdXNlciBwcm92aWRlZCB2YWx1ZSBpbiBFZXByb20KKyAqICBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZQorICogIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqICBAZWVwcm9tIDogcG9pbnRlciB0byB0aGUgdXNlciBsZXZlbCBzdHJ1Y3R1cmUgcHJvdmlkZWQgYnkgZXRodG9vbCwgCisgKiAgY29udGFpbmluZyBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb24uCisgKiAgQGRhdGFfYnVmIDsgdXNlciBkZWZpbmVkIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byBFZXByb20uCisgKiAgRGVzY3JpcHRpb246CisgKiAgVHJpZXMgdG8gd3JpdGUgdGhlIHVzZXIgcHJvdmlkZWQgdmFsdWUgaW4gdGhlIEVlcHJvbSwgYXQgdGhlIG9mZnNldAorICogIGdpdmVuIGJ5IHRoZSB1c2VyLgorICogIFJldHVybiB2YWx1ZToKKyAqICAwIG9uIHN1Y2Nlc3MsIC1FRkFVTFQgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9zZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sCisJCQkJdTggKiBkYXRhX2J1ZikKK3sKKwlpbnQgbGVuID0gZWVwcm9tLT5sZW4sIGNudCA9IDA7CisJdTMyIHZhbGlkID0gMCwgZGF0YTsKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisKKwlpZiAoZWVwcm9tLT5tYWdpYyAhPSAoc3AtPnBkZXYtPnZlbmRvciB8IChzcC0+cGRldi0+ZGV2aWNlIDw8IDE2KSkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkgICJFVEhUT09MX1dSSVRFX0VFUFJPTSBFcnI6IE1hZ2ljIHZhbHVlICIpOworCQlEQkdfUFJJTlQoRVJSX0RCRywgImlzIHdyb25nLCBJdHMgbm90IDB4JXhcbiIsCisJCQkgIGVlcHJvbS0+bWFnaWMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl3aGlsZSAobGVuKSB7CisJCWRhdGEgPSAodTMyKSBkYXRhX2J1ZltjbnRdICYgMHgwMDAwMDBGRjsKKwkJaWYgKGRhdGEpIHsKKwkJCXZhbGlkID0gKHUzMikgKGRhdGEgPDwgMjQpOworCQl9IGVsc2UKKwkJCXZhbGlkID0gZGF0YTsKKworCQlpZiAod3JpdGVfZWVwcm9tKHNwLCAoZWVwcm9tLT5vZmZzZXQgKyBjbnQpLCB2YWxpZCwgMCkpIHsKKwkJCURCR19QUklOVChFUlJfREJHLAorCQkJCSAgIkVUSFRPT0xfV1JJVEVfRUVQUk9NIEVycjogQ2Fubm90ICIpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkJICAid3JpdGUgaW50byB0aGUgc3BlY2lmaWVkIG9mZnNldFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQljbnQrKzsKKwkJbGVuLS07CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogczJpb19yZWdpc3Rlcl90ZXN0IC0gcmVhZHMgYW5kIHdyaXRlcyBpbnRvIGFsbCBjbG9jayBkb21haW5zLiAKKyAqIEBzcCA6IHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhlIAorICogczJpb19uaWMgc3RydWN0dXJlLgorICogQGRhdGEgOiB2YXJpYWJsZSB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBlYWNoIG9mIHRoZSB0ZXN0IGNvbmR1Y3RlZCBiCisgKiBieSB0aGUgZHJpdmVyLgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIGFuZCB3cml0ZSBpbnRvIGFsbCBjbG9jayBkb21haW5zLiBUaGUgTklDIGhhcyAzIGNsb2NrIGRvbWFpbnMsCisgKiBzZWUgdGhhdCByZWdpc3RlcnMgaW4gYWxsIHRoZSB0aHJlZSByZWdpb25zIGFyZSBhY2Nlc3NpYmxlLgorICogUmV0dXJuIHZhbHVlOgorICogMCBvbiBzdWNjZXNzLgorICovCisKK3N0YXRpYyBpbnQgczJpb19yZWdpc3Rlcl90ZXN0KG5pY190ICogc3AsIHVpbnQ2NF90ICogZGF0YSkKK3sKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJdTY0IHZhbDY0ID0gMDsKKwlpbnQgZmFpbCA9IDA7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5wY2NfZW5hYmxlKTsKKwlpZiAodmFsNjQgIT0gMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSB7CisJCWZhaWwgPSAxOworCQlEQkdfUFJJTlQoSU5GT19EQkcsICJSZWFkIFRlc3QgbGV2ZWwgMSBmYWlsc1xuIik7CisJfQorCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+cm1hY19wYXVzZV9jZmcpOworCWlmICh2YWw2NCAhPSAweGMwMDBmZmZmMDAwMDAwMDBVTEwpIHsKKwkJZmFpbCA9IDE7CisJCURCR19QUklOVChJTkZPX0RCRywgIlJlYWQgVGVzdCBsZXZlbCAyIGZhaWxzXG4iKTsKKwl9CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5yeF9xdWV1ZV9jZmcpOworCWlmICh2YWw2NCAhPSAweDA4MDgwODA4MDgwODA4MDhVTEwpIHsKKwkJZmFpbCA9IDE7CisJCURCR19QUklOVChJTkZPX0RCRywgIlJlYWQgVGVzdCBsZXZlbCAzIGZhaWxzXG4iKTsKKwl9CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT54Z3hzX2VmaWZvX2NmZyk7CisJaWYgKHZhbDY0ICE9IDB4MDAwMDAwMDAxOTIzMTQxRVVMTCkgeworCQlmYWlsID0gMTsKKwkJREJHX1BSSU5UKElORk9fREJHLCAiUmVhZCBUZXN0IGxldmVsIDQgZmFpbHNcbiIpOworCX0KKworCXZhbDY0ID0gMHg1QTVBNUE1QTVBNUE1QTVBVUxMOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnhtc2lfZGF0YSk7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+eG1zaV9kYXRhKTsKKwlpZiAodmFsNjQgIT0gMHg1QTVBNUE1QTVBNUE1QTVBVUxMKSB7CisJCWZhaWwgPSAxOworCQlEQkdfUFJJTlQoRVJSX0RCRywgIldyaXRlIFRlc3QgbGV2ZWwgMSBmYWlsc1xuIik7CisJfQorCisJdmFsNjQgPSAweEE1QTVBNUE1QTVBNUE1QTVVTEw7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+eG1zaV9kYXRhKTsKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT54bXNpX2RhdGEpOworCWlmICh2YWw2NCAhPSAweEE1QTVBNUE1QTVBNUE1QTVVTEwpIHsKKwkJZmFpbCA9IDE7CisJCURCR19QUklOVChFUlJfREJHLCAiV3JpdGUgVGVzdCBsZXZlbCAyIGZhaWxzXG4iKTsKKwl9CisKKwkqZGF0YSA9IGZhaWw7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogczJpb19lZXByb21fdGVzdCAtIHRvIHZlcmlmeSB0aGF0IEVFcHJvbSBpbiB0aGUgeGVuYSBjYW4gYmUgcHJvZ3JhbW1lZC4gCisgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZQorICogczJpb19uaWMgc3RydWN0dXJlLgorICogQGRhdGE6dmFyaWFibGUgdGhhdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgZWFjaCBvZiB0aGUgdGVzdCBjb25kdWN0ZWQgYnkKKyAqIHRoZSBkcml2ZXIuCisgKiBEZXNjcmlwdGlvbjoKKyAqIFZlcmlmeSB0aGF0IEVFUFJPTSBpbiB0aGUgeGVuYSBjYW4gYmUgcHJvZ3JhbW1lZCB1c2luZyBJMkNfQ09OVFJPTCAKKyAqIHJlZ2lzdGVyLgorICogUmV0dXJuIHZhbHVlOgorICogMCBvbiBzdWNjZXNzLgorICovCisKK3N0YXRpYyBpbnQgczJpb19lZXByb21fdGVzdChuaWNfdCAqIHNwLCB1aW50NjRfdCAqIGRhdGEpCit7CisJaW50IGZhaWwgPSAwOworCXUzMiByZXRfZGF0YTsKKworCS8qIFRlc3QgV3JpdGUgRXJyb3IgYXQgb2Zmc2V0IDAgKi8KKwlpZiAoIXdyaXRlX2VlcHJvbShzcCwgMCwgMCwgMykpCisJCWZhaWwgPSAxOworCisJLyogVGVzdCBXcml0ZSBhdCBvZmZzZXQgNGYwICovCisJaWYgKHdyaXRlX2VlcHJvbShzcCwgMHg0RjAsIDB4MDEyMzQ1NjcsIDMpKQorCQlmYWlsID0gMTsKKwlpZiAocmVhZF9lZXByb20oc3AsIDB4NEYwLCAmcmV0X2RhdGEpKQorCQlmYWlsID0gMTsKKworCWlmIChyZXRfZGF0YSAhPSAweDAxMjM0NTY3KQorCQlmYWlsID0gMTsKKworCS8qIFJlc2V0IHRoZSBFRVBST00gZGF0YSBnbyBGRkZGICovCisJd3JpdGVfZWVwcm9tKHNwLCAweDRGMCwgMHhGRkZGRkZGRiwgMyk7CisKKwkvKiBUZXN0IFdyaXRlIFJlcXVlc3QgRXJyb3IgYXQgb2Zmc2V0IDB4N2MgKi8KKwlpZiAoIXdyaXRlX2VlcHJvbShzcCwgMHgwN0MsIDAsIDMpKQorCQlmYWlsID0gMTsKKworCS8qIFRlc3QgV3JpdGUgUmVxdWVzdCBhdCBvZmZzZXQgMHg3ZmMgKi8KKwlpZiAod3JpdGVfZWVwcm9tKHNwLCAweDdGQywgMHgwMTIzNDU2NywgMykpCisJCWZhaWwgPSAxOworCWlmIChyZWFkX2VlcHJvbShzcCwgMHg3RkMsICZyZXRfZGF0YSkpCisJCWZhaWwgPSAxOworCisJaWYgKHJldF9kYXRhICE9IDB4MDEyMzQ1NjcpCisJCWZhaWwgPSAxOworCisJLyogUmVzZXQgdGhlIEVFUFJPTSBkYXRhIGdvIEZGRkYgKi8KKwl3cml0ZV9lZXByb20oc3AsIDB4N0ZDLCAweEZGRkZGRkZGLCAzKTsKKworCS8qIFRlc3QgV3JpdGUgRXJyb3IgYXQgb2Zmc2V0IDB4ODAgKi8KKwlpZiAoIXdyaXRlX2VlcHJvbShzcCwgMHgwODAsIDAsIDMpKQorCQlmYWlsID0gMTsKKworCS8qIFRlc3QgV3JpdGUgRXJyb3IgYXQgb2Zmc2V0IDB4ZmMgKi8KKwlpZiAoIXdyaXRlX2VlcHJvbShzcCwgMHgwRkMsIDAsIDMpKQorCQlmYWlsID0gMTsKKworCS8qIFRlc3QgV3JpdGUgRXJyb3IgYXQgb2Zmc2V0IDB4MTAwICovCisJaWYgKCF3cml0ZV9lZXByb20oc3AsIDB4MTAwLCAwLCAzKSkKKwkJZmFpbCA9IDE7CisKKwkvKiBUZXN0IFdyaXRlIEVycm9yIGF0IG9mZnNldCA0ZWMgKi8KKwlpZiAoIXdyaXRlX2VlcHJvbShzcCwgMHg0RUMsIDAsIDMpKQorCQlmYWlsID0gMTsKKworCSpkYXRhID0gZmFpbDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzMmlvX2Jpc3RfdGVzdCAtIGludm9rZXMgdGhlIE1lbUJpc3QgdGVzdCBvZiB0aGUgY2FyZCAuCisgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAKKyAqIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqIEBkYXRhOnZhcmlhYmxlIHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGVhY2ggb2YgdGhlIHRlc3QgY29uZHVjdGVkIGJ5IAorICogdGhlIGRyaXZlci4KKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBpbnZva2VzIHRoZSBNZW1CaXN0IHRlc3Qgb2YgdGhlIGNhcmQuIFdlIGdpdmUgYXJvdW5kCisgKiAyIHNlY3MgdGltZSBmb3IgdGhlIFRlc3QgdG8gY29tcGxldGUuIElmIGl0J3Mgc3RpbGwgbm90IGNvbXBsZXRlCisgKiB3aXRoaW4gdGhpcyBwZWlvZCwgd2UgY29uc2lkZXIgdGhhdCB0aGUgdGVzdCBmYWlsZWQuIAorICogUmV0dXJuIHZhbHVlOgorICogMCBvbiBzdWNjZXNzIGFuZCAtMSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgczJpb19iaXN0X3Rlc3QobmljX3QgKiBzcCwgdWludDY0X3QgKiBkYXRhKQoreworCXU4IGJpc3QgPSAwOworCWludCBjbnQgPSAwLCByZXQgPSAtMTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHNwLT5wZGV2LCBQQ0lfQklTVCwgJmJpc3QpOworCWJpc3QgfD0gUENJX0JJU1RfU1RBUlQ7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lfQklTVCwgYmlzdCk7CisKKwl3aGlsZSAoY250IDwgMjApIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoc3AtPnBkZXYsIFBDSV9CSVNULCAmYmlzdCk7CisJCWlmICghKGJpc3QgJiBQQ0lfQklTVF9TVEFSVCkpIHsKKwkJCSpkYXRhID0gKGJpc3QgJiBQQ0lfQklTVF9DT0RFX01BU0spOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCgxMDApOworCQljbnQrKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHMyaW8tbGlua190ZXN0IC0gdmVyaWZpZXMgdGhlIGxpbmsgc3RhdGUgb2YgdGhlIG5pYyAgCisgKiBAc3AgOyBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAKKyAqIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqIEBkYXRhOiB2YXJpYWJsZSB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBlYWNoIG9mIHRoZSB0ZXN0IGNvbmR1Y3RlZCBieQorICogdGhlIGRyaXZlci4KKyAqIERlc2NyaXB0aW9uOgorICogVGhlIGZ1bmN0aW9uIHZlcmlmaWVzIHRoZSBsaW5rIHN0YXRlIG9mIHRoZSBOSUMgYW5kIHVwZGF0ZXMgdGhlIGlucHV0IAorICogYXJndW1lbnQgJ2RhdGEnIGFwcHJvcHJpYXRlbHkuCisgKiBSZXR1cm4gdmFsdWU6CisgKiAwIG9uIHN1Y2Nlc3MuCisgKi8KKworc3RhdGljIGludCBzMmlvX2xpbmtfdGVzdChuaWNfdCAqIHNwLCB1aW50NjRfdCAqIGRhdGEpCit7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXU2NCB2YWw2NDsKKworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfc3RhdHVzKTsKKwlpZiAodmFsNjQgJiBBREFQVEVSX1NUQVRVU19STUFDX0xPQ0FMX0ZBVUxUKQorCQkqZGF0YSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzMmlvX3JsZHJhbV90ZXN0IC0gb2ZmbGluZSB0ZXN0IGZvciBhY2Nlc3MgdG8gdGhlIFJsZFJhbSBjaGlwIG9uIHRoZSBOSUMgCisgKiBAc3AgLSBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAgCisgKiBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiBAZGF0YSAtIHZhcmlhYmxlIHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGVhY2ggb2YgdGhlIHRlc3QgCisgKiBjb25kdWN0ZWQgYnkgdGhlIGRyaXZlci4KKyAqIERlc2NyaXB0aW9uOgorICogIFRoaXMgaXMgb25lIG9mIHRoZSBvZmZsaW5lIHRlc3QgdGhhdCB0ZXN0cyB0aGUgcmVhZCBhbmQgd3JpdGUgCisgKiAgYWNjZXNzIHRvIHRoZSBSbGRSYW0gY2hpcCBvbiB0aGUgTklDLgorICogUmV0dXJuIHZhbHVlOgorICogIDAgb24gc3VjY2Vzcy4KKyAqLworCitzdGF0aWMgaW50IHMyaW9fcmxkcmFtX3Rlc3QobmljX3QgKiBzcCwgdWludDY0X3QgKiBkYXRhKQoreworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwl1NjQgdmFsNjQ7CisJaW50IGNudCwgaXRlcmF0aW9uID0gMCwgdGVzdF9wYXNzID0gMDsKKworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisJdmFsNjQgJj0gfkFEQVBURVJfRUNDX0VOOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tY19ybGRyYW1fdGVzdF9jdHJsKTsKKwl2YWw2NCB8PSBNQ19STERSQU1fVEVTVF9NT0RFOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPm1jX3JsZHJhbV90ZXN0X2N0cmwpOworCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWNfcmxkcmFtX21ycyk7CisJdmFsNjQgfD0gTUNfUkxEUkFNX1FVRVVFX1NJWkVfRU5BQkxFOworCVNQRUNJQUxfUkVHX1dSSVRFKHZhbDY0LCAmYmFyMC0+bWNfcmxkcmFtX21ycywgVUYpOworCisJdmFsNjQgfD0gTUNfUkxEUkFNX01SU19FTkFCTEU7CisJU1BFQ0lBTF9SRUdfV1JJVEUodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fbXJzLCBVRik7CisKKwl3aGlsZSAoaXRlcmF0aW9uIDwgMikgeworCQl2YWw2NCA9IDB4NTU1NTU1NTVhYWFhMDAwMFVMTDsKKwkJaWYgKGl0ZXJhdGlvbiA9PSAxKSB7CisJCQl2YWw2NCBePSAweEZGRkZGRkZGRkZGRjAwMDBVTEw7CisJCX0KKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWNfcmxkcmFtX3Rlc3RfZDApOworCisJCXZhbDY0ID0gMHhhYWFhNWE1NTU1NTUwMDAwVUxMOworCQlpZiAoaXRlcmF0aW9uID09IDEpIHsKKwkJCXZhbDY0IF49IDB4RkZGRkZGRkZGRkZGMDAwMFVMTDsKKwkJfQorCQl3cml0ZXEodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fdGVzdF9kMSk7CisKKwkJdmFsNjQgPSAweDU1YWFhYWFhYWE1YTAwMDBVTEw7CisJCWlmIChpdGVyYXRpb24gPT0gMSkgeworCQkJdmFsNjQgXj0gMHhGRkZGRkZGRkZGRkYwMDAwVUxMOworCQl9CisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPm1jX3JsZHJhbV90ZXN0X2QyKTsKKworCQl2YWw2NCA9ICh1NjQpICgweDAwMDAwMDNmZmZmZjAwMDBVTEwpOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fdGVzdF9hZGQpOworCisKKwkJdmFsNjQgPSBNQ19STERSQU1fVEVTVF9NT0RFOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fdGVzdF9jdHJsKTsKKworCQl2YWw2NCB8PQorCQkgICAgTUNfUkxEUkFNX1RFU1RfTU9ERSB8IE1DX1JMRFJBTV9URVNUX1dSSVRFIHwKKwkJICAgIE1DX1JMRFJBTV9URVNUX0dPOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fdGVzdF9jdHJsKTsKKworCQlmb3IgKGNudCA9IDA7IGNudCA8IDU7IGNudCsrKSB7CisJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tY19ybGRyYW1fdGVzdF9jdHJsKTsKKwkJCWlmICh2YWw2NCAmIE1DX1JMRFJBTV9URVNUX0RPTkUpCisJCQkJYnJlYWs7CisJCQltc2xlZXAoMjAwKTsKKwkJfQorCisJCWlmIChjbnQgPT0gNSkKKwkJCWJyZWFrOworCisJCXZhbDY0ID0gTUNfUkxEUkFNX1RFU1RfTU9ERTsKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWNfcmxkcmFtX3Rlc3RfY3RybCk7CisKKwkJdmFsNjQgfD0gTUNfUkxEUkFNX1RFU1RfTU9ERSB8IE1DX1JMRFJBTV9URVNUX0dPOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fdGVzdF9jdHJsKTsKKworCQlmb3IgKGNudCA9IDA7IGNudCA8IDU7IGNudCsrKSB7CisJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tY19ybGRyYW1fdGVzdF9jdHJsKTsKKwkJCWlmICh2YWw2NCAmIE1DX1JMRFJBTV9URVNUX0RPTkUpCisJCQkJYnJlYWs7CisJCQltc2xlZXAoNTAwKTsKKwkJfQorCisJCWlmIChjbnQgPT0gNSkKKwkJCWJyZWFrOworCisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1jX3JsZHJhbV90ZXN0X2N0cmwpOworCQlpZiAodmFsNjQgJiBNQ19STERSQU1fVEVTVF9QQVNTKQorCQkJdGVzdF9wYXNzID0gMTsKKworCQlpdGVyYXRpb24rKzsKKwl9CisKKwlpZiAoIXRlc3RfcGFzcykKKwkJKmRhdGEgPSAxOworCWVsc2UKKwkJKmRhdGEgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIHMyaW9fZXRodG9vbF90ZXN0IC0gY29uZHVjdHMgNiB0c2V0cyB0byBkZXRlcm1pbmUgdGhlIGhlYWx0aCBvZiBjYXJkLgorICogIEBzcCA6IHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhlCisgKiAgczJpb19uaWMgc3RydWN0dXJlLgorICogIEBldGh0ZXN0IDogcG9pbnRlciB0byBhIGV0aHRvb2wgY29tbWFuZCBzcGVjaWZpYyBzdHJ1Y3R1cmUgdGhhdCB3aWxsIGJlCisgKiAgcmV0dXJuZWQgdG8gdGhlIHVzZXIuCisgKiAgQGRhdGEgOiB2YXJpYWJsZSB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBlYWNoIG9mIHRoZSB0ZXN0IAorICogY29uZHVjdGVkIGJ5IHRoZSBkcml2ZXIuCisgKiBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIGNvbmR1Y3RzIDYgdGVzdHMgKCA0IG9mZmxpbmUgYW5kIDIgb25saW5lKSB0byBkZXRlcm1pbmUKKyAqICB0aGUgaGVhbHRoIG9mIHRoZSBjYXJkLgorICogUmV0dXJuIHZhbHVlOgorICogIHZvaWQKKyAqLworCitzdGF0aWMgdm9pZCBzMmlvX2V0aHRvb2xfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfdGVzdCAqZXRodGVzdCwKKwkJCSAgICAgIHVpbnQ2NF90ICogZGF0YSkKK3sKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJaW50IG9yaWdfc3RhdGUgPSBuZXRpZl9ydW5uaW5nKHNwLT5kZXYpOworCisJaWYgKGV0aHRlc3QtPmZsYWdzID09IEVUSF9URVNUX0ZMX09GRkxJTkUpIHsKKwkJLyogT2ZmbGluZSBUZXN0cy4gKi8KKwkJaWYgKG9yaWdfc3RhdGUpIHsKKwkJCXMyaW9fY2xvc2Uoc3AtPmRldik7CisJCQlzMmlvX3NldF9zd2FwcGVyKHNwKTsKKwkJfSBlbHNlCisJCQlzMmlvX3NldF9zd2FwcGVyKHNwKTsKKworCQlpZiAoczJpb19yZWdpc3Rlcl90ZXN0KHNwLCAmZGF0YVswXSkpCisJCQlldGh0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisKKwkJczJpb19yZXNldChzcCk7CisJCXMyaW9fc2V0X3N3YXBwZXIoc3ApOworCisJCWlmIChzMmlvX3JsZHJhbV90ZXN0KHNwLCAmZGF0YVszXSkpCisJCQlldGh0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisKKwkJczJpb19yZXNldChzcCk7CisJCXMyaW9fc2V0X3N3YXBwZXIoc3ApOworCisJCWlmIChzMmlvX2VlcHJvbV90ZXN0KHNwLCAmZGF0YVsxXSkpCisJCQlldGh0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisKKwkJaWYgKHMyaW9fYmlzdF90ZXN0KHNwLCAmZGF0YVs0XSkpCisJCQlldGh0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisKKwkJaWYgKG9yaWdfc3RhdGUpCisJCQlzMmlvX29wZW4oc3AtPmRldik7CisKKwkJZGF0YVsyXSA9IDA7CisJfSBlbHNlIHsKKwkJLyogT25saW5lIFRlc3RzLiAqLworCQlpZiAoIW9yaWdfc3RhdGUpIHsKKwkJCURCR19QUklOVChFUlJfREJHLAorCQkJCSAgIiVzOiBpcyBub3QgdXAsIGNhbm5vdCBydW4gdGVzdFxuIiwKKwkJCQkgIGRldi0+bmFtZSk7CisJCQlkYXRhWzBdID0gLTE7CisJCQlkYXRhWzFdID0gLTE7CisJCQlkYXRhWzJdID0gLTE7CisJCQlkYXRhWzNdID0gLTE7CisJCQlkYXRhWzRdID0gLTE7CisJCX0KKworCQlpZiAoczJpb19saW5rX3Rlc3Qoc3AsICZkYXRhWzJdKSkKKwkJCWV0aHRlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKKworCQlkYXRhWzBdID0gMDsKKwkJZGF0YVsxXSA9IDA7CisJCWRhdGFbM10gPSAwOworCQlkYXRhWzRdID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHMyaW9fZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqZXN0YXRzLAorCQkJCSAgIHU2NCAqIHRtcF9zdGF0cykKK3sKKwlpbnQgaSA9IDA7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCVN0YXRJbmZvX3QgKnN0YXRfaW5mbyA9IHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvOworCisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnRtYWNfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnRtYWNfZGF0YV9vY3RldHMpOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoc3RhdF9pbmZvLT50bWFjX2Ryb3BfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnRtYWNfbWNzdF9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+dG1hY19iY3N0X2ZybXMpOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoc3RhdF9pbmZvLT50bWFjX3BhdXNlX2N0cmxfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnRtYWNfYW55X2Vycl9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlNjRfdG9fY3B1KHN0YXRfaW5mby0+dG1hY192bGRfaXBfb2N0ZXRzKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+dG1hY192bGRfaXApOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT50bWFjX2Ryb3BfaXApOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT50bWFjX2ljbXApOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT50bWFjX3JzdF90Y3ApOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoc3RhdF9pbmZvLT50bWFjX3RjcCk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnRtYWNfdWRwKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY192bGRfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfZGF0YV9vY3RldHMpOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2Zjc19lcnJfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTY0X3RvX2NwdShzdGF0X2luZm8tPnJtYWNfZHJvcF9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY192bGRfbWNzdF9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY192bGRfYmNzdF9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19pbl9ybmdfbGVuX2Vycl9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlNjRfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19sb25nX2ZybXMpOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoc3RhdF9pbmZvLT5ybWFjX3BhdXNlX2N0cmxfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfZGlzY2FyZGVkX2ZybXMpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT5ybWFjX3VzaXplZF9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19vc2l6ZWRfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfZnJhZ19mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19qYWJiZXJfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfaXApOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2lwX29jdGV0cyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfaGRyX2Vycl9pcCk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfZHJvcF9pcCk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfaWNtcCk7CisJdG1wX3N0YXRzW2krK10gPSBsZTY0X3RvX2NwdShzdGF0X2luZm8tPnJtYWNfdGNwKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY191ZHApOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2Vycl9kcnBfdWRwKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19wYXVzZV9jbnQpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2FjY2VwdGVkX2lwKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19lcnJfdGNwKTsKK30KKworc3RhdGljIGludCBzMmlvX2V0aHRvb2xfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIChYRU5BX1JFR19TUEFDRSk7Cit9CisKKworc3RhdGljIHUzMiBzMmlvX2V0aHRvb2xfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCisJcmV0dXJuIChzcC0+cnhfY3N1bSk7Cit9CisKK3N0YXRpYyBpbnQgczJpb19ldGh0b29sX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKworCWlmIChkYXRhKQorCQlzcC0+cnhfY3N1bSA9IDE7CisJZWxzZQorCQlzcC0+cnhfY3N1bSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzMmlvX2dldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIChYRU5BX0VFUFJPTV9TUEFDRSk7Cit9CisKK3N0YXRpYyBpbnQgczJpb19ldGh0b29sX3NlbGZfdGVzdF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAoUzJJT19URVNUX0xFTik7Cit9CisKK3N0YXRpYyB2b2lkIHMyaW9fZXRodG9vbF9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgdTMyIHN0cmluZ3NldCwgdTggKiBkYXRhKQoreworCXN3aXRjaCAoc3RyaW5nc2V0KSB7CisJY2FzZSBFVEhfU1NfVEVTVDoKKwkJbWVtY3B5KGRhdGEsIHMyaW9fZ3N0cmluZ3MsIFMySU9fU1RSSU5HU19MRU4pOworCQlicmVhazsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJbWVtY3B5KGRhdGEsICZldGh0b29sX3N0YXRzX2tleXMsCisJCSAgICAgICBzaXplb2YoZXRodG9vbF9zdGF0c19rZXlzKSk7CisJfQorfQorCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKFMySU9fU1RBVF9MRU4pOworfQorCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9vcF9zZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwlpZiAoZGF0YSkKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU07CisJZWxzZQorCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0lQX0NTVU07CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0gczJpb19ldGh0b29sX2dzZXQsCisJLnNldF9zZXR0aW5ncyA9IHMyaW9fZXRodG9vbF9zc2V0LAorCS5nZXRfZHJ2aW5mbyA9IHMyaW9fZXRodG9vbF9nZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuID0gczJpb19ldGh0b29sX2dldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MgPSBzMmlvX2V0aHRvb2xfZ3JlZ3MsCisJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X2VlcHJvbV9sZW4gPSBzMmlvX2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tID0gczJpb19ldGh0b29sX2dlZXByb20sCisJLnNldF9lZXByb20gPSBzMmlvX2V0aHRvb2xfc2VlcHJvbSwKKwkuZ2V0X3BhdXNlcGFyYW0gPSBzMmlvX2V0aHRvb2xfZ2V0cGF1c2VfZGF0YSwKKwkuc2V0X3BhdXNlcGFyYW0gPSBzMmlvX2V0aHRvb2xfc2V0cGF1c2VfZGF0YSwKKwkuZ2V0X3J4X2NzdW0gPSBzMmlvX2V0aHRvb2xfZ2V0X3J4X2NzdW0sCisJLnNldF9yeF9jc3VtID0gczJpb19ldGh0b29sX3NldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bSA9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisJLnNldF90eF9jc3VtID0gczJpb19ldGh0b29sX29wX3NldF90eF9jc3VtLAorCS5nZXRfc2cgPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnID0gZXRodG9vbF9vcF9zZXRfc2csCisjaWZkZWYgTkVUSUZfRl9UU08KKwkuZ2V0X3RzbyA9IGV0aHRvb2xfb3BfZ2V0X3RzbywKKwkuc2V0X3RzbyA9IGV0aHRvb2xfb3Bfc2V0X3RzbywKKyNlbmRpZgorCS5zZWxmX3Rlc3RfY291bnQgPSBzMmlvX2V0aHRvb2xfc2VsZl90ZXN0X2NvdW50LAorCS5zZWxmX3Rlc3QgPSBzMmlvX2V0aHRvb2xfdGVzdCwKKwkuZ2V0X3N0cmluZ3MgPSBzMmlvX2V0aHRvb2xfZ2V0X3N0cmluZ3MsCisJLnBoeXNfaWQgPSBzMmlvX2V0aHRvb2xfaWRuaWMsCisJLmdldF9zdGF0c19jb3VudCA9IHMyaW9fZXRodG9vbF9nZXRfc3RhdHNfY291bnQsCisJLmdldF9ldGh0b29sX3N0YXRzID0gczJpb19nZXRfZXRodG9vbF9zdGF0cworfTsKKworLyoqCisgKiAgczJpb19pb2N0bCAtIEVudHJ5IHBvaW50IGZvciB0aGUgSW9jdGwgCisgKiAgQGRldiA6ICBEZXZpY2UgcG9pbnRlci4KKyAqICBAaWZyIDogIEFuIElPQ1RMIHNwZWNlZmljIHN0cnVjdHVyZSwgdGhhdCBjYW4gY29udGFpbiBhIHBvaW50ZXIgdG8KKyAqICBhIHByb3ByaWV0YXJ5IHN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gdGhlIGRyaXZlci4KKyAqICBAY21kIDogIFRoaXMgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgY29tbWFuZHMgdGhhdAorICogIGNhbiBiZSBwYXNzZWQgdG8gdGhlIElPQ1RMIGZ1bmN0aW9ucy4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIGhhcyBzdXBwb3J0IGZvciBldGh0b29sLCBhZGRpbmcgbXVsdGlwbGUgTUFDIGFkZHJlc3NlcyBvbiAKKyAqICB0aGUgTklDIGFuZCBzb21lIERCRyBjb21tYW5kcyBmb3IgdGhlIHV0aWwgdG9vbC4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgQ3VycmVudGx5IHRoZSBJT0NUTCBzdXBwb3J0cyBubyBvcGVyYXRpb25zLCBoZW5jZSBieSBkZWZhdWx0IHRoaXMKKyAqICBmdW5jdGlvbiByZXR1cm5zIE9QIE5PVCBTVVBQT1JURUQgdmFsdWUuCisgKi8KKworc3RhdGljIGludCBzMmlvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisvKioKKyAqICBzMmlvX2NoYW5nZV9tdHUgLSBlbnRyeSBwb2ludCB0byBjaGFuZ2UgTVRVIHNpemUgZm9yIHRoZSBkZXZpY2UuCisgKiAgIEBkZXYgOiBkZXZpY2UgcG9pbnRlci4KKyAqICAgQG5ld19tdHUgOiB0aGUgbmV3IE1UVSBzaXplIGZvciB0aGUgZGV2aWNlLgorICogICBEZXNjcmlwdGlvbjogQSBkcml2ZXIgZW50cnkgcG9pbnQgdG8gY2hhbmdlIE1UVSBzaXplIGZvciB0aGUgZGV2aWNlLgorICogICBCZWZvcmUgY2hhbmdpbmcgdGhlIE1UVSB0aGUgZGV2aWNlIG11c3QgYmUgc3RvcHBlZC4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgKC0pdmUgaW50ZWdlciBhcyBkZWZpbmVkIGluIGVycm5vLmgKKyAqICAgZmlsZSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgczJpb19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJcmVnaXN0ZXIgdTY0IHZhbDY0OworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBNdXN0IGJlIHN0b3BwZWQgdG8gIiwgZGV2LT5uYW1lKTsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJjaGFuZ2UgaXRzIE1UVSBcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICgobmV3X210dSA8IE1JTl9NVFUpIHx8IChuZXdfbXR1ID4gUzJJT19KVU1CT19TSVpFKSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBNVFUgc2l6ZSBpcyBpbnZhbGlkLlxuIiwKKwkJCSAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKiBTZXQgdGhlIG5ldyBNVFUgaW50byB0aGUgUFlMRCByZWdpc3RlciBvZiB0aGUgTklDICovCisJdmFsNjQgPSBuZXdfbXR1OworCXdyaXRlcSh2QklUKHZhbDY0LCAyLCAxNCksICZiYXIwLT5ybWFjX21heF9weWxkX2xlbik7CisKKwlkZXYtPm10dSA9IG5ld19tdHU7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgczJpb190YXNrbGV0IC0gQm90dG9tIGhhbGYgb2YgdGhlIElTUi4KKyAqICBAZGV2X2FkciA6IGFkZHJlc3Mgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUgaW4gZG1hX2FkZHJfdCBmb3JtYXQuCisgKiAgRGVzY3JpcHRpb246CisgKiAgVGhpcyBpcyB0aGUgdGFza2xldCBvciB0aGUgYm90dG9tIGhhbGYgb2YgdGhlIElTUi4gVGhpcyBpcworICogIGFuIGV4dGVuc2lvbiBvZiB0aGUgSVNSIHdoaWNoIGlzIHNjaGVkdWxlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGJlIHJ1biAKKyAqICB3aGVuIHRoZSBsb2FkIG9uIHRoZSBDUFUgaXMgbG93LiBBbGwgbG93IHByaW9yaXR5IHRhc2tzIG9mIHRoZSBJU1IgY2FuCisgKiAgYmUgcHVzaGVkIGludG8gdGhlIHRhc2tsZXQuIEZvciBub3cgdGhlIHRhc2tsZXQgaXMgdXNlZCBvbmx5IHRvIAorICogIHJlcGxlbmlzaCB0aGUgUnggYnVmZmVycyBpbiB0aGUgUnggYnVmZmVyIGRlc2NyaXB0b3JzLgorICogIFJldHVybiB2YWx1ZToKKyAqICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkIHMyaW9fdGFza2xldCh1bnNpZ25lZCBsb25nIGRldl9hZGRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2FkZHI7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCWludCBpLCByZXQ7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworCisJbWFjX2NvbnRyb2wgPSAmc3AtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZzcC0+Y29uZmlnOworCisJaWYgKCFUQVNLTEVUX0lOX1VTRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCQlyZXQgPSBmaWxsX3J4X2J1ZmZlcnMoc3AsIGkpOworCQkJaWYgKHJldCA9PSAtRU5PTUVNKSB7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogT3V0IG9mICIsCisJCQkJCSAgZGV2LT5uYW1lKTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIm1lbW9yeSBpbiB0YXNrbGV0XG4iKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAocmV0ID09IC1FRklMTCkgeworCQkJCURCR19QUklOVChFUlJfREJHLAorCQkJCQkgICIlczogUnggUmluZyAlZCBpcyBmdWxsXG4iLAorCQkJCQkgIGRldi0+bmFtZSwgaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJY2xlYXJfYml0KDAsICgmc3AtPnRhc2tsZXRfc3RhdHVzKSk7CisJfQorfQorCisvKioKKyAqIHMyaW9fc2V0X2xpbmsgLSBTZXQgdGhlIExJbmsgc3RhdHVzCisgKiBAZGF0YTogbG9uZyBwb2ludGVyIHRvIGRldmljZSBwcml2YXRlIHN0cnVjdHVlCisgKiBEZXNjcmlwdGlvbjogU2V0cyB0aGUgbGluayBzdGF0dXMgZm9yIHRoZSBhZGFwdGVyCisgKi8KKworc3RhdGljIHZvaWQgczJpb19zZXRfbGluayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJbmljX3QgKm5pYyA9IChuaWNfdCAqKSBkYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuaWMtPmRldjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOworCXJlZ2lzdGVyIHU2NCB2YWw2NDsKKwl1MTYgc3ViaWQ7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmKG5pYy0+bGlua19zdGF0ZSkpKSB7CisJCS8qIFRoZSBjYXJkIGlzIGJlaW5nIHJlc2V0LCBubyBwb2ludCBkb2luZyBhbnl0aGluZyAqLworCQlyZXR1cm47CisJfQorCisJc3ViaWQgPSBuaWMtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJLyogCisJICogQWxsb3cgYSBzbWFsbCBkZWxheSBmb3IgdGhlIE5JQ3Mgc2VsZiBpbml0aWF0ZWQgCisJICogY2xlYW51cCB0byBjb21wbGV0ZS4KKwkgKi8KKwltc2xlZXAoMTAwKTsKKworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfc3RhdHVzKTsKKwlpZiAodmVyaWZ5X3hlbmFfcXVpZXNjZW5jZSh2YWw2NCwgbmljLT5kZXZpY2VfZW5hYmxlZF9vbmNlKSkgeworCQlpZiAoTElOS19JU19VUCh2YWw2NCkpIHsKKwkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisJCQl2YWw2NCB8PSBBREFQVEVSX0NOVExfRU47CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCQkJaWYgKENBUkRTX1dJVEhfRkFVTFRZX0xJTktfSU5ESUNBVE9SUyhzdWJpZCkpIHsKKwkJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQkJCXZhbDY0IHw9IEdQSU9fQ1RSTF9HUElPXzA7CisJCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQkJfSBlbHNlIHsKKwkJCQl2YWw2NCB8PSBBREFQVEVSX0xFRF9PTjsKKwkJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCQkJfQorCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+YWRhcHRlcl9zdGF0dXMpOworCQkJaWYgKCFMSU5LX0lTX1VQKHZhbDY0KSkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IiwgZGV2LT5uYW1lKTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiBMaW5rIGRvd24iKTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgImFmdGVyICIpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiZW5hYmxpbmcgIik7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJkZXZpY2UgXG4iKTsKKwkJCX0KKwkJCWlmIChuaWMtPmRldmljZV9lbmFibGVkX29uY2UgPT0gRkFMU0UpIHsKKwkJCQluaWMtPmRldmljZV9lbmFibGVkX29uY2UgPSBUUlVFOworCQkJfQorCQkJczJpb19saW5rKG5pYywgTElOS19VUCk7CisJCX0gZWxzZSB7CisJCQlpZiAoQ0FSRFNfV0lUSF9GQVVMVFlfTElOS19JTkRJQ0FUT1JTKHN1YmlkKSkgeworCQkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmdwaW9fY29udHJvbCk7CisJCQkJdmFsNjQgJj0gfkdQSU9fQ1RSTF9HUElPXzA7CisJCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQkJfQorCQkJczJpb19saW5rKG5pYywgTElOS19ET1dOKTsKKwkJfQorCX0gZWxzZSB7CQkvKiBOSUMgaXMgbm90IFF1aWVzY2VudC4gKi8KKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogRXJyb3I6ICIsIGRldi0+bmFtZSk7CisJCURCR19QUklOVChFUlJfREJHLCAiZGV2aWNlIGlzIG5vdCBRdWllc2NlbnRcbiIpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCWNsZWFyX2JpdCgwLCAmKG5pYy0+bGlua19zdGF0ZSkpOworfQorCitzdGF0aWMgdm9pZCBzMmlvX2NhcmRfZG93bihuaWNfdCAqIHNwKQoreworCWludCBjbnQgPSAwOworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXJlZ2lzdGVyIHU2NCB2YWw2NCA9IDA7CisKKwkvKiBJZiBzMmlvX3NldF9saW5rIHRhc2sgaXMgZXhlY3V0aW5nLCB3YWl0IHRpbGwgaXQgY29tcGxldGVzLiAqLworCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KDAsICYoc3AtPmxpbmtfc3RhdGUpKSkKKwkJbXNsZWVwKDUwKTsKKwlhdG9taWNfc2V0KCZzcC0+Y2FyZF9zdGF0ZSwgQ0FSRF9ET1dOKTsKKworCS8qIGRpc2FibGUgVHggYW5kIFJ4IHRyYWZmaWMgb24gdGhlIE5JQyAqLworCXN0b3BfbmljKHNwKTsKKworCS8qIEtpbGwgdGFza2xldC4gKi8KKwl0YXNrbGV0X2tpbGwoJnNwLT50YXNrKTsKKworCS8qIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgUXVpZXNjZW50IGFuZCB0aGVuIFJlc2V0IHRoZSBOSUMgKi8KKwlkbyB7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfc3RhdHVzKTsKKwkJaWYgKHZlcmlmeV94ZW5hX3F1aWVzY2VuY2UodmFsNjQsIHNwLT5kZXZpY2VfZW5hYmxlZF9vbmNlKSkgeworCQkJYnJlYWs7CisJCX0KKworCQltc2xlZXAoNTApOworCQljbnQrKzsKKwkJaWYgKGNudCA9PSAxMCkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkJICAiczJpb19jbG9zZTpEZXZpY2Ugbm90IFF1aWVzY2VudCAiKTsKKwkJCURCR19QUklOVChFUlJfREJHLCAiYWRhcGVyIHN0YXR1cyByZWFkcyAweCVsbHhcbiIsCisJCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSB2YWw2NCk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDEpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+dHhfbG9jaywgZmxhZ3MpOworCXMyaW9fcmVzZXQoc3ApOworCisJLyogRnJlZSBhbGwgdW51c2VkIFR4IGFuZCBSeCBidWZmZXJzICovCisJZnJlZV90eF9idWZmZXJzKHNwKTsKKwlmcmVlX3J4X2J1ZmZlcnMoc3ApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPnR4X2xvY2ssIGZsYWdzKTsKKwljbGVhcl9iaXQoMCwgJihzcC0+bGlua19zdGF0ZSkpOworfQorCitzdGF0aWMgaW50IHMyaW9fY2FyZF91cChuaWNfdCAqIHNwKQoreworCWludCBpLCByZXQ7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgc3AtPmRldjsKKworCS8qIEluaXRpYWxpemUgdGhlIEgvVyBJL08gcmVnaXN0ZXJzICovCisJaWYgKGluaXRfbmljKHNwKSAhPSAwKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IEgvVyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIAorCSAqIEluaXRpYWxpemluZyB0aGUgUnggYnVmZmVycy4gRm9yIG5vdyB3ZSBhcmUgY29uc2lkZXJpbmcgb25seSAxIAorCSAqIFJ4IHJpbmcgYW5kIGluaXRpYWxpemluZyBidWZmZXJzIGludG8gMzAgUnggYmxvY2tzCisJICovCisJbWFjX2NvbnRyb2wgPSAmc3AtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZzcC0+Y29uZmlnOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQlpZiAoKHJldCA9IGZpbGxfcnhfYnVmZmVycyhzcCwgaSkpKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBPdXQgb2YgbWVtb3J5IGluIE9wZW5cbiIsCisJCQkJICBkZXYtPm5hbWUpOworCQkJczJpb19yZXNldChzcCk7CisJCQlmcmVlX3J4X2J1ZmZlcnMoc3ApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJREJHX1BSSU5UKElORk9fREJHLCAiQnVmIGluIHJpbmc6JWQgaXMgJWQ6XG4iLCBpLAorCQkJICBhdG9taWNfcmVhZCgmc3AtPnJ4X2J1ZnNfbGVmdFtpXSkpOworCX0KKworCS8qIFNldHRpbmcgaXRzIHJlY2VpdmUgbW9kZSAqLworCXMyaW9fc2V0X211bHRpY2FzdChkZXYpOworCisJLyogRW5hYmxlIHRhc2tsZXQgZm9yIHRoZSBkZXZpY2UgKi8KKwl0YXNrbGV0X2luaXQoJnNwLT50YXNrLCBzMmlvX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKSBkZXYpOworCisJLyogRW5hYmxlIFJ4IFRyYWZmaWMgYW5kIGludGVycnVwdHMgb24gdGhlIE5JQyAqLworCWlmIChzdGFydF9uaWMoc3ApKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFN0YXJ0aW5nIE5JQyBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXRhc2tsZXRfa2lsbCgmc3AtPnRhc2spOworCQlzMmlvX3Jlc2V0KHNwKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCWZyZWVfcnhfYnVmZmVycyhzcCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWF0b21pY19zZXQoJnNwLT5jYXJkX3N0YXRlLCBDQVJEX1VQKTsKKwlyZXR1cm4gMDsKK30KKworLyoqIAorICogczJpb19yZXN0YXJ0X25pYyAtIFJlc2V0cyB0aGUgTklDLgorICogQGRhdGEgOiBsb25nIHBvaW50ZXIgdG8gdGhlIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZQorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGlzIHNjaGVkdWxlZCB0byBiZSBydW4gYnkgdGhlIHMyaW9fdHhfd2F0Y2hkb2cKKyAqIGZ1bmN0aW9uIGFmdGVyIDAuNSBzZWNzIHRvIHJlc2V0IHRoZSBOSUMuIFRoZSBpZGVhIGlzIHRvIHJlZHVjZSAKKyAqIHRoZSBydW4gdGltZSBvZiB0aGUgd2F0Y2ggZG9nIHJvdXRpbmUgd2hpY2ggaXMgcnVuIGhvbGRpbmcgYQorICogc3BpbiBsb2NrLgorICovCisKK3N0YXRpYyB2b2lkIHMyaW9fcmVzdGFydF9uaWModW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisKKwlzMmlvX2NhcmRfZG93bihzcCk7CisJaWYgKHMyaW9fY2FyZF91cChzcCkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogRGV2aWNlIGJyaW5nIHVwIGZhaWxlZFxuIiwKKwkJCSAgZGV2LT5uYW1lKTsKKwl9CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCURCR19QUklOVChFUlJfREJHLCAiJXM6IHdhcyByZXNldCBieSBUeCB3YXRjaGRvZyB0aW1lclxuIiwKKwkJICBkZXYtPm5hbWUpOworfQorCisvKiogCisgKiAgczJpb190eF93YXRjaGRvZyAtIFdhdGNoZG9nIGZvciB0cmFuc21pdCBzaWRlLiAKKyAqICBAZGV2IDogUG9pbnRlciB0byBuZXQgZGV2aWNlIHN0cnVjdHVyZQorICogIERlc2NyaXB0aW9uOgorICogIFRoaXMgZnVuY3Rpb24gaXMgdHJpZ2dlcmVkIGlmIHRoZSBUeCBRdWV1ZSBpcyBzdG9wcGVkCisgKiAgZm9yIGEgcHJlLWRlZmluZWQgYW1vdW50IG9mIHRpbWUgd2hlbiB0aGUgSW50ZXJmYWNlIGlzIHN0aWxsIHVwLgorICogIElmIHRoZSBJbnRlcmZhY2UgaXMgamFtbWVkIGluIHN1Y2ggYSBzaXR1YXRpb24sIHRoZSBoYXJkd2FyZSBpcworICogIHJlc2V0IChieSBzMmlvX2Nsb3NlKSBhbmQgcmVzdGFydGVkIGFnYWluIChieSBzMmlvX29wZW4pIHRvCisgKiAgb3ZlcmNvbWUgYW55IHByb2JsZW0gdGhhdCBtaWdodCBoYXZlIGJlZW4gY2F1c2VkIGluIHRoZSBoYXJkd2FyZS4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgdm9pZAorICovCisKK3N0YXRpYyB2b2lkIHMyaW9fdHhfd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisKKwlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCXNjaGVkdWxlX3dvcmsoJnNwLT5yc3RfdGltZXJfdGFzayk7CisJfQorfQorCisvKioKKyAqICAgcnhfb3NtX2hhbmRsZXIgLSBUbyBwZXJmb3JtIHNvbWUgT1MgcmVsYXRlZCBvcGVyYXRpb25zIG9uIFNLQi4KKyAqICAgQHNwOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSxwb2ludGVyIHRvIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqICAgQHNrYiA6IHRoZSBzb2NrZXQgYnVmZmVyIHBvaW50ZXIuCisgKiAgIEBsZW4gOiBsZW5ndGggb2YgdGhlIHBhY2tldAorICogICBAY2tzdW0gOiBGQ1MgY2hlY2tzdW0gb2YgdGhlIGZyYW1lLgorICogICBAcmluZ19ubyA6IHRoZSByaW5nIGZyb20gd2hpY2ggdGhpcyBSeEQgd2FzIGV4dHJhY3RlZC4KKyAqICAgRGVzY3JpcHRpb246IAorICogICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgVHggaW50ZXJydXB0IHNlcml2Y2Ugcm91dGluZSB0byBwZXJmb3JtCisgKiAgIHNvbWUgT1MgcmVsYXRlZCBvcGVyYXRpb25zIG9uIHRoZSBTS0IgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHVwcGVyCisgKiAgIGxheWVycy4gSXQgbWFpbmx5IGNoZWNrcyBpZiB0aGUgY2hlY2tzdW0gaXMgT0ssIGlmIHNvIGFkZHMgaXQgdG8gdGhlCisgKiAgIFNLQnMgY2tzdW0gdmFyaWFibGUsIGluY3JlbWVudHMgdGhlIFJ4IHBhY2tldCBjb3VudCBhbmQgcGFzc2VzIHRoZSBTS0IKKyAqICAgdG8gdGhlIHVwcGVyIGxheWVyLiBJZiB0aGUgY2hlY2tzdW0gaXMgd3JvbmcsIGl0IGluY3JlbWVudHMgdGhlIFJ4CisgKiAgIHBhY2tldCBlcnJvciBjb3VudCwgZnJlZXMgdGhlIFNLQiBhbmQgcmV0dXJucyBlcnJvci4KKyAqICAgUmV0dXJuIHZhbHVlOgorICogICBTVUNDRVNTIG9uIHN1Y2Nlc3MgYW5kIC0xIG9uIGZhaWx1cmUuCisgKi8KKyNpZm5kZWYgQ09ORklHXzJCVUZGX01PREUKK3N0YXRpYyBpbnQgcnhfb3NtX2hhbmRsZXIobmljX3QgKiBzcCwgdTE2IGxlbiwgUnhEX3QgKiByeGRwLCBpbnQgcmluZ19ubykKKyNlbHNlCitzdGF0aWMgaW50IHJ4X29zbV9oYW5kbGVyKG5pY190ICogc3AsIFJ4RF90ICogcnhkcCwgaW50IHJpbmdfbm8sCisJCQkgIGJ1ZmZBZGRfdCAqIGJhKQorI2VuZGlmCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBzcC0+ZGV2OworCXN0cnVjdCBza19idWZmICpza2IgPQorCSAgICAoc3RydWN0IHNrX2J1ZmYgKikgKCh1bnNpZ25lZCBsb25nKSByeGRwLT5Ib3N0X0NvbnRyb2wpOworCXUxNiBsM19jc3VtLCBsNF9jc3VtOworI2lmZGVmIENPTkZJR18yQlVGRl9NT0RFCisJaW50IGJ1ZjBfbGVuLCBidWYyX2xlbjsKKwl1bnNpZ25lZCBjaGFyICpidWZmOworI2VuZGlmCisKKwlsM19jc3VtID0gUlhEX0dFVF9MM19DS1NVTShyeGRwLT5Db250cm9sXzEpOworCWlmICgocnhkcC0+Q29udHJvbF8xICYgVENQX09SX1VEUF9GUkFNRSkgJiYgKHNwLT5yeF9jc3VtKSkgeworCQlsNF9jc3VtID0gUlhEX0dFVF9MNF9DS1NVTShyeGRwLT5Db250cm9sXzEpOworCQlpZiAoKGwzX2NzdW0gPT0gTDNfQ0tTVU1fT0spICYmIChsNF9jc3VtID09IEw0X0NLU1VNX09LKSkgeworCQkJLyogCisJCQkgKiBOSUMgdmVyaWZpZXMgaWYgdGhlIENoZWNrc3VtIG9mIHRoZSByZWNlaXZlZAorCQkJICogZnJhbWUgaXMgT2sgb3Igbm90IGFuZCBhY2NvcmRpbmdseSByZXR1cm5zCisJCQkgKiBhIGZsYWcgaW4gdGhlIFJ4RC4KKwkJCSAqLworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJfSBlbHNlIHsKKwkJCS8qIAorCQkJICogUGFja2V0IHdpdGggZXJyb25lb3VzIGNoZWNrc3VtLCBsZXQgdGhlIAorCQkJICogdXBwZXIgbGF5ZXJzIGRlYWwgd2l0aCBpdC4KKwkJCSAqLworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQl9CisJfSBlbHNlIHsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCX0KKworCWlmIChyeGRwLT5Db250cm9sXzEgJiBSWERfVF9DT0RFKSB7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBlcnIgPSByeGRwLT5Db250cm9sXzEgJiBSWERfVF9DT0RFOworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBSeCBlcnJvciBWYWx1ZTogMHglbGx4XG4iLAorCQkJICBkZXYtPm5hbWUsIGVycik7CisJfQorI2lmZGVmIENPTkZJR18yQlVGRl9NT0RFCisJYnVmMF9sZW4gPSBSWERfR0VUX0JVRkZFUjBfU0laRShyeGRwLT5Db250cm9sXzIpOworCWJ1ZjJfbGVuID0gUlhEX0dFVF9CVUZGRVIyX1NJWkUocnhkcC0+Q29udHJvbF8yKTsKKyNlbmRpZgorCisJc2tiLT5kZXYgPSBkZXY7CisjaWZuZGVmIENPTkZJR18yQlVGRl9NT0RFCisJc2tiX3B1dChza2IsIGxlbik7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKyNlbHNlCisJYnVmZiA9IHNrYl9wdXNoKHNrYiwgYnVmMF9sZW4pOworCW1lbWNweShidWZmLCBiYS0+YmFfMCwgYnVmMF9sZW4pOworCXNrYl9wdXQoc2tiLCBidWYyX2xlbik7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1MySU9fTkFQSQorCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisjZWxzZQorCW5ldGlmX3J4KHNrYik7CisjZW5kaWYKKworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJc3AtPnJ4X3BrdF9jb3VudCsrOworCXNwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisjaWZuZGVmIENPTkZJR18yQlVGRl9NT0RFCisJc3AtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKyNlbHNlCisJc3AtPnN0YXRzLnJ4X2J5dGVzICs9IGJ1ZjBfbGVuICsgYnVmMl9sZW47CisjZW5kaWYKKworCWF0b21pY19kZWMoJnNwLT5yeF9idWZzX2xlZnRbcmluZ19ub10pOworCXJ4ZHAtPkhvc3RfQ29udHJvbCA9IDA7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICogIHMyaW9fbGluayAtIHN0b3BzL3N0YXJ0cyB0aGUgVHggcXVldWUuCisgKiAgQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUKKyAqICBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiAgQGxpbmsgOiBpbmlkaWNhdGVzIHdoZXRoZXIgbGluayBpcyBVUC9ET1dOLgorICogIERlc2NyaXB0aW9uOgorICogIFRoaXMgZnVuY3Rpb24gc3RvcHMvc3RhcnRzIHRoZSBUeCBxdWV1ZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbGluaworICogIHN0YXR1cyBvZiB0aGUgTklDIGlzIGlzIGRvd24gb3IgdXAuIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBBbGFybSAKKyAqICBpbnRlcnJ1cHQgaGFuZGxlciB3aGVuZXZlciBhIGxpbmsgY2hhbmdlIGludGVycnVwdCBjb21lcyB1cC4gCisgKiAgUmV0dXJuIHZhbHVlOgorICogIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQgczJpb19saW5rKG5pY190ICogc3AsIGludCBsaW5rKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgc3AtPmRldjsKKworCWlmIChsaW5rICE9IHNwLT5sYXN0X2xpbmtfc3RhdGUpIHsKKwkJaWYgKGxpbmsgPT0gTElOS19ET1dOKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBMaW5rIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQl9IGVsc2UgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTGluayBVcFxuIiwgZGV2LT5uYW1lKTsKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJfQorCX0KKwlzcC0+bGFzdF9saW5rX3N0YXRlID0gbGluazsKK30KKworLyoqCisgKiAgczJpb19pbml0X3BjaSAtSW5pdGlhbGl6YXRpb24gb2YgUENJIGFuZCBQQ0ktWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAuIAorICogIEBzcCA6IHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhlIAorICogIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGEgZmV3IG9mIHRoZSBQQ0kgYW5kIFBDSS1YIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisgKiAgd2l0aCByZWNvbW1lbmRlZCB2YWx1ZXMuCisgKiAgUmV0dXJuIHZhbHVlOgorICogIHZvaWQKKyAqLworCitzdGF0aWMgdm9pZCBzMmlvX2luaXRfcGNpKG5pY190ICogc3ApCit7CisJdTE2IHBjaV9jbWQgPSAwOworCisJLyogRW5hYmxlIERhdGEgUGFyaXR5IEVycm9yIFJlY292ZXJ5IGluIFBDSS1YIGNvbW1hbmQgcmVnaXN0ZXIuICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwKKwkJCSAgICAgJihzcC0+cGNpeF9jbWQpKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwKKwkJCSAgICAgIChzcC0+cGNpeF9jbWQgfCAxKSk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwKKwkJCSAgICAgJihzcC0+cGNpeF9jbWQpKTsKKworCS8qIFNldCB0aGUgUEVyciBSZXNwb25zZSBiaXQgaW4gUENJIGNvbW1hbmQgcmVnaXN0ZXIuICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NtZCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lfQ09NTUFORCwKKwkJCSAgICAgIChwY2lfY21kIHwgUENJX0NPTU1BTkRfUEFSSVRZKSk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NtZCk7CisKKwkvKiBTZXQgTU1SQiBjb3VudCB0byAxMDI0IGluIFBDSS1YIENvbW1hbmQgcmVnaXN0ZXIuICovCisJc3AtPnBjaXhfY21kICY9IDB4RkZGMzsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwgKHNwLT5wY2l4X2NtZCB8ICgweDEgPDwgMikpKTsJLyogTU1SQkMgMUsgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChzcC0+cGRldiwgUENJWF9DT01NQU5EX1JFR0lTVEVSLAorCQkJICAgICAmKHNwLT5wY2l4X2NtZCkpOworCisJLyogIFNldHRpbmcgTWF4aW11bSBvdXRzdGFuZGluZyBzcGxpdHMgYmFzZWQgb24gc3lzdGVtIHR5cGUuICovCisJc3AtPnBjaXhfY21kICY9IDB4RkY4RjsKKworCXNwLT5wY2l4X2NtZCB8PSBYRU5BX01BWF9PVVRTVEFORElOR19TUExJVFMoMHgxKTsJLyogMiBzcGxpdHMuICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lYX0NPTU1BTkRfUkVHSVNURVIsCisJCQkgICAgICBzcC0+cGNpeF9jbWQpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lYX0NPTU1BTkRfUkVHSVNURVIsCisJCQkgICAgICYoc3AtPnBjaXhfY21kKSk7CisJLyogRm9yY2libHkgZGlzYWJsaW5nIHJlbGF4ZWQgb3JkZXJpbmcgY2FwYWJpbGl0eSBvZiB0aGUgY2FyZC4gKi8KKwlzcC0+cGNpeF9jbWQgJj0gMHhmZmZkOworCXBjaV93cml0ZV9jb25maWdfd29yZChzcC0+cGRldiwgUENJWF9DT01NQU5EX1JFR0lTVEVSLAorCQkJICAgICAgc3AtPnBjaXhfY21kKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChzcC0+cGRldiwgUENJWF9DT01NQU5EX1JFR0lTVEVSLAorCQkJICAgICAmKHNwLT5wY2l4X2NtZCkpOworfQorCitNT0RVTEVfQVVUSE9SKCJSYWdoYXZlbmRyYSBLb3VzaGlrIDxyYWdoYXZlbmRyYS5rb3VzaGlrQG5ldGVyaW9uLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbSh0eF9maWZvX251bSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh0eF9maWZvX2xlbiwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShyeF9yaW5nX251bSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShyeF9yaW5nX3N6LCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKFN0YXRzX3JlZnJlc2hfdGltZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShybWFjX3BhdXNlX3RpbWUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWNfcGF1c2VfdGhyZXNob2xkX3EwcTMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWNfcGF1c2VfdGhyZXNob2xkX3E0cTcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc2hhcmVkX3NwbGl0cywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh0bWFjX3V0aWxfcGVyaW9kLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJtYWNfdXRpbF9wZXJpb2QsIGludCwgMCk7CisjaWZuZGVmIENPTkZJR19TMklPX05BUEkKK21vZHVsZV9wYXJhbShpbmRpY2F0ZV9tYXhfcGt0cywgaW50LCAwKTsKKyNlbmRpZgorLyoqCisgKiAgczJpb19pbml0X25pYyAtIEluaXRpYWxpemF0aW9uIG9mIHRoZSBhZGFwdGVyIC4gCisgKiAgQHBkZXYgOiBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgUENJIHJlbGF0ZWQgaW5mb3JtYXRpb24gb2YgdGhlIGRldmljZS4KKyAqICBAcHJlOiBMaXN0IG9mIFBDSSBkZXZpY2VzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyIGxpc3RlZCBpbiBzMmlvX3RibC4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGUgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgYW4gYWRhcHRlciBpZGVudGlmaWVkIGJ5IHRoZSBwY2lfZGVjIHN0cnVjdHVyZS4KKyAqICBBbGwgT1MgcmVsYXRlZCBpbml0aWFsaXphdGlvbiBpbmNsdWRpbmcgbWVtb3J5IGFuZCBkZXZpY2Ugc3RydWN0dXJlIGFuZCAKKyAqICBpbml0bGFpemF0aW9uIG9mIHRoZSBkZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZSBpcyBkb25lLiBBbHNvIHRoZSBzd2FwcGVyIAorICogIGNvbnRyb2wgcmVnaXN0ZXIgaXMgaW5pdGlhbGl6ZWQgdG8gZW5hYmxlIHJlYWQgYW5kIHdyaXRlIGludG8gdGhlIEkvTyAKKyAqICByZWdpc3RlcnMgb2YgdGhlIGRldmljZS4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIG9uIGZhaWx1cmUuCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQKK3MyaW9faW5pdF9uaWMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwcmUpCit7CisJbmljX3QgKnNwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJY2hhciAqZGV2X25hbWUgPSAiUzJJTyAxMEdFIE5JQyI7CisJaW50IGksIGosIHJldDsKKwlpbnQgZG1hX2ZsYWcgPSBGQUxTRTsKKwl1MzIgbWFjX3VwLCBtYWNfZG93bjsKKwl1NjQgdmFsNjQgPSAwLCB0bXA2NCA9IDA7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IE5VTEw7CisJdTE2IHN1YmlkOworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKworCisJREJHX1BSSU5UKEVSUl9EQkcsICJMb2FkaW5nIFMySU8gZHJpdmVyIHdpdGggJXNcbiIsCisJCXMyaW9fZHJpdmVyX3ZlcnNpb24pOworCisJaWYgKChyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkgICJzMmlvX2luaXRfbmljOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpKSB7CisJCURCR19QUklOVChJTklUX0RCRywgInMyaW9faW5pdF9uaWM6IFVzaW5nIDY0Yml0IERNQVxuIik7CisJCWRtYV9mbGFnID0gVFJVRTsKKworCQlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrCisJCSAgICAocGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkJICAiVW5hYmxlIHRvIG9idGFpbiA2NGJpdCBETUEgZm9yIFwKKwkJCQkJY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIik7CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0gZWxzZSBpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMKSkgeworCQlEQkdfUFJJTlQoSU5JVF9EQkcsICJzMmlvX2luaXRfbmljOiBVc2luZyAzMmJpdCBETUFcbiIpOworCX0gZWxzZSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgczJpb19kcml2ZXJfbmFtZSkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJSZXF1ZXN0IFJlZ2lvbnMgZmFpbGVkXG4iKSwKKwkJICAgIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5pY190KSk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCS8qICBQcml2YXRlIG1lbWJlciB2YXJpYWJsZSBpbml0aWFsaXplZCB0byBzMmlvIE5JQyBzdHJ1Y3R1cmUgKi8KKwlzcCA9IGRldi0+cHJpdjsKKwltZW1zZXQoc3AsIDAsIHNpemVvZihuaWNfdCkpOworCXNwLT5kZXYgPSBkZXY7CisJc3AtPnBkZXYgPSBwZGV2OworCXNwLT52ZW5kb3JfaWQgPSBwZGV2LT52ZW5kb3I7CisJc3AtPmRldmljZV9pZCA9IHBkZXYtPmRldmljZTsKKwlzcC0+aGlnaF9kbWFfZmxhZyA9IGRtYV9mbGFnOworCXNwLT5pcnEgPSBwZGV2LT5pcnE7CisJc3AtPmRldmljZV9lbmFibGVkX29uY2UgPSBGQUxTRTsKKwlzdHJjcHkoc3AtPm5hbWUsIGRldl9uYW1lKTsKKworCS8qIEluaXRpYWxpemUgc29tZSBQQ0kvUENJLVggZmllbGRzIG9mIHRoZSBOSUMuICovCisJczJpb19pbml0X3BjaShzcCk7CisKKwkvKiAKKwkgKiBTZXR0aW5nIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorCSAqIE1vc3Qgb2YgdGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGR1cmluZyAKKwkgKiBtb2R1bGUgaW5zZXJ0aW9uIGFzIHRoZXkgYXJlIG1vZHVsZSBsb2FkYWJsZSBwYXJhbWV0ZXJzLiBJZiAKKwkgKiB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBub3Qgbm90IHNwZWNpZmllZCBkdXJpbmcgbG9hZCB0aW1lLCB0aGV5IAorCSAqIGFyZSBpbml0aWFsaXplZCB3aXRoIGRlZmF1bHQgdmFsdWVzLgorCSAqLworCW1hY19jb250cm9sID0gJnNwLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmc3AtPmNvbmZpZzsKKworCS8qIFR4IHNpZGUgcGFyYW1ldGVycy4gKi8KKwl0eF9maWZvX2xlblswXSA9IERFRkFVTFRfRklGT19MRU47CS8qIERlZmF1bHQgdmFsdWUuICovCisJY29uZmlnLT50eF9maWZvX251bSA9IHR4X2ZpZm9fbnVtOworCWZvciAoaSA9IDA7IGkgPCBNQVhfVFhfRklGT1M7IGkrKykgeworCQljb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbiA9IHR4X2ZpZm9fbGVuW2ldOworCQljb25maWctPnR4X2NmZ1tpXS5maWZvX3ByaW9yaXR5ID0gaTsKKwl9CisKKwljb25maWctPnR4X2ludHJfdHlwZSA9IFRYRF9JTlRfVFlQRV9VVElMWjsKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT50eF9maWZvX251bTsgaSsrKSB7CisJCWNvbmZpZy0+dHhfY2ZnW2ldLmZfbm9fc25vb3AgPQorCQkgICAgKE5PX1NOT09QX1RYRCB8IE5PX1NOT09QX1RYRF9CVUZGRVIpOworCQlpZiAoY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4gPCA2NSkgeworCQkJY29uZmlnLT50eF9pbnRyX3R5cGUgPSBUWERfSU5UX1RZUEVfUEVSX0xJU1Q7CisJCQlicmVhazsKKwkJfQorCX0KKwljb25maWctPm1heF90eGRzID0gTUFYX1NLQl9GUkFHUzsKKworCS8qIFJ4IHNpZGUgcGFyYW1ldGVycy4gKi8KKwlyeF9yaW5nX3N6WzBdID0gU01BTExfQkxLX0NOVDsJLyogRGVmYXVsdCB2YWx1ZS4gKi8KKwljb25maWctPnJ4X3JpbmdfbnVtID0gcnhfcmluZ19udW07CisJZm9yIChpID0gMDsgaSA8IE1BWF9SWF9SSU5HUzsgaSsrKSB7CisJCWNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQgPSByeF9yaW5nX3N6W2ldICoKKwkJICAgIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKTsKKwkJY29uZmlnLT5yeF9jZmdbaV0ucmluZ19wcmlvcml0eSA9IGk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHJ4X3JpbmdfbnVtOyBpKyspIHsKKwkJY29uZmlnLT5yeF9jZmdbaV0ucmluZ19vcmcgPSBSSU5HX09SR19CVUZGMTsKKwkJY29uZmlnLT5yeF9jZmdbaV0uZl9ub19zbm9vcCA9CisJCSAgICAoTk9fU05PT1BfUlhEIHwgTk9fU05PT1BfUlhEX0JVRkZFUik7CisJfQorCisJLyogIFNldHRpbmcgTWFjIENvbnRyb2wgcGFyYW1ldGVycyAqLworCW1hY19jb250cm9sLT5ybWFjX3BhdXNlX3RpbWUgPSBybWFjX3BhdXNlX3RpbWU7CisJbWFjX2NvbnRyb2wtPm1jX3BhdXNlX3RocmVzaG9sZF9xMHEzID0gbWNfcGF1c2VfdGhyZXNob2xkX3EwcTM7CisJbWFjX2NvbnRyb2wtPm1jX3BhdXNlX3RocmVzaG9sZF9xNHE3ID0gbWNfcGF1c2VfdGhyZXNob2xkX3E0cTc7CisKKworCS8qIEluaXRpYWxpemUgUmluZyBidWZmZXIgcGFyYW1ldGVycy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKQorCQlhdG9taWNfc2V0KCZzcC0+cnhfYnVmc19sZWZ0W2ldLCAwKTsKKworCS8qICBpbml0aWFsaXplIHRoZSBzaGFyZWQgbWVtb3J5IHVzZWQgYnkgdGhlIE5JQyBhbmQgdGhlIGhvc3QgKi8KKwlpZiAoaW5pdF9zaGFyZWRfbWVtKHNwKSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gbWVtX2FsbG9jX2ZhaWxlZDsKKwl9CisKKwlzcC0+YmFyMCA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAorCQkJCSAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJaWYgKCFzcC0+YmFyMCkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBTMklPOiBjYW5ub3QgcmVtYXAgaW8gbWVtMVxuIiwKKwkJCSAgZGV2LT5uYW1lKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBiYXIwX3JlbWFwX2ZhaWxlZDsKKwl9CisKKwlzcC0+YmFyMSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLAorCQkJCSAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSk7CisJaWYgKCFzcC0+YmFyMSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBTMklPOiBjYW5ub3QgcmVtYXAgaW8gbWVtMlxuIiwKKwkJCSAgZGV2LT5uYW1lKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBiYXIxX3JlbWFwX2ZhaWxlZDsKKwl9CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKSBzcC0+YmFyMDsKKworCS8qIEluaXRpYWxpemluZyB0aGUgQkFSMSBhZGRyZXNzIGFzIHRoZSBzdGFydCBvZiB0aGUgRklGTyBwb2ludGVyLiAqLworCWZvciAoaiA9IDA7IGogPCBNQVhfVFhfRklGT1M7IGorKykgeworCQltYWNfY29udHJvbC0+dHhfRklGT19zdGFydFtqXSA9IChUeEZJRk9fZWxlbWVudF90IF9faW9tZW0gKikKKwkJICAgIChzcC0+YmFyMSArIChqICogMHgwMDAyMDAwMCkpOworCX0KKworCS8qICBEcml2ZXIgZW50cnkgcG9pbnRzICovCisJZGV2LT5vcGVuID0gJnMyaW9fb3BlbjsKKwlkZXYtPnN0b3AgPSAmczJpb19jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzMmlvX3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSAmczJpb19nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmczJpb19zZXRfbXVsdGljYXN0OworCWRldi0+ZG9faW9jdGwgPSAmczJpb19pb2N0bDsKKwlkZXYtPmNoYW5nZV9tdHUgPSAmczJpb19jaGFuZ2VfbXR1OworCVNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOworCS8qCisJICogd2lsbCB1c2UgZXRoX21hY19hZGRyKCkgZm9yICBkZXYtPnNldF9tYWNfYWRkcmVzcworCSAqIG1hYyBhZGRyZXNzIHdpbGwgYmUgc2V0IGV2ZXJ5IHRpbWUgZGV2LT5vcGVuKCkgaXMgY2FsbGVkCisJICovCisjaWZkZWYgQ09ORklHX1MySU9fTkFQSQorCWRldi0+cG9sbCA9IHMyaW9fcG9sbDsKKwlkZXYtPndlaWdodCA9IDkwOworI2VuZGlmCisKKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU07CisJaWYgKHNwLT5oaWdoX2RtYV9mbGFnID09IFRSVUUpCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworI2lmZGVmIE5FVElGX0ZfVFNPCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKKyNlbmRpZgorCisJZGV2LT50eF90aW1lb3V0ID0gJnMyaW9fdHhfd2F0Y2hkb2c7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFdBVENIX0RPR19USU1FT1VUOworCUlOSVRfV09SSygmc3AtPnJzdF90aW1lcl90YXNrLAorCQkgICh2b2lkICgqKSh2b2lkICopKSBzMmlvX3Jlc3RhcnRfbmljLCBkZXYpOworCUlOSVRfV09SSygmc3AtPnNldF9saW5rX3Rhc2ssCisJCSAgKHZvaWQgKCopKHZvaWQgKikpIHMyaW9fc2V0X2xpbmssIHNwKTsKKworCXBjaV9zYXZlX3N0YXRlKHNwLT5wZGV2KTsKKworCS8qIFNldHRpbmcgc3dhcHBlciBjb250cm9sIG9uIHRoZSBOSUMsIGZvciBwcm9wZXIgcmVzZXQgb3BlcmF0aW9uICovCisJaWYgKHMyaW9fc2V0X3N3YXBwZXIoc3ApKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6c3dhcHBlciBzZXR0aW5ncyBhcmUgd3JvbmdcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gc2V0X3N3YXBfZmFpbGVkOworCX0KKworCS8qIEZpeCBmb3IgYWxsICJGRnMiIE1BQyBhZGRyZXNzIHByb2JsZW1zIG9ic2VydmVkIG9uIEFscGhhIHBsYXRmb3JtcyAqLworCWZpeF9tYWNfYWRkcmVzcyhzcCk7CisJczJpb19yZXNldChzcCk7CisKKwkvKgorCSAqIFNldHRpbmcgc3dhcHBlciBjb250cm9sIG9uIHRoZSBOSUMsIHNvIHRoZSBNQUMgYWRkcmVzcyBjYW4gYmUgcmVhZC4KKwkgKi8KKwlpZiAoczJpb19zZXRfc3dhcHBlcihzcCkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkgICIlczogUzJJTzogc3dhcHBlciBzZXR0aW5ncyBhcmUgd3JvbmdcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gc2V0X3N3YXBfZmFpbGVkOworCX0KKworCS8qICAKKwkgKiBNQUMgYWRkcmVzcyBpbml0aWFsaXphdGlvbi4KKwkgKiBGb3Igbm93IG9ubHkgb25lIG1hYyBhZGRyZXNzIHdpbGwgYmUgcmVhZCBhbmQgdXNlZC4KKwkgKi8KKwliYXIwID0gc3AtPmJhcjA7CisJdmFsNjQgPSBSTUFDX0FERFJfQ01EX01FTV9SRCB8IFJNQUNfQUREUl9DTURfTUVNX1NUUk9CRV9ORVdfQ01EIHwKKwkgICAgUk1BQ19BRERSX0NNRF9NRU1fT0ZGU0VUKDAgKyBNQUNfTUFDX0FERFJfU1RBUlRfT0ZGU0VUKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5ybWFjX2FkZHJfY21kX21lbSk7CisJd2FpdF9mb3JfY21kX2NvbXBsZXRlKHNwKTsKKworCXRtcDY0ID0gcmVhZHEoJmJhcjAtPnJtYWNfYWRkcl9kYXRhMF9tZW0pOworCW1hY19kb3duID0gKHUzMikgdG1wNjQ7CisJbWFjX3VwID0gKHUzMikgKHRtcDY0ID4+IDMyKTsKKworCW1lbXNldChzcC0+ZGVmX21hY19hZGRyWzBdLm1hY19hZGRyLCAwLCBzaXplb2YoRVRIX0FMRU4pKTsKKworCXNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbM10gPSAodTgpIChtYWNfdXApOworCXNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbMl0gPSAodTgpIChtYWNfdXAgPj4gOCk7CisJc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclsxXSA9ICh1OCkgKG1hY191cCA+PiAxNik7CisJc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclswXSA9ICh1OCkgKG1hY191cCA+PiAyNCk7CisJc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkcls1XSA9ICh1OCkgKG1hY19kb3duID4+IDE2KTsKKwlzcC0+ZGVmX21hY19hZGRyWzBdLm1hY19hZGRyWzRdID0gKHU4KSAobWFjX2Rvd24gPj4gMjQpOworCisJREJHX1BSSU5UKElOSVRfREJHLAorCQkgICJERUZBVUxUIE1BQyBBRERSOjB4JTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnhcbiIsCisJCSAgc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclswXSwKKwkJICBzcC0+ZGVmX21hY19hZGRyWzBdLm1hY19hZGRyWzFdLAorCQkgIHNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbMl0sCisJCSAgc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclszXSwKKwkJICBzcC0+ZGVmX21hY19hZGRyWzBdLm1hY19hZGRyWzRdLAorCQkgIHNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbNV0pOworCisJLyogIFNldCB0aGUgZmFjdG9yeSBkZWZpbmVkIE1BQyBhZGRyZXNzIGluaXRpYWxseSAgICovCisJZGV2LT5hZGRyX2xlbiA9IEVUSF9BTEVOOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBzcC0+ZGVmX21hY19hZGRyLCBFVEhfQUxFTik7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHRhc2tsZXQgc3RhdHVzIGFuZCBsaW5rIHN0YXRlIGZsYWdzIAorCSAqIGFuZCB0aGUgY2FyZCBzdGF0dGUgcGFyYW1ldGVyCisJICovCisJYXRvbWljX3NldCgmKHNwLT5jYXJkX3N0YXRlKSwgMCk7CisJc3AtPnRhc2tsZXRfc3RhdHVzID0gMDsKKwlzcC0+bGlua19zdGF0ZSA9IDA7CisKKworCS8qIEluaXRpYWxpemUgc3BpbmxvY2tzICovCisJc3Bpbl9sb2NrX2luaXQoJnNwLT50eF9sb2NrKTsKKyNpZm5kZWYgQ09ORklHX1MySU9fTkFQSQorCXNwaW5fbG9ja19pbml0KCZzcC0+cHV0X2xvY2spOworI2VuZGlmCisKKwkvKiAKKwkgKiBTWEUtMDAyOiBDb25maWd1cmUgbGluayBhbmQgYWN0aXZpdHkgTEVEIHRvIGluaXQgc3RhdGUgCisJICogb24gZHJpdmVyIGxvYWQuIAorCSAqLworCXN1YmlkID0gc3AtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJaWYgKChzdWJpZCAmIDB4RkYpID49IDB4MDcpIHsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJdmFsNjQgfD0gMHgwMDAwODAwMDAwMDAwMDAwVUxMOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQl2YWw2NCA9IDB4MDQxMTA0MDQwMDAwMDAwMFVMTDsKKwkJd3JpdGVxKHZhbDY0LCAodm9pZCBfX2lvbWVtICopIGJhcjAgKyAweDI3MDApOworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2NvbnRyb2wpOworCX0KKworCXNwLT5yeF9jc3VtID0gMTsJLyogUnggY2hrc3VtIHZlcmlmeSBlbmFibGVkIGJ5IGRlZmF1bHQgKi8KKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIkRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byByZWdpc3Rlcl9mYWlsZWQ7CisJfQorCisJLyogCisJICogTWFrZSBMaW5rIHN0YXRlIGFzIG9mZiBhdCB0aGlzIHBvaW50LCB3aGVuIHRoZSBMaW5rIGNoYW5nZSAKKwkgKiBpbnRlcnJ1cHQgY29tZXMgdGhlIHN0YXRlIHdpbGwgYmUgYXV0b21hdGljYWxseSBjaGFuZ2VkIHRvIAorCSAqIHRoZSByaWdodCBzdGF0ZS4KKwkgKi8KKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCXNwLT5sYXN0X2xpbmtfc3RhdGUgPSBMSU5LX0RPV047CisKKwlyZXR1cm4gMDsKKworICAgICAgcmVnaXN0ZXJfZmFpbGVkOgorICAgICAgc2V0X3N3YXBfZmFpbGVkOgorCWlvdW5tYXAoc3AtPmJhcjEpOworICAgICAgYmFyMV9yZW1hcF9mYWlsZWQ6CisJaW91bm1hcChzcC0+YmFyMCk7CisgICAgICBiYXIwX3JlbWFwX2ZhaWxlZDoKKyAgICAgIG1lbV9hbGxvY19mYWlsZWQ6CisJZnJlZV9zaGFyZWRfbWVtKHNwKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogczJpb19yZW1fbmljIC0gRnJlZSB0aGUgUENJIGRldmljZSAKKyAqIEBwZGV2OiBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgUENJIHJlbGF0ZWQgaW5mb3JtYXRpb24gb2YgdGhlIGRldmljZS4KKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgUGNpIHN1YnN5c3RlbSB0byByZWxlYXNlIGEgCisgKiBQQ0kgZGV2aWNlIGFuZCBmcmVlIHVwIGFsbCByZXNvdXJjZSBoZWxkIHVwIGJ5IHRoZSBkZXZpY2UuIFRoaXMgY291bGQKKyAqIGJlIGluIHJlc3BvbnNlIHRvIGEgSG90IHBsdWcgZXZlbnQgb3Igd2hlbiB0aGUgZHJpdmVyIGlzIHRvIGJlIHJlbW92ZWQgCisgKiBmcm9tIG1lbW9yeS4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgczJpb19yZW1fbmljKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPQorCSAgICAoc3RydWN0IG5ldF9kZXZpY2UgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCW5pY190ICpzcDsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIkRyaXZlciBEYXRhIGlzIE5VTEwhIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlzcCA9IGRldi0+cHJpdjsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJZnJlZV9zaGFyZWRfbWVtKHNwKTsKKwlpb3VubWFwKHNwLT5iYXIwKTsKKwlpb3VubWFwKHNwLT5iYXIxKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlmcmVlX25ldGRldihkZXYpOworfQorCisvKioKKyAqIHMyaW9fc3RhcnRlciAtIEVudHJ5IHBvaW50IGZvciB0aGUgZHJpdmVyCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBkcml2ZXIuIEl0IHZlcmlmaWVzCisgKiB0aGUgbW9kdWxlIGxvYWRhYmxlIHBhcmFtZXRlcnMgYW5kIGluaXRpYWxpemVzIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlLgorICovCisKK2ludCBfX2luaXQgczJpb19zdGFydGVyKHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmczJpb19kcml2ZXIpOworfQorCisvKioKKyAqIHMyaW9fY2xvc2VyIC0gQ2xlYW51cCByb3V0aW5lIGZvciB0aGUgZHJpdmVyIAorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdGhlIGNsZWFudXAgcm91dGluZSBmb3IgdGhlIGRyaXZlci4gSXQgdW5yZWdpc3QgKiBlcnMgdGhlIGRyaXZlci4KKyAqLworCitzdGF0aWMgdm9pZCBzMmlvX2Nsb3Nlcih2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmczJpb19kcml2ZXIpOworCURCR19QUklOVChJTklUX0RCRywgImNsZWFudXAgZG9uZVxuIik7Cit9CisKK21vZHVsZV9pbml0KHMyaW9fc3RhcnRlcik7Cittb2R1bGVfZXhpdChzMmlvX2Nsb3Nlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmggYi9kcml2ZXJzL25ldC9zMmlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxMWM4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uaApAQCAtMCwwICsxLDc2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogczJpby5oOiBBIExpbnV4IFBDSS1YIEV0aGVybmV0IGRyaXZlciBmb3IgUzJJTyAxMEdiRSBTZXJ2ZXIgTklDCisgKiBDb3B5cmlnaHQoYykgMjAwMi0yMDA1IE5ldGVyaW9uIEluYy4KKworICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqIERyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKyAqIHJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKyAqIGEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisgKiBzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KKyAqIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoaXMgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX1MySU9fSAorI2RlZmluZSBfUzJJT19ICisKKyNkZWZpbmUgVEJEIDAKKyNkZWZpbmUgQklUKGxvYykJCSgweDgwMDAwMDAwMDAwMDAwMDBVTEwgPj4gKGxvYykpCisjZGVmaW5lIHZCSVQodmFsLCBsb2MsIHN6KQkoKCh1NjQpdmFsKSA8PCAoNjQtbG9jLXN6KSkKKyNkZWZpbmUgSU5WKGQpICAoKGQmMHhmZik8PDI0KSB8ICgoKGQ+PjgpJjB4ZmYpPDwxNikgfCAoKChkPj4xNikmMHhmZik8PDgpfCAoKGQ+PjI0KSYweGZmKQorCisjaWZuZGVmIEJPT0wKKyNkZWZpbmUgQk9PTCAgICBpbnQKKyNlbmRpZgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgICAxCisjZGVmaW5lIEZBTFNFICAgMAorI2VuZGlmCisKKyN1bmRlZiBTVUNDRVNTCisjZGVmaW5lIFNVQ0NFU1MgMAorI2RlZmluZSBGQUlMVVJFIC0xCisKKy8qIE1heGltdW0gb3V0c3RhbmRpbmcgc3BsaXRzIHRvIGJlIGNvbmZpZ3VyZWQgaW50byB4ZW5hLiAqLwordHlwZWRlZiBlbnVtIHhlbmFfbWF4X291dHN0YW5kaW5nX3NwbGl0cyB7CisJWEVOQV9PTkVfU1BMSVRfVFJBTlNBQ1RJT04gPSAwLAorCVhFTkFfVFdPX1NQTElUX1RSQU5TQUNUSU9OID0gMSwKKwlYRU5BX1RIUkVFX1NQTElUX1RSQU5TQUNUSU9OID0gMiwKKwlYRU5BX0ZPVVJfU1BMSVRfVFJBTlNBQ1RJT04gPSAzLAorCVhFTkFfRUlHSFRfU1BMSVRfVFJBTlNBQ1RJT04gPSA0LAorCVhFTkFfVFdFTFZFX1NQTElUX1RSQU5TQUNUSU9OID0gNSwKKwlYRU5BX1NJWFRFRU5fU1BMSVRfVFJBTlNBQ1RJT04gPSA2LAorCVhFTkFfVEhJUlRZVFdPX1NQTElUX1RSQU5TQUNUSU9OID0gNworfSB4ZW5hX21heF9vdXRzdGFuZGluZ19zcGxpdHM7CisjZGVmaW5lIFhFTkFfTUFYX09VVFNUQU5ESU5HX1NQTElUUyhuKSAobiA8PCA0KQorCisvKiAgT1MgY29uY2VybmVkIHZhcmlhYmxlcyBhbmQgY29uc3RhbnRzICovCisjZGVmaW5lIFdBVENIX0RPR19USU1FT1VUICAgCTUqSFoKKyNkZWZpbmUgRUZJTEwgICAgICAgCQkJMHgxMjM0CisjZGVmaW5lIEFMSUdOX1NJWkUgIAkJCTEyNworI2RlZmluZQlQQ0lYX0NPTU1BTkRfUkVHSVNURVIJMHg2MgorCisvKgorICogRGVidWcgcmVsYXRlZCB2YXJpYWJsZXMuCisgKi8KKy8qIGRpZmZlcmVudCBkZWJ1ZyBsZXZlbHMuICovCisjZGVmaW5lCUVSUl9EQkcJCTAKKyNkZWZpbmUJSU5JVF9EQkcJMQorI2RlZmluZQlJTkZPX0RCRwkyCisjZGVmaW5lCVRYX0RCRwkJMworI2RlZmluZQlJTlRSX0RCRwk0CisKKy8qIEdsb2JhbCB2YXJpYWJsZSB0aGF0IGRlZmluZXMgdGhlIHByZXNlbnQgZGVidWcgbGV2ZWwgb2YgdGhlIGRyaXZlci4gKi8KK3N0YXRpYyBpbnQgZGVidWdfbGV2ZWwgPSBFUlJfREJHOwkvKiBEZWZhdWx0IGxldmVsLiAqLworCisvKiBERUJVRyBtZXNzYWdlIHByaW50LiAqLworI2RlZmluZSBEQkdfUFJJTlQoZGJnX2xldmVsLCBhcmdzLi4uKSAgaWYoIShkZWJ1Z19sZXZlbDxkYmdfbGV2ZWwpKSBwcmludGsoYXJncykKKworLyogUHJvdG9jb2wgYXNzaXN0IGZlYXR1cmVzIG9mIHRoZSBOSUMgKi8KKyNkZWZpbmUgTDNfQ0tTVU1fT0sgMHhGRkZGCisjZGVmaW5lIEw0X0NLU1VNX09LIDB4RkZGRgorI2RlZmluZSBTMklPX0pVTUJPX1NJWkUgOTYwMAorCisvKiBUaGUgc3RhdGlzdGljcyBibG9jayBvZiBYZW5hICovCit0eXBlZGVmIHN0cnVjdCBzdGF0X2Jsb2NrIHsKKy8qIFR4IE1BQyBzdGF0aXN0aWNzIGNvdW50ZXJzLiAqLworCXUzMiB0bWFjX2RhdGFfb2N0ZXRzOworCXUzMiB0bWFjX2ZybXM7CisJdTY0IHRtYWNfZHJvcF9mcm1zOworCXUzMiB0bWFjX2Jjc3RfZnJtczsKKwl1MzIgdG1hY19tY3N0X2ZybXM7CisJdTY0IHRtYWNfcGF1c2VfY3RybF9mcm1zOworCXUzMiB0bWFjX3Vjc3RfZnJtczsKKwl1MzIgdG1hY190dGxfb2N0ZXRzOworCXUzMiB0bWFjX2FueV9lcnJfZnJtczsKKwl1MzIgdG1hY19udWNzdF9mcm1zOworCXU2NCB0bWFjX3R0bF9sZXNzX2ZiX29jdGV0czsKKwl1NjQgdG1hY192bGRfaXBfb2N0ZXRzOworCXUzMiB0bWFjX2Ryb3BfaXA7CisJdTMyIHRtYWNfdmxkX2lwOworCXUzMiB0bWFjX3JzdF90Y3A7CisJdTMyIHRtYWNfaWNtcDsKKwl1NjQgdG1hY190Y3A7CisJdTMyIHJlc2VydmVkXzA7CisJdTMyIHRtYWNfdWRwOworCisvKiBSeCBNQUMgU3RhdGlzdGljcyBjb3VudGVycy4gKi8KKwl1MzIgcm1hY19kYXRhX29jdGV0czsKKwl1MzIgcm1hY192bGRfZnJtczsKKwl1NjQgcm1hY19mY3NfZXJyX2ZybXM7CisJdTY0IHJtYWNfZHJvcF9mcm1zOworCXUzMiBybWFjX3ZsZF9iY3N0X2ZybXM7CisJdTMyIHJtYWNfdmxkX21jc3RfZnJtczsKKwl1MzIgcm1hY19vdXRfcm5nX2xlbl9lcnJfZnJtczsKKwl1MzIgcm1hY19pbl9ybmdfbGVuX2Vycl9mcm1zOworCXU2NCBybWFjX2xvbmdfZnJtczsKKwl1NjQgcm1hY19wYXVzZV9jdHJsX2ZybXM7CisJdTY0IHJtYWNfdW5zdXBfY3RybF9mcm1zOworCXUzMiBybWFjX2FjY2VwdGVkX3Vjc3RfZnJtczsKKwl1MzIgcm1hY190dGxfb2N0ZXRzOworCXUzMiBybWFjX2Rpc2NhcmRlZF9mcm1zOworCXUzMiBybWFjX2FjY2VwdGVkX251Y3N0X2ZybXM7CisJdTMyIHJlc2VydmVkXzE7CisJdTMyIHJtYWNfZHJvcF9ldmVudHM7CisJdTY0IHJtYWNfdHRsX2xlc3NfZmJfb2N0ZXRzOworCXU2NCBybWFjX3R0bF9mcm1zOworCXU2NCByZXNlcnZlZF8yOworCXUzMiBybWFjX3VzaXplZF9mcm1zOworCXUzMiByZXNlcnZlZF8zOworCXUzMiBybWFjX2ZyYWdfZnJtczsKKwl1MzIgcm1hY19vc2l6ZWRfZnJtczsKKwl1MzIgcmVzZXJ2ZWRfNDsKKwl1MzIgcm1hY19qYWJiZXJfZnJtczsKKwl1NjQgcm1hY190dGxfNjRfZnJtczsKKwl1NjQgcm1hY190dGxfNjVfMTI3X2ZybXM7CisJdTY0IHJlc2VydmVkXzU7CisJdTY0IHJtYWNfdHRsXzEyOF8yNTVfZnJtczsKKwl1NjQgcm1hY190dGxfMjU2XzUxMV9mcm1zOworCXU2NCByZXNlcnZlZF82OworCXU2NCBybWFjX3R0bF81MTJfMTAyM19mcm1zOworCXU2NCBybWFjX3R0bF8xMDI0XzE1MThfZnJtczsKKwl1MzIgcm1hY19pcDsKKwl1MzIgcmVzZXJ2ZWRfNzsKKwl1NjQgcm1hY19pcF9vY3RldHM7CisJdTMyIHJtYWNfZHJvcF9pcDsKKwl1MzIgcm1hY19oZHJfZXJyX2lwOworCXUzMiByZXNlcnZlZF84OworCXUzMiBybWFjX2ljbXA7CisJdTY0IHJtYWNfdGNwOworCXUzMiBybWFjX2Vycl9kcnBfdWRwOworCXUzMiBybWFjX3VkcDsKKwl1NjQgcm1hY194Z21paV9lcnJfc3ltOworCXU2NCBybWFjX2ZybXNfcTA7CisJdTY0IHJtYWNfZnJtc19xMTsKKwl1NjQgcm1hY19mcm1zX3EyOworCXU2NCBybWFjX2ZybXNfcTM7CisJdTY0IHJtYWNfZnJtc19xNDsKKwl1NjQgcm1hY19mcm1zX3E1OworCXU2NCBybWFjX2ZybXNfcTY7CisJdTY0IHJtYWNfZnJtc19xNzsKKwl1MTYgcm1hY19mdWxsX3EzOworCXUxNiBybWFjX2Z1bGxfcTI7CisJdTE2IHJtYWNfZnVsbF9xMTsKKwl1MTYgcm1hY19mdWxsX3EwOworCXUxNiBybWFjX2Z1bGxfcTc7CisJdTE2IHJtYWNfZnVsbF9xNjsKKwl1MTYgcm1hY19mdWxsX3E1OworCXUxNiBybWFjX2Z1bGxfcTQ7CisJdTMyIHJlc2VydmVkXzk7CisJdTMyIHJtYWNfcGF1c2VfY250OworCXU2NCBybWFjX3hnbWlpX2RhdGFfZXJyX2NudDsKKwl1NjQgcm1hY194Z21paV9jdHJsX2Vycl9jbnQ7CisJdTMyIHJtYWNfZXJyX3RjcDsKKwl1MzIgcm1hY19hY2NlcHRlZF9pcDsKKworLyogUENJL1BDSS1YIFJlYWQgdHJhbnNhY3Rpb24gc3RhdGlzdGljcy4gKi8KKwl1MzIgbmV3X3JkX3JlcV9jbnQ7CisJdTMyIHJkX3JlcV9jbnQ7CisJdTMyIHJkX3J0cnlfY250OworCXUzMiBuZXdfcmRfcmVxX3J0cnlfY250OworCisvKiBQQ0kvUENJLVggV3JpdGUvUmVhZCB0cmFuc2FjdGlvbiBzdGF0aXN0aWNzLiAqLworCXUzMiB3cl9yZXFfY250OworCXUzMiB3cl9ydHJ5X3JkX2Fja19jbnQ7CisJdTMyIG5ld193cl9yZXFfcnRyeV9jbnQ7CisJdTMyIG5ld193cl9yZXFfY250OworCXUzMiB3cl9kaXNjX2NudDsKKwl1MzIgd3JfcnRyeV9jbnQ7CisKKy8qCVBDSS9QQ0ktWCBXcml0ZSAvIERNQSBUcmFuc2FjdGlvbiBzdGF0aXN0aWNzLiAqLworCXUzMiB0eHBfd3JfY250OworCXUzMiByZF9ydHJ5X3dyX2Fja19jbnQ7CisJdTMyIHR4ZF93cl9jbnQ7CisJdTMyIHR4ZF9yZF9jbnQ7CisJdTMyIHJ4ZF93cl9jbnQ7CisJdTMyIHJ4ZF9yZF9jbnQ7CisJdTMyIHJ4Zl93cl9jbnQ7CisJdTMyIHR4Zl9yZF9jbnQ7Cit9IFN0YXRJbmZvX3Q7CisKKy8qIFN0cnVjdHVyZXMgcmVwcmVzZW50aW5nIGRpZmZlcmVudCBpbml0IHRpbWUgY29uZmlndXJhdGlvbgorICogcGFyYW1ldGVycyBvZiB0aGUgTklDLgorICovCisKKy8qIE1haW50YWlucyBQZXIgRklGTyByZWxhdGVkIGluZm9ybWF0aW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QgdHhfZmlmb19jb25maWcgeworI2RlZmluZQlNQVhfQVZBSUxBQkxFX1RYRFMJODE5MgorCXUzMiBmaWZvX2xlbjsJCS8qIHNwZWNpZmllcyBsZW4gb2YgRklGTyB1cHRvIDgxOTIsIGllIG5vIG9mIFR4RExzICovCisvKiBQcmlvcml0eSBkZWZpbml0aW9uICovCisjZGVmaW5lIFRYX0ZJRk9fUFJJXzAgICAgICAgICAgICAgICAwCS8qSGlnaGVzdCAqLworI2RlZmluZSBUWF9GSUZPX1BSSV8xICAgICAgICAgICAgICAgMQorI2RlZmluZSBUWF9GSUZPX1BSSV8yICAgICAgICAgICAgICAgMgorI2RlZmluZSBUWF9GSUZPX1BSSV8zICAgICAgICAgICAgICAgMworI2RlZmluZSBUWF9GSUZPX1BSSV80ICAgICAgICAgICAgICAgNAorI2RlZmluZSBUWF9GSUZPX1BSSV81ICAgICAgICAgICAgICAgNQorI2RlZmluZSBUWF9GSUZPX1BSSV82ICAgICAgICAgICAgICAgNgorI2RlZmluZSBUWF9GSUZPX1BSSV83ICAgICAgICAgICAgICAgNwkvKmxvd2VzdCAqLworCXU4IGZpZm9fcHJpb3JpdHk7CS8qIHNwZWNpZmllcyBwb2ludGVyIGxldmVsIGZvciBGSUZPICovCisJLyogdXNlciBzaG91bGQgbm90IHNldCB0d29zIGZpZm9zIHdpdGggc2FtZSBwcmkgKi8KKwl1OCBmX25vX3Nub29wOworI2RlZmluZSBOT19TTk9PUF9UWEQgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBOT19TTk9PUF9UWERfQlVGRkVSICAgICAgICAgIDB4MDIKK30gdHhfZmlmb19jb25maWdfdDsKKworCisvKiBNYWludGFpbnMgcGVyIFJpbmcgcmVsYXRlZCBpbmZvcm1hdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgcnhfcmluZ19jb25maWcgeworCXUzMiBudW1fcnhkOwkJLypObyBvZiBSeERzIHBlciBSeCBSaW5nICovCisjZGVmaW5lIFJYX1JJTkdfUFJJXzAgICAgICAgICAgICAgICAwCS8qIGhpZ2hlc3QgKi8KKyNkZWZpbmUgUlhfUklOR19QUklfMSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUlhfUklOR19QUklfMiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUlhfUklOR19QUklfMyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUlhfUklOR19QUklfNCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUlhfUklOR19QUklfNSAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUlhfUklOR19QUklfNiAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUlhfUklOR19QUklfNyAgICAgICAgICAgICAgIDcJLyogbG93ZXN0ICovCisKKwl1OCByaW5nX3ByaW9yaXR5OwkvKlNwZWNpZmllcyBzZXJ2aWNlIHByaW9yaXR5IG9mIHJpbmcgKi8KKwkvKiBPU00gc2hvdWxkIG5vdCBzZXQgYW55IHR3byByaW5ncyB3aXRoIHNhbWUgcHJpb3JpdHkgKi8KKwl1OCByaW5nX29yZzsJCS8qT3JnYW5pemF0aW9uIG9mIHJpbmcgKi8KKyNkZWZpbmUgUklOR19PUkdfQlVGRjEJCTB4MDEKKyNkZWZpbmUgUlhfUklOR19PUkdfQlVGRjMJMHgwMworI2RlZmluZSBSWF9SSU5HX09SR19CVUZGNQkweDA1CisKKwl1OCBmX25vX3Nub29wOworI2RlZmluZSBOT19TTk9PUF9SWEQgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBOT19TTk9PUF9SWERfQlVGRkVSICAgICAgICAgMHgwMgorfSByeF9yaW5nX2NvbmZpZ190OworCisvKiBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyBjb250YWlucyB2YWx1ZXMgb2YgdGhlIHR1bmFibGUgcGFyYW1ldGVycyAKKyAqIG9mIHRoZSBIL1cgCisgKi8KK3N0cnVjdCBjb25maWdfcGFyYW0geworLyogVHggU2lkZSAqLworCXUzMiB0eF9maWZvX251bTsJLypOdW1iZXIgb2YgVHggRklGT3MgKi8KKyNkZWZpbmUgTUFYX1RYX0ZJRk9TIDgKKworCXR4X2ZpZm9fY29uZmlnX3QgdHhfY2ZnW01BWF9UWF9GSUZPU107CS8qUGVyLVR4IEZJRk8gY29uZmlnICovCisJdTMyIG1heF90eGRzOwkJLypNYXggbm8uIG9mIFR4IGJ1ZmZlciBkZXNjcmlwdG9yIHBlciBUeERMICovCisJdTY0IHR4X2ludHJfdHlwZTsKKwkvKiBTcGVjaWZpZXMgaWYgVHggSW50ciBpcyBVVElMWiBvciBQRVJfTElTVCB0eXBlLiAqLworCisvKiBSeCBTaWRlICovCisJdTMyIHJ4X3JpbmdfbnVtOwkvKk51bWJlciBvZiByZWNlaXZlIHJpbmdzICovCisjZGVmaW5lIE1BWF9SWF9SSU5HUyA4CisjZGVmaW5lIE1BWF9SWF9CTE9DS1NfUEVSX1JJTkcgIDE1MAorCisJcnhfcmluZ19jb25maWdfdCByeF9jZmdbTUFYX1JYX1JJTkdTXTsJLypQZXItUnggUmluZyBjb25maWcgKi8KKworI2RlZmluZSBIRUFERVJfRVRIRVJORVRfSUlfODAyXzNfU0laRSAxNAorI2RlZmluZSBIRUFERVJfODAyXzJfU0laRSAgICAgICAgICAgICAgMworI2RlZmluZSBIRUFERVJfU05BUF9TSVpFICAgICAgICAgICAgICAgNQorI2RlZmluZSBIRUFERVJfVkxBTl9TSVpFICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIE1JTl9NVFUgICAgICAgICAgICAgICAgICAgICAgIDQ2CisjZGVmaW5lIE1BWF9QWUxEICAgICAgICAgICAgICAgICAgICAxNTAwCisjZGVmaW5lIE1BWF9NVFUgICAgICAgICAgICAgICAgICAgICAoTUFYX1BZTEQrMTgpCisjZGVmaW5lIE1BWF9NVFVfVkxBTiAgICAgICAgICAgICAgICAoTUFYX1BZTEQrMjIpCisjZGVmaW5lIE1BWF9QWUxEX0pVTUJPICAgICAgICAgICAgICA5NjAwCisjZGVmaW5lIE1BWF9NVFVfSlVNQk8gICAgICAgICAgICAgICAoTUFYX1BZTERfSlVNQk8rMTgpCisjZGVmaW5lIE1BWF9NVFVfSlVNQk9fVkxBTiAgICAgICAgICAoTUFYX1BZTERfSlVNQk8rMjIpCit9OworCisvKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIE1BQyBBZGRycyAqLwordHlwZWRlZiBzdHJ1Y3QgbWFjX2FkZHIgeworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKK30gbWFjYWRkcl90OworCisvKiBTdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnQgZXZlcnkgRklGTyBlbGVtZW50IGluIHRoZSBCQVIxCisgKiBBZGRyZXNzIGxvY2F0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1R4RklGT19lbGVtZW50IHsKKwl1NjQgVHhETF9Qb2ludGVyOworCisJdTY0IExpc3RfQ29udHJvbDsKKyNkZWZpbmUgVFhfRklGT19MQVNUX1RYRF9OVU0oIHZhbCkgICAgIHZCSVQodmFsLDAsOCkKKyNkZWZpbmUgVFhfRklGT19GSVJTVF9MSVNUICAgICAgICAgICAgIEJJVCgxNCkKKyNkZWZpbmUgVFhfRklGT19MQVNUX0xJU1QgICAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgVFhfRklGT19GSVJTVE5MQVNUX0xJU1QgICAgICAgIHZCSVQoMywxNCwyKQorI2RlZmluZSBUWF9GSUZPX1NQRUNJQUxfRlVOQyAgICAgICAgICAgQklUKDIzKQorI2RlZmluZSBUWF9GSUZPX0RTX05PX1NOT09QICAgICAgICAgICAgQklUKDMxKQorI2RlZmluZSBUWF9GSUZPX0JVRkZfTk9fU05PT1AgICAgICAgICAgQklUKDMwKQorfSBUeEZJRk9fZWxlbWVudF90OworCisvKiBUeCBkZXNjcmlwdG9yIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgX1R4RCB7CisJdTY0IENvbnRyb2xfMTsKKy8qIGJpdCBtYXNrICovCisjZGVmaW5lIFRYRF9MSVNUX09XTl9YRU5BICAgICAgIEJJVCg3KQorI2RlZmluZSBUWERfVF9DT0RFICAgICAgICAgICAgICAoQklUKDEyKXxCSVQoMTMpfEJJVCgxNCl8QklUKDE1KSkKKyNkZWZpbmUgVFhEX1RfQ09ERV9PSyh2YWwpICAgICAgKHwodmFsICYgVFhEX1RfQ09ERSkpCisjZGVmaW5lIEdFVF9UWERfVF9DT0RFKHZhbCkgICAgICgodmFsICYgVFhEX1RfQ09ERSk8PDEyKQorI2RlZmluZSBUWERfR0FUSEVSX0NPREUgICAgICAgICAoQklUKDIyKSB8IEJJVCgyMykpCisjZGVmaW5lIFRYRF9HQVRIRVJfQ09ERV9GSVJTVCAgIEJJVCgyMikKKyNkZWZpbmUgVFhEX0dBVEhFUl9DT0RFX0xBU1QgICAgQklUKDIzKQorI2RlZmluZSBUWERfVENQX0xTT19FTiAgICAgICAgICBCSVQoMzApCisjZGVmaW5lIFRYRF9VRFBfQ09GX0VOICAgICAgICAgIEJJVCgzMSkKKyNkZWZpbmUgVFhEX1RDUF9MU09fTVNTKHZhbCkgICAgdkJJVCh2YWwsMzQsMTQpCisjZGVmaW5lIFRYRF9CVUZGRVIwX1NJWkUodmFsKSAgIHZCSVQodmFsLDQ4LDE2KQorCisJdTY0IENvbnRyb2xfMjsKKyNkZWZpbmUgVFhEX1RYX0NLT19DT05UUk9MICAgICAgKEJJVCg1KXxCSVQoNil8QklUKDcpKQorI2RlZmluZSBUWERfVFhfQ0tPX0lQVjRfRU4gICAgICBCSVQoNSkKKyNkZWZpbmUgVFhEX1RYX0NLT19UQ1BfRU4gICAgICAgQklUKDYpCisjZGVmaW5lIFRYRF9UWF9DS09fVURQX0VOICAgICAgIEJJVCg3KQorI2RlZmluZSBUWERfVkxBTl9FTkFCTEUgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIFRYRF9WTEFOX1RBRyh2YWwpICAgICAgIHZCSVQodmFsLDE2LDE2KQorI2RlZmluZSBUWERfSU5UX05VTUJFUih2YWwpICAgICB2QklUKHZhbCwzNCw2KQorI2RlZmluZSBUWERfSU5UX1RZUEVfUEVSX0xJU1QgICBCSVQoNDcpCisjZGVmaW5lIFRYRF9JTlRfVFlQRV9VVElMWiAgICAgIEJJVCg0NikKKyNkZWZpbmUgVFhEX1NFVF9NQVJLRVIgICAgICAgICB2QklUKDB4NiwwLDQpCisKKwl1NjQgQnVmZmVyX1BvaW50ZXI7CisJdTY0IEhvc3RfQ29udHJvbDsJLyogcmVzZXJ2ZWQgZm9yIGhvc3QgKi8KK30gVHhEX3Q7CisKKy8qIFN0cnVjdHVyZSB0byBob2xkIHRoZSBwaHkgYW5kIHZpcnQgYWRkciBvZiBldmVyeSBUeERMLiAqLwordHlwZWRlZiBzdHJ1Y3QgbGlzdF9pbmZvX2hvbGQgeworCWRtYV9hZGRyX3QgbGlzdF9waHlfYWRkcjsKKwl2b2lkICpsaXN0X3ZpcnRfYWRkcjsKK30gbGlzdF9pbmZvX2hvbGRfdDsKKworLyogUnggZGVzY3JpcHRvciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IF9SeERfdCB7CisJdTY0IEhvc3RfQ29udHJvbDsJLyogcmVzZXJ2ZWQgZm9yIGhvc3QgKi8KKwl1NjQgQ29udHJvbF8xOworI2RlZmluZSBSWERfT1dOX1hFTkEgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgUlhEX1RfQ09ERSAgICAgICAgICAgICAgKEJJVCgxMil8QklUKDEzKXxCSVQoMTQpfEJJVCgxNSkpCisjZGVmaW5lIFJYRF9GUkFNRV9QUk9UTyAgICAgICAgIHZCSVQoMHhGRkZGLDI0LDgpCisjZGVmaW5lIFJYRF9GUkFNRV9QUk9UT19JUFY0ICAgIEJJVCgyNykKKyNkZWZpbmUgUlhEX0ZSQU1FX1BST1RPX0lQVjYgICAgQklUKDI4KQorI2RlZmluZSBSWERfRlJBTUVfUFJPVE9fVENQICAgICBCSVQoMzApCisjZGVmaW5lIFJYRF9GUkFNRV9QUk9UT19VRFAgICAgIEJJVCgzMSkKKyNkZWZpbmUgVENQX09SX1VEUF9GUkFNRSAgICAgICAgKFJYRF9GUkFNRV9QUk9UT19UQ1AgfCBSWERfRlJBTUVfUFJPVE9fVURQKQorI2RlZmluZSBSWERfR0VUX0wzX0NLU1VNKHZhbCkgICAoKHUxNikodmFsPj4gMTYpICYgMHhGRkZGKQorI2RlZmluZSBSWERfR0VUX0w0X0NLU1VNKHZhbCkgICAoKHUxNikodmFsKSAmIDB4RkZGRikKKworCXU2NCBDb250cm9sXzI7CisjaWZuZGVmIENPTkZJR18yQlVGRl9NT0RFCisjZGVmaW5lIE1BU0tfQlVGRkVSMF9TSVpFICAgICAgIHZCSVQoMHhGRkZGLDAsMTYpCisjZGVmaW5lIFNFVF9CVUZGRVIwX1NJWkUodmFsKSAgIHZCSVQodmFsLDAsMTYpCisjZWxzZQorI2RlZmluZSBNQVNLX0JVRkZFUjBfU0laRSAgICAgICB2QklUKDB4RkYsMCwxNikKKyNkZWZpbmUgTUFTS19CVUZGRVIxX1NJWkUgICAgICAgdkJJVCgweEZGRkYsMTYsMTYpCisjZGVmaW5lIE1BU0tfQlVGRkVSMl9TSVpFICAgICAgIHZCSVQoMHhGRkZGLDMyLDE2KQorI2RlZmluZSBTRVRfQlVGRkVSMF9TSVpFKHZhbCkgICB2QklUKHZhbCw4LDgpCisjZGVmaW5lIFNFVF9CVUZGRVIxX1NJWkUodmFsKSAgIHZCSVQodmFsLDE2LDE2KQorI2RlZmluZSBTRVRfQlVGRkVSMl9TSVpFKHZhbCkgICB2QklUKHZhbCwzMiwxNikKKyNlbmRpZgorCisjZGVmaW5lIE1BU0tfVkxBTl9UQUcgICAgICAgICAgIHZCSVQoMHhGRkZGLDQ4LDE2KQorI2RlZmluZSBTRVRfVkxBTl9UQUcodmFsKSAgICAgICB2QklUKHZhbCw0OCwxNikKKyNkZWZpbmUgU0VUX05VTV9UQUcodmFsKSAgICAgICB2QklUKHZhbCwxNiwzMikKKworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorI2RlZmluZSBSWERfR0VUX0JVRkZFUjBfU0laRShDb250cm9sXzIpICh1NjQpKChDb250cm9sXzIgJiB2QklUKDB4RkZGRiwwLDE2KSkpCisjZWxzZQorI2RlZmluZSBSWERfR0VUX0JVRkZFUjBfU0laRShDb250cm9sXzIpICh1OCkoKENvbnRyb2xfMiAmIE1BU0tfQlVGRkVSMF9TSVpFKSBcCisJCQkJCQkJPj4gNDgpCisjZGVmaW5lIFJYRF9HRVRfQlVGRkVSMV9TSVpFKENvbnRyb2xfMikgKHUxNikoKENvbnRyb2xfMiAmIE1BU0tfQlVGRkVSMV9TSVpFKSBcCisJCQkJCQkJPj4gMzIpCisjZGVmaW5lIFJYRF9HRVRfQlVGRkVSMl9TSVpFKENvbnRyb2xfMikgKHUxNikoKENvbnRyb2xfMiAmIE1BU0tfQlVGRkVSMl9TSVpFKSBcCisJCQkJCQkJPj4gMTYpCisjZGVmaW5lIEJVRjBfTEVOCTQwCisjZGVmaW5lIEJVRjFfTEVOCTEKKyNlbmRpZgorCisJdTY0IEJ1ZmZlcjBfcHRyOworI2lmZGVmIENPTkZJR18yQlVGRl9NT0RFCisJdTY0IEJ1ZmZlcjFfcHRyOworCXU2NCBCdWZmZXIyX3B0cjsKKyNlbmRpZgorfSBSeERfdDsKKworLyogU3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyB0aGUgUnggZGVzY3JpcHRvciBibG9jayB3aGljaCBjb250YWlucyAKKyAqIDEyOCBSeCBkZXNjcmlwdG9ycy4KKyAqLworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQordHlwZWRlZiBzdHJ1Y3QgX1J4RF9ibG9jayB7CisjZGVmaW5lIE1BWF9SWERTX1BFUl9CTE9DSyAgICAgICAgICAgICAxMjcKKwlSeERfdCByeGRbTUFYX1JYRFNfUEVSX0JMT0NLXTsKKworCXU2NCByZXNlcnZlZF8wOworI2RlZmluZSBFTkRfT0ZfQkxPQ0sgICAgMHhGRUZGRkZGRkZGRkZGRkZGVUxMCisJdTY0IHJlc2VydmVkXzE7CQkvKiAweEZFRkZGRkZGRkZGRkZGRkYgdG8gbWFyayBsYXN0IAorCQkJCSAqIFJ4ZCBpbiB0aGlzIGJsayAqLworCXU2NCByZXNlcnZlZF8yX3BOZXh0X1J4RF9ibG9jazsJLyogTG9naWNhbCBwdHIgdG8gbmV4dCAqLworCXU2NCBwTmV4dF9SeERfQmxrX3BoeXNpY2FsOwkvKiBCdWZmMF9wdHIuSW4gYSAzMiBiaXQgYXJjaAorCQkJCQkgKiB0aGUgdXBwZXIgMzIgYml0cyBzaG91bGQgCisJCQkJCSAqIGJlIDAgKi8KK30gUnhEX2Jsb2NrX3Q7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgX1J4RF9ibG9jayB7CisjZGVmaW5lIE1BWF9SWERTX1BFUl9CTE9DSyAgICAgICAgICAgICA4NQorCVJ4RF90IHJ4ZFtNQVhfUlhEU19QRVJfQkxPQ0tdOworCisjZGVmaW5lIEVORF9PRl9CTE9DSyAgICAweEZFRkZGRkZGRkZGRkZGRkZVTEwKKwl1NjQgcmVzZXJ2ZWRfMTsJCS8qIDB4RkVGRkZGRkZGRkZGRkZGRiB0byBtYXJrIGxhc3QgUnhkIAorCQkJCSAqIGluIHRoaXMgYmxrICovCisJdTY0IHBOZXh0X1J4RF9CbGtfcGh5c2ljYWw7CS8qIFBoeSBwb250ZXIgdG8gbmV4dCBibGsuICovCit9IFJ4RF9ibG9ja190OworI2RlZmluZSBTSVpFX09GX0JMT0NLCTQwOTYKKworLyogU3RydWN0dXJlIHRvIGhvbGQgdmlydHVhbCBhZGRyZXNzZXMgb2YgQnVmMCBhbmQgQnVmMSBpbiAKKyAqIDJidWYgbW9kZS4gKi8KK3R5cGVkZWYgc3RydWN0IGJ1ZkFkZCB7CisJdm9pZCAqYmFfMF9vcmc7CisJdm9pZCAqYmFfMV9vcmc7CisJdm9pZCAqYmFfMDsKKwl2b2lkICpiYV8xOworfSBidWZmQWRkX3Q7CisjZW5kaWYKKworLyogU3RydWN0dXJlIHdoaWNoIHN0b3JlcyBhbGwgdGhlIE1BQyBjb250cm9sIHBhcmFtZXRlcnMgKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBvZmZzZXQgb2YgdGhlIFJ4RCBpbiB0aGUgcmluZyAKKyAqIGZyb20gd2hpY2ggdGhlIFJ4IEludGVycnVwdCBwcm9jZXNzb3IgY2FuIHN0YXJ0IHBpY2tpbmcgCisgKiB1cCB0aGUgUnhEcyBmb3IgcHJvY2Vzc2luZy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3J4X2N1cnJfZ2V0X2luZm9fdCB7CisJdTMyIGJsb2NrX2luZGV4OworCXUzMiBvZmZzZXQ7CisJdTMyIHJpbmdfbGVuOworfSByeF9jdXJyX2dldF9pbmZvX3Q7CisKK3R5cGVkZWYgcnhfY3Vycl9nZXRfaW5mb190IHJ4X2N1cnJfcHV0X2luZm9fdDsKKworLyogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBvZmZzZXQgb2YgdGhlIFR4RGwgaW4gdGhlIEZJRk8KKyAqIGZyb20gd2hpY2ggdGhlIFR4IEludGVycnVwdCBwcm9jZXNzb3IgY2FuIHN0YXJ0IHBpY2tpbmcgCisgKiB1cCB0aGUgVHhETHMgZm9yIHNlbmQgY29tcGxldGUgaW50ZXJydXB0IHByb2Nlc3NpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgb2Zmc2V0OworCXUzMiBmaWZvX2xlbjsKK30gdHhfY3Vycl9nZXRfaW5mb190OworCit0eXBlZGVmIHR4X2N1cnJfZ2V0X2luZm9fdCB0eF9jdXJyX3B1dF9pbmZvX3Q7CisKKy8qIEluZm9tYXRpb24gcmVsYXRlZCB0byB0aGUgVHggYW5kIFJ4IEZJRk9zIGFuZCBSaW5ncyBvZiBYZW5hCisgKiBpcyBtYWludGFpbmVkIGluIHRoaXMgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtYWNfaW5mbyB7CisvKiByeCBzaWRlIHN0dWZmICovCisJLyogUHV0IHBvaW50ZXIgaW5mbyB3aGljaCBpbmRpY3RlcyB3aGljaCBSeEQgaGFzIHRvIGJlIHJlcGxlbmlzaGVkIAorCSAqIHdpdGggYSBuZXcgYnVmZmVyLgorCSAqLworCXJ4X2N1cnJfcHV0X2luZm9fdCByeF9jdXJyX3B1dF9pbmZvW01BWF9SWF9SSU5HU107CisKKwkvKiBHZXQgcG9pbnRlciBpbmZvIHdoaWNoIGluZGljdGVzIHdoaWNoIGlzIHRoZSBsYXN0IFJ4RCB0aGF0IHdhcyAKKwkgKiBwcm9jZXNzZWQgYnkgdGhlIGRyaXZlci4KKwkgKi8KKwlyeF9jdXJyX2dldF9pbmZvX3QgcnhfY3Vycl9nZXRfaW5mb1tNQVhfUlhfUklOR1NdOworCisJdTE2IHJtYWNfcGF1c2VfdGltZTsKKwl1MTYgbWNfcGF1c2VfdGhyZXNob2xkX3EwcTM7CisJdTE2IG1jX3BhdXNlX3RocmVzaG9sZF9xNHE3OworCisvKiB0eCBzaWRlIHN0dWZmICovCisJLyogbG9naWNhbCBwb2ludGVyIG9mIHN0YXJ0IG9mIGVhY2ggVHggRklGTyAqLworCVR4RklGT19lbGVtZW50X3QgX19pb21lbSAqdHhfRklGT19zdGFydFtNQVhfVFhfRklGT1NdOworCisvKiBDdXJyZW50IG9mZnNldCB3aXRoaW4gdHhfRklGT19zdGFydCwgd2hlcmUgZHJpdmVyIHdvdWxkIHdyaXRlIG5ldyBUeCBmcmFtZSovCisJdHhfY3Vycl9wdXRfaW5mb190IHR4X2N1cnJfcHV0X2luZm9bTUFYX1RYX0ZJRk9TXTsKKwl0eF9jdXJyX2dldF9pbmZvX3QgdHhfY3Vycl9nZXRfaW5mb1tNQVhfVFhfRklGT1NdOworCisJdm9pZCAqc3RhdHNfbWVtOwkvKiBvcmlnbmFsIHBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbSAqLworCWRtYV9hZGRyX3Qgc3RhdHNfbWVtX3BoeTsJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc3RhdCBibG9jayAqLworCXUzMiBzdGF0c19tZW1fc3o7CisJU3RhdEluZm9fdCAqc3RhdHNfaW5mbzsJLyogTG9naWNhbCBhZGRyZXNzIG9mIHRoZSBzdGF0IGJsb2NrICovCit9IG1hY19pbmZvX3Q7CisKKy8qIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHVzZXIgZGVmaW5lZCBNQUMgYWRkcmVzc2VzICovCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciBhZGRyW0VUSF9BTEVOXTsKKwlpbnQgdXNhZ2VfY250OworfSB1c3JfYWRkcl90OworCisvKiBTdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgUGh5IGFuZCB2aXJ0IGFkZHJlc3NlcyBvZiB0aGUgQmxvY2tzICovCit0eXBlZGVmIHN0cnVjdCByeF9ibG9ja19pbmZvIHsKKwlSeERfdCAqYmxvY2tfdmlydF9hZGRyOworCWRtYV9hZGRyX3QgYmxvY2tfZG1hX2FkZHI7Cit9IHJ4X2Jsb2NrX2luZm9fdDsKKworLyogRGVmYXVsdCBUdW5hYmxlIHBhcmFtZXRlcnMgb2YgdGhlIE5JQy4gKi8KKyNkZWZpbmUgREVGQVVMVF9GSUZPX0xFTiA0MDk2CisjZGVmaW5lIFNNQUxMX1JYRF9DTlQJMzAgKiAoTUFYX1JYRFNfUEVSX0JMT0NLKzEpCisjZGVmaW5lIExBUkdFX1JYRF9DTlQJMTAwICogKE1BWF9SWERTX1BFUl9CTE9DSysxKQorI2RlZmluZSBTTUFMTF9CTEtfQ05UCTMwCisjZGVmaW5lIExBUkdFX0JMS19DTlQJMTAwCisKKy8qIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgb25lIGluc3RhbmNlIG9mIHRoZSBOSUMgKi8KK3R5cGVkZWYgc3RydWN0IHMyaW9fbmljIHsKKyNkZWZpbmUgTUFYX01BQ19TVVBQT1JURUQgICAxNgorI2RlZmluZSBNQVhfU1VQUE9SVEVEX01VTFRJQ0FTVFMgTUFYX01BQ19TVVBQT1JURUQKKworCW1hY2FkZHJfdCBkZWZfbWFjX2FkZHJbTUFYX01BQ19TVVBQT1JURURdOworCW1hY2FkZHJfdCBwcmVfbWFjX2FkZHJbTUFYX01BQ19TVVBQT1JURURdOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdm9pZCBfX2lvbWVtICpiYXIwOworCXZvaWQgX19pb21lbSAqYmFyMTsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtIGNvbmZpZzsKKwltYWNfaW5mb190IG1hY19jb250cm9sOworCWludCBoaWdoX2RtYV9mbGFnOworCWludCBkZXZpY2VfY2xvc2VfZmxhZzsKKwlpbnQgZGV2aWNlX2VuYWJsZWRfb25jZTsKKworCWNoYXIgbmFtZVszMl07CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2s7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0YXNrbGV0X3N0YXR1czsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJdTE2IHZlbmRvcl9pZDsKKwl1MTYgZGV2aWNlX2lkOworCXUxNiBjY21kOworCXUzMiBjYmFyMF8xOworCXUzMiBjYmFyMF8yOworCXUzMiBjYmFyMV8xOworCXUzMiBjYmFyMV8yOworCXUzMiBjaXJxOworCXU4IGNhY2hlX2xpbmU7CisJdTMyIHJvbV9leHBhbnNpb247CisJdTE2IHBjaXhfY21kOworCXUzMiBpcnE7CisJYXRvbWljX3QgcnhfYnVmc19sZWZ0W01BWF9SWF9SSU5HU107CisKKwlzcGlubG9ja190IHR4X2xvY2s7CisjaWZuZGVmIENPTkZJR19TMklPX05BUEkKKwlzcGlubG9ja190IHB1dF9sb2NrOworI2VuZGlmCisKKyNkZWZpbmUgUFJPTUlTQyAgICAgMQorI2RlZmluZSBBTExfTVVMVEkgICAyCisKKyNkZWZpbmUgTUFYX0FERFJTX1NVUFBPUlRFRCA2NAorCXUxNiB1c3JfYWRkcl9jb3VudDsKKwl1MTYgbWNfYWRkcl9jb3VudDsKKwl1c3JfYWRkcl90IHVzcl9hZGRyc1tNQVhfQUREUlNfU1VQUE9SVEVEXTsKKworCXUxNiBtX2Nhc3RfZmxnOworCXUxNiBhbGxfbXVsdGlfcG9zOworCXUxNiBwcm9taXNjX2ZsZzsKKworCXUxNiB0eF9wa3RfY291bnQ7CisJdTE2IHJ4X3BrdF9jb3VudDsKKwl1MTYgdHhfZXJyX2NvdW50OworCXUxNiByeF9lcnJfY291bnQ7CisKKyNpZm5kZWYgQ09ORklHX1MySU9fTkFQSQorCS8qIEluZGV4IHRvIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgcHV0IHBvaW50ZXIgb2YgUnggcmluZy4gKi8KKwlpbnQgcHV0X3Bvc1tNQVhfUlhfUklOR1NdOworI2VuZGlmCisKKwkvKgorCSAqICBQbGFjZSBob2xkZXJzIGZvciB0aGUgdmlydHVhbCBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzIG9mIAorCSAqICBhbGwgdGhlIFJ4IEJsb2NrcworCSAqLworCXJ4X2Jsb2NrX2luZm9fdCByeF9ibG9ja3NbTUFYX1JYX1JJTkdTXVtNQVhfUlhfQkxPQ0tTX1BFUl9SSU5HXTsKKwlpbnQgYmxvY2tfY291bnRbTUFYX1JYX1JJTkdTXTsKKwlpbnQgcGt0X2NudFtNQVhfUlhfUklOR1NdOworCisJLyogUGxhY2UgaG9sZGVyIG9mIGFsbCB0aGUgVFggTGlzdCdzIFBoeSBhbmQgVmlydCBhZGRyZXNzZXMuICovCisJbGlzdF9pbmZvX2hvbGRfdCAqbGlzdF9pbmZvW01BWF9UWF9GSUZPU107CisKKwkvKiAgSWQgdGltZXIsIHVzZWQgdG8gYmxpbmsgTklDIHRvIHBoeXNpY2FsbHkgaWRlbnRpZnkgTklDLiAqLworCXN0cnVjdCB0aW1lcl9saXN0IGlkX3RpbWVyOworCisJLyogIFJlc3RhcnQgdGltZXIsIHVzZWQgdG8gcmVzdGFydCBOSUMgaWYgdGhlIGRldmljZSBpcyBzdHVjayBhbmQKKwkgKiAgYSBzY2hlZHVsZSB0YXNrIHRoYXQgd2lsbCBzZXQgdGhlIGNvcnJlY3QgTGluayBzdGF0ZSBvbmNlIHRoZSAKKwkgKiAgTklDJ3MgUEhZIGhhcyBzdGFiaWxpemVkIGFmdGVyIGEgc3RhdGUgY2hhbmdlLgorCSAqLworI2lmZGVmIElOSVRfVFFVRVVFCisJc3RydWN0IHRxX3N0cnVjdCByc3RfdGltZXJfdGFzazsKKwlzdHJ1Y3QgdHFfc3RydWN0IHNldF9saW5rX3Rhc2s7CisjZWxzZQorCXN0cnVjdCB3b3JrX3N0cnVjdCByc3RfdGltZXJfdGFzazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2V0X2xpbmtfdGFzazsKKyNlbmRpZgorCisJLyogRmxhZyB0aGF0IGNhbiBiZSB1c2VkIHRvIHR1cm4gb24gb3IgdHVybiBvZmYgdGhlIFJ4IGNoZWNrc3VtIAorCSAqIG9mZmxvYWQgZmVhdHVyZS4KKwkgKi8KKwlpbnQgcnhfY3N1bTsKKworCS8qICBhZnRlciBibGluaywgdGhlIGFkYXB0ZXIgbXVzdCBiZSByZXN0b3JlZCB3aXRoIG9yaWdpbmFsIAorCSAqICB2YWx1ZXMuCisJICovCisJdTY0IGFkYXB0X2N0cmxfb3JnOworCisJLyogTGFzdCBrbm93biBsaW5rIHN0YXRlLiAqLworCXUxNiBsYXN0X2xpbmtfc3RhdGU7CisjZGVmaW5lCUxJTktfRE9XTgkxCisjZGVmaW5lCUxJTktfVVAJCTIKKworI2lmZGVmIENPTkZJR18yQlVGRl9NT0RFCisJLyogQnVmZmVyIEFkZHJlc3Mgc3RvcmUuICovCisJYnVmZkFkZF90ICoqYmFbTUFYX1JYX1JJTkdTXTsKKyNlbmRpZgorCWludCB0YXNrX2ZsYWc7CisjZGVmaW5lIENBUkRfRE9XTiAxCisjZGVmaW5lIENBUkRfVVAgMgorCWF0b21pY190IGNhcmRfc3RhdGU7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsaW5rX3N0YXRlOworfSBuaWNfdDsKKworI2RlZmluZSBSRVNFVF9FUlJPUiAxOworI2RlZmluZSBDTURfRVJST1IgICAyOworCisvKiAgT1MgcmVsYXRlZCBzeXN0ZW0gY2FsbHMgKi8KKyNpZm5kZWYgcmVhZHEKK3N0YXRpYyBpbmxpbmUgdTY0IHJlYWRxKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1NjQgcmV0ID0gcmVhZGwoYWRkciArIDQpOworCXJldCA8PD0gMzI7CisJcmV0IHw9IHJlYWRsKGFkZHIpOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisjaWZuZGVmIHdyaXRlcQorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlcSh1NjQgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJd3JpdGVsKCh1MzIpICh2YWwpLCBhZGRyKTsKKwl3cml0ZWwoKHUzMikgKHZhbCA+PiAzMiksIChhZGRyICsgNCkpOworfQorCisvKiBJbiAzMiBiaXQgbW9kZXMsIHNvbWUgcmVnaXN0ZXJzIGhhdmUgdG8gYmUgd3JpdHRlbiBpbiBhIAorICogcGFydGljdWxhciBvcmRlciB0byBleHBlY3QgY29ycmVjdCBoYXJkd2FyZSBvcGVyYXRpb24uIFRoZQorICogbWFjcm8gU1BFQ0lBTF9SRUdfV1JJVEUgaXMgdXNlZCB0byBwZXJmb3JtIHN1Y2ggb3JkZXJlZCAKKyAqIHdyaXRlcy4gRGVmaW5lcyBVRiAoVXBwZXIgRmlyc3QpIGFuZCBMRiAoTG93ZXIgRmlyc3QpIHdpbGwgCisgKiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlcXVpcmVkIHdyaXRlIG9yZGVyLgorICovCisjZGVmaW5lIFVGCTEKKyNkZWZpbmUgTEYJMgorc3RhdGljIGlubGluZSB2b2lkIFNQRUNJQUxfUkVHX1dSSVRFKHU2NCB2YWwsIHZvaWQgX19pb21lbSAqYWRkciwgaW50IG9yZGVyKQoreworCWlmIChvcmRlciA9PSBMRikgeworCQl3cml0ZWwoKHUzMikgKHZhbCksIGFkZHIpOworCQl3cml0ZWwoKHUzMikgKHZhbCA+PiAzMiksIChhZGRyICsgNCkpOworCX0gZWxzZSB7CisJCXdyaXRlbCgodTMyKSAodmFsID4+IDMyKSwgKGFkZHIgKyA0KSk7CisJCXdyaXRlbCgodTMyKSAodmFsKSwgYWRkcik7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgU1BFQ0lBTF9SRUdfV1JJVEUodmFsLCBhZGRyLCBkdW1teSkgd3JpdGVxKHZhbCwgYWRkcikKKyNlbmRpZgorCisvKiAgSW50ZXJydXB0IHJlbGF0ZWQgdmFsdWVzIG9mIFhlbmEgKi8KKworI2RlZmluZSBFTkFCTEVfSU5UUlMgICAgMQorI2RlZmluZSBESVNBQkxFX0lOVFJTICAgMgorCisvKiAgSGlnaGVzdCBsZXZlbCBpbnRlcnJ1cHQgYmxvY2tzICovCisjZGVmaW5lIFRYX1BJQ19JTlRSICAgICAoMHgwMDAxPDwwKQorI2RlZmluZSBUWF9ETUFfSU5UUiAgICAgKDB4MDAwMTw8MSkKKyNkZWZpbmUgVFhfTUFDX0lOVFIgICAgICgweDAwMDE8PDIpCisjZGVmaW5lIFRYX1hHWFNfSU5UUiAgICAoMHgwMDAxPDwzKQorI2RlZmluZSBUWF9UUkFGRklDX0lOVFIgKDB4MDAwMTw8NCkKKyNkZWZpbmUgUlhfUElDX0lOVFIgICAgICgweDAwMDE8PDUpCisjZGVmaW5lIFJYX0RNQV9JTlRSICAgICAoMHgwMDAxPDw2KQorI2RlZmluZSBSWF9NQUNfSU5UUiAgICAgKDB4MDAwMTw8NykKKyNkZWZpbmUgUlhfWEdYU19JTlRSICAgICgweDAwMDE8PDgpCisjZGVmaW5lIFJYX1RSQUZGSUNfSU5UUiAoMHgwMDAxPDw5KQorI2RlZmluZSBNQ19JTlRSICAgICAgICAgKDB4MDAwMTw8MTApCisjZGVmaW5lIEVOQV9BTExfSU5UUlMgICAgKCAgIFRYX1BJQ19JTlRSICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWF9ETUFfSU5UUiAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfTUFDX0lOVFIgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX1hHWFNfSU5UUiAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWF9UUkFGRklDX0lOVFIgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlhfUElDX0lOVFIgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJYX0RNQV9JTlRSICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSWF9NQUNfSU5UUiAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlhfWEdYU19JTlRSICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJYX1RSQUZGSUNfSU5UUiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ19JTlRSICkKKworLyogIEludGVycnVwdCBtYXNrcyBmb3IgdGhlIGdlbmVyYWwgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRElTQUJMRV9BTExfSU5UUlMgICAweEZGRkZGRkZGRkZGRkZGRkZVTEwKKworI2RlZmluZSBUWFBJQ19JTlRfTSAgICAgICAgIEJJVCgwKQorI2RlZmluZSBUWERNQV9JTlRfTSAgICAgICAgIEJJVCgxKQorI2RlZmluZSBUWE1BQ19JTlRfTSAgICAgICAgIEJJVCgyKQorI2RlZmluZSBUWFhHWFNfSU5UX00gICAgICAgIEJJVCgzKQorI2RlZmluZSBUWFRSQUZGSUNfSU5UX00gICAgIEJJVCg4KQorI2RlZmluZSBQSUNfUlhfSU5UX00gICAgICAgIEJJVCgzMikKKyNkZWZpbmUgUlhETUFfSU5UX00gICAgICAgICBCSVQoMzMpCisjZGVmaW5lIFJYTUFDX0lOVF9NICAgICAgICAgQklUKDM0KQorI2RlZmluZSBNQ19JTlRfTSAgICAgICAgICAgIEJJVCgzNSkKKyNkZWZpbmUgUlhYR1hTX0lOVF9NICAgICAgICBCSVQoMzYpCisjZGVmaW5lIFJYVFJBRkZJQ19JTlRfTSAgICAgQklUKDQwKQorCisvKiAgUElDIGxldmVsIEludGVycnVwdHMgVE9ETyovCisKKy8qICBETUEgbGV2ZWwgSW5yZXNzdXB0cyAqLworI2RlZmluZSBUWERNQV9QRkNfSU5UX00gICAgIEJJVCgwKQorI2RlZmluZSBUWERNQV9QQ0NfSU5UX00gICAgIEJJVCgyKQorCisvKiAgUEZDIGJsb2NrIGludGVycnVwdHMgKi8KKyNkZWZpbmUgUEZDX01JU0NfRVJSXzEgICAgICBCSVQoMCkJLyogSW50ZXJydXB0IHRvIGluZGljYXRlIEZJRk8gZnVsbCAqLworCisvKiBQQ0MgYmxvY2sgaW50ZXJydXB0cy4gKi8KKyNkZWZpbmUJUENDX0ZCX0VDQ19FUlIJICAgdkJJVCgweGZmLCAxNiwgOCkJLyogSW50ZXJydXB0IHRvIGluZGljYXRlCisJCQkJCQkgICBQQ0NfRkJfRUNDIEVycm9yLiAqLworCisvKgorICogUHJvdG90eXBlIGRlY2xhcmF0aW9uLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzMmlvX2luaXRfbmljKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwcmUpOworc3RhdGljIHZvaWQgX19kZXZleGl0IHMyaW9fcmVtX25pYyhzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitzdGF0aWMgaW50IGluaXRfc2hhcmVkX21lbShzdHJ1Y3QgczJpb19uaWMgKnNwKTsKK3N0YXRpYyB2b2lkIGZyZWVfc2hhcmVkX21lbShzdHJ1Y3QgczJpb19uaWMgKnNwKTsKK3N0YXRpYyBpbnQgaW5pdF9uaWMoc3RydWN0IHMyaW9fbmljICpuaWMpOworI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCitzdGF0aWMgdm9pZCByeF9pbnRyX2hhbmRsZXIoc3RydWN0IHMyaW9fbmljICpzcCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHR4X2ludHJfaGFuZGxlcihzdHJ1Y3QgczJpb19uaWMgKnNwKTsKK3N0YXRpYyB2b2lkIGFsYXJtX2ludHJfaGFuZGxlcihzdHJ1Y3QgczJpb19uaWMgKnNwKTsKKworc3RhdGljIGludCBzMmlvX3N0YXJ0ZXIodm9pZCk7CitzdGF0aWMgdm9pZCBzMmlvX2Nsb3Nlcih2b2lkKTsKK3N0YXRpYyB2b2lkIHMyaW9fdHhfd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzMmlvX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkZXZfYWRkcik7CitzdGF0aWMgdm9pZCBzMmlvX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjaWZuZGVmIENPTkZJR18yQlVGRl9NT0RFCitzdGF0aWMgaW50IHJ4X29zbV9oYW5kbGVyKG5pY190ICogc3AsIHUxNiBsZW4sIFJ4RF90ICogcnhkcCwgaW50IHJpbmdfbm8pOworI2Vsc2UKK3N0YXRpYyBpbnQgcnhfb3NtX2hhbmRsZXIobmljX3QgKiBzcCwgUnhEX3QgKiByeGRwLCBpbnQgcmluZ19ubywKKwkJCSAgYnVmZkFkZF90ICogYmEpOworI2VuZGlmCitzdGF0aWMgdm9pZCBzMmlvX2xpbmsobmljX3QgKiBzcCwgaW50IGxpbmspOworc3RhdGljIHZvaWQgczJpb19yZXNldChuaWNfdCAqIHNwKTsKKyNpZmRlZiBDT05GSUdfUzJJT19OQVBJCitzdGF0aWMgaW50IHMyaW9fcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHMyaW9faW5pdF9wY2kobmljX3QgKiBzcCk7CitzdGF0aWMgaW50IHMyaW9fc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICogYWRkcik7CitzdGF0aWMgaXJxcmV0dXJuX3QgczJpb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IHZlcmlmeV94ZW5hX3F1aWVzY2VuY2UodTY0IHZhbDY0LCBpbnQgZmxhZyk7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKK3N0YXRpYyB2b2lkIHMyaW9fc2V0X2xpbmsodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyBpbnQgczJpb19zZXRfc3dhcHBlcihuaWNfdCAqIHNwKTsKK3N0YXRpYyB2b2lkIHMyaW9fY2FyZF9kb3duKG5pY190ICogbmljKTsKK3N0YXRpYyBpbnQgczJpb19jYXJkX3VwKG5pY190ICogbmljKTsKKworI2VuZGlmCQkJCS8qIF9TMklPX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NhYTk3MzAuYyBiL2RyaXZlcnMvbmV0L3NhYTk3MzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDAxNjcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2FhOTczMC5jCkBAIC0wLDAgKzEsMTE4NCBAQAorLyoKKyAqIENhcnN0ZW4gTGFuZ2dhYXJkLCBjYXJzdGVubEBtaXBzLmNvbQorICogQ29weXJpZ2h0IChDKSAyMDAwIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICoKKyAqIFNBQTk3MzAgZXRoZXJuZXQgZHJpdmVyLgorICoKKyAqIENoYW5nZXM6CisgKiBBbmdlbG8gRGVsbCdBZXJhIDxidWZmZXJAYW50aWZvcmsub3JnPiA6IENvbnZlcnNpb24gdG8gdGhlIG5ldyBQQ0kgQVBJIChwY2lfZHJpdmVyKS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbiB0byBzcGlubG9ja3MuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yIGhhbmRsaW5nIGZpeGVzLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvcHJvbS5oPgorCisjaW5jbHVkZSAic2FhOTczMC5oIgorCisjaWZkZWYgTEFOX1NBQTk3MzBfREVCVUcKK2ludCBsYW5fc2FhOTczMF9kZWJ1ZyA9IExBTl9TQUE5NzMwX0RFQlVHOworI2Vsc2UKK2ludCBsYW5fc2FhOTczMF9kZWJ1ZzsKKyNlbmRpZgorCisjZGVmaW5lIERSVl9NT0RVTEVfTkFNRSAic2FhOTczMCIKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNhYTk3MzBfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9QSElMSVBTLCBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBOTM3MCwKKyAgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzYWE5NzMwX3BjaV90YmwpOworCisvKiBOb24temVybyBvbmx5IGlmIHRoZSBjdXJyZW50IGNhcmQgaXMgYSBQQ0kgd2l0aCBCSU9TLXNldCBJUlEuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBjaV9pcnFfbGluZTsKKworI2RlZmluZSBJTkwoYSkgICAgIGlubCgodW5zaWduZWQgbG9uZylhKQorI2RlZmluZSBPVVRMKHgsYSkgIG91dGwoeCwodW5zaWduZWQgbG9uZylhKQorCitzdGF0aWMgdm9pZCBldm1fc2FhOTczMF9lbmFibGVfbGFuX2ludChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJT1VUTChJTkwoJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRCbG9jazEpIHwgRVZNX0xBTl9JTlQsCisJICAgICAmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEJsb2NrMSk7CisJT1VUTChJTkwoJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRTdGF0dXMxKSB8IEVWTV9MQU5fSU5ULAorCSAgICAgJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRTdGF0dXMxKTsKKwlPVVRMKElOTCgmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEVuYWJsZTEpIHwgRVZNX0xBTl9JTlQgfAorCSAgICAgRVZNX01BU1RFUl9FTiwgJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRFbmFibGUxKTsKK30KK3N0YXRpYyB2b2lkIGV2bV9zYWE5NzMwX2Rpc2FibGVfbGFuX2ludChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJT1VUTChJTkwoJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRCbG9jazEpICYgfkVWTV9MQU5fSU5ULAorCSAgICAgJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRCbG9jazEpOworCU9VVEwoSU5MKCZscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0RW5hYmxlMSkgJiB+RVZNX0xBTl9JTlQsCisJICAgICAmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEVuYWJsZTEpOworfQorCitzdGF0aWMgdm9pZCBldm1fc2FhOTczMF9jbGVhcl9sYW5faW50KHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCkKK3sKKwlPVVRMKEVWTV9MQU5fSU5ULCAmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdFN0YXR1czEpOworfQorCitzdGF0aWMgdm9pZCBldm1fc2FhOTczMF9ibG9ja19sYW5faW50KHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCkKK3sKKwlPVVRMKElOTCgmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEJsb2NrMSkgJiB+RVZNX0xBTl9JTlQsCisJICAgICAmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEJsb2NrMSk7Cit9CisKK3N0YXRpYyB2b2lkIGV2bV9zYWE5NzMwX3VuYmxvY2tfbGFuX2ludChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJT1VUTChJTkwoJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRCbG9jazEpIHwgRVZNX0xBTl9JTlQsCisJICAgICAmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEJsb2NrMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfc2FhOTczMF9yZWdzKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCkKK3sKKwlpbnQgaSwgajsKKwlwcmludGsoIlR4bUJ1ZmZlckEgPSAleFxuIiwgbHAtPlR4bUJ1ZmZlclswXVswXSk7CisJcHJpbnRrKCJUeG1CdWZmZXJCID0gJXhcbiIsIGxwLT5UeG1CdWZmZXJbMV1bMF0pOworCXByaW50aygiUmN2QnVmZmVyQSA9ICV4XG4iLCBscC0+UmN2QnVmZmVyWzBdWzBdKTsKKwlwcmludGsoIlJjdkJ1ZmZlckIgPSAleFxuIiwgbHAtPlJjdkJ1ZmZlclsxXVswXSk7CisJZm9yIChpID0gMDsgaSA8IExBTl9TQUE5NzMwX0JVRkZFUlM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgTEFOX1NBQTk3MzBfVFhNX1FfU0laRTsgaisrKSB7CisJCQlwcmludGsoIlR4bUJ1ZmZlclslZF1bJWRdID0gJXhcbiIsIGksIGosCisJCQkgICAgICAgbGUzMl90b19jcHUoKih1bnNpZ25lZCBpbnQgKikKKwkJCQkJICAgbHAtPlR4bUJ1ZmZlcltpXVtqXSkpOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBMQU5fU0FBOTczMF9CVUZGRVJTOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IExBTl9TQUE5NzMwX1JDVl9RX1NJWkU7IGorKykgeworCQkJcHJpbnRrKCJSY3ZCdWZmZXJbJWRdWyVkXSA9ICV4XG4iLCBpLCBqLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KCoodW5zaWduZWQgaW50ICopCisJCQkJCSAgIGxwLT5SY3ZCdWZmZXJbaV1bal0pKTsKKwkJfQorCX0KKwlwcmludGsoImxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRCbG9jazEgPSAleFxuIiwKKwkgICAgICAgSU5MKCZscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0QmxvY2sxKSk7CisJcHJpbnRrKCJscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0U3RhdHVzMSA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRTdGF0dXMxKSk7CisJcHJpbnRrKCJscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0RW5hYmxlMSA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRFbmFibGUxKSk7CisJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+T2syVXNlID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk9rMlVzZSkpOworCXByaW50aygibHAtPk5leHRUeG1CdWZmZXJJbmRleCA9ICV4XG4iLCBscC0+TmV4dFR4bUJ1ZmZlckluZGV4KTsKKwlwcmludGsoImxwLT5OZXh0VHhtUGFja2V0SW5kZXggPSAleFxuIiwgbHAtPk5leHRUeG1QYWNrZXRJbmRleCk7CisJcHJpbnRrKCJscC0+UGVuZGluZ1R4bUJ1ZmZlckluZGV4ID0gJXhcbiIsCisJICAgICAgIGxwLT5QZW5kaW5nVHhtQnVmZmVySW5kZXgpOworCXByaW50aygibHAtPlBlbmRpbmdUeG1QYWNrZXRJbmRleCA9ICV4XG4iLAorCSAgICAgICBscC0+UGVuZGluZ1R4bVBhY2tldEluZGV4KTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5MYW5EbWFDdGwgPSAleFxuIiwKKwkgICAgICAgSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+TGFuRG1hQ3RsKSk7CisJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+RG1hU3RhdHVzID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRtYVN0YXR1cykpOworCXByaW50aygibHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkNhbUN0bCA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5DYW1DdGwpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5UeEN0bCA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5UeEN0bCkpOworCXByaW50aygibHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlR4U3RhdHVzID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlR4U3RhdHVzKSk7CisJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+UnhDdGwgPSAleFxuIiwKKwkgICAgICAgSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+UnhDdGwpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5SeFN0YXR1cyA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5SeFN0YXR1cykpOworCWZvciAoaSA9IDA7IGkgPCBMQU5fU0FBOTczMF9DQU1fRFdPUkRTOyBpKyspIHsKKwkJT1VUTChpLCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkNhbUFkZHJlc3MpOworCQlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5DYW1EYXRhID0gJXhcbiIsCisJCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5DYW1EYXRhKSk7CisJfQorCXByaW50aygibHAtPnN0YXRzLnR4X3BhY2tldHMgPSAlbHhcbiIsIGxwLT5zdGF0cy50eF9wYWNrZXRzKTsKKwlwcmludGsoImxwLT5zdGF0cy50eF9lcnJvcnMgPSAlbHhcbiIsIGxwLT5zdGF0cy50eF9lcnJvcnMpOworCXByaW50aygibHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gJWx4XG4iLAorCSAgICAgICBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMpOworCXByaW50aygibHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMgPSAlbHhcbiIsCisJICAgICAgIGxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKTsKKwlwcmludGsoImxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyA9ICVseFxuIiwKKwkgICAgICAgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKTsKKwlwcmludGsoImxwLT5zdGF0cy50eF9maWZvX2Vycm9ycyA9ICVseFxuIiwKKwkgICAgICAgbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKTsKKwlwcmludGsoImxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzID0gJWx4XG4iLAorCSAgICAgICBscC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycyk7CisJcHJpbnRrKCJscC0+c3RhdHMuY29sbGlzaW9ucyA9ICVseFxuIiwgbHAtPnN0YXRzLmNvbGxpc2lvbnMpOworCisJcHJpbnRrKCJscC0+c3RhdHMucnhfcGFja2V0cyA9ICVseFxuIiwgbHAtPnN0YXRzLnJ4X3BhY2tldHMpOworCXByaW50aygibHAtPnN0YXRzLnJ4X2Vycm9ycyA9ICVseFxuIiwgbHAtPnN0YXRzLnJ4X2Vycm9ycyk7CisJcHJpbnRrKCJscC0+c3RhdHMucnhfZHJvcHBlZCA9ICVseFxuIiwgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQpOworCXByaW50aygibHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSAlbHhcbiIsIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKTsKKwlwcmludGsoImxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSAlbHhcbiIsCisJICAgICAgIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMpOworCXByaW50aygibHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gJWx4XG4iLAorCSAgICAgICBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMpOworCXByaW50aygibHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPSAlbHhcbiIsCisJICAgICAgIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKTsKKworCXByaW50aygibHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRlYnVnUENJTWFzdGVyQWRkciA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z1BDSU1hc3RlckFkZHIpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhblR4U3RhdGVNYWNoaW5lID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRlYnVnTGFuVHhTdGF0ZU1hY2hpbmUpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhblJ4U3RhdGVNYWNoaW5lID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRlYnVnTGFuUnhTdGF0ZU1hY2hpbmUpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhblR4Rmlmb1BvaW50ZXJzID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRlYnVnTGFuVHhGaWZvUG9pbnRlcnMpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhblJ4Rmlmb1BvaW50ZXJzID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRlYnVnTGFuUnhGaWZvUG9pbnRlcnMpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhbkN0bFN0YXRlTWFjaGluZSA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhbkN0bFN0YXRlTWFjaGluZSkpOworfQorCitzdGF0aWMgdm9pZCBsYW5fc2FhOTczMF9idWZmZXJfaW5pdChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJaW50IGksIGo7CisKKwkvKiBJbml0IFJYIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTEFOX1NBQTk3MzBfQlVGRkVSUzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBMQU5fU0FBOTczMF9SQ1ZfUV9TSVpFOyBqKyspIHsKKwkJCSoodW5zaWduZWQgaW50ICopIGxwLT5SY3ZCdWZmZXJbaV1bal0gPQorCQkJICAgIGNwdV90b19sZTMyKFJYU0ZfUkVBRFkgPDwKKwkJCQkJUlhfU1RBVF9DVExfT1dORVJfU0hGKTsKKwkJfQorCX0KKworCS8qIEluaXQgVFggYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBMQU5fU0FBOTczMF9CVUZGRVJTOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IExBTl9TQUE5NzMwX1RYTV9RX1NJWkU7IGorKykgeworCQkJKih1bnNpZ25lZCBpbnQgKikgbHAtPlR4bUJ1ZmZlcltpXVtqXSA9CisJCQkgICAgY3B1X3RvX2xlMzIoVFhTRl9FTVBUWSA8PAorCQkJCQlUWF9TVEFUX0NUTF9PV05FUl9TSEYpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX2FsbG9jYXRlX2J1ZmZlcnMoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwKQoreworCXVuc2lnbmVkIGludCBtZW1fc2l6ZTsKKwl2b2lkICpQYTsKKwl1bnNpZ25lZCBpbnQgaSwgaiwgUmN2QnVmZmVyU2l6ZSwgVHhtQnVmZmVyU2l6ZTsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyX3N0YXJ0OworCisJLyogCisJICogQWxsb2NhdGUgYWxsIFJYIGFuZCBUWCBwYWNrZXRzIGluIG9uZSBjaHVuay4gCisJICogVGhlIFJ4IGFuZCBUeCBwYWNrZXRzIG11c3QgYmUgUEFDS0VUX1NJWkUgYWxpZ25lZC4KKwkgKi8KKwltZW1fc2l6ZSA9ICgoTEFOX1NBQTk3MzBfUkNWX1FfU0laRSArIExBTl9TQUE5NzMwX1RYTV9RX1NJWkUpICoKKwkJICAgIExBTl9TQUE5NzMwX1BBQ0tFVF9TSVpFICogTEFOX1NBQTk3MzBfQlVGRkVSUykgKworCSAgICBMQU5fU0FBOTczMF9QQUNLRVRfU0laRTsKKwlidWZmZXJfc3RhcnQgPQorCSAgICAodW5zaWduZWQgaW50KSBrbWFsbG9jKG1lbV9zaXplLCBHRlBfRE1BIHwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWJ1ZmZlcl9zdGFydCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiAKKwkgKiBTZXQgRE1BIGJ1ZmZlciB0byBrc2VnMSAodW5jYWNoZWQpLgorCSAqIE1ha2Ugc3VyZSB0byBmbHVzaCBiZWZvcmUgdXNpbmcgaXQgdW5jYWNoZWQuCisJICovCisJUGEgPSAodm9pZCAqKSBLU0VHMUFERFIoKGJ1ZmZlcl9zdGFydCArIExBTl9TQUE5NzMwX1BBQ0tFVF9TSVpFKSAmCisJCQkJfihMQU5fU0FBOTczMF9QQUNLRVRfU0laRSAtIDEpKTsKKwlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKSBQYSwgbWVtX3NpemUpOworCisJLyogSW5pdGlhbGl6ZSBidWZmZXIgc3BhY2UgKi8KKwlSY3ZCdWZmZXJTaXplID0gTEFOX1NBQTk3MzBfUEFDS0VUX1NJWkU7CisJVHhtQnVmZmVyU2l6ZSA9IExBTl9TQUE5NzMwX1BBQ0tFVF9TSVpFOworCWxwLT5EbWFSY3ZQYWNrZXRzID0gTEFOX1NBQTk3MzBfUkNWX1FfU0laRTsKKwlscC0+RG1hVHhtUGFja2V0cyA9IExBTl9TQUE5NzMwX1RYTV9RX1NJWkU7CisKKwkvKiBJbml0IFJYIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTEFOX1NBQTk3MzBfQlVGRkVSUzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBMQU5fU0FBOTczMF9SQ1ZfUV9TSVpFOyBqKyspIHsKKwkJCSoodW5zaWduZWQgaW50ICopIFBhID0KKwkJCSAgICBjcHVfdG9fbGUzMihSWFNGX1JFQURZIDw8CisJCQkJCVJYX1NUQVRfQ1RMX09XTkVSX1NIRik7CisJCQlscC0+UmN2QnVmZmVyW2ldW2pdID0gKHVuc2lnbmVkIGludCkgUGE7CisJCQlQYSArPSBSY3ZCdWZmZXJTaXplOworCQl9CisJfQorCisJLyogSW5pdCBUWCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IExBTl9TQUE5NzMwX0JVRkZFUlM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgTEFOX1NBQTk3MzBfVFhNX1FfU0laRTsgaisrKSB7CisJCQkqKHVuc2lnbmVkIGludCAqKSBQYSA9CisJCQkgICAgY3B1X3RvX2xlMzIoVFhTRl9FTVBUWSA8PAorCQkJCQlUWF9TVEFUX0NUTF9PV05FUl9TSEYpOworCQkJbHAtPlR4bUJ1ZmZlcltpXVtqXSA9ICh1bnNpZ25lZCBpbnQpIFBhOworCQkJUGEgKz0gVHhtQnVmZmVyU2l6ZTsKKwkJfQorCX0KKworCS8qIAorCSAqIFNldCByeCBidWZmZXIgQSBhbmQgcnggYnVmZmVyIEIgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IHR3byBidWZmZXIgCisJICogc3BhY2VzLgorCSAqLworCU9VVEwoUEhZU0FERFIobHAtPlJjdkJ1ZmZlclswXVswXSksCisJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlJ4QnVmZkEpOworCU9VVEwoUEhZU0FERFIobHAtPlJjdkJ1ZmZlclsxXVswXSksCisJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlJ4QnVmZkIpOworCisJLyogSW5pdGlhbGl6ZSBCdWZmZXIgSW5kZXggKi8KKwlscC0+TmV4dFJjdlBhY2tldEluZGV4ID0gMDsKKwlscC0+TmV4dFJjdlRvVXNlSXNBID0gMTsKKworCS8qIFNldCBjdXJyZW50IGJ1ZmZlciBpbmRleCAmIG5leHQgYXZhaWxibGUgcGFja2V0IGluZGV4ICovCisJbHAtPk5leHRUeG1QYWNrZXRJbmRleCA9IDA7CisJbHAtPk5leHRUeG1CdWZmZXJJbmRleCA9IDA7CisJbHAtPlBlbmRpbmdUeG1QYWNrZXRJbmRleCA9IDA7CisJbHAtPlBlbmRpbmdUeG1CdWZmZXJJbmRleCA9IDA7CisKKwkvKiAKKwkgKiBTZXQgdHhtX2J1Zl9hIGFuZCB0eG1fYnVmX2IgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IHR3byBidWZmZXIKKwkgKiBzcGFjZSAKKwkgKi8KKwlPVVRMKFBIWVNBRERSKGxwLT5UeG1CdWZmZXJbMF1bMF0pLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5UeEJ1ZmZBKTsKKwlPVVRMKFBIWVNBRERSKGxwLT5UeG1CdWZmZXJbMV1bMF0pLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5UeEJ1ZmZCKTsKKworCS8qIFNldCBwYWNrZXQgbnVtYmVyICovCisJT1VUTCgobHAtPkRtYVJjdlBhY2tldHMgPDwgUEtfQ09VTlRfUlhfQV9TSEYpIHwKKwkgICAgIChscC0+RG1hUmN2UGFja2V0cyA8PCBQS19DT1VOVF9SWF9CX1NIRikgfAorCSAgICAgKGxwLT5EbWFUeG1QYWNrZXRzIDw8IFBLX0NPVU5UX1RYX0FfU0hGKSB8CisJICAgICAobHAtPkRtYVR4bVBhY2tldHMgPDwgUEtfQ09VTlRfVFhfQl9TSEYpLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5QYWNrZXRDb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9jYW1fbG9hZChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgY2hhciAqTmV0d29ya0FkZHJlc3M7CisKKwlOZXR3b3JrQWRkcmVzcyA9ICh1bnNpZ25lZCBjaGFyICopICZscC0+UGh5c2ljYWxBZGRyZXNzWzBdWzBdOworCisJZm9yIChpID0gMDsgaSA8IExBTl9TQUE5NzMwX0NBTV9EV09SRFM7IGkrKykgeworCQkvKiBGaXJzdCBzZXQgYWRkcmVzcyB0byB3aGVyZSBkYXRhIGlzIHdyaXR0ZW4gKi8KKwkJT1VUTChpLCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkNhbUFkZHJlc3MpOworCQlPVVRMKChOZXR3b3JrQWRkcmVzc1swXSA8PCAyNCkgfCAoTmV0d29ya0FkZHJlc3NbMV0gPDwgMTYpCisJCSAgICAgfCAoTmV0d29ya0FkZHJlc3NbMl0gPDwgOCkgfCBOZXR3b3JrQWRkcmVzc1szXSwKKwkJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkNhbURhdGEpOworCQlOZXR3b3JrQWRkcmVzcyArPSA0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9jYW1faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCA9CisJICAgIChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBDb3B5IE1BQy1hZGRyZXNzIGludG8gYWxsIGVudHJpZXMuICovCisJZm9yIChpID0gMDsgaSA8IExBTl9TQUE5NzMwX0NBTV9FTlRSSUVTOyBpKyspIHsKKwkJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopIGxwLT5QaHlzaWNhbEFkZHJlc3NbaV0sCisJCSAgICAgICAodW5zaWduZWQgY2hhciAqKSBkZXYtPmRldl9hZGRyLCA2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9taWlfaW5pdChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJaW50IGksIGw7CisKKwkvKiBDaGVjayBsaW5rIHN0YXR1cywgc3BpbiBoZXJlIHRpbGwgc3RhdGlvbiBpcyBub3QgYnVzeS4gKi8KKwlpID0gMDsKKwl3aGlsZSAoSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+U3RhdGlvbk1nbXRDdGwpICYgTURfQ0FfQlVTWSkgeworCQlpKys7CisJCWlmIChpID4gMTAwKSB7CisJCQlwcmludGsoIkVycm9yOiBsYW5fc2FhOTczMF9taWlfaW5pdDogdGltZW91dFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWRlbGF5KDEpOwkvKiB3YWl0IDEgbXMuICovCisJfQorCisJLyogTm93IHNldCB0aGUgY29udHJvbCBhbmQgYWRkcmVzcyByZWdpc3Rlci4gKi8KKwlPVVRMKE1EX0NBX0JVU1kgfCBQSFlfU1RBVFVTIHwgUEhZX0FERFJFU1MgPDwgTURfQ0FfUEhZX1NIRiwKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+U3RhdGlvbk1nbXRDdGwpOworCisJLyogY2hlY2sgbGluayBzdGF0dXMsIHNwaW4gaGVyZSB0aWxsIHN0YXRpb24gaXMgbm90IGJ1c3kgKi8KKwlpID0gMDsKKwl3aGlsZSAoSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+U3RhdGlvbk1nbXRDdGwpICYgTURfQ0FfQlVTWSkgeworCQlpKys7CisJCWlmIChpID4gMTAwKSB7CisJCQlwcmludGsoIkVycm9yOiBsYW5fc2FhOTczMF9taWlfaW5pdDogdGltZW91dFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWRlbGF5KDEpOwkvKiB3YWl0IDEgbXMuICovCisJfQorCisJLyogV2FpdCBmb3IgMSBtcy4gKi8KKwltZGVsYXkoMSk7CisKKwkvKiBDaGVjayB0aGUgbGluayBzdGF0dXMuICovCisJaWYgKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlN0YXRpb25NZ210RGF0YSkgJgorCSAgICBQSFlfU1RBVFVTX0xJTktfVVApIHsKKwkJLyogTGluayBpcyB1cC4gKi8KKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogTGluayBpcyBkb3duLCByZXNldCB0aGUgUEhZIGZpcnN0LiAqLworCisJCS8qIHNldCBQSFkgYWRkcmVzcyA9ICdDT05UUk9MJyAqLworCQlPVVRMKFBIWV9BRERSRVNTIDw8IE1EX0NBX1BIWV9TSEYgfCBNRF9DQV9XUiB8IFBIWV9DT05UUk9MLAorCQkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+U3RhdGlvbk1nbXRDdGwpOworCisJCS8qIFdhaXQgZm9yIDEgbXMuICovCisJCW1kZWxheSgxKTsKKworCQkvKiBzZXQgJ0NPTlRST0wnID0gZm9yY2UgcmVzZXQgYW5kIHJlbmVnb3RpYXRlICovCisJCU9VVEwoUEhZX0NPTlRST0xfUkVTRVQgfCBQSFlfQ09OVFJPTF9BVVRPX05FRyB8CisJCSAgICAgUEhZX0NPTlRST0xfUkVTVEFSVF9BVVRPX05FRywKKwkJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlN0YXRpb25NZ210RGF0YSk7CisKKwkJLyogV2FpdCBmb3IgNTAgbXMuICovCisJCW1kZWxheSg1MCk7CisKKwkJLyogc2V0ICdCVVNZJyB0byBzdGFydCBvcGVyYXRpb24gKi8KKwkJT1VUTChNRF9DQV9CVVNZIHwgUEhZX0FERFJFU1MgPDwgTURfQ0FfUEhZX1NIRiB8IE1EX0NBX1dSIHwKKwkJICAgICBQSFlfQ09OVFJPTCwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5TdGF0aW9uTWdtdEN0bCk7CisKKwkJLyogYXdhaXQgY29tcGxldGlvbiAqLworCQlpID0gMDsKKwkJd2hpbGUgKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlN0YXRpb25NZ210Q3RsKSAmCisJCSAgICAgICBNRF9DQV9CVVNZKSB7CisJCQlpKys7CisJCQlpZiAoaSA+IDEwMCkgeworCQkJCXByaW50aworCQkJCSAgICAoIkVycm9yOiBsYW5fc2FhOTczMF9taWlfaW5pdDogdGltZW91dFxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJbWRlbGF5KDEpOwkvKiB3YWl0IDEgbXMuICovCisJCX0KKworCQkvKiBXYWl0IGZvciAxIG1zLiAqLworCQltZGVsYXkoMSk7CisKKwkJZm9yIChsID0gMDsgbCA8IDI7IGwrKykgeworCQkJLyogc2V0IFBIWSBhZGRyZXNzID0gJ1NUQVRVUycgKi8KKwkJCU9VVEwoTURfQ0FfQlVTWSB8IFBIWV9BRERSRVNTIDw8IE1EX0NBX1BIWV9TSEYgfAorCQkJICAgICBQSFlfU1RBVFVTLAorCQkJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlN0YXRpb25NZ210Q3RsKTsKKworCQkJLyogYXdhaXQgY29tcGxldGlvbiAqLworCQkJaSA9IDA7CisJCQl3aGlsZSAoSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+U3RhdGlvbk1nbXRDdGwpICYKKwkJCSAgICAgICBNRF9DQV9CVVNZKSB7CisJCQkJaSsrOworCQkJCWlmIChpID4gMTAwKSB7CisJCQkJCXByaW50aworCQkJCQkgICAgKCJFcnJvcjogbGFuX3NhYTk3MzBfbWlpX2luaXQ6IHRpbWVvdXRcbiIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCW1kZWxheSgxKTsJLyogd2FpdCAxIG1zLiAqLworCQkJfQorCisJCQkvKiB3YWl0IGZvciAzIHNlYy4gKi8KKwkJCW1kZWxheSgzMDAwKTsKKworCQkJLyogY2hlY2sgdGhlIGxpbmsgc3RhdHVzICovCisJCQlpZiAoSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+U3RhdGlvbk1nbXREYXRhKSAmCisJCQkgICAgUEhZX1NUQVRVU19MSU5LX1VQKSB7CisJCQkJLyogbGluayBpcyB1cCAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfY29udHJvbF9pbml0KHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCkKK3sKKwkvKiBJbml0aWFsaXplIERNQSBjb250cm9sIHJlZ2lzdGVyLiAqLworCU9VVEwoKExBTk1CX0FOWSA8PCBETUFfQ1RMX01BWF9YRkVSX1NIRikgfAorCSAgICAgKExBTkVORF9MSVRUTEUgPDwgRE1BX0NUTF9FTkRJQU5fU0hGKSB8CisJICAgICAoTEFOX1NBQTk3MzBfUkNWX1FfSU5UX1RIUkVTSE9MRCA8PCBETUFfQ1RMX1JYX0lOVF9DT1VOVF9TSEYpCisJICAgICB8IERNQV9DVExfUlhfSU5UX1RPX0VOIHwgRE1BX0NUTF9SWF9JTlRfRU4gfAorCSAgICAgRE1BX0NUTF9NQUNfUlhfSU5UX0VOIHwgRE1BX0NUTF9NQUNfVFhfSU5UX0VOLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5MYW5EbWFDdGwpOworCisJLyogSW5pdGlhbCBNQUMgY29udHJvbCByZWdpc3Rlci4gKi8KKwlPVVRMKChNQUNDTV9NSUkgPDwgTUFDX0NPTlRST0xfQ09OTl9TSEYpIHwgTUFDX0NPTlRST0xfRlVMTF9EVVAsCisJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk1hY0N0bCk7CisKKwkvKiBJbml0aWFsaXplIENBTSBjb250cm9sIHJlZ2lzdGVyLiAqLworCU9VVEwoQ0FNX0NPTlRST0xfQ09NUF9FTiB8IENBTV9DT05UUk9MX0JST0FEX0FDQywKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+Q2FtQ3RsKTsKKworCS8qIAorCSAqIEluaXRpYWxpemUgQ0FNIGVuYWJsZSByZWdpc3Rlciwgb25seSB0dXJuIG9uIGZpcnN0IGVudHJ5LCBzaG91bGQKKwkgKiBjb250YWluIG93biBhZGRyLiAKKwkgKi8KKwlPVVRMKDB4MDAwMSwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5DYW1FbmFibGUpOworCisJLyogSW5pdGlhbGl6ZSBUeCBjb250cm9sIHJlZ2lzdGVyICovCisJT1VUTChUWF9DVExfRU5fQ09NUCwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5UeEN0bCk7CisKKwkvKiBJbml0aWFsaXplIFJjdiBjb250cm9sIHJlZ2lzdGVyICovCisJT1VUTChSWF9DVExfU1RSSVBfQ1JDLCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlJ4Q3RsKTsKKworCS8qIFJlc2V0IERNQSBlbmdpbmUgKi8KKwlPVVRMKERNQV9URVNUX1NXX1JFU0VULCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRtYVRlc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfc3RvcChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJaW50IGk7CisKKwkvKiBTdG9wIERNQSBmaXJzdCAqLworCU9VVEwoSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+TGFuRG1hQ3RsKSAmCisJICAgICB+KERNQV9DVExfRU5fVFhfRE1BIHwgRE1BX0NUTF9FTl9SWF9ETUEpLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5MYW5EbWFDdGwpOworCisJLyogU2V0IHRoZSBTVyBSZXNldCBiaXRzIGluIERNQSBhbmQgTUFDIGNvbnRyb2wgcmVnaXN0ZXJzICovCisJT1VUTChETUFfVEVTVF9TV19SRVNFVCwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EbWFUZXN0KTsKKwlPVVRMKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk1hY0N0bCkgfCBNQUNfQ09OVFJPTF9SRVNFVCwKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+TWFjQ3RsKTsKKworCS8qIAorCSAqIFdhaXQgZm9yIE1BQyByZXNldCB0byBoYXZlIGZpbmlzaGVkLiBUaGUgcmVzZXQgYml0IGlzIGF1dG8gY2xlYXJlZAorCSAqIHdoZW4gdGhlIHJlc2V0IGlzIGRvbmUuCisJICovCisJaSA9IDA7CisJd2hpbGUgKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk1hY0N0bCkgJiBNQUNfQ09OVFJPTF9SRVNFVCkgeworCQlpKys7CisJCWlmIChpID4gMTAwKSB7CisJCQlwcmludGsKKwkJCSAgICAoIkVycm9yOiBsYW5fc2E5NzMwX3N0b3A6IE1BQyByZXNldCB0aW1lb3V0XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZGVsYXkoMSk7CS8qIHdhaXQgMSBtcy4gKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9kbWFfaW5pdChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJLyogU3RvcCBsYW4gY29udHJvbGxlci4gKi8KKwlsYW5fc2FhOTczMF9zdG9wKGxwKTsKKworCU9VVEwoTEFOX1NBQTk3MzBfREVGQVVMVF9USU1FX09VVF9DTlQsCisJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlRpbWVvdXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfc3RhcnQoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwKQoreworCWxhbl9zYWE5NzMwX2J1ZmZlcl9pbml0KGxwKTsKKworCS8qIEluaXRpYWxpemUgUnggQnVmZmVyIEluZGV4ICovCisJbHAtPk5leHRSY3ZQYWNrZXRJbmRleCA9IDA7CisJbHAtPk5leHRSY3ZUb1VzZUlzQSA9IDE7CisKKwkvKiBTZXQgY3VycmVudCBidWZmZXIgaW5kZXggJiBuZXh0IGF2YWlsYmxlIHBhY2tldCBpbmRleCAqLworCWxwLT5OZXh0VHhtUGFja2V0SW5kZXggPSAwOworCWxwLT5OZXh0VHhtQnVmZmVySW5kZXggPSAwOworCWxwLT5QZW5kaW5nVHhtUGFja2V0SW5kZXggPSAwOworCWxwLT5QZW5kaW5nVHhtQnVmZmVySW5kZXggPSAwOworCisJT1VUTChJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5MYW5EbWFDdGwpIHwgRE1BX0NUTF9FTl9UWF9ETUEgfAorCSAgICAgRE1BX0NUTF9FTl9SWF9ETUEsICZscC0+bGFuX3NhYTk3MzBfcmVncy0+TGFuRG1hQ3RsKTsKKworCS8qIEZvciBUeCwgdHVybiBvbiBNQUMgdGhlbiBETUEgKi8KKwlPVVRMKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlR4Q3RsKSB8IFRYX0NUTF9UWF9FTiwKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+VHhDdGwpOworCisJLyogRm9yIFJ4LCB0dXJuIG9uIERNQSB0aGVuIE1BQyAqLworCU9VVEwoSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+UnhDdGwpIHwgUlhfQ1RMX1JYX0VOLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5SeEN0bCk7CisKKwkvKiBTZXQgT2syVXNlIHRvIGxldCBoYXJkd2FyZSBvd25zIHRoZSBidWZmZXJzICovCisJT1VUTChPSzJVU0VfUlhfQSB8IE9LMlVTRV9SWF9CIHwgT0syVVNFX1RYX0EgfCBPSzJVU0VfVFhfQiwKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+T2syVXNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX3Jlc3RhcnQoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwKQoreworCWxhbl9zYWE5NzMwX3N0b3AobHApOworCWxhbl9zYWE5NzMwX3N0YXJ0KGxwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwID0KKwkgICAgKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBpbnQgKnBQYWNrZXQ7CisJdW5zaWduZWQgaW50IHR4X3N0YXR1czsKKworCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDUpCisJCXByaW50aygibGFuX3NhYTk3MzBfdHggaW50ZXJydXB0XG4iKTsKKworCS8qIENsZWFyIGludGVycnVwdC4gKi8KKwlPVVRMKERNQV9TVEFUVVNfTUFDX1RYX0lOVCwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EbWFTdGF0dXMpOworCisJd2hpbGUgKDEpIHsKKwkJcFBhY2tldCA9CisJCSAgICAodW5zaWduZWQgaW50ICopIGxwLT5UeG1CdWZmZXJbbHAtPgorCQkJCQkJICAgUGVuZGluZ1R4bUJ1ZmZlckluZGV4XQorCQkgICAgW2xwLT5QZW5kaW5nVHhtUGFja2V0SW5kZXhdOworCisJCS8qIEdldCBzdGF0dXMgb2YgZmlyc3QgcGFja2V0IHRyYW5zbWl0dGVkLiAqLworCQl0eF9zdGF0dXMgPSBsZTMyX3RvX2NwdSgqcFBhY2tldCk7CisKKwkJLyogQ2hlY2sgb3duZXJzaGlwLiAqLworCQlpZiAoKHR4X3N0YXR1cyAmIFRYX1NUQVRfQ1RMX09XTkVSX01TSykgIT0KKwkJICAgIChUWFNGX0hXRE9ORSA8PCBUWF9TVEFUX0NUTF9PV05FUl9TSEYpKSBicmVhazsKKworCQkvKiBDaGVjayBmb3IgZXJyb3IuICovCisJCWlmICh0eF9zdGF0dXMgJiBUWF9TVEFUX0NUTF9FUlJPUl9NU0spIHsKKwkJCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKCJsYW5fc2FhOTczMF90eDogdHggZXJyb3IgPSAleFxuIiwKKwkJCQkgICAgICAgdHhfc3RhdHVzKTsKKworCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmCisJCQkgICAgKFRYX1NUQVRVU19FWF9DT0xMIDw8IFRYX1NUQVRfQ1RMX1NUQVRVU19TSEYpKQorCQkJCSAgICBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJgorCQkJICAgIChUWF9TVEFUVVNfTEFURV9DT0xMIDw8CisJCQkgICAgIFRYX1NUQVRfQ1RMX1NUQVRVU19TSEYpKSBscC0+c3RhdHMuCisJICAgICB0eF93aW5kb3dfZXJyb3JzKys7CisJCQlpZiAodHhfc3RhdHVzICYKKwkJCSAgICAoVFhfU1RBVFVTX0xfQ0FSUiA8PCBUWF9TVEFUX0NUTF9TVEFUVVNfU0hGKSkKKwkJCQkgICAgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlpZiAodHhfc3RhdHVzICYKKwkJCSAgICAoVFhfU1RBVFVTX1VOREVSIDw8IFRYX1NUQVRfQ1RMX1NUQVRVU19TSEYpKQorCQkJCSAgICBscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJgorCQkJICAgIChUWF9TVEFUVVNfU1FfRVJSIDw8IFRYX1NUQVRfQ1RMX1NUQVRVU19TSEYpKQorCQkJCSAgICBscC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCisJCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPQorCQkJICAgIHR4X3N0YXR1cyAmIFRYX1NUQVRVU19UWF9DT0xMX01TSzsKKwkJfQorCisJCS8qIEZyZWUgYnVmZmVyLiAqLworCQkqcFBhY2tldCA9CisJCSAgICBjcHVfdG9fbGUzMihUWFNGX0VNUFRZIDw8IFRYX1NUQVRfQ1RMX09XTkVSX1NIRik7CisKKwkJLyogVXBkYXRlIHBlbmRpbmcgaW5kZXggcG9pbnRlci4gKi8KKwkJbHAtPlBlbmRpbmdUeG1QYWNrZXRJbmRleCsrOworCQlpZiAobHAtPlBlbmRpbmdUeG1QYWNrZXRJbmRleCA+PSBMQU5fU0FBOTczMF9UWE1fUV9TSVpFKSB7CisJCQlscC0+UGVuZGluZ1R4bVBhY2tldEluZGV4ID0gMDsKKwkJCWxwLT5QZW5kaW5nVHhtQnVmZmVySW5kZXggXj0gMTsKKwkJfQorCX0KKworCS8qIE1ha2Ugc3VyZSBBIGFuZCBCIGFyZSBhdmFpbGFibGUgdG8gaGFyZHdhcmUuICovCisJT1VUTChPSzJVU0VfVFhfQSB8IE9LMlVTRV9UWF9CLCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk9rMlVzZSk7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCS8qIFRoZSB0eCBidWZmZXIgaXMgbm8gbG9uZ2VyIGZ1bGwuICovCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCA9CisJICAgIChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJaW50IGxlbiA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IDA7CisJdW5zaWduZWQgaW50IHJ4X3N0YXR1czsKKwlpbnQgQnVmZmVySW5kZXg7CisJaW50IFBhY2tldEluZGV4OworCXVuc2lnbmVkIGludCAqcFBhY2tldDsKKwl1bnNpZ25lZCBjaGFyICpwRGF0YTsKKworCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDUpCisJCXByaW50aygibGFuX3NhYTk3MzBfcnggaW50ZXJydXB0XG4iKTsKKworCS8qIENsZWFyIHJlY2VpdmUgaW50ZXJydXB0cy4gKi8KKwlPVVRMKERNQV9TVEFUVVNfTUFDX1JYX0lOVCB8IERNQV9TVEFUVVNfUlhfSU5UIHwKKwkgICAgIERNQV9TVEFUVVNfUlhfVE9fSU5ULCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRtYVN0YXR1cyk7CisKKwkvKiBBZGRyZXNzIG5leHQgcGFja2V0ICovCisJaWYgKGxwLT5OZXh0UmN2VG9Vc2VJc0EpCisJCUJ1ZmZlckluZGV4ID0gMDsKKwllbHNlCisJCUJ1ZmZlckluZGV4ID0gMTsKKwlQYWNrZXRJbmRleCA9IGxwLT5OZXh0UmN2UGFja2V0SW5kZXg7CisJcFBhY2tldCA9ICh1bnNpZ25lZCBpbnQgKikgbHAtPlJjdkJ1ZmZlcltCdWZmZXJJbmRleF1bUGFja2V0SW5kZXhdOworCXJ4X3N0YXR1cyA9IGxlMzJfdG9fY3B1KCpwUGFja2V0KTsKKworCS8qIFByb2Nlc3MgZWFjaCBwYWNrZXQuICovCisJd2hpbGUgKChyeF9zdGF0dXMgJiBSWF9TVEFUX0NUTF9PV05FUl9NU0spID09CisJICAgICAgIChSWFNGX0hXRE9ORSA8PCBSWF9TVEFUX0NUTF9PV05FUl9TSEYpKSB7CisJCS8qIENoZWNrIHRoZSByeCBzdGF0dXMuICovCisJCWlmIChyeF9zdGF0dXMgJiAoUlhfU1RBVFVTX0dPT0QgPDwgUlhfU1RBVF9DVExfU1RBVFVTX1NIRikpIHsKKwkJCS8qIFJlY2VpdmVkIHBhY2tldCBpcyBnb29kLiAqLworCQkJbGVuID0gKHJ4X3N0YXR1cyAmIFJYX1NUQVRfQ1RMX0xFTkdUSF9NU0spID4+CisJCQkgICAgUlhfU1RBVF9DVExfTEVOR1RIX1NIRjsKKworCQkJcERhdGEgPSAodW5zaWduZWQgY2hhciAqKSBwUGFja2V0OworCQkJcERhdGEgKz0gNDsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMik7CisJCQlpZiAoc2tiID09IDApIHsKKwkJCQlwcmludGsKKwkJCQkgICAgKCIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkJCSAgICAgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJfSBlbHNlIHsKKwkJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiAqLworCQkJCXNrYl9wdXQoc2tiLCBsZW4pOwkvKiBtYWtlIHJvb20gKi8KKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwKKwkJCQkJCSAodW5zaWduZWQgY2hhciAqKSBwRGF0YSwKKwkJCQkJCSBsZW4sIDApOworCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogV2UgZ290IGFuIGVycm9yIHBhY2tldC4gKi8KKwkJCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDIpCisJCQkJcHJpbnRrCisJCQkJICAgICgibGFuX3NhYTk3MzBfcng6IFdlIGdvdCBhbiBlcnJvciBwYWNrZXQgPSAleFxuIiwKKwkJCQkgICAgIHJ4X3N0YXR1cyk7CisKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChyeF9zdGF0dXMgJgorCQkJICAgIChSWF9TVEFUVVNfQ1JDX0VSUiA8PCBSWF9TVEFUX0NUTF9TVEFUVVNfU0hGKSkKKwkJCQkgICAgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChyeF9zdGF0dXMgJgorCQkJICAgIChSWF9TVEFUVVNfQUxJR05fRVJSIDw8CisJCQkgICAgIFJYX1NUQVRfQ1RMX1NUQVRVU19TSEYpKSBscC0+c3RhdHMuCisJICAgICByeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChyeF9zdGF0dXMgJgorCQkJICAgIChSWF9TVEFUVVNfT1ZFUkZMT1cgPDwgUlhfU1RBVF9DVExfU1RBVFVTX1NIRikpCisJCQkJICAgIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJaWYgKHJ4X3N0YXR1cyAmCisJCQkgICAgKFJYX1NUQVRVU19MT05HX0VSUiA8PCBSWF9TVEFUX0NUTF9TVEFUVVNfU0hGKSkKKwkJCQkgICAgbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJfQorCisJCS8qIEluZGljYXRlIHdlIGhhdmUgcHJvY2Vzc2VkIHRoZSBidWZmZXIuICovCisJCSpwUGFja2V0ID0KKwkJICAgIGNwdV90b19sZTMyKFJYU0ZfUkVBRFkgPDwgUlhfU1RBVF9DVExfT1dORVJfU0hGKTsKKworCQkvKiBHbyB0byBuZXh0IHBhY2tldCBpbiBzZXF1ZW5jZS4gKi8KKwkJbHAtPk5leHRSY3ZQYWNrZXRJbmRleCsrOworCQlpZiAobHAtPk5leHRSY3ZQYWNrZXRJbmRleCA+PSBMQU5fU0FBOTczMF9SQ1ZfUV9TSVpFKSB7CisJCQlscC0+TmV4dFJjdlBhY2tldEluZGV4ID0gMDsKKwkJCWlmIChCdWZmZXJJbmRleCkgeworCQkJCWxwLT5OZXh0UmN2VG9Vc2VJc0EgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlscC0+TmV4dFJjdlRvVXNlSXNBID0gMDsKKwkJCX0KKwkJfQorCQlPVVRMKE9LMlVTRV9SWF9BIHwgT0syVVNFX1JYX0IsCisJCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5PazJVc2UpOworCisJCS8qIEFkZHJlc3MgbmV4dCBwYWNrZXQgKi8KKwkJaWYgKGxwLT5OZXh0UmN2VG9Vc2VJc0EpCisJCQlCdWZmZXJJbmRleCA9IDA7CisJCWVsc2UKKwkJCUJ1ZmZlckluZGV4ID0gMTsKKwkJUGFja2V0SW5kZXggPSBscC0+TmV4dFJjdlBhY2tldEluZGV4OworCQlwUGFja2V0ID0KKwkJICAgICh1bnNpZ25lZCBpbnQgKikgbHAtPgorCQkgICAgUmN2QnVmZmVyW0J1ZmZlckluZGV4XVtQYWNrZXRJbmRleF07CisJCXJ4X3N0YXR1cyA9IGxlMzJfdG9fY3B1KCpwUGFja2V0KTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgQSBhbmQgQiBhcmUgYXZhaWxhYmxlIHRvIGhhcmR3YXJlLiAqLworCU9VVEwoT0syVVNFX1JYX0EgfCBPSzJVU0VfUlhfQiwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5PazJVc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBsYW5fc2FhOTczMF9pbnRlcnJ1cHQoY29uc3QgaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwID0KKwkgICAgKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDUpCisJCXByaW50aygibGFuX3NhYTk3MzBfaW50ZXJydXB0XG4iKTsKKworCS8qIERpc2FibGUgdGhlIEVWTSBMQU4gaW50ZXJydXB0LiAqLworCWV2bV9zYWE5NzMwX2Jsb2NrX2xhbl9pbnQobHApOworCisJLyogQ2xlYXIgdGhlIEVWTSBMQU4gaW50ZXJydXB0LiAqLworCWV2bV9zYWE5NzMwX2NsZWFyX2xhbl9pbnQobHApOworCisJLyogU2VydmljZSBwZW5kaW5nIHRyYW5zbWl0IGludGVycnVwdHMuICovCisJaWYgKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRtYVN0YXR1cykgJiBETUFfU1RBVFVTX01BQ19UWF9JTlQpCisJCWxhbl9zYWE5NzMwX3R4KGRldik7CisKKwkvKiBTZXJ2aWNlIHBlbmRpbmcgcmVjZWl2ZSBpbnRlcnJ1cHRzLiAqLworCWlmIChJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EbWFTdGF0dXMpICYKKwkgICAgKERNQV9TVEFUVVNfTUFDX1JYX0lOVCB8IERNQV9TVEFUVVNfUlhfSU5UIHwKKwkgICAgIERNQV9TVEFUVVNfUlhfVE9fSU5UKSkgbGFuX3NhYTk3MzBfcngoZGV2KTsKKworCS8qIEVuYWJsZSB0aGUgRVZNIExBTiBpbnRlcnJ1cHQuICovCisJZXZtX3NhYTk3MzBfdW5ibG9ja19sYW5faW50KGxwKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9vcGVuX2ZhaWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwID0KKwkgICAgKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCS8qIEFzc29jaWF0ZSBJUlEgd2l0aCBsYW5fc2FhOTczMF9pbnRlcnJ1cHQgKi8KKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZsYW5fc2FhOTczMF9pbnRlcnJ1cHQsIDAsICJTQUE5NzMwIEV0aCIsCisJCQlkZXYpKSB7CisJCXByaW50aygibGFuX3NhYTk3MzBfb3BlbjogQ2FuJ3QgZ2V0IGlycSAlZFxuIiwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBFbmFibGUgdGhlIExhbiBpbnRlcnJ1cHQgaW4gdGhlIGV2ZW50IG1hbmFnZXIuICovCisJZXZtX3NhYTk3MzBfZW5hYmxlX2xhbl9pbnQobHApOworCisJLyogU3RhcnQgdGhlIExBTiBjb250cm9sbGVyICovCisJaWYgKGxhbl9zYWE5NzMwX3N0YXJ0KGxwKSkKKwkJcmV0dXJuIC0xOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX3dyaXRlKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHNrYmxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwYkRhdGEgPSBza2ItPmRhdGE7CisJdW5zaWduZWQgaW50IGxlbiA9IHNrYmxlbjsKKwl1bnNpZ25lZCBjaGFyICpwYlBhY2tldERhdGE7CisJdW5zaWduZWQgaW50IHR4X3N0YXR1czsKKwlpbnQgQnVmZmVySW5kZXg7CisJaW50IFBhY2tldEluZGV4OworCisJaWYgKGxhbl9zYWE5NzMwX2RlYnVnID4gNSkKKwkJcHJpbnRrKCJsYW5fc2FhOTczMF93cml0ZTogc2tiPSUwOHhcbiIsCisJCSAgICAgICAodW5zaWduZWQgaW50KSBza2IpOworCisJQnVmZmVySW5kZXggPSBscC0+TmV4dFR4bUJ1ZmZlckluZGV4OworCVBhY2tldEluZGV4ID0gbHAtPk5leHRUeG1QYWNrZXRJbmRleDsKKworCXR4X3N0YXR1cyA9CisJICAgIGxlMzJfdG9fY3B1KCoodW5zaWduZWQgaW50ICopIGxwLT4KKwkJCVR4bUJ1ZmZlcltCdWZmZXJJbmRleF1bUGFja2V0SW5kZXhdKTsKKwlpZiAoKHR4X3N0YXR1cyAmIFRYX1NUQVRfQ1RMX09XTkVSX01TSykgIT0KKwkgICAgKFRYU0ZfRU1QVFkgPDwgVFhfU1RBVF9DVExfT1dORVJfU0hGKSkgeworCQlpZiAobGFuX3NhYTk3MzBfZGVidWcgPiA0KQorCQkJcHJpbnRrCisJCQkgICAgKCJsYW5fc2FhOTczMF93cml0ZTogVHggYnVmZmVyIG5vdCBhdmFpbGFibGU6IHR4X3N0YXR1cyA9ICV4XG4iLAorCQkJICAgICB0eF9zdGF0dXMpOworCQlyZXR1cm4gLTE7CisJfQorCisJbHAtPk5leHRUeG1QYWNrZXRJbmRleCsrOworCWlmIChscC0+TmV4dFR4bVBhY2tldEluZGV4ID49IExBTl9TQUE5NzMwX1RYTV9RX1NJWkUpIHsKKwkJbHAtPk5leHRUeG1QYWNrZXRJbmRleCA9IDA7CisJCWxwLT5OZXh0VHhtQnVmZmVySW5kZXggXj0gMTsKKwl9CisKKwlwYlBhY2tldERhdGEgPQorCSAgICAodW5zaWduZWQgY2hhciAqKSBscC0+VHhtQnVmZmVyW0J1ZmZlckluZGV4XVtQYWNrZXRJbmRleF07CisJcGJQYWNrZXREYXRhICs9IDQ7CisKKwkvKiBjb3B5IHRoZSBiaXRzICovCisJbWVtY3B5KHBiUGFja2V0RGF0YSwgcGJEYXRhLCBsZW4pOworCisJLyogU2V0IHRyYW5zbWl0IHN0YXR1cyBmb3IgaGFyZHdhcmUgKi8KKwkqKHVuc2lnbmVkIGludCAqKSBscC0+VHhtQnVmZmVyW0J1ZmZlckluZGV4XVtQYWNrZXRJbmRleF0gPQorCSAgICBjcHVfdG9fbGUzMigoVFhTRl9SRUFEWSA8PCBUWF9TVEFUX0NUTF9PV05FUl9TSEYpIHwKKwkJCShUWF9TVEFUX0NUTF9JTlRfQUZURVJfVFggPDwgVFhfU1RBVF9DVExfRlJBTUVfU0hGKQorCQkJfCAobGVuIDw8IFRYX1NUQVRfQ1RMX0xFTkdUSF9TSEYpKTsKKworCS8qIFNldCBoYXJkd2FyZSB0eCBidWZmZXIuICovCisJT1VUTChPSzJVU0VfVFhfQSB8IE9LMlVTRV9UWF9CLCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk9rMlVzZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGFuX3NhYTk3MzBfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCA9CisJICAgIChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwkvKiBUcmFuc21pdHRlciB0aW1lb3V0LCBzZXJpb3VzIHByb2JsZW1zICovCisJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCXByaW50aygiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgcmVzZXRcbiIsIGRldi0+bmFtZSk7CisJLypzaG93X3NhYTk3MzBfcmVncyhscCk7ICovCisJbGFuX3NhYTk3MzBfcmVzdGFydChscCk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwID0KKwkgICAgKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBza2JsZW47CisJaW50IGxlbjsKKworCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDQpCisJCXByaW50aygiU2VuZCBwYWNrZXQ6IHNrYj0lMDh4XG4iLCAodW5zaWduZWQgaW50KSBza2IpOworCisJc2tibGVuID0gc2tiLT5sZW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWxlbiA9IChza2JsZW4gPD0gRVRIX1pMRU4pID8gRVRIX1pMRU4gOiBza2JsZW47CisKKwlpZiAobGFuX3NhYTk3MzBfd3JpdGUobHAsIHNrYiwgc2tibGVuKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCQlwcmludGsoIkVycm9yIHdoZW4gd3JpdGluZyBwYWNrZXQgdG8gY29udHJvbGxlcjogc2tiPSUwOHhcbiIsCisJCSAgICAgKHVuc2lnbmVkIGludCkgc2tiKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlyZXR1cm4gLTE7CisJfQorCisJbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwlscC0+c3RhdHMudHhfcGFja2V0cysrOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHAgPQorCSAgICAoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJaWYgKGxhbl9zYWE5NzMwX2RlYnVnID4gMSkKKwkJcHJpbnRrKCJsYW5fc2FhOTczMF9jbG9zZTpcbiIpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogRGlzYWJsZSB0aGUgTGFuIGludGVycnVwdCBpbiB0aGUgZXZlbnQgbWFuYWdlci4gKi8KKwlldm1fc2FhOTczMF9kaXNhYmxlX2xhbl9pbnQobHApOworCisJLyogU3RvcCB0aGUgY29udHJvbGxlciAqLworCWlmIChsYW5fc2FhOTczMF9zdG9wKGxwKSkKKwkJcmV0dXJuIC0xOworCisJZnJlZV9pcnEoZGV2LT5pcnEsICh2b2lkICopIGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsYW5fc2FhOTczMF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UKKwkJCQkJCSAgICAgICpkZXYpCit7CisJc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwID0KKwkgICAgKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBsYW5fc2FhOTczMF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwID0KKwkgICAgKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCS8qIFN0b3AgdGhlIGNvbnRyb2xsZXIgKi8KKwlsYW5fc2FhOTczMF9zdG9wKGxwKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJLyogYWNjZXB0IGFsbCBwYWNrZXRzICovCisJCU9VVEwoQ0FNX0NPTlRST0xfQ09NUF9FTiB8IENBTV9DT05UUk9MX1NUQVRJT05fQUNDIHwKKwkJICAgICBDQU1fQ09OVFJPTF9HUk9VUF9BQ0MgfCBDQU1fQ09OVFJPTF9CUk9BRF9BQ0MsCisJCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5DYW1DdGwpOworCX0gZWxzZSB7CisJCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCQkvKiBhY2NlcHQgYWxsIG11bHRpY2FzdCBwYWNrZXRzICovCisJCQlPVVRMKENBTV9DT05UUk9MX0NPTVBfRU4gfCBDQU1fQ09OVFJPTF9HUk9VUF9BQ0MgfAorCQkJICAgICBDQU1fQ09OVFJPTF9CUk9BRF9BQ0MsCisJCQkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+Q2FtQ3RsKTsKKwkJfSBlbHNlIHsKKwkJCS8qIAorCQkJICogV2lsbCBoYW5kbGUgdGhlIG11bHRpY2FzdCBzdHVmZiBsYXRlci4gLWNhcnN0ZW5sCisJCQkgKi8KKwkJfQorCX0KKworCWxhbl9zYWE5NzMwX3Jlc3RhcnQobHApOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzYWE5NzMwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKyAgICAgICAgaWYgKGRldikgeworICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwkJaWYgKGRldi0+cHJpdikKKwkJCWtmcmVlKGRldi0+cHJpdik7CisKKyAgICAgICAgICAgICAgICBmcmVlX25ldGRldihkZXYpOworICAgICAgICAgICAgICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisgICAgICAgICAgICAgICAgcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworICAgICAgICAgICAgICAgIHBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKyAgICAgICAgfQorfQorCisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyLCBpbnQgaXJxKQoreworCXN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscDsKKwl1bnNpZ25lZCBjaGFyIGV0aGVybmV0X2FkZHJbNl07CisJaW50IHJldCA9IDA7CisKKwlkZXYtPm9wZW4gPSBsYW5fc2FhOTczMF9vcGVuX2ZhaWw7CisKKwlpZiAoZ2V0X2V0aGVybmV0X2FkZHIoZXRoZXJuZXRfYWRkcikpCisJCXJldHVybiAtRU5PREVWOworCQorCW1lbWNweShkZXYtPmRldl9hZGRyLCBldGhlcm5ldF9hZGRyLCA2KTsKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKwkKKwkvKiAKKwkgKiBNYWtlIGNlcnRhaW4gdGhlIGRhdGEgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBjb250cm9sbGVyIGFyZSBhbGlnbmVkIAorCSAqIGFuZCBETUFibGUuIAorCSAqLworCS8qCisJICogIFhYWDogdGhhdCBpcyBvYnZpb3VzbHkgYnJva2VuIC0ga2ZyZWUoKSB3b24ndCBiZSBoYXBweSB3aXRoIHVzLgorCSAqLworCWxwID0gKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopICgoKHVuc2lnbmVkIGxvbmcpCisJCQkJCSAgICAgIGttYWxsb2Moc2l6ZW9mKCpscCkgKyA3LAorCQkJCQkJICAgICAgR0ZQX0RNQSB8IEdGUF9LRVJORUwpCisJCQkJCSAgICAgICsgNykgJiB+Nyk7CisKKwlpZiAoIWxwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldi0+cHJpdiA9IGxwOworCW1lbXNldChscCwgMCwgc2l6ZW9mKCpscCkpOworCisJLyogU2V0IFNBQTk3MzAgTEFOIGJhc2UgYWRkcmVzcy4gKi8KKwlscC0+bGFuX3NhYTk3MzBfcmVncyA9ICh0X2xhbl9zYWE5NzMwX3JlZ21hcCAqKSAoaW9hZGRyICsKKwkJCQkJCQkgU0FBOTczMF9MQU5fUkVHU19BRERSKTsKKworCS8qIFNldCBTQUE5NzMwIEVWTSBiYXNlIGFkZHJlc3MuICovCisJbHAtPmV2bV9zYWE5NzMwX3JlZ3MgPSAodF9ldm1fc2FhOTczMF9yZWdtYXAgKikgKGlvYWRkciArCisJCQkJCQkJIFNBQTk3MzBfRVZNX1JFR1NfQUREUik7CisKKwkvKiBBbGxvY2F0ZSBMQU4gUlgvVFggZnJhbWUgYnVmZmVyIHNwYWNlLiAqLworCS8qIEZJWE1FOiBhIGxlYWsgKi8KKwlpZiAoKHJldCA9IGxhbl9zYWE5NzMwX2FsbG9jYXRlX2J1ZmZlcnMobHApKSkKKwkJZ290byBvdXQ7CisKKwkvKiBTdG9wIExBTiBjb250cm9sbGVyLiAqLworCWlmICgocmV0ID0gbGFuX3NhYTk3MzBfc3RvcChscCkpKSAKKwkJZ290byBvdXQ7CisJCisJLyogSW5pdGlhbGl6ZSBDQU0gcmVnaXN0ZXJzLiAqLworCWlmICgocmV0ID0gbGFuX3NhYTk3MzBfY2FtX2luaXQoZGV2KSkpCisJCWdvdG8gb3V0OworCisJLyogSW5pdGlhbGl6ZSBNSUkgcmVnaXN0ZXJzLiAqLworCWlmICgocmV0ID0gbGFuX3NhYTk3MzBfbWlpX2luaXQobHApKSkKKwkJZ290byBvdXQ7CisKKwkvKiBJbml0aWFsaXplIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCWlmICgocmV0ID0gbGFuX3NhYTk3MzBfY29udHJvbF9pbml0KGxwKSkpIAorCQlnb3RvIG91dDsKKyAgICAgICAgCisJLyogTG9hZCBDQU0gcmVnaXN0ZXJzLiAqLworCWlmICgocmV0ID0gbGFuX3NhYTk3MzBfY2FtX2xvYWQobHApKSkgCisJCWdvdG8gb3V0OworCQorCS8qIEluaXRpYWxpemUgRE1BIGNvbnRleHQgcmVnaXN0ZXJzLiAqLworCWlmICgocmV0ID0gbGFuX3NhYTk3MzBfZG1hX2luaXQobHApKSkKKwkJZ290byBvdXQ7CisJCisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKwkJCisJZGV2LT5vcGVuID0gbGFuX3NhYTk3MzBfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGxhbl9zYWE5NzMwX3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gbGFuX3NhYTk3MzBfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSBsYW5fc2FhOTczMF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBsYW5fc2FhOTczMF9zZXRfbXVsdGljYXN0OworCWRldi0+dHhfdGltZW91dCA9IGxhbl9zYWE5NzMwX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IChIWiA+PiAxKTsKKwlkZXYtPmRtYSA9IDA7CisJCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CisKKyBvdXQ6CisJaWYgKGRldi0+cHJpdikKKwkJa2ZyZWUoZGV2LT5wcml2KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNhYTk3MzBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBpbnQgcGNpX2lvYWRkcjsKKwlpbnQgZXJyOworCisJaWYgKGxhbl9zYWE5NzMwX2RlYnVnID4gMSkKKwkJcHJpbnRrKCJzYWE5NzMwLmM6IFBDSSBiaW9zIGlzIHByZXNlbnQsIGNoZWNraW5nIGZvciBkZXZpY2VzLi4uXG4iKTsKKworCWVyciA9IC1FTk9NRU07CisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoMCk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0OworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNhbm5vdCBlbmFibGUgUENJIGRldmljZSwgYWJvcnRpbmcuXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDE7CisgICAgICAgIH0KKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX01PRFVMRV9OQU1FKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIG91dDI7CisJfQorCisJcGNpX2lycV9saW5lID0gcGRldi0+aXJxOworCS8qIExBTiBiYXNlIGFkZHJlc3MgaW4gbG9jYXRlZCBhdCBCQVIgMS4gKi8KKworCXBjaV9pb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlwcmludGsoIkZvdW5kIFNBQTk3MzAgKFBDSSkgYXQgJSN4LCBpcnEgJWQuXG4iLAorCSAgICAgICBwY2lfaW9hZGRyLCBwY2lfaXJxX2xpbmUpOworCisJZXJyID0gbGFuX3NhYTk3MzBfaW5pdChkZXYsIHBjaV9pb2FkZHIsIHBjaV9pcnFfbGluZSk7CisJaWYgKGVycikgeworCQlwcmludGsoIkxhbiBpbml0IGZhaWxlZCIpOworCQlnb3RvIG91dDI7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKKwkKK291dDI6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworb3V0MToKKwlmcmVlX25ldGRldihkZXYpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNhYTk3MzBfZHJpdmVyID0geworCS5uYW1lICAgICAgICAgICA9IERSVl9NT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUgICAgICAgPSBzYWE5NzMwX3BjaV90YmwsCisJLnByb2JlICAgICAgICAgID0gc2FhOTczMF9pbml0X29uZSwKKwkucmVtb3ZlICAgICAgICAgPSBfX2RldmV4aXRfcChzYWE5NzMwX3JlbW92ZV9vbmUpLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBzYWE5NzMwX2luaXQodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmc2FhOTczMF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2FhOTczMF9jbGVhbnVwKHZvaWQpCit7CisgICAgICAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2FhOTczMF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzYWE5NzMwX2luaXQpOworbW9kdWxlX2V4aXQoc2FhOTczMF9jbGVhbnVwKTsKKworCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NhYTk3MzAuaCBiL2RyaXZlcnMvbmV0L3NhYTk3MzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTlkYTZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2FhOTczMC5oCkBAIC0wLDAgKzEsMzcxIEBACisvKgorICogQ2Fyc3RlbiBMYW5nZ2FhcmQsIGNhcnN0ZW5sQG1pcHMuY29tCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKFZlcnNpb24gMikgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKgorICogU0FBOTczMCBldGhlcm5ldCBkcml2ZXIgZGVzY3JpcHRpb24uCisgKgorICovCisjaWZuZGVmIF9TQUE5NzMwX0gKKyNkZWZpbmUgX1NBQTk3MzBfSAorCisKKy8qIE51bWJlciBvZiA2LWJ5dGUgZW50cmllcyBpbiB0aGUgQ0FNLiAqLworI2RlZmluZSBMQU5fU0FBOTczMF9DQU1fRU5UUklFUyAgICAgICAgICAgICAgMTAKKyNkZWZpbmUJTEFOX1NBQTk3MzBfQ0FNX0RXT1JEUyAgICAgICAgICAgICAgICgoTEFOX1NBQTk3MzBfQ0FNX0VOVFJJRVMqNikvNCkKKworLyogVFggYW5kIFJYIHBhY2tldCBzaXplOiBmaXhlZCB0byAyMDQ4IGJ5dGVzLCBhY2NvcmRpbmcgdG8gSFcgcmVxdWlyZW1lbnRzLiAqLworI2RlZmluZSBMQU5fU0FBOTczMF9QQUNLRVRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgMjA0OAorCisvKiAKKyAqIE51bWJlciBvZiBUWCBidWZmZXJzID0gbnVtYmVyIG9mIFJYIGJ1ZmZlcnMgPSAyLCB3aGljaCBpcyBmaXhlZCBhY2NvcmRpbmcgCisgKiB0byBIVyByZXF1aXJlbWVudHMuIAorICovCisjZGVmaW5lIExBTl9TQUE5NzMwX0JVRkZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKy8qIE51bWJlciBvZiBSWCBwYWNrZXRzIHBlciBSWCBidWZmZXIuICovCisjZGVmaW5lIExBTl9TQUE5NzMwX1JDVl9RX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBOdW1iZXIgb2YgVFggcGFja2V0cyBwZXIgVFggYnVmZmVyLiAqLworI2RlZmluZSBMQU5fU0FBOTczMF9UWE1fUV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyoKKyAqIFdlIGdldCBhbiBpbnRlcnJ1cHQgZm9yIGVhY2ggTEFOX1NBQTk3MzBfREVGQVVMVF9SQ1ZfUV9JTlRfVEhSRVNIT0xEIAorICogcGFja2V0cyByZWNlaXZlZC4gCisgKiBJZiBob3dldmVyIHdlIHJlY2VpdmUgbGVzcyB0aGFuICBMQU5fU0FBOTczMF9ERUZBVUxUX1JDVl9RX0lOVF9USFJFU0hPTEQKKyAqIHBhY2tldHMsIHRoZSBoYXJkd2FyZSBjYW4gdGltZW91dCBhZnRlciBhIGNlcnRhaW4gdGltZSBhbmQgc3RpbGwgdGVsbCAKKyAqIHVzIHBhY2tldHMgaGF2ZSBhcnJpdmVkLgorICogVGhlIHRpbWVvdXQgdmFsdWUgaW4gdW5pdCBvZiAzMiBQQ0kgY2xvY2tzICgzM01oeikuCisgKiBUaGUgdmFsdWUgMjAwIGFwcHJveGltYXRlcyAwLjAwMDIgc2Vjb25kcy4KKyAqLworI2RlZmluZSBMQU5fU0FBOTczMF9SQ1ZfUV9JTlRfVEhSRVNIT0xEICAgICAgICAgICAgICAgMQorI2RlZmluZSBMQU5fU0FBOTczMF9ERUZBVUxUX1RJTUVfT1VUX0NOVCAgICAgICAgICAgICAgMTAKKworI2RlZmluZSBSWFNGX05ESVMgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUlhTRl9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFJYU0ZfSFdET05FICAgICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIFRYU0ZfRU1QVFkgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUWFNGX1JFQURZICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVFhTRl9IV0RPTkUgICAgICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgTEFORU5EX0xJVFRMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExBTkVORF9CSUdfMjE0MyAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMQU5FTkRfQklHXzQzMjEgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBMQU5NQl9BTlkgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTEFOTUJfOCAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExBTk1CXzMyICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBMQU5NQl82NCAgICAgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBNQUNDTV9BVVRPTUFUSUMgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUFDQ01fMTBNQiAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1BQ0NNX01JSSAgICAgICAgICAgICAgICAgICAgICAgMgorCisvKiAKKyAqIFBIWSBkZWZpbml0aW9ucyBmb3IgQmFzaWMgcmVnaXN0ZXJzIG9mIFFTNjYxMiAodXNlZCBvbiBNSVBTIEFUTEFTIGJvYXJkKSAKKyAqLworI2RlZmluZSBQSFlfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBQSFlfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBQSFlfU1RBVFVTX0xJTktfVVAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBQSFlfQ09OVFJPTF9SRVNFVCAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBQSFlfQ09OVFJPTF9BVVRPX05FRyAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBQSFlfQ09OVFJPTF9SRVNUQVJUX0FVVE9fTkVHICAgIDB4MDIwMAorI2RlZmluZSBQSFlfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIDB4MAorCisvKiBQS19DT1VOVCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgUEtfQ09VTlRfVFhfQV9TSEYgICAgICAgICAgICAgICAyNAorI2RlZmluZSBQS19DT1VOVF9UWF9BX01TSyAgICAgICAgICAgICAgICgweGZmIDw8IFBLX0NPVU5UX1RYX0FfU0hGKQorI2RlZmluZSBQS19DT1VOVF9UWF9CX1NIRiAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFBLX0NPVU5UX1RYX0JfTVNLICAgICAgICAgICAgICAgKDB4ZmYgPDwgUEtfQ09VTlRfVFhfQl9TSEYpCisjZGVmaW5lIFBLX0NPVU5UX1JYX0FfU0hGICAgICAgICAgICAgICAgOAorI2RlZmluZSBQS19DT1VOVF9SWF9BX01TSyAgICAgICAgICAgICAgICgweGZmIDw8IFBLX0NPVU5UX1JYX0FfU0hGKQorI2RlZmluZSBQS19DT1VOVF9SWF9CX1NIRiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEtfQ09VTlRfUlhfQl9NU0sgICAgICAgICAgICAgICAoMHhmZiA8PCBQS19DT1VOVF9SWF9CX1NIRikKKworLyogT0syVVNFIHJlZ2lzdGVyLiAqLworI2RlZmluZSBPSzJVU0VfVFhfQSAgICAgICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSBPSzJVU0VfVFhfQiAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBPSzJVU0VfUlhfQSAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBPSzJVU0VfUlhfQiAgICAgICAgICAgICAgICAgICAgIDB4MQorCisvKiBMQU4gRE1BIENPTlRST0wgcmVnaXN0ZXIuICovCisjZGVmaW5lIERNQV9DVExfQkxLX0lOVCAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBETUFfQ1RMX01BWF9YRkVSX1NIRiAgICAgICAgICAgIDE4CisjZGVmaW5lIERNQV9DVExfTUFYX1hGRVJfTVNLICAgICAgICAgICAgKDB4MyA8PCBMQU5fRE1BX0NUTF9NQVhfWEZFUl9TSEYpCisjZGVmaW5lIERNQV9DVExfRU5ESUFOX1NIRiAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgRE1BX0NUTF9FTkRJQU5fTVNLICAgICAgICAgICAgICAoMHgzIDw8IExBTl9ETUFfQ1RMX0VORElBTl9TSEYpCisjZGVmaW5lIERNQV9DVExfUlhfSU5UX0NPVU5UX1NIRiAgICAgICAgOAorI2RlZmluZSBETUFfQ1RMX1JYX0lOVF9DT1VOVF9NU0sgICAgICAgICgweGZmIDw8IExBTl9ETUFfQ1RMX1JYX0lOVF9DT1VOVF9TSEYpCisjZGVmaW5lIERNQV9DVExfRU5fVFhfRE1BICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBETUFfQ1RMX0VOX1JYX0RNQSAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRE1BX0NUTF9SWF9JTlRfQlVGRlVMX0VOICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIERNQV9DVExfUlhfSU5UX1RPX0VOICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBETUFfQ1RMX1JYX0lOVF9FTiAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRE1BX0NUTF9UWF9JTlRfRU4gICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIERNQV9DVExfTUFDX1RYX0lOVF9FTiAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBETUFfQ1RMX01BQ19SWF9JTlRfRU4gICAgICAgICAgIDB4MDAwMDAwMDEKKworLyogRE1BIFNUQVRVUyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgRE1BX1NUQVRVU19CQURfQUREUl9TSEYgICAgICAgICAxNgorI2RlZmluZSBETUFfU1RBVFVTX0JBRF9BRERSX01TSyAgICAgICAgICgweGYgPDwgRE1BX1NUQVRVU19CQURfQUREUl9TSEYpCisjZGVmaW5lIERNQV9TVEFUVVNfUlhfUEtUU19SRUNFSVZFRF9TSEYgOAorI2RlZmluZSBETUFfU1RBVFVTX1JYX1BLVFNfUkVDRUlWRURfTVNLICgweGZmIDw8IERNQV9TVEFUVVNfUlhfUEtUU19SRUNFSVZFRF9TSEYpCisjZGVmaW5lIERNQV9TVEFUVVNfVFhfRU5fU1lOQyAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBETUFfU1RBVFVTX1JYX0JVRl9BX0ZVTCAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRE1BX1NUQVRVU19SWF9CVUZfQl9GVUwgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIERNQV9TVEFUVVNfUlhfVE9fSU5UICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBETUFfU1RBVFVTX1JYX0lOVCAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRE1BX1NUQVRVU19UWF9JTlQgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIERNQV9TVEFUVVNfTUFDX1RYX0lOVCAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBETUFfU1RBVFVTX01BQ19SWF9JTlQgICAgICAgICAgIDB4MDAwMDAwMDEKKworLyogRE1BIFRFU1QvUEFOSUMgU1dJVEhFUyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgRE1BX1RFU1RfTE9PUEJBQ0sgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIERNQV9URVNUX1NXX1JFU0VUICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorCisvKiBNQUMgQ09OVFJPTCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUFDX0NPTlRST0xfRU5fTUlTU19ST0xMICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIE1BQ19DT05UUk9MX01JU1NfUk9MTCAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBNQUNfQ09OVFJPTF9MT09QMTAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgTUFDX0NPTlRST0xfQ09OTl9TSEYgICAgICAgICAgICA1CisjZGVmaW5lIE1BQ19DT05UUk9MX0NPTk5fTVNLICAgICAgICAgICAgKDB4MyA8PCBNQUNfQ09OVFJPTF9DT05OX1NIRikKKyNkZWZpbmUgTUFDX0NPTlRST0xfTUFDX0xPT1AgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIE1BQ19DT05UUk9MX0ZVTExfRFVQICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBNQUNfQ09OVFJPTF9SRVNFVCAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTUFDX0NPTlRST0xfSEFMVF9JTU0gICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE1BQ19DT05UUk9MX0hBTFRfUkVRICAgICAgICAgICAgMHgwMDAwMDAwMQorCisvKiBDQU0gQ09OVFJPTCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQ0FNX0NPTlRST0xfQ09NUF9FTiAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIENBTV9DT05UUk9MX05FR19DQU0gICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBDQU1fQ09OVFJPTF9CUk9BRF9BQ0MgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQ0FNX0NPTlRST0xfR1JPVVBfQUNDICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIENBTV9DT05UUk9MX1NUQVRJT05fQUNDICAgICAgICAgMHgwMDAwMDAwMQorCisvKiBUUkFOU01JVCBDT05UUk9MIHJlZ2lzdGVyLiAqLworI2RlZmluZSBUWF9DVExfRU5fQ09NUCAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgVFhfQ1RMX0VOX1RYX1BBUiAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFRYX0NUTF9FTl9MQVRFX0NPTEwgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBUWF9DVExfRU5fRVhfQ09MTCAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgVFhfQ1RMX0VOX0xfQ0FSUiAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFRYX0NUTF9FTl9FWF9ERUZFUiAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBUWF9DVExfRU5fVU5ERVIgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgVFhfQ1RMX01JSTEwICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFRYX0NUTF9TRF9QQVVTRSAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBUWF9DVExfTk9fRVhfREVGMCAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgVFhfQ1RMX0ZfQkFDSyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFRYX0NUTF9OT19DUkMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBUWF9DVExfTk9fUEFEICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgVFhfQ1RMX1RYX0hBTFQgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFRYX0NUTF9UWF9FTiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorCisvKiBUUkFOU01JVCBTVEFUVVMgcmVnaXN0ZXIuICovCisjZGVmaW5lIFRYX1NUQVRVU19TUV9FUlIgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBUWF9TVEFUVVNfVFhfSEFMVEVEICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgVFhfU1RBVFVTX0NPTVAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIFRYX1NUQVRVU19UWF9QQVIgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBUWF9TVEFUVVNfTEFURV9DT0xMICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgVFhfU1RBVFVTX1RYMTBfU1RBVCAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFRYX1NUQVRVU19MX0NBUlIgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBUWF9TVEFUVVNfRVhfREVGRVIgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgVFhfU1RBVFVTX1VOREVSICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFRYX1NUQVRVU19JTl9UWCAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBUWF9TVEFUVVNfUEFVU0VEICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgVFhfU1RBVFVTX1RYX0RFRkVSUkVEICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFRYX1NUQVRVU19FWF9DT0xMICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBUWF9TVEFUVVNfVFhfQ09MTF9TSEYgICAgICAgICAgIDAKKyNkZWZpbmUgVFhfU1RBVFVTX1RYX0NPTExfTVNLICAgICAgICAgICAoMHhmIDw8IFRYX1NUQVRVU19UWF9DT0xMX1NIRikKKworLyogUkVDRUlWRSBDT05UUk9MIHJlZ2lzdGVyLiAqLworI2RlZmluZSBSWF9DVExfRU5fR09PRCAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgUlhfQ1RMX0VOX1JYX1BBUiAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFJYX0NUTF9FTl9MT05HX0VSUiAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBSWF9DVExfRU5fT1ZFUiAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgUlhfQ1RMX0VOX0NSQ19FUlIgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFJYX0NUTF9FTl9BTElHTiAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBSWF9DVExfSUdOT1JFX0NSQyAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgUlhfQ1RMX1BBU1NfQ1RMICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFJYX0NUTF9TVFJJUF9DUkMgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBSWF9DVExfU0hPUlRfRU4gICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUlhfQ1RMX0xPTkdfRU4gICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFJYX0NUTF9SWF9IQUxUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBSWF9DVExfUlhfRU4gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworLyogUkVDRUlWRSBTVEFUVVMgcmVnaXN0ZXIuICovCisjZGVmaW5lIFJYX1NUQVRVU19SWF9IQUxURUQgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBSWF9TVEFUVVNfR09PRCAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgUlhfU1RBVFVTX1JYX1BBUiAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFJYX1NUQVRVU19MT05HX0VSUiAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBSWF9TVEFUVVNfT1ZFUkZMT1cgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgUlhfU1RBVFVTX0NSQ19FUlIgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFJYX1NUQVRVU19BTElHTl9FUlIgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBSWF9TVEFUVVNfUlgxMF9TVEFUICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgUlhfU1RBVFVTX0lOVF9SWCAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFJYX1NUQVRVU19DVExfUkVDRCAgICAgICAgICAgICAgMHgwMDAwMDAyMAorCisvKiBNRF9DQSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTURfQ0FfUFJFX1NVUCAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIE1EX0NBX0JVU1kgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBNRF9DQV9XUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgTURfQ0FfUEhZX1NIRiAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIE1EX0NBX1BIWV9NU0sgICAgICAgICAgICAgICAgICAgKDB4MWYgPDwgTURfQ0FfUEhZX1NIRikKKyNkZWZpbmUgTURfQ0FfQUREUl9TSEYgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1EX0NBX0FERFJfTVNLICAgICAgICAgICAgICAgICAgKDB4MWYgPDwgTURfQ0FfQUREUl9TSEYpCisKKy8qIFR4IFN0YXR1cy9Db250cm9sLiAqLworI2RlZmluZSBUWF9TVEFUX0NUTF9PV05FUl9TSEYgICAgICAgICAgIDMwCisjZGVmaW5lIFRYX1NUQVRfQ1RMX09XTkVSX01TSyAgICAgICAgICAgKDB4MyA8PCBUWF9TVEFUX0NUTF9PV05FUl9TSEYpCisjZGVmaW5lIFRYX1NUQVRfQ1RMX0ZSQU1FX1NIRiAgICAgICAgICAgMjcKKyNkZWZpbmUgVFhfU1RBVF9DVExfRlJBTUVfTVNLICAgICAgICAgICAoMHg3IDw8IFRYX1NUQVRfQ1RMX0ZSQU1FX1NIRikKKyNkZWZpbmUgVFhfU1RBVF9DVExfU1RBVFVTX1NIRiAgICAgICAgICAxMQorI2RlZmluZSBUWF9TVEFUX0NUTF9TVEFUVVNfTVNLICAgICAgICAgICgweDFmZmZmIDw8IFRYX1NUQVRfQ1RMX1NUQVRVU19TSEYpCisjZGVmaW5lIFRYX1NUQVRfQ1RMX0xFTkdUSF9TSEYgICAgICAgICAgMAorI2RlZmluZSBUWF9TVEFUX0NUTF9MRU5HVEhfTVNLICAgICAgICAgICgweDdmZiA8PCBUWF9TVEFUX0NUTF9MRU5HVEhfU0hGKQorCisjZGVmaW5lIFRYX1NUQVRfQ1RMX0VSUk9SX01TSyAgICAgICAgICAgKChUWF9TVEFUVVNfU1FfRVJSICAgICAgfCAgICAgXAorCQkJCQkgIFRYX1NUQVRVU19UWF9IQUxURUQgICB8ICAgICBcCisJCQkJCSAgVFhfU1RBVFVTX1RYX1BBUiAgICAgIHwgICAgIFwKKwkJCQkJICBUWF9TVEFUVVNfTEFURV9DT0xMICAgfCAgICAgXAorCQkJCQkgIFRYX1NUQVRVU19MX0NBUlIgICAgICB8ICAgICBcCisJCQkJCSAgVFhfU1RBVFVTX0VYX0RFRkVSICAgIHwgICAgIFwKKwkJCQkJICBUWF9TVEFUVVNfVU5ERVIgICAgICAgfCAgICAgXAorCQkJCQkgIFRYX1NUQVRVU19QQVVTRUQgICAgICB8ICAgICBcCisJCQkJCSAgVFhfU1RBVFVTX1RYX0RFRkVSUkVEIHwgICAgIFwKKwkJCQkJICBUWF9TVEFUVVNfRVhfQ09MTCAgICAgfCAgICAgXAorCQkJCQkgIFRYX1NUQVRVU19UWF9DT0xMX01TSykgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgVFhfU1RBVF9DVExfU1RBVFVTX1NIRikKKyNkZWZpbmUgVFhfU1RBVF9DVExfSU5UX0FGVEVSX1RYICAgICAgICAweDQKKworLyogUnggU3RhdHVzL0NvbnRyb2wuICovCisjZGVmaW5lIFJYX1NUQVRfQ1RMX09XTkVSX1NIRiAgICAgICAgICAgMzAKKyNkZWZpbmUgUlhfU1RBVF9DVExfT1dORVJfTVNLICAgICAgICAgICAoMHgzIDw8IFJYX1NUQVRfQ1RMX09XTkVSX1NIRikKKyNkZWZpbmUgUlhfU1RBVF9DVExfU1RBVFVTX1NIRiAgICAgICAgICAxMQorI2RlZmluZSBSWF9TVEFUX0NUTF9TVEFUVVNfTVNLICAgICAgICAgICgweGZmZmYgPDwgUlhfU1RBVF9DVExfU1RBVFVTX1NIRikKKyNkZWZpbmUgUlhfU1RBVF9DVExfTEVOR1RIX1NIRiAgICAgICAgICAwCisjZGVmaW5lIFJYX1NUQVRfQ1RMX0xFTkdUSF9NU0sgICAgICAgICAgKDB4N2ZmIDw8IFJYX1NUQVRfQ1RMX0xFTkdUSF9TSEYpCisKKworCisvKiBUaGUgU0FBOTczMCAoTEFOKSBjb250cm9sbGVyIHJlZ2lzdGVyIG1hcCwgYXMgc2VlbiB2aWEgdGhlIFBDSS1idXMuICovCisjZGVmaW5lIFNBQTk3MzBfTEFOX1JFR1NfQUREUiAgIDB4MjA0MDAKKworc3RydWN0IGxhbl9zYWE5NzMwX3JlZ21hcCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IFR4QnVmZkE7CQkJLyogMHgyMDQwMCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBUeEJ1ZmZCOwkJCS8qIDB4MjA0MDQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgUnhCdWZmQTsJCQkvKiAweDIwNDA4ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IFJ4QnVmZkI7CQkJLyogMHgyMDQwYyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBQYWNrZXRDb3VudDsJCS8qIDB4MjA0MTAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgT2syVXNlOwkJCS8qIDB4MjA0MTQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgTGFuRG1hQ3RsOwkJLyogMHgyMDQxOCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBUaW1lb3V0OwkJCS8qIDB4MjA0MWMgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRG1hU3RhdHVzOwkJLyogMHgyMDQyMCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBEbWFUZXN0OwkJCS8qIDB4MjA0MjQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGZpbGxlcjIwNDI4WzB4MjA0MzAgLSAweDIwNDI4XTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgUGF1c2VDb3VudDsJCS8qIDB4MjA0MzAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgUmVtb3RlUGF1c2VDb3VudDsJCS8qIDB4MjA0MzQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGZpbGxlcjIwNDM4WzB4MjA0NDAgLSAweDIwNDM4XTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgTWFjQ3RsOwkJCS8qIDB4MjA0NDAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgQ2FtQ3RsOwkJCS8qIDB4MjA0NDQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgVHhDdGw7CQkJLyogMHgyMDQ0OCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBUeFN0YXR1czsJCQkvKiAweDIwNDRjICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IFJ4Q3RsOwkJCS8qIDB4MjA0NTAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgUnhTdGF0dXM7CQkJLyogMHgyMDQ1NCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBTdGF0aW9uTWdtdERhdGE7CQkvKiAweDIwNDU4ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IFN0YXRpb25NZ210Q3RsOwkJLyogMHgyMDQ1YyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBDYW1BZGRyZXNzOwkJLyogMHgyMDQ2MCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBDYW1EYXRhOwkJCS8qIDB4MjA0NjQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgQ2FtRW5hYmxlOwkJLyogMHgyMDQ2OCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZmlsbGVyMjA0NmNbMHgyMDUwMCAtIDB4MjA0NmNdOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBEZWJ1Z1BDSU1hc3RlckFkZHI7CS8qIDB4MjA1MDAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRGVidWdMYW5UeFN0YXRlTWFjaGluZTsJLyogMHgyMDUwNCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBEZWJ1Z0xhblJ4U3RhdGVNYWNoaW5lOwkvKiAweDIwNTA4ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IERlYnVnTGFuVHhGaWZvUG9pbnRlcnM7CS8qIDB4MjA1MGMgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRGVidWdMYW5SeEZpZm9Qb2ludGVyczsJLyogMHgyMDUxMCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBEZWJ1Z0xhbkN0bFN0YXRlTWFjaGluZTsJLyogMHgyMDUxNCAqLworfTsKK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0IGxhbl9zYWE5NzMwX3JlZ21hcCB0X2xhbl9zYWE5NzMwX3JlZ21hcDsKKworCisvKiBFVk0gaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBFVk1fTEFOX0lOVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgRVZNX01BU1RFUl9FTiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisKKy8qIFRoZSBTQUE5NzMwIChFVk0pIGNvbnRyb2xsZXIgcmVnaXN0ZXIgbWFwLCBhcyBzZWVuIHZpYSB0aGUgUENJLWJ1cy4gKi8KKyNkZWZpbmUgU0FBOTczMF9FVk1fUkVHU19BRERSICAgMHgwMjAwMAorCitzdHJ1Y3QgZXZtX3NhYTk3MzBfcmVnbWFwIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgSW50ZXJydXB0U3RhdHVzMTsJCS8qIDB4MjAwMCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBJbnRlcnJ1cHRFbmFibGUxOwkJLyogMHgyMDA0ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IEludGVycnVwdE1vbml0b3IxOwkvKiAweDIwMDggKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgQ291bnRlcjsJCQkvKiAweDIwMGMgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgQ291bnRlclRocmVzaG9sZDsJCS8qIDB4MjAxMCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBDb3VudGVyQ29udHJvbDsJCS8qIDB4MjAxNCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBHcGlvQ29udHJvbDE7CQkvKiAweDIwMTggKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgSW50ZXJydXB0U3RhdHVzMjsJCS8qIDB4MjAxYyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBJbnRlcnJ1cHRFbmFibGUyOwkJLyogMHgyMDIwICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IEludGVycnVwdE1vbml0b3IyOwkvKiAweDIwMjQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgR3Bpb0NvbnRyb2wyOwkJLyogMHgyMDI4ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IEludGVycnVwdEJsb2NrMTsJCS8qIDB4MjAyYyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBJbnRlcnJ1cHRCbG9jazI7CQkvKiAweDIwMzAgKi8KK307Cit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCBldm1fc2FhOTczMF9yZWdtYXAgdF9ldm1fc2FhOTczMF9yZWdtYXA7CisKKworc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgeworCS8qIFBvaW50ZXIgZm9yIHRoZSBTQUE5NzMwIExBTiBjb250cm9sbGVyIHJlZ2lzdGVyIHNldC4gKi8KKwl0X2xhbl9zYWE5NzMwX3JlZ21hcCAqbGFuX3NhYTk3MzBfcmVnczsKKworCS8qIFBvaW50ZXIgdG8gdGhlIFNBQTk3MzAgRVZNIHJlZ2lzdGVyLiAqLworCXRfZXZtX3NhYTk3MzBfcmVnbWFwICpldm1fc2FhOTczMF9yZWdzOworCisJLyogVFJVRSBpZiB0aGUgbmV4dCBidWZmZXIgdG8gd3JpdGUgaXMgUnhCdWZmQSwgIEZBTFNFIGlmIFJ4QnVmZkIuICovCisJdW5zaWduZWQgY2hhciBOZXh0UmN2VG9Vc2VJc0E7CisJLyogUmN2IGJ1ZmZlciBJbmRleC4gKi8KKwl1bnNpZ25lZCBjaGFyIE5leHRSY3ZQYWNrZXRJbmRleDsKKworCS8qIEluZGV4IG9mIG5leHQgcGFja2V0IHRvIHVzZSBpbiB0aGF0IGJ1ZmZlci4gKi8KKwl1bnNpZ25lZCBjaGFyIE5leHRUeG1QYWNrZXRJbmRleDsKKwkvKiBOZXh0IGJ1ZmZlciBpbmRleC4gKi8KKwl1bnNpZ25lZCBjaGFyIE5leHRUeG1CdWZmZXJJbmRleDsKKworCS8qIEluZGV4IG9mIGZpcnN0IHBlbmRpbmcgcGFja2V0IHJlYWR5IHRvIHNlbmQuICovCisJdW5zaWduZWQgY2hhciBQZW5kaW5nVHhtUGFja2V0SW5kZXg7CisJLyogUGVuZGluZyBidWZmZXIgaW5kZXguICovCisJdW5zaWduZWQgY2hhciBQZW5kaW5nVHhtQnVmZmVySW5kZXg7CisKKwl1bnNpZ25lZCBjaGFyIERtYVJjdlBhY2tldHM7CisJdW5zaWduZWQgY2hhciBEbWFUeG1QYWNrZXRzOworCisJdW5zaWduZWQgY2hhciBSY3ZBSW5kZXg7CS8qIGluZGV4IGludG8gUmN2QnVmZmVyU3BhY2VbXSBmb3IgQmxrIEEgKi8KKwl1bnNpZ25lZCBjaGFyIFJjdkJJbmRleDsJLyogaW5kZXggaW50byBSY3ZCdWZmZXJTcGFjZVtdIGZvciBCbGsgQiAqLworCisJdW5zaWduZWQgaW50CisJICAgIFR4bUJ1ZmZlcltMQU5fU0FBOTczMF9CVUZGRVJTXVtMQU5fU0FBOTczMF9UWE1fUV9TSVpFXTsKKwl1bnNpZ25lZCBpbnQKKwkgICAgUmN2QnVmZmVyW0xBTl9TQUE5NzMwX0JVRkZFUlNdW0xBTl9TQUE5NzMwX1JDVl9RX1NJWkVdOworCXVuc2lnbmVkIGludCBUeEJ1ZmZlckZyZWVbTEFOX1NBQTk3MzBfQlVGRkVSU107CisKKwl1bnNpZ25lZCBjaGFyIFBoeXNpY2FsQWRkcmVzc1tMQU5fU0FBOTczMF9DQU1fRU5UUklFU11bNl07CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCisjZW5kaWYgLyogX1NBQTk3MzBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2IxMDAwLmMgYi9kcml2ZXJzL25ldC9zYjEwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTUzNjljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2IxMDAwLmMKQEAgLTAsMCArMSwxMjAyIEBACisvKiBzYjEwMDAuYzogQSBHZW5lcmFsIEluc3RydW1lbnRzIFNCMTAwMCBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKwlXcml0dGVuIDE5OTggYnkgRnJhbmNvIFZlbnR1cmkuCisKKwlDb3B5cmlnaHQgMTk5OCBieSBGcmFuY28gVmVudHVyaS4KKwlDb3B5cmlnaHQgMTk5NCwxOTk1IGJ5IERvbmFsZCBCZWNrZXIuCisJQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisKKwlUaGlzIGRyaXZlciBpcyBmb3IgdGhlIEdlbmVyYWwgSW5zdHJ1bWVudHMgU0IxMDAwIChpbnRlcm5hbCBTVVJGYm9hcmQpCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGZ2ZW50dXJpQG1lZGlhb25lLm5ldAorCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CisJYW5kL29yICBtb2RpZnkgaXQgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsCisJUHVibGljICBMaWNlbnNlIGFzICBwdWJsaXNoZWQgIGJ5ICB0aGUgIEZyZWUgIFNvZnR3YXJlCisJRm91bmRhdGlvbjsgIGVpdGhlciAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgKGF0CisJeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJQ2hhbmdlczoKKworCTk4MTExNSBTdGV2ZW4gSGlyc2NoIDxzaGlyc2NoQGFkZWxwaGlhLm5ldD4KKworCUxpbnVzIGNoYW5nZWQgdGhlIHRpbWVyIGludGVyZmFjZS4gIFNob3VsZCB3b3JrIG9uIGFsbCByZWNlbnQKKwlkZXZlbG9wbWVudCBrZXJuZWxzLgorCisJOTgwNjA4IFN0ZXZlbiBIaXJzY2ggPHNoaXJzY2hAYWRlbHBoaWEubmV0PgorCisJU21hbGwgY2hhbmdlcyB0byBtYWtlIGl0IHdvcmsgd2l0aCAyLjEueCBrZXJuZWxzLiBIb3BlZnVsbHksCisJbm90aGluZyBtYWpvciB3aWxsIGNoYW5nZSBiZWZvcmUgb2ZmaWNpYWwgcmVsZWFzZSBvZiBMaW51eCAyLjIuCisJCisJTWVyZ2VkIHdpdGggMi4yIC0gQWxhbiBDb3gKKyovCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSA9ICJzYjEwMDAuYzp2MS4xLjIgNi8wMS85OCAoZnZlbnR1cmlAbWVkaWFvbmUubmV0KVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfY2FibGVtb2RlbS5oPiAvKiBmb3IgU0lPR0NNL1NJT1NDTSBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIGZvciB1ZGVsYXkoKSAqLworI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG5wLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBTQjEwMDBfREVCVUcKK3N0YXRpYyBpbnQgc2IxMDAwX2RlYnVnID0gU0IxMDAwX0RFQlVHOworI2Vsc2UKK3N0YXRpYyBpbnQgc2IxMDAwX2RlYnVnID0gMTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgaW50IFNCMTAwMF9JT19FWFRFTlQgPSA4OworLyogU0IxMDAwIE1heGltdW0gUmVjZWl2ZSBVbml0ICovCitzdGF0aWMgY29uc3QgaW50IFNCMTAwMF9NUlUgPSAxNTAwOyAvKiBvY3RlY3RzICovCisKKyNkZWZpbmUgTlBJRFMgNAorc3RydWN0IHNiMTAwMF9wcml2YXRlIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiW05QSURTXTsKKwlzaG9ydCByeF9kbGVuW05QSURTXTsKKwl1bnNpZ25lZCBpbnQgcnhfZnJhbWVzOworCXNob3J0IHJ4X2Vycm9yX2NvdW50OworCXNob3J0IHJ4X2Vycm9yX2RwY19jb3VudDsKKwl1bnNpZ25lZCBjaGFyIHJ4X3Nlc3Npb25faWRbTlBJRFNdOworCXVuc2lnbmVkIGNoYXIgcnhfZnJhbWVfaWRbTlBJRFNdOworCXVuc2lnbmVkIGNoYXIgcnhfcGt0X3R5cGVbTlBJRFNdOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworfTsKKworLyogcHJvdG90eXBlcyBmb3IgTGludXggaW50ZXJmYWNlICovCitleHRlcm4gaW50IHNiMTAwMF9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2IxMDAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNiMTAwMF9kZXZfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgc2IxMDAwX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc2IxMDAwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2IxMDAwX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzYjEwMDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworLyogU0IxMDAwIGhhcmR3YXJlIHJvdXRpbmVzIHRvIGJlIHVzZWQgZHVyaW5nIG9wZW4vY29uZmlndXJhdGlvbiBwaGFzZXMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuaWNlZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7CitzdGF0aWMgaW5saW5lIGludCBjYXJkX3dhaXRfZm9yX2J1c3lfY2xlYXIoY29uc3QgaW50IGlvYWRkcltdLAorCWNvbnN0IGNoYXIqIG5hbWUpOworc3RhdGljIGlubGluZSBpbnQgY2FyZF93YWl0X2Zvcl9yZWFkeShjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCisJdW5zaWduZWQgY2hhciBpbltdKTsKK3N0YXRpYyBpbmxpbmUgaW50IGNhcmRfc2VuZF9jb21tYW5kKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwKKwljb25zdCB1bnNpZ25lZCBjaGFyIG91dFtdLCB1bnNpZ25lZCBjaGFyIGluW10pOworCisvKiBTQjEwMDAgaGFyZHdhcmUgcm91dGluZXMgdG8gYmUgdXNlZCBkdXJpbmcgZnJhbWUgcnggaW50ZXJydXB0ICovCitzdGF0aWMgaW5saW5lIGludCBzYjEwMDBfd2FpdF9mb3JfcmVhZHkoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKTsKK3N0YXRpYyBpbmxpbmUgaW50IHNiMTAwMF93YWl0X2Zvcl9yZWFkeV9jbGVhcihjb25zdCBpbnQgaW9hZGRyW10sCisJY29uc3QgY2hhciogbmFtZSk7CitzdGF0aWMgaW5saW5lIHZvaWQgc2IxMDAwX3NlbmRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCisJY29uc3QgdW5zaWduZWQgY2hhciBvdXRbXSk7CitzdGF0aWMgaW5saW5lIHZvaWQgc2IxMDAwX3JlYWRfc3RhdHVzKGNvbnN0IGludCBpb2FkZHJbXSwgdW5zaWduZWQgY2hhciBpbltdKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYjEwMDBfaXNzdWVfcmVhZF9jb21tYW5kKGNvbnN0IGludCBpb2FkZHJbXSwKKwljb25zdCBjaGFyKiBuYW1lKTsKKworLyogU0IxMDAwIGNvbW1hbmRzIGZvciBvcGVuL2NvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNiMTAwMF9yZXNldChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpOworc3RhdGljIGlubGluZSBpbnQgc2IxMDAwX2NoZWNrX0NSQyhjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpOworc3RhdGljIGlubGluZSBpbnQgc2IxMDAwX3N0YXJ0X2dldF9zZXRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sCisJY29uc3QgY2hhciogbmFtZSk7CitzdGF0aWMgaW5saW5lIGludCBzYjEwMDBfZW5kX2dldF9zZXRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sCisJY29uc3QgY2hhciogbmFtZSk7CitzdGF0aWMgaW5saW5lIGludCBzYjEwMDBfYWN0aXZhdGUoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKTsKK3N0YXRpYyBpbnQgc2IxMDAwX2dldF9maXJtd2FyZV92ZXJzaW9uKGNvbnN0IGludCBpb2FkZHJbXSwKKwljb25zdCBjaGFyKiBuYW1lLCB1bnNpZ25lZCBjaGFyIHZlcnNpb25bXSwgaW50IGRvX2VuZCk7CitzdGF0aWMgaW50IHNiMTAwMF9nZXRfZnJlcXVlbmN5KGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwKKwlpbnQqIGZyZXF1ZW5jeSk7CitzdGF0aWMgaW50IHNiMTAwMF9zZXRfZnJlcXVlbmN5KGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwKKwlpbnQgZnJlcXVlbmN5KTsKK3N0YXRpYyBpbnQgc2IxMDAwX2dldF9QSURzKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwKKwlzaG9ydCBQSURbXSk7CitzdGF0aWMgaW50IHNiMTAwMF9zZXRfUElEcyhjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCisJY29uc3Qgc2hvcnQgUElEW10pOworCisvKiBTQjEwMDAgY29tbWFuZHMgZm9yIGZyYW1lIHJ4IGludGVycnVwdCAqLworc3RhdGljIGlubGluZSBpbnQgc2IxMDAwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlubGluZSB2b2lkIHNiMTAwMF9lcnJvcl9kcGMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCBzYjEwMDBfcG5wX2lkc1tdID0geworCXsgIkdJQzEwMDAiLCAwIH0sCisJeyAiIiwgMCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIHNiMTAwMF9wbnBfaWRzKTsKKworc3RhdGljIGludAorc2IxMDAwX3Byb2JlX29uZShzdHJ1Y3QgcG5wX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyWzJdLCBpcnE7CisJdW5zaWduZWQgaW50IHNlcmlhbF9udW1iZXI7CisJaW50IGVycm9yID0gLUVOT0RFVjsKKwkKKwlpZiAocG5wX2RldmljZV9hdHRhY2gocGRldikgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAocG5wX2FjdGl2YXRlX2RldihwZGV2KSA8IDApCisJCWdvdG8gb3V0X2RldGFjaDsKKworCWlmICghcG5wX3BvcnRfdmFsaWQocGRldiwgMCkgfHwgIXBucF9wb3J0X3ZhbGlkKHBkZXYsIDEpKQorCQlnb3RvIG91dF9kaXNhYmxlOworCWlmICghcG5wX2lycV92YWxpZChwZGV2LCAwKSkKKwkJZ290byBvdXRfZGlzYWJsZTsKKwkJCisJc2VyaWFsX251bWJlciA9IHBkZXYtPmNhcmQtPnNlcmlhbDsKKwkJCisJaW9hZGRyWzBdID0gcG5wX3BvcnRfc3RhcnQocGRldiwgMCk7CisJaW9hZGRyWzFdID0gcG5wX3BvcnRfc3RhcnQocGRldiwgMCk7CisJCQorCWlycSA9IHBucF9pcnEocGRldiwgMCk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkclswXSwgMTYsICJzYjEwMDAiKSkKKwkJZ290byBvdXRfZGlzYWJsZTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkclsxXSwgMTYsICJzYjEwMDAiKSkKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb24wOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBzYjEwMDBfcHJpdmF0ZSkpOworCWlmICghZGV2KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb25zOworCX0KKworCQkgCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHJbMF07CisJLyogbWVtX3N0YXJ0IGhvbGRzIHRoZSBzZWNvbmQgSS9PIGFkZHJlc3MgKi8KKwlkZXYtPm1lbV9zdGFydCA9IGlvYWRkclsxXTsKKwlkZXYtPmlycSA9IGlycTsKKworCWlmIChzYjEwMDBfZGVidWcgPiAwKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBzYjEwMDAgYXQgKCUjMy4zbHgsJSMzLjNseCksICIKKwkJCSJTL04gJSM4Ljh4LCBJUlEgJWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLAorCQkJZGV2LT5tZW1fc3RhcnQsIHNlcmlhbF9udW1iZXIsIGRldi0+aXJxKTsKKworCS8qCisJICogVGhlIFNCMTAwMCBpcyBhbiByeC1vbmx5IGNhYmxlIG1vZGVtIGRldmljZS4gIFRoZSB1cGxpbmsgaXMgYSBtb2RlbQorCSAqIGFuZCB3ZSBkbyBub3Qgd2FudCB0byBhcnAgb24gaXQuCisJICovCisJZGV2LT5mbGFncyA9IElGRl9QT0lOVE9QT0lOVHxJRkZfTk9BUlA7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWlmIChzYjEwMDBfZGVidWcgPiAwKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIiwgdmVyc2lvbik7CisKKwkvKiBUaGUgU0IxMDAwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuCQk9IHNiMTAwMF9vcGVuOworCWRldi0+ZG9faW9jdGwJCT0gc2IxMDAwX2Rldl9pb2N0bDsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHNiMTAwMF9zdGFydF94bWl0OworCWRldi0+c3RvcAkJPSBzYjEwMDBfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMJCT0gc2IxMDAwX3N0YXRzOworCisJLyogaGFyZHdhcmUgYWRkcmVzcyBpcyAwOjA6c2VyaWFsX251bWJlciAqLworCWRldi0+ZGV2X2FkZHJbMl0JPSBzZXJpYWxfbnVtYmVyID4+IDI0ICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzNdCT0gc2VyaWFsX251bWJlciA+PiAxNiAmIDB4ZmY7CisJZGV2LT5kZXZfYWRkcls0XQk9IHNlcmlhbF9udW1iZXIgPj4gIDggJiAweGZmOworCWRldi0+ZGV2X2FkZHJbNV0JPSBzZXJpYWxfbnVtYmVyID4+ICAwICYgMHhmZjsKKworCXBucF9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJZXJyb3IgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2ZyZWVfbmV0ZGV2OworCXJldHVybiAwOworCisgb3V0X2ZyZWVfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7Cisgb3V0X3JlbGVhc2VfcmVnaW9uczoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHJbMV0sIDE2KTsKKyBvdXRfcmVsZWFzZV9yZWdpb24wOgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkclswXSwgMTYpOworIG91dF9kaXNhYmxlOgorCXBucF9kaXNhYmxlX2RldihwZGV2KTsKKyBvdXRfZGV0YWNoOgorCXBucF9kZXZpY2VfZGV0YWNoKHBkZXYpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQKK3NiMTAwMF9yZW1vdmVfb25lKHN0cnVjdCBwbnBfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwbnBfZ2V0X2RydmRhdGEocGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCAxNik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5tZW1fc3RhcnQsIDE2KTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgc2IxMDAwX2RyaXZlciA9IHsKKwkubmFtZQkJPSAic2IxMDAwIiwKKwkuaWRfdGFibGUJPSBzYjEwMDBfcG5wX2lkcywKKwkucHJvYmUJCT0gc2IxMDAwX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IHNiMTAwMF9yZW1vdmVfb25lLAorfTsKKworDAorLyoKKyAqIFNCMTAwMCBoYXJkd2FyZSByb3V0aW5lcyB0byBiZSB1c2VkIGR1cmluZyBvcGVuL2NvbmZpZ3VyYXRpb24gcGhhc2VzCisgKi8KKworc3RhdGljIGNvbnN0IGludCBUaW1lT3V0SmlmZmllcyA9ICg4NzUgKiBIWikgLyAxMDA7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuaWNlZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKK3sKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZV90aW1lb3V0KEhaKTsKKwlyZXR1cm47Cit9CisKKy8qIENhcmQgV2FpdCBGb3IgQnVzeSBDbGVhciAoY2Fubm90IGJlIHVzZWQgZHVyaW5nIGFuIGludGVycnVwdCkgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitjYXJkX3dhaXRfZm9yX2J1c3lfY2xlYXIoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKQoreworCXVuc2lnbmVkIGNoYXIgYTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlhID0gaW5iKGlvYWRkclswXSArIDcpOworCXRpbWVvdXQgPSBqaWZmaWVzICsgVGltZU91dEppZmZpZXM7CisJd2hpbGUgKGEgJiAweDgwIHx8IGEgJiAweDQwKSB7CisJCS8qIGEgbGl0dGxlIHNsZWVwICovCisJCXlpZWxkKCk7CisKKwkJYSA9IGluYihpb2FkZHJbMF0gKyA3KTsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYXJkX3dhaXRfZm9yX2J1c3lfY2xlYXIgdGltZW91dFxuIiwKKwkJCQluYW1lKTsKKwkJCXJldHVybiAtRVRJTUU7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FyZCBXYWl0IEZvciBSZWFkeSAoY2Fubm90IGJlIHVzZWQgZHVyaW5nIGFuIGludGVycnVwdCkgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitjYXJkX3dhaXRfZm9yX3JlYWR5KGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwgdW5zaWduZWQgY2hhciBpbltdKQoreworCXVuc2lnbmVkIGNoYXIgYTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlhID0gaW5iKGlvYWRkclsxXSArIDYpOworCXRpbWVvdXQgPSBqaWZmaWVzICsgVGltZU91dEppZmZpZXM7CisJd2hpbGUgKGEgJiAweDgwIHx8ICEoYSAmIDB4NDApKSB7CisJCS8qIGEgbGl0dGxlIHNsZWVwICovCisJCXlpZWxkKCk7CisKKwkJYSA9IGluYihpb2FkZHJbMV0gKyA2KTsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYXJkX3dhaXRfZm9yX3JlYWR5IHRpbWVvdXRcbiIsCisJCQkJbmFtZSk7CisJCQlyZXR1cm4gLUVUSU1FOworCQl9CisJfQorCisJaW5bMV0gPSBpbmIoaW9hZGRyWzBdICsgMSk7CisJaW5bMl0gPSBpbmIoaW9hZGRyWzBdICsgMik7CisJaW5bM10gPSBpbmIoaW9hZGRyWzBdICsgMyk7CisJaW5bNF0gPSBpbmIoaW9hZGRyWzBdICsgNCk7CisJaW5bMF0gPSBpbmIoaW9hZGRyWzBdICsgNSk7CisJaW5bNl0gPSBpbmIoaW9hZGRyWzBdICsgNik7CisJaW5bNV0gPSBpbmIoaW9hZGRyWzFdICsgNik7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhcmQgU2VuZCBDb21tYW5kIChjYW5ub3QgYmUgdXNlZCBkdXJpbmcgYW4gaW50ZXJydXB0KSAqLworc3RhdGljIGlubGluZSBpbnQKK2NhcmRfc2VuZF9jb21tYW5kKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwKKwljb25zdCB1bnNpZ25lZCBjaGFyIG91dFtdLCB1bnNpZ25lZCBjaGFyIGluW10pCit7CisJaW50IHN0YXR1cywgeDsKKworCWlmICgoc3RhdHVzID0gY2FyZF93YWl0X2Zvcl9idXN5X2NsZWFyKGlvYWRkciwgbmFtZSkpKQorCQlyZXR1cm4gc3RhdHVzOworCW91dGIoMHhhMCwgaW9hZGRyWzBdICsgNik7CisJb3V0YihvdXRbMl0sIGlvYWRkclswXSArIDEpOworCW91dGIob3V0WzNdLCBpb2FkZHJbMF0gKyAyKTsKKwlvdXRiKG91dFs0XSwgaW9hZGRyWzBdICsgMyk7CisJb3V0YihvdXRbNV0sIGlvYWRkclswXSArIDQpOworCW91dGIob3V0WzFdLCBpb2FkZHJbMF0gKyA1KTsKKwlvdXRiKDB4YTAsIGlvYWRkclswXSArIDYpOworCW91dGIob3V0WzBdLCBpb2FkZHJbMF0gKyA3KTsKKwlpZiAob3V0WzBdICE9IDB4MjAgJiYgb3V0WzBdICE9IDB4MzApIHsKKwkJaWYgKChzdGF0dXMgPSBjYXJkX3dhaXRfZm9yX3JlYWR5KGlvYWRkciwgbmFtZSwgaW4pKSkKKwkJCXJldHVybiBzdGF0dXM7CisJCWluYihpb2FkZHJbMF0gKyA3KTsKKwkJaWYgKHNiMTAwMF9kZWJ1ZyA+IDMpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNhcmRfc2VuZF9jb21tYW5kICIKKwkJCQkib3V0OiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggICIKKwkJCQkiaW46ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsIG5hbWUsCisJCQkJb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs1XSwKKwkJCQlpblswXSwgaW5bMV0sIGluWzJdLCBpblszXSwgaW5bNF0sIGluWzVdLCBpbls2XSk7CisJfSBlbHNlIHsKKwkJaWYgKHNiMTAwMF9kZWJ1ZyA+IDMpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNhcmRfc2VuZF9jb21tYW5kICIKKwkJCQkib3V0OiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsIG5hbWUsCisJCQkJb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs1XSk7CisJfQorCisJaWYgKG91dFsxXSA9PSAweDFiKSB7CisJCXggPSAob3V0WzJdID09IDB4MDIpOworCX0gZWxzZSB7CisJCWlmIChvdXRbMF0gPj0gMHg4MCAmJiBpblswXSAhPSAob3V0WzFdIHwgMHg4MCkpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKwwKKy8qCisgKiBTQjEwMDAgaGFyZHdhcmUgcm91dGluZXMgdG8gYmUgdXNlZCBkdXJpbmcgZnJhbWUgcnggaW50ZXJydXB0CisgKi8KK3N0YXRpYyBjb25zdCBpbnQgU2IxMDAwVGltZU91dEppZmZpZXMgPSA3ICogSFo7CisKKy8qIENhcmQgV2FpdCBGb3IgUmVhZHkgKHRvIGJlIHVzZWQgZHVyaW5nIGZyYW1lIHJ4KSAqLworc3RhdGljIGlubGluZSBpbnQKK3NiMTAwMF93YWl0X2Zvcl9yZWFkeShjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJdGltZW91dCA9IGppZmZpZXMgKyBTYjEwMDBUaW1lT3V0SmlmZmllczsKKwl3aGlsZSAoaW5iKGlvYWRkclsxXSArIDYpICYgMHg4MCkgeworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNiMTAwMF93YWl0X2Zvcl9yZWFkeSB0aW1lb3V0XG4iLAorCQkJCW5hbWUpOworCQkJcmV0dXJuIC1FVElNRTsKKwkJfQorCX0KKwl0aW1lb3V0ID0gamlmZmllcyArIFNiMTAwMFRpbWVPdXRKaWZmaWVzOworCXdoaWxlICghKGluYihpb2FkZHJbMV0gKyA2KSAmIDB4NDApKSB7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2IxMDAwX3dhaXRfZm9yX3JlYWR5IHRpbWVvdXRcbiIsCisJCQkJbmFtZSk7CisJCQlyZXR1cm4gLUVUSU1FOworCQl9CisJfQorCWluYihpb2FkZHJbMF0gKyA3KTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2FyZCBXYWl0IEZvciBSZWFkeSBDbGVhciAodG8gYmUgdXNlZCBkdXJpbmcgZnJhbWUgcngpICovCitzdGF0aWMgaW5saW5lIGludAorc2IxMDAwX3dhaXRfZm9yX3JlYWR5X2NsZWFyKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIFNiMTAwMFRpbWVPdXRKaWZmaWVzOworCXdoaWxlIChpbmIoaW9hZGRyWzFdICsgNikgJiAweDgwKSB7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2IxMDAwX3dhaXRfZm9yX3JlYWR5X2NsZWFyIHRpbWVvdXRcbiIsCisJCQkJbmFtZSk7CisJCQlyZXR1cm4gLUVUSU1FOworCQl9CisJfQorCXRpbWVvdXQgPSBqaWZmaWVzICsgU2IxMDAwVGltZU91dEppZmZpZXM7CisJd2hpbGUgKGluYihpb2FkZHJbMV0gKyA2KSAmIDB4NDApIHsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBzYjEwMDBfd2FpdF9mb3JfcmVhZHlfY2xlYXIgdGltZW91dFxuIiwKKwkJCQluYW1lKTsKKwkJCXJldHVybiAtRVRJTUU7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENhcmQgU2VuZCBDb21tYW5kICh0byBiZSB1c2VkIGR1cmluZyBmcmFtZSByeCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2IxMDAwX3NlbmRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCisJY29uc3QgdW5zaWduZWQgY2hhciBvdXRbXSkKK3sKKwlvdXRiKG91dFsyXSwgaW9hZGRyWzBdICsgMSk7CisJb3V0YihvdXRbM10sIGlvYWRkclswXSArIDIpOworCW91dGIob3V0WzRdLCBpb2FkZHJbMF0gKyAzKTsKKwlvdXRiKG91dFs1XSwgaW9hZGRyWzBdICsgNCk7CisJb3V0YihvdXRbMV0sIGlvYWRkclswXSArIDUpOworCW91dGIob3V0WzBdLCBpb2FkZHJbMF0gKyA3KTsKKwlpZiAoc2IxMDAwX2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzYjEwMDBfc2VuZF9jb21tYW5kIG91dDogJTAyeCUwMnglMDJ4JTAyeCIKKwkJCSIlMDJ4JTAyeFxuIiwgbmFtZSwgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs1XSk7CisJcmV0dXJuOworfQorCisvKiBDYXJkIFJlYWQgU3RhdHVzICh0byBiZSB1c2VkIGR1cmluZyBmcmFtZSByeCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2IxMDAwX3JlYWRfc3RhdHVzKGNvbnN0IGludCBpb2FkZHJbXSwgdW5zaWduZWQgY2hhciBpbltdKQoreworCWluWzFdID0gaW5iKGlvYWRkclswXSArIDEpOworCWluWzJdID0gaW5iKGlvYWRkclswXSArIDIpOworCWluWzNdID0gaW5iKGlvYWRkclswXSArIDMpOworCWluWzRdID0gaW5iKGlvYWRkclswXSArIDQpOworCWluWzBdID0gaW5iKGlvYWRkclswXSArIDUpOworCXJldHVybjsKK30KKworLyogSXNzdWUgUmVhZCBDb21tYW5kICh0byBiZSB1c2VkIGR1cmluZyBmcmFtZSByeCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2IxMDAwX2lzc3VlX3JlYWRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMFs2XSA9IHsweDIwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwfTsKKworCXNiMTAwMF93YWl0X2Zvcl9yZWFkeV9jbGVhcihpb2FkZHIsIG5hbWUpOworCW91dGIoMHhhMCwgaW9hZGRyWzBdICsgNik7CisJc2IxMDAwX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwKTsKKwlyZXR1cm47Cit9CisKKwwKKy8qCisgKiBTQjEwMDAgY29tbWFuZHMgZm9yIG9wZW4vY29uZmlndXJhdGlvbgorICovCisvKiByZXNldCBTQjEwMDAgY2FyZCAqLworc3RhdGljIGlubGluZSBpbnQKK3NiMTAwMF9yZXNldChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJdW5zaWduZWQgY2hhciBzdFs3XTsKKwlpbnQgcG9ydCwgc3RhdHVzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHgxNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKKwlwb3J0ID0gaW9hZGRyWzFdICsgNjsKKwlvdXRiKDB4NCwgcG9ydCk7CisJaW5iKHBvcnQpOworCXVkZWxheSgxMDAwKTsKKwlvdXRiKDB4MCwgcG9ydCk7CisJaW5iKHBvcnQpOworCW5pY2VkZWxheSg2MDAwMCk7CisJb3V0YigweDQsIHBvcnQpOworCWluYihwb3J0KTsKKwl1ZGVsYXkoMTAwMCk7CisJb3V0YigweDAsIHBvcnQpOworCWluYihwb3J0KTsKKwl1ZGVsYXkoMCk7CisKKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDAsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisJaWYgKHN0WzNdICE9IDB4ZjApCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCisvKiBjaGVjayBTQjEwMDAgZmlybXdhcmUgQ1JDICovCitzdGF0aWMgaW5saW5lIGludAorc2IxMDAwX2NoZWNrX0NSQyhjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJdW5zaWduZWQgY2hhciBzdFs3XTsKKwlpbnQgY3JjLCBzdGF0dXM7CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMFs2XSA9IHsweDgwLCAweDFmLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworCS8qIGNoZWNrIENSQyAqLworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoc3RbMV0gIT0gc3RbM10gfHwgc3RbMl0gIT0gc3RbNF0pCisJCXJldHVybiAtRUlPOworCWNyYyA9IHN0WzFdIDw8IDggfCBzdFsyXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NiMTAwMF9zdGFydF9nZXRfc2V0X2NvbW1hbmQoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKQoreworCXVuc2lnbmVkIGNoYXIgc3RbN107CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMFs2XSA9IHsweDgwLCAweDFiLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworCXJldHVybiBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwLCBzdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzYjEwMDBfZW5kX2dldF9zZXRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJdW5zaWduZWQgY2hhciBzdFs3XTsKKwlpbnQgc3RhdHVzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHgxYiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMH07CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMVs2XSA9IHsweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMSwgc3QpOworfQorCitzdGF0aWMgaW5saW5lIGludAorc2IxMDAwX2FjdGl2YXRlKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0WzddOworCWludCBzdGF0dXM7CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMFs2XSA9IHsweDgwLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKwljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQxWzZdID0gezB4ODAsIDB4MTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCisJbmljZWRlbGF5KDUwMDAwKTsKKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDAsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQxLCBzdCkpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChzdFszXSAhPSAweGYxKSB7CisgICAgCWlmICgoc3RhdHVzID0gc2IxMDAwX3N0YXJ0X2dldF9zZXRfY29tbWFuZChpb2FkZHIsIG5hbWUpKSkKKwkJCXJldHVybiBzdGF0dXM7CisJCXJldHVybiAtRUlPOworCX0KKwl1ZGVsYXkoMTAwMCk7CisgICAgcmV0dXJuIHNiMTAwMF9zdGFydF9nZXRfc2V0X2NvbW1hbmQoaW9hZGRyLCBuYW1lKTsKK30KKworLyogZ2V0IFNCMTAwMCBmaXJtd2FyZSB2ZXJzaW9uICovCitzdGF0aWMgaW50CitzYjEwMDBfZ2V0X2Zpcm13YXJlX3ZlcnNpb24oY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lLAorCXVuc2lnbmVkIGNoYXIgdmVyc2lvbltdLCBpbnQgZG9fZW5kKQoreworCXVuc2lnbmVkIGNoYXIgc3RbN107CisJaW50IHN0YXR1czsKKwljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQwWzZdID0gezB4ODAsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCisJaWYgKChzdGF0dXMgPSBzYjEwMDBfc3RhcnRfZ2V0X3NldF9jb21tYW5kKGlvYWRkciwgbmFtZSkpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoc3RbMF0gIT0gMHhhMykKKwkJcmV0dXJuIC1FSU87CisJdmVyc2lvblswXSA9IHN0WzFdOworCXZlcnNpb25bMV0gPSBzdFsyXTsKKwlpZiAoZG9fZW5kKQorCQlyZXR1cm4gc2IxMDAwX2VuZF9nZXRfc2V0X2NvbW1hbmQoaW9hZGRyLCBuYW1lKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKiBnZXQgU0IxMDAwIGZyZXF1ZW5jeSAqLworc3RhdGljIGludAorc2IxMDAwX2dldF9mcmVxdWVuY3koY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQqIGZyZXF1ZW5jeSkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0WzddOworCWludCBzdGF0dXM7CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMFs2XSA9IHsweDgwLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworCXVkZWxheSgxMDAwKTsKKwlpZiAoKHN0YXR1cyA9IHNiMTAwMF9zdGFydF9nZXRfc2V0X2NvbW1hbmQoaW9hZGRyLCBuYW1lKSkpCisJCXJldHVybiBzdGF0dXM7CisJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwLCBzdCkpKQorCQlyZXR1cm4gc3RhdHVzOworCSpmcmVxdWVuY3kgPSAoKHN0WzFdIDw8IDggfCBzdFsyXSkgPDwgOCB8IHN0WzNdKSA8PCA4IHwgc3RbNF07CisJcmV0dXJuIHNiMTAwMF9lbmRfZ2V0X3NldF9jb21tYW5kKGlvYWRkciwgbmFtZSk7Cit9CisKKy8qIHNldCBTQjEwMDAgZnJlcXVlbmN5ICovCitzdGF0aWMgaW50CitzYjEwMDBfc2V0X2ZyZXF1ZW5jeShjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsIGludCBmcmVxdWVuY3kpCit7CisJdW5zaWduZWQgY2hhciBzdFs3XTsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKKwljb25zdCBpbnQgRnJlcXVlbmN5TG93ZXJMaW1pdCA9IDU3MDAwOworCWNvbnN0IGludCBGcmVxdWVuY3lVcHBlckxpbWl0ID0gODA0MDAwOworCisJaWYgKGZyZXF1ZW5jeSA8IEZyZXF1ZW5jeUxvd2VyTGltaXQgfHwgZnJlcXVlbmN5ID4gRnJlcXVlbmN5VXBwZXJMaW1pdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmcmVxdWVuY3kgY2hvc2VuICglZCBrSHopIGlzIG5vdCBpbiB0aGUgcmFuZ2UgIgorCQkJIlslZCwlZF0ga0h6XG4iLCBuYW1lLCBmcmVxdWVuY3ksIEZyZXF1ZW5jeUxvd2VyTGltaXQsCisJCQlGcmVxdWVuY3lVcHBlckxpbWl0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXVkZWxheSgxMDAwKTsKKwlpZiAoKHN0YXR1cyA9IHNiMTAwMF9zdGFydF9nZXRfc2V0X2NvbW1hbmQoaW9hZGRyLCBuYW1lKSkpCisJCXJldHVybiBzdGF0dXM7CisJQ29tbWFuZDBbNV0gPSBmcmVxdWVuY3kgJiAweGZmOworCWZyZXF1ZW5jeSA+Pj0gODsKKwlDb21tYW5kMFs0XSA9IGZyZXF1ZW5jeSAmIDB4ZmY7CisJZnJlcXVlbmN5ID4+PSA4OworCUNvbW1hbmQwWzNdID0gZnJlcXVlbmN5ICYgMHhmZjsKKwlmcmVxdWVuY3kgPj49IDg7CisJQ29tbWFuZDBbMl0gPSBmcmVxdWVuY3kgJiAweGZmOworCXJldHVybiBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwLCBzdCk7Cit9CisKKy8qIGdldCBTQjEwMDAgUElEcyAqLworc3RhdGljIGludAorc2IxMDAwX2dldF9QSURzKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwgc2hvcnQgUElEW10pCit7CisJdW5zaWduZWQgY2hhciBzdFs3XTsKKwlpbnQgc3RhdHVzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMVs2XSA9IHsweDgwLCAweDQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKwljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQyWzZdID0gezB4ODAsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDNbNl0gPSB7MHg4MCwgMHg0MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKKwl1ZGVsYXkoMTAwMCk7CisJaWYgKChzdGF0dXMgPSBzYjEwMDBfc3RhcnRfZ2V0X3NldF9jb21tYW5kKGlvYWRkciwgbmFtZSkpKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwLCBzdCkpKQorCQlyZXR1cm4gc3RhdHVzOworCVBJRFswXSA9IHN0WzFdIDw8IDggfCBzdFsyXTsKKworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMSwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlQSURbMV0gPSBzdFsxXSA8PCA4IHwgc3RbMl07CisKKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDIsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisJUElEWzJdID0gc3RbMV0gPDwgOCB8IHN0WzJdOworCisJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQzLCBzdCkpKQorCQlyZXR1cm4gc3RhdHVzOworCVBJRFszXSA9IHN0WzFdIDw8IDggfCBzdFsyXTsKKworCXJldHVybiBzYjEwMDBfZW5kX2dldF9zZXRfY29tbWFuZChpb2FkZHIsIG5hbWUpOworfQorCisvKiBzZXQgU0IxMDAwIFBJRHMgKi8KK3N0YXRpYyBpbnQKK3NiMTAwMF9zZXRfUElEcyhjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IHNob3J0IFBJRFtdKQoreworCXVuc2lnbmVkIGNoYXIgc3RbN107CisJc2hvcnQgcDsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHgzMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJdW5zaWduZWQgY2hhciBDb21tYW5kMVs2XSA9IHsweDgwLCAweDMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKwl1bnNpZ25lZCBjaGFyIENvbW1hbmQyWzZdID0gezB4ODAsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCXVuc2lnbmVkIGNoYXIgQ29tbWFuZDNbNl0gPSB7MHg4MCwgMHgzNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kNFs2XSA9IHsweDgwLCAweDJlLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworCXVkZWxheSgxMDAwKTsKKwlpZiAoKHN0YXR1cyA9IHNiMTAwMF9zdGFydF9nZXRfc2V0X2NvbW1hbmQoaW9hZGRyLCBuYW1lKSkpCisJCXJldHVybiBzdGF0dXM7CisKKwlwID0gUElEWzBdOworCUNvbW1hbmQwWzNdID0gcCAmIDB4ZmY7CisJcCA+Pj0gODsKKwlDb21tYW5kMFsyXSA9IHAgJiAweGZmOworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCXAgPSBQSURbMV07CisJQ29tbWFuZDFbM10gPSBwICYgMHhmZjsKKwlwID4+PSA4OworCUNvbW1hbmQxWzJdID0gcCAmIDB4ZmY7CisJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQxLCBzdCkpKQorCQlyZXR1cm4gc3RhdHVzOworCisJcCA9IFBJRFsyXTsKKwlDb21tYW5kMlszXSA9IHAgJiAweGZmOworCXAgPj49IDg7CisJQ29tbWFuZDJbMl0gPSBwICYgMHhmZjsKKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDIsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisKKwlwID0gUElEWzNdOworCUNvbW1hbmQzWzNdID0gcCAmIDB4ZmY7CisJcCA+Pj0gODsKKwlDb21tYW5kM1syXSA9IHAgJiAweGZmOworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMywgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kNCwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gc2IxMDAwX2VuZF9nZXRfc2V0X2NvbW1hbmQoaW9hZGRyLCBuYW1lKTsKK30KKworDAorc3RhdGljIGlubGluZSB2b2lkCitzYjEwMDBfcHJpbnRfc3RhdHVzX2J1ZmZlcihjb25zdCBjaGFyKiBuYW1lLCB1bnNpZ25lZCBjaGFyIHN0W10sCisJdW5zaWduZWQgY2hhciBidWZmZXJbXSwgaW50IHNpemUpCit7CisJaW50IGksIGosIGs7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHN0YXR1czogJTAyeCAlMDJ4XG4iLCBuYW1lLCBzdFswXSwgc3RbMV0pOworCWlmIChidWZmZXJbMjRdID09IDB4MDggJiYgYnVmZmVyWzI1XSA9PSAweDAwICYmIGJ1ZmZlclsyNl0gPT0gMHg0NSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGxlbmd0aDogJWQgcHJvdG9jb2w6ICVkIGZyb206ICVkLiVkLiVkLiVkOiVkICIKKwkJCSJ0byAlZC4lZC4lZC4lZDolZFxuIiwgbmFtZSwgYnVmZmVyWzI4XSA8PCA4IHwgYnVmZmVyWzI5XSwKKwkJCWJ1ZmZlclszNV0sIGJ1ZmZlclszOF0sIGJ1ZmZlclszOV0sIGJ1ZmZlcls0MF0sIGJ1ZmZlcls0MV0sCisgICAgICAgICAgICBidWZmZXJbNDZdIDw8IDggfCBidWZmZXJbNDddLAorCQkJYnVmZmVyWzQyXSwgYnVmZmVyWzQzXSwgYnVmZmVyWzQ0XSwgYnVmZmVyWzQ1XSwKKyAgICAgICAgICAgIGJ1ZmZlcls0OF0gPDwgOCB8IGJ1ZmZlcls0OV0pOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDAsIGsgPSAwOyBpIDwgKHNpemUgKyA3KSAvIDg7IGkrKykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyIsIG5hbWUsIGkgPyAiICAgICAgICIgOiAiYnVmZmVyOiIpOworCQkJZm9yIChqID0gMDsgaiA8IDggJiYgayA8IHNpemU7IGorKywgaysrKQorCQkJCXByaW50aygiICUwMngiLCBidWZmZXJba10pOworCQkJcHJpbnRrKCJcbiIpOworCQl9CisJfQorCXJldHVybjsKK30KKworLyoKKyAqIFNCMTAwMCBjb21tYW5kcyBmb3IgZnJhbWUgcnggaW50ZXJydXB0CisgKi8KKy8qIHJlY2VpdmUgYSBzaW5nbGUgZnJhbWUgYW5kIGFzc2VtYmxlIGRhdGFncmFtCisgKiAodGhpcyBpcyB0aGUgaGVhcnQgb2YgdGhlIGludGVycnVwdCByb3V0aW5lKQorICovCitzdGF0aWMgaW5saW5lIGludAorc2IxMDAwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKyNkZWZpbmUgRlJBTUVTSVpFIDE4NAorCXVuc2lnbmVkIGNoYXIgc3RbMl0sIGJ1ZmZlcltGUkFNRVNJWkVdLCBzZXNzaW9uX2lkLCBmcmFtZV9pZDsKKwlzaG9ydCBkbGVuOworCWludCBpb2FkZHIsIG5zOworCXVuc2lnbmVkIGludCBza2JzaXplOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNiMTAwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmxwLT5zdGF0czsKKworCS8qIFNCMTAwMCBmcmFtZSBjb25zdGFudHMgKi8KKwljb25zdCBpbnQgRnJhbWVTaXplID0gRlJBTUVTSVpFOworCWNvbnN0IGludCBOZXdEYXRhZ3JhbUhlYWRlclNraXAgPSA4OworCWNvbnN0IGludCBOZXdEYXRhZ3JhbUhlYWRlclNpemUgPSBOZXdEYXRhZ3JhbUhlYWRlclNraXAgKyAxODsKKwljb25zdCBpbnQgTmV3RGF0YWdyYW1EYXRhU2l6ZSA9IEZyYW1lU2l6ZSAtIE5ld0RhdGFncmFtSGVhZGVyU2l6ZTsKKwljb25zdCBpbnQgQ29udERhdGFncmFtSGVhZGVyU2tpcCA9IDc7CisJY29uc3QgaW50IENvbnREYXRhZ3JhbUhlYWRlclNpemUgPSBDb250RGF0YWdyYW1IZWFkZXJTa2lwICsgMTsKKwljb25zdCBpbnQgQ29udERhdGFncmFtRGF0YVNpemUgPSBGcmFtZVNpemUgLSBDb250RGF0YWdyYW1IZWFkZXJTaXplOworCWNvbnN0IGludCBUcmFpbGVyU2l6ZSA9IDQ7CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWluc3coaW9hZGRyLCAodW5zaWduZWQgc2hvcnQqKSBzdCwgMSk7CisjaWZkZWYgWFhYREVCVUcKK3ByaW50aygiY20wOiByZWNlaXZlZDogJTAyeCAlMDJ4XG4iLCBzdFswXSwgc3RbMV0pOworI2VuZGlmIC8qIFhYWERFQlVHICovCisJbHAtPnJ4X2ZyYW1lcysrOworCisJLyogZGVjaWRlIGlmIGl0IGlzIGEgZ29vZCBvciBiYWQgZnJhbWUgKi8KKwlmb3IgKG5zID0gMDsgbnMgPCBOUElEUzsgbnMrKykgeworCQlzZXNzaW9uX2lkID0gbHAtPnJ4X3Nlc3Npb25faWRbbnNdOworCQlmcmFtZV9pZCA9IGxwLT5yeF9mcmFtZV9pZFtuc107CisJCWlmIChzdFswXSA9PSBzZXNzaW9uX2lkKSB7CisJCQlpZiAoc3RbMV0gPT0gZnJhbWVfaWQgfHwgKCFmcmFtZV9pZCAmJiAoc3RbMV0gJiAweGYwKSA9PSAweDMwKSkgeworCQkJCWdvdG8gZ29vZF9mcmFtZTsKKwkJCX0gZWxzZSBpZiAoKHN0WzFdICYgMHhmMCkgPT0gMHgzMCAmJiAoc3RbMF0gJiAweDQwKSkgeworCQkJCWdvdG8gc2tpcHBlZF9mcmFtZTsKKwkJCX0gZWxzZSB7CisJCQkJZ290byBiYWRfZnJhbWU7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RbMF0gPT0gKHNlc3Npb25faWQgfCAweDQwKSkgeworCQkJaWYgKChzdFsxXSAmIDB4ZjApID09IDB4MzApIHsKKwkJCQlnb3RvIHNraXBwZWRfZnJhbWU7CisJCQl9IGVsc2UgeworCQkJCWdvdG8gYmFkX2ZyYW1lOworCQkJfQorCQl9CisJfQorCWdvdG8gYmFkX2ZyYW1lOworCitza2lwcGVkX2ZyYW1lOgorCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsKKwlza2IgPSBscC0+cnhfc2tiW25zXTsKKwlpZiAoc2IxMDAwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1pc3NpbmcgZnJhbWUocyk6IGdvdCAlMDJ4ICUwMnggIgorCQkJImV4cGVjdGluZyAlMDJ4ICUwMnhcbiIsIGRldi0+bmFtZSwgc3RbMF0sIHN0WzFdLAorCQkJc2tiID8gc2Vzc2lvbl9pZCA6IHNlc3Npb25faWQgfCAweDQwLCBmcmFtZV9pZCk7CisJaWYgKHNrYikgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXNrYiA9IE5VTEw7CisJfQorCitnb29kX2ZyYW1lOgorCWxwLT5yeF9mcmFtZV9pZFtuc10gPSAweDMwIHwgKChzdFsxXSArIDEpICYgMHgwZik7CisJLyogbmV3IGRhdGFncmFtICovCisJaWYgKHN0WzBdICYgMHg0MCkgeworCQkvKiBnZXQgZGF0YSBsZW5ndGggKi8KKwkJaW5zdyhpb2FkZHIsIGJ1ZmZlciwgTmV3RGF0YWdyYW1IZWFkZXJTaXplIC8gMik7CisjaWZkZWYgWFhYREVCVUcKK3ByaW50aygiY20wOiBJUCBpZGVudGlmaWNhdGlvbjogJTAyeCUwMnggIGZyYWdtZW50IG9mZnNldDogJTAyeCUwMnhcbiIsIGJ1ZmZlclszMF0sIGJ1ZmZlclszMV0sIGJ1ZmZlclszMl0sIGJ1ZmZlclszM10pOworI2VuZGlmIC8qIFhYWERFQlVHICovCisJCWlmIChidWZmZXJbMF0gIT0gTmV3RGF0YWdyYW1IZWFkZXJTa2lwKSB7CisJCQlpZiAoc2IxMDAwX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbmV3IGRhdGFncmFtIGhlYWRlciBza2lwIGVycm9yOiAiCisJCQkJCSJnb3QgJTAyeCBleHBlY3RpbmcgJTAyeFxuIiwgZGV2LT5uYW1lLCBidWZmZXJbMF0sCisJCQkJCU5ld0RhdGFncmFtSGVhZGVyU2tpcCk7CisJCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaW5zdyhpb2FkZHIsIGJ1ZmZlciwgTmV3RGF0YWdyYW1EYXRhU2l6ZSAvIDIpOworCQkJZ290byBiYWRfZnJhbWVfbmV4dDsKKwkJfQorCQlkbGVuID0gKChidWZmZXJbTmV3RGF0YWdyYW1IZWFkZXJTa2lwICsgM10gJiAweDBmKSA8PCA4IHwKKwkJCWJ1ZmZlcltOZXdEYXRhZ3JhbUhlYWRlclNraXAgKyA0XSkgLSAxNzsKKwkJaWYgKGRsZW4gPiBTQjEwMDBfTVJVKSB7CisJCQlpZiAoc2IxMDAwX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZGF0YWdyYW0gbGVuZ3RoICglZCkgZ3JlYXRlciAiCisJCQkJCSJ0aGFuIE1SVSAoJWQpXG4iLCBkZXYtPm5hbWUsIGRsZW4sIFNCMTAwMF9NUlUpOworCQkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWluc3coaW9hZGRyLCBidWZmZXIsIE5ld0RhdGFncmFtRGF0YVNpemUgLyAyKTsKKwkJCWdvdG8gYmFkX2ZyYW1lX25leHQ7CisJCX0KKwkJbHAtPnJ4X2RsZW5bbnNdID0gZGxlbjsKKwkJLyogY29tcHV0ZSBzaXplIHRvIGFsbG9jYXRlIGZvciBkYXRhZ3JhbSAqLworCQlza2JzaXplID0gZGxlbiArIEZyYW1lU2l6ZTsKKwkJaWYgKChza2IgPSBhbGxvY19za2Ioc2tic2l6ZSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJCWlmIChzYjEwMDBfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYW4ndCBhbGxvY2F0ZSAlZCBieXRlcyBsb25nICIKKwkJCQkJInNrYnVmZlxuIiwgZGV2LT5uYW1lLCBza2JzaXplKTsKKwkJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCQlpbnN3KGlvYWRkciwgYnVmZmVyLCBOZXdEYXRhZ3JhbURhdGFTaXplIC8gMik7CisJCQlnb3RvIGRyb3BwZWRfZnJhbWU7CisJCX0KKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5wcm90b2NvbCA9ICh1bnNpZ25lZCBzaG9ydCkgYnVmZmVyW05ld0RhdGFncmFtSGVhZGVyU2tpcCArIDE2XTsKKwkJaW5zdyhpb2FkZHIsIHNrYl9wdXQoc2tiLCBOZXdEYXRhZ3JhbURhdGFTaXplKSwKKwkJCU5ld0RhdGFncmFtRGF0YVNpemUgLyAyKTsKKwkJbHAtPnJ4X3NrYltuc10gPSBza2I7CisJfSBlbHNlIHsKKwkJLyogY29udGludWF0aW9uIG9mIHByZXZpb3VzIGRhdGFncmFtICovCisJCWluc3coaW9hZGRyLCBidWZmZXIsIENvbnREYXRhZ3JhbUhlYWRlclNpemUgLyAyKTsKKwkJaWYgKGJ1ZmZlclswXSAhPSBDb250RGF0YWdyYW1IZWFkZXJTa2lwKSB7CisJCQlpZiAoc2IxMDAwX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY29udCBkYXRhZ3JhbSBoZWFkZXIgc2tpcCBlcnJvcjogIgorCQkJCQkiZ290ICUwMnggZXhwZWN0aW5nICUwMnhcbiIsIGRldi0+bmFtZSwgYnVmZmVyWzBdLAorCQkJCQlDb250RGF0YWdyYW1IZWFkZXJTa2lwKTsKKwkJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpbnN3KGlvYWRkciwgYnVmZmVyLCBDb250RGF0YWdyYW1EYXRhU2l6ZSAvIDIpOworCQkJZ290byBiYWRfZnJhbWVfbmV4dDsKKwkJfQorCQlza2IgPSBscC0+cnhfc2tiW25zXTsKKwkJaW5zdyhpb2FkZHIsIHNrYl9wdXQoc2tiLCBDb250RGF0YWdyYW1EYXRhU2l6ZSksCisJCQlDb250RGF0YWdyYW1EYXRhU2l6ZSAvIDIpOworCQlkbGVuID0gbHAtPnJ4X2RsZW5bbnNdOworCX0KKwlpZiAoc2tiLT5sZW4gPCBkbGVuICsgVHJhaWxlclNpemUpIHsKKwkJbHAtPnJ4X3Nlc3Npb25faWRbbnNdICY9IH4weDQwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkYXRhZ3JhbSBjb21wbGV0ZWQ6IHNlbmQgdG8gdXBwZXIgbGV2ZWwgKi8KKwlza2JfdHJpbShza2IsIGRsZW4pOworCW5ldGlmX3J4KHNrYik7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlzdGF0cy0+cnhfYnl0ZXMrPWRsZW47CisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlscC0+cnhfc2tiW25zXSA9IE5VTEw7CisJbHAtPnJ4X3Nlc3Npb25faWRbbnNdIHw9IDB4NDA7CisJcmV0dXJuIDA7CisKK2JhZF9mcmFtZToKKwlpbnN3KGlvYWRkciwgYnVmZmVyLCBGcmFtZVNpemUgLyAyKTsKKwlpZiAoc2IxMDAwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZyYW1lIGVycm9yOiBnb3QgJTAyeCAlMDJ4XG4iLAorCQkJZGV2LT5uYW1lLCBzdFswXSwgc3RbMV0pOworCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsKK2JhZF9mcmFtZV9uZXh0OgorCWlmIChzYjEwMDBfZGVidWcgPiAyKQorCQlzYjEwMDBfcHJpbnRfc3RhdHVzX2J1ZmZlcihkZXYtPm5hbWUsIHN0LCBidWZmZXIsIEZyYW1lU2l6ZSk7Citkcm9wcGVkX2ZyYW1lOgorCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwlpZiAobnMgPCBOUElEUykgeworCQlpZiAoKHNrYiA9IGxwLT5yeF9za2JbbnNdKSkgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJbHAtPnJ4X3NrYltuc10gPSBOVUxMOworCQl9CisJCWxwLT5yeF9zZXNzaW9uX2lkW25zXSB8PSAweDQwOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2IxMDAwX2Vycm9yX2RwYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgY2hhciBzdFs1XTsKKwlpbnQgaW9hZGRyWzJdOworCXN0cnVjdCBzYjEwMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJY29uc3QgaW50IEVycm9yRHBjQ291bnRlckluaXRpYWxpemUgPSAyMDA7CisKKwlpb2FkZHJbMF0gPSBkZXYtPmJhc2VfYWRkcjsKKwkvKiBtZW1fc3RhcnQgaG9sZHMgdGhlIHNlY29uZCBJL08gYWRkcmVzcyAqLworCWlvYWRkclsxXSA9IGRldi0+bWVtX3N0YXJ0OworCW5hbWUgPSBkZXYtPm5hbWU7CisKKwlzYjEwMDBfd2FpdF9mb3JfcmVhZHlfY2xlYXIoaW9hZGRyLCBuYW1lKTsKKwlzYjEwMDBfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDApOworCXNiMTAwMF93YWl0X2Zvcl9yZWFkeShpb2FkZHIsIG5hbWUpOworCXNiMTAwMF9yZWFkX3N0YXR1cyhpb2FkZHIsIHN0KTsKKwlpZiAoc3RbMV0gJiAweDEwKQorCQlscC0+cnhfZXJyb3JfZHBjX2NvdW50ID0gRXJyb3JEcGNDb3VudGVySW5pdGlhbGl6ZTsKKwlyZXR1cm47Cit9CisKKwwKKy8qCisgKiBMaW51eCBpbnRlcmZhY2UgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbnQKK3NiMTAwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJY2hhciAqbmFtZTsKKwlpbnQgaW9hZGRyWzJdLCBzdGF0dXM7CisJc3RydWN0IHNiMTAwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJY29uc3QgdW5zaWduZWQgc2hvcnQgRmlybXdhcmVWZXJzaW9uW10gPSB7MHgwMSwgMHgwMX07CisKKwlpb2FkZHJbMF0gPSBkZXYtPmJhc2VfYWRkcjsKKwkvKiBtZW1fc3RhcnQgaG9sZHMgdGhlIHNlY29uZCBJL08gYWRkcmVzcyAqLworCWlvYWRkclsxXSA9IGRldi0+bWVtX3N0YXJ0OworCW5hbWUgPSBkZXYtPm5hbWU7CisKKwkvKiBpbml0aWFsaXplIHNiMTAwMCAqLworCWlmICgoc3RhdHVzID0gc2IxMDAwX3Jlc2V0KGlvYWRkciwgbmFtZSkpKQorCQlyZXR1cm4gc3RhdHVzOworCW5pY2VkZWxheSgyMDAwMDApOworCWlmICgoc3RhdHVzID0gc2IxMDAwX2NoZWNrX0NSQyhpb2FkZHIsIG5hbWUpKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIGluaXRpYWxpemUgcHJpdmF0ZSBkYXRhIGJlZm9yZSBib2FyZCBjYW4gY2F0Y2ggaW50ZXJydXB0cyAqLworCWxwLT5yeF9za2JbMF0gPSBOVUxMOworCWxwLT5yeF9za2JbMV0gPSBOVUxMOworCWxwLT5yeF9za2JbMl0gPSBOVUxMOworCWxwLT5yeF9za2JbM10gPSBOVUxMOworCWxwLT5yeF9kbGVuWzBdID0gMDsKKwlscC0+cnhfZGxlblsxXSA9IDA7CisJbHAtPnJ4X2RsZW5bMl0gPSAwOworCWxwLT5yeF9kbGVuWzNdID0gMDsKKwlscC0+cnhfZnJhbWVzID0gMDsKKwlscC0+cnhfZXJyb3JfY291bnQgPSAwOworCWxwLT5yeF9lcnJvcl9kcGNfY291bnQgPSAwOworCWxwLT5yeF9zZXNzaW9uX2lkWzBdID0gMHg1MDsKKwlscC0+cnhfc2Vzc2lvbl9pZFswXSA9IDB4NDg7CisJbHAtPnJ4X3Nlc3Npb25faWRbMF0gPSAweDQ0OworCWxwLT5yeF9zZXNzaW9uX2lkWzBdID0gMHg0MjsKKwlscC0+cnhfZnJhbWVfaWRbMF0gPSAwOworCWxwLT5yeF9mcmFtZV9pZFsxXSA9IDA7CisJbHAtPnJ4X2ZyYW1lX2lkWzJdID0gMDsKKwlscC0+cnhfZnJhbWVfaWRbM10gPSAwOworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJnNiMTAwMF9pbnRlcnJ1cHQsIDAsICJzYjEwMDAiLCBkZXYpKSB7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlmIChzYjEwMDBfZGVidWcgPiAyKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE9wZW5pbmcsIElSUSAlZFxuIiwgbmFtZSwgZGV2LT5pcnEpOworCisJLyogQWN0aXZhdGUgYm9hcmQgYW5kIGNoZWNrIGZpcm13YXJlIHZlcnNpb24gKi8KKwl1ZGVsYXkoMTAwMCk7CisJaWYgKChzdGF0dXMgPSBzYjEwMDBfYWN0aXZhdGUoaW9hZGRyLCBuYW1lKSkpCisJCXJldHVybiBzdGF0dXM7CisJdWRlbGF5KDApOworCWlmICgoc3RhdHVzID0gc2IxMDAwX2dldF9maXJtd2FyZV92ZXJzaW9uKGlvYWRkciwgbmFtZSwgdmVyc2lvbiwgMCkpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmICh2ZXJzaW9uWzBdICE9IEZpcm13YXJlVmVyc2lvblswXSB8fCB2ZXJzaW9uWzFdICE9IEZpcm13YXJlVmVyc2lvblsxXSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZvdW5kIGZpcm13YXJlIHZlcnNpb24gJXguJTAyeCAiCisJCQkiKHNob3VsZCBiZSAleC4lMDJ4KVxuIiwgbmFtZSwgdmVyc2lvblswXSwgdmVyc2lvblsxXSwKKwkJCUZpcm13YXJlVmVyc2lvblswXSwgRmlybXdhcmVWZXJzaW9uWzFdKTsKKworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsJCQkJCS8qIEFsd2F5cyBzdWNjZWVkICovCit9CisKK3N0YXRpYyBpbnQgc2IxMDAwX2Rldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwljaGFyKiBuYW1lOworCXVuc2lnbmVkIGNoYXIgdmVyc2lvblsyXTsKKwlzaG9ydCBQSURbNF07CisJaW50IGlvYWRkclsyXSwgc3RhdHVzLCBmcmVxdWVuY3k7CisJdW5zaWduZWQgaW50IHN0YXRzWzVdOworCXN0cnVjdCBzYjEwMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCEoZGV2ICYmIGRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlvYWRkclswXSA9IGRldi0+YmFzZV9hZGRyOworCS8qIG1lbV9zdGFydCBob2xkcyB0aGUgc2Vjb25kIEkvTyBhZGRyZXNzICovCisJaW9hZGRyWzFdID0gZGV2LT5tZW1fc3RhcnQ7CisJbmFtZSA9IGRldi0+bmFtZTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR0NNU1RBVFM6CQkvKiBnZXQgc3RhdGlzdGljcyAqLworCQlzdGF0c1swXSA9IGxwLT5zdGF0cy5yeF9ieXRlczsKKwkJc3RhdHNbMV0gPSBscC0+cnhfZnJhbWVzOworCQlzdGF0c1syXSA9IGxwLT5zdGF0cy5yeF9wYWNrZXRzOworCQlzdGF0c1szXSA9IGxwLT5zdGF0cy5yeF9lcnJvcnM7CisJCXN0YXRzWzRdID0gbHAtPnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCWlmKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCBzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc3RhdHVzID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHQ01GSVJNV0FSRToJCS8qIGdldCBmaXJtd2FyZSB2ZXJzaW9uICovCisJCWlmICgoc3RhdHVzID0gc2IxMDAwX2dldF9maXJtd2FyZV92ZXJzaW9uKGlvYWRkciwgbmFtZSwgdmVyc2lvbiwgMSkpKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJaWYoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsIHZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHQ01GUkVRVUVOQ1k6CQkvKiBnZXQgZnJlcXVlbmN5ICovCisJCWlmICgoc3RhdHVzID0gc2IxMDAwX2dldF9mcmVxdWVuY3koaW9hZGRyLCBuYW1lLCAmZnJlcXVlbmN5KSkpCisJCQlyZXR1cm4gc3RhdHVzOworCQlpZihwdXRfdXNlcihmcmVxdWVuY3ksIChpbnQgX191c2VyICopIGlmci0+aWZyX2RhdGEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0NNRlJFUVVFTkNZOgkJLyogc2V0IGZyZXF1ZW5jeSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZihnZXRfdXNlcihmcmVxdWVuY3ksIChpbnQgX191c2VyICopIGlmci0+aWZyX2RhdGEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICgoc3RhdHVzID0gc2IxMDAwX3NldF9mcmVxdWVuY3koaW9hZGRyLCBuYW1lLCBmcmVxdWVuY3kpKSkKKwkJCXJldHVybiBzdGF0dXM7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0NNUElEUzoJCQkvKiBnZXQgUElEcyAqLworCQlpZiAoKHN0YXR1cyA9IHNiMTAwMF9nZXRfUElEcyhpb2FkZHIsIG5hbWUsIFBJRCkpKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJaWYoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsIFBJRCwgc2l6ZW9mKFBJRCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0NNUElEUzoJCQkvKiBzZXQgUElEcyAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZihjb3B5X2Zyb21fdXNlcihQSUQsIGlmci0+aWZyX2RhdGEsIHNpemVvZihQSUQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKHN0YXR1cyA9IHNiMTAwMF9zZXRfUElEcyhpb2FkZHIsIG5hbWUsIFBJRCkpKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJLyogc2V0IHNlc3Npb25faWQsIGZyYW1lX2lkIGFuZCBwa3RfdHlwZSB0b28gKi8KKwkJbHAtPnJ4X3Nlc3Npb25faWRbMF0gPSAweDUwIHwgKFBJRFswXSAmIDB4MGYpOworCQlscC0+cnhfc2Vzc2lvbl9pZFsxXSA9IDB4NDg7CisJCWxwLT5yeF9zZXNzaW9uX2lkWzJdID0gMHg0NDsKKwkJbHAtPnJ4X3Nlc3Npb25faWRbM10gPSAweDQyOworCQlscC0+cnhfZnJhbWVfaWRbMF0gPSAwOworCQlscC0+cnhfZnJhbWVfaWRbMV0gPSAwOworCQlscC0+cnhfZnJhbWVfaWRbMl0gPSAwOworCQlscC0+cnhfZnJhbWVfaWRbM10gPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiB0cmFuc21pdCBmdW5jdGlvbjogZG8gbm90aGluZyBzaW5jZSBTQjEwMDAgY2FuJ3Qgc2VuZCBhbnl0aGluZyBvdXQgKi8KK3N0YXRpYyBpbnQKK3NiMTAwMF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyeWluZyB0byB0cmFuc21pdCEhIVxuIiwgZGV2LT5uYW1lKTsKKwkvKiBzYjEwMDAgY2FuJ3QgeG1pdCBkYXRhZ3JhbXMgKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNCMTAwMCBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzYjEwMDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBjaGFyIHN0OworCWludCBpb2FkZHJbMl07CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IHNiMTAwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQwWzZdID0gezB4ODAsIDB4MmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDFbNl0gPSB7MHg4MCwgMHgyZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJY29uc3QgaW50IE1heFJ4RXJyb3JDb3VudCA9IDY7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzYjEwMDBfaW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLAorCQkJaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlvYWRkclswXSA9IGRldi0+YmFzZV9hZGRyOworCS8qIG1lbV9zdGFydCBob2xkcyB0aGUgc2Vjb25kIEkvTyBhZGRyZXNzICovCisJaW9hZGRyWzFdID0gZGV2LT5tZW1fc3RhcnQ7CisJbmFtZSA9IGRldi0+bmFtZTsKKworCS8qIGlzIGl0IGEgZ29vZCBpbnRlcnJ1cHQ/ICovCisJc3QgPSBpbmIoaW9hZGRyWzFdICsgNik7CisJaWYgKCEoc3QgJiAweDA4ICYmIHN0ICYgMHgyMCkpIHsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmIChzYjEwMDBfZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIGludGVycnVwdFxuIiwgZGV2LT5uYW1lKTsKKworCXN0ID0gaW5iKGlvYWRkclswXSArIDcpOworCWlmIChzYjEwMDBfcngoZGV2KSkKKwkJbHAtPnJ4X2Vycm9yX2NvdW50Kys7CisjaWZkZWYgU0IxMDAwX0RFTEFZCisJdWRlbGF5KFNCMTAwMF9ERUxBWSk7CisjZW5kaWYgLyogU0IxMDAwX0RFTEFZICovCisJc2IxMDAwX2lzc3VlX3JlYWRfY29tbWFuZChpb2FkZHIsIG5hbWUpOworCWlmIChzdCAmIDB4MDEpIHsKKwkJc2IxMDAwX2Vycm9yX2RwYyhkZXYpOworCQlzYjEwMDBfaXNzdWVfcmVhZF9jb21tYW5kKGlvYWRkciwgbmFtZSk7CisJfQorCWlmIChscC0+cnhfZXJyb3JfZHBjX2NvdW50ICYmICEoLS1scC0+cnhfZXJyb3JfZHBjX2NvdW50KSkgeworCQlzYjEwMDBfd2FpdF9mb3JfcmVhZHlfY2xlYXIoaW9hZGRyLCBuYW1lKTsKKwkJc2IxMDAwX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwKTsKKwkJc2IxMDAwX3dhaXRfZm9yX3JlYWR5KGlvYWRkciwgbmFtZSk7CisJCXNiMTAwMF9pc3N1ZV9yZWFkX2NvbW1hbmQoaW9hZGRyLCBuYW1lKTsKKwl9CisJaWYgKGxwLT5yeF9lcnJvcl9jb3VudCA+PSBNYXhSeEVycm9yQ291bnQpIHsKKwkJc2IxMDAwX3dhaXRfZm9yX3JlYWR5X2NsZWFyKGlvYWRkciwgbmFtZSk7CisJCXNiMTAwMF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMSk7CisJCXNiMTAwMF93YWl0X2Zvcl9yZWFkeShpb2FkZHIsIG5hbWUpOworCQlzYjEwMDBfaXNzdWVfcmVhZF9jb21tYW5kKGlvYWRkciwgbmFtZSk7CisJCWxwLT5yeF9lcnJvcl9jb3VudCA9IDA7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNiMTAwMF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYjEwMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmbHAtPnN0YXRzOworfQorCitzdGF0aWMgaW50IHNiMTAwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCWludCBpb2FkZHJbMl07CisJc3RydWN0IHNiMTAwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoc2IxMDAwX2RlYnVnID4gMikKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIHNiMTAwMC5cbiIsIGRldi0+bmFtZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJaW9hZGRyWzBdID0gZGV2LT5iYXNlX2FkZHI7CisJLyogbWVtX3N0YXJ0IGhvbGRzIHRoZSBzZWNvbmQgSS9PIGFkZHJlc3MgKi8KKwlpb2FkZHJbMV0gPSBkZXYtPm1lbV9zdGFydDsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCS8qIElmIHdlIGRvbid0IGRvIHRoaXMsIHdlIGNhbid0IHJlLWluc21vZCBpdCBsYXRlci4gKi8KKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHJbMV0sIFNCMTAwMF9JT19FWFRFTlQpOworCXJlbGVhc2VfcmVnaW9uKGlvYWRkclswXSwgU0IxMDAwX0lPX0VYVEVOVCk7CisKKwkvKiBmcmVlIHJ4X3NrYidzIGlmIG5lZWRlZCAqLworCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQlpZiAobHAtPnJ4X3NrYltpXSkgeworCQkJZGV2X2tmcmVlX3NrYihscC0+cnhfc2tiW2ldKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiRnJhbmNvIFZlbnR1cmkgPGZ2ZW50dXJpQG1lZGlhb25lLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR2VuZXJhbCBJbnN0cnVtZW50cyBTQjEwMDAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0CitzYjEwMDBfaW5pdCh2b2lkKQoreworCXJldHVybiBwbnBfcmVnaXN0ZXJfZHJpdmVyKCZzYjEwMDBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitzYjEwMDBfZXhpdCh2b2lkKQoreworCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmc2IxMDAwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNiMTAwMF9pbml0KTsKK21vZHVsZV9leGl0KHNiMTAwMF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYyBiL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDJlN2MzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2IxMjUwLW1hYy5jCkBAIC0wLDAgKzEsMjkyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyLDIwMDMgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgQnJvYWRjb20gU2lCeXRlIFNPQyBidWlsdC1pbgorICogRXRoZXJuZXQgY29udHJvbGxlcnMuIFdyaXR0ZW4gYnkgTWl0Y2ggTGljaHRlbmJlcmcgYXQgQnJvYWRjb20gQ29ycC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkJLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKworLyogVGhpcyBpcyBvbmx5IGhlcmUgdW50aWwgdGhlIGZpcm13YXJlIGlzIHJlYWR5LiAgSW4gdGhhdCBjYXNlLAorICAgdGhlIGZpcm13YXJlIGxlYXZlcyB0aGUgZXRoZXJuZXQgYWRkcmVzcyBpbiB0aGUgcmVnaXN0ZXIgZm9yIHVzLiAqLworI2lmZGVmIENPTkZJR19TSUJZVEVfU1RBTkRBTE9ORQorI2RlZmluZSBTQk1BQ19FVEgwX0hXQUREUiAiNDA6MDA6MDA6MDA6MDE6MDAiCisjZGVmaW5lIFNCTUFDX0VUSDFfSFdBRERSICI0MDowMDowMDowMDowMTowMSIKKyNkZWZpbmUgU0JNQUNfRVRIMl9IV0FERFIgIjQwOjAwOjAwOjAwOjAxOjAyIgorI2VuZGlmCisKKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KKyNpZiAwCitzdGF0aWMgY2hhciB2ZXJzaW9uMVtdIF9fZGV2aW5pdGRhdGEgPQorInNiMTI1MC1tYWMuYzoxLjAwIDEvMTEvMjAwMSBXcml0dGVuIGJ5IE1pdGNoIExpY2h0ZW5iZXJnXG4iOworI2VuZGlmCisKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworCisjZGVmaW5lIENPTkZJR19TQk1BQ19DT0FMRVNDRQorCisjZGVmaW5lIE1BWF9VTklUUyAzCQkvKiBNb3JlIGFyZSBzdXBwb3J0ZWQsIGxpbWl0IG9ubHkgb24gb3B0aW9ucyAqLworCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICgyKkhaKQorCisKK01PRFVMRV9BVVRIT1IoIk1pdGNoIExpY2h0ZW5iZXJnIChCcm9hZGNvbSBDb3JwLikiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gU2lCeXRlIFNPQyBHQiBFdGhlcm5ldCBkcml2ZXIiKTsKKworLyogQSBmZXcgdXNlci1jb25maWd1cmFibGUgdmFsdWVzIHdoaWNoIG1heSBiZSBtb2RpZmllZCB3aGVuIGEgZHJpdmVyCisgICBtb2R1bGUgaXMgbG9hZGVkLiAqLworCisvKiAxIG5vcm1hbCBtZXNzYWdlcywgMCBxdWlldCAuLiA3IHZlcmJvc2UuICovCitzdGF0aWMgaW50IGRlYnVnID0gMTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBtZXNzYWdlcyIpOworCisvKiBtaWkgc3RhdHVzIG1zZ3MgKi8KK3N0YXRpYyBpbnQgbm9pc3lfbWlpID0gMTsKK21vZHVsZV9wYXJhbShub2lzeV9taWksIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKG5vaXN5X21paSwgIk1JSSBzdGF0dXMgbWVzc2FnZXMiKTsKKworLyogVXNlZCB0byBwYXNzIHRoZSBtZWRpYSB0eXBlLCBldGMuCisgICBCb3RoICdvcHRpb25zW10nIGFuZCAnZnVsbF9kdXBsZXhbXScgc2hvdWxkIGV4aXN0IGZvciBkcml2ZXIKKyAgIGludGVyb3BlcmFiaWxpdHkuCisgICBUaGUgbWVkaWEgdHlwZSBpcyB1c3VhbGx5IHBhc3NlZCBpbiAnb3B0aW9uc1tdJy4KKyovCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgaW50IG9wdGlvbnNbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xfTsKK21vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhvcHRpb25zLCAiMS0iIF9fTU9EVUxFX1NUUklORyhNQVhfVU5JVFMpKTsKKworc3RhdGljIGludCBmdWxsX2R1cGxleFtNQVhfVU5JVFNdID0gey0xLCAtMSwgLTF9OworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhmdWxsX2R1cGxleCwgIjEtIiBfX01PRFVMRV9TVFJJTkcoTUFYX1VOSVRTKSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TQk1BQ19DT0FMRVNDRQorc3RhdGljIGludCBpbnRfcGt0Y250ID0gMDsKK21vZHVsZV9wYXJhbShpbnRfcGt0Y250LCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpbnRfcGt0Y250LCAiUGFja2V0IGNvdW50Iik7CisKK3N0YXRpYyBpbnQgaW50X3RpbWVvdXQgPSAwOworbW9kdWxlX3BhcmFtKGludF90aW1lb3V0LCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpbnRfdGltZW91dCwgIlRpbWVvdXQgdmFsdWUiKTsKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTAuaD4KKyNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9kZWZzLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfcmVncy5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX21hYy5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX2RtYS5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX2ludC5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX3NjZC5oPgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU2ltcGxlIHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHNibWFjX3BvcnRfdDsKKwordHlwZWRlZiBlbnVtIHsgc2JtYWNfc3BlZWRfYXV0bywgc2JtYWNfc3BlZWRfMTAsCisJICAgICAgIHNibWFjX3NwZWVkXzEwMCwgc2JtYWNfc3BlZWRfMTAwMCB9IHNibWFjX3NwZWVkX3Q7CisKK3R5cGVkZWYgZW51bSB7IHNibWFjX2R1cGxleF9hdXRvLCBzYm1hY19kdXBsZXhfaGFsZiwKKwkgICAgICAgc2JtYWNfZHVwbGV4X2Z1bGwgfSBzYm1hY19kdXBsZXhfdDsKKwordHlwZWRlZiBlbnVtIHsgc2JtYWNfZmNfYXV0bywgc2JtYWNfZmNfZGlzYWJsZWQsIHNibWFjX2ZjX2ZyYW1lLAorCSAgICAgICBzYm1hY19mY19jb2xsaXNpb24sIHNibWFjX2ZjX2NhcnJpZXIgfSBzYm1hY19mY190OworCit0eXBlZGVmIGVudW0geyBzYm1hY19zdGF0ZV91bmluaXQsIHNibWFjX3N0YXRlX29mZiwgc2JtYWNfc3RhdGVfb24sIAorCSAgICAgICBzYm1hY19zdGF0ZV9icm9rZW4gfSBzYm1hY19zdGF0ZV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTWFjcm9zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworI2RlZmluZSBTQkRNQV9ORVhUQlVGKGQsZikgKCgoKGQpLT5mKzEpID09IChkKS0+c2JkbWFfZHNjcnRhYmxlX2VuZCkgPyBcCisJCQkgIChkKS0+c2JkbWFfZHNjcnRhYmxlIDogKGQpLT5mKzEpCisKKworI2RlZmluZSBOVU1DQUNIRUJMS1MoeCkgKCgoeCkrU01QX0NBQ0hFX0JZVEVTLTEpL1NNUF9DQUNIRV9CWVRFUykKKworI2RlZmluZSBTQk1BQ19SRUFEQ1NSKHQpCV9fcmF3X3JlYWRxKCh1bnNpZ25lZCBsb25nKXQpCisjZGVmaW5lIFNCTUFDX1dSSVRFQ1NSKHQsdikJX19yYXdfd3JpdGVxKHYsICh1bnNpZ25lZCBsb25nKXQpCisgCisKKyNkZWZpbmUgU0JNQUNfTUFYX1RYREVTQ1IJMzIKKyNkZWZpbmUgU0JNQUNfTUFYX1JYREVTQ1IJMzIKKworI2RlZmluZSBFVEhFUl9BTElHTgkyCisjZGVmaW5lIEVUSEVSX0FERFJfTEVOCTYKKyNkZWZpbmUgRU5FVF9QQUNLRVRfU0laRQkxNTE4IAorLyojZGVmaW5lIEVORVRfUEFDS0VUX1NJWkUJOTIxNiAqLyAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBETUEgRGVzY3JpcHRvciBzdHJ1Y3R1cmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc2JkbWFkc2NyX3MgeworCXVpbnQ2NF90ICBkc2NyX2E7CisJdWludDY0X3QgIGRzY3JfYjsKK30gc2JkbWFkc2NyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBwYWRkcl90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIERNQSBDb250cm9sbGVyIHN0cnVjdHVyZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCBzYm1hY2RtYV9zIHsKKwkKKwkvKiAKKwkgKiBUaGlzIHN0dWZmIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGNoYW5uZWwgYW5kIHRoZSByZWdpc3RlcnMKKwkgKiBhc3NvY2lhdGVkIHdpdGggaXQuCisJICovCisJCisJc3RydWN0IHNibWFjX3NvZnRjICpzYmRtYV9ldGg7CSAgICAgICAgLyogYmFjayBwb2ludGVyIHRvIGFzc29jaWF0ZWQgTUFDICovCisJaW50ICAgICAgICAgICAgICBzYmRtYV9jaGFubmVsOwkvKiBjaGFubmVsIG51bWJlciAqLworCWludAkJIHNiZG1hX3R4ZGlyOyAgICAgICAvKiBkaXJlY3Rpb24gKDE9dHJhbnNtaXQpICovCisJaW50CQkgc2JkbWFfbWF4ZGVzY3I7CS8qIHRvdGFsICMgb2YgZGVzY3JpcHRvcnMgaW4gcmluZyAqLworI2lmZGVmIENPTkZJR19TQk1BQ19DT0FMRVNDRQorCWludAkJIHNiZG1hX2ludF9wa3RjbnQ7ICAvKiAjIGRlc2NyaXB0b3JzIHJ4L3R4IGJlZm9yZSBpbnRlcnJ1cHQqLworCWludAkJIHNiZG1hX2ludF90aW1lb3V0OyAvKiAjIHVzZWMgcngvdHggaW50ZXJydXB0ICovCisjZW5kaWYKKworCXNibWFjX3BvcnRfdCAgICAgc2JkbWFfY29uZmlnMDsJLyogRE1BIGNvbmZpZyByZWdpc3RlciAwICovCisJc2JtYWNfcG9ydF90ICAgICBzYmRtYV9jb25maWcxOwkvKiBETUEgY29uZmlnIHJlZ2lzdGVyIDEgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNiZG1hX2RzY3JiYXNlOwkvKiBEZXNjcmlwdG9yIGJhc2UgYWRkcmVzcyAqLworCXNibWFjX3BvcnRfdCAgICAgc2JkbWFfZHNjcmNudDsgICAgIC8qIERlc2NyaXB0b3IgY291bnQgcmVnaXN0ZXIgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNiZG1hX2N1cmRzY3I7CS8qIGN1cnJlbnQgZGVzY3JpcHRvciBhZGRyZXNzICovCisJCisJLyoKKwkgKiBUaGlzIHN0dWZmIGlzIGZvciBtYWludGVuYW5jZSBvZiB0aGUgcmluZworCSAqLworCQorCXNiZG1hZHNjcl90ICAgICAqc2JkbWFfZHNjcnRhYmxlOwkvKiBiYXNlIG9mIGRlc2NyaXB0b3IgdGFibGUgKi8KKwlzYmRtYWRzY3JfdCAgICAgKnNiZG1hX2RzY3J0YWJsZV9lbmQ7IC8qIGVuZCBvZiBkZXNjcmlwdG9yIHRhYmxlICovCisJCisJc3RydWN0IHNrX2J1ZmYgKipzYmRtYV9jdHh0YWJsZTsgICAgLyogY29udGV4dCB0YWJsZSwgb25lIHBlciBkZXNjciAqLworCQorCXBhZGRyX3QgICAgICAgICAgc2JkbWFfZHNjcnRhYmxlX3BoeXM7IC8qIGFuZCBhbHNvIHRoZSBwaHlzIGFkZHIgKi8KKwlzYmRtYWRzY3JfdCAgICAgKnNiZG1hX2FkZHB0cjsJLyogbmV4dCBkc2NyIGZvciBzdyB0byBhZGQgKi8KKwlzYmRtYWRzY3JfdCAgICAgKnNiZG1hX3JlbXB0cjsJLyogbmV4dCBkc2NyIGZvciBzdyB0byByZW1vdmUgKi8KK30gc2JtYWNkbWFfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEV0aGVybmV0IHNvZnRjIHN0cnVjdHVyZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdHJ1Y3Qgc2JtYWNfc29mdGMgeworCQorCS8qCisJICogTGludXgtc3BlY2lmaWMgdGhpbmdzCisJICovCisJCisJc3RydWN0IG5ldF9kZXZpY2UgKnNibV9kZXY7CQkvKiBwb2ludGVyIHRvIGxpbnV4IGRldmljZSAqLworCXNwaW5sb2NrX3Qgc2JtX2xvY2s7CQkvKiBzcGluIGxvY2sgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBzYm1fdGltZXI7ICAgICAJLyogZm9yIG1vbml0b3JpbmcgTUlJICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc2JtX3N0YXRzOyAKKwlpbnQgc2JtX2RldmZsYWdzOwkJCS8qIGN1cnJlbnQgZGV2aWNlIGZsYWdzICovCisKKwlpbnQJICAgICBzYm1fcGh5X29sZGJtc3I7CisJaW50CSAgICAgc2JtX3BoeV9vbGRhbmxwYXI7CisJaW50CSAgICAgc2JtX3BoeV9vbGRrMXN0c3I7CisJaW50CSAgICAgc2JtX3BoeV9vbGRsaW5rc3RhdDsKKwlpbnQgc2JtX2J1ZmZlcnNpemU7CisJCisJdW5zaWduZWQgY2hhciBzYm1fcGh5c1syXTsKKwkKKwkvKgorCSAqIENvbnRyb2xsZXItc3BlY2lmaWMgdGhpbmdzCisJICovCisJCisJdW5zaWduZWQgbG9uZwlzYm1fYmFzZTsgICAgICAgICAgLyogTUFDJ3MgYmFzZSBhZGRyZXNzICovCisJc2JtYWNfc3RhdGVfdCAgICBzYm1fc3RhdGU7ICAgICAgICAgLyogY3VycmVudCBzdGF0ZSAqLworCQorCXNibWFjX3BvcnRfdCAgICAgc2JtX21hY2VuYWJsZTsJLyogTUFDIEVuYWJsZSBSZWdpc3RlciAqLworCXNibWFjX3BvcnRfdCAgICAgc2JtX21hY2NmZzsJLyogTUFDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNibV9maWZvY2ZnOwkvKiBGSUZPIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNibV9mcmFtZWNmZzsJLyogRnJhbWUgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCXNibWFjX3BvcnRfdCAgICAgc2JtX3J4ZmlsdGVyOwkvKiByZWNlaXZlIGZpbHRlciByZWdpc3RlciAqLworCXNibWFjX3BvcnRfdCAgICAgc2JtX2lzcjsJCS8qIEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNibV9pbXI7CQkvKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworCXNibWFjX3BvcnRfdCAgICAgc2JtX21kaW87CQkvKiBNRElPIHJlZ2lzdGVyICovCisJCisJc2JtYWNfc3BlZWRfdCAgICBzYm1fc3BlZWQ7CQkvKiBjdXJyZW50IHNwZWVkICovCisJc2JtYWNfZHVwbGV4X3QgICBzYm1fZHVwbGV4OwkvKiBjdXJyZW50IGR1cGxleCAqLworCXNibWFjX2ZjX3QgICAgICAgc2JtX2ZjOwkJLyogY3VycmVudCBmbG93IGNvbnRyb2wgc2V0dGluZyAqLworCQorCXVuc2lnbmVkIGNoYXIgICAgc2JtX2h3YWRkcltFVEhFUl9BRERSX0xFTl07CisJCisJc2JtYWNkbWFfdCAgICAgICBzYm1fdHhkbWE7CQkvKiBmb3Igbm93LCBvbmx5IHVzZSBjaGFubmVsIDAgKi8KKwlzYm1hY2RtYV90ICAgICAgIHNibV9yeGRtYTsKKwlpbnQgICAgICAgICAgICAgIHJ4X2h3X2NoZWNrc3VtOworCWludCAJCSBzYmVfaWR4OworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEV4dGVybnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBQcm90b3R5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNiZG1hX2luaXRjdHgoc2JtYWNkbWFfdCAqZCwKKwkJCSAgc3RydWN0IHNibWFjX3NvZnRjICpzLAorCQkJICBpbnQgY2hhbiwKKwkJCSAgaW50IHR4cngsCisJCQkgIGludCBtYXhkZXNjcik7CitzdGF0aWMgdm9pZCBzYmRtYV9jaGFubmVsX3N0YXJ0KHNibWFjZG1hX3QgKmQsIGludCByeHR4KTsKK3N0YXRpYyBpbnQgc2JkbWFfYWRkX3JjdmJ1ZmZlcihzYm1hY2RtYV90ICpkLHN0cnVjdCBza19idWZmICptKTsKK3N0YXRpYyBpbnQgc2JkbWFfYWRkX3R4YnVmZmVyKHNibWFjZG1hX3QgKmQsc3RydWN0IHNrX2J1ZmYgKm0pOworc3RhdGljIHZvaWQgc2JkbWFfZW1wdHlyaW5nKHNibWFjZG1hX3QgKmQpOworc3RhdGljIHZvaWQgc2JkbWFfZmlsbHJpbmcoc2JtYWNkbWFfdCAqZCk7CitzdGF0aWMgdm9pZCBzYmRtYV9yeF9wcm9jZXNzKHN0cnVjdCBzYm1hY19zb2Z0YyAqc2Msc2JtYWNkbWFfdCAqZCk7CitzdGF0aWMgdm9pZCBzYmRtYV90eF9wcm9jZXNzKHN0cnVjdCBzYm1hY19zb2Z0YyAqc2Msc2JtYWNkbWFfdCAqZCk7CitzdGF0aWMgaW50IHNibWFjX2luaXRjdHgoc3RydWN0IHNibWFjX3NvZnRjICpzKTsKK3N0YXRpYyB2b2lkIHNibWFjX2NoYW5uZWxfc3RhcnQoc3RydWN0IHNibWFjX3NvZnRjICpzKTsKK3N0YXRpYyB2b2lkIHNibWFjX2NoYW5uZWxfc3RvcChzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMpOworc3RhdGljIHNibWFjX3N0YXRlX3Qgc2JtYWNfc2V0X2NoYW5uZWxfc3RhdGUoc3RydWN0IHNibWFjX3NvZnRjICosc2JtYWNfc3RhdGVfdCk7CitzdGF0aWMgdm9pZCBzYm1hY19wcm9taXNjdW91c19tb2RlKHN0cnVjdCBzYm1hY19zb2Z0YyAqc2MsaW50IG9ub2ZmKTsKK3N0YXRpYyB1aW50NjRfdCBzYm1hY19hZGRyMnJlZyh1bnNpZ25lZCBjaGFyICpwdHIpOworc3RhdGljIGlycXJldHVybl90IHNibWFjX2ludHIoaW50IGlycSx2b2lkICpkZXZfaW5zdGFuY2Usc3RydWN0IHB0X3JlZ3MgKnJncyk7CitzdGF0aWMgaW50IHNibWFjX3N0YXJ0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2JtYWNfc2V0bXVsdGkoc3RydWN0IHNibWFjX3NvZnRjICpzYyk7CitzdGF0aWMgaW50IHNibWFjX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlkeCk7CitzdGF0aWMgaW50IHNibWFjX3NldF9zcGVlZChzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMsc2JtYWNfc3BlZWRfdCBzcGVlZCk7CitzdGF0aWMgaW50IHNibWFjX3NldF9kdXBsZXgoc3RydWN0IHNibWFjX3NvZnRjICpzLHNibWFjX2R1cGxleF90IGR1cGxleCxzYm1hY19mY190IGZjKTsKKworc3RhdGljIGludCBzYm1hY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2JtYWNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHNibWFjX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzYm1hY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzYm1hY19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2JtYWNfbWlpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIGludCBzYm1hY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2JtYWNfbWlpX3BvbGwoc3RydWN0IHNibWFjX3NvZnRjICpzLGludCBub2lzeSk7CisKK3N0YXRpYyB2b2lkIHNibWFjX21paV9zeW5jKHN0cnVjdCBzYm1hY19zb2Z0YyAqcyk7CitzdGF0aWMgdm9pZCBzYm1hY19taWlfc2VuZGRhdGEoc3RydWN0IHNibWFjX3NvZnRjICpzLHVuc2lnbmVkIGludCBkYXRhLCBpbnQgYml0Y250KTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2JtYWNfbWlpX3JlYWQoc3RydWN0IHNibWFjX3NvZnRjICpzLGludCBwaHlhZGRyLGludCByZWdpZHgpOworc3RhdGljIHZvaWQgc2JtYWNfbWlpX3dyaXRlKHN0cnVjdCBzYm1hY19zb2Z0YyAqcyxpbnQgcGh5YWRkcixpbnQgcmVnaWR4LAorCQkJICAgIHVuc2lnbmVkIGludCByZWd2YWwpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgR2xvYmFscworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdWludDY0X3Qgc2JtYWNfb3JpZ19od2FkZHJbTUFYX1VOSVRTXTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE1ESU8gY29uc3RhbnRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNkZWZpbmUJTUlJX0NPTU1BTkRfU1RBUlQJMHgwMQorI2RlZmluZQlNSUlfQ09NTUFORF9SRUFECTB4MDIKKyNkZWZpbmUJTUlJX0NPTU1BTkRfV1JJVEUJMHgwMQorI2RlZmluZQlNSUlfQ09NTUFORF9BQ0sJCTB4MDIKKworI2RlZmluZSBCTUNSX1JFU0VUICAgICAweDgwMDAKKyNkZWZpbmUgQk1DUl9MT09QQkFDSyAgMHg0MDAwCisjZGVmaW5lIEJNQ1JfU1BFRUQwICAgIDB4MjAwMAorI2RlZmluZSBCTUNSX0FORU5BQkxFICAweDEwMDAKKyNkZWZpbmUgQk1DUl9QT1dFUkRPV04gMHgwODAwCisjZGVmaW5lIEJNQ1JfSVNPTEFURSAgIDB4MDQwMAorI2RlZmluZSBCTUNSX1JFU1RBUlRBTiAweDAyMDAKKyNkZWZpbmUgQk1DUl9EVVBMRVggICAgMHgwMTAwCisjZGVmaW5lIEJNQ1JfQ09MVEVTVCAgIDB4MDA4MAorI2RlZmluZSBCTUNSX1NQRUVEMSAgICAweDAwNDAKKyNkZWZpbmUgQk1DUl9TUEVFRDEwMDAJQk1DUl9TUEVFRDEKKyNkZWZpbmUgQk1DUl9TUEVFRDEwMAlCTUNSX1NQRUVEMAorI2RlZmluZSBCTUNSX1NQRUVEMTAgCTAKKworI2RlZmluZSBCTVNSXzEwMEJUNAkweDgwMDAKKyNkZWZpbmUgQk1TUl8xMDBCVF9GRFgJMHg0MDAwCisjZGVmaW5lIEJNU1JfMTAwQlRfSERYICAweDIwMDAKKyNkZWZpbmUgQk1TUl8xMEJUX0ZEWCAgIDB4MTAwMAorI2RlZmluZSBCTVNSXzEwQlRfSERYICAgMHgwODAwCisjZGVmaW5lIEJNU1JfMTAwQlQyX0ZEWCAweDA0MDAKKyNkZWZpbmUgQk1TUl8xMDBCVDJfSERYIDB4MDIwMAorI2RlZmluZSBCTVNSXzEwMDBCVF9YU1IJMHgwMTAwCisjZGVmaW5lIEJNU1JfUFJFU1VQCTB4MDA0MAorI2RlZmluZSBCTVNSX0FOQ09NUExUCTB4MDAyMAorI2RlZmluZSBCTVNSX1JFTUZBVUxUCTB4MDAxMAorI2RlZmluZSBCTVNSX0FVVE9ORUcJMHgwMDA4CisjZGVmaW5lIEJNU1JfTElOS1NUQVQJMHgwMDA0CisjZGVmaW5lIEJNU1JfSkFCREVURUNUCTB4MDAwMgorI2RlZmluZSBCTVNSX0VYVENBUEFCCTB4MDAwMQorCisjZGVmaW5lIFBIWUlEUjEgCTB4MjAwMAorI2RlZmluZSBQSFlJRFIyCQkweDVDNjAKKworI2RlZmluZSBBTkFSX05QCQkweDgwMDAKKyNkZWZpbmUgQU5BUl9SRgkJMHgyMDAwCisjZGVmaW5lIEFOQVJfQVNZUEFVU0UJMHgwODAwCisjZGVmaW5lIEFOQVJfUEFVU0UJMHgwNDAwCisjZGVmaW5lIEFOQVJfVDQJCTB4MDIwMAorI2RlZmluZSBBTkFSX1RYRkQJMHgwMTAwCisjZGVmaW5lIEFOQVJfVFhIRAkweDAwODAKKyNkZWZpbmUgQU5BUl8xMEZECTB4MDA0MAorI2RlZmluZSBBTkFSXzEwSEQJMHgwMDIwCisjZGVmaW5lIEFOQVJfUFNCCTB4MDAwMQorCisjZGVmaW5lIEFOTFBBUl9OUAkweDgwMDAKKyNkZWZpbmUgQU5MUEFSX0FDSwkweDQwMDAKKyNkZWZpbmUgQU5MUEFSX1JGCTB4MjAwMAorI2RlZmluZSBBTkxQQVJfQVNZUEFVU0UJMHgwODAwCisjZGVmaW5lIEFOTFBBUl9QQVVTRQkweDA0MDAKKyNkZWZpbmUgQU5MUEFSX1Q0CTB4MDIwMAorI2RlZmluZSBBTkxQQVJfVFhGRAkweDAxMDAKKyNkZWZpbmUgQU5MUEFSX1RYSEQJMHgwMDgwCisjZGVmaW5lIEFOTFBBUl8xMEZECTB4MDA0MAorI2RlZmluZSBBTkxQQVJfMTBIRAkweDAwMjAKKyNkZWZpbmUgQU5MUEFSX1BTQgkweDAwMDEJLyogODAyLjMgKi8KKworI2RlZmluZSBBTkVSX1BERgkweDAwMTAKKyNkZWZpbmUgQU5FUl9MUE5QQUJMRQkweDAwMDgKKyNkZWZpbmUgQU5FUl9OUEFCTEUJMHgwMDA0CisjZGVmaW5lIEFORVJfUEFHRVJYCTB4MDAwMgorI2RlZmluZSBBTkVSX0xQQU5BQkxFCTB4MDAwMQorCisjZGVmaW5lIEFOTlBUUl9OUAkweDgwMDAKKyNkZWZpbmUgQU5OUFRSX01QCTB4MjAwMAorI2RlZmluZSBBTk5QVFJfQUNLMgkweDEwMDAKKyNkZWZpbmUgQU5OUFRSX1RPR1RYCTB4MDgwMAorI2RlZmluZSBBTk5QVFJfQ09ERQkweDAwMDgKKworI2RlZmluZSBBTk5QUlJfTlAJMHg4MDAwCisjZGVmaW5lIEFOTlBSUl9NUAkweDIwMDAKKyNkZWZpbmUgQU5OUFJSX0FDSzMJMHgxMDAwCisjZGVmaW5lIEFOTlBSUl9UT0dUWAkweDA4MDAKKyNkZWZpbmUgQU5OUFJSX0NPREUJMHgwMDA4CisKKyNkZWZpbmUgSzFUQ1JfVEVTVE1PREUJMHgwMDAwCisjZGVmaW5lIEsxVENSX01TTUNFCTB4MTAwMAorI2RlZmluZSBLMVRDUl9NU0NWCTB4MDgwMAorI2RlZmluZSBLMVRDUl9SUFRSCTB4MDQwMAorI2RlZmluZSBLMVRDUl8xMDAwQlRfRkRYIDB4MjAwCisjZGVmaW5lIEsxVENSXzEwMDBCVF9IRFggMHgxMDAKKworI2RlZmluZSBLMVNUU1JfTVNNQ0ZMVAkweDgwMDAKKyNkZWZpbmUgSzFTVFNSX01TQ0ZHUkVTCTB4NDAwMAorI2RlZmluZSBLMVNUU1JfTFJTVEFUCTB4MjAwMAorI2RlZmluZSBLMVNUU1JfUlJTVEFUCTB4MTAwMAorI2RlZmluZSBLMVNUU1JfTFAxS0ZECTB4MDgwMAorI2RlZmluZSBLMVNUU1JfTFAxS0hEICAgMHgwNDAwCisjZGVmaW5lIEsxU1RTUl9MUEFTTURJUgkweDAyMDAKKworI2RlZmluZSBLMVNDUl8xS1hfRkRYCTB4ODAwMAorI2RlZmluZSBLMVNDUl8xS1hfSERYCTB4NDAwMAorI2RlZmluZSBLMVNDUl8xS1RfRkRYCTB4MjAwMAorI2RlZmluZSBLMVNDUl8xS1RfSERYCTB4MTAwMAorCisjZGVmaW5lIFNUUkFQX1BIWTEJMHgwODAwCisjZGVmaW5lIFNUUkFQX05DTU9ERQkweDA0MDAKKyNkZWZpbmUgU1RSQVBfTUFOTVNDRkcJMHgwMjAwCisjZGVmaW5lIFNUUkFQX0FORU5BQkxFCTB4MDEwMAorI2RlZmluZSBTVFJBUF9NU1ZBTAkweDAwODAKKyNkZWZpbmUgU1RSQVBfMUtIRFhBRFYJMHgwMDEwCisjZGVmaW5lIFNUUkFQXzFLRkRYQURWCTB4MDAwOAorI2RlZmluZSBTVFJBUF8xMDBBRFYJMHgwMDA0CisjZGVmaW5lIFNUUkFQX1NQRUVEU0VMCTB4MDAwMAorI2RlZmluZSBTVFJBUF9TUEVFRDEwMAkweDAwMDEKKworI2RlZmluZSBQSFlTVVBfU1BFRUQxMDAwIDB4MTAKKyNkZWZpbmUgUEhZU1VQX1NQRUVEMTAwICAweDA4CisjZGVmaW5lIFBIWVNVUF9TUEVFRDEwICAgMHgwMAorI2RlZmluZSBQSFlTVVBfTElOS1VQCSAweDA0CisjZGVmaW5lIFBIWVNVUF9GRFggICAgICAgMHgwMgorCisjZGVmaW5lCU1JSV9CTUNSCTB4MDAgCS8qIEJhc2ljIG1vZGUgY29udHJvbCByZWdpc3RlciAocncpICovCisjZGVmaW5lCU1JSV9CTVNSCTB4MDEJLyogQmFzaWMgbW9kZSBzdGF0dXMgcmVnaXN0ZXIgKHJvKSAqLworI2RlZmluZSBNSUlfSzFTVFNSCTB4MEEJLyogMUsgU3RhdHVzIFJlZ2lzdGVyIChybykgKi8KKyNkZWZpbmUJTUlJX0FOTFBBUgkweDA1CS8qIEF1dG9uZWdvdGlhdGlvbiBsbmsgcGFydG5lciBhYmlsaXRpZXMgKHJ3KSAqLworCisKKyNkZWZpbmUgTV9NQUNfTURJT19ESVJfT1VUUFVUCTAJCS8qIGZvciBjbGFyaXR5ICovCisKKyNkZWZpbmUgRU5BQkxFIAkJMQorI2RlZmluZSBESVNBQkxFCQkwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfTUlJX1NZTkMocykKKyAqICAKKyAqICBTeW5jaHJvbml6ZSB3aXRoIHRoZSBNSUkgLSBzZW5kIGEgcGF0dGVybiBvZiBiaXRzIHRvIHRoZSBNSUkKKyAqICB0aGF0IHdpbGwgZ3VhcmFudGVlIHRoYXQgaXQgaXMgcmVhZHkgdG8gYWNjZXB0IGEgY29tbWFuZC4KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgcyAtIHNibWFjIHN0cnVjdHVyZQorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JtYWNfbWlpX3N5bmMoc3RydWN0IHNibWFjX3NvZnRjICpzKQoreworCWludCBjbnQ7CisJdWludDY0X3QgYml0czsKKwlpbnQgbWFjX21kaW9fZ2VuYzsKKworCW1hY19tZGlvX2dlbmMgPSBTQk1BQ19SRUFEQ1NSKHMtPnNibV9tZGlvKSAmIE1fTUFDX0dFTkM7CisJCisJYml0cyA9IE1fTUFDX01ESU9fRElSX09VVFBVVCB8IE1fTUFDX01ESU9fT1VUOworCQorCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLGJpdHMgfCBtYWNfbWRpb19nZW5jKTsKKwkKKwlmb3IgKGNudCA9IDA7IGNudCA8IDMyOyBjbnQrKykgeworCQlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxiaXRzIHwgTV9NQUNfTURDIHwgbWFjX21kaW9fZ2VuYyk7CisJCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLGJpdHMgfCBtYWNfbWRpb19nZW5jKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfTUlJX1NFTkREQVRBKHMsZGF0YSxiaXRjbnQpCisgKiAgCisgKiAgU2VuZCBzb21lIGJpdHMgdG8gdGhlIE1JSS4gIFRoZSBiaXRzIHRvIGJlIHNlbnQgYXJlIHJpZ2h0LQorICogIGp1c3RpZmllZCBpbiB0aGUgJ2RhdGEnIHBhcmFtZXRlci4KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgcyAtIHNibWFjIHN0cnVjdHVyZQorICogIAkgICBkYXRhIC0gZGF0YSB0byBzZW5kCisgKiAgCSAgIGJpdGNudCAtIG51bWJlciBvZiBiaXRzIHRvIHNlbmQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JtYWNfbWlpX3NlbmRkYXRhKHN0cnVjdCBzYm1hY19zb2Z0YyAqcyx1bnNpZ25lZCBpbnQgZGF0YSwgaW50IGJpdGNudCkKK3sKKwlpbnQgaTsKKwl1aW50NjRfdCBiaXRzOworCXVuc2lnbmVkIGludCBjdXJtYXNrOworCWludCBtYWNfbWRpb19nZW5jOworCisJbWFjX21kaW9fZ2VuYyA9IFNCTUFDX1JFQURDU1Iocy0+c2JtX21kaW8pICYgTV9NQUNfR0VOQzsKKwkKKwliaXRzID0gTV9NQUNfTURJT19ESVJfT1VUUFVUOworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLGJpdHMgfCBtYWNfbWRpb19nZW5jKTsKKwkKKwljdXJtYXNrID0gMSA8PCAoYml0Y250IC0gMSk7CisJCisJZm9yIChpID0gMDsgaSA8IGJpdGNudDsgaSsrKSB7CisJCWlmIChkYXRhICYgY3VybWFzaykKKwkJCWJpdHMgfD0gTV9NQUNfTURJT19PVVQ7CisJCWVsc2UgYml0cyAmPSB+TV9NQUNfTURJT19PVVQ7CisJCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLGJpdHMgfCBtYWNfbWRpb19nZW5jKTsKKwkJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21kaW8sYml0cyB8IE1fTUFDX01EQyB8IG1hY19tZGlvX2dlbmMpOworCQlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxiaXRzIHwgbWFjX21kaW9fZ2VuYyk7CisJCWN1cm1hc2sgPj49IDE7CisJfQorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19NSUlfUkVBRChzLHBoeWFkZHIscmVnaWR4KQorICogIAorICogIFJlYWQgYSBQSFkgcmVnaXN0ZXIuCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIHMgLSBzYm1hYyBzdHJ1Y3R1cmUKKyAqICAJICAgcGh5YWRkciAtIFBIWSdzIGFkZHJlc3MKKyAqICAJICAgcmVnaWR4ID0gaW5kZXggb2YgcmVnaXN0ZXIgdG8gcmVhZAorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIHZhbHVlIHJlYWQsIG9yIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2JtYWNfbWlpX3JlYWQoc3RydWN0IHNibWFjX3NvZnRjICpzLGludCBwaHlhZGRyLGludCByZWdpZHgpCit7CisJaW50IGlkeDsKKwlpbnQgZXJyb3I7CisJaW50IHJlZ3ZhbDsKKwlpbnQgbWFjX21kaW9fZ2VuYzsKKworCS8qCisJICogU3luY2hyb25pemUgb3Vyc2VsdmVzIHNvIHRoYXQgdGhlIFBIWSBrbm93cyB0aGUgbmV4dAorCSAqIHRoaW5nIGNvbWluZyBkb3duIGlzIGEgY29tbWFuZAorCSAqLworCQorCXNibWFjX21paV9zeW5jKHMpOworCQorCS8qCisJICogU2VuZCB0aGUgZGF0YSB0byB0aGUgUEhZLiAgVGhlIHNlcXVlbmNlIGlzCisJICogYSAic3RhcnQiIGNvbW1hbmQgKDIgYml0cykKKwkgKiBhICJyZWFkIiBjb21tYW5kICgyIGJpdHMpCisJICogdGhlIFBIWSBhZGRyICg1IGJpdHMpCisJICogdGhlIHJlZ2lzdGVyIGluZGV4ICg1IGJpdHMpCisJICovCisJCisJc2JtYWNfbWlpX3NlbmRkYXRhKHMsTUlJX0NPTU1BTkRfU1RBUlQsIDIpOworCXNibWFjX21paV9zZW5kZGF0YShzLE1JSV9DT01NQU5EX1JFQUQsIDIpOworCXNibWFjX21paV9zZW5kZGF0YShzLHBoeWFkZHIsIDUpOworCXNibWFjX21paV9zZW5kZGF0YShzLHJlZ2lkeCwgNSk7CisJCisJbWFjX21kaW9fZ2VuYyA9IFNCTUFDX1JFQURDU1Iocy0+c2JtX21kaW8pICYgTV9NQUNfR0VOQzsKKwkKKwkvKiAKKwkgKiBTd2l0Y2ggdGhlIHBvcnQgYXJvdW5kIHdpdGhvdXQgYSBjbG9jayB0cmFuc2l0aW9uLgorCSAqLworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLE1fTUFDX01ESU9fRElSX0lOUFVUIHwgbWFjX21kaW9fZ2VuYyk7CisJCisJLyoKKwkgKiBTZW5kIG91dCBhIGNsb2NrIHB1bHNlIHRvIHNpZ25hbCB3ZSB3YW50IHRoZSBzdGF0dXMKKwkgKi8KKwkKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbywKKwkJICAgICAgIE1fTUFDX01ESU9fRElSX0lOUFVUIHwgTV9NQUNfTURDIHwgbWFjX21kaW9fZ2VuYyk7CisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21kaW8sTV9NQUNfTURJT19ESVJfSU5QVVQgfCBtYWNfbWRpb19nZW5jKTsKKwkKKwkvKiAKKwkgKiBJZiBhbiBlcnJvciBvY2N1cnJlZCwgdGhlIFBIWSB3aWxsIHNpZ25hbCAnMScgYmFjaworCSAqLworCWVycm9yID0gU0JNQUNfUkVBRENTUihzLT5zYm1fbWRpbykgJiBNX01BQ19NRElPX0lOOworCQorCS8qIAorCSAqIElzc3VlIGFuICdpZGxlJyBjbG9jayBwdWxzZSwgYnV0IGtlZXAgdGhlIGRpcmVjdGlvbgorCSAqIHRoZSBzYW1lLgorCSAqLworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLAorCQkgICAgICAgTV9NQUNfTURJT19ESVJfSU5QVVQgfCBNX01BQ19NREMgfCBtYWNfbWRpb19nZW5jKTsKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxNX01BQ19NRElPX0RJUl9JTlBVVCB8IG1hY19tZGlvX2dlbmMpOworCQorCXJlZ3ZhbCA9IDA7CisJCisJZm9yIChpZHggPSAwOyBpZHggPCAxNjsgaWR4KyspIHsKKwkJcmVndmFsIDw8PSAxOworCQkKKwkJaWYgKGVycm9yID09IDApIHsKKwkJCWlmIChTQk1BQ19SRUFEQ1NSKHMtPnNibV9tZGlvKSAmIE1fTUFDX01ESU9fSU4pCisJCQkJcmVndmFsIHw9IDE7CisJCX0KKwkJCisJCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLAorCQkJICAgICAgIE1fTUFDX01ESU9fRElSX0lOUFVUfE1fTUFDX01EQyB8IG1hY19tZGlvX2dlbmMpOworCQlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbywKKwkJCSAgICAgICBNX01BQ19NRElPX0RJUl9JTlBVVCB8IG1hY19tZGlvX2dlbmMpOworCX0KKwkKKwkvKiBTd2l0Y2ggYmFjayB0byBvdXRwdXQgKi8KKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxNX01BQ19NRElPX0RJUl9PVVRQVVQgfCBtYWNfbWRpb19nZW5jKTsKKwkKKwlpZiAoZXJyb3IgPT0gMCkKKwkJcmV0dXJuIHJlZ3ZhbDsKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX01JSV9XUklURShzLHBoeWFkZHIscmVnaWR4LHJlZ3ZhbCkKKyAqICAKKyAqICBXcml0ZSBhIHZhbHVlIHRvIGEgUEhZIHJlZ2lzdGVyLgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzIC0gc2JtYWMgc3RydWN0dXJlCisgKiAgCSAgIHBoeWFkZHIgLSBQSFkgdG8gdXNlCisgKiAgCSAgIHJlZ2lkeCAtIHJlZ2lzdGVyIHdpdGhpbiB0aGUgUEhZCisgKiAgCSAgIHJlZ3ZhbCAtIGRhdGEgdG8gd3JpdGUgdG8gcmVnaXN0ZXIKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNibWFjX21paV93cml0ZShzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMsaW50IHBoeWFkZHIsaW50IHJlZ2lkeCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmVndmFsKQoreworCWludCBtYWNfbWRpb19nZW5jOworCisJc2JtYWNfbWlpX3N5bmMocyk7CisJCisJc2JtYWNfbWlpX3NlbmRkYXRhKHMsTUlJX0NPTU1BTkRfU1RBUlQsMik7CisJc2JtYWNfbWlpX3NlbmRkYXRhKHMsTUlJX0NPTU1BTkRfV1JJVEUsMik7CisJc2JtYWNfbWlpX3NlbmRkYXRhKHMscGh5YWRkciwgNSk7CisJc2JtYWNfbWlpX3NlbmRkYXRhKHMscmVnaWR4LCA1KTsKKwlzYm1hY19taWlfc2VuZGRhdGEocyxNSUlfQ09NTUFORF9BQ0ssMik7CisJc2JtYWNfbWlpX3NlbmRkYXRhKHMscmVndmFsLDE2KTsKKworCW1hY19tZGlvX2dlbmMgPSBTQk1BQ19SRUFEQ1NSKHMtPnNibV9tZGlvKSAmIE1fTUFDX0dFTkM7CisKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxNX01BQ19NRElPX0RJUl9PVVRQVVQgfCBtYWNfbWRpb19nZW5jKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JETUFfSU5JVENUWChkLHMsY2hhbix0eHJ4LG1heGRlc2NyKQorICogIAorICogIEluaXRpYWxpemUgYSBETUEgY2hhbm5lbCBjb250ZXh0LiAgU2luY2UgdGhlcmUgYXJlIHBvdGVudGlhbGx5CisgKiAgZWlnaHQgRE1BIGNoYW5uZWxzIHBlciBNQUMsIGl0J3MgbmljZSB0byBkbyB0aGlzIGluIGEgc3RhbmRhcmQKKyAqICB3YXkuICAKKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgZCAtIHNibWFjZG1hX3Qgc3RydWN0dXJlIChETUEgY2hhbm5lbCBjb250ZXh0KQorICogIAkgICBzIC0gc2JtYWNfc29mdGMgc3RydWN0dXJlIChwb2ludGVyIHRvIGEgTUFDKQorICogIAkgICBjaGFuIC0gY2hhbm5lbCBudW1iZXIgKDAuLjEgcmlnaHQgbm93KQorICogIAkgICB0eHJ4IC0gSWRlbnRpZmllcyBETUFfVFggb3IgRE1BX1JYIGZvciBjaGFubmVsIGRpcmVjdGlvbgorICogICAgICBtYXhkZXNjciAtIG51bWJlciBvZiBkZXNjcmlwdG9ycworICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JkbWFfaW5pdGN0eChzYm1hY2RtYV90ICpkLAorCQkJICBzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMsCisJCQkgIGludCBjaGFuLAorCQkJICBpbnQgdHhyeCwKKwkJCSAgaW50IG1heGRlc2NyKQoreworCS8qIAorCSAqIFNhdmUgYXdheSBpbnRlcmVzdGluZyBzdHVmZiBpbiB0aGUgc3RydWN0dXJlIAorCSAqLworCQorCWQtPnNiZG1hX2V0aCAgICAgICA9IHM7CisJZC0+c2JkbWFfY2hhbm5lbCAgID0gY2hhbjsKKwlkLT5zYmRtYV90eGRpciAgICAgPSB0eHJ4OworCQorI2lmIDAKKwkvKiBSTU9OIGNsZWFyaW5nICovCisJcy0+c2JlX2lkeCA9KHMtPnNibV9iYXNlIC0gQV9NQUNfQkFTRV8wKS9NQUNfU1BBQ0lORzsKKyNlbmRpZgorCisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fVFhfQllURVMpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fQ09MTElTSU9OUykpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9MQVRFX0NPTCkpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9FWF9DT0wpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fRkNTX0VSUk9SKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1RYX0FCT1JUKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1RYX0JBRCkpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9UWF9HT09EKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1RYX1JVTlQpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fVFhfT1ZFUlNJWkUpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfQllURVMpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfTUNBU1QpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfQkNBU1QpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfQkFEKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1JYX0dPT0QpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfUlVOVCkpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9SWF9PVkVSU0laRSkpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9SWF9GQ1NfRVJST1IpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfTEVOR1RIX0VSUk9SKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1JYX0NPREVfRVJST1IpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfQUxJR05fRVJST1IpKSwgMCk7CisKKwkvKiAKKwkgKiBpbml0aWFsaXplIHJlZ2lzdGVyIHBvaW50ZXJzIAorCSAqLworCQorCWQtPnNiZG1hX2NvbmZpZzAgPSAKKwkJcy0+c2JtX2Jhc2UgKyBSX01BQ19ETUFfUkVHSVNURVIodHhyeCxjaGFuLFJfTUFDX0RNQV9DT05GSUcwKTsKKwlkLT5zYmRtYV9jb25maWcxID0gCisJCXMtPnNibV9iYXNlICsgUl9NQUNfRE1BX1JFR0lTVEVSKHR4cngsY2hhbixSX01BQ19ETUFfQ09ORklHMSk7CisJZC0+c2JkbWFfZHNjcmJhc2UgPSAKKwkJcy0+c2JtX2Jhc2UgKyBSX01BQ19ETUFfUkVHSVNURVIodHhyeCxjaGFuLFJfTUFDX0RNQV9EU0NSX0JBU0UpOworCWQtPnNiZG1hX2RzY3JjbnQgPSAKKwkJcy0+c2JtX2Jhc2UgKyBSX01BQ19ETUFfUkVHSVNURVIodHhyeCxjaGFuLFJfTUFDX0RNQV9EU0NSX0NOVCk7CisJZC0+c2JkbWFfY3VyZHNjciA9IAkKKwkJcy0+c2JtX2Jhc2UgKyBSX01BQ19ETUFfUkVHSVNURVIodHhyeCxjaGFuLFJfTUFDX0RNQV9DVVJfRFNDUkFERFIpOworCQorCS8qCisJICogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmluZworCSAqLworCQorCWQtPnNiZG1hX21heGRlc2NyID0gbWF4ZGVzY3I7CisJCisJZC0+c2JkbWFfZHNjcnRhYmxlID0gKHNiZG1hZHNjcl90ICopIAorCQlrbWFsbG9jKGQtPnNiZG1hX21heGRlc2NyKnNpemVvZihzYmRtYWRzY3JfdCksIEdGUF9LRVJORUwpOworCQorCW1lbXNldChkLT5zYmRtYV9kc2NydGFibGUsMCxkLT5zYmRtYV9tYXhkZXNjcipzaXplb2Yoc2JkbWFkc2NyX3QpKTsKKwkKKwlkLT5zYmRtYV9kc2NydGFibGVfZW5kID0gZC0+c2JkbWFfZHNjcnRhYmxlICsgZC0+c2JkbWFfbWF4ZGVzY3I7CisJCisJZC0+c2JkbWFfZHNjcnRhYmxlX3BoeXMgPSB2aXJ0X3RvX3BoeXMoZC0+c2JkbWFfZHNjcnRhYmxlKTsKKwkKKwkvKgorCSAqIEFuZCBjb250ZXh0IHRhYmxlCisJICovCisJCisJZC0+c2JkbWFfY3R4dGFibGUgPSAoc3RydWN0IHNrX2J1ZmYgKiopIAorCQlrbWFsbG9jKGQtPnNiZG1hX21heGRlc2NyKnNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSwgR0ZQX0tFUk5FTCk7CisJCisJbWVtc2V0KGQtPnNiZG1hX2N0eHRhYmxlLDAsZC0+c2JkbWFfbWF4ZGVzY3Iqc2l6ZW9mKHN0cnVjdCBza19idWZmICopKTsKKwkKKyNpZmRlZiBDT05GSUdfU0JNQUNfQ09BTEVTQ0UKKwkvKgorCSAqIFNldHVwIFJ4L1R4IERNQSBjb2FsZXNjaW5nIGRlZmF1bHRzCisJICovCisKKwlpZiAoIGludF9wa3RjbnQgKSB7CisJCWQtPnNiZG1hX2ludF9wa3RjbnQgPSBpbnRfcGt0Y250OworCX0gZWxzZSB7CisJCWQtPnNiZG1hX2ludF9wa3RjbnQgPSAxOworCX0KKwkKKwlpZiAoIGludF90aW1lb3V0ICkgeworCQlkLT5zYmRtYV9pbnRfdGltZW91dCA9IGludF90aW1lb3V0OworCX0gZWxzZSB7CisJCWQtPnNiZG1hX2ludF90aW1lb3V0ID0gMDsKKwl9CisjZW5kaWYKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCRE1BX0NIQU5ORUxfU1RBUlQoZCkKKyAqICAKKyAqICBJbml0aWFsaXplIHRoZSBoYXJkd2FyZSByZWdpc3RlcnMgZm9yIGEgRE1BIGNoYW5uZWwuCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIGQgLSBETUEgY2hhbm5lbCB0byBpbml0IChjb250ZXh0IG11c3QgYmUgcHJldmlvdXNseSBpbml0J2QKKyAqICAgICAgICAgcnh0eCAtIERNQV9SWCBvciBETUFfVFggZGVwZW5kaW5nIG9uIHdoYXQgdHlwZSBvZiBjaGFubmVsCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgbm90aGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdm9pZCBzYmRtYV9jaGFubmVsX3N0YXJ0KHNibWFjZG1hX3QgKmQsIGludCByeHR4ICkKK3sKKwkvKgorCSAqIFR1cm4gb24gdGhlIERNQSBjaGFubmVsCisJICovCisJCisjaWZkZWYgQ09ORklHX1NCTUFDX0NPQUxFU0NFCisJU0JNQUNfV1JJVEVDU1IoZC0+c2JkbWFfY29uZmlnMSwKKwkJICAgICAgIFZfRE1BX0lOVF9USU1FT1VUKGQtPnNiZG1hX2ludF90aW1lb3V0KSB8CisJCSAgICAgICAwKTsKKwlTQk1BQ19XUklURUNTUihkLT5zYmRtYV9jb25maWcwLAorCQkgICAgICAgTV9ETUFfRU9QX0lOVF9FTiB8CisJCSAgICAgICBWX0RNQV9SSU5HU1ooZC0+c2JkbWFfbWF4ZGVzY3IpIHwKKwkJICAgICAgIFZfRE1BX0lOVF9QS1RDTlQoZC0+c2JkbWFfaW50X3BrdGNudCkgfAorCQkgICAgICAgMCk7CisjZWxzZQorCVNCTUFDX1dSSVRFQ1NSKGQtPnNiZG1hX2NvbmZpZzEsMCk7CisJU0JNQUNfV1JJVEVDU1IoZC0+c2JkbWFfY29uZmlnMCwKKwkJICAgICAgIFZfRE1BX1JJTkdTWihkLT5zYmRtYV9tYXhkZXNjcikgfAorCQkgICAgICAgMCk7CisjZW5kaWYKKworCVNCTUFDX1dSSVRFQ1NSKGQtPnNiZG1hX2RzY3JiYXNlLGQtPnNiZG1hX2RzY3J0YWJsZV9waHlzKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSByaW5nIHBvaW50ZXJzCisJICovCisKKwlkLT5zYmRtYV9hZGRwdHIgPSBkLT5zYmRtYV9kc2NydGFibGU7CisJZC0+c2JkbWFfcmVtcHRyID0gZC0+c2JkbWFfZHNjcnRhYmxlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCRE1BX0NIQU5ORUxfU1RPUChkKQorICogIAorICogIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlIHJlZ2lzdGVycyBmb3IgYSBETUEgY2hhbm5lbC4KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgZCAtIERNQSBjaGFubmVsIHRvIGluaXQgKGNvbnRleHQgbXVzdCBiZSBwcmV2aW91c2x5IGluaXQnZAorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JkbWFfY2hhbm5lbF9zdG9wKHNibWFjZG1hX3QgKmQpCit7CisJLyoKKwkgKiBUdXJuIG9mZiB0aGUgRE1BIGNoYW5uZWwKKwkgKi8KKwkKKwlTQk1BQ19XUklURUNTUihkLT5zYmRtYV9jb25maWcxLDApOworCQorCVNCTUFDX1dSSVRFQ1NSKGQtPnNiZG1hX2RzY3JiYXNlLDApOworCQorCVNCTUFDX1dSSVRFQ1NSKGQtPnNiZG1hX2NvbmZpZzAsMCk7CisJCisJLyoKKwkgKiBaZXJvIHJpbmcgcG9pbnRlcnMKKwkgKi8KKwkKKwlkLT5zYmRtYV9hZGRwdHIgPSAwOworCWQtPnNiZG1hX3JlbXB0ciA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNiZG1hX2FsaWduX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLGludCBwb3dlcjIsaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBuZXdhZGRyOworCQorCWFkZHIgPSAodW5zaWduZWQgbG9uZykgc2tiLT5kYXRhOworCQorCW5ld2FkZHIgPSAoYWRkciArIHBvd2VyMiAtIDEpICYgfihwb3dlcjIgLSAxKTsKKwkKKwlza2JfcmVzZXJ2ZShza2IsbmV3YWRkci1hZGRyK29mZnNldCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQkRNQV9BRERfUkNWQlVGRkVSKGQsc2IpCisgKiAgCisgKiAgQWRkIGEgYnVmZmVyIHRvIHRoZSBzcGVjaWZpZWQgRE1BIGNoYW5uZWwuICAgRm9yIHJlY2VpdmUgY2hhbm5lbHMsCisgKiAgdGhpcyBxdWV1ZXMgYSBidWZmZXIgZm9yIGluYm91bmQgcGFja2V0cy4KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgZCAtIERNQSBjaGFubmVsIGRlc2NyaXB0b3IKKyAqIAkgICBzYiAtIHNrX2J1ZmYgdG8gYWRkLCBvciBOVUxMIGlmIHdlIHNob3VsZCBhbGxvY2F0ZSBvbmUKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICAwIGlmIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWRkZWQgKHJpbmcgaXMgZnVsbCkKKyAqICAJICAgMSBpZiBidWZmZXIgYWRkZWQgc3VjY2Vzc2Z1bGx5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworc3RhdGljIGludCBzYmRtYV9hZGRfcmN2YnVmZmVyKHNibWFjZG1hX3QgKmQsc3RydWN0IHNrX2J1ZmYgKnNiKQoreworCXNiZG1hZHNjcl90ICpkc2M7CisJc2JkbWFkc2NyX3QgKm5leHRkc2M7CisJc3RydWN0IHNrX2J1ZmYgKnNiX25ldyA9IE5VTEw7CisJaW50IHBrdHNpemUgPSBFTkVUX1BBQ0tFVF9TSVpFOworCQorCS8qIGdldCBwb2ludGVyIHRvIG91ciBjdXJyZW50IHBsYWNlIGluIHRoZSByaW5nICovCisJCisJZHNjID0gZC0+c2JkbWFfYWRkcHRyOworCW5leHRkc2MgPSBTQkRNQV9ORVhUQlVGKGQsc2JkbWFfYWRkcHRyKTsKKwkKKwkvKgorCSAqIGZpZ3VyZSBvdXQgaWYgdGhlIHJpbmcgaXMgZnVsbCAtIGlmIHRoZSBuZXh0IGRlc2NyaXB0b3IKKwkgKiBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHRoYXQgd2UncmUgZ29pbmcgdG8gcmVtb3ZlIGZyb20KKwkgKiB0aGUgcmluZywgdGhlIHJpbmcgaXMgZnVsbAorCSAqLworCQorCWlmIChuZXh0ZHNjID09IGQtPnNiZG1hX3JlbXB0cikgeworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwkvKiAKKwkgKiBBbGxvY2F0ZSBhIHNrX2J1ZmYgaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gIAorCSAqIElmIHdlIGRvIGhhdmUgYW4gc2tfYnVmZiwgcmVzZXQgaXQgc28gdGhhdCBpdCdzIGVtcHR5LgorCSAqCisJICogTm90ZTogc2tfYnVmZnMgZG9uJ3Qgc2VlbSB0byBiZSBndWFyYW50ZWVkIHRvIGhhdmUgYW55IHNvcnQKKwkgKiBvZiBhbGlnbm1lbnQgd2hlbiB0aGV5IGFyZSBhbGxvY2F0ZWQuICBUaGVyZWZvcmUsIGFsbG9jYXRlIGVub3VnaAorCSAqIGV4dHJhIHNwYWNlIHRvIG1ha2Ugc3VyZSB0aGF0OgorCSAqCisJICogICAgMS4gdGhlIGRhdGEgZG9lcyBub3Qgc3RhcnQgaW4gdGhlIG1pZGRsZSBvZiBhIGNhY2hlIGxpbmUuCisJICogICAgMi4gVGhlIGRhdGEgZG9lcyBub3QgZW5kIGluIHRoZSBtaWRkbGUgb2YgYSBjYWNoZSBsaW5lCisJICogICAgMy4gVGhlIGJ1ZmZlciBjYW4gYmUgYWxpZ25lZCBzdWNoIHRoYXQgdGhlIElQIGFkZHJlc3NlcyBhcmUgCisJICogICAgICAgbmF0dXJhbGx5IGFsaWduZWQuCisJICoKKwkgKiAgUmVtZW1iZXIsIHRoZSBTT0NzIE1BQyB3cml0ZXMgd2hvbGUgY2FjaGUgbGluZXMgYXQgYSB0aW1lLAorCSAqICB3aXRob3V0IHJlYWRpbmcgdGhlIG9sZCBjb250ZW50cyBmaXJzdC4gIFNvLCBpZiB0aGUgc2tfYnVmZidzCisJICogIGRhdGEgcG9ydGlvbiBzdGFydHMgaW4gdGhlIG1pZGRsZSBvZiBhIGNhY2hlIGxpbmUsIHRoZSBTT0MKKwkgKiAgRE1BIHdpbGwgdHJhc2ggdGhlIGJlZ2lubmluZyAoYW5kIGVuZGluZykgcG9ydGlvbnMuCisJICovCisJCisJaWYgKHNiID09IE5VTEwpIHsKKwkJc2JfbmV3ID0gZGV2X2FsbG9jX3NrYihFTkVUX1BBQ0tFVF9TSVpFICsgU01QX0NBQ0hFX0JZVEVTICogMiArIEVUSEVSX0FMSUdOKTsKKwkJaWYgKHNiX25ldyA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogc2tfYnVmZiBhbGxvY2F0aW9uIGZhaWxlZFxuIiwKKwkJCSAgICAgICBkLT5zYmRtYV9ldGgtPnNibV9kZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisKKwkJc2JkbWFfYWxpZ25fc2tiKHNiX25ldywgU01QX0NBQ0hFX0JZVEVTLCBFVEhFUl9BTElHTik7CisKKwkJLyogbWFyayBza2J1ZmYgb3duZWQgYnkgb3VyIGRldmljZSAqLworCQlzYl9uZXctPmRldiA9IGQtPnNiZG1hX2V0aC0+c2JtX2RldjsKKwl9CisJZWxzZSB7CisJCXNiX25ldyA9IHNiOworCQkvKiAKKwkJICogbm90aGluZyBzcGVjaWFsIHRvIHJlaW5pdCBidWZmZXIsIGl0J3MgYWxyZWFkeSBhbGlnbmVkCisJCSAqIGFuZCBzYi0+ZGF0YSBhbHJlYWR5IHBvaW50cyB0byBhIGdvb2QgcGxhY2UuCisJCSAqLworCX0KKwkKKwkvKgorCSAqIGZpbGwgaW4gdGhlIGRlc2NyaXB0b3IgCisJICovCisJCisjaWZkZWYgQ09ORklHX1NCTUFDX0NPQUxFU0NFCisJLyoKKwkgKiBEbyBub3QgaW50ZXJydXB0IHBlciBETUEgdHJhbnNmZXIuCisJICovCisJZHNjLT5kc2NyX2EgPSB2aXJ0X3RvX3BoeXMoc2JfbmV3LT50YWlsKSB8CisJCVZfRE1BX0RTQ1JBX0FfU0laRShOVU1DQUNIRUJMS1MocGt0c2l6ZStFVEhFUl9BTElHTikpIHwKKwkJMDsKKyNlbHNlCisJZHNjLT5kc2NyX2EgPSB2aXJ0X3RvX3BoeXMoc2JfbmV3LT50YWlsKSB8CisJCVZfRE1BX0RTQ1JBX0FfU0laRShOVU1DQUNIRUJMS1MocGt0c2l6ZStFVEhFUl9BTElHTikpIHwKKwkJTV9ETUFfRFNDUkFfSU5URVJSVVBUOworI2VuZGlmCisKKwkvKiByZWNlaXZpbmc6IG5vIG9wdGlvbnMgKi8KKwlkc2MtPmRzY3JfYiA9IDA7CisJCisJLyoKKwkgKiBmaWxsIGluIHRoZSBjb250ZXh0IAorCSAqLworCQorCWQtPnNiZG1hX2N0eHRhYmxlW2RzYy1kLT5zYmRtYV9kc2NydGFibGVdID0gc2JfbmV3OworCQorCS8qIAorCSAqIHBvaW50IGF0IG5leHQgcGFja2V0IAorCSAqLworCQorCWQtPnNiZG1hX2FkZHB0ciA9IG5leHRkc2M7CisJCisJLyogCisJICogR2l2ZSB0aGUgYnVmZmVyIHRvIHRoZSBETUEgZW5naW5lLgorCSAqLworCQorCVNCTUFDX1dSSVRFQ1NSKGQtPnNiZG1hX2RzY3JjbnQsMSk7CisJCisJcmV0dXJuIDA7CQkJCQkvKiB3ZSBkaWQgaXQgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQkRNQV9BRERfVFhCVUZGRVIoZCxzYikKKyAqICAKKyAqICBBZGQgYSB0cmFuc21pdCBidWZmZXIgdG8gdGhlIHNwZWNpZmllZCBETUEgY2hhbm5lbCwgY2F1c2luZyBhCisgKiAgdHJhbnNtaXQgdG8gc3RhcnQuCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIGQgLSBETUEgY2hhbm5lbCBkZXNjcmlwdG9yCisgKiAJICAgc2IgLSBza19idWZmIHRvIGFkZAorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIDAgdHJhbnNtaXQgcXVldWVkIHN1Y2Nlc3NmdWxseQorICogIAkgICBvdGhlcndpc2UgZXJyb3IgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKK3N0YXRpYyBpbnQgc2JkbWFfYWRkX3R4YnVmZmVyKHNibWFjZG1hX3QgKmQsc3RydWN0IHNrX2J1ZmYgKnNiKQoreworCXNiZG1hZHNjcl90ICpkc2M7CisJc2JkbWFkc2NyX3QgKm5leHRkc2M7CisJdWludDY0X3QgcGh5czsKKwl1aW50NjRfdCBuY2I7CisJaW50IGxlbmd0aDsKKwkKKwkvKiBnZXQgcG9pbnRlciB0byBvdXIgY3VycmVudCBwbGFjZSBpbiB0aGUgcmluZyAqLworCQorCWRzYyA9IGQtPnNiZG1hX2FkZHB0cjsKKwluZXh0ZHNjID0gU0JETUFfTkVYVEJVRihkLHNiZG1hX2FkZHB0cik7CisJCisJLyoKKwkgKiBmaWd1cmUgb3V0IGlmIHRoZSByaW5nIGlzIGZ1bGwgLSBpZiB0aGUgbmV4dCBkZXNjcmlwdG9yCisJICogaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB0aGF0IHdlJ3JlIGdvaW5nIHRvIHJlbW92ZSBmcm9tCisJICogdGhlIHJpbmcsIHRoZSByaW5nIGlzIGZ1bGwKKwkgKi8KKwkKKwlpZiAobmV4dGRzYyA9PSBkLT5zYmRtYV9yZW1wdHIpIHsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCQorCS8qCisJICogVW5kZXIgTGludXgsIGl0J3Mgbm90IG5lY2Vzc2FyeSB0byBjb3B5L2NvYWxlc2NlIGJ1ZmZlcnMKKwkgKiBsaWtlIGl0IGlzIG9uIE5ldEJTRC4gIFdlIHRoaW5rIHRoZXkncmUgYWxsIGNvbnRpZ3VvdXMsCisJICogYnV0IHRoYXQgbWF5IG5vdCBiZSB0cnVlIGZvciBHQkUuCisJICovCisJCisJbGVuZ3RoID0gc2ItPmxlbjsKKwkKKwkvKgorCSAqIGZpbGwgaW4gdGhlIGRlc2NyaXB0b3IuICBOb3RlIHRoYXQgdGhlIG51bWJlciBvZiBjYWNoZQorCSAqIGJsb2NrcyBpbiB0aGUgZGVzY3JpcHRvciBpcyB0aGUgbnVtYmVyIG9mIGJsb2NrcworCSAqICpzcGFubmVkKiwgc28gd2UgbmVlZCB0byBhZGQgaW4gdGhlIG9mZnNldCAoaWYgYW55KQorCSAqIHdoaWxlIGRvaW5nIHRoZSBjYWxjdWxhdGlvbi4KKwkgKi8KKwkKKwlwaHlzID0gdmlydF90b19waHlzKHNiLT5kYXRhKTsKKwluY2IgPSBOVU1DQUNIRUJMS1MobGVuZ3RoKyhwaHlzICYgKFNNUF9DQUNIRV9CWVRFUyAtIDEpKSk7CisKKwlkc2MtPmRzY3JfYSA9IHBoeXMgfCAKKwkJVl9ETUFfRFNDUkFfQV9TSVpFKG5jYikgfAorI2lmbmRlZiBDT05GSUdfU0JNQUNfQ09BTEVTQ0UKKwkJTV9ETUFfRFNDUkFfSU5URVJSVVBUIHwKKyNlbmRpZgorCQlNX0RNQV9FVEhUWF9TT1A7CisJCisJLyogdHJhbnNtaXR0aW5nOiBzZXQgb3V0Ym91bmQgb3B0aW9ucyBhbmQgbGVuZ3RoICovCisKKwlkc2MtPmRzY3JfYiA9IFZfRE1BX0RTQ1JCX09QVElPTlMoS19ETUFfRVRIVFhfQVBQRU5EQ1JDX0FQUEVORFBBRCkgfAorCQlWX0RNQV9EU0NSQl9QS1RfU0laRShsZW5ndGgpOworCQorCS8qCisJICogZmlsbCBpbiB0aGUgY29udGV4dCAKKwkgKi8KKwkKKwlkLT5zYmRtYV9jdHh0YWJsZVtkc2MtZC0+c2JkbWFfZHNjcnRhYmxlXSA9IHNiOworCQorCS8qIAorCSAqIHBvaW50IGF0IG5leHQgcGFja2V0IAorCSAqLworCQorCWQtPnNiZG1hX2FkZHB0ciA9IG5leHRkc2M7CisJCisJLyogCisJICogR2l2ZSB0aGUgYnVmZmVyIHRvIHRoZSBETUEgZW5naW5lLgorCSAqLworCQorCVNCTUFDX1dSSVRFQ1NSKGQtPnNiZG1hX2RzY3JjbnQsMSk7CisJCisJcmV0dXJuIDA7CQkJCQkvKiB3ZSBkaWQgaXQgKi8KK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQkRNQV9FTVBUWVJJTkcoZCkKKyAqICAKKyAqICBGcmVlIGFsbCBhbGxvY2F0ZWQgc2tfYnVmZnMgb24gdGhlIHNwZWNpZmllZCBETUEgY2hhbm5lbDsKKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgZCAgLSBETUEgY2hhbm5lbAorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JkbWFfZW1wdHlyaW5nKHNibWFjZG1hX3QgKmQpCit7CisJaW50IGlkeDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2I7CisJCisJZm9yIChpZHggPSAwOyBpZHggPCBkLT5zYmRtYV9tYXhkZXNjcjsgaWR4KyspIHsKKwkJc2IgPSBkLT5zYmRtYV9jdHh0YWJsZVtpZHhdOworCQlpZiAoc2IpIHsKKwkJCWRldl9rZnJlZV9za2Ioc2IpOworCQkJZC0+c2JkbWFfY3R4dGFibGVbaWR4XSA9IE5VTEw7CisJCX0KKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQkRNQV9GSUxMUklORyhkKQorICogIAorICogIEZpbGwgdGhlIHNwZWNpZmllZCBETUEgY2hhbm5lbCAobXVzdCBiZSByZWNlaXZlIGNoYW5uZWwpCisgKiAgd2l0aCBza19idWZmcworICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBkIC0gRE1BIGNoYW5uZWwKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNiZG1hX2ZpbGxyaW5nKHNibWFjZG1hX3QgKmQpCit7CisJaW50IGlkeDsKKwkKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IFNCTUFDX01BWF9SWERFU0NSLTE7IGlkeCsrKSB7CisJCWlmIChzYmRtYV9hZGRfcmN2YnVmZmVyKGQsTlVMTCkgIT0gMCkKKwkJCWJyZWFrOworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCRE1BX1JYX1BST0NFU1Moc2MsZCkKKyAqICAKKyAqICBQcm9jZXNzICJjb21wbGV0ZWQiIHJlY2VpdmUgYnVmZmVycyBvbiB0aGUgc3BlY2lmaWVkIERNQSBjaGFubmVsLiAgCisgKiAgTm90ZSB0aGF0IHRoaXMgaXNuJ3QgcmVhbGx5IGlkZWFsIGZvciBwcmlvcml0eSBjaGFubmVscywgc2luY2UKKyAqICBpdCBwcm9jZXNzZXMgYWxsIG9mIHRoZSBwYWNrZXRzIG9uIGEgZ2l2ZW4gY2hhbm5lbCBiZWZvcmUgCisgKiAgcmV0dXJuaW5nLiAKKyAqCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKgkgICBzYyAtIHNvZnRjIHN0cnVjdHVyZQorICogIAkgICBkIC0gRE1BIGNoYW5uZWwgY29udGV4dAorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JkbWFfcnhfcHJvY2VzcyhzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjLHNibWFjZG1hX3QgKmQpCit7CisJaW50IGN1cmlkeDsKKwlpbnQgaHdpZHg7CisJc2JkbWFkc2NyX3QgKmRzYzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2I7CisJaW50IGxlbjsKKwkKKwlmb3IgKDs7KSB7CisJCS8qIAorCQkgKiBmaWd1cmUgb3V0IHdoZXJlIHdlIGFyZSAoYXMgYW4gaW5kZXgpIGFuZCB3aGVyZQorCQkgKiB0aGUgaGFyZHdhcmUgaXMgKGFsc28gYXMgYW4gaW5kZXgpCisJCSAqCisJCSAqIFRoaXMgY291bGQgYmUgZG9uZSBmYXN0ZXIgaWYgKGZvciBleGFtcGxlKSB0aGUgCisJCSAqIGRlc2NyaXB0b3IgdGFibGUgd2FzIHBhZ2UtYWxpZ25lZCBhbmQgY29udGlndW91cyBpbgorCQkgKiBib3RoIHZpcnR1YWwgYW5kIHBoeXNpY2FsIG1lbW9yeSAtLSB5b3UgY291bGQgdGhlbgorCQkgKiBqdXN0IGNvbXBhcmUgdGhlIGxvdy1vcmRlciBiaXRzIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3MKKwkJICogKHNiZG1hX3JlbXB0cikgYW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIChzYmRtYV9jdXJkc2NyIENTUikKKwkJICovCisJCQorCQljdXJpZHggPSBkLT5zYmRtYV9yZW1wdHIgLSBkLT5zYmRtYV9kc2NydGFibGU7CisJCWh3aWR4ID0gKGludCkgKCgoU0JNQUNfUkVBRENTUihkLT5zYmRtYV9jdXJkc2NyKSAmIE1fRE1BX0NVUkRTQ1JfQUREUikgLQorCQkJCWQtPnNiZG1hX2RzY3J0YWJsZV9waHlzKSAvIHNpemVvZihzYmRtYWRzY3JfdCkpOworCQkKKwkJLyoKKwkJICogSWYgdGhleSdyZSB0aGUgc2FtZSwgdGhhdCBtZWFucyB3ZSd2ZSBwcm9jZXNzZWQgYWxsCisJCSAqIG9mIHRoZSBkZXNjcmlwdG9ycyB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoZSBvbmUgdGhhdAorCQkgKiB0aGUgaGFyZHdhcmUgaXMgd29ya2luZyBvbiByaWdodCBub3cuCisJCSAqLworCQkKKwkJaWYgKGN1cmlkeCA9PSBod2lkeCkKKwkJCWJyZWFrOworCQkKKwkJLyoKKwkJICogT3RoZXJ3aXNlLCBnZXQgdGhlIHBhY2tldCdzIHNrX2J1ZmYgcHRyIGJhY2sKKwkJICovCisJCQorCQlkc2MgPSAmKGQtPnNiZG1hX2RzY3J0YWJsZVtjdXJpZHhdKTsKKwkJc2IgPSBkLT5zYmRtYV9jdHh0YWJsZVtjdXJpZHhdOworCQlkLT5zYmRtYV9jdHh0YWJsZVtjdXJpZHhdID0gTlVMTDsKKwkJCisJCWxlbiA9IChpbnQpR19ETUFfRFNDUkJfUEtUX1NJWkUoZHNjLT5kc2NyX2IpIC0gNDsKKwkJCisJCS8qCisJCSAqIENoZWNrIHBhY2tldCBzdGF0dXMuICBJZiBnb29kLCBwcm9jZXNzIGl0LgorCQkgKiBJZiBub3QsIHNpbGVudGx5IGRyb3AgaXQgYW5kIHB1dCBpdCBiYWNrIG9uIHRoZQorCQkgKiByZWNlaXZlIHJpbmcuCisJCSAqLworCQkKKwkJaWYgKCEoZHNjLT5kc2NyX2EgJiBNX0RNQV9FVEhSWF9CQUQpKSB7CisJCQkKKwkJCS8qCisJCQkgKiBBZGQgYSBuZXcgYnVmZmVyIHRvIHJlcGxhY2UgdGhlIG9sZCBvbmUuICBJZiB3ZSBmYWlsCisJCQkgKiB0byBhbGxvY2F0ZSBhIGJ1ZmZlciwgd2UncmUgZ29pbmcgdG8gZHJvcCB0aGlzCisJCQkgKiBwYWNrZXQgYW5kIHB1dCBpdCByaWdodCBiYWNrIG9uIHRoZSByZWNlaXZlIHJpbmcuCisJCQkgKi8KKwkJCQorCQkJaWYgKHNiZG1hX2FkZF9yY3ZidWZmZXIoZCxOVUxMKSA9PSAtRU5PQlVGUykgeworCQkJCXNjLT5zYm1fc3RhdHMucnhfZHJvcHBlZCsrOworCQkJCXNiZG1hX2FkZF9yY3ZidWZmZXIoZCxzYik7IC8qIHJlLWFkZCBvbGQgYnVmZmVyICovCisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogU2V0IGxlbmd0aCBpbnRvIHRoZSBwYWNrZXQKKwkJCQkgKi8KKwkJCQlza2JfcHV0KHNiLGxlbik7CisJCQkJCisJCQkJLyoKKwkJCQkgKiBCdWZmZXIgaGFzIGJlZW4gcmVwbGFjZWQgb24gdGhlCisJCQkJICogcmVjZWl2ZSByaW5nLiAgUGFzcyB0aGUgYnVmZmVyIHRvCisJCQkJICogdGhlIGtlcm5lbAorCQkJCSAqLworCQkJCXNjLT5zYm1fc3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQkJCXNjLT5zYm1fc3RhdHMucnhfcGFja2V0cysrOworCQkJCXNiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNiLGQtPnNiZG1hX2V0aC0+c2JtX2Rldik7CisJCQkJLyogQ2hlY2sgaHcgSVB2NC9UQ1AgY2hlY2tzdW0gaWYgc3VwcG9ydGVkICovCisJCQkJaWYgKHNjLT5yeF9od19jaGVja3N1bSA9PSBFTkFCTEUpIHsKKwkJCQkJaWYgKCEoKGRzYy0+ZHNjcl9hKSAmIE1fRE1BX0VUSFJYX0JBRElQNENTKSAmJgorCQkJCQkgICAgISgoZHNjLT5kc2NyX2EpICYgTV9ETUFfRVRIUlhfQkFEVENQQ1MpKSB7CisJCQkJCQlzYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCQkJCQkvKiBkb24ndCBuZWVkIHRvIHNldCBzYi0+Y3N1bSAqLworCQkJCQl9IGVsc2UgeworCQkJCQkJc2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJbmV0aWZfcngoc2IpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFBhY2tldCB3YXMgbWFuZ2xlZCBzb21laG93LiAgSnVzdCBkcm9wIGl0IGFuZAorCQkJICogcHV0IGl0IGJhY2sgb24gdGhlIHJlY2VpdmUgcmluZy4KKwkJCSAqLworCQkJc2MtPnNibV9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCXNiZG1hX2FkZF9yY3ZidWZmZXIoZCxzYik7CisJCX0KKwkJCisJCQorCQkvKiAKKwkJICogLi4gYW5kIGFkdmFuY2UgdG8gdGhlIG5leHQgYnVmZmVyLgorCQkgKi8KKwkJCisJCWQtPnNiZG1hX3JlbXB0ciA9IFNCRE1BX05FWFRCVUYoZCxzYmRtYV9yZW1wdHIpOworCQkKKwl9Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCRE1BX1RYX1BST0NFU1Moc2MsZCkKKyAqICAKKyAqICBQcm9jZXNzICJjb21wbGV0ZWQiIHRyYW5zbWl0IGJ1ZmZlcnMgb24gdGhlIHNwZWNpZmllZCBETUEgY2hhbm5lbC4gIAorICogIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIHdpdGhpbiB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4KKyAqICBOb3RlIHRoYXQgdGhpcyBpc24ndCByZWFsbHkgaWRlYWwgZm9yIHByaW9yaXR5IGNoYW5uZWxzLCBzaW5jZQorICogIGl0IHByb2Nlc3NlcyBhbGwgb2YgdGhlIHBhY2tldHMgb24gYSBnaXZlbiBjaGFubmVsIGJlZm9yZSAKKyAqICByZXR1cm5pbmcuIAorICoKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAgICAgc2MgLSBzb2Z0YyBzdHJ1Y3R1cmUKKyAqICAJICAgZCAtIERNQSBjaGFubmVsIGNvbnRleHQKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNiZG1hX3R4X3Byb2Nlc3Moc3RydWN0IHNibWFjX3NvZnRjICpzYyxzYm1hY2RtYV90ICpkKQoreworCWludCBjdXJpZHg7CisJaW50IGh3aWR4OworCXNiZG1hZHNjcl90ICpkc2M7CisJc3RydWN0IHNrX2J1ZmYgKnNiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHNjLT5zYm1fbG9jayksIGZsYWdzKTsKKwkKKwlmb3IgKDs7KSB7CisJCS8qIAorCQkgKiBmaWd1cmUgb3V0IHdoZXJlIHdlIGFyZSAoYXMgYW4gaW5kZXgpIGFuZCB3aGVyZQorCQkgKiB0aGUgaGFyZHdhcmUgaXMgKGFsc28gYXMgYW4gaW5kZXgpCisJCSAqCisJCSAqIFRoaXMgY291bGQgYmUgZG9uZSBmYXN0ZXIgaWYgKGZvciBleGFtcGxlKSB0aGUgCisJCSAqIGRlc2NyaXB0b3IgdGFibGUgd2FzIHBhZ2UtYWxpZ25lZCBhbmQgY29udGlndW91cyBpbgorCQkgKiBib3RoIHZpcnR1YWwgYW5kIHBoeXNpY2FsIG1lbW9yeSAtLSB5b3UgY291bGQgdGhlbgorCQkgKiBqdXN0IGNvbXBhcmUgdGhlIGxvdy1vcmRlciBiaXRzIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3MKKwkJICogKHNiZG1hX3JlbXB0cikgYW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIChzYmRtYV9jdXJkc2NyIENTUikKKwkJICovCisJCQorCQljdXJpZHggPSBkLT5zYmRtYV9yZW1wdHIgLSBkLT5zYmRtYV9kc2NydGFibGU7CisJCWh3aWR4ID0gKGludCkgKCgoU0JNQUNfUkVBRENTUihkLT5zYmRtYV9jdXJkc2NyKSAmIE1fRE1BX0NVUkRTQ1JfQUREUikgLQorCQkJCWQtPnNiZG1hX2RzY3J0YWJsZV9waHlzKSAvIHNpemVvZihzYmRtYWRzY3JfdCkpOworCisJCS8qCisJCSAqIElmIHRoZXkncmUgdGhlIHNhbWUsIHRoYXQgbWVhbnMgd2UndmUgcHJvY2Vzc2VkIGFsbAorCQkgKiBvZiB0aGUgZGVzY3JpcHRvcnMgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGUgb25lIHRoYXQKKwkJICogdGhlIGhhcmR3YXJlIGlzIHdvcmtpbmcgb24gcmlnaHQgbm93LgorCQkgKi8KKwkJCisJCWlmIChjdXJpZHggPT0gaHdpZHgpCisJCQlicmVhazsKKwkJCisJCS8qCisJCSAqIE90aGVyd2lzZSwgZ2V0IHRoZSBwYWNrZXQncyBza19idWZmIHB0ciBiYWNrCisJCSAqLworCQkKKwkJZHNjID0gJihkLT5zYmRtYV9kc2NydGFibGVbY3VyaWR4XSk7CisJCXNiID0gZC0+c2JkbWFfY3R4dGFibGVbY3VyaWR4XTsKKwkJZC0+c2JkbWFfY3R4dGFibGVbY3VyaWR4XSA9IE5VTEw7CisJCQorCQkvKgorCQkgKiBTdGF0cworCQkgKi8KKwkJCisJCXNjLT5zYm1fc3RhdHMudHhfYnl0ZXMgKz0gc2ItPmxlbjsKKwkJc2MtPnNibV9zdGF0cy50eF9wYWNrZXRzKys7CisJCQorCQkvKgorCQkgKiBmb3IgdHJhbnNtaXRzLCB3ZSBqdXN0IGZyZWUgYnVmZmVycy4KKwkJICovCisJCQorCQlkZXZfa2ZyZWVfc2tiX2lycShzYik7CisJCQorCQkvKiAKKwkJICogLi4gYW5kIGFkdmFuY2UgdG8gdGhlIG5leHQgYnVmZmVyLgorCQkgKi8KKworCQlkLT5zYmRtYV9yZW1wdHIgPSBTQkRNQV9ORVhUQlVGKGQsc2JkbWFfcmVtcHRyKTsKKwkJCisJfQorCQorCS8qCisJICogRGVjaWRlIGlmIHdlIHNob3VsZCB3YWtlIHVwIHRoZSBwcm90b2NvbCBvciBub3QuCisJICogT3RoZXIgZHJpdmVycyBzZWVtIHRvIGRvIHRoaXMgd2hlbiB3ZSByZWFjaCBhIGxvdworCSAqIHdhdGVybWFyayBvbiB0aGUgdHJhbnNtaXQgcXVldWUuCisJICovCisJCisJbmV0aWZfd2FrZV9xdWV1ZShkLT5zYmRtYV9ldGgtPnNibV9kZXYpOworCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihzYy0+c2JtX2xvY2spLCBmbGFncyk7CisJCit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX0lOSVRDVFgocykKKyAqICAKKyAqICBJbml0aWFsaXplIGFuIEV0aGVybmV0IGNvbnRleHQgc3RydWN0dXJlIC0gdGhpcyBpcyBjYWxsZWQKKyAqICBvbmNlIHBlciBNQUMgb24gdGhlIDEyNTAuICBNZW1vcnkgaXMgYWxsb2NhdGVkIGhlcmUsIHNvIGRvbid0CisgKiAgY2FsbCBpdCBhZ2FpbiBmcm9tIGluc2lkZSB0aGUgaW9jdGwgcm91dGluZXMgdGhhdCBicmluZyB0aGUKKyAqICBpbnRlcmZhY2UgdXAvZG93bgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzIC0gc2JtYWMgY29udGV4dCBzdHJ1Y3R1cmUKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICAwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbnQgc2JtYWNfaW5pdGN0eChzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMpCit7CisJCisJLyogCisJICogZmlndXJlIG91dCB0aGUgYWRkcmVzc2VzIG9mIHNvbWUgcG9ydHMgCisJICovCisJCisJcy0+c2JtX21hY2VuYWJsZSA9IHMtPnNibV9iYXNlICsgUl9NQUNfRU5BQkxFOworCXMtPnNibV9tYWNjZmcgICAgPSBzLT5zYm1fYmFzZSArIFJfTUFDX0NGRzsKKwlzLT5zYm1fZmlmb2NmZyAgID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19USFJTSF9DRkc7CisJcy0+c2JtX2ZyYW1lY2ZnICA9IHMtPnNibV9iYXNlICsgUl9NQUNfRlJBTUVDRkc7CisJcy0+c2JtX3J4ZmlsdGVyICA9IHMtPnNibV9iYXNlICsgUl9NQUNfQURGSUxURVJfQ0ZHOworCXMtPnNibV9pc3IgICAgICAgPSBzLT5zYm1fYmFzZSArIFJfTUFDX1NUQVRVUzsKKwlzLT5zYm1faW1yICAgICAgID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19JTlRfTUFTSzsKKwlzLT5zYm1fbWRpbyAgICAgID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19NRElPOworCisJcy0+c2JtX3BoeXNbMF0gICA9IDE7CisJcy0+c2JtX3BoeXNbMV0gICA9IDA7CisKKwlzLT5zYm1fcGh5X29sZGJtc3IgPSAwOworCXMtPnNibV9waHlfb2xkYW5scGFyID0gMDsKKwlzLT5zYm1fcGh5X29sZGsxc3RzciA9IDA7CisJcy0+c2JtX3BoeV9vbGRsaW5rc3RhdCA9IDA7CisJCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBETUEgY2hhbm5lbHMuICBSaWdodCBub3csIG9ubHkgb25lIHBlciBNQUMgaXMgdXNlZAorCSAqIE5vdGU6IE9ubHkgZG8gdGhpcyBfb25jZV8sIGFzIGl0IGFsbG9jYXRlcyBtZW1vcnkgZnJvbSB0aGUga2VybmVsIQorCSAqLworCQorCXNiZG1hX2luaXRjdHgoJihzLT5zYm1fdHhkbWEpLHMsMCxETUFfVFgsU0JNQUNfTUFYX1RYREVTQ1IpOworCXNiZG1hX2luaXRjdHgoJihzLT5zYm1fcnhkbWEpLHMsMCxETUFfUlgsU0JNQUNfTUFYX1JYREVTQ1IpOworCQorCS8qCisJICogaW5pdGlhbCBzdGF0ZSBpcyBPRkYKKwkgKi8KKwkKKwlzLT5zYm1fc3RhdGUgPSBzYm1hY19zdGF0ZV9vZmY7CisJCisJLyoKKwkgKiBJbml0aWFsIHNwZWVkIGlzIChYWFggVEVNUCkgMTBNQml0L3MgSERYIG5vIEZDCisJICovCisJCisJcy0+c2JtX3NwZWVkID0gc2JtYWNfc3BlZWRfMTA7CisJcy0+c2JtX2R1cGxleCA9IHNibWFjX2R1cGxleF9oYWxmOworCXMtPnNibV9mYyA9IHNibWFjX2ZjX2Rpc2FibGVkOworCQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHNiZG1hX3VuaW5pdGN0eChzdHJ1Y3Qgc2JtYWNkbWFfcyAqZCkKK3sKKwlpZiAoZC0+c2JkbWFfZHNjcnRhYmxlKSB7CisJCWtmcmVlKGQtPnNiZG1hX2RzY3J0YWJsZSk7CisJCWQtPnNiZG1hX2RzY3J0YWJsZSA9IE5VTEw7CisJfQorCQorCWlmIChkLT5zYmRtYV9jdHh0YWJsZSkgeworCQlrZnJlZShkLT5zYmRtYV9jdHh0YWJsZSk7CisJCWQtPnNiZG1hX2N0eHRhYmxlID0gTlVMTDsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgc2JtYWNfdW5pbml0Y3R4KHN0cnVjdCBzYm1hY19zb2Z0YyAqc2MpCit7CisJc2JkbWFfdW5pbml0Y3R4KCYoc2MtPnNibV90eGRtYSkpOworCXNiZG1hX3VuaW5pdGN0eCgmKHNjLT5zYm1fcnhkbWEpKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX0NIQU5ORUxfU1RBUlQocykKKyAqICAKKyAqICBTdGFydCBwYWNrZXQgcHJvY2Vzc2luZyBvbiB0aGlzIE1BQy4KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgcyAtIHNibWFjIHN0cnVjdHVyZQorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JtYWNfY2hhbm5lbF9zdGFydChzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMpCit7CisJdWludDY0X3QgcmVnOworCXNibWFjX3BvcnRfdCBwb3J0OworCXVpbnQ2NF90IGNmZyxmaWZvLGZyYW1lY2ZnOworCWludCBpZHgsIHRoX3ZhbHVlOworCQorCS8qCisJICogRG9uJ3QgZG8gdGhpcyBpZiBydW5uaW5nCisJICovCisKKwlpZiAocy0+c2JtX3N0YXRlID09IHNibWFjX3N0YXRlX29uKQorCQlyZXR1cm47CisJCisJLyoKKwkgKiBCcmluZyB0aGUgY29udHJvbGxlciBvdXQgb2YgcmVzZXQsIGJ1dCBsZWF2ZSBpdCBvZmYuCisJICovCisJCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21hY2VuYWJsZSwwKTsKKwkKKwkvKgorCSAqIElnbm9yZSBhbGwgcmVjZWl2ZWQgcGFja2V0cworCSAqLworCQorCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9yeGZpbHRlciwwKTsKKwkKKwkvKiAKKwkgKiBDYWxjdWxhdGUgdmFsdWVzIGZvciB2YXJpb3VzIGNvbnRyb2wgcmVnaXN0ZXJzLgorCSAqLworCQorCWNmZyA9IE1fTUFDX1JFVFJZX0VOIHwKKwkJTV9NQUNfVFhfSE9MRF9TT1BfRU4gfCAKKwkJVl9NQUNfVFhfUEFVU0VfQ05UXzE2SyB8CisJCU1fTUFDX0FQX1NUQVRfRU4gfAorCQlNX01BQ19GQVNUX1NZTkMgfAorCQlNX01BQ19TU19FTiB8CisJCTA7CisJCisJLyogCisJICogQmUgc3VyZSB0aGF0IFJEX1RIUlNIK1dSX1RIUlNIIDw9IDMyIGZvciBwYXNzMSBwYXJzCisJICogYW5kIG1ha2Ugc3VyZSB0aGF0IFJEX1RIUlNIICsgV1JfVEhSU0ggPD0xMjggZm9yIHBhc3MyIGFuZCBhYm92ZQorCSAqIFVzZSBhIGxhcmdlciBSRF9USFJTSCBmb3IgZ2lnYWJpdAorCSAqLworCWlmIChwZXJpcGhfcmV2ID49IDIpIAorCQl0aF92YWx1ZSA9IDY0OworCWVsc2UgCisJCXRoX3ZhbHVlID0gMjg7CisKKwlmaWZvID0gVl9NQUNfVFhfV1JfVEhSU0goNCkgfAkvKiBNdXN0IGJlICc0JyBvciAnOCcgKi8KKwkJKChzLT5zYm1fc3BlZWQgPT0gc2JtYWNfc3BlZWRfMTAwMCkKKwkJID8gVl9NQUNfVFhfUkRfVEhSU0godGhfdmFsdWUpIDogVl9NQUNfVFhfUkRfVEhSU0goNCkpIHwKKwkJVl9NQUNfVFhfUkxfVEhSU0goNCkgfAorCQlWX01BQ19SWF9QTF9USFJTSCg0KSB8CisJCVZfTUFDX1JYX1JEX1RIUlNIKDQpIHwJLyogTXVzdCBiZSAnNCcgKi8KKwkJVl9NQUNfUlhfUExfVEhSU0goNCkgfAorCQlWX01BQ19SWF9STF9USFJTSCg4KSB8CisJCTA7CisKKwlmcmFtZWNmZyA9IFZfTUFDX01JTl9GUkFNRVNaX0RFRkFVTFQgfAorCQlWX01BQ19NQVhfRlJBTUVTWl9ERUZBVUxUIHwKKwkJVl9NQUNfQkFDS09GRl9TRUwoMSk7CisKKwkvKgorCSAqIENsZWFyIG91dCB0aGUgaGFzaCBhZGRyZXNzIG1hcCAKKwkgKi8KKwkKKwlwb3J0ID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19IQVNIX0JBU0U7CisJZm9yIChpZHggPSAwOyBpZHggPCBNQUNfSEFTSF9DT1VOVDsgaWR4KyspIHsKKwkJU0JNQUNfV1JJVEVDU1IocG9ydCwwKTsKKwkJcG9ydCArPSBzaXplb2YodWludDY0X3QpOworCX0KKwkKKwkvKgorCSAqIENsZWFyIG91dCB0aGUgZXhhY3QtbWF0Y2ggdGFibGUKKwkgKi8KKwkKKwlwb3J0ID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19BRERSX0JBU0U7CisJZm9yIChpZHggPSAwOyBpZHggPCBNQUNfQUREUl9DT1VOVDsgaWR4KyspIHsKKwkJU0JNQUNfV1JJVEVDU1IocG9ydCwwKTsKKwkJcG9ydCArPSBzaXplb2YodWludDY0X3QpOworCX0KKwkKKwkvKgorCSAqIENsZWFyIG91dCB0aGUgRE1BIENoYW5uZWwgbWFwcGluZyB0YWJsZSByZWdpc3RlcnMKKwkgKi8KKwkKKwlwb3J0ID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19DSFVQMF9CQVNFOworCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFDX0NITUFQX0NPVU5UOyBpZHgrKykgeworCQlTQk1BQ19XUklURUNTUihwb3J0LDApOworCQlwb3J0ICs9IHNpemVvZih1aW50NjRfdCk7CisJfQorCisKKwlwb3J0ID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19DSExPMF9CQVNFOworCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFDX0NITUFQX0NPVU5UOyBpZHgrKykgeworCQlTQk1BQ19XUklURUNTUihwb3J0LDApOworCQlwb3J0ICs9IHNpemVvZih1aW50NjRfdCk7CisJfQorCQorCS8qCisJICogUHJvZ3JhbSB0aGUgaGFyZHdhcmUgYWRkcmVzcy4gIEl0IGdvZXMgaW50byB0aGUgaGFyZHdhcmUtYWRkcmVzcworCSAqIHJlZ2lzdGVyIGFzIHdlbGwgYXMgdGhlIGZpcnN0IGZpbHRlciByZWdpc3Rlci4KKwkgKi8KKwkKKwlyZWcgPSBzYm1hY19hZGRyMnJlZyhzLT5zYm1faHdhZGRyKTsKKwkKKwlwb3J0ID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19BRERSX0JBU0U7CisJU0JNQUNfV1JJVEVDU1IocG9ydCxyZWcpOworCXBvcnQgPSBzLT5zYm1fYmFzZSArIFJfTUFDX0VUSEVSTkVUX0FERFI7CisKKyNpZmRlZiBDT05GSUdfU0IxX1BBU1NfMV9XT1JLQVJPVU5EUworCS8qCisJICogUGFzczEgU09DcyBkbyBub3QgcmVjZWl2ZSBwYWNrZXRzIGFkZHJlc3NlZCB0byB0aGUKKwkgKiBkZXN0aW5hdGlvbiBhZGRyZXNzIGluIHRoZSBSX01BQ19FVEhFUk5FVF9BRERSIHJlZ2lzdGVyLgorCSAqIFNldCB0aGUgdmFsdWUgdG8gemVyby4KKwkgKi8KKwlTQk1BQ19XUklURUNTUihwb3J0LDApOworI2Vsc2UKKwlTQk1BQ19XUklURUNTUihwb3J0LHJlZyk7CisjZW5kaWYKKwkKKwkvKgorCSAqIFNldCB0aGUgcmVjZWl2ZSBmaWx0ZXIgZm9yIG5vIHBhY2tldHMsIGFuZCB3cml0ZSB2YWx1ZXMKKwkgKiB0byB0aGUgdmFyaW91cyBjb25maWcgcmVnaXN0ZXJzCisJICovCisJCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX3J4ZmlsdGVyLDApOworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9pbXIsMCk7CisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX2ZyYW1lY2ZnLGZyYW1lY2ZnKTsKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fZmlmb2NmZyxmaWZvKTsKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWFjY2ZnLGNmZyk7CisJCisJLyoKKwkgKiBJbml0aWFsaXplIERNQSBjaGFubmVscyAocmluZ3Mgc2hvdWxkIGJlIG9rIG5vdykKKwkgKi8KKwkKKwlzYmRtYV9jaGFubmVsX3N0YXJ0KCYocy0+c2JtX3J4ZG1hKSwgRE1BX1JYKTsKKwlzYmRtYV9jaGFubmVsX3N0YXJ0KCYocy0+c2JtX3R4ZG1hKSwgRE1BX1RYKTsKKwkKKwkvKgorCSAqIENvbmZpZ3VyZSB0aGUgc3BlZWQsIGR1cGxleCwgYW5kIGZsb3cgY29udHJvbAorCSAqLworCisJc2JtYWNfc2V0X3NwZWVkKHMscy0+c2JtX3NwZWVkKTsKKwlzYm1hY19zZXRfZHVwbGV4KHMscy0+c2JtX2R1cGxleCxzLT5zYm1fZmMpOworCQorCS8qCisJICogRmlsbCB0aGUgcmVjZWl2ZSByaW5nCisJICovCisJCisJc2JkbWFfZmlsbHJpbmcoJihzLT5zYm1fcnhkbWEpKTsKKwkKKwkvKiAKKwkgKiBUdXJuIG9uIHRoZSByZXN0IG9mIHRoZSBiaXRzIGluIHRoZSBlbmFibGUgcmVnaXN0ZXIKKwkgKi8gICAgICAKKwkKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWFjZW5hYmxlLAorCQkgICAgICAgTV9NQUNfUlhETUFfRU4wIHwKKwkJICAgICAgIE1fTUFDX1RYRE1BX0VOMCB8CisJCSAgICAgICBNX01BQ19SWF9FTkFCTEUgfAorCQkgICAgICAgTV9NQUNfVFhfRU5BQkxFKTsKKwkKKwkKKworCisjaWZkZWYgQ09ORklHX1NCTUFDX0NPQUxFU0NFCisJLyoKKwkgKiBBY2NlcHQgYW55IFRYIGludGVycnVwdCBhbmQgRU9QIGNvdW50L3RpbWVyIFJYIGludGVycnVwdHMgb24gY2ggMAorCSAqLworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9pbXIsCisJCSAgICAgICAoKE1fTUFDX0lOVF9FT1BfQ09VTlQgfCBNX01BQ19JTlRfRU9QX1RJTUVSKSA8PCBTX01BQ19UWF9DSDApIHwKKwkJICAgICAgICgoTV9NQUNfSU5UX0VPUF9DT1VOVCB8IE1fTUFDX0lOVF9FT1BfVElNRVIpIDw8IFNfTUFDX1JYX0NIMCkpOworI2Vsc2UKKwkvKgorCSAqIEFjY2VwdCBhbnkga2luZCBvZiBpbnRlcnJ1cHQgb24gVFggYW5kIFJYIERNQSBjaGFubmVsIDAKKwkgKi8KKwlTQk1BQ19XUklURUNTUihzLT5zYm1faW1yLAorCQkgICAgICAgKE1fTUFDX0lOVF9DSEFOTkVMIDw8IFNfTUFDX1RYX0NIMCkgfAorCQkgICAgICAgKE1fTUFDX0lOVF9DSEFOTkVMIDw8IFNfTUFDX1JYX0NIMCkpOworI2VuZGlmCisJCisJLyogCisJICogRW5hYmxlIHJlY2VpdmluZyB1bmljYXN0cyBhbmQgYnJvYWRjYXN0cyAKKwkgKi8KKwkKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fcnhmaWx0ZXIsTV9NQUNfVUNBU1RfRU4gfCBNX01BQ19CQ0FTVF9FTik7CisJCisJLyoKKwkgKiB3ZSdyZSBydW5uaW5nIG5vdy4gCisJICovCisJCisJcy0+c2JtX3N0YXRlID0gc2JtYWNfc3RhdGVfb247CisJCisJLyogCisJICogUHJvZ3JhbSBtdWx0aWNhc3QgYWRkcmVzc2VzIAorCSAqLworCQorCXNibWFjX3NldG11bHRpKHMpOworCQorCS8qIAorCSAqIElmIGNoYW5uZWwgd2FzIGluIHByb21pc2N1b3VzIG1vZGUgYmVmb3JlLCB0dXJuIHRoYXQgb24gCisJICovCisJCisJaWYgKHMtPnNibV9kZXZmbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCXNibWFjX3Byb21pc2N1b3VzX21vZGUocywxKTsKKwl9CisJCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19DSEFOTkVMX1NUT1AocykKKyAqICAKKyAqICBTdG9wIHBhY2tldCBwcm9jZXNzaW5nIG9uIHRoaXMgTUFDLgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzIC0gc2JtYWMgc3RydWN0dXJlCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgbm90aGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdm9pZCBzYm1hY19jaGFubmVsX3N0b3Aoc3RydWN0IHNibWFjX3NvZnRjICpzKQoreworCS8qIGRvbid0IGRvIHRoaXMgaWYgYWxyZWFkeSBzdG9wcGVkICovCisJCisJaWYgKHMtPnNibV9zdGF0ZSA9PSBzYm1hY19zdGF0ZV9vZmYpCisJCXJldHVybjsKKwkKKwkvKiBkb24ndCBhY2NlcHQgYW55IHBhY2tldHMsIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwkKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fcnhmaWx0ZXIsMCk7CisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX2ltciwwKTsKKwkKKwkvKiBUdXJuIG9mZiB0aWNrZXIgKi8KKwkKKwkvKiBYWFggKi8KKwkKKwkvKiB0dXJuIG9mZiByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIgKi8KKwkKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWFjZW5hYmxlLDApOworCQorCS8qIFdlJ3JlIHN0b3BwZWQgbm93LiAqLworCQorCXMtPnNibV9zdGF0ZSA9IHNibWFjX3N0YXRlX29mZjsKKwkKKwkvKgorCSAqIFN0b3AgRE1BIGNoYW5uZWxzIChyaW5ncyBzaG91bGQgYmUgb2sgbm93KQorCSAqLworCQorCXNiZG1hX2NoYW5uZWxfc3RvcCgmKHMtPnNibV9yeGRtYSkpOworCXNiZG1hX2NoYW5uZWxfc3RvcCgmKHMtPnNibV90eGRtYSkpOworCQorCS8qIEVtcHR5IHRoZSByZWNlaXZlIGFuZCB0cmFuc21pdCByaW5ncyAqLworCQorCXNiZG1hX2VtcHR5cmluZygmKHMtPnNibV9yeGRtYSkpOworCXNiZG1hX2VtcHR5cmluZygmKHMtPnNibV90eGRtYSkpOworCQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX1NFVF9DSEFOTkVMX1NUQVRFKHN0YXRlKQorICogIAorICogIFNldCB0aGUgY2hhbm5lbCdzIHN0YXRlIE9OIG9yIE9GRgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzdGF0ZSAtIG5ldyBzdGF0ZQorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG9sZCBzdGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIHNibWFjX3N0YXRlX3Qgc2JtYWNfc2V0X2NoYW5uZWxfc3RhdGUoc3RydWN0IHNibWFjX3NvZnRjICpzYywKKwkJCQkJICAgICBzYm1hY19zdGF0ZV90IHN0YXRlKQoreworCXNibWFjX3N0YXRlX3Qgb2xkc3RhdGUgPSBzYy0+c2JtX3N0YXRlOworCQorCS8qCisJICogSWYgc2FtZSBhcyBwcmV2aW91cyBzdGF0ZSwgcmV0dXJuCisJICovCisJCisJaWYgKHN0YXRlID09IG9sZHN0YXRlKSB7CisJCXJldHVybiBvbGRzdGF0ZTsKKwl9CisJCisJLyoKKwkgKiBJZiBuZXcgc3RhdGUgaXMgT04sIHR1cm4gY2hhbm5lbCBvbiAKKwkgKi8KKwkKKwlpZiAoc3RhdGUgPT0gc2JtYWNfc3RhdGVfb24pIHsKKwkJc2JtYWNfY2hhbm5lbF9zdGFydChzYyk7CisJfQorCWVsc2UgeworCQlzYm1hY19jaGFubmVsX3N0b3Aoc2MpOworCX0KKwkKKwkvKgorCSAqIFJldHVybiBwcmV2aW91cyBzdGF0ZQorCSAqLworCQorCXJldHVybiBvbGRzdGF0ZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX1BST01JU0NVT1VTX01PREUoc2Msb25vZmYpCisgKiAgCisgKiAgVHVybiBvbiBvciBvZmYgcHJvbWlzY3VvdXMgbW9kZQorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzYyAtIHNvZnRjCisgKiAgICAgIG9ub2ZmIC0gMSB0byB0dXJuIG9uLCAwIHRvIHR1cm4gb2ZmCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgbm90aGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdm9pZCBzYm1hY19wcm9taXNjdW91c19tb2RlKHN0cnVjdCBzYm1hY19zb2Z0YyAqc2MsaW50IG9ub2ZmKQoreworCXVpbnQ2NF90IHJlZzsKKwkKKwlpZiAoc2MtPnNibV9zdGF0ZSAhPSBzYm1hY19zdGF0ZV9vbikKKwkJcmV0dXJuOworCQorCWlmIChvbm9mZikgeworCQlyZWcgPSBTQk1BQ19SRUFEQ1NSKHNjLT5zYm1fcnhmaWx0ZXIpOworCQlyZWcgfD0gTV9NQUNfQUxMUEtUX0VOOworCQlTQk1BQ19XUklURUNTUihzYy0+c2JtX3J4ZmlsdGVyLHJlZyk7CisJfQkKKwllbHNlIHsKKwkJcmVnID0gU0JNQUNfUkVBRENTUihzYy0+c2JtX3J4ZmlsdGVyKTsKKwkJcmVnICY9IH5NX01BQ19BTExQS1RfRU47CisJCVNCTUFDX1dSSVRFQ1NSKHNjLT5zYm1fcnhmaWx0ZXIscmVnKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfU0VUSVBIRFJfT0ZGU0VUKHNjLG9ub2ZmKQorICogIAorICogIFNldCB0aGUgaXBoZHIgb2Zmc2V0IGFzIDE1IGFzc3VtaW5nIGV0aGVybmV0IGVuY2Fwc3VsYXRpb24KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgc2MgLSBzb2Z0YworICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JtYWNfc2V0X2lwaGRyX29mZnNldChzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjKQoreworCXVpbnQ2NF90IHJlZzsKKwkKKwkvKiBIYXJkIGNvZGUgdGhlIG9mZiBzZXQgdG8gMTUgZm9yIG5vdyAqLworCXJlZyA9IFNCTUFDX1JFQURDU1Ioc2MtPnNibV9yeGZpbHRlcik7CisJcmVnICY9IH5NX01BQ19JUEhEUl9PRkZTRVQgfCBWX01BQ19JUEhEUl9PRkZTRVQoMTUpOworCVNCTUFDX1dSSVRFQ1NSKHNjLT5zYm1fcnhmaWx0ZXIscmVnKTsKKwkKKwkvKiByZWFkIHN5c3RlbSBpZGVudGlmaWNhdGlvbiB0byBkZXRlcm1pbmUgcmV2aXNpb24gKi8KKwlpZiAocGVyaXBoX3JldiA+PSAyKSB7CisJCXNjLT5yeF9od19jaGVja3N1bSA9IEVOQUJMRTsKKwl9IGVsc2UgeworCQlzYy0+cnhfaHdfY2hlY2tzdW0gPSBESVNBQkxFOworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX0FERFIyUkVHKHB0cikKKyAqICAKKyAqICBDb252ZXJ0IHNpeCBieXRlcyBpbnRvIHRoZSA2NC1iaXQgcmVnaXN0ZXIgdmFsdWUgdGhhdAorICogIHdlIHR5cGljYWxseSB3cml0ZSBpbnRvIHRoZSBTQk1BQydzIGFkZHJlc3MvbWNhc3QgcmVnaXN0ZXJzCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIHB0ciAtIHBvaW50ZXIgdG8gNiBieXRlcworICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIHJlZ2lzdGVyIHZhbHVlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB1aW50NjRfdCBzYm1hY19hZGRyMnJlZyh1bnNpZ25lZCBjaGFyICpwdHIpCit7CisJdWludDY0X3QgcmVnID0gMDsKKwkKKwlwdHIgKz0gNjsKKwkKKwlyZWcgfD0gKHVpbnQ2NF90KSAqKC0tcHRyKTsgCisJcmVnIDw8PSA4OworCXJlZyB8PSAodWludDY0X3QpICooLS1wdHIpOyAKKwlyZWcgPDw9IDg7CisJcmVnIHw9ICh1aW50NjRfdCkgKigtLXB0cik7IAorCXJlZyA8PD0gODsKKwlyZWcgfD0gKHVpbnQ2NF90KSAqKC0tcHRyKTsgCisJcmVnIDw8PSA4OworCXJlZyB8PSAodWludDY0X3QpICooLS1wdHIpOyAKKwlyZWcgPDw9IDg7CisJcmVnIHw9ICh1aW50NjRfdCkgKigtLXB0cik7IAorCQorCXJldHVybiByZWc7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19TRVRfU1BFRUQocyxzcGVlZCkKKyAqICAKKyAqICBDb25maWd1cmUgTEFOIHNwZWVkIGZvciB0aGUgc3BlY2lmaWVkIE1BQy4KKyAqICBXYXJuaW5nOiBtdXN0IGJlIGNhbGxlZCB3aGVuIE1BQyBpcyBvZmYhCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIHMgLSBzYm1hYyBzdHJ1Y3R1cmUKKyAqICAJICAgc3BlZWQgLSBzcGVlZCB0byBzZXQgTUFDIHRvIChzZWUgc2JtYWNfc3BlZWRfdCBlbnVtKQorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIDEgaWYgc3VjY2Vzc2Z1bAorICogICAgICAwIGluZGljYXRlcyBpbnZhbGlkIHBhcmFtZXRlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIGludCBzYm1hY19zZXRfc3BlZWQoc3RydWN0IHNibWFjX3NvZnRjICpzLHNibWFjX3NwZWVkX3Qgc3BlZWQpCit7CisJdWludDY0X3QgY2ZnOworCXVpbnQ2NF90IGZyYW1lY2ZnOworCisJLyoKKwkgKiBTYXZlIG5ldyBjdXJyZW50IHZhbHVlcworCSAqLworCQorCXMtPnNibV9zcGVlZCA9IHNwZWVkOworCQorCWlmIChzLT5zYm1fc3RhdGUgPT0gc2JtYWNfc3RhdGVfb24pCisJCXJldHVybiAwOwkvKiBzYXZlIGZvciBuZXh0IHJlc3RhcnQgKi8KKworCS8qCisJICogUmVhZCBjdXJyZW50IHJlZ2lzdGVyIHZhbHVlcyAKKwkgKi8KKwkKKwljZmcgPSBTQk1BQ19SRUFEQ1NSKHMtPnNibV9tYWNjZmcpOworCWZyYW1lY2ZnID0gU0JNQUNfUkVBRENTUihzLT5zYm1fZnJhbWVjZmcpOworCQorCS8qCisJICogTWFzayBvdXQgdGhlIHN0dWZmIHdlIHdhbnQgdG8gY2hhbmdlCisJICovCisJCisJY2ZnICY9IH4oTV9NQUNfQlVSU1RfRU4gfCBNX01BQ19TUEVFRF9TRUwpOworCWZyYW1lY2ZnICY9IH4oTV9NQUNfSUZHX1JYIHwgTV9NQUNfSUZHX1RYIHwgTV9NQUNfSUZHX1RIUlNIIHwKKwkJICAgICAgTV9NQUNfU0xPVF9TSVpFKTsKKwkKKwkvKgorCSAqIE5vdyBhZGQgaW4gdGhlIG5ldyBiaXRzCisJICovCisJCisJc3dpdGNoIChzcGVlZCkgeworCWNhc2Ugc2JtYWNfc3BlZWRfMTA6CisJCWZyYW1lY2ZnIHw9IFZfTUFDX0lGR19SWF8xMCB8CisJCQlWX01BQ19JRkdfVFhfMTAgfAorCQkJS19NQUNfSUZHX1RIUlNIXzEwIHwKKwkJCVZfTUFDX1NMT1RfU0laRV8xMDsKKwkJY2ZnIHw9IFZfTUFDX1NQRUVEX1NFTF8xME1CUFM7CisJCWJyZWFrOworCQkKKwljYXNlIHNibWFjX3NwZWVkXzEwMDoKKwkJZnJhbWVjZmcgfD0gVl9NQUNfSUZHX1JYXzEwMCB8CisJCQlWX01BQ19JRkdfVFhfMTAwIHwKKwkJCVZfTUFDX0lGR19USFJTSF8xMDAgfAorCQkJVl9NQUNfU0xPVF9TSVpFXzEwMDsKKwkJY2ZnIHw9IFZfTUFDX1NQRUVEX1NFTF8xMDBNQlBTIDsKKwkJYnJlYWs7CisJCQorCWNhc2Ugc2JtYWNfc3BlZWRfMTAwMDoKKwkJZnJhbWVjZmcgfD0gVl9NQUNfSUZHX1JYXzEwMDAgfAorCQkJVl9NQUNfSUZHX1RYXzEwMDAgfAorCQkJVl9NQUNfSUZHX1RIUlNIXzEwMDAgfAorCQkJVl9NQUNfU0xPVF9TSVpFXzEwMDA7CisJCWNmZyB8PSBWX01BQ19TUEVFRF9TRUxfMTAwME1CUFMgfCBNX01BQ19CVVJTVF9FTjsKKwkJYnJlYWs7CisJCQorCWNhc2Ugc2JtYWNfc3BlZWRfYXV0bzoJCS8qIFhYWCBub3QgaW1wbGVtZW50ZWQgKi8KKwkJLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qCisJICogU2VuZCB0aGUgYml0cyBiYWNrIHRvIHRoZSBoYXJkd2FyZSAKKwkgKi8KKwkKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fZnJhbWVjZmcsZnJhbWVjZmcpOworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tYWNjZmcsY2ZnKTsKKwkKKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19TRVRfRFVQTEVYKHMsZHVwbGV4LGZjKQorICogIAorICogIFNldCBFdGhlcm5ldCBkdXBsZXggYW5kIGZsb3cgY29udHJvbCBvcHRpb25zIGZvciB0aGlzIE1BQworICogIFdhcm5pbmc6IG11c3QgYmUgY2FsbGVkIHdoZW4gTUFDIGlzIG9mZiEKKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgcyAtIHNibWFjIHN0cnVjdHVyZQorICogIAkgICBkdXBsZXggLSBkdXBsZXggc2V0dGluZyAoc2VlIHNibWFjX2R1cGxleF90KQorICogIAkgICBmYyAtIGZsb3cgY29udHJvbCBzZXR0aW5nIChzZWUgc2JtYWNfZmNfdCkKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICAxIGlmIG9rCisgKiAgCSAgIDAgaWYgYW4gaW52YWxpZCBwYXJhbWV0ZXIgY29tYmluYXRpb24gd2FzIHNwZWNpZmllZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgaW50IHNibWFjX3NldF9kdXBsZXgoc3RydWN0IHNibWFjX3NvZnRjICpzLHNibWFjX2R1cGxleF90IGR1cGxleCxzYm1hY19mY190IGZjKQoreworCXVpbnQ2NF90IGNmZzsKKwkKKwkvKgorCSAqIFNhdmUgbmV3IGN1cnJlbnQgdmFsdWVzCisJICovCisJCisJcy0+c2JtX2R1cGxleCA9IGR1cGxleDsKKwlzLT5zYm1fZmMgPSBmYzsKKwkKKwlpZiAocy0+c2JtX3N0YXRlID09IHNibWFjX3N0YXRlX29uKQorCQlyZXR1cm4gMDsJLyogc2F2ZSBmb3IgbmV4dCByZXN0YXJ0ICovCisJCisJLyoKKwkgKiBSZWFkIGN1cnJlbnQgcmVnaXN0ZXIgdmFsdWVzIAorCSAqLworCQorCWNmZyA9IFNCTUFDX1JFQURDU1Iocy0+c2JtX21hY2NmZyk7CisJCisJLyoKKwkgKiBNYXNrIG9mZiB0aGUgc3R1ZmYgd2UncmUgYWJvdXQgdG8gY2hhbmdlCisJICovCisJCisJY2ZnICY9IH4oTV9NQUNfRkNfU0VMIHwgTV9NQUNfRkNfQ01EIHwgTV9NQUNfSERYX0VOKTsKKwkKKwkKKwlzd2l0Y2ggKGR1cGxleCkgeworCWNhc2Ugc2JtYWNfZHVwbGV4X2hhbGY6CisJCXN3aXRjaCAoZmMpIHsKKwkJY2FzZSBzYm1hY19mY19kaXNhYmxlZDoKKwkJCWNmZyB8PSBNX01BQ19IRFhfRU4gfCBWX01BQ19GQ19DTURfRElTQUJMRUQ7CisJCQlicmVhazsKKwkJCQorCQljYXNlIHNibWFjX2ZjX2NvbGxpc2lvbjoKKwkJCWNmZyB8PSBNX01BQ19IRFhfRU4gfCBWX01BQ19GQ19DTURfRU5BQkxFRDsKKwkJCWJyZWFrOworCQkJCisJCWNhc2Ugc2JtYWNfZmNfY2FycmllcjoKKwkJCWNmZyB8PSBNX01BQ19IRFhfRU4gfCBWX01BQ19GQ19DTURfRU5BQl9GQUxTRUNBUlI7CisJCQlicmVhazsKKwkJCQorCQljYXNlIHNibWFjX2ZjX2F1dG86CQkvKiBYWFggbm90IGltcGxlbWVudGVkICovCisJCQkvKiBmYWxsIHRocm91Z2ggKi8JCQkJCSAgIAorCQljYXNlIHNibWFjX2ZjX2ZyYW1lOgkJLyogbm90IHZhbGlkIGluIGhhbGYgZHVwbGV4ICovCisJCWRlZmF1bHQ6CQkJLyogaW52YWxpZCBzZWxlY3Rpb24gKi8KKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCQkKKwljYXNlIHNibWFjX2R1cGxleF9mdWxsOgorCQlzd2l0Y2ggKGZjKSB7CisJCWNhc2Ugc2JtYWNfZmNfZGlzYWJsZWQ6CisJCQljZmcgfD0gVl9NQUNfRkNfQ01EX0RJU0FCTEVEOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBzYm1hY19mY19mcmFtZToKKwkJCWNmZyB8PSBWX01BQ19GQ19DTURfRU5BQkxFRDsKKwkJCWJyZWFrOworCQkJCisJCWNhc2Ugc2JtYWNfZmNfY29sbGlzaW9uOgkvKiBub3QgdmFsaWQgaW4gZnVsbCBkdXBsZXggKi8KKwkJY2FzZSBzYm1hY19mY19jYXJyaWVyOgkJLyogbm90IHZhbGlkIGluIGZ1bGwgZHVwbGV4ICovCisJCWNhc2Ugc2JtYWNfZmNfYXV0bzoJCS8qIFhYWCBub3QgaW1wbGVtZW50ZWQgKi8KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLwkJCQkJICAgCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIHNibWFjX2R1cGxleF9hdXRvOgorCQkvKiBYWFggbm90IGltcGxlbWVudGVkICovCisJCWJyZWFrOworCX0KKwkKKwkvKgorCSAqIFNlbmQgdGhlIGJpdHMgYmFjayB0byB0aGUgaGFyZHdhcmUgCisJICovCisJCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21hY2NmZyxjZmcpOworCQorCXJldHVybiAxOworfQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX0lOVFIoKQorICogIAorICogIEludGVycnVwdCBoYW5kbGVyIGZvciBNQUMgaW50ZXJydXB0cworICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBNQUMgc3RydWN0dXJlCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgbm90aGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIGlycXJldHVybl90IHNibWFjX2ludHIoaW50IGlycSx2b2lkICpkZXZfaW5zdGFuY2Usc3RydWN0IHB0X3JlZ3MgKnJncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1aW50NjRfdCBpc3I7CisJaW50IGhhbmRsZWQgPSAwOworCisJZm9yICg7OykgeworCQkKKwkJLyoKKwkJICogUmVhZCB0aGUgSVNSICh0aGlzIGNsZWFycyB0aGUgYml0cyBpbiB0aGUgcmVhbAorCQkgKiByZWdpc3RlciwgZXhjZXB0IGZvciBjb3VudGVyIGFkZHIpCisJCSAqLworCQkKKwkJaXNyID0gU0JNQUNfUkVBRENTUihzYy0+c2JtX2lzcikgJiB+TV9NQUNfQ09VTlRFUl9BRERSOworCQkKKwkJaWYgKGlzciA9PSAwKQorCQkJYnJlYWs7CisKKwkJaGFuZGxlZCA9IDE7CisJCQorCQkvKgorCQkgKiBUcmFuc21pdHMgb24gY2hhbm5lbCAwCisJCSAqLworCQkKKwkJaWYgKGlzciAmIChNX01BQ19JTlRfQ0hBTk5FTCA8PCBTX01BQ19UWF9DSDApKSB7CisJCQlzYmRtYV90eF9wcm9jZXNzKHNjLCYoc2MtPnNibV90eGRtYSkpOworCQl9CisJCQorCQkvKgorCQkgKiBSZWNlaXZlcyBvbiBjaGFubmVsIDAKKwkJICovCisKKwkJLyoKKwkJICogSXQncyBpbXBvcnRhbnQgdG8gdGVzdCBhbGwgdGhlIGJpdHMgKG9yIGF0IGxlYXN0IHRoZQorCQkgKiBFT1BfU0VFTiBiaXQpIHdoZW4gZGVjaWRpbmcgdG8gZG8gdGhlIFJYIHByb2Nlc3MKKwkJICogcGFydGljdWxhcmx5IHdoZW4gY29hbGVzY2luZywgdG8gbWFrZSBzdXJlIHdlCisJCSAqIHRha2UgY2FyZSBvZiB0aGUgZm9sbG93aW5nOgorCQkgKgorCQkgKiBJZiB5b3UgaGF2ZSBzb21lIHBhY2tldHMgd2FpdGluZyAoaGF2ZSBiZWVuIHJlY2VpdmVkCisJCSAqIGJ1dCBubyBpbnRlcnJ1cHQpIGFuZCBnZXQgYSBUWCBpbnRlcnJ1cHQgYmVmb3JlCisJCSAqIHRoZSBSWCB0aW1lciBvciBjb3VudGVyIGV4cGlyZXMsIHJlYWRpbmcgdGhlIElTUgorCQkgKiBhYm92ZSB3aWxsIGNsZWFyIHRoZSB0aW1lciBhbmQgY291bnRlciwgYW5kIHlvdQorCQkgKiB3b24ndCBnZXQgYW5vdGhlciBpbnRlcnJ1cHQgdW50aWwgYSBwYWNrZXQgc2hvd3MKKwkJICogdXAgdG8gc3RhcnQgdGhlIHRpbWVyIGFnYWluLiAgVGVzdGluZworCQkgKiBFT1BfU0VFTiBoZXJlIHRha2VzIGNhcmUgb2YgdGhpcyBjYXNlLgorCQkgKiAoRU9QX1NFRU4gaXMgcGFydCBvZiBNX01BQ19JTlRfQ0hBTk5FTCA8PCBTX01BQ19SWF9DSDApCisJCSAqLworCQkgCisJCQorCQlpZiAoaXNyICYgKE1fTUFDX0lOVF9DSEFOTkVMIDw8IFNfTUFDX1JYX0NIMCkpIHsKKwkJCXNiZG1hX3J4X3Byb2Nlc3Moc2MsJihzYy0+c2JtX3J4ZG1hKSk7CisJCX0KKwl9CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19TVEFSVF9UWChza2IsZGV2KQorICogIAorICogIFN0YXJ0IG91dHB1dCBvbiB0aGUgc3BlY2lmaWVkIGludGVyZmFjZS4gIEJhc2ljYWxseSwgd2UgCisgKiAgcXVldWUgYXMgbWFueSBidWZmZXJzIGFzIHdlIGNhbiB1bnRpbCB0aGUgcmluZyBmaWxscyB1cCwgb3IKKyAqICB3ZSBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIHF1ZXVlLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIAorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyBpbnQgc2JtYWNfc3RhcnRfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwkvKiBsb2NrIGV0aCBpcnEgKi8KKwlzcGluX2xvY2tfaXJxICgmc2MtPnNibV9sb2NrKTsKKwkKKwkvKgorCSAqIFB1dCB0aGUgYnVmZmVyIG9uIHRoZSB0cmFuc21pdCByaW5nLiAgSWYgd2UgCisJICogZG9uJ3QgaGF2ZSByb29tLCBzdG9wIHRoZSBxdWV1ZS4KKwkgKi8KKwkKKwlpZiAoc2JkbWFfYWRkX3R4YnVmZmVyKCYoc2MtPnNibV90eGRtYSksc2tiKSkgeworCQkvKiBYWFggc2F2ZSBza2IgdGhhdCB3ZSBjb3VsZCBub3Qgc2VuZCAqLworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNwaW5fdW5sb2NrX2lycSgmc2MtPnNibV9sb2NrKTsKKworCQlyZXR1cm4gMTsKKwl9CisJCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCisJc3Bpbl91bmxvY2tfaXJxICgmc2MtPnNibV9sb2NrKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19TRVRNVUxUSShzYykKKyAqICAKKyAqICBSZXByb2dyYW0gdGhlIG11bHRpY2FzdCB0YWJsZSBpbnRvIHRoZSBoYXJkd2FyZSwgZ2l2ZW4KKyAqICB0aGUgbGlzdCBvZiBtdWx0aWNhc3RzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW50ZXJmYWNlCisgKiAgc3RydWN0dXJlLgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzYyAtIHNvZnRjCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgbm90aGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdm9pZCBzYm1hY19zZXRtdWx0aShzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjKQoreworCXVpbnQ2NF90IHJlZzsKKwlzYm1hY19wb3J0X3QgcG9ydDsKKwlpbnQgaWR4OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzYy0+c2JtX2RldjsKKwkKKwkvKiAKKwkgKiBDbGVhciBvdXQgZW50aXJlIG11bHRpY2FzdCB0YWJsZS4gIFdlIGRvIHRoaXMgYnkgbnVraW5nCisJICogdGhlIGVudGlyZSBoYXNoIHRhYmxlIGFuZCBhbGwgdGhlIGRpcmVjdCBtYXRjaGVzIGV4Y2VwdAorCSAqIHRoZSBmaXJzdCBvbmUsIHdoaWNoIGlzIHVzZWQgZm9yIG91ciBzdGF0aW9uIGFkZHJlc3MgCisJICovCisJCisJZm9yIChpZHggPSAxOyBpZHggPCBNQUNfQUREUl9DT1VOVDsgaWR4KyspIHsKKwkJcG9ydCA9IHNjLT5zYm1fYmFzZSArIFJfTUFDX0FERFJfQkFTRSsoaWR4KnNpemVvZih1aW50NjRfdCkpOworCQlTQk1BQ19XUklURUNTUihwb3J0LDApOwkKKwl9CisJCisJZm9yIChpZHggPSAwOyBpZHggPCBNQUNfSEFTSF9DT1VOVDsgaWR4KyspIHsKKwkJcG9ydCA9IHNjLT5zYm1fYmFzZSArIFJfTUFDX0hBU0hfQkFTRSsoaWR4KnNpemVvZih1aW50NjRfdCkpOworCQlTQk1BQ19XUklURUNTUihwb3J0LDApOwkKKwl9CisJCisJLyoKKwkgKiBDbGVhciB0aGUgZmlsdGVyIHRvIHNheSB3ZSBkb24ndCB3YW50IGFueSBtdWx0aWNhc3RzLgorCSAqLworCQorCXJlZyA9IFNCTUFDX1JFQURDU1Ioc2MtPnNibV9yeGZpbHRlcik7CisJcmVnICY9IH4oTV9NQUNfTUNBU1RfSU5WIHwgTV9NQUNfTUNBU1RfRU4pOworCVNCTUFDX1dSSVRFQ1NSKHNjLT5zYm1fcnhmaWx0ZXIscmVnKTsKKwkKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkvKiAKKwkJICogRW5hYmxlIEFMTCBtdWx0aWNhc3RzLiAgRG8gdGhpcyBieSBpbnZlcnRpbmcgdGhlIAorCQkgKiBtdWx0aWNhc3QgZW5hYmxlIGJpdC4gCisJCSAqLworCQlyZWcgPSBTQk1BQ19SRUFEQ1NSKHNjLT5zYm1fcnhmaWx0ZXIpOworCQlyZWcgfD0gKE1fTUFDX01DQVNUX0lOViB8IE1fTUFDX01DQVNUX0VOKTsKKwkJU0JNQUNfV1JJVEVDU1Ioc2MtPnNibV9yeGZpbHRlcixyZWcpOworCQlyZXR1cm47CisJfQorCQorCisJLyogCisJICogUHJvZ2FtIG5ldyBtdWx0aWNhc3QgZW50cmllcy4gIEZvciBub3csIG9ubHkgdXNlIHRoZQorCSAqIHBlcmZlY3QgZmlsdGVyLiAgSW4gdGhlIGZ1dHVyZSB3ZSdsbCBuZWVkIHRvIHVzZSB0aGUKKwkgKiBoYXNoIGZpbHRlciBpZiB0aGUgcGVyZmVjdCBmaWx0ZXIgb3ZlcmZsb3dzCisJICovCisJCisJLyogWFhYIG9ubHkgdXNpbmcgcGVyZmVjdCBmaWx0ZXIgZm9yIG5vdywgbmVlZCB0byB1c2UgaGFzaAorCSAqIFhYWCBpZiB0aGUgdGFibGUgb3ZlcmZsb3dzICovCisJCisJaWR4ID0gMTsJCS8qIHNraXAgc3RhdGlvbiBhZGRyZXNzICovCisJbWNsaXN0ID0gZGV2LT5tY19saXN0OworCXdoaWxlIChtY2xpc3QgJiYgKGlkeCA8IE1BQ19BRERSX0NPVU5UKSkgeworCQlyZWcgPSBzYm1hY19hZGRyMnJlZyhtY2xpc3QtPmRtaV9hZGRyKTsKKwkJcG9ydCA9IHNjLT5zYm1fYmFzZSArIFJfTUFDX0FERFJfQkFTRSsoaWR4ICogc2l6ZW9mKHVpbnQ2NF90KSk7CisJCVNCTUFDX1dSSVRFQ1NSKHBvcnQscmVnKTsKKwkJaWR4Kys7CisJCW1jbGlzdCA9IG1jbGlzdC0+bmV4dDsKKwl9CisJCisJLyoJCisJICogRW5hYmxlIHRoZSAiYWNjZXB0IG11bHRpY2FzdCBiaXRzIiBpZiB3ZSBwcm9ncmFtbWVkIGF0IGxlYXN0IG9uZQorCSAqIG11bHRpY2FzdC4gCisJICovCisJCisJaWYgKGlkeCA+IDEpIHsKKwkJcmVnID0gU0JNQUNfUkVBRENTUihzYy0+c2JtX3J4ZmlsdGVyKTsKKwkJcmVnIHw9IE1fTUFDX01DQVNUX0VOOworCQlTQk1BQ19XUklURUNTUihzYy0+c2JtX3J4ZmlsdGVyLHJlZyk7CisJfQorfQorCisKKworI2lmIGRlZmluZWQoU0JNQUNfRVRIMF9IV0FERFIpIHx8IGRlZmluZWQoU0JNQUNfRVRIMV9IV0FERFIpIHx8IGRlZmluZWQoU0JNQUNfRVRIMl9IV0FERFIpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX1BBUlNFX1hESUdJVChzdHIpCisgKiAgCisgKiAgUGFyc2UgYSBoZXggZGlnaXQsIHJldHVybmluZyBpdHMgdmFsdWUKKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgc3RyIC0gY2hhcmFjdGVyCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgaGV4IHZhbHVlLCBvciAtMSBpZiBpbnZhbGlkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbnQgc2JtYWNfcGFyc2VfeGRpZ2l0KGNoYXIgc3RyKQoreworCWludCBkaWdpdDsKKwkKKwlpZiAoKHN0ciA+PSAnMCcpICYmIChzdHIgPD0gJzknKSkKKwkJZGlnaXQgPSBzdHIgLSAnMCc7CisJZWxzZSBpZiAoKHN0ciA+PSAnYScpICYmIChzdHIgPD0gJ2YnKSkKKwkJZGlnaXQgPSBzdHIgLSAnYScgKyAxMDsKKwllbHNlIGlmICgoc3RyID49ICdBJykgJiYgKHN0ciA8PSAnRicpKQorCQlkaWdpdCA9IHN0ciAtICdBJyArIDEwOworCWVsc2UKKwkJcmV0dXJuIC0xOworCQorCXJldHVybiBkaWdpdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19QQVJTRV9IV0FERFIoc3RyLGh3YWRkcikKKyAqICAKKyAqICBDb252ZXJ0IGEgc3RyaW5nIGluIHRoZSBmb3JtIHh4Onh4Onh4Onh4Onh4Onh4IGludG8gYSA2LWJ5dGUKKyAqICBFdGhlcm5ldCBhZGRyZXNzLgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzdHIgLSBzdHJpbmcKKyAqICAJICAgaHdhZGRyIC0gcG9pbnRlciB0byBoYXJkd2FyZSBhZGRyZXNzCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgMCBpZiBvaywgZWxzZSAtMQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgaW50IHNibWFjX3BhcnNlX2h3YWRkcihjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKmh3YWRkcikKK3sKKwlpbnQgZGlnaXQxLGRpZ2l0MjsKKwlpbnQgaWR4ID0gNjsKKwkKKwl3aGlsZSAoKnN0ciAmJiAoaWR4ID4gMCkpIHsKKwkJZGlnaXQxID0gc2JtYWNfcGFyc2VfeGRpZ2l0KCpzdHIpOworCQlpZiAoZGlnaXQxIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJc3RyKys7CisJCWlmICghKnN0cikKKwkJCXJldHVybiAtMTsKKwkJCisJCWlmICgoKnN0ciA9PSAnOicpIHx8ICgqc3RyID09ICctJykpIHsKKwkJCWRpZ2l0MiA9IGRpZ2l0MTsKKwkJCWRpZ2l0MSA9IDA7CisJCX0KKwkJZWxzZSB7CisJCQlkaWdpdDIgPSBzYm1hY19wYXJzZV94ZGlnaXQoKnN0cik7CisJCQlpZiAoZGlnaXQyIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQlzdHIrKzsKKwkJfQorCQkKKwkJKmh3YWRkcisrID0gKGRpZ2l0MSA8PCA0KSB8IGRpZ2l0MjsKKwkJaWR4LS07CisJCQorCQlpZiAoKnN0ciA9PSAnLScpCisJCQlzdHIrKzsKKwkJaWYgKCpzdHIgPT0gJzonKQorCQkJc3RyKys7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc2IxMjUwX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKl9kZXYsIGludCBuZXdfbXR1KQoreworCWlmIChuZXdfbXR1ID4gIEVORVRfUEFDS0VUX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCV9kZXYtPm10dSA9IG5ld19tdHU7CisJcHJpbnRrKEtFUk5fSU5GTyAiY2hhbmdpbmcgdGhlIG10dSB0byAlZFxuIiwgbmV3X210dSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfSU5JVChkZXYpCisgKiAgCisgKiAgQXR0YWNoIHJvdXRpbmUgLSBpbml0IGhhcmR3YXJlIGFuZCBob29rIG91cnNlbHZlcyBpbnRvIGxpbnV4CisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIGRldiAtIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgc3RhdHVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbnQgc2JtYWNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaWR4KQoreworCXN0cnVjdCBzYm1hY19zb2Z0YyAqc2M7CisJdW5zaWduZWQgY2hhciAqZWFkZHI7CisJdWludDY0X3QgZWFfcmVnOworCWludCBpOworCWludCBlcnI7CisJCisJc2MgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCS8qIERldGVybWluZSBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLworCQorCXNjLT5zYm1fYmFzZSA9IElPQUREUihkZXYtPmJhc2VfYWRkcik7CisJc2MtPnNibV9kZXYgPSBkZXY7CisJc2MtPnNiZV9pZHggPSBpZHg7CisJCisJZWFkZHIgPSBzYy0+c2JtX2h3YWRkcjsKKwkKKwkvKiAKKwkgKiBSZWFkIHRoZSBldGhlcm5ldCBhZGRyZXNzLiAgVGhlIGZpcndtYXJlIGxlZnQgdGhpcyBwcm9ncmFtbWVkCisJICogZm9yIHVzIGluIHRoZSBldGhlcm5ldCBhZGRyZXNzIHJlZ2lzdGVyIGZvciBlYWNoIG1hYy4KKwkgKi8KKwkKKwllYV9yZWcgPSBTQk1BQ19SRUFEQ1NSKHNjLT5zYm1fYmFzZSArIFJfTUFDX0VUSEVSTkVUX0FERFIpOworCVNCTUFDX1dSSVRFQ1NSKHNjLT5zYm1fYmFzZSArIFJfTUFDX0VUSEVSTkVUX0FERFIsIDApOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJZWFkZHJbaV0gPSAodWludDhfdCkgKGVhX3JlZyAmIDB4RkYpOworCQllYV9yZWcgPj49IDg7CisJfQorCQorCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGVhZGRyW2ldOworCX0KKwkKKwkKKwkvKgorCSAqIEluaXQgcGFja2V0IHNpemUgCisJICovCisJCisJc2MtPnNibV9idWZmZXJzaXplID0gRU5FVF9QQUNLRVRfU0laRSArIFNNUF9DQUNIRV9CWVRFUyAqIDIgKyBFVEhFUl9BTElHTjsKKworCS8qIAorCSAqIEluaXRpYWxpemUgY29udGV4dCAoZ2V0IHBvaW50ZXJzIHRvIHJlZ2lzdGVycyBhbmQgc3R1ZmYpLCB0aGVuCisJICogYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIGRlc2NyaXB0b3IgdGFibGVzLgorCSAqLworCQorCXNibWFjX2luaXRjdHgoc2MpOworCQorCS8qCisJICogU2V0IHVwIExpbnV4IGRldmljZSBjYWxsaW5zCisJICovCisJCisJc3Bpbl9sb2NrX2luaXQoJihzYy0+c2JtX2xvY2spKTsKKwkKKwlkZXYtPm9wZW4gICAgICAgICAgICAgICA9IHNibWFjX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgICAgPSBzYm1hY19zdGFydF90eDsKKwlkZXYtPnN0b3AgICAgICAgICAgICAgICA9IHNibWFjX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzICAgICAgICAgID0gc2JtYWNfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2JtYWNfc2V0X3J4X21vZGU7CisJZGV2LT5kb19pb2N0bCAgICAgICAgICAgPSBzYm1hY19taWlfaW9jdGw7CisJZGV2LT50eF90aW1lb3V0ICAgICAgICAgPSBzYm1hY190eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gICAgID0gVFhfVElNRU9VVDsKKworCWRldi0+Y2hhbmdlX210dSAgICAgICAgID0gc2IxMjUwX2NoYW5nZV9tdHU7CisKKwkvKiBUaGlzIGlzIG5lZWRlZCBmb3IgUEFTUzIgZm9yIFJ4IEgvVyBjaGVja3N1bSBmZWF0dXJlICovCisJc2JtYWNfc2V0X2lwaGRyX29mZnNldChzYyk7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bmluaXQ7CisKKwlpZiAocGVyaXBoX3JldiA+PSAyKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBlbmFibGluZyBUQ1AgcmN2IGNoZWNrc3VtXG4iLAorCQkJc2MtPnNibV9kZXYtPm5hbWUpOworCX0KKworCS8qCisJICogRGlzcGxheSBFdGhlcm5ldCBhZGRyZXNzICh0aGlzIGlzIGNhbGxlZCBkdXJpbmcgdGhlIGNvbmZpZworCSAqIHByb2Nlc3Mgc28gd2UgbmVlZCB0byBmaW5pc2ggb2ZmIHRoZSBjb25maWcgbWVzc2FnZSB0aGF0CisJICogd2FzIGJlaW5nIGRpc3BsYXllZCkKKwkgKi8KKwlwcmludGsoS0VSTl9JTkZPCisJICAgICAgICIlczogU2lCeXRlIEV0aGVybmV0IGF0IDB4JTA4bFgsIGFkZHJlc3M6ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLCAKKwkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwKKwkgICAgICAgZWFkZHJbMF0sZWFkZHJbMV0sZWFkZHJbMl0sZWFkZHJbM10sZWFkZHJbNF0sZWFkZHJbNV0pOworCQorCisJcmV0dXJuIDA7CisKK291dF91bmluaXQ6CisJc2JtYWNfdW5pbml0Y3R4KHNjKTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBzYm1hY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNibWFjX3NvZnRjICpzYyA9IG5ldGRldl9wcml2KGRldik7CisJCisJaWYgKGRlYnVnID4gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNibWFjX29wZW4oKSBpcnEgJWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwl9CisJCisJLyogCisJICogbWFwL3JvdXRlIGludGVycnVwdCAoY2xlYXIgc3RhdHVzIGZpcnN0LCBpbiBjYXNlIHNvbWV0aGluZworCSAqIHdlaXJkIGlzIHBlbmRpbmc7IHdlIGhhdmVuJ3QgaW5pdGlhbGl6ZWQgdGhlIG1hYyByZWdpc3RlcnMKKwkgKiB5ZXQpCisJICovCisKKwlTQk1BQ19SRUFEQ1NSKHNjLT5zYm1faXNyKTsKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzYm1hY19pbnRyLCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyoKKwkgKiBDb25maWd1cmUgZGVmYXVsdCBzcGVlZCAKKwkgKi8KKworCXNibWFjX21paV9wb2xsKHNjLG5vaXN5X21paSk7CisJCisJLyoKKwkgKiBUdXJuIG9uIHRoZSBjaGFubmVsCisJICovCisKKwlzYm1hY19zZXRfY2hhbm5lbF9zdGF0ZShzYyxzYm1hY19zdGF0ZV9vbik7CisJCisJLyoKKwkgKiBYWFggU3RhdGlvbiBhZGRyZXNzIGlzIGluIGRldi0+ZGV2X2FkZHIKKwkgKi8KKwkKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDApCisJCWRldi0+aWZfcG9ydCA9IDA7IAorCQorCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCisJc2JtYWNfc2V0X3J4X21vZGUoZGV2KTsKKwkKKwkvKiBTZXQgdGhlIHRpbWVyIHRvIGNoZWNrIGZvciBsaW5rIGJlYXQuICovCisJaW5pdF90aW1lcigmc2MtPnNibV90aW1lcik7CisJc2MtPnNibV90aW1lci5leHBpcmVzID0gamlmZmllcyArIDIgKiBIWi8xMDA7CisJc2MtPnNibV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXNjLT5zYm1fdGltZXIuZnVuY3Rpb24gPSAmc2JtYWNfdGltZXI7CisJYWRkX3RpbWVyKCZzYy0+c2JtX3RpbWVyKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgc2JtYWNfbWlpX3BvbGwoc3RydWN0IHNibWFjX3NvZnRjICpzLGludCBub2lzeSkKK3sKKyAgICBpbnQgYm1zcixibWNyLGsxc3RzcixhbmxwYXI7CisgICAgaW50IGNoZzsKKyAgICBjaGFyIGJ1ZmZlclsxMDBdOworICAgIGNoYXIgKnAgPSBidWZmZXI7CisKKyAgICAvKiBSZWFkIHRoZSBtb2RlIHN0YXR1cyBhbmQgbW9kZSBjb250cm9sIHJlZ2lzdGVycy4gKi8KKyAgICBibXNyID0gc2JtYWNfbWlpX3JlYWQocyxzLT5zYm1fcGh5c1swXSxNSUlfQk1TUik7CisgICAgYm1jciA9IHNibWFjX21paV9yZWFkKHMscy0+c2JtX3BoeXNbMF0sTUlJX0JNQ1IpOworCisgICAgLyogZ2V0IHRoZSBsaW5rIHBhcnRuZXIgc3RhdHVzICovCisgICAgYW5scGFyID0gc2JtYWNfbWlpX3JlYWQocyxzLT5zYm1fcGh5c1swXSxNSUlfQU5MUEFSKTsKKworICAgIC8qIGlmIHN1cHBvcnRlZCwgcmVhZCB0aGUgMTAwMGJhc2VUIHJlZ2lzdGVyICovCisgICAgaWYgKGJtc3IgJiBCTVNSXzEwMDBCVF9YU1IpIHsKKwlrMXN0c3IgPSBzYm1hY19taWlfcmVhZChzLHMtPnNibV9waHlzWzBdLE1JSV9LMVNUU1IpOworCX0KKyAgICBlbHNlIHsKKwlrMXN0c3IgPSAwOworCX0KKworICAgIGNoZyA9IDA7CisKKyAgICBpZiAoKGJtc3IgJiBCTVNSX0xJTktTVEFUKSA9PSAwKSB7CisJLyoKKwkgKiBJZiBsaW5rIHN0YXR1cyBpcyBkb3duLCBjbGVhciBvdXQgb2xkIGluZm8gc28gdGhhdCB3aGVuCisJICogaXQgY29tZXMgYmFjayB1cCBpdCB3aWxsIGZvcmNlIHVzIHRvIHJlY29uZmlndXJlIHNwZWVkCisJICovCisJcy0+c2JtX3BoeV9vbGRibXNyID0gMDsKKwlzLT5zYm1fcGh5X29sZGFubHBhciA9IDA7CisJcy0+c2JtX3BoeV9vbGRrMXN0c3IgPSAwOworCXJldHVybiAwOworCX0KKworICAgIGlmICgocy0+c2JtX3BoeV9vbGRibXNyICE9IGJtc3IpIHx8CisJKHMtPnNibV9waHlfb2xkYW5scGFyICE9IGFubHBhcikgfHwKKwkocy0+c2JtX3BoeV9vbGRrMXN0c3IgIT0gazFzdHNyKSkgeworCWlmIChkZWJ1ZyA+IDEpIHsKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBibXNyOiV4LyV4IGFubHBhcjoleC8leCAgazFzdHNyOiV4LyV4XG4iLAorCSAgICAgICBzLT5zYm1fZGV2LT5uYW1lLAorCSAgICAgICBzLT5zYm1fcGh5X29sZGJtc3IsYm1zciwKKwkgICAgICAgcy0+c2JtX3BoeV9vbGRhbmxwYXIsYW5scGFyLAorCSAgICAgICBzLT5zYm1fcGh5X29sZGsxc3RzcixrMXN0c3IpOworCSAgICB9CisJcy0+c2JtX3BoeV9vbGRibXNyID0gYm1zcjsKKwlzLT5zYm1fcGh5X29sZGFubHBhciA9IGFubHBhcjsKKwlzLT5zYm1fcGh5X29sZGsxc3RzciA9IGsxc3RzcjsKKwljaGcgPSAxOworCX0KKworICAgIGlmIChjaGcgPT0gMCkKKwkgICAgcmV0dXJuIDA7CisKKyAgICBwICs9IHNwcmludGYocCwiTGluayBzcGVlZDogIik7CisKKyAgICBpZiAoazFzdHNyICYgSzFTVFNSX0xQMUtGRCkgeworCXMtPnNibV9zcGVlZCA9IHNibWFjX3NwZWVkXzEwMDA7CisJcy0+c2JtX2R1cGxleCA9IHNibWFjX2R1cGxleF9mdWxsOworCXMtPnNibV9mYyA9IHNibWFjX2ZjX2ZyYW1lOworCXAgKz0gc3ByaW50ZihwLCIxMDAwQmFzZVQgRkRYIik7CisJfQorICAgIGVsc2UgaWYgKGsxc3RzciAmIEsxU1RTUl9MUDFLSEQpIHsKKwlzLT5zYm1fc3BlZWQgPSBzYm1hY19zcGVlZF8xMDAwOworCXMtPnNibV9kdXBsZXggPSBzYm1hY19kdXBsZXhfaGFsZjsKKwlzLT5zYm1fZmMgPSBzYm1hY19mY19kaXNhYmxlZDsKKwlwICs9IHNwcmludGYocCwiMTAwMEJhc2VUIEhEWCIpOworCX0KKyAgICBlbHNlIGlmIChhbmxwYXIgJiBBTkxQQVJfVFhGRCkgeworCXMtPnNibV9zcGVlZCA9IHNibWFjX3NwZWVkXzEwMDsKKwlzLT5zYm1fZHVwbGV4ID0gc2JtYWNfZHVwbGV4X2Z1bGw7CisJcy0+c2JtX2ZjID0gKGFubHBhciAmIEFOTFBBUl9QQVVTRSkgPyBzYm1hY19mY19mcmFtZSA6IHNibWFjX2ZjX2Rpc2FibGVkOworCXAgKz0gc3ByaW50ZihwLCIxMDBCYXNlVCBGRFgiKTsKKwl9CisgICAgZWxzZSBpZiAoYW5scGFyICYgQU5MUEFSX1RYSEQpIHsKKwlzLT5zYm1fc3BlZWQgPSBzYm1hY19zcGVlZF8xMDA7CisJcy0+c2JtX2R1cGxleCA9IHNibWFjX2R1cGxleF9oYWxmOworCXMtPnNibV9mYyA9IHNibWFjX2ZjX2Rpc2FibGVkOworCXAgKz0gc3ByaW50ZihwLCIxMDBCYXNlVCBIRFgiKTsKKwl9CisgICAgZWxzZSBpZiAoYW5scGFyICYgQU5MUEFSXzEwRkQpIHsKKwlzLT5zYm1fc3BlZWQgPSBzYm1hY19zcGVlZF8xMDsKKwlzLT5zYm1fZHVwbGV4ID0gc2JtYWNfZHVwbGV4X2Z1bGw7CisJcy0+c2JtX2ZjID0gc2JtYWNfZmNfZnJhbWU7CisJcCArPSBzcHJpbnRmKHAsIjEwQmFzZVQgRkRYIik7CisJfQorICAgIGVsc2UgaWYgKGFubHBhciAmIEFOTFBBUl8xMEhEKSB7CisJcy0+c2JtX3NwZWVkID0gc2JtYWNfc3BlZWRfMTA7CisJcy0+c2JtX2R1cGxleCA9IHNibWFjX2R1cGxleF9oYWxmOworCXMtPnNibV9mYyA9IHNibWFjX2ZjX2NvbGxpc2lvbjsKKwlwICs9IHNwcmludGYocCwiMTBCYXNlVCBIRFgiKTsKKwl9CisgICAgZWxzZSB7CisJcCArPSBzcHJpbnRmKHAsIlVua25vd24iKTsKKwl9CisKKyAgICBpZiAobm9pc3kpIHsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzXG4iLHMtPnNibV9kZXYtPm5hbWUsYnVmZmVyKTsKKwkgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQgc2JtYWNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBzYm1hY19zb2Z0YyAqc2MgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBuZXh0X3RpY2sgPSBIWjsKKwlpbnQgbWlpX3N0YXR1czsKKworCXNwaW5fbG9ja19pcnEgKCZzYy0+c2JtX2xvY2spOworCQorCS8qIG1ha2UgSUZGX1JVTk5JTkcgZm9sbG93IHRoZSBNSUkgc3RhdHVzIGJpdCAiTGluayBlc3RhYmxpc2hlZCIgKi8KKwltaWlfc3RhdHVzID0gc2JtYWNfbWlpX3JlYWQoc2MsIHNjLT5zYm1fcGh5c1swXSwgTUlJX0JNU1IpOworCQorCWlmICggKG1paV9zdGF0dXMgJiBCTVNSX0xJTktTVEFUKSAhPSAoc2MtPnNibV9waHlfb2xkbGlua3N0YXQpICkgeworICAgIAkgICAgICAgIHNjLT5zYm1fcGh5X29sZGxpbmtzdGF0ID0gbWlpX3N0YXR1cyAmIEJNU1JfTElOS1NUQVQ7CisJCWlmIChtaWlfc3RhdHVzICYgQk1TUl9MSU5LU1RBVCkgeworCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQl9CisJCWVsc2UgeworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsJCisJCX0KKwl9CisJCisJLyoKKwkgKiBQb2xsIHRoZSBQSFkgdG8gc2VlIHdoYXQgc3BlZWQgd2Ugc2hvdWxkIGJlIHJ1bm5pbmcgYXQKKwkgKi8KKworCWlmIChzYm1hY19taWlfcG9sbChzYyxub2lzeV9taWkpKSB7CisJCWlmIChzYy0+c2JtX3N0YXRlICE9IHNibWFjX3N0YXRlX29mZikgeworCQkJLyoKKwkJCSAqIHNvbWV0aGluZyBjaGFuZ2VkLCByZXN0YXJ0IHRoZSBjaGFubmVsCisJCQkgKi8KKwkJCWlmIChkZWJ1ZyA+IDEpIHsKKwkJCQlwcmludGsoIiVzOiByZXN0YXJ0aW5nIGNoYW5uZWwgYmVjYXVzZSBzcGVlZCBjaGFuZ2VkXG4iLAorCQkJCSAgICAgICBzYy0+c2JtX2Rldi0+bmFtZSk7CisJCQl9CisJCQlzYm1hY19jaGFubmVsX3N0b3Aoc2MpOworCQkJc2JtYWNfY2hhbm5lbF9zdGFydChzYyk7CisJCX0KKwl9CisJCisJc3Bpbl91bmxvY2tfaXJxICgmc2MtPnNibV9sb2NrKTsKKwkKKwlzYy0+c2JtX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbmV4dF90aWNrOworCWFkZF90aW1lcigmc2MtPnNibV90aW1lcik7Cit9CisKKworc3RhdGljIHZvaWQgc2JtYWNfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlzcGluX2xvY2tfaXJxICgmc2MtPnNibV9sb2NrKTsKKwkKKwkKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlzYy0+c2JtX3N0YXRzLnR4X2Vycm9ycysrOworCQorCXNwaW5fdW5sb2NrX2lycSAoJnNjLT5zYm1fbG9jayk7CisKKwlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dFxuIixkZXYtPm5hbWUpOworfQorCisKKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNibWFjX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYm1hY19zb2Z0YyAqc2MgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOworCQorCS8qIFhYWCB1cGRhdGUgb3RoZXIgc3RhdHMgaGVyZSAqLworCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOworCQorCXJldHVybiAmc2MtPnNibV9zdGF0czsKK30KKworCisKK3N0YXRpYyB2b2lkIHNibWFjX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbXNnX2ZsYWcgPSAwOworCXN0cnVjdCBzYm1hY19zb2Z0YyAqc2MgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOworCWlmICgoZGV2LT5mbGFncyBeIHNjLT5zYm1fZGV2ZmxhZ3MpICYgSUZGX1BST01JU0MpIHsKKwkJLyoKKwkJICogUHJvbWlzY3VvdXMgY2hhbmdlZC4KKwkJICovCisJCQorCQlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CQorCQkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJCW1zZ19mbGFnID0gMTsKKwkJCXNibWFjX3Byb21pc2N1b3VzX21vZGUoc2MsMSk7CisJCX0KKwkJZWxzZSB7CisJCQltc2dfZmxhZyA9IDI7CisJCQlzYm1hY19wcm9taXNjdW91c19tb2RlKHNjLDApOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOworCQorCWlmIChtc2dfZmxhZykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBQcm9taXNjdW91cyBtb2RlICVzYWJsZWQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLChtc2dfZmxhZz09MSk/ImVuIjoiZGlzIik7CisJfQorCQorCS8qCisJICogUHJvZ3JhbSB0aGUgbXVsdGljYXN0cy4gIERvIHRoaXMgZXZlcnkgdGltZS4KKwkgKi8KKwkKKwlzYm1hY19zZXRtdWx0aShzYyk7CisJCit9CisKK3N0YXRpYyBpbnQgc2JtYWNfbWlpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHNibWFjX3NvZnRjICpzYyA9IG5ldGRldl9wcml2KGRldik7CisJdTE2ICpkYXRhID0gKHUxNiAqKSZycS0+aWZyX2lmcnU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZzYy0+c2JtX2xvY2ssIGZsYWdzKTsKKwlyZXR2YWwgPSAwOworCQorCXN3aXRjaChjbWQpIHsKKwljYXNlIFNJT0NERVZQUklWQVRFOgkJLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgaW4gdXNlLiAqLworCQlkYXRhWzBdID0gc2MtPnNibV9waHlzWzBdICYgMHgxZjsKKwkJLyogRmFsbCBUaHJvdWdoICovCisJY2FzZSBTSU9DREVWUFJJVkFURSsxOgkJLyogUmVhZCB0aGUgc3BlY2lmaWVkIE1JSSByZWdpc3Rlci4gKi8KKwkJZGF0YVszXSA9IHNibWFjX21paV9yZWFkKHNjLCBkYXRhWzBdICYgMHgxZiwgZGF0YVsxXSAmIDB4MWYpOworCQlicmVhazsKKwljYXNlIFNJT0NERVZQUklWQVRFKzI6CQkvKiBXcml0ZSB0aGUgc3BlY2lmaWVkIE1JSSByZWdpc3RlciAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJldHZhbCA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChkZWJ1ZyA+IDEpIHsKKwkJICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc2JtYWNfbWlpX2lvY3RsOiB3cml0ZSAlMDJYICUwMlggJTAyWFxuIixkZXYtPm5hbWUsCisJCSAgICAgICBkYXRhWzBdLGRhdGFbMV0sZGF0YVsyXSk7CisJCSAgICB9CisJCXNibWFjX21paV93cml0ZShzYywgZGF0YVswXSAmIDB4MWYsIGRhdGFbMV0gJiAweDFmLCBkYXRhWzJdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gLUVPUE5PVFNVUFA7CisJfQorCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2JtYWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpcnE7CisKKwlzYm1hY19zZXRfY2hhbm5lbF9zdGF0ZShzYyxzYm1hY19zdGF0ZV9vZmYpOworCisJZGVsX3RpbWVyX3N5bmMoJnNjLT5zYm1fdGltZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKGRlYnVnID4gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkXG4iLGRldi0+bmFtZSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPnNibV9sb2NrLCBmbGFncyk7CisKKwlpcnEgPSBkZXYtPmlycTsKKwlzeW5jaHJvbml6ZV9pcnEoaXJxKTsKKwlmcmVlX2lycShpcnEsIGRldik7CisKKwlzYmRtYV9lbXB0eXJpbmcoJihzYy0+c2JtX3R4ZG1hKSk7CisJc2JkbWFfZW1wdHlyaW5nKCYoc2MtPnNibV9yeGRtYSkpOworCQorCXJldHVybiAwOworfQorCisKKworI2lmIGRlZmluZWQoU0JNQUNfRVRIMF9IV0FERFIpIHx8IGRlZmluZWQoU0JNQUNfRVRIMV9IV0FERFIpIHx8IGRlZmluZWQoU0JNQUNfRVRIMl9IV0FERFIpCitzdGF0aWMgdm9pZAorc2JtYWNfc2V0dXBfaHdhZGRyKGludCBjaGFuLGNoYXIgKmFkZHIpCit7CisJdWludDhfdCBlYWRkcls2XTsKKwl1aW50NjRfdCB2YWw7CisJc2JtYWNfcG9ydF90IHBvcnQ7CisKKwlwb3J0ID0gQV9NQUNfQ0hBTk5FTF9CQVNFKGNoYW4pOworCXNibWFjX3BhcnNlX2h3YWRkcihhZGRyLGVhZGRyKTsKKwl2YWwgPSBzYm1hY19hZGRyMnJlZyhlYWRkcik7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKHBvcnQrUl9NQUNfRVRIRVJORVRfQUREUiksdmFsKTsKKwl2YWwgPSBTQk1BQ19SRUFEQ1NSKElPQUREUihwb3J0K1JfTUFDX0VUSEVSTkVUX0FERFIpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9zYm1hY1tNQVhfVU5JVFNdOworCitzdGF0aWMgaW50IF9faW5pdAorc2JtYWNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgaWR4OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc2JtYWNfcG9ydF90IHBvcnQ7CisJaW50IGNoaXBfbWF4X3VuaXRzOworCQorCS8qCisJICogRm9yIGJyaW5ndXAgd2hlbiBub3QgdXNpbmcgdGhlIGZpcm13YXJlLCB3ZSBjYW4gcHJlLWZpbGwKKwkgKiB0aGUgTUFDIGFkZHJlc3NlcyB1c2luZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisJICogc3BlY2lmaWVkIGluIHRoaXMgZmlsZSAob3IgbWF5YmUgZnJvbSB0aGUgY29uZmlnIGZpbGU/KQorCSAqLworI2lmZGVmIFNCTUFDX0VUSDBfSFdBRERSCisJc2JtYWNfc2V0dXBfaHdhZGRyKDAsU0JNQUNfRVRIMF9IV0FERFIpOworI2VuZGlmCisjaWZkZWYgU0JNQUNfRVRIMV9IV0FERFIKKwlzYm1hY19zZXR1cF9od2FkZHIoMSxTQk1BQ19FVEgxX0hXQUREUik7CisjZW5kaWYKKyNpZmRlZiBTQk1BQ19FVEgyX0hXQUREUgorCXNibWFjX3NldHVwX2h3YWRkcigyLFNCTUFDX0VUSDJfSFdBRERSKTsKKyNlbmRpZgorCisJLyoKKwkgKiBXYWxrIHRocm91Z2ggdGhlIEV0aGVybmV0IGNvbnRyb2xsZXJzIGFuZCBmaW5kCisJICogdGhvc2Ugd2hvIGhhdmUgdGhlaXIgTUFDIGFkZHJlc3NlcyBzZXQuCisJICovCisJc3dpdGNoIChzb2NfdHlwZSkgeworCWNhc2UgS19TWVNfU09DX1RZUEVfQkNNMTI1MDoKKwljYXNlIEtfU1lTX1NPQ19UWVBFX0JDTTEyNTBfQUxUOgorCQljaGlwX21heF91bml0cyA9IDM7CisJCWJyZWFrOworCWNhc2UgS19TWVNfU09DX1RZUEVfQkNNMTEyMDoKKwljYXNlIEtfU1lTX1NPQ19UWVBFX0JDTTExMjU6CisJY2FzZSBLX1NZU19TT0NfVFlQRV9CQ00xMTI1SDoKKwljYXNlIEtfU1lTX1NPQ19UWVBFX0JDTTEyNTBfQUxUMjogLyogSHlicmlkICovCisJCWNoaXBfbWF4X3VuaXRzID0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2hpcF9tYXhfdW5pdHMgPSAwOworCQlicmVhazsKKwl9CisJaWYgKGNoaXBfbWF4X3VuaXRzID4gTUFYX1VOSVRTKQorCQljaGlwX21heF91bml0cyA9IE1BWF9VTklUUzsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgY2hpcF9tYXhfdW5pdHM7IGlkeCsrKSB7CisKKwkgICAgICAgIC8qCisJICAgICAgICAgKiBUaGlzIGlzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIE1BQy4KKwkJICovCisKKwkgICAgICAgIHBvcnQgPSBBX01BQ19DSEFOTkVMX0JBU0UoaWR4KTsKKworCQkvKgkKKwkJICogVGhlIFJfTUFDX0VUSEVSTkVUX0FERFIgcmVnaXN0ZXIgd2lsbCBiZSBzZXQgdG8gc29tZSBub256ZXJvCisJCSAqIHZhbHVlIGZvciB1cyBieSB0aGUgZmlybXdhcmUgaWYgd2UncmUgZ29pbmcgdG8gdXNlIHRoaXMgTUFDLgorCQkgKiBJZiB3ZSBmaW5kIGEgemVybywgc2tpcCB0aGlzIE1BQy4KKwkJICovCisKKwkJc2JtYWNfb3JpZ19od2FkZHJbaWR4XSA9IFNCTUFDX1JFQURDU1IoSU9BRERSKHBvcnQrUl9NQUNfRVRIRVJORVRfQUREUikpOworCQlpZiAoc2JtYWNfb3JpZ19od2FkZHJbaWR4XSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAic2JtYWM6IG5vdCBjb25maWd1cmluZyBNQUMgYXQgIgorCQkJICAgICAgICIlbHhcbiIsIHBvcnQpOworCQkgICAgY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBPa2F5LCBjb29sLiAgSW5pdGlhbGl6ZSB0aGlzIE1BQy4KKwkJICovCisKKwkJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBzYm1hY19zb2Z0YykpOworCQlpZiAoIWRldikgCisJCQlyZXR1cm4gLUVOT01FTTsJLyogcmV0dXJuIEVOT01FTSAqLworCisJCXByaW50ayhLRVJOX0RFQlVHICJzYm1hYzogY29uZmlndXJpbmcgTUFDIGF0ICVseFxuIiwgcG9ydCk7CisKKwkJZGV2LT5pcnEgPSBLX0lOVF9NQUNfMCArIGlkeDsKKwkJZGV2LT5iYXNlX2FkZHIgPSBwb3J0OworCQlkZXYtPm1lbV9lbmQgPSAwOworCQlpZiAoc2JtYWNfaW5pdChkZXYsIGlkeCkpIHsKKwkJCXBvcnQgPSBBX01BQ19DSEFOTkVMX0JBU0UoaWR4KTsKKwkJCVNCTUFDX1dSSVRFQ1NSKElPQUREUihwb3J0K1JfTUFDX0VUSEVSTkVUX0FERFIpLAorCQkJCSAgICAgICBzYm1hY19vcmlnX2h3YWRkcltpZHhdKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQljb250aW51ZTsKKwkJfQorCQlkZXZfc2JtYWNbaWR4XSA9IGRldjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0CitzYm1hY19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGlkeDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX1VOSVRTOyBpZHgrKykgeworCQlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjOworCQlkZXYgPSBkZXZfc2JtYWNbaWR4XTsKKwkJaWYgKCFkZXYpCisJCQljb250aW51ZTsKKworCQlzYyA9IG5ldGRldl9wcml2KGRldik7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCXNibWFjX3VuaW5pdGN0eChzYyk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorfQorCittb2R1bGVfaW5pdChzYm1hY19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChzYm1hY19jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZWVxODAwNS5jIGIvZHJpdmVycy9uZXQvc2VlcTgwMDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWRjYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2VlcTgwMDUuYwpAQCAtMCwwICsxLDc2OSBAQAorLyogc2VlcTgwMDUuYzogQSBuZXR3b3JrIGRyaXZlciBmb3IgbGludXguICovCisvKgorCUJhc2VkIG9uIHNrZWxldG9uLmMsCisJV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisJU2VlIHRoZSBza2VsZXRvbi5jIGZpbGUgZm9yIGZ1cnRoZXIgY29weXJpZ2h0IGluZm9ybWF0aW9uLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGhhbWlzaEB6b3QuYXBhbmEub3JnLmF1CisKKwlUaGlzIGZpbGUgaXMgYSBuZXR3b3JrIGRldmljZSBkcml2ZXIgZm9yIHRoZSBTRUVRIDgwMDUgY2hpcHNldCBhbmQKKwl0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbS4KKworKi8KKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKwkic2VlcTgwMDUuYzp2MS4wMCA4LzA3Lzk1IEhhbWlzaCBDb2xlbWFuIChoYW1pc2hAem90LmFwYW5hLm9yZy5hdSlcbiI7CisKKy8qCisgIFNvdXJjZXM6CisgIAlTRUVRIDgwMDUgZGF0YWJvb2sKKyAgCQorICBWZXJzaW9uIGhpc3Rvcnk6CisgIAkxLjAwCVB1YmxpYyByZWxlYXNlLiBjb3NtZXRpYyBjaGFuZ2VzIChubyB3YXJuaW5ncyBub3cpCisgIAkwLjY4CVR1cm5pbmcgcGVyLSBwYWNrZXQsaW50ZXJydXB0IGRlYnVnIG1lc3NhZ2VzIG9mZiAtIHRlc3RpbmcgZm9yIHJlbGVhc2UuCisgIAkwLjY3CXRpbWluZyBwcm9ibGVtcy9iYWQgYnVmZmVyIHJlYWRzIHNlZW0gdG8gYmUgZml4ZWQgbm93CisgIAkwLjYzCSohQCQgcHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMgLS0gbm93IHBhY2tldHMgZmxvdworICAJMC41NglTZW5kIHdvcmtpbmcKKyAgCTAuNDgJUmVjZWl2ZSB3b3JraW5nCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlICJzZWVxODAwNS5oIgorCisvKiBGaXJzdCwgYSBmZXcgZGVmaW5pdGlvbnMgdGhhdCB0aGUgYnJhdmUgbWlnaHQgY2hhbmdlLiAqLworLyogQSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBJL08gYWRkcmVzc2VzIHRvIGJlIHByb2JlZC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2VlcTgwMDVfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0KKyAgIHsgMHgzMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDB9OworCisvKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcgKi8KKyNpZm5kZWYgTkVUX0RFQlVHCisjZGVmaW5lIE5FVF9ERUJVRyAxCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV0X2RlYnVnID0gTkVUX0RFQlVHOworCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3N0cnVjdCBuZXRfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXVuc2lnbmVkIHNob3J0IHJlY2VpdmVfcHRyOwkJLyogV2hhdCBhZGRyZXNzIGluIHBhY2tldCBtZW1vcnkgZG8gd2UgZXhwZWN0IGEgcmVjdl9wa3RfaGVhZGVyPyAqLworCWxvbmcgb3Blbl90aW1lOwkJCQkvKiBVc2VsZXNzIGV4YW1wbGUgbG9jYWwgaW5mby4gKi8KK307CisKKy8qIFRoZSBzdGF0aW9uIChldGhlcm5ldCkgYWRkcmVzcyBwcmVmaXgsIHVzZWQgZm9yIElEaW5nIHRoZSBib2FyZC4gKi8KKyNkZWZpbmUgU0FfQUREUjAgMHgwMAorI2RlZmluZSBTQV9BRERSMSAweDgwCisjZGVmaW5lIFNBX0FERFIyIDB4NGIKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworCitzdGF0aWMgaW50IHNlZXE4MDA1X3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQgc2VlcTgwMDVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNlZXE4MDA1X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNlZXE4MDA1X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHNlZXE4MDA1X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHNlZXE4MDA1X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzZWVxODAwNV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2VlcTgwMDVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBFeGFtcGxlIHJvdXRpbmVzIHlvdSBtdXN0IHdyaXRlIDstPi4gKi8KKyNkZWZpbmUgdHhfZG9uZShkZXYpCShpbncoU0VFUV9TVEFUVVMpICYgU0VFUVNUQVRfVFhfT04pCitzdGF0aWMgdm9pZCBoYXJkd2FyZV9zZW5kX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBsZW5ndGgpOworZXh0ZXJuIHZvaWQgc2VlcTgwMDVfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhcnRwKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB3YWl0X2Zvcl9idWZmZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwwKKy8qIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUsIGFuZCByZXR1cm4gJzAnIGlmZiBvbmUgZXhpc3RzLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMCwgcHJvYmUgYWxsIGxpa2VseSBsb2NhdGlvbnMuCisgICBJZiBkZXYtPmJhc2VfYWRkciA9PSAxLCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCisgICAqLworCitzdGF0aWMgaW50IGlvID0gMHgzMjA7CitzdGF0aWMgaW50IGlycSA9IDEwOworCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBzZWVxODAwNV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwl1bnNpZ25lZCAqcG9ydDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQlpbyA9IGRldi0+YmFzZV9hZGRyOworCQlpcnEgPSBkZXYtPmlycTsKKwl9CisKKwlpZiAoaW8gPiAweDFmZikgewkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCWVyciA9IHNlZXE4MDA1X3Byb2JlMShkZXYsIGlvKTsKKwl9IGVsc2UgaWYgKGlvICE9IDApIHsJLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCQllcnIgPSAtRU5YSU87CisJfSBlbHNlIHsKKwkJZm9yIChwb3J0ID0gc2VlcTgwMDVfcG9ydGxpc3Q7ICpwb3J0OyBwb3J0KyspIHsKKwkJCWlmIChzZWVxODAwNV9wcm9iZTEoZGV2LCAqcG9ydCkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoISpwb3J0KQorCQkJZXJyID0gLUVOT0RFVjsKKwl9CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTRUVRODAwNV9JT19FWFRFTlQpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyogVGhpcyBpcyB0aGUgcmVhbCBwcm9iZSByb3V0aW5lLiAgTGludXggaGFzIGEgaGlzdG9yeSBvZiBmcmllbmRseSBkZXZpY2UKKyAgIHByb2JlcyBvbiB0aGUgSVNBIGJ1cy4gIEEgZ29vZCBkZXZpY2UgcHJvYmVzIGF2b2lkcyBkb2luZyB3cml0ZXMsIGFuZAorICAgdmVyaWZpZXMgdGhhdCB0aGUgY29ycmVjdCBkZXZpY2UgZXhpc3RzIGFuZCBmdW5jdGlvbnMuICAqLworCitzdGF0aWMgaW50IF9faW5pdCBzZWVxODAwNV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCWludCBpLGo7CisJdW5zaWduZWQgY2hhciBTQV9wcm9tWzMyXTsKKwlpbnQgb2xkX2NmZzE7CisJaW50IG9sZF9jZmcyOworCWludCBvbGRfc3RhdDsKKwlpbnQgb2xkX2RtYWFyOworCWludCBvbGRfcmVhcjsKKwlpbnQgcmV0dmFsOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIFNFRVE4MDA1X0lPX0VYVEVOVCwgInNlZXE4MDA1IikpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKG5ldF9kZWJ1Zz4xKQorCQlwcmludGsoInNlZXE4MDA1OiBwcm9iaW5nIGF0IDB4JXhcbiIsaW9hZGRyKTsKKworCW9sZF9zdGF0ID0gaW53KFNFRVFfU1RBVFVTKTsJCQkJCS8qIHJlYWQgc3RhdHVzIHJlZ2lzdGVyICovCisJaWYgKG9sZF9zdGF0ID09IDB4ZmZmZikgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsJCQkJCQkvKiBhc3N1bWUgdGhhdCAweGZmZmYgPT0gbm8gZGV2aWNlICovCisJfQorCWlmICggKG9sZF9zdGF0ICYgMHgxODAwKSAhPSAweDE4MDAgKSB7CQkJCS8qIGFzc3VtZSB0aGF0IHVudXNlZCBiaXRzIGFyZSAxLCBhcyBteSBtYW51YWwgc2F5cyAqLworCQlpZiAobmV0X2RlYnVnPjEpIHsKKwkJCXByaW50aygic2VlcTgwMDU6IHJlc2VydmVkIHN0YXQgYml0cyAhPSAweDE4MDBcbiIpOworCQkJcHJpbnRrKCIgICAgICAgICAgPT0gMHglMDR4XG4iLG9sZF9zdGF0KTsKKwkJfQorCSAJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJb2xkX3JlYXIgPSBpbncoU0VFUV9SRUEpOworCWlmIChvbGRfcmVhciA9PSAweGZmZmYpIHsKKwkJb3V0dygwLFNFRVFfUkVBKTsKKwkJaWYgKGludyhTRUVRX1JFQSkgPT0gMHhmZmZmKSB7CQkJCS8qIGFzc3VtZSB0aGF0IDB4ZmZmZiA9PSBubyBkZXZpY2UgKi8KKwkJCXJldHZhbCA9IC1FTk9ERVY7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSBpZiAoKG9sZF9yZWFyICYgMHhmZjAwKSAhPSAweGZmMDApIHsJCQkvKiBhc3N1bWUgdGhhdCB1bnVzZWQgYml0cyBhcmUgMSAqLworCQlpZiAobmV0X2RlYnVnPjEpIHsKKwkJCXByaW50aygic2VlcTgwMDU6IHVudXNlZCByZWFyIGJpdHMgIT0gMHhmZjAwXG4iKTsKKwkJCXByaW50aygiICAgICAgICAgID09IDB4JTA0eFxuIixvbGRfcmVhcik7CisJCX0KKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCQorCW9sZF9jZmcyID0gaW53KFNFRVFfQ0ZHMik7CQkJCQkvKiByZWFkIENGRzIgcmVnaXN0ZXIgKi8KKwlvbGRfY2ZnMSA9IGludyhTRUVRX0NGRzEpOworCW9sZF9kbWFhciA9IGludyhTRUVRX0RNQUFSKTsKKwkKKwlpZiAobmV0X2RlYnVnPjQpIHsKKwkJcHJpbnRrKCJzZWVxODAwNTogc3RhdCA9IDB4JTA0eFxuIixvbGRfc3RhdCk7CisJCXByaW50aygic2VlcTgwMDU6IGNmZzEgPSAweCUwNHhcbiIsb2xkX2NmZzEpOworCQlwcmludGsoInNlZXE4MDA1OiBjZmcyID0gMHglMDR4XG4iLG9sZF9jZmcyKTsKKwkJcHJpbnRrKCJzZWVxODAwNTogcmFlciA9IDB4JTA0eFxuIixvbGRfcmVhcik7CisJCXByaW50aygic2VlcTgwMDU6IGRtYWFyPSAweCUwNHhcbiIsb2xkX2RtYWFyKTsKKwl9CisJCisJb3V0dyggU0VFUUNNRF9GSUZPX1dSSVRFIHwgU0VFUUNNRF9TRVRfQUxMX09GRiwgU0VFUV9DTUQpOwkvKiBzZXR1cCBmb3IgcmVhZGluZyBQUk9NICovCisJb3V0dyggMCwgU0VFUV9ETUFBUik7CQkJCQkJLyogc2V0IHN0YXJ0aW5nIFBST00gYWRkcmVzcyAqLworCW91dHcoIFNFRVFDRkcxX0JVRkZFUl9QUk9NLCBTRUVRX0NGRzEpOwkJCQkvKiBzZXQgYnVmZmVyIHRvIGxvb2sgYXQgUFJPTSAqLworCisKKwlqPTA7CisJZm9yKGk9MDsgaSA8MzI7IGkrKykgeworCQlqKz0gU0FfcHJvbVtpXSA9IGludyhTRUVRX0JVRkZFUikgJiAweGZmOworCX0KKworI2lmIDAKKwkvKiB1bnRlc3RlZCBiZWNhdXNlIEkgb25seSBoYXZlIHRoZSBvbmUgY2FyZCAqLworCWlmICggKGomMHhmZikgIT0gMCApIHsJCQkJCQkvKiBjaGVja3N1bSBhcHBlYXJzIHRvIGJlIDhiaXQgPSAwICovCisJCWlmIChuZXRfZGVidWc+MSkgewkJCQkJLyogY2hlY2sgdGhpcyBiZWZvcmUgZGVjaWRpbmcgdGhhdCB3ZSBoYXZlIGEgY2FyZCAqLworCQkJcHJpbnRrKCJzZWVxODAwNTogcHJvbSBzdW0gZXJyb3JcbiIpOworCQl9CisJCW91dHcoIG9sZF9zdGF0LCBTRUVRX1NUQVRVUyk7CisJCW91dHcoIG9sZF9kbWFhciwgU0VFUV9ETUFBUik7CisJCW91dHcoIG9sZF9jZmcxLCBTRUVRX0NGRzEpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKworCW91dHcoIFNFRVFDRkcyX1JFU0VULCBTRUVRX0NGRzIpOwkJCQkvKiByZXNldCB0aGUgY2FyZCAqLworCXVkZWxheSg1KTsKKwlvdXR3KCBTRUVRQ01EX1NFVF9BTExfT0ZGLCBTRUVRX0NNRCk7CisJCisJaWYgKG5ldF9kZWJ1ZykgeworCQlwcmludGsoInNlZXE4MDA1OiBwcm9tIHN1bSA9IDB4JTA4eFxuIixqKTsKKwkJZm9yKGo9MDsgajwzMjsgais9MTYpIHsKKwkJCXByaW50aygic2VlcTgwMDU6IHByb20gJTAyeDogIixqKTsKKwkJCWZvcihpPTA7aTwxNjtpKyspIHsKKwkJCQlwcmludGsoIiUwMnggIixTQV9wcm9tW2p8aV0pOworCQkJfQorCQkJcHJpbnRrKCIgIik7CisJCQlmb3IoaT0wO2k8MTY7aSsrKSB7CisJCQkJaWYgKChTQV9wcm9tW2p8aV0+MzEpJiYoU0FfcHJvbVtqfGldPDEyNykpIHsKKwkJCQkJcHJpbnRrKCIlYyIsIFNBX3Byb21banxpXSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRrKCIgIik7CisJCQkJfQorCQkJfQorCQkJcHJpbnRrKCJcbiIpOworCQl9CisJfQorCisjaWYgMAkKKwkvKiAKKwkgKiB0ZXN0aW5nIHRoZSBwYWNrZXQgYnVmZmVyIG1lbW9yeSBkb2Vzbid0IHdvcmsgeWV0CisJICogYnV0IGFsbCBvdGhlciBidWZmZXIgYWNjZXNzZXMgZG8gCisJICoJCQktIGZpeGluZyBpcyBub3QgYSBwcmlvcml0eQorCSAqLworCWlmIChuZXRfZGVidWc+MSkgewkJCQkJLyogdGVzdCBwYWNrZXQgYnVmZmVyIG1lbW9yeSAqLworCQlwcmludGsoInNlZXE4MDA1OiB0ZXN0aW5nIHBhY2tldCBidWZmZXIgLi4uICIpOworCQlvdXR3KCBTRUVRQ0ZHMV9CVUZGRVJfQlVGRkVSLCBTRUVRX0NGRzEpOworCQlvdXR3KCBTRUVRQ01EX0ZJRk9fV1JJVEUgfCBTRUVRQ01EX1NFVF9BTExfT0ZGLCBTRUVRX0NNRCk7CisJCW91dHcoIDAgLCBTRUVRX0RNQUFSKTsKKwkJZm9yKGk9MDtpPDMyNzY4O2krKykgeworCQkJb3V0dygweDVhNWEsIFNFRVFfQlVGRkVSKTsKKwkJfQorCQlqPWppZmZpZXMrSFo7CisJCXdoaWxlICggKChpbncoU0VFUV9TVEFUVVMpICYgU0VFUVNUQVRfRklGT19FTVBUWSkgIT0gU0VFUVNUQVRfRklGT19FTVBUWSkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgaikgKQorCQkJbWIoKTsKKwkJb3V0dyggMCAsIFNFRVFfRE1BQVIpOworCQl3aGlsZSAoICgoaW53KFNFRVFfU1RBVFVTKSAmIFNFRVFTVEFUX1dJTkRPV19JTlQpICE9IFNFRVFTVEFUX1dJTkRPV19JTlQpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIGorSFopKQorCQkJbWIoKTsKKwkJaWYgKCAoaW53KFNFRVFfU1RBVFVTKSAmIFNFRVFTVEFUX1dJTkRPV19JTlQpID09IFNFRVFTVEFUX1dJTkRPV19JTlQpCisJCQlvdXR3KCBTRUVRQ01EX1dJTkRPV19JTlRfQUNLIHwgKGludyhTRUVRX1NUQVRVUykmIFNFRVFDTURfSU5UX01BU0spLCBTRUVRX0NNRCk7CisJCW91dHcoIFNFRVFDTURfRklGT19SRUFEIHwgU0VFUUNNRF9TRVRfQUxMX09GRiwgU0VFUV9DTUQpOworCQlqPTA7CisJCWZvcihpPTA7aTwzMjc2ODtpKyspIHsKKwkJCWlmIChpbncoU0VFUV9CVUZGRVIpICE9IDB4NWE1YSkKKwkJCQlqKys7CisJCX0KKwkJaWYgKGopIHsKKwkJCXByaW50aygiJWlcbiIsaik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIm9rLlxuIik7CisJCX0KKwl9CisjZW5kaWYKKworCWlmIChuZXRfZGVidWcgICYmICB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwlwcmludGsoIiVzOiAlcyBmb3VuZCBhdCAlIzN4LCAiLCBkZXYtPm5hbWUsICJzZWVxODAwNSIsIGlvYWRkcik7CisKKwkvKiBGaWxsIGluIHRoZSAnZGV2JyBmaWVsZHMuICovCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisKKwkvKiBSZXRyaWV2ZSBhbmQgcHJpbnQgdGhlIGV0aGVybmV0IGFkZHJlc3MuICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMngiLCBkZXYtPmRldl9hZGRyW2ldID0gU0FfcHJvbVtpKzZdKTsKKworCWlmIChkZXYtPmlycSA9PSAweGZmKQorCQk7CQkJLyogRG8gbm90aGluZzogYSB1c2VyLWxldmVsIHByb2dyYW0gd2lsbCBzZXQgaXQuICovCisJZWxzZSBpZiAoZGV2LT5pcnEgPCAyKSB7CS8qICJBdXRvLUlSUSIgKi8KKwkJdW5zaWduZWQgbG9uZyBjb29raWUgPSBwcm9iZV9pcnFfb24oKTsKKwkJCisJCW91dHcoIFNFRVFDTURfUlhfSU5UX0VOIHwgU0VFUUNNRF9TRVRfUlhfT04gfCBTRUVRQ01EX1NFVF9SWF9PRkYsIFNFRVFfQ01EICk7CisKKwkJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmKGNvb2tpZSk7CisJCQorCQlpZiAobmV0X2RlYnVnID49IDIpCisJCQlwcmludGsoIiBhdXRvaXJxIGlzICVkXG4iLCBkZXYtPmlycSk7CisJfSBlbHNlIGlmIChkZXYtPmlycSA9PSAyKQorCSAgLyogRml4dXAgZm9yIHVzZXJzIHRoYXQgZG9uJ3Qga25vdyB0aGF0IElSUSAyIGlzIHJlYWxseSBJUlEgOSwKKwkgICAqIG9yIGRvbid0IGtub3cgd2hpY2ggb25lIHRvIHNldC4gCisJICAgKi8KKwkgIGRldi0+aXJxID0gOTsKKworI2lmIDAKKwl7CisJCSBpbnQgaXJxdmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzZWVxODAwNV9pbnRlcnJ1cHQsIDAsICJzZWVxODAwNSIsIGRldik7CisJCSBpZiAoaXJxdmFsKSB7CisJCQkgcHJpbnRrICgiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkIChpcnF2YWw9JWQpLlxuIiwgZGV2LT5uYW1lLAorCQkJCQkgZGV2LT5pcnEsIGlycXZhbCk7CisJCQkgcmV0dmFsID0gLUVBR0FJTjsKKwkJCSBnb3RvIG91dDsKKwkJIH0KKwl9CisjZW5kaWYKKwlkZXYtPm9wZW4JCT0gc2VlcTgwMDVfb3BlbjsKKwlkZXYtPnN0b3AJCT0gc2VlcTgwMDVfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgCT0gc2VlcTgwMDVfc2VuZF9wYWNrZXQ7CisJZGV2LT50eF90aW1lb3V0CQk9IHNlZXE4MDA1X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IEhaLzIwOworCWRldi0+Z2V0X3N0YXRzCQk9IHNlZXE4MDA1X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPmZsYWdzICY9IH5JRkZfTVVMVElDQVNUOworCisJcmV0dXJuIDA7CitvdXQ6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBTRUVRODAwNV9JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisKKwwKKy8qIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuICBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICAgc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorCisgICBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgICByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICAgdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAgICovCitzdGF0aWMgaW50IHNlZXE4MDA1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwl7CisJCSBpbnQgaXJxdmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzZWVxODAwNV9pbnRlcnJ1cHQsIDAsICJzZWVxODAwNSIsIGRldik7CisJCSBpZiAoaXJxdmFsKSB7CisJCQkgcHJpbnRrICgiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkIChpcnF2YWw9JWQpLlxuIiwgZGV2LT5uYW1lLAorCQkJCQkgZGV2LT5pcnEsIGlycXZhbCk7CisJCQkgcmV0dXJuIC1FQUdBSU47CisJCSB9CisJfQorCisJLyogUmVzZXQgdGhlIGhhcmR3YXJlIGhlcmUuICBEb24ndCBmb3JnZXQgdG8gc2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MuICovCisJc2VlcTgwMDVfaW5pdChkZXYsIDEpOworCisJbHAtPm9wZW5fdGltZSA9IGppZmZpZXM7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZWVxODAwNV90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsICVzP1xuIiwgZGV2LT5uYW1lLAorCQkgICB0eF9kb25lKGRldikgPyAiSVJRIGNvbmZsaWN0IiA6ICJuZXR3b3JrIGNhYmxlIHByb2JsZW0iKTsKKwkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvci4gKi8KKwlzZWVxODAwNV9pbml0KGRldiwgMSk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IHNlZXE4MDA1X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNob3J0IGxlbmd0aCA9IHNrYi0+bGVuOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCWlmIChsZW5ndGggPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQlsZW5ndGggPSBFVEhfWkxFTjsKKwl9CisJYnVmID0gc2tiLT5kYXRhOworCisJLyogQmxvY2sgYSB0aW1lci1iYXNlZCB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWhhcmR3YXJlX3NlbmRfcGFja2V0KGRldiwgYnVmLCBsZW5ndGgpOyAKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuZ3RoOworCWRldl9rZnJlZV9za2IgKHNrYik7CisJLyogWW91IG1pZ2h0IG5lZWQgdG8gY2xlYW4gdXAgYW5kIHJlY29yZCBUeCBzdGF0aXN0aWNzIGhlcmUuICovCisKKwlyZXR1cm4gMDsKK30KKwwKKy8qCisgKiB3YWl0X2Zvcl9idWZmZXIKKyAqCisgKiBUaGlzIHJvdXRpbmUgd2FpdHMgZm9yIHRoZSBTRUVRIGNoaXAgdG8gYXNzZXJ0IHRoYXQgdGhlIEZJRk8gaXMgcmVhZHkKKyAqIGJ5IGNoZWNraW5nIGZvciBhIHdpbmRvdyBpbnRlcnJ1cHQsIGFuZCB0aGVuIGNsZWFyaW5nIGl0LiBUaGlzIGhhcyB0bworICogb2NjdXIgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyIQorICovCitpbmxpbmUgdm9pZCB3YWl0X2Zvcl9idWZmZXIoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgdG1wOworCWludCBzdGF0dXM7CisJCisJdG1wID0gamlmZmllcyArIEhaOworCXdoaWxlICggKCAoKHN0YXR1cz1pbncoU0VFUV9TVEFUVVMpKSAmIFNFRVFTVEFUX1dJTkRPV19JTlQpICE9IFNFRVFTVEFUX1dJTkRPV19JTlQpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRtcCkpCisJCWNwdV9yZWxheCgpOworCQkKKwlpZiAoIChzdGF0dXMgJiBTRUVRU1RBVF9XSU5ET1dfSU5UKSA9PSBTRUVRU1RBVF9XSU5ET1dfSU5UKQorCQlvdXR3KCBTRUVRQ01EX1dJTkRPV19JTlRfQUNLIHwgKHN0YXR1cyAmIFNFRVFDTURfSU5UX01BU0spLCBTRUVRX0NNRCk7Cit9CisMCisvKiBUaGUgdHlwaWNhbCB3b3JrbG9hZCBvZiB0aGUgZHJpdmVyOgorICAgSGFuZGxlIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpbnRlcnJ1cHRzLiAqLworc3RhdGljIGlycXJldHVybl90IHNlZXE4MDA1X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwOworCWludCBpb2FkZHIsIHN0YXR1cywgYm9ndXNjb3VudCA9IDA7CisJaW50IGhhbmRsZWQgPSAwOworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RhdHVzID0gaW53KFNFRVFfU1RBVFVTKTsKKwlkbyB7CisJCWlmIChuZXRfZGVidWcgPjIpIHsKKwkJCXByaW50aygiJXM6IGludCwgc3RhdHVzPTB4JTA0eFxuIixkZXYtPm5hbWUsc3RhdHVzKTsKKwkJfQorCQkKKwkJaWYgKHN0YXR1cyAmIFNFRVFTVEFUX1dJTkRPV19JTlQpIHsKKwkJCWhhbmRsZWQgPSAxOworCQkJb3V0dyggU0VFUUNNRF9XSU5ET1dfSU5UX0FDSyB8IChzdGF0dXMgJiBTRUVRQ01EX0lOVF9NQVNLKSwgU0VFUV9DTUQpOworCQkJaWYgKG5ldF9kZWJ1ZykgeworCQkJCXByaW50aygiJXM6IHdpbmRvdyBpbnQhXG4iLGRldi0+bmFtZSk7CisJCQl9CisJCX0KKwkJaWYgKHN0YXR1cyAmIFNFRVFTVEFUX1RYX0lOVCkgeworCQkJaGFuZGxlZCA9IDE7CisJCQlvdXR3KCBTRUVRQ01EX1RYX0lOVF9BQ0sgfCAoc3RhdHVzICYgU0VFUUNNRF9JTlRfTUFTSyksIFNFRVFfQ01EKTsKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CS8qIEluZm9ybSB1cHBlciBsYXllcnMuICovCisJCX0KKwkJaWYgKHN0YXR1cyAmIFNFRVFTVEFUX1JYX0lOVCkgeworCQkJaGFuZGxlZCA9IDE7CisJCQkvKiBHb3QgYSBwYWNrZXQocykuICovCisJCQlzZWVxODAwNV9yeChkZXYpOworCQl9CisJCXN0YXR1cyA9IGludyhTRUVRX1NUQVRVUyk7CisJfSB3aGlsZSAoICgrK2JvZ3VzY291bnQgPCAxMCkgJiYgKHN0YXR1cyAmIFNFRVFTVEFUX0FOWV9JTlQpKSA7CisKKwlpZihuZXRfZGVidWc+MikgeworCQlwcmludGsoIiVzOiBlb2lcbiIsZGV2LT5uYW1lKTsKKwl9CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLiAqLworc3RhdGljIHZvaWQgc2VlcTgwMDVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGJvZ3VzY291bnQgPSAxMDsKKwlpbnQgcGt0X2hkcjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlkbyB7CisJCWludCBuZXh0X3BhY2tldDsKKwkJaW50IHBrdF9sZW47CisJCWludCBpOworCQlpbnQgc3RhdHVzOworCisJCXN0YXR1cyA9IGludyhTRUVRX1NUQVRVUyk7CisJICAJb3V0dyggbHAtPnJlY2VpdmVfcHRyLCBTRUVRX0RNQUFSKTsKKwkJb3V0dyhTRUVRQ01EX0ZJRk9fUkVBRCB8IFNFRVFDTURfUlhfSU5UX0FDSyB8IChzdGF0dXMgJiBTRUVRQ01EX0lOVF9NQVNLKSwgU0VFUV9DTUQpOworCSAgCXdhaXRfZm9yX2J1ZmZlcihkZXYpOworCSAgCW5leHRfcGFja2V0ID0gbnRvaHMoaW53KFNFRVFfQlVGRkVSKSk7CisJICAJcGt0X2hkciA9IGludyhTRUVRX0JVRkZFUik7CisJICAJCisJCWlmIChuZXRfZGVidWc+MikgeworCQkJcHJpbnRrKCIlczogMHglMDR4IHJlY3YgbmV4dD0weCUwNHgsIGhkcj0weCUwNHhcbiIsZGV2LT5uYW1lLGxwLT5yZWNlaXZlX3B0cixuZXh0X3BhY2tldCxwa3RfaGRyKTsKKwkJfQorCQkJCisJCWlmICgobmV4dF9wYWNrZXQgPT0gMCkgfHwgKChwa3RfaGRyICYgU0VFUVBLVEhfQ0hBSU4pPT0wKSkgewkvKiBSZWFkIGFsbCB0aGUgZnJhbWVzPyAqLworCQkJcmV0dXJuOwkJCQkJCQkvKiBEb25lIGZvciBub3cgKi8KKwkJfQorCQkJCisJCWlmICgocGt0X2hkciAmIFNFRVFQS1RTX0RPTkUpPT0wKQorCQkJYnJlYWs7CisJCQkKKwkJaWYgKG5leHRfcGFja2V0IDwgbHAtPnJlY2VpdmVfcHRyKSB7CisJCQlwa3RfbGVuID0gKG5leHRfcGFja2V0ICsgMHgxMDAwMCAtICgoREVGQVVMVF9URUErMSk8PDgpKSAtIGxwLT5yZWNlaXZlX3B0ciAtIDQ7CisJCX0gZWxzZSB7CisJCQlwa3RfbGVuID0gbmV4dF9wYWNrZXQgLSBscC0+cmVjZWl2ZV9wdHIgLSA0OworCQl9CisJCQorCQlpZiAobmV4dF9wYWNrZXQgPCAoKERFRkFVTFRfVEVBKzEpPDw4KSkgewkJCS8qIGlzIHRoZSBuZXh0X3BhY2tldCBhZGRyZXNzIHNhbmU/ICovCisJCQlwcmludGsoIiVzOiByZWN2IHBhY2tldCByaW5nIGNvcnJ1cHQsIHJlc2V0dGluZyBib2FyZFxuIixkZXYtPm5hbWUpOworCQkJc2VlcTgwMDVfaW5pdChkZXYsMSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWxwLT5yZWNlaXZlX3B0ciA9IG5leHRfcGFja2V0OworCQkKKwkJaWYgKG5ldF9kZWJ1Zz4yKSB7CisJCQlwcmludGsoIiVzOiByZWN2IGxlbj0weCUwNHhcbiIsZGV2LT5uYW1lLHBrdF9sZW4pOworCQl9CisKKwkJaWYgKHBrdF9oZHIgJiBTRUVRUEtUU19BTllfRVJST1IpIHsJCQkJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHBrdF9oZHIgJiBTRUVRUEtUU19TSE9SVCkgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKHBrdF9oZHIgJiBTRUVRUEtUU19EUklCKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAocGt0X2hkciAmIFNFRVFQS1RTX09WRVJTSVpFKSBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmIChwa3RfaGRyICYgU0VFUVBLVFNfQ1JDX0VSUikgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCS8qIHNraXAgb3ZlciB0aGlzIHBhY2tldCAqLworCQkJb3V0dyggU0VFUUNNRF9GSUZPX1dSSVRFIHwgU0VFUUNNRF9ETUFfSU5UX0FDSyB8IChzdGF0dXMgJiBTRUVRQ01EX0lOVF9NQVNLKSwgU0VFUV9DTUQpOworCQkJb3V0dyggKGxwLT5yZWNlaXZlX3B0ciAmIDB4ZmYwMCk+PjgsIFNFRVFfUkVBKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIGFsaWduIGRhdGEgb24gMTYgYnl0ZSAqLworCQkJYnVmID0gc2tiX3B1dChza2IscGt0X2xlbik7CisJCQkKKwkJCWluc3coU0VFUV9CVUZGRVIsIGJ1ZiwgKHBrdF9sZW4gKyAxKSA+PiAxKTsKKwkJCQorCQkJaWYgKG5ldF9kZWJ1Zz4yKSB7CisJCQkJY2hhciAqIHAgPSBidWY7CisJCQkJcHJpbnRrKCIlczogcmVjdiAiLGRldi0+bmFtZSk7CisJCQkJZm9yKGk9MDtpPDE0O2krKykgeworCQkJCQlwcmludGsoIiUwMnggIiwqKHArKykmMHhmZik7CisJCQkJfQorCQkJCXByaW50aygiXG4iKTsKKwkJCX0KKworCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisJfSB3aGlsZSAoKC0tYm9ndXNjb3VudCkgJiYgKHBrdF9oZHIgJiBTRUVRUEtUSF9DSEFJTikpOworCisJLyogSWYgYW55IHdvcnRoLXdoaWxlIHBhY2tldHMgaGF2ZSBiZWVuIHJlY2VpdmVkLCBuZXRpZl9yeCgpCisJICAgaGFzIGRvbmUgYSBtYXJrX2JoKE5FVF9CSCkgZm9yIHVzIGFuZCB3aWxsIHdvcmsgb24gdGhlbQorCSAgIHdoZW4gd2UgZ2V0IHRvIHRoZSBib3R0b20taGFsZiByb3V0aW5lLiAqLworCXJldHVybjsKK30KKworLyogVGhlIGludmVyc2Ugcm91dGluZSB0byBuZXRfb3BlbigpLiAqLworc3RhdGljIGludCBzZWVxODAwNV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlscC0+b3Blbl90aW1lID0gMDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnggaGVyZS4gKi8KKwlvdXR3KCBTRUVRQ01EX1NFVF9BTExfT0ZGLCBTRUVRX0NNRCk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBoZXJlLiAqLworCisJcmV0dXJuIDA7CisKK30KKworLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCVRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IKKyAgIGNsb3NlZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2VlcTgwMDVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICAgbnVtX2FkZHJzID09IC0xCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKyAgIG51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICAgbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsIGFuZCBkbworCQkJYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKy8qCisgKiBJIF9jb3VsZF8gZG8gdXAgdG8gNiBhZGRyZXNzZXMgaGVyZSwgYnV0IHdvbid0ICh5ZXQ/KQorICovCisKKyNpZiAwCisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworLyoKKyAqIGhtbSwgbm90IGV2ZW4gc3VyZSBpZiBteSBtYXRjaGluZyB3b3JrcyBfYW55d2F5XyAtIHNlZW0gdG8gYmUgcmVjZWl2aW5nCisgKiBfZXZlcnl0aGluZ18gLiAuIC4KKyAqLworIAorCWlmIChudW1fYWRkcnMpIHsJCQkvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQlvdXR3KCAoaW53KFNFRVFfQ0ZHMSkgJiB+U0VFUUNGRzFfTUFUQ0hfTUFTSyl8IFNFRVFDRkcxX01BVENIX0FMTCwgIFNFRVFfQ0ZHMSk7CisJCWRldi0+ZmxhZ3N8PUlGRl9QUk9NSVNDOworCX0gZWxzZSB7CQkJCS8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSwgdXNlIG5vcm1hbCBtb2RlICovCisJCW91dHcoIChpbncoU0VFUV9DRkcxKSAmIH5TRUVRQ0ZHMV9NQVRDSF9NQVNLKXwgU0VFUUNGRzFfTUFUQ0hfQlJPQUQsIFNFRVFfQ0ZHMSk7CisJfQorI2VuZGlmCit9CisKK3ZvaWQgc2VlcTgwMDVfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhcnRwKQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisJCisJb3V0dyhTRUVRQ0ZHMl9SRVNFVCwgU0VFUV9DRkcyKTsJLyogcmVzZXQgZGV2aWNlICovCisJdWRlbGF5KDUpOworCQorCW91dHcoIFNFRVFDTURfRklGT19XUklURSB8IFNFRVFDTURfU0VUX0FMTF9PRkYsIFNFRVFfQ01EKTsKKwlvdXR3KCAwLCBTRUVRX0RNQUFSKTsJCQkvKiBsb2FkIHN0YXJ0IGFkZHJlc3MgaW50byBib3RoIGxvdyBhbmQgaGlnaCBieXRlICovCisvKgl3YWl0X2Zvcl9idWZmZXIoZGV2KTsgKi8JCS8qIEkgdGhpbmsgdGhhdCB5b3Ugb25seSBuZWVkIGEgd2FpdCBmb3IgbWVtb3J5IGJ1ZmZlciAqLworCW91dHcoIFNFRVFDRkcxX0JVRkZFUl9NQUMwLCBTRUVRX0NGRzEpOworCQorCWZvcihpPTA7aTw2O2krKykgewkJCS8qIHNldCBTdGF0aW9uIGFkZHJlc3MgKi8KKwkJb3V0YihkZXYtPmRldl9hZGRyW2ldLCBTRUVRX0JVRkZFUik7CisJCXVkZWxheSgyKTsKKwl9CisJCisJb3V0dyggU0VFUUNGRzFfQlVGRkVSX1RFQSwgU0VFUV9DRkcxKTsJLyogc2V0IHhtaXQgZW5kIGFyZWEgcG9pbnRlciB0byAxNksgKi8KKwlvdXRiKCBERUZBVUxUX1RFQSwgU0VFUV9CVUZGRVIpOwkvKiB0aGlzIGdpdmVzIHVzIDE2SyBvZiBzZW5kIGJ1ZmZlciBhbmQgNDhLIG9mIHJlY3YgYnVmZmVyICovCisJCisJbHAtPnJlY2VpdmVfcHRyID0gKERFRkFVTFRfVEVBKzEpPDw4OwkvKiBzbyB3ZSBjYW4gZmluZCBvdXIgcGFja2V0X2hlYWRlciAqLworCW91dHcoIGxwLT5yZWNlaXZlX3B0ciwgU0VFUV9SUFIpOwkvKiBSZWNlaXZlIFBvaW50ZXIgUmVnaXN0ZXIgaXMgc2V0IHRvIHJlY3YgYnVmZmVyIG1lbW9yeSAqLworCQorCW91dHcoIDB4MDBmZiwgU0VFUV9SRUEpOwkJLyogUmVjZWl2ZSBBcmVhIEVuZCAqLworCisJaWYgKG5ldF9kZWJ1Zz40KSB7CisJCXByaW50aygiJXM6IFNBMCA9ICIsZGV2LT5uYW1lKTsKKworCQlvdXR3KCBTRUVRQ01EX0ZJRk9fUkVBRCB8IFNFRVFDTURfU0VUX0FMTF9PRkYsIFNFRVFfQ01EKTsKKwkJb3V0dyggMCwgU0VFUV9ETUFBUik7CisJCW91dHcoIFNFRVFDRkcxX0JVRkZFUl9NQUMwLCBTRUVRX0NGRzEpOworCQkKKwkJZm9yKGk9MDtpPDY7aSsrKSB7CisJCQlwcmludGsoIiUwMnggIixpbmIoU0VFUV9CVUZGRVIpKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisJfQorCQorCW91dHcoIFNFRVFDRkcxX01BQzBfRU4gfCBTRUVRQ0ZHMV9NQVRDSF9CUk9BRCB8IFNFRVFDRkcxX0JVRkZFUl9CVUZGRVIsIFNFRVFfQ0ZHMSk7CisJb3V0dyggU0VFUUNGRzJfQVVUT19SRUEgfCBTRUVRQ0ZHMl9DVFJMTywgU0VFUV9DRkcyKTsKKwlvdXR3KCBTRUVRQ01EX1NFVF9SWF9PTiB8IFNFRVFDTURfVFhfSU5UX0VOIHwgU0VFUUNNRF9SWF9JTlRfRU4sIFNFRVFfQ01EKTsKKworCWlmIChuZXRfZGVidWc+NCkgeworCQlpbnQgb2xkX2NmZzE7CisJCW9sZF9jZmcxID0gaW53KFNFRVFfQ0ZHMSk7CisJCXByaW50aygiJXM6IHN0YXQgPSAweCUwNHhcbiIsZGV2LT5uYW1lLGludyhTRUVRX1NUQVRVUykpOworCQlwcmludGsoIiVzOiBjZmcxID0gMHglMDR4XG4iLGRldi0+bmFtZSxvbGRfY2ZnMSk7CisJCXByaW50aygiJXM6IGNmZzIgPSAweCUwNHhcbiIsZGV2LT5uYW1lLGludyhTRUVRX0NGRzIpKTsKKwkJcHJpbnRrKCIlczogcmFlciA9IDB4JTA0eFxuIixkZXYtPm5hbWUsaW53KFNFRVFfUkVBKSk7CisJCXByaW50aygiJXM6IGRtYWFyPSAweCUwNHhcbiIsZGV2LT5uYW1lLGludyhTRUVRX0RNQUFSKSk7CisJCQorCX0KK30JCisKKworc3RhdGljIHZvaWQgaGFyZHdhcmVfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHN0YXR1cyA9IGludyhTRUVRX1NUQVRVUyk7CisJaW50IHRyYW5zbWl0X3B0ciA9IDA7CisJaW50IHRtcDsKKworCWlmIChuZXRfZGVidWc+NCkgeworCQlwcmludGsoIiVzOiBzZW5kIDB4JTA0eFxuIixkZXYtPm5hbWUsbGVuZ3RoKTsKKwl9CisJCisJLyogU2V0IEZJRk8gdG8gd3JpdGVtb2RlIGFuZCBzZXQgcGFja2V0LWJ1ZmZlciBhZGRyZXNzICovCisJb3V0dyggU0VFUUNNRF9GSUZPX1dSSVRFIHwgKHN0YXR1cyAmIFNFRVFDTURfSU5UX01BU0spLCBTRUVRX0NNRCk7CisJb3V0dyggdHJhbnNtaXRfcHRyLCBTRUVRX0RNQUFSKTsKKwkKKwkvKiBvdXRwdXQgU0VFUSBQYWNrZXQgaGVhZGVyIGJhcmZhZ2UgKi8KKwlvdXR3KCBodG9ucyhsZW5ndGggKyA0KSwgU0VFUV9CVUZGRVIpOworCW91dHcoIFNFRVFQS1RIX1hNSVQgfCBTRUVRUEtUSF9EQVRBX0ZPTExPV1MgfCBTRUVRUEtUSF9YTUlUX0lOVF9FTiwgU0VFUV9CVUZGRVIgKTsKKwkKKwkvKiBibGF0IHRoZSBidWZmZXIgKi8KKwlvdXRzdyggU0VFUV9CVUZGRVIsIGJ1ZiwgKGxlbmd0aCArMSkgPj4gMSk7CisJLyogcGFyYW5vaWEgISEgKi8KKwlvdXR3KCAwLCBTRUVRX0JVRkZFUik7CisJb3V0dyggMCwgU0VFUV9CVUZGRVIpOworCQorCS8qIHNldCBhZGRyZXNzIG9mIHN0YXJ0IG9mIHRyYW5zbWl0IGNoYWluICovCisJb3V0dyggdHJhbnNtaXRfcHRyLCBTRUVRX1RQUik7CisJCisJLyogZHJhaW4gRklGTyAqLworCXRtcCA9IGppZmZpZXM7CisJd2hpbGUgKCAoKChzdGF0dXM9aW53KFNFRVFfU1RBVFVTKSkgJiBTRUVRU1RBVF9GSUZPX0VNUFRZKSA9PSAwKSAmJiAoamlmZmllcyAtIHRtcCA8IEhaKSkKKwkJbWIoKTsKKwkKKwkvKiBkb2l0ICEgKi8KKwlvdXR3KCBTRUVRQ01EX1dJTkRPV19JTlRfQUNLIHwgU0VFUUNNRF9TRVRfVFhfT04gfCAoc3RhdHVzICYgU0VFUUNNRF9JTlRfTUFTSyksIFNFRVFfQ01EKTsKKwkKK30KKworCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3NlZXE7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIlNFRVEgODAwNSBJL08gYmFzZSBhZGRyZXNzIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIlNFRVEgODAwNSBJUlEgbnVtYmVyIik7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWRldl9zZWVxID0gc2VlcTgwMDVfcHJvYmUoLTEpOworCWlmIChJU19FUlIoZGV2X3NlZXEpKQorCQlyZXR1cm4gUFRSX0VSUihkZXZfc2VlcSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfc2VlcSk7CisJcmVsZWFzZV9yZWdpb24oZGV2X3NlZXEtPmJhc2VfYWRkciwgU0VFUTgwMDVfSU9fRVhURU5UKTsKKwlmcmVlX25ldGRldihkZXZfc2VlcSk7Cit9CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSS91c3Ivc3JjL2xpbnV4L25ldC9pbmV0IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1tNDg2IC1jIHNrZWxldG9uLmMiCisgKiAgdmVyc2lvbi1jb250cm9sOiB0CisgKiAga2VwdC1uZXctdmVyc2lvbnM6IDUKKyAqICB0YWItd2lkdGg6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2VlcTgwMDUuaCBiL2RyaXZlcnMvbmV0L3NlZXE4MDA1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5YmE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NlZXE4MDA1LmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qIAorICogZGVmaW5lcywgZXRjIGZvciB0aGUgc2VlcTgwMDUKKyAqLworIAorLyoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciBHUEwuCisgKgorICogVGhpcyBzdHlsZSBhbmQgbGF5b3V0IG9mIHRoaXMgZmlsZSBpcyBhbHNvIGNvcGllZAorICogZnJvbSBtYW55IG9mIHRoZSBvdGhlciBsaW51eCBuZXR3b3JrIGRldmljZSBkcml2ZXJzLgorICovCisKKy8qIFRoZSBudW1iZXIgb2YgbG93IEkvTyBwb3J0cyB1c2VkIGJ5IHRoZSBldGhlcmNhcmQuICovCisjZGVmaW5lIFNFRVE4MDA1X0lPX0VYVEVOVAkxNgorCisjZGVmaW5lIFNFRVFfQgkJKGlvYWRkcikKKworI2RlZmluZQlTRUVRX0NNRAkoU0VFUV9CKQkJLyogV3JpdGUgb25seSAqLworI2RlZmluZQlTRUVRX1NUQVRVUwkoU0VFUV9CKQkJLyogUmVhZCBvbmx5ICovCisjZGVmaW5lIFNFRVFfQ0ZHMQkoU0VFUV9CICsgMikKKyNkZWZpbmUgU0VFUV9DRkcyCShTRUVRX0IgKyA0KQorI2RlZmluZQlTRUVRX1JFQQkoU0VFUV9CICsgNikJCS8qIFJlY2VpdmUgRW5kIEFyZWEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0VFUV9SUFIJKFNFRVFfQiArIDEwKQkJLyogUmVjZWl2ZSBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNFRVFfVFBSCShTRUVRX0IgKyAxMikJCS8qIFRyYW5zbWl0IFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU0VFUV9ETUFBUgkoU0VFUV9CICsgMTQpCQkvKiBETUEgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBTRUVRX0JVRkZFUgkoU0VFUV9CICsgOCkJCS8qIEJ1ZmZlciBXaW5kb3cgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlERUZBVUxUX1RFQQkoMHgzZikKKworI2RlZmluZSBTRUVRQ01EX0RNQV9JTlRfRU4JKDB4MDAwMSkJLyogRE1BIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgU0VFUUNNRF9SWF9JTlRfRU4JKDB4MDAwMikJLyogUmVjZWl2ZSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFNFRVFDTURfVFhfSU5UX0VOCSgweDAwMDQpCS8qIFRyYW5zbWl0IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgU0VFUUNNRF9XSU5ET1dfSU5UX0VOCSgweDAwMDgpCS8qIFdoYXQgdGhlIGhlbGwgaXMgdGhpcyBmb3I/PyAqLworI2RlZmluZSBTRUVRQ01EX0lOVF9NQVNLCSgweDAwMGYpCisKKyNkZWZpbmUgU0VFUUNNRF9ETUFfSU5UX0FDSwkoMHgwMDEwKQkvKiBETUEgYWNrICovCisjZGVmaW5lIFNFRVFDTURfUlhfSU5UX0FDSwkoMHgwMDIwKQorI2RlZmluZSBTRUVRQ01EX1RYX0lOVF9BQ0sJKDB4MDA0MCkKKyNkZWZpbmUJU0VFUUNNRF9XSU5ET1dfSU5UX0FDSwkoMHgwMDgwKQorI2RlZmluZSBTRUVRQ01EX0FDS19BTEwJCSgweDAwZjApCisKKyNkZWZpbmUgU0VFUUNNRF9TRVRfRE1BX09OCSgweDAxMDApCS8qIEVuYWJsZXMgRE1BIFJlcXVlc3QgbG9naWMgKi8KKyNkZWZpbmUgU0VFUUNNRF9TRVRfUlhfT04JKDB4MDIwMCkJLyogRW5hYmxlcyBQYWNrZXQgUlggKi8KKyNkZWZpbmUgU0VFUUNNRF9TRVRfVFhfT04JKDB4MDQwMCkJLyogU3RhcnRzIFRYIHJ1biAqLworI2RlZmluZSBTRUVRQ01EX1NFVF9ETUFfT0ZGCSgweDA4MDApCisjZGVmaW5lIFNFRVFDTURfU0VUX1JYX09GRgkoMHgxMDAwKQorI2RlZmluZSBTRUVRQ01EX1NFVF9UWF9PRkYJKDB4MjAwMCkKKyNkZWZpbmUgU0VFUUNNRF9TRVRfQUxMX09GRgkoMHgzODAwKQkvKiBzZXQgYWxsIGxvZ2ljIG9mZiAqLworCisjZGVmaW5lIFNFRVFDTURfRklGT19SRUFECSgweDQwMDApCS8qIFNldCBGSUZPIHRvIHJlYWQgbW9kZSAocmVhZCBmcm9tIEJ1ZmZlcikgKi8KKyNkZWZpbmUgU0VFUUNNRF9GSUZPX1dSSVRFCSgweDgwMDApCS8qIFNldCBGSUZPIHRvIHdyaXRlIG1vZGUgKi8KKworI2RlZmluZSBTRUVRU1RBVF9ETUFfSU5UX0VOCSgweDAwMDEpCS8qIFN0YXR1cyBvZiBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFNFRVFTVEFUX1JYX0lOVF9FTgkoMHgwMDAyKQorI2RlZmluZSBTRUVRU1RBVF9UWF9JTlRfRU4JKDB4MDAwNCkKKyNkZWZpbmUgU0VFUVNUQVRfV0lORE9XX0lOVF9FTgkoMHgwMDA4KQorCisjZGVmaW5lCVNFRVFTVEFUX0RNQV9JTlQJKDB4MDAxMCkJLyogSW50ZXJydXB0IGZsYWdnZWQgKi8KKyNkZWZpbmUgU0VFUVNUQVRfUlhfSU5UCQkoMHgwMDIwKQorI2RlZmluZSBTRUVRU1RBVF9UWF9JTlQJCSgweDAwNDApCisjZGVmaW5lCVNFRVFTVEFUX1dJTkRPV19JTlQJKDB4MDA4MCkKKyNkZWZpbmUgU0VFUVNUQVRfQU5ZX0lOVAkoMHgwMGYwKQorCisjZGVmaW5lIFNFRVFTVEFUX0RNQV9PTgkJKDB4MDEwMCkJLyogRE1BIGxvZ2ljIG9uICovCisjZGVmaW5lIFNFRVFTVEFUX1JYX09OCQkoMHgwMjAwKQkvKiBQYWNrZXQgUlggb24gKi8KKyNkZWZpbmUgU0VFUVNUQVRfVFhfT04JCSgweDA0MDApCS8qIFRYIHJ1bm5pbmcgKi8KKworI2RlZmluZSBTRUVRU1RBVF9GSUZPX0ZVTEwJKDB4MjAwMCkKKyNkZWZpbmUgU0VFUVNUQVRfRklGT19FTVBUWQkoMHg0MDAwKQorI2RlZmluZSBTRUVRU1RBVF9GSUZPX0RJUgkoMHg4MDAwKQkvKiAxPXJlYWQsIDA9d3JpdGUgKi8KKworI2RlZmluZSBTRUVRQ0ZHMV9CVUZGRVJfTUFTSwkoMHgwMDBmKQkvKiBkZWZpbmUgd2hhdCBtYXBzIGludG8gdGhlIEJVRkZFUiByZWdpc3RlciAqLworI2RlZmluZSBTRUVRQ0ZHMV9CVUZGRVJfTUFDMAkoMHgwMDAwKQkvKiBNQUMgc3RhdGlvbiBhZGRyZXNzZXMgMC01ICovCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9NQUMxCSgweDAwMDEpCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9NQUMyCSgweDAwMDIpCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9NQUMzCSgweDAwMDMpCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9NQUM0CSgweDAwMDQpCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9NQUM1CSgweDAwMDUpCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9QUk9NCSgweDAwMDYpCS8qIFRoZSBBZGRyZXNzL0NGRyBQUk9NICovCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9URUEJKDB4MDAwNykJLyogVHJhbnNtaXQgZW5kIGFyZWEgKi8KKyNkZWZpbmUgU0VFUUNGRzFfQlVGRkVSX0JVRkZFUgkoMHgwMDA4KQkvKiBQYWNrZXQgYnVmZmVyIG1lbW9yeSAqLworI2RlZmluZSBTRUVRQ0ZHMV9CVUZGRVJfSU5UX1ZFQwkoMHgwMDA5KQkvKiBJbnRlcnJ1cHQgVmVjdG9yICovCisKKyNkZWZpbmUgU0VFUUNGRzFfRE1BX0lOVFZMX01BU0sJKDB4MDAzMCkKKyNkZWZpbmUgU0VFUUNGRzFfRE1BX0NPTlQJKDB4MDAwMCkKKyNkZWZpbmUgU0VFUUNGRzFfRE1BXzgwMG5zCSgweDAwMTApCisjZGVmaW5lIFNFRVFDRkcxX0RNQV8xNjAwbnMJKDB4MDAyMCkKKyNkZWZpbmUgU0VFUUNGRzFfRE1BXzMyMDBucwkoMHgwMDMwKQorCisjZGVmaW5lIFNFRVFDRkcxX0RNQV9MRU5fTUFTSwkoMHgwMGMwKQorI2RlZmluZSBTRUVRQ0ZHMV9ETUFfTEVOMQkoMHgwMDAwKQorI2RlZmluZSBTRUVRQ0ZHMV9ETUFfTEVOMgkoMHgwMDQwKQorI2RlZmluZSBTRUVRQ0ZHMV9ETUFfTEVONAkoMHgwMDgwKQorI2RlZmluZSBTRUVRQ0ZHMV9ETUFfTEVOOAkoMHgwMGMwKQorCisjZGVmaW5lIFNFRVFDRkcxX01BQ19NQVNLCSgweDNmMDApCS8qIERpcy9lbmFibGUgYml0cyBmb3IgTUFDIGFkZHJlc3NlcyAqLworI2RlZmluZSBTRUVRQ0ZHMV9NQUMwX0VOCSgweDAxMDApCisjZGVmaW5lIFNFRVFDRkcxX01BQzFfRU4JKDB4MDIwMCkKKyNkZWZpbmUgU0VFUUNGRzFfTUFDMl9FTgkoMHgwNDAwKQorI2RlZmluZSBTRUVRQ0ZHMV9NQUMzX0VOCSgweDA4MDApCisjZGVmaW5lCVNFRVFDRkcxX01BQzRfRU4JKDB4MTAwMCkKKyNkZWZpbmUgU0VFUUNGRzFfTUFDNV9FTgkoMHgyMDAwKQorCisjZGVmaW5lCVNFRVFDRkcxX01BVENIX01BU0sJKDB4YzAwMCkJLyogUGFja2V0IG1hdGNoaW5nIGxvZ2ljIGNmZyBiaXRzICovCisjZGVmaW5lIFNFRVFDRkcxX01BVENIX1NQRUNJRklDCSgweDAwMDApCS8qIG9ubHkgbWF0Y2hpbmcgTUFDIGFkZHJlc3NlcyAqLworI2RlZmluZSBTRUVRQ0ZHMV9NQVRDSF9CUk9BRAkoMHg0MDAwKQkvKiBtYXRjaGluZyBhbmQgYnJvYWRjYXN0IGFkZHJlc3NlcyAqLworI2RlZmluZSBTRUVRQ0ZHMV9NQVRDSF9NVUxUSQkoMHg4MDAwKQkvKiBtYXRjaGluZywgYnJvYWRjYXN0IGFuZCBtdWx0aWNhc3QgKi8KKyNkZWZpbmUgU0VFUUNGRzFfTUFUQ0hfQUxMCSgweGMwMDApCS8qIFByb21pc2N1b3VzIG1vZGUgKi8KKworI2RlZmluZSBTRUVRQ0ZHMV9ERUZBVUxUCShTRUVRQ0ZHMV9CVUZGRVJfQlVGRkVSIHwgU0VFUUNGRzFfTUFDMF9FTiB8IFNFRVFDRkcxX01BVENIX0JST0FEKQorCisjZGVmaW5lIFNFRVFDRkcyX0JZVEVfU1dBUAkoMHgwMDAxKQkvKiAwPUludGVsIGJ5dGUtb3JkZXIgKi8KKyNkZWZpbmUgU0VFUUNGRzJfQVVUT19SRUEJKDB4MDAwMikJLyogaWYgc2V0LCBSZWNlaXZlIEVuZCBBcmVhIHdpbGwgYmUgdXBkYXRlZCB3aGVuIHJlYWRpbmcgZnJvbSBCdWZmZXIgKi8KKworI2RlZmluZSBTRUVRQ0ZHMl9DUkNfRVJSX0VOCSgweDAwMDgpCS8qIGVuYWJsZXMgcmVjZWl2aW5nIG9mIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzICovCisjZGVmaW5lIFNFRVFDRkcyX0RSSUJCTEVfRU4JKDB4MDAxMCkJLyogZW5hYmxlcyByZWNlaXZpbmcgb2Ygbm9uLWFsaWduZWQgcGFja2V0cyAqLworI2RlZmluZSBTRUVRQ0ZHMl9TSE9SVF9FTgkoMHgwMDIwKQkvKiBlbmFibGVzIHJlY2VpdmluZyBvZiBzaG9ydCBwYWNrZXRzICovCisKKyNkZWZpbmUJU0VFUUNGRzJfU0xPVFNFTAkoMHgwMDQwKQkvKiAwPSBzdGFuZGFyZCBJRUVFODAyLjMsIDE9IHNtYWxsZXIsZmFzdGVyLCBub24tc3RhbmRhcmQgKi8KKyNkZWZpbmUgU0VFUUNGRzJfTk9fUFJFQU0JKDB4MDA4MCkJLyogMT0gdXNlciBzdXBwbGllcyBYbWl0IHByZWFtYmxlIGJ5dGVzICovCisjZGVmaW5lIFNFRVFDRkcyX0FERFJfTEVOCSgweDAxMDApCS8qIDE9IDJieXRlIGFkZHJlc3NlcyAqLworI2RlZmluZSBTRUVRQ0ZHMl9SRUNfQ1JDCSgweDAyMDApCS8qIDA9IHJlY2VpdmVkIHBhY2tldHMgd2lsbCBoYXZlIENSQyBzdHJpcHBlZCBmcm9tIHRoZW0gKi8KKyNkZWZpbmUgU0VFUUNGRzJfWE1JVF9OT19DUkMJKDB4MDQwMCkJLyogZG9uJ3QgeG1pdCBDUkMgd2l0aCBlYWNoIHBhY2tldCAodXNlciBzdXBwbGllcyBpdCkgKi8KKyNkZWZpbmUgU0VFUUNGRzJfTE9PUEJBQ0sJKDB4MDgwMCkKKyNkZWZpbmUgU0VFUUNGRzJfQ1RSTE8JCSgweDEwMDApCisjZGVmaW5lIFNFRVFDRkcyX1JFU0VUCQkoMHg4MDAwKQkvKiBzb2Z0d2FyZSBIYXJkLXJlc2V0IGJpdCAqLworCitzdHJ1Y3Qgc2VlcV9wa3RfaGRyIHsKKwl1bnNpZ25lZCBzaG9ydAluZXh0OwkJCS8qIGFkZHJlc3Mgb2YgbmV4dCBwYWNrZXQgaGVhZGVyICovCisJdW5zaWduZWQgY2hhcgliYWJibGVfaW50OjEsCQkvKiBlbmFibGUgaW50IG9uID4xNTE0IGJ5dGUgcGFja2V0ICovCisJCQljb2xsX2ludDoxLAkJLyogZW5hYmxlIGludCBvbiBjb2xsaXNpb24gKi8KKwkJCWNvbGxfMTZfaW50OjEsCQkvKiBlbmFibGUgaW50IG9uID4xNSBjb2xsaXNpb24gKi8KKwkJCXhtaXRfaW50OjEsCQkvKiBlbmFibGUgaW50IG9uIHN1Y2Nlc3MgKG9yIHhtaXQgd2l0aCA8MTUgY29sbGlzaW9uKSAqLworCQkJdW51c2VkOjEsCisJCQlkYXRhX2ZvbGxvd3M6MSwJCS8qIGlmIG5vdCBzZXQsIHByb2Nlc3MgdGhpcyBhcyBhIGhlYWRlciBhbmQgcG9pbnRlciBvbmx5ICovCisJCQljaGFpbl9jb250OjEsCQkvKiBpZiBzZXQsIG1vcmUgaGVhZGVycyBpbiBjaGFpbiAJCW9ubHkgY21kIGJpdCB2YWxpZCBpbiByZWN2IGhlYWRlciAqLworCQkJeG1pdF9yZWN2OjE7CQkvKiBpZiBzZXQsIGEgeG1pdCBwYWNrZXQsIGVsc2UgYSByZWNlaXZlIHBhY2tldC4qLworCXVuc2lnbmVkIGNoYXIJc3RhdHVzOworfTsKKworI2RlZmluZSBTRUVRUEtUSF9CQUJfSU5UX0VOCSgweDAxKQkJLyogeG1pdCBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RIX0NPTF9JTlRfRU4JKDB4MDIpCQkvKiB4bWl0IG9ubHkgKi8KKyNkZWZpbmUgU0VFUVBLVEhfQ09MMTZfSU5UX0VOCSgweDA0KQkJLyogeG1pdCBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RIX1hNSVRfSU5UX0VOCSgweDA4KQkJLyogeG1pdCBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RIX0RBVEFfRk9MTE9XUwkoMHgyMCkJCS8qIHN1cHBvc2VkbHkgaW4geG1pdCBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RIX0NIQUlOCQkoMHg0MCkJCS8qIG1vcmUgaGVhZGVycyBmb2xsb3cgKi8KKyNkZWZpbmUgU0VFUVBLVEhfWE1JVAkJKDB4ODApCisKKyNkZWZpbmUgU0VFUVBLVFNfQkFCQkxFCQkoMHgwMTAwKQkvKiB4bWl0IG9ubHkgKi8KKyNkZWZpbmUgU0VFUVBLVFNfT1ZFUlNJWkUJKDB4MDEwMCkJLyogcmVjdiBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RTX0NPTExJU0lPTgkoMHgwMjAwKQkvKiB4bWl0IG9ubHkgKi8KKyNkZWZpbmUgU0VFUVBLVFNfQ1JDX0VSUgkoMHgwMjAwKQkvKiByZWN2IG9ubHkgKi8KKyNkZWZpbmUgU0VFUVBLVFNfQ09MTDE2CQkoMHgwNDAwKQkvKiB4bWl0IG9ubHkgKi8KKyNkZWZpbmUgU0VFUVBLVFNfRFJJQgkJKDB4MDQwMCkJLyogcmVjdiBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RTX1NIT1JUCQkoMHgwODAwKQkvKiByZWN2IG9ubHkgKi8KKyNkZWZpbmUgU0VFUVBLVFNfRE9ORQkJKDB4ODAwMCkKKyNkZWZpbmUgU0VFUVBLVFNfQU5ZX0VSUk9SCSgweDBmMDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZ2lzZWVxLmMgYi9kcml2ZXJzL25ldC9zZ2lzZWVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjM2IxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NnaXNlZXEuYwpAQCAtMCwwICsxLDc3MyBAQAorLyoKKyAqIHNnaXNlZXEuYzogU2VlcTgwMDMgZXRoZXJuZXQgZHJpdmVyIGZvciBTR0kgbWFjaGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IERhdmlkIFMuIE1pbGxlciAoZG1AZW5nci5zZ2kuY29tKQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvaHBjMy5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvaXAyMi5oPgorI2luY2x1ZGUgPGFzbS9zZ2lhbGliLmg+CisKKyNpbmNsdWRlICJzZ2lzZWVxLmgiCisKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0gInNnaXNlZXEuYzogRGF2aWQgUy4gTWlsbGVyIChkbUBlbmdyLnNnaS5jb20pXG4iOworCitzdGF0aWMgY2hhciAqc2dpc2VlcXN0ciA9ICJTR0kgU2VlcTgwMDMiOworCisvKgorICogSWYgeW91IHdhbnQgc3BlZWQsIHlvdSBkbyBzb21ldGhpbmcgc2lsbHksIGl0IGFsd2F5cyBoYXMgd29ya2VkIGZvciBtZS4gIFNvLAorICogd2l0aCB0aGF0IGluIG1pbmQsIEkndmUgZGVjaWRlZCB0byBtYWtlIHRoaXMgZHJpdmVyIGxvb2sgY29tcGxldGVseSBsaWtlIGEKKyAqIHN0dXBpZCBMYW5jZSBmcm9tIGEgZHJpdmVyIGFyY2hpdGVjdHVyZSBwZXJzcGVjdGl2ZS4gIE9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0CisgKiBoZXJlIG91ciAicmluZyBidWZmZXIiIGxvb2tzIGFuZCBhY3RzIGxpa2UgYSByZWFsIExhbmNlIG9uZSBkb2VzIGJ1dCBpcworICogbGF5ZWQgb3V0IGxpa2UgaG93IHRoZSBIUEMgRE1BIGFuZCB0aGUgU2VlcSB3YW50IGl0IHRvLiAgWW91J2QgYmUgc3VycHJpc2VkCisgKiBob3cgYSBzdHVwaWQgaWRlYSBsaWtlIHRoaXMgY2FuIHBheSBvZmYgaW4gcGVyZm9ybWFuY2UsIG5vdCB0byBtZW50aW9uCisgKiBtYWtpbmcgdGhpcyBkcml2ZXIgMiwwMDAgdGltZXMgZWFzaWVyIHRvIHdyaXRlLiA7LSkKKyAqLworCisvKiBUdW5lIHRoZXNlIGlmIHdlIHRlbmQgdG8gcnVuIG91dCBvZnRlbiBldGMuICovCisjZGVmaW5lIFNFRVFfUlhfQlVGRkVSUyAgMTYKKyNkZWZpbmUgU0VFUV9UWF9CVUZGRVJTICAxNgorCisjZGVmaW5lIFBLVF9CVUZfU1ogICAgICAgMTU4NAorCisjZGVmaW5lIE5FWFRfUlgoaSkgICgoKGkpICsgMSkgJiAoU0VFUV9SWF9CVUZGRVJTIC0gMSkpCisjZGVmaW5lIE5FWFRfVFgoaSkgICgoKGkpICsgMSkgJiAoU0VFUV9UWF9CVUZGRVJTIC0gMSkpCisjZGVmaW5lIFBSRVZfUlgoaSkgICgoKGkpIC0gMSkgJiAoU0VFUV9SWF9CVUZGRVJTIC0gMSkpCisjZGVmaW5lIFBSRVZfVFgoaSkgICgoKGkpIC0gMSkgJiAoU0VFUV9UWF9CVUZGRVJTIC0gMSkpCisKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwoc3ApICgoc3AtPnR4X29sZCA8PSBzcC0+dHhfbmV3KSA/IFwKKwkJCSAgICBzcC0+dHhfb2xkICsgKFNFRVFfVFhfQlVGRkVSUyAtIDEpIC0gc3AtPnR4X25ldyA6IFwKKwkJCSAgICBzcC0+dHhfb2xkIC0gc3AtPnR4X25ldyAtIDEpCisKKyNkZWZpbmUgREVCVUcKKworc3RydWN0IHNnaXNlZXFfcnhfZGVzYyB7CisJdm9sYXRpbGUgc3RydWN0IGhwY19kbWFfZGVzYyByZG1hOworCXZvbGF0aWxlIHNpZ25lZCBpbnQgYnVmX3ZhZGRyOworfTsKKworc3RydWN0IHNnaXNlZXFfdHhfZGVzYyB7CisJdm9sYXRpbGUgc3RydWN0IGhwY19kbWFfZGVzYyB0ZG1hOworCXZvbGF0aWxlIHNpZ25lZCBpbnQgYnVmX3ZhZGRyOworfTsKKworLyoKKyAqIFdhcm5pbmc6IFRoaXMgc3RydWN0dXJlIGlzIGxheWVkIG91dCBpbiBhIGNlcnRhaW4gd2F5IGJlY2F1c2UgSFBDIGRtYQorICogICAgICAgICAgZGVzY3JpcHRvcnMgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIFNvIGRvbid0IHRvdWNoIHRoaXMgd2l0aG91dAorICogICAgICAgICAgc29tZSBjYXJlLgorICovCitzdHJ1Y3Qgc2dpc2VlcV9pbml0X2Jsb2NrIHsgLyogTm90ZSB0aGUgbmFtZSA7LSkgKi8KKwlzdHJ1Y3Qgc2dpc2VlcV9yeF9kZXNjIHJ4dmVjdG9yW1NFRVFfUlhfQlVGRkVSU107CisJc3RydWN0IHNnaXNlZXFfdHhfZGVzYyB0eHZlY3RvcltTRUVRX1RYX0JVRkZFUlNdOworfTsKKworc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSB7CisJc3RydWN0IHNnaXNlZXFfaW5pdF9ibG9jayAqc3JpbmdzOworCisJLyogUHRycyB0byB0aGUgZGVzY3JpcHRvcnMgaW4gdW5jYWNoZWQgc3BhY2UuICovCisJc3RydWN0IHNnaXNlZXFfcnhfZGVzYyAqcnhfZGVzYzsKKwlzdHJ1Y3Qgc2dpc2VlcV90eF9kZXNjICp0eF9kZXNjOworCisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgaHBjM19ldGhyZWdzICpocmVnczsKKwlzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVnczsKKworCS8qIFJpbmcgZW50cnkgY291bnRlcnMuICovCisJdW5zaWduZWQgaW50IHJ4X25ldywgdHhfbmV3OworCXVuc2lnbmVkIGludCByeF9vbGQsIHR4X29sZDsKKworCWludCBpc19lZGxjOworCXVuc2lnbmVkIGNoYXIgY29udHJvbDsKKwl1bnNpZ25lZCBjaGFyIG1vZGU7CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X21vZHVsZTsKKwlzcGlubG9ja190IHR4X2xvY2s7Cit9OworCisvKiBBIGxpc3Qgb2YgYWxsIGluc3RhbGxlZCBzZWVxIGRldmljZXMsIGZvciByZW1vdmluZyB0aGUgZHJpdmVyIG1vZHVsZS4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcm9vdF9zZ2lzZWVxX2RldjsKKworc3RhdGljIGlubGluZSB2b2lkIGhwYzNfZXRoX3Jlc2V0KHN0cnVjdCBocGMzX2V0aHJlZ3MgKmhyZWdzKQoreworCWhyZWdzLT5yeF9yZXNldCA9IEhQQzNfRVJYUlNUX0NSRVNFVCB8IEhQQzNfRVJYUlNUX0NMUklSUTsKKwl1ZGVsYXkoMjApOworCWhyZWdzLT5yeF9yZXNldCA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNldF9ocGMzX2FuZF9zZWVxKHN0cnVjdCBocGMzX2V0aHJlZ3MgKmhyZWdzLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncykKK3sKKwlocmVncy0+cnhfY3RybCA9IGhyZWdzLT50eF9jdHJsID0gMDsKKwlocGMzX2V0aF9yZXNldChocmVncyk7Cit9CisKKyNkZWZpbmUgUlNUQVRfR09fQklUUyAoU0VFUV9SQ01EX0lHT09EIHwgU0VFUV9SQ01EX0lFT0YgfCBTRUVRX1JDTURfSVNIT1JUIHwgXAorCQkgICAgICAgU0VFUV9SQ01EX0lEUklCIHwgU0VFUV9SQ01EX0lDUkMpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWVxX2dvKHN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwLAorCQkJICAgc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3MsCisJCQkgICBzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncykKK3sKKwlzcmVncy0+cnN0YXQgPSBzcC0+bW9kZSB8IFJTVEFUX0dPX0JJVFM7CisJaHJlZ3MtPnJ4X2N0cmwgPSBIUEMzX0VSWENUUkxfQUNUSVZFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19zZ2lzZWVxX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncyA9IHNwLT5zcmVnczsKKwlpbnQgaTsKKworCXNyZWdzLT50c3RhdCA9IFNFRVFfVENNRF9SQjA7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJc3JlZ3MtPnJ3LmV0aF9hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKK30KKworc3RhdGljIGludCBzZ2lzZWVxX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gYWRkcjsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBzYS0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisKKwlzcGluX2xvY2tfaXJxKCZzcC0+dHhfbG9jayk7CisJX19zZ2lzZWVxX3NldF9tYWNfYWRkcmVzcyhkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmc3AtPnR4X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVENOVElORk9fSU5JVCAoSFBDRE1BX0VPWCB8IEhQQ0RNQV9FVFhEKQorI2RlZmluZSBSQ05UQ0ZHX0lOSVQgIChIUENETUFfT1dOIHwgSFBDRE1BX0VPUlAgfCBIUENETUFfWElFKQorI2RlZmluZSBSQ05USU5GT19JTklUIChSQ05UQ0ZHX0lOSVQgfCAoUEtUX0JVRl9TWiAmIEhQQ0RNQV9CQ05UKSkKKworc3RhdGljIGludCBzZWVxX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzcC0+cnhfbmV3ID0gc3AtPnR4X25ldyA9IDA7CisJc3AtPnJ4X29sZCA9IHNwLT50eF9vbGQgPSAwOworCisJX19zZ2lzZWVxX3NldF9tYWNfYWRkcmVzcyhkZXYpOworCisJLyogU2V0dXAgdHggcmluZy4gKi8KKwlmb3IoaSA9IDA7IGkgPCBTRUVRX1RYX0JVRkZFUlM7IGkrKykgeworCQlpZiAoIXNwLT50eF9kZXNjW2ldLnRkbWEucGJ1ZikgeworCQkJdW5zaWduZWQgbG9uZyBidWZmZXI7CisKKwkJCWJ1ZmZlciA9ICh1bnNpZ25lZCBsb25nKSBrbWFsbG9jKFBLVF9CVUZfU1osIEdGUF9LRVJORUwpOworCQkJaWYgKCFidWZmZXIpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlzcC0+dHhfZGVzY1tpXS5idWZfdmFkZHIgPSBDS1NFRzFBRERSKGJ1ZmZlcik7CisJCQlzcC0+dHhfZGVzY1tpXS50ZG1hLnBidWYgPSBDUEhZU0FERFIoYnVmZmVyKTsKKwkJfQorCQlzcC0+dHhfZGVzY1tpXS50ZG1hLmNudGluZm8gPSBUQ05USU5GT19JTklUOworCX0KKworCS8qIEFuZCBub3cgdGhlIHJ4IHJpbmcuICovCisJZm9yIChpID0gMDsgaSA8IFNFRVFfUlhfQlVGRkVSUzsgaSsrKSB7CisJCWlmICghc3AtPnJ4X2Rlc2NbaV0ucmRtYS5wYnVmKSB7CisJCQl1bnNpZ25lZCBsb25nIGJ1ZmZlcjsKKworCQkJYnVmZmVyID0gKHVuc2lnbmVkIGxvbmcpIGttYWxsb2MoUEtUX0JVRl9TWiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWJ1ZmZlcikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCXNwLT5yeF9kZXNjW2ldLmJ1Zl92YWRkciA9IENLU0VHMUFERFIoYnVmZmVyKTsKKwkJCXNwLT5yeF9kZXNjW2ldLnJkbWEucGJ1ZiA9IENQSFlTQUREUihidWZmZXIpOworCQl9CisJCXNwLT5yeF9kZXNjW2ldLnJkbWEuY250aW5mbyA9IFJDTlRJTkZPX0lOSVQ7CisJfQorCXNwLT5yeF9kZXNjW2kgLSAxXS5yZG1hLmNudGluZm8gfD0gSFBDRE1BX0VPUjsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERFQlVHCitzdGF0aWMgc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqZ3ByaXY7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmdkZXY7CisKK3ZvaWQgc2dpc2VlcV9kdW1wX3JpbmdzKHZvaWQpCit7CisJc3RhdGljIGludCBvbmNlOworCXN0cnVjdCBzZ2lzZWVxX3J4X2Rlc2MgKnIgPSBncHJpdi0+cnhfZGVzYzsKKwlzdHJ1Y3Qgc2dpc2VlcV90eF9kZXNjICp0ID0gZ3ByaXYtPnR4X2Rlc2M7CisJc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3MgPSBncHJpdi0+aHJlZ3M7CisJaW50IGk7CisKKwlpZiAob25jZSkKKwkJcmV0dXJuOworCW9uY2UrKzsKKwlwcmludGsoIlJJTkcgRFVNUDpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBTRUVRX1JYX0JVRkZFUlM7IGkrKykgeworCQlwcmludGsoIlJYIFslZF06IEAoJXApIFslMDh4LCUwOHgsJTA4eF0gIiwKKwkJICAgICAgIGksICgmcltpXSksIHJbaV0ucmRtYS5wYnVmLCByW2ldLnJkbWEuY250aW5mbywKKwkJICAgICAgIHJbaV0ucmRtYS5wbmV4dCk7CisJCWkgKz0gMTsKKwkJcHJpbnRrKCItLSBbJWRdOiBAKCVwKSBbJTA4eCwlMDh4LCUwOHhdXG4iLAorCQkgICAgICAgaSwgKCZyW2ldKSwgcltpXS5yZG1hLnBidWYsIHJbaV0ucmRtYS5jbnRpbmZvLAorCQkgICAgICAgcltpXS5yZG1hLnBuZXh0KTsKKwl9CisJZm9yIChpID0gMDsgaSA8IFNFRVFfVFhfQlVGRkVSUzsgaSsrKSB7CisJCXByaW50aygiVFggWyVkXTogQCglcCkgWyUwOHgsJTA4eCwlMDh4XSAiLAorCQkgICAgICAgaSwgKCZ0W2ldKSwgdFtpXS50ZG1hLnBidWYsIHRbaV0udGRtYS5jbnRpbmZvLAorCQkgICAgICAgdFtpXS50ZG1hLnBuZXh0KTsKKwkJaSArPSAxOworCQlwcmludGsoIi0tIFslZF06IEAoJXApIFslMDh4LCUwOHgsJTA4eF1cbiIsCisJCSAgICAgICBpLCAoJnRbaV0pLCB0W2ldLnRkbWEucGJ1ZiwgdFtpXS50ZG1hLmNudGluZm8sCisJCSAgICAgICB0W2ldLnRkbWEucG5leHQpOworCX0KKwlwcmludGsoIklORk86IFtyeF9uZXcgPSAlZCByeF9vbGQ9JWRdIFt0eF9uZXcgPSAlZCB0eF9vbGQgPSAlZF1cbiIsCisJICAgICAgIGdwcml2LT5yeF9uZXcsIGdwcml2LT5yeF9vbGQsIGdwcml2LT50eF9uZXcsIGdwcml2LT50eF9vbGQpOworCXByaW50aygiUlJFR1M6IHJ4X2NicHRyWyUwOHhdIHJ4X25kcHRyWyUwOHhdIHJ4X2N0cmxbJTA4eF1cbiIsCisJICAgICAgIGhyZWdzLT5yeF9jYnB0ciwgaHJlZ3MtPnJ4X25kcHRyLCBocmVncy0+cnhfY3RybCk7CisJcHJpbnRrKCJUUkVHUzogdHhfY2JwdHJbJTA4eF0gdHhfbmRwdHJbJTA4eF0gdHhfY3RybFslMDh4XVxuIiwKKwkgICAgICAgaHJlZ3MtPnR4X2NicHRyLCBocmVncy0+dHhfbmRwdHIsIGhyZWdzLT50eF9jdHJsKTsKK30KKyNlbmRpZgorCisjZGVmaW5lIFRTVEFUX0lOSVRfU0VFUSAoU0VFUV9UQ01EX0lQVHxTRUVRX1RDTURfSTE2fFNFRVFfVENNRF9JQ3xTRUVRX1RDTURfSVVGKQorI2RlZmluZSBUU1RBVF9JTklUX0VETEMgKChUU1RBVF9JTklUX1NFRVEpIHwgU0VFUV9UQ01EX1JCMikKKyNkZWZpbmUgUkRNQUNGR19JTklUICAgIChIUEMzX0VSWERDRkdfRlJYREMgfCBIUEMzX0VSWERDRkdfRkVPUCB8IEhQQzNfRVJYRENGR19GSVJRKQorCitzdGF0aWMgaW50IGluaXRfc2VlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCwKKwkJICAgICBzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncykKK3sKKwlzdHJ1Y3QgaHBjM19ldGhyZWdzICpocmVncyA9IHNwLT5ocmVnczsKKwlpbnQgZXJyOworCisJcmVzZXRfaHBjM19hbmRfc2VlcShocmVncywgc3JlZ3MpOworCWVyciA9IHNlZXFfaW5pdF9yaW5nKGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIFNldHVwIHRvIGZpZWxkIHRoZSBwcm9wZXIgaW50ZXJydXB0IHR5cGVzLiAqLworCWlmIChzcC0+aXNfZWRsYykgeworCQlzcmVncy0+dHN0YXQgPSBUU1RBVF9JTklUX0VETEM7CisJCXNyZWdzLT5ydy53cmVncy5jb250cm9sID0gc3AtPmNvbnRyb2w7CisJCXNyZWdzLT5ydy53cmVncy5mcmFtZV9nYXAgPSAwOworCX0gZWxzZSB7CisJCXNyZWdzLT50c3RhdCA9IFRTVEFUX0lOSVRfU0VFUTsKKwl9CisKKwlocmVncy0+cnhfZGNvbmZpZyB8PSBSRE1BQ0ZHX0lOSVQ7CisKKwlocmVncy0+cnhfbmRwdHIgPSBDUEhZU0FERFIoc3AtPnJ4X2Rlc2MpOworCWhyZWdzLT50eF9uZHB0ciA9IENQSFlTQUREUihzcC0+dHhfZGVzYyk7CisKKwlzZWVxX2dvKHNwLCBocmVncywgc3JlZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVjb3JkX3J4X2Vycm9ycyhzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCwKKwkJCQkgICAgdW5zaWduZWQgY2hhciBzdGF0dXMpCit7CisJaWYgKHN0YXR1cyAmIFNFRVFfUlNUQVRfT1ZFUkYgfHwKKwkgICAgc3RhdHVzICYgU0VFUV9SU1RBVF9TRlJBTUUpCisJCXNwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBTRUVRX1JTVEFUX0NFUlJPUikKKwkJc3AtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgU0VFUV9SU1RBVF9ERVJST1IpCisJCXNwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgU0VFUV9SU1RBVF9SRU9GKQorCQlzcC0+c3RhdHMucnhfZXJyb3JzKys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByeF9tYXliZV9yZXN0YXJ0KHN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwLAorCQkJCSAgICBzdHJ1Y3QgaHBjM19ldGhyZWdzICpocmVncywKKwkJCQkgICAgc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3MpCit7CisJaWYgKCEoaHJlZ3MtPnJ4X2N0cmwgJiBIUEMzX0VSWENUUkxfQUNUSVZFKSkgeworCQlocmVncy0+cnhfbmRwdHIgPSBDUEhZU0FERFIoc3AtPnJ4X2Rlc2MgKyBzcC0+cnhfbmV3KTsKKwkJc2VlcV9nbyhzcCwgaHJlZ3MsIHNyZWdzKTsKKwl9Cit9CisKKyNkZWZpbmUgZm9yX2VhY2hfcngocmQsIHNwKSBmb3IoKHJkKSA9ICYoc3ApLT5yeF9kZXNjWyhzcCktPnJ4X25ld107IFwKKwkJCQkhKChyZCktPnJkbWEuY250aW5mbyAmIEhQQ0RNQV9PV04pOyBcCisJCQkJKHJkKSA9ICYoc3ApLT5yeF9kZXNjWyhzcCktPnJ4X25ld10pCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZ2lzZWVxX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwLAorCQkJICAgICAgc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3MsCisJCQkgICAgICBzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncykKK3sKKwlzdHJ1Y3Qgc2dpc2VlcV9yeF9kZXNjICpyZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gMDsKKwl1bnNpZ25lZCBjaGFyIHBrdF9zdGF0dXM7CisJdW5zaWduZWQgY2hhciAqcGt0X3BvaW50ZXIgPSAwOworCWludCBsZW4gPSAwOworCXVuc2lnbmVkIGludCBvcmlnX2VuZCA9IFBSRVZfUlgoc3AtPnJ4X25ldyk7CisKKwkvKiBTZXJ2aWNlIGV2ZXJ5IHJlY2VpdmVkIHBhY2tldC4gKi8KKwlmb3JfZWFjaF9yeChyZCwgc3ApIHsKKwkJbGVuID0gUEtUX0JVRl9TWiAtIChyZC0+cmRtYS5jbnRpbmZvICYgSFBDRE1BX0JDTlQpIC0gMzsKKwkJcGt0X3BvaW50ZXIgPSAodW5zaWduZWQgY2hhciAqKShsb25nKXJkLT5idWZfdmFkZHI7CisJCXBrdF9zdGF0dXMgPSBwa3RfcG9pbnRlcltsZW4gKyAyXTsKKworCQlpZiAocGt0X3N0YXR1cyAmIFNFRVFfUlNUQVRfRklHKSB7CisJCQkvKiBQYWNrZXQgaXMgT0suICovCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOworCisJCQlpZiAoc2tiKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJCQlza2JfcHV0KHNrYiwgbGVuKTsKKworCQkJCS8qIENvcHkgb3V0IG9mIGtzZWcxIHRvIGF2b2lkIHNpbGx5IGNhY2hlIGZsdXNoLiAqLworCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBwa3RfcG9pbnRlciArIDIsIGxlbiwgMCk7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCQkJCS8qIFdlIGRvbid0IHdhbnQgdG8gcmVjZWl2ZSBvdXIgb3duIHBhY2tldHMgKi8KKwkJCQlpZiAobWVtY21wKGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkgeworCQkJCQluZXRpZl9yeChza2IpOworCQkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCQlzcC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCQlzcC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFNpbGVudGx5IGRyb3AgbXkgb3duIHBhY2tldHMgKi8KKwkJCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXByaW50ayAoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQkJc3AtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlY29yZF9yeF9lcnJvcnMoc3AsIHBrdF9zdGF0dXMpOworCQl9CisKKwkJLyogUmV0dXJuIHRoZSBlbnRyeSB0byB0aGUgcmluZyBwb29sLiAqLworCQlyZC0+cmRtYS5jbnRpbmZvID0gUkNOVElORk9fSU5JVDsKKwkJc3AtPnJ4X25ldyA9IE5FWFRfUlgoc3AtPnJ4X25ldyk7CisJfQorCXNwLT5yeF9kZXNjW29yaWdfZW5kXS5yZG1hLmNudGluZm8gJj0gfihIUENETUFfRU9SKTsKKwlzcC0+cnhfZGVzY1tQUkVWX1JYKHNwLT5yeF9uZXcpXS5yZG1hLmNudGluZm8gfD0gSFBDRE1BX0VPUjsKKwlyeF9tYXliZV9yZXN0YXJ0KHNwLCBocmVncywgc3JlZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHhfbWF5YmVfcmVzZXRfY29sbGlzaW9ucyhzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCwKKwkJCQkJICAgICBzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncykKK3sKKwlpZiAoc3AtPmlzX2VkbGMpIHsKKwkJc3JlZ3MtPnJ3LndyZWdzLmNvbnRyb2wgPSBzcC0+Y29udHJvbCAmIH4oU0VFUV9DVFJMX1hDTlQpOworCQlzcmVncy0+cncud3JlZ3MuY29udHJvbCA9IHNwLT5jb250cm9sOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGtpY2tfdHgoc3RydWN0IHNnaXNlZXFfdHhfZGVzYyAqdGQsCisJCQkgICBzdHJ1Y3QgaHBjM19ldGhyZWdzICpocmVncykKK3sKKwkvKiBJZiB0aGUgSFBDIGFpbnQgZG9pbiBub3RoaW4sIGFuZCB0aGVyZSBhcmUgbW9yZSBwYWNrZXRzCisJICogd2l0aCBFVFhEIGNsZWFyZWQgYW5kIFhJVSBzZXQgd2UgbXVzdCBtYWtlIHZlcnkgY2VydGFpbgorCSAqIHRoYXQgd2UgcmVzdGFydCB0aGUgSFBDIGVsc2Ugd2UgcmlzayBsb2NraW5nIHVwIHRoZQorCSAqIGFkYXB0ZXIuICBUaGUgZm9sbG93aW5nIGNvZGUgaXMgb25seSBzYWZlIGlmZiB0aGUgSFBDRE1BCisJICogaXMgbm90IGFjdGl2ZSEKKwkgKi8KKwl3aGlsZSAoKHRkLT50ZG1hLmNudGluZm8gJiAoSFBDRE1BX1hJVSB8IEhQQ0RNQV9FVFhEKSkgPT0KKwkgICAgICAoSFBDRE1BX1hJVSB8IEhQQ0RNQV9FVFhEKSkKKwkJdGQgPSAoc3RydWN0IHNnaXNlZXFfdHhfZGVzYyAqKShsb25nKSBDS1NFRzFBRERSKHRkLT50ZG1hLnBuZXh0KTsKKwlpZiAodGQtPnRkbWEuY250aW5mbyAmIEhQQ0RNQV9YSVUpIHsKKwkJaHJlZ3MtPnR4X25kcHRyID0gQ1BIWVNBRERSKHRkKTsKKwkJaHJlZ3MtPnR4X2N0cmwgPSBIUEMzX0VUWENUUkxfQUNUSVZFOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHNnaXNlZXFfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3AsCisJCQkgICAgICBzdHJ1Y3QgaHBjM19ldGhyZWdzICpocmVncywKKwkJCSAgICAgIHN0cnVjdCBzZ2lzZWVxX3JlZ3MgKnNyZWdzKQoreworCXN0cnVjdCBzZ2lzZWVxX3R4X2Rlc2MgKnRkOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzID0gaHJlZ3MtPnR4X2N0cmw7CisJaW50IGo7CisKKwl0eF9tYXliZV9yZXNldF9jb2xsaXNpb25zKHNwLCBzcmVncyk7CisKKwlpZiAoIShzdGF0dXMgJiAoSFBDM19FVFhDVFJMX0FDVElWRSB8IFNFRVFfVFNUQVRfUFRSQU5TKSkpIHsKKwkJLyogT29wcywgSFBDIGRldGVjdGVkIHNvbWUgc29ydCBvZiBlcnJvci4gKi8KKwkJaWYgKHN0YXR1cyAmIFNFRVFfVFNUQVRfUjE2KQorCQkJc3AtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBTRUVRX1RTVEFUX1VGTE9XKQorCQkJc3AtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBTRUVRX1RTVEFUX0xDTFMpCisJCQlzcC0+c3RhdHMuY29sbGlzaW9ucysrOworCX0KKworCS8qIEFjayAnZW0uLi4gKi8KKwlmb3IgKGogPSBzcC0+dHhfb2xkOyBqICE9IHNwLT50eF9uZXc7IGogPSBORVhUX1RYKGopKSB7CisJCXRkID0gJnNwLT50eF9kZXNjW2pdOworCisJCWlmICghKHRkLT50ZG1hLmNudGluZm8gJiAoSFBDRE1BX1hJVSkpKQorCQkJYnJlYWs7CisJCWlmICghKHRkLT50ZG1hLmNudGluZm8gJiAoSFBDRE1BX0VUWEQpKSkgeworCQkJaWYgKCEoc3RhdHVzICYgSFBDM19FVFhDVFJMX0FDVElWRSkpIHsKKwkJCQlocmVncy0+dHhfbmRwdHIgPSBDUEhZU0FERFIodGQpOworCQkJCWhyZWdzLT50eF9jdHJsID0gSFBDM19FVFhDVFJMX0FDVElWRTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCXNwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXNwLT50eF9vbGQgPSBORVhUX1RYKHNwLT50eF9vbGQpOworCQl0ZC0+dGRtYS5jbnRpbmZvICY9IH4oSFBDRE1BX1hJVSB8IEhQQ0RNQV9YSUUpOworCQl0ZC0+dGRtYS5jbnRpbmZvIHw9IEhQQ0RNQV9FT1g7CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2dpc2VlcV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3MgPSBzcC0+aHJlZ3M7CisJc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3MgPSBzcC0+c3JlZ3M7CisKKwlzcGluX2xvY2soJnNwLT50eF9sb2NrKTsKKworCS8qIEFjayB0aGUgSVJRIGFuZCBzZXQgc29mdHdhcmUgc3RhdGUuICovCisJaHJlZ3MtPnJ4X3Jlc2V0ID0gSFBDM19FUlhSU1RfQ0xSSVJROworCisJLyogQWx3YXlzIGNoZWNrIGZvciByZWNlaXZlZCBwYWNrZXRzLiAqLworCXNnaXNlZXFfcngoZGV2LCBzcCwgaHJlZ3MsIHNyZWdzKTsKKworCS8qIE9ubHkgY2hlY2sgZm9yIHR4IGFja3MgaWYgd2UgaGF2ZSBzb21ldGhpbmcgcXVldWVkLiAqLworCWlmIChzcC0+dHhfb2xkICE9IHNwLT50eF9uZXcpCisJCXNnaXNlZXFfdHgoZGV2LCBzcCwgaHJlZ3MsIHNyZWdzKTsKKworCWlmICgoVFhfQlVGRlNfQVZBSUwoc3ApID4gMCkgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJc3Bpbl91bmxvY2soJnNwLT50eF9sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBzZ2lzZWVxX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3MgPSBzcC0+c3JlZ3M7CisJdW5zaWduZWQgaW50IGlycSA9IGRldi0+aXJxOworCWludCBlcnI7CisKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBzZ2lzZWVxX2ludGVycnVwdCwgMCwgc2dpc2VlcXN0ciwgZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNlZXE4MDAzOiBDYW4ndCBnZXQgaXJxICVkXG4iLCBkZXYtPmlycSk7CisJCWVyciA9IC1FQUdBSU47CisJfQorCisJZXJyID0gaW5pdF9zZWVxKGRldiwgc3AsIHNyZWdzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlX2lycTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfaXJxOgorCWZyZWVfaXJxKGlycSwgZGV2KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2dpc2VlcV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncyA9IHNwLT5zcmVnczsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIFNodXRkb3duIHRoZSBTZWVxLiAqLworCXJlc2V0X2hwYzNfYW5kX3NlZXEoc3AtPmhyZWdzLCBzcmVncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2dpc2VlcV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncyA9IHNwLT5zcmVnczsKKwlpbnQgZXJyOworCisJZXJyID0gaW5pdF9zZWVxKGRldiwgc3AsIHNyZWdzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2dpc2VlcV9teV9yZXNldCh2b2lkKQoreworCXByaW50aygiUkVTRVQhXG4iKTsKKwlzZ2lzZWVxX3Jlc2V0KGdkZXYpOworfQorCitzdGF0aWMgaW50IHNnaXNlZXFfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaHBjM19ldGhyZWdzICpocmVncyA9IHNwLT5ocmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzZ2lzZWVxX3R4X2Rlc2MgKnRkOworCWludCBza2JsZW4sIGxlbiwgZW50cnk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3AtPnR4X2xvY2ssIGZsYWdzKTsKKworCS8qIFNldHVwLi4uICovCisJc2tibGVuID0gc2tiLT5sZW47CisJbGVuID0gKHNrYmxlbiA8PSBFVEhfWkxFTikgPyBFVEhfWkxFTiA6IHNrYmxlbjsKKwlzcC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCWVudHJ5ID0gc3AtPnR4X25ldzsKKwl0ZCA9ICZzcC0+dHhfZGVzY1tlbnRyeV07CisKKwkvKiBDcmVhdGUgZW50cnkuICBUaGVyZSBhcmUgc28gbWFueSByYWNlcyB3aXRoIGFkZGluZyBhIG5ldworCSAqIGRlc2NyaXB0b3IgdG8gdGhlIGNoYWluOgorCSAqIDEpIEFzc3VtZSB0aGF0IHRoZSBIUEMgaXMgb2ZmIHByb2Nlc3NpbmcgYSBETUEgY2hhaW4gd2hpbGUKKwkgKiAgICB3ZSBhcmUgY2hhbmdpbmcgYWxsIG9mIHRoZSBmb2xsb3dpbmcuCisJICogMikgRG8gbm8gYWxsb3cgdGhlIEhQQyB0byBsb29rIGF0IGEgbmV3IGRlc2NyaXB0b3IgdW50aWwKKwkgKiAgICB3ZSBoYXZlIGNvbXBsZXRlbHkgc2V0IHVwIGl0J3Mgc3RhdGUuICBUaGlzIG1lYW5zLCBkbworCSAqICAgIG5vdCBjbGVhciBIUENETUFfRU9YIGluIHRoZSBjdXJyZW50IGxhc3QgZGVzY3JpdHB0b3IKKwkgKiAgICB1bnRpbCB0aGUgb25lIHdlIGFyZSBhZGRpbmcgbG9va3MgY29uc2lzdGVudCBhbmQgY291bGQKKwkgKiAgICBiZSBwcm9jZXNzZXMgcmlnaHQgbm93LgorCSAqIDMpIFRoZSB0eCBpbnRlcnJ1cHQgY29kZSBtdXN0IG5vdGljZSB3aGVuIHdlJ3ZlIGFkZGVkIGEgbmV3CisJICogICAgZW50cnkgYW5kIHRoZSBIUEMgZ290IHRvIHRoZSBlbmQgb2YgdGhlIGNoYWluIGJlZm9yZSB3ZQorCSAqICAgIGFkZGVkIHRoaXMgbmV3IGVudHJ5IGFuZCByZXN0YXJ0ZWQgaXQuCisJICovCisJbWVtY3B5KChjaGFyICopKGxvbmcpdGQtPmJ1Zl92YWRkciwgc2tiLT5kYXRhLCBza2JsZW4pOworCWlmIChsZW4gIT0gc2tibGVuKQorCQltZW1zZXQoKGNoYXIgKikobG9uZyl0ZC0+YnVmX3ZhZGRyICsgc2tiLT5sZW4sIDAsIGxlbi1za2JsZW4pOworCXRkLT50ZG1hLmNudGluZm8gPSAobGVuICYgSFBDRE1BX0JDTlQpIHwKKwkgICAgICAgICAgICAgICAgICAgSFBDRE1BX1hJVSB8IEhQQ0RNQV9FT1hQIHwgSFBDRE1BX1hJRSB8IEhQQ0RNQV9FT1g7CisJaWYgKHNwLT50eF9vbGQgIT0gc3AtPnR4X25ldykgeworCQlzdHJ1Y3Qgc2dpc2VlcV90eF9kZXNjICpiYWNrZW5kOworCisJCWJhY2tlbmQgPSAmc3AtPnR4X2Rlc2NbUFJFVl9UWChzcC0+dHhfbmV3KV07CisJCWJhY2tlbmQtPnRkbWEuY250aW5mbyAmPSB+SFBDRE1BX0VPWDsKKwl9CisJc3AtPnR4X25ldyA9IE5FWFRfVFgoc3AtPnR4X25ldyk7IC8qIEFkdmFuY2UuICovCisKKwkvKiBNYXliZSBraWNrIHRoZSBIUEMgYmFjayBpbnRvIG1vdGlvbi4gKi8KKwlpZiAoIShocmVncy0+dHhfY3RybCAmIEhQQzNfRVRYQ1RSTF9BQ1RJVkUpKQorCQlraWNrX3R4KCZzcC0+dHhfZGVzY1tzcC0+dHhfb2xkXSwgaHJlZ3MpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJZGV2X2tmcmVlX3NrYihza2IpOworCisJaWYgKCFUWF9CVUZGU19BVkFJTChzcCkpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+dHhfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHJlc2V0dGluZ1xuIiwgZGV2LT5uYW1lKTsKKwlzZ2lzZWVxX3Jlc2V0KGRldik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2dpc2VlcV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gJnNwLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgc2dpc2VlcV9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3AgPSAoc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgY2hhciBvbGRtb2RlID0gc3AtPm1vZGU7CisKKwlpZihkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCXNwLT5tb2RlID0gU0VFUV9SQ01EX1JBTlk7CisJZWxzZSBpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8IGRldi0+bWNfY291bnQpCisJCXNwLT5tb2RlID0gU0VFUV9SQ01EX1JCTUNBU1Q7CisJZWxzZQorCQlzcC0+bW9kZSA9IFNFRVFfUkNNRF9SQkNBU1Q7CisKKwkvKiBYWFggSSBrbm93IHRoaXMgc3Vja3MsIGJ1dCBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gcmVwcm9ncmFtCisJICogWFhYIHRoZSByZWNlaXZlcj8gQXQgbGVhc3QsIHRoaXMgc2hvdWxkbid0IGhhcHBlbiB0b28gb2Z0ZW4uCisJICovCisKKwlpZiAob2xkbW9kZSAhPSBzcC0+bW9kZSkKKwkJc2dpc2VlcV9yZXNldChkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfdHhfcmluZyhzdHJ1Y3Qgc2dpc2VlcV90eF9kZXNjICpidWYsIGludCBuYnVmcykKK3sKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoaSA8IChuYnVmcyAtIDEpKSB7CisJCWJ1ZltpXS50ZG1hLnBuZXh0ID0gQ1BIWVNBRERSKGJ1ZiArIGkgKyAxKTsKKwkJYnVmW2ldLnRkbWEucGJ1ZiA9IDA7CisJCWkrKzsKKwl9CisJYnVmW2ldLnRkbWEucG5leHQgPSBDUEhZU0FERFIoYnVmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3J4X3Jpbmcoc3RydWN0IHNnaXNlZXFfcnhfZGVzYyAqYnVmLCBpbnQgbmJ1ZnMpCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGkgPCAobmJ1ZnMgLSAxKSkgeworCQlidWZbaV0ucmRtYS5wbmV4dCA9IENQSFlTQUREUihidWYgKyBpICsgMSk7CisJCWJ1ZltpXS5yZG1hLnBidWYgPSAwOworCQlpKys7CisJfQorCWJ1ZltpXS5yZG1hLnBidWYgPSAwOworCWJ1ZltpXS5yZG1hLnBuZXh0ID0gQ1BIWVNBRERSKGJ1Zik7Cit9CisKKyNkZWZpbmUgQUxJR05FRCh4KSAgKCgoKHVuc2lnbmVkIGxvbmcpKHgpKSArIDB4ZikgJiB+KDB4ZikpCisKK3N0YXRpYyBpbnQgc2dpc2VlcV9pbml0KHN0cnVjdCBocGMzX3JlZ3MqIHJlZ3MsIGludCBpcnEpCit7CisJc3RydWN0IHNnaXNlZXFfaW5pdF9ibG9jayAqc3I7CisJc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3A7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyLCBpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mIChzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTZ2lzZWVxOiBFdGhlcmRldiBhbGxvYyBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogTWFrZSBwcml2YXRlIGRhdGEgcGFnZSBhbGlnbmVkICovCisJc3IgPSAoc3RydWN0IHNnaXNlZXFfaW5pdF9ibG9jayAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFzcikgeworCQlwcmludGsoS0VSTl9FUlIgIlNnaXNlZXE6IFBhZ2UgYWxsb2MgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CisJfQorCXNwLT5zcmluZ3MgPSBzcjsKKworI2RlZmluZSBFQUREUl9OVk9GUyAgICAgMjUwCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl1bnNpZ25lZCBzaG9ydCB0bXAgPSBpcDIyX252cmFtX3JlYWQoRUFERFJfTlZPRlMgLyAyICsgaSk7CisKKwkJZGV2LT5kZXZfYWRkclsyICogaV0gICAgID0gdG1wID4+IDg7CisJCWRldi0+ZGV2X2FkZHJbMiAqIGkgKyAxXSA9IHRtcCAmIDB4ZmY7CisJfQorCisjaWZkZWYgREVCVUcKKwlncHJpdiA9IHNwOworCWdkZXYgPSBkZXY7CisjZW5kaWYKKwlzcC0+c3JlZ3MgPSAoc3RydWN0IHNnaXNlZXFfcmVncyAqKSAmaHBjM2MwLT5ldGhfZXh0WzBdOworCXNwLT5ocmVncyA9ICZocGMzYzAtPmV0aHJlZ3M7CisJc3AtPm5hbWUgPSBzZ2lzZWVxc3RyOworCXNwLT5tb2RlID0gU0VFUV9SQ01EX1JCQ0FTVDsKKworCXNwLT5yeF9kZXNjID0gKHN0cnVjdCBzZ2lzZWVxX3J4X2Rlc2MgKikKKwkgICAgICAgICAgICAgIENLU0VHMUFERFIoQUxJR05FRCgmc3AtPnNyaW5ncy0+cnh2ZWN0b3JbMF0pKTsKKwlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKSZzcC0+c3JpbmdzLT5yeHZlY3RvciwKKwkgICAgICAgICAgICAgICAgICAgIHNpemVvZihzcC0+c3JpbmdzLT5yeHZlY3RvcikpOworCXNwLT50eF9kZXNjID0gKHN0cnVjdCBzZ2lzZWVxX3R4X2Rlc2MgKikKKwkgICAgICAgICAgICAgIENLU0VHMUFERFIoQUxJR05FRCgmc3AtPnNyaW5ncy0+dHh2ZWN0b3JbMF0pKTsKKwlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKSZzcC0+c3JpbmdzLT50eHZlY3RvciwKKwkgICAgICAgICAgICAgICAgICAgIHNpemVvZihzcC0+c3JpbmdzLT50eHZlY3RvcikpOworCisJLyogQSBjb3VwbGUgY2FsY3VsYXRpb25zIG5vdywgc2F2ZXMgbWFueSBjeWNsZXMgbGF0ZXIuICovCisJc2V0dXBfcnhfcmluZyhzcC0+cnhfZGVzYywgU0VFUV9SWF9CVUZGRVJTKTsKKwlzZXR1cF90eF9yaW5nKHNwLT50eF9kZXNjLCBTRUVRX1RYX0JVRkZFUlMpOworCisJLyogUmVzZXQgdGhlIGNoaXAuICovCisJaHBjM19ldGhfcmVzZXQoc3AtPmhyZWdzKTsKKworCXNwLT5pc19lZGxjID0gIShzcC0+c3JlZ3MtPnJ3LnJyZWdzLmNvbGxpc2lvbl90eFswXSAmIDB4ZmYpOworCWlmIChzcC0+aXNfZWRsYykKKwkJc3AtPmNvbnRyb2wgPSBTRUVRX0NUUkxfWENOVCB8IFNFRVFfQ1RSTF9BQ0NOVCB8CisJCQkgICAgICBTRUVRX0NUUkxfU0ZMQUcgfCBTRUVRX0NUUkxfRVNIT1JUIHwKKwkJCSAgICAgIFNFRVFfQ1RSTF9FTkNBUlI7CisKKwlkZXYtPm9wZW4JCT0gc2dpc2VlcV9vcGVuOworCWRldi0+c3RvcAkJPSBzZ2lzZWVxX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gc2dpc2VlcV9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dAkJPSB0aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSAoMjAwICogSFopIC8gMTAwMDsKKwlkZXYtPmdldF9zdGF0cwkJPSBzZ2lzZWVxX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdAk9IHNnaXNlZXFfc2V0X211bHRpY2FzdDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcwk9IHNnaXNlZXFfc2V0X21hY19hZGRyZXNzOworCWRldi0+aXJxCQk9IGlycTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNnaXNlZXE6IENhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcGFnZTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogU0dJIFNlZXE4MDAzICIsIGRldi0+bmFtZSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVjIiwgZGV2LT5kZXZfYWRkcltpXSwgaSA9PSA1ID8gJ1xuJyA6ICc6Jyk7CisKKwlzcC0+bmV4dF9tb2R1bGUgPSByb290X3NnaXNlZXFfZGV2OworCXJvb3Rfc2dpc2VlcV9kZXYgPSBkZXY7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX3BhZ2U6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBzcCk7CitlcnJfb3V0X2ZyZWVfZGV2OgorCWtmcmVlKGRldik7CisKK2Vycl9vdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2luaXQgc2dpc2VlcV9wcm9iZSh2b2lkKQoreworCXByaW50ayh2ZXJzaW9uKTsKKworCS8qIE9uIGJvYXJkIGFkYXB0ZXIgb24gMXN0IEhQQyBpcyBhbHdheXMgcHJlc2VudCAqLworCXJldHVybiBzZ2lzZWVxX2luaXQoaHBjM2MwLCBTR0lfRU5FVF9JUlEpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2dpc2VlcV9leGl0KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5leHQsICpkZXY7CisJc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3A7CisJaW50IGlycTsKKworCWZvciAoZGV2ID0gcm9vdF9zZ2lzZWVxX2RldjsgZGV2OyBkZXYgPSBuZXh0KSB7CisJCXNwID0gKHN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwkJbmV4dCA9IHNwLT5uZXh0X21vZHVsZTsKKwkJaXJxID0gZGV2LT5pcnE7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWZyZWVfaXJxKGlycSwgZGV2KTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBzcCk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorfQorCittb2R1bGVfaW5pdChzZ2lzZWVxX3Byb2JlKTsKK21vZHVsZV9leGl0KHNnaXNlZXFfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NnaXNlZXEuaCBiL2RyaXZlcnMvbmV0L3NnaXNlZXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmNjYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2dpc2VlcS5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogc2dpc2VlcS5oOiBEZWZpbmVzIGZvciB0aGUgU2VlcTgwMDMgZXRoZXJuZXQgY29udHJvbGxlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkbUBlbmdyLnNnaS5jb20pCisgKi8KKyNpZm5kZWYgX1NHSVNFRVFfSAorI2RlZmluZSBfU0dJU0VFUV9ICisKK3N0cnVjdCBzZ2lzZWVxX3dyZWdzIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbXVsdGljYXNlX2hpZ2hbMl07CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGZyYW1lX2dhcDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgY29udHJvbDsKK307CisKK3N0cnVjdCBzZ2lzZWVxX3JyZWdzIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgY29sbGlzaW9uX3R4WzJdOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBjb2xsaXNpb25fYWxsWzJdOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBfdW51c2VkMDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcmZsYWdzOyAKK307CisKK3N0cnVjdCBzZ2lzZWVxX3JlZ3MgeworCXVuaW9uIHsKKwkJdm9sYXRpbGUgdW5zaWduZWQgaW50IGV0aF9hZGRyWzZdOworCQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbXVsdGljYXN0X2xvd1s2XTsKKwkJc3RydWN0IHNnaXNlZXFfd3JlZ3Mgd3JlZ3M7CisJCXN0cnVjdCBzZ2lzZWVxX3JyZWdzIHJyZWdzOworCX0gcnc7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHJzdGF0OworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB0c3RhdDsKK307CisKKy8qIFNlZXE4MDAzIHJlY2VpdmUgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFNFRVFfUlNUQVRfT1ZFUkYgICAweDAwMSAvKiBPdmVyZmxvdyAqLworI2RlZmluZSBTRUVRX1JTVEFUX0NFUlJPUiAgMHgwMDIgLyogQ1JDIGVycm9yICovCisjZGVmaW5lIFNFRVFfUlNUQVRfREVSUk9SICAweDAwNCAvKiBEcmliYmxlIGVycm9yICovCisjZGVmaW5lIFNFRVFfUlNUQVRfU0ZSQU1FICAweDAwOCAvKiBTaG9ydCBmcmFtZSAqLworI2RlZmluZSBTRUVRX1JTVEFUX1JFT0YgICAgMHgwMTAgLyogUmVjZWl2ZWQgZW5kIG9mIGZyYW1lICovCisjZGVmaW5lIFNFRVFfUlNUQVRfRklHICAgICAweDAyMCAvKiBGcmFtZSBpcyBnb29kICovCisjZGVmaW5lIFNFRVFfUlNUQVRfVElNRU8gICAweDA0MCAvKiBUaW1lb3V0LCBvciBsYXRlIHJlY2VpdmUgKi8KKyNkZWZpbmUgU0VFUV9SU1RBVF9XSElDSCAgIDB4MDgwIC8qIFdoaWNoIHN0YXR1cywgMT1vbGQgMD1uZXcgKi8KKyNkZWZpbmUgU0VFUV9SU1RBVF9MSVRUTEUgIDB4MTAwIC8qIERNQSBpcyBkb25lIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0ICovCisjZGVmaW5lIFNFRVFfUlNUQVRfU0RNQSAgICAweDIwMCAvKiBETUEgaGFzIHN0YXJ0ZWQgKi8KKyNkZWZpbmUgU0VFUV9SU1RBVF9BRE1BICAgIDB4NDAwIC8qIERNQSBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgU0VFUV9SU1RBVF9ST1ZFUkYgIDB4ODAwIC8qIFJlY2VpdmUgYnVmZmVyIG92ZXJmbG93ICovCisKKy8qIFNlZXE4MDAzIHJlY2VpdmUgY29tbWFuZCByZWdpc3RlciAqLworI2RlZmluZSBTRUVRX1JDTURfUkRJU0FCICAgMHgwMDAgLyogRGlzYWJsZSByZWNlaXZlciBvbiB0aGUgU2VlcTgwMDMgKi8KKyNkZWZpbmUgU0VFUV9SQ01EX0lPVkVSRiAgIDB4MDAxIC8qIElSUSBvbiBidWZmZXIgb3ZlcmZsb3dzICovCisjZGVmaW5lIFNFRVFfUkNNRF9JQ1JDICAgICAweDAwMiAvKiBJUlEgb24gQ1JDIGVycm9ycyAqLworI2RlZmluZSBTRUVRX1JDTURfSURSSUIgICAgMHgwMDQgLyogSVJRIG9uIGRyaWJibGUgZXJyb3JzICovCisjZGVmaW5lIFNFRVFfUkNNRF9JU0hPUlQgICAweDAwOCAvKiBJUlEgb24gc2hvcnQgZnJhbWVzICovCisjZGVmaW5lIFNFRVFfUkNNRF9JRU9GICAgICAweDAxMCAvKiBJUlEgb24gZW5kIG9mIGZyYW1lICovCisjZGVmaW5lIFNFRVFfUkNNRF9JR09PRCAgICAweDAyMCAvKiBJUlEgb24gZ29vZCBmcmFtZXMgKi8KKyNkZWZpbmUgU0VFUV9SQ01EX1JBTlkgICAgIDB4MDQwIC8qIFJlY2VpdmUgYW55IGZyYW1lICovCisjZGVmaW5lIFNFRVFfUkNNRF9SQkNBU1QgICAweDA4MCAvKiBSZWNlaXZlIGJyb2FkY2FzdHMgKi8KKyNkZWZpbmUgU0VFUV9SQ01EX1JCTUNBU1QgIDB4MGMwIC8qIFJlY2VpdmUgYnJvYWRjYXN0cy9tdWx0aWNhc3RzICovCisKKy8qIFNlZXE4MDAzIHRyYW5zbWl0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBTRUVRX1RTVEFUX1VGTE9XICAgMHgwMDEgLyogVHJhbnNtaXQgYnVmZmVyIHVuZGVyZmxvdyAqLworI2RlZmluZSBTRUVRX1RTVEFUX0NMUyAgICAgMHgwMDIgLyogQ29sbGlzaW9uIGRldGVjdGVkICovCisjZGVmaW5lIFNFRVFfVFNUQVRfUjE2ICAgICAweDAwNCAvKiBEaWQgMTYgcmV0cmllcyB0byB0eCBhIGZyYW1lICovCisjZGVmaW5lIFNFRVFfVFNUQVRfUFRSQU5TICAweDAwOCAvKiBQYWNrZXQgd2FzIHRyYW5zbWl0dGVkIG9rICovCisjZGVmaW5lIFNFRVFfVFNUQVRfTENMUyAgICAweDAxMCAvKiBMYXRlIGNvbGxpc2lvbiBvY2N1cnJlZCAqLworI2RlZmluZSBTRUVRX1RTVEFUX1dISUNIICAgMHgwODAgLyogV2hpY2ggc3RhdHVzLCAxPW9sZCAwPW5ldyAqLworI2RlZmluZSBTRUVRX1RTVEFUX1RMRSAgICAgMHgxMDAgLyogRE1BIGlzIGRvbmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KKyNkZWZpbmUgU0VFUV9UU1RBVF9TRE1BICAgIDB4MjAwIC8qIERNQSBoYXMgc3RhcnRlZCAqLworI2RlZmluZSBTRUVRX1RTVEFUX0FETUEgICAgMHg0MDAgLyogRE1BIGlzIGFjdGl2ZSAqLworCisvKiBTZWVxODAwMyB0cmFuc21pdCBjb21tYW5kIHJlZ2lzdGVyICovCisjZGVmaW5lIFNFRVFfVENNRF9SQjAgICAgICAweDAwIC8qIFJlZ2lzdGVyIGJhbmsgemVybyB3L3N0YXRpb24gYWRkciAqLworI2RlZmluZSBTRUVRX1RDTURfSVVGICAgICAgMHgwMSAvKiBJUlEgb24gdHggdW5kZXJmbG93ICovCisjZGVmaW5lIFNFRVFfVENNRF9JQyAgICAgICAweDAyIC8qIElSUSBvbiBjb2xsaXNpb25zICovCisjZGVmaW5lIFNFRVFfVENNRF9JMTYgICAgICAweDA0IC8qIElSUSBhZnRlciAxNiBmYWlsZWQgYXR0ZW1wdHMgdG8gdHggZnJhbWUgKi8KKyNkZWZpbmUgU0VFUV9UQ01EX0lQVCAgICAgIDB4MDggLyogSVJRIHdoZW4gcGFja2V0IHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCAqLworI2RlZmluZSBTRUVRX1RDTURfUkIxICAgICAgMHgyMCAvKiBSZWdpc3RlciBiYW5rIG9uZSB3L211bHRpLWNhc3QgbG93IGJ5dGUgKi8gCisjZGVmaW5lIFNFRVFfVENNRF9SQjIgICAgICAweDQwIC8qIFJlZ2lzdGVyIGJhbmsgdHdvIHcvbXVsdGktY2FzdCBoaWdoIGJ5dGUgKi8KKworLyogU2VlcTgwMDMgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBTRUVRX0NUUkxfWENOVCAgICAgMHgwMQorI2RlZmluZSBTRUVRX0NUUkxfQUNDTlQgICAgMHgwMgorI2RlZmluZSBTRUVRX0NUUkxfU0ZMQUcgICAgMHgwNAorI2RlZmluZSBTRUVRX0NUUkxfRU1VTFRJICAgMHgwOAorI2RlZmluZSBTRUVRX0NUUkxfRVNIT1JUICAgMHgxMAorI2RlZmluZSBTRUVRX0NUUkxfRU5DQVJSICAgMHgyMAorCisvKiBTZWVxODAwMyBjb250cm9sIHJlZ2lzdGVycyBvbiB0aGUgU0dJIEhvbGx5d29vZCBIUEMuICovCisjZGVmaW5lIFNFRVFfSFBJT19QMUJJVFMgIDB4MDAwMDAwMDEgLyogY3ljbGVzIHRvIHN0YXkgaW4gUDEgcGhhc2UgZm9yIFBJTyAqLworI2RlZmluZSBTRUVRX0hQSU9fUDJCSVRTICAweDAwMDAwMDYwIC8qIGN5Y2xlcyB0byBzdGF5IGluIFAyIHBoYXNlIGZvciBQSU8gKi8KKyNkZWZpbmUgU0VFUV9IUElPX1AzQklUUyAgMHgwMDAwMDEwMCAvKiBjeWNsZXMgdG8gc3RheSBpbiBQMyBwaGFzZSBmb3IgUElPICovCisjZGVmaW5lIFNFRVFfSERNQV9EMUJJVFMgIDB4MDAwMDAwMDYgLyogY3ljbGVzIHRvIHN0YXkgaW4gRDEgcGhhc2UgZm9yIERNQSAqLworI2RlZmluZSBTRUVRX0hETUFfRDJCSVRTICAweDAwMDAwMDIwIC8qIGN5Y2xlcyB0byBzdGF5IGluIEQyIHBoYXNlIGZvciBETUEgKi8KKyNkZWZpbmUgU0VFUV9IRE1BX0QzQklUUyAgMHgwMDAwMDAwMCAvKiBjeWNsZXMgdG8gc3RheSBpbiBEMyBwaGFzZSBmb3IgRE1BICovCisjZGVmaW5lIFNFRVFfSERNQV9USU1FTyAgIDB4MDAwMzAwMDAgLyogY3ljbGVzIGZvciBETUEgdGltZW91dCAqLworI2RlZmluZSBTRUVRX0hDVExfTk9STSAgICAweDAwMDAwMDAwIC8qIE5vcm1hbCBvcGVyYXRpb24gbW9kZSAqLworI2RlZmluZSBTRUVRX0hDVExfUkVTRVQgICAweDAwMDAwMDAxIC8qIFJlc2V0IFNlZXE4MDAzIGFuZCBIUEMgaW50ZXJmYWNlICovCisjZGVmaW5lIFNFRVFfSENUTF9JUEVORCAgIDB4MDAwMDAwMDIgLyogSVJRIGlzIHBlbmRpbmcgZm9yIHRoZSBjaGlwICovCisjZGVmaW5lIFNFRVFfSENUTF9JUEcgICAgIDB4MDAwMDEwMDAgLyogSW50ZXItcGFja2V0IGdhcCAqLworI2RlZmluZSBTRUVRX0hDVExfUkZJWCAgICAweDAwMDAyMDAwIC8qIEF0IHJ4ZGMsIGNsZWFyIGVuZC1vZi1wYWNrZXQgKi8KKyNkZWZpbmUgU0VFUV9IQ1RMX0VGSVggICAgMHgwMDAwNDAwMCAvKiBmaXhlcyBpbnRyIHN0YXR1cyBiaXQgc2V0dGluZ3MgKi8KKyNkZWZpbmUgU0VFUV9IQ1RMX0lGSVggICAgMHgwMDAwODAwMCAvKiBlbmFibGUgc3RhcnR1cCB0aW1lb3V0cyAqLworCisjZW5kaWYgLyogIShfU0dJU0VFUV9IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2hhcGVyLmMgYi9kcml2ZXJzL25ldC9zaGFwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjhjZjVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2hhcGVyLmMKQEAgLTAsMCArMSw3NTUgQEAKKy8qCisgKgkJCVNpbXBsZSB0cmFmZmljIHNoYXBlciBmb3IgTGludXggTkVUMy4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTYgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgkJCQlodHRwOi8vd3d3LnJlZGhhdC5jb20KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoJCisgKglOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZSAKKyAqCXdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAKKyAqCSJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4JCisgKgorICoJCisgKglBbGdvcml0aG06CisgKgorICoJUXVldWUgRnJhbWU6CisgKgkJQ29tcHV0ZSB0aW1lIGxlbmd0aCBvZiBmcmFtZSBhdCByZWd1bGF0ZWQgc3BlZWQKKyAqCQlBZGQgZnJhbWUgdG8gcXVldWUgYXQgYXBwcm9wcmlhdGUgcG9pbnQKKyAqCQlBZGp1c3QgdGltZSBsZW5ndGggY29tcHV0YXRpb24gZm9yIGZvbGxvd3VwIGZyYW1lcworICoJCUFueSBmcmFtZSB0aGF0IGZhbGxzIG91dHNpZGUgb2YgaXRzIGJvdW5kYXJpZXMgaXMgZnJlZWQKKyAqCisgKglXZSB3b3JrIHRvIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzCisgKgorICoJCVNIQVBFUl9RTEVOCU1heGltdW0gcXVldWVkIGZyYW1lcworICoJCVNIQVBFUl9MQVRFTkNZCUJvdW5kaW5nIGxhdGVuY3kgb24gYSBmcmFtZS4gTGVhdmluZyB0aGlzIGxhdGVuY3kKKyAqCQkJCXdpbmRvdyBkcm9wcyB0aGUgZnJhbWUuIFRoaXMgc3RvcHMgdXMgcXVldWVpbmcgCisgKgkJCQlmcmFtZXMgZm9yIGEgbG9uZyB0aW1lIGFuZCBjb25mdXNpbmcgYSByZW1vdGUKKyAqCQkJCWhvc3QuCisgKgkJU0hBUEVSX01BWFNMSVAJTWF4aW11bSB0aW1lIGEgcHJpb3JpdHkgZnJhbWUgbWF5IGp1bXAgZm9yd2FyZC4KKyAqCQkJCVRoYXQgYm91bmRzIHRoZSBwZW5hbHR5IHdlIHdpbGwgaW5mbGljdCBvbiBsb3cKKyAqCQkJCXByaW9yaXR5IHRyYWZmaWMuCisgKgkJU0hBUEVSX0JVUlNUCVRpbWUgcmFuZ2Ugd2UgY2FsbCAibm93IiBpbiBvcmRlciB0byByZWR1Y2UKKyAqCQkJCXN5c3RlbSBsb2FkLiBUaGUgbW9yZSB3ZSBtYWtlIHRoaXMgdGhlIGJ1cnN0aWVyCisgKgkJCQl0aGUgYmVoYXZpb3VyLCB0aGUgYmV0dGVyIGxvY2FsIHBlcmZvcm1hbmNlIHlvdQorICoJCQkJZ2V0IHRocm91Z2ggcGFja2V0IGNsdXN0ZXJpbmcgb24gcm91dGVycyBhbmQgdGhlCisgKgkJCQl3b3JzZSB0aGUgcmVtb3RlIGVuZCBnZXRzIHRvIGp1ZGdlIHJ0dHMuCisgKgorICoJVGhpcyBpcyBkZXNpZ25lZCB0byBoYW5kbGUgbG93ZXIgc3BlZWQgbGlua3MgKCA8IDIwMEsvc2Vjb25kIG9yIHNvKS4gV2UKKyAqCXJ1biBvZmYgYSAxMDAtMTUwSHogYmFzZSBjbG9jayB0eXBpY2FsbHkuIFRoaXMgZ2l2ZXMgdXMgYSByZXNvbHV0aW9uIGF0CisgKgkyMDBLYml0L3NlY29uZCBvZiBhYm91dCAyS2JpdCBvciAyNTYgYnl0ZXMuIEFib3ZlIHRoYXQgb3VyIHRpbWVyCisgKglyZXNvbHV0aW9uIG1heSBzdGFydCB0byBjYXVzZSBtdWNoIG1vcmUgYnVyc3RpbmVzcyBpbiB0aGUgdHJhZmZpYy4gV2UKKyAqCWNvdWxkIGF2b2lkIGEgbG90IG9mIHRoYXQgYnkgY2FsbGluZyBraWNrX3NoYXBlcigpIGF0IHRoZSBlbmQgb2YgdGhlIAorICoJdGllZCBkZXZpY2UgdHJhbnNtaXNzaW9ucy4gSWYgeW91IHJ1biBhYm92ZSBhYm91dCAxMDBLIHNlY29uZCB5b3UgCisgKgltYXkgbmVlZCB0byB0dW5lIHRoZSBzdXBwb3NlZCBzcGVlZCByYXRlIGZvciB0aGUgcmlnaHQgdmFsdWVzLgorICoKKyAqCUJVR1M6CisgKgkJRG93bmluZyB0aGUgaW50ZXJmYWNlIHVuZGVyIHRoZSBzaGFwZXIgYmVmb3JlIHRoZSBzaGFwZXIKKyAqCQl3aWxsIHJlbmRlciB5b3VyIG1hY2hpbmUgZGVmdW5jdC4gRG9uJ3QgZm9yIG5vdyBzaGFwZSBvdmVyCisgKgkJUFBQIG9yIFNMSVAgdGhlcmVmb3JlIQorICoJCVRoaXMgd2lsbCBiZSBmaXhlZCBpbiBCRVRBNAorICoKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqCisgKiAgICAgICAgICAgICAgYmhfYXRvbWljKCkgU01QIHJhY2VzIGZpeGVzIGFuZCByZXdyaXR0ZW4gdGhlIGxvY2tpbmcgY29kZSB0bworICogICAgICAgICAgICAgIGJlIFNNUCBzYWZlIGFuZCBpcnEtbWFzayBmcmllbmRseS4KKyAqICAgICAgICAgICAgICBOT1RFOiB3ZSBjYW4ndCB1c2Ugc3RhcnRfYmhfYXRvbWljKCkgaW4ga2lja19zaGFwZXIoKQorICogICAgICAgICAgICAgIGJlY2F1c2UgaXQncyBnb2luZyB0byBiZSByZWNhbGxlZCBmcm9tIGFuIGlycSBoYW5kbGVyLAorICogICAgICAgICAgICAgIGFuZCBzeW5jaHJvbml6ZV9iaCgpIGlzIGEgbm9ubyBpZiBjYWxsZWQgZnJvbSBpcnEgY29udGV4dC4KKyAqCQkJCQkJMTk5OSAgQW5kcmVhIEFyY2FuZ2VsaQorICoKKyAqICAgICAgICAgICAgICBEZXZpY2Ugc3RhdGlzdGljcyAodHhfcGFrZXRzLCB0eF9ieXRlcywKKyAqICAgICAgICAgICAgICB0eF9kcm9wczogcXVldWVfb3Zlcl90aW1lIGFuZCBjb2xsaXNpb25zOiBtYXhfcXVldWVfZXhjZWRlZCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5OTkvMDYvMTggSm9yZGkgTXVyZ28gPHNhdmFnZUBhcG9zdG9scy5vcmc+CisgKgorICoJCVVzZSBza2ItPmNiIGZvciBwcml2YXRlIGRhdGEuCisgKgkJCQkgMjAwMC8wMyBBbmRpIEtsZWVuCisgKi8KKyAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfc2hhcGVyLmg+CisKKyNpbmNsdWRlIDxuZXQvZHN0Lmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCitzdHJ1Y3Qgc2hhcGVyX2NiIHsgCisJdW5zaWduZWQgbG9uZwlzaGFwZWNsb2NrOwkJLyogVGltZSBpdCBzaG91bGQgZ28gb3V0ICovCisJdW5zaWduZWQgbG9uZwlzaGFwZXN0YW1wOwkJLyogU3RhbXAgZm9yIHNoYXBlciAgICAqLworCV9fdTMyCQlzaGFwZWxhdGVuY3k7CQkvKiBMYXRlbmN5IG9uIGZyYW1lICovCisJX191MzIJCXNoYXBlbGVuOwkJLyogRnJhbWUgbGVuZ3RoIGluIGNsb2NrcyAqLworCV9fdTE2CQlzaGFwZXBlbmQ7CQkvKiBQZW5kaW5nICovCit9OyAKKyNkZWZpbmUgU0hBUEVSQ0Ioc2tiKSAoKHN0cnVjdCBzaGFwZXJfY2IgKikgKChza2IpLT5jYikpCisKK3N0YXRpYyBpbnQgc2hfZGVidWc7CQkvKiBEZWJ1ZyBmbGFnICovCisKKyNkZWZpbmUgU0hBUEVSX0JBTk5FUgkiQ3ltcnVOZXQgVHJhZmZpYyBTaGFwZXIgQkVUQSAwLjA0IGZvciBMaW51eCAyLjFcbiIKKworLyoKKyAqCUxvY2tpbmcKKyAqLworIAorc3RhdGljIGludCBzaGFwZXJfbG9jayhzdHJ1Y3Qgc2hhcGVyICpzaCkKK3sKKwkvKgorCSAqCUxvY2sgaW4gYW4gaW50ZXJydXB0IG11c3QgZmFpbAorCSAqLworCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KDAsICZzaC0+bG9ja2VkKSkKKwl7CisJCWlmICghaW5faW50ZXJydXB0KCkpCisJCQlzbGVlcF9vbigmc2gtPndhaXRfcXVldWUpOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwkJCQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc2hhcGVyX2tpY2soc3RydWN0IHNoYXBlciAqc2gpOworCitzdGF0aWMgdm9pZCBzaGFwZXJfdW5sb2NrKHN0cnVjdCBzaGFwZXIgKnNoKQoreworCWNsZWFyX2JpdCgwLCAmc2gtPmxvY2tlZCk7CisJd2FrZV91cCgmc2gtPndhaXRfcXVldWUpOworCXNoYXBlcl9raWNrKHNoKTsKK30KKworLyoKKyAqCUNvbXB1dGUgY2xvY2tzIG9uIGEgYnVmZmVyCisgKi8KKyAgCitzdGF0aWMgaW50IHNoYXBlcl9jbG9ja3Moc3RydWN0IHNoYXBlciAqc2hhcGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworIAlpbnQgdD1za2ItPmxlbi9zaGFwZXItPmJ5dGVzcGVydGljazsKKyAJcmV0dXJuIHQ7Cit9CisKKy8qCisgKglTZXQgdGhlIHNwZWVkIG9mIGEgc2hhcGVyLiBXZSBjb21wdXRlIHRoaXMgaW4gYnl0ZXMgcGVyIHRpY2sgc2luY2UKKyAqCXRoYXRzIGhvdyB0aGUgbWFjaGluZSB3YW50cyB0byBydW4uIFF1b3RlZCBpbnB1dCBpcyBpbiBiaXRzIHBlciBzZWNvbmQKKyAqCWFzIGlzIHRyYWRpdGlvbmFsIChub3RlIG5vdCBCQVVEKS4gV2UgYXNzdW1lIDggYml0IGJ5dGVzLiAKKyAqLworICAKK3N0YXRpYyB2b2lkIHNoYXBlcl9zZXRzcGVlZChzdHJ1Y3Qgc2hhcGVyICpzaGFwZXIsIGludCBiaXRzcGVyc2VjKQoreworCXNoYXBlci0+Yml0c3BlcnNlYz1iaXRzcGVyc2VjOworCXNoYXBlci0+Ynl0ZXNwZXJ0aWNrPShiaXRzcGVyc2VjL0haKS84OworCWlmKCFzaGFwZXItPmJ5dGVzcGVydGljaykKKwkJc2hhcGVyLT5ieXRlc3BlcnRpY2srKzsKK30KKworLyoKKyAqCVRocm93IGEgZnJhbWUgYXQgYSBzaGFwZXIuCisgKi8KKyAgCitzdGF0aWMgaW50IHNoYXBlcl9xZnJhbWUoc3RydWN0IHNoYXBlciAqc2hhcGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworIAlzdHJ1Y3Qgc2tfYnVmZiAqcHRyOworICAgCisgCS8qCisgCSAqCUdldCByZWFkeSB0byB3b3JrIG9uIHRoaXMgc2hhcGVyLiBMb2NrIG1heSBmYWlsIGlmIGl0cworIAkgKglhbiBpbnRlcnJ1cHQgYW5kIGxvY2tlZC4KKyAJICovCisgCSAKKyAJaWYoIXNoYXBlcl9sb2NrKHNoYXBlcikpCisgCQlyZXR1cm4gLTE7CisgCXB0cj1zaGFwZXItPnNlbmRxLnByZXY7CisgCQorIAkvKgorIAkgKglTZXQgdXAgb3VyIHBhY2tldCBkZXRhaWxzCisgCSAqLworIAkgCisgCVNIQVBFUkNCKHNrYiktPnNoYXBlbGF0ZW5jeT0wOworIAlTSEFQRVJDQihza2IpLT5zaGFwZWNsb2NrPXNoYXBlci0+cmVjb3Zlcnk7CisgCWlmKHRpbWVfYmVmb3JlKFNIQVBFUkNCKHNrYiktPnNoYXBlY2xvY2ssIGppZmZpZXMpKQorIAkJU0hBUEVSQ0Ioc2tiKS0+c2hhcGVjbG9jaz1qaWZmaWVzOworIAlza2ItPnByaW9yaXR5PTA7CS8qIHNob3J0IHRlcm0gYnVnIGZpeCAqLworIAlTSEFQRVJDQihza2IpLT5zaGFwZXN0YW1wPWppZmZpZXM7CisgCQorIAkvKgorIAkgKglUaW1lIHNsb3RzIGZvciB0aGlzIHBhY2tldC4KKyAJICovCisgCSAKKyAJU0hBUEVSQ0Ioc2tiKS0+c2hhcGVsZW49IHNoYXBlcl9jbG9ja3Moc2hhcGVyLHNrYik7CisgCQorI2lmZGVmIFNIQVBFUl9DT01QTEVYIC8qIGFuZCBicm9rZW4uLiAqLworCisgCXdoaWxlKHB0ciAmJiBwdHIhPShzdHJ1Y3Qgc2tfYnVmZiAqKSZzaGFwZXItPnNlbmRxKQorIAl7CisgCQlpZihwdHItPnByaTxza2ItPnByaSAKKyAJCQkmJiBqaWZmaWVzIC0gU0hBUEVSQ0IocHRyKS0+c2hhcGVjbG9jayA8IFNIQVBFUl9NQVhTTElQKQorIAkJeworIAkJCXN0cnVjdCBza19idWZmICp0bXA9cHRyLT5wcmV2OworCisgCQkJLyoKKyAJCQkgKglJdCBnb2VzIGJlZm9yZSB1cyB0aGVyZWZvcmUgd2Ugc2xpcCB0aGUgbGVuZ3RoCisgCQkJICoJb2YgdGhlIG5ldyBmcmFtZS4KKyAJCQkgKi8KKworIAkJCVNIQVBFUkNCKHB0ciktPnNoYXBlY2xvY2srPVNIQVBFUkNCKHNrYiktPnNoYXBlbGVuOworIAkJCVNIQVBFUkNCKHB0ciktPnNoYXBlbGF0ZW5jeSs9U0hBUEVSQ0Ioc2tiKS0+c2hhcGVsZW47CisKKyAJCQkvKgorIAkJCSAqCVRoZSBwYWNrZXQgbWF5IGhhdmUgc2xpcHBlZCBzbyBmYXIgYmFjayBpdAorIAkJCSAqCWZlbGwgb2ZmLgorIAkJCSAqLworIAkJCWlmKFNIQVBFUkNCKHB0ciktPnNoYXBlbGF0ZW5jeSA+IFNIQVBFUl9MQVRFTkNZKQorIAkJCXsKKyAJCQkJc2tiX3VubGluayhwdHIpOworIAkJCQlkZXZfa2ZyZWVfc2tiKHB0cik7CisgCQkJfQorIAkJCXB0cj10bXA7CisgCQl9CisgCQllbHNlCisgCQkJYnJlYWs7CisgCX0KKyAJaWYocHRyPT1OVUxMIHx8IHB0cj09KHN0cnVjdCBza19idWZmICopJnNoYXBlci0+c2VuZHEpCisgCQlza2JfcXVldWVfaGVhZCgmc2hhcGVyLT5zZW5kcSxza2IpOworIAllbHNlCisgCXsKKyAJCXN0cnVjdCBza19idWZmICp0bXA7CisgCQkvKgorIAkJICoJU2V0IHRoZSBwYWNrZXQgY2xvY2sgb3V0IHRpbWUgYWNjb3JkaW5nIHRvIHRoZQorIAkJICoJZnJhbWVzIGFoZWFkLiBJbSBzdXJlIGEgYml0IG9mIHRob3VnaHQgY291bGQgZHJvcAorIAkJICoJdGhpcyBsb29wLgorIAkJICovCisgCQlmb3IodG1wPXNrYl9wZWVrKCZzaGFwZXItPnNlbmRxKTsgdG1wIT1OVUxMICYmIHRtcCE9cHRyOyB0bXA9dG1wLT5uZXh0KQorIAkJCVNIQVBFUkNCKHNrYiktPnNoYXBlY2xvY2srPXRtcC0+c2hhcGVsZW47CisgCQlza2JfYXBwZW5kKHB0cixza2IpOworIAl9CisjZWxzZQorCXsKKwkJc3RydWN0IHNrX2J1ZmYgKnRtcDsKKwkJLyoKKwkJICoJVXAgb3VyIHNoYXBlIGNsb2NrIGJ5IHRoZSB0aW1lIHBlbmRpbmcgb24gdGhlIHF1ZXVlCisJCSAqCShTaG91bGQga2VlcCB0aGlzIGluIHRoZSBzaGFwZXIgYXMgYSB2YXJpYWJsZS4uKQorCQkgKi8KKwkJZm9yKHRtcD1za2JfcGVlaygmc2hhcGVyLT5zZW5kcSk7IHRtcCE9TlVMTCAmJiAKKwkJCXRtcCE9KHN0cnVjdCBza19idWZmICopJnNoYXBlci0+c2VuZHE7IHRtcD10bXAtPm5leHQpCisJCQlTSEFQRVJDQihza2IpLT5zaGFwZWNsb2NrKz1TSEFQRVJDQih0bXApLT5zaGFwZWxlbjsKKwkJLyoKKwkJICoJUXVldWUgb3ZlciB0aW1lLiBTcGlsbCBwYWNrZXQuCisJCSAqLworCQlpZihTSEFQRVJDQihza2IpLT5zaGFwZWNsb2NrLWppZmZpZXMgPiBTSEFQRVJfTEFURU5DWSkgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJc2hhcGVyLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCX0gZWxzZQorCQkJc2tiX3F1ZXVlX3RhaWwoJnNoYXBlci0+c2VuZHEsIHNrYik7CisJfQorI2VuZGlmIAkKKwlpZihzaF9kZWJ1ZykKKyAJCXByaW50aygiRnJhbWUgcXVldWVkLlxuIik7CisgCWlmKHNrYl9xdWV1ZV9sZW4oJnNoYXBlci0+c2VuZHEpPlNIQVBFUl9RTEVOKQorIAl7CisgCQlwdHI9c2tiX2RlcXVldWUoJnNoYXBlci0+c2VuZHEpOworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2IocHRyKTsKKyAgICAgICAgICAgICAgICBzaGFwZXItPnN0YXRzLmNvbGxpc2lvbnMrKzsKKyAJfQorIAlzaGFwZXJfdW5sb2NrKHNoYXBlcik7CisgCXJldHVybiAwOworfQorCisvKgorICoJVHJhbnNtaXQgZnJvbSBhIHNoYXBlcgorICovCisgCitzdGF0aWMgdm9pZCBzaGFwZXJfcXVldWVfeG1pdChzdHJ1Y3Qgc2hhcGVyICpzaGFwZXIsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYj1za2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZihzaF9kZWJ1ZykKKwkJcHJpbnRrKCJLaWNrIGZyYW1lIG9uICVwXG4iLG5ld3NrYik7CisJaWYobmV3c2tiKQorCXsKKwkJbmV3c2tiLT5kZXY9c2hhcGVyLT5kZXY7CisJCW5ld3NrYi0+cHJpb3JpdHk9MjsKKwkJaWYoc2hfZGVidWcpCisJCQlwcmludGsoIktpY2sgbmV3IGZyYW1lIHRvICVzLCAlZFxuIiwKKwkJCQlzaGFwZXItPmRldi0+bmFtZSxuZXdza2ItPnByaW9yaXR5KTsKKwkJZGV2X3F1ZXVlX3htaXQobmV3c2tiKTsKKworICAgICAgICAgICAgICAgIHNoYXBlci0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCXNoYXBlci0+c3RhdHMudHhfcGFja2V0cysrOworCisgICAgICAgICAgICAgICAgaWYoc2hfZGVidWcpCisJCQlwcmludGsoIktpY2tlZCBuZXcgZnJhbWUgb3V0LlxuIik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9Cit9CisKKy8qCisgKglUaW1lciBoYW5kbGVyIGZvciBzaGFwaW5nIGNsb2NrCisgKi8KKyAKK3N0YXRpYyB2b2lkIHNoYXBlcl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNoYXBlciAqc2g9KHN0cnVjdCBzaGFwZXIgKilkYXRhOworCXNoYXBlcl9raWNrKHNoKTsKK30KKworLyoKKyAqCUtpY2sgYSBzaGFwZXIgcXVldWUgYW5kIHRyeSBhbmQgZG8gc29tZXRoaW5nIHNlbnNpYmxlIHdpdGggdGhlIAorICoJcXVldWUuIAorICovCisKK3N0YXRpYyB2b2lkIHNoYXBlcl9raWNrKHN0cnVjdCBzaGFwZXIgKnNoYXBlcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQorCS8qCisJICoJU2hhcGVyIHVubG9jayB3aWxsIGtpY2sKKwkgKi8KKwkgCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnNoYXBlci0+bG9ja2VkKSkKKwl7CisJCWlmKHNoX2RlYnVnKQorCQkJcHJpbnRrKCJTaGFwZXIgbG9ja2VkLlxuIik7CisJCW1vZF90aW1lcigmc2hhcGVyLT50aW1lciwgamlmZmllcyk7CisJCXJldHVybjsKKwl9CisKKwkJCisJLyoKKwkgKglXYWxrIHRoZSBsaXN0IChtYXkgYmUgZW1wdHkpCisJICovCisJIAorCXdoaWxlKChza2I9c2tiX3BlZWsoJnNoYXBlci0+c2VuZHEpKSE9TlVMTCkKKwl7CisJCS8qCisJCSAqCUVhY2ggcGFja2V0IGR1ZSB0byBnbyBvdXQgYnkgbm93ICh3aXRoaW4gYW4gZXJyb3IKKwkJICoJb2YgU0hBUEVSX0JVUlNUKSBnZXRzIGtpY2tlZCBvbnRvIHRoZSBsaW5rIAorCQkgKi8KKwkJIAorCQlpZihzaF9kZWJ1ZykKKwkJCXByaW50aygiQ2xvY2sgPSAlbGQsIGppZmZpZXMgPSAlbGRcbiIsIFNIQVBFUkNCKHNrYiktPnNoYXBlY2xvY2ssIGppZmZpZXMpOworCQlpZih0aW1lX2JlZm9yZV9lcShTSEFQRVJDQihza2IpLT5zaGFwZWNsb2NrLCBqaWZmaWVzICsgU0hBUEVSX0JVUlNUKSkKKwkJeworCQkJLyoKKwkJCSAqCVB1bGwgdGhlIGZyYW1lIGFuZCBnZXQgaW50ZXJydXB0cyBiYWNrIG9uLgorCQkJICovCisJCQkgCisJCQlza2JfdW5saW5rKHNrYik7CisJCQlpZiAoc2hhcGVyLT5yZWNvdmVyeSA8IAorCQkJICAgIFNIQVBFUkNCKHNrYiktPnNoYXBlY2xvY2sgKyBTSEFQRVJDQihza2IpLT5zaGFwZWxlbikKKwkJCQlzaGFwZXItPnJlY292ZXJ5ID0gU0hBUEVSQ0Ioc2tiKS0+c2hhcGVjbG9jayArIFNIQVBFUkNCKHNrYiktPnNoYXBlbGVuOworCQkJLyoKKwkJCSAqCVBhc3Mgb24gdG8gdGhlIHBoeXNpY2FsIHRhcmdldCBkZXZpY2UgdmlhCisJCQkgKglvdXIgbG93IGxldmVsIHBhY2tldCB0aHJvd2VyLgorCQkJICovCisJCQkKKwkJCVNIQVBFUkNCKHNrYiktPnNoYXBlcGVuZD0wOworCQkJc2hhcGVyX3F1ZXVlX3htaXQoc2hhcGVyLCBza2IpOwkvKiBGaXJlICovCisJCX0KKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJLyoKKwkgKglOZXh0IGtpY2suCisJICovCisJIAorCWlmKHNrYiE9TlVMTCkKKwkJbW9kX3RpbWVyKCZzaGFwZXItPnRpbWVyLCBTSEFQRVJDQihza2IpLT5zaGFwZWNsb2NrKTsKKworCWNsZWFyX2JpdCgwLCAmc2hhcGVyLT5sb2NrZWQpOworfQorCisKKy8qCisgKglGbHVzaCB0aGUgc2hhcGVyIHF1ZXVlcyBvbiBhIGNsb3NlZG93bgorICovCisgCitzdGF0aWMgdm9pZCBzaGFwZXJfZmx1c2goc3RydWN0IHNoYXBlciAqc2hhcGVyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisgCWlmKCFzaGFwZXJfbG9jayhzaGFwZXIpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJzaGFwZXI6IHNoYXBlcl9mbHVzaCgpIGNhbGxlZCBieSBhbiBpcnEhXG4iKTsKKyAJCXJldHVybjsKKwl9CisJd2hpbGUoKHNrYj1za2JfZGVxdWV1ZSgmc2hhcGVyLT5zZW5kcSkpIT1OVUxMKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJc2hhcGVyX3VubG9jayhzaGFwZXIpOworfQorCisvKgorICoJQnJpbmcgdGhlIGludGVyZmFjZSB1cC4gV2UganVzdCBkaXNhbGxvdyB0aGlzIHVudGlsIGEgCisgKgliaW5kLgorICovCisKK3N0YXRpYyBpbnQgc2hhcGVyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2hhcGVyICpzaGFwZXI9ZGV2LT5wcml2OworCQorCS8qCisJICoJQ2FuJ3Qgb3BlbiB1bnRpbCBhdHRhY2hlZC4KKwkgKglBbHNvIGNhbid0IG9wZW4gdW50aWwgc3BlZWQgaXMgc2V0LCBvciB3ZSdsbCBnZXQKKwkgKglhIGRpdmlzaW9uIGJ5IHplcm8uCisJICovCisJIAorCWlmKHNoYXBlci0+ZGV2PT1OVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZihzaGFwZXItPmJpdHNwZXJzZWM9PTApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCisvKgorICoJQ2xvc2luZyBhIHNoYXBlciBmbHVzaGVzIHRoZSBxdWV1ZXMuCisgKi8KKyAKK3N0YXRpYyBpbnQgc2hhcGVyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNoYXBlciAqc2hhcGVyPWRldi0+cHJpdjsKKwlzaGFwZXJfZmx1c2goc2hhcGVyKTsKKwlkZWxfdGltZXJfc3luYygmc2hhcGVyLT50aW1lcik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglSZXZlY3RvcmVkIGNhbGxzLiBXZSBhbHRlciB0aGUgcGFyYW1ldGVycyBhbmQgY2FsbCB0aGUgZnVuY3Rpb25zCisgKglmb3Igb3VyIGF0dGFjaGVkIGRldmljZS4gVGhpcyBlbmFibGVzIHVzIHRvIGJhbmR3aWR0aCBhbGxvY2F0ZSBhZnRlcgorICoJQVJQIGFuZCBvdGhlciByZXNvbHV0aW9ucyBhbmQgbm90IGJlZm9yZS4KKyAqLworCisKK3N0YXRpYyBpbnQgc2hhcGVyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2hhcGVyICpzaD1kZXYtPnByaXY7CisJcmV0dXJuIHNoYXBlcl9xZnJhbWUoc2gsIHNrYik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2hhcGVyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAJc3RydWN0IHNoYXBlciAqc2g9ZGV2LT5wcml2OworCXJldHVybiAmc2gtPnN0YXRzOworfQorCitzdGF0aWMgaW50IHNoYXBlcl9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisJdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IHNoYXBlciAqc2g9ZGV2LT5wcml2OworCWludCB2OworCWlmKHNoX2RlYnVnKQorCQlwcmludGsoIlNoYXBlciBoZWFkZXJcbiIpOworCXNrYi0+ZGV2PXNoLT5kZXY7CisJdj1zaC0+aGFyZF9oZWFkZXIoc2tiLHNoLT5kZXYsdHlwZSxkYWRkcixzYWRkcixsZW4pOworCXNrYi0+ZGV2PWRldjsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIGludCBzaGFwZXJfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2hhcGVyICpzaD1za2ItPmRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2PXNrYi0+ZGV2OworCWludCB2OworCWlmKHNoX2RlYnVnKQorCQlwcmludGsoIlNoYXBlciByZWJ1aWxkIGhlYWRlclxuIik7CisJc2tiLT5kZXY9c2gtPmRldjsKKwl2PXNoLT5yZWJ1aWxkX2hlYWRlcihza2IpOworCXNrYi0+ZGV2PWRldjsKKwlyZXR1cm4gdjsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgc2hhcGVyX2NhY2hlKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3QgaGhfY2FjaGUgKmhoKQoreworCXN0cnVjdCBzaGFwZXIgKnNoPW5laWdoLT5kZXYtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKnRtcDsKKwlpbnQgcmV0OworCWlmKHNoX2RlYnVnKQorCQlwcmludGsoIlNoYXBlciBoZWFkZXIgY2FjaGUgYmluZFxuIik7CisJdG1wPW5laWdoLT5kZXY7CisJbmVpZ2gtPmRldj1zaC0+ZGV2OworCXJldD1zaC0+aGFyZF9oZWFkZXJfY2FjaGUobmVpZ2gsaGgpOworCW5laWdoLT5kZXY9dG1wOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNoYXBlcl9jYWNoZV91cGRhdGUoc3RydWN0IGhoX2NhY2hlICpoaCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1bnNpZ25lZCBjaGFyICpoYWRkcikKK3sKKwlzdHJ1Y3Qgc2hhcGVyICpzaD1kZXYtPnByaXY7CisJaWYoc2hfZGVidWcpCisJCXByaW50aygiU2hhcGVyIGNhY2hlIHVwZGF0ZVxuIik7CisJc2gtPmhlYWRlcl9jYWNoZV91cGRhdGUoaGgsIHNoLT5kZXYsIGhhZGRyKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lORVQKKworc3RhdGljIGludCBzaGFwZXJfbmVpZ2hfc2V0dXAoc3RydWN0IG5laWdoYm91ciAqbikKK3sKKyNpZmRlZiBDT05GSUdfSU5FVAorCWlmIChuLT5udWRfc3RhdGUgPT0gTlVEX05PTkUpIHsKKwkJbi0+b3BzID0gJmFycF9icm9rZW5fb3BzOworCQluLT5vdXRwdXQgPSBuLT5vcHMtPm91dHB1dDsKKwl9CisjZW5kaWYJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hhcGVyX25laWdoX3NldHVwX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmVpZ2hfcGFybXMgKnApCit7CisjaWZkZWYgQ09ORklHX0lORVQKKwlpZiAocC0+dGJsLT5mYW1pbHkgPT0gQUZfSU5FVCkgeworCQlwLT5uZWlnaF9zZXR1cCA9IHNoYXBlcl9uZWlnaF9zZXR1cDsKKwkJcC0+dWNhc3RfcHJvYmVzID0gMDsKKwkJcC0+bWNhc3RfcHJvYmVzID0gMDsKKwl9CisjZW5kaWYJCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlIC8qICEoQ09ORklHX0lORVQpICovCisKK3N0YXRpYyBpbnQgc2hhcGVyX25laWdoX3NldHVwX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmVpZ2hfcGFybXMgKnApCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IHNoYXBlcl9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKnNoZGV2LCBzdHJ1Y3Qgc2hhcGVyICpzaCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzaC0+ZGV2ID0gZGV2OworCXNoLT5oYXJkX3N0YXJ0X3htaXQ9ZGV2LT5oYXJkX3N0YXJ0X3htaXQ7CisJc2gtPmdldF9zdGF0cz1kZXYtPmdldF9zdGF0czsKKwlpZihkZXYtPmhhcmRfaGVhZGVyKQorCXsKKwkJc2gtPmhhcmRfaGVhZGVyPWRldi0+aGFyZF9oZWFkZXI7CisJCXNoZGV2LT5oYXJkX2hlYWRlciA9IHNoYXBlcl9oZWFkZXI7CisJfQorCWVsc2UKKwkJc2hkZXYtPmhhcmRfaGVhZGVyID0gTlVMTDsKKwkJCisJaWYoZGV2LT5yZWJ1aWxkX2hlYWRlcikKKwl7CisJCXNoLT5yZWJ1aWxkX2hlYWRlcgk9IGRldi0+cmVidWlsZF9oZWFkZXI7CisJCXNoZGV2LT5yZWJ1aWxkX2hlYWRlcgk9IHNoYXBlcl9yZWJ1aWxkX2hlYWRlcjsKKwl9CisJZWxzZQorCQlzaGRldi0+cmVidWlsZF9oZWFkZXIJPSBOVUxMOworCQorI2lmIDAKKwlpZihkZXYtPmhhcmRfaGVhZGVyX2NhY2hlKQorCXsKKwkJc2gtPmhhcmRfaGVhZGVyX2NhY2hlCT0gZGV2LT5oYXJkX2hlYWRlcl9jYWNoZTsKKwkJc2hkZXYtPmhhcmRfaGVhZGVyX2NhY2hlPSBzaGFwZXJfY2FjaGU7CisJfQorCWVsc2UKKwl7CisJCXNoZGV2LT5oYXJkX2hlYWRlcl9jYWNoZT0gTlVMTDsKKwl9CisJCQkKKwlpZihkZXYtPmhlYWRlcl9jYWNoZV91cGRhdGUpCisJeworCQlzaC0+aGVhZGVyX2NhY2hlX3VwZGF0ZQk9IGRldi0+aGVhZGVyX2NhY2hlX3VwZGF0ZTsKKwkJc2hkZXYtPmhlYWRlcl9jYWNoZV91cGRhdGUgPSBzaGFwZXJfY2FjaGVfdXBkYXRlOworCX0KKwllbHNlCisJCXNoZGV2LT5oZWFkZXJfY2FjaGVfdXBkYXRlPSBOVUxMOworI2Vsc2UKKwlzaGRldi0+aGVhZGVyX2NhY2hlX3VwZGF0ZSA9IE5VTEw7CisJc2hkZXYtPmhhcmRfaGVhZGVyX2NhY2hlID0gTlVMTDsKKyNlbmRpZgorCXNoZGV2LT5uZWlnaF9zZXR1cCA9IHNoYXBlcl9uZWlnaF9zZXR1cF9kZXY7CisJCisJc2hkZXYtPmhhcmRfaGVhZGVyX2xlbj1kZXYtPmhhcmRfaGVhZGVyX2xlbjsKKwlzaGRldi0+dHlwZT1kZXYtPnR5cGU7CisJc2hkZXYtPmFkZHJfbGVuPWRldi0+YWRkcl9sZW47CisJc2hkZXYtPm10dT1kZXYtPm10dTsKKwlzaC0+Yml0c3BlcnNlYz0wOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoYXBlcl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IHNoYXBlcmNvbmYgKnNzPSAoc3RydWN0IHNoYXBlcmNvbmYgKikmaWZyLT5pZnJfaWZydTsKKwlzdHJ1Y3Qgc2hhcGVyICpzaD1kZXYtPnByaXY7CisJCisJaWYoc3MtPnNzX2NtZCA9PSBTSEFQRVJfU0VUX0RFViB8fCBzcy0+c3NfY21kID09IFNIQVBFUl9TRVRfU1BFRUQpCisJeworCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJfQorCQorCXN3aXRjaChzcy0+c3NfY21kKQorCXsKKwkJY2FzZSBTSEFQRVJfU0VUX0RFVjoKKwkJeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKnRoZW09X19kZXZfZ2V0X2J5X25hbWUoc3MtPnNzX25hbWUpOworCQkJaWYodGhlbT09TlVMTCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWlmKHNoLT5kZXYpCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCXJldHVybiBzaGFwZXJfYXR0YWNoKGRldixkZXYtPnByaXYsIHRoZW0pOworCQl9CisJCWNhc2UgU0hBUEVSX0dFVF9ERVY6CisJCQlpZihzaC0+ZGV2PT1OVUxMKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJc3RyY3B5KHNzLT5zc19uYW1lLCBzaC0+ZGV2LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQljYXNlIFNIQVBFUl9TRVRfU1BFRUQ6CisJCQlzaGFwZXJfc2V0c3BlZWQoc2gsc3MtPnNzX3NwZWVkKTsKKwkJCXJldHVybiAwOworCQljYXNlIFNIQVBFUl9HRVRfU1BFRUQ6CisJCQlzcy0+c3Nfc3BlZWQ9c2gtPmJpdHNwZXJzZWM7CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIHZvaWQgc2hhcGVyX2luaXRfcHJpdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaGFwZXIgKnNoID0gZGV2LT5wcml2OworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2gtPnNlbmRxKTsKKwlpbml0X3RpbWVyKCZzaC0+dGltZXIpOworCXNoLT50aW1lci5mdW5jdGlvbj1zaGFwZXJfdGltZXI7CisJc2gtPnRpbWVyLmRhdGE9KHVuc2lnbmVkIGxvbmcpc2g7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc2gtPndhaXRfcXVldWUpOworfQorCisvKgorICoJQWRkIGEgc2hhcGVyIGRldmljZSB0byB0aGUgc3lzdGVtCisgKi8KKyAKK3N0YXRpYyB2b2lkIF9faW5pdCBzaGFwZXJfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKgorCSAqCVNldCB1cCB0aGUgc2hhcGVyLgorCSAqLworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJc2hhcGVyX2luaXRfcHJpdihkZXYpOworCisJZGV2LT5vcGVuCQk9IHNoYXBlcl9vcGVuOworCWRldi0+c3RvcAkJPSBzaGFwZXJfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgCT0gc2hhcGVyX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgCQk9IHNoYXBlcl9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBOVUxMOworCQorCS8qCisJICoJSW50aWFsaXNlIHRoZSBwYWNrZXQgcXVldWVzCisJICovCisJIAorCS8qCisJICoJSGFuZGxlcnMgZm9yIHdoZW4gd2UgYXR0YWNoIHRvIGEgZGV2aWNlLgorCSAqLworCisJZGV2LT5oYXJkX2hlYWRlciAJPSBzaGFwZXJfaGVhZGVyOworCWRldi0+cmVidWlsZF9oZWFkZXIgCT0gc2hhcGVyX3JlYnVpbGRfaGVhZGVyOworI2lmIDAKKwlkZXYtPmhhcmRfaGVhZGVyX2NhY2hlCT0gc2hhcGVyX2NhY2hlOworCWRldi0+aGVhZGVyX2NhY2hlX3VwZGF0ZT0gc2hhcGVyX2NhY2hlX3VwZGF0ZTsKKyNlbmRpZgorCWRldi0+bmVpZ2hfc2V0dXAJPSBzaGFwZXJfbmVpZ2hfc2V0dXBfZGV2OworCWRldi0+ZG9faW9jdGwJCT0gc2hhcGVyX2lvY3RsOworCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gMDsKKwlkZXYtPnR5cGUJCT0gQVJQSFJEX0VUSEVSOwkvKiBpbml0aWFsbHkgKi8KKwlkZXYtPnNldF9tYWNfYWRkcmVzcwk9IE5VTEw7CisJZGV2LT5tdHUJCT0gMTUwMDsKKwlkZXYtPmFkZHJfbGVuCQk9IDA7CisJZGV2LT50eF9xdWV1ZV9sZW4JPSAxMDsKKwlkZXYtPmZsYWdzCQk9IDA7Cit9CisgCitzdGF0aWMgaW50IHNoYXBlcnMgPSAxOworI2lmZGVmIE1PRFVMRQorCittb2R1bGVfcGFyYW0oc2hhcGVycywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2hhcGVycywgIlRyYWZmaWMgc2hhcGVyOiBtYXhpbXVtIG51bWJlciBvZiBzaGFwZXJzIik7CisKKyNlbHNlIC8qIE1PRFVMRSAqLworCitzdGF0aWMgaW50IF9faW5pdCBzZXRfbnVtX3NoYXBlcnMoY2hhciAqc3RyKQoreworCXNoYXBlcnMgPSBzaW1wbGVfc3RydG9sKHN0ciwgTlVMTCwgMCk7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInNoYXBlcnM9Iiwgc2V0X251bV9zaGFwZXJzKTsKKworI2VuZGlmIC8qIE1PRFVMRSAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKipkZXZzOworCitzdGF0aWMgdW5zaWduZWQgaW50IHNoYXBlcnNfcmVnaXN0ZXJlZCA9IDA7CisKK3N0YXRpYyBpbnQgX19pbml0IHNoYXBlcl9pbml0KHZvaWQpCit7CisJaW50IGk7CisJc2l6ZV90IGFsbG9jX3NpemU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwljaGFyIG5hbWVbSUZOQU1TSVpdOworCisJaWYgKHNoYXBlcnMgPCAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWFsbG9jX3NpemUgPSBzaXplb2YoKmRldikgKiBzaGFwZXJzOworCWRldnMgPSBrbWFsbG9jKGFsbG9jX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghZGV2cykKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGRldnMsIDAsIGFsbG9jX3NpemUpOworCisJZm9yIChpID0gMDsgaSA8IHNoYXBlcnM7IGkrKykgeworCisJCXNucHJpbnRmKG5hbWUsIElGTkFNU0laLCAic2hhcGVyJWQiLCBpKTsKKwkJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3Qgc2hhcGVyKSwgbmFtZSwKKwkJCQkgICBzaGFwZXJfc2V0dXApOworCQlpZiAoIWRldikgCisJCQlicmVhazsKKworCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQlicmVhazsKKwkJfQorCisJCWRldnNbaV0gPSBkZXY7CisJCXNoYXBlcnNfcmVnaXN0ZXJlZCsrOworCX0KKworCWlmICghc2hhcGVyc19yZWdpc3RlcmVkKSB7CisJCWtmcmVlKGRldnMpOworCQlkZXZzID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gKHNoYXBlcnNfcmVnaXN0ZXJlZCA/IDAgOiAtRU5PREVWKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNoYXBlcl9leGl0ICh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNoYXBlcnNfcmVnaXN0ZXJlZDsgaSsrKSB7CisJCWlmIChkZXZzW2ldKSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXZzW2ldKTsKKwkJCWZyZWVfbmV0ZGV2KGRldnNbaV0pOworCQl9CisJfQorCisJa2ZyZWUoZGV2cyk7CisJZGV2cyA9IE5VTEw7Cit9CisKK21vZHVsZV9pbml0KHNoYXBlcl9pbml0KTsKK21vZHVsZV9leGl0KHNoYXBlcl9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2lzOTAwLmMgYi9kcml2ZXJzL25ldC9zaXM5MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTlkOWFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2lzOTAwLmMKQEAgLTAsMCArMSwyMzcwIEBACisvKiBzaXM5MDAuYzogQSBTaVMgOTAwLzcwMTYgUENJIEZhc3QgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAgIENvcHlyaWdodCAxOTk5IFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW0gQ29ycG9yYXRpb24gCisgICBSZXZpc2lvbjoJMS4wOC4wOCBKYW4uIDIyIDIwMDUKKyAgIAorICAgTW9kaWZpZWQgZnJvbSB0aGUgZHJpdmVyIHdoaWNoIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBEb25hbGQgQmVja2VyLgorICAgCisgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAgRHJpdmVycyBiYXNlZCBvbiB0aGlzIHNrZWxldG9uIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdCByZXRhaW4KKyAgIHRoZSBhdXRob3JzaGlwIChpbXBsaWNpdCBjb3B5cmlnaHQpIG5vdGljZS4KKyAgIAorICAgUmVmZXJlbmNlczoKKyAgIFNpUyA3MDE2IEZhc3QgRXRoZXJuZXQgUENJIEJ1cyAxMC8xMDAgTWJwcyBMQU4gQ29udHJvbGxlciB3aXRoIE9uTm93IFN1cHBvcnQsCisgICBwcmVsaW1pbmFyeSBSZXYuIDEuMCBKYW4uIDE0LCAxOTk4CisgICBTaVMgOTAwIEZhc3QgRXRoZXJuZXQgUENJIEJ1cyAxMC8xMDAgTWJwcyBMQU4gU2luZ2xlIENoaXAgd2l0aCBPbk5vdyBTdXBwb3J0LAorICAgcHJlbGltaW5hcnkgUmV2LiAxLjAgTm92LiAxMCwgMTk5OAorICAgU2lTIDcwMTQgU2luZ2xlIENoaXAgMTAwQkFTRS1UWC8xMEJBU0UtVCBQaHlzaWNhbCBMYXllciBTb2x1dGlvbiwKKyAgIHByZWxpbWluYXJ5IFJldi4gMS4wIEphbi4gMTgsIDE5OTgKKworICAgUmV2IDEuMDguMDggSmFuLiAyMiAyMDA1IERhbmllbGUgVmVuemFubyB1c2UgbmV0aWZfbXNnIGZvciBkZWJ1Z2dpbmcgbWVzc2FnZXMKKyAgIFJldiAxLjA4LjA3IE5vdi4gIDIgMjAwMyBEYW5pZWxlIFZlbnphbm8gPHdlYnZlbnphQGxpYmVyby5pdD4gYWRkIHN1c3BlbmQvcmVzdW1lIHN1cHBvcnQKKyAgIFJldiAxLjA4LjA2IFNlcC4gMjQgMjAwMiBNdWZhc2EgWWFuZyBidWcgZml4IGZvciBUeCB0aW1lb3V0ICYgYWRkIFNpUzk2MyBzdXBwb3J0CisgICBSZXYgMS4wOC4wNSBKdW4uICA2IDIwMDIgTXVmYXNhIFlhbmcgYnVnIGZpeCBmb3IgcmVhZF9lZXByb20gJiBUeCBkZXNjcmlwdG9yIG92ZXItYm91bmRhcnkKKyAgIFJldiAxLjA4LjA0IEFwci4gMjUgMjAwMiBNdWZhc2EgWWFuZyA8bXVmYXNhQHNpcy5jb20udHc+IGFkZGVkIFNpUzk2MiBzdXBwb3J0CisgICBSZXYgMS4wOC4wMyBGZWIuICAxIDIwMDIgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPiB1cGRhdGUgdG8gdXNlIGxpYnJhcnkgY3JjMzIgZnVuY3Rpb24KKyAgIFJldiAxLjA4LjAyIE5vdi4gMzAgMjAwMSBIdWktRmVuIEhzdSB3b3JrYXJvdW5kIGZvciBFREIgJiBidWcgZml4IGZvciBkaGNwIHByb2JsZW0KKyAgIFJldiAxLjA4LjAxIEF1Zy4gMjUgMjAwMSBIdWktRmVuIEhzdSB1cGRhdGUgZm9yIDYzMEVUICYgd29ya2Fyb3VuZCBmb3IgSUNTMTg5MyBQSFkKKyAgIFJldiAxLjA4LjAwIEp1bi4gMTEgMjAwMSBIdWktRmVuIEhzdSB3b3JrYXJvdW5kIGZvciBSVEw4MjAxIFBIWSBhbmQgc29tZSBidWcgZml4CisgICBSZXYgMS4wNy4xMSBBcHIuICAyIDIwMDEgSHVpLUZlbiBIc3UgdXBkYXRlcyBQQ0kgZHJpdmVycyB0byB1c2UgdGhlIG5ldyBwY2lfc2V0X2RtYV9tYXNrIGZvciBrZXJuZWwgMi40LjMKKyAgIFJldiAxLjA3LjEwIE1hci4gIDEgMjAwMSBIdWktRmVuIEhzdSA8aGZoc3VAc2lzLmNvbS50dz4gc29tZSBidWcgZml4ICYgNjM1TS9CIHN1cHBvcnQgCisgICBSZXYgMS4wNy4wOSBGZWIuICA5IDIwMDEgRGF2ZSBKb25lcyA8ZGF2ZWpAc3VzZS5kZT4gUENJIGVuYWJsZSBjbGVhbnVwCisgICBSZXYgMS4wNy4wOCBKYW4uICA4IDIwMDEgTGVpLUNodW4gQ2hhbmcgYWRkZWQgUlRMODIwMSBQSFkgc3VwcG9ydAorICAgUmV2IDEuMDcuMDcgTm92LiAyOSAyMDAwIExlaS1DaHVuIENoYW5nIGFkZGVkIGtlcm5lbC1kb2MgZXh0cmFjdGFibGUgZG9jdW1lbnRhdGlvbiBhbmQgNjMwIHdvcmthcm91bmQgZml4CisgICBSZXYgMS4wNy4wNiBOb3YuICA3IDIwMDAgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPiBzb21lIGJ1ZyBmaXggYW5kIGNsZWFuaW5nCisgICBSZXYgMS4wNy4wNSBOb3YuICA2IDIwMDAgbWV0YXBpcmF0PG1ldGFwaXJhdEBnbXguZGU+IGNvbnRyaWJ1dGUgbWVkaWEgdHlwZSBzZWxlY3QgYnkgaWZjb25maWcKKyAgIFJldiAxLjA3LjA0IFNlcC4gIDYgMjAwMCBMZWktQ2h1biBDaGFuZyBhZGRlZCBJQ1MxODkzIFBIWSBzdXBwb3J0CisgICBSZXYgMS4wNy4wMyBBdWcuIDI0IDIwMDAgTGVpLUNodW4gQ2hhbmcgKGxjY2hhbmdAc2lzLmNvbS50dykgbW9kaWZpZWQgNjMwRSBlcWF1bGl6ZXIgd29ya2Fyb3VuZCBydWxlCisgICBSZXYgMS4wNy4wMSBBdWcuIDA4IDIwMDAgT2xsaWUgTGhvIG1pbm9yIHVwZGF0ZSBmb3IgU2lTIDYzMEUgYW5kIFNpUyA2MzBFIEExCisgICBSZXYgMS4wNyAgICBNYXIuIDA3IDIwMDAgT2xsaWUgTGhvIGJ1ZyBmaXggaW4gUnggYnVmZmVyIHJpbmcKKyAgIFJldiAxLjA2LjA0IEZlYi4gMTEgMjAwMCBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+IHNvZnRuZXQgYW5kIGluaXQgZm9yIGtlcm5lbCAyLjQKKyAgIFJldiAxLjA2LjAzIERlYy4gMjMgMTk5OSBPbGxpZSBMaG8gVGhpcmQgcmVsZWFzZQorICAgUmV2IDEuMDYuMDIgTm92LiAyMyAxOTk5IE9sbGllIExobyBidWcgaW4gbWFjIHByb2JpbmcgZml4ZWQKKyAgIFJldiAxLjA2LjAxIE5vdi4gMTYgMTk5OSBPbGxpZSBMaG8gQ1JDIGNhbGN1bGF0aW9uIHByb3ZpZGUgYnkgSm9zZXBoIFpiaWNpYWsgKGltMTR1MmNAcHJpbWVuZXQuY29tKQorICAgUmV2IDEuMDYgTm92LiA0IDE5OTkgT2xsaWUgTGhvIChvbGxpZUBzaXMuY29tLnR3KSBTZWNvbmQgcmVsZWFzZQorICAgUmV2IDEuMDUuMDUgT2N0LiAyOSAxOTk5IE9sbGllIExobyAob2xsaWVAc2lzLmNvbS50dykgU2luZ2xlIGJ1ZmZlciBUeC9SeAorICAgQ2hpbi1TaGFuIExpIChsY3NAc2lzLmNvbS50dykgQWRkZWQgQU1EIEFtNzljOTAxIEhvbWVQTkEgUEhZIHN1cHBvcnQKKyAgIFJldiAxLjA1IEF1Zy4gNyAxOTk5IEppbSBIdWFuZyAoY21odWFuZ0BzaXMuY29tLnR3KSBJbml0aWFsIHJlbGVhc2UKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4gICAgICAvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBVc2VyIHNwYWNlIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zICovCisKKyNpbmNsdWRlICJzaXM5MDAuaCIKKworI2RlZmluZSBTSVM5MDBfTU9EVUxFX05BTUUgInNpczkwMCIKKyNkZWZpbmUgU0lTOTAwX0RSVl9WRVJTSU9OICJ2MS4wOC4wOCBKYW4uIDIyIDIwMDUiCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KK0tFUk5fSU5GTyAic2lzOTAwLmM6ICIgU0lTOTAwX0RSVl9WRVJTSU9OICJcbiI7CisKK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gNDA7CitzdGF0aWMgaW50IG11bHRpY2FzdF9maWx0ZXJfbGltaXQgPSAxMjg7CisKK3N0YXRpYyBpbnQgc2lzOTAwX2RlYnVnID0gLTE7IC8qIFVzZSBTSVM5MDBfREVGX01TRyBhcyB2YWx1ZSAqLworCisjZGVmaW5lIFNJUzkwMF9ERUZfTVNHIFwKKwkoTkVUSUZfTVNHX0RSVgkJfCBcCisJIE5FVElGX01TR19MSU5LCQl8IFwKKwkgTkVUSUZfTVNHX1JYX0VSUgl8IFwKKwkgTkVUSUZfTVNHX1RYX0VSUikKKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoNCpIWikKKy8qIFNpUyA5MDAgaXMgY2FwYWJsZSBvZiAzMiBiaXRzIEJNIERNQSAqLworI2RlZmluZSBTSVM5MDBfRE1BX01BU0sgMHhmZmZmZmZmZgorCitlbnVtIHsKKwlTSVNfOTAwID0gMCwKKwlTSVNfNzAxNgorfTsKK3N0YXRpYyBjaGFyICogY2FyZF9uYW1lc1tdID0geworCSJTaVMgOTAwIFBDSSBGYXN0IEV0aGVybmV0IiwKKwkiU2lTIDcwMTYgUENJIEZhc3QgRXRoZXJuZXQiCit9Oworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNpczkwMF9wY2lfdGJsIFtdID0geworCXtQQ0lfVkVORE9SX0lEX1NJLCBQQ0lfREVWSUNFX0lEX1NJXzkwMCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgU0lTXzkwMH0sCisJe1BDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNzAxNiwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgU0lTXzcwMTZ9LAorCXswLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIHNpczkwMF9wY2lfdGJsKTsKKworc3RhdGljIHZvaWQgc2lzOTAwX3JlYWRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgpOworCitzdGF0aWMgc3RydWN0IG1paV9jaGlwX2luZm8geworCWNvbnN0IGNoYXIgKiBuYW1lOworCXUxNiBwaHlfaWQwOworCXUxNiBwaHlfaWQxOworCXU4ICBwaHlfdHlwZXM7CisjZGVmaW5lCUhPTUUgCTB4MDAwMQorI2RlZmluZSBMQU4JMHgwMDAyCisjZGVmaW5lIE1JWAkweDAwMDMKKyNkZWZpbmUgVU5LTk9XTgkweDAKK30gbWlpX2NoaXBfdGFibGVbXSA9IHsKKwl7ICJTaVMgOTAwIEludGVybmFsIE1JSSBQSFkiLCAJCTB4MDAxZCwgMHg4MDAwLCBMQU4gfSwKKwl7ICJTaVMgNzAxNCBQaHlzaWNhbCBMYXllciBTb2x1dGlvbiIsIAkweDAwMTYsIDB4ZjgzMCwgTEFOIH0sCisJeyAiQWx0aW1hdGEgQUMxMDFMRiBQSFkiLCAgICAgICAgICAgICAgIDB4MDAyMiwgMHg1NTIwLCBMQU4gfSwKKwl7ICJBTUQgNzlDOTAxIDEwQkFTRS1UIFBIWSIsICAJCTB4MDAwMCwgMHg2QjcwLCBMQU4gfSwKKwl7ICJBTUQgNzlDOTAxIEhvbWVQTkEgUEhZIiwJCTB4MDAwMCwgMHg2QjkwLCBIT01FfSwKKwl7ICJJQ1MgTEFOIFBIWSIsCQkJMHgwMDE1LCAweEY0NDAsIExBTiB9LAorCXsgIk5TIDgzODUxIFBIWSIsCQkJMHgyMDAwLCAweDVDMjAsIE1JWCB9LAorCXsgIk5TIDgzODQ3IFBIWSIsICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAsIDB4NUMzMCwgTUlYIH0sCisJeyAiUmVhbHRlayBSVEw4MjAxIFBIWSIsCQkweDAwMDAsIDB4ODIwMCwgTEFOIH0sCisJeyAiVklBIDYxMDMgUEhZIiwJCQkweDAxMDEsIDB4OGYyMCwgTEFOIH0sCisJe05VTEwsfSwKK307CisKK3N0cnVjdCBtaWlfcGh5IHsKKwlzdHJ1Y3QgbWlpX3BoeSAqIG5leHQ7CisJaW50IHBoeV9hZGRyOworCXUxNiBwaHlfaWQwOworCXUxNiBwaHlfaWQxOworCXUxNiBzdGF0dXM7CisJdTggIHBoeV90eXBlczsKK307CisKK3R5cGVkZWYgc3RydWN0IF9CdWZmZXJEZXNjIHsKKwl1MzIgbGluazsKKwl1MzIgY21kc3RzOworCXUzMiBidWZwdHI7Cit9IEJ1ZmZlckRlc2M7CisKK3N0cnVjdCBzaXM5MDBfcHJpdmF0ZSB7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2OworCisJc3BpbmxvY2tfdCBsb2NrOworCisJc3RydWN0IG1paV9waHkgKiBtaWk7CisJc3RydWN0IG1paV9waHkgKiBmaXJzdF9taWk7IC8qIHJlY29yZCB0aGUgZmlyc3QgbWlpIHN0cnVjdHVyZSAqLworCXVuc2lnbmVkIGludCBjdXJfcGh5OworCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7IC8qIExpbmsgc3RhdHVzIGRldGVjdGlvbiB0aW1lci4gKi8KKwl1OCBhdXRvbmdfY29tcGxldGU7IC8qIDE6IGF1dG8tbmVnb3RpYXRlIGNvbXBsZXRlICAqLworCisJdTMyIG1zZ19lbmFibGU7CisKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCBkaXJ0eV9yeDsgLyogcHJvZHVjZXIvY29tc3VtZXIgcG9pbnRlcnMgZm9yIFR4L1J4IHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3R4LCBkaXJ0eV90eDsKKworCS8qIFRoZSBzYXZlZCBhZGRyZXNzIG9mIGEgc2VudC9yZWNlaXZlLWluLXBsYWNlIHBhY2tldCBidWZmZXIgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tidWZmW05VTV9UWF9ERVNDXTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmW05VTV9SWF9ERVNDXTsKKwlCdWZmZXJEZXNjICp0eF9yaW5nOworCUJ1ZmZlckRlc2MgKnJ4X3Jpbmc7CisKKwlkbWFfYWRkcl90IHR4X3JpbmdfZG1hOworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisKKwl1bnNpZ25lZCBpbnQgdHhfZnVsbDsgLyogVGhlIFR4IHF1ZXVlIGlzIGZ1bGwuICovCisJdTggaG9zdF9icmlkZ2VfcmV2OworCXU4IGNoaXBzZXRfcmV2OworfTsKKworTU9EVUxFX0FVVEhPUigiSmltIEh1YW5nIDxjbWh1YW5nQHNpcy5jb20udHc+LCBPbGxpZSBMaG8gPG9sbGllQHNpcy5jb20udHc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpUyA5MDAgUENJIEZhc3QgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShtdWx0aWNhc3RfZmlsdGVyX2xpbWl0LCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShzaXM5MDBfZGVidWcsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG11bHRpY2FzdF9maWx0ZXJfbGltaXQsICJTaVMgOTAwLzcwMTYgbWF4aW11bSBudW1iZXIgb2YgZmlsdGVyZWQgbXVsdGljYXN0IGFkZHJlc3NlcyIpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfaW50ZXJydXB0X3dvcmssICJTaVMgOTAwLzcwMTYgbWF4aW11bSBldmVudHMgaGFuZGxlZCBwZXIgaW50ZXJydXB0Iik7CitNT0RVTEVfUEFSTV9ERVNDKHNpczkwMF9kZWJ1ZywgIlNpUyA5MDAvNzAxNiBiaXRtYXBwZWQgZGVidWdnaW5nIG1lc3NhZ2UgbGV2ZWwiKTsKKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBzaXM5MDBfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorc3RhdGljIGludCBzaXM5MDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitzdGF0aWMgaW50IHNpczkwMF9taWlfcHJvYmUgKHN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2Rldik7CitzdGF0aWMgdm9pZCBzaXM5MDBfaW5pdF9yeGZpbHRlciAoc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2KTsKK3N0YXRpYyB1MTYgcmVhZF9lZXByb20obG9uZyBpb2FkZHIsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdTE2IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbCk7CitzdGF0aWMgdm9pZCBzaXM5MDBfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHNpczkwMF9jaGVja19tb2RlIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldiwgc3RydWN0IG1paV9waHkgKm1paV9waHkpOworc3RhdGljIHZvaWQgc2lzOTAwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworc3RhdGljIHZvaWQgc2lzOTAwX2luaXRfdHhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitzdGF0aWMgdm9pZCBzaXM5MDBfaW5pdF9yeF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK3N0YXRpYyBpbnQgc2lzOTAwX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworc3RhdGljIGludCBzaXM5MDBfcngoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworc3RhdGljIHZvaWQgc2lzOTAwX2ZpbmlzaF94bWl0IChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc2lzOTAwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgc2lzOTAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK3N0YXRpYyBpbnQgbWlpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2lzOTAwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitzdGF0aWMgdTE2IHNpczkwMF9tY2FzdF9iaXRucih1OCAqYWRkciwgdTggcmV2aXNpb24pOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworc3RhdGljIHZvaWQgc2lzOTAwX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK3N0YXRpYyB2b2lkIHNpczYzMF9zZXRfZXEoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHU4IHJldmlzaW9uKTsKK3N0YXRpYyBpbnQgc2lzOTAwX3NldF9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApOworc3RhdGljIHUxNiBzaXM5MDBfZGVmYXVsdF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2KTsKK3N0YXRpYyB2b2lkIHNpczkwMF9zZXRfY2FwYWJpbGl0eSggc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgLHN0cnVjdCBtaWlfcGh5ICpwaHkpOworc3RhdGljIHUxNiBzaXM5MDBfcmVzZXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgcGh5X2FkZHIpOworc3RhdGljIHZvaWQgc2lzOTAwX2F1dG9fbmVnb3RpYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgcGh5X2FkZHIpOworc3RhdGljIHZvaWQgc2lzOTAwX3NldF9tb2RlIChsb25nIGlvYWRkciwgaW50IHNwZWVkLCBpbnQgZHVwbGV4KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgc2lzOTAwX2V0aHRvb2xfb3BzOworCisvKioKKyAqCXNpczkwMF9nZXRfbWFjX2FkZHIgLSBHZXQgTUFDIGFkZHJlc3MgZm9yIHN0YW5kIGFsb25lIFNpUzkwMCBtb2RlbAorICoJQHBjaV9kZXY6IHRoZSBzaXM5MDAgcGNpIGRldmljZQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGdldCBhZGRyZXNzIGZvciAKKyAqCisgKglPbGRlciBTaVM5MDAgYW5kIGZyaWVuZHMsIHVzZSBFRVBST00gdG8gc3RvcmUgTUFDIGFkZHJlc3MuCisgKglNQUMgYWRkcmVzcyBpcyByZWFkIGZyb20gcmVhZF9lZXByb20oKSBpbnRvIEBuZXRfZGV2LT5kZXZfYWRkci4KKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaXM5MDBfZ2V0X21hY19hZGRyKHN0cnVjdCBwY2lfZGV2ICogcGNpX2Rldiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJbG9uZyBpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCk7CisJdTE2IHNpZ25hdHVyZTsKKwlpbnQgaTsKKworCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIHNhbmUgRUVQUk9NICovCisJc2lnbmF0dXJlID0gKHUxNikgcmVhZF9lZXByb20oaW9hZGRyLCBFRVBST01TaWduYXR1cmUpOyAgICAKKwlpZiAoc2lnbmF0dXJlID09IDB4ZmZmZiB8fCBzaWduYXR1cmUgPT0gMHgwMDAwKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogRXJyb3IgRUVSUE9NIHJlYWQgJXhcbiIsIAorCQkJcGNpX25hbWUocGNpX2RldiksIHNpZ25hdHVyZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIGdldCBNQUMgYWRkcmVzcyBmcm9tIEVFUFJPTSAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJICAgICAgICAoKHUxNiAqKShuZXRfZGV2LT5kZXZfYWRkcikpW2ldID0gcmVhZF9lZXByb20oaW9hZGRyLCBpK0VFUFJPTU1BQ0FkZHIpOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJc2lzNjMwZV9nZXRfbWFjX2FkZHIgLSBHZXQgTUFDIGFkZHJlc3MgZm9yIFNpUzYzMEUgbW9kZWwKKyAqCUBwY2lfZGV2OiB0aGUgc2lzOTAwIHBjaSBkZXZpY2UKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBnZXQgYWRkcmVzcyBmb3IgCisgKgorICoJU2lTNjMwRSBtb2RlbCwgdXNlIEFQQyBDTU9TIFJBTSB0byBzdG9yZSBNQUMgYWRkcmVzcy4KKyAqCUFQQyBDTU9TIFJBTSBpcyBhY2Nlc3NlZCB0aHJvdWdoIElTQSBicmlkZ2UuCisgKglNQUMgYWRkcmVzcyBpcyByZWFkIGludG8gQG5ldF9kZXYtPmRldl9hZGRyLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpczYzMGVfZ2V0X21hY19hZGRyKHN0cnVjdCBwY2lfZGV2ICogcGNpX2RldiwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKmlzYV9icmlkZ2UgPSBOVUxMOworCXU4IHJlZzsKKwlpbnQgaTsKKworCWlzYV9icmlkZ2UgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1NJLCAweDAwMDgsIGlzYV9icmlkZ2UpOworCWlmICghaXNhX2JyaWRnZSkKKwkJaXNhX2JyaWRnZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU0ksIDB4MDAxOCwgaXNhX2JyaWRnZSk7CisJaWYgKCFpc2FfYnJpZGdlKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4gbm90IGZpbmQgSVNBIGJyaWRnZVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBjaV9kZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGlzYV9icmlkZ2UsIDB4NDgsICZyZWcpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDQ4LCByZWcgfCAweDQwKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJb3V0YigweDA5ICsgaSwgMHg3MCk7CisJCSgodTggKikobmV0X2Rldi0+ZGV2X2FkZHIpKVtpXSA9IGluYigweDcxKTsgCisJfQorCXBjaV93cml0ZV9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDQ4LCByZWcgJiB+MHg0MCk7CisJcGNpX2Rldl9wdXQoaXNhX2JyaWRnZSk7CisKKwlyZXR1cm4gMTsKK30KKworCisvKioKKyAqCXNpczYzNV9nZXRfbWFjX2FkZHIgLSBHZXQgTUFDIGFkZHJlc3MgZm9yIFNJUzYzNSBtb2RlbAorICoJQHBjaV9kZXY6IHRoZSBzaXM5MDAgcGNpIGRldmljZQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGdldCBhZGRyZXNzIGZvciAKKyAqCisgKglTaVM2MzUgbW9kZWwsIHNldCBNQUMgUmVsb2FkIEJpdCB0byBsb2FkIE1hYyBhZGRyZXNzIGZyb20gQVBDCisgKgl0byByZmRyLiByZmRyIGlzIGFjY2Vzc2VkIHRocm91Z2ggcmZjci4gTUFDIGFkZHJlc3MgaXMgcmVhZCBpbnRvIAorICoJQG5ldF9kZXYtPmRldl9hZGRyLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpczYzNV9nZXRfbWFjX2FkZHIoc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2LAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwl1MzIgcmZjclNhdmU7CisJdTMyIGk7CisKKwlyZmNyU2F2ZSA9IGlubChyZmNyICsgaW9hZGRyKTsKKworCW91dGwocmZjclNhdmUgfCBSRUxPQUQsIGlvYWRkciArIGNyKTsKKwlvdXRsKDAsIGlvYWRkciArIGNyKTsKKworCS8qIGRpc2FibGUgcGFja2V0IGZpbHRlcmluZyBiZWZvcmUgc2V0dGluZyBmaWx0ZXIgKi8KKwlvdXRsKHJmY3JTYXZlICYgflJGRU4sIHJmY3IgKyBpb2FkZHIpOworCisJLyogbG9hZCBNQUMgYWRkciB0byBmaWx0ZXIgZGF0YSByZWdpc3RlciAqLworCWZvciAoaSA9IDAgOyBpIDwgMyA7IGkrKykgeworCQlvdXRsKChpIDw8IFJGQUREUl9zaGlmdCksIGlvYWRkciArIHJmY3IpOworCQkqKCAoKHUxNiAqKW5ldF9kZXYtPmRldl9hZGRyKSArIGkpID0gaW53KGlvYWRkciArIHJmZHIpOworCX0KKworCS8qIGVuYWJsZSBwYWNrZXQgZmlsdGVyaW5nICovCisJb3V0bChyZmNyU2F2ZSB8IFJGRU4sIHJmY3IgKyBpb2FkZHIpOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJc2lzOTZ4X2dldF9tYWNfYWRkciAtIEdldCBNQUMgYWRkcmVzcyBmb3IgU2lTOTYyIG9yIFNpUzk2MyBtb2RlbAorICoJQHBjaV9kZXY6IHRoZSBzaXM5MDAgcGNpIGRldmljZQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGdldCBhZGRyZXNzIGZvciAKKyAqCisgKglTaVM5NjIgb3IgU2lTOTYzIG1vZGVsLCB1c2UgRUVQUk9NIHRvIHN0b3JlIE1BQyBhZGRyZXNzLiBBbmQgRUVQUk9NIAorICoJaXMgc2hhcmVkIGJ5CisgKglMQU4gYW5kIDEzOTQuIFdoZW4gYWNjZXNzIEVFUFJPTSwgc2VuZCBFRVJFUSBzaWduYWwgdG8gaGFyZHdhcmUgZmlyc3QgCisgKglhbmQgd2FpdCBmb3IgRUVHTlQuIElmIEVFR05UIGlzIE9OLCBFRVBST00gaXMgcGVybWl0dGVkIHRvIGJlIGFjY2VzcyAKKyAqCWJ5IExBTiwgb3RoZXJ3aXNlIGlzIG5vdC4gQWZ0ZXIgTUFDIGFkZHJlc3MgaXMgcmVhZCBmcm9tIEVFUFJPTSwgc2VuZAorICoJRUVET05FIHNpZ25hbCB0byByZWZ1c2UgRUVQUk9NIGFjY2VzcyBieSBMQU4uIAorICoJVGhlIEVFUFJPTSBtYXAgb2YgU2lTOTYyIG9yIFNpUzk2MyBpcyBkaWZmZXJlbnQgdG8gU2lTOTAwLiAKKyAqCVRoZSBzaWduYXR1cmUgZmllbGQgaW4gU2lTOTYyIG9yIFNpUzk2MyBzcGVjIGlzIG1lYW5pbmdsZXNzLiAKKyAqCU1BQyBhZGRyZXNzIGlzIHJlYWQgaW50byBAbmV0X2Rldi0+ZGV2X2FkZHIuCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgc2lzOTZ4X2dldF9tYWNfYWRkcihzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXYsCisJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCWxvbmcgZWVfYWRkciA9IGlvYWRkciArIG1lYXI7CisJdTMyIHdhaXR0aW1lID0gMDsKKwlpbnQgaTsKKwkKKwlvdXRsKEVFUkVRLCBlZV9hZGRyKTsKKwl3aGlsZSh3YWl0dGltZSA8IDIwMDApIHsKKwkJaWYoaW5sKGVlX2FkZHIpICYgRUVHTlQpIHsKKworCQkJLyogZ2V0IE1BQyBhZGRyZXNzIGZyb20gRUVQUk9NICovCisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJICAgICAgICAoKHUxNiAqKShuZXRfZGV2LT5kZXZfYWRkcikpW2ldID0gcmVhZF9lZXByb20oaW9hZGRyLCBpK0VFUFJPTU1BQ0FkZHIpOworCisJCQlvdXRsKEVFRE9ORSwgZWVfYWRkcik7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIHsKKwkJCXVkZWxheSgxKTsJCisJCQl3YWl0dGltZSArKzsKKwkJfQorCX0KKwlvdXRsKEVFRE9ORSwgZWVfYWRkcik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2lzOTAwX3Byb2JlIC0gUHJvYmUgZm9yIHNpczkwMCBkZXZpY2UKKyAqCUBwY2lfZGV2OiB0aGUgc2lzOTAwIHBjaSBkZXZpY2UKKyAqCUBwY2lfaWQ6IHRoZSBwY2kgZGV2aWNlIElECisgKgorICoJQ2hlY2sgYW5kIHByb2JlIHNpczkwMCBuZXQgZGV2aWNlIGZvciBAcGNpX2Rldi4KKyAqCUdldCBtYWMgYWRkcmVzcyBhY2NvcmRpbmcgdG8gdGhlIGNoaXAgcmV2aXNpb24sIAorICoJYW5kIGFzc2lnbiBTaVM5MDAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqCWllOiBzaXM5MDBfb3BlbigpLCBzaXM5MDBfc3RhcnRfeG1pdCgpLCBzaXM5MDBfY2xvc2UoKSwgZXRjLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpczkwMF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlkbWFfYWRkcl90IHJpbmdfZG1hOworCXZvaWQgKnJpbmdfc3BhY2U7CisJbG9uZyBpb2FkZHI7CisJaW50IGksIHJldDsKKwljaGFyICpjYXJkX25hbWUgPSBjYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdOworCWNvbnN0IGNoYXIgKmRldl9uYW1lID0gcGNpX25hbWUocGNpX2Rldik7CisKKy8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCisJLyogc2V0dXAgdmFyaW91cyBiaXRzIGluIFBDSSBjb21tYW5kIHJlZ2lzdGVyICovCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJaWYocmV0KSByZXR1cm4gcmV0OworCQorCWkgPSBwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIFNJUzkwMF9ETUFfTUFTSyk7CisJaWYoaSl7CisJCXByaW50ayhLRVJOX0VSUiAic2lzOTAwLmM6IGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IgorCQkJIjMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJcmV0dXJuIGk7CisJfQorCQorCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOworCQorCW5ldF9kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHNpczkwMF9wcml2YXRlKSk7CisJaWYgKCFuZXRfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlTRVRfTU9EVUxFX09XTkVSKG5ldF9kZXYpOworCVNFVF9ORVRERVZfREVWKG5ldF9kZXYsICZwY2lfZGV2LT5kZXYpOworCisJLyogV2UgZG8gYSByZXF1ZXN0X3JlZ2lvbigpIHRvIHJlZ2lzdGVyIC9wcm9jL2lvcG9ydHMgaW5mby4gKi8KKwlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCk7CQorCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpX2RldiwgInNpczkwMCIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dDsKKworCXNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwluZXRfZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJbmV0X2Rldi0+aXJxID0gcGNpX2Rldi0+aXJxOworCXNpc19wcml2LT5wY2lfZGV2ID0gcGNpX2RldjsKKwlzcGluX2xvY2tfaW5pdCgmc2lzX3ByaXYtPmxvY2spOworCisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIG5ldF9kZXYpOworCisJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaV9kZXYsIFRYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CisJaWYgKCFyaW5nX3NwYWNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9jbGVhcmRldjsKKwl9CisJc2lzX3ByaXYtPnR4X3JpbmcgPSAoQnVmZmVyRGVzYyAqKXJpbmdfc3BhY2U7CisJc2lzX3ByaXYtPnR4X3JpbmdfZG1hID0gcmluZ19kbWE7CisKKwlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2RldiwgUlhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmdfc3BhY2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfdW5tYXBfdHg7CisJfQorCXNpc19wcml2LT5yeF9yaW5nID0gKEJ1ZmZlckRlc2MgKilyaW5nX3NwYWNlOworCXNpc19wcml2LT5yeF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCQkKKwkvKiBUaGUgU2lTOTAwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJbmV0X2Rldi0+b3BlbiA9ICZzaXM5MDBfb3BlbjsKKwluZXRfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc2lzOTAwX3N0YXJ0X3htaXQ7CisJbmV0X2Rldi0+c3RvcCA9ICZzaXM5MDBfY2xvc2U7CisJbmV0X2Rldi0+Z2V0X3N0YXRzID0gJnNpczkwMF9nZXRfc3RhdHM7CisJbmV0X2Rldi0+c2V0X2NvbmZpZyA9ICZzaXM5MDBfc2V0X2NvbmZpZzsKKwluZXRfZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7CisJbmV0X2Rldi0+ZG9faW9jdGwgPSAmbWlpX2lvY3RsOworCW5ldF9kZXYtPnR4X3RpbWVvdXQgPSBzaXM5MDBfdHhfdGltZW91dDsKKwluZXRfZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisJbmV0X2Rldi0+ZXRodG9vbF9vcHMgPSAmc2lzOTAwX2V0aHRvb2xfb3BzOworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKyAgICAgICAgbmV0X2Rldi0+cG9sbF9jb250cm9sbGVyID0gJnNpczkwMF9wb2xsOworI2VuZGlmCisKKwlpZiAoc2lzOTAwX2RlYnVnID4gMCkKKwkJc2lzX3ByaXYtPm1zZ19lbmFibGUgPSBzaXM5MDBfZGVidWc7CisJZWxzZQorCQlzaXNfcHJpdi0+bXNnX2VuYWJsZSA9IFNJUzkwMF9ERUZfTVNHOworCQkKKwkvKiBHZXQgTWFjIGFkZHJlc3MgYWNjb3JkaW5nIHRvIHRoZSBjaGlwIHJldmlzaW9uICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmKHNpc19wcml2LT5jaGlwc2V0X3JldikpOworCWlmKG5ldGlmX21zZ19wcm9iZShzaXNfcHJpdikpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZGV0ZWN0ZWQgcmV2aXNpb24gJTIuMngsICIKKwkJCQkidHJ5aW5nIHRvIGdldCBNQUMgYWRkcmVzcy4uLlxuIiwKKwkJCQlkZXZfbmFtZSwgc2lzX3ByaXYtPmNoaXBzZXRfcmV2KTsKKwkKKwlyZXQgPSAwOworCWlmIChzaXNfcHJpdi0+Y2hpcHNldF9yZXYgPT0gU0lTNjMwRV85MDBfUkVWKQorCQlyZXQgPSBzaXM2MzBlX2dldF9tYWNfYWRkcihwY2lfZGV2LCBuZXRfZGV2KTsKKwllbHNlIGlmICgoc2lzX3ByaXYtPmNoaXBzZXRfcmV2ID4gMHg4MSkgJiYgKHNpc19wcml2LT5jaGlwc2V0X3JldiA8PSAweDkwKSApCisJCXJldCA9IHNpczYzNV9nZXRfbWFjX2FkZHIocGNpX2RldiwgbmV0X2Rldik7CisJZWxzZSBpZiAoc2lzX3ByaXYtPmNoaXBzZXRfcmV2ID09IFNJUzk2eF85MDBfUkVWKQorCQlyZXQgPSBzaXM5NnhfZ2V0X21hY19hZGRyKHBjaV9kZXYsIG5ldF9kZXYpOworCWVsc2UKKwkJcmV0ID0gc2lzOTAwX2dldF9tYWNfYWRkcihwY2lfZGV2LCBuZXRfZGV2KTsKKworCWlmIChyZXQgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2Fubm90IHJlYWQgTUFDIGFkZHJlc3MuXG4iLCBkZXZfbmFtZSk7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3VubWFwX3J4OworCX0KKwkKKwkvKiA2MzBFVCA6IHNldCB0aGUgbWlpIGFjY2VzcyBtb2RlIGFzIHNvZnR3YXJlLW1vZGUgKi8KKwlpZiAoc2lzX3ByaXYtPmNoaXBzZXRfcmV2ID09IFNJUzYzMEVUXzkwMF9SRVYpCisJCW91dGwoQUNDRVNTTU9ERSB8IGlubChpb2FkZHIgKyBjciksIGlvYWRkciArIGNyKTsKKworCS8qIHByb2JlIGZvciBtaWkgdHJhbnNjZWl2ZXIgKi8KKwlpZiAoc2lzOTAwX21paV9wcm9iZShuZXRfZGV2KSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFcnJvciBwcm9iaW5nIE1JSSBkZXZpY2UuXG4iLAorCQkgICAgICAgZGV2X25hbWUpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl91bm1hcF9yeDsKKwl9CisKKwkvKiBzYXZlIG91ciBob3N0IGJyaWRnZSByZXZpc2lvbiAqLworCWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNjMwLCBOVUxMKTsKKwlpZiAoZGV2KSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmc2lzX3ByaXYtPmhvc3RfYnJpZGdlX3Jldik7CisJCXBjaV9kZXZfcHV0KGRldik7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3VubWFwX3J4OworCisJLyogcHJpbnQgc29tZSBpbmZvcm1hdGlvbiBhYm91dCBvdXIgTklDICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0ICUjbHgsIElSUSAlZCwgIiwgbmV0X2Rldi0+bmFtZSwKKwkgICAgICAgY2FyZF9uYW1lLCBpb2FkZHIsIG5ldF9kZXYtPmlycSk7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJcHJpbnRrKCIlMi4yeDoiLCAodTgpbmV0X2Rldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiJTIuMnguXG4iLCBuZXRfZGV2LT5kZXZfYWRkcltpXSk7CisKKwlyZXR1cm4gMDsKKworIGVycl91bm1hcF9yeDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaV9kZXYsIFJYX1RPVEFMX1NJWkUsIHNpc19wcml2LT5yeF9yaW5nLAorCQlzaXNfcHJpdi0+cnhfcmluZ19kbWEpOworIGVycl91bm1hcF90eDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaV9kZXYsIFRYX1RPVEFMX1NJWkUsIHNpc19wcml2LT50eF9yaW5nLAorCQlzaXNfcHJpdi0+dHhfcmluZ19kbWEpOworIGVycl9vdXRfY2xlYXJkZXY6CisgCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXYpOworIGVycl9vdXQ6CisJZnJlZV9uZXRkZXYobmV0X2Rldik7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKglzaXM5MDBfbWlpX3Byb2JlIC0gUHJvYmUgTUlJIFBIWSBmb3Igc2lzOTAwCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gcHJvYmUgZm9yCisgKgkKKyAqCVNlYXJjaCBmb3IgdG90YWwgb2YgMzIgcG9zc2libGUgbWlpIHBoeSBhZGRyZXNzZXMuCisgKglJZGVudGlmeSBhbmQgc2V0IGN1cnJlbnQgcGh5IGlmIGZvdW5kIG9uZSwKKyAqCXJldHVybiBlcnJvciBpZiBpdCBmYWlsZWQgdG8gZm91bmQuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgc2lzOTAwX21paV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldF9kZXYpCit7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICogc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWNvbnN0IGNoYXIgKmRldl9uYW1lID0gcGNpX25hbWUoc2lzX3ByaXYtPnBjaV9kZXYpOworCXUxNiBwb2xsX2JpdCA9IE1JSV9TVEFUX0xJTkssIHN0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIDUgKiBIWjsKKwlpbnQgcGh5X2FkZHI7CisKKwlzaXNfcHJpdi0+bWlpID0gTlVMTDsKKworCS8qIHNlYXJjaCBmb3IgdG90YWwgb2YgMzIgcG9zc2libGUgbWlpIHBoeSBhZGRyZXNzZXMgKi8KKwlmb3IgKHBoeV9hZGRyID0gMDsgcGh5X2FkZHIgPCAzMjsgcGh5X2FkZHIrKykgewkKKwkJc3RydWN0IG1paV9waHkgKiBtaWlfcGh5ID0gTlVMTDsKKwkJdTE2IG1paV9zdGF0dXM7CisJCWludCBpOworCisJCW1paV9waHkgPSBOVUxMOworCQlmb3IoaSA9IDA7IGkgPCAyOyBpKyspCisJCQltaWlfc3RhdHVzID0gbWRpb19yZWFkKG5ldF9kZXYsIHBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKworCQlpZiAobWlpX3N0YXR1cyA9PSAweGZmZmYgfHwgbWlpX3N0YXR1cyA9PSAweDAwMDApIHsKKwkJCWlmIChuZXRpZl9tc2dfcHJvYmUoc2lzX3ByaXYpKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTUlJIGF0IGFkZHJlc3MgJWQiCisJCQkJCQkiIG5vdCBhY2Nlc3NpYmxlXG4iLAorCQkJCQkJZGV2X25hbWUsIHBoeV9hZGRyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQorCQlpZiAoKG1paV9waHkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlpX3BoeSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW5ub3QgYWxsb2NhdGUgbWVtIGZvciBzdHJ1Y3QgbWlpX3BoeVxuIik7CisJCQltaWlfcGh5ID0gc2lzX3ByaXYtPmZpcnN0X21paTsKKwkJCXdoaWxlIChtaWlfcGh5KSB7CisJCQkJc3RydWN0IG1paV9waHkgKnBoeTsKKwkJCQlwaHkgPSBtaWlfcGh5OworCQkJCW1paV9waHkgPSBtaWlfcGh5LT5uZXh0OworCQkJCWtmcmVlKHBoeSk7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJbWlpX3BoeS0+cGh5X2lkMCA9IG1kaW9fcmVhZChuZXRfZGV2LCBwaHlfYWRkciwgTUlJX1BIWV9JRDApOworCQltaWlfcGh5LT5waHlfaWQxID0gbWRpb19yZWFkKG5ldF9kZXYsIHBoeV9hZGRyLCBNSUlfUEhZX0lEMSk7CQkKKwkJbWlpX3BoeS0+cGh5X2FkZHIgPSBwaHlfYWRkcjsKKwkJbWlpX3BoeS0+c3RhdHVzID0gbWlpX3N0YXR1czsKKwkJbWlpX3BoeS0+bmV4dCA9IHNpc19wcml2LT5taWk7CisJCXNpc19wcml2LT5taWkgPSBtaWlfcGh5OworCQlzaXNfcHJpdi0+Zmlyc3RfbWlpID0gbWlpX3BoeTsKKworCQlmb3IgKGkgPSAwOyBtaWlfY2hpcF90YWJsZVtpXS5waHlfaWQxOyBpKyspCisJCQlpZiAoKG1paV9waHktPnBoeV9pZDAgPT0gbWlpX2NoaXBfdGFibGVbaV0ucGh5X2lkMCApICYmCisJCQkgICAgKChtaWlfcGh5LT5waHlfaWQxICYgMHhGRkYwKSA9PSBtaWlfY2hpcF90YWJsZVtpXS5waHlfaWQxKSl7CisJCQkJbWlpX3BoeS0+cGh5X3R5cGVzID0gbWlpX2NoaXBfdGFibGVbaV0ucGh5X3R5cGVzOworCQkJCWlmIChtaWlfY2hpcF90YWJsZVtpXS5waHlfdHlwZXMgPT0gTUlYKQorCQkJCQltaWlfcGh5LT5waHlfdHlwZXMgPQorCQkJCQkgICAgKG1paV9zdGF0dXMgJiAoTUlJX1NUQVRfQ0FOX1RYX0ZEWCB8IE1JSV9TVEFUX0NBTl9UWCkpID8gTEFOIDogSE9NRTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgdHJhbnNjZWl2ZXIgZm91bmQgIgorCQkJCQkJCSJhdCBhZGRyZXNzICVkLlxuIiwKKwkJCQkJCQlkZXZfbmFtZSwKKwkJCQkJCQltaWlfY2hpcF90YWJsZVtpXS5uYW1lLAorCQkJCQkJCXBoeV9hZGRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQlpZiggIW1paV9jaGlwX3RhYmxlW2ldLnBoeV9pZDEgKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5rbm93biBQSFkgdHJhbnNjZWl2ZXIgZm91bmQgYXQgYWRkcmVzcyAlZC5cbiIsCisJCQkgICAgICAgZGV2X25hbWUsIHBoeV9hZGRyKTsKKwkJCW1paV9waHktPnBoeV90eXBlcyA9IFVOS05PV047CisJCX0KKwl9CisJCisJaWYgKHNpc19wcml2LT5taWkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTm8gTUlJIHRyYW5zY2VpdmVycyBmb3VuZCFcbiIsIGRldl9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogc2VsZWN0IGRlZmF1bHQgUEhZIGZvciBtYWMgKi8KKwlzaXNfcHJpdi0+bWlpID0gTlVMTDsKKwlzaXM5MDBfZGVmYXVsdF9waHkoIG5ldF9kZXYgKTsKKworCS8qIFJlc2V0IHBoeSBpZiBkZWZhdWx0IHBoeSBpcyBpbnRlcm5hbCBzaXM5MDAgKi8KKyAgICAgICAgaWYgKChzaXNfcHJpdi0+bWlpLT5waHlfaWQwID09IDB4MDAxRCkgJiYKKwkgICAgKChzaXNfcHJpdi0+bWlpLT5waHlfaWQxJjB4RkZGMCkgPT0gMHg4MDAwKSkKKyAgICAgICAgCXN0YXR1cyA9IHNpczkwMF9yZXNldF9waHkobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHkpOworICAgICAgICAKKyAgICAgICAgLyogd29ya2Fyb3VuZCBmb3IgSUNTMTg5MyBQSFkgKi8KKyAgICAgICAgaWYgKChzaXNfcHJpdi0+bWlpLT5waHlfaWQwID09IDB4MDAxNSkgJiYKKyAgICAgICAgICAgICgoc2lzX3ByaXYtPm1paS0+cGh5X2lkMSYweEZGRjApID09IDB4RjQ0MCkpCisgICAgICAgICAgICAJbWRpb193cml0ZShuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgMHgwMDE4LCAweEQyMDApOworCisJaWYoc3RhdHVzICYgTUlJX1NUQVRfTElOSyl7CisJCXdoaWxlIChwb2xsX2JpdCkgeworCQkJeWllbGQoKTsKKworCQkJcG9sbF9iaXQgXj0gKG1kaW9fcmVhZChuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX1NUQVRVUykgJiBwb2xsX2JpdCk7CisJCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZXNldCBwaHkgYW5kIGxpbmsgZG93biBub3dcbiIsCisJCQkJICAgICAgIGRldl9uYW1lKTsKKwkJCQlyZXR1cm4gLUVUSU1FOworCQkJfQorCQl9CisJfQorCisJaWYgKHNpc19wcml2LT5jaGlwc2V0X3JldiA9PSBTSVM2MzBFXzkwMF9SRVYpIHsKKwkJLyogU2lTIDYzMEUgaGFzIHNvbWUgYnVncyBvbiBkZWZhdWx0IHZhbHVlIG9mIFBIWSByZWdpc3RlcnMgKi8KKwkJbWRpb193cml0ZShuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX0FOQURWLCAweDA1ZTEpOworCQltZGlvX3dyaXRlKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfQ09ORklHMSwgMHgyMik7CisJCW1kaW9fd3JpdGUobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9DT05GSUcyLCAweGZmMDApOworCQltZGlvX3dyaXRlKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfTUFTSywgMHhmZmMwKTsKKwkJLy9tZGlvX3dyaXRlKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfQ09OVFJPTCwgMHgxMDAwKTsJCisJfQorCisJaWYgKHNpc19wcml2LT5taWktPnN0YXR1cyAmIE1JSV9TVEFUX0xJTkspCisJCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJZWxzZQorCQluZXRpZl9jYXJyaWVyX29mZihuZXRfZGV2KTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqCXNpczkwMF9kZWZhdWx0X3BoeSAtIFNlbGVjdCBkZWZhdWx0IFBIWSBmb3Igc2lzOTAwIG1hYy4KKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBwcm9iZSBmb3IKKyAqCisgKglTZWxlY3QgZmlyc3QgZGV0ZWN0ZWQgUEhZIHdpdGggbGluayBhcyBkZWZhdWx0LgorICoJSWYgbm8gb25lIGlzIGxpbmsgb24sIHNlbGVjdCBQSFkgd2hvc2UgdHlwZXMgaXMgSE9NRSBhcyBkZWZhdWx0LgorICoJSWYgSE9NRSBkb2Vzbid0IGV4aXN0LCBzZWxlY3QgTEFOLgorICovCisKK3N0YXRpYyB1MTYgc2lzOTAwX2RlZmF1bHRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKiBzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisgCXN0cnVjdCBtaWlfcGh5ICpwaHkgPSBOVUxMLCAqcGh5X2hvbWUgPSBOVUxMLCAKKwkJKmRlZmF1bHRfcGh5ID0gTlVMTCwgKnBoeV9sYW4gPSBOVUxMOworCXUxNiBzdGF0dXM7CisKKyAgICAgICAgZm9yIChwaHk9c2lzX3ByaXYtPmZpcnN0X21paTsgcGh5OyBwaHk9cGh5LT5uZXh0KSB7CisJCXN0YXR1cyA9IG1kaW9fcmVhZChuZXRfZGV2LCBwaHktPnBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKwkJc3RhdHVzID0gbWRpb19yZWFkKG5ldF9kZXYsIHBoeS0+cGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCisJCS8qIExpbmsgT04gJiBOb3Qgc2VsZWN0IGRlZmF1bHQgUEhZICYgbm90IGdob3N0IFBIWSAqLworCQkgaWYgKChzdGF0dXMgJiBNSUlfU1RBVF9MSU5LKSAmJiAhZGVmYXVsdF9waHkgJiYKKwkJCQkJKHBoeS0+cGh5X3R5cGVzICE9IFVOS05PV04pKQorCQkgCWRlZmF1bHRfcGh5ID0gcGh5OworCQkgZWxzZSB7CisJCQlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2RldiwgcGh5LT5waHlfYWRkciwgTUlJX0NPTlRST0wpOworCQkJbWRpb193cml0ZShuZXRfZGV2LCBwaHktPnBoeV9hZGRyLCBNSUlfQ09OVFJPTCwKKwkJCQlzdGF0dXMgfCBNSUlfQ05UTF9BVVRPIHwgTUlJX0NOVExfSVNPTEFURSk7CisJCQlpZiAocGh5LT5waHlfdHlwZXMgPT0gSE9NRSkKKwkJCQlwaHlfaG9tZSA9IHBoeTsKKwkJCWVsc2UgaWYocGh5LT5waHlfdHlwZXMgPT0gTEFOKQorCQkJCXBoeV9sYW4gPSBwaHk7CisJCSB9CisJfQorCisJaWYgKCFkZWZhdWx0X3BoeSAmJiBwaHlfaG9tZSkKKwkJZGVmYXVsdF9waHkgPSBwaHlfaG9tZTsKKwllbHNlIGlmICghZGVmYXVsdF9waHkgJiYgcGh5X2xhbikKKwkJZGVmYXVsdF9waHkgPSBwaHlfbGFuOworCWVsc2UgaWYgKCFkZWZhdWx0X3BoeSkKKwkJZGVmYXVsdF9waHkgPSBzaXNfcHJpdi0+Zmlyc3RfbWlpOworCisJaWYgKHNpc19wcml2LT5taWkgIT0gZGVmYXVsdF9waHkpIHsKKwkJc2lzX3ByaXYtPm1paSA9IGRlZmF1bHRfcGh5OworCQlzaXNfcHJpdi0+Y3VyX3BoeSA9IGRlZmF1bHRfcGh5LT5waHlfYWRkcjsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVzaW5nIHRyYW5zY2VpdmVyIGZvdW5kIGF0IGFkZHJlc3MgJWQgYXMgZGVmYXVsdFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHNpc19wcml2LT5wY2lfZGV2KSwgc2lzX3ByaXYtPmN1cl9waHkpOworCX0KKwkKKwlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9DT05UUk9MKTsKKwlzdGF0dXMgJj0gKH5NSUlfQ05UTF9JU09MQVRFKTsKKworCW1kaW9fd3JpdGUobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9DT05UUk9MLCBzdGF0dXMpOwkKKwlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9TVEFUVVMpOworCXN0YXR1cyA9IG1kaW9fcmVhZChuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX1NUQVRVUyk7CisKKwlyZXR1cm4gc3RhdHVzOwkKK30KKworCisvKioKKyAqIAlzaXM5MDBfc2V0X2NhcGFiaWxpdHkgLSBzZXQgdGhlIG1lZGlhIGNhcGFiaWxpdHkgb2YgbmV0d29yayBhZGFwdGVyLgorICoJQG5ldF9kZXYgOiB0aGUgbmV0IGRldmljZSB0byBwcm9iZSBmb3IKKyAqCUBwaHkgOiBkZWZhdWx0IFBIWQorICoKKyAqCVNldCB0aGUgbWVkaWEgY2FwYWJpbGl0eSBvZiBuZXR3b3JrIGFkYXB0ZXIgYWNjb3JkaW5nIHRvCisgKgltaWkgc3RhdHVzIHJlZ2lzdGVyLiBJdCdzIG5lY2Vzc2FyeSBiZWZvcmUgYXV0by1uZWdvdGlhdGUuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHNpczkwMF9zZXRfY2FwYWJpbGl0eShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldiwgc3RydWN0IG1paV9waHkgKnBoeSkKK3sKKwl1MTYgY2FwOworCXUxNiBzdGF0dXM7CisJCisJc3RhdHVzID0gbWRpb19yZWFkKG5ldF9kZXYsIHBoeS0+cGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCXN0YXR1cyA9IG1kaW9fcmVhZChuZXRfZGV2LCBwaHktPnBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKwkKKwljYXAgPSBNSUlfTldBWV9DU01BX0NEIHwKKwkJKChwaHktPnN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UWF9GRFgpPyBNSUlfTldBWV9UWF9GRFg6MCkgfAorCQkoKHBoeS0+c3RhdHVzICYgTUlJX1NUQVRfQ0FOX1RYKSAgICA/IE1JSV9OV0FZX1RYOjApIHwKKwkJKChwaHktPnN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UX0ZEWCkgPyBNSUlfTldBWV9UX0ZEWDowKXwKKwkJKChwaHktPnN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UKSAgICAgPyBNSUlfTldBWV9UOjApOworCisJbWRpb193cml0ZShuZXRfZGV2LCBwaHktPnBoeV9hZGRyLCBNSUlfQU5BRFYsIGNhcCk7Cit9CisKKworLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuICovCisjZGVmaW5lIGVlcHJvbV9kZWxheSgpICBpbmwoZWVfYWRkcikKKworLyoqCisgKglyZWFkX2VlcHJvbSAtIFJlYWQgU2VyaWFsIEVFUFJPTQorICoJQGlvYWRkcjogYmFzZSBpL28gYWRkcmVzcworICoJQGxvY2F0aW9uOiB0aGUgRUVQUk9NIGxvY2F0aW9uIHRvIHJlYWQKKyAqCisgKglSZWFkIFNlcmlhbCBFRVBST00gdGhyb3VnaCBFRVBST00gQWNjZXNzIFJlZ2lzdGVyLgorICoJTm90ZSB0aGF0IGxvY2F0aW9uIGlzIGluIHdvcmQgKDE2IGJpdHMpIHVuaXQKKyAqLworCitzdGF0aWMgdTE2IF9fZGV2aW5pdCByZWFkX2VlcHJvbShsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uKQoreworCWludCBpOworCXUxNiByZXR2YWwgPSAwOworCWxvbmcgZWVfYWRkciA9IGlvYWRkciArIG1lYXI7CisJdTMyIHJlYWRfY21kID0gbG9jYXRpb24gfCBFRXJlYWQ7CisKKwlvdXRsKDAsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSgpOworCW91dGwoRUVDUywgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5KCk7CisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kICg5KSBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSA4OyBpID49IDA7IGktLSkgeworCQl1MzIgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFREkgfCBFRUNTIDogRUVDUzsKKwkJb3V0bChkYXRhdmFsLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJCW91dGwoZGF0YXZhbCB8IEVFQ0xLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJfQorCW91dGwoRUVDUywgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5KCk7CisKKwkvKiByZWFkIHRoZSAxNi1iaXRzIGRhdGEgaW4gKi8KKwlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworCQlvdXRsKEVFQ1MsIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoKTsKKwkJb3V0bChFRUNTIHwgRUVDTEssIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW5sKGVlX2FkZHIpICYgRUVETykgPyAxIDogMCk7CisJCWVlcHJvbV9kZWxheSgpOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKwlvdXRsKDAsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSgpOworCisJcmV0dXJuIChyZXR2YWwpOworfQorCisvKiBSZWFkIGFuZCB3cml0ZSB0aGUgTUlJIG1hbmFnZW1lbnQgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZAorICAgc2VyaWFsIE1ESU8gcHJvdG9jb2wuIE5vdGUgdGhhdCB0aGUgY29tbWFuZCBiaXRzIGFuZCBkYXRhIGJpdHMgYXJlCisgICBzZW5kIG91dCBzZXBhcmF0ZWx5ICovCisjZGVmaW5lIG1kaW9fZGVsYXkoKSAgICBpbmwobWRpb19hZGRyKQorCitzdGF0aWMgdm9pZCBtZGlvX2lkbGUobG9uZyBtZGlvX2FkZHIpCit7CisJb3V0bChNRElPIHwgTURESVIsIG1kaW9fYWRkcik7CisJbWRpb19kZWxheSgpOworCW91dGwoTURJTyB8IE1ERElSIHwgTURDLCBtZGlvX2FkZHIpOworfQorCisvKiBTeW5jcm9uaXplIHRoZSBNSUkgbWFuYWdlbWVudCBpbnRlcmZhY2UgYnkgc2hpZnRpbmcgMzIgb25lIGJpdHMgb3V0LiAqLworc3RhdGljIHZvaWQgbWRpb19yZXNldChsb25nIG1kaW9fYWRkcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQlvdXRsKE1ERElSIHwgTURJTywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXRsKE1ERElSIHwgTURJTyB8IE1EQywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICoJbWRpb19yZWFkIC0gcmVhZCBNSUkgUEhZIHJlZ2lzdGVyCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gcmVhZAorICoJQHBoeV9pZDogdGhlIHBoeSBhZGRyZXNzIHRvIHJlYWQKKyAqCUBsb2NhdGlvbjogdGhlIHBoeSByZWdpZXN0ZXIgaWQgdG8gcmVhZAorICoKKyAqCVJlYWQgTUlJIHJlZ2lzdGVycyB0aHJvdWdoIE1ESU8gYW5kIE1EQworICoJdXNpbmcgTURJTyBtYW5hZ2VtZW50IGZyYW1lIHN0cnVjdHVyZSBhbmQgcHJvdG9jb2woZGVmaW5lZCBieSBJU08vSUVDKS4KKyAqCVBsZWFzZSBzZWUgU2lTNzAxNCBvciBJQ1Mgc3BlYworICovCisKK3N0YXRpYyB1MTYgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJbG9uZyBtZGlvX2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHIgKyBtZWFyOworCWludCBtaWlfY21kID0gTUlJcmVhZHwocGh5X2lkPDxNSUlwbWRTaGlmdCl8KGxvY2F0aW9uPDxNSUlyZWdTaGlmdCk7CisJdTE2IHJldHZhbCA9IDA7CisJaW50IGk7CisKKwltZGlvX3Jlc2V0KG1kaW9fYWRkcik7CisJbWRpb19pZGxlKG1kaW9fYWRkcik7CisKKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAobWlpX2NtZCAmICgxIDw8IGkpKSA/IE1ERElSIHwgTURJTyA6IE1ERElSOworCQlvdXRsKGRhdGF2YWwsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJb3V0bChkYXRhdmFsIHwgTURDLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCisJLyogUmVhZCB0aGUgMTYgZGF0YSBiaXRzLiAqLworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCW91dGwoMCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbmwobWRpb19hZGRyKSAmIE1ESU8pID8gMSA6IDApOworCQlvdXRsKE1EQywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwlvdXRsKDB4MDAsIG1kaW9fYWRkcik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCW1kaW9fd3JpdGUgLSB3cml0ZSBNSUkgUEhZIHJlZ2lzdGVyCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gd3JpdGUKKyAqCUBwaHlfaWQ6IHRoZSBwaHkgYWRkcmVzcyB0byB3cml0ZQorICoJQGxvY2F0aW9uOiB0aGUgcGh5IHJlZ2llc3RlciBpZCB0byB3cml0ZQorICoJQHZhbHVlOiB0aGUgcmVnaXN0ZXIgdmFsdWUgdG8gd3JpdGUgd2l0aAorICoKKyAqCVdyaXRlIE1JSSByZWdpc3RlcnMgd2l0aCBAdmFsdWUgdGhyb3VnaCBNRElPIGFuZCBNREMKKyAqCXVzaW5nIE1ESU8gbWFuYWdlbWVudCBmcmFtZSBzdHJ1Y3R1cmUgYW5kIHByb3RvY29sKGRlZmluZWQgYnkgSVNPL0lFQykKKyAqCXBsZWFzZSBzZWUgU2lTNzAxNCBvciBJQ1Mgc3BlYworICovCisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwKKwkJCWludCB2YWx1ZSkKK3sKKwlsb25nIG1kaW9fYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkciArIG1lYXI7CisJaW50IG1paV9jbWQgPSBNSUl3cml0ZXwocGh5X2lkPDxNSUlwbWRTaGlmdCl8KGxvY2F0aW9uPDxNSUlyZWdTaGlmdCk7CisJaW50IGk7CisKKwltZGlvX3Jlc2V0KG1kaW9fYWRkcik7CisJbWRpb19pZGxlKG1kaW9fYWRkcik7CisKKwkvKiBTaGlmdCB0aGUgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAobWlpX2NtZCAmICgxIDw8IGkpKSA/IE1ERElSIHwgTURJTyA6IE1ERElSOworCQlvdXRiKGRhdGF2YWwsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJb3V0YihkYXRhdmFsIHwgTURDLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCW1kaW9fZGVsYXkoKTsKKworCS8qIFNoaWZ0IHRoZSB2YWx1ZSBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAodmFsdWUgJiAoMSA8PCBpKSkgPyBNRERJUiB8IE1ESU8gOiBNRERJUjsKKwkJb3V0bChkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCW91dGwoZGF0YXZhbCB8IE1EQywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwltZGlvX2RlbGF5KCk7CisKKwkvKiBDbGVhciBvdXQgZXh0cmEgYml0cy4gKi8KKwlmb3IgKGkgPSAyOyBpID4gMDsgaS0tKSB7CisJCW91dGIoMCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXRiKE1EQywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwlvdXRsKDB4MDAsIG1kaW9fYWRkcik7CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKglzaXM5MDBfcmVzZXRfcGh5IC0gcmVzZXQgc2lzOTAwIG1paSBwaHkuCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gd3JpdGUKKyAqCUBwaHlfYWRkcjogZGVmYXVsdCBwaHkgYWRkcmVzcworICoKKyAqCVNvbWUgc3BlY2lmaWMgcGh5IGNhbid0IHdvcmsgcHJvcGVybHkgd2l0aG91dCByZXNldC4KKyAqCVRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIGFuZAorICoJbGluayBzdGF0dXMgY2hhbmdlIGZyb20gT04gdG8gRE9XTi4KKyAqLworCitzdGF0aWMgdTE2IHNpczkwMF9yZXNldF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCBwaHlfYWRkcikKK3sKKwlpbnQgaSA9IDA7CisJdTE2IHN0YXR1czsKKworCXdoaWxlIChpKysgPCAyKQorCQlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2RldiwgcGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCisJbWRpb193cml0ZSggbmV0X2RldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBNSUlfQ05UTF9SRVNFVCApOworCQorCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyoKKyAqIFBvbGxpbmcgJ2ludGVycnVwdCcgLSB1c2VkIGJ5IHRoaW5ncyBsaWtlIG5ldGNvbnNvbGUgdG8gc2VuZCBza2JzCisgKiB3aXRob3V0IGhhdmluZyB0byByZS1lbmFibGUgaW50ZXJydXB0cy4gSXQncyBub3QgY2FsbGVkIHdoaWxlCisgKiB0aGUgaW50ZXJydXB0IHJvdXRpbmUgaXMgZXhlY3V0aW5nLgorKi8KK3N0YXRpYyB2b2lkIHNpczkwMF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXNpczkwMF9pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworLyoqCisgKglzaXM5MDBfb3BlbiAtIG9wZW4gc2lzOTAwIGRldmljZQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIG9wZW4KKyAqCisgKglEbyBzb21lIGluaXRpYWxpemF0aW9uIGFuZCBzdGFydCBuZXQgaW50ZXJmYWNlLgorICoJZW5hYmxlIGludGVycnVwdHMgYW5kIHNldCBzaXM5MDAgdGltZXIuCisgKi8KKworc3RhdGljIGludAorc2lzOTAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICpzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJbG9uZyBpb2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHI7CisJaW50IHJldDsKKworCS8qIFNvZnQgcmVzZXQgdGhlIGNoaXAuICovCisJc2lzOTAwX3Jlc2V0KG5ldF9kZXYpOworCisJLyogRXF1YWxpemVyIHdvcmthcm91bmQgUnVsZSAqLworCXNpczYzMF9zZXRfZXEobmV0X2Rldiwgc2lzX3ByaXYtPmNoaXBzZXRfcmV2KTsKKworCXJldCA9IHJlcXVlc3RfaXJxKG5ldF9kZXYtPmlycSwgJnNpczkwMF9pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJCQkJbmV0X2Rldi0+bmFtZSwgbmV0X2Rldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXNpczkwMF9pbml0X3J4ZmlsdGVyKG5ldF9kZXYpOworCisJc2lzOTAwX2luaXRfdHhfcmluZyhuZXRfZGV2KTsKKwlzaXM5MDBfaW5pdF9yeF9yaW5nKG5ldF9kZXYpOworCisJc2V0X3J4X21vZGUobmV0X2Rldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShuZXRfZGV2KTsKKworCS8qIFdvcmthcm91bmQgZm9yIEVEQiAqLworCXNpczkwMF9zZXRfbW9kZShpb2FkZHIsIEhXX1NQRUVEXzEwX01CUFMsIEZEWF9DQVBBQkxFX0hBTEZfU0VMRUNURUQpOworCisJLyogRW5hYmxlIGFsbCBrbm93biBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCW91dGwoKFJ4U09WUnxSeE9STnxSeEVSUnxSeE9LfFR4VVJOfFR4RVJSfFR4SURMRSksIGlvYWRkciArIGltcik7CisJb3V0bChSeEVOQSB8IGlubChpb2FkZHIgKyBjciksIGlvYWRkciArIGNyKTsKKwlvdXRsKElFLCBpb2FkZHIgKyBpZXIpOworCisJc2lzOTAwX2NoZWNrX21vZGUobmV0X2Rldiwgc2lzX3ByaXYtPm1paSk7CisKKwkvKiBTZXQgdGhlIHRpbWVyIHRvIHN3aXRjaCB0byBjaGVjayBmb3IgbGluayBiZWF0IGFuZCBwZXJoYXBzIHN3aXRjaAorCSAgIHRvIGFuIGFsdGVybmF0ZSBtZWRpYSB0eXBlLiAqLworCWluaXRfdGltZXIoJnNpc19wcml2LT50aW1lcik7CisJc2lzX3ByaXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJc2lzX3ByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyluZXRfZGV2OworCXNpc19wcml2LT50aW1lci5mdW5jdGlvbiA9ICZzaXM5MDBfdGltZXI7CisJYWRkX3RpbWVyKCZzaXNfcHJpdi0+dGltZXIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2lzOTAwX2luaXRfcnhmaWx0ZXIgLSBJbml0aWFsaXplIHRoZSBSeCBmaWx0ZXIKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBpbml0aWFsaXplIGZvcgorICoKKyAqCVNldCByZWNlaXZlIGZpbHRlciBhZGRyZXNzIHRvIG91ciBNQUMgYWRkcmVzcworICoJYW5kIGVuYWJsZSBwYWNrZXQgZmlsdGVyaW5nLgorICovCisKK3N0YXRpYyB2b2lkCitzaXM5MDBfaW5pdF9yeGZpbHRlciAoc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2KQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCXUzMiByZmNyU2F2ZTsKKwl1MzIgaTsKKworCXJmY3JTYXZlID0gaW5sKHJmY3IgKyBpb2FkZHIpOworCisJLyogZGlzYWJsZSBwYWNrZXQgZmlsdGVyaW5nIGJlZm9yZSBzZXR0aW5nIGZpbHRlciAqLworCW91dGwocmZjclNhdmUgJiB+UkZFTiwgcmZjciArIGlvYWRkcik7CisKKwkvKiBsb2FkIE1BQyBhZGRyIHRvIGZpbHRlciBkYXRhIHJlZ2lzdGVyICovCisJZm9yIChpID0gMCA7IGkgPCAzIDsgaSsrKSB7CisJCXUzMiB3OworCisJCXcgPSAodTMyKSAqKCh1MTYgKikobmV0X2Rldi0+ZGV2X2FkZHIpK2kpOworCQlvdXRsKChpIDw8IFJGQUREUl9zaGlmdCksIGlvYWRkciArIHJmY3IpOworCQlvdXRsKHcsIGlvYWRkciArIHJmZHIpOworCisJCWlmIChuZXRpZl9tc2dfaHcoc2lzX3ByaXYpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlY2VpdmUgRmlsdGVyIEFkZHJzc1slZF09JXhcbiIsCisJCQkgICAgICAgbmV0X2Rldi0+bmFtZSwgaSwgaW5sKGlvYWRkciArIHJmZHIpKTsKKwkJfQorCX0KKworCS8qIGVuYWJsZSBwYWNrZXQgZmlsdGVyaW5nICovCisJb3V0bChyZmNyU2F2ZSB8IFJGRU4sIHJmY3IgKyBpb2FkZHIpOworfQorCisvKioKKyAqCXNpczkwMF9pbml0X3R4X3JpbmcgLSBJbml0aWFsaXplIHRoZSBUeCBkZXNjcmlwdG9yIHJpbmcKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBpbml0aWFsaXplIGZvcgorICoKKyAqCUluaXRpYWxpemUgdGhlIFR4IGRlc2NyaXB0b3IgcmluZywgCisgKi8KKworc3RhdGljIHZvaWQKK3NpczkwMF9pbml0X3R4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICpzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJbG9uZyBpb2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisKKwlzaXNfcHJpdi0+dHhfZnVsbCA9IDA7CisJc2lzX3ByaXYtPmRpcnR5X3R4ID0gc2lzX3ByaXYtPmN1cl90eCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKykgeworCQlzaXNfcHJpdi0+dHhfc2tidWZmW2ldID0gTlVMTDsKKworCQlzaXNfcHJpdi0+dHhfcmluZ1tpXS5saW5rID0gc2lzX3ByaXYtPnR4X3JpbmdfZG1hICsKKwkJCSgoaSsxKSVOVU1fVFhfREVTQykqc2l6ZW9mKEJ1ZmZlckRlc2MpOworCQlzaXNfcHJpdi0+dHhfcmluZ1tpXS5jbWRzdHMgPSAwOworCQlzaXNfcHJpdi0+dHhfcmluZ1tpXS5idWZwdHIgPSAwOworCX0KKworCS8qIGxvYWQgVHJhbnNtaXQgRGVzY3JpcHRvciBSZWdpc3RlciAqLworCW91dGwoc2lzX3ByaXYtPnR4X3JpbmdfZG1hLCBpb2FkZHIgKyB0eGRwKTsKKwlpZiAobmV0aWZfbXNnX2h3KHNpc19wcml2KSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUWCBkZXNjcmlwdG9yIHJlZ2lzdGVyIGxvYWRlZCB3aXRoOiAlOC44eFxuIiwKKwkJICAgICAgIG5ldF9kZXYtPm5hbWUsIGlubChpb2FkZHIgKyB0eGRwKSk7Cit9CisKKy8qKgorICoJc2lzOTAwX2luaXRfcnhfcmluZyAtIEluaXRpYWxpemUgdGhlIFJ4IGRlc2NyaXB0b3IgcmluZworICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGluaXRpYWxpemUgZm9yCisgKgorICoJSW5pdGlhbGl6ZSB0aGUgUnggZGVzY3JpcHRvciByaW5nLCAKKyAqCWFuZCBwcmUtYWxsb2NhdGUgcmVjZXZpZSBidWZmZXJzIChzb2NrZXQgYnVmZmVyKQorICovCisKK3N0YXRpYyB2b2lkIAorc2lzOTAwX2luaXRfcnhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwlpbnQgaTsKKworCXNpc19wcml2LT5jdXJfcnggPSAwOworCXNpc19wcml2LT5kaXJ0eV9yeCA9IDA7CisKKwkvKiBpbml0IFJYIGRlc2NyaXB0b3IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKykgeworCQlzaXNfcHJpdi0+cnhfc2tidWZmW2ldID0gTlVMTDsKKworCQlzaXNfcHJpdi0+cnhfcmluZ1tpXS5saW5rID0gc2lzX3ByaXYtPnJ4X3JpbmdfZG1hICsKKwkJCSgoaSsxKSVOVU1fUlhfREVTQykqc2l6ZW9mKEJ1ZmZlckRlc2MpOworCQlzaXNfcHJpdi0+cnhfcmluZ1tpXS5jbWRzdHMgPSAwOworCQlzaXNfcHJpdi0+cnhfcmluZ1tpXS5idWZwdHIgPSAwOworCX0KKworCS8qIGFsbG9jYXRlIHNvY2sgYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKFJYX0JVRl9TSVpFKSkgPT0gTlVMTCkgeworCQkJLyogbm90IGVub3VnaCBtZW1vcnkgZm9yIHNrYnVmZiwgdGhpcyBtYWtlcyBhICJob2xlIgorCQkJICAgb24gdGhlIGJ1ZmZlciByaW5nLCBpdCBpcyBub3QgY2xlYXIgaG93IHRoZQorCQkJICAgaGFyZHdhcmUgd2lsbCByZWFjdCB0byB0aGlzIGtpbmQgb2YgZGVnZW5lcmF0ZWQKKwkJCSAgIGJ1ZmZlciAqLworCQkJYnJlYWs7CisJCX0KKwkJc2tiLT5kZXYgPSBuZXRfZGV2OworCQlzaXNfcHJpdi0+cnhfc2tidWZmW2ldID0gc2tiOworCQlzaXNfcHJpdi0+cnhfcmluZ1tpXS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKKyAgICAgICAgICAgICAgICBzaXNfcHJpdi0+cnhfcmluZ1tpXS5idWZwdHIgPSBwY2lfbWFwX3NpbmdsZShzaXNfcHJpdi0+cGNpX2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+dGFpbCwgUlhfQlVGX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJfQorCXNpc19wcml2LT5kaXJ0eV9yeCA9ICh1bnNpZ25lZCBpbnQpIChpIC0gTlVNX1JYX0RFU0MpOworCisJLyogbG9hZCBSZWNlaXZlIERlc2NyaXB0b3IgUmVnaXN0ZXIgKi8KKwlvdXRsKHNpc19wcml2LT5yeF9yaW5nX2RtYSwgaW9hZGRyICsgcnhkcCk7CisJaWYgKG5ldGlmX21zZ19odyhzaXNfcHJpdikpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUlggZGVzY3JpcHRvciByZWdpc3RlciBsb2FkZWQgd2l0aDogJTguOHhcbiIsCisJCSAgICAgICBuZXRfZGV2LT5uYW1lLCBpbmwoaW9hZGRyICsgcnhkcCkpOworfQorCisvKioKKyAqCXNpczYzMF9zZXRfZXEgLSBzZXQgcGh5IGVxdWFsaXplciB2YWx1ZSBmb3IgNjMwIExBTgorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHNldCBlcXVhbGl6ZXIgdmFsdWUKKyAqCUByZXZpc2lvbjogNjMwIExBTiByZXZpc2lvbiBudW1iZXIKKyAqCisgKgk2MzBFIGVxdWFsaXplciB3b3JrYXJvdW5kIHJ1bGUoQ3lydXMgSHVhbmcgMDgvMTUpCisgKglQSFkgcmVnaXN0ZXIgMTRoKFRlc3QpCisgKglCaXQgMTQ6IDAgLS0gQXV0b21hdGljYWxseSBkZWN0ZWN0IChkZWZhdWx0KQorICoJCTEgLS0gTWFudWFsbHkgc2V0IEVxdWFsaXplciBmaWx0ZXIKKyAqCUJpdCAxMzogMCAtLSAoRGVmYXVsdCkKKyAqCQkxIC0tIFNwZWVkIHVwIGNvbnZlcmdlbmNlIG9mIGVxdWFsaXplciBzZXR0aW5nCisgKglCaXQgOSA6IDAgLS0gKERlZmF1bHQpCisgKgkJMSAtLSBEaXNhYmxlIEJhc2VsaW5lIFdhbmRlcgorICoJQml0IDN+NyAgIC0tIEVxdWFsaXplciBmaWx0ZXIgc2V0dGluZworICoJTGluayBPTjogU2V0IEJpdCA5LCAxMyB0byAxLCBCaXQgMTQgdG8gMAorICoJVGhlbiBjYWxjdWxhdGUgZXF1YWxpemVyIHZhbHVlCisgKglUaGVuIHNldCBlcXVhbGl6ZXIgdmFsdWUsIGFuZCBzZXQgQml0IDE0IHRvIDEsIEJpdCA5IHRvIDAKKyAqCUxpbmsgT2ZmOlNldCBCaXQgMTMgdG8gMSwgQml0IDE0IHRvIDAKKyAqCUNhbGN1bGF0ZSBFcXVhbGl6ZXIgdmFsdWU6CisgKglXaGVuIExpbmsgaXMgT04gYW5kIEJpdCAxNCBpcyAwLCBTSVM5MDBQSFkgd2lsbCBhdXRvLWRlY3RlY3QgcHJvcGVyIGVxdWFsaXplciB2YWx1ZS4KKyAqCVdoZW4gdGhlIGVxdWFsaXplciBpcyBzdGFibGUsIHRoaXMgdmFsdWUgaXMgbm90IGEgZml4ZWQgdmFsdWUuIEl0IHdpbGwgYmUgd2l0aGluCisgKglhIHNtYWxsIHJhbmdlKGVnLiA3fjkpLiBUaGVuIHdlIGdldCBhIG1pbmltdW0gYW5kIGEgbWF4aW11bSB2YWx1ZShlZy4gbWluPTcsIG1heD05KQorICoJMCA8PSBtYXggPD0gNCAgLS0+IHNldCBlcXVhbGl6ZXIgdG8gbWF4CisgKgk1IDw9IG1heCA8PSAxNCAtLT4gc2V0IGVxdWFsaXplciB0byBtYXgrMSBvciBzZXQgZXF1YWxpemVyIHRvIG1heCsyIGlmIG1heCA9PSBtaW4KKyAqCW1heCA+PSAxNSAgICAgIC0tPiBzZXQgZXF1YWxpemVyIHRvIG1heCs1IG9yIHNldCBlcXVhbGl6ZXIgdG8gbWF4KzYgaWYgbWF4ID09IG1pbgorICovCisKK3N0YXRpYyB2b2lkIHNpczYzMF9zZXRfZXEoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHU4IHJldmlzaW9uKQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCXUxNiByZWcxNGgsIGVxX3ZhbHVlPTAsIG1heF92YWx1ZT0wLCBtaW5fdmFsdWU9MDsKKwlpbnQgaSwgbWF4Y291bnQ9MTA7CisKKwlpZiAoICEocmV2aXNpb24gPT0gU0lTNjMwRV85MDBfUkVWIHx8IHJldmlzaW9uID09IFNJUzYzMEVBMV85MDBfUkVWIHx8CisJICAgICAgIHJldmlzaW9uID09IFNJUzYzMEFfOTAwX1JFViB8fCByZXZpc2lvbiA9PSAgU0lTNjMwRVRfOTAwX1JFVikgKQorCQlyZXR1cm47CisKKwlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRfZGV2KSkgeworCQlyZWcxNGggPSBtZGlvX3JlYWQobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9SRVNWKTsKKwkJbWRpb193cml0ZShuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX1JFU1YsCisJCQkJCSgweDIyMDAgfCByZWcxNGgpICYgMHhCRkZGKTsKKwkJZm9yIChpPTA7IGkgPCBtYXhjb3VudDsgaSsrKSB7CisJCQllcV92YWx1ZSA9ICgweDAwRjggJiBtZGlvX3JlYWQobmV0X2RldiwKKwkJCQkJc2lzX3ByaXYtPmN1cl9waHksIE1JSV9SRVNWKSkgPj4gMzsKKwkJCWlmIChpID09IDApCisJCQkJbWF4X3ZhbHVlPW1pbl92YWx1ZT1lcV92YWx1ZTsKKwkJCW1heF92YWx1ZSA9IChlcV92YWx1ZSA+IG1heF92YWx1ZSkgPworCQkJCQkJZXFfdmFsdWUgOiBtYXhfdmFsdWU7CisJCQltaW5fdmFsdWUgPSAoZXFfdmFsdWUgPCBtaW5fdmFsdWUpID8KKwkJCQkJCWVxX3ZhbHVlIDogbWluX3ZhbHVlOworCQl9CisJCS8qIDYzMEUgcnVsZSB0byBkZXRlcm1pbmUgdGhlIGVxdWFsaXplciB2YWx1ZSAqLworCQlpZiAocmV2aXNpb24gPT0gU0lTNjMwRV85MDBfUkVWIHx8IHJldmlzaW9uID09IFNJUzYzMEVBMV85MDBfUkVWIHx8CisJCSAgICByZXZpc2lvbiA9PSBTSVM2MzBFVF85MDBfUkVWKSB7CisJCQlpZiAobWF4X3ZhbHVlIDwgNSkKKwkJCQllcV92YWx1ZSA9IG1heF92YWx1ZTsKKwkJCWVsc2UgaWYgKG1heF92YWx1ZSA+PSA1ICYmIG1heF92YWx1ZSA8IDE1KQorCQkJCWVxX3ZhbHVlID0gKG1heF92YWx1ZSA9PSBtaW5fdmFsdWUpID8KKwkJCQkJCW1heF92YWx1ZSsyIDogbWF4X3ZhbHVlKzE7CisJCQllbHNlIGlmIChtYXhfdmFsdWUgPj0gMTUpCisJCQkJZXFfdmFsdWU9KG1heF92YWx1ZSA9PSBtaW5fdmFsdWUpID8KKwkJCQkJCW1heF92YWx1ZSs2IDogbWF4X3ZhbHVlKzU7CisJCX0KKwkJLyogNjMwQjAmQjEgcnVsZSB0byBkZXRlcm1pbmUgdGhlIGVxdWFsaXplciB2YWx1ZSAqLworCQlpZiAocmV2aXNpb24gPT0gU0lTNjMwQV85MDBfUkVWICYmIAorCQkgICAgKHNpc19wcml2LT5ob3N0X2JyaWRnZV9yZXYgPT0gU0lTNjMwQjAgfHwgCisJCSAgICAgc2lzX3ByaXYtPmhvc3RfYnJpZGdlX3JldiA9PSBTSVM2MzBCMSkpIHsKKwkJCWlmIChtYXhfdmFsdWUgPT0gMCkKKwkJCQllcV92YWx1ZSA9IDM7CisJCQllbHNlCisJCQkJZXFfdmFsdWUgPSAobWF4X3ZhbHVlICsgbWluX3ZhbHVlICsgMSkvMjsKKwkJfQorCQkvKiB3cml0ZSBlcXVhbGl6ZXIgdmFsdWUgYW5kIHNldHRpbmcgKi8KKwkJcmVnMTRoID0gbWRpb19yZWFkKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfUkVTVik7CisJCXJlZzE0aCA9IChyZWcxNGggJiAweEZGMDcpIHwgKChlcV92YWx1ZSA8PCAzKSAmIDB4MDBGOCk7CisJCXJlZzE0aCA9IChyZWcxNGggfCAweDYwMDApICYgMHhGREZGOworCQltZGlvX3dyaXRlKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfUkVTViwgcmVnMTRoKTsKKwl9IGVsc2UgeworCQlyZWcxNGggPSBtZGlvX3JlYWQobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9SRVNWKTsKKwkJaWYgKHJldmlzaW9uID09IFNJUzYzMEFfOTAwX1JFViAmJiAKKwkJICAgIChzaXNfcHJpdi0+aG9zdF9icmlkZ2VfcmV2ID09IFNJUzYzMEIwIHx8IAorCQkgICAgIHNpc19wcml2LT5ob3N0X2JyaWRnZV9yZXYgPT0gU0lTNjMwQjEpKSAKKwkJCW1kaW9fd3JpdGUobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9SRVNWLAorCQkJCQkJKHJlZzE0aCB8IDB4MjIwMCkgJiAweEJGRkYpOworCQllbHNlCisJCQltZGlvX3dyaXRlKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfUkVTViwKKwkJCQkJCShyZWcxNGggfCAweDIwMDApICYgMHhCRkZGKTsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqCXNpczkwMF90aW1lciAtIHNpczkwMCB0aW1lciByb3V0aW5lCisgKglAZGF0YTogcG9pbnRlciB0byBzaXM5MDAgbmV0IGRldmljZQorICoKKyAqCU9uIGVhY2ggdGltZXIgdGlja3Mgd2UgY2hlY2sgdHdvIHRoaW5ncywgCisgKglsaW5rIHN0YXR1cyAoT04vT0ZGKSBhbmQgbGluayBtb2RlICgxMC8xMDAvRnVsbC9IYWxmKQorICovCisKK3N0YXRpYyB2b2lkIHNpczkwMF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCXN0cnVjdCBtaWlfcGh5ICptaWlfcGh5ID0gc2lzX3ByaXYtPm1paTsKKwlzdGF0aWMgaW50IG5leHRfdGljayA9IDUqSFo7CisJdTE2IHN0YXR1czsKKworCWlmICghc2lzX3ByaXYtPmF1dG9uZ19jb21wbGV0ZSl7CisJCWludCBzcGVlZCwgZHVwbGV4ID0gMDsKKworCQlzaXM5MDBfcmVhZF9tb2RlKG5ldF9kZXYsICZzcGVlZCwgJmR1cGxleCk7CisJCWlmIChkdXBsZXgpeworCQkJc2lzOTAwX3NldF9tb2RlKG5ldF9kZXYtPmJhc2VfYWRkciwgc3BlZWQsIGR1cGxleCk7CisJCQlzaXM2MzBfc2V0X2VxKG5ldF9kZXYsIHNpc19wcml2LT5jaGlwc2V0X3Jldik7CisJCQluZXRpZl9zdGFydF9xdWV1ZShuZXRfZGV2KTsKKwkJfQorCisJCXNpc19wcml2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaOworCQlhZGRfdGltZXIoJnNpc19wcml2LT50aW1lcik7CisJCXJldHVybjsKKwl9CisKKwlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9TVEFUVVMpOworCXN0YXR1cyA9IG1kaW9fcmVhZChuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX1NUQVRVUyk7CisKKwkvKiBMaW5rIE9GRiAtPiBPTiAqLworCWlmICghbmV0aWZfY2Fycmllcl9vayhuZXRfZGV2KSkgeworCUxvb2tGb3JMaW5rOgorCQkvKiBTZWFyY2ggZm9yIG5ldyBQSFkgKi8KKwkJc3RhdHVzID0gc2lzOTAwX2RlZmF1bHRfcGh5KG5ldF9kZXYpOworCQltaWlfcGh5ID0gc2lzX3ByaXYtPm1paTsKKworCQlpZiAoc3RhdHVzICYgTUlJX1NUQVRfTElOSyl7CisJCQlzaXM5MDBfY2hlY2tfbW9kZShuZXRfZGV2LCBtaWlfcGh5KTsKKwkJCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJCX0KKwl9IGVsc2UgeworCS8qIExpbmsgT04gLT4gT0ZGICovCisgICAgICAgICAgICAgICAgaWYgKCEoc3RhdHVzICYgTUlJX1NUQVRfTElOSykpeworICAgICAgICAgICAgICAgIAluZXRpZl9jYXJyaWVyX29mZihuZXRfZGV2KTsKKwkJCWlmKG5ldGlmX21zZ19saW5rKHNpc19wcml2KSkKKyAgICAgICAgICAgICAgICAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNZWRpYSBMaW5rIE9mZlxuIiwgbmV0X2Rldi0+bmFtZSk7CisKKyAgICAgICAgICAgICAgICAJLyogQ2hhbmdlIG1vZGUgaXNzdWUgKi8KKyAgICAgICAgICAgICAgICAJaWYgKChtaWlfcGh5LT5waHlfaWQwID09IDB4MDAxRCkgJiYgCisJCQkgICAgKChtaWlfcGh5LT5waHlfaWQxICYgMHhGRkYwKSA9PSAweDgwMDApKQorICAgICAgICAgICAgICAgCQkJc2lzOTAwX3Jlc2V0X3BoeShuZXRfZGV2LCAgc2lzX3ByaXYtPmN1cl9waHkpOworICAKKwkJCXNpczYzMF9zZXRfZXEobmV0X2Rldiwgc2lzX3ByaXYtPmNoaXBzZXRfcmV2KTsKKyAgCisgICAgICAgICAgICAgICAgCWdvdG8gTG9va0Zvckxpbms7CisgICAgICAgICAgICAgICAgfQorCX0KKworCXNpc19wcml2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG5leHRfdGljazsKKwlhZGRfdGltZXIoJnNpc19wcml2LT50aW1lcik7Cit9CisKKy8qKgorICoJc2lzOTAwX2NoZWNrX21vZGUgLSBjaGVjayB0aGUgbWVkaWEgbW9kZSBmb3Igc2lzOTAwCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gYmUgY2hlY2tlZAorICoJQG1paV9waHk6IHRoZSBtaWkgcGh5CisgKgorICoJT2xkZXIgZHJpdmVyIGdldHMgdGhlIG1lZGlhIG1vZGUgZnJvbSBtaWkgc3RhdHVzIG91dHB1dAorICoJcmVnaXN0ZXIuIE5vdyB3ZSBzZXQgb3VyIG1lZGlhIGNhcGFiaWxpdHkgYW5kIGF1dG8tbmVnb3RpYXRlCisgKgl0byBnZXQgdGhlIHVwcGVyIGJvdW5kIG9mIHNwZWVkIGFuZCBkdXBsZXggYmV0d2VlbiB0d28gZW5kcy4KKyAqCUlmIHRoZSB0eXBlcyBvZiBtaWkgcGh5IGlzIEhPTUUsIGl0IGRvZXNuJ3QgbmVlZCB0byBhdXRvLW5lZ290aWF0ZQorICoJYW5kIGF1dG9uZ19jb21wbGV0ZSBzaG91bGQgYmUgc2V0IHRvIDEuCisgKi8KKworc3RhdGljIHZvaWQgc2lzOTAwX2NoZWNrX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHN0cnVjdCBtaWlfcGh5ICptaWlfcGh5KQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCWludCBzcGVlZCwgZHVwbGV4OworCisJaWYgKG1paV9waHktPnBoeV90eXBlcyA9PSBMQU4pIHsKKwkJb3V0bCh+RVhEICYgaW5sKGlvYWRkciArIGNmZyksIGlvYWRkciArIGNmZyk7CisJCXNpczkwMF9zZXRfY2FwYWJpbGl0eShuZXRfZGV2ICwgbWlpX3BoeSk7CisJCXNpczkwMF9hdXRvX25lZ290aWF0ZShuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSk7CisJfSBlbHNlIHsKKwkJb3V0bChFWEQgfCBpbmwoaW9hZGRyICsgY2ZnKSwgaW9hZGRyICsgY2ZnKTsKKwkJc3BlZWQgPSBIV19TUEVFRF9IT01FOworCQlkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworCQlzaXM5MDBfc2V0X21vZGUoaW9hZGRyLCBzcGVlZCwgZHVwbGV4KTsKKwkJc2lzX3ByaXYtPmF1dG9uZ19jb21wbGV0ZSA9IDE7CisJfQorfQorCisvKioKKyAqCXNpczkwMF9zZXRfbW9kZSAtIFNldCB0aGUgbWVkaWEgbW9kZSBvZiBtYWMgcmVnaXN0ZXIuCisgKglAaW9hZGRyOiB0aGUgYWRkcmVzcyBvZiB0aGUgZGV2aWNlCisgKglAc3BlZWQgOiB0aGUgdHJhbnNtaXQgc3BlZWQgdG8gYmUgZGV0ZXJtaW5lZAorICoJQGR1cGxleDogdGhlIGR1cGxleCBtb2RlIHRvIGJlIGRldGVybWluZWQKKyAqCisgKglTZXQgdGhlIG1lZGlhIG1vZGUgb2YgbWFjIHJlZ2lzdGVyIHR4Y2ZnL3J4Y2ZnIGFjY29yZGluZyB0bworICoJc3BlZWQgYW5kIGR1cGxleCBvZiBwaHkuIEJpdCBFREJfTUFTVEVSX0VOIGluZGljYXRlcyB0aGUgRURCCisgKglidXMgaXMgdXNlZCBpbnN0ZWFkIG9mIFBDSSBidXMuIFdoZW4gdGhpcyBiaXQgaXMgc2V0IDEsIHRoZQorICoJTWF4IERNQSBCdXJzdCBTaXplIGZvciBUWC9SWCBETUEgc2hvdWxkIGJlIG5vIGxhcmdlciB0aGFuIDE2CisgKglkb3VibGUgd29yZHMuCisgKi8KKworc3RhdGljIHZvaWQgc2lzOTAwX3NldF9tb2RlIChsb25nIGlvYWRkciwgaW50IHNwZWVkLCBpbnQgZHVwbGV4KQoreworCXUzMiB0eF9mbGFncyA9IDAsIHJ4X2ZsYWdzID0gMDsKKworCWlmIChpbmwoaW9hZGRyICsgY2ZnKSAmIEVEQl9NQVNURVJfRU4pIHsKKwkJdHhfZmxhZ3MgPSBUeEFUUCB8IChETUFfQlVSU1RfNjQgPDwgVHhNWERNQV9zaGlmdCkgfAorCQkJCQkoVFhfRklMTF9USFJFU0ggPDwgVHhGSUxMVF9zaGlmdCk7CisJCXJ4X2ZsYWdzID0gRE1BX0JVUlNUXzY0IDw8IFJ4TVhETUFfc2hpZnQ7CisJfSBlbHNlIHsKKwkJdHhfZmxhZ3MgPSBUeEFUUCB8IChETUFfQlVSU1RfNTEyIDw8IFR4TVhETUFfc2hpZnQpIHwKKwkJCQkJKFRYX0ZJTExfVEhSRVNIIDw8IFR4RklMTFRfc2hpZnQpOworCQlyeF9mbGFncyA9IERNQV9CVVJTVF81MTIgPDwgUnhNWERNQV9zaGlmdDsKKwl9CisKKwlpZiAoc3BlZWQgPT0gSFdfU1BFRURfSE9NRSB8fCBzcGVlZCA9PSBIV19TUEVFRF8xMF9NQlBTKSB7CisJCXJ4X2ZsYWdzIHw9IChSeERSTlRfMTAgPDwgUnhEUk5UX3NoaWZ0KTsKKwkJdHhfZmxhZ3MgfD0gKFR4RFJOVF8xMCA8PCBUeERSTlRfc2hpZnQpOworCX0gZWxzZSB7CisJCXJ4X2ZsYWdzIHw9IChSeERSTlRfMTAwIDw8IFJ4RFJOVF9zaGlmdCk7CisJCXR4X2ZsYWdzIHw9IChUeERSTlRfMTAwIDw8IFR4RFJOVF9zaGlmdCk7CisJfQorCisJaWYgKGR1cGxleCA9PSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEKSB7CisJCXR4X2ZsYWdzIHw9IChUeENTSSB8IFR4SEJJKTsKKwkJcnhfZmxhZ3MgfD0gUnhBVFg7CisJfQorCisJb3V0bCAodHhfZmxhZ3MsIGlvYWRkciArIHR4Y2ZnKTsKKwlvdXRsIChyeF9mbGFncywgaW9hZGRyICsgcnhjZmcpOworfQorCisvKioKKyAqCXNpczkwMF9hdXRvX25lZ290aWF0ZSAtIFNldCB0aGUgQXV0by1OZWdvdGlhdGlvbiBFbmFibGUvUmVzZXQgYml0LgorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHJlYWQgbW9kZSBmb3IKKyAqCUBwaHlfYWRkcjogbWlpIHBoeSBhZGRyZXNzCisgKgorICoJSWYgdGhlIGFkYXB0ZXIgaXMgbGluay1vbiwgc2V0IHRoZSBhdXRvLW5lZ290aWF0ZSBlbmFibGUvcmVzZXQgYml0LgorICoJYXV0b25nX2NvbXBsZXRlIHNob3VsZCBiZSBzZXQgdG8gMCB3aGVuIHN0YXJ0aW5nIGF1dG8tbmVnb3RpYXRpb24uCisgKglhdXRvbmdfY29tcGxldGUgc2hvdWxkIGJlIHNldCB0byAxIGlmIHdlIGRpZG4ndCBzdGFydCBhdXRvLW5lZ290aWF0aW9uLgorICoJc2lzOTAwX3RpbWVyIHdpbGwgd2FpdCBmb3IgbGluayBvbiBhZ2FpbiBpZiBhdXRvbmdfY29tcGxldGUgPSAwLgorICovCisKK3N0YXRpYyB2b2lkIHNpczkwMF9hdXRvX25lZ290aWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IHBoeV9hZGRyKQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWludCBpID0gMDsKKwl1MzIgc3RhdHVzOworCQorCXdoaWxlIChpKysgPCAyKQorCQlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2RldiwgcGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCisJaWYgKCEoc3RhdHVzICYgTUlJX1NUQVRfTElOSykpeworCQlpZihuZXRpZl9tc2dfbGluayhzaXNfcHJpdikpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVkaWEgTGluayBPZmZcbiIsIG5ldF9kZXYtPm5hbWUpOworCQlzaXNfcHJpdi0+YXV0b25nX2NvbXBsZXRlID0gMTsKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0X2Rldik7CisJCXJldHVybjsKKwl9CisKKwkvKiAoUmUpc3RhcnQgQXV0b05lZ290aWF0ZSAqLworCW1kaW9fd3JpdGUobmV0X2RldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLAorCQkgICBNSUlfQ05UTF9BVVRPIHwgTUlJX0NOVExfUlNUX0FVVE8pOworCXNpc19wcml2LT5hdXRvbmdfY29tcGxldGUgPSAwOworfQorCisKKy8qKgorICoJc2lzOTAwX3JlYWRfbW9kZSAtIHJlYWQgbWVkaWEgbW9kZSBmb3Igc2lzOTAwIGludGVybmFsIHBoeQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHJlYWQgbW9kZSBmb3IKKyAqCUBzcGVlZCAgOiB0aGUgdHJhbnNtaXQgc3BlZWQgdG8gYmUgZGV0ZXJtaW5lZAorICoJQGR1cGxleCA6IHRoZSBkdXBsZXggbW9kZSB0byBiZSBkZXRlcm1pbmVkCisgKgorICoJVGhlIGNhcGFiaWxpdHkgb2YgcmVtb3RlIGVuZCB3aWxsIGJlIHB1dCBpbiBtaWkgcmVnaXN0ZXIgYXV0b3JlYworICoJYWZ0ZXIgYXV0by1uZWdvdGlhdGlvbi4gVXNlIEFORCBvcGVyYXRpb24gdG8gZ2V0IHRoZSB1cHBlciBib3VuZAorICoJb2Ygc3BlZWQgYW5kIGR1cGxleCBiZXR3ZWVuIHR3byBlbmRzLgorICovCisKK3N0YXRpYyB2b2lkIHNpczkwMF9yZWFkX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCXN0cnVjdCBtaWlfcGh5ICpwaHkgPSBzaXNfcHJpdi0+bWlpOworCWludCBwaHlfYWRkciA9IHNpc19wcml2LT5jdXJfcGh5OworCXUzMiBzdGF0dXM7CisJdTE2IGF1dG9hZHYsIGF1dG9yZWM7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGkrKyA8IDIpCisJCXN0YXR1cyA9IG1kaW9fcmVhZChuZXRfZGV2LCBwaHlfYWRkciwgTUlJX1NUQVRVUyk7CisKKwlpZiAoIShzdGF0dXMgJiBNSUlfU1RBVF9MSU5LKSkKKwkJcmV0dXJuOworCisJLyogQXV0b05lZ290aWF0ZSBjb21wbGV0ZWQgKi8KKwlhdXRvYWR2ID0gbWRpb19yZWFkKG5ldF9kZXYsIHBoeV9hZGRyLCBNSUlfQU5BRFYpOworCWF1dG9yZWMgPSBtZGlvX3JlYWQobmV0X2RldiwgcGh5X2FkZHIsIE1JSV9BTkxQQVIpOworCXN0YXR1cyA9IGF1dG9hZHYgJiBhdXRvcmVjOworCQorCSpzcGVlZCA9IEhXX1NQRUVEXzEwX01CUFM7CisJKmR1cGxleCA9IEZEWF9DQVBBQkxFX0hBTEZfU0VMRUNURUQ7CisKKwlpZiAoc3RhdHVzICYgKE1JSV9OV0FZX1RYIHwgTUlJX05XQVlfVFhfRkRYKSkKKwkJKnNwZWVkID0gSFdfU1BFRURfMTAwX01CUFM7CisJaWYgKHN0YXR1cyAmICggTUlJX05XQVlfVFhfRkRYIHwgTUlJX05XQVlfVF9GRFgpKQorCQkqZHVwbGV4ID0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRDsKKwkKKwlzaXNfcHJpdi0+YXV0b25nX2NvbXBsZXRlID0gMTsKKworCS8qIFdvcmthcm91bmQgZm9yIFJlYWx0ZWsgUlRMODIwMSBQSFkgaXNzdWUgKi8KKwlpZiAoKHBoeS0+cGh5X2lkMCA9PSAweDAwMDApICYmICgocGh5LT5waHlfaWQxICYgMHhGRkYwKSA9PSAweDgyMDApKSB7CisJCWlmIChtZGlvX3JlYWQobmV0X2RldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKSAmIE1JSV9DTlRMX0ZEWCkKKwkJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEOworCQlpZiAobWRpb19yZWFkKG5ldF9kZXYsIHBoeV9hZGRyLCAweDAwMTkpICYgMHgwMSkKKwkJCSpzcGVlZCA9IEhXX1NQRUVEXzEwMF9NQlBTOworCX0KKworCWlmKG5ldGlmX21zZ19saW5rKHNpc19wcml2KSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lZGlhIExpbmsgT24gJXMgJXMtZHVwbGV4IFxuIiwKKwkgICAgICAgCQkJCW5ldF9kZXYtPm5hbWUsCisJICAgICAgIAkJCQkqc3BlZWQgPT0gSFdfU1BFRURfMTAwX01CUFMgPworCSAgICAgICAJCQkJCSIxMDBtYnBzIiA6ICIxMG1icHMiLAorCSAgICAgICAJCQkJKmR1cGxleCA9PSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEID8KKwkgICAgICAgCQkJCQkiZnVsbCIgOiAiaGFsZiIpOworfQorCisvKioKKyAqCXNpczkwMF90eF90aW1lb3V0IC0gc2lzOTAwIHRyYW5zbWl0IHRpbWVvdXQgcm91dGluZQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHRyYW5zbWl0CisgKgorICoJcHJpbnQgdHJhbnNtaXQgdGltZW91dCBzdGF0dXMKKyAqCWRpc2FibGUgaW50ZXJydXB0cyBhbmQgZG8gc29tZSB0YXNrcworICovCisKK3N0YXRpYyB2b2lkIHNpczkwMF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlpZihuZXRpZl9tc2dfdHhfZXJyKHNpc19wcml2KSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRyYW5zbWl0IHRpbWVvdXQsIHN0YXR1cyAlOC44eCAlOC44eCBcbiIsCisJICAgICAgIAkJbmV0X2Rldi0+bmFtZSwgaW5sKGlvYWRkciArIGNyKSwgaW5sKGlvYWRkciArIGlzcikpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlvdXRsKDB4MDAwMCwgaW9hZGRyICsgaW1yKTsKKworCS8qIHVzZSBzcGlubG9jayB0byBwcmV2ZW50IGludGVycnVwdCBoYW5kbGVyIGFjY2Vzc2luZyBidWZmZXIgcmluZyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzaXNfcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogZGlzY2FyZCB1bnNlbnQgcGFja2V0cyAqLworCXNpc19wcml2LT5kaXJ0eV90eCA9IHNpc19wcml2LT5jdXJfdHggPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBzaXNfcHJpdi0+dHhfc2tidWZmW2ldOworCisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIAorCQkJCXNpc19wcml2LT50eF9yaW5nW2ldLmJ1ZnB0ciwgc2tiLT5sZW4sCisJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJc2lzX3ByaXYtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCQlzaXNfcHJpdi0+dHhfcmluZ1tpXS5jbWRzdHMgPSAwOworCQkJc2lzX3ByaXYtPnR4X3JpbmdbaV0uYnVmcHRyID0gMDsKKwkJCXNpc19wcml2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJCX0KKwl9CisJc2lzX3ByaXYtPnR4X2Z1bGwgPSAwOworCW5ldGlmX3dha2VfcXVldWUobmV0X2Rldik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaXNfcHJpdi0+bG9jaywgZmxhZ3MpOworCisJbmV0X2Rldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogbG9hZCBUcmFuc21pdCBEZXNjcmlwdG9yIFJlZ2lzdGVyICovCisJb3V0bChzaXNfcHJpdi0+dHhfcmluZ19kbWEsIGlvYWRkciArIHR4ZHApOworCisJLyogRW5hYmxlIGFsbCBrbm93biBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCW91dGwoKFJ4U09WUnxSeE9STnxSeEVSUnxSeE9LfFR4VVJOfFR4RVJSfFR4SURMRSksIGlvYWRkciArIGltcik7CisJcmV0dXJuOworfQorCisvKioKKyAqCXNpczkwMF9zdGFydF94bWl0IC0gc2lzOTAwIHN0YXJ0IHRyYW5zbWl0IHJvdXRpbmUKKyAqCUBza2I6IHNvY2tldCBidWZmZXIgcG9pbnRlciB0byBwdXQgdGhlIGRhdGEgYmVpbmcgdHJhbnNtaXR0ZWQKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byB0cmFuc21pdCB3aXRoCisgKgorICoJU2V0IHRoZSB0cmFuc21pdCBidWZmZXIgZGVzY3JpcHRvciwgCisgKglhbmQgd3JpdGUgVHhFTkEgdG8gZW5hYmxlIHRyYW5zbWl0IHN0YXRlIG1hY2hpbmUuCisgKgl0ZWxsIHVwcGVyIGxheWVyIGlmIHRoZSBidWZmZXIgaXMgZnVsbAorICovCisKK3N0YXRpYyBpbnQKK3NpczkwMF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGludCAgZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgIGluZGV4X2N1cl90eCwgaW5kZXhfZGlydHlfdHg7CisJdW5zaWduZWQgaW50ICBjb3VudF9kaXJ0eV90eDsKKworCS8qIERvbid0IHRyYW5zbWl0IGRhdGEgYmVmb3JlIHRoZSBjb21wbGV0ZSBvZiBhdXRvLW5lZ290aWF0aW9uICovCisJaWYoIXNpc19wcml2LT5hdXRvbmdfY29tcGxldGUpeworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2lzX3ByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0gc2lzX3ByaXYtPmN1cl90eCAlIE5VTV9UWF9ERVNDOworCXNpc19wcml2LT50eF9za2J1ZmZbZW50cnldID0gc2tiOworCisJLyogc2V0IHRoZSB0cmFuc21pdCBidWZmZXIgZGVzY3JpcHRvciBhbmQgZW5hYmxlIFRyYW5zbWl0IFN0YXRlIE1hY2hpbmUgKi8KKwlzaXNfcHJpdi0+dHhfcmluZ1tlbnRyeV0uYnVmcHRyID0gcGNpX21hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsCisJCXNrYi0+ZGF0YSwgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCXNpc19wcml2LT50eF9yaW5nW2VudHJ5XS5jbWRzdHMgPSAoT1dOIHwgc2tiLT5sZW4pOworCW91dGwoVHhFTkEgfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7CisKKwlzaXNfcHJpdi0+Y3VyX3R4ICsrOworCWluZGV4X2N1cl90eCA9IHNpc19wcml2LT5jdXJfdHg7CisJaW5kZXhfZGlydHlfdHggPSBzaXNfcHJpdi0+ZGlydHlfdHg7CisKKwlmb3IgKGNvdW50X2RpcnR5X3R4ID0gMDsgaW5kZXhfY3VyX3R4ICE9IGluZGV4X2RpcnR5X3R4OyBpbmRleF9kaXJ0eV90eCsrKQorCQljb3VudF9kaXJ0eV90eCArKzsKKworCWlmIChpbmRleF9jdXJfdHggPT0gaW5kZXhfZGlydHlfdHgpIHsKKwkJLyogZGlydHlfdHggaXMgbWV0IGluIHRoZSBjeWNsZSBvZiBjdXJfdHgsIGJ1ZmZlciBmdWxsICovCisJCXNpc19wcml2LT50eF9mdWxsID0gMTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKwl9IGVsc2UgaWYgKGNvdW50X2RpcnR5X3R4IDwgTlVNX1RYX0RFU0MpIHsgCisJCS8qIFR5cGljYWwgcGF0aCwgdGVsbCB1cHBlciBsYXllciB0aGF0IG1vcmUgdHJhbnNtaXNzaW9uIGlzIHBvc3NpYmxlICovCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOworCX0gZWxzZSB7CisJCS8qIGJ1ZmZlciBmdWxsLCB0ZWxsIHVwcGVyIGxheWVyIG5vIG1vcmUgdHJhbnNtaXNzaW9uICovCisJCXNpc19wcml2LT50eF9mdWxsID0gMTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaXNfcHJpdi0+bG9jaywgZmxhZ3MpOworCisJbmV0X2Rldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJaWYgKG5ldGlmX21zZ190eF9xdWV1ZWQoc2lzX3ByaXYpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFF1ZXVlZCBUeCBwYWNrZXQgYXQgJXAgc2l6ZSAlZCAiCisJCSAgICAgICAidG8gc2xvdCAlZC5cbiIsCisJCSAgICAgICBuZXRfZGV2LT5uYW1lLCBza2ItPmRhdGEsIChpbnQpc2tiLT5sZW4sIGVudHJ5KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXNpczkwMF9pbnRlcnJ1cHQgLSBzaXM5MDAgaW50ZXJydXB0IGhhbmRsZXIKKyAqCUBpcnE6IHRoZSBpcnEgbnVtYmVyCisgKglAZGV2X2luc3RhbmNlOiB0aGUgY2xpZW50IGRhdGEgb2JqZWN0CisgKglAcmVnczogc25hcHNob3Qgb2YgcHJvY2Vzc29yIGNvbnRleHQKKyAqCisgKglUaGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhbGwgb2YgdGhlIFJ4IHRocmVhZCB3b3JrLCAKKyAqCWFuZCBjbGVhbnMgdXAgYWZ0ZXIgdGhlIFR4IHRocmVhZAorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzaXM5MDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICpzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJaW50IGJvZ3VzY250ID0gbWF4X2ludGVycnVwdF93b3JrOworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCXUzMiBzdGF0dXM7CisJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAwOworCisJc3Bpbl9sb2NrICgmc2lzX3ByaXYtPmxvY2spOworCisJZG8geworCQlzdGF0dXMgPSBpbmwoaW9hZGRyICsgaXNyKTsKKworCQlpZiAoKHN0YXR1cyAmIChISUJFUlJ8VHhVUk58VHhFUlJ8VHhJRExFfFJ4T1JOfFJ4RVJSfFJ4T0spKSA9PSAwKQorCQkJLyogbm90aGluZyBpbnRyZXN0aW5nIGhhcHBlbmVkICovCisJCQlicmVhazsKKwkJaGFuZGxlZCA9IDE7CisKKwkJLyogd2h5IGRvdyd0IHdlIGJyZWFrIGFmdGVyIFR4L1J4IGNhc2UgPz8ga2V5d29yZDogZnVsbC1kdXBsZXggKi8KKwkJaWYgKHN0YXR1cyAmIChSeE9STiB8IFJ4RVJSIHwgUnhPSykpCisJCQkvKiBSeCBpbnRlcnJ1cHQgKi8KKwkJCXNpczkwMF9yeChuZXRfZGV2KTsKKworCQlpZiAoc3RhdHVzICYgKFR4VVJOIHwgVHhFUlIgfCBUeElETEUpKQorCQkJLyogVHggaW50ZXJydXB0ICovCisJCQlzaXM5MDBfZmluaXNoX3htaXQobmV0X2Rldik7CisKKwkJLyogc29tZXRoaW5nIHN0cmFuZ2UgaGFwcGVuZWQgISEhICovCisJCWlmIChzdGF0dXMgJiBISUJFUlIpIHsKKwkJCWlmKG5ldGlmX21zZ19pbnRyKHNpc19wcml2KSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQWJub3JtYWwgaW50ZXJydXB0LCIKKwkJCQkJInN0YXR1cyAlIzguOHguXG4iLCBuZXRfZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKC0tYm9ndXNjbnQgPCAwKSB7CisJCQlpZihuZXRpZl9tc2dfaW50cihzaXNfcHJpdikpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRvbyBtdWNoIHdvcmsgYXQgaW50ZXJydXB0LCAiCisJCQkJCSJpbnRlcnJ1cHQgc3RhdHVzID0gJSM4Ljh4LlxuIiwKKwkJCQkJbmV0X2Rldi0+bmFtZSwgc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlpZihuZXRpZl9tc2dfaW50cihzaXNfcHJpdikpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsICIKKwkJICAgICAgICJpbnRlcnJ1cHQgc3RhdHVzID0gMHglIzguOHguXG4iLAorCQkgICAgICAgbmV0X2Rldi0+bmFtZSwgaW5sKGlvYWRkciArIGlzcikpOworCQorCXNwaW5fdW5sb2NrICgmc2lzX3ByaXYtPmxvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKioKKyAqCXNpczkwMF9yeCAtIHNpczkwMCByZWNlaXZlIHJvdXRpbmUKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB3aGljaCByZWNlaXZlcyBkYXRhCisgKgorICoJUHJvY2VzcyByZWNlaXZlIGludGVycnVwdCBldmVudHMsIAorICoJcHV0IGJ1ZmZlciB0byBoaWdoZXIgbGF5ZXIgYW5kIHJlZmlsbCBidWZmZXIgcG9vbAorICoJTm90ZTogVGhpcyBmdWNudGlvbiBpcyBjYWxsZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIsIAorICoJZG9uJ3QgZG8gInRvbyBtdWNoIiB3b3JrIGhlcmUKKyAqLworCitzdGF0aWMgaW50IHNpczkwMF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgZW50cnkgPSBzaXNfcHJpdi0+Y3VyX3J4ICUgTlVNX1JYX0RFU0M7CisJdTMyIHJ4X3N0YXR1cyA9IHNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5jbWRzdHM7CisKKwlpZiAobmV0aWZfbXNnX3J4X3N0YXR1cyhzaXNfcHJpdikpCisJCXByaW50ayhLRVJOX0RFQlVHICJzaXM5MDBfcngsIGN1cl9yeDolNC40ZCwgZGlydHlfcng6JTQuNGQgIgorCQkgICAgICAgInN0YXR1czoweCU4Ljh4XG4iLAorCQkgICAgICAgc2lzX3ByaXYtPmN1cl9yeCwgc2lzX3ByaXYtPmRpcnR5X3J4LCByeF9zdGF0dXMpOworCisJd2hpbGUgKHJ4X3N0YXR1cyAmIE9XTikgeworCQl1bnNpZ25lZCBpbnQgcnhfc2l6ZTsKKworCQlyeF9zaXplID0gKHJ4X3N0YXR1cyAmIERTSVpFKSAtIENSQ19TSVpFOworCisJCWlmIChyeF9zdGF0dXMgJiAoQUJPUlR8T1ZFUlJVTnxUT09MT05HfFJVTlR8UlhJU0VSUnxDUkNFUlJ8RkFFUlIpKSB7CisJCQkvKiBjb3JydXB0ZWQgcGFja2V0IHJlY2VpdmVkICovCisJCQlpZiAobmV0aWZfbXNnX3J4X2VycihzaXNfcHJpdikpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDb3JydXB0ZWQgcGFja2V0ICIKKwkJCQkgICAgICAgInJlY2VpdmVkLCBidWZmZXIgc3RhdHVzID0gMHglOC44eC5cbiIsCisJCQkJICAgICAgIG5ldF9kZXYtPm5hbWUsIHJ4X3N0YXR1cyk7CisJCQlzaXNfcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAocnhfc3RhdHVzICYgT1ZFUlJVTikKKwkJCQlzaXNfcHJpdi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmIChyeF9zdGF0dXMgJiAoVE9PTE9OR3xSVU5UKSkKKwkJCQlzaXNfcHJpdi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKHJ4X3N0YXR1cyAmIChSWElTRVJSIHwgRkFFUlIpKQorCQkJCXNpc19wcml2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChyeF9zdGF0dXMgJiBDUkNFUlIpIAorCQkJCXNpc19wcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkvKiByZXNldCBidWZmZXIgZGVzY3JpcHRvciBzdGF0ZSAqLworCQkJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmNtZHN0cyA9IFJYX0JVRl9TSVpFOworCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKiBza2I7CisKKwkJCS8qIFRoaXMgc2l0dWF0aW9uIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBkdWUgdG8KKwkJCSAgIHNvbWUgdW5rbm93IGJ1Z3MsIGl0IGlzIHBvc3NpYmxlIHRoYXQKKwkJCSAgIHdlIGFyZSB3b3JraW5nIG9uIE5VTEwgc2tfYnVmZiA6LSggKi8KKwkJCWlmIChzaXNfcHJpdi0+cnhfc2tidWZmW2VudHJ5XSA9PSBOVUxMKSB7CisJCQkJaWYgKG5ldGlmX21zZ19yeF9lcnIoc2lzX3ByaXYpKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTlVMTCBwb2ludGVyICIgCisJCQkJCQkiZW5jb3VudGVyZWQgaW4gUnggcmluZywgc2tpcHBpbmdcbiIsCisJCQkJCQluZXRfZGV2LT5uYW1lKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcGNpX3VubWFwX3NpbmdsZShzaXNfcHJpdi0+cGNpX2RldiwgCisJCQkJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmJ1ZnB0ciwgUlhfQlVGX1NJWkUsIAorCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkvKiBnaXZlIHRoZSBzb2NrZXQgYnVmZmVyIHRvIHVwcGVyIGxheWVycyAqLworCQkJc2tiID0gc2lzX3ByaXYtPnJ4X3NrYnVmZltlbnRyeV07CisJCQlza2JfcHV0KHNrYiwgcnhfc2l6ZSk7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRfZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisKKwkJCS8qIHNvbWUgbmV0d29yayBzdGF0aXN0aWNzICovCisJCQlpZiAoKHJ4X3N0YXR1cyAmIEJDQVNUKSA9PSBNQ0FTVCkKKwkJCQlzaXNfcHJpdi0+c3RhdHMubXVsdGljYXN0Kys7CisJCQluZXRfZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXNpc19wcml2LT5zdGF0cy5yeF9ieXRlcyArPSByeF9zaXplOworCQkJc2lzX3ByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKworCQkJLyogcmVmaWxsIHRoZSBSeCBidWZmZXIsIHdoYXQgaWYgdGhlcmUgaXMgbm90IGVub3VnaHQKKwkJCSAqIG1lbW9yeSBmb3IgbmV3IHNvY2tldCBidWZmZXIgPz8gKi8KKwkJCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYihSWF9CVUZfU0laRSkpID09IE5VTEwpIHsKKwkJCQkvKiBub3QgZW5vdWdoIG1lbW9yeSBmb3Igc2tidWZmLCB0aGlzIG1ha2VzIGEKKwkJCQkgKiAiaG9sZSIgb24gdGhlIGJ1ZmZlciByaW5nLCBpdCBpcyBub3QgY2xlYXIKKwkJCQkgKiBob3cgdGhlIGhhcmR3YXJlIHdpbGwgcmVhY3QgdG8gdGhpcyBraW5kCisJCQkJICogb2YgZGVnZW5lcmF0ZWQgYnVmZmVyICovCisJCQkJaWYgKG5ldGlmX21zZ19yeF9zdGF0dXMoc2lzX3ByaXYpKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVtb3J5IHNxdWVlemUsIgorCQkJCQkJImRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkJCQkJbmV0X2Rldi0+bmFtZSk7CisJCQkJc2lzX3ByaXYtPnJ4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJCS8qIHJlc2V0IGJ1ZmZlciBkZXNjcmlwdG9yIHN0YXRlICovCisJCQkJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmNtZHN0cyA9IDA7CisJCQkJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmJ1ZnB0ciA9IDA7CisJCQkJc2lzX3ByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNrYi0+ZGV2ID0gbmV0X2RldjsKKwkJCXNpc19wcml2LT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQkJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmNtZHN0cyA9IFJYX0JVRl9TSVpFOworICAgICAgICAgICAgICAgIAlzaXNfcHJpdi0+cnhfcmluZ1tlbnRyeV0uYnVmcHRyID0gCisJCQkJcGNpX21hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIHNrYi0+dGFpbCwgCisJCQkJCVJYX0JVRl9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJc2lzX3ByaXYtPmRpcnR5X3J4Kys7CisJCX0KKwkJc2lzX3ByaXYtPmN1cl9yeCsrOworCQllbnRyeSA9IHNpc19wcml2LT5jdXJfcnggJSBOVU1fUlhfREVTQzsKKwkJcnhfc3RhdHVzID0gc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmNtZHN0czsKKwl9IC8vIHdoaWxlCisKKwkvKiByZWZpbGwgdGhlIFJ4IGJ1ZmZlciwgd2hhdCBpZiB0aGUgcmF0ZSBvZiByZWZpbGxpbmcgaXMgc2xvd2VyCisJICogdGhhbiBjb25zdW1pbmcgPz8gKi8KKwlmb3IgKDtzaXNfcHJpdi0+Y3VyX3J4IC0gc2lzX3ByaXYtPmRpcnR5X3J4ID4gMDsgc2lzX3ByaXYtPmRpcnR5X3J4KyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQllbnRyeSA9IHNpc19wcml2LT5kaXJ0eV9yeCAlIE5VTV9SWF9ERVNDOworCisJCWlmIChzaXNfcHJpdi0+cnhfc2tidWZmW2VudHJ5XSA9PSBOVUxMKSB7CisJCQlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoUlhfQlVGX1NJWkUpKSA9PSBOVUxMKSB7CisJCQkJLyogbm90IGVub3VnaCBtZW1vcnkgZm9yIHNrYnVmZiwgdGhpcyBtYWtlcyBhCisJCQkJICogImhvbGUiIG9uIHRoZSBidWZmZXIgcmluZywgaXQgaXMgbm90IGNsZWFyCisJCQkJICogaG93IHRoZSBoYXJkd2FyZSB3aWxsIHJlYWN0IHRvIHRoaXMga2luZAorCQkJCSAqIG9mIGRlZ2VuZXJhdGVkIGJ1ZmZlciAqLworCQkJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHNpc19wcml2KSkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lbW9yeSBzcXVlZXplLCIKKwkJCQkJCSJkZWZlcnJpbmcgcGFja2V0LlxuIiwKKwkJCQkJCW5ldF9kZXYtPm5hbWUpOworCQkJCXNpc19wcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlza2ItPmRldiA9IG5ldF9kZXY7CisJCQlzaXNfcHJpdi0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKwkJCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKKyAgICAgICAgICAgICAgICAJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmJ1ZnB0ciA9CisJCQkJcGNpX21hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIHNrYi0+dGFpbCwKKwkJCQkJUlhfQlVGX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCX0KKwl9CisJLyogcmUtZW5hYmxlIHRoZSBwb3RlbnRpYWxseSBpZGxlIHJlY2VpdmUgc3RhdGUgbWF0Y2hpbmUgKi8KKwlvdXRsKFJ4RU5BIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXNpczkwMF9maW5pc2hfeG1pdCAtIGZpbmlzaCB1cCB0cmFuc21pc3Npb24gb2YgcGFja2V0cworICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGJlIHRyYW5zbWl0dGVkIG9uCisgKgorICoJQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbiBhbmQgZnJlZSBzb2NrZXQgYnVmZmVyIGV0YyAKKyAqCXNjaGVkdWxlIGZvciBtb3JlIHRyYW5zbWlzc2lvbiBhcyBuZWVkZWQKKyAqCU5vdGU6IFRoaXMgZnVjbnRpb24gaXMgY2FsbGVkIGJ5IGludGVycnVwdCBoYW5kbGVyLCAKKyAqCWRvbid0IGRvICJ0b28gbXVjaCIgd29yayBoZXJlCisgKi8KKworc3RhdGljIHZvaWQgc2lzOTAwX2ZpbmlzaF94bWl0IChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKworCWZvciAoOyBzaXNfcHJpdi0+ZGlydHlfdHggIT0gc2lzX3ByaXYtPmN1cl90eDsgc2lzX3ByaXYtPmRpcnR5X3R4KyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdW5zaWduZWQgaW50IGVudHJ5OworCQl1MzIgdHhfc3RhdHVzOworCisJCWVudHJ5ID0gc2lzX3ByaXYtPmRpcnR5X3R4ICUgTlVNX1RYX0RFU0M7CisJCXR4X3N0YXR1cyA9IHNpc19wcml2LT50eF9yaW5nW2VudHJ5XS5jbWRzdHM7CisKKwkJaWYgKHR4X3N0YXR1cyAmIE9XTikgeworCQkJLyogVGhlIHBhY2tldCBpcyBub3QgdHJhbnNtaXR0ZWQgeWV0IChvd25lZCBieSBoYXJkd2FyZSkgIQorCQkJICogTm90ZTogdGhlIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgb25seSB3aGVuIFR4IE1hY2hpbmUKKwkJCSAqIGlzIGlkbGUsIHNvIHRoaXMgaXMgYW4gYWxtb3N0IGltcG9zc2libGUgY2FzZSAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodHhfc3RhdHVzICYgKEFCT1JUIHwgVU5ERVJSVU4gfCBPV0NPTEwpKSB7CisJCQkvKiBwYWNrZXQgdW5zdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQgKi8KKwkJCWlmIChuZXRpZl9tc2dfdHhfZXJyKHNpc19wcml2KSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRyYW5zbWl0ICIKKwkJCQkgICAgICAgImVycm9yLCBUeCBzdGF0dXMgJTguOHguXG4iLAorCQkJCSAgICAgICBuZXRfZGV2LT5uYW1lLCB0eF9zdGF0dXMpOworCQkJc2lzX3ByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIFVOREVSUlVOKQorCQkJCXNpc19wcml2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIEFCT1JUKQorCQkJCXNpc19wcml2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIE5PQ0FSUklFUikKKwkJCQlzaXNfcHJpdi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiBPV0NPTEwpCisJCQkJc2lzX3ByaXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIHBhY2tldCBzdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQgKi8KKwkJCXNpc19wcml2LT5zdGF0cy5jb2xsaXNpb25zICs9ICh0eF9zdGF0dXMgJiBDT0xDTlQpID4+IDE2OworCQkJc2lzX3ByaXYtPnN0YXRzLnR4X2J5dGVzICs9IHR4X3N0YXR1cyAmIERTSVpFOworCQkJc2lzX3ByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCXNrYiA9IHNpc19wcml2LT50eF9za2J1ZmZbZW50cnldOworCQlwY2lfdW5tYXBfc2luZ2xlKHNpc19wcml2LT5wY2lfZGV2LCAKKwkJCXNpc19wcml2LT50eF9yaW5nW2VudHJ5XS5idWZwdHIsIHNrYi0+bGVuLAorCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCXNpc19wcml2LT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJc2lzX3ByaXYtPnR4X3JpbmdbZW50cnldLmJ1ZnB0ciA9IDA7CisJCXNpc19wcml2LT50eF9yaW5nW2VudHJ5XS5jbWRzdHMgPSAwOworCX0KKworCWlmIChzaXNfcHJpdi0+dHhfZnVsbCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKG5ldF9kZXYpICYmCisJICAgIHNpc19wcml2LT5jdXJfdHggLSBzaXNfcHJpdi0+ZGlydHlfdHggPCBOVU1fVFhfREVTQyAtIDQpIHsKKwkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIGNsZWFyIHR4X2Z1bGwgYW5kIHNjaGVkdWxlCisJCSAqIG1vcmUgdHJhbnNtaXNzaW9uIGJ5IG5ldGlmX3dha2VfcXVldWUobmV0X2RldikgKi8KKwkJc2lzX3ByaXYtPnR4X2Z1bGwgPSAwOworCQluZXRpZl93YWtlX3F1ZXVlIChuZXRfZGV2KTsKKwl9Cit9CisKKy8qKgorICoJc2lzOTAwX2Nsb3NlIC0gY2xvc2Ugc2lzOTAwIGRldmljZSAKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBiZSBjbG9zZWQKKyAqCisgKglEaXNhYmxlIGludGVycnVwdHMsIHN0b3AgdGhlIFR4IGFuZCBSeCBTdGF0dXMgTWFjaGluZSAKKyAqCWZyZWUgVHggYW5kIFJYIHNvY2tldCBidWZmZXIKKyAqLworCitzdGF0aWMgaW50IHNpczkwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBpOworCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJb3V0bCgweDAwMDAsIGlvYWRkciArIGltcik7CisJb3V0bCgweDAwMDAsIGlvYWRkciArIGllcik7CisKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IFN0YXR1cyBNYWNoaW5lICovCisJb3V0bChSeERJUyB8IFR4RElTIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOworCisJZGVsX3RpbWVyKCZzaXNfcHJpdi0+dGltZXIpOworCisJZnJlZV9pcnEobmV0X2Rldi0+aXJxLCBuZXRfZGV2KTsKKworCS8qIEZyZWUgVHggYW5kIFJYIHNrYnVmZiAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrKSB7CisJCXNrYiA9IHNpc19wcml2LT5yeF9za2J1ZmZbaV07CisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIAorCQkJCXNpc19wcml2LT5yeF9yaW5nW2ldLmJ1ZnB0ciwKKwkJCQlSWF9CVUZfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXNpc19wcml2LT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrKSB7CisJCXNrYiA9IHNpc19wcml2LT50eF9za2J1ZmZbaV07CisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIAorCQkJCXNpc19wcml2LT50eF9yaW5nW2ldLmJ1ZnB0ciwgc2tiLT5sZW4sCisJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlzaXNfcHJpdi0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KKworCS8qIEdyZWVuISBQdXQgdGhlIGNoaXAgaW4gbG93LXBvd2VyIG1vZGUuICovCisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzaXM5MDBfZ2V0X2RydmluZm8gLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgZHJpdmVyCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gcHJvYmUKKyAqCUBpbmZvOiBjb250YWluZXIgZm9yIGluZm8gcmV0dXJuZWQKKyAqCisgKglQcm9jZXNzIGV0aHRvb2wgY29tbWFuZCBzdWNoIGFzICJlaHRvb2wgLWkiIHRvIHNob3cgaW5mb3JtYXRpb24KKyAqLworIAorc3RhdGljIHZvaWQgc2lzOTAwX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisgCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCisJc3RyY3B5IChpbmZvLT5kcml2ZXIsIFNJUzkwMF9NT0RVTEVfTkFNRSk7CisJc3RyY3B5IChpbmZvLT52ZXJzaW9uLCBTSVM5MDBfRFJWX1ZFUlNJT04pOworCXN0cmNweSAoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHNpc19wcml2LT5wY2lfZGV2KSk7Cit9CisKK3N0YXRpYyB1MzIgc2lzOTAwX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlyZXR1cm4gc2lzX3ByaXYtPm1zZ19lbmFibGU7Cit9CisgIAorc3RhdGljIHZvaWQgc2lzOTAwX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgdTMyIHZhbHVlKQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCXNpc19wcml2LT5tc2dfZW5hYmxlID0gdmFsdWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgc2lzOTAwX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbyAJPSBzaXM5MDBfZ2V0X2RydmluZm8sCisJLmdldF9tc2dsZXZlbAk9IHNpczkwMF9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAk9IHNpczkwMF9zZXRfbXNnbGV2ZWwsCit9OworCisvKioKKyAqCW1paV9pb2N0bCAtIHByb2Nlc3MgTUlJIGkvbyBjb250cm9sIGNvbW1hbmQgCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gY29tbWFuZCBmb3IKKyAqCUBycTogcGFyYW1ldGVyIGZvciBjb21tYW5kCisgKglAY21kOiB0aGUgaS9vIGNvbW1hbmQKKyAqCisgKglQcm9jZXNzIE1JSSBjb21tYW5kIGxpa2UgcmVhZC93cml0ZSBNSUkgcmVnaXN0ZXIKKyAqLworCitzdGF0aWMgaW50IG1paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkocnEpOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KKwkJZGF0YS0+cGh5X2lkID0gc2lzX3ByaXYtPm1paS0+cGh5X2FkZHI7CisJCS8qIEZhbGwgVGhyb3VnaCAqLworCisJY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJZGF0YS0+dmFsX291dCA9IG1kaW9fcmVhZChuZXRfZGV2LCBkYXRhLT5waHlfaWQgJiAweDFmLCBkYXRhLT5yZWdfbnVtICYgMHgxZik7CisJCXJldHVybiAwOworCisJY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCW1kaW9fd3JpdGUobmV0X2RldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYsIGRhdGEtPnZhbF9pbik7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKKy8qKgorICoJc2lzOTAwX2dldF9zdGF0cyAtIEdldCBzaXM5MDAgcmVhZC93cml0ZSBzdGF0aXN0aWNzIAorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGdldCBzdGF0aXN0aWNzIGZvcgorICoKKyAqCWdldCB0eC9yeCBzdGF0aXN0aWNzIGZvciBzaXM5MDAKKyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorc2lzOTAwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKworCXJldHVybiAmc2lzX3ByaXYtPnN0YXRzOworfQorCisvKioKKyAqCXNpczkwMF9zZXRfY29uZmlnIC0gU2V0IG1lZGlhIHR5cGUgYnkgbmV0X2RldmljZS5zZXRfY29uZmlnIAorICoJQGRldjogdGhlIG5ldCBkZXZpY2UgZm9yIG1lZGlhIHR5cGUgY2hhbmdlCisgKglAbWFwOiBpZm1hcCBwYXNzZWQgYnkgaWZjb25maWcKKyAqCisgKglTZXQgbWVkaWEgdHlwZSB0byAxMGJhc2VULCAxMDBiYXNlVCBvciAwKGZvciBhdXRvKSBieSBpZmNvbmZpZworICoJd2Ugc3VwcG9ydCBvbmx5IHBvcnQgY2hhbmdlcy4gQWxsIG90aGVyIHJ1bnRpbWUgY29uZmlndXJhdGlvbgorICoJY2hhbmdlcyB3aWxsIGJlIGlnbm9yZWQKKyAqLworCitzdGF0aWMgaW50IHNpczkwMF9zZXRfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQoreyAgICAKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCBtaWlfcGh5ICptaWlfcGh5ID0gc2lzX3ByaXYtPm1paTsKKyAgICAgICAgCisJdTE2IHN0YXR1czsKKworCWlmICgobWFwLT5wb3J0ICE9ICh1X2NoYXIpKC0xKSkgJiYgKG1hcC0+cG9ydCAhPSBkZXYtPmlmX3BvcnQpKSB7CisJCS8qIHdlIHN3aXRjaCBvbiB0aGUgaWZtYXAtPnBvcnQgZmllbGQuIEkgY291bGRuJ3QgZmluZCBhbnl0aGluZworCQkgKiBsaWtlIGEgZGVmaW5pdGlvbiBvciBzdGFuZGFyZCBmb3IgdGhlIHZhbHVlcyBvZiB0aGF0IGZpZWxkLgorCQkgKiBJIHRoaW5rIHRoZSBtZWFuaW5nIG9mIHRob3NlIHZhbHVlcyBpcyBkZXZpY2Ugc3BlY2lmaWMuIEJ1dAorCQkgKiBzaW5jZSBJIHdvdWxkIGxpa2UgdG8gY2hhbmdlIHRoZSBtZWRpYSB0eXBlIHZpYSB0aGUgaWZjb25maWcKKwkJICogY29tbWFuZCBJIHVzZSB0aGUgZGVmaW5pdGlvbiBmcm9tIGxpbnV4L25ldGRldmljZS5oIAorCQkgKiAod2hpY2ggc2VlbXMgdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlIGlmcG9ydChwY21jaWEpIGRlZmluaXRpb24pICovCisJCXN3aXRjaChtYXAtPnBvcnQpeworCQljYXNlIElGX1BPUlRfVU5LTk9XTjogLyogdXNlIGF1dG8gaGVyZSAqLyAgIAorCQkJZGV2LT5pZl9wb3J0ID0gbWFwLT5wb3J0OworCQkJLyogd2UgYXJlIGdvaW5nIHRvIGNoYW5nZSB0aGUgbWVkaWEgdHlwZSwgc28gdGhlIExpbmsKKwkJCSAqIHdpbGwgYmUgdGVtcG9yYXJ5IGRvd24gYW5kIHdlIG5lZWQgdG8gcmVmbGVjdCB0aGF0CisJCQkgKiBoZXJlLiBXaGVuIHRoZSBMaW5rIGNvbWVzIHVwIGFnYWluLCBpdCB3aWxsIGJlCisJCQkgKiBzZW5zZWQgYnkgdGhlIHNpc190aW1lciBwcm9jZWR1cmUsIHdoaWNoIGFsc28gZG9lcworCQkJICogYWxsIHRoZSByZXN0IGZvciB1cyAqLworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKyAgICAgICAgICAgICAgICAKKwkJCS8qIHJlYWQgY3VycmVudCBzdGF0ZSAqLworCQkJc3RhdHVzID0gbWRpb19yZWFkKGRldiwgbWlpX3BoeS0+cGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKyAgICAgICAgICAgICAgICAKKwkJCS8qIGVuYWJsZSBhdXRvIG5lZ290aWF0aW9uIGFuZCByZXNldCB0aGUgbmVnb3Rpb2F0aW9uCisJCQkgKiAoSSBkb24ndCByZWFsbHkga25vdyB3aGF0IHRoZSBhdXRvIG5lZ2F0aW90aWF0aW9uCisJCQkgKiByZXNldCByZWFsbHkgbWVhbnMsIGJ1dCBpdCBzb3VuZHMgZm9yIG1lIHJpZ2h0IHRvCisJCQkgKiBkbyBvbmUgaGVyZSkgKi8KKwkJCW1kaW9fd3JpdGUoZGV2LCBtaWlfcGh5LT5waHlfYWRkciwKKwkJCQkgICBNSUlfQ09OVFJPTCwgc3RhdHVzIHwgTUlJX0NOVExfQVVUTyB8IE1JSV9DTlRMX1JTVF9BVVRPKTsKKworCQkJYnJlYWs7CisgICAgICAgICAgICAKKwkJY2FzZSBJRl9QT1JUXzEwQkFTRVQ6IC8qIDEwQmFzZVQgKi8gICAgICAgICAKKwkJCWRldi0+aWZfcG9ydCA9IG1hcC0+cG9ydDsKKyAgICAgICAgICAgICAgICAKKwkJCS8qIHdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlIG1lZGlhIHR5cGUsIHNvIHRoZSBMaW5rCisJCQkgKiB3aWxsIGJlIHRlbXBvcmFyeSBkb3duIGFuZCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhhdAorCQkJICogaGVyZS4gV2hlbiB0aGUgTGluayBjb21lcyB1cCBhZ2FpbiwgaXQgd2lsbCBiZQorCQkJICogc2Vuc2VkIGJ5IHRoZSBzaXNfdGltZXIgcHJvY2VkdXJlLCB3aGljaCBhbHNvIGRvZXMKKwkJCSAqIGFsbCB0aGUgcmVzdCBmb3IgdXMgKi8KKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisgICAgICAgIAorCQkJLyogc2V0IFNwZWVkIHRvIDEwTWJwcyAqLworCQkJLyogcmVhZCBjdXJyZW50IHN0YXRlICovCisJCQlzdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBtaWlfcGh5LT5waHlfYWRkciwgTUlJX0NPTlRST0wpOworICAgICAgICAgICAgICAgIAorCQkJLyogZGlzYWJsZSBhdXRvIG5lZ290aWF0aW9uIGFuZCBmb3JjZSAxME1CaXQgbW9kZSovCisJCQltZGlvX3dyaXRlKGRldiwgbWlpX3BoeS0+cGh5X2FkZHIsCisJCQkJICAgTUlJX0NPTlRST0wsIHN0YXR1cyAmIH4oTUlJX0NOVExfU1BFRUQgfAorCQkJCQlNSUlfQ05UTF9BVVRPKSk7CisJCQlicmVhazsKKyAgICAgICAgICAgIAorCQljYXNlIElGX1BPUlRfMTAwQkFTRVQ6IC8qIDEwMEJhc2VUICovCisJCWNhc2UgSUZfUE9SVF8xMDBCQVNFVFg6IC8qIDEwMEJhc2VUeCAqLyAKKwkJCWRldi0+aWZfcG9ydCA9IG1hcC0+cG9ydDsKKyAgICAgICAgICAgICAgICAKKwkJCS8qIHdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlIG1lZGlhIHR5cGUsIHNvIHRoZSBMaW5rCisJCQkgKiB3aWxsIGJlIHRlbXBvcmFyeSBkb3duIGFuZCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhhdAorCQkJICogaGVyZS4gV2hlbiB0aGUgTGluayBjb21lcyB1cCBhZ2FpbiwgaXQgd2lsbCBiZQorCQkJICogc2Vuc2VkIGJ5IHRoZSBzaXNfdGltZXIgcHJvY2VkdXJlLCB3aGljaCBhbHNvIGRvZXMKKwkJCSAqIGFsbCB0aGUgcmVzdCBmb3IgdXMgKi8KKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisgICAgICAgICAgICAgICAgCisJCQkvKiBzZXQgU3BlZWQgdG8gMTAwTWJwcyAqLworCQkJLyogZGlzYWJsZSBhdXRvIG5lZ290aWF0aW9uIGFuZCBlbmFibGUgMTAwTUJpdCBNb2RlICovCisJCQlzdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBtaWlfcGh5LT5waHlfYWRkciwgTUlJX0NPTlRST0wpOworCQkJbWRpb193cml0ZShkZXYsIG1paV9waHktPnBoeV9hZGRyLAorCQkJCSAgIE1JSV9DT05UUk9MLCAoc3RhdHVzICYgfk1JSV9DTlRMX1NQRUVEKSB8CisJCQkJICAgTUlJX0NOVExfU1BFRUQpOworICAgICAgICAgICAgICAgIAorCQkJYnJlYWs7CisgICAgICAgICAgICAKKwkJY2FzZSBJRl9QT1JUXzEwQkFTRTI6IC8qIDEwQmFzZTIgKi8KKwkJY2FzZSBJRl9QT1JUX0FVSTogLyogQVVJICovCisJCWNhc2UgSUZfUE9SVF8xMDBCQVNFRlg6IC8qIDEwMEJhc2VGeCAqLworICAgICAgICAgICAgICAgIAkvKiBUaGVzZSBNb2RlcyBhcmUgbm90IHN1cHBvcnRlZCAoYXJlIHRoZXk/KSovCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKyAgICAgICAgICAgIAorCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2lzOTAwX21jYXN0X2JpdG5yIC0gY29tcHV0ZSBoYXNodGFibGUgaW5kZXggCisgKglAYWRkcjogbXVsdGljYXN0IGFkZHJlc3MKKyAqCUByZXZpc2lvbjogcmV2aXNpb24gaWQgb2YgY2hpcAorICoKKyAqCVNpUyA5MDAgdXNlcyB0aGUgbW9zdCBzaWdpZmljYW50IDcgYml0cyB0byBpbmRleCBhIDEyOCBiaXRzIG11bHRpY2FzdAorICoJaGFzaCB0YWJsZSwgd2hpY2ggbWFrZXMgdGhpcyBmdW5jdGlvbiBhIGxpdHRsZSBiaXQgZGlmZmVyZW50IGZyb20gb3RoZXIgZHJpdmVycworICoJU2lTIDkwMCBCMCAmIDYzNSBNL0IgdXNlcyB0aGUgbW9zdCBzaWduaWZpY2F0IDggYml0cyB0byBpbmRleCAyNTYgYml0cworICogICAJbXVsdGljYXN0IGhhc2ggdGFibGUuIAorICovCisKK3N0YXRpYyBpbmxpbmUgdTE2IHNpczkwMF9tY2FzdF9iaXRucih1OCAqYWRkciwgdTggcmV2aXNpb24pCit7CisKKwl1MzIgY3JjID0gZXRoZXJfY3JjKDYsIGFkZHIpOworCisJLyogbGVhdmUgOCBvciA3IG1vc3Qgc2lnaW5pZmFudCBiaXRzICovCisJaWYgKChyZXZpc2lvbiA+PSBTSVM2MzVBXzkwMF9SRVYpIHx8IChyZXZpc2lvbiA9PSBTSVM5MDBCXzkwMF9SRVYpKQorCQlyZXR1cm4gKChpbnQpKGNyYyA+PiAyNCkpOworCWVsc2UKKwkJcmV0dXJuICgoaW50KShjcmMgPj4gMjUpKTsKK30KKworLyoqCisgKglzZXRfcnhfbW9kZSAtIFNldCBTaVM5MDAgcmVjZWl2ZSBtb2RlIAorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGJlIHNldAorICoKKyAqCVNldCBTaVM5MDAgcmVjZWl2ZSBtb2RlIGZvciBwcm9taXNjdW91cywgbXVsdGljYXN0LCBvciBicm9hZGNhc3QgbW9kZS4KKyAqCUFuZCBzZXQgdGhlIGFwcHJvcHJpYXRlIG11bHRpY2FzdCBmaWx0ZXIuCisgKglNdWx0aWNhc3QgaGFzaCB0YWJsZSBjaGFuZ2VzIGZyb20gMTI4IHRvIDI1NiBiaXRzIGZvciA2MzVNL0IgJiA5MDBCMC4KKyAqLworCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKiBzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJdTE2IG1jX2ZpbHRlclsxNl0gPSB7MH07CS8qIDI1Ni8xMjggYml0cyBtdWx0aWNhc3QgaGFzaCB0YWJsZSAqLworCWludCBpLCB0YWJsZV9lbnRyaWVzOworCXUzMiByeF9tb2RlOworCisJLyogNjM1IEhhc2ggVGFibGUgZW50aXJlcyA9IDI1NigyXjE2KSAqLworCWlmKChzaXNfcHJpdi0+Y2hpcHNldF9yZXYgPj0gU0lTNjM1QV85MDBfUkVWKSB8fAorCQkJKHNpc19wcml2LT5jaGlwc2V0X3JldiA9PSBTSVM5MDBCXzkwMF9SRVYpKQorCQl0YWJsZV9lbnRyaWVzID0gMTY7CisJZWxzZQorCQl0YWJsZV9lbnRyaWVzID0gODsKKworCWlmIChuZXRfZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIEFjY2VwdCBhbnkga2luZHMgb2YgcGFja2V0cyAqLworCQlyeF9tb2RlID0gUkZQcm9taXNjdW91czsKKwkJZm9yIChpID0gMDsgaSA8IHRhYmxlX2VudHJpZXM7IGkrKykKKwkJCW1jX2ZpbHRlcltpXSA9IDB4ZmZmZjsKKwl9IGVsc2UgaWYgKChuZXRfZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpIHx8CisJCSAgIChuZXRfZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJLyogdG9vIG1hbnkgbXVsdGljYXN0IGFkZHJlc3NlcyBvciBhY2NlcHQgYWxsIG11bHRpY2FzdCBwYWNrZXQgKi8KKwkJcnhfbW9kZSA9IFJGQUFCIHwgUkZBQU07CisJCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9lbnRyaWVzOyBpKyspCisJCQltY19maWx0ZXJbaV0gPSAweGZmZmY7CisJfSBlbHNlIHsKKwkJLyogQWNjZXB0IEJyb2FkY2FzdCBwYWNrZXQsIGRlc3RpbmF0aW9uIGFkZHJlc3MgbWF0Y2hzIG91cgorCQkgKiBNQUMgYWRkcmVzcywgdXNlIFJlY2VpdmUgRmlsdGVyIHRvIHJlamVjdCB1bndhbnRlZCBNQ0FTVAorCQkgKiBwYWNrZXRzICovCisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQlyeF9tb2RlID0gUkZBQUI7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IG5ldF9kZXYtPm1jX2xpc3Q7CisJCQltY2xpc3QgJiYgaSA8IG5ldF9kZXYtPm1jX2NvdW50OworCQkJaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCXVuc2lnbmVkIGludCBiaXRfbnIgPQorCQkJCXNpczkwMF9tY2FzdF9iaXRucihtY2xpc3QtPmRtaV9hZGRyLCBzaXNfcHJpdi0+Y2hpcHNldF9yZXYpOworCQkJbWNfZmlsdGVyW2JpdF9uciA+PiA0XSB8PSAoMSA8PCAoYml0X25yICYgMHhmKSk7CisJCX0KKwl9CisKKwkvKiB1cGRhdGUgTXVsdGljYXN0IEhhc2ggVGFibGUgaW4gUmVjZWl2ZSBGaWx0ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdGFibGVfZW50cmllczsgaSsrKSB7CisgICAgICAgICAgICAgICAgLyogd2h5IHBsdXMgMHgwNCA/PywgVGhhdCBtYWtlcyB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgaGFzaCB0YWJsZS4gKi8KKwkJb3V0bCgodTMyKSgweDAwMDAwMDA0K2kpIDw8IFJGQUREUl9zaGlmdCwgaW9hZGRyICsgcmZjcik7CisJCW91dGwobWNfZmlsdGVyW2ldLCBpb2FkZHIgKyByZmRyKTsKKwl9CisKKwlvdXRsKFJGRU4gfCByeF9tb2RlLCBpb2FkZHIgKyByZmNyKTsKKworCS8qIHNpczkwMCBpcyBjYXBhYmxlIG9mIGxvb3BpbmcgYmFjayBwYWNrZXRzIGF0IE1BQyBsZXZlbCBmb3IKKwkgKiBkZWJ1Z2dpbmcgcHVycG9zZSAqLworCWlmIChuZXRfZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgeworCQl1MzIgY3Jfc2F2ZWQ7CisJCS8qIFdlIG11c3QgZGlzYWJsZSBUeC9SeCBiZWZvcmUgc2V0dGluZyBsb29wYmFjayBtb2RlICovCisJCWNyX3NhdmVkID0gaW5sKGlvYWRkciArIGNyKTsKKwkJb3V0bChjcl9zYXZlZCB8IFR4RElTIHwgUnhESVMsIGlvYWRkciArIGNyKTsKKwkJLyogZW5hYmxlIGxvb3BiYWNrICovCisJCW91dGwoaW5sKGlvYWRkciArIHR4Y2ZnKSB8IFR4TUxCLCBpb2FkZHIgKyB0eGNmZyk7CisJCW91dGwoaW5sKGlvYWRkciArIHJ4Y2ZnKSB8IFJ4QVRYLCBpb2FkZHIgKyByeGNmZyk7CisJCS8qIHJlc3RvcmUgY3IgKi8KKwkJb3V0bChjcl9zYXZlZCwgaW9hZGRyICsgY3IpOworCX0KKworCXJldHVybjsKK30KKworLyoqCisgKglzaXM5MDBfcmVzZXQgLSBSZXNldCBzaXM5MDAgTUFDIAorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHJlc2V0CisgKgorICoJcmVzZXQgc2lzOTAwIE1BQyBhbmQgd2FpdCB1bnRpbCBmaW5pc2hlZAorICoJcmVzZXQgdGhyb3VnaCBjb21tYW5kIHJlZ2lzdGVyCisgKgljaGFuZ2UgYmFja29mZiBhbGdvcml0aG0gZm9yIDkwMEIwICYgNjM1IE0vQgorICovCisKK3N0YXRpYyB2b2lkIHNpczkwMF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKiBzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJbG9uZyBpb2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHI7CisJaW50IGkgPSAwOworCXUzMiBzdGF0dXMgPSBUeFJDTVAgfCBSeFJDTVA7CisKKwlvdXRsKDAsIGlvYWRkciArIGllcik7CisJb3V0bCgwLCBpb2FkZHIgKyBpbXIpOworCW91dGwoMCwgaW9hZGRyICsgcmZjcik7CisKKwlvdXRsKFJ4UkVTRVQgfCBUeFJFU0VUIHwgUkVTRVQgfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7CisJCisJLyogQ2hlY2sgdGhhdCB0aGUgY2hpcCBoYXMgZmluaXNoZWQgdGhlIHJlc2V0LiAqLworCXdoaWxlIChzdGF0dXMgJiYgKGkrKyA8IDEwMDApKSB7CisJCXN0YXR1cyBePSAoaW5sKGlzciArIGlvYWRkcikgJiBzdGF0dXMpOworCX0KKworCWlmKCAoc2lzX3ByaXYtPmNoaXBzZXRfcmV2ID49IFNJUzYzNUFfOTAwX1JFVikgfHwKKwkJCShzaXNfcHJpdi0+Y2hpcHNldF9yZXYgPT0gU0lTOTAwQl85MDBfUkVWKSApCisJCW91dGwoUEVTRUwgfCBSTkRfQ05ULCBpb2FkZHIgKyBjZmcpOworCWVsc2UKKwkJb3V0bChQRVNFTCwgaW9hZGRyICsgY2ZnKTsKK30KKworLyoqCisgKglzaXM5MDBfcmVtb3ZlIC0gUmVtb3ZlIHNpczkwMCBkZXZpY2UgCisgKglAcGNpX2RldjogdGhlIHBjaSBkZXZpY2UgdG8gYmUgcmVtb3ZlZAorICoKKyAqCXJlbW92ZSBhbmQgcmVsZWFzZSBTaVM5MDAgbmV0IGRldmljZQorICovCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzaXM5MDBfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqIHNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgbWlpX3BoeSAqcGh5ID0gTlVMTDsKKworCXdoaWxlIChzaXNfcHJpdi0+Zmlyc3RfbWlpKSB7CisJCXBoeSA9IHNpc19wcml2LT5maXJzdF9taWk7CisJCXNpc19wcml2LT5maXJzdF9taWkgPSBwaHktPm5leHQ7CisJCWtmcmVlKHBoeSk7CisJfQorCisJcGNpX2ZyZWVfY29uc2lzdGVudChwY2lfZGV2LCBSWF9UT1RBTF9TSVpFLCBzaXNfcHJpdi0+cnhfcmluZywKKwkJc2lzX3ByaXYtPnJ4X3JpbmdfZG1hKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaV9kZXYsIFRYX1RPVEFMX1NJWkUsIHNpc19wcml2LT50eF9yaW5nLAorCQlzaXNfcHJpdi0+dHhfcmluZ19kbWEpOworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOworCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpX2Rldik7CisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIE5VTEwpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgc2lzOTAwX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKworCWlmKCFuZXRpZl9ydW5uaW5nKG5ldF9kZXYpKQorCQlyZXR1cm4gMDsKKworCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7CisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRfZGV2KTsKKworCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggU3RhdHVzIE1hY2hpbmUgKi8KKwlvdXRsKFJ4RElTIHwgVHhESVMgfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EM2hvdCk7CisJcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaXM5MDBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCisJaWYoIW5ldGlmX3J1bm5pbmcobmV0X2RldikpCisJCXJldHVybiAwOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKworCXNpczkwMF9pbml0X3J4ZmlsdGVyKG5ldF9kZXYpOworCisJc2lzOTAwX2luaXRfdHhfcmluZyhuZXRfZGV2KTsKKwlzaXM5MDBfaW5pdF9yeF9yaW5nKG5ldF9kZXYpOworCisJc2V0X3J4X21vZGUobmV0X2Rldik7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldF9kZXYpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOworCisJLyogV29ya2Fyb3VuZCBmb3IgRURCICovCisJc2lzOTAwX3NldF9tb2RlKGlvYWRkciwgSFdfU1BFRURfMTBfTUJQUywgRkRYX0NBUEFCTEVfSEFMRl9TRUxFQ1RFRCk7CisKKwkvKiBFbmFibGUgYWxsIGtub3duIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJb3V0bCgoUnhTT1ZSfFJ4T1JOfFJ4RVJSfFJ4T0t8VHhVUk58VHhFUlJ8VHhJRExFKSwgaW9hZGRyICsgaW1yKTsKKwlvdXRsKFJ4RU5BIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOworCW91dGwoSUUsIGlvYWRkciArIGllcik7CisKKwlzaXM5MDBfY2hlY2tfbW9kZShuZXRfZGV2LCBzaXNfcHJpdi0+bWlpKTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2lzOTAwX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gU0lTOTAwX01PRFVMRV9OQU1FLAorCS5pZF90YWJsZQk9IHNpczkwMF9wY2lfdGJsLAorCS5wcm9iZQkJPSBzaXM5MDBfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzaXM5MDBfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHNpczkwMF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc2lzOTAwX3Jlc3VtZSwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNpczkwMF9pbml0X21vZHVsZSh2b2lkKQoreworLyogd2hlbiBhIG1vZHVsZSwgdGhpcyBpcyBwcmludGVkIHdoZXRoZXIgb3Igbm90IGRldmljZXMgYXJlIGZvdW5kIGluIHByb2JlICovCisjaWZkZWYgTU9EVUxFCisJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZzaXM5MDBfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaXM5MDBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNpczkwMF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2lzOTAwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHNpczkwMF9jbGVhbnVwX21vZHVsZSk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NpczkwMC5oIGIvZHJpdmVycy9uZXQvc2lzOTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzYzA2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NpczkwMC5oCkBAIC0wLDAgKzEsMjc5IEBACisvKiBzaXM5MDAuaCBEZWZpbml0aW9ucyBmb3IgU2lTIGV0aGVybmV0IGNvbnRyb2xsZXJzIGluY2x1ZGluZyA3MDE0LzcwMTYgYW5kIDkwMCAKKyAqIENvcHlyaWdodCAxOTk5IFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW0gQ29ycG9yYXRpb24KKyAqIFJlZmVyZW5jZXM6CisgKiAgIFNpUyA3MDE2IEZhc3QgRXRoZXJuZXQgUENJIEJ1cyAxMC8xMDAgTWJwcyBMQU4gQ29udHJvbGxlciB3aXRoIE9uTm93IFN1cHBvcnQsCisgKglwcmVsaW1pbmFyeSBSZXYuIDEuMCBKYW4uIDE0LCAxOTk4CisgKiAgIFNpUyA5MDAgRmFzdCBFdGhlcm5ldCBQQ0kgQnVzIDEwLzEwMCBNYnBzIExBTiBTaW5nbGUgQ2hpcCB3aXRoIE9uTm93IFN1cHBvcnQsCisgKglwcmVsaW1pbmFyeSBSZXYuIDEuMCBOb3YuIDEwLCAxOTk4CisgKiAgIFNpUyA3MDE0IFNpbmdsZSBDaGlwIDEwMEJBU0UtVFgvMTBCQVNFLVQgUGh5c2ljYWwgTGF5ZXIgU29sdXRpb24sCisgKglwcmVsaW1pbmFyeSBSZXYuIDEuMCBKYW4uIDE4LCAxOTk4CisgKiAgIGh0dHA6Ly93d3cuc2lzLmNvbS50dy9zdXBwb3J0L2RhdGFib29rLmh0bQorICovCisKKy8qCisgKiBTaVMgNzAxNiBhbmQgU2lTIDkwMCBldGhlcm5ldCBjb250cm9sbGVyIHJlZ2lzdGVycworICovCisKKy8qIFRoZSBJL08gZXh0ZW50LCBTaVMgOTAwIG5lZWRzIDI1NiBieXRlcyBvZiBpbyBhZGRyZXNzICovCisjZGVmaW5lIFNJUzkwMF9UT1RBTF9TSVpFIDB4MTAwCisKKy8qIFN5bWJvbGljIG9mZnNldHMgdG8gcmVnaXN0ZXJzLiAqLworZW51bSBzaXM5MDBfcmVnaXN0ZXJzIHsKKwljcj0weDAsICAgICAgICAgICAgICAgICAvL0NvbW1hbmQgUmVnaXN0ZXIKKwljZmc9MHg0LCAgICAgICAgICAgICAgICAvL0NvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKwltZWFyPTB4OCwgICAgICAgICAgICAgICAvL0VFUFJPTSBBY2Nlc3MgUmVnaXN0ZXIKKwlwdHNjcj0weGMsICAgICAgICAgICAgICAvL1BDSSBUZXN0IENvbnRyb2wgUmVnaXN0ZXIKKwlpc3I9MHgxMCwgICAgICAgICAgICAgICAvL0ludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIKKwlpbXI9MHgxNCwgICAgICAgICAgICAgICAvL0ludGVycnVwdCBNYXNrIFJlZ2lzdGVyCisJaWVyPTB4MTgsICAgICAgICAgICAgICAgLy9JbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyCisJZXBhcj0weDE4LCAgICAgICAgICAgICAgLy9FbmhhbmNlZCBQSFkgQWNjZXNzIFJlZ2lzdGVyCisJdHhkcD0weDIwLCAgICAgICAgICAgICAgLy9UcmFuc21pdCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIKKyAgICAgICAgdHhjZmc9MHgyNCwgICAgICAgICAgICAgLy9UcmFuc21pdCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgICAgICAgIHJ4ZHA9MHgzMCwgICAgICAgICAgICAgIC8vUmVjZWl2ZSBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIKKyAgICAgICAgcnhjZmc9MHgzNCwgICAgICAgICAgICAgLy9SZWNlaXZlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAgICAgICAgZmxjdHJsPTB4MzgsICAgICAgICAgICAgLy9GbG93IENvbnRyb2wgUmVnaXN0ZXIKKyAgICAgICAgcnhsZW49MHgzYywgICAgICAgICAgICAgLy9SZWNlaXZlIFBhY2tldCBMZW5ndGggUmVnaXN0ZXIKKyAgICAgICAgcmZjcj0weDQ4LCAgICAgICAgICAgICAgLy9SZWNlaXZlIEZpbHRlciBDb250cm9sIFJlZ2lzdGVyCisgICAgICAgIHJmZHI9MHg0QywgICAgICAgICAgICAgIC8vUmVjZWl2ZSBGaWx0ZXIgRGF0YSBSZWdpc3RlcgorICAgICAgICBwbWN0cmw9MHhCMCwgICAgICAgICAgICAvL1Bvd2VyIE1hbmFnZW1lbnQgQ29udHJvbCBSZWdpc3RlcgorICAgICAgICBwbWVyPTB4QjQgICAgICAgICAgICAgICAvL1Bvd2VyIE1hbmFnZW1lbnQgV2FrZS11cCBFdmVudCBSZWdpc3RlcgorfTsKKworLyogU3ltYm9saWMgbmFtZXMgZm9yIGJpdHMgaW4gdmFyaW91cyByZWdpc3RlcnMgKi8KK2VudW0gc2lzOTAwX2NvbW1hbmRfcmVnaXN0ZXJfYml0cyB7CisJUkVMT0FEICA9IDB4MDAwMDA0MDAsIEFDQ0VTU01PREUgPSAweDAwMDAwMjAwLC8qIEVUICovCisJUkVTRVQgICA9IDB4MDAwMDAxMDAsIFNXSSA9IDB4MDAwMDAwODAsIFJ4UkVTRVQgPSAweDAwMDAwMDIwLAorCVR4UkVTRVQgPSAweDAwMDAwMDEwLCBSeERJUyA9IDB4MDAwMDAwMDgsIFJ4RU5BID0gMHgwMDAwMDAwNCwKKwlUeERJUyAgID0gMHgwMDAwMDAwMiwgVHhFTkEgPSAweDAwMDAwMDAxCit9OworCitlbnVtIHNpczkwMF9jb25maWd1cmF0aW9uX3JlZ2lzdGVyX2JpdHMgeworCURFU0NSRk1UID0gMHgwMDAwMDEwMCAvKiA3MDE2IHNwZWNpZmljICovLCBSRVFBTEcgPSAweDAwMDAwMDgwLAorCVNCICAgID0gMHgwMDAwMDA0MCwgUE9XID0gMHgwMDAwMDAyMCwgRVhEID0gMHgwMDAwMDAxMCwgCisJUEVTRUwgPSAweDAwMDAwMDA4LCBMUE0gPSAweDAwMDAwMDA0LCBCRU0gPSAweDAwMDAwMDAxLAorCS8qIDYzNSAmIDkwMEIgU3BlY2lmaWMgKi8KKwlSTkRfQ05UID0gMHgwMDAwMDQwMCwgRkFJUl9CQUNLT0ZGID0gMHgwMDAwMDIwMCwKKwlFREJfTUFTVEVSX0VOID0gMHgwMDAwMjAwMAorfTsKKworZW51bSBzaXM5MDBfZWVwcm9tX2FjY2Vzc19yZWlnc3Rlcl9iaXRzIHsKKwlNREMgID0gMHgwMDAwMDA0MCwgTURESVIgPSAweDAwMDAwMDIwLCBNRElPID0gMHgwMDAwMDAxMCwgLyogNzAxNiBzcGVjaWZpYyAqLyAKKwlFRUNTID0gMHgwMDAwMDAwOCwgRUVDTEsgPSAweDAwMDAwMDA0LCBFRURPID0gMHgwMDAwMDAwMiwKKwlFRURJID0gMHgwMDAwMDAwMQorfTsKKworZW51bSBzaXM5MDBfaW50ZXJydXB0X3JlZ2lzdGVyX2JpdHMgeworCVdLRVZUICA9IDB4MTAwMDAwMDAsIFR4UEFVU0VFTkQgPSAweDA4MDAwMDAwLCBUeFBBVVNFID0gMHgwNDAwMDAwMCwKKwlUeFJDTVAgPSAweDAyMDAwMDAwLCBSeFJDTVAgPSAweDAxMDAwMDAwLCBEUEVSUiA9IDB4MDA4MDAwMDAsCisJU1NFUlIgID0gMHgwMDQwMDAwMCwgUk1BQlQgID0gMHgwMDIwMDAwMCwgUlRBQlQgPSAweDAwMTAwMDAwLAorCVJ4U09WUiA9IDB4MDAwMTAwMDAsIEhJQkVSUiA9IDB4MDAwMDgwMDAsIFNXSU5UID0gMHgwMDAwMTAwMCwKKwlNSUJJTlQgPSAweDAwMDAwODAwLCBUeFVSTiAgPSAweDAwMDAwNDAwLCBUeElETEUgID0gMHgwMDAwMDIwMCwKKwlUeEVSUiAgPSAweDAwMDAwMTAwLCBUeERFU0MgPSAweDAwMDAwMDgwLCBUeE9LICA9IDB4MDAwMDAwNDAsCisJUnhPUk4gID0gMHgwMDAwMDAyMCwgUnhJRExFID0gMHgwMDAwMDAxMCwgUnhFQVJMWSA9IDB4MDAwMDAwMDgsCisJUnhFUlIgID0gMHgwMDAwMDAwNCwgUnhERVNDID0gMHgwMDAwMDAwMiwgUnhPSyAgPSAweDAwMDAwMDAxCit9OworCitlbnVtIHNpczkwMF9pbnRlcnJ1cHRfZW5hYmxlX3JlaWdzdGVyX2JpdHMgeworCUlFID0gMHgwMDAwMDAwMQorfTsKKworLyogbWF4aW11bSBkbWEgYnVyc3QgZm9yIHRyYW5zbWlzc2lvbiBhbmQgcmVjZWl2ZSAqLworI2RlZmluZSBNQVhfRE1BX1JBTkdFCTcJLyogYWN0dWFsbHkgMCBtZWFucyBNQVhJTVVNICEhICovCisjZGVmaW5lIFR4TVhETUFfc2hpZnQgICAJMjAKKyNkZWZpbmUgUnhNWERNQV9zaGlmdCAgICAyMAorCitlbnVtIHNpczkwMF90eF9yeF9kbWF7CisJRE1BX0JVUlNUXzUxMiA9IDAsCURNQV9CVVJTVF82NCA9IDUKK307CisKKy8qIHRyYW5zbWl0IEZJRk8gdGhyZXNob2xkcyAqLworI2RlZmluZSBUWF9GSUxMX1RIUkVTSCAgIDE2CS8qIDEvNCBGSUZPIHNpemUgKi8KKyNkZWZpbmUgVHhGSUxMVF9zaGlmdCAgIAk4CisjZGVmaW5lIFR4RFJOVF9zaGlmdCAgICAJMAorI2RlZmluZSBUeERSTlRfMTAwICAgICAgCTQ4CS8qIDMvNCBGSUZPIHNpemUgKi8KKyNkZWZpbmUgVHhEUk5UXzEwCQkxNiAJLyogMS8yIEZJRk8gc2l6ZSAqLworCitlbnVtIHNpczkwMF90cmFuc21pdF9jb25maWdfcmVnaXN0ZXJfYml0cyB7CisJVHhDU0kgPSAweDgwMDAwMDAwLCBUeEhCSSA9IDB4NDAwMDAwMDAsIFR4TUxCID0gMHgyMDAwMDAwMCwKKwlUeEFUUCA9IDB4MTAwMDAwMDAsIFR4SUZHID0gMHgwQzAwMDAwMCwgVHhGSUxMVCA9IDB4MDAwMDNGMDAsCisJVHhEUk5UID0gMHgwMDAwMDAzRgorfTsKKworLyogcmVjZXZpZSBGSUZPIHRocmVzaG9sZHMgKi8KKyNkZWZpbmUgUnhEUk5UX3NoaWZ0ICAgICAxCisjZGVmaW5lIFJ4RFJOVF8xMDAJMTYJLyogMS8yIEZJRk8gc2l6ZSAqLworI2RlZmluZSBSeERSTlRfMTAJCTI0IAkvKiAzLzQgRklGTyBzaXplICovCisKK2VudW0gc2lzOTAwX3JldmVpdmVfY29uZmlnX3JlZ2lzdGVyX2JpdHMgeworCVJ4QUVQICA9IDB4ODAwMDAwMDAsIFJ4QVJQID0gMHg0MDAwMDAwMCwgUnhBVFggPSAweDEwMDAwMDAwLAorCVJ4QUpBQiA9IDB4MDgwMDAwMDAsIFJ4RFJOVCA9IDB4MDAwMDAwN0YKK307CisKKyNkZWZpbmUgUkZBQV9zaGlmdCAgICAgIDI4CisjZGVmaW5lIFJGQUREUl9zaGlmdCAgICAxNgorCitlbnVtIHNpczkwMF9yZWNlaXZlX2ZpbHRlcl9jb250cm9sX3JlZ2lzdGVyX2JpdHMgeworCVJGRU4gID0gMHg4MDAwMDAwMCwgUkZBQUIgPSAweDQwMDAwMDAwLCBSRkFBTSA9IDB4MjAwMDAwMDAsCisJUkZBQVAgPSAweDEwMDAwMDAwLCBSRlByb21pc2N1b3VzID0gKFJGQUFCfFJGQUFNfFJGQUFQKQorfTsKKworZW51bSBzaXM5MDBfcmV2ZWl2ZV9maWx0ZXJfZGF0YV9tYXNrIHsKKwlSRkRBVCA9ICAweDAwMDBGRkZGCit9OworCisvKiBFRVBST00gQWRkcmVzc2VzICovCitlbnVtIHNpczkwMF9lZXByb21fYWRkcmVzcyB7CisJRUVQUk9NU2lnbmF0dXJlID0gMHgwMCwgRUVQUk9NVmVuZG9ySUQgPSAweDAyLCBFRVBST01EZXZpY2VJRCA9IDB4MDMsCisJRUVQUk9NTUFDQWRkciAgID0gMHgwOCwgRUVQUk9NQ2hlY2tzdW0gPSAweDBiCit9OworCisvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gUmVmZXIgdG8gTk05M0N4eCBkYXRhc2hlZXQgKi8KK2VudW0gc2lzOTAwX2VlcHJvbV9jb21tYW5kIHsKKwlFRXJlYWQgICAgID0gMHgwMTgwLCBFRXdyaXRlICAgID0gMHgwMTQwLCBFRWVyYXNlID0gMHgwMUMwLCAKKwlFRXdyaXRlRW5hYmxlID0gMHgwMTMwLCBFRXdyaXRlRGlzYWJsZSA9IDB4MDEwMCwKKwlFRWVyYXNlQWxsID0gMHgwMTIwLCBFRXdyaXRlQWxsID0gMHgwMTEwLCAKKwlFRWFkZHJNYXNrID0gMHgwMTNGLCBFRWNtZFNoaWZ0ID0gMTYKK307CisKKy8qIEZvciBTaVM5NjIgb3IgU2lTOTYzLCByZXF1ZXN0IHRoZSBlZXByb20gc29mdHdhcmUgYWNjZXNzICovCitlbnVtIHNpczk2eF9lZXByb21fY29tbWFuZCB7CisJRUVSRVEgPSAweDAwMDAwNDAwLCBFRURPTkUgPSAweDAwMDAwMjAwLCBFRUdOVCA9IDB4MDAwMDAxMDAKK307CisKKy8qIE1hbmFnZW1lbnQgRGF0YSBJL08gKG1kaW8pIGZyYW1lICovCisjZGVmaW5lIE1JSXJlYWQgICAgICAgICAweDYwMDAKKyNkZWZpbmUgTUlJd3JpdGUgICAgICAgIDB4NTAwMgorI2RlZmluZSBNSUlwbWRTaGlmdCAgICAgNworI2RlZmluZSBNSUlyZWdTaGlmdCAgICAgMgorI2RlZmluZSBNSUljbWRMZW4gICAgICAgMTYKKyNkZWZpbmUgTUlJY21kU2hpZnQgICAgIDE2CisKKy8qIEJ1ZmZlciBEZXNjcmlwdG9yIFN0YXR1cyovCitlbnVtIHNpczkwMF9idWZmZXJfc3RhdHVzIHsKKwlPV04gICAgPSAweDgwMDAwMDAwLCBNT1JFICAgPSAweDQwMDAwMDAwLCBJTlRSID0gMHgyMDAwMDAwMCwKKwlTVVBDUkMgPSAweDEwMDAwMDAwLCBJTkNDUkMgPSAweDEwMDAwMDAwLAorCU9LICAgICA9IDB4MDgwMDAwMDAsIERTSVpFICA9IDB4MDAwMDBGRkYKK307CisvKiBTdGF0dXMgZm9yIFRYIEJ1ZmZlcnMgKi8KK2VudW0gc2lzOTAwX3R4X2J1ZmZlcl9zdGF0dXMgeworCUFCT1JUICAgPSAweDA0MDAwMDAwLCBVTkRFUlJVTiA9IDB4MDIwMDAwMDAsIE5PQ0FSUklFUiA9IDB4MDEwMDAwMDAsCisJREVGRVJEICA9IDB4MDA4MDAwMDAsIEVYQ0RFRkVSID0gMHgwMDQwMDAwMCwgT1dDT0xMICAgID0gMHgwMDIwMDAwMCwKKwlFWENDT0xMID0gMHgwMDEwMDAwMCwgQ09MQ05UICAgPSAweDAwMEYwMDAwCit9OworCitlbnVtIHNpczkwMF9yeF9idWZlcl9zdGF0dXMgeworCU9WRVJSVU4gPSAweDAyMDAwMDAwLCBERVNUID0gMHgwMDgwMDAwMCwgICAgIEJDQVNUID0gMHgwMTgwMDAwMCwKKwlNQ0FTVCAgID0gMHgwMTAwMDAwMCwgVU5JTUFUQ0ggPSAweDAwODAwMDAwLCBUT09MT05HID0gMHgwMDQwMDAwMCwKKwlSVU5UICAgID0gMHgwMDIwMDAwMCwgUlhJU0VSUiAgPSAweDAwMTAwMDAwLCBDUkNFUlIgID0gMHgwMDA4MDAwMCwKKwlGQUVSUiAgID0gMHgwMDA0MDAwMCwgTE9PUEJLICAgPSAweDAwMDIwMDAwLCBSWENPTCAgID0gMHgwMDAxMDAwMAorfTsKKworLyogTUlJIHJlZ2lzdGVyIG9mZnNldHMgKi8KK2VudW0gbWlpX3JlZ2lzdGVycyB7CisJTUlJX0NPTlRST0wgPSAweDAwMDAsIE1JSV9TVEFUVVMgPSAweDAwMDEsIE1JSV9QSFlfSUQwID0gMHgwMDAyLAorCU1JSV9QSFlfSUQxID0gMHgwMDAzLCBNSUlfQU5BRFYgID0gMHgwMDA0LCBNSUlfQU5MUEFSICA9IDB4MDAwNSwKKwlNSUlfQU5FWFQgICA9IDB4MDAwNgorfTsKKworLyogbWlpIHJlZ2lzdGVycyBzcGVjaWZpYyB0byBTaVMgOTAwICovCitlbnVtIHNpc19taWlfcmVnaXN0ZXJzIHsKKwlNSUlfQ09ORklHMSA9IDB4MDAxMCwgTUlJX0NPTkZJRzIgPSAweDAwMTEsIE1JSV9TVFNPVVQgPSAweDAwMTIsCisJTUlJX01BU0sgICAgPSAweDAwMTMsIE1JSV9SRVNWICAgID0gMHgwMDE0Cit9OworCisvKiBtaWkgcmVnaXN0ZXJzIHNwZWNpZmljIHRvIElDUyAxODkzICovCitlbnVtIGljc19taWlfcmVnaXN0ZXJzIHsKKwlNSUlfRVhUQ1RSTCAgPSAweDAwMTAsIE1JSV9RUERTVFMgPSAweDAwMTEsIE1JSV8xMEJUT1AgPSAweDAwMTIsCisJTUlJX0VYVENUUkwyID0gMHgwMDEzCit9OworCisvKiBtaWkgcmVnaXN0ZXJzIHNwZWNpZmljIHRvIEFNRCA3OUM5MDEgKi8KK2VudW0gYW1kX21paV9yZWdpc3RlcnMgeworCU1JSV9TVEFUVVNfU1VNTUFSWSA9IDB4MDAxOAorfTsKKworLyogTUlJIENvbnRyb2wgcmVnaXN0ZXIgYml0IGRlZmluaXRpb25zLiAqLworZW51bSBtaWlfY29udHJvbF9yZWdpc3Rlcl9iaXRzIHsKKwlNSUlfQ05UTF9GRFggICAgID0gMHgwMTAwLCBNSUlfQ05UTF9SU1RfQVVUTyA9IDB4MDIwMCwgCisJTUlJX0NOVExfSVNPTEFURSA9IDB4MDQwMCwgTUlJX0NOVExfUFdSRFdOICAgPSAweDA4MDAsCisJTUlJX0NOVExfQVVUTyAgICA9IDB4MTAwMCwgTUlJX0NOVExfU1BFRUQgICAgPSAweDIwMDAsCisJTUlJX0NOVExfTFBCSyAgICA9IDB4NDAwMCwgTUlJX0NOVExfUkVTRVQgICAgPSAweDgwMDAKK307CisKKy8qIE1JSSBTdGF0dXMgcmVnaXN0ZXIgYml0ICAqLworZW51bSBtaWlfc3RhdHVzX3JlZ2lzdGVyX2JpdHMgeworCU1JSV9TVEFUX0VYVCAgICA9IDB4MDAwMSwgTUlJX1NUQVRfSkFCICAgICAgICA9IDB4MDAwMiwgCisJTUlJX1NUQVRfTElOSyAgID0gMHgwMDA0LCBNSUlfU1RBVF9DQU5fQVVUTyAgID0gMHgwMDA4LCAKKwlNSUlfU1RBVF9GQVVMVCAgPSAweDAwMTAsIE1JSV9TVEFUX0FVVE9fRE9ORSAgPSAweDAwMjAsCisJTUlJX1NUQVRfQ0FOX1QgID0gMHgwODAwLCBNSUlfU1RBVF9DQU5fVF9GRFggID0gMHgxMDAwLAorCU1JSV9TVEFUX0NBTl9UWCA9IDB4MjAwMCwgTUlJX1NUQVRfQ0FOX1RYX0ZEWCA9IDB4NDAwMCwKKwlNSUlfU1RBVF9DQU5fVDQgPSAweDgwMDAKK307CisKKyNkZWZpbmUJCU1JSV9JRDFfT1VJX0xPCQkweEZDMDAJLyogbG93IGJpdHMgb2YgT1VJIG1hc2sgKi8KKyNkZWZpbmUJCU1JSV9JRDFfTU9ERUwJCTB4MDNGMAkvKiBtb2RlbCBudW1iZXIgKi8KKyNkZWZpbmUJCU1JSV9JRDFfUkVWCQkweDAwMEYJLyogbW9kZWwgbnVtYmVyICovCisKKy8qIE1JSSBOV0FZIFJlZ2lzdGVyIEJpdHMgLi4uCisgICB2YWxpZCBmb3IgdGhlIEFOQVIgKEF1dG8tTmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCkgYW5kCisgICBBTkxQQVIgKEF1dG8tTmVnb3RpYXRpb24gTGluayBQYXJ0bmVyKSByZWdpc3RlcnMgKi8KK2VudW0gbWlpX253YXlfcmVnaXN0ZXJfYml0cyB7CisJTUlJX05XQVlfTk9ERV9TRUwgPSAweDAwMWYsIE1JSV9OV0FZX0NTTUFfQ0QgPSAweDAwMDEsCisJTUlJX05XQVlfVAkgID0gMHgwMDIwLCBNSUlfTldBWV9UX0ZEWCAgID0gMHgwMDQwLAorCU1JSV9OV0FZX1RYICAgICAgID0gMHgwMDgwLCBNSUlfTldBWV9UWF9GRFggID0gMHgwMTAwLAorCU1JSV9OV0FZX1Q0ICAgICAgID0gMHgwMjAwLCBNSUlfTldBWV9QQVVTRSAgID0gMHgwNDAwLAorCU1JSV9OV0FZX1JGICAgICAgID0gMHgyMDAwLCBNSUlfTldBWV9BQ0sgICAgID0gMHg0MDAwLAorCU1JSV9OV0FZX05QICAgICAgID0gMHg4MDAwCit9OworCitlbnVtIG1paV9zdHNvdXRfcmVnaXN0ZXJfYml0cyB7CisJTUlJX1NUU09VVF9MSU5LX0ZBSUwgPSAweDQwMDAsCisJTUlJX1NUU09VVF9TUEQgICAgICAgPSAweDAwODAsIE1JSV9TVFNPVVRfRFBMWCA9IDB4MDA0MAorfTsKKworZW51bSBtaWlfc3RzaWNzX3JlZ2lzdGVyX2JpdHMgeworCU1JSV9TVFNJQ1NfU1BEICA9IDB4ODAwMCwgTUlJX1NUU0lDU19EUExYID0gMHg0MDAwLAorCU1JSV9TVFNJQ1NfTElOS1NUUyA9IDB4MDAwMQorfTsKKworZW51bSBtaWlfc3Rzc3VtX3JlZ2lzdGVyX2JpdHMgeworCU1JSV9TVFNTVU1fTElOSyA9IDB4MDAwOCwgTUlJX1NUU1NVTV9EUExYID0gMHgwMDA0LAorCU1JSV9TVFNTVU1fQVVUTyA9IDB4MDAwMiwgTUlJX1NUU1NVTV9TUEQgID0gMHgwMDAxCit9OworCitlbnVtIHNpczkwMF9yZXZpc2lvbl9pZCB7CisJU0lTNjMwQV85MDBfUkVWID0gMHg4MCwJCVNJUzYzMEVfOTAwX1JFViA9IDB4ODEsCisJU0lTNjMwU185MDBfUkVWID0gMHg4MiwJCVNJUzYzMEVBMV85MDBfUkVWID0gMHg4MywKKwlTSVM2MzBFVF85MDBfUkVWID0gMHg4NCwJU0lTNjM1QV85MDBfUkVWID0gMHg5MCwKKwlTSVM5NnhfOTAwX1JFViA9IDBYOTEsCQlTSVM5MDBCXzkwMF9SRVYgPSAweDAzCit9OworCitlbnVtIHNpczYzMF9yZXZpc2lvbl9pZCB7CisJU0lTNjMwQTAgICAgPSAweDAwLCBTSVM2MzBBMSAgICAgID0gMHgwMSwKKwlTSVM2MzBCMCAgICA9IDB4MTAsIFNJUzYzMEIxICAgICAgPSAweDExCit9OworCisjZGVmaW5lIEZEWF9DQVBBQkxFX0RVUExFWF9VTktOT1dOICAgICAgMAorI2RlZmluZSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEICAgICAgIDEKKyNkZWZpbmUgRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRCAgICAgICAyCisKKyNkZWZpbmUgSFdfU1BFRURfVU5DT05GSUcJCTAKKyNkZWZpbmUgSFdfU1BFRURfSE9NRQkJMQorI2RlZmluZSBIV19TUEVFRF8xMF9NQlBTICAgICAgICAJMTAKKyNkZWZpbmUgSFdfU1BFRURfMTAwX01CUFMgICAgICAgCTEwMAorI2RlZmluZSBIV19TUEVFRF9ERUZBVUxUICAgICAgICAJKEhXX1NQRUVEXzEwMF9NQlBTKQorCisjZGVmaW5lIENSQ19TSVpFICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFDX0hFQURFUl9TSVpFICAgICAgICAgMTQKKworI2RlZmluZSBUWF9CVUZfU0laRSAgICAgMTUzNgorI2RlZmluZSBSWF9CVUZfU0laRSAgICAgMTUzNgorCisjZGVmaW5lIE5VTV9UWF9ERVNDICAgICAxNiAgICAgIAkvKiBOdW1iZXIgb2YgVHggZGVzY3JpcHRvciByZWdpc3RlcnMuICovCisjZGVmaW5lIE5VTV9SWF9ERVNDICAgICAxNiAgICAgICAJLyogTnVtYmVyIG9mIFJ4IGRlc2NyaXB0b3IgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBUWF9UT1RBTF9TSVpFCU5VTV9UWF9ERVNDKnNpemVvZihCdWZmZXJEZXNjKQorI2RlZmluZSBSWF9UT1RBTF9TSVpFCU5VTV9SWF9ERVNDKnNpemVvZihCdWZmZXJEZXNjKQorCisvKiBQQ0kgc3R1ZmYsIHNob3VsZCBiZSBtb3ZlIHRvIHBjaS5oICovCisjZGVmaW5lIFNJUzYzMF9WRU5ET1JfSUQgICAgICAgIDB4MTAzOQorI2RlZmluZSBTSVM2MzBfREVWSUNFX0lEICAgICAgICAweDA2MzAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9zazk4bGluL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ODMwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL01ha2VmaWxlCkBAIC0wLDAgKzEsODkgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBTeXNLb25uZWN0IFNLLTk4eHggZGV2aWNlIGRyaXZlci4KKyMKKworCisjCisjIFN0YW5kYWxvbmUgZHJpdmVyIHBhcmFtcworIyBTS1BBUkFNICs9IC1EU0tfS0VSTkVMXzI0CisjIFNLUEFSQU0gKz0gLURTS19LRVJORUxfMjRfMjYKKyMgU0tQQVJBTSArPSAtRFNLX0tFUk5FTF8yNgorIyBTS1BBUkFNICs9IC1EU0tfS0VSTkVMXzIyXzI0CisKK29iai0kKENPTkZJR19TSzk4TElOKSArPSBzazk4bGluLm8KK3NrOThsaW4tb2JqcyAgICA6PQlcCisJCXNrZ2UubwkJXAorCQlza2V0aHRvb2wubwlcCisJCXNrZGltLm8JCVwKKwkJc2thZGRyLm8JXAorCQlza2dlaHd0Lm8JXAorCQlza2dlaW5pdC5vCVwKKwkJc2tnZXBubWkubwlcCisJCXNrZ2VzaXJxLm8JXAorCQlza2kyYy5vCQlcCisJCXNrbG04MC5vCVwKKwkJc2txdWV1ZS5vCVwKKwkJc2tybG10Lm8JXAorCQlza3RpbWVyLm8JXAorCQlza3ZwZC5vCQlcCisJCXNreG1hYzIubwlcCisJCXNrcHJvYy5vCVwKKwkJc2tjc3VtLm8KKworIyBEQkdERUYgPSAgXAorIyAtRERFQlVHCisKK2lmZGVmIERFQlVHCitEQkdERUYgKz0gIFwKKy1EU0tfREVCVUdfQ0hLTU9EPTB4MDAwMDAwMDBMIFwKKy1EU0tfREVCVUdfQ0hLQ0FUPTB4MDAwMDAwMDBMCitlbmRpZgorCisKKyMgKioqKiBwb3NzaWJsZSBkZWJ1ZyBtb2R1bGVzIGZvciBTS19ERUJVR19DSEtNT0QgKioqKioqKioqKioqKioqKioKKyMgU0tfREJHTU9EX01FUlIgICAgICAgIDB4MDAwMDAwMDFMICAgICAvKiBnZW5lcmFsIG1vZHVsZSBlcnJvciBpbmRpY2F0aW9uICovCisjIFNLX0RCR01PRF9IV00gICAgICAgICAweDAwMDAwMDAyTCAgICAgLyogSGFyZHdhcmUgaW5pdCBtb2R1bGUgKi8KKyMgU0tfREJHTU9EX1JMTVQgICAgICAgIDB4MDAwMDAwMDRMICAgICAvKiBSTE1UIG1vZHVsZSAqLworIyBTS19EQkdNT0RfVlBEICAgICAgICAgMHgwMDAwMDAwOEwgICAgIC8qIFZQRCBtb2R1bGUgKi8KKyMgU0tfREJHTU9EX0kyQyAgICAgICAgIDB4MDAwMDAwMTBMICAgICAvKiBJMkMgbW9kdWxlICovCisjIFNLX0RCR01PRF9QTk1JICAgICAgICAweDAwMDAwMDIwTCAgICAgLyogUE5NSSBtb2R1bGUgKi8KKyMgU0tfREJHTU9EX0NTVU0gICAgICAgIDB4MDAwMDAwNDBMICAgICAvKiBDU1VNIG1vZHVsZSAqLworIyBTS19EQkdNT0RfQUREUiAgICAgICAgMHgwMDAwMDA4MEwgICAgIC8qIEFERFIgbW9kdWxlICovCisjIFNLX0RCR01PRF9EUlYgICAgICAgICAweDAwMDEwMDAwTCAgICAgLyogRFJWIG1vZHVsZSAqLworCisjICoqKiogcG9zc2libGUgZGVidWcgY2F0ZWdvcmllcyBmb3IgU0tfREVCVUdfQ0hLQ0FUICoqKioqKioqKioqKioqCisjICoqKiBjb21tb24gbW9kdWxlcyAqKioKKyMgU0tfREJHQ0FUX0lOSVQgICAgICAgIDB4MDAwMDAwMDFMICAgICBtb2R1bGUvZHJpdmVyIGluaXRpYWxpemF0aW9uCisjIFNLX0RCR0NBVF9DVFJMICAgICAgICAweDAwMDAwMDAyTCAgICAgY29udHJvbGxpbmc6IGFkZC9ybXYgTUNBL01BQyBhbmQgb3RoZXIgY29udHJvbHMgKElPQ1RMKQorIyBTS19EQkdDQVRfRVJSICAgICAgICAgMHgwMDAwMDAwNEwgICAgIGVycm9yIGhhbmRsaW5nIHBhdGhzCisjIFNLX0RCR0NBVF9UWCAgICAgICAgICAweDAwMDAwMDA4TCAgICAgdHJhbnNtaXQgcGF0aAorIyBTS19EQkdDQVRfUlggICAgICAgICAgMHgwMDAwMDAxMEwgICAgIHJlY2VpdmUgcGF0aAorIyBTS19EQkdDQVRfSVJRICAgICAgICAgMHgwMDAwMDAyMEwgICAgIGdlbmVyYWwgSVJRIGhhbmRsaW5nCisjIFNLX0RCR0NBVF9RVUVVRSAgICAgICAweDAwMDAwMDQwTCAgICAgYW55IHF1ZXVlIG1hbmFnZW1lbnQKKyMgU0tfREJHQ0FUX0RVTVAgICAgICAgIDB4MDAwMDAwODBMICAgICBsYXJnZSBkYXRhIG91dHB1dCBlLmcuIGhleCBkdW1wCisjIFNLX0RCR0NBVF9GQVRBTCAgICAgICAweDAwMDAwMTAwTCAgICAgbGFyZ2UgZGF0YSBvdXRwdXQgZS5nLiBoZXggZHVtcAorCisjICoqKiBkcml2ZXIgKGZpbGUgc2tnZS5jKSAqKioKKyMgU0tfREJHQ0FUX0RSVl9FTlRSWSAgICAgICAgICAgMHgwMDAxMDAwMCAgICAgIGVudHJ5IHBvaW50cworIyBTS19EQkdDQVRfRFJWXz8/PyAgICAgICAgICAgICAweDAwMDIwMDAwICAgICAgbm90IHVzZWQKKyMgU0tfREJHQ0FUX0RSVl9NQ0EgICAgICAgICAgICAgMHgwMDA0MDAwMCAgICAgIG11bHRpY2FzdAorIyBTS19EQkdDQVRfRFJWX1RYX1BST0dSRVNTICAgICAweDAwMDgwMDAwICAgICAgdHggcGF0aAorIyBTS19EQkdDQVRfRFJWX1JYX1BST0dSRVNTICAgICAweDAwMTAwMDAwICAgICAgcnggcGF0aAorIyBTS19EQkdDQVRfRFJWX1BST0dSRVNTICAgICAgICAweDAwMjAwMDAwICAgICAgZ2VuZXJhbCBydW50aW1lCisjIFNLX0RCR0NBVF9EUlZfPz8/ICAgICAgICAgICAgIDB4MDA0MDAwMDAgICAgICBub3QgdXNlZAorIyBTS19EQkdDQVRfRFJWX1BST00gICAgICAgICAgICAweDAwODAwMDAwICAgICAgcHJvbWlzY3VvdXMgbW9kZQorIyBTS19EQkdDQVRfRFJWX1RYX0ZSQU1FICAgICAgICAweDAxMDAwMDAwICAgICAgZGlzcGxheSB0eCBmcmFtZXMKKyMgU0tfREJHQ0FUX0RSVl9FUlJPUiAgICAgICAgICAgMHgwMjAwMDAwMCAgICAgIGVycm9yIGNvbmRpdGlvbnMKKyMgU0tfREJHQ0FUX0RSVl9JTlRfU1JDICAgICAgICAgMHgwNDAwMDAwMCAgICAgIGludGVycnVwdHMgc291cmNlcworIyBTS19EQkdDQVRfRFJWX0VWRU5UICAgICAgICAgICAweDA4MDAwMDAwICAgICAgZHJpdmVyIGV2ZW50cworCitFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL25ldC9zazk4bGluIC1EU0tfRElBR19TVVBQT1JUIC1EU0tfVVNFX0NTVU0gLURHRU5FU0lTIC1EWVVLT04gJChEQkdERUYpICQoU0tQQVJBTSkKKworY2xlYW46CisJcm0gLWYgY29yZSAqLm8gKi5hICoucworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL2xtODAuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9sbTgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyZGJiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9sbTgwLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglsbTgwLmgJCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBDb21tb24gTW9kdWxlcworICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjYgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDUvMTMgMTc6MjY6NTIgJAorICogUHVycG9zZToJQ29udGFpbnMgYWxsIGRlZmluZXMgZm9yIHRoZSBMTTgwIENoaXAKKyAqCQkoTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcikuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNfTE04MF9ICisjZGVmaW5lIF9fSU5DX0xNODBfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCS8qIF9fY3BsdXNwbHVzICovCisKKy8qIGRlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBMTTgwIHJlZ2lzdGVyIGRlZmluaXRpb24KKyAqCisgKiBBbGwgcmVnaXN0ZXJzIGFyZSA4IGJpdCB3aWRlCisgKi8KKyNkZWZpbmUgTE04MF9DRkcJCQkweDAwCS8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTE04MF9JU1JDXzEJCQkweDAxCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBMTTgwX0lTUkNfMgkJCTB4MDIJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAyICovCisjZGVmaW5lIExNODBfSU1TS18xCQkJMHgwMwkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAxICovCisjZGVmaW5lIExNODBfSU1TS18yCQkJMHgwNAkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAyICovCisjZGVmaW5lIExNODBfRkFOX0NUUkwJCTB4MDUJLyogRmFuIERldmlzb3IvUlNUIy9PUyMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTE04MF9URU1QX0NUUkwJCTB4MDYJLyogT1MjIENvbmZpZywgVGVtcCBSZXMuIFJlZyAqLworCS8qIDB4MDcgLSAweDFmIHJlc2VydmVkCSovCisJLyogY3VycmVudCB2YWx1ZXMgKi8KKyNkZWZpbmUgTE04MF9WVDBfSU4JCQkweDIwCS8qIGN1cnJlbnQgVm9sdGFnZSAwIHZhbHVlICovCisjZGVmaW5lIExNODBfVlQxX0lOCQkJMHgyMQkvKiBjdXJyZW50IFZvbHRhZ2UgMSB2YWx1ZSAqLworI2RlZmluZSBMTTgwX1ZUMl9JTgkJCTB4MjIJLyogY3VycmVudCBWb2x0YWdlIDIgdmFsdWUgKi8KKyNkZWZpbmUgTE04MF9WVDNfSU4JCQkweDIzCS8qIGN1cnJlbnQgVm9sdGFnZSAzIHZhbHVlICovCisjZGVmaW5lIExNODBfVlQ0X0lOCQkJMHgyNAkvKiBjdXJyZW50IFZvbHRhZ2UgNCB2YWx1ZSAqLworI2RlZmluZSBMTTgwX1ZUNV9JTgkJCTB4MjUJLyogY3VycmVudCBWb2x0YWdlIDUgdmFsdWUgKi8KKyNkZWZpbmUgTE04MF9WVDZfSU4JCQkweDI2CS8qIGN1cnJlbnQgVm9sdGFnZSA2IHZhbHVlICovCisjZGVmaW5lIExNODBfVEVNUF9JTgkJMHgyNwkvKiBjdXJyZW50IFRlbXBlcmF0dXJlIHZhbHVlICovCisjZGVmaW5lIExNODBfRkFOMV9JTgkJMHgyOAkvKiBjdXJyZW50IEZhbiAxIGNvdW50ICovCisjZGVmaW5lIExNODBfRkFOMl9JTgkJMHgyOQkvKiBjdXJyZW50IEZhbiAyIGNvdW50ICovCisJLyogbGltaXQgdmFsdWVzICovCisjZGVmaW5lIExNODBfVlQwX0hJR0hfTElNCTB4MmEJLyogaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMCAqLworI2RlZmluZSBMTTgwX1ZUMF9MT1dfTElNCTB4MmIJLyogbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAwICovCisjZGVmaW5lIExNODBfVlQxX0hJR0hfTElNCTB4MmMJLyogaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMSAqLworI2RlZmluZSBMTTgwX1ZUMV9MT1dfTElNCTB4MmQJLyogbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAxICovCisjZGVmaW5lIExNODBfVlQyX0hJR0hfTElNCTB4MmUJLyogaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMiAqLworI2RlZmluZSBMTTgwX1ZUMl9MT1dfTElNCTB4MmYJLyogbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAyICovCisjZGVmaW5lIExNODBfVlQzX0hJR0hfTElNCTB4MzAJLyogaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMyAqLworI2RlZmluZSBMTTgwX1ZUM19MT1dfTElNCTB4MzEJLyogbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAzICovCisjZGVmaW5lIExNODBfVlQ0X0hJR0hfTElNCTB4MzIJLyogaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNCAqLworI2RlZmluZSBMTTgwX1ZUNF9MT1dfTElNCTB4MzMJLyogbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSA0ICovCisjZGVmaW5lIExNODBfVlQ1X0hJR0hfTElNCTB4MzQJLyogaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNSAqLworI2RlZmluZSBMTTgwX1ZUNV9MT1dfTElNCTB4MzUJLyogbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSA1ICovCisjZGVmaW5lIExNODBfVlQ2X0hJR0hfTElNCTB4MzYJLyogaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNiAqLworI2RlZmluZSBMTTgwX1ZUNl9MT1dfTElNCTB4MzcJLyogbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSA2ICovCisjZGVmaW5lIExNODBfVEhPVF9MSU1fVVAJMHgzOAkvKiBob3QgdGVtcGVyYXR1cmUgbGltaXQgKGhpZ2gpICovCisjZGVmaW5lIExNODBfVEhPVF9MSU1fTE8JMHgzOQkvKiBob3QgdGVtcGVyYXR1cmUgbGltaXQgKGxvdykgKi8KKyNkZWZpbmUgTE04MF9UT1NfTElNX1VQCQkweDNhCS8qIE9TIHRlbXBlcmF0dXJlIGxpbWl0IChoaWdoKSAqLworI2RlZmluZSBMTTgwX1RPU19MSU1fTE8JCTB4M2IJLyogT1MgdGVtcGVyYXR1cmUgbGltaXQgKGxvdykgKi8KKyNkZWZpbmUgTE04MF9GQU4xX0NPVU5UX0xJTQkweDNjCS8qIEZhbiAxIGNvdW50IGxpbWl0IChoaWdoKSAqLworI2RlZmluZSBMTTgwX0ZBTjJfQ09VTlRfTElNCTB4M2QJLyogRmFuIDIgY291bnQgbGltaXQgKGxvdykgKi8KKwkvKiAweDNlIC0gMHgzZiByZXNlcnZlZAkqLworCisvKgorICogTE04MCBiaXQgZGVmaW5pdGlvbnMKKyAqLworCisvKglMTTgwX0NGRwkJQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBMTTgwX0NGR19TVEFSVAkJKDE8PDApCS8qIHN0YXJ0IG1vbml0b3Jpbmcgb3BlcmF0aW9uICovCisjZGVmaW5lIExNODBfQ0ZHX0lOVF9FTkEJKDE8PDEpCS8qIGVuYWJsZXMgdGhlIElOVCMgSW50ZXJydXB0IG91dHB1dCAqLworI2RlZmluZSBMTTgwX0NGR19JTlRfUE9MCSgxPDwyKQkvKiBJTlQjIHBvbDogMCBhY3QgbG93LCAxIGFjdCBoaWdoICovCisjZGVmaW5lIExNODBfQ0ZHX0lOVF9DTFIJKDE8PDMpCS8qIGRpc2FibGVzIElOVCMvUlNUX09VVCMvT1MjIG91dHB1dHMgKi8KKyNkZWZpbmUgTE04MF9DRkdfUkVTRVQJCSgxPDw0KQkvKiBzaWduYWxzIGEgcmVzZXQgKi8KKyNkZWZpbmUgTE04MF9DRkdfQ0hBU1NfQ0xSCSgxPDw1KQkvKiBjbGVhcnMgQ2hhc3NpcyBJbnRydXNpb24gKENJKSBwaW4gKi8KKyNkZWZpbmUgTE04MF9DRkdfR1BPCQkoMTw8NikJLyogZHJpdmVzIHRoZSBHUE8jIHBpbiAqLworI2RlZmluZSBMTTgwX0NGR19JTklUCQkoMTw8NykJLyogcmVzdG9yZSBwb3dlciBvbiBkZWZhdWx0cyAqLworCisvKglMTTgwX0lTUkNfMQkJSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAxICovCisvKglMTTgwX0lNU0tfMQkJSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBMTTgwX0lTX1ZUMAkJCSgxPDwwKQkvKiBsaW1pdCBleGNlZWRlZCBmb3IgVm9sdGFnZSAwICovCisjZGVmaW5lIExNODBfSVNfVlQxCQkJKDE8PDEpCS8qIGxpbWl0IGV4Y2VlZGVkIGZvciBWb2x0YWdlIDEgKi8KKyNkZWZpbmUgTE04MF9JU19WVDIJCQkoMTw8MikJLyogbGltaXQgZXhjZWVkZWQgZm9yIFZvbHRhZ2UgMiAqLworI2RlZmluZSBMTTgwX0lTX1ZUMwkJCSgxPDwzKQkvKiBsaW1pdCBleGNlZWRlZCBmb3IgVm9sdGFnZSAzICovCisjZGVmaW5lIExNODBfSVNfVlQ0CQkJKDE8PDQpCS8qIGxpbWl0IGV4Y2VlZGVkIGZvciBWb2x0YWdlIDQgKi8KKyNkZWZpbmUgTE04MF9JU19WVDUJCQkoMTw8NSkJLyogbGltaXQgZXhjZWVkZWQgZm9yIFZvbHRhZ2UgNSAqLworI2RlZmluZSBMTTgwX0lTX1ZUNgkJCSgxPDw2KQkvKiBsaW1pdCBleGNlZWRlZCBmb3IgVm9sdGFnZSA2ICovCisjZGVmaW5lIExNODBfSVNfSU5UX0lOCQkoMTw8NykJLyogc3RhdGUgb2YgSU5UX0lOIyAqLworCisvKglMTTgwX0lTUkNfMgkJSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAyICovCisvKglMTTgwX0lNU0tfMgkJSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBMTTgwX0lTX1RFTVAJCSgxPDwwKQkvKiBIT1QgdGVtcGVyYXR1cmUgbGltaXQgZXhjZWVkZWQgKi8KKyNkZWZpbmUgTE04MF9JU19CVEkJCQkoMTw8MSkJLyogc3RhdGUgb2YgQlRJIyBwaW4gKi8KKyNkZWZpbmUgTE04MF9JU19GQU4xCQkoMTw8MikJLyogY291bnQgbGltaXQgZXhjZWVkZWQgZm9yIEZhbiAxICovCisjZGVmaW5lIExNODBfSVNfRkFOMgkJKDE8PDMpCS8qIGNvdW50IGxpbWl0IGV4Y2VlZGVkIGZvciBGYW4gMiAqLworI2RlZmluZSBMTTgwX0lTX0NJCQkJKDE8PDQpCS8qIENoYXNzaXMgSW50cnVzaW9uIG9jY3VyZWQgKi8KKyNkZWZpbmUgTE04MF9JU19PUwkJCSgxPDw1KQkvKiBPUyB0ZW1wZXJhdHVyZSBsaW1pdCBleGNlZWRlZCAqLworCS8qIGJpdCA2IGFuZCA3IGFyZSByZXNlcnZlZCBpbiBMTTgwX0lTUkNfMiAqLworI2RlZmluZSBMTTgwX0lTX0hUX0lSUV9NRAkoMTw8NikJLyogSG90IHRlbXBlcmF0dXJlIGludGVycnVwdCBtb2RlICovCisjZGVmaW5lIExNODBfSVNfT1RfSVJRX01ECSgxPDw3KQkvKiBPUyB0ZW1wZXJhdHVyZSBpbnRlcnJ1cHQgbW9kZSAqLworCisvKglMTTgwX0ZBTl9DVFJMCQlGYW4gRGV2aXNvci9SU1QjL09TIyBSZWdpc3RlciAqLworI2RlZmluZSBMTTgwX0ZBTjFfTURfU0VMCSgxPDwwKQkvKiBGYW4gMSBtb2RlIHNlbGVjdCAqLworI2RlZmluZSBMTTgwX0ZBTjJfTURfU0VMCSgxPDwxKQkvKiBGYW4gMiBtb2RlIHNlbGVjdCAqLworI2RlZmluZSBMTTgwX0ZBTjFfUFJNX0NUTAkoMzw8MikJLyogRmFuIDEgc3BlZWQgY29udHJvbCAqLworI2RlZmluZSBMTTgwX0ZBTjJfUFJNX0NUTAkoMzw8NCkJLyogRmFuIDIgc3BlZWQgY29udHJvbCAqLworI2RlZmluZSBMTTgwX0ZBTl9PU19FTkEJCSgxPDw2KQkvKiBlbmFibGUgT1MgbW9kZSBvbiBSU1RfT1VUIy9PUyMgcGlucyovCisjZGVmaW5lIExNODBfRkFOX1JTVF9FTkEJKDE8PDcpCS8qIHNldHMgUlNUX09VVCMvT1MjIHBpbnMgaW4gUlNUIG1vZGUgKi8KKworLyoJTE04MF9URU1QX0NUUkwJCU9TIyBDb25maWcsIFRlbXAgUmVzLiBSZWcgKi8KKyNkZWZpbmUgTE04MF9URU1QX09TX1NUQVQJKDE8PDApCS8qIG1pcnJvcnMgdGhlIHN0YXRlIG9mIFJTVF9PVVQjL09TIyAqLworI2RlZmluZSBMTTgwX1RFTVBfT1NfUE9MCSgxPDwxKQkvKiBzZWxlY3QgT1MjIHBvbGFyaXR5ICovCisjZGVmaW5lIExNODBfVEVNUF9PU19NT0RFCSgxPDwyKQkvKiBzZWxlY3RzIEludGVycnVwdCBtb2RlICovCisjZGVmaW5lIExNODBfVEVNUF9SRVMJCSgxPDwzKQkvKiBzZWxlY3RzIDkgb3IgMTEgYml0IHRlbXAgcmVzdWx1dGlvbiovCisjZGVmaW5lIExNODBfVEVNUF9MU0IJCSgweGY8PDQpLyogNCBMU0JzIG9mIDExIGJpdCB0ZW1wIGRhdGEgKi8KKyNkZWZpbmUgTE04MF9URU1QX0xTQl85CQkoMTw8NykJLyogTFNCIG9mIDkgYml0IHRlbXBlcmF0dXJlIGRhdGEgKi8KKworCS8qIDB4MDcgLSAweDFmIHJlc2VydmVkCSovCisvKglMTTgwX1ZUMF9JTgkJY3VycmVudCBWb2x0YWdlIDAgdmFsdWUgKi8KKy8qCUxNODBfVlQxX0lOCQljdXJyZW50IFZvbHRhZ2UgMSB2YWx1ZSAqLworLyoJTE04MF9WVDJfSU4JCWN1cnJlbnQgVm9sdGFnZSAyIHZhbHVlICovCisvKglMTTgwX1ZUM19JTgkJY3VycmVudCBWb2x0YWdlIDMgdmFsdWUgKi8KKy8qCUxNODBfVlQ0X0lOCQljdXJyZW50IFZvbHRhZ2UgNCB2YWx1ZSAqLworLyoJTE04MF9WVDVfSU4JCWN1cnJlbnQgVm9sdGFnZSA1IHZhbHVlICovCisvKglMTTgwX1ZUNl9JTgkJY3VycmVudCBWb2x0YWdlIDYgdmFsdWUgKi8KKy8qCUxNODBfVEVNUF9JTgkJY3VycmVudCB0ZW1wZXJhdHVyZSB2YWx1ZSAqLworLyoJTE04MF9GQU4xX0lOCQljdXJyZW50IEZhbiAxIGNvdW50ICovCisvKglMTTgwX0ZBTjJfSU4JCWN1cnJlbnQgRmFuIDIgY291bnQgKi8KKy8qCUxNODBfVlQwX0hJR0hfTElNCWhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDAgKi8KKy8qCUxNODBfVlQwX0xPV19MSU0JbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAwICovCisvKglMTTgwX1ZUMV9ISUdIX0xJTQloaWdoIGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAxICovCisvKglMTTgwX1ZUMV9MT1dfTElNCWxvdyBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMSAqLworLyoJTE04MF9WVDJfSElHSF9MSU0JaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMiAqLworLyoJTE04MF9WVDJfTE9XX0xJTQlsb3cgbGltaXQgdmFsIGZvciBWb2x0YWdlIDIgKi8KKy8qCUxNODBfVlQzX0hJR0hfTElNCWhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDMgKi8KKy8qCUxNODBfVlQzX0xPV19MSU0JbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAzICovCisvKglMTTgwX1ZUNF9ISUdIX0xJTQloaWdoIGxpbWl0IHZhbCBmb3IgVm9sdGFnZSA0ICovCisvKglMTTgwX1ZUNF9MT1dfTElNCWxvdyBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNCAqLworLyoJTE04MF9WVDVfSElHSF9MSU0JaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNSAqLworLyoJTE04MF9WVDVfTE9XX0xJTQlsb3cgbGltaXQgdmFsIGZvciBWb2x0YWdlIDUgKi8KKy8qCUxNODBfVlQ2X0hJR0hfTElNCWhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDYgKi8KKy8qCUxNODBfVlQ2X0xPV19MSU0JbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSA2ICovCisvKglMTTgwX1RIT1RfTElNX1VQCWhvdCB0ZW1wZXJhdHVyZSBsaW1pdCAoaGlnaCkgKi8KKy8qCUxNODBfVEhPVF9MSU1fTE8JaG90IHRlbXBlcmF0dXJlIGxpbWl0IChsb3cpICovCisvKglMTTgwX1RPU19MSU1fVVAJCU9TIHRlbXBlcmF0dXJlIGxpbWl0IChoaWdoKSAqLworLyoJTE04MF9UT1NfTElNX0xPCQlPUyB0ZW1wZXJhdHVyZSBsaW1pdCAobG93KSAqLworLyoJTE04MF9GQU4xX0NPVU5UX0xJTQlGYW4gMSBjb3VudCBsaW1pdCAoaGlnaCkgKi8KKy8qCUxNODBfRkFOMl9DT1VOVF9MSU0JRmFuIDIgY291bnQgbGltaXQgKGxvdykgKi8KKwkvKiAweDNlIC0gMHgzZiByZXNlcnZlZAkqLworCisjZGVmaW5lIExNODBfQUREUgkJMHgyOAkvKiBMTTgwIGRlZmF1bHQgYWRkciAqLworCisvKiB0eXBlZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCS8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgkvKiBfX0lOQ19MTTgwX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2FkZHIuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2FkZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTJlYTRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrYWRkci5oCkBAIC0wLDAgKzEsMzMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2thZGRyLmgKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIEFERFItTW9kdWwKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4yOSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wNS8xMyAxNjo1NzoyNCAkCisgKiBQdXJwb3NlOglIZWFkZXIgZmlsZSBmb3IgQWRkcmVzcyBNYW5hZ2VtZW50IChNQywgVUMsIFByb20pLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBpbnRlbmRlZCB0byBtYW5hZ2UgbXVsdGljYXN0IGFkZHJlc3NlcyBhbmQgcHJvbWlzY3VvdXMgbW9kZQorICogb24gR0VuZXNpcyBhZGFwdGVycy4KKyAqCisgKiBJbmNsdWRlIEZpbGUgSGllcmFyY2h5OgorICoKKyAqCSJza2RydjFzdC5oIgorICoJLi4uCisgKgkic2t0eXBlcy5oIgorICoJInNrcXVldWUuaCIKKyAqCSJza2FkZHIuaCIKKyAqCS4uLgorICoJInNrZHJ2Mm5kLmgiCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0lOQ19TS0FERFJfSAorI2RlZmluZSBfX0lOQ19TS0FERFJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCS8qIGNwbHVzcGx1cyAqLworCisvKiBkZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNLX01BQ19BRERSX0xFTgkJCQk2CS8qIExlbmd0aCBvZiBNQUMgYWRkcmVzcy4gKi8KKyNkZWZpbmUJU0tfTUFYX0FERFJTCQkJCTE0CS8qICNBZGRycyBmb3IgZXhhY3QgbWF0Y2guICovCisKKy8qIC0tLS0tIENvbW1vbiByZXR1cm4gdmFsdWVzIC0tLS0tICovCisKKyNkZWZpbmUgU0tfQUREUl9TVUNDRVNTCQkJCTAJLyogRnVuY3Rpb24gcmV0dXJuZWQgc3VjY2Vzc2Z1bGx5LiAqLworI2RlZmluZSBTS19BRERSX0lMTEVHQUxfUE9SVAkJCTEwMAkvKiBQb3J0IG51bWJlciB0b28gaGlnaC4gKi8KKyNkZWZpbmUgU0tfQUREUl9UT09fRUFSTFkJCQkxMDEJLyogRnVuY3Rpb24gY2FsbGVkIHRvbyBlYXJseS4gKi8KKworLyogLS0tLS0gQ2xlYXIvQWRkIGZsYWcgYml0cyAtLS0tLSAqLworCisjZGVmaW5lIFNLX0FERFJfUEVSTUFORU5UCQkJMQkvKiBSTE1UIEFkZHJlc3MgKi8KKworLyogLS0tLS0gQWRkaXRpb25hbCBDbGVhciBmbGFnIGJpdHMgLS0tLS0gKi8KKworI2RlZmluZSBTS19NQ19TV19PTkxZCQkJCTIJLyogRG8gbm90IHVwZGF0ZSBIVyB3aGVuIGNsZWFyaW5nLiAqLworCisvKiAtLS0tLSBPdmVycmlkZSBmbGFnIGJpdHMgLS0tLS0gKi8KKworI2RlZmluZSBTS19BRERSX0xPR0lDQUxfQUREUkVTUwkJMAorI2RlZmluZSBTS19BRERSX1ZJUlRVQUxfQUREUkVTUwkJKFNLX0FERFJfTE9HSUNBTF9BRERSRVNTKQkvKiBvbGQgKi8KKyNkZWZpbmUgU0tfQUREUl9QSFlTSUNBTF9BRERSRVNTCTEKKyNkZWZpbmUgU0tfQUREUl9DTEVBUl9MT0dJQ0FMCQkyCisjZGVmaW5lIFNLX0FERFJfU0VUX0xPR0lDQUwJCQk0CisKKy8qIC0tLS0tIE92ZXJyaWRlIHJldHVybiB2YWx1ZXMgLS0tLS0gKi8KKworI2RlZmluZSBTS19BRERSX09WRVJSSURFX1NVQ0NFU1MJKFNLX0FERFJfU1VDQ0VTUykKKyNkZWZpbmUgU0tfQUREUl9EVVBMSUNBVEVfQUREUkVTUwkxCisjZGVmaW5lIFNLX0FERFJfTVVMVElDQVNUX0FERFJFU1MJMgorCisvKiAtLS0tLSBQYXJ0aXRpb25pbmcgb2YgZXhjYWN0IG1hdGNoIHRhYmxlIC0tLS0tICovCisKKyNkZWZpbmUgU0tfQUREUl9FWEFDVF9NQVRDSEVTCQkxNgkvKiAjRXhhY3QgbWF0Y2ggZW50cmllcy4gKi8KKworI2RlZmluZSBTS19BRERSX0ZJUlNUX01BVENIX1JMTVQJMQorI2RlZmluZSBTS19BRERSX0xBU1RfTUFUQ0hfUkxNVAkJMgorI2RlZmluZSBTS19BRERSX0ZJUlNUX01BVENIX0RSVgkJMworI2RlZmluZSBTS19BRERSX0xBU1RfTUFUQ0hfRFJWCQkoU0tfQUREUl9FWEFDVF9NQVRDSEVTIC0gMSkKKworLyogLS0tLS0gU2tBZGRyTWNBZGQvU2tBZGRyTWNVcGRhdGUgcmV0dXJuIHZhbHVlcyAtLS0tLSAqLworCisjZGVmaW5lIFNLX01DX0ZJTFRFUklOR19FWEFDVAkJMAkvKiBFeGFjdCBmaWx0ZXJpbmcuICovCisjZGVmaW5lIFNLX01DX0ZJTFRFUklOR19JTkVYQUNUCQkxCS8qIEluZXhhY3QgZmlsdGVyaW5nLiAqLworCisvKiAtLS0tLSBBZGRpdGlvbmFsIFNrQWRkck1jQWRkIHJldHVybiB2YWx1ZXMgLS0tLS0gKi8KKworI2RlZmluZSBTS19NQ19JTExFR0FMX0FERFJFU1MJCTIJLyogSWxsZWdhbCBhZGRyZXNzLiAqLworI2RlZmluZSBTS19NQ19JTExFR0FMX1BPUlQJCQkzCS8qIElsbGVnYWwgcG9ydCAobm90IHRoZSBhY3RpdmUgb25lKS4gKi8KKyNkZWZpbmUgU0tfTUNfUkxNVF9PVkVSRkxPVwkJCTQJLyogVG9vIG1hbnkgUkxNVCBtYyBhZGRyZXNzZXMuICovCisKKy8qIFByb21pc2N1b3VzIG1vZGUgYml0cyAtLS0tLSAqLworCisjZGVmaW5lIFNLX1BST01fTU9ERV9OT05FCQkJMAkvKiBOb3JtYWwgcmVjZWl2ZS4gKi8KKyNkZWZpbmUgU0tfUFJPTV9NT0RFX0xMQwkJCTEJLyogUmVjZWl2ZSBhbGwgTExDIGZyYW1lcy4gKi8KKyNkZWZpbmUgU0tfUFJPTV9NT0RFX0FMTF9NQwkJCTIJLyogUmVjZWl2ZSBhbGwgbXVsdGljYXN0IGZyYW1lcy4gKi8KKy8qICNkZWZpbmUgU0tfUFJPTV9NT0RFX05PTl9MTEMJCTQgKi8JLyogUmVjZWl2ZSBhbGwgbm9uLUxMQyBmcmFtZXMuICovCisKKy8qIE1hY3JvcyAqLworCisjaWZkZWYgT0xEX1NUVUZGCisjaWZuZGVmIFNLX0FERFJfRVFVQUwKKy8qCisgKiAiJiIgaW5zdGVhZCBvZiAiJiYiIGFsbG93cyBiZXR0ZXIgb3B0aW1pemF0aW9uIG9uIElBLTY0LgorICogVGhlIHJlcGxhY2VtZW50IGlzIHNhZmUgaGVyZSwgYXMgYWxsIGJ5dGVzIGV4aXN0LgorICovCisjaWZuZGVmIFNLX0FERFJfRFdPUkRfQ09NUEFSRQorI2RlZmluZSBTS19BRERSX0VRVUFMKEExLEEyKQkoIFwKKwkoKChTS19VOCAqKShBMSkpWzVdID09ICgoU0tfVTggKikoQTIpKVs1XSkgJiBcCisJKCgoU0tfVTggKikoQTEpKVs0XSA9PSAoKFNLX1U4ICopKEEyKSlbNF0pICYgXAorCSgoKFNLX1U4ICopKEExKSlbM10gPT0gKChTS19VOCAqKShBMikpWzNdKSAmIFwKKwkoKChTS19VOCAqKShBMSkpWzJdID09ICgoU0tfVTggKikoQTIpKVsyXSkgJiBcCisJKCgoU0tfVTggKikoQTEpKVsxXSA9PSAoKFNLX1U4ICopKEEyKSlbMV0pICYgXAorCSgoKFNLX1U4ICopKEExKSlbMF0gPT0gKChTS19VOCAqKShBMikpWzBdKSkKKyNlbHNlCS8qIFNLX0FERFJfRFdPUkRfQ09NUEFSRSAqLworI2RlZmluZSBTS19BRERSX0VRVUFMKEExLEEyKQkoIFwKKwkoKihTS19VMzIgKikmKCgoU0tfVTggKikoQTEpKVsyXSkgPT0gKihTS19VMzIgKikmKCgoU0tfVTggKikoQTIpKVsyXSkpICYgXAorCSgqKFNLX1UzMiAqKSYoKChTS19VOCAqKShBMSkpWzBdKSA9PSAqKFNLX1UzMiAqKSYoKChTS19VOCAqKShBMikpWzBdKSkpCisjZW5kaWYJLyogU0tfQUREUl9EV09SRF9DT01QQVJFICovCisjZW5kaWYJLyogU0tfQUREUl9FUVVBTCAqLworI2VuZGlmIC8qIDAgKi8KKworI2lmbmRlZiBTS19BRERSX0VRVUFMCisjaWZuZGVmIFNLX0FERFJfRFdPUkRfQ09NUEFSRQorI2RlZmluZSBTS19BRERSX0VRVUFMKEExLEEyKQkoIFwKKwkoKChTS19VOCBTS19GQVIgKikoQTEpKVs1XSA9PSAoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzVdKSAmIFwKKwkoKChTS19VOCBTS19GQVIgKikoQTEpKVs0XSA9PSAoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzRdKSAmIFwKKwkoKChTS19VOCBTS19GQVIgKikoQTEpKVszXSA9PSAoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzNdKSAmIFwKKwkoKChTS19VOCBTS19GQVIgKikoQTEpKVsyXSA9PSAoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzJdKSAmIFwKKwkoKChTS19VOCBTS19GQVIgKikoQTEpKVsxXSA9PSAoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzFdKSAmIFwKKwkoKChTS19VOCBTS19GQVIgKikoQTEpKVswXSA9PSAoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzBdKSkKKyNlbHNlCS8qIFNLX0FERFJfRFdPUkRfQ09NUEFSRSAqLworI2RlZmluZSBTS19BRERSX0VRVUFMKEExLEEyKQkoIFwKKwkoKihTS19VMTYgU0tfRkFSICopJigoKFNLX1U4IFNLX0ZBUiAqKShBMSkpWzRdKSA9PSBcCisJKihTS19VMTYgU0tfRkFSICopJigoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzRdKSkgJiYgXAorCSgqKFNLX1UzMiBTS19GQVIgKikmKCgoU0tfVTggU0tfRkFSICopKEExKSlbMF0pID09IFwKKwkqKFNLX1UzMiBTS19GQVIgKikmKCgoU0tfVTggU0tfRkFSICopKEEyKSlbMF0pKSkKKyNlbmRpZgkvKiBTS19BRERSX0RXT1JEX0NPTVBBUkUgKi8KKyNlbmRpZgkvKiBTS19BRERSX0VRVUFMICovCisKKy8qIHR5cGVkZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHNfTWFjQWRkciB7CisJU0tfVTgJYVtTS19NQUNfQUREUl9MRU5dOworfSBTS19NQUNfQUREUjsKKworCisvKiBTS19GSUxURVIgaXMgdXNlZCB0byBlbnN1cmUgYWxpZ25tZW50IG9mIHRoZSBmaWx0ZXIuICovCit0eXBlZGVmIHVuaW9uIHNfSW5leGFjdEZpbHRlciB7CisJU0tfVTgJQnl0ZXNbOF07CisJU0tfVTY0CVZhbDsJLyogRHVtbXkgZW50cnkgZm9yIGFsaWdubWVudCBvbmx5LiAqLworfSBTS19GSUxURVI2NDsKKworCit0eXBlZGVmIHN0cnVjdCBzX0FkZHJOZXQgU0tfQUREUl9ORVQ7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19BZGRyUG9ydCB7CisKKy8qIC0tLS0tIFB1YmxpYyBwYXJ0IChyZWFkLW9ubHkpIC0tLS0tICovCisKKwlTS19NQUNfQUREUglDdXJyZW50TWFjQWRkcmVzczsJLyogQ3VycmVudCBwaHlzaWNhbCBNQUMgQWRkcmVzcy4gKi8KKwlTS19NQUNfQUREUglQZXJtYW5lbnRNYWNBZGRyZXNzOwkvKiBQZXJtYW5lbnQgcGh5c2ljYWwgTUFDIEFkZHJlc3MuICovCisJaW50CQlQcm9tTW9kZTsJCS8qIFByb21pc2N1b3VzIE1vZGUuICovCisKKy8qIC0tLS0tIFByaXZhdGUgcGFydCAtLS0tLSAqLworCisJU0tfTUFDX0FERFIJUHJldmlvdXNNYWNBZGRyZXNzOwkvKiBQcmV2LiBwaHlzLiBNQUMgQWRkcmVzcy4gKi8KKwlTS19CT09MCQlDdXJyZW50TWFjQWRkcmVzc1NldDsJLyogQ3VycmVudE1hY0FkZHJlc3MgaXMgc2V0LiAqLworCVNLX1U4CQlBbGlnbjAxOworCisJU0tfVTMyCQlGaXJzdEV4YWN0TWF0Y2hSbG10OworCVNLX1UzMgkJTmV4dEV4YWN0TWF0Y2hSbG10OworCVNLX1UzMgkJRmlyc3RFeGFjdE1hdGNoRHJ2OworCVNLX1UzMgkJTmV4dEV4YWN0TWF0Y2hEcnY7CisJU0tfTUFDX0FERFIJRXhhY3RbU0tfQUREUl9FWEFDVF9NQVRDSEVTXTsKKwlTS19GSUxURVI2NAlJbmV4YWN0RmlsdGVyOwkJCS8qIEZvciA2NC1iaXQgaGFzaCByZWdpc3Rlci4gKi8KKwlTS19GSUxURVI2NAlJbmV4YWN0UmxtdEZpbHRlcjsJCS8qIEZvciA2NC1iaXQgaGFzaCByZWdpc3Rlci4gKi8KKwlTS19GSUxURVI2NAlJbmV4YWN0RHJ2RmlsdGVyOwkJLyogRm9yIDY0LWJpdCBoYXNoIHJlZ2lzdGVyLiAqLworfSBTS19BRERSX1BPUlQ7CisKKworc3RydWN0IHNfQWRkck5ldCB7CisvKiAtLS0tLSBQdWJsaWMgcGFydCAocmVhZC1vbmx5KSAtLS0tLSAqLworCisJU0tfTUFDX0FERFIJCUN1cnJlbnRNYWNBZGRyZXNzOwkvKiBMb2dpY2FsIE1BQyBBZGRyZXNzLiAqLworCVNLX01BQ19BRERSCQlQZXJtYW5lbnRNYWNBZGRyZXNzOwkvKiBMb2dpY2FsIE1BQyBBZGRyZXNzLiAqLworCisvKiAtLS0tLSBQcml2YXRlIHBhcnQgLS0tLS0gKi8KKworCVNLX1UzMgkJCUFjdGl2ZVBvcnQ7CQkvKiBWaWV3IG9mIG1vZHVsZSBBRERSLiAqLworCVNLX0JPT0wJCQlDdXJyZW50TWFjQWRkcmVzc1NldDsJLyogQ3VycmVudE1hY0FkZHJlc3MgaXMgc2V0LiAqLworCVNLX1U4CQkJQWxpZ24wMTsKKwlTS19VMTYJCQlBbGlnbjAyOworfTsKKworCit0eXBlZGVmIHN0cnVjdCBzX0FkZHIgeworCisvKiAtLS0tLSBQdWJsaWMgcGFydCAocmVhZC1vbmx5KSAtLS0tLSAqLworCisJU0tfQUREUl9ORVQJCU5ldFtTS19NQVhfTkVUU107CisJU0tfQUREUl9QT1JUCVBvcnRbU0tfTUFYX01BQ1NdOworCisvKiAtLS0tLSBQcml2YXRlIHBhcnQgLS0tLS0gKi8KK30gU0tfQUREUjsKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTS19LUl9QUk9UTworCisvKiBGdW5jdGlvbnMgcHJvdmlkZWQgYnkgU2tBZGRyICovCisKKy8qIEFOU0kvQysrIGNvbXBsaWFudCBmdW5jdGlvbiBwcm90b3R5cGVzICovCisKK2V4dGVybglpbnQJU2tBZGRySW5pdCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CUxldmVsKTsKKworZXh0ZXJuCWludAlTa0FkZHJNY0NsZWFyKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJUG9ydE51bWJlciwKKwlpbnQJRmxhZ3MpOworCitleHRlcm4JaW50CVNrQWRkclhtYWNNY0NsZWFyKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJUG9ydE51bWJlciwKKwlpbnQJRmxhZ3MpOworCitleHRlcm4JaW50CVNrQWRkckdtYWNNY0NsZWFyKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJUG9ydE51bWJlciwKKwlpbnQJRmxhZ3MpOworCitleHRlcm4JaW50CVNrQWRkck1jQWRkKAorCVNLX0FDCQkqcEFDLAorCVNLX0lPQwkJSW9DLAorCVNLX1UzMgkJUG9ydE51bWJlciwKKwlTS19NQUNfQUREUgkqcE1jLAorCWludAkJRmxhZ3MpOworCitleHRlcm4JaW50CVNrQWRkclhtYWNNY0FkZCgKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwlTS19VMzIJCVBvcnROdW1iZXIsCisJU0tfTUFDX0FERFIJKnBNYywKKwlpbnQJCUZsYWdzKTsKKworZXh0ZXJuCWludAlTa0FkZHJHbWFjTWNBZGQoCisJU0tfQUMJCSpwQUMsCisJU0tfSU9DCQlJb0MsCisJU0tfVTMyCQlQb3J0TnVtYmVyLAorCVNLX01BQ19BRERSCSpwTWMsCisJaW50CQlGbGFncyk7CisKK2V4dGVybglpbnQJU2tBZGRyTWNVcGRhdGUoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCVNLX1UzMglQb3J0TnVtYmVyKTsKKworZXh0ZXJuCWludAlTa0FkZHJYbWFjTWNVcGRhdGUoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCVNLX1UzMglQb3J0TnVtYmVyKTsKKworZXh0ZXJuCWludAlTa0FkZHJHbWFjTWNVcGRhdGUoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCVNLX1UzMglQb3J0TnVtYmVyKTsKKworZXh0ZXJuCWludAlTa0FkZHJPdmVycmlkZSgKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwlTS19VMzIJCVBvcnROdW1iZXIsCisJU0tfTUFDX0FERFIJU0tfRkFSICpwTmV3QWRkciwKKwlpbnQJCUZsYWdzKTsKKworZXh0ZXJuCWludAlTa0FkZHJQcm9taXNjdW91c0NoYW5nZSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJU0tfVTMyCVBvcnROdW1iZXIsCisJaW50CU5ld1Byb21Nb2RlKTsKKworZXh0ZXJuCWludAlTa0FkZHJYbWFjUHJvbWlzY3VvdXNDaGFuZ2UoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCVNLX1UzMglQb3J0TnVtYmVyLAorCWludAlOZXdQcm9tTW9kZSk7CisKK2V4dGVybglpbnQJU2tBZGRyR21hY1Byb21pc2N1b3VzQ2hhbmdlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJUG9ydE51bWJlciwKKwlpbnQJTmV3UHJvbU1vZGUpOwkKKworI2lmbmRlZiBTS19TTElNCitleHRlcm4JaW50CVNrQWRkclN3YXAoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCVNLX1UzMglGcm9tUG9ydE51bWJlciwKKwlTS19VMzIJVG9Qb3J0TnVtYmVyKTsKKyNlbmRpZgorCisjZWxzZQkvKiBkZWZpbmVkKFNLX0tSX1BST1RPKSkgKi8KKworLyogTm9uLUFOU0kvQysrIGNvbXBsaWFudCBmdW5jdGlvbiBwcm90b3R5cGVzICovCisKKyNlcnJvciBLUi1zdHlsZSBwcm90b3R5cGVzIGFyZSBub3QgeWV0IHByb3ZpZGVkLgorCisjZW5kaWYJLyogZGVmaW5lZChTS19LUl9QUk9UTykpICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYJLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCS8qIF9fSU5DX1NLQUREUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tjc3VtLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tjc3VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI5NGFkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2NzdW0uaApAQCAtMCwwICsxLDIxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrY3N1bS5oCisgKiBQcm9qZWN0OglHRW5lc2lzIC0gU3lzS29ubmVjdCBTSy1ORVQgR2lnYWJpdCBFdGhlcm5ldCAoU0stOTh4eCkKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4xMCAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wOC8yMCAxMzo1OTo1NyAkCisgKiBQdXJwb3NlOglTdG9yZS92ZXJpZnkgSW50ZXJuZXQgY2hlY2tzdW0gaW4gc2VuZC9yZWNlaXZlIHBhY2tldHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDEgU3lzS29ubmVjdCBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFB1YmxpYyBoZWFkZXIgZmlsZSBmb3IgdGhlICJHRW5lc2lzIiBjb21tb24gbW9kdWxlICJDU1VNIi4KKyAqCisgKiAiR0VuZXNpcyIgaXMgYW4gYWJicmV2aWF0aW9uIG9mICJHaWdhYml0IEV0aGVybmV0IE5ldHdvcmsgU3lzdGVtIGluIFNpbGljb24iCisgKiBhbmQgaXMgdGhlIGNvZGUgbmFtZSBvZiB0aGlzIFN5c0tvbm5lY3QgcHJvamVjdC4KKyAqCisgKiBDb21waWxhdGlvbiBPcHRpb25zOgorICoKKyAqCVNLX1VTRV9DU1VNIC0gRGVmaW5lIGlmIENTVU0gaXMgdG8gYmUgdXNlZC4gT3RoZXJ3aXNlLCBDU1VNIHdpbGwgYmUgYW4KKyAqCWVtcHR5IG1vZHVsZS4KKyAqCisgKglTS0NTX09WRVJXUklURV9QUk9UTyAtIERlZmluZSB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHQgcHJvdG9jb2wgaWQKKyAqCWRlZmluaXRpb25zLiBJbiB0aGlzIGNhc2UsIGFsbCBTS0NTX1BST1RPX3h4eCBkZWZpbml0aW9ucyBtdXN0IGJlIG1hZGUKKyAqCWV4dGVybmFsLgorICoKKyAqCVNLQ1NfT1ZFUldSSVRFX1NUQVRVUyAtIERlZmluZSB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHQgcmV0dXJuIHN0YXR1cworICoJZGVmaW5pdGlvbnMuIEluIHRoaXMgY2FzZSwgYWxsIFNLQ1NfU1RBVFVTX3h4eCBkZWZpbml0aW9ucyBtdXN0IGJlIG1hZGUKKyAqCWV4dGVybmFsLgorICoKKyAqIEluY2x1ZGUgRmlsZSBIaWVyYXJjaHk6CisgKgorICoJImgvc2tjc3VtLmgiCisgKgkgImgvc2t0eXBlcy5oIgorICoJICJoL3NrcXVldWUuaCIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX1NLQ1NVTV9ICisjZGVmaW5lIF9fSU5DX1NLQ1NVTV9ICisKKyNpbmNsdWRlICJoL3NrdHlwZXMuaCIKKyNpbmNsdWRlICJoL3NrcXVldWUuaCIKKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIERlZmluZSB0aGUgZGVmYXVsdCBiaXQgZmxhZ3MgZm9yICdTS0NTX1BBQ0tFVF9JTkZPLlByb3RvY29sRmxhZ3MnICBpZiBubyB1c2VyCisgKiBvdmVyd3JpdGUuCisgKi8KKyNpZm5kZWYgU0tDU19PVkVSV1JJVEVfUFJPVE8JLyogVXNlciBvdmVyd3JpdGU/ICovCisjZGVmaW5lIFNLQ1NfUFJPVE9fSVAJMHgxCS8qIElQIChJbnRlcm5ldCBQcm90b2NvbCB2ZXJzaW9uIDQpICovCisjZGVmaW5lIFNLQ1NfUFJPVE9fVENQCTB4MgkvKiBUQ1AgKFRyYW5zbWlzc2lvbiBDb250cm9sIFByb3RvY29sKSAqLworI2RlZmluZSBTS0NTX1BST1RPX1VEUAkweDQJLyogVURQIChVc2VyIERhdGFncmFtIFByb3RvY29sKSAqLworCisvKiBJbmRpY2VzIGZvciBwcm90b2NvbCBzdGF0aXN0aWNzLiAqLworI2RlZmluZSBTS0NTX1BST1RPX1NUQVRTX0lQCTAKKyNkZWZpbmUgU0tDU19QUk9UT19TVEFUU19VRFAJMQorI2RlZmluZSBTS0NTX1BST1RPX1NUQVRTX1RDUAkyCisjZGVmaW5lIFNLQ1NfTlVNX1BST1RPQ09MUwkzCS8qIE51bWJlciBvZiBzdXBwb3J0ZWQgcHJvdG9jb2xzLiAqLworI2VuZGlmCS8qICFTS0NTX09WRVJXUklURV9QUk9UTyAqLworCisvKgorICogRGVmaW5lIHRoZSBkZWZhdWx0IFNLQ1NfU1RBVFVTIHR5cGUgYW5kIHZhbHVlcyBpZiBubyB1c2VyIG92ZXJ3cml0ZS4KKyAqCisgKglTS0NTX1NUQVRVU19VTktOT1dOX0lQX1ZFUlNJT04gLSBOb3QgYW4gSVAgdjQgZnJhbWUuCisgKglTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SIC0gSVAgY2hlY2tzdW0gZXJyb3IuCisgKglTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SX1RDUCAtIElQIGNoZWNrc3VtIGVycm9yIGluIFRDUCBmcmFtZS4KKyAqCVNLQ1NfU1RBVFVTX0lQX0NTVU1fRVJST1JfVURQIC0gSVAgY2hlY2tzdW0gZXJyb3IgaW4gVURQIGZyYW1lCisgKglTS0NTX1NUQVRVU19JUF9GUkFHTUVOVCAtIElQIGZyYWdtZW50IChJUCBjaGVja3N1bSBvaykuCisgKglTS0NTX1NUQVRVU19JUF9DU1VNX09LIC0gSVAgY2hlY2tzdW0gb2sgKG5vdCBhIFRDUCBvciBVRFAgZnJhbWUpLgorICoJU0tDU19TVEFUVVNfVENQX0NTVU1fRVJST1IgLSBUQ1AgY2hlY2tzdW0gZXJyb3IgKElQIGNoZWNrc3VtIG9rKS4KKyAqCVNLQ1NfU1RBVFVTX1VEUF9DU1VNX0VSUk9SIC0gVURQIGNoZWNrc3VtIGVycm9yIChJUCBjaGVja3N1bSBvaykuCisgKglTS0NTX1NUQVRVU19UQ1BfQ1NVTV9PSyAtIElQIGFuZCBUQ1AgY2hlY2tzdW0gb2suCisgKglTS0NTX1NUQVRVU19VRFBfQ1NVTV9PSyAtIElQIGFuZCBVRFAgY2hlY2tzdW0gb2suCisgKglTS0NTX1NUQVRVU19JUF9DU1VNX09LX05PX1VEUCAtIElQIGNoZWNrc3VtIE9LIGFuZCBubyBVRFAgY2hlY2tzdW0uIAorICovCisjaWZuZGVmIFNLQ1NfT1ZFUldSSVRFX1NUQVRVUwkvKiBVc2VyIG92ZXJ3cml0ZT8gKi8KKyNkZWZpbmUgU0tDU19TVEFUVVMJaW50CS8qIERlZmluZSBzdGF0dXMgdHlwZS4gKi8KKworI2RlZmluZSBTS0NTX1NUQVRVU19VTktOT1dOX0lQX1ZFUlNJT04JMQorI2RlZmluZSBTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SCQkyCisjZGVmaW5lIFNLQ1NfU1RBVFVTX0lQX0ZSQUdNRU5UCQkJMworI2RlZmluZSBTS0NTX1NUQVRVU19JUF9DU1VNX09LCQkJNAorI2RlZmluZSBTS0NTX1NUQVRVU19UQ1BfQ1NVTV9FUlJPUgkJNQorI2RlZmluZSBTS0NTX1NUQVRVU19VRFBfQ1NVTV9FUlJPUgkJNgorI2RlZmluZSBTS0NTX1NUQVRVU19UQ1BfQ1NVTV9PSwkJCTcKKyNkZWZpbmUgU0tDU19TVEFUVVNfVURQX0NTVU1fT0sJCQk4CisvKiBuZWVkZWQgZm9yIE1pY3Jvc29mdCAqLworI2RlZmluZSBTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SX1VEUAk5CisjZGVmaW5lIFNLQ1NfU1RBVFVTX0lQX0NTVU1fRVJST1JfVENQCTEwCisvKiBVRFAgY2hlY2tzdW0gbWF5IGJlIG9taXR0ZWQgKi8KKyNkZWZpbmUgU0tDU19TVEFUVVNfSVBfQ1NVTV9PS19OT19VRFAJMTEKKyNlbmRpZgkvKiAhU0tDU19PVkVSV1JJVEVfU1RBVFVTICovCisKKy8qIENsZWFyIHByb3RvY29sIHN0YXRpc3RpY3MgZXZlbnQuICovCisjZGVmaW5lIFNLX0NTVU1fRVZFTlRfQ0xFQVJfUFJPVE9fU1RBVFMJMQorCisvKgorICogQWRkIHR3byB2YWx1ZXMgaW4gb25lJ3MgY29tcGxlbWVudC4KKyAqCisgKiBOb3RlOiBPbmUgb2YgdGhlIHR3byBpbnB1dCB2YWx1ZXMgbWF5IGJlICJsb25nZXIiIHRoYW4gMTYtYml0LCBidXQgdGhlbiB0aGUKKyAqIHJlc3VsdGluZyBzdW0gbWF5IGJlIDE3IGJpdHMgbG9uZy4gSW4gdGhpcyBjYXNlLCBhZGQgemVybyB0byB0aGUgcmVzdWx0IHVzaW5nCisgKiBTS0NTX09DX0FERCgpIGFnYWluLgorICoKKyAqCVJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMgorICovCisjZGVmaW5lIFNLQ1NfT0NfQUREKFJlc3VsdCwgVmFsdWUxLCBWYWx1ZTIpIHsJCQkJXAorCXVuc2lnbmVkIGxvbmcgU3VtOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlTdW0gPSAodW5zaWduZWQgbG9uZykgKFZhbHVlMSkgKyAodW5zaWduZWQgbG9uZykgKFZhbHVlMik7CVwKKwkvKiBBZGQtaW4gYW55IGNhcnJ5LiAqLwkJCQkJCVwKKwkoUmVzdWx0KSA9IChTdW0gJiAweGZmZmYpICsgKFN1bSA+PiAxNik7CQkJXAorfQorCisvKgorICogU3VidHJhY3QgdHdvIHZhbHVlcyBpbiBvbmUncyBjb21wbGVtZW50LgorICoKKyAqCVJlc3VsdCA9IFZhbHVlMSAtIFZhbHVlMgorICovCisjZGVmaW5lIFNLQ1NfT0NfU1VCKFJlc3VsdCwgVmFsdWUxLCBWYWx1ZTIpCVwKKwlTS0NTX09DX0FERCgoUmVzdWx0KSwgKFZhbHVlMSksIH4oVmFsdWUyKSAmIDB4ZmZmZikKKworLyogdHlwZWRlZnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNLQ1NfUFJPVE9fU1RBVFMgLSBUaGUgQ1NVTSBwcm90b2NvbCBzdGF0aXN0aWNzIHN0cnVjdHVyZS4KKyAqCisgKiBUaGVyZSBpcyBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgZm9yIGVhY2ggcHJvdG9jb2wgc3VwcG9ydGVkLgorICovCit0eXBlZGVmIHN0cnVjdCBzX0NzUHJvdG9jb2xTdGF0aXN0aWNzIHsKKwlTS19VNjQgUnhPa0N0czsJCS8qIFJlY2VpdmUgY2hlY2tzdW0gb2suICovCisJU0tfVTY0IFJ4VW5hYmxlQ3RzOwkvKiBVbmFibGUgdG8gdmVyaWZ5IHJlY2VpdmUgY2hlY2tzdW0uICovCisJU0tfVTY0IFJ4RXJyQ3RzOwkvKiBSZWNlaXZlIGNoZWNrc3VtIGVycm9yLiAqLworCVNLX1U2NCBUeE9rQ3RzOwkJLyogVHJhbnNtaXQgY2hlY2tzdW0gb2suICovCisJU0tfVTY0IFR4VW5hYmxlQ3RzOwkvKiBVbmFibGUgdG8gY2FsY3VsYXRlIGNoZWNrc3VtIGluIGh3LiAqLworfSBTS0NTX1BST1RPX1NUQVRTOworCisvKgorICogc19Dc3VtIC0gVGhlIENTVU0gbW9kdWxlIGNvbnRleHQgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBzX0NzdW0geworCS8qIEVuYWJsZWQgcmVjZWl2ZSBTS19QUk9UT19YWFggYml0IGZsYWdzLiAqLworCXVuc2lnbmVkIFJlY2VpdmVGbGFnc1tTS19NQVhfTkVUU107CisjaWZkZWYgVFhfQ1NVTQorCXVuc2lnbmVkIFRyYW5zbWl0RmxhZ3NbU0tfTUFYX05FVFNdOworI2VuZGlmIC8qIFRYX0NTVU0gKi8KKworCS8qIFRoZSBwcm90b2NvbCBzdGF0aXN0aWNzIHN0cnVjdHVyZTsgb25lIHBlciBzdXBwb3J0ZWQgcHJvdG9jb2wuICovCisJU0tDU19QUk9UT19TVEFUUyBQcm90b1N0YXRzW1NLX01BWF9ORVRTXVtTS0NTX05VTV9QUk9UT0NPTFNdOworfSBTS19DU1VNOworCisvKgorICogU0tDU19QQUNLRVRfSU5GTyAtIFRoZSBwYWNrZXQgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBzX0NzUGFja2V0SW5mbyB7CisJLyogQml0IGZpZWxkIHNwZWNpZml5aW5nIHRoZSBkZXNpcmVkL2ZvdW5kIHByb3RvY29scy4gKi8KKwl1bnNpZ25lZCBQcm90b2NvbEZsYWdzOworCisJLyogTGVuZ3RoIG9mIGNvbXBsZXRlIElQIGhlYWRlciwgaW5jbHVkaW5nIGFueSBvcHRpb24gZmllbGRzLiAqLworCXVuc2lnbmVkIElwSGVhZGVyTGVuZ3RoOworCisJLyogSVAgaGVhZGVyIGNoZWNrc3VtLiAqLworCXVuc2lnbmVkIElwSGVhZGVyQ2hlY2tzdW07CisKKwkvKiBUQ1AvVURQIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0uICovCisJdW5zaWduZWQgUHNldWRvSGVhZGVyQ2hlY2tzdW07Cit9IFNLQ1NfUEFDS0VUX0lORk87CisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0tfQ1NfQ0FMQ1VMQVRFX0NIRUNLU1VNCitleHRlcm4gdW5zaWduZWQgU2tDc0NhbGN1bGF0ZUNoZWNrc3VtKAorCXZvaWQJCSpwRGF0YSwKKwl1bnNpZ25lZAlMZW5ndGgpOworI2VuZGlmIC8qIFNLX0NTX0NBTENVTEFURV9DSEVDS1NVTSAqLworCitleHRlcm4gaW50IFNrQ3NFdmVudCgKKwlTS19BQwkJKnBBYywKKwlTS19JT0MJCUlvYywKKwlTS19VMzIJCUV2ZW50LAorCVNLX0VWUEFSQQlQYXJhbSk7CisKK2V4dGVybiBTS0NTX1NUQVRVUyBTa0NzR2V0UmVjZWl2ZUluZm8oCisJU0tfQUMJCSpwQWMsCisJdm9pZAkJKnBJcEhlYWRlciwKKwl1bnNpZ25lZAlDaGVja3N1bTEsCisJdW5zaWduZWQJQ2hlY2tzdW0yLAorCWludAkJCU5ldE51bWJlcik7CisKK2V4dGVybiB2b2lkIFNrQ3NHZXRTZW5kSW5mbygKKwlTS19BQwkJCQkqcEFjLAorCXZvaWQJCQkJKnBJcEhlYWRlciwKKwlTS0NTX1BBQ0tFVF9JTkZPCSpwUGFja2V0SW5mbywKKwlpbnQJCQkJCU5ldE51bWJlcik7CisKK2V4dGVybiB2b2lkIFNrQ3NTZXRSZWNlaXZlRmxhZ3MoCisJU0tfQUMJCSpwQWMsCisJdW5zaWduZWQJUmVjZWl2ZUZsYWdzLAorCXVuc2lnbmVkCSpwQ2hlY2tzdW0xT2Zmc2V0LAorCXVuc2lnbmVkCSpwQ2hlY2tzdW0yT2Zmc2V0LAorCWludAkJCU5ldE51bWJlcik7CisKKyNlbmRpZgkvKiBfX0lOQ19TS0NTVU1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZGVidWcuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NiYTE3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RlYnVnLmgKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZGVidWcuaAorICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgQ29tbW9uIE1vZHVsZXMKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4xNCAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wNS8xMyAxNzoyNjowMCAkCisgKiBQdXJwb3NlOglTSyBzcGVjaWZpYyBERUJVRyBzdXBwb3J0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNfU0tERUJVR19ICisjZGVmaW5lIF9fSU5DX1NLREVCVUdfSAorCisjaWZkZWYJREVCVUcKKyNpZm5kZWYgU0tfREJHX01TRworI2RlZmluZSBTS19EQkdfTVNHKHBBQyxjb21wLGNhdCxhcmcpIFwKKwkJaWYgKCAoKGNvbXApICYgU0tfREJHX0NIS01PRChwQUMpKSAmJiAJXAorCQkgICAgICAoKGNhdCkgJiBTS19EQkdfQ0hLQ0FUKHBBQykpICkgeyAJXAorCQkJU0tfREJHX1BSSU5URiBhcmcgOwkJXAorCQl9CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIFNLX0RCR19NU0cocEFDLGNvbXAsbGV2LGFyZykKKyNlbmRpZgorCisvKiBQTFMgTk9URToKKyAqID09PT09PT09PQorICogRHVlIHRvIGFueSByZXN0cmljdGlvbnMgb2Yga2VybmVsIHByaW50ZiByb3V0aW5lcyBkbyBub3QgdXNlIG90aGVyCisgKiBmb3JtYXQgaWRlbnRpZmllcnMgYXM6ICV4ICVkICVjICVzIC4KKyAqIE5ldmVyIHVzZSBhbnkgY29tYmluZWQgZm9ybWF0IGlkZW50aWZpZXJzIHN1Y2ggYXM6ICVseCAlbGQgaW4geW91cgorICogcHJpbnRmIC0gYXJndW1lbnQgKGFyZykgYmVjYXVzZSBzb21lIE9TIHNwZWNpZmljIGtlcm5lbCBwcmludGZzIG1heQorICogb25seSBzdXBwb3J0IHNvbWUgYmFzaWMgaWRlbnRpZmllcnMuCisgKi8KKworLyogRGVidWcgbW9kdWxlcyAqLworCisjZGVmaW5lIFNLX0RCR01PRF9NRVJSCTB4MDAwMDAwMDFMCS8qIGdlbmVyYWwgbW9kdWxlIGVycm9yIGluZGljYXRpb24gKi8KKyNkZWZpbmUgU0tfREJHTU9EX0hXTQkweDAwMDAwMDAyTAkvKiBIYXJkd2FyZSBpbml0IG1vZHVsZSAqLworI2RlZmluZSBTS19EQkdNT0RfUkxNVAkweDAwMDAwMDA0TAkvKiBSTE1UIG1vZHVsZSAqLworI2RlZmluZSBTS19EQkdNT0RfVlBECTB4MDAwMDAwMDhMCS8qIFZQRCBtb2R1bGUgKi8KKyNkZWZpbmUgU0tfREJHTU9EX0kyQwkweDAwMDAwMDEwTAkvKiBJMkMgbW9kdWxlICovCisjZGVmaW5lIFNLX0RCR01PRF9QTk1JCTB4MDAwMDAwMjBMCS8qIFBOTUkgbW9kdWxlICovCisjZGVmaW5lIFNLX0RCR01PRF9DU1VNCTB4MDAwMDAwNDBMCS8qIENTVU0gbW9kdWxlICovCisjZGVmaW5lIFNLX0RCR01PRF9BRERSCTB4MDAwMDAwODBMCS8qIEFERFIgbW9kdWxlICovCisjZGVmaW5lIFNLX0RCR01PRF9QRUNQCTB4MDAwMDAxMDBMCS8qIFBFQ1AgbW9kdWxlICovCisjZGVmaW5lIFNLX0RCR01PRF9QT1dNCTB4MDAwMDAyMDBMCS8qIFBvd2VyIE1hbmFnZW1lbnQgbW9kdWxlICovCisKKy8qIERlYnVnIGV2ZW50cyAqLworCisjZGVmaW5lIFNLX0RCR0NBVF9JTklUCTB4MDAwMDAwMDFMCS8qIG1vZHVsZS9kcml2ZXIgaW5pdGlhbGl6YXRpb24gKi8KKyNkZWZpbmUgU0tfREJHQ0FUX0NUUkwJMHgwMDAwMDAwMkwJLyogY29udHJvbGxpbmcgZGV2aWNlcyAqLworI2RlZmluZSBTS19EQkdDQVRfRVJSCTB4MDAwMDAwMDRMCS8qIGVycm9yIGhhbmRsaW5nIHBhdGhzICovCisjZGVmaW5lIFNLX0RCR0NBVF9UWAkweDAwMDAwMDA4TAkvKiB0cmFuc21pdCBwYXRoICovCisjZGVmaW5lIFNLX0RCR0NBVF9SWAkweDAwMDAwMDEwTAkvKiByZWNlaXZlIHBhdGggKi8KKyNkZWZpbmUgU0tfREJHQ0FUX0lSUQkweDAwMDAwMDIwTAkvKiBnZW5lcmFsIElSUSBoYW5kbGluZyAqLworI2RlZmluZSBTS19EQkdDQVRfUVVFVUUJMHgwMDAwMDA0MEwJLyogYW55IHF1ZXVlIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgU0tfREJHQ0FUX0RVTVAJMHgwMDAwMDA4MEwJLyogbGFyZ2UgZGF0YSBvdXRwdXQgZS5nLiBoZXggZHVtcCAqLworI2RlZmluZSBTS19EQkdDQVRfRkFUQUwJMHgwMDAwMDEwMEwJLyogZmF0YWwgZXJyb3IgKi8KKworI2VuZGlmCS8qIF9fSU5DX1NLREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZHJ2MXN0LmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tkcnYxc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDg0NDBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZHJ2MXN0LmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2RydjFzdC5oCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuNCAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMS8xMiAxNDoyODoxNCAkCisgKiBQdXJwb3NlOglGaXJzdCBoZWFkZXIgZmlsZSBmb3IgZHJpdmVyIGFuZCBhbGwgb3RoZXIgbW9kdWxlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBUaGlzIGlzIHRoZSBmaXJzdCBpbmNsdWRlIGZpbGUgb2YgdGhlIGRyaXZlciwgd2hpY2ggaW5jbHVkZXMgYWxsCisgKiBuZWNjZXNzYXJ5IHN5c3RlbSBoZWFkZXIgZmlsZXMgYW5kIHNvbWUgb2YgdGhlIEdFbmVzaXMgaGVhZGVyIGZpbGVzLgorICogSXQgYWxzbyBkZWZpbmVzIHNvbWUgYmFzaWMgaXRlbXMuCisgKgorICogSW5jbHVkZSBGaWxlIEhpZXJhcmNoeToKKyAqCisgKglzZWUgc2tnZS5jCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0lOQ19TS0RSVjFTVF9ICisjZGVmaW5lIF9fSU5DX1NLRFJWMVNUX0gKKworLyogQ2hlY2sga2VybmVsIHZlcnNpb24gKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKK3R5cGVkZWYgc3RydWN0IHNfQUMJU0tfQUM7CisKKy8qIFNldCBjYXJkIHZlcnNpb25zICovCisjZGVmaW5lIFNLX0ZBUgorCisvKiBvdmVycmlkZSBzb21lIGRlZmF1bHQgZnVuY3Rpb25zIHdpdGggb3B0aW1pemVkIGxpbnV4IGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIFNLX1BOTUlfU1RPUkVfVTE2KHAsdikJCW1lbWNweSgoY2hhciopKHApLChjaGFyKikmKHYpLDIpCisjZGVmaW5lIFNLX1BOTUlfU1RPUkVfVTMyKHAsdikJCW1lbWNweSgoY2hhciopKHApLChjaGFyKikmKHYpLDQpCisjZGVmaW5lIFNLX1BOTUlfU1RPUkVfVTY0KHAsdikJCW1lbWNweSgoY2hhciopKHApLChjaGFyKikmKHYpLDgpCisjZGVmaW5lIFNLX1BOTUlfUkVBRF9VMTYocCx2KQkJbWVtY3B5KChjaGFyKikmKHYpLChjaGFyKikocCksMikKKyNkZWZpbmUgU0tfUE5NSV9SRUFEX1UzMihwLHYpCQltZW1jcHkoKGNoYXIqKSYodiksKGNoYXIqKShwKSw0KQorI2RlZmluZSBTS19QTk1JX1JFQURfVTY0KHAsdikJCW1lbWNweSgoY2hhciopJih2KSwoY2hhciopKHApLDgpCisKKyNkZWZpbmUgU0tfQUREUl9FUVVBTChhMSxhMikJCSghbWVtY21wKGExLGEyLDYpKQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2RlZmluZSBTS19DU19DQUxDVUxBVEVfQ0hFQ0tTVU0KKyNpZm5kZWYgQ09ORklHX1g4Nl82NAorI2RlZmluZSBTa0NzQ2FsY3VsYXRlQ2hlY2tzdW0ocCxsKQkoKH5pcF9jb21wdXRlX2NzdW0ocCwgbCkpICYgMHhmZmZmKQorI2Vsc2UKKyNkZWZpbmUgU2tDc0NhbGN1bGF0ZUNoZWNrc3VtKHAsbCkJKCh+aXBfZmFzdF9jc3VtKHAsIGwpKSAmIDB4ZmZmZikKKyNlbmRpZgorCisjaW5jbHVkZQkiaC9za3R5cGVzLmgiCisjaW5jbHVkZQkiaC9za2Vycm9yLmgiCisjaW5jbHVkZQkiaC9za2RlYnVnLmgiCisjaW5jbHVkZQkiaC9sbTgwLmgiCisjaW5jbHVkZQkiaC94bWFjX2lpLmgiCisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgU0tfTElUVExFX0VORElBTgorI2Vsc2UKKyNkZWZpbmUgU0tfQklHX0VORElBTgorI2VuZGlmCisKKyNkZWZpbmUgU0tfTkVUX0RFVklDRQluZXRfZGV2aWNlCisKKworLyogd2UgdXNlIGdldGhydGltZSgpLCByZXR1cm4gdW5pdDogbmFub3NlY29uZHMgKi8KKyNkZWZpbmUgU0tfVElDS1NfUEVSX1NFQwkxMDAKKworI2RlZmluZQlTS19NRU1fTUFQUEVEX0lPCisKKy8vICNkZWZpbmUgU0tfUkxNVF9TTE9XX0xPT0tBSEVBRAorCisjZGVmaW5lIFNLX01BWF9NQUNTCQkyCisjZGVmaW5lIFNLX01BWF9ORVRTCQkyCisKKyNkZWZpbmUgU0tfSU9DCQkJY2hhciBfX2lvbWVtICoKKwordHlwZWRlZiBzdHJ1Y3Qgc19EcnZSbG10TWJ1ZiBTS19NQlVGOworCisjZGVmaW5lCVNLX0NPTlNUNjQJSU5UNjRfQworI2RlZmluZQlTS19DT05TVFU2NAlVSU5UNjRfQworCisjZGVmaW5lIFNLX01FTUNQWShkZXN0LHNyYyxzaXplKQltZW1jcHkoZGVzdCxzcmMsc2l6ZSkKKyNkZWZpbmUgU0tfTUVNQ01QKHMxLHMyLHNpemUpCQltZW1jbXAoczEsczIsc2l6ZSkKKyNkZWZpbmUgU0tfTUVNU0VUKGRlc3QsdmFsLHNpemUpCW1lbXNldChkZXN0LHZhbCxzaXplKQorI2RlZmluZSBTS19TVFJMRU4ocFN0cikJCQlzdHJsZW4oKGNoYXIqKShwU3RyKSkKKyNkZWZpbmUgU0tfU1RSTkNQWShwRGVzdCxwU3JjLHNpemUpCXN0cm5jcHkoKGNoYXIqKShwRGVzdCksKGNoYXIqKShwU3JjKSxzaXplKQorI2RlZmluZSBTS19TVFJDTVAocFN0cjEscFN0cjIpCQlzdHJjbXAoKGNoYXIqKShwU3RyMSksKGNoYXIqKShwU3RyMikpCisKKy8qIG1hY3JvcyB0byBhY2Nlc3MgdGhlIGFkYXB0ZXIgKi8KKyNkZWZpbmUgU0tfT1VUOChiLGEsdikJCXdyaXRlYigodiksICgoYikrKGEpKSkJCisjZGVmaW5lIFNLX09VVDE2KGIsYSx2KQkJd3JpdGV3KCh2KSwgKChiKSsoYSkpKQkKKyNkZWZpbmUgU0tfT1VUMzIoYixhLHYpCQl3cml0ZWwoKHYpLCAoKGIpKyhhKSkpCQorI2RlZmluZSBTS19JTjgoYixhLHB2KQkJKCoocHYpID0gcmVhZGIoKGIpKyhhKSkpCisjZGVmaW5lIFNLX0lOMTYoYixhLHB2KQkJKCoocHYpID0gcmVhZHcoKGIpKyhhKSkpCisjZGVmaW5lIFNLX0lOMzIoYixhLHB2KQkJKCoocHYpID0gcmVhZGwoKGIpKyhhKSkpCisKKyNkZWZpbmUgaW50OF90CQljaGFyCisjZGVmaW5lIGludDE2X3QJCXNob3J0CisjZGVmaW5lIGludDMyX3QJCWxvbmcKKyNkZWZpbmUgaW50NjRfdAkJbG9uZyBsb25nCisjZGVmaW5lIHVpbnQ4X3QJCXVfY2hhcgorI2RlZmluZSB1aW50MTZfdAl1X3Nob3J0CisjZGVmaW5lIHVpbnQzMl90CXVfbG9uZworI2RlZmluZSB1aW50NjRfdAl1bnNpZ25lZCBsb25nIGxvbmcKKyNkZWZpbmUgdF9zY2FsYXJfdAlpbnQKKyNkZWZpbmUgdF91c2NhbGFyX3QJdW5zaWduZWQgaW50CisjZGVmaW5lIHVpbnRwdHJfdAl1bnNpZ25lZCBsb25nCisKKyNkZWZpbmUgX19DT05DQVRfXyhBLEIpIEEjI0IKKworI2RlZmluZSBJTlQzMl9DKGEpCQlfX0NPTkNBVF9fKGEsTCkKKyNkZWZpbmUgSU5UNjRfQyhhKQkJX19DT05DQVRfXyhhLExMKQorI2RlZmluZSBVSU5UMzJfQyhhKQkJX19DT05DQVRfXyhhLFVMKQorI2RlZmluZSBVSU5UNjRfQyhhKQkJX19DT05DQVRfXyhhLFVMTCkKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIFNLX0RCR19QUklOVEYJCXByaW50aworI2lmbmRlZiBTS19ERUJVR19DSEtNT0QKKyNkZWZpbmUgU0tfREVCVUdfQ0hLTU9ECQkwCisjZW5kaWYKKyNpZm5kZWYgU0tfREVCVUdfQ0hLQ0FUCisjZGVmaW5lIFNLX0RFQlVHX0NIS0NBVAkJMAorI2VuZGlmCisvKiB0aG9zZSBjb21lIGZyb20gdGhlIG1ha2VmaWxlICovCisjZGVmaW5lIFNLX0RCR19DSEtNT0QocEFDKQkoU0tfREVCVUdfQ0hLTU9EKQorI2RlZmluZSBTS19EQkdfQ0hLQ0FUKHBBQykJKFNLX0RFQlVHX0NIS0NBVCkKKworZXh0ZXJuIHZvaWQgU2tEYmdQcmludGYoY29uc3QgY2hhciAqZm9ybWF0LC4uLik7CisKKyNkZWZpbmUgU0tfREJHTU9EX0RSVgkJCTB4MDAwMTAwMDAKKworLyoqKiogcG9zc2libGUgZHJpdmVyIGRlYnVnIGNhdGVnb3JpZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfRU5UUlkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgU0tfREJHQ0FUX0RSVl9TQVAJCTB4MDAwMjAwMDAKKyNkZWZpbmUgU0tfREJHQ0FUX0RSVl9NQ0EJCTB4MDAwNDAwMDAKKyNkZWZpbmUgU0tfREJHQ0FUX0RSVl9UWF9QUk9HUkVTUwkweDAwMDgwMDAwCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfUlhfUFJPR1JFU1MJMHgwMDEwMDAwMAorI2RlZmluZSBTS19EQkdDQVRfRFJWX1BST0dSRVNTCQkweDAwMjAwMDAwCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfTVNHCQkweDAwNDAwMDAwCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfUFJPTQkJMHgwMDgwMDAwMAorI2RlZmluZSBTS19EQkdDQVRfRFJWX1RYX0ZSQU1FCQkweDAxMDAwMDAwCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfRVJST1IJCTB4MDIwMDAwMDAKKyNkZWZpbmUgU0tfREJHQ0FUX0RSVl9JTlRfU1JDCQkweDA0MDAwMDAwCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfRVZFTlQJCTB4MDgwMDAwMDAKKworI2VuZGlmCisKKyNkZWZpbmUgU0tfRVJSX0xPRwkJU2tFcnJvckxvZworCitleHRlcm4gdm9pZCBTa0Vycm9yTG9nKFNLX0FDKiwgaW50LCBpbnQsIGNoYXIqKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RydjJuZC5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZHJ2Mm5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyY2VjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RydjJuZC5oCkBAIC0wLDAgKzEsNDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tkcnYybmQuaAorICogUHJvamVjdDoJR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjEwICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzEyLzExIDE2OjA0OjQ1ICQKKyAqIFB1cnBvc2U6CVNlY29uZCBoZWFkZXIgZmlsZSBmb3IgZHJpdmVyIGFuZCBhbGwgb3RoZXIgbW9kdWxlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBUaGlzIGlzIHRoZSBzZWNvbmQgaW5jbHVkZSBmaWxlIG9mIHRoZSBkcml2ZXIsIHdoaWNoIGluY2x1ZGVzIGFsbCBvdGhlcgorICogbmVjY2Vzc2FyeSBmaWxlcyBhbmQgZGVmaW5lcyBhbGwgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzIHVzZWQgYnkgdGhlCisgKiBkcml2ZXIgYW5kIHRoZSBjb21tb24gbW9kdWxlcy4KKyAqCisgKiBJbmNsdWRlIEZpbGUgSGllcmFyY2h5OgorICoKKyAqCXNlZSBza2dlLmMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX1NLRFJWMk5EX0gKKyNkZWZpbmUgX19JTkNfU0tEUlYyTkRfSAorCisjaW5jbHVkZSAiaC9za3F1ZXVlLmgiCisjaW5jbHVkZSAiaC9za2dlaHd0LmgiCisjaW5jbHVkZSAiaC9za3RpbWVyLmgiCisjaW5jbHVkZSAiaC9za2kyYy5oIgorI2luY2x1ZGUgImgvc2tnZXBubWkuaCIKKyNpbmNsdWRlICJoL3NrdnBkLmgiCisjaW5jbHVkZSAiaC9za2dlaHcuaCIKKyNpbmNsdWRlICJoL3NrZ2Vpbml0LmgiCisjaW5jbHVkZSAiaC9za2FkZHIuaCIKKyNpbmNsdWRlICJoL3NrZ2VzaXJxLmgiCisjaW5jbHVkZSAiaC9za2NzdW0uaCIKKyNpbmNsdWRlICJoL3NrcmxtdC5oIgorI2luY2x1ZGUgImgvc2tnZWRydi5oIgorCisKK2V4dGVybiBTS19NQlVGCQkqU2tEcnZBbGxvY1JsbXRNYnVmKFNLX0FDKiwgU0tfSU9DLCB1bnNpZ25lZCk7CitleHRlcm4gdm9pZAkJU2tEcnZGcmVlUmxtdE1idWYoU0tfQUMqLCBTS19JT0MsIFNLX01CVUYqKTsKK2V4dGVybiBTS19VNjQJCVNrT3NHZXRUaW1lKFNLX0FDKik7CitleHRlcm4gaW50CQlTa1BjaVJlYWRDZmdEV29yZChTS19BQyosIGludCwgU0tfVTMyKik7CitleHRlcm4gaW50CQlTa1BjaVJlYWRDZmdXb3JkKFNLX0FDKiwgaW50LCBTS19VMTYqKTsKK2V4dGVybiBpbnQJCVNrUGNpUmVhZENmZ0J5dGUoU0tfQUMqLCBpbnQsIFNLX1U4Kik7CitleHRlcm4gaW50CQlTa1BjaVdyaXRlQ2ZnRFdvcmQoU0tfQUMqLCBpbnQsIFNLX1UzMik7CitleHRlcm4gaW50CQlTa1BjaVdyaXRlQ2ZnV29yZChTS19BQyosIGludCwgU0tfVTE2KTsKK2V4dGVybiBpbnQJCVNrUGNpV3JpdGVDZmdCeXRlKFNLX0FDKiwgaW50LCBTS19VOCk7CitleHRlcm4gaW50CQlTa0RydkV2ZW50KFNLX0FDKiwgU0tfSU9DIElvQywgU0tfVTMyLCBTS19FVlBBUkEpOworCisjaWZkZWYgU0tfRElBR19TVVBQT1JUCitleHRlcm4gaW50CQlTa0RydkVudGVyRGlhZ01vZGUoU0tfQUMgKnBBYyk7CitleHRlcm4gaW50CQlTa0RydkxlYXZlRGlhZ01vZGUoU0tfQUMgKnBBYyk7CisjZW5kaWYKKworc3RydWN0IHNfRHJ2UmxtdE1idWYgeworCVNLX01CVUYJCSpwTmV4dDsJCS8qIFBvaW50ZXIgdG8gbmV4dCBSTE1UIE1idWYuICovCisJU0tfVTgJCSpwRGF0YTsJCS8qIERhdGEgYnVmZmVyICh2aXJ0dWFsbHkgY29udGlnLikuICovCisJdW5zaWduZWQJU2l6ZTsJCS8qIERhdGEgYnVmZmVyIHNpemUuICovCisJdW5zaWduZWQJTGVuZ3RoOwkJLyogTGVuZ3RoIG9mIHBhY2tldCAoPD0gU2l6ZSkuICovCisJU0tfVTMyCQlQb3J0SWR4OwkvKiBSZWNlaXZpbmcvdHJhbnNtaXR0aW5nIHBvcnQuICovCisjaWZkZWYgU0tfUkxNVF9NQlVGX1BSSVZBVEUKKwlTS19STE1UX01CVUYJUmxtdDsJCS8qIFByaXZhdGUgcGFydCBmb3IgUkxNVC4gKi8KKyNlbmRpZiAgLyogU0tfUkxNVF9NQlVGX1BSSVZBVEUgKi8KKwlzdHJ1Y3Qgc2tfYnVmZgkqcE9zOwkJLyogUG9pbnRlciB0byBtZXNzYWdlIGJsb2NrICovCit9OworCisKKy8qCisgKiBUaW1lIG1hY3JvcworICovCisjaWYgU0tfVElDS1NfUEVSX1NFQyA9PSAxMDAKKyNkZWZpbmUgU0tfUE5NSV9IVU5EUkVEU19TRUModCkJKHQpCisjZWxzZQorI2RlZmluZSBTS19QTk1JX0hVTkRSRURTX1NFQyh0KQkoKCgodW5zaWduZWQgbG9uZyl0KSAqIDEwMCkgLyBcCisJCQkJCQkJCQkJKFNLX1RJQ0tTX1BFUl9TRUMpKQorI2VuZGlmCisKKy8qCisgKiBOZXcgU2tPc0dldFRpbWUKKyAqLworI2RlZmluZSBTa09zR2V0VGltZUN1cnJlbnQocEFDLCBwVXNlYykge1wKKwlzdHJ1Y3QgdGltZXZhbCB0O1wKKwlkb19nZXR0aW1lb2ZkYXkoJnQpO1wKKwkqcFVzZWMgPSAoKCgodC50dl9zZWMpICogMTAwMDAwMEwpK3QudHZfdXNlYykvMTAwMDApO1wKK30KKworCisvKgorICogaW9jdGwgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZQkJU0tfSU9DVExfQkFTRQkJKFNJT0NERVZQUklWQVRFKQorI2RlZmluZQkJU0tfSU9DVExfR0VUTUlCCQkoU0tfSU9DVExfQkFTRSArIDApCisjZGVmaW5lCQlTS19JT0NUTF9TRVRNSUIJCShTS19JT0NUTF9CQVNFICsgMSkKKyNkZWZpbmUJCVNLX0lPQ1RMX1BSRVNFVE1JQgkoU0tfSU9DVExfQkFTRSArIDIpCisjZGVmaW5lCQlTS19JT0NUTF9HRU4JCShTS19JT0NUTF9CQVNFICsgMykKKyNkZWZpbmUJCVNLX0lPQ1RMX0RJQUcJCShTS19JT0NUTF9CQVNFICsgNCkKKwordHlwZWRlZiBzdHJ1Y3Qgc19JT0NUTAlTS19HRV9JT0NUTDsKKworc3RydWN0IHNfSU9DVEwgeworCWNoYXIgX191c2VyICoJcERhdGE7CisJdW5zaWduZWQgaW50CUxlbjsKK307CisKKworLyoKKyAqIGRlZmluZSBzaXplcyBvZiBkZXNjcmlwdG9yIHJpbmdzIGluIGJ5dGVzCisgKi8KKworI2RlZmluZQkJVFhfUklOR19TSVpFCSg4KjEwMjQpCisjZGVmaW5lCQlSWF9SSU5HX1NJWkUJKDI0KjEwMjQpCisKKy8qCisgKiBCdWZmZXIgc2l6ZSBmb3IgZXRoZXJuZXQgcGFja2V0cworICovCisjZGVmaW5lCUVUSF9CVUZfU0laRQkxNTQwCisjZGVmaW5lCUVUSF9NQVhfTVRVCTE1MTQKKyNkZWZpbmUgRVRIX01JTl9NVFUJNjAKKyNkZWZpbmUgRVRIX01VTFRJQ0FTVF9CSVQJMHgwMQorI2RlZmluZSBTS19KVU1CT19NVFUJOTAwMAorCisvKgorICogdHJhbnNtaXQgcHJpb3JpdHkgc2VsZWN0cyB0aGUgcXVldWU6IExPVz1hc3luY2hyb24sIEhJR0g9c3luY2hyb24KKyAqLworI2RlZmluZSBUWF9QUklPX0xPVwkwCisjZGVmaW5lIFRYX1BSSU9fSElHSAkxCisKKy8qCisgKiBhbGlnbm1lbnQgb2YgcngvdHggZGVzY3JpcHRvcnMKKyAqLworI2RlZmluZSBERVNDUl9BTElHTgk2NAorCisvKgorICogZGVmaW5pdGlvbnMgZm9yIHBubWkuIFRPRE8KKyAqLworI2RlZmluZSBTS19EUklWRVJfUkVTRVQocEFDLCBJb0MpCTAKKyNkZWZpbmUgU0tfRFJJVkVSX1NFTkRFVkVOVChwQUMsIElvQykJMAorI2RlZmluZSBTS19EUklWRVJfU0VMRlRFU1QocEFDLCBJb0MpCTAKKy8qIEZvciBnZXQgbXR1IHlvdSBtdXN0IGFkZCBhbiBvd24gZnVuY3Rpb24gKi8KKyNkZWZpbmUgU0tfRFJJVkVSX0dFVF9NVFUocEFjLElvQyxpKQkwCisjZGVmaW5lIFNLX0RSSVZFUl9TRVRfTVRVKHBBYyxJb0MsaSx2KQkwCisjZGVmaW5lIFNLX0RSSVZFUl9QUkVTRVRfTVRVKHBBYyxJb0MsaSx2KQkwCisKKy8qCisqKiBJbnRlcmltIGRlZmluaXRpb24gb2YgU0tfRFJWX1RJTUVSIHBsYWNlZCBpbiB0aGlzIGZpbGUgdW50aWwgCisqKiBjb21tb24gbW9kdWxlcyBoYXZlIGJvb24gZmluYWxsaXplZAorKi8KKyNkZWZpbmUgU0tfRFJWX1RJTUVSCQkJMTEgCisjZGVmaW5lCVNLX0RSVl9NT0RFUkFUSU9OX1RJTUVSCQkxCisjZGVmaW5lIFNLX0RSVl9NT0RFUkFUSU9OX1RJTUVSX0xFTkdUSCAgMTAwMDAwMCAgLyogMSBzZWNvbmQgKi8KKyNkZWZpbmUgU0tfRFJWX1JYX0NMRUFOVVBfVElNRVIJCTIKKyNkZWZpbmUgU0tfRFJWX1JYX0NMRUFOVVBfVElNRVJfTEVOR1RICTEwMDAwMDAJIC8qIDEwMCBtaWxsaXNlY3MgKi8KKworLyoKKyoqIERlZmluaXRpb25zIHJlZ2FyZGluZyB0cmFuc21pdHRpbmcgZnJhbWVzIAorKiogYW55IGNhbGN1bGF0aW5nIGFueSBjaGVja3N1bS4KKyovCisjZGVmaW5lIENfTEVOX0VUSEVSTUFDX0hFQURFUl9ERVNUX0FERFIgNgorI2RlZmluZSBDX0xFTl9FVEhFUk1BQ19IRUFERVJfU1JDX0FERFIgIDYKKyNkZWZpbmUgQ19MRU5fRVRIRVJNQUNfSEVBREVSX0xFTlRZUEUgICAyCisjZGVmaW5lIENfTEVOX0VUSEVSTUFDX0hFQURFUiAgICAgICAgICAgKCAoQ19MRU5fRVRIRVJNQUNfSEVBREVSX0RFU1RfQUREUikgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ19MRU5fRVRIRVJNQUNfSEVBREVSX1NSQ19BRERSKSAgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ19MRU5fRVRIRVJNQUNfSEVBREVSX0xFTlRZUEUpICkKKworI2RlZmluZSBDX0xFTl9FVEhFUk1UVV9NSU5TSVpFICAgICAgICAgIDQ2CisjZGVmaW5lIENfTEVOX0VUSEVSTVRVX01BWFNJWkVfU1REICAgICAgMTUwMAorI2RlZmluZSBDX0xFTl9FVEhFUk1UVV9NQVhTSVpFX0pVTUJPICAgIDkwMDAKKworI2RlZmluZSBDX0xFTl9FVEhFUk5FVF9NSU5TSVpFICAgICAgICAgICggKENfTEVOX0VUSEVSTUFDX0hFQURFUikgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ19MRU5fRVRIRVJNVFVfTUlOU0laRSkgKQorCisjZGVmaW5lIENfT0ZGU0VUX0lQSEVBREVSICAgICAgICAgICAgICAgQ19MRU5fRVRIRVJNQUNfSEVBREVSCisjZGVmaW5lIENfT0ZGU0VUX0lQSEVBREVSX0lQUFJPVE8gICAgICAgOQorI2RlZmluZSBDX09GRlNFVF9UQ1BIRUFERVJfVENQQ1MgICAgICAgIDE2CisjZGVmaW5lIENfT0ZGU0VUX1VEUEhFQURFUl9VRFBDUyAgICAgICAgNgorCisjZGVmaW5lIENfT0ZGU0VUX0lQUFJPVE8gICAgICAgICAgICAgICAgKCAoQ19MRU5fRVRIRVJNQUNfSEVBREVSKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDX09GRlNFVF9JUEhFQURFUl9JUFBST1RPKSApCisKKyNkZWZpbmUgQ19QUk9UT19JRF9VRFAgICAgICAgICAgICAgICAgICAxNyAgICAgICAvKiByZWZlciB0byBSRkMgNzkwIG9yIFN0ZXZlbnMnICAgKi8KKyNkZWZpbmUgQ19QUk9UT19JRF9UQ1AgICAgICAgICAgICAgICAgICA2ICAgICAgICAvKiBUQ1AvSVAgaWxsdXN0cmF0ZWQgZm9yIGRldGFpbHMgKi8KKworLyogVFggYW5kIFJYIGRlc2NyaXB0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBzX1J4RCBSWEQ7IC8qIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgKi8KKworc3RydWN0IHNfUnhEIHsKKwl2b2xhdGlsZSBTS19VMzIJUkJDb250cm9sOwkvKiBSZWNlaXZlIEJ1ZmZlciBDb250cm9sICovCisJU0tfVTMyCQlWTmV4dFJ4ZDsJLyogTmV4dCByZWNlaXZlIGRlc2NyaXB0b3IsbG93IGR3b3JkICovCisJU0tfVTMyCQlWRGF0YUxvdzsJLyogUmVjZWl2ZSBidWZmZXIgQWRkciwgbG93IGR3b3JkICovCisJU0tfVTMyCQlWRGF0YUhpZ2g7CS8qIFJlY2VpdmUgYnVmZmVyIEFkZHIsIGhpZ2ggZHdvcmQgKi8KKwlTS19VMzIJCUZyYW1lU3RhdDsJLyogUmVjZWl2ZSBGcmFtZSBTdGF0dXMgd29yZCAqLworCVNLX1UzMgkJVGltZVN0YW1wOwkvKiBUaW1lIHN0YW1wIGZyb20gWE1BQyAqLworCVNLX1UzMgkJVGNwU3VtczsJLyogVENQIFN1bSAyIC8gVENQIFN1bSAxICovCisJU0tfVTMyCQlUY3BTdW1TdGFydHM7CS8qIFRDUCBTdW0gU3RhcnQgMiAvIFRDUCBTdW0gU3RhcnQgMSAqLworCVJYRAkJKnBOZXh0UnhkOwkvKiBQb2ludGVyIHRvIG5leHQgUnhkICovCisJc3RydWN0IHNrX2J1ZmYJKnBNQnVmOwkJLyogUG9pbnRlciB0byBMaW51eCcgc29ja2V0IGJ1ZmZlciAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc19UeEQgVFhEOyAvKiB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciAqLworCitzdHJ1Y3Qgc19UeEQgeworCXZvbGF0aWxlIFNLX1UzMglUQkNvbnRyb2w7CS8qIFRyYW5zbWl0IEJ1ZmZlciBDb250cm9sICovCisJU0tfVTMyCQlWTmV4dFR4ZDsJLyogTmV4dCB0cmFuc21pdCBkZXNjcmlwdG9yLGxvdyBkd29yZCAqLworCVNLX1UzMgkJVkRhdGFMb3c7CS8qIFRyYW5zbWl0IEJ1ZmZlciBBZGRyLCBsb3cgZHdvcmQgKi8KKwlTS19VMzIJCVZEYXRhSGlnaDsJLyogVHJhbnNtaXQgQnVmZmVyIEFkZHIsIGhpZ2ggZHdvcmQgKi8KKwlTS19VMzIJCUZyYW1lU3RhdDsJLyogVHJhbnNtaXQgRnJhbWUgU3RhdHVzIFdvcmQgKi8KKwlTS19VMzIJCVRjcFN1bU9mczsJLyogUmVzZXJ2ZWQgLyBUQ1AgU3VtIE9mZnNldCAqLworCVNLX1UxNgkJVGNwU3VtU3Q7CS8qIFRDUCBTdW0gU3RhcnQgKi8KKwlTS19VMTYJCVRjcFN1bVdyOwkvKiBUQ1AgU3VtIFdyaXRlICovCisJU0tfVTMyCQlUY3BSZXNlcnZlZDsJLyogbm90IHVzZWQgKi8KKwlUWEQJCSpwTmV4dFR4ZDsJLyogUG9pbnRlciB0byBuZXh0IFR4ZCAqLworCXN0cnVjdCBza19idWZmCSpwTUJ1ZjsJCS8qIFBvaW50ZXIgdG8gTGludXgnIHNvY2tldCBidWZmZXIgKi8KK307CisKKy8qIFVzZWQgaW50ZXJydXB0IGJpdHMgaW4gdGhlIGludGVycnVwdHMgc291cmNlIHJlZ2lzdGVyICoqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBEUklWRVJfSVJRUwkoKElTX0lSUV9TVykgICB8IFwKKwkJCShJU19SMV9GKSAgICAgIHwoSVNfUjJfRikgIHwgXAorCQkJKElTX1hTMV9GKSAgICAgfChJU19YQTFfRikgfCBcCisJCQkoSVNfWFMyX0YpICAgICB8KElTX1hBMl9GKSkKKworI2RlZmluZSBTUEVDSUFMX0lSUVMJKChJU19IV19FUlIpICAgfChJU19JMkNfUkVBRFkpICB8IFwKKwkJCShJU19FWFRfUkVHKSAgIHwoSVNfVElNSU5UKSAgICAgfCBcCisJCQkoSVNfUEFfVE9fUlgxKSB8KElTX1BBX1RPX1JYMikgIHwgXAorCQkJKElTX1BBX1RPX1RYMSkgfChJU19QQV9UT19UWDIpICB8IFwKKwkJCShJU19NQUMxKSAgICAgIHwoSVNfTE5LX1NZTkNfTTEpfCBcCisJCQkoSVNfTUFDMikgICAgICB8KElTX0xOS19TWU5DX00yKXwgXAorCQkJKElTX1IxX0MpICAgICAgfChJU19SMl9DKSAgICAgICB8IFwKKwkJCShJU19YUzFfQykgICAgIHwoSVNfWEExX0MpICAgICAgfCBcCisJCQkoSVNfWFMyX0MpICAgICB8KElTX1hBMl9DKSkKKworI2RlZmluZSBJUlFfTUFTSwkoKElTX0lSUV9TVykgICB8IFwKKwkJCShJU19SMV9CKSAgICAgIHwoSVNfUjFfRikgICAgIHwoSVNfUjJfQikgfChJU19SMl9GKSB8IFwKKwkJCShJU19YUzFfQikgICAgIHwoSVNfWFMxX0YpICAgIHwoSVNfWEExX0IpfChJU19YQTFfRil8IFwKKwkJCShJU19YUzJfQikgICAgIHwoSVNfWFMyX0YpICAgIHwoSVNfWEEyX0IpfChJU19YQTJfRil8IFwKKwkJCShJU19IV19FUlIpICAgIHwoSVNfSTJDX1JFQURZKXwgXAorCQkJKElTX0VYVF9SRUcpICAgfChJU19USU1JTlQpICAgfCBcCisJCQkoSVNfUEFfVE9fUlgxKSB8KElTX1BBX1RPX1JYMil8IFwKKwkJCShJU19QQV9UT19UWDEpIHwoSVNfUEFfVE9fVFgyKXwgXAorCQkJKElTX01BQzEpICAgICAgfChJU19NQUMyKSAgICAgfCBcCisJCQkoSVNfUjFfQykgICAgICB8KElTX1IyX0MpICAgICB8IFwKKwkJCShJU19YUzFfQykgICAgIHwoSVNfWEExX0MpICAgIHwgXAorCQkJKElTX1hTMl9DKSAgICAgfChJU19YQTJfQykpCisKKyNkZWZpbmUgSVJRX0hXRV9NQVNLCShJU19FUlJfTVNLKSAvKiBlbmFibGUgYWxsIEhXIGlycXMgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc19EZXZOZXQgREVWX05FVDsKKworc3RydWN0IHNfRGV2TmV0IHsKKwlpbnQgICAgICAgICAgICAgUG9ydE5yOworCWludCAgICAgICAgICAgICBOZXROcjsKKwlpbnQgICAgICAgICAgICAgTXR1OworCWludCAgICAgICAgICAgICBVcDsKKwlTS19BQyAgICpwQUM7Cit9OyAgCisKK3R5cGVkZWYgc3RydWN0IHNfVHhQb3J0CQlUWF9QT1JUOworCitzdHJ1Y3Qgc19UeFBvcnQgeworCS8qIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmdzICovCisJY2FkZHJfdAkJcFR4RGVzY3JSaW5nOwkvKiBkZXNjcmlwdG9yIGFyZWEgbWVtb3J5ICovCisJU0tfVTY0CQlWVHhEZXNjclJpbmc7CS8qIGRlc2NyLiBhcmVhIGJ1cyB2aXJ0LiBhZGRyLiAqLworCVRYRAkJKnBUeGRSaW5nSGVhZDsJLyogSGVhZCBvZiBUeCByaW5ncyAqLworCVRYRAkJKnBUeGRSaW5nVGFpbDsJLyogVGFpbCBvZiBUeCByaW5ncyAqLworCVRYRAkJKnBUeGRSaW5nUHJldjsJLyogZGVzY3JpcHRvciBzZW50IHByZXZpb3VzbHkgKi8KKwlpbnQJCVR4ZFJpbmdGcmVlOwkvKiAjIG9mIGZyZWUgZW50cnlzICovCisJc3BpbmxvY2tfdAlUeERlc1JpbmdMb2NrOwkvKiBzZXJpYWxpemUgZGVzY3JpcHRvciBhY2Nlc3NlcyAqLworCVNLX0lPQwkJSHdBZGRyOwkJLyogYm11IHJlZ2lzdGVycyBhZGRyZXNzICovCisJaW50CQlQb3J0SW5kZXg7CS8qIGluZGV4IG51bWJlciBvZiBwb3J0ICgwIG9yIDEpICovCit9OworCit0eXBlZGVmIHN0cnVjdCBzX1J4UG9ydAkJUlhfUE9SVDsKKworc3RydWN0IHNfUnhQb3J0IHsKKwkvKiB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmdzICovCisJY2FkZHJfdAkJcFJ4RGVzY3JSaW5nOwkvKiBkZXNjcmlwdG9yIGFyZWEgbWVtb3J5ICovCisJU0tfVTY0CQlWUnhEZXNjclJpbmc7ICAgLyogZGVzY3IuIGFyZWEgYnVzIHZpcnQuIGFkZHIuICovCisJUlhECQkqcFJ4ZFJpbmdIZWFkOwkvKiBIZWFkIG9mIFJ4IHJpbmdzICovCisJUlhECQkqcFJ4ZFJpbmdUYWlsOwkvKiBUYWlsIG9mIFJ4IHJpbmdzICovCisJUlhECQkqcFJ4ZFJpbmdQcmV2OwkvKiBkZXNjcmlwdG9yIGdpdmVuIHRvIEJNVSBwcmV2aW91c2x5ICovCisJaW50CQlSeGRSaW5nRnJlZTsJLyogIyBvZiBmcmVlIGVudHJ5cyAqLworCXNwaW5sb2NrX3QJUnhEZXNSaW5nTG9jazsJLyogc2VyaWFsaXplIGRlc2NyaXB0b3IgYWNjZXNzZXMgKi8KKwlpbnQJCVJ4RmlsbExpbWl0OwkvKiBsaW1pdCBmb3IgYnVmZmVycyBpbiByaW5nICovCisJU0tfSU9DCQlId0FkZHI7CQkvKiBibXUgcmVnaXN0ZXJzIGFkZHJlc3MgKi8KKwlpbnQJCVBvcnRJbmRleDsJLyogaW5kZXggbnVtYmVyIG9mIHBvcnQgKDAgb3IgMSkgKi8KK307CisKKy8qIERlZmluaXRpb25zIG5lZWRlZCBmb3IgaW50ZXJydXB0IG1vZGVyYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJUlFfRU9GX0FTX1RYICAgICAoKElTX1hBMV9GKSAgICAgfCAoSVNfWEEyX0YpKQorI2RlZmluZSBJUlFfRU9GX1NZX1RYICAgICAoKElTX1hTMV9GKSAgICAgfCAoSVNfWFMyX0YpKQorI2RlZmluZSBJUlFfTUFTS19UWF9PTkxZICAoKElSUV9FT0ZfQVNfVFgpfCAoSVJRX0VPRl9TWV9UWCkpCisjZGVmaW5lIElSUV9NQVNLX1JYX09OTFkgICgoSVNfUjFfRikgICAgICB8IChJU19SMl9GKSkKKyNkZWZpbmUgSVJRX01BU0tfU1BfT05MWSAgKFNQRUNJQUxfSVJRUykKKyNkZWZpbmUgSVJRX01BU0tfVFhfUlggICAgKChJUlFfTUFTS19UWF9PTkxZKXwgKElSUV9NQVNLX1JYX09OTFkpKQorI2RlZmluZSBJUlFfTUFTS19TUF9SWCAgICAoKFNQRUNJQUxfSVJRUykgICAgfCAoSVJRX01BU0tfUlhfT05MWSkpCisjZGVmaW5lIElSUV9NQVNLX1NQX1RYICAgICgoU1BFQ0lBTF9JUlFTKSAgICB8IChJUlFfTUFTS19UWF9PTkxZKSkKKyNkZWZpbmUgSVJRX01BU0tfUlhfVFhfU1AgKChTUEVDSUFMX0lSUVMpICAgIHwgKElSUV9NQVNLX1RYX1JYKSkKKworI2RlZmluZSBDX0lOVF9NT0RfTk9ORSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDX0lOVF9NT0RfU1RBVElDICAgICAgICAgICAgICAgMgorI2RlZmluZSBDX0lOVF9NT0RfRFlOQU1JQyAgICAgICAgICAgICAgNAorCisjZGVmaW5lIENfQ0xLX0ZSRVFfR0VORVNJUyAgICAgIDUzMjE1MDAwIC8qIHNob3J0ZXI6IDUzLjEyNSBNSHogICovCisjZGVmaW5lIENfQ0xLX0ZSRVFfWVVLT04gICAgICAgIDc4MjE1MDAwIC8qIHNob3J0ZXI6IDc4LjEyNSBNSHogICovCisKKyNkZWZpbmUgQ19JTlRTX1BFUl9TRUNfREVGQVVMVCAgICAgIDIwMDAgCisjZGVmaW5lIENfSU5UX01PRF9FTkFCTEVfUEVSQ0VOVEFHRSAgIDUwIC8qIGlmIGhpZ2hlciA1MCUgZW5hYmxlICovCisjZGVmaW5lIENfSU5UX01PRF9ESVNBQkxFX1BFUkNFTlRBR0UgIDUwIC8qIGlmIGxvd2VyIDUwJSBkaXNhYmxlICovCisjZGVmaW5lIENfSU5UX01PRF9JUFNfTE9XRVJfUkFOR0UgICAgIDMwCisjZGVmaW5lIENfSU5UX01PRF9JUFNfVVBQRVJfUkFOR0UgICAgIDQwMDAwCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19EeW5JcnFNb2RJbmZvICBESU1fSU5GTzsKK3N0cnVjdCBzX0R5bklycU1vZEluZm8geworCXVuc2lnbmVkIGxvbmcgICBQcmV2VGltZVZhbDsKKwl1bnNpZ25lZCBpbnQgICAgUHJldlN5c0xvYWQ7CisJdW5zaWduZWQgaW50ICAgIFByZXZVc2VkVGltZTsKKwl1bnNpZ25lZCBpbnQgICAgUHJldlRvdGFsVGltZTsKKwlpbnQgICAgICAgICAgICAgUHJldlVzZWREZXNjclJhdGlvOworCWludCAgICAgICAgICAgICBOYnJQcm9jZXNzZWREZXNjcjsKKyAgICAgICAgU0tfVTY0ICAgICAgICAgIFByZXZQb3J0MFJ4SW50ckN0czsKKyAgICAgICAgU0tfVTY0ICAgICAgICAgIFByZXZQb3J0MVJ4SW50ckN0czsKKyAgICAgICAgU0tfVTY0ICAgICAgICAgIFByZXZQb3J0MFR4SW50ckN0czsKKyAgICAgICAgU0tfVTY0ICAgICAgICAgIFByZXZQb3J0MVR4SW50ckN0czsKKwlTS19CT09MICAgICAgICAgTW9kSnVzdEVuYWJsZWQ7ICAgICAvKiBNb2RlcmF0aW9uIGp1c3QgZW5hYmxlZCB5ZXMvbm8gKi8KKworCWludCAgICAgICAgICAgICBNYXhNb2RJbnRzUGVyU2VjOyAgICAgICAgICAgIC8qIE1vZGVyYXRpb24gVGhyZXNob2xkICovCisJaW50ICAgICAgICAgICAgIE1heE1vZEludHNQZXJTZWNVcHBlckxpbWl0OyAgLyogVXBwZXIgbGltaXQgZm9yIERJTSAgKi8KKwlpbnQgICAgICAgICAgICAgTWF4TW9kSW50c1BlclNlY0xvd2VyTGltaXQ7ICAvKiBMb3dlciBsaW1pdCBmb3IgRElNICAqLworCisJbG9uZyAgICAgICAgICAgIE1hc2tJcnFNb2RlcmF0aW9uOyAgIC8qIE1vZElycVR5cGUgKGVnLiAnVHhSeCcpICAgICAgKi8KKwlTS19CT09MICAgICAgICAgRGlzcGxheVN0YXRzOyAgICAgICAgLyogU3RhdHMgeWVzL25vICAgICAgICAgICAgICAgICAqLworCVNLX0JPT0wgICAgICAgICBBdXRvU2l6aW5nOyAgICAgICAgICAvKiBSZXNpemUgRElNLXRpbWVyIG9uL29mZiAgICAgICovCisJaW50ICAgICAgICAgICAgIEludE1vZFR5cGVTZWxlY3Q7ICAgIC8qIEVuYWJsZUludE1vZCAoZWcuICdkeW5hbWljJykgKi8KKworCVNLX1RJTUVSICAgICAgICBNb2RUaW1lcjsgLyoganVzdCBzb21lIHRpbWVyICovCit9OworCit0eXBlZGVmIHN0cnVjdCBzX1BlclN0cm0JUEVSX1NUUk07CisKKyNkZWZpbmUgU0tfQUxMT0NfSVJRCTB4MDAwMDAwMDEKKworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorI2RlZmluZQlESUFHX0FDVElWRQkJMQorI2RlZmluZQlESUFHX05PVEFDVElWRQkJMAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQZXIgYm9hcmQgc3RydWN0dXJlIC8gQWRhcHRlciBDb250ZXh0IHN0cnVjdHVyZToKKyAqCUFsbG9jYXRlZCB3aXRoaW4gYXR0YWNoKDllKSBhbmQgZnJlZWQgd2l0aGluIGRldGFjaCg5ZSkuCisgKglDb250YWlucyBhbGwgJ3BlciBkZXZpY2UnIG5lY2Vzc2FyeSBoYW5kbGVzLCBmbGFncywgbG9ja3MgZXRjLjoKKyAqLworc3RydWN0IHNfQUMgIHsKKwlTS19HRUlOSVQJR0luaTsJCS8qIEdFIGluaXQgc3RydWN0ICovCisJU0tfUE5NSQkJUG5taTsJCS8qIFBOTUkgZGF0YSBzdHJ1Y3QgKi8KKwlTS19WUEQJCXZwZDsJCS8qIHZwZCBkYXRhIHN0cnVjdCAqLworCVNLX1FVRVVFCUV2ZW50OwkJLyogRXZlbnQgcXVldWUgKi8KKwlTS19IV1QJCUh3dDsJCS8qIEhhcmR3YXJlIFRpbWVyIGNvbnRyb2wgc3RydWN0ICovCisJU0tfVElNQ1RSTAlUaW07CQkvKiBTb2Z0d2FyZSBUaW1lciBjb250cm9sIHN0cnVjdCAqLworCVNLX0kyQwkJSTJjOwkJLyogSTJDIHJlbGV2YW50IGRhdGEgc3RydWN0dXJlICovCisJU0tfQUREUgkJQWRkcjsJCS8qIGZvciBBZGRyZXNzIG1vZHVsZSAqLworCVNLX0NTVU0JCUNzdW07CQkvKiBmb3IgY2hlY2tzdW0gbW9kdWxlICovCisJU0tfUkxNVAkJUmxtdDsJCS8qIGZvciBybG10IG1vZHVsZSAqLworCXNwaW5sb2NrX3QJU2xvd1BhdGhMb2NrOwkvKiBOb3JtYWwgSVJRIGxvY2sgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBCbGlua1RpbWVyOwkvKiBmb3IgTEVEIGJsaW5raW5nICovCisJaW50CQlMZWRzT247CisJU0tfUE5NSV9TVFJVQ1RfREFUQSBQbm1pU3RydWN0OwkvKiBzdHJ1Y3R1cmUgdG8gZ2V0IGFsbCBQbm1pLURhdGEgKi8KKwlpbnQJCQlSbG10TW9kZTsJLyogbGluayBjaGVjayBtb2RlIHRvIHNldCAqLworCWludAkJCVJsbXROZXRzOwkvKiBOdW1iZXIgb2YgbmV0cyAqLworCQorCVNLX0lPQwkJSW9CYXNlOwkJLyogcmVnaXN0ZXIgc2V0IG9mIGFkYXB0ZXIgKi8KKwlpbnQJCUJvYXJkTGV2ZWw7CS8qIGxldmVsIG9mIGFjdGl2ZSBodyBpbml0ICgwLTIpICovCisJY2hhcgkJRGV2aWNlU3RyWzgwXTsJLyogYWRhcHRlciBzdHJpbmcgZnJvbSB2cGQgKi8KKwlTS19VMzIJCUFsbG9jRmxhZzsJLyogZmxhZyBhbGxvY2F0aW9uIG9mIHJlc291cmNlcyAqLworCXN0cnVjdCBwY2lfZGV2CSpQY2lEZXY7CS8qIGZvciBhY2Nlc3MgdG8gcGNpIGNvbmZpZyBzcGFjZSAqLworCVNLX1UzMgkJUGNpRGV2SWQ7CS8qIHBjaSBkZXZpY2UgaWQgKi8KKwlzdHJ1Y3QgU0tfTkVUX0RFVklDRQkqZGV2WzJdOwkvKiBwb2ludGVyIHRvIGRldmljZSBzdHJ1Y3QgKi8KKwljaGFyCQlOYW1lWzMwXTsJLyogZHJpdmVyIG5hbWUgKi8KKworCWludAkJUnhCdWZTaXplOwkvKiBsZW5ndGggb2YgcmVjZWl2ZSBidWZmZXJzICovCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBsaW51eCAnbmV0c3RhdCAtaScgc3RhdGlzdGljcyAqLworCWludAkJSW5kZXg7CQkvKiBpbnRlcm5hbCBib2FyZCBpbmRleCBudW1iZXIgKi8KKworCS8qIGFkYXB0ZXIgUkFNIHNpemVzIGZvciBxdWV1ZXMgb2YgYWN0aXZlIHBvcnQgKi8KKwlpbnQJCVJ4UXVldWVTaXplOwkvKiBtZW1vcnkgdXNlZCBmb3IgcmVjZWl2ZSBxdWV1ZSAqLworCWludAkJVHhTUXVldWVTaXplOwkvKiBtZW1vcnkgdXNlZCBmb3Igc3luYy4gdHggcXVldWUgKi8KKwlpbnQJCVR4QVF1ZXVlU2l6ZTsJLyogbWVtb3J5IHVzZWQgZm9yIGFzeW5jLiB0eCBxdWV1ZSAqLworCisJaW50CQlQcm9taXNjQ291bnQ7CS8qIHByb21pc2N1b3VzIG1vZGUgY291bnRlciAgKi8KKwlpbnQJCUFsbE11bHRpQ291bnQ7ICAvKiBhbGxtdWx0aWNhc3QgbW9kZSBjb3VudGVyICovCisJaW50CQlNdWx0aWNDb3VudDsJLyogbnVtYmVyIG9mIGRpZmZlcmVudCBNQyAgICAqLworCQkJCQkvKiAgYWRkcmVzc2VzIGZvciB0aGlzIGJvYXJkICovCisJCQkJCS8qICAobWF5IGJlIG1vcmUgdGhhbiBIVyBjYW4pKi8KKworCWludAkJSFdSZXZpc2lvbjsJLyogSGFyZHdhcmUgcmV2aXNpb24gKi8KKwlpbnQJCUFjdGl2ZVBvcnQ7CS8qIHRoZSBhY3RpdmUgWE1BQyBwb3J0ICovCisJaW50CQlNYXhQb3J0czsJCS8qIG51bWJlciBvZiBhY3RpdmF0ZWQgcG9ydHMgKi8KKwlpbnQJCVR4RGVzY3JQZXJSaW5nOwkvKiAjIG9mIGRlc2NyaXB0b3JzIHBlciB0eCByaW5nICovCisJaW50CQlSeERlc2NyUGVyUmluZzsJLyogIyBvZiBkZXNjcmlwdG9ycyBwZXIgcnggcmluZyAqLworCisJY2FkZHJfdAkJcERlc2NyTWVtOwkvKiBQb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIGFyZWEgKi8KKwlkbWFfYWRkcl90CXBEZXNjck1lbURNQTsJLyogUENJIERNQSBhZGRyZXNzIG9mIGFyZWEgKi8KKworCS8qIHRoZSBwb3J0IHN0cnVjdHVyZXMgd2l0aCBkZXNjcmlwdG9yIHJpbmdzICovCisJVFhfUE9SVAkJVHhQb3J0W1NLX01BWF9NQUNTXVsyXTsKKwlSWF9QT1JUCQlSeFBvcnRbU0tfTUFYX01BQ1NdOworCisJdW5zaWduZWQgaW50CUNzT2ZzMTsJCS8qIGZvciBjaGVja3N1bSBjYWxjdWxhdGlvbiAqLworCXVuc2lnbmVkIGludAlDc09mczI7CQkvKiBmb3IgY2hlY2tzdW0gY2FsY3VsYXRpb24gKi8KKwlTS19VMzIJCUNzT2ZzOwkJLyogZm9yIGNoZWNrc3VtIGNhbGN1bGF0aW9uICovCisKKwlTS19CT09MCQlDaGVja1F1ZXVlOwkvKiBjaGVjayBldmVudCBxdWV1ZSBzb29uICovCisJU0tfVElNRVIgICAgICAgIERydkNsZWFudXBUaW1lcjsvKiB0byBjaGVjayBmb3IgcGVuZGluZyBkZXNjcmlwdG9ycyAqLworCURJTV9JTkZPICAgICAgICBEeW5JcnFNb2RJbmZvOyAgLyogYWxsIGRhdGEgcmVsYXRlZCB0byBESU0gKi8KKworCS8qIE9ubHkgZm9yIHRlc3RzICovCisJaW50CQlQb3J0VXA7CisJaW50CQlQb3J0RG93bjsKKwlpbnQJCUNoaXBzZXRUeXBlOwkvKiAgQ2hpcHNldCBmYW1pbHkgdHlwZSAKKwkJCQkJICogIDAgPT0gR2VuZXNpcyBmYW1pbHkgc3VwcG9ydAorCQkJCQkgKiAgMSA9PSBZdWtvbiBmYW1pbHkgc3VwcG9ydAorCQkJCQkgKi8KKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKwlTS19VMzIJCURpYWdNb2RlQWN0aXZlOwkJLyogaXMgZGlhZyBhY3RpdmU/CSovCisJU0tfQk9PTAkJRGlhZ0Zsb3dDdHJsOwkJLyogZm9yIGNvbnRyb2wgcHVycG9zZXMJKi8KKwlTS19QTk1JX1NUUlVDVF9EQVRBIFBubWlCYWNrdXA7CQkvKiBiYWNrdXAgc3RydWN0dXJlIGZvciBhbGwgUG5taS1EYXRhICovCisJU0tfQk9PTCAgICAgICAgIFdhc0lmVXBbU0tfTUFYX01BQ1NdOyAgIC8qIGZvciBPcGVuQ2xvc2Ugd2hpbGUgCisJCQkJCQkgKiBESUFHIGlzIGJ1c3kgd2l0aCBOSUMgCisJCQkJCQkgKi8KKyNlbmRpZgorCit9OworCisKKyNlbmRpZiAvKiBfX0lOQ19TS0RSVjJORF9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2Vycm9yLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tlcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMDYyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tlcnJvci5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2Vycm9yLmgKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIENvbW1vbiBNb2R1bGVzCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuNyAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wNS8xMyAxNzoyNToxMyAkCisgKiBQdXJwb3NlOglTSyBzcGVjaWZpYyBFcnJvciBsb2cgc3VwcG9ydAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9JTkNfU0tFUlJPUl9IXworI2RlZmluZSBfSU5DX1NLRVJST1JfSF8KKworLyoKKyAqIERlZmluZSBFcnJvciBDbGFzc2VzCisgKi8KKyNkZWZpbmUJU0tfRVJSQ0xfT1RIRVIJCSgwKQkJLyogT3RoZXIgZXJyb3IgKi8KKyNkZWZpbmUJU0tfRVJSQ0xfQ09ORklHCQkoMUw8PDApCS8qIENvbmZpZ3VyYXRpb24gZXJyb3IgKi8KKyNkZWZpbmUJU0tfRVJSQ0xfSU5JVAkJKDFMPDwxKQkvKiBJbml0aWFsaXphdGlvbiBlcnJvciAqLworI2RlZmluZQlTS19FUlJDTF9OT1JFUwkJKDFMPDwyKQkvKiBPdXQgb2YgUmVzb3VyY2VzIGVycm9yICovCisjZGVmaW5lCVNLX0VSUkNMX1NXCQkJKDFMPDwzKQkvKiBJbnRlcm5hbCBTb2Z0d2FyZSBlcnJvciAqLworI2RlZmluZQlTS19FUlJDTF9IVwkJCSgxTDw8NCkJLyogSGFyZHdhcmUgRmFpbHVyZSAqLworI2RlZmluZQlTS19FUlJDTF9DT01NCQkoMUw8PDUpCS8qIENvbW11bmljYXRpb24gZXJyb3IgKi8KKworCisvKgorICogRGVmaW5lIEVycm9yIENvZGUgQmFzZXMKKyAqLworI2RlZmluZQlTS19FUlJCQVNFX1JMTVQJCSAxMDAJLyogQmFzZSBFcnJvciBudW1iZXIgZm9yIFJMTVQgKi8KKyNkZWZpbmUJU0tfRVJSQkFTRV9IV0lOSVQJIDIwMAkvKiBCYXNlIEVycm9yIG51bWJlciBmb3IgSFdJbml0ICovCisjZGVmaW5lCVNLX0VSUkJBU0VfVlBECQkgMzAwCS8qIEJhc2UgRXJyb3IgbnVtYmVyIGZvciBWUEQgKi8KKyNkZWZpbmUJU0tfRVJSQkFTRV9QTk1JCQkgNDAwCS8qIEJhc2UgRXJyb3IgbnVtYmVyIGZvciBQTk1JICovCisjZGVmaW5lCVNLX0VSUkJBU0VfQ1NVTQkJIDUwMAkvKiBCYXNlIEVycm9yIG51bWJlciBmb3IgQ2hlY2tzdW0gKi8KKyNkZWZpbmUJU0tfRVJSQkFTRV9TSVJRCQkgNjAwCS8qIEJhc2UgRXJyb3IgbnVtYmVyIGZvciBTcGVjaWFsIElSUSAqLworI2RlZmluZQlTS19FUlJCQVNFX0kyQwkJIDcwMAkvKiBCYXNlIEVycm9yIG51bWJlciBmb3IgSTJDIG1vZHVsZSAqLworI2RlZmluZQlTS19FUlJCQVNFX1FVRVVFCSA4MDAJLyogQmFzZSBFcnJvciBudW1iZXIgZm9yIFNjaGVkdWxlciAqLworI2RlZmluZQlTS19FUlJCQVNFX0FERFIJCSA5MDAJLyogQmFzZSBFcnJvciBudW1iZXIgZm9yIEFkZHJlc3MgbW9kdWxlICovCisjZGVmaW5lIFNLX0VSUkJBU0VfUEVDUAkJMTAwMCAgICAvKiBCYXNlIEVycm9yIG51bWJlciBmb3IgUEVDUCAqLworI2RlZmluZQlTS19FUlJCQVNFX0RSVgkJMTEwMAkvKiBCYXNlIEVycm9yIG51bWJlciBmb3IgRHJpdmVyICovCisKKyNlbmRpZgkvKiBfSU5DX1NLRVJST1JfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlZHJ2LmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWRydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZmQ0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWRydi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlZHJ2LmgKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIENvbW1vbiBNb2R1bGVzCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTAgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDcvMDQgMTI6MjU6MDEgJAorICogUHVycG9zZToJSW50ZXJmYWNlIHdpdGggdGhlIGRyaXZlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX1NLR0VEUlZfSF8KKyNkZWZpbmUgX19JTkNfU0tHRURSVl9IXworCisvKiBkZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRGVmaW5lIHRoZSBkcml2ZXIgZXZlbnRzLgorICogVXN1YWxseSB0aGUgZXZlbnRzIGFyZSBkZWZpbmVkIGJ5IHRoZSBkZXN0aW5hdGlvbiBtb2R1bGUuCisgKiBJbiBjYXNlIG9mIHRoZSBkcml2ZXIgd2UgcHV0IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBldmVudHMgaGVyZS4KKyAqLworI2RlZmluZSBTS19EUlZfUE9SVF9SRVNFVAkJIDEJLyogVGhlIHBvcnQgbmVlZHMgdG8gYmUgcmVzZXQgKi8KKyNkZWZpbmUgU0tfRFJWX05FVF9VUCAgIAkJIDIJLyogVGhlIG5ldCBpcyBvcGVyYXRpb25hbCAqLworI2RlZmluZSBTS19EUlZfTkVUX0RPV04JCQkgMwkvKiBUaGUgbmV0IGlzIGRvd24gKi8KKyNkZWZpbmUgU0tfRFJWX1NXSVRDSF9TT0ZUCQkgNAkvKiBQb3J0cyBzd2l0Y2ggd2l0aCBib3RoIGxpbmtzIGNvbm5lY3RlZCAqLworI2RlZmluZSBTS19EUlZfU1dJVENIX0hBUkQJCSA1CS8qIFBvcnQgc3dpdGNoIGR1ZSB0byBsaW5rIGZhaWx1cmUgKi8KKyNkZWZpbmUgU0tfRFJWX1JMTVRfU0VORAkJIDYJLyogU2VuZCBhIFJMTVQgcGFja2V0ICovCisjZGVmaW5lIFNLX0RSVl9BREFQX0ZBSUwJCSA3CS8qIFRoZSB3aG9sZSBhZGFwdGVyIGZhaWxzICovCisjZGVmaW5lIFNLX0RSVl9QT1JUX0ZBSUwJCSA4CS8qIE9uZSBwb3J0IGZhaWxzICovCisjZGVmaW5lIFNLX0RSVl9TV0lUQ0hfSU5URVJOCSA5CS8qIFBvcnQgc3dpdGNoIGJ5IHRoZSBkcml2ZXIgaXRzZWxmICovCisjZGVmaW5lIFNLX0RSVl9QT1dFUl9ET1dOCQkxMAkvKiBQb3dlciBkb3duIG1vZGUgKi8KKyNkZWZpbmUgU0tfRFJWX1RJTUVSCQkJMTEJLyogVGltZXIgZm9yIGZyZWUgdXNlICovCisjaWZkZWYgU0tfTk9fUkxNVAorI2RlZmluZSBTS19EUlZfTElOS19VUCAgCQkxMgkvKiBMaW5rIFVwIGV2ZW50IGZvciBkcml2ZXIgKi8KKyNkZWZpbmUgU0tfRFJWX0xJTktfRE9XTgkJMTMJLyogTGluayBEb3duIGV2ZW50IGZvciBkcml2ZXIgKi8KKyNlbmRpZgorI2RlZmluZSBTS19EUlZfRE9XTlNISUZUX0RFVAkxNAkvKiBEb3duc2hpZnQgNC1QYWlyIC8gMi1QYWlyIChZVUtPTiBvbmx5KSAqLworI2VuZGlmIC8qIF9fSU5DX1NLR0VEUlZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlaHcuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlaHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjI4MmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vody5oCkBAIC0wLDAgKzEsMjEyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZ2Vody5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBDb21tb24gTW9kdWxlcworICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjU2ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA5LzIzIDA5OjAxOjAwICQKKyAqIFB1cnBvc2U6CURlZmluZXMgYW5kIE1hY3JvcyBmb3IgdGhlIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlciBQcm9kdWN0IEZhbWlseQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX1NLR0VIV19ICisjZGVmaW5lIF9fSU5DX1NLR0VIV19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYJLyogX19jcGx1c3BsdXMgKi8KKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBCSVRfMzEJCSgxVUwgPDwgMzEpCisjZGVmaW5lIEJJVF8zMAkJKDFMIDw8IDMwKQorI2RlZmluZSBCSVRfMjkJCSgxTCA8PCAyOSkKKyNkZWZpbmUgQklUXzI4CQkoMUwgPDwgMjgpCisjZGVmaW5lIEJJVF8yNwkJKDFMIDw8IDI3KQorI2RlZmluZSBCSVRfMjYJCSgxTCA8PCAyNikKKyNkZWZpbmUgQklUXzI1CQkoMUwgPDwgMjUpCisjZGVmaW5lIEJJVF8yNAkJKDFMIDw8IDI0KQorI2RlZmluZSBCSVRfMjMJCSgxTCA8PCAyMykKKyNkZWZpbmUgQklUXzIyCQkoMUwgPDwgMjIpCisjZGVmaW5lIEJJVF8yMQkJKDFMIDw8IDIxKQorI2RlZmluZSBCSVRfMjAJCSgxTCA8PCAyMCkKKyNkZWZpbmUgQklUXzE5CQkoMUwgPDwgMTkpCisjZGVmaW5lIEJJVF8xOAkJKDFMIDw8IDE4KQorI2RlZmluZSBCSVRfMTcJCSgxTCA8PCAxNykKKyNkZWZpbmUgQklUXzE2CQkoMUwgPDwgMTYpCisjZGVmaW5lIEJJVF8xNQkJKDFMIDw8IDE1KQorI2RlZmluZSBCSVRfMTQJCSgxTCA8PCAxNCkKKyNkZWZpbmUgQklUXzEzCQkoMUwgPDwgMTMpCisjZGVmaW5lIEJJVF8xMgkJKDFMIDw8IDEyKQorI2RlZmluZSBCSVRfMTEJCSgxTCA8PCAxMSkKKyNkZWZpbmUgQklUXzEwCQkoMUwgPDwgMTApCisjZGVmaW5lIEJJVF85CQkoMUwgPDwgOSkKKyNkZWZpbmUgQklUXzgJCSgxTCA8PCA4KQorI2RlZmluZSBCSVRfNwkJKDFMIDw8IDcpCisjZGVmaW5lIEJJVF82CQkoMUwgPDwgNikKKyNkZWZpbmUgQklUXzUJCSgxTCA8PCA1KQorI2RlZmluZSBCSVRfNAkJKDFMIDw8IDQpCisjZGVmaW5lIEJJVF8zCQkoMUwgPDwgMykKKyNkZWZpbmUgQklUXzIJCSgxTCA8PCAyKQorI2RlZmluZSBCSVRfMQkJKDFMIDw8IDEpCisjZGVmaW5lIEJJVF8wCQkxTAorCisjZGVmaW5lIEJJVF8xNVMJCSgxVSA8PCAxNSkKKyNkZWZpbmUgQklUXzE0UwkJKDEgPDwgMTQpCisjZGVmaW5lIEJJVF8xM1MJCSgxIDw8IDEzKQorI2RlZmluZSBCSVRfMTJTCQkoMSA8PCAxMikKKyNkZWZpbmUgQklUXzExUwkJKDEgPDwgMTEpCisjZGVmaW5lIEJJVF8xMFMJCSgxIDw8IDEwKQorI2RlZmluZSBCSVRfOVMJCSgxIDw8IDkpCisjZGVmaW5lIEJJVF84UwkJKDEgPDwgOCkKKyNkZWZpbmUgQklUXzdTIAkJKDEgPDwgNykKKyNkZWZpbmUgQklUXzZTCQkoMSA8PCA2KQorI2RlZmluZSBCSVRfNVMJCSgxIDw8IDUpCisjZGVmaW5lIEJJVF80UwkJKDEgPDwgNCkKKyNkZWZpbmUgQklUXzNTCQkoMSA8PCAzKQorI2RlZmluZSBCSVRfMlMJCSgxIDw8IDIpCisjZGVmaW5lIEJJVF8xUwkJKDEgPDwgMSkKKyNkZWZpbmUgQklUXzBTCQkxCisKKyNkZWZpbmUgU0hJRlQzMSh4KQkoKHgpIDw8IDMxKQorI2RlZmluZSBTSElGVDMwKHgpCSgoeCkgPDwgMzApCisjZGVmaW5lIFNISUZUMjkoeCkJKCh4KSA8PCAyOSkKKyNkZWZpbmUgU0hJRlQyOCh4KQkoKHgpIDw8IDI4KQorI2RlZmluZSBTSElGVDI3KHgpCSgoeCkgPDwgMjcpCisjZGVmaW5lIFNISUZUMjYoeCkJKCh4KSA8PCAyNikKKyNkZWZpbmUgU0hJRlQyNSh4KQkoKHgpIDw8IDI1KQorI2RlZmluZSBTSElGVDI0KHgpCSgoeCkgPDwgMjQpCisjZGVmaW5lIFNISUZUMjMoeCkJKCh4KSA8PCAyMykKKyNkZWZpbmUgU0hJRlQyMih4KQkoKHgpIDw8IDIyKQorI2RlZmluZSBTSElGVDIxKHgpCSgoeCkgPDwgMjEpCisjZGVmaW5lIFNISUZUMjAoeCkJKCh4KSA8PCAyMCkKKyNkZWZpbmUgU0hJRlQxOSh4KQkoKHgpIDw8IDE5KQorI2RlZmluZSBTSElGVDE4KHgpCSgoeCkgPDwgMTgpCisjZGVmaW5lIFNISUZUMTcoeCkJKCh4KSA8PCAxNykKKyNkZWZpbmUgU0hJRlQxNih4KQkoKHgpIDw8IDE2KQorI2RlZmluZSBTSElGVDE1KHgpCSgoeCkgPDwgMTUpCisjZGVmaW5lIFNISUZUMTQoeCkJKCh4KSA8PCAxNCkKKyNkZWZpbmUgU0hJRlQxMyh4KQkoKHgpIDw8IDEzKQorI2RlZmluZSBTSElGVDEyKHgpCSgoeCkgPDwgMTIpCisjZGVmaW5lIFNISUZUMTEoeCkJKCh4KSA8PCAxMSkKKyNkZWZpbmUgU0hJRlQxMCh4KQkoKHgpIDw8IDEwKQorI2RlZmluZSBTSElGVDkoeCkJKCh4KSA8PCA5KQorI2RlZmluZSBTSElGVDgoeCkJKCh4KSA8PCA4KQorI2RlZmluZSBTSElGVDcoeCkJKCh4KSA8PCA3KQorI2RlZmluZSBTSElGVDYoeCkJKCh4KSA8PCA2KQorI2RlZmluZSBTSElGVDUoeCkJKCh4KSA8PCA1KQorI2RlZmluZSBTSElGVDQoeCkJKCh4KSA8PCA0KQorI2RlZmluZSBTSElGVDMoeCkJKCh4KSA8PCAzKQorI2RlZmluZSBTSElGVDIoeCkJKCh4KSA8PCAyKQorI2RlZmluZSBTSElGVDEoeCkJKCh4KSA8PCAxKQorI2RlZmluZSBTSElGVDAoeCkJKCh4KSA8PCAwKQorCisvKgorICogQ29uZmlndXJhdGlvbiBTcGFjZSBoZWFkZXIKKyAqIFNpbmNlIHRoaXMgbW9kdWxlIGlzIHVzZWQgZm9yIGRpZmZlcmVudCBPUycsIHRob3NlIG1heSBiZQorICogZHVwbGljYXRlIG9uIHNvbWUgb2YgdGhlbSAoZS5nLiBMaW51eCkuIEJ1dCB0byBrZWVwIHRoZQorICogY29tbW9uIHNvdXJjZSwgd2UgaGF2ZSB0byBsaXZlIHdpdGggdGhpcy4uLgorICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSUQJMHgwMAkvKiAxNiBiaXQJVmVuZG9yIElEICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSUQJMHgwMgkvKiAxNiBiaXQJRGV2aWNlIElEICovCisjZGVmaW5lIFBDSV9DT01NQU5ECQkweDA0CS8qIDE2IGJpdAlDb21tYW5kICovCisjZGVmaW5lIFBDSV9TVEFUVVMJCTB4MDYJLyogMTYgYml0CVN0YXR1cyAqLworI2RlZmluZSBQQ0lfUkVWX0lECQkweDA4CS8qICA4IGJpdAlSZXZpc2lvbiBJRCAqLworI2RlZmluZSBQQ0lfQ0xBU1NfQ09ERQkweDA5CS8qIDI0IGJpdAlDbGFzcyBDb2RlICovCisjZGVmaW5lIFBDSV9DQUNIRV9MU1oJMHgwYwkvKiAgOCBiaXQJQ2FjaGUgTGluZSBTaXplICovCisjZGVmaW5lIFBDSV9MQVRfVElNCQkweDBkCS8qICA4IGJpdAlMYXRlbmN5IFRpbWVyICovCisjZGVmaW5lIFBDSV9IRUFERVJfVAkweDBlCS8qICA4IGJpdAlIZWFkZXIgVHlwZSAqLworI2RlZmluZSBQQ0lfQklTVAkJMHgwZgkvKiAgOCBiaXQJQnVpbHQtaW4gc2VsZnRlc3QgKi8KKyNkZWZpbmUgUENJX0JBU0VfMVNUCTB4MTAJLyogMzIgYml0CTFzdCBCYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUENJX0JBU0VfMk5ECTB4MTQJLyogMzIgYml0CTJuZCBCYXNlIGFkZHJlc3MgKi8KKwkvKiBCeXRlIDB4MTguLjB4MmI6CXJlc2VydmVkICovCisjZGVmaW5lIFBDSV9TVUJfVklECQkweDJjCS8qIDE2IGJpdAlTdWJzeXN0ZW0gVmVuZG9yIElEICovCisjZGVmaW5lIFBDSV9TVUJfSUQJCTB4MmUJLyogMTYgYml0CVN1YnN5c3RlbSBJRCAqLworI2RlZmluZSBQQ0lfQkFTRV9ST00JMHgzMAkvKiAzMiBiaXQJRXhwYW5zaW9uIFJPTSBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgUENJX0NBUF9QVFIJCTB4MzQJLyogIDggYml0IAlDYXBhYmlsaXRpZXMgUHRyICovCisJLyogQnl0ZSAweDM1Li4weDNiOglyZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfSVJRX0xJTkUJMHgzYwkvKiAgOCBiaXQJSW50ZXJydXB0IExpbmUgKi8KKyNkZWZpbmUgUENJX0lSUV9QSU4JCTB4M2QJLyogIDggYml0CUludGVycnVwdCBQaW4gKi8KKyNkZWZpbmUgUENJX01JTl9HTlQJCTB4M2UJLyogIDggYml0CU1pbl9HbnQgKi8KKyNkZWZpbmUgUENJX01BWF9MQVQJCTB4M2YJLyogIDggYml0CU1heF9MYXQgKi8KKwkvKiBEZXZpY2UgRGVwZW5kZW50IFJlZ2lvbiAqLworI2RlZmluZSBQQ0lfT1VSX1JFR18xCTB4NDAJLyogMzIgYml0IAlPdXIgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBQQ0lfT1VSX1JFR18yCTB4NDQJLyogMzIgYml0IAlPdXIgUmVnaXN0ZXIgMiAqLworCS8qIFBvd2VyIE1hbmFnZW1lbnQgUmVnaW9uICovCisjZGVmaW5lIFBDSV9QTV9DQVBfSUQJMHg0OAkvKiAgOCBiaXQgCVBvd2VyIE1hbmFnZW1lbnQgQ2FwLiBJRCAqLworI2RlZmluZSBQQ0lfUE1fTklURU0JMHg0OQkvKiAgOCBiaXQgCU5leHQgSXRlbSBQdHIgKi8KKyNkZWZpbmUgUENJX1BNX0NBUF9SRUcJMHg0YQkvKiAxNiBiaXQgCVBvd2VyIE1hbmFnZW1lbnQgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lIFBDSV9QTV9DVExfU1RTCTB4NGMJLyogMTYgYml0IAlQb3dlciBNYW5hZy4gQ29udHJvbC9TdGF0dXMgKi8KKwkvKiBCeXRlIDB4NGU6CXJlc2VydmVkICovCisjZGVmaW5lIFBDSV9QTV9EQVRfUkVHCTB4NGYJLyogIDggYml0IAlQb3dlciBNYW5hZy4gRGF0YSBSZWdpc3RlciAqLworCS8qIFZQRCBSZWdpb24gKi8KKyNkZWZpbmUgUENJX1ZQRF9DQVBfSUQJMHg1MAkvKiAgOCBiaXQgCVZQRCBDYXAuIElEICovCisjZGVmaW5lIFBDSV9WUERfTklURU0JMHg1MQkvKiAgOCBiaXQgCU5leHQgSXRlbSBQdHIgKi8KKyNkZWZpbmUgUENJX1ZQRF9BRFJfUkVHCTB4NTIJLyogMTYgYml0IAlWUEQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfVlBEX0RBVF9SRUcJMHg1NAkvKiAzMiBiaXQgCVZQRCBEYXRhIFJlZ2lzdGVyICovCisJLyogQnl0ZSAweDU4Li4weDU5OglyZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfU0VSX0xEX0NUUkwJMHg1YQkvKiAxNiBiaXQgCVNFRVBST00gTG9hZGVyIEN0cmwgKFlVS09OIG9ubHkpICovCisJLyogQnl0ZSAweDVjLi4weGZmOglyZXNlcnZlZCAqLworCisvKgorICogSTJDIEFkZHJlc3MgKFBDSSBDb25maWcpCisgKgorICogTm90ZTogVGhlIHRlbXBlcmF0dXJlIGFuZCB2b2x0YWdlIHNlbnNvcnMgYXJlIHJlbG9jYXRlZCBvbiBhIGRpZmZlcmVudAorICoJIEkyQyBidXMuCisgKi8KKyNkZWZpbmUgSTJDX0FERFJfVlBECTB4YTAJLyogSTJDIGFkZHJlc3MgZm9yIHRoZSBWUEQgRUVQUk9NICovCisKKy8qCisgKiBEZWZpbmUgQml0cyBhbmQgVmFsdWVzIG9mIHRoZSByZWdpc3RlcnMKKyAqLworLyoJUENJX0NPTU1BTkQJMTYgYml0CUNvbW1hbmQgKi8KKwkJCQkJCQkJLyogQml0IDE1Li4xMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0lOVF9ESVMJCUJJVF8xMFMJCS8qIEludGVycnVwdCBJTlR4IyBkaXNhYmxlIChQQ0kgMi4zKSAqLworI2RlZmluZSBQQ0lfRkJURU4JCUJJVF85UwkJLyogRmFzdCBCYWNrLVRvLUJhY2sgZW5hYmxlICovCisjZGVmaW5lIFBDSV9TRVJSRU4JCUJJVF84UwkJLyogU0VSUiBlbmFibGUgKi8KKyNkZWZpbmUgUENJX0FEU1RFUAkJQklUXzdTCQkvKiBBZGRyZXNzIFN0ZXBwaW5nICovCisjZGVmaW5lIFBDSV9QRVJSRU4JCUJJVF82UwkJLyogUGFyaXR5IFJlcG9ydCBSZXNwb25zZSBlbmFibGUgKi8KKyNkZWZpbmUgUENJX1ZHQV9TTk9PUAlCSVRfNVMJCS8qIFZHQSBwYWxldHRlIHNub29wICovCisjZGVmaW5lIFBDSV9NV0lFTgkJQklUXzRTCQkvKiBNZW1vcnkgd3JpdGUgYW4gaW52IGN5Y2wgZW5hICovCisjZGVmaW5lIFBDSV9TQ1lDRU4JCUJJVF8zUwkJLyogU3BlY2lhbCBDeWNsZSBlbmFibGUgKi8KKyNkZWZpbmUgUENJX0JNRU4JCUJJVF8yUwkJLyogQnVzIE1hc3RlciBlbmFibGUgKi8KKyNkZWZpbmUgUENJX01FTUVOCQlCSVRfMVMJCS8qIE1lbW9yeSBTcGFjZSBBY2Nlc3MgZW5hYmxlICovCisjZGVmaW5lIFBDSV9JT0VOCQlCSVRfMFMJCS8qIEkvTyBTcGFjZSBBY2Nlc3MgZW5hYmxlICovCisKKyNkZWZpbmUgUENJX0NPTU1BTkRfVkFMCShQQ0lfRkJURU4gfCBQQ0lfU0VSUkVOIHwgUENJX1BFUlJFTiB8IFBDSV9NV0lFTiB8XAorCQkJCQkJIFBDSV9CTUVOIHwgUENJX01FTUVOIHwgUENJX0lPRU4pCisKKy8qCVBDSV9TVEFUVVMJMTYgYml0CVN0YXR1cyAqLworI2RlZmluZSBQQ0lfUEVSUgkJQklUXzE1UwkJLyogUGFyaXR5IEVycm9yICovCisjZGVmaW5lIFBDSV9TRVJSCQlCSVRfMTRTCQkvKiBTaWduYWxlZCBTRVJSICovCisjZGVmaW5lIFBDSV9STUFCT1JUCQlCSVRfMTNTCQkvKiBSZWNlaXZlZCBNYXN0ZXIgQWJvcnQgKi8KKyNkZWZpbmUgUENJX1JUQUJPUlQJCUJJVF8xMlMJCS8qIFJlY2VpdmVkIFRhcmdldCBBYm9ydCAqLworCQkJCQkJCQkvKiBCaXQgMTE6CXJlc2VydmVkICovCisjZGVmaW5lIFBDSV9ERVZTRUwJCSgzPDw5KQkJLyogQml0IDEwLi4gOToJREVWU0VMIFRpbWluZyAqLworI2RlZmluZSBQQ0lfREVWX0ZBU1QJKDA8PDkpCQkvKgkJZmFzdCAqLworI2RlZmluZSBQQ0lfREVWX01FRElVTQkoMTw8OSkJCS8qCQltZWRpdW0gKi8KKyNkZWZpbmUgUENJX0RFVl9TTE9XCSgyPDw5KQkJLyoJCXNsb3cgKi8KKyNkZWZpbmUgUENJX0RBVEFQRVJSCUJJVF84UwkJLyogREFUQSBQYXJpdHkgZXJyb3IgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUENJX0ZCMkJDQVAJCUJJVF83UwkJLyogRmFzdCBCYWNrLXRvLUJhY2sgQ2FwYWJpbGl0eSAqLworI2RlZmluZSBQQ0lfVURGCQkJQklUXzZTCQkvKiBVc2VyIERlZmluZWQgRmVhdHVyZXMgKi8KKyNkZWZpbmUgUENJXzY2TUhaQ0FQCUJJVF81UwkJLyogNjYgTUh6IFBDSSBidXMgY2xvY2sgY2FwYWJsZSAqLworI2RlZmluZSBQQ0lfTkVXQ0FQCQlCSVRfNFMJCS8qIE5ldyBjYXAuIGxpc3QgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgUENJX0lOVF9TVEFUCUJJVF8zUwkJLyogSW50ZXJydXB0IElOVHgjIFN0YXR1cyAoUENJIDIuMykgKi8KKwkJCQkJCQkJLyogQml0ICAyLi4gMDoJcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBQQ0lfRVJSQklUUwkoUENJX1BFUlIgfCBQQ0lfU0VSUiB8IFBDSV9STUFCT1JUIHwgUENJX1JUQUJPUlQgfFwKKwkJCVBDSV9EQVRBUEVSUikKKworLyoJUENJX0NMQVNTX0NPREUJMjQgYml0CUNsYXNzIENvZGUgKi8KKy8qCUJ5dGUgMjoJCUJhc2UgQ2xhc3MJCSgwMikgKi8KKy8qCUJ5dGUgMToJCVN1YkNsYXNzCQkoMDApICovCisvKglCeXRlIDA6CQlQcm9ncmFtbWluZyBJbnRlcmZhY2UJKDAwKSAqLworCisvKglQQ0lfQ0FDSEVfTFNaCTggYml0CUNhY2hlIExpbmUgU2l6ZSAqLworLyoJUG9zc2libGUgdmFsdWVzOiAwLDIsNCw4LDE2LDMyLDY0LDEyOAkqLworCisvKglQQ0lfSEVBREVSX1QJOCBiaXQJSGVhZGVyIFR5cGUgKi8KKyNkZWZpbmUgUENJX0hEX01GX0RFVglCSVRfN1MJLyogMD0gc2luZ2xlLCAxPSBtdWx0aS1mdW5jIGRldiAqLworI2RlZmluZSBQQ0lfSERfVFlQRQkJMHg3ZgkvKiBCaXQgNi4uMDoJSGVhZGVyIExheW91dCAwPSBub3JtYWwgKi8KKworLyoJUENJX0JJU1QJOCBiaXQJQnVpbHQtaW4gc2VsZnRlc3QgKi8KKy8qCUJ1aWx0LWluIFNlbGYgdGVzdCBub3Qgc3VwcG9ydGVkIChvcHRpb25hbCkgKi8KKworLyoJUENJX0JBU0VfMVNUCTMyIGJpdAkxc3QgQmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFBDSV9NRU1TSVpFCQkweDQwMDBMCQkvKiB1c2UgMTYga0IgTWVtb3J5IEJhc2UgKi8KKyNkZWZpbmUgUENJX01FTUJBU0VfTVNLIDB4ZmZmZmMwMDBMCS8qIEJpdCAzMS4uMTQ6CU1lbW9yeSBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgUENJX01FTVNJWkVfTVNLIDB4MDAwMDNmZjBMCS8qIEJpdCAxMy4uIDQ6CU1lbW9yeSBTaXplIFJlcS4gKi8KKyNkZWZpbmUgUENJX1BSRUZFTgkJQklUXzMJCS8qIFByZWZldGNoYWJsZSAqLworI2RlZmluZSBQQ0lfTUVNX1RZUAkJKDNMPDwyKQkJLyogQml0CTIuLiAxOglNZW1vcnkgVHlwZSAqLworI2RlZmluZSBQQ0lfTUVNMzJCSVQJKDBMPDwxKQkJLyogQmFzZSBhZGRyIGFueXdoZXJlIGluIDMyIEJpdCByYW5nZSAqLworI2RlZmluZSBQQ0lfTUVNMU0JCSgxTDw8MSkJCS8qIEJhc2UgYWRkciBiZWxvdyAxIE1lZ2FCeXRlICovCisjZGVmaW5lIFBDSV9NRU02NEJJVAkoMkw8PDEpCQkvKiBCYXNlIGFkZHIgYW55d2hlcmUgaW4gNjQgQml0IHJhbmdlICovCisjZGVmaW5lIFBDSV9NRU1TUEFDRQlCSVRfMAkJLyogTWVtb3J5IFNwYWNlIEluZGljYXRvciAqLworCisvKglQQ0lfQkFTRV8yTkQJMzIgYml0CTJuZCBCYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUENJX0lPQkFTRQkJMHhmZmZmZmYwMEwJLyogQml0IDMxLi4gODoJSS9PIEJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBQQ0lfSU9TSVpFCQkweDAwMDAwMGZjTAkvKiBCaXQJNy4uIDI6CUkvTyBTaXplIFJlcXVpcmVtZW50cyAqLworCQkJCQkJCQkJLyogQml0CTE6CXJlc2VydmVkICovCisjZGVmaW5lIFBDSV9JT1NQQUNFCQlCSVRfMAkJLyogSS9PIFNwYWNlIEluZGljYXRvciAqLworCisvKglQQ0lfQkFTRV9ST00JMzIgYml0CUV4cGFuc2lvbiBST00gQmFzZSBBZGRyZXNzICovCisjZGVmaW5lIFBDSV9ST01CQVNFX01TSwkweGZmZmUwMDAwTAkvKiBCaXQgMzEuLjE3OglST00gQmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFBDSV9ST01CQVNFX1NJWgkoMHgxY0w8PDE0KQkvKiBCaXQgMTYuLjE0OglUcmVhdCBhcyBCYXNlIG9yIFNpemUgKi8KKyNkZWZpbmUgUENJX1JPTVNJWkUJCSgweDM4TDw8MTEpCS8qIEJpdCAxMy4uMTE6CVJPTSBTaXplIFJlcXVpcmVtZW50cyAqLworCQkJCQkJCQkJLyogQml0IDEwLi4gMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX1JPTUVOCQlCSVRfMAkJLyogQWRkcmVzcyBEZWNvZGUgZW5hYmxlICovCisKKy8qIERldmljZSBEZXBlbmRlbnQgUmVnaW9uICovCisvKglQQ0lfT1VSX1JFR18xCQkzMiBiaXQJT3VyIFJlZ2lzdGVyIDEgKi8KKwkJCQkJCQkJCS8qIEJpdCAzMS4uMjk6CXJlc2VydmVkICovCisjZGVmaW5lIFBDSV9QSFlfQ09NQQlCSVRfMjgJCS8qIFNldCBQSFkgdG8gQ29tYSBNb2RlIChZVUtPTiBvbmx5KSAqLworI2RlZmluZSBQQ0lfVEVTVF9DQUwJQklUXzI3CQkvKiBUZXN0IFBDSSBidWZmZXIgY2FsaWIuIChZVUtPTiBvbmx5KSAqLworI2RlZmluZSBQQ0lfRU5fQ0FMCQlCSVRfMjYJCS8qIEVuYWJsZSBQQ0kgYnVmZmVyIGNhbGliLiAoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgUENJX1ZJTwkJCUJJVF8yNQkJLyogUENJIEkvTyBWb2x0YWdlLCAwID0gMy4zViwgMSA9IDVWICovCisjZGVmaW5lIFBDSV9ESVNfQk9PVAlCSVRfMjQJCS8qIERpc2FibGUgQk9PVCB2aWEgUk9NICovCisjZGVmaW5lIFBDSV9FTl9JTwkJQklUXzIzCQkvKiBNYXBwaW5nIHRvIEkvTyBzcGFjZSAqLworI2RlZmluZSBQQ0lfRU5fRlBST00JQklUXzIyCQkvKiBFbmFibGUgRkxBU0ggbWFwcGluZyB0byBtZW1vcnkgKi8KKwkJCQkJCQkJCS8qCQkxID0gTWFwIEZsYXNoIHRvIG1lbW9yeSAqLworCQkJCQkJCQkJLyoJCTAgPSBEaXNhYmxlIGFkZHIuIGRlYyAqLworI2RlZmluZSBQQ0lfUEFHRVNJWkUJKDNMPDwyMCkJLyogQml0IDIxLi4yMDoJRkxBU0ggUGFnZSBTaXplCSovCisjZGVmaW5lIFBDSV9QQUdFXzE2CQkoMEw8PDIwKQkvKgkJMTYgayBwYWdlcwkqLworI2RlZmluZSBQQ0lfUEFHRV8zMksJKDFMPDwyMCkJLyoJCTMyIGsgcGFnZXMJKi8KKyNkZWZpbmUgUENJX1BBR0VfNjRLCSgyTDw8MjApCS8qCQk2NCBrIHBhZ2VzCSovCisjZGVmaW5lIFBDSV9QQUdFXzEyOEsJKDNMPDwyMCkJLyoJCTEyOCBrIHBhZ2VzCSovCisJCQkJCQkJCQkvKiBCaXQgMTk6CXJlc2VydmVkCSovCisjZGVmaW5lIFBDSV9QQUdFUkVHCQkoN0w8PDE2KQkvKiBCaXQgMTguLjE2OglQYWdlIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBDSV9OT1RBUgkJQklUXzE1CQkvKiBObyB0dXJuYXJvdW5kIGN5Y2xlICovCisjZGVmaW5lIFBDSV9GT1JDRV9CRQlCSVRfMTQJCS8qIEFzc2VydCBhbGwgQkVzIG9uIE1SICovCisjZGVmaW5lIFBDSV9ESVNfTVJMCQlCSVRfMTMJCS8qIERpc2FibGUgTWVtIFJlYWQgTGluZSAqLworI2RlZmluZSBQQ0lfRElTX01STQkJQklUXzEyCQkvKiBEaXNhYmxlIE1lbSBSZWFkIE11bHRpcGxlICovCisjZGVmaW5lIFBDSV9ESVNfTVdJCQlCSVRfMTEJCS8qIERpc2FibGUgTWVtIFdyaXRlICYgSW52YWxpZGF0ZSAqLworI2RlZmluZSBQQ0lfRElTQ19DTFMJQklUXzEwCQkvKiBEaXNjOiBjYWNoZUxzeiBib3VuZCAqLworI2RlZmluZSBQQ0lfQlVSU1RfRElTCUJJVF85CQkvKiBCdXJzdCBEaXNhYmxlICovCisjZGVmaW5lIFBDSV9ESVNfUENJX0NMSwlCSVRfOAkJLyogRGlzYWJsZSBQQ0kgY2xvY2sgZHJpdmluZyAqLworI2RlZmluZSBQQ0lfU0tFV19EQVMJKDB4Zkw8PDQpCS8qIEJpdAk3Li4gNDoJU2tldyBDdHJsLCBEQVMgRXh0ICovCisjZGVmaW5lIFBDSV9TS0VXX0JBU0UJMHhmTAkJLyogQml0CTMuLiAwOglTa2V3IEN0cmwsIEJhc2UJKi8KKworCisvKglQQ0lfT1VSX1JFR18yCQkzMiBiaXQJT3VyIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgUENJX1ZQRF9XUl9USFIJKDB4ZmZMPDwyNCkJLyogQml0IDMxLi4yNDoJVlBEIFdyaXRlIFRocmVzaG9sZCAqLworI2RlZmluZSBQQ0lfREVWX1NFTAkJKDB4N2ZMPDwxNykJLyogQml0IDIzLi4xNzoJRUVQUk9NIERldmljZSBTZWxlY3QgKi8KKyNkZWZpbmUgUENJX1ZQRF9ST01fU1oJKDdMPDwxNCkJLyogQml0IDE2Li4xNDoJVlBEIFJPTSBTaXplCSovCisJCQkJCQkJCQkvKiBCaXQgMTMuLjEyOglyZXNlcnZlZAkqLworI2RlZmluZSBQQ0lfUEFUQ0hfRElSCSgweGZMPDw4KQkvKiBCaXQgMTEuLiA4OglFeHQgUGF0Y2hlcyBkaXIgMy4uMCAqLworI2RlZmluZSBQQ0lfUEFUQ0hfRElSXzMJQklUXzExCisjZGVmaW5lIFBDSV9QQVRDSF9ESVJfMglCSVRfMTAKKyNkZWZpbmUgUENJX1BBVENIX0RJUl8xCUJJVF85CisjZGVmaW5lIFBDSV9QQVRDSF9ESVJfMAlCSVRfOAorI2RlZmluZSBQQ0lfRVhUX1BBVENIUwkoMHhmTDw8NCkJLyogQml0CTcuLiA0OglFeHRlbmRlZCBQYXRjaGVzIDMuLjAgKi8KKyNkZWZpbmUgUENJX0VYVF9QQVRDSF8zCUJJVF83CisjZGVmaW5lIFBDSV9FWFRfUEFUQ0hfMglCSVRfNgorI2RlZmluZSBQQ0lfRVhUX1BBVENIXzEJQklUXzUKKyNkZWZpbmUgUENJX0VYVF9QQVRDSF8wCUJJVF80CisjZGVmaW5lIFBDSV9FTl9EVU1NWV9SRAlCSVRfMwkJLyogRW5hYmxlIER1bW15IFJlYWQgKi8KKyNkZWZpbmUgUENJX1JFVl9ERVNDCUJJVF8yCQkvKiBSZXZlcnNlIERlc2MuIEJ5dGVzICovCisJCQkJCQkJCQkvKiBCaXQJMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX1VTRURBVEE2NAlCSVRfMAkJLyogVXNlIDY0Qml0IERhdGEgYnVzIGV4dCAqLworCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgUmVnaW9uICovCisvKglQQ0lfUE1fQ0FQX1JFRwkJMTYgYml0CVBvd2VyIE1hbmFnZW1lbnQgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lIFBDSV9QTUVfU1VQX01TSwkoMHgxZjw8MTEpCS8qIEJpdCAxNS4uMTE6CVBNIEV2ZW50IFN1cHBvcnQgTWFzayAqLworI2RlZmluZSBQQ0lfUE1FX0QzQ19TVVAJQklUXzE1UwkJLyogUE1FIGZyb20gRDNjb2xkIFN1cHBvcnQgKGlmIFZhdXgpICovCisjZGVmaW5lIFBDSV9QTUVfRDNIX1NVUAlCSVRfMTRTCQkvKiBQTUUgZnJvbSBEM2hvdCBTdXBwb3J0ICovCisjZGVmaW5lIFBDSV9QTUVfRDJfU1VQCUJJVF8xM1MJCS8qIFBNRSBmcm9tIEQyIFN1cHBvcnQgKi8KKyNkZWZpbmUgUENJX1BNRV9EMV9TVVAJQklUXzEyUwkJLyogUE1FIGZyb20gRDEgU3VwcG9ydCAqLworI2RlZmluZSBQQ0lfUE1FX0QwX1NVUAlCSVRfMTFTCQkvKiBQTUUgZnJvbSBEMCBTdXBwb3J0ICovCisjZGVmaW5lIFBDSV9QTV9EMl9TVVAJQklUXzEwUwkJLyogRDIgU3VwcG9ydCBpbiAzMyBNSHogbW9kZSAqLworI2RlZmluZSBQQ0lfUE1fRDFfU1VQCUJJVF85UwkJLyogRDEgU3VwcG9ydCAqLworCQkJCQkJCQkJLyogQml0CTguLiA2OglyZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfUE1fRFNJCQlCSVRfNVMJCS8qIERldmljZSBTcGVjaWZpYyBJbml0aWFsaXphdGlvbiAqLworI2RlZmluZSBQQ0lfUE1fQVBTCQlCSVRfNFMJCS8qIEF1eGlhbGlhcnkgUG93ZXIgU291cmNlICovCisjZGVmaW5lIFBDSV9QTUVfQ0xPQ0sJQklUXzNTCQkvKiBQTSBFdmVudCBDbG9jayAqLworI2RlZmluZSBQQ0lfUE1fVkVSX01TSwkJNwkJLyogQml0CTIuLiAwOglQTSBQQ0kgU3BlYy4gdmVyc2lvbiAqLworCisvKglQQ0lfUE1fQ1RMX1NUUwkJMTYgYml0CVBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbC9TdGF0dXMgKi8KKyNkZWZpbmUgUENJX1BNRV9TVEFUVVMJQklUXzE1UwkJLyogUE1FIFN0YXR1cyAoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgUENJX1BNX0RBVF9TQ0wJKDM8PDEzKQkJLyogQml0IDE0Li4xMzoJRGF0YSBSZWcuIHNjYWxpbmcgZmFjdG9yICovCisjZGVmaW5lIFBDSV9QTV9EQVRfU0VMCSgweGY8PDkpCS8qIEJpdCAxMi4uIDk6CVBNIGRhdGEgc2VsZWN0b3IgZmllbGQgKi8KKyNkZWZpbmUgUENJX1BNRV9FTgkJQklUXzhTCQkvKiBFbmFibGUgUE1FIyBnZW5lcmF0aW9uIChZVUtPTiBvbmx5KSAqLworCQkJCQkJCQkJLyogQml0CTcuLiAyOglyZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfUE1fU1RBVEVfTVNLCTMJCS8qIEJpdAkxLi4gMDoJUG93ZXIgTWFuYWdlbWVudCBTdGF0ZSAqLworCisjZGVmaW5lIFBDSV9QTV9TVEFURV9EMAkJMAkJLyogRDA6CU9wZXJhdGlvbmFsIChkZWZhdWx0KSAqLworI2RlZmluZSBQQ0lfUE1fU1RBVEVfRDEJCTEJCS8qIEQxOgkoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgUENJX1BNX1NUQVRFX0QyCQkyCQkvKiBEMjoJKFlVS09OIG9ubHkpICovCisjZGVmaW5lIFBDSV9QTV9TVEFURV9EMyAJMwkJLyogRDM6CUhPVCwgUG93ZXIgRG93biBhbmQgUmVzZXQgKi8KKworLyogVlBEIFJlZ2lvbiAqLworLyoJUENJX1ZQRF9BRFJfUkVHCQkxNiBiaXQJVlBEIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1ZQRF9GTEFHCUJJVF8xNVMJCS8qIHN0YXJ0cyBWUEQgcmQvd3IgY3ljbGUgKi8KKyNkZWZpbmUgUENJX1ZQRF9BRFJfTVNLCTB4N2ZmZkwJCS8qIEJpdCAxNC4uIDA6CVZQRCBhZGRyZXNzIG1hc2sgKi8KKworLyoJQ29udHJvbCBSZWdpc3RlciBGaWxlIChBZGRyZXNzIE1hcCkgKi8KKworLyoKKyAqCUJhbmsgMAorICovCisjZGVmaW5lIEIwX1JBUAkJCTB4MDAwMAkvKiAgOCBiaXQJUmVnaXN0ZXIgQWRkcmVzcyBQb3J0ICovCisJLyogMHgwMDAxIC0gMHgwMDAzOglyZXNlcnZlZCAqLworI2RlZmluZSBCMF9DVFNUCQkJMHgwMDA0CS8qIDE2IGJpdAlDb250cm9sL1N0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBCMF9MRUQJCQkweDAwMDYJLyogIDggQml0CUxFRCByZWdpc3RlciAqLworI2RlZmluZSBCMF9QT1dFUl9DVFJMCTB4MDAwNwkvKiAgOCBCaXQJUG93ZXIgQ29udHJvbCByZWcgKFlVS09OIG9ubHkpICovCisjZGVmaW5lIEIwX0lTUkMJCQkweDAwMDgJLyogMzIgYml0CUludGVycnVwdCBTb3VyY2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQjBfSU1TSwkJCTB4MDAwYwkvKiAzMiBiaXQJSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQjBfSFdFX0lTUkMJCTB4MDAxMAkvKiAzMiBiaXQJSFcgRXJyb3IgSW50ZXJydXB0IFNyYyBSZWcgKi8KKyNkZWZpbmUgQjBfSFdFX0lNU0sJCTB4MDAxNAkvKiAzMiBiaXQJSFcgRXJyb3IgSW50ZXJydXB0IE1hc2sgUmVnICovCisjZGVmaW5lIEIwX1NQX0lTUkMJCTB4MDAxOAkvKiAzMiBiaXQJU3BlY2lhbCBJbnRlcnJ1cHQgU291cmNlIFJlZyAqLworCS8qIDB4MDAxYzoJCXJlc2VydmVkICovCisKKy8qIEIwIFhNQUMgMSByZWdpc3RlcnMgKEdFTkVTSVMgb25seSkgKi8KKyNkZWZpbmUgQjBfWE0xX0lNU0sJCTB4MDAyMAkvKiAxNiBiaXQgci93CVhNQUMgMSBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciovCisJLyogMHgwMDIyIC0gMHgwMDI3OglyZXNlcnZlZCAqLworI2RlZmluZSBCMF9YTTFfSVNSQwkJMHgwMDI4CS8qIDE2IGJpdCBybwlYTUFDIDEgSW50ZXJydXB0IFN0YXR1cyBSZWcgKi8KKwkvKiAweDAwMmEgLSAweDAwMmY6CXJlc2VydmVkICovCisjZGVmaW5lIEIwX1hNMV9QSFlfQUREUiAweDAwMzAJLyogMTYgYml0IHIvdwlYTUFDIDEgUEhZIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwkvKiAweDAwMzIgLSAweDAwMzM6CXJlc2VydmVkICovCisjZGVmaW5lIEIwX1hNMV9QSFlfREFUQSAweDAwMzQJLyogMTYgYml0IHIvdwlYTUFDIDEgUEhZIERhdGEgUmVnaXN0ZXIgKi8KKwkvKiAweDAwMzYgLSAweDAwM2Y6CXJlc2VydmVkICovCisKKy8qIEIwIFhNQUMgMiByZWdpc3RlcnMgKEdFTkVTSVMgb25seSkgKi8KKyNkZWZpbmUgQjBfWE0yX0lNU0sJCTB4MDA0MAkvKiAxNiBiaXQgci93CVhNQUMgMiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciovCisJLyogMHgwMDQyIC0gMHgwMDQ3OglyZXNlcnZlZCAqLworI2RlZmluZSBCMF9YTTJfSVNSQwkJMHgwMDQ4CS8qIDE2IGJpdCBybwlYTUFDIDIgSW50ZXJydXB0IFN0YXR1cyBSZWcgKi8KKwkvKiAweDAwNGEgLSAweDAwNGY6CXJlc2VydmVkICovCisjZGVmaW5lIEIwX1hNMl9QSFlfQUREUiAweDAwNTAJLyogMTYgYml0IHIvdwlYTUFDIDIgUEhZIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwkvKiAweDAwNTIgLSAweDAwNTM6CXJlc2VydmVkICovCisjZGVmaW5lIEIwX1hNMl9QSFlfREFUQSAweDAwNTQJLyogMTYgYml0IHIvdwlYTUFDIDIgUEhZIERhdGEgUmVnaXN0ZXIgKi8KKwkvKiAweDAwNTYgLSAweDAwNWY6CXJlc2VydmVkICovCisKKy8qIEJNVSBDb250cm9sIFN0YXR1cyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQjBfUjFfQ1NSCQkweDAwNjAJLyogMzIgYml0CUJNVSBDdHJsL1N0YXQgUnggUXVldWUgMSAqLworI2RlZmluZSBCMF9SMl9DU1IJCTB4MDA2NAkvKiAzMiBiaXQJQk1VIEN0cmwvU3RhdCBSeCBRdWV1ZSAyICovCisjZGVmaW5lIEIwX1hTMV9DU1IJCTB4MDA2OAkvKiAzMiBiaXQJQk1VIEN0cmwvU3RhdCBTeW5jIFR4IFF1ZXVlIDEgKi8KKyNkZWZpbmUgQjBfWEExX0NTUgkJMHgwMDZjCS8qIDMyIGJpdAlCTVUgQ3RybC9TdGF0IEFzeW5jIFR4IFF1ZXVlIDEqLworI2RlZmluZSBCMF9YUzJfQ1NSCQkweDAwNzAJLyogMzIgYml0CUJNVSBDdHJsL1N0YXQgU3luYyBUeCBRdWV1ZSAyICovCisjZGVmaW5lIEIwX1hBMl9DU1IJCTB4MDA3NAkvKiAzMiBiaXQJQk1VIEN0cmwvU3RhdCBBc3luYyBUeCBRdWV1ZSAyKi8KKwkvKiAweDAwNzggLSAweDAwN2Y6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDEKKyAqCS0gY29tcGxldGVseSBlbXB0eSAodGhpcyBpcyB0aGUgUkFQIEJsb2NrIHdpbmRvdykKKyAqCU5vdGU6IGlmIFJBUCA9IDEgdGhpcyBwYWdlIGlzIHJlc2VydmVkCisgKi8KKworLyoKKyAqCUJhbmsgMgorICovCisvKiBOQSByZWcgPSA0OCBiaXQgTmV0d29yayBBZGRyZXNzIFJlZ2lzdGVyLCAzeDE2IG9yIDh4OCBiaXQgcmVhZGFibGUgKi8KKyNkZWZpbmUgQjJfTUFDXzEJCTB4MDEwMAkvKiBOQSByZWcJIE1BQyBBZGRyZXNzIDEgKi8KKwkvKiAweDAxMDYgLSAweDAxMDc6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX01BQ18yCQkweDAxMDgJLyogTkEgcmVnCSBNQUMgQWRkcmVzcyAyICovCisJLyogMHgwMTBlIC0gMHgwMTBmOglyZXNlcnZlZCAqLworI2RlZmluZSBCMl9NQUNfMwkJMHgwMTEwCS8qIE5BIHJlZwkgTUFDIEFkZHJlc3MgMyAqLworCS8qIDB4MDExNiAtIDB4MDExNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjJfQ09OTl9UWVAJCTB4MDExOAkvKiAgOCBiaXQJQ29ubmVjdG9yIHR5cGUgKi8KKyNkZWZpbmUgQjJfUE1EX1RZUAkJMHgwMTE5CS8qICA4IGJpdAlQTUQgdHlwZSAqLworI2RlZmluZSBCMl9NQUNfQ0ZHCQkweDAxMWEJLyogIDggYml0CU1BQyBDb25maWd1cmF0aW9uIC8gQ2hpcCBSZXZpc2lvbiAqLworI2RlZmluZSBCMl9DSElQX0lECQkweDAxMWIJLyogIDggYml0IAlDaGlwIElkZW50aWZpY2F0aW9uIE51bWJlciAqLworCS8qIEVwcm9tIHJlZ2lzdGVycyBhcmUgY3VycmVudGx5IG9mIG5vIHVzZSAqLworI2RlZmluZSBCMl9FXzAJCQkweDAxMWMJLyogIDggYml0CUVQUk9NIEJ5dGUgMCAoZXh0LiBTUkFNIHNpemUgKi8KKyNkZWZpbmUgQjJfRV8xCQkJMHgwMTFkCS8qICA4IGJpdAlFUFJPTSBCeXRlIDEgKFBIWSB0eXBlKSAqLworI2RlZmluZSBCMl9FXzIJCQkweDAxMWUJLyogIDggYml0CUVQUk9NIEJ5dGUgMiAqLworI2RlZmluZSBCMl9FXzMJCQkweDAxMWYJLyogIDggYml0CUVQUk9NIEJ5dGUgMyAqLworI2RlZmluZSBCMl9GQVIJCQkweDAxMjAJLyogMzIgYml0CUZsYXNoLVByb20gQWRkciBSZWcvQ250ICovCisjZGVmaW5lIEIyX0ZEUAkJCTB4MDEyNAkvKiAgOCBiaXQJRmxhc2gtUHJvbSBEYXRhIFBvcnQgKi8KKwkvKiAweDAxMjUgLSAweDAxMjc6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX0xEX0NUUkwJCTB4MDEyOAkvKiAgOCBiaXQJRVBST00gbG9hZGVyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQjJfTERfVEVTVAkJMHgwMTI5CS8qICA4IGJpdAlFUFJPTSBsb2FkZXIgdGVzdCByZWdpc3RlciAqLworCS8qIDB4MDEyYSAtIDB4MDEyZjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjJfVElfSU5JCQkweDAxMzAJLyogMzIgYml0CVRpbWVyIEluaXQgVmFsdWUgKi8KKyNkZWZpbmUgQjJfVElfVkFMCQkweDAxMzQJLyogMzIgYml0CVRpbWVyIFZhbHVlICovCisjZGVmaW5lIEIyX1RJX0NUUkwJCTB4MDEzOAkvKiAgOCBiaXQJVGltZXIgQ29udHJvbCAqLworI2RlZmluZSBCMl9USV9URVNUCQkweDAxMzkJLyogIDggQml0CVRpbWVyIFRlc3QgKi8KKwkvKiAweDAxM2EgLSAweDAxM2Y6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX0lSUU1fSU5JCQkweDAxNDAJLyogMzIgYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIEluaXQgUmVnLiovCisjZGVmaW5lIEIyX0lSUU1fVkFMCQkweDAxNDQJLyogMzIgYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIFZhbHVlICovCisjZGVmaW5lIEIyX0lSUU1fQ1RSTAkweDAxNDgJLyogIDggYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIENvbnRyb2wgKi8KKyNkZWZpbmUgQjJfSVJRTV9URVNUCTB4MDE0OQkvKiAgOCBiaXQJSVJRIE1vZGVyYXRpb24gVGltZXIgVGVzdCAqLworI2RlZmluZSBCMl9JUlFNX01TSyAJMHgwMTRjCS8qIDMyIGJpdAlJUlEgTW9kZXJhdGlvbiBNYXNrICovCisjZGVmaW5lIEIyX0lSUU1fSFdFX01TSyAweDAxNTAJLyogMzIgYml0CUlSUSBNb2RlcmF0aW9uIEhXIEVycm9yIE1hc2sgKi8KKwkvKiAweDAxNTQgLSAweDAxNTc6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX1RTVF9DVFJMMQkweDAxNTgJLyogIDggYml0CVRlc3QgQ29udHJvbCBSZWdpc3RlciAxICovCisjZGVmaW5lIEIyX1RTVF9DVFJMMgkweDAxNTkJLyogIDggYml0CVRlc3QgQ29udHJvbCBSZWdpc3RlciAyICovCisJLyogMHgwMTVhIC0gMHgwMTViOglyZXNlcnZlZCAqLworI2RlZmluZSBCMl9HUF9JTwkJMHgwMTVjCS8qIDMyIGJpdAlHZW5lcmFsIFB1cnBvc2UgSS9PIFJlZ2lzdGVyICovCisjZGVmaW5lIEIyX0kyQ19DVFJMCQkweDAxNjAJLyogMzIgYml0CUkyQyBIVyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEIyX0kyQ19EQVRBCQkweDAxNjQJLyogMzIgYml0CUkyQyBIVyBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lIEIyX0kyQ19JUlEJCTB4MDE2OAkvKiAzMiBiaXQJSTJDIEhXIElSUSBSZWdpc3RlciAqLworI2RlZmluZSBCMl9JMkNfU1cJCTB4MDE2YwkvKiAzMiBiaXQJSTJDIFNXIFBvcnQgUmVnaXN0ZXIgKi8KKworLyogQmxpbmsgU291cmNlIENvdW50ZXIgKEdFTkVTSVMgb25seSkgKi8KKyNkZWZpbmUgQjJfQlNDX0lOSQkJMHgwMTcwCS8qIDMyIGJpdAlCbGluayBTb3VyY2UgQ291bnRlciBJbml0IFZhbCAqLworI2RlZmluZSBCMl9CU0NfVkFMCQkweDAxNzQJLyogMzIgYml0CUJsaW5rIFNvdXJjZSBDb3VudGVyIFZhbHVlICovCisjZGVmaW5lIEIyX0JTQ19DVFJMCQkweDAxNzgJLyogIDggYml0CUJsaW5rIFNvdXJjZSBDb3VudGVyIENvbnRyb2wgKi8KKyNkZWZpbmUgQjJfQlNDX1NUQVQJCTB4MDE3OQkvKiAgOCBiaXQJQmxpbmsgU291cmNlIENvdW50ZXIgU3RhdHVzICovCisjZGVmaW5lIEIyX0JTQ19UU1QJCTB4MDE3YQkvKiAxNiBiaXQJQmxpbmsgU291cmNlIENvdW50ZXIgVGVzdCBSZWcgKi8KKwkvKiAweDAxN2MgLSAweDAxN2Y6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDMKKyAqLworLyogUkFNIFJhbmRvbSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQjNfUkFNX0FERFIJCTB4MDE4MAkvKiAzMiBiaXQJUkFNIEFkZHJlc3MsIHRvIHJlYWQgb3Igd3JpdGUgKi8KKyNkZWZpbmUgQjNfUkFNX0RBVEFfTE8JMHgwMTg0CS8qIDMyIGJpdAlSQU0gRGF0YSBXb3JkIChsb3cgZFdvcmQpICovCisjZGVmaW5lIEIzX1JBTV9EQVRBX0hJCTB4MDE4OAkvKiAzMiBiaXQJUkFNIERhdGEgV29yZCAoaGlnaCBkV29yZCkgKi8KKwkvKiAweDAxOGMgLSAweDAxOGY6CXJlc2VydmVkICovCisKKy8qIFJBTSBJbnRlcmZhY2UgUmVnaXN0ZXJzICovCisvKgorICogVGhlIEhXLVNwZWMuIGNhbGxzIHRoaXMgcmVnaXN0ZXJzIFRpbWVvdXQgVmFsdWUgMC4uMTEuIEJ1dCB0aGlzIG5hbWVzIGFyZQorICogbm90IHVzYWJsZSBpbiBTVy4gUGxlYXNlIG5vdGljZSB0aGVzZSBhcmUgTk9UIHJlYWwgdGltZW91dHMsIHRoZXNlIGFyZQorICogdGhlIG51bWJlciBvZiBxV29yZHMgdHJhbnNmZXJyZWQgY29udGludW91c2x5LgorICovCisjZGVmaW5lIEIzX1JJX1dUT19SMQkweDAxOTAJLyogIDggYml0CVdSIFRpbWVvdXQgUXVldWUgUjEJCShUTzApICovCisjZGVmaW5lIEIzX1JJX1dUT19YQTEJMHgwMTkxCS8qICA4IGJpdAlXUiBUaW1lb3V0IFF1ZXVlIFhBMQkoVE8xKSAqLworI2RlZmluZSBCM19SSV9XVE9fWFMxCTB4MDE5MgkvKiAgOCBiaXQJV1IgVGltZW91dCBRdWV1ZSBYUzEJKFRPMikgKi8KKyNkZWZpbmUgQjNfUklfUlRPX1IxCTB4MDE5MwkvKiAgOCBiaXQJUkQgVGltZW91dCBRdWV1ZSBSMQkJKFRPMykgKi8KKyNkZWZpbmUgQjNfUklfUlRPX1hBMQkweDAxOTQJLyogIDggYml0CVJEIFRpbWVvdXQgUXVldWUgWEExCShUTzQpICovCisjZGVmaW5lIEIzX1JJX1JUT19YUzEJMHgwMTk1CS8qICA4IGJpdAlSRCBUaW1lb3V0IFF1ZXVlIFhTMQkoVE81KSAqLworI2RlZmluZSBCM19SSV9XVE9fUjIJMHgwMTk2CS8qICA4IGJpdAlXUiBUaW1lb3V0IFF1ZXVlIFIyCQkoVE82KSAqLworI2RlZmluZSBCM19SSV9XVE9fWEEyCTB4MDE5NwkvKiAgOCBiaXQJV1IgVGltZW91dCBRdWV1ZSBYQTIJKFRPNykgKi8KKyNkZWZpbmUgQjNfUklfV1RPX1hTMgkweDAxOTgJLyogIDggYml0CVdSIFRpbWVvdXQgUXVldWUgWFMyCShUTzgpICovCisjZGVmaW5lIEIzX1JJX1JUT19SMgkweDAxOTkJLyogIDggYml0CVJEIFRpbWVvdXQgUXVldWUgUjIJCShUTzkpICovCisjZGVmaW5lIEIzX1JJX1JUT19YQTIJMHgwMTlhCS8qICA4IGJpdAlSRCBUaW1lb3V0IFF1ZXVlIFhBMgkoVE8xMCkqLworI2RlZmluZSBCM19SSV9SVE9fWFMyCTB4MDE5YgkvKiAgOCBiaXQJUkQgVGltZW91dCBRdWV1ZSBYUzIJKFRPMTEpKi8KKyNkZWZpbmUgQjNfUklfVE9fVkFMCTB4MDE5YwkvKiAgOCBiaXQJQ3VycmVudCBUaW1lb3V0IENvdW50IFZhbCAqLworCS8qIDB4MDE5ZCAtIDB4MDE5ZjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjNfUklfQ1RSTAkJMHgwMWEwCS8qIDE2IGJpdAlSQU0gSW50ZXJmYWNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQjNfUklfVEVTVAkJMHgwMWEyCS8qICA4IGJpdAlSQU0gSW50ZXJmYWNlIFRlc3QgUmVnaXN0ZXIgKi8KKwkvKiAweDAxYTMgLSAweDAxYWY6CXJlc2VydmVkICovCisKKy8qIE1BQyBBcmJpdGVyIFJlZ2lzdGVycyAoR0VORVNJUyBvbmx5KSAqLworLyogdGhlc2UgYXJlIHRoZSBuby4gb2YgcVdvcmQgdHJhbnNmZXJyZWQgY29udGludW91c2x5IGFuZCBOT1QgcmVhbCB0aW1lb3V0cyAqLworI2RlZmluZSBCM19NQV9UT0lOSV9SWDEJMHgwMWIwCS8qICA4IGJpdAlUaW1lb3V0IEluaXQgVmFsIFJ4IFBhdGggTUFDIDEgKi8KKyNkZWZpbmUgQjNfTUFfVE9JTklfUlgyCTB4MDFiMQkvKiAgOCBiaXQJVGltZW91dCBJbml0IFZhbCBSeCBQYXRoIE1BQyAyICovCisjZGVmaW5lIEIzX01BX1RPSU5JX1RYMQkweDAxYjIJLyogIDggYml0CVRpbWVvdXQgSW5pdCBWYWwgVHggUGF0aCBNQUMgMSAqLworI2RlZmluZSBCM19NQV9UT0lOSV9UWDIJMHgwMWIzCS8qICA4IGJpdAlUaW1lb3V0IEluaXQgVmFsIFR4IFBhdGggTUFDIDIgKi8KKyNkZWZpbmUgQjNfTUFfVE9WQUxfUlgxCTB4MDFiNAkvKiAgOCBiaXQJVGltZW91dCBWYWx1ZSBSeCBQYXRoIE1BQyAxICovCisjZGVmaW5lIEIzX01BX1RPVkFMX1JYMgkweDAxYjUJLyogIDggYml0CVRpbWVvdXQgVmFsdWUgUnggUGF0aCBNQUMgMSAqLworI2RlZmluZSBCM19NQV9UT1ZBTF9UWDEJMHgwMWI2CS8qICA4IGJpdAlUaW1lb3V0IFZhbHVlIFR4IFBhdGggTUFDIDIgKi8KKyNkZWZpbmUgQjNfTUFfVE9WQUxfVFgyCTB4MDFiNwkvKiAgOCBiaXQJVGltZW91dCBWYWx1ZSBUeCBQYXRoIE1BQyAyICovCisjZGVmaW5lIEIzX01BX1RPX0NUUkwJMHgwMWI4CS8qIDE2IGJpdAlNQUMgQXJiaXRlciBUaW1lb3V0IEN0cmwgUmVnICovCisjZGVmaW5lIEIzX01BX1RPX1RFU1QJMHgwMWJhCS8qIDE2IGJpdAlNQUMgQXJiaXRlciBUaW1lb3V0IFRlc3QgUmVnICovCisJLyogMHgwMWJjIC0gMHgwMWJmOglyZXNlcnZlZCAqLworI2RlZmluZSBCM19NQV9SQ0lOSV9SWDEJMHgwMWMwCS8qICA4IGJpdAlSZWNvdmVyeSBJbml0IFZhbCBSeCBQYXRoIE1BQyAxICovCisjZGVmaW5lIEIzX01BX1JDSU5JX1JYMgkweDAxYzEJLyogIDggYml0CVJlY292ZXJ5IEluaXQgVmFsIFJ4IFBhdGggTUFDIDIgKi8KKyNkZWZpbmUgQjNfTUFfUkNJTklfVFgxCTB4MDFjMgkvKiAgOCBiaXQJUmVjb3ZlcnkgSW5pdCBWYWwgVHggUGF0aCBNQUMgMSAqLworI2RlZmluZSBCM19NQV9SQ0lOSV9UWDIJMHgwMWMzCS8qICA4IGJpdAlSZWNvdmVyeSBJbml0IFZhbCBUeCBQYXRoIE1BQyAyICovCisjZGVmaW5lIEIzX01BX1JDVkFMX1JYMQkweDAxYzQJLyogIDggYml0CVJlY292ZXJ5IFZhbHVlIFJ4IFBhdGggTUFDIDEgKi8KKyNkZWZpbmUgQjNfTUFfUkNWQUxfUlgyCTB4MDFjNQkvKiAgOCBiaXQJUmVjb3ZlcnkgVmFsdWUgUnggUGF0aCBNQUMgMSAqLworI2RlZmluZSBCM19NQV9SQ1ZBTF9UWDEJMHgwMWM2CS8qICA4IGJpdAlSZWNvdmVyeSBWYWx1ZSBUeCBQYXRoIE1BQyAyICovCisjZGVmaW5lIEIzX01BX1JDVkFMX1RYMgkweDAxYzcJLyogIDggYml0CVJlY292ZXJ5IFZhbHVlIFR4IFBhdGggTUFDIDIgKi8KKyNkZWZpbmUgQjNfTUFfUkNfQ1RSTAkweDAxYzgJLyogMTYgYml0CU1BQyBBcmJpdGVyIFJlY292ZXJ5IEN0cmwgUmVnICovCisjZGVmaW5lIEIzX01BX1JDX1RFU1QJMHgwMWNhCS8qIDE2IGJpdAlNQUMgQXJiaXRlciBSZWNvdmVyeSBUZXN0IFJlZyAqLworCS8qIDB4MDFjYyAtIDB4MDFjZjoJcmVzZXJ2ZWQgKi8KKworLyogUGFja2V0IEFyYml0ZXIgUmVnaXN0ZXJzIChHRU5FU0lTIG9ubHkpICovCisvKiB0aGVzZSBhcmUgcmVhbCB0aW1lb3V0cyAqLworI2RlZmluZSBCM19QQV9UT0lOSV9SWDEJMHgwMWQwCS8qIDE2IGJpdAlUaW1lb3V0IEluaXQgVmFsIFJ4IFBhdGggTUFDIDEgKi8KKwkvKiAweDAxZDIgLSAweDAxZDM6CXJlc2VydmVkICovCisjZGVmaW5lIEIzX1BBX1RPSU5JX1JYMgkweDAxZDQJLyogMTYgYml0CVRpbWVvdXQgSW5pdCBWYWwgUnggUGF0aCBNQUMgMiAqLworCS8qIDB4MDFkNiAtIDB4MDFkNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjNfUEFfVE9JTklfVFgxCTB4MDFkOAkvKiAxNiBiaXQJVGltZW91dCBJbml0IFZhbCBUeCBQYXRoIE1BQyAxICovCisJLyogMHgwMWRhIC0gMHgwMWRiOglyZXNlcnZlZCAqLworI2RlZmluZSBCM19QQV9UT0lOSV9UWDIJMHgwMWRjCS8qIDE2IGJpdAlUaW1lb3V0IEluaXQgVmFsIFR4IFBhdGggTUFDIDIgKi8KKwkvKiAweDAxZGUgLSAweDAxZGY6CXJlc2VydmVkICovCisjZGVmaW5lIEIzX1BBX1RPVkFMX1JYMQkweDAxZTAJLyogMTYgYml0CVRpbWVvdXQgVmFsIFJ4IFBhdGggTUFDIDEgKi8KKwkvKiAweDAxZTIgLSAweDAxZTM6CXJlc2VydmVkICovCisjZGVmaW5lIEIzX1BBX1RPVkFMX1JYMgkweDAxZTQJLyogMTYgYml0CVRpbWVvdXQgVmFsIFJ4IFBhdGggTUFDIDIgKi8KKwkvKiAweDAxZTYgLSAweDAxZTc6CXJlc2VydmVkICovCisjZGVmaW5lIEIzX1BBX1RPVkFMX1RYMQkweDAxZTgJLyogMTYgYml0CVRpbWVvdXQgVmFsIFR4IFBhdGggTUFDIDEgKi8KKwkvKiAweDAxZWEgLSAweDAxZWI6CXJlc2VydmVkICovCisjZGVmaW5lIEIzX1BBX1RPVkFMX1RYMgkweDAxZWMJLyogMTYgYml0CVRpbWVvdXQgVmFsIFR4IFBhdGggTUFDIDIgKi8KKwkvKiAweDAxZWUgLSAweDAxZWY6CXJlc2VydmVkICovCisjZGVmaW5lIEIzX1BBX0NUUkwJMHgwMWYwCS8qIDE2IGJpdAlQYWNrZXQgQXJiaXRlciBDdHJsIFJlZ2lzdGVyICovCisjZGVmaW5lIEIzX1BBX1RFU1QJMHgwMWYyCS8qIDE2IGJpdAlQYWNrZXQgQXJiaXRlciBUZXN0IFJlZ2lzdGVyICovCisJLyogMHgwMWY0IC0gMHgwMWZmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayA0IC0gNQorICovCisvKiBUcmFuc21pdCBBcmJpdGVyIFJlZ2lzdGVycyBNQUMgMSBhbmQgMiwgdXNlIE1SX0FERFIoKSB0byBhY2Nlc3MgKi8KKyNkZWZpbmUgVFhBX0lUSV9JTkkJCTB4MDIwMAkvKiAzMiBiaXQJVHggQXJiIEludGVydmFsIFRpbWVyIEluaXQgVmFsKi8KKyNkZWZpbmUgVFhBX0lUSV9WQUwJCTB4MDIwNAkvKiAzMiBiaXQJVHggQXJiIEludGVydmFsIFRpbWVyIFZhbHVlICovCisjZGVmaW5lIFRYQV9MSU1fSU5JCQkweDAyMDgJLyogMzIgYml0CVR4IEFyYiBMaW1pdCBDb3VudGVyIEluaXQgVmFsICovCisjZGVmaW5lIFRYQV9MSU1fVkFMCQkweDAyMGMJLyogMzIgYml0CVR4IEFyYiBMaW1pdCBDb3VudGVyIFZhbHVlICovCisjZGVmaW5lIFRYQV9DVFJMCQkweDAyMTAJLyogIDggYml0CVR4IEFyYml0ZXIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBUWEFfVEVTVAkJMHgwMjExCS8qICA4IGJpdAlUeCBBcmJpdGVyIFRlc3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVFhBX1NUQVQJCTB4MDIxMgkvKiAgOCBiaXQJVHggQXJiaXRlciBTdGF0dXMgUmVnaXN0ZXIgKi8KKwkvKiAweDAyMTMgLSAweDAyN2Y6CXJlc2VydmVkICovCisJLyogMHgwMjgwIC0gMHgwMjkyOglNQUMgMiAqLworCS8qIDB4MDIxMyAtIDB4MDI3ZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgNgorICovCisvKiBFeHRlcm5hbCByZWdpc3RlcnMgKEdFTkVTSVMgb25seSkgKi8KKyNkZWZpbmUgQjZfRVhUX1JFRwkJMHgwMzAwCisKKy8qCisgKglCYW5rIDcKKyAqLworLyogVGhpcyBpcyBhIGNvcHkgb2YgdGhlIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZmlsZSAobG93ZXIgaGFsZikgKi8KKyNkZWZpbmUgQjdfQ0ZHX1NQQwkJMHgwMzgwCisKKy8qCisgKglCYW5rIDggLSAxNQorICovCisvKiBSZWNlaXZlIGFuZCBUcmFuc21pdCBRdWV1ZSBSZWdpc3RlcnMsIHVzZSBRX0FERFIoKSB0byBhY2Nlc3MgKi8KKyNkZWZpbmUgQjhfUV9SRUdTCQkweDA0MDAKKworLyogUXVldWUgUmVnaXN0ZXIgT2Zmc2V0cywgdXNlIFFfQUREUigpIHRvIGFjY2VzcyAqLworI2RlZmluZSBRX0QJCTB4MDAJLyogOCozMgliaXQJQ3VycmVudCBEZXNjcmlwdG9yICovCisjZGVmaW5lIFFfREFfTAkweDIwCS8qIDMyIGJpdAlDdXJyZW50IERlc2NyaXB0b3IgQWRkcmVzcyBMb3cgZFdvcmQgKi8KKyNkZWZpbmUgUV9EQV9ICTB4MjQJLyogMzIgYml0CUN1cnJlbnQgRGVzY3JpcHRvciBBZGRyZXNzIEhpZ2ggZFdvcmQgKi8KKyNkZWZpbmUgUV9BQ19MCTB4MjgJLyogMzIgYml0CUN1cnJlbnQgQWRkcmVzcyBDb3VudGVyIExvdyBkV29yZCAqLworI2RlZmluZSBRX0FDX0gJMHgyYwkvKiAzMiBiaXQJQ3VycmVudCBBZGRyZXNzIENvdW50ZXIgSGlnaCBkV29yZCAqLworI2RlZmluZSBRX0JDCTB4MzAJLyogMzIgYml0CUN1cnJlbnQgQnl0ZSBDb3VudGVyICovCisjZGVmaW5lIFFfQ1NSCTB4MzQJLyogMzIgYml0CUJNVSBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBRX0YJCTB4MzgJLyogMzIgYml0CUZsYWcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUV9UMQkweDNjCS8qIDMyIGJpdAlUZXN0IFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgUV9UMV9UUgkweDNjCS8qICA4IGJpdAlUZXN0IFJlZ2lzdGVyIDEgVHJhbnNmZXIgU00gKi8KKyNkZWZpbmUgUV9UMV9XUgkweDNkCS8qICA4IGJpdAlUZXN0IFJlZ2lzdGVyIDEgV3JpdGUgRGVzY3JpcHRvciBTTSAqLworI2RlZmluZSBRX1QxX1JECTB4M2UJLyogIDggYml0CVRlc3QgUmVnaXN0ZXIgMSBSZWFkIERlc2NyaXB0b3IgU00gKi8KKyNkZWZpbmUgUV9UMV9TVgkweDNmCS8qICA4IGJpdAlUZXN0IFJlZ2lzdGVyIDEgU3VwZXJ2aXNvciBTTSAqLworI2RlZmluZSBRX1QyCTB4NDAJLyogMzIgYml0CVRlc3QgUmVnaXN0ZXIgMgkqLworI2RlZmluZSBRX1QzCTB4NDQJLyogMzIgYml0CVRlc3QgUmVnaXN0ZXIgMwkqLworCS8qIDB4NDggLSAweDdmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayAxNiAtIDIzCisgKi8KKy8qIFJBTSBCdWZmZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIEIxNl9SQU1fUkVHUwkweDA4MDAKKworLyogUkFNIEJ1ZmZlciBSZWdpc3RlciBPZmZzZXRzLCB1c2UgUkJfQUREUigpIHRvIGFjY2VzcyAqLworI2RlZmluZSBSQl9TVEFSVAkJMHgwMAkvKiAzMiBiaXQJUkFNIEJ1ZmZlciBTdGFydCBBZGRyZXNzICovCisjZGVmaW5lIFJCX0VORAkJCTB4MDQJLyogMzIgYml0CVJBTSBCdWZmZXIgRW5kIEFkZHJlc3MgKi8KKyNkZWZpbmUgUkJfV1AJCQkweDA4CS8qIDMyIGJpdAlSQU0gQnVmZmVyIFdyaXRlIFBvaW50ZXIgKi8KKyNkZWZpbmUgUkJfUlAJCQkweDBjCS8qIDMyIGJpdAlSQU0gQnVmZmVyIFJlYWQgUG9pbnRlciAqLworI2RlZmluZSBSQl9SWF9VVFBQCQkweDEwCS8qIDMyIGJpdAlSeCBVcHBlciBUaHJlc2hvbGQsIFBhdXNlIFBhY2sgKi8KKyNkZWZpbmUgUkJfUlhfTFRQUAkJMHgxNAkvKiAzMiBiaXQJUnggTG93ZXIgVGhyZXNob2xkLCBQYXVzZSBQYWNrICovCisjZGVmaW5lIFJCX1JYX1VUSFAJCTB4MTgJLyogMzIgYml0CVJ4IFVwcGVyIFRocmVzaG9sZCwgSGlnaCBQcmlvICovCisjZGVmaW5lIFJCX1JYX0xUSFAJCTB4MWMJLyogMzIgYml0CVJ4IExvd2VyIFRocmVzaG9sZCwgSGlnaCBQcmlvICovCisJLyogMHgxMCAtIDB4MWY6CXJlc2VydmVkIGF0IFR4IFJBTSBCdWZmZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIFJCX1BDCQkJMHgyMAkvKiAzMiBiaXQJUkFNIEJ1ZmZlciBQYWNrZXQgQ291bnRlciAqLworI2RlZmluZSBSQl9MRVYJCQkweDI0CS8qIDMyIGJpdAlSQU0gQnVmZmVyIExldmVsIFJlZ2lzdGVyICovCisjZGVmaW5lIFJCX0NUUkwJCQkweDI4CS8qICA4IGJpdAlSQU0gQnVmZmVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkJfVFNUMQkJCTB4MjkJLyogIDggYml0CVJBTSBCdWZmZXIgVGVzdCBSZWdpc3RlciAxICovCisjZGVmaW5lIFJCX1RTVDIJCQkweDJBCS8qICA4IGJpdAlSQU0gQnVmZmVyIFRlc3QgUmVnaXN0ZXIgMiAqLworCS8qIDB4MmMgLSAweDdmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayAyNAorICovCisvKgorICogUmVjZWl2ZSBNQUMgRklGTywgUmVjZWl2ZSBMRUQsIGFuZCBMaW5rX1N5bmMgcmVncyAoR0VORVNJUyBvbmx5KQorICogdXNlIE1SX0FERFIoKSB0byBhY2Nlc3MKKyAqLworI2RlZmluZSBSWF9NRkZfRUEJCTB4MGMwMAkvKiAzMiBiaXQJUmVjZWl2ZSBNQUMgRklGTyBFbmQgQWRkcmVzcyAqLworI2RlZmluZSBSWF9NRkZfV1AJCTB4MGMwNAkvKiAzMiBiaXQgCVJlY2VpdmUgTUFDIEZJRk8gV3JpdGUgUG9pbnRlciAqLworCS8qIDB4MGMwOCAtIDB4MGMwYjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUlhfTUZGX1JQCQkweDBjMGMJLyogMzIgYml0CVJlY2VpdmUgTUFDIEZJRk8gUmVhZCBQb2ludGVyICovCisjZGVmaW5lIFJYX01GRl9QQwkJMHgwYzEwCS8qIDMyIGJpdAlSZWNlaXZlIE1BQyBGSUZPIFBhY2tldCBDbnQgKi8KKyNkZWZpbmUgUlhfTUZGX0xFVgkJMHgwYzE0CS8qIDMyIGJpdAlSZWNlaXZlIE1BQyBGSUZPIExldmVsICovCisjZGVmaW5lIFJYX01GRl9DVFJMMQkweDBjMTgJLyogMTYgYml0CVJlY2VpdmUgTUFDIEZJRk8gQ29udHJvbCBSZWcgMSovCisjZGVmaW5lIFJYX01GRl9TVEFUX1RPCTB4MGMxYQkvKiAgOCBiaXQJUmVjZWl2ZSBNQUMgU3RhdHVzIFRpbWVvdXQgKi8KKyNkZWZpbmUgUlhfTUZGX1RJU1RfVE8JMHgwYzFiCS8qICA4IGJpdAlSZWNlaXZlIE1BQyBUaW1lIFN0YW1wIFRpbWVvdXQgKi8KKyNkZWZpbmUgUlhfTUZGX0NUUkwyCTB4MGMxYwkvKiAgOCBiaXQJUmVjZWl2ZSBNQUMgRklGTyBDb250cm9sIFJlZyAyKi8KKyNkZWZpbmUgUlhfTUZGX1RTVDEJCTB4MGMxZAkvKiAgOCBiaXQJUmVjZWl2ZSBNQUMgRklGTyBUZXN0IFJlZyAxICovCisjZGVmaW5lIFJYX01GRl9UU1QyCQkweDBjMWUJLyogIDggYml0CVJlY2VpdmUgTUFDIEZJRk8gVGVzdCBSZWcgMiAqLworCS8qIDB4MGMxZjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUlhfTEVEX0lOSQkJMHgwYzIwCS8qIDMyIGJpdAlSZWNlaXZlIExFRCBDbnQgSW5pdCBWYWx1ZSAqLworI2RlZmluZSBSWF9MRURfVkFMCQkweDBjMjQJLyogMzIgYml0CVJlY2VpdmUgTEVEIENudCBDdXJyZW50IFZhbHVlICovCisjZGVmaW5lIFJYX0xFRF9DVFJMCQkweDBjMjgJLyogIDggYml0CVJlY2VpdmUgTEVEIENudCBDb250cm9sIFJlZyAqLworI2RlZmluZSBSWF9MRURfVFNUCQkweDBjMjkJLyogIDggYml0CVJlY2VpdmUgTEVEIENudCBUZXN0IFJlZ2lzdGVyICovCisJLyogMHgwYzJhIC0gMHgwYzJmOglyZXNlcnZlZCAqLworI2RlZmluZSBMTktfU1lOQ19JTkkJMHgwYzMwCS8qIDMyIGJpdAlMaW5rIFN5bmMgQ250IEluaXQgVmFsdWUgKi8KKyNkZWZpbmUgTE5LX1NZTkNfVkFMCTB4MGMzNAkvKiAzMiBiaXQJTGluayBTeW5jIENudCBDdXJyZW50IFZhbHVlICovCisjZGVmaW5lIExOS19TWU5DX0NUUkwJMHgwYzM4CS8qICA4IGJpdAlMaW5rIFN5bmMgQ250IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTE5LX1NZTkNfVFNUCTB4MGMzOQkvKiAgOCBiaXQJTGluayBTeW5jIENudCBUZXN0IFJlZ2lzdGVyICovCisJLyogMHgwYzNhIC0gMHgwYzNiOglyZXNlcnZlZCAqLworI2RlZmluZSBMTktfTEVEX1JFRwkJMHgwYzNjCS8qICA4IGJpdAlMaW5rIExFRCBSZWdpc3RlciAqLworCS8qIDB4MGMzZCAtIDB4MGMzZjoJcmVzZXJ2ZWQgKi8KKworLyogUmVjZWl2ZSBHTUFDIEZJRk8gKFlVS09OIG9ubHkpLCB1c2UgTVJfQUREUigpIHRvIGFjY2VzcyAqLworI2RlZmluZSBSWF9HTUZfRUEJCTB4MGM0MAkvKiAzMiBiaXQJUnggR01BQyBGSUZPIEVuZCBBZGRyZXNzICovCisjZGVmaW5lIFJYX0dNRl9BRl9USFIJMHgwYzQ0CS8qIDMyIGJpdAlSeCBHTUFDIEZJRk8gQWxtb3N0IEZ1bGwgVGhyZXNoLiAqLworI2RlZmluZSBSWF9HTUZfQ1RSTF9UCTB4MGM0OAkvKiAzMiBiaXQJUnggR01BQyBGSUZPIENvbnRyb2wvVGVzdCAqLworI2RlZmluZSBSWF9HTUZfRkxfTVNLCTB4MGM0YwkvKiAzMiBiaXQJUnggR01BQyBGSUZPIEZsdXNoIE1hc2sgKi8KKyNkZWZpbmUgUlhfR01GX0ZMX1RIUgkweDBjNTAJLyogMzIgYml0CVJ4IEdNQUMgRklGTyBGbHVzaCBUaHJlc2hvbGQgKi8KKwkvKiAweDBjNTQgLSAweDBjNWY6CXJlc2VydmVkICovCisjZGVmaW5lIFJYX0dNRl9XUAkJMHgwYzYwCS8qIDMyIGJpdCAJUnggR01BQyBGSUZPIFdyaXRlIFBvaW50ZXIgKi8KKwkvKiAweDBjNjQgLSAweDBjNjc6CXJlc2VydmVkICovCisjZGVmaW5lIFJYX0dNRl9XTEVWCQkweDBjNjgJLyogMzIgYml0IAlSeCBHTUFDIEZJRk8gV3JpdGUgTGV2ZWwgKi8KKwkvKiAweDBjNmMgLSAweDBjNmY6CXJlc2VydmVkICovCisjZGVmaW5lIFJYX0dNRl9SUAkJMHgwYzcwCS8qIDMyIGJpdCAJUnggR01BQyBGSUZPIFJlYWQgUG9pbnRlciAqLworCS8qIDB4MGM3NCAtIDB4MGM3NzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUlhfR01GX1JMRVYJCTB4MGM3OAkvKiAzMiBiaXQgCVJ4IEdNQUMgRklGTyBSZWFkIExldmVsICovCisJLyogMHgwYzdjIC0gMHgwYzdmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayAyNQorICovCisJLyogMHgwYzgwIC0gMHgwY2JmOglNQUMgMiAqLworCS8qIDB4MGNjMCAtIDB4MGNmZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMjYKKyAqLworLyoKKyAqIFRyYW5zbWl0IE1BQyBGSUZPIGFuZCBUcmFuc21pdCBMRUQgUmVnaXN0ZXJzIChHRU5FU0lTIG9ubHkpLAorICogdXNlIE1SX0FERFIoKSB0byBhY2Nlc3MKKyAqLworI2RlZmluZSBUWF9NRkZfRUEJCTB4MGQwMAkvKiAzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gRW5kIEFkZHJlc3MgKi8KKyNkZWZpbmUgVFhfTUZGX1dQCQkweDBkMDQJLyogMzIgYml0IAlUcmFuc21pdCBNQUMgRklGTyBXUiBQb2ludGVyICovCisjZGVmaW5lIFRYX01GRl9XU1AJCTB4MGQwOAkvKiAzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gV1IgU2hhZG93IFB0ciAqLworI2RlZmluZSBUWF9NRkZfUlAJCTB4MGQwYwkvKiAzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gUkQgUG9pbnRlciAqLworI2RlZmluZSBUWF9NRkZfUEMJCTB4MGQxMAkvKiAzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gUGFja2V0IENudCAqLworI2RlZmluZSBUWF9NRkZfTEVWCQkweDBkMTQJLyogMzIgYml0CVRyYW5zbWl0IE1BQyBGSUZPIExldmVsICovCisjZGVmaW5lIFRYX01GRl9DVFJMMQkweDBkMTgJLyogMTYgYml0CVRyYW5zbWl0IE1BQyBGSUZPIEN0cmwgUmVnIDEgKi8KKyNkZWZpbmUgVFhfTUZGX1dBRgkJMHgwZDFhCS8qICA4IGJpdAlUcmFuc21pdCBNQUMgV2FpdCBhZnRlciBmbHVzaCAqLworCS8qIDB4MGMxYjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVFhfTUZGX0NUUkwyCTB4MGQxYwkvKiAgOCBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gQ3RybCBSZWcgMiAqLworI2RlZmluZSBUWF9NRkZfVFNUMQkJMHgwZDFkCS8qICA4IGJpdAlUcmFuc21pdCBNQUMgRklGTyBUZXN0IFJlZyAxICovCisjZGVmaW5lIFRYX01GRl9UU1QyCQkweDBkMWUJLyogIDggYml0CVRyYW5zbWl0IE1BQyBGSUZPIFRlc3QgUmVnIDIgKi8KKwkvKiAweDBkMWY6CXJlc2VydmVkICovCisjZGVmaW5lIFRYX0xFRF9JTkkJCTB4MGQyMAkvKiAzMiBiaXQJVHJhbnNtaXQgTEVEIENudCBJbml0IFZhbHVlICovCisjZGVmaW5lIFRYX0xFRF9WQUwJCTB4MGQyNAkvKiAzMiBiaXQJVHJhbnNtaXQgTEVEIENudCBDdXJyZW50IFZhbCAqLworI2RlZmluZSBUWF9MRURfQ1RSTAkJMHgwZDI4CS8qICA4IGJpdAlUcmFuc21pdCBMRUQgQ250IENvbnRyb2wgUmVnICovCisjZGVmaW5lIFRYX0xFRF9UU1QJCTB4MGQyOQkvKiAgOCBiaXQJVHJhbnNtaXQgTEVEIENudCBUZXN0IFJlZyAqLworCS8qIDB4MGQyYSAtIDB4MGQzZjoJcmVzZXJ2ZWQgKi8KKworLyogVHJhbnNtaXQgR01BQyBGSUZPIChZVUtPTiBvbmx5KSwgdXNlIE1SX0FERFIoKSB0byBhY2Nlc3MgKi8KKyNkZWZpbmUgVFhfR01GX0VBCQkweDBkNDAJLyogMzIgYml0CVR4IEdNQUMgRklGTyBFbmQgQWRkcmVzcyAqLworI2RlZmluZSBUWF9HTUZfQUVfVEhSCTB4MGQ0NAkvKiAzMiBiaXQJVHggR01BQyBGSUZPIEFsbW9zdCBFbXB0eSBUaHJlc2guKi8KKyNkZWZpbmUgVFhfR01GX0NUUkxfVAkweDBkNDgJLyogMzIgYml0CVR4IEdNQUMgRklGTyBDb250cm9sL1Rlc3QgKi8KKwkvKiAweDBkNGMgLSAweDBkNWY6CXJlc2VydmVkICovCisjZGVmaW5lIFRYX0dNRl9XUAkJMHgwZDYwCS8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFdyaXRlIFBvaW50ZXIgKi8KKyNkZWZpbmUgVFhfR01GX1dTUAkJMHgwZDY0CS8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFdyaXRlIFNoYWRvdyBQdHIuICovCisjZGVmaW5lIFRYX0dNRl9XTEVWCQkweDBkNjgJLyogMzIgYml0IAlUeCBHTUFDIEZJRk8gV3JpdGUgTGV2ZWwgKi8KKwkvKiAweDBkNmMgLSAweDBkNmY6CXJlc2VydmVkICovCisjZGVmaW5lIFRYX0dNRl9SUAkJMHgwZDcwCS8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFJlYWQgUG9pbnRlciAqLworI2RlZmluZSBUWF9HTUZfUlNUUAkJMHgwZDc0CS8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFJlc3RhcnQgUG9pbnRlciAqLworI2RlZmluZSBUWF9HTUZfUkxFVgkJMHgwZDc4CS8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFJlYWQgTGV2ZWwgKi8KKwkvKiAweDBkN2MgLSAweDBkN2Y6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDI3CisgKi8KKwkvKiAweDBkODAgLSAweDBkYmY6CU1BQyAyICovCisJLyogMHgwZGFhIC0gMHgwZGZmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayAyOAorICovCisvKiBEZXNjcmlwdG9yIFBvbGwgVGltZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIEIyOF9EUFRfSU5JCQkweDBlMDAJLyogMjQgYml0CURlc2NyaXB0b3IgUG9sbCBUaW1lciBJbml0IFZhbCAqLworI2RlZmluZSBCMjhfRFBUX1ZBTAkJMHgwZTA0CS8qIDI0IGJpdAlEZXNjcmlwdG9yIFBvbGwgVGltZXIgQ3VyciBWYWwgKi8KKyNkZWZpbmUgQjI4X0RQVF9DVFJMCTB4MGUwOAkvKiAgOCBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIEN0cmwgUmVnICovCisJLyogMHgwZTA5OglyZXNlcnZlZCAqLworI2RlZmluZSBCMjhfRFBUX1RTVAkJMHgwZTBhCS8qICA4IGJpdAlEZXNjcmlwdG9yIFBvbGwgVGltZXIgVGVzdCBSZWcgKi8KKwkvKiAweDBlMGI6CXJlc2VydmVkICovCisKKy8qIFRpbWUgU3RhbXAgVGltZXIgUmVnaXN0ZXJzIChZVUtPTiBvbmx5KSAqLworCS8qIDB4MGUxMDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR01BQ19USV9TVF9WQUwJMHgwZTE0CS8qIDMyIGJpdAlUaW1lIFN0YW1wIFRpbWVyIEN1cnIgVmFsICovCisjZGVmaW5lIEdNQUNfVElfU1RfQ1RSTAkweDBlMTgJLyogIDggYml0CVRpbWUgU3RhbXAgVGltZXIgQ3RybCBSZWcgKi8KKwkvKiAweDBlMTk6CXJlc2VydmVkICovCisjZGVmaW5lIEdNQUNfVElfU1RfVFNUCTB4MGUxYQkvKiAgOCBiaXQJVGltZSBTdGFtcCBUaW1lciBUZXN0IFJlZyAqLworCS8qIDB4MGUxYiAtIDB4MGU3ZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMjkKKyAqLworCS8qIDB4MGU4MCAtIDB4MGVmYzoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMzAKKyAqLworLyogR01BQyBhbmQgR1BIWSBDb250cm9sIFJlZ2lzdGVycyAoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgR01BQ19DVFJMCQkweDBmMDAJLyogMzIgYml0CUdNQUMgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgR1BIWV9DVFJMCQkweDBmMDQJLyogMzIgYml0CUdQSFkgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgR01BQ19JUlFfU1JDCTB4MGYwOAkvKiAgOCBiaXQJR01BQyBJbnRlcnJ1cHQgU291cmNlIFJlZyAqLworCS8qIDB4MGYwOSAtIDB4MGYwYjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR01BQ19JUlFfTVNLCTB4MGYwYwkvKiAgOCBiaXQJR01BQyBJbnRlcnJ1cHQgTWFzayBSZWcgKi8KKwkvKiAweDBmMGQgLSAweDBmMGY6CXJlc2VydmVkICovCisjZGVmaW5lIEdNQUNfTElOS19DVFJMCTB4MGYxMAkvKiAxNiBiaXQJTGluayBDb250cm9sIFJlZyAqLworCS8qIDB4MGYxNCAtIDB4MGYxZjoJcmVzZXJ2ZWQgKi8KKworLyogV2FrZS11cCBGcmFtZSBQYXR0ZXJuIE1hdGNoIENvbnRyb2wgUmVnaXN0ZXJzIChZVUtPTiBvbmx5KSAqLworCisjZGVmaW5lIFdPTF9SRUdfT0ZGUwkweDIwCS8qIEhXLUJ1ZzogQWRkcmVzcyBpcyArIDB4MjAgYWdhaW5zdCBzcGVjLiAqLworCisjZGVmaW5lIFdPTF9DVFJMX1NUQVQJMHgwZjIwCS8qIDE2IGJpdAlXT0wgQ29udHJvbC9TdGF0dXMgUmVnICovCisjZGVmaW5lIFdPTF9NQVRDSF9DVEwJMHgwZjIyCS8qICA4IGJpdAlXT0wgTWF0Y2ggQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgV09MX01BVENIX1JFUwkweDBmMjMJLyogIDggYml0CVdPTCBNYXRjaCBSZXN1bHQgUmVnICovCisjZGVmaW5lIFdPTF9NQUNfQUREUl9MTwkweDBmMjQJLyogMzIgYml0CVdPTCBNQUMgQWRkcmVzcyBMb3cgKi8KKyNkZWZpbmUgV09MX01BQ19BRERSX0hJCTB4MGYyOAkvKiAxNiBiaXQJV09MIE1BQyBBZGRyZXNzIEhpZ2ggKi8KKyNkZWZpbmUgV09MX1BBVFRfUlBUUgkweDBmMmMJLyogIDggYml0CVdPTCBQYXR0ZXJuIFJlYWQgUHRyICovCisKKy8qIHVzZSB0aGlzIG1hY3JvIHRvIGFjY2VzcyBhYm92ZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgV09MX1JFRyhSZWcpCSgoUmVnKSArIChwQUMtPkdJbmkuR0lXb2xPZmZzKSkKKworCisvKiBXT0wgUGF0dGVybiBMZW5ndGggUmVnaXN0ZXJzIChZVUtPTiBvbmx5KSAqLworCisjZGVmaW5lIFdPTF9QQVRUX0xFTl9MTwkweDBmMzAJCS8qIDMyIGJpdAlXT0wgUGF0dGVybiBMZW5ndGggMy4uMCAqLworI2RlZmluZSBXT0xfUEFUVF9MRU5fSEkJMHgwZjM0CQkvKiAyNCBiaXQJV09MIFBhdHRlcm4gTGVuZ3RoIDYuLjQgKi8KKworLyogV09MIFBhdHRlcm4gQ291bnRlciBSZWdpc3RlcnMgKFlVS09OIG9ubHkpICovCisKKyNkZWZpbmUgV09MX1BBVFRfQ05UXzAJMHgwZjM4CQkvKiAzMiBiaXQJV09MIFBhdHRlcm4gQ291bnRlciAzLi4wICovCisjZGVmaW5lIFdPTF9QQVRUX0NOVF80CTB4MGYzYwkJLyogMjQgYml0CVdPTCBQYXR0ZXJuIENvdW50ZXIgNi4uNCAqLworCS8qIDB4MGY0MCAtIDB4MGY3ZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMzEKKyAqLworLyogMHgwZjgwIC0gMHgwZmZmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayAzMgktIDMzCisgKi8KKyNkZWZpbmUgV09MX1BBVFRfUkFNXzEJMHgxMDAwCS8qICBXT0wgUGF0dGVybiBSQU0gTGluayAxICovCisKKy8qCisgKglCYW5rIDB4MjIgLSAweDNmCisgKi8KKy8qIDB4MTEwMCAtIDB4MWZmZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMHg0MCAtIDB4NGYKKyAqLworI2RlZmluZSBCQVNFX1hNQUNfMQkJMHgyMDAwCS8qIFhNQUMgMSByZWdpc3RlcnMgKi8KKworLyoKKyAqCUJhbmsgMHg1MCAtIDB4NWYKKyAqLworCisjZGVmaW5lIEJBU0VfR01BQ18xCQkweDI4MDAJLyogR01BQyAxIHJlZ2lzdGVycyAqLworCisvKgorICoJQmFuayAweDYwIC0gMHg2ZgorICovCisjZGVmaW5lIEJBU0VfWE1BQ18yCQkweDMwMDAJLyogWE1BQyAyIHJlZ2lzdGVycyAqLworCisvKgorICoJQmFuayAweDcwIC0gMHg3ZgorICovCisjZGVmaW5lIEJBU0VfR01BQ18yCQkweDM4MDAJLyogR01BQyAyIHJlZ2lzdGVycyAqLworCisvKgorICoJQ29udHJvbCBSZWdpc3RlciBCaXQgRGVmaW5pdGlvbnM6CisgKi8KKy8qCUIwX1JBUAkJOCBiaXQJUmVnaXN0ZXIgQWRkcmVzcyBQb3J0ICovCisJCQkJCQkJCS8qIEJpdCA3OglyZXNlcnZlZCAqLworI2RlZmluZSBSQVBfUkFQCQkJMHgzZgkvKiBCaXQgNi4uMDoJMCA9IGJsb2NrIDAsLi4sNmYgPSBibG9jayA2ZiAqLworCisvKglCMF9DVFNUCQkJMTYgYml0CUNvbnRyb2wvU3RhdHVzIHJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNS4uMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIENTX0NMS19SVU5fSE9UCUJJVF8xM1MJCS8qIENMS19SVU4gaG90IG0uIChZVUtPTi1MaXRlIG9ubHkpICovCisjZGVmaW5lIENTX0NMS19SVU5fUlNUCUJJVF8xMlMJCS8qIENMS19SVU4gcmVzZXQgIChZVUtPTi1MaXRlIG9ubHkpICovCisjZGVmaW5lIENTX0NMS19SVU5fRU5BCUJJVF8xMVMJCS8qIENMS19SVU4gZW5hYmxlIChZVUtPTi1MaXRlIG9ubHkpICovCisjZGVmaW5lIENTX1ZBVVhfQVZBSUwJQklUXzEwUwkJLyogVkFVWCBhdmFpbGFibGUgKFlVS09OIG9ubHkpICovCisjZGVmaW5lIENTX0JVU19DTE9DSwlCSVRfOVMJCS8qIEJ1cyBDbG9jayAwLzEgPSAzMy82NiBNSHogKi8KKyNkZWZpbmUgQ1NfQlVTX1NMT1RfU1oJQklUXzhTCQkvKiBTbG90IFNpemUgMC8xID0gMzIvNjQgYml0IHNsb3QgKi8KKyNkZWZpbmUgQ1NfU1RfU1dfSVJRCUJJVF83UwkJLyogU2V0IElSUSBTVyBSZXF1ZXN0ICovCisjZGVmaW5lIENTX0NMX1NXX0lSUQlCSVRfNlMJCS8qIENsZWFyIElSUSBTVyBSZXF1ZXN0ICovCisjZGVmaW5lIENTX1NUT1BfRE9ORQlCSVRfNVMJCS8qIFN0b3AgTWFzdGVyIGlzIGZpbmlzaGVkICovCisjZGVmaW5lIENTX1NUT1BfTUFTVAlCSVRfNFMJCS8qIENvbW1hbmQgQml0IHRvIHN0b3AgdGhlIG1hc3RlciAqLworI2RlZmluZSBDU19NUlNUX0NMUgkJQklUXzNTCQkvKiBDbGVhciBNYXN0ZXIgcmVzZXQJKi8KKyNkZWZpbmUgQ1NfTVJTVF9TRVQJCUJJVF8yUwkJLyogU2V0IE1hc3RlciByZXNldAkqLworI2RlZmluZSBDU19SU1RfQ0xSCQlCSVRfMVMJCS8qIENsZWFyIFNvZnR3YXJlIHJlc2V0CSovCisjZGVmaW5lIENTX1JTVF9TRVQJCUJJVF8wUwkJLyogU2V0ICAgU29mdHdhcmUgcmVzZXQJKi8KKworLyoJQjBfTEVECQkJIDggQml0CUxFRCByZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgIDcuLiAyOglyZXNlcnZlZCAqLworI2RlZmluZSBMRURfU1RBVF9PTgkJQklUXzFTCQkvKiBTdGF0dXMgTEVEIG9uCSovCisjZGVmaW5lIExFRF9TVEFUX09GRglCSVRfMFMJCS8qIFN0YXR1cyBMRUQgb2ZmCSovCisKKy8qCUIwX1BPV0VSX0NUUkwJIDggQml0CVBvd2VyIENvbnRyb2wgcmVnIChZVUtPTiBvbmx5KSAqLworI2RlZmluZSBQQ19WQVVYX0VOQQkJQklUXzcJCS8qIFN3aXRjaCBWQVVYIEVuYWJsZSAgKi8KKyNkZWZpbmUgUENfVkFVWF9ESVMJCUJJVF82ICAgICAgIC8qIFN3aXRjaCBWQVVYIERpc2FibGUgKi8KKyNkZWZpbmUgUENfVkNDX0VOQQkJQklUXzUgICAgICAgLyogU3dpdGNoIFZDQyBFbmFibGUgICovCisjZGVmaW5lIFBDX1ZDQ19ESVMJCUJJVF80ICAgICAgIC8qIFN3aXRjaCBWQ0MgRGlzYWJsZSAqLworI2RlZmluZSBQQ19WQVVYX09OCQlCSVRfMyAgICAgICAvKiBTd2l0Y2ggVkFVWCBPbiAgKi8KKyNkZWZpbmUgUENfVkFVWF9PRkYJCUJJVF8yICAgICAgIC8qIFN3aXRjaCBWQVVYIE9mZiAqLworI2RlZmluZSBQQ19WQ0NfT04JCUJJVF8xICAgICAgIC8qIFN3aXRjaCBWQ0MgT24gICovCisjZGVmaW5lIFBDX1ZDQ19PRkYJCUJJVF8wICAgICAgIC8qIFN3aXRjaCBWQ0MgT2ZmICovCisKKy8qCUIwX0lTUkMJCQkzMiBiaXQJSW50ZXJydXB0IFNvdXJjZSBSZWdpc3RlciAqLworLyoJQjBfSU1TSwkJCTMyIGJpdAlJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworLyoJQjBfU1BfSVNSQwkJMzIgYml0CVNwZWNpYWwgSW50ZXJydXB0IFNvdXJjZSBSZWcgKi8KKy8qCUIyX0lSUU1fTVNLIAkzMiBiaXQJSVJRIE1vZGVyYXRpb24gTWFzayAqLworI2RlZmluZSBJU19BTExfTVNLCQkweGJmZmZmZmZmVUwJLyogQWxsIEludGVycnVwdCBiaXRzICovCisjZGVmaW5lIElTX0hXX0VSUgkJQklUXzMxCQkvKiBJbnRlcnJ1cHQgSFcgRXJyb3IgKi8KKwkJCQkJCQkJLyogQml0IDMwOglyZXNlcnZlZCAqLworI2RlZmluZSBJU19QQV9UT19SWDEJQklUXzI5CQkvKiBQYWNrZXQgQXJiIFRpbWVvdXQgUngxICovCisjZGVmaW5lIElTX1BBX1RPX1JYMglCSVRfMjgJCS8qIFBhY2tldCBBcmIgVGltZW91dCBSeDIgKi8KKyNkZWZpbmUgSVNfUEFfVE9fVFgxCUJJVF8yNwkJLyogUGFja2V0IEFyYiBUaW1lb3V0IFR4MSAqLworI2RlZmluZSBJU19QQV9UT19UWDIJQklUXzI2CQkvKiBQYWNrZXQgQXJiIFRpbWVvdXQgVHgyICovCisjZGVmaW5lIElTX0kyQ19SRUFEWQlCSVRfMjUJCS8qIElSUSBvbiBlbmQgb2YgSTJDIFR4ICovCisjZGVmaW5lIElTX0lSUV9TVwkJQklUXzI0CQkvKiBTVyBmb3JjZWQgSVJRCSovCisjZGVmaW5lIElTX0VYVF9SRUcJCUJJVF8yMwkJLyogSVJRIGZyb20gTE04MCBvciBQSFkgKEdFTkVTSVMgb25seSkgKi8KKwkJCQkJCQkJCS8qIElSUSBmcm9tIFBIWSAoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgSVNfVElNSU5UCQlCSVRfMjIJCS8qIElSUSBmcm9tIFRpbWVyCSovCisjZGVmaW5lIElTX01BQzEJCQlCSVRfMjEJCS8qIElSUSBmcm9tIE1BQyAxCSovCisjZGVmaW5lIElTX0xOS19TWU5DX00xCUJJVF8yMAkJLyogTGluayBTeW5jIENudCB3cmFwIE1BQyAxICovCisjZGVmaW5lIElTX01BQzIJCQlCSVRfMTkJCS8qIElSUSBmcm9tIE1BQyAyCSovCisjZGVmaW5lIElTX0xOS19TWU5DX00yCUJJVF8xOAkJLyogTGluayBTeW5jIENudCB3cmFwIE1BQyAyICovCisvKiBSZWNlaXZlIFF1ZXVlIDEgKi8KKyNkZWZpbmUgSVNfUjFfQgkJCUJJVF8xNwkJLyogUV9SMSBFbmQgb2YgQnVmZmVyICovCisjZGVmaW5lIElTX1IxX0YJCQlCSVRfMTYJCS8qIFFfUjEgRW5kIG9mIEZyYW1lICovCisjZGVmaW5lIElTX1IxX0MJCQlCSVRfMTUJCS8qIFFfUjEgRW5jb2RpbmcgRXJyb3IgKi8KKy8qIFJlY2VpdmUgUXVldWUgMiAqLworI2RlZmluZSBJU19SMl9CCQkJQklUXzE0CQkvKiBRX1IyIEVuZCBvZiBCdWZmZXIgKi8KKyNkZWZpbmUgSVNfUjJfRgkJCUJJVF8xMwkJLyogUV9SMiBFbmQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgSVNfUjJfQwkJCUJJVF8xMgkJLyogUV9SMiBFbmNvZGluZyBFcnJvciAqLworLyogU3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMSAqLworI2RlZmluZSBJU19YUzFfQgkJQklUXzExCQkvKiBRX1hTMSBFbmQgb2YgQnVmZmVyICovCisjZGVmaW5lIElTX1hTMV9GCQlCSVRfMTAJCS8qIFFfWFMxIEVuZCBvZiBGcmFtZSAqLworI2RlZmluZSBJU19YUzFfQwkJQklUXzkJCS8qIFFfWFMxIEVuY29kaW5nIEVycm9yICovCisvKiBBc3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMSAqLworI2RlZmluZSBJU19YQTFfQgkJQklUXzgJCS8qIFFfWEExIEVuZCBvZiBCdWZmZXIgKi8KKyNkZWZpbmUgSVNfWEExX0YJCUJJVF83CQkvKiBRX1hBMSBFbmQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgSVNfWEExX0MJCUJJVF82CQkvKiBRX1hBMSBFbmNvZGluZyBFcnJvciAqLworLyogU3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMiAqLworI2RlZmluZSBJU19YUzJfQgkJQklUXzUJCS8qIFFfWFMyIEVuZCBvZiBCdWZmZXIgKi8KKyNkZWZpbmUgSVNfWFMyX0YJCUJJVF80CQkvKiBRX1hTMiBFbmQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgSVNfWFMyX0MJCUJJVF8zCQkvKiBRX1hTMiBFbmNvZGluZyBFcnJvciAqLworLyogQXN5bmNocm9ub3VzIFRyYW5zbWl0IFF1ZXVlIDIgKi8KKyNkZWZpbmUgSVNfWEEyX0IJCUJJVF8yCQkvKiBRX1hBMiBFbmQgb2YgQnVmZmVyICovCisjZGVmaW5lIElTX1hBMl9GCQlCSVRfMQkJLyogUV9YQTIgRW5kIG9mIEZyYW1lICovCisjZGVmaW5lIElTX1hBMl9DCQlCSVRfMAkJLyogUV9YQTIgRW5jb2RpbmcgRXJyb3IgKi8KKworCisvKglCMF9IV0VfSVNSQwkJMzIgYml0CUhXIEVycm9yIEludGVycnVwdCBTcmMgUmVnICovCisvKglCMF9IV0VfSU1TSwkJMzIgYml0CUhXIEVycm9yIEludGVycnVwdCBNYXNrIFJlZyAqLworLyoJQjJfSVJRTV9IV0VfTVNLCTMyIGJpdAlJUlEgTW9kZXJhdGlvbiBIVyBFcnJvciBNYXNrICovCisjZGVmaW5lIElTX0VSUl9NU0sJCTB4MDAwMDBmZmZMCS8qIAkJQWxsIEVycm9yIGJpdHMgKi8KKwkJCQkJCQkJLyogQml0IDMxLi4xNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgSVNfSVJRX1RJU1RfT1YJQklUXzEzCS8qIFRpbWUgU3RhbXAgVGltZXIgT3ZlcmZsb3cgKFlVS09OIG9ubHkpICovCisjZGVmaW5lIElTX0lSUV9TRU5TT1IJQklUXzEyCS8qIElSUSBmcm9tIFNlbnNvciAoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgSVNfSVJRX01TVF9FUlIJQklUXzExCS8qIElSUSBtYXN0ZXIgZXJyb3IgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgSVNfSVJRX1NUQVQJCUJJVF8xMAkvKiBJUlEgc3RhdHVzIGV4Y2VwdGlvbiAqLworI2RlZmluZSBJU19OT19TVEFUX00xCUJJVF85CS8qIE5vIFJ4IFN0YXR1cyBmcm9tIE1BQyAxICovCisjZGVmaW5lIElTX05PX1NUQVRfTTIJQklUXzgJLyogTm8gUnggU3RhdHVzIGZyb20gTUFDIDIgKi8KKyNkZWZpbmUgSVNfTk9fVElTVF9NMQlCSVRfNwkvKiBObyBUaW1lIFN0YW1wIGZyb20gTUFDIDEgKi8KKyNkZWZpbmUgSVNfTk9fVElTVF9NMglCSVRfNgkvKiBObyBUaW1lIFN0YW1wIGZyb20gTUFDIDIgKi8KKyNkZWZpbmUgSVNfUkFNX1JEX1BBUglCSVRfNQkvKiBSQU0gUmVhZCAgUGFyaXR5IEVycm9yICovCisjZGVmaW5lIElTX1JBTV9XUl9QQVIJQklUXzQJLyogUkFNIFdyaXRlIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBJU19NMV9QQVJfRVJSCUJJVF8zCS8qIE1BQyAxIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBJU19NMl9QQVJfRVJSCUJJVF8yCS8qIE1BQyAyIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBJU19SMV9QQVJfRVJSCUJJVF8xCS8qIFF1ZXVlIFIxIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBJU19SMl9QQVJfRVJSCUJJVF8wCS8qIFF1ZXVlIFIyIFBhcml0eSBFcnJvciAqLworCisvKglCMl9DT05OX1RZUAkJIDggYml0CUNvbm5lY3RvciB0eXBlICovCisvKglCMl9QTURfVFlQCQkgOCBiaXQJUE1EIHR5cGUgKi8KKy8qCVZhbHVlcyBvZiBjb25uZWN0b3IgYW5kIFBNRCB0eXBlIGNvbXBseSB0byBTeXNLb25uZWN0IGludGVybmFsIHN0ZCAqLworCisvKglCMl9NQUNfQ0ZHCQkgOCBiaXQJTUFDIENvbmZpZ3VyYXRpb24gLyBDaGlwIFJldmlzaW9uICovCisjZGVmaW5lIENGR19DSElQX1JfTVNLCSgweGY8PDQpCS8qIEJpdCA3Li4gNDogQ2hpcCBSZXZpc2lvbiAqLworCQkJCQkJCQkJLyogQml0IDMuLiAyOglyZXNlcnZlZCAqLworI2RlZmluZSBDRkdfRElTX00yX0NMSwlCSVRfMVMJCS8qIERpc2FibGUgQ2xvY2sgZm9yIDJuZCBNQUMgKi8KKyNkZWZpbmUgQ0ZHX1NOR19NQUMJCUJJVF8wUwkJLyogTUFDIENvbmZpZzogMD0yIE1BQ3MgLyAxPTEgTUFDKi8KKworLyoJQjJfQ0hJUF9JRAkJIDggYml0IAlDaGlwIElkZW50aWZpY2F0aW9uIE51bWJlciAqLworI2RlZmluZSBDSElQX0lEX0dFTkVTSVMJCTB4MGEJLyogQ2hpcCBJRCBmb3IgR0VORVNJUyAqLworI2RlZmluZSBDSElQX0lEX1lVS09OCQkweGIwCS8qIENoaXAgSUQgZm9yIFlVS09OICovCisjZGVmaW5lIENISVBfSURfWVVLT05fTElURQkweGIxCS8qIENoaXAgSUQgZm9yIFlVS09OLUxpdGUgKFJldi4gQTEtQTMpICovCisjZGVmaW5lIENISVBfSURfWVVLT05fTFAJMHhiMgkvKiBDaGlwIElEIGZvciBZVUtPTi1MUCAqLworCisjZGVmaW5lIENISVBfUkVWX1lVX0xJVEVfQTEJMwkJLyogQ2hpcCBSZXYuIGZvciBZVUtPTi1MaXRlIEExLEEyICovCisjZGVmaW5lIENISVBfUkVWX1lVX0xJVEVfQTMJNwkJLyogQ2hpcCBSZXYuIGZvciBZVUtPTi1MaXRlIEEzICovCisKKy8qCUIyX0ZBUgkJCTMyIGJpdAlGbGFzaC1Qcm9tIEFkZHIgUmVnL0NudCAqLworI2RlZmluZSBGQVJfQUREUgkJMHgxZmZmZkwJLyogQml0IDE2Li4gMDoJRlBST00gQWRkcmVzcyBtYXNrICovCisKKy8qCUIyX0xEX0NUUkwJCSA4IGJpdAlFUFJPTSBsb2FkZXIgY29udHJvbCByZWdpc3RlciAqLworLyoJQml0cyBhcmUgY3VycmVudGx5IHJlc2VydmVkICovCisKKy8qCUIyX0xEX1RFU1QJCSA4IGJpdAlFUFJPTSBsb2FkZXIgdGVzdCByZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgNy4uIDQ6CXJlc2VydmVkICovCisjZGVmaW5lIExEX1RfT04JCQlCSVRfM1MJLyogTG9hZGVyIFRlc3QgbW9kZSBvbiAqLworI2RlZmluZSBMRF9UX09GRgkJQklUXzJTCS8qIExvYWRlciBUZXN0IG1vZGUgb2ZmICovCisjZGVmaW5lIExEX1RfU1RFUAkJQklUXzFTCS8qIERlY3JlbWVudCBGUFJPTSBhZGRyLiBDb3VudGVyICovCisjZGVmaW5lIExEX1NUQVJUCQlCSVRfMFMJLyogU3RhcnQgbG9hZGluZyBGUFJPTSAqLworCisvKgorICoJVGltZXIgU2VjdGlvbgorICovCisvKglCMl9USV9DVFJMCQkgOCBiaXQJVGltZXIgY29udHJvbCAqLworLyoJQjJfSVJRTV9DVFJMCSA4IGJpdAlJUlEgTW9kZXJhdGlvbiBUaW1lciBDb250cm9sICovCisJCQkJCQkJCS8qIEJpdCA3Li4gMzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVElNX1NUQVJUCQlCSVRfMlMJLyogU3RhcnQgVGltZXIgKi8KKyNkZWZpbmUgVElNX1NUT1AJCUJJVF8xUwkvKiBTdG9wICBUaW1lciAqLworI2RlZmluZSBUSU1fQ0xSX0lSUQkJQklUXzBTCS8qIENsZWFyIFRpbWVyIElSUSAoIUlSUU0pICovCisKKy8qCUIyX1RJX1RFU1QJCSA4IEJpdAlUaW1lciBUZXN0ICovCisvKglCMl9JUlFNX1RFU1QJIDggYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIFRlc3QgKi8KKy8qCUIyOF9EUFRfVFNUCQkgOCBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIFRlc3QgUmVnICovCisJCQkJCQkJCS8qIEJpdCA3Li4gMzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVElNX1RfT04JCUJJVF8yUwkvKiBUZXN0IG1vZGUgb24gKi8KKyNkZWZpbmUgVElNX1RfT0ZGCQlCSVRfMVMJLyogVGVzdCBtb2RlIG9mZiAqLworI2RlZmluZSBUSU1fVF9TVEVQCQlCSVRfMFMJLyogVGVzdCBzdGVwICovCisKKy8qCUIyOF9EUFRfSU5JCTMyIGJpdAlEZXNjcmlwdG9yIFBvbGwgVGltZXIgSW5pdCBWYWwgKi8KKy8qCUIyOF9EUFRfVkFMCTMyIGJpdAlEZXNjcmlwdG9yIFBvbGwgVGltZXIgQ3VyciBWYWwgKi8KKwkJCQkJCQkJLyogQml0IDMxLi4yNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRFBUX01TSwkJMHgwMGZmZmZmZkwJLyogQml0IDIzLi4gMDoJRGVzYyBQb2xsIFRpbWVyIEJpdHMgKi8KKworLyoJQjI4X0RQVF9DVFJMCSA4IGJpdAlEZXNjcmlwdG9yIFBvbGwgVGltZXIgQ3RybCBSZWcgKi8KKwkJCQkJCQkJLyogQml0ICA3Li4gMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRFBUX1NUQVJUCQlCSVRfMVMJLyogU3RhcnQgRGVzY3JpcHRvciBQb2xsIFRpbWVyICovCisjZGVmaW5lIERQVF9TVE9QCQlCSVRfMFMJLyogU3RvcCAgRGVzY3JpcHRvciBQb2xsIFRpbWVyICovCisKKy8qCUIyX0VfMwkJCSA4IGJpdCAJbG93ZXIgNCBiaXRzIHVzZWQgZm9yIEhXIHNlbGYgdGVzdCByZXN1bHQgKi8KKyNkZWZpbmUgQjJfRTNfUkVTX01BU0sJMHgwZgorCisvKglCMl9UU1RfQ1RSTDEJIDggYml0CVRlc3QgQ29udHJvbCBSZWdpc3RlciAxICovCisjZGVmaW5lIFRTVF9GUkNfRFBFUlJfTVIJQklUXzdTCS8qIGZvcmNlIERBVEFQRVJSIG9uIE1TVCBSRCAqLworI2RlZmluZSBUU1RfRlJDX0RQRVJSX01XCUJJVF82UwkvKiBmb3JjZSBEQVRBUEVSUiBvbiBNU1QgV1IgKi8KKyNkZWZpbmUgVFNUX0ZSQ19EUEVSUl9UUglCSVRfNVMJLyogZm9yY2UgREFUQVBFUlIgb24gVFJHIFJEICovCisjZGVmaW5lIFRTVF9GUkNfRFBFUlJfVFcJQklUXzRTCS8qIGZvcmNlIERBVEFQRVJSIG9uIFRSRyBXUiAqLworI2RlZmluZSBUU1RfRlJDX0FQRVJSX00JCUJJVF8zUwkvKiBmb3JjZSBBRERSUEVSUiBvbiBNU1QgKi8KKyNkZWZpbmUgVFNUX0ZSQ19BUEVSUl9UCQlCSVRfMlMJLyogZm9yY2UgQUREUlBFUlIgb24gVFJHICovCisjZGVmaW5lIFRTVF9DRkdfV1JJVEVfT04JQklUXzFTCS8qIEVuYWJsZSAgQ29uZmlnIFJlZyBXUiAqLworI2RlZmluZSBUU1RfQ0ZHX1dSSVRFX09GRglCSVRfMFMJLyogRGlzYWJsZSBDb25maWcgUmVnIFdSICovCisKKy8qCUIyX1RTVF9DVFJMMgkgOCBiaXQJVGVzdCBDb250cm9sIFJlZ2lzdGVyIDIgKi8KKwkJCQkJCQkJCS8qIEJpdCA3Li4gNDoJcmVzZXJ2ZWQgKi8KKwkJCS8qIGZvcmNlIHRoZSBmb2xsb3dpbmcgZXJyb3Igb24gdGhlIG5leHQgbWFzdGVyIHJlYWQvd3JpdGUJKi8KKyNkZWZpbmUgVFNUX0ZSQ19EUEVSUl9NUjY0CUJJVF8zUwkvKiBEYXRhUEVSUiBSRCA2NAkqLworI2RlZmluZSBUU1RfRlJDX0RQRVJSX01XNjQJQklUXzJTCS8qIERhdGFQRVJSIFdSIDY0CSovCisjZGVmaW5lIFRTVF9GUkNfQVBFUlJfMU02NAlCSVRfMVMJLyogQWRkclBFUlIgb24gMS4gcGhhc2UgKi8KKyNkZWZpbmUgVFNUX0ZSQ19BUEVSUl8yTTY0CUJJVF8wUwkvKiBBZGRyUEVSUiBvbiAyLiBwaGFzZSAqLworCisvKglCMl9HUF9JTwkJMzIgYml0CUdlbmVyYWwgUHVycG9zZSBJL08gUmVnaXN0ZXIgKi8KKwkJCQkJCQkvKiBCaXQgMzEuLjI2OglyZXNlcnZlZCAqLworI2RlZmluZSBHUF9ESVJfOQlCSVRfMjUJLyogSU9fOSBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KKyNkZWZpbmUgR1BfRElSXzgJQklUXzI0CS8qIElPXzggZGlyZWN0LCAwPUluLzE9T3V0ICovCisjZGVmaW5lIEdQX0RJUl83CUJJVF8yMwkvKiBJT183IGRpcmVjdCwgMD1Jbi8xPU91dCAqLworI2RlZmluZSBHUF9ESVJfNglCSVRfMjIJLyogSU9fNiBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KKyNkZWZpbmUgR1BfRElSXzUJQklUXzIxCS8qIElPXzUgZGlyZWN0LCAwPUluLzE9T3V0ICovCisjZGVmaW5lIEdQX0RJUl80CUJJVF8yMAkvKiBJT180IGRpcmVjdCwgMD1Jbi8xPU91dCAqLworI2RlZmluZSBHUF9ESVJfMwlCSVRfMTkJLyogSU9fMyBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KKyNkZWZpbmUgR1BfRElSXzIJQklUXzE4CS8qIElPXzIgZGlyZWN0LCAwPUluLzE9T3V0ICovCisjZGVmaW5lIEdQX0RJUl8xCUJJVF8xNwkvKiBJT18xIGRpcmVjdCwgMD1Jbi8xPU91dCAqLworI2RlZmluZSBHUF9ESVJfMAlCSVRfMTYJLyogSU9fMCBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KKwkJCQkJCS8qIEJpdCAxNS4uMTA6CXJlc2VydmVkICovCisjZGVmaW5lIEdQX0lPXzkJCUJJVF85CS8qIElPXzkgcGluICovCisjZGVmaW5lIEdQX0lPXzgJCUJJVF84CS8qIElPXzggcGluICovCisjZGVmaW5lIEdQX0lPXzcJCUJJVF83CS8qIElPXzcgcGluICovCisjZGVmaW5lIEdQX0lPXzYJCUJJVF82CS8qIElPXzYgcGluICovCisjZGVmaW5lIEdQX0lPXzUJCUJJVF81CS8qIElPXzUgcGluICovCisjZGVmaW5lIEdQX0lPXzQJCUJJVF80CS8qIElPXzQgcGluICovCisjZGVmaW5lIEdQX0lPXzMJCUJJVF8zCS8qIElPXzMgcGluICovCisjZGVmaW5lIEdQX0lPXzIJCUJJVF8yCS8qIElPXzIgcGluICovCisjZGVmaW5lIEdQX0lPXzEJCUJJVF8xCS8qIElPXzEgcGluICovCisjZGVmaW5lIEdQX0lPXzAJCUJJVF8wCS8qIElPXzAgcGluICovCisKKy8qCUIyX0kyQ19DVFJMCQkzMiBiaXQJSTJDIEhXIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSTJDX0ZMQUcJCUJJVF8zMQkJLyogU3RhcnQgcmVhZC93cml0ZSBpZiBXUiAqLworI2RlZmluZSBJMkNfQUREUgkJKDB4N2ZmZkw8PDE2KQkvKiBCaXQgMzAuLjE2OglBZGRyIHRvIGJlIFJEL1dSICovCisjZGVmaW5lIEkyQ19ERVZfU0VMCQkoMHg3Zkw8PDkpCQkvKiBCaXQgMTUuLiA5OglJMkMgRGV2aWNlIFNlbGVjdCAqLworCQkJCQkJCQkvKiBCaXQJOC4uIDU6CXJlc2VydmVkCSovCisjZGVmaW5lIEkyQ19CVVJTVF9MRU4JQklUXzQJCS8qIEJ1cnN0IExlbiwgMS80IGJ5dGVzICovCisjZGVmaW5lIEkyQ19ERVZfU0laRQkoNzw8MSkJCS8qIEJpdAkzLi4gMToJSTJDIERldmljZSBTaXplCSovCisjZGVmaW5lIEkyQ18wMjVLX0RFVgkoMDw8MSkJCS8qCQkwOiAyNTYgQnl0ZXMgb3Igc21hbC4gKi8KKyNkZWZpbmUgSTJDXzA1S19ERVYJCSgxPDwxKQkJLyogCQkxOiA1MTIJQnl0ZXMJKi8KKyNkZWZpbmUgSTJDXzFLX0RFVgkJKDI8PDEpCQkvKgkJMjogMTAyNCBCeXRlcwkqLworI2RlZmluZSBJMkNfMktfREVWCQkoMzw8MSkJCS8qCQkzOiAyMDQ4CUJ5dGVzCSovCisjZGVmaW5lIEkyQ180S19ERVYJCSg0PDwxKQkJLyoJCTQ6IDQwOTYgQnl0ZXMJKi8KKyNkZWZpbmUgSTJDXzhLX0RFVgkJKDU8PDEpCQkvKgkJNTogODE5MiBCeXRlcwkqLworI2RlZmluZSBJMkNfMTZLX0RFVgkJKDY8PDEpCQkvKgkJNjogMTYzODQgQnl0ZXMJKi8KKyNkZWZpbmUgSTJDXzMyS19ERVYJCSg3PDwxKQkJLyoJCTc6IDMyNzY4IEJ5dGVzCSovCisjZGVmaW5lIEkyQ19TVE9QCQlCSVRfMAkJLyogSW50ZXJydXB0IEkyQyB0cmFuc2ZlciAqLworCisvKglCMl9JMkNfSVJRCQkzMiBiaXQJSTJDIEhXIElSUSBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMzEuLiAxCXJlc2VydmVkICovCisjZGVmaW5lIEkyQ19DTFJfSVJRCQlCSVRfMAkvKiBDbGVhciBJMkMgSVJRICovCisKKy8qCUIyX0kyQ19TVwkJMzIgYml0ICg4IGJpdCBhY2Nlc3MpCUkyQyBIVyBTVyBQb3J0IFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAgNy4uIDM6CXJlc2VydmVkICovCisjZGVmaW5lIEkyQ19EQVRBX0RJUglCSVRfMlMJCS8qIGRpcmVjdGlvbiBvZiBJMkNfREFUQSAqLworI2RlZmluZSBJMkNfREFUQQkJQklUXzFTCQkvKiBJMkMgRGF0YSBQb3J0CSovCisjZGVmaW5lIEkyQ19DTEsJCQlCSVRfMFMJCS8qIEkyQyBDbG9jayBQb3J0CSovCisKKy8qCisgKiBJMkMgQWRkcmVzcworICovCisjZGVmaW5lIEkyQ19TRU5TX0FERFIJTE04MF9BRERSCS8qIEkyQyBTZW5zb3IgQWRkcmVzcywgKFZvbHQgYW5kIFRlbXApKi8KKworCisvKglCMl9CU0NfQ1RSTAkJIDggYml0CUJsaW5rIFNvdXJjZSBDb3VudGVyIENvbnRyb2wgKi8KKwkJCQkJCQkvKiBCaXQgIDcuLiAyOglyZXNlcnZlZCAqLworI2RlZmluZSBCU0NfU1RBUlQJQklUXzFTCQkvKiBTdGFydCBCbGluayBTb3VyY2UgQ291bnRlciAqLworI2RlZmluZSBCU0NfU1RPUAlCSVRfMFMJCS8qIFN0b3AgIEJsaW5rIFNvdXJjZSBDb3VudGVyICovCisKKy8qCUIyX0JTQ19TVEFUCQkgOCBiaXQJQmxpbmsgU291cmNlIENvdW50ZXIgU3RhdHVzICovCisJCQkJCQkJLyogQml0ICA3Li4gMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQlNDX1NSQwkJQklUXzBTCQkvKiBCbGluayBTb3VyY2UsIDA9T2ZmIC8gMT1PbiAqLworCisvKglCMl9CU0NfVFNUCQkxNiBiaXQJQmxpbmsgU291cmNlIENvdW50ZXIgVGVzdCBSZWcgKi8KKyNkZWZpbmUgQlNDX1RfT04JQklUXzJTCQkvKiBUZXN0IG1vZGUgb24gKi8KKyNkZWZpbmUgQlNDX1RfT0ZGCUJJVF8xUwkJLyogVGVzdCBtb2RlIG9mZiAqLworI2RlZmluZSBCU0NfVF9TVEVQCUJJVF8wUwkJLyogVGVzdCBzdGVwICovCisKKworLyoJQjNfUkFNX0FERFIJCTMyIGJpdAlSQU0gQWRkcmVzcywgdG8gcmVhZCBvciB3cml0ZSAqLworCQkJCQkvKiBCaXQgMzEuLjE5OglyZXNlcnZlZCAqLworI2RlZmluZSBSQU1fQURSX1JBTgkweDAwMDdmZmZmTAkvKiBCaXQgMTguLiAwOglSQU0gQWRkcmVzcyBSYW5nZSAqLworCisvKiBSQU0gSW50ZXJmYWNlIFJlZ2lzdGVycyAqLworLyoJQjNfUklfQ1RSTAkJMTYgYml0CVJBTSBJZmFjZSBDb250cm9sIFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNS4uMTA6CXJlc2VydmVkICovCisjZGVmaW5lIFJJX0NMUl9SRF9QRVJSCUJJVF85UwkvKiBDbGVhciBJUlEgUkFNIFJlYWQgUGFyaXR5IEVyciAqLworI2RlZmluZSBSSV9DTFJfV1JfUEVSUglCSVRfOFMJLyogQ2xlYXIgSVJRIFJBTSBXcml0ZSBQYXJpdHkgRXJyKi8KKwkJCQkJCQkJLyogQml0CTcuLiAyOglyZXNlcnZlZCAqLworI2RlZmluZSBSSV9SU1RfQ0xSCQlCSVRfMVMJLyogQ2xlYXIgUkFNIEludGVyZmFjZSBSZXNldCAqLworI2RlZmluZSBSSV9SU1RfU0VUCQlCSVRfMFMJLyogU2V0ICAgUkFNIEludGVyZmFjZSBSZXNldCAqLworCisvKglCM19SSV9URVNUCQkgOCBiaXQJUkFNIElmYWNlIFRlc3QgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDE1Li4gNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUklfVF9FVgkJCUJJVF8zUwkvKiBUaW1lb3V0IEV2ZW50IG9jY3VyZWQgKi8KKyNkZWZpbmUgUklfVF9PTgkJCUJJVF8yUwkvKiBUaW1lb3V0IFRpbWVyIFRlc3QgT24gKi8KKyNkZWZpbmUgUklfVF9PRkYJCUJJVF8xUwkvKiBUaW1lb3V0IFRpbWVyIFRlc3QgT2ZmICovCisjZGVmaW5lIFJJX1RfU1RFUAkJQklUXzBTCS8qIFRpbWVvdXQgVGltZXIgU3RlcCAqLworCisvKiBNQUMgQXJiaXRlciBSZWdpc3RlcnMgKi8KKy8qCUIzX01BX1RPX0NUUkwJMTYgYml0CU1BQyBBcmJpdGVyIFRpbWVvdXQgQ3RybCBSZWcgKi8KKwkJCQkJCQkJLyogQml0IDE1Li4gNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUFfRk9FX09OCQlCSVRfM1MJLyogWE1BQyBGYXN0IE91dHB1dCBFbmFibGUgT04gKi8KKyNkZWZpbmUgTUFfRk9FX09GRgkJQklUXzJTCS8qIFhNQUMgRmFzdCBPdXRwdXQgRW5hYmxlIE9GRiAqLworI2RlZmluZSBNQV9SU1RfQ0xSCQlCSVRfMVMJLyogQ2xlYXIgTUFDIEFyYml0ZXIgUmVzZXQgKi8KKyNkZWZpbmUgTUFfUlNUX1NFVAkJQklUXzBTCS8qIFNldCAgIE1BQyBBcmJpdGVyIFJlc2V0ICovCisKKy8qCUIzX01BX1JDX0NUUkwJMTYgYml0CU1BQyBBcmJpdGVyIFJlY292ZXJ5IEN0cmwgUmVnICovCisJCQkJCQkJCS8qIEJpdCAxNS4uIDg6CXJlc2VydmVkICovCisjZGVmaW5lIE1BX0VOQV9SRUNfVFgyCUJJVF83UwkvKiBFbmFibGUgIFJlY292ZXJ5IFRpbWVyIFRYMiAqLworI2RlZmluZSBNQV9ESVNfUkVDX1RYMglCSVRfNlMJLyogRGlzYWJsZSBSZWNvdmVyeSBUaW1lciBUWDIgKi8KKyNkZWZpbmUgTUFfRU5BX1JFQ19UWDEJQklUXzVTCS8qIEVuYWJsZSAgUmVjb3ZlcnkgVGltZXIgVFgxICovCisjZGVmaW5lIE1BX0RJU19SRUNfVFgxCUJJVF80UwkvKiBEaXNhYmxlIFJlY292ZXJ5IFRpbWVyIFRYMSAqLworI2RlZmluZSBNQV9FTkFfUkVDX1JYMglCSVRfM1MJLyogRW5hYmxlICBSZWNvdmVyeSBUaW1lciBSWDIgKi8KKyNkZWZpbmUgTUFfRElTX1JFQ19SWDIJQklUXzJTCS8qIERpc2FibGUgUmVjb3ZlcnkgVGltZXIgUlgyICovCisjZGVmaW5lIE1BX0VOQV9SRUNfUlgxCUJJVF8xUwkvKiBFbmFibGUgIFJlY292ZXJ5IFRpbWVyIFJYMSAqLworI2RlZmluZSBNQV9ESVNfUkVDX1JYMQlCSVRfMFMJLyogRGlzYWJsZSBSZWNvdmVyeSBUaW1lciBSWDEgKi8KKworLyogUGFja2V0IEFyYml0ZXIgUmVnaXN0ZXJzICovCisvKglCM19QQV9DVFJMCQkxNiBiaXQJUGFja2V0IEFyYml0ZXIgQ3RybCBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMTUuLjE0OglyZXNlcnZlZCAqLworI2RlZmluZSBQQV9DTFJfVE9fVFgyCUJJVF8xM1MJLyogQ2xlYXIgSVJRIFBhY2tldCBUaW1lb3V0IFRYMiAqLworI2RlZmluZSBQQV9DTFJfVE9fVFgxCUJJVF8xMlMJLyogQ2xlYXIgSVJRIFBhY2tldCBUaW1lb3V0IFRYMSAqLworI2RlZmluZSBQQV9DTFJfVE9fUlgyCUJJVF8xMVMJLyogQ2xlYXIgSVJRIFBhY2tldCBUaW1lb3V0IFJYMiAqLworI2RlZmluZSBQQV9DTFJfVE9fUlgxCUJJVF8xMFMJLyogQ2xlYXIgSVJRIFBhY2tldCBUaW1lb3V0IFJYMSAqLworI2RlZmluZSBQQV9FTkFfVE9fVFgyCUJJVF85UwkvKiBFbmFibGUgIFRpbWVvdXQgVGltZXIgVFgyICovCisjZGVmaW5lIFBBX0RJU19UT19UWDIJQklUXzhTCS8qIERpc2FibGUgVGltZW91dCBUaW1lciBUWDIgKi8KKyNkZWZpbmUgUEFfRU5BX1RPX1RYMQlCSVRfN1MJLyogRW5hYmxlICBUaW1lb3V0IFRpbWVyIFRYMSAqLworI2RlZmluZSBQQV9ESVNfVE9fVFgxCUJJVF82UwkvKiBEaXNhYmxlIFRpbWVvdXQgVGltZXIgVFgxICovCisjZGVmaW5lIFBBX0VOQV9UT19SWDIJQklUXzVTCS8qIEVuYWJsZSAgVGltZW91dCBUaW1lciBSWDIgKi8KKyNkZWZpbmUgUEFfRElTX1RPX1JYMglCSVRfNFMJLyogRGlzYWJsZSBUaW1lb3V0IFRpbWVyIFJYMiAqLworI2RlZmluZSBQQV9FTkFfVE9fUlgxCUJJVF8zUwkvKiBFbmFibGUgIFRpbWVvdXQgVGltZXIgUlgxICovCisjZGVmaW5lIFBBX0RJU19UT19SWDEJQklUXzJTCS8qIERpc2FibGUgVGltZW91dCBUaW1lciBSWDEgKi8KKyNkZWZpbmUgUEFfUlNUX0NMUgkJQklUXzFTCS8qIENsZWFyIE1BQyBBcmJpdGVyIFJlc2V0ICovCisjZGVmaW5lIFBBX1JTVF9TRVQJCUJJVF8wUwkvKiBTZXQgICBNQUMgQXJiaXRlciBSZXNldCAqLworCisjZGVmaW5lIFBBX0VOQV9UT19BTEwJKFBBX0VOQV9UT19SWDEgfCBQQV9FTkFfVE9fUlgyIHxcCisJCQkJCQlQQV9FTkFfVE9fVFgxIHwgUEFfRU5BX1RPX1RYMikKKworLyogUngvVHggUGF0aCByZWxhdGVkIEFyYml0ZXIgVGVzdCBSZWdpc3RlcnMgKi8KKy8qCUIzX01BX1RPX1RFU1QJMTYgYml0CU1BQyBBcmJpdGVyIFRpbWVvdXQgVGVzdCBSZWcgKi8KKy8qCUIzX01BX1JDX1RFU1QJMTYgYml0CU1BQyBBcmJpdGVyIFJlY292ZXJ5IFRlc3QgUmVnICovCisvKglCM19QQV9URVNUCQkxNiBiaXQJUGFja2V0IEFyYml0ZXIgVGVzdCBSZWdpc3RlciAqLworLyoJCQlCaXQgMTUsIDExLCA3LCBhbmQgMyBhcmUgcmVzZXJ2ZWQgaW4gQjNfUEFfVEVTVCAqLworI2RlZmluZSBUWDJfVF9FVglCSVRfMTVTCQkvKiBUWDIgVGltZW91dC9SZWN2IEV2ZW50IG9jY3VyZWQgKi8KKyNkZWZpbmUgVFgyX1RfT04JQklUXzE0UwkJLyogVFgyIFRpbWVvdXQvUmVjdiBUaW1lciBUZXN0IE9uICovCisjZGVmaW5lIFRYMl9UX09GRglCSVRfMTNTCQkvKiBUWDIgVGltZW91dC9SZWN2IFRpbWVyIFRzdCBPZmYgKi8KKyNkZWZpbmUgVFgyX1RfU1RFUAlCSVRfMTJTCQkvKiBUWDIgVGltZW91dC9SZWN2IFRpbWVyIFN0ZXAgKi8KKyNkZWZpbmUgVFgxX1RfRVYJQklUXzExUwkJLyogVFgxIFRpbWVvdXQvUmVjdiBFdmVudCBvY2N1cmVkICovCisjZGVmaW5lIFRYMV9UX09OCUJJVF8xMFMJCS8qIFRYMSBUaW1lb3V0L1JlY3YgVGltZXIgVGVzdCBPbiAqLworI2RlZmluZSBUWDFfVF9PRkYJQklUXzlTCQkvKiBUWDEgVGltZW91dC9SZWN2IFRpbWVyIFRzdCBPZmYgKi8KKyNkZWZpbmUgVFgxX1RfU1RFUAlCSVRfOFMJCS8qIFRYMSBUaW1lb3V0L1JlY3YgVGltZXIgU3RlcCAqLworI2RlZmluZSBSWDJfVF9FVglCSVRfN1MJCS8qIFJYMiBUaW1lb3V0L1JlY3YgRXZlbnQgb2NjdXJlZCAqLworI2RlZmluZSBSWDJfVF9PTglCSVRfNlMJCS8qIFJYMiBUaW1lb3V0L1JlY3YgVGltZXIgVGVzdCBPbiAqLworI2RlZmluZSBSWDJfVF9PRkYJQklUXzVTCQkvKiBSWDIgVGltZW91dC9SZWN2IFRpbWVyIFRzdCBPZmYgKi8KKyNkZWZpbmUgUlgyX1RfU1RFUAlCSVRfNFMJCS8qIFJYMiBUaW1lb3V0L1JlY3YgVGltZXIgU3RlcCAqLworI2RlZmluZSBSWDFfVF9FVglCSVRfM1MJCS8qIFJYMSBUaW1lb3V0L1JlY3YgRXZlbnQgb2NjdXJlZCAqLworI2RlZmluZSBSWDFfVF9PTglCSVRfMlMJCS8qIFJYMSBUaW1lb3V0L1JlY3YgVGltZXIgVGVzdCBPbiAqLworI2RlZmluZSBSWDFfVF9PRkYJQklUXzFTCQkvKiBSWDEgVGltZW91dC9SZWN2IFRpbWVyIFRzdCBPZmYgKi8KKyNkZWZpbmUgUlgxX1RfU1RFUAlCSVRfMFMJCS8qIFJYMSBUaW1lb3V0L1JlY3YgVGltZXIgU3RlcCAqLworCisKKy8qIFRyYW5zbWl0IEFyYml0ZXIgUmVnaXN0ZXJzIE1BQyAxIGFuZCAyLCB1c2UgTVJfQUREUigpIHRvIGFjY2VzcyAqLworLyoJVFhBX0lUSV9JTkkJCTMyIGJpdAlUeCBBcmIgSW50ZXJ2YWwgVGltZXIgSW5pdCBWYWwgKi8KKy8qCVRYQV9JVElfVkFMCQkzMiBiaXQJVHggQXJiIEludGVydmFsIFRpbWVyIFZhbHVlICovCisvKglUWEFfTElNX0lOSQkJMzIgYml0CVR4IEFyYiBMaW1pdCBDb3VudGVyIEluaXQgVmFsICovCisvKglUWEFfTElNX1ZBTAkJMzIgYml0CVR4IEFyYiBMaW1pdCBDb3VudGVyIFZhbHVlICovCisJCQkJCQkJCS8qIEJpdCAzMS4uMjQ6CXJlc2VydmVkICovCisjZGVmaW5lIFRYQV9NQVhfVkFMCTB4MDBmZmZmZmZVTC8qIEJpdCAyMy4uIDA6CU1heCBUWEEgVGltZXIvQ250IFZhbCAqLworCisvKglUWEFfQ1RSTAkJIDggYml0CVR4IEFyYml0ZXIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBUWEFfRU5BX0ZTWU5DCUJJVF83UwkvKiBFbmFibGUgIGZvcmNlIG9mIHN5bmMgVHggcXVldWUgKi8KKyNkZWZpbmUgVFhBX0RJU19GU1lOQwlCSVRfNlMJLyogRGlzYWJsZSBmb3JjZSBvZiBzeW5jIFR4IHF1ZXVlICovCisjZGVmaW5lIFRYQV9FTkFfQUxMT0MJQklUXzVTCS8qIEVuYWJsZSAgYWxsb2Mgb2YgZnJlZSBiYW5kd2lkdGggKi8KKyNkZWZpbmUgVFhBX0RJU19BTExPQwlCSVRfNFMJLyogRGlzYWJsZSBhbGxvYyBvZiBmcmVlIGJhbmR3aWR0aCAqLworI2RlZmluZSBUWEFfU1RBUlRfUkMJQklUXzNTCS8qIFN0YXJ0IHN5bmMgUmF0ZSBDb250cm9sICovCisjZGVmaW5lIFRYQV9TVE9QX1JDCQlCSVRfMlMJLyogU3RvcCAgc3luYyBSYXRlIENvbnRyb2wgKi8KKyNkZWZpbmUgVFhBX0VOQV9BUkIJCUJJVF8xUwkvKiBFbmFibGUgIFR4IEFyYml0ZXIgKi8KKyNkZWZpbmUgVFhBX0RJU19BUkIJCUJJVF8wUwkvKiBEaXNhYmxlIFR4IEFyYml0ZXIgKi8KKworLyoJVFhBX1RFU1QJCSA4IGJpdAlUeCBBcmJpdGVyIFRlc3QgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDcuLiA2OglyZXNlcnZlZCAqLworI2RlZmluZSBUWEFfSU5UX1RfT04JQklUXzVTCS8qIFR4IEFyYiBJbnRlcnZhbCBUaW1lciBUZXN0IE9uICovCisjZGVmaW5lIFRYQV9JTlRfVF9PRkYJQklUXzRTCS8qIFR4IEFyYiBJbnRlcnZhbCBUaW1lciBUZXN0IE9mZiAqLworI2RlZmluZSBUWEFfSU5UX1RfU1RFUAlCSVRfM1MJLyogVHggQXJiIEludGVydmFsIFRpbWVyIFN0ZXAgKi8KKyNkZWZpbmUgVFhBX0xJTV9UX09OCUJJVF8yUwkvKiBUeCBBcmIgTGltaXQgVGltZXIgVGVzdCBPbiAqLworI2RlZmluZSBUWEFfTElNX1RfT0ZGCUJJVF8xUwkvKiBUeCBBcmIgTGltaXQgVGltZXIgVGVzdCBPZmYgKi8KKyNkZWZpbmUgVFhBX0xJTV9UX1NURVAJQklUXzBTCS8qIFR4IEFyYiBMaW1pdCBUaW1lciBTdGVwICovCisKKy8qCVRYQV9TVEFUCQkgOCBiaXQJVHggQXJiaXRlciBTdGF0dXMgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDcuLiAxOglyZXNlcnZlZCAqLworI2RlZmluZSBUWEFfUFJJT19YUwkJQklUXzBTCS8qIHN5bmMgcXVldWUgaGFzIHByaW8gdG8gc2VuZCAqLworCisvKglRX0JDCQkJMzIgYml0CUN1cnJlbnQgQnl0ZSBDb3VudGVyICovCisJCQkJCQkJCS8qIEJpdCAzMS4uMTY6CXJlc2VydmVkICovCisjZGVmaW5lIEJDX01BWAkJCTB4ZmZmZgkvKiBCaXQgMTUuLiAwOglCeXRlIGNvdW50ZXIgKi8KKworLyogQk1VIENvbnRyb2wgU3RhdHVzIFJlZ2lzdGVycyAqLworLyoJQjBfUjFfQ1NSCQkzMiBiaXQJQk1VIEN0cmwvU3RhdCBSeCBRdWV1ZSAxICovCisvKglCMF9SMl9DU1IJCTMyIGJpdAlCTVUgQ3RybC9TdGF0IFJ4IFF1ZXVlIDIgKi8KKy8qCUIwX1hBMV9DU1IJCTMyIGJpdAlCTVUgQ3RybC9TdGF0IFN5bmMgVHggUXVldWUgMSAqLworLyoJQjBfWFMxX0NTUgkJMzIgYml0CUJNVSBDdHJsL1N0YXQgQXN5bmMgVHggUXVldWUgMSAqLworLyoJQjBfWEEyX0NTUgkJMzIgYml0CUJNVSBDdHJsL1N0YXQgU3luYyBUeCBRdWV1ZSAyICovCisvKglCMF9YUzJfQ1NSCQkzMiBiaXQJQk1VIEN0cmwvU3RhdCBBc3luYyBUeCBRdWV1ZSAyICovCisvKglRX0NTUgkJCTMyIGJpdAlCTVUgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDMxLi4yNToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQ1NSX1NWX0lETEUJCUJJVF8yNAkJLyogQk1VIFNNIElkbGUgKi8KKwkJCQkJCQkJLyogQml0IDIzLi4yMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQ1NSX0RFU0NfQ0xSCUJJVF8yMQkJLyogQ2xlYXIgUmVzZXQgZm9yIERlc2NyICovCisjZGVmaW5lIENTUl9ERVNDX1NFVAlCSVRfMjAJCS8qIFNldCAgIFJlc2V0IGZvciBEZXNjciAqLworI2RlZmluZSBDU1JfRklGT19DTFIJQklUXzE5CQkvKiBDbGVhciBSZXNldCBmb3IgRklGTyAqLworI2RlZmluZSBDU1JfRklGT19TRVQJQklUXzE4CQkvKiBTZXQgICBSZXNldCBmb3IgRklGTyAqLworI2RlZmluZSBDU1JfSFBJX1JVTgkJQklUXzE3CQkvKiBSZWxlYXNlIEhQSSBTTSAqLworI2RlZmluZSBDU1JfSFBJX1JTVAkJQklUXzE2CQkvKiBSZXNldCAgIEhQSSBTTSB0byBJZGxlICovCisjZGVmaW5lIENTUl9TVl9SVU4JCUJJVF8xNQkJLyogUmVsZWFzZSBTdXBlcnZpc29yIFNNICovCisjZGVmaW5lIENTUl9TVl9SU1QJCUJJVF8xNAkJLyogUmVzZXQgICBTdXBlcnZpc29yIFNNICovCisjZGVmaW5lIENTUl9EUkVBRF9SVU4JQklUXzEzCQkvKiBSZWxlYXNlIERlc2NyIFJlYWQgU00gKi8KKyNkZWZpbmUgQ1NSX0RSRUFEX1JTVAlCSVRfMTIJCS8qIFJlc2V0ICAgRGVzY3IgUmVhZCBTTSAqLworI2RlZmluZSBDU1JfRFdSSVRFX1JVTglCSVRfMTEJCS8qIFJlbGVhc2UgRGVzY3IgV3JpdGUgU00gKi8KKyNkZWZpbmUgQ1NSX0RXUklURV9SU1QJQklUXzEwCQkvKiBSZXNldCAgIERlc2NyIFdyaXRlIFNNICovCisjZGVmaW5lIENTUl9UUkFOU19SVU4JQklUXzkJCS8qIFJlbGVhc2UgVHJhbnNmZXIgU00gKi8KKyNkZWZpbmUgQ1NSX1RSQU5TX1JTVAlCSVRfOAkJLyogUmVzZXQgICBUcmFuc2ZlciBTTSAqLworI2RlZmluZSBDU1JfRU5BX1BPTAkJQklUXzcJCS8qIEVuYWJsZSAgRGVzY3IgUG9sbGluZyAqLworI2RlZmluZSBDU1JfRElTX1BPTAkJQklUXzYJCS8qIERpc2FibGUgRGVzY3IgUG9sbGluZyAqLworI2RlZmluZSBDU1JfU1RPUAkJQklUXzUJCS8qIFN0b3AgIFJ4L1R4IFF1ZXVlICovCisjZGVmaW5lIENTUl9TVEFSVAkJQklUXzQJCS8qIFN0YXJ0IFJ4L1R4IFF1ZXVlICovCisjZGVmaW5lIENTUl9JUlFfQ0xfUAlCSVRfMwkJLyogKFJ4KQlDbGVhciBQYXJpdHkgSVJRICovCisjZGVmaW5lIENTUl9JUlFfQ0xfQglCSVRfMgkJLyogQ2xlYXIgRU9CIElSUSAqLworI2RlZmluZSBDU1JfSVJRX0NMX0YJQklUXzEJCS8qIENsZWFyIEVPRiBJUlEgKi8KKyNkZWZpbmUgQ1NSX0lSUV9DTF9DCUJJVF8wCQkvKiBDbGVhciBFUlIgSVJRICovCisKKyNkZWZpbmUgQ1NSX1NFVF9SRVNFVAkoQ1NSX0RFU0NfU0VUIHwgQ1NSX0ZJRk9fU0VUIHwgQ1NSX0hQSV9SU1QgfFwKKwkJCQkJCUNTUl9TVl9SU1QgfCBDU1JfRFJFQURfUlNUIHwgQ1NSX0RXUklURV9SU1QgfFwKKwkJCQkJCUNTUl9UUkFOU19SU1QpCisjZGVmaW5lIENTUl9DTFJfUkVTRVQJKENTUl9ERVNDX0NMUiB8IENTUl9GSUZPX0NMUiB8IENTUl9IUElfUlVOIHxcCisJCQkJCQlDU1JfU1ZfUlVOIHwgQ1NSX0RSRUFEX1JVTiB8IENTUl9EV1JJVEVfUlVOIHxcCisJCQkJCQlDU1JfVFJBTlNfUlVOKQorCisvKglRX0YJCQkJMzIgYml0CUZsYWcgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJCS8qIEJpdCAzMS4uMjg6CXJlc2VydmVkICovCisjZGVmaW5lIEZfQUxNX0ZVTEwJCUJJVF8yNwkJLyogUnggRklGTzogYWxtb3N0IGZ1bGwgKi8KKyNkZWZpbmUgRl9FTVBUWQkJCUJJVF8yNwkJLyogVHggRklGTzogZW1wdHkgZmxhZyAqLworI2RlZmluZSBGX0ZJRk9fRU9GCQlCSVRfMjYJCS8qIFRhZyAoRU9GIEZsYWcpIGJpdCBpbiBGSUZPICovCisjZGVmaW5lIEZfV01fUkVBQ0hFRAlCSVRfMjUJCS8qIFdhdGVybWFyayByZWFjaGVkICovCisJCQkJCQkJCQkvKiByZXNlcnZlZCAqLworI2RlZmluZSBGX0ZJRk9fTEVWRUwJKDB4MWZMPDwxNikJLyogQml0IDIzLi4xNjoJIyBvZiBRd29yZHMgaW4gRklGTyAqLworCQkJCQkJCQkJLyogQml0IDE1Li4xMTogCXJlc2VydmVkICovCisjZGVmaW5lIEZfV0FURVJfTUFSSwkweDAwMDdmZkwJLyogQml0IDEwLi4gMDoJV2F0ZXJtYXJrICovCisKKy8qCVFfVDEJCQkzMiBiaXQJVGVzdCBSZWdpc3RlciAxICovCisvKgkJSG9sZHMgZm91ciBTdGF0ZSBNYWNoaW5lIGNvbnRyb2wgQnl0ZXMgKi8KKyNkZWZpbmUgU01fQ1RSTF9TVl9NU0sJKDB4ZmZMPDwyNCkJLyogQml0IDMxLi4yNDoJQ29udHJvbCBTdXBlcnZpc29yIFNNICovCisjZGVmaW5lIFNNX0NUUkxfUkRfTVNLCSgweGZmTDw8MTYpCS8qIEJpdCAyMy4uMTY6CUNvbnRyb2wgUmVhZCBEZXNjIFNNICovCisjZGVmaW5lIFNNX0NUUkxfV1JfTVNLCSgweGZmTDw8OCkJLyogQml0IDE1Li4gODoJQ29udHJvbCBXcml0ZSBEZXNjIFNNICovCisjZGVmaW5lIFNNX0NUUkxfVFJfTVNLCTB4ZmZMCQkvKiBCaXQJNy4uIDA6CUNvbnRyb2wgVHJhbnNmZXIgU00gKi8KKworLyoJUV9UMV9UUgkJCSA4IGJpdAlUZXN0IFJlZ2lzdGVyIDEgVHJhbnNmZXIgU00gKi8KKy8qCVFfVDFfV1IJCQkgOCBiaXQJVGVzdCBSZWdpc3RlciAxIFdyaXRlIERlc2NyaXB0b3IgU00gKi8KKy8qCVFfVDFfUkQJCQkgOCBiaXQJVGVzdCBSZWdpc3RlciAxIFJlYWQgRGVzY3JpcHRvciBTTSAqLworLyoJUV9UMV9TVgkJCSA4IGJpdAlUZXN0IFJlZ2lzdGVyIDEgU3VwZXJ2aXNvciBTTSAqLworCisvKiBUaGUgY29udHJvbCBzdGF0dXMgYnl0ZSBvZiBlYWNoIG1hY2hpbmUgbG9va3MgbGlrZSAuLi4gKi8KKyNkZWZpbmUgU01fU1RBVEUJCTB4ZjAJLyogQml0IDcuLiA0OglTdGF0ZSB3aGljaCBzaGFsbCBiZSBsb2FkZWQgKi8KKyNkZWZpbmUgU01fTE9BRAkJCUJJVF8zUwkvKiBMb2FkIHRoZSBTTSB3aXRoIFNNX1NUQVRFICovCisjZGVmaW5lIFNNX1RFU1RfT04JCUJJVF8yUwkvKiBTd2l0Y2ggb24gU00gVGVzdCBNb2RlICovCisjZGVmaW5lIFNNX1RFU1RfT0ZGCQlCSVRfMVMJLyogR28gb2ZmIHRoZSBUZXN0IE1vZGUgKi8KKyNkZWZpbmUgU01fU1RFUAkJCUJJVF8wUwkvKiBTdGVwIHRoZSBTdGF0ZSBNYWNoaW5lICovCisvKiBUaGUgZW5jb2Rpbmcgb2YgdGhlIHN0YXRlcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBEaWFnbm9zdGljcyBUb29sICovCisKKy8qCVFfVDIJCQkzMiBiaXQJVGVzdCBSZWdpc3RlciAyCSovCisJCQkJCQkJCS8qIEJpdCAzMS4uIDg6CXJlc2VydmVkICovCisjZGVmaW5lIFQyX0FDX1RfT04JCUJJVF83CS8qIEFkZHJlc3MgQ291bnRlciBUZXN0IE1vZGUgb24gKi8KKyNkZWZpbmUgVDJfQUNfVF9PRkYJCUJJVF82CS8qIEFkZHJlc3MgQ291bnRlciBUZXN0IE1vZGUgb2ZmICovCisjZGVmaW5lIFQyX0JDX1RfT04JCUJJVF81CS8qIEJ5dGUgQ291bnRlciBUZXN0IE1vZGUgb24gKi8KKyNkZWZpbmUgVDJfQkNfVF9PRkYJCUJJVF80CS8qIEJ5dGUgQ291bnRlciBUZXN0IE1vZGUgb2ZmICovCisjZGVmaW5lIFQyX1NURVAwNAkJQklUXzMJLyogSW5jIEFDL0RlYyBCQyBieSA0ICovCisjZGVmaW5lIFQyX1NURVAwMwkJQklUXzIJLyogSW5jIEFDL0RlYyBCQyBieSAzICovCisjZGVmaW5lIFQyX1NURVAwMgkJQklUXzEJLyogSW5jIEFDL0RlYyBCQyBieSAyICovCisjZGVmaW5lIFQyX1NURVAwMQkJQklUXzAJLyogSW5jIEFDL0RlYyBCQyBieSAxICovCisKKy8qCVFfVDMJCQkzMiBiaXQJVGVzdCBSZWdpc3RlciAzCSovCisJCQkJCQkJCS8qIEJpdCAzMS4uIDc6CXJlc2VydmVkICovCisjZGVmaW5lIFQzX01VWF9NU0sJCSg3PDw0KQkvKiBCaXQgIDYuLiA0OglNdXggUG9zaXRpb24gKi8KKwkJCQkJCQkJLyogQml0ICAzOglyZXNlcnZlZCAqLworI2RlZmluZSBUM19WUkFNX01TSwkJNwkJLyogQml0ICAyLi4gMDoJVmlydHVhbCBSQU0gQnVmZmVyIEFkZHJlc3MgKi8KKworLyogUkFNIEJ1ZmZlciBSZWdpc3RlciBPZmZzZXRzLCB1c2UgUkJfQUREUihRdWV1ZSwgT2ZmcykgdG8gYWNjZXNzICovCisvKglSQl9TVEFSVAkJMzIgYml0CVJBTSBCdWZmZXIgU3RhcnQgQWRkcmVzcyAqLworLyoJUkJfRU5ECQkJMzIgYml0CVJBTSBCdWZmZXIgRW5kIEFkZHJlc3MgKi8KKy8qCVJCX1dQCQkJMzIgYml0CVJBTSBCdWZmZXIgV3JpdGUgUG9pbnRlciAqLworLyoJUkJfUlAJCQkzMiBiaXQJUkFNIEJ1ZmZlciBSZWFkIFBvaW50ZXIgKi8KKy8qCVJCX1JYX1VUUFAJCTMyIGJpdAlSeCBVcHBlciBUaHJlc2hvbGQsIFBhdXNlIFBhY2sgKi8KKy8qCVJCX1JYX0xUUFAJCTMyIGJpdAlSeCBMb3dlciBUaHJlc2hvbGQsIFBhdXNlIFBhY2sgKi8KKy8qCVJCX1JYX1VUSFAJCTMyIGJpdAlSeCBVcHBlciBUaHJlc2hvbGQsIEhpZ2ggUHJpbyAqLworLyoJUkJfUlhfTFRIUAkJMzIgYml0CVJ4IExvd2VyIFRocmVzaG9sZCwgSGlnaCBQcmlvICovCisvKglSQl9QQwkJCTMyIGJpdAlSQU0gQnVmZmVyIFBhY2tldCBDb3VudGVyICovCisvKglSQl9MRVYJCQkzMiBiaXQJUkFNIEJ1ZmZlciBMZXZlbCBSZWdpc3RlciAqLworCQkJCS8qIEJpdCAzMS4uMTk6CXJlc2VydmVkICovCisjZGVmaW5lIFJCX01TSwkweDAwMDdmZmZmCS8qIEJpdCAxOC4uIDA6CVJBTSBCdWZmZXIgUG9pbnRlciBCaXRzICovCisKKy8qCVJCX1RTVDIJCQkgOCBiaXQJUkFNIEJ1ZmZlciBUZXN0IFJlZ2lzdGVyIDIgKi8KKwkJCQkJCQkJLyogQml0IDcuLiA0OglyZXNlcnZlZCAqLworI2RlZmluZSBSQl9QQ19ERUMJCUJJVF8zUwkvKiBQYWNrZXQgQ291bnRlciBEZWNyZW0gKi8KKyNkZWZpbmUgUkJfUENfVF9PTgkJQklUXzJTCS8qIFBhY2tldCBDb3VudGVyIFRlc3QgT24gKi8KKyNkZWZpbmUgUkJfUENfVF9PRkYJCUJJVF8xUwkvKiBQYWNrZXQgQ291bnRlciBUc3QgT2ZmICovCisjZGVmaW5lIFJCX1BDX0lOQwkJQklUXzBTCS8qIFBhY2tldCBDb3VudGVyIEluY3JlbSAqLworCisvKglSQl9UU1QxCQkJIDggYml0CVJBTSBCdWZmZXIgVGVzdCBSZWdpc3RlciAxICovCisJCQkJCQkJLyogQml0IDc6CXJlc2VydmVkICovCisjZGVmaW5lIFJCX1dQX1RfT04JCUJJVF82UwkvKiBXcml0ZSBQb2ludGVyIFRlc3QgT24gKi8KKyNkZWZpbmUgUkJfV1BfVF9PRkYJCUJJVF81UwkvKiBXcml0ZSBQb2ludGVyIFRlc3QgT2ZmICovCisjZGVmaW5lIFJCX1dQX0lOQwkJQklUXzRTCS8qIFdyaXRlIFBvaW50ZXIgSW5jcmVtICovCisJCQkJCQkJCS8qIEJpdCAzOglyZXNlcnZlZCAqLworI2RlZmluZSBSQl9SUF9UX09OCQlCSVRfMlMJLyogUmVhZCBQb2ludGVyIFRlc3QgT24gKi8KKyNkZWZpbmUgUkJfUlBfVF9PRkYJCUJJVF8xUwkvKiBSZWFkIFBvaW50ZXIgVGVzdCBPZmYgKi8KKyNkZWZpbmUgUkJfUlBfREVDCQlCSVRfMFMJLyogUmVhZCBQb2ludGVyIERlY3JlbWVudCAqLworCisvKglSQl9DVFJMCQkJIDggYml0CVJBTSBCdWZmZXIgQ29udHJvbCBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgNy4uIDY6CXJlc2VydmVkICovCisjZGVmaW5lIFJCX0VOQV9TVEZXRAlCSVRfNVMJLyogRW5hYmxlICBTdG9yZSAmIEZvcndhcmQgKi8KKyNkZWZpbmUgUkJfRElTX1NURldECUJJVF80UwkvKiBEaXNhYmxlIFN0b3JlICYgRm9yd2FyZCAqLworI2RlZmluZSBSQl9FTkFfT1BfTUQJQklUXzNTCS8qIEVuYWJsZSAgT3BlcmF0aW9uIE1vZGUgKi8KKyNkZWZpbmUgUkJfRElTX09QX01ECUJJVF8yUwkvKiBEaXNhYmxlIE9wZXJhdGlvbiBNb2RlICovCisjZGVmaW5lIFJCX1JTVF9DTFIJCUJJVF8xUwkvKiBDbGVhciBSQU0gQnVmIFNUTSBSZXNldCAqLworI2RlZmluZSBSQl9SU1RfU0VUCQlCSVRfMFMJLyogU2V0ICAgUkFNIEJ1ZiBTVE0gUmVzZXQgKi8KKworCisvKiBSZWNlaXZlIGFuZCBUcmFuc21pdCBNQUMgRklGTyBSZWdpc3RlcnMgKEdFTkVTSVMgb25seSkgKi8KKworLyoJUlhfTUZGX0VBCQkzMiBiaXQJUmVjZWl2ZSBNQUMgRklGTyBFbmQgQWRkcmVzcyAqLworLyoJUlhfTUZGX1dQCQkzMiBiaXQgCVJlY2VpdmUgTUFDIEZJRk8gV3JpdGUgUG9pbnRlciAqLworLyoJUlhfTUZGX1JQCQkzMiBiaXQJUmVjZWl2ZSBNQUMgRklGTyBSZWFkIFBvaW50ZXIgKi8KKy8qCVJYX01GRl9QQwkJMzIgYml0CVJlY2VpdmUgTUFDIEZJRk8gUGFja2V0IENvdW50ZXIgKi8KKy8qCVJYX01GRl9MRVYJCTMyIGJpdAlSZWNlaXZlIE1BQyBGSUZPIExldmVsICovCisvKglUWF9NRkZfRUEJCTMyIGJpdAlUcmFuc21pdCBNQUMgRklGTyBFbmQgQWRkcmVzcyAqLworLyoJVFhfTUZGX1dQCQkzMiBiaXQgCVRyYW5zbWl0IE1BQyBGSUZPIFdyaXRlIFBvaW50ZXIgKi8KKy8qCVRYX01GRl9XU1AJCTMyIGJpdAlUcmFuc21pdCBNQUMgRklGTyBXUiBTaGFkb3cgUG9pbnRlciAqLworLyoJVFhfTUZGX1JQCQkzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gUmVhZCBQb2ludGVyICovCisvKglUWF9NRkZfUEMJCTMyIGJpdAlUcmFuc21pdCBNQUMgRklGTyBQYWNrZXQgQ250ICovCisvKglUWF9NRkZfTEVWCQkzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gTGV2ZWwgKi8KKwkJCQkJCQkJLyogQml0IDMxLi4gNjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUZGX01TSwkJCTB4MDA3ZkwJLyogQml0CTUuLiAwOglNQUMgRklGTyBBZGRyZXNzL1B0ciBCaXRzICovCisKKy8qCVJYX01GRl9DVFJMMQkxNiBiaXQJUmVjZWl2ZSBNQUMgRklGTyBDb250cm9sIFJlZyAxICovCisJCQkJCQkJCS8qIEJpdCAxNS4uMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIE1GRl9FTkFfUkRZX1BBVAlCSVRfMTNTCQkvKiBFbmFibGUgIFJlYWR5IFBhdGNoICovCisjZGVmaW5lIE1GRl9ESVNfUkRZX1BBVAlCSVRfMTJTCQkvKiBEaXNhYmxlIFJlYWR5IFBhdGNoICovCisjZGVmaW5lIE1GRl9FTkFfVElNX1BBVAlCSVRfMTFTCQkvKiBFbmFibGUgIFRpbWluZyBQYXRjaCAqLworI2RlZmluZSBNRkZfRElTX1RJTV9QQVQJQklUXzEwUwkJLyogRGlzYWJsZSBUaW1pbmcgUGF0Y2ggKi8KKyNkZWZpbmUgTUZGX0VOQV9BTE1fRlVMCUJJVF85UwkJLyogRW5hYmxlICBBbG1vc3RGdWxsIFNpZ24gKi8KKyNkZWZpbmUgTUZGX0RJU19BTE1fRlVMCUJJVF84UwkJLyogRGlzYWJsZSBBbG1vc3RGdWxsIFNpZ24gKi8KKyNkZWZpbmUgTUZGX0VOQV9QQVVTRQlCSVRfN1MJCS8qIEVuYWJsZSAgUGF1c2UgU2lnbmFsaW5nICovCisjZGVmaW5lIE1GRl9ESVNfUEFVU0UJQklUXzZTCQkvKiBEaXNhYmxlIFBhdXNlIFNpZ25hbGluZyAqLworI2RlZmluZSBNRkZfRU5BX0ZMVVNICUJJVF81UwkJLyogRW5hYmxlICBGcmFtZSBGbHVzaGluZyAqLworI2RlZmluZSBNRkZfRElTX0ZMVVNICUJJVF80UwkJLyogRGlzYWJsZSBGcmFtZSBGbHVzaGluZyAqLworI2RlZmluZSBNRkZfRU5BX1RJU1QJQklUXzNTCQkvKiBFbmFibGUgIFRpbWUgU3RhbXAgR2VuZXIgKi8KKyNkZWZpbmUgTUZGX0RJU19USVNUCUJJVF8yUwkJLyogRGlzYWJsZSBUaW1lIFN0YW1wIEdlbmVyICovCisjZGVmaW5lIE1GRl9DTFJfSU5USVNUCUJJVF8xUwkJLyogQ2xlYXIgSVJRIE5vIFRpbWUgU3RhbXAgKi8KKyNkZWZpbmUgTUZGX0NMUl9JTlNUQVQJQklUXzBTCQkvKiBDbGVhciBJUlEgTm8gU3RhdHVzICovCisKKyNkZWZpbmUgTUZGX1JYX0NUUkxfREVGIE1GRl9FTkFfVElNX1BBVAorCisvKglUWF9NRkZfQ1RSTDEJMTYgYml0CVRyYW5zbWl0IE1BQyBGSUZPIENvbnRyb2wgUmVnIDEgKi8KKyNkZWZpbmUgTUZGX0NMUl9QRVJSCUJJVF8xNVMJCS8qIENsZWFyIFBhcml0eSBFcnJvciBJUlEgKi8KKwkJCQkJCQkJLyogQml0IDE0OglyZXNlcnZlZCAqLworI2RlZmluZSBNRkZfRU5BX1BLVF9SRUMJQklUXzEzUwkJLyogRW5hYmxlICBQYWNrZXQgUmVjb3ZlcnkgKi8KKyNkZWZpbmUgTUZGX0RJU19QS1RfUkVDIEJJVF8xMlMJCS8qIERpc2FibGUgUGFja2V0IFJlY292ZXJ5ICovCisvKglNRkZfRU5BX1RJTV9QQVQJIChzZWUgUlhfTUZGX0NUUkwxKSBCaXQgMTE6CUVuYWJsZSAgVGltaW5nIFBhdGNoICovCisvKglNRkZfRElTX1RJTV9QQVQJIChzZWUgUlhfTUZGX0NUUkwxKSBCaXQgMTA6CURpc2FibGUgVGltaW5nIFBhdGNoICovCisvKglNRkZfRU5BX0FMTV9GVUwJIChzZWUgUlhfTUZGX0NUUkwxKSBCaXQJIDk6CUVuYWJsZSAgQWxtb3N0IEZ1bGwgU2lnbiAqLworLyoJTUZGX0RJU19BTE1fRlVMCSAoc2VlIFJYX01GRl9DVFJMMSkgQml0CSA4OglEaXNhYmxlIEFsbW9zdCBGdWxsIFNpZ24gKi8KKyNkZWZpbmUgTUZGX0VOQV9XNEUJCUJJVF83UwkJLyogRW5hYmxlICBXYWl0IGZvciBFbXB0eSAqLworI2RlZmluZSBNRkZfRElTX1c0RQkJQklUXzZTCQkvKiBEaXNhYmxlIFdhaXQgZm9yIEVtcHR5ICovCisvKglNRkZfRU5BX0ZMVVNICSAoc2VlIFJYX01GRl9DVFJMMSkgQml0CSA1OglFbmFibGUgIEZyYW1lIEZsdXNoaW5nICovCisvKglNRkZfRElTX0ZMVVNICSAoc2VlIFJYX01GRl9DVFJMMSkgQml0CSA0OglEaXNhYmxlIEZyYW1lIEZsdXNoaW5nICovCisjZGVmaW5lIE1GRl9FTkFfTE9PUEIJQklUXzNTCQkvKiBFbmFibGUgIExvb3BiYWNrICovCisjZGVmaW5lIE1GRl9ESVNfTE9PUEIJQklUXzJTCQkvKiBEaXNhYmxlIExvb3BiYWNrICovCisjZGVmaW5lIE1GRl9DTFJfTUFDX1JTVAlCSVRfMVMJCS8qIENsZWFyIFhNQUMgUmVzZXQgKi8KKyNkZWZpbmUgTUZGX1NFVF9NQUNfUlNUCUJJVF8wUwkJLyogU2V0ICAgWE1BQyBSZXNldCAqLworCisjZGVmaW5lIE1GRl9UWF9DVFJMX0RFRgkoTUZGX0VOQV9QS1RfUkVDIHwgTUZGX0VOQV9USU1fUEFUIHwgTUZGX0VOQV9GTFVTSCkKKworLyoJUlhfTUZGX1RTVDIJIAkgOCBiaXQJUmVjZWl2ZSBNQUMgRklGTyBUZXN0IFJlZ2lzdGVyIDIgKi8KKy8qCVRYX01GRl9UU1QyCSAJIDggYml0CVRyYW5zbWl0IE1BQyBGSUZPIFRlc3QgUmVnaXN0ZXIgMiAqLworCQkJCQkJCQkvKiBCaXQgNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUZGX1dTUF9UX09OCUJJVF82UwkvKiBUeDogV3JpdGUgU2hhZG93IFB0ciBUZXN0T24gKi8KKyNkZWZpbmUgTUZGX1dTUF9UX09GRglCSVRfNVMJLyogVHg6IFdyaXRlIFNoYWRvdyBQdHIgVHN0T2ZmICovCisjZGVmaW5lIE1GRl9XU1BfSU5DCQlCSVRfNFMJLyogVHg6IFdyaXRlIFNoYWRvdyBQdHIgSW5jcmVtZW50ICovCisjZGVmaW5lIE1GRl9QQ19ERUMJCUJJVF8zUwkvKiBQYWNrZXQgQ291bnRlciBEZWNyZW1lbnQgKi8KKyNkZWZpbmUgTUZGX1BDX1RfT04JCUJJVF8yUwkvKiBQYWNrZXQgQ291bnRlciBUZXN0IE9uICovCisjZGVmaW5lIE1GRl9QQ19UX09GRglCSVRfMVMJLyogUGFja2V0IENvdW50ZXIgVGVzdCBPZmYgKi8KKyNkZWZpbmUgTUZGX1BDX0lOQwkJQklUXzBTCS8qIFBhY2tldCBDb3VudGVyIEluY3JlbWVudCAqLworCisvKglSWF9NRkZfVFNUMQkgCSA4IGJpdAlSZWNlaXZlIE1BQyBGSUZPIFRlc3QgUmVnaXN0ZXIgMSAqLworLyoJVFhfTUZGX1RTVDEJIAkgOCBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gVGVzdCBSZWdpc3RlciAxICovCisJCQkJCS8qIEJpdCA3OglyZXNlcnZlZCAqLworI2RlZmluZSBNRkZfV1BfVF9PTgkJQklUXzZTCS8qIFdyaXRlIFBvaW50ZXIgVGVzdCBPbiAqLworI2RlZmluZSBNRkZfV1BfVF9PRkYJQklUXzVTCS8qIFdyaXRlIFBvaW50ZXIgVGVzdCBPZmYgKi8KKyNkZWZpbmUgTUZGX1dQX0lOQwkJQklUXzRTCS8qIFdyaXRlIFBvaW50ZXIgSW5jcmVtICovCisJCQkJCQkJLyogQml0IDM6CXJlc2VydmVkICovCisjZGVmaW5lIE1GRl9SUF9UX09OCQlCSVRfMlMJLyogUmVhZCBQb2ludGVyIFRlc3QgT24gKi8KKyNkZWZpbmUgTUZGX1JQX1RfT0ZGCUJJVF8xUwkvKiBSZWFkIFBvaW50ZXIgVGVzdCBPZmYgKi8KKyNkZWZpbmUgTUZGX1JQX0RFQwkJQklUXzBTCS8qIFJlYWQgUG9pbnRlciBEZWNyZW1lbnQgKi8KKworLyoJUlhfTUZGX0NUUkwyCSA4IGJpdAlSZWNlaXZlIE1BQyBGSUZPIENvbnRyb2wgUmVnIDIgKi8KKy8qCVRYX01GRl9DVFJMMgkgOCBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gQ29udHJvbCBSZWcgMiAqLworCQkJCQkJCQkvKiBCaXQgNy4uNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUZGX0VOQV9PUF9NRAlCSVRfM1MJLyogRW5hYmxlICBPcGVyYXRpb24gTW9kZSAqLworI2RlZmluZSBNRkZfRElTX09QX01ECUJJVF8yUwkvKiBEaXNhYmxlIE9wZXJhdGlvbiBNb2RlICovCisjZGVmaW5lIE1GRl9SU1RfQ0xSCQlCSVRfMVMJLyogQ2xlYXIgTUFDIEZJRk8gUmVzZXQgKi8KKyNkZWZpbmUgTUZGX1JTVF9TRVQJCUJJVF8wUwkvKiBTZXQgICBNQUMgRklGTyBSZXNldCAqLworCisKKy8qCUxpbmsgTEVEIENvdW50ZXIgUmVnaXN0ZXJzIChHRU5FU0lTIG9ubHkpICovCisKKy8qCVJYX0xFRF9DVFJMCQkgOCBiaXQJUmVjZWl2ZSBMRUQgQ250IENvbnRyb2wgUmVnICovCisvKglUWF9MRURfQ1RSTAkJIDggYml0CVRyYW5zbWl0IExFRCBDbnQgQ29udHJvbCBSZWcgKi8KKy8qCUxOS19TWU5DX0NUUkwJIDggYml0CUxpbmsgU3luYyBDbnQgQ29udHJvbCBSZWdpc3RlciAqLworCQkJCQkJCS8qIEJpdCA3Li4gMzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTEVEX1NUQVJUCQlCSVRfMlMJLyogU3RhcnQgVGltZXIgKi8KKyNkZWZpbmUgTEVEX1NUT1AJCUJJVF8xUwkvKiBTdG9wIFRpbWVyICovCisjZGVmaW5lIExFRF9TVEFURQkJQklUXzBTCS8qIFJ4L1R4OiBMRUQgU3RhdGUsIDE9TEVEIG9uICovCisjZGVmaW5lIExFRF9DTFJfSVJRCQlCSVRfMFMJLyogTG5rOiAJQ2xlYXIgTGluayBJUlEgKi8KKworLyoJUlhfTEVEX1RTVAkJIDggYml0CVJlY2VpdmUgTEVEIENudCBUZXN0IFJlZ2lzdGVyICovCisvKglUWF9MRURfVFNUCQkgOCBiaXQJVHJhbnNtaXQgTEVEIENudCBUZXN0IFJlZ2lzdGVyICovCisvKglMTktfU1lOQ19UU1QJIDggYml0CUxpbmsgU3luYyBDbnQgVGVzdCBSZWdpc3RlciAqLworCQkJCQkJCS8qIEJpdCA3Li4gMzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTEVEX1RfT04JCUJJVF8yUwkvKiBMRUQgQ291bnRlciBUZXN0IG1vZGUgT24gKi8KKyNkZWZpbmUgTEVEX1RfT0ZGCQlCSVRfMVMJLyogTEVEIENvdW50ZXIgVGVzdCBtb2RlIE9mZiAqLworI2RlZmluZSBMRURfVF9TVEVQCQlCSVRfMFMJLyogTEVEIENvdW50ZXIgU3RlcCAqLworCisvKglMTktfTEVEX1JFRwkgCSA4IGJpdAlMaW5rIExFRCBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgNy4uIDY6CXJlc2VydmVkICovCisjZGVmaW5lIExFRF9CTEtfT04JCUJJVF81UwkvKiBMaW5rIExFRCBCbGlua2luZyBPbiAqLworI2RlZmluZSBMRURfQkxLX09GRgkJQklUXzRTCS8qIExpbmsgTEVEIEJsaW5raW5nIE9mZiAqLworI2RlZmluZSBMRURfU1lOQ19PTgkJQklUXzNTCS8qIFVzZSBTeW5jIFdpcmUgdG8gc3dpdGNoIExFRCAqLworI2RlZmluZSBMRURfU1lOQ19PRkYJQklUXzJTCS8qIERpc2FibGUgU3luYyBXaXJlIElucHV0ICovCisjZGVmaW5lIExFRF9PTgkJCUJJVF8xUwkvKiBzd2l0Y2ggTEVEIG9uICovCisjZGVmaW5lIExFRF9PRkYJCQlCSVRfMFMJLyogc3dpdGNoIExFRCBvZmYgKi8KKworLyoJUmVjZWl2ZSBhbmQgVHJhbnNtaXQgR01BQyBGSUZPIFJlZ2lzdGVycyAoWVVLT04gb25seSkgKi8KKworLyoJUlhfR01GX0VBCQkzMiBiaXQJUnggR01BQyBGSUZPIEVuZCBBZGRyZXNzICovCisvKglSWF9HTUZfQUZfVEhSCTMyIGJpdAlSeCBHTUFDIEZJRk8gQWxtb3N0IEZ1bGwgVGhyZXNoLiAqLworLyoJUlhfR01GX1dQCQkzMiBiaXQgCVJ4IEdNQUMgRklGTyBXcml0ZSBQb2ludGVyICovCisvKglSWF9HTUZfV0xFVgkJMzIgYml0IAlSeCBHTUFDIEZJRk8gV3JpdGUgTGV2ZWwgKi8KKy8qCVJYX0dNRl9SUAkJMzIgYml0IAlSeCBHTUFDIEZJRk8gUmVhZCBQb2ludGVyICovCisvKglSWF9HTUZfUkxFVgkJMzIgYml0IAlSeCBHTUFDIEZJRk8gUmVhZCBMZXZlbCAqLworLyoJVFhfR01GX0VBCQkzMiBiaXQJVHggR01BQyBGSUZPIEVuZCBBZGRyZXNzICovCisvKglUWF9HTUZfQUVfVEhSCTMyIGJpdAlUeCBHTUFDIEZJRk8gQWxtb3N0IEVtcHR5IFRocmVzaC4qLworLyoJVFhfR01GX1dQCQkzMiBiaXQgCVR4IEdNQUMgRklGTyBXcml0ZSBQb2ludGVyICovCisvKglUWF9HTUZfV1NQCQkzMiBiaXQgCVR4IEdNQUMgRklGTyBXcml0ZSBTaGFkb3cgUHRyLiAqLworLyoJVFhfR01GX1dMRVYJCTMyIGJpdCAJVHggR01BQyBGSUZPIFdyaXRlIExldmVsICovCisvKglUWF9HTUZfUlAJCTMyIGJpdCAJVHggR01BQyBGSUZPIFJlYWQgUG9pbnRlciAqLworLyoJVFhfR01GX1JTVFAJCTMyIGJpdCAJVHggR01BQyBGSUZPIFJlc3RhcnQgUG9pbnRlciAqLworLyoJVFhfR01GX1JMRVYJCTMyIGJpdCAJVHggR01BQyBGSUZPIFJlYWQgTGV2ZWwgKi8KKworLyoJUlhfR01GX0NUUkxfVAkzMiBiaXQJUnggR01BQyBGSUZPIENvbnRyb2wvVGVzdCAqLworCQkJCQkJLyogQml0cyAzMS4uMTU6CXJlc2VydmVkICovCisjZGVmaW5lIEdNRl9XUF9UU1RfT04JQklUXzE0CQkvKiBXcml0ZSBQb2ludGVyIFRlc3QgT24gKi8KKyNkZWZpbmUgR01GX1dQX1RTVF9PRkYJQklUXzEzCQkvKiBXcml0ZSBQb2ludGVyIFRlc3QgT2ZmICovCisjZGVmaW5lIEdNRl9XUF9TVEVQCQlCSVRfMTIJCS8qIFdyaXRlIFBvaW50ZXIgU3RlcC9JbmNyZW1lbnQgKi8KKwkJCQkJCS8qIEJpdCAxMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR01GX1JQX1RTVF9PTglCSVRfMTAJCS8qIFJlYWQgUG9pbnRlciBUZXN0IE9uICovCisjZGVmaW5lIEdNRl9SUF9UU1RfT0ZGCUJJVF85CQkvKiBSZWFkIFBvaW50ZXIgVGVzdCBPZmYgKi8KKyNkZWZpbmUgR01GX1JQX1NURVAJCUJJVF84CQkvKiBSZWFkIFBvaW50ZXIgU3RlcC9JbmNyZW1lbnQgKi8KKyNkZWZpbmUgR01GX1JYX0ZfRkxfT04JQklUXzcJCS8qIFJ4IEZJRk8gRmx1c2ggTW9kZSBPbiAqLworI2RlZmluZSBHTUZfUlhfRl9GTF9PRkYJQklUXzYJCS8qIFJ4IEZJRk8gRmx1c2ggTW9kZSBPZmYgKi8KKyNkZWZpbmUgR01GX0NMSV9SWF9GTwlCSVRfNQkJLyogQ2xlYXIgSVJRIFJ4IEZJRk8gT3ZlcnJ1biAqLworI2RlZmluZSBHTUZfQ0xJX1JYX0ZDCUJJVF80CQkvKiBDbGVhciBJUlEgUnggRnJhbWUgQ29tcGxldGUgKi8KKyNkZWZpbmUgR01GX09QRVJfT04JCUJJVF8zCQkvKiBPcGVyYXRpb25hbCBNb2RlIE9uICovCisjZGVmaW5lIEdNRl9PUEVSX09GRglCSVRfMgkJLyogT3BlcmF0aW9uYWwgTW9kZSBPZmYgKi8KKyNkZWZpbmUgR01GX1JTVF9DTFIJCUJJVF8xCQkvKiBDbGVhciBHTUFDIEZJRk8gUmVzZXQgKi8KKyNkZWZpbmUgR01GX1JTVF9TRVQJCUJJVF8wCQkvKiBTZXQgICBHTUFDIEZJRk8gUmVzZXQgKi8KKworLyoJVFhfR01GX0NUUkxfVAkzMiBiaXQJVHggR01BQyBGSUZPIENvbnRyb2wvVGVzdCAqLworCQkJCQkJLyogQml0cyAzMS4uMTk6CXJlc2VydmVkICovCisjZGVmaW5lIEdNRl9XU1BfVFNUX09OCUJJVF8xOAkJLyogV3JpdGUgU2hhZG93IFBvaW50ZXIgVGVzdCBPbiAqLworI2RlZmluZSBHTUZfV1NQX1RTVF9PRkYJQklUXzE3CQkvKiBXcml0ZSBTaGFkb3cgUG9pbnRlciBUZXN0IE9mZiAqLworI2RlZmluZSBHTUZfV1NQX1NURVAJQklUXzE2CQkvKiBXcml0ZSBTaGFkb3cgUG9pbnRlciBTdGVwL0luY3JlbWVudCAqLworCQkJCQkJLyogQml0cyAxNS4uNzogc2FtZSBhcyBmb3IgUlhfR01GX0NUUkxfVCAqLworI2RlZmluZSBHTUZfQ0xJX1RYX0ZVCUJJVF82CQkvKiBDbGVhciBJUlEgVHggRklGTyBVbmRlcnJ1biAqLworI2RlZmluZSBHTUZfQ0xJX1RYX0ZDCUJJVF81CQkvKiBDbGVhciBJUlEgVHggRnJhbWUgQ29tcGxldGUgKi8KKyNkZWZpbmUgR01GX0NMSV9UWF9QRQlCSVRfNAkJLyogQ2xlYXIgSVJRIFR4IFBhcml0eSBFcnJvciAqLworCQkJCQkJLyogQml0cyAzLi4wOiBzYW1lIGFzIGZvciBSWF9HTUZfQ1RSTF9UICovCisKKyNkZWZpbmUgR01GX1JYX0NUUkxfREVGCQkoR01GX09QRVJfT04gfCBHTUZfUlhfRl9GTF9PTikKKyNkZWZpbmUgR01GX1RYX0NUUkxfREVGCQlHTUZfT1BFUl9PTgorCisjZGVmaW5lIFJYX0dNRl9GTF9USFJfREVGCTB4MGEJLyogUnggR01BQyBGSUZPIEZsdXNoIFRocmVzaG9sZCBkZWZhdWx0ICovCisKKy8qCUdNQUNfVElfU1RfQ1RSTAkgOCBiaXQJVGltZSBTdGFtcCBUaW1lciBDdHJsIFJlZyAoWVVLT04gb25seSkgKi8KKwkJCQkJCQkJLyogQml0IDcuLiAzOglyZXNlcnZlZCAqLworI2RlZmluZSBHTVRfU1RfU1RBUlQJQklUXzJTCQkvKiBTdGFydCBUaW1lIFN0YW1wIFRpbWVyICovCisjZGVmaW5lIEdNVF9TVF9TVE9QCQlCSVRfMVMJCS8qIFN0b3AgIFRpbWUgU3RhbXAgVGltZXIgKi8KKyNkZWZpbmUgR01UX1NUX0NMUl9JUlEJQklUXzBTCQkvKiBDbGVhciBUaW1lIFN0YW1wIFRpbWVyIElSUSAqLworCisvKglHTUFDX0NUUkwJCTMyIGJpdAlHTUFDIENvbnRyb2wgUmVnIChZVUtPTiBvbmx5KSAqLworCQkJCQkJLyogQml0cyAzMS4uIDg6CXJlc2VydmVkICovCisjZGVmaW5lIEdNQ19IX0JVUlNUX09OCUJJVF83CQkvKiBIYWxmIER1cGxleCBCdXJzdCBNb2RlIE9uICovCisjZGVmaW5lIEdNQ19IX0JVUlNUX09GRglCSVRfNgkJLyogSGFsZiBEdXBsZXggQnVyc3QgTW9kZSBPZmYgKi8KKyNkZWZpbmUgR01DX0ZfTE9PUEJfT04JQklUXzUJCS8qIEZJRk8gTG9vcGJhY2sgT24gKi8KKyNkZWZpbmUgR01DX0ZfTE9PUEJfT0ZGCUJJVF80CQkvKiBGSUZPIExvb3BiYWNrIE9mZiAqLworI2RlZmluZSBHTUNfUEFVU0VfT04JQklUXzMJCS8qIFBhdXNlIE9uICovCisjZGVmaW5lIEdNQ19QQVVTRV9PRkYJQklUXzIJCS8qIFBhdXNlIE9mZiAqLworI2RlZmluZSBHTUNfUlNUX0NMUgkJQklUXzEJCS8qIENsZWFyIEdNQUMgUmVzZXQgKi8KKyNkZWZpbmUgR01DX1JTVF9TRVQJCUJJVF8wCQkvKiBTZXQgICBHTUFDIFJlc2V0ICovCisKKy8qCUdQSFlfQ1RSTAkJMzIgYml0CUdQSFkgQ29udHJvbCBSZWcgKFlVS09OIG9ubHkpICovCisJCQkJCQkvKiBCaXRzIDMxLi4yOToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR1BDX1NFTF9CRFQJCUJJVF8yOAkvKiBTZWxlY3QgQmktRGlyLiBUcmFuc2ZlciBmb3IgTURDL01ESU8gKi8KKyNkZWZpbmUgR1BDX0lOVF9QT0xfSEkJQklUXzI3CS8qIElSUSBQb2xhcml0eSBpcyBBY3RpdmUgSElHSCAqLworI2RlZmluZSBHUENfNzVfT0hNCQlCSVRfMjYJLyogVXNlIDc1IE9obSBUZXJtaW5hdGlvbiBpbnN0ZWFkIG9mIDUwICovCisjZGVmaW5lIEdQQ19ESVNfRkMJCUJJVF8yNQkvKiBEaXNhYmxlIEF1dG9tYXRpYyBGaWJlci9Db3BwZXIgRGV0ZWN0aW9uICovCisjZGVmaW5lIEdQQ19ESVNfU0xFRVAJQklUXzI0CS8qIERpc2FibGUgRW5lcmd5IERldGVjdCAqLworI2RlZmluZSBHUENfSFdDRkdfTV8zCUJJVF8yMwkvKiBIV0NGR19NT0RFWzNdICovCisjZGVmaW5lIEdQQ19IV0NGR19NXzIJQklUXzIyCS8qIEhXQ0ZHX01PREVbMl0gKi8KKyNkZWZpbmUgR1BDX0hXQ0ZHX01fMQlCSVRfMjEJLyogSFdDRkdfTU9ERVsxXSAqLworI2RlZmluZSBHUENfSFdDRkdfTV8wCUJJVF8yMAkvKiBIV0NGR19NT0RFWzBdICovCisjZGVmaW5lIEdQQ19BTkVHXzAJCUJJVF8xOQkvKiBBTkVHWzBdICovCisjZGVmaW5lIEdQQ19FTkFfWEMJCUJJVF8xOAkvKiBFbmFibGUgTURJIGNyb3Nzb3ZlciAqLworI2RlZmluZSBHUENfRElTXzEyNQkJQklUXzE3CS8qIERpc2FibGUgMTI1IE1IeiBjbG9jayAqLworI2RlZmluZSBHUENfQU5FR18zCQlCSVRfMTYJLyogQU5FR1szXSAqLworI2RlZmluZSBHUENfQU5FR18yCQlCSVRfMTUJLyogQU5FR1syXSAqLworI2RlZmluZSBHUENfQU5FR18xCQlCSVRfMTQJLyogQU5FR1sxXSAqLworI2RlZmluZSBHUENfRU5BX1BBVVNFCUJJVF8xMwkvKiBFbmFibGUgUGF1c2UgKFNZTV9PUl9SRU0pICovCisjZGVmaW5lIEdQQ19QSFlBRERSXzQJQklUXzEyCS8qIEJpdCA0IG9mIFBoeSBBZGRyICovCisjZGVmaW5lIEdQQ19QSFlBRERSXzMJQklUXzExCS8qIEJpdCAzIG9mIFBoeSBBZGRyICovCisjZGVmaW5lIEdQQ19QSFlBRERSXzIJQklUXzEwCS8qIEJpdCAyIG9mIFBoeSBBZGRyICovCisjZGVmaW5lIEdQQ19QSFlBRERSXzEJQklUXzkJLyogQml0IDEgb2YgUGh5IEFkZHIgKi8KKyNkZWZpbmUgR1BDX1BIWUFERFJfMAlCSVRfOAkvKiBCaXQgMCBvZiBQaHkgQWRkciAqLworCQkJCQkJLyogQml0cyAgNy4uMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR1BDX1JTVF9DTFIJCUJJVF8xCS8qIENsZWFyIEdQSFkgUmVzZXQgKi8KKyNkZWZpbmUgR1BDX1JTVF9TRVQJCUJJVF8wCS8qIFNldCAgIEdQSFkgUmVzZXQgKi8KKworI2RlZmluZSBHUENfSFdDRkdfR01JSV9DT1AJKEdQQ19IV0NGR19NXzMgfCBHUENfSFdDRkdfTV8yIHwgXAorCQkJCQkJCSBHUENfSFdDRkdfTV8xIHwgR1BDX0hXQ0ZHX01fMCkKKworI2RlZmluZSBHUENfSFdDRkdfR01JSV9GSUIJKAkJCQkgR1BDX0hXQ0ZHX01fMiB8IFwKKwkJCQkJCQkgR1BDX0hXQ0ZHX01fMSB8IEdQQ19IV0NGR19NXzApCisKKyNkZWZpbmUgR1BDX0FORUdfQURWX0FMTF9NCShHUENfQU5FR18zIHwgR1BDX0FORUdfMiB8IFwKKwkJCQkJCQkgR1BDX0FORUdfMSB8IEdQQ19BTkVHXzApCisKKy8qIGZvcmNlZCBzcGVlZCBhbmQgZHVwbGV4IG1vZGUgKGRvbid0IG1peCB3aXRoIG90aGVyIEFORUcgYml0cykgKi8KKyNkZWZpbmUgR1BDX0ZSQzEwTUJJVF9IQUxGCTAKKyNkZWZpbmUgR1BDX0ZSQzEwTUJJVF9GVUxMCUdQQ19BTkVHXzAKKyNkZWZpbmUgR1BDX0ZSQzEwME1CSVRfSEFMRglHUENfQU5FR18xCisjZGVmaW5lIEdQQ19GUkMxMDBNQklUX0ZVTEwJKEdQQ19BTkVHXzAgfCBHUENfQU5FR18xKQorCisvKiBhdXRvLW5lZ290aWF0aW9uIHdpdGggbGltaXRlZCBhZHZlcnRpc2VkIHNwZWVkcyAqLworLyogbWl4IG9ubHkgd2l0aCBtYXN0ZXIvc2xhdmUgc2V0dGluZ3MgKGZvciBjb3BwZXIpICovCisjZGVmaW5lIEdQQ19BRFZfMTAwMF9IQUxGCUdQQ19BTkVHXzIKKyNkZWZpbmUgR1BDX0FEVl8xMDAwX0ZVTEwJR1BDX0FORUdfMworI2RlZmluZSBHUENfQURWX0FMTAkJCShHUENfQU5FR18yIHwgR1BDX0FORUdfMykKKworLyogbWFzdGVyL3NsYXZlIHNldHRpbmdzICovCisvKiBvbmx5IGZvciBjb3BwZXIgd2l0aCAxMDAwIE1icHMgKi8KKyNkZWZpbmUgR1BDX0ZPUkNFX01BU1RFUgkwCisjZGVmaW5lIEdQQ19GT1JDRV9TTEFWRQkJR1BDX0FORUdfMAorI2RlZmluZSBHUENfUFJFRl9NQVNURVIJCUdQQ19BTkVHXzEKKyNkZWZpbmUgR1BDX1BSRUZfU0xBVkUJCShHUENfQU5FR18xIHwgR1BDX0FORUdfMCkKKworLyoJR01BQ19JUlFfU1JDCSA4IGJpdAlHTUFDIEludGVycnVwdCBTb3VyY2UgUmVnIChZVUtPTiBvbmx5KSAqLworLyoJR01BQ19JUlFfTVNLCSA4IGJpdAlHTUFDIEludGVycnVwdCBNYXNrICAgUmVnIChZVUtPTiBvbmx5KSAqLworI2RlZmluZSBHTV9JU19UWF9DT19PVglCSVRfNQkJLyogVHJhbnNtaXQgQ291bnRlciBPdmVyZmxvdyBJUlEgKi8KKyNkZWZpbmUgR01fSVNfUlhfQ09fT1YJQklUXzQJCS8qIFJlY2VpdmUgQ291bnRlciBPdmVyZmxvdyBJUlEgKi8KKyNkZWZpbmUgR01fSVNfVFhfRkZfVVIJQklUXzMJCS8qIFRyYW5zbWl0IEZJRk8gVW5kZXJydW4gKi8KKyNkZWZpbmUgR01fSVNfVFhfQ09NUEwJQklUXzIJCS8qIEZyYW1lIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSAqLworI2RlZmluZSBHTV9JU19SWF9GRl9PUglCSVRfMQkJLyogUmVjZWl2ZSBGSUZPIE92ZXJydW4gKi8KKyNkZWZpbmUgR01fSVNfUlhfQ09NUEwJQklUXzAJCS8qIEZyYW1lIFJlY2VwdGlvbiBDb21wbGV0ZSAqLworCisjZGVmaW5lIEdNQUNfREVGX01TSwkoR01fSVNfVFhfQ09fT1YgfCBHTV9JU19SWF9DT19PViB8IFwKKwkJCQkJCUdNX0lTX1RYX0ZGX1VSKQorCisvKglHTUFDX0xJTktfQ1RSTAkxNiBiaXQJR01BQyBMaW5rIENvbnRyb2wgUmVnIChZVUtPTiBvbmx5KSAqLworCQkJCQkJLyogQml0cyAxNS4uIDI6CXJlc2VydmVkICovCisjZGVmaW5lIEdNTENfUlNUX0NMUglCSVRfMVMJCS8qIENsZWFyIEdNQUMgTGluayBSZXNldCAqLworI2RlZmluZSBHTUxDX1JTVF9TRVQJQklUXzBTCQkvKiBTZXQgICBHTUFDIExpbmsgUmVzZXQgKi8KKworCisvKglXT0xfQ1RSTF9TVEFUCTE2IGJpdAlXT0wgQ29udHJvbC9TdGF0dXMgUmVnICovCisjZGVmaW5lIFdPTF9DVExfTElOS19DSEdfT0NDCQkJQklUXzE1UworI2RlZmluZSBXT0xfQ1RMX01BR0lDX1BLVF9PQ0MJCQlCSVRfMTRTCisjZGVmaW5lIFdPTF9DVExfUEFUVEVSTl9PQ0MJCQkJQklUXzEzUworCisjZGVmaW5lIFdPTF9DVExfQ0xFQVJfUkVTVUxUCQkJQklUXzEyUworCisjZGVmaW5lIFdPTF9DVExfRU5BX1BNRV9PTl9MSU5LX0NIRwkJQklUXzExUworI2RlZmluZSBXT0xfQ1RMX0RJU19QTUVfT05fTElOS19DSEcJCUJJVF8xMFMKKyNkZWZpbmUgV09MX0NUTF9FTkFfUE1FX09OX01BR0lDX1BLVAlCSVRfOVMKKyNkZWZpbmUgV09MX0NUTF9ESVNfUE1FX09OX01BR0lDX1BLVAlCSVRfOFMKKyNkZWZpbmUgV09MX0NUTF9FTkFfUE1FX09OX1BBVFRFUk4JCUJJVF83UworI2RlZmluZSBXT0xfQ1RMX0RJU19QTUVfT05fUEFUVEVSTgkJQklUXzZTCisKKyNkZWZpbmUgV09MX0NUTF9FTkFfTElOS19DSEdfVU5JVAkJQklUXzVTCisjZGVmaW5lIFdPTF9DVExfRElTX0xJTktfQ0hHX1VOSVQJCUJJVF80UworI2RlZmluZSBXT0xfQ1RMX0VOQV9NQUdJQ19QS1RfVU5JVAkJQklUXzNTCisjZGVmaW5lIFdPTF9DVExfRElTX01BR0lDX1BLVF9VTklUCQlCSVRfMlMKKyNkZWZpbmUgV09MX0NUTF9FTkFfUEFUVEVSTl9VTklUCQlCSVRfMVMKKyNkZWZpbmUgV09MX0NUTF9ESVNfUEFUVEVSTl9VTklUCQlCSVRfMFMKKworI2RlZmluZSBXT0xfQ1RMX0RFRkFVTFQJCQkJXAorCShXT0xfQ1RMX0RJU19QTUVfT05fTElOS19DSEcgfAlcCisJV09MX0NUTF9ESVNfUE1FX09OX1BBVFRFUk4gfAlcCisJV09MX0NUTF9ESVNfUE1FX09OX01BR0lDX1BLVCB8CVwKKwlXT0xfQ1RMX0RJU19MSU5LX0NIR19VTklUIHwJCVwKKwlXT0xfQ1RMX0RJU19QQVRURVJOX1VOSVQgfAkJXAorCVdPTF9DVExfRElTX01BR0lDX1BLVF9VTklUKQorCisvKglXT0xfTUFUQ0hfQ1RMCSA4IGJpdAlXT0wgTWF0Y2ggQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgV09MX0NUTF9QQVRUX0VOQSh4KQkJCQkoQklUXzAgPDwgKHgpKQorCisjZGVmaW5lIFNLX05VTV9XT0xfUEFUVEVSTgkJNworI2RlZmluZSBTS19QQVRURVJOX1BFUl9XT1JECQk0CisjZGVmaW5lIFNLX0JJVE1BU0tfUEFUVEVSTgkJNworI2RlZmluZSBTS19QT1dfUEFUVEVSTl9MRU5HVEgJMTI4CisKKyNkZWZpbmUgV09MX0xFTkdUSF9NU0sJCTB4N2YKKyNkZWZpbmUgV09MX0xFTkdUSF9TSElGVAk4CisKKworLyogUmVjZWl2ZSBhbmQgVHJhbnNtaXQgRGVzY3JpcHRvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUcmFuc21pdCBEZXNjcmlwdG9yIHN0cnVjdCAqLwordHlwZWRlZglzdHJ1Y3Qgc19Id1R4ZCB7CisJU0tfVTMyIHZvbGF0aWxlCVR4Q3RybDsJLyogVHJhbnNtaXQgQnVmZmVyIENvbnRyb2wgRmllbGQgKi8KKwlTS19VMzIJVHhOZXh0OwkJCS8qIFBoeXNpY2FsIEFkZHJlc3MgUG9pbnRlciB0byB0aGUgbmV4dCBUeEQgKi8KKwlTS19VMzIJVHhBZHJMbzsJCS8qIFBoeXNpY2FsIFR4IEJ1ZmZlciBBZGRyZXNzIGxvd2VyIGR3b3JkICovCisJU0tfVTMyCVR4QWRySGk7CQkvKiBQaHlzaWNhbCBUeCBCdWZmZXIgQWRkcmVzcyB1cHBlciBkd29yZCAqLworCVNLX1UzMglUeFN0YXQ7CQkJLyogVHJhbnNtaXQgRnJhbWUgU3RhdHVzIFdvcmQgKi8KKyNpZm5kZWYJU0tfVVNFX1JFVl9ERVNDCisJU0tfVTE2CVR4VGNwT2ZmczsJCS8qIFRDUCBDaGVja3N1bSBDYWxjdWxhdGlvbiBTdGFydCBWYWx1ZSAqLworCVNLX1UxNglUeFJlczE7CQkJLyogMTYgYml0IHJlc2VydmVkIGZpZWxkICovCisJU0tfVTE2CVR4VGNwV3A7CQkvKiBUQ1AgQ2hlY2tzdW0gV3JpdGUgUG9zaXRpb24gKi8KKwlTS19VMTYJVHhUY3BTcDsJCS8qIFRDUCBDaGVja3N1bSBDYWxjdWxhdGlvbiBTdGFydCBQb3NpdGlvbiAqLworI2Vsc2UJLyogU0tfVVNFX1JFVl9ERVNDICovCisJU0tfVTE2CVR4UmVzMTsJCQkvKiAxNiBiaXQgcmVzZXJ2ZWQgZmllbGQgKi8KKwlTS19VMTYJVHhUY3BPZmZzOwkJLyogVENQIENoZWNrc3VtIENhbGN1bGF0aW9uIFN0YXJ0IFZhbHVlICovCisJU0tfVTE2CVR4VGNwU3A7CQkvKiBUQ1AgQ2hlY2tzdW0gQ2FsY3VsYXRpb24gU3RhcnQgUG9zaXRpb24gKi8KKwlTS19VMTYJVHhUY3BXcDsJCS8qIFRDUCBDaGVja3N1bSBXcml0ZSBQb3NpdGlvbiAqLworI2VuZGlmCS8qIFNLX1VTRV9SRVZfREVTQyAqLworCVNLX1UzMiAgVHhSZXMyOwkJCS8qIDMyIGJpdCByZXNlcnZlZCBmaWVsZCAqLworfSBTS19IV1RYRDsKKworLyogUmVjZWl2ZSBEZXNjcmlwdG9yIHN0cnVjdCAqLwordHlwZWRlZglzdHJ1Y3Qgc19Id1J4ZCB7CisJU0tfVTMyIHZvbGF0aWxlIFJ4Q3RybDsJLyogUmVjZWl2ZSBCdWZmZXIgQ29udHJvbCBGaWVsZCAqLworCVNLX1UzMglSeE5leHQ7CQkJLyogUGh5c2ljYWwgQWRkcmVzcyBQb2ludGVyIHRvIHRoZSBuZXh0IFJ4RCAqLworCVNLX1UzMglSeEFkckxvOwkJLyogUGh5c2ljYWwgUnggQnVmZmVyIEFkZHJlc3MgbG93ZXIgZHdvcmQgKi8KKwlTS19VMzIJUnhBZHJIaTsJCS8qIFBoeXNpY2FsIFJ4IEJ1ZmZlciBBZGRyZXNzIHVwcGVyIGR3b3JkICovCisJU0tfVTMyCVJ4U3RhdDsJCQkvKiBSZWNlaXZlIEZyYW1lIFN0YXR1cyBXb3JkICovCisJU0tfVTMyCVJ4VGlTdDsJCQkvKiBSZWNlaXZlIFRpbWUgU3RhbXAgKGZyb20gWE1BQyBvbiBHRU5FU0lTKSAqLworI2lmbmRlZglTS19VU0VfUkVWX0RFU0MKKwlTS19VMTYJUnhUY3BTdW0xOwkJLyogVENQIENoZWNrc3VtIDEgKi8KKwlTS19VMTYJUnhUY3BTdW0yOwkJLyogVENQIENoZWNrc3VtIDIgKi8KKwlTS19VMTYJUnhUY3BTcDE7CQkvKiBUQ1AgQ2hlY2tzdW0gQ2FsY3VsYXRpb24gU3RhcnQgUG9zaXRpb24gMSAqLworCVNLX1UxNglSeFRjcFNwMjsJCS8qIFRDUCBDaGVja3N1bSBDYWxjdWxhdGlvbiBTdGFydCBQb3NpdGlvbiAyICovCisjZWxzZQkvKiBTS19VU0VfUkVWX0RFU0MgKi8KKwlTS19VMTYJUnhUY3BTdW0yOwkJLyogVENQIENoZWNrc3VtIDIgKi8KKwlTS19VMTYJUnhUY3BTdW0xOwkJLyogVENQIENoZWNrc3VtIDEgKi8KKwlTS19VMTYJUnhUY3BTcDI7CQkvKiBUQ1AgQ2hlY2tzdW0gQ2FsY3VsYXRpb24gU3RhcnQgUG9zaXRpb24gMiAqLworCVNLX1UxNglSeFRjcFNwMTsJCS8qIFRDUCBDaGVja3N1bSBDYWxjdWxhdGlvbiBTdGFydCBQb3NpdGlvbiAxICovCisjZW5kaWYJLyogU0tfVVNFX1JFVl9ERVNDICovCit9IFNLX0hXUlhEOworCisvKgorICogRHJpdmVycyB3aGljaCB1c2UgdGhlIHJldmVyc2UgZGVzY3JpcHRvciBmZWF0dXJlIChQQ0lfT1VSX1JFR18yKQorICogc2hvdWxkIHNldCB0aGUgZGVmaW5lIFNLX1VTRV9SRVZfREVTQy4KKyAqIFN0cnVjdHVyZXMgYXJlICdub3JtYWx5JyBub3QgZW5kaWFuZXNzIGRlcGVuZGVudC4gQnV0IGluCisgKiB0aGlzIGNhc2UgdGhlIFNLX1UxNiBmaWVsZHMgYXJlIGJvdW5kIHRvIGJpdCBwb3NpdGlvbnMgaW5zaWRlIHRoZQorICogZGVzY3JpcHRvci4gUnhUY3BTdW0xIGUuZy4gbXVzdCBzdGFydCBhdCBiaXQgMCB3aXRoaW4gdGhlIDYudGggRFdvcmQuCisgKiBUaGUgYml0IHBvc2l0aW9ucyBpbnNpZGUgYSBEV29yZCBhcmUgb2YgY291cnNlIGVuZGlhbmVzcyBkZXBlbmRlbnQgYW5kCisgKiBzd2FwcyBpZiB0aGUgRFdvcmQgaXMgc3dhcHBlZCBieSB0aGUgaGFyZHdhcmUuCisgKi8KKworCisvKiBEZXNjcmlwdG9yIEJpdCBEZWZpbml0aW9uICovCisvKglUeEN0cmwJCVRyYW5zbWl0IEJ1ZmZlciBDb250cm9sIEZpZWxkICovCisvKglSeEN0cmwJCVJlY2VpdmUgIEJ1ZmZlciBDb250cm9sIEZpZWxkICovCisjZGVmaW5lIEJNVV9PV04JCQlCSVRfMzEJLyogT1dOIGJpdDogMD1ob3N0LzE9Qk1VICovCisjZGVmaW5lIEJNVV9TVEYJCQlCSVRfMzAJLyogU3RhcnQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgQk1VX0VPRgkJCUJJVF8yOQkvKiBFbmQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgQk1VX0lSUV9FT0IJCUJJVF8yOAkvKiBSZXEgIkVuZCBvZiBCdWZmZXIiIElSUSAqLworI2RlZmluZSBCTVVfSVJRX0VPRgkJQklUXzI3CS8qIFJlcSAiRW5kIG9mIEZyYW1lIiBJUlEgKi8KKy8qIFR4Q3RybCBzcGVjaWZpYyBiaXRzICovCisjZGVmaW5lIEJNVV9TVEZXRAkJQklUXzI2CS8qIChUeCkJU3RvcmUgJiBGb3J3YXJkIEZyYW1lICovCisjZGVmaW5lIEJNVV9OT19GQ1MJCUJJVF8yNQkvKiAoVHgpIERpc2FibGUgTUFDIEZDUyAoQ1JDKSBnZW5lcmF0aW9uICovCisjZGVmaW5lIEJNVV9TVwkJCUJJVF8yNAkvKiAoVHgpCTEgYml0IHJlcy4gZm9yIFNXIHVzZSAqLworLyogUnhDdHJsIHNwZWNpZmljIGJpdHMgKi8KKyNkZWZpbmUgQk1VX0RFVl8wCQlCSVRfMjYJLyogKFJ4KQlUcmFuc2ZlciBkYXRhIHRvIERldjAgKi8KKyNkZWZpbmUgQk1VX1NUQVRfVkFMCUJJVF8yNQkvKiAoUngpCVJ4IFN0YXR1cyBWYWxpZCAqLworI2RlZmluZSBCTVVfVElTVF9WQUwJQklUXzI0CS8qIChSeCkJUnggVGltZVN0YW1wIFZhbGlkICovCisJCQkJCQkJCS8qIEJpdCAyMy4uMTY6CUJNVSBDaGVjayBPcGNvZGVzICovCisjZGVmaW5lIEJNVV9DSEVDSwkJKDB4NTVMPDwxNikJLyogRGVmYXVsdCBCTVUgY2hlY2sgKi8KKyNkZWZpbmUgQk1VX1RDUF9DSEVDSwkoMHg1Nkw8PDE2KQkvKiBEZXNjciB3aXRoIFRDUCBleHQgKi8KKyNkZWZpbmUgQk1VX1VEUF9DSEVDSwkoMHg1N0w8PDE2KQkvKiBEZXNjciB3aXRoIFVEUCBleHQgKFlVS09OIG9ubHkpICovCisjZGVmaW5lIEJNVV9CQkMJCQkweGZmZmZMCS8qIEJpdCAxNS4uIDA6CUJ1ZmZlciBCeXRlIENvdW50ZXIgKi8KKworLyoJVHhTdGF0CQlUcmFuc21pdCBGcmFtZSBTdGF0dXMgV29yZCAqLworLyoJUnhTdGF0CQlSZWNlaXZlIEZyYW1lIFN0YXR1cyBXb3JkICovCisvKgorICpOb3RlOiBUeFN0YXQgaXMgcmVzZXJ2ZWQgZm9yIEFTSUMgbG9vcGJhY2sgbW9kZSBvbmx5CisgKgorICoJVGhlIEJpdHMgb2YgdGhlIFN0YXR1cyB3b3JkcyBhcmUgZGVmaW5lZCBpbiB4bWFjX2lpLmgKKyAqCShzZWUgWE1SX0ZTIGJpdHMpCisgKi8KKworLyogbWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZWNlaXZlIGFuZCBUcmFuc21pdCBRdWV1ZXMgKi8KKyNkZWZpbmUgUV9SMQkweDAwMDAJCS8qIFJlY2VpdmUgUXVldWUgMSAqLworI2RlZmluZSBRX1IyCTB4MDA4MAkJLyogUmVjZWl2ZSBRdWV1ZSAyICovCisjZGVmaW5lIFFfWFMxCTB4MDIwMAkJLyogU3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMSAqLworI2RlZmluZSBRX1hBMQkweDAyODAJCS8qIEFzeW5jaHJvbm91cyBUcmFuc21pdCBRdWV1ZSAxICovCisjZGVmaW5lIFFfWFMyCTB4MDMwMAkJLyogU3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMiAqLworI2RlZmluZSBRX1hBMgkweDAzODAJCS8qIEFzeW5jaHJvbm91cyBUcmFuc21pdCBRdWV1ZSAyICovCisKKy8qCisgKglNYWNybyBRX0FERFIoKQorICoKKyAqCVVzZSB0aGlzIG1hY3JvIHRvIGFjY2VzcyB0aGUgUmVjZWl2ZSBhbmQgVHJhbnNtaXQgUXVldWUgUmVnaXN0ZXJzLgorICoKKyAqIHBhcmE6CisgKglRdWV1ZQlRdWV1ZSB0byBhY2Nlc3MuCisgKgkJCQlWYWx1ZXM6IFFfUjEsIFFfUjIsIFFfWFMxLCBRX1hBMSwgUV9YUzIsIGFuZCBRX1hBMgorICoJT2ZmcwlRdWV1ZSByZWdpc3RlciBvZmZzZXQuCisgKgkJCQlWYWx1ZXM6IFFfRCwgUV9EQV9MIC4uLiBRX1QyLCBRX1QzCisgKgorICogdXNhZ2UJU0tfSU4zMihwQUMsIFFfQUREUihRX1IyLCBRX0JDKSwgcFZhbCkKKyAqLworI2RlZmluZSBRX0FERFIoUXVldWUsIE9mZnMpCShCOF9RX1JFR1MgKyAoUXVldWUpICsgKE9mZnMpKQorCisvKgorICoJTWFjcm8gUkJfQUREUigpCisgKgorICoJVXNlIHRoaXMgbWFjcm8gdG8gYWNjZXNzIHRoZSBSQU0gQnVmZmVyIFJlZ2lzdGVycy4KKyAqCisgKiBwYXJhOgorICoJUXVldWUJUXVldWUgdG8gYWNjZXNzLgorICoJCQkJVmFsdWVzOiBRX1IxLCBRX1IyLCBRX1hTMSwgUV9YQTEsIFFfWFMyLCBhbmQgUV9YQTIKKyAqCU9mZnMJUXVldWUgcmVnaXN0ZXIgb2Zmc2V0LgorICoJCQkJVmFsdWVzOiBSQl9TVEFSVCwgUkJfRU5EIC4uLiBSQl9MRVYsIFJCX0NUUkwKKyAqCisgKiB1c2FnZQlTS19JTjMyKHBBQywgUkJfQUREUihRX1IyLCBSQl9SUCksIHBWYWwpCisgKi8KKyNkZWZpbmUgUkJfQUREUihRdWV1ZSwgT2ZmcykJKEIxNl9SQU1fUkVHUyArIChRdWV1ZSkgKyAoT2ZmcykpCisKKworLyogTUFDIFJlbGF0ZWQgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1BQ18xCQkwCS8qIGJlbG9uZ3MgdG8gdGhlIHBvcnQgbmVhciB0aGUgc2xvdCAqLworI2RlZmluZSBNQUNfMgkJMQkvKiBiZWxvbmdzIHRvIHRoZSBwb3J0IGZhciBhd2F5IGZyb20gdGhlIHNsb3QgKi8KKworLyoKKyAqCU1hY3JvIE1SX0FERFIoKQorICoKKyAqCVVzZSB0aGlzIG1hY3JvIHRvIGFjY2VzcyBhIE1BQyBSZWxhdGVkIFJlZ2lzdGVycyBpbnNpZGUgdGhlIEFTSUMuCisgKgorICogcGFyYToKKyAqCU1hYwkJTUFDIHRvIGFjY2Vzcy4KKyAqCQkJCVZhbHVlczogTUFDXzEsIE1BQ18yCisgKglPZmZzCU1BQyByZWdpc3RlciBvZmZzZXQuCisgKgkJCQlWYWx1ZXM6IFJYX01GRl9FQSwgUlhfTUZGX1dQIC4uLiBMTktfTEVEX1JFRywKKyAqCQkJCQkJVFhfTUZGX0VBLCBUWF9NRkZfV1AgLi4uIFRYX0xFRF9UU1QKKyAqCisgKiB1c2FnZQlTS19JTjMyKHBBQywgTVJfQUREUihNQUNfMSwgVFhfTUZGX0VBKSwgcFZhbCkKKyAqLworI2RlZmluZSBNUl9BRERSKE1hYywgT2ZmcykJKCgoTWFjKSA8PCA3KSArIChPZmZzKSkKKworI2lmZGVmCVNLX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgWE1fV09SRF9MTwkwCisjZGVmaW5lIFhNX1dPUkRfSEkJMQorI2Vsc2UJLyogIVNLX0xJVFRMRV9FTkRJQU4gKi8KKyNkZWZpbmUgWE1fV09SRF9MTwkxCisjZGVmaW5lIFhNX1dPUkRfSEkJMAorI2VuZGlmCS8qICFTS19MSVRUTEVfRU5ESUFOICovCisKKworLyoKKyAqIG1hY3JvcyB0byBhY2Nlc3MgdGhlIFhNQUMgKEdFTkVTSVMgb25seSkKKyAqCisgKiBYTV9JTjE2KCksCQl0byByZWFkIGEgMTYgYml0IHJlZ2lzdGVyIChlLmcuIFhNX01NVV9DTUQpCisgKiBYTV9PVVQxNigpLAkJdG8gd3JpdGUgYSAxNiBiaXQgcmVnaXN0ZXIgKGUuZy4gWE1fTU1VX0NNRCkKKyAqIFhNX0lOMzIoKSwJCXRvIHJlYWQgYSAzMiBiaXQgcmVnaXN0ZXIgKGUuZy4gWE1fVFhfRVZfQ05UKQorICogWE1fT1VUMzIoKSwJCXRvIHdyaXRlIGEgMzIgYml0IHJlZ2lzdGVyIChlLmcuIFhNX1RYX0VWX0NOVCkKKyAqIFhNX0lOQUREUigpLAkJdG8gcmVhZCBhIG5ldHdvcmsgYWRkcmVzcyByZWdpc3RlciAoZS5nLiBYTV9TUkNfQ0hLKQorICogWE1fT1VUQUREUigpLAl0byB3cml0ZSBhIG5ldHdvcmsgYWRkcmVzcyByZWdpc3RlciAoZS5nLiBYTV9TUkNfQ0hLKQorICogWE1fSU5IQVNIKCksCQl0byByZWFkIHRoZSBYTV9IU01fQ0hLIHJlZ2lzdGVyCisgKiBYTV9PVVRIQVNIKCkJCXRvIHdyaXRlIHRoZSBYTV9IU01fQ0hLIHJlZ2lzdGVyCisgKgorICogcGFyYToKKyAqCU1hYwkJWE1BQyB0byBhY2Nlc3MJCXZhbHVlczogTUFDXzEgb3IgTUFDXzIKKyAqCUlvQwkJSS9PIGNvbnRleHQgbmVlZGVkIGZvciBTSyBJL08gbWFjcm9zCisgKglSZWcJCVhNQUMgUmVnaXN0ZXIgdG8gcmVhZCBvciB3cml0ZQorICoJKHApVmFsCVZhbHVlIG9yIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHdoaWNoIHNob3VsZCBiZSByZWFkIG9yIHdyaXR0ZW4KKyAqCisgKiB1c2FnZToJWE1fT1VUMTYoSW9DLCBNQUNfMSwgWE1fTU1VX0NNRCwgVmFsdWUpOworICovCisKKyNkZWZpbmUgWE1BKE1hYywgUmVnKQkJCQkJCQkJCVwKKwkoKEJBU0VfWE1BQ18xICsgKE1hYykgKiAoQkFTRV9YTUFDXzIgLSBCQVNFX1hNQUNfMSkpIHwgKChSZWcpIDw8IDEpKQorCisjZGVmaW5lIFhNX0lOMTYoSW9DLCBNYWMsIFJlZywgcFZhbCkJCQkJCVwKKwlTS19JTjE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcpKSwgKHBWYWwpKQorCisjZGVmaW5lIFhNX09VVDE2KElvQywgTWFjLCBSZWcsIFZhbCkJCQkJCVwKKwlTS19PVVQxNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKSksIChWYWwpKQorCisjZGVmaW5lIFhNX0lOMzIoSW9DLCBNYWMsIFJlZywgcFZhbCkgewkJCQkJXAorCVNLX0lOMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZykpLAkJCQkJXAorCQkoU0tfVTE2IFNLX0ZBUiopJigoU0tfVTE2IFNLX0ZBUiopKHBWYWwpKVtYTV9XT1JEX0xPXSk7CQlcCisJU0tfSU4xNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKzIpKSwJCQkJCVwKKwkJKFNLX1UxNiBTS19GQVIqKSYoKFNLX1UxNiBTS19GQVIqKShwVmFsKSlbWE1fV09SRF9ISV0pOwkJXAorfQorCisjZGVmaW5lIFhNX09VVDMyKElvQywgTWFjLCBSZWcsIFZhbCkgewkJCQkJCQkJCQlcCisJU0tfT1VUMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZykpLCAoU0tfVTE2KSgoVmFsKSAmIDB4ZmZmZkwpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZysyKSksIChTS19VMTYpKCgoVmFsKSA+PiAxNikgJiAweGZmZmZMKSk7XAorfQorCisvKiBSZW1lbWJlcjogd2UgYXJlIGFsd2F5cyB3cml0aW5nIHRvIC8gcmVhZGluZyBmcm9tIExJVFRMRSBFTkRJQU4gbWVtb3J5ICovCisKKyNkZWZpbmUgWE1fSU5BRERSKElvQywgTWFjLCBSZWcsIHBWYWwpIHsJCQkJXAorCVNLX1UxNglXb3JkOwkJCQkJCQkJCQlcCisJU0tfVTgJKnBCeXRlOwkJCQkJCQkJCQlcCisJcEJ5dGUgPSAoU0tfVTggKikmKChTS19VOCAqKShwVmFsKSlbMF07CQkJCVwKKwlTS19JTjE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcpKSwgJldvcmQpOwkJCVwKKwlwQnl0ZVswXSA9IChTS19VOCkoV29yZCAgJiAweDAwZmYpOwkJCQkJXAorCXBCeXRlWzFdID0gKFNLX1U4KSgoV29yZCA+PiA4KSAmIDB4MDBmZik7CQkJXAorCVNLX0lOMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZysyKSksICZXb3JkKTsJCQlcCisJcEJ5dGVbMl0gPSAoU0tfVTgpKFdvcmQgICYgMHgwMGZmKTsJCQkJCVwKKwlwQnl0ZVszXSA9IChTS19VOCkoKFdvcmQgPj4gOCkgJiAweDAwZmYpOwkJCVwKKwlTS19JTjE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcrNCkpLCAmV29yZCk7CQkJXAorCXBCeXRlWzRdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbNV0gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCit9CisKKyNkZWZpbmUgWE1fT1VUQUREUihJb0MsIE1hYywgUmVnLCBwVmFsKSB7CQkJCVwKKwlTS19VOAlTS19GQVIgKnBCeXRlOwkJCQkJCQkJXAorCXBCeXRlID0gKFNLX1U4IFNLX0ZBUiAqKSYoKFNLX1U4IFNLX0ZBUiAqKShwVmFsKSlbMF07CVwKKwlTS19PVVQxNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKSksIChTS19VMTYpCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzBdKSAmIDB4MDBmZikgfAkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbMV0pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKKwlTS19PVVQxNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKzIpKSwgKFNLX1UxNikJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVsyXSkgJiAweDAwZmYpIHwJCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzNdKSA8PCA4KSAmIDB4ZmYwMCkpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZys0KSksIChTS19VMTYpCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbNF0pICYgMHgwMGZmKSB8CQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVs1XSkgPDwgOCkgJiAweGZmMDApKSk7CQkJXAorfQorCisjZGVmaW5lIFhNX0lOSEFTSChJb0MsIE1hYywgUmVnLCBwVmFsKSB7CQkJCVwKKwlTS19VMTYJV29yZDsJCQkJCQkJCQkJXAorCVNLX1U4CVNLX0ZBUiAqcEJ5dGU7CQkJCQkJCQlcCisJcEJ5dGUgPSAoU0tfVTggU0tfRkFSICopJigoU0tfVTggU0tfRkFSICopKHBWYWwpKVswXTsJXAorCVNLX0lOMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZykpLCAmV29yZCk7CQkJXAorCXBCeXRlWzBdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbMV0gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCisJU0tfSU4xNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKzIpKSwgJldvcmQpOwkJCVwKKwlwQnl0ZVsyXSA9IChTS19VOCkoV29yZCAgJiAweDAwZmYpOwkJCQkJXAorCXBCeXRlWzNdID0gKFNLX1U4KSgoV29yZCA+PiA4KSAmIDB4MDBmZik7CQkJXAorCVNLX0lOMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZys0KSksICZXb3JkKTsJCQlcCisJcEJ5dGVbNF0gPSAoU0tfVTgpKFdvcmQgICYgMHgwMGZmKTsJCQkJCVwKKwlwQnl0ZVs1XSA9IChTS19VOCkoKFdvcmQgPj4gOCkgJiAweDAwZmYpOwkJCVwKKwlTS19JTjE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcrNikpLCAmV29yZCk7CQkJXAorCXBCeXRlWzZdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbN10gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCit9CisKKyNkZWZpbmUgWE1fT1VUSEFTSChJb0MsIE1hYywgUmVnLCBwVmFsKSB7CQkJCVwKKwlTS19VOAlTS19GQVIgKnBCeXRlOwkJCQkJCQkJXAorCXBCeXRlID0gKFNLX1U4IFNLX0ZBUiAqKSYoKFNLX1U4IFNLX0ZBUiAqKShwVmFsKSlbMF07CVwKKwlTS19PVVQxNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKSksIChTS19VMTYpCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzBdKSAmIDB4MDBmZil8CQkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbMV0pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKKwlTS19PVVQxNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKzIpKSwgKFNLX1UxNikJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVsyXSkgJiAweDAwZmYpfAkJCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzNdKSA8PCA4KSAmIDB4ZmYwMCkpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZys0KSksIChTS19VMTYpCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbNF0pICYgMHgwMGZmKXwJCQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVs1XSkgPDwgOCkgJiAweGZmMDApKSk7CQkJXAorCVNLX09VVDE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcrNikpLCAoU0tfVTE2KQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzZdKSAmIDB4MDBmZil8CQkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbN10pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKK30KKworLyoKKyAqIG1hY3JvcyB0byBhY2Nlc3MgdGhlIEdNQUMgKFlVS09OIG9ubHkpCisgKgorICogR01fSU4xNigpLAkJdG8gcmVhZCAgYSAxNiBiaXQgcmVnaXN0ZXIgKGUuZy4gR01fR1BfU1RBVCkKKyAqIEdNX09VVDE2KCksCQl0byB3cml0ZSBhIDE2IGJpdCByZWdpc3RlciAoZS5nLiBHTV9HUF9DVFJMKQorICogR01fSU4zMigpLAkJdG8gcmVhZCAgYSAzMiBiaXQgcmVnaXN0ZXIgKGUuZy4gR01fKQorICogR01fT1VUMzIoKSwJCXRvIHdyaXRlIGEgMzIgYml0IHJlZ2lzdGVyIChlLmcuIEdNXykKKyAqIEdNX0lOQUREUigpLAkJdG8gcmVhZCAgYSBuZXR3b3JrIGFkZHJlc3MgcmVnaXN0ZXIgKGUuZy4gR01fU1JDX0FERFJfMUwpCisgKiBHTV9PVVRBRERSKCksCXRvIHdyaXRlIGEgbmV0d29yayBhZGRyZXNzIHJlZ2lzdGVyIChlLmcuIEdNX1NSQ19BRERSXzJMKQorICogR01fSU5IQVNIKCksCQl0byByZWFkICB0aGUgR01fTUNfQUREUl9IMSByZWdpc3RlcgorICogR01fT1VUSEFTSCgpCQl0byB3cml0ZSB0aGUgR01fTUNfQUREUl9IMSByZWdpc3RlcgorICoKKyAqIHBhcmE6CisgKglNYWMJCUdNQUMgdG8gYWNjZXNzCQl2YWx1ZXM6IE1BQ18xIG9yIE1BQ18yCisgKglJb0MJCUkvTyBjb250ZXh0IG5lZWRlZCBmb3IgU0sgSS9PIG1hY3JvcworICoJUmVnCQlHTUFDIFJlZ2lzdGVyIHRvIHJlYWQgb3Igd3JpdGUKKyAqCShwKVZhbAlWYWx1ZSBvciBwb2ludGVyIHRvIHRoZSB2YWx1ZSB3aGljaCBzaG91bGQgYmUgcmVhZCBvciB3cml0dGVuCisgKgorICogdXNhZ2U6CUdNX09VVDE2KElvQywgTUFDXzEsIEdNX0dQX0NUUkwsIFZhbHVlKTsKKyAqLworCisjZGVmaW5lIEdNQShNYWMsIFJlZykJCQkJCQkJCQlcCisJKChCQVNFX0dNQUNfMSArIChNYWMpICogKEJBU0VfR01BQ18yIC0gQkFTRV9HTUFDXzEpKSB8IChSZWcpKQorCisjZGVmaW5lIEdNX0lOMTYoSW9DLCBNYWMsIFJlZywgcFZhbCkJCQkJCVwKKwlTS19JTjE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcpKSwgKHBWYWwpKQorCisjZGVmaW5lIEdNX09VVDE2KElvQywgTWFjLCBSZWcsIFZhbCkJCQkJCVwKKwlTS19PVVQxNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKSksIChWYWwpKQorCisjZGVmaW5lIEdNX0lOMzIoSW9DLCBNYWMsIFJlZywgcFZhbCkgewkJCQkJXAorCVNLX0lOMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZykpLAkJCQkJXAorCQkoU0tfVTE2IFNLX0ZBUiopJigoU0tfVTE2IFNLX0ZBUiopKHBWYWwpKVtYTV9XT1JEX0xPXSk7CQlcCisJU0tfSU4xNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKzQpKSwJCQkJCVwKKwkJKFNLX1UxNiBTS19GQVIqKSYoKFNLX1UxNiBTS19GQVIqKShwVmFsKSlbWE1fV09SRF9ISV0pOwkJXAorfQorCisjZGVmaW5lIEdNX09VVDMyKElvQywgTWFjLCBSZWcsIFZhbCkgewkJCQkJCQkJCQlcCisJU0tfT1VUMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZykpLCAoU0tfVTE2KSgoVmFsKSAmIDB4ZmZmZkwpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZys0KSksIChTS19VMTYpKCgoVmFsKSA+PiAxNikgJiAweGZmZmZMKSk7XAorfQorCisjZGVmaW5lIEdNX0lOQUREUihJb0MsIE1hYywgUmVnLCBwVmFsKSB7CQkJCVwKKwlTS19VMTYJV29yZDsJCQkJCQkJCQkJXAorCVNLX1U4CSpwQnl0ZTsJCQkJCQkJCQkJXAorCXBCeXRlID0gKFNLX1U4ICopJigoU0tfVTggKikocFZhbCkpWzBdOwkJCQlcCisJU0tfSU4xNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKSksICZXb3JkKTsJCQlcCisJcEJ5dGVbMF0gPSAoU0tfVTgpKFdvcmQgICYgMHgwMGZmKTsJCQkJCVwKKwlwQnl0ZVsxXSA9IChTS19VOCkoKFdvcmQgPj4gOCkgJiAweDAwZmYpOwkJCVwKKwlTS19JTjE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcrNCkpLCAmV29yZCk7CQkJXAorCXBCeXRlWzJdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbM10gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCisJU0tfSU4xNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKzgpKSwgJldvcmQpOwkJCVwKKwlwQnl0ZVs0XSA9IChTS19VOCkoV29yZCAgJiAweDAwZmYpOwkJCQkJXAorCXBCeXRlWzVdID0gKFNLX1U4KSgoV29yZCA+PiA4KSAmIDB4MDBmZik7CQkJXAorfQorCisjZGVmaW5lIEdNX09VVEFERFIoSW9DLCBNYWMsIFJlZywgcFZhbCkgewkJCQlcCisJU0tfVTgJU0tfRkFSICpwQnl0ZTsJCQkJCQkJCVwKKwlwQnl0ZSA9IChTS19VOCBTS19GQVIgKikmKChTS19VOCBTS19GQVIgKikocFZhbCkpWzBdOwlcCisJU0tfT1VUMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZykpLCAoU0tfVTE2KQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVswXSkgJiAweDAwZmYpIHwJCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzFdKSA8PCA4KSAmIDB4ZmYwMCkpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZys0KSksIChTS19VMTYpCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbMl0pICYgMHgwMGZmKSB8CQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVszXSkgPDwgOCkgJiAweGZmMDApKSk7CQkJXAorCVNLX09VVDE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcrOCkpLCAoU0tfVTE2KQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzRdKSAmIDB4MDBmZikgfAkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbNV0pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKK30KKworI2RlZmluZSBHTV9JTkhBU0goSW9DLCBNYWMsIFJlZywgcFZhbCkgewkJCQlcCisJU0tfVTE2CVdvcmQ7CQkJCQkJCQkJCVwKKwlTS19VOAkqcEJ5dGU7CQkJCQkJCQkJCVwKKwlwQnl0ZSA9IChTS19VOCAqKSYoKFNLX1U4ICopKHBWYWwpKVswXTsJCQkJXAorCVNLX0lOMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZykpLCAmV29yZCk7CQkJXAorCXBCeXRlWzBdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbMV0gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCisJU0tfSU4xNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKzQpKSwgJldvcmQpOwkJCVwKKwlwQnl0ZVsyXSA9IChTS19VOCkoV29yZCAgJiAweDAwZmYpOwkJCQkJXAorCXBCeXRlWzNdID0gKFNLX1U4KSgoV29yZCA+PiA4KSAmIDB4MDBmZik7CQkJXAorCVNLX0lOMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZys4KSksICZXb3JkKTsJCQlcCisJcEJ5dGVbNF0gPSAoU0tfVTgpKFdvcmQgICYgMHgwMGZmKTsJCQkJCVwKKwlwQnl0ZVs1XSA9IChTS19VOCkoKFdvcmQgPj4gOCkgJiAweDAwZmYpOwkJCVwKKwlTS19JTjE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcrMTIpKSwgJldvcmQpOwkJXAorCXBCeXRlWzZdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbN10gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCit9CisKKyNkZWZpbmUgR01fT1VUSEFTSChJb0MsIE1hYywgUmVnLCBwVmFsKSB7CQkJCVwKKwlTS19VOAkqcEJ5dGU7CQkJCQkJCQkJCVwKKwlwQnl0ZSA9IChTS19VOCAqKSYoKFNLX1U4ICopKHBWYWwpKVswXTsJCQkJXAorCVNLX09VVDE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcpKSwgKFNLX1UxNikJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbMF0pICYgMHgwMGZmKXwJCQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVsxXSkgPDwgOCkgJiAweGZmMDApKSk7CQkJXAorCVNLX09VVDE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcrNCkpLCAoU0tfVTE2KQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzJdKSAmIDB4MDBmZil8CQkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbM10pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKKwlTS19PVVQxNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKzgpKSwgKFNLX1UxNikJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVs0XSkgJiAweDAwZmYpfAkJCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzVdKSA8PCA4KSAmIDB4ZmYwMCkpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZysxMikpLCAoU0tfVTE2KQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzZdKSAmIDB4MDBmZil8CQkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbN10pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKK30KKworLyoKKyAqIERpZmZlcmVudCBNQUMgVHlwZXMKKyAqLworI2RlZmluZSBTS19NQUNfWE1BQwkJMAkvKiBYYXF0aSBYTUFDIElJICovCisjZGVmaW5lIFNLX01BQ19HTUFDCQkxCS8qIE1hcnZlbGwgR01BQyAqLworCisvKgorICogRGlmZmVyZW50IFBIWSBUeXBlcworICovCisjZGVmaW5lIFNLX1BIWV9YTUFDCQkJMAkvKiBpbnRlZ3JhdGVkIGluIFhNQUMgSUkgKi8KKyNkZWZpbmUgU0tfUEhZX0JDT00JCQkxCS8qIEJyb2FkY29tIEJDTTU0MDAgKi8KKyNkZWZpbmUgU0tfUEhZX0xPTkUJCQkyCS8qIExldmVsIE9uZSBMWFQxMDAwICovCisjZGVmaW5lIFNLX1BIWV9OQVQJCQkzCS8qIE5hdGlvbmFsIERQODM4OTEgKi8KKyNkZWZpbmUgU0tfUEhZX01BUlZfQ09QUEVSCTQJLyogTWFydmVsbCA4OEUxMDExUyAqLworI2RlZmluZSBTS19QSFlfTUFSVl9GSUJFUgk1CS8qIE1hcnZlbGwgODhFMTAxMVMgd29ya2luZyBvbiBmaWJlciAqLworCisvKgorICogUEhZIGFkZHJlc3NlcyAoYml0cyAxMi4uOCBvZiBQSFkgYWRkcmVzcyByZWcpCisgKi8KKyNkZWZpbmUgUEhZX0FERFJfWE1BQwkoMDw8OCkKKyNkZWZpbmUgUEhZX0FERFJfQkNPTQkoMTw8OCkKKyNkZWZpbmUgUEhZX0FERFJfTE9ORQkoMzw8OCkKKyNkZWZpbmUgUEhZX0FERFJfTkFUCSgwPDw4KQorCisvKiBHUEhZIGFkZHJlc3MgKGJpdHMgMTUuLjExIG9mIFNNSSBjb250cm9sIHJlZykgKi8KKyNkZWZpbmUgUEhZX0FERFJfTUFSVgkwCisKKy8qCisgKiBtYWNyb3MgdG8gYWNjZXNzIHRoZSBQSFkKKyAqCisgKiBQSFlfUkVBRCgpCQlyZWFkIGEgMTYgYml0IHZhbHVlIGZyb20gdGhlIFBIWQorICogUEhZX1dSSVRFKCkJCXdyaXRlIGEgMTYgYml0IHZhbHVlIHRvIHRoZSBQSFkKKyAqCisgKiBwYXJhOgorICogCUlvQwkJSS9PIGNvbnRleHQgbmVlZGVkIGZvciBTSyBJL08gbWFjcm9zCisgKiAJcFBvcnQJUG9pbnRlciB0byBwb3J0IHN0cnVjdCBmb3IgUGh5QWRkcgorICogCU1hYwkJWE1BQyB0byBhY2Nlc3MJCXZhbHVlczogTUFDXzEgb3IgTUFDXzIKKyAqIAlQaHlSZWcJUEhZIFJlZ2lzdGVyIHRvIHJlYWQgb3Igd3JpdGUKKyAqIAkocClWYWwJVmFsdWUgb3IgcG9pbnRlciB0byB0aGUgdmFsdWUgd2hpY2ggc2hvdWxkIGJlIHJlYWQgb3IKKyAqCQkJd3JpdHRlbi4KKyAqCisgKiB1c2FnZToJUEhZX1JFQUQoSW9DLCBwUG9ydCwgTUFDXzEsIFBIWV9DVFJMLCBWYWx1ZSk7CisgKiBXYXJuaW5nOiBhIFBIWV9SRUFEIG9uIGFuIHVuaW5pdGlhbGl6ZWQgUEhZIChQSFkgc3RpbGwgaW4gcmVzZXQpIG5ldmVyCisgKiAgICAgICAgICBjb21lcyBiYWNrLiBUaGlzIGlzIGNoZWNrZWQgaW4gREVCVUcgbW9kZS4KKyAqLworI2lmbmRlZiBERUJVRworI2RlZmluZSBQSFlfUkVBRChJb0MsIHBQb3J0LCBNYWMsIFBoeVJlZywgcFZhbCkgewkJCQkJCVwKKwlTS19VMTYgTW11OyAgCQkJCQkJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQlcCisJWE1fT1VUMTYoKElvQyksIChNYWMpLCBYTV9QSFlfQUREUiwgKFBoeVJlZykgfCAocFBvcnQpLT5QaHlBZGRyKTsJXAorCVhNX0lOMTYoKElvQyksIChNYWMpLCBYTV9QSFlfREFUQSwgKHBWYWwpKTsJCQkJCQkJXAorCWlmICgocFBvcnQpLT5QaHlUeXBlICE9IFNLX1BIWV9YTUFDKSB7CQkJCQkJCQlcCisJCWRvIHsgIAkJCQkJCQkJCQkJCQkJCVwKKwkJCVhNX0lOMTYoKElvQyksIChNYWMpLCBYTV9NTVVfQ01ELCAmTW11KTsJCQkJCVwKKwkJfSB3aGlsZSAoKE1tdSAmIFhNX01NVV9QSFlfUkRZKSA9PSAwKTsJCQkJCQkJXAorCQlYTV9JTjE2KChJb0MpLCAoTWFjKSwgWE1fUEhZX0RBVEEsIChwVmFsKSk7CQkJCQkJXAorCX0gIAkJCQkJCQkJCQkJCQkJCQkJXAorfQorI2Vsc2UKKyNkZWZpbmUgUEhZX1JFQUQoSW9DLCBwUG9ydCwgTWFjLCBQaHlSZWcsIHBWYWwpIHsJCQkJCQlcCisJU0tfVTE2IE1tdTsgIAkJCQkJCQkJCQkJCQkJXAorCWludCBfX2kgPSAwOwkJCQkJCQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJXAorCVhNX09VVDE2KChJb0MpLCAoTWFjKSwgWE1fUEhZX0FERFIsIChQaHlSZWcpIHwgKHBQb3J0KS0+UGh5QWRkcik7CVwKKwlYTV9JTjE2KChJb0MpLCAoTWFjKSwgWE1fUEhZX0RBVEEsIChwVmFsKSk7CQkJCQkJCVwKKwlpZiAoKHBQb3J0KS0+UGh5VHlwZSAhPSBTS19QSFlfWE1BQykgewkJCQkJCQkJXAorCQlkbyB7ICAJCQkJCQkJCQkJCQkJCQlcCisJCQlYTV9JTjE2KChJb0MpLCAoTWFjKSwgWE1fTU1VX0NNRCwgJk1tdSk7CQkJCQlcCisJCQlfX2krKzsJCQkJCQkJCQkJCQkJCVwKKwkJCWlmIChfX2kgPiAxMDAwMDApIHsJCQkJCQkJCQkJCVwKKwkJCQlTS19EQkdfUFJJTlRGKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CQlcCisJCQkJU0tfREJHX1BSSU5URigiUEhZX1JFQUQgb24gdW5pbml0aWFsaXplZCBQSFlcbiIpOwkJXAorCQkJCVNLX0RCR19QUklOVEYoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsJCVwKKwkJCQlicmVhazsJCQkJCQkJCQkJCQkJXAorCQkJfQkJCQkJCQkJCQkJCQkJCVwKKwkJfSB3aGlsZSAoKE1tdSAmIFhNX01NVV9QSFlfUkRZKSA9PSAwKTsJCQkJCQkJXAorCQlYTV9JTjE2KChJb0MpLCAoTWFjKSwgWE1fUEhZX0RBVEEsIChwVmFsKSk7CQkJCQkJXAorCX0gIAkJCQkJCQkJCQkJCQkJCQkJXAorfQorI2VuZGlmIC8qIERFQlVHICovCisKKyNkZWZpbmUgUEhZX1dSSVRFKElvQywgcFBvcnQsIE1hYywgUGh5UmVnLCBWYWwpIHsJCQkJCQlcCisJU0tfVTE2IE1tdTsJCQkJCQkJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQlcCisJaWYgKChwUG9ydCktPlBoeVR5cGUgIT0gU0tfUEhZX1hNQUMpIHsJCQkJCQkJCVwKKwkJZG8geyAgCQkJCQkJCQkJCQkJCQkJXAorCQkJWE1fSU4xNigoSW9DKSwgKE1hYyksIFhNX01NVV9DTUQsICZNbXUpOwkJCQkJXAorCQl9IHdoaWxlICgoTW11ICYgWE1fTU1VX1BIWV9CVVNZKSAhPSAwKTsJCQkJCQkJXAorCX0gIAkJCQkJCQkJCQkJCQkJCQkJXAorCVhNX09VVDE2KChJb0MpLCAoTWFjKSwgWE1fUEhZX0FERFIsIChQaHlSZWcpIHwgKHBQb3J0KS0+UGh5QWRkcik7CVwKKwlYTV9PVVQxNigoSW9DKSwgKE1hYyksIFhNX1BIWV9EQVRBLCAoVmFsKSk7CQkJCQkJCVwKKwlpZiAoKHBQb3J0KS0+UGh5VHlwZSAhPSBTS19QSFlfWE1BQykgewkJCQkJCQkJXAorCQlkbyB7ICAJCQkJCQkJCQkJCQkJCQlcCisJCQlYTV9JTjE2KChJb0MpLCAoTWFjKSwgWE1fTU1VX0NNRCwgJk1tdSk7CQkJCQlcCisJCX0gd2hpbGUgKChNbXUgJiBYTV9NTVVfUEhZX0JVU1kpICE9IDApOwkJCQkJCQlcCisJfSAgCQkJCQkJCQkJCQkJCQkJCQlcCit9CisKKy8qCisgKglNYWNybyBQQ0lfQygpCisgKgorICoJVXNlIHRoaXMgbWFjcm8gdG8gYWNjZXNzIFBDSSBjb25maWcgcmVnaXN0ZXIgZnJvbSB0aGUgSS9PIHNwYWNlLgorICoKKyAqIHBhcmE6CisgKglBZGRyCVBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHRvIGFjY2Vzcy4KKyAqCQkJVmFsdWVzOglQQ0lfVkVORE9SX0lEIC4uLiBQQ0lfVlBEX0FEUl9SRUcsCisgKgorICogdXNhZ2UJU0tfSU4xNihwQUMsIFBDSV9DKFBDSV9WRU5ET1JfSUQpLCBwVmFsKTsKKyAqLworI2RlZmluZSBQQ0lfQyhBZGRyKQkoQjdfQ0ZHX1NQQyArIChBZGRyKSkJLyogUENJIENvbmZpZyBTcGFjZSAqLworCisvKgorICoJTWFjcm8gU0tfSFdfQUREUihCYXNlLCBBZGRyKQorICoKKyAqCUNhbGN1bGF0ZXMgdGhlIGVmZmVjdGl2ZSBIVyBhZGRyZXNzCisgKgorICogcGFyYToKKyAqCUJhc2UJSS9PIG9yIG1lbW9yeSBiYXNlIGFkZHJlc3MKKyAqCUFkZHIJQWRkcmVzcyBvZmZzZXQKKyAqCisgKiB1c2FnZToJTWF5IGJlIHVzZWQgaW4gU0tfSU54eCBhbmQgU0tfT1VUeHggbWFjcm9zCisgKgkJI2RlZmluZSBTS19JTjgocEFDLCBBZGRyLCBwVmFsKSAuLi5cCisgKgkJCSpwVmFsID0gKFNLX1U4KWlucChTS19IV19BRERSKHBBQy0+SHcuSW9wLCBBZGRyKSkpCisgKi8KKyNpZmRlZiBTS19NRU1fTUFQUEVEX0lPCisjZGVmaW5lIFNLX0hXX0FERFIoQmFzZSwgQWRkcikJKChCYXNlKSArIChBZGRyKSkKKyNlbHNlICAvKiBTS19NRU1fTUFQUEVEX0lPICovCisjZGVmaW5lIFNLX0hXX0FERFIoQmFzZSwgQWRkcikJXAorCQkJKChCYXNlKSArICgoKEFkZHIpICYgMHg3ZikgfCAoKChBZGRyKSA+PiA3ID4gMCkgPyAweDgwIDogMCkpKQorI2VuZGlmIC8qIFNLX01FTV9NQVBQRURfSU8gKi8KKworI2RlZmluZSBTWl9MT05HCShzaXplb2YoU0tfVTMyKSkKKworLyoKKyAqCU1hY3JvIFNLX0hXQUNfTElOS19MRUQoKQorICoKKyAqCVVzZSB0aGlzIG1hY3JvIHRvIHNldCB0aGUgbGluayBMRUQgbW9kZS4KKyAqIHBhcmE6CisgKglwQUMJCVBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0IHN0cnVjdAorICoJSW9DCQlJL08gY29udGV4dCBuZWVkZWQgZm9yIFNLIEkvTyBtYWNyb3MKKyAqICBQb3J0CVBvcnQgbnVtYmVyCisgKglNb2RlCU1vZGUgdG8gc2V0IGZvciB0aGlzIExFRAorICovCisjZGVmaW5lIFNLX0hXQUNfTElOS19MRUQocEFDLCBJb0MsIFBvcnQsIE1vZGUpIFwKKwlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBMTktfTEVEX1JFRyksIE1vZGUpOworCisKKy8qIHR5cGVkZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYJLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCS8qIF9fSU5DX1NLR0VIV19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWh3dC5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vod3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmIwMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vod3QuaApAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tod3QuaAorICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgRXZlbnQgU2NoZWR1bGVyIE1vZHVsZQorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjcgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDkvMTYgMTI6NTU6MDggJAorICogUHVycG9zZToJRGVmaW5lcyBmb3IgdGhlIGhhcmR3YXJlIHRpbWVyIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTS0dFSFdULkgJY29udGFpbnMgYWxsIGRlZmluZXMgYW5kIHR5cGVzIGZvciB0aGUgdGltZXIgZnVuY3Rpb25zCisgKi8KKworI2lmbmRlZglfU0tHRUhXVF9IXworI2RlZmluZSBfU0tHRUhXVF9IXworCisvKgorICogU0sgSGFyZHdhcmUgVGltZXIKKyAqIC0gbmVlZGVkIHdoZXJldmVyIHRoZSBIV1QgbW9kdWxlIGlzIHVzZWQKKyAqIC0gdXNlIGluIEFkYXB0ZXJzIGNvbnRleHQgbmFtZSBwQUMtPkh3dAorICovCit0eXBlZGVmCXN0cnVjdCBzX0h3dCB7CisJU0tfVTMyCQlUU3RhcnQ7CS8qIEhXVCBzdGFydCAqLworCVNLX1UzMgkJVFN0b3A7CS8qIEhXVCBzdG9wICovCisJaW50CQlUQWN0aXZlOwkvKiBIV1Q6IGZsYWcgOiBhY3RpdmUvaW5hY3RpdmUgKi8KK30gU0tfSFdUOworCitleHRlcm4gdm9pZCBTa0h3dEluaXQoU0tfQUMgKnBBQywgU0tfSU9DIElvYyk7CitleHRlcm4gdm9pZCBTa0h3dFN0YXJ0KFNLX0FDICpwQUMsIFNLX0lPQyBJb2MsIFNLX1UzMiBUaW1lKTsKK2V4dGVybiB2b2lkIFNrSHd0U3RvcChTS19BQyAqcEFDLCBTS19JT0MgSW9jKTsKK2V4dGVybiBTS19VMzIgU2tId3RSZWFkKFNLX0FDICpwQUMsIFNLX0lPQyBJb2MpOworZXh0ZXJuIHZvaWQgU2tId3RJc3IoU0tfQUMgKnBBQywgU0tfSU9DIElvYyk7CisjZW5kaWYJLyogX1NLR0VIV1RfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlaTJjLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWkyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjZmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWkyYy5oCkBAIC0wLDAgKzEsMjEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tnZWkyYy5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBUV1NJLU1vZHVsZQorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjI1ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzEwLzIwIDA5OjA2OjA1ICQKKyAqIFB1cnBvc2U6CVNwZWNpYWwgZGVmaW5lcyBmb3IgVFdTSQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU0tHRUkyQy5ICWNvbnRhaW5zIGFsbCBTSy05OHh4IHNwZWNpZmljIGRlZmluZXMgZm9yIHRoZSBUV1NJIGhhbmRsaW5nCisgKi8KKworI2lmbmRlZiBfSU5DX1NLR0VJMkNfSF8KKyNkZWZpbmUgX0lOQ19TS0dFSTJDX0hfCisKKy8qCisgKiBNYWNyb3MgdG8gYWNjZXNzIHRoZSBCMl9JMkNfQ1RSTAorICovCisjZGVmaW5lIFNLX0kyQ19DVEwoSW9DLCBmbGFnLCBkZXYsIGRldl9zaXplLCByZWcsIGJ1cnN0KSBcCisJU0tfT1VUMzIoSW9DLCBCMl9JMkNfQ1RSTCxcCisJCShmbGFnID8gMHg4MDAwMDAwMFVMIDogMHgwTCkgfCBcCisJCSgoKFNLX1UzMilyZWcgPDwgMTYpICYgSTJDX0FERFIpIHwgXAorCQkoKChTS19VMzIpZGV2IDw8IDkpICYgSTJDX0RFVl9TRUwpIHwgXAorCQkoZGV2X3NpemUgJiBJMkNfREVWX1NJWkUpIHwgXAorCQkoKGJ1cnN0IDw8IDQpICYgSTJDX0JVUlNUX0xFTikpCisKKyNkZWZpbmUgU0tfSTJDX1NUT1AoSW9DKSB7CQkJCVwKKwlTS19VMzIJSTJjQ3RybDsJCQkJXAorCVNLX0lOMzIoSW9DLCBCMl9JMkNfQ1RSTCwgJkkyY0N0cmwpOwkJXAorCVNLX09VVDMyKElvQywgQjJfSTJDX0NUUkwsIEkyY0N0cmwgfCBJMkNfU1RPUCk7CVwKK30KKworI2RlZmluZSBTS19JMkNfR0VUX0NUTChJb0MsIHBJMmNDdHJsKQlTS19JTjMyKElvQywgQjJfSTJDX0NUUkwsIHBJMmNDdHJsKQorCisvKgorICogTWFjcm9zIHRvIGFjY2VzcyB0aGUgVFdTSSBTVyBSZWdpc3RlcnMKKyAqLworI2RlZmluZSBTS19JMkNfU0VUX0JJVChJb0MsIFNldEJpdHMpIHsJCQlcCisJU0tfVTgJT3JnQml0czsJCQkJXAorCVNLX0lOOChJb0MsIEIyX0kyQ19TVywgJk9yZ0JpdHMpOwkJXAorCVNLX09VVDgoSW9DLCBCMl9JMkNfU1csIE9yZ0JpdHMgfCAoU0tfVTgpKFNldEJpdHMpKTsJXAorfQorCisjZGVmaW5lIFNLX0kyQ19DTFJfQklUKElvQywgQ2xyQml0cykgewkJCVwKKwlTS19VOAlPcmdCaXRzOwkJCQlcCisJU0tfSU44KElvQywgQjJfSTJDX1NXLCAmT3JnQml0cyk7CQlcCisJU0tfT1VUOChJb0MsIEIyX0kyQ19TVywgT3JnQml0cyAmIH4oKFNLX1U4KShDbHJCaXRzKSkpOwlcCit9CisKKyNkZWZpbmUgU0tfSTJDX0dFVF9TVyhJb0MsIHBJMmNTdykJU0tfSU44KElvQywgQjJfSTJDX1NXLCBwSTJjU3cpCisKKy8qCisgKiBkZWZpbmUgdGhlIHBvc3NpYmxlIHNlbnNvciBzdGF0ZXMKKyAqLworI2RlZmluZQlTS19TRU5fSURMRQkJMAkvKiBJZGxlOiBzZW5zb3Igbm90IHJlYWQgKi8KKyNkZWZpbmUJU0tfU0VOX1ZBTFVFCTEJLyogVmFsdWUgUmVhZCBjeWNsZSAqLworI2RlZmluZQlTS19TRU5fVkFMRVhUCTIJLyogRXh0ZW5kZWQgVmFsdWUgUmVhZCBjeWNsZSAqLworCisvKgorICogQ29udmVyc2lvbiBmYWN0b3IgdG8gY29udmVydCByZWFkIFZvbHRhZ2Ugc2Vuc29yIHRvIG1pbGxpIFZvbHQKKyAqIENvbnZlcnNpb24gZmFjdG9yIHRvIGNvbnZlcnQgcmVhZCBUZW1wZXJhdHVyZSBzZW5zb3IgdG8gMTB0aCBkZWdyZWUgQ2Vsc2l1cworICovCisjZGVmaW5lCVNLX0xNODBfVlRfTFNCCQkyMgkvKiAyMm1WIExTQiByZXNvbHV0aW9uICovCisjZGVmaW5lCVNLX0xNODBfVEVNUF9MU0IJMTAJLyogMSBkZWdyZWUgTFNCIHJlc29sdXRpb24gKi8KKyNkZWZpbmUJU0tfTE04MF9URU1QRVhUX0xTQgkgNQkvKiAwLjUgZGVncmVlIExTQiByZXNvbHV0aW9uIGZvciBleHQuIHZhbC4gKi8KKworLyoKKyAqIGZvcm11bGE6IGNvdW50ZXIgPSAoMjI1MDAqNjApLyhycG0gKiBkaXZpc29yICogcHVsc2VzLzIpCisgKiBhc3N1bWluZzogNjUwMHJwbSwgNCBwdWxzZXMsIGRpdmlzb3IgMQorICovCisjZGVmaW5lIFNLX0xNODBfRkFOX0ZBS1RPUgkoKDIyNTAwTCo2MCkvKDEqMikpCisKKy8qCisgKiBEZWZpbmUgc2Vuc29yIG1hbmFnZW1lbnQgZGF0YQorICogTWF4aW11bSBpcyByZWFjaGVkIG9uIEdlbmVzaXMgY29wcGVyIGR1YWwgcG9ydCBhbmQgWXVrb24tNjQKKyAqIEJvYXJkIHNwZWNpZmljIG1heGltdW0gaXMgaW4gcEFDLT5JMmMuTWF4U2VucworICovCisjZGVmaW5lCVNLX01BWF9TRU5TT1JTCTgJLyogbWF4aW1hbCBuby4gb2YgaW5zdGFsbGVkIHNlbnNvcnMgKi8KKyNkZWZpbmUJU0tfTUlOX1NFTlNPUlMJNQkvKiBtaW5pbWFsIG5vLiBvZiBpbnN0YWxsZWQgc2Vuc29ycyAqLworCisvKgorICogVG8gd2F0Y2ggdGhlIHN0YXRlIG1hY2hpbmUgKFNNKSB1c2UgdGhlIHRpbWVyIGluIHR3byB3YXlzCisgKiBpbnN0ZWFkIG9mIG9uZSBhcyBoaXRoZXJ0bworICovCisjZGVmaW5lCVNLX1RJTUVSX1dBVENIX1NNCQkwCS8qIFdhdGNoIHRoZSBTTSB0byBmaW5pc2ggaW4gYSBzcGVjLiB0aW1lICovCisjZGVmaW5lCVNLX1RJTUVSX05FV19HQVVHSU5HCTEJLyogU3RhcnQgYSBuZXcgZ2F1Z2luZyB3aGVuIHRpbWVyIGV4cGlyZXMgKi8KKworLyoKKyAqIERlZmluZXMgZm9yIHRoZSBpbmRpdmlkdWFsIHRocmVzaG9sZHMKKyAqLworCisvKiBUZW1wZXJhdHVyZSBzZW5zb3IgKi8KKyNkZWZpbmUJU0tfU0VOX1RFTVBfSElHSF9FUlIJODAwCS8qIFRlbXBlcmF0dXJlIEhpZ2ggRXJyICBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1RFTVBfSElHSF9XQVJOCTcwMAkvKiBUZW1wZXJhdHVyZSBIaWdoIFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9URU1QX0xPV19XQVJOCTEwMAkvKiBUZW1wZXJhdHVyZSBMb3cgIFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9URU1QX0xPV19FUlIJCSAgMAkvKiBUZW1wZXJhdHVyZSBMb3cgIEVyciAgVGhyZXNob2xkICovCisKKy8qIFZDQyB3aGljaCBzaG91bGQgYmUgNSBWICovCisjZGVmaW5lCVNLX1NFTl9QQ0lfNVZfSElHSF9FUlIJCTU1ODgJLyogVm9sdGFnZSBQQ0kgSGlnaCBFcnIgIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUENJXzVWX0hJR0hfV0FSTgkJNTM0NgkvKiBWb2x0YWdlIFBDSSBIaWdoIFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9QQ0lfNVZfTE9XX1dBUk4JCTQ2NjQJLyogVm9sdGFnZSBQQ0kgTG93ICBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUENJXzVWX0xPV19FUlIJCTQ0MjIJLyogVm9sdGFnZSBQQ0kgTG93ICBFcnIgIFRocmVzaG9sZCAqLworCisvKgorICogVklPIG1heSBiZSA1IFYgb3IgMy4zIFYuIEluaXRpYWxpemF0aW9uIHRha2VzIHR3byBwYXJ0czoKKyAqIDEuIEluaXRpYWxpemUgbG93ZXN0IGxvd2VyIGxpbWl0IGFuZCBoaWdoZXN0IGhpZ2hlciBsaW1pdC4KKyAqIDIuIEFmdGVyIHRoZSBmaXJzdCB2YWx1ZSBpcyByZWFkIGNvcnJlY3QgdGhlIHVwcGVyIG9yIHRoZSBsb3dlciBsaW1pdCB0bworICogICAgdGhlIGFwcHJvcHJpYXRlIEMgY29uc3RhbnQuCisgKgorICogV2FybmluZyBsaW1pdHMgYXJlICstNSUgb2YgdGhlIGV4ZXBlY3RlZCB2b2x0YWdlLgorICogRXJyb3IgbGltaXRzIGFyZSArLTEwJSBvZiB0aGUgZXhwZWN0ZWQgdm9sdGFnZS4KKyAqLworCisvKiBCdWcgZml4IEFGOiAxNi5BdWcuMjAwMTogQ29ycmVjdCB0aGUgaW5pdCBiYXNlIG9mIExNODAgc2Vuc29yICovCisKKyNkZWZpbmUJU0tfU0VOX1BDSV9JT181Vl9ISUdIX0VSUgk1NTY2CS8qICsgMTAlIFYgUENJLUlPIEhpZ2ggRXJyIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUENJX0lPXzVWX0hJR0hfV0FSTgk1MzI0CS8qICsgIDUlIFYgUENJLUlPIEhpZ2ggV2FybiBUaHJlc2hvbGQgKi8KKwkJCQkJLyoJCTUwMDAJbVZvbHQgKi8KKyNkZWZpbmUJU0tfU0VOX1BDSV9JT181Vl9MT1dfV0FSTgk0Njg2CS8qIC0gIDUlIFYgUENJLUlPIExvdyBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUENJX0lPXzVWX0xPV19FUlIJNDQ0NAkvKiAtIDEwJSBWIFBDSS1JTyBMb3cgRXJyIFRocmVzaG9sZCAqLworCisjZGVmaW5lCVNLX1NFTl9QQ0lfSU9fUkFOR0VfTElNSVRFUgk0MDAwCS8qIDQwMDAgbVYgcmFuZ2UgZGVsaW1pdGVyICovCisKKy8qIGNvcnJlY3Rpb24gdmFsdWVzIGZvciB0aGUgc2Vjb25kIHBhc3MgKi8KKyNkZWZpbmUJU0tfU0VOX1BDSV9JT18zVjNfSElHSF9FUlIJMzg1MAkvKiArIDE1JSBWIFBDSS1JTyBIaWdoIEVyciBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1BDSV9JT18zVjNfSElHSF9XQVJOCTM2NzQJLyogKyAxMCUgViBQQ0ktSU8gSGlnaCBXYXJuIFRocmVzaG9sZCAqLworCQkJCQkvKgkJMzMwMAltVm9sdCAqLworI2RlZmluZQlTS19TRU5fUENJX0lPXzNWM19MT1dfV0FSTgkyOTI2CS8qIC0gMTAlIFYgUENJLUlPIExvdyBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUENJX0lPXzNWM19MT1dfRVJSCTI3NzIJLyogLSAxNSUgViBQQ0ktSU8gTG93IEVyciAgVGhyZXNob2xkICovCisKKy8qCisgKiBWREQgdm9sdGFnZQorICovCisjZGVmaW5lCVNLX1NFTl9WRERfSElHSF9FUlIJCTM2MzAJLyogVm9sdGFnZSBBU0lDIEhpZ2ggRXJyICBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1ZERF9ISUdIX1dBUk4JMzQ3NgkvKiBWb2x0YWdlIEFTSUMgSGlnaCBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fVkREX0xPV19XQVJOCQkzMTQ2CS8qIFZvbHRhZ2UgQVNJQyBMb3cgIFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9WRERfTE9XX0VSUgkJMjk3MAkvKiBWb2x0YWdlIEFTSUMgTG93ICBFcnIgIFRocmVzaG9sZCAqLworCisvKgorICogUEhZIFBMTCAzVjMgdm9sdGFnZQorICovCisjZGVmaW5lCVNLX1NFTl9QTExfM1YzX0hJR0hfRVJSCQkzNjMwCS8qIFZvbHRhZ2UgUE1BIEhpZ2ggRXJyICBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1BMTF8zVjNfSElHSF9XQVJOCTM0NzYJLyogVm9sdGFnZSBQTUEgSGlnaCBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUExMXzNWM19MT1dfV0FSTgkJMzE0NgkvKiBWb2x0YWdlIFBNQSBMb3cgIFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9QTExfM1YzX0xPV19FUlIJCTI5NzAJLyogVm9sdGFnZSBQTUEgTG93ICBFcnIgIFRocmVzaG9sZCAqLworCisvKgorICogVkFVWCAoWVVLT04gb25seSkKKyAqLworI2RlZmluZQlTS19TRU5fVkFVWF8zVjNfSElHSF9FUlIJMzYzMAkvKiBWb2x0YWdlIFZBVVggSGlnaCBFcnIgVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9WQVVYXzNWM19ISUdIX1dBUk4JMzQ3NgkvKiBWb2x0YWdlIFZBVVggSGlnaCBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fVkFVWF8zVjNfTE9XX1dBUk4JMzE0NgkvKiBWb2x0YWdlIFZBVVggTG93IFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9WQVVYXzNWM19MT1dfRVJSCQkyOTcwCS8qIFZvbHRhZ2UgVkFVWCBMb3cgRXJyIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fVkFVWF8wVl9XQVJOX0VSUgkJICAgMAkvKiBpZiBWQVVYIG5vdCBwcmVzZW50ICovCisjZGVmaW5lCVNLX1NFTl9WQVVYX1JBTkdFX0xJTUlURVIJMTAwMAkvKiAxMDAwIG1WIHJhbmdlIGRlbGltaXRlciAqLworCisvKgorICogUEhZIDJWNSB2b2x0YWdlCisgKi8KKyNkZWZpbmUJU0tfU0VOX1BIWV8yVjVfSElHSF9FUlIJCTI3NTAJLyogVm9sdGFnZSBQSFkgSGlnaCBFcnIgVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9QSFlfMlY1X0hJR0hfV0FSTgkyNjQwCS8qIFZvbHRhZ2UgUEhZIEhpZ2ggV2FybiBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1BIWV8yVjVfTE9XX1dBUk4JCTIzNzYJLyogVm9sdGFnZSBQSFkgTG93IFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9QSFlfMlY1X0xPV19FUlIJCTIyMjIJLyogVm9sdGFnZSBQSFkgTG93IEVyciBUaHJlc2hvbGQgKi8KKworLyoKKyAqIEFTSUMgQ29yZSAxVjUgdm9sdGFnZSAoWVVLT04gb25seSkKKyAqLworI2RlZmluZQlTS19TRU5fQ09SRV8xVjVfSElHSF9FUlIJMTY1MAkvKiBWb2x0YWdlIEFTSUMgQ29yZSBIaWdoIEVyciBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX0NPUkVfMVY1X0hJR0hfV0FSTgkxNTc1CS8qIFZvbHRhZ2UgQVNJQyBDb3JlIEhpZ2ggV2FybiBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX0NPUkVfMVY1X0xPV19XQVJOCTE0MjUJLyogVm9sdGFnZSBBU0lDIENvcmUgTG93IFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9DT1JFXzFWNV9MT1dfRVJSIAkxMzUwCS8qIFZvbHRhZ2UgQVNJQyBDb3JlIExvdyBFcnIgVGhyZXNob2xkICovCisKKy8qCisgKiBGQU4gMSBzcGVlZAorICovCisvKiBhc3N1bWluZzogNjUwMHJwbSArLTE1JSwgNCBwdWxzZXMsCisgKiB3YXJuaW5nIGF0Ogk4MCAlCisgKiBlcnJvciBhdDoJNzAgJQorICogbm8gdXBwZXIgbGltaXQKKyAqLworI2RlZmluZQlTS19TRU5fRkFOX0hJR0hfRVJSCQkyMDAwMAkvKiBGQU4gU3BlZWQgSGlnaCBFcnIgVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9GQU5fSElHSF9XQVJOCTIwMDAwCS8qIEZBTiBTcGVlZCBIaWdoIFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9GQU5fTE9XX1dBUk4JCSA1MjAwCS8qIEZBTiBTcGVlZCBMb3cgV2FybiBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX0ZBTl9MT1dfRVJSCQkgNDU1MAkvKiBGQU4gU3BlZWQgTG93IEVyciBUaHJlc2hvbGQgKi8KKworLyoKKyAqIFNvbWUgVm9sdGFnZXMgbmVlZCBkeW5hbWljIHRocmVzaG9sZHMKKyAqLworI2RlZmluZQlTS19TRU5fRFlOX0lOSVRfTk9ORQkJIDAgIC8qIE5vIGR5bmFtaWMgaW5pdCBvZiB0aHJlc2hvbGRzICovCisjZGVmaW5lCVNLX1NFTl9EWU5fSU5JVF9QQ0lfSU8JCTEwICAvKiBJbml0IFBDSS1JTyB3aXRoIG5ldyB0aHJlc2hvbGRzICovCisjZGVmaW5lCVNLX1NFTl9EWU5fSU5JVF9WQVVYCQkxMSAgLyogSW5pdCBWQVVYIHdpdGggbmV3IHRocmVzaG9sZHMgKi8KKworZXh0ZXJuCWludCBTa0xtODBSZWFkU2Vuc29yKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1NFTlNPUiAqcFNlbik7CisjZW5kaWYJLyogbl9JTkNfU0tHRUkyQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWluaXQuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlaW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NGY0N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWluaXQuaApAQCAtMCwwICsxLDg1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZ2Vpbml0LmgKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIENvbW1vbiBNb2R1bGVzCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuODMgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDkvMTYgMTQ6MDc6MzcgJAorICogUHVycG9zZToJU3RydWN0dXJlcyBhbmQgcHJvdG90eXBlcyBmb3IgdGhlIEdFIEluaXQgTW9kdWxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNfU0tHRUlOSVRfSF8KKyNkZWZpbmUgX19JTkNfU0tHRUlOSVRfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgkvKiBfX2NwbHVzcGx1cyAqLworCisvKiBkZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNLX1RFU1RfVkFMCQkweDExMzM1NTc3VUwKKworLyogbW9kaWZ5aW5nIExpbmsgTEVEIGJlaGF2aW91ciAodXNlZCB3aXRoIFNrR2VMaW5rTEVEKCkpICovCisjZGVmaW5lIFNLX0xOS19PRkYJCUxFRF9PRkYKKyNkZWZpbmUgU0tfTE5LX09OCQkoTEVEX09OIHwgTEVEX0JMS19PRkYgfCBMRURfU1lOQ19PRkYpCisjZGVmaW5lIFNLX0xOS19CTElOSwkoTEVEX09OIHwgTEVEX0JMS19PTiAgfCBMRURfU1lOQ19PTikKKyNkZWZpbmUgU0tfTE5LX1BFUk0JCShMRURfT04gfCBMRURfQkxLX09GRiB8IExFRF9TWU5DX09OKQorI2RlZmluZSBTS19MTktfVFNUCQkoTEVEX09OIHwgTEVEX0JMS19PTiAgfCBMRURfU1lOQ19PRkYpCisKKy8qIHBhcmFtZXRlciAnTW9kZScgd2hlbiBjYWxsaW5nIFNLX0hXQUNfTElOS19MRUQoKSAqLworI2RlZmluZSBTS19MRURfT0ZGCQlMRURfT0ZGCisjZGVmaW5lIFNLX0xFRF9BQ1RJVkUJKExFRF9PTiB8IExFRF9CTEtfT0ZGIHwgTEVEX1NZTkNfT0ZGKQorI2RlZmluZSBTS19MRURfU1RBTkRCWQkoTEVEX09OIHwgTEVEX0JMS19PTiAgfCBMRURfU1lOQ19PRkYpCisKKy8qIGFkZHJlc3NpbmcgTEVEIFJlZ2lzdGVycyBpbiBTa0dlWG1pdExFRCgpICovCisjZGVmaW5lIFhNSVRfTEVEX0lOSQkwCisjZGVmaW5lIFhNSVRfTEVEX0NOVAkoUlhfTEVEX1ZBTCAtIFJYX0xFRF9JTkkpCisjZGVmaW5lIFhNSVRfTEVEX0NUUkwJKFJYX0xFRF9DVFJMLSBSWF9MRURfSU5JKQorI2RlZmluZSBYTUlUX0xFRF9UU1QJKFJYX0xFRF9UU1QgLSBSWF9MRURfSU5JKQorCisvKiBwYXJhbWV0ZXIgJ01vZGUnIHdoZW4gY2FsbGluZyBTa0dlWG1pdExFRCgpICovCisjZGVmaW5lIFNLX0xFRF9ESVMJMAorI2RlZmluZSBTS19MRURfRU5BCTEKKyNkZWZpbmUgU0tfTEVEX1RTVAkyCisKKy8qIENvdW50ZXIgYW5kIFRpbWVyIGNvbnN0YW50cywgZm9yIGEgaG9zdCBjbG9jayBvZiA2Mi41IE1IeiAqLworI2RlZmluZSBTS19YTUlUX0RVUgkJMHgwMDJmYWYwOFVMCS8qICA1MCBtcyAqLworI2RlZmluZSBTS19CTEtfRFVSCQkweDAxZGNkNjUwVUwJLyogNTAwIG1zICovCisKKyNkZWZpbmUgU0tfRFBPTExfREVGCTB4MDBlZTZiMjhVTAkvKiAyNTAgbXMgYXQgNjIuNSBNSHogKi8KKworI2RlZmluZSBTS19EUE9MTF9NQVgJMHgwMGZmZmZmZlVMCS8qIDI2OCBtcyBhdCA2Mi41IE1IeiAqLworCQkJCQkJCQkJCS8qIDIxNSBtcyBhdCA3OC4xMiBNSHogKi8KKworI2RlZmluZSBTS19GQUNUXzYyCQkxMDAJCQkvKiBpcyBnaXZlbiBpbiBwZXJjZW50ICovCisjZGVmaW5lIFNLX0ZBQ1RfNTMJCSA4NSAgICAgICAgIC8qIG9uIEdFTkVTSVM6CTUzLjEyIE1IeiAqLworI2RlZmluZSBTS19GQUNUXzc4CQkxMjUJCQkvKiBvbiBZVUtPTjoJNzguMTIgTUh6ICovCisKKy8qIFRpbWVvdXQgdmFsdWVzICovCisjZGVmaW5lIFNLX01BQ19UT181Mwk3MgkJCS8qIE1BQyBhcmJpdGVyIHRpbWVvdXQgKi8KKyNkZWZpbmUgU0tfUEtUX1RPXzUzCTB4MjAwMAkJLyogUGFja2V0IGFyYml0ZXIgdGltZW91dCAqLworI2RlZmluZSBTS19QS1RfVE9fTUFYCTB4ZmZmZgkJLyogTWF4aW11bSB2YWx1ZSAqLworI2RlZmluZSBTS19SSV9UT181MwkJMzYJCQkvKiBSQU0gaW50ZXJmYWNlIHRpbWVvdXQgKi8KKworI2RlZmluZSBTS19QSFlfQUNDX1RPCTYwMDAwMAkJLyogUEhZIGFjY2VzcyB0aW1lb3V0ICovCisKKy8qIFJBTSBCdWZmZXIgSGlnaCBQYXVzZSBUaHJlc2hvbGQgdmFsdWVzICovCisjZGVmaW5lIFNLX1JCX1VMUFAJCSggOCAqIDEwMjQpCS8qIFVwcGVyIExldmVsIGluIGtCLzggKi8KKyNkZWZpbmUgU0tfUkJfTExQUF9TCSgxMCAqIDEwMjQpCS8qIExvd2VyIExldmVsIGZvciBzbWFsbCBRdWV1ZXMgKi8KKyNkZWZpbmUgU0tfUkJfTExQUF9CCSgxNiAqIDEwMjQpCS8qIExvd2VyIExldmVsIGZvciBiaWcgUXVldWVzICovCisKKyNpZm5kZWYgU0tfQk1VX1JYX1dNCisjZGVmaW5lIFNLX0JNVV9SWF9XTQkweDYwMAkJLyogQk1VIFJ4IFdhdGVybWFyayAqLworI2VuZGlmCisjaWZuZGVmIFNLX0JNVV9UWF9XTQorI2RlZmluZSBTS19CTVVfVFhfV00JMHg2MDAJCS8qIEJNVSBUeCBXYXRlcm1hcmsgKi8KKyNlbmRpZgorCisvKiBYTUFDIElJIFJ4IEhpZ2ggV2F0ZXJtYXJrICovCisjZGVmaW5lIFNLX1hNX1JYX0hJX1dNCTB4MDVhYQkJLyogMTQ1MCAqLworCisvKiBYTUFDIElJIFR4IFRocmVzaG9sZCAqLworI2RlZmluZSBTS19YTV9USFJfUkVETAkweDAxZmIJCS8qIC4uIGZvciByZWR1bmRhbnQgbGluayB1c2FnZSAqLworI2RlZmluZSBTS19YTV9USFJfU0wJMHgwMWZiCQkvKiAuLiBmb3Igc2luZ2xlIGxpbmsgYWRhcHRlcnMgKi8KKyNkZWZpbmUgU0tfWE1fVEhSX01VTEwJMHgwMWZiCQkvKiAuLiBmb3IgbXVsdGlwbGUgbGluayB1c2FnZSAqLworI2RlZmluZSBTS19YTV9USFJfSlVNQk8JMHgwM2ZjCQkvKiAuLiBmb3IganVtYm8gZnJhbWUgdXNhZ2UgKi8KKworLyogdmFsdWVzIGZvciBHSVBvcnRVc2FnZSAqLworI2RlZmluZSBTS19SRURfTElOSwkJMQkJLyogcmVkdW5kYW50IGxpbmsgdXNhZ2UgKi8KKyNkZWZpbmUgU0tfTVVMX0xJTksJCTIJCS8qIG11bHRpcGxlIGxpbmsgdXNhZ2UgKi8KKyNkZWZpbmUgU0tfSlVNQk9fTElOSwkzCQkvKiBkcml2ZXIgdXNlcyBqdW1ibyBmcmFtZXMgKi8KKworLyogTWluaW11bSBSQU0gQnVmZmVyIFJ4IFF1ZXVlIFNpemUgKi8KKyNkZWZpbmUgU0tfTUlOX1JYUV9TSVpFCTE2CQkvKiAxNiBrQiAqLworCisvKiBNaW5pbXVtIFJBTSBCdWZmZXIgVHggUXVldWUgU2l6ZSAqLworI2RlZmluZSBTS19NSU5fVFhRX1NJWkUJMTYJCS8qIDE2IGtCICovCisKKy8qIFF1ZXVlIFNpemUgdW5pdHMgKi8KKyNkZWZpbmUgUVpfVU5JVFMJCTB4NworI2RlZmluZSBRWl9TVEVQCQkJOAorCisvKiBQZXJjZW50YWdlIG9mIHF1ZXVlIHNpemUgZnJvbSB3aG9sZSBtZW1vcnkgKi8KKy8qIDgwICUgZm9yIHJlY2VpdmUgKi8KKyNkZWZpbmUgUkFNX1FVT1RBX1JYCTgwTAorLyogMCUgZm9yIHN5bmMgdHJhbnNmZXIgKi8KKyNkZWZpbmUJUkFNX1FVT1RBX1NZTkMJMEwKKy8qIHRoZSByZXN0ICgyMCUpIGlzIHRha2VuIGZvciBhc3luYyB0cmFuc2ZlciAqLworCisvKiBHZXQgdGhlIHJvdW5kZWQgcXVldWUgc2l6ZSBpbiBCeXRlcyBpbiA4ayBzdGVwcyAqLworI2RlZmluZSBST1VORF9RVUVVRV9TSVpFKFNpemVJbkJ5dGVzKQkJCQkJXAorCSgoKCh1bnNpZ25lZCBsb25nKSAoU2l6ZUluQnl0ZXMpICsgKFFaX1NURVAqMTAyNEwpLTEpIC8gMTAyNCkgJglcCisJfihRWl9TVEVQLTEpKQorCisvKiBHZXQgdGhlIHJvdW5kZWQgcXVldWUgc2l6ZSBpbiBLQnl0ZXMgaW4gOGsgc3RlcHMgKi8KKyNkZWZpbmUgUk9VTkRfUVVFVUVfU0laRV9LQihLaWxvYnl0ZXMpIFwKKwlST1VORF9RVUVVRV9TSVpFKChLaWxvYnl0ZXMpICogMTAyNEwpCisKKy8qIFR5cGVzIG9mIFJBTSBCdWZmZXIgUXVldWVzICovCisjZGVmaW5lIFNLX1JYX1NSQU1fUQkxCS8qIHNtYWxsIHJlY2VpdmUgcXVldWUgKi8KKyNkZWZpbmUgU0tfUlhfQlJBTV9RCTIJLyogYmlnIHJlY2VpdmUgcXVldWUgKi8KKyNkZWZpbmUgU0tfVFhfUkFNX1EJCTMJLyogc21hbGwgb3IgYmlnIHRyYW5zbWl0IHF1ZXVlICovCisKKy8qIHBhcmFtZXRlciAnRGlyJyB3aGVuIGNhbGxpbmcgU2tHZVN0b3BQb3J0KCkgKi8KKyNkZWZpbmUgU0tfU1RPUF9UWAkxCS8qIFN0b3BzIHRoZSB0cmFuc21pdCBwYXRoLCByZXNldHMgdGhlIFhNQUMgKi8KKyNkZWZpbmUgU0tfU1RPUF9SWAkyCS8qIFN0b3BzIHRoZSByZWNlaXZlIHBhdGggKi8KKyNkZWZpbmUgU0tfU1RPUF9BTEwJMwkvKiBTdG9wcyBSeCBhbmQgVHggcGF0aCwgcmVzZXRzIHRoZSBYTUFDICovCisKKy8qIHBhcmFtZXRlciAnUnN0TW9kZScgd2hlbiBjYWxsaW5nIFNrR2VTdG9wUG9ydCgpICovCisjZGVmaW5lIFNLX1NPRlRfUlNUCTEJLyogcGVyZm9ybSBhIHNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lIFNLX0hBUkRfUlNUCTIJLyogcGVyZm9ybSBhIGhhcmR3YXJlIHJlc2V0ICovCisKKy8qIEluaXQgTGV2ZWxzICovCisjZGVmaW5lIFNLX0lOSVRfREFUQQkwCS8qIEluaXQgbGV2ZWwgMDogaW5pdCBkYXRhIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgU0tfSU5JVF9JTwkJMQkvKiBJbml0IGxldmVsIDE6IGluaXQgd2l0aCBJT3MgKi8KKyNkZWZpbmUgU0tfSU5JVF9SVU4JCTIJLyogSW5pdCBsZXZlbCAyOiBpbml0IGZvciBydW4gdGltZSAqLworCisvKiBMaW5rIE1vZGUgUGFyYW1ldGVyICovCisjZGVmaW5lIFNLX0xNT0RFX0hBTEYJCTEJLyogSGFsZiBEdXBsZXggTW9kZSAqLworI2RlZmluZSBTS19MTU9ERV9GVUxMCQkyCS8qIEZ1bGwgRHVwbGV4IE1vZGUgKi8KKyNkZWZpbmUgU0tfTE1PREVfQVVUT0hBTEYJMwkvKiBBdXRvSGFsZiBEdXBsZXggTW9kZSAqLworI2RlZmluZSBTS19MTU9ERV9BVVRPRlVMTAk0CS8qIEF1dG9GdWxsIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX0FVVE9CT1RICTUJLyogQXV0b0JvdGggRHVwbGV4IE1vZGUgKi8KKyNkZWZpbmUgU0tfTE1PREVfQVVUT1NFTlNFCTYJLyogY29uZmlndXJlZCBtb2RlIGF1dG8gc2Vuc2luZyAqLworI2RlZmluZSBTS19MTU9ERV9JTkRFVEVSTUlOQVRFRAk3CS8qIGluZGV0ZXJtaW5hdGVkICovCisKKy8qIEF1dG8tbmVnb3RpYXRpb24gdGltZW91dCBpbiAxMDBtcyBncmFudWxhcml0eSAqLworI2RlZmluZSBTS19BTkRfTUFYX1RPCQk2CS8qIFdhaXQgNjAwIG1zZWMgYmVmb3JlIGxpbmsgY29tZXMgdXAgKi8KKworLyogQXV0by1uZWdvdGlhdGlvbiBlcnJvciBjb2RlcyAqLworI2RlZmluZSBTS19BTkRfT0sJCQkwCS8qIG5vIGVycm9yICovCisjZGVmaW5lIFNLX0FORF9PVEhFUgkJMQkvKiBvdGhlciBlcnJvciB0aGFuIGJlbG93ICovCisjZGVmaW5lIFNLX0FORF9EVVBfQ0FQCQkyCS8qIER1cGxleCBjYXBhYmlsaXRpZXMgZXJyb3IgKi8KKworCisvKiBMaW5rIFNwZWVkIENhcGFiaWxpdGllcyAqLworI2RlZmluZSBTS19MU1BFRURfQ0FQX0FVVE8JCQkoMTw8MCkJLyogQXV0b21hdGljIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgU0tfTFNQRUVEX0NBUF8xME1CUFMJCSgxPDwxKQkvKiAxMCBNYnBzICovCisjZGVmaW5lIFNLX0xTUEVFRF9DQVBfMTAwTUJQUwkJKDE8PDIpCS8qIDEwMCBNYnBzICovCisjZGVmaW5lIFNLX0xTUEVFRF9DQVBfMTAwME1CUFMJCSgxPDwzKQkvKiAxMDAwIE1icHMgKi8KKyNkZWZpbmUgU0tfTFNQRUVEX0NBUF9JTkRFVEVSTUlOQVRFRCAoMTw8NCkgLyogaW5kZXRlcm1pbmF0ZWQgKi8KKworLyogTGluayBTcGVlZCBQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgU0tfTFNQRUVEX0FVVE8JCQkJMQkvKiBBdXRvbWF0aWMgcmVzb2x1dGlvbiAqLworI2RlZmluZSBTS19MU1BFRURfMTBNQlBTCQkJMgkvKiAxMCBNYnBzICovCisjZGVmaW5lIFNLX0xTUEVFRF8xMDBNQlBTCQkJMwkvKiAxMDAgTWJwcyAqLworI2RlZmluZSBTS19MU1BFRURfMTAwME1CUFMJCQk0CS8qIDEwMDAgTWJwcyAqLworI2RlZmluZSBTS19MU1BFRURfSU5ERVRFUk1JTkFURUQJNQkvKiBpbmRldGVybWluYXRlZCAqLworCisvKiBMaW5rIFNwZWVkIEN1cnJlbnQgU3RhdGUgKi8KKyNkZWZpbmUgU0tfTFNQRUVEX1NUQVRfVU5LTk9XTgkJMQorI2RlZmluZSBTS19MU1BFRURfU1RBVF8xME1CUFMJCTIKKyNkZWZpbmUgU0tfTFNQRUVEX1NUQVRfMTAwTUJQUyAJCTMKKyNkZWZpbmUgU0tfTFNQRUVEX1NUQVRfMTAwME1CUFMJCTQKKyNkZWZpbmUgU0tfTFNQRUVEX1NUQVRfSU5ERVRFUk1JTkFURUQgNQorCisKKy8qIExpbmsgQ2FwYWJpbGl0eSBQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgU0tfTE1PREVfQ0FQX0hBTEYJCSgxPDwwKQkvKiBIYWxmIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX0NBUF9GVUxMCQkoMTw8MSkJLyogRnVsbCBEdXBsZXggTW9kZSAqLworI2RlZmluZSBTS19MTU9ERV9DQVBfQVVUT0hBTEYJKDE8PDIpCS8qIEF1dG9IYWxmIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX0NBUF9BVVRPRlVMTAkoMTw8MykJLyogQXV0b0Z1bGwgRHVwbGV4IE1vZGUgKi8KKyNkZWZpbmUgU0tfTE1PREVfQ0FQX0lOREVURVJNSU5BVEVEICgxPDw0KSAvKiBpbmRldGVybWluYXRlZCAqLworCisvKiBMaW5rIE1vZGUgQ3VycmVudCBTdGF0ZSAqLworI2RlZmluZSBTS19MTU9ERV9TVEFUX1VOS05PV04JMQkvKiBVbmtub3duIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX1NUQVRfSEFMRgkJMgkvKiBIYWxmIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX1NUQVRfRlVMTAkJMwkvKiBGdWxsIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX1NUQVRfQVVUT0hBTEYJNAkvKiBIYWxmIER1cGxleCBNb2RlIG9idGFpbmVkIGJ5IEF1dG8tTmVnICovCisjZGVmaW5lIFNLX0xNT0RFX1NUQVRfQVVUT0ZVTEwJNQkvKiBGdWxsIER1cGxleCBNb2RlIG9idGFpbmVkIGJ5IEF1dG8tTmVnICovCisjZGVmaW5lIFNLX0xNT0RFX1NUQVRfSU5ERVRFUk1JTkFURUQgNgkvKiBpbmRldGVybWluYXRlZCAqLworCisvKiBGbG93IENvbnRyb2wgTW9kZSBQYXJhbWV0ZXIgKGFuZCBjYXBhYmlsaXRpZXMpICovCisjZGVmaW5lIFNLX0ZMT1dfTU9ERV9OT05FCQkxCS8qIE5vIEZsb3ctQ29udHJvbCAqLworI2RlZmluZSBTS19GTE9XX01PREVfTE9DX1NFTkQJMgkvKiBMb2NhbCBzdGF0aW9uIHNlbmRzIFBBVVNFICovCisjZGVmaW5lIFNLX0ZMT1dfTU9ERV9TWU1NRVRSSUMJMwkvKiBCb3RoIHN0YXRpb25zIG1heSBzZW5kIFBBVVNFICovCisjZGVmaW5lIFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNCTQJLyogQm90aCBzdGF0aW9ucyBtYXkgc2VuZCBQQVVTRSBvcgorCQkJCQkgKiBqdXN0IHRoZSByZW1vdGUgc3RhdGlvbiBtYXkgc2VuZCBQQVVTRQorCQkJCQkgKi8KKyNkZWZpbmUgU0tfRkxPV19NT0RFX0lOREVURVJNSU5BVEVEIDUJLyogaW5kZXRlcm1pbmF0ZWQgKi8KKworLyogRmxvdyBDb250cm9sIFN0YXR1cyBQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgU0tfRkxPV19TVEFUX05PTkUJCTEJLyogTm8gRmxvdyBDb250cm9sICovCisjZGVmaW5lIFNLX0ZMT1dfU1RBVF9SRU1fU0VORAkyCS8qIFJlbW90ZSBTdGF0aW9uIHNlbmRzIFBBVVNFICovCisjZGVmaW5lIFNLX0ZMT1dfU1RBVF9MT0NfU0VORAkzCS8qIExvY2FsIHN0YXRpb24gc2VuZHMgUEFVU0UgKi8KKyNkZWZpbmUgU0tfRkxPV19TVEFUX1NZTU1FVFJJQwk0CS8qIEJvdGggc3RhdGlvbiBtYXkgc2VuZCBQQVVTRSAqLworI2RlZmluZSBTS19GTE9XX1NUQVRfSU5ERVRFUk1JTkFURUQgNQkvKiBpbmRldGVybWluYXRlZCAqLworCisvKiBNYXN0ZXIvU2xhdmUgTW9kZSBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgU0tfTVNfQ0FQX0FVVE8JCSgxPDwwKQkvKiBBdXRvbWF0aWMgcmVzb2x1dGlvbiAqLworI2RlZmluZSBTS19NU19DQVBfTUFTVEVSCSgxPDwxKQkvKiBUaGlzIHN0YXRpb24gaXMgbWFzdGVyICovCisjZGVmaW5lIFNLX01TX0NBUF9TTEFWRQkJKDE8PDIpCS8qIFRoaXMgc3RhdGlvbiBpcyBzbGF2ZSAqLworI2RlZmluZSBTS19NU19DQVBfSU5ERVRFUk1JTkFURUQgKDE8PDMpCS8qIGluZGV0ZXJtaW5hdGVkICovCisKKy8qIFNldCBNYXN0ZXIvU2xhdmUgTW9kZSBQYXJhbWV0ZXIgKGFuZCBjYXBhYmlsaXRpZXMpICovCisjZGVmaW5lIFNLX01TX01PREVfQVVUTwkJMQkvKiBBdXRvbWF0aWMgcmVzb2x1dGlvbiAqLworI2RlZmluZSBTS19NU19NT0RFX01BU1RFUgkyCS8qIFRoaXMgc3RhdGlvbiBpcyBtYXN0ZXIgKi8KKyNkZWZpbmUgU0tfTVNfTU9ERV9TTEFWRQkzCS8qIFRoaXMgc3RhdGlvbiBpcyBzbGF2ZSAqLworI2RlZmluZSBTS19NU19NT0RFX0lOREVURVJNSU5BVEVEIDQJLyogaW5kZXRlcm1pbmF0ZWQgKi8KKworLyogTWFzdGVyL1NsYXZlIFN0YXR1cyBQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgU0tfTVNfU1RBVF9VTlNFVAkxCS8qIFRoZSBNL1Mgc3RhdHVzIGlzIG5vdCBzZXQgKi8KKyNkZWZpbmUgU0tfTVNfU1RBVF9NQVNURVIJMgkvKiBUaGlzIHN0YXRpb24gaXMgbWFzdGVyICovCisjZGVmaW5lIFNLX01TX1NUQVRfU0xBVkUJMwkvKiBUaGlzIHN0YXRpb24gaXMgc2xhdmUgKi8KKyNkZWZpbmUgU0tfTVNfU1RBVF9GQVVMVAk0CS8qIE0vUyByZXNvbHV0aW9uIGZhaWxlZCAqLworI2RlZmluZSBTS19NU19TVEFUX0lOREVURVJNSU5BVEVEIDUJLyogaW5kZXRlcm1pbmF0ZWQgKi8KKworLyogcGFyYW1ldGVyICdNb2RlJyB3aGVuIGNhbGxpbmcgU2tYbVNldFJ4Q21kKCkgKi8KKyNkZWZpbmUgU0tfU1RSSVBfRkNTX09OCQkoMTw8MCkJLyogRW5hYmxlICBGQ1Mgc3RyaXBwaW5nIG9mIFJ4IGZyYW1lcyAqLworI2RlZmluZSBTS19TVFJJUF9GQ1NfT0ZGCSgxPDwxKQkvKiBEaXNhYmxlIEZDUyBzdHJpcHBpbmcgb2YgUnggZnJhbWVzICovCisjZGVmaW5lIFNLX1NUUklQX1BBRF9PTgkJKDE8PDIpCS8qIEVuYWJsZSAgcGFkIGJ5dGUgc3RyaXBwaW5nIG9mIFJ4IGZyICovCisjZGVmaW5lIFNLX1NUUklQX1BBRF9PRkYJKDE8PDMpCS8qIERpc2FibGUgcGFkIGJ5dGUgc3RyaXBwaW5nIG9mIFJ4IGZyICovCisjZGVmaW5lIFNLX0xFTkVSUl9PS19PTgkJKDE8PDQpCS8qIERvbid0IGNoayBmciBmb3IgaW4gcmFuZ2UgbGVuIGVycm9yICovCisjZGVmaW5lIFNLX0xFTkVSUl9PS19PRkYJKDE8PDUpCS8qIENoZWNrIGZyYW1lcyBmb3IgaW4gcmFuZ2UgbGVuIGVycm9yICovCisjZGVmaW5lIFNLX0JJR19QS19PS19PTgkJKDE8PDYpCS8qIERvbid0IHNldCBSeCBFcnJvciBiaXQgZm9yIGJpZyBmcmFtZXMgKi8KKyNkZWZpbmUgU0tfQklHX1BLX09LX09GRgkoMTw8NykJLyogU2V0IFJ4IEVycm9yIGJpdCBmb3IgYmlnIGZyYW1lcyAqLworI2RlZmluZSBTS19TRUxGX1JYX09OCQkoMTw8OCkJLyogRW5hYmxlICBSeCBvZiBvd24gcGFja2V0cyAqLworI2RlZmluZSBTS19TRUxGX1JYX09GRgkJKDE8PDkpCS8qIERpc2FibGUgUnggb2Ygb3duIHBhY2tldHMgKi8KKworLyogcGFyYW1ldGVyICdQYXJhJyB3aGVuIGNhbGxpbmcgU2tNYWNTZXRSeFR4RW4oKSAqLworI2RlZmluZSBTS19NQUNfTE9PUEJfT04JCSgxPDwwKQkvKiBFbmFibGUgIE1BQyBMb29wYmFjayBNb2RlICovCisjZGVmaW5lIFNLX01BQ19MT09QQl9PRkYJKDE8PDEpCS8qIERpc2FibGUgTUFDIExvb3BiYWNrIE1vZGUgKi8KKyNkZWZpbmUgU0tfUEhZX0xPT1BCX09OCQkoMTw8MikJLyogRW5hYmxlICBQSFkgTG9vcGJhY2sgTW9kZSAqLworI2RlZmluZSBTS19QSFlfTE9PUEJfT0ZGCSgxPDwzKQkvKiBEaXNhYmxlIFBIWSBMb29wYmFjayBNb2RlICovCisjZGVmaW5lIFNLX1BIWV9GVUxMRF9PTgkJKDE8PDQpCS8qIEVuYWJsZSAgR01JSSBGdWxsIER1cGxleCAqLworI2RlZmluZSBTS19QSFlfRlVMTERfT0ZGCSgxPDw1KQkvKiBEaXNhYmxlIEdNSUkgRnVsbCBEdXBsZXggKi8KKworLyogU3RhdGVzIG9mIFBTdGF0ZSAqLworI2RlZmluZSBTS19QUlRfUkVTRVQJMAkvKiB0aGUgcG9ydCBpcyByZXNldCAqLworI2RlZmluZSBTS19QUlRfU1RPUAkJMQkvKiB0aGUgcG9ydCBpcyBzdG9wcGVkIChzaW1pbGFyIHRvIFNXIHJlc2V0KSAqLworI2RlZmluZSBTS19QUlRfSU5JVAkJMgkvKiB0aGUgcG9ydCBpcyBpbml0aWFsaXplZCAqLworI2RlZmluZSBTS19QUlRfUlVOCQkzCS8qIHRoZSBwb3J0IGhhcyBhbiBhY3RpdmUgbGluayAqLworCisvKiBQSFkgcG93ZXIgZG93biBtb2RlcyAqLworI2RlZmluZSBQSFlfUE1fT1BFUkFUSU9OQUxfTU9ERQkJMAkvKiBQSFkgb3BlcmF0aW9uYWwgbW9kZSAqLworI2RlZmluZSBQSFlfUE1fREVFUF9TTEVFUAkJCTEJLyogY29tYSBtb2RlIC0tPiBtaW5pbWFsIHBvd2VyICovCisjZGVmaW5lIFBIWV9QTV9JRUVFX1BPV0VSX0RPV04JCTIJLyogSUVFRSAyMi4yLjQuMS41IGNvbXBsLiBwb3dlciBkb3duICovCisjZGVmaW5lIFBIWV9QTV9FTkVSR1lfREVURUNUCQkzCS8qIGVuZXJneSBkZXRlY3QgKi8KKyNkZWZpbmUgUEhZX1BNX0VORVJHWV9ERVRFQ1RfUExVUwk0CS8qIGVuZXJneSBkZXRlY3QgcGx1cyAqLworCisvKiBEZWZhdWx0IHJlY2VpdmUgZnJhbWUgbGltaXQgZm9yIFdvcmthcm91bmQgb2YgWE1BQyBFcnJhdGEgKi8KKyNkZWZpbmUgU0tfREVGX1JYX1dBX0xJTQlTS19DT05TVFU2NCgxMDApCisKKy8qIHZhbHVlcyBmb3IgR0lMZWRCbGlua0N0cmwgKExFRCBCbGluayBDb250cm9sKSAqLworI2RlZmluZSBTS19BQ1RfTEVEX0JMSU5LCSgxPDwwKQkvKiBBY3RpdmUgTEVEIGJsaW5raW5nICovCisjZGVmaW5lIFNLX0RVUF9MRURfTk9STUFMCSgxPDwxKQkvKiBEdXBsZXggTEVEIG5vcm1hbCAqLworI2RlZmluZSBTS19MRURfTElOSzEwMF9PTgkoMTw8MikJLyogTGluayAxMDBNIExFRCBvbiAqLworCisvKiBMaW5rIFBhcnRuZXIgU3RhdHVzICovCisjZGVmaW5lIFNLX0xJUEFfVU5LTk9XTgkwCS8qIExpbmsgcGFydG5lciBpcyBpbiB1bmtub3duIHN0YXRlICovCisjZGVmaW5lIFNLX0xJUEFfTUFOVUFMCTEJLyogTGluayBwYXJ0bmVyIGlzIGluIGRldGVjdGVkIG1hbnVhbCBzdGF0ZSAqLworI2RlZmluZSBTS19MSVBBX0FVVE8JMgkvKiBMaW5rIHBhcnRuZXIgaXMgaW4gYXV0by1uZWdvdGlhdGlvbiBzdGF0ZSAqLworCisvKiBNYXhpbXVtIFJlc3RhcnRzIGJlZm9yZSByZXN0YXJ0IGlzIGlnbm9yZWQgKDNDb20gV0EpICovCisjZGVmaW5lIFNLX01BWF9MUkVTVEFSVAkzCS8qIE1heC4gMyB0aW1lcyB0aGUgbGluayBpcyByZXN0YXJ0ZWQgKi8KKworLyogTWF4LiBBdXRvLW5lZy4gdGltZW91dHMgYmVmb3JlIGxpbmsgZGV0ZWN0aW9uIGluIHNlbnNlIG1vZGUgaXMgcmVzZXQgKi8KKyNkZWZpbmUgU0tfTUFYX0FORUdfVE8JMTAJLyogTWF4LiAxMCB0aW1lcyB0aGUgc2Vuc2UgbW9kZSBpcyByZXNldCAqLworCisvKiBzdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogTUFDIHNwZWNpZmljIGZ1bmN0aW9ucworICovCit0eXBlZGVmIHN0cnVjdCBzX0dlTWFjRnVuYyB7CisJaW50ICAoKnBGbk1hY1VwZGF0ZVN0YXRzKShTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB1bnNpZ25lZCBpbnQgUG9ydCk7CisJaW50ICAoKnBGbk1hY1N0YXRpc3RpYykoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdW5zaWduZWQgaW50IFBvcnQsCisJCQkJCQkJU0tfVTE2IFN0YXRBZGRyLCBTS19VMzIgU0tfRkFSICpwVmFsKTsKKwlpbnQgICgqcEZuTWFjUmVzZXRDb3VudGVyKShTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB1bnNpZ25lZCBpbnQgUG9ydCk7CisJaW50ICAoKnBGbk1hY092ZXJmbG93KShTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB1bnNpZ25lZCBpbnQgUG9ydCwKKwkJCQkJCSAgIFNLX1UxNiBJU3RhdHVzLCBTS19VNjQgU0tfRkFSICpwVmFsKTsKK30gU0tfR0VNQUNGVU5DOworCisvKgorICogUG9ydCBTdHJ1Y3R1cmUKKyAqLwordHlwZWRlZglzdHJ1Y3Qgc19HZVBvcnQgeworI2lmbmRlZiBTS19ESUFHCisJU0tfVElNRVIJUFdhVGltZXI7CS8qIFdvcmthcm91bmQgVGltZXIgKi8KKwlTS19USU1FUglIYWxmRHVwQ2hrVGltZXI7CisjZW5kaWYgLyogU0tfRElBRyAqLworCVNLX1UzMglQUHJldlNob3J0czsJLyogUHJldmlvdXMgU2hvcnQgQ291bnRlciBjaGVja2luZyAqLworCVNLX1UzMglQUHJldkZjczsJCS8qIFByZXZpb3VzIEZDUyBFcnJvciBDb3VudGVyIGNoZWNraW5nICovCisJU0tfVTY0CVBQcmV2Ung7CQkvKiBQcmV2aW91cyBSeE9rIENvdW50ZXIgY2hlY2tpbmcgKi8KKwlTS19VNjQJUFJ4TGltOwkJCS8qIFByZXZpb3VzIFJ4T2sgQ291bnRlciBjaGVja2luZyAqLworCVNLX1U2NAlMYXN0T2N0ZXRzOwkJLyogRm9yIGhhbGYgZHVwbGV4IGhhbmcgY2hlY2sgKi8KKwlpbnQJCVBMaW5rUmVzQ3Q7CQkvKiBMaW5rIFJlc3RhcnQgQ291bnRlciAqLworCWludAkJUEF1dG9OZWdUaW1lT3V0Oy8qIEF1dG8tbmVnb3RpYXRpb24gdGltZW91dCBjdXJyZW50IHZhbHVlICovCisJaW50CQlQQXV0b05lZ1RPQ3Q7CS8qIEF1dG8tbmVnb3RpYXRpb24gVGltZW91dCBDb3VudGVyICovCisJaW50CQlQUnhRU2l6ZTsJCS8qIFBvcnQgUnggUXVldWUgU2l6ZSBpbiBrQiAqLworCWludAkJUFhTUVNpemU7CQkvKiBQb3J0IFN5bmNocm9ub3VzICBUcmFuc21pdCBRdWV1ZSBTaXplIGluIGtCICovCisJaW50CQlQWEFRU2l6ZTsJCS8qIFBvcnQgQXN5bmNocm9ub3VzIFRyYW5zbWl0IFF1ZXVlIFNpemUgaW4ga0IgKi8KKwlTS19VMzIJUFJ4UVJhbVN0YXJ0OwkvKiBSZWNlaXZlIFF1ZXVlIFJBTSBCdWZmZXIgU3RhcnQgQWRkcmVzcyAqLworCVNLX1UzMglQUnhRUmFtRW5kOwkJLyogUmVjZWl2ZSBRdWV1ZSBSQU0gQnVmZmVyIEVuZCBBZGRyZXNzICovCisJU0tfVTMyCVBYc1FSYW1TdGFydDsJLyogU3luYyBUeCBRdWV1ZSBSQU0gQnVmZmVyIFN0YXJ0IEFkZHJlc3MgKi8KKwlTS19VMzIJUFhzUVJhbUVuZDsJCS8qIFN5bmMgVHggUXVldWUgUkFNIEJ1ZmZlciBFbmQgQWRkcmVzcyAqLworCVNLX1UzMglQWGFRUmFtU3RhcnQ7CS8qIEFzeW5jIFR4IFF1ZXVlIFJBTSBCdWZmZXIgU3RhcnQgQWRkcmVzcyAqLworCVNLX1UzMglQWGFRUmFtRW5kOwkJLyogQXN5bmMgVHggUXVldWUgUkFNIEJ1ZmZlciBFbmQgQWRkcmVzcyAqLworCVNLX1UzMglQUnhPdmVyQ250OwkJLyogUmVjZWl2ZSBPdmVyZmxvdyBDb3VudGVyICovCisJaW50CQlQUnhRT2ZmOwkJLyogUnggUXVldWUgQWRkcmVzcyBPZmZzZXQgKi8KKwlpbnQJCVBYc1FPZmY7CQkvKiBTeW5jaHJvbm91cyBUeCBRdWV1ZSBBZGRyZXNzIE9mZnNldCAqLworCWludAkJUFhhUU9mZjsJCS8qIEFzeW5jaHJvbm91cyBUeCBRdWV1ZSBBZGRyZXNzIE9mZnNldCAqLworCWludAkJUGh5VHlwZTsJCS8qIFBIWSB1c2VkIG9uIHRoaXMgcG9ydCAqLworCWludAkJUFN0YXRlOwkJCS8qIFBvcnQgc3RhdHVzIChyZXNldCwgc3RvcCwgaW5pdCwgcnVuKSAqLworCVNLX1UxNglQaHlJZDE7CQkJLyogUEhZIElkMSBvbiB0aGlzIHBvcnQgKi8KKwlTS19VMTYJUGh5QWRkcjsJCS8qIE1ESU8vTURDIFBIWSBhZGRyZXNzICovCisJU0tfVTE2CVBJc2F2ZTsJCQkvKiBTYXZlZCBJbnRlcnJ1cHQgc3RhdHVzIHdvcmQgKi8KKwlTS19VMTYJUFNzYXZlOwkJCS8qIFNhdmVkIFBIWSBzdGF0dXMgd29yZCAqLworCVNLX1UxNglQR21BTmVnQWR2OwkJLyogU2F2ZWQgR1BoeSBBdXRvTmVnQWR2ZXJ0aXNtZW50IHJlZ2lzdGVyICovCisJU0tfQk9PTAlQSFdMaW5rVXA7CQkvKiBUaGUgaGFyZHdhcmUgTGluayBpcyB1cCAod2lyaW5nKSAqLworCVNLX0JPT0wJUExpbmtCcm9rZW47CS8qIElzIExpbmsgYnJva2VuID8gKi8KKwlTS19CT09MCVBDaGVja1BhcjsJCS8qIERvIHdlIGNoZWNrIGZvciBwYXJpdHkgZXJyb3JzID8gKi8KKwlTS19CT09MCUhhbGZEdXBUaW1lckFjdGl2ZTsKKwlTS19VOAlQTGlua0NhcDsJCS8qIExpbmsgQ2FwYWJpbGl0aWVzICovCisJU0tfVTgJUExpbmtNb2RlQ29uZjsJLyogTGluayBNb2RlIGNvbmZpZ3VyZWQgKi8KKwlTS19VOAlQTGlua01vZGU7CQkvKiBMaW5rIE1vZGUgY3VycmVudGx5IHVzZWQgKi8KKwlTS19VOAlQTGlua01vZGVTdGF0dXM7LyogTGluayBNb2RlIFN0YXR1cyAqLworCVNLX1U4CVBMaW5rU3BlZWRDYXA7CS8qIExpbmsgU3BlZWQgQ2FwYWJpbGl0aWVzKDEwLzEwMC8xMDAwIE1icHMpICovCisJU0tfVTgJUExpbmtTcGVlZDsJCS8qIGNvbmZpZ3VyZWQgTGluayBTcGVlZCAoMTAvMTAwLzEwMDAgTWJwcykgKi8KKwlTS19VOAlQTGlua1NwZWVkVXNlZDsJLyogY3VycmVudCBMaW5rIFNwZWVkICgxMC8xMDAvMTAwMCBNYnBzKSAqLworCVNLX1U4CVBGbG93Q3RybENhcDsJLyogRmxvdyBDb250cm9sIENhcGFiaWxpdGllcyAqLworCVNLX1U4CVBGbG93Q3RybE1vZGU7CS8qIEZsb3cgQ29udHJvbCBNb2RlICovCisJU0tfVTgJUEZsb3dDdHJsU3RhdHVzOy8qIEZsb3cgQ29udHJvbCBTdGF0dXMgKi8KKwlTS19VOAlQTVNDYXA7CQkJLyogTWFzdGVyL1NsYXZlIENhcGFiaWxpdGllcyAqLworCVNLX1U4CVBNU01vZGU7CQkvKiBNYXN0ZXIvU2xhdmUgTW9kZSAqLworCVNLX1U4CVBNU1N0YXR1czsJCS8qIE1hc3Rlci9TbGF2ZSBTdGF0dXMgKi8KKwlTS19CT09MCVBBdXRvTmVnRmFpbDsJLyogQXV0by1uZWdvdGlhdGlvbiBmYWlsIGZsYWcgKi8KKwlTS19VOAlQTGlwYUF1dG9OZWc7CS8qIEF1dG8tbmVnb3RpYXRpb24gcG9zc2libGUgd2l0aCBMaW5rIFBhcnRuZXIgKi8KKwlTS19VOAlQQ2FibGVMZW47CQkvKiBDYWJsZSBMZW5ndGggKi8KKwlTS19VOAlQTWRpUGFpckxlbls0XTsJLyogTURJWzAuLjNdIFBhaXIgTGVuZ3RoICovCisJU0tfVTgJUE1kaVBhaXJTdHNbNF07CS8qIE1ESVswLi4zXSBQYWlyIERpYWdub3N0aWMgU3RhdHVzICovCisJU0tfVTgJUFBoeVBvd2VyU3RhdGU7CS8qIFBIWSBjdXJyZW50IHBvd2VyIHN0YXRlICovCisJaW50CQlQTWFjQ29sVGhyZXM7CS8qIE1BQyBDb2xsaXNpb24gVGhyZXNob2xkICovCisJaW50CQlQTWFjSmFtTGVuOwkJLyogTUFDIEphbSBsZW5ndGggKi8KKwlpbnQJCVBNYWNKYW1JcGdWYWw7CS8qIE1BQyBKYW0gSVBHICovCisJaW50CQlQTWFjSmFtSXBnRGF0YTsJLyogTUFDIElQRyBKYW0gdG8gRGF0YSAqLworCWludAkJUE1hY0lwZ0RhdGE7CS8qIE1BQyBEYXRhIElQRyAqLworCVNLX0JPT0wgUE1hY0xpbWl0NDsJCS8qIHJlc2V0IGNvbGxpc2lvbiBjb3VudGVyIGFuZCBiYWNrb2ZmIGFsZ29yaXRobSAqLworfSBTS19HRVBPUlQ7CisKKy8qCisgKiBHaWdhYml0IEV0aGVybmV0IEluaXRpYWxpemF0aW9uIFN0cnVjdAorICogKGhhcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYWRhcHRlciBjb250ZXh0KQorICovCit0eXBlZGVmCXN0cnVjdCBzX0dlSW5pdCB7CisJaW50CQkJR0lDaGlwSWQ7CQkvKiBDaGlwIElkZW50aWZpY2F0aW9uIE51bWJlciAqLworCWludAkJCUdJQ2hpcFJldjsJCS8qIENoaXAgUmV2aXNpb24gTnVtYmVyICovCisJU0tfVTgJCUdJUGNpSHdSZXY7CQkvKiBQQ0kgSFcgUmV2aXNpb24gTnVtYmVyICovCisJU0tfQk9PTAkJR0lHZW5lc2lzOwkJLyogR2VuZXNpcyBhZGFwdGVyID8gKi8KKwlTS19CT09MCQlHSVl1a29uOwkJLyogWVVLT04tQTEvQnggY2hpcCAqLworCVNLX0JPT0wJCUdJWXVrb25MaXRlOwkvKiBZVUtPTi1MaXRlIGNoaXAgKi8KKwlTS19CT09MCQlHSUNvcHBlclR5cGU7CS8qIENvcHBlciBUeXBlIGFkYXB0ZXIgPyAqLworCVNLX0JPT0wJCUdJUGNpU2xvdDY0OwkvKiA2NC1iaXQgUENJIFNsb3QgKi8KKwlTS19CT09MCQlHSVBjaUNsb2NrNjY7CS8qIDY2IE1IeiBQQ0kgQ2xvY2sgKi8KKwlTS19CT09MCQlHSVZhdXhBdmFpbDsJLyogVkFVWCBhdmFpbGFibGUgKFlVS09OKSAqLworCVNLX0JPT0wJCUdJWXVrb24zMkJpdDsJLyogMzItQml0IFlVS09OIGFkYXB0ZXIgKi8KKwlTS19VMTYJCUdJTGVkQmxpbmtDdHJsOwkvKiBMRUQgQmxpbmsgQ29udHJvbCAqLworCWludAkJCUdJTWFjc0ZvdW5kOwkvKiBOdW1iZXIgb2YgTUFDcyBmb3VuZCBvbiB0aGlzIGFkYXB0ZXIgKi8KKwlpbnQJCQlHSU1hY1R5cGU7CQkvKiBNQUMgVHlwZSB1c2VkIG9uIHRoaXMgYWRhcHRlciAqLworCWludAkJCUdJSHN0Q2xrRmFjdDsJLyogSG9zdCBDbG9jayBGYWN0b3IgKDYyLjUgLyBIc3RDbGsgKiAxMDApICovCisJaW50CQkJR0lQb3J0VXNhZ2U7CS8qIERyaXZlciBQb3J0IFVzYWdlICovCisJaW50CQkJR0lMZXZlbDsJCS8qIEluaXRpYWxpemF0aW9uIExldmVsIGNvbXBsZXRlZCAqLworCWludAkJCUdJUmFtU2l6ZTsJCS8qIFRoZSBSQU0gc2l6ZSBvZiB0aGUgYWRhcHRlciBpbiBrQiAqLworCWludAkJCUdJV29sT2ZmczsJCS8qIFdPTCBSZWdpc3RlciBPZmZzZXQgKEhXLUJ1ZyBpbiBSZXYuIEEpICovCisJU0tfVTMyCQlHSVJhbU9mZnM7CQkvKiBSQU0gQWRkcmVzcyBPZmZzZXQgZm9yIGFkZHIgY2FsY3VsYXRpb24gKi8KKwlTS19VMzIJCUdJUG9sbFRpbWVyVmFsOwkvKiBEZXNjci4gUG9sbCBUaW1lciBJbml0IFZhbCAoSHN0Q2xrIHRpY2tzKSAqLworCVNLX1UzMgkJR0lWYWxJcnFNYXNrOwkvKiBWYWx1ZSBmb3IgSW50ZXJydXB0IE1hc2sgKi8KKwlTS19VMzIJCUdJVGltZVN0YW1wQ250OwkvKiBUaW1lIFN0YW1wIEhpZ2ggQ291bnRlciAoWVVLT04gb25seSkgKi8KKwlTS19HRVBPUlQJR1BbU0tfTUFYX01BQ1NdOy8qIFBvcnQgRGVwZW5kZW50IEluZm9ybWF0aW9uICovCisJU0tfR0VNQUNGVU5DIEdJRnVuYzsJCS8qIE1BQyBkZXBlZGVudCBmdW5jdGlvbnMgKi8KK30gU0tfR0VJTklUOworCisvKgorICogRXJyb3IgbnVtYmVycyBhbmQgbWVzc2FnZXMgZm9yIHNreG1hYzIuYyBhbmQgc2tnZWluaXQuYworICovCisjZGVmaW5lIFNLRVJSX0hXSV9FMDAxCQkoU0tfRVJSQkFTRV9IV0lOSVQpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDAxTVNHCSJTa1htQ2xyRXhhY3RBZGRyKCkgaGFzIGdvdCBpbGxlZ2FsIHBhcmFtZXRlcnMiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDAyCQkoU0tFUlJfSFdJX0UwMDErMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDJNU0cJIlNrR2VJbml0KCk6IExldmVsIDEgY2FsbCBtaXNzaW5nIgorI2RlZmluZSBTS0VSUl9IV0lfRTAwMwkJKFNLRVJSX0hXSV9FMDAyKzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDAzTVNHCSJTa0dlSW5pdCgpIGNhbGxlZCB3aXRoIGlsbGVnYWwgaW5pdCBMZXZlbCIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDQJCShTS0VSUl9IV0lfRTAwMysxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAwNE1TRwkiU2tHZUluaXRQb3J0KCk6IFF1ZXVlIFNpemUgaWxsZWdhbCBjb25maWd1cmVkIgorI2RlZmluZSBTS0VSUl9IV0lfRTAwNQkJKFNLRVJSX0hXSV9FMDA0KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDA1TVNHCSJTa0dlSW5pdFBvcnQoKTogY2Fubm90IGluaXQgcnVubmluZyBwb3J0cyIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDYJCShTS0VSUl9IV0lfRTAwNSsxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAwNk1TRwkiU2tHZU1hY0luaXQoKTogUFN0YXRlIGRvZXMgbm90IG1hdGNoIEhXIHN0YXRlIgorI2RlZmluZSBTS0VSUl9IV0lfRTAwNwkJKFNLRVJSX0hXSV9FMDA2KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDA3TVNHCSJTa1htSW5pdER1cE1kKCkgY2FsbGVkIHdpdGggaW52YWxpZCBEdXAgTW9kZSIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDgJCShTS0VSUl9IV0lfRTAwNysxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAwOE1TRwkiU2tYbVNldFJ4Q21kKCkgY2FsbGVkIHdpdGggaW52YWxpZCBNb2RlIgorI2RlZmluZSBTS0VSUl9IV0lfRTAwOQkJKFNLRVJSX0hXSV9FMDA4KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDA5TVNHCSJTa0dlQ2ZnU3luYygpIGNhbGxlZCBhbHRob3VnaCBQWFNRU2l6ZSB6ZXJvIgorI2RlZmluZSBTS0VSUl9IV0lfRTAxMAkJKFNLRVJSX0hXSV9FMDA5KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDEwTVNHCSJTa0dlQ2ZnU3luYygpIGNhbGxlZCB3aXRoIGludmFsaWQgcGFyYW1ldGVycyIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTEJCShTS0VSUl9IV0lfRTAxMCsxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAxMU1TRwkiU2tHZUluaXRQb3J0KCk6IFJlY2VpdmUgUXVldWUgU2l6ZSB0b28gc21hbGwiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDEyCQkoU0tFUlJfSFdJX0UwMTErMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTJNU0cJIlNrR2VJbml0UG9ydCgpOiBpbnZhbGlkIFF1ZXVlIFNpemUgc3BlY2lmaWVkIgorI2RlZmluZSBTS0VSUl9IV0lfRTAxMwkJKFNLRVJSX0hXSV9FMDEyKzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDEzTVNHCSJTa0dlSW5pdFBvcnQoKTogY2ZnIGNoYW5nZWQgZm9yIHJ1bm5pbmcgcXVldWUiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDE0CQkoU0tFUlJfSFdJX0UwMTMrMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTRNU0cJIlNrR2VJbml0UG9ydCgpOiB1bmtub3duIEdJUG9ydFVzYWdlIHNwZWNpZmllZCIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTUJCShTS0VSUl9IV0lfRTAxNCsxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAxNU1TRwkiSWxsZWdhbCBMaW5rIG1vZGUgcGFyYW1ldGVyIgorI2RlZmluZSBTS0VSUl9IV0lfRTAxNgkJKFNLRVJSX0hXSV9FMDE1KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDE2TVNHCSJJbGxlZ2FsIEZsb3cgY29udHJvbCBtb2RlIHBhcmFtZXRlciIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTcJCShTS0VSUl9IV0lfRTAxNisxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAxN01TRwkiSWxsZWdhbCB2YWx1ZSBzcGVjaWZpZWQgZm9yIEdJUG9sbFRpbWVyVmFsIgorI2RlZmluZSBTS0VSUl9IV0lfRTAxOAkJKFNLRVJSX0hXSV9FMDE3KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDE4TVNHCSJGQVRBTDogU2tHZVN0b3BQb3J0KCkgZG9lcyBub3QgdGVybWluYXRlIChUeCkiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDE5CQkoU0tFUlJfSFdJX0UwMTgrMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTlNU0cJIklsbGVnYWwgU3BlZWQgcGFyYW1ldGVyIgorI2RlZmluZSBTS0VSUl9IV0lfRTAyMAkJKFNLRVJSX0hXSV9FMDE5KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDIwTVNHCSJJbGxlZ2FsIE1hc3Rlci9TbGF2ZSBwYXJhbWV0ZXIiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDIxCQkoU0tFUlJfSFdJX0UwMjArMSkKKyNkZWZpbmUJU0tFUlJfSFdJX0UwMjFNU0cJIk1hY1VwZGF0ZVN0YXRzKCk6IGNhbm5vdCB1cGRhdGUgc3RhdGlzdGljIGNvdW50ZXIiCisjZGVmaW5lCVNLRVJSX0hXSV9FMDIyCQkoU0tFUlJfSFdJX0UwMjErMSkKKyNkZWZpbmUJU0tFUlJfSFdJX0UwMjJNU0cJIk1hY1N0YXRpc3RpYygpOiBpbGxlZ2FsIHN0YXRpc3RpYyBiYXNlIGFkZHJlc3MiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDIzCQkoU0tFUlJfSFdJX0UwMjIrMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMjNNU0cJIlNrR2VJbml0UG9ydCgpOiBUcmFuc21pdCBRdWV1ZSBTaXplIHRvbyBzbWFsbCIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMjQJCShTS0VSUl9IV0lfRTAyMysxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAyNE1TRwkiRkFUQUw6IFNrR2VTdG9wUG9ydCgpIGRvZXMgbm90IHRlcm1pbmF0ZSAoUngpIgorI2RlZmluZSBTS0VSUl9IV0lfRTAyNQkJKFNLRVJSX0hXSV9FMDI0KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDI1TVNHCSIiCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYJU0tfS1JfUFJPVE8KKworLyoKKyAqIHB1YmxpYyBmdW5jdGlvbnMgaW4gc2tnZWluaXQuYworICovCitleHRlcm4gdm9pZAlTa0dlUG9sbFJ4RCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX0JPT0wJUG9sbFJ4RCk7CisKK2V4dGVybiB2b2lkCVNrR2VQb2xsVHhEKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJU0tfQk9PTCBQb2xsVHhEKTsKKworZXh0ZXJuIHZvaWQJU2tHZVllbGxvd0xFRCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlTdGF0ZSk7CisKK2V4dGVybiBpbnQJU2tHZUNmZ1N5bmMoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19VMzIJSW50VGltZSwKKwlTS19VMzIJTGltQ291bnQsCisJaW50CQlTeW5jTW9kZSk7CisKK2V4dGVybiB2b2lkCVNrR2VMb2FkTG5rU3luY0NudCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX1UzMglDbnRWYWwpOworCitleHRlcm4gdm9pZAlTa0dlU3RvcFBvcnQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlpbnQJCURpciwKKwlpbnQJCVJzdE1vZGUpOworCitleHRlcm4gaW50CVNrR2VJbml0KAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCUxldmVsKTsKKworZXh0ZXJuIHZvaWQJU2tHZURlSW5pdCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MpOworCitleHRlcm4gaW50CVNrR2VJbml0UG9ydCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tHZVhtaXRMRUQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJTGVkLAorCWludAkJTW9kZSk7CisKK2V4dGVybiB2b2lkCVNrR2VJbml0UmFtSWZhY2UoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DKTsKKworZXh0ZXJuIGludAlTa0dlSW5pdEFzc2lnblJhbVRvUXVldWVzKAorCVNLX0FDCSpwQUMsCisJaW50CQlBY3RpdmVQb3J0LAorCVNLX0JPT0wJRHVhbE5ldCk7CisKKy8qCisgKiBwdWJsaWMgZnVuY3Rpb25zIGluIHNreG1hYzIuYworICovCitleHRlcm4gdm9pZCBTa01hY1J4VHhEaXNhYmxlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQpOworCitleHRlcm4gdm9pZAlTa01hY1NvZnRSc3QoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiB2b2lkCVNrTWFjSGFyZFJzdCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tNYWNDbGVhclJzdCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tYbUluaXRNYWMoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiB2b2lkCVNrR21Jbml0TWFjKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQpOworCitleHRlcm4gdm9pZCBTa01hY0luaXRQaHkoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19CT09MCURvTG9vcCk7CisKK2V4dGVybiB2b2lkIFNrTWFjSXJxRGlzYWJsZSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tNYWNGbHVzaFR4RmlmbygKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tNYWNGbHVzaFJ4RmlmbygKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tNYWNJcnEoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiBpbnQJU2tNYWNBdXRvTmVnRG9uZSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tNYWNBdXRvTmVnTGlwYVBoeSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX1UxNglJU3RhdHVzKTsKKworZXh0ZXJuIHZvaWQgIFNrTWFjU2V0UnhUeEVuKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlQYXJhKTsKKworZXh0ZXJuIGludCAgU2tNYWNSeFR4RW5hYmxlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQpOworCitleHRlcm4gdm9pZAlTa01hY1Byb21pc2NNb2RlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJU0tfQk9PTAlFbmFibGUpOworCitleHRlcm4gdm9pZAlTa01hY0hhc2hpbmcoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19CT09MCUVuYWJsZSk7CisKK2V4dGVybiB2b2lkCVNrWG1QaHlSZWFkKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlBZGRyLAorCVNLX1UxNglTS19GQVIgKnBWYWwpOworCitleHRlcm4gdm9pZAlTa1htUGh5V3JpdGUoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlpbnQJCUFkZHIsCisJU0tfVTE2CVZhbCk7CisKK2V4dGVybiB2b2lkCVNrR21QaHlSZWFkKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlBZGRyLAorCVNLX1UxNglTS19GQVIgKnBWYWwpOworCitleHRlcm4gdm9pZAlTa0dtUGh5V3JpdGUoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlpbnQJCUFkZHIsCisJU0tfVTE2CVZhbCk7CisKK2V4dGVybiB2b2lkCVNrWG1DbHJFeGFjdEFkZHIoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlpbnQJCVN0YXJ0TnVtLAorCWludAkJU3RvcE51bSk7CisKK2V4dGVybiB2b2lkCVNrWG1Jbml0RHVwTWQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiB2b2lkCVNrWG1Jbml0UGF1c2VNZCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tYbUF1dG9OZWdMaXBhWG1hYygKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX1UxNglJU3RhdHVzKTsKKworZXh0ZXJuIGludCBTa1htVXBkYXRlU3RhdHMoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCXVuc2lnbmVkIGludCBQb3J0KTsKKworZXh0ZXJuIGludCBTa0dtVXBkYXRlU3RhdHMoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCXVuc2lnbmVkIGludCBQb3J0KTsKKworZXh0ZXJuIGludCBTa1htTWFjU3RhdGlzdGljKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwl1bnNpZ25lZCBpbnQgUG9ydCwKKwlTS19VMTYJU3RhdEFkZHIsCisJU0tfVTMyCVNLX0ZBUiAqcFZhbCk7CisKK2V4dGVybiBpbnQgU2tHbU1hY1N0YXRpc3RpYygKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJdW5zaWduZWQgaW50IFBvcnQsCisJU0tfVTE2CVN0YXRBZGRyLAorCVNLX1UzMglTS19GQVIgKnBWYWwpOworCitleHRlcm4gaW50IFNrWG1SZXNldENvdW50ZXIoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCXVuc2lnbmVkIGludCBQb3J0KTsKKworZXh0ZXJuIGludCBTa0dtUmVzZXRDb3VudGVyKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwl1bnNpZ25lZCBpbnQgUG9ydCk7CisKK2V4dGVybiBpbnQgU2tYbU92ZXJmbG93U3RhdHVzKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwl1bnNpZ25lZCBpbnQgUG9ydCwKKwlTS19VMTYgIElTdGF0dXMsCisJU0tfVTY0CVNLX0ZBUiAqcFN0YXR1cyk7CisKK2V4dGVybiBpbnQgU2tHbU92ZXJmbG93U3RhdHVzKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwl1bnNpZ25lZCBpbnQgUG9ydCwKKwlTS19VMTYJTWFjU3RhdHVzLAorCVNLX1U2NAlTS19GQVIgKnBTdGF0dXMpOworCitleHRlcm4gaW50IFNrR21DYWJsZURpYWdTdGF0dXMoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19CT09MCVN0YXJ0VGVzdCk7CisKK2V4dGVybiBpbnQgU2tHbUVudGVyTG93UG93ZXJNb2RlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJU0tfVTgJTW9kZSk7CisKK2V4dGVybiBpbnQgU2tHbUxlYXZlTG93UG93ZXJNb2RlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQpOworCisjaWZkZWYgU0tfRElBRworZXh0ZXJuIHZvaWQJU2tHZVBoeVJlYWQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlpbnQJCUFkZHIsCisJU0tfVTE2CSpwVmFsKTsKKworZXh0ZXJuIHZvaWQJU2tHZVBoeVdyaXRlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlBZGRyLAorCVNLX1UxNglWYWwpOworCitleHRlcm4gdm9pZAlTa01hY1NldFJ4Q21kKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlNb2RlKTsKK2V4dGVybiB2b2lkCVNrTWFjQ3JjR2VuZXIoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19CT09MCUVuYWJsZSk7CitleHRlcm4gdm9pZAlTa01hY1RpbWVTdGFtcCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX0JPT0wJRW5hYmxlKTsKK2V4dGVybiB2b2lkCVNrWG1TZW5kQ29udCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX0JPT0wJRW5hYmxlKTsKKyNlbmRpZiAvKiBTS19ESUFHICovCisKKyNlbHNlCS8qIFNLX0tSX1BST1RPICovCisKKy8qCisgKiBwdWJsaWMgZnVuY3Rpb25zIGluIHNrZ2Vpbml0LmMKKyAqLworZXh0ZXJuIHZvaWQJU2tHZVBvbGxSeEQoKTsKK2V4dGVybiB2b2lkCVNrR2VQb2xsVHhEKCk7CitleHRlcm4gdm9pZAlTa0dlWWVsbG93TEVEKCk7CitleHRlcm4gaW50CVNrR2VDZmdTeW5jKCk7CitleHRlcm4gdm9pZAlTa0dlTG9hZExua1N5bmNDbnQoKTsKK2V4dGVybiB2b2lkCVNrR2VTdG9wUG9ydCgpOworZXh0ZXJuIGludAlTa0dlSW5pdCgpOworZXh0ZXJuIHZvaWQJU2tHZURlSW5pdCgpOworZXh0ZXJuIGludAlTa0dlSW5pdFBvcnQoKTsKK2V4dGVybiB2b2lkCVNrR2VYbWl0TEVEKCk7CitleHRlcm4gdm9pZAlTa0dlSW5pdFJhbUlmYWNlKCk7CitleHRlcm4gaW50CVNrR2VJbml0QXNzaWduUmFtVG9RdWV1ZXMoKTsKKworLyoKKyAqIHB1YmxpYyBmdW5jdGlvbnMgaW4gc2t4bWFjMi5jCisgKi8KK2V4dGVybiB2b2lkIFNrTWFjUnhUeERpc2FibGUoKTsKK2V4dGVybiB2b2lkCVNrTWFjU29mdFJzdCgpOworZXh0ZXJuIHZvaWQJU2tNYWNIYXJkUnN0KCk7CitleHRlcm4gdm9pZAlTa01hY0NsZWFyUnN0KCk7CitleHRlcm4gdm9pZCBTa01hY0luaXRQaHkoKTsKK2V4dGVybiBpbnQgIFNrTWFjUnhUeEVuYWJsZSgpOworZXh0ZXJuIHZvaWQgU2tNYWNQcm9taXNjTW9kZSgpOworZXh0ZXJuIHZvaWQgU2tNYWNIYXNoaW5nKCk7CitleHRlcm4gdm9pZCBTa01hY0lycURpc2FibGUoKTsKK2V4dGVybiB2b2lkCVNrTWFjRmx1c2hUeEZpZm8oKTsKK2V4dGVybiB2b2lkCVNrTWFjRmx1c2hSeEZpZm8oKTsKK2V4dGVybiB2b2lkCVNrTWFjSXJxKCk7CitleHRlcm4gaW50CVNrTWFjQXV0b05lZ0RvbmUoKTsKK2V4dGVybiB2b2lkCVNrTWFjQXV0b05lZ0xpcGFQaHkoKTsKK2V4dGVybiB2b2lkIFNrTWFjU2V0UnhUeEVuKCk7CitleHRlcm4gdm9pZAlTa1htSW5pdE1hYygpOworZXh0ZXJuIHZvaWQJU2tYbVBoeVJlYWQoKTsKK2V4dGVybiB2b2lkCVNrWG1QaHlXcml0ZSgpOworZXh0ZXJuIHZvaWQJU2tHbUluaXRNYWMoKTsKK2V4dGVybiB2b2lkCVNrR21QaHlSZWFkKCk7CitleHRlcm4gdm9pZAlTa0dtUGh5V3JpdGUoKTsKK2V4dGVybiB2b2lkCVNrWG1DbHJFeGFjdEFkZHIoKTsKK2V4dGVybiB2b2lkCVNrWG1Jbml0RHVwTWQoKTsKK2V4dGVybiB2b2lkCVNrWG1Jbml0UGF1c2VNZCgpOworZXh0ZXJuIHZvaWQJU2tYbUF1dG9OZWdMaXBhWG1hYygpOworZXh0ZXJuIGludAlTa1htVXBkYXRlU3RhdHMoKTsKK2V4dGVybiBpbnQJU2tHbVVwZGF0ZVN0YXRzKCk7CitleHRlcm4gaW50CVNrWG1NYWNTdGF0aXN0aWMoKTsKK2V4dGVybiBpbnQJU2tHbU1hY1N0YXRpc3RpYygpOworZXh0ZXJuIGludAlTa1htUmVzZXRDb3VudGVyKCk7CitleHRlcm4gaW50CVNrR21SZXNldENvdW50ZXIoKTsKK2V4dGVybiBpbnQJU2tYbU92ZXJmbG93U3RhdHVzKCk7CitleHRlcm4gaW50CVNrR21PdmVyZmxvd1N0YXR1cygpOworZXh0ZXJuIGludAlTa0dtQ2FibGVEaWFnU3RhdHVzKCk7CitleHRlcm4gaW50CVNrR21FbnRlckxvd1Bvd2VyTW9kZSgpOworZXh0ZXJuIGludAlTa0dtTGVhdmVMb3dQb3dlck1vZGUoKTsKKworI2lmZGVmIFNLX0RJQUcKK2V4dGVybiB2b2lkCVNrR2VQaHlSZWFkKCk7CitleHRlcm4gdm9pZAlTa0dlUGh5V3JpdGUoKTsKK2V4dGVybiB2b2lkCVNrTWFjU2V0UnhDbWQoKTsKK2V4dGVybiB2b2lkCVNrTWFjQ3JjR2VuZXIoKTsKK2V4dGVybiB2b2lkCVNrTWFjVGltZVN0YW1wKCk7CitleHRlcm4gdm9pZAlTa1htU2VuZENvbnQoKTsKKyNlbmRpZiAvKiBTS19ESUFHICovCisKKyNlbmRpZgkvKiBTS19LUl9QUk9UTyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgkvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYJLyogX19JTkNfU0tHRUlOSVRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlcG5tMi5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vwbm0yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRkMzA0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlcG5tMi5oCkBAIC0wLDAgKzEsMzM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlcG5tMi5oCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMzYgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDUvMjMgMTI6NDU6MTMgJAorICogUHVycG9zZToJRGVmaW5lcyBmb3IgUHJpdmF0ZSBOZXR3b3JrIE1hbmFnZW1lbnQgSW50ZXJmYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NLR0VQTk0yX0hfCisjZGVmaW5lIF9TS0dFUE5NMl9IXworCisvKgorICogR2VuZXJhbCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFNLX1BOTUlfQ0hJUFNFVF9YTUFDCTEJLyogWE1BQzExODAwRlAgKi8KKyNkZWZpbmUgU0tfUE5NSV9DSElQU0VUX1lVS09OCTIJLyogWVVLT04gKi8KKworI2RlZmluZQlTS19QTk1JX0JVU19QQ0kJCTEJLyogUENJIGJ1cyovCisKKy8qCisgKiBBY3Rpb25zCisgKi8KKyNkZWZpbmUgU0tfUE5NSV9BQ1RfSURMRQkJMQorI2RlZmluZSBTS19QTk1JX0FDVF9SRVNFVAkJMgorI2RlZmluZSBTS19QTk1JX0FDVF9TRUxGVEVTVAkzCisjZGVmaW5lIFNLX1BOTUlfQUNUX1JFU0VUQ05UCTQKKworLyoKKyAqIFZQRCByZWxlYXRlZCBkZWZpbmVzCisgKi8KKworI2RlZmluZSBTS19QTk1JX1ZQRF9SVwkJMQorI2RlZmluZSBTS19QTk1JX1ZQRF9STwkJMgorCisjZGVmaW5lIFNLX1BOTUlfVlBEX09LCQkJMAorI2RlZmluZSBTS19QTk1JX1ZQRF9OT1RGT1VORAkxCisjZGVmaW5lIFNLX1BOTUlfVlBEX0NVVAkJCTIKKyNkZWZpbmUgU0tfUE5NSV9WUERfVElNRU9VVAkJMworI2RlZmluZSBTS19QTk1JX1ZQRF9GVUxMCQk0CisjZGVmaW5lIFNLX1BOTUlfVlBEX05PV1JJVEUJCTUKKyNkZWZpbmUgU0tfUE5NSV9WUERfRkFUQUwJCTYKKworI2RlZmluZSBTS19QTk1JX1ZQRF9JR05PUkUJMAorI2RlZmluZSBTS19QTk1JX1ZQRF9DUkVBVEUJMQorI2RlZmluZSBTS19QTk1JX1ZQRF9ERUxFVEUJMgorCisKKy8qCisgKiBSTE1UIHJlbGF0ZWQgZGVmaW5lcworICovCisjZGVmaW5lIFNLX1BOTUlfREVGX1JMTVRfQ0hHX1RIUkVTCTI0MAkvKiA0IGNoYW5nZXMgcGVyIG1pbnV0ZSAqLworCisKKy8qCisgKiBWQ1QgaW50ZXJuYWwgc3RhdHVzIHZhbHVlcworICovCisjZGVmaW5lIFNLX1BOTUlfVkNUX1BFTkRJTkcJMzIKKyNkZWZpbmUgU0tfUE5NSV9WQ1RfVEVTVF9ET05FCTY0CisjZGVmaW5lIFNLX1BOTUlfVkNUX0xJTksJMTI4CisKKy8qCisgKiBJbnRlcm5hbCB0YWJsZSBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFNLX1BOTUlfR0VUCQkwCisjZGVmaW5lIFNLX1BOTUlfUFJFU0VUCTEKKyNkZWZpbmUgU0tfUE5NSV9TRVQJCTIKKworI2RlZmluZSBTS19QTk1JX1JPCQkwCisjZGVmaW5lIFNLX1BOTUlfUlcJCTEKKyNkZWZpbmUgU0tfUE5NSV9XTwkJMgorCit0eXBlZGVmIHN0cnVjdCBzX09pZFRhYkVudHJ5IHsKKwlTS19VMzIJCQlJZDsKKwlTS19VMzIJCQlJbnN0YW5jZU5vOworCXVuc2lnbmVkIGludAlTdHJ1Y3RTaXplOworCXVuc2lnbmVkIGludAlPZmZzZXQ7CisJaW50CQkJCUFjY2VzczsKKwlpbnQJCQkJKCogRnVuYykoU0tfQUMgKnBBYywgU0tfSU9DIHBJbywgaW50IGFjdGlvbiwKKwkJCQkJCQkgU0tfVTMyIElkLCBjaGFyKiBwQnVmLCB1bnNpZ25lZCBpbnQqIHBMZW4sCisJCQkJCQkJIFNLX1UzMiBJbnN0YW5jZSwgdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsCisJCQkJCQkJIFNLX1UzMiBOZXROdW1iZXIpOworCVNLX1UxNgkJCVBhcmFtOworfSBTS19QTk1JX1RBQl9FTlRSWTsKKworCisvKgorICogVHJhcCBsZW5ndGhzCisgKi8KKyNkZWZpbmUgU0tfUE5NSV9UUkFQX1NJTVBMRV9MRU4JCQkxNworI2RlZmluZSBTS19QTk1JX1RSQVBfU0VOU09SX0xFTl9CQVNFCTQ2CisjZGVmaW5lIFNLX1BOTUlfVFJBUF9STE1UX0NIQU5HRV9MRU4JMjMKKyNkZWZpbmUgU0tfUE5NSV9UUkFQX1JMTVRfUE9SVF9MRU4JCTIzCisKKy8qCisgKiBOdW1iZXIgb2YgTUFDIHR5cGVzIHN1cHBvcnRlZAorICovCisjZGVmaW5lIFNLX1BOTUlfTUFDX1RZUEVTCShTS19NQUNfR01BQyArIDEpCisKKy8qCisgKiBNQUMgc3RhdGlzdGljIGRhdGEgbGlzdCAob3ZlcmFsbCBzZXQgZm9yIE1BQyB0eXBlcyB1c2VkKQorICovCitlbnVtIFNLX01BQ1NUQVRTIHsKKwlTS19QTk1JX0hUWAkJCQk9IDAsCisJU0tfUE5NSV9IVFhfT0NURVQsCisJU0tfUE5NSV9IVFhfT0NURVRISUdIIAk9IFNLX1BOTUlfSFRYX09DVEVULAorCVNLX1BOTUlfSFRYX09DVEVUTE9XLAorCVNLX1BOTUlfSFRYX0JST0FEQ0FTVCwKKwlTS19QTk1JX0hUWF9NVUxUSUNBU1QsCisJU0tfUE5NSV9IVFhfVU5JQ0FTVCwKKwlTS19QTk1JX0hUWF9CVVJTVCwKKwlTS19QTk1JX0hUWF9QTUFDQywKKwlTS19QTk1JX0hUWF9NQUNDLAorCVNLX1BOTUlfSFRYX0NPTCwKKwlTS19QTk1JX0hUWF9TSU5HTEVfQ09MLAorCVNLX1BOTUlfSFRYX01VTFRJX0NPTCwKKwlTS19QTk1JX0hUWF9FWENFU1NfQ09MLAorCVNLX1BOTUlfSFRYX0xBVEVfQ09MLAorCVNLX1BOTUlfSFRYX0RFRkZFUkFMLAorCVNLX1BOTUlfSFRYX0VYQ0VTU19ERUYsCisJU0tfUE5NSV9IVFhfVU5ERVJSVU4sCisJU0tfUE5NSV9IVFhfQ0FSUklFUiwKKwlTS19QTk1JX0hUWF9VVElMVU5ERVIsCisJU0tfUE5NSV9IVFhfVVRJTE9WRVIsCisJU0tfUE5NSV9IVFhfNjQsCisJU0tfUE5NSV9IVFhfMTI3LAorCVNLX1BOTUlfSFRYXzI1NSwKKwlTS19QTk1JX0hUWF81MTEsCisJU0tfUE5NSV9IVFhfMTAyMywKKwlTS19QTk1JX0hUWF9NQVgsCisJU0tfUE5NSV9IVFhfTE9OR0ZSQU1FUywKKwlTS19QTk1JX0hUWF9TWU5DLAorCVNLX1BOTUlfSFRYX1NZTkNfT0NURVQsCisJU0tfUE5NSV9IVFhfUkVTRVJWRUQsCisJCisJU0tfUE5NSV9IUlgsCisJU0tfUE5NSV9IUlhfT0NURVQsCisJU0tfUE5NSV9IUlhfT0NURVRISUdICT0gU0tfUE5NSV9IUlhfT0NURVQsCisJU0tfUE5NSV9IUlhfT0NURVRMT1csCisJU0tfUE5NSV9IUlhfQkFET0NURVQsCisJU0tfUE5NSV9IUlhfQkFET0NURVRISUdIID0gU0tfUE5NSV9IUlhfQkFET0NURVQsCisJU0tfUE5NSV9IUlhfQkFET0NURVRMT1csCisJU0tfUE5NSV9IUlhfQlJPQURDQVNULAorCVNLX1BOTUlfSFJYX01VTFRJQ0FTVCwKKwlTS19QTk1JX0hSWF9VTklDQVNULAorCVNLX1BOTUlfSFJYX1BNQUNDLAorCVNLX1BOTUlfSFJYX01BQ0MsCisJU0tfUE5NSV9IUlhfUE1BQ0NfRVJSLAorCVNLX1BOTUlfSFJYX01BQ0NfVU5LV04sCisJU0tfUE5NSV9IUlhfQlVSU1QsCisJU0tfUE5NSV9IUlhfTUlTU0VELAorCVNLX1BOTUlfSFJYX0ZSQU1JTkcsCisJU0tfUE5NSV9IUlhfVU5ERVJTSVpFLAorCVNLX1BOTUlfSFJYX09WRVJGTE9XLAorCVNLX1BOTUlfSFJYX0pBQkJFUiwKKwlTS19QTk1JX0hSWF9DQVJSSUVSLAorCVNLX1BOTUlfSFJYX0lSTEVOR1RILAorCVNLX1BOTUlfSFJYX1NZTUJPTCwKKwlTS19QTk1JX0hSWF9TSE9SVFMsCisJU0tfUE5NSV9IUlhfUlVOVCwKKwlTS19QTk1JX0hSWF9UT09fTE9ORywKKwlTS19QTk1JX0hSWF9GQ1MsCisJU0tfUE5NSV9IUlhfQ0VYVCwKKwlTS19QTk1JX0hSWF9VVElMVU5ERVIsCisJU0tfUE5NSV9IUlhfVVRJTE9WRVIsCisJU0tfUE5NSV9IUlhfNjQsCisJU0tfUE5NSV9IUlhfMTI3LAorCVNLX1BOTUlfSFJYXzI1NSwKKwlTS19QTk1JX0hSWF81MTEsCisJU0tfUE5NSV9IUlhfMTAyMywKKwlTS19QTk1JX0hSWF9NQVgsCisJU0tfUE5NSV9IUlhfTE9OR0ZSQU1FUywKKwkKKwlTS19QTk1JX0hSWF9SRVNFUlZFRCwKKwkKKwlTS19QTk1JX01BWF9JRFgJCS8qIE5PVEU6IEVuc3VyZSBTS19QTk1JX0NOVF9OTyBpcyBzZXQgdG8gdGhpcyB2YWx1ZSAqLworfTsKKworLyoKKyAqIE1BQyBzcGVjaWZpYyBkYXRhCisgKi8KK3R5cGVkZWYgc3RydWN0IHNfUG5taVN0YXRBZGRyIHsKKwlTS19VMTYJCVJlZzsJCS8qIE1BQyByZWdpc3RlciBjb250YWluaW5nIHRoZSB2YWx1ZSAqLworCVNLX0JPT0wJCUdldE9mZnNldDsJLyogVFJVRTogT2Zmc2V0IG1hbmFnZWQgYnkgUE5NSSAoY2FsbCBHZXRTdGF0VmFsKCkpKi8KK30gU0tfUE5NSV9TVEFUQUREUjsKKworCisvKgorICogU0tfUE5NSV9TVFJVQ1RfREFUQSBjb3B5IG9mZnNldCBldmFsdWF0aW9uIG1hY3JvcworICovCisjZGVmaW5lIFNLX1BOTUlfT0ZGKGUpCQkoKFNLX1UzMikoU0tfVVBUUikmKCgoU0tfUE5NSV9TVFJVQ1RfREFUQSAqKTApLT5lKSkKKyNkZWZpbmUgU0tfUE5NSV9NQUlfT0ZGKGUpCSgoU0tfVTMyKShTS19VUFRSKSYoKChTS19QTk1JX1NUUlVDVF9EQVRBICopMCktPmUpKQorI2RlZmluZSBTS19QTk1JX1ZQRF9PRkYoZSkJKChTS19VMzIpKFNLX1VQVFIpJigoKFNLX1BOTUlfVlBEICopMCktPmUpKQorI2RlZmluZSBTS19QTk1JX1NFTl9PRkYoZSkJKChTS19VMzIpKFNLX1VQVFIpJigoKFNLX1BOTUlfU0VOU09SICopMCktPmUpKQorI2RlZmluZSBTS19QTk1JX0NIS19PRkYoZSkJKChTS19VMzIpKFNLX1VQVFIpJigoKFNLX1BOTUlfQ0hFQ0tTVU0gKikwKS0+ZSkpCisjZGVmaW5lIFNLX1BOTUlfU1RBX09GRihlKQkoKFNLX1UzMikoU0tfVVBUUikmKCgoU0tfUE5NSV9TVEFUICopMCktPmUpKQorI2RlZmluZSBTS19QTk1JX0NORl9PRkYoZSkJKChTS19VMzIpKFNLX1VQVFIpJigoKFNLX1BOTUlfQ09ORiAqKTApLT5lKSkKKyNkZWZpbmUgU0tfUE5NSV9STE1fT0ZGKGUpCSgoU0tfVTMyKShTS19VUFRSKSYoKChTS19QTk1JX1JMTVQgKikwKS0+ZSkpCisjZGVmaW5lIFNLX1BOTUlfTU9OX09GRihlKQkoKFNLX1UzMikoU0tfVVBUUikmKCgoU0tfUE5NSV9STE1UX01PTklUT1IgKikwKS0+ZSkpCisjZGVmaW5lIFNLX1BOTUlfVFJQX09GRihlKQkoKFNLX1UzMikoU0tfVVBUUikmKCgoU0tfUE5NSV9UUkFQICopMCktPmUpKQorCisjZGVmaW5lIFNLX1BOTUlfU0VUX1NUQVQoYixzLG8pCXtTS19VMzIJVmFsMzI7IGNoYXIgKnBWYWw7IFwKKwkJCQkJVmFsMzIgPSAocyk7IFwKKwkJCQkJcFZhbCA9IChjaGFyICopKGIpICsgKChTS19VMzIpKFNLX1VQVFIpIFwKKwkJCQkJCSYoKChTS19QTk1JX1NUUlVDVF9EQVRBICopMCktPiBcCisJCQkJCQlSZXR1cm5TdGF0dXMuRXJyb3JTdGF0dXMpKTsgXAorCQkJCQlTS19QTk1JX1NUT1JFX1UzMihwVmFsLCBWYWwzMik7IFwKKwkJCQkJVmFsMzIgPSAobyk7IFwKKwkJCQkJcFZhbCA9IChjaGFyICopKGIpICsgKChTS19VMzIpKFNLX1VQVFIpIFwKKwkJCQkJCSYoKChTS19QTk1JX1NUUlVDVF9EQVRBICopMCktPiBcCisJCQkJCQlSZXR1cm5TdGF0dXMuRXJyb3JPZmZzZXQpKTsgXAorCQkJCQlTS19QTk1JX1NUT1JFX1UzMihwVmFsLCBWYWwzMik7fQorCisvKgorICogVGltZSBtYWNyb3MKKyAqLworI2lmbmRlZiBTS19QTk1JX0hVTkRSRURTX1NFQworI2lmIFNLX1RJQ0tTX1BFUl9TRUMgPT0gMTAwCisjZGVmaW5lIFNLX1BOTUlfSFVORFJFRFNfU0VDKHQpCSh0KQorI2Vsc2UKKyNkZWZpbmUgU0tfUE5NSV9IVU5EUkVEU19TRUModCkJKCgodCkgKiAxMDApIC8gKFNLX1RJQ0tTX1BFUl9TRUMpKQorI2VuZGlmIC8qICFTS19USUNLU19QRVJfU0VDICovCisjZW5kaWYgLyogIVNLX1BOTUlfSFVORFJFRFNfU0VDICovCisKKy8qCisgKiBNYWNyb3MgdG8gd29yayBhcm91bmQgYWxpZ25tZW50IHByb2JsZW1zCisgKi8KKyNpZm5kZWYgU0tfUE5NSV9TVE9SRV9VMTYKKyNkZWZpbmUgU0tfUE5NSV9TVE9SRV9VMTYocCx2KQl7KihjaGFyICopKHApID0gKigoY2hhciAqKSYodikpOyBcCisJCQkJCSooKGNoYXIgKikocCkgKyAxKSA9IFwKKwkJCQkJCSooKChjaGFyICopJih2KSkgKyAxKTt9CisjZW5kaWYKKworI2lmbmRlZiBTS19QTk1JX1NUT1JFX1UzMgorI2RlZmluZSBTS19QTk1JX1NUT1JFX1UzMihwLHYpCXsqKGNoYXIgKikocCkgPSAqKChjaGFyICopJih2KSk7IFwKKwkJCQkJKigoY2hhciAqKShwKSArIDEpID0gXAorCQkJCQkJKigoKGNoYXIgKikmKHYpKSArIDEpOyBcCisJCQkJCSooKGNoYXIgKikocCkgKyAyKSA9IFwKKwkJCQkJCSooKChjaGFyICopJih2KSkgKyAyKTsgXAorCQkJCQkqKChjaGFyICopKHApICsgMykgPSBcCisJCQkJCQkqKCgoY2hhciAqKSYodikpICsgMyk7fQorI2VuZGlmCisKKyNpZm5kZWYgU0tfUE5NSV9TVE9SRV9VNjQKKyNkZWZpbmUgU0tfUE5NSV9TVE9SRV9VNjQocCx2KQl7KihjaGFyICopKHApID0gKigoY2hhciAqKSYodikpOyBcCisJCQkJCSooKGNoYXIgKikocCkgKyAxKSA9IFwKKwkJCQkJCSooKChjaGFyICopJih2KSkgKyAxKTsgXAorCQkJCQkqKChjaGFyICopKHApICsgMikgPSBcCisJCQkJCQkqKCgoY2hhciAqKSYodikpICsgMik7IFwKKwkJCQkJKigoY2hhciAqKShwKSArIDMpID0gXAorCQkJCQkJKigoKGNoYXIgKikmKHYpKSArIDMpOyBcCisJCQkJCSooKGNoYXIgKikocCkgKyA0KSA9IFwKKwkJCQkJCSooKChjaGFyICopJih2KSkgKyA0KTsgXAorCQkJCQkqKChjaGFyICopKHApICsgNSkgPSBcCisJCQkJCQkqKCgoY2hhciAqKSYodikpICsgNSk7IFwKKwkJCQkJKigoY2hhciAqKShwKSArIDYpID0gXAorCQkJCQkJKigoKGNoYXIgKikmKHYpKSArIDYpOyBcCisJCQkJCSooKGNoYXIgKikocCkgKyA3KSA9IFwKKwkJCQkJCSooKChjaGFyICopJih2KSkgKyA3KTt9CisjZW5kaWYKKworI2lmbmRlZiBTS19QTk1JX1JFQURfVTE2CisjZGVmaW5lIFNLX1BOTUlfUkVBRF9VMTYocCx2KQl7KigoY2hhciAqKSYodikpID0gKihjaGFyICopKHApOyBcCisJCQkJCSooKChjaGFyICopJih2KSkgKyAxKSA9IFwKKwkJCQkJCSooKGNoYXIgKikocCkgKyAxKTt9CisjZW5kaWYKKworI2lmbmRlZiBTS19QTk1JX1JFQURfVTMyCisjZGVmaW5lIFNLX1BOTUlfUkVBRF9VMzIocCx2KQl7KigoY2hhciAqKSYodikpID0gKihjaGFyICopKHApOyBcCisJCQkJCSooKChjaGFyICopJih2KSkgKyAxKSA9IFwKKwkJCQkJCSooKGNoYXIgKikocCkgKyAxKTsgXAorCQkJCQkqKCgoY2hhciAqKSYodikpICsgMikgPSBcCisJCQkJCQkqKChjaGFyICopKHApICsgMik7IFwKKwkJCQkJKigoKGNoYXIgKikmKHYpKSArIDMpID0gXAorCQkJCQkJKigoY2hhciAqKShwKSArIDMpO30KKyNlbmRpZgorCisjaWZuZGVmIFNLX1BOTUlfUkVBRF9VNjQKKyNkZWZpbmUgU0tfUE5NSV9SRUFEX1U2NChwLHYpCXsqKChjaGFyICopJih2KSkgPSAqKGNoYXIgKikocCk7IFwKKwkJCQkJKigoKGNoYXIgKikmKHYpKSArIDEpID0gXAorCQkJCQkJKigoY2hhciAqKShwKSArIDEpOyBcCisJCQkJCSooKChjaGFyICopJih2KSkgKyAyKSA9IFwKKwkJCQkJCSooKGNoYXIgKikocCkgKyAyKTsgXAorCQkJCQkqKCgoY2hhciAqKSYodikpICsgMykgPSBcCisJCQkJCQkqKChjaGFyICopKHApICsgMyk7IFwKKwkJCQkJKigoKGNoYXIgKikmKHYpKSArIDQpID0gXAorCQkJCQkJKigoY2hhciAqKShwKSArIDQpOyBcCisJCQkJCSooKChjaGFyICopJih2KSkgKyA1KSA9IFwKKwkJCQkJCSooKGNoYXIgKikocCkgKyA1KTsgXAorCQkJCQkqKCgoY2hhciAqKSYodikpICsgNikgPSBcCisJCQkJCQkqKChjaGFyICopKHApICsgNik7IFwKKwkJCQkJKigoKGNoYXIgKikmKHYpKSArIDcpID0gXAorCQkJCQkJKigoY2hhciAqKShwKSArIDcpO30KKyNlbmRpZgorCisvKgorICogTWFjcm9zIGZvciBEZWJ1ZworICovCisjaWZkZWYgREVCVUcKKworI2RlZmluZSBTS19QTk1JX0NIRUNLRkxBR1ModlN0KQl7aWYgKHBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyA+IDAgfHwgXAorCQkJCQlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnID4gMCB8fCBcCisJCQkJCXBBQy0+UG5taS5TaXJxVXBkYXRlZEZsYWcgPiAwKSB7IFwKKwkJCQkJCVNLX0RCR19NU0cocEFDLCBcCisJCQkJCQlTS19EQkdNT0RfUE5NSSwgXAorCQkJCQkJU0tfREJHQ0FUX0NUUkwsCVwKKwkJCQkJCSgiUE5NSTogRVJSOiAlcyBNYWNVRmxhZz0lZCwgUmxtdFVGbGFnPSVkLCBTaXJxVUZsYWc9JWRcbiIsIFwKKwkJCQkJCXZTdCwgXAorCQkJCQkJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnLCBcCisJCQkJCQlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnLCBcCisJCQkJCQlwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnKSl9fQorCisjZWxzZQkvKiAhREVCVUcgKi8KKworI2RlZmluZSBTS19QTk1JX0NIRUNLRkxBR1ModlN0KQkvKiBOb3RoaW5nICovCisKKyNlbmRpZgkvKiAhREVCVUcgKi8KKworI2VuZGlmCS8qIF9TS0dFUE5NMl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vwbm1pLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZXBubWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjI3NzNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vwbm1pLmgKQEAgLTAsMCArMSw5NjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZ2Vwbm1pLmgKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS42MiAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wOC8xNSAxMjozMTo1MiAkCisgKiBQdXJwb3NlOglEZWZpbmVzIGZvciBQcml2YXRlIE5ldHdvcmsgTWFuYWdlbWVudCBJbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU0tHRVBOTUlfSF8KKyNkZWZpbmUgX1NLR0VQTk1JX0hfCisKKy8qCisgKiBJbmNsdWRlIGRlcGVuZGVuY2llcworICovCisjaW5jbHVkZSAiaC9za3R5cGVzLmgiCisjaW5jbHVkZSAiaC9za2Vycm9yLmgiCisjaW5jbHVkZSAiaC9za3RpbWVyLmgiCisjaW5jbHVkZSAiaC9za2kyYy5oIgorI2luY2x1ZGUgImgvc2thZGRyLmgiCisjaW5jbHVkZSAiaC9za3JsbXQuaCIKKyNpbmNsdWRlICJoL3NrdnBkLmgiCisKKy8qCisgKiBNYW5hZ2VtZW50IERhdGFiYXNlIFZlcnNpb24KKyAqLworI2RlZmluZSBTS19QTk1JX01EQl9WRVJTSU9OCQkweDAwMDMwMDAxCS8qIDMuMSAqLworCisKKy8qCisgKiBFdmVudCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1NJUlFfT1ZFUkZMT1cJCTEJLyogQ291bnRlciBvdmVyZmxvdyAqLworI2RlZmluZSBTS19QTk1JX0VWVF9TRU5fV0FSX0xPVwkJCTIJLyogTG93ZXIgd2FyIHRocmVzIGV4Y2VlZGVkICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1NFTl9XQVJfVVBQCQkJMwkvKiBVcHBlciB3YXIgdGhyZXMgZXhjZWVkZWQgKi8KKyNkZWZpbmUgU0tfUE5NSV9FVlRfU0VOX0VSUl9MT1cJCQk0CS8qIExvd2VyIGVyciB0aHJlcyBleGNlZWRlZCAqLworI2RlZmluZSBTS19QTk1JX0VWVF9TRU5fRVJSX1VQUAkJCTUJLyogVXBwZXIgZXJyIHRocmVzIGV4Y2VlZGVkICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX0NIR19FU1RfVElNRVIJCTYJLyogVGltZXIgZXZlbnQgZm9yIFJMTVQgQ2hnICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1VUSUxJWkFUSU9OX1RJTUVSCTcJLyogVGltZXIgZXZlbnQgZm9yIFV0aWxpemEuICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX0NMRUFSX0NPVU5URVIJCTgJLyogQ2xlYXIgc3RhdGlzdGljIGNvdW50ZXJzICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1hNQUNfUkVTRVQJCQk5CS8qIFhNQUMgd2lsbCBiZSByZXNldCAqLworCisjZGVmaW5lIFNLX1BOTUlfRVZUX1JMTVRfUE9SVF9VUAkJMTAJLyogUG9ydCBjYW1lIGxvZ2ljYWxseSB1cCAqLworI2RlZmluZSBTS19QTk1JX0VWVF9STE1UX1BPUlRfRE9XTgkJMTEJLyogUG9ydCB3ZW50IGxvZ2ljYWxseSBkb3duICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1JMTVRfU0VHTUVOVEFUSU9OCTEzCS8qIFR3byBTUCByb290IGJyaWRnZXMgZm91bmQgKi8KKyNkZWZpbmUgU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfRE9XTgkxNAkvKiBQb3J0IHdlbnQgbG9naWNhbGx5IGRvd24gKi8KKyNkZWZpbmUgU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfVVAJCTE1CS8qIFBvcnQgY2FtZSBsb2dpY2FsbHkgdXAgKi8KKyNkZWZpbmUgU0tfUE5NSV9FVlRfUkxNVF9TRVRfTkVUUwkJMTYJLyogMS4gUGFyYW1ldGVyIGlzIG51bWJlciBvZiBuZXRzCisJCQkJCQkJCQkJCQkxID0gc2luZ2xlIG5ldDsgMiA9IGR1YWwgbmV0ICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1ZDVF9SRVNFVAkJMTcJLyogVkNUIHBvcnQgcmVzZXQgdGltZXIgZXZlbnQgc3RhcnRlZCB3aXRoIFNFVC4gKi8KKworCisvKgorICogUmV0dXJuIHZhbHVlcworICovCisjZGVmaW5lIFNLX1BOTUlfRVJSX09LCQkJCTAKKyNkZWZpbmUgU0tfUE5NSV9FUlJfR0VORVJBTAkJCTEKKyNkZWZpbmUgU0tfUE5NSV9FUlJfVE9PX1NIT1JUCQkyCisjZGVmaW5lIFNLX1BOTUlfRVJSX0JBRF9WQUxVRQkJMworI2RlZmluZSBTS19QTk1JX0VSUl9SRUFEX09OTFkJCTQKKyNkZWZpbmUgU0tfUE5NSV9FUlJfVU5LTk9XTl9PSUQJCTUKKyNkZWZpbmUgU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUCTYKKyNkZWZpbmUgU0tfUE5NSV9FUlJfVU5LTk9XTl9ORVQgCTcKKyNkZWZpbmUgU0tfUE5NSV9FUlJfTk9UX1NVUFBPUlRFRAkxMAorCisKKy8qCisgKiBSZXR1cm4gdmFsdWVzIG9mIGRyaXZlciByZXNldCBmdW5jdGlvbiBTS19EUklWRVJfUkVTRVQoKSBhbmQKKyAqIGRyaXZlciBldmVudCBmdW5jdGlvbiBTS19EUklWRVJfRVZFTlQoKQorICovCisjZGVmaW5lIFNLX1BOTUlfRVJSX09LCQkJMAorI2RlZmluZSBTS19QTk1JX0VSUl9GQUlMCQkxCisKKworLyoKKyAqIFJldHVybiB2YWx1ZXMgb2YgZHJpdmVyIHRlc3QgZnVuY3Rpb24gU0tfRFJJVkVSX1NFTEZURVNUKCkKKyAqLworI2RlZmluZSBTS19QTk1JX1RTVF9VTktOT1dOCQkoMSA8PCAwKQorI2RlZmluZSBTS19QTk1JX1RTVF9UUkFOQ0VJVkVSCQkoMSA8PCAxKQorI2RlZmluZSBTS19QTk1JX1RTVF9BU0lDCQkoMSA8PCAyKQorI2RlZmluZSBTS19QTk1JX1RTVF9TRU5TT1IJCSgxIDw8IDMpCisjZGVmaW5lIFNLX1BOTUlfVFNUX1BPV0VSTUdNVAkJKDEgPDwgNCkKKyNkZWZpbmUgU0tfUE5NSV9UU1RfUENJCQkJKDEgPDwgNSkKKyNkZWZpbmUgU0tfUE5NSV9UU1RfTUFDCQkJKDEgPDwgNikKKworCisvKgorICogUkxNVCBzcGVjaWZpYyBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFNLX1BOTUlfUkxNVF9TVEFUVVNfU1RBTkRCWQkxCisjZGVmaW5lIFNLX1BOTUlfUkxNVF9TVEFUVVNfQUNUSVZFCTIKKyNkZWZpbmUgU0tfUE5NSV9STE1UX1NUQVRVU19FUlJPUgkzCisKKyNkZWZpbmUgU0tfUE5NSV9STE1UX0xTVEFUX1BIWV9ET1dOCTEKKyNkZWZpbmUgU0tfUE5NSV9STE1UX0xTVEFUX0FVVE9ORUcJMgorI2RlZmluZSBTS19QTk1JX1JMTVRfTFNUQVRfTE9HX0RPV04JMworI2RlZmluZSBTS19QTk1JX1JMTVRfTFNUQVRfTE9HX1VQCTQKKyNkZWZpbmUgU0tfUE5NSV9STE1UX0xTVEFUX0lOREVURVJNSU5BVEVEIDUKKworI2RlZmluZSBTS19QTk1JX1JMTVRfTU9ERV9DSEtfTElOSwkoU0tfUkxNVF9DSEVDS19MSU5LKQorI2RlZmluZSBTS19QTk1JX1JMTVRfTU9ERV9DSEtfUlgJKFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTkspCisjZGVmaW5lIFNLX1BOTUlfUkxNVF9NT0RFX0NIS19TUFQJKFNLX1JMTVRfQ0hFQ0tfU0VHKQorLyogI2RlZmluZSBTS19QTk1JX1JMTVRfTU9ERV9DSEtfRVggKi8KKworLyoKKyAqIE9JRCBkZWZpbml0aW9uCisgKi8KKyNpZm5kZWYgX05ESVNfCS8qIENoZWNrLCB3aGV0aGVyIE5ESVMgYWxyZWFkeSBpbmNsdWRlZCBPSURzICovCisKKyNkZWZpbmUgT0lEX0dFTl9YTUlUX09LCQkJCQkweDAwMDIwMTAxCisjZGVmaW5lIE9JRF9HRU5fUkNWX09LCQkJCQkweDAwMDIwMTAyCisjZGVmaW5lIE9JRF9HRU5fWE1JVF9FUlJPUgkJCQkweDAwMDIwMTAzCisjZGVmaW5lIE9JRF9HRU5fUkNWX0VSUk9SCQkJCTB4MDAwMjAxMDQKKyNkZWZpbmUgT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSCQkJMHgwMDAyMDEwNQorCisvKiAjZGVmaW5lIE9JRF9HRU5fRElSRUNURURfQllURVNfWE1JVAkweDAwMDIwMjAxICovCisjZGVmaW5lIE9JRF9HRU5fRElSRUNURURfRlJBTUVTX1hNSVQJMHgwMDAyMDIwMgorLyogI2RlZmluZSBPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19YTUlUCTB4MDAwMjAyMDMgKi8KKyNkZWZpbmUgT0lEX0dFTl9NVUxUSUNBU1RfRlJBTUVTX1hNSVQJMHgwMDAyMDIwNAorLyogI2RlZmluZSBPSURfR0VOX0JST0FEQ0FTVF9CWVRFU19YTUlUCTB4MDAwMjAyMDUgKi8KKyNkZWZpbmUgT0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1hNSVQJMHgwMDAyMDIwNgorLyogI2RlZmluZSBPSURfR0VOX0RJUkVDVEVEX0JZVEVTX1JDVgkweDAwMDIwMjA3ICovCisjZGVmaW5lIE9JRF9HRU5fRElSRUNURURfRlJBTUVTX1JDVgkJMHgwMDAyMDIwOAorLyogI2RlZmluZSBPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19SQ1YJMHgwMDAyMDIwOSAqLworI2RlZmluZSBPSURfR0VOX01VTFRJQ0FTVF9GUkFNRVNfUkNWCTB4MDAwMjAyMEEKKy8qICNkZWZpbmUgT0lEX0dFTl9CUk9BRENBU1RfQllURVNfUkNWCTB4MDAwMjAyMEIgKi8KKyNkZWZpbmUgT0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1JDVgkweDAwMDIwMjBDCisjZGVmaW5lIE9JRF9HRU5fUkNWX0NSQ19FUlJPUgkJCTB4MDAwMjAyMEQKKyNkZWZpbmUgT0lEX0dFTl9UUkFOU01JVF9RVUVVRV9MRU5HVEgJMHgwMDAyMDIwRQorCisjZGVmaW5lIE9JRF84MDJfM19QRVJNQU5FTlRfQUREUkVTUwkJMHgwMTAxMDEwMQorI2RlZmluZSBPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTCQkweDAxMDEwMTAyCisvKiAjZGVmaW5lIE9JRF84MDJfM19NVUxUSUNBU1RfTElTVAkJMHgwMTAxMDEwMyAqLworLyogI2RlZmluZSBPSURfODAyXzNfTUFYSU1VTV9MSVNUX1NJWkUJMHgwMTAxMDEwNCAqLworLyogI2RlZmluZSBPSURfODAyXzNfTUFDX09QVElPTlMJCTB4MDEwMTAxMDUgKi8KKwkJCQorI2RlZmluZSBPSURfODAyXzNfUkNWX0VSUk9SX0FMSUdOTUVOVAkweDAxMDIwMTAxCisjZGVmaW5lIE9JRF84MDJfM19YTUlUX09ORV9DT0xMSVNJT04JMHgwMTAyMDEwMgorI2RlZmluZSBPSURfODAyXzNfWE1JVF9NT1JFX0NPTExJU0lPTlMJMHgwMTAyMDEwMworI2RlZmluZSBPSURfODAyXzNfWE1JVF9ERUZFUlJFRAkJCTB4MDEwMjAyMDEKKyNkZWZpbmUgT0lEXzgwMl8zX1hNSVRfTUFYX0NPTExJU0lPTlMJMHgwMTAyMDIwMgorI2RlZmluZSBPSURfODAyXzNfUkNWX09WRVJSVU4JCQkweDAxMDIwMjAzCisjZGVmaW5lIE9JRF84MDJfM19YTUlUX1VOREVSUlVOCQkJMHgwMTAyMDIwNAorI2RlZmluZSBPSURfODAyXzNfWE1JVF9USU1FU19DUlNfTE9TVAkweDAxMDIwMjA2CisjZGVmaW5lIE9JRF84MDJfM19YTUlUX0xBVEVfQ09MTElTSU9OUwkweDAxMDIwMjA3CisKKy8qCisgKiBQblAgYW5kIFBNIE9JRHMKKyAqLworI2lmZGVmIFNLX1BPV0VSX01HTVQKKyNkZWZpbmUgT0lEX1BOUF9DQVBBQklMSVRJRVMJCQkweEZEMDEwMTAwCisjZGVmaW5lIE9JRF9QTlBfU0VUX1BPV0VSCQkJCTB4RkQwMTAxMDEKKyNkZWZpbmUgT0lEX1BOUF9RVUVSWV9QT1dFUgkJCQkweEZEMDEwMTAyCisjZGVmaW5lIE9JRF9QTlBfQUREX1dBS0VfVVBfUEFUVEVSTgkJMHhGRDAxMDEwMworI2RlZmluZSBPSURfUE5QX1JFTU9WRV9XQUtFX1VQX1BBVFRFUk4JMHhGRDAxMDEwNAorI2RlZmluZSBPSURfUE5QX0VOQUJMRV9XQUtFX1VQCQkJMHhGRDAxMDEwNgorI2VuZGlmIC8qIFNLX1BPV0VSX01HTVQgKi8KKworI2VuZGlmIC8qIF9ORElTXyAqLworCisjZGVmaW5lIE9JRF9TS0dFX01EQl9WRVJTSU9OCQkJMHhGRjAxMDEwMAorI2RlZmluZSBPSURfU0tHRV9TVVBQT1JURURfTElTVAkJCTB4RkYwMTAxMDEKKyNkZWZpbmUgT0lEX1NLR0VfVlBEX0ZSRUVfQllURVMJCQkweEZGMDEwMTAyCisjZGVmaW5lIE9JRF9TS0dFX1ZQRF9FTlRSSUVTX0xJU1QJCTB4RkYwMTAxMDMKKyNkZWZpbmUgT0lEX1NLR0VfVlBEX0VOVFJJRVNfTlVNQkVSCQkweEZGMDEwMTA0CisjZGVmaW5lIE9JRF9TS0dFX1ZQRF9LRVkJCQkJMHhGRjAxMDEwNQorI2RlZmluZSBPSURfU0tHRV9WUERfVkFMVUUJCQkJMHhGRjAxMDEwNgorI2RlZmluZSBPSURfU0tHRV9WUERfQUNDRVNTCQkJCTB4RkYwMTAxMDcKKyNkZWZpbmUgT0lEX1NLR0VfVlBEX0FDVElPTgkJCQkweEZGMDEwMTA4CisJCQkKKyNkZWZpbmUgT0lEX1NLR0VfUE9SVF9OVU1CRVIJCQkweEZGMDEwMTEwCisjZGVmaW5lIE9JRF9TS0dFX0RFVklDRV9UWVBFCQkJMHhGRjAxMDExMQorI2RlZmluZSBPSURfU0tHRV9EUklWRVJfREVTQ1IJCQkweEZGMDEwMTEyCisjZGVmaW5lIE9JRF9TS0dFX0RSSVZFUl9WRVJTSU9OCQkJMHhGRjAxMDExMworI2RlZmluZSBPSURfU0tHRV9IV19ERVNDUgkJCQkweEZGMDEwMTE0CisjZGVmaW5lIE9JRF9TS0dFX0hXX1ZFUlNJT04JCQkJMHhGRjAxMDExNQorI2RlZmluZSBPSURfU0tHRV9DSElQU0VUCQkJCTB4RkYwMTAxMTYKKyNkZWZpbmUgT0lEX1NLR0VfQUNUSU9OCQkJCQkweEZGMDEwMTE3CisjZGVmaW5lIE9JRF9TS0dFX1JFU1VMVAkJCQkJMHhGRjAxMDExOAorI2RlZmluZSBPSURfU0tHRV9CVVNfVFlQRQkJCQkweEZGMDEwMTE5CisjZGVmaW5lIE9JRF9TS0dFX0JVU19TUEVFRAkJCQkweEZGMDEwMTFBCisjZGVmaW5lIE9JRF9TS0dFX0JVU19XSURUSAkJCQkweEZGMDEwMTFCCisvKiAweEZGMDEwMTFDIHVudXNlZCAqLworI2RlZmluZSBPSURfU0tHRV9ESUFHX0FDVElPTgkJCTB4RkYwMTAxMUQKKyNkZWZpbmUgT0lEX1NLR0VfRElBR19SRVNVTFQJCQkweEZGMDEwMTFFCisjZGVmaW5lIE9JRF9TS0dFX01UVQkJCQkJMHhGRjAxMDExRgorI2RlZmluZSBPSURfU0tHRV9QSFlTX0NVUl9BRERSCQkJMHhGRjAxMDEyMAorI2RlZmluZSBPSURfU0tHRV9QSFlTX0ZBQ19BRERSCQkJMHhGRjAxMDEyMQorI2RlZmluZSBPSURfU0tHRV9QTUQJCQkJCTB4RkYwMTAxMjIKKyNkZWZpbmUgT0lEX1NLR0VfQ09OTkVDVE9SCQkJCTB4RkYwMTAxMjMKKyNkZWZpbmUgT0lEX1NLR0VfTElOS19DQVAJCQkJMHhGRjAxMDEyNAorI2RlZmluZSBPSURfU0tHRV9MSU5LX01PREUJCQkJMHhGRjAxMDEyNQorI2RlZmluZSBPSURfU0tHRV9MSU5LX01PREVfU1RBVFVTCQkweEZGMDEwMTI2CisjZGVmaW5lIE9JRF9TS0dFX0xJTktfU1RBVFVTCQkJMHhGRjAxMDEyNworI2RlZmluZSBPSURfU0tHRV9GTE9XQ1RSTF9DQVAJCQkweEZGMDEwMTI4CisjZGVmaW5lIE9JRF9TS0dFX0ZMT1dDVFJMX01PREUJCQkweEZGMDEwMTI5CisjZGVmaW5lIE9JRF9TS0dFX0ZMT1dDVFJMX1NUQVRVUwkJMHhGRjAxMDEyQQorI2RlZmluZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX0NBUAkJMHhGRjAxMDEyQgorI2RlZmluZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX01PREUJCTB4RkYwMTAxMkMKKyNkZWZpbmUgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9TVEFUVVMJMHhGRjAxMDEyRAorI2RlZmluZSBPSURfU0tHRV9NVUxUSUNBU1RfTElTVAkJCTB4RkYwMTAxMkUKKyNkZWZpbmUgT0lEX1NLR0VfQ1VSUkVOVF9QQUNLRVRfRklMVEVSCTB4RkYwMTAxMkYKKworI2RlZmluZSBPSURfU0tHRV9UUkFQCQkJCQkweEZGMDEwMTMwCisjZGVmaW5lIE9JRF9TS0dFX1RSQVBfTlVNQkVSCQkJMHhGRjAxMDEzMQorCisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfTU9ERQkJCQkweEZGMDEwMTQwCisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfUE9SVF9OVU1CRVIJCTB4RkYwMTAxNDEKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9QT1JUX0FDVElWRQkJMHhGRjAxMDE0MgorI2RlZmluZSBPSURfU0tHRV9STE1UX1BPUlRfUFJFRkVSUkVECTB4RkYwMTAxNDMKKyNkZWZpbmUgT0lEX1NLR0VfSU5URVJNRURJQVRFX1NVUFBPUlQJMHhGRjAxMDE2MAorCisjZGVmaW5lIE9JRF9TS0dFX1NQRUVEX0NBUAkJCQkweEZGMDEwMTcwCisjZGVmaW5lIE9JRF9TS0dFX1NQRUVEX01PREUJCQkJMHhGRjAxMDE3MQorI2RlZmluZSBPSURfU0tHRV9TUEVFRF9TVEFUVVMJCQkweEZGMDEwMTcyCisKKyNkZWZpbmUgT0lEX1NLR0VfQk9BUkRMRVZFTAkJCQkweEZGMDEwMTgwCisKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX05VTUJFUgkJCTB4RkYwMjAxMDAJCQkKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX0lOREVYCQkJMHhGRjAyMDEwMQorI2RlZmluZSBPSURfU0tHRV9TRU5TT1JfREVTQ1IJCQkweEZGMDIwMTAyCisjZGVmaW5lIE9JRF9TS0dFX1NFTlNPUl9UWVBFCQkJMHhGRjAyMDEwMworI2RlZmluZSBPSURfU0tHRV9TRU5TT1JfVkFMVUUJCQkweEZGMDIwMTA0CisjZGVmaW5lIE9JRF9TS0dFX1NFTlNPUl9XQVJfVEhSRVNfTE9XCTB4RkYwMjAxMDUKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX1dBUl9USFJFU19VUFAJMHhGRjAyMDEwNgorI2RlZmluZSBPSURfU0tHRV9TRU5TT1JfRVJSX1RIUkVTX0xPVwkweEZGMDIwMTA3CisjZGVmaW5lIE9JRF9TS0dFX1NFTlNPUl9FUlJfVEhSRVNfVVBQCTB4RkYwMjAxMDgKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX1NUQVRVUwkJCTB4RkYwMjAxMDkKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX1dBUl9DVFMJCQkweEZGMDIwMTBBCisjZGVmaW5lIE9JRF9TS0dFX1NFTlNPUl9FUlJfQ1RTCQkJMHhGRjAyMDEwQgorI2RlZmluZSBPSURfU0tHRV9TRU5TT1JfV0FSX1RJTUUJCTB4RkYwMjAxMEMKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX0VSUl9USU1FCQkweEZGMDIwMTBECisKKyNkZWZpbmUgT0lEX1NLR0VfQ0hLU01fTlVNQkVSCQkJMHhGRjAyMDExMAorI2RlZmluZSBPSURfU0tHRV9DSEtTTV9SWF9PS19DVFMJCTB4RkYwMjAxMTEKKyNkZWZpbmUgT0lEX1NLR0VfQ0hLU01fUlhfVU5BQkxFX0NUUwkweEZGMDIwMTEyCisjZGVmaW5lIE9JRF9TS0dFX0NIS1NNX1JYX0VSUl9DVFMJCTB4RkYwMjAxMTMKKyNkZWZpbmUgT0lEX1NLR0VfQ0hLU01fVFhfT0tfQ1RTCQkweEZGMDIwMTE0CisjZGVmaW5lIE9JRF9TS0dFX0NIS1NNX1RYX1VOQUJMRV9DVFMJMHhGRjAyMDExNQorCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFgJCQkJMHhGRjAyMDEyMAorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX09DVEVUUwkJCTB4RkYwMjAxMjEKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9CUk9BRENBU1QJCTB4RkYwMjAxMjIKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9NVUxUSUNBU1QJCTB4RkYwMjAxMjMKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9VTklDQVNUCQkweEZGMDIwMTI0CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfTE9OR0ZSQU1FUwkJMHhGRjAyMDEyNQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX0JVUlNUCQkJMHhGRjAyMDEyNgorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX1BGTE9XQwkJCTB4RkYwMjAxMjcKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9GTE9XQwkJCTB4RkYwMjAxMjgKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9TSU5HTEVfQ09MCQkweEZGMDIwMTI5CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfTVVMVElfQ09MCQkweEZGMDIwMTJBCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfRVhDRVNTX0NPTAkJMHhGRjAyMDEyQgorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX0xBVEVfQ09MCQkweEZGMDIwMTJDCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfREVGRkVSQUwJCTB4RkYwMjAxMkQKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9FWENFU1NfREVGCQkweEZGMDIwMTJFCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfVU5ERVJSVU4JCTB4RkYwMjAxMkYKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9DQVJSSUVSCQkweEZGMDIwMTMwCisvKiAjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfVVRJTAkJMHhGRjAyMDEzMSAqLworI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYXzY0CQkJCTB4RkYwMjAxMzIKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF8xMjcJCQkweEZGMDIwMTMzCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfMjU1CQkJMHhGRjAyMDEzNAorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYXzUxMQkJCTB4RkYwMjAxMzUKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF8xMDIzCQkJMHhGRjAyMDEzNgorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX01BWAkJCTB4RkYwMjAxMzcKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9TWU5DCQkJMHhGRjAyMDEzOAorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX1NZTkNfT0NURVRTCTB4RkYwMjAxMzkKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWAkJCQkweEZGMDIwMTNBCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfT0NURVRTCQkJMHhGRjAyMDEzQgorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX0JST0FEQ0FTVAkJMHhGRjAyMDEzQworI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX01VTFRJQ0FTVAkJMHhGRjAyMDEzRAorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX1VOSUNBU1QJCTB4RkYwMjAxM0UKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9QRkxPV0MJCQkweEZGMDIwMTNGCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfRkxPV0MJCQkweEZGMDIwMTQwCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfUEZMT1dDX0VSUgkJMHhGRjAyMDE0MQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX0ZMT1dDX1VOS1dOCTB4RkYwMjAxNDIKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9CVVJTVAkJCTB4RkYwMjAxNDMKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9NSVNTRUQJCQkweEZGMDIwMTQ0CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfRlJBTUlORwkJMHhGRjAyMDE0NQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX09WRVJGTE9XCQkweEZGMDIwMTQ2CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfSkFCQkVSCQkJMHhGRjAyMDE0NworI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX0NBUlJJRVIJCTB4RkYwMjAxNDgKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9JUl9MRU5HVEgJCTB4RkYwMjAxNDkKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9TWU1CT0wJCQkweEZGMDIwMTRBCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfU0hPUlRTCQkJMHhGRjAyMDE0QgorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX1JVTlQJCQkweEZGMDIwMTRDCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfQ0VYVAkJCTB4RkYwMjAxNEQKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9UT09fTE9ORwkJMHhGRjAyMDE0RQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX0ZDUwkJCTB4RkYwMjAxNEYKKy8qICNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9VVElMCQkweEZGMDIwMTUwICovCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfNjQJCQkJMHhGRjAyMDE1MQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYXzEyNwkJCTB4RkYwMjAxNTIKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF8yNTUJCQkweEZGMDIwMTUzCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfNTExCQkJMHhGRjAyMDE1NAorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYXzEwMjMJCQkweEZGMDIwMTU1CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfTUFYCQkJMHhGRjAyMDE1NgorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX0xPTkdGUkFNRVMJCTB4RkYwMjAxNTcKKworI2RlZmluZSBPSURfU0tHRV9STE1UX0NIQU5HRV9DVFMJCTB4RkYwMjAxNjAKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9DSEFOR0VfVElNRQkJMHhGRjAyMDE2MQorI2RlZmluZSBPSURfU0tHRV9STE1UX0NIQU5HRV9FU1RJTQkJMHhGRjAyMDE2MgorI2RlZmluZSBPSURfU0tHRV9STE1UX0NIQU5HRV9USFJFUwkJMHhGRjAyMDE2MworCisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfUE9SVF9JTkRFWAkJMHhGRjAyMDE2NAorI2RlZmluZSBPSURfU0tHRV9STE1UX1NUQVRVUwkJCTB4RkYwMjAxNjUKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9UWF9IRUxMT19DVFMJCTB4RkYwMjAxNjYKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9SWF9IRUxMT19DVFMJCTB4RkYwMjAxNjcKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9UWF9TUF9SRVFfQ1RTCQkweEZGMDIwMTY4CisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfUlhfU1BfQ1RTCQkJMHhGRjAyMDE2OQorCisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9OVU1CRVIJMHhGRjAxMDE1MAorI2RlZmluZSBPSURfU0tHRV9STE1UX01PTklUT1JfSU5ERVgJCTB4RkYwMTAxNTEKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9NT05JVE9SX0FERFIJCTB4RkYwMTAxNTIKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9NT05JVE9SX0VSUlMJCTB4RkYwMTAxNTMKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9NT05JVE9SX1RJTUVTVEFNUAkweEZGMDEwMTU0CisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9BRE1JTgkJMHhGRjAxMDE1NQorCisjZGVmaW5lIE9JRF9TS0dFX1RYX1NXX1FVRVVFX0xFTgkJMHhGRjAyMDE3MAorI2RlZmluZSBPSURfU0tHRV9UWF9TV19RVUVVRV9NQVgJCTB4RkYwMjAxNzEKKyNkZWZpbmUgT0lEX1NLR0VfVFhfUkVUUlkJCQkJMHhGRjAyMDE3MgorI2RlZmluZSBPSURfU0tHRV9SWF9JTlRSX0NUUwkJCTB4RkYwMjAxNzMKKyNkZWZpbmUgT0lEX1NLR0VfVFhfSU5UUl9DVFMJCQkweEZGMDIwMTc0CisjZGVmaW5lIE9JRF9TS0dFX1JYX05PX0JVRl9DVFMJCQkweEZGMDIwMTc1CisjZGVmaW5lIE9JRF9TS0dFX1RYX05PX0JVRl9DVFMJCQkweEZGMDIwMTc2CisjZGVmaW5lIE9JRF9TS0dFX1RYX1VTRURfREVTQ1JfTk8JCTB4RkYwMjAxNzcKKyNkZWZpbmUgT0lEX1NLR0VfUlhfREVMSVZFUkVEX0NUUwkJMHhGRjAyMDE3OAorI2RlZmluZSBPSURfU0tHRV9SWF9PQ1RFVFNfREVMSVZfQ1RTCTB4RkYwMjAxNzkKKyNkZWZpbmUgT0lEX1NLR0VfUlhfSFdfRVJST1JfQ1RTCQkweEZGMDIwMTdBCisjZGVmaW5lIE9JRF9TS0dFX1RYX0hXX0VSUk9SX0NUUwkJMHhGRjAyMDE3QgorI2RlZmluZSBPSURfU0tHRV9JTl9FUlJPUlNfQ1RTCQkJMHhGRjAyMDE3QworI2RlZmluZSBPSURfU0tHRV9PVVRfRVJST1JfQ1RTCQkJMHhGRjAyMDE3RAorI2RlZmluZSBPSURfU0tHRV9FUlJfUkVDT1ZFUllfQ1RTCQkweEZGMDIwMTdFCisjZGVmaW5lIE9JRF9TS0dFX1NZU1VQVElNRQkJCQkweEZGMDIwMTdGCisKKyNkZWZpbmUgT0lEX1NLR0VfQUxMX0RBVEEJCQkJMHhGRjAyMDE5MAorCisvKiBEZWZpbmVzIGZvciBWQ1QuICovCisjZGVmaW5lIE9JRF9TS0dFX1ZDVF9HRVQJCQkJMHhGRjAyMDIwMAorI2RlZmluZSBPSURfU0tHRV9WQ1RfU0VUCQkJCTB4RkYwMjAyMDEKKyNkZWZpbmUgT0lEX1NLR0VfVkNUX1NUQVRVUwkJCQkweEZGMDIwMjAyCisKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKy8qIERlZmluZXMgZm9yIGRyaXZlciBESUFHIG1vZGUuICovCisjZGVmaW5lIE9JRF9TS0dFX0RJQUdfTU9ERQkJCQkweEZGMDIwMjA0CisjZW5kaWYgLyogU0tfRElBR19TVVBQT1JUICovCisKKy8qIE5ldyBPSURzICovCisjZGVmaW5lIE9JRF9TS0dFX0RSSVZFUl9SRUxEQVRFCQkJMHhGRjAyMDIxMAorI2RlZmluZSBPSURfU0tHRV9EUklWRVJfRklMRU5BTUUJCTB4RkYwMjAyMTEKKyNkZWZpbmUgT0lEX1NLR0VfQ0hJUElECQkJCQkweEZGMDIwMjEyCisjZGVmaW5lIE9JRF9TS0dFX1JBTVNJWkUJCQkJMHhGRjAyMDIxMworI2RlZmluZSBPSURfU0tHRV9WQVVYQVZBSUwJCQkJMHhGRjAyMDIxNAorI2RlZmluZSBPSURfU0tHRV9QSFlfVFlQRQkJCQkweEZGMDIwMjE1CisjZGVmaW5lIE9JRF9TS0dFX1BIWV9MUF9NT0RFCQkJMHhGRjAyMDIxNgorCisvKiBWQ1Qgc3RydWN0IHRvIHN0b3JlIGEgYmFja3VwIGNvcHkgb2YgVkNUIGRhdGEgYWZ0ZXIgYSBwb3J0IHJlc2V0LiAqLwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pVmN0IHsKKwlTS19VOAkJCVZjdFN0YXR1czsKKwlTS19VOAkJCVBDYWJsZUxlbjsKKwlTS19VMzIJCQlQTWRpUGFpckxlbls0XTsKKwlTS19VOAkJCVBNZGlQYWlyU3RzWzRdOworfSBTS19QTk1JX1ZDVDsKKworCisvKiBWQ1Qgc3RhdHVzIHZhbHVlcyAodG8gYmUgZ2l2ZW4gdG8gQ1BBIHZpYSBPSURfU0tHRV9WQ1RfU1RBVFVTKS4gKi8KKyNkZWZpbmUgU0tfUE5NSV9WQ1RfTk9ORQkJMAorI2RlZmluZSBTS19QTk1JX1ZDVF9PTERfVkNUX0RBVEEJMQorI2RlZmluZSBTS19QTk1JX1ZDVF9ORVdfVkNUX0RBVEEJMgorI2RlZmluZSBTS19QTk1JX1ZDVF9PTERfRFNQX0RBVEEJNAorI2RlZmluZSBTS19QTk1JX1ZDVF9ORVdfRFNQX0RBVEEJOAorI2RlZmluZSBTS19QTk1JX1ZDVF9SVU5OSU5HCQkxNgorCisKKy8qIFZDVCBjYWJsZSB0ZXN0IHN0YXR1cy4gKi8KKyNkZWZpbmUgU0tfUE5NSV9WQ1RfTk9STUFMX0NBQkxFCQkwCisjZGVmaW5lIFNLX1BOTUlfVkNUX1NIT1JUX0NBQkxFCQkJMQorI2RlZmluZSBTS19QTk1JX1ZDVF9PUEVOX0NBQkxFCQkJMgorI2RlZmluZSBTS19QTk1JX1ZDVF9URVNUX0ZBSUwJCQkzCisjZGVmaW5lIFNLX1BOTUlfVkNUX0lNUEVEQU5DRV9NSVNNQVRDSAkJNAorCisjZGVmaW5lCU9JRF9TS0dFX1RSQVBfU0VOX1dBUl9MT1cJCTUwMAorI2RlZmluZSBPSURfU0tHRV9UUkFQX1NFTl9XQVJfVVBQCQk1MDEKKyNkZWZpbmUJT0lEX1NLR0VfVFJBUF9TRU5fRVJSX0xPVwkJNTAyCisjZGVmaW5lIE9JRF9TS0dFX1RSQVBfU0VOX0VSUl9VUFAJCTUwMworI2RlZmluZSBPSURfU0tHRV9UUkFQX1JMTVRfQ0hBTkdFX1RIUkVTCTUyMAorI2RlZmluZSBPSURfU0tHRV9UUkFQX1JMTVRfQ0hBTkdFX1BPUlQJNTIxCisjZGVmaW5lIE9JRF9TS0dFX1RSQVBfUkxNVF9QT1JUX0RPV04JNTIyCisjZGVmaW5lIE9JRF9TS0dFX1RSQVBfUkxNVF9QT1JUX1VQCQk1MjMKKyNkZWZpbmUgT0lEX1NLR0VfVFJBUF9STE1UX1NFR01FTlRBVElPTgk1MjQKKworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorLyogRGVmaW5lcyBmb3IgZHJpdmVyIERJQUcgbW9kZS4gKi8KKyNkZWZpbmUgU0tfRElBR19BVFRBQ0hFRAkyCisjZGVmaW5lIFNLX0RJQUdfUlVOTklORwkJMQorI2RlZmluZSBTS19ESUFHX0lETEUJCTAKKyNlbmRpZiAvKiBTS19ESUFHX1NVUFBPUlQgKi8KKworLyoKKyAqIEdlbmVyaWMgUE5NSSBJT0NUTCBzdWJjb21tYW5kIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lCVNLX0dFVF9TSU5HTEVfVkFSCQkxCisjZGVmaW5lCVNLX1NFVF9TSU5HTEVfVkFSCQkyCisjZGVmaW5lCVNLX1BSRVNFVF9TSU5HTEVfVkFSCTMKKyNkZWZpbmUJU0tfR0VUX0ZVTExfTUlCCQkJNAorI2RlZmluZQlTS19TRVRfRlVMTF9NSUIJCQk1CisjZGVmaW5lCVNLX1BSRVNFVF9GVUxMX01JQgkJNgorCisKKy8qCisgKiBEZWZpbmUgZXJyb3IgbnVtYmVycyBhbmQgbWVzc2FnZXMgZm9yIHN5c2xvZworICovCisjZGVmaW5lIFNLX1BOTUlfRVJSMDAxCQkoU0tfRVJSQkFTRV9QTk1JICsgMSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDFNU0cJIlNrUG5taUdldFN0cnVjdDogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDAyCQkoU0tfRVJSQkFTRV9QTk1JICsgMikKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDJNU0cJIlNrUG5taUdldFN0cnVjdDogQ2Fubm90IHJlYWQgVlBEIGtleXMiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDAzCQkoU0tfRVJSQkFTRV9QTk1JICsgMykKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDNNU0cJIk9pZFN0cnVjdDogQ2FsbGVkIHdpdGggd3JvbmcgT0lEIgorI2RlZmluZSBTS19QTk1JX0VSUjAwNAkJKFNLX0VSUkJBU0VfUE5NSSArIDQpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDA0TVNHCSJPaWRTdHJ1Y3Q6IENhbGxlZCB3aXRoIHdyb25nIGFjdGlvbiIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDUJCShTS19FUlJCQVNFX1BOTUkgKyA1KQorI2RlZmluZSBTS19QTk1JX0VSUjAwNU1TRwkiUGVyZm9ybTogQ2Fubm90IHJlc2V0IGRyaXZlciIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDYJCShTS19FUlJCQVNFX1BOTUkgKyA2KQorI2RlZmluZSBTS19QTk1JX0VSUjAwNk1TRwkiUGVyZm9ybTogVW5rbm93biBPSUQgYWN0aW9uIGNvbW1hbmQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDA3CQkoU0tfRVJSQkFTRV9QTk1JICsgNykKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDdNU0cJIkdlbmVyYWw6IERyaXZlciBkZXNjcmlwdGlvbiBub3QgaW5pdGlhbGl6ZWQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDA4CQkoU0tfRVJSQkFTRV9QTk1JICsgOCkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDhNU0cJIkFkZHI6IFRyaWVkIHRvIGdldCB1bmtub3duIE9JRCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDkJCShTS19FUlJCQVNFX1BOTUkgKyA5KQorI2RlZmluZSBTS19QTk1JX0VSUjAwOU1TRwkiQWRkcjogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDEwCQkoU0tfRVJSQkFTRV9QTk1JICsgMTApCisjZGVmaW5lIFNLX1BOTUlfRVJSMDEwTVNHCSJDc3VtU3RhdDogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDExCQkoU0tfRVJSQkFTRV9QTk1JICsgMTEpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDExTVNHCSJTZW5zb3JTdGF0OiBTZW5zb3IgZGVzY3Igc3RyaW5nIHRvbyBsb25nIgorI2RlZmluZSBTS19QTk1JX0VSUjAxMgkJKFNLX0VSUkJBU0VfUE5NSSArIDEyKQorI2RlZmluZSBTS19QTk1JX0VSUjAxMk1TRwkiU2Vuc29yU3RhdDogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDEzCQkoU0tfRVJSQkFTRV9QTk1JICsgMTMpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDEzTVNHCSIiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE0CQkoU0tfRVJSQkFTRV9QTk1JICsgMTQpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE0TVNHCSJWcGQ6IENhbm5vdCByZWFkIFZQRCBrZXlzIgorI2RlZmluZSBTS19QTk1JX0VSUjAxNQkJKFNLX0VSUkJBU0VfUE5NSSArIDE1KQorI2RlZmluZSBTS19QTk1JX0VSUjAxNU1TRwkiVnBkOiBJbnRlcm5hbCBhcnJheSBmb3IgVlBEIGtleXMgdG8gc21hbGwiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE2CQkoU0tfRVJSQkFTRV9QTk1JICsgMTYpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE2TVNHCSJWcGQ6IEtleSBzdHJpbmcgdG9vIGxvbmciCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE3CQkoU0tfRVJSQkFTRV9QTk1JICsgMTcpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE3TVNHCSJWcGQ6IEludmFsaWQgVlBEIHN0YXR1cyBwb2ludGVyIgorI2RlZmluZSBTS19QTk1JX0VSUjAxOAkJKFNLX0VSUkJBU0VfUE5NSSArIDE4KQorI2RlZmluZSBTS19QTk1JX0VSUjAxOE1TRwkiVnBkOiBWUEQgZGF0YSBub3QgdmFsaWQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE5CQkoU0tfRVJSQkFTRV9QTk1JICsgMTkpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE5TVNHCSJWcGQ6IFZQRCBlbnRyaWVzIGxpc3Qgc3RyaW5nIHRvbyBsb25nIgorI2RlZmluZSBTS19QTk1JX0VSUjAyMQkJKFNLX0VSUkJBU0VfUE5NSSArIDIxKQorI2RlZmluZSBTS19QTk1JX0VSUjAyMU1TRwkiVnBkOiBWUEQgZGF0YSBzdHJpbmcgdG9vIGxvbmciCisjZGVmaW5lIFNLX1BOTUlfRVJSMDIyCQkoU0tfRVJSQkFTRV9QTk1JICsgMjIpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDIyTVNHCSJWcGQ6IFZQRCBkYXRhIHN0cmluZyB0b28gbG9uZyBzaG91bGQgYmUgZXJyb3JlZCBiZWZvcmUiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDIzCQkoU0tfRVJSQkFTRV9QTk1JICsgMjMpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDIzTVNHCSJWcGQ6IFVua25vd24gT0lEIGluIGdldCBhY3Rpb24iCisjZGVmaW5lIFNLX1BOTUlfRVJSMDI0CQkoU0tfRVJSQkFTRV9QTk1JICsgMjQpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDI0TVNHCSJWcGQ6IFVua25vd24gT0lEIGluIHByZXNldC9zZXQgYWN0aW9uIgorI2RlZmluZSBTS19QTk1JX0VSUjAyNQkJKFNLX0VSUkJBU0VfUE5NSSArIDI1KQorI2RlZmluZSBTS19QTk1JX0VSUjAyNU1TRwkiVnBkOiBDYW5ub3Qgd3JpdGUgVlBEIGFmdGVyIG1vZGlmeSBlbnRyeSIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMjYJCShTS19FUlJCQVNFX1BOTUkgKyAyNikKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMjZNU0cJIlZwZDogQ2Fubm90IHVwZGF0ZSBWUEQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDI3CQkoU0tfRVJSQkFTRV9QTk1JICsgMjcpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDI3TVNHCSJWcGQ6IENhbm5vdCBkZWxldGUgVlBEIGVudHJ5IgorI2RlZmluZSBTS19QTk1JX0VSUjAyOAkJKFNLX0VSUkJBU0VfUE5NSSArIDI4KQorI2RlZmluZSBTS19QTk1JX0VSUjAyOE1TRwkiVnBkOiBDYW5ub3QgdXBkYXRlIFZQRCBhZnRlciBkZWxldGUgZW50cnkiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDI5CQkoU0tfRVJSQkFTRV9QTk1JICsgMjkpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDI5TVNHCSJHZW5lcmFsOiBEcml2ZXIgZGVzY3JpcHRpb24gc3RyaW5nIHRvbyBsb25nIgorI2RlZmluZSBTS19QTk1JX0VSUjAzMAkJKFNLX0VSUkJBU0VfUE5NSSArIDMwKQorI2RlZmluZSBTS19QTk1JX0VSUjAzME1TRwkiR2VuZXJhbDogRHJpdmVyIHZlcnNpb24gbm90IGluaXRpYWxpemVkIgorI2RlZmluZSBTS19QTk1JX0VSUjAzMQkJKFNLX0VSUkJBU0VfUE5NSSArIDMxKQorI2RlZmluZSBTS19QTk1JX0VSUjAzMU1TRwkiR2VuZXJhbDogRHJpdmVyIHZlcnNpb24gc3RyaW5nIHRvbyBsb25nIgorI2RlZmluZSBTS19QTk1JX0VSUjAzMgkJKFNLX0VSUkJBU0VfUE5NSSArIDMyKQorI2RlZmluZSBTS19QTk1JX0VSUjAzMk1TRwkiR2VuZXJhbDogQ2Fubm90IHJlYWQgVlBEIE5hbWUgZm9yIEhXIGRlc2NyIgorI2RlZmluZSBTS19QTk1JX0VSUjAzMwkJKFNLX0VSUkJBU0VfUE5NSSArIDMzKQorI2RlZmluZSBTS19QTk1JX0VSUjAzM01TRwkiR2VuZXJhbDogSFcgZGVzY3JpcHRpb24gc3RyaW5nIHRvbyBsb25nIgorI2RlZmluZSBTS19QTk1JX0VSUjAzNAkJKFNLX0VSUkJBU0VfUE5NSSArIDM0KQorI2RlZmluZSBTS19QTk1JX0VSUjAzNE1TRwkiR2VuZXJhbDogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDM1CQkoU0tfRVJSQkFTRV9QTk1JICsgMzUpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDM1TVNHCSJSbG10OiBVbmtub3duIE9JRCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzYJCShTS19FUlJCQVNFX1BOTUkgKyAzNikKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzZNU0cJIiIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzcJCShTS19FUlJCQVNFX1BOTUkgKyAzNykKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzdNU0cJIlJsbXQ6IFNLX1JMTVRfTU9ERV9DSEFOR0UgZXZlbnQgcmV0dXJuIG5vdCAwIgorI2RlZmluZSBTS19QTk1JX0VSUjAzOAkJKFNLX0VSUkJBU0VfUE5NSSArIDM4KQorI2RlZmluZSBTS19QTk1JX0VSUjAzOE1TRwkiUmxtdDogU0tfUkxNVF9QUkVGUE9SVF9DSEFOR0UgZXZlbnQgcmV0dXJuIG5vdCAwIgorI2RlZmluZSBTS19QTk1JX0VSUjAzOQkJKFNLX0VSUkJBU0VfUE5NSSArIDM5KQorI2RlZmluZSBTS19QTk1JX0VSUjAzOU1TRwkiUmxtdFN0YXQ6IFVua25vd24gT0lEIgorI2RlZmluZSBTS19QTk1JX0VSUjA0MAkJKFNLX0VSUkJBU0VfUE5NSSArIDQwKQorI2RlZmluZSBTS19QTk1JX0VSUjA0ME1TRwkiUG93ZXJNYW5hZ2VtZW50OiBVbmtub3duIE9JRCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDEJCShTS19FUlJCQVNFX1BOTUkgKyA0MSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDFNU0cJIk1hY1ByaXZhdGVDb25mOiBVbmtub3duIE9JRCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDIJCShTS19FUlJCQVNFX1BOTUkgKyA0MikKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDJNU0cJIk1hY1ByaXZhdGVDb25mOiBTS19IV0VWX1NFVF9ST0xFIHJldHVybmVkIG5vdCAwIgorI2RlZmluZSBTS19QTk1JX0VSUjA0MwkJKFNLX0VSUkJBU0VfUE5NSSArIDQzKQorI2RlZmluZSBTS19QTk1JX0VSUjA0M01TRwkiTWFjUHJpdmF0ZUNvbmY6IFNLX0hXRVZfU0VUX0xNT0RFIHJldHVybmVkIG5vdCAwIgorI2RlZmluZSBTS19QTk1JX0VSUjA0NAkJKFNLX0VSUkJBU0VfUE5NSSArIDQ0KQorI2RlZmluZSBTS19QTk1JX0VSUjA0NE1TRwkiTWFjUHJpdmF0ZUNvbmY6IFNLX0hXRVZfU0VUX0ZMT1dNT0RFIHJldHVybmVkIG5vdCAwIgorI2RlZmluZSBTS19QTk1JX0VSUjA0NQkJKFNLX0VSUkJBU0VfUE5NSSArIDQ1KQorI2RlZmluZSBTS19QTk1JX0VSUjA0NU1TRwkiTWFjUHJpdmF0ZUNvbmY6IFNLX0hXRVZfU0VUX1NQRUVEIHJldHVybmVkIG5vdCAwIgorI2RlZmluZSBTS19QTk1JX0VSUjA0NgkJKFNLX0VSUkJBU0VfUE5NSSArIDQ2KQorI2RlZmluZSBTS19QTk1JX0VSUjA0Nk1TRwkiTW9uaXRvcjogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDQ3CQkoU0tfRVJSQkFTRV9QTk1JICsgNDcpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDQ3TVNHCSJTaXJxVXBkYXRlOiBFdmVudCBmdW5jdGlvbiByZXR1cm5zIG5vdCAwIgorI2RlZmluZSBTS19QTk1JX0VSUjA0OAkJKFNLX0VSUkJBU0VfUE5NSSArIDQ4KQorI2RlZmluZSBTS19QTk1JX0VSUjA0OE1TRwkiUmxtdFVwZGF0ZTogRXZlbnQgZnVuY3Rpb24gcmV0dXJucyBub3QgMCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDkJCShTS19FUlJCQVNFX1BOTUkgKyA0OSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDlNU0cJIlNrUG5taUluaXQ6IEludmFsaWQgc2l6ZSBvZiAnQ291bnRlck9mZnNldCcgc3RydWN0ISEiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDUwCQkoU0tfRVJSQkFTRV9QTk1JICsgNTApCisjZGVmaW5lIFNLX1BOTUlfRVJSMDUwTVNHCSJTa1BubWlJbml0OiBJbnZhbGlkIHNpemUgb2YgJ1N0YXRBZGRyJyB0YWJsZSEhIgorI2RlZmluZSBTS19QTk1JX0VSUjA1MQkJKFNLX0VSUkJBU0VfUE5NSSArIDUxKQorI2RlZmluZSBTS19QTk1JX0VSUjA1MU1TRwkiU2tQbm1pRXZlbnQ6IFBvcnQgc3dpdGNoIHN1c3BpY2lvdXMiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDUyCQkoU0tfRVJSQkFTRV9QTk1JICsgNTIpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDUyTVNHCSIiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDUzCQkoU0tfRVJSQkFTRV9QTk1JICsgNTMpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDUzTVNHCSJHZW5lcmFsOiBEcml2ZXIgcmVsZWFzZSBkYXRlIG5vdCBpbml0aWFsaXplZCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNTQJCShTS19FUlJCQVNFX1BOTUkgKyA1NCkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNTRNU0cJIkdlbmVyYWw6IERyaXZlciByZWxlYXNlIGRhdGUgc3RyaW5nIHRvbyBsb25nIgorI2RlZmluZSBTS19QTk1JX0VSUjA1NQkJKFNLX0VSUkJBU0VfUE5NSSArIDU1KQorI2RlZmluZSBTS19QTk1JX0VSUjA1NU1TRwkiR2VuZXJhbDogRHJpdmVyIGZpbGUgbmFtZSBub3QgaW5pdGlhbGl6ZWQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDU2CQkoU0tfRVJSQkFTRV9QTk1JICsgNTYpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDU2TVNHCSJHZW5lcmFsOiBEcml2ZXIgZmlsZSBuYW1lIHN0cmluZyB0b28gbG9uZyIKKworLyoKKyAqIE1hbmFnZW1lbnQgY291bnRlciBtYWNyb3MgY2FsbGVkIGJ5IHRoZSBkcml2ZXIKKyAqLworI2RlZmluZSBTS19QTk1JX1NFVF9EUklWRVJfREVTQ1IocEFDLHYpCSgocEFDKS0+UG5taS5wRHJpdmVyRGVzY3JpcHRpb24gPSBcCisJKGNoYXIgKikodikpCisKKyNkZWZpbmUgU0tfUE5NSV9TRVRfRFJJVkVSX1ZFUihwQUMsdikJKChwQUMpLT5Qbm1pLnBEcml2ZXJWZXJzaW9uID0gXAorCShjaGFyICopKHYpKQorCisjZGVmaW5lIFNLX1BOTUlfU0VUX0RSSVZFUl9SRUxEQVRFKHBBQyx2KQkoKHBBQyktPlBubWkucERyaXZlclJlbGVhc2VEYXRlID0gXAorCShjaGFyICopKHYpKQorCisjZGVmaW5lIFNLX1BOTUlfU0VUX0RSSVZFUl9GSUxFTkFNRShwQUMsdikJKChwQUMpLT5Qbm1pLnBEcml2ZXJGaWxlTmFtZSA9IFwKKwkoY2hhciAqKSh2KSkKKworI2RlZmluZSBTS19QTk1JX0NOVF9UWF9RVUVVRV9MRU4ocEFDLHYscCkgXAorCXsgXAorCQkocEFDKS0+UG5taS5Qb3J0W3BdLlR4U3dRdWV1ZUxlbiA9IChTS19VNjQpKHYpOyBcCisJCWlmICgocEFDKS0+UG5taS5Qb3J0W3BdLlR4U3dRdWV1ZUxlbiA+IChwQUMpLT5Qbm1pLlBvcnRbcF0uVHhTd1F1ZXVlTWF4KSB7IFwKKwkJCShwQUMpLT5Qbm1pLlBvcnRbcF0uVHhTd1F1ZXVlTWF4ID0gKHBBQyktPlBubWkuUG9ydFtwXS5UeFN3UXVldWVMZW47IFwKKwkJfSBcCisJfQorI2RlZmluZSBTS19QTk1JX0NOVF9UWF9SRVRSWShwQUMscCkJKCgocEFDKS0+UG5taS5Qb3J0W3BdLlR4UmV0cnlDdHMpKyspCisjZGVmaW5lIFNLX1BOTUlfQ05UX1JYX0lOVFIocEFDLHApCSgoKHBBQyktPlBubWkuUG9ydFtwXS5SeEludHJDdHMpKyspCisjZGVmaW5lIFNLX1BOTUlfQ05UX1RYX0lOVFIocEFDLHApCSgoKHBBQyktPlBubWkuUG9ydFtwXS5UeEludHJDdHMpKyspCisjZGVmaW5lIFNLX1BOTUlfQ05UX05PX1JYX0JVRihwQUMscCkJKCgocEFDKS0+UG5taS5Qb3J0W3BdLlJ4Tm9CdWZDdHMpKyspCisjZGVmaW5lIFNLX1BOTUlfQ05UX05PX1RYX0JVRihwQUMscCkJKCgocEFDKS0+UG5taS5Qb3J0W3BdLlR4Tm9CdWZDdHMpKyspCisjZGVmaW5lIFNLX1BOTUlfQ05UX1VTRURfVFhfREVTQ1IocEFDLHYscCkgXAorCSgocEFDKS0+UG5taS5Qb3J0W3BdLlR4VXNlZERlc2NyTm89KFNLX1U2NCkodikpOworI2RlZmluZSBTS19QTk1JX0NOVF9SWF9PQ1RFVFNfREVMSVZFUkVEKHBBQyx2LHApIFwKKwl7IFwKKwkJKChwQUMpLT5Qbm1pLlBvcnRbcF0uUnhEZWxpdmVyZWRDdHMpKys7IFwKKwkJKHBBQyktPlBubWkuUG9ydFtwXS5SeE9jdGV0c0RlbGl2ZXJlZEN0cyArPSAoU0tfVTY0KSh2KTsgXAorCX0KKyNkZWZpbmUgU0tfUE5NSV9DTlRfRVJSX1JFQ09WRVJZKHBBQyxwKQkoKChwQUMpLT5Qbm1pLlBvcnRbcF0uRXJyUmVjb3ZlcnlDdHMpKyspOworCisjZGVmaW5lIFNLX1BOTUlfQ05UX1NZTkNfT0NURVRTKHBBQyxwLHYpIFwKKwl7IFwKKwkJaWYgKChwKSA8IFNLX01BWF9NQUNTKSB7IFwKKwkJCSgocEFDKS0+UG5taS5Qb3J0W3BdLlN0YXRTeW5jQ3RzKSsrOyBcCisJCQkocEFDKS0+UG5taS5Qb3J0W3BdLlN0YXRTeW5jT2N0ZXRzQ3RzICs9IChTS19VNjQpKHYpOyBcCisJCX0gXAorCX0KKworI2RlZmluZSBTS19QTk1JX0NOVF9SWF9MT05HRlJBTUVTKHBBQyxwKSBcCisJeyBcCisJCWlmICgocCkgPCBTS19NQVhfTUFDUykgeyBcCisJCQkoKHBBQyktPlBubWkuUG9ydFtwXS5TdGF0UnhMb25nRnJhbWVDdHMrKyk7IFwKKwkJfSBcCisJfQorCisjZGVmaW5lIFNLX1BOTUlfQ05UX1JYX0ZSQU1FVE9PTE9ORyhwQUMscCkgXAorCXsgXAorCQlpZiAoKHApIDwgU0tfTUFYX01BQ1MpIHsgXAorCQkJKChwQUMpLT5Qbm1pLlBvcnRbcF0uU3RhdFJ4RnJhbWVUb29Mb25nQ3RzKyspOyBcCisJCX0gXAorCX0KKworI2RlZmluZSBTS19QTk1JX0NOVF9SWF9QTUFDQ19FUlIocEFDLHApIFwKKwl7IFwKKwkJaWYgKChwKSA8IFNLX01BWF9NQUNTKSB7IFwKKwkJCSgocEFDKS0+UG5taS5Qb3J0W3BdLlN0YXRSeFBNYWNjRXJyKyspOyBcCisJCX0gXAorCX0KKworLyoKKyAqIENvbnZlcnNpb24gTWFjcm9zCisgKi8KKyNkZWZpbmUgU0tfUE5NSV9QT1JUX0lOU1QyTE9HKGkpCSgodW5zaWduZWQgaW50KShpKSAtIDEpCisjZGVmaW5lIFNLX1BOTUlfUE9SVF9MT0cySU5TVChsKQkoKHVuc2lnbmVkIGludCkobCkgKyAxKQorI2RlZmluZSBTS19QTk1JX1BPUlRfUEhZUzJMT0cocCkJKCh1bnNpZ25lZCBpbnQpKHApICsgMSkKKyNkZWZpbmUgU0tfUE5NSV9QT1JUX0xPRzJQSFlTKHBBQyxsKQkoKHVuc2lnbmVkIGludCkobCkgLSAxKQorI2RlZmluZSBTS19QTk1JX1BPUlRfUEhZUzJJTlNUKHBBQyxwKQlcCisJKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA/IDIgOiAoKHVuc2lnbmVkIGludCkocCkgKyAyKSkKKyNkZWZpbmUgU0tfUE5NSV9QT1JUX0lOU1QyUEhZUyhwQUMsaSkJKCh1bnNpZ25lZCBpbnQpKGkpIC0gMikKKworLyoKKyAqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciBTa1BubWlHZXRTdHJ1Y3QgYW5kIFNrUG5taVNldFN0cnVjdAorICovCisjZGVmaW5lIFNLX1BOTUlfVlBEX0tFWV9TSVpFCTUKKyNkZWZpbmUgU0tfUE5NSV9WUERfQlVGU0laRQkJKFZQRF9TSVpFKQorI2RlZmluZSBTS19QTk1JX1ZQRF9FTlRSSUVTCQkoVlBEX1NJWkUgLyA0KQorI2RlZmluZSBTS19QTk1JX1ZQRF9EQVRBTEVOCQkxMjggLyogIE51bWJlciBvZiBkYXRhIGJ5dGVzICovCisKKyNkZWZpbmUgU0tfUE5NSV9NVUxUSUNBU1RfTElTVExFTgk2NAorI2RlZmluZSBTS19QTk1JX1NFTlNPUl9FTlRSSUVTCQkoU0tfTUFYX1NFTlNPUlMpCisjZGVmaW5lIFNLX1BOTUlfQ0hFQ0tTVU1fRU5UUklFUwkzCisjZGVmaW5lIFNLX1BOTUlfTUFDX0VOVFJJRVMJCQkoU0tfTUFYX01BQ1MgKyAxKQorI2RlZmluZSBTS19QTk1JX01PTklUT1JfRU5UUklFUwkJMjAKKyNkZWZpbmUgU0tfUE5NSV9UUkFQX0VOVFJJRVMJCTEwCisjZGVmaW5lIFNLX1BOTUlfVFJBUExFTgkJCQkxMjgKKyNkZWZpbmUgU0tfUE5NSV9TVFJJTkdMRU4xCQkJODAKKyNkZWZpbmUgU0tfUE5NSV9TVFJJTkdMRU4yCQkJMjUKKyNkZWZpbmUgU0tfUE5NSV9UUkFQX1FVRVVFX0xFTgkJNTEyCisKK3R5cGVkZWYgc3RydWN0IHNfUG5taVZwZCB7CisJY2hhcgkJCVZwZEtleVtTS19QTk1JX1ZQRF9LRVlfU0laRV07CisJY2hhcgkJCVZwZFZhbHVlW1NLX1BOTUlfVlBEX0RBVEFMRU5dOworCVNLX1U4CQkJVnBkQWNjZXNzOworCVNLX1U4CQkJVnBkQWN0aW9uOworfSBTS19QTk1JX1ZQRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pU2Vuc29yIHsKKwlTS19VOAkJCVNlbnNvckluZGV4OworCWNoYXIJCQlTZW5zb3JEZXNjcltTS19QTk1JX1NUUklOR0xFTjJdOworCVNLX1U4CQkJU2Vuc29yVHlwZTsKKwlTS19VMzIJCQlTZW5zb3JWYWx1ZTsKKwlTS19VMzIJCQlTZW5zb3JXYXJuaW5nVGhyZXNob2xkTG93OworCVNLX1UzMgkJCVNlbnNvcldhcm5pbmdUaHJlc2hvbGRIaWdoOworCVNLX1UzMgkJCVNlbnNvckVycm9yVGhyZXNob2xkTG93OworCVNLX1UzMgkJCVNlbnNvckVycm9yVGhyZXNob2xkSGlnaDsKKwlTS19VOAkJCVNlbnNvclN0YXR1czsKKwlTS19VNjQJCQlTZW5zb3JXYXJuaW5nQ3RzOworCVNLX1U2NAkJCVNlbnNvckVycm9yQ3RzOworCVNLX1U2NAkJCVNlbnNvcldhcm5pbmdUaW1lc3RhbXA7CisJU0tfVTY0CQkJU2Vuc29yRXJyb3JUaW1lc3RhbXA7Cit9IFNLX1BOTUlfU0VOU09SOworCit0eXBlZGVmIHN0cnVjdCBzX1BubWlDaGVja3N1bSB7CisJU0tfVTY0CQkJQ2hlY2tzdW1SeE9rQ3RzOworCVNLX1U2NAkJCUNoZWNrc3VtUnhVbmFibGVDdHM7CisJU0tfVTY0CQkJQ2hlY2tzdW1SeEVyckN0czsKKwlTS19VNjQJCQlDaGVja3N1bVR4T2tDdHM7CisJU0tfVTY0CQkJQ2hlY2tzdW1UeFVuYWJsZUN0czsKK30gU0tfUE5NSV9DSEVDS1NVTTsKKwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pU3RhdCB7CisJU0tfVTY0CQkJU3RhdFR4T2tDdHM7CisJU0tfVTY0CQkJU3RhdFR4T2N0ZXRzT2tDdHM7CisJU0tfVTY0CQkJU3RhdFR4QnJvYWRjYXN0T2tDdHM7CisJU0tfVTY0CQkJU3RhdFR4TXVsdGljYXN0T2tDdHM7CisJU0tfVTY0CQkJU3RhdFR4VW5pY2FzdE9rQ3RzOworCVNLX1U2NAkJCVN0YXRUeExvbmdGcmFtZXNDdHM7CisJU0tfVTY0CQkJU3RhdFR4QnVyc3RDdHM7CisJU0tfVTY0CQkJU3RhdFR4UGF1c2VNYWNDdHJsQ3RzOworCVNLX1U2NAkJCVN0YXRUeE1hY0N0cmxDdHM7CisJU0tfVTY0CQkJU3RhdFR4U2luZ2xlQ29sbGlzaW9uQ3RzOworCVNLX1U2NAkJCVN0YXRUeE11bHRpcGxlQ29sbGlzaW9uQ3RzOworCVNLX1U2NAkJCVN0YXRUeEV4Y2Vzc2l2ZUNvbGxpc2lvbkN0czsKKwlTS19VNjQJCQlTdGF0VHhMYXRlQ29sbGlzaW9uQ3RzOworCVNLX1U2NAkJCVN0YXRUeERlZmVycmFsQ3RzOworCVNLX1U2NAkJCVN0YXRUeEV4Y2Vzc2l2ZURlZmVycmFsQ3RzOworCVNLX1U2NAkJCVN0YXRUeEZpZm9VbmRlcnJ1bkN0czsKKwlTS19VNjQJCQlTdGF0VHhDYXJyaWVyQ3RzOworCVNLX1U2NAkJCUR1bW15MTsgLyogU3RhdFR4VXRpbGl6YXRpb24gKi8KKwlTS19VNjQJCQlTdGF0VHg2NEN0czsKKwlTS19VNjQJCQlTdGF0VHgxMjdDdHM7CisJU0tfVTY0CQkJU3RhdFR4MjU1Q3RzOworCVNLX1U2NAkJCVN0YXRUeDUxMUN0czsKKwlTS19VNjQJCQlTdGF0VHgxMDIzQ3RzOworCVNLX1U2NAkJCVN0YXRUeE1heEN0czsKKwlTS19VNjQJCQlTdGF0VHhTeW5jQ3RzOworCVNLX1U2NAkJCVN0YXRUeFN5bmNPY3RldHNDdHM7CisJU0tfVTY0CQkJU3RhdFJ4T2tDdHM7CisJU0tfVTY0CQkJU3RhdFJ4T2N0ZXRzT2tDdHM7CisJU0tfVTY0CQkJU3RhdFJ4QnJvYWRjYXN0T2tDdHM7CisJU0tfVTY0CQkJU3RhdFJ4TXVsdGljYXN0T2tDdHM7CisJU0tfVTY0CQkJU3RhdFJ4VW5pY2FzdE9rQ3RzOworCVNLX1U2NAkJCVN0YXRSeExvbmdGcmFtZXNDdHM7CisJU0tfVTY0CQkJU3RhdFJ4UGF1c2VNYWNDdHJsQ3RzOworCVNLX1U2NAkJCVN0YXRSeE1hY0N0cmxDdHM7CisJU0tfVTY0CQkJU3RhdFJ4UGF1c2VNYWNDdHJsRXJyb3JDdHM7CisJU0tfVTY0CQkJU3RhdFJ4TWFjQ3RybFVua25vd25DdHM7CisJU0tfVTY0CQkJU3RhdFJ4QnVyc3RDdHM7CisJU0tfVTY0CQkJU3RhdFJ4TWlzc2VkQ3RzOworCVNLX1U2NAkJCVN0YXRSeEZyYW1pbmdDdHM7CisJU0tfVTY0CQkJU3RhdFJ4Rmlmb092ZXJmbG93Q3RzOworCVNLX1U2NAkJCVN0YXRSeEphYmJlckN0czsKKwlTS19VNjQJCQlTdGF0UnhDYXJyaWVyQ3RzOworCVNLX1U2NAkJCVN0YXRSeElSTGVuZ3RoQ3RzOworCVNLX1U2NAkJCVN0YXRSeFN5bWJvbEN0czsKKwlTS19VNjQJCQlTdGF0UnhTaG9ydHNDdHM7CisJU0tfVTY0CQkJU3RhdFJ4UnVudEN0czsKKwlTS19VNjQJCQlTdGF0UnhDZXh0Q3RzOworCVNLX1U2NAkJCVN0YXRSeFRvb0xvbmdDdHM7CisJU0tfVTY0CQkJU3RhdFJ4RmNzQ3RzOworCVNLX1U2NAkJCUR1bW15MjsgLyogU3RhdFJ4VXRpbGl6YXRpb24gKi8KKwlTS19VNjQJCQlTdGF0Ung2NEN0czsKKwlTS19VNjQJCQlTdGF0UngxMjdDdHM7CisJU0tfVTY0CQkJU3RhdFJ4MjU1Q3RzOworCVNLX1U2NAkJCVN0YXRSeDUxMUN0czsKKwlTS19VNjQJCQlTdGF0UngxMDIzQ3RzOworCVNLX1U2NAkJCVN0YXRSeE1heEN0czsKK30gU0tfUE5NSV9TVEFUOworCit0eXBlZGVmIHN0cnVjdCBzX1BubWlDb25mIHsKKwljaGFyCQkJQ29uZk1hY0N1cnJlbnRBZGRyWzZdOworCWNoYXIJCQlDb25mTWFjRmFjdG9yeUFkZHJbNl07CisJU0tfVTgJCQlDb25mUE1EOworCVNLX1U4CQkJQ29uZkNvbm5lY3RvcjsKKwlTS19VMzIJCQlDb25mUGh5VHlwZTsKKwlTS19VMzIJCQlDb25mUGh5TW9kZTsKKwlTS19VOAkJCUNvbmZMaW5rQ2FwYWJpbGl0eTsKKwlTS19VOAkJCUNvbmZMaW5rTW9kZTsKKwlTS19VOAkJCUNvbmZMaW5rTW9kZVN0YXR1czsKKwlTS19VOAkJCUNvbmZMaW5rU3RhdHVzOworCVNLX1U4CQkJQ29uZkZsb3dDdHJsQ2FwYWJpbGl0eTsKKwlTS19VOAkJCUNvbmZGbG93Q3RybE1vZGU7CisJU0tfVTgJCQlDb25mRmxvd0N0cmxTdGF0dXM7CisJU0tfVTgJCQlDb25mUGh5T3BlcmF0aW9uQ2FwYWJpbGl0eTsKKwlTS19VOAkJCUNvbmZQaHlPcGVyYXRpb25Nb2RlOworCVNLX1U4CQkJQ29uZlBoeU9wZXJhdGlvblN0YXR1czsKKwlTS19VOAkJCUNvbmZTcGVlZENhcGFiaWxpdHk7CisJU0tfVTgJCQlDb25mU3BlZWRNb2RlOworCVNLX1U4CQkJQ29uZlNwZWVkU3RhdHVzOworfSBTS19QTk1JX0NPTkY7CisKK3R5cGVkZWYgc3RydWN0IHNfUG5taVJsbXQgeworCVNLX1UzMgkJCVJsbXRJbmRleDsKKwlTS19VMzIJCQlSbG10U3RhdHVzOworCVNLX1U2NAkJCVJsbXRUeEhlbGxvQ3RzOworCVNLX1U2NAkJCVJsbXRSeEhlbGxvQ3RzOworCVNLX1U2NAkJCVJsbXRUeFNwSGVsbG9SZXFDdHM7CisJU0tfVTY0CQkJUmxtdFJ4U3BIZWxsb0N0czsKK30gU0tfUE5NSV9STE1UOworCit0eXBlZGVmIHN0cnVjdCBzX1BubWlSbG10TW9uaXRvciB7CisJU0tfVTMyCQkJUmxtdE1vbml0b3JJbmRleDsKKwljaGFyCQkJUmxtdE1vbml0b3JBZGRyWzZdOworCVNLX1U2NAkJCVJsbXRNb25pdG9yRXJyb3JDdHM7CisJU0tfVTY0CQkJUmxtdE1vbml0b3JUaW1lc3RhbXA7CisJU0tfVTgJCQlSbG10TW9uaXRvckFkbWluOworfSBTS19QTk1JX1JMTVRfTU9OSVRPUjsKKwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pUmVxdWVzdFN0YXR1cyB7CisJU0tfVTMyCQkJRXJyb3JTdGF0dXM7CisJU0tfVTMyCQkJRXJyb3JPZmZzZXQ7Cit9IFNLX1BOTUlfUkVRVUVTVF9TVEFUVVM7CisKK3R5cGVkZWYgc3RydWN0IHNfUG5taVN0cnVjRGF0YSB7CisJU0tfVTMyCQkJTWdtdERCVmVyc2lvbjsKKwlTS19QTk1JX1JFUVVFU1RfU1RBVFVTCVJldHVyblN0YXR1czsKKwlTS19VMzIJCQlWcGRGcmVlQnl0ZXM7CisJY2hhcgkJCVZwZEVudHJpZXNMaXN0W1NLX1BOTUlfVlBEX0VOVFJJRVMgKiBTS19QTk1JX1ZQRF9LRVlfU0laRV07CisJU0tfVTMyCQkJVnBkRW50cmllc051bWJlcjsKKwlTS19QTk1JX1ZQRAkJVnBkW1NLX1BOTUlfVlBEX0VOVFJJRVNdOworCVNLX1UzMgkJCVBvcnROdW1iZXI7CisJU0tfVTMyCQkJRGV2aWNlVHlwZTsKKwljaGFyCQkJRHJpdmVyRGVzY3JbU0tfUE5NSV9TVFJJTkdMRU4xXTsKKwljaGFyCQkJRHJpdmVyVmVyc2lvbltTS19QTk1JX1NUUklOR0xFTjJdOworCWNoYXIJCQlEcml2ZXJSZWxlYXNlRGF0ZVtTS19QTk1JX1NUUklOR0xFTjFdOworCWNoYXIJCQlEcml2ZXJGaWxlTmFtZVtTS19QTk1JX1NUUklOR0xFTjFdOworCWNoYXIJCQlId0Rlc2NyW1NLX1BOTUlfU1RSSU5HTEVOMV07CisJY2hhcgkJCUh3VmVyc2lvbltTS19QTk1JX1NUUklOR0xFTjJdOworCVNLX1UxNgkJCUNoaXBzZXQ7CisJU0tfVTMyCQkJQ2hpcElkOworCVNLX1U4CQkJVmF1eEF2YWlsOworCVNLX1UzMgkJCVJhbVNpemU7CisJU0tfVTMyCQkJTXR1U2l6ZTsKKwlTS19VMzIJCQlBY3Rpb247CisJU0tfVTMyCQkJVGVzdFJlc3VsdDsKKwlTS19VOAkJCUJ1c1R5cGU7CisJU0tfVTgJCQlCdXNTcGVlZDsKKwlTS19VOAkJCUJ1c1dpZHRoOworCVNLX1U4CQkJU2Vuc29yTnVtYmVyOworCVNLX1BOTUlfU0VOU09SCVNlbnNvcltTS19QTk1JX1NFTlNPUl9FTlRSSUVTXTsKKwlTS19VOAkJCUNoZWNrc3VtTnVtYmVyOworCVNLX1BOTUlfQ0hFQ0tTVU0JQ2hlY2tzdW1bU0tfUE5NSV9DSEVDS1NVTV9FTlRSSUVTXTsKKwlTS19QTk1JX1NUQVQJU3RhdFtTS19QTk1JX01BQ19FTlRSSUVTXTsKKwlTS19QTk1JX0NPTkYJQ29uZltTS19QTk1JX01BQ19FTlRSSUVTXTsKKwlTS19VOAkJCVJsbXRNb2RlOworCVNLX1UzMgkJCVJsbXRQb3J0TnVtYmVyOworCVNLX1U4CQkJUmxtdFBvcnRBY3RpdmU7CisJU0tfVTgJCQlSbG10UG9ydFByZWZlcnJlZDsKKwlTS19VNjQJCQlSbG10Q2hhbmdlQ3RzOworCVNLX1U2NAkJCVJsbXRDaGFuZ2VUaW1lOworCVNLX1U2NAkJCVJsbXRDaGFuZ2VFc3RpbWF0ZTsKKwlTS19VNjQJCQlSbG10Q2hhbmdlVGhyZXNob2xkOworCVNLX1BOTUlfUkxNVAlSbG10W1NLX01BWF9NQUNTXTsKKwlTS19VMzIJCQlSbG10TW9uaXRvck51bWJlcjsKKwlTS19QTk1JX1JMTVRfTU9OSVRPUglSbG10TW9uaXRvcltTS19QTk1JX01PTklUT1JfRU5UUklFU107CisJU0tfVTMyCQkJVHJhcE51bWJlcjsKKwlTS19VOAkJCVRyYXBbU0tfUE5NSV9UUkFQX1FVRVVFX0xFTl07CisJU0tfVTY0CQkJVHhTd1F1ZXVlTGVuOworCVNLX1U2NAkJCVR4U3dRdWV1ZU1heDsKKwlTS19VNjQJCQlUeFJldHJ5Q3RzOworCVNLX1U2NAkJCVJ4SW50ckN0czsKKwlTS19VNjQJCQlUeEludHJDdHM7CisJU0tfVTY0CQkJUnhOb0J1ZkN0czsKKwlTS19VNjQJCQlUeE5vQnVmQ3RzOworCVNLX1U2NAkJCVR4VXNlZERlc2NyTm87CisJU0tfVTY0CQkJUnhEZWxpdmVyZWRDdHM7CisJU0tfVTY0CQkJUnhPY3RldHNEZWxpdmVyZWRDdHM7CisJU0tfVTY0CQkJUnhId0Vycm9yc0N0czsKKwlTS19VNjQJCQlUeEh3RXJyb3JzQ3RzOworCVNLX1U2NAkJCUluRXJyb3JzQ3RzOworCVNLX1U2NAkJCU91dEVycm9yc0N0czsKKwlTS19VNjQJCQlFcnJSZWNvdmVyeUN0czsKKwlTS19VNjQJCQlTeXNVcFRpbWU7Cit9IFNLX1BOTUlfU1RSVUNUX0RBVEE7CisKKyNkZWZpbmUgU0tfUE5NSV9TVFJVQ1RfU0laRQkoc2l6ZW9mKFNLX1BOTUlfU1RSVUNUX0RBVEEpKQorI2RlZmluZSBTS19QTk1JX01JTl9TVFJVQ1RfU0laRQkoKHVuc2lnbmVkIGludCkoU0tfVVBUUilcCisJCQkJICYoKChTS19QTk1JX1NUUlVDVF9EQVRBICopMCktPlZwZEZyZWVCeXRlcykpCisJCQkJCQkJCQkJCQkJCS8qCisJCQkJCQkJCQkJCQkJCSAqIFJldHVyblN0YXR1cyBmaWVsZAorCQkJCQkJCQkJCQkJCQkgKiBtdXN0IGJlIGxvY2F0ZWQKKwkJCQkJCQkJCQkJCQkJICogYmVmb3JlIFZwZEZyZWVCeXRlcworCQkJCQkJCQkJCQkJCQkgKi8KKworLyoKKyAqIFZhcmlvdXMgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBTS19QTk1JX01BWF9QUk9UT1MJCTMKKworI2RlZmluZSBTS19QTk1JX0NOVF9OTwkJCTY2CS8qIE11c3QgaGF2ZSB0aGUgdmFsdWUgb2YgdGhlIGVudW0KKwkJCQkJCQkJCSAqIFNLX1BOTUlfTUFYX0lEWC4gRGVmaW5lIFNLX1BOTUlfQ0hFQ0sKKwkJCQkJCQkJCSAqIGZvciBjaGVjayB3aGlsZSBpbml0IHBoYXNlIDEKKwkJCQkJCQkJCSAqLworCisvKgorICogRXN0aW1hdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pRXN0aW1hdGUgeworCXVuc2lnbmVkIGludAlFc3RWYWx1ZUluZGV4OworCVNLX1U2NAkJCUVzdFZhbHVlWzddOworCVNLX1U2NAkJCUVzdGltYXRlOworCVNLX1RJTUVSCQlFc3RUaW1lcjsKK30gU0tfUE5NSV9FU1RJTUFURTsKKworCisvKgorICogVkNUIHRpbWVyIGRhdGEgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IHNfVmN0VGltZXIgeworCVNLX1RJTUVSCQlWY3RUaW1lcjsKK30gU0tfUE5NSV9WQ1RfVElNRVI7CisKKworLyoKKyAqIFBOTUkgc3BlY2lmaWMgYWRhcHRlciBjb250ZXh0IHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCBzX1BubWlQb3J0IHsKKwlTS19VNjQJCQlTdGF0U3luY0N0czsKKwlTS19VNjQJCQlTdGF0U3luY09jdGV0c0N0czsKKwlTS19VNjQJCQlTdGF0UnhMb25nRnJhbWVDdHM7CisJU0tfVTY0CQkJU3RhdFJ4RnJhbWVUb29Mb25nQ3RzOworCVNLX1U2NAkJCVN0YXRSeFBNYWNjRXJyOworCVNLX1U2NAkJCVR4U3dRdWV1ZUxlbjsKKwlTS19VNjQJCQlUeFN3UXVldWVNYXg7CisJU0tfVTY0CQkJVHhSZXRyeUN0czsKKwlTS19VNjQJCQlSeEludHJDdHM7CisJU0tfVTY0CQkJVHhJbnRyQ3RzOworCVNLX1U2NAkJCVJ4Tm9CdWZDdHM7CisJU0tfVTY0CQkJVHhOb0J1ZkN0czsKKwlTS19VNjQJCQlUeFVzZWREZXNjck5vOworCVNLX1U2NAkJCVJ4RGVsaXZlcmVkQ3RzOworCVNLX1U2NAkJCVJ4T2N0ZXRzRGVsaXZlcmVkQ3RzOworCVNLX1U2NAkJCVJ4SHdFcnJvcnNDdHM7CisJU0tfVTY0CQkJVHhId0Vycm9yc0N0czsKKwlTS19VNjQJCQlJbkVycm9yc0N0czsKKwlTS19VNjQJCQlPdXRFcnJvcnNDdHM7CisJU0tfVTY0CQkJRXJyUmVjb3ZlcnlDdHM7CisJU0tfVTY0CQkJUnhTaG9ydFplcm9NYXJrOworCVNLX1U2NAkJCUNvdW50ZXJPZmZzZXRbU0tfUE5NSV9DTlRfTk9dOworCVNLX1UzMgkJCUNvdW50ZXJIaWdoW1NLX1BOTUlfQ05UX05PXTsKKwlTS19CT09MCQkJQWN0aXZlRmxhZzsKKwlTS19VOAkJCUFsaWduWzNdOworfSBTS19QTk1JX1BPUlQ7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pRGF0YSB7CisJU0tfUE5NSV9QT1JUCVBvcnQJW1NLX01BWF9NQUNTXTsKKwlTS19QTk1JX1BPUlQJQnVmUG9ydAlbU0tfTUFYX01BQ1NdOyAvKiAyMDAyLTA5LTEzIHB3ZWJlciAgKi8KKwlTS19VNjQJCQlWaXJ0dWFsQ291bnRlck9mZnNldFtTS19QTk1JX0NOVF9OT107CisJU0tfVTMyCQkJVGVzdFJlc3VsdDsKKwljaGFyCQkJSHdWZXJzaW9uWzEwXTsKKwlTS19VMTYJCQlBbGlnbjAxOworCisJY2hhcgkJCSpwRHJpdmVyRGVzY3JpcHRpb247CisJY2hhcgkJCSpwRHJpdmVyVmVyc2lvbjsKKwljaGFyCQkJKnBEcml2ZXJSZWxlYXNlRGF0ZTsKKwljaGFyCQkJKnBEcml2ZXJGaWxlTmFtZTsKKworCWludAkJCQlNYWNVcGRhdGVkRmxhZzsKKwlpbnQJCQkJUmxtdFVwZGF0ZWRGbGFnOworCWludAkJCQlTaXJxVXBkYXRlZEZsYWc7CisKKwlTS19VNjQJCQlSbG10Q2hhbmdlQ3RzOworCVNLX1U2NAkJCVJsbXRDaGFuZ2VUaW1lOworCVNLX1BOTUlfRVNUSU1BVEUJUmxtdENoYW5nZUVzdGltYXRlOworCVNLX1U2NAkJCVJsbXRDaGFuZ2VUaHJlc2hvbGQ7CisKKwlTS19VNjQJCQlTdGFydFVwVGltZTsKKwlTS19VMzIJCQlEZXZpY2VUeXBlOworCWNoYXIJCQlQY2lCdXNTcGVlZDsKKwljaGFyCQkJUGNpQnVzV2lkdGg7CisJY2hhcgkJCUNoaXBzZXQ7CisJY2hhcgkJCVBNRDsKKwljaGFyCQkJQ29ubmVjdG9yOworCVNLX0JPT0wJCQlEdWFsTmV0QWN0aXZlRmxhZzsKKwlTS19VMTYJCQlBbGlnbjAyOworCisJY2hhcgkJCVRyYXBCdWZbU0tfUE5NSV9UUkFQX1FVRVVFX0xFTl07CisJdW5zaWduZWQgaW50CVRyYXBCdWZGcmVlOworCXVuc2lnbmVkIGludAlUcmFwUXVldWVCZWc7CisJdW5zaWduZWQgaW50CVRyYXBRdWV1ZUVuZDsKKwl1bnNpZ25lZCBpbnQJVHJhcEJ1ZlBhZDsKKwl1bnNpZ25lZCBpbnQJVHJhcFVuaXF1ZTsKKwlTS19VOAkJVmN0U3RhdHVzW1NLX01BWF9NQUNTXTsKKwlTS19QTk1JX1ZDVAlWY3RCYWNrdXBbU0tfTUFYX01BQ1NdOworCVNLX1BOTUlfVkNUX1RJTUVSIFZjdFRpbWVvdXRbU0tfTUFYX01BQ1NdOworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorCVNLX1UzMgkJCURpYWdBdHRhY2hlZDsKKyNlbmRpZiAvKiBTS19ESUFHX1NVUFBPUlQgKi8KK30gU0tfUE5NSTsKKworCisvKgorICogRnVuY3Rpb24gcHJvdG90eXBlcworICovCitleHRlcm4gaW50IFNrUG5taUluaXQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IExldmVsKTsKK2V4dGVybiBpbnQgU2tQbm1pR2V0VmFyKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBJZCwgdm9pZCogcEJ1ZiwKKwl1bnNpZ25lZCBpbnQqIHBMZW4sIFNLX1UzMiBJbnN0YW5jZSwgU0tfVTMyIE5ldEluZGV4KTsKK2V4dGVybiBpbnQgU2tQbm1pUHJlU2V0VmFyKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBJZCwKKwl2b2lkKiBwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwgU0tfVTMyIE5ldEluZGV4KTsKK2V4dGVybiBpbnQgU2tQbm1pU2V0VmFyKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBJZCwgdm9pZCogcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwgU0tfVTMyIE5ldEluZGV4KTsKK2V4dGVybiBpbnQgU2tQbm1pR2V0U3RydWN0KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHZvaWQqIHBCdWYsCisJdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgTmV0SW5kZXgpOworZXh0ZXJuIGludCBTa1BubWlQcmVTZXRTdHJ1Y3QoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdm9pZCogcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBOZXRJbmRleCk7CitleHRlcm4gaW50IFNrUG5taVNldFN0cnVjdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB2b2lkKiBwQnVmLAorCXVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIE5ldEluZGV4KTsKK2V4dGVybiBpbnQgU2tQbm1pRXZlbnQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgU0tfVTMyIEV2ZW50LAorCVNLX0VWUEFSQSBQYXJhbSk7CitleHRlcm4gaW50IFNrUG5taUdlbklvY3RsKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHZvaWQgKiBwQnVmLAorCXVuc2lnbmVkIGludCAqIHBMZW4sIFNLX1UzMiBOZXRJbmRleCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2VzaXJxLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZXNpcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDg2YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2VzaXJxLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlc2lycS5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBDb21tb24gTW9kdWxlcworICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjMwICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA3LzA0IDEyOjM0OjEzICQKKyAqIFB1cnBvc2U6CVNLIHNwZWNpZmljIEdpZ2FiaXQgRXRoZXJuZXQgc3BlY2lhbCBJUlEgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0lOQ19TS0dFU0lSUV9IXworI2RlZmluZSBfSU5DX1NLR0VTSVJRX0hfCisKKy8qIERlZmluZSByZXR1cm4gY29kZXMgb2YgU2tHZVBvcnRDaGVja1VwIGFuZCBDaGVja1Nob3J0ICovCisjZGVmaW5lCVNLX0hXX1BTX05PTkUJCTAJLyogTm8gYWN0aW9uIG5lZWRlZCAqLworI2RlZmluZQlTS19IV19QU19SRVNUQVJUCTEJLyogUmVzdGFydCBuZWVkZWQgKi8KKyNkZWZpbmUJU0tfSFdfUFNfTElOSwkJMgkvKiBMaW5rIFVwIGFjdGlvbnMgbmVlZGVkICovCisKKy8qCisgKiBEZWZpbmUgdGhlIEV2ZW50IHRoZSBzcGVjaWFsIElSUS9JTkkgbW9kdWxlIGNhbiBoYW5kbGUKKyAqLworI2RlZmluZSBTS19IV0VWX1dBVElNCQkJMQkvKiBUaW1lb3V0IGZvciBXQSBFcnJhdGEgIzIgWE1BQyAqLworI2RlZmluZSBTS19IV0VWX1BPUlRfU1RBUlQJCTIJLyogUG9ydCBTdGFydCBFdmVudCBieSBSTE1UICovCisjZGVmaW5lIFNLX0hXRVZfUE9SVF9TVE9QCQkzCS8qIFBvcnQgU3RvcCBFdmVudCBieSBSTE1UICovCisjZGVmaW5lIFNLX0hXRVZfQ0xFQVJfU1RBVAkJNAkvKiBDbGVhciBTdGF0aXN0aWNzIGJ5IFBOTUkgKi8KKyNkZWZpbmUgU0tfSFdFVl9VUERBVEVfU1RBVAkJNQkvKiBVcGRhdGUgU3RhdGlzdGljcyBieSBQTk1JICovCisjZGVmaW5lIFNLX0hXRVZfU0VUX0xNT0RFCQk2CS8qIFNldCBMaW5rIE1vZGUgYnkgUE5NSSAqLworI2RlZmluZSBTS19IV0VWX1NFVF9GTE9XTU9ERQk3CS8qIFNldCBGbG93IENvbnRyb2wgTW9kZSBieSBQTk1JICovCisjZGVmaW5lIFNLX0hXRVZfU0VUX1JPTEUJCTgJLyogU2V0IE1hc3Rlci9TbGF2ZSAoUm9sZSkgYnkgUE5NSSAqLworI2RlZmluZSBTS19IV0VWX1NFVF9TUEVFRAkJOQkvKiBTZXQgTGluayBTcGVlZCBieSBQTk1JICovCisjZGVmaW5lIFNLX0hXRVZfSEFMRkRVUF9DSEsJCTEwCS8qIEhhbGYgRHVwbGV4IEhhbmd1cCBXb3JrYXJvdW5kICovCisKKyNkZWZpbmUgU0tfV0FfQUNUX1RJTUUJCSg1MDAwMDAwVUwpCS8qIDUgc2VjICovCisjZGVmaW5lIFNLX1dBX0lOQV9USU1FCQkoMTAwMDAwVUwpCS8qIDEwMCBtc2VjICovCisKKyNkZWZpbmUgU0tfSEFMRkRVUF9DSEtfVElNRQkoMTAwMDBVTCkJLyogMTAgbXNlYyAqLworCisvKgorICogRGVmaW5lIHRoZSBlcnJvciBudW1iZXJzIGFuZCBtZXNzYWdlcworICovCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwMQkJKFNLX0VSUkJBU0VfU0lSUSswKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDFNU0cJIlVua25vd24gZXZlbnQiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwMgkJKFNLRVJSX1NJUlFfRTAwMSsxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDJNU0cJIlBhY2tldCB0aW1lb3V0IFJYMSIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDAzCQkoU0tFUlJfU0lSUV9FMDAyKzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwM01TRwkiUGFja2V0IHRpbWVvdXQgUlgyIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDQJCShTS0VSUl9TSVJRX0UwMDMrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA0TVNHCSJNQUMgMSBub3QgY29ycmVjdGx5IGluaXRpYWxpemVkIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDUJCShTS0VSUl9TSVJRX0UwMDQrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA1TVNHCSJNQUMgMiBub3QgY29ycmVjdGx5IGluaXRpYWxpemVkIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDYJCShTS0VSUl9TSVJRX0UwMDUrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA2TVNHCSJDSEVDSyBmYWlsdXJlIFIxIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDcJCShTS0VSUl9TSVJRX0UwMDYrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA3TVNHCSJDSEVDSyBmYWlsdXJlIFIyIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDgJCShTS0VSUl9TSVJRX0UwMDcrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA4TVNHCSJDSEVDSyBmYWlsdXJlIFhTMSIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA5CQkoU0tFUlJfU0lSUV9FMDA4KzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwOU1TRwkiQ0hFQ0sgZmFpbHVyZSBYQTEiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxMAkJKFNLRVJSX1NJUlFfRTAwOSsxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTBNU0cJIkNIRUNLIGZhaWx1cmUgWFMyIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTEJCShTS0VSUl9TSVJRX0UwMTArMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDExTVNHCSJDSEVDSyBmYWlsdXJlIFhBMiIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDEyCQkoU0tFUlJfU0lSUV9FMDExKzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxMk1TRwkidW5leHBlY3RlZCBJUlEgTWFzdGVyIGVycm9yIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTMJCShTS0VSUl9TSVJRX0UwMTIrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDEzTVNHCSJ1bmV4cGVjdGVkIElSUSBTdGF0dXMgZXJyb3IiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxNAkJKFNLRVJSX1NJUlFfRTAxMysxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTRNU0cJIlBhcml0eSBlcnJvciBvbiBSQU0gKHJlYWQpIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTUJCShTS0VSUl9TSVJRX0UwMTQrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDE1TVNHCSJQYXJpdHkgZXJyb3Igb24gUkFNICh3cml0ZSkiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxNgkJKFNLRVJSX1NJUlFfRTAxNSsxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTZNU0cJIlBhcml0eSBlcnJvciBNQUMgMSIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDE3CQkoU0tFUlJfU0lSUV9FMDE2KzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxN01TRwkiUGFyaXR5IGVycm9yIE1BQyAyIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTgJCShTS0VSUl9TSVJRX0UwMTcrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDE4TVNHCSJQYXJpdHkgZXJyb3IgUlggMSIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDE5CQkoU0tFUlJfU0lSUV9FMDE4KzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxOU1TRwkiUGFyaXR5IGVycm9yIFJYIDIiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAyMAkJKFNLRVJSX1NJUlFfRTAxOSsxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMjBNU0cJIk1BQyB0cmFuc21pdCBGSUZPIHVuZGVycnVuIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMjEJCShTS0VSUl9TSVJRX0UwMjArMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDIxTVNHCSJTcHVyaW91cyBUV1NJIGludGVycnVwdCIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDIyCQkoU0tFUlJfU0lSUV9FMDIxKzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAyMk1TRwkiQ2FibGUgcGFpciBzd2FwIGVycm9yIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMjMJCShTS0VSUl9TSVJRX0UwMjIrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDIzTVNHCSJBdXRvLW5lZ290aWF0aW9uIGVycm9yIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMjQJCShTS0VSUl9TSVJRX0UwMjMrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDI0TVNHCSJGSUZPIG92ZXJmbG93IGVycm9yIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMjUJCShTS0VSUl9TSVJRX0UwMjQrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDI1TVNHCSIyIFBhaXIgRG93bnNoaWZ0IGRldGVjdGVkIgorCitleHRlcm4gdm9pZCBTa0dlU2lycUlzcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19VMzIgSXN0YXR1cyk7CitleHRlcm4gaW50ICBTa0dlU2lycUV2ZW50KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBFdmVudCwgU0tfRVZQQVJBIFBhcmEpOworZXh0ZXJuIHZvaWQgU2tIV0xpbmtVcChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgUG9ydCk7CitleHRlcm4gdm9pZCBTa0hXTGlua0Rvd24oU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IFBvcnQpOworCisjZW5kaWYJLyogX0lOQ19TS0dFU0lSUV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NraTJjLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tpMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OThiYjQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NraTJjLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2kyYy5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBUV1NJLU1vZHVsZQorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjM1ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzEwLzIwIDA5OjA2OjMwICQKKyAqIFB1cnBvc2U6CURlZmluZXMgdG8gYWNjZXNzIFZvbHRhZ2UgYW5kIFRlbXBlcmF0dXJlIFNlbnNvcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU0tJMkMuSAljb250YWlucyBhbGwgSTJDIHNwZWNpZmljIGRlZmluZXMKKyAqLworCisjaWZuZGVmIF9TS0kyQ19IXworI2RlZmluZSBfU0tJMkNfSF8KKwordHlwZWRlZiBzdHJ1Y3QgIHNfU2Vuc29yIFNLX1NFTlNPUjsKKworI2luY2x1ZGUgImgvc2tnZWkyYy5oIgorCisvKgorICogRGVmaW5lIHRoZSBJMkMgZXZlbnRzLgorICovCisjZGVmaW5lIFNLX0kyQ0VWX0lSUQkxCS8qIElSUSBoYXBwZW5lZCBFdmVudCAqLworI2RlZmluZSBTS19JMkNFVl9USU0JMgkvKiBUaW1lb3V0IGV2ZW50ICovCisjZGVmaW5lIFNLX0kyQ0VWX0NMRUFSCTMJLyogQ2xlYXIgTUlCIFZhbHVlcyAqLworCisvKgorICogRGVmaW5lIFJFQUQgYW5kIFdSSVRFIENvbnN0YW50cy4KKyAqLworI2RlZmluZSBJMkNfUkVBRAkwCisjZGVmaW5lIEkyQ19XUklURQkxCisjZGVmaW5lIEkyQ19CVVJTVAkxCisjZGVmaW5lIEkyQ19TSU5HTEUJMAorCisjZGVmaW5lIFNLRVJSX0kyQ19FMDAxCQkoU0tfRVJSQkFTRV9JMkMrMCkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDFNU0cJIlNlbnNvciBpbmRleCB1bmtub3duIgorI2RlZmluZSBTS0VSUl9JMkNfRTAwMgkJKFNLRVJSX0kyQ19FMDAxKzEpCisjZGVmaW5lIFNLRVJSX0kyQ19FMDAyTVNHCSJUV1NJOiB0cmFuc2ZlciBkb2VzIG5vdCBjb21wbGV0ZSIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDMJCShTS0VSUl9JMkNfRTAwMisxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAwM01TRwkiTE04MDogTkFLIG9uIGRldmljZSBzZW5kIgorI2RlZmluZSBTS0VSUl9JMkNfRTAwNAkJKFNLRVJSX0kyQ19FMDAzKzEpCisjZGVmaW5lIFNLRVJSX0kyQ19FMDA0TVNHCSJMTTgwOiBOQUsgb24gcmVnaXN0ZXIgc2VuZCIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDUJCShTS0VSUl9JMkNfRTAwNCsxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAwNU1TRwkiTE04MDogTkFLIG9uIGRldmljZSAoMikgc2VuZCIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDYJCShTS0VSUl9JMkNfRTAwNSsxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAwNk1TRwkiVW5rbm93biBldmVudCIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDcJCShTS0VSUl9JMkNfRTAwNisxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAwN01TRwkiTE04MCByZWFkIG91dCBvZiBzdGF0ZSIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDgJCShTS0VSUl9JMkNfRTAwNysxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAwOE1TRwkiVW5leHBlY3RlZCBzZW5zb3IgcmVhZCBjb21wbGV0ZWQiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDA5CQkoU0tFUlJfSTJDX0UwMDgrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDlNU0cJIldBUk5JTkc6IHRlbXBlcmF0dXJlIHNlbnNvciBvdXQgb2YgcmFuZ2UiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDEwCQkoU0tFUlJfSTJDX0UwMDkrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTBNU0cJIldBUk5JTkc6IHZvbHRhZ2Ugc2Vuc29yIG91dCBvZiByYW5nZSIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTEJCShTS0VSUl9JMkNfRTAxMCsxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAxMU1TRwkiRVJST1I6IHRlbXBlcmF0dXJlIHNlbnNvciBvdXQgb2YgcmFuZ2UiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDEyCQkoU0tFUlJfSTJDX0UwMTErMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTJNU0cJIkVSUk9SOiB2b2x0YWdlIHNlbnNvciBvdXQgb2YgcmFuZ2UiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDEzCQkoU0tFUlJfSTJDX0UwMTIrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTNNU0cJIkVSUk9SOiBjb3VsZG4ndCBpbml0IHNlbnNvciIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTQJCShTS0VSUl9JMkNfRTAxMysxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAxNE1TRwkiV0FSTklORzogZmFuIHNlbnNvciBvdXQgb2YgcmFuZ2UiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDE1CQkoU0tFUlJfSTJDX0UwMTQrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTVNU0cJIkVSUk9SOiBmYW4gc2Vuc29yIG91dCBvZiByYW5nZSIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTYJCShTS0VSUl9JMkNfRTAxNSsxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAxNk1TRwkiVFdTSTogYWN0aXZlIHRyYW5zZmVyIGRvZXMgbm90IGNvbXBsZXRlIgorCisvKgorICogRGVmaW5lIFRpbWVvdXQgdmFsdWVzCisgKi8KKyNkZWZpbmUgU0tfSTJDX1RJTV9MT05HCQkyMDAwMDAwTAkvKiAyIHNlY29uZHMgKi8KKyNkZWZpbmUgU0tfSTJDX1RJTV9TSE9SVAkgMTAwMDAwTAkvKiAxMDAgbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIFNLX0kyQ19USU1fV0FUQ0gJMTAwMDAwMEwJLyogMSBzZWNvbmQgKi8KKworLyoKKyAqIERlZmluZSB0cmFwIGFuZCBlcnJvciBsb2cgaG9sZCB0aW1lcworICovCisjaWZuZGVmCVNLX1NFTl9FUlJfVFJfSE9MRAorI2RlZmluZSBTS19TRU5fRVJSX1RSX0hPTEQJCSg0KlNLX1RJQ0tTX1BFUl9TRUMpCisjZW5kaWYKKyNpZm5kZWYJU0tfU0VOX0VSUl9MT0dfSE9MRAorI2RlZmluZSBTS19TRU5fRVJSX0xPR19IT0xECQkoNjAqU0tfVElDS1NfUEVSX1NFQykKKyNlbmRpZgorI2lmbmRlZglTS19TRU5fV0FSTl9UUl9IT0xECisjZGVmaW5lIFNLX1NFTl9XQVJOX1RSX0hPTEQJCSgxNSpTS19USUNLU19QRVJfU0VDKQorI2VuZGlmCisjaWZuZGVmCVNLX1NFTl9XQVJOX0xPR19IT0xECisjZGVmaW5lIFNLX1NFTl9XQVJOX0xPR19IT0xECSgxNSo2MCpTS19USUNLU19QRVJfU0VDKQorI2VuZGlmCisKKy8qCisgKiBEZWZpbmVzIGZvciBTZW5UeXBlCisgKi8KKyNkZWZpbmUgU0tfU0VOX1VOS05PV04JMAorI2RlZmluZSBTS19TRU5fVEVNUAkJMQorI2RlZmluZSBTS19TRU5fVk9MVAkJMgorI2RlZmluZSBTS19TRU5fRkFOCQkzCisKKy8qCisgKiBEZWZpbmUgZm9yIHRoZSBTZW5FcnJvckZsYWcKKyAqLworI2RlZmluZSBTS19TRU5fRVJSX05PVF9QUkVTRU5UCTAJLyogRXJyb3IgRmxhZzogU2Vuc29yIG5vdCBwcmVzZW50ICovCisjZGVmaW5lIFNLX1NFTl9FUlJfT0sJCQkxCS8qIEVycm9yIEZsYWc6IE8uSy4gKi8KKyNkZWZpbmUgU0tfU0VOX0VSUl9XQVJOCQkJMgkvKiBFcnJvciBGbGFnOiBXYXJuaW5nICovCisjZGVmaW5lIFNLX1NFTl9FUlJfRVJSCQkJMwkvKiBFcnJvciBGbGFnOiBFcnJvciAqLworI2RlZmluZSBTS19TRU5fRVJSX0ZBVUxUWQkJNAkvKiBFcnJvciBGbGFnOiBGYXVsdHkgKi8KKworLyoKKyAqIERlZmluZSB0aGUgU2Vuc29yIHN0cnVjdAorICovCitzdHJ1Y3QJc19TZW5zb3IgeworCWNoYXIJKlNlbkRlc2M7CQkJLyogRGVzY3JpcHRpb24gKi8KKwlpbnQJCVNlblR5cGU7CQkJLyogVm9sdGFnZSBvciBUZW1wZXJhdHVyZSAqLworCVNLX0kzMglTZW5WYWx1ZTsJCQkvKiBDdXJyZW50IHZhbHVlIG9mIHRoZSBzZW5zb3IgKi8KKwlTS19JMzIJU2VuVGhyZUVyckhpZ2g7CQkvKiBIaWdoIGVycm9yIFRocmVzaGhvbGQgb2YgdGhpcyBzZW5zb3IgKi8KKwlTS19JMzIJU2VuVGhyZVdhcm5IaWdoOwkvKiBIaWdoIHdhcm5pbmcgVGhyZXNoaG9sZCBvZiB0aGlzIHNlbnNvciAqLworCVNLX0kzMglTZW5UaHJlRXJyTG93OwkJLyogTG93ZXIgZXJyb3IgVGhyZXNob2xkIG9mIHRoZSBzZW5zb3IgKi8KKwlTS19JMzIJU2VuVGhyZVdhcm5Mb3c7CQkvKiBMb3dlciB3YXJuaW5nIFRocmVzaG9sZCBvZiB0aGUgc2Vuc29yICovCisJaW50CQlTZW5FcnJGbGFnOwkJCS8qIFNlbnNvciBpbmRpY2F0ZWQgYW4gZXJyb3IgKi8KKwlTS19CT09MCVNlbkluaXQ7CQkJLyogSXMgc2Vuc29yIGluaXRpYWxpemVkID8gKi8KKwlTS19VNjQJU2VuRXJyQ3RzOwkJCS8qIEVycm9yIHRyYXAgY291bnRlciAqLworCVNLX1U2NAlTZW5XYXJuQ3RzOwkJCS8qIFdhcm5pbmcgdHJhcCBjb3VudGVyICovCisJU0tfVTY0CVNlbkJlZ0VyclRTOwkJLyogQmVnaW4gZXJyb3IgdGltZXN0YW1wICovCisJU0tfVTY0CVNlbkJlZ1dhcm5UUzsJCS8qIEJlZ2luIHdhcm5pbmcgdGltZXN0YW1wICovCisJU0tfVTY0CVNlbkxhc3RFcnJUcmFwVFM7CS8qIExhc3QgZXJyb3IgdHJhcCB0aW1lc3RhbXAgKi8KKwlTS19VNjQJU2VuTGFzdEVyckxvZ1RTOwkvKiBMYXN0IGVycm9yIGxvZyB0aW1lc3RhbXAgKi8KKwlTS19VNjQJU2VuTGFzdFdhcm5UcmFwVFM7CS8qIExhc3Qgd2FybmluZyB0cmFwIHRpbWVzdGFtcCAqLworCVNLX1U2NAlTZW5MYXN0V2FybkxvZ1RTOwkvKiBMYXN0IHdhcm5pbmcgbG9nIHRpbWVzdGFtcCAqLworCWludAkJU2VuU3RhdGU7CQkJLyogU2Vuc29yIFN0YXRlIChzZWUgSFcgc3BlY2lmaWMgaW5jbHVkZSkgKi8KKwlpbnQJCSgqU2VuUmVhZCkoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgc3RydWN0IHNfU2Vuc29yICpwU2VuKTsKKwkJCQkJCQkJLyogU2Vuc29ycyByZWFkIGZ1bmN0aW9uICovCisJU0tfVTE2CVNlblJlZzsJCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBmb3IgdGhpcyBzZW5zb3IgKi8KKwlTS19VOAlTZW5EZXY7CQkJCS8qIERldmljZSBTZWxlY3Rpb24gZm9yIHRoaXMgc2Vuc29yICovCit9OworCit0eXBlZGVmCXN0cnVjdAlzX0kyYyB7CisJU0tfU0VOU09SCVNlblRhYmxlW1NLX01BWF9TRU5TT1JTXTsJLyogU2Vuc29yIFRhYmxlICovCisJaW50CQkJQ3VyclNlbnM7CS8qIFdoaWNoIHNlbnNvciBpcyBjdXJyZW50bHkgcXVlcmllZCAqLworCWludAkJCU1heFNlbnM7CS8qIE1heC4gbnVtYmVyIG9mIHNlbnNvcnMgKi8KKwlpbnQJCQlUaW1lck1vZGU7CS8qIFVzZSB0aGUgdGltZXIgYWxzbyB0byB3YXRjaCB0aGUgc3RhdGUgbWFjaGluZSAqLworCWludAkJCUluaXRMZXZlbDsJLyogSW5pdGlhbGl6ZWQgTGV2ZWwgKi8KKyNpZm5kZWYgU0tfRElBRworCWludAkJCUR1bW15UmVhZHM7CS8qIE51bWJlciBvZiBub24tY2hlY2tlZCBkdW1teSByZWFkcyAqLworCVNLX1RJTUVSCVNlblRpbWVyOwkvKiBTZW5zb3JzIHRpbWVyICovCisjZW5kaWYgLyogIVNLX0RJQUcgKi8KK30gU0tfSTJDOworCitleHRlcm4gaW50IFNrSTJjSW5pdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgTGV2ZWwpOworZXh0ZXJuIGludCBTa0kyY1dyaXRlKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBEYXRhLCBpbnQgRGV2LCBpbnQgU2l6ZSwKKwkJCQkJICAgaW50IFJlZywgaW50IEJ1cnN0KTsKK2V4dGVybiBpbnQgU2tJMmNSZWFkU2Vuc29yKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1NFTlNPUiAqcFNlbik7CisjaWZkZWYgU0tfRElBRworZXh0ZXJuCVNLX1UzMiBTa0kyY1JlYWQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IERldiwgaW50IFNpemUsIGludCBSZWcsCisJCQkJCQkgaW50IEJ1cnN0KTsKKyNlbHNlIC8qICFTS19ESUFHICovCitleHRlcm4gaW50IFNrSTJjRXZlbnQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgU0tfVTMyIEV2ZW50LCBTS19FVlBBUkEgUGFyYSk7CitleHRlcm4gdm9pZCBTa0kyY1dhaXRJcnEoU0tfQUMgKnBBQywgU0tfSU9DIElvQyk7CitleHRlcm4gdm9pZCBTa0kyY0lzcihTS19BQyAqcEFDLCBTS19JT0MgSW9DKTsKKyNlbmRpZiAvKiAhU0tfRElBRyAqLworI2VuZGlmIC8qIG5fU0tJMkNfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2txdWV1ZS5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWM0MGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrcXVldWUuaApAQCAtMCwwICsxLDk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2txdWV1ZS5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBFdmVudCBTY2hlZHVsZXIgTW9kdWxlCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTYgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDkvMTYgMTI6NTA6MzIgJAorICogUHVycG9zZToJRGVmaW5lcyBmb3IgdGhlIEV2ZW50IHF1ZXVlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNLUVVFVUUuSAljb250YWlucyBhbGwgZGVmaW5lcyBhbmQgdHlwZXMgZm9yIHRoZSBldmVudCBxdWV1ZQorICovCisKKyNpZm5kZWYgX1NLUVVFVUVfSF8KKyNkZWZpbmUgX1NLUVVFVUVfSF8KKworCisvKgorICogZGVmaW5lIHRoZSBldmVudCBjbGFzc2VzIHRvIGJlIHNlcnZlZAorICovCisjZGVmaW5lCVNLR0VfRFJWCTEJLyogRHJpdmVyIEV2ZW50IENsYXNzICovCisjZGVmaW5lCVNLR0VfUkxNVAkyCS8qIFJMTVQgRXZlbnQgQ2xhc3MgKi8KKyNkZWZpbmUJU0tHRV9JMkMJMwkvKiBJMkMgRXZlbnQgQ2xhc3MgKi8KKyNkZWZpbmUJU0tHRV9QTk1JCTQJLyogUE5NSSBFdmVudCBDbGFzcyAqLworI2RlZmluZQlTS0dFX0NTVU0JNQkvKiBDaGVja3N1bSBFdmVudCBDbGFzcyAqLworI2RlZmluZQlTS0dFX0hXQUMJNgkvKiBIYXJkd2FyZSBBY2Nlc3MgRXZlbnQgQ2xhc3MgKi8KKworI2RlZmluZQlTS0dFX1NXVAk5CS8qIFNvZnR3YXJlIFRpbWVyIEV2ZW50IENsYXNzICovCisjZGVmaW5lCVNLR0VfTEFDUAkxMAkvKiBMQUNQIEFnZ3JlZ2F0aW9uIEV2ZW50IENsYXNzICovCisjZGVmaW5lCVNLR0VfUlNGCTExCS8qIFJTRiBBZ2dyZWdhdGlvbiBFdmVudCBDbGFzcyAqLworI2RlZmluZQlTS0dFX01BUktFUgkxMgkvKiBNQVJLRVIgQWdncmVnYXRpb24gRXZlbnQgQ2xhc3MgKi8KKyNkZWZpbmUJU0tHRV9GRAkJMTMJLyogRkQgRGlzdHJpYnV0b3IgRXZlbnQgQ2xhc3MgKi8KKworLyoKKyAqIGRlZmluZSBldmVudCBxdWV1ZSBhcyBjaXJjdWxhciBidWZmZXIKKyAqLworI2RlZmluZSBTS19NQVhfRVZFTlQJNjQKKworLyoKKyAqIFBhcmFtZXRlciB1bmlvbiBmb3IgdGhlIFBhcmEgc3R1ZmYKKyAqLwordHlwZWRlZgl1bmlvbiB1X0V2UGFyYSB7CisJdm9pZAkqcFBhcmFQdHI7CS8qIFBhcmFtZXRlciBQb2ludGVyICovCisJU0tfVTY0CVBhcmE2NDsJCS8qIFBhcmFtZXRlciA2NGJpdCB2ZXJzaW9uICovCisJU0tfVTMyCVBhcmEzMlsyXTsJLyogUGFyYW1ldGVyIEFycmF5IG9mIDMyYml0IHBhcmFtZXRlcnMgKi8KK30gU0tfRVZQQVJBOworCisvKgorICogRXZlbnQgUXVldWUKKyAqCXNrcXVldWUuYworICogZXZlbnRzIGFyZSBjbGFzcy92YWx1ZSBwYWlycworICoJY2xhc3MJaXMgYWRkcmVzc2VlLCBlLmcuIFJMTVQsIFBOTUkgZXRjLgorICoJdmFsdWUJaXMgY29tbWFuZCwgZS5nLiBsaW5lIHN0YXRlIGNoYW5nZSwgcmluZyBvcCBjaGFuZ2UgZXRjLgorICovCit0eXBlZGVmCXN0cnVjdCBzX0V2ZW50RWxlbSB7CisJU0tfVTMyCQlDbGFzczsJCQkvKiBFdmVudCBjbGFzcyAqLworCVNLX1UzMgkJRXZlbnQ7CQkJLyogRXZlbnQgdmFsdWUgKi8KKwlTS19FVlBBUkEJUGFyYTsJCQkvKiBFdmVudCBwYXJhbWV0ZXIgKi8KK30gU0tfRVZFTlRFTEVNOworCit0eXBlZGVmCXN0cnVjdCBzX1F1ZXVlIHsKKwlTS19FVkVOVEVMRU0JRXZRdWV1ZVtTS19NQVhfRVZFTlRdOworCVNLX0VWRU5URUxFTQkqRXZQdXQ7CisJU0tfRVZFTlRFTEVNCSpFdkdldDsKK30gU0tfUVVFVUU7CisKK2V4dGVybgl2b2lkIFNrRXZlbnRJbml0KFNLX0FDICpwQUMsIFNLX0lPQyBJb2MsIGludCBMZXZlbCk7CitleHRlcm4Jdm9pZCBTa0V2ZW50UXVldWUoU0tfQUMgKnBBQywgU0tfVTMyIENsYXNzLCBTS19VMzIgRXZlbnQsCisJU0tfRVZQQVJBIFBhcmEpOworZXh0ZXJuCWludCBTa0V2ZW50RGlzcGF0Y2hlcihTS19BQyAqcEFDLCBTS19JT0MgSW9jKTsKKworCisvKiBEZWZpbmUgRXJyb3IgTnVtYmVycyBhbmQgbWVzc2FnZXMgKi8KKyNkZWZpbmUJU0tFUlJfUV9FMDAxCShTS19FUlJCQVNFX1FVRVVFKzApCisjZGVmaW5lCVNLRVJSX1FfRTAwMU1TRwkiRXZlbnQgcXVldWUgb3ZlcmZsb3ciCisjZGVmaW5lCVNLRVJSX1FfRTAwMgkoU0tFUlJfUV9FMDAxKzEpCisjZGVmaW5lCVNLRVJSX1FfRTAwMk1TRwkiVW5kZWZpbmVkIGV2ZW50IGNsYXNzIgorI2VuZGlmCS8qIF9TS1FVRVVFX0hfICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3JsbXQuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3JsbXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTc1ZGZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrcmxtdC5oCkBAIC0wLDAgKzEsNDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tybG10LmgKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4zNyAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wNC8xNSAwOTo0Mzo0MyAkCisgKiBQdXJwb3NlOglIZWFkZXIgZmlsZSBmb3IgUmVkdW5kYW50IExpbmsgTWFuYWdlbWVuVC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVGhpcyBpcyB0aGUgaGVhZGVyIGZpbGUgZm9yIFJlZHVuZGFudCBMaW5rIE1hbmFnZW1lblQuCisgKgorICogSW5jbHVkZSBGaWxlIEhpZXJhcmNoeToKKyAqCisgKgkic2tkcnYxc3QuaCIKKyAqCS4uLgorICoJInNrdHlwZXMuaCIKKyAqCSJza3F1ZXVlLmgiCisgKgkic2thZGRyLmgiCisgKgkic2tybG10LmgiCisgKgkuLi4KKyAqCSJza2RydjJuZC5oIgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNfU0tSTE1UX0gKKyNkZWZpbmUgX19JTkNfU0tSTE1UX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgkvKiBjcGx1c3BsdXMgKi8KKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZQlTS19STE1UX05FVF9ET1dOX1RFTVAJMQkvKiBORVRfRE9XTiBkdWUgdG8gbGFzdCBwb3J0IGRvd24uICovCisjZGVmaW5lCVNLX1JMTVRfTkVUX0RPV05fRklOQUwJMgkvKiBORVRfRE9XTiBkdWUgdG8gUkxNVF9TVE9QLiAqLworCisvKiAtLS0tLSBEZWZhdWx0IHF1ZXVlIHNpemVzIC0gbXVzdCBiZSBtdWx0aXBsZXMgb2YgOCBLQiAtLS0tLSAqLworCisvKiBMZXNzIHRoYW4gOCBLQiBmcmVlIGluIFJYIHF1ZXVlID0+IHBhdXNlIGZyYW1lcy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9TVEFOREJZX1FSWFNJWkUJMTI4CS8qIFNpemUgb2Ygcnggc3RhbmRieSBxdWV1ZSBpbiBLQi4gKi8KKyNkZWZpbmUgU0tfUkxNVF9TVEFOREJZX1FYQVNJWkUJMzIJLyogU2l6ZSBvZiBhc3luYyBzdGFuZGJ5IHF1ZXVlIGluIEtCLiAqLworI2RlZmluZSBTS19STE1UX1NUQU5EQllfUVhTU0laRQkwCS8qIFNpemUgb2Ygc3luYyBzdGFuZGJ5IHF1ZXVlIGluIEtCLiAqLworCisjZGVmaW5lIFNLX1JMTVRfTUFYX1RYX0JVRl9TSVpFCTYwCS8qIE1heGltdW0gUkxNVCB0cmFuc21pdCBzaXplLiAqLworCisvKiAtLS0tLSBQT1JUIHN0YXRlcyAtLS0tLSAqLworCisjZGVmaW5lIFNLX1JMTVRfUFNfSU5JVAkJCTAJLyogUG9ydCBzdGF0ZTogSW5pdC4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QU19MSU5LX0RPV04JMQkvKiBQb3J0IHN0YXRlOiBMaW5rIGRvd24uICovCisjZGVmaW5lIFNLX1JMTVRfUFNfRE9XTgkJCTIJLyogUG9ydCBzdGF0ZTogUG9ydCBkb3duLiAqLworI2RlZmluZSBTS19STE1UX1BTX0dPSU5HX1VQCQkzCS8qIFBvcnQgc3RhdGU6IEdvaW5nIHVwLiAqLworI2RlZmluZSBTS19STE1UX1BTX1VQCQkJNAkvKiBQb3J0IHN0YXRlOiBVcC4gKi8KKworLyogLS0tLS0gUkxNVCBzdGF0ZXMgLS0tLS0gKi8KKworI2RlZmluZSBTS19STE1UX1JTX0lOSVQJCQkwCS8qIFJMTVQgc3RhdGU6IEluaXQuICovCisjZGVmaW5lIFNLX1JMTVRfUlNfTkVUX0RPV04JCTEJLyogUkxNVCBzdGF0ZTogTmV0IGRvd24uICovCisjZGVmaW5lIFNLX1JMTVRfUlNfTkVUX1VQCQkyCS8qIFJMTVQgc3RhdGU6IE5ldCB1cC4gKi8KKworLyogLS0tLS0gUE9SVCBldmVudHMgLS0tLS0gKi8KKworI2RlZmluZSBTS19STE1UX0xJTktfVVAJCQkxMDAxCS8qIExpbmsgY2FtZSB1cC4gKi8KKyNkZWZpbmUgU0tfUkxNVF9MSU5LX0RPV04JCTEwMDIJLyogTGluayB3ZW50IGRvd24uICovCisjZGVmaW5lIFNLX1JMTVRfUE9SVF9BRERSCQkxMDAzCS8qIFBvcnQgYWRkcmVzcyBjaGFuZ2VkLiAqLworCisvKiAtLS0tLSBSTE1UIGV2ZW50cyAtLS0tLSAqLworCisjZGVmaW5lIFNLX1JMTVRfU1RBUlQJCQkyMDAxCS8qIFN0YXJ0IFJMTVQuICovCisjZGVmaW5lIFNLX1JMTVRfU1RPUAkJCTIwMDIJLyogU3RvcCBSTE1ULiAqLworI2RlZmluZSBTS19STE1UX1BBQ0tFVF9SRUNFSVZFRAkyMDAzCS8qIFBhY2tldCB3YXMgcmVjZWl2ZWQgZm9yIFJMTVQuICovCisjZGVmaW5lIFNLX1JMTVRfU1RBVFNfQ0xFQVIJCTIwMDQJLyogQ2xlYXIgc3RhdGlzdGljcy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9TVEFUU19VUERBVEUJMjAwNQkvKiBVcGRhdGUgc3RhdGlzdGljcy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QUkVGUE9SVF9DSEFOR0UJMjAwNgkvKiBDaGFuZ2UgcHJlZmVycmVkIHBvcnQuICovCisjZGVmaW5lIFNLX1JMTVRfTU9ERV9DSEFOR0UJCTIwMDcJLyogTmV3IFJsbXRNb2RlLiAqLworI2RlZmluZSBTS19STE1UX1NFVF9ORVRTCQkyMDA4CS8qIE51bWJlciBvZiBOZXRzICgxIG9yIDIpLiAqLworCisvKiAtLS0tLSBSTE1UIG1vZGUgYml0cyAtLS0tLSAqLworCisvKgorICogQ0FVVElPTjoJVGhlc2UgZGVmaW5lcyBhcmUgcHJpdmF0ZSB0byBSTE1ULgorICoJCQlQbGVhc2UgdXNlIHRoZSBSTE1UIG1vZGUgZGVmaW5lcyBiZWxvdy4KKyAqLworCisjZGVmaW5lIFNLX1JMTVRfQ0hFQ0tfTElOSwkJICAxCQkvKiBDaGVjayBMaW5rLiAqLworI2RlZmluZSBTS19STE1UX0NIRUNLX0xPQ19MSU5LCSAgMgkJLyogQ2hlY2sgb3RoZXIgbGluayBvbiBzYW1lIGFkYXB0ZXIuICovCisjZGVmaW5lIFNLX1JMTVRfQ0hFQ0tfU0VHCQkgIDQJCS8qIENoZWNrIHNlZ21lbnRhdGlvbi4gKi8KKworI2lmbmRlZiBSTE1UX0NIRUNLX1JFTU9URQorI2RlZmluZSBTS19STE1UX0NIRUNLX09USEVSUwlTS19STE1UX0NIRUNLX0xPQ19MSU5LCisjZWxzZQkvKiBSTE1UX0NIRUNLX1JFTU9URSAqLworI2RlZmluZSBTS19STE1UX0NIRUNLX1JFTV9MSU5LCSAgOAkJLyogQ2hlY2sgbGluayhzKSBvbiBvdGhlciBhZGFwdGVyKHMpLiAqLworI2RlZmluZSBTS19STE1UX01BWF9SRU1PVEVfUE9SVFNfQ0hFQ0tFRAkzCisjZGVmaW5lIFNLX1JMTVRfQ0hFQ0tfT1RIRVJTCVwKKwkJKFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTksgfCBTS19STE1UX0NIRUNLX1JFTV9MSU5LKQorI2VuZGlmCS8qIFJMTVRfQ0hFQ0tfUkVNT1RFICovCisKKyNpZm5kZWYgU0tfUkxNVF9FTkFCTEVfVFJBTlNQQVJFTlQKKyNkZWZpbmUgU0tfUkxNVF9UUkFOU1BBUkVOVAkJICAwCQkvKiBSTE1UIHRyYW5zcGFyZW50IC0gaW5hY3RpdmUuICovCisjZWxzZQkvKiBTS19STE1UX0VOQUJMRV9UUkFOU1BBUkVOVCAqLworI2RlZmluZSBTS19STE1UX1RSQU5TUEFSRU5UCQkxMjgJCS8qIFJMTVQgdHJhbnNwYXJlbnQuICovCisjZW5kaWYJLyogU0tfUkxNVF9FTkFCTEVfVFJBTlNQQVJFTlQgKi8KKworLyogLS0tLS0gUkxNVCBtb2RlcyAtLS0tLSAqLworCisvKiBDaGVjayBMaW5rIFN0YXRlLiAqLworI2RlZmluZSBTS19STE1UX01PREVfQ0xTCShTS19STE1UX0NIRUNLX0xJTkspCisKKy8qIENoZWNrIExvY2FsIFBvcnRzOiBjaGVjayBvdGhlciBsaW5rcyBvbiB0aGUgc2FtZSBhZGFwdGVyLiAqLworI2RlZmluZSBTS19STE1UX01PREVfQ0xQCShTS19STE1UX0NIRUNLX0xJTksgfCBTS19STE1UX0NIRUNLX0xPQ19MSU5LKQorCisvKiBDaGVjayBMb2NhbCBQb3J0cyBhbmQgU2VnbWVudGF0aW9uIFN0YXR1cy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9NT0RFX0NMUFNTCVwKKwkJKFNLX1JMTVRfQ0hFQ0tfTElOSyB8IFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTksgfCBTS19STE1UX0NIRUNLX1NFRykKKworI2lmZGVmIFJMTVRfQ0hFQ0tfUkVNT1RFCisvKiBDaGVjayBMb2NhbCBhbmQgUmVtb3RlIFBvcnRzOiBjaGVjayBsaW5rcyAobG9jYWwgb3IgcmVtb3RlKS4gKi8KKwlOYW1lIG9mIGRlZmluZSBUQkQhCisjZGVmaW5lIFNLX1JMTVRfTU9ERV9DUlAJXAorCQkoU0tfUkxNVF9DSEVDS19MSU5LIHwgU0tfUkxNVF9DSEVDS19MT0NfTElOSyB8IFNLX1JMTVRfQ0hFQ0tfUkVNX0xJTkspCisKKy8qIENoZWNrIExvY2FsIGFuZCBSZW1vdGUgUG9ydHMgYW5kIFNlZ21lbnRhdGlvbiBTdGF0dXMuICovCisJTmFtZSBvZiBkZWZpbmUgVEJEIQorI2RlZmluZSBTS19STE1UX01PREVfQ1JQU1MJXAorCQkoU0tfUkxNVF9DSEVDS19MSU5LIHwgU0tfUkxNVF9DSEVDS19MT0NfTElOSyB8IFwKKwkJU0tfUkxNVF9DSEVDS19SRU1fTElOSyB8IFNLX1JMTVRfQ0hFQ0tfU0VHKQorI2VuZGlmCS8qIFJMTVRfQ0hFQ0tfUkVNT1RFICovCisKKy8qIC0tLS0tIFJMTVQgbG9va2FoZWFkIHJlc3VsdCBiaXRzIC0tLS0tICovCisKKyNkZWZpbmUgU0tfUkxNVF9SWF9STE1UCQkJMQkvKiBHaXZlIHBhY2tldCB0byBSTE1ULiAqLworI2RlZmluZSBTS19STE1UX1JYX1BST1RPQ09MCQkyCS8qIEdpdmUgcGFja2V0IHRvIHByb3RvY29sLiAqLworCisvKiBNYWNyb3MgKi8KKworI2lmIDAKK1NLX0FDCQkqcEFDCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX1UzMgkJUG9ydE51bQkJLyogcmVjZWl2aW5nIHBvcnQgKi8KK3Vuc2lnbmVkCVBrdExlbgkJLyogcmVjZWl2ZWQgcGFja2V0J3MgbGVuZ3RoICovCitTS19CT09MCQlJc0JjCQkvKiBGbGFnOiBwYWNrZXQgaXMgYnJvYWRjYXN0ICovCit1bnNpZ25lZAkqcE9mZnNldAkvKiBvZmZzLiBvZiBieXRlcyB0byBwcmVzZW50IHRvIFNLX1JMTVRfTE9PS0FIRUFEICovCit1bnNpZ25lZAkqcE51bUJ5dGVzCS8qICNCeXRlcyB0byBwcmVzZW50IHRvIFNLX1JMTVRfTE9PS0FIRUFEICovCisjZW5kaWYJLyogMCAqLworCisjZGVmaW5lIFNLX1JMTVRfUFJFX0xPT0tBSEVBRChwQUMsUG9ydE51bSxQa3RMZW4sSXNCYyxwT2Zmc2V0LHBOdW1CeXRlcykgeyBcCisJU0tfQUMJKl9wQUM7IFwKKwlTS19VMzIJX1BvcnROdW07IFwKKwlfcEFDID0gKHBBQyk7IFwKKwlfUG9ydE51bSA9IChTS19VMzIpKFBvcnROdW0pOyBcCisJLyogX3BBQy0+UmxtdC5Qb3J0W19Qb3J0TnVtXS5QYWNrZXRzUngrKzsgKi8gXAorCV9wQUMtPlJsbXQuUG9ydFtfUG9ydE51bV0uUGFja2V0c1BlclRpbWVTbG90Kys7IFwKKyAgICBpZiAoX3BBQy0+UmxtdC5SbG10T2ZmKSB7IFwKKwkJKihwTnVtQnl0ZXMpID0gMDsgXAorICAgIH0gXAorICAgIGVsc2Uge1wKKyAgICAgICAgaWYgKChfcEFDLT5SbG10LlBvcnRbX1BvcnROdW1dLk5ldC0+UmxtdE1vZGUgJiBTS19STE1UX1RSQU5TUEFSRU5UKSAhPSAwKSB7IFwKKyAgICAJCSoocE51bUJ5dGVzKSA9IDA7IFwKKyAgICAJfSBcCisgICAgCWVsc2UgaWYgKElzQmMpIHsgXAorICAgIAkJaWYgKF9wQUMtPlJsbXQuUG9ydFtfUG9ydE51bV0uTmV0LT5SbG10TW9kZSAhPSBTS19STE1UX01PREVfQ0xTKSB7IFwKKyAgICAJCQkqKHBOdW1CeXRlcykgPSA2OyBcCisgICAgCQkJKihwT2Zmc2V0KSA9IDY7IFwKKyAgICAJCX0gXAorICAgIAkJZWxzZSB7IFwKKyAgICAJCQkqKHBOdW1CeXRlcykgPSAwOyBcCisgICAgCQl9IFwKKyAgICAJfSBcCisgICAgCWVsc2UgeyBcCisgICAgCQlpZiAoKFBrdExlbikgPiBTS19STE1UX01BWF9UWF9CVUZfU0laRSkgeyBcCisgICAgCQkJLyogX3BBQy0+UmxtdC5Qb3J0W19Qb3J0TnVtXS5EYXRhUGFja2V0c1BlclRpbWVTbG90Kys7ICovIFwKKyAgICAJCQkqKHBOdW1CeXRlcykgPSAwOyBcCisgICAgCQl9IFwKKyAgICAJCWVsc2UgeyBcCisgICAgCQkJKihwTnVtQnl0ZXMpID0gNjsgXAorICAgIAkJCSoocE9mZnNldCkgPSAwOyBcCisgICAgCQl9IFwKKyAgICAJfSBcCisgICAgfSBcCit9CisKKyNpZiAwCitTS19BQwkJKnBBQwkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19VMzIJCVBvcnROdW0JCS8qIHJlY2VpdmluZyBwb3J0ICovCitTS19VOAkJKnBMYVBhY2tldCwJLyogcmVjZWl2ZWQgcGFja2V0J3MgZGF0YSAocG9pbnRzIHRvIHBPZmZzZXQpICovCitTS19CT09MCQlJc0JjCQkvKiBGbGFnOiBwYWNrZXQgaXMgYnJvYWRjYXN0ICovCitTS19CT09MCQlJc01jCQkvKiBGbGFnOiBwYWNrZXQgaXMgbXVsdGljYXN0ICovCit1bnNpZ25lZAkqcEZvclJsbXQJLyogUmVzdWx0OiBiaXRzIFNLX1JMTVRfUlhfUkxNVCwgU0tfUkxNVF9SWF9QUk9UT0NPTCAqLworU0tfUkxNVF9MT09LQUhFQUQoKSBleHBlY3RzICpwTnVtQnl0ZXMgZnJvbQorcGFja2V0IG9mZnNldCAqcE9mZnNldCAocy5hLikgYXQgKnBMYVBhY2tldC4KKworSWYgeW91IHVzZSBTS19STE1UX0xPT0tBSEVBRCBpbiBhIHBhdGggd2hlcmUgeW91IGFscmVhZHkga25vdyBpZiB0aGUgcGFja2V0IGlzCitCQywgTUMsIG9yIFVDLCB5b3Ugc2hvdWxkIHVzZSBjb25zdGFudHMgZm9yIElzQmMgYW5kIElzTWMsIHNvIHRoYXQgeW91ciBjb21waWxlcgorY2FuIHRyYXNoIHVubmVlZGVkIHBhcnRzIG9mIHRoZSBpZiBjb25zdHJ1Y3Rpb24uCisjZW5kaWYJLyogMCAqLworCisjZGVmaW5lIFNLX1JMTVRfTE9PS0FIRUFEKHBBQyxQb3J0TnVtLHBMYVBhY2tldCxJc0JjLElzTWMscEZvclJsbXQpIHsgXAorCVNLX0FDCSpfcEFDOyBcCisJU0tfVTMyCV9Qb3J0TnVtOyBcCisJU0tfVTgJKl9wTGFQYWNrZXQ7IFwKKwlfcEFDID0gKHBBQyk7IFwKKwlfUG9ydE51bSA9IChTS19VMzIpKFBvcnROdW0pOyBcCisJX3BMYVBhY2tldCA9IChTS19VOCAqKShwTGFQYWNrZXQpOyBcCisJaWYgKElzQmMpIHtcCisJCWlmICghU0tfQUREUl9FUVVBTChfcExhUGFja2V0LCBfcEFDLT5BZGRyLk5ldFtfcEFDLT5SbG10LlBvcnRbIFwKKwkJCV9Qb3J0TnVtXS5OZXQtPk5ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYSkpIHsgXAorCQkJX3BBQy0+UmxtdC5Qb3J0W19Qb3J0TnVtXS5CY1RpbWVTdGFtcCA9IFNrT3NHZXRUaW1lKF9wQUMpOyBcCisJCQlfcEFDLT5SbG10LkNoZWNrU3dpdGNoID0gU0tfVFJVRTsgXAorCQl9IFwKKwkJLyogX3BBQy0+UmxtdC5Qb3J0W19Qb3J0TnVtXS5EYXRhUGFja2V0c1BlclRpbWVTbG90Kys7ICovIFwKKwkJKihwRm9yUmxtdCkgPSBTS19STE1UX1JYX1BST1RPQ09MOyBcCisJfSBcCisJZWxzZSBpZiAoSXNNYykgeyBcCisJCWlmIChTS19BRERSX0VRVUFMKF9wTGFQYWNrZXQsIEJyaWRnZU1jQWRkci5hKSkgeyBcCisJCQlfcEFDLT5SbG10LlBvcnRbX1BvcnROdW1dLkJwZHVQYWNrZXRzUGVyVGltZVNsb3QrKzsgXAorCQkJaWYgKF9wQUMtPlJsbXQuUG9ydFtfUG9ydE51bV0uTmV0LT5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfU0VHKSB7IFwKKwkJCQkqKHBGb3JSbG10KSA9IFNLX1JMTVRfUlhfUkxNVCB8IFNLX1JMTVRfUlhfUFJPVE9DT0w7IFwKKwkJCX0gXAorCQkJZWxzZSB7IFwKKwkJCQkqKHBGb3JSbG10KSA9IFNLX1JMTVRfUlhfUFJPVE9DT0w7IFwKKwkJCX0gXAorCQl9IFwKKwkJZWxzZSBpZiAoU0tfQUREUl9FUVVBTChfcExhUGFja2V0LCBTa1JsbXRNY0FkZHIuYSkpIHsgXAorCQkJKihwRm9yUmxtdCkgPSBTS19STE1UX1JYX1JMTVQ7IFwKKwkJfSBcCisJCWVsc2UgeyBcCisJCQkvKiBfcEFDLT5SbG10LlBvcnRbX1BvcnROdW1dLkRhdGFQYWNrZXRzUGVyVGltZVNsb3QrKzsgKi8gXAorCQkJKihwRm9yUmxtdCkgPSBTS19STE1UX1JYX1BST1RPQ09MOyBcCisJCX0gXAorCX0gXAorCWVsc2UgeyBcCisJCWlmIChTS19BRERSX0VRVUFMKCBcCisJCQlfcExhUGFja2V0LCBcCisJCQlfcEFDLT5BZGRyLlBvcnRbX1BvcnROdW1dLkN1cnJlbnRNYWNBZGRyZXNzLmEpKSB7IFwKKwkJCSoocEZvclJsbXQpID0gU0tfUkxNVF9SWF9STE1UOyBcCisJCX0gXAorCQllbHNlIHsgXAorCQkJLyogX3BBQy0+UmxtdC5Qb3J0W19Qb3J0TnVtXS5EYXRhUGFja2V0c1BlclRpbWVTbG90Kys7ICovIFwKKwkJCSoocEZvclJsbXQpID0gU0tfUkxNVF9SWF9QUk9UT0NPTDsgXAorCQl9IFwKKwl9IFwKK30KKworI2lmZGVmIFNLX1JMTVRfRkFTVF9MT09LQUhFQUQKK0Vycm9yOiBTS19STE1UX0ZBU1RfTE9PS0FIRUFEIG5vIGxvbmdlciB1c2VkLiBVc2UgbmV3IG1hY3JvcyBmb3IgbG9va2FoZWFkLgorI2VuZGlmCS8qIFNLX1JMTVRfRkFTVF9MT09LQUhFQUQgKi8KKyNpZmRlZiBTS19STE1UX1NMT1dfTE9PS0FIRUFECitFcnJvcjogU0tfUkxNVF9TTE9XX0xPT0tBSEVBRCBubyBsb25nZXIgdXNlZC4gVXNlIG5ldyBtYWNyb3MgZm9yIGxvb2thaGVhZC4KKyNlbmRpZgkvKiBTS19STE1UX1NMT1dfTE9PS0FIRUFEICovCisKKy8qIHR5cGVkZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBTS19STE1UX01CVUZfUFJJVkFURQordHlwZWRlZiBzdHJ1Y3Qgc19SbG10TWJ1ZiB7CisJc29tZSBjb250ZW50Cit9IFNLX1JMTVRfTUJVRjsKKyNlbmRpZgkvKiBTS19STE1UX01CVUZfUFJJVkFURSAqLworCisKKyNpZmRlZiBTS19MQV9JTkZPCit0eXBlZGVmIHN0cnVjdCBzX1JsbXRfUGFja2V0SW5mbyB7CisJdW5zaWduZWQJUGFja2V0TGVuZ3RoOwkJCS8qIExlbmd0aCBvZiBwYWNrZXQuICovCisJdW5zaWduZWQJUGFja2V0VHlwZTsJCQkJLyogRGlyZWN0ZWQvTXVsdGljYXN0L0Jyb2FkY2FzdC4gKi8KK30gU0tfUkxNVF9QSU5GTzsKKyNlbmRpZgkvKiBTS19MQV9JTkZPICovCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19Sb290SWQgeworCVNLX1U4CQlJZFs4XTsJCQkJCS8qIFJvb3QgQnJpZGdlIElkLiAqLworfSBTS19STE1UX1JPT1RfSUQ7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19wb3J0IHsKKwlTS19NQUNfQUREUglDaGVja0FkZHI7CisJU0tfQk9PTAkJU3VzcGVjdFR4OworfSBTS19QT1JUX0NIRUNLOworCisKK3R5cGVkZWYgc3RydWN0IHNfUmxtdE5ldCBTS19STE1UX05FVDsKKworCit0eXBlZGVmIHN0cnVjdCBzX1JsbXRQb3J0IHsKKworLyogLS0tLS0gUHVibGljIHBhcnQgKHJlYWQtb25seSkgLS0tLS0gKi8KKworCVNLX1U4CQkJUG9ydFN0YXRlOwkJCQkvKiBDdXJyZW50IHN0YXRlIG9mIHRoaXMgcG9ydC4gKi8KKworCS8qIEZvciBQTk1JICovCisJU0tfQk9PTAkJCUxpbmtEb3duOworCVNLX0JPT0wJCQlQb3J0RG93bjsKKwlTS19VOAkJCUFsaWduMDE7CisKKwlTS19VMzIJCQlQb3J0TnVtYmVyOwkJCQkvKiBOdW1iZXIgb2YgcG9ydCBvbiBhZGFwdGVyLiAqLworCVNLX1JMTVRfTkVUICoJTmV0OwkJCQkJLyogTmV0IHBvcnQgYmVsb25ncyB0by4gKi8KKworCVNLX1U2NAkJCVR4SGVsbG9DdHM7CisJU0tfVTY0CQkJUnhIZWxsb0N0czsKKwlTS19VNjQJCQlUeFNwSGVsbG9SZXFDdHM7CisJU0tfVTY0CQkJUnhTcEhlbGxvQ3RzOworCisvKiAtLS0tLSBQcml2YXRlIHBhcnQgLS0tLS0gKi8KKworLyoJU0tfVTY0CQkJUGFja2V0c1J4OyAqLwkJCQkvKiBUb3RhbCBwYWNrZXRzIHJlY2VpdmVkLiAqLworCVNLX1UzMgkJCVBhY2tldHNQZXJUaW1lU2xvdDsJCS8qIFBhY2tldHMgcnhlZCBiZXR3ZWVuIFRPcy4gKi8KKy8qCVNLX1UzMgkJCURhdGFQYWNrZXRzUGVyVGltZVNsb3Q7ICovCS8qIERhdGEgcGFja2V0cyAuLi4gKi8KKwlTS19VMzIJCQlCcGR1UGFja2V0c1BlclRpbWVTbG90OwkvKiBCUERVIHBhY2tldHMgcnhlZCBpbiBUUy4gKi8KKwlTS19VNjQJCQlCY1RpbWVTdGFtcDsJCQkvKiBUaW1lIG9mIGxhc3QgQkMgcmVjZWl2ZS4gKi8KKwlTS19VNjQJCQlHdVRpbWVTdGFtcDsJCQkvKiBUaW1lIG9mIGVudGVyaW5nIEdPSU5HX1VQLiAqLworCisJU0tfVElNRVIJCVVwVGltZXI7CQkJCS8qIFRpbWVyIHN0cnVjdCBMaW5rL1BvcnQgdXAuICovCisJU0tfVElNRVIJCURvd25SeFRpbWVyOwkJCS8qIFRpbWVyIHN0cnVjdCBkb3duIHJ4LiAqLworCVNLX1RJTUVSCQlEb3duVHhUaW1lcjsJCQkvKiBUaW1lciBzdHJ1Y3QgZG93biB0eC4gKi8KKworCVNLX1UzMgkJCUNoZWNraW5nU3RhdGU7CQkJLyogQ2hlY2tpbmcgU3RhdGUuICovCisKKwlTS19BRERSX1BPUlQgKglBZGRyUG9ydDsKKworCVNLX1U4CQkJUmFuZG9tWzRdOwkJCQkvKiBSYW5kb20gdmFsdWUuICovCisJdW5zaWduZWQJCVBvcnRzQ2hlY2tlZDsJCQkvKiAjcG9ydHMgY2hlY2tlZC4gKi8KKwl1bnNpZ25lZAkJUG9ydHNTdXNwZWN0OwkJCS8qICNwb3J0cyBjaGVja2VkIHRoYXQgYXJlIHMuICovCisJU0tfUE9SVF9DSEVDSwlQb3J0Q2hlY2tbMV07CisvKglTS19QT1JUX0NIRUNLCVBvcnRDaGVja1tTS19NQVhfTUFDUyAtIDFdOyAqLworCisJU0tfQk9PTAkJCVBvcnRTdGFydGVkOwkJCS8qIFBvcnQgaXMgc3RhcnRlZC4gKi8KKwlTS19CT09MCQkJUG9ydE5vUng7CQkJCS8qIE5vUnggZm9yID49IDEgdGltZSBzbG90LiAqLworCVNLX0JPT0wJCQlSb290SWRTZXQ7CisJU0tfUkxNVF9ST09UX0lECVJvb3Q7CQkJCQkvKiBSb290IEJyaWRnZSBJZC4gKi8KK30gU0tfUkxNVF9QT1JUOworCisKK3N0cnVjdCBzX1JsbXROZXQgeworCisvKiAtLS0tLSBQdWJsaWMgcGFydCAocmVhZC1vbmx5KSAtLS0tLSAqLworCisJU0tfVTMyCQkJTmV0TnVtYmVyOwkJCS8qIE51bWJlciBvZiBuZXQuICovCisKKwlTS19STE1UX1BPUlQgKglQb3J0W1NLX01BWF9NQUNTXTsJLyogUG9ydHMgdGhhdCBiZWxvbmcgdG8gdGhpcyBuZXQuICovCisJU0tfVTMyCQkJTnVtUG9ydHM7CQkJLyogTnVtYmVyIG9mIHBvcnRzLiAqLworCVNLX1UzMgkJCVByZWZQb3J0OwkJCS8qIFByZWZlcnJlZCBwb3J0LiAqLworCisJLyogRm9yIFBOTUkgKi8KKworCVNLX1UzMgkJCUNoZ0JjUHJpbzsJCQkvKiBDaGFuZ2UgUHJpb3JpdHkgb2YgbGFzdCBicm9hZGNhc3QgcmVjZWl2ZWQgKi8KKwlTS19VMzIJCQlSbG10TW9kZTsJCQkvKiBDaGVjayAuLi4gKi8KKwlTS19VMzIJCQlBY3RpdmVQb3J0OwkJCS8qIEFjdGl2ZSBwb3J0LiAqLworCVNLX1UzMgkJCVByZWZlcmVuY2U7CQkvKiAweEZGRkZGRkZGOiBBdXRvbWF0aWMuICovCisKKwlTS19VOAkJCVJsbXRTdGF0ZTsJCQkvKiBDdXJyZW50IFJMTVQgc3RhdGUuICovCisKKy8qIC0tLS0tIFByaXZhdGUgcGFydCAtLS0tLSAqLworCVNLX0JPT0wJCQlSb290SWRTZXQ7CisJU0tfVTE2CQkJQWxpZ24wMTsKKworCWludAkJCQlMaW5rc1VwOwkJCS8qICNMaW5rcyB1cC4gKi8KKwlpbnQJCQkJUG9ydHNVcDsJCQkvKiAjUG9ydHMgdXAuICovCisJU0tfVTMyCQkJVGltZW91dFZhbHVlOwkJLyogUkxNVCB0aW1lb3V0IHZhbHVlLiAqLworCisJU0tfVTMyCQkJQ2hlY2tpbmdTdGF0ZTsJCS8qIENoZWNraW5nIFN0YXRlLiAqLworCVNLX1JMTVRfUk9PVF9JRAlSb290OwkJCQkvKiBSb290IEJyaWRnZSBJZC4gKi8KKworCVNLX1RJTUVSCQlMb2NUaW1lcjsJCQkvKiBUaW1lciBzdHJ1Y3QuICovCisJU0tfVElNRVIJCVNlZ1RpbWVyOwkJCS8qIFRpbWVyIHN0cnVjdC4gKi8KK307CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19SbG10IHsKKworLyogLS0tLS0gUHVibGljIHBhcnQgKHJlYWQtb25seSkgLS0tLS0gKi8KKworCVNLX1UzMgkJCU51bU5ldHM7CQkJLyogTnVtYmVyIG9mIG5ldHMuICovCisJU0tfVTMyCQkJTmV0c1N0YXJ0ZWQ7CQkvKiBOdW1iZXIgb2YgbmV0cyBzdGFydGVkLiAqLworCVNLX1JMTVRfTkVUCQlOZXRbU0tfTUFYX05FVFNdOwkvKiBBcnJheSBvZiBhdmFpbGFibGUgbmV0cy4gKi8KKwlTS19STE1UX1BPUlQJUG9ydFtTS19NQVhfTUFDU107CS8qIEFycmF5IG9mIGF2YWlsYWJsZSBwb3J0cy4gKi8KKworLyogLS0tLS0gUHJpdmF0ZSBwYXJ0IC0tLS0tICovCisJU0tfQk9PTAkJCUNoZWNrU3dpdGNoOworCVNLX0JPT0wJCQlSbG10T2ZmOyAgICAgICAgICAgIC8qIHNldCB0byB6ZXJvIGlmIHRoZSBNYWMgYWRkcmVzc2VzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBlcXVhbCBvciB0aGUgc2Vjb25kIG9uZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB6ZXJvICovCisJU0tfVTE2CQkJQWxpZ24wMTsKKworfSBTS19STE1UOworCisKK2V4dGVybglTS19NQUNfQUREUglCcmlkZ2VNY0FkZHI7CitleHRlcm4JU0tfTUFDX0FERFIJU2tSbG10TWNBZGRyOworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgU0tfS1JfUFJPVE8KKworLyogRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IFNrUmxtdCAqLworCisvKiBBTlNJL0MrKyBjb21wbGlhbnQgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworCitleHRlcm4Jdm9pZAlTa1JsbXRJbml0KAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCUxldmVsKTsKKworZXh0ZXJuCWludAlTa1JsbXRFdmVudCgKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwlTS19VMzIJCUV2ZW50LAorCVNLX0VWUEFSQQlQYXJhKTsKKworI2Vsc2UJLyogZGVmaW5lZChTS19LUl9QUk9UTykgKi8KKworLyogTm9uLUFOU0kvQysrIGNvbXBsaWFudCBmdW5jdGlvbiBwcm90b3R5cGVzICovCisKKyNlcnJvciBLUi1zdHlsZSBmdW5jdGlvbiBwcm90b3R5cGVzIGFyZSBub3QgeWV0IHByb3ZpZGVkLgorCisjZW5kaWYJLyogZGVmaW5lZChTS19LUl9QUk9UTykpICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYJLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCS8qIF9fSU5DX1NLUkxNVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2t0aW1lci5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGU2ZDdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdGltZXIuaApAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2t0aW1lci5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBFdmVudCBTY2hlZHVsZXIgTW9kdWxlCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTEgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDkvMTYgMTI6NTg6MTggJAorICogUHVycG9zZToJRGVmaW5lcyBmb3IgdGhlIHRpbWVyIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTS1RJTUVSLkgJY29udGFpbnMgYWxsIGRlZmluZXMgYW5kIHR5cGVzIGZvciB0aGUgdGltZXIgZnVuY3Rpb25zCisgKi8KKworI2lmbmRlZglfU0tUSU1FUl9IXworI2RlZmluZSBfU0tUSU1FUl9IXworCisjaW5jbHVkZSAiaC9za3F1ZXVlLmgiCisKKy8qCisgKiBTSyB0aW1lcgorICogLSBuZWVkZWQgd2hlcmV2ZXIgYSB0aW1lciBpcyB1c2VkLiBQdXQgdGhpcyBpbiB5b3VyIGRhdGEgc3RydWN0dXJlCisgKiAgIHdoZXJldmVyIHlvdSB3YW50LgorICovCit0eXBlZGVmCXN0cnVjdCBzX1RpbWVyIFNLX1RJTUVSOworCitzdHJ1Y3Qgc19UaW1lciB7CisJU0tfVElNRVIJKlRtTmV4dDsJLyogbGlua2VkIGxpc3QgKi8KKwlTS19VMzIJCVRtQ2xhc3M7CS8qIFRpbWVyIEV2ZW50IGNsYXNzICovCisJU0tfVTMyCQlUbUV2ZW50OwkvKiBUaW1lciBFdmVudCB2YWx1ZSAqLworCVNLX0VWUEFSQQlUbVBhcmE7CQkvKiBUaW1lciBFdmVudCBwYXJhbWV0ZXIgKi8KKwlTS19VMzIJCVRtRGVsdGE7CS8qIGRlbHRhIHRpbWUgKi8KKwlpbnQJCQlUbUFjdGl2ZTsJLyogZmxhZzogYWN0aXZlL2luYWN0aXZlICovCit9OworCisvKgorICogVGltZXIgY29udHJvbCBzdHJ1Y3QuCisgKiAtIHVzZSBpbiBBZGFwdGVycyBjb250ZXh0IG5hbWUgcEFDLT5UaW0KKyAqLwordHlwZWRlZglzdHJ1Y3Qgc19UaW1DdHJsIHsKKwlTS19USU1FUgkqU3RRdWV1ZTsJLyogSGVhZCBvZiBUaW1lciBxdWV1ZSAqLworfSBTS19USU1DVFJMOworCitleHRlcm4gdm9pZCBTa1RpbWVySW5pdChTS19BQyAqcEFDLCBTS19JT0MgSW9jLCBpbnQgTGV2ZWwpOworZXh0ZXJuIHZvaWQgU2tUaW1lclN0b3AoU0tfQUMgKnBBQywgU0tfSU9DIElvYywgU0tfVElNRVIgKnBUaW1lcik7CitleHRlcm4gdm9pZCBTa1RpbWVyU3RhcnQoU0tfQUMgKnBBQywgU0tfSU9DIElvYywgU0tfVElNRVIgKnBUaW1lciwKKwlTS19VMzIgVGltZSwgU0tfVTMyIENsYXNzLCBTS19VMzIgRXZlbnQsIFNLX0VWUEFSQSBQYXJhKTsKK2V4dGVybiB2b2lkIFNrVGltZXJEb25lKFNLX0FDICpwQUMsIFNLX0lPQyBJb2MpOworI2VuZGlmCS8qIF9TS1RJTUVSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2t0eXBlcy5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGVkYzk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdHlwZXMuaApAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2t0eXBlcy5oCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMiAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMC8wNyAwODoxNjo1MSAkCisgKiBQdXJwb3NlOglEZWZpbmUgZGF0YSB0eXBlcyBmb3IgTGludXgKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIEluIHRoaXMgZmlsZSwgYWxsIGRhdGEgdHlwZXMgdGhhdCBhcmUgbmVlZGVkIGJ5IHRoZSBjb21tb24gbW9kdWxlcworICogYXJlIG1hcHBlZCB0byBMaW51eCBkYXRhIHR5cGVzLgorICogCisgKgorICogSW5jbHVkZSBGaWxlIEhpZXJhcmNoeToKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0lOQ19TS1RZUEVTX0gKKyNkZWZpbmUgX19JTkNfU0tUWVBFU19ICisKKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRGF0YSB0eXBlcyB3aXRoIGEgc3BlY2lmaWMgc2l6ZS4gJ0knID0gc2lnbmVkLCAnVScgPSB1bnNpZ25lZC4KKyAqLworI2RlZmluZSBTS19JOAlzOAorI2RlZmluZSBTS19VOAl1OAorI2RlZmluZSBTS19JMTYJczE2CisjZGVmaW5lIFNLX1UxNgl1MTYKKyNkZWZpbmUgU0tfSTMyCXMzMgorI2RlZmluZSBTS19VMzIJdTMyCisjZGVmaW5lIFNLX0k2NAlzNjQKKyNkZWZpbmUgU0tfVTY0CXU2NAorCisjZGVmaW5lIFNLX1VQVFIJdWxvbmcJCS8qIGNhc3RpbmcgcG9pbnRlciA8LT4gaW50ZWdyYWwgKi8KKworLyoKKyogQm9vbGVhbiB0eXBlLgorKi8KKyNkZWZpbmUgU0tfQk9PTAkJU0tfVTgKKyNkZWZpbmUgU0tfRkFMU0UJMAorI2RlZmluZSBTS19UUlVFCQkoIVNLX0ZBTFNFKQorCisvKiB0eXBlZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYJLyogX19JTkNfU0tUWVBFU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2t2ZXJzaW9uLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2t2ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhNzI5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3ZlcnNpb24uaApAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJdmVyc2lvbi5oCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuNSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMC8wNyAwODoxNjo1MSAkCisgKiBQdXJwb3NlOglTSyBzcGVjaWZpYyBFcnJvciBsb2cgc3VwcG9ydAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPSAiQCgjKSAoQykgU3lzS29ubmVjdCBHbWJILiI7CitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0QnVpbGROdW1iZXJbXSA9CisJIkAoIylTSy1CVUlMRDogNi4yMyBQTDogMDEiOyAKKyNlbmRpZgkvKiAhZGVmaW5lZChsaW50KSAqLworCisjZGVmaW5lIEJPT1RfU1RSSU5HCSJzazk4bGluOiBOZXR3b3JrIERldmljZSBEcml2ZXIgdjYuMjNcbiIgXAorCQkJIihDKUNvcHlyaWdodCAxOTk5LTIwMDQgTWFydmVsbChSKS4iCisKKyNkZWZpbmUgVkVSX1NUUklORwkiNi4yMyIKKyNkZWZpbmUgRFJJVkVSX0ZJTEVfTkFNRQkic2s5OGxpbiIKKyNkZWZpbmUgRFJJVkVSX1JFTF9EQVRFCQkiRmViLTEzLTIwMDQiCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdnBkLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2t2cGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGMxYTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdnBkLmgKQEAgLTAsMCArMSwyNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza3ZwZC5oCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTUgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDEvMTMgMTA6Mzk6MzggJAorICogUHVycG9zZToJRGVmaW5lcyBhbmQgTWFjcm9zIGZvciBWUEQgaGFuZGxpbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMyBTeXNLb25uZWN0IEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogc2t2cGQuaAljb250YWlucyBEaWFnbm9zdGljIHNwZWNpZmljIGRlZmluZXMgZm9yIFZQRCBoYW5kbGluZworICovCisKKyNpZm5kZWYgX19JTkNfU0tWUERfSF8KKyNkZWZpbmUgX19JTkNfU0tWUERfSF8KKworLyoKKyAqIERlZmluZSBSZXNvdXJjZSBUeXBlIElkZW50aWZpZXJzIGFuZCBWUEQga2V5d29yZHMKKyAqLworI2RlZmluZQlSRVNfSUQJCTB4ODIJLyogUmVzb3VyY2UgVHlwZSBJRCBTdHJpbmcgKFByb2R1Y3QgTmFtZSkgKi8KKyNkZWZpbmUgUkVTX1ZQRF9SCTB4OTAJLyogc3RhcnQgb2YgVlBEIHJlYWQgb25seSBhcmVhICovCisjZGVmaW5lIFJFU19WUERfVwkweDkxCS8qIHN0YXJ0IG9mIFZQRCByZWFkL3dyaXRlIGFyZWEgKi8KKyNkZWZpbmUgUkVTX0VORAkJMHg3OAkvKiBSZXNvdXJjZSBUeXBlIEVuZCBUYWcgKi8KKworI2lmbmRlZiBWUERfTkFNRQorI2RlZmluZSBWUERfTkFNRQkiTmFtZSIJLyogUHJvZHVjdCBOYW1lLCBWUEQgbmFtZSBvZiBSRVNfSUQgKi8KKyNlbmRpZgkvKiBWUERfTkFNRSAqLworI2RlZmluZSBWUERfUE4JCSJQTiIJLyogQWRhcHRlciBQYXJ0IE51bWJlciAqLworI2RlZmluZQlWUERfRUMJCSJFQyIJLyogQWRhcHRlciBFbmdpbmVlcmluZyBMZXZlbCAqLworI2RlZmluZSBWUERfTU4JCSJNTiIJLyogTWFudWZhY3R1cmUgSUQgKi8KKyNkZWZpbmUgVlBEX1NOCQkiU04iCS8qIFNlcmlhbCBOdW1iZXIgKi8KKyNkZWZpbmUgVlBEX0NQCQkiQ1AiCS8qIEV4dGVuZGVkIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgVlBEX1JWCQkiUlYiCS8qIENoZWNrc3VtIGFuZCBSZXNlcnZlZCAqLworI2RlZmluZQlWUERfWUEJCSJZQSIJLyogQXNzZXQgVGFnIElkZW50aWZpZXIgKi8KKyNkZWZpbmUgVlBEX1ZMCQkiVkwiCS8qIEZpcnN0IEVycm9yIExvZyBNZXNzYWdlIChTSyBzcGVjaWZpYykgKi8KKyNkZWZpbmUgVlBEX1ZGCQkiVkYiCS8qIFNlY29uZCBFcnJvciBMb2cgTWVzc2FnZSAoU0sgc3BlY2lmaWMpICovCisjZGVmaW5lIFZQRF9SVwkJIlJXIgkvKiBSZW1haW5pbmcgUmVhZCAvIFdyaXRlIEFyZWEgKi8KKworLyogJ3R5cGUnIHZhbHVlcyBmb3IgdnBkX3NldHVwX3BhcmEoKSAqLworI2RlZmluZSBWUERfUk9fS0VZCTEJLyogUk8ga2V5cyBhcmUgIlBOIiwgIkVDIiwgIk1OIiwgIlNOIiwgIlJWIiAqLworI2RlZmluZSBWUERfUldfS0VZCTIJLyogUlcga2V5cyBhcmUgIll4IiwgIlZ4IiwgYW5kICJSVyIgKi8KKworLyogJ29wJyB2YWx1ZXMgZm9yIHZwZF9zZXR1cF9wYXJhKCkgKi8KKyNkZWZpbmUJQUREX0tFWQkJMQkvKiBhZGQgdGhlIGtleSBhdCB0aGUgcG9zICJSViIgb3IgIlJXIiAqLworI2RlZmluZSBPV1JfS0VZCQkyCS8qIG92ZXJ3cml0ZSBrZXkgaWYgYWxyZWFkeSBleGlzdHMgKi8KKworLyoKKyAqIERlZmluZSBSRUFEIGFuZCBXUklURSBDb25zdGFudHMuCisgKi8KKworI2RlZmluZSBWUERfREVWX0lEX0dFTkVTSVMgCTB4NDMwMAorCisjZGVmaW5lCVZQRF9TSVpFX1lVS09OCQkyNTYKKyNkZWZpbmUJVlBEX1NJWkVfR0VORVNJUwk1MTIKKyNkZWZpbmUJVlBEX1NJWkUJCQk1MTIKKyNkZWZpbmUgVlBEX1JFQUQJMHgwMDAwCisjZGVmaW5lIFZQRF9XUklURQkweDgwMDAKKworI2RlZmluZSBWUERfU1RPUChwQUMsSW9DKQlWUERfT1VUMTYocEFDLElvQyxQQ0lfVlBEX0FEUl9SRUcsVlBEX1dSSVRFKQorCisjZGVmaW5lIFZQRF9HRVRfUkVTX0xFTihwKQkoKHVuc2lnbmVkIGludCkgXAorCQkJCQkoKiAoU0tfVTggKikmKHApWzFdKSB8XAorCQkJCQkoKCogKFNLX1U4ICopJihwKVsyXSkgPDwgOCkpCisjZGVmaW5lIFZQRF9HRVRfVlBEX0xFTihwKQkoKHVuc2lnbmVkIGludCkoKiAoU0tfVTggKikmKHApWzJdKSkKKyNkZWZpbmUgVlBEX0dFVF9WQUwocCkJCSgoY2hhciAqKSYocClbM10pCisKKyNkZWZpbmUgVlBEX01BWF9MRU4JNTAKKworLyogVlBEIHN0YXR1cyAqLworCS8qIGJpdCA3Li4xIHJlc2VydmVkICovCisjZGVmaW5lIFZQRF9WQUxJRAkoMTw8MCkJLyogVlBEIGRhdGEgYnVmZmVyLCB2cGRfZnJlZV9ybywgKi8KKwkJCQkJCQkvKiBhbmQgdnBkX2ZyZWVfcncgdmFsaWQJICovCisKKy8qCisgKiBWUEQgc3RydWN0cworICovCit0eXBlZGVmCXN0cnVjdCBzX3ZwZF9zdGF0dXMgeworCXVuc2lnbmVkIHNob3J0CUFsaWduMDE7CQkJLyogQWxpZ25tZW50ICovCisJdW5zaWduZWQgc2hvcnQJdnBkX3N0YXR1czsJCQkvKiBWUEQgc3RhdHVzLCBkZXNjcmlwdGlvbiBzZWUgYWJvdmUgKi8KKwlpbnQJCQkJdnBkX2ZyZWVfcm87CQkvKiB1bnVzZWQgYnl0ZXMgaW4gcmVhZCBvbmx5IGFyZWEgKi8KKwlpbnQJCQkJdnBkX2ZyZWVfcnc7CQkvKiBieXRlcyBhdmFpbGFibGUgaW4gcmVhZC93cml0ZSBhcmVhICovCit9IFNLX1ZQRF9TVEFUVVM7CisKK3R5cGVkZWYJc3RydWN0IHNfdnBkIHsKKwlTS19WUERfU1RBVFVTCXY7CQkJCQkvKiBWUEQgc3RhdHVzIHN0cnVjdHVyZSAqLworCWNoYXIJCQl2cGRfYnVmW1ZQRF9TSVpFXTsJLyogVlBEIGJ1ZmZlciAqLworCWludAkJCQlyb21fc2l6ZTsJCQkvKiBWUEQgUk9NIFNpemUgZnJvbSBQQ0lfT1VSX1JFR18yICovCisJaW50CQkJCXZwZF9zaXplOwkJCS8qIHNhdmVkIFZQRC1zaXplICovCit9IFNLX1ZQRDsKKwordHlwZWRlZglzdHJ1Y3Qgc192cGRfcGFyYSB7CisJdW5zaWduZWQgaW50CXBfbGVuOwkvKiBwYXJhbWV0ZXIgbGVuZ3RoICovCisJY2hhcgkJCSpwX3ZhbDsJLyogcG9pbnRzIHRvIHRoZSB2YWx1ZSAqLworfSBTS19WUERfUEFSQTsKKworLyoKKyAqIHN0cnVjdHVyZSBvZiBMYXJnZSBSZXNvdXJjZSBUeXBlIElkZW50aWZpZXJzCisgKi8KKworLyogd2FzIHJlbW92ZWQgYmVjYXVzZSBvZiBhbGlnbm1lbnQgcHJvYmxlbXMgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBvZiBWUEQga2V5d29yZHMKKyAqLwordHlwZWRlZglzdHJ1Y3Qgc192cGRfa2V5IHsKKwljaGFyCQkJcF9rZXlbMl07CS8qIDIgYnl0ZXMgSUQgc3RyaW5nICovCisJdW5zaWduZWQgY2hhcglwX2xlbjsJCS8qIDEgYnl0ZSBsZW5ndGggKi8KKwljaGFyCQkJcF92YWw7CQkvKiBzdGFydCBvZiB0aGUgdmFsdWUgc3RyaW5nICovCit9IFNLX1ZQRF9LRVk7CisKKworLyoKKyAqIFN5c3RlbSBzcGVjaWZpYyBWUEQgbWFjcm9zCisgKi8KKyNpZm5kZWYgU0tESUFHCisjaWZuZGVmIFZQRF9ET19JTworI2RlZmluZSBWUERfT1VUOChwQUMsSW9DLEFkZHIsVmFsKQkodm9pZClTa1BjaVdyaXRlQ2ZnQnl0ZShwQUMsQWRkcixWYWwpCisjZGVmaW5lIFZQRF9PVVQxNihwQUMsSW9DLEFkZHIsVmFsKQkodm9pZClTa1BjaVdyaXRlQ2ZnV29yZChwQUMsQWRkcixWYWwpCisjZGVmaW5lIFZQRF9PVVQzMihwQUMsSW9DLEFkZHIsVmFsKQkodm9pZClTa1BjaVdyaXRlQ2ZnRFdvcmQocEFDLEFkZHIsVmFsKQorI2RlZmluZSBWUERfSU44KHBBQyxJb0MsQWRkcixwVmFsKQkodm9pZClTa1BjaVJlYWRDZmdCeXRlKHBBQyxBZGRyLHBWYWwpCisjZGVmaW5lIFZQRF9JTjE2KHBBQyxJb0MsQWRkcixwVmFsKQkodm9pZClTa1BjaVJlYWRDZmdXb3JkKHBBQyxBZGRyLHBWYWwpCisjZGVmaW5lIFZQRF9JTjMyKHBBQyxJb0MsQWRkcixwVmFsKQkodm9pZClTa1BjaVJlYWRDZmdEV29yZChwQUMsQWRkcixwVmFsKQorI2Vsc2UJLyogVlBEX0RPX0lPICovCisjZGVmaW5lIFZQRF9PVVQ4KHBBQyxJb0MsQWRkcixWYWwpCVNLX09VVDgoSW9DLFBDSV9DKEFkZHIpLFZhbCkKKyNkZWZpbmUgVlBEX09VVDE2KHBBQyxJb0MsQWRkcixWYWwpCVNLX09VVDE2KElvQyxQQ0lfQyhBZGRyKSxWYWwpCisjZGVmaW5lIFZQRF9PVVQzMihwQUMsSW9DLEFkZHIsVmFsKQlTS19PVVQzMihJb0MsUENJX0MoQWRkciksVmFsKQorI2RlZmluZSBWUERfSU44KHBBQyxJb0MsQWRkcixwVmFsKQlTS19JTjgoSW9DLFBDSV9DKEFkZHIpLHBWYWwpCisjZGVmaW5lIFZQRF9JTjE2KHBBQyxJb0MsQWRkcixwVmFsKQlTS19JTjE2KElvQyxQQ0lfQyhBZGRyKSxwVmFsKQorI2RlZmluZSBWUERfSU4zMihwQUMsSW9DLEFkZHIscFZhbCkJU0tfSU4zMihJb0MsUENJX0MoQWRkcikscFZhbCkKKyNlbmRpZgkvKiBWUERfRE9fSU8gKi8KKyNlbHNlCS8qIFNLRElBRyAqLworI2RlZmluZSBWUERfT1VUOChwQUMsSW9jLEFkZHIsVmFsKSB7CQkJXAorCQlpZiAoKHBBQyktPkRnVC5EZ1VzZUNmZ0N5Y2xlKQkJCVwKKwkJCVNrUGNpV3JpdGVDZmdCeXRlKHBBQyxBZGRyLFZhbCk7CVwKKwkJZWxzZQkJCQkJCQkJCVwKKwkJCVNLX09VVDgocEFDLFBDSV9DKEFkZHIpLFZhbCk7CQlcCisJCX0KKyNkZWZpbmUgVlBEX09VVDE2KHBBQyxJb2MsQWRkcixWYWwpIHsJCQlcCisJCWlmICgocEFDKS0+RGdULkRnVXNlQ2ZnQ3ljbGUpCQkJXAorCQkJU2tQY2lXcml0ZUNmZ1dvcmQocEFDLEFkZHIsVmFsKTsJXAorCQllbHNlCQkJCQkJXAorCQkJU0tfT1VUMTYocEFDLFBDSV9DKEFkZHIpLFZhbCk7CQlcCisJCX0KKyNkZWZpbmUgVlBEX09VVDMyKHBBQyxJb2MsQWRkcixWYWwpIHsJCQlcCisJCWlmICgocEFDKS0+RGdULkRnVXNlQ2ZnQ3ljbGUpCQkJXAorCQkJU2tQY2lXcml0ZUNmZ0RXb3JkKHBBQyxBZGRyLFZhbCk7CVwKKwkJZWxzZQkJCQkJCVwKKwkJCVNLX09VVDMyKHBBQyxQQ0lfQyhBZGRyKSxWYWwpOyAJCVwKKwkJfQorI2RlZmluZSBWUERfSU44KHBBQyxJb2MsQWRkcixwVmFsKSB7CQkJXAorCQlpZiAoKHBBQyktPkRnVC5EZ1VzZUNmZ0N5Y2xlKSAJCQlcCisJCQlTa1BjaVJlYWRDZmdCeXRlKHBBQyxBZGRyLHBWYWwpOwlcCisJCWVsc2UJCQkJCQlcCisJCQlTS19JTjgocEFDLFBDSV9DKEFkZHIpLHBWYWwpOyAJCVwKKwkJfQorI2RlZmluZSBWUERfSU4xNihwQUMsSW9jLEFkZHIscFZhbCkgewkJCVwKKwkJaWYgKChwQUMpLT5EZ1QuRGdVc2VDZmdDeWNsZSkgCQkJXAorCQkJU2tQY2lSZWFkQ2ZnV29yZChwQUMsQWRkcixwVmFsKTsJXAorCQllbHNlCQkJCQkJXAorCQkJU0tfSU4xNihwQUMsUENJX0MoQWRkcikscFZhbCk7IAkJXAorCQl9CisjZGVmaW5lIFZQRF9JTjMyKHBBQyxJb2MsQWRkcixwVmFsKSB7CQkJXAorCQlpZiAoKHBBQyktPkRnVC5EZ1VzZUNmZ0N5Y2xlKQkJCVwKKwkJCVNrUGNpUmVhZENmZ0RXb3JkKHBBQyxBZGRyLHBWYWwpOwlcCisJCWVsc2UJCQkJCQlcCisJCQlTS19JTjMyKHBBQyxQQ0lfQyhBZGRyKSxwVmFsKTsJCVwKKwkJfQorI2VuZGlmCS8qIG5TS0RJQUcgKi8KKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglTS19LUl9QUk9UTworI2lmZGVmIFNLRElBRworZXh0ZXJuIFNLX1UzMglWcGRSZWFkRFdvcmQoCisJU0tfQUMJCSpwQUMsCisJU0tfSU9DCQlJb0MsCisJaW50CQkJYWRkcik7CisjZW5kaWYJLyogU0tESUFHICovCisKK2V4dGVybiBpbnQJVnBkU2V0dXBQYXJhKAorCVNLX0FDCQkqcEFDLAorCWNvbnN0IGNoYXIJKmtleSwKKwljb25zdCBjaGFyCSpidWYsCisJaW50CQkJbGVuLAorCWludAkJCXR5cGUsCisJaW50CQkJb3ApOworCitleHRlcm4gU0tfVlBEX1NUQVRVUwkqVnBkU3RhdCgKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQyk7CisKK2V4dGVybiBpbnQJVnBkS2V5cygKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwljaGFyCQkqYnVmLAorCWludAkJCSpsZW4sCisJaW50CQkJKmVsZW1lbnRzKTsKKworZXh0ZXJuIGludAlWcGRSZWFkKAorCVNLX0FDCQkqcEFDLAorCVNLX0lPQwkJSW9DLAorCWNvbnN0IGNoYXIJKmtleSwKKwljaGFyCQkqYnVmLAorCWludAkJCSpsZW4pOworCitleHRlcm4gU0tfQk9PTAlWcGRNYXlXcml0ZSgKKwljaGFyCQkqa2V5KTsKKworZXh0ZXJuIGludAlWcGRXcml0ZSgKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwljb25zdCBjaGFyCSprZXksCisJY29uc3QgY2hhcgkqYnVmKTsKKworZXh0ZXJuIGludAlWcGREZWxldGUoCisJU0tfQUMJCSpwQUMsCisJU0tfSU9DCQlJb0MsCisJY2hhcgkJKmtleSk7CisKK2V4dGVybiBpbnQJVnBkVXBkYXRlKAorCVNLX0FDCQkqcEFDLAorCVNLX0lPQwkJSW9DKTsKKworZXh0ZXJuIHZvaWQJVnBkRXJyTG9nKAorCVNLX0FDCQkqcEFDLAorCVNLX0lPQwkJSW9DLAorCWNoYXIJCSptc2cpOworCisjaWZkZWYJU0tESUFHCitleHRlcm4gaW50CVZwZFJlYWRCbG9jaygKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwljaGFyCQkqYnVmLAorCWludAkJCWFkZHIsCisJaW50CQkJbGVuKTsKKworZXh0ZXJuIGludAlWcGRXcml0ZUJsb2NrKAorCVNLX0FDCQkqcEFDLAorCVNLX0lPQwkJSW9DLAorCWNoYXIJCSpidWYsCisJaW50CQkJYWRkciwKKwlpbnQJCQlsZW4pOworI2VuZGlmCS8qIFNLRElBRyAqLworI2Vsc2UJLyogU0tfS1JfUFJPVE8gKi8KK2V4dGVybiBTS19VMzIJVnBkUmVhZERXb3JkKCk7CitleHRlcm4gaW50CVZwZFNldHVwUGFyYSgpOworZXh0ZXJuIFNLX1ZQRF9TVEFUVVMJKlZwZFN0YXQoKTsKK2V4dGVybiBpbnQJVnBkS2V5cygpOworZXh0ZXJuIGludAlWcGRSZWFkKCk7CitleHRlcm4gU0tfQk9PTAlWcGRNYXlXcml0ZSgpOworZXh0ZXJuIGludAlWcGRXcml0ZSgpOworZXh0ZXJuIGludAlWcGREZWxldGUoKTsKK2V4dGVybiBpbnQJVnBkVXBkYXRlKCk7CitleHRlcm4gdm9pZAlWcGRFcnJMb2coKTsKKyNlbmRpZgkvKiBTS19LUl9QUk9UTyAqLworCisjZW5kaWYJLyogX19JTkNfU0tWUERfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC94bWFjX2lpLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gveG1hY19paS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMTlmOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gveG1hY19paS5oCkBAIC0wLDAgKzEsMTU3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXhtYWNfaWkuaAorICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgQ29tbW9uIE1vZHVsZXMKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS41MiAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMC8wMiAxNjozNTo1MCAkCisgKiBQdXJwb3NlOglEZWZpbmVzIGFuZCBNYWNyb3MgZm9yIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX1hNQUNfSAorI2RlZmluZSBfX0lOQ19YTUFDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgkvKiBfX2NwbHVzcGx1cyAqLworCisvKiBkZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogWE1BQyBJSSByZWdpc3RlcnMKKyAqCisgKiBUaGUgWE1BQyByZWdpc3RlcnMgYXJlIDE2IG9yIDMyIGJpdHMgd2lkZS4KKyAqIFRoZSBYTUFDcyBob3N0IHByb2Nlc3NvciBpbnRlcmZhY2UgaXMgc2V0IHRvIDE2IGJpdCBtb2RlLAorICogdGhlcmVmb3JlIEFMTCByZWdpc3RlcnMgd2lsbCBiZSBhZGRyZXNzZWQgd2l0aCAxNiBiaXQgYWNjZXNzZXMuCisgKgorICogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHByb3ZpZGVkIHRvIGFjY2VzcyB0aGUgWE1BQyByZWdpc3RlcnMKKyAqIFhNX0lOMTYoKSwgWE1fT1VUMTYsIFhNX0lOMzIoKSwgWE1fT1VUMzIoKSwgWE1fSU5BRFIoKSwgWE1fT1VUQURSKCksCisgKiBYTV9JTkhBU0goKSwgYW5kIFhNX09VVEhBU0goKS4KKyAqIFRoZSBtYWNyb3MgYXJlIGRlZmluZWQgaW4gU2tHZUh3LmguCisgKgorICogTm90ZToJTkEgcmVnCT0gTmV0d29yayBBZGRyZXNzIGUuZyBEQSwgU0EgZXRjLgorICoKKyAqLworI2RlZmluZSBYTV9NTVVfQ01ECQkweDAwMDAJLyogMTYgYml0IHIvdwlNTVUgQ29tbWFuZCBSZWdpc3RlciAqLworCS8qIDB4MDAwNDoJCXJlc2VydmVkICovCisjZGVmaW5lIFhNX1BPRkYJCQkweDAwMDgJLyogMzIgYml0IHIvdwlQYWNrZXQgT2Zmc2V0IFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX0JVUlNUCQkweDAwMGMJLyogMzIgYml0IHIvdwlCdXJzdCBSZWdpc3RlciBmb3IgaGFsZiBkdXBsZXgqLworI2RlZmluZSBYTV8xTF9WTEFOX1RBRwkweDAwMTAJLyogMTYgYml0IHIvdwlPbmUgTGV2ZWwgVkxBTiBUYWcgSUQgKi8KKyNkZWZpbmUgWE1fMkxfVkxBTl9UQUcJMHgwMDE0CS8qIDE2IGJpdCByL3cJVHdvIExldmVsIFZMQU4gVGFnIElEICovCisJLyogMHgwMDE4IC0gMHgwMDFlOglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9UWF9DTUQJCTB4MDAyMAkvKiAxNiBiaXQgci93CVRyYW5zbWl0IENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fVFhfUlRfTElNCTB4MDAyNAkvKiAxNiBiaXQgci93CVRyYW5zbWl0IFJldHJ5IExpbWl0IFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1RYX1NUSU1FCQkweDAwMjgJLyogMTYgYml0IHIvdwlUcmFuc21pdCBTbG90dGltZSBSZWdpc3RlciAqLworI2RlZmluZSBYTV9UWF9JUEcJCTB4MDAyYwkvKiAxNiBiaXQgci93CVRyYW5zbWl0IEludGVyIFBhY2tldCBHYXAgKi8KKyNkZWZpbmUgWE1fUlhfQ01ECQkweDAwMzAJLyogMTYgYml0IHIvdwlSZWNlaXZlIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fUEhZX0FERFIJCTB4MDAzNAkvKiAxNiBiaXQgci93CVBIWSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1BIWV9EQVRBCQkweDAwMzgJLyogMTYgYml0IHIvdwlQSFkgRGF0YSBSZWdpc3RlciAqLworCS8qIDB4MDAzYzogCQlyZXNlcnZlZCAqLworI2RlZmluZSBYTV9HUF9QT1JUCQkweDAwNDAJLyogMzIgYml0IHIvdwlHZW5lcmFsIFB1cnBvc2UgUG9ydCBSZWdpc3RlciAqLworI2RlZmluZSBYTV9JTVNLCQkJMHgwMDQ0CS8qIDE2IGJpdCByL3cJSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fSVNSQwkJCTB4MDA0OAkvKiAxNiBiaXQgci9vCUludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fSFdfQ0ZHCQkweDAwNGMJLyogMTYgYml0IHIvdwlIYXJkd2FyZSBDb25maWcgUmVnaXN0ZXIgKi8KKwkvKiAweDAwNTAgLSAweDAwNWU6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX1RYX0xPX1dNCQkweDAwNjAJLyogMTYgYml0IHIvdwlUeCBGSUZPIExvdyBXYXRlciBNYXJrICovCisjZGVmaW5lIFhNX1RYX0hJX1dNCQkweDAwNjIJLyogMTYgYml0IHIvdwlUeCBGSUZPIEhpZ2ggV2F0ZXIgTWFyayAqLworI2RlZmluZSBYTV9UWF9USFIJCTB4MDA2NAkvKiAxNiBiaXQgci93CVR4IFJlcXVlc3QgVGhyZXNob2xkICovCisjZGVmaW5lIFhNX0hUX1RIUgkJMHgwMDY2CS8qIDE2IGJpdCByL3cJSG9zdCBSZXF1ZXN0IFRocmVzaG9sZCAqLworI2RlZmluZSBYTV9QQVVTRV9EQQkJMHgwMDY4CS8qIE5BIHJlZyByL3cJUGF1c2UgRGVzdGluYXRpb24gQWRkcmVzcyAqLworCS8qIDB4MDA2ZTogCQlyZXNlcnZlZCAqLworI2RlZmluZSBYTV9DVExfUEFSQQkJMHgwMDcwCS8qIDMyIGJpdCByL3cJQ29udHJvbCBQYXJhbWV0ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fTUFDX09QQ09ERQkweDAwNzQJLyogMTYgYml0IHIvdwlPcGNvZGUgZm9yIE1BQyBjb250cm9sIGZyYW1lcyAqLworI2RlZmluZSBYTV9NQUNfUFRJTUUJMHgwMDc2CS8qIDE2IGJpdCByL3cJUGF1c2UgdGltZSBmb3IgTUFDIGN0cmwgZnJhbWVzKi8KKyNkZWZpbmUgWE1fVFhfU1RBVAkJMHgwMDc4CS8qIDMyIGJpdCByL28JVHggU3RhdHVzIExJRk8gUmVnaXN0ZXIgKi8KKworCS8qIDB4MDA4MCAtIDB4MDBmYzoJMTYgTkEgcmVnIHIvdwlFeGFjdCBNYXRjaCBBZGRyZXNzIFJlZ2lzdGVycyAqLworCS8qIAkJCQl1c2UgdGhlIFhNX0VYTSgpIG1hY3JvIHRvIGFkZHJlc3MgKi8KKyNkZWZpbmUgWE1fRVhNX1NUQVJUCTB4MDA4MAkvKiByL3cJU3RhcnQgQWRkcmVzcyBvZiB0aGUgRVhNIFJlZ3MgKi8KKworCS8qCisJICogWE1fRVhNKFJlZykKKwkgKgorCSAqIHJldHVybnMgdGhlIFhNQUMgYWRkcmVzcyBvZmZzZXQgb2Ygc3BlY2lmaWVkIEV4YWN0IE1hdGNoIEFkZHIgUmVnCisJICoKKwkgKiBwYXJhOglSZWcJRVhNIHJlZ2lzdGVyIHRvIGFkZHIJKDAgLi4gMTUpCisJICoKKwkgKiB1c2FnZToJWE1fSU5BRERSKElvQywgTUFDXzEsIFhNX0VYTShpKSwgJnZhbFtpXSk7CisJICovCisjZGVmaW5lIFhNX0VYTShSZWcpCShYTV9FWE1fU1RBUlQgKyAoKFJlZykgPDwgMykpCisKKyNkZWZpbmUgWE1fU1JDX0NISwkJMHgwMTAwCS8qIE5BIHJlZyByL3cJU291cmNlIENoZWNrIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fU0EJCQkweDAxMDgJLyogTkEgcmVnIHIvdwlTdGF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fSFNNCQkJMHgwMTEwCS8qIDY0IGJpdCByL3cJSGFzaCBNYXRjaCBBZGRyZXNzIFJlZ2lzdGVycyAqLworI2RlZmluZSBYTV9SWF9MT19XTQkJMHgwMTE4CS8qIDE2IGJpdCByL3cJUmVjZWl2ZSBMb3cgV2F0ZXIgTWFyayAqLworI2RlZmluZSBYTV9SWF9ISV9XTQkJMHgwMTFhCS8qIDE2IGJpdCByL3cJUmVjZWl2ZSBIaWdoIFdhdGVyIE1hcmsgKi8KKyNkZWZpbmUgWE1fUlhfVEhSCQkweDAxMWMJLyogMzIgYml0IHIvdwlSZWNlaXZlIFJlcXVlc3QgVGhyZXNob2xkICovCisjZGVmaW5lIFhNX0RFVl9JRAkJMHgwMTIwCS8qIDMyIGJpdCByL28JRGV2aWNlIElEIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX01PREUJCQkweDAxMjQJLyogMzIgYml0IHIvdwlNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX0xTQQkJCTB4MDEyOAkvKiBOQSByZWcgci9vCUxhc3QgU291cmNlIFJlZ2lzdGVyICovCisJLyogMHgwMTJlOgkJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fVFNfUkVBRAkJMHgwMTMwCS8qIDMyIGJpdCByL28JVGltZSBTdGFtcCBSZWFkIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1RTX0xPQUQJCTB4MDEzNAkvKiAzMiBiaXQgci9vCVRpbWUgU3RhbXAgTG9hZCBWYWx1ZSAqLworCS8qIDB4MDEzOCAtIDB4MDFmZToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fU1RBVF9DTUQJMHgwMjAwCS8qIDE2IGJpdCByL3cJU3RhdGlzdGljcyBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1JYX0NOVF9FVgkweDAyMDQJLyogMzIgYml0IHIvbwlSeCBDb3VudGVyIEV2ZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1RYX0NOVF9FVgkweDAyMDgJLyogMzIgYml0IHIvbwlUeCBDb3VudGVyIEV2ZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1JYX0VWX01TSwkweDAyMGMJLyogMzIgYml0IHIvdwlSeCBDb3VudGVyIEV2ZW50IE1hc2sgKi8KKyNkZWZpbmUgWE1fVFhfRVZfTVNLCTB4MDIxMAkvKiAzMiBiaXQgci93CVR4IENvdW50ZXIgRXZlbnQgTWFzayAqLworCS8qIDB4MDIwNCAtIDB4MDI3ZToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fVFhGX09LCQkweDAyODAJLyogMzIgYml0IHIvbwlGcmFtZXMgVHJhbnNtaXR0ZWQgT0sgQ29udXRlciAqLworI2RlZmluZSBYTV9UWE9fT0tfSEkJMHgwMjg0CS8qIDMyIGJpdCByL28JT2N0ZXRzIFRyYW5zbWl0dGVkIE9LIEhpZ2ggQ250Ki8KKyNkZWZpbmUgWE1fVFhPX09LX0xPCTB4MDI4OAkvKiAzMiBiaXQgci9vCU9jdGV0cyBUcmFuc21pdHRlZCBPSyBMb3cgQ250ICovCisjZGVmaW5lIFhNX1RYRl9CQ19PSwkweDAyOGMJLyogMzIgYml0IHIvbwlCcm9hZGNhc3QgRnJhbWVzIFhtaXR0ZWQgT0sgKi8KKyNkZWZpbmUgWE1fVFhGX01DX09LCTB4MDI5MAkvKiAzMiBiaXQgci9vCU11bHRpY2FzdCBGcmFtZXMgWG1pdHRlZCBPSyAqLworI2RlZmluZSBYTV9UWEZfVUNfT0sJMHgwMjk0CS8qIDMyIGJpdCByL28JVW5pY2FzdCBGcmFtZXMgWG1pdHRlZCBPSyAqLworI2RlZmluZSBYTV9UWEZfTE9ORwkJMHgwMjk4CS8qIDMyIGJpdCByL28JVHggTG9uZyBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1RYRV9CVVJTVAkweDAyOWMJLyogMzIgYml0IHIvbwlUeCBCdXJzdCBFdmVudCBDb3VudGVyICovCisjZGVmaW5lIFhNX1RYRl9NUEFVU0UJMHgwMmEwCS8qIDMyIGJpdCByL28JVHggUGF1c2UgTUFDIEN0cmwgRnJhbWUgQ250ICovCisjZGVmaW5lIFhNX1RYRl9NQ1RSTAkweDAyYTQJLyogMzIgYml0IHIvbwlUeCBNQUMgQ3RybCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1RYRl9TTkdfQ09MCTB4MDJhOAkvKiAzMiBiaXQgci9vCVR4IFNpbmdsZSBDb2xsaXNpb24gQ291bnRlciAqLworI2RlZmluZSBYTV9UWEZfTVVMX0NPTAkweDAyYWMJLyogMzIgYml0IHIvbwlUeCBNdWx0aXBsZSBDb2xsaXNpb24gQ291bnRlciAqLworI2RlZmluZSBYTV9UWEZfQUJPX0NPTAkweDAyYjAJLyogMzIgYml0IHIvbwlUeCBhYm9ydGVkIGR1ZSB0byBFeGNlcy4gQ29sLiAqLworI2RlZmluZSBYTV9UWEZfTEFUX0NPTAkweDAyYjQJLyogMzIgYml0IHIvbwlUeCBMYXRlIENvbGxpc2lvbiBDb3VudGVyICovCisjZGVmaW5lIFhNX1RYRl9ERUYJCTB4MDJiOAkvKiAzMiBiaXQgci9vCVR4IERlZmVycmVkIEZyYW1lIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fVFhGX0VYX0RFRgkweDAyYmMJLyogMzIgYml0IHIvbwlUeCBFeGNlc3NpdmUgRGVmZXJhbGwgQ291bnRlciAqLworI2RlZmluZSBYTV9UWEVfRklGT19VUgkweDAyYzAJLyogMzIgYml0IHIvbwlUeCBGSUZPIFVuZGVycnVuIEV2ZW50IENudCAqLworI2RlZmluZSBYTV9UWEVfQ1NfRVJSCTB4MDJjNAkvKiAzMiBiaXQgci9vCVR4IENhcnJpZXIgU2Vuc2UgRXJyb3IgQ250ICovCisjZGVmaW5lIFhNX1RYUF9VVElMCQkweDAyYzgJLyogMzIgYml0IHIvbwlUeCBVdGlsaXphdGlvbiBpbiAlICovCisJLyogMHgwMmNjIC0gMHgwMmNlOglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9UWEZfNjRCCQkweDAyZDAJLyogMzIgYml0IHIvbwk2NCBCeXRlIFR4IEZyYW1lIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fVFhGXzEyN0IJCTB4MDJkNAkvKiAzMiBiaXQgci9vCTY1LTEyNyBCeXRlIFR4IEZyYW1lIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fVFhGXzI1NUIJCTB4MDJkOAkvKiAzMiBiaXQgci9vCTEyOC0yNTUgQnl0ZSBUeCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1RYRl81MTFCCQkweDAyZGMJLyogMzIgYml0IHIvbwkyNTYtNTExIEJ5dGUgVHggRnJhbWUgQ291bnRlciAqLworI2RlZmluZSBYTV9UWEZfMTAyM0IJMHgwMmUwCS8qIDMyIGJpdCByL28JNTEyLTEwMjMgQnl0ZSBUeCBGcmFtZSBDb3VudGVyKi8KKyNkZWZpbmUgWE1fVFhGX01BWF9TWgkweDAyZTQJLyogMzIgYml0IHIvbwkxMDI0LU1heFNpemUgQnl0ZSBUeCBGcmFtZSBDbnQqLworCS8qIDB4MDJlOCAtIDB4MDJmZToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fUlhGX09LCQkweDAzMDAJLyogMzIgYml0IHIvbwlGcmFtZXMgUmVjZWl2ZWQgT0sgKi8KKyNkZWZpbmUgWE1fUlhPX09LX0hJCTB4MDMwNAkvKiAzMiBiaXQgci9vCU9jdGV0cyBSZWNlaXZlZCBPSyBIaWdoIENudCAqLworI2RlZmluZSBYTV9SWE9fT0tfTE8JMHgwMzA4CS8qIDMyIGJpdCByL28JT2N0ZXRzIFJlY2VpdmVkIE9LIExvdyBDb3VudGVyKi8KKyNkZWZpbmUgWE1fUlhGX0JDX09LCTB4MDMwYwkvKiAzMiBiaXQgci9vCUJyb2FkY2FzdCBGcmFtZXMgUmVjZWl2ZWQgT0sgKi8KKyNkZWZpbmUgWE1fUlhGX01DX09LCTB4MDMxMAkvKiAzMiBiaXQgci9vCU11bHRpY2FzdCBGcmFtZXMgUmVjZWl2ZWQgT0sgKi8KKyNkZWZpbmUgWE1fUlhGX1VDX09LCTB4MDMxNAkvKiAzMiBiaXQgci9vCVVuaWNhc3QgRnJhbWVzIFJlY2VpdmVkIE9LICovCisjZGVmaW5lIFhNX1JYRl9NUEFVU0UJMHgwMzE4CS8qIDMyIGJpdCByL28JUnggUGF1c2UgTUFDIEN0cmwgRnJhbWUgQ250ICovCisjZGVmaW5lIFhNX1JYRl9NQ1RSTAkweDAzMWMJLyogMzIgYml0IHIvbwlSeCBNQUMgQ3RybCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1JYRl9JTlZfTVAJMHgwMzIwCS8qIDMyIGJpdCByL28JUnggaW52YWxpZCBQYXVzZSBGcmFtZSBDbnQgKi8KKyNkZWZpbmUgWE1fUlhGX0lOVl9NT0MJMHgwMzI0CS8qIDMyIGJpdCByL28JUnggRnJhbWVzIHdpdGggaW52LiBNQUMgT3Bjb2RlKi8KKyNkZWZpbmUgWE1fUlhFX0JVUlNUCTB4MDMyOAkvKiAzMiBiaXQgci9vCVJ4IEJ1cnN0IEV2ZW50IENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fUlhFX0ZNSVNTCTB4MDMyYwkvKiAzMiBiaXQgci9vCVJ4IE1pc3NlZCBGcmFtZXMgRXZlbnQgQ250ICovCisjZGVmaW5lIFhNX1JYRl9GUkFfRVJSCTB4MDMzMAkvKiAzMiBiaXQgci9vCVJ4IEZyYW1pbmcgRXJyb3IgQ291bnRlciAqLworI2RlZmluZSBYTV9SWEVfRklGT19PVgkweDAzMzQJLyogMzIgYml0IHIvbwlSeCBGSUZPIG92ZXJmbG93IEV2ZW50IENudCAqLworI2RlZmluZSBYTV9SWEZfSkFCX1BLVAkweDAzMzgJLyogMzIgYml0IHIvbwlSeCBKYWJiZXIgUGFja2V0IEZyYW1lIENudCAqLworI2RlZmluZSBYTV9SWEVfQ0FSX0VSUgkweDAzM2MJLyogMzIgYml0IHIvbwlSeCBDYXJyaWVyIEV2ZW50IEVycm9yIENudCAqLworI2RlZmluZSBYTV9SWEZfTEVOX0VSUgkweDAzNDAJLyogMzIgYml0IHIvbwlSeCBpbiBSYW5nZSBMZW5ndGggRXJyb3IgKi8KKyNkZWZpbmUgWE1fUlhFX1NZTV9FUlIJMHgwMzQ0CS8qIDMyIGJpdCByL28JUnggU3ltYm9sIEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fUlhFX1NIVF9FUlIJMHgwMzQ4CS8qIDMyIGJpdCByL28JUnggU2hvcnQgRXZlbnQgRXJyb3IgQ250ICovCisjZGVmaW5lIFhNX1JYRV9SVU5UCQkweDAzNGMJLyogMzIgYml0IHIvbwlSeCBSdW50IEV2ZW50IENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fUlhGX0xOR19FUlIJMHgwMzUwCS8qIDMyIGJpdCByL28JUnggRnJhbWUgdG9vIExvbmcgRXJyb3IgQ250ICovCisjZGVmaW5lIFhNX1JYRl9GQ1NfRVJSCTB4MDM1NAkvKiAzMiBiaXQgci9vCVJ4IEZyYW1lIENoZWNrIFNlcS4gRXJyb3IgQ250ICovCisJLyogMHgwMzU4IC0gMHgwMzVhOglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9SWEZfQ0VYX0VSUgkweDAzNWMJLyogMzIgYml0IHIvbwlSeCBDYXJyaWVyIEV4dCBFcnJvciBGcmFtZSBDbnQqLworI2RlZmluZSBYTV9SWFBfVVRJTAkJMHgwMzYwCS8qIDMyIGJpdCByL28JUnggVXRpbGl6YXRpb24gaW4gJSAqLworCS8qIDB4MDM2NCAtIDB4MDM2NjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fUlhGXzY0QgkJMHgwMzY4CS8qIDMyIGJpdCByL28JNjQgQnl0ZSBSeCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1JYRl8xMjdCCQkweDAzNmMJLyogMzIgYml0IHIvbwk2NS0xMjcgQnl0ZSBSeCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1JYRl8yNTVCCQkweDAzNzAJLyogMzIgYml0IHIvbwkxMjgtMjU1IEJ5dGUgUnggRnJhbWUgQ291bnRlciAqLworI2RlZmluZSBYTV9SWEZfNTExQgkJMHgwMzc0CS8qIDMyIGJpdCByL28JMjU2LTUxMSBCeXRlIFJ4IEZyYW1lIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fUlhGXzEwMjNCCTB4MDM3OAkvKiAzMiBiaXQgci9vCTUxMi0xMDIzIEJ5dGUgUnggRnJhbWUgQ291bnRlciovCisjZGVmaW5lIFhNX1JYRl9NQVhfU1oJMHgwMzdjCS8qIDMyIGJpdCByL28JMTAyNC1NYXhTaXplIEJ5dGUgUnggRnJhbWUgQ250Ki8KKwkvKiAweDAyZTggLSAweDAyZmU6CXJlc2VydmVkICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBYTUFDIEJpdCBEZWZpbml0aW9ucworICoKKyAqIElmIHRoZSBiaXQgYWNjZXNzIGJlaGF2aW91ciBkaWZmZXJzIGZyb20gdGhlIHJlZ2lzdGVyIGFjY2VzcyBiZWhhdmlvdXIKKyAqIChyL3csIHIvbykgdGhpcyBpcyBkb2N1bWVudGVkIGFmdGVyIHRoZSBiaXQgbnVtYmVyLgorICogVGhlIGZvbGxvd2luZyBiaXQgYWNjZXNzIGJlaGF2aW91cnMgYXJlIHVzZWQ6CisgKgkoc2MpCXNlbGYgY2xlYXJpbmcKKyAqCShybykJcmVhZCBvbmx5CisgKi8KKworLyoJWE1fTU1VX0NNRAkxNiBiaXQgci93CU1NVSBDb21tYW5kIFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNS4uMTM6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX01NVV9QSFlfUkRZCSgxPDwxMikJLyogQml0IDEyOglQSFkgUmVhZCBSZWFkeSAqLworI2RlZmluZSBYTV9NTVVfUEhZX0JVU1kJKDE8PDExKQkvKiBCaXQgMTE6CVBIWSBCdXN5ICovCisjZGVmaW5lIFhNX01NVV9JR05fUEYJKDE8PDEwKQkvKiBCaXQgMTA6CUlnbm9yZSBQYXVzZSBGcmFtZSAqLworI2RlZmluZSBYTV9NTVVfTUFDX0xCCSgxPDw5KQkvKiBCaXQgIDk6CUVuYWJsZSBNQUMgTG9vcGJhY2sgKi8KKwkJCQkJCQkJLyogQml0ICA4OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9NTVVfRlJDX0NPTAkoMTw8NykJLyogQml0ICA3OglGb3JjZSBDb2xsaXNpb24gKi8KKyNkZWZpbmUgWE1fTU1VX1NJTV9DT0wJKDE8PDYpCS8qIEJpdCAgNjoJU2ltdWxhdGUgQ29sbGlzaW9uICovCisjZGVmaW5lIFhNX01NVV9OT19QUkUJKDE8PDUpCS8qIEJpdCAgNToJTm8gTURJTyBQcmVhbWJsZSAqLworI2RlZmluZSBYTV9NTVVfR01JSV9GRAkoMTw8NCkJLyogQml0ICA0OglHTUlJIHVzZXMgRnVsbCBEdXBsZXggKi8KKyNkZWZpbmUgWE1fTU1VX1JBVF9DVFJMCSgxPDwzKQkvKiBCaXQgIDM6CUVuYWJsZSBSYXRlIENvbnRyb2wgKi8KKyNkZWZpbmUgWE1fTU1VX0dNSUlfTE9PUCAoMTw8MikJLyogQml0ICAyOglQSFkgaXMgaW4gTG9vcGJhY2sgTW9kZSAqLworI2RlZmluZSBYTV9NTVVfRU5BX1JYCSgxPDwxKQkvKiBCaXQgIDE6CUVuYWJsZSBSZWNlaXZlciAqLworI2RlZmluZSBYTV9NTVVfRU5BX1RYCSgxPDwwKQkvKiBCaXQgIDA6CUVuYWJsZSBUcmFuc21pdHRlciAqLworCisKKy8qCVhNX1RYX0NNRAkxNiBiaXQgci93CVRyYW5zbWl0IENvbW1hbmQgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDE1Li43OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9UWF9CSzJCSwkJKDE8PDYpCS8qIEJpdCAgNjoJSWdub3IgQ2FycmllciBTZW5zZSAoVHggQmsyQmspKi8KKyNkZWZpbmUgWE1fVFhfRU5DX0JZUAkoMTw8NSkJLyogQml0ICA1OglTZXQgRW5jb2RlciBpbiBCeXBhc3MgTW9kZSAqLworI2RlZmluZSBYTV9UWF9TQU1fTElORQkoMTw8NCkJLyogQml0ICA0OiAoc2MpCVN0YXJ0IHV0aWxpemF0aW9uIGNhbGN1bGF0aW9uICovCisjZGVmaW5lIFhNX1RYX05PX0dJR19NRAkoMTw8MykJLyogQml0ICAzOglEaXNhYmxlIENhcnJpZXIgRXh0ZW5zaW9uICovCisjZGVmaW5lIFhNX1RYX05PX1BSRQkoMTw8MikJLyogQml0ICAyOglEaXNhYmxlIFByZWFtYmxlIEdlbmVyYXRpb24gKi8KKyNkZWZpbmUgWE1fVFhfTk9fQ1JDCSgxPDwxKQkvKiBCaXQgIDE6CURpc2FibGUgQ1JDIEdlbmVyYXRpb24gKi8KKyNkZWZpbmUgWE1fVFhfQVVUT19QQUQJKDE8PDApCS8qIEJpdCAgMDoJRW5hYmxlIEF1dG9tYXRpYyBQYWRkaW5nICovCisKKworLyoJWE1fVFhfUlRfTElNCTE2IGJpdCByL3cJVHJhbnNtaXQgUmV0cnkgTGltaXQgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDE1Li41OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9SVF9MSU1fTVNLCTB4MWYJLyogQml0ICA0Li4wOglUeCBSZXRyeSBMaW1pdCAqLworCisKKy8qCVhNX1RYX1NUSU1FCTE2IGJpdCByL3cJVHJhbnNtaXQgU2xvdHRpbWUgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDE1Li43OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9TVElNRV9NU0sJMHg3ZgkvKiBCaXQgIDYuLjA6CVR4IFNsb3R0aW1lIGJpdHMgKi8KKworCisvKglYTV9UWF9JUEcJMTYgYml0IHIvdwlUcmFuc21pdCBJbnRlciBQYWNrZXQgR2FwICovCisJCQkJCQkJCS8qIEJpdCAxNS4uODoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fSVBHX01TSwkJMHhmZgkvKiBCaXQgIDcuLjA6CUlQRyB2YWx1ZSBiaXRzICovCisKKworLyoJWE1fUlhfQ01ECTE2IGJpdCByL3cJUmVjZWl2ZSBDb21tYW5kIFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNS4uOToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fUlhfTEVORVJSX09LICgxPDw4KQkvKiBCaXQgIDgJZG9uJ3Qgc2V0IFJ4IEVyciBiaXQgZm9yICovCisJCQkJCQkJCS8qCQlpbnJhbmdlIGVycm9yIHBhY2tldHMgKi8KKyNkZWZpbmUgWE1fUlhfQklHX1BLX09LCSgxPDw3KQkvKiBCaXQgIDcJZG9uJ3Qgc2V0IFJ4IEVyciBiaXQgZm9yICovCisJCQkJCQkJCS8qCQlqdW1ibyBwYWNrZXRzICovCisjZGVmaW5lIFhNX1JYX0lQR19DQVAJKDE8PDYpCS8qIEJpdCAgNglyZXBsLiB0eXBlIGZpZWxkIHdpdGggSVBHICovCisjZGVmaW5lIFhNX1JYX1RQX01ECQkoMTw8NSkJLyogQml0ICA1OglFbmFibGUgdHJhbnNwYXJlbnQgTW9kZSAqLworI2RlZmluZSBYTV9SWF9TVFJJUF9GQ1MJKDE8PDQpCS8qIEJpdCAgNDoJRW5hYmxlIEZDUyBTdHJpcHBpbmcgKi8KKyNkZWZpbmUgWE1fUlhfU0VMRl9SWAkoMTw8MykJLyogQml0ICAzOiAJRW5hYmxlIFJ4IG9mIG93biBwYWNrZXRzICovCisjZGVmaW5lIFhNX1JYX1NBTV9MSU5FCSgxPDwyKQkvKiBCaXQgIDI6IChzYykJU3RhcnQgdXRpbGl6YXRpb24gY2FsY3VsYXRpb24gKi8KKyNkZWZpbmUgWE1fUlhfU1RSSVBfUEFECSgxPDwxKQkvKiBCaXQgIDE6CVN0cmlwIHBhZCBieXRlcyBvZiBSeCBmcmFtZXMgKi8KKyNkZWZpbmUgWE1fUlhfRElTX0NFWFQJKDE8PDApCS8qIEJpdCAgMDoJRGlzYWJsZSBjYXJyaWVyIGV4dC4gY2hlY2sgKi8KKworCisvKglYTV9QSFlfQUREUgkxNiBiaXQgci93CVBIWSBBZGRyZXNzIFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNS4uNToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fUEhZX0FERFJfU1oJMHgxZgkvKiBCaXQgIDQuLjA6CVBIWSBBZGRyZXNzIGJpdHMgKi8KKworCisvKglYTV9HUF9QT1JUCTMyIGJpdCByL3cJR2VuZXJhbCBQdXJwb3NlIFBvcnQgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDMxLi43OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9HUF9BTklQCQkoMUw8PDYpCS8qIEJpdCAgNjogKHJvKQlBdXRvLU5lZy4gaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgWE1fR1BfRlJDX0lOVAkoMUw8PDUpCS8qIEJpdCAgNTogKHNjKQlGb3JjZSBJbnRlcnJ1cHQgKi8KKwkJCQkJCQkJLyogQml0ICA0OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9HUF9SRVNfTUFDCSgxTDw8MykJLyogQml0ICAzOiAoc2MpCVJlc2V0IE1BQyBhbmQgRklGT3MgKi8KKyNkZWZpbmUgWE1fR1BfUkVTX1NUQVQJKDFMPDwyKQkvKiBCaXQgIDI6IChzYykJUmVzZXQgdGhlIHN0YXRpc3RpY3MgbW9kdWxlICovCisJCQkJCQkJCS8qIEJpdCAgMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fR1BfSU5QX0FTUwkoMUw8PDApCS8qIEJpdCAgMDogKHJvKSBHUCBJbnB1dCBQaW4gYXNzZXJ0ZWQgKi8KKworCisvKglYTV9JTVNLCQkxNiBiaXQgci93CUludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisvKglYTV9JU1JDCQkxNiBiaXQgci9vCUludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDE1OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9JU19MTktfQUUJKDE8PDE0KSAvKiBCaXQgMTQ6CUxpbmsgQXN5bmNocm9ub3VzIEV2ZW50ICovCisjZGVmaW5lIFhNX0lTX1RYX0FCT1JUCSgxPDwxMykgLyogQml0IDEzOglUcmFuc21pdCBBYm9ydCwgbGF0ZSBDb2wuIGV0YyAqLworI2RlZmluZSBYTV9JU19GUkNfSU5UCSgxPDwxMikgLyogQml0IDEyOglGb3JjZSBJTlQgYml0IHNldCBpbiBHUCAqLworI2RlZmluZSBYTV9JU19JTlBfQVNTCSgxPDwxMSkJLyogQml0IDExOglJbnB1dCBBc3NlcnRlZCwgR1AgYml0IDAgc2V0ICovCisjZGVmaW5lIFhNX0lTX0xJUEFfUkMJKDE8PDEwKQkvKiBCaXQgMTA6CUxpbmsgUGFydG5lciByZXF1ZXN0cyBjb25maWcgKi8KKyNkZWZpbmUgWE1fSVNfUlhfUEFHRQkoMTw8OSkJLyogQml0ICA5OglQYWdlIFJlY2VpdmVkICovCisjZGVmaW5lIFhNX0lTX1RYX1BBR0UJKDE8PDgpCS8qIEJpdCAgODoJTmV4dCBQYWdlIExvYWRlZCBmb3IgVHJhbnNtaXQgKi8KKyNkZWZpbmUgWE1fSVNfQU5ECQkoMTw8NykJLyogQml0ICA3OglBdXRvLU5lZ290aWF0aW9uIERvbmUgKi8KKyNkZWZpbmUgWE1fSVNfVFNDX09WCSgxPDw2KQkvKiBCaXQgIDY6CVRpbWUgU3RhbXAgQ291bnRlciBPdmVyZmxvdyAqLworI2RlZmluZSBYTV9JU19SWENfT1YJKDE8PDUpCS8qIEJpdCAgNToJUnggQ291bnRlciBFdmVudCBPdmVyZmxvdyAqLworI2RlZmluZSBYTV9JU19UWENfT1YJKDE8PDQpCS8qIEJpdCAgNDoJVHggQ291bnRlciBFdmVudCBPdmVyZmxvdyAqLworI2RlZmluZSBYTV9JU19SWEZfT1YJKDE8PDMpCS8qIEJpdCAgMzoJUmVjZWl2ZSBGSUZPIE92ZXJmbG93ICovCisjZGVmaW5lIFhNX0lTX1RYRl9VUgkoMTw8MikJLyogQml0ICAyOglUcmFuc21pdCBGSUZPIFVuZGVycnVuICovCisjZGVmaW5lIFhNX0lTX1RYX0NPTVAJKDE8PDEpCS8qIEJpdCAgMToJRnJhbWUgVHggQ29tcGxldGUgKi8KKyNkZWZpbmUgWE1fSVNfUlhfQ09NUAkoMTw8MCkJLyogQml0ICAwOglGcmFtZSBSeCBDb21wbGV0ZSAqLworCisjZGVmaW5lIFhNX0RFRl9NU0sJKH4oWE1fSVNfSU5QX0FTUyB8IFhNX0lTX0xJUEFfUkMgfCBYTV9JU19SWF9QQUdFIHxcCisJCQlYTV9JU19BTkQgfCBYTV9JU19SWENfT1YgfCBYTV9JU19UWENfT1YgfCBYTV9JU19UWEZfVVIpKQorCisKKy8qCVhNX0hXX0NGRwkxNiBiaXQgci93CUhhcmR3YXJlIENvbmZpZyBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMTUuLiA0OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9IV19HRU5fRU9QCSgxPDwzKQkvKiBCaXQgIDM6CWdlbmVyYXRlIEVuZCBvZiBQYWNrZXQgcHVsc2UgKi8KKyNkZWZpbmUgWE1fSFdfQ09NNFNJRwkoMTw8MikJLyogQml0ICAyOgl1c2UgQ29tbWEgRGV0ZWN0IGZvciBTaWcuIERldC4qLworCQkJCQkJCQkvKiBCaXQgIDE6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX0hXX0dNSUlfTUQJKDE8PDApCS8qIEJpdCAgMDoJR01JSSBJbnRlcmZhY2Ugc2VsZWN0ZWQgKi8KKworCisvKglYTV9UWF9MT19XTQkxNiBiaXQgci93CVR4IEZJRk8gTG93IFdhdGVyIE1hcmsgKi8KKy8qCVhNX1RYX0hJX1dNCTE2IGJpdCByL3cJVHggRklGTyBIaWdoIFdhdGVyIE1hcmsgKi8KKwkJCQkJCQkJLyogQml0IDE1Li4xMAlyZXNlcnZlZCAqLworI2RlZmluZSBYTV9UWF9XTV9NU0sJMHgwMWZmCS8qIEJpdCAgOS4uIDAJVHggRklGTyBXYXRlcm1hcmsgYml0cyAqLworCisvKglYTV9UWF9USFIJMTYgYml0IHIvdwlUeCBSZXF1ZXN0IFRocmVzaG9sZCAqLworLyoJWE1fSFRfVEhSCTE2IGJpdCByL3cJSG9zdCBSZXF1ZXN0IFRocmVzaG9sZCAqLworLyoJWE1fUlhfVEhSCTE2IGJpdCByL3cJUnggUmVxdWVzdCBUaHJlc2hvbGQgKi8KKwkJCQkJCQkJLyogQml0IDE1Li4xMQlyZXNlcnZlZCAqLworI2RlZmluZSBYTV9USFJfTVNLCQkweDAzZmYJLyogQml0IDEwLi4gMAlSeC9UeCBSZXF1ZXN0IFRocmVzaG9sZCBiaXRzICovCisKKworLyoJWE1fVFhfU1RBVAkzMiBiaXQgci9vCVR4IFN0YXR1cyBMSUZPIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1NUX1ZBTElECQkoMVVMPDwzMSkJLyogQml0IDMxOglTdGF0dXMgVmFsaWQgKi8KKyNkZWZpbmUgWE1fU1RfQllURV9DTlQJKDB4M2ZmZkw8PDE3KQkvKiBCaXQgMzAuLjE3OglUeCBmcmFtZSBMZW5ndGggKi8KKyNkZWZpbmUgWE1fU1RfUkVUUllfQ05UCSgweDFmTDw8MTIpCS8qIEJpdCAxNi4uMTI6CVJldHJ5IENvdW50ICovCisjZGVmaW5lIFhNX1NUX0VYX0NPTAkoMUw8PDExKQkvKiBCaXQgMTE6CUV4Y2Vzc2l2ZSBDb2xsaXNpb25zICovCisjZGVmaW5lIFhNX1NUX0VYX0RFRgkoMUw8PDEwKQkvKiBCaXQgMTA6CUV4Y2Vzc2l2ZSBEZWZlcnJhbCAqLworI2RlZmluZSBYTV9TVF9CVVJTVAkJKDFMPDw5KQkJLyogQml0ICA5OglwLiB4bWl0dGVkIGluIGJ1cnN0IG1kKi8KKyNkZWZpbmUgWE1fU1RfREVGRVIJCSgxTDw8OCkJCS8qIEJpdCAgODoJcGFja2V0IHdhcyBkZWZlcmVkICovCisjZGVmaW5lIFhNX1NUX0JDCQkoMUw8PDcpCQkvKiBCaXQgIDc6CUJyb2FkY2FzdCBwYWNrZXQgKi8KKyNkZWZpbmUgWE1fU1RfTUMJCSgxTDw8NikJCS8qIEJpdCAgNjoJTXVsdGljYXN0IHBhY2tldCAqLworI2RlZmluZSBYTV9TVF9VQwkJKDFMPDw1KQkJLyogQml0ICA1OglVbmljYXN0IHBhY2tldCAqLworI2RlZmluZSBYTV9TVF9UWF9VUgkJKDFMPDw0KQkJLyogQml0ICA0OglGSUZPIFVuZGVycnVuIG9jY3VyZWQgKi8KKyNkZWZpbmUgWE1fU1RfQ1NfRVJSCSgxTDw8MykJCS8qIEJpdCAgMzoJQ2FycmllciBTZW5zZSBFcnJvciAqLworI2RlZmluZSBYTV9TVF9MQVRfQ09MCSgxTDw8MikJCS8qIEJpdCAgMjoJTGF0ZSBDb2xsaXNpb24gRXJyb3IgKi8KKyNkZWZpbmUgWE1fU1RfTVVMX0NPTAkoMUw8PDEpCQkvKiBCaXQgIDE6CU11bHRpcGxlIENvbGxpc2lvbnMgKi8KKyNkZWZpbmUgWE1fU1RfU0dOX0NPTAkoMUw8PDApCQkvKiBCaXQgIDA6CVNpbmdsZSBDb2xsaXNpb24gKi8KKworLyoJWE1fUlhfTE9fV00JMTYgYml0IHIvdwlSZWNlaXZlIExvdyBXYXRlciBNYXJrICovCisvKglYTV9SWF9ISV9XTQkxNiBiaXQgci93CVJlY2VpdmUgSGlnaCBXYXRlciBNYXJrICovCisJCQkJCQkJCQkvKiBCaXQgMTUuLjExOglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9SWF9XTV9NU0sJMHgwM2ZmCQkvKiBCaXQgMTEuLiAwOglSeCBGSUZPIFdhdGVybWFyayBiaXRzICovCisKKworLyoJWE1fREVWX0lECTMyIGJpdCByL28JRGV2aWNlIElEIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX0RFVl9PVUkJKDB4MDBmZmZmZmZVTDw8OCkJLyogQml0IDMxLi44OglEZXZpY2UgT1VJICovCisjZGVmaW5lIFhNX0RFVl9SRVYJKDB4MDdMIDw8IDUpCQkvKiBCaXQgIDcuLjU6CUNoaXAgUmV2IE51bSAqLworCisKKy8qCVhNX01PREUJCTMyIGJpdCByL3cJTW9kZSBSZWdpc3RlciAqLworCQkJCQkJCQkJLyogQml0IDMxLi4yNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fTURfRU5BX1JFSgkoMUw8PDI2KQkvKiBCaXQgMjY6CUVuYWJsZSBGcmFtZSBSZWplY3QgKi8KKyNkZWZpbmUgWE1fTURfU1BPRV9FCSgxTDw8MjUpCS8qIEJpdCAyNToJU2VuZCBQYXVzZSBvbiBFZGdlICovCisJCQkJCQkJCQkvKiAJCWV4dGVybiBnZW5lcmF0ZWQgKi8KKyNkZWZpbmUgWE1fTURfVFhfUkVQCSgxTDw8MjQpCS8qIEJpdCAyNDoJVHJhbnNtaXQgUmVwZWF0ZXIgTW9kZSAqLworI2RlZmluZSBYTV9NRF9TUE9GRl9JCSgxTDw8MjMpCS8qIEJpdCAyMzoJU2VuZCBQYXVzZSBvbiBGSUZPIGZ1bGwgKi8KKwkJCQkJCQkJCS8qCQlpbnRlcm4gZ2VuZXJhdGVkICovCisjZGVmaW5lIFhNX01EX0xFX1NUVwkoMUw8PDIyKQkvKiBCaXQgMjI6CVJ4IFN0YXQgV29yZCBpbiBMaXR0bGUgRW5kaWFuICovCisjZGVmaW5lIFhNX01EX1RYX0NPTlQJKDFMPDwyMSkJLyogQml0IDIxOglTZW5kIENvbnRpbnVvdXMgKi8KKyNkZWZpbmUgWE1fTURfVFhfUEFVU0UJKDFMPDwyMCkJLyogQml0IDIwOiAoc2MpCVNlbmQgUGF1c2UgRnJhbWUgKi8KKyNkZWZpbmUgWE1fTURfQVRTCQkoMUw8PDE5KQkvKiBCaXQgMTk6CUFwcGVuZCBUaW1lIFN0YW1wICovCisjZGVmaW5lIFhNX01EX1NQT0xfSQkoMUw8PDE4KQkvKiBCaXQgMTg6CVNlbmQgUGF1c2Ugb24gTG93ICovCisJCQkJCQkJCQkvKgkJaW50ZXJuIGdlbmVyYXRlZCAqLworI2RlZmluZSBYTV9NRF9TUE9IX0kJKDFMPDwxNykJLyogQml0IDE3OglTZW5kIFBhdXNlIG9uIEhpZ2ggKi8KKwkJCQkJCQkJCS8qCQlpbnRlcm4gZ2VuZXJhdGVkICovCisjZGVmaW5lIFhNX01EX0NBUAkJKDFMPDwxNikJLyogQml0IDE2OglDaGVjayBBZGRyZXNzIFBhaXIgKi8KKyNkZWZpbmUgWE1fTURfRU5BX0hBU0gJKDFMPDwxNSkJLyogQml0IDE1OglFbmFibGUgSGFzaGluZyAqLworI2RlZmluZSBYTV9NRF9DU0EJCSgxTDw8MTQpCS8qIEJpdCAxNDoJQ2hlY2sgU3RhdGlvbiBBZGRyZXNzICovCisjZGVmaW5lIFhNX01EX0NBQQkJKDFMPDwxMykJLyogQml0IDEzOglDaGVjayBBZGRyZXNzIEFycmF5ICovCisjZGVmaW5lIFhNX01EX1JYX01DVFJMCSgxTDw8MTIpCS8qIEJpdCAxMjoJUnggTUFDIENvbnRyb2wgRnJhbWUgKi8KKyNkZWZpbmUgWE1fTURfUlhfUlVOVAkoMUw8PDExKQkvKiBCaXQgMTE6CVJ4IFJ1bnQgRnJhbWVzICovCisjZGVmaW5lIFhNX01EX1JYX0lSTEUJKDFMPDwxMCkJLyogQml0IDEwOglSeCBpbiBSYW5nZSBMZW4gRXJyIEZyYW1lICovCisjZGVmaW5lIFhNX01EX1JYX0xPTkcJKDFMPDw5KQkJLyogQml0ICA5OglSeCBMb25nIEZyYW1lICovCisjZGVmaW5lIFhNX01EX1JYX0NSQ0UJKDFMPDw4KQkJLyogQml0ICA4OglSeCBDUkMgRXJyb3IgRnJhbWUgKi8KKyNkZWZpbmUgWE1fTURfUlhfRVJSCSgxTDw8NykJCS8qIEJpdCAgNzoJUnggRXJyb3IgRnJhbWUgKi8KKyNkZWZpbmUgWE1fTURfRElTX1VDCSgxTDw8NikJCS8qIEJpdCAgNjoJRGlzYWJsZSBSeCBVbmljYXN0ICovCisjZGVmaW5lIFhNX01EX0RJU19NQwkoMUw8PDUpCQkvKiBCaXQgIDU6CURpc2FibGUgUnggTXVsdGljYXN0ICovCisjZGVmaW5lIFhNX01EX0RJU19CQwkoMUw8PDQpCQkvKiBCaXQgIDQ6CURpc2FibGUgUnggQnJvYWRjYXN0ICovCisjZGVmaW5lIFhNX01EX0VOQV9QUk9NCSgxTDw8MykJCS8qIEJpdCAgMzoJRW5hYmxlIFByb21pc2N1b3VzICovCisjZGVmaW5lIFhNX01EX0VOQV9CRQkoMUw8PDIpCQkvKiBCaXQgIDI6CUVuYWJsZSBCaWcgRW5kaWFuICovCisjZGVmaW5lIFhNX01EX0ZURgkJKDFMPDwxKQkJLyogQml0ICAxOiAoc2MpCUZsdXNoIFR4IEZJRk8gKi8KKyNkZWZpbmUgWE1fTURfRlJGCQkoMUw8PDApCQkvKiBCaXQgIDA6IChzYykJRmx1c2ggUnggRklGTyAqLworCisjZGVmaW5lIFhNX1BBVVNFX01PREUJKFhNX01EX1NQT0VfRSB8IFhNX01EX1NQT0xfSSB8IFhNX01EX1NQT0hfSSkKKyNkZWZpbmUgWE1fREVGX01PREUJCShYTV9NRF9SWF9SVU5UIHwgWE1fTURfUlhfSVJMRSB8IFhNX01EX1JYX0xPTkcgfFwKKwkJCQlYTV9NRF9SWF9DUkNFIHwgWE1fTURfUlhfRVJSIHwgWE1fTURfQ1NBIHwgWE1fTURfQ0FBKQorCisvKglYTV9TVEFUX0NNRAkxNiBiaXQgci93CVN0YXRpc3RpY3MgQ29tbWFuZCBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMTYuLjY6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX1NDX1NOUF9SWEMJKDE8PDUpCS8qIEJpdCAgNTogKHNjKQlTbmFwIFJ4IENvdW50ZXJzICovCisjZGVmaW5lIFhNX1NDX1NOUF9UWEMJKDE8PDQpCS8qIEJpdCAgNDogKHNjKQlTbmFwIFR4IENvdW50ZXJzICovCisjZGVmaW5lIFhNX1NDX0NQX1JYQwkoMTw8MykJLyogQml0ICAzOiAJQ29weSBSeCBDb3VudGVycyBDb250aW51b3VzbHkgKi8KKyNkZWZpbmUgWE1fU0NfQ1BfVFhDCSgxPDwyKQkvKiBCaXQgIDI6CUNvcHkgVHggQ291bnRlcnMgQ29udGludW91c2x5ICovCisjZGVmaW5lIFhNX1NDX0NMUl9SWEMJKDE8PDEpCS8qIEJpdCAgMTogKHNjKQlDbGVhciBSeCBDb3VudGVycyAqLworI2RlZmluZSBYTV9TQ19DTFJfVFhDCSgxPDwwKQkvKiBCaXQgIDA6IChzYykgQ2xlYXIgVHggQ291bnRlcnMgKi8KKworCisvKglYTV9SWF9DTlRfRVYJMzIgYml0IHIvbwlSeCBDb3VudGVyIEV2ZW50IFJlZ2lzdGVyICovCisvKglYTV9SWF9FVl9NU0sJMzIgYml0IHIvdwlSeCBDb3VudGVyIEV2ZW50IE1hc2sgKi8KKyNkZWZpbmUgWE1SX01BWF9TWl9PVgkoMVVMPDwzMSkJLyogQml0IDMxOgkxMDI0LU1heFNpemUgUnggQ250IE92Ki8KKyNkZWZpbmUgWE1SXzEwMjNCX09WCSgxTDw8MzApCS8qIEJpdCAzMDoJNTEyLTEwMjNCeXRlIFJ4IENudCBPdiovCisjZGVmaW5lIFhNUl81MTFCX09WCQkoMUw8PDI5KQkvKiBCaXQgMjk6CTI1Ni01MTEgQnl0ZSBSeCBDbnQgT3YqLworI2RlZmluZSBYTVJfMjU1Ql9PVgkJKDFMPDwyOCkJLyogQml0IDI4OgkxMjgtMjU1IEJ5dGUgUnggQ250IE92Ki8KKyNkZWZpbmUgWE1SXzEyN0JfT1YJCSgxTDw8MjcpCS8qIEJpdCAyNzoJNjUtMTI3IEJ5dGUgUnggQ250IE92ICovCisjZGVmaW5lIFhNUl82NEJfT1YJCSgxTDw8MjYpCS8qIEJpdCAyNjoJNjQgQnl0ZSBSeCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1SX1VUSUxfT1YJCSgxTDw8MjUpCS8qIEJpdCAyNToJUnggVXRpbCBDbnQgT3ZlcmZsb3cgKi8KKyNkZWZpbmUgWE1SX1VUSUxfVVIJCSgxTDw8MjQpCS8qIEJpdCAyNDoJUnggVXRpbCBDbnQgVW5kZXJydW4gKi8KKyNkZWZpbmUgWE1SX0NFWF9FUlJfT1YJKDFMPDwyMykJLyogQml0IDIzOglDRVhUIEVyciBDbnQgT3YgKi8KKwkJCQkJCQkJCS8qIEJpdCAyMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1SX0ZDU19FUlJfT1YJKDFMPDwyMSkJLyogQml0IDIxOglSeCBGQ1MgRXJyb3IgQ250IE92ICovCisjZGVmaW5lIFhNUl9MTkdfRVJSX09WCSgxTDw8MjApCS8qIEJpdCAyMDoJUnggdG9vIExvbmcgRXJyIENudCBPdiovCisjZGVmaW5lIFhNUl9SVU5UX09WCQkoMUw8PDE5KQkvKiBCaXQgMTk6CVJ1bnQgRXZlbnQgQ250IE92ICovCisjZGVmaW5lIFhNUl9TSFRfRVJSX09WCSgxTDw8MTgpCS8qIEJpdCAxODoJUnggU2hvcnQgRXYgRXJyIENudCBPdiovCisjZGVmaW5lIFhNUl9TWU1fRVJSX09WCSgxTDw8MTcpCS8qIEJpdCAxNzoJUnggU3ltIEVyciBDbnQgT3YgKi8KKwkJCQkJCQkJCS8qIEJpdCAxNjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1SX0NBUl9FUlJfT1YJKDFMPDwxNSkJLyogQml0IDE1OglSeCBDYXJyIEV2IEVyciBDbnQgT3YgKi8KKyNkZWZpbmUgWE1SX0pBQl9QS1RfT1YJKDFMPDwxNCkJLyogQml0IDE0OglSeCBKYWJiIFBhY2tldCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1SX0ZJRk9fT1YJCSgxTDw8MTMpCS8qIEJpdCAxMzoJUnggRklGTyBPdiBFdiBDbnQgT3YgKi8KKyNkZWZpbmUgWE1SX0ZSQV9FUlJfT1YJKDFMPDwxMikJLyogQml0IDEyOglSeCBGcmFtaW5nIEVyciBDbnQgT3YgKi8KKyNkZWZpbmUgWE1SX0ZNSVNTX09WCSgxTDw8MTEpCS8qIEJpdCAxMToJUnggTWlzc2VkIEV2IENudCBPdiAqLworI2RlZmluZSBYTVJfQlVSU1QJCSgxTDw8MTApCS8qIEJpdCAxMDoJUnggQnVyc3QgRXZlbnQgQ250IE92ICovCisjZGVmaW5lIFhNUl9JTlZfTU9DCQkoMUw8PDkpCQkvKiBCaXQgIDk6CVJ4IHdpdGggaW52LiBNQUMgT0MgT3YqLworI2RlZmluZSBYTVJfSU5WX01QCQkoMUw8PDgpCQkvKiBCaXQgIDg6CVJ4IGludiBQYXVzZSBGcmFtZSBPdiAqLworI2RlZmluZSBYTVJfTUNUUkxfT1YJKDFMPDw3KQkJLyogQml0ICA3OglSeCBNQUMgQ3RybC1GIENudCBPdiAqLworI2RlZmluZSBYTVJfTVBBVVNFX09WCSgxTDw8NikJCS8qIEJpdCAgNjoJUnggUGF1c2UgTUFDIEN0cmwtRiBPdiovCisjZGVmaW5lIFhNUl9VQ19PS19PVgkoMUw8PDUpCQkvKiBCaXQgIDU6CVJ4IFVuaWNhc3QgRnJhbWUgQ250T3YqLworI2RlZmluZSBYTVJfTUNfT0tfT1YJKDFMPDw0KQkJLyogQml0ICA0OglSeCBNdWx0aWNhc3QgQ250IE92ICovCisjZGVmaW5lIFhNUl9CQ19PS19PVgkoMUw8PDMpCQkvKiBCaXQgIDM6CVJ4IEJyb2FkY2FzdCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1SX09LX0xPX09WCSgxTDw8MikJCS8qIEJpdCAgMjoJT2N0ZXRzIFJ4IE9LIExvdyBDbnRPdiovCisjZGVmaW5lIFhNUl9PS19ISV9PVgkoMUw8PDEpCQkvKiBCaXQgIDE6CU9jdGV0cyBSeCBPSyBIaSBDbnQgT3YqLworI2RlZmluZSBYTVJfT0tfT1YJCSgxTDw8MCkJCS8qIEJpdCAgMDoJRnJhbWVzIFJlY2VpdmVkIE9rIE92ICovCisKKyNkZWZpbmUgWE1SX0RFRl9NU0sJCShYTVJfT0tfTE9fT1YgfCBYTVJfT0tfSElfT1YpCisKKy8qCVhNX1RYX0NOVF9FVgkzMiBiaXQgci9vCVR4IENvdW50ZXIgRXZlbnQgUmVnaXN0ZXIgKi8KKy8qCVhNX1RYX0VWX01TSwkzMiBiaXQgci93CVR4IENvdW50ZXIgRXZlbnQgTWFzayAqLworCQkJCQkJCQkJLyogQml0IDMxLi4yNjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1UX01BWF9TWl9PVgkoMUw8PDI1KQkvKiBCaXQgMjU6CTEwMjQtTWF4U2l6ZSBUeCBDbnQgT3YqLworI2RlZmluZSBYTVRfMTAyM0JfT1YJKDFMPDwyNCkJLyogQml0IDI0Ogk1MTItMTAyM0J5dGUgVHggQ250IE92Ki8KKyNkZWZpbmUgWE1UXzUxMUJfT1YJCSgxTDw8MjMpCS8qIEJpdCAyMzoJMjU2LTUxMSBCeXRlIFR4IENudCBPdiovCisjZGVmaW5lIFhNVF8yNTVCX09WCQkoMUw8PDIyKQkvKiBCaXQgMjI6CTEyOC0yNTUgQnl0ZSBUeCBDbnQgT3YqLworI2RlZmluZSBYTVRfMTI3Ql9PVgkJKDFMPDwyMSkJLyogQml0IDIxOgk2NS0xMjcgQnl0ZSBUeCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UXzY0Ql9PVgkJKDFMPDwyMCkJLyogQml0IDIwOgk2NCBCeXRlIFR4IENudCBPdiAqLworI2RlZmluZSBYTVRfVVRJTF9PVgkJKDFMPDwxOSkJLyogQml0IDE5OglUeCBVdGlsIENudCBPdmVyZmxvdyAqLworI2RlZmluZSBYTVRfVVRJTF9VUgkJKDFMPDwxOCkJLyogQml0IDE4OglUeCBVdGlsIENudCBVbmRlcnJ1biAqLworI2RlZmluZSBYTVRfQ1NfRVJSX09WCSgxTDw8MTcpCS8qIEJpdCAxNzoJVHggQ2FyciBTZW4gRXJyIENudCBPdiovCisjZGVmaW5lIFhNVF9GSUZPX1VSX09WCSgxTDw8MTYpCS8qIEJpdCAxNjoJVHggRklGTyBVciBFdiBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX0VYX0RFRl9PVgkoMUw8PDE1KQkvKiBCaXQgMTU6CVR4IEV4IERlZmVyYWxsIENudCBPdiAqLworI2RlZmluZSBYTVRfREVGCQkJKDFMPDwxNCkJLyogQml0IDE0OglUeCBEZWZlcnJlZCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX0xBVF9DT0xfT1YJKDFMPDwxMykJLyogQml0IDEzOglUeCBMYXRlIENvbCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX0FCT19DT0xfT1YJKDFMPDwxMikJLyogQml0IDEyOglUeCBhYm8gZHVldG8gRXggQ29sIE92Ki8KKyNkZWZpbmUgWE1UX01VTF9DT0xfT1YJKDFMPDwxMSkJLyogQml0IDExOglUeCBNdWx0IENvbCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX1NOR19DT0wJCSgxTDw8MTApCS8qIEJpdCAxMDoJVHggU2luZ2xlIENvbCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX01DVFJMX09WCSgxTDw8OSkJCS8qIEJpdCAgOToJVHggTUFDIEN0cmwgQ291bnRlciBPdiovCisjZGVmaW5lIFhNVF9NUEFVU0UJCSgxTDw8OCkJCS8qIEJpdCAgODoJVHggUGF1c2UgTUFDIEN0cmwtRiBPdiovCisjZGVmaW5lIFhNVF9CVVJTVAkJKDFMPDw3KQkJLyogQml0ICA3OglUeCBCdXJzdCBFdmVudCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX0xPTkcJCSgxTDw8NikJCS8qIEJpdCAgNjoJVHggTG9uZyBGcmFtZSBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX1VDX09LX09WCSgxTDw8NSkJCS8qIEJpdCAgNToJVHggVW5pY2FzdCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX01DX09LX09WCSgxTDw8NCkJCS8qIEJpdCAgNDoJVHggTXVsdGljYXN0IENudCBPdiAqLworI2RlZmluZSBYTVRfQkNfT0tfT1YJKDFMPDwzKQkJLyogQml0ICAzOglUeCBCcm9hZGNhc3QgQ250IE92ICovCisjZGVmaW5lIFhNVF9PS19MT19PVgkoMUw8PDIpCQkvKiBCaXQgIDI6CU9jdGV0cyBUeCBPSyBMb3cgQ250T3YqLworI2RlZmluZSBYTVRfT0tfSElfT1YJKDFMPDwxKQkJLyogQml0ICAxOglPY3RldHMgVHggT0sgSGkgQ250IE92Ki8KKyNkZWZpbmUgWE1UX09LX09WCQkoMUw8PDApCQkvKiBCaXQgIDA6CUZyYW1lcyBUeCBPayBPdiAqLworCisjZGVmaW5lIFhNVF9ERUZfTVNLCQkoWE1UX09LX0xPX09WIHwgWE1UX09LX0hJX09WKQorCisvKgorICogUmVjZWl2ZSBGcmFtZSBTdGF0dXMgRW5jb2RpbmcKKyAqLworI2RlZmluZSBYTVJfRlNfTEVOCSgweDNmZmZVTDw8MTgpCS8qIEJpdCAzMS4uMTg6CVJ4IEZyYW1lIExlbmd0aCAqLworI2RlZmluZSBYTVJfRlNfMkxfVkxBTgkoMUw8PDE3KQkvKiBCaXQgMTc6CXRhZ2dlZCB3aCAyTGV2IFZMQU4gSUQqLworI2RlZmluZSBYTVJfRlNfMUxfVkxBTgkoMUw8PDE2KQkvKiBCaXQgMTY6CXRhZ2dlZCB3aCAxTGV2IFZMQU4gSUQqLworI2RlZmluZSBYTVJfRlNfQkMJCSgxTDw8MTUpCS8qIEJpdCAxNToJQnJvYWRjYXN0IEZyYW1lICovCisjZGVmaW5lIFhNUl9GU19NQwkJKDFMPDwxNCkJLyogQml0IDE0OglNdWx0aWNhc3QgRnJhbWUgKi8KKyNkZWZpbmUgWE1SX0ZTX1VDCQkoMUw8PDEzKQkvKiBCaXQgMTM6CVVuaWNhc3QgRnJhbWUgKi8KKwkJCQkJCQkJCS8qIEJpdCAxMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1SX0ZTX0JVUlNUCSgxTDw8MTEpCS8qIEJpdCAxMToJQnVyc3QgTW9kZSAqLworI2RlZmluZSBYTVJfRlNfQ0VYX0VSUgkoMUw8PDEwKQkvKiBCaXQgMTA6CUNhcnJpZXIgRXh0LiBFcnJvciAqLworI2RlZmluZSBYTVJfRlNfODAyXzMJKDFMPDw5KQkJLyogQml0ICA5Ogk4MDIuMyBGcmFtZSAqLworI2RlZmluZSBYTVJfRlNfQ09MX0VSUgkoMUw8PDgpCQkvKiBCaXQgIDg6CUNvbGxpc2lvbiBFcnJvciAqLworI2RlZmluZSBYTVJfRlNfQ0FSX0VSUgkoMUw8PDcpCQkvKiBCaXQgIDc6CUNhcnJpZXIgRXZlbnQgRXJyb3IgKi8KKyNkZWZpbmUgWE1SX0ZTX0xFTl9FUlIJKDFMPDw2KQkJLyogQml0ICA2OglJbi1SYW5nZSBMZW5ndGggRXJyb3IgKi8KKyNkZWZpbmUgWE1SX0ZTX0ZSQV9FUlIJKDFMPDw1KQkJLyogQml0ICA1OglGcmFtaW5nIEVycm9yICovCisjZGVmaW5lIFhNUl9GU19SVU5UCQkoMUw8PDQpCQkvKiBCaXQgIDQ6CVJ1bnQgRnJhbWUgKi8KKyNkZWZpbmUgWE1SX0ZTX0xOR19FUlIJKDFMPDwzKQkJLyogQml0ICAzOglHaWFudCAoSnVtYm8pIEZyYW1lICovCisjZGVmaW5lIFhNUl9GU19GQ1NfRVJSCSgxTDw8MikJCS8qIEJpdCAgMjoJRnJhbWUgQ2hlY2sgU2VxdSBFcnIgKi8KKyNkZWZpbmUgWE1SX0ZTX0VSUgkJKDFMPDwxKQkJLyogQml0ICAxOglGcmFtZSBFcnJvciAqLworI2RlZmluZSBYTVJfRlNfTUNUUkwJKDFMPDwwKQkJLyogQml0ICAwOglNQUMgQ29udHJvbCBQYWNrZXQgKi8KKworLyoKKyAqIFhNUl9GU19FUlIgd2lsbCBiZSBzZXQgaWYKKyAqCVhNUl9GU19GQ1NfRVJSLCBYTVJfRlNfTE5HX0VSUiwgWE1SX0ZTX1JVTlQsCisgKglYTVJfRlNfRlJBX0VSUiwgWE1SX0ZTX0xFTl9FUlIsIG9yIFhNUl9GU19DRVhfRVJSCisgKiBpcyBzZXQuIFhNUl9GU19MTkdfRVJSIGFuZCBYTVJfRlNfTEVOX0VSUiB3aWxsIGlzc3VlCisgKiBYTVJfRlNfRVJSIHVubGVzcyB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIFJlY2VpdmUgQ29tbWFuZAorICogUmVnaXN0ZXIgaXMgc2V0LgorICovCisjZGVmaW5lIFhNUl9GU19BTllfRVJSCVhNUl9GU19FUlIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBYTUFDLVBIWSBSZWdpc3RlcnMsIGluZGlyZWN0IGFkZHJlc3NlZCBvdmVyIHRoZSBYTUFDCisgKi8KKyNkZWZpbmUgUEhZX1hNQUNfQ1RSTAkJMHgwMAkvKiAxNiBiaXQgci93CVBIWSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9YTUFDX1NUQVQJCTB4MDEJLyogMTYgYml0IHIvdwlQSFkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9YTUFDX0lEMAkJMHgwMgkvKiAxNiBiaXQgci9vCVBIWSBJRDAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX1hNQUNfSUQxCQkweDAzCS8qIDE2IGJpdCByL28JUEhZIElEMSBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfWE1BQ19BVU5FX0FEVgkweDA0CS8qIDE2IGJpdCByL3cJQXV0by1OZWcuIEFkdmVydGlzZW1lbnQgKi8KKyNkZWZpbmUgUEhZX1hNQUNfQVVORV9MUAkweDA1CS8qIDE2IGJpdCByL28JTGluayBQYXJ0bmVyIEFiaSBSZWcgKi8KKyNkZWZpbmUgUEhZX1hNQUNfQVVORV9FWFAJMHgwNgkvKiAxNiBiaXQgci9vCUF1dG8tTmVnLiBFeHBhbnNpb24gUmVnICovCisjZGVmaW5lIFBIWV9YTUFDX05FUEcJCTB4MDcJLyogMTYgYml0IHIvdwlOZXh0IFBhZ2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX1hNQUNfTkVQR19MUAkweDA4CS8qIDE2IGJpdCByL28JTmV4dCBQYWdlIExpbmsgUGFydG5lciAqLworCS8qIDB4MDkgLSAweDBlOgkJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX1hNQUNfRVhUX1NUQVQJMHgwZgkvKiAxNiBiaXQgci9vCUV4dCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX1hNQUNfUkVTX0FCSQkweDEwCS8qIDE2IGJpdCByL28JUEhZIFJlc29sdmVkIEFiaWxpdHkgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBCcm9hZGNvbS1QSFkgUmVnaXN0ZXJzLCBpbmRpcmVjdCBhZGRyZXNzZWQgb3ZlciBYTUFDCisgKi8KKyNkZWZpbmUgUEhZX0JDT01fQ1RSTAkJMHgwMAkvKiAxNiBiaXQgci93CVBIWSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9CQ09NX1NUQVQJCTB4MDEJLyogMTYgYml0IHIvbwlQSFkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9CQ09NX0lEMAkJMHgwMgkvKiAxNiBiaXQgci9vCVBIWSBJRDAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX0JDT01fSUQxCQkweDAzCS8qIDE2IGJpdCByL28JUEhZIElEMSBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfQkNPTV9BVU5FX0FEVgkweDA0CS8qIDE2IGJpdCByL3cJQXV0by1OZWcuIEFkdmVydGlzZW1lbnQgKi8KKyNkZWZpbmUgUEhZX0JDT01fQVVORV9MUAkweDA1CS8qIDE2IGJpdCByL28JTGluayBQYXJ0IEFiaWxpdHkgUmVnICovCisjZGVmaW5lIFBIWV9CQ09NX0FVTkVfRVhQCTB4MDYJLyogMTYgYml0IHIvbwlBdXRvLU5lZy4gRXhwYW5zaW9uIFJlZyAqLworI2RlZmluZSBQSFlfQkNPTV9ORVBHCQkweDA3CS8qIDE2IGJpdCByL3cJTmV4dCBQYWdlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9CQ09NX05FUEdfTFAJMHgwOAkvKiAxNiBiaXQgci9vCU5leHQgUGFnZSBMaW5rIFBhcnRuZXIgKi8KKwkvKiBCcm9hZGNvbS1zcGVjaWZpYyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUEhZX0JDT01fMTAwMFRfQ1RSTAkweDA5CS8qIDE2IGJpdCByL3cJMTAwMEJhc2UtVCBDdHJsIFJlZyAqLworI2RlZmluZSBQSFlfQkNPTV8xMDAwVF9TVEFUCTB4MGEJLyogMTYgYml0IHIvbwkxMDAwQmFzZS1UIFN0YXR1cyBSZWcgKi8KKwkvKiAweDBiIC0gMHgwZToJCXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CQ09NX0VYVF9TVEFUCTB4MGYJLyogMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnICovCisjZGVmaW5lIFBIWV9CQ09NX1BfRVhUX0NUUkwJMHgxMAkvKiAxNiBiaXQgci93CVBIWSBFeHRlbmRlZCBDdHJsIFJlZyAqLworI2RlZmluZSBQSFlfQkNPTV9QX0VYVF9TVEFUCTB4MTEJLyogMTYgYml0IHIvbwlQSFkgRXh0ZW5kZWQgU3RhdCBSZWcgKi8KKyNkZWZpbmUgUEhZX0JDT01fUkVfQ1RSCQkweDEyCS8qIDE2IGJpdCByL3cJUmVjZWl2ZSBFcnJvciBDb3VudGVyICovCisjZGVmaW5lIFBIWV9CQ09NX0ZDX0NUUgkJMHgxMwkvKiAxNiBiaXQgci93CUZhbHNlIENhcnJpZXIgU2Vuc2UgQ250ICovCisjZGVmaW5lIFBIWV9CQ09NX1JOT19DVFIJMHgxNAkvKiAxNiBiaXQgci93CVJlY2VpdmVyIE5PVF9PSyBDbnQgKi8KKwkvKiAweDE1IC0gMHgxNzoJCXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CQ09NX0FVWF9DVFJMCTB4MTgJLyogMTYgYml0IHIvdwlBdXhpbGlhcnkgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgUEhZX0JDT01fQVVYX1NUQVQJMHgxOQkvKiAxNiBiaXQgci9vCUF1eGlsaWFyeSBTdGF0IFN1bW1hcnkgKi8KKyNkZWZpbmUgUEhZX0JDT01fSU5UX1NUQVQJMHgxYQkvKiAxNiBiaXQgci9vCUludGVycnVwdCBTdGF0dXMgUmVnICovCisjZGVmaW5lIFBIWV9CQ09NX0lOVF9NQVNLCTB4MWIJLyogMTYgYml0IHIvdwlJbnRlcnJ1cHQgTWFzayBSZWcgKi8KKwkvKiAweDFjOgkJcmVzZXJ2ZWQgKi8KKwkvKiAweDFkIC0gMHgxZjoJCXRlc3QgcmVnaXN0ZXJzICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogTWFydmVsLVBIWSBSZWdpc3RlcnMsIGluZGlyZWN0IGFkZHJlc3NlZCBvdmVyIEdNQUMKKyAqLworI2RlZmluZSBQSFlfTUFSVl9DVFJMCQkweDAwCS8qIDE2IGJpdCByL3cJUEhZIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX01BUlZfU1RBVAkJMHgwMQkvKiAxNiBiaXQgci9vCVBIWSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX01BUlZfSUQwCQkweDAyCS8qIDE2IGJpdCByL28JUEhZIElEMCBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTUFSVl9JRDEJCTB4MDMJLyogMTYgYml0IHIvbwlQSFkgSUQxIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9NQVJWX0FVTkVfQURWCTB4MDQJLyogMTYgYml0IHIvdwlBdXRvLU5lZy4gQWR2ZXJ0aXNlbWVudCAqLworI2RlZmluZSBQSFlfTUFSVl9BVU5FX0xQCTB4MDUJLyogMTYgYml0IHIvbwlMaW5rIFBhcnQgQWJpbGl0eSBSZWcgKi8KKyNkZWZpbmUgUEhZX01BUlZfQVVORV9FWFAJMHgwNgkvKiAxNiBiaXQgci9vCUF1dG8tTmVnLiBFeHBhbnNpb24gUmVnICovCisjZGVmaW5lIFBIWV9NQVJWX05FUEcJCTB4MDcJLyogMTYgYml0IHIvdwlOZXh0IFBhZ2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX01BUlZfTkVQR19MUAkweDA4CS8qIDE2IGJpdCByL28JTmV4dCBQYWdlIExpbmsgUGFydG5lciAqLworCS8qIE1hcnZlbC1zcGVjaWZpYyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUEhZX01BUlZfMTAwMFRfQ1RSTAkweDA5CS8qIDE2IGJpdCByL3cJMTAwMEJhc2UtVCBDdHJsIFJlZyAqLworI2RlZmluZSBQSFlfTUFSVl8xMDAwVF9TVEFUCTB4MGEJLyogMTYgYml0IHIvbwkxMDAwQmFzZS1UIFN0YXR1cyBSZWcgKi8KKwkvKiAweDBiIC0gMHgwZToJCXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9NQVJWX0VYVF9TVEFUCTB4MGYJLyogMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnICovCisjZGVmaW5lIFBIWV9NQVJWX1BIWV9DVFJMCTB4MTAJLyogMTYgYml0IHIvdwlQSFkgU3BlY2lmaWMgQ3RybCBSZWcgKi8KKyNkZWZpbmUgUEhZX01BUlZfUEhZX1NUQVQJMHgxMQkvKiAxNiBiaXQgci9vCVBIWSBTcGVjaWZpYyBTdGF0IFJlZyAqLworI2RlZmluZSBQSFlfTUFSVl9JTlRfTUFTSwkweDEyCS8qIDE2IGJpdCByL3cJSW50ZXJydXB0IE1hc2sgUmVnICovCisjZGVmaW5lIFBIWV9NQVJWX0lOVF9TVEFUCTB4MTMJLyogMTYgYml0IHIvbwlJbnRlcnJ1cHQgU3RhdHVzIFJlZyAqLworI2RlZmluZSBQSFlfTUFSVl9FWFRfQ1RSTAkweDE0CS8qIDE2IGJpdCByL3cJRXh0LiBQSFkgU3BlY2lmaWMgQ3RybCAqLworI2RlZmluZSBQSFlfTUFSVl9SWEVfQ05UCTB4MTUJLyogMTYgYml0IHIvdwlSZWNlaXZlIEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgUEhZX01BUlZfRVhUX0FEUgkweDE2CS8qIDE2IGJpdCByL3cJRXh0LiBBZC4gZm9yIENhYmxlIERpYWcuICovCisJLyogMHgxNzoJCXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9NQVJWX0xFRF9DVFJMCTB4MTgJLyogMTYgYml0IHIvdwlMRUQgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgUEhZX01BUlZfTEVEX09WRVIJMHgxOQkvKiAxNiBiaXQgci93CU1hbnVhbCBMRUQgT3ZlcnJpZGUgUmVnICovCisjZGVmaW5lIFBIWV9NQVJWX0VYVF9DVFJMXzIJMHgxYQkvKiAxNiBiaXQgci93CUV4dC4gUEhZIFNwZWNpZmljIEN0cmwgMiAqLworI2RlZmluZSBQSFlfTUFSVl9FWFRfUF9TVEFUCTB4MWIJLyogMTYgYml0IHIvdwlFeHQuIFBIWSBTcGVjLiBTdGF0IFJlZyAqLworI2RlZmluZSBQSFlfTUFSVl9DQUJMRV9ESUFHCTB4MWMJLyogMTYgYml0IHIvbwlDYWJsZSBEaWFnbm9zdGljIFJlZyAqLworCS8qIDB4MWQgLSAweDFmOgkJcmVzZXJ2ZWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBMZXZlbCBPbmUtUEhZIFJlZ2lzdGVycywgaW5kaXJlY3QgYWRkcmVzc2VkIG92ZXIgWE1BQworICovCisjZGVmaW5lIFBIWV9MT05FX0NUUkwJCTB4MDAJLyogMTYgYml0IHIvdwlQSFkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTE9ORV9TVEFUCQkweDAxCS8qIDE2IGJpdCByL28JUEhZIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTE9ORV9JRDAJCTB4MDIJLyogMTYgYml0IHIvbwlQSFkgSUQwIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9MT05FX0lEMQkJMHgwMwkvKiAxNiBiaXQgci9vCVBIWSBJRDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX0xPTkVfQVVORV9BRFYJMHgwNAkvKiAxNiBiaXQgci93CUF1dG8tTmVnLiBBZHZlcnRpc2VtZW50ICovCisjZGVmaW5lIFBIWV9MT05FX0FVTkVfTFAJMHgwNQkvKiAxNiBiaXQgci9vCUxpbmsgUGFydCBBYmlsaXR5IFJlZyAqLworI2RlZmluZSBQSFlfTE9ORV9BVU5FX0VYUAkweDA2CS8qIDE2IGJpdCByL28JQXV0by1OZWcuIEV4cGFuc2lvbiBSZWcgKi8KKyNkZWZpbmUgUEhZX0xPTkVfTkVQRwkJMHgwNwkvKiAxNiBiaXQgci93CU5leHQgUGFnZSBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTE9ORV9ORVBHX0xQCTB4MDgJLyogMTYgYml0IHIvbwlOZXh0IFBhZ2UgTGluayBQYXJ0bmVyICovCisJLyogTGV2ZWwgT25lLXNwZWNpZmljIHJlZ2lzdGVycyAqLworI2RlZmluZSBQSFlfTE9ORV8xMDAwVF9DVFJMCTB4MDkJLyogMTYgYml0IHIvdwkxMDAwQmFzZS1UIENvbnRyb2wgUmVnKi8KKyNkZWZpbmUgUEhZX0xPTkVfMTAwMFRfU1RBVAkweDBhCS8qIDE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICovCisJLyogMHgwYiAtMHgwZToJCXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9MT05FX0VYVF9TVEFUCTB4MGYJLyogMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnICovCisjZGVmaW5lIFBIWV9MT05FX1BPUlRfQ0ZHCTB4MTAJLyogMTYgYml0IHIvdwlQb3J0IENvbmZpZ3VyYXRpb24gUmVnKi8KKyNkZWZpbmUgUEhZX0xPTkVfUV9TVEFUCQkweDExCS8qIDE2IGJpdCByL28JUXVpY2sgU3RhdHVzIFJlZyAqLworI2RlZmluZSBQSFlfTE9ORV9JTlRfRU5BQgkweDEyCS8qIDE2IGJpdCByL3cJSW50ZXJydXB0IEVuYWJsZSBSZWcgKi8KKyNkZWZpbmUgUEhZX0xPTkVfSU5UX1NUQVQJMHgxMwkvKiAxNiBiaXQgci9vCUludGVycnVwdCBTdGF0dXMgUmVnICovCisjZGVmaW5lIFBIWV9MT05FX0xFRF9DRkcJMHgxNAkvKiAxNiBiaXQgci93CUxFRCBDb25maWd1cmF0aW9uIFJlZyAqLworI2RlZmluZSBQSFlfTE9ORV9QT1JUX0NUUkwJMHgxNQkvKiAxNiBiaXQgci93CVBvcnQgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgUEhZX0xPTkVfQ0lNCQkweDE2CS8qIDE2IGJpdCByL28JQ0lNIFJlZyAqLworCS8qIDB4MTcgLTB4MWM6CQlyZXNlcnZlZCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIE5hdGlvbmFsLVBIWSBSZWdpc3RlcnMsIGluZGlyZWN0IGFkZHJlc3NlZCBvdmVyIFhNQUMKKyAqLworI2RlZmluZSBQSFlfTkFUX0NUUkwJCTB4MDAJLyogMTYgYml0IHIvdwlQSFkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTkFUX1NUQVQJCTB4MDEJLyogMTYgYml0IHIvdwlQSFkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9OQVRfSUQwCQkJMHgwMgkvKiAxNiBiaXQgci9vCVBIWSBJRDAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX05BVF9JRDEJCQkweDAzCS8qIDE2IGJpdCByL28JUEhZIElEMSBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTkFUX0FVTkVfQURWCTB4MDQJLyogMTYgYml0IHIvdwlBdXRvLU5lZy4gQWR2ZXJ0aXNlbWVudCAqLworI2RlZmluZSBQSFlfTkFUX0FVTkVfTFAJCTB4MDUJLyogMTYgYml0IHIvbwlMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKi8KKyNkZWZpbmUgUEhZX05BVF9BVU5FX0VYUAkweDA2CS8qIDE2IGJpdCByL28JQXV0by1OZWcuIEV4cGFuc2lvbiBSZWcgKi8KKyNkZWZpbmUgUEhZX05BVF9ORVBHCQkweDA3CS8qIDE2IGJpdCByL3cJTmV4dCBQYWdlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9OQVRfTkVQR19MUAkJMHgwOAkvKiAxNiBiaXQgci9vCU5leHQgUGFnZSBMaW5rIFBhcnRuZXIgUmVnICovCisJLyogTmF0aW9uYWwtc3BlY2lmaWMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBIWV9OQVRfMTAwMFRfQ1RSTAkweDA5CS8qIDE2IGJpdCByL3cJMTAwMEJhc2UtVCBDb250cm9sIFJlZyAqLworI2RlZmluZSBQSFlfTkFUXzEwMDBUX1NUQVQJMHgwYQkvKiAxNiBiaXQgci9vCTEwMDBCYXNlLVQgU3RhdHVzIFJlZyAqLworCS8qIDB4MGIgLTB4MGU6CQlyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTkFUX0VYVF9TVEFUCTB4MGYJLyogMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX05BVF9FWFRfQ1RSTDEJMHgxMAkvKiAxNiBiaXQgci9vCUV4dGVuZGVkIENvbnRyb2wgUmVnMSAqLworI2RlZmluZSBQSFlfTkFUX1FfU1RBVDEJCTB4MTEJLyogMTYgYml0IHIvbwlRdWljayBTdGF0dXMgUmVnMSAqLworI2RlZmluZSBQSFlfTkFUXzEwQl9PUAkJMHgxMgkvKiAxNiBiaXQgci9vCTEwQmFzZS1UIE9wZXJhdGlvbnMgUmVnICovCisjZGVmaW5lIFBIWV9OQVRfRVhUX0NUUkwyCTB4MTMJLyogMTYgYml0IHIvbwlFeHRlbmRlZCBDb250cm9sIFJlZzEgKi8KKyNkZWZpbmUgUEhZX05BVF9RX1NUQVQyCQkweDE0CS8qIDE2IGJpdCByL28JUXVpY2sgU3RhdHVzIFJlZzIgKi8KKwkvKiAweDE1IC0weDE4OgkJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX05BVF9QSFlfQUREUgkweDE5CS8qIDE2IGJpdCByL28JUEhZIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogUEhZIGJpdCBkZWZpbml0aW9ucworICogQml0cyBkZWZpbmVkIGFzIFBIWV9YXy4uLiwgUEhZX0JfLi4uLCBQSFlfTF8uLi4gb3IgUEhZX05fLi4uIGFyZQorICogWE1BQy9Ccm9hZGNvbS9MZXZlbE9uZS9OYXRpb25hbC9NYXJ2ZWxsLXNwZWNpZmljLgorICogQWxsIG90aGVyIGFyZSBnZW5lcmFsLgorICovCisKKy8qKioqKiAgUEhZX1hNQUNfQ1RSTAkxNiBiaXQgci93CVBIWSBDb250cm9sIFJlZ2lzdGVyICoqKioqLworLyoqKioqICBQSFlfQkNPTV9DVFJMCTE2IGJpdCByL3cJUEhZIENvbnRyb2wgUmVnaXN0ZXIgKioqKiovCisvKioqKiogIFBIWV9NQVJWX0NUUkwJMTYgYml0IHIvdwlQSFkgU3RhdHVzIFJlZ2lzdGVyICoqKioqLworLyoqKioqICBQSFlfTE9ORV9DVFJMCTE2IGJpdCByL3cJUEhZIENvbnRyb2wgUmVnaXN0ZXIgKioqKiovCisjZGVmaW5lIFBIWV9DVF9SRVNFVAkoMTw8MTUpCS8qIEJpdCAxNTogKHNjKQljbGVhciBhbGwgUEhZIHJlbGF0ZWQgcmVncyAqLworI2RlZmluZSBQSFlfQ1RfTE9PUAkJKDE8PDE0KQkvKiBCaXQgMTQ6CWVuYWJsZSBMb29wYmFjayBvdmVyIFBIWSAqLworI2RlZmluZSBQSFlfQ1RfU1BTX0xTQgkoMTw8MTMpIC8qIEJpdCAxMzogKEJDLEwxKSBTcGVlZCBzZWxlY3QsIGxvd2VyIGJpdCAqLworI2RlZmluZSBQSFlfQ1RfQU5FCQkoMTw8MTIpCS8qIEJpdCAxMjoJQXV0by1OZWdvdGlhdGlvbiBFbmFibGVkICovCisjZGVmaW5lIFBIWV9DVF9QRE9XTgkoMTw8MTEpCS8qIEJpdCAxMTogKEJDLEwxKSBQb3dlciBEb3duIE1vZGUgKi8KKyNkZWZpbmUgUEhZX0NUX0lTT0wJCSgxPDwxMCkJLyogQml0IDEwOiAoQkMsTDEpIElzb2xhdGUgTW9kZSAqLworI2RlZmluZSBQSFlfQ1RfUkVfQ0ZHCSgxPDw5KQkvKiBCaXQgIDk6IChzYykgUmVzdGFydCBBdXRvLU5lZ290aWF0aW9uICovCisjZGVmaW5lIFBIWV9DVF9EVVBfTUQJKDE8PDgpCS8qIEJpdCAgODoJRHVwbGV4IE1vZGUgKi8KKyNkZWZpbmUgUEhZX0NUX0NPTF9UU1QJKDE8PDcpCS8qIEJpdCAgNzogKEJDLEwxKSBDb2xsaXNpb24gVGVzdCBlbmFibGVkICovCisjZGVmaW5lIFBIWV9DVF9TUFNfTVNCCSgxPDw2KQkvKiBCaXQgIDY6IChCQyxMMSkgU3BlZWQgc2VsZWN0LCB1cHBlciBiaXQgKi8KKwkJCQkJCQkJLyogQml0ICA1Li4wOglyZXNlcnZlZCAqLworCisjZGVmaW5lIFBIWV9DVF9TUDEwMDAJUEhZX0NUX1NQU19NU0IJLyogZW5hYmxlIHNwZWVkIG9mIDEwMDAgTWJwcyAqLworI2RlZmluZSBQSFlfQ1RfU1AxMDAJUEhZX0NUX1NQU19MU0IJLyogZW5hYmxlIHNwZWVkIG9mICAxMDAgTWJwcyAqLworI2RlZmluZSBQSFlfQ1RfU1AxMAkJKDApCQkJCS8qIGVuYWJsZSBzcGVlZCBvZiAgIDEwIE1icHMgKi8KKworCisvKioqKiogIFBIWV9YTUFDX1NUQVQJMTYgYml0IHIvdwlQSFkgU3RhdHVzIFJlZ2lzdGVyICoqKioqLworLyoqKioqICBQSFlfQkNPTV9TVEFUCTE2IGJpdCByL3cJUEhZIFN0YXR1cyBSZWdpc3RlciAqKioqKi8KKy8qKioqKiAgUEhZX01BUlZfU1RBVAkxNiBiaXQgci93CVBIWSBTdGF0dXMgUmVnaXN0ZXIgKioqKiovCisvKioqKiogIFBIWV9MT05FX1NUQVQJMTYgYml0IHIvdwlQSFkgU3RhdHVzIFJlZ2lzdGVyICoqKioqLworCQkJCQkJCQkvKiBCaXQgMTUuLjk6CXJlc2VydmVkICovCisJCQkJLyoJKEJDL0wxKSAxMDAvMTAgTWJwcyBjYXAgYml0cyBpZ25vcmVkKi8KKyNkZWZpbmUgUEhZX1NUX0VYVF9TVAkoMTw8OCkJLyogQml0ICA4OglFeHRlbmRlZCBTdGF0dXMgUHJlc2VudCAqLworCQkJCQkJCQkvKiBCaXQgIDc6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9TVF9QUkVfU1VQCSgxPDw2KQkvKiBCaXQgIDY6IChCQy9MMSkgcHJlYW1ibGUgc3VwcHJlc3Npb24gKi8KKyNkZWZpbmUgUEhZX1NUX0FOX09WRVIJKDE8PDUpCS8qIEJpdCAgNToJQXV0by1OZWdvdGlhdGlvbiBPdmVyICovCisjZGVmaW5lIFBIWV9TVF9SRU1fRkxUCSgxPDw0KQkvKiBCaXQgIDQ6CVJlbW90ZSBGYXVsdCBDb25kaXRpb24gT2NjdXJlZCAqLworI2RlZmluZSBQSFlfU1RfQU5fQ0FQCSgxPDwzKQkvKiBCaXQgIDM6CUF1dG8tTmVnb3RpYXRpb24gQ2FwYWJpbGl0eSAqLworI2RlZmluZSBQSFlfU1RfTFNZTkMJKDE8PDIpCS8qIEJpdCAgMjoJTGluayBTeW5jaHJvbml6ZWQgKi8KKyNkZWZpbmUgUEhZX1NUX0pBQl9ERVQJKDE8PDEpCS8qIEJpdCAgMTogKEJDL0wxKSBKYWJiZXIgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUEhZX1NUX0VYVF9SRUcJKDE8PDApCS8qIEJpdCAgMDoJRXh0ZW5kZWQgUmVnaXN0ZXIgYXZhaWxhYmxlICovCisKKworLyoqKioqCVBIWV9YTUFDX0lEMQkJMTYgYml0IHIvbwlQSFkgSUQxIFJlZ2lzdGVyICovCisvKioqKioJUEhZX0JDT01fSUQxCQkxNiBiaXQgci9vCVBIWSBJRDEgUmVnaXN0ZXIgKi8KKy8qKioqKglQSFlfTUFSVl9JRDEJCTE2IGJpdCByL28JUEhZIElEMSBSZWdpc3RlciAqLworLyoqKioqCVBIWV9MT05FX0lEMQkJMTYgYml0IHIvbwlQSFkgSUQxIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9JMV9PVUlfTVNLCSgweDNmPDwxMCkJLyogQml0IDE1Li4xMDoJT3JnYW5pemF0aW9uIFVuaXF1ZSBJRCAqLworI2RlZmluZSBQSFlfSTFfTU9EX05VTQkoMHgzZjw8NCkJLyogQml0ICA5Li4gNDoJTW9kZWwgTnVtYmVyICovCisjZGVmaW5lIFBIWV9JMV9SRVZfTVNLCTB4MGYJCS8qIEJpdCAgMy4uIDA6CVJldmlzaW9uIE51bWJlciAqLworCisvKiBkaWZmZXJlbnQgQnJvYWRjb20gUEhZIElkcyAqLworI2RlZmluZSBQSFlfQkNPTV9JRDFfQTEJCTB4NjA0MQorI2RlZmluZSBQSFlfQkNPTV9JRDFfQjIJCTB4NjA0MworI2RlZmluZSBQSFlfQkNPTV9JRDFfQzAJCTB4NjA0NAorI2RlZmluZSBQSFlfQkNPTV9JRDFfQzUJCTB4NjA0NworCisKKy8qKioqKiAgUEhZX1hNQUNfQVVORV9BRFYJMTYgYml0IHIvdwlBdXRvLU5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgKioqKiovCisvKioqKiogIFBIWV9YTUFDX0FVTkVfTFAJMTYgYml0IHIvbwlMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9BTl9OWFRfUEcJKDE8PDE1KQkvKiBCaXQgMTU6CVJlcXVlc3QgTmV4dCBQYWdlICovCisjZGVmaW5lIFBIWV9YX0FOX0FDSwkoMTw8MTQpCS8qIEJpdCAxNDogKHJvKQlBY2tub3dsZWRnZSBSZWNlaXZlZCAqLworI2RlZmluZSBQSFlfWF9BTl9SRkIJKDM8PDEyKQkvKiBCaXQgMTMuLjEyOglSZW1vdGUgRmF1bHQgQml0cyAqLworCQkJCQkJCQkvKiBCaXQgMTEuLiA5OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfWF9BTl9QQVVTRQkoMzw8NykJLyogQml0ICA4Li4gNzoJUGF1c2UgQml0cyAqLworI2RlZmluZSBQSFlfWF9BTl9IRAkJKDE8PDYpCS8qIEJpdCAgNjoJSGFsZiBEdXBsZXggKi8KKyNkZWZpbmUgUEhZX1hfQU5fRkQJCSgxPDw1KQkvKiBCaXQgIDU6CUZ1bGwgRHVwbGV4ICovCisJCQkJCQkJCS8qIEJpdCAgNC4uIDA6CXJlc2VydmVkICovCisKKy8qKioqKiAgUEhZX0JDT01fQVVORV9BRFYJMTYgYml0IHIvdwlBdXRvLU5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgKioqKiovCisvKioqKiogIFBIWV9CQ09NX0FVTkVfTFAJMTYgYml0IHIvbwlMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKioqKiovCisvKglQSFlfQU5fTlhUX1BHCQkoc2VlIFhNQUMpIEJpdCAxNToJUmVxdWVzdCBOZXh0IFBhZ2UgKi8KKwkJCQkJCQkJLyogQml0IDE0OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQl9BTl9SRgkJKDE8PDEzKQkvKiBCaXQgMTM6CVJlbW90ZSBGYXVsdCAqLworCQkJCQkJCQkvKiBCaXQgMTI6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CX0FOX0FTUAkoMTw8MTEpCS8qIEJpdCAxMToJQXN5bW1ldHJpYyBQYXVzZSAqLworI2RlZmluZSBQSFlfQl9BTl9QQwkJKDE8PDEwKQkvKiBCaXQgMTA6CVBhdXNlIENhcGFibGUgKi8KKwkJCQkJCQkJLyogQml0ICA5Li41OgkxMDAvMTAgQlQgY2FwIGJpdHMgaW5nbm9yZWQgKi8KKyNkZWZpbmUgUEhZX0JfQU5fU0VMCTB4MWYJLyogQml0IDQuLjA6CVNlbGVjdG9yIEZpZWxkLCAwMDAwMT1FdGhlcm5ldCovCisKKy8qKioqKiAgUEhZX0xPTkVfQVVORV9BRFYJMTYgYml0IHIvdwlBdXRvLU5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgKioqKiovCisvKioqKiogIFBIWV9MT05FX0FVTkVfTFAJMTYgYml0IHIvbwlMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKioqKiovCisvKglQSFlfQU5fTlhUX1BHCQkoc2VlIFhNQUMpIEJpdCAxNToJUmVxdWVzdCBOZXh0IFBhZ2UgKi8KKwkJCQkJCQkJLyogQml0IDE0OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTF9BTl9SRgkJKDE8PDEzKQkvKiBCaXQgMTM6CVJlbW90ZSBGYXVsdCAqLworCQkJCQkJCQkvKiBCaXQgMTI6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9MX0FOX0FTUAkoMTw8MTEpCS8qIEJpdCAxMToJQXN5bW1ldHJpYyBQYXVzZSAqLworI2RlZmluZSBQSFlfTF9BTl9QQwkJKDE8PDEwKQkvKiBCaXQgMTA6CVBhdXNlIENhcGFibGUgKi8KKwkJCQkJCQkJLyogQml0ICA5Li41OgkxMDAvMTAgQlQgY2FwIGJpdHMgaW5nbm9yZWQgKi8KKyNkZWZpbmUgUEhZX0xfQU5fU0VMCTB4MWYJLyogQml0IDQuLjA6CVNlbGVjdG9yIEZpZWxkLCAwMDAwMT1FdGhlcm5ldCovCisKKy8qKioqKiAgUEhZX05BVF9BVU5FX0FEVgkxNiBiaXQgci93CUF1dG8tTmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCAqKioqKi8KKy8qKioqKiAgUEhZX05BVF9BVU5FX0xQCQkxNiBiaXQgci9vCUxpbmsgUGFydG5lciBBYmlsaXR5IFJlZyAqKioqKi8KKy8qCVBIWV9BTl9OWFRfUEcJCShzZWUgWE1BQykgQml0IDE1OglSZXF1ZXN0IE5leHQgUGFnZSAqLworCQkJCQkJCQkvKiBCaXQgMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9OX0FOX1JGCQkoMTw8MTMpCS8qIEJpdCAxMzoJUmVtb3RlIEZhdWx0ICovCisJCQkJCQkJCS8qIEJpdCAxMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX05fQU5fMTAwRgkoMTw8MTEpCS8qIEJpdCAxMToJMTAwQmFzZS1UMiBGRCBTdXBwb3J0ICovCisjZGVmaW5lIFBIWV9OX0FOXzEwMEgJKDE8PDEwKQkvKiBCaXQgMTA6CTEwMEJhc2UtVDIgSEQgU3VwcG9ydCAqLworCQkJCQkJCQkvKiBCaXQgIDkuLjU6CTEwMC8xMCBCVCBjYXAgYml0cyBpbmdub3JlZCAqLworI2RlZmluZSBQSFlfTl9BTl9TRUwJMHgxZgkvKiBCaXQgNC4uMDoJU2VsZWN0b3IgRmllbGQsIDAwMDAxPUV0aGVybmV0Ki8KKworLyogZmllbGQgdHlwZSBkZWZpbml0aW9uIGZvciBQSFlfeF9BTl9TRUwgKi8KKyNkZWZpbmUgUEhZX1NFTF9UWVBFCTB4MDEJLyogMDAwMDEgPSBFdGhlcm5ldCAqLworCisvKioqKiogIFBIWV9YTUFDX0FVTkVfRVhQCTE2IGJpdCByL28JQXV0by1OZWdvdGlhdGlvbiBFeHBhbnNpb24gUmVnICoqKioqLworCQkJCQkJCQkvKiBCaXQgMTUuLjQ6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9BTkVfTFBfTlAJKDE8PDMpCS8qIEJpdCAgMzoJTGluayBQYXJ0bmVyIGNhbiBOZXh0IFBhZ2UgKi8KKyNkZWZpbmUgUEhZX0FORV9MT0NfTlAJKDE8PDIpCS8qIEJpdCAgMjoJTG9jYWwgUEhZIGNhbiBOZXh0IFBhZ2UgKi8KKyNkZWZpbmUgUEhZX0FORV9SWF9QRwkoMTw8MSkJLyogQml0ICAxOglQYWdlIFJlY2VpdmVkICovCisJCQkJCQkJCS8qIEJpdCAgMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfQkNPTV9BVU5FX0VYUAkxNiBiaXQgci9vCUF1dG8tTmVnb3RpYXRpb24gRXhwYW5zaW9uIFJlZyAqKioqKi8KKy8qKioqKiAgUEhZX0xPTkVfQVVORV9FWFAJMTYgYml0IHIvbwlBdXRvLU5lZ290aWF0aW9uIEV4cGFuc2lvbiBSZWcgKioqKiovCisvKioqKiogIFBIWV9NQVJWX0FVTkVfRVhQCTE2IGJpdCByL28JQXV0by1OZWdvdGlhdGlvbiBFeHBhbnNpb24gUmVnICoqKioqLworCQkJCQkJCQkvKiBCaXQgMTUuLjU6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9BTkVfUEFSX0RGCSgxPDw0KQkvKiBCaXQgIDQ6CVBhcmFsbGVsIERldGVjdGlvbiBGYXVsdCAqLworLyoJUEhZX0FORV9MUF9OUAkJKHNlZSBYTUFDKSBCaXQgIDM6CUxpbmsgUGFydG5lciBjYW4gTmV4dCBQYWdlICovCisvKglQSFlfQU5FX0xPQ19OUAkJKHNlZSBYTUFDKSBCaXQgIDI6CUxvY2FsIFBIWSBjYW4gTmV4dCBQYWdlICovCisvKglQSFlfQU5FX1JYX1BHCQkoc2VlIFhNQUMpIEJpdCAgMToJUGFnZSBSZWNlaXZlZCAqLworI2RlZmluZSBQSFlfQU5FX0xQX0NBUAkoMTw8MCkJLyogQml0ICAwOglMaW5rIFBhcnRuZXIgQXV0by1OZWcuIENhcC4gKi8gCQorCisvKioqKiogIFBIWV9YTUFDX05FUEcJCTE2IGJpdCByL3cJTmV4dCBQYWdlIFJlZ2lzdGVyICoqKioqLworLyoqKioqICBQSFlfQkNPTV9ORVBHCQkxNiBiaXQgci93CU5leHQgUGFnZSBSZWdpc3RlciAqKioqKi8KKy8qKioqKiAgUEhZX0xPTkVfTkVQRwkJMTYgYml0IHIvdwlOZXh0IFBhZ2UgUmVnaXN0ZXIgKioqKiovCisvKioqKiogIFBIWV9YTUFDX05FUEdfTFAJMTYgYml0IHIvbwlOZXh0IFBhZ2UgTGluayBQYXJ0bmVyICoqKioqLworLyoqKioqICBQSFlfQkNPTV9ORVBHX0xQCTE2IGJpdCByL28JTmV4dCBQYWdlIExpbmsgUGFydG5lciAqKioqKi8KKy8qKioqKiAgUEhZX0xPTkVfTkVQR19MUAkxNiBiaXQgci9vCU5leHQgUGFnZSBMaW5rIFBhcnRuZXIgKioqKiovCisjZGVmaW5lIFBIWV9OUF9NT1JFCQkoMTw8MTUpCS8qIEJpdCAxNToJTW9yZSwgTmV4dCBQYWdlcyB0byBmb2xsb3cgKi8KKyNkZWZpbmUgUEhZX05QX0FDSzEJCSgxPDwxNCkJLyogQml0IDE0OiAocm8pCUFjazEsIGZvciByZWNlaXZpbmcgYSBtZXNzYWdlICovCisjZGVmaW5lIFBIWV9OUF9NU0dfVkFMCSgxPDwxMykJLyogQml0IDEzOglNZXNzYWdlIFBhZ2UgdmFsaWQgKi8KKyNkZWZpbmUgUEhZX05QX0FDSzIJCSgxPDwxMikJLyogQml0IDEyOglBY2syLCBjb21wbHkgd2l0aCBtc2cgY29udGVudCAqLworI2RlZmluZSBQSFlfTlBfVE9HCQkoMTw8MTEpCS8qIEJpdCAxMToJVG9nZ2xlIEJpdCwgZW5zdXJlIHN5bmMgKi8KKyNkZWZpbmUgUEhZX05QX01TRwkJMHgwN2ZmCS8qIEJpdCAxMC4uMDoJTWVzc2FnZSBmcm9tL3RvIExpbmsgUGFydG5lciAqLworCisvKgorICogWE1BQy1TcGVjaWZpYworICovCisvKioqKiogIFBIWV9YTUFDX0VYVF9TVEFUCTE2IGJpdCByL3cJRXh0ZW5kZWQgU3RhdHVzIFJlZ2lzdGVyICoqKioqLworI2RlZmluZSBQSFlfWF9FWF9GRAkJKDE8PDE1KQkvKiBCaXQgMTU6CURldmljZSBTdXBwb3J0cyBGdWxsIER1cGxleCAqLworI2RlZmluZSBQSFlfWF9FWF9IRAkJKDE8PDE0KQkvKiBCaXQgMTQ6CURldmljZSBTdXBwb3J0cyBIYWxmIER1cGxleCAqLworCQkJCQkJCQkvKiBCaXQgMTMuLjA6CXJlc2VydmVkICovCisKKy8qKioqKiAgUEhZX1hNQUNfUkVTX0FCSQkxNiBiaXQgci9vCVBIWSBSZXNvbHZlZCBBYmlsaXR5ICoqKioqLworCQkJCQkJCQkvKiBCaXQgMTUuLjk6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9YX1JTX1BBVVNFCSgzPDw3KQkvKiBCaXQgIDguLjc6CXNlbGVjdGVkIFBhdXNlIE1vZGUgKi8KKyNkZWZpbmUgUEhZX1hfUlNfSEQJCSgxPDw2KQkvKiBCaXQgIDY6CUhhbGYgRHVwbGV4IE1vZGUgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgUEhZX1hfUlNfRkQJCSgxPDw1KQkvKiBCaXQgIDU6CUZ1bGwgRHVwbGV4IE1vZGUgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgUEhZX1hfUlNfQUJMTUlTICgxPDw0KQkvKiBCaXQgIDQ6CWR1cGxleCBvciBwYXVzZSBjYXAgbWlzbWF0Y2ggKi8KKyNkZWZpbmUgUEhZX1hfUlNfUEFVTUlTICgxPDwzKQkvKiBCaXQgIDM6CXBhdXNlIGNhcGFiaWxpdHkgbWlzbWF0Y2ggKi8KKwkJCQkJCQkJLyogQml0ICAyLi4wOglyZXNlcnZlZCAqLworLyoKKyAqIFJlbW90ZSBGYXVsdCBCaXRzIChQSFlfWF9BTl9SRkIpIGVuY29kaW5nCisgKi8KKyNkZWZpbmUgWF9SRkJfT0sJCSgwPDwxMikJLyogQml0IDEzLi4xMglObyBlcnJvcnMsIExpbmsgT0sgKi8KKyNkZWZpbmUgWF9SRkJfTEYJCSgxPDwxMikJLyogQml0IDEzLi4xMglMaW5rIEZhaWx1cmUgKi8KKyNkZWZpbmUgWF9SRkJfT0ZGCQkoMjw8MTIpCS8qIEJpdCAxMy4uMTIJT2ZmbGluZSAqLworI2RlZmluZSBYX1JGQl9BTl9FUlIJKDM8PDEyKQkvKiBCaXQgMTMuLjEyCUF1dG8tTmVnb3RpYXRpb24gRXJyb3IgKi8KKworLyoKKyAqIFBhdXNlIEJpdHMgKFBIWV9YX0FOX1BBVVNFIGFuZCBQSFlfWF9SU19QQVVTRSkgZW5jb2RpbmcKKyAqLworI2RlZmluZSBQSFlfWF9QX05PX1BBVVNFCSgwPDw3KQkvKiBCaXQgIDguLjc6CW5vIFBhdXNlIE1vZGUgKi8KKyNkZWZpbmUgUEhZX1hfUF9TWU1fTUQJCSgxPDw3KQkvKiBCaXQgIDguLjc6CXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9YX1BfQVNZTV9NRAkJKDI8PDcpCS8qIEJpdCAgOC4uNzoJYXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9YX1BfQk9USF9NRAkJKDM8PDcpCS8qIEJpdCAgOC4uNzoJYm90aCBQYXVzZSBNb2RlICovCisKKworLyoKKyAqIEJyb2FkY29tLVNwZWNpZmljCisgKi8KKy8qKioqKiAgUEhZX0JDT01fMTAwMFRfQ1RSTAkxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9CXzEwMDBDX1RFU1QJKDc8PDEzKQkvKiBCaXQgMTUuLjEzOglUZXN0IE1vZGVzICovCisjZGVmaW5lIFBIWV9CXzEwMDBDX01TRQkJKDE8PDEyKQkvKiBCaXQgMTI6CU1hc3Rlci9TbGF2ZSBFbmFibGUgKi8KKyNkZWZpbmUgUEhZX0JfMTAwMENfTVNDCQkoMTw8MTEpCS8qIEJpdCAxMToJTS9TIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgUEhZX0JfMTAwMENfUkQJCSgxPDwxMCkJLyogQml0IDEwOglSZXBlYXRlci9EVEUgKi8KKyNkZWZpbmUgUEhZX0JfMTAwMENfQUZECQkoMTw8OSkJLyogQml0ICA5OglBZHZlcnRpc2UgRnVsbCBEdXBsZXggKi8KKyNkZWZpbmUgUEhZX0JfMTAwMENfQUhECQkoMTw8OCkJLyogQml0ICA4OglBZHZlcnRpc2UgSGFsZiBEdXBsZXggKi8KKwkJCQkJCQkJCS8qIEJpdCAgNy4uMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfQkNPTV8xMDAwVF9TVEFUCTE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICoqKioqLworLyoqKioqICBQSFlfTUFSVl8xMDAwVF9TVEFUCTE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICoqKioqLworI2RlZmluZSBQSFlfQl8xMDAwU19NU0YJCSgxPDwxNSkJLyogQml0IDE1OglNYXN0ZXIvU2xhdmUgRmF1bHQgKi8KKyNkZWZpbmUgUEhZX0JfMTAwMFNfTVNSCQkoMTw8MTQpCS8qIEJpdCAxNDoJTWFzdGVyL1NsYXZlIFJlc3VsdCAqLworI2RlZmluZSBQSFlfQl8xMDAwU19MUlMJCSgxPDwxMykJLyogQml0IDEzOglMb2NhbCBSZWNlaXZlciBTdGF0dXMgKi8KKyNkZWZpbmUgUEhZX0JfMTAwMFNfUlJTCQkoMTw8MTIpCS8qIEJpdCAxMjoJUmVtb3RlIFJlY2VpdmVyIFN0YXR1cyAqLworI2RlZmluZSBQSFlfQl8xMDAwU19MUF9GRAkoMTw8MTEpCS8qIEJpdCAxMToJTGluayBQYXJ0bmVyIGNhbiBGRCAqLworI2RlZmluZSBQSFlfQl8xMDAwU19MUF9IRAkoMTw8MTApCS8qIEJpdCAxMDoJTGluayBQYXJ0bmVyIGNhbiBIRCAqLworCQkJCQkJCQkJLyogQml0ICA5Li44OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQl8xMDAwU19JRUMJCTB4ZmYJLyogQml0ICA3Li4wOglJZGxlIEVycm9yIENvdW50ICovCisKKy8qKioqKiAgUEhZX0JDT01fRVhUX1NUQVQJMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKioqKiovCisjZGVmaW5lIFBIWV9CX0VTX1hfRkRfQ0FQCSgxPDwxNSkJLyogQml0IDE1OgkxMDAwQmFzZS1YIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgUEhZX0JfRVNfWF9IRF9DQVAJKDE8PDE0KQkvKiBCaXQgMTQ6CTEwMDBCYXNlLVggSEQgY2FwYWJsZSAqLworI2RlZmluZSBQSFlfQl9FU19UX0ZEX0NBUAkoMTw8MTMpCS8qIEJpdCAxMzoJMTAwMEJhc2UtVCBGRCBjYXBhYmxlICovCisjZGVmaW5lIFBIWV9CX0VTX1RfSERfQ0FQCSgxPDwxMikJLyogQml0IDEyOgkxMDAwQmFzZS1UIEhEIGNhcGFibGUgKi8KKwkJCQkJCQkJCS8qIEJpdCAxMS4uMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfQkNPTV9QX0VYVF9DVFJMCTE2IGJpdCByL3cJUEhZIEV4dGVuZGVkIENvbnRyb2wgUmVnICoqKioqLworI2RlZmluZSBQSFlfQl9QRUNfTUFDX1BIWQkoMTw8MTUpCS8qIEJpdCAxNToJMTBCSVQvR01JLUludGVyZmFjZSAqLworI2RlZmluZSBQSFlfQl9QRUNfRElTX0NST1NTCSgxPDwxNCkJLyogQml0IDE0OglEaXNhYmxlIE1ESSBDcm9zc292ZXIgKi8KKyNkZWZpbmUgUEhZX0JfUEVDX1RYX0RJUwkoMTw8MTMpCS8qIEJpdCAxMzoJVHggb3V0cHV0IERpc2FibGVkICovCisjZGVmaW5lIFBIWV9CX1BFQ19JTlRfRElTCSgxPDwxMikJLyogQml0IDEyOglJbnRlcnJ1cHRzIERpc2FibGVkICovCisjZGVmaW5lIFBIWV9CX1BFQ19GX0lOVAkJKDE8PDExKQkvKiBCaXQgMTE6CUZvcmNlIEludGVycnVwdCAqLworI2RlZmluZSBQSFlfQl9QRUNfQllfNDUJCSgxPDwxMCkJLyogQml0IDEwOglCeXBhc3MgNEI1Qi1EZWNvZGVyICovCisjZGVmaW5lIFBIWV9CX1BFQ19CWV9TQ1IJKDE8PDkpCS8qIEJpdCAgOToJQnlwYXNzIFNjcmFtYmxlciAqLworI2RlZmluZSBQSFlfQl9QRUNfQllfTUxUMwkoMTw8OCkJLyogQml0ICA4OglCeXBhc3MgTUxUMyBFbmNvZGVyICovCisjZGVmaW5lIFBIWV9CX1BFQ19CWV9SWEEJKDE8PDcpCS8qIEJpdCAgNzoJQnlwYXNzIFJ4IEFsaWdubS4gKi8KKyNkZWZpbmUgUEhZX0JfUEVDX1JFU19TQ1IJKDE8PDYpCS8qIEJpdCAgNjoJUmVzZXQgU2NyYW1ibGVyICovCisjZGVmaW5lIFBIWV9CX1BFQ19FTl9MVFIJKDE8PDUpCS8qIEJpdCAgNToJRW5hIExFRCBUcmFmZmljIE1vZGUgKi8KKyNkZWZpbmUgUEhZX0JfUEVDX0xFRF9PTgkoMTw8NCkJLyogQml0ICA0OglGb3JjZSBMRUQncyBvbiAqLworI2RlZmluZSBQSFlfQl9QRUNfTEVEX09GRgkoMTw8MykJLyogQml0ICAzOglGb3JjZSBMRUQncyBvZmYgKi8KKyNkZWZpbmUgUEhZX0JfUEVDX0VYX0lQRwkoMTw8MikJLyogQml0ICAyOglFeHRlbmQgVHggSVBHIE1vZGUgKi8KKyNkZWZpbmUgUEhZX0JfUEVDXzNfTEVECQkoMTw8MSkJLyogQml0ICAxOglUaHJlZSBMaW5rIExFRCBtb2RlICovCisjZGVmaW5lIFBIWV9CX1BFQ19ISUdIX0xBCSgxPDwwKQkvKiBCaXQgIDA6CUdNSUkgRklGTyBFbGFzdGljeSAqLworCisvKioqKiogIFBIWV9CQ09NX1BfRVhUX1NUQVQJMTYgYml0IHIvbwlQSFkgRXh0ZW5kZWQgU3RhdHVzIFJlZyAqKioqKi8KKwkJCQkJCQkJCS8qIEJpdCAxNS4uMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CX1BFU19DUk9TU19TVEFUCSgxPDwxMykJLyogQml0IDEzOglNREkgQ3Jvc3NvdmVyIFN0YXR1cyAqLworI2RlZmluZSBQSFlfQl9QRVNfSU5UX1NUQVQJKDE8PDEyKQkvKiBCaXQgMTI6CUludGVycnVwdCBTdGF0dXMgKi8KKyNkZWZpbmUgUEhZX0JfUEVTX1JSUwkJKDE8PDExKQkvKiBCaXQgMTE6CVJlbW90ZSBSZWNlaXZlciBTdGF0LiAqLworI2RlZmluZSBQSFlfQl9QRVNfTFJTCQkoMTw8MTApCS8qIEJpdCAxMDoJTG9jYWwgUmVjZWl2ZXIgU3RhdC4gKi8KKyNkZWZpbmUgUEhZX0JfUEVTX0xPQ0tFRAkoMTw8OSkJLyogQml0ICA5OglMb2NrZWQgKi8KKyNkZWZpbmUgUEhZX0JfUEVTX0xTCQkoMTw8OCkJLyogQml0ICA4OglMaW5rIFN0YXR1cyAqLworI2RlZmluZSBQSFlfQl9QRVNfUkYJCSgxPDw3KQkvKiBCaXQgIDc6CVJlbW90ZSBGYXVsdCAqLworI2RlZmluZSBQSFlfQl9QRVNfQ0VfRVIJCSgxPDw2KQkvKiBCaXQgIDY6CUNhcnJpZXIgRXh0IEVycm9yICovCisjZGVmaW5lIFBIWV9CX1BFU19CQURfU1NECSgxPDw1KQkvKiBCaXQgIDU6CUJhZCBTU0QgKi8KKyNkZWZpbmUgUEhZX0JfUEVTX0JBRF9FU0QJKDE8PDQpCS8qIEJpdCAgNDoJQmFkIEVTRCAqLworI2RlZmluZSBQSFlfQl9QRVNfUlhfRVIJCSgxPDwzKQkvKiBCaXQgIDM6CVJlY2VpdmUgRXJyb3IgKi8KKyNkZWZpbmUgUEhZX0JfUEVTX1RYX0VSCQkoMTw8MikJLyogQml0ICAyOglUcmFuc21pdCBFcnJvciAqLworI2RlZmluZSBQSFlfQl9QRVNfTE9DS19FUgkoMTw8MSkJLyogQml0ICAxOglMb2NrIEVycm9yICovCisjZGVmaW5lIFBIWV9CX1BFU19NTFQzX0VSCSgxPDwwKQkvKiBCaXQgIDA6CU1MVDMgY29kZSBFcnJvciAqLworCisvKioqKiogIFBIWV9CQ09NX0ZDX0NUUgkJMTYgYml0IHIvdwlGYWxzZSBDYXJyaWVyIENvdW50ZXIgKioqKiovCisJCQkJCQkJCQkvKiBCaXQgMTUuLjg6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CX0ZDX0NUUgkJMHhmZgkvKiBCaXQgIDcuLjA6CUZhbHNlIENhcnJpZXIgQ291bnRlciAqLworCisvKioqKiogIFBIWV9CQ09NX1JOT19DVFIJMTYgYml0IHIvdwlSZWNlaXZlIE5PVF9PSyBDb3VudGVyICoqKioqLworI2RlZmluZSBQSFlfQl9SQ19MT0NfTVNLCTB4ZmYwMAkvKiBCaXQgMTUuLjg6CUxvY2FsIFJ4IE5PVF9PSyBjbnQgKi8KKyNkZWZpbmUgUEhZX0JfUkNfUkVNX01TSwkweDAwZmYJLyogQml0ICA3Li4wOglSZW1vdGUgUnggTk9UX09LIGNudCAqLworCisvKioqKiogIFBIWV9CQ09NX0FVWF9DVFJMCTE2IGJpdCByL3cJQXV4aWxpYXJ5IENvbnRyb2wgUmVnICoqKioqLworI2RlZmluZSBQSFlfQl9BQ19MX1NRRQkJKDE8PDE1KQkvKiBCaXQgMTU6CUxvdyBTcXVlbGNoICovCisjZGVmaW5lIFBIWV9CX0FDX0xPTkdfUEFDSwkoMTw8MTQpCS8qIEJpdCAxNDoJUnggTG9uZyBQYWNrZXRzICovCisjZGVmaW5lIFBIWV9CX0FDX0VSX0NUUkwJKDM8PDEyKQkvKiBCaXQgMTMuLjEyOglFZGdlcmF0ZSBDb250cm9sICovCisJCQkJCQkJCQkvKiBCaXQgMTE6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CX0FDX1RYX1RTVAkJKDE8PDEwKSAvKiBCaXQgMTA6CVR4IHRlc3QgYml0LCBhbHdheXMgMSAqLworCQkJCQkJCQkJLyogQml0ICA5Li4gODoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX0JfQUNfRElTX1BSRgkoMTw8NykJLyogQml0ICA3OglkaXMgcGFydCByZXNwIGZpbHRlciAqLworCQkJCQkJCQkJLyogQml0ICA2OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQl9BQ19ESVNfUE0JCSgxPDw1KQkvKiBCaXQgIDU6CWRpcyBwb3dlciBtYW5hZ2VtZW50ICovCisJCQkJCQkJCQkvKiBCaXQgIDQ6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CX0FDX0RJQUcJCSgxPDwzKQkvKiBCaXQgIDM6CURpYWdub3N0aWMgTW9kZSAqLworCQkJCQkJCQkJLyogQml0ICAyLi4gMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfQkNPTV9BVVhfU1RBVAkxNiBiaXQgci9vCUF1eGlsaWFyeSBTdGF0dXMgUmVnICoqKioqLworI2RlZmluZSBQSFlfQl9BU19BTl9DCQkoMTw8MTUpCS8qIEJpdCAxNToJQXV0b05lZyBjb21wbGV0ZSAqLworI2RlZmluZSBQSFlfQl9BU19BTl9DQQkJKDE8PDE0KQkvKiBCaXQgMTQ6CUFOIENvbXBsZXRlIEFjayAqLworI2RlZmluZSBQSFlfQl9BU19BTkFDS19ECSgxPDwxMykJLyogQml0IDEzOglBTiBBY2sgRGV0ZWN0ICovCisjZGVmaW5lIFBIWV9CX0FTX0FOQUJfRAkJKDE8PDEyKQkvKiBCaXQgMTI6CUFOIEFiaWxpdHkgRGV0ZWN0ICovCisjZGVmaW5lIFBIWV9CX0FTX05QVwkJKDE8PDExKQkvKiBCaXQgMTE6CUFOIE5leHQgUGFnZSBXYWl0ICovCisjZGVmaW5lIFBIWV9CX0FTX0FOX1JFU19NU0sJKDc8PDgpCS8qIEJpdCAxMC4uODoJQU4gSERDICovCisjZGVmaW5lIFBIWV9CX0FTX1BERgkJKDE8PDcpCS8qIEJpdCAgNzoJUGFyYWxsZWwgRGV0ZWN0LiBGYXVsdCAqLworI2RlZmluZSBQSFlfQl9BU19SRgkJCSgxPDw2KQkvKiBCaXQgIDY6CVJlbW90ZSBGYXVsdCAqLworI2RlZmluZSBQSFlfQl9BU19BTlBfUgkJKDE8PDUpCS8qIEJpdCAgNToJQU4gUGFnZSBSZWNlaXZlZCAqLworI2RlZmluZSBQSFlfQl9BU19MUF9BTkFCCSgxPDw0KQkvKiBCaXQgIDQ6CUxQIEFOIEFiaWxpdHkgKi8KKyNkZWZpbmUgUEhZX0JfQVNfTFBfTlBBQgkoMTw8MykJLyogQml0ICAzOglMUCBOZXh0IFBhZ2UgQWJpbGl0eSAqLworI2RlZmluZSBQSFlfQl9BU19MUwkJCSgxPDwyKQkvKiBCaXQgIDI6CUxpbmsgU3RhdHVzICovCisjZGVmaW5lIFBIWV9CX0FTX1BSUgkJKDE8PDEpCS8qIEJpdCAgMToJUGF1c2UgUmVzb2x1dGlvbi1SeCAqLworI2RlZmluZSBQSFlfQl9BU19QUlQJCSgxPDwwKQkvKiBCaXQgIDA6CVBhdXNlIFJlc29sdXRpb24tVHggKi8KKworI2RlZmluZSBQSFlfQl9BU19QQVVTRV9NU0sJKFBIWV9CX0FTX1BSUiB8IFBIWV9CX0FTX1BSVCkKKworLyoqKioqICBQSFlfQkNPTV9JTlRfU1RBVAkxNiBiaXQgci9vCUludGVycnVwdCBTdGF0dXMgUmVnICoqKioqLworLyoqKioqICBQSFlfQkNPTV9JTlRfTUFTSwkxNiBiaXQgci93CUludGVycnVwdCBNYXNrIFJlZyAqKioqKi8KKwkJCQkJCQkJCS8qIEJpdCAxNToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX0JfSVNfUFNFCQkoMTw8MTQpCS8qIEJpdCAxNDoJUGFpciBTd2FwIEVycm9yICovCisjZGVmaW5lIFBIWV9CX0lTX01EWElfU0MJKDE8PDEzKQkvKiBCaXQgMTM6CU1ESVggU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSBQSFlfQl9JU19IQ1QJCSgxPDwxMikJLyogQml0IDEyOgljb3VudGVyIGFib3ZlIDMyayAqLworI2RlZmluZSBQSFlfQl9JU19MQ1QJCSgxPDwxMSkJLyogQml0IDExOgljb3VudGVyIGFib3ZlIDEyOCAqLworI2RlZmluZSBQSFlfQl9JU19BTl9QUgkJKDE8PDEwKQkvKiBCaXQgMTA6CVBhZ2UgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgUEhZX0JfSVNfTk9fSERDTAkoMTw8OSkJLyogQml0ICA5OglObyBIQ0QgTGluayAqLworI2RlZmluZSBQSFlfQl9JU19OT19IREMJCSgxPDw4KQkvKiBCaXQgIDg6CU5vIEhDRCAqLworI2RlZmluZSBQSFlfQl9JU19ORUdfVVNIREMJKDE8PDcpCS8qIEJpdCAgNzoJTmVnb3RpYXRlZCBVbnN1cC4gSENEICovCisjZGVmaW5lIFBIWV9CX0lTX1NDUl9TX0VSCSgxPDw2KQkvKiBCaXQgIDY6CVNjcmFtYmxlciBTeW5jIEVycm9yICovCisjZGVmaW5lIFBIWV9CX0lTX1JSU19DSEFOR0UJKDE8PDUpCS8qIEJpdCAgNToJUmVtb3RlIFJ4IFN0YXQgQ2hhbmdlICovCisjZGVmaW5lIFBIWV9CX0lTX0xSU19DSEFOR0UJKDE8PDQpCS8qIEJpdCAgNDoJTG9jYWwgUnggU3RhdCBDaGFuZ2UgKi8KKyNkZWZpbmUgUEhZX0JfSVNfRFVQX0NIQU5HRQkoMTw8MykJLyogQml0ICAzOglEdXBsZXggTW9kZSBDaGFuZ2UgKi8KKyNkZWZpbmUgUEhZX0JfSVNfTFNQX0NIQU5HRQkoMTw8MikJLyogQml0ICAyOglMaW5rIFNwZWVkIENoYW5nZSAqLworI2RlZmluZSBQSFlfQl9JU19MU1RfQ0hBTkdFCSgxPDwxKQkvKiBCaXQgIDE6CUxpbmsgU3RhdHVzIENoYW5nZWQgKi8KKyNkZWZpbmUgUEhZX0JfSVNfQ1JDX0VSCQkoMTw8MCkJLyogQml0ICAwOglDUkMgRXJyb3IgKi8KKworI2RlZmluZSBQSFlfQl9ERUZfTVNLCSh+KFBIWV9CX0lTX0FOX1BSIHwgUEhZX0JfSVNfTFNUX0NIQU5HRSkpCisKKy8qIFBhdXNlIEJpdHMgKFBIWV9CX0FOX0FTUCBhbmQgUEhZX0JfQU5fUEMpIGVuY29kaW5nICovCisjZGVmaW5lIFBIWV9CX1BfTk9fUEFVU0UJKDA8PDEwKQkvKiBCaXQgMTEuLjEwOglubyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9CX1BfU1lNX01ECQkoMTw8MTApCS8qIEJpdCAxMS4uMTA6CXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9CX1BfQVNZTV9NRAkJKDI8PDEwKQkvKiBCaXQgMTEuLjEwOglhc3ltbWV0cmljIFBhdXNlIE1vZGUgKi8KKyNkZWZpbmUgUEhZX0JfUF9CT1RIX01ECQkoMzw8MTApCS8qIEJpdCAxMS4uMTA6CWJvdGggUGF1c2UgTW9kZSAqLworCisvKgorICogUmVzb2x2ZWQgRHVwbGV4IG1vZGUgYW5kIENhcGFiaWxpdGllcyAoQXV4IFN0YXR1cyBTdW1tYXJ5IFJlZykKKyAqLworI2RlZmluZSBQSFlfQl9SRVNfMTAwMEZECSg3PDw4KQkvKiBCaXQgMTAuLjg6CTEwMDBCYXNlLVQgRnVsbCBEdXAuICovCisjZGVmaW5lIFBIWV9CX1JFU18xMDAwSEQJKDY8PDgpCS8qIEJpdCAxMC4uODoJMTAwMEJhc2UtVCBIYWxmIER1cC4gKi8KKy8qIG90aGVyczogMTAwLzEwOiBpbnZhbGlkIGZvciB1cyAqLworCisvKgorICogTGV2ZWwgT25lLVNwZWNpZmljCisgKi8KKy8qKioqKiAgUEhZX0xPTkVfMTAwMFRfQ1RSTAkxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9MXzEwMDBDX1RFU1QJKDc8PDEzKQkvKiBCaXQgMTUuLjEzOglUZXN0IE1vZGVzICovCisjZGVmaW5lIFBIWV9MXzEwMDBDX01TRQkJKDE8PDEyKQkvKiBCaXQgMTI6CU1hc3Rlci9TbGF2ZSBFbmFibGUgKi8KKyNkZWZpbmUgUEhZX0xfMTAwMENfTVNDCQkoMTw8MTEpCS8qIEJpdCAxMToJTS9TIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgUEhZX0xfMTAwMENfUkQJCSgxPDwxMCkJLyogQml0IDEwOglSZXBlYXRlci9EVEUgKi8KKyNkZWZpbmUgUEhZX0xfMTAwMENfQUZECQkoMTw8OSkJLyogQml0ICA5OglBZHZlcnRpc2UgRnVsbCBEdXBsZXggKi8KKyNkZWZpbmUgUEhZX0xfMTAwMENfQUhECQkoMTw8OCkJLyogQml0ICA4OglBZHZlcnRpc2UgSGFsZiBEdXBsZXggKi8KKwkJCQkJCQkJCS8qIEJpdCAgNy4uMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfTE9ORV8xMDAwVF9TVEFUCTE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICoqKioqLworI2RlZmluZSBQSFlfTF8xMDAwU19NU0YJCSgxPDwxNSkJLyogQml0IDE1OglNYXN0ZXIvU2xhdmUgRmF1bHQgKi8KKyNkZWZpbmUgUEhZX0xfMTAwMFNfTVNSCQkoMTw8MTQpCS8qIEJpdCAxNDoJTWFzdGVyL1NsYXZlIFJlc3VsdCAqLworI2RlZmluZSBQSFlfTF8xMDAwU19MUlMJCSgxPDwxMykJLyogQml0IDEzOglMb2NhbCBSZWNlaXZlciBTdGF0dXMgKi8KKyNkZWZpbmUgUEhZX0xfMTAwMFNfUlJTCQkoMTw8MTIpCS8qIEJpdCAxMjoJUmVtb3RlIFJlY2VpdmVyIFN0YXR1cyAqLworI2RlZmluZSBQSFlfTF8xMDAwU19MUF9GRAkoMTw8MTEpCS8qIEJpdCAxMToJTGluayBQYXJ0bmVyIGNhbiBGRCAqLworI2RlZmluZSBQSFlfTF8xMDAwU19MUF9IRAkoMTw8MTApCS8qIEJpdCAxMDoJTGluayBQYXJ0bmVyIGNhbiBIRCAqLworCQkJCQkJCQkJLyogQml0ICA5Li44OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQl8xMDAwU19JRUMJCTB4ZmYJLyogQml0ICA3Li4wOglJZGxlIEVycm9yIENvdW50ICovCisKKy8qKioqKiAgUEhZX0xPTkVfRVhUX1NUQVQJMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKioqKiovCisjZGVmaW5lIFBIWV9MX0VTX1hfRkRfQ0FQCSgxPDwxNSkJLyogQml0IDE1OgkxMDAwQmFzZS1YIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgUEhZX0xfRVNfWF9IRF9DQVAJKDE8PDE0KQkvKiBCaXQgMTQ6CTEwMDBCYXNlLVggSEQgY2FwYWJsZSAqLworI2RlZmluZSBQSFlfTF9FU19UX0ZEX0NBUAkoMTw8MTMpCS8qIEJpdCAxMzoJMTAwMEJhc2UtVCBGRCBjYXBhYmxlICovCisjZGVmaW5lIFBIWV9MX0VTX1RfSERfQ0FQCSgxPDwxMikJLyogQml0IDEyOgkxMDAwQmFzZS1UIEhEIGNhcGFibGUgKi8KKwkJCQkJCQkJCS8qIEJpdCAxMS4uMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfTE9ORV9QT1JUX0NGRwkxNiBiaXQgci93CVBvcnQgQ29uZmlndXJhdGlvbiBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9MX1BDX1JFUF9NT0RFCSgxPDwxNSkJLyogQml0IDE1OglSZXBlYXRlciBNb2RlICovCisJCQkJCQkJCQkvKiBCaXQgMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9MX1BDX1RYX0RJUwkJKDE8PDEzKQkvKiBCaXQgMTM6CVR4IG91dHB1dCBEaXNhYmxlZCAqLworI2RlZmluZSBQSFlfTF9QQ19CWV9TQ1IJCSgxPDwxMikJLyogQml0IDEyOglCeXBhc3MgU2NyYW1ibGVyICovCisjZGVmaW5lIFBIWV9MX1BDX0JZXzQ1CQkoMTw8MTEpCS8qIEJpdCAxMToJQnlwYXNzIDRCNUItRGVjb2RlciAqLworI2RlZmluZSBQSFlfTF9QQ19KQUJfRElTCSgxPDwxMCkJLyogQml0IDEwOglKYWJiZXIgRGlzYWJsZWQgKi8KKyNkZWZpbmUgUEhZX0xfUENfU1FFCQkoMTw8OSkJLyogQml0ICA5OglFbmFibGUgSGVhcnRiZWF0ICovCisjZGVmaW5lIFBIWV9MX1BDX1RQX0xPT1AJKDE8PDgpCS8qIEJpdCAgODoJVFAgTG9vcGJhY2sgKi8KKyNkZWZpbmUgUEhZX0xfUENfU1NTCQkoMTw8NykJLyogQml0ICA3OglTbWFydCBTcGVlZCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgUEhZX0xfUENfRklGT19TSVpFCSgxPDw2KQkvKiBCaXQgIDY6CUZJRk8gU2l6ZSAqLworI2RlZmluZSBQSFlfTF9QQ19QUkVfRU4JCSgxPDw1KQkvKiBCaXQgIDU6CVByZWFtYmxlIEVuYWJsZSAqLworI2RlZmluZSBQSFlfTF9QQ19DSU0JCSgxPDw0KQkvKiBCaXQgIDQ6CUNhcnJpZXIgSW50ZWdyaXR5IE1vbiAqLworI2RlZmluZSBQSFlfTF9QQ18xMF9TRVIJCSgxPDwzKQkvKiBCaXQgIDM6CVVzZSBTZXJpYWwgT3V0cHV0ICovCisjZGVmaW5lIFBIWV9MX1BDX0FOSVNPTAkJKDE8PDIpCS8qIEJpdCAgMjoJVW5pc29sYXRlIFBvcnQgKi8KKyNkZWZpbmUgUEhZX0xfUENfVEVOX0JJVAkoMTw8MSkJLyogQml0ICAxOgkxMGJpdCBpZmFjZSBtb2RlIG9uICovCisjZGVmaW5lIFBIWV9MX1BDX0FMVENMT0NLCSgxPDwwKQkvKiBCaXQgIDA6IChybykJQUxUQ0xPQ0sgTW9kZSBvbiAqLworCisvKioqKiogIFBIWV9MT05FX1FfU1RBVAkJMTYgYml0IHIvbwlRdWljayBTdGF0dXMgUmVnICoqKioqLworI2RlZmluZSBQSFlfTF9RU19EX1JBVEUJCSgzPDwxNCkJLyogQml0IDE1Li4xNDoJRGF0YSBSYXRlICovCisjZGVmaW5lIFBIWV9MX1FTX1RYX1NUQVQJKDE8PDEzKQkvKiBCaXQgMTM6CVRyYW5zbWl0dGluZyAqLworI2RlZmluZSBQSFlfTF9RU19SWF9TVEFUCSgxPDwxMikJLyogQml0IDEyOglSZWNlaXZpbmcgKi8KKyNkZWZpbmUgUEhZX0xfUVNfQ09MX1NUQVQJKDE8PDExKQkvKiBCaXQgMTE6CUNvbGxpc2lvbiAqLworI2RlZmluZSBQSFlfTF9RU19MX1NUQVQJCSgxPDwxMCkJLyogQml0IDEwOglMaW5rIGlzIHVwICovCisjZGVmaW5lIFBIWV9MX1FTX0RVUF9NT0QJKDE8PDkpCS8qIEJpdCAgOToJRnVsbC9IYWxmIER1cGxleCAqLworI2RlZmluZSBQSFlfTF9RU19BTgkJCSgxPDw4KQkvKiBCaXQgIDg6CUF1dG9OZWcgaXMgT24gKi8KKyNkZWZpbmUgUEhZX0xfUVNfQU5fQwkJKDE8PDcpCS8qIEJpdCAgNzoJQU4gaXMgQ29tcGxldGUgKi8KKyNkZWZpbmUgUEhZX0xfUVNfTExFCQkoNzw8NCkJLyogQml0ICA2OglMaW5lIExlbmd0aCBFc3RpbS4gKi8KKyNkZWZpbmUgUEhZX0xfUVNfUEFVU0UJCSgxPDwzKQkvKiBCaXQgIDM6CUxQIGFkdmVydGlzZWQgUGF1c2UgKi8KKyNkZWZpbmUgUEhZX0xfUVNfQVNfUEFVU0UJKDE8PDIpCS8qIEJpdCAgMjoJTFAgYWR2LiBhc3ltLiBQYXVzZSAqLworI2RlZmluZSBQSFlfTF9RU19JU09MQVRFCSgxPDwxKQkvKiBCaXQgIDE6CUNJTSBJc29sYXRlZCAqLworI2RlZmluZSBQSFlfTF9RU19FVkVOVAkJKDE8PDApCS8qIEJpdCAgMDoJRXZlbnQgaGFzIG9jY3VycmVkICovCisKKy8qKioqKiAgUEhZX0xPTkVfSU5UX0VOQUIJMTYgYml0IHIvdwlJbnRlcnJ1cHQgRW5hYmxlIFJlZyAqKioqKi8KKy8qKioqKiAgUEhZX0xPTkVfSU5UX1NUQVQJMTYgYml0IHIvbwlJbnRlcnJ1cHQgU3RhdHVzIFJlZyAqKioqKi8KKwkJCQkJCQkJCS8qIEJpdCAxNS4uMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9MX0lTX0FOX0YJCSgxPDwxMykJLyogQml0IDEzOglBdXRvLU5lZ290aWF0aW9uIGZhdWx0ICovCisJCQkJCQkJCQkvKiBCaXQgMTI6CW5vdCBkZXNjcmliZWQgKi8KKyNkZWZpbmUgUEhZX0xfSVNfQ1JPU1MJCSgxPDwxMSkJLyogQml0IDExOglDcm9zc292ZXIgdXNlZCAqLworI2RlZmluZSBQSFlfTF9JU19QT0wJCSgxPDwxMCkJLyogQml0IDEwOglQb2xhcml0eSBjb3JyZWN0LiB1c2VkICovCisjZGVmaW5lIFBIWV9MX0lTX1NTCQkJKDE8PDkpCS8qIEJpdCAgOToJU21hcnQgU3BlZWQgRG93bmdyYWRlICovCisjZGVmaW5lIFBIWV9MX0lTX0NGVUxMCQkoMTw8OCkJLyogQml0ICA4OglDb3VudGVyIEZ1bGwgKi8KKyNkZWZpbmUgUEhZX0xfSVNfQU5fQwkJKDE8PDcpCS8qIEJpdCAgNzoJQXV0b05lZyBDb21wbGV0ZSAqLworI2RlZmluZSBQSFlfTF9JU19TUEVFRAkJKDE8PDYpCS8qIEJpdCAgNjoJU3BlZWQgQ2hhbmdlZCAqLworI2RlZmluZSBQSFlfTF9JU19EVVAJCSgxPDw1KQkvKiBCaXQgIDU6CUR1cGxleCBDaGFuZ2VkICovCisjZGVmaW5lIFBIWV9MX0lTX0xTCQkJKDE8PDQpCS8qIEJpdCAgNDoJTGluayBTdGF0dXMgQ2hhbmdlZCAqLworI2RlZmluZSBQSFlfTF9JU19JU09MCQkoMTw8MykJLyogQml0ICAzOglJc29sYXRlIE9jY3VyZWQgKi8KKyNkZWZpbmUgUEhZX0xfSVNfTURJTlQJCSgxPDwyKQkvKiBCaXQgIDI6IChybykJU1RBVDogTUlJIEludCBQZW5kaW5nICovCisjZGVmaW5lIFBIWV9MX0lTX0lOVEVOCQkoMTw8MSkJLyogQml0ICAxOglFTkFCOiBFbmFibGUgSVJRcyAqLworI2RlZmluZSBQSFlfTF9JU19GT1JDRQkJKDE8PDApCS8qIEJpdCAgMDoJRU5BQjogRm9yY2UgSW50ZXJydXB0ICovCisKKy8qIGludC4gbWFzayAqLworI2RlZmluZSBQSFlfTF9ERUZfTVNLCQkoUEhZX0xfSVNfTFMgfCBQSFlfTF9JU19JU09MIHwgUEhZX0xfSVNfSU5URU4pCisKKy8qKioqKiAgUEhZX0xPTkVfTEVEX0NGRwkxNiBiaXQgci93CUxFRCBDb25maWd1cmF0aW9uIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX0xfTENfTEVEQwkJKDM8PDE0KQkvKiBCaXQgMTUuLjE0OglDb2wvQmxpbmsvT24vT2ZmICovCisjZGVmaW5lIFBIWV9MX0xDX0xFRFIJCSgzPDwxMikJLyogQml0IDEzLi4xMjoJUngvQmxpbmsvT24vT2ZmICovCisjZGVmaW5lIFBIWV9MX0xDX0xFRFQJCSgzPDwxMCkJLyogQml0IDExLi4xMDoJVHgvQmxpbmsvT24vT2ZmICovCisjZGVmaW5lIFBIWV9MX0xDX0xFREcJCSgzPDw4KQkvKiBCaXQgIDkuLjg6CUdpZ2EvQmxpbmsvT24vT2ZmICovCisjZGVmaW5lIFBIWV9MX0xDX0xFRFMJCSgzPDw2KQkvKiBCaXQgIDcuLjY6CTEwLTEwMC9CbGluay9Pbi9PZmYgKi8KKyNkZWZpbmUgUEhZX0xfTENfTEVETAkJKDM8PDQpCS8qIEJpdCAgNS4uNDoJTGluay9CbGluay9Pbi9PZmYgKi8KKyNkZWZpbmUgUEhZX0xfTENfTEVERgkJKDM8PDIpCS8qIEJpdCAgMy4uMjoJRHVwbGV4L0JsaW5rL09uL09mZiAqLworI2RlZmluZSBQSFlfTF9MQ19QU1RSRUNICSgxPDwxKQkvKiBCaXQgIDE6CVN0cmVjaCBMRUQgUHVsc2VzICovCisjZGVmaW5lIFBIWV9MX0xDX0ZSRVEJCSgxPDwwKQkvKiBCaXQgIDA6CTMwLzEwMCBtcyAqLworCisvKioqKiogIFBIWV9MT05FX1BPUlRfQ1RSTAkxNiBiaXQgci93CVBvcnQgQ29udHJvbCBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9MX1BDX1RYX1RDTEsJKDE8PDE1KQkvKiBCaXQgMTU6CUVuYWJsZSBUWF9UQ0xLICovCisJCQkJCQkJCQkvKiBCaXQgMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9MX1BDX0FMVF9OUAkJKDE8PDEzKQkvKiBCaXQgMTQ6CUFsdGVybmF0ZSBOZXh0IFBhZ2UgKi8KKyNkZWZpbmUgUEhZX0xfUENfR01JSV9BTFQJKDE8PDEyKQkvKiBCaXQgMTM6CUFsdGVybmF0ZSBHTUlJIGRyaXZlciAqLworCQkJCQkJCQkJLyogQml0IDExOglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTF9QQ19URU5fQ1JTCSgxPDwxMCkJLyogQml0IDEwOglFeHRlbmQgQ1JTKi8KKwkJCQkJCQkJCS8qIEJpdCAgOS4uMDoJbm90IGRlc2NyaWJlZCAqLworCisvKioqKiogIFBIWV9MT05FX0NJTQkJMTYgYml0IHIvbwlDSU0gUmVnICoqKioqLworI2RlZmluZSBQSFlfTF9DSU1fSVNPTAkJKDI1NTw8OCkvKiBCaXQgMTUuLjg6CUlzb2xhdGUgQ291bnQgKi8KKyNkZWZpbmUgUEhZX0xfQ0lNX0ZBTFNFX0NBUgkoMjU1PDwwKS8qIEJpdCAgNy4uMDoJRmFsc2UgQ2FycmllciBDb3VudCAqLworCisKKy8qCisgKiBQYXVzZSBCaXRzIChQSFlfTF9BTl9BU1AgYW5kIFBIWV9MX0FOX1BDKSBlbmNvZGluZworICovCisjZGVmaW5lIFBIWV9MX1BfTk9fUEFVU0UJKDA8PDEwKQkvKiBCaXQgMTEuLjEwOglubyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9MX1BfU1lNX01ECQkoMTw8MTApCS8qIEJpdCAxMS4uMTA6CXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9MX1BfQVNZTV9NRAkJKDI8PDEwKQkvKiBCaXQgMTEuLjEwOglhc3ltbWV0cmljIFBhdXNlIE1vZGUgKi8KKyNkZWZpbmUgUEhZX0xfUF9CT1RIX01ECQkoMzw8MTApCS8qIEJpdCAxMS4uMTA6CWJvdGggUGF1c2UgTW9kZSAqLworCisKKy8qCisgKiBOYXRpb25hbC1TcGVjaWZpYworICovCisvKioqKiogIFBIWV9OQVRfMTAwMFRfQ1RSTAkxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9OXzEwMDBDX1RFU1QJKDc8PDEzKQkvKiBCaXQgMTUuLjEzOglUZXN0IE1vZGVzICovCisjZGVmaW5lIFBIWV9OXzEwMDBDX01TRQkJKDE8PDEyKQkvKiBCaXQgMTI6CU1hc3Rlci9TbGF2ZSBFbmFibGUgKi8KKyNkZWZpbmUgUEhZX05fMTAwMENfTVNDCQkoMTw8MTEpCS8qIEJpdCAxMToJTS9TIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgUEhZX05fMTAwMENfUkQJCSgxPDwxMCkJLyogQml0IDEwOglSZXBlYXRlci9EVEUgKi8KKyNkZWZpbmUgUEhZX05fMTAwMENfQUZECQkoMTw8OSkJLyogQml0ICA5OglBZHZlcnRpc2UgRnVsbCBEdXBsZXggKi8KKyNkZWZpbmUgUEhZX05fMTAwMENfQUhECQkoMTw8OCkJLyogQml0ICA4OglBZHZlcnRpc2UgSGFsZiBEdXBsZXggKi8KKyNkZWZpbmUgUEhZX05fMTAwMENfQVBDCQkoMTw8NykJLyogQml0ICA3OglBc3ltbWV0cmljIFBhdXNlIENhcC4gKi8KKwkJCQkJCQkJCS8qIEJpdCAgNi4uMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfTkFUXzEwMDBUX1NUQVQJMTYgYml0IHIvbwkxMDAwQmFzZS1UIFN0YXR1cyBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9OXzEwMDBTX01TRgkJKDE8PDE1KQkvKiBCaXQgMTU6CU1hc3Rlci9TbGF2ZSBGYXVsdCAqLworI2RlZmluZSBQSFlfTl8xMDAwU19NU1IJCSgxPDwxNCkJLyogQml0IDE0OglNYXN0ZXIvU2xhdmUgUmVzdWx0ICovCisjZGVmaW5lIFBIWV9OXzEwMDBTX0xSUwkJKDE8PDEzKQkvKiBCaXQgMTM6CUxvY2FsIFJlY2VpdmVyIFN0YXR1cyAqLworI2RlZmluZSBQSFlfTl8xMDAwU19SUlMJCSgxPDwxMikJLyogQml0IDEyOglSZW1vdGUgUmVjZWl2ZXIgU3RhdHVzKi8KKyNkZWZpbmUgUEhZX05fMTAwMFNfTFBfRkQJKDE8PDExKQkvKiBCaXQgMTE6CUxpbmsgUGFydG5lciBjYW4gRkQgKi8KKyNkZWZpbmUgUEhZX05fMTAwMFNfTFBfSEQJKDE8PDEwKQkvKiBCaXQgMTA6CUxpbmsgUGFydG5lciBjYW4gSEQgKi8KKyNkZWZpbmUgUEhZX05fMTAwMENfTFBfQVBDCSgxPDw5KQkvKiBCaXQgIDk6CUxQIEFzeW0uIFBhdXNlIENhcC4gKi8KKwkJCQkJCQkJCS8qIEJpdCAgODoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX05fMTAwMFNfSUVDCQkweGZmCS8qIEJpdCAgNy4uMDoJSWRsZSBFcnJvciBDb3VudCAqLworCisvKioqKiogIFBIWV9OQVRfRVhUX1NUQVQJMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKioqKiovCisjZGVmaW5lIFBIWV9OX0VTX1hfRkRfQ0FQCSgxPDwxNSkJLyogQml0IDE1OgkxMDAwQmFzZS1YIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgUEhZX05fRVNfWF9IRF9DQVAJKDE8PDE0KQkvKiBCaXQgMTQ6CTEwMDBCYXNlLVggSEQgY2FwYWJsZSAqLworI2RlZmluZSBQSFlfTl9FU19UX0ZEX0NBUAkoMTw8MTMpCS8qIEJpdCAxMzoJMTAwMEJhc2UtVCBGRCBjYXBhYmxlICovCisjZGVmaW5lIFBIWV9OX0VTX1RfSERfQ0FQCSgxPDwxMikJLyogQml0IDEyOgkxMDAwQmFzZS1UIEhEIGNhcGFibGUgKi8KKwkJCQkJCQkJCS8qIEJpdCAxMS4uMDoJcmVzZXJ2ZWQgKi8KKworLyogdG9kbzogdGhvc2UgYXJlIHN0aWxsIG1pc3NpbmcgKi8KKy8qKioqKiAgUEhZX05BVF9FWFRfQ1RSTDEJMTYgYml0IHIvbwlFeHRlbmRlZCBDb250cm9sIFJlZzEgKioqKiovCisvKioqKiogIFBIWV9OQVRfUV9TVEFUMQkJMTYgYml0IHIvbwlRdWljayBTdGF0dXMgUmVnMSAqKioqKi8KKy8qKioqKiAgUEhZX05BVF8xMEJfT1AJCTE2IGJpdCByL28JMTBCYXNlLVQgT3BlcmF0aW9ucyBSZWcgKioqKiovCisvKioqKiogIFBIWV9OQVRfRVhUX0NUUkwyCTE2IGJpdCByL28JRXh0ZW5kZWQgQ29udHJvbCBSZWcxICoqKioqLworLyoqKioqICBQSFlfTkFUX1FfU1RBVDIJCTE2IGJpdCByL28JUXVpY2sgU3RhdHVzIFJlZzIgKioqKiovCisvKioqKiogIFBIWV9OQVRfUEhZX0FERFIJMTYgYml0IHIvbwlQSFkgQWRkcmVzcyBSZWdpc3RlciAqKioqKi8KKworLyoKKyAqIE1hcnZlbGwtU3BlY2lmaWMKKyAqLworLyoqKioqICBQSFlfTUFSVl9BVU5FX0FEVgkxNiBiaXQgci93CUF1dG8tTmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCAqKioqKi8KKy8qKioqKiAgUEhZX01BUlZfQVVORV9MUAkxNiBiaXQgci93CUxpbmsgUGFydCBBYmlsaXR5IFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fQU5fTlhUX1BHCQlCSVRfMTUJLyogUmVxdWVzdCBOZXh0IFBhZ2UgKi8KKyNkZWZpbmUgUEhZX01fQU5fQUNLCQlCSVRfMTQJLyogKHJvKQlBY2tub3dsZWRnZSBSZWNlaXZlZCAqLworI2RlZmluZSBQSFlfTV9BTl9SRgkJCUJJVF8xMwkvKiBSZW1vdGUgRmF1bHQgKi8KKwkJCQkJCQkJCS8qIEJpdCAxMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX01fQU5fQVNQCQlCSVRfMTEJLyogQXN5bW1ldHJpYyBQYXVzZSAqLworI2RlZmluZSBQSFlfTV9BTl9QQwkJCUJJVF8xMAkvKiBNQUMgUGF1c2UgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgUEhZX01fQU5fMTAwX0ZECQlCSVRfOAkvKiBBZHZlcnRpc2UgMTAwQmFzZS1UWCBGdWxsIER1cGxleCAqLworI2RlZmluZSBQSFlfTV9BTl8xMDBfSEQJCUJJVF83CS8qIEFkdmVydGlzZSAxMDBCYXNlLVRYIEhhbGYgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9NX0FOXzEwX0ZECQlCSVRfNgkvKiBBZHZlcnRpc2UgMTBCYXNlLVRYIEZ1bGwgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9NX0FOXzEwX0hECQlCSVRfNQkvKiBBZHZlcnRpc2UgMTBCYXNlLVRYIEhhbGYgRHVwbGV4ICovCisKKy8qIHNwZWNpYWwgZGVmaW5lcyBmb3IgRklCRVIgKDg4RTEwMTFTIG9ubHkpICovCisjZGVmaW5lIFBIWV9NX0FOX0FTUF9YCQlCSVRfOAkvKiBBc3ltbWV0cmljIFBhdXNlICovCisjZGVmaW5lIFBIWV9NX0FOX1BDX1gJCUJJVF83CS8qIE1BQyBQYXVzZSBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBQSFlfTV9BTl8xMDAwWF9BSEQJQklUXzYJLyogQWR2ZXJ0aXNlIDEwMDAwQmFzZS1YIEhhbGYgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9NX0FOXzEwMDBYX0FGRAlCSVRfNQkvKiBBZHZlcnRpc2UgMTAwMDBCYXNlLVggRnVsbCBEdXBsZXggKi8KKworLyogUGF1c2UgQml0cyAoUEhZX01fQU5fQVNQX1ggYW5kIFBIWV9NX0FOX1BDX1gpIGVuY29kaW5nICovCisjZGVmaW5lIFBIWV9NX1BfTk9fUEFVU0VfWAkoMDw8NykJLyogQml0ICA4Li4gNzoJbm8gUGF1c2UgTW9kZSAqLworI2RlZmluZSBQSFlfTV9QX1NZTV9NRF9YCSgxPDw3KQkvKiBCaXQgIDguLiA3OglzeW1tZXRyaWMgUGF1c2UgTW9kZSAqLworI2RlZmluZSBQSFlfTV9QX0FTWU1fTURfWAkoMjw8NykJLyogQml0ICA4Li4gNzoJYXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9NX1BfQk9USF9NRF9YCSgzPDw3KQkvKiBCaXQgIDguLiA3Oglib3RoIFBhdXNlIE1vZGUgKi8KKworLyoqKioqICBQSFlfTUFSVl8xMDAwVF9DVFJMCTE2IGJpdCByL3cJMTAwMEJhc2UtVCBDb250cm9sIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fMTAwMENfVEVTVAkoNzw8MTMpCS8qIEJpdCAxNS4uMTM6CVRlc3QgTW9kZXMgKi8KKyNkZWZpbmUgUEhZX01fMTAwMENfTVNFCQkoMTw8MTIpCS8qIEJpdCAxMjoJTWFudWFsIE1hc3Rlci9TbGF2ZSBFbmFibGUgKi8KKyNkZWZpbmUgUEhZX01fMTAwMENfTVNDCQkoMTw8MTEpCS8qIEJpdCAxMToJTS9TIENvbmZpZ3VyYXRpb24gKDE9TWFzdGVyKSAqLworI2RlZmluZSBQSFlfTV8xMDAwQ19NUEQJCSgxPDwxMCkJLyogQml0IDEwOglNdWx0aS1Qb3J0IERldmljZSAqLworI2RlZmluZSBQSFlfTV8xMDAwQ19BRkQJCSgxPDw5KQkvKiBCaXQgIDk6CUFkdmVydGlzZSBGdWxsIER1cGxleCAqLworI2RlZmluZSBQSFlfTV8xMDAwQ19BSEQJCSgxPDw4KQkvKiBCaXQgIDg6CUFkdmVydGlzZSBIYWxmIER1cGxleCAqLworCQkJCQkJCQkJLyogQml0ICA3Li4wOglyZXNlcnZlZCAqLworCisvKioqKiogIFBIWV9NQVJWX1BIWV9DVFJMCTE2IGJpdCByL3cJUEhZIFNwZWNpZmljIEN0cmwgUmVnICoqKioqLworI2RlZmluZSBQSFlfTV9QQ19UWF9GRkRfTVNLCSgzPDwxNCkJLyogQml0IDE1Li4xNDoJVHggRklGTyBEZXB0aCBNYXNrICovCisjZGVmaW5lIFBIWV9NX1BDX1JYX0ZGRF9NU0sJKDM8PDEyKQkvKiBCaXQgMTMuLjEyOglSeCBGSUZPIERlcHRoIE1hc2sgKi8KKyNkZWZpbmUgUEhZX01fUENfQVNTX0NSU19UWAkoMTw8MTEpCS8qIEJpdCAxMToJQXNzZXJ0IENSUyBvbiBUcmFuc21pdCAqLworI2RlZmluZSBQSFlfTV9QQ19GTF9HT09ECSgxPDwxMCkJLyogQml0IDEwOglGb3JjZSBMaW5rIEdvb2QgKi8KKyNkZWZpbmUgUEhZX01fUENfRU5fREVUX01TSwkoMzw8OCkJLyogQml0ICA5Li4gODoJRW5lcmd5IERldGVjdCBNYXNrICovCisjZGVmaW5lIFBIWV9NX1BDX0VOQV9FWFRfRAkoMTw8NykJLyogQml0ICA3OglFbmFibGUgRXh0LiBEaXN0YW5jZSAoMTBCVCkgKi8KKyNkZWZpbmUgUEhZX01fUENfTURJWF9NU0sJKDM8PDUpCS8qIEJpdCAgNi4uIDU6CU1ESS9NRElYIENvbmZpZy4gTWFzayAqLworI2RlZmluZSBQSFlfTV9QQ19ESVNfMTI1Q0xLCSgxPDw0KQkvKiBCaXQgIDQ6CURpc2FibGUgMTI1IENMSyAqLworI2RlZmluZSBQSFlfTV9QQ19NQUNfUE9XX1VQCSgxPDwzKQkvKiBCaXQgIDM6CU1BQyBQb3dlciB1cCAqLworI2RlZmluZSBQSFlfTV9QQ19TUUVfVF9FTkEJKDE8PDIpCS8qIEJpdCAgMjoJU1FFIFRlc3QgRW5hYmxlZCAqLworI2RlZmluZSBQSFlfTV9QQ19QT0xfUl9ESVMJKDE8PDEpCS8qIEJpdCAgMToJUG9sYXJpdHkgUmV2ZXJzYWwgRGlzYWJsZWQgKi8KKyNkZWZpbmUgUEhZX01fUENfRElTX0pBQkJFUgkoMTw8MCkJLyogQml0ICAwOglEaXNhYmxlIEphYmJlciAqLworCisjZGVmaW5lIFBIWV9NX1BDX0VOX0RFVAkJCVNISUZUOCgyKQkvKiBFbmVyZ3kgRGV0ZWN0IChNb2RlIDEpICovCisjZGVmaW5lIFBIWV9NX1BDX0VOX0RFVF9QTFVTCVNISUZUOCgzKQkvKiBFbmVyZ3kgRGV0ZWN0IFBsdXMgKE1vZGUgMikgKi8KKworI2RlZmluZSBQSFlfTV9QQ19NRElfWE1PREUoeCkJU0hJRlQ1KHgpCQorI2RlZmluZSBQSFlfTV9QQ19NQU5fTURJCTAgICAgCS8qIDAwID0gTWFudWFsIE1ESSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFBIWV9NX1BDX01BTl9NRElYCTEJCS8qIDAxID0gTWFudWFsIE1ESVggY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBQSFlfTV9QQ19FTkFfQVVUTwkzCQkvKiAxMSA9IEVuYWJsZSBBdXRvbWF0aWMgQ3Jvc3NvdmVyICovCisKKy8qKioqKiAgUEhZX01BUlZfUEhZX1NUQVQJMTYgYml0IHIvbwlQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fUFNfU1BFRURfTVNLCSgzPDwxNCkJLyogQml0IDE1Li4xNDoJU3BlZWQgTWFzayAqLworI2RlZmluZSBQSFlfTV9QU19TUEVFRF8xMDAwCSgxPDwxNSkJLyogICAgICAgMTAgPSAxMDAwIE1icHMgKi8KKyNkZWZpbmUgUEhZX01fUFNfU1BFRURfMTAwCSgxPDwxNCkJLyogICAgICAgMDEgPSAgMTAwIE1icHMgKi8KKyNkZWZpbmUgUEhZX01fUFNfU1BFRURfMTAJMAkJLyogICAgICAgMDAgPSAgIDEwIE1icHMgKi8KKyNkZWZpbmUgUEhZX01fUFNfRlVMTF9EVVAJKDE8PDEzKQkvKiBCaXQgMTM6CUZ1bGwgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9NX1BTX1BBR0VfUkVDCSgxPDwxMikJLyogQml0IDEyOglQYWdlIFJlY2VpdmVkICovCisjZGVmaW5lIFBIWV9NX1BTX1NQRFVQX1JFUwkoMTw8MTEpCS8qIEJpdCAxMToJU3BlZWQgJiBEdXBsZXggUmVzb2x2ZWQgKi8KKyNkZWZpbmUgUEhZX01fUFNfTElOS19VUAkoMTw8MTApCS8qIEJpdCAxMDoJTGluayBVcCAqLworI2RlZmluZSBQSFlfTV9QU19DQUJMRV9NU0sJKDM8PDcpCS8qIEJpdCAgOS4uIDc6CUNhYmxlIExlbmd0aCBNYXNrICovCisjZGVmaW5lIFBIWV9NX1BTX01ESV9YX1NUQVQJKDE8PDYpCS8qIEJpdCAgNjoJTURJIENyb3Nzb3ZlciBTdGF0ICgxPU1ESVgpICovCisjZGVmaW5lIFBIWV9NX1BTX0RPV05TX1NUQVQJKDE8PDUpCS8qIEJpdCAgNToJRG93bnNoaWZ0IFN0YXR1cyAoMT1kb3duc2guKSAqLworI2RlZmluZSBQSFlfTV9QU19FTkRFVF9TVEFUCSgxPDw0KQkvKiBCaXQgIDQ6CUVuZXJneSBEZXRlY3QgU3RhdHVzICgxPWFjdCkgKi8KKyNkZWZpbmUgUEhZX01fUFNfVFhfUF9FTgkoMTw8MykJLyogQml0ICAzOglUeCBQYXVzZSBFbmFibGVkICovCisjZGVmaW5lIFBIWV9NX1BTX1JYX1BfRU4JKDE8PDIpCS8qIEJpdCAgMjoJUnggUGF1c2UgRW5hYmxlZCAqLworI2RlZmluZSBQSFlfTV9QU19QT0xfUkVWCSgxPDwxKQkvKiBCaXQgIDE6CVBvbGFyaXR5IFJldmVyc2VkICovCisjZGVmaW5lIFBIWV9NX1BDX0pBQkJFUgkJKDE8PDApCS8qIEJpdCAgMDoJSmFiYmVyICovCisKKyNkZWZpbmUgUEhZX01fUFNfUEFVU0VfTVNLCShQSFlfTV9QU19UWF9QX0VOIHwgUEhZX01fUFNfUlhfUF9FTikKKworLyoqKioqICBQSFlfTUFSVl9JTlRfTUFTSwkxNiBiaXQgci93CUludGVycnVwdCBNYXNrIFJlZyAqKioqKi8KKy8qKioqKiAgUEhZX01BUlZfSU5UX1NUQVQJMTYgYml0IHIvbwlJbnRlcnJ1cHQgU3RhdHVzIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fSVNfQU5fRVJST1IJKDE8PDE1KQkvKiBCaXQgMTU6CUF1dG8tTmVnb3RpYXRpb24gRXJyb3IgKi8KKyNkZWZpbmUgUEhZX01fSVNfTFNQX0NIQU5HRQkoMTw8MTQpCS8qIEJpdCAxNDoJTGluayBTcGVlZCBDaGFuZ2VkICovCisjZGVmaW5lIFBIWV9NX0lTX0RVUF9DSEFOR0UJKDE8PDEzKQkvKiBCaXQgMTM6CUR1cGxleCBNb2RlIENoYW5nZWQgKi8KKyNkZWZpbmUgUEhZX01fSVNfQU5fUFIJCSgxPDwxMikJLyogQml0IDEyOglQYWdlIFJlY2VpdmVkICovCisjZGVmaW5lIFBIWV9NX0lTX0FOX0NPTVBMCSgxPDwxMSkJLyogQml0IDExOglBdXRvLU5lZ290aWF0aW9uIENvbXBsZXRlZCAqLworI2RlZmluZSBQSFlfTV9JU19MU1RfQ0hBTkdFCSgxPDwxMCkJLyogQml0IDEwOglMaW5rIFN0YXR1cyBDaGFuZ2VkICovCisjZGVmaW5lIFBIWV9NX0lTX1NZTUJfRVJST1IJKDE8PDkpCS8qIEJpdCAgOToJU3ltYm9sIEVycm9yICovCisjZGVmaW5lIFBIWV9NX0lTX0ZBTFNFX0NBUlIJKDE8PDgpCS8qIEJpdCAgODoJRmFsc2UgQ2FycmllciAqLworI2RlZmluZSBQSFlfTV9JU19GSUZPX0VSUk9SCSgxPDw3KQkvKiBCaXQgIDc6CUZJRk8gT3ZlcmZsb3cvVW5kZXJydW4gRXJyb3IgKi8KKyNkZWZpbmUgUEhZX01fSVNfTURJX0NIQU5HRQkoMTw8NikJLyogQml0ICA2OglNREkgQ3Jvc3NvdmVyIENoYW5nZWQgKi8KKyNkZWZpbmUgUEhZX01fSVNfRE9XTlNIX0RFVAkoMTw8NSkJLyogQml0ICA1OglEb3duc2hpZnQgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUEhZX01fSVNfRU5EX0NIQU5HRQkoMTw8NCkJLyogQml0ICA0OglFbmVyZ3kgRGV0ZWN0IENoYW5nZWQgKi8KKwkJCQkJCQkJCS8qIEJpdCAgMy4uMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX01fSVNfUE9MX0NIQU5HRQkoMTw8MSkJLyogQml0ICAxOglQb2xhcml0eSBDaGFuZ2VkICovCisjZGVmaW5lIFBIWV9NX0lTX0pBQkJFUgkJKDE8PDApCS8qIEJpdCAgMDoJSmFiYmVyICovCisKKyNkZWZpbmUgUEhZX01fREVGX01TSwkJKFBIWV9NX0lTX0FOX0VSUk9SIHwgUEhZX01fSVNfQU5fUFIgfCBcCisJCQkJCQkJUEhZX01fSVNfTFNUX0NIQU5HRSB8IFBIWV9NX0lTX0ZJRk9fRVJST1IpCisKKy8qKioqKiAgUEhZX01BUlZfRVhUX0NUUkwJMTYgYml0IHIvdwlFeHQuIFBIWSBTcGVjaWZpYyBDdHJsICoqKioqLworI2RlZmluZSBQSFlfTV9FQ19NX0RTQ19NU0sJKDM8PDEwKQkvKiBCaXQgMTEuLjEwOglNYXN0ZXIgZG93bnNoaWZ0IGNvdW50ZXIgKi8KKyNkZWZpbmUgUEhZX01fRUNfU19EU0NfTVNLCSgzPDw4KQkvKiBCaXQgIDkuLiA4OglTbGF2ZSAgZG93bnNoaWZ0IGNvdW50ZXIgKi8KKyNkZWZpbmUgUEhZX01fRUNfTUFDX1NfTVNLCSg3PDw0KQkvKiBCaXQgIDYuLiA0OglEZWYuIE1BQyBpbnRlcmZhY2Ugc3BlZWQgKi8KKyNkZWZpbmUgUEhZX01fRUNfRklCX0FOX0VOQQkoMTw8MykJLyogQml0ICAzOglGaWJlciBBdXRvLU5lZy4gRW5hYmxlICovCisKKyNkZWZpbmUgUEhZX01fRUNfTV9EU0MoeCkJCVNISUZUMTAoeCkJLyogMDA9MXg7IDAxPTJ4OyAxMD0zeDsgMTE9NHggKi8KKyNkZWZpbmUgUEhZX01fRUNfU19EU0MoeCkJCVNISUZUOCh4KQkvKiAwMD1kaXM7IDAxPTF4OyAxMD0yeDsgMTE9M3ggKi8KKyNkZWZpbmUgUEhZX01fRUNfTUFDX1MoeCkJCVNISUZUNCh4KQkvKiAwMVg9MDsgMTEwPTIuNTsgMTExPTI1IChNSHopICovCisKKyNkZWZpbmUgTUFDX1RYX0NMS18wX01IWgkyCisjZGVmaW5lIE1BQ19UWF9DTEtfMl81X01IWgk2CisjZGVmaW5lIE1BQ19UWF9DTEtfMjVfTUhaCTcKKworLyoqKioqICBQSFlfTUFSVl9MRURfQ1RSTAkxNiBiaXQgci93CUxFRCBDb250cm9sIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fTEVEQ19ESVNfTEVECSgxPDwxNSkJLyogQml0IDE1OglEaXNhYmxlIExFRCAqLworI2RlZmluZSBQSFlfTV9MRURDX1BVTFNfTVNLCSg3PDwxMikJLyogQml0IDE0Li4xMjogIFB1bHNlIFN0cmV0Y2ggTWFzayAqLworI2RlZmluZSBQSFlfTV9MRURDX0ZfSU5UCSgxPDwxMSkJLyogQml0IDExOglGb3JjZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUEhZX01fTEVEQ19CTF9SX01TSwkoNzw8OCkJLyogQml0IDEwLi4gODogIEJsaW5rIFJhdGUgTWFzayAqLworCQkJCQkJCQkJLyogQml0ICA3Li4gNToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX01fTEVEQ19MSU5LX01TSwkoMzw8MykJLyogQml0ICA0Li4gMzoJTGluayBDb250cm9sIE1hc2sgKi8KKyNkZWZpbmUgUEhZX01fTEVEQ19EUF9DVFJMCSgxPDwyKQkvKiBCaXQgIDI6CUR1cGxleCBDb250cm9sICovCisjZGVmaW5lIFBIWV9NX0xFRENfUlhfQ1RSTAkoMTw8MSkJLyogQml0ICAxOglSeCBhY3Rpdml0eSAvIExpbmsgKi8KKyNkZWZpbmUgUEhZX01fTEVEQ19UWF9DVFJMCSgxPDwwKQkvKiBCaXQgIDA6CVR4IGFjdGl2aXR5IC8gTGluayAqLworCisjZGVmaW5lIFBIWV9NX0xFRF9QVUxTX0RVUih4KQlTSElGVDEyKHgpCS8qIFB1bHNlIFN0cmV0Y2ggRHVyYXRpb24gKi8KKworI2RlZmluZQlQVUxTX05PX1NUUgkJMAkJLyogbm8gcHVsc2Ugc3RyZXRjaGluZyAqLworI2RlZmluZQlQVUxTXzIxTVMJCTEJCS8qIDIxIG1zIHRvIDQyIG1zICovCisjZGVmaW5lIFBVTFNfNDJNUwkJMgkJLyogNDIgbXMgdG8gODQgbXMgKi8KKyNkZWZpbmUgUFVMU184NE1TCQkzCQkvKiA4NCBtcyB0byAxNzAgbXMgKi8KKyNkZWZpbmUgUFVMU18xNzBNUwkJNAkJLyogMTcwIG1zIHRvIDM0MCBtcyAqLworI2RlZmluZSBQVUxTXzM0ME1TCQk1CQkvKiAzNDAgbXMgdG8gNjcwIG1zICovCisjZGVmaW5lIFBVTFNfNjcwTVMJCTYJCS8qIDY3MCBtcyB0byAxLjMgcyAqLworI2RlZmluZSBQVUxTXzEzMDBNUwkJNwkJLyogMS4zIHMgdG8gMi43IHMgKi8KKworI2RlZmluZSBQSFlfTV9MRURfQkxJTktfUlQoeCkJU0hJRlQ4KHgpCS8qIEJsaW5rIFJhdGUgKi8KKworI2RlZmluZSBCTElOS180Mk1TCQkwCQkvKiA0MiBtcyAqLworI2RlZmluZSBCTElOS184NE1TCQkxCQkvKiA4NCBtcyAqLworI2RlZmluZSBCTElOS18xNzBNUwkJMgkJLyogMTcwIG1zICovCisjZGVmaW5lIEJMSU5LXzM0ME1TCQkzCQkvKiAzNDAgbXMgKi8KKyNkZWZpbmUgQkxJTktfNjcwTVMJCTQJCS8qIDY3MCBtcyAqLworCQkJCQkJCQkvKiB2YWx1ZXMgNSAtIDc6IHJlc2VydmVkICovCisKKy8qKioqKiAgUEhZX01BUlZfTEVEX09WRVIJMTYgYml0IHIvdwlNYW51YWwgTEVEIE92ZXJyaWRlIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fTEVEX01PX0RVUCh4KQkJU0hJRlQxMCh4KQkvKiBCaXQgMTEuLjEwOiAgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9NX0xFRF9NT18xMCh4KQkJU0hJRlQ4KHgpCS8qIEJpdCAgOS4uIDg6ICBMaW5rIDEwICovCisjZGVmaW5lIFBIWV9NX0xFRF9NT18xMDAoeCkJCVNISUZUNih4KQkvKiBCaXQgIDcuLiA2OiAgTGluayAxMDAgKi8KKyNkZWZpbmUgUEhZX01fTEVEX01PXzEwMDAoeCkJU0hJRlQ0KHgpCS8qIEJpdCAgNS4uIDQ6ICBMaW5rIDEwMDAgKi8KKyNkZWZpbmUgUEhZX01fTEVEX01PX1JYKHgpCQlTSElGVDIoeCkJLyogQml0ICAzLi4gMjogIFJ4ICovCisjZGVmaW5lIFBIWV9NX0xFRF9NT19UWCh4KQkJU0hJRlQwKHgpCS8qIEJpdCAgMS4uIDA6ICBUeCAqLworCisjZGVmaW5lIE1PX0xFRF9OT1JNCQkJMAorI2RlZmluZSBNT19MRURfQkxJTksJCTEKKyNkZWZpbmUgTU9fTEVEX09GRgkJCTIKKyNkZWZpbmUgTU9fTEVEX09OCQkJMworCisvKioqKiogIFBIWV9NQVJWX0VYVF9DVFJMXzIJMTYgYml0IHIvdwlFeHQuIFBIWSBTcGVjaWZpYyBDdHJsIDIgKioqKiovCisJCQkJCQkJCQkvKiBCaXQgMTUuLiA3OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTV9FQzJfRklfSU1QRUQJKDE8PDYpCS8qIEJpdCAgNjoJRmliZXIgSW5wdXQgIEltcGVkYW5jZSAqLworI2RlZmluZSBQSFlfTV9FQzJfRk9fSU1QRUQJKDE8PDUpCS8qIEJpdCAgNToJRmliZXIgT3V0cHV0IEltcGVkYW5jZSAqLworI2RlZmluZSBQSFlfTV9FQzJfRk9fTV9DTEsJKDE8PDQpCS8qIEJpdCAgNDoJRmliZXIgTW9kZSBDbG9jayBFbmFibGUgKi8KKyNkZWZpbmUgUEhZX01fRUMyX0ZPX0JPT1NUCSgxPDwzKQkvKiBCaXQgIDM6CUZpYmVyIE91dHB1dCBCb29zdCAqLworI2RlZmluZSBQSFlfTV9FQzJfRk9fQU1fTVNLCTcJCS8qIEJpdCAgMi4uIDA6CUZpYmVyIE91dHB1dCBBbXBsaXR1ZGUgKi8KKworLyoqKioqCVBIWV9NQVJWX0VYVF9QX1NUQVQgMTYgYml0IHIvdwlFeHQuIFBIWSBTcGVjaWZpYyBTdGF0dXMgKioqKiovCisjZGVmaW5lIFBIWV9NX0ZDX0FVVE9fU0VMCSgxPDwxNSkJLyogQml0IDE1OglGaWJlci9Db3BwZXIgQXV0byBTZWwuIGRpcy4gKi8KKyNkZWZpbmUgUEhZX01fRkNfQU5fUkVHX0FDQyAoMTw8MTQpIC8qIEJpdCAxNDoJRmliZXIvQ29wcGVyIEF1dG9uZWcuIHJlZyBhY2MgKi8KKyNkZWZpbmUgUEhZX01fRkNfUkVTVUxVVElPTiAoMTw8MTMpCS8qIEJpdCAxMzoJRmliZXIvQ29wcGVyIFJlc3VsdXRpb24gKi8KKyNkZWZpbmUgUEhZX01fU0VSX0lGX0FOX0JQICAoMTw8MTIpIC8qIEJpdCAxMjoJU2VyIElGIGF1dG9uZWcuIGJ5cGFzcyBlbmFibGUgKi8KKyNkZWZpbmUgUEhZX01fU0VSX0lGX0JQX1NUCSgxPDwxMSkgLyogQml0IDExOglTZXIgSUYgYXV0b25lZy4gYnlwYXNzIHN0YXR1cyAqLworI2RlZmluZSBQSFlfTV9JUlFfUE9MQVJJVFkJKDE8PDEwKSAvKiBCaXQgMTA6CUlSUSBwb2xhcml0eSAqLworCQkJCQkJCQkJLyogQml0IDkuLjQ6IHJlc2VydmVkICovCisjZGVmaW5lIFBIWV9NX1VORE9DMQkJKDE8PCA3KSAvKiB1bmRvY3VtZW50ZWQgYml0ICEhICovCisjZGVmaW5lIFBIWV9NX01PREVfTUFTSwkJKDB4Zjw8MCkvKiBCaXQgMy4uMDogY29weSBvZiBIV0NGRyBNT0RFWzM6MF0gKi8KKworCisvKioqKiogIFBIWV9NQVJWX0NBQkxFX0RJQUcJMTYgYml0IHIvbwlDYWJsZSBEaWFnbm9zdGljIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fQ0FCRF9FTkFfVEVTVAkoMTw8MTUpCS8qIEJpdCAxNToJRW5hYmxlIFRlc3QgKi8KKyNkZWZpbmUgUEhZX01fQ0FCRF9TVEFUX01TSwkoMzw8MTMpCS8qIEJpdCAxNC4uMTM6CVN0YXR1cyAqLworCQkJCQkJCQkJLyogQml0IDEyLi4gODoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX01fQ0FCRF9ESVNUX01TSwkweGZmCS8qIEJpdCAgNy4uIDA6CURpc3RhbmNlICovCisKKy8qIHZhbHVlcyBmb3IgQ2FibGUgRGlhZ25vc3RpYyBTdGF0dXMgKDExPWZhaWw7IDAwPU9LOyAxMD1vcGVuOyAwMT1zaG9ydCkgKi8KKyNkZWZpbmUgQ0FCRF9TVEFUX05PUk1BTAkwCisjZGVmaW5lIENBQkRfU1RBVF9TSE9SVAkJMQorI2RlZmluZSBDQUJEX1NUQVRfT1BFTgkJMgorI2RlZmluZSBDQUJEX1NUQVRfRkFJTAkJMworCisKKy8qCisgKiBHTUFDIHJlZ2lzdGVycworICoKKyAqIFRoZSBHTUFDIHJlZ2lzdGVycyBhcmUgMTYgb3IgMzIgYml0cyB3aWRlLgorICogVGhlIEdNQUNzIGhvc3QgcHJvY2Vzc29yIGludGVyZmFjZSBpcyAxNiBiaXRzIHdpZGUsCisgKiB0aGVyZWZvcmUgQUxMIHJlZ2lzdGVycyB3aWxsIGJlIGFkZHJlc3NlZCB3aXRoIDE2IGJpdCBhY2Nlc3Nlcy4KKyAqCisgKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgcHJvdmlkZWQgdG8gYWNjZXNzIHRoZSBHTUFDIHJlZ2lzdGVycworICogR01fSU4xNigpLCBHTV9PVVQxNiwgR01fSU4zMigpLCBHTV9PVVQzMigpLCBHTV9JTkFEUigpLCBHTV9PVVRBRFIoKSwKKyAqIEdNX0lOSEFTSCgpLCBhbmQgR01fT1VUSEFTSCgpLgorICogVGhlIG1hY3JvcyBhcmUgZGVmaW5lZCBpbiBTa0dlSHcuaC4KKyAqCisgKiBOb3RlOglOQSByZWcJPSBOZXR3b3JrIEFkZHJlc3MgZS5nIERBLCBTQSBldGMuCisgKgorICovCisKKy8qIFBvcnQgUmVnaXN0ZXJzICovCisjZGVmaW5lIEdNX0dQX1NUQVQJCTB4MDAwMAkJLyogMTYgYml0IHIvbwlHZW5lcmFsIFB1cnBvc2UgU3RhdHVzICovCisjZGVmaW5lIEdNX0dQX0NUUkwJCTB4MDAwNAkJLyogMTYgYml0IHIvdwlHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCAqLworI2RlZmluZSBHTV9UWF9DVFJMCQkweDAwMDgJCS8qIDE2IGJpdCByL3cJVHJhbnNtaXQgQ29udHJvbCBSZWcuICovCisjZGVmaW5lIEdNX1JYX0NUUkwJCTB4MDAwYwkJLyogMTYgYml0IHIvdwlSZWNlaXZlIENvbnRyb2wgUmVnLiAqLworI2RlZmluZSBHTV9UWF9GTE9XX0NUUkwJMHgwMDEwCQkvKiAxNiBiaXQgci93CVRyYW5zbWl0IEZsb3ctQ29udHJvbCAqLworI2RlZmluZSBHTV9UWF9QQVJBTQkJMHgwMDE0CQkvKiAxNiBiaXQgci93CVRyYW5zbWl0IFBhcmFtZXRlciBSZWcuICovCisjZGVmaW5lIEdNX1NFUklBTF9NT0RFCTB4MDAxOAkJLyogMTYgYml0IHIvdwlTZXJpYWwgTW9kZSBSZWdpc3RlciAqLworCisvKiBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgR01fU1JDX0FERFJfMUwJMHgwMDFjCQkvKiAxNiBiaXQgci93CVNvdXJjZSBBZGRyZXNzIDEgKGxvdykgKi8KKyNkZWZpbmUgR01fU1JDX0FERFJfMU0JMHgwMDIwCQkvKiAxNiBiaXQgci93CVNvdXJjZSBBZGRyZXNzIDEgKG1pZGRsZSkgKi8KKyNkZWZpbmUgR01fU1JDX0FERFJfMUgJMHgwMDI0CQkvKiAxNiBiaXQgci93CVNvdXJjZSBBZGRyZXNzIDEgKGhpZ2gpICovCisjZGVmaW5lIEdNX1NSQ19BRERSXzJMCTB4MDAyOAkJLyogMTYgYml0IHIvdwlTb3VyY2UgQWRkcmVzcyAyIChsb3cpICovCisjZGVmaW5lIEdNX1NSQ19BRERSXzJNCTB4MDAyYwkJLyogMTYgYml0IHIvdwlTb3VyY2UgQWRkcmVzcyAyIChtaWRkbGUpICovCisjZGVmaW5lIEdNX1NSQ19BRERSXzJICTB4MDAzMAkJLyogMTYgYml0IHIvdwlTb3VyY2UgQWRkcmVzcyAyIChoaWdoKSAqLworCisvKiBNdWx0aWNhc3QgQWRkcmVzcyBIYXNoIFJlZ2lzdGVycyAqLworI2RlZmluZSBHTV9NQ19BRERSX0gxCTB4MDAzNAkJLyogMTYgYml0IHIvdwlNdWx0aWNhc3QgQWRkcmVzcyBIYXNoIDEgKi8KKyNkZWZpbmUgR01fTUNfQUREUl9IMgkweDAwMzgJCS8qIDE2IGJpdCByL3cJTXVsdGljYXN0IEFkZHJlc3MgSGFzaCAyICovCisjZGVmaW5lIEdNX01DX0FERFJfSDMJMHgwMDNjCQkvKiAxNiBiaXQgci93CU11bHRpY2FzdCBBZGRyZXNzIEhhc2ggMyAqLworI2RlZmluZSBHTV9NQ19BRERSX0g0CTB4MDA0MAkJLyogMTYgYml0IHIvdwlNdWx0aWNhc3QgQWRkcmVzcyBIYXNoIDQgKi8KKworLyogSW50ZXJydXB0IFNvdXJjZSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgR01fVFhfSVJRX1NSQwkweDAwNDQJCS8qIDE2IGJpdCByL28JVHggT3ZlcmZsb3cgSVJRIFNvdXJjZSAqLworI2RlZmluZSBHTV9SWF9JUlFfU1JDCTB4MDA0OAkJLyogMTYgYml0IHIvbwlSeCBPdmVyZmxvdyBJUlEgU291cmNlICovCisjZGVmaW5lIEdNX1RSX0lSUV9TUkMJMHgwMDRjCQkvKiAxNiBiaXQgci9vCVR4L1J4IE92ZXIuIElSUSBTb3VyY2UgKi8KKworLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXJzICovCisjZGVmaW5lIEdNX1RYX0lSUV9NU0sJMHgwMDUwCQkvKiAxNiBiaXQgci93CVR4IE92ZXJmbG93IElSUSBNYXNrICovCisjZGVmaW5lIEdNX1JYX0lSUV9NU0sJMHgwMDU0CQkvKiAxNiBiaXQgci93CVJ4IE92ZXJmbG93IElSUSBNYXNrICovCisjZGVmaW5lIEdNX1RSX0lSUV9NU0sJMHgwMDU4CQkvKiAxNiBiaXQgci93CVR4L1J4IE92ZXIuIElSUSBNYXNrICovCisKKy8qIFNlcmlhbCBNYW5hZ2VtZW50IEludGVyZmFjZSAoU01JKSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgR01fU01JX0NUUkwJCTB4MDA4MAkJLyogMTYgYml0IHIvdwlTTUkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBHTV9TTUlfREFUQQkJMHgwMDg0CQkvKiAxNiBiaXQgci93CVNNSSBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lIEdNX1BIWV9BRERSCQkweDAwODgJCS8qIDE2IGJpdCByL3cJR1BIWSBBZGRyZXNzIFJlZ2lzdGVyICovCisKKy8qIE1JQiBDb3VudGVycyAqLworI2RlZmluZSBHTV9NSUJfQ05UX0JBU0UJMHgwMTAwCQkvKiBCYXNlIEFkZHJlc3Mgb2YgTUlCIENvdW50ZXJzICovCisjZGVmaW5lIEdNX01JQl9DTlRfU0laRQk0NAkJCS8qIE51bWJlciBvZiBNSUIgQ291bnRlcnMgKi8KKworLyoKKyAqIE1JQiBDb3VudGVycyBiYXNlIGFkZHJlc3MgZGVmaW5pdGlvbnMgKGxvdyB3b3JkKSAtCisgKiB1c2Ugb2Zmc2V0IDQgZm9yIGFjY2VzcyB0byBoaWdoIHdvcmQJKDMyIGJpdCByL28pCisgKi8KKyNkZWZpbmUgR01fUlhGX1VDX09LIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAwKQkvKiBVbmljYXN0IEZyYW1lcyBSZWNlaXZlZCBPSyAqLworI2RlZmluZSBHTV9SWEZfQkNfT0sgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDgpCS8qIEJyb2FkY2FzdCBGcmFtZXMgUmVjZWl2ZWQgT0sgKi8KKyNkZWZpbmUgR01fUlhGX01QQVVTRSBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMTYpCS8qIFBhdXNlIE1BQyBDdHJsIEZyYW1lcyBSZWNlaXZlZCAqLworI2RlZmluZSBHTV9SWEZfTUNfT0sgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDI0KQkvKiBNdWx0aWNhc3QgRnJhbWVzIFJlY2VpdmVkIE9LICovCisjZGVmaW5lIEdNX1JYRl9GQ1NfRVJSIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAzMikJLyogUnggRnJhbWUgQ2hlY2sgU2VxLiBFcnJvciAqLworCS8qIEdNX01JQl9DTlRfQkFTRSArIDQwOglyZXNlcnZlZCAqLworI2RlZmluZSBHTV9SWE9fT0tfTE8gXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDQ4KQkvKiBPY3RldHMgUmVjZWl2ZWQgT0sgTG93ICovCisjZGVmaW5lIEdNX1JYT19PS19ISSBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgNTYpCS8qIE9jdGV0cyBSZWNlaXZlZCBPSyBIaWdoICovCisjZGVmaW5lIEdNX1JYT19FUlJfTE8gXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDY0KQkvKiBPY3RldHMgUmVjZWl2ZWQgSW52YWxpZCBMb3cgKi8KKyNkZWZpbmUgR01fUlhPX0VSUl9ISSBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgNzIpCS8qIE9jdGV0cyBSZWNlaXZlZCBJbnZhbGlkIEhpZ2ggKi8KKyNkZWZpbmUgR01fUlhGX1NIVCBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgODApCS8qIEZyYW1lcyA8NjQgQnl0ZSBSZWNlaXZlZCBPSyAqLworI2RlZmluZSBHTV9SWEVfRlJBRyBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgODgpCS8qIEZyYW1lcyA8NjQgQnl0ZSBSZWNlaXZlZCB3aXRoIEZDUyBFcnIgKi8KKyNkZWZpbmUgR01fUlhGXzY0QiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgOTYpCS8qIDY0IEJ5dGUgUnggRnJhbWUgKi8KKyNkZWZpbmUgR01fUlhGXzEyN0IgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDEwNCkJLyogNjUtMTI3IEJ5dGUgUnggRnJhbWUgKi8KKyNkZWZpbmUgR01fUlhGXzI1NUIgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDExMikJLyogMTI4LTI1NSBCeXRlIFJ4IEZyYW1lICovCisjZGVmaW5lIEdNX1JYRl81MTFCIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAxMjApCS8qIDI1Ni01MTEgQnl0ZSBSeCBGcmFtZSAqLworI2RlZmluZSBHTV9SWEZfMTAyM0IgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDEyOCkJLyogNTEyLTEwMjMgQnl0ZSBSeCBGcmFtZSAqLworI2RlZmluZSBHTV9SWEZfMTUxOEIgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDEzNikJLyogMTAyNC0xNTE4IEJ5dGUgUnggRnJhbWUgKi8KKyNkZWZpbmUgR01fUlhGX01BWF9TWiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMTQ0KQkvKiAxNTE5LU1heFNpemUgQnl0ZSBSeCBGcmFtZSAqLworI2RlZmluZSBHTV9SWEZfTE5HX0VSUiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMTUyKQkvKiBSeCBGcmFtZSB0b28gTG9uZyBFcnJvciAqLworI2RlZmluZSBHTV9SWEZfSkFCX1BLVCBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMTYwKQkvKiBSeCBKYWJiZXIgUGFja2V0IEZyYW1lICovCisJLyogR01fTUlCX0NOVF9CQVNFICsgMTY4OglyZXNlcnZlZCAqLworI2RlZmluZSBHTV9SWEVfRklGT19PViBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMTc2KQkvKiBSeCBGSUZPIG92ZXJmbG93IEV2ZW50ICovCisJLyogR01fTUlCX0NOVF9CQVNFICsgMTg0OglyZXNlcnZlZCAqLworI2RlZmluZSBHTV9UWEZfVUNfT0sgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDE5MikJLyogVW5pY2FzdCBGcmFtZXMgWG1pdHRlZCBPSyAqLworI2RlZmluZSBHTV9UWEZfQkNfT0sgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDIwMCkJLyogQnJvYWRjYXN0IEZyYW1lcyBYbWl0dGVkIE9LICovCisjZGVmaW5lIEdNX1RYRl9NUEFVU0UgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDIwOCkJLyogUGF1c2UgTUFDIEN0cmwgRnJhbWVzIFhtaXR0ZWQgKi8KKyNkZWZpbmUgR01fVFhGX01DX09LIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyMTYpCS8qIE11bHRpY2FzdCBGcmFtZXMgWG1pdHRlZCBPSyAqLworI2RlZmluZSBHTV9UWE9fT0tfTE8gXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDIyNCkJLyogT2N0ZXRzIFRyYW5zbWl0dGVkIE9LIExvdyAqLworI2RlZmluZSBHTV9UWE9fT0tfSEkgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDIzMikJLyogT2N0ZXRzIFRyYW5zbWl0dGVkIE9LIEhpZ2ggKi8KKyNkZWZpbmUgR01fVFhGXzY0QiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMjQwKQkvKiA2NCBCeXRlIFR4IEZyYW1lICovCisjZGVmaW5lIEdNX1RYRl8xMjdCIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyNDgpCS8qIDY1LTEyNyBCeXRlIFR4IEZyYW1lICovCisjZGVmaW5lIEdNX1RYRl8yNTVCIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyNTYpCS8qIDEyOC0yNTUgQnl0ZSBUeCBGcmFtZSAqLworI2RlZmluZSBHTV9UWEZfNTExQiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMjY0KQkvKiAyNTYtNTExIEJ5dGUgVHggRnJhbWUgKi8KKyNkZWZpbmUgR01fVFhGXzEwMjNCIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyNzIpCS8qIDUxMi0xMDIzIEJ5dGUgVHggRnJhbWUgKi8KKyNkZWZpbmUgR01fVFhGXzE1MThCIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyODApCS8qIDEwMjQtMTUxOCBCeXRlIFR4IEZyYW1lICovCisjZGVmaW5lIEdNX1RYRl9NQVhfU1ogXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDI4OCkJLyogMTUxOS1NYXhTaXplIEJ5dGUgVHggRnJhbWUgKi8KKwkvKiBHTV9NSUJfQ05UX0JBU0UgKyAyOTY6CXJlc2VydmVkICovCisjZGVmaW5lIEdNX1RYRl9DT0wgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDMwNCkJLyogVHggQ29sbGlzaW9uICovCisjZGVmaW5lIEdNX1RYRl9MQVRfQ09MIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAzMTIpCS8qIFR4IExhdGUgQ29sbGlzaW9uICovCisjZGVmaW5lIEdNX1RYRl9BQk9fQ09MIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAzMjApCS8qIFR4IGFib3J0ZWQgZHVlIHRvIEV4Y2VzLiBDb2wuICovCisjZGVmaW5lIEdNX1RYRl9NVUxfQ09MIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAzMjgpCS8qIFR4IE11bHRpcGxlIENvbGxpc2lvbiAqLworI2RlZmluZSBHTV9UWEZfU05HX0NPTCBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMzM2KQkvKiBUeCBTaW5nbGUgQ29sbGlzaW9uICovCisjZGVmaW5lIEdNX1RYRV9GSUZPX1VSIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAzNDQpCS8qIFR4IEZJRk8gVW5kZXJydW4gRXZlbnQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBHTUFDIEJpdCBEZWZpbml0aW9ucworICoKKyAqIElmIHRoZSBiaXQgYWNjZXNzIGJlaGF2aW91ciBkaWZmZXJzIGZyb20gdGhlIHJlZ2lzdGVyIGFjY2VzcyBiZWhhdmlvdXIKKyAqIChyL3csIHIvbykgdGhpcyBpcyBkb2N1bWVudGVkIGFmdGVyIHRoZSBiaXQgbnVtYmVyLgorICogVGhlIGZvbGxvd2luZyBiaXQgYWNjZXNzIGJlaGF2aW91cnMgYXJlIHVzZWQ6CisgKgkoc2MpCXNlbGYgY2xlYXJpbmcKKyAqCShyL28pCXJlYWQgb25seQorICovCisKKy8qCUdNX0dQX1NUQVQJMTYgYml0IHIvbwlHZW5lcmFsIFB1cnBvc2UgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEdNX0dQU1JfU1BFRUQJCSgxPDwxNSkgLyogQml0IDE1OglQb3J0IFNwZWVkICgxID0gMTAwIE1icHMpICovCisjZGVmaW5lIEdNX0dQU1JfRFVQTEVYCQkoMTw8MTQpIC8qIEJpdCAxNDoJRHVwbGV4IE1vZGUgKDEgPSBGdWxsKSAqLworI2RlZmluZSBHTV9HUFNSX0ZDX1RYX0RJUwkoMTw8MTMpIC8qIEJpdCAxMzoJVHggRmxvdy1Db250cm9sIE1vZGUgRGlzYWJsZWQgKi8KKyNkZWZpbmUgR01fR1BTUl9MSU5LX1VQCQkoMTw8MTIpCS8qIEJpdCAxMjoJTGluayBVcCBTdGF0dXMgKi8KKyNkZWZpbmUgR01fR1BTUl9QQVVTRQkJKDE8PDExKQkvKiBCaXQgMTE6CVBhdXNlIFN0YXRlICovCisjZGVmaW5lIEdNX0dQU1JfVFhfQUNUSVZFCSgxPDwxMCkJLyogQml0IDEwOglUeCBpbiBQcm9ncmVzcyAqLworI2RlZmluZSBHTV9HUFNSX0VYQ19DT0wJCSgxPDw5KQkvKiBCaXQgIDk6CUV4Y2Vzc2l2ZSBDb2xsaXNpb25zIE9jY3VyZWQgKi8KKyNkZWZpbmUgR01fR1BTUl9MQVRfQ09MCQkoMTw8OCkJLyogQml0ICA4OglMYXRlIENvbGxpc2lvbnMgT2NjdXJlZCAqLworCQkJCQkJCQkvKiBCaXQgIDcuLjY6CXJlc2VydmVkICovCisjZGVmaW5lIEdNX0dQU1JfUEhZX1NUX0NICSgxPDw1KQkvKiBCaXQgIDU6CVBIWSBTdGF0dXMgQ2hhbmdlICovCisjZGVmaW5lIEdNX0dQU1JfR0lHX1NQRUVECSgxPDw0KQkvKiBCaXQgIDQ6CUdpZ2FiaXQgU3BlZWQgKDEgPSAxMDAwIE1icHMpICovCisjZGVmaW5lIEdNX0dQU1JfUEFSVF9NT0RFCSgxPDwzKQkvKiBCaXQgIDM6CVBhcnRpdGlvbiBtb2RlICovCisjZGVmaW5lIEdNX0dQU1JfRkNfUlhfRElTCSgxPDwyKQkvKiBCaXQgIDI6CVJ4IEZsb3ctQ29udHJvbCBNb2RlIERpc2FibGVkICovCisjZGVmaW5lIEdNX0dQU1JfUFJPTV9FTgkJKDE8PDEpCS8qIEJpdCAgMToJUHJvbWlzY3VvdXMgTW9kZSBFbmFibGVkICovCisJCQkJCQkJCS8qIEJpdCAgMDoJcmVzZXJ2ZWQgKi8KKwkKKy8qCUdNX0dQX0NUUkwJMTYgYml0IHIvdwlHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMTU6CXJlc2VydmVkICovCisjZGVmaW5lIEdNX0dQQ1JfUFJPTV9FTkEJKDE8PDE0KQkvKiBCaXQgMTQ6CUVuYWJsZSBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIEdNX0dQQ1JfRkNfVFhfRElTCSgxPDwxMykgLyogQml0IDEzOglEaXNhYmxlIFR4IEZsb3ctQ29udHJvbCBNb2RlICovCisjZGVmaW5lIEdNX0dQQ1JfVFhfRU5BCQkoMTw8MTIpIC8qIEJpdCAxMjoJRW5hYmxlIFRyYW5zbWl0ICovCisjZGVmaW5lIEdNX0dQQ1JfUlhfRU5BCQkoMTw8MTEpIC8qIEJpdCAxMToJRW5hYmxlIFJlY2VpdmUgKi8KKyNkZWZpbmUgR01fR1BDUl9CVVJTVF9FTkEJKDE8PDEwKQkvKiBCaXQgMTA6CUVuYWJsZSBCdXJzdCBNb2RlICovCisjZGVmaW5lIEdNX0dQQ1JfTE9PUF9FTkEJKDE8PDkpCS8qIEJpdCAgOToJRW5hYmxlIE1BQyBMb29wYmFjayBNb2RlICovCisjZGVmaW5lIEdNX0dQQ1JfUEFSVF9FTkEJKDE8PDgpCS8qIEJpdCAgODoJRW5hYmxlIFBhcnRpdGlvbiBNb2RlICovCisjZGVmaW5lIEdNX0dQQ1JfR0lHU19FTkEJKDE8PDcpCS8qIEJpdCAgNzoJR2lnYWJpdCBTcGVlZCAoMTAwMCBNYnBzKSAqLworI2RlZmluZSBHTV9HUENSX0ZMX1BBU1MJCSgxPDw2KQkvKiBCaXQgIDY6CUZvcmNlIExpbmsgUGFzcyAqLworI2RlZmluZSBHTV9HUENSX0RVUF9GVUxMCSgxPDw1KQkvKiBCaXQgIDU6CUZ1bGwgRHVwbGV4IE1vZGUgKi8KKyNkZWZpbmUgR01fR1BDUl9GQ19SWF9ESVMJKDE8PDQpCS8qIEJpdCAgNDoJRGlzYWJsZSBSeCBGbG93LUNvbnRyb2wgTW9kZSAqLworI2RlZmluZSBHTV9HUENSX1NQRUVEXzEwMAkoMTw8MykgIC8qIEJpdCAgMzoJUG9ydCBTcGVlZCAxMDAgTWJwcyAqLworI2RlZmluZSBHTV9HUENSX0FVX0RVUF9ESVMJKDE8PDIpCS8qIEJpdCAgMjoJRGlzYWJsZSBBdXRvLVVwZGF0ZSBEdXBsZXggKi8KKyNkZWZpbmUgR01fR1BDUl9BVV9GQ1RfRElTCSgxPDwxKQkvKiBCaXQgIDE6CURpc2FibGUgQXV0by1VcGRhdGUgRmxvdy1DLiAqLworI2RlZmluZSBHTV9HUENSX0FVX1NQRF9ESVMJKDE8PDApCS8qIEJpdCAgMDoJRGlzYWJsZSBBdXRvLVVwZGF0ZSBTcGVlZCAqLworCisjZGVmaW5lIEdNX0dQQ1JfU1BFRURfMTAwMAkoR01fR1BDUl9HSUdTX0VOQSB8IEdNX0dQQ1JfU1BFRURfMTAwKQorI2RlZmluZSBHTV9HUENSX0FVX0FMTF9ESVMJKEdNX0dQQ1JfQVVfRFVQX0RJUyB8IEdNX0dQQ1JfQVVfRkNUX0RJUyB8XAorCQkJCQkJCSBHTV9HUENSX0FVX1NQRF9ESVMpCisJCisvKglHTV9UWF9DVFJMCQkJCTE2IGJpdCByL3cJVHJhbnNtaXQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBHTV9UWENSX0ZPUkNFX0pBTQkoMTw8MTUpCS8qIEJpdCAxNToJRm9yY2UgSmFtIC8gRmxvdy1Db250cm9sICovCisjZGVmaW5lIEdNX1RYQ1JfQ1JDX0RJUwkJKDE8PDE0KQkvKiBCaXQgMTQ6CURpc2FibGUgaW5zZXJ0aW9uIG9mIENSQyAqLworI2RlZmluZSBHTV9UWENSX1BBRF9ESVMJCSgxPDwxMykJLyogQml0IDEzOglEaXNhYmxlIHBhZGRpbmcgb2YgcGFja2V0cyAqLworI2RlZmluZSBHTV9UWENSX0NPTF9USFJfTVNLCSgxPDwxMCkJLyogQml0IDEyLi4xMDoJQ29sbGlzaW9uIFRocmVzaG9sZCAqLworCisjZGVmaW5lIFRYX0NPTF9USFIoeCkJCShTSElGVDEwKHgpICYgR01fVFhDUl9DT0xfVEhSX01TSykKKworI2RlZmluZSBUWF9DT0xfREVGCQkJMHgwNAorCQorLyoJR01fUlhfQ1RSTAkJCQkxNiBiaXQgci93CVJlY2VpdmUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBHTV9SWENSX1VDRl9FTkEJCSgxPDwxNSkJLyogQml0IDE1OglFbmFibGUgVW5pY2FzdCBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUgR01fUlhDUl9NQ0ZfRU5BCQkoMTw8MTQpCS8qIEJpdCAxNDoJRW5hYmxlIE11bHRpY2FzdCBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUgR01fUlhDUl9DUkNfRElTCQkoMTw8MTMpCS8qIEJpdCAxMzoJUmVtb3ZlIDQtYnl0ZSBDUkMgKi8KKyNkZWZpbmUgR01fUlhDUl9QQVNTX0ZDCQkoMTw8MTIpCS8qIEJpdCAxMjoJUGFzcyBGQyBwYWNrZXRzIHRvIEZJRk8gKi8KKwkKKy8qCUdNX1RYX1BBUkFNCQkJCTE2IGJpdCByL3cJVHJhbnNtaXQgUGFyYW1ldGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIEdNX1RYUEFfSkFNTEVOX01TSwkoMHgwMzw8MTQpCS8qIEJpdCAxNS4uMTQ6CUphbSBMZW5ndGggKi8KKyNkZWZpbmUgR01fVFhQQV9KQU1JUEdfTVNLCSgweDFmPDw5KQkvKiBCaXQgMTMuLjk6CUphbSBJUEcgKi8KKyNkZWZpbmUgR01fVFhQQV9KQU1EQVRfTVNLCSgweDFmPDw0KQkvKiBCaXQgIDguLjQ6CUlQRyBKYW0gdG8gRGF0YSAqLworCQkJCQkJCQkvKiBCaXQgIDMuLjA6CXJlc2VydmVkICovCisKKyNkZWZpbmUgVFhfSkFNX0xFTl9WQUwoeCkJKFNISUZUMTQoeCkgJiBHTV9UWFBBX0pBTUxFTl9NU0spCisjZGVmaW5lIFRYX0pBTV9JUEdfVkFMKHgpCShTSElGVDkoeCkgJiBHTV9UWFBBX0pBTUlQR19NU0spCisjZGVmaW5lIFRYX0lQR19KQU1fREFUQSh4KQkoU0hJRlQ0KHgpICYgR01fVFhQQV9KQU1EQVRfTVNLKQorCisjZGVmaW5lIFRYX0pBTV9MRU5fREVGCQkweDAzCisjZGVmaW5lIFRYX0pBTV9JUEdfREVGCQkweDBiCisjZGVmaW5lIFRYX0lQR19KQU1fREVGCQkweDFjCisKKy8qCUdNX1NFUklBTF9NT0RFCQkJMTYgYml0IHIvdwlTZXJpYWwgTW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBHTV9TTU9EX0RBVEFCTF9NU0sJKDB4MWY8PDExKQkvKiBCaXQgMTUuLjExOglEYXRhIEJsaW5kZXIgKHIvbykgKi8KKyNkZWZpbmUgR01fU01PRF9MSU1JVF80CQkoMTw8MTApCS8qIEJpdCAxMDoJNCBjb25zZWN1dGl2ZSBUeCB0cmlhbHMgKi8KKyNkZWZpbmUgR01fU01PRF9WTEFOX0VOQQkoMTw8OSkJLyogQml0ICA5OglFbmFibGUgVkxBTiAgKE1heC4gRnJhbWUgTGVuKSAqLworI2RlZmluZSBHTV9TTU9EX0pVTUJPX0VOQQkoMTw8OCkJLyogQml0ICA4OglFbmFibGUgSnVtYm8gKE1heC4gRnJhbWUgTGVuKSAqLworCQkJCQkJCQkvKiBCaXQgIDcuLjU6CXJlc2VydmVkICovCisjZGVmaW5lIEdNX1NNT0RfSVBHX01TSwkJMHgxZgkvKiBCaXQgNC4uMDoJSW50ZXItUGFja2V0IEdhcCAoSVBHKSAqLworCQorI2RlZmluZSBEQVRBX0JMSU5EX1ZBTCh4KQkoU0hJRlQxMSh4KSAmIEdNX1NNT0RfREFUQUJMX01TSykKKyNkZWZpbmUgREFUQV9CTElORF9ERUYJCTB4MDQKKworI2RlZmluZSBJUEdfREFUQV9WQUwoeCkJCSh4ICYgR01fU01PRF9JUEdfTVNLKQorI2RlZmluZSBJUEdfREFUQV9ERUYJCTB4MWUKKworLyoJR01fU01JX0NUUkwJCQkJMTYgYml0IHIvdwlTTUkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBHTV9TTUlfQ1RfUEhZX0FfTVNLCSgweDFmPDwxMSkJLyogQml0IDE1Li4xMToJUEhZIERldmljZSBBZGRyZXNzICovCisjZGVmaW5lIEdNX1NNSV9DVF9SRUdfQV9NU0sJKDB4MWY8PDYpCS8qIEJpdCAxMC4uIDY6CVBIWSBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lIEdNX1NNSV9DVF9PUF9SRAkJKDE8PDUpCS8qIEJpdCAgNToJT3BDb2RlIFJlYWQgKDA9V3JpdGUpKi8KKyNkZWZpbmUgR01fU01JX0NUX1JEX1ZBTAkoMTw8NCkJLyogQml0ICA0OglSZWFkIFZhbGlkIChSZWFkIGNvbXBsZXRlZCkgKi8KKyNkZWZpbmUgR01fU01JX0NUX0JVU1kJCSgxPDwzKQkvKiBCaXQgIDM6CUJ1c3kgKE9wZXJhdGlvbiBpbiBwcm9ncmVzcykgKi8KKwkJCQkJCQkJLyogQml0ICAgMi4uMDoJcmVzZXJ2ZWQgKi8KKwkKKyNkZWZpbmUgR01fU01JX0NUX1BIWV9BRCh4KQkoU0hJRlQxMSh4KSAmIEdNX1NNSV9DVF9QSFlfQV9NU0spCisjZGVmaW5lIEdNX1NNSV9DVF9SRUdfQUQoeCkJKFNISUZUNih4KSAmIEdNX1NNSV9DVF9SRUdfQV9NU0spCisKKwkvKglHTV9QSFlfQUREUgkJCQkxNiBiaXQgci93CUdQSFkgQWRkcmVzcyBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgIDE1Li42OglyZXNlcnZlZCAqLworI2RlZmluZSBHTV9QQVJfTUlCX0NMUgkJKDE8PDUpCS8qIEJpdCAgNToJU2V0IE1JQiBDbGVhciBDb3VudGVyIE1vZGUgKi8KKyNkZWZpbmUgR01fUEFSX01JQl9UU1QJCSgxPDw0KQkvKiBCaXQgIDQ6CU1JQiBMb2FkIENvdW50ZXIgKFRlc3QgTW9kZSkgKi8KKwkJCQkJCQkJLyogQml0ICAgMy4uMDoJcmVzZXJ2ZWQgKi8KKwkKKy8qIFJlY2VpdmUgRnJhbWUgU3RhdHVzIEVuY29kaW5nICovCisjZGVmaW5lIEdNUl9GU19MRU4JKDB4ZmZmZlVMPDwxNikJLyogQml0IDMxLi4xNjoJUnggRnJhbWUgTGVuZ3RoICovCisJCQkJCQkJCS8qIEJpdCAgMTUuLjE0OglyZXNlcnZlZCAqLworI2RlZmluZSBHTVJfRlNfVkxBTgkJKDFMPDwxMykJLyogQml0IDEzOglWTEFOIFBhY2tldCAqLworI2RlZmluZSBHTVJfRlNfSkFCQkVSCSgxTDw8MTIpCS8qIEJpdCAxMjoJSmFiYmVyIFBhY2tldCAqLworI2RlZmluZSBHTVJfRlNfVU5fU0laRQkoMUw8PDExKQkvKiBCaXQgMTE6CVVuZGVyc2l6ZSBQYWNrZXQgKi8KKyNkZWZpbmUgR01SX0ZTX01DCQkoMUw8PDEwKQkvKiBCaXQgMTA6CU11bHRpY2FzdCBQYWNrZXQgKi8KKyNkZWZpbmUgR01SX0ZTX0JDCQkoMUw8PDkpCQkvKiBCaXQgIDk6CUJyb2FkY2FzdCBQYWNrZXQgKi8KKyNkZWZpbmUgR01SX0ZTX1JYX09LCSgxTDw8OCkJCS8qIEJpdCAgODoJUmVjZWl2ZSBPSyAoR29vZCBQYWNrZXQpICovCisjZGVmaW5lIEdNUl9GU19HT09EX0ZDCSgxTDw8NykJCS8qIEJpdCAgNzoJR29vZCBGbG93LUNvbnRyb2wgUGFja2V0ICovCisjZGVmaW5lIEdNUl9GU19CQURfRkMJKDFMPDw2KQkJLyogQml0ICA2OglCYWQgIEZsb3ctQ29udHJvbCBQYWNrZXQgKi8KKyNkZWZpbmUgR01SX0ZTX01JSV9FUlIJKDFMPDw1KQkJLyogQml0ICA1OglNSUkgRXJyb3IgKi8KKyNkZWZpbmUgR01SX0ZTX0xPTkdfRVJSCSgxTDw8NCkJCS8qIEJpdCAgNDoJVG9vIExvbmcgUGFja2V0ICovCisjZGVmaW5lIEdNUl9GU19GUkFHTUVOVAkoMUw8PDMpCQkvKiBCaXQgIDM6CUZyYWdtZW50ICovCisJCQkJCQkJCS8qIEJpdCAgMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR01SX0ZTX0NSQ19FUlIJKDFMPDwxKQkJLyogQml0ICAxOglDUkMgRXJyb3IgKi8KKyNkZWZpbmUgR01SX0ZTX1JYX0ZGX09WCSgxTDw8MCkJCS8qIEJpdCAgMDoJUnggRklGTyBPdmVyZmxvdyAqLworCisvKgorICogR01SX0ZTX0FOWV9FUlIgKGFuYWxvZ291cyB0byBYTVJfRlNfQU5ZX0VSUikKKyAqLworI2RlZmluZSBHTVJfRlNfQU5ZX0VSUgkoR01SX0ZTX0NSQ19FUlIgfCBcCisJCQlHTVJfRlNfTE9OR19FUlIgfCBcCisJCQlHTVJfRlNfTUlJX0VSUiB8IFwKKwkJCUdNUl9GU19CQURfRkMgfCBcCisJCQlHTVJfRlNfR09PRF9GQyB8IFwKKwkJCUdNUl9GU19KQUJCRVIpCisKKy8qIFJ4IEdNQUMgRklGTyBGbHVzaCBNYXNrIChkZWZhdWx0KSAqLworI2RlZmluZSBSWF9GRl9GTF9ERUZfTVNLCShHTVJfRlNfQ1JDX0VSUiB8IFwKKwkJCUdNUl9GU19SWF9GRl9PViB8IFwKKwkJCUdNUl9GU19NSUlfRVJSIHwgXAorCQkJR01SX0ZTX0JBRF9GQyB8IFwKKwkJCUdNUl9GU19HT09EX0ZDIHwgXAorCQkJR01SX0ZTX1VOX1NJWkUgfCBcCisJCQlHTVJfRlNfSkFCQkVSKQorCisvKiB0eXBlZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCS8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgkvKiBfX0lOQ19YTUFDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2thZGRyLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrYWRkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTI1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrYWRkci5jCkBAIC0wLDAgKzEsMTc3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrYWRkci5jCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBBRERSLU1vZHVsZQorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjUyICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA2LzAyIDEzOjQ2OjE1ICQKKyAqIFB1cnBvc2U6CU1hbmFnZSBBZGRyZXNzZXMgKE11bHRpY2FzdCBhbmQgVW5pY2FzdCkgYW5kIFByb21pc2N1b3VzIE1vZGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFRoaXMgbW9kdWxlIGlzIGludGVuZGVkIHRvIG1hbmFnZSBtdWx0aWNhc3QgYWRkcmVzc2VzLCBhZGRyZXNzIG92ZXJyaWRlLAorICogYW5kIHByb21pc2N1b3VzIG1vZGUgb24gR0VuZXNpcyBhbmQgWXVrb24gYWRhcHRlcnMuCisgKgorICogQWRkcmVzcyBMYXlvdXQ6CisgKglwb3J0IGFkZHJlc3M6CQlwaHlzaWNhbCBNQUMgYWRkcmVzcworICoJMXN0IGV4YWN0IG1hdGNoOglsb2dpY2FsIE1BQyBhZGRyZXNzIChHRW5lc2lzIG9ubHkpCisgKgkybmQgZXhhY3QgbWF0Y2g6CVJMTVQgbXVsdGljYXN0IChHRW5lc2lzIG9ubHkpCisgKglleGFjdCBtYXRjaCAzLTEzOglPUy1zcGVjaWZpYyBtdWx0aWNhc3RzIChHRW5lc2lzIG9ubHkpCisgKgorICogSW5jbHVkZSBGaWxlIEhpZXJhcmNoeToKKyAqCisgKgkic2tkcnYxc3QuaCIKKyAqCSJza2RydjJuZC5oIgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoZGVmaW5lZChERUJVRykgfHwgKCghZGVmaW5lZChMSU5UKSkgJiYgKCFkZWZpbmVkKFNLX1NMSU0pKSkpCitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpICRJZDogc2thZGRyLmMsdiAxLjUyIDIwMDMvMDYvMDIgMTM6NDY6MTUgdHNjaGlsbGkgRXhwICQgKEMpIE1hcnZlbGwuIjsKKyNlbmRpZiAvKiBERUJVRyB8fCFMSU5UIHx8ICFTS19TTElNICovCisKKyNkZWZpbmUgX19TS0FERFJfQworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCS8qIGNwbHVzcGx1cyAqLworCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgorI2luY2x1ZGUgImgvc2tkcnYybmQuaCIKKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjZGVmaW5lIFhNQUNfUE9MWQkweEVEQjg4MzIwVUwJLyogQ1JDMzItUG9seSAtIFhNQUM6IExpdHRsZSBFbmRpYW4gKi8KKyNkZWZpbmUgR01BQ19QT0xZCTB4MDRDMTFEQjdMCS8qIENSQzE2LVBvbHkgLSBHTUFDOiBMaXR0bGUgRW5kaWFuICovCisjZGVmaW5lIEhBU0hfQklUUwk2CQkJCS8qICNiaXRzIGluIGhhc2ggKi8KKyNkZWZpbmUJU0tfTUNfQklUCTB4MDEKKworLyogRXJyb3IgbnVtYmVycyBhbmQgbWVzc2FnZXMuICovCisKKyNkZWZpbmUgU0tFUlJfQUREUl9FMDAxCQkoU0tfRVJSQkFTRV9BRERSICsgMCkKKyNkZWZpbmUgU0tFUlJfQUREUl9FMDAxTVNHCSJCYWQgRmxhZ3MuIgorI2RlZmluZSBTS0VSUl9BRERSX0UwMDIJCShTS0VSUl9BRERSX0UwMDEgKyAxKQorI2RlZmluZSBTS0VSUl9BRERSX0UwMDJNU0cJIk5ldyBFcnJvci4iCisKKy8qIHR5cGVkZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE5vbmUuICovCisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIDY0LWJpdCBoYXNoIHZhbHVlcyB3aXRoIGFsbCBiaXRzIHNldC4gKi8KKworc3RhdGljIGNvbnN0IFNLX1UxNglPbmVzSGFzaFs0XSA9IHsweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkZ9OworCisvKiBsb2NhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgREVCVUcKK3N0YXRpYyBpbnQJTmV4dDBbU0tfTUFYX01BQ1NdID0gezB9OworI2VuZGlmCS8qIERFQlVHICovCisKKy8qIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJJbml0IC0gaW5pdGlhbGl6ZSBkYXRhLCBzZXQgc3RhdGUgdG8gaW5pdAorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqCVNLX0lOSVRfREFUQQorICoJPT09PT09PT09PT09CisgKgorICoJVGhpcyByb3V0aW5lIGNsZWFycyB0aGUgbXVsdGljYXN0IHRhYmxlcyBhbmQgcmVzZXRzIHByb21pc2N1b3VzIG1vZGUuCisgKglTb21lIGVudHJpZXMgYXJlIHJlc2VydmVkIGZvciB0aGUgImxvZ2ljYWwgTUFDIGFkZHJlc3MiLCB0aGUKKyAqCVNLLVJMTVQgbXVsdGljYXN0IGFkZHJlc3MsIGFuZCB0aGUgQlBEVSBtdWx0aWNhc3QgYWRkcmVzcy4KKyAqCisgKgorICoJU0tfSU5JVF9JTworICoJPT09PT09PT09PQorICoKKyAqCUFsbCBwZXJtYW5lbnQgTUFDIGFkZHJlc3NlcyBhcmUgcmVhZCBmcm9tIEVQUk9NLgorICoJSWYgdGhlIGN1cnJlbnQgTUFDIGFkZHJlc3NlcyBhcmUgbm90IGFscmVhZHkgc2V0IGluIHNvZnR3YXJlLAorICoJdGhleSBhcmUgc2V0IHRvIHRoZSB2YWx1ZXMgb2YgdGhlIHBlcm1hbmVudCBhZGRyZXNzZXMuCisgKglUaGUgY3VycmVudCBhZGRyZXNzZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGNvcnJlc3BvbmRpbmcgTUFDLgorICoKKyAqCisgKglTS19JTklUX1JVTgorICoJPT09PT09PT09PT0KKyAqCisgKglOb3RoaW5nLgorICoKKyAqIENvbnRleHQ6CisgKglpbml0LCBwYWdlYWJsZQorICoKKyAqIFJldHVybnM6CisgKglTS19BRERSX1NVQ0NFU1MKKyAqLworaW50CVNrQWRkckluaXQoCitTS19BQwkqcEFDLAkvKiB0aGUgYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJL08gY29udGV4dCAqLworaW50CQlMZXZlbCkJLyogaW5pdGlhbGl6YXRpb24gbGV2ZWwgKi8KK3sKKwlpbnQJCQlqOworCVNLX1UzMgkJaTsKKwlTS19VOAkJKkluQWRkcjsKKwlTS19VMTYJCSpPdXRBZGRyOworCVNLX0FERFJfUE9SVAkqcEFQb3J0OworCisJc3dpdGNoIChMZXZlbCkgeworCWNhc2UgU0tfSU5JVF9EQVRBOgorCQlTS19NRU1TRVQoKGNoYXIgKikgJnBBQy0+QWRkciwgKFNLX1U4KSAwLAorICAgICAgICAgICAgKFNLX1UxNikgc2l6ZW9mKFNLX0FERFIpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgU0tfTUFYX01BQ1M7IGkrKykgeworCQkJcEFQb3J0ID0gJnBBQy0+QWRkci5Qb3J0W2ldOworCQkJcEFQb3J0LT5Qcm9tTW9kZSA9IFNLX1BST01fTU9ERV9OT05FOworCQkJCisJCQlwQVBvcnQtPkZpcnN0RXhhY3RNYXRjaFJsbXQgPSBTS19BRERSX0ZJUlNUX01BVENIX1JMTVQ7CisJCQlwQVBvcnQtPkZpcnN0RXhhY3RNYXRjaERydiA9IFNLX0FERFJfRklSU1RfTUFUQ0hfRFJWOworCQkJcEFQb3J0LT5OZXh0RXhhY3RNYXRjaFJsbXQgPSBTS19BRERSX0ZJUlNUX01BVENIX1JMTVQ7CisJCQlwQVBvcnQtPk5leHRFeGFjdE1hdGNoRHJ2ID0gU0tfQUREUl9GSVJTVF9NQVRDSF9EUlY7CisJCX0KKyNpZmRlZiB4REVCVUcKKwkJZm9yIChpID0gMDsgaSA8IFNLX01BWF9NQUNTOyBpKyspIHsKKwkJCWlmIChwQUMtPkFkZHIuUG9ydFtpXS5OZXh0RXhhY3RNYXRjaFJsbXQgPAorCQkJCVNLX0FERFJfRklSU1RfTUFUQ0hfUkxNVCkgeworCQkJCU5leHQwW2ldIHw9IDQ7CisJCQl9CisJCX0KKyNlbmRpZgkvKiBERUJVRyAqLworCQkvKiBwQUMtPkFkZHIuSW5pdERvbmUgPSBTS19JTklUX0RBVEE7ICovCisJCWJyZWFrOworCisgICAgY2FzZSBTS19JTklUX0lPOgorI2lmbmRlZiBTS19OT19STE1UCisJCWZvciAoaSA9IDA7IGkgPCBTS19NQVhfTkVUUzsgaSsrKSB7CisJCQlwQUMtPkFkZHIuTmV0W2ldLkFjdGl2ZVBvcnQgPSBwQUMtPlJsbXQuTmV0W2ldLkFjdGl2ZVBvcnQ7CisJCX0KKyNlbmRpZiAvKiAhU0tfTk9fUkxNVCAqLworI2lmZGVmIHhERUJVRworCQlmb3IgKGkgPSAwOyBpIDwgU0tfTUFYX01BQ1M7IGkrKykgeworCQkJaWYgKHBBQy0+QWRkci5Qb3J0W2ldLk5leHRFeGFjdE1hdGNoUmxtdCA8CisJCQkJU0tfQUREUl9GSVJTVF9NQVRDSF9STE1UKSB7CisJCQkJTmV4dDBbaV0gfD0gODsKKwkJCX0KKwkJfQorI2VuZGlmCS8qIERFQlVHICovCisJCQorCQkvKiBSZWFkIHBlcm1hbmVudCBsb2dpY2FsIE1BQyBhZGRyZXNzIGZyb20gQ29udHJvbCBSZWdpc3RlciBGaWxlLiAqLworCQlmb3IgKGogPSAwOyBqIDwgU0tfTUFDX0FERFJfTEVOOyBqKyspIHsKKwkJCUluQWRkciA9IChTS19VOCAqKSAmcEFDLT5BZGRyLk5ldFswXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbal07CisJCQlTS19JTjgoSW9DLCBCMl9NQUNfMSArIGosIEluQWRkcik7CisJCX0KKworCQlpZiAoIXBBQy0+QWRkci5OZXRbMF0uQ3VycmVudE1hY0FkZHJlc3NTZXQpIHsKKwkJCS8qIFNldCB0aGUgY3VycmVudCBsb2dpY2FsIE1BQyBhZGRyZXNzIHRvIHRoZSBwZXJtYW5lbnQgb25lLiAqLworCQkJcEFDLT5BZGRyLk5ldFswXS5DdXJyZW50TWFjQWRkcmVzcyA9CisJCQkJcEFDLT5BZGRyLk5ldFswXS5QZXJtYW5lbnRNYWNBZGRyZXNzOworCQkJcEFDLT5BZGRyLk5ldFswXS5DdXJyZW50TWFjQWRkcmVzc1NldCA9IFNLX1RSVUU7CisJCX0KKworCQkvKiBTZXQgdGhlIGN1cnJlbnQgbG9naWNhbCBNQUMgYWRkcmVzcy4gKi8KKwkJcEFDLT5BZGRyLlBvcnRbcEFDLT5BZGRyLk5ldFswXS5BY3RpdmVQb3J0XS5FeGFjdFswXSA9CisJCQlwQUMtPkFkZHIuTmV0WzBdLkN1cnJlbnRNYWNBZGRyZXNzOworI2lmIFNLX01BWF9ORVRTID4gMQorCQkvKiBTZXQgbG9naWNhbCBNQUMgYWRkcmVzcyBmb3IgbmV0IDIgdG8gKGxvZyB8IDMpLiAqLworCQlpZiAoIXBBQy0+QWRkci5OZXRbMV0uQ3VycmVudE1hY0FkZHJlc3NTZXQpIHsKKwkJCXBBQy0+QWRkci5OZXRbMV0uUGVybWFuZW50TWFjQWRkcmVzcyA9CisJCQkJcEFDLT5BZGRyLk5ldFswXS5QZXJtYW5lbnRNYWNBZGRyZXNzOworCQkJcEFDLT5BZGRyLk5ldFsxXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbNV0gfD0gMzsKKwkJCS8qIFNldCB0aGUgY3VycmVudCBsb2dpY2FsIE1BQyBhZGRyZXNzIHRvIHRoZSBwZXJtYW5lbnQgb25lLiAqLworCQkJcEFDLT5BZGRyLk5ldFsxXS5DdXJyZW50TWFjQWRkcmVzcyA9CisJCQkJcEFDLT5BZGRyLk5ldFsxXS5QZXJtYW5lbnRNYWNBZGRyZXNzOworCQkJcEFDLT5BZGRyLk5ldFsxXS5DdXJyZW50TWFjQWRkcmVzc1NldCA9IFNLX1RSVUU7CisJCX0KKyNlbmRpZgkvKiBTS19NQVhfTkVUUyA+IDEgKi8KKworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IDA7IGkgPCAoU0tfVTMyKSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfSU5JVCwKKwkJCQkoIlBlcm1hbmVudCBNQUMgQWRkcmVzcyAoTmV0JWQpOiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCQkJaSwKKwkJCQkJcEFDLT5BZGRyLk5ldFtpXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbMF0sCisJCQkJCXBBQy0+QWRkci5OZXRbaV0uUGVybWFuZW50TWFjQWRkcmVzcy5hWzFdLAorCQkJCQlwQUMtPkFkZHIuTmV0W2ldLlBlcm1hbmVudE1hY0FkZHJlc3MuYVsyXSwKKwkJCQkJcEFDLT5BZGRyLk5ldFtpXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbM10sCisJCQkJCXBBQy0+QWRkci5OZXRbaV0uUGVybWFuZW50TWFjQWRkcmVzcy5hWzRdLAorCQkJCQlwQUMtPkFkZHIuTmV0W2ldLlBlcm1hbmVudE1hY0FkZHJlc3MuYVs1XSkpCisJCQkKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0lOSVQsCisJCQkJKCJMb2dpY2FsIE1BQyBBZGRyZXNzIChOZXQlZCk6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCQkJCQlpLAorCQkJCQlwQUMtPkFkZHIuTmV0W2ldLkN1cnJlbnRNYWNBZGRyZXNzLmFbMF0sCisJCQkJCXBBQy0+QWRkci5OZXRbaV0uQ3VycmVudE1hY0FkZHJlc3MuYVsxXSwKKwkJCQkJcEFDLT5BZGRyLk5ldFtpXS5DdXJyZW50TWFjQWRkcmVzcy5hWzJdLAorCQkJCQlwQUMtPkFkZHIuTmV0W2ldLkN1cnJlbnRNYWNBZGRyZXNzLmFbM10sCisJCQkJCXBBQy0+QWRkci5OZXRbaV0uQ3VycmVudE1hY0FkZHJlc3MuYVs0XSwKKwkJCQkJcEFDLT5BZGRyLk5ldFtpXS5DdXJyZW50TWFjQWRkcmVzcy5hWzVdKSkKKwkJfQorI2VuZGlmCS8qIERFQlVHICovCisKKwkJZm9yIChpID0gMDsgaSA8IChTS19VMzIpIHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQlwQVBvcnQgPSAmcEFDLT5BZGRyLlBvcnRbaV07CisKKwkJCS8qIFJlYWQgcGVybWFuZW50IHBvcnQgYWRkcmVzc2VzIGZyb20gQ29udHJvbCBSZWdpc3RlciBGaWxlLiAqLworCQkJZm9yIChqID0gMDsgaiA8IFNLX01BQ19BRERSX0xFTjsgaisrKSB7CisJCQkJSW5BZGRyID0gKFNLX1U4ICopICZwQVBvcnQtPlBlcm1hbmVudE1hY0FkZHJlc3MuYVtqXTsKKwkJCQlTS19JTjgoSW9DLCBCMl9NQUNfMiArIDggKiBpICsgaiwgSW5BZGRyKTsKKwkJCX0KKworCQkJaWYgKCFwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzU2V0KSB7CisJCQkJLyoKKwkJCQkgKiBTZXQgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHBoeXNpY2FsIE1BQyBhZGRyZXNzCisJCQkJICogb2YgdGhpcyBwb3J0IHRvIGl0cyBwZXJtYW5lbnQgTUFDIGFkZHJlc3MuCisJCQkJICovCisJCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcyA9IHBBUG9ydC0+UGVybWFuZW50TWFjQWRkcmVzczsKKwkJCQlwQVBvcnQtPlByZXZpb3VzTWFjQWRkcmVzcyA9IHBBUG9ydC0+UGVybWFuZW50TWFjQWRkcmVzczsKKwkJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzU2V0ID0gU0tfVFJVRTsKKwkJCX0KKworCQkJLyogU2V0IHBvcnQncyBjdXJyZW50IHBoeXNpY2FsIE1BQyBhZGRyZXNzLiAqLworCQkJT3V0QWRkciA9IChTS19VMTYgKikgJnBBUG9ydC0+Q3VycmVudE1hY0FkZHJlc3MuYVswXTsKKyNpZmRlZiBHRU5FU0lTCisJCQlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkJCVhNX09VVEFERFIoSW9DLCBpLCBYTV9TQSwgT3V0QWRkcik7CisJCQl9CisjZW5kaWYgLyogR0VORVNJUyAqLworI2lmZGVmIFlVS09OCisJCQlpZiAoIXBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCQlHTV9PVVRBRERSKElvQywgaSwgR01fU1JDX0FERFJfMUwsIE91dEFkZHIpOworCQkJfQorI2VuZGlmIC8qIFlVS09OICovCisjaWZkZWYgREVCVUcKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0lOSVQsCisJCQkJKCJTa0FkZHJJbml0OiBQZXJtYW5lbnQgUGh5c2ljYWwgTUFDIEFkZHJlc3M6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCQkJCQlwQVBvcnQtPlBlcm1hbmVudE1hY0FkZHJlc3MuYVswXSwKKwkJCQkJcEFQb3J0LT5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbMV0sCisJCQkJCXBBUG9ydC0+UGVybWFuZW50TWFjQWRkcmVzcy5hWzJdLAorCQkJCQlwQVBvcnQtPlBlcm1hbmVudE1hY0FkZHJlc3MuYVszXSwKKwkJCQkJcEFQb3J0LT5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbNF0sCisJCQkJCXBBUG9ydC0+UGVybWFuZW50TWFjQWRkcmVzcy5hWzVdKSkKKwkJCQorCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfSU5JVCwKKwkJCQkoIlNrQWRkckluaXQ6IFBoeXNpY2FsIE1BQyBBZGRyZXNzOiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzBdLAorCQkJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbMV0sCisJCQkJCXBBUG9ydC0+Q3VycmVudE1hY0FkZHJlc3MuYVsyXSwKKwkJCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzNdLAorCQkJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbNF0sCisJCQkJCXBBUG9ydC0+Q3VycmVudE1hY0FkZHJlc3MuYVs1XSkpCisjZW5kaWYgLyogREVCVUcgKi8KKwkJfQorCQkvKiBwQUMtPkFkZHIuSW5pdERvbmUgPSBTS19JTklUX0lPOyAqLworCQlicmVhazsKKworCWNhc2UgU0tfSU5JVF9SVU46CisjaWZkZWYgeERFQlVHCisJCWZvciAoaSA9IDA7IGkgPCBTS19NQVhfTUFDUzsgaSsrKSB7CisJCQlpZiAocEFDLT5BZGRyLlBvcnRbaV0uTmV4dEV4YWN0TWF0Y2hSbG10IDwKKwkJCQlTS19BRERSX0ZJUlNUX01BVENIX1JMTVQpIHsKKwkJCQlOZXh0MFtpXSB8PSAxNjsKKwkJCX0KKwkJfQorI2VuZGlmCS8qIERFQlVHICovCisKKwkJLyogcEFDLT5BZGRyLkluaXREb25lID0gU0tfSU5JVF9SVU47ICovCisJCWJyZWFrOworCisJZGVmYXVsdDoJLyogZXJyb3IgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIChTS19BRERSX1NVQ0NFU1MpOworCQorfQkvKiBTa0FkZHJJbml0ICovCisKKyNpZm5kZWYgU0tfU0xJTQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyTWNDbGVhciAtIGNsZWFyIHRoZSBtdWx0aWNhc3QgdGFibGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBjbGVhcnMgdGhlIG11bHRpY2FzdCB0YWJsZS4KKyAqCisgKglJZiBub3Qgc3VwcHJlc3NlZCBieSBGbGFnIFNLX01DX1NXX09OTFksIHRoZSBoYXJkd2FyZSBpcyB1cGRhdGVkCisgKglpbW1lZGlhdGVseS4KKyAqCisgKglJdCBjYWxscyBlaXRoZXIgU2tBZGRyWG1hY01jQ2xlYXIgb3IgU2tBZGRyR21hY01jQ2xlYXIsIGFjY29yZGluZworICoJdG8gdGhlIGFkYXB0ZXIgaW4gdXNlLiBUaGUgcmVhbCB3b3JrIGlzIGRvbmUgdGhlcmUuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgltYXkgYmUgY2FsbGVkIHN0YXJ0aW5nIHdpdGggU0tfSU5JVF9EQVRBIHdpdGggZmxhZyBTS19NQ19TV19PTkxZCisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8gd2l0aG91dCBsaW1pdGF0aW9uCisgKgorICogUmV0dXJuczoKKyAqCVNLX0FERFJfU1VDQ0VTUworICoJU0tfQUREUl9JTExFR0FMX1BPUlQKKyAqLworaW50CVNrQWRkck1jQ2xlYXIoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyLAkvKiBJbmRleCBvZiBhZmZlY3RlZCBwb3J0ICovCitpbnQJCUZsYWdzKQkJLyogcGVybWFuZW50L25vbi1wZXJtLCBzdy1vbmx5ICovCit7CisJaW50IFJldHVybkNvZGU7CisJCisJaWYgKFBvcnROdW1iZXIgPj0gKFNLX1UzMikgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kKSB7CisJCXJldHVybiAoU0tfQUREUl9JTExFR0FMX1BPUlQpOworCX0KKwkKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQlSZXR1cm5Db2RlID0gU2tBZGRyWG1hY01jQ2xlYXIocEFDLCBJb0MsIFBvcnROdW1iZXIsIEZsYWdzKTsKKwl9CisJZWxzZSB7CisJCVJldHVybkNvZGUgPSBTa0FkZHJHbWFjTWNDbGVhcihwQUMsIElvQywgUG9ydE51bWJlciwgRmxhZ3MpOworCX0KKworCXJldHVybiAoUmV0dXJuQ29kZSk7CisKK30JLyogU2tBZGRyTWNDbGVhciAqLworCisjZW5kaWYgLyogIVNLX1NMSU0gKi8KKworI2lmbmRlZiBTS19TTElNCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJYbWFjTWNDbGVhciAtIGNsZWFyIHRoZSBtdWx0aWNhc3QgdGFibGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBjbGVhcnMgdGhlIG11bHRpY2FzdCB0YWJsZQorICoJKGVpdGhlciBlbnRyeSAyIG9yIGVudHJpZXMgMy0xNiBhbmQgSW5leGFjdEZpbHRlcikgb2YgdGhlIGdpdmVuIHBvcnQuCisgKglJZiBub3Qgc3VwcHJlc3NlZCBieSBGbGFnIFNLX01DX1NXX09OTFksIHRoZSBoYXJkd2FyZSBpcyB1cGRhdGVkCisgKglpbW1lZGlhdGVseS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgc3RhcnRpbmcgd2l0aCBTS19JTklUX0RBVEEgd2l0aCBmbGFnIFNLX01DX1NXX09OTFkKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTyB3aXRob3V0IGxpbWl0YXRpb24KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQUREUl9TVUNDRVNTCisgKglTS19BRERSX0lMTEVHQUxfUE9SVAorICovCitpbnQJU2tBZGRyWG1hY01jQ2xlYXIoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyLAkvKiBJbmRleCBvZiBhZmZlY3RlZCBwb3J0ICovCitpbnQJCUZsYWdzKQkJLyogcGVybWFuZW50L25vbi1wZXJtLCBzdy1vbmx5ICovCit7CisJaW50IGk7CisKKwlpZiAoRmxhZ3MgJiBTS19BRERSX1BFUk1BTkVOVCkgewkvKiBwZXJtYW5lbnQgPT4gUkxNVCAqLworCisJCS8qIENsZWFyIFJMTVQgbXVsdGljYXN0IGFkZHJlc3Nlcy4gKi8KKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uTmV4dEV4YWN0TWF0Y2hSbG10ID0gU0tfQUREUl9GSVJTVF9NQVRDSF9STE1UOworCX0KKwllbHNlIHsJLyogbm90IHBlcm1hbmVudCA9PiBEUlYgKi8KKworCQkvKiBDbGVhciBJbmV4YWN0RmlsdGVyICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gPSAwOworCQl9CisKKwkJLyogQ2xlYXIgRFJWIG11bHRpY2FzdCBhZGRyZXNzZXMuICovCisKKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uTmV4dEV4YWN0TWF0Y2hEcnYgPSBTS19BRERSX0ZJUlNUX01BVENIX0RSVjsKKwl9CisKKwlpZiAoIShGbGFncyAmIFNLX01DX1NXX09OTFkpKSB7CisJCSh2b2lkKSBTa0FkZHJYbWFjTWNVcGRhdGUocEFDLCBJb0MsIFBvcnROdW1iZXIpOworCX0KKworCXJldHVybiAoU0tfQUREUl9TVUNDRVNTKTsKKwkKK30JLyogU2tBZGRyWG1hY01jQ2xlYXIgKi8KKworI2VuZGlmIC8qICFTS19TTElNICovCisKKyNpZm5kZWYgU0tfU0xJTQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyR21hY01jQ2xlYXIgLSBjbGVhciB0aGUgbXVsdGljYXN0IHRhYmxlCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgY2xlYXJzIHRoZSBtdWx0aWNhc3QgaGFzaGluZyB0YWJsZSAoSW5leGFjdEZpbHRlcikKKyAqCShlaXRoZXIgdGhlIFJMTVQgb3IgdGhlIGRyaXZlciBiaXRzKSBvZiB0aGUgZ2l2ZW4gcG9ydC4KKyAqCisgKglJZiBub3Qgc3VwcHJlc3NlZCBieSBGbGFnIFNLX01DX1NXX09OTFksIHRoZSBoYXJkd2FyZSBpcyB1cGRhdGVkCisgKglpbW1lZGlhdGVseS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgc3RhcnRpbmcgd2l0aCBTS19JTklUX0RBVEEgd2l0aCBmbGFnIFNLX01DX1NXX09OTFkKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTyB3aXRob3V0IGxpbWl0YXRpb24KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQUREUl9TVUNDRVNTCisgKglTS19BRERSX0lMTEVHQUxfUE9SVAorICovCitpbnQJU2tBZGRyR21hY01jQ2xlYXIoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyLAkvKiBJbmRleCBvZiBhZmZlY3RlZCBwb3J0ICovCitpbnQJCUZsYWdzKQkJLyogcGVybWFuZW50L25vbi1wZXJtLCBzdy1vbmx5ICovCit7CisJaW50IGk7CisKKyNpZmRlZiBERUJVRworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiR01BQyBJbmV4YWN0RmlsdGVyIChub3QgY2xlYXJlZCk6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbMF0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzFdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1syXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbM10sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzRdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1s1XSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbNl0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzddKSkKKyNlbmRpZgkvKiBERUJVRyAqLworCisJLyogQ2xlYXIgSW5leGFjdEZpbHRlciAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1tpXSA9IDA7CisJfQorCQorCWlmIChGbGFncyAmIFNLX0FERFJfUEVSTUFORU5UKSB7CS8qIHBlcm1hbmVudCA9PiBSTE1UICovCisJCQorCQkvKiBDb3B5IERSViBiaXRzIHRvIEluZXhhY3RGaWx0ZXIuICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gfD0KKwkJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzW2ldOworCQkJCisJCQkvKiBDbGVhciBJbmV4YWN0UmxtdEZpbHRlci4gKi8KKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzW2ldID0gMDsKKworCQl9CQkKKwl9CisJZWxzZSB7CS8qIG5vdCBwZXJtYW5lbnQgPT4gRFJWICovCisJCQorCQkvKiBDb3B5IFJMTVQgYml0cyB0byBJbmV4YWN0RmlsdGVyLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzW2ldIHw9CisJCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdFJsbXRGaWx0ZXIuQnl0ZXNbaV07CisJCQkKKwkJCS8qIENsZWFyIEluZXhhY3REcnZGaWx0ZXIuICovCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzW2ldID0gMDsKKwkJfQorCX0KKwkKKyNpZmRlZiBERUJVRworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiR01BQyBJbmV4YWN0RmlsdGVyIChjbGVhcmVkKTogJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1swXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbMV0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzJdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1szXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbNF0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzVdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1s2XSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbN10pKQorI2VuZGlmCS8qIERFQlVHICovCisJCisJaWYgKCEoRmxhZ3MgJiBTS19NQ19TV19PTkxZKSkgeworCQkodm9pZCkgU2tBZGRyR21hY01jVXBkYXRlKHBBQywgSW9DLCBQb3J0TnVtYmVyKTsKKwl9CisJCisJcmV0dXJuIChTS19BRERSX1NVQ0NFU1MpOworCit9CS8qIFNrQWRkckdtYWNNY0NsZWFyICovCisKKyNpZm5kZWYgU0tfQUREUl9DSEVBVAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbWFjTWNIYXNoIC0gaGFzaCBtdWx0aWNhc3QgYWRkcmVzcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSBoYXNoIHZhbHVlIGZvciBhIG11bHRpY2FzdCBhZGRyZXNzLgorICoJQSBDUkMzMiBhbGdvcml0aG0gaXMgdXNlZC4KKyAqCisgKiBOb3RlczoKKyAqCVRoZSBjb2RlIHdhcyBhZGFwdGVkIGZyb20gdGhlIFhhUXRpIGRhdGEgc2hlZXQuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgorICogUmV0dXJuczoKKyAqCUhhc2ggdmFsdWUgb2YgbXVsdGljYXN0IGFkZHJlc3MuCisgKi8KK1NLX1UzMiBTa1htYWNNY0hhc2goCit1bnNpZ25lZCBjaGFyICpwTWMpCS8qIE11bHRpY2FzdCBhZGRyZXNzICovCit7CisJU0tfVTMyIElkeDsKKwlTS19VMzIgQml0OworCVNLX1UzMiBEYXRhOworCVNLX1UzMiBDcmM7CisKKwlDcmMgPSAweEZGRkZGRkZGVUw7CisJZm9yIChJZHggPSAwOyBJZHggPCBTS19NQUNfQUREUl9MRU47IElkeCsrKSB7CisJCURhdGEgPSAqcE1jKys7CisJCWZvciAoQml0ID0gMDsgQml0IDwgODsgQml0KyssIERhdGEgPj49IDEpIHsKKwkJCUNyYyA9IChDcmMgPj4gMSkgXiAoKChDcmMgXiBEYXRhKSAmIDEpID8gWE1BQ19QT0xZIDogMCk7CisJCX0KKwl9CisKKwlyZXR1cm4gKENyYyAmICgoMSA8PCBIQVNIX0JJVFMpIC0gMSkpOworCit9CS8qIFNrWG1hY01jSGFzaCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtYWNNY0hhc2ggLSBoYXNoIG11bHRpY2FzdCBhZGRyZXNzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIGhhc2ggdmFsdWUgZm9yIGEgbXVsdGljYXN0IGFkZHJlc3MuCisgKglBIENSQzE2IGFsZ29yaXRobSBpcyB1c2VkLgorICoKKyAqIE5vdGVzOgorICoKKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCisgKiBSZXR1cm5zOgorICoJSGFzaCB2YWx1ZSBvZiBtdWx0aWNhc3QgYWRkcmVzcy4KKyAqLworU0tfVTMyIFNrR21hY01jSGFzaCgKK3Vuc2lnbmVkIGNoYXIgKnBNYykJLyogTXVsdGljYXN0IGFkZHJlc3MgKi8KK3sKKwlTS19VMzIgRGF0YTsKKwlTS19VMzIgVG1wRGF0YTsKKwlTS19VMzIgQ3JjOworCWludCBCeXRlOworCWludCBCaXQ7CisKKwlDcmMgPSAweEZGRkZGRkZGVUw7CisJZm9yIChCeXRlID0gMDsgQnl0ZSA8IDY7IEJ5dGUrKykgeworCQkvKiBHZXQgbmV4dCBieXRlLiAqLworCQlEYXRhID0gKFNLX1UzMikgcE1jW0J5dGVdOworCQkKKwkJLyogQ2hhbmdlIGJpdCBvcmRlciBpbiBieXRlLiAqLworCQlUbXBEYXRhID0gRGF0YTsKKwkJZm9yIChCaXQgPSAwOyBCaXQgPCA4OyBCaXQrKykgeworCQkJaWYgKFRtcERhdGEgJiAxTCkgeworCQkJCURhdGEgfD0gIDFMIDw8ICg3IC0gQml0KTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCURhdGEgJj0gfigxTCA8PCAoNyAtIEJpdCkpOworCQkJfQorCQkJVG1wRGF0YSA+Pj0gMTsKKwkJfQorCQkKKwkJQ3JjIF49IChEYXRhIDw8IDI0KTsKKwkJZm9yIChCaXQgPSAwOyBCaXQgPCA4OyBCaXQrKykgeworCQkJaWYgKENyYyAmIDB4ODAwMDAwMDApIHsKKwkJCQlDcmMgPSAoQ3JjIDw8IDEpIF4gR01BQ19QT0xZOworCQkJfQorCQkJZWxzZSB7CisJCQkJQ3JjIDw8PSAxOworCQkJfQorCQl9CisJfQorCQorCXJldHVybiAoQ3JjICYgKCgxIDw8IEhBU0hfQklUUykgLSAxKSk7CisKK30JLyogU2tHbWFjTWNIYXNoICovCisKKyNlbmRpZgkvKiAhU0tfQUREUl9DSEVBVCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyTWNBZGQgLSBhZGQgYSBtdWx0aWNhc3QgYWRkcmVzcyB0byBhIHBvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBlbmFibGVzIHJlY2VwdGlvbiBmb3IgYSBnaXZlbiBhZGRyZXNzIG9uIHRoZSBnaXZlbiBwb3J0LgorICoKKyAqCUl0IGNhbGxzIGVpdGhlciBTa0FkZHJYbWFjTWNBZGQgb3IgU2tBZGRyR21hY01jQWRkLCBhY2NvcmRpbmcgdG8gdGhlCisgKglhZGFwdGVyIGluIHVzZS4gVGhlIHJlYWwgd29yayBpcyBkb25lIHRoZXJlLgorICoKKyAqIE5vdGVzOgorICoJVGhlIHJldHVybiBjb2RlIGlzIG9ubHkgdmFsaWQgZm9yIFNLX1BST01fTU9ERV9OT05FLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZQorICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0RBVEEKKyAqCisgKiBSZXR1cm5zOgorICoJU0tfTUNfRklMVEVSSU5HX0VYQUNUCisgKglTS19NQ19GSUxURVJJTkdfSU5FWEFDVAorICoJU0tfTUNfSUxMRUdBTF9BRERSRVNTCisgKglTS19NQ19JTExFR0FMX1BPUlQKKyAqCVNLX01DX1JMTVRfT1ZFUkZMT1cKKyAqLworaW50CVNrQWRkck1jQWRkKAorU0tfQUMJCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMgkJUG9ydE51bWJlciwJLyogUG9ydCBOdW1iZXIgKi8KK1NLX01BQ19BRERSCSpwTWMsCQkvKiBtdWx0aWNhc3QgYWRkcmVzcyB0byBiZSBhZGRlZCAqLworaW50CQkJRmxhZ3MpCQkvKiBwZXJtYW5lbnQvbm9uLXBlcm1hbmVudCAqLworeworCWludCBSZXR1cm5Db2RlOworCQorCWlmIChQb3J0TnVtYmVyID49IChTS19VMzIpIHBBQy0+R0luaS5HSU1hY3NGb3VuZCkgeworCQlyZXR1cm4gKFNLX0FERFJfSUxMRUdBTF9QT1JUKTsKKwl9CisJCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJUmV0dXJuQ29kZSA9IFNrQWRkclhtYWNNY0FkZChwQUMsIElvQywgUG9ydE51bWJlciwgcE1jLCBGbGFncyk7CisJfQorCWVsc2UgeworCQlSZXR1cm5Db2RlID0gU2tBZGRyR21hY01jQWRkKHBBQywgSW9DLCBQb3J0TnVtYmVyLCBwTWMsIEZsYWdzKTsKKwl9CisKKwlyZXR1cm4gKFJldHVybkNvZGUpOworCit9CS8qIFNrQWRkck1jQWRkICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQWRkclhtYWNNY0FkZCAtIGFkZCBhIG11bHRpY2FzdCBhZGRyZXNzIHRvIGEgcG9ydAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGVuYWJsZXMgcmVjZXB0aW9uIGZvciBhIGdpdmVuIGFkZHJlc3Mgb24gdGhlIGdpdmVuIHBvcnQuCisgKgorICogTm90ZXM6CisgKglUaGUgcmV0dXJuIGNvZGUgaXMgb25seSB2YWxpZCBmb3IgU0tfUFJPTV9NT0RFX05PTkUuCisgKgorICoJVGhlIG11bHRpY2FzdCBiaXQgaXMgb25seSBjaGVja2VkIGlmIHRoZXJlIGFyZSBubyBmcmVlIGV4YWN0IG1hdGNoCisgKgllbnRyaWVzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZQorICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0RBVEEKKyAqCisgKiBSZXR1cm5zOgorICoJU0tfTUNfRklMVEVSSU5HX0VYQUNUCisgKglTS19NQ19GSUxURVJJTkdfSU5FWEFDVAorICoJU0tfTUNfSUxMRUdBTF9BRERSRVNTCisgKglTS19NQ19STE1UX09WRVJGTE9XCisgKi8KK2ludAlTa0FkZHJYbWFjTWNBZGQoCitTS19BQwkJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCQlJb0MsCQkvKiBJL08gY29udGV4dCAqLworU0tfVTMyCQlQb3J0TnVtYmVyLAkvKiBQb3J0IE51bWJlciAqLworU0tfTUFDX0FERFIJKnBNYywJCS8qIG11bHRpY2FzdCBhZGRyZXNzIHRvIGJlIGFkZGVkICovCitpbnQJCUZsYWdzKQkJLyogcGVybWFuZW50L25vbi1wZXJtYW5lbnQgKi8KK3sKKwlpbnQJaTsKKwlTS19VOAlJbmV4YWN0OworI2lmbmRlZiBTS19BRERSX0NIRUFUCisJU0tfVTMyIEhhc2hCaXQ7CisjZW5kaWYJLyogIWRlZmluZWQoU0tfQUREUl9DSEVBVCkgKi8KKworCWlmIChGbGFncyAmIFNLX0FERFJfUEVSTUFORU5UKSB7CS8qIHBlcm1hbmVudCA9PiBSTE1UICovCisjaWZkZWYgeERFQlVHCisJCWlmIChwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaFJsbXQgPAorCQkJU0tfQUREUl9GSVJTVF9NQVRDSF9STE1UKSB7CisJCQlOZXh0MFtQb3J0TnVtYmVyXSB8PSAxOworCQkJcmV0dXJuIChTS19NQ19STE1UX09WRVJGTE9XKTsKKwkJfQorI2VuZGlmCS8qIERFQlVHICovCisJCQorCQlpZiAocEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uTmV4dEV4YWN0TWF0Y2hSbG10ID4KKwkJCVNLX0FERFJfTEFTVF9NQVRDSF9STE1UKSB7CisJCQlyZXR1cm4gKFNLX01DX1JMTVRfT1ZFUkZMT1cpOworCQl9CisKKwkJLyogU2V0IGEgUkxNVCBtdWx0aWNhc3QgYWRkcmVzcy4gKi8KKworCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5FeGFjdFsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoUmxtdCsrXSA9ICpwTWM7CisKKwkJcmV0dXJuIChTS19NQ19GSUxURVJJTkdfRVhBQ1QpOworCX0KKworI2lmZGVmIHhERUJVRworCWlmIChwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaERydiA8CisJCVNLX0FERFJfRklSU1RfTUFUQ0hfRFJWKSB7CisJCQlOZXh0MFtQb3J0TnVtYmVyXSB8PSAyOworCQlyZXR1cm4gKFNLX01DX1JMTVRfT1ZFUkZMT1cpOworCX0KKyNlbmRpZgkvKiBERUJVRyAqLworCQorCWlmIChwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaERydiA8PSBTS19BRERSX0xBU1RfTUFUQ0hfRFJWKSB7CisKKwkJLyogU2V0IGV4YWN0IG1hdGNoIGVudHJ5LiAqLworCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5FeGFjdFsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoRHJ2KytdID0gKnBNYzsKKworCQkvKiBDbGVhciBJbmV4YWN0RmlsdGVyICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gPSAwOworCQl9CisJfQorCWVsc2UgeworCQlpZiAoIShwTWMtPmFbMF0gJiBTS19NQ19CSVQpKSB7CisJCQkvKiBIYXNoaW5nIG9ubHkgcG9zc2libGUgd2l0aCBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisJCQlyZXR1cm4gKFNLX01DX0lMTEVHQUxfQUREUkVTUyk7CisJCX0KKyNpZm5kZWYgU0tfQUREUl9DSEVBVAorCQkvKiBDb21wdXRlIGhhc2ggdmFsdWUgb2YgYWRkcmVzcy4gKi8KKwkJSGFzaEJpdCA9IDYzIC0gU2tYbWFjTWNIYXNoKCZwTWMtPmFbMF0pOworCisJCS8qIEFkZCBiaXQgdG8gSW5leGFjdEZpbHRlci4gKi8KKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1tIYXNoQml0IC8gOF0gfD0KKwkJCTEgPDwgKEhhc2hCaXQgJSA4KTsKKyNlbHNlCS8qIFNLX0FERFJfQ0hFQVQgKi8KKwkJLyogU2V0IGFsbCBiaXRzIGluIEluZXhhY3RGaWx0ZXIuICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gPSAweEZGOworCQl9CisjZW5kaWYJLyogU0tfQUREUl9DSEVBVCAqLworCX0KKworCWZvciAoSW5leGFjdCA9IDAsIGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCUluZXhhY3QgfD0gcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1tpXTsKKwl9CisKKwlpZiAoSW5leGFjdCA9PSAwICYmIHBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLlByb21Nb2RlID09IDApIHsKKwkJcmV0dXJuIChTS19NQ19GSUxURVJJTkdfRVhBQ1QpOworCX0KKwllbHNlIHsKKwkJcmV0dXJuIChTS19NQ19GSUxURVJJTkdfSU5FWEFDVCk7CisJfQorCit9CS8qIFNrQWRkclhtYWNNY0FkZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJHbWFjTWNBZGQgLSBhZGQgYSBtdWx0aWNhc3QgYWRkcmVzcyB0byBhIHBvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBlbmFibGVzIHJlY2VwdGlvbiBmb3IgYSBnaXZlbiBhZGRyZXNzIG9uIHRoZSBnaXZlbiBwb3J0LgorICoKKyAqIE5vdGVzOgorICoJVGhlIHJldHVybiBjb2RlIGlzIG9ubHkgdmFsaWQgZm9yIFNLX1BST01fTU9ERV9OT05FLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZQorICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0RBVEEKKyAqCisgKiBSZXR1cm5zOgorICoJU0tfTUNfRklMVEVSSU5HX0lORVhBQ1QKKyAqCVNLX01DX0lMTEVHQUxfQUREUkVTUworICovCitpbnQJU2tBZGRyR21hY01jQWRkKAorU0tfQUMJCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMgkJUG9ydE51bWJlciwJLyogUG9ydCBOdW1iZXIgKi8KK1NLX01BQ19BRERSCSpwTWMsCQkvKiBtdWx0aWNhc3QgYWRkcmVzcyB0byBiZSBhZGRlZCAqLworaW50CQlGbGFncykJCS8qIHBlcm1hbmVudC9ub24tcGVybWFuZW50ICovCit7CisJaW50CWk7CisjaWZuZGVmIFNLX0FERFJfQ0hFQVQKKwlTS19VMzIgSGFzaEJpdDsKKyNlbmRpZgkvKiAhZGVmaW5lZChTS19BRERSX0NIRUFUKSAqLworCQkKKwlpZiAoIShwTWMtPmFbMF0gJiBTS19NQ19CSVQpKSB7CisJCS8qIEhhc2hpbmcgb25seSBwb3NzaWJsZSB3aXRoIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KKwkJcmV0dXJuIChTS19NQ19JTExFR0FMX0FERFJFU1MpOworCX0KKwkKKyNpZm5kZWYgU0tfQUREUl9DSEVBVAorCQorCS8qIENvbXB1dGUgaGFzaCB2YWx1ZSBvZiBhZGRyZXNzLiAqLworCUhhc2hCaXQgPSBTa0dtYWNNY0hhc2goJnBNYy0+YVswXSk7CisJCisJaWYgKEZsYWdzICYgU0tfQUREUl9QRVJNQU5FTlQpIHsJLyogcGVybWFuZW50ID0+IFJMTVQgKi8KKwkJCisJCS8qIEFkZCBiaXQgdG8gSW5leGFjdFJsbXRGaWx0ZXIuICovCisJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzW0hhc2hCaXQgLyA4XSB8PQorCQkJMSA8PCAoSGFzaEJpdCAlIDgpOworCQkKKwkJLyogQ29weSBiaXQgdG8gSW5leGFjdEZpbHRlci4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1tpXSB8PQorCQkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzW2ldOworCQl9CisjaWZkZWYgREVCVUcKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJHTUFDIEluZXhhY3RSbG10RmlsdGVyOiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0UmxtdEZpbHRlci5CeXRlc1swXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzWzFdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdFJsbXRGaWx0ZXIuQnl0ZXNbMl0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0UmxtdEZpbHRlci5CeXRlc1szXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzWzRdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdFJsbXRGaWx0ZXIuQnl0ZXNbNV0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0UmxtdEZpbHRlci5CeXRlc1s2XSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzWzddKSkKKyNlbmRpZgkvKiBERUJVRyAqLworCX0KKwllbHNlIHsJLyogbm90IHBlcm1hbmVudCA9PiBEUlYgKi8KKwkJCisJCS8qIEFkZCBiaXQgdG8gSW5leGFjdERydkZpbHRlci4gKi8KKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdERydkZpbHRlci5CeXRlc1tIYXNoQml0IC8gOF0gfD0KKwkJCTEgPDwgKEhhc2hCaXQgJSA4KTsKKwkJCisJCS8qIENvcHkgYml0IHRvIEluZXhhY3RGaWx0ZXIuICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gfD0KKwkJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzW2ldOworCQl9CisjaWZkZWYgREVCVUcKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJHTUFDIEluZXhhY3REcnZGaWx0ZXI6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3REcnZGaWx0ZXIuQnl0ZXNbMF0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzWzFdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdERydkZpbHRlci5CeXRlc1syXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3REcnZGaWx0ZXIuQnl0ZXNbM10sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzWzRdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdERydkZpbHRlci5CeXRlc1s1XSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3REcnZGaWx0ZXIuQnl0ZXNbNl0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzWzddKSkKKyNlbmRpZgkvKiBERUJVRyAqLworCX0KKwkKKyNlbHNlCS8qIFNLX0FERFJfQ0hFQVQgKi8KKwkKKwkvKiBTZXQgYWxsIGJpdHMgaW4gSW5leGFjdEZpbHRlci4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gPSAweEZGOworCX0KKyNlbmRpZgkvKiBTS19BRERSX0NIRUFUICovCisJCQorCXJldHVybiAoU0tfTUNfRklMVEVSSU5HX0lORVhBQ1QpOworCQorfQkvKiBTa0FkZHJHbWFjTWNBZGQgKi8KKworI2VuZGlmIC8qICFTS19TTElNICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJNY1VwZGF0ZSAtIHVwZGF0ZSB0aGUgSFcgTUMgYWRkcmVzcyB0YWJsZSBhbmQgc2V0IHRoZSBNQUMgYWRkcmVzcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGVuYWJsZXMgcmVjZXB0aW9uIG9mIHRoZSBhZGRyZXNzZXMgY29udGFpbmVkIGluIGEgbG9jYWwKKyAqCXRhYmxlIGZvciBhIGdpdmVuIHBvcnQuCisgKglJdCBhbHNvIHByb2dyYW1zIHRoZSBwb3J0J3MgY3VycmVudCBwaHlzaWNhbCBNQUMgYWRkcmVzcy4KKyAqCisgKglJdCBjYWxscyBlaXRoZXIgU2tBZGRyWG1hY01jVXBkYXRlIG9yIFNrQWRkckdtYWNNY1VwZGF0ZSwgYWNjb3JkaW5nCisgKgl0byB0aGUgYWRhcHRlciBpbiB1c2UuIFRoZSByZWFsIHdvcmsgaXMgZG9uZSB0aGVyZS4KKyAqCisgKiBOb3RlczoKKyAqCVRoZSByZXR1cm4gY29kZSBpcyBvbmx5IHZhbGlkIGZvciBTS19QUk9NX01PREVfTk9ORS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglTS19NQ19GSUxURVJJTkdfRVhBQ1QKKyAqCVNLX01DX0ZJTFRFUklOR19JTkVYQUNUCisgKglTS19BRERSX0lMTEVHQUxfUE9SVAorICovCitpbnQJU2tBZGRyTWNVcGRhdGUoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyKQkvKiBQb3J0IE51bWJlciAqLworeworCWludCBSZXR1cm5Db2RlID0gMDsKKyNpZiAoIWRlZmluZWQoU0tfU0xJTSkgfHwgZGVmaW5lZChERUJVRykpCisJaWYgKFBvcnROdW1iZXIgPj0gKFNLX1UzMikgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kKSB7CisJCXJldHVybiAoU0tfQUREUl9JTExFR0FMX1BPUlQpOworCX0KKyNlbmRpZiAvKiAhU0tfU0xJTSB8fCBERUJVRyAqLworCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCVJldHVybkNvZGUgPSBTa0FkZHJYbWFjTWNVcGRhdGUocEFDLCBJb0MsIFBvcnROdW1iZXIpOworCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisjaWZkZWYgWVVLT04KKwlpZiAoIXBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJUmV0dXJuQ29kZSA9IFNrQWRkckdtYWNNY1VwZGF0ZShwQUMsIElvQywgUG9ydE51bWJlcik7CisJfQorI2VuZGlmIC8qIFlVS09OICovCisJcmV0dXJuIChSZXR1cm5Db2RlKTsKKworfQkvKiBTa0FkZHJNY1VwZGF0ZSAqLworCisKKyNpZmRlZiBHRU5FU0lTCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJYbWFjTWNVcGRhdGUgLSB1cGRhdGUgdGhlIEhXIE1DIGFkZHJlc3MgdGFibGUgYW5kIHNldCB0aGUgTUFDIGFkZHJlc3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBlbmFibGVzIHJlY2VwdGlvbiBvZiB0aGUgYWRkcmVzc2VzIGNvbnRhaW5lZCBpbiBhIGxvY2FsCisgKgl0YWJsZSBmb3IgYSBnaXZlbiBwb3J0LgorICoJSXQgYWxzbyBwcm9ncmFtcyB0aGUgcG9ydCdzIGN1cnJlbnQgcGh5c2ljYWwgTUFDIGFkZHJlc3MuCisgKgorICogTm90ZXM6CisgKglUaGUgcmV0dXJuIGNvZGUgaXMgb25seSB2YWxpZCBmb3IgU0tfUFJPTV9NT0RFX05PTkUuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfTUNfRklMVEVSSU5HX0VYQUNUCisgKglTS19NQ19GSUxURVJJTkdfSU5FWEFDVAorICoJU0tfQUREUl9JTExFR0FMX1BPUlQKKyAqLworaW50CVNrQWRkclhtYWNNY1VwZGF0ZSgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJL08gY29udGV4dCAqLworU0tfVTMyCVBvcnROdW1iZXIpCS8qIFBvcnQgTnVtYmVyICovCit7CisJU0tfVTMyCQlpOworCVNLX1U4CQlJbmV4YWN0OworCVNLX1UxNgkJKk91dEFkZHI7CisJU0tfQUREUl9QT1JUCSpwQVBvcnQ7CisKKwlTS19EQkdfTVNHKHBBQyxTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU2tBZGRyWG1hY01jVXBkYXRlIG9uIFBvcnQgJXUuXG4iLCBQb3J0TnVtYmVyKSkKKwkKKwlwQVBvcnQgPSAmcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl07CisKKyNpZmRlZiBERUJVRworCVNLX0RCR19NU0cocEFDLFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJOZXh0MCBvbiBQb3J0ICVkOiAlZFxuIiwgUG9ydE51bWJlciwgTmV4dDBbUG9ydE51bWJlcl0pKQorI2VuZGlmIC8qIERFQlVHICovCisKKwkvKiBTdGFydCB3aXRoIDAgdG8gYWxzbyBwcm9ncmFtIHRoZSBsb2dpY2FsIE1BQyBhZGRyZXNzLiAqLworCWZvciAoaSA9IDA7IGkgPCBwQVBvcnQtPk5leHRFeGFjdE1hdGNoUmxtdDsgaSsrKSB7CisJCS8qIFNldCBleGFjdCBtYXRjaCBhZGRyZXNzIGkgb24gWE1BQyAqLworCQlPdXRBZGRyID0gKFNLX1UxNiAqKSAmcEFQb3J0LT5FeGFjdFtpXS5hWzBdOworCQlYTV9PVVRBRERSKElvQywgUG9ydE51bWJlciwgWE1fRVhNKGkpLCBPdXRBZGRyKTsKKwl9CisKKwkvKiBDbGVhciBvdGhlciBwZXJtYW5lbnQgZXhhY3QgbWF0Y2ggYWRkcmVzc2VzIG9uIFhNQUMgKi8KKwlpZiAocEFQb3J0LT5OZXh0RXhhY3RNYXRjaFJsbXQgPD0gU0tfQUREUl9MQVNUX01BVENIX1JMTVQpIHsKKwkJCisJCVNrWG1DbHJFeGFjdEFkZHIocEFDLCBJb0MsIFBvcnROdW1iZXIsIHBBUG9ydC0+TmV4dEV4YWN0TWF0Y2hSbG10LAorCQkJU0tfQUREUl9MQVNUX01BVENIX1JMTVQpOworCX0KKworCWZvciAoaSA9IHBBUG9ydC0+Rmlyc3RFeGFjdE1hdGNoRHJ2OyBpIDwgcEFQb3J0LT5OZXh0RXhhY3RNYXRjaERydjsgaSsrKSB7CisJCU91dEFkZHIgPSAoU0tfVTE2ICopICZwQVBvcnQtPkV4YWN0W2ldLmFbMF07CisJCVhNX09VVEFERFIoSW9DLCBQb3J0TnVtYmVyLCBYTV9FWE0oaSksIE91dEFkZHIpOworCX0KKworCS8qIENsZWFyIG90aGVyIG5vbi1wZXJtYW5lbnQgZXhhY3QgbWF0Y2ggYWRkcmVzc2VzIG9uIFhNQUMgKi8KKwlpZiAocEFQb3J0LT5OZXh0RXhhY3RNYXRjaERydiA8PSBTS19BRERSX0xBU1RfTUFUQ0hfRFJWKSB7CisJCQorCQlTa1htQ2xyRXhhY3RBZGRyKHBBQywgSW9DLCBQb3J0TnVtYmVyLCBwQVBvcnQtPk5leHRFeGFjdE1hdGNoRHJ2LAorCQkJU0tfQUREUl9MQVNUX01BVENIX0RSVik7CisJfQorCisJZm9yIChJbmV4YWN0ID0gMCwgaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJSW5leGFjdCB8PSBwQVBvcnQtPkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV07CisJfQorCisJaWYgKHBBUG9ydC0+UHJvbU1vZGUgJiBTS19QUk9NX01PREVfQUxMX01DKSB7CisJCQorCQkvKiBTZXQgYWxsIGJpdHMgaW4gNjQtYml0IGhhc2ggcmVnaXN0ZXIuICovCisJCVhNX09VVEhBU0goSW9DLCBQb3J0TnVtYmVyLCBYTV9IU00sICZPbmVzSGFzaCk7CisJCQorCQkvKiBFbmFibGUgSGFzaGluZyAqLworCQlTa01hY0hhc2hpbmcocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX1RSVUUpOworCX0KKwllbHNlIGlmIChJbmV4YWN0ICE9IDApIHsKKwkJCisJCS8qIFNldCA2NC1iaXQgaGFzaCByZWdpc3RlciB0byBJbmV4YWN0RmlsdGVyLiAqLworCQlYTV9PVVRIQVNIKElvQywgUG9ydE51bWJlciwgWE1fSFNNLCAmcEFQb3J0LT5JbmV4YWN0RmlsdGVyLkJ5dGVzWzBdKTsKKwkJCisJCS8qIEVuYWJsZSBIYXNoaW5nICovCisJCVNrTWFjSGFzaGluZyhwQUMsIElvQywgKGludCkgUG9ydE51bWJlciwgU0tfVFJVRSk7CisJfQorCWVsc2UgeworCQkvKiBEaXNhYmxlIEhhc2hpbmcgKi8KKwkJU2tNYWNIYXNoaW5nKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19GQUxTRSk7CisJfQorCisJaWYgKHBBUG9ydC0+UHJvbU1vZGUgIT0gU0tfUFJPTV9NT0RFX05PTkUpIHsKKwkJKHZvaWQpIFNrQWRkclhtYWNQcm9taXNjdW91c0NoYW5nZShwQUMsIElvQywgUG9ydE51bWJlciwgcEFQb3J0LT5Qcm9tTW9kZSk7CisJfQorCisJLyogU2V0IHBvcnQncyBjdXJyZW50IHBoeXNpY2FsIE1BQyBhZGRyZXNzLiAqLworCU91dEFkZHIgPSAoU0tfVTE2ICopICZwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbMF07CisJCisJWE1fT1VUQUREUihJb0MsIFBvcnROdW1iZXIsIFhNX1NBLCBPdXRBZGRyKTsKKworI2lmZGVmIHhERUJVRworCWZvciAoaSA9IDA7IGkgPCBwQVBvcnQtPk5leHRFeGFjdE1hdGNoUmxtdDsgaSsrKSB7CisJCVNLX1U4CQlJbkFkZHI4WzZdOworCQlTS19VMTYJCSpJbkFkZHI7CisKKwkJLyogR2V0IGV4YWN0IG1hdGNoIGFkZHJlc3MgaSBmcm9tIHBvcnQgUG9ydE51bWJlci4gKi8KKwkJSW5BZGRyID0gKFNLX1UxNiAqKSAmSW5BZGRyOFswXTsKKwkJCisJCVhNX0lOQUREUihJb0MsIFBvcnROdW1iZXIsIFhNX0VYTShpKSwgSW5BZGRyKTsKKwkJCisJCVNLX0RCR19NU0cocEFDLFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU2tBZGRyWG1hY01jVXBkYXRlOiBNQyBhZGRyZXNzICVkIG9uIFBvcnQgJXU6ICIsCisJCQkgIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IC0tICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCWksCisJCQkJUG9ydE51bWJlciwKKwkJCQlJbkFkZHI4WzBdLAorCQkJCUluQWRkcjhbMV0sCisJCQkJSW5BZGRyOFsyXSwKKwkJCQlJbkFkZHI4WzNdLAorCQkJCUluQWRkcjhbNF0sCisJCQkJSW5BZGRyOFs1XSwKKwkJCQlwQVBvcnQtPkV4YWN0W2ldLmFbMF0sCisJCQkJcEFQb3J0LT5FeGFjdFtpXS5hWzFdLAorCQkJCXBBUG9ydC0+RXhhY3RbaV0uYVsyXSwKKwkJCQlwQVBvcnQtPkV4YWN0W2ldLmFbM10sCisJCQkJcEFQb3J0LT5FeGFjdFtpXS5hWzRdLAorCQkJCXBBUG9ydC0+RXhhY3RbaV0uYVs1XSkpCisJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwkvKiBEZXRlcm1pbmUgcmV0dXJuIHZhbHVlLiAqLworCWlmIChJbmV4YWN0ID09IDAgJiYgcEFQb3J0LT5Qcm9tTW9kZSA9PSAwKSB7CisJCXJldHVybiAoU0tfTUNfRklMVEVSSU5HX0VYQUNUKTsKKwl9CisJZWxzZSB7CisJCXJldHVybiAoU0tfTUNfRklMVEVSSU5HX0lORVhBQ1QpOworCX0KKwkKK30JLyogU2tBZGRyWG1hY01jVXBkYXRlICovCisKKyNlbmRpZiAgLyogR0VORVNJUyAqLworCisjaWZkZWYgWVVLT04KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQWRkckdtYWNNY1VwZGF0ZSAtIHVwZGF0ZSB0aGUgSFcgTUMgYWRkcmVzcyB0YWJsZSBhbmQgc2V0IHRoZSBNQUMgYWRkcmVzcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGVuYWJsZXMgcmVjZXB0aW9uIG9mIHRoZSBhZGRyZXNzZXMgY29udGFpbmVkIGluIGEgbG9jYWwKKyAqCXRhYmxlIGZvciBhIGdpdmVuIHBvcnQuCisgKglJdCBhbHNvIHByb2dyYW1zIHRoZSBwb3J0J3MgY3VycmVudCBwaHlzaWNhbCBNQUMgYWRkcmVzcy4KKyAqCisgKiBOb3RlczoKKyAqCVRoZSByZXR1cm4gY29kZSBpcyBvbmx5IHZhbGlkIGZvciBTS19QUk9NX01PREVfTk9ORS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglTS19NQ19GSUxURVJJTkdfRVhBQ1QKKyAqCVNLX01DX0ZJTFRFUklOR19JTkVYQUNUCisgKglTS19BRERSX0lMTEVHQUxfUE9SVAorICovCitpbnQJU2tBZGRyR21hY01jVXBkYXRlKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBjb250ZXh0ICovCitTS19VMzIJUG9ydE51bWJlcikJLyogUG9ydCBOdW1iZXIgKi8KK3sKKyNpZm5kZWYgU0tfU0xJTQorCVNLX1UzMgkJaTsKKwlTS19VOAkJSW5leGFjdDsKKyNlbmRpZgkvKiBub3QgU0tfU0xJTSAqLworCVNLX1UxNgkJKk91dEFkZHI7CisJU0tfQUREUl9QT1JUCSpwQVBvcnQ7CisKKwlTS19EQkdfTVNHKHBBQyxTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU2tBZGRyR21hY01jVXBkYXRlIG9uIFBvcnQgJXUuXG4iLCBQb3J0TnVtYmVyKSkKKwkKKwlwQVBvcnQgPSAmcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl07CisKKyNpZmRlZiBERUJVRworCVNLX0RCR19NU0cocEFDLFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJOZXh0MCBvbiBQb3J0ICVkOiAlZFxuIiwgUG9ydE51bWJlciwgTmV4dDBbUG9ydE51bWJlcl0pKQorI2VuZGlmIC8qIERFQlVHICovCisJCisjaWZuZGVmIFNLX1NMSU0KKwlmb3IgKEluZXhhY3QgPSAwLCBpID0gMDsgaSA8IDg7IGkrKykgeworCQlJbmV4YWN0IHw9IHBBUG9ydC0+SW5leGFjdEZpbHRlci5CeXRlc1tpXTsKKwl9CisJCisJLyogU2V0IDY0LWJpdCBoYXNoIHJlZ2lzdGVyIHRvIEluZXhhY3RGaWx0ZXIuICovCisJR01fT1VUSEFTSChJb0MsIFBvcnROdW1iZXIsIEdNX01DX0FERFJfSDEsCisJCSZwQVBvcnQtPkluZXhhY3RGaWx0ZXIuQnl0ZXNbMF0pOworCQorCWlmIChwQVBvcnQtPlByb21Nb2RlICYgU0tfUFJPTV9NT0RFX0FMTF9NQykgewkJCQkKKwkJCisJCS8qIFNldCBhbGwgYml0cyBpbiA2NC1iaXQgaGFzaCByZWdpc3Rlci4gKi8KKwkJR01fT1VUSEFTSChJb0MsIFBvcnROdW1iZXIsIEdNX01DX0FERFJfSDEsICZPbmVzSGFzaCk7CisJCQorCQkvKiBFbmFibGUgSGFzaGluZyAqLworCQlTa01hY0hhc2hpbmcocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX1RSVUUpOworCX0KKwllbHNlIHsJCisJCS8qIEVuYWJsZSBIYXNoaW5nLiAqLworCQlTa01hY0hhc2hpbmcocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX1RSVUUpOworCX0KKwkKKwlpZiAocEFQb3J0LT5Qcm9tTW9kZSAhPSBTS19QUk9NX01PREVfTk9ORSkgeworCQkodm9pZCkgU2tBZGRyR21hY1Byb21pc2N1b3VzQ2hhbmdlKHBBQywgSW9DLCBQb3J0TnVtYmVyLCBwQVBvcnQtPlByb21Nb2RlKTsKKwl9CisjZWxzZSAvKiBTS19TTElNICovCisKKwkvKiBTZXQgYWxsIGJpdHMgaW4gNjQtYml0IGhhc2ggcmVnaXN0ZXIuICovCisJR01fT1VUSEFTSChJb0MsIFBvcnROdW1iZXIsIEdNX01DX0FERFJfSDEsICZPbmVzSGFzaCk7CisKKwkvKiBFbmFibGUgSGFzaGluZyAqLworCVNrTWFjSGFzaGluZyhwQUMsIElvQywgKGludCkgUG9ydE51bWJlciwgU0tfVFJVRSk7CisJCisJKHZvaWQpIFNrQWRkckdtYWNQcm9taXNjdW91c0NoYW5nZShwQUMsIElvQywgUG9ydE51bWJlciwgcEFQb3J0LT5Qcm9tTW9kZSk7CisJCisjZW5kaWYgLyogU0tfU0xJTSAqLworCQorCS8qIFNldCBwb3J0J3MgY3VycmVudCBwaHlzaWNhbCBNQUMgYWRkcmVzcy4gKi8KKwlPdXRBZGRyID0gKFNLX1UxNiAqKSAmcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzBdOworCUdNX09VVEFERFIoSW9DLCBQb3J0TnVtYmVyLCBHTV9TUkNfQUREUl8xTCwgT3V0QWRkcik7CisJCisJLyogU2V0IHBvcnQncyBjdXJyZW50IGxvZ2ljYWwgTUFDIGFkZHJlc3MuICovCisJT3V0QWRkciA9IChTS19VMTYgKikgJnBBUG9ydC0+RXhhY3RbMF0uYVswXTsKKwlHTV9PVVRBRERSKElvQywgUG9ydE51bWJlciwgR01fU1JDX0FERFJfMkwsIE91dEFkZHIpOworCQorI2lmZGVmIERFQlVHCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTa0FkZHJHbWFjTWNVcGRhdGU6IFBlcm1hbmVudCBQaHlzaWNhbCBNQUMgQWRkcmVzczogJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQlwQVBvcnQtPkV4YWN0WzBdLmFbMF0sCisJCQlwQVBvcnQtPkV4YWN0WzBdLmFbMV0sCisJCQlwQVBvcnQtPkV4YWN0WzBdLmFbMl0sCisJCQlwQVBvcnQtPkV4YWN0WzBdLmFbM10sCisJCQlwQVBvcnQtPkV4YWN0WzBdLmFbNF0sCisJCQlwQVBvcnQtPkV4YWN0WzBdLmFbNV0pKQorCQorCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU2tBZGRyR21hY01jVXBkYXRlOiBQaHlzaWNhbCBNQUMgQWRkcmVzczogJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbMF0sCisJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbMV0sCisJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbMl0sCisJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbM10sCisJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbNF0sCisJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbNV0pKQorI2VuZGlmIC8qIERFQlVHICovCisJCisjaWZuZGVmIFNLX1NMSU0KKwkvKiBEZXRlcm1pbmUgcmV0dXJuIHZhbHVlLiAqLworCWlmIChJbmV4YWN0ID09IDAgJiYgcEFQb3J0LT5Qcm9tTW9kZSA9PSAwKSB7CisJCXJldHVybiAoU0tfTUNfRklMVEVSSU5HX0VYQUNUKTsKKwl9CisJZWxzZSB7CisJCXJldHVybiAoU0tfTUNfRklMVEVSSU5HX0lORVhBQ1QpOworCX0KKyNlbHNlIC8qIFNLX1NMSU0gKi8KKwlyZXR1cm4gKFNLX01DX0ZJTFRFUklOR19JTkVYQUNUKTsKKyNlbmRpZiAvKiBTS19TTElNICovCisJCit9CS8qIFNrQWRkckdtYWNNY1VwZGF0ZSAqLworCisjZW5kaWYgLyogWVVLT04gKi8KKworI2lmbmRlZiBTS19OT19NQU8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQWRkck92ZXJyaWRlIC0gb3ZlcnJpZGUgYSBwb3J0J3MgTUFDIGFkZHJlc3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBvdmVycmlkZXMgdGhlIE1BQyBhZGRyZXNzIG9mIG9uZSBwb3J0LgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZQorICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCVNLX0FERFJfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgorICoJU0tfQUREUl9EVVBMSUNBVEVfQUREUkVTUyBpZiBkdXBsaWNhdGUgTUFDIGFkZHJlc3MuCisgKglTS19BRERSX01VTFRJQ0FTVF9BRERSRVNTIGlmIG11bHRpY2FzdCBvciBicm9hZGNhc3QgYWRkcmVzcy4KKyAqCVNLX0FERFJfVE9PX0VBUkxZIGlmIFNLX0lOSVRfSU8gd2FzIG5vdCBleGVjdXRlZCBiZWZvcmUuCisgKi8KK2ludAlTa0FkZHJPdmVycmlkZSgKK1NLX0FDCQkqcEFDLAkJCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkJCQkvKiBJL08gY29udGV4dCAqLworU0tfVTMyCQlQb3J0TnVtYmVyLAkJCS8qIFBvcnQgTnVtYmVyICovCitTS19NQUNfQUREUglTS19GQVIgKnBOZXdBZGRyLAkvKiBuZXcgTUFDIGFkZHJlc3MgKi8KK2ludAkJCUZsYWdzKQkJCQkvKiBsb2dpY2FsL3BoeXNpY2FsIE1BQyBhZGRyZXNzICovCit7CisjaWZuZGVmIFNLX05PX1JMTVQKKwlTS19FVlBBUkEJUGFyYTsKKyNlbmRpZiAvKiAhU0tfTk9fUkxNVCAqLworCVNLX1UzMgkJTmV0TnVtYmVyOworCVNLX1UzMgkJaTsKKwlTS19VMTYJCVNLX0ZBUiAqT3V0QWRkcjsKKworI2lmbmRlZiBTS19OT19STE1UCisJTmV0TnVtYmVyID0gcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5OZXROdW1iZXI7CisjZWxzZQorCU5ldE51bWJlciA9IDA7CisjZW5kaWYgLyogU0tfTk9fUkxNVCAqLworI2lmICghZGVmaW5lZChTS19TTElNKSB8fCBkZWZpbmVkKERFQlVHKSkKKwlpZiAoUG9ydE51bWJlciA+PSAoU0tfVTMyKSBwQUMtPkdJbmkuR0lNYWNzRm91bmQpIHsKKwkJcmV0dXJuIChTS19BRERSX0lMTEVHQUxfUE9SVCk7CisJfQorI2VuZGlmIC8qICFTS19TTElNIHx8IERFQlVHICovCisJaWYgKHBOZXdBZGRyICE9IE5VTEwgJiYgKHBOZXdBZGRyLT5hWzBdICYgU0tfTUNfQklUKSAhPSAwKSB7CisJCXJldHVybiAoU0tfQUREUl9NVUxUSUNBU1RfQUREUkVTUyk7CisJfQorCisJaWYgKCFwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3NTZXQpIHsKKwkJcmV0dXJuIChTS19BRERSX1RPT19FQVJMWSk7CisJfQorCisJaWYgKEZsYWdzICYgU0tfQUREUl9TRVRfTE9HSUNBTCkgewkvKiBBY3RpdmF0ZSBsb2dpY2FsIE1BQyBhZGRyZXNzLiAqLworCQkvKiBQYXJhbWV0ZXIgKnBOZXdBZGRyIGlzIGlnbm9yZWQuICovCisJCWZvciAoaSA9IDA7IGkgPCAoU0tfVTMyKSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQkJaWYgKCFwQUMtPkFkZHIuUG9ydFtpXS5DdXJyZW50TWFjQWRkcmVzc1NldCkgeworCQkJCXJldHVybiAoU0tfQUREUl9UT09fRUFSTFkpOworCQkJfQorCQl9CisjaWZuZGVmIFNLX05PX1JMTVQKKwkJLyogU2V0IFBvcnROdW1iZXIgdG8gbnVtYmVyIG9mIG5ldCdzIGFjdGl2ZSBwb3J0LiAqLworCQlQb3J0TnVtYmVyID0gcEFDLT5SbG10Lk5ldFtOZXROdW1iZXJdLgorCQkJUG9ydFtwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQWN0aXZlUG9ydF0tPlBvcnROdW1iZXI7CisjZW5kaWYgLyogIVNLX05PX1JMTVQgKi8KKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uRXhhY3RbMF0gPQorCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzOworCisJCS8qIFdyaXRlIGFkZHJlc3MgdG8gZmlyc3QgZXhhY3QgbWF0Y2ggZW50cnkgb2YgYWN0aXZlIHBvcnQuICovCisJCSh2b2lkKSBTa0FkZHJNY1VwZGF0ZShwQUMsIElvQywgUG9ydE51bWJlcik7CisJfQorCWVsc2UgaWYgKEZsYWdzICYgU0tfQUREUl9DTEVBUl9MT0dJQ0FMKSB7CisJCS8qIERlYWN0aXZhdGUgbG9naWNhbCBNQUMgYWRkcmVzcy4gKi8KKwkJLyogUGFyYW1ldGVyICpwTmV3QWRkciBpcyBpZ25vcmVkLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgKFNLX1UzMikgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJCWlmICghcEFDLT5BZGRyLlBvcnRbaV0uQ3VycmVudE1hY0FkZHJlc3NTZXQpIHsKKwkJCQlyZXR1cm4gKFNLX0FERFJfVE9PX0VBUkxZKTsKKwkJCX0KKwkJfQorI2lmbmRlZiBTS19OT19STE1UCisJCS8qIFNldCBQb3J0TnVtYmVyIHRvIG51bWJlciBvZiBuZXQncyBhY3RpdmUgcG9ydC4gKi8KKwkJUG9ydE51bWJlciA9IHBBQy0+UmxtdC5OZXRbTmV0TnVtYmVyXS4KKwkJCVBvcnRbcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkFjdGl2ZVBvcnRdLT5Qb3J0TnVtYmVyOworI2VuZGlmIC8qICFTS19OT19STE1UICovCisJCWZvciAoaSA9IDA7IGkgPCBTS19NQUNfQUREUl9MRU47IGkrKyApIHsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkV4YWN0WzBdLmFbaV0gPSAwOworCQl9CisKKwkJLyogV3JpdGUgYWRkcmVzcyB0byBmaXJzdCBleGFjdCBtYXRjaCBlbnRyeSBvZiBhY3RpdmUgcG9ydC4gKi8KKwkJKHZvaWQpIFNrQWRkck1jVXBkYXRlKHBBQywgSW9DLCBQb3J0TnVtYmVyKTsKKwl9CisJZWxzZSBpZiAoRmxhZ3MgJiBTS19BRERSX1BIWVNJQ0FMX0FERFJFU1MpIHsJLyogUGh5c2ljYWwgTUFDIGFkZHJlc3MuICovCisJCWlmIChTS19BRERSX0VRVUFMKHBOZXdBZGRyLT5hLAorCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLmEpKSB7CisJCQlyZXR1cm4gKFNLX0FERFJfRFVQTElDQVRFX0FERFJFU1MpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IChTS19VMzIpIHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQlpZiAoIXBBQy0+QWRkci5Qb3J0W2ldLkN1cnJlbnRNYWNBZGRyZXNzU2V0KSB7CisJCQkJcmV0dXJuIChTS19BRERSX1RPT19FQVJMWSk7CisJCQl9CisKKwkJCWlmIChTS19BRERSX0VRVUFMKHBOZXdBZGRyLT5hLAorCQkJCXBBQy0+QWRkci5Qb3J0W2ldLkN1cnJlbnRNYWNBZGRyZXNzLmEpKSB7CisJCQkJaWYgKGkgPT0gUG9ydE51bWJlcikgeworCQkJCQlyZXR1cm4gKFNLX0FERFJfU1VDQ0VTUyk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlyZXR1cm4gKFNLX0FERFJfRFVQTElDQVRFX0FERFJFU1MpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLlByZXZpb3VzTWFjQWRkcmVzcyA9CisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzczsKKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MgPSAqcE5ld0FkZHI7CisKKwkJLyogQ2hhbmdlIHBvcnQncyBwaHlzaWNhbCBNQUMgYWRkcmVzcy4gKi8KKwkJT3V0QWRkciA9IChTS19VMTYgU0tfRkFSICopIHBOZXdBZGRyOworI2lmZGVmIEdFTkVTSVMKKwkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCVhNX09VVEFERFIoSW9DLCBQb3J0TnVtYmVyLCBYTV9TQSwgT3V0QWRkcik7CisJCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisjaWZkZWYgWVVLT04KKwkJaWYgKCFwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQlHTV9PVVRBRERSKElvQywgUG9ydE51bWJlciwgR01fU1JDX0FERFJfMUwsIE91dEFkZHIpOworCQl9CisjZW5kaWYgLyogWVVLT04gKi8KKworI2lmbmRlZiBTS19OT19STE1UCisJCS8qIFJlcG9ydCBhZGRyZXNzIGNoYW5nZSB0byBSTE1ULiAqLworCQlQYXJhLlBhcmEzMlswXSA9IFBvcnROdW1iZXI7CisJCVBhcmEuUGFyYTMyWzBdID0gLTE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9QT1JUX0FERFIsIFBhcmEpOworI2VuZGlmIC8qICFTS19OT19STE1UICovCisJfQorCWVsc2UgewkvKiBMb2dpY2FsIE1BQyBhZGRyZXNzLiAqLworCQlpZiAoU0tfQUREUl9FUVVBTChwTmV3QWRkci0+YSwKKwkJCXBBQy0+QWRkci5OZXRbTmV0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzcy5hKSkgeworCQkJcmV0dXJuIChTS19BRERSX1NVQ0NFU1MpOworCQl9CisJCQorCQlmb3IgKGkgPSAwOyBpIDwgKFNLX1UzMikgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJCWlmICghcEFDLT5BZGRyLlBvcnRbaV0uQ3VycmVudE1hY0FkZHJlc3NTZXQpIHsKKwkJCQlyZXR1cm4gKFNLX0FERFJfVE9PX0VBUkxZKTsKKwkJCX0KKworCQkJaWYgKFNLX0FERFJfRVFVQUwocE5ld0FkZHItPmEsCisJCQkJcEFDLT5BZGRyLlBvcnRbaV0uQ3VycmVudE1hY0FkZHJlc3MuYSkpIHsKKwkJCQlyZXR1cm4gKFNLX0FERFJfRFVQTElDQVRFX0FERFJFU1MpOworCQkJfQorCQl9CisJCQorCQkvKgorCQkgKiBJbiBjYXNlIHRoYXQgdGhlIHBoeXNpY2FsIGFuZCB0aGUgbG9naWNhbCBNQUMgYWRkcmVzc2VzIGFyZSBlcXVhbAorCQkgKiB3ZSBtdXN0IGFsc28gY2hhbmdlIHRoZSBwaHlzaWNhbCBNQUMgYWRkcmVzcyBoZXJlLgorCQkgKiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSBhbiBhZGFwdGVyIHdoaWNoIGluaXRpYWxseSB3YXMgcHJvZ3JhbW1lZCB3aXRoCisJCSAqIHR3byBpZGVudGljYWwgTUFDIGFkZHJlc3Nlcy4KKwkJICovCisJCWlmIChTS19BRERSX0VRVUFMKHBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLmEsCisJCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uRXhhY3RbMF0uYSkpIHsKKwkJCQorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uUHJldmlvdXNNYWNBZGRyZXNzID0KKwkJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzczsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzID0gKnBOZXdBZGRyOworCQkJCisjaWZuZGVmIFNLX05PX1JMTVQKKwkJCS8qIFJlcG9ydCBhZGRyZXNzIGNoYW5nZSB0byBSTE1ULiAqLworCQkJUGFyYS5QYXJhMzJbMF0gPSBQb3J0TnVtYmVyOworCQkJUGFyYS5QYXJhMzJbMF0gPSAtMTsKKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9QT1JUX0FERFIsIFBhcmEpOworI2VuZGlmIC8qICFTS19OT19STE1UICovCisJCX0KKwkJCisjaWZuZGVmIFNLX05PX1JMTVQKKwkJLyogU2V0IFBvcnROdW1iZXIgdG8gbnVtYmVyIG9mIG5ldCdzIGFjdGl2ZSBwb3J0LiAqLworCQlQb3J0TnVtYmVyID0gcEFDLT5SbG10Lk5ldFtOZXROdW1iZXJdLgorCQkJUG9ydFtwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQWN0aXZlUG9ydF0tPlBvcnROdW1iZXI7CisjZW5kaWYgLyogIVNLX05PX1JMTVQgKi8KKwkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzID0gKnBOZXdBZGRyOworCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5FeGFjdFswXSA9ICpwTmV3QWRkcjsKKyNpZmRlZiBERUJVRworCQlTS19EQkdfTVNHKHBBQyxTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNrQWRkck92ZXJyaWRlOiBQZXJtYW5lbnQgTUFDIEFkZHJlc3M6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCQkJCXBBQy0+QWRkci5OZXRbTmV0TnVtYmVyXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbMF0sCisJCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLlBlcm1hbmVudE1hY0FkZHJlc3MuYVsxXSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uUGVybWFuZW50TWFjQWRkcmVzcy5hWzJdLAorCQkJCXBBQy0+QWRkci5OZXRbTmV0TnVtYmVyXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbM10sCisJCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLlBlcm1hbmVudE1hY0FkZHJlc3MuYVs0XSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uUGVybWFuZW50TWFjQWRkcmVzcy5hWzVdKSkKKwkJCisJCVNLX0RCR19NU0cocEFDLFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU2tBZGRyT3ZlcnJpZGU6IE5ldyBsb2dpY2FsIE1BQyBBZGRyZXNzOiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVswXSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVsxXSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVsyXSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVszXSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVs0XSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVs1XSkpCisjZW5kaWYgLyogREVCVUcgKi8KKworICAgICAgICAvKiBXcml0ZSBhZGRyZXNzIHRvIGZpcnN0IGV4YWN0IG1hdGNoIGVudHJ5IG9mIGFjdGl2ZSBwb3J0LiAqLworCQkodm9pZCkgU2tBZGRyTWNVcGRhdGUocEFDLCBJb0MsIFBvcnROdW1iZXIpOworCX0KKworCXJldHVybiAoU0tfQUREUl9TVUNDRVNTKTsKKwkKK30JLyogU2tBZGRyT3ZlcnJpZGUgKi8KKworCisjZW5kaWYgLyogU0tfTk9fTUFPICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJQcm9taXNjdW91c0NoYW5nZSAtIHNldCBwcm9taXNjdW91cyBtb2RlIGZvciBnaXZlbiBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgbWFuYWdlcyBwcm9taXNjdW91cyBtb2RlOgorICoJLSBub25lCisgKgktIGFsbCBMTEMgZnJhbWVzCisgKgktIGFsbCBNQyBmcmFtZXMKKyAqCisgKglJdCBjYWxscyBlaXRoZXIgU2tBZGRyWG1hY1Byb21pc2N1b3VzQ2hhbmdlIG9yCisgKglTa0FkZHJHbWFjUHJvbWlzY3VvdXNDaGFuZ2UsIGFjY29yZGluZyB0byB0aGUgYWRhcHRlciBpbiB1c2UuCisgKglUaGUgcmVhbCB3b3JrIGlzIGRvbmUgdGhlcmUuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQUREUl9TVUNDRVNTCisgKglTS19BRERSX0lMTEVHQUxfUE9SVAorICovCitpbnQJU2tBZGRyUHJvbWlzY3VvdXNDaGFuZ2UoCitTS19BQwkqcEFDLAkJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCQkvKiBJL08gY29udGV4dCAqLworU0tfVTMyCVBvcnROdW1iZXIsCQkvKiBwb3J0IHdob3NlIHByb21pc2N1b3VzIG1vZGUgY2hhbmdlcyAqLworaW50CQlOZXdQcm9tTW9kZSkJLyogbmV3IHByb21pc2N1b3VzIG1vZGUgKi8KK3sKKwlpbnQgUmV0dXJuQ29kZSA9IDA7CisjaWYgKCFkZWZpbmVkKFNLX1NMSU0pIHx8IGRlZmluZWQoREVCVUcpKQorCWlmIChQb3J0TnVtYmVyID49IChTS19VMzIpIHBBQy0+R0luaS5HSU1hY3NGb3VuZCkgeworCQlyZXR1cm4gKFNLX0FERFJfSUxMRUdBTF9QT1JUKTsKKwl9CisjZW5kaWYgLyogIVNLX1NMSU0gfHwgREVCVUcgKi8KKworI2lmZGVmIEdFTkVTSVMKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQlSZXR1cm5Db2RlID0KKwkJCVNrQWRkclhtYWNQcm9taXNjdW91c0NoYW5nZShwQUMsIElvQywgUG9ydE51bWJlciwgTmV3UHJvbU1vZGUpOworCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisjaWZkZWYgWVVLT04KKwlpZiAoIXBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJUmV0dXJuQ29kZSA9CisJCQlTa0FkZHJHbWFjUHJvbWlzY3VvdXNDaGFuZ2UocEFDLCBJb0MsIFBvcnROdW1iZXIsIE5ld1Byb21Nb2RlKTsKKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworCXJldHVybiAoUmV0dXJuQ29kZSk7CisKK30JLyogU2tBZGRyUHJvbWlzY3VvdXNDaGFuZ2UgKi8KKworI2lmZGVmIEdFTkVTSVMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQWRkclhtYWNQcm9taXNjdW91c0NoYW5nZSAtIHNldCBwcm9taXNjdW91cyBtb2RlIGZvciBnaXZlbiBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgbWFuYWdlcyBwcm9taXNjdW91cyBtb2RlOgorICoJLSBub25lCisgKgktIGFsbCBMTEMgZnJhbWVzCisgKgktIGFsbCBNQyBmcmFtZXMKKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglTS19BRERSX1NVQ0NFU1MKKyAqCVNLX0FERFJfSUxMRUdBTF9QT1JUCisgKi8KK2ludAlTa0FkZHJYbWFjUHJvbWlzY3VvdXNDaGFuZ2UoCitTS19BQwkqcEFDLAkJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCQkvKiBJL08gY29udGV4dCAqLworU0tfVTMyCVBvcnROdW1iZXIsCQkvKiBwb3J0IHdob3NlIHByb21pc2N1b3VzIG1vZGUgY2hhbmdlcyAqLworaW50CQlOZXdQcm9tTW9kZSkJLyogbmV3IHByb21pc2N1b3VzIG1vZGUgKi8KK3sKKwlpbnQJCQlpOworCVNLX0JPT0wJCUluZXhhY3RNb2RlQml0OworCVNLX1U4CQlJbmV4YWN0OworCVNLX1U4CQlId0luZXhhY3Q7CisJU0tfRklMVEVSNjQJSHdJbmV4YWN0RmlsdGVyOworCVNLX1UxNgkJTG9Nb2RlOwkJLyogTG93ZXIgMTYgYml0cyBvZiBYTUFDIE1vZGUgUmVnaXN0ZXIuICovCisJaW50CQkJQ3VyUHJvbU1vZGUgPSBTS19QUk9NX01PREVfTk9ORTsKKworCS8qIFJlYWQgQ3VyUHJvbU1vZGUgZnJvbSBIYXJkd2FyZS4gKi8KKwlYTV9JTjE2KElvQywgUG9ydE51bWJlciwgWE1fTU9ERSwgJkxvTW9kZSk7CisKKwlpZiAoKExvTW9kZSAmIFhNX01EX0VOQV9QUk9NKSAhPSAwKSB7CisJCS8qIFByb21pc2N1b3VzIG1vZGUhICovCisJCUN1clByb21Nb2RlIHw9IFNLX1BST01fTU9ERV9MTEM7CisJfQorCQorCWZvciAoSW5leGFjdCA9IDB4RkYsIGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCUluZXhhY3QgJj0gcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1tpXTsKKwl9CisJaWYgKEluZXhhY3QgPT0gMHhGRikgeworCQlDdXJQcm9tTW9kZSB8PSAocEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uUHJvbU1vZGUgJiBTS19QUk9NX01PREVfQUxMX01DKTsKKwl9CisJZWxzZSB7CisJCS8qIEdldCBJbmV4YWN0TW9kZUJpdCAoYml0IFhNX01EX0VOQV9IQVNIIGluIG1vZGUgcmVnaXN0ZXIpICovCisJCVhNX0lOMTYoSW9DLCBQb3J0TnVtYmVyLCBYTV9NT0RFLCAmTG9Nb2RlKTsKKwkJCisJCUluZXhhY3RNb2RlQml0ID0gKExvTW9kZSAmIFhNX01EX0VOQV9IQVNIKSAhPSAwOworCisJCS8qIFJlYWQgNjQtYml0IGhhc2ggcmVnaXN0ZXIgZnJvbSBYTUFDICovCisJCVhNX0lOSEFTSChJb0MsIFBvcnROdW1iZXIsIFhNX0hTTSwgJkh3SW5leGFjdEZpbHRlci5CeXRlc1swXSk7CisKKwkJZm9yIChId0luZXhhY3QgPSAweEZGLCBpID0gMDsgaSA8IDg7IGkrKykgeworCQkJSHdJbmV4YWN0ICY9IEh3SW5leGFjdEZpbHRlci5CeXRlc1tpXTsKKwkJfQorCisJCWlmIChJbmV4YWN0TW9kZUJpdCAmJiAoSHdJbmV4YWN0ID09IDB4RkYpKSB7CisJCQlDdXJQcm9tTW9kZSB8PSBTS19QUk9NX01PREVfQUxMX01DOworCQl9CisJfQorCisJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uUHJvbU1vZGUgPSBOZXdQcm9tTW9kZTsKKworCWlmIChOZXdQcm9tTW9kZSA9PSBDdXJQcm9tTW9kZSkgeworCQlyZXR1cm4gKFNLX0FERFJfU1VDQ0VTUyk7CisJfQorCisJaWYgKChOZXdQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9BTExfTUMpICYmCisJCSEoQ3VyUHJvbU1vZGUgJiBTS19QUk9NX01PREVfQUxMX01DKSkgewkvKiBBbGwgTUMuICovCisJCQorCQkvKiBTZXQgYWxsIGJpdHMgaW4gNjQtYml0IGhhc2ggcmVnaXN0ZXIuICovCisJCVhNX09VVEhBU0goSW9DLCBQb3J0TnVtYmVyLCBYTV9IU00sICZPbmVzSGFzaCk7CisKKwkJLyogRW5hYmxlIEhhc2hpbmcgKi8KKwkJU2tNYWNIYXNoaW5nKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19UUlVFKTsKKwl9CisJZWxzZSBpZiAoKEN1clByb21Nb2RlICYgU0tfUFJPTV9NT0RFX0FMTF9NQykgJiYKKwkJIShOZXdQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9BTExfTUMpKSB7CS8qIE5vcm0gTUMuICovCisJCWZvciAoSW5leGFjdCA9IDAsIGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlJbmV4YWN0IHw9IHBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV07CisJCX0KKwkJaWYgKEluZXhhY3QgPT0gMCkgeworCQkJLyogRGlzYWJsZSBIYXNoaW5nICovCisJCQlTa01hY0hhc2hpbmcocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX0ZBTFNFKTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIFNldCA2NC1iaXQgaGFzaCByZWdpc3RlciB0byBJbmV4YWN0RmlsdGVyLiAqLworCQkJWE1fT1VUSEFTSChJb0MsIFBvcnROdW1iZXIsIFhNX0hTTSwKKwkJCQkmcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1swXSk7CisKKwkJCS8qIEVuYWJsZSBIYXNoaW5nICovCisJCQlTa01hY0hhc2hpbmcocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX1RSVUUpOworCQl9CisJfQorCisJaWYgKChOZXdQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9MTEMpICYmCisJCSEoQ3VyUHJvbU1vZGUgJiBTS19QUk9NX01PREVfTExDKSkgewkvKiBQcm9tLiBMTEMgKi8KKwkJLyogU2V0IHRoZSBNQUMgaW4gUHJvbWlzY3VvdXMgTW9kZSAqLworCQlTa01hY1Byb21pc2NNb2RlKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19UUlVFKTsKKwl9CisJZWxzZSBpZiAoKEN1clByb21Nb2RlICYgU0tfUFJPTV9NT0RFX0xMQykgJiYKKwkJIShOZXdQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9MTEMpKSB7CS8qIE5vcm0uIExMQy4gKi8KKwkJLyogQ2xlYXIgUHJvbWlzY3VvdXMgTW9kZSAqLworCQlTa01hY1Byb21pc2NNb2RlKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19GQUxTRSk7CisJfQorCQorCXJldHVybiAoU0tfQUREUl9TVUNDRVNTKTsKKwkKK30JLyogU2tBZGRyWG1hY1Byb21pc2N1b3VzQ2hhbmdlICovCisKKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKyNpZmRlZiBZVUtPTgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyR21hY1Byb21pc2N1b3VzQ2hhbmdlIC0gc2V0IHByb21pc2N1b3VzIG1vZGUgZm9yIGdpdmVuIHBvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBtYW5hZ2VzIHByb21pc2N1b3VzIG1vZGU6CisgKgktIG5vbmUKKyAqCS0gYWxsIExMQyBmcmFtZXMKKyAqCS0gYWxsIE1DIGZyYW1lcworICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZQorICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCVNLX0FERFJfU1VDQ0VTUworICoJU0tfQUREUl9JTExFR0FMX1BPUlQKKyAqLworaW50CVNrQWRkckdtYWNQcm9taXNjdW91c0NoYW5nZSgKK1NLX0FDCSpwQUMsCQkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJCS8qIEkvTyBjb250ZXh0ICovCitTS19VMzIJUG9ydE51bWJlciwJCS8qIHBvcnQgd2hvc2UgcHJvbWlzY3VvdXMgbW9kZSBjaGFuZ2VzICovCitpbnQJCU5ld1Byb21Nb2RlKQkvKiBuZXcgcHJvbWlzY3VvdXMgbW9kZSAqLworeworCVNLX1UxNgkJUmVjZWl2ZUNvbnRyb2w7CS8qIEdNQUMgUmVjZWl2ZSBDb250cm9sIFJlZ2lzdGVyICovCisJaW50CQlDdXJQcm9tTW9kZSA9IFNLX1BST01fTU9ERV9OT05FOworCisJLyogUmVhZCBDdXJQcm9tTW9kZSBmcm9tIEhhcmR3YXJlLiAqLworCUdNX0lOMTYoSW9DLCBQb3J0TnVtYmVyLCBHTV9SWF9DVFJMLCAmUmVjZWl2ZUNvbnRyb2wpOworCisJaWYgKChSZWNlaXZlQ29udHJvbCAmIChHTV9SWENSX1VDRl9FTkEgfCBHTV9SWENSX01DRl9FTkEpKSA9PSAwKSB7CisJCS8qIFByb21pc2N1b3VzIG1vZGUhICovCisJCUN1clByb21Nb2RlIHw9IFNLX1BST01fTU9ERV9MTEM7CisJfQorCisJaWYgKChSZWNlaXZlQ29udHJvbCAmIEdNX1JYQ1JfTUNGX0VOQSkgPT0gMCkgeworCQkvKiBBbGwgTXVsdGljYXN0IG1vZGUhICovCisJCUN1clByb21Nb2RlIHw9IChwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5Qcm9tTW9kZSAmIFNLX1BST01fTU9ERV9BTExfTUMpOworCX0KKworCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLlByb21Nb2RlID0gTmV3UHJvbU1vZGU7CisKKwlpZiAoTmV3UHJvbU1vZGUgPT0gQ3VyUHJvbU1vZGUpIHsKKwkJcmV0dXJuIChTS19BRERSX1NVQ0NFU1MpOworCX0KKwkKKwlpZiAoKE5ld1Byb21Nb2RlICYgU0tfUFJPTV9NT0RFX0FMTF9NQykgJiYKKwkJIShDdXJQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9BTExfTUMpKSB7CS8qIEFsbCBNQyAqLworCQkKKwkJLyogU2V0IGFsbCBiaXRzIGluIDY0LWJpdCBoYXNoIHJlZ2lzdGVyLiAqLworCQlHTV9PVVRIQVNIKElvQywgUG9ydE51bWJlciwgR01fTUNfQUREUl9IMSwgJk9uZXNIYXNoKTsKKwkJCisJCS8qIEVuYWJsZSBIYXNoaW5nICovCisJCVNrTWFjSGFzaGluZyhwQUMsIElvQywgKGludCkgUG9ydE51bWJlciwgU0tfVFJVRSk7CisJfQorCQorCWlmICgoQ3VyUHJvbU1vZGUgJiBTS19QUk9NX01PREVfQUxMX01DKSAmJgorCQkhKE5ld1Byb21Nb2RlICYgU0tfUFJPTV9NT0RFX0FMTF9NQykpIHsJLyogTm9ybS4gTUMgKi8KKworCQkvKiBTZXQgNjQtYml0IGhhc2ggcmVnaXN0ZXIgdG8gSW5leGFjdEZpbHRlci4gKi8KKwkJR01fT1VUSEFTSChJb0MsIFBvcnROdW1iZXIsIEdNX01DX0FERFJfSDEsCisJCQkmcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1swXSk7CisKKwkJLyogRW5hYmxlIEhhc2hpbmcuICovCisJCVNrTWFjSGFzaGluZyhwQUMsIElvQywgKGludCkgUG9ydE51bWJlciwgU0tfVFJVRSk7CisJfQorCisJaWYgKChOZXdQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9MTEMpICYmCisJCSEoQ3VyUHJvbU1vZGUgJiBTS19QUk9NX01PREVfTExDKSkgewkvKiBQcm9tLiBMTEMgKi8KKwkJCisJCS8qIFNldCB0aGUgTUFDIHRvIFByb21pc2N1b3VzIE1vZGUuICovCisJCVNrTWFjUHJvbWlzY01vZGUocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX1RSVUUpOworCX0KKwllbHNlIGlmICgoQ3VyUHJvbU1vZGUgJiBTS19QUk9NX01PREVfTExDKSAmJgorCQkhKE5ld1Byb21Nb2RlICYgU0tfUFJPTV9NT0RFX0xMQykpIHsJLyogTm9ybS4gTExDICovCisJCQorCQkvKiBDbGVhciBQcm9taXNjdW91cyBNb2RlLiAqLworCQlTa01hY1Byb21pc2NNb2RlKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19GQUxTRSk7CisJfQorCisJcmV0dXJuIChTS19BRERSX1NVQ0NFU1MpOworCQorfQkvKiBTa0FkZHJHbWFjUHJvbWlzY3VvdXNDaGFuZ2UgKi8KKworI2VuZGlmIC8qIFlVS09OICovCisKKyNpZm5kZWYgU0tfU0xJTQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyU3dhcCAtIHN3YXAgYWRkcmVzcyBpbmZvCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgc3dhcHMgYWRkcmVzcyBpbmZvIG9mIHR3byBwb3J0cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglTS19BRERSX1NVQ0NFU1MKKyAqCVNLX0FERFJfSUxMRUdBTF9QT1JUCisgKi8KK2ludAlTa0FkZHJTd2FwKAorU0tfQUMJKnBBQywJCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMglGcm9tUG9ydE51bWJlciwJCS8qIFBvcnQxIEluZGV4ICovCitTS19VMzIJVG9Qb3J0TnVtYmVyKQkJLyogUG9ydDIgSW5kZXggKi8KK3sKKwlpbnQJCQlpOworCVNLX1U4CQlCeXRlOworCVNLX01BQ19BRERSCU1hY0FkZHI7CisJU0tfVTMyCQlEV29yZDsKKworCWlmIChGcm9tUG9ydE51bWJlciA+PSAoU0tfVTMyKSBwQUMtPkdJbmkuR0lNYWNzRm91bmQpIHsKKwkJcmV0dXJuIChTS19BRERSX0lMTEVHQUxfUE9SVCk7CisJfQorCisJaWYgKFRvUG9ydE51bWJlciA+PSAoU0tfVTMyKSBwQUMtPkdJbmkuR0lNYWNzRm91bmQpIHsKKwkJcmV0dXJuIChTS19BRERSX0lMTEVHQUxfUE9SVCk7CisJfQorCisJaWYgKHBBQy0+UmxtdC5Qb3J0W0Zyb21Qb3J0TnVtYmVyXS5OZXQgIT0gcEFDLT5SbG10LlBvcnRbVG9Qb3J0TnVtYmVyXS5OZXQpIHsKKwkJcmV0dXJuIChTS19BRERSX0lMTEVHQUxfUE9SVCk7CisJfQorCisJLyoKKwkgKiBTd2FwOgorCSAqIC0gRXhhY3QgTWF0Y2ggRW50cmllcyAoR0VuZXNpcyBhbmQgWXVrb24pCisJICogICBZdWtvbiB1c2VzIGZpcnN0IGVudHJ5IGZvciB0aGUgbG9naWNhbCBNQUMKKwkgKiAgIGFkZHJlc3MgKHN0b3JlZCBpbiB0aGUgc2Vjb25kIEdNQUMgcmVnaXN0ZXIpLgorCSAqIC0gRmlyc3RFeGFjdE1hdGNoUmxtdCAoR0VuZXNpcyBvbmx5KQorCSAqIC0gTmV4dEV4YWN0TWF0Y2hSbG10IChHRW5lc2lzIG9ubHkpCisJICogLSBGaXJzdEV4YWN0TWF0Y2hEcnYgKEdFbmVzaXMgb25seSkKKwkgKiAtIE5leHRFeGFjdE1hdGNoRHJ2IChHRW5lc2lzIG9ubHkpCisJICogLSA2NC1iaXQgZmlsdGVyIChJbmV4YWN0RmlsdGVyKQorCSAqIC0gUHJvbWlzY3VvdXMgTW9kZQorCSAqIG9mIHBvcnRzLgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IFNLX0FERFJfRVhBQ1RfTUFUQ0hFUzsgaSsrKSB7CisJCU1hY0FkZHIgPSBwQUMtPkFkZHIuUG9ydFtGcm9tUG9ydE51bWJlcl0uRXhhY3RbaV07CisJCXBBQy0+QWRkci5Qb3J0W0Zyb21Qb3J0TnVtYmVyXS5FeGFjdFtpXSA9CisJCQlwQUMtPkFkZHIuUG9ydFtUb1BvcnROdW1iZXJdLkV4YWN0W2ldOworCQlwQUMtPkFkZHIuUG9ydFtUb1BvcnROdW1iZXJdLkV4YWN0W2ldID0gTWFjQWRkcjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCUJ5dGUgPSBwQUMtPkFkZHIuUG9ydFtGcm9tUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1tpXTsKKwkJcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gPQorCQkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzW2ldOworCQlwQUMtPkFkZHIuUG9ydFtUb1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gPSBCeXRlOworCX0KKwkKKwlpID0gcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLlByb21Nb2RlOworCXBBQy0+QWRkci5Qb3J0W0Zyb21Qb3J0TnVtYmVyXS5Qcm9tTW9kZSA9IHBBQy0+QWRkci5Qb3J0W1RvUG9ydE51bWJlcl0uUHJvbU1vZGU7CisJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5Qcm9tTW9kZSA9IGk7CisJCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJRFdvcmQgPSBwQUMtPkFkZHIuUG9ydFtGcm9tUG9ydE51bWJlcl0uRmlyc3RFeGFjdE1hdGNoUmxtdDsKKwkJcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLkZpcnN0RXhhY3RNYXRjaFJsbXQgPQorCQkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5GaXJzdEV4YWN0TWF0Y2hSbG10OworCQlwQUMtPkFkZHIuUG9ydFtUb1BvcnROdW1iZXJdLkZpcnN0RXhhY3RNYXRjaFJsbXQgPSBEV29yZDsKKwkJCisJCURXb3JkID0gcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoUmxtdDsKKwkJcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoUmxtdCA9CisJCQlwQUMtPkFkZHIuUG9ydFtUb1BvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoUmxtdDsKKwkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaFJsbXQgPSBEV29yZDsKKwkJCisJCURXb3JkID0gcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLkZpcnN0RXhhY3RNYXRjaERydjsKKwkJcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLkZpcnN0RXhhY3RNYXRjaERydiA9CisJCQlwQUMtPkFkZHIuUG9ydFtUb1BvcnROdW1iZXJdLkZpcnN0RXhhY3RNYXRjaERydjsKKwkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5GaXJzdEV4YWN0TWF0Y2hEcnYgPSBEV29yZDsKKwkJCisJCURXb3JkID0gcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoRHJ2OworCQlwQUMtPkFkZHIuUG9ydFtGcm9tUG9ydE51bWJlcl0uTmV4dEV4YWN0TWF0Y2hEcnYgPQorCQkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaERydjsKKwkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaERydiA9IERXb3JkOworCX0KKwkKKwkvKiBDQVVUSU9OOiBTb2x1dGlvbiB3b3JrcyBpZiBvbmx5IHBvcnRzIG9mIG9uZSBhZGFwdGVyIGFyZSBpbiB1c2UuICovCisJZm9yIChpID0gMDsgKFNLX1UzMikgaSA8IHBBQy0+UmxtdC5OZXRbcEFDLT5SbG10LlBvcnRbVG9Qb3J0TnVtYmVyXS4KKwkJTmV0LT5OZXROdW1iZXJdLk51bVBvcnRzOyBpKyspIHsKKwkJaWYgKHBBQy0+UmxtdC5OZXRbcEFDLT5SbG10LlBvcnRbVG9Qb3J0TnVtYmVyXS5OZXQtPk5ldE51bWJlcl0uCisJCQlQb3J0W2ldLT5Qb3J0TnVtYmVyID09IFRvUG9ydE51bWJlcikgeworCQkJcEFDLT5BZGRyLk5ldFtwQUMtPlJsbXQuUG9ydFtUb1BvcnROdW1iZXJdLk5ldC0+TmV0TnVtYmVyXS4KKwkJCQlBY3RpdmVQb3J0ID0gaTsKKwkJCS8qIDIwMDAxMjA3IFJBOiBXYXMgIlRvUG9ydE51bWJlcjsiLiAqLworCQl9CisJfQorCQorCSh2b2lkKSBTa0FkZHJNY1VwZGF0ZShwQUMsIElvQywgRnJvbVBvcnROdW1iZXIpOworCSh2b2lkKSBTa0FkZHJNY1VwZGF0ZShwQUMsIElvQywgVG9Qb3J0TnVtYmVyKTsKKworCXJldHVybiAoU0tfQUREUl9TVUNDRVNTKTsKKwkKK30JLyogU2tBZGRyU3dhcCAqLworCisjZW5kaWYgLyogIVNLX1NMSU0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYJLyogX19jcGx1c3BsdXMgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2NzdW0uYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tjc3VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhNmU3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tjc3VtLmMKQEAgLTAsMCArMSw4NzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2NzdW0uYworICogUHJvamVjdDoJR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjEyICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA4LzIwIDEzOjU1OjUzICQKKyAqIFB1cnBvc2U6CVN0b3JlL3ZlcmlmeSBJbnRlcm5ldCBjaGVja3N1bSBpbiBzZW5kL3JlY2VpdmUgcGFja2V0cy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMyBTeXNLb25uZWN0IEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgU0tfVVNFX0NTVU0JLyogQ2hlY2sgaWYgQ1NVTSBpcyB0byBiZSB1c2VkLiAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIFN5c0tvbm5lY3RGaWxlSWRbXSA9CisJIkAoIykgJElkOiBza2NzdW0uYyx2IDEuMTIgMjAwMy8wOC8yMCAxMzo1NTo1MyBtc2NobWlkIEV4cCAkIChDKSBTeXNLb25uZWN0LiI7CisjZW5kaWYJLyogIWxpbnQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFRoaXMgaXMgdGhlICJHRW5lc2lzIiBjb21tb24gbW9kdWxlICJDU1VNIi4KKyAqCisgKiBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgY29kZSBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlLCBzdG9yZSwgYW5kIHZlcmlmeSB0aGUKKyAqIEludGVybmV0IENoZWNrc3VtIG9mIElQLCBUQ1AsIGFuZCBVRFAgZnJhbWVzLgorICoKKyAqICJHRW5lc2lzIiBpcyBhbiBhYmJyZXZpYXRpb24gb2YgIkdpZ2FiaXQgRXRoZXJuZXQgTmV0d29yayBTeXN0ZW0gaW4gU2lsaWNvbiIKKyAqIGFuZCBpcyB0aGUgY29kZSBuYW1lIG9mIHRoaXMgU3lzS29ubmVjdCBwcm9qZWN0LgorICoKKyAqIENvbXBpbGF0aW9uIE9wdGlvbnM6CisgKgorICoJU0tfVVNFX0NTVU0gLSBEZWZpbmUgaWYgQ1NVTSBpcyB0byBiZSB1c2VkLiBPdGhlcndpc2UsIENTVU0gd2lsbCBiZSBhbgorICoJZW1wdHkgbW9kdWxlLgorICoKKyAqCVNLQ1NfT1ZFUldSSVRFX1BST1RPIC0gRGVmaW5lIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBwcm90b2NvbCBpZAorICoJZGVmaW5pdGlvbnMuIEluIHRoaXMgY2FzZSwgYWxsIFNLQ1NfUFJPVE9feHh4IGRlZmluaXRpb25zIG11c3QgYmUgbWFkZQorICoJZXh0ZXJuYWwuCisgKgorICoJU0tDU19PVkVSV1JJVEVfU1RBVFVTIC0gRGVmaW5lIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCByZXR1cm4gc3RhdHVzCisgKglkZWZpbml0aW9ucy4gSW4gdGhpcyBjYXNlLCBhbGwgU0tDU19TVEFUVVNfeHh4IGRlZmluaXRpb25zIG11c3QgYmUgbWFkZQorICoJZXh0ZXJuYWwuCisgKgorICogSW5jbHVkZSBGaWxlIEhpZXJhcmNoeToKKyAqCisgKgkiaC9za2RydjFzdC5oIgorICoJImgvc2tjc3VtLmgiCisgKgkiaC9za3R5cGVzLmgiCisgKgkiaC9za3F1ZXVlLmgiCisgKgkiaC9za2RydjJuZC5oIgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCisjaW5jbHVkZSAiaC9za2NzdW0uaCIKKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCisKKy8qIGRlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBzaXplIG9mIGFuIEV0aGVybmV0IE1BQyBoZWFkZXIuICovCisjZGVmaW5lIFNLQ1NfRVRIRVJORVRfTUFDX0hFQURFUl9TSVpFCQkJKDYrNisyKQorCisvKiBUaGUgc2l6ZSBvZiB0aGUgdXNlZCB0b3BvbG9neSdzIE1BQyBoZWFkZXIuICovCisjZGVmaW5lCVNLQ1NfTUFDX0hFQURFUl9TSVpFCVNLQ1NfRVRIRVJORVRfTUFDX0hFQURFUl9TSVpFCisKKy8qIFRoZSBzaXplIG9mIHRoZSBJUCBoZWFkZXIgd2l0aG91dCBhbnkgb3B0aW9uIGZpZWxkcy4gKi8KKyNkZWZpbmUgU0tDU19JUF9IRUFERVJfU0laRQkJCQkJCTIwCisKKy8qCisgKiBGaWVsZCBvZmZzZXRzIHdpdGhpbiB0aGUgSVAgaGVhZGVyLgorICovCisKKy8qICJJbnRlcm5ldCBIZWFkZXIgVmVyc2lvbiIgYW5kICJMZW5ndGgiLiAqLworI2RlZmluZSBTS0NTX09GU19JUF9IRUFERVJfVkVSU0lPTl9BTkRfTEVOR1RICTAKKworLyogIlRvdGFsIExlbmd0aCIuICovCisjZGVmaW5lIFNLQ1NfT0ZTX0lQX1RPVEFMX0xFTkdUSAkJCQkyCisKKy8qICJGbGFncyIgIkZyYWdtZW50IE9mZnNldCIuICovCisjZGVmaW5lIFNLQ1NfT0ZTX0lQX0ZMQUdTX0FORF9GUkFHTUVOVF9PRkZTRVQJNgorCisvKiAiTmV4dCBMZXZlbCBQcm90b2NvbCIgaWRlbnRpZmllci4gKi8KKyNkZWZpbmUgU0tDU19PRlNfSVBfTkVYVF9MRVZFTF9QUk9UT0NPTAkJCTkKKworLyogU291cmNlIElQIGFkZHJlc3MuICovCisjZGVmaW5lIFNLQ1NfT0ZTX0lQX1NPVVJDRV9BRERSRVNTCQkJCTEyCisKKy8qIERlc3RpbmF0aW9uIElQIGFkZHJlc3MuICovCisjZGVmaW5lIFNLQ1NfT0ZTX0lQX0RFU1RJTkFUSU9OX0FERFJFU1MJCQkxNgorCisKKy8qCisgKiBGaWVsZCBvZmZzZXRzIHdpdGhpbiB0aGUgVURQIGhlYWRlci4KKyAqLworCisvKiBVRFAgY2hlY2tzdW0uICovCisjZGVmaW5lIFNLQ1NfT0ZTX1VEUF9DSEVDS1NVTQkJCQkJNgorCisvKiBJUCAiTmV4dCBMZXZlbCBQcm90b2NvbCIgaWRlbnRpZmllcnMgKHNlZSBSRkMgNzkwKS4gKi8KKyNkZWZpbmUgU0tDU19QUk9UT19JRF9UQ1AJCTYJLyogVHJhbnNwb3J0IENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgU0tDU19QUk9UT19JRF9VRFAJCTE3CS8qIFVzZXIgRGF0YWdyYW0gUHJvdG9jb2wgKi8KKworLyogSVAgIkRvbid0IEZyYWdtZW50IiBiaXQuICovCisjZGVmaW5lIFNLQ1NfSVBfRE9OVF9GUkFHTUVOVAlTS0NTX0hUT04xNigweDQwMDApCisKKy8qIEFkZCBhIGJ5dGUgb2Zmc2V0IHRvIGEgcG9pbnRlci4gKi8KKyNkZWZpbmUgU0tDU19JRFgocFB0ciwgT2ZzKQkoKHZvaWQgKikgKChjaGFyICopIChwUHRyKSArIChPZnMpKSkKKworLyoKKyAqIE1hY3JvcyB0aGF0IGNvbnZlcnQgaG9zdCB0byBuZXR3b3JrIHJlcHJlc2VudGF0aW9uIGFuZCB2aWNlIHZlcnNhLCBpLmUuCisgKiBsaXR0bGUvYmlnIGVuZGlhbiBjb252ZXJzaW9uIG9uIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMgb25seS4KKyAqLworI2lmZGVmIFNLX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgU0tDU19IVE9OMTYoVmFsMTYpCSgoKHVuc2lnbmVkKSAoVmFsMTYpID4+IDgpIHwgKCgoVmFsMTYpICYgMHhmZikgPDwgOCkpCisjZW5kaWYJLyogU0tfTElUVExFX0VORElBTiAqLworI2lmZGVmIFNLX0JJR19FTkRJQU4KKyNkZWZpbmUgU0tDU19IVE9OMTYoVmFsMTYpCShWYWwxNikKKyNlbmRpZgkvKiBTS19CSUdfRU5ESUFOICovCisjZGVmaW5lIFNLQ1NfTlRPSDE2KFZhbDE2KQlTS0NTX0hUT04xNihWYWwxNikKKworLyogdHlwZWRlZnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQ3NHZXRTZW5kSW5mbyAtIGdldCBjaGVja3N1bSBpbmZvcm1hdGlvbiBmb3IgYSBzZW5kIHBhY2tldAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJR2V0IGFsbCBjaGVja3N1bSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gc2VuZCBhIFRDUCBvciBVRFAgcGFja2V0LiBUaGUKKyAqCWZ1bmN0aW9uIGNoZWNrcyB0aGUgSVAgaGVhZGVyIHBhc3NlZCB0byBpdC4gSWYgdGhlIGhpZ2gtbGV2ZWwgcHJvdG9jb2wKKyAqCWlzIGVpdGhlciBUQ1Agb3IgVURQIHRoZSBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgYW5kCisgKglyZXR1cm5lZC4KKyAqCisgKglUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBJUCBoZWFkZXIgKGluY2x1ZGluZyBhbnkKKyAqCUlQIG9wdGlvbiBmaWVsZHMpLCB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBJUCBkYXRhCisgKgl3aGljaCBpbiB0dXJuIGlzIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIFRDUCBvciBVRFAgaGVhZGVyLgorICoKKyAqCVRoZSBmdW5jdGlvbiBhbHNvIHJldHVybnMgdGhlIFRDUCBvciBVRFAgcHNldWRvIGhlYWRlciBjaGVja3N1bSwgd2hpY2gKKyAqCXNob3VsZCBiZSB1c2VkIGFzIHRoZSBzdGFydCB2YWx1ZSBmb3IgdGhlIGhhcmR3YXJlIGNoZWNrc3VtIGNhbGN1bGF0aW9uLgorICoJKE5vdGUgdGhhdCBhbnkgYWN0dWFsIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0gY2FuIG5ldmVyIGNhbGN1bGF0ZSB0bworICoJemVyby4pCisgKgorICogTm90ZToKKyAqCVRoZXJlIGlzIGEgYnVnIGluIHRoZSBHRU5FU0lTIEFTSUMgd2hpY2ggbWF5IGxlYWQgdG8gd3JvbmcgY2hlY2tzdW1zLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCXBBYyAtIEEgcG9pbnRlciB0byB0aGUgYWRhcHRlciBjb250ZXh0IHN0cnVjdC4KKyAqCisgKglwSXBIZWFkZXIgLSBQb2ludGVyIHRvIElQIGhlYWRlci4gTXVzdCBiZSBhdCBsZWFzdCB0aGUgSVAgaGVhZGVyICpub3QqCisgKglpbmNsdWRpbmcgYW55IG9wdGlvbiBmaWVsZHMsIGkuZS4gYXQgbGVhc3QgMjAgYnl0ZXMuCisgKgorICoJTm90ZTogVGhpcyBwb2ludGVyIHdpbGwgYmUgdXNlZCB0byBhZGRyZXNzIDgtLCAxNi0sIGFuZCAzMi1iaXQKKyAqCXZhcmlhYmxlcyB3aXRoIHRoZSByZXNwZWN0aXZlIGFsaWdubWVudCBvZmZzZXRzIHJlbGF0aXZlIHRvIHRoZSBwb2ludGVyLgorICoJVGh1cywgdGhlIHBvaW50ZXIgc2hvdWxkIHBvaW50IHRvIGEgMzItYml0IGFsaWduZWQgYWRkcmVzcy4gSWYgdGhlCisgKgl0YXJnZXQgc3lzdGVtIGNhbm5vdCBhZGRyZXNzIDMyLWJpdCB2YXJpYWJsZXMgb24gbm9uIDMyLWJpdCBhbGlnbmVkCisgKglhZGRyZXNzZXMsIHRoZW4gdGhlIHBvaW50ZXIgKm11c3QqIHBvaW50IHRvIGEgMzItYml0IGFsaWduZWQgYWRkcmVzcy4KKyAqCisgKglwUGFja2V0SW5mbyAtIEEgcG9pbnRlciB0byB0aGUgcGFja2V0IGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhpcworICoJcGFja2V0LiBCZWZvcmUgY2FsbGluZyB0aGlzIFNrQ3NHZXRTZW5kSW5mbygpLCB0aGUgZm9sbG93aW5nIGZpZWxkIG11c3QKKyAqCWJlIGluaXRpYWxpemVkOgorICoKKyAqCQlQcm90b2NvbEZsYWdzIC0gSW5pdGlhbGl6ZSB3aXRoIGFueSBjb21iaW5hdGlvbiBvZgorICoJCVNLQ1NfUFJPVE9fWFhYIGJpdCBmbGFncy4gU2tDc0dldFNlbmRJbmZvKCkgd2lsbCBvbmx5IHdvcmsgb24KKyAqCQl0aGUgcHJvdG9jb2xzIHNwZWNpZmllZCBoZXJlLiBBbnkgcHJvdG9jb2wocykgbm90IHNwZWNpZmllZAorICoJCWhlcmUgd2lsbCBiZSBpZ25vcmVkLgorICoKKyAqCQlOb3RlOiBPbmx5IG9uZSBjaGVja3N1bSBjYW4gYmUgY2FsY3VsYXRlZCBpbiBoYXJkd2FyZS4gVGh1cywgaWYKKyAqCQlTS0NTX1BST1RPX0lQIGlzIHNwZWNpZmllZCBpbiB0aGUgJ1Byb3RvY29sRmxhZ3MnLAorICoJCVNrQ3NHZXRTZW5kSW5mbygpIG11c3QgY2FsY3VsYXRlIHRoZSBJUCBoZWFkZXIgY2hlY2tzdW0gaW4KKyAqCQlzb2Z0d2FyZS4gSXQgbWlnaHQgYmUgYSBiZXR0ZXIgaWRlYSB0byBoYXZlIHRoZSBjYWxsaW5nCisgKgkJcHJvdG9jb2wgc3RhY2sgY2FsY3VsYXRlIHRoZSBJUCBoZWFkZXIgY2hlY2tzdW0uCisgKgorICogUmV0dXJuczogTi9BCisgKglPbiByZXR1cm4sIHRoZSBmb2xsb3dpbmcgZmllbGRzIGluICdwUGFja2V0SW5mbycgbWF5IG9yIG1heSBub3QgaGF2ZQorICoJYmVlbiBmaWxsZWQgd2l0aCBpbmZvcm1hdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBwcm90b2NvbChzKSBmb3VuZCBpbiB0aGUKKyAqCXBhY2tldDoKKyAqCisgKglQcm90b2NvbEZsYWdzIC0gUmV0dXJucyB0aGUgU0tDU19QUk9UT19YWFggYml0IGZsYWdzIG9mIHRoZSBwcm90b2NvbChzKQorICoJdGhhdCB3ZXJlIGJvdGggcmVxdWVzdGVkIGJ5IHRoZSBjYWxsZXIgYW5kIGFjdHVhbGx5IGZvdW5kIGluIHRoZSBwYWNrZXQuCisgKglQcm90b2NvbChzKSBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIgYW5kL29yIG5vdCBmb3VuZCBpbiB0aGUgcGFja2V0CisgKgl3aWxsIGhhdmUgdGhlaXIgcmVzcGVjdGl2ZSBTS0NTX1BST1RPX1hYWCBiaXQgZmxhZ3MgcmVzZXQuCisgKgorICoJTm90ZTogRm9yIElQIGZyYWdtZW50cywgVENQIGFuZCBVRFAgcGFja2V0IGluZm9ybWF0aW9uIGlzIGlnbm9yZWQuCisgKgorICoJSXBIZWFkZXJMZW5ndGggLSBUaGUgdG90YWwgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBjb21wbGV0ZSBJUCBoZWFkZXIKKyAqCWluY2x1ZGluZyBhbnkgb3B0aW9uIGZpZWxkcyBpcyByZXR1cm5lZCBoZXJlLiBUaGlzIGlzIHRoZSBzdGFydCBvZmZzZXQKKyAqCW9mIHRoZSBJUCBkYXRhLCBpLmUuIHRoZSBUQ1Agb3IgVURQIGhlYWRlciBpZiBwcmVzZW50LgorICoKKyAqCUlwSGVhZGVyQ2hlY2tzdW0gLSBJZiBJUCBoYXMgYmVlbiBzcGVjaWZpZWQgaW4gdGhlICdQcm90b2NvbEZsYWdzJywgdGhlCisgKgkxNi1iaXQgSW50ZXJuZXQgQ2hlY2tzdW0gb2YgdGhlIElQIGhlYWRlciBpcyByZXR1cm5lZCBoZXJlLiBUaGlzIHZhbHVlCisgKglpcyB0byBiZSBzdG9yZWQgaW50byB0aGUgcGFja2V0J3MgJ0lQIEhlYWRlciBDaGVja3N1bScgZmllbGQuCisgKgorICoJUHNldWRvSGVhZGVyQ2hlY2tzdW0gLSBJZiB0aGlzIGlzIGEgVENQIG9yIFVEUCBwYWNrZXQgYW5kIGlmIFRDUCBvciBVRFAKKyAqCWhhcyBiZWVuIHNwZWNpZmllZCBpbiB0aGUgJ1Byb3RvY29sRmxhZ3MnLCB0aGUgMTYtYml0IEludGVybmV0IENoZWNrc3VtCisgKglvZiB0aGUgVENQIG9yIFVEUCBwc2V1ZG8gaGVhZGVyIGlzIHJldHVybmVkIGhlcmUuCisgKi8KK3ZvaWQgU2tDc0dldFNlbmRJbmZvKAorU0tfQUMJCQkJKnBBYywJCQkvKiBBZGFwdGVyIGNvbnRleHQgc3RydWN0LiAqLwordm9pZAkJCQkqcElwSGVhZGVyLAkJLyogSVAgaGVhZGVyLiAqLworU0tDU19QQUNLRVRfSU5GTwkqcFBhY2tldEluZm8sCS8qIFBhY2tldCBpbmZvcm1hdGlvbiBzdHJ1Y3QuICovCitpbnQJCQkJCU5ldE51bWJlcikJCS8qIE5ldCBudW1iZXIgKi8KK3sKKwkvKiBJbnRlcm5ldCBIZWFkZXIgVmVyc2lvbiBmb3VuZCBpbiBJUCBoZWFkZXIuICovCisJdW5zaWduZWQgSW50ZXJuZXRIZWFkZXJWZXJzaW9uOworCisJLyogTGVuZ3RoIG9mIHRoZSBJUCBoZWFkZXIgYXMgZm91bmQgaW4gSVAgaGVhZGVyLiAqLworCXVuc2lnbmVkIElwSGVhZGVyTGVuZ3RoOworCisJLyogQml0IGZpZWxkIHNwZWNpZml5aW5nIHRoZSBkZXNpcmVkL2ZvdW5kIHByb3RvY29scy4gKi8KKwl1bnNpZ25lZCBQcm90b2NvbEZsYWdzOworCisJLyogTmV4dCBsZXZlbCBwcm90b2NvbCBpZGVudGlmaWVyIGZvdW5kIGluIElQIGhlYWRlci4gKi8KKwl1bnNpZ25lZCBOZXh0TGV2ZWxQcm90b2NvbDsKKworCS8qIExlbmd0aCBvZiBJUCBkYXRhIHBvcnRpb24uICovCisJdW5zaWduZWQgSXBEYXRhTGVuZ3RoOworCisJLyogVENQL1VEUCBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtLiAqLworCXVuc2lnbmVkIGxvbmcgUHNldWRvSGVhZGVyQ2hlY2tzdW07CisKKwkvKiBQb2ludGVyIHRvIG5leHQgbGV2ZWwgcHJvdG9jb2wgc3RhdGlzdGljcyBzdHJ1Y3R1cmUuICovCisJU0tDU19QUk9UT19TVEFUUyAqTmV4dExldmVsUHJvdG9TdGF0czsKKworCS8qIFRlbXBvcmFyeSB2YXJpYWJsZS4gKi8KKwl1bnNpZ25lZCBUbXA7CisKKwlUbXAgPSAqKFNLX1U4ICopCisJCVNLQ1NfSURYKHBJcEhlYWRlciwgU0tDU19PRlNfSVBfSEVBREVSX1ZFUlNJT05fQU5EX0xFTkdUSCk7CisKKwkvKiBHZXQgdGhlIEludGVybmV0IEhlYWRlciBWZXJzaW9uIChJSFYpLiAqLworCS8qIE5vdGU6IFRoZSBJSFYgaXMgc3RvcmVkIGluIHRoZSB1cHBlciBmb3VyIGJpdHMuICovCisKKwlJbnRlcm5ldEhlYWRlclZlcnNpb24gPSBUbXAgPj4gNDsKKworCS8qIENoZWNrIHRoZSBJbnRlcm5ldCBIZWFkZXIgVmVyc2lvbi4gKi8KKwkvKiBOb3RlOiBXZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IElQIHZlcnNpb24gNC4gKi8KKworCWlmIChJbnRlcm5ldEhlYWRlclZlcnNpb24gIT0gNCkgewkvKiBJUHY0PyAqLworCQlTS19EQkdfTVNHKHBBYywgU0tfREJHTU9EX0NTVU0sIFNLX0RCR0NBVF9FUlIgfCBTS19EQkdDQVRfVFgsCisJCQkoIlR4OiBVbmtub3duIEludGVybmV0IEhlYWRlciBWZXJzaW9uICV1LlxuIiwKKwkJCUludGVybmV0SGVhZGVyVmVyc2lvbikpOworCQlwUGFja2V0SW5mby0+UHJvdG9jb2xGbGFncyA9IDA7CisJCXBBYy0+Q3N1bS5Qcm90b1N0YXRzW05ldE51bWJlcl1bU0tDU19QUk9UT19TVEFUU19JUF0uVHhVbmFibGVDdHMrKzsKKwkJcmV0dXJuOworCX0KKworCS8qIEdldCB0aGUgSVAgaGVhZGVyIGxlbmd0aCAoSUhMKS4gKi8KKwkvKgorCSAqIE5vdGU6IFRoZSBJSEwgaXMgc3RvcmVkIGluIHRoZSBsb3dlciBmb3VyIGJpdHMgYXMgdGhlIG51bWJlciBvZgorCSAqIDQtYnl0ZSB3b3Jkcy4KKwkgKi8KKworCUlwSGVhZGVyTGVuZ3RoID0gKFRtcCAmIDB4ZikgKiA0OworCXBQYWNrZXRJbmZvLT5JcEhlYWRlckxlbmd0aCA9IElwSGVhZGVyTGVuZ3RoOworCisJLyogQ2hlY2sgdGhlIElQIGhlYWRlciBsZW5ndGguICovCisKKwkvKiAwNC1BdWctMTk5OCBzdyAtIFJlYWxseSBjaGVjayB0aGUgSUhMPyBOZWNlc3Nhcnk/ICovCisKKwlpZiAoSXBIZWFkZXJMZW5ndGggPCA1KjQpIHsKKwkJU0tfREJHX01TRyhwQWMsIFNLX0RCR01PRF9DU1VNLCBTS19EQkdDQVRfRVJSIHwgU0tfREJHQ0FUX1RYLAorCQkJKCJUeDogSW52YWxpZCBJUCBIZWFkZXIgTGVuZ3RoICV1LlxuIiwgSXBIZWFkZXJMZW5ndGgpKTsKKwkJcFBhY2tldEluZm8tPlByb3RvY29sRmxhZ3MgPSAwOworCQlwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdW1NLQ1NfUFJPVE9fU1RBVFNfSVBdLlR4VW5hYmxlQ3RzKys7CisJCXJldHVybjsKKwl9CisKKwkvKiBUaGlzIGlzIGFuIElQdjQgZnJhbWUgd2l0aCBhIGhlYWRlciBvZiB2YWxpZCBsZW5ndGguICovCisKKwlwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdW1NLQ1NfUFJPVE9fU1RBVFNfSVBdLlR4T2tDdHMrKzsKKworCS8qIENoZWNrIGlmIHdlIHNob3VsZCBjYWxjdWxhdGUgdGhlIElQIGhlYWRlciBjaGVja3N1bS4gKi8KKworCVByb3RvY29sRmxhZ3MgPSBwUGFja2V0SW5mby0+UHJvdG9jb2xGbGFnczsKKworCWlmIChQcm90b2NvbEZsYWdzICYgU0tDU19QUk9UT19JUCkgeworCQlwUGFja2V0SW5mby0+SXBIZWFkZXJDaGVja3N1bSA9CisJCQlTa0NzQ2FsY3VsYXRlQ2hlY2tzdW0ocElwSGVhZGVyLCBJcEhlYWRlckxlbmd0aCk7CisJfQorCisJLyogR2V0IHRoZSBuZXh0IGxldmVsIHByb3RvY29sIGlkZW50aWZpZXIuICovCisKKwlOZXh0TGV2ZWxQcm90b2NvbCA9CisJCSooU0tfVTggKikgU0tDU19JRFgocElwSGVhZGVyLCBTS0NTX09GU19JUF9ORVhUX0xFVkVMX1BST1RPQ09MKTsKKworCS8qCisJICogQ2hlY2sgaWYgdGhpcyBpcyBhIFRDUCBvciBVRFAgZnJhbWUgYW5kIGlmIHdlIHNob3VsZCBjYWxjdWxhdGUgdGhlCisJICogVENQL1VEUCBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtLgorCSAqCisJICogQWxzbyBjbGVhciBhbGwgcHJvdG9jb2wgYml0IGZsYWdzIG9mIHByb3RvY29scyBub3QgcHJlc2VudCBpbiB0aGUKKwkgKiBmcmFtZS4KKwkgKi8KKworCWlmICgoUHJvdG9jb2xGbGFncyAmIFNLQ1NfUFJPVE9fVENQKSAhPSAwICYmCisJCU5leHRMZXZlbFByb3RvY29sID09IFNLQ1NfUFJPVE9fSURfVENQKSB7CisJCS8qIFRDUC9JUCBmcmFtZS4gKi8KKwkJUHJvdG9jb2xGbGFncyAmPSBTS0NTX1BST1RPX1RDUCB8IFNLQ1NfUFJPVE9fSVA7CisJCU5leHRMZXZlbFByb3RvU3RhdHMgPQorCQkJJnBBYy0+Q3N1bS5Qcm90b1N0YXRzW05ldE51bWJlcl1bU0tDU19QUk9UT19TVEFUU19UQ1BdOworCX0KKwllbHNlIGlmICgoUHJvdG9jb2xGbGFncyAmIFNLQ1NfUFJPVE9fVURQKSAhPSAwICYmCisJCU5leHRMZXZlbFByb3RvY29sID09IFNLQ1NfUFJPVE9fSURfVURQKSB7CisJCS8qIFVEUC9JUCBmcmFtZS4gKi8KKwkJUHJvdG9jb2xGbGFncyAmPSBTS0NTX1BST1RPX1VEUCB8IFNLQ1NfUFJPVE9fSVA7CisJCU5leHRMZXZlbFByb3RvU3RhdHMgPQorCQkJJnBBYy0+Q3N1bS5Qcm90b1N0YXRzW05ldE51bWJlcl1bU0tDU19QUk9UT19TVEFUU19VRFBdOworCX0KKwllbHNlIHsKKwkJLyoKKwkJICogRWl0aGVyIG5vdCBhIFRDUCBvciBVRFAgZnJhbWUgYW5kL29yIFRDUC9VRFAgcHJvY2Vzc2luZyBub3QKKwkJICogc3BlY2lmaWVkLgorCQkgKi8KKwkJcFBhY2tldEluZm8tPlByb3RvY29sRmxhZ3MgPSBQcm90b2NvbEZsYWdzICYgU0tDU19QUk9UT19JUDsKKwkJcmV0dXJuOworCX0KKworCS8qIENoZWNrIGlmIHRoaXMgaXMgYW4gSVAgZnJhZ21lbnQuICovCisKKwkvKgorCSAqIE5vdGU6IEFuIElQIGZyYWdtZW50IGhhcyBhIG5vbi16ZXJvICJGcmFnbWVudCBPZmZzZXQiIGZpZWxkIGFuZC9vcgorCSAqIHRoZSAiTW9yZSBGcmFnbWVudHMiIGJpdCBzZXQuIFRodXMsIGlmIGJvdGggdGhlICJGcmFnbWVudCBPZmZzZXQiCisJICogYW5kIHRoZSAiTW9yZSBGcmFnbWVudHMiIGFyZSB6ZXJvLCBpdCBpcyAqbm90KiBhIGZyYWdtZW50LiBXZSBjYW4KKwkgKiBlYXNpbHkgY2hlY2sgYm90aCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIHRoZXkgYXJlIGluIHRoZSBzYW1lIDE2LWJpdAorCSAqIHdvcmQuCisJICovCisKKwlpZiAoKCooU0tfVTE2ICopCisJCVNLQ1NfSURYKHBJcEhlYWRlciwgU0tDU19PRlNfSVBfRkxBR1NfQU5EX0ZSQUdNRU5UX09GRlNFVCkgJgorCQl+U0tDU19JUF9ET05UX0ZSQUdNRU5UKSAhPSAwKSB7CisJCS8qIElQIGZyYWdtZW50OyBpZ25vcmUgYWxsIG90aGVyIHByb3RvY29scy4gKi8KKwkJcFBhY2tldEluZm8tPlByb3RvY29sRmxhZ3MgPSBQcm90b2NvbEZsYWdzICYgU0tDU19QUk9UT19JUDsKKwkJTmV4dExldmVsUHJvdG9TdGF0cy0+VHhVbmFibGVDdHMrKzsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBUQ1AvVURQIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0uCisJICovCisKKwkvKiBHZXQgdG90YWwgbGVuZ3RoIG9mIElQIGhlYWRlciBhbmQgZGF0YS4gKi8KKworCUlwRGF0YUxlbmd0aCA9CisJCSooU0tfVTE2ICopIFNLQ1NfSURYKHBJcEhlYWRlciwgU0tDU19PRlNfSVBfVE9UQUxfTEVOR1RIKTsKKworCS8qIEdldCBsZW5ndGggb2YgSVAgZGF0YSBwb3J0aW9uLiAqLworCisJSXBEYXRhTGVuZ3RoID0gU0tDU19OVE9IMTYoSXBEYXRhTGVuZ3RoKSAtIElwSGVhZGVyTGVuZ3RoOworCisJLyogQ2FsY3VsYXRlIHRoZSBzdW0gb2YgYWxsIHBzZXVkbyBoZWFkZXIgZmllbGRzICgxNi1iaXQpLiAqLworCisJUHNldWRvSGVhZGVyQ2hlY2tzdW0gPQorCQkodW5zaWduZWQgbG9uZykgKihTS19VMTYgKikgU0tDU19JRFgocElwSGVhZGVyLAorCQkJU0tDU19PRlNfSVBfU09VUkNFX0FERFJFU1MgKyAwKSArCisJCSh1bnNpZ25lZCBsb25nKSAqKFNLX1UxNiAqKSBTS0NTX0lEWChwSXBIZWFkZXIsCisJCQlTS0NTX09GU19JUF9TT1VSQ0VfQUREUkVTUyArIDIpICsKKwkJKHVuc2lnbmVkIGxvbmcpICooU0tfVTE2ICopIFNLQ1NfSURYKHBJcEhlYWRlciwKKwkJCVNLQ1NfT0ZTX0lQX0RFU1RJTkFUSU9OX0FERFJFU1MgKyAwKSArCisJCSh1bnNpZ25lZCBsb25nKSAqKFNLX1UxNiAqKSBTS0NTX0lEWChwSXBIZWFkZXIsCisJCQlTS0NTX09GU19JUF9ERVNUSU5BVElPTl9BRERSRVNTICsgMikgKworCQkodW5zaWduZWQgbG9uZykgU0tDU19IVE9OMTYoTmV4dExldmVsUHJvdG9jb2wpICsKKwkJKHVuc2lnbmVkIGxvbmcpIFNLQ1NfSFRPTjE2KElwRGF0YUxlbmd0aCk7CisJCisJLyogQWRkLWluIGFueSBjYXJyaWVzLiAqLworCisJU0tDU19PQ19BREQoUHNldWRvSGVhZGVyQ2hlY2tzdW0sIFBzZXVkb0hlYWRlckNoZWNrc3VtLCAwKTsKKworCS8qIEFkZC1pbiBhbnkgbmV3IGNhcnJ5LiAqLworCisJU0tDU19PQ19BREQocFBhY2tldEluZm8tPlBzZXVkb0hlYWRlckNoZWNrc3VtLCBQc2V1ZG9IZWFkZXJDaGVja3N1bSwgMCk7CisKKwlwUGFja2V0SW5mby0+UHJvdG9jb2xGbGFncyA9IFByb3RvY29sRmxhZ3M7CisJTmV4dExldmVsUHJvdG9TdGF0cy0+VHhPa0N0cysrOwkvKiBTdWNjZXNzLiAqLworfQkvKiBTa0NzR2V0U2VuZEluZm8gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tDc0dldFJlY2VpdmVJbmZvIC0gdmVyaWZ5IGNoZWNrc3VtIGluZm9ybWF0aW9uIGZvciBhIHJlY2VpdmVkIHBhY2tldAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVmVyaWZ5IGEgcmVjZWl2ZWQgZnJhbWUncyBjaGVja3N1bS4gVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBzdGF0dXMgY29kZQorICoJcmVmbGVjdGluZyB0aGUgcmVzdWx0IG9mIHRoZSB2ZXJpZmljYXRpb24uCisgKgorICogTm90ZToKKyAqCUJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24geW91IGhhdmUgdG8gdmVyaWZ5IHRoYXQgdGhlIGZyYW1lIGlzCisgKglub3QgcGFkZGVkIGFuZCBDaGVja3N1bTEgYW5kIENoZWNrc3VtMiBhcmUgYmlnZ2VyIHRoYW4gMS4KKyAqCisgKiBBcmd1bWVudHM6CisgKglwQWMgLSBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCBzdHJ1Y3QuCisgKgorICoJcElwSGVhZGVyIC0gUG9pbnRlciB0byBJUCBoZWFkZXIuIE11c3QgYmUgYXQgbGVhc3QgdGhlIGxlbmd0aCBpbiBieXRlcworICoJb2YgdGhlIHJlY2VpdmVkIElQIGhlYWRlciBpbmNsdWRpbmcgYW55IG9wdGlvbiBmaWVsZHMuIEZvciBVRFAgcGFja2V0cywKKyAqCTggYWRkaXRpb25hbCBieXRlcyBhcmUgbmVlZGVkIHRvIGFjY2VzcyB0aGUgVURQIGNoZWNrc3VtLgorICoKKyAqCU5vdGU6IFRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBJUCBoZWFkZXIgaXMgc3RvcmVkIGluIHRoZSBsb3dlciBmb3VyCisgKgliaXRzIG9mIHRoZSBmaXJzdCBvY3RldCBvZiB0aGUgSVAgaGVhZGVyIGFzIHRoZSBudW1iZXIgb2YgNC1ieXRlIHdvcmRzLAorICoJc28gaXQgbXVzdCBiZSBtdWx0aXBsaWVkIGJ5IGZvdXIgdG8gZ2V0IHRoZSBsZW5ndGggaW4gYnl0ZXMuIFRodXMsIHRoZQorICoJbWF4aW11bSBJUCBoZWFkZXIgbGVuZ3RoIGlzIDE1ICogNCA9IDYwIGJ5dGVzLgorICoKKyAqCUNoZWNrc3VtMSAtIFRoZSBmaXJzdCAxNi1iaXQgSW50ZXJuZXQgQ2hlY2tzdW0gY2FsY3VsYXRlZCBieSB0aGUKKyAqCWhhcmR3YXJlIHN0YXJ0aW5nIGF0IHRoZSBvZmZzZXQgcmV0dXJuZWQgYnkgU2tDc1NldFJlY2VpdmVGbGFncygpLgorICoKKyAqCUNoZWNrc3VtMiAtIFRoZSBzZWNvbmQgMTYtYml0IEludGVybmV0IENoZWNrc3VtIGNhbGN1bGF0ZWQgYnkgdGhlCisgKgloYXJkd2FyZSBzdGFydGluZyBhdCB0aGUgb2Zmc2V0IHJldHVybmVkIGJ5IFNrQ3NTZXRSZWNlaXZlRmxhZ3MoKS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tDU19TVEFUVVNfVU5LTk9XTl9JUF9WRVJTSU9OIC0gTm90IGFuIElQIHY0IGZyYW1lLgorICoJU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUiAtIElQIGNoZWNrc3VtIGVycm9yLgorICoJU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUl9UQ1AgLSBJUCBjaGVja3N1bSBlcnJvciBpbiBUQ1AgZnJhbWUuCisgKglTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SX1VEUCAtIElQIGNoZWNrc3VtIGVycm9yIGluIFVEUCBmcmFtZQorICoJU0tDU19TVEFUVVNfSVBfRlJBR01FTlQgLSBJUCBmcmFnbWVudCAoSVAgY2hlY2tzdW0gb2spLgorICoJU0tDU19TVEFUVVNfSVBfQ1NVTV9PSyAtIElQIGNoZWNrc3VtIG9rIChub3QgYSBUQ1Agb3IgVURQIGZyYW1lKS4KKyAqCVNLQ1NfU1RBVFVTX1RDUF9DU1VNX0VSUk9SIC0gVENQIGNoZWNrc3VtIGVycm9yIChJUCBjaGVja3N1bSBvaykuCisgKglTS0NTX1NUQVRVU19VRFBfQ1NVTV9FUlJPUiAtIFVEUCBjaGVja3N1bSBlcnJvciAoSVAgY2hlY2tzdW0gb2spLgorICoJU0tDU19TVEFUVVNfVENQX0NTVU1fT0sgLSBJUCBhbmQgVENQIGNoZWNrc3VtIG9rLgorICoJU0tDU19TVEFUVVNfVURQX0NTVU1fT0sgLSBJUCBhbmQgVURQIGNoZWNrc3VtIG9rLgorICoJU0tDU19TVEFUVVNfSVBfQ1NVTV9PS19OT19VRFAgLSBJUCBjaGVja3N1bSBPSyBhbmQgbm8gVURQIGNoZWNrc3VtLgorICoKKyAqCU5vdGU6IElmIFNLQ1NfT1ZFUldSSVRFX1NUQVRVUyBpcyBkZWZpbmVkLCB0aGUgU0tDU19TVEFUVVNfWFhYIHZhbHVlcworICoJcmV0dXJuZWQgaGVyZSBjYW4gYmUgZGVmaW5lZCBpbiBzb21lIGhlYWRlciBmaWxlIGJ5IHRoZSBtb2R1bGUgdXNpbmcgQ1NVTS4KKyAqCUluIHRoaXMgd2F5LCB0aGUgY2FsbGluZyBtb2R1bGUgY2FuIGFzc2lnbiByZXR1cm4gdmFsdWVzIGZvciBpdHMgb3duIG5lZWRzLAorICoJZS5nLiBieSBhc3NpZ25pbmcgYml0IGZsYWdzIHRvIHRoZSBpbmRpdmlkdWFsIHByb3RvY29scy4KKyAqLworU0tDU19TVEFUVVMgU2tDc0dldFJlY2VpdmVJbmZvKAorU0tfQUMJCSpwQWMsCQkvKiBBZGFwdGVyIGNvbnRleHQgc3RydWN0LiAqLwordm9pZAkJKnBJcEhlYWRlciwJLyogSVAgaGVhZGVyLiAqLwordW5zaWduZWQJQ2hlY2tzdW0xLAkvKiBIYXJkd2FyZSBjaGVja3N1bSAxLiAqLwordW5zaWduZWQJQ2hlY2tzdW0yLAkvKiBIYXJkd2FyZSBjaGVja3N1bSAyLiAqLworaW50CQkJTmV0TnVtYmVyKQkvKiBOZXQgbnVtYmVyICovCit7CisJLyogSW50ZXJuZXQgSGVhZGVyIFZlcnNpb24gZm91bmQgaW4gSVAgaGVhZGVyLiAqLworCXVuc2lnbmVkIEludGVybmV0SGVhZGVyVmVyc2lvbjsKKworCS8qIExlbmd0aCBvZiB0aGUgSVAgaGVhZGVyIGFzIGZvdW5kIGluIElQIGhlYWRlci4gKi8KKwl1bnNpZ25lZCBJcEhlYWRlckxlbmd0aDsKKworCS8qIExlbmd0aCBvZiBJUCBkYXRhIHBvcnRpb24uICovCisJdW5zaWduZWQgSXBEYXRhTGVuZ3RoOworCisJLyogSVAgaGVhZGVyIGNoZWNrc3VtLiAqLworCXVuc2lnbmVkIElwSGVhZGVyQ2hlY2tzdW07CisKKwkvKiBJUCBoZWFkZXIgb3B0aW9ucyBjaGVja3N1bSwgaWYgYW55LiAqLworCXVuc2lnbmVkIElwT3B0aW9uc0NoZWNrc3VtOworCisJLyogSVAgZGF0YSBjaGVja3N1bSwgaS5lLiBUQ1AvVURQIGNoZWNrc3VtLiAqLworCXVuc2lnbmVkIElwRGF0YUNoZWNrc3VtOworCisJLyogTmV4dCBsZXZlbCBwcm90b2NvbCBpZGVudGlmaWVyIGZvdW5kIGluIElQIGhlYWRlci4gKi8KKwl1bnNpZ25lZCBOZXh0TGV2ZWxQcm90b2NvbDsKKworCS8qIFRoZSBjaGVja3N1bSBvZiB0aGUgIm5leHQgbGV2ZWwgcHJvdG9jb2wiLCBpLmUuIFRDUCBvciBVRFAuICovCisJdW5zaWduZWQgbG9uZyBOZXh0TGV2ZWxQcm90b2NvbENoZWNrc3VtOworCisJLyogUG9pbnRlciB0byBuZXh0IGxldmVsIHByb3RvY29sIHN0YXRpc3RpY3Mgc3RydWN0dXJlLiAqLworCVNLQ1NfUFJPVE9fU1RBVFMgKk5leHRMZXZlbFByb3RvU3RhdHM7CisKKwkvKiBUZW1wb3JhcnkgdmFyaWFibGUuICovCisJdW5zaWduZWQgVG1wOworCisJVG1wID0gKihTS19VOCAqKQorCQlTS0NTX0lEWChwSXBIZWFkZXIsIFNLQ1NfT0ZTX0lQX0hFQURFUl9WRVJTSU9OX0FORF9MRU5HVEgpOworCisJLyogR2V0IHRoZSBJbnRlcm5ldCBIZWFkZXIgVmVyc2lvbiAoSUhWKS4gKi8KKwkvKiBOb3RlOiBUaGUgSUhWIGlzIHN0b3JlZCBpbiB0aGUgdXBwZXIgZm91ciBiaXRzLiAqLworCisJSW50ZXJuZXRIZWFkZXJWZXJzaW9uID0gVG1wID4+IDQ7CisKKwkvKiBDaGVjayB0aGUgSW50ZXJuZXQgSGVhZGVyIFZlcnNpb24uICovCisJLyogTm90ZTogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBJUCB2ZXJzaW9uIDQuICovCisKKwlpZiAoSW50ZXJuZXRIZWFkZXJWZXJzaW9uICE9IDQpIHsJLyogSVB2ND8gKi8KKwkJU0tfREJHX01TRyhwQWMsIFNLX0RCR01PRF9DU1VNLCBTS19EQkdDQVRfRVJSIHwgU0tfREJHQ0FUX1JYLAorCQkJKCJSeDogVW5rbm93biBJbnRlcm5ldCBIZWFkZXIgVmVyc2lvbiAldS5cbiIsCisJCQlJbnRlcm5ldEhlYWRlclZlcnNpb24pKTsKKwkJcEFjLT5Dc3VtLlByb3RvU3RhdHNbTmV0TnVtYmVyXVtTS0NTX1BST1RPX1NUQVRTX0lQXS5SeFVuYWJsZUN0cysrOworCQlyZXR1cm4gKFNLQ1NfU1RBVFVTX1VOS05PV05fSVBfVkVSU0lPTik7CisJfQorCisJLyogR2V0IHRoZSBJUCBoZWFkZXIgbGVuZ3RoIChJSEwpLiAqLworCS8qCisJICogTm90ZTogVGhlIElITCBpcyBzdG9yZWQgaW4gdGhlIGxvd2VyIGZvdXIgYml0cyBhcyB0aGUgbnVtYmVyIG9mCisJICogNC1ieXRlIHdvcmRzLgorCSAqLworCisJSXBIZWFkZXJMZW5ndGggPSAoVG1wICYgMHhmKSAqIDQ7CisKKwkvKiBDaGVjayB0aGUgSVAgaGVhZGVyIGxlbmd0aC4gKi8KKworCS8qIDA0LUF1Zy0xOTk4IHN3IC0gUmVhbGx5IGNoZWNrIHRoZSBJSEw/IE5lY2Vzc2FyeT8gKi8KKworCWlmIChJcEhlYWRlckxlbmd0aCA8IDUqNCkgeworCQlTS19EQkdfTVNHKHBBYywgU0tfREJHTU9EX0NTVU0sIFNLX0RCR0NBVF9FUlIgfCBTS19EQkdDQVRfUlgsCisJCQkoIlJ4OiBJbnZhbGlkIElQIEhlYWRlciBMZW5ndGggJXUuXG4iLCBJcEhlYWRlckxlbmd0aCkpOworCQlwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdW1NLQ1NfUFJPVE9fU1RBVFNfSVBdLlJ4RXJyQ3RzKys7CisJCXJldHVybiAoU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUik7CisJfQorCisJLyogVGhpcyBpcyBhbiBJUHY0IGZyYW1lIHdpdGggYSBoZWFkZXIgb2YgdmFsaWQgbGVuZ3RoLiAqLworCisJLyogR2V0IHRoZSBJUCBoZWFkZXIgYW5kIGRhdGEgY2hlY2tzdW0uICovCisKKwlJcERhdGFDaGVja3N1bSA9IENoZWNrc3VtMjsKKworCS8qCisJICogVGhlIElQIGhlYWRlciBjaGVja3N1bSBpcyBjYWxjdWxhdGVkIGFzIGZvbGxvd3M6CisJICoKKwkgKglJcEhlYWRlckNoZWNrc3VtID0gQ2hlY2tzdW0xIC0gQ2hlY2tzdW0yCisJICovCisKKwlTS0NTX09DX1NVQihJcEhlYWRlckNoZWNrc3VtLCBDaGVja3N1bTEsIENoZWNrc3VtMik7CisKKwkvKiBDaGVjayBpZiBhbnkgSVAgaGVhZGVyIG9wdGlvbnMuICovCisKKwlpZiAoSXBIZWFkZXJMZW5ndGggPiBTS0NTX0lQX0hFQURFUl9TSVpFKSB7CisKKwkJLyogR2V0IHRoZSBJUCBvcHRpb25zIGNoZWNrc3VtLiAqLworCisJCUlwT3B0aW9uc0NoZWNrc3VtID0gU2tDc0NhbGN1bGF0ZUNoZWNrc3VtKAorCQkJU0tDU19JRFgocElwSGVhZGVyLCBTS0NTX0lQX0hFQURFUl9TSVpFKSwKKwkJCUlwSGVhZGVyTGVuZ3RoIC0gU0tDU19JUF9IRUFERVJfU0laRSk7CisKKwkJLyogQWRqdXN0IHRoZSBJUCBoZWFkZXIgYW5kIElQIGRhdGEgY2hlY2tzdW1zLiAqLworCisJCVNLQ1NfT0NfQUREKElwSGVhZGVyQ2hlY2tzdW0sIElwSGVhZGVyQ2hlY2tzdW0sIElwT3B0aW9uc0NoZWNrc3VtKTsKKworCQlTS0NTX09DX1NVQihJcERhdGFDaGVja3N1bSwgSXBEYXRhQ2hlY2tzdW0sIElwT3B0aW9uc0NoZWNrc3VtKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBJUCBoZWFkZXIgY2hlY2tzdW0gaXMgb2suCisJICoKKwkgKiBOT1RFOiBXZSBtdXN0IGNoZWNrIHRoZSBJUCBoZWFkZXIgY2hlY2tzdW0gZXZlbiBpZiB0aGUgY2FsbGVyIGp1c3Qgd2FudHMKKwkgKiB1cyB0byBjaGVjayB1cHBlci1sYXllciBjaGVja3N1bXMsIGJlY2F1c2Ugd2UgY2Fubm90IGRvIGFueSBmdXJ0aGVyCisJICogcHJvY2Vzc2luZyBvZiB0aGUgcGFja2V0IHdpdGhvdXQgYSB2YWxpZCBJUCBjaGVja3N1bS4KKwkgKi8KKwkKKwkvKiBHZXQgdGhlIG5leHQgbGV2ZWwgcHJvdG9jb2wgaWRlbnRpZmllci4gKi8KKwkKKwlOZXh0TGV2ZWxQcm90b2NvbCA9ICooU0tfVTggKikKKwkJU0tDU19JRFgocElwSGVhZGVyLCBTS0NTX09GU19JUF9ORVhUX0xFVkVMX1BST1RPQ09MKTsKKworCWlmIChJcEhlYWRlckNoZWNrc3VtICE9IDB4ZmZmZikgeworCQlwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdW1NLQ1NfUFJPVE9fU1RBVFNfSVBdLlJ4RXJyQ3RzKys7CisJCS8qIHRoZSBORElTIHRlc3RlciB3YW50cyB0byBrbm93IHRoZSB1cHBlciBsZXZlbCBwcm90b2NvbCB0b28gKi8KKwkJaWYgKE5leHRMZXZlbFByb3RvY29sID09IFNLQ1NfUFJPVE9fSURfVENQKSB7CisJCQlyZXR1cm4oU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUl9UQ1ApOworCQl9CisJCWVsc2UgaWYgKE5leHRMZXZlbFByb3RvY29sID09IFNLQ1NfUFJPVE9fSURfVURQKSB7CisJCQlyZXR1cm4oU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUl9VRFApOworCQl9CisJCXJldHVybiAoU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUik7CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiB0aGlzIGlzIGEgVENQIG9yIFVEUCBmcmFtZSBhbmQgaWYgd2Ugc2hvdWxkIGNhbGN1bGF0ZSB0aGUKKwkgKiBUQ1AvVURQIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0uCisJICoKKwkgKiBBbHNvIGNsZWFyIGFsbCBwcm90b2NvbCBiaXQgZmxhZ3Mgb2YgcHJvdG9jb2xzIG5vdCBwcmVzZW50IGluIHRoZQorCSAqIGZyYW1lLgorCSAqLworCisJaWYgKChwQWMtPkNzdW0uUmVjZWl2ZUZsYWdzW05ldE51bWJlcl0gJiBTS0NTX1BST1RPX1RDUCkgIT0gMCAmJgorCQlOZXh0TGV2ZWxQcm90b2NvbCA9PSBTS0NTX1BST1RPX0lEX1RDUCkgeworCQkvKiBUQ1AvSVAgZnJhbWUuICovCisJCU5leHRMZXZlbFByb3RvU3RhdHMgPQorCQkJJnBBYy0+Q3N1bS5Qcm90b1N0YXRzW05ldE51bWJlcl1bU0tDU19QUk9UT19TVEFUU19UQ1BdOworCX0KKwllbHNlIGlmICgocEFjLT5Dc3VtLlJlY2VpdmVGbGFnc1tOZXROdW1iZXJdICYgU0tDU19QUk9UT19VRFApICE9IDAgJiYKKwkJTmV4dExldmVsUHJvdG9jb2wgPT0gU0tDU19QUk9UT19JRF9VRFApIHsKKwkJLyogVURQL0lQIGZyYW1lLiAqLworCQlOZXh0TGV2ZWxQcm90b1N0YXRzID0KKwkJCSZwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdW1NLQ1NfUFJPVE9fU1RBVFNfVURQXTsKKwl9CisJZWxzZSB7CisJCS8qCisJCSAqIEVpdGhlciBub3QgYSBUQ1Agb3IgVURQIGZyYW1lIGFuZC9vciBUQ1AvVURQIHByb2Nlc3Npbmcgbm90CisJCSAqIHNwZWNpZmllZC4KKwkJICovCisJCXJldHVybiAoU0tDU19TVEFUVVNfSVBfQ1NVTV9PSyk7CisJfQorCisJLyogQ2hlY2sgaWYgdGhpcyBpcyBhbiBJUCBmcmFnbWVudC4gKi8KKworCS8qCisJICogTm90ZTogQW4gSVAgZnJhZ21lbnQgaGFzIGEgbm9uLXplcm8gIkZyYWdtZW50IE9mZnNldCIgZmllbGQgYW5kL29yCisJICogdGhlICJNb3JlIEZyYWdtZW50cyIgYml0IHNldC4gVGh1cywgaWYgYm90aCB0aGUgIkZyYWdtZW50IE9mZnNldCIKKwkgKiBhbmQgdGhlICJNb3JlIEZyYWdtZW50cyIgYXJlIHplcm8sIGl0IGlzICpub3QqIGEgZnJhZ21lbnQuIFdlIGNhbgorCSAqIGVhc2lseSBjaGVjayBib3RoIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgdGhleSBhcmUgaW4gdGhlIHNhbWUgMTYtYml0CisJICogd29yZC4KKwkgKi8KKworCWlmICgoKihTS19VMTYgKikKKwkJU0tDU19JRFgocElwSGVhZGVyLCBTS0NTX09GU19JUF9GTEFHU19BTkRfRlJBR01FTlRfT0ZGU0VUKSAmCisJCX5TS0NTX0lQX0RPTlRfRlJBR01FTlQpICE9IDApIHsKKwkJLyogSVAgZnJhZ21lbnQ7IGlnbm9yZSBhbGwgb3RoZXIgcHJvdG9jb2xzLiAqLworCQlOZXh0TGV2ZWxQcm90b1N0YXRzLT5SeFVuYWJsZUN0cysrOworCQlyZXR1cm4gKFNLQ1NfU1RBVFVTX0lQX0ZSQUdNRU5UKTsKKwl9CisKKwkvKgorCSAqIDA4LU1heS0yMDAwIHJhCisJICoKKwkgKiBGcm9tIFJGQyA3NjggKFVEUCkKKwkgKiBJZiB0aGUgY29tcHV0ZWQgY2hlY2tzdW0gaXMgemVybywgaXQgaXMgdHJhbnNtaXR0ZWQgYXMgYWxsIG9uZXMgKHRoZQorCSAqIGVxdWl2YWxlbnQgaW4gb25lJ3MgY29tcGxlbWVudCBhcml0aG1ldGljKS4gIEFuIGFsbCB6ZXJvIHRyYW5zbWl0dGVkCisJICogY2hlY2tzdW0gdmFsdWUgbWVhbnMgdGhhdCB0aGUgdHJhbnNtaXR0ZXIgZ2VuZXJhdGVkIG5vIGNoZWNrc3VtIChmb3IKKwkgKiBkZWJ1Z2dpbmcgb3IgZm9yIGhpZ2hlciBsZXZlbCBwcm90b2NvbHMgdGhhdCBkb24ndCBjYXJlKS4KKwkgKi8KKworCWlmIChOZXh0TGV2ZWxQcm90b2NvbCA9PSBTS0NTX1BST1RPX0lEX1VEUCAmJgorCQkqKFNLX1UxNiopU0tDU19JRFgocElwSGVhZGVyLCBJcEhlYWRlckxlbmd0aCArIDYpID09IDB4MDAwMCkgeworCisJCU5leHRMZXZlbFByb3RvU3RhdHMtPlJ4T2tDdHMrKzsKKwkJCisJCXJldHVybiAoU0tDU19TVEFUVVNfSVBfQ1NVTV9PS19OT19VRFApOworCX0KKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBUQ1AvVURQIGNoZWNrc3VtLgorCSAqLworCisJLyogR2V0IHRvdGFsIGxlbmd0aCBvZiBJUCBoZWFkZXIgYW5kIGRhdGEuICovCisKKwlJcERhdGFMZW5ndGggPQorCQkqKFNLX1UxNiAqKSBTS0NTX0lEWChwSXBIZWFkZXIsIFNLQ1NfT0ZTX0lQX1RPVEFMX0xFTkdUSCk7CisKKwkvKiBHZXQgbGVuZ3RoIG9mIElQIGRhdGEgcG9ydGlvbi4gKi8KKworCUlwRGF0YUxlbmd0aCA9IFNLQ1NfTlRPSDE2KElwRGF0YUxlbmd0aCkgLSBJcEhlYWRlckxlbmd0aDsKKworCU5leHRMZXZlbFByb3RvY29sQ2hlY2tzdW0gPQorCisJCS8qIENhbGN1bGF0ZSB0aGUgcHNldWRvIGhlYWRlciBjaGVja3N1bS4gKi8KKworCQkodW5zaWduZWQgbG9uZykgKihTS19VMTYgKikgU0tDU19JRFgocElwSGVhZGVyLAorCQkJU0tDU19PRlNfSVBfU09VUkNFX0FERFJFU1MgKyAwKSArCisJCSh1bnNpZ25lZCBsb25nKSAqKFNLX1UxNiAqKSBTS0NTX0lEWChwSXBIZWFkZXIsCisJCQlTS0NTX09GU19JUF9TT1VSQ0VfQUREUkVTUyArIDIpICsKKwkJKHVuc2lnbmVkIGxvbmcpICooU0tfVTE2ICopIFNLQ1NfSURYKHBJcEhlYWRlciwKKwkJCVNLQ1NfT0ZTX0lQX0RFU1RJTkFUSU9OX0FERFJFU1MgKyAwKSArCisJCSh1bnNpZ25lZCBsb25nKSAqKFNLX1UxNiAqKSBTS0NTX0lEWChwSXBIZWFkZXIsCisJCQlTS0NTX09GU19JUF9ERVNUSU5BVElPTl9BRERSRVNTICsgMikgKworCQkodW5zaWduZWQgbG9uZykgU0tDU19IVE9OMTYoTmV4dExldmVsUHJvdG9jb2wpICsKKwkJKHVuc2lnbmVkIGxvbmcpIFNLQ1NfSFRPTjE2KElwRGF0YUxlbmd0aCkgKworCisJCS8qIEFkZCB0aGUgVENQL1VEUCBoZWFkZXIgY2hlY2tzdW0uICovCisKKwkJKHVuc2lnbmVkIGxvbmcpIElwRGF0YUNoZWNrc3VtOworCisJLyogQWRkLWluIGFueSBjYXJyaWVzLiAqLworCisJU0tDU19PQ19BREQoTmV4dExldmVsUHJvdG9jb2xDaGVja3N1bSwgTmV4dExldmVsUHJvdG9jb2xDaGVja3N1bSwgMCk7CisKKwkvKiBBZGQtaW4gYW55IG5ldyBjYXJyeS4gKi8KKworCVNLQ1NfT0NfQUREKE5leHRMZXZlbFByb3RvY29sQ2hlY2tzdW0sIE5leHRMZXZlbFByb3RvY29sQ2hlY2tzdW0sIDApOworCisJLyogQ2hlY2sgaWYgdGhlIFRDUC9VRFAgY2hlY2tzdW0gaXMgb2suICovCisKKwlpZiAoKHVuc2lnbmVkKSBOZXh0TGV2ZWxQcm90b2NvbENoZWNrc3VtID09IDB4ZmZmZikgeworCisJCS8qIFRDUC9VRFAgY2hlY2tzdW0gb2suICovCisKKwkJTmV4dExldmVsUHJvdG9TdGF0cy0+UnhPa0N0cysrOworCisJCXJldHVybiAoTmV4dExldmVsUHJvdG9jb2wgPT0gU0tDU19QUk9UT19JRF9UQ1AgPworCQkJU0tDU19TVEFUVVNfVENQX0NTVU1fT0sgOiBTS0NTX1NUQVRVU19VRFBfQ1NVTV9PSyk7CisJfQorCQorCS8qIFRDUC9VRFAgY2hlY2tzdW0gZXJyb3IuICovCisKKwlOZXh0TGV2ZWxQcm90b1N0YXRzLT5SeEVyckN0cysrOworCisJcmV0dXJuIChOZXh0TGV2ZWxQcm90b2NvbCA9PSBTS0NTX1BST1RPX0lEX1RDUCA/CisJCVNLQ1NfU1RBVFVTX1RDUF9DU1VNX0VSUk9SIDogU0tDU19TVEFUVVNfVURQX0NTVU1fRVJST1IpOworfQkvKiBTa0NzR2V0UmVjZWl2ZUluZm8gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tDc1NldFJlY2VpdmVGbGFncyAtIHNldCBjaGVja3N1bSByZWNlaXZlIGZsYWdzCisgKgorICogRGVzY3JpcHRpb246CisgKglVc2UgdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIHZhcmlvdXMgcmVjZWl2ZSBmbGFncy4gQWNjb3JkaW5nIHRvIHRoZQorICoJcHJvdG9jb2wgZmxhZ3Mgc2V0IGJ5IHRoZSBjYWxsZXIsIHRoZSBzdGFydCBvZmZzZXRzIHdpdGhpbiByZWNlaXZlZAorICoJcGFja2V0cyBvZiB0aGUgdHdvIGhhcmR3YXJlIGNoZWNrc3VtcyBhcmUgcmV0dXJuZWQuIFRoZXNlIG9mZnNldHMgbXVzdAorICoJYmUgc3RvcmVkIGluIGFsbCByZWNlaXZlIGRlc2NyaXB0b3JzLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCXBBYyAtIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0IHN0cnVjdC4KKyAqCisgKglSZWNlaXZlRmxhZ3MgLSBBbnkgY29tYmluYXRpb24gb2YgU0tfUFJPVE9fWFhYIGZsYWdzIG9mIHRoZSBwcm90b2NvbHMKKyAqCWZvciB3aGljaCB0aGUgY2FsbGVyIHdhbnRzIGNoZWNrc3VtIGluZm9ybWF0aW9uIG9uIHJlY2VpdmVkIGZyYW1lcy4KKyAqCisgKglwQ2hlY2tzdW0xT2Zmc2V0IC0gVGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgZmlyc3QgcmVjZWl2ZSBkZXNjcmlwdG9yCisgKgloYXJkd2FyZSBjaGVja3N1bSB0byBiZSBjYWxjdWxhdGVkIGZvciByZWNlaXZlZCBmcmFtZXMgaXMgcmV0dXJuZWQKKyAqCWhlcmUuCisgKgorICoJcENoZWNrc3VtMk9mZnNldCAtIFRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHNlY29uZCByZWNlaXZlIGRlc2NyaXB0b3IKKyAqCWhhcmR3YXJlIGNoZWNrc3VtIHRvIGJlIGNhbGN1bGF0ZWQgZm9yIHJlY2VpdmVkIGZyYW1lcyBpcyByZXR1cm5lZAorICoJaGVyZS4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqCVJldHVybnMgdGhlIHR3byBoYXJkd2FyZSBjaGVja3N1bSBzdGFydCBvZmZzZXRzLgorICovCit2b2lkIFNrQ3NTZXRSZWNlaXZlRmxhZ3MoCitTS19BQwkJKnBBYywJCQkJLyogQWRhcHRlciBjb250ZXh0IHN0cnVjdC4gKi8KK3Vuc2lnbmVkCVJlY2VpdmVGbGFncywJCS8qIE5ldyByZWNlaXZlIGZsYWdzLiAqLwordW5zaWduZWQJKnBDaGVja3N1bTFPZmZzZXQsCS8qIE9mZnNldCBmb3IgaGFyZHdhcmUgY2hlY2tzdW0gMS4gKi8KK3Vuc2lnbmVkCSpwQ2hlY2tzdW0yT2Zmc2V0LAkvKiBPZmZzZXQgZm9yIGhhcmR3YXJlIGNoZWNrc3VtIDIuICovCitpbnQJCQlOZXROdW1iZXIpCit7CisJLyogU2F2ZSB0aGUgcmVjZWl2ZSBmbGFncy4gKi8KKworCXBBYy0+Q3N1bS5SZWNlaXZlRmxhZ3NbTmV0TnVtYmVyXSA9IFJlY2VpdmVGbGFnczsKKworCS8qIEZpcnN0IGNoZWNrc3VtIHN0YXJ0IG9mZnNldCBpcyB0aGUgSVAgaGVhZGVyLiAqLworCSpwQ2hlY2tzdW0xT2Zmc2V0ID0gU0tDU19NQUNfSEVBREVSX1NJWkU7CisKKwkvKgorCSAqIFNlY29uZCBjaGVja3N1bSBzdGFydCBvZmZzZXQgaXMgdGhlIElQIGRhdGEuIE5vdGUgdGhhdCB0aGlzIG1heSB2YXJ5CisJICogaWYgdGhlcmUgYXJlIGFueSBJUCBoZWFkZXIgb3B0aW9ucyBpbiB0aGUgYWN0dWFsIHBhY2tldC4KKwkgKi8KKwkqcENoZWNrc3VtMk9mZnNldCA9IFNLQ1NfTUFDX0hFQURFUl9TSVpFICsgU0tDU19JUF9IRUFERVJfU0laRTsKK30JLyogU2tDc1NldFJlY2VpdmVGbGFncyAqLworCisjaWZuZGVmIFNLX0NTX0NBTENVTEFURV9DSEVDS1NVTQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tDc0NhbGN1bGF0ZUNoZWNrc3VtIC0gY2FsY3VsYXRlIGNoZWNrc3VtIGZvciBzcGVjaWZpZWQgZGF0YQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQ2FsY3VsYXRlIGFuZCByZXR1cm4gdGhlIDE2LWJpdCBJbnRlcm5ldCBDaGVja3N1bSBmb3IgdGhlIHNwZWNpZmllZAorICoJZGF0YS4KKyAqCisgKiBBcmd1bWVudHM6CisgKglwRGF0YSAtIFBvaW50ZXIgdG8gZGF0YSBmb3Igd2hpY2ggdGhlIGNoZWNrc3VtIHNoYWxsIGJlIGNhbGN1bGF0ZWQuCisgKglOb3RlOiBUaGUgcG9pbnRlciBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDE2LWJpdCBib3VuZGFyeS4KKyAqCisgKglMZW5ndGggLSBMZW5ndGggaW4gYnl0ZXMgb2YgZGF0YSB0byBjaGVja3N1bS4KKyAqCisgKiBSZXR1cm5zOgorICoJVGhlIDE2LWJpdCBJbnRlcm5ldCBDaGVja3N1bSBmb3IgdGhlIHNwZWNpZmllZCBkYXRhLgorICoKKyAqCU5vdGU6IFRoZSBjaGVja3N1bSBpcyBjYWxjdWxhdGVkIGluIHRoZSBtYWNoaW5lJ3MgbmF0dXJhbCBieXRlIG9yZGVyLAorICoJaS5lLiBsaXR0bGUgdnMuIGJpZyBlbmRpYW4uIFRodXMsIHRoZSByZXN1bHRpbmcgY2hlY2tzdW0gaXMgZGlmZmVyZW50CisgKglmb3IgdGhlIHNhbWUgaW5wdXQgZGF0YSBvbiBsaXR0bGUgYW5kIGJpZyBlbmRpYW4gbWFjaGluZXMuCisgKgorICoJSG93ZXZlciwgd2hlbiB3cml0dGVuIGJhY2sgdG8gdGhlIG5ldHdvcmsgcGFja2V0LCB0aGUgYnl0ZSBvcmRlciBpcworICoJYWx3YXlzIGluIGNvcnJlY3QgbmV0d29yayBvcmRlci4KKyAqLwordW5zaWduZWQgU2tDc0NhbGN1bGF0ZUNoZWNrc3VtKAordm9pZAkJKnBEYXRhLAkJLyogRGF0YSB0byBjaGVja3N1bS4gKi8KK3Vuc2lnbmVkCUxlbmd0aCkJCS8qIExlbmd0aCBvZiBkYXRhLiAqLworeworCVNLX1UxNiAqcFUxNjsJCS8qIFBvaW50ZXIgdG8gdGhlIGRhdGEgYXMgMTYtYml0IHdvcmRzLiAqLworCXVuc2lnbmVkIGxvbmcgQ2hlY2tzdW07CS8qIENoZWNrc3VtOyBtdXN0IGJlIGF0IGxlYXN0IDMyIGJpdHMuICovCisKKwkvKiBTdW0gdXAgYWxsIDE2LWJpdCB3b3Jkcy4gKi8KKworCXBVMTYgPSAoU0tfVTE2ICopIHBEYXRhOworCWZvciAoQ2hlY2tzdW0gPSAwOyBMZW5ndGggPiAxOyBMZW5ndGggLT0gMikgeworCQlDaGVja3N1bSArPSAqcFUxNisrOworCX0KKworCS8qIElmIHRoaXMgaXMgYW4gb2RkIG51bWJlciBvZiBieXRlcywgYWRkLWluIHRoZSBsYXN0IGJ5dGUuICovCisKKwlpZiAoTGVuZ3RoID4gMCkgeworI2lmZGVmIFNLX0JJR19FTkRJQU4KKwkJLyogQWRkIHRoZSBsYXN0IGJ5dGUgYXMgdGhlIGhpZ2ggYnl0ZS4gKi8KKwkJQ2hlY2tzdW0gKz0gKCh1bnNpZ25lZCkgKihTS19VOCAqKSBwVTE2KSA8PCA4OworI2Vsc2UJLyogIVNLX0JJR19FTkRJQU4gKi8KKwkJLyogQWRkIHRoZSBsYXN0IGJ5dGUgYXMgdGhlIGxvdyBieXRlLiAqLworCQlDaGVja3N1bSArPSAqKFNLX1U4ICopIHBVMTY7CisjZW5kaWYJLyogIVNLX0JJR19FTkRJQU4gKi8KKwl9CisKKwkvKiBBZGQtaW4gYW55IGNhcnJpZXMuICovCisKKwlTS0NTX09DX0FERChDaGVja3N1bSwgQ2hlY2tzdW0sIDApOworCisJLyogQWRkLWluIGFueSBuZXcgY2FycnkuICovCisKKwlTS0NTX09DX0FERChDaGVja3N1bSwgQ2hlY2tzdW0sIDApOworCisJLyogTm90ZTogQWxsIGJpdHMgYmV5b25kIHRoZSAxNi1iaXQgbGltaXQgYXJlIG5vdyB6ZXJvLiAqLworCisJcmV0dXJuICgodW5zaWduZWQpIENoZWNrc3VtKTsKK30JLyogU2tDc0NhbGN1bGF0ZUNoZWNrc3VtICovCisKKyNlbmRpZiAvKiBTS19DU19DQUxDVUxBVEVfQ0hFQ0tTVU0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQ3NFdmVudCAtIHRoZSBDU1VNIGV2ZW50IGRpc3BhdGNoZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgaXMgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBDU1VNIG1vZHVsZS4KKyAqCisgKiBBcmd1bWVudHM6CisgKglwQWMgLSBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dC4KKyAqCisgKglJb2MgLSBJL08gY29udGV4dC4KKyAqCisgKglFdmVudCAtCSBFdmVudCBpZC4KKyAqCisgKglQYXJhbSAtIEV2ZW50IGRlcGVuZGVudCBwYXJhbWV0ZXIuCisgKgorICogUmV0dXJuczoKKyAqCVRoZSAxNi1iaXQgSW50ZXJuZXQgQ2hlY2tzdW0gZm9yIHRoZSBzcGVjaWZpZWQgZGF0YS4KKyAqCisgKglOb3RlOiBUaGUgY2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBpbiB0aGUgbWFjaGluZSdzIG5hdHVyYWwgYnl0ZSBvcmRlciwKKyAqCWkuZS4gbGl0dGxlIHZzLiBiaWcgZW5kaWFuLiBUaHVzLCB0aGUgcmVzdWx0aW5nIGNoZWNrc3VtIGlzIGRpZmZlcmVudAorICoJZm9yIHRoZSBzYW1lIGlucHV0IGRhdGEgb24gbGl0dGxlIGFuZCBiaWcgZW5kaWFuIG1hY2hpbmVzLgorICoKKyAqCUhvd2V2ZXIsIHdoZW4gd3JpdHRlbiBiYWNrIHRvIHRoZSBuZXR3b3JrIHBhY2tldCwgdGhlIGJ5dGUgb3JkZXIgaXMKKyAqCWFsd2F5cyBpbiBjb3JyZWN0IG5ldHdvcmsgb3JkZXIuCisgKi8KK2ludCBTa0NzRXZlbnQoCitTS19BQwkJKnBBYywJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQuICovCitTS19JT0MJCUlvYywJLyogSS9PIGNvbnRleHQuICovCitTS19VMzIJCUV2ZW50LAkvKiBFdmVudCBpZC4gKi8KK1NLX0VWUEFSQQlQYXJhbSkJLyogRXZlbnQgZGVwZW5kZW50IHBhcmFtZXRlci4gKi8KK3sKKwlpbnQgUHJvdG9JbmRleDsKKwlpbnQJTmV0TnVtYmVyOworCisJc3dpdGNoIChFdmVudCkgeworCS8qCisJICogQ2xlYXIgcHJvdG9jb2wgc3RhdGlzdGljcy4KKwkgKgorCSAqIFBhcmFtIC0gUHJvdG9jb2wgaW5kZXgsIG9yIC0xIGZvciBhbGwgcHJvdG9jb2xzLgorCSAqCQkgLSBOZXQgbnVtYmVyLgorCSAqLworCWNhc2UgU0tfQ1NVTV9FVkVOVF9DTEVBUl9QUk9UT19TVEFUUzoKKworCQlQcm90b0luZGV4ID0gKGludClQYXJhbS5QYXJhMzJbMV07CisJCU5ldE51bWJlciA9IChpbnQpUGFyYW0uUGFyYTMyWzBdOworCQlpZiAoUHJvdG9JbmRleCA8IDApIHsJLyogQ2xlYXIgZm9yIGFsbCBwcm90b2NvbHMuICovCisJCQlpZiAoTmV0TnVtYmVyID49IDApIHsKKwkJCQlTS19NRU1TRVQoJnBBYy0+Q3N1bS5Qcm90b1N0YXRzW05ldE51bWJlcl1bMF0sIDAsCisJCQkJCXNpemVvZihwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdKSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CQkJCQkvKiBDbGVhciBmb3IgaW5kaXZpZHVhbCBwcm90b2NvbC4gKi8KKwkJCVNLX01FTVNFVCgmcEFjLT5Dc3VtLlByb3RvU3RhdHNbTmV0TnVtYmVyXVtQcm90b0luZGV4XSwgMCwKKwkJCQlzaXplb2YocEFjLT5Dc3VtLlByb3RvU3RhdHNbTmV0TnVtYmVyXVtQcm90b0luZGV4XSkpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKDApOwkvKiBTdWNjZXNzLiAqLworfQkvKiBTa0NzRXZlbnQgKi8KKworI2VuZGlmCS8qIFNLX1VTRV9DU1VNICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZGltLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZGltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkZGY2MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tkaW0uYwpAQCAtMCwwICsxLDc0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZGltLmMKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS41ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzExLzI4IDEyOjU1OjQwICQKKyAqIFB1cnBvc2U6CUFsbCBmdW5jdGlvbnMgdG8gbWFpbnRhaW4gaW50ZXJydXB0IG1vZGVyYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVGhpcyBtb2R1bGUgaXMgaW50ZW5kZWQgdG8gbWFuYWdlIHRoZSBkeW5hbWljIGludGVycnVwdCBtb2RlcmF0aW9uIG9uIGJvdGggICAKKyAqIEdFbmVzaXMgYW5kIFl1a29uIGFkYXB0ZXJzLgorICoKKyAqIEluY2x1ZGUgRmlsZSBIaWVyYXJjaHk6CisgKgorICoJInNrZHJ2MXN0LmgiCisgKgkic2tkcnYybmQuaCIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCWxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIFN5c0tvbm5lY3RGaWxlSWRbXSA9CisJIkAoIykgJElkOiBza2RpbS5jLHYgMS41IDIwMDMvMTEvMjggMTI6NTU6NDAgcnJvZXNsZXIgRXhwICQgKEMpIFN5c0tvbm5lY3QuIjsKKyNlbmRpZgorCisjZGVmaW5lIF9fU0tBRERSX0MKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjZXJyb3IgQysrIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBJbmNsdWRlcworKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNfU0tEUlYxU1RfSAorI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIKKyNlbmRpZgorCisjaWZuZGVmIF9fSU5DX1NLRFJWMk5EX0gKKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCisjZW5kaWYKKworI2luY2x1ZGUJPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRGVmaW5lcworKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogVHlwZWRlZnMKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBHZXRDdXJyZW50U3lzdGVtTG9hZChTS19BQyAqcEFDKTsKK3N0YXRpYyBTS19VNjQgICAgICAgR2V0SXNyQ2FsbHMoU0tfQUMgKnBBQyk7CitzdGF0aWMgU0tfQk9PTCAgICAgIElzSW50TW9kRW5hYmxlZChTS19BQyAqcEFDKTsKK3N0YXRpYyB2b2lkICAgICAgICAgU2V0Q3VyckludEN0cihTS19BQyAqcEFDKTsKK3N0YXRpYyB2b2lkICAgICAgICAgRW5hYmxlSW50TW9kKFNLX0FDICpwQUMpOyAKK3N0YXRpYyB2b2lkICAgICAgICAgRGlzYWJsZUludE1vZChTS19BQyAqcEFDKTsKK3N0YXRpYyB2b2lkICAgICAgICAgUmVzaXplRGltVGltZXJEdXJhdGlvbihTS19BQyAqcEFDKTsKK3N0YXRpYyB2b2lkICAgICAgICAgRGlzcGxheVNlbGVjdGVkTW9kZXJhdGlvblR5cGUoU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZCAgICAgICAgIERpc3BsYXlTZWxlY3RlZE1vZGVyYXRpb25NYXNrKFNLX0FDICpwQUMpOworc3RhdGljIHZvaWQgICAgICAgICBEaXNwbGF5RGVzY3JSYXRpbyhTS19BQyAqcEFDKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBHbG9iYWwgdmFyaWFibGVzCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBMb2NhbCB2YXJpYWJsZXMKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEdsb2JhbCBmdW5jdGlvbnMgCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IFNrRGltTW9kZXJhdGUKKyoqIERlc2NyaXB0aW9uICA6IENhbGxlZCBpbiBldmVyeSBJU1IgdG8gY2hlY2sgaWYgbW9kZXJhdGlvbiBpcyB0byBiZSBhcHBsaWVkCisqKiAgICAgICAgICAgICAgICBvciBub3QgZm9yIHRoZSBjdXJyZW50IG51bWJlciBvZiBpbnRlcnJ1cHRzCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMi1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IHZvaWQgKCEpCisqKiBOb3RlcyAgICAgICAgOiAtCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIAorU2tEaW1Nb2RlcmF0ZShTS19BQyAqcEFDKSB7CisgICAgdW5zaWduZWQgaW50IEN1cnJTeXNMb2FkICAgID0gMDsgIC8qIGV4cHJlc3NlZCBpbiBwZXJjZW50ICovCisgICAgdW5zaWduZWQgaW50IExvYWRJbmNyZWFzZSAgID0gMDsgIC8qIGV4cHJlc3NlZCBpbiBwZXJjZW50ICovCisgICAgU0tfVTY0ICAgICAgIFRocmVzaG9sZEludHMgID0gMDsKKyAgICBTS19VNjQgICAgICAgSXNyQ2FsbHNQZXJTZWMgPSAwOworCisjZGVmaW5lIE1fRElNSU5GTyBwQUMtPkR5bklycU1vZEluZm8KKworICAgIGlmICghSXNJbnRNb2RFbmFibGVkKHBBQykpIHsKKyAgICAgICAgaWYgKE1fRElNSU5GTy5JbnRNb2RUeXBlU2VsZWN0ID09IENfSU5UX01PRF9EWU5BTUlDKSB7CisgICAgICAgICAgICBDdXJyU3lzTG9hZCA9IEdldEN1cnJlbnRTeXN0ZW1Mb2FkKHBBQyk7CisgICAgICAgICAgICBpZiAoQ3VyclN5c0xvYWQgPiA3NSkgeworICAgICAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgICAgKiogTW9yZSB0aGFuIDc1JSB0b3RhbCBzeXN0ZW0gbG9hZCEgRW5hYmxlIHRoZSBtb2RlcmF0aW9uIAorICAgICAgICAgICAgICAgICAgICAqKiB0byBzaGllbGQgdGhlIHN5c3RlbSBhZ2FpbnN0IHRvbyBtYW55IGludGVycnVwdHMuCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIEVuYWJsZUludE1vZChwQUMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChDdXJyU3lzTG9hZCA+IE1fRElNSU5GTy5QcmV2U3lzTG9hZCkgeworICAgICAgICAgICAgICAgIExvYWRJbmNyZWFzZSA9IChDdXJyU3lzTG9hZCAtIE1fRElNSU5GTy5QcmV2U3lzTG9hZCk7CisgICAgICAgICAgICAgICAgaWYgKExvYWRJbmNyZWFzZSA+ICgoTV9ESU1JTkZPLlByZXZTeXNMb2FkICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ19JTlRfTU9EX0VOQUJMRV9QRVJDRU5UQUdFKSAvIDEwMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEN1cnJTeXNMb2FkID4gMTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIAorICAgICAgICAgICAgICAgICAgICAgICAgKiogTW9yZSB0aGFuIDUwJSBpbmNyZWFzZSB3aXRoIHJlc3BlY3QgdG8gdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgKiogcHJldmlvdXMgbG9hZCBvZiB0aGUgc3lzdGVtLiBNb3N0IGxpa2VseSB0aGlzIAorICAgICAgICAgICAgICAgICAgICAgICAgKiogaXMgZHVlIHRvIG91ciBJU1ItcHJvYy4uLgorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZUludE1vZChwQUMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICoqIE5laXRoZXIgdG9vIG11Y2ggc3lzdGVtIGxvYWQgYXQgYWxsIG5vciB0b28gbXVjaCBpbmNyZWFzZQorICAgICAgICAgICAgICAgICoqIHdpdGggcmVzcGVjdCB0byB0aGUgcHJldmlvdXMgc3lzdGVtIGxvYWQuIEhlbmNlLCB3ZSBjYW4gbGVhdmUKKyAgICAgICAgICAgICAgICAqKiB0aGUgSVNSLWhhbmRsaW5nIGxpa2UgaXQgaXMgd2l0aG91dCBlbmFibGluZyBtb2RlcmF0aW9uLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBNX0RJTUlORk8uUHJldlN5c0xvYWQgPSBDdXJyU3lzTG9hZDsKKyAgICAgICAgfSAgIAorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChNX0RJTUlORk8uSW50TW9kVHlwZVNlbGVjdCA9PSBDX0lOVF9NT0RfRFlOQU1JQykgeworICAgICAgICAgICAgVGhyZXNob2xkSW50cyAgPSAoKE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ19JTlRfTU9EX0RJU0FCTEVfUEVSQ0VOVEFHRSkgLyAxMDApOworICAgICAgICAgICAgSXNyQ2FsbHNQZXJTZWMgPSBHZXRJc3JDYWxscyhwQUMpOworICAgICAgICAgICAgaWYgKElzckNhbGxzUGVyU2VjIDw9IFRocmVzaG9sZEludHMpIHsKKyAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAqKiBUaGUgbnVtYmVyIG9mIGludGVycnVwdHMgd2l0aGluIHRoZSBsYXN0IHNlY29uZCBpcyAKKyAgICAgICAgICAgICAgICAqKiBsb3dlciB0aGFuIHRoZSBkaXNhYmxlX3BlcmNlbnRhZ2Ugb2YgdGhlIGRlc3JpZWQgCisgICAgICAgICAgICAgICAgKiogbWF4cmF0ZS4gVGhlcmVmb3JlIHdlIGNhbiBkaXNhYmxlIHRoZSBtb2RlcmF0aW9uLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgRGlzYWJsZUludE1vZChwQUMpOworICAgICAgICAgICAgICAgIE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjID0gCisgICAgICAgICAgICAgICAgICAgKE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjVXBwZXJMaW1pdCArCisgICAgICAgICAgICAgICAgICAgIE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjTG93ZXJMaW1pdCkgLyAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICoqIFRoZSBudW1iZXIgb2YgaW50ZXJydXB0cyBwZXIgc2VjIGlzIHRoZSBzYW1lIGFzIGV4cGVjdGVkLgorICAgICAgICAgICAgICAgICoqIEV2YWx1bGF0ZSB0aGUgZGVzY3JpcHRvci1yYXRpby4gSWYgaXQgaGFzIGNoYW5nZWQsIGEgcmVzaXplIAorICAgICAgICAgICAgICAgICoqIGluIHRoZSBtb2RlcmF0aW9uIHRpbWVyIG1pZ2h0IGJlIHVzZWZ1bGwKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChNX0RJTUlORk8uQXV0b1NpemluZykgeworICAgICAgICAgICAgICAgICAgICBSZXNpemVEaW1UaW1lckR1cmF0aW9uKHBBQyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAqKiBTb21lIGluZm9ybWF0aW9uIHRvIHRoZSBsb2cuLi4KKyAgICAqLworICAgIGlmIChNX0RJTUlORk8uRGlzcGxheVN0YXRzKSB7CisgICAgICAgIERpc3BsYXlTZWxlY3RlZE1vZGVyYXRpb25UeXBlKHBBQyk7CisgICAgICAgIERpc3BsYXlTZWxlY3RlZE1vZGVyYXRpb25NYXNrKHBBQyk7CisgICAgICAgIERpc3BsYXlEZXNjclJhdGlvKHBBQyk7CisgICAgfQorCisgICAgTV9ESU1JTkZPLk5iclByb2Nlc3NlZERlc2NyID0gMDsgCisgICAgU2V0Q3VyckludEN0cihwQUMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogU2tEaW1TdGFydE1vZGVyYXRpb25UaW1lcgorKiogRGVzY3JpcHRpb24gIDogU3RhcnRzIHRoZSBhdWRpdC10aW1lciBmb3IgdGhlIGR5bmFtaWMgaW50ZXJydXB0IG1vZGVyYXRpb24KKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIyLW1hci0wMworKiogUmV0dXJucyAgICAgIDogdm9pZCAoISkKKyoqIE5vdGVzICAgICAgICA6IC0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgCitTa0RpbVN0YXJ0TW9kZXJhdGlvblRpbWVyKFNLX0FDICpwQUMpIHsKKyAgICBTS19FVlBBUkEgICAgRXZlbnRQYXJhbTsgICAvKiBFdmVudCBzdHJ1Y3QgZm9yIHRpbWVyIGV2ZW50ICovCisgCisgICAgU0tfTUVNU0VUKChjaGFyICopICZFdmVudFBhcmFtLCAwLCBzaXplb2YoRXZlbnRQYXJhbSkpOworICAgIEV2ZW50UGFyYW0uUGFyYTMyWzBdID0gU0tfRFJWX01PREVSQVRJT05fVElNRVI7CisgICAgU2tUaW1lclN0YXJ0KHBBQywgcEFDLT5Jb0Jhc2UsICZwQUMtPkR5bklycU1vZEluZm8uTW9kVGltZXIsCisgICAgICAgICAgICAgICAgIFNLX0RSVl9NT0RFUkFUSU9OX1RJTUVSX0xFTkdUSCwKKyAgICAgICAgICAgICAgICAgU0tHRV9EUlYsIFNLX0RSVl9USU1FUiwgRXZlbnRQYXJhbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBGdW5jdGlvbiAgICAgOiBTa0RpbUVuYWJsZU1vZGVyYXRpb25JZk5lZWRlZAorKiogRGVzY3JpcHRpb24gIDogRWl0aGVyIGVuYWJsZXMgb3IgZGlzYWJsZXMgbW9kZXJhdGlvbgorKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgorKiogTGFzdCBNb2RpZmllZDogMjItbWFyLTAzCisqKiBSZXR1cm5zICAgICAgOiB2b2lkICghKQorKiogTm90ZXMgICAgICAgIDogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHBhcnRpY3VsYXIgYWRhcHRlciBpcyBvcGVuZWQKKyoqICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIERpc2FibGUgZnVuY3Rpb24sIGJlY2F1c2Ugd2hlbiBhbGwgaW50ZXJydXB0cyAKKyoqICAgICAgICAgICAgICAgIG1pZ2h0IGJlIGRpc2FibGUsIHRoZSBtb2RlcmF0aW9uIHRpbWVyIGhhcyBubyBtZWFuaW5nIGF0IGFsbAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitTa0RpbUVuYWJsZU1vZGVyYXRpb25JZk5lZWRlZChTS19BQyAqcEFDKSB7CisKKyAgICBpZiAoTV9ESU1JTkZPLkludE1vZFR5cGVTZWxlY3QgPT0gQ19JTlRfTU9EX1NUQVRJQykgeworICAgICAgICBFbmFibGVJbnRNb2QocEFDKTsgICAvKiBub3RpZmljYXRpb24gcHJpbnQgaW4gdGhpcyBmdW5jdGlvbiAqLworICAgIH0gZWxzZSBpZiAoTV9ESU1JTkZPLkludE1vZFR5cGVTZWxlY3QgPT0gQ19JTlRfTU9EX0RZTkFNSUMpIHsKKyAgICAgICAgU2tEaW1TdGFydE1vZGVyYXRpb25UaW1lcihwQUMpOworICAgICAgICBpZiAoTV9ESU1JTkZPLkRpc3BsYXlTdGF0cykgeworICAgICAgICAgICAgcHJpbnRrKCJEeW5hbWljIG1vZGVyYXRpb24gaGFzIGJlZW4gZW5hYmxlZFxuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoTV9ESU1JTkZPLkRpc3BsYXlTdGF0cykgeworICAgICAgICAgICAgcHJpbnRrKCJObyBtb2RlcmF0aW9uIGhhcyBiZWVuIGVuYWJsZWRcbiIpOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogU2tEaW1EaXNwbGF5TW9kZXJhdGlvblNldHRpbmdzCisqKiBEZXNjcmlwdGlvbiAgOiBEaXNwbGF5cyB0aGUgY3VycmVudCBzZXR0aW5ncyByZWdhcmluZyBpbnRlcnJ1cHQgbW9kZXJhdGlvbgorKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgorKiogTGFzdCBNb2RpZmllZDogMjItbWFyLTAzCisqKiBSZXR1cm5zICAgICAgOiB2b2lkICghKQorKiogTm90ZXMgICAgICAgIDogLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAKK1NrRGltRGlzcGxheU1vZGVyYXRpb25TZXR0aW5ncyhTS19BQyAqcEFDKSB7CisgICAgRGlzcGxheVNlbGVjdGVkTW9kZXJhdGlvblR5cGUocEFDKTsKKyAgICBEaXNwbGF5U2VsZWN0ZWRNb2RlcmF0aW9uTWFzayhwQUMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIExvY2FsIGZ1bmN0aW9ucyAKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogR2V0Q3VycmVudFN5c3RlbUxvYWQKKyoqIERlc2NyaXB0aW9uICA6IFJldHJpZXZlcyB0aGUgY3VycmVudCBzeXN0ZW0gbG9hZCBvZiB0aGUgc3lzdGVtLiBUaGlzIGxvYWQKKyoqICAgICAgICAgICAgICAgIGlzIGV2YWx1YXRlZCBmb3IgYWxsIHByb2Nlc3NvcnMgd2l0aGluIHRoZSBzeXN0ZW0uCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMi1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IHVuc2lnbmVkIGludDogbG9hZCBleHByZXNzZWQgaW4gcGVyY2VudGFnZQorKiogTm90ZXMgICAgICAgIDogVGhlIHBvc3NpYmxlIHJhbmdlIGJlaW5nIHJldHVybmVkIGlzIGZyb20gMCB1cCB0byAxMDAuCisqKiAgICAgICAgICAgICAgICBXaGVyZWFzIDAgbWVhbnMgJ25vIGxvYWQgYXQgYWxsJyBhbmQgMTAwICdzeXN0ZW0gZnVsbHkgbG9hZGVkJworKiogICAgICAgICAgICAgICAgSXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hhdCBhY3R1YWxseSBjYXVzZXMgdGhlIHN5c3RlbQorKiogICAgICAgICAgICAgICAgdG8gYmUgaW4gMTAwJSwgYnV0IG1heWJlIHRoYXQgaXMgZHVlIHRvIHRvbyBtdWNoIGludGVycnVwdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdW5zaWduZWQgaW50CitHZXRDdXJyZW50U3lzdGVtTG9hZChTS19BQyAqcEFDKSB7CisJdW5zaWduZWQgbG9uZyBqaWYgICAgICAgICA9IGppZmZpZXM7CisJdW5zaWduZWQgaW50ICBVc2VyVGltZSAgICA9IDA7CisJdW5zaWduZWQgaW50ICBTeXN0ZW1UaW1lICA9IDA7CisJdW5zaWduZWQgaW50ICBOaWNlVGltZSAgICA9IDA7CisJdW5zaWduZWQgaW50ICBJZGxlVGltZSAgICA9IDA7CisJdW5zaWduZWQgaW50ICBUb3RhbFRpbWUgICA9IDA7CisJdW5zaWduZWQgaW50ICBVc2VkVGltZSAgICA9IDA7CisJdW5zaWduZWQgaW50ICBTeXN0ZW1Mb2FkICA9IDA7CisKKwkvKiB1bnNpZ25lZCBpbnQgIE5ickNwdSAgICAgID0gMDsgKi8KKworCS8qCisJKiogVGhlIGZvbGxvd2luZyBsaW5lcyBoYXZlIGJlZW4gY29tbWVudGVkIG91dCwgYmVjYXVzZQorCSoqIGZyb20ga2VybmVsIDIuNS40NCBvbndhcmRzLCB0aGUga2VybmVsLW93bmVkIHN0cnVjdHVyZQorCSoqCisJKiogICAgICBzdHJ1Y3Qga2VybmVsX3N0YXQga3N0YXQKKwkqKgorCSoqIGlzIG5vdCBtYXJrZWQgYXMgYW4gZXhwb3J0ZWQgc3ltYm9sIGluIHRoZSBmaWxlCisJKioKKwkqKiAgICAgIGtlcm5lbC9rc3ltcy5jIAorCSoqCisJKiogQXMgYSBjb25zZXF1ZW5jZSwgdXNpbmcgdGhpcyBkcml2ZXIgYXMgS0xNIGlzIG5vdCBwb3NzaWJsZQorCSoqIGFuZCBhbnkgYWNjZXNzIG9mIHRoZSBzdHJ1Y3R1cmUga2VybmVsX3N0YXQgdmlhIHRoZSAKKwkqKiBkZWRpY2F0ZWQgbWFjcm9zIGtzdGF0X2NwdShpKS5jcHVzdGF0Lnh4eCBpcyB0byBiZSBhdm9pZGVkLgorCSoqCisJKiogVGhlIGtzdGF0LWluZm9ybWF0aW9uIG1pZ2h0IGJlIGFkZGVkIGFnYWluIGluIGZ1dHVyZSAKKwkqKiB2ZXJzaW9ucyBvZiB0aGUgMi41Lnh4IGtlcm5lbCwgYnV0IGZvciB0aGUgdGltZSBiZWluZywgCisJKiogbnVtYmVyIG9mIGludGVycnVwdHMgd2lsbCBzZXJ2ZSBhcyBpbmRpY2F0aW9uIGhvdyBtdWNoIAorCSoqIGxvYWQgd2UgY3VycmVudGx5IGhhdmUuLi4gCisJKioKKwkqKiBmb3IgKE5ickNwdSA9IDA7IE5ickNwdSA8IG51bV9vbmxpbmVfY3B1cygpOyBOYnJDcHUrKykgeworCSoqCVVzZXJUaW1lICAgPSBVc2VyVGltZSAgICsga3N0YXRfY3B1KE5ickNwdSkuY3B1c3RhdC51c2VyOworCSoqCU5pY2VUaW1lICAgPSBOaWNlVGltZSAgICsga3N0YXRfY3B1KE5ickNwdSkuY3B1c3RhdC5uaWNlOworCSoqCVN5c3RlbVRpbWUgPSBTeXN0ZW1UaW1lICsga3N0YXRfY3B1KE5ickNwdSkuY3B1c3RhdC5zeXN0ZW07CisJKiogfQorCSovCisJU0tfVTY0IFRocmVzaG9sZEludHMgID0gMDsKKwlTS19VNjQgSXNyQ2FsbHNQZXJTZWMgPSAwOworCisJVGhyZXNob2xkSW50cyAgPSAoKE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjICoKKwkJCSAgIENfSU5UX01PRF9FTkFCTEVfUEVSQ0VOVEFHRSkgKyAxMDApOworCUlzckNhbGxzUGVyU2VjID0gR2V0SXNyQ2FsbHMocEFDKTsKKwlpZiAoSXNyQ2FsbHNQZXJTZWMgPj0gVGhyZXNob2xkSW50cykgeworCSAgICAvKgorCSAgICAqKiBXZSBkbyBub3Qga25vdyBob3cgbXVjaCB0aGUgcmVhbCBDUFUtbG9hZCBpcyEKKwkgICAgKiogUmV0dXJuIDgwJSBhcyBhIGRlZmF1bHQgaW4gb3JkZXIgdG8gYWN0aXZhdGUgRElNCisJICAgICovCisJICAgIFN5c3RlbUxvYWQgPSA4MDsKKwkgICAgcmV0dXJuIChTeXN0ZW1Mb2FkKTsgIAorCX0gCisKKwlVc2VkVGltZSAgPSBVc2VyVGltZSArIE5pY2VUaW1lICsgU3lzdGVtVGltZTsKKworCUlkbGVUaW1lICA9IGppZiAqIG51bV9vbmxpbmVfY3B1cygpIC0gVXNlZFRpbWU7CisJVG90YWxUaW1lID0gVXNlZFRpbWUgKyBJZGxlVGltZTsKKworCVN5c3RlbUxvYWQgPSAoIDEwMCAqIChVc2VkVGltZSAgLSBNX0RJTUlORk8uUHJldlVzZWRUaW1lKSApIC8KKwkJCQkJCShUb3RhbFRpbWUgLSBNX0RJTUlORk8uUHJldlRvdGFsVGltZSk7CisKKwlpZiAoTV9ESU1JTkZPLkRpc3BsYXlTdGF0cykgeworCQlwcmludGsoIkN1cnJlbnQgc3lzdGVtIGxvYWQgaXM6ICV1XG4iLCBTeXN0ZW1Mb2FkKTsKKwl9CisKKwlNX0RJTUlORk8uUHJldlRvdGFsVGltZSA9IFRvdGFsVGltZTsKKwlNX0RJTUlORk8uUHJldlVzZWRUaW1lICA9IFVzZWRUaW1lOworCisJcmV0dXJuIChTeXN0ZW1Mb2FkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IEdldElzckNhbGxzCisqKiBEZXNjcmlwdGlvbiAgOiBEZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIG1vZGVyYXRpb24gbWFzaywgdGhpcyBmdW5jdGlvbiB3aWxsCisqKiAgICAgICAgICAgICAgICByZXR1cm4gdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIGhhbmRsZWQgaW4gdGhlIHByZXZpb3VzIHRpbWUtCisqKiAgICAgICAgICAgICAgICBmcmFtZS4gVGhpcyBldmFsdWF0ZWQgbnVtYmVyIGlzIGJhc2VkIG9uIHRoZSBjdXJyZW50IG51bWJlciAKKyoqICAgICAgICAgICAgICAgIG9mIGludGVycnVwdHMgc3RvcmVkIGluIFBOTUktY29udGV4dCBhbmQgdGhlIHByZXZpb3VzIHN0b3JlZCAKKyoqICAgICAgICAgICAgICAgIGludGVycnVwdHMuCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMy1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IGludDogICB0aGUgbnVtYmVyIG9mIGludGVycnVwdHMgYmVpbmcgZXhlY3V0ZWQgaW4gdGhlIGxhc3QKKyoqICAgICAgICAgICAgICAgICAgICAgICB0aW1lZnJhbWUKKyoqIE5vdGVzICAgICAgICA6IEl0IG1ha2VzIG9ubHkgc2Vuc2UgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLCB3aGVuIGR5bmFtaWMgCisqKiAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBpcyBhcHBsaWVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgU0tfVTY0CitHZXRJc3JDYWxscyhTS19BQyAqcEFDKSB7CisgICAgU0tfVTY0ICAgUnhQb3J0MEludERpZmYgPSAwOworICAgIFNLX1U2NCAgIFJ4UG9ydDFJbnREaWZmID0gMDsKKyAgICBTS19VNjQgICBUeFBvcnQwSW50RGlmZiA9IDA7CisgICAgU0tfVTY0ICAgVHhQb3J0MUludERpZmYgPSAwOworCisgICAgaWYgKHBBQy0+RHluSXJxTW9kSW5mby5NYXNrSXJxTW9kZXJhdGlvbiA9PSBJUlFfTUFTS19UWF9PTkxZKSB7CisgICAgICAgIGlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMikgeworICAgICAgICAgICAgVHhQb3J0MUludERpZmYgPSBwQUMtPlBubWkuUG9ydFsxXS5UeEludHJDdHMgLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MVR4SW50ckN0czsKKyAgICAgICAgfQorICAgICAgICBUeFBvcnQwSW50RGlmZiA9IHBBQy0+UG5taS5Qb3J0WzBdLlR4SW50ckN0cyAtIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDBUeEludHJDdHM7CisgICAgfSBlbHNlIGlmIChwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPT0gSVJRX01BU0tfUlhfT05MWSkgeworICAgICAgICBpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIpIHsKKyAgICAgICAgICAgIFJ4UG9ydDFJbnREaWZmID0gcEFDLT5Qbm1pLlBvcnRbMV0uUnhJbnRyQ3RzIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDFSeEludHJDdHM7CisgICAgICAgIH0KKyAgICAgICAgUnhQb3J0MEludERpZmYgPSBwQUMtPlBubWkuUG9ydFswXS5SeEludHJDdHMgLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkR5bklycU1vZEluZm8uUHJldlBvcnQwUnhJbnRyQ3RzOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMikgeworICAgICAgICAgICAgUnhQb3J0MUludERpZmYgPSBwQUMtPlBubWkuUG9ydFsxXS5SeEludHJDdHMgLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MVJ4SW50ckN0czsKKyAgICAgICAgICAgIFR4UG9ydDFJbnREaWZmID0gcEFDLT5Qbm1pLlBvcnRbMV0uVHhJbnRyQ3RzIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDFUeEludHJDdHM7CisgICAgICAgIH0gCisgICAgICAgIFJ4UG9ydDBJbnREaWZmID0gcEFDLT5Qbm1pLlBvcnRbMF0uUnhJbnRyQ3RzIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MFJ4SW50ckN0czsKKyAgICAgICAgVHhQb3J0MEludERpZmYgPSBwQUMtPlBubWkuUG9ydFswXS5UeEludHJDdHMgLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkR5bklycU1vZEluZm8uUHJldlBvcnQwVHhJbnRyQ3RzOworICAgIH0KKworICAgIHJldHVybiAoUnhQb3J0MEludERpZmYgKyBSeFBvcnQxSW50RGlmZiArIFR4UG9ydDBJbnREaWZmICsgVHhQb3J0MUludERpZmYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogR2V0UnhDYWxscworKiogRGVzY3JpcHRpb24gIDogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcmVjZWl2ZSBpbnRlci0KKyoqICAgICAgICAgICAgICAgIHJ1cHQgd2FzIHByb2Nlc3NlZC4gVGhpcyBpcyBuZWVkZWQgdG8gZXZhbHVhdGUgYW55IHJlc2l6aW5nIAorKiogICAgICAgICAgICAgICAgZmFjdG9yLgorKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgorKiogTGFzdCBNb2RpZmllZDogMjMtbWFyLTAzCisqKiBSZXR1cm5zICAgICAgOiBTS19VNjQ6IHRoZSBudW1iZXIgb2YgUlgtaW50cyBiZWluZyBwcm9jZXNzZWQKKyoqIE5vdGVzICAgICAgICA6IEl0IG1ha2VzIG9ubHkgc2Vuc2UgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLCB3aGVuIGR5bmFtaWMgCisqKiAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBpcyBhcHBsaWVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgU0tfVTY0CitHZXRSeENhbGxzKFNLX0FDICpwQUMpIHsKKyAgICBTS19VNjQgICBSeFBvcnQwSW50RGlmZiA9IDA7CisgICAgU0tfVTY0ICAgUnhQb3J0MUludERpZmYgPSAwOworCisgICAgaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyKSB7CisgICAgICAgIFJ4UG9ydDFJbnREaWZmID0gcEFDLT5Qbm1pLlBvcnRbMV0uUnhJbnRyQ3RzIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MVJ4SW50ckN0czsKKyAgICB9CisgICAgUnhQb3J0MEludERpZmYgPSBwQUMtPlBubWkuUG9ydFswXS5SeEludHJDdHMgLSAKKyAgICAgICAgICAgICAgICAgICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDBSeEludHJDdHM7CisKKyAgICByZXR1cm4gKFJ4UG9ydDBJbnREaWZmICsgUnhQb3J0MUludERpZmYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogU2V0Q3VyckludEN0cgorKiogRGVzY3JpcHRpb24gIDogV2lsbCBzdG9yZSB0aGUgY3VycmVudCBudW1iZXIgb3JmIG9jY3VyZWQgaW50ZXJydXB0cyBpbiB0aGUgCisqKiAgICAgICAgICAgICAgICBhZGFwdGVyIGNvbnRleHQuIFRoaXMgaXMgbmVlZGVkIHRvIGV2YWx1YXRlZCB0aGUgbnVtYmVyIG9mIAorKiogICAgICAgICAgICAgICAgaW50ZXJydXB0cyB3aXRoaW4gYSBjdXJyZW50IHRpbWVmcmFtZS4KKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIzLW1hci0wMworKiogUmV0dXJucyAgICAgIDogdm9pZCAoISkKKyoqIE5vdGVzICAgICAgICA6IC0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitTZXRDdXJySW50Q3RyKFNLX0FDICpwQUMpIHsKKyAgICBpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIpIHsKKyAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MVJ4SW50ckN0cyA9IHBBQy0+UG5taS5Qb3J0WzFdLlJ4SW50ckN0czsKKyAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MVR4SW50ckN0cyA9IHBBQy0+UG5taS5Qb3J0WzFdLlR4SW50ckN0czsKKyAgICB9IAorICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDBSeEludHJDdHMgPSBwQUMtPlBubWkuUG9ydFswXS5SeEludHJDdHM7CisgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MFR4SW50ckN0cyA9IHBBQy0+UG5taS5Qb3J0WzBdLlR4SW50ckN0czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IElzSW50TW9kRW5hYmxlZCgpCisqKiBEZXNjcmlwdGlvbiAgOiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGludGVycnVwdHMgbW9kZXJhdGlvbgorKiogICAgICAgICAgICAgICAgY29tbWFuZCByZWdpc3Rlci4gSXRzIGNvbnRlbnQgZGV0ZXJtaW5lcyB3aGV0aGVyIGFueSAKKyoqICAgICAgICAgICAgICAgIG1vZGVyYXRpb24gaXMgcnVubmluZyBvciBub3QuCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMy1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IFNLX1RSVUUgIDogaWYgbW9kIHRpbWVyIHJ1bm5pbmcKKyoqICAgICAgICAgICAgICAgIFNLX0ZBTFNFIDogaWYgbm8gbW9kZXJhdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQKKyoqIE5vdGVzICAgICAgICA6IC0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBTS19CT09MCitJc0ludE1vZEVuYWJsZWQoU0tfQUMgKnBBQykgeworICAgIHVuc2lnbmVkIGxvbmcgQ3RyQ21kOworCisgICAgU0tfSU4zMihwQUMtPklvQmFzZSwgQjJfSVJRTV9DVFJMLCAmQ3RyQ21kKTsKKyAgICBpZiAoKEN0ckNtZCAmIFRJTV9TVEFSVCkgPT0gVElNX1NUQVJUKSB7CisgICAgICAgcmV0dXJuIFNLX1RSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICByZXR1cm4gU0tfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogRW5hYmxlSW50TW9kKCkKKyoqIERlc2NyaXB0aW9uICA6IEVuYWJsZXMgdGhlIGludGVycnVwdCBtb2RlcmF0aW9uIHVzaW5nIHRoZSB2YWx1ZXMgc3RvcmVkIGluCisqKiAgICAgICAgICAgICAgICBpbiB0aGUgcEFDLT5EeW5JbnRNb2QgZGF0YSBzdHJ1Y3R1cmUKKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIyLW1hci0wMworKiogUmV0dXJucyAgICAgIDogLQorKiogTm90ZXMgICAgICAgIDogLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK0VuYWJsZUludE1vZChTS19BQyAqcEFDKSB7CisgICAgdW5zaWduZWQgbG9uZyBNb2RCYXNlOworCisgICAgaWYgKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX0dFTkVTSVMpIHsKKyAgICAgICBNb2RCYXNlID0gQ19DTEtfRlJFUV9HRU5FU0lTIC8gcEFDLT5EeW5JcnFNb2RJbmZvLk1heE1vZEludHNQZXJTZWM7CisgICAgfSBlbHNlIHsKKyAgICAgICBNb2RCYXNlID0gQ19DTEtfRlJFUV9ZVUtPTiAvIHBBQy0+RHluSXJxTW9kSW5mby5NYXhNb2RJbnRzUGVyU2VjOworICAgIH0KKworICAgIFNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMl9JUlFNX0lOSSwgIE1vZEJhc2UpOworICAgIFNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMl9JUlFNX01TSywgIHBBQy0+RHluSXJxTW9kSW5mby5NYXNrSXJxTW9kZXJhdGlvbik7CisgICAgU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIEIyX0lSUU1fQ1RSTCwgVElNX1NUQVJUKTsKKyAgICBpZiAoTV9ESU1JTkZPLkRpc3BsYXlTdGF0cykgeworICAgICAgICBwcmludGsoIkVuYWJsZWQgaW50ZXJydXB0IG1vZGVyYXRpb24gKCVpIGludHMvc2VjKVxuIiwKKyAgICAgICAgICAgICAgIE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBGdW5jdGlvbiAgICAgOiBEaXNhYmxlSW50TW9kKCkKKyoqIERlc2NyaXB0aW9uICA6IERpc2JsZXMgdGhlIGludGVycnVwdCBtb2RlcmF0aW9uIGluZGVwZW5kZW50IG9mIHdoYXQgaW50ZXItCisqKiAgICAgICAgICAgICAgICBydXB0cyBhcmUgcnVubmluZyBvciBub3QKKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIzLW1hci0wMworKiogUmV0dXJucyAgICAgIDogLQorKiogTm90ZXMgICAgICAgIDogLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgCitEaXNhYmxlSW50TW9kKFNLX0FDICpwQUMpIHsKKworICAgIFNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMl9JUlFNX0NUUkwsIFRJTV9TVE9QKTsKKyAgICBpZiAoTV9ESU1JTkZPLkRpc3BsYXlTdGF0cykgeworICAgICAgICBwcmludGsoIkRpc2FibGVkIGludGVycnVwdCBtb2RlcmF0aW9uXG4iKTsKKyAgICB9Cit9IAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogUmVzaXplRGltVGltZXJEdXJhdGlvbigpOworKiogRGVzY3JpcHRpb24gIDogQ2hlY2tzIHRoZSBjdXJyZW50IHVzZWQgZGVzY3JpcHRvciByYXRpbyBhbmQgcmVzaXplcyB0aGUgCisqKiAgICAgICAgICAgICAgICBkdXJhdGlvbiB0aW1lciAobG9uZ2VyL3NtYWxsZXIpIGlmIHBvc3NpYmxlLiAKKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIzLW1hci0wMworKiogUmV0dXJucyAgICAgIDogLQorKiogTm90ZXMgICAgICAgIDogVGhlcmUgYXJlIGJvdGggbWF4aW11bSBhbmQgbWluaW11bSB0aW1lciBkdXJhdGlvbiB2YWx1ZS4gCisqKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBpcyBhbHJlYWR5CisqKiAgICAgICAgICAgICAgICBlbmFibGVkIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgCitSZXNpemVEaW1UaW1lckR1cmF0aW9uKFNLX0FDICpwQUMpIHsKKyAgICBTS19CT09MIEluY3JlYXNlVGltZXJEdXJhdGlvbjsKKyAgICBpbnQgICAgIFRvdGFsTWF4TmJyRGVzY3I7CisgICAgaW50ICAgICBVc2VkRGVzY3JSYXRpbzsKKyAgICBpbnQgICAgIFJhdGlvRGlmZkFiczsKKyAgICBpbnQgICAgIFJhdGlvRGlmZlJlbDsKKyAgICBpbnQgICAgIE5ld01heE1vZEludHNQZXJTZWM7CisgICAgaW50ICAgICBNb2RBZGpWYWx1ZTsKKyAgICBsb25nICAgIE1vZEJhc2U7CisKKyAgICAvKgorICAgICoqIENoZWNrIGZpcnN0IGlmIHdlIGFyZSBhbGxvd2VkIHRvIHBlcmZvcm0gYW55IG1vZGlmaWNhdGlvbgorICAgICovCisgICAgaWYgKElzSW50TW9kRW5hYmxlZChwQUMpKSB7IAorICAgICAgICBpZiAoTV9ESU1JTkZPLkludE1vZFR5cGVTZWxlY3QgIT0gQ19JTlRfTU9EX0RZTkFNSUMpIHsKKyAgICAgICAgICAgIHJldHVybjsgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoTV9ESU1JTkZPLk1vZEp1c3RFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgTV9ESU1JTkZPLk1vZEp1c3RFbmFibGVkID0gU0tfRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAqKiBJZiB3ZSBnb3QgdW50aWwgaGVyZSwgd2UgaGF2ZSB0byBldmFsdWF0ZSB0aGUgYW1vdW50IG9mIHRoZQorICAgICoqIGRlc2NyaXB0b3IgcmF0aW8gY2hhbmdlLi4uCisgICAgKi8KKyAgICBUb3RhbE1heE5ickRlc2NyID0gcEFDLT5SeERlc2NyUGVyUmluZyAqIEdldFJ4Q2FsbHMocEFDKTsKKyAgICBVc2VkRGVzY3JSYXRpbyAgID0gKE1fRElNSU5GTy5OYnJQcm9jZXNzZWREZXNjciAqIDEwMCkgLyBUb3RhbE1heE5ickRlc2NyOworCisgICAgaWYgKFVzZWREZXNjclJhdGlvID4gTV9ESU1JTkZPLlByZXZVc2VkRGVzY3JSYXRpbykgeworICAgICAgICBSYXRpb0RpZmZBYnMgPSAoVXNlZERlc2NyUmF0aW8gLSBNX0RJTUlORk8uUHJldlVzZWREZXNjclJhdGlvKTsKKyAgICAgICAgUmF0aW9EaWZmUmVsID0gKFJhdGlvRGlmZkFicyAqIDEwMCkgLyBVc2VkRGVzY3JSYXRpbzsKKyAgICAgICAgTV9ESU1JTkZPLlByZXZVc2VkRGVzY3JSYXRpbyA9IFVzZWREZXNjclJhdGlvOworICAgICAgICBJbmNyZWFzZVRpbWVyRHVyYXRpb24gPSBTS19GQUxTRTsgIC8qIGluIG90aGVyIHdvcmRzOiBERUNSRUFTRSAqLworICAgIH0gZWxzZSBpZiAoVXNlZERlc2NyUmF0aW8gPCBNX0RJTUlORk8uUHJldlVzZWREZXNjclJhdGlvKSB7CisgICAgICAgIFJhdGlvRGlmZkFicyA9IChNX0RJTUlORk8uUHJldlVzZWREZXNjclJhdGlvIC0gVXNlZERlc2NyUmF0aW8pOworICAgICAgICBSYXRpb0RpZmZSZWwgPSAoUmF0aW9EaWZmQWJzICogMTAwKSAvIE1fRElNSU5GTy5QcmV2VXNlZERlc2NyUmF0aW87CisgICAgICAgIE1fRElNSU5GTy5QcmV2VXNlZERlc2NyUmF0aW8gPSBVc2VkRGVzY3JSYXRpbzsKKyAgICAgICAgSW5jcmVhc2VUaW1lckR1cmF0aW9uID0gU0tfVFJVRTsgICAvKiBpbiBvdGhlciB3b3JkczogSU5DUkVBU0UgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBSYXRpb0RpZmZBYnMgPSAoTV9ESU1JTkZPLlByZXZVc2VkRGVzY3JSYXRpbyAtIFVzZWREZXNjclJhdGlvKTsKKyAgICAgICAgUmF0aW9EaWZmUmVsID0gKFJhdGlvRGlmZkFicyAqIDEwMCkgLyBNX0RJTUlORk8uUHJldlVzZWREZXNjclJhdGlvOworICAgICAgICBNX0RJTUlORk8uUHJldlVzZWREZXNjclJhdGlvID0gVXNlZERlc2NyUmF0aW87CisgICAgICAgIEluY3JlYXNlVGltZXJEdXJhdGlvbiA9IFNLX1RSVUU7ICAgLyogaW4gb3RoZXIgd29yZHM6IElOQ1JFQVNFICovCisgICAgfQorCisgICAgLyoKKyAgICAqKiBOb3cgd2UgY2FuIGRldGVybWluZSB0aGUgY2hhbmdlIGluIHBlcmNlbnQKKyAgICAqLworICAgIGlmICgoUmF0aW9EaWZmUmVsID49IDApICYmIChSYXRpb0RpZmZSZWwgPD0gNSkgKSB7CisgICAgICAgTW9kQWRqVmFsdWUgPSAxOyAgLyogIDElIGNoYW5nZSAtIG1heWJlIHNvbWUgb3RoZXIgdmFsdWUgaW4gZnV0dXJlICovCisgICAgfSBlbHNlIGlmICgoUmF0aW9EaWZmUmVsID4gNSkgJiYgKFJhdGlvRGlmZlJlbCA8PSAxMCkgKSB7CisgICAgICAgTW9kQWRqVmFsdWUgPSAxOyAgLyogIDElIGNoYW5nZSAtIG1heWJlIHNvbWUgb3RoZXIgdmFsdWUgaW4gZnV0dXJlICovCisgICAgfSBlbHNlIGlmICgoUmF0aW9EaWZmUmVsID4gMTApICYmIChSYXRpb0RpZmZSZWwgPD0gMTUpICkgeworICAgICAgIE1vZEFkalZhbHVlID0gMTsgIC8qICAxJSBjaGFuZ2UgLSBtYXliZSBzb21lIG90aGVyIHZhbHVlIGluIGZ1dHVyZSAqLworICAgIH0gZWxzZSB7CisgICAgICAgTW9kQWRqVmFsdWUgPSAxOyAgLyogIDElIGNoYW5nZSAtIG1heWJlIHNvbWUgb3RoZXIgdmFsdWUgaW4gZnV0dXJlICovCisgICAgfQorCisgICAgaWYgKEluY3JlYXNlVGltZXJEdXJhdGlvbikgeworICAgICAgIE5ld01heE1vZEludHNQZXJTZWMgPSAgTV9ESU1JTkZPLk1heE1vZEludHNQZXJTZWMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTV9ESU1JTkZPLk1heE1vZEludHNQZXJTZWMgKiBNb2RBZGpWYWx1ZSkgLyAxMDA7CisgICAgfSBlbHNlIHsKKyAgICAgICBOZXdNYXhNb2RJbnRzUGVyU2VjID0gIE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjICogTW9kQWRqVmFsdWUpIC8gMTAwOworICAgIH0KKworICAgIC8qIAorICAgICoqIENoZWNrIGlmIHdlIGV4Y2VlZCBib3VuZGFyaWVzLi4uCisgICAgKi8KKyAgICBpZiAoIChOZXdNYXhNb2RJbnRzUGVyU2VjID4gTV9ESU1JTkZPLk1heE1vZEludHNQZXJTZWNVcHBlckxpbWl0KSB8fAorICAgICAgICAgKE5ld01heE1vZEludHNQZXJTZWMgPCBNX0RJTUlORk8uTWF4TW9kSW50c1BlclNlY0xvd2VyTGltaXQpKSB7CisgICAgICAgIGlmIChNX0RJTUlORk8uRGlzcGxheVN0YXRzKSB7CisgICAgICAgICAgICBwcmludGsoIkNhbm5vdCBjaGFuZ2UgTW9kVGltIGZyb20gJWkgdG8gJWkgaW50cy9zZWNcbiIsCisgICAgICAgICAgICAgICAgICAgTV9ESU1JTkZPLk1heE1vZEludHNQZXJTZWMsIE5ld01heE1vZEludHNQZXJTZWMpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoTV9ESU1JTkZPLkRpc3BsYXlTdGF0cykgeworICAgICAgICAgICAgcHJpbnRrKCJSZXNpemVkIE1vZFRpbSBmcm9tICVpIHRvICVpIGludHMvc2VjXG4iLAorICAgICAgICAgICAgICAgICAgIE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjLCBOZXdNYXhNb2RJbnRzUGVyU2VjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjID0gTmV3TWF4TW9kSW50c1BlclNlYzsKKworICAgIGlmIChwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSB7CisgICAgICAgIE1vZEJhc2UgPSBDX0NMS19GUkVRX0dFTkVTSVMgLyBwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYzsKKyAgICB9IGVsc2UgeworICAgICAgICBNb2RCYXNlID0gQ19DTEtfRlJFUV9ZVUtPTiAvIHBBQy0+RHluSXJxTW9kSW5mby5NYXhNb2RJbnRzUGVyU2VjOworICAgIH0KKworICAgIC8qIAorICAgICoqIFdlIGRvIG5vdCBuZWVkIHRvIHRvdWNoIGFueSBvdGhlciByZWdpc3RlcnMKKyAgICAqLworICAgIFNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMl9JUlFNX0lOSSwgTW9kQmFzZSk7Cit9IAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogRGlzcGxheVNlbGVjdGVkTW9kZXJhdGlvblR5cGUoKQorKiogRGVzY3JpcHRpb24gIDogRGlzcGxheXMgd2hhdCB0eXBlIG9mIG1vZGVyYXRpb24gd2UgaGF2ZQorKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgorKiogTGFzdCBNb2RpZmllZDogMjMtbWFyLTAzCisqKiBSZXR1cm5zICAgICAgOiB2b2lkIQorKiogTm90ZXMgICAgICAgIDogLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK0Rpc3BsYXlTZWxlY3RlZE1vZGVyYXRpb25UeXBlKFNLX0FDICpwQUMpIHsKKworICAgIGlmIChwQUMtPkR5bklycU1vZEluZm8uRGlzcGxheVN0YXRzKSB7CisgICAgICAgIGlmIChwQUMtPkR5bklycU1vZEluZm8uSW50TW9kVHlwZVNlbGVjdCA9PSBDX0lOVF9NT0RfU1RBVElDKSB7CisgICAgICAgICAgICAgcHJpbnRrKCJTdGF0aWMgaW50IG1vZGVyYXRpb24gcnVucyB3aXRoICVpIElOVFMvc2VjXG4iLAorICAgICAgICAgICAgICAgICAgICBwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyk7CisgICAgICAgIH0gZWxzZSBpZiAocEFDLT5EeW5JcnFNb2RJbmZvLkludE1vZFR5cGVTZWxlY3QgPT0gQ19JTlRfTU9EX0RZTkFNSUMpIHsKKyAgICAgICAgICAgICBpZiAoSXNJbnRNb2RFbmFibGVkKHBBQykpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIkR5bmFtaWMgaW50IG1vZGVyYXRpb24gcnVucyB3aXRoICVpIElOVFMvc2VjXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyk7CisgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIkR5bmFtaWMgaW50IG1vZGVyYXRpb24gY3VycmVudGx5IG5vdCBhcHBsaWVkXG4iKTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgcHJpbnRrKCJObyBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBzZWxlY3RlZCFcbiIpOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogRGlzcGxheVNlbGVjdGVkTW9kZXJhdGlvbk1hc2soKQorKiogRGVzY3JpcHRpb24gIDogRGlzcGxheXMgd2hhdCBpbnRlcnJ1cHRzIGFyZSBtb2RlcmF0ZWQKKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIzLW1hci0wMworKiogUmV0dXJucyAgICAgIDogdm9pZCEKKyoqIE5vdGVzICAgICAgICA6IC0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitEaXNwbGF5U2VsZWN0ZWRNb2RlcmF0aW9uTWFzayhTS19BQyAqcEFDKSB7CisKKyAgICBpZiAocEFDLT5EeW5JcnFNb2RJbmZvLkRpc3BsYXlTdGF0cykgeworICAgICAgICBpZiAocEFDLT5EeW5JcnFNb2RJbmZvLkludE1vZFR5cGVTZWxlY3QgIT0gQ19JTlRfTU9EX05PTkUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAocEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBJUlFfTUFTS19UWF9PTkxZOiAKKyAgICAgICAgICAgICAgICAgICBwcmludGsoIk9ubHkgVHgtaW50ZXJydXB0cyBhcmUgbW9kZXJhdGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElSUV9NQVNLX1JYX09OTFk6IAorICAgICAgICAgICAgICAgICAgIHByaW50aygiT25seSBSeC1pbnRlcnJ1cHRzIGFyZSBtb2RlcmF0ZWRcbiIpOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSVJRX01BU0tfU1BfT05MWTogCisgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJPbmx5IHNwZWNpYWwtaW50ZXJydXB0cyBhcmUgbW9kZXJhdGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElSUV9NQVNLX1RYX1JYOiAKKyAgICAgICAgICAgICAgICAgICBwcmludGsoIlR4LSBhbmQgUngtaW50ZXJydXB0cyBhcmUgbW9kZXJhdGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElSUV9NQVNLX1NQX1JYOiAKKyAgICAgICAgICAgICAgICAgICBwcmludGsoIlNwZWNpYWwtIGFuZCBSeC1pbnRlcnJ1cHRzIGFyZSBtb2RlcmF0ZWRcbiIpOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSVJRX01BU0tfU1BfVFg6IAorICAgICAgICAgICAgICAgICAgIHByaW50aygiU3BlY2lhbC0gYW5kIFR4LWludGVycnVwdHMgYXJlIG1vZGVyYXRlZFxuIik7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJUlFfTUFTS19SWF9UWF9TUDoKKyAgICAgICAgICAgICAgICAgICBwcmludGsoIkFsbCBSeC0sIFR4IGFuZCBzcGVjaWFsLWludGVycnVwdHMgYXJlIG1vZGVyYXRlZFxuIik7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICBwcmludGsoIkRvbid0IGtub3cgd2hhdCBpcyBtb2RlcmF0ZWRcbiIpOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRrKCJObyBzcGVjaWZpYyBpbnRlcnJ1cHRzIG1hc2tlZCBmb3IgbW9kZXJhdGlvblxuIik7CisgICAgICAgIH0KKyAgICB9IAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogRGlzcGxheURlc2NyUmF0aW8KKyoqIERlc2NyaXB0aW9uICA6IExpa2UgdGhlIG5hbWUgc3RhdGVzLi4uCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMy1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IHZvaWQhCisqKiBOb3RlcyAgICAgICAgOiAtCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorRGlzcGxheURlc2NyUmF0aW8oU0tfQUMgKnBBQykgeworICAgIGludCBUb3RhbE1heE5ickRlc2NyID0gMDsKKworICAgIGlmIChwQUMtPkR5bklycU1vZEluZm8uRGlzcGxheVN0YXRzKSB7CisgICAgICAgIFRvdGFsTWF4TmJyRGVzY3IgPSBwQUMtPlJ4RGVzY3JQZXJSaW5nICogR2V0UnhDYWxscyhwQUMpOworICAgICAgICBwcmludGsoIlJhdGlvIGRlc2NyaXB0b3JzOiAlaS8laVxuIiwKKyAgICAgICAgICAgICAgIE1fRElNSU5GTy5OYnJQcm9jZXNzZWREZXNjciwgVG90YWxNYXhOYnJEZXNjcik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEVuZCBvZiBmaWxlCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tldGh0b29sLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZXRodG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNjM5OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZXRodG9vbC5jCkBAIC0wLDAgKzEsNTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZTogICAgICAgIHNrZXRodG9vbC5jCisgKiBQcm9qZWN0OiAgICAgR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjogICAgICRSZXZpc2lvbjogMS43ICQKKyAqIERhdGU6ICAgICAgICAkRGF0ZTogMjAwNC8wOS8yOSAxMzozMjowNyAkCisgKiBQdXJwb3NlOiAgICAgQWxsIGZ1bmN0aW9ucyByZWdhcmRpbmcgZXRodG9vbCBoYW5kbGluZworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDQgTWFydmVsbC4KKyAqCisgKglEcml2ZXIgZm9yIE1hcnZlbGwgWXVrb24vMiBjaGlwc2V0IGFuZCBTeXNLb25uZWN0IEdpZ2FiaXQgRXRoZXJuZXQgCisgKiAgICAgIFNlcnZlciBBZGFwdGVycy4KKyAqCisgKglBdXRob3I6IFJhbHBoIFJvZXNsZXIgKHJyb2VzbGVyQHN5c2tvbm5lY3QuZGUpCisgKgkgICAgICAgIE1pcmtvIExpbmRuZXIgKG1saW5kbmVyQHN5c2tvbm5lY3QuZGUpCisgKgorICoJQWRkcmVzcyBhbGwgcXVlc3Rpb24gdG86IGxpbnV4QHN5c2tvbm5lY3QuZGUKKyAqCisgKglUaGUgdGVjaG5pY2FsIG1hbnVhbCBmb3IgdGhlIGFkYXB0ZXJzIGlzIGF2YWlsYWJsZSBmcm9tIFN5c0tvbm5lY3QncworICoJd2ViIHBhZ2VzOiB3d3cuc3lza29ubmVjdC5jb20KKyAqCQorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgorI2luY2x1ZGUgImgvc2t2ZXJzaW9uLmgiCisKKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGVmaW5lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTVVBQX0NPUFBFUl9BTEwgKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGZ8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRFRF9UUCkKKworI2RlZmluZSBBRFZfQ09QUEVSX0FMTCAgKEFEVkVSVElTRURfMTBiYXNlVF9IYWxmICB8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZnwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEFEVkVSVElTRURfVFApCisKKyNkZWZpbmUgU1VQUF9GSUJSRV9BTEwgIChTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEX0ZJQlJFICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRFRF9BdXRvbmVnKQorCisjZGVmaW5lIEFEVl9GSUJSRV9BTEwgICAoQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VEX0ZJQlJFICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEFEVkVSVElTRURfQXV0b25lZykKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTG9jYWwgRnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJZ2V0U2V0dGluZ3MgLSByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2V0dGluZ3Mgb2YgdGhlIHNlbGVjdGVkIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNlbGVjdGVkIGFkYXB0ZXIgaXMgcmV0dXJuZWQuCisgKglUaGlzIGNvbmZpZ3VyYXRpb24gaW52b2x2ZXMgYSlzcGVlZCwgYilkdXBsZXggYW5kIGMpYXV0b25lZyBwbHVzCisgKglhIG51bWJlciBvZiBvdGhlciB2YXJpYWJsZXMuCisgKgorICogUmV0dXJuczogICAgYWx3YXlzIDAKKyAqCisgKi8KK3N0YXRpYyBpbnQgZ2V0U2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCWNvbnN0IERFVl9ORVQgKnBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBwb3J0ID0gcE5ldC0+UG9ydE5yOworCWNvbnN0IFNLX0FDICpwQUMgPSBwTmV0LT5wQUM7CisJY29uc3QgU0tfR0VQT1JUICpwUG9ydCA9ICZwQUMtPkdJbmkuR1BbcG9ydF07CisKKwlzdGF0aWMgaW50IER1cGxleEF1dG9OZWdDb25mTWFwWzldWzNdPSB7CisJCXsgLTEgICAgICAgICAgICAgICAgICAgICAsIC0xICAgICAgICAgLCAtMSAgICAgICAgICAgICAgfSwKKwkJeyAwICAgICAgICAgICAgICAgICAgICAgICwgLTEgICAgICAgICAsIC0xICAgICAgICAgICAgICB9LAorCQl7IFNLX0xNT0RFX0hBTEYgICAgICAgICAgLCBEVVBMRVhfSEFMRiwgQVVUT05FR19ESVNBQkxFIH0sCisJCXsgU0tfTE1PREVfRlVMTCAgICAgICAgICAsIERVUExFWF9GVUxMLCBBVVRPTkVHX0RJU0FCTEUgfSwKKwkJeyBTS19MTU9ERV9BVVRPSEFMRiAgICAgICwgRFVQTEVYX0hBTEYsIEFVVE9ORUdfRU5BQkxFICB9LAorCQl7IFNLX0xNT0RFX0FVVE9GVUxMICAgICAgLCBEVVBMRVhfRlVMTCwgQVVUT05FR19FTkFCTEUgIH0sCisJCXsgU0tfTE1PREVfQVVUT0JPVEggICAgICAsIERVUExFWF9GVUxMLCBBVVRPTkVHX0VOQUJMRSAgfSwKKwkJeyBTS19MTU9ERV9BVVRPU0VOU0UgICAgICwgLTEgICAgICAgICAsIC0xICAgICAgICAgICAgICB9LAorCQl7IFNLX0xNT0RFX0lOREVURVJNSU5BVEVELCAtMSAgICAgICAgICwgLTEgICAgICAgICAgICAgIH0KKwl9OworCXN0YXRpYyBpbnQgU3BlZWRDb25mTWFwWzZdWzJdID0geworCQl7IDAgICAgICAgICAgICAgICAgICAgICAgICwgLTEgICAgICAgICB9LAorCQl7IFNLX0xTUEVFRF9BVVRPICAgICAgICAgICwgLTEgICAgICAgICB9LAorCQl7IFNLX0xTUEVFRF8xME1CUFMgICAgICAgICwgU1BFRURfMTAgICB9LAorCQl7IFNLX0xTUEVFRF8xMDBNQlBTICAgICAgICwgU1BFRURfMTAwICB9LAorCQl7IFNLX0xTUEVFRF8xMDAwTUJQUyAgICAgICwgU1BFRURfMTAwMCB9LAorCQl7IFNLX0xTUEVFRF9JTkRFVEVSTUlOQVRFRCwgLTEgICAgICAgICB9CisJfTsKKwlzdGF0aWMgaW50IEFkdlNwZWVkTWFwWzZdWzJdID0geworCQl7IDAgICAgICAgICAgICAgICAgICAgICAgICwgLTEgICAgICAgICB9LAorCQl7IFNLX0xTUEVFRF9BVVRPICAgICAgICAgICwgLTEgICAgICAgICB9LAorCQl7IFNLX0xTUEVFRF8xME1CUFMgICAgICAgICwgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgICB8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIH0sCisJCXsgU0tfTFNQRUVEXzEwME1CUFMgICAgICAgLCBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgIHwgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIH0sCisJCXsgU0tfTFNQRUVEXzEwMDBNQlBTICAgICAgLCBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbH0sCisJCXsgU0tfTFNQRUVEX0lOREVURVJNSU5BVEVELCAtMSAgICAgICAgIH0KKwl9OworCisJZWNtZC0+cGh5X2FkZHJlc3MgPSBwb3J0OworCWVjbWQtPnNwZWVkICAgICAgID0gU3BlZWRDb25mTWFwW3BQb3J0LT5QTGlua1NwZWVkVXNlZF1bMV07CisJZWNtZC0+ZHVwbGV4ICAgICAgPSBEdXBsZXhBdXRvTmVnQ29uZk1hcFtwUG9ydC0+UExpbmtNb2RlU3RhdHVzXVsxXTsKKwllY21kLT5hdXRvbmVnICAgICA9IER1cGxleEF1dG9OZWdDb25mTWFwW3BQb3J0LT5QTGlua01vZGVTdGF0dXNdWzJdOworCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKworCWlmIChwQUMtPkdJbmkuR0lDb3BwZXJUeXBlKSB7CisJCWVjbWQtPnBvcnQgICAgICAgID0gUE9SVF9UUDsKKwkJZWNtZC0+c3VwcG9ydGVkICAgPSAoU1VQUF9DT1BQRVJfQUxMfFNVUFBPUlRFRF9BdXRvbmVnKTsKKwkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCWVjbWQtPnN1cHBvcnRlZCAmPSB+KFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYpOworCQkJZWNtZC0+c3VwcG9ydGVkICY9IH4oU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCk7CisJCQllY21kLT5zdXBwb3J0ZWQgJj0gfihTVVBQT1JURURfMTAwYmFzZVRfSGFsZik7CisJCQllY21kLT5zdXBwb3J0ZWQgJj0gfihTVVBQT1JURURfMTAwYmFzZVRfRnVsbCk7CisJCX0gZWxzZSB7CisJCQlpZiAocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04pIHsKKwkJCQllY21kLT5zdXBwb3J0ZWQgJj0gfihTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYpOworCQkJfSAKKyNpZmRlZiBDSElQX0lEX1lVS09OX0ZFCisJCQlpZiAocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT05fRkUpIHsKKwkJCQllY21kLT5zdXBwb3J0ZWQgJj0gfihTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYpOworCQkJCWVjbWQtPnN1cHBvcnRlZCAmPSB+KFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCk7CisJCQl9CisjZW5kaWYKKwkJfQorCQlpZiAocEFDLT5HSW5pLkdQWzBdLlBMaW5rU3BlZWQgIT0gU0tfTFNQRUVEX0FVVE8pIHsKKwkJCWVjbWQtPmFkdmVydGlzaW5nID0gQWR2U3BlZWRNYXBbcFBvcnQtPlBMaW5rU3BlZWRdWzFdOworCQkJaWYgKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX1lVS09OKSB7CisJCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgJj0gfihTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYpOworCQkJfSAKKwkJfSBlbHNlIHsKKwkJCWVjbWQtPmFkdmVydGlzaW5nID0gZWNtZC0+c3VwcG9ydGVkOworCQl9CisKKwkJaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIAorCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BdXRvbmVnOworCX0gZWxzZSB7CisJCWVjbWQtPnBvcnQgICAgICAgID0gUE9SVF9GSUJSRTsKKwkJZWNtZC0+c3VwcG9ydGVkICAgPSBTVVBQX0ZJQlJFX0FMTDsKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZfRklCUkVfQUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE1JQiBpbmZyYXN0cnVjdHVyZSB1c2VzIGluc3RhbmNlIHZhbHVlIHN0YXJ0aW5nIGF0IDEKKyAqIGJhc2VkIG9uIGJvYXJkIGFuZCBwb3J0LgorICovCitzdGF0aWMgaW5saW5lIHUzMiBwbm1pSW5zdGFuY2UoY29uc3QgREVWX05FVCAqcE5ldCkKK3sKKwlyZXR1cm4gMSArIChwTmV0LT5wQUMtPlJsbXROZXRzID09IDIpICsgcE5ldC0+UG9ydE5yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglzZXRTZXR0aW5ncyAtIGNvbmZpZ3VyZXMgdGhlIHNldHRpbmdzIG9mIGEgc2VsZWN0ZWQgYWRhcHRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJUG9zc2libGUgc2V0dGluZ3MgdGhhdCBtYXkgYmUgYWx0ZXJlZCBhcmUgYSlzcGVlZCwgYilkdXBsZXggb3IgCisgKgljKWF1dG9uZWdvdGlhdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICoJMDoJZXZlcnl0aGluZyBmaW5lLCBubyBlcnJvcgorICoJPDA6CXRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGVycm9yIGNvZGUgb2YgdGhlIGZhaWx1cmUgCisgKi8KK3N0YXRpYyBpbnQgc2V0U2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCURFVl9ORVQgKnBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCVNLX0FDICpwQUMgPSBwTmV0LT5wQUM7CisJdTMyIGluc3RhbmNlOworCWNoYXIgYnVmWzRdOworCWludCBsZW4gPSAxOworCisJaWYgKGVjbWQtPnNwZWVkICE9IFNQRUVEXzEwICYmIGVjbWQtPnNwZWVkICE9IFNQRUVEXzEwMCAKKwkgICAgJiYgZWNtZC0+c3BlZWQgIT0gU1BFRURfMTAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZWNtZC0+ZHVwbGV4ICE9IERVUExFWF9IQUxGICYmIGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZWNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0RJU0FCTEUgJiYgZWNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUpCisJCSpidWYgPSAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKSAKKwkJCT8gU0tfTE1PREVfRlVMTCA6IFNLX0xNT0RFX0hBTEY7CisJZWxzZQorCQkqYnVmID0gKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgCisJCQk/IFNLX0xNT0RFX0FVVE9GVUxMIDogU0tfTE1PREVfQVVUT0hBTEY7CisJCisJaW5zdGFuY2UgPSBwbm1pSW5zdGFuY2UocE5ldCk7CisJaWYgKFNrUG5taVNldFZhcihwQUMsIHBBQy0+SW9CYXNlLCBPSURfU0tHRV9MSU5LX01PREUsIAorCQkJICAgJmJ1ZiwgJmxlbiwgaW5zdGFuY2UsIHBOZXQtPk5ldE5yKSAhPSBTS19QTk1JX0VSUl9PSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2goZWNtZC0+c3BlZWQpIHsKKwljYXNlIFNQRUVEXzEwMDA6CisJCSpidWYgPSBTS19MU1BFRURfMTAwME1CUFM7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwOgorCQkqYnVmID0gU0tfTFNQRUVEXzEwME1CUFM7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTA6CisJCSpidWYgPSBTS19MU1BFRURfMTBNQlBTOworCX0KKworCWlmIChTa1BubWlTZXRWYXIocEFDLCBwQUMtPklvQmFzZSwgT0lEX1NLR0VfU1BFRURfTU9ERSwgCisJCQkgJmJ1ZiwgJmxlbiwgaW5zdGFuY2UsIHBOZXQtPk5ldE5yKSAhPSBTS19QTk1JX0VSUl9PSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCWdldERyaXZlckluZm8gLSByZXR1cm5zIGdlbmVyaWMgZHJpdmVyIGFuZCBhZGFwdGVyIGluZm9ybWF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKglHZW5lcmljIGRyaXZlciBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCB2aWEgdGhpcyBmdW5jdGlvbiwgc3VjaCBhcworICoJdGhlIG5hbWUgb2YgdGhlIGRyaXZlciwgaXRzIHZlcnNpb24gYW5kIGFuZCBmaXJtd2FyZSB2ZXJzaW9uLgorICoJSW4gYWRkaXRpb24gdG8gdGhpcywgdGhlIGxvY2F0aW9uIG9mIHRoZSBzZWxlY3RlZCBhZGFwdGVyIGlzIAorICoJcmV0dXJuZWQgYXMgYSBidXMgaW5mbyBzdHJpbmcgKGUuZy4gJzAxOjA1LjAnKS4KKyAqCQorICogUmV0dXJuczoJTi9BCisgKgorICovCitzdGF0aWMgdm9pZCBnZXREcml2ZXJJbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJY29uc3QgREVWX05FVAkqcE5ldCA9IG5ldGRldl9wcml2KGRldik7CisJY29uc3QgU0tfQUMgKnBBQyA9IHBOZXQtPnBBQzsKKwljaGFyIHZlcnNbMzJdOworCisJc25wcmludGYodmVycywgc2l6ZW9mKHZlcnMpLTEsIFZFUl9TVFJJTkcgIih2JWQuJWQpIiwKKwkJKHBBQy0+R0luaS5HSVBjaUh3UmV2ID4+IDQpICYgMHhmLCBwQUMtPkdJbmkuR0lQY2lId1JldiAmIDB4Zik7CisKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJJVkVSX0ZJTEVfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCB2ZXJzKTsKKwlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgIk4vQSIpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHBBQy0+UGNpRGV2KSwgRVRIVE9PTF9CVVNJTkZPX0xFTik7Cit9CisKKy8qCisgKiBFdGh0b29sIHN0YXRpc3RpY3Mgc3VwcG9ydC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgU3RyaW5nc1N0YXRzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwkicnhfcGFja2V0cyIsCSJ0eF9wYWNrZXRzIiwKKwkicnhfYnl0ZXMiLAkidHhfYnl0ZXMiLAorCSJyeF9lcnJvcnMiLAkidHhfZXJyb3JzIiwJCisJInJ4X2Ryb3BwZWQiLAkidHhfZHJvcHBlZCIsCisJIm11bHRpY2FzdHMiLAkiY29sbGlzaW9ucyIsCQorCSJyeF9sZW5ndGhfZXJyb3JzIiwJCSJyeF9idWZmZXJfb3ZlcmZsb3dfZXJyb3JzIiwKKwkicnhfY3JjX2Vycm9ycyIsCQkicnhfZnJhbWVfZXJyb3JzIiwKKwkicnhfdG9vX3Nob3J0X2Vycm9ycyIsCQkicnhfdG9vX2xvbmdfZXJyb3JzIiwKKwkicnhfY2Fycmllcl9leHRlbnNpb25fZXJyb3JzIiwJInJ4X3N5bWJvbF9lcnJvcnMiLAorCSJyeF9sbGNfbWFjX3NpemVfZXJyb3JzIiwJInJ4X2NhcnJpZXJfZXJyb3JzIiwJCisJInJ4X2phYmJlcl9lcnJvcnMiLAkJInJ4X21pc3NlZF9lcnJvcnMiLAorCSJ0eF9hYm9ydF9jb2xsaXNpb25fZXJyb3JzIiwJInR4X2NhcnJpZXJfZXJyb3JzIiwKKwkidHhfYnVmZmVyX3VuZGVycnVuX2Vycm9ycyIsCSJ0eF9oZWFydGJlYXRfZXJyb3JzIiwKKwkidHhfd2luZG93X2Vycm9ycyIsCit9OworCitzdGF0aWMgaW50IGdldFN0YXRzQ291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gQVJSQVlfU0laRShTdHJpbmdzU3RhdHMpOworfQorCitzdGF0aWMgdm9pZCBnZXRTdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQoreworCXN3aXRjaChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJbWVtY3B5KGRhdGEsICpTdHJpbmdzU3RhdHMsIHNpemVvZihTdHJpbmdzU3RhdHMpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZXRFdGh0b29sU3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSkKK3sKKwljb25zdCBERVZfTkVUCSpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljb25zdCBTS19BQyAqcEFDID0gcE5ldC0+cEFDOworCWNvbnN0IFNLX1BOTUlfU1RSVUNUX0RBVEEgKnBQbm1pU3RydWN0ID0gJnBBQy0+UG5taVN0cnVjdDsKKworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0UnhPa0N0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFR4T2tDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRSeE9jdGV0c09rQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0VHhPY3RldHNPa0N0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPkluRXJyb3JzQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0VHhTaW5nbGVDb2xsaXNpb25DdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5SeE5vQnVmQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+VHhOb0J1ZkN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4TXVsdGljYXN0T2tDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRUeFNpbmdsZUNvbGxpc2lvbkN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4UnVudEN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4Rmlmb092ZXJmbG93Q3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0UnhGY3NDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRSeEZyYW1pbmdDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRSeFNob3J0c0N0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4VG9vTG9uZ0N0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4Q2V4dEN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4U3ltYm9sQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0UnhJUkxlbmd0aEN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4Q2FycmllckN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4SmFiYmVyQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0UnhNaXNzZWRDdHM7CisJKmRhdGErKyA9IHBBQy0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRUeENhcnJpZXJDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRUeEZpZm9VbmRlcnJ1bkN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFR4Q2FycmllckN0czsKKwkqZGF0YSsrID0gcEFDLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAl0b2dnbGVMZWRzIC0gQ2hhbmdlcyB0aGUgTEVEIHN0YXRlIG9mIGFuIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbGwgTEVEcyBvZiBhbiBhZGFwdGVyIHNvCisgKgl0aGF0IGl0IGNhbiBiZSBsb2NhdGVkIGJ5IGEgdXNlci4gCisgKgorICogUmV0dXJuczoJTi9BCisgKgorICovCitzdGF0aWMgdm9pZCB0b2dnbGVMZWRzKERFVl9ORVQgKnBOZXQsIGludCBvbikKK3sKKwlTS19BQyAqcEFDID0gcE5ldC0+cEFDOworCWludCBwb3J0ID0gcE5ldC0+UG9ydE5yOworCXZvaWQgX19pb21lbSAqaW8gPSBwQUMtPklvQmFzZTsKKworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCVNLX09VVDgoaW8sIE1SX0FERFIocG9ydCxMTktfTEVEX1JFRyksIAorCQkJb24gPyBTS19MTktfT04gOiBTS19MTktfT0ZGKTsKKwkJU2tHZVllbGxvd0xFRChwQUMsIGlvLCAKKwkJCSAgICAgIG9uID8gKExFRF9PTiA+PiAxKSA6IChMRURfT0ZGID4+IDEpKTsKKwkJU2tHZVhtaXRMRUQocEFDLCBpbywgTVJfQUREUihwb3J0LFJYX0xFRF9JTkkpLAorCQkJICAgIG9uID8gU0tfTEVEX1RTVCA6IFNLX0xFRF9ESVMpOworCisJCWlmIChwQUMtPkdJbmkuR1BbcG9ydF0uUGh5VHlwZSA9PSBTS19QSFlfQkNPTSkKKwkJCVNrWG1QaHlXcml0ZShwQUMsIGlvLCBwb3J0LCBQSFlfQkNPTV9QX0VYVF9DVFJMLCAKKwkJCQkgICAgIG9uID8gUEhZX0JfUEVDX0xFRF9PTiA6IFBIWV9CX1BFQ19MRURfT0ZGKTsKKwkJZWxzZSBpZiAocEFDLT5HSW5pLkdQW3BvcnRdLlBoeVR5cGUgPT0gU0tfUEhZX0xPTkUpCisJCQlTa1htUGh5V3JpdGUocEFDLCBpbywgcG9ydCwgUEhZX0xPTkVfTEVEX0NGRywKKwkJCQkgICAgIG9uID8gMHgwODAwIDogUEhZX0xfTENfTEVEVCk7CisJCWVsc2UKKwkJCVNrR2VYbWl0TEVEKHBBQywgaW8sIE1SX0FERFIocG9ydCxUWF9MRURfSU5JKSwKKwkJCQkgICAgb24gPyBTS19MRURfVFNUIDogU0tfTEVEX0RJUyk7CisJfSBlbHNlIHsKKwkJY29uc3QgdTE2IFl1a0xlZE9uID0gKFBIWV9NX0xFRF9NT19EVVAoTU9fTEVEX09OKSAgfAorCQkJCSAgICAgIFBIWV9NX0xFRF9NT18xMChNT19MRURfT04pICAgfAorCQkJCSAgICAgIFBIWV9NX0xFRF9NT18xMDAoTU9fTEVEX09OKSAgfAorCQkJCSAgICAgIFBIWV9NX0xFRF9NT18xMDAwKE1PX0xFRF9PTikgfCAKKwkJCQkgICAgICBQSFlfTV9MRURfTU9fUlgoTU9fTEVEX09OKSk7CisJCWNvbnN0IHUxNiAgWXVrTGVkT2ZmID0gKFBIWV9NX0xFRF9NT19EVVAoTU9fTEVEX09GRikgIHwKKwkJCQkJUEhZX01fTEVEX01PXzEwKE1PX0xFRF9PRkYpICAgfAorCQkJCQlQSFlfTV9MRURfTU9fMTAwKE1PX0xFRF9PRkYpICB8CisJCQkJCVBIWV9NX0xFRF9NT18xMDAwKE1PX0xFRF9PRkYpIHwgCisJCQkJCVBIWV9NX0xFRF9NT19SWChNT19MRURfT0ZGKSk7CisJCisKKwkJU2tHbVBoeVdyaXRlKHBBQyxpbyxwb3J0LFBIWV9NQVJWX0xFRF9DVFJMLDApOworCQlTa0dtUGh5V3JpdGUocEFDLGlvLHBvcnQsUEhZX01BUlZfTEVEX09WRVIsIAorCQkJICAgICBvbiA/IFl1a0xlZE9uIDogWXVrTGVkT2ZmKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlza0dlQmxpbmtUaW1lciAtIENoYW5nZXMgdGhlIExFRCBzdGF0ZSBvZiBhbiBhZGFwdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYWxsIExFRHMgb2YgYW4gYWRhcHRlciBzbworICoJdGhhdCBpdCBjYW4gYmUgbG9jYXRlZCBieSBhIHVzZXIuIElmIHRoZSByZXF1ZXN0ZWQgdGltZSBpbnRlcnZhbCBmb3IKKyAqCXRoaXMgdGVzdCBoYXMgZWxhcHNlZCwgdGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgZXZlcnl0aGluZyB0aGF0IHdhcyAKKyAqCXRlbXBvcmFyaWx5IHNldHVwIGR1cmluZyB0aGUgbG9jYXRlIE5JQyB0ZXN0LiBUaGlzIGludm9sdmVzIG9mIGNvdXJzZQorICoJYWxzbyBjbG9zaW5nIG9yIG9wZW5pbmcgYW55IGFkYXB0ZXIgc28gdGhhdCB0aGUgaW5pdGlhbCBib2FyZCBzdGF0ZSAKKyAqCWlzIHJlY292ZXJlZC4KKyAqCisgKiBSZXR1cm5zOglOL0EKKyAqCisgKi8KK3ZvaWQgU2tHZUJsaW5rVGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlERVZfTkVUICpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlTS19BQyAqcEFDID0gcE5ldC0+cEFDOworCisJdG9nZ2xlTGVkcyhwTmV0LCBwQUMtPkxlZHNPbik7CisKKwlwQUMtPkxlZHNPbiA9ICFwQUMtPkxlZHNPbjsKKwltb2RfdGltZXIoJnBBQy0+QmxpbmtUaW1lciwgamlmZmllcyArIEhaLzQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJbG9jYXRlRGV2aWNlIC0gc3RhcnQgdGhlIGxvY2F0ZSBOSUMgZmVhdHVyZSBvZiB0aGUgZWxlY3RlZCBhZGFwdGVyIAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGlmIHRoZSB1c2VyIHdhbnQgdG8gbG9jYXRlIGEgcGFydGljdWxhciBOSUMuCisgKglBbGwgTEVEcyBhcmUgcmVndWxhcmx5IHN3aXRjaGVkIG9uIGFuZCBvZmYsIHNvIHRoZSBOSUMgY2FuIGVhc2lseQorICoJYmUgaWRlbnRpZmllZC4KKyAqCisgKiBSZXR1cm5zOgkKKyAqCT09MDoJZXZlcnl0aGluZyBmaW5lLCBubyBlcnJvciwgbG9jYXRlTklDIHRlc3Qgd2FzIHN0YXJ0ZWQKKyAqCSE9MDoJb25lIGxvY2F0ZU5JQyB0ZXN0IHJ1bnMgYWxyZWFkeQorICoKKyAqLworc3RhdGljIGludCBsb2NhdGVEZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJREVWX05FVCAqcE5ldCA9IG5ldGRldl9wcml2KGRldik7CisJU0tfQUMgKnBBQyA9IHBOZXQtPnBBQzsKKworCWlmKCFkYXRhIHx8IGRhdGEgPiAodTMyKShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKSkKKwkJZGF0YSA9ICh1MzIpKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopOworCisJLyogc3RhcnQgYmxpbmtpbmcgKi8KKwlwQUMtPkxlZHNPbiA9IDA7CisJbW9kX3RpbWVyKCZwQUMtPkJsaW5rVGltZXIsIGppZmZpZXMpOworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGRhdGEgKiAxMDAwKTsKKwlkZWxfdGltZXJfc3luYygmcEFDLT5CbGlua1RpbWVyKTsKKwl0b2dnbGVMZWRzKHBOZXQsIDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlnZXRQYXVzZVBhcmFtcyAtIHJldHJpZXZlcyB0aGUgcGF1c2UgcGFyYW1ldGVycworICoKKyAqIERlc2NyaXB0aW9uOgorICoJQWxsIGN1cnJlbnQgcGF1c2UgcGFyYW1ldGVycyBvZiBhIHNlbGVjdGVkIGFkYXB0ZXIgYXJlIHBsYWNlZCAKKyAqCWluIHRoZSBwYXNzZWQgZXRodG9vbF9wYXVzZXBhcmFtIHN0cnVjdHVyZSBhbmQgYXJlIHJldHVybmVkLgorICoKKyAqIFJldHVybnM6CU4vQQorICoKKyAqLworc3RhdGljIHZvaWQgZ2V0UGF1c2VQYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXBhdXNlKSAKK3sKKwlERVZfTkVUCSpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlTS19BQyAqcEFDID0gcE5ldC0+cEFDOworCVNLX0dFUE9SVCAqcFBvcnQgPSAmcEFDLT5HSW5pLkdQW3BOZXQtPlBvcnROcl07CisKKwllcGF1c2UtPnJ4X3BhdXNlID0gKHBQb3J0LT5QRmxvd0N0cmxNb2RlID09IFNLX0ZMT1dfTU9ERV9TWU1NRVRSSUMpIHx8CisJCSAgKHBQb3J0LT5QRmxvd0N0cmxNb2RlID09IFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNKTsKKworCWVwYXVzZS0+dHhfcGF1c2UgPSBlcGF1c2UtPnJ4X3BhdXNlIHx8IChwUG9ydC0+UEZsb3dDdHJsTW9kZSA9PSBTS19GTE9XX01PREVfTE9DX1NFTkQpOworCWVwYXVzZS0+YXV0b25lZyA9IGVwYXVzZS0+cnhfcGF1c2UgfHwgZXBhdXNlLT50eF9wYXVzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJc2V0UGF1c2VQYXJhbXMgLSBjb25maWd1cmVzIHRoZSBwYXVzZSBwYXJhbWV0ZXJzIG9mIGFuIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgUnggb3IgVHggcGF1c2UgcGFyYW1ldGVycyAKKyAqCisgKiBSZXR1cm5zOgorICoJPT0wOglldmVyeXRoaW5nIGZpbmUsIG5vIGVycm9yCisgKgkhPTA6CXRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGVycm9yIGNvZGUgb2YgdGhlIGZhaWx1cmUgCisgKi8KK3N0YXRpYyBpbnQgc2V0UGF1c2VQYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiAsIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwYXVzZSkKK3sKKwlERVZfTkVUCSpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlTS19BQyAqcEFDID0gcE5ldC0+cEFDOworCVNLX0dFUE9SVCAqcFBvcnQgPSAmcEFDLT5HSW5pLkdQW3BOZXQtPlBvcnROcl07CisJdTMyCWluc3RhbmNlID0gcG5taUluc3RhbmNlKHBOZXQpOworCXN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gb2xkOworCXU4CW9sZHNwZWVkID0gcFBvcnQtPlBMaW5rU3BlZWRVc2VkOworCWNoYXIJYnVmWzRdOworCWludAlsZW4gPSAxOworCWludCByZXQ7CisKKwkvKgorCSoqIHdlIGhhdmUgdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNldHRpbmdzIHRvIHNlZSBpZiAKKwkqKiB0aGUgb3BlcmF0b3IgcmVxdWVzdGVkIGFueSBtb2RpZmljYXRpb24gb2YgdGhlIGZsb3cgCisJKiogY29udHJvbCBwYXJhbWV0ZXJzLi4uCisJKi8KKwlnZXRQYXVzZVBhcmFtcyhkZXYsICZvbGQpOworCisJLyoKKwkqKiBwZXJmb3JtIG1vZGlmaWNhdGlvbnMgcmVnYXJkaW5nIHRoZSBjaGFuZ2VzIAorCSoqIHJlcXVlc3RlZCBieSB0aGUgb3BlcmF0b3IKKwkqLworCWlmIChlcGF1c2UtPmF1dG9uZWcgIT0gb2xkLmF1dG9uZWcpIAorCQkqYnVmID0gZXBhdXNlLT5hdXRvbmVnID8gU0tfRkxPV19NT0RFX05PTkUgOiBTS19GTE9XX01PREVfU1lNTUVUUklDOworCWVsc2UgeworCQlpZiAoZXBhdXNlLT5yeF9wYXVzZSAmJiBlcGF1c2UtPnR4X3BhdXNlKSAKKwkJCSpidWYgPSBTS19GTE9XX01PREVfU1lNTUVUUklDOworCQllbHNlIGlmIChlcGF1c2UtPnJ4X3BhdXNlICYmICFlcGF1c2UtPnR4X3BhdXNlKQorCQkJKmJ1ZiA9ICBTS19GTE9XX01PREVfU1lNX09SX1JFTTsKKwkJZWxzZSBpZiAoIWVwYXVzZS0+cnhfcGF1c2UgJiYgZXBhdXNlLT50eF9wYXVzZSkKKwkJCSpidWYgPSAgU0tfRkxPV19NT0RFX0xPQ19TRU5EOworCQllbHNlCisJCQkqYnVmID0gU0tfRkxPV19NT0RFX05PTkU7CisJfQorCisJcmV0ID0gU2tQbm1pU2V0VmFyKHBBQywgcEFDLT5Jb0Jhc2UsIE9JRF9TS0dFX0ZMT1dDVFJMX01PREUsCisJCQkgJmJ1ZiwgJmxlbiwgaW5zdGFuY2UsIHBOZXQtPk5ldE5yKTsKKworCWlmIChyZXQgIT0gU0tfUE5NSV9FUlJfT0spIHsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSAgICgiZXRodG9vbCAoc2s5OGxpbik6IGVycm9yIGNoYW5naW5nIHJ4L3R4IHBhdXNlICglaSlcbiIsIHJldCkpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKgorCSoqIEl0IG1heSBiZSB0aGF0IGF1dG9uZWcgaGFzIGJlZW4gZGlzYWJsZWQhIFRoZXJlZm9yZQorCSoqIHNldCB0aGUgc3BlZWQgdG8gdGhlIHByZXZpb3VzbHkgdXNlZCB2YWx1ZS4uLgorCSovCisJaWYgKCFlcGF1c2UtPmF1dG9uZWcpIHsKKwkJbGVuID0gMTsKKwkJcmV0ID0gU2tQbm1pU2V0VmFyKHBBQywgcEFDLT5Jb0Jhc2UsIE9JRF9TS0dFX1NQRUVEX01PREUsIAorCQkJCSAgICZvbGRzcGVlZCwgJmxlbiwgaW5zdGFuY2UsIHBOZXQtPk5ldE5yKTsKKwkJaWYgKHJldCAhPSBTS19QTk1JX0VSUl9PSykgCisJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9DVFJMLAorCQkJCSAgICgiZXRodG9vbCAoc2s5OGxpbik6IGVycm9yIHNldHRpbmcgc3BlZWQgKCVpKVxuIiwgcmV0KSk7CisJfQorIGVycjoKKyAgICAgICAgcmV0dXJuIHJldCA/IC1FSU8gOiAwOworfQorCitzdHJ1Y3QgZXRodG9vbF9vcHMgU2tHZUV0aHRvb2xPcHMgPSB7CisJLmdldF9zZXR0aW5ncwkJPSBnZXRTZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IHNldFNldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwkJPSBnZXREcml2ZXJJbmZvLAorCS5nZXRfc3RyaW5ncwkJPSBnZXRTdHJpbmdzLAorCS5nZXRfc3RhdHNfY291bnQJPSBnZXRTdGF0c0NvdW50LAorCS5nZXRfZXRodG9vbF9zdGF0cwk9IGdldEV0aHRvb2xTdGF0cywKKwkucGh5c19pZAkJPSBsb2NhdGVEZXZpY2UsCisJLmdldF9wYXVzZXBhcmFtCQk9IGdldFBhdXNlUGFyYW1zLAorCS5zZXRfcGF1c2VwYXJhbQkJPSBzZXRQYXVzZVBhcmFtcywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YjgyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYwpAQCAtMCwwICsxLDUxODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlLmMKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS40NSAkCisgKiBEYXRlOiAgICAgICAJJERhdGU6IDIwMDQvMDIvMTIgMTQ6NDE6MDIgJAorICogUHVycG9zZToJVGhlIG1haW4gZHJpdmVyIHNvdXJjZSBtb2R1bGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJRHJpdmVyIGZvciBNYXJ2ZWxsIFl1a29uIGNoaXBzZXQgYW5kIFN5c0tvbm5lY3QgR2lnYWJpdCBFdGhlcm5ldCAKKyAqICAgICAgU2VydmVyIEFkYXB0ZXJzLgorICoKKyAqCUNyZWF0ZWQgMTAtRmViLTE5OTksIGJhc2VkIG9uIExpbnV4JyBhY2VuaWMuYywgM2M1OXguYyBhbmQKKyAqCVN5c0tvbm5lY3RzIEdFbmVzaXMgU29sYXJpcyBkcml2ZXIKKyAqCUF1dGhvcjogQ2hyaXN0b3BoIEdvb3MgKGNnb29zQHN5c2tvbm5lY3QuZGUpCisgKgkgICAgICAgIE1pcmtvIExpbmRuZXIgKG1saW5kbmVyQHN5c2tvbm5lY3QuZGUpCisgKgorICoJQWRkcmVzcyBhbGwgcXVlc3Rpb24gdG86IGxpbnV4QHN5c2tvbm5lY3QuZGUKKyAqCisgKglUaGUgdGVjaG5pY2FsIG1hbnVhbCBmb3IgdGhlIGFkYXB0ZXJzIGlzIGF2YWlsYWJsZSBmcm9tIFN5c0tvbm5lY3QncworICoJd2ViIHBhZ2VzOiB3d3cuc3lza29ubmVjdC5jb20KKyAqCUdvdG8gIlN1cHBvcnQiIGFuZCBzZWFyY2ggS25vd2xlZGdlIEJhc2UgZm9yICJtYW51YWwiLgorICoJCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQb3NzaWJsZSBjb21waWxlciBvcHRpb25zICgjZGVmaW5lIHh4eCAvIC1EeHh4KToKKyAqCisgKglkZWJ1Z2dpbmcgY2FuIGJlIGVuYWJsZSBieSBjaGFuZ2luZyBTS19ERUJVR19DSEtNT0QgYW5kCisgKglTS19ERUJVR19DSEtDQVQgaW4gbWFrZWZpbGUgKGRlc2NyaWJlZCB0aGVyZSkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqCVRoaXMgaXMgdGhlIG1haW4gbW9kdWxlIG9mIHRoZSBMaW51eCBHRSBkcml2ZXIuCisgKgkKKyAqCUFsbCBzb3VyY2UgZmlsZXMgZXhjZXB0IHNrZ2UuYywgc2tkcnYxc3QuaCwgc2tkcnYybmQuaCBhbmQgc2t0eXBlcy5oCisgKglhcmUgcGFydCBvZiBTeXNLb25uZWN0J3MgQ09NTU9OIE1PRFVMRVMgZm9yIHRoZSBTSy05OHh4IGFkYXB0ZXJzLgorICoJVGhvc2UgYXJlIHVzZWQgZm9yIGRyaXZlcnMgb24gbXVsdGlwbGUgT1MnLCBzbyBzb21lIHRoaW5nIG1heSBzZWVtCisgKgl1bm5lY2Vzc2FyeSBjb21wbGljYXRlZCBvbiBMaW51eC4gUGxlYXNlIGRvIG5vdCB0cnkgdG8gJ2NsZWFuIHVwJworICoJdGhlbSB3aXRob3V0IFZFUlkgZ29vZCByZWFzb25zLCBiZWNhdXNlIHRoaXMgd2lsbCBtYWtlIGl0IG1vcmUKKyAqCWRpZmZpY3VsdCB0byBrZWVwIHRoZSBMaW51eCBkcml2ZXIgaW4gc3luY2hyb25pc2F0aW9uIHdpdGggdGhlCisgKglvdGhlciB2ZXJzaW9ucy4KKyAqCisgKiBJbmNsdWRlIGZpbGUgaGllcmFyY2h5OgorICoKKyAqCTxsaW51eC9tb2R1bGUuaD4KKyAqCisgKgkiaC9za2RydjFzdC5oIgorICoJCTxsaW51eC90eXBlcy5oPgorICoJCTxsaW51eC9rZXJuZWwuaD4KKyAqCQk8bGludXgvc3RyaW5nLmg+CisgKgkJPGxpbnV4L2Vycm5vLmg+CisgKgkJPGxpbnV4L2lvcG9ydC5oPgorICoJCTxsaW51eC9zbGFiLmg+CisgKgkJPGxpbnV4L2ludGVycnVwdC5oPgorICoJCTxsaW51eC9wY2kuaD4KKyAqCQk8bGludXgvYml0b3BzLmg+CisgKgkJPGFzbS9ieXRlb3JkZXIuaD4KKyAqCQk8YXNtL2lvLmg+CisgKgkJPGxpbnV4L25ldGRldmljZS5oPgorICoJCTxsaW51eC9ldGhlcmRldmljZS5oPgorICoJCTxsaW51eC9za2J1ZmYuaD4KKyAqCSAgICB0aG9zZSB0aHJlZSBkZXBlbmRpbmcgb24ga2VybmVsIHZlcnNpb24gdXNlZDoKKyAqCQk8bGludXgvYmlvczMyLmg+CisgKgkJPGxpbnV4L2luaXQuaD4KKyAqCQk8YXNtL3VhY2Nlc3MuaD4KKyAqCQk8bmV0L2NoZWNrc3VtLmg+CisgKgorICoJCSJoL3NrZXJyb3IuaCIKKyAqCQkiaC9za2RlYnVnLmgiCisgKgkJImgvc2t0eXBlcy5oIgorICoJCSJoL2xtODAuaCIKKyAqCQkiaC94bWFjX2lpLmgiCisgKgorICogICAgICAiaC9za2RydjJuZC5oIgorICoJCSJoL3NrcXVldWUuaCIKKyAqCQkiaC9za2dlaHd0LmgiCisgKgkJImgvc2t0aW1lci5oIgorICoJCSJoL3NraTJjLmgiCisgKgkJImgvc2tnZXBubWkuaCIKKyAqCQkiaC9za3ZwZC5oIgorICoJCSJoL3NrZ2Vody5oIgorICoJCSJoL3NrZ2Vpbml0LmgiCisgKgkJImgvc2thZGRyLmgiCisgKgkJImgvc2tnZXNpcnEuaCIKKyAqCQkiaC9za2NzdW0uaCIKKyAqCQkiaC9za3JsbXQuaCIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZQkiaC9za3ZlcnNpb24uaCIKKworI2luY2x1ZGUJPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUJPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZQk8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgCTxsaW51eC9wcm9jX2ZzLmg+CisKKyNpbmNsdWRlCSJoL3NrZHJ2MXN0LmgiCisjaW5jbHVkZQkiaC9za2RydjJuZC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlZmluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBmb3IgZGVidWdpbmcgb24geDg2IG9ubHkgKi8KKy8qICNkZWZpbmUgQlJFQUtQT0lOVCgpIGFzbSgiIGludCAkMyIpOyAqLworCisvKiB1c2UgdGhlIHRyYW5zbWl0IGh3IGNoZWNrc3VtIGRyaXZlciBmdW5jdGlvbmFsaXR5ICovCisjZGVmaW5lIFVTRV9TS19UWF9DSEVDS1NVTQorCisvKiB1c2UgdGhlIHJlY2VpdmUgaHcgY2hlY2tzdW0gZHJpdmVyIGZ1bmN0aW9uYWxpdHkgKi8KKyNkZWZpbmUgVVNFX1NLX1JYX0NIRUNLU1VNCisKKy8qIHVzZSB0aGUgc2NhdHRlci1nYXRoZXIgZnVuY3Rpb25hbGl0eSB3aXRoIHNlbmRmaWxlKCkgKi8KKyNkZWZpbmUgU0tfWkVST0NPUFkKKworLyogdXNlIG9mIGEgdHJhbnNtaXQgY29tcGxldGUgaW50ZXJydXB0ICovCisjZGVmaW5lIFVTRV9UWF9DT01QTEVURQorCisvKgorICogdGhyZXNob2xkIGZvciBjb3B5aW5nIHNtYWxsIHJlY2VpdmUgZnJhbWVzCisgKiBzZXQgdG8gMCB0byBhdm9pZCBjb3B5aW5nLCBzZXQgdG8gOTAwMSB0byBjb3B5IGFsbCBmcmFtZXMKKyAqLworI2RlZmluZSBTS19DT1BZX1RIUkVTSE9MRAk1MAorCisvKiBudW1iZXIgb2YgYWRhcHRlcnMgdGhhdCBjYW4gYmUgY29uZmlndXJlZCB2aWEgY29tbWFuZCBsaW5lIHBhcmFtcyAqLworI2RlZmluZSBTS19NQVhfQ0FSRF9QQVJBTQkxNgorCisKKworLyoKKyAqIHVzZSB0aG9zZSBkZWZpbmVzIGZvciBhIGNvbXBpbGUtaW4gdmVyc2lvbiBvZiB0aGUgZHJpdmVyIGluc3RlYWQKKyAqIG9mIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzCisgKi8KKy8vICNkZWZpbmUgTElOS19TUEVFRF9BCXsiQXV0byIsIH0KKy8vICNkZWZpbmUgTElOS19TUEVFRF9CCXsiQXV0byIsIH0KKy8vICNkZWZpbmUgQVVUT19ORUdfQQl7IlNlbnNlIiwgfQorLy8gI2RlZmluZSBBVVRPX05FR19CCXsiU2Vuc2UiLCB9CisvLyAjZGVmaW5lIERVUF9DQVBfQQl7IkJvdGgiLCB9CisvLyAjZGVmaW5lIERVUF9DQVBfQgl7IkJvdGgiLCB9CisvLyAjZGVmaW5lIEZMT1dfQ1RSTF9BCXsiU3ltT3JSZW0iLCB9CisvLyAjZGVmaW5lIEZMT1dfQ1RSTF9CCXsiU3ltT3JSZW0iLCB9CisvLyAjZGVmaW5lIFJPTEVfQQl7IkF1dG8iLCB9CisvLyAjZGVmaW5lIFJPTEVfQgl7IkF1dG8iLCB9CisvLyAjZGVmaW5lIFBSRUZfUE9SVAl7IkEiLCB9CisvLyAjZGVmaW5lIENPTl9UWVBFIAl7IkF1dG8iLCB9CisvLyAjZGVmaW5lIFJMTVRfTU9ERQl7IkNoZWNrTGlua1N0YXRlIiwgfQorCisjZGVmaW5lIERFVl9LRlJFRV9TS0Ioc2tiKSBkZXZfa2ZyZWVfc2tiKHNrYikKKyNkZWZpbmUgREVWX0tGUkVFX1NLQl9JUlEoc2tiKSBkZXZfa2ZyZWVfc2tiX2lycShza2IpCisjZGVmaW5lIERFVl9LRlJFRV9TS0JfQU5ZKHNrYikgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKQorCisKKy8qIFNldCBibGluayBtb2RlKi8KKyNkZWZpbmUgT0VNX0NPTkZJR19WQUxVRSAoCVNLX0FDVF9MRURfQkxJTksgfCBcCisJCQkJU0tfRFVQX0xFRF9OT1JNQUwgfCBcCisJCQkJU0tfTEVEX0xJTksxMDBfT04pCisKKworLyogSXNyIHJldHVybiB2YWx1ZSAqLworI2RlZmluZSBTa0lzclJldFZhcglpcnFyZXR1cm5fdAorI2RlZmluZSBTa0lzclJldE5vbmUJSVJRX05PTkUKKyNkZWZpbmUgU2tJc3JSZXRIYW5kbGVkCUlSUV9IQU5ETEVECisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBMb2NhbCBGdW5jdGlvbiBQcm90b3R5cGVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQJRnJlZVJlc291cmNlcyhzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2KTsKK3N0YXRpYyBpbnQJU2tHZUJvYXJkSW5pdChzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2LCBTS19BQyAqcEFDKTsKK3N0YXRpYyBTS19CT09MCUJvYXJkQWxsb2NNZW0oU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZAlCb2FyZEZyZWVNZW0oU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZAlCb2FyZEluaXRNZW0oU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZAlTZXR1cFJpbmcoU0tfQUMqLCB2b2lkKiwgdWludHB0cl90LCBSWEQqKiwgUlhEKiosIFJYRCoqLCBpbnQqLCBTS19CT09MKTsKK3N0YXRpYyBTa0lzclJldFZhcglTa0dlSXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncyk7CitzdGF0aWMgU2tJc3JSZXRWYXIJU2tHZUlzck9uZVBvcnQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzKTsKK3N0YXRpYyBpbnQJU2tHZU9wZW4oc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldik7CitzdGF0aWMgaW50CVNrR2VDbG9zZShzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2KTsKK3N0YXRpYyBpbnQJU2tHZVhtaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldik7CitzdGF0aWMgaW50CVNrR2VTZXRNYWNBZGRyKHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYsIHZvaWQgKnApOworc3RhdGljIHZvaWQJU2tHZVNldFJ4TW9kZShzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QJbmV0X2RldmljZV9zdGF0cyAqU2tHZVN0YXRzKHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYpOworc3RhdGljIGludAlTa0dlSW9jdGwoc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZAlHZXRDb25maWd1cmF0aW9uKFNLX0FDKik7CitzdGF0aWMgdm9pZAlQcm9kdWN0U3RyKFNLX0FDKik7CitzdGF0aWMgaW50CVhtaXRGcmFtZShTS19BQyosIFRYX1BPUlQqLCBzdHJ1Y3Qgc2tfYnVmZiopOworc3RhdGljIHZvaWQJRnJlZVR4RGVzY3JpcHRvcnMoU0tfQUMqcEFDLCBUWF9QT1JUKik7CitzdGF0aWMgdm9pZAlGaWxsUnhSaW5nKFNLX0FDKiwgUlhfUE9SVCopOworc3RhdGljIFNLX0JPT0wJRmlsbFJ4RGVzY3JpcHRvcihTS19BQyosIFJYX1BPUlQqKTsKK3N0YXRpYyB2b2lkCVJlY2VpdmVJcnEoU0tfQUMqLCBSWF9QT1JUKiwgU0tfQk9PTCk7CitzdGF0aWMgdm9pZAlDbGVhckFuZFN0YXJ0UngoU0tfQUMqLCBpbnQpOworc3RhdGljIHZvaWQJQ2xlYXJUeElycShTS19BQyosIGludCwgaW50KTsKK3N0YXRpYyB2b2lkCUNsZWFyUnhSaW5nKFNLX0FDKiwgUlhfUE9SVCopOworc3RhdGljIHZvaWQJQ2xlYXJUeFJpbmcoU0tfQUMqLCBUWF9QT1JUKik7CitzdGF0aWMgaW50CVNrR2VDaGFuZ2VNdHUoc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldiwgaW50IG5ld19tdHUpOworc3RhdGljIHZvaWQJUG9ydFJlSW5pdEJtdShTS19BQyosIGludCk7CitzdGF0aWMgaW50CVNrR2VJb2NNaWIoREVWX05FVCosIHVuc2lnbmVkIGludCwgaW50KTsKK3N0YXRpYyBpbnQJU2tHZUluaXRQQ0koU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZAlTdGFydERydkNsZWFudXBUaW1lcihTS19BQyAqcEFDKTsKK3N0YXRpYyB2b2lkCVN0b3BEcnZDbGVhbnVwVGltZXIoU0tfQUMgKnBBQyk7CitzdGF0aWMgaW50CVhtaXRGcmFtZVNHKFNLX0FDKiwgVFhfUE9SVCosIHN0cnVjdCBza19idWZmKik7CisKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKK3N0YXRpYyBTS19VMzIgICBQYXJzZURldmljZU5ickZyb21TbG90TmFtZShjb25zdCBjaGFyICpTbG90TmFtZSk7CitzdGF0aWMgaW50ICAgICAgU2tEcnZJbml0QWRhcHRlcihTS19BQyAqcEFDLCBpbnQgZGV2TmJyKTsKK3N0YXRpYyBpbnQgICAgICBTa0RydkRlSW5pdEFkYXB0ZXIoU0tfQUMgKnBBQywgaW50IGRldk5icik7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBFeHRlcm4gRnVuY3Rpb24gUHJvdG90eXBlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgY2hhciAJU0tSb290TmFtZVtdID0gInNrOThsaW4iOworc3RhdGljIHN0cnVjdAkJcHJvY19kaXJfZW50cnkgKnBTa1Jvb3REaXI7CitleHRlcm4gc3RydWN0CWZpbGVfb3BlcmF0aW9ucyBza19wcm9jX2ZvcHM7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBTa0dlUHJvY0NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGU7CisKKwlpZiAocFNrUm9vdERpciAmJiAKKwkgICAgKHBlID0gY3JlYXRlX3Byb2NfZW50cnkoZGV2LT5uYW1lLCBTX0lSVUdPLCBwU2tSb290RGlyKSkpIHsKKwkJcGUtPnByb2NfZm9wcyA9ICZza19wcm9jX2ZvcHM7CisJCXBlLT5kYXRhID0gZGV2OworCQlwZS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwl9Cit9CisgCitzdGF0aWMgaW5saW5lIHZvaWQgU2tHZVByb2NSZW1vdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAocFNrUm9vdERpcikKKwkJcmVtb3ZlX3Byb2NfZW50cnkoZGV2LT5uYW1lLCBwU2tSb290RGlyKTsKK30KKworZXh0ZXJuIHZvaWQgU2tEaW1FbmFibGVNb2RlcmF0aW9uSWZOZWVkZWQoU0tfQUMgKnBBQyk7CQorZXh0ZXJuIHZvaWQgU2tEaW1EaXNwbGF5TW9kZXJhdGlvblNldHRpbmdzKFNLX0FDICpwQUMpOworZXh0ZXJuIHZvaWQgU2tEaW1TdGFydE1vZGVyYXRpb25UaW1lcihTS19BQyAqcEFDKTsKK2V4dGVybiB2b2lkIFNrRGltTW9kZXJhdGUoU0tfQUMgKnBBQyk7CitleHRlcm4gdm9pZCBTa0dlQmxpbmtUaW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkCUR1bXBNc2coc3RydWN0IHNrX2J1ZmYqLCBjaGFyKik7CitzdGF0aWMgdm9pZAlEdW1wRGF0YShjaGFyKiwgaW50KTsKK3N0YXRpYyB2b2lkCUR1bXBMb25nKGNoYXIqLCBpbnQpOworI2VuZGlmCisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFNLX0JPT0wgRG9QcmludEludGVyZmFjZUNoYW5nZSA9IFNLX1RSVUU7CitleHRlcm4gIHN0cnVjdCBldGh0b29sX29wcyBTa0dlRXRodG9vbE9wczsKKworLyogbG9jYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWludHB0cl90IFR4UXVldWVBZGRyW1NLX01BWF9NQUNTXVsyXSA9IHt7MHg2ODAsIDB4NjAwfSx7MHg3ODAsIDB4NzAwfX07CitzdGF0aWMgdWludHB0cl90IFJ4UXVldWVBZGRyW1NLX01BWF9NQUNTXSA9IHsweDQwMCwgMHg0ODB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJU2tHZUluaXRQQ0kgLSBJbml0IHRoZSBQQ0kgcmVzb3VyY2VzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIFBDSSByZXNvdXJjZXMgYW5kIElPCisgKgorICogUmV0dXJuczogTi9BCisgKgkKKyAqLworaW50IFNrR2VJbml0UENJKFNLX0FDICpwQUMpCit7CisJc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldiA9IHBBQy0+ZGV2WzBdOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcEFDLT5QY2lEZXY7CisJaW50IHJldHZhbDsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSAhPSAwKSB7CisJCXJldHVybiAxOworCX0KKworCWRldi0+bWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIHBBQy0+TmFtZSkgIT0gMCkgeworCQlyZXR2YWwgPSAyOworCQlnb3RvIG91dF9kaXNhYmxlOworCX0KKworI2lmZGVmIFNLX0JJR19FTkRJQU4KKwkvKgorCSAqIE9uIGJpZyBlbmRpYW4gbWFjaGluZXMsIHdlIHVzZSB0aGUgYWRhcHRlcidzIGFpYmlsaXR5IG9mCisJICogcmVhZGluZyB0aGUgZGVzY3JpcHRvcnMgYXMgYmlnIGVuZGlhbi4KKwkgKi8KKwl7CisJCVNLX1UzMgkJb3VyMjsKKwkJU2tQY2lSZWFkQ2ZnRFdvcmQocEFDLCBQQ0lfT1VSX1JFR18yLCAmb3VyMik7CisJCW91cjIgfD0gUENJX1JFVl9ERVNDOworCQlTa1BjaVdyaXRlQ2ZnRFdvcmQocEFDLCBQQ0lfT1VSX1JFR18yLCBvdXIyKTsKKwl9CisjZW5kaWYKKworCS8qCisJICogUmVtYXAgdGhlIHJlZ3MgaW50byBrZXJuZWwgc3BhY2UuCisJICovCisJcEFDLT5Jb0Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoZGV2LT5tZW1fc3RhcnQsIDB4NDAwMCk7CisKKwlpZiAoIXBBQy0+SW9CYXNlKXsKKwkJcmV0dmFsID0gMzsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisKKwlyZXR1cm4gMDsKKworIG91dF9yZWxlYXNlOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Cisgb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByZXR2YWw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCUZyZWVSZXNvdXJjZXMgLSByZWxlYXNlIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgdGhlIElSUSwgdW5tYXBzIHRoZSBJTyBhbmQKKyAqCWZyZWVzIHRoZSBkZXNyaXB0b3IgcmluZy4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqCQorICovCitzdGF0aWMgdm9pZCBGcmVlUmVzb3VyY2VzKHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYpCit7CitTS19VMzIgQWxsb2NGbGFnOworREVWX05FVAkJKnBOZXQ7CitTS19BQwkJKnBBQzsKKworCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXBBQyA9IHBOZXQtPnBBQzsKKwlBbGxvY0ZsYWcgPSBwQUMtPkFsbG9jRmxhZzsKKwlpZiAocEFDLT5QY2lEZXYpIHsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwQUMtPlBjaURldik7CisJfQorCWlmIChBbGxvY0ZsYWcgJiBTS19BTExPQ19JUlEpIHsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJfQorCWlmIChwQUMtPklvQmFzZSkgeworCQlpb3VubWFwKHBBQy0+SW9CYXNlKTsKKwl9CisJaWYgKHBBQy0+cERlc2NyTWVtKSB7CisJCUJvYXJkRnJlZU1lbShwQUMpOworCX0KKwkKK30gLyogRnJlZVJlc291cmNlcyAqLworCitNT0RVTEVfQVVUSE9SKCJNaXJrbyBMaW5kbmVyIDxtbGluZG5lckBzeXNrb25uZWN0LmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTeXNLb25uZWN0IFNLLU5FVCBHaWdhYml0IEV0aGVybmV0IFNLLTk4eHggZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBMSU5LX1NQRUVEX0EKK3N0YXRpYyBjaGFyICpTcGVlZF9BW1NLX01BWF9DQVJEX1BBUkFNXSA9IExJTktfU1BFRUQ7CisjZWxzZQorc3RhdGljIGNoYXIgKlNwZWVkX0FbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBMSU5LX1NQRUVEX0IKK3N0YXRpYyBjaGFyICpTcGVlZF9CW1NLX01BWF9DQVJEX1BBUkFNXSA9IExJTktfU1BFRUQ7CisjZWxzZQorc3RhdGljIGNoYXIgKlNwZWVkX0JbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBBVVRPX05FR19BCitzdGF0aWMgY2hhciAqQXV0b05lZ19BW1NLX01BWF9DQVJEX1BBUkFNXSA9IEFVVE9fTkVHX0E7CisjZWxzZQorc3RhdGljIGNoYXIgKkF1dG9OZWdfQVtTS19NQVhfQ0FSRF9QQVJBTV0gPSB7IiIsIH07CisjZW5kaWYKKworI2lmZGVmIERVUF9DQVBfQQorc3RhdGljIGNoYXIgKkR1cENhcF9BW1NLX01BWF9DQVJEX1BBUkFNXSA9IERVUF9DQVBfQTsKKyNlbHNlCitzdGF0aWMgY2hhciAqRHVwQ2FwX0FbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBGTE9XX0NUUkxfQQorc3RhdGljIGNoYXIgKkZsb3dDdHJsX0FbU0tfTUFYX0NBUkRfUEFSQU1dID0gRkxPV19DVFJMX0E7CisjZWxzZQorc3RhdGljIGNoYXIgKkZsb3dDdHJsX0FbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBST0xFX0EKK3N0YXRpYyBjaGFyICpSb2xlX0FbU0tfTUFYX0NBUkRfUEFSQU1dID0gUk9MRV9BOworI2Vsc2UKK3N0YXRpYyBjaGFyICpSb2xlX0FbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBBVVRPX05FR19CCitzdGF0aWMgY2hhciAqQXV0b05lZ19CW1NLX01BWF9DQVJEX1BBUkFNXSA9IEFVVE9fTkVHX0I7CisjZWxzZQorc3RhdGljIGNoYXIgKkF1dG9OZWdfQltTS19NQVhfQ0FSRF9QQVJBTV0gPSB7IiIsIH07CisjZW5kaWYKKworI2lmZGVmIERVUF9DQVBfQgorc3RhdGljIGNoYXIgKkR1cENhcF9CW1NLX01BWF9DQVJEX1BBUkFNXSA9IERVUF9DQVBfQjsKKyNlbHNlCitzdGF0aWMgY2hhciAqRHVwQ2FwX0JbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBGTE9XX0NUUkxfQgorc3RhdGljIGNoYXIgKkZsb3dDdHJsX0JbU0tfTUFYX0NBUkRfUEFSQU1dID0gRkxPV19DVFJMX0I7CisjZWxzZQorc3RhdGljIGNoYXIgKkZsb3dDdHJsX0JbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBST0xFX0IKK3N0YXRpYyBjaGFyICpSb2xlX0JbU0tfTUFYX0NBUkRfUEFSQU1dID0gUk9MRV9COworI2Vsc2UKK3N0YXRpYyBjaGFyICpSb2xlX0JbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBDT05fVFlQRQorc3RhdGljIGNoYXIgKkNvblR5cGVbU0tfTUFYX0NBUkRfUEFSQU1dID0gQ09OX1RZUEU7CisjZWxzZQorc3RhdGljIGNoYXIgKkNvblR5cGVbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBQUkVGX1BPUlQKK3N0YXRpYyBjaGFyICpQcmVmUG9ydFtTS19NQVhfQ0FSRF9QQVJBTV0gPSBQUkVGX1BPUlQ7CisjZWxzZQorc3RhdGljIGNoYXIgKlByZWZQb3J0W1NLX01BWF9DQVJEX1BBUkFNXSA9IHsiIiwgfTsKKyNlbmRpZgorCisjaWZkZWYgUkxNVF9NT0RFCitzdGF0aWMgY2hhciAqUmxtdE1vZGVbU0tfTUFYX0NBUkRfUEFSQU1dID0gUkxNVF9NT0RFOworI2Vsc2UKK3N0YXRpYyBjaGFyICpSbG10TW9kZVtTS19NQVhfQ0FSRF9QQVJBTV0gPSB7IiIsIH07CisjZW5kaWYKKworc3RhdGljIGludCAgIEludHNQZXJTZWNbU0tfTUFYX0NBUkRfUEFSQU1dOworc3RhdGljIGNoYXIgKk1vZGVyYXRpb25bU0tfTUFYX0NBUkRfUEFSQU1dOworc3RhdGljIGNoYXIgKk1vZGVyYXRpb25NYXNrW1NLX01BWF9DQVJEX1BBUkFNXTsKK3N0YXRpYyBjaGFyICpBdXRvU2l6aW5nW1NLX01BWF9DQVJEX1BBUkFNXTsKK3N0YXRpYyBjaGFyICpTdGF0c1tTS19NQVhfQ0FSRF9QQVJBTV07CisKK21vZHVsZV9wYXJhbV9hcnJheShTcGVlZF9BLCBjaGFycCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoU3BlZWRfQiwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KEF1dG9OZWdfQSwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KEF1dG9OZWdfQiwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KER1cENhcF9BLCBjaGFycCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoRHVwQ2FwX0IsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShGbG93Q3RybF9BLCBjaGFycCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoRmxvd0N0cmxfQiwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KFJvbGVfQSwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KFJvbGVfQiwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KENvblR5cGUsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShQcmVmUG9ydCwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KFJsbXRNb2RlLCBjaGFycCwgTlVMTCwgMCk7CisvKiB1c2VkIGZvciBpbnRlcnJ1cHQgbW9kZXJhdGlvbiAqLworbW9kdWxlX3BhcmFtX2FycmF5KEludHNQZXJTZWMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoTW9kZXJhdGlvbiwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KFN0YXRzLCBjaGFycCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoTW9kZXJhdGlvbk1hc2ssIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShBdXRvU2l6aW5nLCBjaGFycCwgTlVMTCwgMCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlTa0dlQm9hcmRJbml0IC0gZG8gbGV2ZWwgMCBhbmQgMSBpbml0aWFsaXphdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyB0aGUgYm9hcmQgaGFyZHdhcmUgZm9yIHJ1bm5pbmcuIFRoZSBkZXNyaXB0b3IKKyAqCXJpbmcgaXMgc2V0IHVwLCB0aGUgSVJRIGlzIGFsbG9jYXRlZCBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKKyAqCWFyZSBleGFtaW5lZC4KKyAqCisgKiBSZXR1cm5zOgorICoJMCwgaWYgZXZlcnl0aGluZyBpcyBvaworICoJIT0wLCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faW5pdCBTa0dlQm9hcmRJbml0KHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYsIFNLX0FDICpwQUMpCit7CitzaG9ydAlpOwordW5zaWduZWQgbG9uZyBGbGFnczsKK2NoYXIJKkRlc2NyU3RyaW5nID0gInNrOThsaW46IERyaXZlciBmb3IgTGludXgiOyAvKiB0aGlzIGlzIGdpdmVuIHRvIFBOTUkgKi8KK2NoYXIJKlZlclN0cgk9IFZFUl9TVFJJTkc7CitpbnQJUmV0OwkJCS8qIHJldHVybiBjb2RlIG9mIHJlcXVlc3RfaXJxICovCitTS19CT09MCUR1YWxOZXQ7CisKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiSW9CYXNlOiAlMDhsWFxuIiwgKHVuc2lnbmVkIGxvbmcpcEFDLT5Jb0Jhc2UpKTsKKwlmb3IgKGk9MDsgaTxTS19NQVhfTUFDUzsgaSsrKSB7CisJCXBBQy0+VHhQb3J0W2ldWzBdLkh3QWRkciA9IHBBQy0+SW9CYXNlICsgVHhRdWV1ZUFkZHJbaV1bMF07CisJCXBBQy0+VHhQb3J0W2ldWzBdLlBvcnRJbmRleCA9IGk7CisJCXBBQy0+UnhQb3J0W2ldLkh3QWRkciA9IHBBQy0+SW9CYXNlICsgUnhRdWV1ZUFkZHJbaV07CisJCXBBQy0+UnhQb3J0W2ldLlBvcnRJbmRleCA9IGk7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgbXV0ZXhlcyAqLworCWZvciAoaT0wOyBpPFNLX01BWF9NQUNTOyBpKyspIHsKKwkJc3Bpbl9sb2NrX2luaXQoJnBBQy0+VHhQb3J0W2ldWzBdLlR4RGVzUmluZ0xvY2spOworCQlzcGluX2xvY2tfaW5pdCgmcEFDLT5SeFBvcnRbaV0uUnhEZXNSaW5nTG9jayk7CisJfQorCXNwaW5fbG9ja19pbml0KCZwQUMtPlNsb3dQYXRoTG9jayk7CisKKwkvKiBzZXR1cCBwaHlfaWQgYmxpbmsgdGltZXIgKi8KKwlwQUMtPkJsaW5rVGltZXIuZnVuY3Rpb24gPSBTa0dlQmxpbmtUaW1lcjsKKwlwQUMtPkJsaW5rVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJaW5pdF90aW1lcigmcEFDLT5CbGlua1RpbWVyKTsKKworCS8qIGxldmVsIDAgaW5pdCBjb21tb24gbW9kdWxlcyBoZXJlICovCisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJLyogRG9lcyBhIFJFU0VUIG9uIGJvYXJkIC4uLiovCisJaWYgKFNrR2VJbml0KHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfREFUQSkgIT0gMCkgeworCQlwcmludGsoIkhXSW5pdCAoMCkgZmFpbGVkLlxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCXJldHVybigtRUFHQUlOKTsKKwl9CisJU2tJMmNJbml0KCAgcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9EQVRBKTsKKwlTa0V2ZW50SW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0RBVEEpOworCVNrUG5taUluaXQoIHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfREFUQSk7CisJU2tBZGRySW5pdCggcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9EQVRBKTsKKwlTa1JsbXRJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0RBVEEpOworCVNrVGltZXJJbml0KHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfREFUQSk7CisKKwlwQUMtPkJvYXJkTGV2ZWwgPSBTS19JTklUX0RBVEE7CisJcEFDLT5SeEJ1ZlNpemUgID0gRVRIX0JVRl9TSVpFOworCisJU0tfUE5NSV9TRVRfRFJJVkVSX0RFU0NSKHBBQywgRGVzY3JTdHJpbmcpOworCVNLX1BOTUlfU0VUX0RSSVZFUl9WRVIocEFDLCBWZXJTdHIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKworCS8qIGxldmVsIDEgaW5pdCBjb21tb24gbW9kdWxlcyBoZXJlIChIVyBpbml0KSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCWlmIChTa0dlSW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKSAhPSAwKSB7CisJCXByaW50aygic2s5OGxpbjogSFdJbml0ICgxKSBmYWlsZWQuXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkJcmV0dXJuKC1FQUdBSU4pOworCX0KKwlTa0kyY0luaXQoICBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa0V2ZW50SW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa1BubWlJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa0FkZHJJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa1JsbXRJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa1RpbWVySW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKworCS8qIFNldCBjaGlwc2V0IHR5cGUgc3VwcG9ydCAqLworCXBBQy0+Q2hpcHNldFR5cGUgPSAwOworCWlmICgocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04pIHx8CisJCShwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9ZVUtPTl9MSVRFKSkgeworCQlwQUMtPkNoaXBzZXRUeXBlID0gMTsKKwl9CisKKwlHZXRDb25maWd1cmF0aW9uKHBBQyk7CisJaWYgKHBBQy0+UmxtdE5ldHMgPT0gMikgeworCQlwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgPSBTS19NVUxfTElOSzsKKwl9CisKKwlwQUMtPkJvYXJkTGV2ZWwgPSBTS19JTklUX0lPOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisKKwlpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIpIHsKKwkJIFJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBTa0dlSXNyLCBTQV9TSElSUSwgcEFDLT5OYW1lLCBkZXYpOworCX0gZWxzZSBpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDEpIHsKKwkJUmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIFNrR2VJc3JPbmVQb3J0LCBTQV9TSElSUSwKKwkJCXBBQy0+TmFtZSwgZGV2KTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzazk4bGluOiBJbGxlZ2FsIG51bWJlciBvZiBwb3J0czogJWRcbiIsCisJCSAgICAgICBwQUMtPkdJbmkuR0lNYWNzRm91bmQpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZiAoUmV0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNrOThsaW46IFJlcXVlc3RlZCBJUlEgJWQgaXMgYnVzeS5cbiIsCisJCSAgICAgICBkZXYtPmlycSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlwQUMtPkFsbG9jRmxhZyB8PSBTS19BTExPQ19JUlE7CisKKwkvKiBBbGxvYyBtZW1vcnkgZm9yIHRoaXMgYm9hcmQgKE1lbSBmb3IgUnhEL1R4RCkgOiAqLworCWlmKCFCb2FyZEFsbG9jTWVtKHBBQykpIHsKKwkJcHJpbnRrKCJObyBtZW1vcnkgZm9yIGRlc2NyaXB0b3IgcmluZ3MuXG4iKTsKKyAgICAgICAJCXJldHVybigtRUFHQUlOKTsKKwl9CisKKwlTa0NzU2V0UmVjZWl2ZUZsYWdzKHBBQywKKwkJU0tDU19QUk9UT19JUCB8IFNLQ1NfUFJPVE9fVENQIHwgU0tDU19QUk9UT19VRFAsCisJCSZwQUMtPkNzT2ZzMSwgJnBBQy0+Q3NPZnMyLCAwKTsKKwlwQUMtPkNzT2ZzID0gKHBBQy0+Q3NPZnMyIDw8IDE2KSB8IHBBQy0+Q3NPZnMxOworCisJQm9hcmRJbml0TWVtKHBBQyk7CisJLyogdHNjaGlsbGluZzogTmV3IGNvbW1vbiBmdW5jdGlvbiB3aXRoIG1pbmltdW0gc2l6ZSBjaGVjay4gKi8KKwlEdWFsTmV0ID0gU0tfRkFMU0U7CisJaWYgKHBBQy0+UmxtdE5ldHMgPT0gMikgeworCQlEdWFsTmV0ID0gU0tfVFJVRTsKKwl9CisJCisJaWYgKFNrR2VJbml0QXNzaWduUmFtVG9RdWV1ZXMoCisJCXBBQywKKwkJcEFDLT5BY3RpdmVQb3J0LAorCQlEdWFsTmV0KSkgeworCQlCb2FyZEZyZWVNZW0ocEFDKTsKKwkJcHJpbnRrKCJzazk4bGluOiBTa0dlSW5pdEFzc2lnblJhbVRvUXVldWVzIGZhaWxlZC5cbiIpOworCQlyZXR1cm4oLUVBR0FJTik7CisJfQorCisJcmV0dXJuICgwKTsKK30gLyogU2tHZUJvYXJkSW5pdCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlCb2FyZEFsbG9jTWVtIC0gYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIGRlc2NyaXB0b3IgcmluZ3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHRoZSBtZW1vcnkgZm9yIGFsbCBkZXNjcmlwdG9yIHJpbmdzLgorICoJRWFjaCByaW5nIGlzIGFsaWduZWQgZm9yIHRoZSBkZXNyaXB0b3IgYWxpZ25tZW50IGFuZCBubyByaW5nCisgKgloYXMgYSA0IEdCeXRlIGJvdW5kYXJ5IGluIGl0IChiZWNhdXNlIHRoZSB1cHBlciAzMiBiaXQgbXVzdAorICoJYmUgY29uc3RhbnQgZm9yIGFsbCBkZXNjcmlwdGlvcnMgaW4gb25lIHJpbmdzKS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfVFJVRSwgaWYgYWxsIG1lbW9yeSBjb3VsZCBiZSBhbGxvY2F0ZWQKKyAqCVNLX0ZBTFNFLCBpZiBub3QKKyAqLworc3RhdGljIFNLX0JPT0wgQm9hcmRBbGxvY01lbSgKK1NLX0FDCSpwQUMpCit7CitjYWRkcl90CQlwRGVzY3JNZW07CS8qIHBvaW50ZXIgdG8gZGVzY3JpcHRvciBtZW1vcnkgYXJlYSAqLworc2l6ZV90CQlBbGxvY0xlbmd0aDsJLyogbGVuZ3RoIG9mIGNvbXBsZXRlIGRlc2NyaXB0b3IgYXJlYSAqLworaW50CQlpOwkJLyogbG9vcCBjb3VudGVyICovCit1bnNpZ25lZCBsb25nCUJ1c0FkZHI7CisKKwkKKwkvKiByaW5ncyBwbHVzIG9uZSBmb3IgYWxpZ25tZW50IChkbyBub3QgY3Jvc3MgNCBHQiBib3VuZGFyeSkgKi8KKwkvKiBSWF9SSU5HX1NJWkUgaXMgYXNzdW1lZCBiaWdnZXIgdGhhbiBUWF9SSU5HX1NJWkUgKi8KKyNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKKwlBbGxvY0xlbmd0aCA9IChSWF9SSU5HX1NJWkUgKyBUWF9SSU5HX1NJWkUpICogcEFDLT5HSW5pLkdJTWFjc0ZvdW5kICsgODsKKyNlbHNlCisJQWxsb2NMZW5ndGggPSAoUlhfUklOR19TSVpFICsgVFhfUklOR19TSVpFKSAqIHBBQy0+R0luaS5HSU1hY3NGb3VuZAorCQkrIFJYX1JJTkdfU0laRSArIDg7CisjZW5kaWYKKworCXBEZXNjck1lbSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBBQy0+UGNpRGV2LCBBbGxvY0xlbmd0aCwKKwkJCQkJICZwQUMtPnBEZXNjck1lbURNQSk7CisKKwlpZiAocERlc2NyTWVtID09IE5VTEwpIHsKKwkJcmV0dXJuIChTS19GQUxTRSk7CisJfQorCXBBQy0+cERlc2NyTWVtID0gcERlc2NyTWVtOworCUJ1c0FkZHIgPSAodW5zaWduZWQgbG9uZykgcEFDLT5wRGVzY3JNZW1ETUE7CisKKwkvKiBEZXNjcmlwdG9ycyBuZWVkIDggYnl0ZSBhbGlnbm1lbnQsIGFuZCB0aGlzIGlzIGVuc3VyZWQKKwkgKiBieSBwY2lfYWxsb2NfY29uc2lzdGVudC4KKwkgKi8KKwlmb3IgKGk9MDsgaTxwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfVFhfUFJPR1JFU1MsCisJCQkoIlRYJWQvQTogcERlc2NyTWVtOiAlbFgsICAgUGh5c0Rlc2NyTWVtOiAlbFhcbiIsCisJCQlpLCAodW5zaWduZWQgbG9uZykgcERlc2NyTWVtLAorCQkJQnVzQWRkcikpOworCQlwQUMtPlR4UG9ydFtpXVswXS5wVHhEZXNjclJpbmcgPSBwRGVzY3JNZW07CisJCXBBQy0+VHhQb3J0W2ldWzBdLlZUeERlc2NyUmluZyA9IEJ1c0FkZHI7CisJCXBEZXNjck1lbSArPSBUWF9SSU5HX1NJWkU7CisJCUJ1c0FkZHIgKz0gVFhfUklOR19TSVpFOworCQorCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfVFhfUFJPR1JFU1MsCisJCQkoIlJYJWQ6IHBEZXNjck1lbTogJWxYLCAgIFBoeXNEZXNjck1lbTogJWxYXG4iLAorCQkJaSwgKHVuc2lnbmVkIGxvbmcpIHBEZXNjck1lbSwKKwkJCSh1bnNpZ25lZCBsb25nKUJ1c0FkZHIpKTsKKwkJcEFDLT5SeFBvcnRbaV0ucFJ4RGVzY3JSaW5nID0gcERlc2NyTWVtOworCQlwQUMtPlJ4UG9ydFtpXS5WUnhEZXNjclJpbmcgPSBCdXNBZGRyOworCQlwRGVzY3JNZW0gKz0gUlhfUklOR19TSVpFOworCQlCdXNBZGRyICs9IFJYX1JJTkdfU0laRTsKKwl9IC8qIGZvciAqLworCQorCXJldHVybiAoU0tfVFJVRSk7Cit9IC8qIEJvYXJkQWxsb2NNZW0gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUJvYXJkRnJlZU1lbSAtIHJldmVyc2Ugb2YgQm9hcmRBbGxvY01lbQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJRnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBpbiBCb2FyZEFsbG9jTWVtOiBhZGFwdGVyIGNvbnRleHQsCisgKglkZXNjcmlwdG9yIHJpbmdzLCBsb2Nrcy4KKyAqCisgKiBSZXR1cm5zOglOL0EKKyAqLworc3RhdGljIHZvaWQgQm9hcmRGcmVlTWVtKAorU0tfQUMJCSpwQUMpCit7CitzaXplX3QJCUFsbG9jTGVuZ3RoOwkvKiBsZW5ndGggb2YgY29tcGxldGUgZGVzY3JpcHRvciBhcmVhICovCisKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiQm9hcmRGcmVlTWVtXG4iKSk7CisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIpCisJQWxsb2NMZW5ndGggPSAoUlhfUklOR19TSVpFICsgVFhfUklOR19TSVpFKSAqIHBBQy0+R0luaS5HSU1hY3NGb3VuZCArIDg7CisjZWxzZQorCUFsbG9jTGVuZ3RoID0gKFJYX1JJTkdfU0laRSArIFRYX1JJTkdfU0laRSkgKiBwQUMtPkdJbmkuR0lNYWNzRm91bmQKKwkJKyBSWF9SSU5HX1NJWkUgKyA4OworI2VuZGlmCisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBBQy0+UGNpRGV2LCBBbGxvY0xlbmd0aCwKKwkJCSAgICBwQUMtPnBEZXNjck1lbSwgcEFDLT5wRGVzY3JNZW1ETUEpOworCXBBQy0+cERlc2NyTWVtID0gTlVMTDsKK30gLyogQm9hcmRGcmVlTWVtICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCUJvYXJkSW5pdE1lbSAtIGluaXRpYXRlIHRoZSBkZXNjcmlwdG9yIHJpbmdzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGRlc2NyaXB0b3IgcmluZ3MgdXAgaW4gbWVtb3J5LgorICoJVGhlIGFkYXB0ZXIgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZGVzY3JpcHRvciBzdGFydCBhZGRyZXNzZXMuCisgKgorICogUmV0dXJuczoJTi9BCisgKi8KK3N0YXRpYyB2b2lkIEJvYXJkSW5pdE1lbSgKK1NLX0FDCSpwQUMpCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCit7CitpbnQJaTsJCS8qIGxvb3AgY291bnRlciAqLworaW50CVJ4RGVzY3JTaXplOwkvKiB0aGUgc2l6ZSBvZiBhIHJ4IGRlc2NyaXB0b3Igcm91bmRlZCB1cCB0byBhbGlnbm1lbnQqLworaW50CVR4RGVzY3JTaXplOwkvKiB0aGUgc2l6ZSBvZiBhIHR4IGRlc2NyaXB0b3Igcm91bmRlZCB1cCB0byBhbGlnbm1lbnQqLworCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIkJvYXJkSW5pdE1lbVxuIikpOworCisJUnhEZXNjclNpemUgPSAoKChzaXplb2YoUlhEKSAtIDEpIC8gREVTQ1JfQUxJR04pICsgMSkgKiBERVNDUl9BTElHTjsKKwlwQUMtPlJ4RGVzY3JQZXJSaW5nID0gUlhfUklOR19TSVpFIC8gUnhEZXNjclNpemU7CisJVHhEZXNjclNpemUgPSAoKChzaXplb2YoVFhEKSAtIDEpIC8gREVTQ1JfQUxJR04pICsgMSkgKiBERVNDUl9BTElHTjsKKwlwQUMtPlR4RGVzY3JQZXJSaW5nID0gVFhfUklOR19TSVpFIC8gUnhEZXNjclNpemU7CisJCisJZm9yIChpPTA7IGk8cEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJU2V0dXBSaW5nKAorCQkJcEFDLAorCQkJcEFDLT5UeFBvcnRbaV1bMF0ucFR4RGVzY3JSaW5nLAorCQkJcEFDLT5UeFBvcnRbaV1bMF0uVlR4RGVzY3JSaW5nLAorCQkJKFJYRCoqKSZwQUMtPlR4UG9ydFtpXVswXS5wVHhkUmluZ0hlYWQsCisJCQkoUlhEKiopJnBBQy0+VHhQb3J0W2ldWzBdLnBUeGRSaW5nVGFpbCwKKwkJCShSWEQqKikmcEFDLT5UeFBvcnRbaV1bMF0ucFR4ZFJpbmdQcmV2LAorCQkJJnBBQy0+VHhQb3J0W2ldWzBdLlR4ZFJpbmdGcmVlLAorCQkJU0tfVFJVRSk7CisJCVNldHVwUmluZygKKwkJCXBBQywKKwkJCXBBQy0+UnhQb3J0W2ldLnBSeERlc2NyUmluZywKKwkJCXBBQy0+UnhQb3J0W2ldLlZSeERlc2NyUmluZywKKwkJCSZwQUMtPlJ4UG9ydFtpXS5wUnhkUmluZ0hlYWQsCisJCQkmcEFDLT5SeFBvcnRbaV0ucFJ4ZFJpbmdUYWlsLAorCQkJJnBBQy0+UnhQb3J0W2ldLnBSeGRSaW5nUHJldiwKKwkJCSZwQUMtPlJ4UG9ydFtpXS5SeGRSaW5nRnJlZSwKKwkJCVNLX0ZBTFNFKTsKKwl9Cit9IC8qIEJvYXJkSW5pdE1lbSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlTZXR1cFJpbmcgLSBjcmVhdGUgb25lIGRlc2NyaXB0b3IgcmluZworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBjcmVhdGVzIG9uZSBkZXNjcmlwdG9yIHJpbmcgaW4gdGhlIGdpdmVuIG1lbW9yeSBhcmVhLgorICoJVGhlIGhlYWQsIHRhaWwgYW5kIG51bWJlciBvZiBmcmVlIGRlc2NyaXB0b3JzIGluIHRoZSByaW5nIGFyZSBzZXQuCisgKgorICogUmV0dXJuczoKKyAqCW5vbmUKKyAqLworc3RhdGljIHZvaWQgU2V0dXBSaW5nKAorU0tfQUMJCSpwQUMsCit2b2lkCQkqcE1lbUFyZWEsCS8qIGEgcG9pbnRlciB0byB0aGUgbWVtb3J5IGFyZWEgZm9yIHRoZSByaW5nICovCit1aW50cHRyX3QJVk1lbUFyZWEsCS8qIHRoZSB2aXJ0dWFsIGJ1cyBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgYXJlYSAqLworUlhECQkqKnBwUmluZ0hlYWQsCS8qIGFkZHJlc3Mgd2hlcmUgdGhlIGhlYWQgc2hvdWxkIGJlIHdyaXR0ZW4gKi8KK1JYRAkJKipwcFJpbmdUYWlsLAkvKiBhZGRyZXNzIHdoZXJlIHRoZSB0YWlsIHNob3VsZCBiZSB3cml0dGVuICovCitSWEQJCSoqcHBSaW5nUHJldiwJLyogYWRkcmVzcyB3aGVyZSB0aGUgdGFpbCBzaG91bGQgYmUgd3JpdHRlbiAqLworaW50CQkqcFJpbmdGcmVlLAkvKiBhZGRyZXNzIHdoZXJlIHRoZSAjIG9mIGZyZWUgZGVzY3IuIGdvZXMgKi8KK1NLX0JPT0wJCUlzVHgpCQkvKiBmbGFnOiBpcyB0aGlzIGEgdHggcmluZyAqLworeworaW50CWk7CQkvKiBsb29wIGNvdW50ZXIgKi8KK2ludAlEZXNjclNpemU7CS8qIHRoZSBzaXplIG9mIGEgZGVzY3JpcHRvciByb3VuZGVkIHVwIHRvIGFsaWdubWVudCovCitpbnQJRGVzY3JOdW07CS8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBwZXIgcmluZyAqLworUlhECSpwRGVzY3I7CS8qIHBvaW50ZXIgdG8gYSBkZXNjcmlwdG9yIChyZWNlaXZlIG9yIHRyYW5zbWl0KSAqLworUlhECSpwTmV4dERlc2NyOwkvKiBwb2ludGVyIHRvIHRoZSBuZXh0IGRlc2NyaXB0b3IgKi8KK1JYRAkqcFByZXZEZXNjcjsJLyogcG9pbnRlciB0byB0aGUgcHJldmlvdXMgZGVzY3JpcHRvciAqLwordWludHB0cl90IFZOZXh0RGVzY3I7CS8qIHRoZSB2aXJ0dWFsIGJ1cyBhZGRyZXNzIG9mIHRoZSBuZXh0IGRlc2NyaXB0b3IgKi8KKworCWlmIChJc1R4ID09IFNLX1RSVUUpIHsKKwkJRGVzY3JTaXplID0gKCgoc2l6ZW9mKFRYRCkgLSAxKSAvIERFU0NSX0FMSUdOKSArIDEpICoKKwkJCURFU0NSX0FMSUdOOworCQlEZXNjck51bSA9IFRYX1JJTkdfU0laRSAvIERlc2NyU2l6ZTsKKwl9IGVsc2UgeworCQlEZXNjclNpemUgPSAoKChzaXplb2YoUlhEKSAtIDEpIC8gREVTQ1JfQUxJR04pICsgMSkgKgorCQkJREVTQ1JfQUxJR047CisJCURlc2NyTnVtID0gUlhfUklOR19TSVpFIC8gRGVzY3JTaXplOworCX0KKwkKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfVFhfUFJPR1JFU1MsCisJCSgiRGVzY3JpcHRvciBzaXplOiAlZCAgIERlc2NyaXB0b3IgTnVtYmVyOiAlZFxuIiwKKwkJRGVzY3JTaXplLERlc2NyTnVtKSk7CisJCisJcERlc2NyID0gKFJYRCopIHBNZW1BcmVhOworCXBQcmV2RGVzY3IgPSBOVUxMOworCXBOZXh0RGVzY3IgPSAoUlhEKikgKCgoY2hhciopcERlc2NyKSArIERlc2NyU2l6ZSk7CisJVk5leHREZXNjciA9IFZNZW1BcmVhICsgRGVzY3JTaXplOworCWZvcihpPTA7IGk8RGVzY3JOdW07IGkrKykgeworCQkvKiBzZXQgdGhlIHBvaW50ZXJzIHJpZ2h0ICovCisJCXBEZXNjci0+Vk5leHRSeGQgPSBWTmV4dERlc2NyICYgMHhmZmZmZmZmZlVMTDsKKwkJcERlc2NyLT5wTmV4dFJ4ZCA9IHBOZXh0RGVzY3I7CisJCXBEZXNjci0+VGNwU3VtU3RhcnRzID0gcEFDLT5Dc09mczsKKworCQkvKiBhZHZhbmNlIG9uZSBzdGVwICovCisJCXBQcmV2RGVzY3IgPSBwRGVzY3I7CisJCXBEZXNjciA9IHBOZXh0RGVzY3I7CisJCXBOZXh0RGVzY3IgPSAoUlhEKikgKCgoY2hhciopcERlc2NyKSArIERlc2NyU2l6ZSk7CisJCVZOZXh0RGVzY3IgKz0gRGVzY3JTaXplOworCX0KKwlwUHJldkRlc2NyLT5wTmV4dFJ4ZCA9IChSWEQqKSBwTWVtQXJlYTsKKwlwUHJldkRlc2NyLT5WTmV4dFJ4ZCA9IFZNZW1BcmVhOworCXBEZXNjciA9IChSWEQqKSBwTWVtQXJlYTsKKwkqcHBSaW5nSGVhZCA9IChSWEQqKSBwTWVtQXJlYTsKKwkqcHBSaW5nVGFpbCA9ICpwcFJpbmdIZWFkOworCSpwcFJpbmdQcmV2ID0gcFByZXZEZXNjcjsKKwkqcFJpbmdGcmVlID0gRGVzY3JOdW07Cit9IC8qIFNldHVwUmluZyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlQb3J0UmVJbml0Qm11IC0gcmUtaW5pdGlhdGUgdGhlIGRlc2NyaXB0b3IgcmluZ3MgZm9yIG9uZSBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHJlaW5pdGlhbGl6ZXMgdGhlIGRlc2NyaXB0b3IgcmluZ3Mgb2Ygb25lIHBvcnQKKyAqCWluIG1lbW9yeS4gVGhlIHBvcnQgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZS4KKyAqCVRoZSBIVyBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBkZXNjcmlwdG9yIHN0YXJ0IGFkZHJlc3Nlcy4KKyAqCisgKiBSZXR1cm5zOgorICoJbm9uZQorICovCitzdGF0aWMgdm9pZCBQb3J0UmVJbml0Qm11KAorU0tfQUMJKnBBQywJCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitpbnQJUG9ydEluZGV4KQkvKiBpbmRleCBvZiB0aGUgcG9ydCBmb3Igd2hpY2ggdG8gcmUtaW5pdCAqLworeworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJQb3J0UmVJbml0Qm11ICIpKTsKKworCS8qIHNldCBhZGRyZXNzIG9mIGZpcnN0IGRlc2NyaXB0b3Igb2YgcmluZyBpbiBCTVUgKi8KKwlTS19PVVQzMihwQUMtPklvQmFzZSwgVHhRdWV1ZUFkZHJbUG9ydEluZGV4XVtUWF9QUklPX0xPV10rIFFfREFfTCwKKwkJKHVpbnQzMl90KSgoKGNhZGRyX3QpCisJCShwQUMtPlR4UG9ydFtQb3J0SW5kZXhdW1RYX1BSSU9fTE9XXS5wVHhkUmluZ0hlYWQpIC0KKwkJcEFDLT5UeFBvcnRbUG9ydEluZGV4XVtUWF9QUklPX0xPV10ucFR4RGVzY3JSaW5nICsKKwkJcEFDLT5UeFBvcnRbUG9ydEluZGV4XVtUWF9QUklPX0xPV10uVlR4RGVzY3JSaW5nKSAmCisJCTB4RkZGRkZGRkYpKTsKKwlTS19PVVQzMihwQUMtPklvQmFzZSwgVHhRdWV1ZUFkZHJbUG9ydEluZGV4XVtUWF9QUklPX0xPV10rIFFfREFfSCwKKwkJKHVpbnQzMl90KSgoKGNhZGRyX3QpCisJCShwQUMtPlR4UG9ydFtQb3J0SW5kZXhdW1RYX1BSSU9fTE9XXS5wVHhkUmluZ0hlYWQpIC0KKwkJcEFDLT5UeFBvcnRbUG9ydEluZGV4XVtUWF9QUklPX0xPV10ucFR4RGVzY3JSaW5nICsKKwkJcEFDLT5UeFBvcnRbUG9ydEluZGV4XVtUWF9QUklPX0xPV10uVlR4RGVzY3JSaW5nKSA+PiAzMikpOworCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBSeFF1ZXVlQWRkcltQb3J0SW5kZXhdK1FfREFfTCwKKwkJKHVpbnQzMl90KSgoKGNhZGRyX3QpKHBBQy0+UnhQb3J0W1BvcnRJbmRleF0ucFJ4ZFJpbmdIZWFkKSAtCisJCXBBQy0+UnhQb3J0W1BvcnRJbmRleF0ucFJ4RGVzY3JSaW5nICsKKwkJcEFDLT5SeFBvcnRbUG9ydEluZGV4XS5WUnhEZXNjclJpbmcpICYgMHhGRkZGRkZGRikpOworCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBSeFF1ZXVlQWRkcltQb3J0SW5kZXhdK1FfREFfSCwKKwkJKHVpbnQzMl90KSgoKGNhZGRyX3QpKHBBQy0+UnhQb3J0W1BvcnRJbmRleF0ucFJ4ZFJpbmdIZWFkKSAtCisJCXBBQy0+UnhQb3J0W1BvcnRJbmRleF0ucFJ4RGVzY3JSaW5nICsKKwkJcEFDLT5SeFBvcnRbUG9ydEluZGV4XS5WUnhEZXNjclJpbmcpID4+IDMyKSk7Cit9IC8qIFBvcnRSZUluaXRCbXUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJc3IgLSBoYW5kbGUgYWRhcHRlciBpbnRlcnJ1cHRzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgaW50ZXJydXB0IHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gdGhlIG5ldHdvcmsgYWRhcHRlcgorICoJZ2VuZXJhdGVzIGFuIGludGVycnVwdC4gSXQgbWF5IGFsc28gYmUgY2FsbGVkIGlmIGFub3RoZXIgZGV2aWNlCisgKglzaGFyZXMgdGhpcyBpbnRlcnJ1cHQgdmVjdG9yIHdpdGggdGhlIGRyaXZlci4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqCisgKi8KK3N0YXRpYyBTa0lzclJldFZhciBTa0dlSXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKK3sKK3N0cnVjdCBTS19ORVRfREVWSUNFICpkZXYgPSAoc3RydWN0IFNLX05FVF9ERVZJQ0UgKilkZXZfaWQ7CitERVZfTkVUCQkqcE5ldDsKK1NLX0FDCQkqcEFDOworU0tfVTMyCQlJbnRTcmM7CQkvKiBpbnRlcnJ1cHRzIHNvdXJjZSByZWdpc3RlciBjb250ZW50cyAqLwkKKworCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXBBQyA9IHBOZXQtPnBBQzsKKwkKKwkvKgorCSAqIENoZWNrIGFuZCBwcm9jZXNzIGlmIGl0cyBvdXIgaW50ZXJydXB0CisJICovCisJU0tfSU4zMihwQUMtPklvQmFzZSwgQjBfU1BfSVNSQywgJkludFNyYyk7CisJaWYgKEludFNyYyA9PSAwKSB7CisJCXJldHVybiBTa0lzclJldE5vbmU7CisJfQorCisJd2hpbGUgKCgoSW50U3JjICYgSVJRX01BU0spICYgflNQRUNJQUxfSVJRUykgIT0gMCkgeworI2lmIDAgLyogc29mdHdhcmUgaXJxIGN1cnJlbnRseSBub3QgdXNlZCAqLworCQlpZiAoSW50U3JjICYgSVNfSVJRX1NXKSB7CisJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsCisJCQkJU0tfREJHQ0FUX0RSVl9JTlRfU1JDLAorCQkJCSgiU29mdHdhcmUgSVJRXG4iKSk7CisJCX0KKyNlbmRpZgorCQlpZiAoSW50U3JjICYgSVNfUjFfRikgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIkVPRiBSWDEgSVJRXG4iKSk7CisJCQlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0WzBdLCBTS19UUlVFKTsKKwkJCVNLX1BOTUlfQ05UX1JYX0lOVFIocEFDLCAwKTsKKwkJfQorCQlpZiAoSW50U3JjICYgSVNfUjJfRikgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIkVPRiBSWDIgSVJRXG4iKSk7CisJCQlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0WzFdLCBTS19UUlVFKTsKKwkJCVNLX1BOTUlfQ05UX1JYX0lOVFIocEFDLCAxKTsKKwkJfQorI2lmZGVmIFVTRV9UWF9DT01QTEVURSAvKiBvbmx5IGlmIHR4IGNvbXBsZXRlIGludGVycnVwdCB1c2VkICovCisJCWlmIChJbnRTcmMgJiBJU19YQTFfRikgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIkVPRiBBUyBUWDEgSVJRXG4iKSk7CisJCQlTS19QTk1JX0NOVF9UWF9JTlRSKHBBQywgMCk7CisJCQlzcGluX2xvY2soJnBBQy0+VHhQb3J0WzBdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrKTsKKwkJCUZyZWVUeERlc2NyaXB0b3JzKHBBQywgJnBBQy0+VHhQb3J0WzBdW1RYX1BSSU9fTE9XXSk7CisJCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbMF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2spOworCQl9CisJCWlmIChJbnRTcmMgJiBJU19YQTJfRikgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIkVPRiBBUyBUWDIgSVJRXG4iKSk7CisJCQlTS19QTk1JX0NOVF9UWF9JTlRSKHBBQywgMSk7CisJCQlzcGluX2xvY2soJnBBQy0+VHhQb3J0WzFdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrKTsKKwkJCUZyZWVUeERlc2NyaXB0b3JzKHBBQywgJnBBQy0+VHhQb3J0WzFdW1RYX1BSSU9fTE9XXSk7CisJCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbMV1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2spOworCQl9CisjaWYgMCAvKiBvbmx5IGlmIHN5bmMuIHF1ZXVlcyB1c2VkICovCisJCWlmIChJbnRTcmMgJiBJU19YUzFfRikgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIkVPRiBTWSBUWDEgSVJRXG4iKSk7CisJCQlTS19QTk1JX0NOVF9UWF9JTlRSKHBBQywgMSk7CisJCQlzcGluX2xvY2soJnBBQy0+VHhQb3J0WzBdW1RYX1BSSU9fSElHSF0uVHhEZXNSaW5nTG9jayk7CisJCQlGcmVlVHhEZXNjcmlwdG9ycyhwQUMsIDAsIFRYX1BSSU9fSElHSCk7CisJCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbMF1bVFhfUFJJT19ISUdIXS5UeERlc1JpbmdMb2NrKTsKKwkJCUNsZWFyVHhJcnEocEFDLCAwLCBUWF9QUklPX0hJR0gpOworCQl9CisJCWlmIChJbnRTcmMgJiBJU19YUzJfRikgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIkVPRiBTWSBUWDIgSVJRXG4iKSk7CisJCQlTS19QTk1JX0NOVF9UWF9JTlRSKHBBQywgMSk7CisJCQlzcGluX2xvY2soJnBBQy0+VHhQb3J0WzFdW1RYX1BSSU9fSElHSF0uVHhEZXNSaW5nTG9jayk7CisJCQlGcmVlVHhEZXNjcmlwdG9ycyhwQUMsIDEsIFRYX1BSSU9fSElHSCk7CisJCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbMV1bVFhfUFJJT19ISUdIXS5UeERlc1JpbmdMb2NrKTsKKwkJCUNsZWFyVHhJcnEocEFDLCAxLCBUWF9QUklPX0hJR0gpOworCQl9CisjZW5kaWYKKyNlbmRpZgorCisJCS8qIGRvIGFsbCBJTyBhdCBvbmNlICovCisJCWlmIChJbnRTcmMgJiBJU19SMV9GKQorCQkJQ2xlYXJBbmRTdGFydFJ4KHBBQywgMCk7CisJCWlmIChJbnRTcmMgJiBJU19SMl9GKQorCQkJQ2xlYXJBbmRTdGFydFJ4KHBBQywgMSk7CisjaWZkZWYgVVNFX1RYX0NPTVBMRVRFIC8qIG9ubHkgaWYgdHggY29tcGxldGUgaW50ZXJydXB0IHVzZWQgKi8KKwkJaWYgKEludFNyYyAmIElTX1hBMV9GKQorCQkJQ2xlYXJUeElycShwQUMsIDAsIFRYX1BSSU9fTE9XKTsKKwkJaWYgKEludFNyYyAmIElTX1hBMl9GKQorCQkJQ2xlYXJUeElycShwQUMsIDEsIFRYX1BSSU9fTE9XKTsKKyNlbmRpZgorCQlTS19JTjMyKHBBQy0+SW9CYXNlLCBCMF9JU1JDLCAmSW50U3JjKTsKKwl9IC8qIHdoaWxlIChJbnRTcmMgJiBJUlFfTUFTSyAhPSAwKSAqLworCisJSW50U3JjICY9IHBBQy0+R0luaS5HSVZhbElycU1hc2s7CisJaWYgKChJbnRTcmMgJiBTUEVDSUFMX0lSUVMpIHx8IHBBQy0+Q2hlY2tRdWV1ZSkgeworCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCSgiU1BFQ0lBTCBJUlEgRFAtQ2FyZHMgPT4gJXhcbiIsIEludFNyYykpOworCQlwQUMtPkNoZWNrUXVldWUgPSBTS19GQUxTRTsKKwkJc3Bpbl9sb2NrKCZwQUMtPlNsb3dQYXRoTG9jayk7CisJCWlmIChJbnRTcmMgJiBTUEVDSUFMX0lSUVMpCisJCQlTa0dlU2lycUlzcihwQUMsIHBBQy0+SW9CYXNlLCBJbnRTcmMpOworCisJCVNrRXZlbnREaXNwYXRjaGVyKHBBQywgcEFDLT5Jb0Jhc2UpOworCQlzcGluX3VubG9jaygmcEFDLT5TbG93UGF0aExvY2spOworCX0KKwkvKgorCSAqIGRvIGl0IGFsbCBhZ2FpbiBpcyBjYXNlIHdlIGNsZWFyZWQgYW4gaW50ZXJydXB0IHRoYXQKKwkgKiBjYW1lIGluIGFmdGVyIGhhbmRsaW5nIHRoZSByaW5nIChPVVRzIG1heSBiZSBkZWxheWVkCisJICogaW4gaGFyZHdhcmUgYnVmZmVycywgYnV0IGFyZSB0aHJvdWdoIGFmdGVyIElOKQorCSAqCisJICogcnJvZXNsZXI6IGhhcyBiZWVuIGNvbW1lbnRlZCBvdXQgYW5kIHNoaWZ0ZWQgdG8KKwkgKiAgICAgICAgICAgU2tHZURydkV2ZW50KCksIGJlY2F1c2UgaXQgaXMgdGltZXIKKwkgKiAgICAgICAgICAgZ3VhcmRlZCBub3cKKwkgKgorCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbMF0sIFNLX1RSVUUpOworCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbMV0sIFNLX1RSVUUpOworCSAqLworCisJaWYgKHBBQy0+Q2hlY2tRdWV1ZSkgeworCQlwQUMtPkNoZWNrUXVldWUgPSBTS19GQUxTRTsKKwkJc3Bpbl9sb2NrKCZwQUMtPlNsb3dQYXRoTG9jayk7CisJCVNrRXZlbnREaXNwYXRjaGVyKHBBQywgcEFDLT5Jb0Jhc2UpOworCQlzcGluX3VubG9jaygmcEFDLT5TbG93UGF0aExvY2spOworCX0KKworCS8qIElSUSBpcyBwcm9jZXNzZWQgLSBFbmFibGUgSVJRcyBhZ2FpbiovCisJU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIEIwX0lNU0ssIHBBQy0+R0luaS5HSVZhbElycU1hc2spOworCisJCXJldHVybiBTa0lzclJldEhhbmRsZWQ7Cit9IC8qIFNrR2VJc3IgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJc3JPbmVQb3J0IC0gaGFuZGxlIGFkYXB0ZXIgaW50ZXJydXB0cyBmb3Igc2luZ2xlIHBvcnQgYWRhcHRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIGludGVycnVwdCByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBuZXR3b3JrIGFkYXB0ZXIKKyAqCWdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQuIEl0IG1heSBhbHNvIGJlIGNhbGxlZCBpZiBhbm90aGVyIGRldmljZQorICoJc2hhcmVzIHRoaXMgaW50ZXJydXB0IHZlY3RvciB3aXRoIHRoZSBkcml2ZXIuCisgKglUaGlzIGlzIHRoZSBzYW1lIGFzIGFib3ZlLCBidXQgaGFuZGxlcyBvbmx5IG9uZSBwb3J0LgorICoKKyAqIFJldHVybnM6IE4vQQorICoKKyAqLworc3RhdGljIFNrSXNyUmV0VmFyIFNrR2VJc3JPbmVQb3J0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKK3sKK3N0cnVjdCBTS19ORVRfREVWSUNFICpkZXYgPSAoc3RydWN0IFNLX05FVF9ERVZJQ0UgKilkZXZfaWQ7CitERVZfTkVUCQkqcE5ldDsKK1NLX0FDCQkqcEFDOworU0tfVTMyCQlJbnRTcmM7CQkvKiBpbnRlcnJ1cHRzIHNvdXJjZSByZWdpc3RlciBjb250ZW50cyAqLwkKKworCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXBBQyA9IHBOZXQtPnBBQzsKKwkKKwkvKgorCSAqIENoZWNrIGFuZCBwcm9jZXNzIGlmIGl0cyBvdXIgaW50ZXJydXB0CisJICovCisJU0tfSU4zMihwQUMtPklvQmFzZSwgQjBfU1BfSVNSQywgJkludFNyYyk7CisJaWYgKEludFNyYyA9PSAwKSB7CisJCXJldHVybiBTa0lzclJldE5vbmU7CisJfQorCQorCXdoaWxlICgoKEludFNyYyAmIElSUV9NQVNLKSAmIH5TUEVDSUFMX0lSUVMpICE9IDApIHsKKyNpZiAwIC8qIHNvZnR3YXJlIGlycSBjdXJyZW50bHkgbm90IHVzZWQgKi8KKwkJaWYgKEludFNyYyAmIElTX0lSUV9TVykgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIlNvZnR3YXJlIElSUVxuIikpOworCQl9CisjZW5kaWYKKwkJaWYgKEludFNyYyAmIElTX1IxX0YpIHsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX0lOVF9TUkMsCisJCQkJKCJFT0YgUlgxIElSUVxuIikpOworCQkJUmVjZWl2ZUlycShwQUMsICZwQUMtPlJ4UG9ydFswXSwgU0tfVFJVRSk7CisJCQlTS19QTk1JX0NOVF9SWF9JTlRSKHBBQywgMCk7CisJCX0KKyNpZmRlZiBVU0VfVFhfQ09NUExFVEUgLyogb25seSBpZiB0eCBjb21wbGV0ZSBpbnRlcnJ1cHQgdXNlZCAqLworCQlpZiAoSW50U3JjICYgSVNfWEExX0YpIHsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX0lOVF9TUkMsCisJCQkJKCJFT0YgQVMgVFgxIElSUVxuIikpOworCQkJU0tfUE5NSV9DTlRfVFhfSU5UUihwQUMsIDApOworCQkJc3Bpbl9sb2NrKCZwQUMtPlR4UG9ydFswXVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jayk7CisJCQlGcmVlVHhEZXNjcmlwdG9ycyhwQUMsICZwQUMtPlR4UG9ydFswXVtUWF9QUklPX0xPV10pOworCQkJc3Bpbl91bmxvY2soJnBBQy0+VHhQb3J0WzBdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrKTsKKwkJfQorI2lmIDAgLyogb25seSBpZiBzeW5jLiBxdWV1ZXMgdXNlZCAqLworCQlpZiAoSW50U3JjICYgSVNfWFMxX0YpIHsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX0lOVF9TUkMsCisJCQkJKCJFT0YgU1kgVFgxIElSUVxuIikpOworCQkJU0tfUE5NSV9DTlRfVFhfSU5UUihwQUMsIDApOworCQkJc3Bpbl9sb2NrKCZwQUMtPlR4UG9ydFswXVtUWF9QUklPX0hJR0hdLlR4RGVzUmluZ0xvY2spOworCQkJRnJlZVR4RGVzY3JpcHRvcnMocEFDLCAwLCBUWF9QUklPX0hJR0gpOworCQkJc3Bpbl91bmxvY2soJnBBQy0+VHhQb3J0WzBdW1RYX1BSSU9fSElHSF0uVHhEZXNSaW5nTG9jayk7CisJCQlDbGVhclR4SXJxKHBBQywgMCwgVFhfUFJJT19ISUdIKTsKKwkJfQorI2VuZGlmCisjZW5kaWYKKworCQkvKiBkbyBhbGwgSU8gYXQgb25jZSAqLworCQlpZiAoSW50U3JjICYgSVNfUjFfRikKKwkJCUNsZWFyQW5kU3RhcnRSeChwQUMsIDApOworI2lmZGVmIFVTRV9UWF9DT01QTEVURSAvKiBvbmx5IGlmIHR4IGNvbXBsZXRlIGludGVycnVwdCB1c2VkICovCisJCWlmIChJbnRTcmMgJiBJU19YQTFfRikKKwkJCUNsZWFyVHhJcnEocEFDLCAwLCBUWF9QUklPX0xPVyk7CisjZW5kaWYKKwkJU0tfSU4zMihwQUMtPklvQmFzZSwgQjBfSVNSQywgJkludFNyYyk7CisJfSAvKiB3aGlsZSAoSW50U3JjICYgSVJRX01BU0sgIT0gMCkgKi8KKwkKKwlJbnRTcmMgJj0gcEFDLT5HSW5pLkdJVmFsSXJxTWFzazsKKwlpZiAoKEludFNyYyAmIFNQRUNJQUxfSVJRUykgfHwgcEFDLT5DaGVja1F1ZXVlKSB7CisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9JTlRfU1JDLAorCQkJKCJTUEVDSUFMIElSUSBTUC1DYXJkcyA9PiAleFxuIiwgSW50U3JjKSk7CisJCXBBQy0+Q2hlY2tRdWV1ZSA9IFNLX0ZBTFNFOworCQlzcGluX2xvY2soJnBBQy0+U2xvd1BhdGhMb2NrKTsKKwkJaWYgKEludFNyYyAmIFNQRUNJQUxfSVJRUykKKwkJCVNrR2VTaXJxSXNyKHBBQywgcEFDLT5Jb0Jhc2UsIEludFNyYyk7CisKKwkJU2tFdmVudERpc3BhdGNoZXIocEFDLCBwQUMtPklvQmFzZSk7CisJCXNwaW5fdW5sb2NrKCZwQUMtPlNsb3dQYXRoTG9jayk7CisJfQorCS8qCisJICogZG8gaXQgYWxsIGFnYWluIGlzIGNhc2Ugd2UgY2xlYXJlZCBhbiBpbnRlcnJ1cHQgdGhhdAorCSAqIGNhbWUgaW4gYWZ0ZXIgaGFuZGxpbmcgdGhlIHJpbmcgKE9VVHMgbWF5IGJlIGRlbGF5ZWQKKwkgKiBpbiBoYXJkd2FyZSBidWZmZXJzLCBidXQgYXJlIHRocm91Z2ggYWZ0ZXIgSU4pCisJICoKKwkgKiBycm9lc2xlcjogaGFzIGJlZW4gY29tbWVudGVkIG91dCBhbmQgc2hpZnRlZCB0bworCSAqICAgICAgICAgICBTa0dlRHJ2RXZlbnQoKSwgYmVjYXVzZSBpdCBpcyB0aW1lcgorCSAqICAgICAgICAgICBndWFyZGVkIG5vdworCSAqCisJUmVjZWl2ZUlycShwQUMsICZwQUMtPlJ4UG9ydFswXSwgU0tfVFJVRSk7CisJICovCisKKwkvKiBJUlEgaXMgcHJvY2Vzc2VkIC0gRW5hYmxlIElSUXMgYWdhaW4qLworCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMF9JTVNLLCBwQUMtPkdJbmkuR0lWYWxJcnFNYXNrKTsKKworCQlyZXR1cm4gU2tJc3JSZXRIYW5kbGVkOworfSAvKiBTa0dlSXNyT25lUG9ydCAqLworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVNrR2VQb2xsQ29udHJvbGxlciAtIHBvbGxpbmcgcmVjZWl2ZSwgZm9yIG5ldGNvbnNvbGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVBvbGxpbmcgcmVjZWl2ZSAtIHVzZWQgYnkgbmV0Y29uc29sZSBhbmQgb3RoZXIgZGlhZ25vc3RpYyB0b29scworICoJdG8gYWxsb3cgbmV0d29yayBpL28gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBTa0dlUG9sbENvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJU2tHZUlzcihkZXYtPmlycSwgZGV2LCBOVUxMKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VPcGVuIC0gaGFuZGxlIHN0YXJ0IG9mIGluaXRpYWxpemVkIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZSBpbml0aWFsaXplZCBhZGFwdGVyLgorICoJVGhlIGJvYXJkIGxldmVsIHZhcmlhYmxlIGlzIHNldCBhbmQgdGhlIGFkYXB0ZXIgaXMKKyAqCWJyb3VnaHQgdG8gZnVsbCBmdW5jdGlvbmFsaXR5LgorICoJVGhlIGRldmljZSBmbGFncyBhcmUgc2V0IGZvciBvcGVyYXRpb24uCisgKglEbyBhbGwgbmVjZXNzYXJ5IGxldmVsIDIgaW5pdGlhbGl6YXRpb24sIGVuYWJsZSBpbnRlcnJ1cHRzIGFuZAorICoJZ2l2ZSBzdGFydCBjb21tYW5kIHRvIFJMTVQuCisgKgorICogUmV0dXJuczoKKyAqCTAgb24gc3VjY2VzcworICoJIT0gMCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IFNrR2VPcGVuKAorc3RydWN0IFNLX05FVF9ERVZJQ0UJKmRldikKK3sKKwlERVZfTkVUCQkJKnBOZXQ7CisJU0tfQUMJCQkqcEFDOworCXVuc2lnbmVkIGxvbmcJRmxhZ3M7CQkvKiBmb3Igc3BpbiBsb2NrICovCisJaW50CQkJCWk7CisJU0tfRVZQQVJBCQlFdlBhcmE7CQkvKiBhbiBldmVudCBwYXJhbWV0ZXIgdW5pb24gKi8KKworCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXBBQyA9IHBOZXQtPnBBQzsKKwkKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiU2tHZU9wZW46IHBBQz0weCVsWDpcbiIsICh1bnNpZ25lZCBsb25nKXBBQykpOworCisjaWZkZWYgU0tfRElBR19TVVBQT1JUCisJaWYgKHBBQy0+RGlhZ01vZGVBY3RpdmUgPT0gRElBR19BQ1RJVkUpIHsKKwkJaWYgKHBBQy0+UG5taS5EaWFnQXR0YWNoZWQgPT0gU0tfRElBR19SVU5OSU5HKSB7CisJCQlyZXR1cm4gKC0xKTsgICAvKiBzdGlsbCBpbiB1c2UgYnkgZGlhZzsgZGVueSBhY3Rpb25zICovCisJCX0gCisJfQorI2VuZGlmCisKKwkvKiBTZXQgYmxpbmsgbW9kZSAqLworCWlmICgocEFDLT5QY2lEZXYtPnZlbmRvciA9PSAweDExODYpIHx8IChwQUMtPlBjaURldi0+dmVuZG9yID09IDB4MTFhYiApKQorCQlwQUMtPkdJbmkuR0lMZWRCbGlua0N0cmwgPSBPRU1fQ09ORklHX1ZBTFVFOworCisJaWYgKHBBQy0+Qm9hcmRMZXZlbCA9PSBTS19JTklUX0RBVEEpIHsKKwkJLyogbGV2ZWwgMSBpbml0IGNvbW1vbiBtb2R1bGVzIGhlcmUgKi8KKwkJaWYgKFNrR2VJbml0KHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfSU8pICE9IDApIHsKKwkJCXByaW50aygiJXM6IEhXSW5pdCAoMSkgZmFpbGVkLlxuIiwgcEFDLT5kZXZbcE5ldC0+UG9ydE5yXS0+bmFtZSk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlTa0kyY0luaXQJKHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfSU8pOworCQlTa0V2ZW50SW5pdAkocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJCVNrUG5taUluaXQJKHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfSU8pOworCQlTa0FkZHJJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwkJU2tSbG10SW5pdAkocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJCVNrVGltZXJJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwkJcEFDLT5Cb2FyZExldmVsID0gU0tfSU5JVF9JTzsKKwl9CisKKwlpZiAocEFDLT5Cb2FyZExldmVsICE9IFNLX0lOSVRfUlVOKSB7CisJCS8qIHRzY2hpbGxpbmc6IExldmVsIDIgaW5pdCBtb2R1bGVzIGhlcmUsIGNoZWNrIHJldHVybiB2YWx1ZS4gKi8KKwkJaWYgKFNrR2VJbml0KHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfUlVOKSAhPSAwKSB7CisJCQlwcmludGsoIiVzOiBIV0luaXQgKDIpIGZhaWxlZC5cbiIsIHBBQy0+ZGV2W3BOZXQtPlBvcnROcl0tPm5hbWUpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJU2tJMmNJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJCVNrRXZlbnRJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJCVNrUG5taUluaXQJKHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfUlVOKTsKKwkJU2tBZGRySW5pdAkocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9SVU4pOworCQlTa1JsbXRJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJCVNrVGltZXJJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJCXBBQy0+Qm9hcmRMZXZlbCA9IFNLX0lOSVRfUlVOOworCX0KKworCWZvciAoaT0wOyBpPHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCS8qIEVuYWJsZSB0cmFuc21pdCBkZXNjcmlwdG9yIHBvbGxpbmcuICovCisJCVNrR2VQb2xsVHhEKHBBQywgcEFDLT5Jb0Jhc2UsIGksIFNLX1RSVUUpOworCQlGaWxsUnhSaW5nKHBBQywgJnBBQy0+UnhQb3J0W2ldKTsKKwl9CisJU2tHZVllbGxvd0xFRChwQUMsIHBBQy0+SW9CYXNlLCAxKTsKKworCVN0YXJ0RHJ2Q2xlYW51cFRpbWVyKHBBQyk7CisJU2tEaW1FbmFibGVNb2RlcmF0aW9uSWZOZWVkZWQocEFDKTsJCisJU2tEaW1EaXNwbGF5TW9kZXJhdGlvblNldHRpbmdzKHBBQyk7CisKKwlwQUMtPkdJbmkuR0lWYWxJcnFNYXNrICY9IElSUV9NQVNLOworCisJLyogZW5hYmxlIEludGVycnVwdHMgKi8KKwlTS19PVVQzMihwQUMtPklvQmFzZSwgQjBfSU1TSywgcEFDLT5HSW5pLkdJVmFsSXJxTWFzayk7CisJU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIEIwX0hXRV9JTVNLLCBJUlFfSFdFX01BU0spOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisKKwlpZiAoKHBBQy0+UmxtdE1vZGUgIT0gMCkgJiYgKHBBQy0+TWF4UG9ydHMgPT0gMCkpIHsKKwkJRXZQYXJhLlBhcmEzMlswXSA9IHBBQy0+UmxtdE5ldHM7CisJCUV2UGFyYS5QYXJhMzJbMV0gPSAtMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NFVF9ORVRTLAorCQkJRXZQYXJhKTsKKwkJRXZQYXJhLlBhcmEzMlswXSA9IHBBQy0+UmxtdE1vZGU7CisJCUV2UGFyYS5QYXJhMzJbMV0gPSAwOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTU9ERV9DSEFOR0UsCisJCQlFdlBhcmEpOworCX0KKworCUV2UGFyYS5QYXJhMzJbMF0gPSBwTmV0LT5OZXROcjsKKwlFdlBhcmEuUGFyYTMyWzFdID0gLTE7CisJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUQVJULCBFdlBhcmEpOworCVNrRXZlbnREaXNwYXRjaGVyKHBBQywgcEFDLT5Jb0Jhc2UpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisKKwlwQUMtPk1heFBvcnRzKys7CisJcE5ldC0+VXAgPSAxOworCisKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiU2tHZU9wZW4gc3VjZWVkZWRcbiIpKTsKKworCXJldHVybiAoMCk7Cit9IC8qIFNrR2VPcGVuICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlQ2xvc2UgLSBTdG9wIGluaXRpYWxpemVkIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUNsb3NlIGluaXRpYWxpemVkIGFkYXB0ZXIuCisgKgorICogUmV0dXJuczoKKyAqCTAgLSBvbiBzdWNjZXNzCisgKgllcnJvciBjb2RlIC0gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBTa0dlQ2xvc2UoCitzdHJ1Y3QgU0tfTkVUX0RFVklDRQkqZGV2KQoreworCURFVl9ORVQJCSpwTmV0OworCURFVl9ORVQJCSpuZXdQdHJOZXQ7CisJU0tfQUMJCSpwQUM7CisKKwl1bnNpZ25lZCBsb25nCUZsYWdzOwkJLyogZm9yIHNwaW4gbG9jayAqLworCWludAkJaTsKKwlpbnQJCVBvcnRJZHg7CisJU0tfRVZQQVJBCUV2UGFyYTsKKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJTa0dlQ2xvc2U6IHBBQz0weCVsWCAiLCAodW5zaWduZWQgbG9uZylwQUMpKTsKKworCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXBBQyA9IHBOZXQtPnBBQzsKKworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorCWlmIChwQUMtPkRpYWdNb2RlQWN0aXZlID09IERJQUdfQUNUSVZFKSB7CisJCWlmIChwQUMtPkRpYWdGbG93Q3RybCA9PSBTS19GQUxTRSkgeworCQkJLyogCisJCQkqKiBub3RpZnkgdGhhdCB0aGUgaW50ZXJmYWNlIHdoaWNoIGhhcyBiZWVuIGNsb3NlZAorCQkJKiogYnkgb3BlcmF0b3IgaW50ZXJhY3Rpb24gbXVzdCBub3QgYmUgc3RhcnRlZCB1cCAKKwkJCSoqIGFnYWluIHdoZW4gdGhlIERJQUcgaGFzIGZpbmlzaGVkLiAKKwkJCSovCisJCQluZXdQdHJOZXQgPSBuZXRkZXZfcHJpdihwQUMtPmRldlswXSk7CisJCQlpZiAobmV3UHRyTmV0ID09IHBOZXQpIHsKKwkJCQlwQUMtPldhc0lmVXBbMF0gPSBTS19GQUxTRTsKKwkJCX0gZWxzZSB7CisJCQkJcEFDLT5XYXNJZlVwWzFdID0gU0tfRkFMU0U7CisJCQl9CisJCQlyZXR1cm4gMDsgLyogcmV0dXJuIHRvIHN5c3RlbSBldmVyeXRoaW5nIGlzIGZpbmUuLi4gKi8KKwkJfSBlbHNlIHsKKwkJCXBBQy0+RGlhZ0Zsb3dDdHJsID0gU0tfRkFMU0U7CisJCX0KKwl9CisjZW5kaWYKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChwQUMtPlJsbXROZXRzID09IDEpCisJCVBvcnRJZHggPSBwQUMtPkFjdGl2ZVBvcnQ7CisJZWxzZQorCQlQb3J0SWR4ID0gcE5ldC0+TmV0TnI7CisKKyAgICAgICAgU3RvcERydkNsZWFudXBUaW1lcihwQUMpOworCisJLyoKKwkgKiBDbGVhciBtdWx0aWNhc3QgdGFibGUsIHByb21pc2N1b3VzIG1vZGUgLi4uLgorCSAqLworCVNrQWRkck1jQ2xlYXIocEFDLCBwQUMtPklvQmFzZSwgUG9ydElkeCwgMCk7CisJU2tBZGRyUHJvbWlzY3VvdXNDaGFuZ2UocEFDLCBwQUMtPklvQmFzZSwgUG9ydElkeCwKKwkJU0tfUFJPTV9NT0RFX05PTkUpOworCisJaWYgKHBBQy0+TWF4UG9ydHMgPT0gMSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMF9JTVNLLCAwKTsKKwkJRXZQYXJhLlBhcmEzMlswXSA9IHBOZXQtPk5ldE5yOworCQlFdlBhcmEuUGFyYTMyWzFdID0gLTE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVE9QLCBFdlBhcmEpOworCQlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIHBBQy0+SW9CYXNlKTsKKwkJU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIEIwX0lNU0ssIDApOworCQkvKiBzdG9wIHRoZSBoYXJkd2FyZSAqLworCQlTa0dlRGVJbml0KHBBQywgcEFDLT5Jb0Jhc2UpOworCQlwQUMtPkJvYXJkTGV2ZWwgPSBTS19JTklUX0RBVEE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJfSBlbHNlIHsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkJRXZQYXJhLlBhcmEzMlswXSA9IHBOZXQtPk5ldE5yOworCQlFdlBhcmEuUGFyYTMyWzFdID0gLTE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVE9QLCBFdlBhcmEpOworCQlTa1BubWlFdmVudChwQUMsIHBBQy0+SW9CYXNlLCBTS19QTk1JX0VWVF9YTUFDX1JFU0VULCBFdlBhcmEpOworCQlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIHBBQy0+SW9CYXNlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkJCisJCS8qIFN0b3AgcG9ydCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5UeFBvcnRbcE5ldC0+UG9ydE5yXQorCQkJW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrLCBGbGFncyk7CisJCVNrR2VTdG9wUG9ydChwQUMsIHBBQy0+SW9CYXNlLCBwTmV0LT5Qb3J0TnIsCisJCQlTS19TVE9QX0FMTCwgU0tfSEFSRF9SU1QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQUMtPlR4UG9ydFtwTmV0LT5Qb3J0TnJdCisJCQlbVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2ssIEZsYWdzKTsKKwl9CisKKwlpZiAocEFDLT5SbG10TmV0cyA9PSAxKSB7CisJCS8qIGNsZWFyIGFsbCBkZXNjcmlwdG9yIHJpbmdzICovCisJCWZvciAoaT0wOyBpPHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0W2ldLCBTS19UUlVFKTsKKwkJCUNsZWFyUnhSaW5nKHBBQywgJnBBQy0+UnhQb3J0W2ldKTsKKwkJCUNsZWFyVHhSaW5nKHBBQywgJnBBQy0+VHhQb3J0W2ldW1RYX1BSSU9fTE9XXSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBjbGVhciBwb3J0IGRlc2NyaXB0b3IgcmluZ3MgKi8KKwkJUmVjZWl2ZUlycShwQUMsICZwQUMtPlJ4UG9ydFtwTmV0LT5Qb3J0TnJdLCBTS19UUlVFKTsKKwkJQ2xlYXJSeFJpbmcocEFDLCAmcEFDLT5SeFBvcnRbcE5ldC0+UG9ydE5yXSk7CisJCUNsZWFyVHhSaW5nKHBBQywgJnBBQy0+VHhQb3J0W3BOZXQtPlBvcnROcl1bVFhfUFJJT19MT1ddKTsKKwl9CisKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiU2tHZUNsb3NlOiBkb25lICIpKTsKKworCVNLX01FTVNFVCgmKHBBQy0+UG5taUJhY2t1cCksIDAsIHNpemVvZihTS19QTk1JX1NUUlVDVF9EQVRBKSk7CisJU0tfTUVNQ1BZKCYocEFDLT5Qbm1pQmFja3VwKSwgJihwQUMtPlBubWlTdHJ1Y3QpLCAKKwkJCXNpemVvZihTS19QTk1JX1NUUlVDVF9EQVRBKSk7CisKKwlwQUMtPk1heFBvcnRzLS07CisJcE5ldC0+VXAgPSAwOworCisJcmV0dXJuICgwKTsKK30gLyogU2tHZUNsb3NlICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVNrR2VYbWl0IC0gTGludXggZnJhbWUgdHJhbnNtaXQgZnVuY3Rpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBzeXN0ZW0gY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBzZW5kIGZyYW1lcyBvbnRvIHRoZSB3aXJlLgorICoJSXQgcHV0cyB0aGUgZnJhbWUgaW4gdGhlIHR4IGRlc2NyaXB0b3IgcmluZy4gSWYgdGhlIHJpbmcgaXMKKyAqCWZ1bGwgdGhlbiwgdGhlICd0YnVzeScgZmxhZyBpcyBzZXQuCisgKgorICogUmV0dXJuczoKKyAqCTAsIGlmIGV2ZXJ5dGhpbmcgaXMgb2sKKyAqCSE9MCwgb24gZXJyb3IKKyAqIFdBUk5JTkc6IHJldHVybmluZyAxIGluICd0YnVzeScgY2FzZSBjYXVzZWQgc3lzdGVtIGNyYXNoZXMgKGRvdWJsZQorICoJYWxsb2NhdGVkIHNrYidzKSAhISEKKyAqLworc3RhdGljIGludCBTa0dlWG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2KQoreworREVWX05FVAkJKnBOZXQ7CitTS19BQwkJKnBBQzsKK2ludAkJCVJjOwkvKiByZXR1cm4gY29kZSBvZiBYbWl0RnJhbWUgKi8KKworCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXBBQyA9IHBOZXQtPnBBQzsKKworCWlmICgoIXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpIHx8CisJCShwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSkgeworCQkvKiBEb24ndCBhY3RpdmF0ZSBzY2F0dGVyLWdhdGhlciBhbmQgaGFyZHdhcmUgY2hlY2tzdW0gKi8KKworCQlpZiAocEFDLT5SbG10TmV0cyA9PSAyKQorCQkJUmMgPSBYbWl0RnJhbWUoCisJCQkJcEFDLAorCQkJCSZwQUMtPlR4UG9ydFtwTmV0LT5Qb3J0TnJdW1RYX1BSSU9fTE9XXSwKKwkJCQlza2IpOworCQllbHNlCisJCQlSYyA9IFhtaXRGcmFtZSgKKwkJCQlwQUMsCisJCQkJJnBBQy0+VHhQb3J0W3BBQy0+QWN0aXZlUG9ydF1bVFhfUFJJT19MT1ddLAorCQkJCXNrYik7CisJfSBlbHNlIHsKKwkJLyogc2NhdHRlci1nYXRoZXIgYW5kIGhhcmR3YXJlIFRDUCBjaGVja3N1bW1pbmcgYW5hYmxlZCovCisJCWlmIChwQUMtPlJsbXROZXRzID09IDIpCisJCQlSYyA9IFhtaXRGcmFtZVNHKAorCQkJCXBBQywKKwkJCQkmcEFDLT5UeFBvcnRbcE5ldC0+UG9ydE5yXVtUWF9QUklPX0xPV10sCisJCQkJc2tiKTsKKwkJZWxzZQorCQkJUmMgPSBYbWl0RnJhbWVTRygKKwkJCQlwQUMsCisJCQkJJnBBQy0+VHhQb3J0W3BBQy0+QWN0aXZlUG9ydF1bVFhfUFJJT19MT1ddLAorCQkJCXNrYik7CisJfQorCisJLyogVHJhbnNtaXR0ZXIgb3V0IG9mIHJlc291cmNlcz8gKi8KKwlpZiAoUmMgPD0gMCkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCisJLyogSWYgbm90IHRha2VuLCBnaXZlIGJ1ZmZlciBvd25lcnNoaXAgYmFjayB0byB0aGUKKwkgKiBxdWV1ZWluZyBsYXllci4KKwkgKi8KKwlpZiAoUmMgPCAwKQorCQlyZXR1cm4gKDEpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuICgwKTsKK30gLyogU2tHZVhtaXQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJWG1pdEZyYW1lIC0gZmlsbCBvbmUgc29ja2V0IGJ1ZmZlciBpbnRvIHRoZSB0cmFuc21pdCByaW5nCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHB1dHMgYSBtZXNzYWdlIGludG8gdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZworICoJaWYgdGhlcmUgaXMgYSBkZXNjcmlwdG9ycyBsZWZ0LgorICoJTGludXggc2tiJ3MgY29uc2lzdCBvZiBvbmx5IG9uZSBjb250aW51b3VzIGJ1ZmZlci4KKyAqCVRoZSBmaXJzdCBzdGVwIGxvY2tzIHRoZSByaW5nLiBJdCBpcyBoZWxkIGxvY2tlZAorICoJYWxsIHRpbWUgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBTV0lUQ0hfLi4vUE9SVF9SRVNFVC4KKyAqCVRoZW4gdGhlIGRlc2NyaXB0b3JpcyBhbGxvY2F0ZWQuCisgKglUaGUgc2Vjb25kIHBhcnQgaXMgbGlua2luZyB0aGUgYnVmZmVyIHRvIHRoZSBkZXNjcmlwdG9yLgorICoJQXQgdGhlIHZlcnkgbGFzdCwgdGhlIENvbnRyb2wgZmllbGQgb2YgdGhlIGRlc2NyaXB0b3IKKyAqCWlzIG1hZGUgdmFsaWQgZm9yIHRoZSBCTVUgYW5kIGEgc3RhcnQgVFggY29tbWFuZCBpcyBnaXZlbgorICoJaWYgbmVjZXNzYXJ5LgorICoKKyAqIFJldHVybnM6CisgKgk+IDAgLSBvbiBzdWNjZXM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG1lc3NhZ2UKKyAqCT0gMCAtIG9uIHJlc291cmNlIHNob3J0YWdlOiB0aGlzIGZyYW1lIHNlbnQgb3IgZHJvcHBlZCwgbm93CisgKgkJdGhlIHJpbmcgaXMgZnVsbCAoIC0+IHNldCB0YnVzeSkKKyAqCTwgMCAtIG9uIGZhaWx1cmU6IG90aGVyIHByb2JsZW1zICggLT4gcmV0dXJuIGZhaWx1cmUgdG8gdXBwZXIgbGF5ZXJzKQorICovCitzdGF0aWMgaW50IFhtaXRGcmFtZSgKK1NLX0FDIAkJKnBBQywJCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICAgICAgICAgICAqLworVFhfUE9SVAkJKnBUeFBvcnQsCS8qIHBvaW50ZXIgdG8gc3RydWN0IG9mIHBvcnQgdG8gc2VuZCB0byAqLworc3RydWN0IHNrX2J1ZmYJKnBNZXNzYWdlKQkvKiBwb2ludGVyIHRvIHNlbmQtbWVzc2FnZSAgICAgICAgICAgICAgKi8KK3sKKwlUWEQJCSpwVHhkOwkJLyogdGhlIHJ4ZCB0byBmaWxsICovCisJVFhECQkqcE9sZFR4ZDsKKwl1bnNpZ25lZCBsb25nCSBGbGFnczsKKwlTS19VNjQJCSBQaHlzQWRkcjsKKwlpbnQJIAkgUHJvdG9jb2w7CisJaW50CQkgSXBIZWFkZXJMZW5ndGg7CisJaW50CQkgQnl0ZXNTZW5kID0gcE1lc3NhZ2UtPmxlbjsKKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9UWF9QUk9HUkVTUywgKCJYIikpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBUeFBvcnQtPlR4RGVzUmluZ0xvY2ssIEZsYWdzKTsKKyNpZm5kZWYgVVNFX1RYX0NPTVBMRVRFCisJRnJlZVR4RGVzY3JpcHRvcnMocEFDLCBwVHhQb3J0KTsKKyNlbmRpZgorCWlmIChwVHhQb3J0LT5UeGRSaW5nRnJlZSA9PSAwKSB7CisJCS8qIAorCQkqKiBubyBlbm91Z2ggZnJlZSBkZXNjcmlwdG9ycyBpbiByaW5nIGF0IHRoZSBtb21lbnQuCisJCSoqIE1heWJlIGZyZWUnaW5nIHNvbWUgb2xkIG9uZSBoZWxwPworCQkqLworCQlGcmVlVHhEZXNjcmlwdG9ycyhwQUMsIHBUeFBvcnQpOworCQlpZiAocFR4UG9ydC0+VHhkUmluZ0ZyZWUgPT0gMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcFR4UG9ydC0+VHhEZXNSaW5nTG9jaywgRmxhZ3MpOworCQkJU0tfUE5NSV9DTlRfTk9fVFhfQlVGKHBBQywgcFR4UG9ydC0+UG9ydEluZGV4KTsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX1RYX1BST0dSRVNTLAorCQkJCSgiWG1pdEZyYW1lIGZhaWxlZFxuIikpOworCQkJLyogCisJCQkqKiB0aGUgZGVzaXJlZCBtZXNzYWdlIGNhbiBub3QgYmUgc2VudAorCQkJKiogQmVjYXVzZSB0YnVzeSBzZWVtcyB0byBiZSBzZXQsIHRoZSBtZXNzYWdlIAorCQkJKiogc2hvdWxkIG5vdCBiZSBmcmVlZCBoZXJlLiBJdCB3aWxsIGJlIHVzZWQgCisJCQkqKiBieSB0aGUgc2NoZWR1bGVyIG9mIHRoZSBldGhlcm5ldCBoYW5kbGVyIAorCQkJKi8KKwkJCXJldHVybiAoLTEpOworCQl9CisJfQorCisJLyoKKwkqKiBJZiB0aGUgcGFzc2VkIHNvY2tldCBidWZmZXIgaXMgb2Ygc21hbGxlciBNVFUtc2l6ZSB0aGFuIDYwLAorCSoqIGNvcHkgZXZlcnl0aGluZyBpbnRvIG5ldyBidWZmZXIgYW5kIGZpbGwgYWxsIGJ5dGVzIGJldHdlZW4KKwkqKiB0aGUgb3JpZ2luYWwgcGFja2V0IGVuZCBhbmQgdGhlIG5ldyBwYWNrZXQgZW5kIG9mIDYwIHdpdGggMHgwMC4KKwkqKiBUaGlzIGlzIHRvIHJlc29sdmUgZmF1bHR5IHBhZGRpbmcgYnkgdGhlIEhXIHdpdGggMHhhYSBieXRlcy4KKwkqLworCWlmIChCeXRlc1NlbmQgPCBDX0xFTl9FVEhFUk5FVF9NSU5TSVpFKSB7CisJCWlmICgocE1lc3NhZ2UgPSBza2JfcGFkdG8ocE1lc3NhZ2UsIENfTEVOX0VUSEVSTkVUX01JTlNJWkUpKSA9PSBOVUxMKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwVHhQb3J0LT5UeERlc1JpbmdMb2NrLCBGbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwTWVzc2FnZS0+bGVuID0gQ19MRU5fRVRIRVJORVRfTUlOU0laRTsKKwl9CisKKwkvKiAKKwkqKiBhZHZhbmNlIGhlYWQgY291bnRlciBiZWhpbmQgZGVzY3JpcHRvciBuZWVkZWQgZm9yIHRoaXMgZnJhbWUsIAorCSoqIHNvIHRoYXQgbmVlZGVkIGRlc2NyaXB0b3IgaXMgcmVzZXJ2ZWQgZnJvbSB0aGF0IG9uLiBUaGUgbmV4dAorCSoqIGFjdGlvbiB3aWxsIGJlIHRvIGFkZCB0aGUgcGFzc2VkIGJ1ZmZlciB0byB0aGUgVFgtZGVzY3JpcHRvcgorCSovCisJcFR4ZCA9IHBUeFBvcnQtPnBUeGRSaW5nSGVhZDsKKwlwVHhQb3J0LT5wVHhkUmluZ0hlYWQgPSBwVHhkLT5wTmV4dFR4ZDsKKwlwVHhQb3J0LT5UeGRSaW5nRnJlZS0tOworCisjaWZkZWYgU0tfRFVNUF9UWAorCUR1bXBNc2cocE1lc3NhZ2UsICJYbWl0RnJhbWUiKTsKKyNlbmRpZgorCisJLyogCisJKiogRmlyc3Qgc3RlcCBpcyB0byBtYXAgdGhlIGRhdGEgdG8gYmUgc2VudCB2aWEgdGhlIGFkYXB0ZXIgb250bworCSoqIHRoZSBETUEgbWVtb3J5LiBLZXJuZWwgMi4yIHVzZXMgdmlydF90b19idXMoKSwgYnV0IGtlcm5lbHMgMi40CisJKiogYW5kIDIuNiBuZWVkIHRvIHVzZSBwY2lfbWFwX3BhZ2UoKSBmb3IgdGhhdCBtYXBwaW5nLgorCSovCisJUGh5c0FkZHIgPSAoU0tfVTY0KSBwY2lfbWFwX3BhZ2UocEFDLT5QY2lEZXYsCisJCQkJCXZpcnRfdG9fcGFnZShwTWVzc2FnZS0+ZGF0YSksCisJCQkJCSgodW5zaWduZWQgbG9uZykgcE1lc3NhZ2UtPmRhdGEgJiB+UEFHRV9NQVNLKSwKKwkJCQkJcE1lc3NhZ2UtPmxlbiwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJcFR4ZC0+VkRhdGFMb3cgID0gKFNLX1UzMikgKFBoeXNBZGRyICYgMHhmZmZmZmZmZik7CisJcFR4ZC0+VkRhdGFIaWdoID0gKFNLX1UzMikgKFBoeXNBZGRyID4+IDMyKTsKKwlwVHhkLT5wTUJ1ZiAgICAgPSBwTWVzc2FnZTsKKworCWlmIChwTWVzc2FnZS0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCVByb3RvY29sID0gKChTS19VOClwTWVzc2FnZS0+ZGF0YVtDX09GRlNFVF9JUFBST1RPXSAmIDB4ZmYpOworCQlpZiAoKFByb3RvY29sID09IENfUFJPVE9fSURfVURQKSAmJiAKKwkJCShwQUMtPkdJbmkuR0lDaGlwUmV2ID09IDApICYmCisJCQkocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04pKSB7CisJCQlwVHhkLT5UQkNvbnRyb2wgPSBCTVVfVENQX0NIRUNLOworCQl9IGVsc2UgeworCQkJcFR4ZC0+VEJDb250cm9sID0gQk1VX1VEUF9DSEVDSzsKKwkJfQorCisJCUlwSGVhZGVyTGVuZ3RoICA9IChTS19VOClwTWVzc2FnZS0+ZGF0YVtDX09GRlNFVF9JUEhFQURFUl07CisJCUlwSGVhZGVyTGVuZ3RoICA9IChJcEhlYWRlckxlbmd0aCAmIDB4ZikgKiA0OworCQlwVHhkLT5UY3BTdW1PZnMgPSAwOyAvKiBQSC1DaGVja3N1bSBhbHJlYWR5IGNhbGN1bGF0ZWQgKi8KKwkJcFR4ZC0+VGNwU3VtU3QgID0gQ19MRU5fRVRIRVJNQUNfSEVBREVSICsgSXBIZWFkZXJMZW5ndGggKyAKKwkJCQkJCQkoUHJvdG9jb2wgPT0gQ19QUk9UT19JRF9VRFAgPworCQkJCQkJCUNfT0ZGU0VUX1VEUEhFQURFUl9VRFBDUyA6IAorCQkJCQkJCUNfT0ZGU0VUX1RDUEhFQURFUl9UQ1BDUyk7CisJCXBUeGQtPlRjcFN1bVdyICA9IENfTEVOX0VUSEVSTUFDX0hFQURFUiArIElwSGVhZGVyTGVuZ3RoOworCisJCXBUeGQtPlRCQ29udHJvbCB8PSBCTVVfT1dOIHwgQk1VX1NURiB8IAorCQkJCSAgIEJNVV9TVyAgfCBCTVVfRU9GIHwKKyNpZmRlZiBVU0VfVFhfQ09NUExFVEUKKwkJCQkgICBCTVVfSVJRX0VPRiB8CisjZW5kaWYKKwkJCQkgICBwTWVzc2FnZS0+bGVuOworICAgICAgICB9IGVsc2UgeworCQlwVHhkLT5UQkNvbnRyb2wgPSBCTVVfT1dOIHwgQk1VX1NURiB8IEJNVV9DSEVDSyB8IAorCQkJCSAgQk1VX1NXICB8IEJNVV9FT0YgfAorI2lmZGVmIFVTRV9UWF9DT01QTEVURQorCQkJCSAgIEJNVV9JUlFfRU9GIHwKKyNlbmRpZgorCQkJcE1lc3NhZ2UtPmxlbjsKKwl9CisKKwkvKiAKKwkqKiBJZiBwcmV2aW91cyBkZXNjcmlwdG9yIGFscmVhZHkgZG9uZSwgZ2l2ZSBUWCBzdGFydCBjbWQgCisJKi8KKwlwT2xkVHhkID0geGNoZygmcFR4UG9ydC0+cFR4ZFJpbmdQcmV2LCBwVHhkKTsKKwlpZiAoKHBPbGRUeGQtPlRCQ29udHJvbCAmIEJNVV9PV04pID09IDApIHsKKwkJU0tfT1VUOChwVHhQb3J0LT5Id0FkZHIsIFFfQ1NSLCBDU1JfU1RBUlQpOworCX0JCisKKwkvKiAKKwkqKiBhZnRlciByZWxlYXNpbmcgdGhlIGxvY2ssIHRoZSBza2IgbWF5IGltbWVkaWF0ZWx5IGJlIGZyZWUnZCAKKwkqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBUeFBvcnQtPlR4RGVzUmluZ0xvY2ssIEZsYWdzKTsKKwlpZiAocFR4UG9ydC0+VHhkUmluZ0ZyZWUgIT0gMCkgeworCQlyZXR1cm4gKEJ5dGVzU2VuZCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuICgwKTsKKwl9CisKK30gLyogWG1pdEZyYW1lICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlYbWl0RnJhbWVTRyAtIGZpbGwgb25lIHNvY2tldCBidWZmZXIgaW50byB0aGUgdHJhbnNtaXQgcmluZworICogICAgICAgICAgICAgICAgKHVzZSBTRyBhbmQgVENQL1VEUCBoYXJkd2FyZSBjaGVja3N1bW1pbmcpCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHB1dHMgYSBtZXNzYWdlIGludG8gdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZworICoJaWYgdGhlcmUgaXMgYSBkZXNjcmlwdG9ycyBsZWZ0LgorICoKKyAqIFJldHVybnM6CisgKgk+IDAgLSBvbiBzdWNjZXM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG1lc3NhZ2UKKyAqCT0gMCAtIG9uIHJlc291cmNlIHNob3J0YWdlOiB0aGlzIGZyYW1lIHNlbnQgb3IgZHJvcHBlZCwgbm93CisgKgkJdGhlIHJpbmcgaXMgZnVsbCAoIC0+IHNldCB0YnVzeSkKKyAqCTwgMCAtIG9uIGZhaWx1cmU6IG90aGVyIHByb2JsZW1zICggLT4gcmV0dXJuIGZhaWx1cmUgdG8gdXBwZXIgbGF5ZXJzKQorICovCitzdGF0aWMgaW50IFhtaXRGcmFtZVNHKAorU0tfQUMgCQkqcEFDLAkJLyogcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgICAgICAgICAgICovCitUWF9QT1JUCQkqcFR4UG9ydCwJLyogcG9pbnRlciB0byBzdHJ1Y3Qgb2YgcG9ydCB0byBzZW5kIHRvICovCitzdHJ1Y3Qgc2tfYnVmZgkqcE1lc3NhZ2UpCS8qIHBvaW50ZXIgdG8gc2VuZC1tZXNzYWdlICAgICAgICAgICAgICAqLworeworCisJVFhECQkqcFR4ZDsKKwlUWEQJCSpwVHhkRnN0OworCVRYRAkJKnBUeGRMc3Q7CisJaW50IAkgCSBDdXJyRnJhZzsKKwlpbnQJCSBCeXRlc1NlbmQ7CisJaW50CQkgSXBIZWFkZXJMZW5ndGg7IAorCWludAkJIFByb3RvY29sOworCXNrYl9mcmFnX3QJKnNrX2ZyYWc7CisJU0tfVTY0CQkgUGh5c0FkZHI7CisJdW5zaWduZWQgbG9uZwkgRmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcFR4UG9ydC0+VHhEZXNSaW5nTG9jaywgRmxhZ3MpOworI2lmbmRlZiBVU0VfVFhfQ09NUExFVEUKKwlGcmVlVHhEZXNjcmlwdG9ycyhwQUMsIHBUeFBvcnQpOworI2VuZGlmCisJaWYgKChza2Jfc2hpbmZvKHBNZXNzYWdlKS0+bnJfZnJhZ3MgKzEpID4gcFR4UG9ydC0+VHhkUmluZ0ZyZWUpIHsKKwkJRnJlZVR4RGVzY3JpcHRvcnMocEFDLCBwVHhQb3J0KTsKKwkJaWYgKChza2Jfc2hpbmZvKHBNZXNzYWdlKS0+bnJfZnJhZ3MgKyAxKSA+IHBUeFBvcnQtPlR4ZFJpbmdGcmVlKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwVHhQb3J0LT5UeERlc1JpbmdMb2NrLCBGbGFncyk7CisJCQlTS19QTk1JX0NOVF9OT19UWF9CVUYocEFDLCBwVHhQb3J0LT5Qb3J0SW5kZXgpOworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfVFhfUFJPR1JFU1MsCisJCQkJKCJYbWl0RnJhbWVTRyBmYWlsZWQgLSBSaW5nIGZ1bGxcbiIpKTsKKwkJCQkvKiB0aGlzIG1lc3NhZ2UgY2FuIG5vdCBiZSBzZW50IG5vdyAqLworCQkJcmV0dXJuKC0xKTsKKwkJfQorCX0KKworCXBUeGQgICAgICA9IHBUeFBvcnQtPnBUeGRSaW5nSGVhZDsKKwlwVHhkRnN0ICAgPSBwVHhkOworCXBUeGRMc3QgICA9IHBUeGQ7CisJQnl0ZXNTZW5kID0gMDsKKwlQcm90b2NvbCAgPSAwOworCisJLyogCisJKiogTWFwIHRoZSBmaXJzdCBmcmFnbWVudCAoaGVhZGVyKSBpbnRvIHRoZSBETUEtc3BhY2UKKwkqLworCVBoeXNBZGRyID0gKFNLX1U2NCkgcGNpX21hcF9wYWdlKHBBQy0+UGNpRGV2LAorCQkJdmlydF90b19wYWdlKHBNZXNzYWdlLT5kYXRhKSwKKwkJCSgodW5zaWduZWQgbG9uZykgcE1lc3NhZ2UtPmRhdGEgJiB+UEFHRV9NQVNLKSwKKwkJCXNrYl9oZWFkbGVuKHBNZXNzYWdlKSwKKwkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCisJcFR4ZC0+VkRhdGFMb3cgID0gKFNLX1UzMikgKFBoeXNBZGRyICYgMHhmZmZmZmZmZik7CisJcFR4ZC0+VkRhdGFIaWdoID0gKFNLX1UzMikgKFBoeXNBZGRyID4+IDMyKTsKKworCS8qIAorCSoqIERvZXMgdGhlIEhXIG5lZWQgdG8gZXZhbHVhdGUgY2hlY2tzdW0gZm9yIFRDUCBvciBVRFAgcGFja2V0cz8gCisJKi8KKwlpZiAocE1lc3NhZ2UtPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQlwVHhkLT5UQkNvbnRyb2wgPSBCTVVfU1RGIHwgQk1VX1NURldEIHwgc2tiX2hlYWRsZW4ocE1lc3NhZ2UpOworCQkvKiAKKwkJKiogV2UgaGF2ZSB0byB1c2UgdGhlIG9wY29kZSBmb3IgdGNwIGhlcmUsICBiZWNhdXNlIHRoZQorCQkqKiBvcGNvZGUgZm9yIHVkcCBpcyBub3Qgd29ya2luZyBpbiB0aGUgaGFyZHdhcmUgeWV0IAorCQkqKiAoUmV2aXNpb24gMi4wKQorCQkqLworCQlQcm90b2NvbCA9ICgoU0tfVTgpcE1lc3NhZ2UtPmRhdGFbQ19PRkZTRVRfSVBQUk9UT10gJiAweGZmKTsKKwkJaWYgKChQcm90b2NvbCA9PSBDX1BST1RPX0lEX1VEUCkgJiYgCisJCQkocEFDLT5HSW5pLkdJQ2hpcFJldiA9PSAwKSAmJgorCQkJKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX1lVS09OKSkgeworCQkJcFR4ZC0+VEJDb250cm9sIHw9IEJNVV9UQ1BfQ0hFQ0s7CisJCX0gZWxzZSB7CisJCQlwVHhkLT5UQkNvbnRyb2wgfD0gQk1VX1VEUF9DSEVDSzsKKwkJfQorCisJCUlwSGVhZGVyTGVuZ3RoICA9ICgoU0tfVTgpcE1lc3NhZ2UtPmRhdGFbQ19PRkZTRVRfSVBIRUFERVJdICYgMHhmKSo0OworCQlwVHhkLT5UY3BTdW1PZnMgPSAwOyAvKiBQSC1DaGVja3N1bSBhbHJlYWR5IGNsYWN1bGF0ZWQgKi8KKwkJcFR4ZC0+VGNwU3VtU3QgID0gQ19MRU5fRVRIRVJNQUNfSEVBREVSICsgSXBIZWFkZXJMZW5ndGggKworCQkJCQkJKFByb3RvY29sID09IENfUFJPVE9fSURfVURQID8KKwkJCQkJCUNfT0ZGU0VUX1VEUEhFQURFUl9VRFBDUyA6CisJCQkJCQlDX09GRlNFVF9UQ1BIRUFERVJfVENQQ1MpOworCQlwVHhkLT5UY3BTdW1XciAgPSBDX0xFTl9FVEhFUk1BQ19IRUFERVIgKyBJcEhlYWRlckxlbmd0aDsKKwl9IGVsc2UgeworCQlwVHhkLT5UQkNvbnRyb2wgPSBCTVVfQ0hFQ0sgfCBCTVVfU1cgfCBCTVVfU1RGIHwKKwkJCQkJc2tiX2hlYWRsZW4ocE1lc3NhZ2UpOworCX0KKworCXBUeGQgPSBwVHhkLT5wTmV4dFR4ZDsKKwlwVHhQb3J0LT5UeGRSaW5nRnJlZS0tOworCUJ5dGVzU2VuZCArPSBza2JfaGVhZGxlbihwTWVzc2FnZSk7CisKKwkvKiAKKwkqKiBCcm93c2Ugb3ZlciBhbGwgU0cgZnJhZ21lbnRzIGFuZCBtYXAgZWFjaCBvZiB0aGVtIGludG8gdGhlIERNQSBzcGFjZQorCSovCisJZm9yIChDdXJyRnJhZyA9IDA7IEN1cnJGcmFnIDwgc2tiX3NoaW5mbyhwTWVzc2FnZSktPm5yX2ZyYWdzOyBDdXJyRnJhZysrKSB7CisJCXNrX2ZyYWcgPSAmc2tiX3NoaW5mbyhwTWVzc2FnZSktPmZyYWdzW0N1cnJGcmFnXTsKKwkJLyogCisJCSoqIHdlIGFscmVhZHkgaGF2ZSB0aGUgcHJvcGVyIHZhbHVlIGluIGVudHJ5CisJCSovCisJCVBoeXNBZGRyID0gKFNLX1U2NCkgcGNpX21hcF9wYWdlKHBBQy0+UGNpRGV2LAorCQkJCQkJIHNrX2ZyYWctPnBhZ2UsCisJCQkJCQkgc2tfZnJhZy0+cGFnZV9vZmZzZXQsCisJCQkJCQkgc2tfZnJhZy0+c2l6ZSwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQlwVHhkLT5WRGF0YUxvdyAgPSAoU0tfVTMyKSAoUGh5c0FkZHIgJiAweGZmZmZmZmZmKTsKKwkJcFR4ZC0+VkRhdGFIaWdoID0gKFNLX1UzMikgKFBoeXNBZGRyID4+IDMyKTsKKwkJcFR4ZC0+cE1CdWYgICAgID0gcE1lc3NhZ2U7CisJCQorCQkvKiAKKwkJKiogRG9lcyB0aGUgSFcgbmVlZCB0byBldmFsdWF0ZSBjaGVja3N1bSBmb3IgVENQIG9yIFVEUCBwYWNrZXRzPyAKKwkJKi8KKwkJaWYgKHBNZXNzYWdlLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpIHsKKwkJCXBUeGQtPlRCQ29udHJvbCA9IEJNVV9PV04gfCBCTVVfU1cgfCBCTVVfU1RGV0Q7CisJCQkvKiAKKwkJCSoqIFdlIGhhdmUgdG8gdXNlIHRoZSBvcGNvZGUgZm9yIHRjcCBoZXJlIGJlY2F1c2UgdGhlIAorCQkJKiogb3Bjb2RlIGZvciB1ZHAgaXMgbm90IHdvcmtpbmcgaW4gdGhlIGhhcmR3YXJlIHlldCAKKwkJCSoqIChyZXZpc2lvbiAyLjApCisJCQkqLworCQkJaWYgKChQcm90b2NvbCA9PSBDX1BST1RPX0lEX1VEUCkgJiYgCisJCQkJKHBBQy0+R0luaS5HSUNoaXBSZXYgPT0gMCkgJiYKKwkJCQkocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04pKSB7CisJCQkJcFR4ZC0+VEJDb250cm9sIHw9IEJNVV9UQ1BfQ0hFQ0s7CisJCQl9IGVsc2UgeworCQkJCXBUeGQtPlRCQ29udHJvbCB8PSBCTVVfVURQX0NIRUNLOworCQkJfQorCQl9IGVsc2UgeworCQkJcFR4ZC0+VEJDb250cm9sID0gQk1VX0NIRUNLIHwgQk1VX1NXIHwgQk1VX09XTjsKKwkJfQorCisJCS8qIAorCQkqKiBEbyB3ZSBoYXZlIHRoZSBsYXN0IGZyYWdtZW50PyAKKwkJKi8KKwkJaWYoIChDdXJyRnJhZysxKSA9PSBza2Jfc2hpbmZvKHBNZXNzYWdlKS0+bnJfZnJhZ3MgKSAgeworI2lmZGVmIFVTRV9UWF9DT01QTEVURQorCQkJcFR4ZC0+VEJDb250cm9sIHw9IEJNVV9FT0YgfCBCTVVfSVJRX0VPRiB8IHNrX2ZyYWctPnNpemU7CisjZWxzZQorCQkJcFR4ZC0+VEJDb250cm9sIHw9IEJNVV9FT0YgfCBza19mcmFnLT5zaXplOworI2VuZGlmCisJCQlwVHhkRnN0LT5UQkNvbnRyb2wgfD0gQk1VX09XTiB8IEJNVV9TVzsKKworCQl9IGVsc2UgeworCQkJcFR4ZC0+VEJDb250cm9sIHw9IHNrX2ZyYWctPnNpemU7CisJCX0KKwkJcFR4ZExzdCA9IHBUeGQ7CisJCXBUeGQgICAgPSBwVHhkLT5wTmV4dFR4ZDsKKwkJcFR4UG9ydC0+VHhkUmluZ0ZyZWUtLTsKKwkJQnl0ZXNTZW5kICs9IHNrX2ZyYWctPnNpemU7CisJfQorCisJLyogCisJKiogSWYgcHJldmlvdXMgZGVzY3JpcHRvciBhbHJlYWR5IGRvbmUsIGdpdmUgVFggc3RhcnQgY21kIAorCSovCisJaWYgKChwVHhQb3J0LT5wVHhkUmluZ1ByZXYtPlRCQ29udHJvbCAmIEJNVV9PV04pID09IDApIHsKKwkJU0tfT1VUOChwVHhQb3J0LT5Id0FkZHIsIFFfQ1NSLCBDU1JfU1RBUlQpOworCX0KKworCXBUeFBvcnQtPnBUeGRSaW5nUHJldiA9IHBUeGRMc3Q7CisJcFR4UG9ydC0+cFR4ZFJpbmdIZWFkID0gcFR4ZDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBUeFBvcnQtPlR4RGVzUmluZ0xvY2ssIEZsYWdzKTsKKworCWlmIChwVHhQb3J0LT5UeGRSaW5nRnJlZSA+IDApIHsKKwkJcmV0dXJuIChCeXRlc1NlbmQpOworCX0gZWxzZSB7CisJCXJldHVybiAoMCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJRnJlZVR4RGVzY3JpcHRvcnMgLSByZWxlYXNlIGRlc2NyaXB0b3JzIGZyb20gdGhlIGRlc2NyaXB0b3IgcmluZworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiByZWxlYXNlcyBkZXNjcmlwdG9ycyBmcm9tIGEgdHJhbnNtaXQgcmluZyBpZiB0aGV5CisgKgloYXZlIGJlZW4gc2VudCBieSB0aGUgQk1VLgorICoJSWYgYSBkZXNjcmlwdG9ycyBpcyBzZW50LCBpdCBjYW4gYmUgZnJlZWQgYW5kIHRoZSBtZXNzYWdlIGNhbgorICoJYmUgZnJlZWQsIHRvby4KKyAqCVRoZSBTT0ZUV0FSRSBjb250cm9sbGFibGUgYml0IGlzIHVzZWQgdG8gcHJldmVudCBydW5uaW5nIGFyb3VuZCBhCisgKgljb21wbGV0ZWx5IGZyZWUgcmluZyBmb3IgZXZlci4gSWYgdGhpcyBiaXQgaXMgbm8gc2V0IGluIHRoZQorICoJZnJhbWUgKGJ5IFhtaXRGcmFtZSksIHRoaXMgZnJhbWUgaGFzIG5ldmVyIGJlZW4gc2VudCBvciBpcworICoJYWxyZWFkeSBmcmVlZC4KKyAqCVRoZSBUeCBkZXNjcmlwdG9yIHJpbmcgbG9jayBtdXN0IGJlIGhlbGQgd2hpbGUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uICEhIQorICoKKyAqIFJldHVybnM6CisgKglub25lCisgKi8KK3N0YXRpYyB2b2lkIEZyZWVUeERlc2NyaXB0b3JzKAorU0tfQUMJKnBBQywJCS8qIHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgY29udGV4dCAqLworVFhfUE9SVAkqcFR4UG9ydCkJLyogcG9pbnRlciB0byBkZXN0aW5hdGlvbiBwb3J0IHN0cnVjdHVyZSAqLworeworVFhECSpwVHhkOwkJLyogcG9pbnRlciB0byB0aGUgY2hlY2tlZCBkZXNjcmlwdG9yICovCitUWEQJKnBOZXdUYWlsOwkvKiBwb2ludGVyIHRvICdlbmQnIG9mIHRoZSByaW5nICovCitTS19VMzIJQ29udHJvbDsJLyogVEJDb250cm9sIGZpZWxkIG9mIGRlc2NyaXB0b3IgKi8KK1NLX1U2NAlQaHlzQWRkcjsJLyogYWRkcmVzcyBvZiBETUEgbWFwcGluZyAqLworCisJcE5ld1RhaWwgPSBwVHhQb3J0LT5wVHhkUmluZ1RhaWw7CisJcFR4ZCAgICAgPSBwTmV3VGFpbDsKKwkvKgorCSoqIGxvb3AgZm9yZXZlcjsgZXhpdHMgaWYgQk1VX1NXIGJpdCBub3Qgc2V0IGluIHN0YXJ0IGZyYW1lCisJKiogb3IgQk1VX09XTiBiaXQgc2V0IGluIGFueSBmcmFtZQorCSovCisJd2hpbGUgKDEpIHsKKwkJQ29udHJvbCA9IHBUeGQtPlRCQ29udHJvbDsKKwkJaWYgKChDb250cm9sICYgQk1VX1NXKSA9PSAwKSB7CisJCQkvKgorCQkJKiogc29mdHdhcmUgY29udHJvbGxhYmxlIGJpdCBpcyBzZXQgaW4gZmlyc3QKKwkJCSoqIGZyYWdtZW50IHdoZW4gZ2l2ZW4gdG8gQk1VLiBOb3Qgc2V0IG1lYW5zIHRoYXQKKwkJCSoqIHRoaXMgZnJhZ21lbnQgd2FzIG5ldmVyIHNlbnQgb3IgaXMgYWxyZWFkeQorCQkJKiogZnJlZWQgKCAtPiByaW5nIGNvbXBsZXRlbHkgZnJlZSBub3cpLgorCQkJKi8KKwkJCXBUeFBvcnQtPnBUeGRSaW5nVGFpbCA9IHBUeGQ7CisJCQluZXRpZl93YWtlX3F1ZXVlKHBBQy0+ZGV2W3BUeFBvcnQtPlBvcnRJbmRleF0pOworCQkJcmV0dXJuOworCQl9CisJCWlmIChDb250cm9sICYgQk1VX09XTikgeworCQkJcFR4UG9ydC0+cFR4ZFJpbmdUYWlsID0gcFR4ZDsKKwkJCWlmIChwVHhQb3J0LT5UeGRSaW5nRnJlZSA+IDApIHsKKwkJCQluZXRpZl93YWtlX3F1ZXVlKHBBQy0+ZGV2W3BUeFBvcnQtPlBvcnRJbmRleF0pOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCQorCQkvKiAKKwkJKiogcmVsZWFzZSB0aGUgRE1BIG1hcHBpbmcsIGJlY2F1c2UgdW50aWwgbm90IHVubWFwcGVkCisJCSoqIHRoaXMgYnVmZmVyIGlzIGNvbnNpZGVyZWQgYmVpbmcgdW5kZXIgY29udHJvbCBvZiB0aGUKKwkJKiogYWRhcHRlciBjYXJkIQorCQkqLworCQlQaHlzQWRkciA9ICgoU0tfVTY0KSBwVHhkLT5WRGF0YUhpZ2gpIDw8IChTS19VNjQpIDMyOworCQlQaHlzQWRkciB8PSAoU0tfVTY0KSBwVHhkLT5WRGF0YUxvdzsKKwkJcGNpX3VubWFwX3BhZ2UocEFDLT5QY2lEZXYsIFBoeXNBZGRyLAorCQkJCSBwVHhkLT5wTUJ1Zi0+bGVuLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQlpZiAoQ29udHJvbCAmIEJNVV9FT0YpCisJCQlERVZfS0ZSRUVfU0tCX0FOWShwVHhkLT5wTUJ1Zik7CS8qIGZyZWUgbWVzc2FnZSAqLworCisJCXBUeFBvcnQtPlR4ZFJpbmdGcmVlKys7CisJCXBUeGQtPlRCQ29udHJvbCAmPSB+Qk1VX1NXOworCQlwVHhkID0gcFR4ZC0+cE5leHRUeGQ7IC8qIHBvaW50IGJlaGluZCBmcmFnbWVudCB3aXRoIEVPRiAqLworCX0gLyogd2hpbGUoZm9yZXZlcikgKi8KK30gLyogRnJlZVR4RGVzY3JpcHRvcnMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCUZpbGxSeFJpbmcgLSBmaWxsIHRoZSByZWNlaXZlIHJpbmcgd2l0aCB2YWxpZCBkZXNjcmlwdG9ycworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBmaWxscyB0aGUgcmVjZWl2ZSByaW5nIGRlc2NyaXB0b3JzIHdpdGggZGF0YQorICoJc2VnbWVudHMgYW5kIG1ha2VzIHRoZW0gdmFsaWQgZm9yIHRoZSBCTVUuCisgKglUaGUgYWN0aXZlIHJpbmcgaXMgZmlsbGVkIGNvbXBsZXRlbHksIGlmIHBvc3NpYmxlLgorICoJVGhlIG5vbi1hY3RpdmUgcmluZyBpcyBmaWxsZWQgb25seSBwYXJ0aWFsIHRvIHNhdmUgbWVtb3J5LgorICoKKyAqIERlc2NyaXB0aW9uIG9mIHJ4IHJpbmcgc3RydWN0dXJlOgorICoJaGVhZCAtIHBvaW50cyB0byB0aGUgZGVzY3JpcHRvciB3aGljaCB3aWxsIGJlIHVzZWQgbmV4dCBieSB0aGUgQk1VCisgKgl0YWlsIC0gcG9pbnRzIHRvIHRoZSBuZXh0IGRlc2NyaXB0b3IgdG8gZ2l2ZSB0byB0aGUgQk1VCisgKgkKKyAqIFJldHVybnM6CU4vQQorICovCitzdGF0aWMgdm9pZCBGaWxsUnhSaW5nKAorU0tfQUMJCSpwQUMsCQkvKiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIGNvbnRleHQgKi8KK1JYX1BPUlQJCSpwUnhQb3J0KQkvKiBwdHIgdG8gcG9ydCBzdHJ1Y3QgZm9yIHdoaWNoIHRoZSByaW5nCisJCQkJICAgc2hvdWxkIGJlIGZpbGxlZCAqLworewordW5zaWduZWQgbG9uZwlGbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwUnhQb3J0LT5SeERlc1JpbmdMb2NrLCBGbGFncyk7CisJd2hpbGUgKHBSeFBvcnQtPlJ4ZFJpbmdGcmVlID4gcFJ4UG9ydC0+UnhGaWxsTGltaXQpIHsKKwkJaWYoIUZpbGxSeERlc2NyaXB0b3IocEFDLCBwUnhQb3J0KSkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwUnhQb3J0LT5SeERlc1JpbmdMb2NrLCBGbGFncyk7Cit9IC8qIEZpbGxSeFJpbmcgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJRmlsbFJ4RGVzY3JpcHRvciAtIGZpbGwgb25lIGJ1ZmZlciBpbnRvIHRoZSByZWNlaXZlIHJpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBuZXcgcmVjZWl2ZSBidWZmZXIgYW5kCisgKglwdXRzIGl0IGludG8gdGhlIG5leHQgZGVzY3JpcHRvci4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfVFJVRSAtIGEgYnVmZmVyIHdhcyBhZGRlZCB0byB0aGUgcmluZworICoJU0tfRkFMU0UgLSBhIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWRkZWQKKyAqLworc3RhdGljIFNLX0JPT0wgRmlsbFJ4RGVzY3JpcHRvcigKK1NLX0FDCQkqcEFDLAkJLyogcG9pbnRlciB0byB0aGUgYWRhcHRlciBjb250ZXh0IHN0cnVjdCAqLworUlhfUE9SVAkJKnBSeFBvcnQpCS8qIHB0ciB0byBwb3J0IHN0cnVjdCBvZiByaW5nIHRvIGZpbGwgKi8KK3sKK3N0cnVjdCBza19idWZmCSpwTXNnQmxvY2s7CS8qIHBvaW50ZXIgdG8gYSBuZXcgbWVzc2FnZSBibG9jayAqLworUlhECQkqcFJ4ZDsJCS8qIHRoZSByeGQgdG8gZmlsbCAqLworU0tfVTE2CQlMZW5ndGg7CQkvKiBkYXRhIGZyYWdtZW50IGxlbmd0aCAqLworU0tfVTY0CQlQaHlzQWRkcjsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBhIHJ4IGJ1ZmZlciAqLworCisJcE1zZ0Jsb2NrID0gYWxsb2Nfc2tiKHBBQy0+UnhCdWZTaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAocE1zZ0Jsb2NrID09IE5VTEwpIHsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJCSgiJXM6IEFsbG9jYXRpb24gb2YgcnggYnVmZmVyIGZhaWxlZCAhXG4iLAorCQkJcEFDLT5kZXZbcFJ4UG9ydC0+UG9ydEluZGV4XS0+bmFtZSkpOworCQlTS19QTk1JX0NOVF9OT19SWF9CVUYocEFDLCBwUnhQb3J0LT5Qb3J0SW5kZXgpOworCQlyZXR1cm4oU0tfRkFMU0UpOworCX0KKwlza2JfcmVzZXJ2ZShwTXNnQmxvY2ssIDIpOyAvKiB0byBhbGlnbiBJUCBmcmFtZXMgKi8KKwkvKiBza2IgYWxsb2NhdGVkIG9rLCBzbyBhZGQgYnVmZmVyICovCisJcFJ4ZCA9IHBSeFBvcnQtPnBSeGRSaW5nVGFpbDsKKwlwUnhQb3J0LT5wUnhkUmluZ1RhaWwgPSBwUnhkLT5wTmV4dFJ4ZDsKKwlwUnhQb3J0LT5SeGRSaW5nRnJlZS0tOworCUxlbmd0aCA9IHBBQy0+UnhCdWZTaXplOworCVBoeXNBZGRyID0gKFNLX1U2NCkgcGNpX21hcF9wYWdlKHBBQy0+UGNpRGV2LAorCQl2aXJ0X3RvX3BhZ2UocE1zZ0Jsb2NrLT5kYXRhKSwKKwkJKCh1bnNpZ25lZCBsb25nKSBwTXNnQmxvY2stPmRhdGEgJgorCQl+UEFHRV9NQVNLKSwKKwkJcEFDLT5SeEJ1ZlNpemUgLSAyLAorCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJcFJ4ZC0+VkRhdGFMb3cgID0gKFNLX1UzMikgKFBoeXNBZGRyICYgMHhmZmZmZmZmZik7CisJcFJ4ZC0+VkRhdGFIaWdoID0gKFNLX1UzMikgKFBoeXNBZGRyID4+IDMyKTsKKwlwUnhkLT5wTUJ1ZiAgICAgPSBwTXNnQmxvY2s7CisJcFJ4ZC0+UkJDb250cm9sID0gQk1VX09XTiAgICAgICB8IAorCQkJICBCTVVfU1RGICAgICAgIHwgCisJCQkgIEJNVV9JUlFfRU9GICAgfCAKKwkJCSAgQk1VX1RDUF9DSEVDSyB8IAorCQkJICBMZW5ndGg7CisJcmV0dXJuIChTS19UUlVFKTsKKworfSAvKiBGaWxsUnhEZXNjcmlwdG9yICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVJlUXVldWVSeEJ1ZmZlciAtIGZpbGwgb25lIGJ1ZmZlciBiYWNrIGludG8gdGhlIHJlY2VpdmUgcmluZworICoKKyAqIERlc2NyaXB0aW9uOgorICoJRmlsbCBhIGdpdmVuIGJ1ZmZlciBiYWNrIGludG8gdGhlIHJ4IHJpbmcuIFRoZSBidWZmZXIKKyAqCWhhcyBiZWVuIHByZXZpb3VzbHkgYWxsb2NhdGVkIGFuZCBhbGlnbmVkLCBhbmQgaXRzIHBoeXMuCisgKglhZGRyZXNzIGNhbGN1bGF0ZWQsIHNvIHRoaXMgaXMgbm8gbW9yZSBuZWNlc3NhcnkuCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIFJlUXVldWVSeEJ1ZmZlcigKK1NLX0FDCQkqcEFDLAkJLyogcG9pbnRlciB0byB0aGUgYWRhcHRlciBjb250ZXh0IHN0cnVjdCAqLworUlhfUE9SVAkJKnBSeFBvcnQsCS8qIHB0ciB0byBwb3J0IHN0cnVjdCBvZiByaW5nIHRvIGZpbGwgKi8KK3N0cnVjdCBza19idWZmCSpwTXNnLAkJLyogcG9pbnRlciB0byB0aGUgYnVmZmVyICovCitTS19VMzIJCVBoeXNIaWdoLAkvKiBwaHlzIGFkZHJlc3MgaGlnaCBkd29yZCAqLworU0tfVTMyCQlQaHlzTG93KQkvKiBwaHlzIGFkZHJlc3MgbG93IGR3b3JkICovCit7CitSWEQJCSpwUnhkOwkJLyogdGhlIHJ4ZCB0byBmaWxsICovCitTS19VMTYJCUxlbmd0aDsJCS8qIGRhdGEgZnJhZ21lbnQgbGVuZ3RoICovCisKKwlwUnhkID0gcFJ4UG9ydC0+cFJ4ZFJpbmdUYWlsOworCXBSeFBvcnQtPnBSeGRSaW5nVGFpbCA9IHBSeGQtPnBOZXh0UnhkOworCXBSeFBvcnQtPlJ4ZFJpbmdGcmVlLS07CisJTGVuZ3RoID0gcEFDLT5SeEJ1ZlNpemU7CisKKwlwUnhkLT5WRGF0YUxvdyAgPSBQaHlzTG93OworCXBSeGQtPlZEYXRhSGlnaCA9IFBoeXNIaWdoOworCXBSeGQtPnBNQnVmICAgICA9IHBNc2c7CisJcFJ4ZC0+UkJDb250cm9sID0gQk1VX09XTiAgICAgICB8IAorCQkJICBCTVVfU1RGICAgICAgIHwKKwkJCSAgQk1VX0lSUV9FT0YgICB8IAorCQkJICBCTVVfVENQX0NIRUNLIHwgCisJCQkgIExlbmd0aDsKKwlyZXR1cm47Cit9IC8qIFJlUXVldWVSeEJ1ZmZlciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJUmVjZWl2ZUlycSAtIGhhbmRsZSBhIHJlY2VpdmUgSVJRCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgcmVjZWl2ZSBJUlEgaXMgc2V0LgorICoJSXQgd2Fsa3MgdGhlIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nIGFuZCBzZW5kcyB1cCBhbGwKKyAqCWZyYW1lcyB0aGF0IGFyZSBjb21wbGV0ZS4KKyAqCisgKiBSZXR1cm5zOglOL0EKKyAqLworc3RhdGljIHZvaWQgUmVjZWl2ZUlycSgKKwlTS19BQwkJKnBBQywJCQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworCVJYX1BPUlQJCSpwUnhQb3J0LAkJLyogcG9pbnRlciB0byByZWNlaXZlIHBvcnQgc3RydWN0ICovCisJU0tfQk9PTAkJU2xvd1BhdGhMb2NrKQkvKiBpbmRpY2F0ZXMgaWYgU2xvd1BhdGhMb2NrIGlzIG5lZWRlZCAqLworeworUlhECQkJCSpwUnhkOwkJCS8qIHBvaW50ZXIgdG8gcmVjZWl2ZSBkZXNjcmlwdG9ycyAqLworU0tfVTMyCQkJQ29udHJvbDsJCS8qIGNvbnRyb2wgZmllbGQgb2YgZGVzY3JpcHRvciAqLworc3RydWN0IHNrX2J1ZmYJKnBNc2c7CQkJLyogcG9pbnRlciB0byBtZXNzYWdlIGhvbGRpbmcgZnJhbWUgKi8KK3N0cnVjdCBza19idWZmCSpwTmV3TXNnOwkJLyogcG9pbnRlciB0byBhIG5ldyBtZXNzYWdlIGZvciBjb3B5aW5nIGZyYW1lICovCitpbnQJCQkJRnJhbWVMZW5ndGg7CS8qIHRvdGFsIGxlbmd0aCBvZiByZWNlaXZlZCBmcmFtZSAqLworaW50CQkJCUlwRnJhbWVMZW5ndGg7CitTS19NQlVGCQkJKnBSbG10TWJ1ZjsJCS8qIHB0ciB0byBhIGJ1ZmZlciBmb3IgZ2l2aW5nIGEgZnJhbWUgdG8gcmxtdCAqLworU0tfRVZQQVJBCQlFdlBhcmE7CQkJLyogYW4gZXZlbnQgcGFyYW1ldGVyIHVuaW9uICovCQordW5zaWduZWQgbG9uZwlGbGFnczsJCQkvKiBmb3Igc3BpbiBsb2NrICovCitpbnQJCQkJUG9ydEluZGV4ID0gcFJ4UG9ydC0+UG9ydEluZGV4OwordW5zaWduZWQgaW50CU9mZnNldDsKK3Vuc2lnbmVkIGludAlOdW1CeXRlczsKK3Vuc2lnbmVkIGludAlGb3JSbG10OworU0tfQk9PTAkJCUlzQmM7CitTS19CT09MCQkJSXNNYzsKK1NLX0JPT0wgIElzQmFkRnJhbWU7IAkJCS8qIEJhZCBmcmFtZSAqLworCitTS19VMzIJCQlGcmFtZVN0YXQ7Cit1bnNpZ25lZCBzaG9ydAlDc3VtMTsKK3Vuc2lnbmVkIHNob3J0CUNzdW0yOwordW5zaWduZWQgc2hvcnQJVHlwZTsKK2ludAkJCQlSZXN1bHQ7CitTS19VNjQJCQlQaHlzQWRkcjsKKworcnhfc3RhcnQ6CQorCS8qIGRvIGZvcmV2ZXI7IGV4aXQgaWYgQk1VX09XTiBmb3VuZCAqLworCWZvciAoIHBSeGQgPSBwUnhQb3J0LT5wUnhkUmluZ0hlYWQgOworCQkgIHBSeFBvcnQtPlJ4ZFJpbmdGcmVlIDwgcEFDLT5SeERlc2NyUGVyUmluZyA7CisJCSAgcFJ4ZCA9IHBSeGQtPnBOZXh0UnhkLAorCQkgIHBSeFBvcnQtPnBSeGRSaW5nSGVhZCA9IHBSeGQsCisJCSAgcFJ4UG9ydC0+UnhkUmluZ0ZyZWUgKyspIHsKKworCQkvKgorCQkgKiBGb3IgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiB0aGlzIGxvb3AKKwkJICogR28gdGhyb3VnaCBldmVyeSBkZXNjcmlwdG9yIGJlZ2lubmluZyBhdCB0aGUgaGVhZAorCQkgKiBQbGVhc2Ugbm90ZTogdGhlIHJpbmcgbWlnaHQgYmUgY29tcGxldGVseSByZWNlaXZlZCBzbyB0aGUgT1dOIGJpdAorCQkgKiBzZXQgaXMgbm90IGEgZ29vZCBjcmlydGVyaWEgdG8gbGVhdmUgdGhhdCBsb29wLgorCQkgKiBUaGVyZWZvcmUgdGhlIFJpbmdGcmVlIGNvdW50ZXIgaXMgdXNlZC4KKwkJICogT24gZW50cnkgb2YgdGhpcyBsb29wIHBSeGQgaXMgYSBwb2ludGVyIHRvIHRoZSBSeGQgdGhhdCBuZWVkcworCQkgKiB0byBiZSBjaGVja2VkIG5leHQuCisJCSAqLworCisJCUNvbnRyb2wgPSBwUnhkLT5SQkNvbnRyb2w7CisJCisJCS8qIGNoZWNrIGlmIHRoaXMgZGVzY3JpcHRvciBpcyByZWFkeSAqLworCQlpZiAoKENvbnRyb2wgJiBCTVVfT1dOKSAhPSAwKSB7CisJCQkvKiB0aGlzIGRlc2NyaXB0b3IgaXMgbm90IHlldCByZWFkeSAqLworCQkJLyogVGhpcyBpcyB0aGUgdXN1YWwgZW5kIG9mIHRoZSBsb29wICovCisJCQkvKiBXZSBkb24ndCBuZWVkIHRvIHN0YXJ0IHRoZSByaW5nIGFnYWluICovCisJCQlGaWxsUnhSaW5nKHBBQywgcFJ4UG9ydCk7CisJCQlyZXR1cm47CisJCX0KKyAgICAgICAgICAgICAgICBwQUMtPkR5bklycU1vZEluZm8uTmJyUHJvY2Vzc2VkRGVzY3IrKzsKKworCQkvKiBnZXQgbGVuZ3RoIG9mIGZyYW1lIGFuZCBjaGVjayBpdCAqLworCQlGcmFtZUxlbmd0aCA9IENvbnRyb2wgJiBCTVVfQkJDOworCQlpZiAoRnJhbWVMZW5ndGggPiBwQUMtPlJ4QnVmU2l6ZSkgeworCQkJZ290byByeF9mYWlsZWQ7CisJCX0KKworCQkvKiBjaGVjayBmb3IgU1RGIGFuZCBFT0YgKi8KKwkJaWYgKChDb250cm9sICYgKEJNVV9TVEYgfCBCTVVfRU9GKSkgIT0gKEJNVV9TVEYgfCBCTVVfRU9GKSkgeworCQkJZ290byByeF9mYWlsZWQ7CisJCX0KKworCQkvKiBoZXJlIHdlIGhhdmUgYSBjb21wbGV0ZSBmcmFtZSBpbiB0aGUgcmluZyAqLworCQlwTXNnID0gcFJ4ZC0+cE1CdWY7CisKKwkJRnJhbWVTdGF0ID0gcFJ4ZC0+RnJhbWVTdGF0OworCisJCS8qIGNoZWNrIGZvciBmcmFtZSBsZW5ndGggbWlzbWF0Y2ggKi8KKyNkZWZpbmUgWE1SX0ZTX0xFTl9TSElGVCAgICAgICAgMTgKKyNkZWZpbmUgR01SX0ZTX0xFTl9TSElGVCAgICAgICAgMTYKKwkJaWYgKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX0dFTkVTSVMpIHsKKwkJCWlmIChGcmFtZUxlbmd0aCAhPSAoU0tfVTMyKSAoRnJhbWVTdGF0ID4+IFhNUl9GU19MRU5fU0hJRlQpKSB7CisJCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCQlTS19EQkdDQVRfRFJWX1JYX1BST0dSRVNTLAorCQkJCQkoInNrZ2U6IEZyYW1lIGxlbmd0aCBtaXNtYXRjaCAoJXUvJXUpLlxuIiwKKwkJCQkJRnJhbWVMZW5ndGgsCisJCQkJCShTS19VMzIpIChGcmFtZVN0YXQgPj4gWE1SX0ZTX0xFTl9TSElGVCkpKTsKKwkJCQlnb3RvIHJ4X2ZhaWxlZDsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWlmIChGcmFtZUxlbmd0aCAhPSAoU0tfVTMyKSAoRnJhbWVTdGF0ID4+IEdNUl9GU19MRU5fU0hJRlQpKSB7CisJCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCQlTS19EQkdDQVRfRFJWX1JYX1BST0dSRVNTLAorCQkJCQkoInNrZ2U6IEZyYW1lIGxlbmd0aCBtaXNtYXRjaCAoJXUvJXUpLlxuIiwKKwkJCQkJRnJhbWVMZW5ndGgsCisJCQkJCShTS19VMzIpIChGcmFtZVN0YXQgPj4gWE1SX0ZTX0xFTl9TSElGVCkpKTsKKwkJCQlnb3RvIHJ4X2ZhaWxlZDsKKwkJCX0KKwkJfQorCisJCS8qIFNldCBSeCBTdGF0dXMgKi8KKwkJaWYgKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX0dFTkVTSVMpIHsKKwkJCUlzQmMgPSAoRnJhbWVTdGF0ICYgWE1SX0ZTX0JDKSAhPSAwOworCQkJSXNNYyA9IChGcmFtZVN0YXQgJiBYTVJfRlNfTUMpICE9IDA7CisJCQlJc0JhZEZyYW1lID0gKEZyYW1lU3RhdCAmCisJCQkJKFhNUl9GU19BTllfRVJSIHwgWE1SX0ZTXzJMX1ZMQU4pKSAhPSAwOworCQl9IGVsc2UgeworCQkJSXNCYyA9IChGcmFtZVN0YXQgJiBHTVJfRlNfQkMpICE9IDA7CisJCQlJc01jID0gKEZyYW1lU3RhdCAmIEdNUl9GU19NQykgIT0gMDsKKwkJCUlzQmFkRnJhbWUgPSAoKChGcmFtZVN0YXQgJiBHTVJfRlNfQU5ZX0VSUikgIT0gMCkgfHwKKwkJCQkJCQkoKEZyYW1lU3RhdCAmIEdNUl9GU19SWF9PSykgPT0gMCkpOworCQl9CisKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCAwLAorCQkJKCJSZWNlaXZlZCBmcmFtZSBvZiBsZW5ndGggJWQgb24gcG9ydCAlZFxuIiwKKwkJCUZyYW1lTGVuZ3RoLCBQb3J0SW5kZXgpKTsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCAwLAorCQkJKCJOdW1iZXIgb2YgZnJlZSByeCBkZXNjcmlwdG9yczogJWRcbiIsCisJCQlwUnhQb3J0LT5SeGRSaW5nRnJlZSkpOworLyogRHVtcE1zZyhwTXNnLCAiUngiKTsJKi8KKworCQlpZiAoKENvbnRyb2wgJiBCTVVfU1RBVF9WQUwpICE9IEJNVV9TVEFUX1ZBTCB8fCAoSXNCYWRGcmFtZSkpIHsKKyNpZiAwCisJCQkoRnJhbWVTdGF0ICYgKFhNUl9GU19BTllfRVJSIHwgWE1SX0ZTXzJMX1ZMQU4pKSAhPSAwKSB7CisjZW5kaWYKKwkJCS8qIHRoZXJlIGlzIGEgcmVjZWl2ZSBlcnJvciBpbiB0aGlzIGZyYW1lICovCisJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsCisJCQkJU0tfREJHQ0FUX0RSVl9SWF9QUk9HUkVTUywKKwkJCQkoInNrZ2U6IEVycm9yIGluIHJlY2VpdmVkIGZyYW1lLCBkcm9wcGVkIVxuIgorCQkJCSJDb250cm9sOiAleFxuUnhTdGF0OiAleFxuIiwKKwkJCQlDb250cm9sLCBGcmFtZVN0YXQpKTsKKworCQkJUmVRdWV1ZVJ4QnVmZmVyKHBBQywgcFJ4UG9ydCwgcE1zZywKKwkJCQlwUnhkLT5WRGF0YUhpZ2gsIHBSeGQtPlZEYXRhTG93KTsKKworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBpZiBzaG9ydCBmcmFtZSB0aGVuIGNvcHkgZGF0YSB0byByZWR1Y2UgbWVtb3J5IHdhc3RlCisJCSAqLworCQlpZiAoKEZyYW1lTGVuZ3RoIDwgU0tfQ09QWV9USFJFU0hPTEQpICYmCisJCQkoKHBOZXdNc2cgPSBhbGxvY19za2IoRnJhbWVMZW5ndGgrMiwgR0ZQX0FUT01JQykpICE9IE5VTEwpKSB7CisJCQkvKgorCQkJICogU2hvcnQgZnJhbWUgZGV0ZWN0ZWQgYW5kIGFsbG9jYXRpb24gc3VjY2Vzc2Z1bGwKKwkJCSAqLworCQkJLyogdXNlIG5ldyBza2IgYW5kIGNvcHkgZGF0YSAqLworCQkJc2tiX3Jlc2VydmUocE5ld01zZywgMik7CisJCQlza2JfcHV0KHBOZXdNc2csIEZyYW1lTGVuZ3RoKTsKKwkJCVBoeXNBZGRyID0gKChTS19VNjQpIHBSeGQtPlZEYXRhSGlnaCkgPDwgKFNLX1U2NCkzMjsKKwkJCVBoeXNBZGRyIHw9IChTS19VNjQpIHBSeGQtPlZEYXRhTG93OworCisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocEFDLT5QY2lEZXYsCisJCQkJCQkgICAgKGRtYV9hZGRyX3QpIFBoeXNBZGRyLAorCQkJCQkJICAgIEZyYW1lTGVuZ3RoLAorCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlldGhfY29weV9hbmRfc3VtKHBOZXdNc2csIHBNc2ctPmRhdGEsCisJCQkJRnJhbWVMZW5ndGgsIDApOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBBQy0+UGNpRGV2LAorCQkJCQkJICAgICAgIChkbWFfYWRkcl90KSBQaHlzQWRkciwKKwkJCQkJCSAgICAgICBGcmFtZUxlbmd0aCwKKwkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJUmVRdWV1ZVJ4QnVmZmVyKHBBQywgcFJ4UG9ydCwgcE1zZywKKwkJCQlwUnhkLT5WRGF0YUhpZ2gsIHBSeGQtPlZEYXRhTG93KTsKKworCQkJcE1zZyA9IHBOZXdNc2c7CisKKwkJfQorCQllbHNlIHsKKwkJCS8qCisJCQkgKiBpZiBsYXJnZSBmcmFtZSwgb3IgU0tCIGFsbG9jYXRpb24gZmFpbGVkLCBwYXNzCisJCQkgKiB0aGUgU0tCIGRpcmVjdGx5IHRvIHRoZSBuZXR3b3JraW5nCisJCQkgKi8KKworCQkJUGh5c0FkZHIgPSAoKFNLX1U2NCkgcFJ4ZC0+VkRhdGFIaWdoKSA8PCAoU0tfVTY0KTMyOworCQkJUGh5c0FkZHIgfD0gKFNLX1U2NCkgcFJ4ZC0+VkRhdGFMb3c7CisKKwkJCS8qIHJlbGVhc2UgdGhlIERNQSBtYXBwaW5nICovCisJCQlwY2lfdW5tYXBfc2luZ2xlKHBBQy0+UGNpRGV2LAorCQkJCQkgUGh5c0FkZHIsCisJCQkJCSBwQUMtPlJ4QnVmU2l6ZSAtIDIsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQkvKiBzZXQgbGVuZ3RoIGluIG1lc3NhZ2UgKi8KKwkJCXNrYl9wdXQocE1zZywgRnJhbWVMZW5ndGgpOworCQkJLyogaGFyZHdhcmUgY2hlY2tzdW0gKi8KKwkJCVR5cGUgPSBudG9ocygqKChzaG9ydCopJnBNc2ctPmRhdGFbMTJdKSk7CisKKyNpZmRlZiBVU0VfU0tfUlhfQ0hFQ0tTVU0KKwkJCWlmIChUeXBlID09IDB4ODAwKSB7CisJCQkJQ3N1bTE9bGUxNl90b19jcHUocFJ4ZC0+VGNwU3VtcyAmIDB4ZmZmZik7CisJCQkJQ3N1bTI9bGUxNl90b19jcHUoKHBSeGQtPlRjcFN1bXMgPj4gMTYpICYgMHhmZmZmKTsKKwkJCQlJcEZyYW1lTGVuZ3RoID0gKGludCkgbnRvaHMoKHVuc2lnbmVkIHNob3J0KQorCQkJCQkJCQkoKHVuc2lnbmVkIHNob3J0ICopIHBNc2ctPmRhdGEpWzhdKTsKKworCQkJCS8qCisJCQkJICogVGVzdDogSWYgZnJhbWUgaXMgcGFkZGVkLCBhIGNoZWNrIGlzIG5vdCBwb3NzaWJsZSEKKwkJCQkgKiBGcmFtZSBub3QgcGFkZGVkPyBMZW5ndGggZGlmZmVyZW5jZSBtdXN0IGJlIDE0ICgweGUpIQorCQkJCSAqLworCQkJCWlmICgoRnJhbWVMZW5ndGggLSBJcEZyYW1lTGVuZ3RoKSAhPSAweGUpIHsKKwkJCQkvKiBGcmFtZSBwYWRkZWQgPT4gVENQIG9mZmxvYWQgbm90IHBvc3NpYmxlISAqLworCQkJCQlwTXNnLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQkJCX0gZWxzZSB7CisJCQkJLyogRnJhbWUgbm90IHBhZGRlZCA9PiBUQ1Agb2ZmbG9hZCEgKi8KKwkJCQkJaWYgKCgoKENzdW0xICYgMHhmZmZlKSAmJiAoQ3N1bTIgJiAweGZmZmUpKSAmJgorCQkJCQkJKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX0dFTkVTSVMpKSB8fAorCQkJCQkJKHBBQy0+Q2hpcHNldFR5cGUpKSB7CisJCQkJCQlSZXN1bHQgPSBTa0NzR2V0UmVjZWl2ZUluZm8ocEFDLAorCQkJCQkJCSZwTXNnLT5kYXRhWzE0XSwKKwkJCQkJCQlDc3VtMSwgQ3N1bTIsIHBSeFBvcnQtPlBvcnRJbmRleCk7CisJCQkJCQlpZiAoUmVzdWx0ID09CisJCQkJCQkJU0tDU19TVEFUVVNfSVBfRlJBR01FTlQgfHwKKwkJCQkJCQlSZXN1bHQgPT0KKwkJCQkJCQlTS0NTX1NUQVRVU19JUF9DU1VNX09LIHx8CisJCQkJCQkJUmVzdWx0ID09CisJCQkJCQkJU0tDU19TVEFUVVNfVENQX0NTVU1fT0sgfHwKKwkJCQkJCQlSZXN1bHQgPT0KKwkJCQkJCQlTS0NTX1NUQVRVU19VRFBfQ1NVTV9PSykgeworCQkJCQkJCQlwTXNnLT5pcF9zdW1tZWQgPQorCQkJCQkJCQlDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKFJlc3VsdCA9PQorCQkJCQkJCVNLQ1NfU1RBVFVTX1RDUF9DU1VNX0VSUk9SIHx8CisJCQkJCQkJUmVzdWx0ID09CisJCQkJCQkJU0tDU19TVEFUVVNfVURQX0NTVU1fRVJST1IgfHwKKwkJCQkJCQlSZXN1bHQgPT0KKwkJCQkJCQlTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SX1VEUCB8fAorCQkJCQkJCVJlc3VsdCA9PQorCQkJCQkJCVNLQ1NfU1RBVFVTX0lQX0NTVU1fRVJST1JfVENQIHx8CisJCQkJCQkJUmVzdWx0ID09CisJCQkJCQkJU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUiApIHsKKwkJCQkJCQkvKiBIVyBDaGVja3N1bSBlcnJvciAqLworCQkJCQkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQkJCQlTS19EQkdDQVRfRFJWX1JYX1BST0dSRVNTLAorCQkJCQkJCSgic2tnZTogQ1JDIGVycm9yLiBGcmFtZSBkcm9wcGVkIVxuIikpOworCQkJCQkJCWdvdG8gcnhfZmFpbGVkOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJcE1zZy0+aXBfc3VtbWVkID0KKwkJCQkJCQkJQ0hFQ0tTVU1fTk9ORTsKKwkJCQkJCX0KKwkJCQkJfS8qIGNoZWNrc3VtQ29udHJvbCBjYWxjdWxhdGlvbiB2YWxpZCAqLworCQkJCX0gLyogRnJhbWUgbGVuZ3RoIGNoZWNrICovCisJCQl9IC8qIElQIGZyYW1lICovCisjZWxzZQorCQkJcE1zZy0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsJCisjZW5kaWYKKwkJfSAvKiBmcmFtZSA+IFNLX0NPUFlfVFJFU0hPTEQgKi8KKwkJCisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwJMSwoIlYiKSk7CisJCUZvclJsbXQgPSBTS19STE1UX1JYX1BST1RPQ09MOworI2lmIDAKKwkJSXNCYyA9IChGcmFtZVN0YXQgJiBYTVJfRlNfQkMpPT1YTVJfRlNfQkM7CisjZW5kaWYKKwkJU0tfUkxNVF9QUkVfTE9PS0FIRUFEKHBBQywgUG9ydEluZGV4LCBGcmFtZUxlbmd0aCwKKwkJCUlzQmMsICZPZmZzZXQsICZOdW1CeXRlcyk7CisJCWlmIChOdW1CeXRlcyAhPSAwKSB7CisjaWYgMAorCQkJSXNNYyA9IChGcmFtZVN0YXQgJiBYTVJfRlNfTUMpPT1YTVJfRlNfTUM7CisjZW5kaWYKKwkJCVNLX1JMTVRfTE9PS0FIRUFEKHBBQywgUG9ydEluZGV4LAorCQkJCSZwTXNnLT5kYXRhW09mZnNldF0sCisJCQkJSXNCYywgSXNNYywgJkZvclJsbXQpOworCQl9CisJCWlmIChGb3JSbG10ID09IFNLX1JMTVRfUlhfUFJPVE9DT0wpIHsKKwkJCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAkxLCgiVyIpKTsKKwkJCS8qIHNlbmQgdXAgb25seSBmcmFtZXMgZnJvbSBhY3RpdmUgcG9ydCAqLworCQkJaWYgKChQb3J0SW5kZXggPT0gcEFDLT5BY3RpdmVQb3J0KSB8fAorCQkJCShwQUMtPlJsbXROZXRzID09IDIpKSB7CisJCQkJLyogZnJhbWUgZm9yIHVwcGVyIGxheWVyICovCisJCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCAxLCgiVSIpKTsKKyNpZmRlZiB4REVCVUcKKwkJCQlEdW1wTXNnKHBNc2csICJSeCIpOworI2VuZGlmCisJCQkJU0tfUE5NSV9DTlRfUlhfT0NURVRTX0RFTElWRVJFRChwQUMsCisJCQkJCUZyYW1lTGVuZ3RoLCBwUnhQb3J0LT5Qb3J0SW5kZXgpOworCisJCQkJcE1zZy0+ZGV2ID0gcEFDLT5kZXZbcFJ4UG9ydC0+UG9ydEluZGV4XTsKKwkJCQlwTXNnLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBNc2csCisJCQkJCXBBQy0+ZGV2W3BSeFBvcnQtPlBvcnRJbmRleF0pOworCQkJCW5ldGlmX3J4KHBNc2cpOworCQkJCXBBQy0+ZGV2W3BSeFBvcnQtPlBvcnRJbmRleF0tPmxhc3RfcnggPSBqaWZmaWVzOworCQkJfQorCQkJZWxzZSB7CisJCQkJLyogZHJvcCBmcmFtZSAqLworCQkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQkJU0tfREJHQ0FUX0RSVl9SWF9QUk9HUkVTUywKKwkJCQkJKCJEIikpOworCQkJCURFVl9LRlJFRV9TS0IocE1zZyk7CisJCQl9CisJCQkKKwkJfSAvKiBpZiBub3QgZm9yIHJsbXQgKi8KKwkJZWxzZSB7CisJCQkvKiBwYWNrZXQgZm9yIHJsbXQgKi8KKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX1JYX1BST0dSRVNTLCAoIlIiKSk7CisJCQlwUmxtdE1idWYgPSBTa0RydkFsbG9jUmxtdE1idWYocEFDLAorCQkJCXBBQy0+SW9CYXNlLCBGcmFtZUxlbmd0aCk7CisJCQlpZiAocFJsbXRNYnVmICE9IE5VTEwpIHsKKwkJCQlwUmxtdE1idWYtPnBOZXh0ID0gTlVMTDsKKwkJCQlwUmxtdE1idWYtPkxlbmd0aCA9IEZyYW1lTGVuZ3RoOworCQkJCXBSbG10TWJ1Zi0+UG9ydElkeCA9IFBvcnRJbmRleDsKKwkJCQlFdlBhcmEucFBhcmFQdHIgPSBwUmxtdE1idWY7CisJCQkJbWVtY3B5KChjaGFyKikocFJsbXRNYnVmLT5wRGF0YSksCisJCQkJCSAgIChjaGFyKikocE1zZy0+ZGF0YSksCisJCQkJCSAgIEZyYW1lTGVuZ3RoKTsKKworCQkJCS8qIFNsb3dQYXRoTG9jayBuZWVkZWQ/ICovCisJCQkJaWYgKFNsb3dQYXRoTG9jayA9PSBTS19UUlVFKSB7CisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCQkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsCisJCQkJCQlTS19STE1UX1BBQ0tFVF9SRUNFSVZFRCwKKwkJCQkJCUV2UGFyYSk7CisJCQkJCXBBQy0+Q2hlY2tRdWV1ZSA9IFNLX1RSVUU7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULAorCQkJCQkJU0tfUkxNVF9QQUNLRVRfUkVDRUlWRUQsCisJCQkJCQlFdlBhcmEpOworCQkJCQlwQUMtPkNoZWNrUXVldWUgPSBTS19UUlVFOworCQkJCX0KKworCQkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQkJU0tfREJHQ0FUX0RSVl9SWF9QUk9HUkVTUywKKwkJCQkJKCJRIikpOworCQkJfQorCQkJaWYgKChwQUMtPmRldltwUnhQb3J0LT5Qb3J0SW5kZXhdLT5mbGFncyAmCisJCQkJKElGRl9QUk9NSVNDIHwgSUZGX0FMTE1VTFRJKSkgIT0gMCB8fAorCQkJCShGb3JSbG10ICYgU0tfUkxNVF9SWF9QUk9UT0NPTCkgPT0KKwkJCQlTS19STE1UX1JYX1BST1RPQ09MKSB7CisJCQkJcE1zZy0+ZGV2ID0gcEFDLT5kZXZbcFJ4UG9ydC0+UG9ydEluZGV4XTsKKwkJCQlwTXNnLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBNc2csCisJCQkJCXBBQy0+ZGV2W3BSeFBvcnQtPlBvcnRJbmRleF0pOworCQkJCW5ldGlmX3J4KHBNc2cpOworCQkJCXBBQy0+ZGV2W3BSeFBvcnQtPlBvcnRJbmRleF0tPmxhc3RfcnggPSBqaWZmaWVzOworCQkJfQorCQkJZWxzZSB7CisJCQkJREVWX0tGUkVFX1NLQihwTXNnKTsKKwkJCX0KKworCQl9IC8qIGlmIHBhY2tldCBmb3IgcmxtdCAqLworCX0gLyogZm9yIC4uLiBzY2FubmluZyB0aGUgUlhEIHJpbmcgKi8KKworCS8qIFJYRCByaW5nIGlzIGVtcHR5IC0+IGZpbGwgYW5kIHJlc3RhcnQgKi8KKwlGaWxsUnhSaW5nKHBBQywgcFJ4UG9ydCk7CisJLyogZG8gbm90IHN0YXJ0IGlmIGNhbGxlZCBmcm9tIENsb3NlICovCisJaWYgKHBBQy0+Qm9hcmRMZXZlbCA+IFNLX0lOSVRfREFUQSkgeworCQlDbGVhckFuZFN0YXJ0UngocEFDLCBQb3J0SW5kZXgpOworCX0KKwlyZXR1cm47CisKK3J4X2ZhaWxlZDoKKwkvKiByZW1vdmUgZXJyb3IgZnJhbWUgKi8KKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRVJST1IsCisJCSgiU2Nocm90dGRlc2NyaXB0b3IsIGxlbmd0aDogMHgleFxuIiwgRnJhbWVMZW5ndGgpKTsKKworCS8qIHJlbGVhc2UgdGhlIERNQSBtYXBwaW5nICovCisKKwlQaHlzQWRkciA9ICgoU0tfVTY0KSBwUnhkLT5WRGF0YUhpZ2gpIDw8IChTS19VNjQpMzI7CisJUGh5c0FkZHIgfD0gKFNLX1U2NCkgcFJ4ZC0+VkRhdGFMb3c7CisJcGNpX3VubWFwX3BhZ2UocEFDLT5QY2lEZXYsCisJCQkgUGh5c0FkZHIsCisJCQkgcEFDLT5SeEJ1ZlNpemUgLSAyLAorCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJREVWX0tGUkVFX1NLQl9JUlEocFJ4ZC0+cE1CdWYpOworCXBSeGQtPnBNQnVmID0gTlVMTDsKKwlwUnhQb3J0LT5SeGRSaW5nRnJlZSsrOworCXBSeFBvcnQtPnBSeGRSaW5nSGVhZCA9IHBSeGQtPnBOZXh0UnhkOworCWdvdG8gcnhfc3RhcnQ7CisKK30gLyogUmVjZWl2ZUlycSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlDbGVhckFuZFN0YXJ0UnggLSBnaXZlIGEgc3RhcnQgcmVjZWl2ZSBjb21tYW5kIHRvIEJNVSwgY2xlYXIgSVJRCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgc3RhcnQgY29tbWFuZCBhbmQgYSBjbGVhciBpbnRlcnJ1cHQKKyAqCWNvbW1hbmQgZm9yIG9uZSByZWNlaXZlIHF1ZXVlIHRvIHRoZSBCTVUuCisgKgorICogUmV0dXJuczogTi9BCisgKglub25lCisgKi8KK3N0YXRpYyB2b2lkIENsZWFyQW5kU3RhcnRSeCgKK1NLX0FDCSpwQUMsCQkvKiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIGNvbnRleHQgKi8KK2ludAlQb3J0SW5kZXgpCS8qIGluZGV4IG9mIHRoZSByZWNlaXZlIHBvcnQgKFhNQUMpICovCit7CisJU0tfT1VUOChwQUMtPklvQmFzZSwKKwkJUnhRdWV1ZUFkZHJbUG9ydEluZGV4XStRX0NTUiwKKwkJQ1NSX1NUQVJUIHwgQ1NSX0lSUV9DTF9GKTsKK30gLyogQ2xlYXJBbmRTdGFydFJ4ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCUNsZWFyVHhJcnEgLSBnaXZlIGEgY2xlYXIgdHJhbnNtaXQgSVJRIGNvbW1hbmQgdG8gQk1VCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgY2xlYXIgdHggSVJRIGNvbW1hbmQgZm9yIG9uZQorICoJdHJhbnNtaXQgcXVldWUgdG8gdGhlIEJNVS4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLworc3RhdGljIHZvaWQgQ2xlYXJUeElycSgKK1NLX0FDCSpwQUMsCQkvKiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIGNvbnRleHQgKi8KK2ludAlQb3J0SW5kZXgsCS8qIGluZGV4IG9mIHRoZSB0cmFuc21pdCBwb3J0IChYTUFDKSAqLworaW50CVByaW8pCQkvKiBwcmlvcml0eSBvciBub3JtYWwgcXVldWUgKi8KK3sKKwlTS19PVVQ4KHBBQy0+SW9CYXNlLCAKKwkJVHhRdWV1ZUFkZHJbUG9ydEluZGV4XVtQcmlvXStRX0NTUiwKKwkJQ1NSX0lSUV9DTF9GKTsKK30gLyogQ2xlYXJUeElycSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlDbGVhclJ4UmluZyAtIHJlbW92ZSBhbGwgYnVmZmVycyBmcm9tIHRoZSByZWNlaXZlIHJpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhbGwgcmVjZWl2ZSBidWZmZXJzIGZyb20gdGhlIHJpbmcuCisgKglUaGUgcmVjZWl2ZSBCTVUgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIENsZWFyUnhSaW5nKAorU0tfQUMJKnBBQywJCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitSWF9QT1JUCSpwUnhQb3J0KQkvKiBwb2ludGVyIHRvIHJ4IHBvcnQgc3RydWN0ICovCit7CitSWEQJCSpwUnhkOwkvKiBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgKi8KK3Vuc2lnbmVkIGxvbmcJRmxhZ3M7CitTS19VNjQJCVBoeXNBZGRyOworCisJaWYgKHBSeFBvcnQtPlJ4ZFJpbmdGcmVlID09IHBBQy0+UnhEZXNjclBlclJpbmcpIHsKKwkJcmV0dXJuOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcFJ4UG9ydC0+UnhEZXNSaW5nTG9jaywgRmxhZ3MpOworCXBSeGQgPSBwUnhQb3J0LT5wUnhkUmluZ0hlYWQ7CisJZG8geworCQlpZiAocFJ4ZC0+cE1CdWYgIT0gTlVMTCkgeworCisJCQlQaHlzQWRkciA9ICgoU0tfVTY0KSBwUnhkLT5WRGF0YUhpZ2gpIDw8IChTS19VNjQpMzI7CisJCQlQaHlzQWRkciB8PSAoU0tfVTY0KSBwUnhkLT5WRGF0YUxvdzsKKwkJCXBjaV91bm1hcF9wYWdlKHBBQy0+UGNpRGV2LAorCQkJCQkgUGh5c0FkZHIsCisJCQkJCSBwQUMtPlJ4QnVmU2l6ZSAtIDIsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJREVWX0tGUkVFX1NLQihwUnhkLT5wTUJ1Zik7CisJCQlwUnhkLT5wTUJ1ZiA9IE5VTEw7CisJCX0KKwkJcFJ4ZC0+UkJDb250cm9sICY9IEJNVV9PV047CisJCXBSeGQgPSBwUnhkLT5wTmV4dFJ4ZDsKKwkJcFJ4UG9ydC0+UnhkUmluZ0ZyZWUrKzsKKwl9IHdoaWxlIChwUnhkICE9IHBSeFBvcnQtPnBSeGRSaW5nVGFpbCk7CisJcFJ4UG9ydC0+cFJ4ZFJpbmdUYWlsID0gcFJ4UG9ydC0+cFJ4ZFJpbmdIZWFkOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBSeFBvcnQtPlJ4RGVzUmluZ0xvY2ssIEZsYWdzKTsKK30gLyogQ2xlYXJSeFJpbmcgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJQ2xlYXJUeFJpbmcgLSByZW1vdmUgYWxsIGJ1ZmZlcnMgZnJvbSB0aGUgdHJhbnNtaXQgcmluZworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFsbCB0cmFuc21pdCBidWZmZXJzIGZyb20gdGhlIHJpbmcuCisgKglUaGUgdHJhbnNtaXQgQk1VIG11c3QgYmUgc3RvcHBlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCisgKglhbmQgdHJhbnNtaXR0aW5nIGF0IHRoZSB1cHBlciBsZXZlbCBtdXN0IGJlIGRpc2FibGVkLgorICoJVGhlIEJNVSBvd24gYml0IG9mIGFsbCBkZXNjcmlwdG9ycyBpcyBjbGVhcmVkLCB0aGUgcmVzdCBpcworICoJZG9uZSBieSBjYWxsaW5nIEZyZWVUeERlc2NyaXB0b3JzLgorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBDbGVhclR4UmluZygKK1NLX0FDCSpwQUMsCQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworVFhfUE9SVAkqcFR4UG9ydCkJLyogcG9pbnRlciB0byB0eCBwcnQgc3RydWN0ICovCit7CitUWEQJCSpwVHhkOwkJLyogcG9pbnRlciB0byB0aGUgY3VycmVudCBkZXNjcmlwdG9yICovCitpbnQJCWk7Cit1bnNpZ25lZCBsb25nCUZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBUeFBvcnQtPlR4RGVzUmluZ0xvY2ssIEZsYWdzKTsKKwlwVHhkID0gcFR4UG9ydC0+cFR4ZFJpbmdIZWFkOworCWZvciAoaT0wOyBpPHBBQy0+VHhEZXNjclBlclJpbmc7IGkrKykgeworCQlwVHhkLT5UQkNvbnRyb2wgJj0gfkJNVV9PV047CisJCXBUeGQgPSBwVHhkLT5wTmV4dFR4ZDsKKwl9CisJRnJlZVR4RGVzY3JpcHRvcnMocEFDLCBwVHhQb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwVHhQb3J0LT5UeERlc1JpbmdMb2NrLCBGbGFncyk7Cit9IC8qIENsZWFyVHhSaW5nICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlTa0dlU2V0TWFjQWRkciAtIFNldCB0aGUgaGFyZHdhcmUgTUFDIGFkZHJlc3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgTUFDIGFkZHJlc3MgdXNlZCBieSB0aGUgYWRhcHRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJMCwgaWYgZXZlcnl0aGluZyBpcyBvaworICoJIT0wLCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IFNrR2VTZXRNYWNBZGRyKHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYsIHZvaWQgKnApCit7CisKK0RFVl9ORVQgKnBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworU0tfQUMJKnBBQyA9IHBOZXQtPnBBQzsKKworc3RydWN0IHNvY2thZGRyCSphZGRyID0gcDsKK3Vuc2lnbmVkIGxvbmcJRmxhZ3M7CisJCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIlNrR2VTZXRNYWNBZGRyIHN0YXJ0cyBub3cuLi5cbiIpKTsKKwlpZihuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUJVU1k7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSxkZXYtPmFkZHJfbGVuKTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKworCWlmIChwQUMtPlJsbXROZXRzID09IDIpCisJCVNrQWRkck92ZXJyaWRlKHBBQywgcEFDLT5Jb0Jhc2UsIHBOZXQtPk5ldE5yLAorCQkJKFNLX01BQ19BRERSKilkZXYtPmRldl9hZGRyLCBTS19BRERSX1ZJUlRVQUxfQUREUkVTUyk7CisJZWxzZQorCQlTa0FkZHJPdmVycmlkZShwQUMsIHBBQy0+SW9CYXNlLCBwQUMtPkFjdGl2ZVBvcnQsCisJCQkoU0tfTUFDX0FERFIqKWRldi0+ZGV2X2FkZHIsIFNLX0FERFJfVklSVFVBTF9BRERSRVNTKTsKKworCQorCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJcmV0dXJuIDA7Cit9IC8qIFNrR2VTZXRNYWNBZGRyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVNrR2VTZXRSeE1vZGUgLSBzZXQgcmVjZWl2ZSBtb2RlCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHJlY2VpdmUgbW9kZSBvZiBhbiBhZGFwdGVyLiBUaGUgYWRhcHRlcgorICoJc3VwcG9ydHMgcHJvbWlzY3VvdXMgbW9kZSwgYWxsbXVsdGljYXN0IG1vZGUgYW5kIGEgbnVtYmVyIG9mCisgKgltdWx0aWNhc3QgYWRkcmVzc2VzLiBJZiBtb3JlIG11bHRpY2FzdCBhZGRyZXNzZXMgdGhlIGF2YWlsYWJsZQorICoJYXJlIHNlbGVjdGVkLCBhIGhhc2ggZnVuY3Rpb24gaW4gdGhlIGhhcmR3YXJlIGlzIHVzZWQuCisgKgorICogUmV0dXJuczoKKyAqCTAsIGlmIGV2ZXJ5dGhpbmcgaXMgb2sKKyAqCSE9MCwgb24gZXJyb3IKKyAqLworc3RhdGljIHZvaWQgU2tHZVNldFJ4TW9kZShzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2KQoreworCitERVZfTkVUCQkqcE5ldDsKK1NLX0FDCQkqcEFDOworCitzdHJ1Y3QgZGV2X21jX2xpc3QJKnBNY0xpc3Q7CitpbnQJCQlpOworaW50CQkJUG9ydElkeDsKK3Vuc2lnbmVkIGxvbmcJCUZsYWdzOworCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIlNrR2VTZXRSeE1vZGUgc3RhcnRzIG5vdy4uLiAiKSk7CisKKwlwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwQUMgPSBwTmV0LT5wQUM7CisJaWYgKHBBQy0+UmxtdE5ldHMgPT0gMSkKKwkJUG9ydElkeCA9IHBBQy0+QWN0aXZlUG9ydDsKKwllbHNlCisJCVBvcnRJZHggPSBwTmV0LT5OZXROcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkJKCJQUk9NSVNDVU9VUyBtb2RlXG4iKSk7CisJCVNrQWRkclByb21pc2N1b3VzQ2hhbmdlKHBBQywgcEFDLT5Jb0Jhc2UsIFBvcnRJZHgsCisJCQlTS19QUk9NX01PREVfTExDKTsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkJKCJBTExNVUxUSSBtb2RlXG4iKSk7CisJCVNrQWRkclByb21pc2N1b3VzQ2hhbmdlKHBBQywgcEFDLT5Jb0Jhc2UsIFBvcnRJZHgsCisJCQlTS19QUk9NX01PREVfQUxMX01DKTsKKwl9IGVsc2UgeworCQlTa0FkZHJQcm9taXNjdW91c0NoYW5nZShwQUMsIHBBQy0+SW9CYXNlLCBQb3J0SWR4LAorCQkJU0tfUFJPTV9NT0RFX05PTkUpOworCQlTa0FkZHJNY0NsZWFyKHBBQywgcEFDLT5Jb0Jhc2UsIFBvcnRJZHgsIDApOworCisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJCSgiTnVtYmVyIG9mIE1DIGVudHJpZXM6ICVkICIsIGRldi0+bWNfY291bnQpKTsKKwkJCisJCXBNY0xpc3QgPSBkZXYtPm1jX2xpc3Q7CisJCWZvciAoaT0wOyBpPGRldi0+bWNfY291bnQ7IGkrKywgcE1jTGlzdCA9IHBNY0xpc3QtPm5leHQpIHsKKwkJCVNrQWRkck1jQWRkKHBBQywgcEFDLT5Jb0Jhc2UsIFBvcnRJZHgsCisJCQkJKFNLX01BQ19BRERSKilwTWNMaXN0LT5kbWlfYWRkciwgMCk7CisJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfTUNBLAorCQkJCSgiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJcE1jTGlzdC0+ZG1pX2FkZHJbMF0sCisJCQkJcE1jTGlzdC0+ZG1pX2FkZHJbMV0sCisJCQkJcE1jTGlzdC0+ZG1pX2FkZHJbMl0sCisJCQkJcE1jTGlzdC0+ZG1pX2FkZHJbM10sCisJCQkJcE1jTGlzdC0+ZG1pX2FkZHJbNF0sCisJCQkJcE1jTGlzdC0+ZG1pX2FkZHJbNV0pKTsKKwkJfQorCQlTa0FkZHJNY1VwZGF0ZShwQUMsIHBBQy0+SW9CYXNlLCBQb3J0SWR4KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkKKwlyZXR1cm47Cit9IC8qIFNrR2VTZXRSeE1vZGUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJU2tHZUNoYW5nZU10dSAtIHNldCB0aGUgTVRVIHRvIGFub3RoZXIgdmFsdWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gc2V0cyBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIE1UVSBzaXplIGlzIGNoYW5nZWQKKyAqCShpZmNvbmZpZyBtdHUgeHh4IGRldiBldGhYKS4gSWYgdGhlIE1UVSBpcyBiaWdnZXIgdGhhbiBzdGFuZGFyZAorICoJZXRoZXJuZXQgTVRVIHNpemUsIGxvbmcgZnJhbWUgc3VwcG9ydCBpcyBhY3RpdmF0ZWQuCisgKgorICogUmV0dXJuczoKKyAqCTAsIGlmIGV2ZXJ5dGhpbmcgaXMgb2sKKyAqCSE9MCwgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBTa0dlQ2hhbmdlTXR1KHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYsIGludCBOZXdNdHUpCit7CitERVZfTkVUCQkqcE5ldDsKK0RFVl9ORVQJCSpwT3RoZXJOZXQ7CitTS19BQwkJKnBBQzsKK3Vuc2lnbmVkIGxvbmcJRmxhZ3M7CitpbnQJCWk7CitTS19FVlBBUkEgCUV2UGFyYTsKKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJTa0dlQ2hhbmdlTXR1IHN0YXJ0cyBub3cuLi5cbiIpKTsKKworCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXBBQyAgPSBwTmV0LT5wQUM7CisKKwlpZiAoKE5ld010dSA8IDY4KSB8fCAoTmV3TXR1ID4gU0tfSlVNQk9fTVRVKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZihwQUMtPkJvYXJkTGV2ZWwgIT0gU0tfSU5JVF9SVU4pIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisjaWZkZWYgU0tfRElBR19TVVBQT1JUCisJaWYgKHBBQy0+RGlhZ01vZGVBY3RpdmUgPT0gRElBR19BQ1RJVkUpIHsKKwkJaWYgKHBBQy0+RGlhZ0Zsb3dDdHJsID09IFNLX0ZBTFNFKSB7CisJCQlyZXR1cm4gLTE7IC8qIHN0aWxsIGluIHVzZSwgZGVueSBhbnkgYWN0aW9ucyBvZiBNVFUgKi8KKwkJfSBlbHNlIHsKKwkJCXBBQy0+RGlhZ0Zsb3dDdHJsID0gU0tfRkFMU0U7CisJCX0KKwl9CisjZW5kaWYKKworCXBOZXQtPk10dSA9IE5ld010dTsKKwlwT3RoZXJOZXQgPSBuZXRkZXZfcHJpdihwQUMtPmRldlsxIC0gcE5ldC0+TmV0TnJdKTsKKwlpZiAoKHBPdGhlck5ldC0+TXR1PjE1MDApICYmIChOZXdNdHU8PTE1MDApICYmIChwT3RoZXJOZXQtPlVwPT0xKSkgeworCQlyZXR1cm4oMCk7CisJfQorCisJcEFDLT5SeEJ1ZlNpemUgPSBOZXdNdHUgKyAzMjsKKwlkZXYtPm10dSA9IE5ld010dTsKKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJOZXcgTVRVOiAlZFxuIiwgTmV3TXR1KSk7CisKKwkvKiAKKwkqKiBQcmV2ZW50IGFueSByZWNvbmZpZ3VyYXRpb24gd2hpbGUgY2hhbmdpbmcgdGhlIE1UVSAKKwkqKiBieSBkaXNhYmxpbmcgYW55IGludGVycnVwdHMgCisJKi8KKwlTS19PVVQzMihwQUMtPklvQmFzZSwgQjBfSU1TSywgMCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisKKwkvKiAKKwkqKiBOb3RpZnkgUkxNVCB0aGF0IGFueSBwb3J0cyBhcmUgdG8gYmUgc3RvcHBlZAorCSovCisJRXZQYXJhLlBhcmEzMlswXSA9ICAwOworCUV2UGFyYS5QYXJhMzJbMV0gPSAtMTsKKwlpZiAoKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyICkgJiYgKHBBQy0+UmxtdE5ldHMgPT0gMikpIHsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUT1AsIEV2UGFyYSk7CisJCUV2UGFyYS5QYXJhMzJbMF0gPSAgMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUT1AsIEV2UGFyYSk7CisJfSBlbHNlIHsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUT1AsIEV2UGFyYSk7CisJfQorCisJLyoKKwkqKiBBZnRlciBjYWxsaW5nIHRoZSBTa0V2ZW50RGlzcGF0Y2hlcigpLCBSTE1UIGlzIGF3YXJlIGFib3V0CisJKiogdGhlIHN0b3BwZWQgcG9ydHMgLT4gY29uZmlndXJhdGlvbiBjYW4gdGFrZSBwbGFjZSEKKwkqLworCVNrRXZlbnREaXNwYXRjaGVyKHBBQywgcEFDLT5Jb0Jhc2UpOworCisJZm9yIChpPTA7IGk8cEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJc3Bpbl9sb2NrKCZwQUMtPlR4UG9ydFtpXVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jayk7CisJCW5ldGlmX3N0b3BfcXVldWUocEFDLT5kZXZbaV0pOworCisJfQorCisJLyoKKwkqKiBEZXBlbmRpbmcgb24gdGhlIGRlc2lyZWQgTVRVIHNpemUgY2hhbmdlLCBhIGRpZmZlcmVudCBudW1iZXIgb2YgCisJKiogUlggYnVmZmVycyBuZWVkIHRvIGJlIGFsbG9jYXRlZAorCSovCisJaWYgKE5ld010dSA+IDE1MDApIHsKKwkgICAgLyogCisJICAgICoqIFVzZSBsZXNzIHJ4IGJ1ZmZlcnMgCisJICAgICovCisJICAgIGZvciAoaT0wOyBpPHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCWlmICgocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIgKSAmJiAocEFDLT5SbG10TmV0cyA9PSAyKSkgeworCQkgICAgcEFDLT5SeFBvcnRbaV0uUnhGaWxsTGltaXQgPSAgcEFDLT5SeERlc2NyUGVyUmluZyAtCisJCQkJCQkgKHBBQy0+UnhEZXNjclBlclJpbmcgLyA0KTsKKwkJfSBlbHNlIHsKKwkJICAgIGlmIChpID09IHBBQy0+QWN0aXZlUG9ydCkgeworCQkJcEFDLT5SeFBvcnRbaV0uUnhGaWxsTGltaXQgPSBwQUMtPlJ4RGVzY3JQZXJSaW5nIC0gCisJCQkJCQkgICAgKHBBQy0+UnhEZXNjclBlclJpbmcgLyA0KTsKKwkJICAgIH0gZWxzZSB7CisJCQlwQUMtPlJ4UG9ydFtpXS5SeEZpbGxMaW1pdCA9IHBBQy0+UnhEZXNjclBlclJpbmcgLSAKKwkJCQkJCSAgICAocEFDLT5SeERlc2NyUGVyUmluZyAvIDEwKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgLyogCisJICAgICoqIFVzZSB0aGUgbm9ybWFsIGFtb3VudCBvZiByeCBidWZmZXJzIAorCSAgICAqLworCSAgICBmb3IgKGk9MDsgaTxwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlpZiAoKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyICkgJiYgKHBBQy0+UmxtdE5ldHMgPT0gMikpIHsKKwkJICAgIHBBQy0+UnhQb3J0W2ldLlJ4RmlsbExpbWl0ID0gMTsKKwkJfSBlbHNlIHsKKwkJICAgIGlmIChpID09IHBBQy0+QWN0aXZlUG9ydCkgeworCQkJcEFDLT5SeFBvcnRbaV0uUnhGaWxsTGltaXQgPSAxOworCQkgICAgfSBlbHNlIHsKKwkJCXBBQy0+UnhQb3J0W2ldLlJ4RmlsbExpbWl0ID0gcEFDLT5SeERlc2NyUGVyUmluZyAtCisJCQkJCQkgICAgKHBBQy0+UnhEZXNjclBlclJpbmcgLyA0KTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCQorCVNrR2VEZUluaXQocEFDLCBwQUMtPklvQmFzZSk7CisKKwkvKgorCSoqIGVuYWJsZS9kaXNhYmxlIGhhcmR3YXJlIHN1cHBvcnQgZm9yIGxvbmcgZnJhbWVzCisJKi8KKwlpZiAoTmV3TXR1ID4gMTUwMCkgeworLy8gcEFDLT5KdW1ib0FjdGl2YXRlZCA9IFNLX1RSVUU7IC8qIGlzIG5ldmVyIHNldCBiYWNrICEhISAqLworCQlwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgPSBTS19KVU1CT19MSU5LOworCX0gZWxzZSB7CisJICAgIGlmICgocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIgKSAmJiAocEFDLT5SbG10TmV0cyA9PSAyKSkgeworCQlwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgPSBTS19NVUxfTElOSzsKKwkgICAgfSBlbHNlIHsKKwkJcEFDLT5HSW5pLkdJUG9ydFVzYWdlID0gU0tfUkVEX0xJTks7CisJICAgIH0KKwl9CisKKwlTa0dlSW5pdCggICBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa0kyY0luaXQoICBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa0V2ZW50SW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa1BubWlJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa0FkZHJJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa1JsbXRJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa1RpbWVySW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwkKKwkvKgorCSoqIHRzY2hpbGxpbmc6CisJKiogU3BlZWQgYW5kIG90aGVycyBhcmUgc2V0IGJhY2sgdG8gZGVmYXVsdCBpbiBsZXZlbCAxIGluaXQhCisJKi8KKwlHZXRDb25maWd1cmF0aW9uKHBBQyk7CisJCisJU2tHZUluaXQoICAgcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9SVU4pOworCVNrSTJjSW5pdCggIHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfUlVOKTsKKwlTa0V2ZW50SW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJU2tQbm1pSW5pdCggcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9SVU4pOworCVNrQWRkckluaXQoIHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfUlVOKTsKKwlTa1JsbXRJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJU2tUaW1lckluaXQocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9SVU4pOworCisJLyoKKwkqKiBjbGVhciBhbmQgcmVpbml0IHRoZSByeCByaW5ncyBoZXJlCisJKi8KKwlmb3IgKGk9MDsgaTxwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0W2ldLCBTS19UUlVFKTsKKwkJQ2xlYXJSeFJpbmcocEFDLCAmcEFDLT5SeFBvcnRbaV0pOworCQlGaWxsUnhSaW5nKHBBQywgJnBBQy0+UnhQb3J0W2ldKTsKKworCQkvKiAKKwkJKiogRW5hYmxlIHRyYW5zbWl0IGRlc2NyaXB0b3IgcG9sbGluZworCQkqLworCQlTa0dlUG9sbFR4RChwQUMsIHBBQy0+SW9CYXNlLCBpLCBTS19UUlVFKTsKKwkJRmlsbFJ4UmluZyhwQUMsICZwQUMtPlJ4UG9ydFtpXSk7CisJfTsKKworCVNrR2VZZWxsb3dMRUQocEFDLCBwQUMtPklvQmFzZSwgMSk7CisJU2tEaW1FbmFibGVNb2RlcmF0aW9uSWZOZWVkZWQocEFDKTsJCisJU2tEaW1EaXNwbGF5TW9kZXJhdGlvblNldHRpbmdzKHBBQyk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShwQUMtPmRldltwTmV0LT5Qb3J0TnJdKTsKKwlmb3IgKGk9cEFDLT5HSW5pLkdJTWFjc0ZvdW5kLTE7IGk+PTA7IGktLSkgeworCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbaV1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2spOworCX0KKworCS8qIAorCSoqIEVuYWJsZSBJbnRlcnJ1cHRzIGFnYWluIAorCSovCisJU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIEIwX0lNU0ssIHBBQy0+R0luaS5HSVZhbElycU1hc2spOworCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMF9IV0VfSU1TSywgSVJRX0hXRV9NQVNLKTsKKworCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVEFSVCwgRXZQYXJhKTsKKwlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIHBBQy0+SW9CYXNlKTsKKworCS8qIAorCSoqIE5vdGlmeSBSTE1UIGFib3V0IHRoZSBjaGFuZ2luZyBhbmQgcmVzdGFydGluZyBvbmUgKG9yIG1vcmUpIHBvcnRzCisJKi8KKwlpZiAoKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyICkgJiYgKHBBQy0+UmxtdE5ldHMgPT0gMikpIHsKKwkJRXZQYXJhLlBhcmEzMlswXSA9IHBBQy0+UmxtdE5ldHM7CisJCUV2UGFyYS5QYXJhMzJbMV0gPSAtMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NFVF9ORVRTLCBFdlBhcmEpOworCQlFdlBhcmEuUGFyYTMyWzBdID0gcE5ldC0+UG9ydE5yOworCQlFdlBhcmEuUGFyYTMyWzFdID0gLTE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVEFSVCwgRXZQYXJhKTsKKwkJCQorCQlpZiAocE90aGVyTmV0LT5VcCkgeworCQkJRXZQYXJhLlBhcmEzMlswXSA9IHBPdGhlck5ldC0+UG9ydE5yOworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUQVJULCBFdlBhcmEpOworCQl9CisJfSBlbHNlIHsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUQVJULCBFdlBhcmEpOworCX0KKworCVNrRXZlbnREaXNwYXRjaGVyKHBBQywgcEFDLT5Jb0Jhc2UpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCisJLyoKKwkqKiBXaGlsZSB0ZXN0aW5nIHRoaXMgZHJpdmVyIHdpdGggbGF0ZXN0IGtlcm5lbCAyLjUgKDIuNS43MCksIGl0IAorCSoqIHNlZW1zIGFzIGlmIHVwcGVyIGxheWVycyBoYXZlIGEgcHJvYmxlbSB0byBoYW5kbGUgYSBzdWNjZXNzZnVsCisJKiogcmV0dXJuIHZhbHVlIG9mICcwJy4gSWYgc3VjaCBhIHplcm8gaXMgcmV0dXJuZWQsIHRoZSBjb21wbGV0ZSAKKwkqKiBzeXN0ZW0gaGFuZ3MgZm9yIHNldmVyYWwgbWludXRlcyAoISksIHdoaWNoIGlzIGluIGFjY2VwdGFibGUuCisJKioKKwkqKiBDdXJyZW50bHkgaXQgaXMgbm90IGNsZWFyLCB3aGF0IHRoZSBleGFjdCByZWFzb24gZm9yIHRoaXMgcHJvYmxlbQorCSoqIGlzLiBUaGUgaW1wbGVtZW50ZWQgd29ya2Fyb3VuZCBmb3IgMi41IGlzIHRvIHJldHVybiB0aGUgZGVzaXJlZCAKKwkqKiBuZXcgTVRVIHNpemUgaWYgYWxsIG5lZWRlZCBjaGFuZ2VzIGZvciB0aGUgbmV3IE1UVSBzaXplIHdoZXJlIAorCSoqIHBlcmZvcm1lZC4gSW4ga2VybmVscyAyLjIgYW5kIDIuNCwgYSB6ZXJvIHZhbHVlIGlzIHJldHVybmVkLAorCSoqIHdoaWNoIGluZGljYXRlcyB0aGUgc3VjY2Vzc2Z1bCBjaGFuZ2Ugb2YgdGhlIG10dS1zaXplLgorCSovCisJcmV0dXJuIE5ld010dTsKKworfSAvKiBTa0dlQ2hhbmdlTXR1ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVNrR2VTdGF0cyAtIHJldHVybiBldGhlcm5ldCBkZXZpY2Ugc3RhdGlzdGljcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiByZXR1cm4gc3RhdGlzdGljIGRhdGEgYWJvdXQgdGhlIGV0aGVybmV0IGRldmljZQorICoJdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0uCisgKgorICogUmV0dXJuczoKKyAqCXBvaW50ZXIgdG8gdGhlIHN0YXRpc3RpYyBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqU2tHZVN0YXRzKHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYpCit7CitERVZfTkVUICpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKK1NLX0FDCSpwQUMgPSBwTmV0LT5wQUM7CitTS19QTk1JX1NUUlVDVF9EQVRBICpwUG5taVN0cnVjdDsgICAgICAgLyogc3RydWN0dXJlIGZvciBhbGwgUG5taS1EYXRhICovCitTS19QTk1JX1NUQVQgICAgKnBQbm1pU3RhdDsgICAgICAgICAgICAgLyogcG9pbnRlciB0byB2aXJ0dWFsIFhNQUMgc3RhdC4gZGF0YSAqLworU0tfUE5NSV9DT05GICAgICpwUG5taUNvbmY7ICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdmlydHVhbCBsaW5rIGNvbmZpZy4gKi8KK3Vuc2lnbmVkIGludCAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHBubWkgc3RydWN0ICovCit1bnNpZ25lZCBsb25nCUZsYWdzOwkJCS8qIGZvciBzcGluIGxvY2sgKi8KKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJTa0dlU3RhdHMgc3RhcnRzIG5vdy4uLlxuIikpOworCXBQbm1pU3RydWN0ID0gJnBBQy0+UG5taVN0cnVjdDsKKworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorICAgICAgICBpZiAoKHBBQy0+RGlhZ01vZGVBY3RpdmUgPT0gRElBR19OT1RBQ1RJVkUpICYmCisgICAgICAgICAgICAgICAgKHBBQy0+Qm9hcmRMZXZlbCA9PSBTS19JTklUX1JVTikpIHsKKyNlbmRpZgorICAgICAgICBTS19NRU1TRVQocFBubWlTdHJ1Y3QsIDAsIHNpemVvZihTS19QTk1JX1NUUlVDVF9EQVRBKSk7CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworICAgICAgICBTaXplID0gU0tfUE5NSV9TVFJVQ1RfU0laRTsKKwkJU2tQbm1pR2V0U3RydWN0KHBBQywgcEFDLT5Jb0Jhc2UsIHBQbm1pU3RydWN0LCAmU2l6ZSwgcE5ldC0+TmV0TnIpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorCX0KKyNlbmRpZgorCisgICAgICAgIHBQbm1pU3RhdCA9ICZwUG5taVN0cnVjdC0+U3RhdFswXTsKKyAgICAgICAgcFBubWlDb25mID0gJnBQbm1pU3RydWN0LT5Db25mWzBdOworCisJcEFDLT5zdGF0cy5yeF9wYWNrZXRzID0gKFNLX1UzMikgcFBubWlTdHJ1Y3QtPlJ4RGVsaXZlcmVkQ3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnR4X3BhY2tldHMgPSAoU0tfVTMyKSBwUG5taVN0YXQtPlN0YXRUeE9rQ3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnJ4X2J5dGVzID0gKFNLX1UzMikgcFBubWlTdHJ1Y3QtPlJ4T2N0ZXRzRGVsaXZlcmVkQ3RzOworCXBBQy0+c3RhdHMudHhfYnl0ZXMgPSAoU0tfVTMyKSBwUG5taVN0YXQtPlN0YXRUeE9jdGV0c09rQ3RzOworCQorICAgICAgICBpZiAocE5ldC0+TXR1IDw9IDE1MDApIHsKKyAgICAgICAgICAgICAgICBwQUMtPnN0YXRzLnJ4X2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RydWN0LT5JbkVycm9yc0N0cyAmIDB4RkZGRkZGRkY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcEFDLT5zdGF0cy5yeF9lcnJvcnMgPSAoU0tfVTMyKSAoKHBQbm1pU3RydWN0LT5JbkVycm9yc0N0cyAtCisgICAgICAgICAgICAgICAgICAgICAgICBwUG5taVN0YXQtPlN0YXRSeFRvb0xvbmdDdHMpICYgMHhGRkZGRkZGRik7CisJfQorCisKKwlpZiAocEFDLT5HSW5pLkdQWzBdLlBoeVR5cGUgPT0gU0tfUEhZX1hNQUMgJiYgcEFDLT5IV1JldmlzaW9uIDwgMTIpCisJCXBBQy0+c3RhdHMucnhfZXJyb3JzID0gcEFDLT5zdGF0cy5yeF9lcnJvcnMgLSBwUG5taVN0YXQtPlN0YXRSeFNob3J0c0N0czsKKworCXBBQy0+c3RhdHMudHhfZXJyb3JzID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0VHhTaW5nbGVDb2xsaXNpb25DdHMgJiAweEZGRkZGRkZGOworCXBBQy0+c3RhdHMucnhfZHJvcHBlZCA9IChTS19VMzIpIHBQbm1pU3RydWN0LT5SeE5vQnVmQ3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnR4X2Ryb3BwZWQgPSAoU0tfVTMyKSBwUG5taVN0cnVjdC0+VHhOb0J1ZkN0cyAmIDB4RkZGRkZGRkY7CisJcEFDLT5zdGF0cy5tdWx0aWNhc3QgPSAoU0tfVTMyKSBwUG5taVN0YXQtPlN0YXRSeE11bHRpY2FzdE9rQ3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLmNvbGxpc2lvbnMgPSAoU0tfVTMyKSBwUG5taVN0YXQtPlN0YXRUeFNpbmdsZUNvbGxpc2lvbkN0cyAmIDB4RkZGRkZGRkY7CisKKwkvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisJcEFDLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0UnhSdW50Q3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnJ4X292ZXJfZXJyb3JzID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0UnhGaWZvT3ZlcmZsb3dDdHMgJiAweEZGRkZGRkZGOworCXBBQy0+c3RhdHMucnhfY3JjX2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RhdC0+U3RhdFJ4RmNzQ3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RhdC0+U3RhdFJ4RnJhbWluZ0N0cyAmIDB4RkZGRkZGRkY7CisJcEFDLT5zdGF0cy5yeF9maWZvX2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RhdC0+U3RhdFJ4Rmlmb092ZXJmbG93Q3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSAoU0tfVTMyKSBwUG5taVN0YXQtPlN0YXRSeE1pc3NlZEN0cyAmIDB4RkZGRkZGRkY7CisKKwkvKiBkZXRhaWxlZCB0eF9lcnJvcnMgKi8KKwlwQUMtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gKFNLX1UzMikgMDsKKwlwQUMtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0VHhDYXJyaWVyQ3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0VHhGaWZvVW5kZXJydW5DdHMgJiAweEZGRkZGRkZGOworCXBBQy0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RhdC0+U3RhdFR4Q2FycmllckN0cyAmIDB4RkZGRkZGRkY7CisJcEFDLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gKFNLX1UzMikgMDsKKworCXJldHVybigmcEFDLT5zdGF0cyk7Cit9IC8qIFNrR2VTdGF0cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlTa0dlSW9jdGwgLSBJTy1jb250cm9sIGZ1bmN0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiBhbiBpb2N0bCBpcyBpc3N1ZWQgb24gdGhlIGRldmljZS4KKyAqCVRoZXJlIGFyZSB0aHJlZSBzdWJmdW5jdGlvbiBmb3IgcmVhZGluZywgd3JpdGluZyBhbmQgdGVzdC13cml0aW5nCisgKgl0aGUgcHJpdmF0ZSBNSUIgZGF0YSBzdHJ1Y3R1cmUgKHVzZWZ1bGwgZm9yIFN5c0tvbm5lY3QtaW50ZXJuYWwgdG9vbHMpLgorICoKKyAqIFJldHVybnM6CisgKgkwLCBpZiBldmVyeXRoaW5nIGlzIG9rCisgKgkhPTAsIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgU2tHZUlvY3RsKHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CitERVZfTkVUCQkqcE5ldDsKK1NLX0FDCQkqcEFDOwordm9pZAkJKnBNZW1CdWY7CitzdHJ1Y3QgcGNpX2RldiAgKnBkZXYgPSBOVUxMOworU0tfR0VfSU9DVEwJSW9jdGw7Cit1bnNpZ25lZCBpbnQJRXJyID0gMDsKK2ludAkJU2l6ZSA9IDA7CitpbnQgICAgICAgICAgICAgUmV0ID0gMDsKK3Vuc2lnbmVkIGludAlMZW5ndGggPSAwOworaW50CQlIZWFkZXJMZW5ndGggPSBzaXplb2YoU0tfVTMyKSArIHNpemVvZihTS19VMzIpOworCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIlNrR2VJb2N0bCBzdGFydHMgbm93Li4uXG4iKSk7CisKKwlwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwQUMgPSBwTmV0LT5wQUM7CisJCisJaWYoY29weV9mcm9tX3VzZXIoJklvY3RsLCBycS0+aWZyX2RhdGEsIHNpemVvZihTS19HRV9JT0NUTCkpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFNLX0lPQ1RMX1NFVE1JQjoKKwljYXNlIFNLX0lPQ1RMX1BSRVNFVE1JQjoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSByZXR1cm4gLUVQRVJNOworIAljYXNlIFNLX0lPQ1RMX0dFVE1JQjoKKwkJaWYoY29weV9mcm9tX3VzZXIoJnBBQy0+UG5taVN0cnVjdCwgSW9jdGwucERhdGEsCisJCQlJb2N0bC5MZW48c2l6ZW9mKHBBQy0+UG5taVN0cnVjdCk/CisJCQlJb2N0bC5MZW4gOiBzaXplb2YocEFDLT5Qbm1pU3RydWN0KSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCVNpemUgPSBTa0dlSW9jTWliKHBOZXQsIElvY3RsLkxlbiwgY21kKTsKKwkJaWYoY29weV90b191c2VyKElvY3RsLnBEYXRhLCAmcEFDLT5Qbm1pU3RydWN0LAorCQkJSW9jdGwuTGVuPFNpemU/IElvY3RsLkxlbiA6IFNpemUpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlJb2N0bC5MZW4gPSBTaXplOworCQlpZihjb3B5X3RvX3VzZXIocnEtPmlmcl9kYXRhLCAmSW9jdGwsIHNpemVvZihTS19HRV9JT0NUTCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNLX0lPQ1RMX0dFTjoKKwkJaWYgKElvY3RsLkxlbiA8IChzaXplb2YocEFDLT5Qbm1pU3RydWN0KSArIEhlYWRlckxlbmd0aCkpIHsKKwkJCUxlbmd0aCA9IElvY3RsLkxlbjsKKwkJfSBlbHNlIHsKKwkJCUxlbmd0aCA9IHNpemVvZihwQUMtPlBubWlTdHJ1Y3QpICsgSGVhZGVyTGVuZ3RoOworCQl9CisJCWlmIChOVUxMID09IChwTWVtQnVmID0ga21hbGxvYyhMZW5ndGgsIEdGUF9LRVJORUwpKSkgeworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaWYoY29weV9mcm9tX3VzZXIocE1lbUJ1ZiwgSW9jdGwucERhdGEsIExlbmd0aCkpIHsKKwkJCUVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGZhdWx0X2dlbjsKKwkJfQorCQlpZiAoKFJldCA9IFNrUG5taUdlbklvY3RsKHBBQywgcEFDLT5Jb0Jhc2UsIHBNZW1CdWYsICZMZW5ndGgsIDApKSA8IDApIHsKKwkJCUVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGZhdWx0X2dlbjsKKwkJfQorCQlpZihjb3B5X3RvX3VzZXIoSW9jdGwucERhdGEsIHBNZW1CdWYsIExlbmd0aCkgKSB7CisJCQlFcnIgPSAtRUZBVUxUOworCQkJZ290byBmYXVsdF9nZW47CisJCX0KKwkJSW9jdGwuTGVuID0gTGVuZ3RoOworCQlpZihjb3B5X3RvX3VzZXIocnEtPmlmcl9kYXRhLCAmSW9jdGwsIHNpemVvZihTS19HRV9JT0NUTCkpKSB7CisJCQlFcnIgPSAtRUZBVUxUOworCQkJZ290byBmYXVsdF9nZW47CisJCX0KK2ZhdWx0X2dlbjoKKwkJa2ZyZWUocE1lbUJ1Zik7IC8qIGNsZWFudXAgZXZlcnl0aGluZyAqLworCQlicmVhazsKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKyAgICAgICBjYXNlIFNLX0lPQ1RMX0RJQUc6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwkJaWYgKElvY3RsLkxlbiA8IChzaXplb2YocEFDLT5Qbm1pU3RydWN0KSArIEhlYWRlckxlbmd0aCkpIHsKKwkJCUxlbmd0aCA9IElvY3RsLkxlbjsKKwkJfSBlbHNlIHsKKwkJCUxlbmd0aCA9IHNpemVvZihwQUMtPlBubWlTdHJ1Y3QpICsgSGVhZGVyTGVuZ3RoOworCQl9CisJCWlmIChOVUxMID09IChwTWVtQnVmID0ga21hbGxvYyhMZW5ndGgsIEdGUF9LRVJORUwpKSkgeworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaWYoY29weV9mcm9tX3VzZXIocE1lbUJ1ZiwgSW9jdGwucERhdGEsIExlbmd0aCkpIHsKKwkJCUVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGZhdWx0X2RpYWc7CisJCX0KKwkJcGRldiA9IHBBQy0+UGNpRGV2OworCQlMZW5ndGggPSAzICogc2l6ZW9mKFNLX1UzMik7ICAvKiBFcnJvciwgQnVzIGFuZCBEZXZpY2UgKi8KKwkJLyogCisJCSoqIFdoaWxlIGNvZGluZyB0aGlzIG5ldyBJT0NUTCBpbnRlcmZhY2UsIG9ubHkgYSBmZXcgbGluZXMgb2YgY29kZQorCQkqKiBhcmUgdG8gdG8gYmUgYWRkZWQuIFRoZXJlZm9yZSBubyBkZWRpY2F0ZWQgZnVuY3Rpb24gaGFzIGJlZW4gCisJCSoqIGFkZGVkLiBJZiBtb3JlIGZ1bmN0aW9uYWxpdHkgaXMgYWRkZWQsIGEgc2VwYXJhdGUgZnVuY3Rpb24gCisJCSoqIHNob3VsZCBiZSB1c2VkLi4uCisJCSovCisJCSogKChTS19VMzIgKilwTWVtQnVmKSA9IDA7CisJCSogKChTS19VMzIgKilwTWVtQnVmICsgMSkgPSBwZGV2LT5idXMtPm51bWJlcjsKKwkJKiAoKFNLX1UzMiAqKXBNZW1CdWYgKyAyKSA9IFBhcnNlRGV2aWNlTmJyRnJvbVNsb3ROYW1lKHBjaV9uYW1lKHBkZXYpKTsKKwkJaWYoY29weV90b191c2VyKElvY3RsLnBEYXRhLCBwTWVtQnVmLCBMZW5ndGgpICkgeworCQkJRXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gZmF1bHRfZGlhZzsKKwkJfQorCQlJb2N0bC5MZW4gPSBMZW5ndGg7CisJCWlmKGNvcHlfdG9fdXNlcihycS0+aWZyX2RhdGEsICZJb2N0bCwgc2l6ZW9mKFNLX0dFX0lPQ1RMKSkpIHsKKwkJCUVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGZhdWx0X2RpYWc7CisJCX0KK2ZhdWx0X2RpYWc6CisJCWtmcmVlKHBNZW1CdWYpOyAvKiBjbGVhbnVwIGV2ZXJ5dGhpbmcgKi8KKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlFcnIgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4oRXJyKTsKKworfSAvKiBTa0dlSW9jdGwgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJU2tHZUlvY01pYiAtIGhhbmRsZSBhIEdldE1pYiwgU2V0TWliLSBvciBQcmVzZXRNaWItaW9jdGwgbWVzc2FnZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiByZWFkcy93cml0ZXMgdGhlIE1JQiBkYXRhIHVzaW5nIFBOTUkgKFByaXZhdGUgTmV0d29yaworICoJTWFuYWdlbWVudCBJbnRlcmZhY2UpLgorICoJVGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgZGF0YSBtdXN0IGJlIHByb3ZpZGVkIHdpdGggdGhlCisgKglpb2N0bCBjYWxsIGFuZCBpcyBnaXZlbiB0byB0aGUgZHJpdmVyIGluIHRoZSBmb3JtIG9mCisgKglhIHVzZXIgc3BhY2UgYWRkcmVzcy4KKyAqCUNvcHlpbmcgZnJvbSB0aGUgdXNlci1wcm92aWRlZCBkYXRhIGFyZWEgaW50byBrZXJuZWwgbWVzc2FnZXMKKyAqCWFuZCBiYWNrIGlzIGRvbmUgYnkgY29weV9mcm9tX3VzZXIgYW5kIGNvcHlfdG9fdXNlciBjYWxscyBpbgorICoJU2tHZUlvY3RsLgorICoKKyAqIFJldHVybnM6CisgKglyZXR1cm5lZCBzaXplIGZyb20gUE5NSSBjYWxsCisgKi8KK3N0YXRpYyBpbnQgU2tHZUlvY01pYigKK0RFVl9ORVQJCSpwTmV0LAkvKiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIGNvbnRleHQgKi8KK3Vuc2lnbmVkIGludAlTaXplLAkvKiBsZW5ndGggb2YgaW9jdGwgZGF0YSAqLworaW50CQltb2RlKQkvKiBmbGFnIGZvciBzZXQvcHJlc2V0ICovCit7Cit1bnNpZ25lZCBsb25nCUZsYWdzOwkvKiBmb3Igc3BpbiBsb2NrICovCitTS19BQwkJKnBBQzsKKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJTa0dlSW9jTWliIHN0YXJ0cyBub3cuLi5cbiIpKTsKKwlwQUMgPSBwTmV0LT5wQUM7CisJLyogYWNjZXNzIE1JQiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCXN3aXRjaChtb2RlKSB7CisJY2FzZSBTS19JT0NUTF9HRVRNSUI6CisJCVNrUG5taUdldFN0cnVjdChwQUMsIHBBQy0+SW9CYXNlLCAmcEFDLT5Qbm1pU3RydWN0LCAmU2l6ZSwKKwkJCXBOZXQtPk5ldE5yKTsKKwkJYnJlYWs7CisJY2FzZSBTS19JT0NUTF9QUkVTRVRNSUI6CisJCVNrUG5taVByZVNldFN0cnVjdChwQUMsIHBBQy0+SW9CYXNlLCAmcEFDLT5Qbm1pU3RydWN0LCAmU2l6ZSwKKwkJCXBOZXQtPk5ldE5yKTsKKwkJYnJlYWs7CisJY2FzZSBTS19JT0NUTF9TRVRNSUI6CisJCVNrUG5taVNldFN0cnVjdChwQUMsIHBBQy0+SW9CYXNlLCAmcEFDLT5Qbm1pU3RydWN0LCAmU2l6ZSwKKwkJCXBOZXQtPk5ldE5yKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIk1JQiBkYXRhIGFjY2VzcyBzdWNjZWVkZWRcbiIpKTsKKwlyZXR1cm4gKFNpemUpOworfSAvKiBTa0dlSW9jTWliICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCUdldENvbmZpZ3VyYXRpb24gLSByZWFkIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gcmVhZHMgcGVyLWFkYXB0ZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tCisgKgl0aGUgb3B0aW9ucyBwcm92aWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICoKKyAqIFJldHVybnM6CisgKglub25lCisgKi8KK3N0YXRpYyB2b2lkIEdldENvbmZpZ3VyYXRpb24oCitTS19BQwkqcEFDKQkvKiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIGNvbnRleHQgc3RydWN0dXJlICovCit7CitTS19JMzIJUG9ydDsJCS8qIHByZWZlcnJlZCBwb3J0ICovCitTS19CT09MCUF1dG9TZXQ7CitTS19CT09MIER1cFNldDsKK2ludAlMaW5rU3BlZWQgICAgICAgICAgPSBTS19MU1BFRURfQVVUTzsJLyogTGluayBzcGVlZCAqLworaW50CUF1dG9OZWcgICAgICAgICAgICA9IDE7CQkJLyogYXV0b25lZyBvZmYgKDApIG9yIG9uICgxKSAqLworaW50CUR1cGxleENhcCAgICAgICAgICA9IDA7CQkJLyogMD1ib3RoLDE9ZnVsbCwyPWhhbGYgKi8KK2ludAlGbG93Q3RybCAgICAgICAgICAgPSBTS19GTE9XX01PREVfU1lNX09SX1JFTTsJLyogRmxvd0NvbnRyb2wgICovCitpbnQJTVNNb2RlICAgICAgICAgICAgID0gU0tfTVNfTU9ERV9BVVRPOwkvKiBtYXN0ZXIvc2xhdmUgbW9kZSAgICAqLworCitTS19CT09MIElzQ29uVHlwZURlZmluZWQgICA9IFNLX1RSVUU7CitTS19CT09MIElzTGlua1NwZWVkRGVmaW5lZCA9IFNLX1RSVUU7CitTS19CT09MIElzRmxvd0N0cmxEZWZpbmVkICA9IFNLX1RSVUU7CitTS19CT09MIElzUm9sZURlZmluZWQgICAgICA9IFNLX1RSVUU7CitTS19CT09MIElzTW9kZURlZmluZWQgICAgICA9IFNLX1RSVUU7CisvKgorICoJVGhlIHR3byBwYXJhbWV0ZXJzIEF1dG9OZWcuIGFuZCBEdXBsZXhDYXAuIG1hcCB0byBvbmUgY29uZmlndXJhdGlvbgorICoJcGFyYW1ldGVyLiBUaGUgbWFwcGluZyBpcyBkZXNjcmliZWQgYnkgdGhpcyB0YWJsZToKKyAqCUR1cGxleENhcCAtPgl8CWJvdGgJfAlmdWxsCXwJaGFsZgl8CisgKglBdXRvTmVnCQl8CQl8CQl8CQl8CisgKgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJT2ZmCQl8ICAgIGlsbGVnYWwJfAlGdWxsCXwJSGFsZgl8CisgKgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJT24JCXwgICBBdXRvQm90aAl8ICAgQXV0b0Z1bGwJfCAgIEF1dG9IYWxmCXwKKyAqCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglTZW5zZQkJfCAgIEF1dG9TZW5zZQl8ICAgQXV0b1NlbnNlCXwgICBBdXRvU2Vuc2UJfAorICovCitpbnQJQ2FwYWJpbGl0aWVzWzNdWzNdID0KKwkJeyB7ICAgICAgICAgICAgICAgIC0xLCBTS19MTU9ERV9GVUxMICAgICAsIFNLX0xNT0RFX0hBTEYgICAgIH0sCisJCSAge1NLX0xNT0RFX0FVVE9CT1RIICwgU0tfTE1PREVfQVVUT0ZVTEwgLCBTS19MTU9ERV9BVVRPSEFMRiB9LAorCQkgIHtTS19MTU9ERV9BVVRPU0VOU0UsIFNLX0xNT0RFX0FVVE9TRU5TRSwgU0tfTE1PREVfQVVUT1NFTlNFfSB9OworCisjZGVmaW5lIERDX0JPVEgJMAorI2RlZmluZSBEQ19GVUxMIDEKKyNkZWZpbmUgRENfSEFMRiAyCisjZGVmaW5lIEFOX09GRgkwCisjZGVmaW5lIEFOX09OCTEKKyNkZWZpbmUgQU5fU0VOUwkyCisjZGVmaW5lIE1fQ3VyclBvcnQgcEFDLT5HSW5pLkdQW1BvcnRdCisKKworCS8qCisJKiogU2V0IHRoZSBkZWZhdWx0IHZhbHVlcyBmaXJzdCBmb3IgYm90aCBwb3J0cyEKKwkqLworCWZvciAoUG9ydCA9IDA7IFBvcnQgPCBTS19NQVhfTUFDUzsgUG9ydCsrKSB7CisJCU1fQ3VyclBvcnQuUExpbmtNb2RlQ29uZiA9IENhcGFiaWxpdGllc1tBTl9PTl1bRENfQk9USF07CisJCU1fQ3VyclBvcnQuUEZsb3dDdHJsTW9kZSA9IFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNOworCQlNX0N1cnJQb3J0LlBNU01vZGUgICAgICAgPSBTS19NU19NT0RFX0FVVE87CisJCU1fQ3VyclBvcnQuUExpbmtTcGVlZCAgICA9IFNLX0xTUEVFRF9BVVRPOworCX0KKworCS8qCisJKiogQ2hlY2sgbWVyZ2VkIHBhcmFtZXRlciBDb25UeXBlLiBJZiBpdCBoYXMgbm90IGJlZW4gdXNlZCwKKwkqKiB2ZXJpZnkgYW55IG90aGVyIHBhcmFtZXRlciAoZS5nLiBBdXRvTmVnKSBhbmQgdXNlIGRlZmF1bHQgdmFsdWVzLiAKKwkqKgorCSoqIFN0YXRpbmcgYm90aCBDb25UeXBlIGFuZCBvdGhlciBsb3dsZXZlbCBsaW5rIHBhcmFtZXRlcnMgaXMgYWxzbworCSoqIHBvc3NpYmxlLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGUgcGFzc2VkIENvblR5cGUtcGFyYW1ldGVyIGlzIAorCSoqIG92ZXJ3cml0dGVuIGJ5IHRoZSBsb3dsZXZlbCBsaW5rIHBhcmFtZXRlci4KKwkqKgorCSoqIFRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgYXJlIHVzZWQgZm9yIGEgbWVyZ2VkIENvblR5cGUtcGFyYW1ldGVyOgorCSoqCisJKiogQ29uVHlwZSAgIER1cENhcCAgIEF1dG9OZWcgICBGbG93Q3RybCAgICAgIFJvbGUgICAgICBTcGVlZAorCSoqIC0tLS0tLS0gICAtLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tLS0tICAgLS0tLS0KKwkqKiAgQXV0byAgICAgIEJvdGggICAgICBPbiAgICAgIFN5bU9yUmVtICAgICAgQXV0byAgICAgICBBdXRvCisJKiogIDEwMEZEICAgICBGdWxsICAgICAgT2ZmICAgICAgIE5vbmUgICAgICA8aWdub3JlZD4gICAgMTAwCisJKiogIDEwMEhEICAgICBIYWxmICAgICAgT2ZmICAgICAgIE5vbmUgICAgICA8aWdub3JlZD4gICAgMTAwCisJKiogIDEwRkQgICAgICBGdWxsICAgICAgT2ZmICAgICAgIE5vbmUgICAgICA8aWdub3JlZD4gICAgMTAKKwkqKiAgMTBIRCAgICAgIEhhbGYgICAgICBPZmYgICAgICAgTm9uZSAgICAgIDxpZ25vcmVkPiAgICAxMAorCSoqIAorCSoqIFRoaXMgQ29uVHlwZSBwYXJhbWV0ZXIgaXMgdXNlZCBmb3IgYWxsIHBvcnRzIG9mIHRoZSBhZGFwdGVyIQorCSovCisgICAgICAgIGlmICggKENvblR5cGUgIT0gTlVMTCkgICAgICAgICAgICAgICAgJiYgCisJICAgICAocEFDLT5JbmRleCA8IFNLX01BWF9DQVJEX1BBUkFNKSAmJgorCSAgICAgKENvblR5cGVbcEFDLT5JbmRleF0gIT0gTlVMTCkgKSB7CisKKwkJCS8qIENoZWNrIGNoaXBzZXQgZmFtaWx5ICovCisJCQlpZiAoKCFwQUMtPkNoaXBzZXRUeXBlKSAmJiAKKwkJCQkoc3RyY21wKENvblR5cGVbcEFDLT5JbmRleF0sIkF1dG8iKSE9MCkgJiYKKwkJCQkoc3RyY21wKENvblR5cGVbcEFDLT5JbmRleF0sIiIpIT0wKSkgeworCQkJCS8qIFNldCB0aGUgc3BlZWQgcGFyYW1ldGVyIGJhY2sgKi8KKwkJCQkJcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiAiIAorCQkJCQkJCSJmb3IgQ29uVHlwZS4iCisJCQkJCQkJIiBVc2luZyBBdXRvLlxuIiwgCisJCQkJCQkJQ29uVHlwZVtwQUMtPkluZGV4XSk7CisKKwkJCQkJc3ByaW50ZihDb25UeXBlW3BBQy0+SW5kZXhdLCAiQXV0byIpOwkKKwkJCX0KKworCQkJCWlmIChzdHJjbXAoQ29uVHlwZVtwQUMtPkluZGV4XSwiIik9PTApIHsKKwkJCUlzQ29uVHlwZURlZmluZWQgPSBTS19GQUxTRTsgLyogTm8gQ29uVHlwZSBkZWZpbmVkICovCisJCQkJfSBlbHNlIGlmIChzdHJjbXAoQ29uVHlwZVtwQUMtPkluZGV4XSwiQXV0byIpPT0wKSB7CisJCSAgICBmb3IgKFBvcnQgPSAwOyBQb3J0IDwgU0tfTUFYX01BQ1M7IFBvcnQrKykgeworCQkJTV9DdXJyUG9ydC5QTGlua01vZGVDb25mID0gQ2FwYWJpbGl0aWVzW0FOX09OXVtEQ19CT1RIXTsKKwkJCU1fQ3VyclBvcnQuUEZsb3dDdHJsTW9kZSA9IFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNOworCQkJTV9DdXJyUG9ydC5QTVNNb2RlICAgICAgID0gU0tfTVNfTU9ERV9BVVRPOworCQkJTV9DdXJyUG9ydC5QTGlua1NwZWVkICAgID0gU0tfTFNQRUVEX0FVVE87CisJCSAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQ29uVHlwZVtwQUMtPkluZGV4XSwiMTAwRkQiKT09MCkgeworCQkgICAgZm9yIChQb3J0ID0gMDsgUG9ydCA8IFNLX01BWF9NQUNTOyBQb3J0KyspIHsKKwkJCU1fQ3VyclBvcnQuUExpbmtNb2RlQ29uZiA9IENhcGFiaWxpdGllc1tBTl9PRkZdW0RDX0ZVTExdOworCQkJTV9DdXJyUG9ydC5QRmxvd0N0cmxNb2RlID0gU0tfRkxPV19NT0RFX05PTkU7CisJCQlNX0N1cnJQb3J0LlBNU01vZGUgICAgICAgPSBTS19NU19NT0RFX0FVVE87CisJCQlNX0N1cnJQb3J0LlBMaW5rU3BlZWQgICAgPSBTS19MU1BFRURfMTAwTUJQUzsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChDb25UeXBlW3BBQy0+SW5kZXhdLCIxMDBIRCIpPT0wKSB7CisJCSAgICBmb3IgKFBvcnQgPSAwOyBQb3J0IDwgU0tfTUFYX01BQ1M7IFBvcnQrKykgeworCQkJTV9DdXJyUG9ydC5QTGlua01vZGVDb25mID0gQ2FwYWJpbGl0aWVzW0FOX09GRl1bRENfSEFMRl07CisJCQlNX0N1cnJQb3J0LlBGbG93Q3RybE1vZGUgPSBTS19GTE9XX01PREVfTk9ORTsKKwkJCU1fQ3VyclBvcnQuUE1TTW9kZSAgICAgICA9IFNLX01TX01PREVfQVVUTzsKKwkJCU1fQ3VyclBvcnQuUExpbmtTcGVlZCAgICA9IFNLX0xTUEVFRF8xMDBNQlBTOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKENvblR5cGVbcEFDLT5JbmRleF0sIjEwRkQiKT09MCkgeworCQkgICAgZm9yIChQb3J0ID0gMDsgUG9ydCA8IFNLX01BWF9NQUNTOyBQb3J0KyspIHsKKwkJCU1fQ3VyclBvcnQuUExpbmtNb2RlQ29uZiA9IENhcGFiaWxpdGllc1tBTl9PRkZdW0RDX0ZVTExdOworCQkJTV9DdXJyUG9ydC5QRmxvd0N0cmxNb2RlID0gU0tfRkxPV19NT0RFX05PTkU7CisJCQlNX0N1cnJQb3J0LlBNU01vZGUgICAgICAgPSBTS19NU19NT0RFX0FVVE87CisJCQlNX0N1cnJQb3J0LlBMaW5rU3BlZWQgICAgPSBTS19MU1BFRURfMTBNQlBTOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKENvblR5cGVbcEFDLT5JbmRleF0sIjEwSEQiKT09MCkgeworCQkgICAgZm9yIChQb3J0ID0gMDsgUG9ydCA8IFNLX01BWF9NQUNTOyBQb3J0KyspIHsKKwkJCU1fQ3VyclBvcnQuUExpbmtNb2RlQ29uZiA9IENhcGFiaWxpdGllc1tBTl9PRkZdW0RDX0hBTEZdOworCQkJTV9DdXJyUG9ydC5QRmxvd0N0cmxNb2RlID0gU0tfRkxPV19NT0RFX05PTkU7CisJCQlNX0N1cnJQb3J0LlBNU01vZGUgICAgICAgPSBTS19NU19NT0RFX0FVVE87CisJCQlNX0N1cnJQb3J0LlBMaW5rU3BlZWQgICAgPSBTS19MU1BFRURfMTBNQlBTOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IAorCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgQ29uVHlwZVxuIiwgCisJCQlDb25UeXBlW3BBQy0+SW5kZXhdKTsKKwkJICAgIElzQ29uVHlwZURlZmluZWQgPSBTS19GQUxTRTsgLyogV3JvbmcgQ29uVHlwZSBkZWZpbmVkICovCisJCX0KKyAgICAgICAgfSBlbHNlIHsKKwkgICAgSXNDb25UeXBlRGVmaW5lZCA9IFNLX0ZBTFNFOyAvKiBObyBDb25UeXBlIGRlZmluZWQgKi8KKwl9CisKKwkvKgorCSoqIFBhcnNlIGFueSBwYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIHBvcnQgQToKKwkqKiBhKSBhbnkgTGlua1NwZWVkIHN0YXRlZD8KKwkqLworCWlmIChTcGVlZF9BICE9IE5VTEwgJiYgcEFDLT5JbmRleDxTS19NQVhfQ0FSRF9QQVJBTSAmJgorCQlTcGVlZF9BW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChTcGVlZF9BW3BBQy0+SW5kZXhdLCIiKT09MCkgeworCQkgICAgSXNMaW5rU3BlZWREZWZpbmVkID0gU0tfRkFMU0U7CisJCX0gZWxzZSBpZiAoc3RyY21wKFNwZWVkX0FbcEFDLT5JbmRleF0sIkF1dG8iKT09MCkgeworCQkgICAgTGlua1NwZWVkID0gU0tfTFNQRUVEX0FVVE87CisJCX0gZWxzZSBpZiAoc3RyY21wKFNwZWVkX0FbcEFDLT5JbmRleF0sIjEwIik9PTApIHsKKwkJICAgIExpbmtTcGVlZCA9IFNLX0xTUEVFRF8xME1CUFM7CisJCX0gZWxzZSBpZiAoc3RyY21wKFNwZWVkX0FbcEFDLT5JbmRleF0sIjEwMCIpPT0wKSB7CisJCSAgICBMaW5rU3BlZWQgPSBTS19MU1BFRURfMTAwTUJQUzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoU3BlZWRfQVtwQUMtPkluZGV4XSwiMTAwMCIpPT0wKSB7CisJCSAgICBMaW5rU3BlZWQgPSBTS19MU1BFRURfMTAwME1CUFM7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciBTcGVlZF9BXG4iLAorCQkJU3BlZWRfQVtwQUMtPkluZGV4XSk7CisJCSAgICBJc0xpbmtTcGVlZERlZmluZWQgPSBTS19GQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJICAgIElzTGlua1NwZWVkRGVmaW5lZCA9IFNLX0ZBTFNFOworCX0KKworCS8qIAorCSoqIENoZWNrIHNwZWVkIHBhcmFtZXRlcjogCisJKiogICAgT25seSBjb3BwZXIgdHlwZSBhZGFwdGVyIGFuZCBHRSBWMiBjYXJkcyAKKwkqLworCWlmICgoKCFwQUMtPkNoaXBzZXRUeXBlKSB8fCAocEFDLT5HSW5pLkdJQ29wcGVyVHlwZSAhPSBTS19UUlVFKSkgJiYKKwkJKChMaW5rU3BlZWQgIT0gU0tfTFNQRUVEX0FVVE8pICYmCisJCShMaW5rU3BlZWQgIT0gU0tfTFNQRUVEXzEwMDBNQlBTKSkpIHsKKwkJcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIGZvciBTcGVlZF9BLiAiCisJCQkiTm90IGEgY29wcGVyIGNhcmQgb3IgR0UgVjIgY2FyZFxuICAgIFVzaW5nICIKKwkJCSJzcGVlZCAxMDAwXG4iKTsKKwkJTGlua1NwZWVkID0gU0tfTFNQRUVEXzEwMDBNQlBTOworCX0KKwkKKwkvKgkKKwkqKiBEZWNpZGUgd2hldGhlciB0byBzZXQgbmV3IGNvbmZpZyB2YWx1ZSBpZiBzb21ldGhpZyB2YWxpZCBoYXMKKwkqKiBiZWVuIHJlY2VpdmVkLgorCSovCisJaWYgKElzTGlua1NwZWVkRGVmaW5lZCkgeworCQlwQUMtPkdJbmkuR1BbMF0uUExpbmtTcGVlZCA9IExpbmtTcGVlZDsKKwl9IAorCisJLyogCisJKiogYikgQW55IEF1dG9uZWdvdGlhdGlvbiBhbmQgRHVwbGV4Q2FwYWJpbGl0aWVzIHNldD8KKwkqKiAgICBQbGVhc2Ugbm90ZSB0aGF0IGJvdGggYmVsb25nIHRvZ2V0aGVyLi4uCisJKi8KKwlBdXRvTmVnID0gQU5fT047IC8qIHRzY2hpbGxpbmc6IERlZmF1bHQ6IEF1dG9uZWdvdGlhdGlvbiBvbiEgKi8KKwlBdXRvU2V0ID0gU0tfRkFMU0U7CisJaWYgKEF1dG9OZWdfQSAhPSBOVUxMICYmIHBBQy0+SW5kZXg8U0tfTUFYX0NBUkRfUEFSQU0gJiYKKwkJQXV0b05lZ19BW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJQXV0b1NldCA9IFNLX1RSVUU7CisJCWlmIChzdHJjbXAoQXV0b05lZ19BW3BBQy0+SW5kZXhdLCIiKT09MCkgeworCQkgICAgQXV0b1NldCA9IFNLX0ZBTFNFOworCQl9IGVsc2UgaWYgKHN0cmNtcChBdXRvTmVnX0FbcEFDLT5JbmRleF0sIk9uIik9PTApIHsKKwkJICAgIEF1dG9OZWcgPSBBTl9PTjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoQXV0b05lZ19BW3BBQy0+SW5kZXhdLCJPZmYiKT09MCkgeworCQkgICAgQXV0b05lZyA9IEFOX09GRjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoQXV0b05lZ19BW3BBQy0+SW5kZXhdLCJTZW5zZSIpPT0wKSB7CisJCSAgICBBdXRvTmVnID0gQU5fU0VOUzsKKwkJfSBlbHNlIHsKKwkJICAgIHByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBcIiVzXCIgZm9yIEF1dG9OZWdfQVxuIiwKKwkJCUF1dG9OZWdfQVtwQUMtPkluZGV4XSk7CisJCX0KKwl9CisKKwlEdXBsZXhDYXAgPSBEQ19CT1RIOworCUR1cFNldCAgICA9IFNLX0ZBTFNFOworCWlmIChEdXBDYXBfQSAhPSBOVUxMICYmIHBBQy0+SW5kZXg8U0tfTUFYX0NBUkRfUEFSQU0gJiYKKwkJRHVwQ2FwX0FbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlEdXBTZXQgPSBTS19UUlVFOworCQlpZiAoc3RyY21wKER1cENhcF9BW3BBQy0+SW5kZXhdLCIiKT09MCkgeworCQkgICAgRHVwU2V0ID0gU0tfRkFMU0U7CisJCX0gZWxzZSBpZiAoc3RyY21wKER1cENhcF9BW3BBQy0+SW5kZXhdLCJCb3RoIik9PTApIHsKKwkJICAgIER1cGxleENhcCA9IERDX0JPVEg7CisJCX0gZWxzZSBpZiAoc3RyY21wKER1cENhcF9BW3BBQy0+SW5kZXhdLCJGdWxsIik9PTApIHsKKwkJICAgIER1cGxleENhcCA9IERDX0ZVTEw7CisJCX0gZWxzZSBpZiAoc3RyY21wKER1cENhcF9BW3BBQy0+SW5kZXhdLCJIYWxmIik9PTApIHsKKwkJICAgIER1cGxleENhcCA9IERDX0hBTEY7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciBEdXBDYXBfQVxuIiwKKwkJCUR1cENhcF9BW3BBQy0+SW5kZXhdKTsKKwkJfQorCX0KKworCS8qIAorCSoqIENoZWNrIGZvciBpbGxlZ2FsIGNvbWJpbmF0aW9ucyAKKwkqLworCWlmICgoTGlua1NwZWVkID09IFNLX0xTUEVFRF8xMDAwTUJQUykgJiYKKwkJKChEdXBsZXhDYXAgPT0gU0tfTE1PREVfU1RBVF9BVVRPSEFMRikgfHwKKwkJKER1cGxleENhcCA9PSBTS19MTU9ERV9TVEFUX0hBTEYpKSAmJgorCQkocEFDLT5DaGlwc2V0VHlwZSkpIHsKKwkJICAgIHByaW50aygic2s5OGxpbjogSGFsZiBEdXBsZXggbm90IHBvc3NpYmxlIHdpdGggR2lnYWJpdCBzcGVlZCFcbiIKKwkJCQkJIiAgICBVc2luZyBGdWxsIER1cGxleC5cbiIpOworCQkJCUR1cGxleENhcCA9IERDX0ZVTEw7CisJfQorCisJaWYgKCBBdXRvU2V0ICYmIEF1dG9OZWc9PUFOX1NFTlMgJiYgRHVwU2V0KSB7CisJCXByaW50aygic2s5OGxpbiwgUG9ydCBBOiBEdXBsZXhDYXBhYmlsaXRpZXMiCisJCQkiIGlnbm9yZWQgdXNpbmcgU2Vuc2UgbW9kZVxuIik7CisJfQorCisJaWYgKEF1dG9TZXQgJiYgQXV0b05lZz09QU5fT0ZGICYmIER1cFNldCAmJiBEdXBsZXhDYXA9PURDX0JPVEgpeworCQlwcmludGsoInNrOThsaW46IFBvcnQgQTogSWxsZWdhbCBjb21iaW5hdGlvbiIKKwkJCSIgb2YgdmFsdWVzIEF1dG9OZWcuIGFuZCBEdXBsZXhDYXAuXG4gICAgVXNpbmcgIgorCQkJIkZ1bGwgRHVwbGV4XG4iKTsKKwkJRHVwbGV4Q2FwID0gRENfRlVMTDsKKwl9CisKKwlpZiAoQXV0b1NldCAmJiBBdXRvTmVnPT1BTl9PRkYgJiYgIUR1cFNldCkgeworCQlEdXBsZXhDYXAgPSBEQ19GVUxMOworCX0KKwkKKwlpZiAoIUF1dG9TZXQgJiYgRHVwU2V0KSB7CisJCXByaW50aygic2s5OGxpbjogUG9ydCBBOiBEdXBsZXggc2V0dGluZyBub3QiCisJCQkiIHBvc3NpYmxlIGluXG4gICAgZGVmYXVsdCBBdXRvTmVnb3RpYXRpb24gbW9kZSIKKwkJCSIgKFNlbnNlKS5cbiAgICBVc2luZyBBdXRvTmVnb3RpYXRpb24gT25cbiIpOworCQlBdXRvTmVnID0gQU5fT047CisJfQorCQorCS8qIAorCSoqIHNldCB0aGUgZGVzaXJlZCBtb2RlIAorCSovCisJaWYgKEF1dG9TZXQgfHwgRHVwU2V0KSB7CisJICAgIHBBQy0+R0luaS5HUFswXS5QTGlua01vZGVDb25mID0gQ2FwYWJpbGl0aWVzW0F1dG9OZWddW0R1cGxleENhcF07CisJfQorCQorCS8qIAorCSoqIGMpIEFueSBGbG93Y29udHJvbC1wYXJhbWV0ZXIgc2V0PworCSovCisJaWYgKEZsb3dDdHJsX0EgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCUZsb3dDdHJsX0FbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKEZsb3dDdHJsX0FbcEFDLT5JbmRleF0sIiIpID09IDApIHsKKwkJICAgIElzRmxvd0N0cmxEZWZpbmVkID0gU0tfRkFMU0U7CisJCX0gZWxzZSBpZiAoc3RyY21wKEZsb3dDdHJsX0FbcEFDLT5JbmRleF0sIlN5bU9yUmVtIikgPT0gMCkgeworCQkgICAgRmxvd0N0cmwgPSBTS19GTE9XX01PREVfU1lNX09SX1JFTTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRmxvd0N0cmxfQVtwQUMtPkluZGV4XSwiU3ltIik9PTApIHsKKwkJICAgIEZsb3dDdHJsID0gU0tfRkxPV19NT0RFX1NZTU1FVFJJQzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRmxvd0N0cmxfQVtwQUMtPkluZGV4XSwiTG9jU2VuZCIpPT0wKSB7CisJCSAgICBGbG93Q3RybCA9IFNLX0ZMT1dfTU9ERV9MT0NfU0VORDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRmxvd0N0cmxfQVtwQUMtPkluZGV4XSwiTm9uZSIpPT0wKSB7CisJCSAgICBGbG93Q3RybCA9IFNLX0ZMT1dfTU9ERV9OT05FOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgRmxvd0N0cmxfQVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZsb3dDdHJsX0FbcEFDLT5JbmRleF0pOworCQkgICAgSXNGbG93Q3RybERlZmluZWQgPSBTS19GQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJICAgSXNGbG93Q3RybERlZmluZWQgPSBTS19GQUxTRTsKKwl9CisKKwlpZiAoSXNGbG93Q3RybERlZmluZWQpIHsKKwkgICAgaWYgKChBdXRvTmVnID09IEFOX09GRikgJiYgKEZsb3dDdHJsICE9IFNLX0ZMT1dfTU9ERV9OT05FKSkgeworCQlwcmludGsoInNrOThsaW46IFBvcnQgQTogRmxvd0NvbnRyb2wiCisJCQkiIGltcG9zc2libGUgd2l0aG91dCBBdXRvTmVnb3RpYXRpb24sIgorCQkJIiBkaXNhYmxlZFxuIik7CisJCUZsb3dDdHJsID0gU0tfRkxPV19NT0RFX05PTkU7CisJICAgIH0KKwkgICAgcEFDLT5HSW5pLkdQWzBdLlBGbG93Q3RybE1vZGUgPSBGbG93Q3RybDsKKwl9CisKKwkvKgorCSoqIGQpIFdoYXQgaXMgd2l0aCB0aGUgUm9sZVBhcmFtZXRlcj8KKwkqLworCWlmIChSb2xlX0EgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCVJvbGVfQVtwQUMtPkluZGV4XSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoUm9sZV9BW3BBQy0+SW5kZXhdLCIiKT09MCkgeworCQkgICBJc1JvbGVEZWZpbmVkID0gU0tfRkFMU0U7CisJCX0gZWxzZSBpZiAoc3RyY21wKFJvbGVfQVtwQUMtPkluZGV4XSwiQXV0byIpPT0wKSB7CisJCSAgICBNU01vZGUgPSBTS19NU19NT0RFX0FVVE87CisJCX0gZWxzZSBpZiAoc3RyY21wKFJvbGVfQVtwQUMtPkluZGV4XSwiTWFzdGVyIik9PTApIHsKKwkJICAgIE1TTW9kZSA9IFNLX01TX01PREVfTUFTVEVSOworCQl9IGVsc2UgaWYgKHN0cmNtcChSb2xlX0FbcEFDLT5JbmRleF0sIlNsYXZlIik9PTApIHsKKwkJICAgIE1TTW9kZSA9IFNLX01TX01PREVfU0xBVkU7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciBSb2xlX0FcbiIsCisJCQlSb2xlX0FbcEFDLT5JbmRleF0pOworCQkgICAgSXNSb2xlRGVmaW5lZCA9IFNLX0ZBTFNFOworCQl9CisJfSBlbHNlIHsKKwkgICBJc1JvbGVEZWZpbmVkID0gU0tfRkFMU0U7CisJfQorCisJaWYgKElzUm9sZURlZmluZWQgPT0gU0tfVFJVRSkgeworCSAgICBwQUMtPkdJbmkuR1BbMF0uUE1TTW9kZSA9IE1TTW9kZTsKKwl9CisJCisKKwkKKwkvKiAKKwkqKiBQYXJzZSBhbnkgcGFyYW1ldGVyIHNldHRpbmdzIGZvciBwb3J0IEI6CisJKiogYSkgYW55IExpbmtTcGVlZCBzdGF0ZWQ/CisJKi8KKwlJc0NvblR5cGVEZWZpbmVkICAgPSBTS19UUlVFOworCUlzTGlua1NwZWVkRGVmaW5lZCA9IFNLX1RSVUU7CisJSXNGbG93Q3RybERlZmluZWQgID0gU0tfVFJVRTsKKwlJc01vZGVEZWZpbmVkICAgICAgPSBTS19UUlVFOworCisJaWYgKFNwZWVkX0IgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCVNwZWVkX0JbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKFNwZWVkX0JbcEFDLT5JbmRleF0sIiIpPT0wKSB7CisJCSAgICBJc0xpbmtTcGVlZERlZmluZWQgPSBTS19GQUxTRTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoU3BlZWRfQltwQUMtPkluZGV4XSwiQXV0byIpPT0wKSB7CisJCSAgICBMaW5rU3BlZWQgPSBTS19MU1BFRURfQVVUTzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoU3BlZWRfQltwQUMtPkluZGV4XSwiMTAiKT09MCkgeworCQkgICAgTGlua1NwZWVkID0gU0tfTFNQRUVEXzEwTUJQUzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoU3BlZWRfQltwQUMtPkluZGV4XSwiMTAwIik9PTApIHsKKwkJICAgIExpbmtTcGVlZCA9IFNLX0xTUEVFRF8xMDBNQlBTOworCQl9IGVsc2UgaWYgKHN0cmNtcChTcGVlZF9CW3BBQy0+SW5kZXhdLCIxMDAwIik9PTApIHsKKwkJICAgIExpbmtTcGVlZCA9IFNLX0xTUEVFRF8xMDAwTUJQUzsKKwkJfSBlbHNlIHsKKwkJICAgIHByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBcIiVzXCIgZm9yIFNwZWVkX0JcbiIsCisJCQlTcGVlZF9CW3BBQy0+SW5kZXhdKTsKKwkJICAgIElzTGlua1NwZWVkRGVmaW5lZCA9IFNLX0ZBTFNFOworCQl9CisJfSBlbHNlIHsKKwkgICAgSXNMaW5rU3BlZWREZWZpbmVkID0gU0tfRkFMU0U7CisJfQorCisJLyogCisJKiogQ2hlY2sgc3BlZWQgcGFyYW1ldGVyOgorCSoqICAgIE9ubHkgY29wcGVyIHR5cGUgYWRhcHRlciBhbmQgR0UgVjIgY2FyZHMgCisJKi8KKwlpZiAoKCghcEFDLT5DaGlwc2V0VHlwZSkgfHwgKHBBQy0+R0luaS5HSUNvcHBlclR5cGUgIT0gU0tfVFJVRSkpICYmCisJCSgoTGlua1NwZWVkICE9IFNLX0xTUEVFRF9BVVRPKSAmJgorCQkoTGlua1NwZWVkICE9IFNLX0xTUEVFRF8xMDAwTUJQUykpKSB7CisJCXByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBmb3IgU3BlZWRfQi4gIgorCQkJIk5vdCBhIGNvcHBlciBjYXJkIG9yIEdFIFYyIGNhcmRcbiAgICBVc2luZyAiCisJCQkic3BlZWQgMTAwMFxuIik7CisJCUxpbmtTcGVlZCA9IFNLX0xTUEVFRF8xMDAwTUJQUzsKKwl9CisKKwkvKiAgICAgIAorCSoqIERlY2lkZSB3aGV0aGVyIHRvIHNldCBuZXcgY29uZmlnIHZhbHVlIGlmIHNvbWV0aGlnIHZhbGlkIGhhcworCSoqIGJlZW4gcmVjZWl2ZWQuCisJKi8KKyAgICAgICAgaWYgKElzTGlua1NwZWVkRGVmaW5lZCkgeworCSAgICBwQUMtPkdJbmkuR1BbMV0uUExpbmtTcGVlZCA9IExpbmtTcGVlZDsKKwl9CisKKwkvKiAKKwkqKiBiKSBBbnkgQXV0b25lZ290aWF0aW9uIGFuZCBEdXBsZXhDYXBhYmlsaXRpZXMgc2V0PworCSoqICAgIFBsZWFzZSBub3RlIHRoYXQgYm90aCBiZWxvbmcgdG9nZXRoZXIuLi4KKwkqLworCUF1dG9OZWcgPSBBTl9TRU5TOyAvKiBkZWZhdWx0OiBkbyBhdXRvIFNlbnNlICovCisJQXV0b1NldCA9IFNLX0ZBTFNFOworCWlmIChBdXRvTmVnX0IgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCUF1dG9OZWdfQltwQUMtPkluZGV4XSAhPSBOVUxMKSB7CisJCUF1dG9TZXQgPSBTS19UUlVFOworCQlpZiAoc3RyY21wKEF1dG9OZWdfQltwQUMtPkluZGV4XSwiIik9PTApIHsKKwkJICAgIEF1dG9TZXQgPSBTS19GQUxTRTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoQXV0b05lZ19CW3BBQy0+SW5kZXhdLCJPbiIpPT0wKSB7CisJCSAgICBBdXRvTmVnID0gQU5fT047CisJCX0gZWxzZSBpZiAoc3RyY21wKEF1dG9OZWdfQltwQUMtPkluZGV4XSwiT2ZmIik9PTApIHsKKwkJICAgIEF1dG9OZWcgPSBBTl9PRkY7CisJCX0gZWxzZSBpZiAoc3RyY21wKEF1dG9OZWdfQltwQUMtPkluZGV4XSwiU2Vuc2UiKT09MCkgeworCQkgICAgQXV0b05lZyA9IEFOX1NFTlM7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciBBdXRvTmVnX0JcbiIsCisJCQlBdXRvTmVnX0JbcEFDLT5JbmRleF0pOworCQl9CisJfQorCisJRHVwbGV4Q2FwID0gRENfQk9USDsKKwlEdXBTZXQgICAgPSBTS19GQUxTRTsKKwlpZiAoRHVwQ2FwX0IgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCUR1cENhcF9CW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJRHVwU2V0ID0gU0tfVFJVRTsKKwkJaWYgKHN0cmNtcChEdXBDYXBfQltwQUMtPkluZGV4XSwiIik9PTApIHsKKwkJICAgIER1cFNldCA9IFNLX0ZBTFNFOworCQl9IGVsc2UgaWYgKHN0cmNtcChEdXBDYXBfQltwQUMtPkluZGV4XSwiQm90aCIpPT0wKSB7CisJCSAgICBEdXBsZXhDYXAgPSBEQ19CT1RIOworCQl9IGVsc2UgaWYgKHN0cmNtcChEdXBDYXBfQltwQUMtPkluZGV4XSwiRnVsbCIpPT0wKSB7CisJCSAgICBEdXBsZXhDYXAgPSBEQ19GVUxMOworCQl9IGVsc2UgaWYgKHN0cmNtcChEdXBDYXBfQltwQUMtPkluZGV4XSwiSGFsZiIpPT0wKSB7CisJCSAgICBEdXBsZXhDYXAgPSBEQ19IQUxGOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgRHVwQ2FwX0JcbiIsCisJCQlEdXBDYXBfQltwQUMtPkluZGV4XSk7CisJCX0KKwl9CisKKwkKKwkvKiAKKwkqKiBDaGVjayBmb3IgaWxsZWdhbCBjb21iaW5hdGlvbnMgCisJKi8KKwlpZiAoKExpbmtTcGVlZCA9PSBTS19MU1BFRURfMTAwME1CUFMpICYmCisJCSgoRHVwbGV4Q2FwID09IFNLX0xNT0RFX1NUQVRfQVVUT0hBTEYpIHx8CisJCShEdXBsZXhDYXAgPT0gU0tfTE1PREVfU1RBVF9IQUxGKSkgJiYKKwkJKHBBQy0+Q2hpcHNldFR5cGUpKSB7CisJCSAgICBwcmludGsoInNrOThsaW46IEhhbGYgRHVwbGV4IG5vdCBwb3NzaWJsZSB3aXRoIEdpZ2FiaXQgc3BlZWQhXG4iCisJCQkJCSIgICAgVXNpbmcgRnVsbCBEdXBsZXguXG4iKTsKKwkJCQlEdXBsZXhDYXAgPSBEQ19GVUxMOworCX0KKworCWlmIChBdXRvU2V0ICYmIEF1dG9OZWc9PUFOX1NFTlMgJiYgRHVwU2V0KSB7CisJCXByaW50aygic2s5OGxpbiwgUG9ydCBCOiBEdXBsZXhDYXBhYmlsaXRpZXMiCisJCQkiIGlnbm9yZWQgdXNpbmcgU2Vuc2UgbW9kZVxuIik7CisJfQorCisJaWYgKEF1dG9TZXQgJiYgQXV0b05lZz09QU5fT0ZGICYmIER1cFNldCAmJiBEdXBsZXhDYXA9PURDX0JPVEgpeworCQlwcmludGsoInNrOThsaW46IFBvcnQgQjogSWxsZWdhbCBjb21iaW5hdGlvbiIKKwkJCSIgb2YgdmFsdWVzIEF1dG9OZWcuIGFuZCBEdXBsZXhDYXAuXG4gICAgVXNpbmcgIgorCQkJIkZ1bGwgRHVwbGV4XG4iKTsKKwkJRHVwbGV4Q2FwID0gRENfRlVMTDsKKwl9CisKKwlpZiAoQXV0b1NldCAmJiBBdXRvTmVnPT1BTl9PRkYgJiYgIUR1cFNldCkgeworCQlEdXBsZXhDYXAgPSBEQ19GVUxMOworCX0KKwkKKwlpZiAoIUF1dG9TZXQgJiYgRHVwU2V0KSB7CisJCXByaW50aygic2s5OGxpbjogUG9ydCBCOiBEdXBsZXggc2V0dGluZyBub3QiCisJCQkiIHBvc3NpYmxlIGluXG4gICAgZGVmYXVsdCBBdXRvTmVnb3RpYXRpb24gbW9kZSIKKwkJCSIgKFNlbnNlKS5cbiAgICBVc2luZyBBdXRvTmVnb3RpYXRpb24gT25cbiIpOworCQlBdXRvTmVnID0gQU5fT047CisJfQorCisJLyogCisJKiogc2V0IHRoZSBkZXNpcmVkIG1vZGUgCisJKi8KKwlpZiAoQXV0b1NldCB8fCBEdXBTZXQpIHsKKwkgICAgcEFDLT5HSW5pLkdQWzFdLlBMaW5rTW9kZUNvbmYgPSBDYXBhYmlsaXRpZXNbQXV0b05lZ11bRHVwbGV4Q2FwXTsKKwl9CisKKwkvKgorCSoqIGMpIEFueSBGbG93Q3RybCBwYXJhbWV0ZXIgc2V0PworCSovCisJaWYgKEZsb3dDdHJsX0IgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCUZsb3dDdHJsX0JbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKEZsb3dDdHJsX0JbcEFDLT5JbmRleF0sIiIpID09IDApIHsKKwkJICAgIElzRmxvd0N0cmxEZWZpbmVkID0gU0tfRkFMU0U7CisJCX0gZWxzZSBpZiAoc3RyY21wKEZsb3dDdHJsX0JbcEFDLT5JbmRleF0sIlN5bU9yUmVtIikgPT0gMCkgeworCQkgICAgRmxvd0N0cmwgPSBTS19GTE9XX01PREVfU1lNX09SX1JFTTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRmxvd0N0cmxfQltwQUMtPkluZGV4XSwiU3ltIik9PTApIHsKKwkJICAgIEZsb3dDdHJsID0gU0tfRkxPV19NT0RFX1NZTU1FVFJJQzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRmxvd0N0cmxfQltwQUMtPkluZGV4XSwiTG9jU2VuZCIpPT0wKSB7CisJCSAgICBGbG93Q3RybCA9IFNLX0ZMT1dfTU9ERV9MT0NfU0VORDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRmxvd0N0cmxfQltwQUMtPkluZGV4XSwiTm9uZSIpPT0wKSB7CisJCSAgICBGbG93Q3RybCA9IFNLX0ZMT1dfTU9ERV9OT05FOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgRmxvd0N0cmxfQlxuIiwKKwkJCUZsb3dDdHJsX0JbcEFDLT5JbmRleF0pOworCQkgICAgSXNGbG93Q3RybERlZmluZWQgPSBTS19GQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJCUlzRmxvd0N0cmxEZWZpbmVkID0gU0tfRkFMU0U7CisJfQorCisJaWYgKElzRmxvd0N0cmxEZWZpbmVkKSB7CisJICAgIGlmICgoQXV0b05lZyA9PSBBTl9PRkYpICYmIChGbG93Q3RybCAhPSBTS19GTE9XX01PREVfTk9ORSkpIHsKKwkJcHJpbnRrKCJzazk4bGluOiBQb3J0IEI6IEZsb3dDb250cm9sIgorCQkJIiBpbXBvc3NpYmxlIHdpdGhvdXQgQXV0b05lZ290aWF0aW9uLCIKKwkJCSIgZGlzYWJsZWRcbiIpOworCQlGbG93Q3RybCA9IFNLX0ZMT1dfTU9ERV9OT05FOworCSAgICB9CisJICAgIHBBQy0+R0luaS5HUFsxXS5QRmxvd0N0cmxNb2RlID0gRmxvd0N0cmw7CisJfQorCisJLyoKKwkqKiBkKSBXaGF0IGlzIHRoZSBSb2xlUGFyYW1ldGVyPworCSovCisJaWYgKFJvbGVfQiAhPSBOVUxMICYmIHBBQy0+SW5kZXg8U0tfTUFYX0NBUkRfUEFSQU0gJiYKKwkJUm9sZV9CW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChSb2xlX0JbcEFDLT5JbmRleF0sIiIpPT0wKSB7CisJCSAgICBJc1JvbGVEZWZpbmVkID0gU0tfRkFMU0U7CisJCX0gZWxzZSBpZiAoc3RyY21wKFJvbGVfQltwQUMtPkluZGV4XSwiQXV0byIpPT0wKSB7CisJCSAgICBNU01vZGUgPSBTS19NU19NT0RFX0FVVE87CisJCX0gZWxzZSBpZiAoc3RyY21wKFJvbGVfQltwQUMtPkluZGV4XSwiTWFzdGVyIik9PTApIHsKKwkJICAgIE1TTW9kZSA9IFNLX01TX01PREVfTUFTVEVSOworCQl9IGVsc2UgaWYgKHN0cmNtcChSb2xlX0JbcEFDLT5JbmRleF0sIlNsYXZlIik9PTApIHsKKwkJICAgIE1TTW9kZSA9IFNLX01TX01PREVfU0xBVkU7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciBSb2xlX0JcbiIsCisJCQlSb2xlX0JbcEFDLT5JbmRleF0pOworCQkgICAgSXNSb2xlRGVmaW5lZCA9IFNLX0ZBTFNFOworCQl9CisJfSBlbHNlIHsKKwkgICAgSXNSb2xlRGVmaW5lZCA9IFNLX0ZBTFNFOworCX0KKworCWlmIChJc1JvbGVEZWZpbmVkKSB7CisJICAgIHBBQy0+R0luaS5HUFsxXS5QTVNNb2RlID0gTVNNb2RlOworCX0KKwkKKwkvKgorCSoqIEV2YWx1YXRlIHNldHRpbmdzIGZvciBib3RoIHBvcnRzCisJKi8KKwlwQUMtPkFjdGl2ZVBvcnQgPSAwOworCWlmIChQcmVmUG9ydCAhPSBOVUxMICYmIHBBQy0+SW5kZXg8U0tfTUFYX0NBUkRfUEFSQU0gJiYKKwkJUHJlZlBvcnRbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKFByZWZQb3J0W3BBQy0+SW5kZXhdLCIiKSA9PSAwKSB7IC8qIEF1dG8gKi8KKwkJCXBBQy0+QWN0aXZlUG9ydCAgICAgICAgICAgICA9ICAwOworCQkJcEFDLT5SbG10Lk5ldFswXS5QcmVmZXJlbmNlID0gLTE7IC8qIGF1dG8gKi8KKwkJCXBBQy0+UmxtdC5OZXRbMF0uUHJlZlBvcnQgICA9ICAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChQcmVmUG9ydFtwQUMtPkluZGV4XSwiQSIpID09IDApIHsKKwkJCS8qCisJCQkqKiBkbyBub3Qgc2V0IEFjdGl2ZVBvcnQgaGVyZSwgdGh1cyBhIHBvcnQKKwkJCSoqIHN3aXRjaCBpcyBpc3N1ZWQgYWZ0ZXIgbmV0IHVwLgorCQkJKi8KKwkJCVBvcnQgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CisJCQlwQUMtPlJsbXQuTmV0WzBdLlByZWZlcmVuY2UgPSBQb3J0OworCQkJcEFDLT5SbG10Lk5ldFswXS5QcmVmUG9ydCAgID0gUG9ydDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoUHJlZlBvcnRbcEFDLT5JbmRleF0sIkIiKSA9PSAwKSB7CisJCQkvKgorCQkJKiogZG8gbm90IHNldCBBY3RpdmVQb3J0IGhlcmUsIHRodXMgYSBwb3J0CisJCQkqKiBzd2l0Y2ggaXMgaXNzdWVkIGFmdGVyIG5ldCB1cC4KKwkJCSovCisJCQlpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDEpIHsKKwkJCQlwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCJCXCIgZm9yIFByZWZQb3J0LlxuIgorCQkJCQkiICAgICAgUG9ydCBCIG5vdCBhdmFpbGFibGUgb24gc2luZ2xlIHBvcnQgYWRhcHRlcnMuXG4iKTsKKworCQkJCXBBQy0+QWN0aXZlUG9ydCAgICAgICAgICAgICA9ICAwOworCQkJCXBBQy0+UmxtdC5OZXRbMF0uUHJlZmVyZW5jZSA9IC0xOyAvKiBhdXRvICovCisJCQkJcEFDLT5SbG10Lk5ldFswXS5QcmVmUG9ydCAgID0gIDA7CisJCQl9IGVsc2UgeworCQkJCVBvcnQgICAgICAgICAgICAgICAgICAgICAgICA9IDE7CisJCQkJcEFDLT5SbG10Lk5ldFswXS5QcmVmZXJlbmNlID0gUG9ydDsKKwkJCQlwQUMtPlJsbXQuTmV0WzBdLlByZWZQb3J0ICAgPSBQb3J0OworCQkJfQorCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgUHJlZlBvcnRcbiIsCisJCQlQcmVmUG9ydFtwQUMtPkluZGV4XSk7CisJCX0KKwl9CisKKwlwQUMtPlJsbXROZXRzID0gMTsKKworCWlmIChSbG10TW9kZSAhPSBOVUxMICYmIHBBQy0+SW5kZXg8U0tfTUFYX0NBUkRfUEFSQU0gJiYKKwkJUmxtdE1vZGVbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKFJsbXRNb2RlW3BBQy0+SW5kZXhdLCAiIikgPT0gMCkgeworCQkJcEFDLT5SbG10TW9kZSA9IDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKFJsbXRNb2RlW3BBQy0+SW5kZXhdLCAiQ2hlY2tMaW5rU3RhdGUiKSA9PSAwKSB7CisJCQlwQUMtPlJsbXRNb2RlID0gU0tfUkxNVF9DSEVDS19MSU5LOworCQl9IGVsc2UgaWYgKHN0cmNtcChSbG10TW9kZVtwQUMtPkluZGV4XSwgIkNoZWNrTG9jYWxQb3J0IikgPT0gMCkgeworCQkJcEFDLT5SbG10TW9kZSA9IFNLX1JMTVRfQ0hFQ0tfTElOSyB8CisJCQkJCVNLX1JMTVRfQ0hFQ0tfTE9DX0xJTks7CisJCX0gZWxzZSBpZiAoc3RyY21wKFJsbXRNb2RlW3BBQy0+SW5kZXhdLCAiQ2hlY2tTZWciKSA9PSAwKSB7CisJCQlwQUMtPlJsbXRNb2RlID0gU0tfUkxNVF9DSEVDS19MSU5LICAgICB8CisJCQkJCVNLX1JMTVRfQ0hFQ0tfTE9DX0xJTksgfAorCQkJCQlTS19STE1UX0NIRUNLX1NFRzsKKwkJfSBlbHNlIGlmICgoc3RyY21wKFJsbXRNb2RlW3BBQy0+SW5kZXhdLCAiRHVhbE5ldCIpID09IDApICYmCisJCQkocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIpKSB7CisJCQlwQUMtPlJsbXRNb2RlID0gU0tfUkxNVF9DSEVDS19MSU5LOworCQkJcEFDLT5SbG10TmV0cyA9IDI7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciIKKwkJCSIgUmxtdE1vZGUsIHVzaW5nIGRlZmF1bHRcbiIsIAorCQkJUmxtdE1vZGVbcEFDLT5JbmRleF0pOworCQkJcEFDLT5SbG10TW9kZSA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlwQUMtPlJsbXRNb2RlID0gMDsKKwl9CisJCisJLyoKKwkqKiBDaGVjayB0aGUgaW50ZXJydXB0IG1vZGVyYXRpb24gcGFyYW1ldGVycworCSovCisJaWYgKE1vZGVyYXRpb25bcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKE1vZGVyYXRpb25bcEFDLT5JbmRleF0sICIiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uSW50TW9kVHlwZVNlbGVjdCA9IENfSU5UX01PRF9OT05FOworCQl9IGVsc2UgaWYgKHN0cmNtcChNb2RlcmF0aW9uW3BBQy0+SW5kZXhdLCAiU3RhdGljIikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLkludE1vZFR5cGVTZWxlY3QgPSBDX0lOVF9NT0RfU1RBVElDOworCQl9IGVsc2UgaWYgKHN0cmNtcChNb2RlcmF0aW9uW3BBQy0+SW5kZXhdLCAiRHluYW1pYyIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5JbnRNb2RUeXBlU2VsZWN0ID0gQ19JTlRfTU9EX0RZTkFNSUM7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25bcEFDLT5JbmRleF0sICJOb25lIikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLkludE1vZFR5cGVTZWxlY3QgPSBDX0lOVF9NT0RfTk9ORTsKKwkJfSBlbHNlIHsKKwkgICAJCXByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBcIiVzXCIgZm9yIE1vZGVyYXRpb24uXG4iCisJCQkJIiAgICAgIERpc2FibGUgaW50ZXJydXB0IG1vZGVyYXRpb24uXG4iLAorCQkJCU1vZGVyYXRpb25bcEFDLT5JbmRleF0pOworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLkludE1vZFR5cGVTZWxlY3QgPSBDX0lOVF9NT0RfTk9ORTsKKwkJfQorCX0gZWxzZSB7CisJCXBBQy0+RHluSXJxTW9kSW5mby5JbnRNb2RUeXBlU2VsZWN0ID0gQ19JTlRfTU9EX05PTkU7CisJfQorCisJaWYgKFN0YXRzW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChTdGF0c1twQUMtPkluZGV4XSwgIlllcyIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5EaXNwbGF5U3RhdHMgPSBTS19UUlVFOworCQl9IGVsc2UgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLkRpc3BsYXlTdGF0cyA9IFNLX0ZBTFNFOworCQl9CisJfSBlbHNlIHsKKwkJcEFDLT5EeW5JcnFNb2RJbmZvLkRpc3BsYXlTdGF0cyA9IFNLX0ZBTFNFOworCX0KKworCWlmIChNb2RlcmF0aW9uTWFza1twQUMtPkluZGV4XSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJSeCIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5NYXNrSXJxTW9kZXJhdGlvbiA9IElSUV9NQVNLX1JYX09OTFk7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiVHgiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19UWF9PTkxZOworCQl9IGVsc2UgaWYgKHN0cmNtcChNb2RlcmF0aW9uTWFza1twQUMtPkluZGV4XSwgIlNwIikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfU1BfT05MWTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJSeFNwIikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfU1BfUlg7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiU3BSeCIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5NYXNrSXJxTW9kZXJhdGlvbiA9IElSUV9NQVNLX1NQX1JYOworCQl9IGVsc2UgaWYgKHN0cmNtcChNb2RlcmF0aW9uTWFza1twQUMtPkluZGV4XSwgIlJ4VHgiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19UWF9SWDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJUeFJ4IikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfVFhfUlg7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiVHhTcCIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5NYXNrSXJxTW9kZXJhdGlvbiA9IElSUV9NQVNLX1NQX1RYOworCQl9IGVsc2UgaWYgKHN0cmNtcChNb2RlcmF0aW9uTWFza1twQUMtPkluZGV4XSwgIlNwVHgiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19TUF9UWDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJSeFR4U3AiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9UWF9TUDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJSeFNwVHgiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9UWF9TUDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJUeFJ4U3AiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9UWF9TUDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJUeFNwUngiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9UWF9TUDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJTcFR4UngiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9UWF9TUDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJTcFJ4VHgiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9UWF9TUDsKKwkJfSBlbHNlIHsgLyogc29tZSBydWJiaXNoICovCisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9PTkxZOworCQl9CisJfSBlbHNlIHsgIC8qIG9wZXJhdG9yIGhhcyBzdGF0ZWQgbm90aGluZyAqLworCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19UWF9SWDsKKwl9CisKKwlpZiAoQXV0b1NpemluZ1twQUMtPkluZGV4XSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoQXV0b1NpemluZ1twQUMtPkluZGV4XSwgIk9uIikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLkF1dG9TaXppbmcgPSBTS19GQUxTRTsKKwkJfSBlbHNlIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5BdXRvU2l6aW5nID0gU0tfRkFMU0U7CisJCX0KKwl9IGVsc2UgeyAgLyogb3BlcmF0b3IgaGFzIHN0YXRlZCBub3RoaW5nICovCisJCXBBQy0+RHluSXJxTW9kSW5mby5BdXRvU2l6aW5nID0gU0tfRkFMU0U7CisJfQorCisJaWYgKEludHNQZXJTZWNbcEFDLT5JbmRleF0gIT0gMCkgeworCQlpZiAoKEludHNQZXJTZWNbcEFDLT5JbmRleF08IENfSU5UX01PRF9JUFNfTE9XRVJfUkFOR0UpIHx8IAorCQkJKEludHNQZXJTZWNbcEFDLT5JbmRleF0gPiBDX0lOVF9NT0RfSVBTX1VQUEVSX1JBTkdFKSkgeworCSAgIAkJcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJWRcIiBmb3IgSW50c1BlclNlYy4gKFJhbmdlOiAlZCAtICVkKVxuIgorCQkJCSIgICAgICBVc2luZyBkZWZhdWx0IHZhbHVlIG9mICVpLlxuIiwgCisJCQkJSW50c1BlclNlY1twQUMtPkluZGV4XSwKKwkJCQlDX0lOVF9NT0RfSVBTX0xPV0VSX1JBTkdFLAorCQkJCUNfSU5UX01PRF9JUFNfVVBQRVJfUkFOR0UsCisJCQkJQ19JTlRTX1BFUl9TRUNfREVGQVVMVCk7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyA9IENfSU5UU19QRVJfU0VDX0RFRkFVTFQ7CisJCX0gZWxzZSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyA9IEludHNQZXJTZWNbcEFDLT5JbmRleF07CisJCX0KKwl9IGVsc2UgeworCQlwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyA9IENfSU5UU19QRVJfU0VDX0RFRkFVTFQ7CisJfQorCisJLyoKKwkqKiBFdmFsdWF0ZSB1cHBlciBhbmQgbG93ZXIgbW9kZXJhdGlvbiB0aHJlc2hvbGQKKwkqLworCXBBQy0+RHluSXJxTW9kSW5mby5NYXhNb2RJbnRzUGVyU2VjVXBwZXJMaW1pdCA9CisJCXBBQy0+RHluSXJxTW9kSW5mby5NYXhNb2RJbnRzUGVyU2VjICsKKwkJKHBBQy0+RHluSXJxTW9kSW5mby5NYXhNb2RJbnRzUGVyU2VjIC8gMik7CisKKwlwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlY0xvd2VyTGltaXQgPQorCQlwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyAtCisJCShwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyAvIDIpOworCisJcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZUaW1lVmFsID0gamlmZmllczsgIC8qIGluaXRpYWwgdmFsdWUgKi8KKworCit9IC8qIEdldENvbmZpZ3VyYXRpb24gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJUHJvZHVjdFN0ciAtIHJldHVybiBhIGFkYXB0ZXIgaWRlbnRpZmljYXRpb24gc3RyaW5nIGZyb20gdnBkCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBwcm9kdWN0IG5hbWUgc3RyaW5nIGZyb20gdGhlIHZwZCBhcmVhCisgKglhbmQgcHV0cyBpdCB0aGUgZmllbGQgcEFDLT5EZXZpY2VTdHJpbmcuCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIFByb2R1Y3RTdHIoCitTS19BQwkqcEFDCQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworKQoreworaW50CVN0ckxlbiA9IDgwOwkJLyogbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIGRlZmluZWQgaW4gU0tfQUMgKi8KK2NoYXIJS2V5d29yZFtdID0gVlBEX05BTUU7CS8qIHZwZCBwcm9kdWN0bmFtZSBpZGVudGlmaWVyICovCitpbnQJUmV0dXJuQ29kZTsJCS8qIHJldHVybiBjb2RlIGZyb20gdnBkX3JlYWQgKi8KK3Vuc2lnbmVkIGxvbmcgRmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwlSZXR1cm5Db2RlID0gVnBkUmVhZChwQUMsIHBBQy0+SW9CYXNlLCBLZXl3b3JkLCBwQUMtPkRldmljZVN0ciwKKwkJJlN0ckxlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwlpZiAoUmV0dXJuQ29kZSAhPSAwKSB7CisJCS8qIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIHRoZSB2cGQgZGF0YSAqLworCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRVJST1IsCisJCQkoIkVycm9yIHJlYWRpbmcgVlBEIGRhdGE6ICVkXG4iLCBSZXR1cm5Db2RlKSk7CisJCXBBQy0+RGV2aWNlU3RyWzBdID0gJ1wwJzsKKwl9Cit9IC8qIFByb2R1Y3RTdHIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBTdGFydERydkNsZWFudXBUaW1lciAtIFN0YXJ0IHRpbWVyIHRvIGNoZWNrIGZvciBkZXNjcmlwdG9ycyB3aGljaAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZ2h0IGJlIHBsYWNlZCBpbiBkZXNjcmlwdG9yIHJpbmcsIGJ1dAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVudCBiZWVuIGhhbmRsZWQgdXAgdG8gbm93CisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVxdWVzdHMgYSBIVy10aW1lciBmbyB0aGUgWXVrb24gY2FyZC4gVGhlIGFjdGlvbnMgdG8KKyAqICAgICAgcGVyZm9ybSB3aGVuIHRoaXMgdGltZXIgZXhwaXJlcywgYXJlIGxvY2F0ZWQgaW4gdGhlIFNrRHJ2RXZlbnQoKS4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLworc3RhdGljIHZvaWQKK1N0YXJ0RHJ2Q2xlYW51cFRpbWVyKFNLX0FDICpwQUMpIHsKKyAgICBTS19FVlBBUkEgICAgRXZlbnRQYXJhbTsgICAvKiBFdmVudCBzdHJ1Y3QgZm9yIHRpbWVyIGV2ZW50ICovCisKKyAgICBTS19NRU1TRVQoKGNoYXIgKikgJkV2ZW50UGFyYW0sIDAsIHNpemVvZihFdmVudFBhcmFtKSk7CisgICAgRXZlbnRQYXJhbS5QYXJhMzJbMF0gPSBTS19EUlZfUlhfQ0xFQU5VUF9USU1FUjsKKyAgICBTa1RpbWVyU3RhcnQocEFDLCBwQUMtPklvQmFzZSwgJnBBQy0+RHJ2Q2xlYW51cFRpbWVyLAorICAgICAgICAgICAgICAgICBTS19EUlZfUlhfQ0xFQU5VUF9USU1FUl9MRU5HVEgsCisgICAgICAgICAgICAgICAgIFNLR0VfRFJWLCBTS19EUlZfVElNRVIsIEV2ZW50UGFyYW0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIFN0b3BEcnZDbGVhbnVwVGltZXIgLSBTdG9wIHRpbWVyIHRvIGNoZWNrIGZvciBkZXNjcmlwdG9ycworICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlcXVlc3RzIGEgSFctdGltZXIgZm8gdGhlIFl1a29uIGNhcmQuIFRoZSBhY3Rpb25zIHRvCisgKiAgICAgIHBlcmZvcm0gd2hlbiB0aGlzIHRpbWVyIGV4cGlyZXMsIGFyZSBsb2NhdGVkIGluIHRoZSBTa0RydkV2ZW50KCkuCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkCitTdG9wRHJ2Q2xlYW51cFRpbWVyKFNLX0FDICpwQUMpIHsKKyAgICBTa1RpbWVyU3RvcChwQUMsIHBBQy0+SW9CYXNlLCAmcEFDLT5EcnZDbGVhbnVwVGltZXIpOworICAgIFNLX01FTVNFVCgoY2hhciAqKSAmcEFDLT5EcnZDbGVhbnVwVGltZXIsIDAsIHNpemVvZihTS19USU1FUikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGZ1bmN0aW9ucyBmb3IgY29tbW9uIG1vZHVsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tEcnZBbGxvY1JsbXRNYnVmIC0gYWxsb2NhdGUgYW4gUkxNVCBtYnVmCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgcmV0dXJucyBhbiBSTE1UIG1idWYgb3IgTlVMTC4gVGhlIFJMTVQgTWJ1ZiBzdHJ1Y3R1cmUKKyAqCWlzIGVtYmVkZGVkIGludG8gYSBzb2NrZXQgYnVmZiBkYXRhIGFyZWEuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUKKyAqCisgKiBSZXR1cm5zOgorICoJTlVMTCBvciBwb2ludGVyIHRvIE1idWYuCisgKi8KK1NLX01CVUYgKlNrRHJ2QWxsb2NSbG10TWJ1ZigKK1NLX0FDCQkqcEFDLAkJLyogcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkJLyogdGhlIElPLWNvbnRleHQgKi8KK3Vuc2lnbmVkCUJ1ZmZlclNpemUpCS8qIHNpemUgb2YgdGhlIHJlcXVlc3RlZCBidWZmZXIgKi8KK3sKK1NLX01CVUYJCSpwUmxtdE1idWY7CS8qIHBvaW50ZXIgdG8gYSBuZXcgcmxtdC1tYnVmIHN0cnVjdHVyZSAqLworc3RydWN0IHNrX2J1ZmYJKnBNc2dCbG9jazsJLyogcG9pbnRlciB0byBhIG5ldyBtZXNzYWdlIGJsb2NrICovCisKKwlwTXNnQmxvY2sgPSBhbGxvY19za2IoQnVmZmVyU2l6ZSArIHNpemVvZihTS19NQlVGKSwgR0ZQX0FUT01JQyk7CisJaWYgKHBNc2dCbG9jayA9PSBOVUxMKSB7CisJCXJldHVybiAoTlVMTCk7CisJfQorCXBSbG10TWJ1ZiA9IChTS19NQlVGKikgcE1zZ0Jsb2NrLT5kYXRhOworCXNrYl9yZXNlcnZlKHBNc2dCbG9jaywgc2l6ZW9mKFNLX01CVUYpKTsKKwlwUmxtdE1idWYtPnBOZXh0ID0gTlVMTDsKKwlwUmxtdE1idWYtPnBPcyA9IHBNc2dCbG9jazsKKwlwUmxtdE1idWYtPnBEYXRhID0gcE1zZ0Jsb2NrLT5kYXRhOwkvKiBEYXRhIGJ1ZmZlci4gKi8KKwlwUmxtdE1idWYtPlNpemUgPSBCdWZmZXJTaXplOwkJLyogRGF0YSBidWZmZXIgc2l6ZS4gKi8KKwlwUmxtdE1idWYtPkxlbmd0aCA9IDA7CQkvKiBMZW5ndGggb2YgcGFja2V0ICg8PSBTaXplKS4gKi8KKwlyZXR1cm4gKHBSbG10TWJ1Zik7CisKK30gLyogU2tEcnZBbGxvY1JsbXRNYnVmICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tEcnZGcmVlUmxtdE1idWYgLSBmcmVlIGFuIFJMTVQgbWJ1ZgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGZyZWVzIG9uZSBvciBtb3JlIFJMTVQgbWJ1ZihzKS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZQorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK3ZvaWQgIFNrRHJ2RnJlZVJsbXRNYnVmKAorU0tfQUMJCSpwQUMsCQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCQlJb0MsCQkvKiB0aGUgSU8tY29udGV4dCAqLworU0tfTUJVRgkJKnBNYnVmKQkJLyogc2l6ZSBvZiB0aGUgcmVxdWVzdGVkIGJ1ZmZlciAqLworeworU0tfTUJVRgkJKnBGcmVlTWJ1ZjsKK1NLX01CVUYJCSpwTmV4dE1idWY7CisKKwlwRnJlZU1idWYgPSBwTWJ1ZjsKKwlkbyB7CisJCXBOZXh0TWJ1ZiA9IHBGcmVlTWJ1Zi0+cE5leHQ7CisJCURFVl9LRlJFRV9TS0JfQU5ZKHBGcmVlTWJ1Zi0+cE9zKTsKKwkJcEZyZWVNYnVmID0gcE5leHRNYnVmOworCX0gd2hpbGUgKCBwRnJlZU1idWYgIT0gTlVMTCApOworfSAvKiBTa0RydkZyZWVSbG10TWJ1ZiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrT3NHZXRUaW1lIC0gcHJvdmlkZSBhIHRpbWUgdmFsdWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBwcm92aWRlcyBhIHRpbWUgdmFsdWUuIFRoZSB1bml0IGlzIDEvSFogKGRlZmluZWQgYnkgTGludXgpLgorICoJSXQgaXMgbm90IHVzZWQgZm9yIGFic29sdXRlIHRpbWUsIGJ1dCBvbmx5IGZvciB0aW1lIGRpZmZlcmVuY2VzLgorICoKKyAqCisgKiBSZXR1cm5zOgorICoJVGltZSB2YWx1ZQorICovCitTS19VNjQgU2tPc0dldFRpbWUoU0tfQUMgKnBBQykKK3sKKwlTS19VNjQJUHJpdmF0ZUppZmZpZXM7CisJU2tPc0dldFRpbWVDdXJyZW50KHBBQywgJlByaXZhdGVKaWZmaWVzKTsKKwlyZXR1cm4gUHJpdmF0ZUppZmZpZXM7Cit9IC8qIFNrT3NHZXRUaW1lICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tQY2lSZWFkQ2ZnRFdvcmQgLSByZWFkIGEgMzIgYml0IHZhbHVlIGZyb20gcGNpIGNvbmZpZyBzcGFjZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHJlYWRzIGEgMzIgYml0IHZhbHVlIGZyb20gdGhlIHBjaSBjb25maWd1cmF0aW9uCisgKglzcGFjZS4KKyAqCisgKiBSZXR1cm5zOgorICoJMCAtIGluZGljYXRlIGV2ZXJ5dGhpbmcgd29ya2VkIG9rLgorICoJIT0gMCAtIGVycm9yIGluZGljYXRpb24KKyAqLworaW50IFNrUGNpUmVhZENmZ0RXb3JkKAorU0tfQUMgKnBBQywJCS8qIEFkYXB0ZXIgQ29udHJvbCBzdHJ1Y3R1cmUgcG9pbnRlciAqLworaW50IFBjaUFkZHIsCQkvKiBQQ0kgcmVnaXN0ZXIgYWRkcmVzcyAqLworU0tfVTMyICpwVmFsKQkJLyogcG9pbnRlciB0byBzdG9yZSB0aGUgcmVhZCB2YWx1ZSAqLworeworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwQUMtPlBjaURldiwgUGNpQWRkciwgcFZhbCk7CisJcmV0dXJuKDApOworfSAvKiBTa1BjaVJlYWRDZmdEV29yZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUGNpUmVhZENmZ1dvcmQgLSByZWFkIGEgMTYgYml0IHZhbHVlIGZyb20gcGNpIGNvbmZpZyBzcGFjZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHJlYWRzIGEgMTYgYml0IHZhbHVlIGZyb20gdGhlIHBjaSBjb25maWd1cmF0aW9uCisgKglzcGFjZS4KKyAqCisgKiBSZXR1cm5zOgorICoJMCAtIGluZGljYXRlIGV2ZXJ5dGhpbmcgd29ya2VkIG9rLgorICoJIT0gMCAtIGVycm9yIGluZGljYXRpb24KKyAqLworaW50IFNrUGNpUmVhZENmZ1dvcmQoCitTS19BQyAqcEFDLAkvKiBBZGFwdGVyIENvbnRyb2wgc3RydWN0dXJlIHBvaW50ZXIgKi8KK2ludCBQY2lBZGRyLAkJLyogUENJIHJlZ2lzdGVyIGFkZHJlc3MgKi8KK1NLX1UxNiAqcFZhbCkJCS8qIHBvaW50ZXIgdG8gc3RvcmUgdGhlIHJlYWQgdmFsdWUgKi8KK3sKKwlwY2lfcmVhZF9jb25maWdfd29yZChwQUMtPlBjaURldiwgUGNpQWRkciwgcFZhbCk7CisJcmV0dXJuKDApOworfSAvKiBTa1BjaVJlYWRDZmdXb3JkICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tQY2lSZWFkQ2ZnQnl0ZSAtIHJlYWQgYSA4IGJpdCB2YWx1ZSBmcm9tIHBjaSBjb25maWcgc3BhY2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSByZWFkcyBhIDggYml0IHZhbHVlIGZyb20gdGhlIHBjaSBjb25maWd1cmF0aW9uCisgKglzcGFjZS4KKyAqCisgKiBSZXR1cm5zOgorICoJMCAtIGluZGljYXRlIGV2ZXJ5dGhpbmcgd29ya2VkIG9rLgorICoJIT0gMCAtIGVycm9yIGluZGljYXRpb24KKyAqLworaW50IFNrUGNpUmVhZENmZ0J5dGUoCitTS19BQyAqcEFDLAkvKiBBZGFwdGVyIENvbnRyb2wgc3RydWN0dXJlIHBvaW50ZXIgKi8KK2ludCBQY2lBZGRyLAkJLyogUENJIHJlZ2lzdGVyIGFkZHJlc3MgKi8KK1NLX1U4ICpwVmFsKQkJLyogcG9pbnRlciB0byBzdG9yZSB0aGUgcmVhZCB2YWx1ZSAqLworeworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBBQy0+UGNpRGV2LCBQY2lBZGRyLCBwVmFsKTsKKwlyZXR1cm4oMCk7Cit9IC8qIFNrUGNpUmVhZENmZ0J5dGUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1BjaVdyaXRlQ2ZnRFdvcmQgLSB3cml0ZSBhIDMyIGJpdCB2YWx1ZSB0byBwY2kgY29uZmlnIHNwYWNlCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgd3JpdGVzIGEgMzIgYml0IHZhbHVlIHRvIHRoZSBwY2kgY29uZmlndXJhdGlvbgorICoJc3BhY2UuCisgKgorICogUmV0dXJuczoKKyAqCTAgLSBpbmRpY2F0ZSBldmVyeXRoaW5nIHdvcmtlZCBvay4KKyAqCSE9IDAgLSBlcnJvciBpbmRpY2F0aW9uCisgKi8KK2ludCBTa1BjaVdyaXRlQ2ZnRFdvcmQoCitTS19BQyAqcEFDLAkvKiBBZGFwdGVyIENvbnRyb2wgc3RydWN0dXJlIHBvaW50ZXIgKi8KK2ludCBQY2lBZGRyLAkJLyogUENJIHJlZ2lzdGVyIGFkZHJlc3MgKi8KK1NLX1UzMiBWYWwpCQkvKiBwb2ludGVyIHRvIHN0b3JlIHRoZSByZWFkIHZhbHVlICovCit7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwQUMtPlBjaURldiwgUGNpQWRkciwgVmFsKTsKKwlyZXR1cm4oMCk7Cit9IC8qIFNrUGNpV3JpdGVDZmdEV29yZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUGNpV3JpdGVDZmdXb3JkIC0gd3JpdGUgYSAxNiBiaXQgdmFsdWUgdG8gcGNpIGNvbmZpZyBzcGFjZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHdyaXRlcyBhIDE2IGJpdCB2YWx1ZSB0byB0aGUgcGNpIGNvbmZpZ3VyYXRpb24KKyAqCXNwYWNlLiBUaGUgZmxhZyBQY2lDb25maWdVcCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY29uZmlnIHNwYWNlCisgKglpcyBhY2Nlc2libGUgb3IgbXVzdCBiZSBzZXQgdXAgZmlyc3QuCisgKgorICogUmV0dXJuczoKKyAqCTAgLSBpbmRpY2F0ZSBldmVyeXRoaW5nIHdvcmtlZCBvay4KKyAqCSE9IDAgLSBlcnJvciBpbmRpY2F0aW9uCisgKi8KK2ludCBTa1BjaVdyaXRlQ2ZnV29yZCgKK1NLX0FDICpwQUMsCS8qIEFkYXB0ZXIgQ29udHJvbCBzdHJ1Y3R1cmUgcG9pbnRlciAqLworaW50IFBjaUFkZHIsCQkvKiBQQ0kgcmVnaXN0ZXIgYWRkcmVzcyAqLworU0tfVTE2IFZhbCkJCS8qIHBvaW50ZXIgdG8gc3RvcmUgdGhlIHJlYWQgdmFsdWUgKi8KK3sKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocEFDLT5QY2lEZXYsIFBjaUFkZHIsIFZhbCk7CisJcmV0dXJuKDApOworfSAvKiBTa1BjaVdyaXRlQ2ZnV29yZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUGNpV3JpdGVDZmdXb3JkIC0gd3JpdGUgYSA4IGJpdCB2YWx1ZSB0byBwY2kgY29uZmlnIHNwYWNlCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgd3JpdGVzIGEgOCBiaXQgdmFsdWUgdG8gdGhlIHBjaSBjb25maWd1cmF0aW9uCisgKglzcGFjZS4gVGhlIGZsYWcgUGNpQ29uZmlnVXAgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbmZpZyBzcGFjZQorICoJaXMgYWNjZXNpYmxlIG9yIG11c3QgYmUgc2V0IHVwIGZpcnN0LgorICoKKyAqIFJldHVybnM6CisgKgkwIC0gaW5kaWNhdGUgZXZlcnl0aGluZyB3b3JrZWQgb2suCisgKgkhPSAwIC0gZXJyb3IgaW5kaWNhdGlvbgorICovCitpbnQgU2tQY2lXcml0ZUNmZ0J5dGUoCitTS19BQyAqcEFDLAkvKiBBZGFwdGVyIENvbnRyb2wgc3RydWN0dXJlIHBvaW50ZXIgKi8KK2ludCBQY2lBZGRyLAkJLyogUENJIHJlZ2lzdGVyIGFkZHJlc3MgKi8KK1NLX1U4IFZhbCkJCS8qIHBvaW50ZXIgdG8gc3RvcmUgdGhlIHJlYWQgdmFsdWUgKi8KK3sKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocEFDLT5QY2lEZXYsIFBjaUFkZHIsIFZhbCk7CisJcmV0dXJuKDApOworfSAvKiBTa1BjaVdyaXRlQ2ZnQnl0ZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrRHJ2RXZlbnQgLSBoYW5kbGUgZHJpdmVyIGV2ZW50cworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGV2ZW50cyBmcm9tIGFsbCBtb2R1bGVzIGRpcmVjdGVkIHRvIHRoZSBkcml2ZXIKKyAqCisgKiBDb250ZXh0OgorICoJSXMgY2FsbGVkIHVuZGVyIHByb3RlY3Rpb24gb2Ygc2xvdyBwYXRoIGxvY2suCisgKgorICogUmV0dXJuczoKKyAqCTAgaWYgZXZlcnl0aGluZyBvaworICoJPCAwICBvbiBlcnJvcgorICoJCisgKi8KK2ludCBTa0RydkV2ZW50KAorU0tfQUMgKnBBQywJCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogaW8tY29udGV4dCAqLworU0tfVTMyIEV2ZW50LAkJLyogZXZlbnQtaWQgKi8KK1NLX0VWUEFSQSBQYXJhbSkJLyogZXZlbnQtcGFyYW1ldGVyICovCit7CitTS19NQlVGCQkqcFJsbXRNYnVmOwkvKiBwb2ludGVyIHRvIGEgcmxtdC1tYnVmIHN0cnVjdHVyZSAqLworc3RydWN0IHNrX2J1ZmYJKnBNc2c7CQkvKiBwb2ludGVyIHRvIGEgbWVzc2FnZSBibG9jayAqLworaW50CQlGcm9tUG9ydDsJLyogdGhlIHBvcnQgZnJvbSB3aGljaCB3ZSBzd2l0Y2ggYXdheSAqLworaW50CQlUb1BvcnQ7CQkvKiB0aGUgcG9ydCB3ZSBzd2l0Y2ggdG8gKi8KK1NLX0VWUEFSQQlOZXdQYXJhOwkvKiBwYXJhbWV0ZXIgZm9yIGZ1cnRoZXIgZXZlbnRzICovCitpbnQJCVN0YXQ7Cit1bnNpZ25lZCBsb25nCUZsYWdzOworU0tfQk9PTAkJRHVhbE5ldDsKKworCXN3aXRjaCAoRXZlbnQpIHsKKwljYXNlIFNLX0RSVl9BREFQX0ZBSUw6CisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FVkVOVCwKKwkJCSgiQURBUFRFUiBGQUlMIEVWRU5UXG4iKSk7CisJCXByaW50aygiJXM6IEFkYXB0ZXIgZmFpbGVkLlxuIiwgcEFDLT5kZXZbMF0tPm5hbWUpOworCQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwkJU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIEIwX0lNU0ssIDApOworCQkvKiBjZ29vcyAqLworCQlicmVhazsKKwljYXNlIFNLX0RSVl9QT1JUX0ZBSUw6CisJCUZyb21Qb3J0ID0gUGFyYW0uUGFyYTMyWzBdOworCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRVZFTlQsCisJCQkoIlBPUlQgRkFJTCBFVkVOVCwgUG9ydDogJWRcbiIsIEZyb21Qb3J0KSk7CisJCWlmIChGcm9tUG9ydCA9PSAwKSB7CisJCQlwcmludGsoIiVzOiBQb3J0IEEgZmFpbGVkLlxuIiwgcEFDLT5kZXZbMF0tPm5hbWUpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCIlczogUG9ydCBCIGZhaWxlZC5cbiIsIHBBQy0+ZGV2WzFdLT5uYW1lKTsKKwkJfQorCQkvKiBjZ29vcyAqLworCQlicmVhazsKKwljYXNlIFNLX0RSVl9QT1JUX1JFU0VUOgkgLyogU0tfVTMyIFBvcnRJZHggKi8KKwkJLyogYWN0aW9uIGxpc3QgNCAqLworCQlGcm9tUG9ydCA9IFBhcmFtLlBhcmEzMlswXTsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VWRU5ULAorCQkJKCJQT1JUIFJFU0VUIEVWRU5ULCBQb3J0OiAlZCAiLCBGcm9tUG9ydCkpOworCQlOZXdQYXJhLlBhcmE2NCA9IEZyb21Qb3J0OworCQlTa1BubWlFdmVudChwQUMsIElvQywgU0tfUE5NSV9FVlRfWE1BQ19SRVNFVCwgTmV3UGFyYSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKAorCQkJJnBBQy0+VHhQb3J0W0Zyb21Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jaywKKwkJCUZsYWdzKTsKKworCQlTa0dlU3RvcFBvcnQocEFDLCBJb0MsIEZyb21Qb3J0LCBTS19TVE9QX0FMTCwgU0tfSEFSRF9SU1QpOworCQlwQUMtPmRldltQYXJhbS5QYXJhMzJbMF1dLT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCisJCQkmcEFDLT5UeFBvcnRbRnJvbVBvcnRdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrLAorCQkJRmxhZ3MpOworCQkKKwkJLyogY2xlYXIgcnggcmluZyBmcm9tIHJlY2VpdmVkIGZyYW1lcyAqLworCQlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0W0Zyb21Qb3J0XSwgU0tfRkFMU0UpOworCQkKKwkJQ2xlYXJUeFJpbmcocEFDLCAmcEFDLT5UeFBvcnRbRnJvbVBvcnRdW1RYX1BSSU9fTE9XXSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKAorCQkJJnBBQy0+VHhQb3J0W0Zyb21Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jaywKKwkJCUZsYWdzKTsKKwkJCisJCS8qIHRzY2hpbGxpbmc6IEhhbmRsaW5nIG9mIHJldHVybiB2YWx1ZSBpbnNlcnRlZC4gKi8KKwkJaWYgKFNrR2VJbml0UG9ydChwQUMsIElvQywgRnJvbVBvcnQpKSB7CisJCQlpZiAoRnJvbVBvcnQgPT0gMCkgeworCQkJCXByaW50aygiJXM6IFNrR2VJbml0UG9ydCBBIGZhaWxlZC5cbiIsIHBBQy0+ZGV2WzBdLT5uYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKCIlczogU2tHZUluaXRQb3J0IEIgZmFpbGVkLlxuIiwgcEFDLT5kZXZbMV0tPm5hbWUpOworCQkJfQorCQl9CisJCVNrQWRkck1jVXBkYXRlKHBBQyxJb0MsIEZyb21Qb3J0KTsKKwkJUG9ydFJlSW5pdEJtdShwQUMsIEZyb21Qb3J0KTsKKwkJU2tHZVBvbGxUeEQocEFDLCBJb0MsIEZyb21Qb3J0LCBTS19UUlVFKTsKKwkJQ2xlYXJBbmRTdGFydFJ4KHBBQywgRnJvbVBvcnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAorCQkJJnBBQy0+VHhQb3J0W0Zyb21Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jaywKKwkJCUZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBTS19EUlZfTkVUX1VQOgkgLyogU0tfVTMyIFBvcnRJZHggKi8KKwkJLyogYWN0aW9uIGxpc3QgNSAqLworCQlGcm9tUG9ydCA9IFBhcmFtLlBhcmEzMlswXTsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VWRU5ULAorCQkJKCJORVQgVVAgRVZFTlQsIFBvcnQ6ICVkICIsIFBhcmFtLlBhcmEzMlswXSkpOworCQkvKiBNYWMgdXBkYXRlICovCisJCVNrQWRkck1jVXBkYXRlKHBBQyxJb0MsIEZyb21Qb3J0KTsKKworCQlpZiAoRG9QcmludEludGVyZmFjZUNoYW5nZSkgeworCQlwcmludGsoIiVzOiBuZXR3b3JrIGNvbm5lY3Rpb24gdXAgdXNpbmciCisJCQkiIHBvcnQgJWNcbiIsIHBBQy0+ZGV2W1BhcmFtLlBhcmEzMlswXV0tPm5hbWUsICdBJytQYXJhbS5QYXJhMzJbMF0pOworCisJCS8qIHRzY2hpbGxpbmc6IFZhbHVlcyBjaGFuZ2VkIGFjY29yZGluZyB0byBMaW5rU3BlZWRVc2VkLiAqLworCQlTdGF0ID0gcEFDLT5HSW5pLkdQW0Zyb21Qb3J0XS5QTGlua1NwZWVkVXNlZDsKKwkJaWYgKFN0YXQgPT0gU0tfTFNQRUVEX1NUQVRfMTBNQlBTKSB7CisJCQlwcmludGsoIiAgICBzcGVlZDogICAgICAgICAgIDEwXG4iKTsKKwkJfSBlbHNlIGlmIChTdGF0ID09IFNLX0xTUEVFRF9TVEFUXzEwME1CUFMpIHsKKwkJCXByaW50aygiICAgIHNwZWVkOiAgICAgICAgICAgMTAwXG4iKTsKKwkJfSBlbHNlIGlmIChTdGF0ID09IFNLX0xTUEVFRF9TVEFUXzEwMDBNQlBTKSB7CisJCQlwcmludGsoIiAgICBzcGVlZDogICAgICAgICAgIDEwMDBcbiIpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCIgICAgc3BlZWQ6ICAgICAgICAgICB1bmtub3duXG4iKTsKKwkJfQorCisKKwkJU3RhdCA9IHBBQy0+R0luaS5HUFtGcm9tUG9ydF0uUExpbmtNb2RlU3RhdHVzOworCQlpZiAoU3RhdCA9PSBTS19MTU9ERV9TVEFUX0FVVE9IQUxGIHx8CisJCQlTdGF0ID09IFNLX0xNT0RFX1NUQVRfQVVUT0ZVTEwpIHsKKwkJCXByaW50aygiICAgIGF1dG9uZWdvdGlhdGlvbjogeWVzXG4iKTsKKwkJfQorCQllbHNlIHsKKwkJCXByaW50aygiICAgIGF1dG9uZWdvdGlhdGlvbjogbm9cbiIpOworCQl9CisJCWlmIChTdGF0ID09IFNLX0xNT0RFX1NUQVRfQVVUT0hBTEYgfHwKKwkJCVN0YXQgPT0gU0tfTE1PREVfU1RBVF9IQUxGKSB7CisJCQlwcmludGsoIiAgICBkdXBsZXggbW9kZTogICAgIGhhbGZcbiIpOworCQl9CisJCWVsc2UgeworCQkJcHJpbnRrKCIgICAgZHVwbGV4IG1vZGU6ICAgICBmdWxsXG4iKTsKKwkJfQorCQlTdGF0ID0gcEFDLT5HSW5pLkdQW0Zyb21Qb3J0XS5QRmxvd0N0cmxTdGF0dXM7CisJCWlmIChTdGF0ID09IFNLX0ZMT1dfU1RBVF9SRU1fU0VORCApIHsKKwkJCXByaW50aygiICAgIGZsb3djdHJsOiAgICAgICAgcmVtb3RlIHNlbmRcbiIpOworCQl9CisJCWVsc2UgaWYgKFN0YXQgPT0gU0tfRkxPV19TVEFUX0xPQ19TRU5EICl7CisJCQlwcmludGsoIiAgICBmbG93Y3RybDogICAgICAgIGxvY2FsIHNlbmRcbiIpOworCQl9CisJCWVsc2UgaWYgKFN0YXQgPT0gU0tfRkxPV19TVEFUX1NZTU1FVFJJQyApeworCQkJcHJpbnRrKCIgICAgZmxvd2N0cmw6ICAgICAgICBzeW1tZXRyaWNcbiIpOworCQl9CisJCWVsc2UgeworCQkJcHJpbnRrKCIgICAgZmxvd2N0cmw6ICAgICAgICBub25lXG4iKTsKKwkJfQorCQkKKwkJLyogdHNjaGlsbGluZzogQ2hlY2sgYWdhaW5zdCBDb3BwZXJUeXBlIG5vdy4gKi8KKwkJaWYgKChwQUMtPkdJbmkuR0lDb3BwZXJUeXBlID09IFNLX1RSVUUpICYmCisJCQkocEFDLT5HSW5pLkdQW0Zyb21Qb3J0XS5QTGlua1NwZWVkVXNlZCA9PQorCQkJU0tfTFNQRUVEX1NUQVRfMTAwME1CUFMpKSB7CisJCQlTdGF0ID0gcEFDLT5HSW5pLkdQW0Zyb21Qb3J0XS5QTVNTdGF0dXM7CisJCQlpZiAoU3RhdCA9PSBTS19NU19TVEFUX01BU1RFUiApIHsKKwkJCQlwcmludGsoIiAgICByb2xlOiAgICAgICAgICAgIG1hc3RlclxuIik7CisJCQl9CisJCQllbHNlIGlmIChTdGF0ID09IFNLX01TX1NUQVRfU0xBVkUgKSB7CisJCQkJcHJpbnRrKCIgICAgcm9sZTogICAgICAgICAgICBzbGF2ZVxuIik7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwcmludGsoIiAgICByb2xlOiAgICAgICAgICAgID8/P1xuIik7CisJCQl9CisJCX0KKworCQkvKiAKKwkJICAgRGlzcGxheSBkaW0gKGR5bmFtaWMgaW50ZXJydXB0IG1vZGVyYXRpb24pIAorCQkgICBpbmZvcm1hdGlvbnMKKwkJICovCisJCWlmIChwQUMtPkR5bklycU1vZEluZm8uSW50TW9kVHlwZVNlbGVjdCA9PSBDX0lOVF9NT0RfU1RBVElDKQorCQkJcHJpbnRrKCIgICAgaXJxIG1vZGVyYXRpb246ICBzdGF0aWMgKCVkIGludHMvc2VjKVxuIiwKKwkJCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1heE1vZEludHNQZXJTZWMpOworCQllbHNlIGlmIChwQUMtPkR5bklycU1vZEluZm8uSW50TW9kVHlwZVNlbGVjdCA9PSBDX0lOVF9NT0RfRFlOQU1JQykKKwkJCXByaW50aygiICAgIGlycSBtb2RlcmF0aW9uOiAgZHluYW1pYyAoJWQgaW50cy9zZWMpXG4iLAorCQkJCQlwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyk7CisJCWVsc2UKKwkJCXByaW50aygiICAgIGlycSBtb2RlcmF0aW9uOiAgZGlzYWJsZWRcbiIpOworCisKKyNpZmRlZiBTS19aRVJPQ09QWQorCQlpZiAocEFDLT5DaGlwc2V0VHlwZSkKKyNpZmRlZiBVU0VfU0tfVFhfQ0hFQ0tTVU0KKwkJCXByaW50aygiICAgIHNjYXR0ZXItZ2F0aGVyOiAgZW5hYmxlZFxuIik7CisjZWxzZQorCQkJcHJpbnRrKCIgICAgdHgtY2hlY2tzdW06ICAgICBkaXNhYmxlZFxuIik7CisjZW5kaWYKKwkJZWxzZQorCQkJcHJpbnRrKCIgICAgc2NhdHRlci1nYXRoZXI6ICBkaXNhYmxlZFxuIik7CisjZWxzZQorCQkJcHJpbnRrKCIgICAgc2NhdHRlci1nYXRoZXI6ICBkaXNhYmxlZFxuIik7CisjZW5kaWYKKworI2lmbmRlZiBVU0VfU0tfUlhfQ0hFQ0tTVU0KKwkJCXByaW50aygiICAgIHJ4LWNoZWNrc3VtOiAgICAgZGlzYWJsZWRcbiIpOworI2VuZGlmCisKKwkJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERvUHJpbnRJbnRlcmZhY2VDaGFuZ2UgPSBTS19UUlVFOworICAgICAgICAgICAgICAgIH0KKwkKKwkJaWYgKChQYXJhbS5QYXJhMzJbMF0gIT0gcEFDLT5BY3RpdmVQb3J0KSAmJgorCQkJKHBBQy0+UmxtdE5ldHMgPT0gMSkpIHsKKwkJCU5ld1BhcmEuUGFyYTMyWzBdID0gcEFDLT5BY3RpdmVQb3J0OworCQkJTmV3UGFyYS5QYXJhMzJbMV0gPSBQYXJhbS5QYXJhMzJbMF07CisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1NXSVRDSF9JTlRFUk4sCisJCQkJTmV3UGFyYSk7CisJCX0KKworCQkvKiBJbmZvcm0gdGhlIHdvcmxkIHRoYXQgbGluayBwcm90b2NvbCBpcyB1cC4gKi8KKwkJcEFDLT5kZXZbUGFyYW0uUGFyYTMyWzBdXS0+ZmxhZ3MgfD0gSUZGX1JVTk5JTkc7CisKKwkJYnJlYWs7CisJY2FzZSBTS19EUlZfTkVUX0RPV046CSAvKiBTS19VMzIgUmVhc29uICovCisJCS8qIGFjdGlvbiBsaXN0IDcgKi8KKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VWRU5ULAorCQkJKCJORVQgRE9XTiBFVkVOVCAiKSk7CisJCWlmIChEb1ByaW50SW50ZXJmYWNlQ2hhbmdlKSB7CisJCQlwcmludGsoIiVzOiBuZXR3b3JrIGNvbm5lY3Rpb24gZG93blxuIiwgCisJCQkJcEFDLT5kZXZbUGFyYW0uUGFyYTMyWzFdXS0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQlEb1ByaW50SW50ZXJmYWNlQ2hhbmdlID0gU0tfVFJVRTsKKwkJfQorCQlwQUMtPmRldltQYXJhbS5QYXJhMzJbMV1dLT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7CisJCWJyZWFrOworCWNhc2UgU0tfRFJWX1NXSVRDSF9IQVJEOiAvKiBTS19VMzIgRnJvbVBvcnRJZHggU0tfVTMyIFRvUG9ydElkeCAqLworCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRVZFTlQsCisJCQkoIlBPUlQgU1dJVENIIEhBUkQgIikpOworCWNhc2UgU0tfRFJWX1NXSVRDSF9TT0ZUOiAvKiBTS19VMzIgRnJvbVBvcnRJZHggU0tfVTMyIFRvUG9ydElkeCAqLworCS8qIGFjdGlvbiBsaXN0IDYgKi8KKwkJcHJpbnRrKCIlczogc3dpdGNoaW5nIHRvIHBvcnQgJWNcbiIsIHBBQy0+ZGV2WzBdLT5uYW1lLAorCQkJJ0EnK1BhcmFtLlBhcmEzMlsxXSk7CisJY2FzZSBTS19EUlZfU1dJVENIX0lOVEVSTjogLyogU0tfVTMyIEZyb21Qb3J0SWR4IFNLX1UzMiBUb1BvcnRJZHggKi8KKwkJRnJvbVBvcnQgPSBQYXJhbS5QYXJhMzJbMF07CisJCVRvUG9ydCA9IFBhcmFtLlBhcmEzMlsxXTsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VWRU5ULAorCQkJKCJQT1JUIFNXSVRDSCBFVkVOVCwgRnJvbTogJWQgIFRvOiAlZCAoUHJlZiAlZCkgIiwKKwkJCUZyb21Qb3J0LCBUb1BvcnQsIHBBQy0+UmxtdC5OZXRbMF0uUHJlZlBvcnQpKTsKKwkJTmV3UGFyYS5QYXJhNjQgPSBGcm9tUG9ydDsKKwkJU2tQbm1pRXZlbnQocEFDLCBJb0MsIFNLX1BOTUlfRVZUX1hNQUNfUkVTRVQsIE5ld1BhcmEpOworCQlOZXdQYXJhLlBhcmE2NCA9IFRvUG9ydDsKKwkJU2tQbm1pRXZlbnQocEFDLCBJb0MsIFNLX1BOTUlfRVZUX1hNQUNfUkVTRVQsIE5ld1BhcmEpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgKKwkJCSZwQUMtPlR4UG9ydFtGcm9tUG9ydF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2ssCisJCQlGbGFncyk7CisJCXNwaW5fbG9jaygmcEFDLT5UeFBvcnRbVG9Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jayk7CisJCVNrR2VTdG9wUG9ydChwQUMsIElvQywgRnJvbVBvcnQsIFNLX1NUT1BfQUxMLCBTS19TT0ZUX1JTVCk7CisJCVNrR2VTdG9wUG9ydChwQUMsIElvQywgVG9Qb3J0LCBTS19TVE9QX0FMTCwgU0tfU09GVF9SU1QpOworCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbVG9Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCisJCQkmcEFDLT5UeFBvcnRbRnJvbVBvcnRdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrLAorCQkJRmxhZ3MpOworCisJCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbRnJvbVBvcnRdLCBTS19GQUxTRSk7IC8qIGNsZWFycyByeCByaW5nICovCisJCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbVG9Qb3J0XSwgU0tfRkFMU0UpOyAvKiBjbGVhcnMgcnggcmluZyAqLworCQkKKwkJQ2xlYXJUeFJpbmcocEFDLCAmcEFDLT5UeFBvcnRbRnJvbVBvcnRdW1RYX1BSSU9fTE9XXSk7CisJCUNsZWFyVHhSaW5nKHBBQywgJnBBQy0+VHhQb3J0W1RvUG9ydF1bVFhfUFJJT19MT1ddKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoCisJCQkmcEFDLT5UeFBvcnRbRnJvbVBvcnRdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrLAorCQkJRmxhZ3MpOworCQlzcGluX2xvY2soJnBBQy0+VHhQb3J0W1RvUG9ydF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2spOworCQlwQUMtPkFjdGl2ZVBvcnQgPSBUb1BvcnQ7CisjaWYgMAorCQlTZXRRdWV1ZVNpemVzKHBBQyk7CisjZWxzZQorCQkvKiB0c2NoaWxsaW5nOiBOZXcgY29tbW9uIGZ1bmN0aW9uIHdpdGggbWluaW11bSBzaXplIGNoZWNrLiAqLworCQlEdWFsTmV0ID0gU0tfRkFMU0U7CisJCWlmIChwQUMtPlJsbXROZXRzID09IDIpIHsKKwkJCUR1YWxOZXQgPSBTS19UUlVFOworCQl9CisJCQorCQlpZiAoU2tHZUluaXRBc3NpZ25SYW1Ub1F1ZXVlcygKKwkJCXBBQywKKwkJCXBBQy0+QWN0aXZlUG9ydCwKKwkJCUR1YWxOZXQpKSB7CisJCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbVG9Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAorCQkJCSZwQUMtPlR4UG9ydFtGcm9tUG9ydF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2ssCisJCQkJRmxhZ3MpOworCQkJcHJpbnRrKCJTa0dlSW5pdEFzc2lnblJhbVRvUXVldWVzIGZhaWxlZC5cbiIpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQkvKiB0c2NoaWxsaW5nOiBIYW5kbGluZyBvZiByZXR1cm4gdmFsdWVzIGluc2VydGVkLiAqLworCQlpZiAoU2tHZUluaXRQb3J0KHBBQywgSW9DLCBGcm9tUG9ydCkgfHwKKwkJCVNrR2VJbml0UG9ydChwQUMsIElvQywgVG9Qb3J0KSkgeworCQkJcHJpbnRrKCIlczogU2tHZUluaXRQb3J0IGZhaWxlZC5cbiIsIHBBQy0+ZGV2WzBdLT5uYW1lKTsKKwkJfQorCQlpZiAoRXZlbnQgPT0gU0tfRFJWX1NXSVRDSF9TT0ZUKSB7CisJCQlTa01hY1J4VHhFbmFibGUocEFDLCBJb0MsIEZyb21Qb3J0KTsKKwkJfQorCQlTa01hY1J4VHhFbmFibGUocEFDLCBJb0MsIFRvUG9ydCk7CisJCVNrQWRkclN3YXAocEFDLCBJb0MsIEZyb21Qb3J0LCBUb1BvcnQpOworCQlTa0FkZHJNY1VwZGF0ZShwQUMsIElvQywgRnJvbVBvcnQpOworCQlTa0FkZHJNY1VwZGF0ZShwQUMsIElvQywgVG9Qb3J0KTsKKwkJUG9ydFJlSW5pdEJtdShwQUMsIEZyb21Qb3J0KTsKKwkJUG9ydFJlSW5pdEJtdShwQUMsIFRvUG9ydCk7CisJCVNrR2VQb2xsVHhEKHBBQywgSW9DLCBGcm9tUG9ydCwgU0tfVFJVRSk7CisJCVNrR2VQb2xsVHhEKHBBQywgSW9DLCBUb1BvcnQsIFNLX1RSVUUpOworCQlDbGVhckFuZFN0YXJ0UngocEFDLCBGcm9tUG9ydCk7CisJCUNsZWFyQW5kU3RhcnRSeChwQUMsIFRvUG9ydCk7CisJCXNwaW5fdW5sb2NrKCZwQUMtPlR4UG9ydFtUb1BvcnRdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKKwkJCSZwQUMtPlR4UG9ydFtGcm9tUG9ydF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2ssCisJCQlGbGFncyk7CisJCWJyZWFrOworCWNhc2UgU0tfRFJWX1JMTVRfU0VORDoJIC8qIFNLX01CVUYgKnBNYiAqLworCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRVZFTlQsCisJCQkoIlJMUyAiKSk7CisJCXBSbG10TWJ1ZiA9IChTS19NQlVGKikgUGFyYW0ucFBhcmFQdHI7CisJCXBNc2cgPSAoc3RydWN0IHNrX2J1ZmYqKSBwUmxtdE1idWYtPnBPczsKKwkJc2tiX3B1dChwTXNnLCBwUmxtdE1idWYtPkxlbmd0aCk7CisJCWlmIChYbWl0RnJhbWUocEFDLCAmcEFDLT5UeFBvcnRbcFJsbXRNYnVmLT5Qb3J0SWR4XVtUWF9QUklPX0xPV10sCisJCQlwTXNnKSA8IDApCisKKwkJCURFVl9LRlJFRV9TS0JfQU5ZKHBNc2cpOworCQlicmVhazsKKwljYXNlIFNLX0RSVl9USU1FUjoKKwkJaWYgKFBhcmFtLlBhcmEzMlswXSA9PSBTS19EUlZfTU9ERVJBVElPTl9USU1FUikgeworCQkJLyoKKwkJCSoqIGV4cGlyYXRpb24gb2YgdGhlIG1vZGVyYXRpb24gdGltZXIgaW1wbGllcyB0aGF0CisJCQkqKiBkeW5hbWljIG1vZGVyYXRpb24gaXMgdG8gYmUgYXBwbGllZAorCQkJKi8KKwkJCVNrRGltU3RhcnRNb2RlcmF0aW9uVGltZXIocEFDKTsKKwkJCVNrRGltTW9kZXJhdGUocEFDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQUMtPkR5bklycU1vZEluZm8uRGlzcGxheVN0YXRzKSB7CisJCQkgICAgU2tEaW1EaXNwbGF5TW9kZXJhdGlvblNldHRpbmdzKHBBQyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQYXJhbS5QYXJhMzJbMF0gPT0gU0tfRFJWX1JYX0NMRUFOVVBfVElNRVIpIHsKKwkJCS8qCisJCQkqKiBjaGVjayBpZiB3ZSBuZWVkIHRvIGNoZWNrIGZvciBkZXNjcmlwdG9ycyB3aGljaAorCQkJKiogaGF2ZW4ndCBiZWVuIGhhbmRsZWQgdGhlIGxhc3QgbWlsbGlzZWNzCisJCQkqLworCQkJU3RhcnREcnZDbGVhbnVwVGltZXIocEFDKTsKKwkJCWlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMikgeworCQkJCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbMV0sIFNLX0ZBTFNFKTsKKwkJCX0KKwkJCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbMF0sIFNLX0ZBTFNFKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiRXhwaXJhdGlvbiBvZiB1bmtub3duIHRpbWVyXG4iKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VWRU5ULAorCQkoIkVORCBFVkVOVCAiKSk7CisJCisJcmV0dXJuICgwKTsKK30gLyogU2tEcnZFdmVudCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrRXJyb3JMb2cgLSBsb2cgZXJyb3JzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGxvZ3MgZXJyb3JzIHRvIHRoZSBzeXN0ZW0gYnVmZmVyIGFuZCB0byB0aGUgY29uc29sZQorICoKKyAqIFJldHVybnM6CisgKgkwIGlmIGV2ZXJ5dGhpbmcgb2sKKyAqCTwgMCAgb24gZXJyb3IKKyAqCQorICovCit2b2lkIFNrRXJyb3JMb2coCitTS19BQwkqcEFDLAoraW50CUVyckNsYXNzLAoraW50CUVyck51bSwKK2NoYXIJKnBFcnJvck1zZykKK3sKK2NoYXIJQ2xhc3NTdHJbODBdOworCisJc3dpdGNoIChFcnJDbGFzcykgeworCWNhc2UgU0tfRVJSQ0xfT1RIRVI6CisJCXN0cmNweShDbGFzc1N0ciwgIk90aGVyIGVycm9yIik7CisJCWJyZWFrOworCWNhc2UgU0tfRVJSQ0xfQ09ORklHOgorCQlzdHJjcHkoQ2xhc3NTdHIsICJDb25maWd1cmF0aW9uIGVycm9yIik7CisJCWJyZWFrOworCWNhc2UgU0tfRVJSQ0xfSU5JVDoKKwkJc3RyY3B5KENsYXNzU3RyLCAiSW5pdGlhbGl6YXRpb24gZXJyb3IiKTsKKwkJYnJlYWs7CisJY2FzZSBTS19FUlJDTF9OT1JFUzoKKwkJc3RyY3B5KENsYXNzU3RyLCAiT3V0IG9mIHJlc291cmNlcyBlcnJvciIpOworCQlicmVhazsKKwljYXNlIFNLX0VSUkNMX1NXOgorCQlzdHJjcHkoQ2xhc3NTdHIsICJpbnRlcm5hbCBTb2Z0d2FyZSBlcnJvciIpOworCQlicmVhazsKKwljYXNlIFNLX0VSUkNMX0hXOgorCQlzdHJjcHkoQ2xhc3NTdHIsICJIYXJkd2FyZSBmYWlsdXJlIik7CisJCWJyZWFrOworCWNhc2UgU0tfRVJSQ0xfQ09NTToKKwkJc3RyY3B5KENsYXNzU3RyLCAiQ29tbXVuaWNhdGlvbiBlcnJvciIpOworCQlicmVhazsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IC0tIEVSUk9SIC0tXG4gICAgICAgIENsYXNzOiAgJXNcbiIKKwkJIiAgICAgICAgTnI6ICAweCV4XG4gICAgICAgIE1zZzogICVzXG4iLCBwQUMtPmRldlswXS0+bmFtZSwKKwkJQ2xhc3NTdHIsIEVyck51bSwgcEVycm9yTXNnKTsKKworfSAvKiBTa0Vycm9yTG9nICovCisKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tEcnZFbnRlckRpYWdNb2RlIC0gaGFuZGxlcyBESUFHIGF0dGFjaCByZXF1ZXN0CisgKgorICogRGVzY3JpcHRpb246CisgKglOb3RpZnkgdGhlIGtlcm5lbCB0byBOT1QgYWNjZXNzIHRoZSBjYXJkIGFueSBsb25nZXIgZHVlIHRvIERJQUcKKyAqCURlaW5pdGlhbGl6ZSB0aGUgQ2FyZAorICoKKyAqIFJldHVybnM6CisgKglpbnQKKyAqLworaW50IFNrRHJ2RW50ZXJEaWFnTW9kZSgKK1NLX0FDICAgKnBBYykgICAvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworeworCURFVl9ORVQgKnBOZXQgPSBuZXRkZXZfcHJpdihwQWMtPmRldlswXSk7CisJU0tfQUMgICAqcEFDICA9IHBOZXQtPnBBQzsKKworCVNLX01FTUNQWSgmKHBBYy0+UG5taUJhY2t1cCksICYocEFjLT5Qbm1pU3RydWN0KSwgCisJCQlzaXplb2YoU0tfUE5NSV9TVFJVQ1RfREFUQSkpOworCisJcEFDLT5EaWFnTW9kZUFjdGl2ZSA9IERJQUdfQUNUSVZFOworCWlmIChwQUMtPkJvYXJkTGV2ZWwgPiBTS19JTklUX0RBVEEpIHsKKwkJaWYgKHBOZXQtPlVwKSB7CisJCQlwQUMtPldhc0lmVXBbMF0gPSBTS19UUlVFOworCQkJcEFDLT5EaWFnRmxvd0N0cmwgPSBTS19UUlVFOyAvKiBmb3IgU2tHZUNsb3NlICAgICAgKi8KKwkJCURvUHJpbnRJbnRlcmZhY2VDaGFuZ2UgPSBTS19GQUxTRTsKKwkJCVNrRHJ2RGVJbml0QWRhcHRlcihwQUMsIDApOyAgLyogcGVyZm9ybXMgU2tHZUNsb3NlICovCisJCX0gZWxzZSB7CisJCQlwQUMtPldhc0lmVXBbMF0gPSBTS19GQUxTRTsKKwkJfQorCQlpZiAocE5ldCAhPSBuZXRkZXZfcHJpdihwQUMtPmRldlsxXSkpIHsKKwkJCXBOZXQgPSBuZXRkZXZfcHJpdihwQUMtPmRldlsxXSk7CisJCQlpZiAocE5ldC0+VXApIHsKKwkJCQlwQUMtPldhc0lmVXBbMV0gPSBTS19UUlVFOworCQkJCXBBQy0+RGlhZ0Zsb3dDdHJsID0gU0tfVFJVRTsgLyogZm9yIFNrR2VDbG9zZSAqLworCQkJCURvUHJpbnRJbnRlcmZhY2VDaGFuZ2UgPSBTS19GQUxTRTsKKwkJCQlTa0RydkRlSW5pdEFkYXB0ZXIocEFDLCAxKTsgIC8qIGRvIFNrR2VDbG9zZSAgKi8KKwkJCX0gZWxzZSB7CisJCQkJcEFDLT5XYXNJZlVwWzFdID0gU0tfRkFMU0U7CisJCQl9CisJCX0KKwkJcEFDLT5Cb2FyZExldmVsID0gU0tfSU5JVF9EQVRBOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrRHJ2TGVhdmVEaWFnTW9kZSAtIGhhbmRsZXMgRElBRyBkZXRhY2ggcmVxdWVzdAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJTm90aWZ5IHRoZSBrZXJuZWwgdG8gbWF5IGFjY2VzcyB0aGUgY2FyZCBhZ2FpbiBhZnRlciB1c2UgYnkgRElBRworICoJSW5pdGlhbGl6ZSB0aGUgQ2FyZAorICoKKyAqIFJldHVybnM6CisgKiAJaW50CisgKi8KK2ludCBTa0RydkxlYXZlRGlhZ01vZGUoCitTS19BQyAgICpwQWMpICAgLyogcG9pbnRlciB0byBhZGFwdGVyIGNvbnRyb2wgY29udGV4dCAqLworeyAKKwlTS19NRU1DUFkoJihwQWMtPlBubWlTdHJ1Y3QpLCAmKHBBYy0+UG5taUJhY2t1cCksIAorCQkJc2l6ZW9mKFNLX1BOTUlfU1RSVUNUX0RBVEEpKTsKKwlwQWMtPkRpYWdNb2RlQWN0aXZlICAgID0gRElBR19OT1RBQ1RJVkU7CisJcEFjLT5Qbm1pLkRpYWdBdHRhY2hlZCA9IFNLX0RJQUdfSURMRTsKKyAgICAgICAgaWYgKHBBYy0+V2FzSWZVcFswXSA9PSBTS19UUlVFKSB7CisgICAgICAgICAgICAgICAgcEFjLT5EaWFnRmxvd0N0cmwgPSBTS19UUlVFOyAvKiBmb3IgU2tHZUNsb3NlICovCisJCURvUHJpbnRJbnRlcmZhY2VDaGFuZ2UgPSBTS19GQUxTRTsKKyAgICAgICAgICAgICAgICBTa0RydkluaXRBZGFwdGVyKHBBYywgMCk7ICAgIC8qIGZpcnN0IGRldmljZSAgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAocEFjLT5XYXNJZlVwWzFdID09IFNLX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBwQWMtPkRpYWdGbG93Q3RybCA9IFNLX1RSVUU7IC8qIGZvciBTa0dlQ2xvc2UgKi8KKwkJRG9QcmludEludGVyZmFjZUNoYW5nZSA9IFNLX0ZBTFNFOworICAgICAgICAgICAgICAgIFNrRHJ2SW5pdEFkYXB0ZXIocEFjLCAxKTsgICAgLyogc2Vjb25kIGRldmljZSAqLworICAgICAgICB9CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglQYXJzZURldmljZU5ickZyb21TbG90TmFtZSAtIEV2YWx1YXRlIFBDSSBkZXZpY2UgbnVtYmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiAJVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIFBDSSBzbG90IG5hbWUgaW5mb3JtYXRpb24gc3RyaW5nIGFuZCB3aWxsCisgKglyZXRyaWV2ZSB0aGUgZGV2Y2llIG51bWJlciBvdXQgb2YgaXQuIFRoZSBzbG90X25hbWUgbWFpbnRpYW5lZCBieQorICoJbGludXggaXMgaW4gdGhlIGZvcm0gb2YgJzAyOjBhLjAnLCB3aGVyZWFzIHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyAKKyAqCXJlcHJlc2VudCB0aGUgYnVzIG51bWJlciBpbiBoZXggKGluIHRoZSBzYW1wbGUgYWJvdmUgdGhpcyBpcyAKKyAqCXBjaSBidXMgMHgwMikgYW5kIHRoZSBuZXh0IHR3byBjaGFyYWN0ZXJzIHRoZSBkZXZpY2UgbnVtYmVyICgweDBhKS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfVTMyOiBUaGUgZGV2aWNlIG51bWJlciBmcm9tIHRoZSBQQ0kgc2xvdCBuYW1lCisgKi8gCisKK3N0YXRpYyBTS19VMzIgUGFyc2VEZXZpY2VOYnJGcm9tU2xvdE5hbWUoCitjb25zdCBjaGFyICpTbG90TmFtZSkgICAvKiBwb2ludGVyIHRvIHBjaSBzbG90IG5hbWUgZWcuICcwMjowYS4wJyAqLworeworCWNoYXIJKkN1cnJDaGFyUG9zCT0gKGNoYXIgKikgU2xvdE5hbWU7CisJaW50CUZpcnN0TmliYmxlCT0gLTE7CisJaW50CVNlY29uZE5pYmJsZQk9IC0xOworCVNLX1UzMglSZXN1bHQJCT0gIDA7CisKKwl3aGlsZSAoKkN1cnJDaGFyUG9zICE9ICdcMCcpIHsKKwkJaWYgKCpDdXJyQ2hhclBvcyA9PSAnOicpIHsgCisJCQl3aGlsZSAoKkN1cnJDaGFyUG9zICE9ICcuJykgeworCQkJCUN1cnJDaGFyUG9zKys7ICAKKwkJCQlpZiAoCSgqQ3VyckNoYXJQb3MgPj0gJzAnKSAmJiAKKwkJCQkJKCpDdXJyQ2hhclBvcyA8PSAnOScpKSB7CisJCQkJCWlmIChGaXJzdE5pYmJsZSA9PSAtMSkgeworCQkJCQkJLyogZGVjLiB2YWx1ZSBmb3IgJzAnICovCisJCQkJCQlGaXJzdE5pYmJsZSA9ICpDdXJyQ2hhclBvcyAtIDQ4OworCQkJCQl9IGVsc2UgeworCQkJCQkJU2Vjb25kTmliYmxlID0gKkN1cnJDaGFyUG9zIC0gNDg7CisJCQkJCX0gIAorCQkJCX0gZWxzZSBpZiAoCSgqQ3VyckNoYXJQb3MgPj0gJ2EnKSAmJiAKKwkJCQkJCSgqQ3VyckNoYXJQb3MgPD0gJ2YnKSAgKSB7CisJCQkJCWlmIChGaXJzdE5pYmJsZSA9PSAtMSkgeworCQkJCQkJRmlyc3ROaWJibGUgPSAqQ3VyckNoYXJQb3MgLSA4NzsgCisJCQkJCX0gZWxzZSB7CisJCQkJCQlTZWNvbmROaWJibGUgPSAqQ3VyckNoYXJQb3MgLSA4NzsgCisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlSZXN1bHQgPSAwOworCQkJCX0KKwkJCX0KKworCQkJUmVzdWx0ID0gRmlyc3ROaWJibGU7CisJCQlSZXN1bHQgPSBSZXN1bHQgPDwgNDsgLyogZmlyc3QgbmliYmxlIGlzIGhpZ2hlciBvbmUgKi8KKwkJCVJlc3VsdCA9IFJlc3VsdCB8IFNlY29uZE5pYmJsZTsKKwkJfQorCQlDdXJyQ2hhclBvcysrOyAgIC8qIG5leHQgY2hhcmFjdGVyICovCisJfQorCXJldHVybiAoUmVzdWx0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0RydkRlSW5pdEFkYXB0ZXIgLSBkZWluaXRpYWxpemUgYWRhcHRlciAodGhpcyBmdW5jdGlvbiBpcyBvbmx5IAorICoJCQkJY2FsbGVkIGlmIERpYWcgYXR0YWNoZXMgdG8gdGhhdCBjYXJkKQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQ2xvc2UgaW5pdGlhbGl6ZWQgYWRhcHRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJMCAtIG9uIHN1Y2Nlc3MKKyAqCWVycm9yIGNvZGUgLSBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IFNrRHJ2RGVJbml0QWRhcHRlcigKK1NLX0FDICAgKnBBQywJCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICAgKi8KK2ludCAgICAgIGRldk5icikJLyogd2hhdCBkZXZpY2UgaXMgdG8gYmUgaGFuZGxlZCAqLworeworCXN0cnVjdCBTS19ORVRfREVWSUNFICpkZXY7CisKKwlkZXYgPSBwQUMtPmRldltkZXZOYnJdOworCisJLyogT24gTGludXggMi42IHRoZSBuZXR3b3JrIGRyaXZlciBkb2VzIE5PVCBtZXNzIHdpdGggcmVmZXJlbmNlCisJKiogY291bnRzLiAgVGhlIGRyaXZlciBNVVNUIGJlIGFibGUgdG8gYmUgdW5sb2FkZWQgYXQgYW55IHRpbWUKKwkqKiBkdWUgdG8gdGhlIHBvc3NpYmlsaXR5IG9mIGhvdHBsdWcuCisJKi8KKwlpZiAoU2tHZUNsb3NlKGRldikgIT0gMCkgeworCQlyZXR1cm4gKC0xKTsKKwl9CisJcmV0dXJuICgwKTsKKworfSAvKiBTa0RydkRlSW5pdEFkYXB0ZXIoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrRHJ2SW5pdEFkYXB0ZXIgLSBJbml0aWFsaXplIGFkYXB0ZXIgKHRoaXMgZnVuY3Rpb24gaXMgb25seSAKKyAqCQkJCWNhbGxlZCBpZiBEaWFnIGRlYXR0YWNoZXMgZnJvbSB0aGF0IGNhcmQpCisgKgorICogRGVzY3JpcHRpb246CisgKglDbG9zZSBpbml0aWFsaXplZCBhZGFwdGVyLgorICoKKyAqIFJldHVybnM6CisgKgkwIC0gb24gc3VjY2VzcworICoJZXJyb3IgY29kZSAtIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgU2tEcnZJbml0QWRhcHRlcigKK1NLX0FDICAgKnBBQywJCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICAgKi8KK2ludCAgICAgIGRldk5icikJLyogd2hhdCBkZXZpY2UgaXMgdG8gYmUgaGFuZGxlZCAqLworeworCXN0cnVjdCBTS19ORVRfREVWSUNFICpkZXY7CisKKwlkZXYgPSBwQUMtPmRldltkZXZOYnJdOworCisJaWYgKFNrR2VPcGVuKGRldikgIT0gMCkgeworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSoqIFVzZSBjb3JyZWN0IE1UVSBzaXplIGFuZCBpbmRpY2F0ZSB0byBrZXJuZWwgVFggcXVldWUgY2FuIGJlIHN0YXJ0ZWQKKwkqLyAKKwlpZiAoU2tHZUNoYW5nZU10dShkZXYsIGRldi0+bXR1KSAhPSAwKSB7CisJCXJldHVybiAoLTEpOworCX0gCisJcmV0dXJuICgwKTsKKworfSAvKiBTa0RydkluaXRBZGFwdGVyICovCisKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogImRlYnVnIG9ubHkiIHNlY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglEdW1wTXNnIC0gcHJpbnQgYSBmcmFtZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBwcmludHMgZnJhbWVzIHRvIHRoZSBzeXN0ZW0gbG9nZmlsZS90byB0aGUgY29uc29sZS4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqCQorICovCitzdGF0aWMgdm9pZCBEdW1wTXNnKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKnN0cikKK3sKKwlpbnQJbXNnbGVuOworCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByaW50aygiRHVtcE1zZygpOiBOVUxMLU1lc3NhZ2VcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHNrYi0+ZGF0YSA9PSBOVUxMKSB7CisJCXByaW50aygiRHVtcE1zZygpOiBNZXNzYWdlIGVtcHR5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCW1zZ2xlbiA9IHNrYi0+bGVuOworCWlmIChtc2dsZW4gPiA2NCkKKwkJbXNnbGVuID0gNjQ7CisKKwlwcmludGsoIi0tLSBCZWdpbiBvZiBtZXNzYWdlIGZyb20gJXMgLCBsZW4gJWQgKGZyb20gJWQpIC0tLS1cbiIsIHN0ciwgbXNnbGVuLCBza2ItPmxlbik7CisKKwlEdW1wRGF0YSgoY2hhciAqKXNrYi0+ZGF0YSwgbXNnbGVuKTsKKworCXByaW50aygiLS0tLS0tLSBFbmQgb2YgbWVzc2FnZSAtLS0tLS0tLS1cbiIpOworfSAvKiBEdW1wTXNnICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglEdW1wRGF0YSAtIHByaW50IGEgZGF0YSBhcmVhCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHByaW50cyBhIGFyZWEgb2YgZGF0YSB0byB0aGUgc3lzdGVtIGxvZ2ZpbGUvdG8gdGhlCisgKgljb25zb2xlLgorICoKKyAqIFJldHVybnM6IE4vQQorICoJCisgKi8KK3N0YXRpYyB2b2lkIER1bXBEYXRhKGNoYXIgKnAsIGludCBzaXplKQoreworcmVnaXN0ZXIgaW50ICAgIGk7CitpbnQJaGFkZHIsIGFkZHI7CitjaGFyCWhleF9idWZmZXJbMTgwXTsKK2NoYXIJYXNjX2J1ZmZlclsxODBdOworY2hhcglIRVhDSEFSW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisKKwlhZGRyID0gMDsKKwloYWRkciA9IDA7CisJaGV4X2J1ZmZlclswXSA9IDA7CisJYXNjX2J1ZmZlclswXSA9IDA7CisJZm9yIChpPTA7IGkgPCBzaXplOyApIHsKKwkJaWYgKCpwID49ICcwJyAmJiAqcCA8PSd6JykKKwkJCWFzY19idWZmZXJbYWRkcl0gPSAqcDsKKwkJZWxzZQorCQkJYXNjX2J1ZmZlclthZGRyXSA9ICcuJzsKKwkJYWRkcisrOworCQlhc2NfYnVmZmVyW2FkZHJdID0gMDsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSBIRVhDSEFSWygqcCAmIDB4ZjApID4+IDRdOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9IEhFWENIQVJbKnAgJiAweDBmXTsKKwkJaGFkZHIrKzsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSAnICc7CisJCWhhZGRyKys7CisJCWhleF9idWZmZXJbaGFkZHJdID0gMDsKKwkJcCsrOworCQlpKys7CisJCWlmIChpJTE2ID09IDApIHsKKwkJCXByaW50aygiJXMgICVzXG4iLCBoZXhfYnVmZmVyLCBhc2NfYnVmZmVyKTsKKwkJCWFkZHIgPSAwOworCQkJaGFkZHIgPSAwOworCQl9CisJfQorfSAvKiBEdW1wRGF0YSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUR1bXBMb25nIC0gcHJpbnQgYSBkYXRhIGFyZWEgYXMgbG9uZyB2YWx1ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gcHJpbnRzIGEgYXJlYSBvZiBkYXRhIHRvIHRoZSBzeXN0ZW0gbG9nZmlsZS90byB0aGUKKyAqCWNvbnNvbGUuCisgKgorICogUmV0dXJuczogTi9BCisgKgkKKyAqLworc3RhdGljIHZvaWQgRHVtcExvbmcoY2hhciAqcGMsIGludCBzaXplKQoreworcmVnaXN0ZXIgaW50ICAgIGk7CitpbnQJaGFkZHIsIGFkZHI7CitjaGFyCWhleF9idWZmZXJbMTgwXTsKK2NoYXIJYXNjX2J1ZmZlclsxODBdOworY2hhcglIRVhDSEFSW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Citsb25nCSpwOworaW50CWw7CisKKwlhZGRyID0gMDsKKwloYWRkciA9IDA7CisJaGV4X2J1ZmZlclswXSA9IDA7CisJYXNjX2J1ZmZlclswXSA9IDA7CisJcCA9IChsb25nKikgcGM7CisJZm9yIChpPTA7IGkgPCBzaXplOyApIHsKKwkJbCA9IChsb25nKSAqcDsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSBIRVhDSEFSWyhsID4+IDI4KSAmIDB4Zl07CisJCWhhZGRyKys7CisJCWhleF9idWZmZXJbaGFkZHJdID0gSEVYQ0hBUlsobCA+PiAyNCkgJiAweGZdOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9IEhFWENIQVJbKGwgPj4gMjApICYgMHhmXTsKKwkJaGFkZHIrKzsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSBIRVhDSEFSWyhsID4+IDE2KSAmIDB4Zl07CisJCWhhZGRyKys7CisJCWhleF9idWZmZXJbaGFkZHJdID0gSEVYQ0hBUlsobCA+PiAxMikgJiAweGZdOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9IEhFWENIQVJbKGwgPj4gOCkgJiAweGZdOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9IEhFWENIQVJbKGwgPj4gNCkgJiAweGZdOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9IEhFWENIQVJbbCAmIDB4MGZdOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9ICcgJzsKKwkJaGFkZHIrKzsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSAwOworCQlwKys7CisJCWkrKzsKKwkJaWYgKGklOCA9PSAwKSB7CisJCQlwcmludGsoIiU0eCAlc1xuIiwgKGktOCkqNCwgaGV4X2J1ZmZlcik7CisJCQloYWRkciA9IDA7CisJCX0KKwl9CisJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworfSAvKiBEdW1wTG9uZyAqLworCisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgc2tnZV9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJU0tfQUMJCQkqcEFDOworCURFVl9ORVQJCQkqcE5ldCA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldiA9IE5VTEw7CisJc3RhdGljIGludCBib2FyZHNfZm91bmQgPSAwOworCWludCBlcnJvciA9IC1FTk9ERVY7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCWdvdG8gb3V0OworIAorCS8qIENvbmZpZ3VyZSBETUEgYXR0cmlidXRlcy4gKi8KKwlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCAodTY0KSAweGZmZmZmZmZmZmZmZmZmZmZVTEwpICYmCisJICAgIHBjaV9zZXRfZG1hX21hc2socGRldiwgKHU2NCkgMHhmZmZmZmZmZikpCisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCisKKwlpZiAoKGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihERVZfTkVUKSkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgZXRoZXJkZXYgIgorCQkgICAgICAgInN0cnVjdHVyZSFcbiIpOworCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKwl9CisKKwlwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwTmV0LT5wQUMgPSBrbWFsbG9jKHNpemVvZihTS19BQyksIEdGUF9LRVJORUwpOworCWlmICghcE5ldC0+cEFDKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIGFkYXB0ZXIgIgorCQkgICAgICAgInN0cnVjdHVyZSFcbiIpOworCQlnb3RvIG91dF9mcmVlX25ldGRldjsKKwl9CisKKwltZW1zZXQocE5ldC0+cEFDLCAwLCBzaXplb2YoU0tfQUMpKTsKKwlwQUMgPSBwTmV0LT5wQUM7CisJcEFDLT5QY2lEZXYgPSBwZGV2OworCXBBQy0+UGNpRGV2SWQgPSBwZGV2LT5kZXZpY2U7CisJcEFDLT5kZXZbMF0gPSBkZXY7CisJcEFDLT5kZXZbMV0gPSBkZXY7CisJc3ByaW50ZihwQUMtPk5hbWUsICJTeXNLb25uZWN0IFNLLTk4eHgiKTsKKwlwQUMtPkNoZWNrUXVldWUgPSBTS19GQUxTRTsKKworCXBOZXQtPk10dSA9IDE1MDA7CisJcE5ldC0+VXAgPSAwOworCWRldi0+aXJxID0gcGRldi0+aXJxOworCWVycm9yID0gU2tHZUluaXRQQ0kocEFDKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKCJTS0dFOiBQQ0kgc2V0dXAgZmFpbGVkOiAlaVxuIiwgZXJyb3IpOworCQlnb3RvIG91dF9mcmVlX25ldGRldjsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJZGV2LT5vcGVuID0JCSZTa0dlT3BlbjsKKwlkZXYtPnN0b3AgPQkJJlNrR2VDbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9CSZTa0dlWG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9CSZTa0dlU3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmU2tHZVNldFJ4TW9kZTsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9CSZTa0dlU2V0TWFjQWRkcjsKKwlkZXYtPmRvX2lvY3RsID0JCSZTa0dlSW9jdGw7CisJZGV2LT5jaGFuZ2VfbXR1ID0JJlNrR2VDaGFuZ2VNdHU7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9CSZTa0dlUG9sbENvbnRyb2xsZXI7CisjZW5kaWYKKwlkZXYtPmZsYWdzICY9IAkJfklGRl9SVU5OSU5HOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJlNrR2VFdGh0b29sT3BzKTsKKworI2lmZGVmIFNLX1pFUk9DT1BZCisjaWZkZWYgVVNFX1NLX1RYX0NIRUNLU1VNCisJaWYgKHBBQy0+Q2hpcHNldFR5cGUpIHsKKwkJLyogVXNlIG9ubHkgaWYgeXVrb24gaGFyZHdhcmUgKi8KKwkJLyogU0sgYW5kIFpFUk9DT1BZIC0gZmx5IGJhYnkuLi4gKi8KKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNOworCX0KKyNlbmRpZgorI2VuZGlmCisKKwlwQUMtPkluZGV4ID0gYm9hcmRzX2ZvdW5kKys7CisKKwlpZiAoU2tHZUJvYXJkSW5pdChkZXYsIHBBQykpCisJCWdvdG8gb3V0X2ZyZWVfbmV0ZGV2OworCisJLyogUmVnaXN0ZXIgbmV0IGRldmljZSAqLworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNLR0U6IENvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UuXG4iKTsKKwkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CisJfQorCisJLyogUHJpbnQgYWRhcHRlciBzcGVjaWZpYyBzdHJpbmcgZnJvbSB2cGQgKi8KKwlQcm9kdWN0U3RyKHBBQyk7CisJcHJpbnRrKCIlczogJXNcbiIsIGRldi0+bmFtZSwgcEFDLT5EZXZpY2VTdHIpOworCisJLyogUHJpbnQgY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLworCXByaW50aygiICAgICAgUHJlZlBvcnQ6JWMgIFJsbXRNb2RlOiVzXG4iLAorCQknQScgKyBwQUMtPlJsbXQuTmV0WzBdLlBvcnRbcEFDLT5SbG10Lk5ldFswXS5QcmVmUG9ydF0tPlBvcnROdW1iZXIsCisJCShwQUMtPlJsbXRNb2RlPT0wKSAgPyAiQ2hlY2sgTGluayBTdGF0ZSIgOgorCQkoKHBBQy0+UmxtdE1vZGU9PTEpID8gIkNoZWNrIExpbmsgU3RhdGUiIDoKKwkJKChwQUMtPlJsbXRNb2RlPT0zKSA/ICJDaGVjayBMb2NhbCBQb3J0IiA6CisJCSgocEFDLT5SbG10TW9kZT09NykgPyAiQ2hlY2sgU2VnbWVudGF0aW9uIiA6CisJCSgocEFDLT5SbG10TW9kZT09MTcpID8gIkR1YWwgQ2hlY2sgTGluayBTdGF0ZSIgOiJFcnJvciIpKSkpKTsKKworCVNrR2VZZWxsb3dMRUQocEFDLCBwQUMtPklvQmFzZSwgMSk7CisKKworCW1lbWNweSgmZGV2LT5kZXZfYWRkciwgJnBBQy0+QWRkci5OZXRbMF0uQ3VycmVudE1hY0FkZHJlc3MsIDYpOworCisJU2tHZVByb2NDcmVhdGUoZGV2KTsKKworCXBOZXQtPlBvcnROciA9IDA7CisJcE5ldC0+TmV0TnIgID0gMDsKKworCWJvYXJkc19mb3VuZCsrOworCisJLyogTW9yZSB0aGVuIG9uZSBwb3J0IGZvdW5kICovCisJaWYgKChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMiApICYmIChwQUMtPlJsbXROZXRzID09IDIpKSB7CisJCWlmICgoZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKERFVl9ORVQpKSkgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgZXRoZXJkZXYgIgorCQkJCSJzdHJ1Y3R1cmUhXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcEFDLT5kZXZbMV0gICA9IGRldjsKKwkJcE5ldCAgICAgICAgICA9IG5ldGRldl9wcml2KGRldik7CisJCXBOZXQtPlBvcnROciAgPSAxOworCQlwTmV0LT5OZXROciAgID0gMTsKKwkJcE5ldC0+cEFDICAgICA9IHBBQzsKKwkJcE5ldC0+TXR1ICAgICA9IDE1MDA7CisJCXBOZXQtPlVwICAgICAgPSAwOworCisJCWRldi0+b3BlbiAgICAgICAgICAgICAgID0gJlNrR2VPcGVuOworCQlkZXYtPnN0b3AgICAgICAgICAgICAgICA9ICZTa0dlQ2xvc2U7CisJCWRldi0+aGFyZF9zdGFydF94bWl0ICAgID0gJlNrR2VYbWl0OworCQlkZXYtPmdldF9zdGF0cyAgICAgICAgICA9ICZTa0dlU3RhdHM7CisJCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJlNrR2VTZXRSeE1vZGU7CisJCWRldi0+c2V0X21hY19hZGRyZXNzICAgID0gJlNrR2VTZXRNYWNBZGRyOworCQlkZXYtPmRvX2lvY3RsICAgICAgICAgICA9ICZTa0dlSW9jdGw7CisJCWRldi0+Y2hhbmdlX210dSAgICAgICAgID0gJlNrR2VDaGFuZ2VNdHU7CisJCWRldi0+ZmxhZ3MgICAgICAgICAgICAgJj0gfklGRl9SVU5OSU5HOworCQlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmU2tHZUV0aHRvb2xPcHMpOworCisjaWZkZWYgU0tfWkVST0NPUFkKKyNpZmRlZiBVU0VfU0tfVFhfQ0hFQ0tTVU0KKwkJaWYgKHBBQy0+Q2hpcHNldFR5cGUpIHsKKwkJCS8qIFNHIGFuZCBaRVJPQ09QWSAtIGZseSBiYWJ5Li4uICovCisJCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU07CisJCX0KKyNlbmRpZgorI2VuZGlmCisKKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlNLR0U6IENvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UuXG4iKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQlwQUMtPmRldlsxXSA9IHBBQy0+ZGV2WzBdOworCQl9IGVsc2UgeworCQkJU2tHZVByb2NDcmVhdGUoZGV2KTsKKwkJCW1lbWNweSgmZGV2LT5kZXZfYWRkciwKKwkJCQkJJnBBQy0+QWRkci5OZXRbMV0uQ3VycmVudE1hY0FkZHJlc3MsIDYpOworCQorCQkJcHJpbnRrKCIlczogJXNcbiIsIGRldi0+bmFtZSwgcEFDLT5EZXZpY2VTdHIpOworCQkJcHJpbnRrKCIgICAgICBQcmVmUG9ydDpCICBSbG10TW9kZTpEdWFsIENoZWNrIExpbmsgU3RhdGVcbiIpOworCQl9CisJfQorCisJLyogU2F2ZSB0aGUgaGFyZHdhcmUgcmV2aXNpb24gKi8KKwlwQUMtPkhXUmV2aXNpb24gPSAoKChwQUMtPkdJbmkuR0lQY2lId1JldiA+PiA0KSAmIDB4MEYpKjEwKSArCisJCShwQUMtPkdJbmkuR0lQY2lId1JldiAmIDB4MEYpOworCisJLyogU2V0IGRyaXZlciBnbG9iYWxzICovCisJcEFDLT5Qbm1pLnBEcml2ZXJGaWxlTmFtZSAgICA9IERSSVZFUl9GSUxFX05BTUU7CisJcEFDLT5Qbm1pLnBEcml2ZXJSZWxlYXNlRGF0ZSA9IERSSVZFUl9SRUxfREFURTsKKworCW1lbXNldCgmcEFDLT5Qbm1pQmFja3VwLCAwLCBzaXplb2YoU0tfUE5NSV9TVFJVQ1RfREFUQSkpOworCW1lbWNweSgmcEFDLT5Qbm1pQmFja3VwLCAmcEFDLT5Qbm1pU3RydWN0LCBzaXplb2YoU0tfUE5NSV9TVFJVQ1RfREFUQSkpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJcmV0dXJuIDA7CisKKyBvdXRfZnJlZV9yZXNvdXJjZXM6CisJRnJlZVJlc291cmNlcyhkZXYpOworIG91dF9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldihkZXYpOworIG91dF9kaXNhYmxlX2RldmljZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cisgb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNrZ2VfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCURFVl9ORVQgKnBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCVNLX0FDICpwQUMgPSBwTmV0LT5wQUM7CisJc3RydWN0IG5ldF9kZXZpY2UgKm90aGVyZGV2ID0gcEFDLT5kZXZbMV07CisKKwlTa0dlUHJvY1JlbW92ZShkZXYpOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKG90aGVyZGV2ICE9IGRldikKKwkJU2tHZVByb2NSZW1vdmUob3RoZXJkZXYpOworCisJU2tHZVllbGxvd0xFRChwQUMsIHBBQy0+SW9CYXNlLCAwKTsKKworCWlmIChwQUMtPkJvYXJkTGV2ZWwgPT0gU0tfSU5JVF9SVU4pIHsKKwkJU0tfRVZQQVJBIEV2UGFyYTsKKwkJdW5zaWduZWQgbG9uZyBGbGFnczsKKworCQkvKiBib2FyZCBpcyBzdGlsbCBhbGl2ZSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkJRXZQYXJhLlBhcmEzMlswXSA9IDA7CisJCUV2UGFyYS5QYXJhMzJbMV0gPSAtMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUT1AsIEV2UGFyYSk7CisJCUV2UGFyYS5QYXJhMzJbMF0gPSAxOworCQlFdlBhcmEuUGFyYTMyWzFdID0gLTE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVE9QLCBFdlBhcmEpOworCQlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIHBBQy0+SW9CYXNlKTsKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMF9JTVNLLCAwKTsKKwkJU2tHZURlSW5pdChwQUMsIHBBQy0+SW9CYXNlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkJcEFDLT5Cb2FyZExldmVsID0gU0tfSU5JVF9EQVRBOworCQkvKiBXZSBkbyBOT1QgY2hlY2sgaGVyZSwgaWYgSVJRIHdhcyBwZW5kaW5nLCBvZiBjb3Vyc2UqLworCX0KKworCWlmIChwQUMtPkJvYXJkTGV2ZWwgPT0gU0tfSU5JVF9JTykgeworCQkvKiBib2FyZCBpcyBzdGlsbCBhbGl2ZSAqLworCQlTa0dlRGVJbml0KHBBQywgcEFDLT5Jb0Jhc2UpOworCQlwQUMtPkJvYXJkTGV2ZWwgPSBTS19JTklUX0RBVEE7CisJfQorCisJRnJlZVJlc291cmNlcyhkZXYpOworCWZyZWVfbmV0ZGV2KGRldik7CisJaWYgKG90aGVyZGV2ICE9IGRldikKKwkJZnJlZV9uZXRkZXYob3RoZXJkZXYpOworCWtmcmVlKHBBQyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBza2dlX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgMHgxNzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4ODBlYiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULCAweDQzMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfU1lTS09OTkVDVCwgMHg0MzIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0RMSU5LLCAweDRjMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisjaWYgMAkvKiBkb24ndCBoYW5kbGUgWXVrb24yIGNhcmRzIGF0IHRoZSBtb21lbnQgLS0gbWxpbmRuZXJAc3lza29ubmVjdC5kZSAqLworCXsgUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisjZW5kaWYKKwl7IFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg1MDA1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0NORVQsIDB4NDM0ZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MSU5LU1lTLCAweDEwMzIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfTElOS1NZUywgMHgxMDY0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2tnZV9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNrZ2VfZHJpdmVyID0geworCS5uYW1lCQk9ICJzazk4bGluIiwKKwkuaWRfdGFibGUJPSBza2dlX3BjaV90YmwsCisJLnByb2JlCQk9IHNrZ2VfcHJvYmVfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2tnZV9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNrZ2VfaW5pdCh2b2lkKQoreworCWludCBlcnJvcjsKKworCXBTa1Jvb3REaXIgPSBwcm9jX21rZGlyKFNLUm9vdE5hbWUsIHByb2NfbmV0KTsKKwlpZiAocFNrUm9vdERpcikgCisJCXBTa1Jvb3REaXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJCisJZXJyb3IgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZza2dlX2RyaXZlcik7CisJaWYgKGVycm9yKQorCQlwcm9jX25ldF9yZW1vdmUoU0tSb290TmFtZSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2tnZV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZza2dlX2RyaXZlcik7CisJcHJvY19uZXRfcmVtb3ZlKFNLUm9vdE5hbWUpOworCit9CisKK21vZHVsZV9pbml0KHNrZ2VfaW5pdCk7Cittb2R1bGVfZXhpdChza2dlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlaHd0LmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2Vod3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjY3MDk5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlaHd0LmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlaHd0LmMKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIEV2ZW50IFNjaGVkdWxlciBNb2R1bGUKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4xNSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wOS8xNiAxMzo0MToyMyAkCisgKiBQdXJwb3NlOglIYXJkd2FyZSBUaW1lcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglFdmVudCBxdWV1ZSBhbmQgZGlzcGF0Y2hlcgorICovCisjaWYgKGRlZmluZWQoREVCVUcpIHx8ICgoIWRlZmluZWQoTElOVCkpICYmICghZGVmaW5lZChTS19TTElNKSkpKQorc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0KKwkiQCgjKSAkSWQ6IHNrZ2Vod3QuYyx2IDEuMTUgMjAwMy8wOS8xNiAxMzo0MToyMyByc2NobWlkdCBFeHAgJCAoQykgTWFydmVsbC4iOworI2VuZGlmCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCQkvKiBEcml2ZXIgU3BlY2lmaWMgRGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCQkvKiBBZGFwdGVyIENvbnRyb2wtIGFuZCBEcml2ZXIgc3BlY2lmaWMgRGVmLiAqLworCisjaWZkZWYgX19DMk1BTl9fCisvKgorICogICBIYXJkd2FyZSBUaW1lciBmdW5jdGlvbiBxdWV1ZSBtYW5hZ2VtZW50LgorICovCitpbnRybygpCit7fQorI2VuZGlmCisKKy8qCisgKiBQcm90b3R5cGVzIG9mIGxvY2FsIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTS19IV1RfTUFYCSg2NTAwMCkKKworLyogY29ycmVjdGlvbiBmYWN0b3IgKi8KKyNkZWZpbmUJU0tfSFdUX0ZBQwkoMTAwMCAqIChTS19VMzIpcEFDLT5HSW5pLkdJSHN0Q2xrRmFjdCAvIDEwMCkKKworLyoKKyAqIEluaXRpYWxpemUgaGFyZHdhcmUgdGltZXIuCisgKgorICogTXVzdCBiZSBjYWxsZWQgZHVyaW5nIGluaXQgbGV2ZWwgMS4KKyAqLwordm9pZAlTa0h3dEluaXQoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJSW9jKQkvKiBJb0NvbnRleHQgKi8KK3sKKwlwQUMtPkh3dC5UU3RhcnQgPSAwIDsKKwlwQUMtPkh3dC5UU3RvcAk9IDAgOworCXBBQy0+SHd0LlRBY3RpdmUgPSBTS19GQUxTRTsKKworCVNrSHd0U3RvcChwQUMsIElvYyk7Cit9CisKKy8qCisgKgorICogU3RhcnQgaGFyZHdhcmUgdGltZXIgKGNsb2NrIHRpY2tzIGFyZSAxNnVzKS4KKyAqCisgKi8KK3ZvaWQJU2tId3RTdGFydCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb2MsCS8qIElvQ29udGV4dCAqLworU0tfVTMyCVRpbWUpCS8qIFRpbWUgaW4gdW5pdHMgb2YgMTZ1cyB0byBsb2FkIHRoZSB0aW1lciB3aXRoLiAqLworeworCVNLX1UzMglDbnQ7CisKKwlpZiAoVGltZSA+IFNLX0hXVF9NQVgpCisJCVRpbWUgPSBTS19IV1RfTUFYOworCisJcEFDLT5Id3QuVFN0YXJ0ID0gVGltZTsKKwlwQUMtPkh3dC5UU3RvcCA9IDBMOworCisJQ250ID0gVGltZTsKKworCS8qCisJICogaWYgdGltZSA8IDE2IHVzCisJICoJdGltZSA9IDE2IHVzCisJICovCisJaWYgKCFDbnQpIHsKKwkJQ250Kys7CisJfQorCisJU0tfT1VUMzIoSW9jLCBCMl9USV9JTkksIENudCAqIFNLX0hXVF9GQUMpOworCQorCVNLX09VVDE2KElvYywgQjJfVElfQ1RSTCwgVElNX1NUQVJUKTsJLyogU3RhcnQgdGltZXIuICovCisKKwlwQUMtPkh3dC5UQWN0aXZlID0gU0tfVFJVRTsKK30KKworLyoKKyAqIFN0b3AgaGFyZHdhcmUgdGltZXIuCisgKiBhbmQgY2xlYXIgdGhlIHRpbWVyIElSUQorICovCit2b2lkCVNrSHd0U3RvcCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb2MpCS8qIElvQ29udGV4dCAqLworeworCVNLX09VVDE2KElvYywgQjJfVElfQ1RSTCwgVElNX1NUT1ApOworCQorCVNLX09VVDE2KElvYywgQjJfVElfQ1RSTCwgVElNX0NMUl9JUlEpOworCisJcEFDLT5Id3QuVEFjdGl2ZSA9IFNLX0ZBTFNFOworfQorCisKKy8qCisgKglTdG9wIGhhcmR3YXJlIHRpbWVyIGFuZCByZWFkIHRpbWUgZWxhcHNlZCBzaW5jZSBsYXN0IHN0YXJ0LgorICoKKyAqIHJldHVybnMKKyAqCVRoZSBlbGFwc2VkIHRpbWUgc2luY2UgbGFzdCBzdGFydCBpbiB1bml0cyBvZiAxNnVzLgorICoKKyAqLworU0tfVTMyCVNrSHd0UmVhZCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb2MpCS8qIElvQ29udGV4dCAqLworeworCVNLX1UzMglUUmVhZDsKKwlTS19VMzIJSVN0YXR1czsKKworCWlmIChwQUMtPkh3dC5UQWN0aXZlKSB7CisJCQorCQlTa0h3dFN0b3AocEFDLCBJb2MpOworCisJCVNLX0lOMzIoSW9jLCBCMl9USV9WQUwsICZUUmVhZCk7CisJCVRSZWFkIC89IFNLX0hXVF9GQUM7CisKKwkJU0tfSU4zMihJb2MsIEIwX0lTUkMsICZJU3RhdHVzKTsKKworCQkvKiBDaGVjayBpZiB0aW1lciBleHBpcmVkIChvciB3cmFwZWQgYXJvdW5kKSAqLworCQlpZiAoKFRSZWFkID4gcEFDLT5Id3QuVFN0YXJ0KSB8fCAoSVN0YXR1cyAmIElTX1RJTUlOVCkpIHsKKwkJCQorCQkJU2tId3RTdG9wKHBBQywgSW9jKTsKKwkJCQorCQkJcEFDLT5Id3QuVFN0b3AgPSBwQUMtPkh3dC5UU3RhcnQ7CisJCX0KKwkJZWxzZSB7CisJCQkKKwkJCXBBQy0+SHd0LlRTdG9wID0gcEFDLT5Id3QuVFN0YXJ0IC0gVFJlYWQ7CisJCX0KKwl9CisJcmV0dXJuKHBBQy0+SHd0LlRTdG9wKTsKK30KKworLyoKKyAqIGludGVycnVwdCBzb3VyY2U9IHRpbWVyCisgKi8KK3ZvaWQJU2tId3RJc3IoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJSW9jKQkvKiBJb0NvbnRleHQgKi8KK3sKKwlTa0h3dFN0b3AocEFDLCBJb2MpOworCQorCXBBQy0+SHd0LlRTdG9wID0gcEFDLT5Id3QuVFN0YXJ0OworCQorCVNrVGltZXJEb25lKHBBQywgSW9jKTsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZWluaXQuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZWluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQ0ODM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlaW5pdC5jCkBAIC0wLDAgKzEsMjE1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZ2Vpbml0LmMKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIENvbW1vbiBNb2R1bGVzCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuOTcgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMTAvMDIgMTY6NDU6MzEgJAorICogUHVycG9zZToJQ29udGFpbnMgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgdGhlIGFkYXB0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0LgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIKKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGxvY2FsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoZGVmaW5lZChERUJVRykgfHwgKCghZGVmaW5lZChMSU5UKSkgJiYgKCFkZWZpbmVkKFNLX1NMSU0pKSkpCitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpICRJZDogc2tnZWluaXQuYyx2IDEuOTcgMjAwMy8xMC8wMiAxNjo0NTozMSByc2NobWlkdCBFeHAgJCAoQykgTWFydmVsbC4iOworI2VuZGlmCisKK3N0cnVjdCBzX1FPZmZUYWIgeworCWludAlSeFFPZmY7CQkvKiBSZWNlaXZlIFF1ZXVlIEFkZHJlc3MgT2Zmc2V0ICovCisJaW50CVhzUU9mZjsJCS8qIFN5bmMgVHggUXVldWUgQWRkcmVzcyBPZmZzZXQgKi8KKwlpbnQJWGFRT2ZmOwkJLyogQXN5bmMgVHggUXVldWUgQWRkcmVzcyBPZmZzZXQgKi8KK307CitzdGF0aWMgc3RydWN0IHNfUU9mZlRhYiBRT2ZmVGFiW10gPSB7CisJe1FfUjEsIFFfWFMxLCBRX1hBMX0sIHtRX1IyLCBRX1hTMiwgUV9YQTJ9Cit9OworCitzdHJ1Y3Qgc19Db25maWcgeworCWNoYXIJU2NhblN0cmluZ1s4XTsKKwlTS19VMzIJVmFsdWU7Cit9OworCitzdGF0aWMgc3RydWN0IHNfQ29uZmlnIE9lbUNvbmZpZyA9IHsKKwl7J08nLCdFJywnTScsJ18nLCdDJywnbycsJ24nLCdmJ30sCisjaWZkZWYgU0tfT0VNX0NPTkZJRworCU9FTV9DT05GSUdfVkFMVUUsCisjZWxzZQorCTAsCisjZW5kaWYKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlUG9sbFJ4RCgpIC0gRW5hYmxlIC8gRGlzYWJsZSBEZXNjcmlwdG9yIFBvbGxpbmcgb2YgUnhEIFJpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUVuYWJsZSBvciBkaXNhYmxlIHRoZSBkZXNjcmlwdG9yIHBvbGxpbmcgb2YgdGhlIHJlY2VpdmUgZGVzY3JpcHRvcgorICoJcmluZyAoUnhEKSBmb3IgcG9ydCAnUG9ydCcuCisgKglUaGUgbmV3IGNvbmZpZ3VyYXRpb24gaXMgKm5vdCogc2F2ZWQgb3ZlciBhbnkgU2tHZVN0b3BQb3J0KCkgYW5kCisgKglTa0dlSW5pdFBvcnQoKSBjYWxscy4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VQb2xsUnhEKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK1NLX0JPT0wgUG9sbFJ4RCkJLyogU0tfVFJVRSAoZW5hYmxlIHBvbC4pLCBTS19GQUxTRSAoZGlzYWJsZSBwb2wuKSAqLworeworCVNLX0dFUE9SVCAqcFBydDsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFJ4UU9mZiwgUV9DU1IpLCAoUG9sbFJ4RCkgPworCQlDU1JfRU5BX1BPTCA6IENTUl9ESVNfUE9MKTsKK30JLyogU2tHZVBvbGxSeEQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZVBvbGxUeEQoKSAtIEVuYWJsZSAvIERpc2FibGUgRGVzY3JpcHRvciBQb2xsaW5nIG9mIFR4RCBSaW5ncworICoKKyAqIERlc2NyaXB0aW9uOgorICoJRW5hYmxlIG9yIGRpc2FibGUgdGhlIGRlc2NyaXB0b3IgcG9sbGluZyBvZiB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvcgorICoJcmluZyhzKSAoVHhEKSBmb3IgcG9ydCAnUG9ydCcuCisgKglUaGUgbmV3IGNvbmZpZ3VyYXRpb24gaXMgKm5vdCogc2F2ZWQgb3ZlciBhbnkgU2tHZVN0b3BQb3J0KCkgYW5kCisgKglTa0dlSW5pdFBvcnQoKSBjYWxscy4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VQb2xsVHhEKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK1NLX0JPT0wgUG9sbFR4RCkJLyogU0tfVFJVRSAoZW5hYmxlIHBvbC4pLCBTS19GQUxTRSAoZGlzYWJsZSBwb2wuKSAqLworeworCVNLX0dFUE9SVCAqcFBydDsKKwlTS19VMzIJRFdvcmQ7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCURXb3JkID0gKFNLX1UzMikoUG9sbFR4RCA/IENTUl9FTkFfUE9MIDogQ1NSX0RJU19QT0wpOworCisJaWYgKHBQcnQtPlBYU1FTaXplICE9IDApIHsKKwkJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFhzUU9mZiwgUV9DU1IpLCBEV29yZCk7CisJfQorCQorCWlmIChwUHJ0LT5QWEFRU2l6ZSAhPSAwKSB7CisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYYVFPZmYsIFFfQ1NSKSwgRFdvcmQpOworCX0KK30JLyogU2tHZVBvbGxUeEQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZVllbGxvd0xFRCgpIC0gU3dpdGNoIHRoZSB5ZWxsb3cgTEVEIG9uIG9yIG9mZi4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVN3aXRjaCB0aGUgeWVsbG93IExFRCBvbiBvciBvZmYuCisgKgorICogTm90ZToKKyAqCVRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhbnkgdGltZSBhZnRlciBTa0dlSW5pdChMZXZlbCAxKS4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VZZWxsb3dMRUQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlTdGF0ZSkJCS8qIHllbGxvdyBMRUQgc3RhdGUsIDAgPSBPRkYsIDAgIT0gT04gKi8KK3sKKwlpZiAoU3RhdGUgPT0gMCkgeworCQkvKiBTd2l0Y2ggeWVsbG93IExFRCBPRkYgKi8KKwkJU0tfT1VUOChJb0MsIEIwX0xFRCwgTEVEX1NUQVRfT0ZGKTsKKwl9CisJZWxzZSB7CisJCS8qIFN3aXRjaCB5ZWxsb3cgTEVEIE9OICovCisJCVNLX09VVDgoSW9DLCBCMF9MRUQsIExFRF9TVEFUX09OKTsKKwl9Cit9CS8qIFNrR2VZZWxsb3dMRUQgKi8KKworCisjaWYgKCFkZWZpbmVkKFNLX1NMSU0pIHx8IGRlZmluZWQoR0VORVNJUykpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZVhtaXRMRUQoKSAtIE1vZGlmeSB0aGUgT3BlcmF0aW9uYWwgTW9kZSBvZiBhIHRyYW5zbWlzc2lvbiBMRUQuCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgUnggb3IgVHggTEVEIHdoaWNoIGlzIHNwZWNpZmllZCBieSAnTGVkJyB3aWxsIGJlCisgKgllbmFibGVkLCBkaXNhYmxlZCBvciBzd2l0Y2hlZCBvbiBpbiB0ZXN0IG1vZGUuCisgKgorICogTm90ZToKKyAqCSdMZWQnIG11c3QgY29udGFpbiB0aGUgYWRkcmVzcyBvZmZzZXQgb2YgdGhlIExFRHMgSU5JIHJlZ2lzdGVyLgorICoKKyAqIFVzYWdlOgorICoJU2tHZVhtaXRMRUQocEFDLCBJb0MsIE1SX0FERFIoUG9ydCwgVFhfTEVEX0lOSSksIFNLX0xFRF9FTkEpOworICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tHZVhtaXRMRUQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlMZWQsCQkvKiBvZmZzZXQgdG8gdGhlIExFRCBJbml0IFZhbHVlIHJlZ2lzdGVyICovCitpbnQJCU1vZGUpCQkvKiBNb2RlIG1heSBiZSBTS19MRURfRElTLCBTS19MRURfRU5BLCBTS19MRURfVFNUICovCit7CisJU0tfVTMyCUxlZEluaTsKKworCXN3aXRjaCAoTW9kZSkgeworCWNhc2UgU0tfTEVEX0VOQToKKwkJTGVkSW5pID0gU0tfWE1JVF9EVVIgKiAoU0tfVTMyKXBBQy0+R0luaS5HSUhzdENsa0ZhY3QgLyAxMDA7CisJCVNLX09VVDMyKElvQywgTGVkICsgWE1JVF9MRURfSU5JLCBMZWRJbmkpOworCQlTS19PVVQ4KElvQywgTGVkICsgWE1JVF9MRURfQ1RSTCwgTEVEX1NUQVJUKTsKKwkJYnJlYWs7CisJY2FzZSBTS19MRURfVFNUOgorCQlTS19PVVQ4KElvQywgTGVkICsgWE1JVF9MRURfVFNULCBMRURfVF9PTik7CisJCVNLX09VVDMyKElvQywgTGVkICsgWE1JVF9MRURfQ05ULCAxMDApOworCQlTS19PVVQ4KElvQywgTGVkICsgWE1JVF9MRURfQ1RSTCwgTEVEX1NUQVJUKTsKKwkJYnJlYWs7CisJY2FzZSBTS19MRURfRElTOgorCWRlZmF1bHQ6CisJCS8qCisJCSAqIERvIE5PVCBzdG9wIHRoZSBMRUQgVGltZXIgaGVyZS4gVGhlIExFRCBtaWdodCBiZQorCQkgKiBpbiBvbiBzdGF0ZS4gQnV0IGl0IG5lZWRzIHRvIGdvIG9mZi4KKwkJICovCisJCVNLX09VVDMyKElvQywgTGVkICsgWE1JVF9MRURfQ05ULCAwKTsKKwkJU0tfT1VUOChJb0MsIExlZCArIFhNSVRfTEVEX1RTVCwgTEVEX1RfT0ZGKTsKKwkJYnJlYWs7CisJfQorCQkJCisJLyoKKwkgKiAxMDAwQlQ6IFRoZSBUcmFuc21pdCBMRUQgaXMgZHJpdmVuIGJ5IHRoZSBQSFkuCisJICogQnV0IHRoZSBkZWZhdWx0IExFRCBjb25maWd1cmF0aW9uIGlzIHVzZWQgZm9yCisJICogTGV2ZWwgT25lIGFuZCBCcm9hZGNvbSBQSFlzLgorCSAqIChCcm9hZGNvbTogSXQgbWF5IGJlIHRoYXQgUEhZX0JfUEVDX0VOX0xUUiBoYXMgdG8gYmUgc2V0LikKKwkgKiAoSW4gdGhpcyBjYXNlIGl0IGhhcyB0byBiZSBhZGRlZCBoZXJlLiBCdXQgd2Ugd2lsbCBzZWUuIFhYWCkKKwkgKi8KK30JLyogU2tHZVhtaXRMRUQgKi8KKyNlbmRpZgkvKiAhU0tfU0xJTSB8fCBHRU5FU0lTICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCURvQ2FsY0FkZHIoKSAtIENhbGN1bGF0ZXMgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIGFkZHJlc3Mgb2YgYSBxdWV1ZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgYWRkcmVzcyBvZiBhIHF1ZXVlLgorICogIEFmdGVyd2FyZHMgdGhlICdTdGFydFZhbCcgaXMgaW5jcmVtZW50ZWQgdG8gdGhlIG5leHQgc3RhcnQgcG9zaXRpb24uCisgKglJZiB0aGUgcG9ydCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHRoZSBjYWxjdWxhdGVkIHZhbHVlcworICoJd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgdGhlIGNvbmZpZ3VyZWQgdmFsdWVzIGFuZCBhbgorICoJZXJyb3Igd2lsbCBiZSByZXR1cm5lZCwgaWYgdGhleSBhcmUgbm90IGVxdWFsLgorICoJSWYgdGhlIHBvcnQgaXMgbm90IGluaXRpYWxpemVkIHRoZSB2YWx1ZXMgd2lsbCBiZSB3cml0dGVuIHRvCisgKgkqU3RhcnRBZHIgYW5kICpFbmRBZGRyLgorICoKKyAqIFJldHVybnM6CisgKgkwOglzdWNjZXNzCisgKgkxOgljb25maWd1cmF0aW9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgRG9DYWxjQWRkcigKK1NLX0FDCQkqcEFDLCAJCQkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19HRVBPUlQJU0tfRkFSICpwUHJ0LAkJLyogcG9ydCBpbmRleCAqLworaW50CQkJUXVTaXplLAkJCQkvKiBzaXplIG9mIHRoZSBxdWV1ZSB0byBjb25maWd1cmUgaW4ga0IgKi8KK1NLX1UzMgkJU0tfRkFSICpTdGFydFZhbCwJLyogc3RhcnQgdmFsdWUgZm9yIGFkZHJlc3MgY2FsY3VsYXRpb24gKi8KK1NLX1UzMgkJU0tfRkFSICpRdVN0YXJ0QWRkciwvKiBzdGFydCBhZGRyIHRvIGNhbGN1bGF0ZSAqLworU0tfVTMyCQlTS19GQVIgKlF1RW5kQWRkcikJLyogZW5kIGFkZHJlc3MgdG8gY2FsY3VsYXRlICovCit7CisJU0tfVTMyCUVuZFZhbDsKKwlTS19VMzIJTmV4dFN0YXJ0OworCWludAkJUnR2OworCisJUnR2ID0gMDsKKwlpZiAoUXVTaXplID09IDApIHsKKwkJRW5kVmFsID0gKlN0YXJ0VmFsOworCQlOZXh0U3RhcnQgPSBFbmRWYWw7CisJfQorCWVsc2UgeworCQlFbmRWYWwgPSAqU3RhcnRWYWwgKyAoKFNLX1UzMilRdVNpemUgKiAxMDI0KSAtIDE7CisJCU5leHRTdGFydCA9IEVuZFZhbCArIDE7CisJfQorCisJaWYgKHBQcnQtPlBTdGF0ZSA+PSBTS19QUlRfSU5JVCkgeworCQlpZiAoKlN0YXJ0VmFsICE9ICpRdVN0YXJ0QWRkciB8fCBFbmRWYWwgIT0gKlF1RW5kQWRkcikgeworCQkJUnR2ID0gMTsKKwkJfQorCX0KKwllbHNlIHsKKwkJKlF1U3RhcnRBZGRyID0gKlN0YXJ0VmFsOworCQkqUXVFbmRBZGRyID0gRW5kVmFsOworCX0KKworCSpTdGFydFZhbCA9IE5leHRTdGFydDsKKwlyZXR1cm4oUnR2KTsKK30JLyogRG9DYWxjQWRkciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXRBc3NpZ25SYW1Ub1F1ZXVlcygpIC0gYWxsb2NhdGUgZGVmYXVsdCBxdWV1ZSBzaXplcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBhc3NpZ25zIHRoZSBtZW1vcnkgdG8gdGhlIGRpZmZlcmVudCBxdWV1ZXMgYW5kIHBvcnRzLgorICoJV2hlbiBEdWFsTmV0IGlzIHNldCB0byBTS19UUlVFIGFsbCBwb3J0cyBnZXQgdGhlIHNhbWUgYW1vdW50IG9mIG1lbW9yeS4KKyAqICBPdGhlcndpc2UgdGhlIGZpcnN0IHBvcnQgZ2V0cyBtb3N0IG9mIHRoZSBtZW1vcnkgYW5kIGFsbCB0aGUKKyAqCW90aGVyIHBvcnRzIGp1c3QgdGhlIHJlcXVpcmVkIG1pbmltdW0uCisgKglUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIHBBQy0+R0luaS5HSVJhbVNpemUgYW5kCisgKglwQUMtPkdJbmkuR0lNYWNzRm91bmQgaGF2ZSBiZWVuIGluaXRpYWxpemVkLCB1c3VhbGx5IHRoaXMgaGFwcGVucworICoJYXQgaW5pdCBsZXZlbCAxCisgKgorICogUmV0dXJuczoKKyAqCTAgLSBvaworICoJMSAtIGludmFsaWQgaW5wdXQgdmFsdWVzCisgKgkyIC0gbm90IGVub3VnaCBtZW1vcnkKKyAqLworCitpbnQgU2tHZUluaXRBc3NpZ25SYW1Ub1F1ZXVlcygKK1NLX0FDCSpwQUMsCQkJLyogQWRhcHRlciBjb250ZXh0ICovCitpbnQJCUFjdGl2ZVBvcnQsCQkvKiBBY3RpdmUgUG9ydCBpbiBSTE1UIG1vZGUgKi8KK1NLX0JPT0wJRHVhbE5ldCkJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworeworCWludAlpOworCWludAlVc2VkS2lsb2J5dGVzOwkJCS8qIG1lbW9yeSBhbHJlYWR5IGFzc2lnbmVkICovCisJaW50CUFjdGl2ZVBvcnRLaWxvYnl0ZXM7CS8qIG1lbW9yeSBhdmFpbGFibGUgZm9yIGFjdGl2ZSBwb3J0ICovCisJU0tfR0VQT1JUICpwR2VQb3J0OworCisJVXNlZEtpbG9ieXRlcyA9IDA7CisKKwlpZiAoQWN0aXZlUG9ydCA+PSBwQUMtPkdJbmkuR0lNYWNzRm91bmQpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JTklULAorCQkJKCJTa0dlSW5pdEFzc2lnblJhbVRvUXVldWVzOiBBY3RpdmVQb3J0ICglZCkgaW52YWxpZFxuIiwKKwkJCUFjdGl2ZVBvcnQpKTsKKwkJcmV0dXJuKDEpOworCX0KKwlpZiAoKChwQUMtPkdJbmkuR0lNYWNzRm91bmQgKiAoU0tfTUlOX1JYUV9TSVpFICsgU0tfTUlOX1RYUV9TSVpFKSkgKworCQkoKFJBTV9RVU9UQV9TWU5DID09IDApID8gMCA6IFNLX01JTl9UWFFfU0laRSkpID4gcEFDLT5HSW5pLkdJUmFtU2l6ZSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lOSVQsCisJCQkoIlNrR2VJbml0QXNzaWduUmFtVG9RdWV1ZXM6IE5vdCBlbm91Z2ggbWVtb3J5ICglZClcbiIsCisJCQkgcEFDLT5HSW5pLkdJUmFtU2l6ZSkpOworCQlyZXR1cm4oMik7CisJfQorCisJaWYgKER1YWxOZXQpIHsKKwkJLyogZXZlcnkgcG9ydCBnZXRzIHRoZSBzYW1lIGFtb3VudCBvZiBtZW1vcnkgKi8KKwkJQWN0aXZlUG9ydEtpbG9ieXRlcyA9IHBBQy0+R0luaS5HSVJhbVNpemUgLyBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisJCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCisJCQlwR2VQb3J0ID0gJnBBQy0+R0luaS5HUFtpXTsKKwkJCQorCQkJLyogdGFrZSBhd2F5IHRoZSBtaW5pbXVtIG1lbW9yeSBmb3IgYWN0aXZlIHF1ZXVlcyAqLworCQkJQWN0aXZlUG9ydEtpbG9ieXRlcyAtPSAoU0tfTUlOX1JYUV9TSVpFICsgU0tfTUlOX1RYUV9TSVpFKTsKKworCQkJLyogcmVjZWl2ZSBxdWV1ZSBnZXRzIHRoZSBtaW5pbXVtICsgODAlIG9mIHRoZSByZXN0ICovCisJCQlwR2VQb3J0LT5QUnhRU2l6ZSA9IChpbnQpIChST1VORF9RVUVVRV9TSVpFX0tCKCgKKwkJCQlBY3RpdmVQb3J0S2lsb2J5dGVzICogKHVuc2lnbmVkIGxvbmcpIFJBTV9RVU9UQV9SWCkgLyAxMDApKQorCQkJCSsgU0tfTUlOX1JYUV9TSVpFOworCisJCQlBY3RpdmVQb3J0S2lsb2J5dGVzIC09IChwR2VQb3J0LT5QUnhRU2l6ZSAtIFNLX01JTl9SWFFfU0laRSk7CisKKwkJCS8qIHN5bmNocm9ub3VzIHRyYW5zbWl0IHF1ZXVlICovCisJCQlwR2VQb3J0LT5QWFNRU2l6ZSA9IDA7CisKKwkJCS8qIGFzeW5jaHJvbm91cyB0cmFuc21pdCBxdWV1ZSAqLworCQkJcEdlUG9ydC0+UFhBUVNpemUgPSAoaW50KSBST1VORF9RVUVVRV9TSVpFX0tCKEFjdGl2ZVBvcnRLaWxvYnl0ZXMgKworCQkJCVNLX01JTl9UWFFfU0laRSk7CisJCX0KKwl9CisJZWxzZSB7CQorCQkvKiBSbG10IE1vZGUgb3Igc2luZ2xlIGxpbmsgYWRhcHRlciAqLworCisJCS8qIFNldCBzdGFuZGJ5IHF1ZXVlIHNpemUgZGVmYXVsdHMgZm9yIGFsbCBzdGFuZGJ5IHBvcnRzICovCisJCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCisJCQlpZiAoaSAhPSBBY3RpdmVQb3J0KSB7CisJCQkJcEdlUG9ydCA9ICZwQUMtPkdJbmkuR1BbaV07CisKKwkJCQlwR2VQb3J0LT5QUnhRU2l6ZSA9IFNLX01JTl9SWFFfU0laRTsKKwkJCQlwR2VQb3J0LT5QWEFRU2l6ZSA9IFNLX01JTl9UWFFfU0laRTsKKwkJCQlwR2VQb3J0LT5QWFNRU2l6ZSA9IDA7CisKKwkJCQkvKiBDb3VudCB1c2VkIFJBTSAqLworCQkJCVVzZWRLaWxvYnl0ZXMgKz0gcEdlUG9ydC0+UFJ4UVNpemUgKyBwR2VQb3J0LT5QWEFRU2l6ZTsKKwkJCX0KKwkJfQorCQkvKiB3aGF0J3MgbGVmdD8gKi8KKwkJQWN0aXZlUG9ydEtpbG9ieXRlcyA9IHBBQy0+R0luaS5HSVJhbVNpemUgLSBVc2VkS2lsb2J5dGVzOworCisJCS8qIGFzc2lnbiBpdCB0byB0aGUgYWN0aXZlIHBvcnQgKi8KKwkJLyogZmlyc3QgdGFrZSBhd2F5IHRoZSBtaW5pbXVtIG1lbW9yeSAqLworCQlBY3RpdmVQb3J0S2lsb2J5dGVzIC09IChTS19NSU5fUlhRX1NJWkUgKyBTS19NSU5fVFhRX1NJWkUpOworCQlwR2VQb3J0ID0gJnBBQy0+R0luaS5HUFtBY3RpdmVQb3J0XTsKKworCQkvKiByZWNlaXZlIHF1ZXVlIGdldCdzIHRoZSBtaW5pbXVtICsgODAlIG9mIHRoZSByZXN0ICovCisJCXBHZVBvcnQtPlBSeFFTaXplID0gKGludCkgKFJPVU5EX1FVRVVFX1NJWkVfS0IoKEFjdGl2ZVBvcnRLaWxvYnl0ZXMgKgorCQkJKHVuc2lnbmVkIGxvbmcpIFJBTV9RVU9UQV9SWCkgLyAxMDApKSArIFNLX01JTl9SWFFfU0laRTsKKworCQlBY3RpdmVQb3J0S2lsb2J5dGVzIC09IChwR2VQb3J0LT5QUnhRU2l6ZSAtIFNLX01JTl9SWFFfU0laRSk7CisKKwkJLyogc3luY2hyb25vdXMgdHJhbnNtaXQgcXVldWUgKi8KKwkJcEdlUG9ydC0+UFhTUVNpemUgPSAwOworCisJCS8qIGFzeW5jaHJvbm91cyB0cmFuc21pdCBxdWV1ZSAqLworCQlwR2VQb3J0LT5QWEFRU2l6ZSA9IChpbnQpIFJPVU5EX1FVRVVFX1NJWkVfS0IoQWN0aXZlUG9ydEtpbG9ieXRlcykgKworCQkJU0tfTUlOX1RYUV9TSVpFOworCX0KKyNpZmRlZiBWQ1BVCisJVkNQVXByaW50ZigwLCAiUFJ4UVNpemU9JXUsIFBYU1FTaXplPSV1LCBQWEFRU2l6ZT0ldVxuIiwKKwkJcEdlUG9ydC0+UFJ4UVNpemUsIHBHZVBvcnQtPlBYU1FTaXplLCBwR2VQb3J0LT5QWEFRU2l6ZSk7CisjZW5kaWYgLyogVkNQVSAqLworCisJcmV0dXJuKDApOworfQkvKiBTa0dlSW5pdEFzc2lnblJhbVRvUXVldWVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlQ2hlY2tRU2l6ZSgpIC0gQ2hlY2tzIHRoZSBBZGFwdGVycyBRdWV1ZSBTaXplIENvbmZpZ3VyYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gdmVyaWZpZXMgdGhlIFF1ZXVlIFNpemUgQ29uZmlndXJhdGlvbiBzcGVjaWZpZWQKKyAqCWluIHRoZSB2YXJpYWJsZXMgUFJ4UVNpemUsIFBYU1FTaXplLCBhbmQgUFhBUVNpemUgb2YgYWxsCisgKgl1c2VkIHBvcnRzLgorICoJVGhpcyByZXF1aXJlbWVudHMgbXVzdCBiZSBmdWxsZmlsbGVkIHRvIGhhdmUgYSB2YWxpZCBjb25maWd1cmF0aW9uOgorICoJCS0gVGhlIHNpemUgb2YgYWxsIHF1ZXVlcyBtdXN0IG5vdCBleGNlZWQgR0lSYW1TaXplLgorICoJCS0gVGhlIHF1ZXVlIHNpemVzIG11c3QgYmUgc3BlY2lmaWVkIGluIHVuaXRzIG9mIDgga0IuCisgKgkJLSBUaGUgc2l6ZSBvZiBSeCBxdWV1ZXMgb2YgYXZhaWxhYmxlIHBvcnRzIG11c3Qgbm90IGJlCisgKgkJICBzbWFsbGVyIHRoYW4gMTYga0IuCisgKgkJLSBUaGUgc2l6ZSBvZiBhdCBsZWFzdCBvbmUgVHggcXVldWUgKHN5bmNoLiBvciBhc3luY2guKQorICogICAgICAgIG9mIGF2YWlsYWJsZSBwb3J0cyBtdXN0IG5vdCBiZSBzbWFsbGVyIHRoYW4gMTYga0IKKyAqICAgICAgICB3aGVuIEp1bWJvIEZyYW1lcyBhcmUgdXNlZC4KKyAqCQktIFRoZSBSQU0gc3RhcnQgYW5kIGVuZCBhZGRyZXNzZXMgbXVzdCBub3QgYmUgY2hhbmdlZAorICoJCSAgZm9yIHBvcnRzIHdoaWNoIGFyZSBhbHJlYWR5IGluaXRpYWxpemVkLgorICoJRnVydGhlcm1vcmUgU2tHZUNoZWNrUVNpemUoKSBkZWZpbmVzIHRoZSBTdGFydCBhbmQgRW5kIEFkZHJlc3NlcworICogIG9mIGFsbCBwb3J0cyBhbmQgc3RvcmVzIHRoZW0gaW50byB0aGUgSFdBQyBwb3J0CXN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm5zOgorICoJMDoJUXVldWUgU2l6ZSBDb25maWd1cmF0aW9uIHZhbGlkCisgKgkxOglRdWV1ZSBTaXplIENvbmZpZ3VyYXRpb24gaW52YWxpZAorICovCitzdGF0aWMgaW50IFNrR2VDaGVja1FTaXplKAorU0tfQUMJICpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK2ludAkJIFBvcnQpCQkvKiBwb3J0IGluZGV4ICovCit7CisJU0tfR0VQT1JUICpwUHJ0OworCWludAlpOworCWludAlSdHY7CisJaW50CVJ0djI7CisJU0tfVTMyCVN0YXJ0QWRkcjsKKyNpZm5kZWYgU0tfU0xJTQorCWludAlVc2VkTWVtOwkvKiB0b3RhbCBtZW1vcnkgdXNlZCAobWF4LiBmb3VuZCBwb3J0cykgKi8KKyNlbmRpZgkKKworCVJ0diA9IDA7CisJCisjaWZuZGVmIFNLX1NMSU0KKworCVVzZWRNZW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlwUHJ0ID0gJnBBQy0+R0luaS5HUFtpXTsKKworCQlpZiAoKHBQcnQtPlBSeFFTaXplICYgUVpfVU5JVFMpICE9IDAgfHwKKwkJCShwUHJ0LT5QWFNRU2l6ZSAmIFFaX1VOSVRTKSAhPSAwIHx8CisJCQkocFBydC0+UFhBUVNpemUgJiBRWl9VTklUUykgIT0gMCkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDEyLCBTS0VSUl9IV0lfRTAxMk1TRyk7CisJCQlyZXR1cm4oMSk7CisJCX0KKworCQlpZiAoaSA9PSBQb3J0ICYmIHBQcnQtPlBSeFFTaXplIDwgU0tfTUlOX1JYUV9TSVpFKSB7CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDExLCBTS0VSUl9IV0lfRTAxMU1TRyk7CisJCQlyZXR1cm4oMSk7CisJCX0KKwkJCisJCS8qCisJCSAqIHRoZSBzaXplIG9mIGF0IGxlYXN0IG9uZSBUeCBxdWV1ZSAoc3luY2guIG9yIGFzeW5jaC4pIGhhcyB0byBiZSA+IDAuCisJCSAqIGlmIEp1bWJvIEZyYW1lcyBhcmUgdXNlZCwgdGhpcyBzaXplIGhhcyB0byBiZSA+PSAxNiBrQi4KKwkJICovCisJCWlmICgoaSA9PSBQb3J0ICYmIHBQcnQtPlBYU1FTaXplID09IDAgJiYgcFBydC0+UFhBUVNpemUgPT0gMCkgfHwKKwkJCShwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgPT0gU0tfSlVNQk9fTElOSyAmJgorICAgICAgICAgICAgKChwUHJ0LT5QWFNRU2l6ZSA+IDAgJiYgcFBydC0+UFhTUVNpemUgPCBTS19NSU5fVFhRX1NJWkUpIHx8CisJCQkgKHBQcnQtPlBYQVFTaXplID4gMCAmJiBwUHJ0LT5QWEFRU2l6ZSA8IFNLX01JTl9UWFFfU0laRSkpKSkgeworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMjMsIFNLRVJSX0hXSV9FMDIzTVNHKTsKKwkJCQlyZXR1cm4oMSk7CisJCX0KKwkJCisJCVVzZWRNZW0gKz0gcFBydC0+UFJ4UVNpemUgKyBwUHJ0LT5QWFNRU2l6ZSArIHBQcnQtPlBYQVFTaXplOworCX0KKwkKKwlpZiAoVXNlZE1lbSA+IHBBQy0+R0luaS5HSVJhbVNpemUpIHsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAxMiwgU0tFUlJfSFdJX0UwMTJNU0cpOworCQlyZXR1cm4oMSk7CisJfQorI2VuZGlmCS8qICFTS19TTElNICovCisKKwkvKiBOb3cgc3RhcnQgYWRkcmVzcyBjYWxjdWxhdGlvbiAqLworCVN0YXJ0QWRkciA9IHBBQy0+R0luaS5HSVJhbU9mZnM7CisJZm9yIChpID0gMDsgaSA8IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCXBQcnQgPSAmcEFDLT5HSW5pLkdQW2ldOworCisJCS8qIENhbGN1bGF0ZS9DaGVjayB2YWx1ZXMgZm9yIHRoZSByZWNlaXZlIHF1ZXVlICovCisJCVJ0djIgPSBEb0NhbGNBZGRyKHBBQywgcFBydCwgcFBydC0+UFJ4UVNpemUsICZTdGFydEFkZHIsCisJCQkmcFBydC0+UFJ4UVJhbVN0YXJ0LCAmcFBydC0+UFJ4UVJhbUVuZCk7CisJCVJ0diB8PSBSdHYyOworCisJCS8qIENhbGN1bGF0ZS9DaGVjayB2YWx1ZXMgZm9yIHRoZSBzeW5jaHJvbm91cyBUeCBxdWV1ZSAqLworCQlSdHYyID0gRG9DYWxjQWRkcihwQUMsIHBQcnQsIHBQcnQtPlBYU1FTaXplLCAmU3RhcnRBZGRyLAorCQkJJnBQcnQtPlBYc1FSYW1TdGFydCwgJnBQcnQtPlBYc1FSYW1FbmQpOworCQlSdHYgfD0gUnR2MjsKKworCQkvKiBDYWxjdWxhdGUvQ2hlY2sgdmFsdWVzIGZvciB0aGUgYXN5bmNocm9ub3VzIFR4IHF1ZXVlICovCisJCVJ0djIgPSBEb0NhbGNBZGRyKHBBQywgcFBydCwgcFBydC0+UFhBUVNpemUsICZTdGFydEFkZHIsCisJCQkmcFBydC0+UFhhUVJhbVN0YXJ0LCAmcFBydC0+UFhhUVJhbUVuZCk7CisJCVJ0diB8PSBSdHYyOworCisJCWlmIChSdHYpIHsKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMTMsIFNLRVJSX0hXSV9FMDEzTVNHKTsKKwkJCXJldHVybigxKTsKKwkJfQorCX0KKworCXJldHVybigwKTsKK30JLyogU2tHZUNoZWNrUVNpemUgKi8KKworCisjaWZkZWYgR0VORVNJUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJbml0TWFjQXJiKCkgLSBJbml0aWFsaXplIHRoZSBNQUMgQXJiaXRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgTUFDIEFyYml0ZXIuCisgKglJdCBtdXN0IG5vdCBiZSBjYWxsZWQgaWYgdGhlcmUgaXMgc3RpbGwgYW4KKyAqCWluaXRpYWxpemVkIG9yIGFjdGl2ZSBwb3J0LgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrR2VJbml0TWFjQXJiKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQykJCS8qIElPIGNvbnRleHQgKi8KK3sKKwkvKiByZWxlYXNlIGxvY2FsIHJlc2V0ICovCisJU0tfT1VUMTYoSW9DLCBCM19NQV9UT19DVFJMLCBNQV9SU1RfQ0xSKTsKKworCS8qIGNvbmZpZ3VyZSB0aW1lb3V0IHZhbHVlcyAqLworCVNLX09VVDgoSW9DLCBCM19NQV9UT0lOSV9SWDEsIFNLX01BQ19UT181Myk7CisJU0tfT1VUOChJb0MsIEIzX01BX1RPSU5JX1JYMiwgU0tfTUFDX1RPXzUzKTsKKwlTS19PVVQ4KElvQywgQjNfTUFfVE9JTklfVFgxLCBTS19NQUNfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19NQV9UT0lOSV9UWDIsIFNLX01BQ19UT181Myk7CisKKwlTS19PVVQ4KElvQywgQjNfTUFfUkNJTklfUlgxLCAwKTsKKwlTS19PVVQ4KElvQywgQjNfTUFfUkNJTklfUlgyLCAwKTsKKwlTS19PVVQ4KElvQywgQjNfTUFfUkNJTklfVFgxLCAwKTsKKwlTS19PVVQ4KElvQywgQjNfTUFfUkNJTklfVFgyLCAwKTsKKworCS8qIHJlY292ZXJ5IHZhbHVlcyBhcmUgbmVlZGVkIGZvciBYTUFDIElJIFJldi4gQjIgb25seSAqLworCS8qIEZhc3QgT3V0cHV0IEVuYWJsZSBNb2RlIHdhcyBpbnRlbmRlZCB0byB1c2Ugd2l0aCBSZXYuIEIyLCBidXQgbm93PyAqLworCisJLyoKKwkgKiBUaGVyZSBpcyBubyBzdGFydCBvciBlbmFibGUgYnV0dG9uIHRvIHB1c2gsIHRoZXJlZm9yZQorCSAqIHRoZSBNQUMgYXJiaXRlciBpcyBjb25maWd1cmVkIGFuZCBlbmFibGVkIG5vdy4KKwkgKi8KK30JLyogU2tHZUluaXRNYWNBcmIgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXRQa3RBcmIoKSAtIEluaXRpYWxpemUgdGhlIFBhY2tldCBBcmJpdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBQYWNrZXQgQXJiaXRlci4KKyAqCUl0IG11c3Qgbm90IGJlIGNhbGxlZCBpZiB0aGVyZSBpcyBzdGlsbCBhbgorICoJaW5pdGlhbGl6ZWQgb3IgYWN0aXZlIHBvcnQuCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgU2tHZUluaXRQa3RBcmIoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DKQkJLyogSU8gY29udGV4dCAqLworeworCS8qIHJlbGVhc2UgbG9jYWwgcmVzZXQgKi8KKwlTS19PVVQxNihJb0MsIEIzX1BBX0NUUkwsIFBBX1JTVF9DTFIpOworCisJLyogY29uZmlndXJlIHRpbWVvdXQgdmFsdWVzICovCisJU0tfT1VUMTYoSW9DLCBCM19QQV9UT0lOSV9SWDEsIFNLX1BLVF9UT19NQVgpOworCVNLX09VVDE2KElvQywgQjNfUEFfVE9JTklfUlgyLCBTS19QS1RfVE9fTUFYKTsKKwlTS19PVVQxNihJb0MsIEIzX1BBX1RPSU5JX1RYMSwgU0tfUEtUX1RPX01BWCk7CisJU0tfT1VUMTYoSW9DLCBCM19QQV9UT0lOSV9UWDIsIFNLX1BLVF9UT19NQVgpOworCisJLyoKKwkgKiBlbmFibGUgdGltZW91dCB0aW1lcnMgaWYganVtYm8gZnJhbWVzIG5vdCB1c2VkCisJICogTk9URTogdGhlIHBhY2tldCBhcmJpdGVyIHRpbWVvdXQgaW50ZXJydXB0IGlzIG5lZWRlZCBmb3IKKwkgKiBoYWxmIGR1cGxleCBoYW5ndXAgd29ya2Fyb3VuZAorCSAqLworCWlmIChwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgIT0gU0tfSlVNQk9fTElOSykgeworCQlpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDEpIHsKKwkJCVNLX09VVDE2KElvQywgQjNfUEFfQ1RSTCwgUEFfRU5BX1RPX1RYMSk7CisJCX0KKwkJZWxzZSB7CisJCQlTS19PVVQxNihJb0MsIEIzX1BBX0NUUkwsIFBBX0VOQV9UT19UWDEgfCBQQV9FTkFfVE9fVFgyKTsKKwkJfQorCX0KK30JLyogU2tHZUluaXRQa3RBcmIgKi8KKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJbml0TWFjRmlmbygpIC0gSW5pdGlhbGl6ZSB0aGUgTUFDIEZJRk9zCisgKgorICogRGVzY3JpcHRpb246CisgKglJbml0aWFsaXplIGFsbCBNQUMgRklGT3Mgb2YgdGhlIHNwZWNpZmllZCBwb3J0CisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgU2tHZUluaXRNYWNGaWZvKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19VMTYJV29yZDsKKyNpZmRlZiBWQ1BVCisJU0tfVTMyCURXb3JkOworI2VuZGlmIC8qIFZDUFUgKi8KKwkvKgorCSAqIEZvciBlYWNoIEZJRk86CisJICoJLSByZWxlYXNlIGxvY2FsIHJlc2V0CisJICoJLSB1c2UgZGVmYXVsdCB2YWx1ZSBmb3IgTUFDIEZJRk8gc2l6ZQorCSAqCS0gc2V0dXAgZGVmYXVsdHMgZm9yIHRoZSBjb250cm9sIHJlZ2lzdGVyCisJICoJLSBlbmFibGUgdGhlIEZJRk8KKwkgKi8KKwkKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJLyogQ29uZmlndXJlIFJ4IE1BQyBGSUZPICovCisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFJYX01GRl9DVFJMMiksIE1GRl9SU1RfQ0xSKTsKKwkJU0tfT1VUMTYoSW9DLCBNUl9BRERSKFBvcnQsIFJYX01GRl9DVFJMMSksIE1GRl9SWF9DVFJMX0RFRik7CisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFJYX01GRl9DVFJMMiksIE1GRl9FTkFfT1BfTUQpOworCQorCQkvKiBDb25maWd1cmUgVHggTUFDIEZJRk8gKi8KKwkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhfTUZGX0NUUkwyKSwgTUZGX1JTVF9DTFIpOworCQlTS19PVVQxNihJb0MsIE1SX0FERFIoUG9ydCwgVFhfTUZGX0NUUkwxKSwgTUZGX1RYX0NUUkxfREVGKTsKKwkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhfTUZGX0NUUkwyKSwgTUZGX0VOQV9PUF9NRCk7CisJCisJCS8qIEVuYWJsZSBmcmFtZSBmbHVzaGluZyBpZiBqdW1ibyBmcmFtZXMgdXNlZCAqLworCQlpZiAocEFDLT5HSW5pLkdJUG9ydFVzYWdlID09IFNLX0pVTUJPX0xJTkspIHsKKwkJCVNLX09VVDE2KElvQywgTVJfQUREUihQb3J0LCBSWF9NRkZfQ1RSTDEpLCBNRkZfRU5BX0ZMVVNIKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJLyogc2V0IFJ4IEdNQUMgRklGTyBGbHVzaCBNYXNrICovCisJCVNLX09VVDE2KElvQywgTVJfQUREUihQb3J0LCBSWF9HTUZfRkxfTVNLKSwgKFNLX1UxNilSWF9GRl9GTF9ERUZfTVNLKTsKKwkJCisJCVdvcmQgPSAoU0tfVTE2KUdNRl9SWF9DVFJMX0RFRjsKKworCQkvKiBkaXNhYmxlIFJ4IEdNQUMgRklGTyBGbHVzaCBmb3IgWVVLT04tTGl0ZSBSZXYuIEEwIG9ubHkgKi8KKwkJaWYgKHBBQy0+R0luaS5HSVl1a29uTGl0ZSAmJiBwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9ZVUtPTikgeworCisJCQlXb3JkICY9IH5HTUZfUlhfRl9GTF9PTjsKKwkJfQorCQkKKwkJLyogQ29uZmlndXJlIFJ4IE1BQyBGSUZPICovCisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFJYX0dNRl9DVFJMX1QpLCAoU0tfVTgpR01GX1JTVF9DTFIpOworCQlTS19PVVQxNihJb0MsIE1SX0FERFIoUG9ydCwgUlhfR01GX0NUUkxfVCksIFdvcmQpOworCQkKKwkJLyogc2V0IFJ4IEdNQUMgRklGTyBGbHVzaCBUaHJlc2hvbGQgKGRlZmF1bHQ6IDB4MGEgLT4gNTYgYnl0ZXMpICovCisJCVNLX09VVDE2KElvQywgTVJfQUREUihQb3J0LCBSWF9HTUZfRkxfVEhSKSwgUlhfR01GX0ZMX1RIUl9ERUYpOworCQkKKwkJLyogQ29uZmlndXJlIFR4IE1BQyBGSUZPICovCisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFRYX0dNRl9DVFJMX1QpLCAoU0tfVTgpR01GX1JTVF9DTFIpOworCQlTS19PVVQxNihJb0MsIE1SX0FERFIoUG9ydCwgVFhfR01GX0NUUkxfVCksIChTS19VMTYpR01GX1RYX0NUUkxfREVGKTsKKwkJCisjaWZkZWYgVkNQVQorCQlTS19JTjMyKElvQywgTVJfQUREUihQb3J0LCBSWF9HTUZfQUZfVEhSKSwgJkRXb3JkKTsKKwkJU0tfSU4zMihJb0MsIE1SX0FERFIoUG9ydCwgVFhfR01GX0FFX1RIUiksICZEV29yZCk7CisjZW5kaWYgLyogVkNQVSAqLworCQkKKwkJLyogc2V0IFR4IEdNQUMgRklGTyBBbG1vc3QgRW1wdHkgVGhyZXNob2xkICovCisvKgkJU0tfT1VUMzIoSW9DLCBNUl9BRERSKFBvcnQsIFRYX0dNRl9BRV9USFIpLCAwKTsgKi8KKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworfQkvKiBTa0dlSW5pdE1hY0ZpZm8gKi8KKworI2lmZGVmCVNLX0xOS19TWU5DX0NOVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VMb2FkTG5rU3luY0NudCgpIC0gTG9hZCB0aGUgTGluayBTeW5jIENvdW50ZXIgYW5kIHN0YXJ0cyBjb3VudGluZworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBzdGFydHMgdGhlIExpbmsgU3luYyBDb3VudGVyIG9mIHRoZSBzcGVjaWZpZWQKKyAqCXBvcnQgYW5kIGVuYWJsZXMgdGhlIGdlbmVyYXRpb24gb2YgYW4gTGluayBTeW5jIElSUS4KKyAqCVRoZSBMaW5rIFN5bmMgQ291bnRlciBtYXkgYmUgdXNlZCB0byBkZXRlY3QgYW4gYWN0aXZlIGxpbmssCisgKglpZiBhdXRvbmVnb3RpYXRpb24gaXMgbm90IHVzZWQuCisgKgorICogTm90ZToKKyAqCW8gVG8gZW5zdXJlIHJlY2VpdmluZyB0aGUgTGluayBTeW5jIEV2ZW50IHRoZSBMaW5rU3luY0NvdW50ZXIKKyAqCSAgc2hvdWxkIGJlIGluaXRpYWxpemVkIEJFRk9SRSBjbGVhcmluZyB0aGUgWE1BQydzIHJlc2V0IQorICoJbyBFbmFibGUgSVNfTE5LX1NZTkNfTTEgYW5kIElTX0xOS19TWU5DX00yIGFmdGVyIGNhbGxpbmcgdGhpcworICoJICBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VMb2FkTG5rU3luY0NudCgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19VMzIJQ250VmFsKQkJLyogQ291bnRlciB2YWx1ZSAqLworeworCVNLX1UzMglPcmdJTXNrOworCVNLX1UzMglOZXdJTXNrOworCVNLX1UzMglJU3JjOworCVNLX0JPT0wJSXJxUGVuZDsKKworCS8qIHN0b3AgY291bnRlciAqLworCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIExOS19TWU5DX0NUUkwpLCBMRURfU1RPUCk7CisKKwkvKgorCSAqIEFTSUMgcHJvYmxlbToKKwkgKiBFYWNoIHRpbWUgc3RhcnRpbmcgdGhlIExpbmsgU3luYyBDb3VudGVyIGFuIElSUSBpcyBnZW5lcmF0ZWQKKwkgKiBieSB0aGUgYWRhcHRlci4gU2VlIHByb2JsZW0gcmVwb3J0IGVudHJ5IGZyb20gMjEuMDcuOTgKKwkgKgorCSAqIFdvcmthcm91bmQ6CURpc2FibGUgTGluayBTeW5jIElSUSBhbmQgY2xlYXIgdGhlIHVuZXhwZWNlZCBJUlEKKwkgKgkJaWYgbm8gSVJRIGlzIGFscmVhZHkgcGVuZGluZy4KKwkgKi8KKwlJcnFQZW5kID0gU0tfRkFMU0U7CisJU0tfSU4zMihJb0MsIEIwX0lTUkMsICZJU3JjKTsKKwlTS19JTjMyKElvQywgQjBfSU1TSywgJk9yZ0lNc2spOworCWlmIChQb3J0ID09IE1BQ18xKSB7CisJCU5ld0lNc2sgPSBPcmdJTXNrICYgfklTX0xOS19TWU5DX00xOworCQlpZiAoKElTcmMgJiBJU19MTktfU1lOQ19NMSkgIT0gMCkgeworCQkJSXJxUGVuZCA9IFNLX1RSVUU7CisJCX0KKwl9CisJZWxzZSB7CisJCU5ld0lNc2sgPSBPcmdJTXNrICYgfklTX0xOS19TWU5DX00yOworCQlpZiAoKElTcmMgJiBJU19MTktfU1lOQ19NMikgIT0gMCkgeworCQkJSXJxUGVuZCA9IFNLX1RSVUU7CisJCX0KKwl9CisJaWYgKCFJcnFQZW5kKSB7CisJCVNLX09VVDMyKElvQywgQjBfSU1TSywgTmV3SU1zayk7CisJfQorCisJLyogbG9hZCBjb3VudGVyICovCisJU0tfT1VUMzIoSW9DLCBNUl9BRERSKFBvcnQsIExOS19TWU5DX0lOSSksIENudFZhbCk7CisKKwkvKiBzdGFydCBjb3VudGVyICovCisJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgTE5LX1NZTkNfQ1RSTCksIExFRF9TVEFSVCk7CisKKwlpZiAoIUlycVBlbmQpIHsKKwkJLyogY2xlYXIgdGhlIHVuZXhwZWN0ZWQgSVJRLCBhbmQgcmVzdG9yZSB0aGUgaW50ZXJydXB0IG1hc2sgKi8KKwkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgTE5LX1NZTkNfQ1RSTCksIExFRF9DTFJfSVJRKTsKKwkJU0tfT1VUMzIoSW9DLCBCMF9JTVNLLCBPcmdJTXNrKTsKKwl9Cit9CS8qIFNrR2VMb2FkTG5rU3luY0NudCovCisjZW5kaWYJLyogU0tfTE5LX1NZTkNfQ05UICovCisKKyNpZiBkZWZpbmVkKFNLX0RJQUcpIHx8IGRlZmluZWQoU0tfQ0ZHX1NZTkMpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUNmZ1N5bmMoKSAtIENvbmZpZ3VyZSBzeW5jaHJvbm91cyBiYW5kd2lkdGggZm9yIHRoaXMgcG9ydC4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gY29uZmlndXJlIHN5bmNocm9ub3VzIGJhbmR3aWR0aAorICoJdG8gdGhlIHNwZWNpZmllZCBwb3J0LiBUaGlzIG1heSBiZSBkb25lIGFueSB0aW1lIGFmdGVyCisgKglpbml0aWFsaXppbmcgdGhlIHBvcnQuIFRoZSBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmUgTk9UIHNhdmVkCisgKglpbiB0aGUgSFdBQyBwb3J0IHN0cnVjdHVyZSBhbmQgd2lsbCBiZSBvdmVyd3JpdHRlbiBhbnkKKyAqCXRpbWUgd2hlbiBzdG9wcGluZyBhbmQgc3RhcnRpbmcgdGhlIHBvcnQuCisgKglBbnkgdmFsdWVzIGZvciB0aGUgc3luY2hyb25vdXMgY29uZmlndXJhdGlvbiB3aWxsIGJlIGlnbm9yZWQKKyAqCWlmIHRoZSBzaXplIG9mIHRoZSBzeW5jaHJvbm91cyBxdWV1ZSBpcyB6ZXJvIQorICoKKyAqCVRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzeW5jaHJvbm91cyBzZXJ2aWNlIGlzCisgKglUWEFfRU5BX0ZTWU5DLiBUaGlzIG1lYW5zIGlmIHRoZSBzaXplIG9mCisgKgl0aGUgc3luY2hyb25vdXMgcXVldWUgaXMgdW5lcXVhbCB6ZXJvIGJ1dCBubyBzcGVjaWZpYworICoJc3luY2hyb25vdXMgYmFuZHdpZHRoIGlzIGNvbmZpZ3VyZWQsIHRoZSBzeW5jaHJvbm91cyBxdWV1ZQorICoJd2lsbCBhbHdheXMgaGF2ZSB0aGUgJ3VubGltaXRlZCcgdHJhbnNtaXQgcHJpb3JpdHkhCisgKgorICoJVGhpcyBtb2RlIHdpbGwgYmUgcmVzdG9yZWQgaWYgdGhlIHN5bmNocm9ub3VzIGJhbmR3aWR0aCBpcworICoJZGVhbGxvY2F0ZWQgKCdJbnRUaW1lJyA9IDAgYW5kICdMaW1Db3VudCcgPSAwKS4KKyAqCisgKiBSZXR1cm5zOgorICoJMDoJc3VjY2VzcworICoJMToJcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb24gZXJyb3IKKyAqCTI6CXRyeSB0byBjb25maWd1cmUgcXVhbGl0eSBvZiBzZXJ2aWNlIGFsdGhvdWdoIG5vCisgKgkJc3luY2hyb25vdXMgcXVldWUgaXMgY29uZmlndXJlZAorICovCitpbnQgU2tHZUNmZ1N5bmMoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfVTMyCUludFRpbWUsCS8qIEludGVydmFsIFRpbWVyIFZhbHVlIGluIHVuaXRzIG9mIDhucyAqLworU0tfVTMyCUxpbUNvdW50LAkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIgZHVyaW5nIEludFRpbWUgKi8KK2ludAkJU3luY01vZGUpCS8qIFN5bmMgTW9kZTogVFhBX0VOQV9BTExPQyB8IFRYQV9ESVNfQUxMT0MgfCAwICovCit7CisJaW50IFJ0djsKKworCVJ0diA9IDA7CisKKwkvKiBjaGVjayB0aGUgcGFyYW1ldGVycyAqLworCWlmIChMaW1Db3VudCA+IEludFRpbWUgfHwKKwkJKExpbUNvdW50ID09IDAgJiYgSW50VGltZSAhPSAwKSB8fAorCQkoTGltQ291bnQgIT0gMCAmJiBJbnRUaW1lID09IDApKSB7CisKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAxMCwgU0tFUlJfSFdJX0UwMTBNU0cpOworCQlyZXR1cm4oMSk7CisJfQorCQorCWlmIChwQUMtPkdJbmkuR1BbUG9ydF0uUFhTUVNpemUgPT0gMCkgeworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDA5LCBTS0VSUl9IV0lfRTAwOU1TRyk7CisJCXJldHVybigyKTsKKwl9CisJCisJLyogY2FsY3VsYXRlIHJlZ2lzdGVyIHZhbHVlcyAqLworCUludFRpbWUgPSAoSW50VGltZSAvIDIpICogcEFDLT5HSW5pLkdJSHN0Q2xrRmFjdCAvIDEwMDsKKwlMaW1Db3VudCA9IExpbUNvdW50IC8gODsKKwkKKwlpZiAoSW50VGltZSA+IFRYQV9NQVhfVkFMIHx8IExpbUNvdW50ID4gVFhBX01BWF9WQUwpIHsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAxMCwgU0tFUlJfSFdJX0UwMTBNU0cpOworCQlyZXR1cm4oMSk7CisJfQorCisJLyoKKwkgKiAtIEVuYWJsZSAnRm9yY2UgU3luYycgdG8gZW5zdXJlIHRoZSBzeW5jaHJvbm91cyBxdWV1ZQorCSAqICAgaGFzIHRoZSBwcmlvcml0eSB3aGlsZSBjb25maWd1cmluZyB0aGUgbmV3IHZhbHVlcy4KKwkgKiAtIEFsc28gJ2Rpc2FibGUgYWxsb2MnIHRvIGVuc3VyZSB0aGUgc2V0dGluZ3MgY29tcGxpZXMKKwkgKiAgIHRvIHRoZSBTeW5jTW9kZSBwYXJhbWV0ZXIuCisJICogLSBEaXNhYmxlICdSYXRlIENvbnRyb2wnIHRvIGNvbmZpZ3VyZSB0aGUgbmV3IHZhbHVlcy4KKwkgKiAtIHdyaXRlIEludFRpbWUgYW5kIExpbUNvdW50CisJICogLSBzdGFydCAnUmF0ZSBDb250cm9sJyBhbmQgZGlzYWJsZSAnRm9yY2UgU3luYycKKwkgKiAgIGlmIEludGVydmFsIFRpbWVyIG9yIExpbWl0IENvdW50ZXIgbm90IHplcm8uCisJICovCisJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0NUUkwpLAorCQlUWEFfRU5BX0ZTWU5DIHwgVFhBX0RJU19BTExPQyB8IFRYQV9TVE9QX1JDKTsKKwkKKwlTS19PVVQzMihJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0lUSV9JTkkpLCBJbnRUaW1lKTsKKwlTS19PVVQzMihJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0xJTV9JTkkpLCBMaW1Db3VudCk7CisJCisJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0NUUkwpLAorCQkoU0tfVTgpKFN5bmNNb2RlICYgKFRYQV9FTkFfQUxMT0MgfCBUWEFfRElTX0FMTE9DKSkpOworCQorCWlmIChJbnRUaW1lICE9IDAgfHwgTGltQ291bnQgIT0gMCkgeworCQlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBUWEFfQ1RSTCksIFRYQV9ESVNfRlNZTkMgfCBUWEFfU1RBUlRfUkMpOworCX0KKworCXJldHVybigwKTsKK30JLyogU2tHZUNmZ1N5bmMgKi8KKyNlbmRpZiAvKiBTS19ESUFHIHx8IFNLX0NGR19TWU5DKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRG9Jbml0UmFtUXVldWUoKSAtIEluaXRpYWxpemUgdGhlIFJBTSBCdWZmZXIgQWRkcmVzcyBvZiBhIHNpbmdsZSBRdWV1ZQorICoKKyAqIERlc2NjcmlwdGlvbjoKKyAqCUlmIHRoZSBxdWV1ZSBpcyB1c2VkLCBlbmFibGUgYW5kIGluaXRpYWxpemUgaXQuCisgKglNYWtlIHN1cmUgdGhlIHF1ZXVlIGlzIHN0aWxsIHJlc2V0LCBpZiBpdCBpcyBub3QgdXNlZC4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBEb0luaXRSYW1RdWV1ZSgKK1NLX0FDCSpwQUMsCQkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUXVJb09mZnMsCQkvKiBRdWV1ZSBJTyBBZGRyZXNzIE9mZnNldCAqLworU0tfVTMyCVF1U3RhcnRBZGRyLAkvKiBRdWV1ZSBTdGFydCBBZGRyZXNzICovCitTS19VMzIJUXVFbmRBZGRyLAkJLyogUXVldWUgRW5kIEFkZHJlc3MgKi8KK2ludAkJUXVUeXBlKQkJCS8qIFF1ZXVlIFR5cGUgKFNLX1JYX1NSQU1fUXxTS19SWF9CUkFNX1F8U0tfVFhfUkFNX1EpICovCit7CisJU0tfVTMyCVJ4VXBUaHJlc1ZhbDsKKwlTS19VMzIJUnhMb1RocmVzVmFsOworCisJaWYgKFF1U3RhcnRBZGRyICE9IFF1RW5kQWRkcikgeworCQkvKiBjYWxjdWxhdGUgdGhyZXNob2xkcywgYXNzdW1lIHdlIGhhdmUgYSBiaWcgUnggcXVldWUgKi8KKwkJUnhVcFRocmVzVmFsID0gKFF1RW5kQWRkciArIDEgLSBRdVN0YXJ0QWRkciAtIFNLX1JCX1VMUFApIC8gODsKKwkJUnhMb1RocmVzVmFsID0gKFF1RW5kQWRkciArIDEgLSBRdVN0YXJ0QWRkciAtIFNLX1JCX0xMUFBfQikvODsKKworCQkvKiBidWlsZCBIVyBhZGRyZXNzIGZvcm1hdCAqLworCQlRdVN0YXJ0QWRkciA9IFF1U3RhcnRBZGRyIC8gODsKKwkJUXVFbmRBZGRyID0gUXVFbmRBZGRyIC8gODsKKworCQkvKiByZWxlYXNlIGxvY2FsIHJlc2V0ICovCisJCVNLX09VVDgoSW9DLCBSQl9BRERSKFF1SW9PZmZzLCBSQl9DVFJMKSwgUkJfUlNUX0NMUik7CisKKwkJLyogY29uZmlndXJlIGFkZHJlc3NlcyAqLworCQlTS19PVVQzMihJb0MsIFJCX0FERFIoUXVJb09mZnMsIFJCX1NUQVJUKSwgUXVTdGFydEFkZHIpOworCQlTS19PVVQzMihJb0MsIFJCX0FERFIoUXVJb09mZnMsIFJCX0VORCksIFF1RW5kQWRkcik7CisJCVNLX09VVDMyKElvQywgUkJfQUREUihRdUlvT2ZmcywgUkJfV1ApLCBRdVN0YXJ0QWRkcik7CisJCVNLX09VVDMyKElvQywgUkJfQUREUihRdUlvT2ZmcywgUkJfUlApLCBRdVN0YXJ0QWRkcik7CisKKwkJc3dpdGNoIChRdVR5cGUpIHsKKwkJY2FzZSBTS19SWF9TUkFNX1E6CisJCQkvKiBjb25maWd1cmUgdGhyZXNob2xkIGZvciBzbWFsbCBSeCBRdWV1ZSAqLworCQkJUnhMb1RocmVzVmFsICs9IChTS19SQl9MTFBQX0IgLSBTS19SQl9MTFBQX1MpIC8gODsKKworCQkJLyogY29udGludWUgd2l0aCBTS19SWF9CUkFNX1EgKi8KKwkJY2FzZSBTS19SWF9CUkFNX1E6CisJCQkvKiB3cml0ZSB0aHJlc2hvbGQgZm9yIFJ4IFF1ZXVlICovCisKKwkJCVNLX09VVDMyKElvQywgUkJfQUREUihRdUlvT2ZmcywgUkJfUlhfVVRQUCksIFJ4VXBUaHJlc1ZhbCk7CisJCQlTS19PVVQzMihJb0MsIFJCX0FERFIoUXVJb09mZnMsIFJCX1JYX0xUUFApLCBSeExvVGhyZXNWYWwpOworCisJCQkvKiB0aGUgaGlnaCBwcmlvcml0eSB0aHJlc2hvbGQgbm90IHVzZWQgKi8KKwkJCWJyZWFrOworCQljYXNlIFNLX1RYX1JBTV9ROgorCQkJLyoKKwkJCSAqIERvIE5PVCB1c2UgU3RvcmUgJiBGb3J3YXJkIHVuZGVyIG5vcm1hbCBvcGVyYXRpb24gZHVlIHRvCisJCQkgKiBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gKEdFTkVTSVMgb25seSkuCisJCQkgKiBCdXQgaWYgSnVtYm8gRnJhbWVzIGFyZSBjb25maWd1cmVkIChYTUFDIFR4IEZJRk8gaXMgb25seSA0IGtCKQorCQkJICogb3IgWVVLT04gaXMgdXNlZCAoKEdNQUMgVHggRklGTyBpcyBvbmx5IDEga0IpCisJCQkgKiB3ZSBORUVEIFN0b3JlICYgRm9yd2FyZCBvZiB0aGUgUkFNIGJ1ZmZlci4KKwkJCSAqLworCQkJaWYgKHBBQy0+R0luaS5HSVBvcnRVc2FnZSA9PSBTS19KVU1CT19MSU5LIHx8CisJCQkJcEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCQkvKiBlbmFibGUgU3RvcmUgJiBGb3J3YXJkIE1vZGUgZm9yIHRoZSBUeCBTaWRlICovCisJCQkJU0tfT1VUOChJb0MsIFJCX0FERFIoUXVJb09mZnMsIFJCX0NUUkwpLCBSQl9FTkFfU1RGV0QpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvKiBzZXQgcXVldWUgb3BlcmF0aW9uYWwgKi8KKwkJU0tfT1VUOChJb0MsIFJCX0FERFIoUXVJb09mZnMsIFJCX0NUUkwpLCBSQl9FTkFfT1BfTUQpOworCX0KKwllbHNlIHsKKwkJLyogZW5zdXJlIHRoZSBxdWV1ZSBpcyBzdGlsbCBkaXNhYmxlZCAqLworCQlTS19PVVQ4KElvQywgUkJfQUREUihRdUlvT2ZmcywgUkJfQ1RSTCksIFJCX1JTVF9TRVQpOworCX0KK30JLyogRG9Jbml0UmFtUXVldWUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXRSYW1CdWZzKCkgLSBJbml0aWFsaXplIHRoZSBSQU0gQnVmZmVyIFF1ZXVlcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJSW5pdGlhbGl6ZSBhbGwgUkFNIEJ1ZmZlciBRdWV1ZXMgb2YgdGhlIHNwZWNpZmllZCBwb3J0CisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgU2tHZUluaXRSYW1CdWZzKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQgKnBQcnQ7CisJaW50IFJ4UVR5cGU7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCWlmIChwUHJ0LT5QUnhRU2l6ZSA9PSBTS19NSU5fUlhRX1NJWkUpIHsKKwkJUnhRVHlwZSA9IFNLX1JYX1NSQU1fUTsgCS8qIHNtYWxsIFJ4IFF1ZXVlICovCisJfQorCWVsc2UgeworCQlSeFFUeXBlID0gU0tfUlhfQlJBTV9ROwkJLyogYmlnIFJ4IFF1ZXVlICovCisJfQorCisJRG9Jbml0UmFtUXVldWUocEFDLCBJb0MsIHBQcnQtPlBSeFFPZmYsIHBQcnQtPlBSeFFSYW1TdGFydCwKKwkJcFBydC0+UFJ4UVJhbUVuZCwgUnhRVHlwZSk7CisJCisJRG9Jbml0UmFtUXVldWUocEFDLCBJb0MsIHBQcnQtPlBYc1FPZmYsIHBQcnQtPlBYc1FSYW1TdGFydCwKKwkJcFBydC0+UFhzUVJhbUVuZCwgU0tfVFhfUkFNX1EpOworCQorCURvSW5pdFJhbVF1ZXVlKHBBQywgSW9DLCBwUHJ0LT5QWGFRT2ZmLCBwUHJ0LT5QWGFRUmFtU3RhcnQsCisJCXBQcnQtPlBYYVFSYW1FbmQsIFNLX1RYX1JBTV9RKTsKKworfQkvKiBTa0dlSW5pdFJhbUJ1ZnMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXRSYW1JZmFjZSgpIC0gSW5pdGlhbGl6ZSB0aGUgUkFNIEludGVyZmFjZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgQWRhcHRlcnMgUkFNIEludGVyZmFjZS4KKyAqCisgKiBOb3RlOgorICoJVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIHRoZSBkaWFnbm9zdGljcy4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VJbml0UmFtSWZhY2UoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DKQkJLyogSU8gY29udGV4dCAqLworeworCS8qIHJlbGVhc2UgbG9jYWwgcmVzZXQgKi8KKwlTS19PVVQxNihJb0MsIEIzX1JJX0NUUkwsIFJJX1JTVF9DTFIpOworCisJLyogY29uZmlndXJlIHRpbWVvdXQgdmFsdWVzICovCisJU0tfT1VUOChJb0MsIEIzX1JJX1dUT19SMSwgU0tfUklfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19SSV9XVE9fWEExLCBTS19SSV9UT181Myk7CisJU0tfT1VUOChJb0MsIEIzX1JJX1dUT19YUzEsIFNLX1JJX1RPXzUzKTsKKwlTS19PVVQ4KElvQywgQjNfUklfUlRPX1IxLCBTS19SSV9UT181Myk7CisJU0tfT1VUOChJb0MsIEIzX1JJX1JUT19YQTEsIFNLX1JJX1RPXzUzKTsKKwlTS19PVVQ4KElvQywgQjNfUklfUlRPX1hTMSwgU0tfUklfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19SSV9XVE9fUjIsIFNLX1JJX1RPXzUzKTsKKwlTS19PVVQ4KElvQywgQjNfUklfV1RPX1hBMiwgU0tfUklfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19SSV9XVE9fWFMyLCBTS19SSV9UT181Myk7CisJU0tfT1VUOChJb0MsIEIzX1JJX1JUT19SMiwgU0tfUklfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19SSV9SVE9fWEEyLCBTS19SSV9UT181Myk7CisJU0tfT1VUOChJb0MsIEIzX1JJX1JUT19YUzIsIFNLX1JJX1RPXzUzKTsKKworfQkvKiBTa0dlSW5pdFJhbUlmYWNlICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJbml0Qm11KCkgLSBJbml0aWFsaXplIHRoZSBCTVUgc3RhdGUgbWFjaGluZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUluaXRpYWxpemUgYWxsIEJNVSBzdGF0ZSBtYWNoaW5lcyBvZiB0aGUgc3BlY2lmaWVkIHBvcnQKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa0dlSW5pdEJtdSgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworCVNLX1UzMgkJUnhXbTsKKwlTS19VMzIJCVR4V207CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCVJ4V20gPSBTS19CTVVfUlhfV007CisJVHhXbSA9IFNLX0JNVV9UWF9XTTsKKwkKKwlpZiAoIXBBQy0+R0luaS5HSVBjaVNsb3Q2NCAmJiAhcEFDLT5HSW5pLkdJUGNpQ2xvY2s2NikgeworCQkvKiBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlICovCisJCVJ4V20gLz0gMjsKKwkJVHhXbSAvPSAyOworCX0KKworCS8qIFJ4IFF1ZXVlOiBSZWxlYXNlIGFsbCBsb2NhbCByZXNldHMgYW5kIHNldCB0aGUgd2F0ZXJtYXJrICovCisJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFJ4UU9mZiwgUV9DU1IpLCBDU1JfQ0xSX1JFU0VUKTsKKwlTS19PVVQzMihJb0MsIFFfQUREUihwUHJ0LT5QUnhRT2ZmLCBRX0YpLCBSeFdtKTsKKworCS8qCisJICogVHggUXVldWU6IFJlbGVhc2UgYWxsIGxvY2FsIHJlc2V0cyBpZiB0aGUgcXVldWUgaXMgdXNlZCAhCisJICogCQlzZXQgd2F0ZXJtYXJrCisJICovCisJaWYgKHBQcnQtPlBYU1FTaXplICE9IDApIHsKKwkJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFhzUU9mZiwgUV9DU1IpLCBDU1JfQ0xSX1JFU0VUKTsKKwkJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFhzUU9mZiwgUV9GKSwgVHhXbSk7CisJfQorCQorCWlmIChwUHJ0LT5QWEFRU2l6ZSAhPSAwKSB7CisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYYVFPZmYsIFFfQ1NSKSwgQ1NSX0NMUl9SRVNFVCk7CisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYYVFPZmYsIFFfRiksIFR4V20pOworCX0KKwkvKgorCSAqIERvIE5PVCBlbmFibGUgdGhlIGRlc2NyaXB0b3IgcG9sbCB0aW1lcnMgaGVyZSwgYmVjYXVzZQorCSAqIHRoZSBkZXNjcmlwdG9yIGFkZHJlc3NlcyBhcmUgbm90IHNwZWNpZmllZCB5ZXQuCisJICovCit9CS8qIFNrR2VJbml0Qm11ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVRlc3RTdG9wQml0KCkgLQlUZXN0IHRoZSBzdG9wIGJpdCBvZiB0aGUgcXVldWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVN0b3BwaW5nIGEgcXVldWUgaXMgbm90IGFzIHNpbXBsZSBhcyBpdCBzZWVtcyB0byBiZS4KKyAqCUlmIGRlc2NyaXB0b3IgcG9sbGluZyBpcyBlbmFibGVkLCBpdCBtYXkgaGFwcGVuCisgKgl0aGF0IFJYL1RYIHN0b3AgaXMgZG9uZSBhbmQgU1YgaWRsZSBpcyBOT1Qgc2V0LgorICoJSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gaXNzdWUgYW5vdGhlciBzdG9wIGNvbW1hbmQuCisgKgorICogUmV0dXJuczoKKyAqCVRoZSBxdWV1ZXMgY29udHJvbCBzdGF0dXMgcmVnaXN0ZXIKKyAqLworc3RhdGljIFNLX1UzMiBUZXN0U3RvcEJpdCgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBDb250ZXh0ICovCitpbnQJCVF1SW9PZmZzKQkvKiBRdWV1ZSBJTyBBZGRyZXNzIE9mZnNldCAqLworeworCVNLX1UzMglRdUNzcjsJLyogQ1NSIGNvbnRlbnRzICovCisKKwlTS19JTjMyKElvQywgUV9BRERSKFF1SW9PZmZzLCBRX0NTUiksICZRdUNzcik7CisJCisJaWYgKChRdUNzciAmIChDU1JfU1RPUCB8IENTUl9TVl9JRExFKSkgPT0gMCkgeworCQkvKiBTdG9wIERlc2NyaXB0b3Igb3ZlcnJpZGRlbiBieSBzdGFydCBjb21tYW5kICovCisJCVNLX09VVDMyKElvQywgUV9BRERSKFF1SW9PZmZzLCBRX0NTUiksIENTUl9TVE9QKTsKKworCQlTS19JTjMyKElvQywgUV9BRERSKFF1SW9PZmZzLCBRX0NTUiksICZRdUNzcik7CisJfQorCQorCXJldHVybihRdUNzcik7Cit9CS8qIFRlc3RTdG9wQml0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VTdG9wUG9ydCgpIC0gU3RvcCB0aGUgUngvVHggYWN0aXZpdHkgb2YgdGhlIHBvcnQgJ1BvcnQnLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRoZSBkZXNjcmlwdG9yIHJpbmdzIGFuZCBSeCBhbmQgVHgKKyAqCXF1ZXVlcyBvZiB0aGlzIHBvcnQgbWF5IGJlIHJlY29uZmlndXJlZC4KKyAqCisgKglJdCBpcyBwb3NzaWJsZSB0byBzdG9wIHRoZSByZWNlaXZlIGFuZCB0cmFuc21pdCBwYXRoIHNlcGFyYXRlIG9yCisgKglib3RoIHRvZ2V0aGVyLgorICoKKyAqCURpciA9CVNLX1NUT1BfVFggCVN0b3BzIHRoZSB0cmFuc21pdCBwYXRoIG9ubHkgYW5kIHJlc2V0cyB0aGUgTUFDLgorICoJCQkJVGhlIHJlY2VpdmUgcXVldWUgaXMgc3RpbGwgYWN0aXZlIGFuZAorICoJCQkJdGhlIHBlbmRpbmcgUnggZnJhbWVzIG1heSBiZSBzdGlsbCB0cmFuc2ZlcnJlZAorICoJCQkJaW50byB0aGUgUnhELgorICoJCVNLX1NUT1BfUlgJU3RvcCB0aGUgcmVjZWl2ZSBwYXRoLiBUaGUgdGFuc21pdCBwYXRoCisgKgkJCQloYXMgdG8gYmUgc3RvcHBlZCBvbmNlIGJlZm9yZS4KKyAqCQlTS19TVE9QX0FMTAlTS19TVE9QX1RYICsgU0tfU1RPUF9SWAorICoKKyAqCVJzdE1vZGUgPSBTS19TT0ZUX1JTVAlSZXNldHMgdGhlIE1BQy4gVGhlIFBIWSBpcyBzdGlsbCBhbGl2ZS4KKyAqCQkJU0tfSEFSRF9SU1QJUmVzZXRzIHRoZSBNQUMgYW5kIHRoZSBQSFkuCisgKgorICogRXhhbXBsZToKKyAqCTEpIEEgTGluayBEb3duIGV2ZW50IHdhcyBzaWduYWxlZCBmb3IgYSBwb3J0LiBUaGVyZWZvcmUgdGhlIGFjdGl2aXR5CisgKglvZiB0aGlzIHBvcnQgc2hvdWxkIGJlIHN0b3BwZWQgYW5kIGEgaGFyZHdhcmUgcmVzZXQgc2hvdWxkIGJlIGlzc3VlZAorICoJdG8gZW5hYmxlIHRoZSB3b3JrYXJvdW5kIG9mIFhNQUMgRXJyYXRhICMyLiBCdXQgdGhlIHJlY2VpdmVkIGZyYW1lcworICoJc2hvdWxkIG5vdCBiZSBkaXNjYXJkZWQuCisgKgkJLi4uCisgKgkJU2tHZVN0b3BQb3J0KHBBQywgSW9DLCBQb3J0LCBTS19TVE9QX1RYLCBTS19IQVJEX1JTVCk7CisgKgkJKHRyYW5zZmVyIGFsbCBwZW5kaW5nIFJ4IGZyYW1lcykKKyAqCQlTa0dlU3RvcFBvcnQocEFDLCBJb0MsIFBvcnQsIFNLX1NUT1BfUlgsIFNLX0hBUkRfUlNUKTsKKyAqCQkuLi4KKyAqCisgKgkyKSBBbiBldmVudCB3YXMgaXNzdWVkIHdoaWNoIHJlcXVlc3QgdGhlIGRyaXZlciB0byBzd2l0Y2gKKyAqCXRoZSAndmlydHVhbCBhY3RpdmUnIGxpbmsgdG8gYW4gb3RoZXIgYWxyZWFkeSBhY3RpdmUgcG9ydAorICoJYXMgc29vbiBhcyBwb3NzaWJsZS4gVGhlIGZyYW1lcyBpbiB0aGUgcmVjZWl2ZSBxdWV1ZSBvZiB0aGlzCisgKglwb3J0IG1heSBiZSBsb3N0LiBCdXQgdGhlIFBIWSBtdXN0IG5vdCBiZSByZXNldCBkdXJpbmcgdGhpcworICoJZXZlbnQuCisgKgkJLi4uCisgKgkJU2tHZVN0b3BQb3J0KHBBQywgSW9DLCBQb3J0LCBTS19TVE9QX0FMTCwgU0tfU09GVF9SU1QpOworICoJCS4uLgorICoKKyAqIEV4dGVuZGVkIERlc2NyaXB0aW9uOgorICoJSWYgU0tfU1RPUF9UWCBpcyBzZXQsCisgKgkJbyBkaXNhYmxlIHRoZSBNQUMncyByZWNlaXZlIGFuZCB0cmFuc21pdHRlciB0byBwcmV2ZW50CisgKgkJICBmcm9tIHNlbmRpbmcgaW5jb21wbGV0ZSBmcmFtZXMKKyAqCQlvIHN0b3AgdGhlIHBvcnQncyB0cmFuc21pdCBxdWV1ZXMgYmVmb3JlIHRlcm1pbmF0aW5nIHRoZQorICoJCSAgQk1VcyB0byBwcmV2ZW50IGZyb20gcGVyZm9ybWluZyBpbmNvbXBsZXRlIFBDSSBjeWNsZXMKKyAqCQkgIG9uIHRoZSBQQ0kgYnVzCisgKgkJLSBUaGUgbmV0d29yayBSeCBhbmQgVHggYWN0aXZpdHkgYW5kIFBDSSBUeCB0cmFuc2ZlciBpcworICoJCSAgZGlzYWJsZWQgbm93LgorICoJCW8gcmVzZXQgdGhlIE1BQyBkZXBlbmRpbmcgb24gdGhlIFJzdE1vZGUKKyAqCQlvIFN0b3AgSW50ZXJ2YWwgVGltZXIgYW5kIExpbWl0IENvdW50ZXIgb2YgVHggQXJiaXRlciwKKyAqCQkgIGFsc28gZGlzYWJsZSBGb3JjZSBTeW5jIGJpdCBhbmQgRW5hYmxlIEFsbG9jIGJpdC4KKyAqCQlvIHBlcmZvcm0gYSBsb2NhbCByZXNldCBvZiB0aGUgcG9ydCdzIFR4IHBhdGgKKyAqCQkJLSByZXNldCB0aGUgUENJIEZJRk8gb2YgdGhlIGFzeW5jIFR4IHF1ZXVlCisgKgkJCS0gcmVzZXQgdGhlIFBDSSBGSUZPIG9mIHRoZSBzeW5jIFR4IHF1ZXVlCisgKgkJCS0gcmVzZXQgdGhlIFJBTSBCdWZmZXIgYXN5bmMgVHggcXVldWUKKyAqCQkJLSByZXNldCB0aGUgUkFNIEJ1ZmZlciBzeW5jIFR4IHF1ZXVlCisgKgkJCS0gcmVzZXQgdGhlIE1BQyBUeCBGSUZPCisgKgkJbyBzd2l0Y2ggTGluayBhbmQgVHggTEVEIG9mZiwgc3RvcCB0aGUgTEVEIGNvdW50ZXJzCisgKgorICoJSWYgU0tfU1RPUF9SWCBpcyBzZXQsCisgKgkJbyBzdG9wIHRoZSBwb3J0J3MgcmVjZWl2ZSBxdWV1ZQorICoJCS0gVGhlIHBhdGggZGF0YSB0cmFuc2ZlciBhY3Rpdml0eSBpcyBmdWxseSBzdG9wcGVkIG5vdy4KKyAqCQlvIHBlcmZvcm0gYSBsb2NhbCByZXNldCBvZiB0aGUgcG9ydCdzIFJ4IHBhdGgKKyAqCQkJLSByZXNldCB0aGUgUENJIEZJRk8gb2YgdGhlIFJ4IHF1ZXVlCisgKgkJCS0gcmVzZXQgdGhlIFJBTSBCdWZmZXIgcmVjZWl2ZSBxdWV1ZQorICoJCQktIHJlc2V0IHRoZSBNQUMgUnggRklGTworICoJCW8gc3dpdGNoIFJ4IExFRCBvZmYsIHN0b3AgdGhlIExFRCBjb3VudGVyCisgKgorICoJSWYgYWxsIHBvcnRzIGFyZSBzdG9wcGVkLAorICoJCW8gcmVzZXQgdGhlIFJBTSBJbnRlcmZhY2UuCisgKgorICogTm90ZXM6CisgKglvIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBkdXJpbmcgdGhlIGRyaXZlciBzdGF0ZXMgUkVTRVRfUE9SVCBhbmQKKyAqCSAgU1dJVENIX1BPUlQuCisgKi8KK3ZvaWQgU2tHZVN0b3BQb3J0KAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJL08gY29udGV4dCAqLworaW50CQlQb3J0LAkvKiBwb3J0IHRvIHN0b3AgKE1BQ18xICsgbikgKi8KK2ludAkJRGlyLAkvKiBEaXJlY3Rpb24gdG8gU3RvcCAoU0tfU1RPUF9SWCwgU0tfU1RPUF9UWCwgU0tfU1RPUF9BTEwpICovCitpbnQJCVJzdE1vZGUpLyogUmVzZXQgTW9kZSAoU0tfU09GVF9SU1QsIFNLX0hBUkRfUlNUKSAqLworeworI2lmbmRlZiBTS19ESUFHCisJU0tfRVZQQVJBIFBhcmE7CisjZW5kaWYgLyogIVNLX0RJQUcgKi8KKwlTS19HRVBPUlQgKnBQcnQ7CisJU0tfVTMyCURXb3JkOworCVNLX1UzMglYc0NzcjsKKwlTS19VMzIJWGFDc3I7CisJU0tfVTY0CVRvdXRTdGFydDsKKwlpbnQJCWk7CisJaW50CQlUb3V0Q250OworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAoKERpciAmIFNLX1NUT1BfVFgpICE9IDApIHsKKwkJLyogZGlzYWJsZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIgKi8KKwkJU2tNYWNSeFR4RGlzYWJsZShwQUMsIElvQywgUG9ydCk7CisJCQorCQkvKiBzdG9wIGJvdGggdHJhbnNtaXQgcXVldWVzICovCisJCS8qCisJCSAqIElmIHRoZSBCTVUgaXMgaW4gdGhlIHJlc2V0IHN0YXRlIENTUl9TVE9QIHdpbGwgdGVybWluYXRlCisJCSAqIGltbWVkaWF0ZWx5LgorCQkgKi8KKwkJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFhzUU9mZiwgUV9DU1IpLCBDU1JfU1RPUCk7CisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYYVFPZmYsIFFfQ1NSKSwgQ1NSX1NUT1ApOworCisJCVRvdXRTdGFydCA9IFNrT3NHZXRUaW1lKHBBQyk7CisJCVRvdXRDbnQgPSAwOworCQlkbyB7CisJCQkvKgorCQkJICogQ2xlYXIgcGFja2V0IGFyYml0ZXIgdGltZW91dCB0byBtYWtlIHN1cmUKKwkJCSAqIHRoaXMgbG9vcCB3aWxsIHRlcm1pbmF0ZS4KKwkJCSAqLworCQkJU0tfT1VUMTYoSW9DLCBCM19QQV9DVFJMLCAoU0tfVTE2KSgoUG9ydCA9PSBNQUNfMSkgPworCQkJCVBBX0NMUl9UT19UWDEgOiBQQV9DTFJfVE9fVFgyKSk7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgdHJhbnNmZXIgc3R1Y2tzIGF0IHRoZSBNQUMgdGhlIFNUT1AgY29tbWFuZCB3aWxsIG5vdAorCQkJICogdGVybWluYXRlIGlmIHdlIGRvbid0IGZsdXNoIHRoZSBYTUFDJ3MgdHJhbnNtaXQgRklGTyAhCisJCQkgKi8KKwkJCVNrTWFjRmx1c2hUeEZpZm8ocEFDLCBJb0MsIFBvcnQpOworCisJCQlYc0NzciA9IFRlc3RTdG9wQml0KHBBQywgSW9DLCBwUHJ0LT5QWHNRT2ZmKTsKKwkJCVhhQ3NyID0gVGVzdFN0b3BCaXQocEFDLCBJb0MsIHBQcnQtPlBYYVFPZmYpOworCisJCQlpZiAoU2tPc0dldFRpbWUocEFDKSAtIFRvdXRTdGFydCA+IChTS19USUNLU19QRVJfU0VDIC8gMTgpKSB7CisJCQkJLyoKKwkJCQkgKiBUaW1lb3V0IG9mIDEvMTggc2Vjb25kIHJlYWNoZWQuCisJCQkJICogVGhpcyBuZWVkcyB0byBiZSBjaGVja2VkIGF0IDEvMTggc2VjIG9ubHkuCisJCQkJICovCisJCQkJVG91dENudCsrOworCQkJCWlmIChUb3V0Q250ID4gMSkgeworCQkJCQkvKiBNaWdodCBiZSBhIHByb2JsZW0gd2hlbiB0aGUgZHJpdmVyIGV2ZW50IGhhbmRsZXIKKwkJCQkJICogY2FsbHMgU3RvcFBvcnQgYWdhaW4uIFhYWC4KKwkJCQkJICovCisKKwkJCQkJLyogRmF0YWwgRXJyb3IsIExvb3AgYWJvcnRlZCAqLworCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX0hXSV9FMDE4LAorCQkJCQkJU0tFUlJfSFdJX0UwMThNU0cpOworI2lmbmRlZiBTS19ESUFHCisJCQkJCVBhcmEuUGFyYTY0ID0gUG9ydDsKKwkJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX0ZBSUwsIFBhcmEpOworI2VuZGlmIC8qICFTS19ESUFHICovCisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBDYWNoZSBpbmNvaGVyZW5jeSB3b3JrYXJvdW5kOiBBc3N1bWUgYSBzdGFydCBjb21tYW5kCisJCQkJICogaGFzIGJlZW4gbG9zdCB3aGlsZSBzZW5kaW5nIHRoZSBmcmFtZS4KKwkJCQkgKi8KKwkJCQlUb3V0U3RhcnQgPSBTa09zR2V0VGltZShwQUMpOworCisJCQkJaWYgKChYc0NzciAmIENTUl9TVE9QKSAhPSAwKSB7CisJCQkJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYc1FPZmYsIFFfQ1NSKSwgQ1NSX1NUQVJUKTsKKwkJCQl9CisJCQkJaWYgKChYYUNzciAmIENTUl9TVE9QKSAhPSAwKSB7CisJCQkJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYYVFPZmYsIFFfQ1NSKSwgQ1NSX1NUQVJUKTsKKwkJCQl9CisJCQl9CisKKwkJCS8qCisJCQkgKiBCZWNhdXNlIG9mIHRoZSBBU0lDIHByb2JsZW0gcmVwb3J0IGVudHJ5IGZyb20gMjEuMDguMTk5OCBpdCBpcworCQkJICogcmVxdWlyZWQgdG8gd2FpdCB1bnRpbCBDU1JfU1RPUCBpcyByZXNldCBhbmQgQ1NSX1NWX0lETEUgaXMgc2V0LgorCQkJICovCisJCX0gd2hpbGUgKChYc0NzciAmIChDU1JfU1RPUCB8IENTUl9TVl9JRExFKSkgIT0gQ1NSX1NWX0lETEUgfHwKKwkJCQkgKFhhQ3NyICYgKENTUl9TVE9QIHwgQ1NSX1NWX0lETEUpKSAhPSBDU1JfU1ZfSURMRSk7CisKKwkJLyogUmVzZXQgdGhlIE1BQyBkZXBlbmRpbmcgb24gdGhlIFJzdE1vZGUgKi8KKwkJaWYgKFJzdE1vZGUgPT0gU0tfU09GVF9SU1QpIHsKKwkJCVNrTWFjU29mdFJzdChwQUMsIElvQywgUG9ydCk7CisJCX0KKwkJZWxzZSB7CisJCQlTa01hY0hhcmRSc3QocEFDLCBJb0MsIFBvcnQpOworCQl9CisgCQkKKwkJLyogRGlzYWJsZSBGb3JjZSBTeW5jIGJpdCBhbmQgRW5hYmxlIEFsbG9jIGJpdCAqLworCQlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBUWEFfQ1RSTCksCisJCQlUWEFfRElTX0ZTWU5DIHwgVFhBX0RJU19BTExPQyB8IFRYQV9TVE9QX1JDKTsKKwkJCisJCS8qIFN0b3AgSW50ZXJ2YWwgVGltZXIgYW5kIExpbWl0IENvdW50ZXIgb2YgVHggQXJiaXRlciAqLworCQlTS19PVVQzMihJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0lUSV9JTkkpLCAwTCk7CisJCVNLX09VVDMyKElvQywgTVJfQUREUihQb3J0LCBUWEFfTElNX0lOSSksIDBMKTsKKworCQkvKiBQZXJmb3JtIGEgbG9jYWwgcmVzZXQgb2YgdGhlIHBvcnQncyBUeCBwYXRoICovCisKKwkJLyogUmVzZXQgdGhlIFBDSSBGSUZPIG9mIHRoZSBhc3luYyBUeCBxdWV1ZSAqLworCQlTS19PVVQzMihJb0MsIFFfQUREUihwUHJ0LT5QWGFRT2ZmLCBRX0NTUiksIENTUl9TRVRfUkVTRVQpOworCQkvKiBSZXNldCB0aGUgUENJIEZJRk8gb2YgdGhlIHN5bmMgVHggcXVldWUgKi8KKwkJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFhzUU9mZiwgUV9DU1IpLCBDU1JfU0VUX1JFU0VUKTsKKwkJLyogUmVzZXQgdGhlIFJBTSBCdWZmZXIgYXN5bmMgVHggcXVldWUgKi8KKwkJU0tfT1VUOChJb0MsIFJCX0FERFIocFBydC0+UFhhUU9mZiwgUkJfQ1RSTCksIFJCX1JTVF9TRVQpOworCQkvKiBSZXNldCB0aGUgUkFNIEJ1ZmZlciBzeW5jIFR4IHF1ZXVlICovCisJCVNLX09VVDgoSW9DLCBSQl9BRERSKHBQcnQtPlBYc1FPZmYsIFJCX0NUUkwpLCBSQl9SU1RfU0VUKTsKKwkJCisJCS8qIFJlc2V0IFR4IE1BQyBGSUZPICovCisjaWZkZWYgR0VORVNJUworCQlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkJLyogTm90ZTogTUZGX1JTVF9TRVQgZG9lcyBOT1QgcmVzZXQgdGhlIFhNQUMgISAqLworCQkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhfTUZGX0NUUkwyKSwgTUZGX1JTVF9TRVQpOworCisJCQkvKiBzd2l0Y2ggTGluayBhbmQgVHggTEVEIG9mZiwgc3RvcCB0aGUgTEVEIGNvdW50ZXJzICovCisJCQkvKiBMaW5rIExFRCBpcyBzd2l0Y2hlZCBvZmYgYnkgdGhlIFJMTVQgYW5kIHRoZSBEaWFnIGl0c2VsZiAqLworCQkJU2tHZVhtaXRMRUQocEFDLCBJb0MsIE1SX0FERFIoUG9ydCwgVFhfTEVEX0lOSSksIFNLX0xFRF9ESVMpOworCQl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkJLyogUmVzZXQgVFggTUFDIEZJRk8gKi8KKwkJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFRYX0dNRl9DVFJMX1QpLCAoU0tfVTgpR01GX1JTVF9TRVQpOworCQl9CisjZW5kaWYgLyogWVVLT04gKi8KKwl9CisKKwlpZiAoKERpciAmIFNLX1NUT1BfUlgpICE9IDApIHsKKwkJLyoKKwkJICogVGhlIFJYIFN0b3AgQ29tbWFuZCB3aWxsIG5vdCB0ZXJtaW5hdGUgaWYgbm8gYnVmZmVycworCQkgKiBhcmUgcXVldWVkIGluIHRoZSBSeEQgcmluZy4gQnV0IGl0IHdpbGwgYWx3YXlzIHJlYWNoCisJCSAqIHRoZSBJZGxlIHN0YXRlLiBUaGVyZWZvcmUgd2UgY2FuIHVzZSB0aGlzIGZlYXR1cmUgdG8KKwkJICogc3RvcCB0aGUgdHJhbnNmZXIgb2YgcmVjZWl2ZWQgcGFja2V0cy4KKwkJICovCisJCS8qIHN0b3AgdGhlIHBvcnQncyByZWNlaXZlIHF1ZXVlICovCisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBSeFFPZmYsIFFfQ1NSKSwgQ1NSX1NUT1ApOworCQkKKwkJaSA9IDEwMDsKKwkJZG8geworCQkJLyoKKwkJCSAqIENsZWFyIHBhY2tldCBhcmJpdGVyIHRpbWVvdXQgdG8gbWFrZSBzdXJlCisJCQkgKiB0aGlzIGxvb3Agd2lsbCB0ZXJtaW5hdGUKKwkJCSAqLworCQkJU0tfT1VUMTYoSW9DLCBCM19QQV9DVFJMLCAoU0tfVTE2KSgoUG9ydCA9PSBNQUNfMSkgPworCQkJCVBBX0NMUl9UT19SWDEgOiBQQV9DTFJfVE9fUlgyKSk7CisKKwkJCURXb3JkID0gVGVzdFN0b3BCaXQocEFDLCBJb0MsIHBQcnQtPlBSeFFPZmYpOworCisJCQkvKiB0aW1lb3V0IGlmIGk9PTAgKGJ1ZyBmaXggZm9yICMxMDc0OCkgKi8KKwkJCWlmICgtLWkgPT0gMCkgeworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfSFdJX0UwMjQsCisJCQkJCVNLRVJSX0hXSV9FMDI0TVNHKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qCisJCQkgKiBiZWNhdXNlIG9mIHRoZSBBU0lDIHByb2JsZW0gcmVwb3J0IGVudHJ5IGZyb20gMjEuMDguOTgKKwkJCSAqIGl0IGlzIHJlcXVpcmVkIHRvIHdhaXQgdW50aWwgQ1NSX1NUT1AgaXMgcmVzZXQgYW5kCisJCQkgKiBDU1JfU1ZfSURMRSBpcyBzZXQuCisJCQkgKi8KKwkJfSB3aGlsZSAoKERXb3JkICYgKENTUl9TVE9QIHwgQ1NSX1NWX0lETEUpKSAhPSBDU1JfU1ZfSURMRSk7CisKKwkJLyogVGhlIHBhdGggZGF0YSB0cmFuc2ZlciBhY3Rpdml0eSBpcyBmdWxseSBzdG9wcGVkIG5vdyAqLworCisJCS8qIFBlcmZvcm0gYSBsb2NhbCByZXNldCBvZiB0aGUgcG9ydCdzIFJ4IHBhdGggKi8KKworCQkgLyoJUmVzZXQgdGhlIFBDSSBGSUZPIG9mIHRoZSBSeCBxdWV1ZSAqLworCQlTS19PVVQzMihJb0MsIFFfQUREUihwUHJ0LT5QUnhRT2ZmLCBRX0NTUiksIENTUl9TRVRfUkVTRVQpOworCQkvKiBSZXNldCB0aGUgUkFNIEJ1ZmZlciByZWNlaXZlIHF1ZXVlICovCisJCVNLX09VVDgoSW9DLCBSQl9BRERSKHBQcnQtPlBSeFFPZmYsIFJCX0NUUkwpLCBSQl9SU1RfU0VUKTsKKworCQkvKiBSZXNldCBSeCBNQUMgRklGTyAqLworI2lmZGVmIEdFTkVTSVMKKwkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCQorCQkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgUlhfTUZGX0NUUkwyKSwgTUZGX1JTVF9TRVQpOworCisJCQkvKiBzd2l0Y2ggUnggTEVEIG9mZiwgc3RvcCB0aGUgTEVEIGNvdW50ZXIgKi8KKwkJCVNrR2VYbWl0TEVEKHBBQywgSW9DLCBNUl9BRERSKFBvcnQsIFJYX0xFRF9JTkkpLCBTS19MRURfRElTKTsKKwkJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCQlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCS8qIFJlc2V0IFJ4IE1BQyBGSUZPICovCisJCQlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBSWF9HTUZfQ1RSTF9UKSwgKFNLX1U4KUdNRl9SU1RfU0VUKTsKKwkJfQorI2VuZGlmIC8qIFlVS09OICovCisJfQorfQkvKiBTa0dlU3RvcFBvcnQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXQwKCkgLSBMZXZlbCAwIEluaXRpYWxpemF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKgktIEluaXRpYWxpemUgdGhlIEJNVSBhZGRyZXNzIG9mZnNldHMKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa0dlSW5pdDAoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DKQkJLyogSU8gY29udGV4dCAqLworeworCWludCBpOworCVNLX0dFUE9SVCAqcFBydDsKKworCWZvciAoaSA9IDA7IGkgPCBTS19NQVhfTUFDUzsgaSsrKSB7CisJCXBQcnQgPSAmcEFDLT5HSW5pLkdQW2ldOworCisJCXBQcnQtPlBTdGF0ZSA9IFNLX1BSVF9SRVNFVDsKKwkJcFBydC0+UFJ4UU9mZiA9IFFPZmZUYWJbaV0uUnhRT2ZmOworCQlwUHJ0LT5QWHNRT2ZmID0gUU9mZlRhYltpXS5Yc1FPZmY7CisJCXBQcnQtPlBYYVFPZmYgPSBRT2ZmVGFiW2ldLlhhUU9mZjsKKwkJcFBydC0+UENoZWNrUGFyID0gU0tfRkFMU0U7CisJCXBQcnQtPlBJc2F2ZSA9IDA7CisJCXBQcnQtPlBQcmV2U2hvcnRzID0gMDsKKwkJcFBydC0+UExpbmtSZXNDdCA9IDA7CisJCXBQcnQtPlBBdXRvTmVnVE9DdCA9IDA7CisJCXBQcnQtPlBQcmV2UnggPSAwOworCQlwUHJ0LT5QUHJldkZjcyA9IDA7CisJCXBQcnQtPlBSeExpbSA9IFNLX0RFRl9SWF9XQV9MSU07CisJCXBQcnQtPlBMaW5rTW9kZSA9IChTS19VOClTS19MTU9ERV9BVVRPRlVMTDsKKwkJcFBydC0+UExpbmtTcGVlZENhcCA9IChTS19VOClTS19MU1BFRURfQ0FQXzEwMDBNQlBTOworCQlwUHJ0LT5QTGlua1NwZWVkID0gKFNLX1U4KVNLX0xTUEVFRF8xMDAwTUJQUzsKKwkJcFBydC0+UExpbmtTcGVlZFVzZWQgPSAoU0tfVTgpU0tfTFNQRUVEX1NUQVRfVU5LTk9XTjsKKwkJcFBydC0+UExpbmtNb2RlQ29uZiA9IChTS19VOClTS19MTU9ERV9BVVRPU0VOU0U7CisJCXBQcnQtPlBGbG93Q3RybE1vZGUgPSAoU0tfVTgpU0tfRkxPV19NT0RFX1NZTV9PUl9SRU07CisJCXBQcnQtPlBMaW5rQ2FwID0gKFNLX1U4KShTS19MTU9ERV9DQVBfSEFMRiB8IFNLX0xNT0RFX0NBUF9GVUxMIHwKKwkJCVNLX0xNT0RFX0NBUF9BVVRPSEFMRiB8IFNLX0xNT0RFX0NBUF9BVVRPRlVMTCk7CisJCXBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9IChTS19VOClTS19MTU9ERV9TVEFUX1VOS05PV047CisJCXBQcnQtPlBGbG93Q3RybENhcCA9IChTS19VOClTS19GTE9XX01PREVfU1lNX09SX1JFTTsKKwkJcFBydC0+UEZsb3dDdHJsU3RhdHVzID0gKFNLX1U4KVNLX0ZMT1dfU1RBVF9OT05FOworCQlwUHJ0LT5QTVNDYXAgPSAwOworCQlwUHJ0LT5QTVNNb2RlID0gKFNLX1U4KVNLX01TX01PREVfQVVUTzsKKwkJcFBydC0+UE1TU3RhdHVzID0gKFNLX1U4KVNLX01TX1NUQVRfVU5TRVQ7CisJCXBQcnQtPlBMaXBhQXV0b05lZyA9IChTS19VOClTS19MSVBBX1VOS05PV047CisJCXBQcnQtPlBBdXRvTmVnRmFpbCA9IFNLX0ZBTFNFOworCQlwUHJ0LT5QSFdMaW5rVXAgPSBTS19GQUxTRTsKKwkJcFBydC0+UExpbmtCcm9rZW4gPSBTS19UUlVFOyAvKiBTZWUgV0EgY29kZSAqLworCQlwUHJ0LT5QUGh5UG93ZXJTdGF0ZSA9IFBIWV9QTV9PUEVSQVRJT05BTF9NT0RFOworCQlwUHJ0LT5QTWFjQ29sVGhyZXMgPSBUWF9DT0xfREVGOworCQlwUHJ0LT5QTWFjSmFtTGVuID0gVFhfSkFNX0xFTl9ERUY7CisJCXBQcnQtPlBNYWNKYW1JcGdWYWwJPSBUWF9KQU1fSVBHX0RFRjsKKwkJcFBydC0+UE1hY0phbUlwZ0RhdGEgPSBUWF9JUEdfSkFNX0RFRjsKKwkJcFBydC0+UE1hY0lwZ0RhdGEgPSBJUEdfREFUQV9ERUY7CisJCXBQcnQtPlBNYWNMaW1pdDQgPSBTS19GQUxTRTsKKwl9CisKKwlwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgPSBTS19SRURfTElOSzsKKwlwQUMtPkdJbmkuR0lMZWRCbGlua0N0cmwgPSAoU0tfVTE2KU9lbUNvbmZpZy5WYWx1ZTsKKwlwQUMtPkdJbmkuR0lWYWxJcnFNYXNrID0gSVNfQUxMX01TSzsKKworfQkvKiBTa0dlSW5pdDAqLworCisjaWZkZWYgU0tfUENJX1JFU0VUCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlUGNpUmVzZXQoKSAtIFJlc2V0IFBDSSBpbnRlcmZhY2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCW8gUmVhZCBQQ0kgY29uZmlndXJhdGlvbi4KKyAqCW8gQ2hhbmdlIHBvd2VyIHN0YXRlIHRvIDMuCisgKglvIENoYW5nZSBwb3dlciBzdGF0ZSB0byAwLgorICoJbyBSZXN0b3JlIFBDSSBjb25maWd1cmF0aW9uLgorICoKKyAqIFJldHVybnM6CisgKgkwOglTdWNjZXNzLgorICoJMToJUG93ZXIgc3RhdGUgY291bGQgbm90IGJlIGNoYW5nZWQgdG8gMy4KKyAqLworc3RhdGljIGludCBTa0dlUGNpUmVzZXQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DKQkJLyogSU8gY29udGV4dCAqLworeworCWludAkJaTsKKwlTS19VMTYJUG1DdGxTdHM7CisJU0tfVTMyCUJwMTsKKwlTS19VMzIJQnAyOworCVNLX1UxNglQY2lDbWQ7CisJU0tfVTgJQ2xzOworCVNLX1U4CUxhdDsKKwlTS19VOAlDb25maWdTcGFjZVtQQ0lfQ0ZHX1NJWkVdOworCisJLyoKKwkgKiBOb3RlOiBTd2l0Y2hpbmcgdG8gRDMgc3RhdGUgaXMgbGlrZSBhIHNvZnR3YXJlIHJlc2V0LgorCSAqCQkgU3dpdGNoaW5nIGZyb20gRDMgdG8gRDAgaXMgYSBoYXJkd2FyZSByZXNldC4KKwkgKgkJIFdlIGhhdmUgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgY29uZmlndXJhdGlvbiBzcGFjZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUENJX0NGR19TSVpFOyBpKyspIHsKKwkJU2tQY2lSZWFkQ2ZnRFdvcmQocEFDLCBpKjQsICZDb25maWdTcGFjZVtpXSk7CisJfQorCisJLyogV2Uga25vdyB0aGUgUkFNIEludGVyZmFjZSBBcmJpdGVyIGlzIGVuYWJsZWQuICovCisJU2tQY2lXcml0ZUNmZ1dvcmQocEFDLCBQQ0lfUE1fQ1RMX1NUUywgUENJX1BNX1NUQVRFX0QzKTsKKwlTa1BjaVJlYWRDZmdXb3JkKHBBQywgUENJX1BNX0NUTF9TVFMsICZQbUN0bFN0cyk7CisJCisJaWYgKChQbUN0bFN0cyAmIFBDSV9QTV9TVEFURV9NU0spICE9IFBDSV9QTV9TVEFURV9EMykgeworCQlyZXR1cm4oMSk7CisJfQorCisJLyogUmV0dXJuIHRvIEQwIHN0YXRlLiAqLworCVNrUGNpV3JpdGVDZmdXb3JkKHBBQywgUENJX1BNX0NUTF9TVFMsIFBDSV9QTV9TVEFURV9EMCk7CisKKwkvKiBDaGVjayBmb3IgRDAgc3RhdGUuICovCisJU2tQY2lSZWFkQ2ZnV29yZChwQUMsIFBDSV9QTV9DVExfU1RTLCAmUG1DdGxTdHMpOworCQorCWlmICgoUG1DdGxTdHMgJiBQQ0lfUE1fU1RBVEVfTVNLKSAhPSBQQ0lfUE1fU1RBVEVfRDApIHsKKwkJcmV0dXJuKDEpOworCX0KKworCS8qIENoZWNrIFBDSSBDb25maWcgUmVnaXN0ZXJzLiAqLworCVNrUGNpUmVhZENmZ1dvcmQocEFDLCBQQ0lfQ09NTUFORCwgJlBjaUNtZCk7CisJU2tQY2lSZWFkQ2ZnQnl0ZShwQUMsIFBDSV9DQUNIRV9MU1osICZDbHMpOworCVNrUGNpUmVhZENmZ0RXb3JkKHBBQywgUENJX0JBU0VfMVNULCAmQnAxKTsKKwlTa1BjaVJlYWRDZmdEV29yZChwQUMsIFBDSV9CQVNFXzJORCwgJkJwMik7CisJU2tQY2lSZWFkQ2ZnQnl0ZShwQUMsIFBDSV9MQVRfVElNLCAmTGF0KTsKKwkKKwlpZiAoUGNpQ21kICE9IDAgfHwgQ2xzICE9IChTS19VOCkwIHx8IExhdCAhPSAoU0tfVTgpMCB8fAorCQkoQnAxICYgMHhmZmZmZmZmMEwpICE9IDAgfHwgQnAyICE9IDEpIHsKKwkJcmV0dXJuKDEpOworCX0KKworCS8qIFJlc3RvcmUgUENJIENvbmZpZyBTcGFjZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUENJX0NGR19TSVpFOyBpKyspIHsKKwkJU2tQY2lXcml0ZUNmZ0RXb3JkKHBBQywgaSo0LCBDb25maWdTcGFjZVtpXSk7CisJfQorCisJcmV0dXJuKDApOworfQkvKiBTa0dlUGNpUmVzZXQgKi8KKworI2VuZGlmIC8qIFNLX1BDSV9SRVNFVCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXQxKCkgLSBMZXZlbCAxIEluaXRpYWxpemF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKglvIERvIGEgc29mdHdhcmUgcmVzZXQuCisgKglvIENsZWFyIGFsbCByZXNldCBiaXRzLgorICoJbyBWZXJpZnkgdGhhdCB0aGUgZGV0ZWN0ZWQgaGFyZHdhcmUgaXMgcHJlc2VudC4KKyAqCSAgUmV0dXJuIGFuIGVycm9yIGlmIG5vdC4KKyAqCW8gR2V0IHRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uCisgKgkJKyBSZWFkIHRoZSBudW1iZXIgb2YgTUFDcy9Qb3J0cy4KKyAqCQkrIFJlYWQgdGhlIFJBTSBzaXplLgorICoJCSsgUmVhZCB0aGUgUENJIFJldmlzaW9uIElkLgorICoJCSsgRmluZCBvdXQgdGhlIGFkYXB0ZXJzIGhvc3QgY2xvY2sgc3BlZWQKKyAqCQkrIFJlYWQgYW5kIGNoZWNrIHRoZSBQSFkgdHlwZQorICoKKyAqIFJldHVybnM6CisgKgkwOglzdWNjZXNzCisgKgk1OglVbmV4cGVjdGVkIFBIWSB0eXBlIGRldGVjdGVkCisgKgk2OglIVyBzZWxmIHRlc3QgZmFpbGVkCisgKi8KK3N0YXRpYyBpbnQgU2tHZUluaXQxKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQykJCS8qIElPIGNvbnRleHQgKi8KK3sKKwlTS19VOAlCeXRlOworCVNLX1UxNglXb3JkOworCVNLX1UxNglDdHJsU3RhdDsKKwlTS19VMzIJRFdvcmQ7CisJaW50CVJldFZhbDsKKwlpbnQJaTsKKworCVJldFZhbCA9IDA7CisKKwkvKiBzYXZlIENMS19SVU4gYml0cyAoWVVLT04tTGl0ZSkgKi8KKwlTS19JTjE2KElvQywgQjBfQ1RTVCwgJkN0cmxTdGF0KTsKKworI2lmZGVmIFNLX1BDSV9SRVNFVAorCSh2b2lkKVNrR2VQY2lSZXNldChwQUMsIElvQyk7CisjZW5kaWYgLyogU0tfUENJX1JFU0VUICovCisKKwkvKiBkbyB0aGUgU1ctcmVzZXQgKi8KKwlTS19PVVQ4KElvQywgQjBfQ1RTVCwgQ1NfUlNUX1NFVCk7CisKKwkvKiByZWxlYXNlIHRoZSBTVy1yZXNldCAqLworCVNLX09VVDgoSW9DLCBCMF9DVFNULCBDU19SU1RfQ0xSKTsKKworCS8qIHJlc2V0IGFsbCBlcnJvciBiaXRzIGluIHRoZSBQQ0kgU1RBVFVTIHJlZ2lzdGVyICovCisJLyoKKwkgKiBOb3RlOiBQQ0kgQ2ZnIGN5Y2xlcyBjYW5ub3QgYmUgdXNlZCwgYmVjYXVzZSB0aGV5IGFyZSBub3QKKwkgKgkJIGF2YWlsYWJsZSBvbiBzb21lIHBsYXRmb3JtcyBhZnRlciAnYm9vdCB0aW1lJy4KKwkgKi8KKwlTS19JTjE2KElvQywgUENJX0MoUENJX1NUQVRVUyksICZXb3JkKTsKKwkKKwlTS19PVVQ4KElvQywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09OKTsKKwlTS19PVVQxNihJb0MsIFBDSV9DKFBDSV9TVEFUVVMpLCAoU0tfVTE2KShXb3JkIHwgUENJX0VSUkJJVFMpKTsKKwlTS19PVVQ4KElvQywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09GRik7CisKKwkvKiByZWxlYXNlIE1hc3RlciBSZXNldCAqLworCVNLX09VVDgoSW9DLCBCMF9DVFNULCBDU19NUlNUX0NMUik7CisKKyNpZmRlZiBDTEtfUlVOCisJQ3RybFN0YXQgfD0gQ1NfQ0xLX1JVTl9FTkE7CisjZW5kaWYgLyogQ0xLX1JVTiAqLworCisJLyogcmVzdG9yZSBDTEtfUlVOIGJpdHMgKi8KKwlTS19PVVQxNihJb0MsIEIwX0NUU1QsIChTS19VMTYpKEN0cmxTdGF0ICYKKwkJKENTX0NMS19SVU5fSE9UIHwgQ1NfQ0xLX1JVTl9SU1QgfCBDU19DTEtfUlVOX0VOQSkpKTsKKworCS8qIHJlYWQgQ2hpcCBJZGVudGlmaWNhdGlvbiBOdW1iZXIgKi8KKwlTS19JTjgoSW9DLCBCMl9DSElQX0lELCAmQnl0ZSk7CisJcEFDLT5HSW5pLkdJQ2hpcElkID0gQnl0ZTsKKwkKKwkvKiByZWFkIG51bWJlciBvZiBNQUNzICovCisJU0tfSU44KElvQywgQjJfTUFDX0NGRywgJkJ5dGUpOworCXBBQy0+R0luaS5HSU1hY3NGb3VuZCA9IChCeXRlICYgQ0ZHX1NOR19NQUMpID8gMSA6IDI7CisJCisJLyogZ2V0IENoaXAgUmV2aXNpb24gTnVtYmVyICovCisJcEFDLT5HSW5pLkdJQ2hpcFJldiA9IChTS19VOCkoKEJ5dGUgJiBDRkdfQ0hJUF9SX01TSykgPj4gNCk7CisKKwkvKiBnZXQgZGlmZi4gUENJIHBhcmFtZXRlcnMgKi8KKwlTS19JTjE2KElvQywgQjBfQ1RTVCwgJkN0cmxTdGF0KTsKKwkKKwkvKiByZWFkIHRoZSBhZGFwdGVycyBSQU0gc2l6ZSAqLworCVNLX0lOOChJb0MsIEIyX0VfMCwgJkJ5dGUpOworCQorCXBBQy0+R0luaS5HSUdlbmVzaXMgPSBTS19GQUxTRTsKKwlwQUMtPkdJbmkuR0lZdWtvbiA9IFNLX0ZBTFNFOworCXBBQy0+R0luaS5HSVl1a29uTGl0ZSA9IFNLX0ZBTFNFOworCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSB7CisKKwkJcEFDLT5HSW5pLkdJR2VuZXNpcyA9IFNLX1RSVUU7CisKKwkJaWYgKEJ5dGUgPT0gKFNLX1U4KTMpIHsJCQkJCQkKKwkJCS8qIHNwZWNpYWwgY2FzZTogNCB4IDY0ayB4IDM2LCBvZmZzZXQgPSAweDgwMDAwICovCisJCQlwQUMtPkdJbmkuR0lSYW1TaXplID0gMTAyNDsKKwkJCXBBQy0+R0luaS5HSVJhbU9mZnMgPSAoU0tfVTMyKTUxMiAqIDEwMjQ7CisJCX0KKwkJZWxzZSB7CisJCQlwQUMtPkdJbmkuR0lSYW1TaXplID0gKGludClCeXRlICogNTEyOworCQkJcEFDLT5HSW5pLkdJUmFtT2ZmcyA9IDA7CisJCX0KKwkJLyogYWxsIEdFIGFkYXB0ZXJzIHdvcmsgd2l0aCA1My4xMjUgTUh6IGhvc3QgY2xvY2sgKi8KKwkJcEFDLT5HSW5pLkdJSHN0Q2xrRmFjdCA9IFNLX0ZBQ1RfNTM7CisJCQorCQkvKiBzZXQgRGVzY3IuIFBvbGwgVGltZXIgSW5pdCBWYWx1ZSB0byAyNTAgbXMgKi8KKwkJcEFDLT5HSW5pLkdJUG9sbFRpbWVyVmFsID0KKwkJCVNLX0RQT0xMX0RFRiAqIChTS19VMzIpcEFDLT5HSW5pLkdJSHN0Q2xrRmFjdCAvIDEwMDsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSUNoaXBJZCAhPSBDSElQX0lEX0dFTkVTSVMpIHsKKwkJCisJCXBBQy0+R0luaS5HSVl1a29uID0gU0tfVFJVRTsKKwkJCisJCXBBQy0+R0luaS5HSVJhbVNpemUgPSAoQnl0ZSA9PSAoU0tfVTgpMCkgPyAxMjggOiAoaW50KUJ5dGUgKiA0OworCQkKKwkJcEFDLT5HSW5pLkdJUmFtT2ZmcyA9IDA7CisJCQorCQkvKiBXQSBmb3IgY2hpcCBSZXYuIEEgKi8KKwkJcEFDLT5HSW5pLkdJV29sT2ZmcyA9IChwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9ZVUtPTiAmJgorCQkJcEFDLT5HSW5pLkdJQ2hpcFJldiA9PSAwKSA/IFdPTF9SRUdfT0ZGUyA6IDA7CisJCQorCQkvKiBnZXQgUE0gQ2FwYWJpbGl0aWVzIG9mIFBDSSBjb25maWcgc3BhY2UgKi8KKwkJU0tfSU4xNihJb0MsIFBDSV9DKFBDSV9QTV9DQVBfUkVHKSwgJldvcmQpOworCisJCS8qIGNoZWNrIGlmIFZBVVggaXMgYXZhaWxhYmxlICovCisJCWlmICgoKEN0cmxTdGF0ICYgQ1NfVkFVWF9BVkFJTCkgIT0gMCkgJiYKKwkJCS8qIGNoZWNrIGFsc28gaWYgUE1FIGZyb20gRDNjb2xkIGlzIHNldCAqLworCQkJKChXb3JkICYgUENJX1BNRV9EM0NfU1VQKSAhPSAwKSkgeworCQkJLyogc2V0IGVudHJ5IGluIEdFIGluaXQgc3RydWN0ICovCisJCQlwQUMtPkdJbmkuR0lWYXV4QXZhaWwgPSBTS19UUlVFOworCQl9CisJCQorCQlpZiAocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT05fTElURSkgeworCQkJLyogdGhpcyBpcyBSZXYuIEExICovCisJCQlwQUMtPkdJbmkuR0lZdWtvbkxpdGUgPSBTS19UUlVFOworCQl9CisJCWVsc2UgeworCQkJLyogc2F2ZSBGbGFzaC1BZGRyZXNzIFJlZ2lzdGVyICovCisJCQlTS19JTjMyKElvQywgQjJfRkFSLCAmRFdvcmQpOworCisJCQkvKiB0ZXN0IEZsYXNoLUFkZHJlc3MgUmVnaXN0ZXIgKi8KKwkJCVNLX09VVDgoSW9DLCBCMl9GQVIgKyAzLCAweGZmKTsKKwkJCVNLX0lOOChJb0MsIEIyX0ZBUiArIDMsICZCeXRlKTsKKworCQkJaWYgKEJ5dGUgIT0gMCkgeworCQkJCS8qIHRoaXMgaXMgUmV2LiBBMCAqLworCQkJCXBBQy0+R0luaS5HSVl1a29uTGl0ZSA9IFNLX1RSVUU7CisKKwkJCQkvKiByZXN0b3JlIEZsYXNoLUFkZHJlc3MgUmVnaXN0ZXIgKi8KKwkJCQlTS19PVVQzMihJb0MsIEIyX0ZBUiwgRFdvcmQpOworCQkJfQorCQl9CisKKwkJLyogc3dpdGNoIHBvd2VyIHRvIFZDQyAoV0EgZm9yIFZBVVggcHJvYmxlbSkgKi8KKwkJU0tfT1VUOChJb0MsIEIwX1BPV0VSX0NUUkwsIChTS19VOCkoUENfVkFVWF9FTkEgfCBQQ19WQ0NfRU5BIHwKKwkJCVBDX1ZBVVhfT0ZGIHwgUENfVkNDX09OKSk7CisKKwkJLyogcmVhZCB0aGUgSW50ZXJydXB0IHNvdXJjZSAqLworCQlTS19JTjMyKElvQywgQjBfSVNSQywgJkRXb3JkKTsKKwkJCisJCWlmICgoRFdvcmQgJiBJU19IV19FUlIpICE9IDApIHsKKwkJCS8qIHJlYWQgdGhlIEhXIEVycm9yIEludGVycnVwdCBzb3VyY2UgKi8KKwkJCVNLX0lOMzIoSW9DLCBCMF9IV0VfSVNSQywgJkRXb3JkKTsKKwkJCQorCQkJaWYgKChEV29yZCAmIElTX0lSUV9TRU5TT1IpICE9IDApIHsKKwkJCQkvKiBkaXNhYmxlIEhXIEVycm9yIElSUSAqLworCQkJCXBBQy0+R0luaS5HSVZhbElycU1hc2sgJj0gfklTX0hXX0VSUjsKKwkJCX0KKwkJfQorCQkKKwkJZm9yIChpID0gMDsgaSA8IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQkvKiBzZXQgR01BQyBMaW5rIENvbnRyb2wgcmVzZXQgKi8KKwkJCVNLX09VVDE2KElvQywgTVJfQUREUihpLCBHTUFDX0xJTktfQ1RSTCksIEdNTENfUlNUX1NFVCk7CisKKwkJCS8qIGNsZWFyIEdNQUMgTGluayBDb250cm9sIHJlc2V0ICovCisJCQlTS19PVVQxNihJb0MsIE1SX0FERFIoaSwgR01BQ19MSU5LX0NUUkwpLCBHTUxDX1JTVF9DTFIpOworCQl9CisJCS8qIGFsbCBZVSBjaGlwcyB3b3JrIHdpdGggNzguMTI1IE1IeiBob3N0IGNsb2NrICovCisJCXBBQy0+R0luaS5HSUhzdENsa0ZhY3QgPSBTS19GQUNUXzc4OworCQkKKwkJcEFDLT5HSW5pLkdJUG9sbFRpbWVyVmFsID0gU0tfRFBPTExfTUFYOwkvKiAyMTUgbXMgKi8KKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworCS8qIGNoZWNrIGlmIDY0LWJpdCBQQ0kgU2xvdCBpcyBwcmVzZW50ICovCisJcEFDLT5HSW5pLkdJUGNpU2xvdDY0ID0gKFNLX0JPT0wpKChDdHJsU3RhdCAmIENTX0JVU19TTE9UX1NaKSAhPSAwKTsKKwkKKwkvKiBjaGVjayBpZiA2NiBNSHogUENJIENsb2NrIGlzIGFjdGl2ZSAqLworCXBBQy0+R0luaS5HSVBjaUNsb2NrNjYgPSAoU0tfQk9PTCkoKEN0cmxTdGF0ICYgQ1NfQlVTX0NMT0NLKSAhPSAwKTsKKworCS8qIHJlYWQgUENJIEhXIFJldmlzaW9uIElkLiAqLworCVNLX0lOOChJb0MsIFBDSV9DKFBDSV9SRVZfSUQpLCAmQnl0ZSk7CisJcEFDLT5HSW5pLkdJUGNpSHdSZXYgPSBCeXRlOworCisJLyogcmVhZCB0aGUgUE1EIHR5cGUgKi8KKwlTS19JTjgoSW9DLCBCMl9QTURfVFlQLCAmQnl0ZSk7CisJcEFDLT5HSW5pLkdJQ29wcGVyVHlwZSA9IChTS19VOCkoQnl0ZSA9PSAnVCcpOworCisJLyogcmVhZCB0aGUgUEhZIHR5cGUgKi8KKwlTS19JTjgoSW9DLCBCMl9FXzEsICZCeXRlKTsKKworCUJ5dGUgJj0gMHgwZjsJLyogdGhlIFBIWSB0eXBlIGlzIHN0b3JlZCBpbiB0aGUgbG93ZXIgbmliYmxlICovCisJZm9yIChpID0gMDsgaSA8IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQorI2lmZGVmIEdFTkVTSVMKKwkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCXN3aXRjaCAoQnl0ZSkgeworCQkJY2FzZSBTS19QSFlfWE1BQzoKKwkJCQlwQUMtPkdJbmkuR1BbaV0uUGh5QWRkciA9IFBIWV9BRERSX1hNQUM7CisJCQkJYnJlYWs7CisJCQljYXNlIFNLX1BIWV9CQ09NOgorCQkJCXBBQy0+R0luaS5HUFtpXS5QaHlBZGRyID0gUEhZX0FERFJfQkNPTTsKKwkJCQlwQUMtPkdJbmkuR1BbaV0uUE1TQ2FwID0gKFNLX1U4KShTS19NU19DQVBfQVVUTyB8CisJCQkJCVNLX01TX0NBUF9NQVNURVIgfCBTS19NU19DQVBfU0xBVkUpOworCQkJCWJyZWFrOworI2lmZGVmIE9USEVSX1BIWQorCQkJY2FzZSBTS19QSFlfTE9ORToKKwkJCQlwQUMtPkdJbmkuR1BbaV0uUGh5QWRkciA9IFBIWV9BRERSX0xPTkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFNLX1BIWV9OQVQ6CisJCQkJcEFDLT5HSW5pLkdQW2ldLlBoeUFkZHIgPSBQSFlfQUREUl9OQVQ7CisJCQkJYnJlYWs7CisjZW5kaWYgLyogT1RIRVJfUEhZICovCisJCQlkZWZhdWx0OgorCQkJCS8qIEVSUk9SOiB1bmV4cGVjdGVkIFBIWSB0eXBlIGRldGVjdGVkICovCisJCQkJUmV0VmFsID0gNTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCQlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCQorCQkJaWYgKEJ5dGUgPCAoU0tfVTgpU0tfUEhZX01BUlZfQ09QUEVSKSB7CisJCQkJLyogaWYgdGhpcyBmaWVsZCBpcyBub3QgaW5pdGlhbGl6ZWQgKi8KKwkJCQlCeXRlID0gKFNLX1U4KVNLX1BIWV9NQVJWX0NPUFBFUjsKKwkJCQkKKwkJCQlwQUMtPkdJbmkuR0lDb3BwZXJUeXBlID0gU0tfVFJVRTsKKwkJCX0KKwkJCQorCQkJcEFDLT5HSW5pLkdQW2ldLlBoeUFkZHIgPSBQSFlfQUREUl9NQVJWOworCQkJCisJCQlpZiAocEFDLT5HSW5pLkdJQ29wcGVyVHlwZSkgeworCisJCQkJcEFDLT5HSW5pLkdQW2ldLlBMaW5rU3BlZWRDYXAgPSAoU0tfVTgpKFNLX0xTUEVFRF9DQVBfQVVUTyB8CisJCQkJCVNLX0xTUEVFRF9DQVBfMTBNQlBTIHwgU0tfTFNQRUVEX0NBUF8xMDBNQlBTIHwKKwkJCQkJU0tfTFNQRUVEX0NBUF8xMDAwTUJQUyk7CisJCQkJCisJCQkJcEFDLT5HSW5pLkdQW2ldLlBMaW5rU3BlZWQgPSAoU0tfVTgpU0tfTFNQRUVEX0FVVE87CisJCQkJCisJCQkJcEFDLT5HSW5pLkdQW2ldLlBNU0NhcCA9IChTS19VOCkoU0tfTVNfQ0FQX0FVVE8gfAorCQkJCQlTS19NU19DQVBfTUFTVEVSIHwgU0tfTVNfQ0FQX1NMQVZFKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCUJ5dGUgPSAoU0tfVTgpU0tfUEhZX01BUlZfRklCRVI7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCQkKKwkJcEFDLT5HSW5pLkdQW2ldLlBoeVR5cGUgPSAoaW50KUJ5dGU7CisJCQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lOSVQsCisJCQkoIlBIWSB0eXBlOiAlZCAgUEhZIGFkZHI6ICUwNHhcbiIsIEJ5dGUsCisJCQlwQUMtPkdJbmkuR1BbaV0uUGh5QWRkcikpOworCX0KKwkKKwkvKiBnZXQgTUFDIFR5cGUgJiBzZXQgZnVuY3Rpb24gcG9pbnRlcnMgZGVwZW5kZW50IG9uICovCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQorCQlwQUMtPkdJbmkuR0lNYWNUeXBlID0gU0tfTUFDX1hNQUM7CisKKwkJcEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNVcGRhdGVTdGF0cwk9IFNrWG1VcGRhdGVTdGF0czsKKwkJcEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNTdGF0aXN0aWMJPSBTa1htTWFjU3RhdGlzdGljOworCQlwQUMtPkdJbmkuR0lGdW5jLnBGbk1hY1Jlc2V0Q291bnRlcgk9IFNrWG1SZXNldENvdW50ZXI7CisJCXBBQy0+R0luaS5HSUZ1bmMucEZuTWFjT3ZlcmZsb3cJCT0gU2tYbU92ZXJmbG93U3RhdHVzOworCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCisJCXBBQy0+R0luaS5HSU1hY1R5cGUgPSBTS19NQUNfR01BQzsKKworCQlwQUMtPkdJbmkuR0lGdW5jLnBGbk1hY1VwZGF0ZVN0YXRzCT0gU2tHbVVwZGF0ZVN0YXRzOworCQlwQUMtPkdJbmkuR0lGdW5jLnBGbk1hY1N0YXRpc3RpYwk9IFNrR21NYWNTdGF0aXN0aWM7CisJCXBBQy0+R0luaS5HSUZ1bmMucEZuTWFjUmVzZXRDb3VudGVyCT0gU2tHbVJlc2V0Q291bnRlcjsKKwkJcEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNPdmVyZmxvdwkJPSBTa0dtT3ZlcmZsb3dTdGF0dXM7CisKKyNpZmRlZiBTUEVDSUFMX0hBTkRMSU5HCisJCWlmIChwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9ZVUtPTikgeworCQkJLyogY2hlY2sgSFcgc2VsZiB0ZXN0IHJlc3VsdCAqLworCQkJU0tfSU44KElvQywgQjJfRV8zLCAmQnl0ZSk7CisJCQlpZiAoQnl0ZSAmIEIyX0UzX1JFU19NQVNLKSB7CisJCQkJUmV0VmFsID0gNjsKKwkJCX0KKwkJfQorI2VuZGlmCisJfQorI2VuZGlmIC8qIFlVS09OICovCisJCisJcmV0dXJuKFJldFZhbCk7Cit9CS8qIFNrR2VJbml0MSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlSW5pdDIoKSAtIExldmVsIDIgSW5pdGlhbGl6YXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCS0gc3RhcnQgdGhlIEJsaW5rIFNvdXJjZSBDb3VudGVyCisgKgktIHN0YXJ0IHRoZSBEZXNjcmlwdG9yIFBvbGwgVGltZXIKKyAqCS0gY29uZmlndXJlIHRoZSBNQUMtQXJiaXRlcgorICoJLSBjb25maWd1cmUgdGhlIFBhY2tldC1BcmJpdGVyCisgKgktIGVuYWJsZSB0aGUgVHggQXJiaXRlcnMKKyAqCS0gZW5hYmxlIHRoZSBSQU0gSW50ZXJmYWNlIEFyYml0ZXIKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa0dlSW5pdDIoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DKQkJLyogSU8gY29udGV4dCAqLworeworI2lmZGVmIEdFTkVTSVMKKwlTS19VMzIJRFdvcmQ7CisjZW5kaWYgLyogR0VORVNJUyAqLworCWludAkJaTsKKworCS8qIHN0YXJ0IHRoZSBEZXNjcmlwdG9yIFBvbGwgVGltZXIgKi8KKwlpZiAocEFDLT5HSW5pLkdJUG9sbFRpbWVyVmFsICE9IDApIHsKKwkJaWYgKHBBQy0+R0luaS5HSVBvbGxUaW1lclZhbCA+IFNLX0RQT0xMX01BWCkgeworCQkJcEFDLT5HSW5pLkdJUG9sbFRpbWVyVmFsID0gU0tfRFBPTExfTUFYOworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDE3LCBTS0VSUl9IV0lfRTAxN01TRyk7CisJCX0KKwkJU0tfT1VUMzIoSW9DLCBCMjhfRFBUX0lOSSwgcEFDLT5HSW5pLkdJUG9sbFRpbWVyVmFsKTsKKwkJU0tfT1VUOChJb0MsIEIyOF9EUFRfQ1RSTCwgRFBUX1NUQVJUKTsKKwl9CisKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJLyogc3RhcnQgdGhlIEJsaW5rIFNvdXJjZSBDb3VudGVyICovCisJCURXb3JkID0gU0tfQkxLX0RVUiAqIChTS19VMzIpcEFDLT5HSW5pLkdJSHN0Q2xrRmFjdCAvIDEwMDsKKworCQlTS19PVVQzMihJb0MsIEIyX0JTQ19JTkksIERXb3JkKTsKKwkJU0tfT1VUOChJb0MsIEIyX0JTQ19DVFJMLCBCU0NfU1RBUlQpOworCisJCS8qCisJCSAqIENvbmZpZ3VyZSB0aGUgTUFDIEFyYml0ZXIgYW5kIHRoZSBQYWNrZXQgQXJiaXRlci4KKwkJICogVGhleSB3aWxsIGJlIHN0YXJ0ZWQgb25jZSBhbmQgbmV2ZXIgYmUgc3RvcHBlZC4KKwkJICovCisJCVNrR2VJbml0TWFjQXJiKHBBQywgSW9DKTsKKworCQlTa0dlSW5pdFBrdEFyYihwQUMsIElvQyk7CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkvKiBzdGFydCBUaW1lIFN0YW1wIFRpbWVyICovCisJCVNLX09VVDgoSW9DLCBHTUFDX1RJX1NUX0NUUkwsIChTS19VOClHTVRfU1RfU1RBUlQpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCisJLyogZW5hYmxlIHRoZSBUeCBBcmJpdGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlTS19PVVQ4KElvQywgTVJfQUREUihpLCBUWEFfQ1RSTCksIFRYQV9FTkFfQVJCKTsKKwl9CisKKwkvKiBlbmFibGUgdGhlIFJBTSBJbnRlcmZhY2UgQXJiaXRlciAqLworCVNrR2VJbml0UmFtSWZhY2UocEFDLCBJb0MpOworCit9CS8qIFNrR2VJbml0MiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXQoKSAtIEluaXRpYWxpemUgdGhlIEdFIEFkYXB0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGxldmVsLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJTGV2ZWwJMDoJSW5pdGlhbGl6ZSB0aGUgTW9kdWxlIHN0cnVjdHVyZXMuCisgKglMZXZlbAkxOglHZW5lcmljIEhhcmR3YXJlIEluaXRpYWxpemF0aW9uLiBUaGUgSU9QL01lbUJhc2UgcG9pbnRlciBoYXMKKyAqCQkJCXRvIGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIGxldmVsLgorICoKKyAqCQkJbyBEbyBhIHNvZnR3YXJlIHJlc2V0LgorICoJCQlvIENsZWFyIGFsbCByZXNldCBiaXRzLgorICoJCQlvIFZlcmlmeSB0aGF0IHRoZSBkZXRlY3RlZCBoYXJkd2FyZSBpcyBwcmVzZW50LgorICoJCQkgIFJldHVybiBhbiBlcnJvciBpZiBub3QuCisgKgkJCW8gR2V0IHRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uCisgKgkJCQkrIFNldCBHSU1hY3NGb3VuZCB3aXRoIHRoZSBudW1iZXIgb2YgTUFDcy4KKyAqCQkJCSsgU3RvcmUgdGhlIFJBTSBzaXplIGluIEdJUmFtU2l6ZS4KKyAqCQkJCSsgU2F2ZSB0aGUgUENJIFJldmlzaW9uIElEIGluIEdJUGNpSHdSZXYuCisgKgkJCW8gcmV0dXJuIGFuIGVycm9yCisgKgkJCQlpZiBOdW1iZXIgb2YgTUFDcyA+IFNLX01BWF9NQUNTCisgKgorICoJCQlBZnRlciByZXR1cm5pbmcgZnJvbSBMZXZlbCAwIHRoZSBhZGFwdGVyCisgKgkJCW1heSBiZSBhY2Nlc3NlZCB3aXRoIElPIG9wZXJhdGlvbnMuCisgKgorICoJTGV2ZWwJMjoJc3RhcnQgdGhlIEJsaW5rIFNvdXJjZSBDb3VudGVyCisgKgorICogUmV0dXJuczoKKyAqCTA6CXN1Y2Nlc3MKKyAqCTE6CU51bWJlciBvZiBNQUNzIGV4Y2VlZHMgU0tfTUFYX01BQ1MJKGFmdGVyIGxldmVsIDEpCisgKgkyOglBZGFwdGVyIG5vdCBwcmVzZW50IG9yIG5vdCBhY2Nlc3NpYmxlCisgKgkzOglJbGxlZ2FsIGluaXRpYWxpemF0aW9uIGxldmVsCisgKgk0OglJbml0aWFsaXphdGlvbiBMZXZlbCAxIENhbGwgbWlzc2luZworICoJNToJVW5leHBlY3RlZCBQSFkgdHlwZSBkZXRlY3RlZAorICoJNjoJSFcgc2VsZiB0ZXN0IGZhaWxlZAorICovCitpbnQJU2tHZUluaXQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlMZXZlbCkJCS8qIGluaXRpYWxpemF0aW9uIGxldmVsICovCit7CisJaW50CQlSZXRWYWw7CQkvKiByZXR1cm4gdmFsdWUgKi8KKwlTS19VMzIJRFdvcmQ7CisKKwlSZXRWYWwgPSAwOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSU5JVCwKKwkJKCJTa0dlSW5pdChMZXZlbCAlZClcbiIsIExldmVsKSk7CisKKwlzd2l0Y2ggKExldmVsKSB7CisJY2FzZSBTS19JTklUX0RBVEE6CisJCS8qIEluaXRpYWxpemF0aW9uIExldmVsIDAgKi8KKwkJU2tHZUluaXQwKHBBQywgSW9DKTsKKwkJcEFDLT5HSW5pLkdJTGV2ZWwgPSBTS19JTklUX0RBVEE7CisJCWJyZWFrOworCQorCWNhc2UgU0tfSU5JVF9JTzoKKwkJLyogSW5pdGlhbGl6YXRpb24gTGV2ZWwgMSAqLworCQlSZXRWYWwgPSBTa0dlSW5pdDEocEFDLCBJb0MpOworCQlpZiAoUmV0VmFsICE9IDApIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogY2hlY2sgaWYgdGhlIGFkYXB0ZXIgc2VlbXMgdG8gYmUgYWNjZXNzaWJsZSAqLworCQlTS19PVVQzMihJb0MsIEIyX0lSUU1fSU5JLCBTS19URVNUX1ZBTCk7CisJCVNLX0lOMzIoSW9DLCBCMl9JUlFNX0lOSSwgJkRXb3JkKTsKKwkJU0tfT1VUMzIoSW9DLCBCMl9JUlFNX0lOSSwgMEwpOworCQkKKwkJaWYgKERXb3JkICE9IFNLX1RFU1RfVkFMKSB7CisJCQlSZXRWYWwgPSAyOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBjaGVjayBpZiB0aGUgbnVtYmVyIG9mIEdJTWFjc0ZvdW5kIG1hdGNoZXMgU0tfTUFYX01BQ1MgKi8KKwkJaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA+IFNLX01BWF9NQUNTKSB7CisJCQlSZXRWYWwgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBMZXZlbCAxIHN1Y2Nlc3NmdWxseSBwYXNzZWQgKi8KKwkJcEFDLT5HSW5pLkdJTGV2ZWwgPSBTS19JTklUX0lPOworCQlicmVhazsKKwkKKwljYXNlIFNLX0lOSVRfUlVOOgorCQkvKiBJbml0aWFsaXphdGlvbiBMZXZlbCAyICovCisJCWlmIChwQUMtPkdJbmkuR0lMZXZlbCAhPSBTS19JTklUX0lPKSB7CisjaWZuZGVmIFNLX0RJQUcKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMDIsIFNLRVJSX0hXSV9FMDAyTVNHKTsKKyNlbmRpZiAvKiAhU0tfRElBRyAqLworCQkJUmV0VmFsID0gNDsKKwkJCWJyZWFrOworCQl9CisJCVNrR2VJbml0MihwQUMsIElvQyk7CisKKwkJLyogTGV2ZWwgMiBzdWNjZXNzZnVsbHkgcGFzc2VkICovCisJCXBBQy0+R0luaS5HSUxldmVsID0gU0tfSU5JVF9SVU47CisJCWJyZWFrOworCQorCWRlZmF1bHQ6CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMDMsIFNLRVJSX0hXSV9FMDAzTVNHKTsKKwkJUmV0VmFsID0gMzsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuKFJldFZhbCk7Cit9CS8qIFNrR2VJbml0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VEZUluaXQoKSAtIERlaW5pdGlhbGl6ZSB0aGUgYWRhcHRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQWxsIHBvcnRzIG9mIHRoZSBhZGFwdGVyIHdpbGwgYmUgc3RvcHBlZCBpZiBub3QgYWxyZWFkeSBkb25lLgorICoJRG8gYSBzb2Z0d2FyZSByZXNldCBhbmQgc3dpdGNoIG9mZiBhbGwgTEVEcy4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VEZUluaXQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DKQkJLyogSU8gY29udGV4dCAqLworeworCWludAlpOworCVNLX1UxNglXb3JkOworCisjaWZkZWYgU0tfUEhZX0xQX01PREUKKwlTS19VOAlCeXRlOworCVNLX1UxNglQbUN0bFN0czsKKyNlbmRpZiAvKiBTS19QSFlfTFBfTU9ERSAqLworCisjaWYgKCFkZWZpbmVkKFNLX1NMSU0pICYmICFkZWZpbmVkKFZDUFUpKQorCS8qIGVuc3VyZSBJMkMgaXMgcmVhZHkgKi8KKwlTa0kyY1dhaXRJcnEocEFDLCBJb0MpOworI2VuZGlmCQorCisJLyogc3RvcCBhbGwgY3VycmVudCB0cmFuc2ZlciBhY3Rpdml0eSAqLworCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlpZiAocEFDLT5HSW5pLkdQW2ldLlBTdGF0ZSAhPSBTS19QUlRfU1RPUCAmJgorCQkJcEFDLT5HSW5pLkdQW2ldLlBTdGF0ZSAhPSBTS19QUlRfUkVTRVQpIHsKKworCQkJU2tHZVN0b3BQb3J0KHBBQywgSW9DLCBpLCBTS19TVE9QX0FMTCwgU0tfSEFSRF9SU1QpOworCQl9CisJfQorCisjaWZkZWYgU0tfUEhZX0xQX01PREUKKyAgICAvKgorCSAqIGZvciBwb3dlciBzYXZpbmcgcHVycG9zZXMgd2l0aGluIG1vYmlsZSBlbnZpcm9ubWVudHMKKwkgKiB3ZSBzZXQgdGhlIFBIWSB0byBjb21hIG1vZGUgYW5kIHN3aXRjaCB0byBEMyBwb3dlciBzdGF0ZS4KKwkgKi8KKwlpZiAocEFDLT5HSW5pLkdJWXVrb25MaXRlICYmCisJCXBBQy0+R0luaS5HSUNoaXBSZXYgPT0gQ0hJUF9SRVZfWVVfTElURV9BMykgeworCisJCS8qIGZvciBhbGwgcG9ydHMgc3dpdGNoIFBIWSB0byBjb21hIG1vZGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQkKKwkJCVNrR21FbnRlckxvd1Bvd2VyTW9kZShwQUMsIElvQywgaSwgUEhZX1BNX0RFRVBfU0xFRVApOworCQl9CisKKwkJaWYgKHBBQy0+R0luaS5HSVZhdXhBdmFpbCkgeworCQkJLyogc3dpdGNoIHBvd2VyIHRvIFZBVVggKi8KKwkJCUJ5dGUgPSBQQ19WQVVYX0VOQSB8IFBDX1ZDQ19FTkEgfCBQQ19WQVVYX09OIHwgUENfVkNDX09GRjsKKworCQkJU0tfT1VUOChJb0MsIEIwX1BPV0VSX0NUUkwsIEJ5dGUpOworCQl9CisJCQorCQkvKiBzd2l0Y2ggdG8gRDMgc3RhdGUgKi8KKwkJU0tfSU4xNihJb0MsIFBDSV9DKFBDSV9QTV9DVExfU1RTKSwgJlBtQ3RsU3RzKTsKKworCQlQbUN0bFN0cyB8PSBQQ0lfUE1fU1RBVEVfRDM7CisKKwkJU0tfT1VUOChJb0MsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7CisKKwkJU0tfT1VUMTYoSW9DLCBQQ0lfQyhQQ0lfUE1fQ1RMX1NUUyksIFBtQ3RsU3RzKTsKKwl9CisjZW5kaWYgLyogU0tfUEhZX0xQX01PREUgKi8KKworCS8qIFJlc2V0IGFsbCBiaXRzIGluIHRoZSBQQ0kgU1RBVFVTIHJlZ2lzdGVyICovCisJLyoKKwkgKiBOb3RlOiBQQ0kgQ2ZnIGN5Y2xlcyBjYW5ub3QgYmUgdXNlZCwgYmVjYXVzZSB0aGV5IGFyZSBub3QKKwkgKgkgYXZhaWxhYmxlIG9uIHNvbWUgcGxhdGZvcm1zIGFmdGVyICdib290IHRpbWUnLgorCSAqLworCVNLX0lOMTYoSW9DLCBQQ0lfQyhQQ0lfU1RBVFVTKSwgJldvcmQpOworCQorCVNLX09VVDgoSW9DLCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT04pOworCVNLX09VVDE2KElvQywgUENJX0MoUENJX1NUQVRVUyksIChTS19VMTYpKFdvcmQgfCBQQ0lfRVJSQklUUykpOworCVNLX09VVDgoSW9DLCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT0ZGKTsKKworCS8qIGRvIHRoZSByZXNldCwgYWxsIExFRHMgYXJlIHN3aXRjaGVkIG9mZiBub3cgKi8KKwlTS19PVVQ4KElvQywgQjBfQ1RTVCwgQ1NfUlNUX1NFVCk7CisJCisJcEFDLT5HSW5pLkdJTGV2ZWwgPSBTS19JTklUX0RBVEE7Cit9CS8qIFNrR2VEZUluaXQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXRQb3J0KCkJSW5pdGlhbGl6ZSB0aGUgc3BlY2lmaWVkIHBvcnQuCisgKgorICogRGVzY3JpcHRpb246CisgKglQUnhRU2l6ZSwgUFhTUVNpemUsIGFuZCBQWEFRU2l6ZSBoYXMgdG8gYmUKKyAqCWNvbmZpZ3VyZWQgZm9yIHRoZSBzcGVjaWZpZWQgcG9ydCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICogIFRoZSBkZXNjcmlwdG9yIHJpbmdzIGhhcyB0byBiZSBpbml0aWFsaXplZCB0b28uCisgKgorICoJbyAoUmUpY29uZmlndXJlIHF1ZXVlcyBvZiB0aGUgc3BlY2lmaWVkIHBvcnQuCisgKglvIGNvbmZpZ3VyZSB0aGUgTUFDIG9mIHRoZSBzcGVjaWZpZWQgcG9ydC4KKyAqCW8gcHV0IEFTSUMgYW5kIE1BQyhzKSBpbiBvcGVyYXRpb25hbCBtb2RlLgorICoJbyBpbml0aWFsaXplIFJ4L1R4IGFuZCBTeW5jIExFRAorICoJbyBpbml0aWFsaXplIFJBTSBCdWZmZXJzIGFuZCBNQUMgRklGT3MKKyAqCisgKglUaGUgcG9ydCBpcyByZWFkeSB0byBjb25uZWN0IHdoZW4gcmV0dXJuaW5nLgorICoKKyAqIE5vdGU6CisgKglUaGUgTUFDJ3MgUnggYW5kIFR4IHN0YXRlIG1hY2hpbmUgaXMgc3RpbGwgZGlzYWJsZWQgd2hlbiByZXR1cm5pbmcuCisgKgorICogUmV0dXJuczoKKyAqCTA6CXN1Y2Nlc3MKKyAqCTE6CVF1ZXVlIHNpemUgaW5pdGlhbGl6YXRpb24gZXJyb3IuIFRoZSBjb25maWd1cmVkIHZhbHVlcworICoJCWZvciBQUnhRU2l6ZSwgUFhTUVNpemUsIG9yIFBYQVFTaXplIGFyZSBpbnZhbGlkIGZvciBvbmUKKyAqCQlvciBtb3JlIHF1ZXVlcy4gVGhlIHNwZWNpZmllZCBwb3J0IHdhcyBOT1QgaW5pdGlhbGl6ZWQuCisgKgkJQW4gZXJyb3IgbG9nIGVudHJ5IHdhcyBnZW5lcmF0ZWQuCisgKgkyOglUaGUgcG9ydCBoYXMgdG8gYmUgc3RvcHBlZCBiZWZvcmUgaXQgY2FuIGJlIGluaXRpYWxpemVkIGFnYWluLgorICovCitpbnQgU2tHZUluaXRQb3J0KAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgdG8gY29uZmlndXJlICovCit7CisJU0tfR0VQT1JUICpwUHJ0OworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAoU2tHZUNoZWNrUVNpemUocEFDLCBQb3J0KSAhPSAwKSB7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMDQsIFNLRVJSX0hXSV9FMDA0TVNHKTsKKwkJcmV0dXJuKDEpOworCX0KKwkKKwlpZiAocFBydC0+UFN0YXRlID09IFNLX1BSVF9JTklUIHx8IHBQcnQtPlBTdGF0ZSA9PSBTS19QUlRfUlVOKSB7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMDUsIFNLRVJSX0hXSV9FMDA1TVNHKTsKKwkJcmV0dXJuKDIpOworCX0KKworCS8qIGNvbmZpZ3VyYXRpb24gb2ssIGluaXRpYWxpemUgdGhlIFBvcnQgbm93ICovCisKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJLyogaW5pdGlhbGl6ZSBSeCwgVHggYW5kIExpbmsgTEVEICovCisJCS8qCisJCSAqIElmIDEwMDBCVCBQaHkgbmVlZHMgTEVEIGluaXRpYWxpemF0aW9uIHRoYW4gc3dhcAorCQkgKiBMRUQgYW5kIFhNQUMgaW5pdGlhbGl6YXRpb24gb3JkZXIKKwkJICovCisJCVNrR2VYbWl0TEVEKHBBQywgSW9DLCBNUl9BRERSKFBvcnQsIFRYX0xFRF9JTkkpLCBTS19MRURfRU5BKTsKKwkJU2tHZVhtaXRMRUQocEFDLCBJb0MsIE1SX0FERFIoUG9ydCwgUlhfTEVEX0lOSSksIFNLX0xFRF9FTkEpOworCQkvKiBUaGUgTGluayBMRUQgaXMgaW5pdGlhbGl6ZWQgYnkgUkxNVCBvciBEaWFnbm9zdGljcyBpdHNlbGYgKi8KKwkJCisJCVNrWG1Jbml0TWFjKHBBQywgSW9DLCBQb3J0KTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisKKwkJU2tHbUluaXRNYWMocEFDLCBJb0MsIFBvcnQpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCQorCS8qIGRvIE5PVCBpbml0aWFsaXplIHRoZSBMaW5rIFN5bmMgQ291bnRlciAqLworCisJU2tHZUluaXRNYWNGaWZvKHBBQywgSW9DLCBQb3J0KTsKKwkKKwlTa0dlSW5pdFJhbUJ1ZnMocEFDLCBJb0MsIFBvcnQpOworCQorCWlmIChwUHJ0LT5QWFNRU2l6ZSAhPSAwKSB7CisJCS8qIGVuYWJsZSBGb3JjZSBTeW5jIGJpdCBpZiBzeW5jaHJvbm91cyBxdWV1ZSBhdmFpbGFibGUgKi8KKwkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0NUUkwpLCBUWEFfRU5BX0ZTWU5DKTsKKwl9CisJCisJU2tHZUluaXRCbXUocEFDLCBJb0MsIFBvcnQpOworCisJLyogbWFyayBwb3J0IGFzIGluaXRpYWxpemVkICovCisJcFBydC0+UFN0YXRlID0gU0tfUFJUX0lOSVQ7CisKKwlyZXR1cm4oMCk7Cit9CS8qIFNrR2VJbml0UG9ydCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlbWliLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2VtaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTkxYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlbWliLmMKQEAgLTAsMCArMSwxMDgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlbWliLmMKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4xMSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wOS8xNSAxMzozODoxMiAkCisgKiBQdXJwb3NlOglQcml2YXRlIE5ldHdvcmsgTWFuYWdlbWVudCBJbnRlcmZhY2UgTWFuYWdlbWVudCBEYXRhYmFzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogUFJJVkFURSBPSUQgaGFuZGxlciBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK1BOTUlfU1RBVElDIGludCBBZGRyKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sCisJU0tfVTMyIElkLCBjaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBDc3VtU3RhdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgR2VuZXJhbChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgTWFjODAyM1N0YXQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IGFjdGlvbiwgU0tfVTMyIElkLAorCWNoYXIgKnBCdWYsIHVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLAorCXVuc2lnbmVkIGludCBUYWJsZUluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworUE5NSV9TVEFUSUMgaW50IE1hY1ByaXZhdGVDb25mKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sIFNLX1UzMiBJZCwKKwljaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBNYWNQcml2YXRlU3RhdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgTW9uaXRvcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLAorCVNLX1UzMiBJZCwgY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgT2lkU3RydWN0KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sIFNLX1UzMiBJZCwKKwljaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBQZXJmb3JtKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sIFNLX1UzMiBJZCwKKwljaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQqIHBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBSbG10KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sIFNLX1UzMiBJZCwKKwljaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBSbG10U3RhdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgU2Vuc29yU3RhdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgVnBkKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sIFNLX1UzMiBJZCwKKwljaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBWY3QoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IGFjdGlvbiwgU0tfVTMyIElkLAorCWNoYXIgKnBCdWYsIHVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLAorCXVuc2lnbmVkIGludCBUYWJsZUluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworCisjaWZkZWYgU0tfUE9XRVJfTUdNVAorUE5NSV9TVEFUSUMgaW50IFBvd2VyTWFuYWdlbWVudChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CisjZW5kaWYgLyogU0tfUE9XRVJfTUdNVCAqLworCisjaWZkZWYgU0tfRElBR19TVVBQT1JUCitQTk1JX1NUQVRJQyBpbnQgRGlhZ0FjdGlvbnMoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IGFjdGlvbiwgU0tfVTMyIElkLAorCWNoYXIgKnBCdWYsIHVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLAorCXVuc2lnbmVkIGludCBUYWJsZUluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworI2VuZGlmIC8qIFNLX0RJQUdfU1VQUE9SVCAqLworCisKKy8qIGRlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSURfVEFCTEVfU0laRSAoc2l6ZW9mKElkVGFibGUpL3NpemVvZihJZFRhYmxlWzBdKSkKKworCisvKiBnbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUYWJsZSB0byBjb3JyZWxhdGUgT0lEIHdpdGggaGFuZGxlciBmdW5jdGlvbiBhbmQgaW5kZXggdG8KKyAqIGhhcmR3YXJlIHJlZ2lzdGVyIHN0b3JlZCBpbiBTdGF0QWRkcmVzcyBpZiBhcHBsaWNhYmxlLgorICovCitQTk1JX1NUQVRJQyBjb25zdCBTS19QTk1JX1RBQl9FTlRSWSBJZFRhYmxlW10gPSB7CisJe09JRF9HRU5fWE1JVF9PSywKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYfSwKKwl7T0lEX0dFTl9SQ1ZfT0ssCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hSWH0sCisJe09JRF9HRU5fWE1JVF9FUlJPUiwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9HRU5fUkNWX0VSUk9SLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX0dFTl9SQ1ZfTk9fQlVGRkVSLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX0dFTl9ESVJFQ1RFRF9GUkFNRVNfWE1JVCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYX1VOSUNBU1R9LAorCXtPSURfR0VOX01VTFRJQ0FTVF9GUkFNRVNfWE1JVCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYX01VTFRJQ0FTVH0sCisJe09JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19YTUlULAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IVFhfQlJPQURDQVNUfSwKKwl7T0lEX0dFTl9ESVJFQ1RFRF9GUkFNRVNfUkNWLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IUlhfVU5JQ0FTVH0sCisJe09JRF9HRU5fTVVMVElDQVNUX0ZSQU1FU19SQ1YsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hSWF9NVUxUSUNBU1R9LAorCXtPSURfR0VOX0JST0FEQ0FTVF9GUkFNRVNfUkNWLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IUlhfQlJPQURDQVNUfSwKKwl7T0lEX0dFTl9SQ1ZfQ1JDX0VSUk9SLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IUlhfRkNTfSwKKwl7T0lEX0dFTl9UUkFOU01JVF9RVUVVRV9MRU5HVEgsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfODAyXzNfUEVSTUFORU5UX0FERFJFU1MsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCAwfSwKKwl7T0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUywKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIDB9LAorCXtPSURfODAyXzNfUkNWX0VSUk9SX0FMSUdOTUVOVCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFJYX0ZSQU1JTkd9LAorCXtPSURfODAyXzNfWE1JVF9PTkVfQ09MTElTSU9OLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IVFhfU0lOR0xFX0NPTH0sCisJe09JRF84MDJfM19YTUlUX01PUkVfQ09MTElTSU9OUywKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYX01VTFRJX0NPTH0sCisJe09JRF84MDJfM19YTUlUX0RFRkVSUkVELAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IVFhfREVGRkVSQUx9LAorCXtPSURfODAyXzNfWE1JVF9NQVhfQ09MTElTSU9OUywKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYX0VYQ0VTU19DT0x9LAorCXtPSURfODAyXzNfUkNWX09WRVJSVU4sCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hSWF9PVkVSRkxPV30sCisJe09JRF84MDJfM19YTUlUX1VOREVSUlVOLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IVFhfVU5ERVJSVU59LAorCXtPSURfODAyXzNfWE1JVF9USU1FU19DUlNfTE9TVCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYX0NBUlJJRVJ9LAorCXtPSURfODAyXzNfWE1JVF9MQVRFX0NPTExJU0lPTlMsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hUWF9MQVRFX0NPTH0sCisjaWZkZWYgU0tfUE9XRVJfTUdNVAorCXtPSURfUE5QX0NBUEFCSUxJVElFUywKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgUG93ZXJNYW5hZ2VtZW50LCAwfSwKKwl7T0lEX1BOUF9TRVRfUE9XRVIsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfV08sIFBvd2VyTWFuYWdlbWVudCwgMH0sCisJe09JRF9QTlBfUVVFUllfUE9XRVIsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIFBvd2VyTWFuYWdlbWVudCwgMH0sCisJe09JRF9QTlBfQUREX1dBS0VfVVBfUEFUVEVSTiwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9XTywgUG93ZXJNYW5hZ2VtZW50LCAwfSwKKwl7T0lEX1BOUF9SRU1PVkVfV0FLRV9VUF9QQVRURVJOLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1dPLCBQb3dlck1hbmFnZW1lbnQsIDB9LAorCXtPSURfUE5QX0VOQUJMRV9XQUtFX1VQLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JXLCBQb3dlck1hbmFnZW1lbnQsIDB9LAorI2VuZGlmIC8qIFNLX1BPV0VSX01HTVQgKi8KKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKwl7T0lEX1NLR0VfRElBR19NT0RFLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JXLCBEaWFnQWN0aW9ucywgMH0sCisjZW5kaWYgLyogU0tfRElBR19TVVBQT1JUICovCisJe09JRF9TS0dFX01EQl9WRVJTSU9OLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoTWdtdERCVmVyc2lvbiksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9TVVBQT1JURURfTElTVCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0FMTF9EQVRBLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JXLCBPaWRTdHJ1Y3QsIDB9LAorCXtPSURfU0tHRV9WUERfRlJFRV9CWVRFUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFZwZEZyZWVCeXRlcyksCisJCVNLX1BOTUlfUk8sIFZwZCwgMH0sCisJe09JRF9TS0dFX1ZQRF9FTlRSSUVTX0xJU1QsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihWcGRFbnRyaWVzTGlzdCksCisJCVNLX1BOTUlfUk8sIFZwZCwgMH0sCisJe09JRF9TS0dFX1ZQRF9FTlRSSUVTX05VTUJFUiwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFZwZEVudHJpZXNOdW1iZXIpLAorCQlTS19QTk1JX1JPLCBWcGQsIDB9LAorCXtPSURfU0tHRV9WUERfS0VZLAorCQlTS19QTk1JX1ZQRF9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9WUEQpLAorCQlTS19QTk1JX09GRihWcGQpICsgU0tfUE5NSV9WUERfT0ZGKFZwZEtleSksCisJCVNLX1BOTUlfUk8sIFZwZCwgMH0sCisJe09JRF9TS0dFX1ZQRF9WQUxVRSwKKwkJU0tfUE5NSV9WUERfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfVlBEKSwKKwkJU0tfUE5NSV9PRkYoVnBkKSArIFNLX1BOTUlfVlBEX09GRihWcGRWYWx1ZSksCisJCVNLX1BOTUlfUk8sIFZwZCwgMH0sCisJe09JRF9TS0dFX1ZQRF9BQ0NFU1MsCisJCVNLX1BOTUlfVlBEX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1ZQRCksCisJCVNLX1BOTUlfT0ZGKFZwZCkgKyBTS19QTk1JX1ZQRF9PRkYoVnBkQWNjZXNzKSwKKwkJU0tfUE5NSV9STywgVnBkLCAwfSwKKwl7T0lEX1NLR0VfVlBEX0FDVElPTiwKKwkJU0tfUE5NSV9WUERfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfVlBEKSwKKwkJU0tfUE5NSV9PRkYoVnBkKSArIFNLX1BOTUlfVlBEX09GRihWcGRBY3Rpb24pLAorCQlTS19QTk1JX1JXLCBWcGQsIDB9LAorCXtPSURfU0tHRV9QT1JUX05VTUJFUiwJCQorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUG9ydE51bWJlciksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9ERVZJQ0VfVFlQRSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKERldmljZVR5cGUpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfRFJJVkVSX0RFU0NSLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoRHJpdmVyRGVzY3IpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfRFJJVkVSX1ZFUlNJT04sCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihEcml2ZXJWZXJzaW9uKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0RSSVZFUl9SRUxEQVRFLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoRHJpdmVyUmVsZWFzZURhdGUpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfRFJJVkVSX0ZJTEVOQU1FLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoRHJpdmVyRmlsZU5hbWUpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfSFdfREVTQ1IsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihId0Rlc2NyKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0hXX1ZFUlNJT04sCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihId1ZlcnNpb24pLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfQ0hJUFNFVCwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKENoaXBzZXQpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfQ0hJUElELAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoQ2hpcElkKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1JBTVNJWkUsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSYW1TaXplKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1ZBVVhBVkFJTCwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFZhdXhBdmFpbCksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9BQ1RJT04sCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihBY3Rpb24pLAorCQlTS19QTk1JX1JXLCBQZXJmb3JtLCAwfSwKKwl7T0lEX1NLR0VfUkVTVUxULAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoVGVzdFJlc3VsdCksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9CVVNfVFlQRSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKEJ1c1R5cGUpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfQlVTX1NQRUVELAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoQnVzU3BlZWQpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfQlVTX1dJRFRILAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoQnVzV2lkdGgpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfVFhfU1dfUVVFVUVfTEVOLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoVHhTd1F1ZXVlTGVuKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1RYX1NXX1FVRVVFX01BWCwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFR4U3dRdWV1ZU1heCksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9UWF9SRVRSWSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFR4UmV0cnlDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfUlhfSU5UUl9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSeEludHJDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfVFhfSU5UUl9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihUeEludHJDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfUlhfTk9fQlVGX0NUUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJ4Tm9CdWZDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfVFhfTk9fQlVGX0NUUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFR4Tm9CdWZDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfVFhfVVNFRF9ERVNDUl9OTywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFR4VXNlZERlc2NyTm8pLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfUlhfREVMSVZFUkVEX0NUUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJ4RGVsaXZlcmVkQ3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1JYX09DVEVUU19ERUxJVl9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSeE9jdGV0c0RlbGl2ZXJlZEN0cyksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9SWF9IV19FUlJPUl9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSeEh3RXJyb3JzQ3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1RYX0hXX0VSUk9SX0NUUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFR4SHdFcnJvcnNDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfSU5fRVJST1JTX0NUUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKEluRXJyb3JzQ3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX09VVF9FUlJPUl9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihPdXRFcnJvcnNDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfRVJSX1JFQ09WRVJZX0NUUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKEVyclJlY292ZXJ5Q3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1NZU1VQVElNRSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFN5c1VwVGltZSksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfTlVNQkVSLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoU2Vuc29yTnVtYmVyKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1NFTlNPUl9JTkRFWCwKKwkJU0tfUE5NSV9TRU5TT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU0VOU09SKSwKKwkJU0tfUE5NSV9PRkYoU2Vuc29yKSArIFNLX1BOTUlfU0VOX09GRihTZW5zb3JJbmRleCksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfREVTQ1IsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yRGVzY3IpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX1RZUEUsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yVHlwZSksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfVkFMVUUsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yVmFsdWUpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX1dBUl9USFJFU19MT1csCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yV2FybmluZ1RocmVzaG9sZExvdyksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfV0FSX1RIUkVTX1VQUCwKKwkJU0tfUE5NSV9TRU5TT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU0VOU09SKSwKKwkJU0tfUE5NSV9PRkYoU2Vuc29yKSArIFNLX1BOTUlfU0VOX09GRihTZW5zb3JXYXJuaW5nVGhyZXNob2xkSGlnaCksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfRVJSX1RIUkVTX0xPVywKKwkJU0tfUE5NSV9TRU5TT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU0VOU09SKSwKKwkJU0tfUE5NSV9PRkYoU2Vuc29yKSArIFNLX1BOTUlfU0VOX09GRihTZW5zb3JFcnJvclRocmVzaG9sZExvdyksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfRVJSX1RIUkVTX1VQUCwKKwkJU0tfUE5NSV9TRU5TT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU0VOU09SKSwKKwkJU0tfUE5NSV9PRkYoU2Vuc29yKSArIFNLX1BOTUlfU0VOX09GRihTZW5zb3JFcnJvclRocmVzaG9sZEhpZ2gpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX1NUQVRVUywKKwkJU0tfUE5NSV9TRU5TT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU0VOU09SKSwKKwkJU0tfUE5NSV9PRkYoU2Vuc29yKSArIFNLX1BOTUlfU0VOX09GRihTZW5zb3JTdGF0dXMpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX1dBUl9DVFMsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yV2FybmluZ0N0cyksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfRVJSX0NUUywKKwkJU0tfUE5NSV9TRU5TT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU0VOU09SKSwKKwkJU0tfUE5NSV9PRkYoU2Vuc29yKSArIFNLX1BOTUlfU0VOX09GRihTZW5zb3JFcnJvckN0cyksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfV0FSX1RJTUUsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yV2FybmluZ1RpbWVzdGFtcCksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfRVJSX1RJTUUsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yRXJyb3JUaW1lc3RhbXApLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfQ0hLU01fTlVNQkVSLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoQ2hlY2tzdW1OdW1iZXIpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfQ0hLU01fUlhfT0tfQ1RTLAorCQlTS0NTX05VTV9QUk9UT0NPTFMsCisJCXNpemVvZihTS19QTk1JX0NIRUNLU1VNKSwKKwkJU0tfUE5NSV9PRkYoQ2hlY2tzdW0pICsgU0tfUE5NSV9DSEtfT0ZGKENoZWNrc3VtUnhPa0N0cyksCisJCVNLX1BOTUlfUk8sIENzdW1TdGF0LCAwfSwKKwl7T0lEX1NLR0VfQ0hLU01fUlhfVU5BQkxFX0NUUywKKwkJU0tDU19OVU1fUFJPVE9DT0xTLAorCQlzaXplb2YoU0tfUE5NSV9DSEVDS1NVTSksCisJCVNLX1BOTUlfT0ZGKENoZWNrc3VtKSArIFNLX1BOTUlfQ0hLX09GRihDaGVja3N1bVJ4VW5hYmxlQ3RzKSwKKwkJU0tfUE5NSV9STywgQ3N1bVN0YXQsIDB9LAorCXtPSURfU0tHRV9DSEtTTV9SWF9FUlJfQ1RTLAorCQlTS0NTX05VTV9QUk9UT0NPTFMsCisJCXNpemVvZihTS19QTk1JX0NIRUNLU1VNKSwKKwkJU0tfUE5NSV9PRkYoQ2hlY2tzdW0pICsgU0tfUE5NSV9DSEtfT0ZGKENoZWNrc3VtUnhFcnJDdHMpLAorCQlTS19QTk1JX1JPLCBDc3VtU3RhdCwgMH0sCisJe09JRF9TS0dFX0NIS1NNX1RYX09LX0NUUywKKwkJU0tDU19OVU1fUFJPVE9DT0xTLAorCQlzaXplb2YoU0tfUE5NSV9DSEVDS1NVTSksCisJCVNLX1BOTUlfT0ZGKENoZWNrc3VtKSArIFNLX1BOTUlfQ0hLX09GRihDaGVja3N1bVR4T2tDdHMpLAorCQlTS19QTk1JX1JPLCBDc3VtU3RhdCwgMH0sCisJe09JRF9TS0dFX0NIS1NNX1RYX1VOQUJMRV9DVFMsCisJCVNLQ1NfTlVNX1BST1RPQ09MUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ0hFQ0tTVU0pLAorCQlTS19QTk1JX09GRihDaGVja3N1bSkgKyBTS19QTk1JX0NIS19PRkYoQ2hlY2tzdW1UeFVuYWJsZUN0cyksCisJCVNLX1BOTUlfUk8sIENzdW1TdGF0LCAwfSwKKwl7T0lEX1NLR0VfU1RBVF9UWCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeE9rQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9PQ1RFVFMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhPY3RldHNPa0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9PQ1RFVH0sCisJe09JRF9TS0dFX1NUQVRfVFhfQlJPQURDQVNULAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4QnJvYWRjYXN0T2tDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfQlJPQURDQVNUfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9NVUxUSUNBU1QsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhNdWx0aWNhc3RPa0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9NVUxUSUNBU1R9LAorCXtPSURfU0tHRV9TVEFUX1RYX1VOSUNBU1QsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhVbmljYXN0T2tDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfVU5JQ0FTVH0sCisJe09JRF9TS0dFX1NUQVRfVFhfTE9OR0ZSQU1FUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeExvbmdGcmFtZXNDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfTE9OR0ZSQU1FU30sCisJe09JRF9TS0dFX1NUQVRfVFhfQlVSU1QsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhCdXJzdEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9CVVJTVH0sCisJe09JRF9TS0dFX1NUQVRfVFhfUEZMT1dDLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4UGF1c2VNYWNDdHJsQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX1BNQUNDfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9GTE9XQywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeE1hY0N0cmxDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfTUFDQ30sCisJe09JRF9TS0dFX1NUQVRfVFhfU0lOR0xFX0NPTCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeFNpbmdsZUNvbGxpc2lvbkN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9TSU5HTEVfQ09MfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9NVUxUSV9DT0wsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhNdWx0aXBsZUNvbGxpc2lvbkN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9NVUxUSV9DT0x9LAorCXtPSURfU0tHRV9TVEFUX1RYX0VYQ0VTU19DT0wsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhFeGNlc3NpdmVDb2xsaXNpb25DdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfRVhDRVNTX0NPTH0sCisJe09JRF9TS0dFX1NUQVRfVFhfTEFURV9DT0wsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhMYXRlQ29sbGlzaW9uQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX0xBVEVfQ09MfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9ERUZGRVJBTCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeERlZmVycmFsQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX0RFRkZFUkFMfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9FWENFU1NfREVGLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4RXhjZXNzaXZlRGVmZXJyYWxDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfRVhDRVNTX0RFRn0sCisJe09JRF9TS0dFX1NUQVRfVFhfVU5ERVJSVU4sCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhGaWZvVW5kZXJydW5DdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfVU5ERVJSVU59LAorCXtPSURfU0tHRV9TVEFUX1RYX0NBUlJJRVIsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhDYXJyaWVyQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX0NBUlJJRVJ9LAorLyoJe09JRF9TS0dFX1NUQVRfVFhfVVRJTCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeFV0aWxpemF0aW9uKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIChTS19VMTYpKC0xKX0sICovCisJe09JRF9TS0dFX1NUQVRfVFhfNjQsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHg2NEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF82NH0sCisJe09JRF9TS0dFX1NUQVRfVFhfMTI3LAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4MTI3Q3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYXzEyN30sCisJe09JRF9TS0dFX1NUQVRfVFhfMjU1LAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4MjU1Q3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYXzI1NX0sCisJe09JRF9TS0dFX1NUQVRfVFhfNTExLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4NTExQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYXzUxMX0sCisJe09JRF9TS0dFX1NUQVRfVFhfMTAyMywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeDEwMjNDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfMTAyM30sCisJe09JRF9TS0dFX1NUQVRfVFhfTUFYLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4TWF4Q3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX01BWH0sCisJe09JRF9TS0dFX1NUQVRfVFhfU1lOQywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeFN5bmNDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfU1lOQ30sCisJe09JRF9TS0dFX1NUQVRfVFhfU1lOQ19PQ1RFVFMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhTeW5jT2N0ZXRzQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX1NZTkNfT0NURVR9LAorCXtPSURfU0tHRV9TVEFUX1JYLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4T2tDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlh9LAorCXtPSURfU0tHRV9TVEFUX1JYX09DVEVUUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeE9jdGV0c09rQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX09DVEVUfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9CUk9BRENBU1QsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhCcm9hZGNhc3RPa0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9CUk9BRENBU1R9LAorCXtPSURfU0tHRV9TVEFUX1JYX01VTFRJQ0FTVCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeE11bHRpY2FzdE9rQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX01VTFRJQ0FTVH0sCisJe09JRF9TS0dFX1NUQVRfUlhfVU5JQ0FTVCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeFVuaWNhc3RPa0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9VTklDQVNUfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9MT05HRlJBTUVTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4TG9uZ0ZyYW1lc0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9MT05HRlJBTUVTfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9QRkxPV0MsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhQYXVzZU1hY0N0cmxDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfUE1BQ0N9LAorCXtPSURfU0tHRV9TVEFUX1JYX0ZMT1dDLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4TWFjQ3RybEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9NQUNDfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9QRkxPV0NfRVJSLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4UGF1c2VNYWNDdHJsRXJyb3JDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfUE1BQ0NfRVJSfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9GTE9XQ19VTktXTiwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeE1hY0N0cmxVbmtub3duQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX01BQ0NfVU5LV059LAorCXtPSURfU0tHRV9TVEFUX1JYX0JVUlNULAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4QnVyc3RDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfQlVSU1R9LAorCXtPSURfU0tHRV9TVEFUX1JYX01JU1NFRCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeE1pc3NlZEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9NSVNTRUR9LAorCXtPSURfU0tHRV9TVEFUX1JYX0ZSQU1JTkcsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhGcmFtaW5nQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX0ZSQU1JTkd9LAorCXtPSURfU0tHRV9TVEFUX1JYX09WRVJGTE9XLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4Rmlmb092ZXJmbG93Q3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX09WRVJGTE9XfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9KQUJCRVIsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhKYWJiZXJDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfSkFCQkVSfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9DQVJSSUVSLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4Q2FycmllckN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9DQVJSSUVSfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9JUl9MRU5HVEgsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhJUkxlbmd0aEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9JUkxFTkdUSH0sCisJe09JRF9TS0dFX1NUQVRfUlhfU1lNQk9MLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4U3ltYm9sQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX1NZTUJPTH0sCisJe09JRF9TS0dFX1NUQVRfUlhfU0hPUlRTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4U2hvcnRzQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX1NIT1JUU30sCisJe09JRF9TS0dFX1NUQVRfUlhfUlVOVCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeFJ1bnRDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfUlVOVH0sCisJe09JRF9TS0dFX1NUQVRfUlhfQ0VYVCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeENleHRDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfQ0VYVH0sCisJe09JRF9TS0dFX1NUQVRfUlhfVE9PX0xPTkcsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhUb29Mb25nQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX1RPT19MT05HfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9GQ1MsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhGY3NDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfRkNTfSwKKy8qCXtPSURfU0tHRV9TVEFUX1JYX1VUSUwsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhVdGlsaXphdGlvbiksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCAoU0tfVTE2KSgtMSl9LCAqLworCXtPSURfU0tHRV9TVEFUX1JYXzY0LAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4NjRDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfNjR9LAorCXtPSURfU0tHRV9TVEFUX1JYXzEyNywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeDEyN0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF8xMjd9LAorCXtPSURfU0tHRV9TVEFUX1JYXzI1NSwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeDI1NUN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF8yNTV9LAorCXtPSURfU0tHRV9TVEFUX1JYXzUxMSwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeDUxMUN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF81MTF9LAorCXtPSURfU0tHRV9TVEFUX1JYXzEwMjMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UngxMDIzQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYXzEwMjN9LAorCXtPSURfU0tHRV9TVEFUX1JYX01BWCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeE1heEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9NQVh9LAorCXtPSURfU0tHRV9QSFlTX0NVUl9BRERSLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZk1hY0N1cnJlbnRBZGRyKSwKKwkJU0tfUE5NSV9SVywgQWRkciwgMH0sCisJe09JRF9TS0dFX1BIWVNfRkFDX0FERFIsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mTWFjRmFjdG9yeUFkZHIpLAorCQlTS19QTk1JX1JPLCBBZGRyLCAwfSwKKwl7T0lEX1NLR0VfUE1ELAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZlBNRCksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfQ09OTkVDVE9SLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZkNvbm5lY3RvciksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfUEhZX1RZUEUsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mUGh5VHlwZSksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKyNpZmRlZiBTS19QSFlfTFBfTU9ERQorCQl7T0lEX1NLR0VfUEhZX0xQX01PREUsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mUGh5TW9kZSksCisJCVNLX1BOTUlfUlcsIE1hY1ByaXZhdGVDb25mLCAwfSwKKyNlbmRpZgkKKwl7T0lEX1NLR0VfTElOS19DQVAsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mTGlua0NhcGFiaWxpdHkpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX0xJTktfTU9ERSwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZMaW5rTW9kZSksCisJCVNLX1BOTUlfUlcsIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfTElOS19NT0RFX1NUQVRVUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZMaW5rTW9kZVN0YXR1cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfTElOS19TVEFUVVMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mTGlua1N0YXR1cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfRkxPV0NUUkxfQ0FQLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZkZsb3dDdHJsQ2FwYWJpbGl0eSksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfRkxPV0NUUkxfTU9ERSwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZGbG93Q3RybE1vZGUpLAorCQlTS19QTk1JX1JXLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX0ZMT1dDVFJMX1NUQVRVUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZGbG93Q3RybFN0YXR1cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfUEhZX09QRVJBVElPTl9DQVAsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mUGh5T3BlcmF0aW9uQ2FwYWJpbGl0eSksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfUEhZX09QRVJBVElPTl9NT0RFLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZlBoeU9wZXJhdGlvbk1vZGUpLAorCQlTS19QTk1JX1JXLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX1BIWV9PUEVSQVRJT05fU1RBVFVTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZlBoeU9wZXJhdGlvblN0YXR1cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfU1BFRURfQ0FQLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZlNwZWVkQ2FwYWJpbGl0eSksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfU1BFRURfTU9ERSwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZTcGVlZE1vZGUpLAorCQlTS19QTk1JX1JXLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX1NQRUVEX1NUQVRVUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZTcGVlZFN0YXR1cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfVFJBUCwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFRyYXApLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfVFJBUF9OVU1CRVIsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihUcmFwTnVtYmVyKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1JMTVRfTU9ERSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJsbXRNb2RlKSwKKwkJU0tfUE5NSV9SVywgUmxtdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfUE9SVF9OVU1CRVIsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSbG10UG9ydE51bWJlciksCisJCVNLX1BOTUlfUk8sIFJsbXQsIDB9LAorCXtPSURfU0tHRV9STE1UX1BPUlRfQUNUSVZFLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUmxtdFBvcnRBY3RpdmUpLAorCQlTS19QTk1JX1JPLCBSbG10LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9QT1JUX1BSRUZFUlJFRCwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJsbXRQb3J0UHJlZmVycmVkKSwKKwkJU0tfUE5NSV9SVywgUmxtdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfQ0hBTkdFX0NUUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJsbXRDaGFuZ2VDdHMpLAorCQlTS19QTk1JX1JPLCBSbG10LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9DSEFOR0VfVElNRSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJsbXRDaGFuZ2VUaW1lKSwKKwkJU0tfUE5NSV9STywgUmxtdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfQ0hBTkdFX0VTVElNLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUmxtdENoYW5nZUVzdGltYXRlKSwKKwkJU0tfUE5NSV9STywgUmxtdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfQ0hBTkdFX1RIUkVTLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUmxtdENoYW5nZVRocmVzaG9sZCksCisJCVNLX1BOTUlfUlcsIFJsbXQsIDB9LAorCXtPSURfU0tHRV9STE1UX1BPUlRfSU5ERVgsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1JMTVQpLAorCQlTS19QTk1JX09GRihSbG10KSArIFNLX1BOTUlfUkxNX09GRihSbG10SW5kZXgpLAorCQlTS19QTk1JX1JPLCBSbG10U3RhdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfU1RBVFVTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9STE1UKSwKKwkJU0tfUE5NSV9PRkYoUmxtdCkgKyBTS19QTk1JX1JMTV9PRkYoUmxtdFN0YXR1cyksCisJCVNLX1BOTUlfUk8sIFJsbXRTdGF0LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9UWF9IRUxMT19DVFMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1JMTVQpLAorCQlTS19QTk1JX09GRihSbG10KSArIFNLX1BOTUlfUkxNX09GRihSbG10VHhIZWxsb0N0cyksCisJCVNLX1BOTUlfUk8sIFJsbXRTdGF0LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9SWF9IRUxMT19DVFMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1JMTVQpLAorCQlTS19QTk1JX09GRihSbG10KSArIFNLX1BOTUlfUkxNX09GRihSbG10UnhIZWxsb0N0cyksCisJCVNLX1BOTUlfUk8sIFJsbXRTdGF0LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9UWF9TUF9SRVFfQ1RTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9STE1UKSwKKwkJU0tfUE5NSV9PRkYoUmxtdCkgKyBTS19QTk1JX1JMTV9PRkYoUmxtdFR4U3BIZWxsb1JlcUN0cyksCisJCVNLX1BOTUlfUk8sIFJsbXRTdGF0LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9SWF9TUF9DVFMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1JMTVQpLAorCQlTS19QTk1JX09GRihSbG10KSArIFNLX1BOTUlfUkxNX09GRihSbG10UnhTcEhlbGxvQ3RzKSwKKwkJU0tfUE5NSV9STywgUmxtdFN0YXQsIDB9LAorCXtPSURfU0tHRV9STE1UX01PTklUT1JfTlVNQkVSLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUmxtdE1vbml0b3JOdW1iZXIpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9NT05JVE9SX0lOREVYLAorCQlTS19QTk1JX01PTklUT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfUkxNVF9NT05JVE9SKSwKKwkJU0tfUE5NSV9PRkYoUmxtdE1vbml0b3IpICsgU0tfUE5NSV9NT05fT0ZGKFJsbXRNb25pdG9ySW5kZXgpLAorCQlTS19QTk1JX1JPLCBNb25pdG9yLCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9NT05JVE9SX0FERFIsCisJCVNLX1BOTUlfTU9OSVRPUl9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9STE1UX01PTklUT1IpLAorCQlTS19QTk1JX09GRihSbG10TW9uaXRvcikgKyBTS19QTk1JX01PTl9PRkYoUmxtdE1vbml0b3JBZGRyKSwKKwkJU0tfUE5NSV9STywgTW9uaXRvciwgMH0sCisJe09JRF9TS0dFX1JMTVRfTU9OSVRPUl9FUlJTLAorCQlTS19QTk1JX01PTklUT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfUkxNVF9NT05JVE9SKSwKKwkJU0tfUE5NSV9PRkYoUmxtdE1vbml0b3IpICsgU0tfUE5NSV9NT05fT0ZGKFJsbXRNb25pdG9yRXJyb3JDdHMpLAorCQlTS19QTk1JX1JPLCBNb25pdG9yLCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9NT05JVE9SX1RJTUVTVEFNUCwKKwkJU0tfUE5NSV9NT05JVE9SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1JMTVRfTU9OSVRPUiksCisJCVNLX1BOTUlfT0ZGKFJsbXRNb25pdG9yKSArIFNLX1BOTUlfTU9OX09GRihSbG10TW9uaXRvclRpbWVzdGFtcCksCisJCVNLX1BOTUlfUk8sIE1vbml0b3IsIDB9LAorCXtPSURfU0tHRV9STE1UX01PTklUT1JfQURNSU4sCisJCVNLX1BOTUlfTU9OSVRPUl9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9STE1UX01PTklUT1IpLAorCQlTS19QTk1JX09GRihSbG10TW9uaXRvcikgKyBTS19QTk1JX01PTl9PRkYoUmxtdE1vbml0b3JBZG1pbiksCisJCVNLX1BOTUlfUlcsIE1vbml0b3IsIDB9LAorCXtPSURfU0tHRV9NVFUsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihNdHVTaXplKSwKKwkJU0tfUE5NSV9SVywgTWFjUHJpdmF0ZUNvbmYsIDB9LAorCXtPSURfU0tHRV9WQ1RfR0VULAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBWY3QsIDB9LAorCXtPSURfU0tHRV9WQ1RfU0VULAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1dPLCBWY3QsIDB9LAorCXtPSURfU0tHRV9WQ1RfU1RBVFVTLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBWY3QsIDB9LAorCXtPSURfU0tHRV9CT0FSRExFVkVMLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZXBubWkuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZXBubWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGUxYTViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlcG5taS5jCkBAIC0wLDAgKzEsODM1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tnZXBubWkuYworICogUHJvamVjdDoJR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjExMSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wOS8xNSAxMzozNTozNSAkCisgKiBQdXJwb3NlOglQcml2YXRlIE5ldHdvcmsgTWFuYWdlbWVudCBJbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9saW50CitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpICRJZDogc2tnZXBubWkuYyx2IDEuMTExIDIwMDMvMDkvMTUgMTM6MzU6MzUgdHNjaGlsbGkgRXhwICQgKEMpIE1hcnZlbGwuIjsKKyNlbmRpZiAvKiAhX2xpbnQgKi8KKworI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIKKyNpbmNsdWRlICJoL3NrdHlwZXMuaCIKKyNpbmNsdWRlICJoL3htYWNfaWkuaCIKKyNpbmNsdWRlICJoL3NrZGVidWcuaCIKKyNpbmNsdWRlICJoL3NrcXVldWUuaCIKKyNpbmNsdWRlICJoL3NrZ2Vwbm1pLmgiCisjaW5jbHVkZSAiaC9za2dlc2lycS5oIgorI2luY2x1ZGUgImgvc2tjc3VtLmgiCisjaW5jbHVkZSAiaC9za3ZwZC5oIgorI2luY2x1ZGUgImgvc2tnZWh3LmgiCisjaW5jbHVkZSAiaC9za2dlaW5pdC5oIgorI2luY2x1ZGUgImgvc2tkcnYybmQuaCIKKyNpbmNsdWRlICJoL3NrZ2Vwbm0yLmgiCisjaWZkZWYgU0tfUE9XRVJfTUdNVAorI2luY2x1ZGUgImgvc2tnZXBtZ3QuaCIKKyNlbmRpZgorLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIERFQlVHCisjZGVmaW5lIFBOTUlfU1RBVElDCXN0YXRpYworI2Vsc2UJLyogREVCVUcgKi8KKyNkZWZpbmUgUE5NSV9TVEFUSUMKKyNlbmRpZiAvKiBERUJVRyAqLworCisvKgorICogUHVibGljIEZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworaW50IFNrUG5taUluaXQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IGxldmVsKTsKK2ludCBTa1BubWlHZXRWYXIoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgU0tfVTMyIElkLCB2b2lkICpwQnVmLAorCXVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLCBTS19VMzIgTmV0SW5kZXgpOworaW50IFNrUG5taVByZVNldFZhcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19VMzIgSWQsIHZvaWQgKnBCdWYsCisJdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsIFNLX1UzMiBOZXRJbmRleCk7CitpbnQgU2tQbm1pU2V0VmFyKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBJZCwgdm9pZCAqcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwgU0tfVTMyIE5ldEluZGV4KTsKK2ludCBTa1BubWlHZXRTdHJ1Y3QoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdm9pZCAqcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBOZXRJbmRleCk7CitpbnQgU2tQbm1pUHJlU2V0U3RydWN0KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHZvaWQgKnBCdWYsCisJdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgTmV0SW5kZXgpOworaW50IFNrUG5taVNldFN0cnVjdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB2b2lkICpwQnVmLAorCXVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIE5ldEluZGV4KTsKK2ludCBTa1BubWlFdmVudChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19VMzIgRXZlbnQsIFNLX0VWUEFSQSBQYXJhbSk7CitpbnQgU2tQbm1pR2VuSW9jdGwoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdm9pZCAqIHBCdWYsCisJdW5zaWduZWQgaW50ICogcExlbiwgU0tfVTMyIE5ldEluZGV4KTsKKworCisvKgorICogUHJpdmF0ZSBGdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KKworUE5NSV9TVEFUSUMgU0tfVTggQ2FsY3VsYXRlTGlua01vZGVTdGF0dXMoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdW5zaWduZWQgaW50CisJUGh5c1BvcnRJbmRleCk7CitQTk1JX1NUQVRJQyBTS19VOCBDYWxjdWxhdGVMaW5rU3RhdHVzKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHVuc2lnbmVkIGludAorCVBoeXNQb3J0SW5kZXgpOworUE5NSV9TVEFUSUMgdm9pZCBDb3B5TWFjKGNoYXIgKnBEc3QsIFNLX01BQ19BRERSICpwTWFjKTsKK1BOTUlfU1RBVElDIHZvaWQgQ29weVRyYXBRdWV1ZShTS19BQyAqcEFDLCBjaGFyICpwRHN0QnVmKTsKK1BOTUlfU1RBVElDIFNLX1U2NCBHZXRQaHlzU3RhdFZhbChTS19BQyAqcEFDLCBTS19JT0MgSW9DLAorCXVuc2lnbmVkIGludCBQaHlzUG9ydEluZGV4LCB1bnNpZ25lZCBpbnQgU3RhdEluZGV4KTsKK1BOTUlfU1RBVElDIFNLX1U2NCBHZXRTdGF0VmFsKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHVuc2lnbmVkIGludCBMb2dQb3J0SW5kZXgsCisJdW5zaWduZWQgaW50IFN0YXRJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGNoYXIqIEdldFRyYXBFbnRyeShTS19BQyAqcEFDLCBTS19VMzIgVHJhcElkLCB1bnNpZ25lZCBpbnQgU2l6ZSk7CitQTk1JX1NUQVRJQyB2b2lkIEdldFRyYXBRdWV1ZUxlbihTS19BQyAqcEFDLCB1bnNpZ25lZCBpbnQgKnBMZW4sCisJdW5zaWduZWQgaW50ICpwRW50cmllcyk7CitQTk1JX1NUQVRJQyBpbnQgR2V0VnBkS2V5QXJyKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGNoYXIgKnBLZXlBcnIsCisJdW5zaWduZWQgaW50IEtleUFyckxlbiwgdW5zaWduZWQgaW50ICpwS2V5Tm8pOworUE5NSV9TVEFUSUMgaW50IExvb2t1cElkKFNLX1UzMiBJZCk7CitQTk1JX1NUQVRJQyBpbnQgTWFjVXBkYXRlKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHVuc2lnbmVkIGludCBGaXJzdE1hYywKKwl1bnNpZ25lZCBpbnQgTGFzdE1hYyk7CitQTk1JX1NUQVRJQyBpbnQgUG5taVN0cnVjdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgQWN0aW9uLCBjaGFyICpwQnVmLAorCXVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBQbm1pVmFyKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBBY3Rpb24sIFNLX1UzMiBJZCwKKwljaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIHZvaWQgUXVldWVSbG10TmV3TWFjVHJhcChTS19BQyAqcEFDLCB1bnNpZ25lZCBpbnQgQWN0aXZlTWFjKTsKK1BOTUlfU1RBVElDIHZvaWQgUXVldWVSbG10UG9ydFRyYXAoU0tfQUMgKnBBQywgU0tfVTMyIFRyYXBJZCwKKwl1bnNpZ25lZCBpbnQgUG9ydEluZGV4KTsKK1BOTUlfU1RBVElDIHZvaWQgUXVldWVTZW5zb3JUcmFwKFNLX0FDICpwQUMsIFNLX1UzMiBUcmFwSWQsCisJdW5zaWduZWQgaW50IFNlbnNvckluZGV4KTsKK1BOTUlfU1RBVElDIHZvaWQgUXVldWVTaW1wbGVUcmFwKFNLX0FDICpwQUMsIFNLX1UzMiBUcmFwSWQpOworUE5NSV9TVEFUSUMgdm9pZCBSZXNldENvdW50ZXIoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBSbG10VXBkYXRlKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgU2lycVVwZGF0ZShTS19BQyAqcEFDLCBTS19JT0MgSW9DKTsKK1BOTUlfU1RBVElDIHZvaWQgVmlydHVhbENvbmYoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgU0tfVTMyIElkLCBjaGFyICpwQnVmKTsKK1BOTUlfU1RBVElDIGludCBWY3QoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IEFjdGlvbiwgU0tfVTMyIElkLCBjaGFyICpwQnVmLAorCXVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLCB1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIHZvaWQgQ2hlY2tWY3RTdGF0dXMoU0tfQUMgKiwgU0tfSU9DLCBjaGFyICosIFNLX1UzMiwgU0tfVTMyKTsKKworLyoKKyAqIFRhYmxlIHRvIGNvcnJlbGF0ZSBPSUQgd2l0aCBoYW5kbGVyIGZ1bmN0aW9uIGFuZCBpbmRleCB0bworICogaGFyZHdhcmUgcmVnaXN0ZXIgc3RvcmVkIGluIFN0YXRBZGRyZXNzIGlmIGFwcGxpY2FibGUuCisgKi8KKyNpbmNsdWRlICJza2dlbWliLmMiCisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE92ZXJmbG93IHN0YXR1cyByZWdpc3RlciBiaXQgdGFibGUgYW5kIGNvcnJlc3BvbmRpbmcgY291bnRlcgorICogZGVwZW5kZW50IG9uIE1BQyB0eXBlIC0gdGhlIG51bWJlciByZWxhdGVzIHRvIHRoZSBzaXplIG9mIG92ZXJmbG93CisgKiBtYXNrIHJldHVybmVkIGJ5IHRoZSBwRm5NYWNPdmVyZmxvdyBmdW5jdGlvbgorICovCitQTk1JX1NUQVRJQyBjb25zdCBTS19VMTYgU3RhdE92cmZsd0JpdFtdW1NLX1BOTUlfTUFDX1RZUEVTXSA9IHsKKy8qIEJpdDAgICovCXsgU0tfUE5NSV9IVFgsIAkJCQlTS19QTk1JX0hUWF9VTklDQVNUfSwKKy8qIEJpdDEgICovCXsgU0tfUE5NSV9IVFhfT0NURVRISUdILCAJU0tfUE5NSV9IVFhfQlJPQURDQVNUfSwKKy8qIEJpdDIgICovCXsgU0tfUE5NSV9IVFhfT0NURVRMT1csIAlTS19QTk1JX0hUWF9QTUFDQ30sCisvKiBCaXQzICAqLwl7IFNLX1BOTUlfSFRYX0JST0FEQ0FTVCwgCVNLX1BOTUlfSFRYX01VTFRJQ0FTVH0sCisvKiBCaXQ0ICAqLwl7IFNLX1BOTUlfSFRYX01VTFRJQ0FTVCwgCVNLX1BOTUlfSFRYX09DVEVUTE9XfSwKKy8qIEJpdDUgICovCXsgU0tfUE5NSV9IVFhfVU5JQ0FTVCwgCQlTS19QTk1JX0hUWF9PQ1RFVEhJR0h9LAorLyogQml0NiAgKi8JeyBTS19QTk1JX0hUWF9MT05HRlJBTUVTLCAJU0tfUE5NSV9IVFhfNjR9LAorLyogQml0NyAgKi8JeyBTS19QTk1JX0hUWF9CVVJTVCwgCQlTS19QTk1JX0hUWF8xMjd9LAorLyogQml0OCAgKi8JeyBTS19QTk1JX0hUWF9QTUFDQywgCQlTS19QTk1JX0hUWF8yNTV9LAorLyogQml0OSAgKi8JeyBTS19QTk1JX0hUWF9NQUNDLCAJCVNLX1BOTUlfSFRYXzUxMX0sCisvKiBCaXQxMCAqLwl7IFNLX1BOTUlfSFRYX1NJTkdMRV9DT0wsIAlTS19QTk1JX0hUWF8xMDIzfSwKKy8qIEJpdDExICovCXsgU0tfUE5NSV9IVFhfTVVMVElfQ09MLCAJU0tfUE5NSV9IVFhfTUFYfSwKKy8qIEJpdDEyICovCXsgU0tfUE5NSV9IVFhfRVhDRVNTX0NPTCwgCVNLX1BOTUlfSFRYX0xPTkdGUkFNRVN9LAorLyogQml0MTMgKi8JeyBTS19QTk1JX0hUWF9MQVRFX0NPTCwgCVNLX1BOTUlfSFRYX1JFU0VSVkVEfSwKKy8qIEJpdDE0ICovCXsgU0tfUE5NSV9IVFhfREVGRkVSQUwsIAlTS19QTk1JX0hUWF9DT0x9LAorLyogQml0MTUgKi8JeyBTS19QTk1JX0hUWF9FWENFU1NfREVGLCAJU0tfUE5NSV9IVFhfTEFURV9DT0x9LAorLyogQml0MTYgKi8JeyBTS19QTk1JX0hUWF9VTkRFUlJVTiwgCVNLX1BOTUlfSFRYX0VYQ0VTU19DT0x9LAorLyogQml0MTcgKi8JeyBTS19QTk1JX0hUWF9DQVJSSUVSLCAJCVNLX1BOTUlfSFRYX01VTFRJX0NPTH0sCisvKiBCaXQxOCAqLwl7IFNLX1BOTUlfSFRYX1VUSUxVTkRFUiwgCVNLX1BOTUlfSFRYX1NJTkdMRV9DT0x9LAorLyogQml0MTkgKi8JeyBTS19QTk1JX0hUWF9VVElMT1ZFUiwgCVNLX1BOTUlfSFRYX1VOREVSUlVOfSwKKy8qIEJpdDIwICovCXsgU0tfUE5NSV9IVFhfNjQsIAkJCVNLX1BOTUlfSFRYX1JFU0VSVkVEfSwKKy8qIEJpdDIxICovCXsgU0tfUE5NSV9IVFhfMTI3LCAJCQlTS19QTk1JX0hUWF9SRVNFUlZFRH0sCisvKiBCaXQyMiAqLwl7IFNLX1BOTUlfSFRYXzI1NSwgCQkJU0tfUE5NSV9IVFhfUkVTRVJWRUR9LAorLyogQml0MjMgKi8JeyBTS19QTk1JX0hUWF81MTEsIAkJCVNLX1BOTUlfSFRYX1JFU0VSVkVEfSwKKy8qIEJpdDI0ICovCXsgU0tfUE5NSV9IVFhfMTAyMywgCQlTS19QTk1JX0hUWF9SRVNFUlZFRH0sCisvKiBCaXQyNSAqLwl7IFNLX1BOTUlfSFRYX01BWCwgCQkJU0tfUE5NSV9IVFhfUkVTRVJWRUR9LAorLyogQml0MjYgKi8JeyBTS19QTk1JX0hUWF9SRVNFUlZFRCwgCVNLX1BOTUlfSFRYX1JFU0VSVkVEfSwKKy8qIEJpdDI3ICovCXsgU0tfUE5NSV9IVFhfUkVTRVJWRUQsIAlTS19QTk1JX0hUWF9SRVNFUlZFRH0sCisvKiBCaXQyOCAqLwl7IFNLX1BOTUlfSFRYX1JFU0VSVkVELCAJU0tfUE5NSV9IVFhfUkVTRVJWRUR9LAorLyogQml0MjkgKi8JeyBTS19QTk1JX0hUWF9SRVNFUlZFRCwgCVNLX1BOTUlfSFRYX1JFU0VSVkVEfSwKKy8qIEJpdDMwICovCXsgU0tfUE5NSV9IVFhfUkVTRVJWRUQsIAlTS19QTk1JX0hUWF9SRVNFUlZFRH0sCisvKiBCaXQzMSAqLwl7IFNLX1BOTUlfSFRYX1JFU0VSVkVELCAJU0tfUE5NSV9IVFhfUkVTRVJWRUR9LAorLyogQml0MzIgKi8JeyBTS19QTk1JX0hSWCwgCQkJCVNLX1BOTUlfSFJYX1VOSUNBU1R9LAorLyogQml0MzMgKi8JeyBTS19QTk1JX0hSWF9PQ1RFVEhJR0gsIAlTS19QTk1JX0hSWF9CUk9BRENBU1R9LAorLyogQml0MzQgKi8JeyBTS19QTk1JX0hSWF9PQ1RFVExPVywgCVNLX1BOTUlfSFJYX1BNQUNDfSwKKy8qIEJpdDM1ICovCXsgU0tfUE5NSV9IUlhfQlJPQURDQVNULCAJU0tfUE5NSV9IUlhfTVVMVElDQVNUfSwKKy8qIEJpdDM2ICovCXsgU0tfUE5NSV9IUlhfTVVMVElDQVNULCAJU0tfUE5NSV9IUlhfRkNTfSwKKy8qIEJpdDM3ICovCXsgU0tfUE5NSV9IUlhfVU5JQ0FTVCwgCQlTS19QTk1JX0hSWF9SRVNFUlZFRH0sCisvKiBCaXQzOCAqLwl7IFNLX1BOTUlfSFJYX1BNQUNDLCAJCVNLX1BOTUlfSFJYX09DVEVUTE9XfSwKKy8qIEJpdDM5ICovCXsgU0tfUE5NSV9IUlhfTUFDQywgCQlTS19QTk1JX0hSWF9PQ1RFVEhJR0h9LAorLyogQml0NDAgKi8JeyBTS19QTk1JX0hSWF9QTUFDQ19FUlIsIAlTS19QTk1JX0hSWF9CQURPQ1RFVExPV30sCisvKiBCaXQ0MSAqLwl7IFNLX1BOTUlfSFJYX01BQ0NfVU5LV04sCVNLX1BOTUlfSFJYX0JBRE9DVEVUSElHSH0sCisvKiBCaXQ0MiAqLwl7IFNLX1BOTUlfSFJYX0JVUlNULCAJCVNLX1BOTUlfSFJYX1VOREVSU0laRX0sCisvKiBCaXQ0MyAqLwl7IFNLX1BOTUlfSFJYX01JU1NFRCwgCQlTS19QTk1JX0hSWF9SVU5UfSwKKy8qIEJpdDQ0ICovCXsgU0tfUE5NSV9IUlhfRlJBTUlORywgCQlTS19QTk1JX0hSWF82NH0sCisvKiBCaXQ0NSAqLwl7IFNLX1BOTUlfSFJYX09WRVJGTE9XLCAJU0tfUE5NSV9IUlhfMTI3fSwKKy8qIEJpdDQ2ICovCXsgU0tfUE5NSV9IUlhfSkFCQkVSLCAJCVNLX1BOTUlfSFJYXzI1NX0sCisvKiBCaXQ0NyAqLwl7IFNLX1BOTUlfSFJYX0NBUlJJRVIsIAkJU0tfUE5NSV9IUlhfNTExfSwKKy8qIEJpdDQ4ICovCXsgU0tfUE5NSV9IUlhfSVJMRU5HVEgsIAlTS19QTk1JX0hSWF8xMDIzfSwKKy8qIEJpdDQ5ICovCXsgU0tfUE5NSV9IUlhfU1lNQk9MLCAJCVNLX1BOTUlfSFJYX01BWH0sCisvKiBCaXQ1MCAqLwl7IFNLX1BOTUlfSFJYX1NIT1JUUywgCQlTS19QTk1JX0hSWF9MT05HRlJBTUVTfSwKKy8qIEJpdDUxICovCXsgU0tfUE5NSV9IUlhfUlVOVCwgCQlTS19QTk1JX0hSWF9UT09fTE9OR30sCisvKiBCaXQ1MiAqLwl7IFNLX1BOTUlfSFJYX1RPT19MT05HLCAJU0tfUE5NSV9IUlhfSkFCQkVSfSwKKy8qIEJpdDUzICovCXsgU0tfUE5NSV9IUlhfRkNTLCAJCQlTS19QTk1JX0hSWF9SRVNFUlZFRH0sCisvKiBCaXQ1NCAqLwl7IFNLX1BOTUlfSFJYX1JFU0VSVkVELCAJU0tfUE5NSV9IUlhfT1ZFUkZMT1d9LAorLyogQml0NTUgKi8JeyBTS19QTk1JX0hSWF9DRVhULCAJCVNLX1BOTUlfSFJYX1JFU0VSVkVEfSwKKy8qIEJpdDU2ICovCXsgU0tfUE5NSV9IUlhfVVRJTFVOREVSLCAJU0tfUE5NSV9IUlhfUkVTRVJWRUR9LAorLyogQml0NTcgKi8JeyBTS19QTk1JX0hSWF9VVElMT1ZFUiwgCVNLX1BOTUlfSFJYX1JFU0VSVkVEfSwKKy8qIEJpdDU4ICovCXsgU0tfUE5NSV9IUlhfNjQsIAkJCVNLX1BOTUlfSFJYX1JFU0VSVkVEfSwKKy8qIEJpdDU5ICovCXsgU0tfUE5NSV9IUlhfMTI3LCAJCQlTS19QTk1JX0hSWF9SRVNFUlZFRH0sCisvKiBCaXQ2MCAqLwl7IFNLX1BOTUlfSFJYXzI1NSwgCQkJU0tfUE5NSV9IUlhfUkVTRVJWRUR9LAorLyogQml0NjEgKi8JeyBTS19QTk1JX0hSWF81MTEsIAkJCVNLX1BOTUlfSFJYX1JFU0VSVkVEfSwKKy8qIEJpdDYyICovCXsgU0tfUE5NSV9IUlhfMTAyMywgCQlTS19QTk1JX0hSWF9SRVNFUlZFRH0sCisvKiBCaXQ2MyAqLwl7IFNLX1BOTUlfSFJYX01BWCwgCQkJU0tfUE5NSV9IUlhfUkVTRVJWRUR9Cit9OworCisvKgorICogVGFibGUgZm9yIGhhcmR3YXJlIHJlZ2lzdGVyIHNhdmluZyBvbiByZXNldHMgYW5kIHBvcnQgc3dpdGNoZXMKKyAqLworUE5NSV9TVEFUSUMgY29uc3QgU0tfUE5NSV9TVEFUQUREUiBTdGF0QWRkcltTS19QTk1JX01BWF9JRFhdW1NLX1BOTUlfTUFDX1RZUEVTXSA9IHsKKwkvKiBTS19QTk1JX0hUWCAqLworCXt7WE1fVFhGX09LLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IVFhfT0NURVRISUdIICovCisJe3tYTV9UWE9fT0tfSEksIFNLX1RSVUV9LCB7R01fVFhPX09LX0hJLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfT0NURVRMT1cgKi8KKwl7e1hNX1RYT19PS19MTywgU0tfRkFMU0V9LCB7R01fVFhPX09LX0xPLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFRYX0JST0FEQ0FTVCAqLworCXt7WE1fVFhGX0JDX09LLCBTS19UUlVFfSwge0dNX1RYRl9CQ19PSywgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYX01VTFRJQ0FTVCAqLworCXt7WE1fVFhGX01DX09LLCBTS19UUlVFfSwge0dNX1RYRl9NQ19PSywgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYX1VOSUNBU1QgKi8KKwl7e1hNX1RYRl9VQ19PSywgU0tfVFJVRX0sIHtHTV9UWEZfVUNfT0ssIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF9CVVJTVCAqLworCXt7WE1fVFhFX0JVUlNULCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IVFhfUE1BQ0MgKi8KKwl7e1hNX1RYRl9NUEFVU0UsIFNLX1RSVUV9LCB7R01fVFhGX01QQVVTRSwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYX01BQ0MgKi8KKwl7e1hNX1RYRl9NQ1RSTCwgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFRYX0NPTCAqLworCXt7MCwgU0tfRkFMU0V9LCB7R01fVFhGX0NPTCwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYX1NJTkdMRV9DT0wgKi8KKwl7e1hNX1RYRl9TTkdfQ09MLCBTS19UUlVFfSwge0dNX1RYRl9TTkdfQ09MLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfTVVMVElfQ09MICovCisJe3tYTV9UWEZfTVVMX0NPTCwgU0tfVFJVRX0sIHtHTV9UWEZfTVVMX0NPTCwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYX0VYQ0VTU19DT0wgKi8KKwl7e1hNX1RYRl9BQk9fQ09MLCBTS19UUlVFfSwge0dNX1RYRl9BQk9fQ09MLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfTEFURV9DT0wgKi8KKwl7e1hNX1RYRl9MQVRfQ09MLCBTS19UUlVFfSwge0dNX1RYRl9MQVRfQ09MLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfREVGRkVSQUwgKi8KKwl7e1hNX1RYRl9ERUYsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hUWF9FWENFU1NfREVGICovCisJe3tYTV9UWEZfRVhfREVGLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IVFhfVU5ERVJSVU4gKi8KKwl7e1hNX1RYRV9GSUZPX1VSLCBTS19UUlVFfSwge0dNX1RYRV9GSUZPX1VSLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfQ0FSUklFUiAqLworCXt7WE1fVFhFX0NTX0VSUiwgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFRYX1VUSUxVTkRFUiAqLworCXt7MCwgU0tfRkFMU0V9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hUWF9VVElMT1ZFUiAqLworCXt7MCwgU0tfRkFMU0V9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hUWF82NCAqLworCXt7WE1fVFhGXzY0QiwgU0tfVFJVRX0sIHtHTV9UWEZfNjRCLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfMTI3ICovCisJe3tYTV9UWEZfMTI3QiwgU0tfVFJVRX0sIHtHTV9UWEZfMTI3QiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYXzI1NSAqLworCXt7WE1fVFhGXzI1NUIsIFNLX1RSVUV9LCB7R01fVFhGXzI1NUIsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF81MTEgKi8KKwl7e1hNX1RYRl81MTFCLCBTS19UUlVFfSwge0dNX1RYRl81MTFCLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfMTAyMyAqLworCXt7WE1fVFhGXzEwMjNCLCBTS19UUlVFfSwge0dNX1RYRl8xMDIzQiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYX01BWCAqLworCXt7WE1fVFhGX01BWF9TWiwgU0tfVFJVRX0sIHtHTV9UWEZfMTUxOEIsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF9MT05HRlJBTUVTICAqLworCXt7WE1fVFhGX0xPTkcsIFNLX1RSVUV9LCB7R01fVFhGX01BWF9TWiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYX1NZTkMgKi8KKwl7ezAsIFNLX0ZBTFNFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IVFhfU1lOQ19PQ1RFVCAqLworCXt7MCwgU0tfRkFMU0V9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hUWF9SRVNFUlZFRCAqLworCXt7MCwgU0tfRkFMU0V9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWCAqLworCXt7WE1fUlhGX09LLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfT0NURVRISUdIICovCisJe3tYTV9SWE9fT0tfSEksIFNLX1RSVUV9LCB7R01fUlhPX09LX0hJLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfT0NURVRMT1cgKi8KKwl7e1hNX1JYT19PS19MTywgU0tfRkFMU0V9LCB7R01fUlhPX09LX0xPLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYX0JBRE9DVEVUSElHSCAqLworCXt7MCwgU0tfRkFMU0V9LCB7R01fUlhPX0VSUl9ISSwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX0JBRE9DVEVUTE9XICovCisJe3swLCBTS19GQUxTRX0sIHtHTV9SWE9fRVJSX0xPLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfQlJPQURDQVNUICovCisJe3tYTV9SWEZfQkNfT0ssIFNLX1RSVUV9LCB7R01fUlhGX0JDX09LLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfTVVMVElDQVNUICovCisJe3tYTV9SWEZfTUNfT0ssIFNLX1RSVUV9LCB7R01fUlhGX01DX09LLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfVU5JQ0FTVCAqLworCXt7WE1fUlhGX1VDX09LLCBTS19UUlVFfSwge0dNX1JYRl9VQ19PSywgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX1BNQUNDICovCisJe3tYTV9SWEZfTVBBVVNFLCBTS19UUlVFfSwge0dNX1JYRl9NUEFVU0UsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9NQUNDICovCisJe3tYTV9SWEZfTUNUUkwsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF9QTUFDQ19FUlIgKi8KKwl7e1hNX1JYRl9JTlZfTVAsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF9NQUNDX1VOS1dOICovCisJe3tYTV9SWEZfSU5WX01PQywgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYX0JVUlNUICovCisJe3tYTV9SWEVfQlVSU1QsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF9NSVNTRUQgKi8KKwl7e1hNX1JYRV9GTUlTUywgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYX0ZSQU1JTkcgKi8KKwl7e1hNX1JYRl9GUkFfRVJSLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfVU5ERVJTSVpFICovCisJe3swLCBTS19GQUxTRX0sIHtHTV9SWEZfU0hULCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfT1ZFUkZMT1cgKi8KKwl7e1hNX1JYRV9GSUZPX09WLCBTS19UUlVFfSwge0dNX1JYRV9GSUZPX09WLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfSkFCQkVSICovCisJe3tYTV9SWEZfSkFCX1BLVCwgU0tfVFJVRX0sIHtHTV9SWEZfSkFCX1BLVCwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX0NBUlJJRVIgKi8KKwl7e1hNX1JYRV9DQVJfRVJSLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfSVJMRU5HVEggKi8KKwl7e1hNX1JYRl9MRU5fRVJSLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfU1lNQk9MICovCisJe3tYTV9SWEVfU1lNX0VSUiwgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYX1NIT1JUUyAqLworCXt7WE1fUlhFX1NIVF9FUlIsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF9SVU5UICovCisJe3tYTV9SWEVfUlVOVCwgU0tfVFJVRX0sIHtHTV9SWEVfRlJBRywgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX1RPT19MT05HICovCisJe3tYTV9SWEZfTE5HX0VSUiwgU0tfVFJVRX0sIHtHTV9SWEZfTE5HX0VSUiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX0ZDUyAqLworCXt7WE1fUlhGX0ZDU19FUlIsIFNLX1RSVUV9LCB7R01fUlhGX0ZDU19FUlIsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9DRVhUICovCisJe3tYTV9SWEZfQ0VYX0VSUiwgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYX1VUSUxVTkRFUiAqLworCXt7MCwgU0tfRkFMU0V9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF9VVElMT1ZFUiAqLworCXt7MCwgU0tfRkFMU0V9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF82NCAqLworCXt7WE1fUlhGXzY0QiwgU0tfVFJVRX0sIHtHTV9SWEZfNjRCLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfMTI3ICovCisJe3tYTV9SWEZfMTI3QiwgU0tfVFJVRX0sIHtHTV9SWEZfMTI3QiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYXzI1NSAqLworCXt7WE1fUlhGXzI1NUIsIFNLX1RSVUV9LCB7R01fUlhGXzI1NUIsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF81MTEgKi8KKwl7e1hNX1JYRl81MTFCLCBTS19UUlVFfSwge0dNX1JYRl81MTFCLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfMTAyMyAqLworCXt7WE1fUlhGXzEwMjNCLCBTS19UUlVFfSwge0dNX1JYRl8xMDIzQiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX01BWCAqLworCXt7WE1fUlhGX01BWF9TWiwgU0tfVFJVRX0sIHtHTV9SWEZfMTUxOEIsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9MT05HRlJBTUVTICovCisJe3swLCBTS19GQUxTRX0sIHtHTV9SWEZfTUFYX1NaLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfUkVTRVJWRUQgKi8KKwl7ezAsIFNLX0ZBTFNFfSwgezAsIFNLX0ZBTFNFfX0KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUHVibGljIGZ1bmN0aW9ucworICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa1BubWlJbml0IC0gSW5pdCBmdW5jdGlvbiBvZiBQTk1JCisgKgorICogRGVzY3JpcHRpb246CisgKglTS19JTklUX0RBVEE6IEluaXRpYWxpc2VzIHRoZSBkYXRhIHN0cnVjdHVyZXMKKyAqCVNLX0lOSVRfSU86ICAgUmVzZXRzIHRoZSBYTUFDIHN0YXRpc3RpY3MsIGRldGVybWluZXMgdGhlIGRldmljZSBhbmQKKyAqCSAgICAgICAgICAgICAgY29ubmVjdG9yIHR5cGUuCisgKglTS19JTklUX1JVTjogIFN0YXJ0cyBhIHRpbWVyIGV2ZW50IGZvciBwb3J0IHN3aXRjaCBwZXIgaG91cgorICoJICAgICAgICAgICAgICBjYWxjdWxhdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICoJQWx3YXlzIDAKKyAqLworaW50IFNrUG5taUluaXQoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IExldmVsKQkJLyogSW5pdGlhbGl6YXRpb24gbGV2ZWwgKi8KK3sKKwl1bnNpZ25lZCBpbnQJUG9ydE1heDsJLyogTnVtYmVyIG9mIHBvcnRzICovCisJdW5zaWduZWQgaW50CVBvcnRJbmRleDsJLyogQ3VycmVudCBwb3J0IGluZGV4IGluIGxvb3AgKi8KKwlTS19VMTYJCVZhbDE2OwkJLyogTXVsdGlwbGUgcHVycG9zZSAxNiBiaXQgdmFyaWFibGUgKi8KKwlTS19VOAkJVmFsODsJCS8qIE11bGl0cGxlIHB1cnBvc2UgOCBiaXQgdmFyaWFibGUgKi8KKwlTS19FVlBBUkEJRXZlbnRQYXJhbTsJLyogRXZlbnQgc3RydWN0IGZvciB0aW1lciBldmVudCAqLworCVNLX1BOTUlfVkNUCSpwVmN0QmFja3VwRGF0YTsKKworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJQTk1JOiBTa1BubWlJbml0OiBDYWxsZWQsIGxldmVsPSVkXG4iLCBMZXZlbCkpOworCisJc3dpdGNoIChMZXZlbCkgeworCisJY2FzZSBTS19JTklUX0RBVEE6CisJCVNLX01FTVNFVCgoY2hhciAqKSZwQUMtPlBubWksIDAsIHNpemVvZihwQUMtPlBubWkpKTsKKwkJcEFDLT5Qbm1pLlRyYXBCdWZGcmVlID0gU0tfUE5NSV9UUkFQX1FVRVVFX0xFTjsKKwkJcEFDLT5Qbm1pLlN0YXJ0VXBUaW1lID0gU0tfUE5NSV9IVU5EUkVEU19TRUMoU2tPc0dldFRpbWUocEFDKSk7CisJCXBBQy0+UG5taS5SbG10Q2hhbmdlVGhyZXNob2xkID0gU0tfUE5NSV9ERUZfUkxNVF9DSEdfVEhSRVM7CisJCWZvciAoUG9ydEluZGV4ID0gMDsgUG9ydEluZGV4IDwgU0tfTUFYX01BQ1M7IFBvcnRJbmRleCArKykgeworCisJCQlwQUMtPlBubWkuUG9ydFtQb3J0SW5kZXhdLkFjdGl2ZUZsYWcgPSBTS19GQUxTRTsKKwkJCXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9IFNLX0ZBTFNFOworCQl9CisKKyNpZmRlZiBTS19QTk1JX0NIRUNLCisJCWlmIChTS19QTk1JX01BWF9JRFggIT0gU0tfUE5NSV9DTlRfTk8pIHsKKwkJCQorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjA0OSwgU0tfUE5NSV9FUlIwNDlNU0cpOworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9JTklUIHwgU0tfREJHQ0FUX0ZBVEFMLAorCQkJCQkgICAoIkNvdW50ZXJPZmZzZXQgc3RydWN0IHNpemUgKCVkKSBkaWZmZXJzIGZyb20iCisJCQkJCQkiU0tfUE5NSV9NQVhfSURYICglZClcbiIsCisJCQkJCQlTS19QTk1JX0NOVF9OTywgU0tfUE5NSV9NQVhfSURYKSk7CisJCX0KKworCQlpZiAoU0tfUE5NSV9NQVhfSURYICE9CisJCQkoc2l6ZW9mKFN0YXRBZGRyKSAvIChzaXplb2YoU0tfUE5NSV9TVEFUQUREUikgKiBTS19QTk1JX01BQ19UWVBFUykpKSB7CisJCQkKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwNTAsIFNLX1BOTUlfRVJSMDUwTVNHKTsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfSU5JVCB8IFNLX0RCR0NBVF9GQVRBTCwKKwkJCQkJICAgKCJTdGF0QWRkciB0YWJsZSBzaXplICglZCkgZGlmZmVycyBmcm9tICIKKwkJCQkJCSJTS19QTk1JX01BWF9JRFggKCVkKVxuIiwKKwkJCQkJCShzaXplb2YoU3RhdEFkZHIpIC8KKwkJCQkJCSAoc2l6ZW9mKFNLX1BOTUlfU1RBVEFERFIpICogU0tfUE5NSV9NQUNfVFlQRVMpKSwKKwkJCQkJCSBTS19QTk1JX01BWF9JRFgpKTsKKwkJfQorI2VuZGlmIC8qIFNLX1BOTUlfQ0hFQ0sgKi8KKwkJYnJlYWs7CisKKwljYXNlIFNLX0lOSVRfSU86CisJCS8qCisJCSAqIFJlc2V0IE1BQyBjb3VudGVycworCQkgKi8KKwkJUG9ydE1heCA9IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsKKworCQlmb3IgKFBvcnRJbmRleCA9IDA7IFBvcnRJbmRleCA8IFBvcnRNYXg7IFBvcnRJbmRleCArKykgeworCisJCQlwQUMtPkdJbmkuR0lGdW5jLnBGbk1hY1Jlc2V0Q291bnRlcihwQUMsIElvQywgUG9ydEluZGV4KTsKKwkJfQorCQkKKwkJLyogSW5pdGlhbGl6ZSBEU1AgdmFyaWFibGVzIGZvciBWY3QoKSB0byAweGZmID0+IE5ldmVyIHdyaXR0ZW4hICovCQkKKwkJZm9yIChQb3J0SW5kZXggPSAwOyBQb3J0SW5kZXggPCBQb3J0TWF4OyBQb3J0SW5kZXggKyspIHsKKwkJCXBBQy0+R0luaS5HUFtQb3J0SW5kZXhdLlBDYWJsZUxlbiA9IDB4ZmY7CisJCQlwVmN0QmFja3VwRGF0YSA9ICZwQUMtPlBubWkuVmN0QmFja3VwW1BvcnRJbmRleF07CisJCQlwVmN0QmFja3VwRGF0YS0+UENhYmxlTGVuID0gMHhmZjsKKwkJfQorCQkKKwkJLyoKKwkJICogR2V0IHBjaSBidXMgc3BlZWQKKwkJICovCisJCVNLX0lOMTYoSW9DLCBCMF9DVFNULCAmVmFsMTYpOworCQlpZiAoKFZhbDE2ICYgQ1NfQlVTX0NMT0NLKSA9PSAwKSB7CisKKwkJCXBBQy0+UG5taS5QY2lCdXNTcGVlZCA9IDMzOworCQl9CisJCWVsc2UgeworCQkJcEFDLT5Qbm1pLlBjaUJ1c1NwZWVkID0gNjY7CisJCX0KKworCQkvKgorCQkgKiBHZXQgcGNpIGJ1cyB3aWR0aAorCQkgKi8KKwkJU0tfSU4xNihJb0MsIEIwX0NUU1QsICZWYWwxNik7CisJCWlmICgoVmFsMTYgJiBDU19CVVNfU0xPVF9TWikgPT0gMCkgeworCisJCQlwQUMtPlBubWkuUGNpQnVzV2lkdGggPSAzMjsKKwkJfQorCQllbHNlIHsKKwkJCXBBQy0+UG5taS5QY2lCdXNXaWR0aCA9IDY0OworCQl9CisKKwkJLyoKKwkJICogR2V0IGNoaXBzZXQKKwkJICovCisJCXN3aXRjaCAocEFDLT5HSW5pLkdJQ2hpcElkKSB7CisJCWNhc2UgQ0hJUF9JRF9HRU5FU0lTOgorCQkJcEFDLT5Qbm1pLkNoaXBzZXQgPSBTS19QTk1JX0NISVBTRVRfWE1BQzsKKwkJCWJyZWFrOworCisJCWNhc2UgQ0hJUF9JRF9ZVUtPTjoKKwkJCXBBQy0+UG5taS5DaGlwc2V0ID0gU0tfUE5NSV9DSElQU0VUX1lVS09OOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogR2V0IFBNRCBhbmQgRGV2aWNlVHlwZQorCQkgKi8KKwkJU0tfSU44KElvQywgQjJfUE1EX1RZUCwgJlZhbDgpOworCQlzd2l0Y2ggKFZhbDgpIHsKKwkJY2FzZSAnUyc6CisJCQlwQUMtPlBubWkuUE1EID0gMzsKKwkJCWlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPiAxKSB7CisKKwkJCQlwQUMtPlBubWkuRGV2aWNlVHlwZSA9IDB4MDAwMjAwMDI7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwQUMtPlBubWkuRGV2aWNlVHlwZSA9IDB4MDAwMjAwMDE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICdMJzoKKwkJCXBBQy0+UG5taS5QTUQgPSAyOworCQkJaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA+IDEpIHsKKworCQkJCXBBQy0+UG5taS5EZXZpY2VUeXBlID0gMHgwMDAyMDAwNDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBBQy0+UG5taS5EZXZpY2VUeXBlID0gMHgwMDAyMDAwMzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJ0MnOgorCQkJcEFDLT5Qbm1pLlBNRCA9IDQ7CisJCQlpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID4gMSkgeworCisJCQkJcEFDLT5Qbm1pLkRldmljZVR5cGUgPSAweDAwMDIwMDA2OworCQkJfQorCQkJZWxzZSB7CisJCQkJcEFDLT5Qbm1pLkRldmljZVR5cGUgPSAweDAwMDIwMDA1OworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnVCc6CisJCQlwQUMtPlBubWkuUE1EID0gNTsKKwkJCWlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPiAxKSB7CisKKwkJCQlwQUMtPlBubWkuRGV2aWNlVHlwZSA9IDB4MDAwMjAwMDg7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwQUMtPlBubWkuRGV2aWNlVHlwZSA9IDB4MDAwMjAwMDc7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0IDoKKwkJCXBBQy0+UG5taS5QTUQgPSAxOworCQkJcEFDLT5Qbm1pLkRldmljZVR5cGUgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBHZXQgY29ubmVjdG9yCisJCSAqLworCQlTS19JTjgoSW9DLCBCMl9DT05OX1RZUCwgJlZhbDgpOworCQlzd2l0Y2ggKFZhbDgpIHsKKwkJY2FzZSAnQyc6CisJCQlwQUMtPlBubWkuQ29ubmVjdG9yID0gMjsKKwkJCWJyZWFrOworCisJCWNhc2UgJ0QnOgorCQkJcEFDLT5Qbm1pLkNvbm5lY3RvciA9IDM7CisJCQlicmVhazsKKworCQljYXNlICdGJzoKKwkJCXBBQy0+UG5taS5Db25uZWN0b3IgPSA0OworCQkJYnJlYWs7CisKKwkJY2FzZSAnSic6CisJCQlwQUMtPlBubWkuQ29ubmVjdG9yID0gNTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1YnOgorCQkJcEFDLT5Qbm1pLkNvbm5lY3RvciA9IDY7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcEFDLT5Qbm1pLkNvbm5lY3RvciA9IDE7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0tfSU5JVF9SVU46CisJCS8qCisJCSAqIFN0YXJ0IHRpbWVyIGZvciBSTE1UIGNoYW5nZSBjb3VudGVyCisJCSAqLworCQlTS19NRU1TRVQoKGNoYXIgKikmRXZlbnRQYXJhbSwgMCwgc2l6ZW9mKEV2ZW50UGFyYW0pKTsKKwkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5Qbm1pLlJsbXRDaGFuZ2VFc3RpbWF0ZS5Fc3RUaW1lciwKKwkJCTI4MTI1MDAwLCBTS0dFX1BOTUksIFNLX1BOTUlfRVZUX0NIR19FU1RfVElNRVIsCisJCQlFdmVudFBhcmFtKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsgLyogTm90aGluZyB0b2RvICovCisJfQorCisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tQbm1pR2V0VmFyIC0gUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBPSUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUNhbGxzIGEgZ2VuZXJhbCBzdWItZnVuY3Rpb24gZm9yIGFsbCB0aGlzIHN0dWZmLiBJZiB0aGUgaW5zdGFuY2UKKyAqCS0xIGlzIHBhc3NlZCwgdGhlIHZhbHVlcyBvZiBhbGwgaW5zdGFuY2VzIGFyZSByZXR1cm5lZCBpbiBhbgorICoJYXJyYXkgb2YgdmFsdWVzLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQKKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQKKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gdGFrZQorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXRhLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9PSUQgIFRoZSByZXF1ZXN0ZWQgT0lEIGlzIHVua25vd24KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK2ludCBTa1BubWlHZXRWYXIoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCit2b2lkICpwQnVmLAkJLyogQnVmZmVyIHRvIHdoaWNoIHRoZSBtYW5hZ2VtZW50IGRhdGEgd2lsbCBiZSBjb3BpZWQgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJQTk1JOiBTa1BubWlHZXRWYXI6IENhbGxlZCwgSWQ9MHgleCwgQnVmTGVuPSVkLCBJbnN0YW5jZT0lZCwgTmV0SW5kZXg9JWRcbiIsCisJCQlJZCwgKnBMZW4sIEluc3RhbmNlLCBOZXRJbmRleCkpOworCisJcmV0dXJuIChQbm1pVmFyKHBBQywgSW9DLCBTS19QTk1JX0dFVCwgSWQsIChjaGFyICopcEJ1ZiwgcExlbiwKKwkJSW5zdGFuY2UsIE5ldEluZGV4KSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrUG5taVByZVNldFZhciAtIFByZXNldHMgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIE9JRAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQ2FsbHMgYSBnZW5lcmFsIHN1Yi1mdW5jdGlvbiBmb3IgYWxsIHRoaXMgc3R1ZmYuIFRoZSBwcmVzZXQgZG9lcworICoJdGhlIHNhbWUgYXMgYSBzZXQsIGJ1dCByZXR1cm5zIGp1c3QgYmVmb3JlIGZpbmFsbHkgc2V0dGluZyB0aGUKKyAqCW5ldyB2YWx1ZS4gVGhpcyBpcyB1c2VmdWxsIHRvIGNoZWNrIGlmIGEgc2V0IG1pZ2h0IGJlIHN1Y2Nlc3NmdWxsLgorICoJSWYgdGhlIGluc3RhbmNlIC0xIGlzIHBhc3NlZCwgYW4gYXJyYXkgb2YgdmFsdWVzIGlzIHN1cHBvc2VkIGFuZAorICoJYWxsIGluc3RhbmNlcyBvZiB0aGUgT0lEIHdpbGwgYmUgc2V0LgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9CQURfVkFMVUUgICAgVGhlIHBhc3NlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIHZhbGlkCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgcmFuZ2UuCisgKglTS19QTk1JX0VSUl9SRUFEX09OTFkgICAgVGhlIE9JRCBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzZXQuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX09JRCAgVGhlIHJlcXVlc3RlZCBPSUQgaXMgdW5rbm93bi4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK2ludCBTa1BubWlQcmVTZXRWYXIoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCit2b2lkICpwQnVmLAkJLyogQnVmZmVyIHRvIHdoaWNoIHRoZSBtYW5hZ2VtZW50IGRhdGEgd2lsbCBiZSBjb3BpZWQgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogVG90YWwgbGVuZ3RoIG9mIG1hbmFnZW1lbnQgZGF0YSAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBzZXQgb3IgLTEgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkoIlBOTUk6IFNrUG5taVByZVNldFZhcjogQ2FsbGVkLCBJZD0weCV4LCBCdWZMZW49JWQsIEluc3RhbmNlPSVkLCBOZXRJbmRleD0lZFxuIiwKKwkJCUlkLCAqcExlbiwgSW5zdGFuY2UsIE5ldEluZGV4KSk7CisKKworCXJldHVybiAoUG5taVZhcihwQUMsIElvQywgU0tfUE5NSV9QUkVTRVQsIElkLCAoY2hhciAqKXBCdWYsIHBMZW4sCisJCUluc3RhbmNlLCBOZXRJbmRleCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa1BubWlTZXRWYXIgLSBTZXRzIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBPSUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUNhbGxzIGEgZ2VuZXJhbCBzdWItZnVuY3Rpb24gZm9yIGFsbCB0aGlzIHN0dWZmLiBUaGUgcHJlc2V0IGRvZXMKKyAqCXRoZSBzYW1lIGFzIGEgc2V0LCBidXQgcmV0dXJucyBqdXN0IGJlZm9yZSBmaW5hbGx5IHNldHRpbmcgdGhlCisgKgluZXcgdmFsdWUuIFRoaXMgaXMgdXNlZnVsbCB0byBjaGVjayBpZiBhIHNldCBtaWdodCBiZSBzdWNjZXNzZnVsbC4KKyAqCUlmIHRoZSBpbnN0YW5jZSAtMSBpcyBwYXNzZWQsIGFuIGFycmF5IG9mIHZhbHVlcyBpcyBzdXBwb3NlZCBhbmQKKyAqCWFsbCBpbnN0YW5jZXMgb2YgdGhlIE9JRCB3aWxsIGJlIHNldC4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfQkFEX1ZBTFVFICAgIFRoZSBwYXNzZWQgdmFsdWUgaXMgbm90IGluIHRoZSB2YWxpZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHJhbmdlLgorICoJU0tfUE5NSV9FUlJfUkVBRF9PTkxZICAgIFRoZSBPSUQgaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2V0LgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9PSUQgIFRoZSByZXF1ZXN0ZWQgT0lEIGlzIHVua25vd24uCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitpbnQgU2tQbm1pU2V0VmFyKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLwordm9pZCAqcEJ1ZiwJCS8qIEJ1ZmZlciB0byB3aGljaCB0aGUgbWFuYWdlbWVudCBkYXRhIHdpbGwgYmUgY29waWVkICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIFRvdGFsIGxlbmd0aCBvZiBtYW5hZ2VtZW50IGRhdGEgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgc2V0IG9yIC0xICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJQTk1JOiBTa1BubWlTZXRWYXI6IENhbGxlZCwgSWQ9MHgleCwgQnVmTGVuPSVkLCBJbnN0YW5jZT0lZCwgTmV0SW5kZXg9JWRcbiIsCisJCQlJZCwgKnBMZW4sIEluc3RhbmNlLCBOZXRJbmRleCkpOworCisJcmV0dXJuIChQbm1pVmFyKHBBQywgSW9DLCBTS19QTk1JX1NFVCwgSWQsIChjaGFyICopcEJ1ZiwgcExlbiwKKwkJSW5zdGFuY2UsIE5ldEluZGV4KSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrUG5taUdldFN0cnVjdCAtIFJldHJpZXZlcyB0aGUgbWFuYWdlbWVudCBkYXRhYmFzZSBpbiBTS19QTk1JX1NUUlVDVF9EQVRBCisgKgorICogRGVzY3JpcHRpb246CisgKglSdW5zIHRocm91Z2ggdGhlIElkVGFibGUsIHF1ZXJpZXMgdGhlIHNpbmdsZSBPSURzIGFuZCBzdG9yZXMgdGhlCisgKglyZXR1cm5lZCBkYXRhIGludG8gdGhlIG1hbmFnZW1lbnQgZGF0YWJhc2Ugc3RydWN0dXJlCisgKglTS19QTk1JX1NUUlVDVF9EQVRBLiBUaGUgb2Zmc2V0IG9mIHRoZSBPSUQgaW4gdGhlIHN0cnVjdHVyZQorICoJaXMgc3RvcmVkIGluIHRoZSBJZFRhYmxlLiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiB3aWxsIGFsc28KKyAqCWJlIHN0b3JlZCBpbiBTS19QTk1JX1NUUlVDVF9EQVRBIGlmIHRoZSBwYXNzZWQgYnVmZmVyIGhhcyB0aGUKKyAqCW1pbmltdW0gc2l6ZSBvZiBTS19QTk1JX01JTl9TVFJVQ1RfU0laRS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIHRha2UKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0YS4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fTkVUICBUaGUgcmVxdWVzdGVkIE5ldEluZGV4IGRvZXNuJ3QgZXhpc3QKKyAqLworaW50IFNrUG5taUdldFN0cnVjdCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCit2b2lkICpwQnVmLAkJLyogQnVmZmVyIHRvIHdoaWNoIHRoZSBtYW5hZ2VtZW50IGRhdGEgd2lsbCBiZSBjb3BpZWQuICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIExlbmd0aCBvZiBidWZmZXIgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlpbnQJCVJldDsKKwl1bnNpZ25lZCBpbnQJVGFibGVJbmRleDsKKwl1bnNpZ25lZCBpbnQJRHN0T2Zmc2V0OworCXVuc2lnbmVkIGludAlJbnN0YW5jZU5vOworCXVuc2lnbmVkIGludAlJbnN0YW5jZUNudDsKKwlTS19VMzIJCUluc3RhbmNlOworCXVuc2lnbmVkIGludAlUbXBMZW47CisJY2hhcgkJS2V5QXJyW1NLX1BOTUlfVlBEX0VOVFJJRVNdW1NLX1BOTUlfVlBEX0tFWV9TSVpFXTsKKworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJQTk1JOiBTa1BubWlHZXRTdHJ1Y3Q6IENhbGxlZCwgQnVmTGVuPSVkLCBOZXRJbmRleD0lZFxuIiwKKwkJCSpwTGVuLCBOZXRJbmRleCkpOworCisJaWYgKCpwTGVuIDwgU0tfUE5NSV9TVFJVQ1RfU0laRSkgeworCisJCWlmICgqcExlbiA+PSBTS19QTk1JX01JTl9TVFJVQ1RfU0laRSkgeworCisJCQlTS19QTk1JX1NFVF9TVEFUKHBCdWYsIFNLX1BOTUlfRVJSX1RPT19TSE9SVCwKKwkJCQkoU0tfVTMyKSgtMSkpOworCQl9CisKKwkJKnBMZW4gPSBTS19QTk1JX1NUUlVDVF9TSVpFOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBOZXRJbmRleAorICAgICAqLworCWlmIChOZXRJbmRleCA+PSBwQUMtPlJsbXQuTnVtTmV0cykgeworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fTkVUKTsKKwl9CisKKwkvKiBVcGRhdGUgc3RhdGlzdGljICovCisJU0tfUE5NSV9DSEVDS0ZMQUdTKCJTa1BubWlHZXRTdHJ1Y3Q6IE9uIGNhbGwiKTsKKworCWlmICgoUmV0ID0gTWFjVXBkYXRlKHBBQywgSW9DLCAwLCBwQUMtPkdJbmkuR0lNYWNzRm91bmQgLSAxKSkgIT0KKwkJU0tfUE5NSV9FUlJfT0spIHsKKworCQlTS19QTk1JX1NFVF9TVEFUKHBCdWYsIFJldCwgKFNLX1UzMikoLTEpKTsKKwkJKnBMZW4gPSBTS19QTk1JX01JTl9TVFJVQ1RfU0laRTsKKwkJcmV0dXJuIChSZXQpOworCX0KKworCWlmICgoUmV0ID0gUmxtdFVwZGF0ZShwQUMsIElvQywgTmV0SW5kZXgpKSAhPSBTS19QTk1JX0VSUl9PSykgeworCisJCVNLX1BOTUlfU0VUX1NUQVQocEJ1ZiwgUmV0LCAoU0tfVTMyKSgtMSkpOworCQkqcExlbiA9IFNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFOworCQlyZXR1cm4gKFJldCk7CisJfQorCisJaWYgKChSZXQgPSBTaXJxVXBkYXRlKHBBQywgSW9DKSkgIT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQlTS19QTk1JX1NFVF9TVEFUKHBCdWYsIFJldCwgKFNLX1UzMikoLTEpKTsKKwkJKnBMZW4gPSBTS19QTk1JX01JTl9TVFJVQ1RfU0laRTsKKwkJcmV0dXJuIChSZXQpOworCX0KKworCS8qCisJICogSW5jcmVtZW50IHNlbWFwaG9yZXMgdG8gaW5kaWNhdGUgdGhhdCBhbiB1cGRhdGUgd2FzCisJICogYWxyZWFkeSBkb25lCisJICovCisJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnICsrOworCXBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgKys7CisJcEFDLT5Qbm1pLlNpcnFVcGRhdGVkRmxhZyArKzsKKworCS8qIEdldCB2cGQga2V5cyBmb3IgaW5zdGFuY2UgY2FsY3VsYXRpb24gKi8KKwlSZXQgPSBHZXRWcGRLZXlBcnIocEFDLCBJb0MsICZLZXlBcnJbMF1bMF0sIHNpemVvZihLZXlBcnIpLCAmVG1wTGVuKTsKKwlpZiAoUmV0ICE9IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnIC0tOworCQlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnIC0tOworCQlwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnIC0tOworCisJCVNLX1BOTUlfQ0hFQ0tGTEFHUygiU2tQbm1pR2V0U3RydWN0OiBPbiByZXR1cm4iKTsKKwkJU0tfUE5NSV9TRVRfU1RBVChwQnVmLCBSZXQsIChTS19VMzIpKC0xKSk7CisJCSpwTGVuID0gU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkU7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJfQorCisJLyogUmV0cmlldmUgdmFsdWVzICovCisJU0tfTUVNU0VUKChjaGFyICopcEJ1ZiwgMCwgU0tfUE5NSV9TVFJVQ1RfU0laRSk7CisJZm9yIChUYWJsZUluZGV4ID0gMDsgVGFibGVJbmRleCA8IElEX1RBQkxFX1NJWkU7IFRhYmxlSW5kZXggKyspIHsKKworCQlJbnN0YW5jZU5vID0gSWRUYWJsZVtUYWJsZUluZGV4XS5JbnN0YW5jZU5vOworCQlmb3IgKEluc3RhbmNlQ250ID0gMTsgSW5zdGFuY2VDbnQgPD0gSW5zdGFuY2VObzsKKwkJCUluc3RhbmNlQ250ICsrKSB7CisKKwkJCURzdE9mZnNldCA9IElkVGFibGVbVGFibGVJbmRleF0uT2Zmc2V0ICsKKwkJCQkoSW5zdGFuY2VDbnQgLSAxKSAqCisJCQkJSWRUYWJsZVtUYWJsZUluZGV4XS5TdHJ1Y3RTaXplOworCisJCQkvKgorCQkJICogRm9yIHRoZSBWUEQgdGhlIGluc3RhbmNlIGlzIG5vdCBhbiBpbmRleCBudW1iZXIKKwkJCSAqIGJ1dCB0aGUga2V5IGl0c2VsZi4gRGV0ZXJtaW4gd2l0aCB0aGUgaW5zdGFuY2UKKwkJCSAqIGNvdW50ZXIgdGhlIFZQRCBrZXkgdG8gYmUgdXNlZC4KKwkJCSAqLworCQkJaWYgKElkVGFibGVbVGFibGVJbmRleF0uSWQgPT0gT0lEX1NLR0VfVlBEX0tFWSB8fAorCQkJCUlkVGFibGVbVGFibGVJbmRleF0uSWQgPT0gT0lEX1NLR0VfVlBEX1ZBTFVFIHx8CisJCQkJSWRUYWJsZVtUYWJsZUluZGV4XS5JZCA9PSBPSURfU0tHRV9WUERfQUNDRVNTIHx8CisJCQkJSWRUYWJsZVtUYWJsZUluZGV4XS5JZCA9PSBPSURfU0tHRV9WUERfQUNUSU9OKSB7CisKKwkJCQlTS19TVFJOQ1BZKChjaGFyICopJkluc3RhbmNlLCBLZXlBcnJbSW5zdGFuY2VDbnQgLSAxXSwgNCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlJbnN0YW5jZSA9IChTS19VMzIpSW5zdGFuY2VDbnQ7CisJCQl9CisKKwkJCVRtcExlbiA9ICpwTGVuIC0gRHN0T2Zmc2V0OworCQkJUmV0ID0gSWRUYWJsZVtUYWJsZUluZGV4XS5GdW5jKHBBQywgSW9DLCBTS19QTk1JX0dFVCwKKwkJCQlJZFRhYmxlW1RhYmxlSW5kZXhdLklkLCAoY2hhciAqKXBCdWYgKworCQkJCURzdE9mZnNldCwgJlRtcExlbiwgSW5zdGFuY2UsIFRhYmxlSW5kZXgsIE5ldEluZGV4KTsKKworCQkJLyoKKwkJCSAqIEFuIHVua25vd24gaW5zdGFuY2UgZXJyb3IgbWVhbnMgdGhhdCB3ZSByZWFjaGVkCisJCQkgKiB0aGUgbGFzdCBpbnN0YW5jZSBvZiB0aGF0IHZhcmlhYmxlLiBQcm9jZWVkIHdpdGgKKwkJCSAqIHRoZSBuZXh0IE9JRCBpbiB0aGUgdGFibGUgYW5kIGlnbm9yZSB0aGUgcmV0dXJuCisJCQkgKiBjb2RlLgorCQkJICovCisJCQlpZiAoUmV0ID09IFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCkgeworCisgICAgICAgICAgICAgICAgYnJlYWs7CisJCQl9CisKKwkJCWlmIChSZXQgIT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQkJCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyAtLTsKKwkJCQlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnIC0tOworCQkJCXBBQy0+UG5taS5TaXJxVXBkYXRlZEZsYWcgLS07CisKKwkJCQlTS19QTk1JX0NIRUNLRkxBR1MoIlNrUG5taUdldFN0cnVjdDogT24gcmV0dXJuIik7CisJCQkJU0tfUE5NSV9TRVRfU1RBVChwQnVmLCBSZXQsIERzdE9mZnNldCk7CisJCQkJKnBMZW4gPSBTS19QTk1JX01JTl9TVFJVQ1RfU0laRTsKKwkJCQlyZXR1cm4gKFJldCk7CisJCQl9CisJCX0KKwl9CisKKwlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgLS07CisJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyAtLTsKKwlwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnIC0tOworCisJKnBMZW4gPSBTS19QTk1JX1NUUlVDVF9TSVpFOworCVNLX1BOTUlfQ0hFQ0tGTEFHUygiU2tQbm1pR2V0U3RydWN0OiBPbiByZXR1cm4iKTsKKwlTS19QTk1JX1NFVF9TVEFUKHBCdWYsIFNLX1BOTUlfRVJSX09LLCAoU0tfVTMyKSgtMSkpOworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa1BubWlQcmVTZXRTdHJ1Y3QgLSBQcmVzZXRzIHRoZSBtYW5hZ2VtZW50IGRhdGFiYXNlIGluIFNLX1BOTUlfU1RSVUNUX0RBVEEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUNhbGxzIGEgZ2VuZXJhbCBzdWItZnVuY3Rpb24gZm9yIGFsbCB0aGlzIHNldCBzdHVmZi4gVGhlIHByZXNldCBkb2VzCisgKgl0aGUgc2FtZSBhcyBhIHNldCwgYnV0IHJldHVybnMganVzdCBiZWZvcmUgZmluYWxseSBzZXR0aW5nIHRoZQorICoJbmV3IHZhbHVlLiBUaGlzIGlzIHVzZWZ1bGwgdG8gY2hlY2sgaWYgYSBzZXQgbWlnaHQgYmUgc3VjY2Vzc2Z1bGwuCisgKglUaGUgc3ViLWZ1bmN0aW9uIHJ1bnMgdGhyb3VnaCB0aGUgSWRUYWJsZSwgY2hlY2tzIHdoaWNoIE9JRHMgYXJlIGFibGUKKyAqCXRvIHNldCwgYW5kIGNhbGxzIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIG9mIHRoZSBPSUQgdG8gcGVyZm9ybSB0aGUKKyAqCXByZXNldC4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gd2lsbCBhbHNvIGJlIHN0b3JlZCBpbgorICoJU0tfUE5NSV9TVFJVQ1RfREFUQSBpZiB0aGUgcGFzc2VkIGJ1ZmZlciBoYXMgdGhlIG1pbmltdW0gc2l6ZSBvZgorICoJU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkUuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX0JBRF9WQUxVRSAgICBUaGUgcGFzc2VkIHZhbHVlIGlzIG5vdCBpbiB0aGUgdmFsaWQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSByYW5nZS4KKyAqLworaW50IFNrUG5taVByZVNldFN0cnVjdCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCit2b2lkICpwQnVmLAkJLyogQnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBkYXRhIHRvIGJlIHNldCAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBMZW5ndGggb2YgYnVmZmVyICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJQTk1JOiBTa1BubWlQcmVTZXRTdHJ1Y3Q6IENhbGxlZCwgQnVmTGVuPSVkLCBOZXRJbmRleD0lZFxuIiwKKwkJCSpwTGVuLCBOZXRJbmRleCkpOworCisJcmV0dXJuIChQbm1pU3RydWN0KHBBQywgSW9DLCBTS19QTk1JX1BSRVNFVCwgKGNoYXIgKilwQnVmLAorICAgIAkJCQkJcExlbiwgTmV0SW5kZXgpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tQbm1pU2V0U3RydWN0IC0gU2V0cyB0aGUgbWFuYWdlbWVudCBkYXRhYmFzZSBpbiBTS19QTk1JX1NUUlVDVF9EQVRBCisgKgorICogRGVzY3JpcHRpb246CisgKglDYWxscyBhIGdlbmVyYWwgc3ViLWZ1bmN0aW9uIGZvciBhbGwgdGhpcyBzZXQgc3R1ZmYuIFRoZSByZXR1cm4gdmFsdWUKKyAqCW9mIHRoZSBmdW5jdGlvbiB3aWxsIGFsc28gYmUgc3RvcmVkIGluIFNLX1BOTUlfU1RSVUNUX0RBVEEgaWYgdGhlCisgKglwYXNzZWQgYnVmZmVyIGhhcyB0aGUgbWluaW11bSBzaXplIG9mIFNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFLgorICoJVGhlIHN1Yi1mdW5jdGlvbiBydW5zIHRocm91Z2ggdGhlIElkVGFibGUsIGNoZWNrcyB3aGljaCBPSURzIGFyZSBhYmxlCisgKgl0byBzZXQsIGFuZCBjYWxscyB0aGUgaGFuZGxlciBmdW5jdGlvbiBvZiB0aGUgT0lEIHRvIHBlcmZvcm0gdGhlCisgKglzZXQuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyBiZSBzdG9yZWQgaW4KKyAqCVNLX1BOTUlfU1RSVUNUX0RBVEEgaWYgdGhlIHBhc3NlZCBidWZmZXIgaGFzIHRoZSBtaW5pbXVtIHNpemUgb2YKKyAqCVNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9CQURfVkFMVUUgICAgVGhlIHBhc3NlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIHZhbGlkCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgcmFuZ2UuCisgKi8KK2ludCBTa1BubWlTZXRTdHJ1Y3QoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLwordm9pZCAqcEJ1ZiwJCS8qIEJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgZGF0YSB0byBiZSBzZXQgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogTGVuZ3RoIG9mIGJ1ZmZlciAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiUE5NSTogU2tQbm1pU2V0U3RydWN0OiBDYWxsZWQsIEJ1Zkxlbj0lZCwgTmV0SW5kZXg9JWRcbiIsCisJCQkqcExlbiwgTmV0SW5kZXgpKTsKKworCXJldHVybiAoUG5taVN0cnVjdChwQUMsIElvQywgU0tfUE5NSV9TRVQsIChjaGFyICopcEJ1ZiwKKyAgICAJCQkJCXBMZW4sIE5ldEluZGV4KSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrUG5taUV2ZW50IC0gRXZlbnQgaGFuZGxlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJSGFuZGxlcyB0aGUgZm9sbG93aW5nIGV2ZW50czoKKyAqCVNLX1BOTUlfRVZUX1NJUlFfT1ZFUkZMT1cgICAgIFdoZW4gYSBoYXJkd2FyZSBjb3VudGVyIG92ZXJmbG93cyBhbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IHdpbGwgYmUgZ2VuZXJhdGVkIHdoaWNoIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBoYW5kbGVkIGJ5IFNJUlEgd2hpY2ggZ2VuZXJhdGVzIGEKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZXZlbnQuIFRoZSBldmVudCBpbmNyZW1lbnRzIHRoZQorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgMzIgYml0IG9mIHRoZSA2NCBiaXQgY291bnRlci4KKyAqCVNLX1BOTUlfRVZUX1NFTl9YWFggICAgICAgICAgIFRoZSBldmVudCBpcyBnZW5lcmF0ZWQgYnkgdGhlIEkyQyBtb2R1bGUKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gYSBzZW5zb3IgcmVwb3J0cyBhIHdhcm5pbmcgb3IKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLiBUaGUgZXZlbnQgd2lsbCBzdG9yZSBhIHRyYXAKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgaW4gdGhlIHRyYXAgYnVmZmVyLgorICoJU0tfUE5NSV9FVlRfQ0hHX0VTVF9USU1FUiAgICAgVGhlIHRpbWVyIGV2ZW50IHdhcyBpbml0aWF0ZWQgYnkgdGhpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIGFuZCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgc3dpdGNoZXMgcGVyIGhvdXIuCisgKglTS19QTk1JX0VWVF9DTEVBUl9DT1VOVEVSICAgICBUaGUgZXZlbnQgY2xlYXJzIGFsbCBjb3VudGVycyBhbmQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcHMuCisgKglTS19QTk1JX0VWVF9YTUFDX1JFU0VUICAgICAgICBUaGUgZXZlbnQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBkcml2ZXIKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBhIGhhcmQgcmVzZXQgb2YgdGhlIFhNQUMgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gQWxsIGNvdW50ZXJzIHdpbGwgYmUgc2F2ZWQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhZGRlZCB0byB0aGUgaGFyZHdhcmUgY291bnRlcgorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIGFmdGVyIHJlc2V0IHRvIGdyYW50IGNvbnRpbnVvdXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgdmFsdWVzLgorICoJU0tfUE5NSV9FVlRfUkxNVF9QT1JUX1VQICAgICAgR2VuZXJhdGVkIGJ5IFJMTVQgdG8gbm90aWZ5IHRoYXQgYSBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZW50IGxvZ2ljYWxseSB1cC4gQSB0cmFwIG1lc3NhZ2Ugd2lsbAorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc3RvcmVkIHRvIHRoZSB0cmFwIGJ1ZmZlci4KKyAqCVNLX1BOTUlfRVZUX1JMTVRfUE9SVF9ET1dOICAgIEdlbmVyYXRlZCBieSBSTE1UIHRvIG5vdGlmeSB0aGF0IGEgcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VudCBsb2dpY2FsbHkgZG93bi4gQSB0cmFwIG1lc3NhZ2Ugd2lsbAorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc3RvcmVkIHRvIHRoZSB0cmFwIGJ1ZmZlci4KKyAqCVNLX1BOTUlfRVZUX1JMTVRfU0VHTUVOVEFUSU9OIEdlbmVyYXRlZCBieSBSTE1UIHRvIG5vdGlmeSB0aGF0IHR3bworICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbm5pbmcgdHJlZSByb290IGJyaWRnZXMgd2VyZQorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0ZWQuIEEgdHJhcCBtZXNzYWdlIHdpbGwgYmUgc3RvcmVkCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgdHJhcCBidWZmZXIuCisgKglTS19QTk1JX0VWVF9STE1UX0FDVElWRV9ET1dOICBOb3RpZmllcyBQTk1JIHRoYXQgYW4gYWN0aXZlIHBvcnQgd2VudAorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bi4gUE5NSSB3aWxsIG5vdCBmdXJ0aGVyIGFkZCB0aGUKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpc3RpYyB2YWx1ZXMgdG8gdGhlIHZpcnR1YWwgcG9ydC4KKyAqCVNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX1VQICAgIE5vdGlmaWVzIFBOTUkgdGhhdCBhIHBvcnQgd2VudCB1cCBhbmQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdyBhbiBhY3RpdmUgcG9ydC4gUE5NSSB3aWxsIG5vdworICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkIHRoZSBzdGF0aXN0aWMgZGF0YSBvZiB0aGlzIHBvcnQgdG8KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2aXJ0dWFsIHBvcnQuCisgKglTS19QTk1JX0VWVF9STE1UX1NFVF9ORVRTICAgICBOb3RpZmllcyBQTk1JIGFib3V0IHRoZSBuZXQgbW9kZS4gVGhlIGZpcnN0IHBhcmFtZXRlcgorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIG51bWJlciBvZiBuZXRzLiAxIG1lYW5zIHNpbmdsZSBuZXQsIDIgbWVhbnMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1YWwgbmV0LiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyAtMQorICoKKyAqIFJldHVybnM6CisgKglBbHdheXMgMAorICovCitpbnQgU2tQbm1pRXZlbnQoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworU0tfVTMyIEV2ZW50LAkJLyogRXZlbnQtSWQgKi8KK1NLX0VWUEFSQSBQYXJhbSkJLyogRXZlbnQgZGVwZW5kZW50IHBhcmFtZXRlciAqLworeworCXVuc2lnbmVkIGludAlQaHlzUG9ydEluZGV4OworICAgIHVuc2lnbmVkIGludAlNYXhOZXROdW1iZXI7CisJaW50CQkJQ291bnRlckluZGV4OworCWludAkJCVJldDsKKwlTS19VMTYJCU1hY1N0YXR1czsKKwlTS19VNjQJCU92ZXJmbG93U3RhdHVzOworCVNLX1U2NAkJTWFzazsKKwlpbnQJCQlNYWNUeXBlOworCVNLX1U2NAkJVmFsdWU7CisJU0tfVTMyCQlWYWwzMjsKKwlTS19VMTYJCVJlZ2lzdGVyOworCVNLX0VWUEFSQQlFdmVudFBhcmFtOworCVNLX1U2NAkJTmV3ZXN0VmFsdWU7CisJU0tfVTY0CQlPbGRlc3RWYWx1ZTsKKwlTS19VNjQJCURlbHRhOworCVNLX1BOTUlfRVNUSU1BVEUgKnBFc3Q7CisJU0tfVTMyCQlOZXRJbmRleDsKKwlTS19HRVBPUlQJKnBQcnQ7CisJU0tfUE5NSV9WQ1QJKnBWY3RCYWNrdXBEYXRhOworCVNLX1UzMgkJUmV0Q29kZTsKKwlpbnQJCWk7CisJU0tfVTMyCQlDYWJsZUxlbmd0aDsKKworCisjaWZkZWYgREVCVUcKKwlpZiAoRXZlbnQgIT0gU0tfUE5NSV9FVlRfWE1BQ19SRVNFVCkgeworCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlBOTUk6IFNrUG5taUV2ZW50OiBDYWxsZWQsIEV2ZW50PTB4JXgsIFBhcmFtPTB4JXhcbiIsCisJCQkodW5zaWduZWQgaW50KUV2ZW50LCAodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCkpOworCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCVNLX1BOTUlfQ0hFQ0tGTEFHUygiU2tQbm1pRXZlbnQ6IE9uIGNhbGwiKTsKKworCU1hY1R5cGUgPSBwQUMtPkdJbmkuR0lNYWNUeXBlOworCQorCXN3aXRjaCAoRXZlbnQpIHsKKworCWNhc2UgU0tfUE5NSV9FVlRfU0lSUV9PVkVSRkxPVzoKKwkJUGh5c1BvcnRJbmRleCA9IChpbnQpUGFyYW0uUGFyYTMyWzBdOworCQlNYWNTdGF0dXMgPSAoU0tfVTE2KVBhcmFtLlBhcmEzMlsxXTsKKyNpZmRlZiBERUJVRworCQlpZiAoUGh5c1BvcnRJbmRleCA+PSBTS19NQVhfTUFDUykgeworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiUE5NSTogRVJSOiBTa1BubWlFdmVudDogU0tfUE5NSV9FVlRfU0lSUV9PVkVSRkxPVyBwYXJhbWV0ZXIiCisJCQkJICIgd3JvbmcsIFBoeXNQb3J0SW5kZXg9MHgleFxuIiwKKwkJCQlQaHlzUG9ydEluZGV4KSk7CisJCQlyZXR1cm4gKDApOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKwkJT3ZlcmZsb3dTdGF0dXMgPSAwOworCisJCS8qCisJCSAqIENoZWNrIHdoaWNoIHNvdXJjZSBjYXVzZWQgYW4gb3ZlcmZsb3cgaW50ZXJydXB0LgorCQkgKi8KKwkJaWYgKChwQUMtPkdJbmkuR0lGdW5jLnBGbk1hY092ZXJmbG93KHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCU1hY1N0YXR1cywgJk92ZXJmbG93U3RhdHVzKSAhPSAwKSB8fAorCQkJKE92ZXJmbG93U3RhdHVzID09IDApKSB7CisKKwkJCVNLX1BOTUlfQ0hFQ0tGTEFHUygiU2tQbm1pRXZlbnQ6IE9uIHJldHVybiIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCS8qCisJCSAqIENoZWNrIHRoZSBvdmVyZmxvdyBzdGF0dXMgcmVnaXN0ZXIgYW5kIGluY3JlbWVudAorCQkgKiB0aGUgdXBwZXIgZHdvcmQgb2YgY29ycmVzcG9uZGluZyBjb3VudGVyLgorCQkgKi8KKwkJZm9yIChDb3VudGVySW5kZXggPSAwOyBDb3VudGVySW5kZXggPCBzaXplb2YoTWFzaykgKiA4OworCQkJQ291bnRlckluZGV4ICsrKSB7CisKKwkJCU1hc2sgPSAoU0tfVTY0KTEgPDwgQ291bnRlckluZGV4OworCQkJaWYgKChPdmVyZmxvd1N0YXR1cyAmIE1hc2spID09IDApIHsKKworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlzd2l0Y2ggKFN0YXRPdnJmbHdCaXRbQ291bnRlckluZGV4XVtNYWNUeXBlXSkgeworCisJCQljYXNlIFNLX1BOTUlfSFRYX1VUSUxVTkRFUjoKKwkJCWNhc2UgU0tfUE5NSV9IVFhfVVRJTE9WRVI6CisJCQkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCQkJWE1fSU4xNihJb0MsIFBoeXNQb3J0SW5kZXgsIFhNX1RYX0NNRCwgJlJlZ2lzdGVyKTsKKwkJCQkJUmVnaXN0ZXIgfD0gWE1fVFhfU0FNX0xJTkU7CisJCQkJCVhNX09VVDE2KElvQywgUGh5c1BvcnRJbmRleCwgWE1fVFhfQ01ELCBSZWdpc3Rlcik7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFNLX1BOTUlfSFJYX1VUSUxVTkRFUjoKKwkJCWNhc2UgU0tfUE5NSV9IUlhfVVRJTE9WRVI6CisJCQkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCQkJWE1fSU4xNihJb0MsIFBoeXNQb3J0SW5kZXgsIFhNX1JYX0NNRCwgJlJlZ2lzdGVyKTsKKwkJCQkJUmVnaXN0ZXIgfD0gWE1fUlhfU0FNX0xJTkU7CisJCQkJCVhNX09VVDE2KElvQywgUGh5c1BvcnRJbmRleCwgWE1fUlhfQ01ELCBSZWdpc3Rlcik7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFNLX1BOTUlfSFRYX09DVEVUSElHSDoKKwkJCWNhc2UgU0tfUE5NSV9IVFhfT0NURVRMT1c6CisJCQljYXNlIFNLX1BOTUlfSFRYX1JFU0VSVkVEOgorCQkJY2FzZSBTS19QTk1JX0hSWF9PQ1RFVEhJR0g6CisJCQljYXNlIFNLX1BOTUlfSFJYX09DVEVUTE9XOgorCQkJY2FzZSBTS19QTk1JX0hSWF9JUkxFTkdUSDoKKwkJCWNhc2UgU0tfUE5NSV9IUlhfUkVTRVJWRUQ6CisJCQkKKwkJCS8qCisJCQkgKiB0aGUgZm9sbG93aW5nIGNvdW50ZXJzIGFyZW4ndCBiZSBoYW5kbGVkIChpZCA+IDYzKQorCQkJICovCisJCQljYXNlIFNLX1BOTUlfSFRYX1NZTkM6CisJCQljYXNlIFNLX1BOTUlfSFRYX1NZTkNfT0NURVQ6CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU0tfUE5NSV9IUlhfTE9OR0ZSQU1FUzoKKwkJCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfR01BQykgeworCQkJCQlwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS4KKwkJCQkJCUNvdW50ZXJIaWdoW0NvdW50ZXJJbmRleF0gKys7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLgorCQkJCQlDb3VudGVySGlnaFtDb3VudGVySW5kZXhdICsrOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0VWVF9TRU5fV0FSX0xPVzoKKyNpZmRlZiBERUJVRworCQlpZiAoKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQgPj0gKHVuc2lnbmVkIGludClwQUMtPkkyYy5NYXhTZW5zKSB7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJQTk1JOiBFUlI6IFNrUG5taUV2ZW50OiBTS19QTk1JX0VWVF9TRU5fV0FSX0xPVyBwYXJhbWV0ZXIgd3JvbmcsIFNlbnNvckluZGV4PSVkXG4iLAorCQkJCSh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0KSk7CisJCQlyZXR1cm4gKDApOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCQkvKgorCQkgKiBTdG9yZSBhIHRyYXAgbWVzc2FnZSBpbiB0aGUgdHJhcCBidWZmZXIgYW5kIGdlbmVyYXRlCisJCSAqIGFuIGV2ZW50IGZvciB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorCQkgKiBTS19EUklWRVJfU0VOREVWRU5UIG1hY3JvLgorCQkgKi8KKwkJUXVldWVTZW5zb3JUcmFwKHBBQywgT0lEX1NLR0VfVFJBUF9TRU5fV0FSX0xPVywKKwkJCSh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0KTsKKwkJKHZvaWQpU0tfRFJJVkVSX1NFTkRFVkVOVChwQUMsIElvQyk7CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0VWVF9TRU5fV0FSX1VQUDoKKyNpZmRlZiBERUJVRworCQlpZiAoKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQgPj0gKHVuc2lnbmVkIGludClwQUMtPkkyYy5NYXhTZW5zKSB7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJQTk1JOiBFUlI6IFNrUG5taUV2ZW50OiBTS19QTk1JX0VWVF9TRU5fV0FSX1VQUCBwYXJhbWV0ZXIgd3JvbmcsIFNlbnNvckluZGV4PSVkXG4iLAorCQkJCSh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0KSk7CisJCQlyZXR1cm4gKDApOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCQkvKgorCQkgKiBTdG9yZSBhIHRyYXAgbWVzc2FnZSBpbiB0aGUgdHJhcCBidWZmZXIgYW5kIGdlbmVyYXRlCisJCSAqIGFuIGV2ZW50IGZvciB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorCQkgKiBTS19EUklWRVJfU0VOREVWRU5UIG1hY3JvLgorCQkgKi8KKwkJUXVldWVTZW5zb3JUcmFwKHBBQywgT0lEX1NLR0VfVFJBUF9TRU5fV0FSX1VQUCwKKwkJCSh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0KTsKKwkJKHZvaWQpU0tfRFJJVkVSX1NFTkRFVkVOVChwQUMsIElvQyk7CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0VWVF9TRU5fRVJSX0xPVzoKKyNpZmRlZiBERUJVRworCQlpZiAoKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQgPj0gKHVuc2lnbmVkIGludClwQUMtPkkyYy5NYXhTZW5zKSB7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJQTk1JOiBFUlI6IFNrUG5taUV2ZW50OiBTS19QTk1JX0VWVF9TRU5fRVJSX0xPVyBwYXJhbWV0ZXIgd3JvbmcsIFNlbnNvckluZGV4PSVkXG4iLAorCQkJCSh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0KSk7CisJCQlyZXR1cm4gKDApOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCQkvKgorCQkgKiBTdG9yZSBhIHRyYXAgbWVzc2FnZSBpbiB0aGUgdHJhcCBidWZmZXIgYW5kIGdlbmVyYXRlCisJCSAqIGFuIGV2ZW50IGZvciB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorCQkgKiBTS19EUklWRVJfU0VOREVWRU5UIG1hY3JvLgorCQkgKi8KKwkJUXVldWVTZW5zb3JUcmFwKHBBQywgT0lEX1NLR0VfVFJBUF9TRU5fRVJSX0xPVywKKwkJCSh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0KTsKKwkJKHZvaWQpU0tfRFJJVkVSX1NFTkRFVkVOVChwQUMsIElvQyk7CisJCWJyZWFrOworCQorCWNhc2UgU0tfUE5NSV9FVlRfU0VOX0VSUl9VUFA6CisjaWZkZWYgREVCVUcKKwkJaWYgKCh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0ID49ICh1bnNpZ25lZCBpbnQpcEFDLT5JMmMuTWF4U2VucykgeworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiUE5NSTogRVJSOiBTa1BubWlFdmVudDogU0tfUE5NSV9FVlRfU0VOX0VSUl9VUFAgcGFyYW1ldGVyIHdyb25nLCBTZW5zb3JJbmRleD0lZFxuIiwKKwkJCQkodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCkpOworCQkJcmV0dXJuICgwKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwkJLyoKKwkJICogU3RvcmUgYSB0cmFwIG1lc3NhZ2UgaW4gdGhlIHRyYXAgYnVmZmVyIGFuZCBnZW5lcmF0ZQorCQkgKiBhbiBldmVudCBmb3IgdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKKwkJICogU0tfRFJJVkVSX1NFTkRFVkVOVCBtYWNyby4KKwkJICovCisJCVF1ZXVlU2Vuc29yVHJhcChwQUMsIE9JRF9TS0dFX1RSQVBfU0VOX0VSUl9VUFAsCisJCQkodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCk7CisJCSh2b2lkKVNLX0RSSVZFUl9TRU5ERVZFTlQocEFDLCBJb0MpOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9FVlRfQ0hHX0VTVF9USU1FUjoKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHBvcnQgc3dpdGNoIGF2ZXJhZ2Ugb24gYSBwZXIgaG91ciBiYXNpcworCQkgKiAgIFRpbWUgaW50ZXJ2YWwgZm9yIGNoZWNrICAgICAgIDogMjgxMjUgbXMKKwkJICogICBOdW1iZXIgb2YgdmFsdWVzIGZvciBhdmVyYWdlICA6IDgKKwkJICoKKwkJICogQmUgY2FyZWZ1bCBpbiBjaGFuZ2luZyB0aGVzZSB2YWx1ZXMsIG9uIGNoYW5nZSBjaGVjaworCQkgKiAgIC0gdHlwZWRlZiBvZiBTS19QTk1JX0VTVElNQVRFIChTaXplIG9mIEVzdFZhbHVlCisJCSAqICAgICBhcnJheSBvbmUgbGVzcyB0aGFuIHZhbHVlIG51bWJlcikKKwkJICogICAtIFRpbWVyIGluaXRpYWxpemF0aW9uIFNrVGltZXJTdGFydCgpIGluIFNrUG5taUluaXQKKwkJICogICAtIERlbHRhIHZhbHVlIGJlbG93IG11c3QgYmUgbXVsdGlwbGljYXRlZCB3aXRoCisJCSAqICAgICBwb3dlciBvZiAyCisJCSAqCisJCSAqLworCQlwRXN0ID0gJnBBQy0+UG5taS5SbG10Q2hhbmdlRXN0aW1hdGU7CisJCUNvdW50ZXJJbmRleCA9IHBFc3QtPkVzdFZhbHVlSW5kZXggKyAxOworCQlpZiAoQ291bnRlckluZGV4ID09IDcpIHsKKworCQkJQ291bnRlckluZGV4ID0gMDsKKwkJfQorCQlwRXN0LT5Fc3RWYWx1ZUluZGV4ID0gQ291bnRlckluZGV4OworCisJCU5ld2VzdFZhbHVlID0gcEFDLT5Qbm1pLlJsbXRDaGFuZ2VDdHM7CisJCU9sZGVzdFZhbHVlID0gcEVzdC0+RXN0VmFsdWVbQ291bnRlckluZGV4XTsKKwkJcEVzdC0+RXN0VmFsdWVbQ291bnRlckluZGV4XSA9IE5ld2VzdFZhbHVlOworCisJCS8qCisJCSAqIENhbGN1bGF0ZSBhdmVyYWdlLiBEZWx0YSBzdG9yZXMgdGhlIG51bWJlciBvZgorCQkgKiBwb3J0IHN3aXRjaGVzIHBlciAyODEyNSAqIDggPSAyMjUwMDAgbXMKKwkJICovCisJCWlmIChOZXdlc3RWYWx1ZSA+PSBPbGRlc3RWYWx1ZSkgeworCisJCQlEZWx0YSA9IE5ld2VzdFZhbHVlIC0gT2xkZXN0VmFsdWU7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBPdmVyZmxvdyBzaXR1YXRpb24gKi8KKwkJCURlbHRhID0gKFNLX1U2NCkoMCAtIE9sZGVzdFZhbHVlKSArIE5ld2VzdFZhbHVlOworCQl9CisKKwkJLyoKKwkJICogRXh0cmFwb2xhdGUgZGVsdGEgdG8gcG9ydCBzd2l0Y2hlcyBwZXIgaG91ci4KKwkJICogICAgIEVzdGltYXRlID0gRGVsdGEgKiAoMzYwMDAwMCAvIDIyNTAwMCkKKwkJICogICAgICAgICAgICAgID0gRGVsdGEgKiAxNgorCQkgKiAgICAgICAgICAgICAgPSBEZWx0YSA8PCA0CisJCSAqLworCQlwQUMtPlBubWkuUmxtdENoYW5nZUVzdGltYXRlLkVzdGltYXRlID0gRGVsdGEgPDwgNDsKKworCQkvKgorCQkgKiBDaGVjayBpZiB0aHJlc2hvbGQgaXMgZXhjZWVkZWQuIElmIHRoZSB0aHJlc2hvbGQgaXMKKwkJICogcGVybWFuZW50bHkgZXhjZWVkZWQgZXZlcnkgMjgxMjUgbXMgYW4gZXZlbnQgd2lsbCBiZQorCQkgKiBnZW5lcmF0ZWQgdG8gcmVtaW5kIHRoZSB1c2VyIG9mIHRoaXMgY29uZGl0aW9uLgorCQkgKi8KKwkJaWYgKChwQUMtPlBubWkuUmxtdENoYW5nZVRocmVzaG9sZCAhPSAwKSAmJgorCQkJKHBBQy0+UG5taS5SbG10Q2hhbmdlRXN0aW1hdGUuRXN0aW1hdGUgPj0KKwkJCXBBQy0+UG5taS5SbG10Q2hhbmdlVGhyZXNob2xkKSkgeworCisJCQlRdWV1ZVNpbXBsZVRyYXAocEFDLCBPSURfU0tHRV9UUkFQX1JMTVRfQ0hBTkdFX1RIUkVTKTsKKwkJCSh2b2lkKVNLX0RSSVZFUl9TRU5ERVZFTlQocEFDLCBJb0MpOworCQl9CisKKwkJU0tfTUVNU0VUKChjaGFyICopJkV2ZW50UGFyYW0sIDAsIHNpemVvZihFdmVudFBhcmFtKSk7CisJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBBQy0+UG5taS5SbG10Q2hhbmdlRXN0aW1hdGUuRXN0VGltZXIsCisJCQkyODEyNTAwMCwgU0tHRV9QTk1JLCBTS19QTk1JX0VWVF9DSEdfRVNUX1RJTUVSLAorCQkJRXZlbnRQYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0VWVF9DTEVBUl9DT1VOVEVSOgorCQkvKgorCQkgKiAgUGFyYW0uUGFyYTMyWzBdIGNvbnRhaW5zIHRoZSBOZXRJbmRleCAoMCAuLjEpLgorCQkgKiAgUGFyYW0uUGFyYTMyWzFdIGlzIHJlc2VydmVkLCBjb250YWlucyAtMS4KKwkJICovCisJCU5ldEluZGV4ID0gKFNLX1UzMilQYXJhbS5QYXJhMzJbMF07CisKKyNpZmRlZiBERUJVRworCQlpZiAoTmV0SW5kZXggPj0gcEFDLT5SbG10Lk51bU5ldHMpIHsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlBOTUk6IEVSUjogU2tQbm1pRXZlbnQ6IFNLX1BOTUlfRVZUX0NMRUFSX0NPVU5URVIgcGFyYW1ldGVyIHdyb25nLCBOZXRJbmRleD0lZFxuIiwKKwkJCQlOZXRJbmRleCkpOworCisJCQlyZXR1cm4gKDApOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCQkvKgorCQkgKiBTZXQgYWxsIGNvdW50ZXJzIGFuZCB0aW1lc3RhbXBzIHRvIHplcm8uCisJCSAqIFRoZSBhY2NvcmRpbmcgTmV0SW5kZXggaXMgcmVxdWlyZWQgYXMgYQorCQkgKiBwYXJhbWV0ZXIgb2YgdGhlIGV2ZW50LgorCQkgKi8KKwkJUmVzZXRDb3VudGVyKHBBQywgSW9DLCBOZXRJbmRleCk7CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0VWVF9YTUFDX1JFU0VUOgorCQkvKgorCQkgKiBUbyBncmFudCBjb250aW51b3VzIGNvdW50ZXIgdmFsdWVzIHN0b3JlIHRoZSBjdXJyZW50CisJCSAqIFhNQUMgc3RhdGlzdGljIHZhbHVlcyB0byB0aGUgZW50cmllcyAxLi5uIG9mIHRoZQorCQkgKiBDb3VudGVyT2Zmc2V0IGFycmF5LiBYTUFDIEVycmF0YSAjMgorCQkgKi8KKyNpZmRlZiBERUJVRworCQlpZiAoKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQgPj0gU0tfTUFYX01BQ1MpIHsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlBOTUk6IEVSUjogU2tQbm1pRXZlbnQ6IFNLX1BOTUlfRVZUX1hNQUNfUkVTRVQgcGFyYW1ldGVyIHdyb25nLCBQaHlzUG9ydEluZGV4PSVkXG4iLAorCQkJCSh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0KSk7CisJCQlyZXR1cm4gKDApOworCQl9CisjZW5kaWYKKwkJUGh5c1BvcnRJbmRleCA9ICh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0OworCisJCS8qCisJCSAqIFVwZGF0ZSBYTUFDIHN0YXRpc3RpYyB0byBnZXQgZnJlc2ggdmFsdWVzCisJCSAqLworCQlSZXQgPSBNYWNVcGRhdGUocEFDLCBJb0MsIDAsIHBBQy0+R0luaS5HSU1hY3NGb3VuZCAtIDEpOworCQlpZiAoUmV0ICE9IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJCVNLX1BOTUlfQ0hFQ0tGTEFHUygiU2tQbm1pRXZlbnQ6IE9uIHJldHVybiIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQkvKgorCQkgKiBJbmNyZW1lbnQgc2VtYXBob3JlIHRvIGluZGljYXRlIHRoYXQgYW4gdXBkYXRlIHdhcworCQkgKiBhbHJlYWR5IGRvbmUKKwkJICovCisJCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyArKzsKKworCQlmb3IgKENvdW50ZXJJbmRleCA9IDA7IENvdW50ZXJJbmRleCA8IFNLX1BOTUlfTUFYX0lEWDsKKwkJCUNvdW50ZXJJbmRleCArKykgeworCisJCQlpZiAoIVN0YXRBZGRyW0NvdW50ZXJJbmRleF1bTWFjVHlwZV0uR2V0T2Zmc2V0KSB7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uQ291bnRlck9mZnNldFtDb3VudGVySW5kZXhdID0KKwkJCQlHZXRQaHlzU3RhdFZhbChwQUMsIElvQywgUGh5c1BvcnRJbmRleCwgQ291bnRlckluZGV4KTsKKwkJCQorCQkJcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uQ291bnRlckhpZ2hbQ291bnRlckluZGV4XSA9IDA7CisJCX0KKworCQlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgLS07CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0VWVF9STE1UX1BPUlRfVVA6CisJCVBoeXNQb3J0SW5kZXggPSAodW5zaWduZWQgaW50KVBhcmFtLlBhcmEzMlswXTsKKyNpZmRlZiBERUJVRworCQlpZiAoUGh5c1BvcnRJbmRleCA+PSBTS19NQVhfTUFDUykgeworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiUE5NSTogRVJSOiBTa1BubWlFdmVudDogU0tfUE5NSV9FVlRfUkxNVF9QT1JUX1VQIHBhcmFtZXRlciIKKyAgICAgICAgICAgICAgICAgIiB3cm9uZywgUGh5c1BvcnRJbmRleD0lZFxuIiwgUGh5c1BvcnRJbmRleCkpOworCisJCQlyZXR1cm4gKDApOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCQkvKgorCQkgKiBTdG9yZSBhIHRyYXAgbWVzc2FnZSBpbiB0aGUgdHJhcCBidWZmZXIgYW5kIGdlbmVyYXRlIGFuIGV2ZW50IGZvcgorCQkgKiB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucyB3aXRoIHRoZSBTS19EUklWRVJfU0VOREVWRU5UIG1hY3JvLgorCQkgKi8KKwkJUXVldWVSbG10UG9ydFRyYXAocEFDLCBPSURfU0tHRV9UUkFQX1JMTVRfUE9SVF9VUCwgUGh5c1BvcnRJbmRleCk7CisJCSh2b2lkKVNLX0RSSVZFUl9TRU5ERVZFTlQocEFDLCBJb0MpOworCisJCS8qIEJ1Z2ZpeCBmb3IgWE1BQyBlcnJhdGEgKCMxMDYyMCkqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJLyogQWRkIGluY3JlbWVudGFsIGRpZmZlcmVuY2UgdG8gb2Zmc2V0ICgjMTA2MjApKi8KKwkJCSh2b2lkKXBBQy0+R0luaS5HSUZ1bmMucEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCVhNX1JYRV9TSFRfRVJSLCAmVmFsMzIpOworCQkJCisJCQlWYWx1ZSA9ICgoKFNLX1U2NClwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS4KKwkJCQkgQ291bnRlckhpZ2hbU0tfUE5NSV9IUlhfU0hPUlRTXSA8PCAzMikgfCAoU0tfVTY0KVZhbDMyKTsKKwkJCXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLkNvdW50ZXJPZmZzZXRbU0tfUE5NSV9IUlhfU0hPUlRTXSArPQorCQkJCVZhbHVlIC0gcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uUnhTaG9ydFplcm9NYXJrOworCQl9CisJCQorCQkvKiBUZWxsIFZjdFN0YXR1cygpIHRoYXQgYSBsaW5rIHdhcyB1cCBtZWFud2hpbGUuICovCisJCXBBQy0+UG5taS5WY3RTdGF0dXNbUGh5c1BvcnRJbmRleF0gfD0gU0tfUE5NSV9WQ1RfTElOSzsJCQorCQlicmVhazsKKworICAgIGNhc2UgU0tfUE5NSV9FVlRfUkxNVF9QT1JUX0RPV046CisJCVBoeXNQb3J0SW5kZXggPSAodW5zaWduZWQgaW50KVBhcmFtLlBhcmEzMlswXTsKKworI2lmZGVmIERFQlVHCisJCWlmIChQaHlzUG9ydEluZGV4ID49IFNLX01BWF9NQUNTKSB7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJQTk1JOiBFUlI6IFNrUG5taUV2ZW50OiBTS19QTk1JX0VWVF9STE1UX1BPUlRfRE9XTiBwYXJhbWV0ZXIiCisgICAgICAgICAgICAgICAgICIgd3JvbmcsIFBoeXNQb3J0SW5kZXg9JWRcbiIsIFBoeXNQb3J0SW5kZXgpKTsKKworCQkJcmV0dXJuICgwKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwkJLyoKKwkJICogU3RvcmUgYSB0cmFwIG1lc3NhZ2UgaW4gdGhlIHRyYXAgYnVmZmVyIGFuZCBnZW5lcmF0ZSBhbiBldmVudCBmb3IKKwkJICogdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUgU0tfRFJJVkVSX1NFTkRFVkVOVCBtYWNyby4KKwkJICovCisJCVF1ZXVlUmxtdFBvcnRUcmFwKHBBQywgT0lEX1NLR0VfVFJBUF9STE1UX1BPUlRfRE9XTiwgUGh5c1BvcnRJbmRleCk7CisJCSh2b2lkKVNLX0RSSVZFUl9TRU5ERVZFTlQocEFDLCBJb0MpOworCisJCS8qIEJ1Z2ZpeCAjMTA2MjAgLSBnZXQgemVybyBsZXZlbCBmb3IgaW5jcmVtZW50YWwgZGlmZmVyZW5jZSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCisJCQkodm9pZClwQUMtPkdJbmkuR0lGdW5jLnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQlYTV9SWEVfU0hUX0VSUiwgJlZhbDMyKTsKKwkJCQorCQkJcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uUnhTaG9ydFplcm9NYXJrID0KKwkJCQkoKChTS19VNjQpcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uCisJCQkJIENvdW50ZXJIaWdoW1NLX1BOTUlfSFJYX1NIT1JUU10gPDwgMzIpIHwgKFNLX1U2NClWYWwzMik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX0RPV046CisJCVBoeXNQb3J0SW5kZXggPSAodW5zaWduZWQgaW50KVBhcmFtLlBhcmEzMlswXTsKKwkJTmV0SW5kZXggPSAoU0tfVTMyKVBhcmFtLlBhcmEzMlsxXTsKKworI2lmZGVmIERFQlVHCisJCWlmIChQaHlzUG9ydEluZGV4ID49IFNLX01BWF9NQUNTKSB7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJQTk1JOiBFUlI6IFNrUG5taUV2ZW50OiBTS19QTk1JX0VWVF9STE1UX0FDVElWRV9ET1dOIHBhcmFtZXRlciB0b28gaGlnaCwgUGh5c1BvcnQ9JWRcbiIsCisJCQkJUGh5c1BvcnRJbmRleCkpOworCQl9CisKKwkJaWYgKE5ldEluZGV4ID49IHBBQy0+UmxtdC5OdW1OZXRzKSB7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJQTk1JOiBFUlI6IFNrUG5taUV2ZW50OiBTS19QTk1JX0VWVF9STE1UX0FDVElWRV9ET1dOIHBhcmFtZXRlciB0b28gaGlnaCwgTmV0SW5kZXg9JWRcbiIsCisJCQkJTmV0SW5kZXgpKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwkJLyoKKwkJICogRm9yIG5vdywgaWdub3JlIGV2ZW50IGlmIE5ldEluZGV4ICE9IDAuCisJCSAqLworCQlpZiAoUGFyYW0uUGFyYTMyWzFdICE9IDApIHsKKworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCS8qCisJCSAqIE5vdGhpbmcgdG8gZG8gaWYgcG9ydCBpcyBhbHJlYWR5IGluYWN0aXZlCisJCSAqLworCQlpZiAoIXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLkFjdGl2ZUZsYWcpIHsKKworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCS8qCisJCSAqIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlcnMgdG8gY2FsY3VsYXRlIG5ldyBvZmZzZXQgZm9yIHRoZSB2aXJ0dWFsCisJCSAqIHBvcnQgYW5kIGluY3JlbWVudCBzZW1hcGhvcmUgdG8gaW5kaWNhdGUgdGhhdCBhbiB1cGRhdGUgd2FzIGFscmVhZHkKKwkJICogZG9uZS4KKwkJICovCisJCWlmIChNYWNVcGRhdGUocEFDLCBJb0MsIDAsIHBBQy0+R0luaS5HSU1hY3NGb3VuZCAtIDEpICE9CisJCQlTS19QTk1JX0VSUl9PSykgeworCisJCQlTS19QTk1JX0NIRUNLRkxBR1MoIlNrUG5taUV2ZW50OiBPbiByZXR1cm4iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnICsrOworCisJCS8qCisJCSAqIENhbGN1bGF0ZSBuZXcgY291bnRlciBvZmZzZXQgZm9yIHZpcnR1YWwgcG9ydCB0byBncmFudCBjb250aW5vdXMKKwkJICogY291bnRpbmcgb24gcG9ydCBzd2l0Y2hlcy4gVGhlIHZpcnR1YWwgcG9ydCBjb25zaXN0cyBvZiBhbGwgY3VycmVudGx5CisJCSAqIGFjdGl2ZSBwb3J0cy4gVGhlIHBvcnQgZG93biBldmVudCBpbmRpY2F0ZXMgdGhhdCBhIHBvcnQgaXMgcmVtb3ZlZAorCQkgKiBmcm9tIHRoZSB2aXJ0dWFsIHBvcnQuIFRoZXJlZm9yZSBhZGQgdGhlIGNvdW50ZXIgdmFsdWUgb2YgdGhlIHJlbW92ZWQKKwkJICogcG9ydCB0byB0aGUgQ291bnRlck9mZnNldCBmb3IgdGhlIHZpcnR1YWwgcG9ydCB0byBncmFudCB0aGUgc2FtZQorCQkgKiBjb3VudGVyIHZhbHVlLgorCQkgKi8KKwkJZm9yIChDb3VudGVySW5kZXggPSAwOyBDb3VudGVySW5kZXggPCBTS19QTk1JX01BWF9JRFg7CisJCQlDb3VudGVySW5kZXggKyspIHsKKworCQkJaWYgKCFTdGF0QWRkcltDb3VudGVySW5kZXhdW01hY1R5cGVdLkdldE9mZnNldCkgeworCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCVZhbHVlID0gR2V0UGh5c1N0YXRWYWwocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsIENvdW50ZXJJbmRleCk7CisKKwkJCXBBQy0+UG5taS5WaXJ0dWFsQ291bnRlck9mZnNldFtDb3VudGVySW5kZXhdICs9IFZhbHVlOworCQl9CisKKwkJLyoKKwkJICogU2V0IHBvcnQgdG8gaW5hY3RpdmUKKwkJICovCisJCXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLkFjdGl2ZUZsYWcgPSBTS19GQUxTRTsKKworCQlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgLS07CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0VWVF9STE1UX0FDVElWRV9VUDoKKwkJUGh5c1BvcnRJbmRleCA9ICh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTMyWzBdOworCQlOZXRJbmRleCA9IChTS19VMzIpUGFyYW0uUGFyYTMyWzFdOworCisjaWZkZWYgREVCVUcKKwkJaWYgKFBoeXNQb3J0SW5kZXggPj0gU0tfTUFYX01BQ1MpIHsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlBOTUk6IEVSUjogU2tQbm1pRXZlbnQ6IFNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX1VQIHBhcmFtZXRlciB0b28gaGlnaCwgUGh5c1BvcnQ9JWRcbiIsCisJCQkJUGh5c1BvcnRJbmRleCkpOworCQl9CisKKwkJaWYgKE5ldEluZGV4ID49IHBBQy0+UmxtdC5OdW1OZXRzKSB7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJQTk1JOiBFUlI6IFNrUG5taUV2ZW50OiBTS19QTk1JX0VWVF9STE1UX0FDVElWRV9VUCBwYXJhbWV0ZXIgdG9vIGhpZ2gsIE5ldEluZGV4PSVkXG4iLAorCQkJCU5ldEluZGV4KSk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJCS8qCisJCSAqIEZvciBub3csIGlnbm9yZSBldmVudCBpZiBOZXRJbmRleCAhPSAwLgorCQkgKi8KKwkJaWYgKFBhcmFtLlBhcmEzMlsxXSAhPSAwKSB7CisKKwkJCXJldHVybiAoMCk7CisJCX0KKworCQkvKgorCQkgKiBOb3RoaW5nIHRvIGRvIGlmIHBvcnQgaXMgYWxyZWFkeSBhY3RpdmUKKwkJICovCisJCWlmIChwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5BY3RpdmVGbGFnKSB7CisKKwkJCXJldHVybiAoMCk7CisJCX0KKworCQkvKgorCQkgKiBTdGF0aXN0aWMgbWFpbnRlbmFuY2UKKwkJICovCisJCXBBQy0+UG5taS5SbG10Q2hhbmdlQ3RzICsrOworCQlwQUMtPlBubWkuUmxtdENoYW5nZVRpbWUgPSBTS19QTk1JX0hVTkRSRURTX1NFQyhTa09zR2V0VGltZShwQUMpKTsKKworCQkvKgorCQkgKiBTdG9yZSBhIHRyYXAgbWVzc2FnZSBpbiB0aGUgdHJhcCBidWZmZXIgYW5kIGdlbmVyYXRlIGFuIGV2ZW50IGZvcgorCQkgKiB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucyB3aXRoIHRoZSBTS19EUklWRVJfU0VOREVWRU5UIG1hY3JvLgorCQkgKi8KKwkJUXVldWVSbG10TmV3TWFjVHJhcChwQUMsIFBoeXNQb3J0SW5kZXgpOworCQkodm9pZClTS19EUklWRVJfU0VOREVWRU5UKHBBQywgSW9DKTsKKworCQkvKgorCQkgKiBVcGRhdGUgc3RhdGlzdGljIGNvdW50ZXJzIHRvIGNhbGN1bGF0ZSBuZXcgb2Zmc2V0IGZvciB0aGUgdmlydHVhbAorCQkgKiBwb3J0IGFuZCBpbmNyZW1lbnQgc2VtYXBob3JlIHRvIGluZGljYXRlIHRoYXQgYW4gdXBkYXRlIHdhcworCQkgKiBhbHJlYWR5IGRvbmUuCisJCSAqLworCQlpZiAoTWFjVXBkYXRlKHBBQywgSW9DLCAwLCBwQUMtPkdJbmkuR0lNYWNzRm91bmQgLSAxKSAhPQorCQkJU0tfUE5NSV9FUlJfT0spIHsKKworCQkJU0tfUE5NSV9DSEVDS0ZMQUdTKCJTa1BubWlFdmVudDogT24gcmV0dXJuIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyArKzsKKworCQkvKgorCQkgKiBDYWxjdWxhdGUgbmV3IGNvdW50ZXIgb2Zmc2V0IGZvciB2aXJ0dWFsIHBvcnQgdG8gZ3JhbnQgY29udGlub3VzCisJCSAqIGNvdW50aW5nIG9uIHBvcnQgc3dpdGNoZXMuIEEgbmV3IHBvcnQgaXMgYWRkZWQgdG8gdGhlIHZpcnR1YWwgcG9ydC4KKwkJICogVGhlcmVmb3JlIHN1YnN0cmFjdCB0aGUgY291bnRlciB2YWx1ZSBvZiB0aGUgbmV3IHBvcnQgZnJvbSB0aGUKKwkJICogQ291bnRlck9mZnNldCBmb3IgdGhlIHZpcnR1YWwgcG9ydCB0byBncmFudCB0aGUgc2FtZSB2YWx1ZS4KKwkJICovCisJCWZvciAoQ291bnRlckluZGV4ID0gMDsgQ291bnRlckluZGV4IDwgU0tfUE5NSV9NQVhfSURYOworCQkJQ291bnRlckluZGV4ICsrKSB7CisKKwkJCWlmICghU3RhdEFkZHJbQ291bnRlckluZGV4XVtNYWNUeXBlXS5HZXRPZmZzZXQpIHsKKworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlWYWx1ZSA9IEdldFBoeXNTdGF0VmFsKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LCBDb3VudGVySW5kZXgpOworCisJCQlwQUMtPlBubWkuVmlydHVhbENvdW50ZXJPZmZzZXRbQ291bnRlckluZGV4XSAtPSBWYWx1ZTsKKwkJfQorCisJCS8qIFNldCBwb3J0IHRvIGFjdGl2ZSAqLworCQlwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5BY3RpdmVGbGFnID0gU0tfVFJVRTsKKworCQlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgLS07CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0VWVF9STE1UX1NFR01FTlRBVElPTjoKKwkJLyoKKwkJICogUGFyYS5QYXJhMzJbMF0gY29udGFpbnMgdGhlIE5ldEluZGV4LgorCQkgKi8KKworCQkvKgorCQkgKiBTdG9yZSBhIHRyYXAgbWVzc2FnZSBpbiB0aGUgdHJhcCBidWZmZXIgYW5kIGdlbmVyYXRlIGFuIGV2ZW50IGZvcgorCQkgKiB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucyB3aXRoIHRoZSBTS19EUklWRVJfU0VOREVWRU5UIG1hY3JvLgorCQkgKi8KKwkJUXVldWVTaW1wbGVUcmFwKHBBQywgT0lEX1NLR0VfVFJBUF9STE1UX1NFR01FTlRBVElPTik7CisJCSh2b2lkKVNLX0RSSVZFUl9TRU5ERVZFTlQocEFDLCBJb0MpOworCQlicmVhazsKKworICAgIGNhc2UgU0tfUE5NSV9FVlRfUkxNVF9TRVRfTkVUUzoKKwkJLyoKKwkJICogIFBhcmFtLlBhcmEzMlswXSBjb250YWlucyB0aGUgbnVtYmVyIG9mIE5ldHMuCisJCSAqICBQYXJhbS5QYXJhMzJbMV0gaXMgcmVzZXJ2ZWQsIGNvbnRhaW5zIC0xLgorCQkgKi8KKwkgICAgLyoKKyAgICAJICogQ2hlY2sgbnVtYmVyIG9mIG5ldHMKKwkJICovCisJCU1heE5ldE51bWJlciA9IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsKKwkJaWYgKCgodW5zaWduZWQgaW50KVBhcmFtLlBhcmEzMlswXSA8IDEpCisJCQl8fCAoKHVuc2lnbmVkIGludClQYXJhbS5QYXJhMzJbMF0gPiBNYXhOZXROdW1iZXIpKSB7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fTkVUKTsKKwkJfQorCisgICAgICAgIGlmICgodW5zaWduZWQgaW50KVBhcmFtLlBhcmEzMlswXSA9PSAxKSB7IC8qIHNpbmdsZSBuZXQgbW9kZSAqLworICAgICAgICAJcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID0gU0tfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8qIGR1YWwgbmV0IG1vZGUgKi8KKyAgICAgICAgCXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9IFNLX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNLX1BOTUlfRVZUX1ZDVF9SRVNFVDoKKwkJUGh5c1BvcnRJbmRleCA9IFBhcmFtLlBhcmEzMlswXTsKKwkJcFBydCA9ICZwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF07CisJCXBWY3RCYWNrdXBEYXRhID0gJnBBQy0+UG5taS5WY3RCYWNrdXBbUGh5c1BvcnRJbmRleF07CisJCQorCQlpZiAocEFDLT5Qbm1pLlZjdFN0YXR1c1tQaHlzUG9ydEluZGV4XSAmIFNLX1BOTUlfVkNUX1BFTkRJTkcpIHsKKwkJCVJldENvZGUgPSBTa0dtQ2FibGVEaWFnU3RhdHVzKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LCBTS19GQUxTRSk7CisJCQlpZiAoUmV0Q29kZSA9PSAyKSB7CisJCQkJLyoKKwkJCQkgKiBWQ1QgdGVzdCBpcyBzdGlsbCBydW5uaW5nLgorCQkJCSAqIFN0YXJ0IFZDVCB0aW1lciBjb3VudGVyIGFnYWluLgorCQkJCSAqLworCQkJCVNLX01FTVNFVCgoY2hhciAqKSAmUGFyYW0sIDAsIHNpemVvZihQYXJhbSkpOworCQkJCVBhcmFtLlBhcmEzMlswXSA9IFBoeXNQb3J0SW5kZXg7CisJCQkJUGFyYW0uUGFyYTMyWzFdID0gLTE7CisJCQkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLAorCQkJCQkmcEFDLT5Qbm1pLlZjdFRpbWVvdXRbUGh5c1BvcnRJbmRleF0uVmN0VGltZXIsCisJCQkJNDAwMDAwMCwgU0tHRV9QTk1JLCBTS19QTk1JX0VWVF9WQ1RfUkVTRVQsIFBhcmFtKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBBQy0+UG5taS5WY3RTdGF0dXNbUGh5c1BvcnRJbmRleF0gJj0gflNLX1BOTUlfVkNUX1BFTkRJTkc7CisJCQlwQUMtPlBubWkuVmN0U3RhdHVzW1BoeXNQb3J0SW5kZXhdIHw9CisJCQkJKFNLX1BOTUlfVkNUX05FV19WQ1RfREFUQSB8IFNLX1BOTUlfVkNUX1RFU1RfRE9ORSk7CisJCQkKKwkJCS8qIENvcHkgcmVzdWx0cyBmb3IgbGF0ZXIgdXNlIHRvIFBOTUkgc3RydWN0LiAqLworCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgIHsKKwkJCQlpZiAocFBydC0+UE1kaVBhaXJTdHNbaV0gPT0gU0tfUE5NSV9WQ1RfTk9STUFMX0NBQkxFKSB7CisJCQkJCWlmICgocFBydC0+UE1kaVBhaXJMZW5baV0gPiAzNSkgJiYKKwkJCQkJCShwUHJ0LT5QTWRpUGFpckxlbltpXSA8IDB4ZmYpKSB7CisJCQkJCQlwUHJ0LT5QTWRpUGFpclN0c1tpXSA9IFNLX1BOTUlfVkNUX0lNUEVEQU5DRV9NSVNNQVRDSDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoKHBQcnQtPlBNZGlQYWlyTGVuW2ldID4gMzUpICYmCisJCQkJCShwUHJ0LT5QTWRpUGFpckxlbltpXSAhPSAweGZmKSkgeworCQkJCQlDYWJsZUxlbmd0aCA9IDEwMDAgKgorCQkJCQkJKCgoMTc1ICogcFBydC0+UE1kaVBhaXJMZW5baV0pIC8gMjEwKSAtIDI4KTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCUNhYmxlTGVuZ3RoID0gMDsKKwkJCQl9CisJCQkJcFZjdEJhY2t1cERhdGEtPlBNZGlQYWlyTGVuW2ldID0gQ2FibGVMZW5ndGg7CisJCQkJcFZjdEJhY2t1cERhdGEtPlBNZGlQYWlyU3RzW2ldID0gcFBydC0+UE1kaVBhaXJTdHNbaV07CisJCQl9CisJCQkKKwkJCVBhcmFtLlBhcmEzMlswXSA9IFBoeXNQb3J0SW5kZXg7CisJCQlQYXJhbS5QYXJhMzJbMV0gPSAtMTsKKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUE9SVF9SRVNFVCwgUGFyYW0pOworCQkJU2tFdmVudERpc3BhdGNoZXIocEFDLCBJb0MpOworCQl9CisJCQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCVNLX1BOTUlfQ0hFQ0tGTEFHUygiU2tQbm1pRXZlbnQ6IE9uIHJldHVybiIpOworCXJldHVybiAoMCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFByaXZhdGUgZnVuY3Rpb25zCisgKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFBubWlWYXIgLSBHZXRzLCBwcmVzZXRzLCBhbmQgc2V0cyBzaW5nbGUgT0lEcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJTG9va3MgdXAgdGhlIHJlcXVlc3RlZCBPSUQsIGNhbGxzIHRoZSBjb3JyZXNwb25kaW5nIGhhbmRsZXIKKyAqCWZ1bmN0aW9uLCBhbmQgcGFzc2VzIHRoZSBwYXJhbWV0ZXJzIHdpdGggdGhlIGdldCwgcHJlc2V0LCBvcgorICoJc2V0IGNvbW1hbmQuIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgU2tHZVBubWlHZXRWYXIsCisgKglTa0dlUG5taVByZVNldFZhciwgb3IgU2tHZVBubWlTZXRWYXIuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX1hYWC4gRm9yIGRldGFpbHMgaGF2ZSBhIGxvb2sgYXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZQorICoJY2FsbGluZyBmdW5jdGlvbnMuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX05FVCAgVGhlIHJlcXVlc3RlZCBOZXRJbmRleCBkb2Vzbid0IGV4aXN0CisgKi8KK1BOTUlfU1RBVElDIGludCBQbm1pVmFyKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIFRvdGFsIGxlbmd0aCBvZiBwQnVmIG1hbmFnZW1lbnQgZGF0YSAgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgc2V0IG9yIC0xICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJdW5zaWduZWQgaW50CVRhYmxlSW5kZXg7CisJaW50CQlSZXQ7CisKKworCWlmICgoVGFibGVJbmRleCA9IExvb2t1cElkKElkKSkgPT0gKHVuc2lnbmVkIGludCkoLTEpKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fT0lEKTsKKwl9CisJCisgICAgLyogQ2hlY2sgTmV0SW5kZXggKi8KKwlpZiAoTmV0SW5kZXggPj0gcEFDLT5SbG10Lk51bU5ldHMpIHsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX05FVCk7CisJfQorCisJU0tfUE5NSV9DSEVDS0ZMQUdTKCJQbm1pVmFyOiBPbiBjYWxsIik7CisKKwlSZXQgPSBJZFRhYmxlW1RhYmxlSW5kZXhdLkZ1bmMocEFDLCBJb0MsIEFjdGlvbiwgSWQsIHBCdWYsIHBMZW4sCisJCUluc3RhbmNlLCBUYWJsZUluZGV4LCBOZXRJbmRleCk7CisKKwlTS19QTk1JX0NIRUNLRkxBR1MoIlBubWlWYXI6IE9uIHJldHVybiIpOworCisJcmV0dXJuIChSZXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQbm1pU3RydWN0IC0gUHJlc2V0cyBhbmQgU2V0cyBkYXRhIGluIHN0cnVjdHVyZSBTS19QTk1JX1NUUlVDVF9EQVRBCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiB3aWxsIGFsc28gYmUgc3RvcmVkIGluCisgKglTS19QTk1JX1NUUlVDVF9EQVRBIGlmIHRoZSBwYXNzZWQgYnVmZmVyIGhhcyB0aGUgbWluaW11bSBzaXplIG9mCisgKglTS19QTk1JX01JTl9TVFJVQ1RfU0laRS4gVGhlIHN1Yi1mdW5jdGlvbiBydW5zIHRocm91Z2ggdGhlIElkVGFibGUsCisgKgljaGVja3Mgd2hpY2ggT0lEcyBhcmUgYWJsZSB0byBzZXQsIGFuZCBjYWxscyB0aGUgaGFuZGxlciBmdW5jdGlvbiBvZgorICoJdGhlIE9JRCB0byBwZXJmb3JtIHRoZSBzZXQuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHdpbGwKKyAqCWFsc28gYmUgc3RvcmVkIGluIFNLX1BOTUlfU1RSVUNUX0RBVEEgaWYgdGhlIHBhc3NlZCBidWZmZXIgaGFzIHRoZQorICoJbWluaW11bSBzaXplIG9mIFNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFLiBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkCisgKglieSBTa0dlUG5taVByZVNldFN0cnVjdCBhbmQgU2tHZVBubWlTZXRTdHJ1Y3QuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX1hYWC4gVGhlIGNvZGVzIGFyZSBkZXNjcmliZWQgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb25zLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9ORVQgIFRoZSByZXF1ZXN0ZWQgTmV0SW5kZXggZG9lc24ndCBleGlzdAorICovCitQTk1JX1NUQVRJQyBpbnQgUG5taVN0cnVjdCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgIEFjdGlvbiwJLyogUFJFU0VUL1NFVCBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogTGVuZ3RoIG9mIHBCdWYgbWFuYWdlbWVudCBkYXRhIGJ1ZmZlciAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCWludAkJUmV0OworCXVuc2lnbmVkIGludAlUYWJsZUluZGV4OworCXVuc2lnbmVkIGludAlEc3RPZmZzZXQ7CisJdW5zaWduZWQgaW50CUxlbjsKKwl1bnNpZ25lZCBpbnQJSW5zdGFuY2VObzsKKwl1bnNpZ25lZCBpbnQJSW5zdGFuY2VDbnQ7CisJU0tfVTMyCQlJbnN0YW5jZTsKKwlTS19VMzIJCUlkOworCisKKwkvKiBDaGVjayBpZiB0aGUgcGFzc2VkIGJ1ZmZlciBoYXMgdGhlIHJpZ2h0IHNpemUgKi8KKwlpZiAoKnBMZW4gPCBTS19QTk1JX1NUUlVDVF9TSVpFKSB7CisKKwkJLyogQ2hlY2sgaWYgd2UgY2FuIHJldHVybiB0aGUgZXJyb3Igd2l0aGluIHRoZSBidWZmZXIgKi8KKwkJaWYgKCpwTGVuID49IFNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFKSB7CisKKwkJCVNLX1BOTUlfU0VUX1NUQVQocEJ1ZiwgU0tfUE5NSV9FUlJfVE9PX1NIT1JULAorCQkJCShTS19VMzIpKC0xKSk7CisJCX0KKworCQkqcExlbiA9IFNLX1BOTUlfU1RSVUNUX1NJWkU7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwl9CisJCisgICAgLyogQ2hlY2sgTmV0SW5kZXggKi8KKwlpZiAoTmV0SW5kZXggPj0gcEFDLT5SbG10Lk51bU5ldHMpIHsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX05FVCk7CisJfQorCQorCVNLX1BOTUlfQ0hFQ0tGTEFHUygiUG5taVN0cnVjdDogT24gY2FsbCIpOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIHZhbHVlcyBvZiBSTE1UIGFuZCBTSVJRIGFuZCBpbmNyZW1lbnQgc2VtYXBob3JlcyB0bworCSAqIGluZGljYXRlIHRoYXQgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGRvbmUuCisJICovCisJaWYgKChSZXQgPSBSbG10VXBkYXRlKHBBQywgSW9DLCBOZXRJbmRleCkpICE9IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJU0tfUE5NSV9TRVRfU1RBVChwQnVmLCBSZXQsIChTS19VMzIpKC0xKSk7CisJCSpwTGVuID0gU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkU7CisJCXJldHVybiAoUmV0KTsKKwl9CisKKwlpZiAoKFJldCA9IFNpcnFVcGRhdGUocEFDLCBJb0MpKSAhPSBTS19QTk1JX0VSUl9PSykgeworCisJCVNLX1BOTUlfU0VUX1NUQVQocEJ1ZiwgUmV0LCAoU0tfVTMyKSgtMSkpOworCQkqcExlbiA9IFNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFOworCQlyZXR1cm4gKFJldCk7CisJfQorCisJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyArKzsKKwlwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnICsrOworCisJLyogUHJlc2V0L1NldCB2YWx1ZXMgKi8KKwlmb3IgKFRhYmxlSW5kZXggPSAwOyBUYWJsZUluZGV4IDwgSURfVEFCTEVfU0laRTsgVGFibGVJbmRleCArKykgeworCisJCWlmICgoSWRUYWJsZVtUYWJsZUluZGV4XS5BY2Nlc3MgIT0gU0tfUE5NSV9SVykgJiYKKwkJCShJZFRhYmxlW1RhYmxlSW5kZXhdLkFjY2VzcyAhPSBTS19QTk1JX1dPKSkgeworCisJCQljb250aW51ZTsKKwkJfQorCisJCUluc3RhbmNlTm8gPSBJZFRhYmxlW1RhYmxlSW5kZXhdLkluc3RhbmNlTm87CisJCUlkID0gSWRUYWJsZVtUYWJsZUluZGV4XS5JZDsKKworCQlmb3IgKEluc3RhbmNlQ250ID0gMTsgSW5zdGFuY2VDbnQgPD0gSW5zdGFuY2VObzsKKwkJCUluc3RhbmNlQ250ICsrKSB7CisKKwkJCURzdE9mZnNldCA9IElkVGFibGVbVGFibGVJbmRleF0uT2Zmc2V0ICsKKwkJCQkoSW5zdGFuY2VDbnQgLSAxKSAqCisJCQkJSWRUYWJsZVtUYWJsZUluZGV4XS5TdHJ1Y3RTaXplOworCisJCQkvKgorCQkJICogQmVjYXVzZSBWUEQgbXVsdGlwbGUgaW5zdGFuY2UgdmFyaWFibGVzIGFyZQorCQkJICogbm90IHNldGFibGUgd2UgZG8gbm90IG5lZWQgdG8gZXZhbHVhdGUgVlBECisJCQkgKiBpbnN0YW5jZXMuIEhhdmUgYSBsb29rIHRvIFZQRCBpbnN0YW5jZQorCQkJICogY2FsY3VsYXRpb24gaW4gU2tQbm1pR2V0U3RydWN0KCkuCisJCQkgKi8KKwkJCUluc3RhbmNlID0gKFNLX1UzMilJbnN0YW5jZUNudDsKKworCQkJLyoKKwkJCSAqIEV2YWx1YXRlIG5lZWRlZCBidWZmZXIgbGVuZ3RoCisJCQkgKi8KKwkJCUxlbiA9IDA7CisJCQlSZXQgPSBJZFRhYmxlW1RhYmxlSW5kZXhdLkZ1bmMocEFDLCBJb0MsCisJCQkJU0tfUE5NSV9HRVQsIElkVGFibGVbVGFibGVJbmRleF0uSWQsCisJCQkJTlVMTCwgJkxlbiwgSW5zdGFuY2UsIFRhYmxlSW5kZXgsIE5ldEluZGV4KTsKKworCQkJaWYgKFJldCA9PSBTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpIHsKKworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKFJldCAhPSBTS19QTk1JX0VSUl9UT09fU0hPUlQpIHsKKworCQkJCXBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgLS07CisJCQkJcEFDLT5Qbm1pLlNpcnFVcGRhdGVkRmxhZyAtLTsKKworCQkJCVNLX1BOTUlfQ0hFQ0tGTEFHUygiUG5taVN0cnVjdDogT24gcmV0dXJuIik7CisJCQkJU0tfUE5NSV9TRVRfU1RBVChwQnVmLAorCQkJCQlTS19QTk1JX0VSUl9HRU5FUkFMLCBEc3RPZmZzZXQpOworCQkJCSpwTGVuID0gU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkU7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKwkJCWlmIChJZCA9PSBPSURfU0tHRV9WUERfQUNUSU9OKSB7CisKKwkJCQlzd2l0Y2ggKCoocEJ1ZiArIERzdE9mZnNldCkpIHsKKworCQkJCWNhc2UgU0tfUE5NSV9WUERfQ1JFQVRFOgorCQkJCQlMZW4gPSAzICsgKihwQnVmICsgRHN0T2Zmc2V0ICsgMyk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBTS19QTk1JX1ZQRF9ERUxFVEU6CisJCQkJCUxlbiA9IDM7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJTGVuID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvKiBDYWxsIHRoZSBPSUQgaGFuZGxlciBmdW5jdGlvbiAqLworCQkJUmV0ID0gSWRUYWJsZVtUYWJsZUluZGV4XS5GdW5jKHBBQywgSW9DLCBBY3Rpb24sCisJCQkJSWRUYWJsZVtUYWJsZUluZGV4XS5JZCwgcEJ1ZiArIERzdE9mZnNldCwKKwkJCQkmTGVuLCBJbnN0YW5jZSwgVGFibGVJbmRleCwgTmV0SW5kZXgpOworCisJCQlpZiAoUmV0ICE9IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJCQlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnIC0tOworCQkJCXBBQy0+UG5taS5TaXJxVXBkYXRlZEZsYWcgLS07CisKKwkJCQlTS19QTk1JX0NIRUNLRkxBR1MoIlBubWlTdHJ1Y3Q6IE9uIHJldHVybiIpOworCQkJCVNLX1BOTUlfU0VUX1NUQVQocEJ1ZiwgU0tfUE5NSV9FUlJfQkFEX1ZBTFVFLAorCQkJCQlEc3RPZmZzZXQpOworCQkJCSpwTGVuID0gU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkU7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJfQorCQl9CisJfQorCisJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyAtLTsKKwlwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnIC0tOworCisJU0tfUE5NSV9DSEVDS0ZMQUdTKCJQbm1pU3RydWN0OiBPbiByZXR1cm4iKTsKKwlTS19QTk1JX1NFVF9TVEFUKHBCdWYsIFNLX1BOTUlfRVJSX09LLCAoU0tfVTMyKSgtMSkpOworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBMb29rdXBJZCAtIExvb2t1cCBhbiBPSUQgaW4gdGhlIElkVGFibGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVNjYW5zIHRoZSBJZFRhYmxlIHRvIGZpbmQgdGhlIHRhYmxlIGVudHJ5IG9mIGFuIE9JRC4KKyAqCisgKiBSZXR1cm5zOgorICoJVGhlIHRhYmxlIGluZGV4IG9yIC0xIGlmIG5vdCBmb3VuZC4KKyAqLworUE5NSV9TVEFUSUMgaW50IExvb2t1cElkKAorU0tfVTMyIElkKQkJLyogT2JqZWN0IGlkZW50aWZpZXIgdG8gYmUgc2VhcmNoZWQgKi8KK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJRF9UQUJMRV9TSVpFOyBpKyspIHsKKworCQlpZiAoSWRUYWJsZVtpXS5JZCA9PSBJZCkgeworCisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKworCXJldHVybiAoLTEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBPaWRTdHJ1Y3QgLSBIYW5kbGVyIG9mIE9JRF9TS0dFX0FMTF9EQVRBCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIE9JRCBwZXJmb3JtcyBhIEdldC9QcmVzZXQvU2V0U3RydWN0IGNhbGwgYW5kIHJldHVybnMgYWxsIGRhdGEKKyAqCWluIGEgU0tfUE5NSV9TVFJVQ1RfREFUQSBzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX0JBRF9WQUxVRSAgICBUaGUgcGFzc2VkIHZhbHVlIGlzIG5vdCBpbiB0aGUgdmFsaWQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSByYW5nZS4KKyAqCVNLX1BOTUlfRVJSX1JFQURfT05MWSAgICBUaGUgT0lEIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNldC4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK1BOTUlfU1RBVElDIGludCBPaWRTdHJ1Y3QoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogcEJ1ZiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlpZiAoSWQgIT0gT0lEX1NLR0VfQUxMX0RBVEEpIHsKKworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDAzLAorCQkJU0tfUE5NSV9FUlIwMDNNU0cpOworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGluc3RhbmNlLiBXZSBvbmx5IGhhbmRsZSBzaW5nbGUgaW5zdGFuY2UgdmFyaWFibGVzCisJICovCisJaWYgKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSAmJiBJbnN0YW5jZSAhPSAxKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJfQorCisJc3dpdGNoIChBY3Rpb24pIHsKKworCWNhc2UgU0tfUE5NSV9HRVQ6CisJCXJldHVybiAoU2tQbm1pR2V0U3RydWN0KHBBQywgSW9DLCBwQnVmLCBwTGVuLCBOZXRJbmRleCkpOworCisJY2FzZSBTS19QTk1JX1BSRVNFVDoKKwkJcmV0dXJuIChTa1BubWlQcmVTZXRTdHJ1Y3QocEFDLCBJb0MsIHBCdWYsIHBMZW4sIE5ldEluZGV4KSk7CisKKwljYXNlIFNLX1BOTUlfU0VUOgorCQlyZXR1cm4gKFNrUG5taVNldFN0cnVjdChwQUMsIElvQywgcEJ1ZiwgcExlbiwgTmV0SW5kZXgpKTsKKwl9CisKKwlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDA0LCBTS19QTk1JX0VSUjAwNE1TRyk7CisKKwkqcExlbiA9IDA7CisJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUGVyZm9ybSAtIE9JRCBoYW5kbGVyIG9mIE9JRF9TS0dFX0FDVElPTgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJTm9uZS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfQkFEX1ZBTFVFICAgIFRoZSBwYXNzZWQgdmFsdWUgaXMgbm90IGluIHRoZSB2YWxpZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHJhbmdlLgorICoJU0tfUE5NSV9FUlJfUkVBRF9PTkxZICAgIFRoZSBPSUQgaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2V0LgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworUE5NSV9TVEFUSUMgaW50IFBlcmZvcm0oCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogcEJ1ZiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlpbnQJUmV0OworCVNLX1UzMglBY3Rpb25PcDsKKworCisJLyoKKwkgKiBDaGVjayBpbnN0YW5jZS4gV2Ugb25seSBoYW5kbGUgc2luZ2xlIGluc3RhbmNlIHZhcmlhYmxlcworCSAqLworCWlmIChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkgJiYgSW5zdGFuY2UgIT0gMSkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCX0KKworCWlmICgqcExlbiA8IHNpemVvZihTS19VMzIpKSB7CisKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCX0KKworCS8qIENoZWNrIGlmIGEgZ2V0IHNob3VsZCBiZSBwZXJmb3JtZWQgKi8KKwlpZiAoQWN0aW9uID09IFNLX1BOTUlfR0VUKSB7CisKKwkJLyogQSBnZXQgaXMgZWFzeS4gV2UgYWx3YXlzIHJldHVybiB0aGUgc2FtZSB2YWx1ZSAqLworCQlBY3Rpb25PcCA9IChTS19VMzIpU0tfUE5NSV9BQ1RfSURMRTsKKwkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgQWN0aW9uT3ApOworCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCisJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCX0KKworCS8qIENvbnRpbnVlIHdpdGggUFJFU0VUL1NFVCBhY3Rpb24gKi8KKwlpZiAoKnBMZW4gPiBzaXplb2YoU0tfVTMyKSkgeworCisJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGUgY29tbWFuZCBpcyBhIGtub3duIG9uZSAqLworCVNLX1BOTUlfUkVBRF9VMzIocEJ1ZiwgQWN0aW9uT3ApOworCWlmICgqcExlbiA+IHNpemVvZihTS19VMzIpIHx8CisJCShBY3Rpb25PcCAhPSBTS19QTk1JX0FDVF9JRExFICYmCisJCUFjdGlvbk9wICE9IFNLX1BOTUlfQUNUX1JFU0VUICYmCisJCUFjdGlvbk9wICE9IFNLX1BOTUlfQUNUX1NFTEZURVNUICYmCisJCUFjdGlvbk9wICE9IFNLX1BOTUlfQUNUX1JFU0VUQ05UKSkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCX0KKworCS8qIEEgcHJlc2V0IGVuZHMgaGVyZSAqLworCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwl9CisKKwlzd2l0Y2ggKEFjdGlvbk9wKSB7CisKKwljYXNlIFNLX1BOTUlfQUNUX0lETEU6CisJCS8qIE5vdGhpbmcgdG8gZG8gKi8KKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfQUNUX1JFU0VUOgorCQkvKgorCQkgKiBQZXJmb3JtIGEgZHJpdmVyIHJlc2V0IG9yIHNvbWV0aGluZyB0aGF0IGNvbWVzIG5lYXIKKwkJICogdG8gdGhpcy4KKwkJICovCisJCVJldCA9IFNLX0RSSVZFUl9SRVNFVChwQUMsIElvQyk7CisJCWlmIChSZXQgIT0gMCkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDA1LAorCQkJCVNLX1BOTUlfRVJSMDA1TVNHKTsKKworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9BQ1RfU0VMRlRFU1Q6CisJCS8qCisJCSAqIFBlcmZvcm0gYSBkcml2ZXIgc2VsZnRlc3Qgb3Igc29tZXRoaW5nIHNpbWlsYXIgdG8gdGhpcy4KKwkJICogQ3VycmVudGx5IHRoaXMgZmVhdHVyZSBpcyBub3QgdXNlZCBhbmQgd2lsbCBwcm9iYWJseQorCQkgKiBpbXBsZW1lbnRlZCBpbiBhbm90aGVyIHdheS4KKwkJICovCisJCVJldCA9IFNLX0RSSVZFUl9TRUxGVEVTVChwQUMsIElvQyk7CisJCXBBQy0+UG5taS5UZXN0UmVzdWx0ID0gUmV0OworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9BQ1RfUkVTRVRDTlQ6CisJCS8qIFNldCBhbGwgY291bnRlcnMgYW5kIHRpbWVzdGFtcHMgdG8gemVybyAqLworCQlSZXNldENvdW50ZXIocEFDLCBJb0MsIE5ldEluZGV4KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDA2LAorCQkJU0tfUE5NSV9FUlIwMDZNU0cpOworCisJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJfQorCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1hYzgwMjNTdGF0IC0gT0lEIGhhbmRsZXIgb2YgT0lEX0dFTl9YWFggYW5kIE9JRF84MDJfM19YWFgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVJldHJpZXZlcyB0aGUgc3RhdGlzdGljIHZhbHVlcyBvZiB0aGUgdmlydHVhbCBwb3J0IChsb2dpY2FsCisgKglpbmRleCAwKS4gT25seSBzcGVjaWFsIE9JRHMgb2YgTkRJUyBhcmUgaGFuZGxlZCB3aGljaCBjb25zaXN0CisgKglvZiBhIDMyIGJpdCBpbnN0ZWFkIG9mIGEgNjQgYml0IHZhbHVlLiBUaGUgT0lEcyBhcmUgcHVibGljCisgKgliZWNhdXNlIHBlcmhhcHMgc29tZSBvdGhlciBwbGF0Zm9ybSBjYW4gdXNlIHRoZW0gdG9vLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitQTk1JX1NUQVRJQyBpbnQgTWFjODAyM1N0YXQoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogcEJ1ZiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LAkvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlpbnQgICAgIFJldDsKKwlTS19VNjQgIFN0YXRWYWw7CisJU0tfVTMyICBTdGF0VmFsMzI7CisJU0tfQk9PTCBJczY0Qml0UmVxID0gU0tfRkFMU0U7CisKKwkvKgorCSAqIE9ubHkgdGhlIGFjdGl2ZSBNYWMgaXMgcmV0dXJuZWQKKwkgKi8KKwlpZiAoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpICYmIEluc3RhbmNlICE9IDEpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGFjdGlvbiB0eXBlCisJICovCisJaWYgKEFjdGlvbiAhPSBTS19QTk1JX0dFVCkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9SRUFEX09OTFkpOworCX0KKworCS8qIENoZWNrIGxlbmd0aCAqLworCXN3aXRjaCAoSWQpIHsKKworCWNhc2UgT0lEXzgwMl8zX1BFUk1BTkVOVF9BRERSRVNTOgorCWNhc2UgT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUzoKKwkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX01BQ19BRERSKSkgeworCisJCQkqcExlbiA9IHNpemVvZihTS19NQUNfQUREUik7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorI2lmbmRlZiBTS19ORElTXzY0QklUX0NUUgorCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTMyKSkgeworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCisjZWxzZSAvKiBTS19ORElTXzY0QklUX0NUUiAqLworCisJCS8qIGZvciBjb21wYXRpYmlsaXR5LCBhdCBsZWFzdCAzMmJpdCBhcmUgcmVxdWlyZWQgZm9yIE9JRCAqLworCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTMyKSkgeworCQkJLyoKKwkJCSogYnV0IGluZGljYXRlIGhhbmRsaW5nIGZvciA2NGJpdCB2YWx1ZXMsCisJCQkqIGlmIGluc3VmZmljaWVudCBzcGFjZSBpcyBwcm92aWRlZAorCQkJKi8KKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKworCQlJczY0Qml0UmVxID0gKCpwTGVuIDwgc2l6ZW9mKFNLX1U2NCkpID8gU0tfRkFMU0UgOiBTS19UUlVFOworI2VuZGlmIC8qIFNLX05ESVNfNjRCSVRfQ1RSICovCisJCWJyZWFrOworCX0KKworCS8qCisJICogVXBkYXRlIGFsbCBzdGF0aXN0aWNzLCBiZWNhdXNlIHdlIHJldHJpZXZlIHZpcnR1YWwgTUFDLCB3aGljaAorCSAqIGNvbnNpc3RzIG9mIG11bHRpcGxlIHBoeXNpY2FsIHN0YXRpc3RpY3MgYW5kIGluY3JlbWVudCBzZW1hcGhvcmUKKwkgKiB0byBpbmRpY2F0ZSB0aGF0IGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBkb25lLgorCSAqLworCVJldCA9IE1hY1VwZGF0ZShwQUMsIElvQywgMCwgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kIC0gMSk7CisJaWYgKCBSZXQgIT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoUmV0KTsKKwl9CisJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnICsrOworCisJLyoKKwkgKiBHZXQgdmFsdWUgKE1BQyBJbmRleCAwIGlkZW50aWZpZXMgdGhlIHZpcnR1YWwgTUFDKQorCSAqLworCXN3aXRjaCAoSWQpIHsKKworCWNhc2UgT0lEXzgwMl8zX1BFUk1BTkVOVF9BRERSRVNTOgorCQlDb3B5TWFjKHBCdWYsICZwQUMtPkFkZHIuTmV0W05ldEluZGV4XS5QZXJtYW5lbnRNYWNBZGRyZXNzKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfTUFDX0FERFIpOworCQlicmVhazsKKworCWNhc2UgT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUzoKKwkJQ29weU1hYyhwQnVmLCAmcEFDLT5BZGRyLk5ldFtOZXRJbmRleF0uQ3VycmVudE1hY0FkZHJlc3MpOworCQkqcExlbiA9IHNpemVvZihTS19NQUNfQUREUik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJU3RhdFZhbCA9IEdldFN0YXRWYWwocEFDLCBJb0MsIDAsIElkVGFibGVbVGFibGVJbmRleF0uUGFyYW0sIE5ldEluZGV4KTsKKworCQkvKiBieSBkZWZhdWx0IDMyYml0IHZhbHVlcyBhcmUgZXZhbHVhdGVkICovCisJCWlmICghSXM2NEJpdFJlcSkgeworCQkJU3RhdFZhbDMyID0gKFNLX1UzMilTdGF0VmFsOworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgU3RhdFZhbDMyKTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCX0KKwkJZWxzZSB7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBTdGF0VmFsKTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnIC0tOworCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1hY1ByaXZhdGVTdGF0IC0gT0lEIGhhbmRsZXIgZnVuY3Rpb24gb2YgT0lEX1NLR0VfU1RBVF9YWFgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVJldHJpZXZlcyB0aGUgTUFDIHN0YXRpc3RpYyBkYXRhLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitQTk1JX1NUQVRJQyBpbnQgTWFjUHJpdmF0ZVN0YXQoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogcEJ1ZiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwl1bnNpZ25lZCBpbnQJTG9nUG9ydE1heDsKKwl1bnNpZ25lZCBpbnQJTG9nUG9ydEluZGV4OworCXVuc2lnbmVkIGludAlQaHlzUG9ydE1heDsKKwl1bnNpZ25lZCBpbnQJTGltaXQ7CisJdW5zaWduZWQgaW50CU9mZnNldDsKKwlpbnQJCQkJTWFjVHlwZTsKKwlpbnQJCQkJUmV0OworCVNLX1U2NAkJCVN0YXRWYWw7CisJCisJCisKKwkvKiBDYWxjdWxhdGUgaW5zdGFuY2UgaWYgd2lzaGVkLiBNQUMgaW5kZXggMCBpcyB0aGUgdmlydHVhbCBNQUMgKi8KKwlQaHlzUG9ydE1heCA9IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsKKwlMb2dQb3J0TWF4ID0gU0tfUE5NSV9QT1JUX1BIWVMyTE9HKFBoeXNQb3J0TWF4KTsKKwkKKwlNYWNUeXBlID0gcEFDLT5HSW5pLkdJTWFjVHlwZTsKKworCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeyAvKiBEdWFsIG5ldCBtb2RlICovCisJCUxvZ1BvcnRNYXgtLTsKKwl9CisKKwlpZiAoKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSkpIHsgLyogT25seSBvbmUgc3BlY2lmaWMgaW5zdGFuY2UgaXMgcXVlcmllZCAqLworCQkvKiBDaGVjayBpbnN0YW5jZSByYW5nZSAqLworCQlpZiAoKEluc3RhbmNlIDwgMSkgfHwgKEluc3RhbmNlID4gTG9nUG9ydE1heCkpIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCQl9CisJCUxvZ1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9JTlNUMkxPRyhJbnN0YW5jZSk7CisJCUxpbWl0ID0gTG9nUG9ydEluZGV4ICsgMTsKKwl9CisKKwllbHNlIHsgLyogSW5zdGFuY2UgPT0gKFNLX1UzMikoLTEpLCBnZXQgYWxsIEluc3RhbmNlcyBvZiB0aGF0IE9JRCAqLworCisJCUxvZ1BvcnRJbmRleCA9IDA7CisJCUxpbWl0ID0gTG9nUG9ydE1heDsKKwl9CisKKwkvKiBDaGVjayBhY3Rpb24gKi8KKwlpZiAoQWN0aW9uICE9IFNLX1BOTUlfR0VUKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1JFQURfT05MWSk7CisJfQorCisJLyogQ2hlY2sgbGVuZ3RoICovCisJaWYgKCpwTGVuIDwgKExpbWl0IC0gTG9nUG9ydEluZGV4KSAqIHNpemVvZihTS19VNjQpKSB7CisKKwkJKnBMZW4gPSAoTGltaXQgLSBMb2dQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1U2NCk7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBNQUMgc3RhdGlzdGljIGFuZCBpbmNyZW1lbnQgc2VtYXBob3JlIHRvIGluZGljYXRlIHRoYXQKKwkgKiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgZG9uZS4KKwkgKi8KKwlSZXQgPSBNYWNVcGRhdGUocEFDLCBJb0MsIDAsIHBBQy0+R0luaS5HSU1hY3NGb3VuZCAtIDEpOworCWlmIChSZXQgIT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoUmV0KTsKKwl9CisJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnICsrOworCisJLyogR2V0IHZhbHVlICovCisJT2Zmc2V0ID0gMDsKKwlmb3IgKDsgTG9nUG9ydEluZGV4IDwgTGltaXQ7IExvZ1BvcnRJbmRleCArKykgeworCisJCXN3aXRjaCAoSWQpIHsKKworLyogWFhYIG5vdCB5ZXQgaW1wbGVtZW50ZWQgZHVlIHRvIFhNQUMgcHJvYmxlbXMKKwkJY2FzZSBPSURfU0tHRV9TVEFUX1RYX1VUSUw6CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworKi8KKy8qIFhYWCBub3QgeWV0IGltcGxlbWVudGVkIGR1ZSB0byBYTUFDIHByb2JsZW1zCisJCWNhc2UgT0lEX1NLR0VfU1RBVF9SWF9VVElMOgorCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKyovCisJCWNhc2UgT0lEX1NLR0VfU1RBVF9SWDoKKwkJCWlmIChNYWNUeXBlID09IFNLX01BQ19HTUFDKSB7CisJCQkJU3RhdFZhbCA9CisJCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIExvZ1BvcnRJbmRleCwKKwkJCQkJCQkgICBTS19QTk1JX0hSWF9CUk9BRENBU1QsIE5ldEluZGV4KSArCisJCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIExvZ1BvcnRJbmRleCwKKwkJCQkJCQkgICBTS19QTk1JX0hSWF9NVUxUSUNBU1QsIE5ldEluZGV4KSArCisJCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIExvZ1BvcnRJbmRleCwKKwkJCQkJCQkgICBTS19QTk1JX0hSWF9VTklDQVNULCBOZXRJbmRleCkgKworCQkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCBMb2dQb3J0SW5kZXgsCisJCQkJCQkJICAgU0tfUE5NSV9IUlhfVU5ERVJTSVpFLCBOZXRJbmRleCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlTdGF0VmFsID0gR2V0U3RhdFZhbChwQUMsIElvQywgTG9nUG9ydEluZGV4LAorCQkJCQlJZFRhYmxlW1RhYmxlSW5kZXhdLlBhcmFtLCBOZXRJbmRleCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NUQVRfVFg6CisJCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfR01BQykgeworCQkJCVN0YXRWYWwgPQorCQkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCBMb2dQb3J0SW5kZXgsCisJCQkJCQkJICAgU0tfUE5NSV9IVFhfQlJPQURDQVNULCBOZXRJbmRleCkgKworCQkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCBMb2dQb3J0SW5kZXgsCisJCQkJCQkJICAgU0tfUE5NSV9IVFhfTVVMVElDQVNULCBOZXRJbmRleCkgKworCQkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCBMb2dQb3J0SW5kZXgsCisJCQkJCQkJICAgU0tfUE5NSV9IVFhfVU5JQ0FTVCwgTmV0SW5kZXgpOworCQkJfQorCQkJZWxzZSB7CisJCQkJU3RhdFZhbCA9IEdldFN0YXRWYWwocEFDLCBJb0MsIExvZ1BvcnRJbmRleCwKKwkJCQkJSWRUYWJsZVtUYWJsZUluZGV4XS5QYXJhbSwgTmV0SW5kZXgpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVN0YXRWYWwgPSBHZXRTdGF0VmFsKHBBQywgSW9DLCBMb2dQb3J0SW5kZXgsCisJCQkJSWRUYWJsZVtUYWJsZUluZGV4XS5QYXJhbSwgTmV0SW5kZXgpOworCQl9CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYgKyBPZmZzZXQsIFN0YXRWYWwpOworCisJCU9mZnNldCArPSBzaXplb2YoU0tfVTY0KTsKKwl9CisJKnBMZW4gPSBPZmZzZXQ7CisKKwlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgLS07CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQWRkciAtIE9JRCBoYW5kbGVyIGZ1bmN0aW9uIG9mIE9JRF9TS0dFX1BIWVNfQ1VSX0FERFIgYW5kIF9GQUNfQUREUgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJR2V0L1ByZXNldHMvU2V0cyB0aGUgY3VycmVudCBhbmQgZmFjdG9yeSBNQUMgYWRkcmVzcy4gVGhlIE1BQworICoJYWRkcmVzcyBvZiB0aGUgdmlydHVhbCBwb3J0LCB3aGljaCBpcyByZXBvcnRlZCB0byB0aGUgT1MsIG1heQorICoJbm90IGJlIGNoYW5nZWQsIGJ1dCB0aGUgcGh5c2ljYWwgb25lcy4gQSBzZXQgdG8gdGhlIHZpcnR1YWwgcG9ydAorICoJd2lsbCBiZSBpZ25vcmVkLiBObyBlcnJvciBzaG91bGQgYmUgcmVwb3J0ZWQgYmVjYXVzZSBvdGhlcndpc2UKKyAqCWEgbXVsdGlwbGUgaW5zdGFuY2Ugc2V0ICgtMSkgd291bGQgYWx3YXlzIGZhaWwuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX0JBRF9WQUxVRSAgICBUaGUgcGFzc2VkIHZhbHVlIGlzIG5vdCBpbiB0aGUgdmFsaWQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSByYW5nZS4KKyAqCVNLX1BOTUlfRVJSX1JFQURfT05MWSAgICBUaGUgT0lEIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNldC4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK1BOTUlfU1RBVElDIGludCBBZGRyKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IHBCdWYgYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJaW50CQlSZXQ7CisJdW5zaWduZWQgaW50CUxvZ1BvcnRNYXg7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0TWF4OworCXVuc2lnbmVkIGludAlMb2dQb3J0SW5kZXg7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0SW5kZXg7CisJdW5zaWduZWQgaW50CUxpbWl0OworCXVuc2lnbmVkIGludAlPZmZzZXQgPSAwOworCisJLyoKKwkgKiBDYWxjdWxhdGUgaW5zdGFuY2UgaWYgd2lzaGVkLiBNQUMgaW5kZXggMCBpcyB0aGUgdmlydHVhbAorCSAqIE1BQy4KKwkgKi8KKwlQaHlzUG9ydE1heCA9IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsKKwlMb2dQb3J0TWF4ID0gU0tfUE5NSV9QT1JUX1BIWVMyTE9HKFBoeXNQb3J0TWF4KTsKKworCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeyAvKiBEdWFsIG5ldCBtb2RlICovCisJCUxvZ1BvcnRNYXgtLTsKKwl9CisKKwlpZiAoKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSkpIHsgLyogT25seSBvbmUgc3BlY2lmaWMgaW5zdGFuY2UgaXMgcXVlcmllZCAqLworCQkvKiBDaGVjayBpbnN0YW5jZSByYW5nZSAqLworCQlpZiAoKEluc3RhbmNlIDwgMSkgfHwgKEluc3RhbmNlID4gTG9nUG9ydE1heCkpIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCQl9CisJCUxvZ1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9JTlNUMkxPRyhJbnN0YW5jZSk7CisJCUxpbWl0ID0gTG9nUG9ydEluZGV4ICsgMTsKKwl9CisJZWxzZSB7IC8qIEluc3RhbmNlID09IChTS19VMzIpKC0xKSwgZ2V0IGFsbCBJbnN0YW5jZXMgb2YgdGhhdCBPSUQgKi8KKworCQlMb2dQb3J0SW5kZXggPSAwOworCQlMaW1pdCA9IExvZ1BvcnRNYXg7CisJfQorCisJLyoKKwkgKiBQZXJmb3JtIEFjdGlvbgorCSAqLworCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9HRVQpIHsKKworCQkvKiBDaGVjayBsZW5ndGggKi8KKwkJaWYgKCpwTGVuIDwgKExpbWl0IC0gTG9nUG9ydEluZGV4KSAqIDYpIHsKKworCQkJKnBMZW4gPSAoTGltaXQgLSBMb2dQb3J0SW5kZXgpICogNjsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCisJCS8qCisJCSAqIEdldCB2YWx1ZQorCQkgKi8KKwkJZm9yICg7IExvZ1BvcnRJbmRleCA8IExpbWl0OyBMb2dQb3J0SW5kZXggKyspIHsKKworCQkJc3dpdGNoIChJZCkgeworCisJCQljYXNlIE9JRF9TS0dFX1BIWVNfQ1VSX0FERFI6CisJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCUNvcHlNYWMocEJ1ZiArIE9mZnNldCwgJnBBQy0+QWRkci5OZXRbTmV0SW5kZXhdLkN1cnJlbnRNYWNBZGRyZXNzKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMocEFDLCBMb2dQb3J0SW5kZXgpOworCisJCQkJCUNvcHlNYWMocEJ1ZiArIE9mZnNldCwKKwkJCQkJCSZwQUMtPkFkZHIuUG9ydFtQaHlzUG9ydEluZGV4XS5DdXJyZW50TWFjQWRkcmVzcyk7CisJCQkJfQorCQkJCU9mZnNldCArPSA2OworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX1BIWVNfRkFDX0FERFI6CisJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCUNvcHlNYWMocEJ1ZiArIE9mZnNldCwKKwkJCQkJCSZwQUMtPkFkZHIuTmV0W05ldEluZGV4XS5QZXJtYW5lbnRNYWNBZGRyZXNzKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisKKwkJCQkJQ29weU1hYyhwQnVmICsgT2Zmc2V0LAorCQkJCQkJJnBBQy0+QWRkci5Qb3J0W1BoeXNQb3J0SW5kZXhdLlBlcm1hbmVudE1hY0FkZHJlc3MpOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gNjsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDA4LAorCQkJCQlTS19QTk1JX0VSUjAwOE1TRyk7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKwkJfQorCisJCSpwTGVuID0gT2Zmc2V0OworCX0KKwllbHNlIHsKKwkJLyoKKwkJICogVGhlIGxvZ2ljYWwgTUFDIGFkZHJlc3MgbWF5IG5vdCBiZSBjaGFuZ2VkIG9ubHkKKwkJICogdGhlIHBoeXNpY2FsIG9uZXMKKwkJICovCisJCWlmIChJZCA9PSBPSURfU0tHRV9QSFlTX0ZBQ19BRERSKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfUkVBRF9PTkxZKTsKKwkJfQorCisJCS8qCisJCSAqIE9ubHkgdGhlIGN1cnJlbnQgYWRkcmVzcyBtYXkgYmUgY2hhbmdlZAorCQkgKi8KKwkJaWYgKElkICE9IE9JRF9TS0dFX1BIWVNfQ1VSX0FERFIpIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAwOSwKKwkJCQlTS19QTk1JX0VSUjAwOU1TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQkvKiBDaGVjayBsZW5ndGggKi8KKwkJaWYgKCpwTGVuIDwgKExpbWl0IC0gTG9nUG9ydEluZGV4KSAqIDYpIHsKKworCQkJKnBMZW4gPSAoTGltaXQgLSBMb2dQb3J0SW5kZXgpICogNjsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlpZiAoKnBMZW4gPiAoTGltaXQgLSBMb2dQb3J0SW5kZXgpICogNikgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCX0KKworCQkvKgorCQkgKiBDaGVjayBBY3Rpb24KKwkJICovCisJCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJCX0KKworCQkvKgorCQkgKiBTZXQgT0lEX1NLR0VfTUFDX0NVUl9BRERSCisJCSAqLworCQlmb3IgKDsgTG9nUG9ydEluZGV4IDwgTGltaXQ7IExvZ1BvcnRJbmRleCArKywgT2Zmc2V0ICs9IDYpIHsKKworCQkJLyoKKwkJCSAqIEEgc2V0IHRvIHZpcnR1YWwgcG9ydCBhbmQgc2V0IG9mIGJyb2FkY2FzdAorCQkJICogYWRkcmVzcyB3aWxsIGJlIGlnbm9yZWQKKwkJCSAqLworCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwIHx8IFNLX01FTUNNUChwQnVmICsgT2Zmc2V0LAorCQkJCSJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiLCA2KSA9PSAwKSB7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUyhwQUMsCisJCQkJTG9nUG9ydEluZGV4KTsKKworCQkJUmV0ID0gU2tBZGRyT3ZlcnJpZGUocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJKFNLX01BQ19BRERSICopKHBCdWYgKyBPZmZzZXQpLAorCQkJCShMb2dQb3J0SW5kZXggPT0gMCA/IFNLX0FERFJfVklSVFVBTF9BRERSRVNTIDoKKwkJCQlTS19BRERSX1BIWVNJQ0FMX0FERFJFU1MpKTsKKwkJCWlmIChSZXQgIT0gU0tfQUREUl9PVkVSUklERV9TVUNDRVNTKSB7CisKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCQl9CisJCSpwTGVuID0gT2Zmc2V0OworCX0KKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDc3VtU3RhdCAtIE9JRCBoYW5kbGVyIGZ1bmN0aW9uIG9mIE9JRF9TS0dFX0NIS1NNX1hYWAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJUmV0cmlldmVzIHRoZSBzdGF0aXN0aWMgdmFsdWVzIG9mIHRoZSBDU1VNIG1vZHVsZS4gVGhlIENTVU0gZGF0YQorICoJc3RydWN0dXJlIG11c3QgYmUgYXZhaWxhYmxlIGluIHRoZSBTS19BQyBldmVuIGlmIHRoZSBDU1VNIG1vZHVsZQorICoJaXMgbm90IGluY2x1ZGVkLCBiZWNhdXNlIFBOTUkgcmVhZHMgdGhlIHN0YXRpc3RpYyBkYXRhIGZyb20gdGhlCisgKglDU1VNIHBhcnQgb2YgU0tfQUMgZGlyZWN0bHkuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK1BOTUlfU1RBVElDIGludCBDc3VtU3RhdCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBwQnVmIGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCXVuc2lnbmVkIGludAlJbmRleDsKKwl1bnNpZ25lZCBpbnQJTGltaXQ7CisJdW5zaWduZWQgaW50CU9mZnNldCA9IDA7CisJU0tfVTY0CQlTdGF0VmFsOworCisKKwkvKgorCSAqIENhbGN1bGF0ZSBpbnN0YW5jZSBpZiB3aXNoZWQKKwkgKi8KKwlpZiAoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpKSB7CisKKwkJaWYgKChJbnN0YW5jZSA8IDEpIHx8IChJbnN0YW5jZSA+IFNLQ1NfTlVNX1BST1RPQ09MUykpIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCQl9CisJCUluZGV4ID0gKHVuc2lnbmVkIGludClJbnN0YW5jZSAtIDE7CisJCUxpbWl0ID0gSW5kZXggKyAxOworCX0KKwllbHNlIHsKKwkJSW5kZXggPSAwOworCQlMaW1pdCA9IFNLQ1NfTlVNX1BST1RPQ09MUzsKKwl9CisKKwkvKgorCSAqIENoZWNrIGFjdGlvbgorCSAqLworCWlmIChBY3Rpb24gIT0gU0tfUE5NSV9HRVQpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfUkVBRF9PTkxZKTsKKwl9CisKKwkvKiBDaGVjayBsZW5ndGggKi8KKwlpZiAoKnBMZW4gPCAoTGltaXQgLSBJbmRleCkgKiBzaXplb2YoU0tfVTY0KSkgeworCisJCSpwTGVuID0gKExpbWl0IC0gSW5kZXgpICogc2l6ZW9mKFNLX1U2NCk7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwl9CisKKwkvKgorCSAqIEdldCB2YWx1ZQorCSAqLworCWZvciAoOyBJbmRleCA8IExpbWl0OyBJbmRleCArKykgeworCisJCXN3aXRjaCAoSWQpIHsKKworCQljYXNlIE9JRF9TS0dFX0NIS1NNX1JYX09LX0NUUzoKKwkJCVN0YXRWYWwgPSBwQUMtPkNzdW0uUHJvdG9TdGF0c1tOZXRJbmRleF1bSW5kZXhdLlJ4T2tDdHM7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0NIS1NNX1JYX1VOQUJMRV9DVFM6CisJCQlTdGF0VmFsID0gcEFDLT5Dc3VtLlByb3RvU3RhdHNbTmV0SW5kZXhdW0luZGV4XS5SeFVuYWJsZUN0czsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfQ0hLU01fUlhfRVJSX0NUUzoKKwkJCVN0YXRWYWwgPSBwQUMtPkNzdW0uUHJvdG9TdGF0c1tOZXRJbmRleF1bSW5kZXhdLlJ4RXJyQ3RzOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9DSEtTTV9UWF9PS19DVFM6CisJCQlTdGF0VmFsID0gcEFDLT5Dc3VtLlByb3RvU3RhdHNbTmV0SW5kZXhdW0luZGV4XS5UeE9rQ3RzOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9DSEtTTV9UWF9VTkFCTEVfQ1RTOgorCQkJU3RhdFZhbCA9IHBBQy0+Q3N1bS5Qcm90b1N0YXRzW05ldEluZGV4XVtJbmRleF0uVHhVbmFibGVDdHM7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAxMCwKKwkJCQlTS19QTk1JX0VSUjAxME1TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmICsgT2Zmc2V0LCBTdGF0VmFsKTsKKwkJT2Zmc2V0ICs9IHNpemVvZihTS19VNjQpOworCX0KKworCS8qCisJICogU3RvcmUgdXNlZCBidWZmZXIgc3BhY2UKKwkgKi8KKwkqcExlbiA9IE9mZnNldDsKKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZW5zb3JTdGF0IC0gT0lEIGhhbmRsZXIgZnVuY3Rpb24gb2YgT0lEX1NLR0VfU0VOU09SX1hYWAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJUmV0cmlldmVzIHRoZSBzdGF0aXN0aWMgdmFsdWVzIG9mIHRoZSBJMkMgbW9kdWxlLCB3aGljaCBoYW5kbGVzCisgKgl0aGUgdGVtcGVyYXR1cmUgYW5kIHZvbHRhZ2Ugc2Vuc29ycy4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworUE5NSV9TVEFUSUMgaW50IFNlbnNvclN0YXQoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogcEJ1ZiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwl1bnNpZ25lZCBpbnQJaTsKKwl1bnNpZ25lZCBpbnQJSW5kZXg7CisJdW5zaWduZWQgaW50CUxpbWl0OworCXVuc2lnbmVkIGludAlPZmZzZXQ7CisJdW5zaWduZWQgaW50CUxlbjsKKwlTS19VMzIJCVZhbDMyOworCVNLX1U2NAkJVmFsNjQ7CisKKworCS8qCisJICogQ2FsY3VsYXRlIGluc3RhbmNlIGlmIHdpc2hlZAorCSAqLworCWlmICgoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpKSkgeworCisJCWlmICgoSW5zdGFuY2UgPCAxKSB8fCAoSW5zdGFuY2UgPiAoU0tfVTMyKXBBQy0+STJjLk1heFNlbnMpKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwkJfQorCisJCUluZGV4ID0gKHVuc2lnbmVkIGludClJbnN0YW5jZSAtMTsKKwkJTGltaXQgPSAodW5zaWduZWQgaW50KUluc3RhbmNlOworCX0KKwllbHNlIHsKKwkJSW5kZXggPSAwOworCQlMaW1pdCA9ICh1bnNpZ25lZCBpbnQpIHBBQy0+STJjLk1heFNlbnM7CisJfQorCisJLyoKKwkgKiBDaGVjayBhY3Rpb24KKwkgKi8KKwlpZiAoQWN0aW9uICE9IFNLX1BOTUlfR0VUKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1JFQURfT05MWSk7CisJfQorCisJLyogQ2hlY2sgbGVuZ3RoICovCisJc3dpdGNoIChJZCkgeworCisJY2FzZSBPSURfU0tHRV9TRU5TT1JfVkFMVUU6CisJY2FzZSBPSURfU0tHRV9TRU5TT1JfV0FSX1RIUkVTX0xPVzoKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9XQVJfVEhSRVNfVVBQOgorCWNhc2UgT0lEX1NLR0VfU0VOU09SX0VSUl9USFJFU19MT1c6CisJY2FzZSBPSURfU0tHRV9TRU5TT1JfRVJSX1RIUkVTX1VQUDoKKwkJaWYgKCpwTGVuIDwgKExpbWl0IC0gSW5kZXgpICogc2l6ZW9mKFNLX1UzMikpIHsKKworCQkJKnBMZW4gPSAoTGltaXQgLSBJbmRleCkgKiBzaXplb2YoU0tfVTMyKTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfU0VOU09SX0RFU0NSOgorCQlmb3IgKE9mZnNldCA9IDAsIGkgPSBJbmRleDsgaSA8IExpbWl0OyBpICsrKSB7CisKKwkJCUxlbiA9ICh1bnNpZ25lZCBpbnQpCisJCQkJU0tfU1RSTEVOKHBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MpICsgMTsKKwkJCWlmIChMZW4gPj0gU0tfUE5NSV9TVFJJTkdMRU4yKSB7CisKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDExLAorCQkJCQlTS19QTk1JX0VSUjAxMU1TRyk7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKwkJCU9mZnNldCArPSBMZW47CisJCX0KKwkJaWYgKCpwTGVuIDwgT2Zmc2V0KSB7CisKKwkJCSpwTGVuID0gT2Zmc2V0OworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9TRU5TT1JfSU5ERVg6CisJY2FzZSBPSURfU0tHRV9TRU5TT1JfVFlQRToKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9TVEFUVVM6CisJCWlmICgqcExlbiA8IExpbWl0IC0gSW5kZXgpIHsKKworCQkJKnBMZW4gPSBMaW1pdCAtIEluZGV4OworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9TRU5TT1JfV0FSX0NUUzoKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9XQVJfVElNRToKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9FUlJfQ1RTOgorCWNhc2UgT0lEX1NLR0VfU0VOU09SX0VSUl9USU1FOgorCQlpZiAoKnBMZW4gPCAoTGltaXQgLSBJbmRleCkgKiBzaXplb2YoU0tfVTY0KSkgeworCisJCQkqcExlbiA9IChMaW1pdCAtIEluZGV4KSAqIHNpemVvZihTS19VNjQpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAxMiwKKwkJCVNLX1BOTUlfRVJSMDEyTVNHKTsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisKKwl9CisKKwkvKgorCSAqIEdldCB2YWx1ZQorCSAqLworCWZvciAoT2Zmc2V0ID0gMDsgSW5kZXggPCBMaW1pdDsgSW5kZXggKyspIHsKKworCQlzd2l0Y2ggKElkKSB7CisKKwkJY2FzZSBPSURfU0tHRV9TRU5TT1JfSU5ERVg6CisJCQkqKHBCdWYgKyBPZmZzZXQpID0gKGNoYXIpSW5kZXg7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TRU5TT1JfREVTQ1I6CisJCQlMZW4gPSBTS19TVFJMRU4ocEFDLT5JMmMuU2VuVGFibGVbSW5kZXhdLlNlbkRlc2MpOworCQkJU0tfTUVNQ1BZKHBCdWYgKyBPZmZzZXQgKyAxLAorCQkJCXBBQy0+STJjLlNlblRhYmxlW0luZGV4XS5TZW5EZXNjLCBMZW4pOworCQkJKihwQnVmICsgT2Zmc2V0KSA9IChjaGFyKUxlbjsKKwkJCU9mZnNldCArPSBMZW4gKyAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TRU5TT1JfVFlQRToKKwkJCSoocEJ1ZiArIE9mZnNldCkgPQorCQkJCShjaGFyKXBBQy0+STJjLlNlblRhYmxlW0luZGV4XS5TZW5UeXBlOworCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU0VOU09SX1ZBTFVFOgorCQkJVmFsMzIgPSAoU0tfVTMyKXBBQy0+STJjLlNlblRhYmxlW0luZGV4XS5TZW5WYWx1ZTsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBPZmZzZXQsIFZhbDMyKTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU0VOU09SX1dBUl9USFJFU19MT1c6CisJCQlWYWwzMiA9IChTS19VMzIpcEFDLT5JMmMuU2VuVGFibGVbSW5kZXhdLgorCQkJCVNlblRocmVXYXJuTG93OworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIE9mZnNldCwgVmFsMzIpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VMzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TRU5TT1JfV0FSX1RIUkVTX1VQUDoKKwkJCVZhbDMyID0gKFNLX1UzMilwQUMtPkkyYy5TZW5UYWJsZVtJbmRleF0uCisJCQkJU2VuVGhyZVdhcm5IaWdoOworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIE9mZnNldCwgVmFsMzIpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VMzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TRU5TT1JfRVJSX1RIUkVTX0xPVzoKKwkJCVZhbDMyID0gKFNLX1UzMilwQUMtPkkyYy5TZW5UYWJsZVtJbmRleF0uCisJCQkJU2VuVGhyZUVyckxvdzsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBPZmZzZXQsIFZhbDMyKTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU0VOU09SX0VSUl9USFJFU19VUFA6CisJCQlWYWwzMiA9IHBBQy0+STJjLlNlblRhYmxlW0luZGV4XS5TZW5UaHJlRXJySGlnaDsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBPZmZzZXQsIFZhbDMyKTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU0VOU09SX1NUQVRVUzoKKwkJCSoocEJ1ZiArIE9mZnNldCkgPQorCQkJCShjaGFyKXBBQy0+STJjLlNlblRhYmxlW0luZGV4XS5TZW5FcnJGbGFnOworCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU0VOU09SX1dBUl9DVFM6CisJCQlWYWw2NCA9IHBBQy0+STJjLlNlblRhYmxlW0luZGV4XS5TZW5XYXJuQ3RzOworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiArIE9mZnNldCwgVmFsNjQpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VNjQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TRU5TT1JfRVJSX0NUUzoKKwkJCVZhbDY0ID0gcEFDLT5JMmMuU2VuVGFibGVbSW5kZXhdLlNlbkVyckN0czsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYgKyBPZmZzZXQsIFZhbDY0KTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTY0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU0VOU09SX1dBUl9USU1FOgorCQkJVmFsNjQgPSBTS19QTk1JX0hVTkRSRURTX1NFQyhwQUMtPkkyYy5TZW5UYWJsZVtJbmRleF0uCisJCQkJU2VuQmVnV2FyblRTKTsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYgKyBPZmZzZXQsIFZhbDY0KTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTY0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU0VOU09SX0VSUl9USU1FOgorCQkJVmFsNjQgPSBTS19QTk1JX0hVTkRSRURTX1NFQyhwQUMtPkkyYy5TZW5UYWJsZVtJbmRleF0uCisJCQkJU2VuQmVnRXJyVFMpOworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiArIE9mZnNldCwgVmFsNjQpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VNjQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0VSUiwKKwkJCQkoIlNlbnNvclN0YXQ6IFVua25vd24gT0lEIHNob3VsZCBiZSBoYW5kbGVkIGJlZm9yZSIpKTsKKworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCX0KKworCS8qCisJICogU3RvcmUgdXNlZCBidWZmZXIgc3BhY2UKKwkgKi8KKwkqcExlbiA9IE9mZnNldDsKKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBWcGQgLSBPSUQgaGFuZGxlciBmdW5jdGlvbiBvZiBPSURfU0tHRV9WUERfWFhYCisgKgorICogRGVzY3JpcHRpb246CisgKglHZXQvcHJlc2V0L3NldCBvZiBWUEQgZGF0YS4gQXMgaW5zdGFuY2UgdGhlIG5hbWUgb2YgYSBWUEQga2V5CisgKgljYW4gYmUgcGFzc2VkLiBUaGUgSW5zdGFuY2UgcGFyYW1ldGVyIGlzIGEgU0tfVTMyIGFuZCBjYW4gYmUKKyAqCXVzZWQgYXMgYSBzdHJpbmcgYnVmZmVyIGZvciB0aGUgVlBEIGtleSwgYmVjYXVzZSB0aGVpciBtYXhpbXVtCisgKglsZW5ndGggaXMgNCBieXRlLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9CQURfVkFMVUUgICAgVGhlIHBhc3NlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIHZhbGlkCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgcmFuZ2UuCisgKglTS19QTk1JX0VSUl9SRUFEX09OTFkgICAgVGhlIE9JRCBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzZXQuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitQTk1JX1NUQVRJQyBpbnQgVnBkKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IHBCdWYgYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJU0tfVlBEX1NUQVRVUwkqcFZwZFN0YXR1czsKKwl1bnNpZ25lZCBpbnQJQnVmTGVuOworCWNoYXIJCUJ1ZlsyNTZdOworCWNoYXIJCUtleUFycltTS19QTk1JX1ZQRF9FTlRSSUVTXVtTS19QTk1JX1ZQRF9LRVlfU0laRV07CisJY2hhcgkJS2V5U3RyW1NLX1BOTUlfVlBEX0tFWV9TSVpFXTsKKwl1bnNpZ25lZCBpbnQJS2V5Tm87CisJdW5zaWduZWQgaW50CU9mZnNldDsKKwl1bnNpZ25lZCBpbnQJSW5kZXg7CisJdW5zaWduZWQgaW50CUZpcnN0SW5kZXg7CisJdW5zaWduZWQgaW50CUxhc3RJbmRleDsKKwl1bnNpZ25lZCBpbnQJTGVuOworCWludAkJUmV0OworCVNLX1UzMgkJVmFsMzI7CisKKwkvKgorCSAqIEdldCBhcnJheSBvZiBhbGwgY3VycmVudGx5IHN0b3JlZCBWUEQga2V5cworCSAqLworCVJldCA9IEdldFZwZEtleUFycihwQUMsIElvQywgJktleUFyclswXVswXSwgc2l6ZW9mKEtleUFyciksICZLZXlObyk7CisJaWYgKFJldCAhPSBTS19QTk1JX0VSUl9PSykgeworCQkqcExlbiA9IDA7CisJCXJldHVybiAoUmV0KTsKKwl9CisKKwkvKgorCSAqIElmIGluc3RhbmNlIGlzIG5vdCAtMSwgdHJ5IHRvIGZpbmQgdGhlIHJlcXVlc3RlZCBWUEQga2V5IGZvcgorCSAqIHRoZSBtdWx0aXBsZSBpbnN0YW5jZSB2YXJpYWJsZXMuIFRoZSBvdGhlciBPSURzIGFzIGZvciBleGFtcGxlCisJICogT0lEIFZQRF9BQ1RJT04gYXJlIHNpbmdsZSBpbnN0YW5jZSB2YXJpYWJsZXMgYW5kIG11c3QgYmUKKwkgKiBoYW5kbGVkIHNlcGFyYXRseS4KKwkgKi8KKwlGaXJzdEluZGV4ID0gMDsKKwlMYXN0SW5kZXggPSBLZXlObzsKKworCWlmICgoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpKSkgeworCisJCWlmIChJZCA9PSBPSURfU0tHRV9WUERfS0VZIHx8IElkID09IE9JRF9TS0dFX1ZQRF9WQUxVRSB8fAorCQkJSWQgPT0gT0lEX1NLR0VfVlBEX0FDQ0VTUykgeworCisJCQlTS19TVFJOQ1BZKEtleVN0ciwgKGNoYXIgKikmSW5zdGFuY2UsIDQpOworCQkJS2V5U3RyWzRdID0gMDsKKworCQkJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgS2V5Tm87IEluZGV4ICsrKSB7CisKKwkJCQlpZiAoU0tfU1RSQ01QKEtleVN0ciwgS2V5QXJyW0luZGV4XSkgPT0gMCkgeworCQkJCQlGaXJzdEluZGV4ID0gSW5kZXg7CisJCQkJCUxhc3RJbmRleCA9IEluZGV4KzE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChJbmRleCA9PSBLZXlObykgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChJbnN0YW5jZSAhPSAxKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwkJfQorCX0KKworCS8qCisJICogR2V0IHZhbHVlLCBpZiBhIHF1ZXJ5IHNob3VsZCBiZSBwZXJmb3JtZWQKKwkgKi8KKwlpZiAoQWN0aW9uID09IFNLX1BOTUlfR0VUKSB7CisKKwkJc3dpdGNoIChJZCkgeworCisJCWNhc2UgT0lEX1NLR0VfVlBEX0ZSRUVfQllURVM6CisJCQkvKiBDaGVjayBsZW5ndGggb2YgYnVmZmVyICovCisJCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTMyKSkgeworCisJCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisJCQkvKiBHZXQgbnVtYmVyIG9mIGZyZWUgYnl0ZXMgKi8KKwkJCXBWcGRTdGF0dXMgPSBWcGRTdGF0KHBBQywgSW9DKTsKKwkJCWlmIChwVnBkU3RhdHVzID09IE5VTEwpIHsKKworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMTcsCisJCQkJCVNLX1BOTUlfRVJSMDE3TVNHKTsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCQkJaWYgKChwVnBkU3RhdHVzLT52cGRfc3RhdHVzICYgVlBEX1ZBTElEKSA9PSAwKSB7CisKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDE4LAorCQkJCQlTS19QTk1JX0VSUjAxOE1TRyk7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKwkJCQorCQkJVmFsMzIgPSAoU0tfVTMyKXBWcGRTdGF0dXMtPnZwZF9mcmVlX3J3OworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfVlBEX0VOVFJJRVNfTElTVDoKKwkJCS8qIENoZWNrIGxlbmd0aCAqLworCQkJZm9yIChMZW4gPSAwLCBJbmRleCA9IDA7IEluZGV4IDwgS2V5Tm87IEluZGV4ICsrKSB7CisKKwkJCQlMZW4gKz0gU0tfU1RSTEVOKEtleUFycltJbmRleF0pICsgMTsKKwkJCX0KKwkJCWlmICgqcExlbiA8IExlbikgeworCisJCQkJKnBMZW4gPSBMZW47CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCisJCQkvKiBHZXQgdmFsdWUgKi8KKwkJCSoocEJ1ZikgPSAoY2hhcilMZW4gLSAxOworCQkJZm9yIChPZmZzZXQgPSAxLCBJbmRleCA9IDA7IEluZGV4IDwgS2V5Tm87IEluZGV4ICsrKSB7CisKKwkJCQlMZW4gPSBTS19TVFJMRU4oS2V5QXJyW0luZGV4XSk7CisJCQkJU0tfTUVNQ1BZKHBCdWYgKyBPZmZzZXQsIEtleUFycltJbmRleF0sIExlbik7CisKKwkJCQlPZmZzZXQgKz0gTGVuOworCisJCQkJaWYgKEluZGV4IDwgS2V5Tm8gLSAxKSB7CisKKwkJCQkJKihwQnVmICsgT2Zmc2V0KSA9ICcgJzsKKwkJCQkJT2Zmc2V0ICsrOworCQkJCX0KKwkJCX0KKwkJCSpwTGVuID0gT2Zmc2V0OworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9WUERfRU5UUklFU19OVU1CRVI6CisJCQkvKiBDaGVjayBsZW5ndGggKi8KKwkJCWlmICgqcExlbiA8IHNpemVvZihTS19VMzIpKSB7CisKKwkJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKworCQkJVmFsMzIgPSAoU0tfVTMyKUtleU5vOworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfVlBEX0tFWToKKwkJCS8qIENoZWNrIGJ1ZmZlciBsZW5ndGgsIGlmIGl0IGlzIGxhcmdlIGVub3VnaCAqLworCQkJZm9yIChMZW4gPSAwLCBJbmRleCA9IEZpcnN0SW5kZXg7CisJCQkJSW5kZXggPCBMYXN0SW5kZXg7IEluZGV4ICsrKSB7CisKKwkJCQlMZW4gKz0gU0tfU1RSTEVOKEtleUFycltJbmRleF0pICsgMTsKKwkJCX0KKwkJCWlmICgqcExlbiA8IExlbikgeworCisJCQkJKnBMZW4gPSBMZW47CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCisJCQkvKgorCQkJICogR2V0IHRoZSBrZXkgdG8gYW4gaW50ZXJtZWRpYXRlIGJ1ZmZlciwgYmVjYXVzZQorCQkJICogd2UgaGF2ZSB0byBwcmVwZW5kIGEgbGVuZ3RoIGJ5dGUuCisJCQkgKi8KKwkJCWZvciAoT2Zmc2V0ID0gMCwgSW5kZXggPSBGaXJzdEluZGV4OworCQkJCUluZGV4IDwgTGFzdEluZGV4OyBJbmRleCArKykgeworCisJCQkJTGVuID0gU0tfU1RSTEVOKEtleUFycltJbmRleF0pOworCisJCQkJKihwQnVmICsgT2Zmc2V0KSA9IChjaGFyKUxlbjsKKwkJCQlTS19NRU1DUFkocEJ1ZiArIE9mZnNldCArIDEsIEtleUFycltJbmRleF0sCisJCQkJCUxlbik7CisJCQkJT2Zmc2V0ICs9IExlbiArIDE7CisJCQl9CisJCQkqcExlbiA9IE9mZnNldDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfVlBEX1ZBTFVFOgorCQkJLyogQ2hlY2sgdGhlIGJ1ZmZlciBsZW5ndGggaWYgaXQgaXMgbGFyZ2UgZW5vdWdoICovCisJCQlmb3IgKE9mZnNldCA9IDAsIEluZGV4ID0gRmlyc3RJbmRleDsKKwkJCQlJbmRleCA8IExhc3RJbmRleDsgSW5kZXggKyspIHsKKworCQkJCUJ1ZkxlbiA9IDI1NjsKKwkJCQlpZiAoVnBkUmVhZChwQUMsIElvQywgS2V5QXJyW0luZGV4XSwgQnVmLAorCQkJCQkoaW50ICopJkJ1ZkxlbikgPiAwIHx8CisJCQkJCUJ1ZkxlbiA+PSBTS19QTk1JX1ZQRF9EQVRBTEVOKSB7CisKKwkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLAorCQkJCQkJU0tfUE5NSV9FUlIwMjEsCisJCQkJCQlTS19QTk1JX0VSUjAyMU1TRyk7CisKKwkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IEJ1ZkxlbiArIDE7CisJCQl9CisJCQlpZiAoKnBMZW4gPCBPZmZzZXQpIHsKKworCQkJCSpwTGVuID0gT2Zmc2V0OworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEdldCB0aGUgdmFsdWUgdG8gYW4gaW50ZXJtZWRpYXRlIGJ1ZmZlciwgYmVjYXVzZQorCQkJICogd2UgaGF2ZSB0byBwcmVwZW5kIGEgbGVuZ3RoIGJ5dGUuCisJCQkgKi8KKwkJCWZvciAoT2Zmc2V0ID0gMCwgSW5kZXggPSBGaXJzdEluZGV4OworCQkJCUluZGV4IDwgTGFzdEluZGV4OyBJbmRleCArKykgeworCisJCQkJQnVmTGVuID0gMjU2OworCQkJCWlmIChWcGRSZWFkKHBBQywgSW9DLCBLZXlBcnJbSW5kZXhdLCBCdWYsCisJCQkJCShpbnQgKikmQnVmTGVuKSA+IDAgfHwKKwkJCQkJQnVmTGVuID49IFNLX1BOTUlfVlBEX0RBVEFMRU4pIHsKKworCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csCisJCQkJCQlTS19QTk1JX0VSUjAyMiwKKwkJCQkJCVNLX1BOTUlfRVJSMDIyTVNHKTsKKworCQkJCQkqcExlbiA9IDA7CisJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQkJfQorCisJCQkJKihwQnVmICsgT2Zmc2V0KSA9IChjaGFyKUJ1ZkxlbjsKKwkJCQlTS19NRU1DUFkocEJ1ZiArIE9mZnNldCArIDEsIEJ1ZiwgQnVmTGVuKTsKKwkJCQlPZmZzZXQgKz0gQnVmTGVuICsgMTsKKwkJCX0KKwkJCSpwTGVuID0gT2Zmc2V0OworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9WUERfQUNDRVNTOgorCQkJaWYgKCpwTGVuIDwgTGFzdEluZGV4IC0gRmlyc3RJbmRleCkgeworCisJCQkJKnBMZW4gPSBMYXN0SW5kZXggLSBGaXJzdEluZGV4OworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKworCQkJZm9yIChPZmZzZXQgPSAwLCBJbmRleCA9IEZpcnN0SW5kZXg7CisJCQkJSW5kZXggPCBMYXN0SW5kZXg7IEluZGV4ICsrKSB7CisKKwkJCQlpZiAoVnBkTWF5V3JpdGUoS2V5QXJyW0luZGV4XSkpIHsKKworCQkJCQkqKHBCdWYgKyBPZmZzZXQpID0gU0tfUE5NSV9WUERfUlc7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkqKHBCdWYgKyBPZmZzZXQpID0gU0tfUE5NSV9WUERfUk87CisJCQkJfQorCQkJCU9mZnNldCArKzsKKwkJCX0KKwkJCSpwTGVuID0gT2Zmc2V0OworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9WUERfQUNUSU9OOgorCQkJT2Zmc2V0ID0gTGFzdEluZGV4IC0gRmlyc3RJbmRleDsKKwkJCWlmICgqcExlbiA8IE9mZnNldCkgeworCisJCQkJKnBMZW4gPSBPZmZzZXQ7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCQkJU0tfTUVNU0VUKHBCdWYsIDAsIE9mZnNldCk7CisJCQkqcExlbiA9IE9mZnNldDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDIzLAorCQkJCVNLX1BOTUlfRVJSMDIzTVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJLyogVGhlIG9ubHkgT0lEIHdoaWNoIGNhbiBiZSBzZXQgaXMgVlBEX0FDVElPTiAqLworCQlpZiAoSWQgIT0gT0lEX1NLR0VfVlBEX0FDVElPTikgeworCisJCQlpZiAoSWQgPT0gT0lEX1NLR0VfVlBEX0ZSRUVfQllURVMgfHwKKwkJCQlJZCA9PSBPSURfU0tHRV9WUERfRU5UUklFU19MSVNUIHx8CisJCQkJSWQgPT0gT0lEX1NLR0VfVlBEX0VOVFJJRVNfTlVNQkVSIHx8CisJCQkJSWQgPT0gT0lEX1NLR0VfVlBEX0tFWSB8fAorCQkJCUlkID09IE9JRF9TS0dFX1ZQRF9WQUxVRSB8fAorCQkJCUlkID09IE9JRF9TS0dFX1ZQRF9BQ0NFU1MpIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1JFQURfT05MWSk7CisJCQl9CisKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMjQsCisJCQkJU0tfUE5NSV9FUlIwMjRNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJLyoKKwkJICogRnJvbSB0aGlzIHBvaW50IHdlIGhhbmRsZSBWUERfQUNUSU9OLiBDaGVjayB0aGUgYnVmZmVyCisJCSAqIGxlbmd0aC4gSXQgc2hvdWxkIGF0IGxlYXN0IGhhdmUgdGhlIHNpemUgb2Ygb25lIGJ5dGUuCisJCSAqLworCQlpZiAoKnBMZW4gPCAxKSB7CisKKwkJCSpwTGVuID0gMTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBmaXJzdCBieXRlIGNvbnRhaW5zIHRoZSBWUEQgYWN0aW9uIHR5cGUgd2Ugc2hvdWxkCisJCSAqIHBlcmZvcm0uCisJCSAqLworCQlzd2l0Y2ggKCpwQnVmKSB7CisKKwkJY2FzZSBTS19QTk1JX1ZQRF9JR05PUkU6CisJCQkvKiBOb3RoaW5nIHRvIGRvICovCisJCQlicmVhazsKKworCQljYXNlIFNLX1BOTUlfVlBEX0NSRUFURToKKwkJCS8qCisJCQkgKiBXZSBoYXZlIHRvIGNyZWF0ZSBhIG5ldyBWUEQgZW50cnkgb3Igd2UgbW9kaWZ5CisJCQkgKiBhbiBleGlzdGluZyBvbmUuIENoZWNrIGZpcnN0IHRoZSBidWZmZXIgbGVuZ3RoLgorCQkJICovCisJCQlpZiAoKnBMZW4gPCA0KSB7CisKKwkJCQkqcExlbiA9IDQ7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCQkJS2V5U3RyWzBdID0gcEJ1ZlsxXTsKKwkJCUtleVN0clsxXSA9IHBCdWZbMl07CisJCQlLZXlTdHJbMl0gPSAwOworCisJCQkvKgorCQkJICogSXMgdGhlIGVudHJ5IHdyaXRhYmxlIG9yIGRvZXMgaXQgYmVsb25nIHRvIHRoZQorCQkJICogcmVhZC1vbmx5IGFyZWE/CisJCQkgKi8KKwkJCWlmICghVnBkTWF5V3JpdGUoS2V5U3RyKSkgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCX0KKworCQkJT2Zmc2V0ID0gKGludClwQnVmWzNdICYgMHhGRjsKKworCQkJU0tfTUVNQ1BZKEJ1ZiwgcEJ1ZiArIDQsIE9mZnNldCk7CisJCQlCdWZbT2Zmc2V0XSA9IDA7CisKKwkJCS8qIEEgcHJlc2V0IGVuZHMgaGVyZSAqLworCQkJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJCQl9CisKKwkJCS8qIFdyaXRlIHRoZSBuZXcgZW50cnkgb3IgbW9kaWZ5IGFuIGV4aXN0aW5nIG9uZSAqLworCQkJUmV0ID0gVnBkV3JpdGUocEFDLCBJb0MsIEtleVN0ciwgQnVmKTsKKwkJCWlmIChSZXQgPT0gU0tfUE5NSV9WUERfTk9XUklURSApIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQl9CisJCQllbHNlIGlmIChSZXQgIT0gU0tfUE5NSV9WUERfT0spIHsKKworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMjUsCisJCQkJCVNLX1BOTUlfRVJSMDI1TVNHKTsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCisJCQkvKgorCQkJICogUGVyZm9ybSBhbiB1cGRhdGUgb2YgdGhlIFZQRCBkYXRhLiBUaGlzIGlzCisJCQkgKiBub3QgbWFuZGFudG9yeSwgYnV0IGp1c3QgdG8gYmUgc3VyZS4KKwkJCSAqLworCQkJUmV0ID0gVnBkVXBkYXRlKHBBQywgSW9DKTsKKwkJCWlmIChSZXQgIT0gU0tfUE5NSV9WUERfT0spIHsKKworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMjYsCisJCQkJCVNLX1BOTUlfRVJSMDI2TVNHKTsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTS19QTk1JX1ZQRF9ERUxFVEU6CisJCQkvKiBDaGVjayBpZiB0aGUgYnVmZmVyIHNpemUgaXMgcGxhdXNpYmxlICovCisJCQlpZiAoKnBMZW4gPCAzKSB7CisKKwkJCQkqcExlbiA9IDM7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCQkJaWYgKCpwTGVuID4gMykgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCX0KKwkJCUtleVN0clswXSA9IHBCdWZbMV07CisJCQlLZXlTdHJbMV0gPSBwQnVmWzJdOworCQkJS2V5U3RyWzJdID0gMDsKKworCQkJLyogRmluZCB0aGUgcGFzc2VkIGtleSBpbiB0aGUgYXJyYXkgKi8KKwkJCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IEtleU5vOyBJbmRleCArKykgeworCisJCQkJaWYgKFNLX1NUUkNNUChLZXlTdHIsIEtleUFycltJbmRleF0pID09IDApIHsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkvKgorCQkJICogSWYgd2UgY2Fubm90IGZpbmQgdGhlIGtleSBpdCBpcyB3cm9uZywgc28gd2UKKwkJCSAqIHJldHVybiBhbiBhcHByb3ByaWF0ZSBlcnJvciB2YWx1ZS4KKwkJCSAqLworCQkJaWYgKEluZGV4ID09IEtleU5vKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJfQorCisJCQlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwkJCX0KKworCQkJLyogT2ssIHlvdSB3YW50ZWQgaXQgYW5kIHlvdSB3aWxsIGdldCBpdCAqLworCQkJUmV0ID0gVnBkRGVsZXRlKHBBQywgSW9DLCBLZXlTdHIpOworCQkJaWYgKFJldCAhPSBTS19QTk1JX1ZQRF9PSykgeworCisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAyNywKKwkJCQkJU0tfUE5NSV9FUlIwMjdNU0cpOworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBQZXJmb3JtIGFuIHVwZGF0ZSBvZiB0aGUgVlBEIGRhdGEuIFRoaXMgaXMKKwkJCSAqIG5vdCBtYW5kYW50b3J5LCBidXQganVzdCB0byBiZSBzdXJlLgorCQkJICovCisJCQlSZXQgPSBWcGRVcGRhdGUocEFDLCBJb0MpOworCQkJaWYgKFJldCAhPSBTS19QTk1JX1ZQRF9PSykgeworCisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAyOCwKKwkJCQkJU0tfUE5NSV9FUlIwMjhNU0cpOworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQl9CisJfQorCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdlbmVyYWwgLSBPSUQgaGFuZGxlciBmdW5jdGlvbiBvZiB2YXJpb3VzIHNpbmdsZSBpbnN0YW5jZSBPSURzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgY29kZSBpcyBzaW1wbGUuIE5vIGRlc2NyaXB0aW9uIG5lY2Vzc2FyeS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworUE5NSV9TVEFUSUMgaW50IEdlbmVyYWwoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJaW50CQlSZXQ7CisJdW5zaWduZWQgaW50CUluZGV4OworCXVuc2lnbmVkIGludAlMZW47CisJdW5zaWduZWQgaW50CU9mZnNldDsKKwl1bnNpZ25lZCBpbnQJVmFsOworCVNLX1U4CQlWYWw4OworCVNLX1UxNgkJVmFsMTY7CisJU0tfVTMyCQlWYWwzMjsKKwlTS19VNjQJCVZhbDY0OworCVNLX1U2NAkJVmFsNjRSeEh3RXJycyA9IDA7CisJU0tfVTY0CQlWYWw2NFR4SHdFcnJzID0gMDsKKwlTS19CT09MCQlJczY0Qml0UmVxID0gU0tfRkFMU0U7CisJY2hhcgkJQnVmWzI1Nl07CisJaW50CQkJTWFjVHlwZTsKKworCS8qCisJICogQ2hlY2sgaW5zdGFuY2UuIFdlIG9ubHkgaGFuZGxlIHNpbmdsZSBpbnN0YW5jZSB2YXJpYWJsZXMuCisJICovCisJaWYgKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSAmJiBJbnN0YW5jZSAhPSAxKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJfQorCisJLyoKKwkgKiBDaGVjayBhY3Rpb24uIFdlIG9ubHkgYWxsb3cgZ2V0IHJlcXVlc3RzLgorCSAqLworCWlmIChBY3Rpb24gIT0gU0tfUE5NSV9HRVQpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfUkVBRF9PTkxZKTsKKwl9CisJCisJTWFjVHlwZSA9IHBBQy0+R0luaS5HSU1hY1R5cGU7CisJCisJLyoKKwkgKiBDaGVjayBsZW5ndGggZm9yIHRoZSB2YXJpb3VzIHN1cHBvcnRlZCBPSURzCisJICovCisJc3dpdGNoIChJZCkgeworCisJY2FzZSBPSURfR0VOX1hNSVRfRVJST1I6CisJY2FzZSBPSURfR0VOX1JDVl9FUlJPUjoKKwljYXNlIE9JRF9HRU5fUkNWX05PX0JVRkZFUjoKKyNpZm5kZWYgU0tfTkRJU182NEJJVF9DVFIKKwkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1UzMikpIHsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKworI2Vsc2UgLyogU0tfTkRJU182NEJJVF9DVFIgKi8KKworCQkvKgorCQkgKiBmb3IgY29tcGF0aWJpbGl0eSwgYXQgbGVhc3QgMzJiaXQgYXJlIHJlcXVpcmVkIGZvciBvaWQKKwkJICovCisJCWlmICgqcExlbiA8IHNpemVvZihTS19VMzIpKSB7CisJCQkvKgorCQkJKiBidXQgaW5kaWNhdGUgaGFuZGxpbmcgZm9yIDY0Yml0IHZhbHVlcywKKwkJCSogaWYgaW5zdWZmaWNpZW50IHNwYWNlIGlzIHByb3ZpZGVkCisJCQkqLworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCisJCUlzNjRCaXRSZXEgPSAoKnBMZW4gPCBzaXplb2YoU0tfVTY0KSkgPyBTS19GQUxTRSA6IFNLX1RSVUU7CisjZW5kaWYgLyogU0tfTkRJU182NEJJVF9DVFIgKi8KKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1BPUlRfTlVNQkVSOgorCWNhc2UgT0lEX1NLR0VfREVWSUNFX1RZUEU6CisJY2FzZSBPSURfU0tHRV9SRVNVTFQ6CisJY2FzZSBPSURfU0tHRV9STE1UX01PTklUT1JfTlVNQkVSOgorCWNhc2UgT0lEX0dFTl9UUkFOU01JVF9RVUVVRV9MRU5HVEg6CisJY2FzZSBPSURfU0tHRV9UUkFQX05VTUJFUjoKKwljYXNlIE9JRF9TS0dFX01EQl9WRVJTSU9OOgorCWNhc2UgT0lEX1NLR0VfQk9BUkRMRVZFTDoKKwljYXNlIE9JRF9TS0dFX0NISVBJRDoKKwljYXNlIE9JRF9TS0dFX1JBTVNJWkU6CisJCWlmICgqcExlbiA8IHNpemVvZihTS19VMzIpKSB7CisKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0NISVBTRVQ6CisJCWlmICgqcExlbiA8IHNpemVvZihTS19VMTYpKSB7CisKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1UxNik7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0JVU19UWVBFOgorCWNhc2UgT0lEX1NLR0VfQlVTX1NQRUVEOgorCWNhc2UgT0lEX1NLR0VfQlVTX1dJRFRIOgorCWNhc2UgT0lEX1NLR0VfU0VOU09SX05VTUJFUjoKKwljYXNlIE9JRF9TS0dFX0NIS1NNX05VTUJFUjoKKwljYXNlIE9JRF9TS0dFX1ZBVVhBVkFJTDoKKwkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1U4KSkgeworCisJCQkqcExlbiA9IHNpemVvZihTS19VOCk7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1RYX1NXX1FVRVVFX0xFTjoKKwljYXNlIE9JRF9TS0dFX1RYX1NXX1FVRVVFX01BWDoKKwljYXNlIE9JRF9TS0dFX1RYX1JFVFJZOgorCWNhc2UgT0lEX1NLR0VfUlhfSU5UUl9DVFM6CisJY2FzZSBPSURfU0tHRV9UWF9JTlRSX0NUUzoKKwljYXNlIE9JRF9TS0dFX1JYX05PX0JVRl9DVFM6CisJY2FzZSBPSURfU0tHRV9UWF9OT19CVUZfQ1RTOgorCWNhc2UgT0lEX1NLR0VfVFhfVVNFRF9ERVNDUl9OTzoKKwljYXNlIE9JRF9TS0dFX1JYX0RFTElWRVJFRF9DVFM6CisJY2FzZSBPSURfU0tHRV9SWF9PQ1RFVFNfREVMSVZfQ1RTOgorCWNhc2UgT0lEX1NLR0VfUlhfSFdfRVJST1JfQ1RTOgorCWNhc2UgT0lEX1NLR0VfVFhfSFdfRVJST1JfQ1RTOgorCWNhc2UgT0lEX1NLR0VfSU5fRVJST1JTX0NUUzoKKwljYXNlIE9JRF9TS0dFX09VVF9FUlJPUl9DVFM6CisJY2FzZSBPSURfU0tHRV9FUlJfUkVDT1ZFUllfQ1RTOgorCWNhc2UgT0lEX1NLR0VfU1lTVVBUSU1FOgorCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTY0KSkgeworCisJCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogQ2hlY2tlZCBsYXRlciAqLworCQlicmVhazsKKwl9CisKKwkvKiBVcGRhdGUgc3RhdGlzdGljICovCisJaWYgKElkID09IE9JRF9TS0dFX1JYX0hXX0VSUk9SX0NUUyB8fAorCQlJZCA9PSBPSURfU0tHRV9UWF9IV19FUlJPUl9DVFMgfHwKKwkJSWQgPT0gT0lEX1NLR0VfSU5fRVJST1JTX0NUUyB8fAorCQlJZCA9PSBPSURfU0tHRV9PVVRfRVJST1JfQ1RTIHx8CisJCUlkID09IE9JRF9HRU5fWE1JVF9FUlJPUiB8fAorCQlJZCA9PSBPSURfR0VOX1JDVl9FUlJPUikgeworCisJCS8qIEZvcmNlIHRoZSBYTUFDIHRvIHVwZGF0ZSBpdHMgc3RhdGlzdGljIGNvdW50ZXJzIGFuZAorCQkgKiBJbmNyZW1lbnQgc2VtYXBob3JlIHRvIGluZGljYXRlIHRoYXQgYW4gdXBkYXRlIHdhcworCQkgKiBhbHJlYWR5IGRvbmUuCisJCSAqLworCQlSZXQgPSBNYWNVcGRhdGUocEFDLCBJb0MsIDAsIHBBQy0+R0luaS5HSU1hY3NGb3VuZCAtIDEpOworCQlpZiAoUmV0ICE9IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoUmV0KTsKKwkJfQorCQlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgKys7CisKKwkJLyoKKwkJICogU29tZSBPSURzIGNvbnNpc3Qgb2YgbXVsdGlwbGUgaGFyZHdhcmUgY291bnRlcnMuIFRob3NlCisJCSAqIHZhbHVlcyB3aGljaCBhcmUgY29udGFpbmVkIGluIGFsbCBvZiB0aGVtIHdpbGwgYmUgYWRkZWQKKwkJICogbm93LgorCQkgKi8KKwkJc3dpdGNoIChJZCkgeworCisJCWNhc2UgT0lEX1NLR0VfUlhfSFdfRVJST1JfQ1RTOgorCQljYXNlIE9JRF9TS0dFX0lOX0VSUk9SU19DVFM6CisJCWNhc2UgT0lEX0dFTl9SQ1ZfRVJST1I6CisJCQlWYWw2NFJ4SHdFcnJzID0KKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hSWF9NSVNTRUQsIE5ldEluZGV4KSArCisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IUlhfRlJBTUlORywgTmV0SW5kZXgpICsKKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hSWF9PVkVSRkxPVywgTmV0SW5kZXgpICsKKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hSWF9KQUJCRVIsIE5ldEluZGV4KSArCisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IUlhfQ0FSUklFUiwgTmV0SW5kZXgpICsKKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hSWF9JUkxFTkdUSCwgTmV0SW5kZXgpICsKKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hSWF9TWU1CT0wsIE5ldEluZGV4KSArCisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IUlhfU0hPUlRTLCBOZXRJbmRleCkgKworCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFJYX1JVTlQsIE5ldEluZGV4KSArCisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IUlhfVE9PX0xPTkcsIE5ldEluZGV4KSArCisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IUlhfRkNTLCBOZXRJbmRleCkgKworCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFJYX0NFWFQsIE5ldEluZGV4KTsKKwkgICAgICAgIGJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfVFhfSFdfRVJST1JfQ1RTOgorCQljYXNlIE9JRF9TS0dFX09VVF9FUlJPUl9DVFM6CisJCWNhc2UgT0lEX0dFTl9YTUlUX0VSUk9SOgorCQkJVmFsNjRUeEh3RXJycyA9CisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IVFhfRVhDRVNTX0NPTCwgTmV0SW5kZXgpICsKKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hUWF9MQVRFX0NPTCwgTmV0SW5kZXgpICsKKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hUWF9VTkRFUlJVTiwgTmV0SW5kZXgpICsKKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hUWF9DQVJSSUVSLCBOZXRJbmRleCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogUmV0cmlldmUgdmFsdWUKKwkgKi8KKwlzd2l0Y2ggKElkKSB7CisKKwljYXNlIE9JRF9TS0dFX1NVUFBPUlRFRF9MSVNUOgorCQlMZW4gPSBJRF9UQUJMRV9TSVpFICogc2l6ZW9mKFNLX1UzMik7CisJCWlmICgqcExlbiA8IExlbikgeworCisJCQkqcExlbiA9IExlbjsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlmb3IgKE9mZnNldCA9IDAsIEluZGV4ID0gMDsgT2Zmc2V0IDwgTGVuOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VMzIpLCBJbmRleCArKykgeworCisJCQlWYWwzMiA9IChTS19VMzIpSWRUYWJsZVtJbmRleF0uSWQ7CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgT2Zmc2V0LCBWYWwzMik7CisJCX0KKwkJKnBMZW4gPSBMZW47CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9CT0FSRExFVkVMOgorCQlWYWwzMiA9IChTS19VMzIpcEFDLT5HSW5pLkdJTGV2ZWw7CisJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1BPUlRfTlVNQkVSOgorCQlWYWwzMiA9IChTS19VMzIpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9ERVZJQ0VfVFlQRToKKwkJVmFsMzIgPSAoU0tfVTMyKXBBQy0+UG5taS5EZXZpY2VUeXBlOworCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9EUklWRVJfREVTQ1I6CisJCWlmIChwQUMtPlBubWkucERyaXZlckRlc2NyaXB0aW9uID09IE5VTEwpIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAwNywKKwkJCQlTS19QTk1JX0VSUjAwN01TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQlMZW4gPSBTS19TVFJMRU4ocEFDLT5Qbm1pLnBEcml2ZXJEZXNjcmlwdGlvbikgKyAxOworCQlpZiAoTGVuID4gU0tfUE5NSV9TVFJJTkdMRU4xKSB7CisKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMjksCisJCQkJU0tfUE5NSV9FUlIwMjlNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJaWYgKCpwTGVuIDwgTGVuKSB7CisKKwkJCSpwTGVuID0gTGVuOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCSpwQnVmID0gKGNoYXIpKExlbiAtIDEpOworCQlTS19NRU1DUFkocEJ1ZiArIDEsIHBBQy0+UG5taS5wRHJpdmVyRGVzY3JpcHRpb24sIExlbiAtIDEpOworCQkqcExlbiA9IExlbjsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0RSSVZFUl9WRVJTSU9OOgorCQlpZiAocEFDLT5Qbm1pLnBEcml2ZXJWZXJzaW9uID09IE5VTEwpIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAzMCwKKwkJCQlTS19QTk1JX0VSUjAzME1TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQlMZW4gPSBTS19TVFJMRU4ocEFDLT5Qbm1pLnBEcml2ZXJWZXJzaW9uKSArIDE7CisJCWlmIChMZW4gPiBTS19QTk1JX1NUUklOR0xFTjEpIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAzMSwKKwkJCQlTS19QTk1JX0VSUjAzMU1TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQlpZiAoKnBMZW4gPCBMZW4pIHsKKworCQkJKnBMZW4gPSBMZW47CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJKnBCdWYgPSAoY2hhcikoTGVuIC0gMSk7CisJCVNLX01FTUNQWShwQnVmICsgMSwgcEFDLT5Qbm1pLnBEcml2ZXJWZXJzaW9uLCBMZW4gLSAxKTsKKwkJKnBMZW4gPSBMZW47CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9EUklWRVJfUkVMREFURToKKwkJaWYgKHBBQy0+UG5taS5wRHJpdmVyUmVsZWFzZURhdGUgPT0gTlVMTCkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDMwLAorCQkJCVNLX1BOTUlfRVJSMDUzTVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCUxlbiA9IFNLX1NUUkxFTihwQUMtPlBubWkucERyaXZlclJlbGVhc2VEYXRlKSArIDE7CisJCWlmIChMZW4gPiBTS19QTk1JX1NUUklOR0xFTjEpIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAzMSwKKwkJCQlTS19QTk1JX0VSUjA1NE1TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQlpZiAoKnBMZW4gPCBMZW4pIHsKKworCQkJKnBMZW4gPSBMZW47CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJKnBCdWYgPSAoY2hhcikoTGVuIC0gMSk7CisJCVNLX01FTUNQWShwQnVmICsgMSwgcEFDLT5Qbm1pLnBEcml2ZXJSZWxlYXNlRGF0ZSwgTGVuIC0gMSk7CisJCSpwTGVuID0gTGVuOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfRFJJVkVSX0ZJTEVOQU1FOgorCQlpZiAocEFDLT5Qbm1pLnBEcml2ZXJGaWxlTmFtZSA9PSBOVUxMKSB7CisKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMzAsCisJCQkJU0tfUE5NSV9FUlIwNTVNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJTGVuID0gU0tfU1RSTEVOKHBBQy0+UG5taS5wRHJpdmVyRmlsZU5hbWUpICsgMTsKKwkJaWYgKExlbiA+IFNLX1BOTUlfU1RSSU5HTEVOMSkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDMxLAorCQkJCVNLX1BOTUlfRVJSMDU2TVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCWlmICgqcExlbiA8IExlbikgeworCisJCQkqcExlbiA9IExlbjsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQkqcEJ1ZiA9IChjaGFyKShMZW4gLSAxKTsKKwkJU0tfTUVNQ1BZKHBCdWYgKyAxLCBwQUMtPlBubWkucERyaXZlckZpbGVOYW1lLCBMZW4gLSAxKTsKKwkJKnBMZW4gPSBMZW47CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9IV19ERVNDUjoKKwkJLyoKKwkJICogVGhlIGhhcmR3YXJlIGRlc2NyaXB0aW9uIGlzIGxvY2F0ZWQgaW4gdGhlIFZQRC4gVGhpcworCQkgKiBxdWVyeSBtYXkgbW92ZSB0byB0aGUgaW5pdGlhbGlzYXRpb24gcm91dGluZS4gQnV0CisJCSAqIHRoZSBWUEQgZGF0YSBpcyBjYWNoZWQgYW5kIHRoZXJlZm9yZSBhIGNhbGwgaGVyZQorCQkgKiB3aWxsIG5vdCBtYWtlIG11Y2ggZGlmZmVyZW5jZS4KKwkJICovCisJCUxlbiA9IDI1NjsKKwkJaWYgKFZwZFJlYWQocEFDLCBJb0MsIFZQRF9OQU1FLCBCdWYsIChpbnQgKikmTGVuKSA+IDApIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAzMiwKKwkJCQlTS19QTk1JX0VSUjAzMk1TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKwkJTGVuICsrOworCQlpZiAoTGVuID4gU0tfUE5NSV9TVFJJTkdMRU4xKSB7CisKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMzMsCisJCQkJU0tfUE5NSV9FUlIwMzNNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisJCWlmICgqcExlbiA8IExlbikgeworCisJCQkqcExlbiA9IExlbjsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQkqcEJ1ZiA9IChjaGFyKShMZW4gLSAxKTsKKwkJU0tfTUVNQ1BZKHBCdWYgKyAxLCBCdWYsIExlbiAtIDEpOworCQkqcExlbiA9IExlbjsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0hXX1ZFUlNJT046CisJCS8qIE9oLCBJIGxvdmUgdG8gZG8gc29tZSBzdHJpbmcgbWFuaXB1bGF0aW9uICovCisJCWlmICgqcExlbiA8IDUpIHsKKworCQkJKnBMZW4gPSA1OworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCVZhbDggPSAoU0tfVTgpcEFDLT5HSW5pLkdJUGNpSHdSZXY7CisJCXBCdWZbMF0gPSA0OworCQlwQnVmWzFdID0gJ3YnOworCQlwQnVmWzJdID0gKGNoYXIpKDB4MzAgfCAoKFZhbDggPj4gNCkgJiAweDBGKSk7CisJCXBCdWZbM10gPSAnLic7CisJCXBCdWZbNF0gPSAoY2hhcikoMHgzMCB8IChWYWw4ICYgMHgwRikpOworCQkqcExlbiA9IDU7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9DSElQU0VUOgorCQlWYWwxNiA9IHBBQy0+UG5taS5DaGlwc2V0OworCQlTS19QTk1JX1NUT1JFX1UxNihwQnVmLCBWYWwxNik7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1UxNik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9DSElQSUQ6CisJCVZhbDMyID0gcEFDLT5HSW5pLkdJQ2hpcElkOworCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9SQU1TSVpFOgorCQlWYWwzMiA9IHBBQy0+R0luaS5HSVJhbVNpemU7CisJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1ZBVVhBVkFJTDoKKwkJKnBCdWYgPSAoY2hhcikgcEFDLT5HSW5pLkdJVmF1eEF2YWlsOworCQkqcExlbiA9IHNpemVvZihjaGFyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0JVU19UWVBFOgorCQkqcEJ1ZiA9IChjaGFyKSBTS19QTk1JX0JVU19QQ0k7CisJCSpwTGVuID0gc2l6ZW9mKGNoYXIpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfQlVTX1NQRUVEOgorCQkqcEJ1ZiA9IHBBQy0+UG5taS5QY2lCdXNTcGVlZDsKKwkJKnBMZW4gPSBzaXplb2YoY2hhcik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9CVVNfV0lEVEg6CisJCSpwQnVmID0gcEFDLT5Qbm1pLlBjaUJ1c1dpZHRoOworCQkqcExlbiA9IHNpemVvZihjaGFyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1JFU1VMVDoKKwkJVmFsMzIgPSBwQUMtPlBubWkuVGVzdFJlc3VsdDsKKwkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfU0VOU09SX05VTUJFUjoKKwkJKnBCdWYgPSAoY2hhcilwQUMtPkkyYy5NYXhTZW5zOworCQkqcExlbiA9IHNpemVvZihjaGFyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0NIS1NNX05VTUJFUjoKKwkJKnBCdWYgPSBTS0NTX05VTV9QUk9UT0NPTFM7CisJCSpwTGVuID0gc2l6ZW9mKGNoYXIpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfVFJBUF9OVU1CRVI6CisJCUdldFRyYXBRdWV1ZUxlbihwQUMsICZMZW4sICZWYWwpOworCQlWYWwzMiA9IChTS19VMzIpVmFsOworCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9UUkFQOgorCQlHZXRUcmFwUXVldWVMZW4ocEFDLCAmTGVuLCAmVmFsKTsKKwkJaWYgKCpwTGVuIDwgTGVuKSB7CisKKwkJCSpwTGVuID0gTGVuOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCUNvcHlUcmFwUXVldWUocEFDLCBwQnVmKTsKKwkJKnBMZW4gPSBMZW47CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9STE1UX01PTklUT1JfTlVNQkVSOgorLyogWFhYIE5vdCB5ZXQgaW1wbGVtZW50ZWQgYnkgUkxNVCB0aGVyZWZvcmUgd2UgcmV0dXJuIHplcm8gZWxlbWVudHMgKi8KKwkJVmFsMzIgPSAwOworCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9UWF9TV19RVUVVRV9MRU46CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5UeFN3UXVldWVMZW47CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbMF0uVHhTd1F1ZXVlTGVuICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMV0uVHhTd1F1ZXVlTGVuOworCQkJfQkJCQorCQl9CisJCWVsc2UgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uVHhTd1F1ZXVlTGVuOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0WzBdLlR4U3dRdWV1ZUxlbiArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzFdLlR4U3dRdWV1ZUxlbjsKKwkJCX0JCQkKKwkJfQorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisKKwljYXNlIE9JRF9TS0dFX1RYX1NXX1FVRVVFX01BWDoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlR4U3dRdWV1ZU1heDsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFswXS5UeFN3UXVldWVNYXggKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFsxXS5UeFN3UXVldWVNYXg7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5UeFN3UXVldWVNYXg7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbMF0uVHhTd1F1ZXVlTWF4ICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMV0uVHhTd1F1ZXVlTWF4OworCQkJfQorCQl9CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1RYX1JFVFJZOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uVHhSZXRyeUN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFswXS5UeFJldHJ5Q3RzICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMV0uVHhSZXRyeUN0czsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlR4UmV0cnlDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbMF0uVHhSZXRyeUN0cyArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzFdLlR4UmV0cnlDdHM7CisJCQl9CisJCX0KKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfUlhfSU5UUl9DVFM6CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5SeEludHJDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbMF0uUnhJbnRyQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMV0uUnhJbnRyQ3RzOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uUnhJbnRyQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0WzBdLlJ4SW50ckN0cyArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzFdLlJ4SW50ckN0czsKKwkJCX0KKwkJfQorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9UWF9JTlRSX0NUUzoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlR4SW50ckN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFswXS5UeEludHJDdHMgKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFsxXS5UeEludHJDdHM7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5UeEludHJDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbMF0uVHhJbnRyQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMV0uVHhJbnRyQ3RzOworCQkJfQorCQl9CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1JYX05PX0JVRl9DVFM6CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5SeE5vQnVmQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0WzBdLlJ4Tm9CdWZDdHMgKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFsxXS5SeE5vQnVmQ3RzOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uUnhOb0J1ZkN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFswXS5SeE5vQnVmQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMV0uUnhOb0J1ZkN0czsKKwkJCX0KKwkJfQorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9UWF9OT19CVUZfQ1RTOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uVHhOb0J1ZkN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFswXS5UeE5vQnVmQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMV0uVHhOb0J1ZkN0czsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlR4Tm9CdWZDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbMF0uVHhOb0J1ZkN0cyArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzFdLlR4Tm9CdWZDdHM7CisJCQl9CisJCX0KKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfVFhfVVNFRF9ERVNDUl9OTzoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlR4VXNlZERlc2NyTm87CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbMF0uVHhVc2VkRGVzY3JObyArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzFdLlR4VXNlZERlc2NyTm87CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5UeFVzZWREZXNjck5vOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0WzBdLlR4VXNlZERlc2NyTm8gKworCQkJCQlwQUMtPlBubWkuUG9ydFsxXS5UeFVzZWREZXNjck5vOworCQkJfQorCQl9CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1JYX0RFTElWRVJFRF9DVFM6CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5SeERlbGl2ZXJlZEN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFswXS5SeERlbGl2ZXJlZEN0cyArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzFdLlJ4RGVsaXZlcmVkQ3RzOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uUnhEZWxpdmVyZWRDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbMF0uUnhEZWxpdmVyZWRDdHMgKworCQkJCQlwQUMtPlBubWkuUG9ydFsxXS5SeERlbGl2ZXJlZEN0czsKKwkJCX0KKwkJfQorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9SWF9PQ1RFVFNfREVMSVZfQ1RTOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uUnhPY3RldHNEZWxpdmVyZWRDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbMF0uUnhPY3RldHNEZWxpdmVyZWRDdHMgKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFsxXS5SeE9jdGV0c0RlbGl2ZXJlZEN0czsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlJ4T2N0ZXRzRGVsaXZlcmVkQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0WzBdLlJ4T2N0ZXRzRGVsaXZlcmVkQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMV0uUnhPY3RldHNEZWxpdmVyZWRDdHM7CisJCQl9CisJCX0KKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfUlhfSFdfRVJST1JfQ1RTOgorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NFJ4SHdFcnJzKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1RYX0hXX0VSUk9SX0NUUzoKKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjRUeEh3RXJycyk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9JTl9FUlJPUlNfQ1RTOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBWYWw2NFJ4SHdFcnJzICsgcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlJ4Tm9CdWZDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gVmFsNjRSeEh3RXJycyArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzBdLlJ4Tm9CdWZDdHMgKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFsxXS5SeE5vQnVmQ3RzOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBWYWw2NFJ4SHdFcnJzICsgcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlJ4Tm9CdWZDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gVmFsNjRSeEh3RXJycyArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzBdLlJ4Tm9CdWZDdHMgKworCQkJCQlwQUMtPlBubWkuUG9ydFsxXS5SeE5vQnVmQ3RzOworCQkJfQorCQl9CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX09VVF9FUlJPUl9DVFM6CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IFZhbDY0VHhId0VycnMgKyBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uVHhOb0J1ZkN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBWYWw2NFR4SHdFcnJzICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMF0uVHhOb0J1ZkN0cyArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzFdLlR4Tm9CdWZDdHM7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IFZhbDY0VHhId0VycnMgKyBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uVHhOb0J1ZkN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBWYWw2NFR4SHdFcnJzICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMF0uVHhOb0J1ZkN0cyArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzFdLlR4Tm9CdWZDdHM7CisJCQl9CisJCX0KKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfRVJSX1JFQ09WRVJZX0NUUzoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLkVyclJlY292ZXJ5Q3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0WzBdLkVyclJlY292ZXJ5Q3RzICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMV0uRXJyUmVjb3ZlcnlDdHM7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5FcnJSZWNvdmVyeUN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFswXS5FcnJSZWNvdmVyeUN0cyArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzFdLkVyclJlY292ZXJ5Q3RzOworCQkJfQorCQl9CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1NZU1VQVElNRToKKwkJVmFsNjQgPSBTS19QTk1JX0hVTkRSRURTX1NFQyhTa09zR2V0VGltZShwQUMpKTsKKwkJVmFsNjQgLT0gcEFDLT5Qbm1pLlN0YXJ0VXBUaW1lOworCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9NREJfVkVSU0lPTjoKKwkJVmFsMzIgPSBTS19QTk1JX01EQl9WRVJTSU9OOworCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCWJyZWFrOworCisJY2FzZSBPSURfR0VOX1JDVl9FUlJPUjoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCVZhbDY0ID0gVmFsNjRSeEh3RXJycyArIHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5SeE5vQnVmQ3RzOworCQl9CisJCWVsc2UgeworCQkJVmFsNjQgPSBWYWw2NFJ4SHdFcnJzICsgcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlJ4Tm9CdWZDdHM7CisJCX0KKworCQkvKgorCQkgKiBieSBkZWZhdWx0IDMyYml0IHZhbHVlcyBhcmUgZXZhbHVhdGVkCisJCSAqLworCQlpZiAoIUlzNjRCaXRSZXEpIHsKKwkJCVZhbDMyID0gKFNLX1UzMilWYWw2NDsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCX0KKwkJZWxzZSB7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPSURfR0VOX1hNSVRfRVJST1I6CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQlWYWw2NCA9IFZhbDY0VHhId0VycnMgKyBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uVHhOb0J1ZkN0czsKKwkJfQorCQllbHNlIHsKKwkJCVZhbDY0ID0gVmFsNjRUeEh3RXJycyArIHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5UeE5vQnVmQ3RzOworCQl9CisKKwkJLyoKKwkJICogYnkgZGVmYXVsdCAzMmJpdCB2YWx1ZXMgYXJlIGV2YWx1YXRlZAorCQkgKi8KKwkJaWYgKCFJczY0Qml0UmVxKSB7CisJCQlWYWwzMiA9IChTS19VMzIpVmFsNjQ7CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQl9CisJCWVsc2UgeworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uUnhOb0J1ZkN0czsKKwkJfQorCQllbHNlIHsKKwkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlJ4Tm9CdWZDdHM7CisJCX0KKworCQkvKgorCQkgKiBieSBkZWZhdWx0IDMyYml0IHZhbHVlcyBhcmUgZXZhbHVhdGVkCisJCSAqLworCQlpZiAoIUlzNjRCaXRSZXEpIHsKKwkJCVZhbDMyID0gKFNLX1UzMilWYWw2NDsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCX0KKwkJZWxzZSB7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPSURfR0VOX1RSQU5TTUlUX1FVRVVFX0xFTkdUSDoKKwkJVmFsMzIgPSAoU0tfVTMyKXBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5UeFN3UXVldWVMZW47CisJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDM0LAorCQkJU0tfUE5NSV9FUlIwMzRNU0cpOworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwl9CisKKwlpZiAoSWQgPT0gT0lEX1NLR0VfUlhfSFdfRVJST1JfQ1RTIHx8CisJCUlkID09IE9JRF9TS0dFX1RYX0hXX0VSUk9SX0NUUyB8fAorCQlJZCA9PSBPSURfU0tHRV9JTl9FUlJPUlNfQ1RTIHx8CisJCUlkID09IE9JRF9TS0dFX09VVF9FUlJPUl9DVFMgfHwKKwkJSWQgPT0gT0lEX0dFTl9YTUlUX0VSUk9SIHx8CisJCUlkID09IE9JRF9HRU5fUkNWX0VSUk9SKSB7CisKKwkJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnIC0tOworCX0KKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSbG10IC0gT0lEIGhhbmRsZXIgZnVuY3Rpb24gb2YgT0lEX1NLR0VfUkxNVF9YWFggc2luZ2xlIGluc3RhbmNlLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJR2V0L1ByZXNldHMvU2V0cyB0aGUgUkxNVCBPSURzLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9CQURfVkFMVUUgICAgVGhlIHBhc3NlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIHZhbGlkCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgcmFuZ2UuCisgKglTS19QTk1JX0VSUl9SRUFEX09OTFkgICAgVGhlIE9JRCBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzZXQuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitQTk1JX1NUQVRJQyBpbnQgUmxtdCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBwQnVmIGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCWludAkJUmV0OworCXVuc2lnbmVkIGludAlQaHlzUG9ydEluZGV4OworCXVuc2lnbmVkIGludAlQaHlzUG9ydE1heDsKKwlTS19FVlBBUkEJRXZlbnRQYXJhbTsKKwlTS19VMzIJCVZhbDMyOworCVNLX1U2NAkJVmFsNjQ7CisKKworCS8qCisJICogQ2hlY2sgaW5zdGFuY2UuIE9ubHkgc2luZ2xlIGluc3RhbmNlIE9JRHMgYXJlIGFsbG93ZWQgaGVyZS4KKwkgKi8KKwlpZiAoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpICYmIEluc3RhbmNlICE9IDEpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwl9CisKKwkvKgorCSAqIFBlcmZvcm0gdGhlIHJlcXVlc3RlZCBhY3Rpb24uCisJICovCisJaWYgKEFjdGlvbiA9PSBTS19QTk1JX0dFVCkgeworCisJCS8qCisJCSAqIENoZWNrIGlmIHRoZSBidWZmZXIgbGVuZ3RoIGlzIGxhcmdlIGVub3VnaC4KKwkJICovCisKKwkJc3dpdGNoIChJZCkgeworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9NT0RFOgorCQljYXNlIE9JRF9TS0dFX1JMTVRfUE9SVF9BQ1RJVkU6CisJCWNhc2UgT0lEX1NLR0VfUkxNVF9QT1JUX1BSRUZFUlJFRDoKKwkJCWlmICgqcExlbiA8IHNpemVvZihTS19VOCkpIHsKKworCQkJCSpwTGVuID0gc2l6ZW9mKFNLX1U4KTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfUE9SVF9OVU1CRVI6CisJCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTMyKSkgeworCisJCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfQ0hBTkdFX0NUUzoKKwkJY2FzZSBPSURfU0tHRV9STE1UX0NIQU5HRV9USU1FOgorCQljYXNlIE9JRF9TS0dFX1JMTVRfQ0hBTkdFX0VTVElNOgorCQljYXNlIE9JRF9TS0dFX1JMTVRfQ0hBTkdFX1RIUkVTOgorCQkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1U2NCkpIHsKKworCQkJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMzUsCisJCQkJU0tfUE5NSV9FUlIwMzVNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJLyoKKwkJICogVXBkYXRlIFJMTVQgc3RhdGlzdGljIGFuZCBpbmNyZW1lbnQgc2VtYXBob3JlcyB0byBpbmRpY2F0ZQorCQkgKiB0aGF0IGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBkb25lLiBNYXliZSBSTE1UIHdpbGwgaG9sZCBpdHMKKwkJICogc3RhdGlzdGljIGFsd2F5cyB1cCB0byBkYXRlIHNvbWUgdGltZS4gVGhlbiB3ZSBjYW4KKwkJICogcmVtb3ZlIHRoaXMgdHlwZSBvZiBjYWxsLgorCQkgKi8KKwkJaWYgKChSZXQgPSBSbG10VXBkYXRlKHBBQywgSW9DLCBOZXRJbmRleCkpICE9IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoUmV0KTsKKwkJfQorCQlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnICsrOworCisJCS8qCisJCSAqIFJldHJpZXZlIFZhbHVlCisJCSovCisJCXN3aXRjaCAoSWQpIHsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfTU9ERToKKwkJCSpwQnVmID0gKGNoYXIpcEFDLT5SbG10Lk5ldFswXS5SbG10TW9kZTsKKwkJCSpwTGVuID0gc2l6ZW9mKGNoYXIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX1BPUlRfTlVNQkVSOgorCQkJVmFsMzIgPSAoU0tfVTMyKXBBQy0+R0luaS5HSU1hY3NGb3VuZDsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfUE9SVF9BQ1RJVkU6CisJCQkqcEJ1ZiA9IDA7CisJCQkvKgorCQkJICogSWYgbXVsdGlwbGUgcG9ydHMgbWF5IGJlY29tZSBhY3RpdmUgdGhpcyBPSUQKKwkJCSAqIGRvZXNuJ3QgbWFrZSBzZW5zZSBhbnkgbW9yZS4gQSBuZXcgdmFyaWFibGUgaW4KKwkJCSAqIHRoZSBwb3J0IHN0cnVjdHVyZSBzaG91bGQgYmUgY3JlYXRlZC4gSG93ZXZlciwKKwkJCSAqIGZvciB0aGlzIHZhcmlhYmxlIHRoZSBmaXJzdCBhY3RpdmUgcG9ydCBpcworCQkJICogcmV0dXJuZWQuCisJCQkgKi8KKwkJCVBoeXNQb3J0TWF4ID0gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCisJCQlmb3IgKFBoeXNQb3J0SW5kZXggPSAwOyBQaHlzUG9ydEluZGV4IDwgUGh5c1BvcnRNYXg7CisJCQkJUGh5c1BvcnRJbmRleCArKykgeworCisJCQkJaWYgKHBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLkFjdGl2ZUZsYWcpIHsKKworCQkJCQkqcEJ1ZiA9IChjaGFyKVNLX1BOTUlfUE9SVF9QSFlTMkxPRyhQaHlzUG9ydEluZGV4KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJKnBMZW4gPSBzaXplb2YoY2hhcik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfUE9SVF9QUkVGRVJSRUQ6CisJCQkqcEJ1ZiA9IChjaGFyKVNLX1BOTUlfUE9SVF9QSFlTMkxPRyhwQUMtPlJsbXQuTmV0W05ldEluZGV4XS5QcmVmZXJlbmNlKTsKKwkJCSpwTGVuID0gc2l6ZW9mKGNoYXIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX0NIQU5HRV9DVFM6CisJCQlWYWw2NCA9IHBBQy0+UG5taS5SbG10Q2hhbmdlQ3RzOworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9DSEFOR0VfVElNRToKKwkJCVZhbDY0ID0gcEFDLT5Qbm1pLlJsbXRDaGFuZ2VUaW1lOworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9DSEFOR0VfRVNUSU06CisJCQlWYWw2NCA9IHBBQy0+UG5taS5SbG10Q2hhbmdlRXN0aW1hdGUuRXN0aW1hdGU7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX0NIQU5HRV9USFJFUzoKKwkJCVZhbDY0ID0gcEFDLT5Qbm1pLlJsbXRDaGFuZ2VUaHJlc2hvbGQ7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0VSUiwKKwkJCQkoIlJsbXQ6IFVua25vd24gT0lEIHNob3VsZCBiZSBoYW5kbGVkIGJlZm9yZSIpKTsKKworCQkJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyAtLTsKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnIC0tOworCX0KKwllbHNlIHsKKwkJLyogUGVyZm9ybSBhIHByZXNldCBvciBzZXQgKi8KKwkJc3dpdGNoIChJZCkgeworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9NT0RFOgorCQkJLyogQ2hlY2sgaWYgdGhlIGJ1ZmZlciBsZW5ndGggaXMgcGxhdXNpYmxlICovCisJCQlpZiAoKnBMZW4gPCBzaXplb2YoY2hhcikpIHsKKworCQkJCSpwTGVuID0gc2l6ZW9mKGNoYXIpOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKwkJCS8qIENoZWNrIGlmIHRoZSB2YWx1ZSByYW5nZSBpcyBjb3JyZWN0ICovCisJCQlpZiAoKnBMZW4gIT0gc2l6ZW9mKGNoYXIpIHx8CisJCQkJKCpwQnVmICYgU0tfUE5NSV9STE1UX01PREVfQ0hLX0xJTkspID09IDAgfHwKKwkJCQkqKFNLX1U4ICopcEJ1ZiA+IDE1KSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJfQorCQkJLyogVGhlIHByZXNldCBlbmRzIGhlcmUgKi8KKwkJCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwkJCX0KKwkJCS8qIFNlbmQgYW4gZXZlbnQgdG8gUkxNVCB0byBjaGFuZ2UgdGhlIG1vZGUgKi8KKwkJCVNLX01FTVNFVCgoY2hhciAqKSZFdmVudFBhcmFtLCAwLCBzaXplb2YoRXZlbnRQYXJhbSkpOworCQkJRXZlbnRQYXJhbS5QYXJhMzJbMF0gfD0gKFNLX1UzMikoKnBCdWYpOworCQkJRXZlbnRQYXJhbS5QYXJhMzJbMV0gPSAwOworCQkJaWYgKFNrUmxtdEV2ZW50KHBBQywgSW9DLCBTS19STE1UX01PREVfQ0hBTkdFLAorCQkJCUV2ZW50UGFyYW0pID4gMCkgeworCisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAzNywKKwkJCQkJU0tfUE5NSV9FUlIwMzdNU0cpOworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfUE9SVF9QUkVGRVJSRUQ6CisJCQkvKiBDaGVjayBpZiB0aGUgYnVmZmVyIGxlbmd0aCBpcyBwbGF1c2libGUgKi8KKwkJCWlmICgqcExlbiA8IHNpemVvZihjaGFyKSkgeworCisJCQkJKnBMZW4gPSBzaXplb2YoY2hhcik7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCQkJLyogQ2hlY2sgaWYgdGhlIHZhbHVlIHJhbmdlIGlzIGNvcnJlY3QgKi8KKwkJCWlmICgqcExlbiAhPSBzaXplb2YoY2hhcikgfHwgKihTS19VOCAqKXBCdWYgPgorCQkJCShTS19VOClwQUMtPkdJbmkuR0lNYWNzRm91bmQpIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQl9CisJCQkvKiBUaGUgcHJlc2V0IGVuZHMgaGVyZSAqLworCQkJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCQkJfQorCisJCQkvKgorCQkJICogU2VuZCBhbiBldmVudCB0byBSTE1UIGNoYW5nZSB0aGUgcHJlZmVycmVkIHBvcnQuCisJCQkgKiBBIHBhcmFtIG9mIC0xIG1lYW5zIGF1dG9tYXRpYyBtb2RlLiBSTE1UIHdpbGwKKwkJCSAqIG1ha2UgdGhlIGRlY2lzaW9uIHdoaWNoIGlzIHRoZSBwcmVmZXJyZWQgcG9ydC4KKwkJCSAqLworCQkJU0tfTUVNU0VUKChjaGFyICopJkV2ZW50UGFyYW0sIDAsIHNpemVvZihFdmVudFBhcmFtKSk7CisJCQlFdmVudFBhcmFtLlBhcmEzMlswXSA9IChTS19VMzIpKCpwQnVmKSAtIDE7CisJCQlFdmVudFBhcmFtLlBhcmEzMlsxXSA9IE5ldEluZGV4OworCQkJaWYgKFNrUmxtdEV2ZW50KHBBQywgSW9DLCBTS19STE1UX1BSRUZQT1JUX0NIQU5HRSwKKwkJCQlFdmVudFBhcmFtKSA+IDApIHsKKworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMzgsCisJCQkJCVNLX1BOTUlfRVJSMDM4TVNHKTsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX0NIQU5HRV9USFJFUzoKKwkJCS8qIENoZWNrIGlmIHRoZSBidWZmZXIgbGVuZ3RoIGlzIHBsYXVzaWJsZSAqLworCQkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1U2NCkpIHsKKworCQkJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCQkJLyoKKwkJCSAqIFRoZXJlIGFyZSBub3QgbWFueSByZXN0cmljdGlvbnMgdG8gdGhlCisJCQkgKiB2YWx1ZSByYW5nZS4KKwkJCSAqLworCQkJaWYgKCpwTGVuICE9IHNpemVvZihTS19VNjQpKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJfQorCQkJLyogQSBwcmVzZXQgZW5kcyBoZXJlICovCisJCQlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJCQl9CisJCQkvKgorCQkJICogU3RvcmUgdGhlIG5ldyB0aHJlc2hvbGQsIHdoaWNoIHdpbGwgYmUgdGFrZW4KKwkJCSAqIG9uIHRoZSBuZXh0IHRpbWVyIGV2ZW50LgorCQkJICovCisJCQlTS19QTk1JX1JFQURfVTY0KHBCdWYsIFZhbDY0KTsKKwkJCXBBQy0+UG5taS5SbG10Q2hhbmdlVGhyZXNob2xkID0gVmFsNjQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogVGhlIG90aGVyIE9JRHMgYXJlIG5vdCBiZSBhYmxlIGZvciBzZXQgKi8KKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfUkVBRF9PTkxZKTsKKwkJfQorCX0KKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSbG10U3RhdCAtIE9JRCBoYW5kbGVyIGZ1bmN0aW9uIG9mIE9JRF9TS0dFX1JMTVRfWFhYIG11bHRpcGxlIGluc3RhbmNlLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJUGVyZm9ybXMgZ2V0IHJlcXVlc3RzIG9uIG11bHRpcGxlIGluc3RhbmNlIHZhcmlhYmxlcy4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworUE5NSV9TVEFUSUMgaW50IFJsbXRTdGF0KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IHBCdWYgYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0TWF4OworCXVuc2lnbmVkIGludAlQaHlzUG9ydEluZGV4OworCXVuc2lnbmVkIGludAlMaW1pdDsKKwl1bnNpZ25lZCBpbnQJT2Zmc2V0OworCWludAkJUmV0OworCVNLX1UzMgkJVmFsMzI7CisJU0tfVTY0CQlWYWw2NDsKKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBwb3J0IGluZGV4ZXMgZnJvbSB0aGUgaW5zdGFuY2UuCisJICovCisJUGh5c1BvcnRNYXggPSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisKKwlpZiAoKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSkpIHsKKwkJLyogQ2hlY2sgaW5zdGFuY2UgcmFuZ2UgKi8KKwkJaWYgKChJbnN0YW5jZSA8IDEpIHx8IChJbnN0YW5jZSA+IFBoeXNQb3J0TWF4KSkgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJCX0KKworCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJUGh5c1BvcnRJbmRleCA9IEluc3RhbmNlIC0gMTsKKworCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJUGh5c1BvcnRJbmRleCA9IE5ldEluZGV4OworCQl9CisKKwkJLyogQm90aCBuZXQgbW9kZXMgKi8KKwkJTGltaXQgPSBQaHlzUG9ydEluZGV4ICsgMTsKKwl9CisJZWxzZSB7CisJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQlQaHlzUG9ydEluZGV4ID0gMDsKKwkJTGltaXQgPSBQaHlzUG9ydE1heDsKKworCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJUGh5c1BvcnRJbmRleCA9IE5ldEluZGV4OworCQkJTGltaXQgPSBQaHlzUG9ydEluZGV4ICsgMTsKKwkJfQorCX0KKworCS8qCisJICogQ3VycmVudGx5IG9ubHkgZ2V0IHJlcXVlc3RzIGFyZSBhbGxvd2VkLgorCSAqLworCWlmIChBY3Rpb24gIT0gU0tfUE5NSV9HRVQpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfUkVBRF9PTkxZKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBidWZmZXIgbGVuZ3RoIGlzIGxhcmdlIGVub3VnaC4KKwkgKi8KKwlzd2l0Y2ggKElkKSB7CisKKwljYXNlIE9JRF9TS0dFX1JMTVRfUE9SVF9JTkRFWDoKKwljYXNlIE9JRF9TS0dFX1JMTVRfU1RBVFVTOgorCQlpZiAoKnBMZW4gPCAoTGltaXQgLSBQaHlzUG9ydEluZGV4KSAqIHNpemVvZihTS19VMzIpKSB7CisKKwkJCSpwTGVuID0gKExpbWl0IC0gUGh5c1BvcnRJbmRleCkgKiBzaXplb2YoU0tfVTMyKTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfUkxNVF9UWF9IRUxMT19DVFM6CisJY2FzZSBPSURfU0tHRV9STE1UX1JYX0hFTExPX0NUUzoKKwljYXNlIE9JRF9TS0dFX1JMTVRfVFhfU1BfUkVRX0NUUzoKKwljYXNlIE9JRF9TS0dFX1JMTVRfUlhfU1BfQ1RTOgorCQlpZiAoKnBMZW4gPCAoTGltaXQgLSBQaHlzUG9ydEluZGV4KSAqIHNpemVvZihTS19VNjQpKSB7CisKKwkJCSpwTGVuID0gKExpbWl0IC0gUGh5c1BvcnRJbmRleCkgKiBzaXplb2YoU0tfVTY0KTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMzksCisJCQlTS19QTk1JX0VSUjAzOU1TRyk7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCisJfQorCisJLyoKKwkgKiBVcGRhdGUgc3RhdGlzdGljIGFuZCBpbmNyZW1lbnQgc2VtYXBob3JlcyB0byBpbmRpY2F0ZSB0aGF0CisJICogYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGRvbmUuCisJICovCisJaWYgKChSZXQgPSBSbG10VXBkYXRlKHBBQywgSW9DLCBOZXRJbmRleCkpICE9IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFJldCk7CisJfQorCXBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgKys7CisKKwkvKgorCSAqIEdldCB2YWx1ZQorCSAqLworCU9mZnNldCA9IDA7CisJZm9yICg7IFBoeXNQb3J0SW5kZXggPCBMaW1pdDsgUGh5c1BvcnRJbmRleCArKykgeworCisJCXN3aXRjaCAoSWQpIHsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfUE9SVF9JTkRFWDoKKwkJCVZhbDMyID0gUGh5c1BvcnRJbmRleDsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBPZmZzZXQsIFZhbDMyKTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9TVEFUVVM6CisJCQlpZiAocEFDLT5SbG10LlBvcnRbUGh5c1BvcnRJbmRleF0uUG9ydFN0YXRlID09CisJCQkJU0tfUkxNVF9QU19JTklUIHx8CisJCQkJcEFDLT5SbG10LlBvcnRbUGh5c1BvcnRJbmRleF0uUG9ydFN0YXRlID09CisJCQkJU0tfUkxNVF9QU19ET1dOKSB7CisKKwkJCQlWYWwzMiA9IFNLX1BOTUlfUkxNVF9TVEFUVVNfRVJST1I7CisJCQl9CisJCQllbHNlIGlmIChwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5BY3RpdmVGbGFnKSB7CisKKwkJCQlWYWwzMiA9IFNLX1BOTUlfUkxNVF9TVEFUVVNfQUNUSVZFOworCQkJfQorCQkJZWxzZSB7CisJCQkJVmFsMzIgPSBTS19QTk1JX1JMTVRfU1RBVFVTX1NUQU5EQlk7CisJCQl9CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgT2Zmc2V0LCBWYWwzMik7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1UzMik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfVFhfSEVMTE9fQ1RTOgorCQkJVmFsNjQgPSBwQUMtPlJsbXQuUG9ydFtQaHlzUG9ydEluZGV4XS5UeEhlbGxvQ3RzOworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiArIE9mZnNldCwgVmFsNjQpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VNjQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX1JYX0hFTExPX0NUUzoKKwkJCVZhbDY0ID0gcEFDLT5SbG10LlBvcnRbUGh5c1BvcnRJbmRleF0uUnhIZWxsb0N0czsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYgKyBPZmZzZXQsIFZhbDY0KTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTY0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9UWF9TUF9SRVFfQ1RTOgorCQkJVmFsNjQgPSBwQUMtPlJsbXQuUG9ydFtQaHlzUG9ydEluZGV4XS5UeFNwSGVsbG9SZXFDdHM7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmICsgT2Zmc2V0LCBWYWw2NCk7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U2NCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfUlhfU1BfQ1RTOgorCQkJVmFsNjQgPSBwQUMtPlJsbXQuUG9ydFtQaHlzUG9ydEluZGV4XS5SeFNwSGVsbG9DdHM7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmICsgT2Zmc2V0LCBWYWw2NCk7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U2NCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfRVJSLAorCQkJCSgiUmxtdFN0YXQ6IFVua25vd24gT0lEIHNob3VsZCBiZSBlcnJvcmVkIGJlZm9yZSIpKTsKKworCQkJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyAtLTsKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKwl9CisJKnBMZW4gPSBPZmZzZXQ7CisKKwlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnIC0tOworCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1hY1ByaXZhdGVDb25mIC0gT0lEIGhhbmRsZXIgZnVuY3Rpb24gb2YgT0lEcyBjb25jZXJuaW5nIHRoZSBjb25maWd1cmF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKglHZXQvUHJlc2V0cy9TZXRzIHRoZSBPSURzIGNvbmNlcm5pbmcgdGhlIGNvbmZpZ3VyYXRpb24uCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX0JBRF9WQUxVRSAgICBUaGUgcGFzc2VkIHZhbHVlIGlzIG5vdCBpbiB0aGUgdmFsaWQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSByYW5nZS4KKyAqCVNLX1BOTUlfRVJSX1JFQURfT05MWSAgICBUaGUgT0lEIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNldC4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK1BOTUlfU1RBVElDIGludCBNYWNQcml2YXRlQ29uZigKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBwQnVmIGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCXVuc2lnbmVkIGludAlQaHlzUG9ydE1heDsKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRJbmRleDsKKwl1bnNpZ25lZCBpbnQJTG9nUG9ydE1heDsKKwl1bnNpZ25lZCBpbnQJTG9nUG9ydEluZGV4OworCXVuc2lnbmVkIGludAlMaW1pdDsKKwl1bnNpZ25lZCBpbnQJT2Zmc2V0OworCWNoYXIJCVZhbDg7CisJY2hhciAJCSpwQnVmUHRyOworCWludAkJCVJldDsKKwlTS19FVlBBUkEJRXZlbnRQYXJhbTsKKwlTS19VMzIJCVZhbDMyOworCisJLyoKKwkgKiBDYWxjdWxhdGUgaW5zdGFuY2UgaWYgd2lzaGVkLiBNQUMgaW5kZXggMCBpcyB0aGUgdmlydHVhbCBNQUMuCisJICovCisJUGh5c1BvcnRNYXggPSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisJTG9nUG9ydE1heCA9IFNLX1BOTUlfUE9SVF9QSFlTMkxPRyhQaHlzUG9ydE1heCk7CisKKwlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsgLyogRHVhbCBuZXQgbW9kZSAqLworCQlMb2dQb3J0TWF4LS07CisJfQorCisJaWYgKChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkpKSB7IC8qIE9ubHkgb25lIHNwZWNpZmljIGluc3RhbmNlIGlzIHF1ZXJpZWQgKi8KKwkJLyogQ2hlY2sgaW5zdGFuY2UgcmFuZ2UgKi8KKwkJaWYgKChJbnN0YW5jZSA8IDEpIHx8IChJbnN0YW5jZSA+IExvZ1BvcnRNYXgpKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwkJfQorCQlMb2dQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfSU5TVDJMT0coSW5zdGFuY2UpOworCQlMaW1pdCA9IExvZ1BvcnRJbmRleCArIDE7CisJfQorCisJZWxzZSB7IC8qIEluc3RhbmNlID09IChTS19VMzIpKC0xKSwgZ2V0IGFsbCBJbnN0YW5jZXMgb2YgdGhhdCBPSUQgKi8KKworCQlMb2dQb3J0SW5kZXggPSAwOworCQlMaW1pdCA9IExvZ1BvcnRNYXg7CisJfQorCisJLyoKKwkgKiBQZXJmb3JtIGFjdGlvbgorCSAqLworCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9HRVQpIHsKKworCQkvKiBDaGVjayBsZW5ndGggKi8KKwkJc3dpdGNoIChJZCkgeworCisJCWNhc2UgT0lEX1NLR0VfUE1EOgorCQljYXNlIE9JRF9TS0dFX0NPTk5FQ1RPUjoKKwkJY2FzZSBPSURfU0tHRV9MSU5LX0NBUDoKKwkJY2FzZSBPSURfU0tHRV9MSU5LX01PREU6CisJCWNhc2UgT0lEX1NLR0VfTElOS19NT0RFX1NUQVRVUzoKKwkJY2FzZSBPSURfU0tHRV9MSU5LX1NUQVRVUzoKKwkJY2FzZSBPSURfU0tHRV9GTE9XQ1RSTF9DQVA6CisJCWNhc2UgT0lEX1NLR0VfRkxPV0NUUkxfTU9ERToKKwkJY2FzZSBPSURfU0tHRV9GTE9XQ1RSTF9TVEFUVVM6CisJCWNhc2UgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9DQVA6CisJCWNhc2UgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9NT0RFOgorCQljYXNlIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fU1RBVFVTOgorCQljYXNlIE9JRF9TS0dFX1NQRUVEX0NBUDoKKwkJY2FzZSBPSURfU0tHRV9TUEVFRF9NT0RFOgorCQljYXNlIE9JRF9TS0dFX1NQRUVEX1NUQVRVUzoKKyNpZmRlZiBTS19QSFlfTFBfTU9ERQorCQljYXNlIE9JRF9TS0dFX1BIWV9MUF9NT0RFOgorI2VuZGlmCisJCQlpZiAoKnBMZW4gPCAoTGltaXQgLSBMb2dQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1U4KSkgeworCisJCQkJKnBMZW4gPSAoTGltaXQgLSBMb2dQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1U4KTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisJCQlicmVhazsKKworICAgICAgICBjYXNlIE9JRF9TS0dFX01UVToKKyAgICAgICAgY2FzZSBPSURfU0tHRV9QSFlfVFlQRToKKwkJCWlmICgqcExlbiA8IChMaW1pdCAtIExvZ1BvcnRJbmRleCkgKiBzaXplb2YoU0tfVTMyKSkgeworCisJCQkJKnBMZW4gPSAoTGltaXQgLSBMb2dQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1UzMik7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwNDEsCisJCQkJU0tfUE5NSV9FUlIwNDFNU0cpOworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCS8qCisJCSAqIFVwZGF0ZSBzdGF0aXN0aWMgYW5kIGluY3JlbWVudCBzZW1hcGhvcmUgdG8gaW5kaWNhdGUKKwkJICogdGhhdCBhbiB1cGRhdGUgd2FzIGFscmVhZHkgZG9uZS4KKwkJICovCisJCWlmICgoUmV0ID0gU2lycVVwZGF0ZShwQUMsIElvQykpICE9IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoUmV0KTsKKwkJfQorCQlwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnICsrOworCisJCS8qCisJCSAqIEdldCB2YWx1ZQorCQkgKi8KKwkJT2Zmc2V0ID0gMDsKKwkJZm9yICg7IExvZ1BvcnRJbmRleCA8IExpbWl0OyBMb2dQb3J0SW5kZXggKyspIHsKKworCQkJcEJ1ZlB0ciA9IHBCdWYgKyBPZmZzZXQ7CisJCQkKKwkJCXN3aXRjaCAoSWQpIHsKKworCQkJY2FzZSBPSURfU0tHRV9QTUQ6CisJCQkJKnBCdWZQdHIgPSBwQUMtPlBubWkuUE1EOworCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfQ09OTkVDVE9SOgorCQkJCSpwQnVmUHRyID0gcEFDLT5Qbm1pLkNvbm5lY3RvcjsKKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX1BIWV9UWVBFOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydHMgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCQkJCQkJVmFsMzIgPSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUGh5VHlwZTsKKwkJCQkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWZQdHIsIFZhbDMyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKwkJCQkJCisJCQkJCVZhbDMyID0gcEFDLT5HSW5pLkdQW05ldEluZGV4XS5QaHlUeXBlOworCQkJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmUHRyLCBWYWwzMik7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoU0tfVTMyKTsKKwkJCQlicmVhazsKKworI2lmZGVmIFNLX1BIWV9MUF9NT0RFCisJCQljYXNlIE9JRF9TS0dFX1BIWV9MUF9NT0RFOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydHMgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMocEFDLCBMb2dQb3J0SW5kZXgpOworCQkJCQkJVmFsOCA9IChTS19VOCkgcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBQaHlQb3dlclN0YXRlOworCQkJCQkJKnBCdWZQdHIgPSBWYWw4OworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCQkJCQkKKwkJCQkJVmFsOCA9IChTS19VOCkgcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBQaHlQb3dlclN0YXRlOworCQkJCQkqcEJ1ZlB0ciA9IFZhbDg7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoU0tfVTgpOworCQkJCWJyZWFrOworI2VuZGlmCisKKwkJCWNhc2UgT0lEX1NLR0VfTElOS19DQVA6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgdmlydHVhbCBwb3J0ICovCisJCQkJCQlWaXJ0dWFsQ29uZihwQUMsIElvQywgSWQsIHBCdWZQdHIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0cyAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisKKwkJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBMaW5rQ2FwOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCQkJCQkKKwkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbTmV0SW5kZXhdLlBMaW5rQ2FwOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX0xJTktfTU9ERToKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciB2aXJ0dWFsIHBvcnQgKi8KKwkJCQkJCVZpcnR1YWxDb25mKHBBQywgSW9DLCBJZCwgcEJ1ZlB0cik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnRzICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKworCQkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUExpbmtNb2RlQ29uZjsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKwkJCQkKKwkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbTmV0SW5kZXhdLlBMaW5rTW9kZUNvbmY7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfTElOS19NT0RFX1NUQVRVUzoKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciB2aXJ0dWFsIHBvcnQgKi8KKwkJCQkJCVZpcnR1YWxDb25mKHBBQywgSW9DLCBJZCwgcEJ1ZlB0cik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnQgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCisJCQkJCQkqcEJ1ZlB0ciA9CisJCQkJCQkJQ2FsY3VsYXRlTGlua01vZGVTdGF0dXMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCQkJCQkKKwkJCQkJKnBCdWZQdHIgPSBDYWxjdWxhdGVMaW5rTW9kZVN0YXR1cyhwQUMsIElvQywgTmV0SW5kZXgpOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX0xJTktfU1RBVFVTOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHZpcnR1YWwgcG9ydCAqLworCQkJCQkJVmlydHVhbENvbmYocEFDLCBJb0MsIElkLCBwQnVmUHRyKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydHMgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCQorCQkJCQkJKnBCdWZQdHIgPSBDYWxjdWxhdGVMaW5rU3RhdHVzKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4KTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKworCQkJCQkqcEJ1ZlB0ciA9IENhbGN1bGF0ZUxpbmtTdGF0dXMocEFDLCBJb0MsIE5ldEluZGV4KTsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9GTE9XQ1RSTF9DQVA6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgdmlydHVhbCBwb3J0ICovCisJCQkJCQlWaXJ0dWFsQ29uZihwQUMsIElvQywgSWQsIHBCdWZQdHIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0cyAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisJCisJCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QRmxvd0N0cmxDYXA7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisJCQkJCisJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW05ldEluZGV4XS5QRmxvd0N0cmxDYXA7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfRkxPV0NUUkxfTU9ERToKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciB2aXJ0dWFsIHBvcnQgKi8KKwkJCQkJCVZpcnR1YWxDb25mKHBBQywgSW9DLCBJZCwgcEJ1ZlB0cik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnQgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCQorCQkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUEZsb3dDdHJsTW9kZTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKworCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtOZXRJbmRleF0uUEZsb3dDdHJsTW9kZTsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9GTE9XQ1RSTF9TVEFUVVM6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgdmlydHVhbCBwb3J0ICovCisJCQkJCQlWaXJ0dWFsQ29uZihwQUMsIElvQywgSWQsIHBCdWZQdHIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0ICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKwkKKwkJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBGbG93Q3RybFN0YXR1czsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKworCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtOZXRJbmRleF0uUEZsb3dDdHJsU3RhdHVzOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fQ0FQOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHZpcnR1YWwgcG9ydCAqLworCQkJCQkJVmlydHVhbENvbmYocEFDLCBJb0MsIElkLCBwQnVmUHRyKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydHMgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCQorCQkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUE1TQ2FwOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCQkJCQorCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtOZXRJbmRleF0uUE1TQ2FwOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fTU9ERToKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciB2aXJ0dWFsIHBvcnQgKi8KKwkJCQkJCVZpcnR1YWxDb25mKHBBQywgSW9DLCBJZCwgcEJ1ZlB0cik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnQgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCisJCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QTVNNb2RlOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCQkJCQorCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtOZXRJbmRleF0uUE1TTW9kZTsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX1NUQVRVUzoKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciB2aXJ0dWFsIHBvcnQgKi8KKwkJCQkJCVZpcnR1YWxDb25mKHBBQywgSW9DLCBJZCwgcEJ1ZlB0cik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnQgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCQorCQkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUE1TU3RhdHVzOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQorCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtOZXRJbmRleF0uUE1TU3RhdHVzOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX1NQRUVEX0NBUDoKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciB2aXJ0dWFsIHBvcnQgKi8KKwkJCQkJCVZpcnR1YWxDb25mKHBBQywgSW9DLCBJZCwgcEJ1ZlB0cik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnRzICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKwkKKwkJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBMaW5rU3BlZWRDYXA7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisJCQkJCisJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW05ldEluZGV4XS5QTGlua1NwZWVkQ2FwOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX1NQRUVEX01PREU6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgdmlydHVhbCBwb3J0ICovCisJCQkJCQlWaXJ0dWFsQ29uZihwQUMsIElvQywgSWQsIHBCdWZQdHIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0ICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKwkKKwkJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBMaW5rU3BlZWQ7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisKKwkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbTmV0SW5kZXhdLlBMaW5rU3BlZWQ7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfU1BFRURfU1RBVFVTOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHZpcnR1YWwgcG9ydCAqLworCQkJCQkJVmlydHVhbENvbmYocEFDLCBJb0MsIElkLCBwQnVmUHRyKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydCAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisJCisJCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QTGlua1NwZWVkVXNlZDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKworCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtOZXRJbmRleF0uUExpbmtTcGVlZFVzZWQ7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgT0lEX1NLR0VfTVRVOgorCQkJCVZhbDMyID0gU0tfRFJJVkVSX0dFVF9NVFUocEFDLCBJb0MsIE5ldEluZGV4KTsKKwkJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmUHRyLCBWYWwzMik7CisJCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VMzIpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0VSUiwKKwkJCQkJKCJNYWNQcml2YXRlQ29uZjogVW5rbm93biBPSUQgc2hvdWxkIGJlIGhhbmRsZWQgYmVmb3JlIikpOworCisJCQkJcEFDLT5Qbm1pLlNpcnFVcGRhdGVkRmxhZyAtLTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCQl9CisJCSpwTGVuID0gT2Zmc2V0OworCQlwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnIC0tOworCisJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCX0KKworCS8qCisJICogRnJvbSBoZXJlIFNFVCBvciBQUkVTRVQgYWN0aW9uLiBDaGVjayBpZiB0aGUgcGFzc2VkCisJICogYnVmZmVyIGxlbmd0aCBpcyBwbGF1c2libGUuCisJICovCisJc3dpdGNoIChJZCkgeworCisJY2FzZSBPSURfU0tHRV9MSU5LX01PREU6CisJY2FzZSBPSURfU0tHRV9GTE9XQ1RSTF9NT0RFOgorCWNhc2UgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9NT0RFOgorCWNhc2UgT0lEX1NLR0VfU1BFRURfTU9ERToKKwkJaWYgKCpwTGVuIDwgTGltaXQgLSBMb2dQb3J0SW5kZXgpIHsKKworCQkJKnBMZW4gPSBMaW1pdCAtIExvZ1BvcnRJbmRleDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlpZiAoKnBMZW4gIT0gTGltaXQgLSBMb2dQb3J0SW5kZXgpIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQl9CisJCWJyZWFrOworCisjaWZkZWYgU0tfUEhZX0xQX01PREUKKwljYXNlIE9JRF9TS0dFX1BIWV9MUF9NT0RFOgorCQlpZiAoKnBMZW4gPCBMaW1pdCAtIExvZ1BvcnRJbmRleCkgeworCisJCQkqcExlbiA9IExpbWl0IC0gTG9nUG9ydEluZGV4OworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIE9JRF9TS0dFX01UVToKKwkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1UzMikpIHsKKworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlpZiAoKnBMZW4gIT0gc2l6ZW9mKFNLX1UzMikpIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQl9CisJCWJyZWFrOworCisgICAgZGVmYXVsdDoKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1JFQURfT05MWSk7CisJfQorCisJLyoKKwkgKiBQZXJmb3JtIHByZXNldCBvciBzZXQKKwkgKi8KKwlPZmZzZXQgPSAwOworCWZvciAoOyBMb2dQb3J0SW5kZXggPCBMaW1pdDsgTG9nUG9ydEluZGV4ICsrKSB7CisKKwkJc3dpdGNoIChJZCkgeworCisJCWNhc2UgT0lEX1NLR0VfTElOS19NT0RFOgorCQkJLyogQ2hlY2sgdGhlIHZhbHVlIHJhbmdlICovCisJCQlWYWw4ID0gKihwQnVmICsgT2Zmc2V0KTsKKwkJCWlmIChWYWw4ID09IDApIHsKKworCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoVmFsOCA8IFNLX0xNT0RFX0hBTEYgfHwKKwkJCQkoTG9nUG9ydEluZGV4ICE9IDAgJiYgVmFsOCA+IFNLX0xNT0RFX0FVVE9TRU5TRSkgfHwKKwkJCQkoTG9nUG9ydEluZGV4ID09IDAgJiYgVmFsOCA+IFNLX0xNT0RFX0lOREVURVJNSU5BVEVEKSkgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCX0KKworCQkJLyogVGhlIHByZXNldCBlbmRzIGhlcmUgKi8KKwkJCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCQkJfQorCisJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKworCQkJCS8qCisJCQkJICogVGhlIHZpcnR1YWwgcG9ydCBjb25zaXN0cyBvZiBhbGwgY3VycmVudGx5CisJCQkJICogYWN0aXZlIHBvcnRzLiBGaW5kIHRoZW0gYW5kIHNlbmQgYW4gZXZlbnQKKwkJCQkgKiB3aXRoIHRoZSBuZXcgbGluayBtb2RlIHRvIFNJUlEuCisJCQkJICovCisJCQkJZm9yIChQaHlzUG9ydEluZGV4ID0gMDsKKwkJCQkJUGh5c1BvcnRJbmRleCA8IFBoeXNQb3J0TWF4OworCQkJCQlQaHlzUG9ydEluZGV4ICsrKSB7CisKKwkJCQkJaWYgKCFwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS4KKwkJCQkJCUFjdGl2ZUZsYWcpIHsKKworCQkJCQkJY29udGludWU7CisJCQkJCX0KKworCQkJCQlFdmVudFBhcmFtLlBhcmEzMlswXSA9IFBoeXNQb3J0SW5kZXg7CisJCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzFdID0gKFNLX1UzMilWYWw4OworCQkJCQlpZiAoU2tHZVNpcnFFdmVudChwQUMsIElvQywKKwkJCQkJCVNLX0hXRVZfU0VUX0xNT0RFLAorCQkJCQkJRXZlbnRQYXJhbSkgPiAwKSB7CisKKwkJCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywKKwkJCQkJCQlTS19QTk1JX0VSUjA0MywKKwkJCQkJCQlTS19QTk1JX0VSUjA0M01TRyk7CisKKwkJCQkJCSpwTGVuID0gMDsKKwkJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKgorCQkJCSAqIFNlbmQgYW4gZXZlbnQgd2l0aCB0aGUgbmV3IGxpbmsgbW9kZSB0bworCQkJCSAqIHRoZSBTSVJRIG1vZHVsZS4KKwkJCQkgKi8KKwkJCQlFdmVudFBhcmFtLlBhcmEzMlswXSA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzFdID0gKFNLX1UzMilWYWw4OworCQkJCWlmIChTa0dlU2lycUV2ZW50KHBBQywgSW9DLCBTS19IV0VWX1NFVF9MTU9ERSwKKwkJCQkJRXZlbnRQYXJhbSkgPiAwKSB7CisKKwkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLAorCQkJCQkJU0tfUE5NSV9FUlIwNDMsCisJCQkJCQlTS19QTk1JX0VSUjA0M01TRyk7CisKKwkJCQkJKnBMZW4gPSAwOworCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJCX0KKwkJCX0KKwkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0ZMT1dDVFJMX01PREU6CisJCQkvKiBDaGVjayB0aGUgdmFsdWUgcmFuZ2UgKi8KKwkJCVZhbDggPSAqKHBCdWYgKyBPZmZzZXQpOworCQkJaWYgKFZhbDggPT0gMCkgeworCisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChWYWw4IDwgU0tfRkxPV19NT0RFX05PTkUgfHwKKwkJCQkoTG9nUG9ydEluZGV4ICE9IDAgJiYgVmFsOCA+IFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNKSB8fAorCQkJCShMb2dQb3J0SW5kZXggPT0gMCAmJiBWYWw4ID4gU0tfRkxPV19NT0RFX0lOREVURVJNSU5BVEVEKSkgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCX0KKworCQkJLyogVGhlIHByZXNldCBlbmRzIGhlcmUgKi8KKwkJCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCQkJfQorCisJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKworCQkJCS8qCisJCQkJICogVGhlIHZpcnR1YWwgcG9ydCBjb25zaXN0cyBvZiBhbGwgY3VycmVudGx5CisJCQkJICogYWN0aXZlIHBvcnRzLiBGaW5kIHRoZW0gYW5kIHNlbmQgYW4gZXZlbnQKKwkJCQkgKiB3aXRoIHRoZSBuZXcgZmxvdyBjb250cm9sIG1vZGUgdG8gU0lSUS4KKwkJCQkgKi8KKwkJCQlmb3IgKFBoeXNQb3J0SW5kZXggPSAwOworCQkJCQlQaHlzUG9ydEluZGV4IDwgUGh5c1BvcnRNYXg7CisJCQkJCVBoeXNQb3J0SW5kZXggKyspIHsKKworCQkJCQlpZiAoIXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLgorCQkJCQkJQWN0aXZlRmxhZykgeworCisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzBdID0gUGh5c1BvcnRJbmRleDsKKwkJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMV0gPSAoU0tfVTMyKVZhbDg7CisJCQkJCWlmIChTa0dlU2lycUV2ZW50KHBBQywgSW9DLAorCQkJCQkJU0tfSFdFVl9TRVRfRkxPV01PREUsCisJCQkJCQlFdmVudFBhcmFtKSA+IDApIHsKKworCQkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLAorCQkJCQkJCVNLX1BOTUlfRVJSMDQ0LAorCQkJCQkJCVNLX1BOTUlfRVJSMDQ0TVNHKTsKKworCQkJCQkJKnBMZW4gPSAwOworCQkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogU2VuZCBhbiBldmVudCB3aXRoIHRoZSBuZXcgZmxvdyBjb250cm9sCisJCQkJICogbW9kZSB0byB0aGUgU0lSUSBtb2R1bGUuCisJCQkJICovCisJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMF0gPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKwkJCQlFdmVudFBhcmFtLlBhcmEzMlsxXSA9IChTS19VMzIpVmFsODsKKwkJCQlpZiAoU2tHZVNpcnFFdmVudChwQUMsIElvQywKKwkJCQkJU0tfSFdFVl9TRVRfRkxPV01PREUsIEV2ZW50UGFyYW0pCisJCQkJCT4gMCkgeworCisJCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywKKwkJCQkJCVNLX1BOTUlfRVJSMDQ0LAorCQkJCQkJU0tfUE5NSV9FUlIwNDRNU0cpOworCisJCQkJCSpwTGVuID0gMDsKKwkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCQl9CisJCQl9CisJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX01PREUgOgorCQkJLyogQ2hlY2sgdGhlIHZhbHVlIHJhbmdlICovCisJCQlWYWw4ID0gKihwQnVmICsgT2Zmc2V0KTsKKwkJCWlmIChWYWw4ID09IDApIHsKKwkJCQkvKiBtb2RlIG9mIHRoaXMgcG9ydCByZW1haW5zIHVuY2hhbmdlZCAqLworCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoVmFsOCA8IFNLX01TX01PREVfQVVUTyB8fAorCQkJCShMb2dQb3J0SW5kZXggIT0gMCAmJiBWYWw4ID4gU0tfTVNfTU9ERV9TTEFWRSkgfHwKKwkJCQkoTG9nUG9ydEluZGV4ID09IDAgJiYgVmFsOCA+IFNLX01TX01PREVfSU5ERVRFUk1JTkFURUQpKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJfQorCisJCQkvKiBUaGUgcHJlc2V0IGVuZHMgaGVyZSAqLworCQkJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJCQl9CisKKwkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCisJCQkJLyoKKwkJCQkgKiBUaGUgdmlydHVhbCBwb3J0IGNvbnNpc3RzIG9mIGFsbCBjdXJyZW50bHkKKwkJCQkgKiBhY3RpdmUgcG9ydHMuIEZpbmQgdGhlbSBhbmQgc2VuZCBhbiBldmVudAorCQkJCSAqIHdpdGggbmV3IG1hc3Rlci9zbGF2ZSAocm9sZSkgbW9kZSB0byBTSVJRLgorCQkJCSAqLworCQkJCWZvciAoUGh5c1BvcnRJbmRleCA9IDA7CisJCQkJCVBoeXNQb3J0SW5kZXggPCBQaHlzUG9ydE1heDsKKwkJCQkJUGh5c1BvcnRJbmRleCArKykgeworCisJCQkJCWlmICghcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uCisJCQkJCQlBY3RpdmVGbGFnKSB7CisKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMF0gPSBQaHlzUG9ydEluZGV4OworCQkJCQlFdmVudFBhcmFtLlBhcmEzMlsxXSA9IChTS19VMzIpVmFsODsKKwkJCQkJaWYgKFNrR2VTaXJxRXZlbnQocEFDLCBJb0MsCisJCQkJCQlTS19IV0VWX1NFVF9ST0xFLAorCQkJCQkJRXZlbnRQYXJhbSkgPiAwKSB7CisKKwkJCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywKKwkJCQkJCQlTS19QTk1JX0VSUjA0MiwKKwkJCQkJCQlTS19QTk1JX0VSUjA0Mk1TRyk7CisKKwkJCQkJCSpwTGVuID0gMDsKKwkJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKgorCQkJCSAqIFNlbmQgYW4gZXZlbnQgd2l0aCB0aGUgbmV3IG1hc3Rlci9zbGF2ZQorCQkJCSAqIChyb2xlKSBtb2RlIHRvIHRoZSBTSVJRIG1vZHVsZS4KKwkJCQkgKi8KKwkJCQlFdmVudFBhcmFtLlBhcmEzMlswXSA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzFdID0gKFNLX1UzMilWYWw4OworCQkJCWlmIChTa0dlU2lycUV2ZW50KHBBQywgSW9DLAorCQkJCQlTS19IV0VWX1NFVF9ST0xFLCBFdmVudFBhcmFtKSA+IDApIHsKKworCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csCisJCQkJCQlTS19QTk1JX0VSUjA0MiwKKwkJCQkJCVNLX1BOTUlfRVJSMDQyTVNHKTsKKworCQkJCQkqcExlbiA9IDA7CisJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQkJfQorCQkJfQorCisJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TUEVFRF9NT0RFOgorCQkJLyogQ2hlY2sgdGhlIHZhbHVlIHJhbmdlICovCisJCQlWYWw4ID0gKihwQnVmICsgT2Zmc2V0KTsKKwkJCWlmIChWYWw4ID09IDApIHsKKworCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoVmFsOCA8IChTS19MU1BFRURfQVVUTykgfHwKKwkJCQkoTG9nUG9ydEluZGV4ICE9IDAgJiYgVmFsOCA+IChTS19MU1BFRURfMTAwME1CUFMpKSB8fAorCQkJCShMb2dQb3J0SW5kZXggPT0gMCAmJiBWYWw4ID4gKFNLX0xTUEVFRF9JTkRFVEVSTUlOQVRFRCkpKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJfQorCisJCQkvKiBUaGUgcHJlc2V0IGVuZHMgaGVyZSAqLworCQkJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJCQl9CisKKwkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCisJCQkJLyoKKwkJCQkgKiBUaGUgdmlydHVhbCBwb3J0IGNvbnNpc3RzIG9mIGFsbCBjdXJyZW50bHkKKwkJCQkgKiBhY3RpdmUgcG9ydHMuIEZpbmQgdGhlbSBhbmQgc2VuZCBhbiBldmVudAorCQkJCSAqIHdpdGggdGhlIG5ldyBmbG93IGNvbnRyb2wgbW9kZSB0byBTSVJRLgorCQkJCSAqLworCQkJCWZvciAoUGh5c1BvcnRJbmRleCA9IDA7CisJCQkJCVBoeXNQb3J0SW5kZXggPCBQaHlzUG9ydE1heDsKKwkJCQkJUGh5c1BvcnRJbmRleCArKykgeworCisJCQkJCWlmICghcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uQWN0aXZlRmxhZykgeworCisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzBdID0gUGh5c1BvcnRJbmRleDsKKwkJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMV0gPSAoU0tfVTMyKVZhbDg7CisJCQkJCWlmIChTa0dlU2lycUV2ZW50KHBBQywgSW9DLAorCQkJCQkJU0tfSFdFVl9TRVRfU1BFRUQsCisJCQkJCQlFdmVudFBhcmFtKSA+IDApIHsKKworCQkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLAorCQkJCQkJCVNLX1BOTUlfRVJSMDQ1LAorCQkJCQkJCVNLX1BOTUlfRVJSMDQ1TVNHKTsKKworCQkJCQkJKnBMZW4gPSAwOworCQkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogU2VuZCBhbiBldmVudCB3aXRoIHRoZSBuZXcgZmxvdyBjb250cm9sCisJCQkJICogbW9kZSB0byB0aGUgU0lSUSBtb2R1bGUuCisJCQkJICovCisJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMF0gPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKwkJCQlFdmVudFBhcmFtLlBhcmEzMlsxXSA9IChTS19VMzIpVmFsODsKKwkJCQlpZiAoU2tHZVNpcnFFdmVudChwQUMsIElvQywKKwkJCQkJU0tfSFdFVl9TRVRfU1BFRUQsCisJCQkJCUV2ZW50UGFyYW0pID4gMCkgeworCisJCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywKKwkJCQkJCVNLX1BOTUlfRVJSMDQ1LAorCQkJCQkJU0tfUE5NSV9FUlIwNDVNU0cpOworCisJCQkJCSpwTGVuID0gMDsKKwkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCQl9CisJCQl9CisJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9NVFUgOgorCQkJLyogQ2hlY2sgdGhlIHZhbHVlIHJhbmdlICovCisJCQlWYWwzMiA9ICooU0tfVTMyKikocEJ1ZiArIE9mZnNldCk7CisJCQlpZiAoVmFsMzIgPT0gMCkgeworCQkJCS8qIG10dSBvZiB0aGlzIHBvcnQgcmVtYWlucyB1bmNoYW5nZWQgKi8KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1UzMik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoU0tfRFJJVkVSX1BSRVNFVF9NVFUocEFDLCBJb0MsIE5ldEluZGV4LCBWYWwzMikgIT0gMCkgeworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQl9CisKKwkJCS8qIFRoZSBwcmVzZXQgZW5kcyBoZXJlICovCisJCQlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJCQl9CisKKwkJCWlmIChTS19EUklWRVJfU0VUX01UVShwQUMsIElvQywgTmV0SW5kZXgsIFZhbDMyKSAhPSAwKSB7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VMzIpOworCQkJYnJlYWs7CisJCQorI2lmZGVmIFNLX1BIWV9MUF9NT0RFCisJCWNhc2UgT0lEX1NLR0VfUEhZX0xQX01PREU6CisJCQkvKiBUaGUgcHJlc2V0IGVuZHMgaGVyZSAqLworCQkJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJCQl9CisKKwkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJT2Zmc2V0ID0gMDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQkvKiBTZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnRzICovCisJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMocEFDLCBMb2dQb3J0SW5kZXgpOworCisJCQkJCXN3aXRjaCAoKihwQnVmICsgT2Zmc2V0KSkgeworCQkJCQkJY2FzZSAwOgorCQkJCQkJCS8qIElmIExvd1Bvd2VyTW9kZSBpcyBhY3RpdmUsIHdlIGNhbiBsZWF2ZSBpdC4gKi8KKwkJCQkJCQlpZiAocEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBQaHlQb3dlclN0YXRlKSB7CisKKwkJCQkJCQkJVmFsMzIgPSBTa0dtTGVhdmVMb3dQb3dlck1vZGUocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgpOworCQkJCQkJCQkKKwkJCQkJCQkJaWYgKHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QUGh5UG93ZXJTdGF0ZSA8IDMpCXsKKwkJCQkJCQkJCQorCQkJCQkJCQkJU2tEcnZJbml0QWRhcHRlcihwQUMpOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJKnBMZW4gPSAwOworCQkJCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJCQkJCX0KKwkJCQkJCWNhc2UgMToKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCWNhc2UgMzoKKwkJCQkJCWNhc2UgNDoKKwkJCQkJCQkvKiBJZiBubyBMb3dQb3dlck1vZGUgaXMgYWN0aXZlLCB3ZSBjYW4gZW50ZXIgaXQuICovCisJCQkJCQkJaWYgKCFwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUFBoeVBvd2VyU3RhdGUpIHsKKworCQkJCQkJCQlpZiAoKCoocEJ1ZiArIE9mZnNldCkpIDwgMykJeworCQkJCQkJCQkKKwkJCQkJCQkJCVNrRHJ2RGVJbml0QWRhcHRlcihwQUMpOworCQkJCQkJCQl9CisKKwkJCQkJCQkJVmFsMzIgPSBTa0dtRW50ZXJMb3dQb3dlck1vZGUocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsICpwQnVmKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgeworCQkJCQkJCQkqcExlbiA9IDA7CisJCQkJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQkJCQkJfQorCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkqcExlbiA9IDA7CisJCQkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisJCQkJCisJCQkJc3dpdGNoICgqKHBCdWYgKyBPZmZzZXQpKSB7CisJCQkJCWNhc2UgMDoKKwkJCQkJCS8qIElmIHdlIGFyZSBpbiBhIExvd1Bvd2VyTW9kZSwgd2UgY2FuIGxlYXZlIGl0LiAqLworCQkJCQkJaWYgKHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QUGh5UG93ZXJTdGF0ZSkgeworCisJCQkJCQkJVmFsMzIgPSBTa0dtTGVhdmVMb3dQb3dlck1vZGUocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgpOworCQkJCQkJCQorCQkJCQkJCWlmIChwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUFBoeVBvd2VyU3RhdGUgPCAzKQl7CisKKwkJCQkJCQkJU2tEcnZJbml0QWRhcHRlcihwQUMpOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgeworCQkJCQkJCSpwTGVuID0gMDsKKwkJCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJCQkJfQorCQkJCQkKKwkJCQkJY2FzZSAxOgorCQkJCQljYXNlIDI6CisJCQkJCWNhc2UgMzoKKwkJCQkJY2FzZSA0OgorCQkJCQkJLyogSWYgd2UgYXJlIG5vdCBhbHJlYWR5IGluIExvd1Bvd2VyTW9kZSwgd2UgY2FuIGVudGVyIGl0LiAqLworCQkJCQkJaWYgKCFwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUFBoeVBvd2VyU3RhdGUpIHsKKworCQkJCQkJCWlmICgoKihwQnVmICsgT2Zmc2V0KSkgPCAzKQl7CisKKwkJCQkJCQkJU2tEcnZEZUluaXRBZGFwdGVyKHBBQyk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgeworCisJCQkJCQkJCVZhbDMyID0gU2tHbUVudGVyTG93UG93ZXJNb2RlKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LCAqcEJ1Zik7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZWxzZSB7CisJCQkJCQkJKnBMZW4gPSAwOworCQkJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQkJCQl9CisJCQkJCQorCQkJCQlkZWZhdWx0OgorCQkJCQkJKnBMZW4gPSAwOworCQkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJCX0KKwkJCX0KKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTgpOworCQkJYnJlYWs7CisjZW5kaWYKKworCQlkZWZhdWx0OgorICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfRVJSLAorICAgICAgICAgICAgICAgICgiTWFjUHJpdmF0ZUNvbmY6IFVua25vd24gT0lEIHNob3VsZCBiZSBoYW5kbGVkIGJlZm9yZSBzZXQiKSk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKwl9CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9uaXRvciAtIE9JRCBoYW5kbGVyIGZ1bmN0aW9uIGZvciBSTE1UX01PTklUT1JfWFhYCisgKgorICogRGVzY3JpcHRpb246CisgKglCZWNhdXNlIFJMTVQgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgdGhlIG1vbml0b3Jpbmcgb2YKKyAqCXJlbW90ZSBhZGFwdGVyIGNhcmRzLCB3ZSByZXR1cm4gYWx3YXlzIGFuIGVtcHR5IHRhYmxlLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9CQURfVkFMVUUgICAgVGhlIHBhc3NlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIHZhbGlkCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgcmFuZ2UuCisgKglTS19QTk1JX0VSUl9SRUFEX09OTFkgICAgVGhlIE9JRCBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzZXQuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitQTk1JX1NUQVRJQyBpbnQgTW9uaXRvcigKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBwQnVmIGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCXVuc2lnbmVkIGludAlJbmRleDsKKwl1bnNpZ25lZCBpbnQJTGltaXQ7CisJdW5zaWduZWQgaW50CU9mZnNldDsKKwl1bnNpZ25lZCBpbnQJRW50cmllczsKKworCQorCS8qCisJICogQ2FsY3VsYXRlIGluc3RhbmNlIGlmIHdpc2hlZC4KKwkgKi8KKwkvKiBYWFggTm90IHlldCBpbXBsZW1lbnRlZC4gUmV0dXJuIGFsd2F5cyBhbiBlbXB0eSB0YWJsZS4gKi8KKwlFbnRyaWVzID0gMDsKKworCWlmICgoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpKSkgeworCisJCWlmICgoSW5zdGFuY2UgPCAxKSB8fCAoSW5zdGFuY2UgPiBFbnRyaWVzKSkgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJCX0KKworCQlJbmRleCA9ICh1bnNpZ25lZCBpbnQpSW5zdGFuY2UgLSAxOworCQlMaW1pdCA9ICh1bnNpZ25lZCBpbnQpSW5zdGFuY2U7CisJfQorCWVsc2UgeworCQlJbmRleCA9IDA7CisJCUxpbWl0ID0gRW50cmllczsKKwl9CisKKwkvKgorCSAqIEdldC9TZXQgdmFsdWUKKwkqLworCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9HRVQpIHsKKworCQlmb3IgKE9mZnNldD0wOyBJbmRleCA8IExpbWl0OyBJbmRleCArKykgeworCisJCQlzd2l0Y2ggKElkKSB7CisKKwkJCWNhc2UgT0lEX1NLR0VfUkxNVF9NT05JVE9SX0lOREVYOgorCQkJY2FzZSBPSURfU0tHRV9STE1UX01PTklUT1JfQUREUjoKKwkJCWNhc2UgT0lEX1NLR0VfUkxNVF9NT05JVE9SX0VSUlM6CisJCQljYXNlIE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9USU1FU1RBTVA6CisJCQljYXNlIE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9BRE1JTjoKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDQ2LAorCQkJCQlTS19QTk1JX0VSUjA0Nk1TRyk7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKwkJfQorCQkqcExlbiA9IE9mZnNldDsKKwl9CisJZWxzZSB7CisJCS8qIE9ubHkgTU9OSVRPUl9BRE1JTiBjYW4gYmUgc2V0ICovCisJCWlmIChJZCAhPSBPSURfU0tHRV9STE1UX01PTklUT1JfQURNSU4pIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9SRUFEX09OTFkpOworCQl9CisKKwkJLyogQ2hlY2sgaWYgdGhlIGxlbmd0aCBpcyBwbGF1c2libGUgKi8KKwkJaWYgKCpwTGVuIDwgKExpbWl0IC0gSW5kZXgpKSB7CisKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQkvKiBPa2F5LCB3ZSBoYXZlIGEgd2lkZSB2YWx1ZSByYW5nZSAqLworCQlpZiAoKnBMZW4gIT0gKExpbWl0IC0gSW5kZXgpKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJfQorLyoKKwkJZm9yIChPZmZzZXQ9MDsgSW5kZXggPCBMaW1pdDsgSW5kZXggKyspIHsKKwkJfQorKi8KKy8qCisgKiBYWFggTm90IHlldCBpbXBsZW1lbnRlZC4gUmV0dXJuIGFsd2F5cyBCQURfVkFMVUUsIGJlY2F1c2UgdGhlIHRhYmxlCisgKiBpcyBlbXB0eS4KKyAqLworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwl9CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVmlydHVhbENvbmYgLSBDYWxjdWxhdGVzIHRoZSB2YWx1ZXMgb2YgY29uZmlndXJhdGlvbiBPSURzIGZvciB2aXJ0dWFsIHBvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVdlIGhhbmRsZSBoZXJlIHRoZSBnZXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZ3JvdXAgT0lEcywgd2hpY2ggYXJlCisgKglhIGxpdHRsZSBiaXQgY29tcGxpY2F0ZWQuIFRoZSB2aXJ0dWFsIHBvcnQgY29uc2lzdHMgb2YgYWxsIGN1cnJlbnRseQorICoJYWN0aXZlIHBoeXNpY2FsIHBvcnRzLiBJZiBtdWx0aXBsZSBwb3J0cyBhcmUgYWN0aXZlIGFuZCBjb25maWd1cmVkCisgKglkaWZmZXJlbnRseSB3ZSBnZXQgaW4gc29tZSB0cm91YmxlIHRvIHJldHVybiBhIHNpbmdsZSB2YWx1ZS4gU28gd2UKKyAqCWdldCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGFjdGl2ZSBwb3J0IGFuZCBjb21wYXJlIGl0IHdpdGggdGhhdCBvZgorICoJdGhlIG90aGVyIGFjdGl2ZSBwb3J0cy4gSWYgdGhleSBhcmUgbm90IHRoZSBzYW1lLCB3ZSByZXR1cm4gYSB2YWx1ZQorICoJdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhdGUgaXMgaW5kZXRlcm1pbmF0ZWQuCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUE5NSV9TVEFUSUMgdm9pZCBWaXJ0dWFsQ29uZigKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYpCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLworeworCXVuc2lnbmVkIGludAlQaHlzUG9ydE1heDsKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRJbmRleDsKKwlTS19VOAkJVmFsODsKKwlTS19VMzIJCVZhbDMyOworCVNLX0JPT0wJCVBvcnRBY3RpdmVGbGFnOworCVNLX0dFUE9SVAkqcFBydDsKKworCSpwQnVmID0gMDsKKwlQb3J0QWN0aXZlRmxhZyA9IFNLX0ZBTFNFOworCVBoeXNQb3J0TWF4ID0gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCQorCWZvciAoUGh5c1BvcnRJbmRleCA9IDA7IFBoeXNQb3J0SW5kZXggPCBQaHlzUG9ydE1heDsKKwkJUGh5c1BvcnRJbmRleCArKykgeworCisJCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdOworCisJCS8qIENoZWNrIGlmIHRoZSBwaHlzaWNhbCBwb3J0IGlzIGFjdGl2ZSAqLworCQlpZiAoIXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLkFjdGl2ZUZsYWcpIHsKKworCQkJY29udGludWU7CisJCX0KKworCQlQb3J0QWN0aXZlRmxhZyA9IFNLX1RSVUU7CisKKwkJc3dpdGNoIChJZCkgeworCisJCWNhc2UgT0lEX1NLR0VfUEhZX1RZUEU6CisJCQkvKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgYWN0aXZlIHBvcnQgKi8KKwkJCWlmICgqcEJ1ZiA9PSAwKSB7CisJCQkJVmFsMzIgPSBwUHJ0LT5QaHlUeXBlOworCQkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQljYXNlIE9JRF9TS0dFX0xJTktfQ0FQOgorCisJCQkvKgorCQkJICogRGlmZmVyZW50IGNhcGFiaWxpdGllcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0CisJCQkgKiBpbiB0aGUgY2FzZSBvZiB0aGUgY2FzZXMgT1IgdGhlbSBhbGwgdG9nZXRoZXIuCisJCQkgKiBGcm9tIGEgY3VyaW91cyBwb2ludCBvZiB2aWV3IHRoZSB2aXJ0dWFsIHBvcnQKKwkJCSAqIGlzIGNhcGFibGUgb2YgYWxsIGZvdW5kIGNhcGFiaWxpdGllcy4KKwkJCSAqLworCQkJKnBCdWYgfD0gcFBydC0+UExpbmtDYXA7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0xJTktfTU9ERToKKwkJCS8qIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBhY3RpdmUgcG9ydCAqLworCQkJaWYgKCpwQnVmID09IDApIHsKKworCQkJCSpwQnVmID0gcFBydC0+UExpbmtNb2RlQ29uZjsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHdlIGZpbmQgYW4gYWN0aXZlIHBvcnQgd2l0aCBhIGRpZmZlcmVudCBsaW5rCisJCQkgKiBtb2RlIHRoYW4gdGhlIGZpcnN0IG9uZSB3ZSByZXR1cm4gYSB2YWx1ZSB0aGF0CisJCQkgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgbGluayBtb2RlIGlzIGluZGV0ZXJtaW5hdGVkLgorCQkJICovCisJCQlpZiAoKnBCdWYgIT0gcFBydC0+UExpbmtNb2RlQ29uZikgeworCisJCQkJKnBCdWYgPSBTS19MTU9ERV9JTkRFVEVSTUlOQVRFRDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfTElOS19NT0RFX1NUQVRVUzoKKwkJCS8qIEdldCB0aGUgbGluayBtb2RlIG9mIHRoZSBwaHlzaWNhbCBwb3J0ICovCisJCQlWYWw4ID0gQ2FsY3VsYXRlTGlua01vZGVTdGF0dXMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgpOworCisJCQkvKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgYWN0aXZlIHBvcnQgKi8KKwkJCWlmICgqcEJ1ZiA9PSAwKSB7CisKKwkJCQkqcEJ1ZiA9IFZhbDg7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBmaW5kIGFuIGFjdGl2ZSBwb3J0IHdpdGggYSBkaWZmZXJlbnQgbGluaworCQkJICogbW9kZSBzdGF0dXMgdGhhbiB0aGUgZmlyc3Qgb25lIHdlIHJldHVybiBhIHZhbHVlCisJCQkgKiB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBsaW5rIG1vZGUgc3RhdHVzIGlzCisJCQkgKiBpbmRldGVybWluYXRlZC4KKwkJCSAqLworCQkJaWYgKCpwQnVmICE9IFZhbDgpIHsKKworCQkJCSpwQnVmID0gU0tfTE1PREVfU1RBVF9JTkRFVEVSTUlOQVRFRDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfTElOS19TVEFUVVM6CisJCQkvKiBHZXQgdGhlIGxpbmsgc3RhdHVzIG9mIHRoZSBwaHlzaWNhbCBwb3J0ICovCisJCQlWYWw4ID0gQ2FsY3VsYXRlTGlua1N0YXR1cyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCk7CisKKwkJCS8qIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBhY3RpdmUgcG9ydCAqLworCQkJaWYgKCpwQnVmID09IDApIHsKKworCQkJCSpwQnVmID0gVmFsODsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHdlIGZpbmQgYW4gYWN0aXZlIHBvcnQgd2l0aCBhIGRpZmZlcmVudCBsaW5rCisJCQkgKiBzdGF0dXMgdGhhbiB0aGUgZmlyc3Qgb25lLCB3ZSByZXR1cm4gYSB2YWx1ZQorCQkJICogdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgbGluayBzdGF0dXMgaXMKKwkJCSAqIGluZGV0ZXJtaW5hdGVkLgorCQkJICovCisJCQlpZiAoKnBCdWYgIT0gVmFsOCkgeworCisJCQkJKnBCdWYgPSBTS19QTk1JX1JMTVRfTFNUQVRfSU5ERVRFUk1JTkFURUQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0ZMT1dDVFJMX0NBUDoKKwkJCS8qIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBhY3RpdmUgcG9ydCAqLworCQkJaWYgKCpwQnVmID09IDApIHsKKworCQkJCSpwQnVmID0gcFBydC0+UEZsb3dDdHJsQ2FwOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogRnJvbSBhIGN1cmlvdXMgcG9pbnQgb2YgdmlldyB0aGUgdmlydHVhbCBwb3J0CisJCQkgKiBpcyBjYXBhYmxlIG9mIGFsbCBmb3VuZCBjYXBhYmlsaXRpZXMuCisJCQkgKi8KKwkJCSpwQnVmIHw9IHBQcnQtPlBGbG93Q3RybENhcDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfRkxPV0NUUkxfTU9ERToKKwkJCS8qIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBhY3RpdmUgcG9ydCAqLworCQkJaWYgKCpwQnVmID09IDApIHsKKworCQkJCSpwQnVmID0gcFBydC0+UEZsb3dDdHJsTW9kZTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHdlIGZpbmQgYW4gYWN0aXZlIHBvcnQgd2l0aCBhIGRpZmZlcmVudCBmbG93CisJCQkgKiBjb250cm9sIG1vZGUgdGhhbiB0aGUgZmlyc3Qgb25lLCB3ZSByZXR1cm4gYSB2YWx1ZQorCQkJICogdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgbW9kZSBpcyBpbmRldGVybWluYXRlZC4KKwkJCSAqLworCQkJaWYgKCpwQnVmICE9IHBQcnQtPlBGbG93Q3RybE1vZGUpIHsKKworCQkJCSpwQnVmID0gU0tfRkxPV19NT0RFX0lOREVURVJNSU5BVEVEOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9GTE9XQ1RSTF9TVEFUVVM6CisJCQkvKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgYWN0aXZlIHBvcnQgKi8KKwkJCWlmICgqcEJ1ZiA9PSAwKSB7CisKKwkJCQkqcEJ1ZiA9IHBQcnQtPlBGbG93Q3RybFN0YXR1czsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHdlIGZpbmQgYW4gYWN0aXZlIHBvcnQgd2l0aCBhIGRpZmZlcmVudCBmbG93CisJCQkgKiBjb250cm9sIHN0YXR1cyB0aGFuIHRoZSBmaXJzdCBvbmUsIHdlIHJldHVybiBhCisJCQkgKiB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBzdGF0dXMgaXMKKwkJCSAqIGluZGV0ZXJtaW5hdGVkLgorCQkJICovCisJCQlpZiAoKnBCdWYgIT0gcFBydC0+UEZsb3dDdHJsU3RhdHVzKSB7CisKKwkJCQkqcEJ1ZiA9IFNLX0ZMT1dfU1RBVF9JTkRFVEVSTUlOQVRFRDsKKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJY2FzZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX0NBUDoKKwkJCS8qIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBhY3RpdmUgcG9ydCAqLworCQkJaWYgKCpwQnVmID09IDApIHsKKworCQkJCSpwQnVmID0gcFBydC0+UE1TQ2FwOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogRnJvbSBhIGN1cmlvdXMgcG9pbnQgb2YgdmlldyB0aGUgdmlydHVhbCBwb3J0CisJCQkgKiBpcyBjYXBhYmxlIG9mIGFsbCBmb3VuZCBjYXBhYmlsaXRpZXMuCisJCQkgKi8KKwkJCSpwQnVmIHw9IHBQcnQtPlBNU0NhcDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9NT0RFOgorCQkJLyogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGFjdGl2ZSBwb3J0ICovCisJCQlpZiAoKnBCdWYgPT0gMCkgeworCisJCQkJKnBCdWYgPSBwUHJ0LT5QTVNNb2RlOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogSWYgd2UgZmluZCBhbiBhY3RpdmUgcG9ydCB3aXRoIGEgZGlmZmVyZW50IG1hc3Rlci8KKwkJCSAqIHNsYXZlIG1vZGUgdGhhbiB0aGUgZmlyc3Qgb25lLCB3ZSByZXR1cm4gYSB2YWx1ZQorCQkJICogdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgbW9kZSBpcyBpbmRldGVybWluYXRlZC4KKwkJCSAqLworCQkJaWYgKCpwQnVmICE9IHBQcnQtPlBNU01vZGUpIHsKKworCQkJCSpwQnVmID0gU0tfTVNfTU9ERV9JTkRFVEVSTUlOQVRFRDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9TVEFUVVM6CisJCQkvKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgYWN0aXZlIHBvcnQgKi8KKwkJCWlmICgqcEJ1ZiA9PSAwKSB7CisKKwkJCQkqcEJ1ZiA9IHBQcnQtPlBNU1N0YXR1czsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHdlIGZpbmQgYW4gYWN0aXZlIHBvcnQgd2l0aCBhIGRpZmZlcmVudCBtYXN0ZXIvCisJCQkgKiBzbGF2ZSBzdGF0dXMgdGhhbiB0aGUgZmlyc3Qgb25lLCB3ZSByZXR1cm4gYQorCQkJICogdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhdHVzIGlzCisJCQkgKiBpbmRldGVybWluYXRlZC4KKwkJCSAqLworCQkJaWYgKCpwQnVmICE9IHBQcnQtPlBNU1N0YXR1cykgeworCisJCQkJKnBCdWYgPSBTS19NU19TVEFUX0lOREVURVJNSU5BVEVEOworCQkJfQorCQkJYnJlYWs7CisJCQorCQljYXNlIE9JRF9TS0dFX1NQRUVEX01PREU6CisJCQkvKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgYWN0aXZlIHBvcnQgKi8KKwkJCWlmICgqcEJ1ZiA9PSAwKSB7CisKKwkJCQkqcEJ1ZiA9IHBQcnQtPlBMaW5rU3BlZWQ7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBmaW5kIGFuIGFjdGl2ZSBwb3J0IHdpdGggYSBkaWZmZXJlbnQgZmxvdworCQkJICogY29udHJvbCBtb2RlIHRoYW4gdGhlIGZpcnN0IG9uZSwgd2UgcmV0dXJuIGEgdmFsdWUKKwkJCSAqIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIG1vZGUgaXMgaW5kZXRlcm1pbmF0ZWQuCisJCQkgKi8KKwkJCWlmICgqcEJ1ZiAhPSBwUHJ0LT5QTGlua1NwZWVkKSB7CisKKwkJCQkqcEJ1ZiA9IFNLX0xTUEVFRF9JTkRFVEVSTUlOQVRFRDsKKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJY2FzZSBPSURfU0tHRV9TUEVFRF9TVEFUVVM6CisJCQkvKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgYWN0aXZlIHBvcnQgKi8KKwkJCWlmICgqcEJ1ZiA9PSAwKSB7CisKKwkJCQkqcEJ1ZiA9IHBQcnQtPlBMaW5rU3BlZWRVc2VkOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogSWYgd2UgZmluZCBhbiBhY3RpdmUgcG9ydCB3aXRoIGEgZGlmZmVyZW50IGZsb3cKKwkJCSAqIGNvbnRyb2wgc3RhdHVzIHRoYW4gdGhlIGZpcnN0IG9uZSwgd2UgcmV0dXJuIGEKKwkJCSAqIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YXR1cyBpcworCQkJICogaW5kZXRlcm1pbmF0ZWQuCisJCQkgKi8KKwkJCWlmICgqcEJ1ZiAhPSBwUHJ0LT5QTGlua1NwZWVkVXNlZCkgeworCisJCQkJKnBCdWYgPSBTS19MU1BFRURfU1RBVF9JTkRFVEVSTUlOQVRFRDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBJZiBubyBwb3J0IGlzIGFjdGl2ZSByZXR1cm4gYW4gaW5kZXRlcm1pbmF0ZWQgYW5zd2VyCisJICovCisJaWYgKCFQb3J0QWN0aXZlRmxhZykgeworCisJCXN3aXRjaCAoSWQpIHsKKworCQljYXNlIE9JRF9TS0dFX0xJTktfQ0FQOgorCQkJKnBCdWYgPSBTS19MTU9ERV9DQVBfSU5ERVRFUk1JTkFURUQ7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0xJTktfTU9ERToKKwkJCSpwQnVmID0gU0tfTE1PREVfSU5ERVRFUk1JTkFURUQ7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0xJTktfTU9ERV9TVEFUVVM6CisJCQkqcEJ1ZiA9IFNLX0xNT0RFX1NUQVRfSU5ERVRFUk1JTkFURUQ7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0xJTktfU1RBVFVTOgorCQkJKnBCdWYgPSBTS19QTk1JX1JMTVRfTFNUQVRfSU5ERVRFUk1JTkFURUQ7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0ZMT1dDVFJMX0NBUDoKKwkJY2FzZSBPSURfU0tHRV9GTE9XQ1RSTF9NT0RFOgorCQkJKnBCdWYgPSBTS19GTE9XX01PREVfSU5ERVRFUk1JTkFURUQ7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0ZMT1dDVFJMX1NUQVRVUzoKKwkJCSpwQnVmID0gU0tfRkxPV19TVEFUX0lOREVURVJNSU5BVEVEOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX0NBUDoKKwkJCSpwQnVmID0gU0tfTVNfQ0FQX0lOREVURVJNSU5BVEVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX01PREU6CisJCQkqcEJ1ZiA9IFNLX01TX01PREVfSU5ERVRFUk1JTkFURUQ7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fU1RBVFVTOgorCQkJKnBCdWYgPSBTS19NU19TVEFUX0lOREVURVJNSU5BVEVEOworCQkJYnJlYWs7CisJCWNhc2UgT0lEX1NLR0VfU1BFRURfQ0FQOgorCQkJKnBCdWYgPSBTS19MU1BFRURfQ0FQX0lOREVURVJNSU5BVEVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TUEVFRF9NT0RFOgorCQkJKnBCdWYgPSBTS19MU1BFRURfSU5ERVRFUk1JTkFURUQ7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NQRUVEX1NUQVRVUzoKKwkJCSpwQnVmID0gU0tfTFNQRUVEX1NUQVRfSU5ERVRFUk1JTkFURUQ7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2FsY3VsYXRlTGlua1N0YXR1cyAtIERldGVybWlucyB0aGUgbGluayBzdGF0dXMgb2YgYSBwaHlzaWNhbCBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglEZXRlcm1pbnMgdGhlIGxpbmsgc3RhdHVzIHRoZSBmb2xsb3dpbmcgd2F5OgorICoJICBMU1RBVF9QSFlfRE9XTjogIExpbmsgaXMgZG93bgorICoJICBMU1RBVF9BVVRPTkVHOiAgIEF1dG8tbmVnb3RpYXRpb24gZmFpbGVkCisgKgkgIExTVEFUX0xPR19ET1dOOiAgTGluayBpcyB1cCBidXQgUkxNVCBkaWQgbm90IHlldCBwdXQgdGhlIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICBsb2dpY2FsbHkgdXAuCisgKgkgIExTVEFUX0xPR19VUDogICAgUkxNVCBtYXJrZWQgdGhlIHBvcnQgYXMgdXAKKyAqCisgKiBSZXR1cm5zOgorICoJTGluayBzdGF0dXMgb2YgcGh5c2ljYWwgcG9ydAorICovCitQTk1JX1NUQVRJQyBTS19VOCBDYWxjdWxhdGVMaW5rU3RhdHVzKAorU0tfQUMgKnBBQywJCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLwordW5zaWduZWQgaW50IFBoeXNQb3J0SW5kZXgpCS8qIFBoeXNpY2FsIHBvcnQgaW5kZXggKi8KK3sKKwlTS19VOAlSZXN1bHQ7CisKKwlpZiAoIXBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QSFdMaW5rVXApIHsKKworCQlSZXN1bHQgPSBTS19QTk1JX1JMTVRfTFNUQVRfUEhZX0RPV047CisJfQorCWVsc2UgaWYgKHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QQXV0b05lZ0ZhaWwgPiAwKSB7CisKKwkJUmVzdWx0ID0gU0tfUE5NSV9STE1UX0xTVEFUX0FVVE9ORUc7CisJCQkJfQorCWVsc2UgaWYgKCFwQUMtPlJsbXQuUG9ydFtQaHlzUG9ydEluZGV4XS5Qb3J0RG93bikgeworCisJCVJlc3VsdCA9IFNLX1BOTUlfUkxNVF9MU1RBVF9MT0dfVVA7CisJfQorCWVsc2UgeworCQlSZXN1bHQgPSBTS19QTk1JX1JMTVRfTFNUQVRfTE9HX0RPV047CisJfQorCisJcmV0dXJuIChSZXN1bHQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDYWxjdWxhdGVMaW5rTW9kZVN0YXR1cyAtIERldGVybWlucyB0aGUgbGluayBtb2RlIHN0YXR1cyBvZiBhIHBoeXMuIHBvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBDT01NT04gbW9kdWxlIG9ubHkgdGVsbHMgdXMgaWYgdGhlIG1vZGUgaXMgaGFsZiBvciBmdWxsIGR1cGxleC4KKyAqCUJ1dCBpbiB0aGUgZGVjYWRlIG9mIGF1dG8gc2Vuc2luZyBpdCBpcyB1c2VmdWxsIGZvciB0aGUgdXNlciB0bworICoJa25vdyBpZiB0aGUgbW9kZSB3YXMgbmVnb3RpYXRlZCBvciBmb3JjZWQuIFRoZXJlZm9yZSB3ZSBoYXZlIGEKKyAqCWxvb2sgdG8gdGhlIG1vZGUsIHdoaWNoIHdhcyBsYXN0IHVzZWQgYnkgdGhlIG5lZ290aWF0aW9uIHByb2Nlc3MuCisgKgorICogUmV0dXJuczoKKyAqCVRoZSBsaW5rIG1vZGUgc3RhdHVzCisgKi8KK1BOTUlfU1RBVElDIFNLX1U4IENhbGN1bGF0ZUxpbmtNb2RlU3RhdHVzKAorU0tfQUMgKnBBQywJCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLwordW5zaWduZWQgaW50IFBoeXNQb3J0SW5kZXgpCS8qIFBoeXNpY2FsIHBvcnQgaW5kZXggKi8KK3sKKwlTS19VOAlSZXN1bHQ7CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgbW9kZSwgd2hpY2ggY2FuIGJlIGZ1bGwgb3IgaGFsZiBkdXBsZXggKi8KKwlSZXN1bHQgPSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUExpbmtNb2RlU3RhdHVzOworCisJLyogQ2hlY2sgaWYgbm8gdmFsaWQgbW9kZSBjb3VsZCBiZSBmb3VuZCAobGluayBpcyBkb3duKSAqLworCWlmIChSZXN1bHQgPCBTS19MTU9ERV9TVEFUX0hBTEYpIHsKKworCQlSZXN1bHQgPSBTS19MTU9ERV9TVEFUX1VOS05PV047CisJfQorCWVsc2UgaWYgKHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QTGlua01vZGUgPj0gU0tfTE1PREVfQVVUT0hBTEYpIHsKKworCQkvKgorCQkgKiBBdXRvLW5lZ290aWF0aW9uIHdhcyB1c2VkIHRvIGJyaW5nIHVwIHRoZSBsaW5rLiBDaGFuZ2UKKwkJICogdGhlIGFscmVhZHkgZm91bmQgZHVwbGV4IHN0YXR1cyB0aGF0IGl0IGluZGljYXRlcworCQkgKiBhdXRvLW5lZ290aWF0aW9uIHdhcyBpbnZvbHZlZC4KKwkJICovCisJCWlmIChSZXN1bHQgPT0gU0tfTE1PREVfU1RBVF9IQUxGKSB7CisKKwkJCVJlc3VsdCA9IFNLX0xNT0RFX1NUQVRfQVVUT0hBTEY7CisJCX0KKwkJZWxzZSBpZiAoUmVzdWx0ID09IFNLX0xNT0RFX1NUQVRfRlVMTCkgeworCisJCQlSZXN1bHQgPSBTS19MTU9ERV9TVEFUX0FVVE9GVUxMOworCQl9CisJfQorCisJcmV0dXJuIChSZXN1bHQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXRWcGRLZXlBcnIgLSBPYnRhaW4gYW4gYXJyYXkgb2YgVlBEIGtleXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVJlYWQgdGhlIFZQRCBrZXlzIGFuZCBidWlsZCBhbiBhcnJheSBvZiBWUEQga2V5cywgd2hpY2ggYXJlCisgKgllYXN5IHRvIGFjY2Vzcy4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sJICAgICBUYXNrIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICBTb21ldGhpbmcgd2VudCB3cm9uZy4KKyAqLworUE5NSV9TVEFUSUMgaW50IEdldFZwZEtleUFycigKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitjaGFyICpwS2V5QXJyLAkJLyogUHRyIEtleUFycmF5ICovCit1bnNpZ25lZCBpbnQgS2V5QXJyTGVuLAkvKiBMZW5ndGggb2YgYXJyYXkgaW4gYnl0ZXMgKi8KK3Vuc2lnbmVkIGludCAqcEtleU5vKQkvKiBOdW1iZXIgb2Yga2V5cyAqLworeworCXVuc2lnbmVkIGludAkJQnVmS2V5c0xlbiA9IFNLX1BOTUlfVlBEX0JVRlNJWkU7CisJY2hhcgkJCUJ1ZktleXNbU0tfUE5NSV9WUERfQlVGU0laRV07CisJdW5zaWduZWQgaW50CQlTdGFydE9mZnNldDsKKwl1bnNpZ25lZCBpbnQJCU9mZnNldDsKKwlpbnQJCQlJbmRleDsKKwlpbnQJCQlSZXQ7CisKKworCVNLX01FTVNFVChwS2V5QXJyLCAwLCBLZXlBcnJMZW4pOworCisJLyoKKwkgKiBHZXQgVlBEIGtleSBsaXN0CisJICovCisJUmV0ID0gVnBkS2V5cyhwQUMsIElvQywgKGNoYXIgKikmQnVmS2V5cywgKGludCAqKSZCdWZLZXlzTGVuLAorCQkoaW50ICopcEtleU5vKTsKKwlpZiAoUmV0ID4gMCkgeworCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMTQsCisJCQlTS19QTk1JX0VSUjAxNE1TRyk7CisKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwl9CisJLyogSWYgbm8ga2V5cyBhcmUgYXZhaWxhYmxlIHJldHVybiBub3cgKi8KKwlpZiAoKnBLZXlObyA9PSAwIHx8IEJ1ZktleXNMZW4gPT0gMCkgeworCisJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCX0KKwkvKgorCSAqIElmIHRoZSBrZXkgbGlzdCBpcyB0b28gbG9uZyBmb3IgdXMgdHJ1bmMgaXQgYW5kIGdpdmUgYQorCSAqIGVycm9ybG9nIG5vdGlmaWNhdGlvbi4gVGhpcyBjYXNlIHNob3VsZCBub3QgaGFwcGVuIGJlY2F1c2UKKwkgKiB0aGUgbWF4aW11bSBudW1iZXIgb2Yga2V5cyBpcyBsaW1pdGVkIGR1ZSB0byBSQU0gbGltaXRhdGlvbnMKKwkgKi8KKwlpZiAoKnBLZXlObyA+IFNLX1BOTUlfVlBEX0VOVFJJRVMpIHsKKworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDE1LAorCQkJU0tfUE5NSV9FUlIwMTVNU0cpOworCisJCSpwS2V5Tm8gPSBTS19QTk1JX1ZQRF9FTlRSSUVTOworCX0KKworCS8qCisJICogTm93IGJ1aWxkIGFuIGFycmF5IG9mIGZpeGVkIHN0cmluZyBsZW5ndGggc2l6ZSBhbmQgY29weQorCSAqIHRoZSBrZXlzIHRvZ2V0aGVyLgorCSAqLworCWZvciAoSW5kZXggPSAwLCBTdGFydE9mZnNldCA9IDAsIE9mZnNldCA9IDA7IE9mZnNldCA8IEJ1ZktleXNMZW47CisJCU9mZnNldCArKykgeworCisJCWlmIChCdWZLZXlzW09mZnNldF0gIT0gMCkgeworCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChPZmZzZXQgLSBTdGFydE9mZnNldCA+IFNLX1BOTUlfVlBEX0tFWV9TSVpFKSB7CisKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMTYsCisJCQkJU0tfUE5NSV9FUlIwMTZNU0cpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCVNLX1NUUk5DUFkocEtleUFyciArIEluZGV4ICogU0tfUE5NSV9WUERfS0VZX1NJWkUsCisJCQkmQnVmS2V5c1tTdGFydE9mZnNldF0sIFNLX1BOTUlfVlBEX0tFWV9TSVpFKTsKKworCQlJbmRleCArKzsKKwkJU3RhcnRPZmZzZXQgPSBPZmZzZXQgKyAxOworCX0KKworCS8qIExhc3Qga2V5IG5vdCB6ZXJvIHRlcm1pbmF0ZWQ/IEdldCBpdCBhbnl3YXkgKi8KKwlpZiAoU3RhcnRPZmZzZXQgPCBPZmZzZXQpIHsKKworCQlTS19TVFJOQ1BZKHBLZXlBcnIgKyBJbmRleCAqIFNLX1BOTUlfVlBEX0tFWV9TSVpFLAorCQkJJkJ1ZktleXNbU3RhcnRPZmZzZXRdLCBTS19QTk1JX1ZQRF9LRVlfU0laRSk7CisJfQorCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNpcnFVcGRhdGUgLSBMZXQgdGhlIFNJUlEgdXBkYXRlIGl0cyBpbnRlcm5hbCB2YWx1ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUp1c3QgdG8gYmUgc3VyZSB0aGF0IHRoZSBTSVJRIG1vZHVsZSBob2xkcyBpdHMgaW50ZXJuYWwgZGF0YQorICoJc3RydWN0dXJlcyB1cCB0byBkYXRlLCB3ZSBzZW5kIGFuIHVwZGF0ZSBldmVudCBiZWZvcmUgd2UgbWFrZQorICoJYW55IGFjY2Vzcy4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sJICAgICBUYXNrIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICBTb21ldGhpbmcgd2VudCB3cm9uZy4KKyAqLworUE5NSV9TVEFUSUMgaW50IFNpcnFVcGRhdGUoCitTS19BQyAqcEFDLAkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQykJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK3sKKwlTS19FVlBBUkEJRXZlbnRQYXJhbTsKKworCisJLyogV2FzIHRoZSBtb2R1bGUgYWxyZWFkeSB1cGRhdGVkIGR1cmluZyB0aGUgY3VycmVudCBQTk1JIGNhbGw/ICovCisJaWYgKHBBQy0+UG5taS5TaXJxVXBkYXRlZEZsYWcgPiAwKSB7CisKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJfQorCisJLyogU2VuZCBhbiBzeW5jaHJvbnVvdXMgdXBkYXRlIGV2ZW50IHRvIHRoZSBtb2R1bGUgKi8KKwlTS19NRU1TRVQoKGNoYXIgKikmRXZlbnRQYXJhbSwgMCwgc2l6ZW9mKEV2ZW50UGFyYW0pKTsKKwlpZiAoU2tHZVNpcnFFdmVudChwQUMsIElvQywgU0tfSFdFVl9VUERBVEVfU1RBVCwgRXZlbnRQYXJhbSkgPiAwKSB7CisKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjA0NywKKwkJCVNLX1BOTUlfRVJSMDQ3TVNHKTsKKworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCX0KKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSbG10VXBkYXRlIC0gTGV0IHRoZSBSTE1UIHVwZGF0ZSBpdHMgaW50ZXJuYWwgdmFsdWVzCisgKgorICogRGVzY3JpcHRpb246CisgKglKdXN0IHRvIGJlIHN1cmUgdGhhdCB0aGUgUkxNVCBtb2R1bGUgaG9sZHMgaXRzIGludGVybmFsIGRhdGEKKyAqCXN0cnVjdHVyZXMgdXAgdG8gZGF0ZSwgd2Ugc2VuZCBhbiB1cGRhdGUgZXZlbnQgYmVmb3JlIHdlIG1ha2UKKyAqCWFueSBhY2Nlc3MuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LCSAgICAgVGFzayBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgU29tZXRoaW5nIHdlbnQgd3JvbmcuCisgKi8KK1BOTUlfU1RBVElDIGludCBSbG10VXBkYXRlKAorU0tfQUMgKnBBQywJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsbHdheXMgemVybyAqLworeworCVNLX0VWUEFSQQlFdmVudFBhcmFtOworCisKKwkvKiBXYXMgdGhlIG1vZHVsZSBhbHJlYWR5IHVwZGF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IFBOTUkgY2FsbD8gKi8KKwlpZiAocEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyA+IDApIHsKKworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwl9CisKKwkvKiBTZW5kIGFuIHN5bmNocm9udW91cyB1cGRhdGUgZXZlbnQgdG8gdGhlIG1vZHVsZSAqLworCVNLX01FTVNFVCgoY2hhciAqKSZFdmVudFBhcmFtLCAwLCBzaXplb2YoRXZlbnRQYXJhbSkpOworCUV2ZW50UGFyYW0uUGFyYTMyWzBdID0gTmV0SW5kZXg7CisJRXZlbnRQYXJhbS5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCWlmIChTa1JsbXRFdmVudChwQUMsIElvQywgU0tfUkxNVF9TVEFUU19VUERBVEUsIEV2ZW50UGFyYW0pID4gMCkgeworCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwNDgsCisJCQlTS19QTk1JX0VSUjA0OE1TRyk7CisKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwl9CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTWFjVXBkYXRlIC0gRm9yY2UgdGhlIFhNQUMgdG8gb3V0cHV0IHRoZSBjdXJyZW50IHN0YXRpc3RpYworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIFhNQUMgaG9sZHMgaXRzIHN0YXRpc3RpYyBpbnRlcm5hbGx5LiBUbyBvYnRhaW4gdGhlIGN1cnJlbnQKKyAqCXZhbHVlcyB3ZSBtdXN0IHNlbmQgYSBjb21tYW5kIHNvIHRoYXQgdGhlIHN0YXRpc3RpYyBkYXRhIHdpbGwKKyAqCWJlIHdyaXR0ZW4gdG8gYSBwcmVkZWZpbmVkIG1lbW9yeSBhcmVhIG9uIHRoZSBhZGFwdGVyLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSwkgICAgIFRhc2sgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgIFNvbWV0aGluZyB3ZW50IHdyb25nLgorICovCitQTk1JX1NUQVRJQyBpbnQgTWFjVXBkYXRlKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK3Vuc2lnbmVkIGludCBGaXJzdE1hYywJLyogSW5kZXggb2YgdGhlIGZpcnN0IE1hYyB0byBiZSB1cGRhdGVkICovCit1bnNpZ25lZCBpbnQgTGFzdE1hYykJLyogSW5kZXggb2YgdGhlIGxhc3QgTWFjIHRvIGJlIHVwZGF0ZWQgKi8KK3sKKwl1bnNpZ25lZCBpbnQJTWFjSW5kZXg7CisKKwkvKgorCSAqIFdlcmUgdGhlIHN0YXRpc3RpY3MgYWxyZWFkeSB1cGRhdGVkIGR1cmluZyB0aGUKKwkgKiBjdXJyZW50IFBOTUkgY2FsbD8KKwkgKi8KKwlpZiAocEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnID4gMCkgeworCisJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCX0KKworCS8qIFNlbmQgYW4gdXBkYXRlIGNvbW1hbmQgdG8gYWxsIE1BQ3Mgc3BlY2lmaWVkICovCisJZm9yIChNYWNJbmRleCA9IEZpcnN0TWFjOyBNYWNJbmRleCA8PSBMYXN0TWFjOyBNYWNJbmRleCArKykgeworCisJCS8qCisJCSAqIDIwMDItMDktMTMgcHdlYmVyOglGcmVlemUgdGhlIGN1cnJlbnQgU1cgY291bnRlcnMuCisJCSAqICAgICAgICAgICAgICAgICAgICAgIChUaGF0IHNob3VsZCBiZSBkb25lIGFzIGNsb3NlIGFzCisJCSAqICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIHRvIHRoZSB1cGRhdGUgb2YgdGhlCisJCSAqICAgICAgICAgICAgICAgICAgICAgIEhXIGNvdW50ZXJzKQorCQkgKi8KKwkJaWYgKHBBQy0+R0luaS5HSU1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCXBBQy0+UG5taS5CdWZQb3J0W01hY0luZGV4XSA9IHBBQy0+UG5taS5Qb3J0W01hY0luZGV4XTsKKwkJfQorCQkJCisJCS8qIDIwMDItMDktMTMgcHdlYmVyOiAgVXBkYXRlIHRoZSBIVyBjb3VudGVyICAqLworCQlpZiAocEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNVcGRhdGVTdGF0cyhwQUMsIElvQywgTWFjSW5kZXgpICE9IDApIHsKKworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCX0KKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXRTdGF0VmFsIC0gUmV0cmlldmUgYW4gWE1BQyBzdGF0aXN0aWMgY291bnRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJUmV0cmlldmVzIHRoZSBzdGF0aXN0aWMgY291bnRlciBvZiBhIHZpcnR1YWwgb3IgcGh5c2ljYWwgcG9ydC4gVGhlCisgKgl2aXJ0dWFsIHBvcnQgaXMgaWRlbnRpZmllZCBieSB0aGUgaW5kZXggMC4gSXQgY29uc2lzdHMgb2YgYWxsCisgKgljdXJyZW50bHkgYWN0aXZlIHBvcnRzLiBUbyBvYnRhaW4gdGhlIGNvdW50ZXIgdmFsdWUgZm9yIHRoaXMgcG9ydAorICoJd2UgbXVzdCBhZGQgdGhlIHN0YXRpc3RpYyBjb3VudGVyIG9mIGFsbCBhY3RpdmUgcG9ydHMuIFRvIGdyYW50CisgKgljb250aW51b3VzIGNvdW50ZXIgdmFsdWVzIGZvciB0aGUgdmlydHVhbCBwb3J0IGV2ZW4gd2hlbiBwb3J0CisgKglzd2l0Y2hlcyBvY2N1ciB3ZSBtdXN0IGFkZGl0aW9uYWxseSBhZGQgYSBkZWx0YSB2YWx1ZSwgd2hpY2ggd2FzCisgKgljYWxjdWxhdGVkIGR1cmluZyBhIFNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX1VQIGV2ZW50LgorICoKKyAqIFJldHVybnM6CisgKglSZXF1ZXN0ZWQgc3RhdGlzdGljIHZhbHVlCisgKi8KK1BOTUlfU1RBVElDIFNLX1U2NCBHZXRTdGF0VmFsKAorU0tfQUMgKnBBQywJCQkJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJCQkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK3Vuc2lnbmVkIGludCBMb2dQb3J0SW5kZXgsCS8qIEluZGV4IG9mIHRoZSBsb2dpY2FsIFBvcnQgdG8gYmUgcHJvY2Vzc2VkICovCit1bnNpZ25lZCBpbnQgU3RhdEluZGV4LAkJLyogSW5kZXggdG8gc3RhdGlzdGljIHZhbHVlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsbHdheXMgemVybyAqLworeworCXVuc2lnbmVkIGludAlQaHlzUG9ydEluZGV4OworCXVuc2lnbmVkIGludAlQaHlzUG9ydE1heDsKKwlTS19VNjQJCQlWYWwgPSAwOworCisKKwlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsJLyogRHVhbCBuZXQgbW9kZSAqLworCisJCVBoeXNQb3J0SW5kZXggPSBOZXRJbmRleDsKKwkJCisJCVZhbCA9IEdldFBoeXNTdGF0VmFsKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LCBTdGF0SW5kZXgpOworCX0KKwllbHNlIHsJLyogU2luZ2xlIE5ldCBtb2RlICovCisKKwkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisKKwkJCVBoeXNQb3J0TWF4ID0gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCisJCQkvKiBBZGQgY291bnRlciBvZiBhbGwgYWN0aXZlIHBvcnRzICovCisJCQlmb3IgKFBoeXNQb3J0SW5kZXggPSAwOyBQaHlzUG9ydEluZGV4IDwgUGh5c1BvcnRNYXg7CisJCQkJUGh5c1BvcnRJbmRleCArKykgeworCisJCQkJaWYgKHBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLkFjdGl2ZUZsYWcpIHsKKworCQkJCQlWYWwgKz0gR2V0UGh5c1N0YXRWYWwocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsIFN0YXRJbmRleCk7CisJCQkJfQorCQkJfQorCisJCQkvKiBDb3JyZWN0IHZhbHVlIGJlY2F1c2Ugb2YgcG9ydCBzd2l0Y2hlcyAqLworCQkJVmFsICs9IHBBQy0+UG5taS5WaXJ0dWFsQ291bnRlck9mZnNldFtTdGF0SW5kZXhdOworCQl9CisJCWVsc2UgeworCQkJLyogR2V0IGNvdW50ZXIgdmFsdWUgb2YgcGh5c2ljYWwgcG9ydCAqLworCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUyhwQUMsIExvZ1BvcnRJbmRleCk7CisJCQkKKwkJCVZhbCA9IEdldFBoeXNTdGF0VmFsKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LCBTdGF0SW5kZXgpOworCQl9CisJfQorCXJldHVybiAoVmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0UGh5c1N0YXRWYWwgLSBHZXQgY291bnRlciB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQnVpbGRzIGEgNjRiaXQgY291bnRlciB2YWx1ZS4gRXhjZXB0IGZvciB0aGUgb2N0ZXQgY291bnRlcnMKKyAqCXRoZSBsb3dlciAzMmJpdCBhcmUgY291bnRlZCBpbiBoYXJkd2FyZSBhbmQgdGhlIHVwcGVyIDMyYml0CisgKglpbiBzb2Z0d2FyZSBieSBtb25pdG9yaW5nIGNvdW50ZXIgb3ZlcmZsb3cgaW50ZXJydXB0cyBpbiB0aGUKKyAqCWV2ZW50IGhhbmRsZXIuIFRvIGdyYW50IGNvbnRpbm91cyBjb3VudGVyIHZhbHVlcyBkdXJpbmcgWE1BQworICoJcmVzZXRzIChjYXVzZWQgYnkgYSB3b3JrYXJvdW5kKSB3ZSBtdXN0IGFkZCBhIGRlbHRhIHZhbHVlLgorICoJVGhlIGRlbHRhIHdhcyBjYWxjdWxhdGVkIGluIHRoZSBldmVudCBoYW5kbGVyIHdoZW4gYQorICoJU0tfUE5NSV9FVlRfWE1BQ19SRVNFVCB3YXMgcmVjZWl2ZWQuCisgKgorICogUmV0dXJuczoKKyAqCUNvdW50ZXIgdmFsdWUKKyAqLworUE5NSV9TVEFUSUMgU0tfVTY0IEdldFBoeXNTdGF0VmFsKAorU0tfQUMgKnBBQywJCQkJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJCQkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK3Vuc2lnbmVkIGludCBQaHlzUG9ydEluZGV4LAkvKiBJbmRleCBvZiB0aGUgbG9naWNhbCBQb3J0IHRvIGJlIHByb2Nlc3NlZCAqLwordW5zaWduZWQgaW50IFN0YXRJbmRleCkJCS8qIEluZGV4IHRvIHN0YXRpc3RpYyB2YWx1ZSAqLworeworCVNLX1U2NAlWYWwgPSAwOworCVNLX1UzMglMb3dWYWwgPSAwOworCVNLX1UzMglIaWdoVmFsID0gMDsKKwlTS19VMTYJV29yZDsKKwlpbnQJCU1hY1R5cGU7CisJdW5zaWduZWQgaW50IEhlbHBJbmRleDsKKwlTS19HRVBPUlQJKnBQcnQ7CisJCisJU0tfUE5NSV9QT1JUCSpwUG5taVBydDsKKwlTS19HRU1BQ0ZVTkMJKnBGbk1hYzsKKwkKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XTsKKwkKKwlNYWNUeXBlID0gcEFDLT5HSW5pLkdJTWFjVHlwZTsKKwkKKwkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCXBQbm1pUHJ0ID0gJnBBQy0+UG5taS5CdWZQb3J0W1BoeXNQb3J0SW5kZXhdOworCX0KKwllbHNlIHsKKwkJcFBubWlQcnQgPSAmcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF07CisJfQorCQorCXBGbk1hYyAgID0gJnBBQy0+R0luaS5HSUZ1bmM7CisKKwlzd2l0Y2ggKFN0YXRJbmRleCkgeworCWNhc2UgU0tfUE5NSV9IVFg6CisJCWlmIChNYWNUeXBlID09IFNLX01BQ19HTUFDKSB7CisJCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQlTdGF0QWRkcltTS19QTk1JX0hUWF9CUk9BRENBU1RdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkmTG93VmFsKTsKKwkJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCVN0YXRBZGRyW1NLX1BOTUlfSFRYX01VTFRJQ0FTVF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCSZIaWdoVmFsKTsKKwkJCUxvd1ZhbCArPSBIaWdoVmFsOworCQkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJU3RhdEFkZHJbU0tfUE5NSV9IVFhfVU5JQ0FTVF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCSZIaWdoVmFsKTsKKwkJCUxvd1ZhbCArPSBIaWdoVmFsOworCQl9CisJCWVsc2UgeworCQkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJCQkgICZMb3dWYWwpOworCQl9CisJCUhpZ2hWYWwgPSBwUG5taVBydC0+Q291bnRlckhpZ2hbU3RhdEluZGV4XTsKKwkJYnJlYWs7CisJCisJY2FzZSBTS19QTk1JX0hSWDoKKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX0dNQUMpIHsKKwkJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCVN0YXRBZGRyW1NLX1BOTUlfSFJYX0JST0FEQ0FTVF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCSZMb3dWYWwpOworCQkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJU3RhdEFkZHJbU0tfUE5NSV9IUlhfTVVMVElDQVNUXVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJJkhpZ2hWYWwpOworCQkJTG93VmFsICs9IEhpZ2hWYWw7CisJCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQlTdGF0QWRkcltTS19QTk1JX0hSWF9VTklDQVNUXVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJJkhpZ2hWYWwpOworCQkJTG93VmFsICs9IEhpZ2hWYWw7CisJCX0KKwkJZWxzZSB7CisJCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkJCSAgJkxvd1ZhbCk7CisJCX0KKwkJSGlnaFZhbCA9IHBQbm1pUHJ0LT5Db3VudGVySGlnaFtTdGF0SW5kZXhdOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9IVFhfT0NURVQ6CisJY2FzZSBTS19QTk1JX0hSWF9PQ1RFVDoKKwkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkJICAmSGlnaFZhbCk7CisJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXggKyAxXVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCQkgICZMb3dWYWwpOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9IVFhfQlVSU1Q6CisJY2FzZSBTS19QTk1JX0hUWF9FWENFU1NfREVGOgorCWNhc2UgU0tfUE5NSV9IVFhfQ0FSUklFUjoKKwkJLyogTm90IHN1cHBvcnRlZCBieSBHTUFDICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19HTUFDKSB7CisJCQlyZXR1cm4gKFZhbCk7CisJCX0KKworCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCQkgICZMb3dWYWwpOworCQlIaWdoVmFsID0gcFBubWlQcnQtPkNvdW50ZXJIaWdoW1N0YXRJbmRleF07CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0hUWF9NQUNDOgorCQkvKiBHTUFDIG9ubHkgc3VwcG9ydHMgUEFVU0UgTUFDIGNvbnRyb2wgZnJhbWVzICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19HTUFDKSB7CisJCQlIZWxwSW5kZXggPSBTS19QTk1JX0hUWF9QTUFDQzsKKwkJfQorCQllbHNlIHsKKwkJCUhlbHBJbmRleCA9IFN0YXRJbmRleDsKKwkJfQorCQkKKwkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCVN0YXRBZGRyW0hlbHBJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkmTG93VmFsKTsKKworCQlIaWdoVmFsID0gcFBubWlQcnQtPkNvdW50ZXJIaWdoW1N0YXRJbmRleF07CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0hUWF9DT0w6CisJY2FzZSBTS19QTk1JX0hSWF9VTkRFUlNJWkU6CisJCS8qIE5vdCBzdXBwb3J0ZWQgYnkgWE1BQyAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJcmV0dXJuIChWYWwpOworCQl9CisKKwkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkJICAmTG93VmFsKTsKKwkJSGlnaFZhbCA9IHBQbm1pUHJ0LT5Db3VudGVySGlnaFtTdGF0SW5kZXhdOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9IVFhfREVGRkVSQUw6CisJCS8qIE5vdCBzdXBwb3J0ZWQgYnkgR01BQyAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfR01BQykgeworCQkJcmV0dXJuIChWYWwpOworCQl9CisJCQorCQkvKgorCQkgKiBYTUFDIGNvdW50cyBmcmFtZXMgd2l0aCBkZWZlcnJlZCB0cmFuc21pc3Npb24KKwkJICogZXZlbiBpbiBmdWxsLWR1cGxleCBtb2RlLgorCQkgKgorCQkgKiBJbiBmdWxsLWR1cGxleCBtb2RlIHRoZSBjb3VudGVyIHJlbWFpbnMgY29uc3RhbnQhCisJCSAqLworCQlpZiAoKHBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9PSBTS19MTU9ERV9TVEFUX0FVVE9GVUxMKSB8fAorCQkJKHBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9PSBTS19MTU9ERV9TVEFUX0ZVTEwpKSB7CisKKwkJCUxvd1ZhbCA9IDA7CisJCQlIaWdoVmFsID0gMDsKKwkJfQorCQllbHNlIHsKKwkJCS8qIE90aGVyd2lzZSBnZXQgY29udGVudHMgb2YgaGFyZHdhcmUgcmVnaXN0ZXIgKi8KKwkJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCQkJICAmTG93VmFsKTsKKwkJCUhpZ2hWYWwgPSBwUG5taVBydC0+Q291bnRlckhpZ2hbU3RhdEluZGV4XTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9IUlhfQkFET0NURVQ6CisJCS8qIE5vdCBzdXBwb3J0ZWQgYnkgWE1BQyAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJcmV0dXJuIChWYWwpOworCQl9CisKKwkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkJICAmSGlnaFZhbCk7CisJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXggKyAxXVtNYWNUeXBlXS5SZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZMb3dWYWwpOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9IVFhfT0NURVRMT1c6CisJY2FzZSBTS19QTk1JX0hSWF9PQ1RFVExPVzoKKwljYXNlIFNLX1BOTUlfSFJYX0JBRE9DVEVUTE9XOgorCQlyZXR1cm4gKFZhbCk7CisKKwljYXNlIFNLX1BOTUlfSFJYX0xPTkdGUkFNRVM6CisJCS8qIEZvciBYTUFDIHRoZSBTVyBjb3VudGVyIGlzIG1hbmFnZWQgYnkgUE5NSSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJcmV0dXJuIChwUG5taVBydC0+U3RhdFJ4TG9uZ0ZyYW1lQ3RzKTsKKwkJfQorCQkKKwkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkJICAmTG93VmFsKTsKKwkJSGlnaFZhbCA9IHBQbm1pUHJ0LT5Db3VudGVySGlnaFtTdGF0SW5kZXhdOworCQlicmVhazsKKwkJCisJY2FzZSBTS19QTk1JX0hSWF9UT09fTE9ORzoKKwkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCVN0YXRBZGRyW1N0YXRJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkmTG93VmFsKTsKKwkJSGlnaFZhbCA9IHBQbm1pUHJ0LT5Db3VudGVySGlnaFtTdGF0SW5kZXhdOworCQkKKwkJVmFsID0gKCgoU0tfVTY0KUhpZ2hWYWwgPDwgMzIpIHwgKFNLX1U2NClMb3dWYWwpOworCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19HTUFDKSB7CisJCQkvKiBGb3IgR01BQyB0aGUgU1cgY291bnRlciBpcyBhZGRpdGlvbmFsbHkgbWFuYWdlZCBieSBQTk1JICovCisJCQlWYWwgKz0gcFBubWlQcnQtPlN0YXRSeEZyYW1lVG9vTG9uZ0N0czsKKwkJfQorCQllbHNlIHsKKwkJCS8qCisJCQkgKiBGcmFtZXMgbG9uZ2VyIHRoYW4gSUVFRSA4MDIuMyBmcmFtZSBtYXggc2l6ZSBhcmUgY291bnRlZAorCQkJICogYnkgWE1BQyBpbiBmcmFtZV90b29fbG9uZyBjb3VudGVyIGV2ZW4gcmVjZXB0aW9uIG9mIGxvbmcKKwkJCSAqIGZyYW1lcyB3YXMgZW5hYmxlZCBhbmQgdGhlIGZyYW1lIHdhcyBjb3JyZWN0LgorCQkJICogU28gY29ycmVjdCB0aGUgdmFsdWUgYnkgc3VidHJhY3RpbmcgUnhMb25nRnJhbWUgY291bnRlci4KKwkJCSAqLworCQkJVmFsIC09IHBQbm1pUHJ0LT5TdGF0UnhMb25nRnJhbWVDdHM7CisJCX0KKworCQlMb3dWYWwgPSAoU0tfVTMyKVZhbDsKKwkJSGlnaFZhbCA9IChTS19VMzIpKFZhbCA+PiAzMik7CisJCWJyZWFrOworCQkKKwljYXNlIFNLX1BOTUlfSFJYX1NIT1JUUzoKKwkJLyogTm90IHN1cHBvcnRlZCBieSBHTUFDICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19HTUFDKSB7CisJCQkvKiBHTV9SWEVfRlJBRz8/ICovCisJCQlyZXR1cm4gKFZhbCk7CisJCX0KKwkJCisJCS8qCisJCSAqIFhNQUMgY291bnRzIHNob3J0IGZyYW1lIGVycm9ycyBldmVuIGlmIGxpbmsgZG93biAoIzEwNjIwKQorCQkgKgorCQkgKiBJZiBsaW5rLWRvd24gdGhlIGNvdW50ZXIgcmVtYWlucyBjb25zdGFudAorCQkgKi8KKwkJaWYgKHBQcnQtPlBMaW5rTW9kZVN0YXR1cyAhPSBTS19MTU9ERV9TVEFUX1VOS05PV04pIHsKKworCQkJLyogT3RoZXJ3aXNlIGdldCBpbmNyZW1lbnRhbCBkaWZmZXJlbmNlICovCisJCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkJCSAgJkxvd1ZhbCk7CisJCQlIaWdoVmFsID0gcFBubWlQcnQtPkNvdW50ZXJIaWdoW1N0YXRJbmRleF07CisKKwkJCVZhbCA9ICgoKFNLX1U2NClIaWdoVmFsIDw8IDMyKSB8IChTS19VNjQpTG93VmFsKTsKKwkJCVZhbCAtPSBwUG5taVBydC0+UnhTaG9ydFplcm9NYXJrOworCisJCQlMb3dWYWwgPSAoU0tfVTMyKVZhbDsKKwkJCUhpZ2hWYWwgPSAoU0tfVTMyKShWYWwgPj4gMzIpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0hSWF9NQUNDOgorCWNhc2UgU0tfUE5NSV9IUlhfTUFDQ19VTktXTjoKKwljYXNlIFNLX1BOTUlfSFJYX0JVUlNUOgorCWNhc2UgU0tfUE5NSV9IUlhfTUlTU0VEOgorCWNhc2UgU0tfUE5NSV9IUlhfRlJBTUlORzoKKwljYXNlIFNLX1BOTUlfSFJYX0NBUlJJRVI6CisJY2FzZSBTS19QTk1JX0hSWF9JUkxFTkdUSDoKKwljYXNlIFNLX1BOTUlfSFJYX1NZTUJPTDoKKwljYXNlIFNLX1BOTUlfSFJYX0NFWFQ6CisJCS8qIE5vdCBzdXBwb3J0ZWQgYnkgR01BQyAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfR01BQykgeworCQkJcmV0dXJuIChWYWwpOworCQl9CisKKwkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkJICAmTG93VmFsKTsKKwkJSGlnaFZhbCA9IHBQbm1pUHJ0LT5Db3VudGVySGlnaFtTdGF0SW5kZXhdOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9IUlhfUE1BQ0NfRVJSOgorCQkvKiBGb3IgR01BQyB0aGUgU1cgY291bnRlciBpcyBtYW5hZ2VkIGJ5IFBOTUkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX0dNQUMpIHsKKwkJCXJldHVybiAocFBubWlQcnQtPlN0YXRSeFBNYWNjRXJyKTsKKwkJfQorCQkKKwkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkJICAmTG93VmFsKTsKKwkJSGlnaFZhbCA9IHBQbm1pUHJ0LT5Db3VudGVySGlnaFtTdGF0SW5kZXhdOworCQlicmVhazsKKworCS8qIFNXIGNvdW50ZXIgbWFuYWdlZCBieSBQTk1JICovCisJY2FzZSBTS19QTk1JX0hUWF9TWU5DOgorCQlMb3dWYWwgPSAoU0tfVTMyKXBQbm1pUHJ0LT5TdGF0U3luY0N0czsKKwkJSGlnaFZhbCA9IChTS19VMzIpKHBQbm1pUHJ0LT5TdGF0U3luY0N0cyA+PiAzMik7CisJCWJyZWFrOworCisJLyogU1cgY291bnRlciBtYW5hZ2VkIGJ5IFBOTUkgKi8KKwljYXNlIFNLX1BOTUlfSFRYX1NZTkNfT0NURVQ6CisJCUxvd1ZhbCA9IChTS19VMzIpcFBubWlQcnQtPlN0YXRTeW5jT2N0ZXRzQ3RzOworCQlIaWdoVmFsID0gKFNLX1UzMikocFBubWlQcnQtPlN0YXRTeW5jT2N0ZXRzQ3RzID4+IDMyKTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfSFJYX0ZDUzoKKwkJLyoKKwkJICogQnJvYWRjb20gZmlsdGVycyBGQ1MgZXJyb3JzIGFuZCBjb3VudHMgaXQgaW4KKwkJICogUmVjZWl2ZSBFcnJvciBDb3VudGVyIHJlZ2lzdGVyCisJCSAqLworCQlpZiAocFBydC0+UGh5VHlwZSA9PSBTS19QSFlfQkNPTSkgeworCQkJLyogZG8gbm90IHJlYWQgd2hpbGUgbm90IGluaXRpYWxpemVkIChQSFlfUkVBRCBoYW5ncyEpKi8KKwkJCWlmIChwUHJ0LT5QU3RhdGUgIT0gU0tfUFJUX1JFU0VUKSB7CisJCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsIFBIWV9CQ09NX1JFX0NUUiwgJldvcmQpOworCQkJCQorCQkJCUxvd1ZhbCA9IFdvcmQ7CisJCQl9CisJCQlIaWdoVmFsID0gcFBubWlQcnQtPkNvdW50ZXJIaWdoW1N0YXRJbmRleF07CisJCX0KKwkJZWxzZSB7CisJCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkJCSAgJkxvd1ZhbCk7CisJCQlIaWdoVmFsID0gcFBubWlQcnQtPkNvdW50ZXJIaWdoW1N0YXRJbmRleF07CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCQkgICZMb3dWYWwpOworCQlIaWdoVmFsID0gcFBubWlQcnQtPkNvdW50ZXJIaWdoW1N0YXRJbmRleF07CisJCWJyZWFrOworCX0KKworCVZhbCA9ICgoKFNLX1U2NClIaWdoVmFsIDw8IDMyKSB8IChTS19VNjQpTG93VmFsKTsKKworCS8qIENvcnJlY3QgdmFsdWUgYmVjYXVzZSBvZiBwb3NzaWJsZSBYTUFDIHJlc2V0LiBYTUFDIEVycmF0YSAjMiAqLworCVZhbCArPSBwUG5taVBydC0+Q291bnRlck9mZnNldFtTdGF0SW5kZXhdOworCisJcmV0dXJuIChWYWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZXNldENvdW50ZXIgLSBTZXQgYWxsIGNvdW50ZXJzIGFuZCB0aW1lc3RhbXBzIHRvIHplcm8KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCU5vdGlmaWVzIG90aGVyIGNvbW1vbiBtb2R1bGVzIHdoaWNoIHN0b3JlIHN0YXRpc3RpYyBkYXRhIHRvCisgKglyZXNldCB0aGVpciBjb3VudGVycyBhbmQgZmluYWxseSByZXNldCBvdXIgb3duIGNvdW50ZXJzLgorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1BOTUlfU1RBVElDIHZvaWQgUmVzZXRDb3VudGVyKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK1NLX1UzMiBOZXRJbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRJbmRleDsKKwlTS19FVlBBUkEJRXZlbnRQYXJhbTsKKworCisJU0tfTUVNU0VUKChjaGFyICopJkV2ZW50UGFyYW0sIDAsIHNpemVvZihFdmVudFBhcmFtKSk7CisKKwkvKiBOb3RpZnkgc2Vuc29yIG1vZHVsZSAqLworCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfSTJDLCBTS19JMkNFVl9DTEVBUiwgRXZlbnRQYXJhbSk7CisKKwkvKiBOb3RpZnkgUkxNVCBtb2R1bGUgKi8KKwlFdmVudFBhcmFtLlBhcmEzMlswXSA9IE5ldEluZGV4OworCUV2ZW50UGFyYW0uUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfU1RBVFNfQ0xFQVIsIEV2ZW50UGFyYW0pOworCUV2ZW50UGFyYW0uUGFyYTMyWzFdID0gMDsKKworCS8qIE5vdGlmeSBTSVJRIG1vZHVsZSAqLworCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfSFdBQywgU0tfSFdFVl9DTEVBUl9TVEFULCBFdmVudFBhcmFtKTsKKworCS8qIE5vdGlmeSBDU1VNIG1vZHVsZSAqLworI2lmZGVmIFNLX1VTRV9DU1VNCisJRXZlbnRQYXJhbS5QYXJhMzJbMF0gPSBOZXRJbmRleDsKKwlFdmVudFBhcmFtLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9DU1VNLCBTS19DU1VNX0VWRU5UX0NMRUFSX1BST1RPX1NUQVRTLAorCQlFdmVudFBhcmFtKTsKKyNlbmRpZiAvKiBTS19VU0VfQ1NVTSAqLworCQorCS8qIENsZWFyIFhNQUMgc3RhdGlzdGljICovCisJZm9yIChQaHlzUG9ydEluZGV4ID0gMDsgUGh5c1BvcnRJbmRleCA8CisJCSh1bnNpZ25lZCBpbnQpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBQaHlzUG9ydEluZGV4ICsrKSB7CisKKwkJKHZvaWQpcEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNSZXNldENvdW50ZXIocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgpOworCisJCVNLX01FTVNFVCgoY2hhciAqKSZwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5Db3VudGVySGlnaCwKKwkJCTAsIHNpemVvZihwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5Db3VudGVySGlnaCkpOworCQlTS19NRU1TRVQoKGNoYXIgKikmcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uCisJCQlDb3VudGVyT2Zmc2V0LCAwLCBzaXplb2YocEFDLT5Qbm1pLlBvcnRbCisJCQlQaHlzUG9ydEluZGV4XS5Db3VudGVyT2Zmc2V0KSk7CisJCVNLX01FTVNFVCgoY2hhciAqKSZwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5TdGF0U3luY0N0cywKKwkJCTAsIHNpemVvZihwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5TdGF0U3luY0N0cykpOworCQlTS19NRU1TRVQoKGNoYXIgKikmcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uCisJCQlTdGF0U3luY09jdGV0c0N0cywgMCwgc2l6ZW9mKHBBQy0+UG5taS5Qb3J0WworCQkJUGh5c1BvcnRJbmRleF0uU3RhdFN5bmNPY3RldHNDdHMpKTsKKwkJU0tfTUVNU0VUKChjaGFyICopJnBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLgorCQkJU3RhdFJ4TG9uZ0ZyYW1lQ3RzLCAwLCBzaXplb2YocEFDLT5Qbm1pLlBvcnRbCisJCQlQaHlzUG9ydEluZGV4XS5TdGF0UnhMb25nRnJhbWVDdHMpKTsKKwkJU0tfTUVNU0VUKChjaGFyICopJnBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLgorCQkJCSAgU3RhdFJ4RnJhbWVUb29Mb25nQ3RzLCAwLCBzaXplb2YocEFDLT5Qbm1pLlBvcnRbCisJCQlQaHlzUG9ydEluZGV4XS5TdGF0UnhGcmFtZVRvb0xvbmdDdHMpKTsKKwkJU0tfTUVNU0VUKChjaGFyICopJnBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLgorCQkJCSAgU3RhdFJ4UE1hY2NFcnIsIDAsIHNpemVvZihwQUMtPlBubWkuUG9ydFsKKwkJCVBoeXNQb3J0SW5kZXhdLlN0YXRSeFBNYWNjRXJyKSk7CisJfQorCisJLyoKKwkgKiBDbGVhciBsb2NhbCBzdGF0aXN0aWNzCisJICovCisJU0tfTUVNU0VUKChjaGFyICopJnBBQy0+UG5taS5WaXJ0dWFsQ291bnRlck9mZnNldCwgMCwKKwkJICBzaXplb2YocEFDLT5Qbm1pLlZpcnR1YWxDb3VudGVyT2Zmc2V0KSk7CisJcEFDLT5Qbm1pLlJsbXRDaGFuZ2VDdHMgPSAwOworCXBBQy0+UG5taS5SbG10Q2hhbmdlVGltZSA9IDA7CisJU0tfTUVNU0VUKChjaGFyICopJnBBQy0+UG5taS5SbG10Q2hhbmdlRXN0aW1hdGUuRXN0VmFsdWVbMF0sIDAsCisJCXNpemVvZihwQUMtPlBubWkuUmxtdENoYW5nZUVzdGltYXRlLkVzdFZhbHVlKSk7CisJcEFDLT5Qbm1pLlJsbXRDaGFuZ2VFc3RpbWF0ZS5Fc3RWYWx1ZUluZGV4ID0gMDsKKwlwQUMtPlBubWkuUmxtdENoYW5nZUVzdGltYXRlLkVzdGltYXRlID0gMDsKKwlwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uVHhTd1F1ZXVlTWF4ID0gMDsKKwlwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uVHhSZXRyeUN0cyA9IDA7CisJcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlJ4SW50ckN0cyA9IDA7CisJcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlR4SW50ckN0cyA9IDA7CisJcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlJ4Tm9CdWZDdHMgPSAwOworCXBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5UeE5vQnVmQ3RzID0gMDsKKwlwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uVHhVc2VkRGVzY3JObyA9IDA7CisJcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlJ4RGVsaXZlcmVkQ3RzID0gMDsKKwlwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uUnhPY3RldHNEZWxpdmVyZWRDdHMgPSAwOworCXBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5FcnJSZWNvdmVyeUN0cyA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldFRyYXBFbnRyeSAtIEdldCBhbiBlbnRyeSBpbiB0aGUgdHJhcCBidWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSB0cmFwIGJ1ZmZlciBzdG9yZXMgdmFyaW91cyBldmVudHMuIEEgdXNlciBhcHBsaWNhdGlvbiBzb21laG93CisgKglnZXRzIG5vdGlmaWVkIHRoYXQgYW4gZXZlbnQgb2NjdXJlZCBhbmQgcmV0cmlldmVzIHRoZSB0cmFwIGJ1ZmZlcgorICoJY29udGVucyAob3Igc2ltcGx5IHBvbGxzIHRoZSBidWZmZXIpLiBUaGUgYnVmZmVyIGlzIG9yZ2FuaXplZCBhcworICoJYSByaW5nIHdoaWNoIHN0b3JlcyB0aGUgbmV3ZXN0IHRyYXBzIGF0IHRoZSBiZWdpbm5pbmcuIFRoZSBvbGRlc3QKKyAqCXRyYXBzIGFyZSBvdmVyd3JpdHRlbiBieSB0aGUgbmV3ZXN0IG9uZXMuIEVhY2ggdHJhcCBlbnRyeSBoYXMgYQorICoJdW5pcXVlIG51bWJlciwgc28gdGhhdCBhcHBsaWNhdGlvbnMgbWF5IGRldGVjdCBuZXcgdHJhcCBlbnRyaWVzLgorICoKKyAqIFJldHVybnM6CisgKglBIHBvaW50ZXIgdG8gdGhlIHRyYXAgZW50cnkKKyAqLworUE5NSV9TVEFUSUMgY2hhciogR2V0VHJhcEVudHJ5KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19VMzIgVHJhcElkLAkJLyogU05NUCBJRCBvZiB0aGUgdHJhcCAqLwordW5zaWduZWQgaW50IFNpemUpCS8qIFNwYWNlIG5lZWRlZCBmb3IgdHJhcCBlbnRyeSAqLworeworCXVuc2lnbmVkIGludAkJQnVmUGFkID0gcEFDLT5Qbm1pLlRyYXBCdWZQYWQ7CisJdW5zaWduZWQgaW50CQlCdWZGcmVlID0gcEFDLT5Qbm1pLlRyYXBCdWZGcmVlOworCXVuc2lnbmVkIGludAkJQmVnID0gcEFDLT5Qbm1pLlRyYXBRdWV1ZUJlZzsKKwl1bnNpZ25lZCBpbnQJCUVuZCA9IHBBQy0+UG5taS5UcmFwUXVldWVFbmQ7CisJY2hhcgkJCSpwQnVmID0gJnBBQy0+UG5taS5UcmFwQnVmWzBdOworCWludAkJCVdyYXA7CisJdW5zaWduZWQgaW50CQlOZWVkZWRTcGFjZTsKKwl1bnNpZ25lZCBpbnQJCUVudHJ5U2l6ZTsKKwlTS19VMzIJCQlWYWwzMjsKKwlTS19VNjQJCQlWYWw2NDsKKworCisJLyogTGFzdCBieXRlIG9mIGVudHJ5IHdpbGwgZ2V0IGEgY29weSBvZiB0aGUgZW50cnkgbGVuZ3RoICovCisJU2l6ZSArKzsKKworCS8qCisJICogQ2FsY3VsYXRlIG5lZWRlZCBidWZmZXIgc3BhY2UgKi8KKwlpZiAoQmVnID49IFNpemUpIHsKKworCQlOZWVkZWRTcGFjZSA9IFNpemU7CisJCVdyYXAgPSBTS19GQUxTRTsKKwl9CisJZWxzZSB7CisJCU5lZWRlZFNwYWNlID0gQmVnICsgU2l6ZTsKKwkJV3JhcCA9IFNLX1RSVUU7CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiBlbm91Z2ggYnVmZmVyIHNwYWNlIGlzIHByb3ZpZGVkLiBPdGhlcndpc2UKKwkgKiBmcmVlIHNvbWUgZW50cmllcy4gTGVhdmUgb25lIGJ5dGUgc3BhY2UgYmV0d2VlbiBiZWdpbgorCSAqIGFuZCBlbmQgb2YgYnVmZmVyIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gZGV0ZWN0IHdoZXRoZXIKKwkgKiB0aGUgYnVmZmVyIGlzIGZ1bGwgb3IgZW1wdHkKKwkgKi8KKwl3aGlsZSAoQnVmRnJlZSA8IE5lZWRlZFNwYWNlICsgMSkgeworCisJCWlmIChFbmQgPT0gMCkgeworCisJCQlFbmQgPSBTS19QTk1JX1RSQVBfUVVFVUVfTEVOOworCQl9CisKKwkJRW50cnlTaXplID0gKHVuc2lnbmVkIGludCkqKCh1bnNpZ25lZCBjaGFyICopcEJ1ZiArIEVuZCAtIDEpOworCQlCdWZGcmVlICs9IEVudHJ5U2l6ZTsKKwkJRW5kIC09IEVudHJ5U2l6ZTsKKyNpZmRlZiBERUJVRworCQlTS19NRU1TRVQocEJ1ZiArIEVuZCwgKGNoYXIpKC0xKSwgRW50cnlTaXplKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCQlpZiAoRW5kID09IEJ1ZlBhZCkgeworI2lmZGVmIERFQlVHCisJCQlTS19NRU1TRVQocEJ1ZiwgKGNoYXIpKC0xKSwgRW5kKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCQkJQnVmRnJlZSArPSBFbmQ7CisJCQlFbmQgPSAwOworCQkJQnVmUGFkID0gMDsKKwkJfQorCX0KKworCS8qCisJICogSW5zZXJ0IG5ldyBlbnRyeSBhcyBmaXJzdCBlbnRyeS4gTmV3ZXN0IGVudHJpZXMgYXJlCisJICogc3RvcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHF1ZXVlLgorCSAqLworCWlmIChXcmFwKSB7CisKKwkJQnVmUGFkID0gQmVnOworCQlCZWcgPSBTS19QTk1JX1RSQVBfUVVFVUVfTEVOIC0gU2l6ZTsKKwl9CisJZWxzZSB7CisJCUJlZyA9IEJlZyAtIFNpemU7CisJfQorCUJ1ZkZyZWUgLT0gTmVlZGVkU3BhY2U7CisKKwkvKiBTYXZlIHRoZSBjdXJyZW50IG9mZnNldHMgKi8KKwlwQUMtPlBubWkuVHJhcFF1ZXVlQmVnID0gQmVnOworCXBBQy0+UG5taS5UcmFwUXVldWVFbmQgPSBFbmQ7CisJcEFDLT5Qbm1pLlRyYXBCdWZQYWQgPSBCdWZQYWQ7CisJcEFDLT5Qbm1pLlRyYXBCdWZGcmVlID0gQnVmRnJlZTsKKworCS8qIEluaXRpYWxpemUgdGhlIHRyYXAgZW50cnkgKi8KKwkqKHBCdWYgKyBCZWcgKyBTaXplIC0gMSkgPSAoY2hhcilTaXplOworCSoocEJ1ZiArIEJlZykgPSAoY2hhcilTaXplOworCVZhbDMyID0gKHBBQy0+UG5taS5UcmFwVW5pcXVlKSArKzsKKwlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgQmVnICsgMSwgVmFsMzIpOworCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBCZWcgKyAxICsgc2l6ZW9mKFNLX1UzMiksIFRyYXBJZCk7CisJVmFsNjQgPSBTS19QTk1JX0hVTkRSRURTX1NFQyhTa09zR2V0VGltZShwQUMpKTsKKwlTS19QTk1JX1NUT1JFX1U2NChwQnVmICsgQmVnICsgMSArIDIgKiBzaXplb2YoU0tfVTMyKSwgVmFsNjQpOworCisJcmV0dXJuIChwQnVmICsgQmVnKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weVRyYXBRdWV1ZSAtIENvcGllcyB0aGUgdHJhcCBidWZmZXIgZm9yIHRoZSBUUkFQIE9JRAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJT24gYSBxdWVyeSBvZiB0aGUgVFJBUCBPSUQgdGhlIHRyYXAgYnVmZmVyIGNvbnRlbnRzIHdpbGwgYmUKKyAqCWNvcGllZCBjb250aW51b3VzbHkgdG8gdGhlIHJlcXVlc3QgYnVmZmVyLCB3aGljaCBtdXN0IGJlIGxhcmdlCisgKgllbm91Z2guIE5vIGxlbmd0aCBjaGVjayBpcyBwZXJmb3JtZWQuCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUE5NSV9TVEFUSUMgdm9pZCBDb3B5VHJhcFF1ZXVlKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitjaGFyICpwRHN0QnVmKQkJLyogQnVmZmVyIHRvIHdoaWNoIHRoZSBxdWV1ZWQgdHJhcHMgd2lsbCBiZSBjb3BpZWQgKi8KK3sKKwl1bnNpZ25lZCBpbnQJQnVmUGFkID0gcEFDLT5Qbm1pLlRyYXBCdWZQYWQ7CisJdW5zaWduZWQgaW50CVRyYXAgPSBwQUMtPlBubWkuVHJhcFF1ZXVlQmVnOworCXVuc2lnbmVkIGludAlFbmQgPSBwQUMtPlBubWkuVHJhcFF1ZXVlRW5kOworCWNoYXIJCSpwQnVmID0gJnBBQy0+UG5taS5UcmFwQnVmWzBdOworCXVuc2lnbmVkIGludAlMZW47CisJdW5zaWduZWQgaW50CURzdE9mZiA9IDA7CisKKworCXdoaWxlIChUcmFwICE9IEVuZCkgeworCisJCUxlbiA9ICh1bnNpZ25lZCBpbnQpKihwQnVmICsgVHJhcCk7CisKKwkJLyoKKwkJICogTGFzdCBieXRlIGNvbnRhaW5pbmcgYSBjb3B5IG9mIHRoZSBsZW5ndGggd2lsbAorCQkgKiBub3QgYmUgY29waWVkLgorCQkgKi8KKwkJKihwRHN0QnVmICsgRHN0T2ZmKSA9IChjaGFyKShMZW4gLSAxKTsKKwkJU0tfTUVNQ1BZKHBEc3RCdWYgKyBEc3RPZmYgKyAxLCBwQnVmICsgVHJhcCArIDEsIExlbiAtIDIpOworCQlEc3RPZmYgKz0gTGVuIC0gMTsKKworCQlUcmFwICs9IExlbjsKKwkJaWYgKFRyYXAgPT0gU0tfUE5NSV9UUkFQX1FVRVVFX0xFTikgeworCisJCQlUcmFwID0gQnVmUGFkOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXRUcmFwUXVldWVMZW4gLSBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgdHJhcCBidWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUV2YWx1YXRlcyB0aGUgbnVtYmVyIG9mIGN1cnJlbnRseSBzdG9yZWQgdHJhcHMgYW5kIHRoZSBuZWVkZWQKKyAqCWJ1ZmZlciBzaXplIHRvIHJldHJpZXZlIHRoZW0uCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUE5NSV9TVEFUSUMgdm9pZCBHZXRUcmFwUXVldWVMZW4oCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogTGVuZ3RoIGluIEJ5dGVzIG9mIGFsbCBxdWV1ZWQgdHJhcHMgKi8KK3Vuc2lnbmVkIGludCAqcEVudHJpZXMpCS8qIFJldHVybnMgbnVtYmVyIG9mIHRyYXBlcyBzdG9yZWQgaW4gcXVldWUgKi8KK3sKKwl1bnNpZ25lZCBpbnQJQnVmUGFkID0gcEFDLT5Qbm1pLlRyYXBCdWZQYWQ7CisJdW5zaWduZWQgaW50CVRyYXAgPSBwQUMtPlBubWkuVHJhcFF1ZXVlQmVnOworCXVuc2lnbmVkIGludAlFbmQgPSBwQUMtPlBubWkuVHJhcFF1ZXVlRW5kOworCWNoYXIJCSpwQnVmID0gJnBBQy0+UG5taS5UcmFwQnVmWzBdOworCXVuc2lnbmVkIGludAlMZW47CisJdW5zaWduZWQgaW50CUVudHJpZXMgPSAwOworCXVuc2lnbmVkIGludAlUb3RhbExlbiA9IDA7CisKKworCXdoaWxlIChUcmFwICE9IEVuZCkgeworCisJCUxlbiA9ICh1bnNpZ25lZCBpbnQpKihwQnVmICsgVHJhcCk7CisJCVRvdGFsTGVuICs9IExlbiAtIDE7CisJCUVudHJpZXMgKys7CisKKwkJVHJhcCArPSBMZW47CisJCWlmIChUcmFwID09IFNLX1BOTUlfVFJBUF9RVUVVRV9MRU4pIHsKKworCQkJVHJhcCA9IEJ1ZlBhZDsKKwkJfQorCX0KKworCSpwRW50cmllcyA9IEVudHJpZXM7CisJKnBMZW4gPSBUb3RhbExlbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUXVldWVTaW1wbGVUcmFwIC0gU3RvcmUgYSBzaW1wbGUgdHJhcCB0byB0aGUgdHJhcCBidWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUEgc2ltcGxlIHRyYXAgaXMgYSB0cmFwIHdpdGggbm93IGFkZGl0aW9uYWwgZGF0YS4gSXQgY29uc2lzdHMKKyAqCXNpbXBseSBvZiBhIHRyYXAgY29kZS4KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitQTk1JX1NUQVRJQyB2b2lkIFF1ZXVlU2ltcGxlVHJhcCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfVTMyIFRyYXBJZCkJCS8qIFR5cGUgb2Ygc2Vuc29yIHRyYXAgKi8KK3sKKwlHZXRUcmFwRW50cnkocEFDLCBUcmFwSWQsIFNLX1BOTUlfVFJBUF9TSU1QTEVfTEVOKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUXVldWVTZW5zb3JUcmFwIC0gU3RvcmVzIGEgc2Vuc29yIHRyYXAgaW4gdGhlIHRyYXAgYnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKglHZXRzIGFuIGVudHJ5IGluIHRoZSB0cmFwIGJ1ZmZlciBhbmQgZmlsbHMgaXQgd2l0aCBzZW5zb3IgcmVsYXRlZAorICoJZGF0YS4KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitQTk1JX1NUQVRJQyB2b2lkIFF1ZXVlU2Vuc29yVHJhcCgKK1NLX0FDICpwQUMsCQkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX1UzMiBUcmFwSWQsCQkJLyogVHlwZSBvZiBzZW5zb3IgdHJhcCAqLwordW5zaWduZWQgaW50IFNlbnNvckluZGV4KQkvKiBJbmRleCBvZiBzZW5zb3Igd2hpY2ggY2F1c2VkIHRoZSB0cmFwICovCit7CisJY2hhcgkJKnBCdWY7CisJdW5zaWduZWQgaW50CU9mZnNldDsKKwl1bnNpZ25lZCBpbnQJRGVzY3JMZW47CisJU0tfVTMyCQlWYWwzMjsKKworCisJLyogR2V0IHRyYXAgYnVmZmVyIGVudHJ5ICovCisJRGVzY3JMZW4gPSBTS19TVFJMRU4ocEFDLT5JMmMuU2VuVGFibGVbU2Vuc29ySW5kZXhdLlNlbkRlc2MpOworCXBCdWYgPSBHZXRUcmFwRW50cnkocEFDLCBUcmFwSWQsCisJCVNLX1BOTUlfVFJBUF9TRU5TT1JfTEVOX0JBU0UgKyBEZXNjckxlbik7CisJT2Zmc2V0ID0gU0tfUE5NSV9UUkFQX1NJTVBMRV9MRU47CisKKwkvKiBTdG9yZSBhZGRpdGlvbmFsbHkgc2Vuc29yIHRyYXAgcmVsYXRlZCBkYXRhICovCisJVmFsMzIgPSBPSURfU0tHRV9TRU5TT1JfSU5ERVg7CisJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIE9mZnNldCwgVmFsMzIpOworCSoocEJ1ZiArIE9mZnNldCArIDQpID0gNDsKKwlWYWwzMiA9IChTS19VMzIpU2Vuc29ySW5kZXg7CisJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIE9mZnNldCArIDUsIFZhbDMyKTsKKwlPZmZzZXQgKz0gOTsKKwkKKwlWYWwzMiA9IChTS19VMzIpT0lEX1NLR0VfU0VOU09SX0RFU0NSOworCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBPZmZzZXQsIFZhbDMyKTsKKwkqKHBCdWYgKyBPZmZzZXQgKyA0KSA9IChjaGFyKURlc2NyTGVuOworCVNLX01FTUNQWShwQnVmICsgT2Zmc2V0ICsgNSwgcEFDLT5JMmMuU2VuVGFibGVbU2Vuc29ySW5kZXhdLlNlbkRlc2MsCisJCURlc2NyTGVuKTsKKwlPZmZzZXQgKz0gRGVzY3JMZW4gKyA1OworCisJVmFsMzIgPSBPSURfU0tHRV9TRU5TT1JfVFlQRTsKKwlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgT2Zmc2V0LCBWYWwzMik7CisJKihwQnVmICsgT2Zmc2V0ICsgNCkgPSAxOworCSoocEJ1ZiArIE9mZnNldCArIDUpID0gKGNoYXIpcEFDLT5JMmMuU2VuVGFibGVbU2Vuc29ySW5kZXhdLlNlblR5cGU7CisJT2Zmc2V0ICs9IDY7CisKKwlWYWwzMiA9IE9JRF9TS0dFX1NFTlNPUl9WQUxVRTsKKwlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgT2Zmc2V0LCBWYWwzMik7CisJKihwQnVmICsgT2Zmc2V0ICsgNCkgPSA0OworCVZhbDMyID0gKFNLX1UzMilwQUMtPkkyYy5TZW5UYWJsZVtTZW5zb3JJbmRleF0uU2VuVmFsdWU7CisJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIE9mZnNldCArIDUsIFZhbDMyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUXVldWVSbG10TmV3TWFjVHJhcCAtIFN0b3JlIGEgcG9ydCBzd2l0Y2ggdHJhcCBpbiB0aGUgdHJhcCBidWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCU5vdGhpbmcgZnVydGhlciB0byBleHBsYWluLgorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1BOTUlfU1RBVElDIHZvaWQgUXVldWVSbG10TmV3TWFjVHJhcCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLwordW5zaWduZWQgaW50IEFjdGl2ZU1hYykJLyogSW5kZXggKDAuLm4pIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIHBvcnQgKi8KK3sKKwljaGFyCSpwQnVmOworCVNLX1UzMglWYWwzMjsKKworCisJcEJ1ZiA9IEdldFRyYXBFbnRyeShwQUMsIE9JRF9TS0dFX1RSQVBfUkxNVF9DSEFOR0VfUE9SVCwKKwkJU0tfUE5NSV9UUkFQX1JMTVRfQ0hBTkdFX0xFTik7CisKKwlWYWwzMiA9IE9JRF9TS0dFX1JMTVRfUE9SVF9BQ1RJVkU7CisJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIFNLX1BOTUlfVFJBUF9TSU1QTEVfTEVOLCBWYWwzMik7CisJKihwQnVmICsgU0tfUE5NSV9UUkFQX1NJTVBMRV9MRU4gKyA0KSA9IDE7CisJKihwQnVmICsgU0tfUE5NSV9UUkFQX1NJTVBMRV9MRU4gKyA1KSA9IChjaGFyKUFjdGl2ZU1hYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUXVldWVSbG10UG9ydFRyYXAgLSBTdG9yZSBwb3J0IHJlbGF0ZWQgUkxNVCB0cmFwIHRvIHRyYXAgYnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKglOb3RoaW5nIGZ1cnRoZXIgdG8gZXhwbGFpbi4KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitQTk1JX1NUQVRJQyB2b2lkIFF1ZXVlUmxtdFBvcnRUcmFwKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19VMzIgVHJhcElkLAkJLyogVHlwZSBvZiBSTE1UIHBvcnQgdHJhcCAqLwordW5zaWduZWQgaW50IFBvcnRJbmRleCkJLyogSW5kZXggb2YgdGhlIHBvcnQsIHdoaWNoIGNoYW5nZWQgaXRzIHN0YXRlICovCit7CisJY2hhcgkqcEJ1ZjsKKwlTS19VMzIJVmFsMzI7CisKKworCXBCdWYgPSBHZXRUcmFwRW50cnkocEFDLCBUcmFwSWQsIFNLX1BOTUlfVFJBUF9STE1UX1BPUlRfTEVOKTsKKworCVZhbDMyID0gT0lEX1NLR0VfUkxNVF9QT1JUX0lOREVYOworCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBTS19QTk1JX1RSQVBfU0lNUExFX0xFTiwgVmFsMzIpOworCSoocEJ1ZiArIFNLX1BOTUlfVFJBUF9TSU1QTEVfTEVOICsgNCkgPSAxOworCSoocEJ1ZiArIFNLX1BOTUlfVFJBUF9TSU1QTEVfTEVOICsgNSkgPSAoY2hhcilQb3J0SW5kZXg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlNYWMgLSBDb3BpZXMgYSBNQUMgYWRkcmVzcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJTm90aGluZyBmdXJ0aGVyIHRvIGV4cGxhaW4uCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUE5NSV9TVEFUSUMgdm9pZCBDb3B5TWFjKAorY2hhciAqcERzdCwJCS8qIFBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyICovCitTS19NQUNfQUREUiAqcE1hYykJLyogUG9pbnRlciBvZiBTb3VyY2UgKi8KK3sKKwlpbnQJaTsKKworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihTS19NQUNfQUREUik7IGkgKyspIHsKKworCQkqKHBEc3QgKyBpKSA9IHBNYWMtPmFbaV07CisJfQorfQorCisjaWZkZWYgU0tfUE9XRVJfTUdNVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUG93ZXJNYW5hZ2VtZW50IC0gT0lEIGhhbmRsZXIgZnVuY3Rpb24gb2YgUG93ZXJNYW5hZ2VtZW50IE9JRHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBjb2RlIGlzIHNpbXBsZS4gTm8gZGVzY3JpcHRpb24gbmVjZXNzYXJ5LgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworCitQTk1JX1NUQVRJQyBpbnQgUG93ZXJNYW5hZ2VtZW50KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHZXQvUHJlU2V0L1NldCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB0byB3aGljaCB0byBtZ210IGRhdGEgd2lsbCBiZSByZXRyaWV2ZWQgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsbHdheXMgemVybyAqLworeworCQorCVNLX1UzMglSZXRDb2RlID0gU0tfUE5NSV9FUlJfR0VORVJBTDsKKworCS8qCisJICogQ2hlY2sgaW5zdGFuY2UuIFdlIG9ubHkgaGFuZGxlIHNpbmdsZSBpbnN0YW5jZSB2YXJpYWJsZXMKKwkgKi8KKwlpZiAoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpICYmIEluc3RhbmNlICE9IDEpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwl9CisJCisgICAgCisgICAgLyogQ2hlY2sgbGVuZ3RoICovCisgICAgc3dpdGNoIChJZCkgeworCisgICAgY2FzZSBPSURfUE5QX0NBUEFCSUxJVElFUzoKKyAgICAgICAgaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1BOUF9DQVBBQklMSVRJRVMpKSB7CisKKyAgICAgICAgICAgICpwTGVuID0gc2l6ZW9mKFNLX1BOUF9DQVBBQklMSVRJRVMpOworICAgICAgICAgICAgcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisJY2FzZSBPSURfUE5QX1NFVF9QT1dFUjoKKyAgICBjYXNlIE9JRF9QTlBfUVVFUllfUE9XRVI6CisgICAgCWlmICgqcExlbiA8IHNpemVvZihTS19ERVZJQ0VfUE9XRVJfU1RBVEUpKQorICAgIAl7CisgICAgCQkqcExlbiA9IHNpemVvZihTS19ERVZJQ0VfUE9XRVJfU1RBVEUpOworICAgIAkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworICAgIAl9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPSURfUE5QX0FERF9XQUtFX1VQX1BBVFRFUk46CisgICAgY2FzZSBPSURfUE5QX1JFTU9WRV9XQUtFX1VQX1BBVFRFUk46CisJCWlmICgqcExlbiA8IHNpemVvZihTS19QTV9QQUNLRVRfUEFUVEVSTikpIHsKKworCQkJKnBMZW4gPSBzaXplb2YoU0tfUE1fUEFDS0VUX1BBVFRFUk4pOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworCisgICAgY2FzZSBPSURfUE5QX0VOQUJMRV9XQUtFX1VQOgorICAgICAgICBpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTMyKSkgeworCisgICAgICAgICAgICAqcExlbiA9IHNpemVvZihTS19VMzIpOworICAgICAgICAgICAgcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKwkKKyAgICAvKgorCSAqIFBlcmZvcm0gYWN0aW9uCisJICovCisJaWYgKEFjdGlvbiA9PSBTS19QTk1JX0dFVCkgeworCisJCS8qCisJCSAqIEdldCB2YWx1ZQorCQkgKi8KKwkJc3dpdGNoIChJZCkgeworCisJCWNhc2UgT0lEX1BOUF9DQVBBQklMSVRJRVM6CisJCQlSZXRDb2RlID0gU2tQb3dlclF1ZXJ5UG5QQ2FwYWJpbGl0aWVzKHBBQywgSW9DLCBwQnVmLCBwTGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1BOUF9RVUVSWV9QT1dFUjoKKwkJCS8qIFRoZSBXaW5kb3dzIERESyBkZXNjcmliZXM6IEFuIE9JRF9QTlBfUVVFUllfUE9XRVIgcmVxdWVzdHMKKwkJCSB0aGUgbWluaXBvcnQgdG8gaW5kaWNhdGUgd2hldGhlciBpdCBjYW4gdHJhbnNpdGlvbiBpdHMgTklDCisJCQkgdG8gdGhlIGxvdy1wb3dlciBzdGF0ZS4KKwkJCSBBIG1pbmlwb3J0IGRyaXZlciBtdXN0IGFsd2F5cyByZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUworCQkJIHRvIGEgcXVlcnkgb2YgT0lEX1BOUF9RVUVSWV9QT1dFUi4gKi8KKwkJCSpwTGVuID0gc2l6ZW9mKFNLX0RFVklDRV9QT1dFUl9TVEFURSk7CisgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfT0s7CisJCQlicmVhazsKKworCQkJLyogTkRJUyBoYW5kbGVzIHRoZXNlIE9JRHMgYXMgd3JpdGUtb25seS4KKwkJCSAqIFNvIGluIGNhc2Ugb2YgZ2V0IGFjdGlvbiB0aGUgYnVmZmVyIHdpdGggd3JpdHRlbiBsZW5ndGggPSAwCisJCQkgKiBpcyByZXR1cm5lZAorCQkJICovCisJCWNhc2UgT0lEX1BOUF9TRVRfUE9XRVI6CisJCWNhc2UgT0lEX1BOUF9BRERfV0FLRV9VUF9QQVRURVJOOgorCQljYXNlIE9JRF9QTlBfUkVNT1ZFX1dBS0VfVVBfUEFUVEVSTjoKKwkJCSpwTGVuID0gMDsJCisgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfTk9UX1NVUFBPUlRFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1BOUF9FTkFCTEVfV0FLRV9VUDoKKwkJCVJldENvZGUgPSBTa1Bvd2VyR2V0RW5hYmxlV2FrZVVwKHBBQywgSW9DLCBwQnVmLCBwTGVuKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfR0VORVJBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0dXJuIChSZXRDb2RlKTsKKwl9CisJCisKKwkvKgorCSAqIFBlcmZvcm0gcHJlc2V0IG9yIHNldAorCSAqLworCQorCS8qIFBPV0VSIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IFBSRVNFVCBhY3Rpb24gKi8KKwlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCX0KKworCXN3aXRjaCAoSWQpIHsKKwljYXNlIE9JRF9QTlBfU0VUX1BPV0VSOgorCQlSZXRDb2RlID0gU2tQb3dlclNldFBvd2VyKHBBQywgSW9DLCBwQnVmLCBwTGVuKTsJCisJCWJyZWFrOworCisJY2FzZSBPSURfUE5QX0FERF9XQUtFX1VQX1BBVFRFUk46CisJCVJldENvZGUgPSBTa1Bvd2VyQWRkV2FrZVVwUGF0dGVybihwQUMsIElvQywgcEJ1ZiwgcExlbik7CQorCQlicmVhazsKKwkJCisJY2FzZSBPSURfUE5QX1JFTU9WRV9XQUtFX1VQX1BBVFRFUk46CisJCVJldENvZGUgPSBTa1Bvd2VyUmVtb3ZlV2FrZVVwUGF0dGVybihwQUMsIElvQywgcEJ1ZiwgcExlbik7CQorCQlicmVhazsKKwkJCisJY2FzZSBPSURfUE5QX0VOQUJMRV9XQUtFX1VQOgorCQlSZXRDb2RlID0gU2tQb3dlclNldEVuYWJsZVdha2VVcChwQUMsIElvQywgcEJ1ZiwgcExlbik7CisJCWJyZWFrOworCQkKKwlkZWZhdWx0OgorCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfUkVBRF9PTkxZOworCX0KKwkKKwlyZXR1cm4gKFJldENvZGUpOworfQorI2VuZGlmIC8qIFNLX1BPV0VSX01HTVQgKi8KKworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGlhZ0FjdGlvbnMgLSBPSUQgaGFuZGxlciBmdW5jdGlvbiBvZiBEaWFnbm9zdGljIGRyaXZlciAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBjb2RlIGlzIHNpbXBsZS4gTm8gZGVzY3JpcHRpb24gbmVjZXNzYXJ5LgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCisKK1BOTUlfU1RBVElDIGludCBEaWFnQWN0aW9ucygKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBwQnVmIGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCisJU0tfVTMyCURpYWdTdGF0dXM7CisJU0tfVTMyCVJldENvZGUgPSBTS19QTk1JX0VSUl9HRU5FUkFMOworCisJLyoKKwkgKiBDaGVjayBpbnN0YW5jZS4gV2Ugb25seSBoYW5kbGUgc2luZ2xlIGluc3RhbmNlIHZhcmlhYmxlcy4KKwkgKi8KKwlpZiAoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpICYmIEluc3RhbmNlICE9IDEpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGxlbmd0aC4KKwkgKi8KKwlzd2l0Y2ggKElkKSB7CisKKwljYXNlIE9JRF9TS0dFX0RJQUdfTU9ERToKKwkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1UzMikpIHsKKworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwNDAsIFNLX1BOTUlfRVJSMDQwTVNHKTsKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCX0KKworCS8qIFBlcmZvcm0gYWN0aW9uLiAqLworCisJLyogR0VUIHZhbHVlLiAqLworCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9HRVQpIHsKKworCQlzd2l0Y2ggKElkKSB7CisKKwkJY2FzZSBPSURfU0tHRV9ESUFHX01PREU6CisJCQlEaWFnU3RhdHVzID0gcEFDLT5Qbm1pLkRpYWdBdHRhY2hlZDsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIERpYWdTdGF0dXMpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsJCisJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfT0s7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJKnBMZW4gPSAwOwkKKwkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9HRU5FUkFMOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIChSZXRDb2RlKTsgCisJfQorCisJLyogRnJvbSBoZXJlIFNFVCBvciBQUkVTRVQgdmFsdWUuICovCisJCisJLyogUFJFU0VUIHZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQuICovCisJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsgCisJfQorCisJLyogU0VUIHZhbHVlLiAqLworCXN3aXRjaCAoSWQpIHsKKwkJY2FzZSBPSURfU0tHRV9ESUFHX01PREU6CisKKwkJCS8qIEhhbmRsZSB0aGUgU0VULiAqLworCQkJc3dpdGNoICgqcEJ1ZikgeworCisJCQkJLyogQXR0YWNoIHRoZSBESUFHIHRvIHRoaXMgYWRhcHRlci4gKi8KKwkJCQljYXNlIFNLX0RJQUdfQVRUQUNIRUQ6CisJCQkJCS8qIENoZWNrIGlmIHdlIGNvbWUgZnJvbSBydW5uaW5nICovCisJCQkJCWlmIChwQUMtPlBubWkuRGlhZ0F0dGFjaGVkID09IFNLX0RJQUdfUlVOTklORykgeworCisJCQkJCQlSZXRDb2RlID0gU2tEcnZMZWF2ZURpYWdNb2RlKHBBQyk7CisKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQUMtPlBubWkuRGlhZ0F0dGFjaGVkID09IFNLX0RJQUdfSURMRSkgeworCisJCQkJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfT0s7CisJCQkJCX0JCisJCQkJCQorCQkJCQllbHNlIHsKKworCQkJCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX0dFTkVSQUw7CisKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKFJldENvZGUgPT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQkJCQkJcEFDLT5Qbm1pLkRpYWdBdHRhY2hlZCA9IFNLX0RJQUdfQVRUQUNIRUQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQkvKiBFbnRlciB0aGUgRElBRyBtb2RlIGluIHRoZSBkcml2ZXIuICovCisJCQkJY2FzZSBTS19ESUFHX1JVTk5JTkc6CisJCQkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9PSzsKKwkJCQkJCisJCQkJCS8qCisJCQkJCSAqIElmIERpYWdBdHRhY2hlZCBpcyBzZXQsIHdlIGNhbiB0ZWxsIHRoZSBkcml2ZXIKKwkJCQkJICogdG8gZW50ZXIgdGhlIERJQUcgbW9kZS4KKwkJCQkJICovCisJCQkJCWlmIChwQUMtPlBubWkuRGlhZ0F0dGFjaGVkID09IFNLX0RJQUdfQVRUQUNIRUQpIHsKKwkJCQkJCS8qIElmIERpYWdNb2RlIGlzIG5vdCBhY3RpdmUsIHdlIGNhbiBlbnRlciBpdC4gKi8KKwkJCQkJCWlmICghcEFDLT5EaWFnTW9kZUFjdGl2ZSkgeworCisJCQkJCQkJUmV0Q29kZSA9IFNrRHJ2RW50ZXJEaWFnTW9kZShwQUMpOyAKKwkJCQkJCX0KKwkJCQkJCWVsc2UgeworCisJCQkJCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX0dFTkVSQUw7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSB7CisKKwkJCQkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9HRU5FUkFMOworCQkJCQl9CisJCQkJCQorCQkJCQlpZiAoUmV0Q29kZSA9PSBTS19QTk1JX0VSUl9PSykgeworCisJCQkJCQlwQUMtPlBubWkuRGlhZ0F0dGFjaGVkID0gU0tfRElBR19SVU5OSU5HOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBTS19ESUFHX0lETEU6CisJCQkJCS8qIENoZWNrIGlmIHdlIGNvbWUgZnJvbSBydW5uaW5nICovCisJCQkJCWlmIChwQUMtPlBubWkuRGlhZ0F0dGFjaGVkID09IFNLX0RJQUdfUlVOTklORykgeworCisJCQkJCQlSZXRDb2RlID0gU2tEcnZMZWF2ZURpYWdNb2RlKHBBQyk7CisKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQUMtPlBubWkuRGlhZ0F0dGFjaGVkID09IFNLX0RJQUdfQVRUQUNIRUQpIHsKKworCQkJCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX09LOworCQkJCQl9CQorCQkJCQkKKwkJCQkJZWxzZSB7CisKKwkJCQkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9HRU5FUkFMOworCisJCQkJCX0KKworCQkJCQlpZiAoUmV0Q29kZSA9PSBTS19QTk1JX0VSUl9PSykgeworCisJCQkJCQlwQUMtPlBubWkuRGlhZ0F0dGFjaGVkID0gU0tfRElBR19JRExFOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX0JBRF9WQUxVRTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX0dFTkVSQUw7CisJfQorCisJaWYgKFJldENvZGUgPT0gU0tfUE5NSV9FUlJfT0spIHsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwl9CisJZWxzZSB7CisKKwkJKnBMZW4gPSAwOworCX0KKwlyZXR1cm4gKFJldENvZGUpOworfQorI2VuZGlmIC8qIFNLX0RJQUdfU1VQUE9SVCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBWY3QgLSBPSUQgaGFuZGxlciBmdW5jdGlvbiBvZiAgT0lEcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIGNvZGUgaXMgc2ltcGxlLiBObyBkZXNjcmlwdGlvbiBuZWNlc3NhcnkuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgcGVyZm9ybWVkIHN1Y2Nlc3NmdWxseS4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIpLgorICoJU0tfUE5NSV9FUlJfUkVBRF9PTkxZCSBPbmx5IHRoZSBHZXQgYWN0aW9uIGlzIGFsbG93ZWQuCisgKgorICovCisKK1BOTUlfU1RBVElDIGludCBWY3QoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogcEJ1ZiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgtMSwyLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisJU0tfUE5NSV9WQ1QJKnBWY3RCYWNrdXBEYXRhOworCVNLX1UzMgkJTG9nUG9ydE1heDsKKwlTS19VMzIJCVBoeXNQb3J0TWF4OworCVNLX1UzMgkJUGh5c1BvcnRJbmRleDsKKwlTS19VMzIJCUxpbWl0OworCVNLX1UzMgkJT2Zmc2V0OworCVNLX0JPT0wJCUxpbms7CisJU0tfVTMyCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfR0VORVJBTDsKKwlpbnQJCWk7CisJU0tfRVZQQVJBCVBhcmE7CisJU0tfVTMyCQlDYWJsZUxlbmd0aDsKKwkKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgcG9ydCBpbmRleGVzIGZyb20gdGhlIGluc3RhbmNlLgorCSAqLworCVBoeXNQb3J0TWF4ID0gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCUxvZ1BvcnRNYXggPSBTS19QTk1JX1BPUlRfUEhZUzJMT0coUGh5c1BvcnRNYXgpOworCQorCS8qIER1YWwgbmV0IG1vZGU/ICovCisJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCUxvZ1BvcnRNYXgtLTsKKwl9CisJCisJaWYgKChJbnN0YW5jZSAhPSAoU0tfVTMyKSAoLTEpKSkgeworCQkvKiBDaGVjayBpbnN0YW5jZSByYW5nZS4gKi8KKwkJaWYgKChJbnN0YW5jZSA8IDIpIHx8IChJbnN0YW5jZSA+IExvZ1BvcnRNYXgpKSB7CisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJCX0KKwkJCisJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJUGh5c1BvcnRJbmRleCA9IE5ldEluZGV4OworCQl9CisJCWVsc2UgeworCQkJUGh5c1BvcnRJbmRleCA9IEluc3RhbmNlIC0gMjsKKwkJfQorCQlMaW1pdCA9IFBoeXNQb3J0SW5kZXggKyAxOworCX0KKwllbHNlIHsKKwkJLyoKKwkJICogSW5zdGFuY2UgPT0gKFNLX1UzMikgKC0xKSwgZ2V0IGFsbCBJbnN0YW5jZXMgb2YgdGhhdCBPSUQuCisJCSAqCisJCSAqIE5vdCBpbXBsZW1lbnRlZCB5ZXQuIE1heSBiZSB1c2VkIGluIGZ1dHVyZSByZWxlYXNlcy4KKwkJICovCisJCVBoeXNQb3J0SW5kZXggPSAwOworCQlMaW1pdCA9IFBoeXNQb3J0TWF4OworCX0KKwkKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XTsKKwlpZiAocFBydC0+UEhXTGlua1VwKSB7CisJCUxpbmsgPSBTS19UUlVFOworCX0KKwllbHNlIHsKKwkJTGluayA9IFNLX0ZBTFNFOworCX0KKwkKKwkvKiBDaGVjayBNQUMgdHlwZSAqLworCWlmIChwUHJ0LT5QaHlUeXBlICE9IFNLX1BIWV9NQVJWX0NPUFBFUikgeworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJfQorCQorCS8qIEluaXRpYWxpemUgYmFja3VwIGRhdGEgcG9pbnRlci4gKi8KKwlwVmN0QmFja3VwRGF0YSA9ICZwQUMtPlBubWkuVmN0QmFja3VwW1BoeXNQb3J0SW5kZXhdOworCQorCS8qIENoZWNrIGFjdGlvbiB0eXBlICovCisJaWYgKEFjdGlvbiA9PSBTS19QTk1JX0dFVCkgeworCQkvKiBDaGVjayBsZW5ndGggKi8KKwkJc3dpdGNoIChJZCkgeworCQkKKwkJY2FzZSBPSURfU0tHRV9WQ1RfR0VUOgorCQkJaWYgKCpwTGVuIDwgKExpbWl0IC0gUGh5c1BvcnRJbmRleCkgKiBzaXplb2YoU0tfUE5NSV9WQ1QpKSB7CisJCQkJKnBMZW4gPSAoTGltaXQgLSBQaHlzUG9ydEluZGV4KSAqIHNpemVvZihTS19QTk1JX1ZDVCk7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCQkJYnJlYWs7CisJCQorCQljYXNlIE9JRF9TS0dFX1ZDVF9TVEFUVVM6CisJCQlpZiAoKnBMZW4gPCAoTGltaXQgLSBQaHlzUG9ydEluZGV4KSAqIHNpemVvZihTS19VOCkpIHsKKwkJCQkqcExlbiA9IChMaW1pdCAtIFBoeXNQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1U4KTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisJCQlicmVhazsKKwkJCisJCWRlZmF1bHQ6CisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CQorCQkKKwkJLyogR2V0IHZhbHVlICovCisJCU9mZnNldCA9IDA7CisJCWZvciAoOyBQaHlzUG9ydEluZGV4IDwgTGltaXQ7IFBoeXNQb3J0SW5kZXgrKykgeworCQkJc3dpdGNoIChJZCkgeworCQkJCisJCQljYXNlIE9JRF9TS0dFX1ZDVF9HRVQ6CisJCQkJaWYgKChMaW5rID09IFNLX0ZBTFNFKSAmJgorCQkJCQkocEFDLT5Qbm1pLlZjdFN0YXR1c1tQaHlzUG9ydEluZGV4XSAmIFNLX1BOTUlfVkNUX1BFTkRJTkcpKSB7CisJCQkJCVJldENvZGUgPSBTa0dtQ2FibGVEaWFnU3RhdHVzKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LCBTS19GQUxTRSk7CisJCQkJCWlmIChSZXRDb2RlID09IDApIHsKKwkJCQkJCXBBQy0+UG5taS5WY3RTdGF0dXNbUGh5c1BvcnRJbmRleF0gJj0gflNLX1BOTUlfVkNUX1BFTkRJTkc7CisJCQkJCQlwQUMtPlBubWkuVmN0U3RhdHVzW1BoeXNQb3J0SW5kZXhdIHw9CisJCQkJCQkJKFNLX1BOTUlfVkNUX05FV19WQ1RfREFUQSB8IFNLX1BOTUlfVkNUX1RFU1RfRE9ORSk7CisJCQkJCQkKKwkJCQkJCS8qIENvcHkgcmVzdWx0cyBmb3IgbGF0ZXIgdXNlIHRvIFBOTUkgc3RydWN0LiAqLworCQkJCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgIHsKKwkJCQkJCQlpZiAocFBydC0+UE1kaVBhaXJTdHNbaV0gPT0gU0tfUE5NSV9WQ1RfTk9STUFMX0NBQkxFKSB7CisJCQkJCQkJCWlmICgocFBydC0+UE1kaVBhaXJMZW5baV0gPiAzNSkgJiYgKHBQcnQtPlBNZGlQYWlyTGVuW2ldIDwgMHhmZikpIHsKKwkJCQkJCQkJCXBQcnQtPlBNZGlQYWlyU3RzW2ldID0gU0tfUE5NSV9WQ1RfSU1QRURBTkNFX01JU01BVENIOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWlmICgocFBydC0+UE1kaVBhaXJMZW5baV0gPiAzNSkgJiYgKHBQcnQtPlBNZGlQYWlyTGVuW2ldICE9IDB4ZmYpKSB7CisJCQkJCQkJCUNhYmxlTGVuZ3RoID0gMTAwMCAqICgoKDE3NSAqIHBQcnQtPlBNZGlQYWlyTGVuW2ldKSAvIDIxMCkgLSAyOCk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgeworCQkJCQkJCQlDYWJsZUxlbmd0aCA9IDA7CisJCQkJCQkJfQorCQkJCQkJCXBWY3RCYWNrdXBEYXRhLT5QTWRpUGFpckxlbltpXSA9IENhYmxlTGVuZ3RoOworCQkJCQkJCXBWY3RCYWNrdXBEYXRhLT5QTWRpUGFpclN0c1tpXSA9IHBQcnQtPlBNZGlQYWlyU3RzW2ldOworCQkJCQkJfQorCisJCQkJCQlQYXJhLlBhcmEzMlswXSA9IFBoeXNQb3J0SW5kZXg7CisJCQkJCQlQYXJhLlBhcmEzMlsxXSA9IC0xOworCQkJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX1JFU0VULCBQYXJhKTsKKwkJCQkJCVNrRXZlbnREaXNwYXRjaGVyKHBBQywgSW9DKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCTsgLyogVkNUIHRlc3QgaXMgcnVubmluZy4gKi8KKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQkvKiBHZXQgYWxsIHJlc3VsdHMuICovCisJCQkJQ2hlY2tWY3RTdGF0dXMocEFDLCBJb0MsIHBCdWYsIE9mZnNldCwgUGh5c1BvcnRJbmRleCk7CisJCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VOCk7CisJCQkJKihwQnVmICsgT2Zmc2V0KSA9IHBQcnQtPlBDYWJsZUxlbjsKKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U4KTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSAgeworCQkJCQlTS19QTk1JX1NUT1JFX1UzMigocEJ1ZiArIE9mZnNldCksIHBWY3RCYWNrdXBEYXRhLT5QTWRpUGFpckxlbltpXSk7CisJCQkJCU9mZnNldCArPSBzaXplb2YoU0tfVTMyKTsKKwkJCQl9CisJCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgIHsKKwkJCQkJKihwQnVmICsgT2Zmc2V0KSA9IHBWY3RCYWNrdXBEYXRhLT5QTWRpUGFpclN0c1tpXTsKKwkJCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VOCk7CisJCQkJfQorCQkJCQorCQkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9PSzsKKwkJCQlicmVhazsKKwkJCisJCQljYXNlIE9JRF9TS0dFX1ZDVF9TVEFUVVM6CisJCQkJQ2hlY2tWY3RTdGF0dXMocEFDLCBJb0MsIHBCdWYsIE9mZnNldCwgUGh5c1BvcnRJbmRleCk7CisJCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VOCk7CisJCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX09LOworCQkJCWJyZWFrOworCQkJCisJCQlkZWZhdWx0OgorCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCQl9IC8qIGZvciAqLworCQkqcExlbiA9IE9mZnNldDsKKwkJcmV0dXJuIChSZXRDb2RlKTsKKwkKKwl9IC8qIGlmIFNLX1BOTUlfR0VUICovCisJCisJLyoKKwkgKiBGcm9tIGhlcmUgU0VUIG9yIFBSRVNFVCBhY3Rpb24uIENoZWNrIGlmIHRoZSBwYXNzZWQKKwkgKiBidWZmZXIgbGVuZ3RoIGlzIHBsYXVzaWJsZS4KKwkgKi8KKwkKKwkvKiBDaGVjayBsZW5ndGggKi8KKwlzd2l0Y2ggKElkKSB7CisJY2FzZSBPSURfU0tHRV9WQ1RfU0VUOgorCQlpZiAoKnBMZW4gPCAoTGltaXQgLSBQaHlzUG9ydEluZGV4KSAqIHNpemVvZihTS19VMzIpKSB7CisJCQkqcExlbiA9IChMaW1pdCAtIFBoeXNQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1UzMik7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisJCisJZGVmYXVsdDoKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCX0KKwkKKwkvKgorCSAqIFBlcmZvcm0gcHJlc2V0IG9yIHNldC4KKwkgKi8KKwkKKwkvKiBWQ1QgZG9lcyBub3Qgc3VwcG9ydCBQUkVTRVQgYWN0aW9uLiAqLworCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJfQorCQorCU9mZnNldCA9IDA7CisJZm9yICg7IFBoeXNQb3J0SW5kZXggPCBMaW1pdDsgUGh5c1BvcnRJbmRleCsrKSB7CisJCXN3aXRjaCAoSWQpIHsKKwkJY2FzZSBPSURfU0tHRV9WQ1RfU0VUOiAvKiBTdGFydCBWQ1QgdGVzdC4gKi8KKwkJCWlmIChMaW5rID09IFNLX0ZBTFNFKSB7CisJCQkJU2tHZVN0b3BQb3J0KHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LCBTS19TVE9QX0FMTCwgU0tfU09GVF9SU1QpOworCQkJCQorCQkJCVJldENvZGUgPSBTa0dtQ2FibGVEaWFnU3RhdHVzKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LCBTS19UUlVFKTsKKwkJCQlpZiAoUmV0Q29kZSA9PSAwKSB7IC8qIFJldENvZGU6IDAgPT4gU3RhcnQhICovCisJCQkJCXBBQy0+UG5taS5WY3RTdGF0dXNbUGh5c1BvcnRJbmRleF0gfD0gU0tfUE5NSV9WQ1RfUEVORElORzsKKwkJCQkJcEFDLT5Qbm1pLlZjdFN0YXR1c1tQaHlzUG9ydEluZGV4XSAmPSB+U0tfUE5NSV9WQ1RfTkVXX1ZDVF9EQVRBOworCQkJCQlwQUMtPlBubWkuVmN0U3RhdHVzW1BoeXNQb3J0SW5kZXhdICY9IH5TS19QTk1JX1ZDVF9MSU5LOworCQkJCQkKKwkJCQkJLyoKKwkJCQkJICogU3RhcnQgVkNUIHRpbWVyIGNvdW50ZXIuCisJCQkJCSAqLworCQkJCQlTS19NRU1TRVQoKGNoYXIgKikgJlBhcmEsIDAsIHNpemVvZihQYXJhKSk7CisJCQkJCVBhcmEuUGFyYTMyWzBdID0gUGh5c1BvcnRJbmRleDsKKwkJCQkJUGFyYS5QYXJhMzJbMV0gPSAtMTsKKwkJCQkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5Qbm1pLlZjdFRpbWVvdXRbUGh5c1BvcnRJbmRleF0uVmN0VGltZXIsCisJCQkJCQk0MDAwMDAwLCBTS0dFX1BOTUksIFNLX1BOTUlfRVZUX1ZDVF9SRVNFVCwgUGFyYSk7CisJCQkJCVNLX1BOTUlfU1RPUkVfVTMyKChwQnVmICsgT2Zmc2V0KSwgUmV0Q29kZSk7CisJCQkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9PSzsKKwkJCQl9CisJCQkJZWxzZSB7IC8qIFJldENvZGU6IDIgPT4gUnVubmluZyEgKi8KKwkJCQkJU0tfUE5NSV9TVE9SRV9VMzIoKHBCdWYgKyBPZmZzZXQpLCBSZXRDb2RlKTsKKwkJCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX09LOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeyAvKiBSZXRDb2RlOiA0ID0+IExpbmshICovCisJCQkJUmV0Q29kZSA9IDQ7CisJCQkJU0tfUE5NSV9TVE9SRV9VMzIoKHBCdWYgKyBPZmZzZXQpLCBSZXRDb2RlKTsKKwkJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfT0s7CisJCQl9CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1UzMik7CisJCQlicmVhazsKKwkKKwkJZGVmYXVsdDoKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKwl9IC8qIGZvciAqLworCSpwTGVuID0gT2Zmc2V0OworCXJldHVybiAoUmV0Q29kZSk7CisKK30gLyogVmN0ICovCisKKworUE5NSV9TVEFUSUMgdm9pZCBDaGVja1ZjdFN0YXR1cygKK1NLX0FDCQkqcEFDLAorU0tfSU9DCQlJb0MsCitjaGFyCQkqcEJ1ZiwKK1NLX1UzMgkJT2Zmc2V0LAorU0tfVTMyCQlQaHlzUG9ydEluZGV4KQoreworCVNLX0dFUE9SVCAJKnBQcnQ7CisJU0tfUE5NSV9WQ1QJKnBWY3REYXRhOworCVNLX1UzMgkJUmV0Q29kZTsKKwkKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XTsKKwkKKwlwVmN0RGF0YSA9IChTS19QTk1JX1ZDVCAqKSAocEJ1ZiArIE9mZnNldCk7CisJcFZjdERhdGEtPlZjdFN0YXR1cyA9IFNLX1BOTUlfVkNUX05PTkU7CisJCisJaWYgKCFwUHJ0LT5QSFdMaW5rVXApIHsKKwkJCisJCS8qIFdhcyBhIFZDVCB0ZXN0IGV2ZXIgbWFkZSBiZWZvcmU/ICovCisJCWlmIChwQUMtPlBubWkuVmN0U3RhdHVzW1BoeXNQb3J0SW5kZXhdICYgU0tfUE5NSV9WQ1RfVEVTVF9ET05FKSB7CisJCQlpZiAoKHBBQy0+UG5taS5WY3RTdGF0dXNbUGh5c1BvcnRJbmRleF0gJiBTS19QTk1JX1ZDVF9MSU5LKSkgeworCQkJCXBWY3REYXRhLT5WY3RTdGF0dXMgfD0gU0tfUE5NSV9WQ1RfT0xEX1ZDVF9EQVRBOworCQkJfQorCQkJZWxzZSB7CisJCQkJcFZjdERhdGEtPlZjdFN0YXR1cyB8PSBTS19QTk1JX1ZDVF9ORVdfVkNUX0RBVEE7CisJCQl9CisJCX0KKwkJCisJCS8qIENoZWNrIFZDVCB0ZXN0IHN0YXR1cy4gKi8KKwkJUmV0Q29kZSA9IFNrR21DYWJsZURpYWdTdGF0dXMocEFDLElvQywgUGh5c1BvcnRJbmRleCwgU0tfRkFMU0UpOworCQlpZiAoUmV0Q29kZSA9PSAyKSB7IC8qIFZDVCB0ZXN0IGlzIHJ1bm5pbmcuICovCisJCQlwVmN0RGF0YS0+VmN0U3RhdHVzIHw9IFNLX1BOTUlfVkNUX1JVTk5JTkc7CisJCX0KKwkJZWxzZSB7IC8qIFZDVCBkYXRhIHdhcyBjb3BpZWQgdG8gcEFDIGhlcmUuIENoZWNrIFBFTkRJTkcgc3RhdGUuICovCisJCQlpZiAocEFDLT5Qbm1pLlZjdFN0YXR1c1tQaHlzUG9ydEluZGV4XSAmIFNLX1BOTUlfVkNUX1BFTkRJTkcpIHsKKwkJCQlwVmN0RGF0YS0+VmN0U3RhdHVzIHw9IFNLX1BOTUlfVkNUX05FV19WQ1RfREFUQTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKHBQcnQtPlBDYWJsZUxlbiAhPSAweGZmKSB7IC8qIE9sZCBEU1AgdmFsdWUuICovCisJCQlwVmN0RGF0YS0+VmN0U3RhdHVzIHw9IFNLX1BOTUlfVkNUX09MRF9EU1BfREFUQTsKKwkJfQorCX0KKwllbHNlIHsKKwkJCisJCS8qIFdhcyBhIFZDVCB0ZXN0IGV2ZXIgbWFkZSBiZWZvcmU/ICovCisJCWlmIChwQUMtPlBubWkuVmN0U3RhdHVzW1BoeXNQb3J0SW5kZXhdICYgU0tfUE5NSV9WQ1RfVEVTVF9ET05FKSB7CisJCQlwVmN0RGF0YS0+VmN0U3RhdHVzICY9IH5TS19QTk1JX1ZDVF9ORVdfVkNUX0RBVEE7CisJCQlwVmN0RGF0YS0+VmN0U3RhdHVzIHw9IFNLX1BOTUlfVkNUX09MRF9WQ1RfREFUQTsKKwkJfQorCQkKKwkJLyogRFNQIG9ubHkgdmFsaWQgaW4gMTAwLzEwMDAgbW9kZXMuICovCisJCWlmIChwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUExpbmtTcGVlZFVzZWQgIT0KKwkJCVNLX0xTUEVFRF9TVEFUXzEwTUJQUykgewkKKwkJCXBWY3REYXRhLT5WY3RTdGF0dXMgfD0gU0tfUE5NSV9WQ1RfTkVXX0RTUF9EQVRBOworCQl9CisJfQorfSAvKiBDaGVja1ZjdFN0YXR1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgU2tQbm1pR2VuSW9jdGwgLSBIYW5kbGVzIG5ldyBnZW5lcmljIFBOTUkgSU9DVEwsIGNhbGxzIHRoZSBuZWVkZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICBQTk1JIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiB0aGUgc3ViY29tbWFuZCBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGFsbCBkYXRhIGJlbG9uZ2luZyB0byB0aGUgY29tcGxldGUgZGF0YWJhc2UKKyAqICAgICAgICAgICAgICAgICAgICAgICBvciBPSUQgcmVxdWVzdC4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUxvb2tzIHVwIHRoZSByZXF1ZXN0ZWQgc3ViY29tbWFuZCwgY2FsbHMgdGhlIGNvcnJlc3BvbmRpbmcgaGFuZGxlcgorICoJZnVuY3Rpb24gYW5kIHBhc3NlcyBhbGwgcmVxdWlyZWQgcGFyYW1ldGVycyB0byBpdC4KKyAqCVRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGRyaXZlci4gSXQgaXMgbmVlZGVkIHRvIGhhbmRsZSB0aGUgbmV3CisgKiAgZ2VuZXJpYyBQTk1JIElPQ1RMLiBUaGlzIElPQ1RMIGlzIGdpdmVuIHRvIHRoZSBkcml2ZXIgYW5kIGNvbnRhaW5zIGJvdGgKKyAqICB0aGUgT0lEIGFuZCBhIHN1YmNvbW1hbmQgdG8gZGVjaWRlIHdoYXQga2luZCBvZiByZXF1ZXN0IGhhcyB0byBiZSBkb25lLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQKKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQKKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gdGFrZQorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXRhLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9PSUQgIFRoZSByZXF1ZXN0ZWQgT0lEIGlzIHVua25vd24KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK2ludCBTa1BubWlHZW5Jb2N0bCgKK1NLX0FDCQkqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgc3RydWN0ICovCitTS19JT0MJCUlvQywJCS8qIEkvTyBjb250ZXh0ICovCit2b2lkCQkqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCQkvKiBMZW5ndGggb2YgYnVmZmVyICovCitTS19VMzIJCU5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworU0tfSTMyCU1vZGU7CQkJLyogU3RvcmUgdmFsdWUgb2Ygc3ViY29tbWFuZC4gKi8KK1NLX1UzMglPaWQ7CQkJLyogU3RvcmUgdmFsdWUgb2YgT0lELiAqLworaW50CQlSZXR1cm5Db2RlOwkJLyogU3RvcmUgcmV0dXJuIHZhbHVlIHRvIHNob3cgc3RhdHVzIG9mIFBOTUkgYWN0aW9uLiAqLworaW50IAlIZWFkZXJMZW5ndGg7CS8qIExlbmd0aCBvZiBkZXNpcmVkIGFjdGlvbiBwbHVzIE9JRC4gKi8KKworCVJldHVybkNvZGUgPSBTS19QTk1JX0VSUl9HRU5FUkFMOworCQorCVNLX01FTUNQWSgmTW9kZSwgcEJ1Ziwgc2l6ZW9mKFNLX0kzMikpOworCVNLX01FTUNQWSgmT2lkLCAoY2hhciAqKSBwQnVmICsgc2l6ZW9mKFNLX0kzMiksIHNpemVvZihTS19VMzIpKTsKKwlIZWFkZXJMZW5ndGggPSBzaXplb2YoU0tfSTMyKSArIHNpemVvZihTS19VMzIpOworCSpwTGVuID0gKnBMZW4gLSBIZWFkZXJMZW5ndGg7CisJU0tfTUVNQ1BZKChjaGFyICopIHBCdWYgKyBzaXplb2YoU0tfSTMyKSwgKGNoYXIgKikgcEJ1ZiArIEhlYWRlckxlbmd0aCwgKnBMZW4pOworCQorCXN3aXRjaChNb2RlKSB7CisJY2FzZSBTS19HRVRfU0lOR0xFX1ZBUjoKKwkJUmV0dXJuQ29kZSA9IFNrUG5taUdldFZhcihwQUMsIElvQywgT2lkLCAKKwkJCQkoY2hhciAqKSBwQnVmICsgc2l6ZW9mKFNLX0kzMiksIHBMZW4sCisJCQkJKChTS19VMzIpICgtMSkpLCBOZXRJbmRleCk7CisJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFJldHVybkNvZGUpOworCQkqcExlbiA9ICpwTGVuICsgc2l6ZW9mKFNLX0kzMik7CisJCWJyZWFrOworCWNhc2UgU0tfUFJFU0VUX1NJTkdMRV9WQVI6CisJCVJldHVybkNvZGUgPSBTa1BubWlQcmVTZXRWYXIocEFDLCBJb0MsIE9pZCwgCisJCQkJKGNoYXIgKikgcEJ1ZiArIHNpemVvZihTS19JMzIpLCBwTGVuLAorCQkJCSgoU0tfVTMyKSAoLTEpKSwgTmV0SW5kZXgpOworCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBSZXR1cm5Db2RlKTsKKwkJKnBMZW4gPSAqcExlbiArIHNpemVvZihTS19JMzIpOworCQlicmVhazsKKwljYXNlIFNLX1NFVF9TSU5HTEVfVkFSOgorCQlSZXR1cm5Db2RlID0gU2tQbm1pU2V0VmFyKHBBQywgSW9DLCBPaWQsIAorCQkJCShjaGFyICopIHBCdWYgKyBzaXplb2YoU0tfSTMyKSwgcExlbiwKKwkJCQkoKFNLX1UzMikgKC0xKSksIE5ldEluZGV4KTsKKwkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgUmV0dXJuQ29kZSk7CisJCSpwTGVuID0gKnBMZW4gKyBzaXplb2YoU0tfSTMyKTsKKwkJYnJlYWs7CisJY2FzZSBTS19HRVRfRlVMTF9NSUI6CisJCVJldHVybkNvZGUgPSBTa1BubWlHZXRTdHJ1Y3QocEFDLCBJb0MsIHBCdWYsIHBMZW4sIE5ldEluZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBTS19QUkVTRVRfRlVMTF9NSUI6CisJCVJldHVybkNvZGUgPSBTa1BubWlQcmVTZXRTdHJ1Y3QocEFDLCBJb0MsIHBCdWYsIHBMZW4sIE5ldEluZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBTS19TRVRfRlVMTF9NSUI6CisJCVJldHVybkNvZGUgPSBTa1BubWlTZXRTdHJ1Y3QocEFDLCBJb0MsIHBCdWYsIHBMZW4sIE5ldEluZGV4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCQorCXJldHVybiAoUmV0dXJuQ29kZSk7CisKK30gLyogU2tHZUlvY0dlbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlc2lycS5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlc2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NTIwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2VzaXJxLmMKQEAgLTAsMCArMSwyMjUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tnZXNpcnEuYworICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgQ29tbW9uIE1vZHVsZXMKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS45MiAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wOS8xNiAxNDozNzowNyAkCisgKiBQdXJwb3NlOglTcGVjaWFsIElSUSBtb2R1bGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0LgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCVNwZWNpYWwgSW50ZXJydXB0IGhhbmRsZXIKKyAqCisgKglUaGUgZm9sbG93aW5nIGFic3RyYWN0IHNob3VsZCBzaG93IGhvdyB0aGlzIG1vZHVsZSBpcyBpbmNsdWRlZAorICoJaW4gdGhlIGRyaXZlciBwYXRoOgorICoKKyAqCUluIHRoZSBJU1Igb2YgdGhlIGRyaXZlciB0aGUgYml0cyBmb3IgZnJhbWUgdHJhbnNtaXNzaW9uIGNvbXBsZXRlIGFuZAorICoJZm9yIHJlY2VpdmUgY29tcGxldGUgYXJlIGNoZWNrZWQgYW5kIGhhbmRsZWQgYnkgdGhlIGRyaXZlciBpdHNlbGYuCisgKglUaGUgYml0cyBvZiB0aGUgc2xvdyBwYXRoIG1hc2sgYXJlIGNoZWNrZWQgYWZ0ZXIgdGhhdCBhbmQgdGhlbiB0aGUKKyAqCWVudHJ5IGludG8gdGhlIHNvLWNhbGxlZCAic2xvdyBwYXRoIiBpcyBwcmVwYXJlZC4gSXQgaXMgYW4gaW1wbGVtZW50b3JzCisgKglkZWNpc2lvbiB3aGV0aGVyIHRoaXMgaXMgZXhlY3V0ZWQgZGlyZWN0bHkgb3IganVzdCBzY2hlZHVsZWQgYnkKKyAqCWRpc2FibGluZyB0aGUgbWFzay4gSW4gdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgc29tZSBldmVudHMgbWF5IGJlCisgKglnZW5lcmF0ZWQsIHNvIGl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhIHRvIGNhbGwgdGhlIEV2ZW50RGlzcGF0Y2hlcgorICoJcmlnaHQgYWZ0ZXIgdGhpcyBJU1IuCisgKgorICoJVGhlIEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgb2YgdGhlIGFkYXB0ZXIgaXMgTk9UIHJlYWQgYnkgdGhpcyBtb2R1bGUuCisgKiAgU08gaWYgdGhlIGRyaXZlcnMgaW1wbGVtZW50b3IgbmVlZHMgYSB3aGlsZSBsb29wIGFyb3VuZCB0aGUKKyAqCXNsb3cgZGF0YSBwYXRocyBpbnRlcnJ1cHQgYml0cywgaGUgbmVlZHMgdG8gY2FsbCB0aGUgU2tHZVNpcnFJc3IoKSBmb3IKKyAqCWVhY2ggbG9vcCBlbnRlcmVkLgorICoKKyAqCUhvd2V2ZXIsIHRoZSBNQUMgSW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcnMgYXJlIHJlYWQgaW4gYSB3aGlsZSBsb29wLgorICoKKyAqLworCisjaWYgKGRlZmluZWQoREVCVUcpIHx8ICgoIWRlZmluZWQoTElOVCkpICYmICghZGVmaW5lZChTS19TTElNKSkpKQorc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0KKwkiQCgjKSAkSWQ6IHNrZ2VzaXJxLmMsdiAxLjkyIDIwMDMvMDkvMTYgMTQ6Mzc6MDcgcnNjaG1pZHQgRXhwICQgKEMpIE1hcnZlbGwuIjsKKyNlbmRpZgorCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgkJLyogRHJpdmVyIFNwZWNpZmljIERlZmluaXRpb25zICovCisjaWZuZGVmIFNLX1NMSU0KKyNpbmNsdWRlICJoL3NrZ2Vwbm1pLmgiCQkvKiBQTk1JIERlZmluaXRpb25zICovCisjaW5jbHVkZSAiaC9za3JsbXQuaCIJCS8qIFJMTVQgRGVmaW5pdGlvbnMgKi8KKyNlbmRpZgorI2luY2x1ZGUgImgvc2tkcnYybmQuaCIJCS8qIEFkYXB0ZXIgQ29udHJvbCBhbmQgRHJpdmVyIHNwZWNpZmljIERlZi4gKi8KKworLyogbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworI2lmZGVmIEdFTkVTSVMKK3N0YXRpYyBpbnQJU2tHZVBvcnRDaGVja1VwWG1hYyhTS19BQyosIFNLX0lPQywgaW50LCBTS19CT09MKTsKK3N0YXRpYyBpbnQJU2tHZVBvcnRDaGVja1VwQmNvbShTS19BQyosIFNLX0lPQywgaW50LCBTS19CT09MKTsKK3N0YXRpYyB2b2lkCVNrUGh5SXNyQmNvbShTS19BQyosIFNLX0lPQywgaW50LCBTS19VMTYpOworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKyNpZmRlZiBZVUtPTgorc3RhdGljIGludAlTa0dlUG9ydENoZWNrVXBHbWFjKFNLX0FDKiwgU0tfSU9DLCBpbnQsIFNLX0JPT0wpOworc3RhdGljIHZvaWQJU2tQaHlJc3JHbWFjKFNLX0FDKiwgU0tfSU9DLCBpbnQsIFNLX1UxNik7CisjZW5kaWYgLyogWVVLT04gKi8KKyNpZmRlZiBPVEhFUl9QSFkKK3N0YXRpYyBpbnQJU2tHZVBvcnRDaGVja1VwTG9uZShTS19BQyosIFNLX0lPQywgaW50LCBTS19CT09MKTsKK3N0YXRpYyBpbnQJU2tHZVBvcnRDaGVja1VwTmF0KFNLX0FDKiwgU0tfSU9DLCBpbnQsIFNLX0JPT0wpOworc3RhdGljIHZvaWQJU2tQaHlJc3JMb25lKFNLX0FDKiwgU0tfSU9DLCBpbnQsIFNLX1UxNik7CisjZW5kaWYgLyogT1RIRVJfUEhZICovCisKKyNpZmRlZiBHRU5FU0lTCisvKgorICogYXJyYXkgb2YgUnggY291bnRlciBmcm9tIFhNQUMgd2hpY2ggYXJlIGNoZWNrZWQKKyAqIGluIEF1dG9TZW5zZSBtb2RlIHRvIGNoZWNrIHdoZXRoZXIgYSBsaW5rIGlzIG5vdCBhYmxlIHRvIGF1dG8tbmVnb3RpYXRlLgorICovCitzdGF0aWMgY29uc3QgU0tfVTE2IFNrR2VSeFJlZ3NbXT0geworCVhNX1JYRl82NEIsCisJWE1fUlhGXzEyN0IsCisJWE1fUlhGXzI1NUIsCisJWE1fUlhGXzUxMUIsCisJWE1fUlhGXzEwMjNCLAorCVhNX1JYRl9NQVhfU1oKK30gOworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKworI2lmZGVmIF9fQzJNQU5fXworLyoKKyAqCVNwZWNpYWwgSVJRIGZ1bmN0aW9uCisgKgorICoJR2VuZXJhbCBEZXNjcmlwdGlvbjoKKyAqCisgKi8KK2ludHJvKCkKK3t9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrSFdJbml0RGVmU2Vuc2UoKSAtIERlZmF1bHQgQXV0b3NlbnNpbmcgbW9kZSBpbml0aWFsaXphdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOiBzZXRzIHRoZSBQTGlua01vZGUgZm9yIEhXSW5pdAorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBTa0hXSW5pdERlZlNlbnNlKAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJcFBydC0+UEF1dG9OZWdUaW1lT3V0ID0gMDsKKworCWlmIChwUHJ0LT5QTGlua01vZGVDb25mICE9IFNLX0xNT0RFX0FVVE9TRU5TRSkgeworCQlwUHJ0LT5QTGlua01vZGUgPSBwUHJ0LT5QTGlua01vZGVDb25mOworCQlyZXR1cm47CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCSgiQXV0b1NlbnNpbmc6IEZpcnN0IG1vZGUgJWQgb24gUG9ydCAlZFxuIiwKKwkJKGludClTS19MTU9ERV9BVVRPRlVMTCwgUG9ydCkpOworCisJcFBydC0+UExpbmtNb2RlID0gKFNLX1U4KVNLX0xNT0RFX0FVVE9GVUxMOworCisJcmV0dXJuOworfQkvKiBTa0hXSW5pdERlZlNlbnNlICovCisKKworI2lmZGVmIEdFTkVTSVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0hXU2Vuc2VHZXROZXh0KCkgLSBHZXQgTmV4dCBBdXRvc2Vuc2luZyBNb2RlCisgKgorICogRGVzY3JpcHRpb246IGdldHMgdGhlIGFwcHJvcHJpYXRlIG5leHQgbW9kZQorICoKKyAqIE5vdGU6CisgKgorICovCitzdGF0aWMgU0tfVTggU2tIV1NlbnNlR2V0TmV4dCgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCXBQcnQtPlBBdXRvTmVnVGltZU91dCA9IDA7CisKKyAgICBpZiAocFBydC0+UExpbmtNb2RlQ29uZiAhPSAoU0tfVTgpU0tfTE1PREVfQVVUT1NFTlNFKSB7CisJCS8qIExlYXZlIGFsbCBhcyBjb25maWd1cmVkICovCisJCXJldHVybihwUHJ0LT5QTGlua01vZGVDb25mKTsKKwl9CisKKyAgICBpZiAocFBydC0+UExpbmtNb2RlID09IChTS19VOClTS19MTU9ERV9BVVRPRlVMTCkgeworCQkvKiBSZXR1cm4gbmV4dCBtb2RlIEFVVE9CT1RIICovCisgICAgICAgIHJldHVybiAoKFNLX1U4KVNLX0xNT0RFX0FVVE9CT1RIKTsKKwl9CisKKwkvKiBSZXR1cm4gZGVmYXVsdCBhdXRvZnVsbCAqLworICAgIHJldHVybiAoKFNLX1U4KVNLX0xNT0RFX0FVVE9GVUxMKTsKK30JLyogU2tIV1NlbnNlR2V0TmV4dCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0hXU2Vuc2VTZXROZXh0KCkgLSBBdXRvc2Vuc2luZyBTZXQgbmV4dCBtb2RlCisgKgorICogRGVzY3JpcHRpb246CXNldHMgdGhlIGFwcHJvcHJpYXRlIG5leHQgbW9kZQorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBTa0hXU2Vuc2VTZXROZXh0KAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK1NLX1U4CU5ld01vZGUpCS8qIE5ldyBNb2RlIHRvIGJlIHdyaXR0ZW4gaW4gc2Vuc2UgbW9kZSAqLworeworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlwUHJ0LT5QQXV0b05lZ1RpbWVPdXQgPSAwOworCisgICAgaWYgKHBQcnQtPlBMaW5rTW9kZUNvbmYgIT0gKFNLX1U4KVNLX0xNT0RFX0FVVE9TRU5TRSkgeworCQlyZXR1cm47CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCSgiQXV0b1NlbnNpbmc6IG5leHQgbW9kZSAlZCBvbiBQb3J0ICVkXG4iLAorCQkoaW50KU5ld01vZGUsIFBvcnQpKTsKKworCXBQcnQtPlBMaW5rTW9kZSA9IE5ld01vZGU7CisKKwlyZXR1cm47Cit9CS8qIFNrSFdTZW5zZVNldE5leHQgKi8KKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrSFdMaW5rRG93bigpIC0gTGluayBEb3duIGhhbmRsaW5nCisgKgorICogRGVzY3JpcHRpb246IGhhbmRsZXMgdGhlIGhhcmR3YXJlIGxpbmsgZG93biBzaWduYWwKKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLwordm9pZCBTa0hXTGlua0Rvd24oCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwkvKiBEaXNhYmxlIGFsbCBNQUMgaW50ZXJydXB0cyAqLworCVNrTWFjSXJxRGlzYWJsZShwQUMsIElvQywgUG9ydCk7CisKKwkvKiBEaXNhYmxlIFJlY2VpdmVyIGFuZCBUcmFuc21pdHRlciAqLworCVNrTWFjUnhUeERpc2FibGUocEFDLCBJb0MsIFBvcnQpOworCQorCS8qIEluaXQgZGVmYXVsdCBzZW5zZSBtb2RlICovCisJU2tIV0luaXREZWZTZW5zZShwQUMsIElvQywgUG9ydCk7CisKKwlpZiAocFBydC0+UEhXTGlua1VwID09IFNLX0ZBTFNFKSB7CisJCXJldHVybjsKKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJKCJMaW5rIGRvd24gUG9ydCAlZFxuIiwgUG9ydCkpOworCisJLyogU2V0IExpbmsgdG8gRE9XTiAqLworCXBQcnQtPlBIV0xpbmtVcCA9IFNLX0ZBTFNFOworCisJLyogUmVzZXQgUG9ydCBzdGF0aSAqLworICAgIHBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9IChTS19VOClTS19MTU9ERV9TVEFUX1VOS05PV047CisgICAgcFBydC0+UEZsb3dDdHJsU3RhdHVzID0gKFNLX1U4KVNLX0ZMT1dfU1RBVF9OT05FOworCXBQcnQtPlBMaW5rU3BlZWRVc2VkID0gKFNLX1U4KVNLX0xTUEVFRF9TVEFUX0lOREVURVJNSU5BVEVEOworCisJLyogUmUtaW5pdCBQaHkgZXNwZWNpYWxseSB3aGVuIHRoZSBBdXRvU2Vuc2UgZGVmYXVsdCBpcyBzZXQgbm93ICovCisJU2tNYWNJbml0UGh5KHBBQywgSW9DLCBQb3J0LCBTS19GQUxTRSk7CisKKwkvKiBHUDA6IHVzZWQgZm9yIHdvcmthcm91bmQgb2YgUmV2LiBDIEVycmF0YSAyICovCisKKwkvKiBEbyBOT1Qgc2lnbmFsIHRvIFJMTVQgKi8KKworCS8qIERvIE5PVCBzdGFydCB0aGUgdGltZXIgaGVyZSAqLworfQkvKiBTa0hXTGlua0Rvd24gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tIV0xpbmtVcCgpIC0gTGluayBVcCBoYW5kbGluZworICoKKyAqIERlc2NyaXB0aW9uOiBoYW5kbGVzIHRoZSBoYXJkd2FyZSBsaW5rIHVwIHNpZ25hbAorICoKKyAqIFJldHVybnM6IE4vQQorICovCit2b2lkIFNrSFdMaW5rVXAoCitTS19BQwkqcEFDLAkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAocFBydC0+UEhXTGlua1VwKSB7CisJCS8qIFdlIGRvIE5PVCBuZWVkIHRvIHByb2NlZWQgb24gYWN0aXZlIGxpbmsgKi8KKwkJcmV0dXJuOworCX0KKworCXBQcnQtPlBIV0xpbmtVcCA9IFNLX1RSVUU7CisJcFBydC0+UEF1dG9OZWdGYWlsID0gU0tfRkFMU0U7CisgICAgcFBydC0+UExpbmtNb2RlU3RhdHVzID0gKFNLX1U4KVNLX0xNT0RFX1NUQVRfVU5LTk9XTjsKKworICAgIGlmIChwUHJ0LT5QTGlua01vZGUgIT0gKFNLX1U4KVNLX0xNT0RFX0FVVE9IQUxGICYmCisgICAgICAgIHBQcnQtPlBMaW5rTW9kZSAhPSAoU0tfVTgpU0tfTE1PREVfQVVUT0ZVTEwgJiYKKyAgICAgICAgcFBydC0+UExpbmtNb2RlICE9IChTS19VOClTS19MTU9ERV9BVVRPQk9USCkgeworCQkvKiBMaW5rIGlzIHVwIGFuZCBubyBBdXRvLW5lZ290aWF0aW9uIHNob3VsZCBiZSBkb25lICovCisKKwkJLyogTGluayBzcGVlZCBzaG91bGQgYmUgdGhlIGNvbmZpZ3VyZWQgb25lICovCisJCXN3aXRjaCAocFBydC0+UExpbmtTcGVlZCkgeworCQljYXNlIFNLX0xTUEVFRF9BVVRPOgorCQkJLyogZGVmYXVsdCBpcyAxMDAwIE1icHMgKi8KKwkJY2FzZSBTS19MU1BFRURfMTAwME1CUFM6CisJCQlwUHJ0LT5QTGlua1NwZWVkVXNlZCA9IChTS19VOClTS19MU1BFRURfU1RBVF8xMDAwTUJQUzsKKwkJCWJyZWFrOworCQljYXNlIFNLX0xTUEVFRF8xMDBNQlBTOgorCQkJcFBydC0+UExpbmtTcGVlZFVzZWQgPSAoU0tfVTgpU0tfTFNQRUVEX1NUQVRfMTAwTUJQUzsKKwkJCWJyZWFrOworCQljYXNlIFNLX0xTUEVFRF8xME1CUFM6CisJCQlwUHJ0LT5QTGlua1NwZWVkVXNlZCA9IChTS19VOClTS19MU1BFRURfU1RBVF8xME1CUFM7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFNldCBMaW5rIE1vZGUgU3RhdHVzICovCisJCWlmIChwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfRlVMTCkgeworCQkJcFBydC0+UExpbmtNb2RlU3RhdHVzID0gKFNLX1U4KVNLX0xNT0RFX1NUQVRfRlVMTDsKKwkJfQorCQllbHNlIHsKKyAgICAgICAgICAgIHBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9IChTS19VOClTS19MTU9ERV9TVEFUX0hBTEY7CisJCX0KKworCQkvKiBObyBmbG93IGNvbnRyb2wgd2l0aG91dCBhdXRvLW5lZ290aWF0aW9uICovCisgICAgICAgIHBQcnQtPlBGbG93Q3RybFN0YXR1cyA9IChTS19VOClTS19GTE9XX1NUQVRfTk9ORTsKKworCQkvKiBlbmFibGUgUngvVHggKi8KKyAgICAgICAgKHZvaWQpU2tNYWNSeFR4RW5hYmxlKHBBQywgSW9DLCBQb3J0KTsKKwl9Cit9CS8qIFNrSFdMaW5rVXAgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNQYXJpdHkoKSAtIE1BQyBwYXJpdHkgd29ya2Fyb3VuZAorICoKKyAqIERlc2NyaXB0aW9uOiBoYW5kbGVzIE1BQyBwYXJpdHkgZXJyb3JzIGNvcnJlY3RseQorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBTa01hY1Bhcml0eSgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkvKiBQb3J0IEluZGV4IG9mIHRoZSBwb3J0IGZhaWxlZCAqLworeworCVNLX0VWUEFSQQlQYXJhOworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCVNLX1UzMgkJVHhNYXg7CQkvKiBUeCBNYXggU2l6ZSBDb3VudGVyICovCisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCS8qIENsZWFyIElSUSBUeCBQYXJpdHkgRXJyb3IgKi8KKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKworCQlTS19PVVQxNihJb0MsIE1SX0FERFIoUG9ydCwgVFhfTUZGX0NUUkwxKSwgTUZGX0NMUl9QRVJSKTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCS8qIEhXLUJ1ZyAjODogY2xlYXJlZCBieSBHTUZfQ0xJX1RYX0ZDIGluc3RlYWQgb2YgR01GX0NMSV9UWF9QRSAqLworCQlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBUWF9HTUZfQ1RSTF9UKSwKKwkJCShTS19VOCkoKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX1lVS09OICYmCisJCQlwQUMtPkdJbmkuR0lDaGlwUmV2ID09IDApID8gR01GX0NMSV9UWF9GQyA6IEdNRl9DTElfVFhfUEUpKTsKKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKwkKKwlpZiAocFBydC0+UENoZWNrUGFyKSB7CisKKwkJaWYgKFBvcnQgPT0gTUFDXzEpIHsKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfU0lSUV9FMDE2LCBTS0VSUl9TSVJRX0UwMTZNU0cpOworCQl9CisJCWVsc2UgeworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9TSVJRX0UwMTcsIFNLRVJSX1NJUlFfRTAxN01TRyk7CisJCX0KKwkJUGFyYS5QYXJhNjQgPSBQb3J0OworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1BPUlRfRkFJTCwgUGFyYSk7CisJCQorCQlQYXJhLlBhcmEzMlswXSA9IFBvcnQ7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCisJCXJldHVybjsKKwl9CisKKwkvKiBDaGVjayB3aGV0aGVyIGZyYW1lcyB3aXRoIGEgc2l6ZSBvZiAxayB3ZXJlIHNlbnQgKi8KKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJLyogU25hcCBzdGF0aXN0aWMgY291bnRlcnMgKi8KKwkJKHZvaWQpU2tYbVVwZGF0ZVN0YXRzKHBBQywgSW9DLCBQb3J0KTsKKwkJCisJCSh2b2lkKVNrWG1NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBvcnQsIFhNX1RYRl9NQVhfU1osICZUeE1heCk7CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCisJCSh2b2lkKVNrR21NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBvcnQsIEdNX1RYRl8xNTE4QiwgJlR4TWF4KTsKKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKwkKKwlpZiAoVHhNYXggPiAwKSB7CisJCS8qIEZyb20gbm93IG9uIGNoZWNrIHRoZSBwYXJpdHkgKi8KKwkJcFBydC0+UENoZWNrUGFyID0gU0tfVFJVRTsKKwl9Cit9CS8qIFNrTWFjUGFyaXR5ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VId0VycigpIC0gSGFyZHdhcmUgRXJyb3Igc2VydmljZSByb3V0aW5lCisgKgorICogRGVzY3JpcHRpb246IGhhbmRsZXMgYWxsIEhXIEVycm9yIGludGVycnVwdHMKKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLworc3RhdGljIHZvaWQgU2tHZUh3RXJyKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK1NLX1UzMglId1N0YXR1cykJLyogSW50ZXJydXB0IHN0YXR1cyB3b3JkICovCit7CisJU0tfRVZQQVJBCVBhcmE7CisJU0tfVTE2CQlXb3JkOworCisJaWYgKChId1N0YXR1cyAmIChJU19JUlFfTVNUX0VSUiB8IElTX0lSUV9TVEFUKSkgIT0gMCkgeworCQkvKiBQQ0kgRXJyb3JzIG9jY3VyZWQgKi8KKwkJaWYgKChId1N0YXR1cyAmIElTX0lSUV9TVEFUKSAhPSAwKSB7CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX1NJUlFfRTAxMywgU0tFUlJfU0lSUV9FMDEzTVNHKTsKKwkJfQorCQllbHNlIHsKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfU0lSUV9FMDEyLCBTS0VSUl9TSVJRX0UwMTJNU0cpOworCQl9CisKKwkJLyogUmVzZXQgYWxsIGJpdHMgaW4gdGhlIFBDSSBTVEFUVVMgcmVnaXN0ZXIgKi8KKwkJU0tfSU4xNihJb0MsIFBDSV9DKFBDSV9TVEFUVVMpLCAmV29yZCk7CisJCQorCQlTS19PVVQ4KElvQywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09OKTsKKyAgICAgICAgU0tfT1VUMTYoSW9DLCBQQ0lfQyhQQ0lfU1RBVFVTKSwgKFNLX1UxNikoV29yZCB8IFBDSV9FUlJCSVRTKSk7CisJCVNLX09VVDgoSW9DLCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT0ZGKTsKKworCQlQYXJhLlBhcmE2NCA9IDA7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfQURBUF9GQUlMLCBQYXJhKTsKKwl9CisKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKworCQlpZiAoKEh3U3RhdHVzICYgSVNfTk9fU1RBVF9NMSkgIT0gMCkgeworCQkJLyogSWdub3JlIGl0ICovCisJCQkvKiBUaGlzIHNpdHVhdGlvbiBpcyBhbHNvIGluZGljYXRlZCBpbiB0aGUgZGVzY3JpcHRvciAqLworCQkJU0tfT1VUMTYoSW9DLCBNUl9BRERSKE1BQ18xLCBSWF9NRkZfQ1RSTDEpLCBNRkZfQ0xSX0lOU1RBVCk7CisJCX0KKworCQlpZiAoKEh3U3RhdHVzICYgSVNfTk9fU1RBVF9NMikgIT0gMCkgeworCQkJLyogSWdub3JlIGl0ICovCisJCQkvKiBUaGlzIHNpdHVhdGlvbiBpcyBhbHNvIGluZGljYXRlZCBpbiB0aGUgZGVzY3JpcHRvciAqLworCQkJU0tfT1VUMTYoSW9DLCBNUl9BRERSKE1BQ18yLCBSWF9NRkZfQ1RSTDEpLCBNRkZfQ0xSX0lOU1RBVCk7CisJCX0KKworCQlpZiAoKEh3U3RhdHVzICYgSVNfTk9fVElTVF9NMSkgIT0gMCkgeworCQkJLyogSWdub3JlIGl0ICovCisJCQkvKiBUaGlzIHNpdHVhdGlvbiBpcyBhbHNvIGluZGljYXRlZCBpbiB0aGUgZGVzY3JpcHRvciAqLworCQkJU0tfT1VUMTYoSW9DLCBNUl9BRERSKE1BQ18xLCBSWF9NRkZfQ1RSTDEpLCBNRkZfQ0xSX0lOVElTVCk7CisJCX0KKworCQlpZiAoKEh3U3RhdHVzICYgSVNfTk9fVElTVF9NMikgIT0gMCkgeworCQkJLyogSWdub3JlIGl0ICovCisJCQkvKiBUaGlzIHNpdHVhdGlvbiBpcyBhbHNvIGluZGljYXRlZCBpbiB0aGUgZGVzY3JpcHRvciAqLworCQkJU0tfT1VUMTYoSW9DLCBNUl9BRERSKE1BQ18yLCBSWF9NRkZfQ1RSTDEpLCBNRkZfQ0xSX0lOVElTVCk7CisJCX0KKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCS8qIFRoaXMgaXMgbmVjZXNzYXJ5IG9ubHkgZm9yIFJ4IHRpbWluZyBtZWFzdXJlbWVudHMgKi8KKwkJaWYgKChId1N0YXR1cyAmIElTX0lSUV9USVNUX09WKSAhPSAwKSB7CisJCQkvKiBpbmNyZW1lbnQgVGltZSBTdGFtcCBUaW1lciBjb3VudGVyIChoaWdoKSAqLworCQkJcEFDLT5HSW5pLkdJVGltZVN0YW1wQ250Kys7CisKKwkJCS8qIENsZWFyIFRpbWUgU3RhbXAgVGltZXIgSVJRICovCisJCQlTS19PVVQ4KElvQywgR01BQ19USV9TVF9DVFJMLCAoU0tfVTgpR01UX1NUX0NMUl9JUlEpOworCQl9CisKKwkJaWYgKChId1N0YXR1cyAmIElTX0lSUV9TRU5TT1IpICE9IDApIHsKKwkJCS8qIG5vIHNlbnNvcnMgb24gMzItYml0IFl1a29uICovCisJCQlpZiAocEFDLT5HSW5pLkdJWXVrb24zMkJpdCkgeworCQkJCS8qIGRpc2FibGUgSFcgRXJyb3IgSVJRICovCisJCQkJcEFDLT5HSW5pLkdJVmFsSXJxTWFzayAmPSB+SVNfSFdfRVJSOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8qIFlVS09OICovCisKKwlpZiAoKEh3U3RhdHVzICYgSVNfUkFNX1JEX1BBUikgIT0gMCkgeworCQlTS19PVVQxNihJb0MsIEIzX1JJX0NUUkwsIFJJX0NMUl9SRF9QRVJSKTsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9TSVJRX0UwMTQsIFNLRVJSX1NJUlFfRTAxNE1TRyk7CisJCVBhcmEuUGFyYTY0ID0gMDsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9BREFQX0ZBSUwsIFBhcmEpOworCX0KKworCWlmICgoSHdTdGF0dXMgJiBJU19SQU1fV1JfUEFSKSAhPSAwKSB7CisJCVNLX09VVDE2KElvQywgQjNfUklfQ1RSTCwgUklfQ0xSX1dSX1BFUlIpOworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX1NJUlFfRTAxNSwgU0tFUlJfU0lSUV9FMDE1TVNHKTsKKwkJUGFyYS5QYXJhNjQgPSAwOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX0FEQVBfRkFJTCwgUGFyYSk7CisJfQorCisJaWYgKChId1N0YXR1cyAmIElTX00xX1BBUl9FUlIpICE9IDApIHsKKwkJU2tNYWNQYXJpdHkocEFDLCBJb0MsIE1BQ18xKTsKKwl9CisKKwlpZiAoKEh3U3RhdHVzICYgSVNfTTJfUEFSX0VSUikgIT0gMCkgeworCQlTa01hY1Bhcml0eShwQUMsIElvQywgTUFDXzIpOworCX0KKworCWlmICgoSHdTdGF0dXMgJiBJU19SMV9QQVJfRVJSKSAhPSAwKSB7CisJCS8qIENsZWFyIElSUSAqLworCQlTS19PVVQzMihJb0MsIEIwX1IxX0NTUiwgQ1NSX0lSUV9DTF9QKTsKKworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX1NJUlFfRTAxOCwgU0tFUlJfU0lSUV9FMDE4TVNHKTsKKwkJUGFyYS5QYXJhNjQgPSBNQUNfMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX0ZBSUwsIFBhcmEpOworCQkKKwkJUGFyYS5QYXJhMzJbMF0gPSBNQUNfMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisJfQorCisJaWYgKChId1N0YXR1cyAmIElTX1IyX1BBUl9FUlIpICE9IDApIHsKKwkJLyogQ2xlYXIgSVJRICovCisJCVNLX09VVDMyKElvQywgQjBfUjJfQ1NSLCBDU1JfSVJRX0NMX1ApOworCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfU0lSUV9FMDE5LCBTS0VSUl9TSVJRX0UwMTlNU0cpOworCQlQYXJhLlBhcmE2NCA9IE1BQ18yOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1BPUlRfRkFJTCwgUGFyYSk7CisJCQorCQlQYXJhLlBhcmEzMlswXSA9IE1BQ18yOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKwl9Cit9CS8qIFNrR2VId0VyciAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlU2lycUlzcigpIC0gU3BlY2lhbCBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lCisgKgorICogRGVzY3JpcHRpb246IGhhbmRsZXMgYWxsIG5vbiBkYXRhIHRyYW5zZmVyIHNwZWNpZmljIGludGVycnVwdHMgKHNsb3cgcGF0aCkKKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLwordm9pZCBTa0dlU2lycUlzcigKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitTS19VMzIJSXN0YXR1cykJLyogSW50ZXJydXB0IHN0YXR1cyB3b3JkICovCit7CisJU0tfRVZQQVJBCVBhcmE7CisJU0tfVTMyCQlSZWdWYWwzMjsJLyogUmVhZCByZWdpc3RlciB2YWx1ZSAqLworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCVNLX1UxNiAJCVBoeUludDsKKwlpbnQJCQlpOworCisJaWYgKCgoSXN0YXR1cyAmIElTX0hXX0VSUikgJiBwQUMtPkdJbmkuR0lWYWxJcnFNYXNrKSAhPSAwKSB7CisJCS8qIHJlYWQgdGhlIEhXIEVycm9yIEludGVycnVwdCBzb3VyY2UgKi8KKwkJU0tfSU4zMihJb0MsIEIwX0hXRV9JU1JDLCAmUmVnVmFsMzIpOworCQkKKwkJU2tHZUh3RXJyKHBBQywgSW9DLCBSZWdWYWwzMik7CisJfQorCisJLyoKKwkgKiBQYWNrZXQgVGltZW91dCBpbnRlcnJ1cHRzCisJICovCisJLyogQ2hlY2sgd2hldGhlciBNQUNzIGFyZSBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgKi8KKwlpZiAoKChJc3RhdHVzICYgKElTX1BBX1RPX1JYMSB8IElTX1BBX1RPX1RYMSkpICE9IDApICYmCisJCXBBQy0+R0luaS5HUFtNQUNfMV0uUFN0YXRlID09IFNLX1BSVF9SRVNFVCkgeworCQkvKiBNQUMgMSB3YXMgbm90IGluaXRpYWxpemVkIGJ1dCBQYWNrZXQgdGltZW91dCBvY2N1cmVkICovCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX1NJUlFfRTAwNCwKKwkJCVNLRVJSX1NJUlFfRTAwNE1TRyk7CisJfQorCisJaWYgKCgoSXN0YXR1cyAmIChJU19QQV9UT19SWDIgfCBJU19QQV9UT19UWDIpKSAhPSAwKSAmJgorCSAgICBwQUMtPkdJbmkuR1BbTUFDXzJdLlBTdGF0ZSA9PSBTS19QUlRfUkVTRVQpIHsKKwkJLyogTUFDIDIgd2FzIG5vdCBpbml0aWFsaXplZCBidXQgUGFja2V0IHRpbWVvdXQgb2NjdXJlZCAqLworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9TSVJRX0UwMDUsCisJCQlTS0VSUl9TSVJRX0UwMDVNU0cpOworCX0KKworCWlmICgoSXN0YXR1cyAmIElTX1BBX1RPX1JYMSkgIT0gMCkgeworCQkvKiBNZWFucyBuZXR3b3JrIGlzIGZpbGxpbmcgdXMgdXAgKi8KKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfU0lSUV9FMDAyLAorCQkJU0tFUlJfU0lSUV9FMDAyTVNHKTsKKwkJU0tfT1VUMTYoSW9DLCBCM19QQV9DVFJMLCBQQV9DTFJfVE9fUlgxKTsKKwl9CisKKwlpZiAoKElzdGF0dXMgJiBJU19QQV9UT19SWDIpICE9IDApIHsKKwkJLyogTWVhbnMgbmV0d29yayBpcyBmaWxsaW5nIHVzIHVwICovCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX1NJUlFfRTAwMywKKwkJCVNLRVJSX1NJUlFfRTAwM01TRyk7CisJCVNLX09VVDE2KElvQywgQjNfUEFfQ1RSTCwgUEFfQ0xSX1RPX1JYMik7CisJfQorCisJaWYgKChJc3RhdHVzICYgSVNfUEFfVE9fVFgxKSAhPSAwKSB7CisJCQorCQlwUHJ0ID0gJnBBQy0+R0luaS5HUFswXTsKKworCQkvKiBNYXkgYmUgYSBub3JtYWwgc2l0dWF0aW9uIGluIGEgc2VydmVyIHdpdGggYSBzbG93IG5ldHdvcmsgKi8KKwkJU0tfT1VUMTYoSW9DLCBCM19QQV9DVFJMLCBQQV9DTFJfVE9fVFgxKTsKKworI2lmZGVmIEdFTkVTSVMKKwkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCS8qCisJCQkgKiB3b3JrYXJvdW5kOiBpZiBpbiBoYWxmIGR1cGxleCBtb2RlLCBjaGVjayBmb3IgVHggaGFuZ3VwLgorCQkJICogUmVhZCBudW1iZXIgb2YgVFgnZWQgYnl0ZXMsIHdhaXQgZm9yIDEwIG1zLCB0aGVuIGNvbXBhcmUKKwkJCSAqIHRoZSBudW1iZXIgd2l0aCBjdXJyZW50IHZhbHVlLiBJZiBub3RoaW5nIGNoYW5nZWQsIHdlIGFzc3VtZQorCQkJICogdGhhdCBUeCBpcyBoYW5naW5nIGFuZCBkbyBhIEZJRk8gZmx1c2ggKHNlZSBldmVudCByb3V0aW5lKS4KKwkJCSAqLworCQkJaWYgKChwUHJ0LT5QTGlua01vZGVTdGF0dXMgPT0gU0tfTE1PREVfU1RBVF9IQUxGIHx8CisJCQkJcFBydC0+UExpbmtNb2RlU3RhdHVzID09IFNLX0xNT0RFX1NUQVRfQVVUT0hBTEYpICYmCisJCQkJIXBQcnQtPkhhbGZEdXBUaW1lckFjdGl2ZSkgeworCQkJCS8qCisJCQkJICogbWFueSBtb3JlIHBhY2suIGFyYi4gdGltZW91dHMgbWF5IGNvbWUgaW4gYmV0d2VlbiwKKwkJCQkgKiB3ZSBpZ25vcmUgdGhvc2UKKwkJCQkgKi8KKwkJCQlwUHJ0LT5IYWxmRHVwVGltZXJBY3RpdmUgPSBTS19UUlVFOworI2lmZGVmIFhYWAorCQkJCUxlbiA9IHNpemVvZihTS19VNjQpOworCQkJCVNrUG5taUdldFZhcihwQUMsIElvQywgT0lEX1NLR0VfU1RBVF9UWF9PQ1RFVFMsIChjaGFyICopJk9jdGV0cywKKwkJCQkJJkxlbiwgKFNLX1UzMilTS19QTk1JX1BPUlRfUEhZUzJJTlNUKHBBQywgMCksCisJCQkJCXBBQy0+UmxtdC5Qb3J0WzBdLk5ldC0+TmV0TnVtYmVyKTsKKwkJCQkKKwkJCQlwUHJ0LT5MYXN0T2N0ZXRzID0gT2N0ZXRzOworI2VuZGlmIC8qIFhYWCAqLworCQkJCS8qIFNuYXAgc3RhdGlzdGljIGNvdW50ZXJzICovCisJCQkJKHZvaWQpU2tYbVVwZGF0ZVN0YXRzKHBBQywgSW9DLCAwKTsKKworCQkJCSh2b2lkKVNrWG1NYWNTdGF0aXN0aWMocEFDLCBJb0MsIDAsIFhNX1RYT19PS19ISSwgJlJlZ1ZhbDMyKTsKKworCQkJCXBQcnQtPkxhc3RPY3RldHMgPSAoU0tfVTY0KVJlZ1ZhbDMyIDw8IDMyOworCQkJCQorCQkJCSh2b2lkKVNrWG1NYWNTdGF0aXN0aWMocEFDLCBJb0MsIDAsIFhNX1RYT19PS19MTywgJlJlZ1ZhbDMyKTsKKworCQkJCXBQcnQtPkxhc3RPY3RldHMgKz0gUmVnVmFsMzI7CisJCQkJCisJCQkJUGFyYS5QYXJhMzJbMF0gPSAwOworCQkJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBQcnQtPkhhbGZEdXBDaGtUaW1lciwgU0tfSEFMRkRVUF9DSEtfVElNRSwKKwkJCQkJU0tHRV9IV0FDLCBTS19IV0VWX0hBTEZEVVBfQ0hLLCBQYXJhKTsKKwkJCX0KKwkJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwl9CisKKwlpZiAoKElzdGF0dXMgJiBJU19QQV9UT19UWDIpICE9IDApIHsKKwkJCisJCXBQcnQgPSAmcEFDLT5HSW5pLkdQWzFdOworCisJCS8qIE1heSBiZSBhIG5vcm1hbCBzaXR1YXRpb24gaW4gYSBzZXJ2ZXIgd2l0aCBhIHNsb3cgbmV0d29yayAqLworCQlTS19PVVQxNihJb0MsIEIzX1BBX0NUUkwsIFBBX0NMUl9UT19UWDIpOworCisjaWZkZWYgR0VORVNJUworCQlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkJLyogd29ya2Fyb3VuZDogc2VlIGFib3ZlICovCisJCQlpZiAoKHBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9PSBTS19MTU9ERV9TVEFUX0hBTEYgfHwKKwkJCQkgcFBydC0+UExpbmtNb2RlU3RhdHVzID09IFNLX0xNT0RFX1NUQVRfQVVUT0hBTEYpICYmCisJCQkJIXBQcnQtPkhhbGZEdXBUaW1lckFjdGl2ZSkgeworCQkJCXBQcnQtPkhhbGZEdXBUaW1lckFjdGl2ZSA9IFNLX1RSVUU7CisjaWZkZWYgWFhYCisJCQkJTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCQkJU2tQbm1pR2V0VmFyKHBBQywgSW9DLCBPSURfU0tHRV9TVEFUX1RYX09DVEVUUywgKGNoYXIgKikmT2N0ZXRzLAorCQkJCQkmTGVuLCAoU0tfVTMyKVNLX1BOTUlfUE9SVF9QSFlTMklOU1QocEFDLCAxKSwKKwkJCQkJcEFDLT5SbG10LlBvcnRbMV0uTmV0LT5OZXROdW1iZXIpOworCQkJCQorCQkJCXBQcnQtPkxhc3RPY3RldHMgPSBPY3RldHM7CisjZW5kaWYgLyogWFhYICovCisJCQkJLyogU25hcCBzdGF0aXN0aWMgY291bnRlcnMgKi8KKwkJCQkodm9pZClTa1htVXBkYXRlU3RhdHMocEFDLCBJb0MsIDEpOworCisJCQkJKHZvaWQpU2tYbU1hY1N0YXRpc3RpYyhwQUMsIElvQywgMSwgWE1fVFhPX09LX0hJLCAmUmVnVmFsMzIpOworCisJCQkJcFBydC0+TGFzdE9jdGV0cyA9IChTS19VNjQpUmVnVmFsMzIgPDwgMzI7CisJCQkJCisJCQkJKHZvaWQpU2tYbU1hY1N0YXRpc3RpYyhwQUMsIElvQywgMSwgWE1fVFhPX09LX0xPLCAmUmVnVmFsMzIpOworCisJCQkJcFBydC0+TGFzdE9jdGV0cyArPSBSZWdWYWwzMjsKKwkJCQkKKwkJCQlQYXJhLlBhcmEzMlswXSA9IDE7CisJCQkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcFBydC0+SGFsZkR1cENoa1RpbWVyLCBTS19IQUxGRFVQX0NIS19USU1FLAorCQkJCQlTS0dFX0hXQUMsIFNLX0hXRVZfSEFMRkRVUF9DSEssIFBhcmEpOworCQkJfQorCQl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCX0KKworCS8qIENoZWNrIGludGVycnVwdHMgb2YgdGhlIHBhcnRpY3VsYXIgcXVldWVzICovCisJaWYgKChJc3RhdHVzICYgSVNfUjFfQykgIT0gMCkgeworCQkvKiBDbGVhciBJUlEgKi8KKwkJU0tfT1VUMzIoSW9DLCBCMF9SMV9DU1IsIENTUl9JUlFfQ0xfQyk7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX1NJUlFfRTAwNiwKKwkJCVNLRVJSX1NJUlFfRTAwNk1TRyk7CisJCVBhcmEuUGFyYTY0ID0gTUFDXzE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUE9SVF9GQUlMLCBQYXJhKTsKKwkJUGFyYS5QYXJhMzJbMF0gPSBNQUNfMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisJfQorCisJaWYgKChJc3RhdHVzICYgSVNfUjJfQykgIT0gMCkgeworCQkvKiBDbGVhciBJUlEgKi8KKwkJU0tfT1VUMzIoSW9DLCBCMF9SMl9DU1IsIENTUl9JUlFfQ0xfQyk7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX1NJUlFfRTAwNywKKwkJCVNLRVJSX1NJUlFfRTAwN01TRyk7CisJCVBhcmEuUGFyYTY0ID0gTUFDXzI7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUE9SVF9GQUlMLCBQYXJhKTsKKwkJUGFyYS5QYXJhMzJbMF0gPSBNQUNfMjsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisJfQorCisJaWYgKChJc3RhdHVzICYgSVNfWFMxX0MpICE9IDApIHsKKwkJLyogQ2xlYXIgSVJRICovCisJCVNLX09VVDMyKElvQywgQjBfWFMxX0NTUiwgQ1NSX0lSUV9DTF9DKTsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfU0lSUV9FMDA4LAorCQkJU0tFUlJfU0lSUV9FMDA4TVNHKTsKKwkJUGFyYS5QYXJhNjQgPSBNQUNfMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX0ZBSUwsIFBhcmEpOworCQlQYXJhLlBhcmEzMlswXSA9IE1BQ18xOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKwl9CisKKwlpZiAoKElzdGF0dXMgJiBJU19YQTFfQykgIT0gMCkgeworCQkvKiBDbGVhciBJUlEgKi8KKwkJU0tfT1VUMzIoSW9DLCBCMF9YQTFfQ1NSLCBDU1JfSVJRX0NMX0MpOworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9TSVJRX0UwMDksCisJCQlTS0VSUl9TSVJRX0UwMDlNU0cpOworCQlQYXJhLlBhcmE2NCA9IE1BQ18xOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1BPUlRfRkFJTCwgUGFyYSk7CisJCVBhcmEuUGFyYTMyWzBdID0gTUFDXzE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCX0KKworCWlmICgoSXN0YXR1cyAmIElTX1hTMl9DKSAhPSAwKSB7CisJCS8qIENsZWFyIElSUSAqLworCQlTS19PVVQzMihJb0MsIEIwX1hTMl9DU1IsIENTUl9JUlFfQ0xfQyk7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX1NJUlFfRTAxMCwKKwkJCVNLRVJSX1NJUlFfRTAxME1TRyk7CisJCVBhcmEuUGFyYTY0ID0gTUFDXzI7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUE9SVF9GQUlMLCBQYXJhKTsKKwkJUGFyYS5QYXJhMzJbMF0gPSBNQUNfMjsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisJfQorCisJaWYgKChJc3RhdHVzICYgSVNfWEEyX0MpICE9IDApIHsKKwkJLyogQ2xlYXIgSVJRICovCisJCVNLX09VVDMyKElvQywgQjBfWEEyX0NTUiwgQ1NSX0lSUV9DTF9DKTsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfU0lSUV9FMDExLAorCQkJU0tFUlJfU0lSUV9FMDExTVNHKTsKKwkJUGFyYS5QYXJhNjQgPSBNQUNfMjsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX0ZBSUwsIFBhcmEpOworCQlQYXJhLlBhcmEzMlswXSA9IE1BQ18yOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKwl9CisKKwkvKiBFeHRlcm5hbCByZWcgaW50ZXJydXB0ICovCisJaWYgKChJc3RhdHVzICYgSVNfRVhUX1JFRykgIT0gMCkgeworCQkvKiBUZXN0IElSUXMgZnJvbSBQSFkgKi8KKwkJZm9yIChpID0gMDsgaSA8IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQkKKwkJCXBQcnQgPSAmcEFDLT5HSW5pLkdQW2ldOworCQkJCisJCQlpZiAocFBydC0+UFN0YXRlID09IFNLX1BSVF9SRVNFVCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJCisjaWZkZWYgR0VORVNJUworCQkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCQkKKwkJCQlzd2l0Y2ggKHBQcnQtPlBoeVR5cGUpIHsKKwkJCQkKKwkJCQljYXNlIFNLX1BIWV9YTUFDOgorCQkJCQlicmVhazsKKwkJCQkKKwkJCQljYXNlIFNLX1BIWV9CQ09NOgorCQkJCQlTa1htUGh5UmVhZChwQUMsIElvQywgaSwgUEhZX0JDT01fSU5UX1NUQVQsICZQaHlJbnQpOworCQorCQkJCQlpZiAoKFBoeUludCAmIH5QSFlfQl9ERUZfTVNLKSAhPSAwKSB7CisJCQkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCQkJCQkoIlBvcnQgJWQgQmNvbSBJbnQ6IDB4JTA0WFxuIiwKKwkJCQkJCQlpLCBQaHlJbnQpKTsKKwkJCQkJCVNrUGh5SXNyQmNvbShwQUMsIElvQywgaSwgUGh5SW50KTsKKwkJCQkJfQorCQkJCQlicmVhazsKKyNpZmRlZiBPVEhFUl9QSFkKKwkJCQljYXNlIFNLX1BIWV9MT05FOgorCQkJCQlTa1htUGh5UmVhZChwQUMsIElvQywgaSwgUEhZX0xPTkVfSU5UX1NUQVQsICZQaHlJbnQpOworCQkJCQkKKwkJCQkJaWYgKChQaHlJbnQgJiBQSFlfTF9ERUZfTVNLKSAhPSAwKSB7CisJCQkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCQkJCQkoIlBvcnQgJWQgTG9uZSBJbnQ6ICV4XG4iLAorCQkJCQkJCWksIFBoeUludCkpOworCQkJCQkJU2tQaHlJc3JMb25lKHBBQywgSW9DLCBpLCBQaHlJbnQpOworCQkJCQl9CisJCQkJCWJyZWFrOworI2VuZGlmIC8qIE9USEVSX1BIWSAqLworCQkJCX0KKwkJCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwkJCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkJCS8qIFJlYWQgUEhZIEludGVycnVwdCBTdGF0dXMgKi8KKwkJCQlTa0dtUGh5UmVhZChwQUMsIElvQywgaSwgUEhZX01BUlZfSU5UX1NUQVQsICZQaHlJbnQpOworCisJCQkJaWYgKChQaHlJbnQgJiBQSFlfTV9ERUZfTVNLKSAhPSAwKSB7CisJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJCQkJKCJQb3J0ICVkIE1hcnYgSW50OiAweCUwNFhcbiIsCisJCQkJCQlpLCBQaHlJbnQpKTsKKwkJCQkJU2tQaHlJc3JHbWFjKHBBQywgSW9DLCBpLCBQaHlJbnQpOworCQkJCX0KKwkJCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCQl9CisJfQorCisJLyogSTJDIFJlYWR5IGludGVycnVwdCAqLworCWlmICgoSXN0YXR1cyAmIElTX0kyQ19SRUFEWSkgIT0gMCkgeworI2lmZGVmIFNLX1NMSU0KKyAgICAgICAgU0tfT1VUMzIoSW9DLCBCMl9JMkNfSVJRLCBJMkNfQ0xSX0lSUSk7CisjZWxzZQkJCisJCVNrSTJjSXNyKHBBQywgSW9DKTsKKyNlbmRpZgkJCisJfQorCisJLyogU1cgZm9yY2VkIGludGVycnVwdCAqLworCWlmICgoSXN0YXR1cyAmIElTX0lSUV9TVykgIT0gMCkgeworCQkvKiBjbGVhciB0aGUgc29mdHdhcmUgSVJRICovCisJCVNLX09VVDgoSW9DLCBCMF9DVFNULCBDU19DTF9TV19JUlEpOworCX0KKworCWlmICgoSXN0YXR1cyAmIElTX0xOS19TWU5DX00xKSAhPSAwKSB7CisJCS8qCisJCSAqIFdlIGRvIE5PVCBuZWVkIHRoZSBMaW5rIFN5bmMgaW50ZXJydXB0LCBiZWNhdXNlIGl0IHNob3dzCisJCSAqIHVzIG9ubHkgYSBsaW5rIGdvaW5nIGRvd24uCisJCSAqLworCQkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KKwkJU0tfT1VUOChJb0MsIE1SX0FERFIoTUFDXzEsIExOS19TWU5DX0NUUkwpLCBMRURfQ0xSX0lSUSk7CisJfQorCisJLyogQ2hlY2sgTUFDIGFmdGVyIGxpbmsgc3luYyBjb3VudGVyICovCisJaWYgKChJc3RhdHVzICYgSVNfTUFDMSkgIT0gMCkgeworCQkvKiBJUlEgZnJvbSBNQUMgMSAqLworCQlTa01hY0lycShwQUMsIElvQywgTUFDXzEpOworCX0KKworCWlmICgoSXN0YXR1cyAmIElTX0xOS19TWU5DX00yKSAhPSAwKSB7CisJCS8qCisJCSAqIFdlIGRvIE5PVCBuZWVkIHRoZSBMaW5rIFN5bmMgaW50ZXJydXB0LCBiZWNhdXNlIGl0IHNob3dzCisJCSAqIHVzIG9ubHkgYSBsaW5rIGdvaW5nIGRvd24uCisJCSAqLworCQkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KKwkJU0tfT1VUOChJb0MsIE1SX0FERFIoTUFDXzIsIExOS19TWU5DX0NUUkwpLCBMRURfQ0xSX0lSUSk7CisJfQorCisJLyogQ2hlY2sgTUFDIGFmdGVyIGxpbmsgc3luYyBjb3VudGVyICovCisJaWYgKChJc3RhdHVzICYgSVNfTUFDMikgIT0gMCkgeworCQkvKiBJUlEgZnJvbSBNQUMgMiAqLworCQlTa01hY0lycShwQUMsIElvQywgTUFDXzIpOworCX0KKworCS8qIFRpbWVyIGludGVycnVwdCAoc2VydmVkIGxhc3QpICovCisJaWYgKChJc3RhdHVzICYgSVNfVElNSU5UKSAhPSAwKSB7CisJCS8qIGNoZWNrIGZvciBIVyBFcnJvcnMgKi8KKwkJaWYgKCgoSXN0YXR1cyAmIElTX0hXX0VSUikgJiB+cEFDLT5HSW5pLkdJVmFsSXJxTWFzaykgIT0gMCkgeworCQkJLyogcmVhZCB0aGUgSFcgRXJyb3IgSW50ZXJydXB0IHNvdXJjZSAqLworCQkJU0tfSU4zMihJb0MsIEIwX0hXRV9JU1JDLCAmUmVnVmFsMzIpOworCisJCQlTa0dlSHdFcnIocEFDLCBJb0MsIFJlZ1ZhbDMyKTsKKwkJfQorCisJCVNrSHd0SXNyKHBBQywgSW9DKTsKKwl9CisKK30JLyogU2tHZVNpcnFJc3IgKi8KKworCisjaWZkZWYgR0VORVNJUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrR2VQb3J0Q2hlY2tTaG9ydHMoKSAtIEltcGxlbWVudGluZyBYTUFDIFdvcmthcm91bmQgRXJyYXRhICMgMgorICoKKyAqIHJldHVybjoKKyAqCTAJby5rLiBub3RoaW5nIG5lZWRlZAorICoJMQlSZXN0YXJ0IG5lZWRlZCBvbiB0aGlzIHBvcnQKKyAqLworc3RhdGljIGludCBTa0dlUG9ydENoZWNrU2hvcnRzKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIENvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFdoaWNoIHBvcnQgc2hvdWxkIGJlIGNoZWNrZWQgKi8KK3sKKwlTS19VMzIJCVNob3J0czsJCQkvKiBTaG9ydCBFdmVudCBDb3VudGVyICovCisJU0tfVTMyCQlDaGVja1Nob3J0czsJLyogQ2hlY2sgdmFsdWUgZm9yIFNob3J0IEV2ZW50IENvdW50ZXIgKi8KKwlTS19VNjQJCVJ4Q3RzOwkJCS8qIFJ4IENvdW50ZXIgKHBhY2tldHMgb24gbmV0d29yaykgKi8KKwlTS19VMzIJCVJ4VG1wOwkJCS8qIFJ4IHRlbXAuIENvdW50ZXIgKi8KKwlTS19VMzIJCUZjc0VyckN0czsJCS8qIEZDUyBFcnJvciBDb3VudGVyICovCisJU0tfR0VQT1JUCSpwUHJ0OwkJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCWludAkJCVJ0djsJCQkvKiBSZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlpOworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwkvKiBEZWZhdWx0OiBubyBhY3Rpb24gKi8KKwlSdHYgPSBTS19IV19QU19OT05FOworCisJKHZvaWQpU2tYbVVwZGF0ZVN0YXRzKHBBQywgSW9DLCBQb3J0KTsKKworCS8qIEV4dHJhIHByZWNhdXRpb246IGNoZWNrIGZvciBzaG9ydCBFdmVudCBjb3VudGVyICovCisJKHZvaWQpU2tYbU1hY1N0YXRpc3RpYyhwQUMsIElvQywgUG9ydCwgWE1fUlhFX1NIVF9FUlIsICZTaG9ydHMpOworCisJLyoKKwkgKiBSZWFkIFJ4IGNvdW50ZXJzIChwYWNrZXRzIHNlZW4gb24gdGhlIG5ldHdvcmsgYW5kIG5vdCBuZWNlc3NhcmlseQorCSAqIHJlYWxseSByZWNlaXZlZC4KKwkgKi8KKwlSeEN0cyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKFNrR2VSeFJlZ3MpL3NpemVvZihTa0dlUnhSZWdzWzBdKTsgaSsrKSB7CisJCQorCQkodm9pZClTa1htTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQb3J0LCBTa0dlUnhSZWdzW2ldLCAmUnhUbXApOworCQkKKwkJUnhDdHMgKz0gKFNLX1U2NClSeFRtcDsKKwl9CisKKwkvKiBPbiBkZWZhdWx0OiBjaGVjayBzaG9ydHMgYWdhaW5zdCB6ZXJvICovCisJQ2hlY2tTaG9ydHMgPSAwOworCisJLyogRXh0cmEgcHJlY2F1dGlvbiBvbiBhY3RpdmUgbGlua3MgKi8KKwlpZiAocFBydC0+UEhXTGlua1VwKSB7CisJCS8qIFJlc2V0IExpbmsgUmVzdGFydCBjb3VudGVyICovCisJCXBQcnQtPlBMaW5rUmVzQ3QgPSAwOworCQlwUHJ0LT5QQXV0b05lZ1RPQ3QgPSAwOworCisJCS8qIElmIGxpbmsgaXMgdXAgY2hlY2sgZm9yIDIgKi8KKwkJQ2hlY2tTaG9ydHMgPSAyOworCisJCSh2b2lkKVNrWG1NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBvcnQsIFhNX1JYRl9GQ1NfRVJSLCAmRmNzRXJyQ3RzKTsKKwkJCisJCWlmIChwUHJ0LT5QTGlua01vZGVDb25mID09IFNLX0xNT0RFX0FVVE9TRU5TRSAmJgorCQkgICAgcFBydC0+UExpcGFBdXRvTmVnID09IFNLX0xJUEFfVU5LTk9XTiAmJgorCQkgICAgKHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9IQUxGIHx8CisJCQkgcFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0ZVTEwpKSB7CisJCQkvKgorCQkJICogVGhpcyBpcyBhdXRvc2Vuc2luZyBhbmQgd2UgYXJlIGluIHRoZSBmYWxsYmFjaworCQkJICogbWFudWFsIGZ1bGwvaGFsZiBkdXBsZXggbW9kZS4KKwkJCSAqLworCQkJaWYgKFJ4Q3RzID09IHBQcnQtPlBQcmV2UngpIHsKKwkJCQkvKiBOb3RoaW5nIHJlY2VpdmVkLCByZXN0YXJ0IGxpbmsgKi8KKwkJCQlwUHJ0LT5QUHJldkZjcyA9IEZjc0VyckN0czsKKwkJCQlwUHJ0LT5QUHJldlNob3J0cyA9IFNob3J0czsKKwkJCQkKKwkJCQlyZXR1cm4oU0tfSFdfUFNfUkVTVEFSVCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwUHJ0LT5QTGlwYUF1dG9OZWcgPSBTS19MSVBBX01BTlVBTDsKKwkJCX0KKwkJfQorCisJCWlmICgoKFJ4Q3RzIC0gcFBydC0+UFByZXZSeCkgPiBwUHJ0LT5QUnhMaW0pIHx8CisJCSAgICAoIShGY3NFcnJDdHMgLSBwUHJ0LT5QUHJldkZjcykpKSB7CisJCQkvKgorCQkJICogTm90ZTogVGhlIGNvbXBhcmUgd2l0aCB6ZXJvIGFib3ZlIGhhcyB0byBiZSBkb25lIHRoZSB3YXkgc2hvd24sCisJCQkgKiBvdGhlcndpc2UgdGhlIExpbnV4IGRyaXZlciB3aWxsIGhhdmUgYSBwcm9ibGVtLgorCQkJICovCisJCQkvKgorCQkJICogV2UgcmVjZWl2ZWQgYSBidW5jaCBvZiBmcmFtZXMgb3Igbm8gQ1JDIGVycm9yIG9jY3VyZWQgb24gdGhlCisJCQkgKiBuZXR3b3JrIC0+IG9rLgorCQkJICovCisJCQlwUHJ0LT5QUHJldlJ4ID0gUnhDdHM7CisJCQlwUHJ0LT5QUHJldkZjcyA9IEZjc0VyckN0czsKKwkJCXBQcnQtPlBQcmV2U2hvcnRzID0gU2hvcnRzOworCisJCQlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7CisJCX0KKworCQlwUHJ0LT5QUHJldkZjcyA9IEZjc0VyckN0czsKKwl9CisKKworCWlmICgoU2hvcnRzIC0gcFBydC0+UFByZXZTaG9ydHMpID4gQ2hlY2tTaG9ydHMpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkoIlNob3J0IEV2ZW50IENvdW50IFJlc3RhcnQgUG9ydCAlZCBcbiIsIFBvcnQpKTsKKwkJUnR2ID0gU0tfSFdfUFNfUkVTVEFSVDsKKwl9CisKKwlwUHJ0LT5QUHJldlNob3J0cyA9IFNob3J0czsKKwlwUHJ0LT5QUHJldlJ4ID0gUnhDdHM7CisKKwlyZXR1cm4oUnR2KTsKK30JLyogU2tHZVBvcnRDaGVja1Nob3J0cyAqLworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tHZVBvcnRDaGVja1VwKCkgLSBDaGVjayBpZiB0aGUgbGluayBpcyB1cAorICoKKyAqIHJldHVybjoKKyAqCTAJby5rLiBub3RoaW5nIG5lZWRlZAorICoJMQlSZXN0YXJ0IG5lZWRlZCBvbiB0aGlzIHBvcnQKKyAqCTIJTGluayBjYW1lIHVwCisgKi8KK3N0YXRpYyBpbnQgU2tHZVBvcnRDaGVja1VwKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIENvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFdoaWNoIHBvcnQgc2hvdWxkIGJlIGNoZWNrZWQgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKwlTS19CT09MCQlBdXRvTmVnOwkvKiBJcyBBdXRvLW5lZ290aWF0aW9uIHVzZWQgPyAqLworCWludAkJCVJ0djsJCS8qIFJldHVybiB2YWx1ZSAqLworCisJUnR2ID0gU0tfSFdfUFNfTk9ORTsKKwkKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCWlmIChwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfSEFMRiB8fCBwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfRlVMTCkgeworCQlBdXRvTmVnID0gU0tfRkFMU0U7CisJfQorCWVsc2UgeworCQlBdXRvTmVnID0gU0tfVFJVRTsKKwl9CisKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKworCQlzd2l0Y2ggKHBQcnQtPlBoeVR5cGUpIHsKKwkJCisJCWNhc2UgU0tfUEhZX1hNQUM6CisJCQlSdHYgPSBTa0dlUG9ydENoZWNrVXBYbWFjKHBBQywgSW9DLCBQb3J0LCBBdXRvTmVnKTsKKwkJCWJyZWFrOworCQljYXNlIFNLX1BIWV9CQ09NOgorCQkJUnR2ID0gU2tHZVBvcnRDaGVja1VwQmNvbShwQUMsIElvQywgUG9ydCwgQXV0b05lZyk7CisJCQlicmVhazsKKyNpZmRlZiBPVEhFUl9QSFkKKwkJY2FzZSBTS19QSFlfTE9ORToKKwkJCVJ0diA9IFNrR2VQb3J0Q2hlY2tVcExvbmUocEFDLCBJb0MsIFBvcnQsIEF1dG9OZWcpOworCQkJYnJlYWs7CisJCWNhc2UgU0tfUEhZX05BVDoKKwkJCVJ0diA9IFNrR2VQb3J0Q2hlY2tVcE5hdChwQUMsIElvQywgUG9ydCwgQXV0b05lZyk7CisJCQlicmVhazsKKyNlbmRpZiAvKiBPVEhFUl9QSFkgKi8KKwkJfQorCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCisJCVJ0diA9IFNrR2VQb3J0Q2hlY2tVcEdtYWMocEFDLCBJb0MsIFBvcnQsIEF1dG9OZWcpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCisJcmV0dXJuKFJ0dik7CQorfQkvKiBTa0dlUG9ydENoZWNrVXAgKi8KKworCisjaWZkZWYgR0VORVNJUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrR2VQb3J0Q2hlY2tVcFhtYWMoKSAtIEltcGxlbWVudGluZyBvZiB0aGUgV29ya2Fyb3VuZCBFcnJhdGEgIyAyCisgKgorICogcmV0dXJuOgorICoJMAlvLmsuIG5vdGhpbmcgbmVlZGVkCisgKgkxCVJlc3RhcnQgbmVlZGVkIG9uIHRoaXMgcG9ydAorICoJMglMaW5rIGNhbWUgdXAKKyAqLworc3RhdGljIGludCBTa0dlUG9ydENoZWNrVXBYbWFjKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIENvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFdoaWNoIHBvcnQgc2hvdWxkIGJlIGNoZWNrZWQgKi8KK1NLX0JPT0wJQXV0b05lZykJLyogSXMgQXV0by1uZWdvdGlhdGlvbiB1c2VkID8gKi8KK3sKKwlTS19VMzIJCVNob3J0czsJCS8qIFNob3J0IEV2ZW50IENvdW50ZXIgKi8KKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKwlpbnQJCQlEb25lOworCVNLX1UzMgkJR3BSZWc7CQkvKiBHZW5lcmFsIFB1cnBvc2UgcmVnaXN0ZXIgdmFsdWUgKi8KKwlTS19VMTYJCUlzcmM7CQkvKiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICovCisJU0tfVTE2CQlJc3JjU3VtOwkvKiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyIHN1bSAqLworCVNLX1UxNgkJTHBBYjsJCS8qIExpbmsgUGFydG5lciBBYmlsaXR5ICovCisJU0tfVTE2CQlSZXNBYjsJCS8qIFJlc29sdmVkIEFiaWxpdHkgKi8KKwlTS19VMTYJCUV4dFN0YXQ7CS8qIEV4dGVuZGVkIFN0YXR1cyBSZWdpc3RlciAqLworCVNLX1U4CQlOZXh0TW9kZTsJLyogTmV4dCBBdXRvU2Vuc2luZyBNb2RlICovCisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCWlmIChwUHJ0LT5QSFdMaW5rVXApIHsKKwkJaWYgKHBQcnQtPlBoeVR5cGUgIT0gU0tfUEhZX1hNQUMpIHsKKwkJCXJldHVybihTS19IV19QU19OT05FKTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybihTa0dlUG9ydENoZWNrU2hvcnRzKHBBQywgSW9DLCBQb3J0KSk7CisJCX0KKwl9CisKKwlJc3JjU3VtID0gcFBydC0+UElzYXZlOworCXBQcnQtPlBJc2F2ZSA9IDA7CisKKwkvKiBOb3cgd2FpdCBmb3IgZWFjaCBwb3J0J3MgbGluayAqLworCWlmIChwUHJ0LT5QTGlua0Jyb2tlbikgeworCQkvKiBMaW5rIHdhcyBicm9rZW4gKi8KKwkJWE1fSU4zMihJb0MsIFBvcnQsIFhNX0dQX1BPUlQsICZHcFJlZyk7CisKKwkJaWYgKChHcFJlZyAmIFhNX0dQX0lOUF9BU1MpID09IDApIHsKKwkJCS8qIFRoZSBMaW5rIGlzIGluIHN5bmMgKi8KKwkJCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9JU1JDLCAmSXNyYyk7CisJCQlJc3JjU3VtIHw9IElzcmM7CisJCQlTa1htQXV0b05lZ0xpcGFYbWFjKHBBQywgSW9DLCBQb3J0LCBJc3JjU3VtKTsKKwkJCQorCQkJaWYgKChJc3JjICYgWE1fSVNfSU5QX0FTUykgPT0gMCkgeworCQkJCS8qIEl0IGhhcyBiZWVuIGluIHN5bmMgc2luY2UgbGFzdCB0aW1lICovCisJCQkJLyogUmVzdGFydCB0aGUgUE9SVCAqLworCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJCQkoIkxpbmsgaW4gc3luYyBSZXN0YXJ0IFBvcnQgJWRcbiIsIFBvcnQpKTsKKworCQkJCSh2b2lkKVNrWG1VcGRhdGVTdGF0cyhwQUMsIElvQywgUG9ydCk7CisKKwkJCQkvKiBXZSBub3cgbmVlZCB0byByZWluaXRpYWxpemUgdGhlIFByZXZTaG9ydHMgY291bnRlciAqLworCQkJCSh2b2lkKVNrWG1NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBvcnQsIFhNX1JYRV9TSFRfRVJSLCAmU2hvcnRzKTsKKwkJCQlwUHJ0LT5QUHJldlNob3J0cyA9IFNob3J0czsKKworCQkJCXBQcnQtPlBMaW5rQnJva2VuID0gU0tfRkFMU0U7CisKKwkJCQkvKgorCQkJCSAqIExpbmsgUmVzdGFydCBXb3JrYXJvdW5kOgorCQkJCSAqICBpdCBtYXkgYmUgcG9zc2libGUgdGhhdCB0aGUgb3RoZXIgTGluayBzaWRlCisJCQkJICogIHJlc3RhcnRzIGl0cyBsaW5rIGFzIHdlbGwgYW4gd2UgZGV0ZWN0CisJCQkJICogIGFub3RoZXIgTGlua0Jyb2tlbi4gVG8gcHJldmVudCB0aGlzCisJCQkJICogIGhhcHBlbmluZyB3ZSBjaGVjayBmb3IgYSBtYXhpbXVtIG51bWJlcgorCQkJCSAqICBvZiBjb25zZWN1dGl2ZSByZXN0YXJ0LiBJZiB0aG9zZSBoYXBwZW5zLAorCQkJCSAqICB3ZSBkbyBOT1QgcmVzdGFydCB0aGUgYWN0aXZlIGxpbmsgYW5kCisJCQkJICogIGNoZWNrIHdoZXRoZXIgdGhlIGxpbmsgaXMgbm93IG8uay4KKwkJCQkgKi8KKwkJCQlwUHJ0LT5QTGlua1Jlc0N0Kys7CisJCQkJCisJCQkJcFBydC0+UEF1dG9OZWdUaW1lT3V0ID0gMDsKKworCQkJCWlmIChwUHJ0LT5QTGlua1Jlc0N0IDwgU0tfTUFYX0xSRVNUQVJUKSB7CisJCQkJCXJldHVybihTS19IV19QU19SRVNUQVJUKTsKKwkJCQl9CisKKwkJCQlwUHJ0LT5QTGlua1Jlc0N0ID0gMDsKKwkJCQkKKwkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJCSgiRG8gTk9UIHJlc3RhcnQgb24gUG9ydCAlZCAleCAleFxuIiwgUG9ydCwgSXNyYywgSXNyY1N1bSkpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcFBydC0+UElzYXZlID0gKFNLX1UxNikoSXNyY1N1bSAmIFhNX0lTX0FORCk7CisJCQkJCisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJCQkoIlNhdmUgU3luYy9ub3N5bmMgUG9ydCAlZCAleCAleFxuIiwgUG9ydCwgSXNyYywgSXNyY1N1bSkpOworCisJCQkJLyogRG8gbm90aGluZyBtb3JlIGlmIGxpbmsgaXMgYnJva2VuICovCisJCQkJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogRG8gbm90aGluZyBtb3JlIGlmIGxpbmsgaXMgYnJva2VuICovCisJCQlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7CisJCX0KKworCX0KKwllbHNlIHsKKwkJLyogTGluayB3YXMgbm90IGJyb2tlbiwgY2hlY2sgaWYgaXQgaXMgKi8KKwkJWE1fSU4xNihJb0MsIFBvcnQsIFhNX0lTUkMsICZJc3JjKTsKKwkJSXNyY1N1bSB8PSBJc3JjOworCQlpZiAoKElzcmMgJiBYTV9JU19JTlBfQVNTKSAhPSAwKSB7CisJCQlYTV9JTjE2KElvQywgUG9ydCwgWE1fSVNSQywgJklzcmMpOworCQkJSXNyY1N1bSB8PSBJc3JjOworCQkJaWYgKChJc3JjICYgWE1fSVNfSU5QX0FTUykgIT0gMCkgeworCQkJCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9JU1JDLCAmSXNyYyk7CisJCQkJSXNyY1N1bSB8PSBJc3JjOworCQkJCWlmICgoSXNyYyAmIFhNX0lTX0lOUF9BU1MpICE9IDApIHsKKwkJCQkJcFBydC0+UExpbmtCcm9rZW4gPSBTS19UUlVFOworCQkJCQkvKiBSZS1Jbml0IExpbmsgcGFydG5lciBBdXRvbmVnIGZsYWcgKi8KKwkJCQkJcFBydC0+UExpcGFBdXRvTmVnID0gU0tfTElQQV9VTktOT1dOOworCQkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCQkJCSgiTGluayBicm9rZW4gUG9ydCAlZFxuIiwgUG9ydCkpOworCisJCQkJCS8qIENhYmxlIHJlbW92ZWQtPiByZWluaXQgc2Vuc2UgbW9kZSAqLworCQkJCQlTa0hXSW5pdERlZlNlbnNlKHBBQywgSW9DLCBQb3J0KTsKKworCQkJCQlyZXR1cm4oU0tfSFdfUFNfUkVTVEFSVCk7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgeworCQkJU2tYbUF1dG9OZWdMaXBhWG1hYyhwQUMsIElvQywgUG9ydCwgSXNyYyk7CisJCQkKKwkJCWlmIChTa0dlUG9ydENoZWNrU2hvcnRzKHBBQywgSW9DLCBQb3J0KSA9PSBTS19IV19QU19SRVNUQVJUKSB7CisJCQkJcmV0dXJuKFNLX0hXX1BTX1JFU1RBUlQpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBoZXJlIHdlIHVzdWFsbHkgY2FuIGNoZWNrIHdoZXRoZXIgdGhlIGxpbmsgaXMgaW4gc3luYyBhbmQKKwkgKiBhdXRvLW5lZ290aWF0aW9uIGlzIGRvbmUuCisJICovCisJWE1fSU4zMihJb0MsIFBvcnQsIFhNX0dQX1BPUlQsICZHcFJlZyk7CisJWE1fSU4xNihJb0MsIFBvcnQsIFhNX0lTUkMsICZJc3JjKTsKKwlJc3JjU3VtIHw9IElzcmM7CisKKwlTa1htQXV0b05lZ0xpcGFYbWFjKHBBQywgSW9DLCBQb3J0LCBJc3JjU3VtKTsKKwkKKwlpZiAoKEdwUmVnICYgWE1fR1BfSU5QX0FTUykgIT0gMCB8fCAoSXNyY1N1bSAmIFhNX0lTX0lOUF9BU1MpICE9IDApIHsKKwkJaWYgKChHcFJlZyAmIFhNX0dQX0lOUF9BU1MpID09IDApIHsKKwkJCS8qIFNhdmUgQXV0by1uZWdvdGlhdGlvbiBEb25lIGludGVycnVwdCBvbmx5IGlmIGxpbmsgaXMgaW4gc3luYyAqLworCQkJcFBydC0+UElzYXZlID0gKFNLX1UxNikoSXNyY1N1bSAmIFhNX0lTX0FORCk7CisJCX0KKyNpZmRlZiBERUJVRworCQlpZiAoKHBQcnQtPlBJc2F2ZSAmIFhNX0lTX0FORCkgIT0gMCkgeworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiQXV0b05lZyBkb25lIHJlc2NoZWR1bGVkIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisJCXJldHVybihTS19IV19QU19OT05FKTsKKwl9CisKKwlpZiAoQXV0b05lZykgeworCQlpZiAoKElzcmNTdW0gJiBYTV9JU19BTkQpICE9IDApIHsKKwkJCVNrSFdMaW5rVXAocEFDLCBJb0MsIFBvcnQpOworCQkJRG9uZSA9IFNrTWFjQXV0b05lZ0RvbmUocEFDLCBJb0MsIFBvcnQpOworCQkJaWYgKERvbmUgIT0gU0tfQU5EX09LKSB7CisJCQkJLyogR2V0IFBIWSBwYXJhbWV0ZXJzLCBmb3IgZGVidWdnaW5nIG9ubHkgKi8KKwkJCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX1hNQUNfQVVORV9MUCwgJkxwQWIpOworCQkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfWE1BQ19SRVNfQUJJLCAmUmVzQWIpOworCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkJKCJBdXRvTmVnIEZBSUwgUG9ydCAlZCAoTHBBYiAleCwgUmVzQWIgJXgpXG4iLAorCQkJCQkgUG9ydCwgTHBBYiwgUmVzQWIpKTsKKwkJCQkJCisJCQkJLyogVHJ5IG5leHQgcG9zc2libGUgbW9kZSAqLworCQkJCU5leHRNb2RlID0gU2tIV1NlbnNlR2V0TmV4dChwQUMsIElvQywgUG9ydCk7CisJCQkJU2tIV0xpbmtEb3duKHBBQywgSW9DLCBQb3J0KTsKKwkJCQlpZiAoRG9uZSA9PSBTS19BTkRfRFVQX0NBUCkgeworCQkJCQkvKiBHb1RvIG5leHQgbW9kZSAqLworCQkJCQlTa0hXU2Vuc2VTZXROZXh0KHBBQywgSW9DLCBQb3J0LCBOZXh0TW9kZSk7CisJCQkJfQorCisJCQkJcmV0dXJuKFNLX0hXX1BTX1JFU1RBUlQpOworCQkJfQorCQkJLyoKKwkJCSAqIER1bW15IFJlYWQgZXh0ZW5kZWQgc3RhdHVzIHRvIHByZXZlbnQgZXh0cmEgbGluayBkb3duL3VwcworCQkJICogKGNsZWFyIFBhZ2UgUmVjZWl2ZWQgYml0IGlmIHNldCkKKwkJCSAqLworCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9YTUFDX0FVTkVfRVhQLCAmRXh0U3RhdCk7CisJCQkKKwkJCXJldHVybihTS19IV19QU19MSU5LKTsKKwkJfQorCQkKKwkJLyogQXV0b05lZyBub3QgZG9uZSwgYnV0IEhXIGxpbmsgaXMgdXAuIENoZWNrIGZvciB0aW1lb3V0cyAqLworCQlwUHJ0LT5QQXV0b05lZ1RpbWVPdXQrKzsKKwkJaWYgKHBQcnQtPlBBdXRvTmVnVGltZU91dCA+PSBTS19BTkRfTUFYX1RPKSB7CisJCQkvKiBJbmNyZWFzZSB0aGUgVGltZW91dCBjb3VudGVyICovCisJCQlwUHJ0LT5QQXV0b05lZ1RPQ3QrKzsKKworCQkJLyogVGltZW91dCBvY2N1cmVkICovCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCQkoIkF1dG9OZWcgdGltZW91dCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCQlpZiAocFBydC0+UExpbmtNb2RlQ29uZiA9PSBTS19MTU9ERV9BVVRPU0VOU0UgJiYKKwkJCQlwUHJ0LT5QTGlwYUF1dG9OZWcgIT0gU0tfTElQQV9BVVRPKSB7CisJCQkJLyogU2V0IExpbmsgbWFudWFsbHkgdXAgKi8KKwkJCQlTa0hXU2Vuc2VTZXROZXh0KHBBQywgSW9DLCBQb3J0LCBTS19MTU9ERV9GVUxMKTsKKwkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCQkJKCJTZXQgbWFudWFsIGZ1bGwgZHVwbGV4IFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJCX0KKworCQkJaWYgKHBQcnQtPlBMaW5rTW9kZUNvbmYgPT0gU0tfTE1PREVfQVVUT1NFTlNFICYmCisJCQkJcFBydC0+UExpcGFBdXRvTmVnID09IFNLX0xJUEFfQVVUTyAmJgorCQkJCXBQcnQtPlBBdXRvTmVnVE9DdCA+PSBTS19NQVhfQU5FR19UTykgeworCQkJCS8qCisJCQkJICogVGhpcyBpcyByYXRoZXIgY29tcGxpY2F0ZWQuCisJCQkJICogd2UgbmVlZCB0byBjaGVjayBoZXJlIHdoZXRoZXIgdGhlIExJUEFfQVVUTworCQkJCSAqIHdlIHNhdyBiZWZvcmUgaXMgZmFsc2UgYWxlcnQuIFdlIHNhdyBhdCBvbmUKKwkJCQkgKiBzd2l0Y2ggKCBTUjg4MDApIHRoYXQgb24gYm9vdCB0aW1lIGl0IHNlbmRzCisJCQkJICoganVzdCBvbmUgYXV0by1uZWcgcGFja2V0IGFuZCBkb2VzIG5vIGZ1cnRoZXIKKwkJCQkgKiBhdXRvLW5lZ290aWF0aW9uLgorCQkJCSAqIFNvbHV0aW9uOiB3ZSByZXN0YXJ0IHRoZSBhdXRvc2Vuc2luZyBhZnRlcgorCQkJCSAqIGEgZmV3IHRpbWVvdXRzLgorCQkJCSAqLworCQkJCXBQcnQtPlBBdXRvTmVnVE9DdCA9IDA7CisJCQkJcFBydC0+UExpcGFBdXRvTmVnID0gU0tfTElQQV9VTktOT1dOOworCQkJCVNrSFdJbml0RGVmU2Vuc2UocEFDLCBJb0MsIFBvcnQpOworCQkJfQorCisJCQkvKiBEbyB0aGUgcmVzdGFydCAqLworCQkJcmV0dXJuKFNLX0hXX1BTX1JFU1RBUlQpOworCQl9CisJfQorCWVsc2UgeworCQkvKiBMaW5rIGlzIHVwIGFuZCB3ZSBkb24ndCBuZWVkIG1vcmUgKi8KKyNpZmRlZiBERUJVRworCQlpZiAocFBydC0+UExpcGFBdXRvTmVnID09IFNLX0xJUEFfQVVUTykgeworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiRVJST1I6IExpcGEgYXV0byBkZXRlY3RlZCBvbiBwb3J0ICVkXG4iLCBQb3J0KSk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCSgiTGluayBzeW5jKEdQKSwgUG9ydCAlZFxuIiwgUG9ydCkpOworCQlTa0hXTGlua1VwKHBBQywgSW9DLCBQb3J0KTsKKwkJCisJCS8qCisJCSAqIExpbmsgc3luYyAoR1ApIGFuZCBzbyBhc3N1bWUgYSBnb29kIGNvbm5lY3Rpb24uIEJ1dCBpZiBub3QgcmVjZWl2ZWQKKwkJICogYSBidW5jaCBvZiBmcmFtZXMgcmVjZWl2ZWQgaW4gYSB0aW1lIHNsb3QgKG1heWJlIGJyb2tlbiB0eCBjYWJsZSkKKwkJICogdGhlIHBvcnQgaXMgcmVzdGFydC4KKwkJICovCisJCXJldHVybihTS19IV19QU19MSU5LKTsKKwl9CisKKwlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7Cit9CS8qIFNrR2VQb3J0Q2hlY2tVcFhtYWMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tHZVBvcnRDaGVja1VwQmNvbSgpIC0gQ2hlY2sgaWYgdGhlIGxpbmsgaXMgdXAgb24gQmNvbSBQSFkKKyAqCisgKiByZXR1cm46CisgKgkwCW8uay4gbm90aGluZyBuZWVkZWQKKyAqCTEJUmVzdGFydCBuZWVkZWQgb24gdGhpcyBwb3J0CisgKgkyCUxpbmsgY2FtZSB1cAorICovCitzdGF0aWMgaW50IFNrR2VQb3J0Q2hlY2tVcEJjb20oCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gQ29udGV4dCAqLworaW50CQlQb3J0LAkJLyogV2hpY2ggcG9ydCBzaG91bGQgYmUgY2hlY2tlZCAqLworU0tfQk9PTAlBdXRvTmVnKQkvKiBJcyBBdXRvLW5lZ290aWF0aW9uIHVzZWQgPyAqLworeworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCWludAkJCURvbmU7CisJU0tfVTE2CQlJc3JjOwkJLyogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciAqLworCVNLX1UxNgkJUGh5U3RhdDsJLyogUGh5IFN0YXR1cyBSZWdpc3RlciAqLworCVNLX1UxNgkJUmVzQWI7CQkvKiBNYXN0ZXIvU2xhdmUgcmVzb2x1dGlvbiAqLworCVNLX1UxNgkJQ3RybDsJCS8qIEJyb2FkY29tIGNvbnRyb2wgZmxhZ3MgKi8KKyNpZmRlZiBERUJVRworCVNLX1UxNgkJTHBBYjsKKwlTS19VMTYJCUV4dFN0YXQ7CisjZW5kaWYgLyogREVCVUcgKi8KKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJLyogQ2hlY2sgZm9yIE5vIEhDRCBMaW5rIGV2ZW50cyAoIzEwNTIzKSAqLworCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9JTlRfU1RBVCwgJklzcmMpOworCisjaWZkZWYgeERFQlVHCisJaWYgKChJc3JjICYgfihQSFlfQl9JU19IQ1QgfCBQSFlfQl9JU19MQ1QpID09CisJCShQSFlfQl9JU19TQ1JfU19FUiB8IFBIWV9CX0lTX1JSU19DSEFOR0UgfCBQSFlfQl9JU19MUlNfQ0hBTkdFKSkgeworCisJCVNLX1UzMglTdGF0MSwgU3RhdDIsIFN0YXQzOworCisJCVN0YXQxID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0lOVF9NQVNLLCAmU3RhdDEpOworCQlDTVNNUHJpbnRTdHJpbmcoCisJCQlwQUMtPnBDb25maWdUYWJsZSwKKwkJCU1TR19UWVBFX1JVTlRJTUVfSU5GTywKKwkJCSJDaGVja1VwMSAtIFN0YXQ6ICV4LCBNYXNrOiAleCIsCisJCQkodm9pZCAqKUlzcmMsCisJCQkodm9pZCAqKVN0YXQxKTsKKworCQlTdGF0MSA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9DVFJMLCAmU3RhdDEpOworCQlTdGF0MiA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9TVEFULCAmU3RhdDIpOworCQlTdGF0MSA9IFN0YXQxIDw8IDE2IHwgU3RhdDI7CisJCVN0YXQyID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVTkVfQURWLCAmU3RhdDIpOworCQlTdGF0MyA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVU5FX0xQLCAmU3RhdDMpOworCQlTdGF0MiA9IFN0YXQyIDw8IDE2IHwgU3RhdDM7CisJCUNNU01QcmludFN0cmluZygKKwkJCXBBQy0+cENvbmZpZ1RhYmxlLAorCQkJTVNHX1RZUEVfUlVOVElNRV9JTkZPLAorCQkJIkN0cmwvU3RhdDogJXgsIEFOIEFkdi9MUDogJXgiLAorCQkJKHZvaWQgKilTdGF0MSwKKwkJCSh2b2lkICopU3RhdDIpOworCisJCVN0YXQxID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVTkVfRVhQLCAmU3RhdDEpOworCQlTdGF0MiA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9FWFRfU1RBVCwgJlN0YXQyKTsKKwkJU3RhdDEgPSBTdGF0MSA8PCAxNiB8IFN0YXQyOworCQlTdGF0MiA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV8xMDAwVF9DVFJMLCAmU3RhdDIpOworCQlTdGF0MyA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV8xMDAwVF9TVEFULCAmU3RhdDMpOworCQlTdGF0MiA9IFN0YXQyIDw8IDE2IHwgU3RhdDM7CisJCUNNU01QcmludFN0cmluZygKKwkJCXBBQy0+cENvbmZpZ1RhYmxlLAorCQkJTVNHX1RZUEVfUlVOVElNRV9JTkZPLAorCQkJIkFOIEV4cC9JRUVFIEV4dDogJXgsIDEwMDBUIEN0cmwvU3RhdDogJXgiLAorCQkJKHZvaWQgKilTdGF0MSwKKwkJCSh2b2lkICopU3RhdDIpOworCisJCVN0YXQxID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX1BfRVhUX0NUUkwsICZTdGF0MSk7CisJCVN0YXQyID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX1BfRVhUX1NUQVQsICZTdGF0Mik7CisJCVN0YXQxID0gU3RhdDEgPDwgMTYgfCBTdGF0MjsKKwkJU3RhdDIgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVYX0NUUkwsICZTdGF0Mik7CisJCVN0YXQzID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVWF9TVEFULCAmU3RhdDMpOworCQlTdGF0MiA9IFN0YXQyIDw8IDE2IHwgU3RhdDM7CisJCUNNU01QcmludFN0cmluZygKKwkJCXBBQy0+cENvbmZpZ1RhYmxlLAorCQkJTVNHX1RZUEVfUlVOVElNRV9JTkZPLAorCQkJIlBIWSBFeHQgQ3RybC9TdGF0OiAleCwgQXV4IEN0cmwvU3RhdDogJXgiLAorCQkJKHZvaWQgKilTdGF0MSwKKwkJCSh2b2lkICopU3RhdDIpOworCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJaWYgKChJc3JjICYgKFBIWV9CX0lTX05PX0hEQ0wgLyogfCBQSFlfQl9JU19OT19IREMgKi8pKSAhPSAwKSB7CisJCS8qCisJCSAqIFdvcmthcm91bmQgQkNvbSBFcnJhdGE6CisJCSAqCWVuYWJsZSBhbmQgZGlzYWJsZSBsb29wYmFjayBtb2RlIGlmICJOTyBIQ0QiIG9jY3Vycy4KKwkJICovCisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9DVFJMLCAmQ3RybCk7CisJCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQ1RSTCwKKwkJCShTS19VMTYpKEN0cmwgfCBQSFlfQ1RfTE9PUCkpOworCQlTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0NUUkwsCisJCQkoU0tfVTE2KShDdHJsICYgflBIWV9DVF9MT09QKSk7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiTm8gSENEIExpbmsgZXZlbnQsIFBvcnQgJWRcbiIsIFBvcnQpKTsKKyNpZmRlZiB4REVCVUcKKwkJQ01TTVByaW50U3RyaW5nKAorCQkJcEFDLT5wQ29uZmlnVGFibGUsCisJCQlNU0dfVFlQRV9SVU5USU1FX0lORk8sCisJCQkiTm8gSENEIGxpbmsgZXZlbnQsIHBvcnQgJWQuIiwKKwkJCSh2b2lkICopUG9ydCwKKwkJCSh2b2lkICopTlVMTCk7CisjZW5kaWYgLyogREVCVUcgKi8KKwl9CisKKwkvKiBOb3Qgb2Jzb2xldGU6IGxpbmsgc3RhdHVzIGJpdCBpcyBsYXRjaGVkIHRvIDAgYW5kIGF1dG9jbGVhcmluZyEgKi8KKwlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fU1RBVCwgJlBoeVN0YXQpOworCisJaWYgKHBQcnQtPlBIV0xpbmtVcCkgeworCQlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7CisJfQorCisjaWZkZWYgeERFQlVHCisJeworCQlTS19VMzIJU3RhdDEsIFN0YXQyLCBTdGF0MzsKKworCQlTdGF0MSA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9JTlRfTUFTSywgJlN0YXQxKTsKKwkJQ01TTVByaW50U3RyaW5nKAorCQkJcEFDLT5wQ29uZmlnVGFibGUsCisJCQlNU0dfVFlQRV9SVU5USU1FX0lORk8sCisJCQkiQ2hlY2tVcDFhIC0gU3RhdDogJXgsIE1hc2s6ICV4IiwKKwkJCSh2b2lkICopSXNyYywKKwkJCSh2b2lkICopU3RhdDEpOworCisJCVN0YXQxID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0NUUkwsICZTdGF0MSk7CisJCVN0YXQyID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX1NUQVQsICZQaHlTdGF0KTsKKwkJU3RhdDEgPSBTdGF0MSA8PCAxNiB8IFBoeVN0YXQ7CisJCVN0YXQyID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVTkVfQURWLCAmU3RhdDIpOworCQlTdGF0MyA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVU5FX0xQLCAmU3RhdDMpOworCQlTdGF0MiA9IFN0YXQyIDw8IDE2IHwgU3RhdDM7CisJCUNNU01QcmludFN0cmluZygKKwkJCXBBQy0+cENvbmZpZ1RhYmxlLAorCQkJTVNHX1RZUEVfUlVOVElNRV9JTkZPLAorCQkJIkN0cmwvU3RhdDogJXgsIEFOIEFkdi9MUDogJXgiLAorCQkJKHZvaWQgKilTdGF0MSwKKwkJCSh2b2lkICopU3RhdDIpOworCisJCVN0YXQxID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVTkVfRVhQLCAmU3RhdDEpOworCQlTdGF0MiA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9FWFRfU1RBVCwgJlN0YXQyKTsKKwkJU3RhdDEgPSBTdGF0MSA8PCAxNiB8IFN0YXQyOworCQlTdGF0MiA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV8xMDAwVF9DVFJMLCAmU3RhdDIpOworCQlTdGF0MyA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV8xMDAwVF9TVEFULCAmUmVzQWIpOworCQlTdGF0MiA9IFN0YXQyIDw8IDE2IHwgUmVzQWI7CisJCUNNU01QcmludFN0cmluZygKKwkJCXBBQy0+cENvbmZpZ1RhYmxlLAorCQkJTVNHX1RZUEVfUlVOVElNRV9JTkZPLAorCQkJIkFOIEV4cC9JRUVFIEV4dDogJXgsIDEwMDBUIEN0cmwvU3RhdDogJXgiLAorCQkJKHZvaWQgKilTdGF0MSwKKwkJCSh2b2lkICopU3RhdDIpOworCisJCVN0YXQxID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX1BfRVhUX0NUUkwsICZTdGF0MSk7CisJCVN0YXQyID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX1BfRVhUX1NUQVQsICZTdGF0Mik7CisJCVN0YXQxID0gU3RhdDEgPDwgMTYgfCBTdGF0MjsKKwkJU3RhdDIgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVYX0NUUkwsICZTdGF0Mik7CisJCVN0YXQzID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVWF9TVEFULCAmU3RhdDMpOworCQlTdGF0MiA9IFN0YXQyIDw8IDE2IHwgU3RhdDM7CisJCUNNU01QcmludFN0cmluZygKKwkJCXBBQy0+cENvbmZpZ1RhYmxlLAorCQkJTVNHX1RZUEVfUlVOVElNRV9JTkZPLAorCQkJIlBIWSBFeHQgQ3RybC9TdGF0OiAleCwgQXV4IEN0cmwvU3RhdDogJXgiLAorCQkJKHZvaWQgKilTdGF0MSwKKwkJCSh2b2lkICopU3RhdDIpOworCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJLyoKKwkgKiBIZXJlIHdlIHVzdWFsbHkgY2FuIGNoZWNrIHdoZXRoZXIgdGhlIGxpbmsgaXMgaW4gc3luYyBhbmQKKwkgKiBhdXRvLW5lZ290aWF0aW9uIGlzIGRvbmUuCisJICovCisKKwlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fU1RBVCwgJlBoeVN0YXQpOworCisJU2tNYWNBdXRvTmVnTGlwYVBoeShwQUMsIElvQywgUG9ydCwgUGh5U3RhdCk7CisJCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIkNoZWNrVXAgUG9ydCAlZCwgUGh5U3RhdDogMHglMDRYXG4iLCBQb3J0LCBQaHlTdGF0KSk7CisKKwlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fMTAwMFRfU1RBVCwgJlJlc0FiKTsKKworCWlmICgoUmVzQWIgJiBQSFlfQl8xMDAwU19NU0YpICE9IDApIHsKKwkJLyogRXJyb3IgKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJNYXN0ZXIvU2xhdmUgRmF1bHQgcG9ydCAlZFxuIiwgUG9ydCkpOworCQkKKwkJcFBydC0+UEF1dG9OZWdGYWlsID0gU0tfVFJVRTsKKwkJcFBydC0+UE1TU3RhdHVzID0gU0tfTVNfU1RBVF9GQVVMVDsKKwkJCisJCXJldHVybihTS19IV19QU19SRVNUQVJUKTsKKwl9CisKKwlpZiAoKFBoeVN0YXQgJiBQSFlfU1RfTFNZTkMpID09IDApIHsKKwkJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworCX0KKwkKKwlwUHJ0LT5QTVNTdGF0dXMgPSAoKFJlc0FiICYgUEhZX0JfMTAwMFNfTVNSKSAhPSAwKSA/CisJCVNLX01TX1NUQVRfTUFTVEVSIDogU0tfTVNfU1RBVF9TTEFWRTsKKwkKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiUG9ydCAlZCwgUmVzQWI6IDB4JTA0WFxuIiwgUG9ydCwgUmVzQWIpKTsKKworCWlmIChBdXRvTmVnKSB7CisJCWlmICgoUGh5U3RhdCAmIFBIWV9TVF9BTl9PVkVSKSAhPSAwKSB7CisJCQkKKwkJCVNrSFdMaW5rVXAocEFDLCBJb0MsIFBvcnQpOworCQkJCisJCQlEb25lID0gU2tNYWNBdXRvTmVnRG9uZShwQUMsIElvQywgUG9ydCk7CisJCQkKKwkJCWlmIChEb25lICE9IFNLX0FORF9PSykgeworI2lmZGVmIERFQlVHCisJCQkJLyogR2V0IFBIWSBwYXJhbWV0ZXJzLCBmb3IgZGVidWdnaW5nIG9ubHkgKi8KKwkJCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVORV9MUCwgJkxwQWIpOworCQkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV8xMDAwVF9TVEFULCAmRXh0U3RhdCk7CisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJCQkoIkF1dG9OZWcgRkFJTCBQb3J0ICVkIChMcEFiICV4LCAxMDAwVFN0YXQgJXgpXG4iLAorCQkJCQlQb3J0LCBMcEFiLCBFeHRTdGF0KSk7CisjZW5kaWYgLyogREVCVUcgKi8KKwkJCQlyZXR1cm4oU0tfSFdfUFNfUkVTVEFSVCk7CisJCQl9CisJCQllbHNlIHsKKyNpZmRlZiB4REVCVUcKKwkJCQkvKiBEdW1teSByZWFkIElTUiB0byBwcmV2ZW50IGV4dHJhIGxpbmsgZG93bnMvdXBzICovCisJCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0lOVF9TVEFULCAmRXh0U3RhdCk7CisKKwkJCQlpZiAoKEV4dFN0YXQgJiB+KFBIWV9CX0lTX0hDVCB8IFBIWV9CX0lTX0xDVCkpICE9IDApIHsKKwkJCQkJQ01TTVByaW50U3RyaW5nKAorCQkJCQkJcEFDLT5wQ29uZmlnVGFibGUsCisJCQkJCQlNU0dfVFlQRV9SVU5USU1FX0lORk8sCisJCQkJCQkiQ2hlY2tVcDIgLSBTdGF0OiAleCIsCisJCQkJCQkodm9pZCAqKUV4dFN0YXQsCisJCQkJCQkodm9pZCAqKU5VTEwpOworCQkJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCQkJCXJldHVybihTS19IV19QU19MSU5LKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlIHsJLyogIUF1dG9OZWcgKi8KKwkJLyogTGluayBpcyB1cCBhbmQgd2UgZG9uJ3QgbmVlZCBtb3JlLiAqLworI2lmZGVmIERFQlVHCisJCWlmIChwUHJ0LT5QTGlwYUF1dG9OZWcgPT0gU0tfTElQQV9BVVRPKSB7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJFUlJPUjogTGlwYSBhdXRvIGRldGVjdGVkIG9uIHBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisKKyNpZmRlZiB4REVCVUcKKwkJLyogRHVtbXkgcmVhZCBJU1IgdG8gcHJldmVudCBleHRyYSBsaW5rIGRvd25zL3VwcyAqLworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fSU5UX1NUQVQsICZFeHRTdGF0KTsKKworCQlpZiAoKEV4dFN0YXQgJiB+KFBIWV9CX0lTX0hDVCB8IFBIWV9CX0lTX0xDVCkpICE9IDApIHsKKwkJCUNNU01QcmludFN0cmluZygKKwkJCQlwQUMtPnBDb25maWdUYWJsZSwKKwkJCQlNU0dfVFlQRV9SVU5USU1FX0lORk8sCisJCQkJIkNoZWNrVXAzIC0gU3RhdDogJXgiLAorCQkJCSh2b2lkICopRXh0U3RhdCwKKwkJCQkodm9pZCAqKU5VTEwpOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKwkJCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJKCJMaW5rIHN5bmMoR1ApLCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCVNrSFdMaW5rVXAocEFDLCBJb0MsIFBvcnQpOworCQkKKwkJcmV0dXJuKFNLX0hXX1BTX0xJTkspOworCX0KKworCXJldHVybihTS19IV19QU19OT05FKTsKK30JLyogU2tHZVBvcnRDaGVja1VwQmNvbSAqLworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKworCisjaWZkZWYgWVVLT04KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa0dlUG9ydENoZWNrVXBHbWFjKCkgLSBDaGVjayBpZiB0aGUgbGluayBpcyB1cCBvbiBNYXJ2ZWxsIFBIWQorICoKKyAqIHJldHVybjoKKyAqCTAJby5rLiBub3RoaW5nIG5lZWRlZAorICoJMQlSZXN0YXJ0IG5lZWRlZCBvbiB0aGlzIHBvcnQKKyAqCTIJTGluayBjYW1lIHVwCisgKi8KK3N0YXRpYyBpbnQgU2tHZVBvcnRDaGVja1VwR21hYygKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBDb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBXaGljaCBwb3J0IHNob3VsZCBiZSBjaGVja2VkICovCitTS19CT09MCUF1dG9OZWcpCS8qIElzIEF1dG8tbmVnb3RpYXRpb24gdXNlZCA/ICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisJaW50CQkJRG9uZTsKKwlTS19VMTYJCVBoeUlzcmM7CS8qIFBIWSBJbnRlcnJ1cHQgc291cmNlICovCisJU0tfVTE2CQlQaHlTdGF0OwkvKiBQUFkgU3RhdHVzICovCisJU0tfVTE2CQlQaHlTcGVjU3RhdDsvKiBQSFkgU3BlY2lmaWMgU3RhdHVzICovCisJU0tfVTE2CQlSZXNBYjsJCS8qIE1hc3Rlci9TbGF2ZSByZXNvbHV0aW9uICovCisJU0tfRVZQQVJBCVBhcmE7CisjaWZkZWYgREVCVUcKKwlTS19VMTYJCVdvcmQ7CQkvKiBJL08gaGVscGVyICovCisjZW5kaWYgLyogREVCVUcgKi8KKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJaWYgKHBQcnQtPlBIV0xpbmtVcCkgeworCQlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7CisJfQorCisJLyogUmVhZCBQSFkgU3RhdHVzICovCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1NUQVQsICZQaHlTdGF0KTsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJDaGVja1VwIFBvcnQgJWQsIFBoeVN0YXQ6IDB4JTA0WFxuIiwgUG9ydCwgUGh5U3RhdCkpOworCisJLyogUmVhZCBQSFkgSW50ZXJydXB0IFN0YXR1cyAqLworCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9JTlRfU1RBVCwgJlBoeUlzcmMpOworCisJaWYgKChQaHlJc3JjICYgUEhZX01fSVNfQU5fQ09NUEwpICE9IDApIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJBdXRvLU5lZ290aWF0aW9uIENvbXBsZXRlZCwgUGh5SXNyYzogMHglMDRYXG4iLCBQaHlJc3JjKSk7CisJfQorCisJaWYgKChQaHlJc3JjICYgUEhZX01fSVNfTFNQX0NIQU5HRSkgIT0gMCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkxpbmsgU3BlZWQgQ2hhbmdlZCwgUGh5SXNyYzogMHglMDRYXG4iLCBQaHlJc3JjKSk7CisJfQorCisJU2tNYWNBdXRvTmVnTGlwYVBoeShwQUMsIElvQywgUG9ydCwgUGh5U3RhdCk7CisJCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWXzEwMDBUX1NUQVQsICZSZXNBYik7CisKKwlpZiAoKFJlc0FiICYgUEhZX0JfMTAwMFNfTVNGKSAhPSAwKSB7CisJCS8qIEVycm9yICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiTWFzdGVyL1NsYXZlIEZhdWx0IHBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJCisJCXBQcnQtPlBBdXRvTmVnRmFpbCA9IFNLX1RSVUU7CisJCXBQcnQtPlBNU1N0YXR1cyA9IFNLX01TX1NUQVRfRkFVTFQ7CisJCQorCQlyZXR1cm4oU0tfSFdfUFNfUkVTVEFSVCk7CisJfQorCisJLyogUmVhZCBQSFkgU3BlY2lmaWMgU3RhdHVzICovCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1BIWV9TVEFULCAmUGh5U3BlY1N0YXQpOworCQorCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJQaHkxMDAwQlQ6IDB4JTA0WCwgUGh5U3BlY1N0YXQ6IDB4JTA0WFxuIiwgUmVzQWIsIFBoeVNwZWNTdGF0KSk7CisKKyNpZmRlZiBERUJVRworCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9BVU5FX0VYUCwgJldvcmQpOworCisJaWYgKChQaHlJc3JjICYgUEhZX01fSVNfQU5fUFIpICE9IDAgfHwgKFdvcmQgJiBQSFlfQU5FX1JYX1BHKSAhPSAwIHx8CisJCShQaHlTcGVjU3RhdCAmIFBIWV9NX1BTX1BBR0VfUkVDKSAhPSAwKSAgeworCQkvKiBSZWFkIFBIWSBOZXh0IFBhZ2UgTGluayBQYXJ0bmVyICovCisJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9ORVBHX0xQLCAmV29yZCk7CisKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJQYWdlIFJlY2VpdmVkLCBOZXh0UGFnZTogMHglMDRYXG4iLCBXb3JkKSk7CisJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwlpZiAoKFBoeVNwZWNTdGF0ICYgUEhZX01fUFNfTElOS19VUCkgPT0gMCkgeworCQlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7CisJfQorCQorCWlmICgoUGh5U3BlY1N0YXQgJiBQSFlfTV9QU19ET1dOU19TVEFUKSAhPSAwIHx8CisJCShQaHlJc3JjICYgUEhZX01fSVNfRE9XTlNIX0RFVCkgIT0gMCkgeworCQkvKiBEb3duc2hpZnQgZGV0ZWN0ZWQgKi8KKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9TSVJRX0UwMjUsIFNLRVJSX1NJUlFfRTAyNU1TRyk7CisJCQorCQlQYXJhLlBhcmE2NCA9IFBvcnQ7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfRE9XTlNISUZUX0RFVCwgUGFyYSk7CisJCQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkRvd25zaGlmdCBkZXRlY3RlZCwgUGh5SXNyYzogMHglMDRYXG4iLCBQaHlJc3JjKSk7CisJfQorCisJcFBydC0+UE1TU3RhdHVzID0gKChSZXNBYiAmIFBIWV9CXzEwMDBTX01TUikgIT0gMCkgPworCQlTS19NU19TVEFUX01BU1RFUiA6IFNLX01TX1NUQVRfU0xBVkU7CisJCisJcFBydC0+UENhYmxlTGVuID0gKFNLX1U4KSgoUGh5U3BlY1N0YXQgJiBQSFlfTV9QU19DQUJMRV9NU0spID4+IDcpOworCQorCWlmIChBdXRvTmVnKSB7CisJCS8qIEF1dG8tTmVnb3RpYXRpb24gT3ZlciA/ICovCisJCWlmICgoUGh5U3RhdCAmIFBIWV9TVF9BTl9PVkVSKSAhPSAwKSB7CisJCQkKKwkJCVNrSFdMaW5rVXAocEFDLCBJb0MsIFBvcnQpOworCQkJCisJCQlEb25lID0gU2tNYWNBdXRvTmVnRG9uZShwQUMsIElvQywgUG9ydCk7CisJCQkKKwkJCWlmIChEb25lICE9IFNLX0FORF9PSykgeworCQkJCXJldHVybihTS19IV19QU19SRVNUQVJUKTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuKFNLX0hXX1BTX0xJTkspOworCQl9CisJfQorCWVsc2UgewkvKiAhQXV0b05lZyAqLworCQkvKiBMaW5rIGlzIHVwIGFuZCB3ZSBkb24ndCBuZWVkIG1vcmUgKi8KKyNpZmRlZiBERUJVRworCQlpZiAocFBydC0+UExpcGFBdXRvTmVnID09IFNLX0xJUEFfQVVUTykgeworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiRVJST1I6IExpcGEgYXV0byBkZXRlY3RlZCBvbiBwb3J0ICVkXG4iLCBQb3J0KSk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJKCJMaW5rIHN5bmMsIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJU2tIV0xpbmtVcChwQUMsIElvQywgUG9ydCk7CisJCQorCQlyZXR1cm4oU0tfSFdfUFNfTElOSyk7CisJfQorCisJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworfQkvKiBTa0dlUG9ydENoZWNrVXBHbWFjICovCisjZW5kaWYgLyogWVVLT04gKi8KKworCisjaWZkZWYgT1RIRVJfUEhZCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tHZVBvcnRDaGVja1VwTG9uZSgpIC0gQ2hlY2sgaWYgdGhlIGxpbmsgaXMgdXAgb24gTGV2ZWwgT25lIFBIWQorICoKKyAqIHJldHVybjoKKyAqCTAJby5rLiBub3RoaW5nIG5lZWRlZAorICoJMQlSZXN0YXJ0IG5lZWRlZCBvbiB0aGlzIHBvcnQKKyAqCTIJTGluayBjYW1lIHVwCisgKi8KK3N0YXRpYyBpbnQgU2tHZVBvcnRDaGVja1VwTG9uZSgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBDb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBXaGljaCBwb3J0IHNob3VsZCBiZSBjaGVja2VkICovCitTS19CT09MCUF1dG9OZWcpCS8qIElzIEF1dG8tbmVnb3RpYXRpb24gdXNlZCA/ICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisJaW50CQkJRG9uZTsKKwlTS19VMTYJCUlzcmM7CQkvKiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICovCisJU0tfVTE2CQlMcEFiOwkJLyogTGluayBQYXJ0bmVyIEFiaWxpdHkgKi8KKwlTS19VMTYJCUV4dFN0YXQ7CS8qIEV4dGVuZGVkIFN0YXR1cyBSZWdpc3RlciAqLworCVNLX1UxNgkJUGh5U3RhdDsJLyogUGh5IFN0YXR1cyBSZWdpc3RlciAqLworCVNLX1UxNgkJU3RhdFN1bTsKKwlTS19VOAkJTmV4dE1vZGU7CS8qIE5leHQgQXV0b1NlbnNpbmcgTW9kZSAqLworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAocFBydC0+UEhXTGlua1VwKSB7CisJCXJldHVybihTS19IV19QU19OT05FKTsKKwl9CisKKwlTdGF0U3VtID0gcFBydC0+UElzYXZlOworCXBQcnQtPlBJc2F2ZSA9IDA7CisKKwkvKgorCSAqIGhlcmUgd2UgdXN1YWxseSBjYW4gY2hlY2sgd2hldGhlciB0aGUgbGluayBpcyBpbiBzeW5jIGFuZAorCSAqIGF1dG8tbmVnb3RpYXRpb24gaXMgZG9uZS4KKwkgKi8KKwlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0xPTkVfU1RBVCwgJlBoeVN0YXQpOworCVN0YXRTdW0gfD0gUGh5U3RhdDsKKworCVNrTWFjQXV0b05lZ0xpcGFQaHkocEFDLCBJb0MsIFBvcnQsIFBoeVN0YXQpOworCQorCWlmICgoUGh5U3RhdCAmIFBIWV9TVF9MU1lOQykgPT0gMCkgeworCQkvKiBTYXZlIEF1dG8tbmVnb3RpYXRpb24gRG9uZSBiaXQgKi8KKwkJcFBydC0+UElzYXZlID0gKFNLX1UxNikoU3RhdFN1bSAmIFBIWV9TVF9BTl9PVkVSKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKHBQcnQtPlBJc2F2ZSAmIFBIWV9TVF9BTl9PVkVSKSAhPSAwKSB7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJBdXRvTmVnIGRvbmUgcmVzY2hlZHVsZWQgUG9ydCAlZFxuIiwgUG9ydCkpOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKwkJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworCX0KKworCWlmIChBdXRvTmVnKSB7CisJCWlmICgoU3RhdFN1bSAmIFBIWV9TVF9BTl9PVkVSKSAhPSAwKSB7CisJCQlTa0hXTGlua1VwKHBBQywgSW9DLCBQb3J0KTsKKwkJCURvbmUgPSBTa01hY0F1dG9OZWdEb25lKHBBQywgSW9DLCBQb3J0KTsKKwkJCWlmIChEb25lICE9IFNLX0FORF9PSykgeworCQkJCS8qIEdldCBQSFkgcGFyYW1ldGVycywgZm9yIGRlYnVnZ2luZyBvbmx5ICovCisJCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9MT05FX0FVTkVfTFAsICZMcEFiKTsKKwkJCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0xPTkVfMTAwMFRfU1RBVCwgJkV4dFN0YXQpOworCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkJKCJBdXRvTmVnIEZBSUwgUG9ydCAlZCAoTHBBYiAleCwgMTAwMFRTdGF0ICV4KVxuIiwKKwkJCQkJIFBvcnQsIExwQWIsIEV4dFN0YXQpKTsKKwkJCQkJCisJCQkJLyogVHJ5IG5leHQgcG9zc2libGUgbW9kZSAqLworCQkJCU5leHRNb2RlID0gU2tIV1NlbnNlR2V0TmV4dChwQUMsIElvQywgUG9ydCk7CisJCQkJU2tIV0xpbmtEb3duKHBBQywgSW9DLCBQb3J0KTsKKwkJCQlpZiAoRG9uZSA9PSBTS19BTkRfRFVQX0NBUCkgeworCQkJCQkvKiBHb1RvIG5leHQgbW9kZSAqLworCQkJCQlTa0hXU2Vuc2VTZXROZXh0KHBBQywgSW9DLCBQb3J0LCBOZXh0TW9kZSk7CisJCQkJfQorCisJCQkJcmV0dXJuKFNLX0hXX1BTX1JFU1RBUlQpOworCisJCQl9CisJCQllbHNlIHsKKwkJCQkvKgorCQkJCSAqIER1bW15IFJlYWQgaW50ZXJydXB0IHN0YXR1cyB0byBwcmV2ZW50CisJCQkJICogZXh0cmEgbGluayBkb3duL3VwcworCQkJCSAqLworCQkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTE9ORV9JTlRfU1RBVCwgJkV4dFN0YXQpOworCQkJCXJldHVybihTS19IV19QU19MSU5LKTsKKwkJCX0KKwkJfQorCQkKKwkJLyogQXV0b05lZyBub3QgZG9uZSwgYnV0IEhXIGxpbmsgaXMgdXAuIENoZWNrIGZvciB0aW1lb3V0cyAqLworCQlwUHJ0LT5QQXV0b05lZ1RpbWVPdXQrKzsKKwkJaWYgKHBQcnQtPlBBdXRvTmVnVGltZU91dCA+PSBTS19BTkRfTUFYX1RPKSB7CisJCQkvKiBUaW1lb3V0IG9jY3VyZWQgKi8KKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJCSgiQXV0b05lZyB0aW1lb3V0IFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJCWlmIChwUHJ0LT5QTGlua01vZGVDb25mID09IFNLX0xNT0RFX0FVVE9TRU5TRSAmJgorCQkJCXBQcnQtPlBMaXBhQXV0b05lZyAhPSBTS19MSVBBX0FVVE8pIHsKKwkJCQkvKiBTZXQgTGluayBtYW51YWxseSB1cCAqLworCQkJCVNrSFdTZW5zZVNldE5leHQocEFDLCBJb0MsIFBvcnQsIFNLX0xNT0RFX0ZVTEwpOworCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJCQkoIlNldCBtYW51YWwgZnVsbCBkdXBsZXggUG9ydCAlZFxuIiwgUG9ydCkpOworCQkJfQorCisJCQkvKiBEbyB0aGUgcmVzdGFydCAqLworCQkJcmV0dXJuKFNLX0hXX1BTX1JFU1RBUlQpOworCQl9CisJfQorCWVsc2UgeworCQkvKiBMaW5rIGlzIHVwIGFuZCB3ZSBkb24ndCBuZWVkIG1vcmUgKi8KKyNpZmRlZiBERUJVRworCQlpZiAocFBydC0+UExpcGFBdXRvTmVnID09IFNLX0xJUEFfQVVUTykgeworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiRVJST1I6IExpcGEgYXV0byBkZXRlY3RlZCBvbiBwb3J0ICVkXG4iLCBQb3J0KSk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJCS8qCisJCSAqIER1bW15IFJlYWQgaW50ZXJydXB0IHN0YXR1cyB0byBwcmV2ZW50CisJCSAqIGV4dHJhIGxpbmsgZG93bi91cHMKKwkJICovCisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTE9ORV9JTlRfU1RBVCwgJkV4dFN0YXQpOworCQkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkoIkxpbmsgc3luYyhHUCksIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJU2tIV0xpbmtVcChwQUMsIElvQywgUG9ydCk7CisJCQorCQlyZXR1cm4oU0tfSFdfUFNfTElOSyk7CisJfQorCisJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworfQkvKiBTa0dlUG9ydENoZWNrVXBMb25lICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrR2VQb3J0Q2hlY2tVcE5hdCgpIC0gQ2hlY2sgaWYgdGhlIGxpbmsgaXMgdXAgb24gTmF0aW9uYWwgUEhZCisgKgorICogcmV0dXJuOgorICoJMAlvLmsuIG5vdGhpbmcgbmVlZGVkCisgKgkxCVJlc3RhcnQgbmVlZGVkIG9uIHRoaXMgcG9ydAorICoJMglMaW5rIGNhbWUgdXAKKyAqLworc3RhdGljIGludCBTa0dlUG9ydENoZWNrVXBOYXQoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gQ29udGV4dCAqLworaW50CQlQb3J0LAkJLyogV2hpY2ggcG9ydCBzaG91bGQgYmUgY2hlY2tlZCAqLworU0tfQk9PTAlBdXRvTmVnKQkvKiBJcyBBdXRvLW5lZ290aWF0aW9uIHVzZWQgPyAqLworeworCS8qIHRvZG86IE5hdGlvbmFsICovCisJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworfQkvKiBTa0dlUG9ydENoZWNrVXBOYXQgKi8KKyNlbmRpZiAvKiBPVEhFUl9QSFkgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZVNpcnFFdmVudCgpIC0gRXZlbnQgU2VydmljZSBSb3V0aW5lCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogTm90ZXM6CisgKi8KK2ludAlTa0dlU2lycUV2ZW50KAorU0tfQUMJCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkJLyogSW8gQ29udGV4dCAqLworU0tfVTMyCQlFdmVudCwJCS8qIE1vZHVsZSBzcGVjaWZpYyBFdmVudCAqLworU0tfRVZQQVJBCVBhcmEpCQkvKiBFdmVudCBzcGVjaWZpYyBQYXJhbWV0ZXIgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKwlTS19VMzIJCVBvcnQ7CisJU0tfVTMyCQlWYWwzMjsKKwlpbnQJCQlQb3J0U3RhdDsKKwlTS19VOAkJVmFsODsKKyNpZmRlZiBHRU5FU0lTCisJU0tfVTY0CQlPY3RldHM7CisjZW5kaWYgLyogR0VORVNJUyAqLworCisJUG9ydCA9IFBhcmEuUGFyYTMyWzBdOworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJc3dpdGNoIChFdmVudCkgeworCWNhc2UgU0tfSFdFVl9XQVRJTToKKwkJaWYgKHBQcnQtPlBTdGF0ZSA9PSBTS19QUlRfUkVTRVQpIHsKKwkJCisJCQlQb3J0U3RhdCA9IFNLX0hXX1BTX05PTkU7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBDaGVjayB3aGV0aGVyIHBvcnQgY2FtZSB1cCAqLworCQkJUG9ydFN0YXQgPSBTa0dlUG9ydENoZWNrVXAocEFDLCBJb0MsIChpbnQpUG9ydCk7CisJCX0KKworCQlzd2l0Y2ggKFBvcnRTdGF0KSB7CisJCWNhc2UgU0tfSFdfUFNfUkVTVEFSVDoKKwkJCWlmIChwUHJ0LT5QSFdMaW5rVXApIHsKKwkJCQkvKiBTZXQgTGluayB0byBkb3duICovCisJCQkJU2tIV0xpbmtEb3duKHBBQywgSW9DLCAoaW50KVBvcnQpOworCisJCQkJLyoKKwkJCQkgKiBTaWduYWwgZGlyZWN0bHkgdG8gUkxNVCB0byBlbnN1cmUgY29ycmVjdAorCQkJCSAqIHNlcXVlbmNlIG9mIFNXSVRDSCBhbmQgUkVTRVQgZXZlbnQuCisJCQkJICovCisJCQkJU2tSbG10RXZlbnQocEFDLCBJb0MsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKwkJCX0KKworCQkJLyogUmVzdGFydCBuZWVkZWQgKi8KKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUE9SVF9SRVNFVCwgUGFyYSk7CisJCQlicmVhazsKKworCQljYXNlIFNLX0hXX1BTX0xJTks6CisJCQkvKiBTaWduYWwgdG8gUkxNVCAqLworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX0xJTktfVVAsIFBhcmEpOworCQkJYnJlYWs7CisJCX0KKwkJCisJCS8qIFN0YXJ0IGFnYWluIHRoZSBjaGVjayBUaW1lciAqLworCQlpZiAocFBydC0+UEhXTGlua1VwKSB7CisJCQlWYWwzMiA9IFNLX1dBX0FDVF9USU1FOworCQl9CisJCWVsc2UgeworCQkJVmFsMzIgPSBTS19XQV9JTkFfVElNRTsKKwkJfQorCisJCS8qIFRvZG86IHN0aWxsIG5lZWRlZCBmb3Igbm9uLVhNQUMgUEhZcz8/PyAqLworCQkvKiBTdGFydCB3b3JrYXJvdW5kIEVycmF0YSAjMiB0aW1lciAqLworCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwUHJ0LT5QV2FUaW1lciwgVmFsMzIsCisJCQlTS0dFX0hXQUMsIFNLX0hXRVZfV0FUSU0sIFBhcmEpOworCQlicmVhazsKKworCWNhc2UgU0tfSFdFVl9QT1JUX1NUQVJUOgorCQlpZiAocFBydC0+UEhXTGlua1VwKSB7CisJCQkvKgorCQkJICogU2lnbmFsIGRpcmVjdGx5IHRvIFJMTVQgdG8gZW5zdXJlIGNvcnJlY3QKKwkJCSAqIHNlcXVlbmNlIG9mIFNXSVRDSCBhbmQgUkVTRVQgZXZlbnQuCisJCQkgKi8KKwkJCVNrUmxtdEV2ZW50KHBBQywgSW9DLCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisJCX0KKworCQlTa0hXTGlua0Rvd24ocEFDLCBJb0MsIChpbnQpUG9ydCk7CisKKwkJLyogU2NoZWR1bGUgUG9ydCBSRVNFVCAqLworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1BPUlRfUkVTRVQsIFBhcmEpOworCisJCS8qIFN0YXJ0IHdvcmthcm91bmQgRXJyYXRhICMyIHRpbWVyICovCisJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBQcnQtPlBXYVRpbWVyLCBTS19XQV9JTkFfVElNRSwKKwkJCVNLR0VfSFdBQywgU0tfSFdFVl9XQVRJTSwgUGFyYSk7CisJCWJyZWFrOworCisJY2FzZSBTS19IV0VWX1BPUlRfU1RPUDoKKwkJaWYgKHBQcnQtPlBIV0xpbmtVcCkgeworCQkJLyoKKwkJCSAqIFNpZ25hbCBkaXJlY3RseSB0byBSTE1UIHRvIGVuc3VyZSBjb3JyZWN0CisJCQkgKiBzZXF1ZW5jZSBvZiBTV0lUQ0ggYW5kIFJFU0VUIGV2ZW50LgorCQkJICovCisJCQlTa1JsbXRFdmVudChwQUMsIElvQywgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCQl9CisKKwkJLyogU3RvcCBXb3JrYXJvdW5kIFRpbWVyICovCisJCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcFBydC0+UFdhVGltZXIpOworCisJCVNrSFdMaW5rRG93bihwQUMsIElvQywgKGludClQb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX0hXRVZfVVBEQVRFX1NUQVQ6CisJCS8qIFdlIGRvIE5PVCBuZWVkIHRvIHVwZGF0ZSBhbnkgc3RhdGlzdGljcyAqLworCQlicmVhazsKKworCWNhc2UgU0tfSFdFVl9DTEVBUl9TVEFUOgorCQkvKiBXZSBkbyBOT1QgbmVlZCB0byBjbGVhciBhbnkgc3RhdGlzdGljcyAqLworCQlmb3IgKFBvcnQgPSAwOyBQb3J0IDwgKFNLX1UzMilwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IFBvcnQrKykgeworCQkJcFBydC0+UFByZXZSeCA9IDA7CisJCQlwUHJ0LT5QUHJldkZjcyA9IDA7CisJCQlwUHJ0LT5QUHJldlNob3J0cyA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNLX0hXRVZfU0VUX0xNT0RFOgorCQlWYWw4ID0gKFNLX1U4KVBhcmEuUGFyYTMyWzFdOworCQlpZiAocFBydC0+UExpbmtNb2RlQ29uZiAhPSBWYWw4KSB7CisJCQkvKiBTZXQgTmV3IGxpbmsgbW9kZSAqLworCQkJcFBydC0+UExpbmtNb2RlQ29uZiA9IFZhbDg7CisKKwkJCS8qIFJlc3RhcnQgUG9ydCAqLworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9IV0FDLCBTS19IV0VWX1BPUlRfU1RPUCwgUGFyYSk7CisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0hXQUMsIFNLX0hXRVZfUE9SVF9TVEFSVCwgUGFyYSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNLX0hXRVZfU0VUX0ZMT1dNT0RFOgorCQlWYWw4ID0gKFNLX1U4KVBhcmEuUGFyYTMyWzFdOworCQlpZiAocFBydC0+UEZsb3dDdHJsTW9kZSAhPSBWYWw4KSB7CisJCQkvKiBTZXQgTmV3IEZsb3cgQ29udHJvbCBtb2RlICovCisJCQlwUHJ0LT5QRmxvd0N0cmxNb2RlID0gVmFsODsKKworCQkJLyogUmVzdGFydCBQb3J0ICovCisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0hXQUMsIFNLX0hXRVZfUE9SVF9TVE9QLCBQYXJhKTsKKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfSFdBQywgU0tfSFdFVl9QT1JUX1NUQVJULCBQYXJhKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0tfSFdFVl9TRVRfUk9MRToKKwkJLyogbm90IHBvc3NpYmxlIGZvciBmaWJlciAqLworCQlpZiAoIXBBQy0+R0luaS5HSUNvcHBlclR5cGUpIHsKKwkJCWJyZWFrOworCQl9CisJCVZhbDggPSAoU0tfVTgpUGFyYS5QYXJhMzJbMV07CisJCWlmIChwUHJ0LT5QTVNNb2RlICE9IFZhbDgpIHsKKwkJCS8qIFNldCBOZXcgUm9sZSAoTWFzdGVyL1NsYXZlKSBtb2RlICovCisJCQlwUHJ0LT5QTVNNb2RlID0gVmFsODsKKworCQkJLyogUmVzdGFydCBQb3J0ICovCisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0hXQUMsIFNLX0hXRVZfUE9SVF9TVE9QLCBQYXJhKTsKKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfSFdBQywgU0tfSFdFVl9QT1JUX1NUQVJULCBQYXJhKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0tfSFdFVl9TRVRfU1BFRUQ6CisJCWlmIChwUHJ0LT5QaHlUeXBlICE9IFNLX1BIWV9NQVJWX0NPUFBFUikgeworCQkJYnJlYWs7CisJCX0KKwkJVmFsOCA9IChTS19VOClQYXJhLlBhcmEzMlsxXTsKKwkJaWYgKHBQcnQtPlBMaW5rU3BlZWQgIT0gVmFsOCkgeworCQkJLyogU2V0IE5ldyBTcGVlZCBwYXJhbWV0ZXIgKi8KKwkJCXBQcnQtPlBMaW5rU3BlZWQgPSBWYWw4OworCisJCQkvKiBSZXN0YXJ0IFBvcnQgKi8KKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfSFdBQywgU0tfSFdFVl9QT1JUX1NUT1AsIFBhcmEpOworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9IV0FDLCBTS19IV0VWX1BPUlRfU1RBUlQsIFBhcmEpOworCQl9CisJCWJyZWFrOworCisjaWZkZWYgR0VORVNJUworCWNhc2UgU0tfSFdFVl9IQUxGRFVQX0NISzoKKwkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCS8qCisJCQkgKiBoYWxmIGR1cGxleCBoYW5ndXAgd29ya2Fyb3VuZC4KKwkJCSAqIFNlZSBwYWNrZXQgYXJiaXRlciB0aW1lb3V0IGludGVycnVwdCBmb3IgZGVzY3JpcHRpb24KKwkJCSAqLworCQkJcFBydC0+SGFsZkR1cFRpbWVyQWN0aXZlID0gU0tfRkFMU0U7CisJCQlpZiAocFBydC0+UExpbmtNb2RlU3RhdHVzID09IFNLX0xNT0RFX1NUQVRfSEFMRiB8fAorCQkJCXBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9PSBTS19MTU9ERV9TVEFUX0FVVE9IQUxGKSB7CisjaWZkZWYgWFhYCisJCQkJTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCQkJU2tQbm1pR2V0VmFyKHBBQywgSW9DLCBPSURfU0tHRV9TVEFUX1RYX09DVEVUUywgKGNoYXIgKikmT2N0ZXRzLAorCQkJCQkmTGVuLCAoU0tfVTMyKVNLX1BOTUlfUE9SVF9QSFlTMklOU1QocEFDLCBQb3J0KSwKKwkJCQkJcEFDLT5SbG10LlBvcnRbUG9ydF0uTmV0LT5OZXROdW1iZXIpOworI2VuZGlmIC8qIFhYWCAqLworCQkJCS8qIFNuYXAgc3RhdGlzdGljIGNvdW50ZXJzICovCisJCQkJKHZvaWQpU2tYbVVwZGF0ZVN0YXRzKHBBQywgSW9DLCBQb3J0KTsKKworCQkJCSh2b2lkKVNrWG1NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBvcnQsIFhNX1RYT19PS19ISSwgJlZhbDMyKTsKKworCQkJCU9jdGV0cyA9IChTS19VNjQpVmFsMzIgPDwgMzI7CisJCQkJCisJCQkJKHZvaWQpU2tYbU1hY1N0YXRpc3RpYyhwQUMsIElvQywgUG9ydCwgWE1fVFhPX09LX0xPLCAmVmFsMzIpOworCisJCQkJT2N0ZXRzICs9IFZhbDMyOworCQkJCQorCQkJCWlmIChwUHJ0LT5MYXN0T2N0ZXRzID09IE9jdGV0cykgeworCQkJCQkvKiBUeCBoYW5naW5nLCBhIEZJRk8gZmx1c2ggcmVzdGFydHMgaXQgKi8KKwkJCQkJU2tNYWNGbHVzaFR4RmlmbyhwQUMsIElvQywgUG9ydCk7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKwlkZWZhdWx0OgorCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX1NJUlFfRTAwMSwgU0tFUlJfU0lSUV9FMDAxTVNHKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuKDApOworfQkvKiBTa0dlU2lycUV2ZW50ICovCisKKworI2lmZGVmIEdFTkVTSVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1BoeUlzckJjb20oKSAtIFBIWSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lCisgKgorICogRGVzY3JpcHRpb246IGhhbmRsZXMgYWxsIGludGVycnVwdHMgZnJvbSBCQ29tIFBIWQorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBTa1BoeUlzckJjb20oCitTS19BQwkJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCQkvKiBJbyBDb250ZXh0ICovCitpbnQJCQlQb3J0LAkJLyogUG9ydCBOdW0gPSBQSFkgTnVtICovCitTS19VMTYJCUlTdGF0dXMpCS8qIEludGVycnVwdCBTdGF0dXMgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKwlTS19FVlBBUkEJUGFyYTsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJaWYgKChJU3RhdHVzICYgUEhZX0JfSVNfUFNFKSAhPSAwKSB7CisJCS8qIEluY29ycmVjdGFibGUgcGFpciBzd2FwIGVycm9yICovCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX1NJUlFfRTAyMiwKKwkJCVNLRVJSX1NJUlFfRTAyMk1TRyk7CisJfQorCQorCWlmICgoSVN0YXR1cyAmIChQSFlfQl9JU19BTl9QUiB8IFBIWV9CX0lTX0xTVF9DSEFOR0UpKSAhPSAwKSB7CisKKwkJU2tIV0xpbmtEb3duKHBBQywgSW9DLCBQb3J0KTsKKworCQlQYXJhLlBhcmEzMlswXSA9IChTS19VMzIpUG9ydDsKKwkJLyogU2lnbmFsIHRvIFJMTVQgKi8KKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisKKwkJLyogU3RhcnQgd29ya2Fyb3VuZCBFcnJhdGEgIzIgdGltZXIgKi8KKwkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcFBydC0+UFdhVGltZXIsIFNLX1dBX0lOQV9USU1FLAorCQkJU0tHRV9IV0FDLCBTS19IV0VWX1dBVElNLCBQYXJhKTsKKwl9CisKK30JLyogU2tQaHlJc3JCY29tICovCisjZW5kaWYgLyogR0VORVNJUyAqLworCisKKyNpZmRlZiBZVUtPTgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUGh5SXNyR21hYygpIC0gUEhZIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUKKyAqCisgKiBEZXNjcmlwdGlvbjogaGFuZGxlcyBhbGwgaW50ZXJydXB0cyBmcm9tIE1hcnZlbGwgUEhZCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIFNrUGh5SXNyR21hYygKK1NLX0FDCQkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJCS8qIElvIENvbnRleHQgKi8KK2ludAkJCVBvcnQsCQkvKiBQb3J0IE51bSA9IFBIWSBOdW0gKi8KK1NLX1UxNgkJSVN0YXR1cykJLyogSW50ZXJydXB0IFN0YXR1cyAqLworeworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCVNLX0VWUEFSQQlQYXJhOworCVNLX1UxNgkJV29yZDsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJaWYgKChJU3RhdHVzICYgKFBIWV9NX0lTX0FOX1BSIHwgUEhZX01fSVNfTFNUX0NIQU5HRSkpICE9IDApIHsKKworCQlTa0hXTGlua0Rvd24ocEFDLCBJb0MsIFBvcnQpOworCisJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9BVU5FX0FEViwgJldvcmQpOworCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQXV0b05lZy5BZHY6IDB4JTA0WFxuIiwgV29yZCkpOworCQkKKwkJLyogU2V0IEF1dG8tbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudCAqLworCQlpZiAocFBydC0+UEZsb3dDdHJsTW9kZSA9PSBTS19GTE9XX01PREVfU1lNX09SX1JFTSkgeworCQkJLyogcmVzdG9yZSBBc3ltbWV0cmljIFBhdXNlIGJpdCAqLworCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9BVU5FX0FEViwKKwkJCQkoU0tfVTE2KShXb3JkIHwgUEhZX01fQU5fQVNQKSk7CisJCX0KKwkJCisJCVBhcmEuUGFyYTMyWzBdID0gKFNLX1UzMilQb3J0OworCQkvKiBTaWduYWwgdG8gUkxNVCAqLworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKwl9CisJCisJaWYgKChJU3RhdHVzICYgUEhZX01fSVNfQU5fRVJST1IpICE9IDApIHsKKwkJLyogQXV0by1OZWdvdGlhdGlvbiBFcnJvciAqLworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX1NJUlFfRTAyMywgU0tFUlJfU0lSUV9FMDIzTVNHKTsKKwl9CisJCisJaWYgKChJU3RhdHVzICYgUEhZX01fSVNfRklGT19FUlJPUikgIT0gMCkgeworCQkvKiBGSUZPIE92ZXJmbG93L1VuZGVycnVuIEVycm9yICovCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfU0lSUV9FMDI0LCBTS0VSUl9TSVJRX0UwMjRNU0cpOworCX0KKwkKK30JLyogU2tQaHlJc3JHbWFjICovCisjZW5kaWYgLyogWVVLT04gKi8KKworCisjaWZkZWYgT1RIRVJfUEhZCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tQaHlJc3JMb25lKCkgLSBQSFkgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQorICoKKyAqIERlc2NyaXB0aW9uOiBoYW5kbGVzIGFsbCBpbnRlcnJ1cHRzIGZyb20gTE9ORSBQSFkKKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLworc3RhdGljIHZvaWQgU2tQaHlJc3JMb25lKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElvIENvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgTnVtID0gUEhZIE51bSAqLworU0tfVTE2CUlTdGF0dXMpCS8qIEludGVycnVwdCBTdGF0dXMgKi8KK3sKKwlTS19FVlBBUkEJUGFyYTsKKworCWlmIChJU3RhdHVzICYgKFBIWV9MX0lTX0RVUCB8IFBIWV9MX0lTX0lTT0wpKSB7CisJCQorCQlTa0hXTGlua0Rvd24ocEFDLCBJb0MsIFBvcnQpOworCisJCVBhcmEuUGFyYTMyWzBdID0gKFNLX1UzMilQb3J0OworCQkvKiBTaWduYWwgdG8gUkxNVCAqLworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKwl9CisKK30JLyogU2tQaHlJc3JMb25lICovCisjZW5kaWYgLyogT1RIRVJfUEhZICovCisKKy8qIEVuZCBvZiBGaWxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NraTJjLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NraTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1YTA0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tpMmMuYwpAQCAtMCwwICsxLDEyOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2kyYy5jCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBUV1NJLU1vZHVsZQorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjU5ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzEwLzIwIDA5OjA3OjI1ICQKKyAqIFB1cnBvc2U6CUZ1bmN0aW9ucyB0byBhY2Nlc3MgVm9sdGFnZSBhbmQgVGVtcGVyYXR1cmUgU2Vuc29yCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglJMkMgUHJvdG9jb2wKKyAqLworI2lmIChkZWZpbmVkKERFQlVHKSB8fCAoKCFkZWZpbmVkKExJTlQpKSAmJiAoIWRlZmluZWQoU0tfU0xJTSkpKSkKK3N0YXRpYyBjb25zdCBjaGFyIFN5c0tvbm5lY3RGaWxlSWRbXSA9CisJIkAoIykgJElkOiBza2kyYy5jLHYgMS41OSAyMDAzLzEwLzIwIDA5OjA3OjI1IHJzY2htaWR0IEV4cCAkIChDKSBNYXJ2ZWxsLiAiOworI2VuZGlmCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCQkvKiBEcml2ZXIgU3BlY2lmaWMgRGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJoL2xtODAuaCIKKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCQkvKiBBZGFwdGVyIENvbnRyb2wtIGFuZCBEcml2ZXIgc3BlY2lmaWMgRGVmLiAqLworCisjaWZkZWYgX19DMk1BTl9fCisvKgorCUkyQyBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbi4KKworCUdlbmVyYWwgRGVzY3JpcHRpb246CisKKwlUaGUgSTJDIHByb3RvY29sIGlzIHVzZWQgZm9yIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3JzIGFuZCBmb3IKKwl0aGUgc2VyaWFsIEVFUFJPTSB3aGljaCBob2xkIHRoZSBjb25maWd1cmF0aW9uLgorCisJVGhpcyBmaWxlIGNvdmVycyBmdW5jdGlvbnMgdGhhdCBhbGxvdyB0byByZWFkIHdyaXRlIGFuZCBkbworCXNvbWUgYnVsayByZXF1ZXN0cyBhIHNwZWNpZmllZCBJMkMgYWRkcmVzcy4KKworCVRoZSBHZW5lc2lzIGhhcyAyIEkyQyBidXNlcy4gT25lIGZvciB0aGUgRUVQUk9NIHdoaWNoIGhvbGRzCisJdGhlIFZQRCBEYXRhIGFuZCBvbmUgZm9yIHRlbXBlcmF0dXJlIGFuZCB2b2x0YWdlIHNlbnNvci4KKwlUaGUgZm9sbG93aW5nIHBpY3R1cmUgc2hvd3MgdGhlIEkyQyBidXNlcywgSTJDIGRldmljZXMgYW5kCisJdGhlaXIgY29udHJvbCByZWdpc3RlcnMuCisKKwlOb3RlOiBUaGUgVlBEIGZ1bmN0aW9ucyBhcmUgaW4gc2t2cGQuYworLgorLglQQ0kgQ29uZmlnIEkyQyBCdXMgZm9yIFZQRCBEYXRhOgorLgorLgkJICAgICAgKy0tLS0tLS0tLS0tLSsKKy4JCSAgICAgIHwgVlBEIEVFUFJPTSB8CisuCQkgICAgICArLS0tLS0tLS0tLS0tKworLgkJCSAgICAgfAorLgkJCSAgICAgfCA8LS0gSTJDCisuCQkJICAgICB8CisuCQkgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworLgkJIHwJCQkgfAorLgkrLS0tLS0tLS0tLS0tLS0tLS0rCSstLS0tLS0tLS0tLS0tLS0tLSsKKy4JfCBQQ0lfVlBEX0FEUl9SRUcgfAl8IFBDSV9WUERfREFUX1JFRyB8CisuCSstLS0tLS0tLS0tLS0tLS0tLSsJKy0tLS0tLS0tLS0tLS0tLS0tKworLgorLgorLglJMkMgQnVzIGZvciBMTTgwIHNlbnNvcjoKKy4KKy4JCQkrLS0tLS0tLS0tLS0tLS0tLS0rCisuCQkJfCBUZW1wZXJhdHVyZSBhbmQgfAorLgkJCXwgVm9sdGFnZSBTZW5zb3IgIHwKKy4JCQl8IAlMTTgwCSAgfAorLgkJCSstLS0tLS0tLS0tLS0tLS0tLSsKKy4JCQkJfAorLgkJCQl8CisuCQkJSTJDIC0tPiB8CisuCQkJCXwKKy4JCQkgICAgICstLS0tKworLgkgICAgICstLS0tLS0tLS0tLS0tLT58IE9SIHw8LS0rCisuCSAgICAgfAkJICAgICArLS0tLSsgICB8CisuICAgICArLS0tLS0tKy0tLS0tLSsJCSAgICAgIHwKKy4gICAgIHwJCSAgICB8CQkgICAgICB8CisuICstLS0tLS0tLSsJKy0tLS0tLS0tKwkrLS0tLS0tLS0tLSsKKy4gfCBCMl9JMkMgfAl8IEIyX0kyQyB8CXwgIEIyX0kyQyAgfAorLiB8IF9DVFJMICB8CXwgX0RBVEEgIHwJfCAgIF9TVyAgICB8CisuICstLS0tLS0tLSsJKy0tLS0tLS0tKwkrLS0tLS0tLS0tLSsKKy4KKwlUaGUgSTJDIGJ1cyBtYXkgYmUgZHJpdmVuIGJ5IHRoZSBCMl9JMkNfU1cgb3IgYnkgdGhlIEIyX0kyQ19DVFJMCisJYW5kIEIyX0kyQ19EQVRBIHJlZ2lzdGVycy4KKwlGb3IgZHJpdmVyIHNvZnR3YXJlIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgSTJDIGNvbnRyb2wgYW5kCisJZGF0YSByZWdpc3RlciwgYmVjYXVzZSBJMkMgYnVzIHRpbWluZyBpcyBkb25lIGJ5IHRoZSBBU0lDIGFuZAorCWFuIGludGVycnVwdCBtYXkgYmUgcmVjZWl2ZWQgd2hlbiB0aGUgSTJDIHJlcXVlc3QgaXMgY29tcGxldGVkLgorCisJQ2xvY2sgUmF0ZSBUaW1pbmc6CQkJTUlOCU1BWAlnZW5lcmF0ZWQgYnkKKwkJVlBEIEVFUFJPTToJCQk1MCBrSHoJMTAwIGtIegkJSFcKKwkJTE04MCBvdmVyIEkyQyBDdHJsL0RhdGEgcmVnLgk1MCBrSHoJMTAwIGtIegkJSFcKKwkJTE04MCBvdmVyIEIyX0kyQ19TVyByZWdpc3RlcgkwCTQwMCBrSHoJCVNXCisKKwlOb3RlOglUaGUgY2xvY2sgZ2VuZXJhdGVkIGJ5IHRoZSBoYXJkd2FyZSBpcyBkZXBlbmRlbmQgb24gdGhlCisJCVBDSSBjbG9jay4gSWYgdGhlIFBDSSBidXMgY2xvY2sgaXMgMzMgTUh6LCB0aGUgSTJDL1ZQRAorCQljbG9jayBpcyA1MCBrSHouCisgKi8KK2ludHJvKCkKK3t9CisjZW5kaWYKKworI2lmZGVmIFNLX0RJQUcKKy8qCisgKiBJMkMgRmFzdCBNb2RlIHRpbWluZyB2YWx1ZXMgdXNlZCBieSB0aGUgTE04MC4KKyAqIElmIG5ldyBkZXZpY2VzIGFyZSBhZGRlZCB0byB0aGUgSTJDIGJ1cyB0aGUgdGltaW5nIHZhbHVlcyBoYXZlIHRvIGJlIGNoZWNrZWQuCisgKi8KKyNpZm5kZWYgSTJDX1NMT1dfVElNSU5HCisjZGVmaW5lCVRfQ0xLX0xPVwkJCTEzMDBMCS8qIGNsb2NrIGxvdyB0aW1lIGluIG5zICovCisjZGVmaW5lCVRfQ0xLX0hJR0gJCSAJIDYwMEwJLyogY2xvY2sgaGlnaCB0aW1lIGluIG5zICovCisjZGVmaW5lIFRfREFUQV9JTl9TRVRVUAkJIDEwMEwJLyogZGF0YSBpbiBTZXQtdXAgVGltZSAqLworI2RlZmluZSBUX1NUQVJUX0hPTEQJCSA2MDBMCS8qIHN0YXJ0IGNvbmRpdGlvbiBob2xkIHRpbWUgKi8KKyNkZWZpbmUgVF9TVEFSVF9TRVRVUAkJIDYwMEwJLyogc3RhcnQgY29uZGl0aW9uIFNldC11cCB0aW1lICovCisjZGVmaW5lCVRfU1RPUF9TRVRVUAkJIDYwMEwJLyogc3RvcCBjb25kaXRpb24gU2V0LXVwIHRpbWUgKi8KKyNkZWZpbmUgVF9CVVNfSURMRQkJCTEzMDBMCS8qIHRpbWUgdGhlIGJ1cyBtdXN0IGZyZWUgYWZ0ZXIgVHggKi8KKyNkZWZpbmUJVF9DTEtfMl9EQVRBX09VVAkgOTAwTAkvKiBtYXguIGNsb2NrIGxvdyB0byBkYXRhIG91dHB1dCB2YWxpZCAqLworI2Vsc2UJLyogSTJDX1NMT1dfVElNSU5HICovCisvKiBJMkMgU3RhbmRhcmQgTW9kZSBUaW1pbmcgKi8KKyNkZWZpbmUJVF9DTEtfTE9XCQkJNDcwMEwJLyogY2xvY2sgbG93IHRpbWUgaW4gbnMgKi8KKyNkZWZpbmUJVF9DTEtfSElHSAkJCTQwMDBMCS8qIGNsb2NrIGhpZ2ggdGltZSBpbiBucyAqLworI2RlZmluZSBUX0RBVEFfSU5fU0VUVVAJCSAyNTBMCS8qIGRhdGEgaW4gU2V0LXVwIFRpbWUgKi8KKyNkZWZpbmUgVF9TVEFSVF9IT0xECQk0MDAwTAkvKiBzdGFydCBjb25kaXRpb24gaG9sZCB0aW1lICovCisjZGVmaW5lIFRfU1RBUlRfU0VUVVAJCTQ3MDBMCS8qIHN0YXJ0IGNvbmRpdGlvbiBTZXQtdXAgdGltZSAqLworI2RlZmluZQlUX1NUT1BfU0VUVVAJCTQwMDBMCS8qIHN0b3AgY29uZGl0aW9uIFNldC11cCB0aW1lICovCisjZGVmaW5lIFRfQlVTX0lETEUJCQk0NzAwTAkvKiB0aW1lIHRoZSBidXMgbXVzdCBmcmVlIGFmdGVyIFR4ICovCisjZW5kaWYJLyogIUkyQ19TTE9XX1RJTUlORyAqLworCisjZGVmaW5lIE5TMkJDTEsoeCkJKCgoeCkqMTI1KS8xMDAwMCkKKworLyoKKyAqIEkyQyBXaXJlIE9wZXJhdGlvbnMKKyAqCisgKiBBYm91dCBJMkNfQ0xLX0xPVygpOgorICoKKyAqIFRoZSBEYXRhIERpcmVjdGlvbiBiaXQgKEkyQ19EQVRBX0RJUikgaGFzIHRvIGJlIHNldCB0byBpbnB1dCB3aGVuIHNldHRpbmcKKyAqIGNsb2NrIHRvIGxvdywgdG8gcHJldmVudCB0aGUgQVNJQyBhbmQgdGhlIEkyQyBkYXRhIGNsaWVudCBmcm9tIGRyaXZpbmcgdGhlCisgKiBzZXJpYWwgZGF0YSBsaW5lIHNpbXVsdGFuZW91c2x5IChBU0lDOiBsYXN0IGJpdCBvZiBhIGJ5dGUgPSAnMScsIEkyQyBjbGllbnQKKyAqIHNlbmQgYW4gJ0FDSycpLiBTZWUgYWxzbyBDb25jZW50cmF0b3IgQnVncmVwb3J0IE5vLiAxMDE5Mi4KKyAqLworI2RlZmluZSBJMkNfREFUQV9ISUdIKElvQykJU0tfSTJDX1NFVF9CSVQoSW9DLCBJMkNfREFUQSkKKyNkZWZpbmUJSTJDX0RBVEFfTE9XKElvQykJU0tfSTJDX0NMUl9CSVQoSW9DLCBJMkNfREFUQSkKKyNkZWZpbmUJSTJDX0RBVEFfT1VUKElvQykJU0tfSTJDX1NFVF9CSVQoSW9DLCBJMkNfREFUQV9ESVIpCisjZGVmaW5lCUkyQ19EQVRBX0lOKElvQykJU0tfSTJDX0NMUl9CSVQoSW9DLCBJMkNfREFUQV9ESVIgfCBJMkNfREFUQSkKKyNkZWZpbmUJSTJDX0NMS19ISUdIKElvQykJU0tfSTJDX1NFVF9CSVQoSW9DLCBJMkNfQ0xLKQorI2RlZmluZQlJMkNfQ0xLX0xPVyhJb0MpCVNLX0kyQ19DTFJfQklUKElvQywgSTJDX0NMSyB8IEkyQ19EQVRBX0RJUikKKyNkZWZpbmUJSTJDX1NUQVJUX0NPTkQoSW9DKQlTS19JMkNfQ0xSX0JJVChJb0MsIEkyQ19DTEspCisKKyNkZWZpbmUgTlMyQ0xLVCh4KQkoKHgqMTI1TCkvMTAwMDApCisKKy8qLS0tLS0tLS0tLS0tLS0tIEkyQyBJbnRlcmZhY2UgUmVnaXN0ZXIgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc2VuZGluZyBvbmUgYml0CisgKi8KK3ZvaWQgU2tJMmNTbmRCaXQoCitTS19JT0MJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfVTgJQml0KQkvKiBCaXQgdG8gc2VuZCAqLworeworCUkyQ19EQVRBX09VVChJb0MpOworCWlmIChCaXQpIHsKKwkJSTJDX0RBVEFfSElHSChJb0MpOworCX0KKwllbHNlIHsKKwkJSTJDX0RBVEFfTE9XKElvQyk7CisJfQorCVNrRGdXYWl0VGltZShJb0MsIE5TMkJDTEsoVF9EQVRBX0lOX1NFVFVQKSk7CisJSTJDX0NMS19ISUdIKElvQyk7CisJU2tEZ1dhaXRUaW1lKElvQywgTlMyQkNMSyhUX0NMS19ISUdIKSk7CisJSTJDX0NMS19MT1coSW9DKTsKK30JLyogU2tJMmNTbmRCaXQqLworCisKKy8qCisgKiBTaWduYWwgYSBzdGFydCB0byB0aGUgSTJDIEJ1cy4KKyAqCisgKiBBIHN0YXJ0IGlzIHNpZ25hbGVkIHdoZW4gZGF0YSBnb2VzIHRvIGxvdyBpbiBhIGhpZ2ggY2xvY2sgY3ljbGUuCisgKgorICogRW5kcyB3aXRoIENsb2NrIExvdy4KKyAqCisgKiBTdGF0dXM6IG5vdCB0ZXN0ZWQKKyAqLwordm9pZCBTa0kyY1N0YXJ0KAorU0tfSU9DCUlvQykJLyogSS9PIENvbnRleHQgKi8KK3sKKwkvKiBJbml0IGRhdGEgYW5kIENsb2NrIHRvIG91dHB1dCBsaW5lcyAqLworCS8qIFNldCBEYXRhIGhpZ2ggKi8KKwlJMkNfREFUQV9PVVQoSW9DKTsKKwlJMkNfREFUQV9ISUdIKElvQyk7CisJLyogU2V0IENsb2NrIGhpZ2ggKi8KKwlJMkNfQ0xLX0hJR0goSW9DKTsKKworCVNrRGdXYWl0VGltZShJb0MsIE5TMkJDTEsoVF9TVEFSVF9TRVRVUCkpOworCisJLyogU2V0IERhdGEgTG93ICovCisJSTJDX0RBVEFfTE9XKElvQyk7CisKKwlTa0RnV2FpdFRpbWUoSW9DLCBOUzJCQ0xLKFRfU1RBUlRfSE9MRCkpOworCisJLyogQ2xvY2sgbG93IHdpdGhvdXQgRGF0YSB0byBJbnB1dCAqLworCUkyQ19TVEFSVF9DT05EKElvQyk7CisKKwlTa0RnV2FpdFRpbWUoSW9DLCBOUzJCQ0xLKFRfQ0xLX0xPVykpOworfQkvKiBTa0kyY1N0YXJ0ICovCisKKwordm9pZCBTa0kyY1N0b3AoCitTS19JT0MJSW9DKQkvKiBJL08gQ29udGV4dCAqLworeworCS8qIEluaXQgZGF0YSBhbmQgQ2xvY2sgdG8gb3V0cHV0IGxpbmVzICovCisJLyogU2V0IERhdGEgbG93ICovCisJSTJDX0RBVEFfT1VUKElvQyk7CisJSTJDX0RBVEFfTE9XKElvQyk7CisKKwlTa0RnV2FpdFRpbWUoSW9DLCBOUzJCQ0xLKFRfQ0xLXzJfREFUQV9PVVQpKTsKKworCS8qIFNldCBDbG9jayBoaWdoICovCisJSTJDX0NMS19ISUdIKElvQyk7CisKKwlTa0RnV2FpdFRpbWUoSW9DLCBOUzJCQ0xLKFRfU1RPUF9TRVRVUCkpOworCisJLyoKKwkgKiBTZXQgRGF0YSBIaWdoOglEbyBpdCBieSBzZXR0aW5nIHRoZSBEYXRhIExpbmUgdG8gSW5wdXQuCisJICoJCQlCZWNhdXNlIG9mIGEgcHVsbCB1cCByZXNpc3RvciB0aGUgRGF0YSBMaW5lCisJICoJCQlmbG9vZHMgdG8gaGlnaC4KKwkgKi8KKwlJMkNfREFUQV9JTihJb0MpOworCisJLyoKKwkgKglXaGVuIEkyQyBhY3Rpdml0eSBpcyBzdG9wcGVkCisJICoJIG8JREFUQSBzaG91bGQgYmUgc2V0IHRvIGlucHV0IGFuZAorCSAqCSBvCUNMT0NLIHNob3VsZCBiZSBzZXQgdG8gaGlnaCEKKwkgKi8KKwlTa0RnV2FpdFRpbWUoSW9DLCBOUzJCQ0xLKFRfQlVTX0lETEUpKTsKK30JLyogU2tJMmNTdG9wICovCisKKworLyoKKyAqIFJlY2VpdmUganVzdCBvbmUgYml0IHZpYSB0aGUgSTJDIGJ1cy4KKyAqCisgKiBOb3RlOglDbG9jayBtdXN0IGJlIHNldCB0byBMT1cgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm5zIFRoZSByZWNlaXZlZCBiaXQuCisgKi8KK2ludCBTa0kyY1JjdkJpdCgKK1NLX0lPQwlJb0MpCS8qIEkvTyBDb250ZXh0ICovCit7CisJaW50CUJpdDsKKwlTS19VOAlJMmNTd0N0cmw7CisKKwkvKiBJbml0IGRhdGEgYXMgaW5wdXQgbGluZSAqLworCUkyQ19EQVRBX0lOKElvQyk7CisKKwlTa0RnV2FpdFRpbWUoSW9DLCBOUzJCQ0xLKFRfQ0xLXzJfREFUQV9PVVQpKTsKKworCUkyQ19DTEtfSElHSChJb0MpOworCisJU2tEZ1dhaXRUaW1lKElvQywgTlMyQkNMSyhUX0NMS19ISUdIKSk7CisKKwlTS19JMkNfR0VUX1NXKElvQywgJkkyY1N3Q3RybCk7CisJCisJQml0ID0gKEkyY1N3Q3RybCAmIEkyQ19EQVRBKSA/IDEgOiAwOworCisJSTJDX0NMS19MT1coSW9DKTsKKwlTa0RnV2FpdFRpbWUoSW9DLCBOUzJCQ0xLKFRfQ0xLX0xPVy1UX0NMS18yX0RBVEFfT1VUKSk7CisKKwlyZXR1cm4oQml0KTsKK30JLyogU2tJMmNSY3ZCaXQgKi8KKworCisvKgorICogUmVjZWl2ZSBhbiBBQ0suCisgKgorICogcmV0dXJucwkwIElmIGFja25vd2xlZGdlZAorICoJCTEgaW4gY2FzZSBvZiBhbiBlcnJvcgorICovCitpbnQgU2tJMmNSY3ZBY2soCitTS19JT0MJSW9DKQkvKiBJL08gQ29udGV4dCAqLworeworCS8qCisJICogUmVjZWl2ZWQgYml0IG11c3QgYmUgemVyby4KKwkgKi8KKwlyZXR1cm4oU2tJMmNSY3ZCaXQoSW9DKSAhPSAwKTsKK30JLyogU2tJMmNSY3ZBY2sgKi8KKworCisvKgorICogU2VuZCBhbiBOQUNLLgorICovCit2b2lkIFNrSTJjU25kTkFjaygKK1NLX0lPQwlJb0MpCS8qIEkvTyBDb250ZXh0ICovCit7CisJLyoKKwkgKiBSZWNlaXZlZCBiaXQgbXVzdCBiZSB6ZXJvLgorCSAqLworCVNrSTJjU25kQml0KElvQywgMSk7Cit9CS8qIFNrSTJjU25kTkFjayAqLworCisKKy8qCisgKiBTZW5kIGFuIEFDSy4KKyAqLwordm9pZCBTa0kyY1NuZEFjaygKK1NLX0lPQyBJb0MpCS8qIEkvTyBDb250ZXh0ICovCit7CisJLyoKKwkgKiBSZWNlaXZlZCBiaXQgbXVzdCBiZSB6ZXJvLgorCSAqLworCVNrSTJjU25kQml0KElvQywgMCk7Cit9CS8qIFNrSTJjU25kQWNrICovCisKKworLyoKKyAqIFNlbmQgb25lIGJ5dGUgdG8gdGhlIEkyQyBkZXZpY2UgYW5kIHdhaXQgZm9yIEFDSy4KKyAqCisgKiBSZXR1cm4gYWNrbm93bGVnZWQgc3RhdHVzLgorICovCitpbnQgU2tJMmNTbmRCeXRlKAorU0tfSU9DCUlvQywJLyogSS9PIENvbnRleHQgKi8KK2ludAkJQnl0ZSkJLyogYnl0ZSB0byBzZW5kICovCit7CisJaW50CWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChCeXRlICYgKDE8PCg3LWkpKSkgeworCQkJU2tJMmNTbmRCaXQoSW9DLCAxKTsKKwkJfQorCQllbHNlIHsKKwkJCVNrSTJjU25kQml0KElvQywgMCk7CisJCX0KKwl9CisKKwlyZXR1cm4oU2tJMmNSY3ZBY2soSW9DKSk7Cit9CS8qIFNrSTJjU25kQnl0ZSAqLworCisKKy8qCisgKiBSZWNlaXZlIG9uZSBieXRlIGFuZCBhY2sgaXQuCisgKgorICogUmV0dXJuIGJ5dGUuCisgKi8KK2ludCBTa0kyY1JjdkJ5dGUoCitTS19JT0MJSW9DLAkvKiBJL08gQ29udGV4dCAqLworaW50CQlMYXN0KQkvKiBMYXN0IEJ5dGUgRmxhZyAqLworeworCWludAlpOworCWludAlCeXRlID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJQnl0ZSA8PD0gMTsKKwkJQnl0ZSB8PSBTa0kyY1JjdkJpdChJb0MpOworCX0KKworCWlmIChMYXN0KSB7CisJCVNrSTJjU25kTkFjayhJb0MpOworCX0KKwllbHNlIHsKKwkJU2tJMmNTbmRBY2soSW9DKTsKKwl9CisKKwlyZXR1cm4oQnl0ZSk7Cit9CS8qIFNrSTJjUmN2Qnl0ZSAqLworCisKKy8qCisgKiBTdGFydCBkaWFsb2cgYW5kIHNlbmQgZGV2aWNlIGFkZHJlc3MKKyAqCisgKiBSZXR1cm4gMCBpZiBhY2tub3dsZWdlZCwgMSBpbiBjYXNlIG9mIGFuIGVycm9yCisgKi8KK2ludAlTa0kyY1NuZERldigKK1NLX0lPQwlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitpbnQJCUFkZHIsCS8qIERldmljZSBBZGRyZXNzICovCitpbnQJCVJ3KQkJLyogUmVhZCAvIFdyaXRlIEZsYWcgKi8KK3sKKwlTa0kyY1N0YXJ0KElvQyk7CisJUncgPSB+Unc7CisJUncgJj0gSTJDX1dSSVRFOworCXJldHVybihTa0kyY1NuZEJ5dGUoSW9DLCAoQWRkcjw8MSkgfCBSdykpOworfQkvKiBTa0kyY1NuZERldiAqLworCisjZW5kaWYgLyogU0tfRElBRyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tIEkyQyBDVFJMIFJlZ2lzdGVyIEZ1bmN0aW9ucyAtLS0tLS0tLS0tKi8KKworLyoKKyAqIHdhaXRzIGZvciBhIGNvbXBsZXRpb24gb2YgYW4gSTJDIHRyYW5zZmVyCisgKgorICogcmV0dXJucwkwOglzdWNjZXNzLCB0cmFuc2ZlciBjb21wbGV0ZXMKKyAqCQkJMToJZXJyb3IsCSB0cmFuc2ZlciBkb2VzIG5vdCBjb21wbGV0ZSwgSTJDIHRyYW5zZmVyCisgKgkJCQkJCSBraWxsZWQsIHdhaXQgbG9vcCB0ZXJtaW5hdGVkLgorICovCitpbnQJU2tJMmNXYWl0KAorU0tfQUMJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJL08gQ29udGV4dCAqLworaW50CQlFdmVudCkJLyogY29tcGxldGUgZXZlbnQgdG8gd2FpdCBmb3IgKEkyQ19SRUFEIG9yIEkyQ19XUklURSkgKi8KK3sKKwlTS19VNjQJU3RhcnRUaW1lOworCVNLX1U2NAlDdXJyZW50VGltZTsKKwlTS19VMzIJSTJjQ3RybDsKKworCVN0YXJ0VGltZSA9IFNrT3NHZXRUaW1lKHBBQyk7CisJCisJZG8geworCQlDdXJyZW50VGltZSA9IFNrT3NHZXRUaW1lKHBBQyk7CisKKwkJaWYgKEN1cnJlbnRUaW1lIC0gU3RhcnRUaW1lID4gU0tfVElDS1NfUEVSX1NFQyAvIDgpIHsKKwkJCQorCQkJU0tfSTJDX1NUT1AoSW9DKTsKKyNpZm5kZWYgU0tfRElBRworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9JMkNfRTAwMiwgU0tFUlJfSTJDX0UwMDJNU0cpOworI2VuZGlmIC8qICFTS19ESUFHICovCisJCQlyZXR1cm4oMSk7CisJCX0KKwkJCisJCVNLX0kyQ19HRVRfQ1RMKElvQywgJkkyY0N0cmwpOworCisjaWZkZWYgeFlVS09OX0RCRworCQlwcmludGYoIlN0YXJ0VGltZT0lbHUsIEN1cnJlbnRUaW1lPSVsdVxuIiwKKwkJCVN0YXJ0VGltZSwgQ3VycmVudFRpbWUpOworCQlpZiAoa2JoaXQoKSkgeworCQkJcmV0dXJuKDEpOworCQl9CisjZW5kaWYgLyogWVVLT05fREJHICovCisJCisJfSB3aGlsZSAoKEkyY0N0cmwgJiBJMkNfRkxBRykgPT0gKFNLX1UzMilFdmVudCA8PCAzMSk7CisKKwlyZXR1cm4oMCk7Cit9CS8qIFNrSTJjV2FpdCAqLworCisKKy8qCisgKiB3YWl0cyBmb3IgYSBjb21wbGV0aW9uIG9mIGFuIEkyQyB0cmFuc2ZlcgorICoKKyAqIFJldHVybnMKKyAqCU5vdGhpbmcKKyAqLwordm9pZCBTa0kyY1dhaXRJcnEoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MpCS8qIEkvTyBDb250ZXh0ICovCit7CisJU0tfU0VOU09SCSpwU2VuOworCVNLX1U2NAkJU3RhcnRUaW1lOworCVNLX1UzMgkJSXJxU3JjOworCisJcFNlbiA9ICZwQUMtPkkyYy5TZW5UYWJsZVtwQUMtPkkyYy5DdXJyU2Vuc107CisKKwlpZiAocFNlbi0+U2VuU3RhdGUgPT0gU0tfU0VOX0lETEUpIHsKKwkJcmV0dXJuOworCX0KKworCVN0YXJ0VGltZSA9IFNrT3NHZXRUaW1lKHBBQyk7CisJCisJZG8geworCQlpZiAoU2tPc0dldFRpbWUocEFDKSAtIFN0YXJ0VGltZSA+IFNLX1RJQ0tTX1BFUl9TRUMgLyA4KSB7CisJCQkKKwkJCVNLX0kyQ19TVE9QKElvQyk7CisjaWZuZGVmIFNLX0RJQUcKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSTJDX0UwMTYsIFNLRVJSX0kyQ19FMDE2TVNHKTsKKyNlbmRpZiAvKiAhU0tfRElBRyAqLworCQkJcmV0dXJuOworCQl9CisJCQorCQlTS19JTjMyKElvQywgQjBfSVNSQywgJklycVNyYyk7CisKKwl9IHdoaWxlICgoSXJxU3JjICYgSVNfSTJDX1JFQURZKSA9PSAwKTsKKworCXBTZW4tPlNlblN0YXRlID0gU0tfU0VOX0lETEU7CisJcmV0dXJuOworfQkvKiBTa0kyY1dhaXRJcnEgKi8KKworLyoKKyAqIHdyaXRlcyBhIHNpbmdsZSBieXRlIG9yIDQgYnl0ZXMgaW50byB0aGUgSTJDIGRldmljZQorICoKKyAqIHJldHVybnMJMDoJc3VjY2VzcworICoJCQkxOgllcnJvcgorICovCitpbnQgU2tJMmNXcml0ZSgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCUkyY0RhdGEsCS8qIEkyQyBEYXRhIHRvIHdyaXRlICovCitpbnQJCUkyY0RldiwJCS8qIEkyQyBEZXZpY2UgQWRkcmVzcyAqLworaW50CQlJMmNEZXZTaXplLCAvKiBJMkMgRGV2aWNlIFNpemUgKGUuZy4gSTJDXzAyNUtfREVWIG9yIEkyQ18yS19ERVYpICovCitpbnQJCUkyY1JlZywJCS8qIEkyQyBEZXZpY2UgUmVnaXN0ZXIgQWRkcmVzcyAqLworaW50CQlJMmNCdXJzdCkJLyogSTJDIEJ1cnN0IEZsYWcgKi8KK3sKKwlTS19PVVQzMihJb0MsIEIyX0kyQ19EQVRBLCBJMmNEYXRhKTsKKwkKKwlTS19JMkNfQ1RMKElvQywgSTJDX1dSSVRFLCBJMmNEZXYsIEkyY0RldlNpemUsIEkyY1JlZywgSTJjQnVyc3QpOworCQorCXJldHVybihTa0kyY1dhaXQocEFDLCBJb0MsIEkyQ19XUklURSkpOworfQkvKiBTa0kyY1dyaXRlKi8KKworCisjaWZkZWYJU0tfRElBRworLyoKKyAqIHJlYWRzIGEgc2luZ2xlIGJ5dGUgb3IgNCBieXRlcyBmcm9tIHRoZSBJMkMgZGV2aWNlCisgKgorICogcmV0dXJucwl0aGUgd29yZCByZWFkCisgKi8KK1NLX1UzMiBTa0kyY1JlYWQoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIENvbnRleHQgKi8KK2ludAkJSTJjRGV2LAkJLyogSTJDIERldmljZSBBZGRyZXNzICovCitpbnQJCUkyY0RldlNpemUsIC8qIEkyQyBEZXZpY2UgU2l6ZSAoZS5nLiBJMkNfMDI1S19ERVYgb3IgSTJDXzJLX0RFVikgKi8KK2ludAkJSTJjUmVnLAkJLyogSTJDIERldmljZSBSZWdpc3RlciBBZGRyZXNzICovCitpbnQJCUkyY0J1cnN0KQkvKiBJMkMgQnVyc3QgRmxhZyAqLworeworCVNLX1UzMglEYXRhOworCisJU0tfT1VUMzIoSW9DLCBCMl9JMkNfREFUQSwgMCk7CisJU0tfSTJDX0NUTChJb0MsIEkyQ19SRUFELCBJMmNEZXYsIEkyY0RldlNpemUsIEkyY1JlZywgSTJjQnVyc3QpOworCQorCWlmIChTa0kyY1dhaXQocEFDLCBJb0MsIEkyQ19SRUFEKSAhPSAwKSB7CisJCXdfcHJpbnQoIiVzXG4iLCBTS0VSUl9JMkNfRTAwMk1TRyk7CisJfQorCQorCVNLX0lOMzIoSW9DLCBCMl9JMkNfREFUQSwgJkRhdGEpOworCQorCXJldHVybihEYXRhKTsKK30JLyogU2tJMmNSZWFkICovCisjZW5kaWYgLyogU0tfRElBRyAqLworCisKKy8qCisgKiByZWFkIGEgc2Vuc29yJ3MgdmFsdWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGEgc2Vuc29yJ3MgdmFsdWUgZnJvbSB0aGUgSTJDIHNlbnNvciBjaGlwLiBUaGUgc2Vuc29yCisgKiBpcyBkZWZpbmVkIGJ5IGl0cyBpbmRleCBpbnRvIHRoZSBzZW5zb3JzIGRhdGFiYXNlIGluIHRoZSBzdHJ1Y3QgcEFDIHBvaW50cworICogdG8uCisgKiBSZXR1cm5zCisgKgkJMSBpZiB0aGUgcmVhZCBpcyBjb21wbGV0ZWQKKyAqCQkwIGlmIHRoZSByZWFkIG11c3QgYmUgY29udGludWVkIChJMkMgQnVzIHN0aWxsIGFsbG9jYXRlZCkKKyAqLworaW50CVNrSTJjUmVhZFNlbnNvcigKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfU0VOU09SCSpwU2VuKQkvKiBTZW5zb3IgdG8gYmUgcmVhZCAqLworeworICAgIGlmIChwU2VuLT5TZW5SZWFkICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuKCgqcFNlbi0+U2VuUmVhZCkocEFDLCBJb0MsIHBTZW4pKTsKKyAgICB9CisJZWxzZSB7CisgICAgICAgIHJldHVybigwKTsgLyogbm8gc3VjY2VzcyAqLworCX0KK30JLyogU2tJMmNSZWFkU2Vuc29yICovCisKKy8qCisgKiBEbyB0aGUgSW5pdCBzdGF0ZSAwIGluaXRpYWxpemF0aW9uCisgKi8KK3N0YXRpYyBpbnQgU2tJMmNJbml0MCgKK1NLX0FDCSpwQUMpCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworeworCWludAlpOworCisJLyogQmVnaW4gd2l0aCBmaXJzdCBzZW5zb3IgKi8KKwlwQUMtPkkyYy5DdXJyU2VucyA9IDA7CisJCisJLyogQmVnaW4gd2l0aCB0aW1lb3V0IGNvbnRyb2wgZm9yIHN0YXRlIG1hY2hpbmUgKi8KKwlwQUMtPkkyYy5UaW1lck1vZGUgPSBTS19USU1FUl9XQVRDSF9TTTsKKwkKKwkvKiBTZXQgc2Vuc29yIG51bWJlciB0byB6ZXJvICovCisJcEFDLT5JMmMuTWF4U2VucyA9IDA7CisKKyNpZm5kZWYgU0tfRElBRworCS8qIEluaXRpYWxpemUgTnVtYmVyIG9mIER1bW15IFJlYWRzICovCisJcEFDLT5JMmMuRHVtbXlSZWFkcyA9IFNLX01BWF9TRU5TT1JTOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgU0tfTUFYX1NFTlNPUlM7IGkrKykgeworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjID0gInVua25vd24iOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UeXBlID0gU0tfU0VOX1VOS05PV047CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJIaWdoID0gMDsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckxvdyA9IDA7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuSGlnaCA9IDA7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuTG93ID0gMDsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuUmVnID0gTE04MF9GQU4yX0lOOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5Jbml0ID0gU0tfU0VOX0RZTl9JTklUX05PTkU7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblZhbHVlID0gMDsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRXJyRmxhZyA9IFNLX1NFTl9FUlJfTk9UX1BSRVNFTlQ7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkVyckN0cyA9IDA7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkJlZ0VyclRTID0gMDsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuU3RhdGUgPSBTS19TRU5fSURMRTsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuUmVhZCA9IE5VTEw7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRldiA9IDA7CisJfQorCisJLyogTm93IHdlIGFyZSAiSU5JVCBkYXRhImVkICovCisJcEFDLT5JMmMuSW5pdExldmVsID0gU0tfSU5JVF9EQVRBOworCXJldHVybigwKTsKK30JLyogU2tJMmNJbml0MCovCisKKworLyoKKyAqIERvIHRoZSBpbml0IHN0YXRlIDEgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBpbml0aWFsaXplIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXIgb2YgdGhlIExNODA6CisgKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyOgorICogLSBTVEFSVCwgbm9JTlQsIGFjdGl2ZUxPVywgbm9JTlQjQ2xlYXIsIG5vUkVTRVQsIG5vQ0ksIG5vR1BPIywgbm9JTklUCisgKgorICogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgMToKKyAqIC0gYWxsIGludGVycnVwdHMgYXJlIERpc2FibGVkICgweGZmKQorICoKKyAqIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIDI6CisgKiAtIGFsbCBpbnRlcnJ1cHRzIGFyZSBEaXNhYmxlZCAoMHhmZikgSW50ZXJydXB0IG1vZGkgZG9lc24ndCBtYXR0ZXIuCisgKgorICogRmFuIERpdmlzb3IvUlNUX09VVCByZWdpc3RlcjoKKyAqIC0gRGl2aXNvcnMgc2V0IHRvIDEgKGJpdHMgMDApLCBhbGwgb3RoZXJzIDBzLgorICoKKyAqIE9TIyBDb25maWd1cmF0aW9uL1RlbXBlcmF0dXJlIHJlc29sdXRpb24gUmVnaXN0ZXI6CisgKiAtIGFsbCAwcworICoKKyAqLworc3RhdGljIGludCBTa0kyY0luaXQxKAorU0tfQUMJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DKQkvKiBJL08gQ29udGV4dCAqLworeworICAgIGludCBpOworICAgIFNLX1U4IEkyY1N3Q3RybDsKKwlTS19HRVBPUlQgKnBQcnQ7CS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCisJaWYgKHBBQy0+STJjLkluaXRMZXZlbCAhPSBTS19JTklUX0RBVEEpIHsKKwkJLyogUmVJbml0IG5vdCBuZWVkZWQgaW4gSTJDIG1vZHVsZSAqLworCQlyZXR1cm4oMCk7CisJfQorCisgICAgLyogU2V0IHRoZSBEaXJlY3Rpb24gb2YgSTJDLURhdGEgUGluIHRvIElOICovCisgICAgU0tfSTJDX0NMUl9CSVQoSW9DLCBJMkNfREFUQV9ESVIgfCBJMkNfREFUQSk7CisgICAgLyogQ2hlY2sgZm9yIDMyLUJpdCBZdWtvbiB3aXRoIExvdyBhdCBJMkMtRGF0YSBQaW4gKi8KKwlTS19JMkNfR0VUX1NXKElvQywgJkkyY1N3Q3RybCk7CisKKwlpZiAoKEkyY1N3Q3RybCAmIEkyQ19EQVRBKSA9PSAwKSB7CisJCS8qIHRoaXMgaXMgYSAzMi1CaXQgYm9hcmQgKi8KKwkJcEFDLT5HSW5pLkdJWXVrb24zMkJpdCA9IFNLX1RSVUU7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKwkvKiBDaGVjayBmb3IgNjQgQml0IFl1a29uIHdpdGhvdXQgc2Vuc29ycyAqLworCWlmIChTa0kyY1dyaXRlKHBBQywgSW9DLCAwLCBMTTgwX0FERFIsIEkyQ18wMjVLX0RFViwgTE04MF9DRkcsIDApICE9IDApIHsKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KKworCSh2b2lkKVNrSTJjV3JpdGUocEFDLCBJb0MsIDB4ZmZVTCwgTE04MF9BRERSLCBJMkNfMDI1S19ERVYsIExNODBfSU1TS18xLCAwKTsKKwkKKwkodm9pZClTa0kyY1dyaXRlKHBBQywgSW9DLCAweGZmVUwsIExNODBfQUREUiwgSTJDXzAyNUtfREVWLCBMTTgwX0lNU0tfMiwgMCk7CisJCisJKHZvaWQpU2tJMmNXcml0ZShwQUMsIElvQywgMCwgTE04MF9BRERSLCBJMkNfMDI1S19ERVYsIExNODBfRkFOX0NUUkwsIDApOworCQorCSh2b2lkKVNrSTJjV3JpdGUocEFDLCBJb0MsIDAsIExNODBfQUREUiwgSTJDXzAyNUtfREVWLCBMTTgwX1RFTVBfQ1RSTCwgMCk7CisJCisJKHZvaWQpU2tJMmNXcml0ZShwQUMsIElvQywgKFNLX1UzMilMTTgwX0NGR19TVEFSVCwgTE04MF9BRERSLCBJMkNfMDI1S19ERVYsCisJCUxNODBfQ0ZHLCAwKTsKKwkKKwkvKgorCSAqIE1heFNlbnMgaGFzIHRvIGJlIHVwZGF0ZWQgaGVyZSwgYmVjYXVzZSBQaHlUeXBlIGlzIG5vdAorCSAqIHNldCB3aGVuIHBlcmZvcm1pbmcgSW5pdCBMZXZlbCAwCisJICovCisgICAgcEFDLT5JMmMuTWF4U2VucyA9IDU7CisJCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbMF07CisJCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJaWYgKHBQcnQtPlBoeVR5cGUgPT0gU0tfUEhZX0JDT00pIHsKKwkJCWlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMSkgeworCQkJCXBBQy0+STJjLk1heFNlbnMgKz0gMTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBBQy0+STJjLk1heFNlbnMgKz0gMzsKKwkJCX0KKwkJfQorCX0KKwllbHNlIHsKKwkJcEFDLT5JMmMuTWF4U2VucyArPSAzOworCX0KKwkKKwlmb3IgKGkgPSAwOyBpIDwgcEFDLT5JMmMuTWF4U2VuczsgaSsrKSB7CisJCXN3aXRjaCAoaSkgeworCQljYXNlIDA6CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjID0gIlRlbXBlcmF0dXJlIjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblR5cGUgPSBTS19TRU5fVEVNUDsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJIaWdoID0gU0tfU0VOX1RFTVBfSElHSF9FUlI7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fVEVNUF9ISUdIX1dBUk47CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9URU1QX0xPV19XQVJOOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckxvdyA9IFNLX1NFTl9URU1QX0xPV19FUlI7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5SZWcgPSBMTTgwX1RFTVBfSU47CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyA9ICJWb2x0YWdlIFBDSSI7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UeXBlID0gU0tfU0VOX1ZPTFQ7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9QQ0lfNVZfSElHSF9FUlI7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fUENJXzVWX0hJR0hfV0FSTjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuTG93ID0gU0tfU0VOX1BDSV81Vl9MT1dfV0FSTjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJMb3cgPSBTS19TRU5fUENJXzVWX0xPV19FUlI7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5SZWcgPSBMTTgwX1ZUMF9JTjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjID0gIlZvbHRhZ2UgUENJLUlPIjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblR5cGUgPSBTS19TRU5fVk9MVDsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJIaWdoID0gU0tfU0VOX1BDSV9JT181Vl9ISUdIX0VSUjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9QQ0lfSU9fNVZfSElHSF9XQVJOOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fUENJX0lPXzNWM19MT1dfV0FSTjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJMb3cgPSBTS19TRU5fUENJX0lPXzNWM19MT1dfRVJSOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuUmVnID0gTE04MF9WVDFfSU47CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5Jbml0ID0gU0tfU0VOX0RZTl9JTklUX1BDSV9JTzsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjID0gIlZvbHRhZ2UgQVNJQyI7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UeXBlID0gU0tfU0VOX1ZPTFQ7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9WRERfSElHSF9FUlI7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fVkREX0hJR0hfV0FSTjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuTG93ID0gU0tfU0VOX1ZERF9MT1dfV0FSTjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJMb3cgPSBTS19TRU5fVkREX0xPV19FUlI7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5SZWcgPSBMTTgwX1ZUMl9JTjsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkJCWlmIChwUHJ0LT5QaHlUeXBlID09IFNLX1BIWV9CQ09NKSB7CisJCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MgPSAiVm9sdGFnZSBQSFkgQSBQTEwiOworCQkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9QTExfM1YzX0hJR0hfRVJSOworCQkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fUExMXzNWM19ISUdIX1dBUk47CisJCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuTG93ID0gU0tfU0VOX1BMTF8zVjNfTE9XX1dBUk47CisJCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJMb3cgPSBTS19TRU5fUExMXzNWM19MT1dfRVJSOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyA9ICJWb2x0YWdlIFBNQSI7CisJCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJIaWdoID0gU0tfU0VOX1BMTF8zVjNfSElHSF9FUlI7CisJCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9QTExfM1YzX0hJR0hfV0FSTjsKKwkJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fUExMXzNWM19MT1dfV0FSTjsKKwkJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckxvdyA9IFNLX1NFTl9QTExfM1YzX0xPV19FUlI7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyA9ICJWb2x0YWdlIFZBVVgiOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJIaWdoID0gU0tfU0VOX1ZBVVhfM1YzX0hJR0hfRVJSOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9WQVVYXzNWM19ISUdIX1dBUk47CisJCQkJaWYgKHBBQy0+R0luaS5HSVZhdXhBdmFpbCkgeworCQkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9WQVVYXzNWM19MT1dfV0FSTjsKKwkJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckxvdyA9IFNLX1NFTl9WQVVYXzNWM19MT1dfRVJSOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckxvdyA9IFNLX1NFTl9WQVVYXzBWX1dBUk5fRVJSOworCQkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9WQVVYXzBWX1dBUk5fRVJSOworCQkJCX0KKwkJCX0KKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblR5cGUgPSBTS19TRU5fVk9MVDsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblJlZyA9IExNODBfVlQzX0lOOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyA9ICJWb2x0YWdlIFBIWSAyVjUiOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJIaWdoID0gU0tfU0VOX1BIWV8yVjVfSElHSF9FUlI7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX1BIWV8yVjVfSElHSF9XQVJOOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuTG93ID0gU0tfU0VOX1BIWV8yVjVfTE9XX1dBUk47CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckxvdyA9IFNLX1NFTl9QSFlfMlY1X0xPV19FUlI7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjID0gIlZvbHRhZ2UgQ29yZSAxVjUiOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJIaWdoID0gU0tfU0VOX0NPUkVfMVY1X0hJR0hfRVJSOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9DT1JFXzFWNV9ISUdIX1dBUk47CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fQ09SRV8xVjVfTE9XX1dBUk47CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckxvdyA9IFNLX1NFTl9DT1JFXzFWNV9MT1dfRVJSOworCQkJfQorCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVHlwZSA9IFNLX1NFTl9WT0xUOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuUmVnID0gTE04MF9WVDRfSU47CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjID0gIlZvbHRhZ2UgUEhZIEIgUExMIjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MgPSAiVm9sdGFnZSBQSFkgM1YzIjsKKwkJCX0KKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblR5cGUgPSBTS19TRU5fVk9MVDsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJIaWdoID0gU0tfU0VOX1BMTF8zVjNfSElHSF9FUlI7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fUExMXzNWM19ISUdIX1dBUk47CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9QTExfM1YzX0xPV19XQVJOOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckxvdyA9IFNLX1NFTl9QTExfM1YzX0xPV19FUlI7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5SZWcgPSBMTTgwX1ZUNV9JTjsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MgPSAiU3BlZWQgRmFuIjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UeXBlID0gU0tfU0VOX0ZBTjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9GQU5fSElHSF9FUlI7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX0ZBTl9ISUdIX1dBUk47CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fRkFOX0xPV19XQVJOOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJMb3cgPSBTS19TRU5fRkFOX0xPV19FUlI7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuUmVnID0gTE04MF9GQU4yX0lOOworCQkJfQorCQkJZWxzZSB7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyA9ICJWb2x0YWdlIFBIWSAyVjUiOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblR5cGUgPSBTS19TRU5fVk9MVDsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9QSFlfMlY1X0hJR0hfRVJSOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9QSFlfMlY1X0hJR0hfV0FSTjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9QSFlfMlY1X0xPV19XQVJOOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJMb3cgPSBTS19TRU5fUEhZXzJWNV9MT1dfRVJSOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblJlZyA9IExNODBfVlQ2X0lOOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSU5JVCB8IFNLX0VSUkNMX1NXLAorCQkJCVNLRVJSX0kyQ19FMDAxLCBTS0VSUl9JMkNfRTAwMU1TRyk7CisJCQlicmVhazsKKwkJfQorCisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblZhbHVlID0gMDsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRXJyRmxhZyA9IFNLX1NFTl9FUlJfT0s7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkVyckN0cyA9IDA7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkJlZ0VyclRTID0gMDsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuU3RhdGUgPSBTS19TRU5fSURMRTsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuUmVhZCA9IFNrTG04MFJlYWRTZW5zb3I7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRldiA9IExNODBfQUREUjsKKwl9CisKKyNpZm5kZWYgU0tfRElBRworCXBBQy0+STJjLkR1bW15UmVhZHMgPSBwQUMtPkkyYy5NYXhTZW5zOworI2VuZGlmIC8qICFTS19ESUFHICovCisJCisJLyogQ2xlYXIgSTJDIElSUSAqLworCVNLX09VVDMyKElvQywgQjJfSTJDX0lSUSwgSTJDX0NMUl9JUlEpOworCQorCS8qIE5vdyB3ZSBhcmUgSS9PIGluaXRpYWxpemVkICovCisJcEFDLT5JMmMuSW5pdExldmVsID0gU0tfSU5JVF9JTzsKKwlyZXR1cm4oMCk7Cit9CS8qIFNrSTJjSW5pdDEgKi8KKworCisvKgorICogSW5pdCBsZXZlbCAyOiBTdGFydCBmaXJzdCBzZW5zb3IgcmVhZC4KKyAqLworc3RhdGljIGludCBTa0kyY0luaXQyKAorU0tfQUMJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DKQkvKiBJL08gQ29udGV4dCAqLworeworCWludAkJUmVhZENvbXBsZXRlOworCVNLX1NFTlNPUgkqcFNlbjsKKworCWlmIChwQUMtPkkyYy5Jbml0TGV2ZWwgIT0gU0tfSU5JVF9JTykgeworCQkvKiBSZUluaXQgbm90IG5lZWRlZCBpbiBJMkMgbW9kdWxlICovCisJCS8qIEluaXQwIGFuZCBJbml0MiBub3QgcGVybWl0dGVkICovCisJCXJldHVybigwKTsKKwl9CisKKwlwU2VuID0gJnBBQy0+STJjLlNlblRhYmxlW3BBQy0+STJjLkN1cnJTZW5zXTsKKwlSZWFkQ29tcGxldGUgPSBTa0kyY1JlYWRTZW5zb3IocEFDLCBJb0MsIHBTZW4pOworCisJaWYgKFJlYWRDb21wbGV0ZSkgeworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfSTJDX0UwMDgsIFNLRVJSX0kyQ19FMDA4TVNHKTsKKwl9CisKKwkvKiBOb3cgd2UgYXJlIGNvcnJlY3RseSBpbml0aWFsaXplZCAqLworCXBBQy0+STJjLkluaXRMZXZlbCA9IFNLX0lOSVRfUlVOOworCisJcmV0dXJuKDApOworfQkvKiBTa0kyY0luaXQyKi8KKworCisvKgorICogSW5pdGlhbGl6ZSBJMkMgZGV2aWNlcworICoKKyAqIEdldCB0aGUgZmlyc3Qgdm9sdGFnZSB2YWx1ZSBhbmQgZGlzY2FyZCBpdC4KKyAqIEdvIGludG8gdGVtcGVyYXR1cmUgcmVhZCBtb2RlLiBBIGRlZmF1bHQgcG9pbnRlciBpcyBub3Qgc2V0LgorICoKKyAqIFRoZSB0aGluZ3MgdG8gYmUgZG9uZSBkZXBlbmQgb24gdGhlIGluaXQgbGV2ZWwgaW4gdGhlIHBhcmFtZXRlciBsaXN0OgorICogTGV2ZWwgMDoKKyAqCUluaXRpYWxpemUgb25seSB0aGUgZGF0YSBzdHJ1Y3R1cmVzLiBEbyBOT1QgYWNjZXNzIGhhcmR3YXJlLgorICogTGV2ZWwgMToKKyAqCUluaXRpYWxpemUgaGFyZHdhcmUgdGhyb3VnaCBTS19JTiAvIFNLX09VVCBjb21tYW5kcy4gRG8gTk9UIHVzZSBpbnRlcnJ1cHRzLgorICogTGV2ZWwgMjoKKyAqCUV2ZXJ5dGhpbmcgaXMgcG9zc2libGUuIEludGVycnVwdHMgbWF5IGJlIHVzZWQgZnJvbSBub3cgb24uCisgKgorICogcmV0dXJuOgorICoJMCA9IHN1Y2Nlc3MKKyAqCW90aGVyID0gZXJyb3IuCisgKi8KK2ludAlTa0kyY0luaXQoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIEkvTyBDb250ZXh0IG5lZWRlZCBpbiBsZXZlbHMgMSBhbmQgMiAqLworaW50CQlMZXZlbCkJLyogSW5pdCBMZXZlbCAqLworeworCisJc3dpdGNoIChMZXZlbCkgeworCWNhc2UgU0tfSU5JVF9EQVRBOgorCQlyZXR1cm4oU2tJMmNJbml0MChwQUMpKTsKKwljYXNlIFNLX0lOSVRfSU86CisJCXJldHVybihTa0kyY0luaXQxKHBBQywgSW9DKSk7CisJY2FzZSBTS19JTklUX1JVTjoKKwkJcmV0dXJuKFNrSTJjSW5pdDIocEFDLCBJb0MpKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CS8qIFNrSTJjSW5pdCAqLworCisKKyNpZm5kZWYgU0tfRElBRworCisvKgorICogSW50ZXJydXB0IHNlcnZpY2UgZnVuY3Rpb24gZm9yIHRoZSBJMkMgSW50ZXJmYWNlCisgKgorICogQ2xlYXJzIHRoZSBJbnRlcnJ1cHQgc291cmNlCisgKgorICogUmVhZHMgdGhlIHJlZ2lzdGVyIGFuZCBjaGVjayBpdCBmb3Igc2VuZGluZyBhIHRyYXAuCisgKgorICogU3RhcnRzIHRoZSB0aW1lciBpZiBuZWNlc3NhcnkuCisgKi8KK3ZvaWQgU2tJMmNJc3IoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MpCS8qIEkvTyBDb250ZXh0ICovCit7CisJU0tfRVZQQVJBCVBhcmE7CisKKwkvKiBDbGVhciBJMkMgSVJRICovCisJU0tfT1VUMzIoSW9DLCBCMl9JMkNfSVJRLCBJMkNfQ0xSX0lSUSk7CisKKwlQYXJhLlBhcmE2NCA9IDA7CisJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9JMkMsIFNLX0kyQ0VWX0lSUSwgUGFyYSk7Cit9CS8qIFNrSTJjSXNyICovCisKKworLyoKKyAqIENoZWNrIHRoaXMgc2Vuc29ycyBWYWx1ZSBhZ2FpbnN0IHRoZSB0aHJlc2hvbGQgYW5kIHNlbmQgZXZlbnRzLgorICovCitzdGF0aWMgdm9pZCBTa0kyY0NoZWNrU2Vuc29yKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfU0VOU09SCSpwU2VuKQoreworCVNLX0VWUEFSQQlQYXJhTG9jYWw7CisJU0tfQk9PTAkJVG9vSGlnaDsJLyogSXMgc2Vuc29yIHRvbyBoaWdoPyAqLworCVNLX0JPT0wJCVRvb0xvdzsJCS8qIElzIHNlbnNvciB0b28gbG93PyAqLworCVNLX1U2NAkJQ3VyclRpbWU7CS8qIEN1cnJlbnQgVGltZSAqLworCVNLX0JPT0wJCURvVHJhcFNlbmQ7CS8qIFdlIG5lZWQgdG8gc2VuZCBhIHRyYXAgKi8KKwlTS19CT09MCQlEb0VyckxvZzsJLyogV2UgbmVlZCB0byBsb2cgdGhlIGVycm9yICovCisJU0tfQk9PTAkJSXNFcnJvcjsJLyogV2UgbmVlZCB0byBsb2cgdGhlIGVycm9yICovCisKKwkvKiBDaGVjayBEdW1teSBSZWFkcyBmaXJzdCAqLworCWlmIChwQUMtPkkyYy5EdW1teVJlYWRzID4gMCkgeworCQlwQUMtPkkyYy5EdW1teVJlYWRzLS07CisJCXJldHVybjsKKwl9CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgdGltZSAqLworCUN1cnJUaW1lID0gU2tPc0dldFRpbWUocEFDKTsKKworCS8qIFNldCBwYXJhIHRvIHRoZSBtb3N0IHVzZWZ1bCBzZXR0aW5nOiBUaGUgY3VycmVudCBzZW5zb3IuICovCisJUGFyYUxvY2FsLlBhcmE2NCA9IChTS19VNjQpcEFDLT5JMmMuQ3VyclNlbnM7CisKKwkvKiBDaGVjayB0aGUgVmFsdWUgYWdhaW5zdCB0aGUgdGhyZXNob2xkcy4gRmlyc3Q6IEVycm9yIFRocmVzaG9sZHMgKi8KKwlUb29IaWdoID0gKHBTZW4tPlNlblZhbHVlID4gcFNlbi0+U2VuVGhyZUVyckhpZ2gpOworCVRvb0xvdyA9IChwU2VuLT5TZW5WYWx1ZSA8IHBTZW4tPlNlblRocmVFcnJMb3cpOworCQkKKwlJc0Vycm9yID0gU0tfRkFMU0U7CisJaWYgKFRvb0hpZ2ggfHwgVG9vTG93KSB7CisJCS8qIEVycm9yIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQgKi8KKwkJRG9UcmFwU2VuZCA9IFNLX1RSVUU7CisJCURvRXJyTG9nID0gU0tfVFJVRTsKKworCQkvKiBOb3cgZXJyb3IgY29uZGl0aW9uIGlzIHNhdGlzZmllZCAqLworCQlJc0Vycm9yID0gU0tfVFJVRTsKKworCQlpZiAocFNlbi0+U2VuRXJyRmxhZyA9PSBTS19TRU5fRVJSX0VSUikgeworCQkJLyogVGhpcyBzdGF0ZSBpcyB0aGUgZm9ybWVyIG9uZSAqLworCisJCQkvKiBTbyBjaGVjayBmaXJzdCB3aGV0aGVyIHdlIGhhdmUgdG8gc2VuZCBhIHRyYXAgKi8KKwkJCWlmIChwU2VuLT5TZW5MYXN0RXJyVHJhcFRTICsgU0tfU0VOX0VSUl9UUl9IT0xEID4KKwkJCSAgICBDdXJyVGltZSkgeworCQkJCS8qCisJCQkJICogRG8gTk9UIHNlbmQgdGhlIFRyYXAuIFRoZSBob2xkIGJhY2sgdGltZQorCQkJCSAqIGhhcyB0byBydW4gb3V0IGZpcnN0LgorCQkJCSAqLworCQkJCURvVHJhcFNlbmQgPSBTS19GQUxTRTsKKwkJCX0KKworCQkJLyogQ2hlY2sgbm93IHdoZXRoZXIgd2UgaGF2ZSB0byBsb2cgYW4gRXJyb3IgKi8KKwkJCWlmIChwU2VuLT5TZW5MYXN0RXJyTG9nVFMgKyBTS19TRU5fRVJSX0xPR19IT0xEID4KKwkJCSAgICBDdXJyVGltZSkgeworCQkJCS8qCisJCQkJICogRG8gTk9UIGxvZyB0aGUgZXJyb3IuIFRoZSBob2xkIGJhY2sgdGltZQorCQkJCSAqIGhhcyB0byBydW4gb3V0IGZpcnN0LgorCQkJCSAqLworCQkJCURvRXJyTG9nID0gU0tfRkFMU0U7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBXZSBjYW1lIGZyb20gYSBkaWZmZXJlbnQgc3RhdGUgLT4gU2V0IEJlZ2luIFRpbWUgU3RhbXAgKi8KKwkJCXBTZW4tPlNlbkJlZ0VyclRTID0gQ3VyclRpbWU7CisJCQlwU2VuLT5TZW5FcnJGbGFnID0gU0tfU0VOX0VSUl9FUlI7CisJCX0KKworCQlpZiAoRG9UcmFwU2VuZCkgeworCQkJLyogU2V0IGN1cnJlbnQgVGltZSAqLworCQkJcFNlbi0+U2VuTGFzdEVyclRyYXBUUyA9IEN1cnJUaW1lOworCQkJcFNlbi0+U2VuRXJyQ3RzKys7CisKKwkJCS8qIFF1ZXVlIFBOTUkgRXZlbnQgKi8KKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUE5NSSwgKFRvb0hpZ2ggPworCQkJCVNLX1BOTUlfRVZUX1NFTl9FUlJfVVBQIDoKKwkJCQlTS19QTk1JX0VWVF9TRU5fRVJSX0xPVyksCisJCQkJUGFyYUxvY2FsKTsKKwkJfQorCisJCWlmIChEb0VyckxvZykgeworCQkJLyogU2V0IGN1cnJlbnQgVGltZSAqLworCQkJcFNlbi0+U2VuTGFzdEVyckxvZ1RTID0gQ3VyclRpbWU7CisKKwkJCWlmIChwU2VuLT5TZW5UeXBlID09IFNLX1NFTl9URU1QKSB7CisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9JMkNfRTAxMSwgU0tFUlJfSTJDX0UwMTFNU0cpOworCQkJfQorCQkJZWxzZSBpZiAocFNlbi0+U2VuVHlwZSA9PSBTS19TRU5fVk9MVCkgeworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfSTJDX0UwMTIsIFNLRVJSX0kyQ19FMDEyTVNHKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfSTJDX0UwMTUsIFNLRVJSX0kyQ19FMDE1TVNHKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIENoZWNrIHRoZSBWYWx1ZSBhZ2FpbnN0IHRoZSB0aHJlc2hvbGRzICovCisJLyogMm5kOiBXYXJuaW5nIHRocmVzaG9sZHMgKi8KKwlUb29IaWdoID0gKHBTZW4tPlNlblZhbHVlID4gcFNlbi0+U2VuVGhyZVdhcm5IaWdoKTsKKwlUb29Mb3cgPSAocFNlbi0+U2VuVmFsdWUgPCBwU2VuLT5TZW5UaHJlV2Fybkxvdyk7CisJCQorCWlmICghSXNFcnJvciAmJiAoVG9vSGlnaCB8fCBUb29Mb3cpKSB7CisJCS8qIEVycm9yIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQgKi8KKwkJRG9UcmFwU2VuZCA9IFNLX1RSVUU7CisJCURvRXJyTG9nID0gU0tfVFJVRTsKKworCQlpZiAocFNlbi0+U2VuRXJyRmxhZyA9PSBTS19TRU5fRVJSX1dBUk4pIHsKKwkJCS8qIFRoaXMgc3RhdGUgaXMgdGhlIGZvcm1lciBvbmUgKi8KKworCQkJLyogU28gY2hlY2sgZmlyc3Qgd2hldGhlciB3ZSBoYXZlIHRvIHNlbmQgYSB0cmFwICovCisJCQlpZiAocFNlbi0+U2VuTGFzdFdhcm5UcmFwVFMgKyBTS19TRU5fV0FSTl9UUl9IT0xEID4gQ3VyclRpbWUpIHsKKwkJCQkvKgorCQkJCSAqIERvIE5PVCBzZW5kIHRoZSBUcmFwLiBUaGUgaG9sZCBiYWNrIHRpbWUKKwkJCQkgKiBoYXMgdG8gcnVuIG91dCBmaXJzdC4KKwkJCQkgKi8KKwkJCQlEb1RyYXBTZW5kID0gU0tfRkFMU0U7CisJCQl9CisKKwkJCS8qIENoZWNrIG5vdyB3aGV0aGVyIHdlIGhhdmUgdG8gbG9nIGFuIEVycm9yICovCisJCQlpZiAocFNlbi0+U2VuTGFzdFdhcm5Mb2dUUyArIFNLX1NFTl9XQVJOX0xPR19IT0xEID4gQ3VyclRpbWUpIHsKKwkJCQkvKgorCQkJCSAqIERvIE5PVCBsb2cgdGhlIGVycm9yLiBUaGUgaG9sZCBiYWNrIHRpbWUKKwkJCQkgKiBoYXMgdG8gcnVuIG91dCBmaXJzdC4KKwkJCQkgKi8KKwkJCQlEb0VyckxvZyA9IFNLX0ZBTFNFOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogV2UgY2FtZSBmcm9tIGEgZGlmZmVyZW50IHN0YXRlIC0+IFNldCBCZWdpbiBUaW1lIFN0YW1wICovCisJCQlwU2VuLT5TZW5CZWdXYXJuVFMgPSBDdXJyVGltZTsKKwkJCXBTZW4tPlNlbkVyckZsYWcgPSBTS19TRU5fRVJSX1dBUk47CisJCX0KKworCQlpZiAoRG9UcmFwU2VuZCkgeworCQkJLyogU2V0IGN1cnJlbnQgVGltZSAqLworCQkJcFNlbi0+U2VuTGFzdFdhcm5UcmFwVFMgPSBDdXJyVGltZTsKKwkJCXBTZW4tPlNlbldhcm5DdHMrKzsKKworCQkJLyogUXVldWUgUE5NSSBFdmVudCAqLworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9QTk1JLCAoVG9vSGlnaCA/CisJCQkJU0tfUE5NSV9FVlRfU0VOX1dBUl9VUFAgOgorCQkJCVNLX1BOTUlfRVZUX1NFTl9XQVJfTE9XKSwKKwkJCQlQYXJhTG9jYWwpOworCQl9CisKKwkJaWYgKERvRXJyTG9nKSB7CisJCQkvKiBTZXQgY3VycmVudCBUaW1lICovCisJCQlwU2VuLT5TZW5MYXN0V2FybkxvZ1RTID0gQ3VyclRpbWU7CisKKwkJCWlmIChwU2VuLT5TZW5UeXBlID09IFNLX1NFTl9URU1QKSB7CisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9JMkNfRTAwOSwgU0tFUlJfSTJDX0UwMDlNU0cpOworCQkJfQorCQkJZWxzZSBpZiAocFNlbi0+U2VuVHlwZSA9PSBTS19TRU5fVk9MVCkgeworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfSTJDX0UwMTAsIFNLRVJSX0kyQ19FMDEwTVNHKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfSTJDX0UwMTQsIFNLRVJSX0kyQ19FMDE0TVNHKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIENoZWNrIGZvciBOTyBlcnJvciBhdCBhbGwgKi8KKwlpZiAoIUlzRXJyb3IgJiYgIVRvb0hpZ2ggJiYgIVRvb0xvdykgeworCQkvKiBTZXQgby5rLiBTdGF0dXMgaWYgbm8gZXJyb3IgYW5kIG5vIHdhcm5pbmcgY29uZGl0aW9uICovCisJCXBTZW4tPlNlbkVyckZsYWcgPSBTS19TRU5fRVJSX09LOworCX0KKworCS8qIEVuZCBvZiBjaGVjayBhZ2FpbnN0IHRoZSB0aHJlc2hvbGRzICovCisKKwkvKiBCdWcgZml4IEFGOiAxNi5BdWcuMjAwMTogQ29ycmVjdCB0aGUgaW5pdCBiYXNlCisJICogb2YgTE04MCBzZW5zb3IuCisJICovCisJaWYgKHBTZW4tPlNlbkluaXQgPT0gU0tfU0VOX0RZTl9JTklUX1BDSV9JTykgeworCisgICAgICAgIHBTZW4tPlNlbkluaXQgPSBTS19TRU5fRFlOX0lOSVRfTk9ORTsKKworCQlpZiAocFNlbi0+U2VuVmFsdWUgPiBTS19TRU5fUENJX0lPX1JBTkdFX0xJTUlURVIpIHsKKwkJCS8qIDVWIFBDSS1JTyBWb2x0YWdlICovCisJCQlwU2VuLT5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9QQ0lfSU9fNVZfTE9XX1dBUk47CisJCQlwU2VuLT5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX1BDSV9JT181Vl9MT1dfRVJSOworCQl9CisJCWVsc2UgeworCQkJLyogMy4zViBQQ0ktSU8gVm9sdGFnZSAqLworCQkJcFNlbi0+U2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX1BDSV9JT18zVjNfSElHSF9XQVJOOworCQkJcFNlbi0+U2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fUENJX0lPXzNWM19ISUdIX0VSUjsKKwkJfQorCX0KKwkKKyNpZmRlZiBURVNUX09OTFkKKyAgICAvKiBEeW5hbWljIHRocmVzaG9sZHMgYWxzbyBmb3IgVkFVWCBvZiBMTTgwIHNlbnNvciAqLworCWlmIChwU2VuLT5TZW5Jbml0ID09IFNLX1NFTl9EWU5fSU5JVF9WQVVYKSB7CisKKyAgICAgICAgcFNlbi0+U2VuSW5pdCA9IFNLX1NFTl9EWU5fSU5JVF9OT05FOworCisJCS8qIDMuM1YgVkFVWCBWb2x0YWdlICovCisJCWlmIChwU2VuLT5TZW5WYWx1ZSA+IFNLX1NFTl9WQVVYX1JBTkdFX0xJTUlURVIpIHsKKwkJCXBTZW4tPlNlblRocmVXYXJuTG93ID0gU0tfU0VOX1ZBVVhfM1YzX0xPV19XQVJOOworCQkJcFNlbi0+U2VuVGhyZUVyckxvdyA9IFNLX1NFTl9WQVVYXzNWM19MT1dfRVJSOworCQl9CisJCS8qIDBWIFZBVVggVm9sdGFnZSAqLworCQllbHNlIHsKKwkJCXBTZW4tPlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9WQVVYXzBWX1dBUk5fRVJSOworCQkJcFNlbi0+U2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fVkFVWF8wVl9XQVJOX0VSUjsKKwkJfQorCX0KKworCS8qCisJICogQ2hlY2sgaW5pdGlhbGl6YXRpb24gc3RhdGU6CisJICogVGhlIFZJTyBUaHJlc2hvbGRzIG5lZWQgYWRhcHRpb24KKwkgKi8KKwlpZiAoIXBTZW4tPlNlbkluaXQgJiYgcFNlbi0+U2VuUmVnID09IExNODBfVlQxX0lOICYmCisJICAgICBwU2VuLT5TZW5WYWx1ZSA+IFNLX1NFTl9XQVJOTE9XMkMgJiYKKwkgICAgIHBTZW4tPlNlblZhbHVlIDwgU0tfU0VOX1dBUk5ISUdIMikgeworCQlwU2VuLT5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX0VSUkxPVzJDOworCQlwU2VuLT5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9XQVJOTE9XMkM7CisJCXBTZW4tPlNlbkluaXQgPSBTS19UUlVFOworCX0KKworCWlmICghcFNlbi0+U2VuSW5pdCAmJiBwU2VuLT5TZW5SZWcgPT0gTE04MF9WVDFfSU4gJiYKKwkgICAgIHBTZW4tPlNlblZhbHVlID4gU0tfU0VOX1dBUk5MT1cyICYmCisJICAgICBwU2VuLT5TZW5WYWx1ZSA8IFNLX1NFTl9XQVJOSElHSDJDKSB7CisJCXBTZW4tPlNlblRocmVFcnJIaWdoID0gU0tfU0VOX0VSUkhJR0gyQzsKKwkJcFNlbi0+U2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX1dBUk5ISUdIMkM7CisJCXBTZW4tPlNlbkluaXQgPSBTS19UUlVFOworCX0KKyNlbmRpZgorCisJaWYgKHBTZW4tPlNlbkluaXQgIT0gU0tfU0VOX0RZTl9JTklUX05PTkUpIHsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9JMkNfRTAxMywgU0tFUlJfSTJDX0UwMTNNU0cpOworCX0KK30JLyogU2tJMmNDaGVja1NlbnNvciAqLworCisKKy8qCisgKiBUaGUgb25seSBFdmVudCB0byBiZSBzZXJ2ZWQgaXMgdGhlIHRpbWVvdXQgZXZlbnQKKyAqCisgKi8KK2ludAlTa0kyY0V2ZW50KAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJCUV2ZW50LAkvKiBNb2R1bGUgc3BlY2lmaWMgRXZlbnQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBFdmVudCBzcGVjaWZpYyBQYXJhbWV0ZXIgKi8KK3sKKwlpbnQJCQlSZWFkQ29tcGxldGU7CisJU0tfU0VOU09SCSpwU2VuOworCVNLX1UzMgkJVGltZTsKKwlTS19FVlBBUkEJUGFyYUxvY2FsOworCWludAkJCWk7CisKKwkvKiBOZXcgY2FzZTogbm8gc2Vuc29ycyAqLworCWlmIChwQUMtPkkyYy5NYXhTZW5zID09IDApIHsKKwkJcmV0dXJuKDApOworCX0KKworCXN3aXRjaCAoRXZlbnQpIHsKKwljYXNlIFNLX0kyQ0VWX0lSUToKKwkJcFNlbiA9ICZwQUMtPkkyYy5TZW5UYWJsZVtwQUMtPkkyYy5DdXJyU2Vuc107CisJCVJlYWRDb21wbGV0ZSA9IFNrSTJjUmVhZFNlbnNvcihwQUMsIElvQywgcFNlbik7CisKKwkJaWYgKFJlYWRDb21wbGV0ZSkgeworCQkJLyogQ2hlY2sgc2Vuc29yIGFnYWluc3QgZGVmaW5lZCB0aHJlc2hvbGRzICovCisJCQlTa0kyY0NoZWNrU2Vuc29yKHBBQywgcFNlbik7CisKKwkJCS8qIEluY3JlbWVudCBDdXJyZW50IHNlbnNvciBhbmQgc2V0IGFwcHJvcHJpYXRlIFRpbWVvdXQgKi8KKwkJCXBBQy0+STJjLkN1cnJTZW5zKys7CisJCQlpZiAocEFDLT5JMmMuQ3VyclNlbnMgPj0gcEFDLT5JMmMuTWF4U2VucykgeworCQkJCXBBQy0+STJjLkN1cnJTZW5zID0gMDsKKwkJCQlUaW1lID0gU0tfSTJDX1RJTV9MT05HOworCQkJfQorCQkJZWxzZSB7CisJCQkJVGltZSA9IFNLX0kyQ19USU1fU0hPUlQ7CisJCQl9CisKKwkJCS8qIFN0YXJ0IFRpbWVyICovCisJCQlQYXJhTG9jYWwuUGFyYTY0ID0gKFNLX1U2NCkwOworCisJCQlwQUMtPkkyYy5UaW1lck1vZGUgPSBTS19USU1FUl9ORVdfR0FVR0lORzsKKwkJCQorCQkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5JMmMuU2VuVGltZXIsIFRpbWUsCisJCQkJU0tHRV9JMkMsIFNLX0kyQ0VWX1RJTSwgUGFyYUxvY2FsKTsKKwkJfQorICAgICAgICBlbHNlIHsKKwkJCS8qIFN0YXJ0IFRpbWVyICovCisJCQlQYXJhTG9jYWwuUGFyYTY0ID0gKFNLX1U2NCkwOworCisJCQlwQUMtPkkyYy5UaW1lck1vZGUgPSBTS19USU1FUl9XQVRDSF9TTTsKKworICAgICAgICAgICAgU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5JMmMuU2VuVGltZXIsIFNLX0kyQ19USU1fV0FUQ0gsCisJCQkJU0tHRV9JMkMsIFNLX0kyQ0VWX1RJTSwgUGFyYUxvY2FsKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNLX0kyQ0VWX1RJTToKKwkJaWYgKHBBQy0+STJjLlRpbWVyTW9kZSA9PSBTS19USU1FUl9ORVdfR0FVR0lORykgeworCisJCQlQYXJhTG9jYWwuUGFyYTY0ID0gKFNLX1U2NCkwOworCQkJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwQUMtPkkyYy5TZW5UaW1lcik7CisKKwkJCXBTZW4gPSAmcEFDLT5JMmMuU2VuVGFibGVbcEFDLT5JMmMuQ3VyclNlbnNdOworCQkJUmVhZENvbXBsZXRlID0gU2tJMmNSZWFkU2Vuc29yKHBBQywgSW9DLCBwU2VuKTsKKworCQkJaWYgKFJlYWRDb21wbGV0ZSkgeworCQkJCS8qIENoZWNrIHNlbnNvciBhZ2FpbnN0IGRlZmluZWQgdGhyZXNob2xkcyAqLworCQkJCVNrSTJjQ2hlY2tTZW5zb3IocEFDLCBwU2VuKTsKKworCQkJCS8qIEluY3JlbWVudCBDdXJyZW50IHNlbnNvciBhbmQgc2V0IGFwcHJvcHJpYXRlIFRpbWVvdXQgKi8KKwkJCQlwQUMtPkkyYy5DdXJyU2VucysrOworCQkJCWlmIChwQUMtPkkyYy5DdXJyU2VucyA9PSBwQUMtPkkyYy5NYXhTZW5zKSB7CisJCQkJCXBBQy0+STJjLkN1cnJTZW5zID0gMDsKKwkJCQkJVGltZSA9IFNLX0kyQ19USU1fTE9ORzsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCVRpbWUgPSBTS19JMkNfVElNX1NIT1JUOworCQkJCX0KKworCQkJCS8qIFN0YXJ0IFRpbWVyICovCisJCQkJUGFyYUxvY2FsLlBhcmE2NCA9IChTS19VNjQpMDsKKworCQkJCXBBQy0+STJjLlRpbWVyTW9kZSA9IFNLX1RJTUVSX05FV19HQVVHSU5HOworCisJCQkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5JMmMuU2VuVGltZXIsIFRpbWUsCisJCQkJCVNLR0VfSTJDLCBTS19JMkNFVl9USU0sIFBhcmFMb2NhbCk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlwU2VuID0gJnBBQy0+STJjLlNlblRhYmxlW3BBQy0+STJjLkN1cnJTZW5zXTsKKwkJCXBTZW4tPlNlbkVyckZsYWcgPSBTS19TRU5fRVJSX0ZBVUxUWTsKKwkJCVNLX0kyQ19TVE9QKElvQyk7CisKKwkJCS8qIEluY3JlbWVudCBDdXJyZW50IHNlbnNvciBhbmQgc2V0IGFwcHJvcHJpYXRlIFRpbWVvdXQgKi8KKwkJCXBBQy0+STJjLkN1cnJTZW5zKys7CisJCQlpZiAocEFDLT5JMmMuQ3VyclNlbnMgPT0gcEFDLT5JMmMuTWF4U2VucykgeworCQkJCXBBQy0+STJjLkN1cnJTZW5zID0gMDsKKwkJCQlUaW1lID0gU0tfSTJDX1RJTV9MT05HOworCQkJfQorCQkJZWxzZSB7CisJCQkJVGltZSA9IFNLX0kyQ19USU1fU0hPUlQ7CisJCQl9CisKKwkJCS8qIFN0YXJ0IFRpbWVyICovCisJCQlQYXJhTG9jYWwuUGFyYTY0ID0gKFNLX1U2NCkwOworCisJCQlwQUMtPkkyYy5UaW1lck1vZGUgPSBTS19USU1FUl9ORVdfR0FVR0lORzsKKworCQkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5JMmMuU2VuVGltZXIsIFRpbWUsCisJCQkJU0tHRV9JMkMsIFNLX0kyQ0VWX1RJTSwgUGFyYUxvY2FsKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNLX0kyQ0VWX0NMRUFSOgorCQlmb3IgKGkgPSAwOyBpIDwgU0tfTUFYX1NFTlNPUlM7IGkrKykgeworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRXJyRmxhZyA9IFNLX1NFTl9FUlJfT0s7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5FcnJDdHMgPSAwOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuV2FybkN0cyA9IDA7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5CZWdFcnJUUyA9IDA7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5CZWdXYXJuVFMgPSAwOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuTGFzdEVyclRyYXBUUyA9IChTS19VNjQpMDsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkxhc3RFcnJMb2dUUyA9IChTS19VNjQpMDsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkxhc3RXYXJuVHJhcFRTID0gKFNLX1U2NCkwOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuTGFzdFdhcm5Mb2dUUyA9IChTS19VNjQpMDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0kyQ19FMDA2LCBTS0VSUl9JMkNfRTAwNk1TRyk7CisJfQorCisJcmV0dXJuKDApOworfQkvKiBTa0kyY0V2ZW50Ki8KKworI2VuZGlmIC8qICFTS19ESUFHICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrbG04MC5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2xtODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODI5MmQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2xtODAuYwpAQCAtMCwwICsxLDIxMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrbG04MC5jCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBUV1NJLU1vZHVsZQorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjIyICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzEwLzIwIDA5OjA4OjIxICQKKyAqIFB1cnBvc2U6CUZ1bmN0aW9ucyB0byBhY2Nlc3MgVm9sdGFnZSBhbmQgVGVtcGVyYXR1cmUgU2Vuc29yIChMTTgwKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCUxNODAgZnVuY3Rpb25zCisqLworI2lmIChkZWZpbmVkKERFQlVHKSB8fCAoKCFkZWZpbmVkKExJTlQpKSAmJiAoIWRlZmluZWQoU0tfU0xJTSkpKSkKK3N0YXRpYyBjb25zdCBjaGFyIFN5c0tvbm5lY3RGaWxlSWRbXSA9CisJIkAoIykgJElkOiBza2xtODAuYyx2IDEuMjIgMjAwMy8xMC8yMCAwOTowODoyMSByc2NobWlkdCBFeHAgJCAoQykgTWFydmVsbC4gIjsKKyNlbmRpZgorCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgkJLyogRHJpdmVyIFNwZWNpZmljIERlZmluaXRpb25zICovCisjaW5jbHVkZSAiaC9sbTgwLmgiCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgkJLyogQWRhcHRlciBDb250cm9sLSBhbmQgRHJpdmVyIHNwZWNpZmljIERlZi4gKi8KKworI2lmZGVmCVNLX0RJQUcKKyNkZWZpbmUJQlJFQUtfT1JfV0FJVChwQUMsSW9DLEV2ZW50KQlTa0kyY1dhaXQocEFDLElvQyxFdmVudCkKKyNlbHNlCS8qIG5TS19ESUFHICovCisjZGVmaW5lCUJSRUFLX09SX1dBSVQocEFDLElvQyxFdmVudCkJYnJlYWsKKyNlbmRpZgkvKiBuU0tfRElBRyAqLworCisjaWZkZWYJU0tfRElBRworLyoKKyAqIHJlYWQgdGhlIHJlZ2lzdGVyICdSZWcnIGZyb20gdGhlIGRldmljZSAnRGV2JworICoKKyAqIHJldHVybiAJcmVhZCBlcnJvcgktMQorICoJCXN1Y2Nlc3MJCXRoZSByZWFkIHZhbHVlCisgKi8KK2ludAlTa0xtODBSY3ZSZWcoCitTS19JT0MJSW9DLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitpbnQJCURldiwJCS8qIEkyQyBkZXZpY2UgYWRkcmVzcyAqLworaW50CQlSZWcpCQkvKiByZWdpc3RlciB0byByZWFkICovCit7CisJaW50CVZhbCA9IDA7CisJaW50CVRlbXBFeHQ7CisKKwkvKiBTaWduYWwgZGV2aWNlIG51bWJlciAqLworCWlmIChTa0kyY1NuZERldihJb0MsIERldiwgSTJDX1dSSVRFKSkgeworCQlyZXR1cm4oLTEpOworCX0KKworCWlmIChTa0kyY1NuZEJ5dGUoSW9DLCBSZWcpKSB7CisJCXJldHVybigtMSk7CisJfQorCisJLyogcmVwZWF0IHN0YXJ0ICovCisJaWYgKFNrSTJjU25kRGV2KElvQywgRGV2LCBJMkNfUkVBRCkpIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwlzd2l0Y2ggKFJlZykgeworCWNhc2UgTE04MF9URU1QX0lOOgorCQlWYWwgPSAoaW50KVNrSTJjUmN2Qnl0ZShJb0MsIDEpOworCisJCS8qIEZpcnN0OiBjb3JyZWN0IHRoZSB2YWx1ZTogaXQgbWlnaHQgYmUgbmVnYXRpdmUgKi8KKwkJaWYgKChWYWwgJiAweDgwKSAhPSAwKSB7CisJCQkvKiBWYWx1ZSBpcyBuZWdhdGl2ZSAqLworCQkJVmFsID0gVmFsIC0gMjU2OworCQl9CisJCVZhbCA9IFZhbCAqIFNLX0xNODBfVEVNUF9MU0I7CisJCVNrSTJjU3RvcChJb0MpOworCQkKKwkJVGVtcEV4dCA9IChpbnQpU2tMbTgwUmN2UmVnKElvQywgTE04MF9BRERSLCBMTTgwX1RFTVBfQ1RSTCk7CisJCQorCQlpZiAoVmFsID4gMCkgeworCQkJVmFsICs9ICgoVGVtcEV4dCA+PiA3KSAqIFNLX0xNODBfVEVNUEVYVF9MU0IpOworCQl9CisJCWVsc2UgeworCQkJVmFsIC09ICgoVGVtcEV4dCA+PiA3KSAqIFNLX0xNODBfVEVNUEVYVF9MU0IpOworCQl9CisJCXJldHVybihWYWwpOworCQlicmVhazsKKwljYXNlIExNODBfVlQwX0lOOgorCWNhc2UgTE04MF9WVDFfSU46CisJY2FzZSBMTTgwX1ZUMl9JTjoKKwljYXNlIExNODBfVlQzX0lOOgorCQlWYWwgPSAoaW50KVNrSTJjUmN2Qnl0ZShJb0MsIDEpICogU0tfTE04MF9WVF9MU0I7CisJCWJyZWFrOworCQorCWRlZmF1bHQ6CisJCVZhbCA9IChpbnQpU2tJMmNSY3ZCeXRlKElvQywgMSk7CisJCWJyZWFrOworCX0KKworCVNrSTJjU3RvcChJb0MpOworCXJldHVybihWYWwpOworfQorI2VuZGlmCS8qIFNLX0RJQUcgKi8KKworLyoKKyAqIHJlYWQgYSBzZW5zb3JzIHZhbHVlIChMTTgwIHNwZWNpZmljKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgYSBzZW5zb3JzIHZhbHVlIGZyb20gdGhlIEkyQyBzZW5zb3IgY2hpcCBMTTgwLgorICogVGhlIHNlbnNvciBpcyBkZWZpbmVkIGJ5IGl0cyBpbmRleCBpbnRvIHRoZSBzZW5zb3JzIGRhdGFiYXNlIGluIHRoZSBzdHJ1Y3QKKyAqIHBBQyBwb2ludHMgdG8uCisgKgorICogUmV0dXJucwkxIGlmIHRoZSByZWFkIGlzIGNvbXBsZXRlZAorICoJCTAgaWYgdGhlIHJlYWQgbXVzdCBiZSBjb250aW51ZWQgKEkyQyBCdXMgc3RpbGwgYWxsb2NhdGVkKQorICovCitpbnQgU2tMbTgwUmVhZFNlbnNvcigKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCBuZWVkZWQgaW4gbGV2ZWwgMSBhbmQgMiAqLworU0tfU0VOU09SCSpwU2VuKQkvKiBTZW5zb3IgdG8gYmUgcmVhZCAqLworeworCVNLX0kzMgkJVmFsdWU7CisKKwlzd2l0Y2ggKHBTZW4tPlNlblN0YXRlKSB7CisJY2FzZSBTS19TRU5fSURMRToKKwkJLyogU2VuZCBhZGRyZXNzIHRvIEFERFIgcmVnaXN0ZXIgKi8KKwkJU0tfSTJDX0NUTChJb0MsIEkyQ19SRUFELCBwU2VuLT5TZW5EZXYsIEkyQ18wMjVLX0RFViwgcFNlbi0+U2VuUmVnLCAwKTsKKworCQlwU2VuLT5TZW5TdGF0ZSA9IFNLX1NFTl9WQUxVRSA7CisJCUJSRUFLX09SX1dBSVQocEFDLCBJb0MsIEkyQ19SRUFEKTsKKwkKKwljYXNlIFNLX1NFTl9WQUxVRToKKwkJLyogUmVhZCB2YWx1ZSBmcm9tIGRhdGEgcmVnaXN0ZXIgKi8KKwkJU0tfSU4zMihJb0MsIEIyX0kyQ19EQVRBLCAoKFNLX1UzMiAqKSZWYWx1ZSkpOworCQkKKwkJVmFsdWUgJj0gMHhmZjsgLyogb25seSBsZWFzdCBzaWduaWZpY2FudCBieXRlIGlzIHZhbGlkICovCisKKwkJLyogRG8gTk9UIGNoZWNrIHRoZSBWYWx1ZSBhZ2FpbnN0IHRoZSB0aHJlc2hvbGRzICovCisJCS8qIENoZWNraW5nIGlzIGRvbmUgaW4gdGhlIGNhbGxpbmcgaW5zdGFuY2UgKi8KKworCQlpZiAocFNlbi0+U2VuVHlwZSA9PSBTS19TRU5fVk9MVCkgeworCQkJLyogVm9sdGFnZSBzZW5zb3IgKi8KKwkJCXBTZW4tPlNlblZhbHVlID0gVmFsdWUgKiBTS19MTTgwX1ZUX0xTQjsKKwkJCXBTZW4tPlNlblN0YXRlID0gU0tfU0VOX0lETEUgOworCQkJcmV0dXJuKDEpOworCQl9CisKKwkJaWYgKHBTZW4tPlNlblR5cGUgPT0gU0tfU0VOX0ZBTikgeworCQkJaWYgKFZhbHVlICE9IDAgJiYgVmFsdWUgIT0gMHhmZikgeworCQkJCS8qIEZhbiBzcGVlZCBjb3VudGVyICovCisJCQkJcFNlbi0+U2VuVmFsdWUgPSBTS19MTTgwX0ZBTl9GQUtUT1IvVmFsdWU7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKiBJbmRpY2F0ZSBGYW4gZXJyb3IgKi8KKwkJCQlwU2VuLT5TZW5WYWx1ZSA9IDA7CisJCQl9CisJCQlwU2VuLT5TZW5TdGF0ZSA9IFNLX1NFTl9JRExFIDsKKwkJCXJldHVybigxKTsKKwkJfQorCisJCS8qIEZpcnN0OiBjb3JyZWN0IHRoZSB2YWx1ZTogaXQgbWlnaHQgYmUgbmVnYXRpdmUgKi8KKwkJaWYgKChWYWx1ZSAmIDB4ODApICE9IDApIHsKKwkJCS8qIFZhbHVlIGlzIG5lZ2F0aXZlICovCisJCQlWYWx1ZSA9IFZhbHVlIC0gMjU2OworCQl9CisKKwkJLyogV2UgaGF2ZSBhIHRlbXBlcmF0dXJlIHNlbnNvciBhbmQgbmVlZCB0byBnZXQgdGhlIHNpZ25lZCBleHRlbnNpb24uCisJCSAqIEZvciBub3cgd2UgZ2V0IHRoZSBleHRlbnNpb24gZnJvbSB0aGUgbGFzdCByZWFkaW5nLCBzbyBpbiB0aGUgbm9ybWFsCisJCSAqIGNhc2Ugd2Ugd29uJ3Qgc2VlIGZsaWNrZXJpbmcgdGVtcGVyYXR1cmVzLgorCQkgKi8KKwkJcFNlbi0+U2VuVmFsdWUgPSAoVmFsdWUgKiBTS19MTTgwX1RFTVBfTFNCKSArCisJCQkocFNlbi0+U2VuVmFsdWUgJSBTS19MTTgwX1RFTVBfTFNCKTsKKworCQkvKiBTZW5kIGFkZHJlc3MgdG8gQUREUiByZWdpc3RlciAqLworCQlTS19JMkNfQ1RMKElvQywgSTJDX1JFQUQsIHBTZW4tPlNlbkRldiwgSTJDXzAyNUtfREVWLCBMTTgwX1RFTVBfQ1RSTCwgMCk7CisKKwkJcFNlbi0+U2VuU3RhdGUgPSBTS19TRU5fVkFMRVhUIDsKKwkJQlJFQUtfT1JfV0FJVChwQUMsIElvQywgSTJDX1JFQUQpOworCQorCWNhc2UgU0tfU0VOX1ZBTEVYVDoKKwkJLyogUmVhZCB2YWx1ZSBmcm9tIGRhdGEgcmVnaXN0ZXIgKi8KKwkJU0tfSU4zMihJb0MsIEIyX0kyQ19EQVRBLCAoKFNLX1UzMiAqKSZWYWx1ZSkpOworCQlWYWx1ZSAmPSBMTTgwX1RFTVBfTFNCXzk7IC8qIG9ubHkgYml0IDcgaXMgdmFsaWQgKi8KKworCQkvKiBjdXQgdGhlIExTQiBiaXQgKi8KKwkJcFNlbi0+U2VuVmFsdWUgPSAoKHBTZW4tPlNlblZhbHVlIC8gU0tfTE04MF9URU1QX0xTQikgKgorCQkJU0tfTE04MF9URU1QX0xTQik7CisKKwkJaWYgKHBTZW4tPlNlblZhbHVlIDwgMCkgeworCQkJLyogVmFsdWUgbmVnYXRpdmU6IFRoZSBiaXQgdmFsdWUgbXVzdCBiZSBzdWJ0cmFjdGVkICovCisJCQlwU2VuLT5TZW5WYWx1ZSAtPSAoKFZhbHVlID4+IDcpICogU0tfTE04MF9URU1QRVhUX0xTQik7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBWYWx1ZSBwb3NpdGl2ZTogVGhlIGJpdCB2YWx1ZSBtdXN0IGJlIGFkZGVkICovCisJCQlwU2VuLT5TZW5WYWx1ZSArPSAoKFZhbHVlID4+IDcpICogU0tfTE04MF9URU1QRVhUX0xTQik7CisJCX0KKworCQlwU2VuLT5TZW5TdGF0ZSA9IFNLX1NFTl9JRExFIDsKKwkJcmV0dXJuKDEpOworCQorCWRlZmF1bHQ6CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSTJDX0UwMDcsIFNLRVJSX0kyQ19FMDA3TVNHKTsKKwkJcmV0dXJuKDEpOworCX0KKworCS8qIE5vdCBjb21wbGV0ZWQgKi8KKwlyZXR1cm4oMCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2twcm9jLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZWNlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrcHJvYy5jCkBAIC0wLDAgKzEsMjY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2twcm9jLmMKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4xMSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMi8xMSAxNjowMzo1NyAkCisgKiBQdXJwb3NlOglGdW5rdGlvbnMgdG8gZGlzcGxheSBzdGF0aWN0aWMgZGF0YQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglDcmVhdGVkIDIyLU5vdi0yMDAwCisgKglBdXRob3I6IE1pcmtvIExpbmRuZXIgKG1saW5kbmVyQHN5c2tvbm5lY3QuZGUpCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIKKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCisjaW5jbHVkZSAiaC9za3ZlcnNpb24uaCIKKworc3RhdGljIGludCBza19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdik7CitzdGF0aWMgaW50IHNrX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2tfcHJvY19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBza19wcm9jX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBza19zZXFfc2hvdyAtIHNob3cgcHJvYyBpbmZvcm1hdGlvbiBvZiBhIHBhcnRpY3VsYXIgYWRhcHRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgdGhlIHByb2MgZW50cnkgd2l0aCBzdGF0aXN0aWMgZGF0YSBhYm91dCAKKyAqICB0aGUgZXRoZXJuZXQgZGV2aWNlLiBJdCBpbnZva2VzIHRoZSBnZW5lcmljIHNrX2dlbl9icm93c2UoKSB0bworICogIHByaW50IG91dCBhbGwgaXRlbXMgb25lIHBlciBvbmUuCisgKiAgCisgKiBSZXR1cm5zOiAwCisgKiAgICAgIAorICovCitzdGF0aWMgaW50IHNrX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzZXEtPnByaXZhdGU7CisJREVWX05FVAkJCSpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlTS19BQwkJCSpwQUMgPSBwTmV0LT5wQUM7CisJU0tfUE5NSV9TVFJVQ1RfREFUQSAJKnBQbm1pU3RydWN0ID0gJnBBQy0+UG5taVN0cnVjdDsKKwl1bnNpZ25lZCBsb25nCQlGbGFnczsJCisJdW5zaWduZWQgaW50CQlTaXplOworCWNoYXIJCQlzZW5zX21zZ1s1MF07CisJaW50IAkJCXQ7CisJaW50IAkJCWk7CisKKwkvKiBOZXRJbmRleCBpbiBHZXRTdHJ1Y3QgaXMgbm93IHJlcXVpcmVkLCB6ZXJvIGlzIG9ubHkgZHVtbXkgKi8KKwlmb3IgKHQ9cEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyB0ID4gMDsgdC0tKSB7CisJCWlmICgocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIpICYmIHBBQy0+UmxtdE5ldHMgPT0gMSkKKwkJCXQtLTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkJU2l6ZSA9IFNLX1BOTUlfU1RSVUNUX1NJWkU7CisjaWZkZWYgU0tfRElBR19TVVBQT1JUCisJCWlmIChwQUMtPkJvYXJkTGV2ZWwgPT0gU0tfSU5JVF9EQVRBKSB7CisJCQlTS19NRU1DUFkoJihwQUMtPlBubWlTdHJ1Y3QpLCAmKHBBQy0+UG5taUJhY2t1cCksIHNpemVvZihTS19QTk1JX1NUUlVDVF9EQVRBKSk7CisJCQlpZiAocEFDLT5EaWFnTW9kZUFjdGl2ZSA9PSBESUFHX05PVEFDVElWRSkgeworCQkJCXBBQy0+UG5taS5EaWFnQXR0YWNoZWQgPSBTS19ESUFHX0lETEU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlTa1BubWlHZXRTdHJ1Y3QocEFDLCBwQUMtPklvQmFzZSwgcFBubWlTdHJ1Y3QsICZTaXplLCB0LTEpOworCQl9CisjZWxzZQorCQlTa1BubWlHZXRTdHJ1Y3QocEFDLCBwQUMtPklvQmFzZSwgCisJCQkJcFBubWlTdHJ1Y3QsICZTaXplLCB0LTEpOworI2VuZGlmCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCisJCWlmIChwQUMtPmRldlt0LTFdID09IGRldikgeworCQkJU0tfUE5NSV9TVEFUCSpwUG5taVN0YXQgPSAmcFBubWlTdHJ1Y3QtPlN0YXRbMF07CisKKwkJCXNlcV9wcmludGYoc2VxLCAiXG5EZXRhaWxlZCBzdGF0aXN0aWMgZm9yIGRldmljZSAlc1xuIiwKKwkJCQkgICAgICBwQUMtPmRldlt0LTFdLT5uYW1lKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwkKKwkJCS8qIEJvYXJkIHN0YXRpc3RpY3MgKi8KKwkJCXNlcV9wcmludGYoc2VxLCAiXG5Cb2FyZCBzdGF0aXN0aWNzXG5cbiIpOworCQkJc2VxX3ByaW50ZihzZXEsICJBY3RpdmUgUG9ydCAgICAgICAgICAgICAgICAgICAgJWNcbiIsCisJCQkJICAgICAgJ0EnICsgcEFDLT5SbG10Lk5ldFt0LTFdLlBvcnRbcEFDLT5SbG10LgorCQkJCQkJCQkgICAgTmV0W3QtMV0uUHJlZlBvcnRdLT5Qb3J0TnVtYmVyKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiUHJlZmVycmVkIFBvcnQgICAgICAgICAgICAgICAgICVjXG4iLAorCQkJCSAgICAgICdBJyArIHBBQy0+UmxtdC5OZXRbdC0xXS5Qb3J0W3BBQy0+UmxtdC4KKwkJCQkJCQkJICAgIE5ldFt0LTFdLlByZWZQb3J0XS0+UG9ydE51bWJlcik7CisKKwkJCXNlcV9wcmludGYoc2VxLCAiQnVzIHNwZWVkIChNSHopICAgICAgICAgICAgICAgICVkXG4iLAorCQkJCSAgICAgIHBQbm1pU3RydWN0LT5CdXNTcGVlZCk7CisKKwkJCXNlcV9wcmludGYoc2VxLCAiQnVzIHdpZHRoIChCaXQpICAgICAgICAgICAgICAgICVkXG4iLAorCQkJCSAgICAgIHBQbm1pU3RydWN0LT5CdXNXaWR0aCk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIkRyaXZlciB2ZXJzaW9uICAgICAgICAgICAgICAgICAlc1xuIiwKKwkJCQkgICAgICBWRVJfU1RSSU5HKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiSGFyZHdhcmUgcmV2aXNpb24gICAgICAgICAgICAgIHYlZC4lZFxuIiwKKwkJCQkgICAgICAocEFDLT5HSW5pLkdJUGNpSHdSZXYgPj4gNCkgJiAweDBGLAorCQkJCSAgICAgIHBBQy0+R0luaS5HSVBjaUh3UmV2ICYgMHgwRik7CisKKwkJCS8qIFByaW50IHNlbnNvciBpbmZvcm1hdGlvbnMgKi8KKwkJCWZvciAoaT0wOyBpIDwgcEFDLT5JMmMuTWF4U2VuczsgaSArKykgeworCQkJCS8qIENoZWNrIHR5cGUgKi8KKwkJCQlzd2l0Y2ggKHBBQy0+STJjLlNlblRhYmxlW2ldLlNlblR5cGUpIHsKKwkJCQljYXNlIDE6CisJCQkJCXN0cmNweShzZW5zX21zZywgcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyk7CisJCQkJCXN0cmNhdChzZW5zX21zZywgIiAoQykiKTsKKwkJCQkJc2VxX3ByaW50ZihzZXEsICIlLTI1cyAgICAgICVkLiUwMmRcbiIsCisJCQkJCQkgICAgICBzZW5zX21zZywKKwkJCQkJCSAgICAgIHBBQy0+STJjLlNlblRhYmxlW2ldLlNlblZhbHVlIC8gMTAsCisJCQkJCQkgICAgICBwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5WYWx1ZSAlIDEwKTsKKworCQkJCQlzdHJjcHkoc2Vuc19tc2csIHBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MpOworCQkJCQlzdHJjYXQoc2Vuc19tc2csICIgKEYpIik7CisJCQkJCXNlcV9wcmludGYoc2VxLCAiJS0yNXMgICAgICAlZC4lMDJkXG4iLAorCQkJCQkJICAgICAgc2Vuc19tc2csCisJCQkJCQkgICAgICAoKCgocEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVmFsdWUpCisJCQkJCQkJICoxMCkqOSkvNSArIDMyMDApLzEwMCwKKwkJCQkJCSAgICAgICgoKChwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5WYWx1ZSkKKwkJCQkJCQkgKjEwKSo5KS81ICsgMzIwMCkgJSAxMCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJc3RyY3B5KHNlbnNfbXNnLCBwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjKTsKKwkJCQkJc3RyY2F0KHNlbnNfbXNnLCAiIChWKSIpOworCQkJCQlzZXFfcHJpbnRmKHNlcSwgIiUtMjVzICAgICAgJWQuJTAzZFxuIiwKKwkJCQkJCSAgICAgIHNlbnNfbXNnLAorCQkJCQkJICAgICAgcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVmFsdWUgLyAxMDAwLAorCQkJCQkJICAgICAgcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVmFsdWUgJSAxMDAwKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzOgorCQkJCQlzdHJjcHkoc2Vuc19tc2csIHBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MpOworCQkJCQlzdHJjYXQoc2Vuc19tc2csICIgKHJwbSkiKTsKKwkJCQkJc2VxX3ByaW50ZihzZXEsICIlLTI1cyAgICAgICVkXG4iLAorCQkJCQkJICAgICAgc2Vuc19tc2csCisJCQkJCQkgICAgICBwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5WYWx1ZSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCQkKKwkJCS8qUmVjZWl2ZSBzdGF0aXN0aWNzICovCisJCQlzZXFfcHJpbnRmKHNlcSwgIlxuUmVjZWl2ZSBzdGF0aXN0aWNzXG5cbiIpOworCisJCQlzZXFfcHJpbnRmKHNlcSwgIlJlY2VpdmVkIGJ5dGVzICAgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhPY3RldHNPa0N0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlJlY2VpdmVkIHBhY2tldHMgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhPa0N0cyk7CisjaWYgMAorCQkJaWYgKHBBQy0+R0luaS5HUFswXS5QaHlUeXBlID09IFNLX1BIWV9YTUFDICYmIAorCQkJICAgIHBBQy0+SFdSZXZpc2lvbiA8IDEyKSB7CisJCQkJcFBubWlTdHJ1Y3QtPkluRXJyb3JzQ3RzID0gcFBubWlTdHJ1Y3QtPkluRXJyb3JzQ3RzIC0gCisJCQkJCXBQbm1pU3RhdC0+U3RhdFJ4U2hvcnRzQ3RzOworCQkJCXBQbm1pU3RhdC0+U3RhdFJ4U2hvcnRzQ3RzID0gMDsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKGRldi0+bXR1ID4gMTUwMCkKKwkJCQlwUG5taVN0cnVjdC0+SW5FcnJvcnNDdHMgPSBwUG5taVN0cnVjdC0+SW5FcnJvcnNDdHMgLQorCQkJCQlwUG5taVN0YXQtPlN0YXRSeFRvb0xvbmdDdHM7CisKKwkJCXNlcV9wcmludGYoc2VxLCAiUmVjZWl2ZSBlcnJvcnMgICAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0cnVjdC0+SW5FcnJvcnNDdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICJSZWNlaXZlIGRyb3BwZWQgICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RydWN0LT5SeE5vQnVmQ3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiUmVjZWl2ZWQgbXVsdGljYXN0ICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeE11bHRpY2FzdE9rQ3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiUmVjZWl2ZSBlcnJvciB0eXBlc1xuIik7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhSdW50Q3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgYnVmZmVyIG92ZXJmbG93ICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeEZpZm9PdmVyZmxvd0N0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIGJhZCBjcmMgICAgICAgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhGY3NDdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICIgICBmcmFtaW5nICAgICAgICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4RnJhbWluZ0N0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIG1pc3NlZCBmcmFtZXMgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhNaXNzZWRDdHMpOworCisJCQlpZiAoZGV2LT5tdHUgPiAxNTAwKQorCQkJCXBQbm1pU3RhdC0+U3RhdFJ4VG9vTG9uZ0N0cyA9IDA7CisKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgdG9vIGxvbmcgICAgICAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeFRvb0xvbmdDdHMpOwkJCQkJCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIGNhcnJpZXIgZXh0ZW5zaW9uICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhDZXh0Q3RzKTsJCQkJCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIHRvbyBzaG9ydCAgICAgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhTaG9ydHNDdHMpOwkJCQkKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgc3ltYm9sICAgICAgICAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeFN5bWJvbEN0cyk7CQkJCQorCQkJc2VxX3ByaW50ZihzZXEsICIgICBMTEMgTUFDIHNpemUgICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4SVJMZW5ndGhDdHMpOwkJCQkKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgY2FycmllciBldmVudCAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeENhcnJpZXJDdHMpOwkJCQkKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgamFiYmVyICAgICAgICAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeEphYmJlckN0cyk7CQkJCQorCisKKwkJCS8qVHJhbnNtaXQgc3RhdGlzdGljcyAqLworCQkJc2VxX3ByaW50ZihzZXEsICJcblRyYW5zbWl0IHN0YXRpc3RpY3NcblxuIik7CisJCQkJCisJCQlzZXFfcHJpbnRmKHNlcSwgIlRyYW5zbWl0ZWQgYnl0ZXMgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0VHhPY3RldHNPa0N0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlRyYW5zbWl0ZWQgcGFja2V0cyAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0VHhPa0N0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlRyYW5zbWl0IGVycm9ycyAgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0VHhTaW5nbGVDb2xsaXNpb25DdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICJUcmFuc21pdCBkcm9wcGVkICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RydWN0LT5UeE5vQnVmQ3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiVHJhbnNtaXQgY29sbGlzaW9ucyAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRUeFNpbmdsZUNvbGxpc2lvbkN0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlRyYW5zbWl0IGVycm9yIHR5cGVzXG4iKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgZXhjZXNzaXZlIGNvbGxpc2lvbiAgICAgICAgICVsZFxuIiwKKwkJCQkgICAgICBwQUMtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgY2FycmllciAgICAgICAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRUeENhcnJpZXJDdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICIgICBmaWZvIHVuZGVycnVuICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFR4Rmlmb1VuZGVycnVuQ3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgaGVhcnRiZWF0ICAgICAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRUeENhcnJpZXJDdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICIgICB3aW5kb3cgICAgICAgICAgICAgICAgICAgICAgJWxkXG4iLAorCQkJCSAgICAgIHBBQy0+c3RhdHMudHhfd2luZG93X2Vycm9ycyk7CisJCQkJCisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgc2tfcHJvY19vcGVuIC0gcmVnaXN0ZXIgdGhlIHNob3cgZnVuY3Rpb24gd2hlbiBwcm9jIGlzIG9wZW4nZWQKKyAqICAKKyAqIERlc2NyaXB0aW9uOgorICogIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGEgc2s5OGxpbiBwcm9jIGZpbGUgaXMgcXVlcmllZC4KKyAqICAKKyAqIFJldHVybnM6IHRoZSByZXR1cm4gdmFsdWUgb2Ygc2luZ2xlX29wZW4oKQorICogICAgICAKKyAqLworc3RhdGljIGludCBza19wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNrX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBFbmQgb2YgZmlsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrcXVldWUuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2txdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzViNGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrcXVldWUuYwpAQCAtMCwwICsxLDE3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrcXVldWUuYworICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgRXZlbnQgU2NoZWR1bGVyIE1vZHVsZQorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjIwICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA5LzE2IDEzOjQ0OjAwICQKKyAqIFB1cnBvc2U6CU1hbmFnZW1lbnQgb2YgYW4gZXZlbnQgcXVldWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKgorICoJRXZlbnQgcXVldWUgYW5kIGRpc3BhdGNoZXIKKyAqLworI2lmIChkZWZpbmVkKERFQlVHKSB8fCAoKCFkZWZpbmVkKExJTlQpKSAmJiAoIWRlZmluZWQoU0tfU0xJTSkpKSkKK3N0YXRpYyBjb25zdCBjaGFyIFN5c0tvbm5lY3RGaWxlSWRbXSA9CisJIkAoIykgJElkOiBza3F1ZXVlLmMsdiAxLjIwIDIwMDMvMDkvMTYgMTM6NDQ6MDAgcnNjaG1pZHQgRXhwICQgKEMpIE1hcnZlbGwuIjsKKyNlbmRpZgorCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgkJLyogRHJpdmVyIFNwZWNpZmljIERlZmluaXRpb25zICovCisjaW5jbHVkZSAiaC9za3F1ZXVlLmgiCQkvKiBRdWV1ZSBEZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImgvc2tkcnYybmQuaCIJCS8qIEFkYXB0ZXIgQ29udHJvbC0gYW5kIERyaXZlciBzcGVjaWZpYyBEZWYuICovCisKKyNpZmRlZiBfX0MyTUFOX18KKy8qCisJRXZlbnQgcXVldWUgbWFuYWdlbWVudC4KKworCUdlbmVyYWwgRGVzY3JpcHRpb246CisKKyAqLworaW50cm8oKQore30KKyNlbmRpZgorCisjZGVmaW5lIFBSSU5URihhLGIsYykKKworLyoKKyAqIGluaXQgZXZlbnQgcXVldWUgbWFuYWdlbWVudAorICoKKyAqIE11c3QgYmUgY2FsbGVkIGR1cmluZyBpbml0IGxldmVsIDAuCisgKi8KK3ZvaWQJU2tFdmVudEluaXQoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb2MsCS8qIElPIGNvbnRleHQgKi8KK2ludAkJTGV2ZWwpCS8qIEluaXQgbGV2ZWwgKi8KK3sKKwlzd2l0Y2ggKExldmVsKSB7CisJY2FzZSBTS19JTklUX0RBVEE6CisJCXBBQy0+RXZlbnQuRXZQdXQgPSBwQUMtPkV2ZW50LkV2R2V0ID0gcEFDLT5FdmVudC5FdlF1ZXVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBhZGQgZXZlbnQgdG8gcXVldWUKKyAqLwordm9pZAlTa0V2ZW50UXVldWUoCitTS19BQwkJKnBBQywJLyogQWRhcHRlcnMgY29udGV4dCAqLworU0tfVTMyCQlDbGFzcywJLyogRXZlbnQgQ2xhc3MgKi8KK1NLX1UzMgkJRXZlbnQsCS8qIEV2ZW50IHRvIGJlIHF1ZXVlZCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIEV2ZW50IHBhcmFtZXRlciAqLworeworCXBBQy0+RXZlbnQuRXZQdXQtPkNsYXNzID0gQ2xhc3M7CisJcEFDLT5FdmVudC5FdlB1dC0+RXZlbnQgPSBFdmVudDsKKwlwQUMtPkV2ZW50LkV2UHV0LT5QYXJhID0gUGFyYTsKKwkKKwlpZiAoKytwQUMtPkV2ZW50LkV2UHV0ID09ICZwQUMtPkV2ZW50LkV2UXVldWVbU0tfTUFYX0VWRU5UXSkKKwkJcEFDLT5FdmVudC5FdlB1dCA9IHBBQy0+RXZlbnQuRXZRdWV1ZTsKKworCWlmIChwQUMtPkV2ZW50LkV2UHV0ID09IHBBQy0+RXZlbnQuRXZHZXQpIHsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX05PUkVTLCBTS0VSUl9RX0UwMDEsIFNLRVJSX1FfRTAwMU1TRyk7CisJfQorfQorCisvKgorICogZXZlbnQgZGlzcGF0Y2hlcgorICoJd2hpbGUgZXZlbnQgcXVldWUgaXMgbm90IGVtcHR5CisgKgkJZ2V0IGV2ZW50IGZyb20gcXVldWUKKyAqCQlzZW5kIGNvbW1hbmQgdG8gc3RhdGUgbWFjaGluZQorICoJZW5kCisgKglyZXR1cm4gZXJyb3IgcmVwb3J0ZWQgYnkgaW5kaXZpZHVhbCBFdmVudCBmdW5jdGlvbgorICoJCTAgaWYgbm8gZXJyb3Igb2NjdXJlZC4KKyAqLworaW50CVNrRXZlbnREaXNwYXRjaGVyKAorU0tfQUMJKnBBQywJLyogQWRhcHRlcnMgQ29udGV4dCAqLworU0tfSU9DCUlvYykJLyogSW8gY29udGV4dCAqLworeworCVNLX0VWRU5URUxFTQkqcEV2OwkvKiBwb2ludGVyIGludG8gcXVldWUgKi8KKwlTS19VMzIJCQlDbGFzczsKKwlpbnQJCQlSdHY7CisKKwlwRXYgPSBwQUMtPkV2ZW50LkV2R2V0OworCQorCVBSSU5URigiZGlzcGF0Y2ggZ2V0ICV4IHB1dCAleFxuIiwgcEV2LCBwQUMtPkV2ZW50LmV2X3B1dCk7CisJCisJd2hpbGUgKHBFdiAhPSBwQUMtPkV2ZW50LkV2UHV0KSB7CisJCVBSSU5URigiZGlzcGF0Y2ggQ2xhc3MgJWQgRXZlbnQgJWRcbiIsIHBFdi0+Q2xhc3MsIHBFdi0+RXZlbnQpOworCisJCXN3aXRjaCAoQ2xhc3MgPSBwRXYtPkNsYXNzKSB7CisjaWZuZGVmIFNLX1VTRV9MQUNfRVYKKyNpZm5kZWYgU0tfU0xJTQorCQljYXNlIFNLR0VfUkxNVDoJCS8qIFJMTVQgRXZlbnQgKi8KKwkJCVJ0diA9IFNrUmxtdEV2ZW50KHBBQywgSW9jLCBwRXYtPkV2ZW50LCBwRXYtPlBhcmEpOworCQkJYnJlYWs7CisJCWNhc2UgU0tHRV9JMkM6CQkvKiBJMkMgRXZlbnQgKi8KKwkJCVJ0diA9IFNrSTJjRXZlbnQocEFDLCBJb2MsIHBFdi0+RXZlbnQsIHBFdi0+UGFyYSk7CisJCQlicmVhazsKKwkJY2FzZSBTS0dFX1BOTUk6CQkvKiBQTk1JIEV2ZW50ICovCisJCQlSdHYgPSBTa1BubWlFdmVudChwQUMsIElvYywgcEV2LT5FdmVudCwgcEV2LT5QYXJhKTsKKwkJCWJyZWFrOworI2VuZGlmCS8qIG5vdCBTS19TTElNICovCisjZW5kaWYJLyogbm90IFNLX1VTRV9MQUNfRVYgKi8KKwkJY2FzZSBTS0dFX0RSVjoJCS8qIERyaXZlciBFdmVudCAqLworCQkJUnR2ID0gU2tEcnZFdmVudChwQUMsIElvYywgcEV2LT5FdmVudCwgcEV2LT5QYXJhKTsKKwkJCWJyZWFrOworI2lmbmRlZiBTS19VU0VfU1dfVElNRVIKKwkJY2FzZSBTS0dFX0hXQUM6CisJCQlSdHYgPSBTa0dlU2lycUV2ZW50KHBBQywgSW9jLCBwRXYtPkV2ZW50LCBwRXYtPlBhcmEpOworCQkJYnJlYWs7CisjZWxzZSAvKiAhU0tfVVNFX1NXX1RJTUVSICovCisgICAgICAgIGNhc2UgU0tHRV9TV1QgOgorCQkJUnR2ID0gU2tTd3RFdmVudChwQUMsIElvYywgcEV2LT5FdmVudCwgcEV2LT5QYXJhKTsKKwkJCWJyZWFrOworI2VuZGlmIC8qICFTS19VU0VfU1dfVElNRVIgKi8KKyNpZmRlZiBTS19VU0VfTEFDX0VWCisJCWNhc2UgU0tHRV9MQUNQIDoKKwkJCVJ0diA9IFNrTGFjcEV2ZW50KHBBQywgSW9jLCBwRXYtPkV2ZW50LCBwRXYtPlBhcmEpOworCQkJYnJlYWs7CisJCWNhc2UgU0tHRV9SU0YgOgorCQkJUnR2ID0gU2tSc2ZFdmVudChwQUMsIElvYywgcEV2LT5FdmVudCwgcEV2LT5QYXJhKTsKKwkJCWJyZWFrOworCQljYXNlIFNLR0VfTUFSS0VSIDoKKwkJCVJ0diA9IFNrTWFya2VyRXZlbnQocEFDLCBJb2MsIHBFdi0+RXZlbnQsIHBFdi0+UGFyYSk7CisJCQlicmVhazsKKwkJY2FzZSBTS0dFX0ZEIDoKKwkJCVJ0diA9IFNrRmRFdmVudChwQUMsIElvYywgcEV2LT5FdmVudCwgcEV2LT5QYXJhKTsKKwkJCWJyZWFrOworI2VuZGlmIC8qIFNLX1VTRV9MQUNfRVYgKi8KKyNpZmRlZglTS19VU0VfQ1NVTQorCQljYXNlIFNLR0VfQ1NVTSA6CisJCQlSdHYgPSBTa0NzRXZlbnQocEFDLCBJb2MsIHBFdi0+RXZlbnQsIHBFdi0+UGFyYSk7CisJCQlicmVhazsKKyNlbmRpZgkvKiBTS19VU0VfQ1NVTSAqLworCQlkZWZhdWx0IDoKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfUV9FMDAyLCBTS0VSUl9RX0UwMDJNU0cpOworCQkJUnR2ID0gMDsKKwkJfQorCisJCWlmIChSdHYgIT0gMCkgeworCQkJcmV0dXJuKFJ0dik7CisJCX0KKworCQlpZiAoKytwRXYgPT0gJnBBQy0+RXZlbnQuRXZRdWV1ZVtTS19NQVhfRVZFTlRdKQorCQkJcEV2ID0gcEFDLT5FdmVudC5FdlF1ZXVlOworCisJCS8qIFJlbmV3IGdldDogaXQgaXMgdXNlZCBpbiBxdWV1ZV9ldmVudHMgdG8gZGV0ZWN0IG92ZXJydW5zICovCisJCXBBQy0+RXZlbnQuRXZHZXQgPSBwRXY7CisJfQorCisJcmV0dXJuKDApOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za3JsbXQuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tybG10LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhMTFhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tybG10LmMKQEAgLTAsMCArMSwzMjU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tybG10LmMKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS42OSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wNC8xNSAwOTozOToyMiAkCisgKiBQdXJwb3NlOglNYW5hZ2UgbGlua3Mgb24gU0stTkVUIEFkYXB0ZXJzLCBlc3AuIHJlZHVuZGFudCBvbmVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBUaGlzIG1vZHVsZSBjb250YWlucyBjb2RlIGZvciBMaW5rIE1hbmFnZW1lblQgKExNVCkgb2YgU0stTkVUIEFkYXB0ZXJzLgorICogSXQgaXMgbWFpbmx5IGludGVuZGVkIGZvciBhZGFwdGVycyB3aXRoIG1vcmUgdGhhbiBvbmUgbGluay4KKyAqIEZvciBzdWNoIGFkYXB0ZXJzLCB0aGlzIG1vZHVsZSByZWFsaXplcyBSZWR1bmRhbnQgTGluayBNYW5hZ2VtZW5UIChSTE1UKS4KKyAqCisgKiBJbmNsdWRlIEZpbGUgSGllcmFyY2h5OgorICoKKyAqCSJza2RydjFzdC5oIgorICoJInNrZHJ2Mm5kLmgiCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpICRJZDogc2tybG10LmMsdiAxLjY5IDIwMDMvMDQvMTUgMDk6Mzk6MjIgdHNjaGlsbGkgRXhwICQgKEMpIE1hcnZlbGwuIjsKKyNlbmRpZgkvKiAhZGVmaW5lZChsaW50KSAqLworCisjZGVmaW5lIF9fU0tSTE1UX0MKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgkvKiBjcGx1c3BsdXMgKi8KKworI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIKKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCisKKy8qIGRlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0tfSFdBQ19MSU5LX0xFRAorI2RlZmluZSBTS19IV0FDX0xJTktfTEVEKGEsYixjLGQpCisjZW5kaWYJLyogIWRlZmluZWQoU0tfSFdBQ19MSU5LX0xFRCkgKi8KKworI2lmbmRlZiBERUJVRworI2RlZmluZSBSTE1UX1NUQVRJQwlzdGF0aWMKKyNlbHNlCS8qIERFQlVHICovCisjZGVmaW5lIFJMTVRfU1RBVElDCisKKyNpZm5kZWYgU0tfTElUVExFX0VORElBTgorLyogRmlyc3QgMzIgYml0cyAqLworI2RlZmluZSBPRkZTX0xPMzIJMQorCisvKiBTZWNvbmQgMzIgYml0cyAqLworI2RlZmluZSBPRkZTX0hJMzIJMAorI2Vsc2UJLyogU0tfTElUVExFX0VORElBTiAqLworLyogRmlyc3QgMzIgYml0cyAqLworI2RlZmluZSBPRkZTX0xPMzIJMAorCisvKiBTZWNvbmQgMzIgYml0cyAqLworI2RlZmluZSBPRkZTX0hJMzIJMQorI2VuZGlmCS8qIFNLX0xJVFRMRV9FTkRJQU4gKi8KKworI2VuZGlmCS8qIERFQlVHICovCisKKy8qIC0tLS0tIFByaXZhdGUgdGltZW91dCB2YWx1ZXMgLS0tLS0gKi8KKworI2RlZmluZSBTS19STE1UX01JTl9UT19WQUwJCQkgICAxMjUwMDAJLyogMS84IHNlYy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9ERUZfVE9fVkFMCQkJICAxMDAwMDAwCS8qIDEgc2VjLiAqLworI2RlZmluZSBTS19STE1UX1BPUlRET1dOX1RJTV9WQUwJICAgOTAwMDAwCS8qIGFub3RoZXIgMC45IHNlYy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QT1JUU1RBUlRfVElNX1ZBTAkgICAxMDAwMDAJLyogMC4xIHNlYy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QT1JUVVBfVElNX1ZBTAkJICAyNTAwMDAwCS8qIDIuNSBzZWMuICovCisjZGVmaW5lIFNLX1JMTVRfU0VHX1RPX1ZBTAkJCTkwMDAwMDAwMAkvKiAxNSBtaW4uICovCisKKy8qIEFzc3VtZSB0aWNrIGNvdW50ZXIgaW5jcmVtZW50IGlzIDEgLSBtYXkgYmUgc2V0IE9TLWRlcGVuZGVudC4gKi8KKyNpZm5kZWYgU0tfVElDS19JTkNSCisjZGVmaW5lIFNLX1RJQ0tfSU5DUglTS19DT05TVFU2NCgxKQorI2VuZGlmCS8qICFkZWZpbmVkKFNLX1RJQ0tfSU5DUikgKi8KKworLyoKKyAqIEFtb3VudCB0aGF0IGEgdGltZSBzdGFtcCBtdXN0IGJlIGxhdGVyIHRvIGJlIHJlY29nbml6ZWQgYXMgInN1YnN0YW50aWFsbHkKKyAqIGxhdGVyIi4gVGhpcyBpcyBhYm91dCAxLzEyOCBzZWMsIGJ1dCBhYm92ZSAxIHRpY2sgY291bnRlciBpbmNyZW1lbnQuCisgKi8KKyNkZWZpbmUgU0tfUkxNVF9CQ19ERUxUQQkJKDEgKyAoKFNLX1RJQ0tTX1BFUl9TRUMgPj4gNykgPiBTS19USUNLX0lOQ1IgPyBcCisJCQkJCQkJCQkoU0tfVElDS1NfUEVSX1NFQyA+PiA3KSA6IFNLX1RJQ0tfSU5DUikpCisKKy8qIC0tLS0tIFByaXZhdGUgUkxNVCBkZWZhdWx0cyAtLS0tLSAqLworCisjZGVmaW5lIFNLX1JMTVRfREVGX1BSRUZfUE9SVAkwCQkJCQkvKiAiTG93ZXIiIHBvcnQuICovCisjZGVmaW5lIFNLX1JMTVRfREVGX01PREUgCQlTS19STE1UX0NIRUNLX0xJTksJLyogRGVmYXVsdCBSTE1UIE1vZGUuICovCisKKy8qIC0tLS0tIFByaXZhdGUgUkxNVCBjaGVja2luZyBzdGF0ZXMgLS0tLS0gKi8KKworI2RlZmluZSBTS19STE1UX1JDU19TRUcJCQkxCQkvKiBSTE1UIENoZWNrIFN0YXRlOiBjaGVjayBzZWcuICovCisjZGVmaW5lIFNLX1JMTVRfUkNTX1NUQVJUX1NFRwkyCQkvKiBSTE1UIENoZWNrIFN0YXRlOiBzdGFydCBjaGVjayBzZWcuICovCisjZGVmaW5lIFNLX1JMTVRfUkNTX1NFTkRfU0VHCTQJCS8qIFJMTVQgQ2hlY2sgU3RhdGU6IHNlbmQgQlBEVSBwYWNrZXQgKi8KKyNkZWZpbmUgU0tfUkxNVF9SQ1NfUkVQT1JUX1NFRwk4CQkvKiBSTE1UIENoZWNrIFN0YXRlOiByZXBvcnQgc2VnLiAqLworCisvKiAtLS0tLSBQcml2YXRlIFBPUlQgY2hlY2tpbmcgc3RhdGVzIC0tLS0tICovCisKKyNkZWZpbmUgU0tfUkxNVF9QQ1NfVFgJCQkxCQkvKiBQb3J0IENoZWNrIFN0YXRlOiBjaGVjayB0eC4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QQ1NfUlgJCQkyCQkvKiBQb3J0IENoZWNrIFN0YXRlOiBjaGVjayByeC4gKi8KKworLyogLS0tLS0gUHJpdmF0ZSBQT1JUIGV2ZW50cyAtLS0tLSAqLworCisvKiBOb3RlOiBVcGRhdGUgc2ltdWxhdGlvbiB3aGVuIGNoYW5naW5nIHRoZXNlLiAqLworI2RlZmluZSBTS19STE1UX1BPUlRTVEFSVF9USU0JMTEwMAkvKiBQb3J0IHN0YXJ0IHRpbWVvdXQuICovCisjZGVmaW5lIFNLX1JMTVRfUE9SVFVQX1RJTQkJMTEwMQkvKiBQb3J0IGNhbiBub3cgZ28gdXAuICovCisjZGVmaW5lIFNLX1JMTVRfUE9SVERPV05fUlhfVElNCTExMDIJLyogUG9ydCBkaWQgbm90IHJlY2VpdmUgb25jZSAuLi4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QT1JURE9XTgkJMTEwMwkvKiBQb3J0IHdlbnQgZG93bi4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QT1JURE9XTl9UWF9USU0JMTEwNAkvKiBQYXJ0bmVyIGRpZCBub3QgcmVjZWl2ZSAuLi4gKi8KKworLyogLS0tLS0gUHJpdmF0ZSBSTE1UIGV2ZW50cyAtLS0tLSAqLworCisvKiBOb3RlOiBVcGRhdGUgc2ltdWxhdGlvbiB3aGVuIGNoYW5naW5nIHRoZXNlLiAqLworI2RlZmluZSBTS19STE1UX1RJTQkJCQkyMTAwCS8qIFJMTVQgdGltZW91dC4gKi8KKyNkZWZpbmUgU0tfUkxNVF9TRUdfVElNCQkJMjEwMQkvKiBSTE1UIHNlZ21lbnRhdGlvbiBjaGVjayB0aW1lb3V0LiAqLworCisjZGVmaW5lIFRPX1NIT1JURU4odGltKQkoKHRpbSkgLyAyKQorCisvKiBFcnJvciBudW1iZXJzIGFuZCBtZXNzYWdlcy4gKi8KKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDAxCQkoU0tfRVJSQkFTRV9STE1UICsgMCkKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDAxX01TRwkiTm8gUGFja2V0LiIKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDAyCQkoU0tFUlJfUkxNVF9FMDAxICsgMSkKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDAyX01TRwkiU2hvcnQgUGFja2V0LiIKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDAzCQkoU0tFUlJfUkxNVF9FMDAyICsgMSkKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDAzX01TRwkiVW5rbm93biBSTE1UIGV2ZW50LiIKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDA0CQkoU0tFUlJfUkxNVF9FMDAzICsgMSkKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDA0X01TRwkiUG9ydHNVcCBpbmNvcnJlY3QuIgorI2RlZmluZSBTS0VSUl9STE1UX0UwMDUJCShTS0VSUl9STE1UX0UwMDQgKyAxKQorI2RlZmluZSBTS0VSUl9STE1UX0UwMDVfTVNHCVwKKyAiTmV0IHNlZW1zIHRvIGJlIHNlZ21lbnRlZCAoZGlmZmVyZW50IHJvb3QgYnJpZGdlcyBhcmUgcmVwb3J0ZWQgb24gdGhlIHBvcnRzKS4iCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwNgkJKFNLRVJSX1JMTVRfRTAwNSArIDEpCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwNl9NU0cJIkR1cGxpY2F0ZSBNQUMgQWRkcmVzcyBkZXRlY3RlZC4iCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwNwkJKFNLRVJSX1JMTVRfRTAwNiArIDEpCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwN19NU0cJIkxpbmtzVXAgaW5jb3JyZWN0LiIKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDA4CQkoU0tFUlJfUkxNVF9FMDA3ICsgMSkKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDA4X01TRwkiUG9ydCBub3Qgc3RhcnRlZCBidXQgbGluayBjYW1lIHVwLiIKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDA5CQkoU0tFUlJfUkxNVF9FMDA4ICsgMSkKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDA5X01TRwkiQ29ycmVjdGVkIGlsbGVnYWwgc2V0dGluZyBvZiBQcmVmZXJyZWQgUG9ydC4iCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAxMAkJKFNLRVJSX1JMTVRfRTAwOSArIDEpCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAxMF9NU0cJIklnbm9yZWQgaWxsZWdhbCBQcmVmZXJyZWQgUG9ydC4iCisKKy8qIExMQyBmaWVsZCB2YWx1ZXMuICovCisjZGVmaW5lIExMQ19DT01NQU5EX1JFU1BPTlNFX0JJVAkJMQorI2RlZmluZSBMTENfVEVTVF9DT01NQU5ECQkJCTB4RTMKKyNkZWZpbmUgTExDX1VJCQkJCQkJCTB4MDMKKworLyogUkxNVCBQYWNrZXQgZmllbGRzLiAqLworI2RlZmluZQlTS19STE1UX0RTQVAJCQkJCTAKKyNkZWZpbmUJU0tfUkxNVF9TU0FQCQkJCQkwCisjZGVmaW5lIFNLX1JMTVRfQ1RSTAkJCQkJKExMQ19URVNUX0NPTU1BTkQpCisjZGVmaW5lIFNLX1JMTVRfSU5ESUNBVE9SMAkJCQkweDUzCS8qIFMgKi8KKyNkZWZpbmUgU0tfUkxNVF9JTkRJQ0FUT1IxCQkJCTB4NEIJLyogSyAqLworI2RlZmluZSBTS19STE1UX0lORElDQVRPUjIJCQkJMHgyRAkvKiAtICovCisjZGVmaW5lIFNLX1JMTVRfSU5ESUNBVE9SMwkJCQkweDUyCS8qIFIgKi8KKyNkZWZpbmUgU0tfUkxNVF9JTkRJQ0FUT1I0CQkJCTB4NEMJLyogTCAqLworI2RlZmluZSBTS19STE1UX0lORElDQVRPUjUJCQkJMHg0RAkvKiBNICovCisjZGVmaW5lIFNLX1JMTVRfSU5ESUNBVE9SNgkJCQkweDU0CS8qIFQgKi8KKyNkZWZpbmUgU0tfUkxNVF9QQUNLRVRfVkVSU0lPTgkJCTAKKworLyogUkxNVCBTUFQgRmxhZyB2YWx1ZXMuICovCisjZGVmaW5lCVNLX1JMTVRfU1BUX0ZMQUdfQ0hBTkdFCQkJMHgwMQorI2RlZmluZQlTS19STE1UX1NQVF9GTEFHX0NIQU5HRV9BQ0sJCTB4ODAKKworLyogUkxNVCBTUFQgUGFja2V0IGZpZWxkcy4gKi8KKyNkZWZpbmUJU0tfUkxNVF9TUFRfRFNBUAkJCQkweDQyCisjZGVmaW5lCVNLX1JMTVRfU1BUX1NTQVAJCQkJMHg0MgorI2RlZmluZSBTS19STE1UX1NQVF9DVFJMCQkJCShMTENfVUkpCisjZGVmaW5lCVNLX1JMTVRfU1BUX1BST1RPQ09MX0lEMAkJMHgwMAorI2RlZmluZQlTS19STE1UX1NQVF9QUk9UT0NPTF9JRDEJCTB4MDAKKyNkZWZpbmUJU0tfUkxNVF9TUFRfUFJPVE9DT0xfVkVSU0lPTl9JRAkweDAwCisjZGVmaW5lCVNLX1JMTVRfU1BUX0JQRFVfVFlQRQkJCTB4MDAKKyNkZWZpbmUJU0tfUkxNVF9TUFRfRkxBR1MJCQkJMHgwMAkvKiA/PyAqLworI2RlZmluZQlTS19STE1UX1NQVF9ST09UX0lEMAkJCTB4RkYJLyogTG93ZXN0IHBvc3NpYmxlIHByaW9yaXR5LiAqLworI2RlZmluZQlTS19STE1UX1NQVF9ST09UX0lEMQkJCTB4RkYJLyogTG93ZXN0IHBvc3NpYmxlIHByaW9yaXR5LiAqLworCisvKiBSZW1haW5pbmcgNiBieXRlcyB3aWxsIGJlIHRoZSBjdXJyZW50IHBvcnQgYWRkcmVzcy4gKi8KKyNkZWZpbmUJU0tfUkxNVF9TUFRfUk9PVF9QQVRIX0NPU1QwCQkweDAwCisjZGVmaW5lCVNLX1JMTVRfU1BUX1JPT1RfUEFUSF9DT1NUMQkJMHgwMAorI2RlZmluZQlTS19STE1UX1NQVF9ST09UX1BBVEhfQ09TVDIJCTB4MDAKKyNkZWZpbmUJU0tfUkxNVF9TUFRfUk9PVF9QQVRIX0NPU1QzCQkweDAwCisjZGVmaW5lCVNLX1JMTVRfU1BUX0JSSURHRV9JRDAJCQkweEZGCS8qIExvd2VzdCBwb3NzaWJsZSBwcmlvcml0eS4gKi8KKyNkZWZpbmUJU0tfUkxNVF9TUFRfQlJJREdFX0lEMQkJCTB4RkYJLyogTG93ZXN0IHBvc3NpYmxlIHByaW9yaXR5LiAqLworCisvKiBSZW1haW5pbmcgNiBieXRlcyB3aWxsIGJlIHRoZSBjdXJyZW50IHBvcnQgYWRkcmVzcy4gKi8KKyNkZWZpbmUJU0tfUkxNVF9TUFRfUE9SVF9JRDAJCQkweEZGCS8qIExvd2VzdCBwb3NzaWJsZSBwcmlvcml0eS4gKi8KKyNkZWZpbmUJU0tfUkxNVF9TUFRfUE9SVF9JRDEJCQkweEZGCS8qIExvd2VzdCBwb3NzaWJsZSBwcmlvcml0eS4gKi8KKyNkZWZpbmUJU0tfUkxNVF9TUFRfTVNHX0FHRTAJCQkweDAwCisjZGVmaW5lCVNLX1JMTVRfU1BUX01TR19BR0UxCQkJMHgwMAorI2RlZmluZQlTS19STE1UX1NQVF9NQVhfQUdFMAkJCTB4MDAKKyNkZWZpbmUJU0tfUkxNVF9TUFRfTUFYX0FHRTEJCQkweEZGCisjZGVmaW5lCVNLX1JMTVRfU1BUX0hFTExPX1RJTUUwCQkJMHgwMAorI2RlZmluZQlTS19STE1UX1NQVF9IRUxMT19USU1FMQkJCTB4RkYKKyNkZWZpbmUJU0tfUkxNVF9TUFRfRldEX0RFTEFZMAkJCTB4MDAKKyNkZWZpbmUJU0tfUkxNVF9TUFRfRldEX0RFTEFZMQkJCTB4NDAKKworLyogU2l6ZSBkZWZpbmVzLiAqLworI2RlZmluZSBTS19STE1UX01JTl9QQUNLRVRfU0laRQkJCTM0CisjZGVmaW5lIFNLX1JMTVRfTUFYX1BBQ0tFVF9TSVpFCQkJKFNLX1JMTVRfTUFYX1RYX0JVRl9TSVpFKQorI2RlZmluZSBTS19QQUNLRVRfREFUQV9MRU4JCQkJKFNLX1JMTVRfTUFYX1BBQ0tFVF9TSVpFIC0gXAorCQkJCQkJCQkJCVNLX1JMTVRfTUlOX1BBQ0tFVF9TSVpFKQorCisvKiAtLS0tLSBSTE1UIHBhY2tldCB0eXBlcyAtLS0tLSAqLworI2RlZmluZSBTS19QQUNLRVRfQU5OT1VOQ0UJCQkJMQkvKiBQb3J0IGFubm91bmNlbWVudC4gKi8KKyNkZWZpbmUgU0tfUEFDS0VUX0FMSVZFCQkJCQkyCS8qIEFsaXZlIHBhY2tldCB0byBwb3J0LiAqLworI2RlZmluZSBTS19QQUNLRVRfQUREUl9DSEFOR0VECQkJMwkvKiBQb3J0IGFkZHJlc3MgY2hhbmdlZC4gKi8KKyNkZWZpbmUgU0tfUEFDS0VUX0NIRUNLX1RYCQkJCTQJLyogQ2hlY2sgeW91ciB0eCBsaW5lLiAqLworCisjaWZkZWYgU0tfTElUVExFX0VORElBTgorI2RlZmluZSBTS19VMTZfVE9fTkVUV09SS19PUkRFUihWYWwsQWRkcikgeyBcCisJU0tfVTgJKl9BZGRyID0gKFNLX1U4KikoQWRkcik7IFwKKwlTS19VMTYJX1ZhbCA9IChTS19VMTYpKFZhbCk7IFwKKwkqX0FkZHIrKyA9IChTS19VOCkoX1ZhbCA+PiA4KTsgXAorCSpfQWRkciA9IChTS19VOCkoX1ZhbCAmIDB4RkYpOyBcCit9CisjZW5kaWYJLyogU0tfTElUVExFX0VORElBTiAqLworCisjaWZkZWYgU0tfQklHX0VORElBTgorI2RlZmluZSBTS19VMTZfVE9fTkVUV09SS19PUkRFUihWYWwsQWRkcikgKCooU0tfVTE2KikoQWRkcikgPSAoU0tfVTE2KShWYWwpKQorI2VuZGlmCS8qIFNLX0JJR19FTkRJQU4gKi8KKworI2RlZmluZSBBVVRPTkVHX0ZBSUxFRAlTS19GQUxTRQorI2RlZmluZSBBVVRPTkVHX1NVQ0NFU1MJU0tfVFJVRQorCisKKy8qIHR5cGVkZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJMTVQgcGFja2V0LiAgTGVuZ3RoOiBTS19STE1UX01BWF9QQUNLRVRfU0laRSAoNjApIGJ5dGVzLiAqLwordHlwZWRlZiBzdHJ1Y3Qgc19SbG10UGFja2V0IHsKKwlTS19VOAlEc3RBZGRyW1NLX01BQ19BRERSX0xFTl07CisJU0tfVTgJU3JjQWRkcltTS19NQUNfQUREUl9MRU5dOworCVNLX1U4CVR5cGVMZW5bMl07CisJU0tfVTgJRFNhcDsKKwlTS19VOAlTU2FwOworCVNLX1U4CUN0cmw7CisJU0tfVTgJSW5kaWNhdG9yWzddOworCVNLX1U4CVJsbXRQYWNrZXRUeXBlWzJdOworCVNLX1U4CUFsaWduMVsyXTsKKwlTS19VOAlSYW5kb21bNF07CQkJCS8qIFJhbmRvbSB2YWx1ZSBvZiByZXF1ZXN0aW5nKCEpIHN0YXRpb24uICovCisJU0tfVTgJUmxtdFBhY2tldFZlcnNpb25bMl07CS8qIFJMTVQgUGFja2V0IHZlcnNpb24uICovCisJU0tfVTgJRGF0YVtTS19QQUNLRVRfREFUQV9MRU5dOworfSBTS19STE1UX1BBQ0tFVDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19TcFRyZWVSbG10UGFja2V0IHsKKwlTS19VOAlEc3RBZGRyW1NLX01BQ19BRERSX0xFTl07CisJU0tfVTgJU3JjQWRkcltTS19NQUNfQUREUl9MRU5dOworCVNLX1U4CVR5cGVMZW5bMl07CisJU0tfVTgJRFNhcDsKKwlTS19VOAlTU2FwOworCVNLX1U4CUN0cmw7CisJU0tfVTgJUHJvdG9jb2xJZFsyXTsKKwlTS19VOAlQcm90b2NvbFZlcnNpb25JZDsKKwlTS19VOAlCcGR1VHlwZTsKKwlTS19VOAlGbGFnczsKKwlTS19VOAlSb290SWRbOF07CisJU0tfVTgJUm9vdFBhdGhDb3N0WzRdOworCVNLX1U4CUJyaWRnZUlkWzhdOworCVNLX1U4CVBvcnRJZFsyXTsKKwlTS19VOAlNZXNzYWdlQWdlWzJdOworCVNLX1U4CU1heEFnZVsyXTsKKwlTS19VOAlIZWxsb1RpbWVbMl07CisJU0tfVTgJRm9yd2FyZERlbGF5WzJdOworfSBTS19TUFRSRUVfUEFDS0VUOworCisvKiBnbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitTS19NQUNfQUREUglTa1JsbXRNY0FkZHIgPQl7ezB4MDEsICAweDAwLCAgMHg1QSwgIDB4NTIsICAweDRDLCAgMHg0RH19OworU0tfTUFDX0FERFIJQnJpZGdlTWNBZGRyID0Je3sweDAxLCAgMHg4MCwgIDB4QzIsICAweDAwLCAgMHgwMCwgIDB4MDB9fTsKK1NLX01BQ19BRERSCUJjQWRkciA9IAkJe3sweEZGLCAgMHhGRiwgIDB4RkYsICAweEZGLCAgMHhGRiwgIDB4RkZ9fTsKKworLyogbG9jYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTm9uZS4gKi8KKworLyogZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRDaGVja1N3aXRjaCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJU0tfVTMyCU5ldElkeCk7CitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdENoZWNrU2VnKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJTmV0SWR4KTsKK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0U2V0TmV0cygKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwlTS19FVlBBUkEJUGFyYSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRJbml0IC0gaW5pdGlhbGl6ZSBkYXRhLCBzZXQgc3RhdGUgdG8gaW5pdAorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqCVNLX0lOSVRfREFUQQorICoJPT09PT09PT09PT09CisgKgorICoJVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGFsbCBSTE1ULXJlbGF0ZWQgdmFyaWFibGVzIHRvIGEga25vd24gc3RhdGUuCisgKglUaGUgaW5pdGlhbCBzdGF0ZSBpcyBTS19STE1UX1JTX0lOSVQuCisgKglBbGwgcG9ydHMgYXJlIGluaXRpYWxpemVkIHRvIFNLX1JMTVRfUFNfSU5JVC4KKyAqCisgKgorICoJU0tfSU5JVF9JTworICoJPT09PT09PT09PQorICoKKyAqCU5vdGhpbmcuCisgKgorICoKKyAqCVNLX0lOSVRfUlVOCisgKgk9PT09PT09PT09PQorICoKKyAqCURldGVybWluZSB0aGUgYWRhcHRlcidzIHJhbmRvbSB2YWx1ZS4KKyAqCVNldCB0aGUgaHcgcmVnaXN0ZXJzLCB0aGUgImxvZ2ljYWwgTUFDIGFkZHJlc3MiLCB0aGUKKyAqCVJMTVQgbXVsdGljYXN0IGFkZHJlc3MsIGFuZCBldmVudHVhbGx5IHRoZSBCUERVIG11bHRpY2FzdCBhZGRyZXNzLgorICoKKyAqIENvbnRleHQ6CisgKglpbml0LCBwYWdlYWJsZQorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nLgorICovCit2b2lkCVNrUmxtdEluaXQoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitpbnQJCUxldmVsKQkvKiBJbml0aWFsaXphdGlvbiBMZXZlbCAqLworeworCVNLX1UzMgkJaSwgajsKKwlTS19VNjQJCVJhbmRvbTsKKwlTS19FVlBBUkEJUGFyYTsKKyAgICBTS19NQUNfQUREUgkJVmlydHVhbE1hY0FkZHJlc3M7CisgICAgU0tfTUFDX0FERFIJCVBoeXNpY2FsQU1hY0FkZHJlc3M7CisgICAgU0tfQk9PTAkJVmlydHVhbE1hY0FkZHJlc3NTZXQ7CisgICAgU0tfQk9PTAkJUGh5c2ljYWxBTWFjQWRkcmVzc1NldDsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0lOSVQsCisJCSgiUkxNVCBJbml0IGxldmVsICVkLlxuIiwgTGV2ZWwpKQorCisJc3dpdGNoIChMZXZlbCkgeworCWNhc2UgU0tfSU5JVF9EQVRBOgkvKiBJbml0aWFsaXplIGRhdGEgc3RydWN0dXJlcy4gKi8KKwkJU0tfTUVNU0VUKChjaGFyICopJnBBQy0+UmxtdCwgMCwgc2l6ZW9mKFNLX1JMTVQpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgU0tfTUFYX01BQ1M7IGkrKykgeworCQkJcEFDLT5SbG10LlBvcnRbaV0uUG9ydFN0YXRlID0gU0tfUkxNVF9QU19JTklUOworCQkJcEFDLT5SbG10LlBvcnRbaV0uTGlua0Rvd24gPSBTS19UUlVFOworCQkJcEFDLT5SbG10LlBvcnRbaV0uUG9ydERvd24gPSBTS19UUlVFOworCQkJcEFDLT5SbG10LlBvcnRbaV0uUG9ydFN0YXJ0ZWQgPSBTS19GQUxTRTsKKwkJCXBBQy0+UmxtdC5Qb3J0W2ldLlBvcnROb1J4ID0gU0tfRkFMU0U7CisJCQlwQUMtPlJsbXQuUG9ydFtpXS5Sb290SWRTZXQgPSBTS19GQUxTRTsKKwkJCXBBQy0+UmxtdC5Qb3J0W2ldLlBvcnROdW1iZXIgPSBpOworCQkJcEFDLT5SbG10LlBvcnRbaV0uTmV0ID0gJnBBQy0+UmxtdC5OZXRbMF07CisJCQlwQUMtPlJsbXQuUG9ydFtpXS5BZGRyUG9ydCA9ICZwQUMtPkFkZHIuUG9ydFtpXTsKKwkJfQorCisJCXBBQy0+UmxtdC5OdW1OZXRzID0gMTsKKwkJZm9yIChpID0gMDsgaSA8IFNLX01BWF9ORVRTOyBpKyspIHsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uUmxtdFN0YXRlID0gU0tfUkxNVF9SU19JTklUOworCQkJcEFDLT5SbG10Lk5ldFtpXS5Sb290SWRTZXQgPSBTS19GQUxTRTsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uUHJlZlBvcnQgPSBTS19STE1UX0RFRl9QUkVGX1BPUlQ7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlByZWZlcmVuY2UgPSAweEZGRkZGRkZGOwkgIC8qIEF1dG9tYXRpYy4gKi8KKwkJCS8qIEp1c3QgYXNzdW1pbmcuICovCisJCQlwQUMtPlJsbXQuTmV0W2ldLkFjdGl2ZVBvcnQgPSBwQUMtPlJsbXQuTmV0W2ldLlByZWZQb3J0OworCQkJcEFDLT5SbG10Lk5ldFtpXS5SbG10TW9kZSA9IFNLX1JMTVRfREVGX01PREU7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlRpbWVvdXRWYWx1ZSA9IFNLX1JMTVRfREVGX1RPX1ZBTDsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uTmV0TnVtYmVyID0gaTsKKwkJfQorCisJCXBBQy0+UmxtdC5OZXRbMF0uUG9ydFswXSA9ICZwQUMtPlJsbXQuUG9ydFswXTsKKwkJcEFDLT5SbG10Lk5ldFswXS5Qb3J0WzFdID0gJnBBQy0+UmxtdC5Qb3J0WzFdOworI2lmIFNLX01BWF9ORVRTID4gMQorCQlwQUMtPlJsbXQuTmV0WzFdLlBvcnRbMF0gPSAmcEFDLT5SbG10LlBvcnRbMV07CisjZW5kaWYJLyogU0tfTUFYX05FVFMgPiAxICovCisJCWJyZWFrOworCisJY2FzZSBTS19JTklUX0lPOgkvKiBHSU1hY3NGb3VuZCBmaXJzdCBhdmFpbGFibGUgaGVyZS4gKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfSU5JVCwKKwkJCSgiUkxNVDogJWQgTUFDcyB3ZXJlIGRldGVjdGVkLlxuIiwgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kKSkKKworCQlwQUMtPlJsbXQuTmV0WzBdLk51bVBvcnRzID0gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCisJCS8qIEluaXRpYWxpemUgSFcgcmVnaXN0ZXJzPyAqLworCQlpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDEpIHsKKwkJCVBhcmEuUGFyYTMyWzBdID0gU0tfUkxNVF9NT0RFX0NMUzsKKwkJCVBhcmEuUGFyYTMyWzFdID0gMDsKKwkJCSh2b2lkKVNrUmxtdEV2ZW50KHBBQywgSW9DLCBTS19STE1UX01PREVfQ0hBTkdFLCBQYXJhKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0tfSU5JVF9SVU46CisJCS8qIEVuc3VyZSBSTE1UIGlzIHNldCB0byBvbmUgbmV0LiAqLworCQlpZiAocEFDLT5SbG10Lk51bU5ldHMgPiAxKSB7CisJCQlQYXJhLlBhcmEzMlswXSA9IDE7CisJCQlQYXJhLlBhcmEzMlsxXSA9IC0xOworCQkJU2tSbG10RXZ0U2V0TmV0cyhwQUMsIElvQywgUGFyYSk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgKFNLX1UzMilwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQkJUmFuZG9tID0gU2tPc0dldFRpbWUocEFDKTsKKwkJCSooU0tfVTMyKikmcEFDLT5SbG10LlBvcnRbaV0uUmFuZG9tID0gKihTS19VMzIqKSZSYW5kb207CisKKwkJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJCQlwQUMtPlJsbXQuUG9ydFtpXS5SYW5kb21bal0gXj0gcEFDLT5SbG10LlBvcnRbaV0uQWRkclBvcnQtPgorCQkJCQlDdXJyZW50TWFjQWRkcmVzcy5hW1NLX01BQ19BRERSX0xFTiAtIDEgLSBqXTsKKwkJCX0KKworCQkJKHZvaWQpU2tBZGRyTWNDbGVhcihwQUMsIElvQywgaSwgU0tfQUREUl9QRVJNQU5FTlQgfCBTS19NQ19TV19PTkxZKTsKKwkJCQorCQkJLyogQWRkIFJMTVQgTUMgYWRkcmVzcy4gKi8KKwkJCSh2b2lkKVNrQWRkck1jQWRkKHBBQywgSW9DLCBpLCAmU2tSbG10TWNBZGRyLCBTS19BRERSX1BFUk1BTkVOVCk7CisKKwkJCWlmIChwQUMtPlJsbXQuTmV0WzBdLlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19TRUcpIHsKKwkJCQkvKiBBZGQgQlBEVSBNQyBhZGRyZXNzLiAqLworCQkJCSh2b2lkKVNrQWRkck1jQWRkKHBBQywgSW9DLCBpLCAmQnJpZGdlTWNBZGRyLCBTS19BRERSX1BFUk1BTkVOVCk7CisJCQl9CisKKwkJCSh2b2lkKVNrQWRkck1jVXBkYXRlKHBBQywgSW9DLCBpKTsKKwkJfQorCisgICAgCVZpcnR1YWxNYWNBZGRyZXNzU2V0ID0gU0tfRkFMU0U7CisJCS8qIFJlYWQgdmlydHVhbCBNQUMgYWRkcmVzcyBmcm9tIENvbnRyb2wgUmVnaXN0ZXIgRmlsZS4gKi8KKwkJZm9yIChqID0gMDsgaiA8IFNLX01BQ19BRERSX0xFTjsgaisrKSB7CisJCQkKKyAgICAgICAgICAgIFNLX0lOOChJb0MsIEIyX01BQ18xICsgaiwgJlZpcnR1YWxNYWNBZGRyZXNzLmFbal0pOworICAgICAgICAgICAgVmlydHVhbE1hY0FkZHJlc3NTZXQgfD0gVmlydHVhbE1hY0FkZHJlc3MuYVtqXTsKKwkJfQorICAgIAkKKyAgICAgICAgUGh5c2ljYWxBTWFjQWRkcmVzc1NldCA9IFNLX0ZBTFNFOworCQkvKiBSZWFkIHBoeXNpY2FsIE1BQyBhZGRyZXNzIGZvciBNQUMgQSBmcm9tIENvbnRyb2wgUmVnaXN0ZXIgRmlsZS4gKi8KKwkJZm9yIChqID0gMDsgaiA8IFNLX01BQ19BRERSX0xFTjsgaisrKSB7CisJCQkKKyAgICAgICAgICAgIFNLX0lOOChJb0MsIEIyX01BQ18yICsgaiwgJlBoeXNpY2FsQU1hY0FkZHJlc3MuYVtqXSk7CisgICAgICAgICAgICBQaHlzaWNhbEFNYWNBZGRyZXNzU2V0IHw9IFBoeXNpY2FsQU1hY0FkZHJlc3MuYVtqXTsKKwkJfQorCisgICAgICAgIC8qIGNoZWNrIGlmIHRoZSB0d28gbWFjIGFkZHJlc3NlcyBjb250YWluIHJlYXNvbmFibGUgdmFsdWVzICovCisgICAgICAgIGlmICghVmlydHVhbE1hY0FkZHJlc3NTZXQgfHwgIVBoeXNpY2FsQU1hY0FkZHJlc3NTZXQpIHsKKworICAgICAgICAgICAgcEFDLT5SbG10LlJsbXRPZmYgPSBTS19UUlVFOworICAgICAgICB9CisKKyAgICAgICAgLyogaWYgdGhlIHR3byBtYWMgYWRkcmVzc2VzIGFyZSBlcXVhbCBzd2l0Y2ggb2ZmIHRoZSBSTE1UX1BSRV9MT09LQUhFQUQKKyAgICAgICAgICAgYW5kIHRoZSBSTE1UX0xPT0tBSEVBRCBtYWNyb3MgKi8KKyAgICAgICAgZWxzZSBpZiAoU0tfQUREUl9FUVVBTChQaHlzaWNhbEFNYWNBZGRyZXNzLmEsIFZpcnR1YWxNYWNBZGRyZXNzLmEpKSB7CisKKyAgICAgICAgICAgIHBBQy0+UmxtdC5SbG10T2ZmID0gU0tfVFJVRTsKKyAgICAgICAgfQorCQllbHNlIHsKKwkJCXBBQy0+UmxtdC5SbG10T2ZmID0gU0tfRkFMU0U7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkvKiBlcnJvciAqLworCQlicmVhazsKKwl9CisJcmV0dXJuOworfQkvKiBTa1JsbXRJbml0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEJ1aWxkQ2hlY2tDaGFpbiAtIGJ1aWxkIHRoZSBjaGVjayBjaGFpbgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgbG9jYWwgY2hlY2sgY2hhaW46CisgKgktIEVhY2ggcG9ydCB0aGF0IGlzIHVwIGNoZWNrcyB0aGUgbmV4dCBwb3J0LgorICoJLSBUaGUgbGFzdCBwb3J0IHRoYXQgaXMgdXAgY2hlY2tzIHRoZSBmaXJzdCBwb3J0IHRoYXQgaXMgdXAuCisgKgorICogTm90ZXM6CisgKgktIEN1cnJlbnRseSBvbmx5IGxvY2FsIHBvcnRzIGFyZSBjb25zaWRlcmVkIHdoZW4gYnVpbGRpbmcgdGhlIGNoYWluLgorICoJLSBDdXJyZW50bHkgdGhlIFN1c3BlY3RTdGF0ZSBpcyBqdXN0IHJlc2V0OworICoJICBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gc2F2ZSBpdCAuLi4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRCdWlsZENoZWNrQ2hhaW4oCitTS19BQwkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX1UzMglOZXRJZHgpCS8qIE5ldCBOdW1iZXIgKi8KK3sKKwlTS19VMzIJCQlpOworCVNLX1UzMgkJCU51bU1hY3NVcDsKKwlTS19STE1UX1BPUlQgKglGaXJzdE1hY1VwOworCVNLX1JMTVRfUE9SVCAqCVByZXZNYWNVcDsKKworCUZpcnN0TWFjVXAJPSBOVUxMOworCVByZXZNYWNVcAk9IE5VTEw7CisJCisJaWYgKCEocEFDLT5SbG10Lk5ldFtOZXRJZHhdLlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19MT0NfTElOSykpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBBQy0+UmxtdC5OZXRbaV0uTnVtUG9ydHM7IGkrKykgeworCQkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV0tPlBvcnRzQ2hlY2tlZCA9IDA7CisJCX0KKwkJcmV0dXJuOwkvKiBEb25lLiAqLworCX0KKwkJCQorCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU2tSbG10QnVpbGRDaGVja0NoYWluLlxuIikpCisKKwlOdW1NYWNzVXAgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5OdW1Qb3J0czsgaSsrKSB7CisJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldLT5Qb3J0c0NoZWNrZWQgPSAwOworCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXS0+UG9ydHNTdXNwZWN0ID0gMDsKKwkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV0tPkNoZWNraW5nU3RhdGUgJj0KKwkJCX4oU0tfUkxNVF9QQ1NfUlggfCBTS19STE1UX1BDU19UWCk7CisKKwkJLyoKKwkJICogSWYgbW9yZSB0aGFuIHR3byBsaW5rcyBhcmUgZGV0ZWN0ZWQgd2Ugc2hvdWxkIGNvbnNpZGVyCisJCSAqIGNoZWNraW5nIGF0IGxlYXN0IHR3byBvdGhlciBwb3J0czoKKwkJICogMS4gdGhlIG5leHQgcG9ydCB0aGF0IGlzIG5vdCBMaW5rRG93biBhbmQKKwkJICogMi4gdGhlIG5leHQgcG9ydCB0aGF0IGlzIG5vdCBQb3J0RG93bi4KKwkJICovCisJCWlmICghcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV0tPkxpbmtEb3duKSB7CisJCQlpZiAoTnVtTWFjc1VwID09IDApIHsKKwkJCQlGaXJzdE1hY1VwID0gcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV07CisJCQl9CisJCQllbHNlIHsKKwkJCQlQcmV2TWFjVXAtPlBvcnRDaGVja1sKKwkJCQkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV0tPlBvcnRzQ2hlY2tlZF0uQ2hlY2tBZGRyID0KKwkJCQkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV0tPkFkZHJQb3J0LT5DdXJyZW50TWFjQWRkcmVzczsKKwkJCQlQcmV2TWFjVXAtPlBvcnRDaGVja1sKKwkJCQkJUHJldk1hY1VwLT5Qb3J0c0NoZWNrZWRdLlN1c3BlY3RUeCA9IFNLX0ZBTFNFOworCQkJCVByZXZNYWNVcC0+UG9ydHNDaGVja2VkKys7CisJCQl9CisJCQlQcmV2TWFjVXAgPSBwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXTsKKwkJCU51bU1hY3NVcCsrOworCQl9CisJfQorCisJaWYgKE51bU1hY3NVcCA+IDEpIHsKKwkJUHJldk1hY1VwLT5Qb3J0Q2hlY2tbUHJldk1hY1VwLT5Qb3J0c0NoZWNrZWRdLkNoZWNrQWRkciA9CisJCQlGaXJzdE1hY1VwLT5BZGRyUG9ydC0+Q3VycmVudE1hY0FkZHJlc3M7CisJCVByZXZNYWNVcC0+UG9ydENoZWNrW1ByZXZNYWNVcC0+UG9ydHNDaGVja2VkXS5TdXNwZWN0VHggPQorCQkJU0tfRkFMU0U7CisJCVByZXZNYWNVcC0+UG9ydHNDaGVja2VkKys7CisJfQorCisjaWZkZWYgREVCVUcKKwlmb3IgKGkgPSAwOyBpIDwgcEFDLT5SbG10Lk5ldFtOZXRJZHhdLk51bVBvcnRzOyBpKyspIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiUG9ydCAlZCBjaGVja3MgJWQgb3RoZXIgcG9ydHM6ICUyWC5cbiIsIGksCisJCQkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV0tPlBvcnRzQ2hlY2tlZCwKKwkJCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXS0+UG9ydENoZWNrWzBdLkNoZWNrQWRkci5hWzVdKSkKKwl9CisjZW5kaWYJLyogREVCVUcgKi8KKworCXJldHVybjsKK30JLyogU2tSbG10QnVpbGRDaGVja0NoYWluICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEJ1aWxkUGFja2V0IC0gYnVpbGQgYW4gUkxNVCBwYWNrZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBzZXRzIHVwIGFuIFJMTVQgcGFja2V0LgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJTlVMTCBvciBwb2ludGVyIHRvIFJMTVQgbWJ1ZgorICovCitSTE1UX1NUQVRJQyBTS19NQlVGCSpTa1JsbXRCdWlsZFBhY2tldCgKK1NLX0FDCQkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJCVBvcnROdW1iZXIsCS8qIFNlbmRpbmcgcG9ydCAqLworU0tfVTE2CQlQYWNrZXRUeXBlLAkvKiBSTE1UIHBhY2tldCB0eXBlICovCitTS19NQUNfQUREUgkqU3JjQWRkciwJLyogU291cmNlIGFkZHJlc3MgKi8KK1NLX01BQ19BRERSCSpEZXN0QWRkcikJLyogRGVzdGluYXRpb24gYWRkcmVzcyAqLworeworCWludAkJaTsKKwlTS19VMTYJCUxlbmd0aDsKKwlTS19NQlVGCQkqcE1iOworCVNLX1JMTVRfUEFDS0VUCSpwUGFja2V0OworCisjaWZkZWYgREVCVUcKKwlTS19VOAlDaGVja1NyYyAgPSAwOworCVNLX1U4CUNoZWNrRGVzdCA9IDA7CisJCisJZm9yIChpID0gMDsgaSA8IFNLX01BQ19BRERSX0xFTjsgKytpKSB7CisJCUNoZWNrU3JjICB8PSBTcmNBZGRyLT5hW2ldOworCQlDaGVja0Rlc3QgfD0gRGVzdEFkZHItPmFbaV07CisJfQorCisJaWYgKChDaGVja1NyYyA9PSAwKSB8fCAoQ2hlY2tEZXN0ID09IDApKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0VSUiwKKwkJCSgiU2tSbG10QnVpbGRQYWNrZXQ6IEludmFsaWQgJXMlc2FkZHIuXG4iLAorCQkJIChDaGVja1NyYyA9PSAwID8gIlNyYyIgOiAiIiksIChDaGVja0Rlc3QgPT0gMCA/ICJEZXN0IiA6ICIiKSkpCisJfQorI2VuZGlmCisKKwlpZiAoKHBNYiA9IFNrRHJ2QWxsb2NSbG10TWJ1ZihwQUMsIElvQywgU0tfUkxNVF9NQVhfUEFDS0VUX1NJWkUpKSAhPSBOVUxMKSB7CisJCXBQYWNrZXQgPSAoU0tfUkxNVF9QQUNLRVQqKXBNYi0+cERhdGE7CisJCWZvciAoaSA9IDA7IGkgPCBTS19NQUNfQUREUl9MRU47IGkrKykgeworCQkJcFBhY2tldC0+RHN0QWRkcltpXSA9IERlc3RBZGRyLT5hW2ldOworCQkJcFBhY2tldC0+U3JjQWRkcltpXSA9IFNyY0FkZHItPmFbaV07CisJCX0KKwkJcFBhY2tldC0+RFNhcCA9IFNLX1JMTVRfRFNBUDsKKwkJcFBhY2tldC0+U1NhcCA9IFNLX1JMTVRfU1NBUDsKKwkJcFBhY2tldC0+Q3RybCA9IFNLX1JMTVRfQ1RSTDsKKwkJcFBhY2tldC0+SW5kaWNhdG9yWzBdID0gU0tfUkxNVF9JTkRJQ0FUT1IwOworCQlwUGFja2V0LT5JbmRpY2F0b3JbMV0gPSBTS19STE1UX0lORElDQVRPUjE7CisJCXBQYWNrZXQtPkluZGljYXRvclsyXSA9IFNLX1JMTVRfSU5ESUNBVE9SMjsKKwkJcFBhY2tldC0+SW5kaWNhdG9yWzNdID0gU0tfUkxNVF9JTkRJQ0FUT1IzOworCQlwUGFja2V0LT5JbmRpY2F0b3JbNF0gPSBTS19STE1UX0lORElDQVRPUjQ7CisJCXBQYWNrZXQtPkluZGljYXRvcls1XSA9IFNLX1JMTVRfSU5ESUNBVE9SNTsKKwkJcFBhY2tldC0+SW5kaWNhdG9yWzZdID0gU0tfUkxNVF9JTkRJQ0FUT1I2OworCisJCVNLX1UxNl9UT19ORVRXT1JLX09SREVSKFBhY2tldFR5cGUsICZwUGFja2V0LT5SbG10UGFja2V0VHlwZVswXSk7CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJcFBhY2tldC0+UmFuZG9tW2ldID0gcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uUmFuZG9tW2ldOworCQl9CisJCQorCQlTS19VMTZfVE9fTkVUV09SS19PUkRFUigKKwkJCVNLX1JMTVRfUEFDS0VUX1ZFUlNJT04sICZwUGFja2V0LT5SbG10UGFja2V0VmVyc2lvblswXSk7CisKKwkJZm9yIChpID0gMDsgaSA8IFNLX1BBQ0tFVF9EQVRBX0xFTjsgaSsrKSB7CisJCQlwUGFja2V0LT5EYXRhW2ldID0gMHgwMDsKKwkJfQorCisJCUxlbmd0aCA9IFNLX1JMTVRfTUFYX1BBQ0tFVF9TSVpFOwkvKiBPciBzbWFsbGVyLiAqLworCQlwTWItPkxlbmd0aCA9IExlbmd0aDsKKwkJcE1iLT5Qb3J0SWR4ID0gUG9ydE51bWJlcjsKKwkJTGVuZ3RoIC09IDE0OworCQlTS19VMTZfVE9fTkVUV09SS19PUkRFUihMZW5ndGgsICZwUGFja2V0LT5UeXBlTGVuWzBdKTsKKworCQlpZiAoUGFja2V0VHlwZSA9PSBTS19QQUNLRVRfQUxJVkUpIHsKKwkJCXBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLlR4SGVsbG9DdHMrKzsKKwkJfQorCX0KKworCXJldHVybiAocE1iKTsKK30JLyogU2tSbG10QnVpbGRQYWNrZXQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10QnVpbGRTcGFubmluZ1RyZWVQYWNrZXQgLSBidWlsZCBzcGFubmluZyB0cmVlIGNoZWNrIHBhY2tldAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHNldHMgdXAgYSBCUERVIHBhY2tldCBmb3Igc3Bhbm5pbmcgdHJlZSBjaGVjay4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCU5VTEwgb3IgcG9pbnRlciB0byBSTE1UIG1idWYKKyAqLworUkxNVF9TVEFUSUMgU0tfTUJVRgkqU2tSbG10QnVpbGRTcGFubmluZ1RyZWVQYWNrZXQoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyKQkvKiBTZW5kaW5nIHBvcnQgKi8KK3sKKwl1bnNpZ25lZAkJCWk7CisJU0tfVTE2CQkJCUxlbmd0aDsKKwlTS19NQlVGCQkJCSpwTWI7CisJU0tfU1BUUkVFX1BBQ0tFVAkqcFNQYWNrZXQ7CisKKwlpZiAoKHBNYiA9IFNrRHJ2QWxsb2NSbG10TWJ1ZihwQUMsIElvQywgU0tfUkxNVF9NQVhfUEFDS0VUX1NJWkUpKSAhPQorCQlOVUxMKSB7CisJCXBTUGFja2V0ID0gKFNLX1NQVFJFRV9QQUNLRVQqKXBNYi0+cERhdGE7CisJCWZvciAoaSA9IDA7IGkgPCBTS19NQUNfQUREUl9MRU47IGkrKykgeworCQkJcFNQYWNrZXQtPkRzdEFkZHJbaV0gPSBCcmlkZ2VNY0FkZHIuYVtpXTsKKwkJCXBTUGFja2V0LT5TcmNBZGRyW2ldID0KKwkJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzcy5hW2ldOworCQl9CisJCXBTUGFja2V0LT5EU2FwID0gU0tfUkxNVF9TUFRfRFNBUDsKKwkJcFNQYWNrZXQtPlNTYXAgPSBTS19STE1UX1NQVF9TU0FQOworCQlwU1BhY2tldC0+Q3RybCA9IFNLX1JMTVRfU1BUX0NUUkw7CisKKwkJcFNQYWNrZXQtPlByb3RvY29sSWRbMF0gPSBTS19STE1UX1NQVF9QUk9UT0NPTF9JRDA7CisJCXBTUGFja2V0LT5Qcm90b2NvbElkWzFdID0gU0tfUkxNVF9TUFRfUFJPVE9DT0xfSUQxOworCQlwU1BhY2tldC0+UHJvdG9jb2xWZXJzaW9uSWQgPSBTS19STE1UX1NQVF9QUk9UT0NPTF9WRVJTSU9OX0lEOworCQlwU1BhY2tldC0+QnBkdVR5cGUgPSBTS19STE1UX1NQVF9CUERVX1RZUEU7CisJCXBTUGFja2V0LT5GbGFncyA9IFNLX1JMTVRfU1BUX0ZMQUdTOworCQlwU1BhY2tldC0+Um9vdElkWzBdID0gU0tfUkxNVF9TUFRfUk9PVF9JRDA7CisJCXBTUGFja2V0LT5Sb290SWRbMV0gPSBTS19STE1UX1NQVF9ST09UX0lEMTsKKwkJcFNQYWNrZXQtPlJvb3RQYXRoQ29zdFswXSA9IFNLX1JMTVRfU1BUX1JPT1RfUEFUSF9DT1NUMDsKKwkJcFNQYWNrZXQtPlJvb3RQYXRoQ29zdFsxXSA9IFNLX1JMTVRfU1BUX1JPT1RfUEFUSF9DT1NUMTsKKwkJcFNQYWNrZXQtPlJvb3RQYXRoQ29zdFsyXSA9IFNLX1JMTVRfU1BUX1JPT1RfUEFUSF9DT1NUMjsKKwkJcFNQYWNrZXQtPlJvb3RQYXRoQ29zdFszXSA9IFNLX1JMTVRfU1BUX1JPT1RfUEFUSF9DT1NUMzsKKwkJcFNQYWNrZXQtPkJyaWRnZUlkWzBdID0gU0tfUkxNVF9TUFRfQlJJREdFX0lEMDsKKwkJcFNQYWNrZXQtPkJyaWRnZUlkWzFdID0gU0tfUkxNVF9TUFRfQlJJREdFX0lEMTsKKworCQkvKgorCQkgKiBVc2UgbG9naWNhbCBNQUMgYWRkcmVzcyBhcyBicmlkZ2UgSUQgYW5kIGZpbHRlciB0aGVzZSBwYWNrZXRzCisJCSAqIG9uIHJlY2VpdmUuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgU0tfTUFDX0FERFJfTEVOOyBpKyspIHsKKwkJCXBTUGFja2V0LT5CcmlkZ2VJZFtpICsgMl0gPSBwU1BhY2tldC0+Um9vdElkW2kgKyAyXSA9CisJCQkJcEFDLT5BZGRyLk5ldFtwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPk5ldE51bWJlcl0uCisJCQkJCUN1cnJlbnRNYWNBZGRyZXNzLmFbaV07CisJCX0KKwkJcFNQYWNrZXQtPlBvcnRJZFswXSA9IFNLX1JMTVRfU1BUX1BPUlRfSUQwOworCQlwU1BhY2tldC0+UG9ydElkWzFdID0gU0tfUkxNVF9TUFRfUE9SVF9JRDE7CisJCXBTUGFja2V0LT5NZXNzYWdlQWdlWzBdID0gU0tfUkxNVF9TUFRfTVNHX0FHRTA7CisJCXBTUGFja2V0LT5NZXNzYWdlQWdlWzFdID0gU0tfUkxNVF9TUFRfTVNHX0FHRTE7CisJCXBTUGFja2V0LT5NYXhBZ2VbMF0gPSBTS19STE1UX1NQVF9NQVhfQUdFMDsKKwkJcFNQYWNrZXQtPk1heEFnZVsxXSA9IFNLX1JMTVRfU1BUX01BWF9BR0UxOworCQlwU1BhY2tldC0+SGVsbG9UaW1lWzBdID0gU0tfUkxNVF9TUFRfSEVMTE9fVElNRTA7CisJCXBTUGFja2V0LT5IZWxsb1RpbWVbMV0gPSBTS19STE1UX1NQVF9IRUxMT19USU1FMTsKKwkJcFNQYWNrZXQtPkZvcndhcmREZWxheVswXSA9IFNLX1JMTVRfU1BUX0ZXRF9ERUxBWTA7CisJCXBTUGFja2V0LT5Gb3J3YXJkRGVsYXlbMV0gPSBTS19STE1UX1NQVF9GV0RfREVMQVkxOworCisJCUxlbmd0aCA9IFNLX1JMTVRfTUFYX1BBQ0tFVF9TSVpFOwkvKiBPciBzbWFsbGVyLiAqLworCQlwTWItPkxlbmd0aCA9IExlbmd0aDsKKwkJcE1iLT5Qb3J0SWR4ID0gUG9ydE51bWJlcjsKKwkJTGVuZ3RoIC09IDE0OworCQlTS19VMTZfVE9fTkVUV09SS19PUkRFUihMZW5ndGgsICZwU1BhY2tldC0+VHlwZUxlblswXSk7CisKKwkJcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uVHhTcEhlbGxvUmVxQ3RzKys7CisJfQorCisJcmV0dXJuIChwTWIpOworfQkvKiBTa1JsbXRCdWlsZFNwYW5uaW5nVHJlZVBhY2tldCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRTZW5kIC0gYnVpbGQgYW5kIHNlbmQgY2hlY2sgcGFja2V0cworICoKKyAqIERlc2NyaXB0aW9uOgorICoJRGVwZW5kaW5nIG9uIHRoZSBSTE1UIHN0YXRlIGFuZCB0aGUgY2hlY2tpbmcgc3RhdGUsIHNldmVyYWwgcGFja2V0cworICoJYXJlIHNlbnQgdGhyb3VnaCB0aGUgaW5kaWNhdGVkIHBvcnQuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nLgorICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdFNlbmQoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyKQkvKiBTZW5kaW5nIHBvcnQgKi8KK3sKKwl1bnNpZ25lZAlqOworCVNLX0VWUEFSQQlQYXJhOworCVNLX1JMTVRfUE9SVAkqcFJQb3J0OworCisJcFJQb3J0ID0gJnBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdOworCWlmIChwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19MT0NfTElOSykgeworCQlpZiAocFJQb3J0LT5DaGVja2luZ1N0YXRlICYgKFNLX1JMTVRfUENTX1RYIHwgU0tfUkxNVF9QQ1NfUlgpKSB7CisJCQkvKiBQb3J0IGlzIHN1c3BpY2lvdXMuIFNlbmQgdGhlIFJMTVQgcGFja2V0IHRvIHRoZSBSTE1UIG1jIGFkZHIuICovCisJCQlpZiAoKFBhcmEucFBhcmFQdHIgPSBTa1JsbXRCdWlsZFBhY2tldChwQUMsIElvQywgUG9ydE51bWJlciwKKwkJCQlTS19QQUNLRVRfQUxJVkUsICZwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzcywKKwkJCQkmU2tSbG10TWNBZGRyKSkgIT0gTlVMTCkgeworCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUkxNVF9TRU5ELCBQYXJhKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qCisJCQkgKiBTZW5kIGEgZGlyZWN0ZWQgUkxNVCBwYWNrZXQgdG8gYWxsIHBvcnRzIHRoYXQgYXJlCisJCQkgKiBjaGVja2VkIGJ5IHRoZSBpbmRpY2F0ZWQgcG9ydC4KKwkJCSAqLworCQkJZm9yIChqID0gMDsgaiA8IHBSUG9ydC0+UG9ydHNDaGVja2VkOyBqKyspIHsKKwkJCQlpZiAoKFBhcmEucFBhcmFQdHIgPSBTa1JsbXRCdWlsZFBhY2tldChwQUMsIElvQywgUG9ydE51bWJlciwKKwkJCQkJU0tfUEFDS0VUX0FMSVZFLCAmcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MsCisJCQkJCSZwUlBvcnQtPlBvcnRDaGVja1tqXS5DaGVja0FkZHIpKSAhPSBOVUxMKSB7CisJCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUkxNVF9TRU5ELCBQYXJhKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAoKHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+UmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX1NFRykgJiYKKwkJKHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+Q2hlY2tpbmdTdGF0ZSAmIFNLX1JMTVRfUkNTX1NFTkRfU0VHKSkgeworCQkvKgorCQkgKiBTZW5kIGEgQlBEVSBwYWNrZXQgdG8gbWFrZSBhIGNvbm5lY3RlZCBzd2l0Y2ggdGVsbCB1cworCQkgKiB0aGUgY29ycmVjdCByb290IGJyaWRnZS4KKwkJICovCisJCWlmICgoUGFyYS5wUGFyYVB0ciA9CisJCQlTa1JsbXRCdWlsZFNwYW5uaW5nVHJlZVBhY2tldChwQUMsIElvQywgUG9ydE51bWJlcikpICE9IE5VTEwpIHsKKwkJCXBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+Q2hlY2tpbmdTdGF0ZSAmPSB+U0tfUkxNVF9SQ1NfU0VORF9TRUc7CisJCQlwUlBvcnQtPlJvb3RJZFNldCA9IFNLX0ZBTFNFOworCisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1JMTVRfU0VORCwgUGFyYSk7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9UWCwKKwkJCQkoIlNrUmxtdFNlbmQ6IEJQRFUgUGFja2V0IG9uIFBvcnQgJXUuXG4iLCBQb3J0TnVtYmVyKSkKKwkJfQorCX0KKwlyZXR1cm47Cit9CS8qIFNrUmxtdFNlbmQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10UG9ydFJlY2VpdmVzIC0gY2hlY2sgaWYgcG9ydCBpcyAoZ29pbmcpIGRvd24gYW5kIGJyaW5nIGl0IHVwCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgY2hlY2tzIGlmIGEgcG9ydCB3aG8gcmVjZWl2ZWQgYSBub24tQlBEVSBwYWNrZXQKKyAqCW5lZWRzIHRvIGdvIHVwIG9yIG5lZWRzIHRvIGJlIHN0b3BwZWQgZ29pbmcgZG93bi4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcuCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10UG9ydFJlY2VpdmVzKAorU0tfQUMJKnBBQywJCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyKQkJLyogUG9ydCB0byBjaGVjayAqLworeworCVNLX1JMTVRfUE9SVAkqcFJQb3J0OworCVNLX0VWUEFSQQkJUGFyYTsKKworCXBSUG9ydCA9ICZwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXTsKKwlwUlBvcnQtPlBvcnROb1J4ID0gU0tfRkFMU0U7CisKKwlpZiAoKHBSUG9ydC0+UG9ydFN0YXRlID09IFNLX1JMTVRfUFNfRE9XTikgJiYKKwkJIShwUlBvcnQtPkNoZWNraW5nU3RhdGUgJiBTS19STE1UX1BDU19UWCkpIHsKKwkJLyoKKwkJICogUG9ydCBpcyBtYXJrZWQgZG93biAocngpLCBidXQgcmVjZWl2ZWQgYSBub24tQlBEVSBwYWNrZXQuCisJCSAqIEJyaW5nIGl0IHVwLgorCQkgKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfUlgsCisJCQkoIlNrUmxtdFBhY2tldFJlY2VpdmU6IFJlY2VpdmVkIG9uIFBvcnREb3duLlxuIikpCisKKwkJcFJQb3J0LT5Qb3J0U3RhdGUgPSBTS19STE1UX1BTX0dPSU5HX1VQOworCQlwUlBvcnQtPkd1VGltZVN0YW1wID0gU2tPc0dldFRpbWUocEFDKTsKKwkJUGFyYS5QYXJhMzJbMF0gPSBQb3J0TnVtYmVyOworCQlQYXJhLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBSUG9ydC0+VXBUaW1lciwgU0tfUkxNVF9QT1JUVVBfVElNX1ZBTCwKKwkJCVNLR0VfUkxNVCwgU0tfUkxNVF9QT1JUVVBfVElNLCBQYXJhKTsKKwkJcFJQb3J0LT5DaGVja2luZ1N0YXRlICY9IH5TS19STE1UX1BDU19SWDsKKwkJLyogcEFDLT5SbG10LkNoZWNrU3dpdGNoID0gU0tfVFJVRTsgKi8KKwkJU2tSbG10Q2hlY2tTd2l0Y2gocEFDLCBJb0MsIHBSUG9ydC0+TmV0LT5OZXROdW1iZXIpOworCX0JLyogUG9ydERvd24gJiYgIVN1c3BlY3RUeCAqLworCWVsc2UgaWYgKHBSUG9ydC0+Q2hlY2tpbmdTdGF0ZSAmIFNLX1JMTVRfUENTX1JYKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1JYLAorCQkJKCJTa1JsbXRQYWNrZXRSZWNlaXZlOiBTdG9wIGJyaW5naW5nIHBvcnQgZG93bi5cbiIpKQorCQlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBSUG9ydC0+RG93blJ4VGltZXIpOworCQlwUlBvcnQtPkNoZWNraW5nU3RhdGUgJj0gflNLX1JMTVRfUENTX1JYOworCQkvKiBwQUMtPlJsbXQuQ2hlY2tTd2l0Y2ggPSBTS19UUlVFOyAqLworCQlTa1JsbXRDaGVja1N3aXRjaChwQUMsIElvQywgcFJQb3J0LT5OZXQtPk5ldE51bWJlcik7CisJfQkvKiBQb3J0R29pbmdEb3duICovCisKKwlyZXR1cm47Cit9CS8qIFNrUmxtdFBvcnRSZWNlaXZlcyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRQYWNrZXRSZWNlaXZlIC0gcmVjZWl2ZSBhIHBhY2tldCBmb3IgY2xvc2VyIGV4YW1pbmF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgZXhhbWluZXMgYSBwYWNrZXQgbW9yZSBjbG9zZWx5IHRoYW4gU0tfUkxNVF9MT09LQUhFQUQuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nLgorICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdFBhY2tldFJlY2VpdmUoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19NQlVGCSpwTWIpCS8qIFJlY2VpdmVkIHBhY2tldCAqLworeworI2lmZGVmIHhERUJVRworCWV4dGVybgl2b2lkIER1bXBEYXRhKGNoYXIgKnAsIGludCBzaXplKTsKKyNlbmRpZgkvKiBERUJVRyAqLworCWludAkJCQkJaTsKKwl1bnNpZ25lZAkJCWo7CisJU0tfVTE2CQkJCVBhY2tldFR5cGU7CisJU0tfVTMyCQkJCVBvcnROdW1iZXI7CisJU0tfQUREUl9QT1JUCQkqcEFQb3J0OworCVNLX1JMTVRfUE9SVAkJKnBSUG9ydDsKKwlTS19STE1UX1BBQ0tFVAkJKnBSUGFja2V0OworCVNLX1NQVFJFRV9QQUNLRVQJKnBTUGFja2V0OworCVNLX0VWUEFSQQkJCVBhcmE7CisKKwlQb3J0TnVtYmVyCT0gcE1iLT5Qb3J0SWR4OworCXBBUG9ydCA9ICZwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXTsKKwlwUlBvcnQgPSAmcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl07CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9SWCwKKwkJKCJTa1JsbXRQYWNrZXRSZWNlaXZlOiBQb3J0TnVtYmVyID09ICVkLlxuIiwgUG9ydE51bWJlcikpCisKKwlwUlBhY2tldCA9IChTS19STE1UX1BBQ0tFVCopcE1iLT5wRGF0YTsKKwlwU1BhY2tldCA9IChTS19TUFRSRUVfUEFDS0VUKilwUlBhY2tldDsKKworI2lmZGVmIHhERUJVRworCUR1bXBEYXRhKChjaGFyICopcFJQYWNrZXQsIDMyKTsKKyNlbmRpZgkvKiBERUJVRyAqLworCisJaWYgKChwUlBvcnQtPlBhY2tldHNQZXJUaW1lU2xvdCAtIHBSUG9ydC0+QnBkdVBhY2tldHNQZXJUaW1lU2xvdCkgIT0gMCkgeworCQlTa1JsbXRQb3J0UmVjZWl2ZXMocEFDLCBJb0MsIFBvcnROdW1iZXIpOworCX0KKwkKKwkvKiBDaGVjayBkZXN0aW5hdGlvbiBhZGRyZXNzLiAqLworCisJaWYgKCFTS19BRERSX0VRVUFMKHBBUG9ydC0+Q3VycmVudE1hY0FkZHJlc3MuYSwgcFJQYWNrZXQtPkRzdEFkZHIpICYmCisJCSFTS19BRERSX0VRVUFMKFNrUmxtdE1jQWRkci5hLCBwUlBhY2tldC0+RHN0QWRkcikgJiYKKwkJIVNLX0FERFJfRVFVQUwoQnJpZGdlTWNBZGRyLmEsIHBSUGFja2V0LT5Ec3RBZGRyKSkgeworCisJCS8qIE5vdCBzZW50IHRvIGN1cnJlbnQgTUFDIG9yIHJlZ2lzdGVyZWQgTUMgYWRkcmVzcyA9PiBUcmFzaCBpdC4gKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfUlgsCisJCQkoIlNrUmxtdFBhY2tldFJlY2VpdmU6IE5vdCBmb3IgbWUuXG4iKSkKKworCQlTa0RydkZyZWVSbG10TWJ1ZihwQUMsIElvQywgcE1iKTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmIChTS19BRERSX0VRVUFMKHBBUG9ydC0+Q3VycmVudE1hY0FkZHJlc3MuYSwgcFJQYWNrZXQtPlNyY0FkZHIpKSB7CisKKwkJLyoKKwkJICogV2FzIHNlbnQgYnkgc2FtZSBwb3J0IChtYXkgaGFwcGVuIGR1cmluZyBwb3J0IHN3aXRjaGluZworCQkgKiBvciBpbiBjYXNlIG9mIGR1cGxpY2F0ZSBNQUMgYWRkcmVzc2VzKS4KKwkJICovCisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIGR1cGxpY2F0ZSBhZGRyZXNzIGhlcmU6CisJCSAqIElmIFBhY2tldC5SYW5kb20gIT0gTXkuUmFuZG9tID0+IER1cEFkZHIuCisJCSAqLworCQlmb3IgKGkgPSAzOyBpID49IDA7IGktLSkgeworCQkJaWYgKHBSUG9ydC0+UmFuZG9tW2ldICE9IHBSUGFja2V0LT5SYW5kb21baV0pIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIENBVVRJT046IERvIG5vdCBjaGVjayBmb3IgZHVwbGljYXRlIE1BQyBhZGRyZXNzIGluIFJMTVQgQWxpdmUgUmVwbHkKKwkJICogcGFja2V0cyAodGhleSBoYXZlIHRoZSBMTENfQ09NTUFORF9SRVNQT05TRV9CSVQgc2V0IGluCisJCSAqIHBSUGFja2V0LT5TU2FwKS4KKwkJICovCisJCWlmIChpID49IDAgJiYgcFJQYWNrZXQtPkRTYXAgPT0gU0tfUkxNVF9EU0FQICYmCisJCQlwUlBhY2tldC0+Q3RybCA9PSBTS19STE1UX0NUUkwgJiYKKwkJCXBSUGFja2V0LT5TU2FwID09IFNLX1JMTVRfU1NBUCAmJgorCQkJcFJQYWNrZXQtPkluZGljYXRvclswXSA9PSBTS19STE1UX0lORElDQVRPUjAgJiYKKwkJCXBSUGFja2V0LT5JbmRpY2F0b3JbMV0gPT0gU0tfUkxNVF9JTkRJQ0FUT1IxICYmCisJCQlwUlBhY2tldC0+SW5kaWNhdG9yWzJdID09IFNLX1JMTVRfSU5ESUNBVE9SMiAmJgorCQkJcFJQYWNrZXQtPkluZGljYXRvclszXSA9PSBTS19STE1UX0lORElDQVRPUjMgJiYKKwkJCXBSUGFja2V0LT5JbmRpY2F0b3JbNF0gPT0gU0tfUkxNVF9JTkRJQ0FUT1I0ICYmCisJCQlwUlBhY2tldC0+SW5kaWNhdG9yWzVdID09IFNLX1JMTVRfSU5ESUNBVE9SNSAmJgorCQkJcFJQYWNrZXQtPkluZGljYXRvcls2XSA9PSBTS19STE1UX0lORElDQVRPUjYpIHsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1JYLAorCQkJCSgiU2tSbG10UGFja2V0UmVjZWl2ZTogRHVwbGljYXRlIE1BQyBBZGRyZXNzLlxuIikpCisKKwkJCS8qIEVycm9yIExvZyBlbnRyeS4gKi8KKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9DT01NLCBTS0VSUl9STE1UX0UwMDYsIFNLRVJSX1JMTVRfRTAwNl9NU0cpOworCQl9CisJCWVsc2UgeworCQkJLyogU2ltcGx5IHRyYXNoIGl0LiAqLworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfUlgsCisJCQkJKCJTa1JsbXRQYWNrZXRSZWNlaXZlOiBTZW50IGJ5IG1lLlxuIikpCisJCX0KKworCQlTa0RydkZyZWVSbG10TWJ1ZihwQUMsIElvQywgcE1iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENoZWNrIFN1c3BlY3RUeCBlbnRyaWVzLiAqLworCWlmIChwUlBvcnQtPlBvcnRzU3VzcGVjdCA+IDApIHsKKwkJZm9yIChqID0gMDsgaiA8IHBSUG9ydC0+UG9ydHNDaGVja2VkOyBqKyspIHsKKwkJCWlmIChwUlBvcnQtPlBvcnRDaGVja1tqXS5TdXNwZWN0VHggJiYKKwkJCQlTS19BRERSX0VRVUFMKAorCQkJCQlwUlBhY2tldC0+U3JjQWRkciwgcFJQb3J0LT5Qb3J0Q2hlY2tbal0uQ2hlY2tBZGRyLmEpKSB7CisJCQkJcFJQb3J0LT5Qb3J0Q2hlY2tbal0uU3VzcGVjdFR4ID0gU0tfRkFMU0U7CisJCQkJcFJQb3J0LT5Qb3J0c1N1c3BlY3QtLTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIERldGVybWluZSB0eXBlIG9mIHBhY2tldC4gKi8KKwlpZiAocFJQYWNrZXQtPkRTYXAgPT0gU0tfUkxNVF9EU0FQICYmCisJCXBSUGFja2V0LT5DdHJsID09IFNLX1JMTVRfQ1RSTCAmJgorCQkocFJQYWNrZXQtPlNTYXAgJiB+TExDX0NPTU1BTkRfUkVTUE9OU0VfQklUKSA9PSBTS19STE1UX1NTQVAgJiYKKwkJcFJQYWNrZXQtPkluZGljYXRvclswXSA9PSBTS19STE1UX0lORElDQVRPUjAgJiYKKwkJcFJQYWNrZXQtPkluZGljYXRvclsxXSA9PSBTS19STE1UX0lORElDQVRPUjEgJiYKKwkJcFJQYWNrZXQtPkluZGljYXRvclsyXSA9PSBTS19STE1UX0lORElDQVRPUjIgJiYKKwkJcFJQYWNrZXQtPkluZGljYXRvclszXSA9PSBTS19STE1UX0lORElDQVRPUjMgJiYKKwkJcFJQYWNrZXQtPkluZGljYXRvcls0XSA9PSBTS19STE1UX0lORElDQVRPUjQgJiYKKwkJcFJQYWNrZXQtPkluZGljYXRvcls1XSA9PSBTS19STE1UX0lORElDQVRPUjUgJiYKKwkJcFJQYWNrZXQtPkluZGljYXRvcls2XSA9PSBTS19STE1UX0lORElDQVRPUjYpIHsKKworCQkvKiBJdCdzIGFuIFJMTVQgcGFja2V0LiAqLworCQlQYWNrZXRUeXBlID0gKFNLX1UxNikoKHBSUGFja2V0LT5SbG10UGFja2V0VHlwZVswXSA8PCA4KSB8CisJCQlwUlBhY2tldC0+UmxtdFBhY2tldFR5cGVbMV0pOworCisJCXN3aXRjaCAoUGFja2V0VHlwZSkgeworCQljYXNlIFNLX1BBQ0tFVF9BTk5PVU5DRToJLyogTm90IHlldCB1c2VkLiAqLworI2lmIDAKKwkJCS8qIEJ1aWxkIHRoZSBjaGVjayBjaGFpbi4gKi8KKwkJCVNrUmxtdEJ1aWxkQ2hlY2tDaGFpbihwQUMpOworI2VuZGlmCS8qIDAgKi8KKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfUlgsCisJCQkJKCJTa1JsbXRQYWNrZXRSZWNlaXZlOiBBbm5vdW5jZS5cbiIpKQorCisJCQlTa0RydkZyZWVSbG10TWJ1ZihwQUMsIElvQywgcE1iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0tfUEFDS0VUX0FMSVZFOgorCQkJaWYgKHBSUGFja2V0LT5TU2FwICYgTExDX0NPTU1BTkRfUkVTUE9OU0VfQklUKSB7CisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfUlgsCisJCQkJCSgiU2tSbG10UGFja2V0UmVjZWl2ZTogQWxpdmUgUmVwbHkuXG4iKSkKKworCQkJCWlmICghKHBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLlByb21Nb2RlICYgU0tfUFJPTV9NT0RFX0xMQykgfHwKKwkJCQkJU0tfQUREUl9FUVVBTCgKKwkJCQkJCXBSUGFja2V0LT5Ec3RBZGRyLCBwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmEpKSB7CisJCQkJCS8qIE9idmlvdXNseSB3ZSBjb3VsZCBzZW5kIHNvbWV0aGluZy4gKi8KKwkJCQkJaWYgKHBSUG9ydC0+Q2hlY2tpbmdTdGF0ZSAmIFNLX1JMTVRfUENTX1RYKSB7CisJCQkJCQlwUlBvcnQtPkNoZWNraW5nU3RhdGUgJj0gIH5TS19STE1UX1BDU19UWDsKKwkJCQkJCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcFJQb3J0LT5Eb3duVHhUaW1lcik7CisJCQkJCX0KKworCQkJCQlpZiAoKHBSUG9ydC0+UG9ydFN0YXRlID09IFNLX1JMTVRfUFNfRE9XTikgJiYKKwkJCQkJCSEocFJQb3J0LT5DaGVja2luZ1N0YXRlICYgU0tfUkxNVF9QQ1NfUlgpKSB7CisJCQkJCQlwUlBvcnQtPlBvcnRTdGF0ZSA9IFNLX1JMTVRfUFNfR09JTkdfVVA7CisJCQkJCQlwUlBvcnQtPkd1VGltZVN0YW1wID0gU2tPc0dldFRpbWUocEFDKTsKKworCQkJCQkJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwUlBvcnQtPkRvd25UeFRpbWVyKTsKKworCQkJCQkJUGFyYS5QYXJhMzJbMF0gPSBQb3J0TnVtYmVyOworCQkJCQkJUGFyYS5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCQkJCQkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcFJQb3J0LT5VcFRpbWVyLAorCQkJCQkJCVNLX1JMTVRfUE9SVFVQX1RJTV9WQUwsIFNLR0VfUkxNVCwKKwkJCQkJCQlTS19STE1UX1BPUlRVUF9USU0sIFBhcmEpOworCQkJCQl9CisJCQkJfQorCisJCQkJLyogTWFyayBzZW5kaW5nIHBvcnQgYXMgYWxpdmU/ICovCisJCQkJU2tEcnZGcmVlUmxtdE1idWYocEFDLCBJb0MsIHBNYik7CisJCQl9CisJCQllbHNlIHsJLyogQWxpdmUgUmVxdWVzdCBQYWNrZXQuICovCisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfUlgsCisJCQkJCSgiU2tSbG10UGFja2V0UmVjZWl2ZTogQWxpdmUgUmVxdWVzdC5cbiIpKQorCisJCQkJcFJQb3J0LT5SeEhlbGxvQ3RzKys7CisKKwkJCQkvKiBBbnN3ZXIuICovCisJCQkJZm9yIChpID0gMDsgaSA8IFNLX01BQ19BRERSX0xFTjsgaSsrKSB7CisJCQkJCXBSUGFja2V0LT5Ec3RBZGRyW2ldID0gcFJQYWNrZXQtPlNyY0FkZHJbaV07CisJCQkJCXBSUGFja2V0LT5TcmNBZGRyW2ldID0KKwkJCQkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLmFbaV07CisJCQkJfQorCQkJCXBSUGFja2V0LT5TU2FwIHw9IExMQ19DT01NQU5EX1JFU1BPTlNFX0JJVDsKKworCQkJCVBhcmEucFBhcmFQdHIgPSBwTWI7CisJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9STE1UX1NFTkQsIFBhcmEpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTS19QQUNLRVRfQ0hFQ0tfVFg6CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9SWCwKKwkJCQkoIlNrUmxtdFBhY2tldFJlY2VpdmU6IENoZWNrIHlvdXIgdHggbGluZS5cbiIpKQorCisJCQkvKiBBIHBvcnQgY2hlY2tpbmcgdXMgcmVxdWVzdHMgdXMgdG8gY2hlY2sgb3VyIHR4IGxpbmUuICovCisJCQlwUlBvcnQtPkNoZWNraW5nU3RhdGUgfD0gU0tfUkxNVF9QQ1NfVFg7CisKKwkJCS8qIFN0YXJ0IFBvcnREb3duVHggdGltZXIuICovCisJCQlQYXJhLlBhcmEzMlswXSA9IFBvcnROdW1iZXI7CisJCQlQYXJhLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwUlBvcnQtPkRvd25UeFRpbWVyLAorCQkJCVNLX1JMTVRfUE9SVERPV05fVElNX1ZBTCwgU0tHRV9STE1ULAorCQkJCVNLX1JMTVRfUE9SVERPV05fVFhfVElNLCBQYXJhKTsKKworCQkJU2tEcnZGcmVlUmxtdE1idWYocEFDLCBJb0MsIHBNYik7CisKKwkJCWlmICgoUGFyYS5wUGFyYVB0ciA9IFNrUmxtdEJ1aWxkUGFja2V0KHBBQywgSW9DLCBQb3J0TnVtYmVyLAorCQkJCVNLX1BBQ0tFVF9BTElWRSwgJnBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLAorCQkJCSZTa1JsbXRNY0FkZHIpKSAhPSBOVUxMKSB7CisJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9STE1UX1NFTkQsIFBhcmEpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTS19QQUNLRVRfQUREUl9DSEFOR0VEOgorCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfUlgsCisJCQkJKCJTa1JsbXRQYWNrZXRSZWNlaXZlOiBBZGRyZXNzIENoYW5nZS5cbiIpKQorCisJCQkvKiBCdWlsZCB0aGUgY2hlY2sgY2hhaW4uICovCisJCQlTa1JsbXRCdWlsZENoZWNrQ2hhaW4ocEFDLCBwUlBvcnQtPk5ldC0+TmV0TnVtYmVyKTsKKwkJCVNrRHJ2RnJlZVJsbXRNYnVmKHBBQywgSW9DLCBwTWIpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1JYLAorCQkJCSgiU2tSbG10UGFja2V0UmVjZWl2ZTogVW5rbm93biBSTE1UIHBhY2tldC5cbiIpKQorCisJCQkvKiBSQTs6OzogPz8/ICovCisJCQlTa0RydkZyZWVSbG10TWJ1ZihwQUMsIElvQywgcE1iKTsKKwkJfQorCX0KKwllbHNlIGlmIChwU1BhY2tldC0+RFNhcCA9PSBTS19STE1UX1NQVF9EU0FQICYmCisJCXBTUGFja2V0LT5DdHJsID09IFNLX1JMTVRfU1BUX0NUUkwgJiYKKwkJKHBTUGFja2V0LT5TU2FwICYgfkxMQ19DT01NQU5EX1JFU1BPTlNFX0JJVCkgPT0gU0tfUkxNVF9TUFRfU1NBUCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9SWCwKKwkJCSgiU2tSbG10UGFja2V0UmVjZWl2ZTogQlBEVSBQYWNrZXQuXG4iKSkKKworCQkvKiBTcGFubmluZyBUcmVlIHBhY2tldC4gKi8KKwkJcFJQb3J0LT5SeFNwSGVsbG9DdHMrKzsKKworCQlpZiAoIVNLX0FERFJfRVFVQUwoJnBTUGFja2V0LT5Sb290SWRbMl0sICZwQUMtPkFkZHIuTmV0W3BBQy0+UmxtdC4KKwkJCVBvcnRbUG9ydE51bWJlcl0uTmV0LT5OZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLmFbMF0pKSB7CisJCQkvKgorCQkJICogQ2hlY2sgc2VnbWVudGF0aW9uIGlmIGEgbmV3IHJvb3QgYnJpZGdlIGlzIHNldCBhbmQKKwkJCSAqIHRoZSBzZWdtZW50YXRpb24gY2hlY2sgaXMgbm90IGN1cnJlbnRseSBydW5uaW5nLgorCQkJICovCisJCQlpZiAoIVNLX0FERFJfRVFVQUwoJnBTUGFja2V0LT5Sb290SWRbMl0sICZwUlBvcnQtPlJvb3QuSWRbMl0pICYmCisJCQkJKHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+TGlua3NVcCA+IDEpICYmCisJCQkJKHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+UmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX1NFRykKKwkJCQkhPSAwICYmIChwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPkNoZWNraW5nU3RhdGUgJgorCQkJCVNLX1JMTVRfUkNTX1NFRykgPT0gMCkgeworCQkJCXBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+Q2hlY2tpbmdTdGF0ZSB8PQorCQkJCQlTS19STE1UX1JDU19TVEFSVF9TRUcgfCBTS19STE1UX1JDU19TRU5EX1NFRzsKKwkJCX0KKworCQkJLyogU3RvcmUgdHJlZSB2aWV3IG9mIHRoaXMgcG9ydC4gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCQlwUlBvcnQtPlJvb3QuSWRbaV0gPSBwU1BhY2tldC0+Um9vdElkW2ldOworCQkJfQorCQkJcFJQb3J0LT5Sb290SWRTZXQgPSBTS19UUlVFOworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9EVU1QLAorCQkJCSgiUm9vdCBJRCAlZDogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4LlxuIiwKKwkJCQkJUG9ydE51bWJlciwKKwkJCQkJcFJQb3J0LT5Sb290LklkWzBdLCBwUlBvcnQtPlJvb3QuSWRbMV0sCisJCQkJCXBSUG9ydC0+Um9vdC5JZFsyXSwgcFJQb3J0LT5Sb290LklkWzNdLAorCQkJCQlwUlBvcnQtPlJvb3QuSWRbNF0sIHBSUG9ydC0+Um9vdC5JZFs1XSwKKwkJCQkJcFJQb3J0LT5Sb290LklkWzZdLCBwUlBvcnQtPlJvb3QuSWRbN10pKQorCQl9CisKKwkJU2tEcnZGcmVlUmxtdE1idWYocEFDLCBJb0MsIHBNYik7CisJCWlmICgocEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5DaGVja2luZ1N0YXRlICYKKwkJCVNLX1JMTVRfUkNTX1JFUE9SVF9TRUcpICE9IDApIHsKKwkJCVNrUmxtdENoZWNrU2VnKHBBQywgSW9DLCBwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPk5ldE51bWJlcik7CisJCX0KKwl9CisJZWxzZSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1JYLAorCQkJKCJTa1JsbXRQYWNrZXRSZWNlaXZlOiBVbmtub3duIFBhY2tldCBUeXBlLlxuIikpCisKKwkJLyogVW5rbm93biBwYWNrZXQuICovCisJCVNrRHJ2RnJlZVJsbXRNYnVmKHBBQywgSW9DLCBwTWIpOworCX0KKwlyZXR1cm47Cit9CS8qIFNrUmxtdFBhY2tldFJlY2VpdmUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10Q2hlY2tQb3J0IC0gY2hlY2sgaWYgYSBwb3J0IHdvcmtzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgY2hlY2tzIGlmIGEgcG9ydCB3aG9zZSBsaW5rIGlzIHVwIHJlY2VpdmVkIHNvbWV0aGluZworICoJYW5kIGlmIGl0IHNlZW1zIHRvIHRyYW5zbWl0IHN1Y2Nlc3NmdWxseS4KKyAqCisgKgkjIFBvcnRTdGF0ZTogUHNJbml0LCBQc0xpbmtEb3duLCBQc0Rvd24sIFBzR29pbmdVcCwgUHNVcAorICoJIyBQb3J0Q2hlY2tpbmdTdGF0ZSAoQml0ZmllbGQpOiBDaGtUeCwgQ2hrUngsIENoa1NlZworICoJIyBSbG10Q2hlY2tpbmdTdGF0ZSAoQml0ZmllbGQpOiBDaGtTZWcsIFN0YXJ0Q2hrU2VnLCBSZXBvcnRTZWcKKyAqCisgKglpZiAoUnggLSBSeEJwZHUgPT0gMCkgewkjIE5vIHJ4LgorICoJCWlmIChzdGF0ZSA9PSBQc1VwKSB7CisgKgkJCVBvcnRDaGVja2luZ1N0YXRlIHw9IENoa1J4CisgKgkJfQorICoJCWlmIChNb2RlQ2hlY2tTZWcgJiYgKFRpbWVvdXQgPT0KKyAqCQkJVE9fU0hPUlRFTihSTE1UX0RFRkFVTFRfVElNRU9VVCkpKSB7CisgKgkJCVJsbXRDaGVja2luZ1N0YXRlIHw9IENoa1NlZykKKyAqCQkJUG9ydENoZWNraW5nU3RhdGUgfD0gQ2hrU2VnCisgKgkJfQorICoJCU5ld1RpbWVvdXQgPSBUT19TSE9SVEVOKFRpbWVvdXQpCisgKgkJaWYgKE5ld1RpbWVvdXQgPCBSTE1UX01JTl9USU1FT1VUKSB7CisgKgkJCU5ld1RpbWVvdXQgPSBSTE1UX01JTl9USU1FT1VUCisgKgkJCVBvcnRTdGF0ZSA9IFBzRG93bgorICoJCQkuLi4KKyAqCQl9CisgKgl9CisgKgllbHNlIHsJIyBzb21ldGhpbmcgd2FzIHJlY2VpdmVkCisgKgkJIyBTZXQgY291bnRlciB0byAwIGF0IExpbmtEb3duPworICoJCSMgICBObyAtIHJ4IG1heSBiZSByZXBvcnRlZCBhZnRlciBMaW5rRG93biA/Pz8KKyAqCQlQb3J0Q2hlY2tpbmdTdGF0ZSAmPSB+Q2hrUngKKyAqCQlOZXdUaW1lb3V0ID0gUkxNVF9ERUZBVUxUX1RJTUVPVVQKKyAqCQlpZiAoUnhBY2sgPT0gMCkgeworICoJCQlwb3NzaWJsZSByZWFzb25zOgorICoJCQlpcyBteSB0eCBsaW5lIGJhZD8gLS0KKyAqCQkJCXNlbmQgUkxNVCBtdWx0aWNhc3QgYW5kIHJlcG9ydAorICoJCQkJYmFjayBpbnRlcm5hbGx5PyAob25seSBwb3NzaWJsZQorICoJCQkJYmV0d2VlbiBwb3J0cyBvbiBzYW1lIGFkYXB0ZXIpCisgKgkJfQorICoJCWlmIChSeENoayA9PSAwKSB7CisgKgkJCXBvc3NpYmxlIHJlYXNvbnM6CisgKgkJCS0gdHggbGluZSBvZiBwb3J0IHNldCB0byBjaGVjayBtZQorICoJCQkgIG1heWJlIGJhZAorICoJCQktIG5vIG90aGVyIHBvcnQvYWRhcHRlciBhdmFpbGFibGUgb3Igc2V0CisgKgkJCSAgdG8gY2hlY2sgbWUKKyAqCQkJLSBhZGFwdGVyIGNoZWNraW5nIG1lIGhhcyBhIGxvbmdlcgorICoJCQkgIHRpbWVvdXQKKyAqCQkJPz8/IGFueXRoaW5nIHRoYXQgY2FuIGJlIGRvbmUgaGVyZT8KKyAqCQl9CisgKgl9CisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglOZXcgdGltZW91dCB2YWx1ZS4KKyAqLworUkxNVF9TVEFUSUMgU0tfVTMyCVNrUmxtdENoZWNrUG9ydCgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCVBvcnROdW1iZXIpCS8qIFBvcnQgdG8gY2hlY2sgKi8KK3sKKwl1bnNpZ25lZAkJaTsKKwlTS19VMzIJCQlOZXdUaW1lb3V0OworCVNLX1JMTVRfUE9SVAkqcFJQb3J0OworCVNLX0VWUEFSQQkJUGFyYTsKKworCXBSUG9ydCA9ICZwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXTsKKworCWlmICgocFJQb3J0LT5QYWNrZXRzUGVyVGltZVNsb3QgLSBwUlBvcnQtPkJwZHVQYWNrZXRzUGVyVGltZVNsb3QpID09IDApIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU2tSbG10Q2hlY2tQb3J0ICVkOiBObyAoJWQpIHJlY2VpdmVzIGluIGxhc3QgdGltZSBzbG90LlxuIiwKKwkJCQlQb3J0TnVtYmVyLCBwUlBvcnQtPlBhY2tldHNQZXJUaW1lU2xvdCkpCisKKwkJLyoKKwkJICogQ2hlY2sgc2VnbWVudGF0aW9uIGlmIHRoZXJlIHdhcyBubyByZWNlaXZlIGF0IGxlYXN0IHR3aWNlCisJCSAqIGluIGEgcm93IChQb3J0Tm9SeCBpcyBhbHJlYWR5IHNldCkgYW5kIHRoZSBzZWdtZW50YXRpb24KKwkJICogY2hlY2sgaXMgbm90IGN1cnJlbnRseSBydW5uaW5nLgorCQkgKi8KKworCQlpZiAocFJQb3J0LT5Qb3J0Tm9SeCAmJiAocEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5MaW5rc1VwID4gMSkgJiYKKwkJCShwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19TRUcpICYmCisJCQkhKHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+Q2hlY2tpbmdTdGF0ZSAmIFNLX1JMTVRfUkNTX1NFRykpIHsKKwkJCXBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+Q2hlY2tpbmdTdGF0ZSB8PQorCQkJCVNLX1JMTVRfUkNTX1NUQVJUX1NFRyB8IFNLX1JMTVRfUkNTX1NFTkRfU0VHOworCQl9CisKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU2tSbG10Q2hlY2tQb3J0OiBQb3J0c1N1c3BlY3QgJWQsIFBjc1J4ICVkLlxuIiwKKwkJCQlwUlBvcnQtPlBvcnRzU3VzcGVjdCwgcFJQb3J0LT5DaGVja2luZ1N0YXRlICYgU0tfUkxNVF9QQ1NfUlgpKQorCisJCWlmIChwUlBvcnQtPlBvcnRTdGF0ZSAhPSBTS19STE1UX1BTX0RPV04pIHsKKwkJCU5ld1RpbWVvdXQgPSBUT19TSE9SVEVOKHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+VGltZW91dFZhbHVlKTsKKwkJCWlmIChOZXdUaW1lb3V0IDwgU0tfUkxNVF9NSU5fVE9fVkFMKSB7CisJCQkJTmV3VGltZW91dCA9IFNLX1JMTVRfTUlOX1RPX1ZBTDsKKwkJCX0KKworCQkJaWYgKCEocFJQb3J0LT5DaGVja2luZ1N0YXRlICYgU0tfUkxNVF9QQ1NfUlgpKSB7CisJCQkJUGFyYS5QYXJhMzJbMF0gPSBQb3J0TnVtYmVyOworCQkJCXBSUG9ydC0+Q2hlY2tpbmdTdGF0ZSB8PSBTS19STE1UX1BDU19SWDsKKworCQkJCS8qCisJCQkJICogV2hhdCBzaGFsbCB3ZSBkbyBpZiB0aGUgcG9ydCBjaGVja2VkIGJ5IHRoaXMgb25lIHJlY2VpdmVzCisJCQkJICogb3VyIHJlcXVlc3QgZnJhbWVzPyAgV2hhdCdzIGJhZCAtIG91ciByeCBsaW5lIG9yIGhpcyB0eCBsaW5lPworCQkJCSAqLworCQkJCVBhcmEuUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwkJCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwUlBvcnQtPkRvd25SeFRpbWVyLAorCQkJCQlTS19STE1UX1BPUlRET1dOX1RJTV9WQUwsIFNLR0VfUkxNVCwKKwkJCQkJU0tfUkxNVF9QT1JURE9XTl9SWF9USU0sIFBhcmEpOworCisJCQkJZm9yIChpID0gMDsgaSA8IHBSUG9ydC0+UG9ydHNDaGVja2VkOyBpKyspIHsKKwkJCQkJaWYgKHBSUG9ydC0+UG9ydENoZWNrW2ldLlN1c3BlY3RUeCkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJcFJQb3J0LT5Qb3J0Q2hlY2tbaV0uU3VzcGVjdFR4ID0gU0tfVFJVRTsKKwkJCQkJcFJQb3J0LT5Qb3J0c1N1c3BlY3QrKzsKKwkJCQkJaWYgKChQYXJhLnBQYXJhUHRyID0KKwkJCQkJCVNrUmxtdEJ1aWxkUGFja2V0KHBBQywgSW9DLCBQb3J0TnVtYmVyLCBTS19QQUNLRVRfQ0hFQ0tfVFgsCisJCQkJCQkJJnBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLAorCQkJCQkJCSZwUlBvcnQtPlBvcnRDaGVja1tpXS5DaGVja0FkZHIpKSAhPSBOVUxMKSB7CisJCQkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1JMTVRfU0VORCwgUGFyYSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSB7CS8qIFBvcnREb3duIC0tIG9yIGFsbCBwYXJ0bmVycyBzdXNwZWN0LiAqLworCQkJTmV3VGltZW91dCA9IFNLX1JMTVRfREVGX1RPX1ZBTDsKKwkJfQorCQlwUlBvcnQtPlBvcnROb1J4ID0gU0tfVFJVRTsKKwl9CisJZWxzZSB7CS8qIEEgbm9uLUJQRFUgcGFja2V0IHdhcyByZWNlaXZlZC4gKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU2tSbG10Q2hlY2tQb3J0ICVkOiAlZCAoJWQpIHJlY2VpdmVzIGluIGxhc3QgdGltZSBzbG90LlxuIiwKKwkJCQlQb3J0TnVtYmVyLAorCQkJCXBSUG9ydC0+UGFja2V0c1BlclRpbWVTbG90IC0gcFJQb3J0LT5CcGR1UGFja2V0c1BlclRpbWVTbG90LAorCQkJCXBSUG9ydC0+UGFja2V0c1BlclRpbWVTbG90KSkKKwkJCisJCVNrUmxtdFBvcnRSZWNlaXZlcyhwQUMsIElvQywgUG9ydE51bWJlcik7CisJCWlmIChwQUMtPlJsbXQuQ2hlY2tTd2l0Y2gpIHsKKwkJCVNrUmxtdENoZWNrU3dpdGNoKHBBQywgSW9DLCBwUlBvcnQtPk5ldC0+TmV0TnVtYmVyKTsKKwkJfQorCisJCU5ld1RpbWVvdXQgPSBTS19STE1UX0RFRl9UT19WQUw7CisJfQorCisJcmV0dXJuIChOZXdUaW1lb3V0KTsKK30JLyogU2tSbG10Q2hlY2tQb3J0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdFNlbGVjdEJjUnggLSBzZWxlY3QgbmV3IGFjdGl2ZSBwb3J0LCBjcml0ZXJpYSAxIChDTFApCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgc2VsZWN0cyB0aGUgcG9ydCB0aGF0IHJlY2VpdmVkIGEgYnJvYWRjYXN0IGZyYW1lCisgKglzdWJzdGFudGlhbGx5IGxhdGVyIHRoYW4gYWxsIG90aGVyIHBvcnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQk9PTAorICovCitSTE1UX1NUQVRJQyBTS19CT09MCVNrUmxtdFNlbGVjdEJjUngoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMglBY3RpdmUsCQkvKiBBY3RpdmUgcG9ydCAqLworU0tfVTMyCVByZWZQb3J0LAkvKiBQcmVmZXJyZWQgcG9ydCAqLworU0tfVTMyCSpwU2VsZWN0KQkvKiBOZXcgYWN0aXZlIHBvcnQgKi8KK3sKKwlTS19VNjQJCUJjVGltZVN0YW1wOworCVNLX1UzMgkJaTsKKwlTS19CT09MCQlQb3J0Rm91bmQ7CisKKwlCY1RpbWVTdGFtcCA9IDA7CS8qIE5vdCB0b3RhbGx5IG5lY2Vzc2FyeSwgYnV0IGZlZWxpbmcgYmV0dGVyLiAqLworCVBvcnRGb3VuZCA9IFNLX0ZBTFNFOworCQorCS8qIFNlbGVjdCBwb3J0IHdpdGggdGhlIGxhdGVzdCBUaW1lU3RhbXAuICovCisJZm9yIChpID0gMDsgaSA8IChTS19VMzIpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJUaW1lU3RhbXAgUG9ydCAlZCAoRG93bjogJWQsIE5vUng6ICVkKTogJTA4eCAlMDh4LlxuIiwKKwkJCQlpLAorICAgCQkJCXBBQy0+UmxtdC5Qb3J0W2ldLlBvcnREb3duLCBwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0Tm9SeCwKKwkJCQkqKChTS19VMzIqKSgmcEFDLT5SbG10LlBvcnRbaV0uQmNUaW1lU3RhbXApICsgT0ZGU19ISTMyKSwKKwkJCQkqKChTS19VMzIqKSgmcEFDLT5SbG10LlBvcnRbaV0uQmNUaW1lU3RhbXApICsgT0ZGU19MTzMyKSkpCisKKwkJaWYgKCFwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0RG93biAmJiAhcEFDLT5SbG10LlBvcnRbaV0uUG9ydE5vUngpIHsKKwkJCWlmICghUG9ydEZvdW5kIHx8IHBBQy0+UmxtdC5Qb3J0W2ldLkJjVGltZVN0YW1wID4gQmNUaW1lU3RhbXApIHsKKwkJCQlCY1RpbWVTdGFtcCA9IHBBQy0+UmxtdC5Qb3J0W2ldLkJjVGltZVN0YW1wOworCQkJCSpwU2VsZWN0ID0gaTsKKwkJCQlQb3J0Rm91bmQgPSBTS19UUlVFOworCQkJfQorCQl9CisJfQorCisJaWYgKFBvcnRGb3VuZCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJQb3J0ICVkIHJlY2VpdmVkIHRoZSBsYXN0IGJyb2FkY2FzdC5cbiIsICpwU2VsZWN0KSkKKworCQkvKiBMb29rIGlmIGFub3RoZXIgcG9ydCdzIHRpbWUgc3RhbXAgaXMgc2ltaWxhci4gKi8KKwkJZm9yIChpID0gMDsgaSA8IChTS19VMzIpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJCWlmIChpID09ICpwU2VsZWN0KSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXBBQy0+UmxtdC5Qb3J0W2ldLlBvcnREb3duICYmICFwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0Tm9SeCAmJgorCQkJCShwQUMtPlJsbXQuUG9ydFtpXS5CY1RpbWVTdGFtcCA+CisJCQkJIEJjVGltZVN0YW1wIC0gU0tfUkxNVF9CQ19ERUxUQSB8fAorCQkJCXBBQy0+UmxtdC5Qb3J0W2ldLkJjVGltZVN0YW1wICsKKwkJCQkgU0tfUkxNVF9CQ19ERUxUQSA+IEJjVGltZVN0YW1wKSkgeworCQkJCVBvcnRGb3VuZCA9IFNLX0ZBTFNFOworCQkJCQorCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkJCSgiUG9ydCAlZCByZWNlaXZlZCBhIGJyb2FkY2FzdCBhdCBhIHNpbWlsYXIgdGltZS5cbiIsIGkpKQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisjaWZkZWYgREVCVUcKKwlpZiAoUG9ydEZvdW5kKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU0VMRUNUX0JDUlggZm91bmQgUG9ydCAlZCByZWNlaXZpbmcgdGhlIHN1YnN0YW50aWFsbHkgIgorCQkJICJsYXRlc3QgYnJvYWRjYXN0ICgldSkuXG4iLAorCQkJCSpwU2VsZWN0LAorCQkJCUJjVGltZVN0YW1wIC0gcEFDLT5SbG10LlBvcnRbMSAtICpwU2VsZWN0XS5CY1RpbWVTdGFtcCkpCisJfQorI2VuZGlmCS8qIERFQlVHICovCisKKwlyZXR1cm4gKFBvcnRGb3VuZCk7Cit9CS8qIFNrUmxtdFNlbGVjdEJjUnggKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10U2VsZWN0Tm90U3VzcGVjdCAtIHNlbGVjdCBuZXcgYWN0aXZlIHBvcnQsIGNyaXRlcmlhIDIgKENMUCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBzZWxlY3RzIGEgZ29vZCBwb3J0IChpdCBpcyBQb3J0VXAgJiYgIVN1c3BlY3RSeCkuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglTS19CT09MCisgKi8KK1JMTVRfU1RBVElDIFNLX0JPT0wJU2tSbG10U2VsZWN0Tm90U3VzcGVjdCgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCUFjdGl2ZSwJCS8qIEFjdGl2ZSBwb3J0ICovCitTS19VMzIJUHJlZlBvcnQsCS8qIFByZWZlcnJlZCBwb3J0ICovCitTS19VMzIJKnBTZWxlY3QpCS8qIE5ldyBhY3RpdmUgcG9ydCAqLworeworCVNLX1UzMgkJaTsKKwlTS19CT09MCQlQb3J0Rm91bmQ7CisKKwlQb3J0Rm91bmQgPSBTS19GQUxTRTsKKworCS8qIFNlbGVjdCBmaXJzdCBwb3J0IHRoYXQgaXMgUG9ydFVwICYmICFTdXNwZWN0UnguICovCisJZm9yIChpID0gMDsgaSA8IChTS19VMzIpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJaWYgKCFwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0RG93biAmJgorCQkJIShwQUMtPlJsbXQuUG9ydFtpXS5DaGVja2luZ1N0YXRlICYgU0tfUkxNVF9QQ1NfUlgpKSB7CisJCQkqcFNlbGVjdCA9IGk7CisJCQlpZiAoIXBBQy0+UmxtdC5Qb3J0W0FjdGl2ZV0uUG9ydERvd24gJiYKKwkJCQkhKHBBQy0+UmxtdC5Qb3J0W0FjdGl2ZV0uQ2hlY2tpbmdTdGF0ZSAmIFNLX1JMTVRfUENTX1JYKSkgeworCQkJCSpwU2VsZWN0ID0gQWN0aXZlOworCQkJfQorCQkJaWYgKCFwQUMtPlJsbXQuUG9ydFtQcmVmUG9ydF0uUG9ydERvd24gJiYKKwkJCQkhKHBBQy0+UmxtdC5Qb3J0W1ByZWZQb3J0XS5DaGVja2luZ1N0YXRlICYgU0tfUkxNVF9QQ1NfUlgpKSB7CisJCQkJKnBTZWxlY3QgPSBQcmVmUG9ydDsKKwkJCX0KKwkJCVBvcnRGb3VuZCA9IFNLX1RSVUU7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiU0tfUkxNVF9TRUxFQ1RfTk9UU1VTUEVDVCBmb3VuZCBQb3J0ICVkIHVwIGFuZCBub3QgY2hlY2sgUlguXG4iLAorCQkJCQkqcFNlbGVjdCkpCisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKFBvcnRGb3VuZCk7Cit9CS8qIFNrUmxtdFNlbGVjdE5vdFN1c3BlY3QgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10U2VsZWN0VXAgLSBzZWxlY3QgbmV3IGFjdGl2ZSBwb3J0LCBjcml0ZXJpYSAzLCA0IChDTFApCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgc2VsZWN0cyBhIHBvcnQgdGhhdCBpcyB1cC4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCVNLX0JPT0wKKyAqLworUkxNVF9TVEFUSUMgU0tfQk9PTAlTa1JsbXRTZWxlY3RVcCgKK1NLX0FDCSpwQUMsCQkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJQWN0aXZlLAkJCS8qIEFjdGl2ZSBwb3J0ICovCitTS19VMzIJUHJlZlBvcnQsCQkvKiBQcmVmZXJyZWQgcG9ydCAqLworU0tfVTMyCSpwU2VsZWN0LAkJLyogTmV3IGFjdGl2ZSBwb3J0ICovCitTS19CT09MCUF1dG9OZWdEb25lKQkvKiBTdWNjZXNzZnVsbHkgYXV0by1uZWdvdGlhdGVkPyAqLworeworCVNLX1UzMgkJaTsKKwlTS19CT09MCQlQb3J0Rm91bmQ7CisKKwlQb3J0Rm91bmQgPSBTS19GQUxTRTsKKworCS8qIFNlbGVjdCBmaXJzdCBwb3J0IHRoYXQgaXMgUG9ydFVwLiAqLworCWZvciAoaSA9IDA7IGkgPCAoU0tfVTMyKXBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCWlmIChwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0U3RhdGUgPT0gU0tfUkxNVF9QU19VUCAmJgorCQkJcEFDLT5HSW5pLkdQW2ldLlBBdXRvTmVnRmFpbCAhPSBBdXRvTmVnRG9uZSkgeworCQkJKnBTZWxlY3QgPSBpOworCQkJaWYgKHBBQy0+UmxtdC5Qb3J0W0FjdGl2ZV0uUG9ydFN0YXRlID09IFNLX1JMTVRfUFNfVVAgJiYKKwkJCQlwQUMtPkdJbmkuR1BbQWN0aXZlXS5QQXV0b05lZ0ZhaWwgIT0gQXV0b05lZ0RvbmUpIHsKKwkJCQkqcFNlbGVjdCA9IEFjdGl2ZTsKKwkJCX0KKwkJCWlmIChwQUMtPlJsbXQuUG9ydFtQcmVmUG9ydF0uUG9ydFN0YXRlID09IFNLX1JMTVRfUFNfVVAgJiYKKwkJCQlwQUMtPkdJbmkuR1BbUHJlZlBvcnRdLlBBdXRvTmVnRmFpbCAhPSBBdXRvTmVnRG9uZSkgeworCQkJCSpwU2VsZWN0ID0gUHJlZlBvcnQ7CisJCQl9CisJCQlQb3J0Rm91bmQgPSBTS19UUlVFOworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlNLX1JMTVRfU0VMRUNUX1VQIGZvdW5kIFBvcnQgJWQgdXAuXG4iLCAqcFNlbGVjdCkpCisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKFBvcnRGb3VuZCk7Cit9CS8qIFNrUmxtdFNlbGVjdFVwICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdFNlbGVjdEdvaW5nVXAgLSBzZWxlY3QgbmV3IGFjdGl2ZSBwb3J0LCBjcml0ZXJpYSA1LCA2IChDTFApCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgc2VsZWN0cyB0aGUgcG9ydCB0aGF0IGlzIGdvaW5nIHVwIGZvciB0aGUgbG9uZ2VzdCB0aW1lLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQk9PTAorICovCitSTE1UX1NUQVRJQyBTS19CT09MCVNrUmxtdFNlbGVjdEdvaW5nVXAoCitTS19BQwkqcEFDLAkJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCQkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCUFjdGl2ZSwJCQkvKiBBY3RpdmUgcG9ydCAqLworU0tfVTMyCVByZWZQb3J0LAkJLyogUHJlZmVycmVkIHBvcnQgKi8KK1NLX1UzMgkqcFNlbGVjdCwJCS8qIE5ldyBhY3RpdmUgcG9ydCAqLworU0tfQk9PTAlBdXRvTmVnRG9uZSkJLyogU3VjY2Vzc2Z1bGx5IGF1dG8tbmVnb3RpYXRlZD8gKi8KK3sKKwlTS19VNjQJCUd1VGltZVN0YW1wOworCVNLX1UzMgkJaTsKKwlTS19CT09MCQlQb3J0Rm91bmQ7CisKKwlHdVRpbWVTdGFtcCA9IDA7CisJUG9ydEZvdW5kID0gU0tfRkFMU0U7CisKKwkvKiBTZWxlY3QgcG9ydCB0aGF0IGlzIFBvcnRHb2luZ1VwIGZvciB0aGUgbG9uZ2VzdCB0aW1lLiAqLworCWZvciAoaSA9IDA7IGkgPCAoU0tfVTMyKXBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCWlmIChwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0U3RhdGUgPT0gU0tfUkxNVF9QU19HT0lOR19VUCAmJgorCQkJcEFDLT5HSW5pLkdQW2ldLlBBdXRvTmVnRmFpbCAhPSBBdXRvTmVnRG9uZSkgeworCQkJR3VUaW1lU3RhbXAgPSBwQUMtPlJsbXQuUG9ydFtpXS5HdVRpbWVTdGFtcDsKKwkJCSpwU2VsZWN0ID0gaTsKKwkJCVBvcnRGb3VuZCA9IFNLX1RSVUU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghUG9ydEZvdW5kKSB7CisJCXJldHVybiAoU0tfRkFMU0UpOworCX0KKworCWZvciAoaSA9ICpwU2VsZWN0ICsgMTsgaSA8IChTS19VMzIpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJaWYgKHBBQy0+UmxtdC5Qb3J0W2ldLlBvcnRTdGF0ZSA9PSBTS19STE1UX1BTX0dPSU5HX1VQICYmCisJCQlwQUMtPlJsbXQuUG9ydFtpXS5HdVRpbWVTdGFtcCA8IEd1VGltZVN0YW1wICYmCisJCQlwQUMtPkdJbmkuR1BbaV0uUEF1dG9OZWdGYWlsICE9IEF1dG9OZWdEb25lKSB7CisJCQlHdVRpbWVTdGFtcCA9IHBBQy0+UmxtdC5Qb3J0W2ldLkd1VGltZVN0YW1wOworCQkJKnBTZWxlY3QgPSBpOworCQl9CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1NFTEVDVF9HT0lOR1VQIGZvdW5kIFBvcnQgJWQgZ29pbmcgdXAuXG4iLCAqcFNlbGVjdCkpCisJcmV0dXJuIChTS19UUlVFKTsKK30JLyogU2tSbG10U2VsZWN0R29pbmdVcCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRTZWxlY3REb3duIC0gc2VsZWN0IG5ldyBhY3RpdmUgcG9ydCwgY3JpdGVyaWEgNywgOCAoQ0xQKQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHNlbGVjdHMgYSBwb3J0IHRoYXQgaXMgZG93bi4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCVNLX0JPT0wKKyAqLworUkxNVF9TVEFUSUMgU0tfQk9PTAlTa1JsbXRTZWxlY3REb3duKAorU0tfQUMJKnBBQywJCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMglBY3RpdmUsCQkJLyogQWN0aXZlIHBvcnQgKi8KK1NLX1UzMglQcmVmUG9ydCwJCS8qIFByZWZlcnJlZCBwb3J0ICovCitTS19VMzIJKnBTZWxlY3QsCQkvKiBOZXcgYWN0aXZlIHBvcnQgKi8KK1NLX0JPT0wJQXV0b05lZ0RvbmUpCS8qIFN1Y2Nlc3NmdWxseSBhdXRvLW5lZ290aWF0ZWQ/ICovCit7CisJU0tfVTMyCQlpOworCVNLX0JPT0wJCVBvcnRGb3VuZDsKKworCVBvcnRGb3VuZCA9IFNLX0ZBTFNFOworCisJLyogU2VsZWN0IGZpcnN0IHBvcnQgdGhhdCBpcyBQb3J0RG93bi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgKFNLX1UzMilwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlpZiAocEFDLT5SbG10LlBvcnRbaV0uUG9ydFN0YXRlID09IFNLX1JMTVRfUFNfRE9XTiAmJgorCQkJcEFDLT5HSW5pLkdQW2ldLlBBdXRvTmVnRmFpbCAhPSBBdXRvTmVnRG9uZSkgeworCQkJKnBTZWxlY3QgPSBpOworCQkJaWYgKHBBQy0+UmxtdC5Qb3J0W0FjdGl2ZV0uUG9ydFN0YXRlID09IFNLX1JMTVRfUFNfRE9XTiAmJgorCQkJCXBBQy0+R0luaS5HUFtBY3RpdmVdLlBBdXRvTmVnRmFpbCAhPSBBdXRvTmVnRG9uZSkgeworCQkJCSpwU2VsZWN0ID0gQWN0aXZlOworCQkJfQorCQkJaWYgKHBBQy0+UmxtdC5Qb3J0W1ByZWZQb3J0XS5Qb3J0U3RhdGUgPT0gU0tfUkxNVF9QU19ET1dOICYmCisJCQkJcEFDLT5HSW5pLkdQW1ByZWZQb3J0XS5QQXV0b05lZ0ZhaWwgIT0gQXV0b05lZ0RvbmUpIHsKKwkJCQkqcFNlbGVjdCA9IFByZWZQb3J0OworCQkJfQorCQkJUG9ydEZvdW5kID0gU0tfVFJVRTsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJTS19STE1UX1NFTEVDVF9ET1dOIGZvdW5kIFBvcnQgJWQgZG93bi5cbiIsICpwU2VsZWN0KSkKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAoUG9ydEZvdW5kKTsKK30JLyogU2tSbG10U2VsZWN0RG93biAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRDaGVja1N3aXRjaCAtIHNlbGVjdCBuZXcgYWN0aXZlIHBvcnQgYW5kIHN3aXRjaCB0byBpdAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGRlY2lkZXMgd2hpY2ggcG9ydCBzaG91bGQgYmUgdGhlIGFjdGl2ZSBvbmUgYW5kIHF1ZXVlcworICoJcG9ydCBzd2l0Y2hpbmcgaWYgbmVjZXNzYXJ5LgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZy4KKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRDaGVja1N3aXRjaCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMglOZXRJZHgpCS8qIE5ldCBpbmRleCAqLworeworCVNLX0VWUEFSQQlQYXJhOworCVNLX1UzMgkJQWN0aXZlOworCVNLX1UzMgkJUHJlZlBvcnQ7CisJU0tfVTMyCQlpOworCVNLX0JPT0wJCVBvcnRGb3VuZDsKKworCUFjdGl2ZSA9IHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5BY3RpdmVQb3J0OwkvKiBJbmRleCBvZiBhY3RpdmUgcG9ydC4gKi8KKwlQcmVmUG9ydCA9IHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5QcmVmUG9ydDsJLyogSW5kZXggb2YgcHJlZmVycmVkIHBvcnQuICovCisJUG9ydEZvdW5kID0gU0tfRkFMU0U7CisJcEFDLT5SbG10LkNoZWNrU3dpdGNoID0gU0tfRkFMU0U7CisKKyNpZiAwCS8qIFJXIDIwMDEvMTAvMTggLSBhY3RpdmUgcG9ydCBiZWNvbWVzIGFsd2F5cyBwcmVmZXJlZCBvbmUgKi8KKwlpZiAocEFDLT5SbG10Lk5ldFtOZXRJZHhdLlByZWZlcmVuY2UgPT0gMHhGRkZGRkZGRikgeyAvKiBBdXRvbWF0aWMgKi8KKwkJLyogZGlzYWJsZSBhdXRvLWZhaWwgYmFjayAqLworCQlQcmVmUG9ydCA9IEFjdGl2ZTsKKwl9CisjZW5kaWYKKworCWlmIChwQUMtPlJsbXQuTmV0W05ldElkeF0uTGlua3NVcCA9PSAwKSB7CisJCS8qIExhc3QgbGluayB3ZW50IGRvd24gLSBzaHV0IGRvd24gdGhlIG5ldC4gKi8KKwkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlJsbXRTdGF0ZSA9IFNLX1JMTVRfUlNfTkVUX0RPV047CisJCVBhcmEuUGFyYTMyWzBdID0gU0tfUkxNVF9ORVRfRE9XTl9URU1QOworCQlQYXJhLlBhcmEzMlsxXSA9IE5ldElkeDsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9ORVRfRE9XTiwgUGFyYSk7CisKKwkJUGFyYS5QYXJhMzJbMF0gPSBwQUMtPlJsbXQuTmV0W05ldElkeF0uCisJCQlQb3J0W3BBQy0+UmxtdC5OZXRbTmV0SWR4XS5BY3RpdmVQb3J0XS0+UG9ydE51bWJlcjsKKwkJUGFyYS5QYXJhMzJbMV0gPSBOZXRJZHg7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUE5NSSwgU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfRE9XTiwgUGFyYSk7CisJCXJldHVybjsKKwl9CS8qIHBBQy0+UmxtdC5MaW5rc1VwID09IDAgKi8KKwllbHNlIGlmIChwQUMtPlJsbXQuTmV0W05ldElkeF0uTGlua3NVcCA9PSAxICYmCisJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5SbG10U3RhdGUgPT0gU0tfUkxNVF9SU19ORVRfRE9XTikgeworCQkvKiBGaXJzdCBsaW5rIGNhbWUgdXAgLSBnZXQgdGhlIG5ldCB1cC4gKi8KKwkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlJsbXRTdGF0ZSA9IFNLX1JMTVRfUlNfTkVUX1VQOworCisJCS8qCisJCSAqIElmIHBBQy0+UmxtdC5BY3RpdmVQb3J0ICE9IFBhcmEuUGFyYTMyWzBdLAorCQkgKiB0aGUgRFJWIHN3aXRjaGVzIHRvIHRoZSBwb3J0IHRoYXQgY2FtZSB1cC4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBwQUMtPlJsbXQuTmV0W05ldElkeF0uTnVtUG9ydHM7IGkrKykgeworCQkJaWYgKCFwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXS0+TGlua0Rvd24pIHsKKwkJCQlpZiAoIXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W0FjdGl2ZV0tPkxpbmtEb3duKSB7CisJCQkJCWkgPSBBY3RpdmU7CisJCQkJfQorCQkJCWlmICghcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbUHJlZlBvcnRdLT5MaW5rRG93bikgeworCQkJCQlpID0gUHJlZlBvcnQ7CisJCQkJfQorCQkJCVBvcnRGb3VuZCA9IFNLX1RSVUU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoUG9ydEZvdW5kKSB7CisJCQlQYXJhLlBhcmEzMlswXSA9IHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldLT5Qb3J0TnVtYmVyOworCQkJUGFyYS5QYXJhMzJbMV0gPSBOZXRJZHg7CisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1BOTUksIFNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX1VQLCBQYXJhKTsKKworCQkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLkFjdGl2ZVBvcnQgPSBpOworCQkJUGFyYS5QYXJhMzJbMF0gPSBwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXS0+UG9ydE51bWJlcjsKKwkJCVBhcmEuUGFyYTMyWzFdID0gTmV0SWR4OworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9ORVRfVVAsIFBhcmEpOworCisJCQlpZiAoKHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5SbG10TW9kZSAmIFNLX1JMTVRfVFJBTlNQQVJFTlQpID09IDAgJiYKKwkJCQkoUGFyYS5wUGFyYVB0ciA9IFNrUmxtdEJ1aWxkUGFja2V0KHBBQywgSW9DLAorCQkJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldLT5Qb3J0TnVtYmVyLAorCQkJCVNLX1BBQ0tFVF9BTk5PVU5DRSwgJnBBQy0+QWRkci5OZXRbTmV0SWR4XS4KKwkJCQlDdXJyZW50TWFjQWRkcmVzcywgJlNrUmxtdE1jQWRkcikpICE9IE5VTEwpIHsKKwkJCQkvKgorCQkJCSAqIFNlbmQgYW5ub3VuY2UgcGFja2V0IHRvIFJMTVQgbXVsdGljYXN0IGFkZHJlc3MgdG8gZm9yY2UKKwkJCQkgKiBzd2l0Y2hlcyB0byBsZWFybiB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZSBsb2dpY2FsIE1BQyBhZGRyZXNzLgorCQkJCSAqLworCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUkxNVF9TRU5ELCBQYXJhKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfUkxNVF9FMDA3LCBTS0VSUl9STE1UX0UwMDdfTVNHKTsKKwkJfQorCisJCXJldHVybjsKKwl9CS8qIExpbmtzVXAgPT0gMSAmJiBSbG10U3RhdGUgPT0gU0tfUkxNVF9SU19ORVRfRE9XTiAqLworCWVsc2UgewkvKiBDYW5ub3QgYmUgcmVhY2hlZCBpbiBkdWFsLW5ldCBtb2RlLiAqLworCQlQYXJhLlBhcmEzMlswXSA9IEFjdGl2ZTsKKworCQkvKgorCQkgKiBQcmVzZWxlY3Rpb246CisJCSAqCUlmIFJMTVQgTW9kZSAhPSBDaGVja0xpbmtTdGF0ZQorCQkgKgkJc2VsZWN0IHBvcnQgdGhhdCByZWNlaXZlZCBhIGJyb2FkY2FzdCBmcmFtZSBzdWJzdGFudGlhbGx5IGxhdGVyCisJCSAqCQl0aGFuIGFsbCBvdGhlciBwb3J0cworCQkgKgllbHNlIHNlbGVjdCBmaXJzdCBwb3J0IHRoYXQgaXMgbm90IFN1c3BlY3RSeAorCQkgKgllbHNlIHNlbGVjdCBmaXJzdCBwb3J0IHRoYXQgaXMgUG9ydFVwCisJCSAqCWVsc2Ugc2VsZWN0IHBvcnQgdGhhdCBpcyBQb3J0R29pbmdVcCBmb3IgdGhlIGxvbmdlc3QgdGltZQorCQkgKgllbHNlIHNlbGVjdCBmaXJzdCBwb3J0IHRoYXQgaXMgUG9ydERvd24KKwkJICoJZWxzZSBzdG9wLgorCQkgKgorCQkgKiBGb3IgdGhlIHByZXNlbGVjdGVkIHBvcnQ6CisJCSAqCUlmIEFjdGl2ZVBvcnQgaXMgZXF1YWwgaW4gcXVhbGl0eSwgc2VsZWN0IEFjdGl2ZVBvcnQuCisJCSAqCisJCSAqCUlmIFByZWZQb3J0IGlzIGVxdWFsIGluIHF1YWxpdHksIHNlbGVjdCBQcmVmUG9ydC4KKwkJICoKKwkJICoJSWYgQWN0aXZlUG9ydCAhPSBTZWxlY3RlZFBvcnQsCisJCSAqCQlJZiBvbGQgQWN0aXZlUG9ydCBpcyBMaW5rRG93biwKKwkJICoJCQlTd2l0Y2hIYXJkCisJCSAqCQllbHNlCisJCSAqCQkJU3dpdGNoU29mdAorCQkgKi8KKwkJLyogY2hlY2sgb2YgQ2hnQmNQcmlvIGZsYWcgYWRkZWQgKi8KKwkJaWYgKChwQUMtPlJsbXQuTmV0WzBdLlJsbXRNb2RlICE9IFNLX1JMTVRfTU9ERV9DTFMpICYmCisJCQkoIXBBQy0+UmxtdC5OZXRbMF0uQ2hnQmNQcmlvKSkgeworCQkJCisJCQlpZiAoIVBvcnRGb3VuZCkgeworCQkJCVBvcnRGb3VuZCA9IFNrUmxtdFNlbGVjdEJjUngoCisJCQkJCXBBQywgSW9DLCBBY3RpdmUsIFByZWZQb3J0LCAmUGFyYS5QYXJhMzJbMV0pOworCQkJfQorCisJCQlpZiAoIVBvcnRGb3VuZCkgeworCQkJCVBvcnRGb3VuZCA9IFNrUmxtdFNlbGVjdE5vdFN1c3BlY3QoCisJCQkJCXBBQywgSW9DLCBBY3RpdmUsIFByZWZQb3J0LCAmUGFyYS5QYXJhMzJbMV0pOworCQkJfQorCQl9CS8qIHBBQy0+UmxtdC5SbG10TW9kZSAhPSBTS19STE1UX01PREVfQ0xTICovCisKKwkJLyogd2l0aCBjaGFuZ2VkIHByaW9yaXR5IGZvciBsYXN0IGJyb2FkY2FzdCByZWNlaXZlZCAqLworCQlpZiAoKHBBQy0+UmxtdC5OZXRbMF0uUmxtdE1vZGUgIT0gU0tfUkxNVF9NT0RFX0NMUykgJiYKKwkJCShwQUMtPlJsbXQuTmV0WzBdLkNoZ0JjUHJpbykpIHsKKwkJCWlmICghUG9ydEZvdW5kKSB7CisJCQkJUG9ydEZvdW5kID0gU2tSbG10U2VsZWN0Tm90U3VzcGVjdCgKKwkJCQkJcEFDLCBJb0MsIEFjdGl2ZSwgUHJlZlBvcnQsICZQYXJhLlBhcmEzMlsxXSk7CisJCQl9CisKKwkJCWlmICghUG9ydEZvdW5kKSB7CisJCQkJUG9ydEZvdW5kID0gU2tSbG10U2VsZWN0QmNSeCgKKwkJCQkJcEFDLCBJb0MsIEFjdGl2ZSwgUHJlZlBvcnQsICZQYXJhLlBhcmEzMlsxXSk7CisJCQl9CisJCX0JLyogcEFDLT5SbG10LlJsbXRNb2RlICE9IFNLX1JMTVRfTU9ERV9DTFMgKi8KKworCQlpZiAoIVBvcnRGb3VuZCkgeworCQkJUG9ydEZvdW5kID0gU2tSbG10U2VsZWN0VXAoCisJCQkJcEFDLCBJb0MsIEFjdGl2ZSwgUHJlZlBvcnQsICZQYXJhLlBhcmEzMlsxXSwgQVVUT05FR19TVUNDRVNTKTsKKwkJfQorCisJCWlmICghUG9ydEZvdW5kKSB7CisJCQlQb3J0Rm91bmQgPSBTa1JsbXRTZWxlY3RVcCgKKwkJCQlwQUMsIElvQywgQWN0aXZlLCBQcmVmUG9ydCwgJlBhcmEuUGFyYTMyWzFdLCBBVVRPTkVHX0ZBSUxFRCk7CisJCX0KKworCQlpZiAoIVBvcnRGb3VuZCkgeworCQkJUG9ydEZvdW5kID0gU2tSbG10U2VsZWN0R29pbmdVcCgKKwkJCQlwQUMsIElvQywgQWN0aXZlLCBQcmVmUG9ydCwgJlBhcmEuUGFyYTMyWzFdLCBBVVRPTkVHX1NVQ0NFU1MpOworCQl9CisKKwkJaWYgKCFQb3J0Rm91bmQpIHsKKwkJCVBvcnRGb3VuZCA9IFNrUmxtdFNlbGVjdEdvaW5nVXAoCisJCQkJcEFDLCBJb0MsIEFjdGl2ZSwgUHJlZlBvcnQsICZQYXJhLlBhcmEzMlsxXSwgQVVUT05FR19GQUlMRUQpOworCQl9CisKKwkJaWYgKHBBQy0+UmxtdC5OZXRbMF0uUmxtdE1vZGUgIT0gU0tfUkxNVF9NT0RFX0NMUykgeworCQkJaWYgKCFQb3J0Rm91bmQpIHsKKwkJCQlQb3J0Rm91bmQgPSBTa1JsbXRTZWxlY3REb3duKHBBQywgSW9DLAorCQkJCQlBY3RpdmUsIFByZWZQb3J0LCAmUGFyYS5QYXJhMzJbMV0sIEFVVE9ORUdfU1VDQ0VTUyk7CisJCQl9CisKKwkJCWlmICghUG9ydEZvdW5kKSB7CisJCQkJUG9ydEZvdW5kID0gU2tSbG10U2VsZWN0RG93bihwQUMsIElvQywKKwkJCQkJQWN0aXZlLCBQcmVmUG9ydCwgJlBhcmEuUGFyYTMyWzFdLCBBVVRPTkVHX0ZBSUxFRCk7CisJCQl9CisJCX0JLyogcEFDLT5SbG10LlJsbXRNb2RlICE9IFNLX1JMTVRfTU9ERV9DTFMgKi8KKworCQlpZiAoUG9ydEZvdW5kKSB7CisKKwkJCWlmIChQYXJhLlBhcmEzMlsxXSAhPSBBY3RpdmUpIHsKKwkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJCQkoIkFjdGl2ZTogJWQsIFBhcmExOiAlZC5cbiIsIEFjdGl2ZSwgUGFyYS5QYXJhMzJbMV0pKQorCQkJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5BY3RpdmVQb3J0ID0gUGFyYS5QYXJhMzJbMV07CisJCQkJUGFyYS5QYXJhMzJbMF0gPSBwQUMtPlJsbXQuTmV0W05ldElkeF0uCisJCQkJCVBvcnRbUGFyYS5QYXJhMzJbMF1dLT5Qb3J0TnVtYmVyOworCQkJCVBhcmEuUGFyYTMyWzFdID0gcEFDLT5SbG10Lk5ldFtOZXRJZHhdLgorCQkJCQlQb3J0W1BhcmEuUGFyYTMyWzFdXS0+UG9ydE51bWJlcjsKKwkJCQlTS19IV0FDX0xJTktfTEVEKHBBQywgSW9DLCBQYXJhLlBhcmEzMlsxXSwgU0tfTEVEX0FDVElWRSk7CisJCQkJaWYgKHBBQy0+UmxtdC5Qb3J0W0FjdGl2ZV0uTGlua0Rvd24pIHsKKwkJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9TV0lUQ0hfSEFSRCwgUGFyYSk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlTS19IV0FDX0xJTktfTEVEKHBBQywgSW9DLCBQYXJhLlBhcmEzMlswXSwgU0tfTEVEX1NUQU5EQlkpOworCQkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1NXSVRDSF9TT0ZULCBQYXJhKTsKKwkJCQl9CisJCQkJUGFyYS5QYXJhMzJbMV0gPSBOZXRJZHg7CisJCQkJUGFyYS5QYXJhMzJbMF0gPQorCQkJCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtQYXJhLlBhcmEzMlswXV0tPlBvcnROdW1iZXI7CisJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9QTk1JLCBTS19QTk1JX0VWVF9STE1UX0FDVElWRV9ET1dOLCBQYXJhKTsKKwkJCQlQYXJhLlBhcmEzMlswXSA9IHBBQy0+UmxtdC5OZXRbTmV0SWR4XS4KKwkJCQkJUG9ydFtwQUMtPlJsbXQuTmV0W05ldElkeF0uQWN0aXZlUG9ydF0tPlBvcnROdW1iZXI7CisJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9QTk1JLCBTS19QTk1JX0VWVF9STE1UX0FDVElWRV9VUCwgUGFyYSk7CisJCQkJaWYgKChwQUMtPlJsbXQuTmV0W05ldElkeF0uUmxtdE1vZGUgJiBTS19STE1UX1RSQU5TUEFSRU5UKSA9PSAwICYmCisJCQkJCShQYXJhLnBQYXJhUHRyID0gU2tSbG10QnVpbGRQYWNrZXQocEFDLCBJb0MsIFBhcmEuUGFyYTMyWzBdLAorCQkJCQlTS19QQUNLRVRfQU5OT1VOQ0UsICZwQUMtPkFkZHIuTmV0W05ldElkeF0uQ3VycmVudE1hY0FkZHJlc3MsCisJCQkJCSZTa1JsbXRNY0FkZHIpKSAhPSBOVUxMKSB7CisJCQkJCS8qCisJCQkJCSAqIFNlbmQgYW5ub3VuY2UgcGFja2V0IHRvIFJMTVQgbXVsdGljYXN0IGFkZHJlc3MgdG8gZm9yY2UKKwkJCQkJICogc3dpdGNoZXMgdG8gbGVhcm4gdGhlIG5ldyBsb2NhdGlvbiBvZiB0aGUgbG9naWNhbAorCQkJCQkgKiBNQUMgYWRkcmVzcy4KKwkJCQkJICovCisJCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUkxNVF9TRU5ELCBQYXJhKTsKKwkJCQl9CS8qIChQYXJhLnBQYXJhUHRyID0gU2tSbG10QnVpbGRQYWNrZXQoLi4uKSkgIT0gTlVMTCAqLworCQkJfQkvKiBQYXJhLlBhcmEzMlsxXSAhPSBBY3RpdmUgKi8KKwkJfQkvKiBQb3J0Rm91bmQgKi8KKwkJZWxzZSB7CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX1JMTVRfRTAwNCwgU0tFUlJfUkxNVF9FMDA0X01TRyk7CisJCX0KKwl9CS8qIExpbmtzVXAgPiAxIHx8IExpbmtzVXAgPT0gMSAmJiBSbG10U3RhdGUgIT0gU0tfUkxNVF9SU19ORVRfRE9XTiAqLworCXJldHVybjsKK30JLyogU2tSbG10Q2hlY2tTd2l0Y2ggKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10Q2hlY2tTZWcgLSBSZXBvcnQgaWYgc2VnbWVudGF0aW9uIGlzIGRldGVjdGVkCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgY2hlY2tzIGlmIHRoZSBwb3J0cyBzZWUgZGlmZmVyZW50IHJvb3QgYnJpZGdlcyBhbmQgcmVwb3J0cworICoJc2VnbWVudGF0aW9uIGluIHN1Y2ggYSBjYXNlLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZy4KKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRDaGVja1NlZygKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMglOZXRJZHgpCS8qIE5ldCBudW1iZXIgKi8KK3sKKwlTS19FVlBBUkEJUGFyYTsKKwlTS19STE1UX05FVAkqcE5ldDsKKwlTS19VMzIJCWksIGo7CisJU0tfQk9PTAkJRXF1YWw7CisKKwlwTmV0ID0gJnBBQy0+UmxtdC5OZXRbTmV0SWR4XTsKKwlwTmV0LT5Sb290SWRTZXQgPSBTS19GQUxTRTsKKwlFcXVhbCA9IFNLX1RSVUU7CisKKwlmb3IgKGkgPSAwOyBpIDwgcE5ldC0+TnVtUG9ydHM7IGkrKykgeworCQlpZiAocE5ldC0+UG9ydFtpXS0+TGlua0Rvd24gfHwgIXBOZXQtPlBvcnRbaV0tPlJvb3RJZFNldCkgeworCQkJY29udGludWU7CisJCX0KKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9EVU1QLAorCQkJKCJSb290IElEICVkOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnguXG4iLCBpLAorCQkJCXBOZXQtPlBvcnRbaV0tPlJvb3QuSWRbMF0sIHBOZXQtPlBvcnRbaV0tPlJvb3QuSWRbMV0sCisJCQkJcE5ldC0+UG9ydFtpXS0+Um9vdC5JZFsyXSwgcE5ldC0+UG9ydFtpXS0+Um9vdC5JZFszXSwKKwkJCQlwTmV0LT5Qb3J0W2ldLT5Sb290LklkWzRdLCBwTmV0LT5Qb3J0W2ldLT5Sb290LklkWzVdLAorCQkJCXBOZXQtPlBvcnRbaV0tPlJvb3QuSWRbNl0sIHBOZXQtPlBvcnRbaV0tPlJvb3QuSWRbN10pKQorCisJCWlmICghcE5ldC0+Um9vdElkU2V0KSB7CisJCQlwTmV0LT5Sb290ID0gcE5ldC0+UG9ydFtpXS0+Um9vdDsKKwkJCXBOZXQtPlJvb3RJZFNldCA9IFNLX1RSVUU7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZvciAoaiA9IDA7IGogPCA4OyBqICsrKSB7CisJCQlFcXVhbCAmPSBwTmV0LT5Qb3J0W2ldLT5Sb290LklkW2pdID09IHBOZXQtPlJvb3QuSWRbal07CisJCQlpZiAoIUVxdWFsKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJCisJCWlmICghRXF1YWwpIHsKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9DT01NLCBTS0VSUl9STE1UX0UwMDUsIFNLRVJSX1JMTVRfRTAwNV9NU0cpOworCQkJUGFyYS5QYXJhMzJbMF0gPSBOZXRJZHg7CisJCQlQYXJhLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1BOTUksIFNLX1BOTUlfRVZUX1JMTVRfU0VHTUVOVEFUSU9OLCBQYXJhKTsKKworCQkJcE5ldC0+Q2hlY2tpbmdTdGF0ZSAmPSB+U0tfUkxNVF9SQ1NfUkVQT1JUX1NFRzsKKworCQkJLyogMjAwMC0wMy0wNiBSQTogTmV3LiAqLworCQkJUGFyYS5QYXJhMzJbMF0gPSBOZXRJZHg7CisJCQlQYXJhLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwTmV0LT5TZWdUaW1lciwgU0tfUkxNVF9TRUdfVE9fVkFMLAorCQkJCVNLR0VfUkxNVCwgU0tfUkxNVF9TRUdfVElNLCBQYXJhKTsKKwkJCWJyZWFrOworCQl9CisJfQkvKiBmb3IgKGkgPSAwOyBpIDwgcE5ldC0+TnVtUG9ydHM7IGkrKykgKi8KKworCS8qIDIwMDAtMDMtMDYgUkE6IE1vdmVkIGhlcmUuICovCisJLyogU2VnbWVudGF0aW9uIGNoZWNrIG5vdCBydW5uaW5nIGFueW1vcmUuICovCisJcE5ldC0+Q2hlY2tpbmdTdGF0ZSAmPSB+U0tfUkxNVF9SQ1NfU0VHOworCit9CS8qIFNrUmxtdENoZWNrU2VnICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdFBvcnRTdGFydCAtIGluaXRpYWxpemUgcG9ydCB2YXJpYWJsZXMgYW5kIHN0YXJ0IHBvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBpbml0aWFsaXplcyBhIHBvcnQncyB2YXJpYWJsZXMgYW5kIGlzc3VlcyBhIFBPUlRfU1RBUlQKKyAqCXRvIHRoZSBIV0FDIG1vZHVsZS4gIFRoaXMgaGFuZGxlcyByZXRyaWVzIGlmIHRoZSBzdGFydCBmYWlscyBvciB0aGUKKyAqCWxpbmsgZXZlbnR1YWxseSBnb2VzIGRvd24uCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10UG9ydFN0YXJ0KAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJUG9ydE51bWJlcikJLyogUG9ydCBudW1iZXIgKi8KK3sKKwlTS19FVlBBUkEJUGFyYTsKKworCXBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLlBvcnRTdGF0ZSA9IFNLX1JMTVRfUFNfTElOS19ET1dOOworCXBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLlBvcnRTdGFydGVkID0gU0tfVFJVRTsKKwlwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5MaW5rRG93biA9IFNLX1RSVUU7CisJcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uUG9ydERvd24gPSBTS19UUlVFOworCXBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLkNoZWNraW5nU3RhdGUgPSAwOworCXBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLlJvb3RJZFNldCA9IFNLX0ZBTFNFOworCVBhcmEuUGFyYTMyWzBdID0gUG9ydE51bWJlcjsKKwlQYXJhLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9IV0FDLCBTS19IV0VWX1BPUlRfU1RBUlQsIFBhcmEpOworfQkvKiBTa1JsbXRQb3J0U3RhcnQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0UG9ydFN0YXJ0VGltIC0gUE9SVF9TVEFSVF9USU0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIFBPUlRfU1RBUlRfVElNIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dFBvcnRTdGFydFRpbSgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBQb3J0TnVtYmVyOyBTS19VMzIgLTEgKi8KK3sKKwlTS19VMzIJCQlpOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1BPUlRTVEFSVF9USU1FT1VUIFBvcnQgJWQgRXZlbnQgQkVHSU4uXG4iLCBQYXJhLlBhcmEzMlswXSkpCisKKwkJaWYgKFBhcmEuUGFyYTMyWzFdICE9IChTS19VMzIpLTEpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIFBhcmFtZXRlci5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1BPUlRTVEFSVF9USU1FT1VUIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFVzZWQgdG8gc3RhcnQgbm9uLXByZWZlcnJlZCBwb3J0cyBpZiB0aGUgcHJlZmVycmVkIG9uZQorCSAqIGRvZXMgbm90IGNvbWUgdXAuCisJICogVGhpcyB0aW1lb3V0IG5lZWRzIG9ubHkgYmUgc2V0IHdoZW4gc3RhcnRpbmcgdGhlIGZpcnN0CisJICogKHByZWZlcnJlZCkgcG9ydC4KKwkgKi8KKwlpZiAocEFDLT5SbG10LlBvcnRbUGFyYS5QYXJhMzJbMF1dLkxpbmtEb3duKSB7CisJCS8qIFBPUlRfU1RBUlQgZmFpbGVkLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgcEFDLT5SbG10LlBvcnRbUGFyYS5QYXJhMzJbMF1dLk5ldC0+TnVtUG9ydHM7IGkrKykgeworCQkJaWYgKCFwQUMtPlJsbXQuUG9ydFtQYXJhLlBhcmEzMlswXV0uTmV0LT5Qb3J0W2ldLT5Qb3J0U3RhcnRlZCkgeworCQkJCVNrUmxtdFBvcnRTdGFydChwQUMsIElvQywKKwkJCQkJcEFDLT5SbG10LlBvcnRbUGFyYS5QYXJhMzJbMF1dLk5ldC0+UG9ydFtpXS0+UG9ydE51bWJlcik7CisJCQl9CisJCX0KKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfUE9SVFNUQVJUX1RJTUVPVVQgRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdEV2dFBvcnRTdGFydFRpbSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRMaW5rVXAgLSBMSU5LX1VQCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBMTElOS19VUCBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRMaW5rVXAoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgUG9ydE51bWJlcjsgU0tfVTMyIFVuZGVmaW5lZCAqLworeworCVNLX1UzMgkJCWk7CisJU0tfUkxNVF9QT1JUCSpwUlBvcnQ7CisJU0tfRVZQQVJBCQlQYXJhMjsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9MSU5LX1VQIFBvcnQgJWQgRXZlbnQgQkVHSU4uXG4iLCBQYXJhLlBhcmEzMlswXSkpCisKKwlwUlBvcnQgPSAmcEFDLT5SbG10LlBvcnRbUGFyYS5QYXJhMzJbMF1dOworCWlmICghcFJQb3J0LT5Qb3J0U3RhcnRlZCkgeworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX1JMTVRfRTAwOCwgU0tFUlJfUkxNVF9FMDA4X01TRyk7CisKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlNLX1JMTVRfTElOS19VUCBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJaWYgKCFwUlBvcnQtPkxpbmtEb3duKSB7CisJCS8qIFJBOzo7OiBBbnkgYmV0dGVyIHNvbHV0aW9uPyAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX0xJTktfVVAgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcFJQb3J0LT5VcFRpbWVyKTsKKwlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBSUG9ydC0+RG93blJ4VGltZXIpOworCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcFJQb3J0LT5Eb3duVHhUaW1lcik7CisKKwkvKiBEbyBzb21ldGhpbmcgaWYgdGltZXIgYWxyZWFkeSBmaXJlZD8gKi8KKworCXBSUG9ydC0+TGlua0Rvd24gPSBTS19GQUxTRTsKKwlwUlBvcnQtPlBvcnRTdGF0ZSA9IFNLX1JMTVRfUFNfR09JTkdfVVA7CisJcFJQb3J0LT5HdVRpbWVTdGFtcCA9IFNrT3NHZXRUaW1lKHBBQyk7CisJcFJQb3J0LT5CY1RpbWVTdGFtcCA9IDA7CisJcFJQb3J0LT5OZXQtPkxpbmtzVXArKzsKKwlpZiAocFJQb3J0LT5OZXQtPkxpbmtzVXAgPT0gMSkgeworCQlTS19IV0FDX0xJTktfTEVEKHBBQywgSW9DLCBQYXJhLlBhcmEzMlswXSwgU0tfTEVEX0FDVElWRSk7CisJfQorCWVsc2UgeworCQlTS19IV0FDX0xJTktfTEVEKHBBQywgSW9DLCBQYXJhLlBhcmEzMlswXSwgU0tfTEVEX1NUQU5EQlkpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwUlBvcnQtPk5ldC0+TnVtUG9ydHM7IGkrKykgeworCQlpZiAoIXBSUG9ydC0+TmV0LT5Qb3J0W2ldLT5Qb3J0U3RhcnRlZCkgeworCQkJU2tSbG10UG9ydFN0YXJ0KHBBQywgSW9DLCBwUlBvcnQtPk5ldC0+UG9ydFtpXS0+UG9ydE51bWJlcik7CisJCX0KKwl9CisKKwlTa1JsbXRDaGVja1N3aXRjaChwQUMsIElvQywgcFJQb3J0LT5OZXQtPk5ldE51bWJlcik7CisKKwlpZiAocFJQb3J0LT5OZXQtPkxpbmtzVXAgPj0gMikgeworCQlpZiAocFJQb3J0LT5OZXQtPlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19MT0NfTElOSykgeworCQkJLyogQnVpbGQgdGhlIGNoZWNrIGNoYWluLiAqLworCQkJU2tSbG10QnVpbGRDaGVja0NoYWluKHBBQywgcFJQb3J0LT5OZXQtPk5ldE51bWJlcik7CisJCX0KKwl9CisKKwkvKiBJZiB0aGUgZmlyc3QgbGluayBjb21lcyB1cCwgc3RhcnQgdGhlIHBlcmlvZGljYWwgUkxNVCB0aW1lb3V0LiAqLworCWlmIChwUlBvcnQtPk5ldC0+TnVtUG9ydHMgPiAxICYmIHBSUG9ydC0+TmV0LT5MaW5rc1VwID09IDEgJiYKKwkJKHBSUG9ydC0+TmV0LT5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfT1RIRVJTKSAhPSAwKSB7CisJCVBhcmEyLlBhcmEzMlswXSA9IHBSUG9ydC0+TmV0LT5OZXROdW1iZXI7CisJCVBhcmEyLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBSUG9ydC0+TmV0LT5Mb2NUaW1lciwKKwkJCXBSUG9ydC0+TmV0LT5UaW1lb3V0VmFsdWUsIFNLR0VfUkxNVCwgU0tfUkxNVF9USU0sIFBhcmEyKTsKKwl9CisKKwlQYXJhMiA9IFBhcmE7CisJUGFyYTIuUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwUlBvcnQtPlVwVGltZXIsIFNLX1JMTVRfUE9SVFVQX1RJTV9WQUwsCisJCVNLR0VfUkxNVCwgU0tfUkxNVF9QT1JUVVBfVElNLCBQYXJhMik7CisJCisJLyogTGF0ZXI6IGlmIChwQUMtPlJsbXQuUmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX0xPQ19MSU5LKSAmJiAqLworCWlmICgocFJQb3J0LT5OZXQtPlJsbXRNb2RlICYgU0tfUkxNVF9UUkFOU1BBUkVOVCkgPT0gMCAmJgorCQkocFJQb3J0LT5OZXQtPlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19MSU5LKSAhPSAwICYmCisJCShQYXJhMi5wUGFyYVB0ciA9CisJCQlTa1JsbXRCdWlsZFBhY2tldChwQUMsIElvQywgUGFyYS5QYXJhMzJbMF0sIFNLX1BBQ0tFVF9BTk5PVU5DRSwKKwkJCSZwQUMtPkFkZHIuUG9ydFtQYXJhLlBhcmEzMlswXV0uQ3VycmVudE1hY0FkZHJlc3MsICZTa1JsbXRNY0FkZHIpCisJCSkgIT0gTlVMTCkgeworCQkvKiBTZW5kICJuZXciIHBhY2tldCB0byBSTE1UIG11bHRpY2FzdCBhZGRyZXNzLiAqLworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1JMTVRfU0VORCwgUGFyYTIpOworCX0KKworCWlmIChwUlBvcnQtPk5ldC0+UmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX1NFRykgeworCQlpZiAoKFBhcmEyLnBQYXJhUHRyID0KKwkJCVNrUmxtdEJ1aWxkU3Bhbm5pbmdUcmVlUGFja2V0KHBBQywgSW9DLCBQYXJhLlBhcmEzMlswXSkpICE9IE5VTEwpIHsKKwkJCXBBQy0+UmxtdC5Qb3J0W1BhcmEuUGFyYTMyWzBdXS5Sb290SWRTZXQgPSBTS19GQUxTRTsKKwkJCXBSUG9ydC0+TmV0LT5DaGVja2luZ1N0YXRlIHw9CisJCQkJU0tfUkxNVF9SQ1NfU0VHIHwgU0tfUkxNVF9SQ1NfUkVQT1JUX1NFRzsKKworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9STE1UX1NFTkQsIFBhcmEyKTsKKworCQkJUGFyYS5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCQkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcFJQb3J0LT5OZXQtPlNlZ1RpbWVyLAorCQkJCVNLX1JMTVRfU0VHX1RPX1ZBTCwgU0tHRV9STE1ULCBTS19STE1UX1NFR19USU0sIFBhcmEpOworCQl9CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX0xJTktfVVAgRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdEV2dExpbmtVcCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRQb3J0VXBUaW0gLSBQT1JUX1VQX1RJTQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgUE9SVF9VUF9USU0gZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0UG9ydFVwVGltKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIFBvcnROdW1iZXI7IFNLX1UzMiAtMSAqLworeworCVNLX1JMTVRfUE9SVAkqcFJQb3J0OworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1BPUlRVUF9USU0gUG9ydCAlZCBFdmVudCBCRUdJTi5cbiIsIFBhcmEuUGFyYTMyWzBdKSkKKworCWlmIChQYXJhLlBhcmEzMlsxXSAhPSAoU0tfVTMyKS0xKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBQYXJhbWV0ZXIuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9QT1JUVVBfVElNIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlwUlBvcnQgPSAmcEFDLT5SbG10LlBvcnRbUGFyYS5QYXJhMzJbMF1dOworCWlmIChwUlBvcnQtPkxpbmtEb3duIHx8IChwUlBvcnQtPlBvcnRTdGF0ZSA9PSBTS19STE1UX1BTX1VQKSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1BPUlRVUF9USU0gUG9ydCAlZCBFdmVudCBFTVBUWS5cbiIsIFBhcmEuUGFyYTMyWzBdKSkKKwkJcmV0dXJuOworCX0KKworCXBSUG9ydC0+UG9ydERvd24gPSBTS19GQUxTRTsKKwlwUlBvcnQtPlBvcnRTdGF0ZSA9IFNLX1JMTVRfUFNfVVA7CisJcFJQb3J0LT5OZXQtPlBvcnRzVXArKzsKKwlpZiAocFJQb3J0LT5OZXQtPlJsbXRTdGF0ZSAhPSBTS19STE1UX1JTX0lOSVQpIHsKKwkJaWYgKHBBQy0+UmxtdC5OdW1OZXRzIDw9IDEpIHsKKwkJCVNrUmxtdENoZWNrU3dpdGNoKHBBQywgSW9DLCBwUlBvcnQtPk5ldC0+TmV0TnVtYmVyKTsKKwkJfQorCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1BOTUksIFNLX1BOTUlfRVZUX1JMTVRfUE9SVF9VUCwgUGFyYSk7CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1BPUlRVUF9USU0gRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdEV2dFBvcnRVcFRpbSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRQb3J0RG93blRpbSAtIFBPUlRfRE9XTl8qCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBQT1JUX0RPV05fKiBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRQb3J0RG93blgoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMgkJRXZlbnQsCS8qIEV2ZW50IGNvZGUgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgUG9ydE51bWJlcjsgU0tfVTMyIC0xICovCit7CisJU0tfUkxNVF9QT1JUCSpwUlBvcnQ7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfUE9SVERPV04qIFBvcnQgJWQgRXZlbnQgKCVkKSBCRUdJTi5cbiIsCisJCQlQYXJhLlBhcmEzMlswXSwgRXZlbnQpKQorCisJaWYgKFBhcmEuUGFyYTMyWzFdICE9IChTS19VMzIpLTEpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIFBhcmFtZXRlci5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1BPUlRET1dOKiBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJcFJQb3J0ID0gJnBBQy0+UmxtdC5Qb3J0W1BhcmEuUGFyYTMyWzBdXTsKKwlpZiAoIXBSUG9ydC0+UG9ydFN0YXJ0ZWQgfHwgKEV2ZW50ID09IFNLX1JMTVRfUE9SVERPV05fVFhfVElNICYmCisJCSEocFJQb3J0LT5DaGVja2luZ1N0YXRlICYgU0tfUkxNVF9QQ1NfVFgpKSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1BPUlRET1dOKiBFdmVudCAoJWQpIEVNUFRZLlxuIiwgRXZlbnQpKQorCQlyZXR1cm47CisJfQorCQorCS8qIFN0b3AgcG9ydCdzIHRpbWVycy4gKi8KKwlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBSUG9ydC0+VXBUaW1lcik7CisJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwUlBvcnQtPkRvd25SeFRpbWVyKTsKKwlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBSUG9ydC0+RG93blR4VGltZXIpOworCisJaWYgKHBSUG9ydC0+UG9ydFN0YXRlICE9IFNLX1JMTVRfUFNfTElOS19ET1dOKSB7CisJCXBSUG9ydC0+UG9ydFN0YXRlID0gU0tfUkxNVF9QU19ET1dOOworCX0KKworCWlmICghcFJQb3J0LT5Qb3J0RG93bikgeworCQlwUlBvcnQtPk5ldC0+UG9ydHNVcC0tOworCQlwUlBvcnQtPlBvcnREb3duID0gU0tfVFJVRTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9QTk1JLCBTS19QTk1JX0VWVF9STE1UX1BPUlRfRE9XTiwgUGFyYSk7CisJfQorCisJcFJQb3J0LT5QYWNrZXRzUGVyVGltZVNsb3QgPSAwOworCS8qIHBSUG9ydC0+RGF0YVBhY2tldHNQZXJUaW1lU2xvdCA9IDA7ICovCisJcFJQb3J0LT5CcGR1UGFja2V0c1BlclRpbWVTbG90ID0gMDsKKwlwUlBvcnQtPkJjVGltZVN0YW1wID0gMDsKKworCS8qCisJICogUkE7Ojs6IFRvIGJlIGNoZWNrZWQ6CisJICogLSBhY3Rpb25zIGF0IFJMTVRfU1RPUDogV2Ugc2hvdWxkIG5vdCBzd2l0Y2ggYW55bW9yZS4KKwkgKi8KKwlpZiAocFJQb3J0LT5OZXQtPlJsbXRTdGF0ZSAhPSBTS19STE1UX1JTX0lOSVQpIHsKKwkJaWYgKFBhcmEuUGFyYTMyWzBdID09CisJCQlwUlBvcnQtPk5ldC0+UG9ydFtwUlBvcnQtPk5ldC0+QWN0aXZlUG9ydF0tPlBvcnROdW1iZXIpIHsKKwkJCS8qIEFjdGl2ZSBQb3J0IHdlbnQgZG93bi4gKi8KKwkJCVNrUmxtdENoZWNrU3dpdGNoKHBBQywgSW9DLCBwUlBvcnQtPk5ldC0+TmV0TnVtYmVyKTsKKwkJfQorCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9QT1JURE9XTiogRXZlbnQgKCVkKSBFTkQuXG4iLCBFdmVudCkpCit9CS8qIFNrUmxtdEV2dFBvcnREb3duWCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRMaW5rRG93biAtIExJTktfRE9XTgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgTElOS19ET1dOIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dExpbmtEb3duKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIFBvcnROdW1iZXI7IFNLX1UzMiBVbmRlZmluZWQgKi8KK3sKKwlTS19STE1UX1BPUlQJKnBSUG9ydDsKKworCXBSUG9ydCA9ICZwQUMtPlJsbXQuUG9ydFtQYXJhLlBhcmEzMlswXV07CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX0xJTktfRE9XTiBQb3J0ICVkIEV2ZW50IEJFR0lOLlxuIiwgUGFyYS5QYXJhMzJbMF0pKQorCisJaWYgKCFwQUMtPlJsbXQuUG9ydFtQYXJhLlBhcmEzMlswXV0uTGlua0Rvd24pIHsKKwkJcFJQb3J0LT5OZXQtPkxpbmtzVXAtLTsKKwkJcFJQb3J0LT5MaW5rRG93biA9IFNLX1RSVUU7CisJCXBSUG9ydC0+UG9ydFN0YXRlID0gU0tfUkxNVF9QU19MSU5LX0RPV047CisJCVNLX0hXQUNfTElOS19MRUQocEFDLCBJb0MsIFBhcmEuUGFyYTMyWzBdLCBTS19MRURfT0ZGKTsKKworCQlpZiAoKHBSUG9ydC0+TmV0LT5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTkspICE9IDApIHsKKwkJCS8qIEJ1aWxkIHRoZSBjaGVjayBjaGFpbi4gKi8KKwkJCVNrUmxtdEJ1aWxkQ2hlY2tDaGFpbihwQUMsIHBSUG9ydC0+TmV0LT5OZXROdW1iZXIpOworCQl9CisKKwkJLyogRW5zdXJlIHRoYXQgcG9ydCBpcyBtYXJrZWQgZG93bi4gKi8KKwkJUGFyYS5QYXJhMzJbMV0gPSAtMTsKKwkJKHZvaWQpU2tSbG10RXZlbnQocEFDLCBJb0MsIFNLX1JMTVRfUE9SVERPV04sIFBhcmEpOworCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9MSU5LX0RPV04gRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdEV2dExpbmtEb3duICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dFBvcnRBZGRyIC0gUE9SVF9BRERSCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBQT1JUX0FERFIgZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0UG9ydEFkZHIoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgUG9ydE51bWJlcjsgU0tfVTMyIC0xICovCit7CisJU0tfVTMyCQkJaSwgajsKKwlTS19STE1UX1BPUlQJKnBSUG9ydDsKKwlTS19NQUNfQUREUgkJKnBPbGRNYWNBZGRyOworCVNLX01BQ19BRERSCQkqcE5ld01hY0FkZHI7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfUE9SVF9BRERSIFBvcnQgJWQgRXZlbnQgQkVHSU4uXG4iLCBQYXJhLlBhcmEzMlswXSkpCisKKwlpZiAoUGFyYS5QYXJhMzJbMV0gIT0gKFNLX1UzMiktMSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgUGFyYW1ldGVyLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfUE9SVF9BRERSIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwkvKiBQb3J0J3MgcGh5c2ljYWwgTUFDIGFkZHJlc3MgY2hhbmdlZC4gKi8KKwlwT2xkTWFjQWRkciA9ICZwQUMtPkFkZHIuUG9ydFtQYXJhLlBhcmEzMlswXV0uUHJldmlvdXNNYWNBZGRyZXNzOworCXBOZXdNYWNBZGRyID0gJnBBQy0+QWRkci5Qb3J0W1BhcmEuUGFyYTMyWzBdXS5DdXJyZW50TWFjQWRkcmVzczsKKworCS8qCisJICogTk9URTogVGhpcyBpcyBub3Qgc2NhbGFibGUgZm9yIHNvbHV0aW9ucyB3aGVyZSBwb3J0cyBhcmUKKwkgKgkgY2hlY2tlZCByZW1vdGVseS4gIFRoZXJlLCB3ZSBuZWVkIHRvIHNlbmQgYW4gUkxNVAorCSAqCSBhZGRyZXNzIGNoYW5nZSBwYWNrZXQgLSBhbmQgaG93IGRvIHdlIGVuc3VyZSBkZWxpdmVyeT8KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKFNLX1UzMilwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlwUlBvcnQgPSAmcEFDLT5SbG10LlBvcnRbaV07CisJCWZvciAoaiA9IDA7IGogPCBwUlBvcnQtPlBvcnRzQ2hlY2tlZDsgaisrKSB7CisJCQlpZiAoU0tfQUREUl9FUVVBTCgKKwkJCQlwUlBvcnQtPlBvcnRDaGVja1tqXS5DaGVja0FkZHIuYSwgcE9sZE1hY0FkZHItPmEpKSB7CisJCQkJcFJQb3J0LT5Qb3J0Q2hlY2tbal0uQ2hlY2tBZGRyID0gKnBOZXdNYWNBZGRyOworCQkJfQorCQl9CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9QT1JUX0FERFIgRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdEV2dFBvcnRBZGRyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dFN0YXJ0IC0gU1RBUlQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIFNUQVJUIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dFN0YXJ0KAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIE5ldE51bWJlcjsgU0tfVTMyIC0xICovCit7CisJU0tfRVZQQVJBCVBhcmEyOworCVNLX1UzMgkJUG9ydElkeDsKKwlTS19VMzIJCVBvcnROdW1iZXI7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfU1RBUlQgTmV0ICVkIEV2ZW50IEJFR0lOLlxuIiwgUGFyYS5QYXJhMzJbMF0pKQorCisJaWYgKFBhcmEuUGFyYTMyWzFdICE9IChTS19VMzIpLTEpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIFBhcmFtZXRlci5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NUQVJUIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlpZiAoUGFyYS5QYXJhMzJbMF0gPj0gcEFDLT5SbG10Lk51bU5ldHMpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIE5ldE51bWJlciAlZC5cbiIsIFBhcmEuUGFyYTMyWzBdKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TVEFSVCBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJaWYgKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlJsbXRTdGF0ZSAhPSBTS19STE1UX1JTX0lOSVQpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TVEFSVCBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJaWYgKHBBQy0+UmxtdC5OZXRzU3RhcnRlZCA+PSBwQUMtPlJsbXQuTnVtTmV0cykgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJBbGwgbmV0cyBzaG91bGQgaGF2ZSBiZWVuIHN0YXJ0ZWQuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TVEFSVCBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJaWYgKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlByZWZQb3J0ID49CisJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLk51bVBvcnRzKSB7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfUkxNVF9FMDA5LCBTS0VSUl9STE1UX0UwMDlfTVNHKTsKKworCQkvKiBDaGFuZ2UgUHJlZlBvcnQgdG8gaW50ZXJuYWwgZGVmYXVsdC4gKi8KKwkJUGFyYTIuUGFyYTMyWzBdID0gMHhGRkZGRkZGRjsKKwkJUGFyYTIuUGFyYTMyWzFdID0gUGFyYS5QYXJhMzJbMF07CisJCSh2b2lkKVNrUmxtdEV2ZW50KHBBQywgSW9DLCBTS19STE1UX1BSRUZQT1JUX0NIQU5HRSwgUGFyYTIpOworCX0KKworCVBvcnRJZHggPSBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5QcmVmUG9ydDsKKwlQb3J0TnVtYmVyID0gcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUG9ydFtQb3J0SWR4XS0+UG9ydE51bWJlcjsKKworCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLkxpbmtzVXAgPSAwOworCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlBvcnRzVXAgPSAwOworCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLkNoZWNraW5nU3RhdGUgPSAwOworCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlJsbXRTdGF0ZSA9IFNLX1JMTVRfUlNfTkVUX0RPV047CisKKwkvKiBTdGFydCBwcmVmZXJyZWQgcG9ydC4gKi8KKwlTa1JsbXRQb3J0U3RhcnQocEFDLCBJb0MsIFBvcnROdW1iZXIpOworCisJLyogU3RhcnQgVGltZXIgKGZvciBmaXJzdCBwb3J0IG9ubHkpLiAqLworCVBhcmEyLlBhcmEzMlswXSA9IFBvcnROdW1iZXI7CisJUGFyYTIuUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5VcFRpbWVyLAorCQlTS19STE1UX1BPUlRTVEFSVF9USU1fVkFMLCBTS0dFX1JMTVQsIFNLX1JMTVRfUE9SVFNUQVJUX1RJTSwgUGFyYTIpOworCisJcEFDLT5SbG10Lk5ldHNTdGFydGVkKys7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NUQVJUIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRFdnRTdGFydCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRTdG9wIC0gU1RPUAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgU1RPUCBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRTdG9wKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIE5ldE51bWJlcjsgU0tfVTMyIC0xICovCit7CisJU0tfRVZQQVJBCVBhcmEyOworCVNLX1UzMgkJUG9ydE51bWJlcjsKKwlTS19VMzIJCWk7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfU1RPUCBOZXQgJWQgRXZlbnQgQkVHSU4uXG4iLCBQYXJhLlBhcmEzMlswXSkpCisKKwlpZiAoUGFyYS5QYXJhMzJbMV0gIT0gKFNLX1UzMiktMSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgUGFyYW1ldGVyLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU1RPUCBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJaWYgKFBhcmEuUGFyYTMyWzBdID49IHBBQy0+UmxtdC5OdW1OZXRzKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBOZXROdW1iZXIgJWQuXG4iLCBQYXJhLlBhcmEzMlswXSkpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU1RPUCBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJaWYgKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlJsbXRTdGF0ZSA9PSBTS19STE1UX1JTX0lOSVQpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TVE9QIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlpZiAocEFDLT5SbG10Lk5ldHNTdGFydGVkID09IDApIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQWxsIG5ldHMgYXJlIHN0b3BwZWQuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TVE9QIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwkvKiBTdG9wIFJMTVQgdGltZXJzLiAqLworCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uTG9jVGltZXIpOworCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uU2VnVGltZXIpOworCisJLyogU3RvcCBuZXQuICovCisJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUmxtdFN0YXRlID0gU0tfUkxNVF9SU19JTklUOworCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlJvb3RJZFNldCA9IFNLX0ZBTFNFOworCVBhcmEyLlBhcmEzMlswXSA9IFNLX1JMTVRfTkVUX0RPV05fRklOQUw7CisJUGFyYTIuUGFyYTMyWzFdID0gUGFyYS5QYXJhMzJbMF07CQkJLyogTmV0IyAqLworCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfTkVUX0RPV04sIFBhcmEyKTsKKworCS8qIFN0b3AgcG9ydHMuICovCisJZm9yIChpID0gMDsgaSA8IHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLk51bVBvcnRzOyBpKyspIHsKKwkJUG9ydE51bWJlciA9IHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlBvcnRbaV0tPlBvcnROdW1iZXI7CisJCWlmIChwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5Qb3J0U3RhdGUgIT0gU0tfUkxNVF9QU19JTklUKSB7CisJCQlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLlVwVGltZXIpOworCQkJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5Eb3duUnhUaW1lcik7CisJCQlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLkRvd25UeFRpbWVyKTsKKworCQkJcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uUG9ydFN0YXRlID0gU0tfUkxNVF9QU19JTklUOworCQkJcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uUm9vdElkU2V0ID0gU0tfRkFMU0U7CisJCQlwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5Qb3J0U3RhcnRlZCA9IFNLX0ZBTFNFOworCQkJUGFyYTIuUGFyYTMyWzBdID0gUG9ydE51bWJlcjsKKwkJCVBhcmEyLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0hXQUMsIFNLX0hXRVZfUE9SVF9TVE9QLCBQYXJhMik7CisJCX0KKwl9CisKKwlwQUMtPlJsbXQuTmV0c1N0YXJ0ZWQtLTsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9TVE9QIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRFdnRTdG9wICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dFRpbSAtIFRJTQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgVElNIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dFRpbSgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBOZXROdW1iZXI7IFNLX1UzMiAtMSAqLworeworCVNLX1JMTVRfUE9SVAkqcFJQb3J0OworCVNLX1UzMgkJCVRpbWVvdXQ7CisJU0tfVTMyCQkJTmV3VGltZW91dDsKKwlTS19VMzIJCQlQb3J0TnVtYmVyOworCVNLX1UzMgkJCWk7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfVElNIEV2ZW50IEJFR0lOLlxuIikpCisKKwlpZiAoUGFyYS5QYXJhMzJbMV0gIT0gKFNLX1UzMiktMSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgUGFyYW1ldGVyLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfVElNIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlpZiAoKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19PVEhFUlMpID09IDAgfHwKKwkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uTGlua3NVcCA9PSAwKSB7CisJCS8qIE1vZGUgY2hhbmdlZCBvciBhbGwgbGlua3MgZG93bjogTm8gbW9yZSBsaW5rIGNoZWNraW5nLiAqLworCQlyZXR1cm47CisJfQorCisjaWYgMAorCXBBQy0+UmxtdC5Td2l0Y2hDaGVja0NvdW50ZXItLTsKKwlpZiAocEFDLT5SbG10LlN3aXRjaENoZWNrQ291bnRlciA9PSAwKSB7CisJCXBBQy0+UmxtdC5Td2l0Y2hDaGVja0NvdW50ZXI7CisJfQorI2VuZGlmCS8qIDAgKi8KKworCU5ld1RpbWVvdXQgPSBTS19STE1UX0RFRl9UT19WQUw7CisJZm9yIChpID0gMDsgaSA8IHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLk51bVBvcnRzOyBpKyspIHsKKwkJUG9ydE51bWJlciA9IHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlBvcnRbaV0tPlBvcnROdW1iZXI7CisJCXBSUG9ydCA9ICZwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXTsKKwkJaWYgKCFwUlBvcnQtPkxpbmtEb3duKSB7CisJCQlUaW1lb3V0ID0gU2tSbG10Q2hlY2tQb3J0KHBBQywgSW9DLCBQb3J0TnVtYmVyKTsKKwkJCWlmIChUaW1lb3V0IDwgTmV3VGltZW91dCkgeworCQkJCU5ld1RpbWVvdXQgPSBUaW1lb3V0OworCQkJfQorCisJCQkvKgorCQkJICogVGhlc2UgY291bnRlcnMgc2hvdWxkIGJlIHNldCB0byAwIGZvciBhbGwgcG9ydHMgYmVmb3JlIHRoZQorCQkJICogZmlyc3QgZnJhbWUgaXMgc2VudCBpbiB0aGUgbmV4dCBsb29wLgorCQkJICovCisJCQlwUlBvcnQtPlBhY2tldHNQZXJUaW1lU2xvdCA9IDA7CisJCQkvKiBwUlBvcnQtPkRhdGFQYWNrZXRzUGVyVGltZVNsb3QgPSAwOyAqLworCQkJcFJQb3J0LT5CcGR1UGFja2V0c1BlclRpbWVTbG90ID0gMDsKKwkJfQorCX0KKwlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5UaW1lb3V0VmFsdWUgPSBOZXdUaW1lb3V0OworCisJaWYgKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLkxpbmtzVXAgPiAxKSB7CisJCS8qCisJCSAqIElmIGNoZWNraW5nIHJlbW90ZSBwb3J0cywgYWxzbyBzZW5kIHBhY2tldHMgaWYKKwkJICogICAoTGlua3NVcCA9PSAxKSAmJgorCQkgKiAgIHRoaXMgcG9ydCBjaGVja3MgYXQgbGVhc3Qgb25lIChyZW1vdGUpIHBvcnQuCisJCSAqLworCisJCS8qCisJCSAqIE11c3QgYmUgbmV3IGxvb3AsIGFzIFNrUmxtdENoZWNrUG9ydCBjYW4gcmVxdWVzdCB0bworCQkgKiBjaGVjayBzZWdtZW50YXRpb24gd2hlbiBlLmcuIGNoZWNraW5nIHRoZSBsYXN0IHBvcnQuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uTnVtUG9ydHM7IGkrKykgeworCQkJaWYgKCFwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5Qb3J0W2ldLT5MaW5rRG93bikgeworCQkJCVNrUmxtdFNlbmQocEFDLCBJb0MsCisJCQkJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlBvcnRbaV0tPlBvcnROdW1iZXIpOworCQkJfQorCQl9CisJfQorCisJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uTG9jVGltZXIsCisJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlRpbWVvdXRWYWx1ZSwgU0tHRV9STE1ULCBTS19STE1UX1RJTSwKKwkJUGFyYSk7CisKKwlpZiAocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uTGlua3NVcCA+IDEgJiYKKwkJKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19TRUcpICYmCisJCShwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5DaGVja2luZ1N0YXRlICYgU0tfUkxNVF9SQ1NfU1RBUlRfU0VHKSkgeworCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5TZWdUaW1lciwKKwkJCVNLX1JMTVRfU0VHX1RPX1ZBTCwgU0tHRV9STE1ULCBTS19STE1UX1NFR19USU0sIFBhcmEpOworCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5DaGVja2luZ1N0YXRlICY9IH5TS19STE1UX1JDU19TVEFSVF9TRUc7CisJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLkNoZWNraW5nU3RhdGUgfD0KKwkJCVNLX1JMTVRfUkNTX1NFRyB8IFNLX1JMTVRfUkNTX1JFUE9SVF9TRUc7CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9USU0gRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdEV2dFRpbSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRTZWdUaW0gLSBTRUdfVElNCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBTRUdfVElNIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dFNlZ1RpbSgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBOZXROdW1iZXI7IFNLX1UzMiAtMSAqLworeworI2lmZGVmIHhERUJVRworCWludCBqOworI2VuZGlmCS8qIERFQlVHICovCisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfU0VHX1RJTSBFdmVudCBCRUdJTi5cbiIpKQorCisJaWYgKFBhcmEuUGFyYTMyWzFdICE9IChTS19VMzIpLTEpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIFBhcmFtZXRlci5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NFR19USU0gRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIHhERUJVRworCWZvciAoaiA9IDA7IGogPCBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5OdW1Qb3J0czsgaisrKSB7CisJCVNLX0FERFJfUE9SVAkqcEFQb3J0OworCQlTS19VMzIJCQlrOworCQlTS19VMTYJCQkqSW5BZGRyOworCQlTS19VOAkJCUluQWRkcjhbNl07CisKKwkJSW5BZGRyID0gKFNLX1UxNiAqKSZJbkFkZHI4WzBdOworCQlwQVBvcnQgPSBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5Qb3J0W2pdLT5BZGRyUG9ydDsKKwkJZm9yIChrID0gMDsgayA8IHBBUG9ydC0+TmV4dEV4YWN0TWF0Y2hSbG10OyBrKyspIHsKKwkJCS8qIEdldCBleGFjdCBtYXRjaCBhZGRyZXNzIGsgZnJvbSBwb3J0IGouICovCisJCQlYTV9JTkFERFIoSW9DLCBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5Qb3J0W2pdLT5Qb3J0TnVtYmVyLAorCQkJCVhNX0VYTShrKSwgSW5BZGRyKTsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJNQyBhZGRyZXNzICVkIG9uIFBvcnQgJXU6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IC0tICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeC5cbiIsCisJCQkJCWssIHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlBvcnRbal0tPlBvcnROdW1iZXIsCisJCQkJCUluQWRkcjhbMF0sIEluQWRkcjhbMV0sIEluQWRkcjhbMl0sCisJCQkJCUluQWRkcjhbM10sIEluQWRkcjhbNF0sIEluQWRkcjhbNV0sCisJCQkJCXBBUG9ydC0+RXhhY3Rba10uYVswXSwgcEFQb3J0LT5FeGFjdFtrXS5hWzFdLAorCQkJCQlwQVBvcnQtPkV4YWN0W2tdLmFbMl0sIHBBUG9ydC0+RXhhY3Rba10uYVszXSwKKwkJCQkJcEFQb3J0LT5FeGFjdFtrXS5hWzRdLCBwQVBvcnQtPkV4YWN0W2tdLmFbNV0pKQorCQl9CisJfQorI2VuZGlmCS8qIHhERUJVRyAqLworCQkJCQorCVNrUmxtdENoZWNrU2VnKHBBQywgSW9DLCBQYXJhLlBhcmEzMlswXSk7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NFR19USU0gRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdEV2dFNlZ1RpbSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRQYWNrZXRSeCAtIFBBQ0tFVF9SRUNFSVZFRAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgUEFDS0VUX1JFQ0VJVkVEIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dFBhY2tldFJ4KAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfTUJVRiAqcE1iICovCit7CisJU0tfTUJVRgkqcE1iOworCVNLX01CVUYJKnBOZXh0TWI7CisJU0tfVTMyCU5ldE51bWJlcjsKKworCQorCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9QQUNLRVRfUkVDRUlWRUQgRXZlbnQgQkVHSU4uXG4iKSkKKworCS8qIFNob3VsZCB3ZSBpZ25vcmUgZnJhbWVzIGR1cmluZyBwb3J0IHN3aXRjaGluZz8gKi8KKworI2lmZGVmIERFQlVHCisJcE1iID0gUGFyYS5wUGFyYVB0cjsKKwlpZiAocE1iID09IE5VTEwpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwgKCJObyBtYnVmLlxuIikpCisJfQorCWVsc2UgaWYgKHBNYi0+cE5leHQgIT0gTlVMTCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJNb3JlIHRoYW4gb25lIG1idWYgb3IgcE1iLT5wTmV4dCBub3Qgc2V0LlxuIikpCisJfQorI2VuZGlmCS8qIERFQlVHICovCisKKwlmb3IgKHBNYiA9IFBhcmEucFBhcmFQdHI7IHBNYiAhPSBOVUxMOyBwTWIgPSBwTmV4dE1iKSB7CisJCXBOZXh0TWIgPSBwTWItPnBOZXh0OworCQlwTWItPnBOZXh0ID0gTlVMTDsKKworCQlOZXROdW1iZXIgPSBwQUMtPlJsbXQuUG9ydFtwTWItPlBvcnRJZHhdLk5ldC0+TmV0TnVtYmVyOworCQlpZiAocEFDLT5SbG10Lk5ldFtOZXROdW1iZXJdLlJsbXRTdGF0ZSA9PSBTS19STE1UX1JTX0lOSVQpIHsKKwkJCVNrRHJ2RnJlZVJsbXRNYnVmKHBBQywgSW9DLCBwTWIpOworCQl9CisJCWVsc2UgeworCQkJU2tSbG10UGFja2V0UmVjZWl2ZShwQUMsIElvQywgcE1iKTsKKwkJfQorCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9QQUNLRVRfUkVDRUlWRUQgRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdEV2dFBhY2tldFJ4ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dFN0YXRzQ2xlYXIgLSBTVEFUU19DTEVBUgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgU1RBVFNfQ0xFQVIgZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0U3RhdHNDbGVhcigKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBOZXROdW1iZXI7IFNLX1UzMiAtMSAqLworeworCVNLX1UzMgkJCWk7CisJU0tfUkxNVF9QT1JUCSpwUlBvcnQ7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfU1RBVFNfQ0xFQVIgRXZlbnQgQkVHSU4uXG4iKSkKKworCWlmIChQYXJhLlBhcmEzMlsxXSAhPSAoU0tfVTMyKS0xKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBQYXJhbWV0ZXIuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TVEFUU19DTEVBUiBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJaWYgKFBhcmEuUGFyYTMyWzBdID49IHBBQy0+UmxtdC5OdW1OZXRzKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBOZXROdW1iZXIgJWQuXG4iLCBQYXJhLlBhcmEzMlswXSkpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU1RBVFNfQ0xFQVIgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCS8qIENsZWFyIHN0YXRpc3RpY3MgZm9yIGxvZ2ljYWwgYW5kIHBoeXNpY2FsIHBvcnRzLiAqLworCWZvciAoaSA9IDA7IGkgPCBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5OdW1Qb3J0czsgaSsrKSB7CisJCXBSUG9ydCA9CisJCQkmcEFDLT5SbG10LlBvcnRbcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUG9ydFtpXS0+UG9ydE51bWJlcl07CisJCXBSUG9ydC0+VHhIZWxsb0N0cyA9IDA7CisJCXBSUG9ydC0+UnhIZWxsb0N0cyA9IDA7CisJCXBSUG9ydC0+VHhTcEhlbGxvUmVxQ3RzID0gMDsKKwkJcFJQb3J0LT5SeFNwSGVsbG9DdHMgPSAwOworCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9TVEFUU19DTEVBUiBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10RXZ0U3RhdHNDbGVhciAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRTdGF0c1VwZGF0ZSAtIFNUQVRTX1VQREFURQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgU1RBVFNfVVBEQVRFIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dFN0YXRzVXBkYXRlKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIE5ldE51bWJlcjsgU0tfVTMyIC0xICovCit7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1NUQVRTX1VQREFURSBFdmVudCBCRUdJTi5cbiIpKQorCisJaWYgKFBhcmEuUGFyYTMyWzFdICE9IChTS19VMzIpLTEpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIFBhcmFtZXRlci5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NUQVRTX1VQREFURSBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJaWYgKFBhcmEuUGFyYTMyWzBdID49IHBBQy0+UmxtdC5OdW1OZXRzKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBOZXROdW1iZXIgJWQuXG4iLCBQYXJhLlBhcmEzMlswXSkpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU1RBVFNfVVBEQVRFIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwkvKiBVcGRhdGUgc3RhdGlzdGljcyAtIGN1cnJlbnRseSBhbHdheXMgdXAtdG8tZGF0ZS4gKi8KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9TVEFUU19VUERBVEUgRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdEV2dFN0YXRzVXBkYXRlICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dFByZWZwb3J0Q2hhbmdlIC0gUFJFRlBPUlRfQ0hBTkdFCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBQUkVGUE9SVF9DSEFOR0UgZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0UHJlZnBvcnRDaGFuZ2UoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgUG9ydEluZGV4OyBTS19VMzIgTmV0TnVtYmVyICovCit7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1BSRUZQT1JUX0NIQU5HRSB0byBQb3J0ICVkIEV2ZW50IEJFR0lOLlxuIiwgUGFyYS5QYXJhMzJbMF0pKQorCisJaWYgKFBhcmEuUGFyYTMyWzFdID49IHBBQy0+UmxtdC5OdW1OZXRzKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBOZXROdW1iZXIgJWQuXG4iLCBQYXJhLlBhcmEzMlsxXSkpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfUFJFRlBPUlRfQ0hBTkdFIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwkvKiAweEZGRkZGRkZGID09IGF1dG8tbW9kZS4gKi8KKwlpZiAoUGFyYS5QYXJhMzJbMF0gPT0gMHhGRkZGRkZGRikgeworCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5QcmVmUG9ydCA9IFNLX1JMTVRfREVGX1BSRUZfUE9SVDsKKwl9CisJZWxzZSB7CisJCWlmIChQYXJhLlBhcmEzMlswXSA+PSBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5OdW1Qb3J0cykgeworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9STE1UX0UwMTAsIFNLRVJSX1JMTVRfRTAxMF9NU0cpOworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiU0tfUkxNVF9QUkVGUE9SVF9DSEFOR0UgRXZlbnQgRU1QVFkuXG4iKSkKKwkJCXJldHVybjsKKwkJfQorCisJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlByZWZQb3J0ID0gUGFyYS5QYXJhMzJbMF07CisJfQorCisJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUHJlZmVyZW5jZSA9IFBhcmEuUGFyYTMyWzBdOworCisJaWYgKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlJsbXRTdGF0ZSAhPSBTS19STE1UX1JTX0lOSVQpIHsKKwkJU2tSbG10Q2hlY2tTd2l0Y2gocEFDLCBJb0MsIFBhcmEuUGFyYTMyWzFdKTsKKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfUFJFRlBPUlRfQ0hBTkdFIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRFdnRQcmVmcG9ydENoYW5nZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRTZXROZXRzIC0gU0VUX05FVFMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIFNFVF9ORVRTIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dFNldE5ldHMoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgTnVtTmV0czsgU0tfVTMyIC0xICovCit7CisJaW50IGk7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfU0VUX05FVFMgRXZlbnQgQkVHSU4uXG4iKSkKKworCWlmIChQYXJhLlBhcmEzMlsxXSAhPSAoU0tfVTMyKS0xKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBQYXJhbWV0ZXIuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TRVRfTkVUUyBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJaWYgKFBhcmEuUGFyYTMyWzBdID09IDAgfHwgUGFyYS5QYXJhMzJbMF0gPiBTS19NQVhfTkVUUyB8fAorCQlQYXJhLlBhcmEzMlswXSA+IChTS19VMzIpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBudW1iZXIgb2YgbmV0czogJWQuXG4iLCBQYXJhLlBhcmEzMlswXSkpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU0VUX05FVFMgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCWlmIChQYXJhLlBhcmEzMlswXSA9PSBwQUMtPlJsbXQuTnVtTmV0cykgewkvKiBObyBjaGFuZ2UuICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU0VUX05FVFMgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCS8qIEVudGVyaW5nIGFuZCBsZWF2aW5nIGR1YWwgbW9kZSBvbmx5IGFsbG93ZWQgd2hpbGUgbmV0cyBhcmUgc3RvcHBlZC4gKi8KKwlpZiAocEFDLT5SbG10Lk5ldHNTdGFydGVkID4gMCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJDaGFuZ2luZyBkdWFsIG1vZGUgb25seSBhbGxvd2VkIHdoaWxlIGFsbCBuZXRzIGFyZSBzdG9wcGVkLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU0VUX05FVFMgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCWlmIChQYXJhLlBhcmEzMlswXSA9PSAxKSB7CisJCWlmIChwQUMtPlJsbXQuTnVtTmV0cyA+IDEpIHsKKwkJCS8qIENsZWFyIGxvZ2ljYWwgTUFDIGFkZHIgZnJvbSBzZWNvbmQgbmV0J3MgYWN0aXZlIHBvcnQuICovCisJCQkodm9pZClTa0FkZHJPdmVycmlkZShwQUMsIElvQywgcEFDLT5SbG10Lk5ldFsxXS5Qb3J0W3BBQy0+QWRkci4KKwkJCQlOZXRbMV0uQWN0aXZlUG9ydF0tPlBvcnROdW1iZXIsIE5VTEwsIFNLX0FERFJfQ0xFQVJfTE9HSUNBTCk7CisJCQlwQUMtPlJsbXQuTmV0WzFdLk51bVBvcnRzID0gMDsKKwkJfQorCisJCXBBQy0+UmxtdC5OdW1OZXRzID0gUGFyYS5QYXJhMzJbMF07CisJCWZvciAoaSA9IDA7IChTS19VMzIpaSA8IHBBQy0+UmxtdC5OdW1OZXRzOyBpKyspIHsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uUmxtdFN0YXRlID0gU0tfUkxNVF9SU19JTklUOworCQkJcEFDLT5SbG10Lk5ldFtpXS5Sb290SWRTZXQgPSBTS19GQUxTRTsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uUHJlZmVyZW5jZSA9IDB4RkZGRkZGRkY7CSAgLyogIkF1dG9tYXRpYyIgKi8KKwkJCXBBQy0+UmxtdC5OZXRbaV0uUHJlZlBvcnQgPSBTS19STE1UX0RFRl9QUkVGX1BPUlQ7CisJCQkvKiBKdXN0IGFzc3VtaW5nLiAqLworCQkJcEFDLT5SbG10Lk5ldFtpXS5BY3RpdmVQb3J0ID0gcEFDLT5SbG10Lk5ldFtpXS5QcmVmUG9ydDsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uUmxtdE1vZGUgPSBTS19STE1UX0RFRl9NT0RFOworCQkJcEFDLT5SbG10Lk5ldFtpXS5UaW1lb3V0VmFsdWUgPSBTS19STE1UX0RFRl9UT19WQUw7CisJCQlwQUMtPlJsbXQuTmV0W2ldLk5ldE51bWJlciA9IGk7CisJCX0KKworCQlwQUMtPlJsbXQuUG9ydFsxXS5OZXQ9ICZwQUMtPlJsbXQuTmV0WzBdOworCQlwQUMtPlJsbXQuTmV0WzBdLk51bVBvcnRzID0gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUE5NSSwgU0tfUE5NSV9FVlRfUkxNVF9TRVRfTkVUUywgUGFyYSk7CisKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiUkxNVDogQ2hhbmdlZCB0byBvbmUgbmV0IHdpdGggdHdvIHBvcnRzLlxuIikpCisJfQorCWVsc2UgaWYgKFBhcmEuUGFyYTMyWzBdID09IDIpIHsKKwkJcEFDLT5SbG10LlBvcnRbMV0uTmV0PSAmcEFDLT5SbG10Lk5ldFsxXTsKKwkJcEFDLT5SbG10Lk5ldFsxXS5OdW1Qb3J0cyA9IHBBQy0+R0luaS5HSU1hY3NGb3VuZCAtIDE7CisJCXBBQy0+UmxtdC5OZXRbMF0uTnVtUG9ydHMgPQorCQkJcEFDLT5HSW5pLkdJTWFjc0ZvdW5kIC0gcEFDLT5SbG10Lk5ldFsxXS5OdW1Qb3J0czsKKwkJCisJCXBBQy0+UmxtdC5OdW1OZXRzID0gUGFyYS5QYXJhMzJbMF07CisJCWZvciAoaSA9IDA7IChTS19VMzIpaSA8IHBBQy0+UmxtdC5OdW1OZXRzOyBpKyspIHsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uUmxtdFN0YXRlID0gU0tfUkxNVF9SU19JTklUOworCQkJcEFDLT5SbG10Lk5ldFtpXS5Sb290SWRTZXQgPSBTS19GQUxTRTsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uUHJlZmVyZW5jZSA9IDB4RkZGRkZGRkY7CSAgLyogIkF1dG9tYXRpYyIgKi8KKwkJCXBBQy0+UmxtdC5OZXRbaV0uUHJlZlBvcnQgPSBTS19STE1UX0RFRl9QUkVGX1BPUlQ7CisJCQkvKiBKdXN0IGFzc3VtaW5nLiAqLworCQkJcEFDLT5SbG10Lk5ldFtpXS5BY3RpdmVQb3J0ID0gcEFDLT5SbG10Lk5ldFtpXS5QcmVmUG9ydDsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uUmxtdE1vZGUgPSBTS19STE1UX0RFRl9NT0RFOworCQkJcEFDLT5SbG10Lk5ldFtpXS5UaW1lb3V0VmFsdWUgPSBTS19STE1UX0RFRl9UT19WQUw7CisKKwkJCXBBQy0+UmxtdC5OZXRbaV0uTmV0TnVtYmVyID0gaTsKKwkJfQorCisJCS8qIFNldCBsb2dpY2FsIE1BQyBhZGRyIG9uIHNlY29uZCBuZXQncyBhY3RpdmUgcG9ydC4gKi8KKwkJKHZvaWQpU2tBZGRyT3ZlcnJpZGUocEFDLCBJb0MsIHBBQy0+UmxtdC5OZXRbMV0uUG9ydFtwQUMtPkFkZHIuCisJCQlOZXRbMV0uQWN0aXZlUG9ydF0tPlBvcnROdW1iZXIsIE5VTEwsIFNLX0FERFJfU0VUX0xPR0lDQUwpOworCisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUE5NSSwgU0tfUE5NSV9FVlRfUkxNVF9TRVRfTkVUUywgUGFyYSk7CisKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiUkxNVDogQ2hhbmdlZCB0byB0d28gbmV0cyB3aXRoIG9uZSBwb3J0IGVhY2guXG4iKSkKKwl9CisJZWxzZSB7CisJCS8qIE5vdCBpbXBsZW1lbnRlZCBmb3IgbW9yZSB0aGFuIHR3byBuZXRzLiAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTZXROZXRzIG5vdCBpbXBsZW1lbnRlZCBmb3IgbW9yZSB0aGFuIHR3byBuZXRzLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU0VUX05FVFMgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9TRVRfTkVUUyBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10U2V0TmV0cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRNb2RlQ2hhbmdlIC0gTU9ERV9DSEFOR0UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIE1PREVfQ0hBTkdFIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dE1vZGVDaGFuZ2UoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgTmV3TW9kZTsgU0tfVTMyIE5ldE51bWJlciAqLworeworCVNLX0VWUEFSQQlQYXJhMjsKKwlTS19VMzIJCWk7CisJU0tfVTMyCQlQcmV2UmxtdE1vZGU7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfTU9ERV9DSEFOR0UgRXZlbnQgQkVHSU4uXG4iKSkKKworCWlmIChQYXJhLlBhcmEzMlsxXSA+PSBwQUMtPlJsbXQuTnVtTmV0cykgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgTmV0TnVtYmVyICVkLlxuIiwgUGFyYS5QYXJhMzJbMV0pKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX01PREVfQ0hBTkdFIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlQYXJhLlBhcmEzMlswXSB8PSBTS19STE1UX0NIRUNLX0xJTks7CisKKwlpZiAoKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLk51bVBvcnRzID09IDEpICYmCisJCVBhcmEuUGFyYTMyWzBdICE9IFNLX1JMTVRfTU9ERV9DTFMpIHsKKwkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUmxtdE1vZGUgPSBTS19STE1UX01PREVfQ0xTOworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJGb3JjZWQgUkxNVCBtb2RlIHRvIENMUyBvbiBzaW5nbGUgcG9ydCBuZXQuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9NT0RFX0NIQU5HRSBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJLyogVXBkYXRlIFJMTVQgbW9kZS4gKi8KKwlQcmV2UmxtdE1vZGUgPSBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5SbG10TW9kZTsKKwlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5SbG10TW9kZSA9IFBhcmEuUGFyYTMyWzBdOworCisJaWYgKChQcmV2UmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX0xPQ19MSU5LKSAhPQorCQkocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX0xPQ19MSU5LKSkgeworCQkvKiBTS19STE1UX0NIRUNLX0xPQ19MSU5LIGJpdCBjaGFuZ2VkLiAqLworCQlpZiAoKFByZXZSbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfT1RIRVJTKSA9PSAwICYmCisJCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5OdW1Qb3J0cyA+IDEgJiYKKwkJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlBvcnRzVXAgPj0gMSkgeworCQkJLyogMjAwMDEyMDcgUkE6IFdhcyAiUG9ydHNVcCA9PSAxIi4gKi8KKwkJCVBhcmEyLlBhcmEzMlswXSA9IFBhcmEuUGFyYTMyWzFdOworCQkJUGFyYTIuUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwkJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLkxvY1RpbWVyLAorCQkJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlRpbWVvdXRWYWx1ZSwKKwkJCQlTS0dFX1JMTVQsIFNLX1JMTVRfVElNLCBQYXJhMik7CisJCX0KKwl9CisKKwlpZiAoKFByZXZSbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfU0VHKSAhPQorCQkocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX1NFRykpIHsKKwkJLyogU0tfUkxNVF9DSEVDS19TRUcgYml0IGNoYW5nZWQuICovCisJCWZvciAoaSA9IDA7IGkgPCBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5OdW1Qb3J0czsgaSsrKSB7CisJCQkodm9pZClTa0FkZHJNY0NsZWFyKHBBQywgSW9DLAorCQkJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlBvcnRbaV0tPlBvcnROdW1iZXIsCisJCQkJU0tfQUREUl9QRVJNQU5FTlQgfCBTS19NQ19TV19PTkxZKTsKKworCQkJLyogQWRkIFJMTVQgTUMgYWRkcmVzcy4gKi8KKwkJCSh2b2lkKVNrQWRkck1jQWRkKHBBQywgSW9DLAorCQkJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlBvcnRbaV0tPlBvcnROdW1iZXIsCisJCQkJJlNrUmxtdE1jQWRkciwgU0tfQUREUl9QRVJNQU5FTlQpOworCisJCQlpZiAoKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlJsbXRNb2RlICYKKwkJCQlTS19STE1UX0NIRUNLX1NFRykgIT0gMCkgeworCQkJCS8qIEFkZCBCUERVIE1DIGFkZHJlc3MuICovCisJCQkJKHZvaWQpU2tBZGRyTWNBZGQocEFDLCBJb0MsCisJCQkJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlBvcnRbaV0tPlBvcnROdW1iZXIsCisJCQkJCSZCcmlkZ2VNY0FkZHIsIFNLX0FERFJfUEVSTUFORU5UKTsKKworCQkJCWlmIChwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5SbG10U3RhdGUgIT0gU0tfUkxNVF9SU19JTklUKSB7CisJCQkJCWlmICghcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUG9ydFtpXS0+TGlua0Rvd24gJiYKKwkJCQkJCShQYXJhMi5wUGFyYVB0ciA9IFNrUmxtdEJ1aWxkU3Bhbm5pbmdUcmVlUGFja2V0KAorCQkJCQkJcEFDLCBJb0MsIGkpKSAhPSBOVUxMKSB7CisJCQkJCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5Qb3J0W2ldLT5Sb290SWRTZXQgPQorCQkJCQkJCVNLX0ZBTFNFOworCQkJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9STE1UX1NFTkQsIFBhcmEyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCSh2b2lkKVNrQWRkck1jVXBkYXRlKHBBQywgSW9DLAorCQkJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlBvcnRbaV0tPlBvcnROdW1iZXIpOworCQl9CS8qIGZvciAuLi4gKi8KKworCQlpZiAoKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19TRUcpICE9IDApIHsKKwkJCVBhcmEyLlBhcmEzMlswXSA9IFBhcmEuUGFyYTMyWzFdOworCQkJUGFyYTIuUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwkJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlNlZ1RpbWVyLAorCQkJCVNLX1JMTVRfU0VHX1RPX1ZBTCwgU0tHRV9STE1ULCBTS19STE1UX1NFR19USU0sIFBhcmEyKTsKKwkJfQorCX0JLyogU0tfUkxNVF9DSEVDS19TRUcgYml0IGNoYW5nZWQuICovCisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX01PREVfQ0hBTkdFIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRFdnRNb2RlQ2hhbmdlICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2ZW50IC0gYSBQT1JULSBvciBhbiBSTE1ULXNwZWNpZmljIGV2ZW50IGhhcHBlbmVkCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgY2FsbHMgc3Vicm91dGluZXMgdG8gaGFuZGxlIFBPUlQtIGFuZCBSTE1ULXNwZWNpZmljIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJMAorICovCitpbnQJU2tSbG10RXZlbnQoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMgkJRXZlbnQsCS8qIEV2ZW50IGNvZGUgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBFdmVudC1zcGVjaWZpYyBwYXJhbWV0ZXIgKi8KK3sKKwlzd2l0Y2ggKEV2ZW50KSB7CisJCisJLyogLS0tLS0gUE9SVCBldmVudHMgLS0tLS0gKi8KKworCWNhc2UgU0tfUkxNVF9QT1JUU1RBUlRfVElNOgkvKiBGcm9tIFJMTVQgdmlhIFRJTUUuICovCisJCVNrUmxtdEV2dFBvcnRTdGFydFRpbShwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCWNhc2UgU0tfUkxNVF9MSU5LX1VQOgkJLyogRnJvbSBTSVJRLiAqLworCQlTa1JsbXRFdnRMaW5rVXAocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKwljYXNlIFNLX1JMTVRfUE9SVFVQX1RJTToJLyogRnJvbSBSTE1UIHZpYSBUSU1FLiAqLworCQlTa1JsbXRFdnRQb3J0VXBUaW0ocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKwljYXNlIFNLX1JMTVRfUE9SVERPV046CQkJLyogRnJvbSBSTE1ULiAqLworCWNhc2UgU0tfUkxNVF9QT1JURE9XTl9SWF9USU06CS8qIEZyb20gUkxNVCB2aWEgVElNRS4gKi8KKwljYXNlIFNLX1JMTVRfUE9SVERPV05fVFhfVElNOgkvKiBGcm9tIFJMTVQgdmlhIFRJTUUuICovCisJCVNrUmxtdEV2dFBvcnREb3duWChwQUMsIElvQywgRXZlbnQsIFBhcmEpOworCQlicmVhazsKKwljYXNlIFNLX1JMTVRfTElOS19ET1dOOgkJLyogRnJvbSBTSVJRLiAqLworCQlTa1JsbXRFdnRMaW5rRG93bihwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCWNhc2UgU0tfUkxNVF9QT1JUX0FERFI6CQkvKiBGcm9tIEFERFIuICovCisJCVNrUmxtdEV2dFBvcnRBZGRyKHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisKKwkvKiAtLS0tLSBSTE1UIGV2ZW50cyAtLS0tLSAqLworCisJY2FzZSBTS19STE1UX1NUQVJUOgkJLyogRnJvbSBEUlYuICovCisJCVNrUmxtdEV2dFN0YXJ0KHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisJY2FzZSBTS19STE1UX1NUT1A6CQkvKiBGcm9tIERSVi4gKi8KKwkJU2tSbG10RXZ0U3RvcChwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCWNhc2UgU0tfUkxNVF9USU06CQkvKiBGcm9tIFJMTVQgdmlhIFRJTUUuICovCisJCVNrUmxtdEV2dFRpbShwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCWNhc2UgU0tfUkxNVF9TRUdfVElNOgorCQlTa1JsbXRFdnRTZWdUaW0ocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKwljYXNlIFNLX1JMTVRfUEFDS0VUX1JFQ0VJVkVEOgkvKiBGcm9tIERSVi4gKi8KKwkJU2tSbG10RXZ0UGFja2V0UngocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKwljYXNlIFNLX1JMTVRfU1RBVFNfQ0xFQVI6CS8qIEZyb20gUE5NSS4gKi8KKwkJU2tSbG10RXZ0U3RhdHNDbGVhcihwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCWNhc2UgU0tfUkxNVF9TVEFUU19VUERBVEU6CS8qIEZyb20gUE5NSS4gKi8KKwkJU2tSbG10RXZ0U3RhdHNVcGRhdGUocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKwljYXNlIFNLX1JMTVRfUFJFRlBPUlRfQ0hBTkdFOgkvKiBGcm9tIFBOTUkuICovCisJCVNrUmxtdEV2dFByZWZwb3J0Q2hhbmdlKHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisJY2FzZSBTS19STE1UX01PREVfQ0hBTkdFOgkvKiBGcm9tIFBOTUkuICovCisJCVNrUmxtdEV2dE1vZGVDaGFuZ2UocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKwljYXNlIFNLX1JMTVRfU0VUX05FVFM6CS8qIEZyb20gRFJWLiAqLworCQlTa1JsbXRFdnRTZXROZXRzKHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisKKwkvKiAtLS0tLSBVbmtub3duIGV2ZW50cyAtLS0tLSAqLworCisJZGVmYXVsdDoJLyogQ3JlYXRlIGVycm9yIGxvZyBlbnRyeS4gKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiVW5rbm93biBSTE1UIEV2ZW50ICVkLlxuIiwgRXZlbnQpKQorCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX1JMTVRfRTAwMywgU0tFUlJfUkxNVF9FMDAzX01TRyk7CisJCWJyZWFrOworCX0JLyogc3dpdGNoKCkgKi8KKworCXJldHVybiAoMCk7Cit9CS8qIFNrUmxtdEV2ZW50ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCS8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrdGltZXIuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2t0aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNDYyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrdGltZXIuYwpAQCAtMCwwICsxLDI1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrdGltZXIuYworICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgRXZlbnQgU2NoZWR1bGVyIE1vZHVsZQorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjE0ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA5LzE2IDEzOjQ2OjUxICQKKyAqIFB1cnBvc2U6CUhpZ2ggbGV2ZWwgdGltZXIgZnVuY3Rpb25zLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAqCUV2ZW50IHF1ZXVlIGFuZCBkaXNwYXRjaGVyCisgKi8KKyNpZiAoZGVmaW5lZChERUJVRykgfHwgKCghZGVmaW5lZChMSU5UKSkgJiYgKCFkZWZpbmVkKFNLX1NMSU0pKSkpCitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpICRJZDogc2t0aW1lci5jLHYgMS4xNCAyMDAzLzA5LzE2IDEzOjQ2OjUxIHJzY2htaWR0IEV4cCAkIChDKSBNYXJ2ZWxsLiI7CisjZW5kaWYKKworI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIJCS8qIERyaXZlciBTcGVjaWZpYyBEZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImgvc2tkcnYybmQuaCIJCS8qIEFkYXB0ZXIgQ29udHJvbC0gYW5kIERyaXZlciBzcGVjaWZpYyBEZWYuICovCisKKyNpZmRlZiBfX0MyTUFOX18KKy8qCisJRXZlbnQgcXVldWUgbWFuYWdlbWVudC4KKworCUdlbmVyYWwgRGVzY3JpcHRpb246CisKKyAqLworaW50cm8oKQore30KKyNlbmRpZgorCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyB2b2lkIHRpbWVyX2RvbmUoU0tfQUMgKnBBQyxTS19JT0MgSW9jLGludCBSZXN0YXJ0KTsKKworCisvKgorICogSW5pdHMgdGhlIHNvZnR3YXJlIHRpbWVyCisgKgorICogbmVlZHMgdG8gYmUgY2FsbGVkIGR1cmluZyBJbml0IGxldmVsIDEuCisgKi8KK3ZvaWQJU2tUaW1lckluaXQoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlcnMgY29udGV4dCAqLworU0tfSU9DCUlvYywJCS8qIElvQ29udGV4dCAqLworaW50CQlMZXZlbCkJCS8qIEluaXQgTGV2ZWwgKi8KK3sKKwlzd2l0Y2ggKExldmVsKSB7CisJY2FzZSBTS19JTklUX0RBVEE6CisJCXBBQy0+VGltLlN0UXVldWUgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFNLX0lOSVRfSU86CisJCVNrSHd0SW5pdChwQUMsIElvYyk7CisJCVNrVGltZXJEb25lKHBBQywgSW9jKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogU3RvcHMgYSBoaWdoIGxldmVsIHRpbWVyCisgKiAtIElmIGEgdGltZXIgaXMgbm90IGluIHRoZSBxdWV1ZSB0aGUgZnVuY3Rpb24gcmV0dXJucyBub3JtYWxseSwgdG9vLgorICovCit2b2lkCVNrVGltZXJTdG9wKAorU0tfQUMJCSpwQUMsCQkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJCUlvYywJCS8qIElvQ29udGV4dCAqLworU0tfVElNRVIJKnBUaW1lcikJLyogVGltZXIgUG9pbnRlciB0byBiZSBzdGFydGVkICovCit7CisJU0tfVElNRVIJKipwcFRpbVByZXY7CisJU0tfVElNRVIJKnBUbTsKKworCS8qCisJICogcmVtb3ZlIHRpbWVyIGZyb20gcXVldWUKKwkgKi8KKwlwVGltZXItPlRtQWN0aXZlID0gU0tfRkFMU0U7CisJCisJaWYgKHBBQy0+VGltLlN0UXVldWUgPT0gcFRpbWVyICYmICFwVGltZXItPlRtTmV4dCkgeworCQlTa0h3dFN0b3AocEFDLCBJb2MpOworCX0KKwkKKwlmb3IgKHBwVGltUHJldiA9ICZwQUMtPlRpbS5TdFF1ZXVlOyAocFRtID0gKnBwVGltUHJldik7CisJCXBwVGltUHJldiA9ICZwVG0tPlRtTmV4dCApIHsKKwkJCisJCWlmIChwVG0gPT0gcFRpbWVyKSB7CisJCQkvKgorCQkJICogVGltZXIgZm91bmQgaW4gcXVldWUKKwkJCSAqIC0gZGVxdWV1ZSBpdCBhbmQKKwkJCSAqIC0gY29ycmVjdCBkZWx0YSBvZiB0aGUgbmV4dCB0aW1lcgorCQkJICovCisJCQkqcHBUaW1QcmV2ID0gcFRtLT5UbU5leHQ7CisKKwkJCWlmIChwVG0tPlRtTmV4dCkgeworCQkJCS8qIGNvcnJlY3QgZGVsdGEgb2YgbmV4dCB0aW1lciBpbiBxdWV1ZSAqLworCQkJCXBUbS0+VG1OZXh0LT5UbURlbHRhICs9IHBUbS0+VG1EZWx0YTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworLyoKKyAqIFN0YXJ0IGEgaGlnaCBsZXZlbCBzb2Z0d2FyZSB0aW1lcgorICovCit2b2lkCVNrVGltZXJTdGFydCgKK1NLX0FDCQkqcEFDLAkJLyogQWRhcHRlcnMgY29udGV4dCAqLworU0tfSU9DCQlJb2MsCQkvKiBJb0NvbnRleHQgKi8KK1NLX1RJTUVSCSpwVGltZXIsCS8qIFRpbWVyIFBvaW50ZXIgdG8gYmUgc3RhcnRlZCAqLworU0tfVTMyCQlUaW1lLAkJLyogVGltZSB2YWx1ZSAqLworU0tfVTMyCQlDbGFzcywJCS8qIEV2ZW50IENsYXNzIGZvciB0aGlzIHRpbWVyICovCitTS19VMzIJCUV2ZW50LAkJLyogRXZlbnQgVmFsdWUgZm9yIHRoaXMgdGltZXIgKi8KK1NLX0VWUEFSQQlQYXJhKQkJLyogRXZlbnQgUGFyYW1ldGVyIGZvciB0aGlzIHRpbWVyICovCit7CisJU0tfVElNRVIJKipwcFRpbVByZXY7CisJU0tfVElNRVIJKnBUbTsKKwlTS19VMzIJCURlbHRhOworCisJVGltZSAvPSAxNjsJCS8qIGlucHV0IGlzIHVTLCBjbG9jayB0aWNrcyBhcmUgMTZ1UyAqLworCQorCWlmICghVGltZSkKKwkJVGltZSA9IDE7CisKKwlTa1RpbWVyU3RvcChwQUMsIElvYywgcFRpbWVyKTsKKworCXBUaW1lci0+VG1DbGFzcyA9IENsYXNzOworCXBUaW1lci0+VG1FdmVudCA9IEV2ZW50OworCXBUaW1lci0+VG1QYXJhID0gUGFyYTsKKwlwVGltZXItPlRtQWN0aXZlID0gU0tfVFJVRTsKKworCWlmICghcEFDLT5UaW0uU3RRdWV1ZSkgeworCQkvKiBGaXJzdCBUaW1lciB0byBiZSBzdGFydGVkICovCisJCXBBQy0+VGltLlN0UXVldWUgPSBwVGltZXI7CisJCXBUaW1lci0+VG1OZXh0ID0gTlVMTDsKKwkJcFRpbWVyLT5UbURlbHRhID0gVGltZTsKKwkJCisJCVNrSHd0U3RhcnQocEFDLCBJb2MsIFRpbWUpOworCQkKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogdGltZXIgY29ycmVjdGlvbgorCSAqLworCXRpbWVyX2RvbmUocEFDLCBJb2MsIDApOworCisJLyoKKwkgKiBmaW5kIHBvc2l0aW9uIGluIHF1ZXVlCisJICovCisJRGVsdGEgPSAwOworCWZvciAocHBUaW1QcmV2ID0gJnBBQy0+VGltLlN0UXVldWU7IChwVG0gPSAqcHBUaW1QcmV2KTsKKwkJcHBUaW1QcmV2ID0gJnBUbS0+VG1OZXh0ICkgeworCQkKKwkJaWYgKERlbHRhICsgcFRtLT5UbURlbHRhID4gVGltZSkgeworCQkJLyogUG9zaXRpb24gZm91bmQgKi8KKwkJCS8qIEhlcmUgdGhlIHRpbWVyIG5lZWRzIHRvIGJlIGluc2VydGVkLiAqLworCQkJYnJlYWs7CisJCX0KKwkJRGVsdGEgKz0gcFRtLT5UbURlbHRhOworCX0KKworCS8qIGluc2VydCBpbiBxdWV1ZSAqLworCSpwcFRpbVByZXYgPSBwVGltZXI7CisJcFRpbWVyLT5UbU5leHQgPSBwVG07CisJcFRpbWVyLT5UbURlbHRhID0gVGltZSAtIERlbHRhOworCisJaWYgKHBUbSkgeworCQkvKiBUaGVyZSBpcyBhIG5leHQgdGltZXIKKwkJICogLT4gY29ycmVjdCBpdHMgRGVsdGEgdmFsdWUuCisJCSAqLworCQlwVG0tPlRtRGVsdGEgLT0gcFRpbWVyLT5UbURlbHRhOworCX0KKworCS8qIHJlc3RhcnQgd2l0aCBmaXJzdCAqLworCVNrSHd0U3RhcnQocEFDLCBJb2MsIHBBQy0+VGltLlN0UXVldWUtPlRtRGVsdGEpOworfQorCisKK3ZvaWQJU2tUaW1lckRvbmUoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlcnMgY29udGV4dCAqLworU0tfSU9DCUlvYykJCS8qIElvQ29udGV4dCAqLworeworCXRpbWVyX2RvbmUocEFDLCBJb2MsIDEpOworfQorCisKK3N0YXRpYyB2b2lkCXRpbWVyX2RvbmUoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlcnMgY29udGV4dCAqLworU0tfSU9DCUlvYywJCS8qIElvQ29udGV4dCAqLworaW50CQlSZXN0YXJ0KQkvKiBEbyB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIEhhcmR3YXJlIHRpbWVyID8gKi8KK3sKKwlTS19VMzIJCURlbHRhOworCVNLX1RJTUVSCSpwVG07CisJU0tfVElNRVIJKnBUQ29tcDsJLyogVGltZXIgY29tcGxldGVkIG5vdyBub3cgKi8KKwlTS19USU1FUgkqKnBwTGFzdDsJLyogTmV4dCBmaWVsZCBvZiBMYXN0IHRpbWVyIHRvIGJlIGRlcSAqLworCWludAkJRG9uZSA9IDA7CisKKwlEZWx0YSA9IFNrSHd0UmVhZChwQUMsIElvYyk7CisJCisJcHBMYXN0ID0gJnBBQy0+VGltLlN0UXVldWU7CisJcFRtID0gcEFDLT5UaW0uU3RRdWV1ZTsKKwl3aGlsZSAocFRtICYmICFEb25lKSB7CisJCWlmIChEZWx0YSA+PSBwVG0tPlRtRGVsdGEpIHsKKwkJCS8qIFRpbWVyIHJhbiBvdXQgKi8KKwkJCXBUbS0+VG1BY3RpdmUgPSBTS19GQUxTRTsKKwkJCURlbHRhIC09IHBUbS0+VG1EZWx0YTsKKwkJCXBwTGFzdCA9ICZwVG0tPlRtTmV4dDsKKwkJCXBUbSA9IHBUbS0+VG1OZXh0OworCQl9CisJCWVsc2UgeworCQkJLyogV2UgZm91bmQgdGhlIGZpcnN0IHRpbWVyIHRoYXQgZGlkIG5vdCBydW4gb3V0ICovCisJCQlwVG0tPlRtRGVsdGEgLT0gRGVsdGE7CisJCQlEZWx0YSA9IDA7CisJCQlEb25lID0gMTsKKwkJfQorCX0KKwkqcHBMYXN0ID0gTlVMTDsKKwkvKgorCSAqIHBUbSBwb2ludHMgdG8gdGhlIGZpcnN0IFRpbWVyIHRoYXQgZGlkIG5vdCBydW4gb3V0LgorCSAqIFN0UXVldWUgcG9pbnRzIHRvIHRoZSBmaXJzdCBUaW1lciB0aGF0IHJ1biBvdXQuCisJICovCisKKwlmb3IgKCBwVENvbXAgPSBwQUMtPlRpbS5TdFF1ZXVlOyBwVENvbXA7IHBUQ29tcCA9IHBUQ29tcC0+VG1OZXh0KSB7CisJCVNrRXZlbnRRdWV1ZShwQUMscFRDb21wLT5UbUNsYXNzLCBwVENvbXAtPlRtRXZlbnQsIHBUQ29tcC0+VG1QYXJhKTsKKwl9CisKKwkvKiBTZXQgaGVhZCBvZiB0aW1lciBxdWV1ZSB0byB0aGUgZmlyc3QgdGltZXIgdGhhdCBkaWQgbm90IHJ1biBvdXQgKi8KKwlwQUMtPlRpbS5TdFF1ZXVlID0gcFRtOworCisJaWYgKFJlc3RhcnQgJiYgcEFDLT5UaW0uU3RRdWV1ZSkgeworCQkvKiBSZXN0YXJ0IEhXIHRpbWVyICovCisJCVNrSHd0U3RhcnQocEFDLCBJb2MsIHBBQy0+VGltLlN0UXVldWUtPlRtRGVsdGEpOworCX0KK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2t2cGQuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2t2cGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjNjODk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za3ZwZC5jCkBAIC0wLDAgKzEsMTE5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrdnBkLmMKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4zNyAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wMS8xMyAxMDo0Mjo0NSAkCisgKiBQdXJwb3NlOglTaGFyZWQgc29mdHdhcmUgdG8gcmVhZCBhbmQgd3JpdGUgVlBEIGRhdGEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMyBTeXNLb25uZWN0IEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCVBsZWFzZSByZWZlciBza3ZwZC50eHQgZm9yIGluZm9tYXRpb24gaG93IHRvIGluY2x1ZGUgdGhpcyBtb2R1bGUKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0KKwkiQCgjKSRJZDogc2t2cGQuYyx2IDEuMzcgMjAwMy8wMS8xMyAxMDo0Mjo0NSByc2NobWlkdCBFeHAgJCAoQykgU0siOworCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgorI2luY2x1ZGUgImgvc2t0eXBlcy5oIgorI2luY2x1ZGUgImgvc2tkZWJ1Zy5oIgorI2luY2x1ZGUgImgvc2tkcnYybmQuaCIKKworLyoKKyAqIFN0YXRpYyBmdW5jdGlvbnMKKyAqLworI2lmbmRlZiBTS19LUl9QUk9UTworc3RhdGljIFNLX1ZQRF9QQVJBCSp2cGRfZmluZF9wYXJhKAorCVNLX0FDCSpwQUMsCisJY29uc3QgY2hhcgkqa2V5LAorCVNLX1ZQRF9QQVJBICpwKTsKKyNlbHNlCS8qIFNLX0tSX1BST1RPICovCitzdGF0aWMgU0tfVlBEX1BBUkEJKnZwZF9maW5kX3BhcmEoKTsKKyNlbmRpZgkvKiBTS19LUl9QUk9UTyAqLworCisvKgorICogd2FpdHMgZm9yIGEgY29tcGxldGlvbiBvZiBhIFZQRCB0cmFuc2ZlcgorICogVGhlIFZQRCB0cmFuc2ZlciBtdXN0IGNvbXBsZXRlIHdpdGhpbiBTS19USUNLU19QRVJfU0VDLzE2CisgKgorICogcmV0dXJucwkwOglzdWNjZXNzLCB0cmFuc2ZlciBjb21wbGV0ZXMKKyAqCQllcnJvcglleGl0KDkpIHdpdGggYSBlcnJvciBtZXNzYWdlCisgKi8KK3N0YXRpYyBpbnQgVnBkV2FpdCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIENvbnRleHQgKi8KK2ludAkJZXZlbnQpCS8qIGV2ZW50IHRvIHdhaXQgZm9yIChWUERfUkVBRCAvIFZQRF93cml0ZSkgY29tcGxldGlvbiovCit7CisJU0tfVTY0CXN0YXJ0X3RpbWU7CisJU0tfVTE2CXN0YXRlOworCisJU0tfREJHX01TRyhwQUMsU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiVlBEIHdhaXQgZm9yICVzXG4iLCBldmVudD8iV3JpdGUiOiJSZWFkIikpOworCXN0YXJ0X3RpbWUgPSBTa09zR2V0VGltZShwQUMpOworCWRvIHsKKwkJaWYgKFNrT3NHZXRUaW1lKHBBQykgLSBzdGFydF90aW1lID4gU0tfVElDS1NfUEVSX1NFQykgeworCisJCQkvKiBCdWcgZml4IEFGOiBUaHUgTWFyIDI4IDIwMDIKKwkJCSAqIERvIG5vdCBjYWxsOiBWUERfU1RPUChwQUMsIElvQyk7CisJCQkgKiBBIHBlbmRpbmcgVlBEIHJlYWQgY3ljbGUgY2FuIG5vdCBiZSBhYm9ydGVkIGJ5IHdyaXRpbmcKKwkJCSAqIFZQRF9XUklURSB0byB0aGUgUENJX1ZQRF9BRFJfUkVHIChWUEQgYWRkcmVzcyByZWdpc3RlcikuCisJCQkgKiBBbHRob3VnaCB0aGUgd3JpdGUgdGhyZXNob2xkIGluIHRoZSBPVVItcmVnaXN0ZXIgcHJvdGVjdHMKKwkJCSAqIFZQRCByZWFkIG9ubHkgc3BhY2UgZnJvbSBiZWluZyBvdmVyd3JpdHRlbiB0aGlzIGRvZXMgbm90CisJCQkgKiBwcm90ZWN0IGEgVlBEIHJlYWQgZnJvbSBiZWluZyBgY29udmVydGVkYCBpbnRvIGEgVlBEIHdyaXRlCisJCQkgKiBvcGVyYXRpb24gKG9uIHRoZSBmbHkpLiBBcyBhIGNvbnNlcXVlbmNlIHRoZSBWUERfU1RPUCB3b3VsZAorCQkJICogZGVsZXRlIFZQRCByZWFkIG9ubHkgZGF0YS4gSW4gY2FzZSBvZiBhbnkgcHJvYmxlbXMgd2l0aCB0aGUKKwkJCSAqIEkyQyBidXMgd2UgZXhpdCB0aGUgbG9vcCBoZXJlLiBUaGUgSTJDIHJlYWQgb3BlcmF0aW9uIGNhbgorCQkJICogbm90IGJlIGFib3J0ZWQgZXhjZXB0IGJ5IGEgcmVzZXQgKC0+TFIpLgorCQkJICovCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0ZBVEFMIHwgU0tfREJHQ0FUX0VSUiwKKwkJCQkoIkVSUk9SOlZQRCB3YWl0IHRpbWVvdXRcbiIpKTsKKwkJCXJldHVybigxKTsKKwkJfQorCQkKKwkJVlBEX0lOMTYocEFDLCBJb0MsIFBDSV9WUERfQURSX1JFRywgJnN0YXRlKTsKKwkJCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgic3RhdGUgPSAleCwgZXZlbnQgJXhcbiIsc3RhdGUsZXZlbnQpKTsKKwl9IHdoaWxlKChpbnQpKHN0YXRlICYgUENJX1ZQRF9GTEFHKSA9PSBldmVudCk7CisKKwlyZXR1cm4oMCk7Cit9CisKKyNpZmRlZiBTS0RJQUcKKworLyoKKyAqIFJlYWQgdGhlIGR3b3JkIGF0IGFkZHJlc3MgJ2FkZHInIGZyb20gdGhlIFZQRCBFRVBST00uCisgKgorICogTmVlZGVkIFRpbWU6CU1JTiAxLDMgbXMJTUFYIDIsNiBtcworICoKKyAqIE5vdGU6IFRoZSBEV29yZCBpcyByZXR1cm5lZCBpbiB0aGUgZW5kaWFuZXNzIG9mIHRoZSBtYWNoaW5lIHRoZSByb3V0aW5lCisgKiAgICAgICBpcyBydW5uaW5nIG9uLgorICoKKyAqIFJldHVybnMgdGhlIGRhdGEgcmVhZC4KKyAqLworU0tfVTMyIFZwZFJlYWREV29yZCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIENvbnRleHQgKi8KK2ludAkJYWRkcikJLyogVlBEIGFkZHJlc3MgKi8KK3sKKwlTS19VMzIJUnR2OworCisJLyogc3RhcnQgVlBEIHJlYWQgKi8KKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiVlBEIHJlYWQgZHdvcmQgYXQgMHgleFxuIixhZGRyKSk7CisJYWRkciAmPSB+VlBEX1dSSVRFOwkJLyogZW5zdXJlIHRoZSBSL1cgYml0IGlzIHNldCB0byByZWFkICovCisKKwlWUERfT1VUMTYocEFDLCBJb0MsIFBDSV9WUERfQURSX1JFRywgKFNLX1UxNilhZGRyKTsKKworCS8qIGlnbm9yZSByZXR1cm4gY29kZSBoZXJlICovCisJKHZvaWQpVnBkV2FpdChwQUMsIElvQywgVlBEX1JFQUQpOworCisJLyogRG9uJ3Qgc3dhcCBoZXJlLCBpdCdzIGEgZGF0YSBzdHJlYW0gb2YgYnl0ZXMgKi8KKwlSdHYgPSAwOworCisJVlBEX0lOMzIocEFDLCBJb0MsIFBDSV9WUERfREFUX1JFRywgJlJ0dik7CisJCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlZQRCByZWFkIGR3b3JkIGRhdGEgPSAweCV4XG4iLFJ0dikpOworCXJldHVybihSdHYpOworfQorCisjZW5kaWYJLyogU0tESUFHICovCisKKyNpZiAwCisKKy8qCisJV3JpdGUgdGhlIGR3b3JkICdkYXRhJyBhdCBhZGRyZXNzICdhZGRyJyBpbnRvIHRoZSBWUEQgRUVQUk9NLCBhbmQKKwl2ZXJpZnkgdGhhdCB0aGUgZGF0YSBpcyB3cml0dGVuLgorCisgTmVlZGVkIFRpbWU6CisKKy4JCQkJTUlOCQlNQVgKKy4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLiB3cml0ZQkJCQkxLjggbXMJCTMuNiBtcworLiBpbnRlcm5hbCB3cml0ZSBjeWxlcwkJMC43IG1zCQk3LjAgbXMKKy4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLiBvdmVyIGFsbCBwcm9ncmFtIHRpbWUJIAkyLjUgbXMJCTEwLjYgbXMKKy4gcmVhZAkJCQkxLjMgbXMJCTIuNiBtcworLiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuIG92ZXIgYWxsIAkJCTMuOCBtcwkJMTMuMiBtcworLgorCisKKyBSZXR1cm5zCTA6CXN1Y2Nlc3MKKwkJCTE6CWVycm9yLAlJMkMgdHJhbnNmZXIgZG9lcyBub3QgdGVybWluYXRlCisJCQkyOgllcnJvciwJZGF0YSB2ZXJpZnkgZXJyb3IKKworICovCitzdGF0aWMgaW50IFZwZFdyaXRlRFdvcmQoCitTS19BQwkqcEFDLAkvKiBwQUMgcG9pbnRlciAqLworU0tfSU9DCUlvQywJLyogSU8gQ29udGV4dCAqLworaW50CQlhZGRyLAkvKiBWUEQgYWRkcmVzcyAqLworU0tfVTMyCWRhdGEpCS8qIFZQRCBkYXRhIHRvIHdyaXRlICovCit7CisJLyogc3RhcnQgVlBEIHdyaXRlICovCisJLyogRG9uJ3Qgc3dhcCBoZXJlLCBpdCdzIGEgZGF0YSBzdHJlYW0gb2YgYnl0ZXMgKi8KKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiVlBEIHdyaXRlIGR3b3JkIGF0IGFkZHIgMHgleCwgZGF0YSA9IDB4JXhcbiIsYWRkcixkYXRhKSk7CisJVlBEX09VVDMyKHBBQywgSW9DLCBQQ0lfVlBEX0RBVF9SRUcsIChTS19VMzIpZGF0YSk7CisJLyogQnV0IGRvIGl0IGhlcmUgKi8KKwlhZGRyIHw9IFZQRF9XUklURTsKKworCVZQRF9PVVQxNihwQUMsIElvQywgUENJX1ZQRF9BRFJfUkVHLCAoU0tfVTE2KShhZGRyIHwgVlBEX1dSSVRFKSk7CisKKwkvKiB0aGlzIG1heSB0YWtlIHVwIHRvIDEwLDYgbXMgKi8KKwlpZiAoVnBkV2FpdChwQUMsIElvQywgVlBEX1dSSVRFKSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwKKwkJCSgiV3JpdGUgVGltZWQgT3V0XG4iKSk7CisJCXJldHVybigxKTsKKwl9OworCisJLyogdmVyaWZ5IGRhdGEgKi8KKwlpZiAoVnBkUmVhZERXb3JkKHBBQywgSW9DLCBhZGRyKSAhPSBkYXRhKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSIHwgU0tfREJHQ0FUX0ZBVEFMLAorCQkJKCJEYXRhIFZlcmlmeSBFcnJvclxuIikpOworCQlyZXR1cm4oMik7CisJfQorCXJldHVybigwKTsKK30JLyogVnBkV3JpdGVEV29yZCAqLworCisjZW5kaWYJLyogMCAqLworCisvKgorICoJUmVhZCBvbmUgU3RyZWFtIG9mICdsZW4nIGJ5dGVzIG9mIFZQRCBkYXRhLCBzdGFydGluZyBhdCAnYWRkcicgZnJvbQorICoJb3IgdG8gdGhlIEkyQyBFRVBST00uCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCAvIHdyaXR0ZW4uCisgKi8KK3N0YXRpYyBpbnQgVnBkV3JpdGVTdHJlYW0oCitTS19BQwkqcEFDLAkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBDb250ZXh0ICovCitjaGFyCSpidWYsCS8qIGRhdGEgYnVmZmVyICovCitpbnQJCUFkZHIsCS8qIFZQRCBzdGFydCBhZGRyZXNzICovCitpbnQJCUxlbikJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgLyB0byB3cml0ZSAqLworeworCWludAkJaTsKKwlpbnQJCWo7CisJU0tfVTE2CUFkclJlZzsKKwlpbnQJCVJ0djsKKwlTS19VOAkqIHBDb21wOwkvKiBDb21wYXJlIHBvaW50ZXIgKi8KKwlTS19VOAlEYXRhOwkJLyogSW5wdXQgRGF0YSBmb3IgQ29tcGFyZSAqLworCisJLyogSW5pdCBDb21wYXJlIFBvaW50ZXIgKi8KKwlwQ29tcCA9IChTS19VOCAqKSBidWY7CisKKwlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyssIGJ1ZisrKSB7CisJCWlmICgoaSVzaXplb2YoU0tfVTMyKSkgPT0gMCkgeworCQkJLyoKKwkJCSAqIEF0IHRoZSBiZWdpbiBvZiBlYWNoIGN5Y2xlIHJlYWQgdGhlIERhdGEgUmVnCisJCQkgKiBTbyBpdCBpcyBpbml0aWFsaXplZCBldmVuIGlmIG9ubHkgYSBmZXcgYnl0ZXMKKwkJCSAqIGFyZSB3cml0dGVuLgorCQkJICovCisJCQlBZHJSZWcgPSAoU0tfVTE2KSBBZGRyOworCQkJQWRyUmVnICY9IH5WUERfV1JJVEU7CS8qIFJFQUQgb3BlcmF0aW9uICovCisKKwkJCVZQRF9PVVQxNihwQUMsIElvQywgUENJX1ZQRF9BRFJfUkVHLCBBZHJSZWcpOworCisJCQkvKiBXYWl0IGZvciB0ZXJtaW5hdGlvbiAqLworCQkJUnR2ID0gVnBkV2FpdChwQUMsIElvQywgVlBEX1JFQUQpOworCQkJaWYgKFJ0diAhPSAwKSB7CisJCQkJcmV0dXJuKGkpOworCQkJfQorCQl9CisKKwkJLyogV3JpdGUgY3VycmVudCBCeXRlICovCisJCVZQRF9PVVQ4KHBBQywgSW9DLCBQQ0lfVlBEX0RBVF9SRUcgKyAoaSVzaXplb2YoU0tfVTMyKSksCisJCQkJKihTS19VOCopYnVmKTsKKworCQlpZiAoKChpJXNpemVvZihTS19VMzIpKSA9PSAzKSB8fCAoaSA9PSAoTGVuIC0gMSkpKSB7CisJCQkvKiBOZXcgQWRkcmVzcyBuZWVkcyB0byBiZSB3cml0dGVuIHRvIFZQRF9BRERSIHJlZyAqLworCQkJQWRyUmVnID0gKFNLX1UxNikgQWRkcjsKKwkJCUFkZHIgKz0gc2l6ZW9mKFNLX1UzMik7CisJCQlBZHJSZWcgfD0gVlBEX1dSSVRFOwkvKiBXUklURSBvcGVyYXRpb24gKi8KKworCQkJVlBEX09VVDE2KHBBQywgSW9DLCBQQ0lfVlBEX0FEUl9SRUcsIEFkclJlZyk7CisKKwkJCS8qIFdhaXQgZm9yIHRlcm1pbmF0aW9uICovCisJCQlSdHYgPSBWcGRXYWl0KHBBQywgSW9DLCBWUERfV1JJVEUpOworCQkJaWYgKFJ0diAhPSAwKSB7CisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsCisJCQkJCSgiV3JpdGUgVGltZWQgT3V0XG4iKSk7CisJCQkJcmV0dXJuKGkgLSAoaSVzaXplb2YoU0tfVTMyKSkpOworCQkJfQorCisJCQkvKgorCQkJICogTm93IHJlLXJlYWQgdG8gdmVyaWZ5CisJCQkgKi8KKwkJCUFkclJlZyAmPSB+VlBEX1dSSVRFOwkvKiBSRUFEIG9wZXJhdGlvbiAqLworCisJCQlWUERfT1VUMTYocEFDLCBJb0MsIFBDSV9WUERfQURSX1JFRywgQWRyUmVnKTsKKworCQkJLyogV2FpdCBmb3IgdGVybWluYXRpb24gKi8KKwkJCVJ0diA9IFZwZFdhaXQocEFDLCBJb0MsIFZQRF9SRUFEKTsKKwkJCWlmIChSdHYgIT0gMCkgeworCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJCQkoIlZlcmlmeSBUaW1lZCBPdXRcbiIpKTsKKwkJCQlyZXR1cm4oaSAtIChpJXNpemVvZihTS19VMzIpKSk7CisJCQl9CisKKwkJCWZvciAoaiA9IDA7IGogPD0gKGludCkoaSVzaXplb2YoU0tfVTMyKSk7IGorKywgcENvbXArKykgeworCQkJCQorCQkJCVZQRF9JTjgocEFDLCBJb0MsIFBDSV9WUERfREFUX1JFRyArIGosICZEYXRhKTsKKwkJCQkKKwkJCQlpZiAoRGF0YSAhPSAqcENvbXApIHsKKwkJCQkJLyogVmVyaWZ5IEVycm9yICovCisJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJCQkJKCJXcml0ZVN0cmVhbSBWZXJpZnkgRXJyb3JcbiIpKTsKKwkJCQkJcmV0dXJuKGkgLSAoaSVzaXplb2YoU0tfVTMyKSkgKyBqKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oTGVuKTsKK30KKwkKKworLyoKKyAqCVJlYWQgb25lIFN0cmVhbSBvZiAnbGVuJyBieXRlcyBvZiBWUEQgZGF0YSwgc3RhcnRpbmcgYXQgJ2FkZHInIGZyb20KKyAqCW9yIHRvIHRoZSBJMkMgRUVQUk9NLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgLyB3cml0dGVuLgorICovCitzdGF0aWMgaW50IFZwZFJlYWRTdHJlYW0oCitTS19BQwkqcEFDLAkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBDb250ZXh0ICovCitjaGFyCSpidWYsCS8qIGRhdGEgYnVmZmVyICovCitpbnQJCUFkZHIsCS8qIFZQRCBzdGFydCBhZGRyZXNzICovCitpbnQJCUxlbikJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgLyB0byB3cml0ZSAqLworeworCWludAkJaTsKKwlTS19VMTYJQWRyUmVnOworCWludAkJUnR2OworCisJZm9yIChpID0gMDsgaSA8IExlbjsgaSsrLCBidWYrKykgeworCQlpZiAoKGklc2l6ZW9mKFNLX1UzMikpID09IDApIHsKKwkJCS8qIE5ldyBBZGRyZXNzIG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gVlBEX0FERFIgcmVnICovCisJCQlBZHJSZWcgPSAoU0tfVTE2KSBBZGRyOworCQkJQWRkciArPSBzaXplb2YoU0tfVTMyKTsKKwkJCUFkclJlZyAmPSB+VlBEX1dSSVRFOwkvKiBSRUFEIG9wZXJhdGlvbiAqLworCisJCQlWUERfT1VUMTYocEFDLCBJb0MsIFBDSV9WUERfQURSX1JFRywgQWRyUmVnKTsKKworCQkJLyogV2FpdCBmb3IgdGVybWluYXRpb24gKi8KKwkJCVJ0diA9IFZwZFdhaXQocEFDLCBJb0MsIFZQRF9SRUFEKTsKKwkJCWlmIChSdHYgIT0gMCkgeworCQkJCXJldHVybihpKTsKKwkJCX0KKwkJfQorCQlWUERfSU44KHBBQywgSW9DLCBQQ0lfVlBEX0RBVF9SRUcgKyAoaSVzaXplb2YoU0tfVTMyKSksCisJCQkoU0tfVTggKilidWYpOworCX0KKworCXJldHVybihMZW4pOworfQorCisvKgorICoJUmVhZCBvcmUgd3JpdGVzICdsZW4nIGJ5dGVzIG9mIFZQRCBkYXRhLCBzdGFydGluZyBhdCAnYWRkcicgZnJvbQorICoJb3IgdG8gdGhlIEkyQyBFRVBST00uCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCAvIHdyaXR0ZW4uCisgKi8KK3N0YXRpYyBpbnQgVnBkVHJhbnNmZXJCbG9jaygKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIENvbnRleHQgKi8KK2NoYXIJKmJ1ZiwJLyogZGF0YSBidWZmZXIgKi8KK2ludAkJYWRkciwJLyogVlBEIHN0YXJ0IGFkZHJlc3MgKi8KK2ludAkJbGVuLAkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAvIHRvIHdyaXRlICovCitpbnQJCWRpcikJLyogdHJhbnNmZXIgZGlyZWN0aW9uIG1heSBiZSBWUERfUkVBRCBvciBWUERfV1JJVEUgKi8KK3sKKwlpbnQJCVJ0djsJLyogUmV0dXJuIHZhbHVlICovCisJaW50CQl2cGRfcm9tX3NpemU7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiVlBEICVzIGJsb2NrLCBhZGRyID0gMHgleCwgbGVuID0gJWRcbiIsCisJCWRpciA/ICJ3cml0ZSIgOiAicmVhZCIsIGFkZHIsIGxlbikpOworCisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4oMCk7CisKKwl2cGRfcm9tX3NpemUgPSBwQUMtPnZwZC5yb21fc2l6ZTsKKwkKKwlpZiAoYWRkciA+IHZwZF9yb21fc2l6ZSAtIDQpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIgfCBTS19EQkdDQVRfRkFUQUwsCisJCQkoIkFkZHJlc3MgZXJyb3I6IDB4JXgsIGV4cC4gPCAweCV4XG4iLAorCQkJYWRkciwgdnBkX3JvbV9zaXplIC0gNCkpOworCQlyZXR1cm4oMCk7CisJfQorCQorCWlmIChhZGRyICsgbGVuID4gdnBkX3JvbV9zaXplKSB7CisJCWxlbiA9IHZwZF9yb21fc2l6ZSAtIGFkZHI7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJKCJXYXJuaW5nOiBsZW4gd2FzIGN1dCB0byAlZFxuIiwgbGVuKSk7CisJfQorCisJaWYgKGRpciA9PSBWUERfUkVBRCkgeworCQlSdHYgPSBWcGRSZWFkU3RyZWFtKHBBQywgSW9DLCBidWYsIGFkZHIsIGxlbik7CisJfQorCWVsc2UgeworCQlSdHYgPSBWcGRXcml0ZVN0cmVhbShwQUMsIElvQywgYnVmLCBhZGRyLCBsZW4pOworCX0KKworCXJldHVybihSdHYpOworfQorCisjaWZkZWYgU0tESUFHCisKKy8qCisgKglSZWFkICdsZW4nIGJ5dGVzIG9mIFZQRCBkYXRhLCBzdGFydGluZyBhdCAnYWRkcicuCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAqLworaW50IFZwZFJlYWRCbG9jaygKK1NLX0FDCSpwQUMsCS8qIHBBQyBwb2ludGVyICovCitTS19JT0MJSW9DLAkvKiBJTyBDb250ZXh0ICovCitjaGFyCSpidWYsCS8qIGJ1ZmZlciB3ZXJlIHRoZSBkYXRhIHNob3VsZCBiZSBzdG9yZWQgKi8KK2ludAkJYWRkciwJLyogc3RhcnQgcmVhZGluZyBhdCB0aGUgVlBEIGFkZHJlc3MgKi8KK2ludAkJbGVuKQkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAqLworeworCXJldHVybihWcGRUcmFuc2ZlckJsb2NrKHBBQywgSW9DLCBidWYsIGFkZHIsIGxlbiwgVlBEX1JFQUQpKTsKK30KKworLyoKKyAqCVdyaXRlICdsZW4nIGJ5dGVzIG9mICpidXQgdG8gdGhlIFZQRCBFRVBST00sIHN0YXJ0aW5nIGF0ICdhZGRyJy4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB3cml0ZXMuCisgKi8KK2ludCBWcGRXcml0ZUJsb2NrKAorU0tfQUMJKnBBQywJLyogcEFDIHBvaW50ZXIgKi8KK1NLX0lPQwlJb0MsCS8qIElPIENvbnRleHQgKi8KK2NoYXIJKmJ1ZiwJLyogYnVmZmVyLCBob2xkcyB0aGUgZGF0YSB0byB3cml0ZSAqLworaW50CQlhZGRyLAkvKiBzdGFydCB3cml0aW5nIGF0IHRoZSBWUEQgYWRkcmVzcyAqLworaW50CQlsZW4pCS8qIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAqLworeworCXJldHVybihWcGRUcmFuc2ZlckJsb2NrKHBBQywgSW9DLCBidWYsIGFkZHIsIGxlbiwgVlBEX1dSSVRFKSk7Cit9CisjZW5kaWYJLyogU0tESUFHICovCisKKy8qCisgKiAocmUpaW5pdGlhbGl6ZSB0aGUgVlBEIGJ1ZmZlcgorICoKKyAqIFJlYWRzIHRoZSBWUEQgZGF0YSBmcm9tIHRoZSBFRVBST00gaW50byB0aGUgVlBEIGJ1ZmZlci4KKyAqIEdldCB0aGUgcmVtYWluaW5nIHJlYWQgb25seSBhbmQgcmVhZCAvIHdyaXRlIHNwYWNlLgorICoKKyAqIHJldHVybgkwOglzdWNjZXNzCisgKgkJMToJZmF0YWwgVlBEIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgVnBkSW5pdCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MpCS8qIElPIENvbnRleHQgKi8KK3sKKwlTS19WUERfUEFSQSAqciwgcnA7CS8qIFJXIG9yIFJWICovCisJaW50CQlpOworCXVuc2lnbmVkIGNoYXIJeDsKKwlpbnQJCXZwZF9zaXplOworCVNLX1UxNglkZXZfaWQ7CisJU0tfVTMyCW91cl9yZWcyOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9JTklULCAoIlZwZEluaXQgLi4gIikpOworCQorCVZQRF9JTjE2KHBBQywgSW9DLCBQQ0lfREVWSUNFX0lELCAmZGV2X2lkKTsKKwkKKwlWUERfSU4zMihwQUMsIElvQywgUENJX09VUl9SRUdfMiwgJm91cl9yZWcyKTsKKwkKKwlwQUMtPnZwZC5yb21fc2l6ZSA9IDI1NiA8PCAoKG91cl9yZWcyICYgUENJX1ZQRF9ST01fU1opID4+IDE0KTsKKwkKKwkvKgorCSAqIHRoaXMgZnVuY3Rpb24gbWlnaHQgZ2V0IHVzZWQgYmVmb3JlIHRoZSBoYXJkd2FyZSBpcyBpbml0aWFsaXplZAorCSAqIHRoZXJlZm9yZSB3ZSBjYW5ub3QgYWx3YXlzIHRydXN0IGluIEdJQ2hpcElkCisJICovCisJaWYgKCgocEFDLT52cGQudi52cGRfc3RhdHVzICYgVlBEX1ZBTElEKSA9PSAwICYmCisJCWRldl9pZCAhPSBWUERfREVWX0lEX0dFTkVTSVMpIHx8CisJCSgocEFDLT52cGQudi52cGRfc3RhdHVzICYgVlBEX1ZBTElEKSAhPSAwICYmCisJCSFwQUMtPkdJbmkuR0lHZW5lc2lzKSkgeworCisJCS8qIGZvciBZdWtvbiB0aGUgVlBEIHNpemUgaXMgYWx3YXlzIDI1NiAqLworCQl2cGRfc2l6ZSA9IFZQRF9TSVpFX1lVS09OOworCX0KKwllbHNlIHsKKwkJLyogR2VuZXNpcyB1c2VzIHRoZSBtYXhpbXVtIFJPTSBzaXplIHVwIHRvIDUxMiBmb3IgVlBEICovCisJCWlmIChwQUMtPnZwZC5yb21fc2l6ZSA+IFZQRF9TSVpFX0dFTkVTSVMpIHsKKwkJCXZwZF9zaXplID0gVlBEX1NJWkVfR0VORVNJUzsKKwkJfQorCQllbHNlIHsKKwkJCXZwZF9zaXplID0gcEFDLT52cGQucm9tX3NpemU7CisJCX0KKwl9CisKKwkvKiByZWFkIHRoZSBWUEQgZGF0YSBpbnRvIHRoZSBWUEQgYnVmZmVyICovCisJaWYgKFZwZFRyYW5zZmVyQmxvY2socEFDLCBJb0MsIHBBQy0+dnBkLnZwZF9idWYsIDAsIHZwZF9zaXplLCBWUERfUkVBRCkKKwkJIT0gdnBkX3NpemUpIHsKKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwKKwkJCSgiQmxvY2sgUmVhZCBFcnJvclxuIikpOworCQlyZXR1cm4oMSk7CisJfQorCQorCXBBQy0+dnBkLnZwZF9zaXplID0gdnBkX3NpemU7CisKKwkvKiBBc3VzIEs4ViBTZSBEZWx1eGUgYnVnZml4LiBDb3JyZWN0IFZQRCBjb250ZW50ICovCisJLyogTUJvIEFwcmlsIDIwMDQgKi8KKwlpZiAoKCh1bnNpZ25lZCBjaGFyKXBBQy0+dnBkLnZwZF9idWZbMHgzZl0gPT0gMHgzOCkgJiYKKwkgICAgKCh1bnNpZ25lZCBjaGFyKXBBQy0+dnBkLnZwZF9idWZbMHg0MF0gPT0gMHgzYykgJiYKKwkgICAgKCh1bnNpZ25lZCBjaGFyKXBBQy0+dnBkLnZwZF9idWZbMHg0MV0gPT0gMHg0NSkpIHsKKwkJcHJpbnRrKCJzazk4bGluOiBBc3VzIG1haW5ib2FyZCB3aXRoIGJ1Z2d5IFZQRD8gIgorCQkJCSJDb3JyZWN0aW5nIGRhdGEuXG4iKTsKKwkJcEFDLT52cGQudnBkX2J1ZlsweDQwXSA9IDB4Mzg7CisJfQorCisKKwkvKiBmaW5kIHRoZSBlbmQgdGFnIG9mIHRoZSBSTyBhcmVhICovCisJaWYgKCEociA9IHZwZF9maW5kX3BhcmEocEFDLCBWUERfUlYsICZycCkpKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSIHwgU0tfREJHQ0FUX0ZBVEFMLAorCQkJKCJFbmNvZGluZyBFcnJvcjogUlYgVGFnIG5vdCBmb3VuZFxuIikpOworCQlyZXR1cm4oMSk7CisJfQorCQorCWlmIChyLT5wX3ZhbCArIHItPnBfbGVuID4gcEFDLT52cGQudnBkX2J1ZiArIHZwZF9zaXplLzIpIHsKKwkJU0tfREJHX01TRyhwQUMsU0tfREJHTU9EX1ZQRCxTS19EQkdDQVRfRVJSIHwgU0tfREJHQ0FUX0ZBVEFMLAorCQkJKCJFbmNvZGluZyBFcnJvcjogSW52YWxpZCBWUEQgc3RydWN0IHNpemVcbiIpKTsKKwkJcmV0dXJuKDEpOworCX0KKwlwQUMtPnZwZC52LnZwZF9mcmVlX3JvID0gci0+cF9sZW4gLSAxOworCisJLyogdGVzdCB0aGUgY2hlY2tzdW0gKi8KKwlmb3IgKGkgPSAwLCB4ID0gMDsgKHVuc2lnbmVkKWkgPD0gKHVuc2lnbmVkKXZwZF9zaXplLzIgLSByLT5wX2xlbjsgaSsrKSB7CisJCXggKz0gcEFDLT52cGQudnBkX2J1ZltpXTsKKwl9CisJCisJaWYgKHggIT0gMCkgeworCQkvKiBjaGVja3N1bSBlcnJvciAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiB8IFNLX0RCR0NBVF9GQVRBTCwKKwkJCSgiVlBEIENoZWNrc3VtIEVycm9yXG4iKSk7CisJCXJldHVybigxKTsKKwl9CisKKwkvKiBmaW5kIGFuZCBjaGVjayB0aGUgZW5kIHRhZyBvZiB0aGUgUlcgYXJlYSAqLworCWlmICghKHIgPSB2cGRfZmluZF9wYXJhKHBBQywgVlBEX1JXLCAmcnApKSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiB8IFNLX0RCR0NBVF9GQVRBTCwKKwkJCSgiRW5jb2RpbmcgRXJyb3I6IFJWIFRhZyBub3QgZm91bmRcbiIpKTsKKwkJcmV0dXJuKDEpOworCX0KKwkKKwlpZiAoci0+cF92YWwgPCBwQUMtPnZwZC52cGRfYnVmICsgdnBkX3NpemUvMikgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiB8IFNLX0RCR0NBVF9GQVRBTCwKKwkJCSgiRW5jb2RpbmcgRXJyb3I6IEludmFsaWQgVlBEIHN0cnVjdCBzaXplXG4iKSk7CisJCXJldHVybigxKTsKKwl9CisJcEFDLT52cGQudi52cGRfZnJlZV9ydyA9IHItPnBfbGVuOworCisJLyogZXZlcnl0aGluZyBzZWVtcyB0byBiZSBvayAqLworCWlmIChwQUMtPkdJbmkuR0lDaGlwSWQgIT0gMCkgeworCQlwQUMtPnZwZC52LnZwZF9zdGF0dXMgfD0gVlBEX1ZBTElEOworCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfSU5JVCwKKwkJKCJkb25lLiBGcmVlIFJPID0gJWQsIEZyZWUgUlcgPSAlZFxuIiwKKwkJcEFDLT52cGQudi52cGRfZnJlZV9ybywgcEFDLT52cGQudi52cGRfZnJlZV9ydykpOworCisJcmV0dXJuKDApOworfQorCisvKgorICoJZmluZCB0aGUgS2V5d29yZCAna2V5JyBpbiB0aGUgVlBEIGJ1ZmZlciBhbmQgZmlsbHMgdGhlCisgKglwYXJhbWV0ZXIgc3RydWN0ICdwJyB3aXRoIGl0J3MgdmFsdWVzCisgKgorICogcmV0dXJucwkqcAlzdWNjZXNzCisgKgkJMDoJcGFyYW1ldGVyIHdhcyBub3QgZm91bmQgb3IgVlBEIGVuY29kaW5nIGVycm9yCisgKi8KK3N0YXRpYyBTS19WUERfUEFSQSAqdnBkX2ZpbmRfcGFyYSgKK1NLX0FDCQkqcEFDLAkvKiBjb21tb24gZGF0YSBiYXNlICovCitjb25zdCBjaGFyCSprZXksCS8qIGtleXdvcmQgdG8gZmluZCAoZS5nLiAiTU4iKSAqLworU0tfVlBEX1BBUkEgKnApCQkvKiBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gc3RydWN0ICovCit7CisJY2hhciAqdgk7CS8qIHBvaW50cyB0byBWUEQgYnVmZmVyICovCisJaW50IG1heDsJLyogTWF4aW11bSBOdW1iZXIgb2YgSXRlcmF0aW9ucyAqLworCisJdiA9IHBBQy0+dnBkLnZwZF9idWY7CisJbWF4ID0gMTI4OworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlZQRCBmaW5kIHBhcmEgJXMgLi4gIixrZXkpKTsKKworCS8qIGNoZWNrIG1hbmRhdG9yeSByZXNvdXJjZSB0eXBlIElEIHN0cmluZyAoUHJvZHVjdCBOYW1lKSAqLworCWlmICgqdiAhPSAoY2hhcilSRVNfSUQpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIgfCBTS19EQkdDQVRfRkFUQUwsCisJCQkoIkVycm9yOiAweCV4IG1pc3NpbmdcbiIsIFJFU19JRCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoc3RyY21wKGtleSwgVlBEX05BTUUpID09IDApIHsKKwkJcC0+cF9sZW4gPSBWUERfR0VUX1JFU19MRU4odik7CisJCXAtPnBfdmFsID0gVlBEX0dFVF9WQUwodik7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiZm91bmQsIGxlbiA9ICVkXG4iLCBwLT5wX2xlbikpOworCQlyZXR1cm4ocCk7CisJfQorCisJdiArPSAzICsgVlBEX0dFVF9SRVNfTEVOKHYpICsgMzsKKwlmb3IgKDs7ICkgeworCQlpZiAoU0tfTUVNQ01QKGtleSx2LDIpID09IDApIHsKKwkJCXAtPnBfbGVuID0gVlBEX0dFVF9WUERfTEVOKHYpOworCQkJcC0+cF92YWwgPSBWUERfR0VUX1ZBTCh2KTsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoImZvdW5kLCBsZW4gPSAlZFxuIixwLT5wX2xlbikpOworCQkJcmV0dXJuKHApOworCQl9CisKKwkJLyogZXhpdCB3aGVuIHJlYWNoaW5nIHRoZSAiUlciIFRhZyBvciB0aGUgbWF4aW11bSBvZiBpdGVyYS4gKi8KKwkJbWF4LS07CisJCWlmIChTS19NRU1DTVAoVlBEX1JXLHYsMikgPT0gMCB8fCBtYXggPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoU0tfTUVNQ01QKFZQRF9SVix2LDIpID09IDApIHsKKwkJCXYgKz0gMyArIFZQRF9HRVRfVlBEX0xFTih2KSArIDM7CS8qIHNraXAgVlBELVcgKi8KKwkJfQorCQllbHNlIHsKKwkJCXYgKz0gMyArIFZQRF9HRVRfVlBEX0xFTih2KTsKKwkJfQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoInNjYW5uaW5nICclYyVjJyBsZW4gPSAlZFxuIix2WzBdLHZbMV0sdlsyXSkpOworCX0KKworI2lmZGVmIERFQlVHCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9DVFJMLCAoIm5vdCBmb3VuZFxuIikpOworCWlmIChtYXggPT0gMCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiB8IFNLX0RCR0NBVF9GQVRBTCwKKwkJCSgiS2V5L0xlbiBFbmNvZGluZyBlcnJvclxuIikpOworCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCXJldHVybiBOVUxMOworfQorCisvKgorICoJTW92ZSAnbicgYnl0ZXMuIEJlZ2luIHdpdGggdGhlIGxhc3QgYnl0ZSBpZiAnbicgaXMgPiAwLAorICoJU3RhcnQgd2l0aCB0aGUgbGFzdCBieXRlIGlmIG4gaXMgPCAwLgorICoKKyAqIHJldHVybnMgbm90aGluZworICovCitzdGF0aWMgdm9pZCB2cGRfbW92ZV9wYXJhKAorY2hhcgkqc3RhcnQsCQkvKiBzdGFydCBvZiBtZW1vcnkgYmxvY2sgKi8KK2NoYXIJKmVuZCwJCS8qIGVuZCBvZiBtZW1vcnkgYmxvY2sgdG8gbW92ZSAqLworaW50CQluKQkJCS8qIG51bWJlciBvZiBieXRlcyB0aGUgbWVtb3J5IGJsb2NrIGhhcyB0byBiZSBtb3ZlZCAqLworeworCWNoYXIgKnA7CisJaW50IGk7CQkvKiBudW1iZXIgb2YgYnl0ZSBjb3BpZWQgKi8KKworCWlmIChuID09IDApCisJCXJldHVybjsKKworCWkgPSAoaW50KSAoZW5kIC0gc3RhcnQgKyAxKTsKKwlpZiAobiA8IDApIHsKKwkJcCA9IHN0YXJ0ICsgbjsKKwkJd2hpbGUgKGkgIT0gMCkgeworCQkJKnArKyA9ICpzdGFydCsrOworCQkJaS0tOworCQl9CisJfQorCWVsc2UgeworCQlwID0gZW5kICsgbjsKKwkJd2hpbGUgKGkgIT0gMCkgeworCQkJKnAtLSA9ICplbmQtLTsKKwkJCWktLTsKKwkJfQorCX0KK30KKworLyoKKyAqCXNldHVwIHRoZSBWUEQga2V5d29yZCAna2V5JyBhdCAnaXAnLgorICoKKyAqIHJldHVybnMgbm90aGluZworICovCitzdGF0aWMgdm9pZCB2cGRfaW5zZXJ0X2tleSgKK2NvbnN0IGNoYXIJKmtleSwJLyoga2V5d29yZCB0byBpbnNlcnQgKi8KK2NvbnN0IGNoYXIJKmJ1ZiwJLyogYnVmZmVyIHdpdGggdGhlIGtleXdvcmQgdmFsdWUgKi8KK2ludAkJbGVuLAkJLyogbGVuZ3RoIG9mIHRoZSB2YWx1ZSBzdHJpbmcgKi8KK2NoYXIJKmlwKQkJLyogaW5zZXJhdGlvbiBwb2ludCAqLworeworCVNLX1ZQRF9LRVkgKnA7CisKKwlwID0gKFNLX1ZQRF9LRVkgKikgaXA7CisJcC0+cF9rZXlbMF0gPSBrZXlbMF07CisJcC0+cF9rZXlbMV0gPSBrZXlbMV07CisJcC0+cF9sZW4gPSAodW5zaWduZWQgY2hhcikgbGVuOworCVNLX01FTUNQWSgmcC0+cF92YWwsYnVmLGxlbik7Cit9CisKKy8qCisgKglTZXR1cCB0aGUgVlBEIGVuZCB0YWcgIlJWIiAvICJSVyIuCisgKglBbHNvIGNvcnJlY3QgdGhlIHJlbWFpbmluZyBzcGFjZSB2YXJpYWJsZXMgdnBkX2ZyZWVfcm8gLyB2cGRfZnJlZV9ydy4KKyAqCisgKiByZXR1cm5zCTA6CXN1Y2Nlc3MKKyAqCQkxOgllbmNvZGluZyBlcnJvcgorICovCitzdGF0aWMgaW50IHZwZF9tb2RfZW5kdGFnKAorU0tfQUMJKnBBQywJCS8qIGNvbW1vbiBkYXRhIGJhc2UgKi8KK2NoYXIJKmV0cCkJCS8qIGVuZCBwb2ludGVyIGlucHV0IHBvc2l0aW9uICovCit7CisJU0tfVlBEX0tFWSAqcDsKKwl1bnNpZ25lZCBjaGFyCXg7CisJaW50CWk7CisJaW50CXZwZF9zaXplOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlZQRCBtb2RpZnkgZW5kdGFnIGF0IDB4JXggPSAnJWMlYydcbiIsZXRwLGV0cFswXSxldHBbMV0pKTsKKworCXZwZF9zaXplID0gcEFDLT52cGQudnBkX3NpemU7CisKKwlwID0gKFNLX1ZQRF9LRVkgKikgZXRwOworCisJaWYgKHAtPnBfa2V5WzBdICE9ICdSJyB8fCAocC0+cF9rZXlbMV0gIT0gJ1YnICYmIHAtPnBfa2V5WzFdICE9ICdXJykpIHsKKwkJLyogc29tZXRoaW5nIHdyb25nIGhlcmUsIGVuY29kaW5nIGVycm9yICovCisJCVNLX0RCR19NU0cocEFDLFNLX0RCR01PRF9WUEQsU0tfREJHQ0FUX0VSUiB8IFNLX0RCR0NBVF9GQVRBTCwKKwkJCSgiRW5jb2RpbmcgRXJyb3I6IGludmFsaWQgZW5kIHRhZ1xuIikpOworCQlyZXR1cm4oMSk7CisJfQorCWlmIChldHAgPiBwQUMtPnZwZC52cGRfYnVmICsgdnBkX3NpemUvMikgeworCQkvKiBjcmVhdGUgIlJXIiB0YWcgKi8KKwkJcC0+cF9sZW4gPSAodW5zaWduZWQgY2hhcikocEFDLT52cGQudnBkX2J1Zit2cGRfc2l6ZS1ldHAtMy0xKTsKKwkJcEFDLT52cGQudi52cGRfZnJlZV9ydyA9IChpbnQpIHAtPnBfbGVuOworCQlpID0gcEFDLT52cGQudi52cGRfZnJlZV9ydzsKKwkJZXRwICs9IDM7CisJfQorCWVsc2UgeworCQkvKiBjcmVhdGUgIlJWIiB0YWcgKi8KKwkJcC0+cF9sZW4gPSAodW5zaWduZWQgY2hhcikocEFDLT52cGQudnBkX2J1Zit2cGRfc2l6ZS8yLWV0cC0zKTsKKwkJcEFDLT52cGQudi52cGRfZnJlZV9ybyA9IChpbnQpIHAtPnBfbGVuIC0gMTsKKworCQkvKiBzZXR1cCBjaGVja3N1bSAqLworCQlmb3IgKGkgPSAwLCB4ID0gMDsgaSA8IHZwZF9zaXplLzIgLSBwLT5wX2xlbjsgaSsrKSB7CisJCQl4ICs9IHBBQy0+dnBkLnZwZF9idWZbaV07CisJCX0KKwkJcC0+cF92YWwgPSAoY2hhcikgMCAtIHg7CisJCWkgPSBwQUMtPnZwZC52LnZwZF9mcmVlX3JvOworCQlldHAgKz0gNDsKKwl9CisJd2hpbGUgKGkpIHsKKwkJKmV0cCsrID0gMHgwMDsKKwkJaS0tOworCX0KKworCXJldHVybigwKTsKK30KKworLyoKKyAqCUluc2VydCBhIFZQRCBrZXl3b3JkIGludG8gdGhlIFZQRCBidWZmZXIuCisgKgorICoJVGhlIGtleXdvcmQgJ2tleScgaXMgaW5zZXJ0ZWQgYXQgdGhlIHBvc2l0aW9uICdpcCcgaW4gdGhlCisgKglWUEQgYnVmZmVyLgorICoJVGhlIGtleXdvcmRzIGJlaGluZCB0aGUgaW5wdXQgcG9zaXRpb24gd2lsbAorICoJYmUgbW92ZWQuIFRoZSBWUEQgZW5kIHRhZyAiUlYiIG9yICJSVyIgaXMgZ2VuZXJhdGVkIGFnYWluLgorICoKKyAqIHJldHVybnMJMDoJc3VjY2VzcworICoJCTI6CXZhbHVlIHN0cmluZyB3YXMgY3V0CisgKgkJNDoJVlBEIGZ1bGwsIGtleXdvcmQgd2FzIG5vdCB3cml0dGVuCisgKgkJNjoJZmF0YWwgVlBEIGVycm9yCisgKgorICovCitpbnQJVnBkU2V0dXBQYXJhKAorU0tfQUMJKnBBQywJCS8qIGNvbW1vbiBkYXRhIGJhc2UgKi8KK2NvbnN0IGNoYXIJKmtleSwJLyoga2V5d29yZCB0byBpbnNlcnQgKi8KK2NvbnN0IGNoYXIJKmJ1ZiwJLyogYnVmZmVyIHdpdGggdGhlIGtleXdvcmQgdmFsdWUgKi8KK2ludAkJbGVuLAkJLyogbGVuZ3RoIG9mIHRoZSBrZXl3b3JkIHZhbHVlICovCitpbnQJCXR5cGUsCQkvKiBWUERfUk9fS0VZIG9yIFZQRF9SV19LRVkgKi8KK2ludAkJb3ApCQkJLyogb3BlcmF0aW9uIHRvIGRvOiBBRERfS0VZIG9yIE9XUl9LRVkgKi8KK3sKKwlTS19WUERfUEFSQSB2cDsKKwljaGFyCSpldHA7CQkvKiBlbmQgdGFnIHBvc2l0aW9uICovCisJaW50CWZyZWU7CQkvKiByZW1haW5pbmcgc3BhY2UgaW4gc2VsZWN0ZWQgYXJlYSAqLworCWNoYXIJKmlwOwkJLyogaW5wdXQgcG9zaXRpb24gaW5zaWRlIHRoZSBWUEQgYnVmZmVyICovCisJaW50CXJ0djsJCS8qIHJldHVybiBjb2RlICovCisJaW50CWhlYWQ7CQkvKiBhZGRpdGlvbmFsIGhhZWRlciBieXRlcyB0byBtb3ZlICovCisJaW50CWZvdW5kOwkJLyogYWRkaXRpbm9hbCBieXRlcyBpZiB0aGUga2V5d29yZCB3YXMgZm91bmQgKi8KKwlpbnQgdnBkX3NpemU7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiVlBEIHNldHVwIHBhcmEga2V5ID0gJXMsIHZhbCA9ICVzXG4iLGtleSxidWYpKTsKKwkKKwl2cGRfc2l6ZSA9IHBBQy0+dnBkLnZwZF9zaXplOworCisJcnR2ID0gMDsKKwlpcCA9IE5VTEw7CisJaWYgKHR5cGUgPT0gVlBEX1JXX0tFWSkgeworCQkvKiBlbmQgdGFnIGlzICJSVyIgKi8KKwkJZnJlZSA9IHBBQy0+dnBkLnYudnBkX2ZyZWVfcnc7CisJCWV0cCA9IHBBQy0+dnBkLnZwZF9idWYgKyAodnBkX3NpemUgLSBmcmVlIC0gMSAtIDMpOworCX0KKwllbHNlIHsKKwkJLyogZW5kIHRhZyBpcyAiUlYiICovCisJCWZyZWUgPSBwQUMtPnZwZC52LnZwZF9mcmVlX3JvOworCQlldHAgPSBwQUMtPnZwZC52cGRfYnVmICsgKHZwZF9zaXplLzIgLSBmcmVlIC0gNCk7CisJfQorCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJGcmVlIFJPID0gJWQsIEZyZWUgUlcgPSAlZFxuIiwKKwkJcEFDLT52cGQudi52cGRfZnJlZV9ybywgcEFDLT52cGQudi52cGRfZnJlZV9ydykpOworCisJaGVhZCA9IDA7CisJZm91bmQgPSAwOworCWlmIChvcCA9PSBPV1JfS0VZKSB7CisJCWlmICh2cGRfZmluZF9wYXJhKHBBQywga2V5LCAmdnApKSB7CisJCQlmb3VuZCA9IDM7CisJCQlpcCA9IHZwLnBfdmFsIC0gMzsKKwkJCWZyZWUgKz0gdnAucF9sZW4gKyAzOworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiT3ZlcndyaXRlIEtleVxuIikpOworCQl9CisJCWVsc2UgeworCQkJb3AgPSBBRERfS0VZOworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiQWRkIEtleVxuIikpOworCQl9CisJfQorCWlmIChvcCA9PSBBRERfS0VZKSB7CisJCWlwID0gZXRwOworCQl2cC5wX2xlbiA9IDA7CisJCWhlYWQgPSAzOworCX0KKworCWlmIChsZW4gKyAzID4gZnJlZSkgeworCQlpZiAoZnJlZSA8IDcpIHsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJCSgiVlBEIEJ1ZmZlciBPdmVyZmxvdywga2V5d29yZCBub3Qgd3JpdHRlblxuIikpOworCQkJcmV0dXJuKDQpOworCQl9CisJCS8qIGN1dCBpdCBhZ2FpbiAqLworCQlsZW4gPSBmcmVlIC0gMzsKKwkJcnR2ID0gMjsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsCisJCQkoIlZQRCBCdWZmZXIgRnVsbCwgS2V5d29yZCB3YXMgY3V0XG4iKSk7CisJfQorCisJdnBkX21vdmVfcGFyYShpcCArIHZwLnBfbGVuICsgZm91bmQsIGV0cCsyLCBsZW4tdnAucF9sZW4raGVhZCk7CisJdnBkX2luc2VydF9rZXkoa2V5LCBidWYsIGxlbiwgaXApOworCWlmICh2cGRfbW9kX2VuZHRhZyhwQUMsIGV0cCArIGxlbiAtIHZwLnBfbGVuICsgaGVhZCkpIHsKKwkJcEFDLT52cGQudi52cGRfc3RhdHVzICY9IH5WUERfVkFMSUQ7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJKCJWUEQgRW5jb2RpbmcgRXJyb3JcbiIpKTsKKwkJcmV0dXJuKDYpOworCX0KKworCXJldHVybihydHYpOworfQorCisKKy8qCisgKglSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgVlBEIEVFUFJPTSBhbmQgY29weSBpdCB0byB0aGUKKyAqCVZQRCBidWZmZXIgaWYgbm90IGFscmVhZHkgZG9uZS4KKyAqCisgKiByZXR1cm46CUEgcG9pbnRlciB0byB0aGUgdnBkX3N0YXR1cyBzdHJ1Y3R1cmUuIFRoZSBzdHJ1Y3R1cmUgY29udGFpbnMKKyAqCQl0aGlzIGZpZWxkcy4KKyAqLworU0tfVlBEX1NUQVRVUyAqVnBkU3RhdCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MpCS8qIElPIENvbnRleHQgKi8KK3sKKwlpZiAoKHBBQy0+dnBkLnYudnBkX3N0YXR1cyAmIFZQRF9WQUxJRCkgPT0gMCkgeworCQkodm9pZClWcGRJbml0KHBBQywgSW9DKTsKKwl9CisJcmV0dXJuKCZwQUMtPnZwZC52KTsKK30KKworCisvKgorICoJUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIFZQRCBFRVBST00gYW5kIGNvcHkgaXQgdG8gdGhlIFZQRAorICoJYnVmZmVyIGlmIG5vdCBhbHJlYWR5IGRvbmUuCisgKglTY2FuIHRoZSBWUEQgYnVmZmVyIGZvciBWUEQga2V5d29yZHMgYW5kIGNyZWF0ZSB0aGUgVlBECisgKglrZXl3b3JkIGxpc3QgYnkgY29weWluZyB0aGUga2V5d29yZHMgdG8gJ2J1ZicsIGFsbCBhZnRlcgorICoJZWFjaCBvdGhlciBhbmQgdGVybWluYXRlZCB3aXRoIGEgJ1wwJy4KKyAqCisgKiBFeGNlcHRpb25zOglvIFRoZSBSZXNvdXJjZSBUeXBlIElEIFN0cmluZyAocHJvZHVjdCBuYW1lKSBpcyBjYWxsZWQgIk5hbWUiCisgKgkJbyBUaGUgVlBEIGVuZCB0YWdzICdSVicgYW5kICdSVycgYXJlIG5vdCBsaXN0ZWQKKyAqCisgKglUaGUgbnVtYmVyIG9mIGNvcGllZCBrZXl3b3JkcyBpcyBjb3VudGVkIGluICdlbGVtZW50cycuCisgKgorICogcmV0dXJucwkwOglzdWNjZXNzCisgKgkJMjoJYnVmZmVyIG92ZXJmdWxsLCBvbmUgb3IgbW9yZSBrZXl3b3JkcyBhcmUgbWlzc2luZworICoJCTY6CWZhdGFsIFZQRCBlcnJvcgorICoKKyAqCWV4YW1wbGUgdmFsdWVzIGFmdGVyIHJldHVybmluZzoKKyAqCisgKgkJYnVmID0JIk5hbWVcMFBOXDBFQ1wwTU5cMFNOXDBDUFwwVkZcMFZMXDBZQVwwIgorICoJCSpsZW4gPQkJMzAKKyAqCQkqZWxlbWVudHMgPQkgOQorICovCitpbnQgVnBkS2V5cygKK1NLX0FDCSpwQUMsCQkvKiBjb21tb24gZGF0YSBiYXNlICovCitTS19JT0MJSW9DLAkJLyogSU8gQ29udGV4dCAqLworY2hhcgkqYnVmLAkJLyogYnVmZmVyIHdoZXJlIHRvIGNvcHkgdGhlIGtleXdvcmRzICovCitpbnQJCSpsZW4sCQkvKiBidWZmZXIgbGVuZ3RoICovCitpbnQJCSplbGVtZW50cykJLyogbnVtYmVyIG9mIGtleXdvcmRzIHJldHVybmVkICovCit7CisJY2hhciAqdjsKKwlpbnQgbjsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfUlgsICgibGlzdCBWUEQga2V5cyAuLiAiKSk7CisJKmVsZW1lbnRzID0gMDsKKwlpZiAoKHBBQy0+dnBkLnYudnBkX3N0YXR1cyAmIFZQRF9WQUxJRCkgPT0gMCkgeworCQlpZiAoVnBkSW5pdChwQUMsIElvQykgIT0gMCkgeworCQkJKmxlbiA9IDA7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwKKwkJCQkoIlZQRCBJbml0IEVycm9yLCB0ZXJtaW5hdGVkXG4iKSk7CisJCQlyZXR1cm4oNik7CisJCX0KKwl9CisKKwlpZiAoKHNpZ25lZClzdHJsZW4oVlBEX05BTUUpICsgMSA8PSAqbGVuKSB7CisJCXYgPSBwQUMtPnZwZC52cGRfYnVmOworCQlzdHJjcHkoYnVmLFZQRF9OQU1FKTsKKwkJbiA9IHN0cmxlbihWUERfTkFNRSkgKyAxOworCQlidWYgKz0gbjsKKwkJKmVsZW1lbnRzID0gMTsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9SWCwKKwkJCSgiJyVjJWMnICIsdlswXSx2WzFdKSk7CisJfQorCWVsc2UgeworCQkqbGVuID0gMDsKKwkJU0tfREJHX01TRyhwQUMsU0tfREJHTU9EX1ZQRCxTS19EQkdDQVRfRVJSLAorCQkJKCJidWZmZXIgb3ZlcmZsb3dcbiIpKTsKKwkJcmV0dXJuKDIpOworCX0KKworCXYgKz0gMyArIFZQRF9HRVRfUkVTX0xFTih2KSArIDM7CisJZm9yICg7OyApIHsKKwkJLyogZXhpdCB3aGVuIHJlYWNoaW5nIHRoZSAiUlciIFRhZyAqLworCQlpZiAoU0tfTUVNQ01QKFZQRF9SVyx2LDIpID09IDApIHsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKFNLX01FTUNNUChWUERfUlYsdiwyKSA9PSAwKSB7CisJCQl2ICs9IDMgKyBWUERfR0VUX1ZQRF9MRU4odikgKyAzOwkvKiBza2lwIFZQRC1XICovCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChuKzMgPD0gKmxlbikgeworCQkJU0tfTUVNQ1BZKGJ1Zix2LDIpOworCQkJYnVmICs9IDI7CisJCQkqYnVmKysgPSAnXDAnOworCQkJbiArPSAzOworCQkJdiArPSAzICsgVlBEX0dFVF9WUERfTEVOKHYpOworCQkJKmVsZW1lbnRzICs9IDE7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX1JYLAorCQkJCSgiJyVjJWMnICIsdlswXSx2WzFdKSk7CisJCX0KKwkJZWxzZSB7CisJCQkqbGVuID0gbjsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJCSgiYnVmZmVyIG92ZXJmbG93XG4iKSk7CisJCQlyZXR1cm4oMik7CisJCX0KKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX1JYLCAoIlxuIikpOworCSpsZW4gPSBuOworCXJldHVybigwKTsKK30KKworCisvKgorICoJUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIFZQRCBFRVBST00gYW5kIGNvcHkgaXQgdG8gdGhlCisgKglWUEQgYnVmZmVyIGlmIG5vdCBhbHJlYWR5IGRvbmUuIFNlYXJjaCBmb3IgdGhlIFZQRCBrZXl3b3JkCisgKgkna2V5JyBhbmQgY29weSBpdHMgdmFsdWUgdG8gJ2J1ZicuIEFkZCBhIHRlcm1pbmF0aW5nICdcMCcuCisgKglJZiB0aGUgdmFsdWUgZG9lcyBub3QgZml0IGludG8gdGhlIGJ1ZmZlciBjdXQgaXQgYWZ0ZXIKKyAqCSdsZW4nIC0gMSBieXRlcy4KKyAqCisgKiByZXR1cm5zCTA6CXN1Y2Nlc3MKKyAqCQkxOglrZXl3b3JkIG5vdCBmb3VuZAorICoJCTI6CXZhbHVlIHN0cmluZyB3YXMgY3V0CisgKgkJMzoJVlBEIHRyYW5zZmVyIHRpbWVvdXQKKyAqCQk2OglmYXRhbCBWUEQgZXJyb3IKKyAqLworaW50IFZwZFJlYWQoCitTS19BQwkJKnBBQywJLyogY29tbW9uIGRhdGEgYmFzZSAqLworU0tfSU9DCQlJb0MsCS8qIElPIENvbnRleHQgKi8KK2NvbnN0IGNoYXIJKmtleSwJLyoga2V5d29yZCB0byByZWFkIChlLmcuICJNTiIpICovCitjaGFyCQkqYnVmLAkvKiBidWZmZXIgd2hlcmUgdG8gY29weSB0aGUga2V5d29yZCB2YWx1ZSAqLworaW50CQkJKmxlbikJLyogYnVmZmVyIGxlbmd0aCAqLworeworCVNLX1ZQRF9QQVJBICpwLCB2cDsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfUlgsICgiVlBEIHJlYWQgJXMgLi4gIiwga2V5KSk7CisJaWYgKChwQUMtPnZwZC52LnZwZF9zdGF0dXMgJiBWUERfVkFMSUQpID09IDApIHsKKwkJaWYgKFZwZEluaXQocEFDLCBJb0MpICE9IDApIHsKKwkJCSpsZW4gPSAwOworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsCisJCQkJKCJWUEQgaW5pdCBlcnJvclxuIikpOworCQkJcmV0dXJuKDYpOworCQl9CisJfQorCisJaWYgKChwID0gdnBkX2ZpbmRfcGFyYShwQUMsIGtleSwgJnZwKSkgIT0gTlVMTCkgeworCQlpZiAocC0+cF9sZW4gPiAoKih1bnNpZ25lZCAqKWxlbiktMSkgeworCQkJcC0+cF9sZW4gPSAqbGVuIC0gMTsKKwkJfQorCQlTS19NRU1DUFkoYnVmLCBwLT5wX3ZhbCwgcC0+cF9sZW4pOworCQlidWZbcC0+cF9sZW5dID0gJ1wwJzsKKwkJKmxlbiA9IHAtPnBfbGVuOworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX1JYLAorCQkJKCIlYyVjJWMlYy4uLCBsZW4gPSAlZFxuIiwKKwkJCWJ1ZlswXSxidWZbMV0sYnVmWzJdLGJ1ZlszXSwqbGVuKSk7CisJfQorCWVsc2UgeworCQkqbGVuID0gMDsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsICgibm90IGZvdW5kXG4iKSk7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKDApOworfQorCisKKy8qCisgKglDaGVjayB3aGV0aGVyIGEgZ2l2ZW4ga2V5IG1heSBiZSB3cml0dGVuCisgKgorICogcmV0dXJucworICoJU0tfVFJVRQkJWWVzIGl0IG1heSBiZSB3cml0dGVuCisgKglTS19GQUxTRQlObyBpdCBtYXkgYmUgd3JpdHRlbgorICovCitTS19CT09MIFZwZE1heVdyaXRlKAorY2hhcgkqa2V5KQkvKiBrZXl3b3JkIHRvIHdyaXRlIChhbGxvd2VkIHZhbHVlcyAiWXgiLCAiVngiKSAqLworeworCWlmICgoKmtleSAhPSAnWScgJiYgKmtleSAhPSAnVicpIHx8CisJCWtleVsxXSA8ICcwJyB8fCBrZXlbMV0gPiAnWicgfHwKKwkJKGtleVsxXSA+ICc5JyAmJiBrZXlbMV0gPCAnQScpIHx8IHN0cmxlbihrZXkpICE9IDIpIHsKKworCQlyZXR1cm4oU0tfRkFMU0UpOworCX0KKwlyZXR1cm4oU0tfVFJVRSk7Cit9CisKKy8qCisgKglSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgVlBEIEVFUFJPTSBhbmQgY29weSBpdCB0byB0aGUgVlBECisgKglidWZmZXIgaWYgbm90IGFscmVhZHkgZG9uZS4gSW5zZXJ0L292ZXJ3cml0ZSB0aGUga2V5d29yZCAna2V5JworICoJaW4gdGhlIFZQRCBidWZmZXIuIEN1dCB0aGUga2V5d29yZCB2YWx1ZSBpZiBpdCBkb2VzIG5vdCBmaXQKKyAqCWludG8gdGhlIFZQRCByZWFkIC8gd3JpdGUgYXJlYS4KKyAqCisgKiByZXR1cm5zCTA6CXN1Y2Nlc3MKKyAqCQkyOgl2YWx1ZSBzdHJpbmcgd2FzIGN1dAorICoJCTM6CVZQRCB0cmFuc2ZlciB0aW1lb3V0CisgKgkJNDoJVlBEIGZ1bGwsIGtleXdvcmQgd2FzIG5vdCB3cml0dGVuCisgKgkJNToJa2V5d29yZCBjYW5ub3QgYmUgd3JpdHRlbgorICoJCTY6CWZhdGFsIFZQRCBlcnJvcgorICovCitpbnQgVnBkV3JpdGUoCitTS19BQwkJKnBBQywJLyogY29tbW9uIGRhdGEgYmFzZSAqLworU0tfSU9DCQlJb0MsCS8qIElPIENvbnRleHQgKi8KK2NvbnN0IGNoYXIJKmtleSwJLyoga2V5d29yZCB0byB3cml0ZSAoYWxsb3dlZCB2YWx1ZXMgIll4IiwgIlZ4IikgKi8KK2NvbnN0IGNoYXIJKmJ1ZikJLyogYnVmZmVyIHdoZXJlIHRoZSBrZXl3b3JkIHZhbHVlIGNhbiBiZSByZWFkIGZyb20gKi8KK3sKKwlpbnQgbGVuOwkJLyogbGVuZ3RoIG9mIHRoZSBrZXl3b3JkIHRvIHdyaXRlICovCisJaW50IHJ0djsJCS8qIHJldHVybiBjb2RlICovCisJaW50IHJ0djI7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX1RYLAorCQkoIlZQRCB3cml0ZSAlcyA9ICVzXG4iLGtleSxidWYpKTsKKworCWlmICgoKmtleSAhPSAnWScgJiYgKmtleSAhPSAnVicpIHx8CisJCWtleVsxXSA8ICcwJyB8fCBrZXlbMV0gPiAnWicgfHwKKwkJKGtleVsxXSA+ICc5JyAmJiBrZXlbMV0gPCAnQScpIHx8IHN0cmxlbihrZXkpICE9IDIpIHsKKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwKKwkJCSgiaWxsZWdhbCBrZXkgdGFnLCBrZXl3b3JkIG5vdCB3cml0dGVuXG4iKSk7CisJCXJldHVybig1KTsKKwl9CisKKwlpZiAoKHBBQy0+dnBkLnYudnBkX3N0YXR1cyAmIFZQRF9WQUxJRCkgPT0gMCkgeworCQlpZiAoVnBkSW5pdChwQUMsIElvQykgIT0gMCkgeworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsCisJCQkJKCJWUEQgaW5pdCBlcnJvclxuIikpOworCQkJcmV0dXJuKDYpOworCQl9CisJfQorCisJcnR2ID0gMDsKKwlsZW4gPSBzdHJsZW4oYnVmKTsKKwlpZiAobGVuID4gVlBEX01BWF9MRU4pIHsKKwkJLyogY3V0IGl0ICovCisJCWxlbiA9IFZQRF9NQVhfTEVOOworCQlydHYgPSAyOworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwKKwkJCSgia2V5d29yZCB0b28gbG9uZywgY3V0IGFmdGVyICVkIGJ5dGVzXG4iLFZQRF9NQVhfTEVOKSk7CisJfQorCWlmICgocnR2MiA9IFZwZFNldHVwUGFyYShwQUMsIGtleSwgYnVmLCBsZW4sIFZQRF9SV19LRVksIE9XUl9LRVkpKSAhPSAwKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJKCJWUEQgd3JpdGUgZXJyb3JcbiIpKTsKKwkJcmV0dXJuKHJ0djIpOworCX0KKworCXJldHVybihydHYpOworfQorCisvKgorICoJUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIFZQRCBFRVBST00gYW5kIGNvcHkgaXQgdG8gdGhlCisgKglWUEQgYnVmZmVyIGlmIG5vdCBhbHJlYWR5IGRvbmUuIFJlbW92ZSB0aGUgVlBEIGtleXdvcmQKKyAqCSdrZXknIGZyb20gdGhlIFZQRCBidWZmZXIuCisgKglPbmx5IHRoZSBrZXl3b3JkcyBpbiB0aGUgcmVhZC93cml0ZSBhcmVhIGNhbiBiZSBkZWxldGVkLgorICoJS2V5d29yZHMgaW4gdGhlIHJlYWQgb25seSBhcmVhIGNhbm5vdCBiZSBkZWxldGVkLgorICoKKyAqIHJldHVybnMJMDoJc3VjY2Vzcywga2V5d29yZCB3YXMgcmVtb3ZlZAorICoJCTE6CWtleXdvcmQgbm90IGZvdW5kCisgKgkJNToJa2V5d29yZCBjYW5ub3QgYmUgZGVsZXRlZAorICoJCTY6CWZhdGFsIFZQRCBlcnJvcgorICovCitpbnQgVnBkRGVsZXRlKAorU0tfQUMJKnBBQywJLyogY29tbW9uIGRhdGEgYmFzZSAqLworU0tfSU9DCUlvQywJLyogSU8gQ29udGV4dCAqLworY2hhcgkqa2V5KQkvKiBrZXl3b3JkIHRvIHJlYWQgKGUuZy4gIk1OIikgKi8KK3sKKwlTS19WUERfUEFSQSAqcCwgdnA7CisJY2hhciAqZXRwOworCWludAl2cGRfc2l6ZTsKKworCXZwZF9zaXplID0gcEFDLT52cGQudnBkX3NpemU7CisKKwlTS19EQkdfTVNHKHBBQyxTS19EQkdNT0RfVlBELFNLX0RCR0NBVF9UWCwoIlZQRCBkZWxldGUga2V5ICVzXG4iLGtleSkpOworCWlmICgocEFDLT52cGQudi52cGRfc3RhdHVzICYgVlBEX1ZBTElEKSA9PSAwKSB7CisJCWlmIChWcGRJbml0KHBBQywgSW9DKSAhPSAwKSB7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwKKwkJCQkoIlZQRCBpbml0IGVycm9yXG4iKSk7CisJCQlyZXR1cm4oNik7CisJCX0KKwl9CisKKwlpZiAoKHAgPSB2cGRfZmluZF9wYXJhKHBBQywga2V5LCAmdnApKSAhPSBOVUxMKSB7CisJCWlmIChwLT5wX3ZhbCA8IHBBQy0+dnBkLnZwZF9idWYgKyB2cGRfc2l6ZS8yKSB7CisJCQkvKiB0cnkgdG8gZGVsZXRlIHJlYWQgb25seSBrZXl3b3JkICovCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwKKwkJCQkoImNhbm5vdCBkZWxldGUgUk8ga2V5d29yZFxuIikpOworCQkJcmV0dXJuKDUpOworCQl9CisKKwkJZXRwID0gcEFDLT52cGQudnBkX2J1ZiArICh2cGRfc2l6ZS1wQUMtPnZwZC52LnZwZF9mcmVlX3J3LTEtMyk7CisKKwkJdnBkX21vdmVfcGFyYSh2cC5wX3ZhbCt2cC5wX2xlbiwgZXRwKzIsCisJCQktICgoaW50KSh2cC5wX2xlbiArIDMpKSk7CisJCWlmICh2cGRfbW9kX2VuZHRhZyhwQUMsIGV0cCAtIHZwLnBfbGVuIC0gMykpIHsKKwkJCXBBQy0+dnBkLnYudnBkX3N0YXR1cyAmPSB+VlBEX1ZBTElEOworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsCisJCQkJKCJWUEQgZW5jb2RpbmcgZXJyb3JcbiIpKTsKKwkJCXJldHVybig2KTsKKwkJfQorCX0KKwllbHNlIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsCisJCQkoImtleXdvcmQgbm90IGZvdW5kXG4iKSk7CisJCXJldHVybigxKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKglJZiB0aGUgVlBEIGJ1ZmZlciBjb250YWlucyB2YWxpZCBkYXRhIHdyaXRlIHRoZSBWUEQKKyAqCXJlYWQvd3JpdGUgYXJlYSBiYWNrIHRvIHRoZSBWUEQgRUVQUk9NLgorICoKKyAqIHJldHVybnMJMDoJc3VjY2VzcworICoJCTM6CVZQRCB0cmFuc2ZlciB0aW1lb3V0CisgKi8KK2ludCBWcGRVcGRhdGUoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJSW9DKQkvKiBJTyBDb250ZXh0ICovCit7CisJaW50IHZwZF9zaXplOworCisJdnBkX3NpemUgPSBwQUMtPnZwZC52cGRfc2l6ZTsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfVFgsICgiVlBEIHVwZGF0ZSAuLiAiKSk7CisJaWYgKChwQUMtPnZwZC52LnZwZF9zdGF0dXMgJiBWUERfVkFMSUQpICE9IDApIHsKKwkJaWYgKFZwZFRyYW5zZmVyQmxvY2socEFDLCBJb0MsIHBBQy0+dnBkLnZwZF9idWYgKyB2cGRfc2l6ZS8yLAorCQkJdnBkX3NpemUvMiwgdnBkX3NpemUvMiwgVlBEX1dSSVRFKSAhPSB2cGRfc2l6ZS8yKSB7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJCSgidHJhbnNmZXIgdGltZWQgb3V0XG4iKSk7CisJCQlyZXR1cm4oMyk7CisJCX0KKwl9CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9UWCwgKCJkb25lXG4iKSk7CisJcmV0dXJuKDApOworfQorCisKKworLyoKKyAqCVJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBWUEQgRUVQUk9NIGFuZCBjb3B5IGl0IHRvIHRoZSBWUEQgYnVmZmVyCisgKglpZiBub3QgYWxyZWFkeSBkb25lLiBJZiB0aGUga2V5d29yZCAiVkYiIGlzIG5vdCBwcmVzZW50IGl0IHdpbGwgYmUKKyAqCWNyZWF0ZWQgYW5kIHRoZSBlcnJvciBsb2cgbWVzc2FnZSB3aWxsIGJlIHN0b3JlZCB0byB0aGlzIGtleXdvcmQuCisgKglJZiAiVkYiIGlzIG5vdCBwcmVzZW50IHRoZSBlcnJvciBsb2cgbWVzc2FnZSB3aWxsIGJlIHN0b3JlZCB0byB0aGUKKyAqCWtleXdvcmQgIlZMIi4gIlZMIiB3aWxsIGNyZWF0ZWQgb3Igb3ZlcndyaXR0ZW4gaWYgIlZGIiBpcyBwcmVzZW50LgorICoJVGhlIFZQRCByZWFkL3dyaXRlIGFyZWEgaXMgc2F2ZWQgdG8gdGhlIFZQRCBFRVBST00uCisgKgorICogcmV0dXJucyBub3RoaW5nLCBlcnJvcnMgd2lsbCBiZSBpZ25vcmVkLgorICovCit2b2lkIFZwZEVyckxvZygKK1NLX0FDCSpwQUMsCS8qIGNvbW1vbiBkYXRhIGJhc2UgKi8KK1NLX0lPQwlJb0MsCS8qIElPIENvbnRleHQgKi8KK2NoYXIJKm1zZykJLyogZXJyb3IgbG9nIG1lc3NhZ2UgKi8KK3sKKwlTS19WUERfUEFSQSAqdiwgdmY7CS8qIFZGICovCisJaW50IGxlbjsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfVFgsCisJCSgiVlBEIGVycm9yIGxvZyBtc2cgJXNcbiIsIG1zZykpOworCWlmICgocEFDLT52cGQudi52cGRfc3RhdHVzICYgVlBEX1ZBTElEKSA9PSAwKSB7CisJCWlmIChWcGRJbml0KHBBQywgSW9DKSAhPSAwKSB7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwKKwkJCQkoIlZQRCBpbml0IGVycm9yXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlsZW4gPSBzdHJsZW4obXNnKTsKKwlpZiAobGVuID4gVlBEX01BWF9MRU4pIHsKKwkJLyogY3V0IGl0ICovCisJCWxlbiA9IFZQRF9NQVhfTEVOOworCX0KKwlpZiAoKHYgPSB2cGRfZmluZF9wYXJhKHBBQywgVlBEX1ZGLCAmdmYpKSAhPSBOVUxMKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfVFgsICgib3ZlcndyaXRlIFZMXG4iKSk7CisJCSh2b2lkKVZwZFNldHVwUGFyYShwQUMsIFZQRF9WTCwgbXNnLCBsZW4sIFZQRF9SV19LRVksIE9XUl9LRVkpOworCX0KKwllbHNlIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9UWCwgKCJ3cml0ZSBWRlxuIikpOworCQkodm9pZClWcGRTZXR1cFBhcmEocEFDLCBWUERfVkYsIG1zZywgbGVuLCBWUERfUldfS0VZLCBBRERfS0VZKTsKKwl9CisKKwkodm9pZClWcGRVcGRhdGUocEFDLCBJb0MpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NreG1hYzIuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2t4bWFjMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTA5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NreG1hYzIuYwpAQCAtMCwwICsxLDQ2MDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza3htYWMyLmMKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIENvbW1vbiBNb2R1bGVzCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTAyICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzEwLzAyIDE2OjUzOjU4ICQKKyAqIFB1cnBvc2U6CUNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbml0aWFsaXplIHRoZSBNQUNzIGFuZCBQSFlzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgorCisvKiB0eXBlZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBCQ09NIFBIWSBtYWdpYyBwYXR0ZXJuIGxpc3QgKi8KK3R5cGVkZWYgc3RydWN0IHNfUGh5SGFjayB7CisJaW50CQlQaHlSZWc7CQkvKiBQaHkgcmVnaXN0ZXIgKi8KKwlTS19VMTYJUGh5VmFsOwkJLyogVmFsdWUgdG8gd3JpdGUgKi8KK30gQkNPTV9IQUNLOworCisvKiBsb2NhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKGRlZmluZWQoREVCVUcpIHx8ICgoIWRlZmluZWQoTElOVCkpICYmICghZGVmaW5lZChTS19TTElNKSkpKQorc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0KKwkiQCgjKSAkSWQ6IHNreG1hYzIuYyx2IDEuMTAyIDIwMDMvMTAvMDIgMTY6NTM6NTggcnNjaG1pZHQgRXhwICQgKEMpIE1hcnZlbGwuIjsKKyNlbmRpZgorCisjaWZkZWYgR0VORVNJUworQkNPTV9IQUNLIEJjb21SZWdBMUhhY2tbXSA9IHsKKyB7IDB4MTgsIDB4MGMyMCB9LCB7IDB4MTcsIDB4MDAxMiB9LCB7IDB4MTUsIDB4MTEwNCB9LCB7IDB4MTcsIDB4MDAxMyB9LAorIHsgMHgxNSwgMHgwNDA0IH0sIHsgMHgxNywgMHg4MDA2IH0sIHsgMHgxNSwgMHgwMTMyIH0sIHsgMHgxNywgMHg4MDA2IH0sCisgeyAweDE1LCAweDAyMzIgfSwgeyAweDE3LCAweDgwMEQgfSwgeyAweDE1LCAweDAwMEYgfSwgeyAweDE4LCAweDA0MjAgfSwKKyB7IDAsIDAgfQorfTsKK0JDT01fSEFDSyBCY29tUmVnQzBIYWNrW10gPSB7CisgeyAweDE4LCAweDBjMjAgfSwgeyAweDE3LCAweDAwMTIgfSwgeyAweDE1LCAweDEyMDQgfSwgeyAweDE3LCAweDAwMTMgfSwKKyB7IDB4MTUsIDB4MEEwNCB9LCB7IDB4MTgsIDB4MDQyMCB9LAorIHsgMCwgMCB9Cit9OworI2VuZGlmCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgR0VORVNJUworc3RhdGljIHZvaWQJU2tYbUluaXRQaHlYbWFjKFNLX0FDKiwgU0tfSU9DLCBpbnQsIFNLX0JPT0wpOworc3RhdGljIHZvaWQJU2tYbUluaXRQaHlCY29tKFNLX0FDKiwgU0tfSU9DLCBpbnQsIFNLX0JPT0wpOworc3RhdGljIGludAlTa1htQXV0b05lZ0RvbmVYbWFjKFNLX0FDKiwgU0tfSU9DLCBpbnQpOworc3RhdGljIGludAlTa1htQXV0b05lZ0RvbmVCY29tKFNLX0FDKiwgU0tfSU9DLCBpbnQpOworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKyNpZmRlZiBZVUtPTgorc3RhdGljIHZvaWQJU2tHbUluaXRQaHlNYXJ2KFNLX0FDKiwgU0tfSU9DLCBpbnQsIFNLX0JPT0wpOworc3RhdGljIGludAlTa0dtQXV0b05lZ0RvbmVNYXJ2KFNLX0FDKiwgU0tfSU9DLCBpbnQpOworI2VuZGlmIC8qIFlVS09OICovCisjaWZkZWYgT1RIRVJfUEhZCitzdGF0aWMgdm9pZAlTa1htSW5pdFBoeUxvbmUoU0tfQUMqLCBTS19JT0MsIGludCwgU0tfQk9PTCk7CitzdGF0aWMgdm9pZAlTa1htSW5pdFBoeU5hdCAoU0tfQUMqLCBTS19JT0MsIGludCwgU0tfQk9PTCk7CitzdGF0aWMgaW50CVNrWG1BdXRvTmVnRG9uZUxvbmUoU0tfQUMqLCBTS19JT0MsIGludCk7CitzdGF0aWMgaW50CVNrWG1BdXRvTmVnRG9uZU5hdCAoU0tfQUMqLCBTS19JT0MsIGludCk7CisjZW5kaWYgLyogT1RIRVJfUEhZICovCisKKworI2lmZGVmIEdFTkVTSVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htUGh5UmVhZCgpIC0gUmVhZCBmcm9tIFhNQUMgUEhZIHJlZ2lzdGVyCisgKgorICogRGVzY3JpcHRpb246CXJlYWRzIGEgMTYtYml0IHdvcmQgZnJvbSBYTUFDIFBIWSBvciBleHQuIFBIWQorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tYbVBoeVJlYWQoCitTS19BQwkqcEFDLAkJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCQkvKiBJL08gQ29udGV4dCAqLworaW50CQlQb3J0LAkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK2ludAkJUGh5UmVnLAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKE9mZnNldCkgKi8KK1NLX1UxNglTS19GQVIgKnBWYWwpCS8qIFBvaW50ZXIgdG8gVmFsdWUgKi8KK3sKKwlTS19VMTYJCU1tdTsKKwlTS19HRVBPUlQJKnBQcnQ7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKwkKKwkvKiB3cml0ZSB0aGUgUEhZIHJlZ2lzdGVyJ3MgYWRkcmVzcyAqLworCVhNX09VVDE2KElvQywgUG9ydCwgWE1fUEhZX0FERFIsIFBoeVJlZyB8IHBQcnQtPlBoeUFkZHIpOworCQorCS8qIGdldCB0aGUgUEhZIHJlZ2lzdGVyJ3MgdmFsdWUgKi8KKwlYTV9JTjE2KElvQywgUG9ydCwgWE1fUEhZX0RBVEEsIHBWYWwpOworCQorCWlmIChwUHJ0LT5QaHlUeXBlICE9IFNLX1BIWV9YTUFDKSB7CisJCWRvIHsKKwkJCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9NTVVfQ01ELCAmTW11KTsKKwkJCS8qIHdhaXQgdW50aWwgJ1JlYWR5JyBpcyBzZXQgKi8KKwkJfSB3aGlsZSAoKE1tdSAmIFhNX01NVV9QSFlfUkRZKSA9PSAwKTsKKworCQkvKiBnZXQgdGhlIFBIWSByZWdpc3RlcidzIHZhbHVlICovCisJCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9QSFlfREFUQSwgcFZhbCk7CisJfQorfQkvKiBTa1htUGh5UmVhZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htUGh5V3JpdGUoKSAtIFdyaXRlIHRvIFhNQUMgUEhZIHJlZ2lzdGVyCisgKgorICogRGVzY3JpcHRpb246CXdyaXRlcyBhIDE2LWJpdCB3b3JkIHRvIFhNQUMgUEhZIG9yIGV4dC4gUEhZCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa1htUGh5V3JpdGUoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIENvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK2ludAkJUGh5UmVnLAkJLyogUmVnaXN0ZXIgQWRkcmVzcyAoT2Zmc2V0KSAqLworU0tfVTE2CVZhbCkJCS8qIFZhbHVlICovCit7CisJU0tfVTE2CQlNbXU7CisJU0tfR0VQT1JUCSpwUHJ0OworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisJCisJaWYgKHBQcnQtPlBoeVR5cGUgIT0gU0tfUEhZX1hNQUMpIHsKKwkJZG8geworCQkJWE1fSU4xNihJb0MsIFBvcnQsIFhNX01NVV9DTUQsICZNbXUpOworCQkJLyogd2FpdCB1bnRpbCAnQnVzeScgaXMgY2xlYXJlZCAqLworCQl9IHdoaWxlICgoTW11ICYgWE1fTU1VX1BIWV9CVVNZKSAhPSAwKTsKKwl9CisJCisJLyogd3JpdGUgdGhlIFBIWSByZWdpc3RlcidzIGFkZHJlc3MgKi8KKwlYTV9PVVQxNihJb0MsIFBvcnQsIFhNX1BIWV9BRERSLCBQaHlSZWcgfCBwUHJ0LT5QaHlBZGRyKTsKKwkKKwkvKiB3cml0ZSB0aGUgUEhZIHJlZ2lzdGVyJ3MgdmFsdWUgKi8KKwlYTV9PVVQxNihJb0MsIFBvcnQsIFhNX1BIWV9EQVRBLCBWYWwpOworCQorCWlmIChwUHJ0LT5QaHlUeXBlICE9IFNLX1BIWV9YTUFDKSB7CisJCWRvIHsKKwkJCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9NTVVfQ01ELCAmTW11KTsKKwkJCS8qIHdhaXQgdW50aWwgJ0J1c3knIGlzIGNsZWFyZWQgKi8KKwkJfSB3aGlsZSAoKE1tdSAmIFhNX01NVV9QSFlfQlVTWSkgIT0gMCk7CisJfQorfQkvKiBTa1htUGh5V3JpdGUgKi8KKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKworI2lmZGVmIFlVS09OCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHbVBoeVJlYWQoKSAtIFJlYWQgZnJvbSBHUEhZIHJlZ2lzdGVyCisgKgorICogRGVzY3JpcHRpb246CXJlYWRzIGEgMTYtYml0IHdvcmQgZnJvbSBHUEhZIHRocm91Z2ggTURJTworICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tHbVBoeVJlYWQoCitTS19BQwkqcEFDLAkJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCQkvKiBJL08gQ29udGV4dCAqLworaW50CQlQb3J0LAkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK2ludAkJUGh5UmVnLAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKE9mZnNldCkgKi8KK1NLX1UxNglTS19GQVIgKnBWYWwpCS8qIFBvaW50ZXIgdG8gVmFsdWUgKi8KK3sKKwlTS19VMTYJQ3RybDsKKwlTS19HRVBPUlQJKnBQcnQ7CisjaWZkZWYgVkNQVQorCXVfbG9uZyBTaW1DeWxlOworCXVfbG9uZyBTaW1Mb3dUaW1lOworCQorCVZDUFVnZXRUaW1lKCZTaW1DeWxlLCAmU2ltTG93VGltZSk7CisJVkNQVXByaW50ZigwLCAiU2tHbVBoeVJlYWQoJXUpLCBTaW1DeWxlPSV1LCBTaW1Mb3dUaW1lPSV1XG4iLAorCQlQaHlSZWcsIFNpbUN5bGUsIFNpbUxvd1RpbWUpOworI2VuZGlmIC8qIFZDUFUgKi8KKwkKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKwkKKwkvKiBzZXQgUEhZLVJlZ2lzdGVyIG9mZnNldCBhbmQgJ1JlYWQnIE9wQ29kZSAoPSAxKSAqLworCSpwVmFsID0gKFNLX1UxNikoR01fU01JX0NUX1BIWV9BRChwUHJ0LT5QaHlBZGRyKSB8CisJCUdNX1NNSV9DVF9SRUdfQUQoUGh5UmVnKSB8IEdNX1NNSV9DVF9PUF9SRCk7CisKKwlHTV9PVVQxNihJb0MsIFBvcnQsIEdNX1NNSV9DVFJMLCAqcFZhbCk7CisKKwlHTV9JTjE2KElvQywgUG9ydCwgR01fU01JX0NUUkwsICZDdHJsKTsKKwkKKwkvKiBhZGRpdGlvbmFsIGNoZWNrIGZvciBNREMvTURJTyBhY3Rpdml0eSAqLworCWlmICgoQ3RybCAmIEdNX1NNSV9DVF9CVVNZKSA9PSAwKSB7CisJCSpwVmFsID0gMDsKKwkJcmV0dXJuOworCX0KKworCSpwVmFsIHw9IEdNX1NNSV9DVF9CVVNZOworCQorCWRvIHsKKyNpZmRlZiBWQ1BVCisJCVZDUFV3YWl0VGltZSgxMDAwKTsKKyNlbmRpZiAvKiBWQ1BVICovCisKKwkJR01fSU4xNihJb0MsIFBvcnQsIEdNX1NNSV9DVFJMLCAmQ3RybCk7CisKKwkvKiB3YWl0IHVudGlsICdSZWFkVmFsaWQnIGlzIHNldCAqLworCX0gd2hpbGUgKEN0cmwgPT0gKnBWYWwpOworCQorCS8qIGdldCB0aGUgUEhZIHJlZ2lzdGVyJ3MgdmFsdWUgKi8KKwlHTV9JTjE2KElvQywgUG9ydCwgR01fU01JX0RBVEEsIHBWYWwpOworCisjaWZkZWYgVkNQVQorCVZDUFVnZXRUaW1lKCZTaW1DeWxlLCAmU2ltTG93VGltZSk7CisJVkNQVXByaW50ZigwLCAiVkNQVWdldFRpbWUoKSwgU2ltQ3lsZT0ldSwgU2ltTG93VGltZT0ldVxuIiwKKwkJU2ltQ3lsZSwgU2ltTG93VGltZSk7CisjZW5kaWYgLyogVkNQVSAqLworCit9CS8qIFNrR21QaHlSZWFkICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR21QaHlXcml0ZSgpIC0gV3JpdGUgdG8gR1BIWSByZWdpc3RlcgorICoKKyAqIERlc2NyaXB0aW9uOgl3cml0ZXMgYSAxNi1iaXQgd29yZCB0byBHUEhZIHRocm91Z2ggTURJTworICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tHbVBoeVdyaXRlKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBDb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitpbnQJCVBoeVJlZywJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKE9mZnNldCkgKi8KK1NLX1UxNglWYWwpCQkvKiBWYWx1ZSAqLworeworCVNLX1UxNglDdHJsOworCVNLX0dFUE9SVAkqcFBydDsKKyNpZmRlZiBWQ1BVCisJU0tfVTMyCURXb3JkOworCXVfbG9uZwlTaW1DeWxlOworCXVfbG9uZwlTaW1Mb3dUaW1lOworCQorCVZDUFVnZXRUaW1lKCZTaW1DeWxlLCAmU2ltTG93VGltZSk7CisJVkNQVXByaW50ZigwLCAiU2tHbVBoeVdyaXRlKFJlZz0ldSwgVmFsPTB4JTA0eCksIFNpbUN5bGU9JXUsIFNpbUxvd1RpbWU9JXVcbiIsCisJCVBoeVJlZywgVmFsLCBTaW1DeWxlLCBTaW1Mb3dUaW1lKTsKKyNlbmRpZiAvKiBWQ1BVICovCisJCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisJCisJLyogd3JpdGUgdGhlIFBIWSByZWdpc3RlcidzIHZhbHVlICovCisJR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9TTUlfREFUQSwgVmFsKTsKKwkKKwkvKiBzZXQgUEhZLVJlZ2lzdGVyIG9mZnNldCBhbmQgJ1dyaXRlJyBPcENvZGUgKD0gMCkgKi8KKwlWYWwgPSBHTV9TTUlfQ1RfUEhZX0FEKHBQcnQtPlBoeUFkZHIpIHwgR01fU01JX0NUX1JFR19BRChQaHlSZWcpOworCisJR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9TTUlfQ1RSTCwgVmFsKTsKKworCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9TTUlfQ1RSTCwgJkN0cmwpOworCQorCS8qIGFkZGl0aW9uYWwgY2hlY2sgZm9yIE1EQy9NRElPIGFjdGl2aXR5ICovCisJaWYgKChDdHJsICYgR01fU01JX0NUX0JVU1kpID09IDApIHsKKwkJcmV0dXJuOworCX0KKwkKKwlWYWwgfD0gR01fU01JX0NUX0JVU1k7CisKKwlkbyB7CisjaWZkZWYgVkNQVQorCQkvKiByZWFkIFRpbWVyIHZhbHVlICovCisJCVNLX0lOMzIoSW9DLCBCMl9USV9WQUwsICZEV29yZCk7CisKKwkJVkNQVXdhaXRUaW1lKDEwMDApOworI2VuZGlmIC8qIFZDUFUgKi8KKworCQlHTV9JTjE2KElvQywgUG9ydCwgR01fU01JX0NUUkwsICZDdHJsKTsKKworCS8qIHdhaXQgdW50aWwgJ0J1c3knIGlzIGNsZWFyZWQgKi8KKwl9IHdoaWxlIChDdHJsID09IFZhbCk7CisJCisjaWZkZWYgVkNQVQorCVZDUFVnZXRUaW1lKCZTaW1DeWxlLCAmU2ltTG93VGltZSk7CisJVkNQVXByaW50ZigwLCAiVkNQVWdldFRpbWUoKSwgU2ltQ3lsZT0ldSwgU2ltTG93VGltZT0ldVxuIiwKKwkJU2ltQ3lsZSwgU2ltTG93VGltZSk7CisjZW5kaWYgLyogVkNQVSAqLworCit9CS8qIFNrR21QaHlXcml0ZSAqLworI2VuZGlmIC8qIFlVS09OICovCisKKworI2lmZGVmIFNLX0RJQUcKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlUGh5UmVhZCgpIC0gUmVhZCBmcm9tIFBIWSByZWdpc3RlcgorICoKKyAqIERlc2NyaXB0aW9uOgljYWxscyBhIHJlYWQgUEhZIHJvdXRpbmUgZGVwLiBvbiBib2FyZCB0eXBlCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa0dlUGh5UmVhZCgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJL08gQ29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworaW50CQlQaHlSZWcsCQkvKiBSZWdpc3RlciBBZGRyZXNzIChPZmZzZXQpICovCitTS19VMTYJKnBWYWwpCQkvKiBQb2ludGVyIHRvIFZhbHVlICovCit7CisJdm9pZCAoKnJfZnVuYykoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IFBvcnQsIGludCBSZWcsIFNLX1UxNiAqcFZhbCk7CisKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQlyX2Z1bmMgPSBTa1htUGh5UmVhZDsKKwl9CisJZWxzZSB7CisJCXJfZnVuYyA9IFNrR21QaHlSZWFkOworCX0KKwkKKwlyX2Z1bmMocEFDLCBJb0MsIFBvcnQsIFBoeVJlZywgcFZhbCk7Cit9CS8qIFNrR2VQaHlSZWFkICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VQaHlXcml0ZSgpIC0gV3JpdGUgdG8gUEhZIHJlZ2lzdGVyCisgKgorICogRGVzY3JpcHRpb246CWNhbGxzIGEgd3JpdGUgUEhZIHJvdXRpbmUgZGVwLiBvbiBib2FyZCB0eXBlCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa0dlUGh5V3JpdGUoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIENvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK2ludAkJUGh5UmVnLAkJLyogUmVnaXN0ZXIgQWRkcmVzcyAoT2Zmc2V0KSAqLworU0tfVTE2CVZhbCkJCS8qIFZhbHVlICovCit7CisJdm9pZCAoKndfZnVuYykoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IFBvcnQsIGludCBSZWcsIFNLX1UxNiBWYWwpOworCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJd19mdW5jID0gU2tYbVBoeVdyaXRlOworCX0KKwllbHNlIHsKKwkJd19mdW5jID0gU2tHbVBoeVdyaXRlOworCX0KKwkKKwl3X2Z1bmMocEFDLCBJb0MsIFBvcnQsIFBoeVJlZywgVmFsKTsKK30JLyogU2tHZVBoeVdyaXRlICovCisjZW5kaWYgLyogU0tfRElBRyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa01hY1Byb21pc2NNb2RlKCkgLSBFbmFibGUgLyBEaXNhYmxlIFByb21pc2N1b3VzIE1vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgZW5hYmxlcyAvIGRpc2FibGVzIHByb21pc2N1b3VzIG1vZGUgYnkgc2V0dGluZyBNb2RlIFJlZ2lzdGVyIChYTUFDKSBvcgorICogICBSZWNlaXZlIENvbnRyb2wgUmVnaXN0ZXIgKEdNQUMpIGRlcC4gb24gYm9hcmQgdHlwZSAgIAkKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrTWFjUHJvbWlzY01vZGUoCitTS19BQwkqcEFDLAkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfQk9PTAlFbmFibGUpCS8qIEVuYWJsZSAvIERpc2FibGUgKi8KK3sKKyNpZmRlZiBZVUtPTgorCVNLX1UxNglSY1JlZzsKKyNlbmRpZgorI2lmZGVmIEdFTkVTSVMKKwlTS19VMzIJTWRSZWc7CisjZW5kaWYJCisKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCisJCVhNX0lOMzIoSW9DLCBQb3J0LCBYTV9NT0RFLCAmTWRSZWcpOworCQkvKiBlbmFibGUgb3IgZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCWlmIChFbmFibGUpIHsKKwkJCU1kUmVnIHw9IFhNX01EX0VOQV9QUk9NOworCQl9CisJCWVsc2UgeworCQkJTWRSZWcgJj0gflhNX01EX0VOQV9QUk9NOworCQl9CisJCS8qIHNldHVwIE1vZGUgUmVnaXN0ZXIgKi8KKwkJWE1fT1VUMzIoSW9DLCBQb3J0LCBYTV9NT0RFLCBNZFJlZyk7CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkKKwkJR01fSU4xNihJb0MsIFBvcnQsIEdNX1JYX0NUUkwsICZSY1JlZyk7CisJCQorCQkvKiBlbmFibGUgb3IgZGlzYWJsZSB1bmljYXN0IGFuZCBtdWx0aWNhc3QgZmlsdGVyaW5nICovCisJCWlmIChFbmFibGUpIHsKKwkJCVJjUmVnICY9IH4oR01fUlhDUl9VQ0ZfRU5BIHwgR01fUlhDUl9NQ0ZfRU5BKTsKKwkJfQorCQllbHNlIHsKKwkJCVJjUmVnIHw9IChHTV9SWENSX1VDRl9FTkEgfCBHTV9SWENSX01DRl9FTkEpOworCQl9CisJCS8qIHNldHVwIFJlY2VpdmUgQ29udHJvbCBSZWdpc3RlciAqLworCQlHTV9PVVQxNihJb0MsIFBvcnQsIEdNX1JYX0NUUkwsIFJjUmVnKTsKKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworfQkvKiBTa01hY1Byb21pc2NNb2RlKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNIYXNoaW5nKCkgLSBFbmFibGUgLyBEaXNhYmxlIEhhc2hpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgZW5hYmxlcyAvIGRpc2FibGVzIGhhc2hpbmcgYnkgc2V0dGluZyBNb2RlIFJlZ2lzdGVyIChYTUFDKSBvcgorICogICBSZWNlaXZlIENvbnRyb2wgUmVnaXN0ZXIgKEdNQUMpIGRlcC4gb24gYm9hcmQgdHlwZQkJCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa01hY0hhc2hpbmcoCitTS19BQwkqcEFDLAkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfQk9PTAlFbmFibGUpCS8qIEVuYWJsZSAvIERpc2FibGUgKi8KK3sKKyNpZmRlZiBZVUtPTgorCVNLX1UxNglSY1JlZzsKKyNlbmRpZgkKKyNpZmRlZiBHRU5FU0lTCisJU0tfVTMyCU1kUmVnOworI2VuZGlmCisKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCisJCVhNX0lOMzIoSW9DLCBQb3J0LCBYTV9NT0RFLCAmTWRSZWcpOworCQkvKiBlbmFibGUgb3IgZGlzYWJsZSBoYXNoaW5nICovCisJCWlmIChFbmFibGUpIHsKKwkJCU1kUmVnIHw9IFhNX01EX0VOQV9IQVNIOworCQl9CisJCWVsc2UgeworCQkJTWRSZWcgJj0gflhNX01EX0VOQV9IQVNIOworCQl9CisJCS8qIHNldHVwIE1vZGUgUmVnaXN0ZXIgKi8KKwkJWE1fT1VUMzIoSW9DLCBQb3J0LCBYTV9NT0RFLCBNZFJlZyk7CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkKKwkJR01fSU4xNihJb0MsIFBvcnQsIEdNX1JYX0NUUkwsICZSY1JlZyk7CisJCQorCQkvKiBlbmFibGUgb3IgZGlzYWJsZSBtdWx0aWNhc3QgZmlsdGVyaW5nICovCisJCWlmIChFbmFibGUpIHsKKwkJCVJjUmVnIHw9IEdNX1JYQ1JfTUNGX0VOQTsKKwkJfQorCQllbHNlIHsKKwkJCVJjUmVnICY9IH5HTV9SWENSX01DRl9FTkE7CisJCX0KKwkJLyogc2V0dXAgUmVjZWl2ZSBDb250cm9sIFJlZ2lzdGVyICovCisJCUdNX09VVDE2KElvQywgUG9ydCwgR01fUlhfQ1RSTCwgUmNSZWcpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCit9CS8qIFNrTWFjSGFzaGluZyovCisKKworI2lmZGVmIFNLX0RJQUcKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htU2V0UnhDbWQoKSAtIE1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIFhNQUMncyBSeCBDb21tYW5kIFJlZ2lzdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgZmVhdHVyZXMKKyAqCSAtIEZDUyBzdHJpcHBpbmcsCQkJCQlTS19TVFJJUF9GQ1NfT04vT0ZGCisgKgkgLSBwYWQgYnl0ZSBzdHJpcHBpbmcsCQkJCVNLX1NUUklQX1BBRF9PTi9PRkYKKyAqCSAtIGRvbid0IHNldCBYTVJfRlNfRVJSIGluIHN0YXR1cwlTS19MRU5FUlJfT0tfT04vT0ZGCisgKgkgICBmb3IgaW5yYW5nZSBsZW5ndGggZXJyb3IgZnJhbWVzCisgKgkgLSBkb24ndCBzZXQgWE1SX0ZTX0VSUiBpbiBzdGF0dXMJU0tfQklHX1BLX09LX09OL09GRgorICoJICAgZm9yIGZyYW1lcyA+IDE1MTQgYnl0ZXMKKyAqICAgLSBlbmFibGUgUnggb2Ygb3duIHBhY2tldHMgICAgICAgICBTS19TRUxGX1JYX09OL09GRgorICoKKyAqCWZvciBpbmNvbWluZyBwYWNrZXRzIG1heSBiZSBlbmFibGVkL2Rpc2FibGVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKglBZGRpdGlvbmFsIG1vZGVzIG1heSBiZSBhZGRlZCBsYXRlci4KKyAqCU11bHRpcGxlIG1vZGVzIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIGF0IHRoZSBzYW1lIHRpbWUuCisgKglUaGUgbmV3IGNvbmZpZ3VyYXRpb24gaXMgd3JpdHRlbiB0byB0aGUgUnggQ29tbWFuZCByZWdpc3RlciBpbW1lZGlhdGVseS4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa1htU2V0UnhDbWQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworaW50CQlNb2RlKQkJLyogTW9kZSBpcyBTS19TVFJJUF9GQ1NfT04vT0ZGLCBTS19TVFJJUF9QQURfT04vT0ZGLAorCQkJCQkgICBTS19MRU5FUlJfT0tfT04vT0ZGLCBvciBTS19CSUdfUEtfT0tfT04vT0ZGICovCit7CisJU0tfVTE2CU9sZFJ4Q21kOworCVNLX1UxNglSeENtZDsKKworCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9SWF9DTUQsICZPbGRSeENtZCk7CisKKwlSeENtZCA9IE9sZFJ4Q21kOworCQorCXN3aXRjaCAoTW9kZSAmIChTS19TVFJJUF9GQ1NfT04gfCBTS19TVFJJUF9GQ1NfT0ZGKSkgeworCWNhc2UgU0tfU1RSSVBfRkNTX09OOgorCQlSeENtZCB8PSBYTV9SWF9TVFJJUF9GQ1M7CisJCWJyZWFrOworCWNhc2UgU0tfU1RSSVBfRkNTX09GRjoKKwkJUnhDbWQgJj0gflhNX1JYX1NUUklQX0ZDUzsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChNb2RlICYgKFNLX1NUUklQX1BBRF9PTiB8IFNLX1NUUklQX1BBRF9PRkYpKSB7CisJY2FzZSBTS19TVFJJUF9QQURfT046CisJCVJ4Q21kIHw9IFhNX1JYX1NUUklQX1BBRDsKKwkJYnJlYWs7CisJY2FzZSBTS19TVFJJUF9QQURfT0ZGOgorCQlSeENtZCAmPSB+WE1fUlhfU1RSSVBfUEFEOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKE1vZGUgJiAoU0tfTEVORVJSX09LX09OIHwgU0tfTEVORVJSX09LX09GRikpIHsKKwljYXNlIFNLX0xFTkVSUl9PS19PTjoKKwkJUnhDbWQgfD0gWE1fUlhfTEVORVJSX09LOworCQlicmVhazsKKwljYXNlIFNLX0xFTkVSUl9PS19PRkY6CisJCVJ4Q21kICY9IH5YTV9SWF9MRU5FUlJfT0s7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoTW9kZSAmIChTS19CSUdfUEtfT0tfT04gfCBTS19CSUdfUEtfT0tfT0ZGKSkgeworCWNhc2UgU0tfQklHX1BLX09LX09OOgorCQlSeENtZCB8PSBYTV9SWF9CSUdfUEtfT0s7CisJCWJyZWFrOworCWNhc2UgU0tfQklHX1BLX09LX09GRjoKKwkJUnhDbWQgJj0gflhNX1JYX0JJR19QS19PSzsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChNb2RlICYgKFNLX1NFTEZfUlhfT04gfCBTS19TRUxGX1JYX09GRikpIHsKKwljYXNlIFNLX1NFTEZfUlhfT046CisJCVJ4Q21kIHw9IFhNX1JYX1NFTEZfUlg7CisJCWJyZWFrOworCWNhc2UgU0tfU0VMRl9SWF9PRkY6CisJCVJ4Q21kICY9IH5YTV9SWF9TRUxGX1JYOworCQlicmVhazsKKwl9CisKKwkvKiBXcml0ZSB0aGUgbmV3IG1vZGUgdG8gdGhlIFJ4IGNvbW1hbmQgcmVnaXN0ZXIgaWYgcmVxdWlyZWQgKi8KKwlpZiAoT2xkUnhDbWQgIT0gUnhDbWQpIHsKKwkJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9SWF9DTUQsIFJ4Q21kKTsKKwl9Cit9CS8qIFNrWG1TZXRSeENtZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtU2V0UnhDbWQoKSAtIE1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIEdNQUMncyBSeCBDb250cm9sIFJlZ2lzdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgZmVhdHVyZXMKKyAqCSAtIEZDUyAoQ1JDKSBzdHJpcHBpbmcsCQkJCVNLX1NUUklQX0ZDU19PTi9PRkYKKyAqCSAtIGRvbid0IHNldCBHTVJfRlNfTE9OR19FUlIJCVNLX0JJR19QS19PS19PTi9PRkYKKyAqCSAgIGZvciBmcmFtZXMgPiAxNTE0IGJ5dGVzCisgKiAgIC0gZW5hYmxlIFJ4IG9mIG93biBwYWNrZXRzICAgICAgICAgU0tfU0VMRl9SWF9PTi9PRkYKKyAqCisgKglmb3IgaW5jb21pbmcgcGFja2V0cyBtYXkgYmUgZW5hYmxlZC9kaXNhYmxlZCBieSB0aGlzIGZ1bmN0aW9uLgorICoJQWRkaXRpb25hbCBtb2RlcyBtYXkgYmUgYWRkZWQgbGF0ZXIuCisgKglNdWx0aXBsZSBtb2RlcyBjYW4gYmUgZW5hYmxlZC9kaXNhYmxlZCBhdCB0aGUgc2FtZSB0aW1lLgorICoJVGhlIG5ldyBjb25maWd1cmF0aW9uIGlzIHdyaXR0ZW4gdG8gdGhlIFJ4IENvbW1hbmQgcmVnaXN0ZXIgaW1tZWRpYXRlbHkuCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgU2tHbVNldFJ4Q21kKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK2ludAkJTW9kZSkJCS8qIE1vZGUgaXMgU0tfU1RSSVBfRkNTX09OL09GRiwgU0tfU1RSSVBfUEFEX09OL09GRiwKKwkJCQkJICAgU0tfTEVORVJSX09LX09OL09GRiwgb3IgU0tfQklHX1BLX09LX09OL09GRiAqLworeworCVNLX1UxNglPbGRSeENtZDsKKwlTS19VMTYJUnhDbWQ7CisKKwlpZiAoKE1vZGUgJiAoU0tfU1RSSVBfRkNTX09OIHwgU0tfU1RSSVBfRkNTX09GRikpICE9IDApIHsKKwkJCisJCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9SWF9DVFJMLCAmT2xkUnhDbWQpOworCisJCVJ4Q21kID0gT2xkUnhDbWQ7CisKKwkJaWYgKChNb2RlICYgU0tfU1RSSVBfRkNTX09OKSAhPSAwKSB7CisJCQlSeENtZCB8PSBHTV9SWENSX0NSQ19ESVM7CisJCX0KKwkJZWxzZSB7CisJCQlSeENtZCAmPSB+R01fUlhDUl9DUkNfRElTOworCQl9CisJCS8qIFdyaXRlIHRoZSBuZXcgbW9kZSB0byB0aGUgUnggY29udHJvbCByZWdpc3RlciBpZiByZXF1aXJlZCAqLworCQlpZiAoT2xkUnhDbWQgIT0gUnhDbWQpIHsKKwkJCUdNX09VVDE2KElvQywgUG9ydCwgR01fUlhfQ1RSTCwgUnhDbWQpOworCQl9CisJfQorCisJaWYgKChNb2RlICYgKFNLX0JJR19QS19PS19PTiB8IFNLX0JJR19QS19PS19PRkYpKSAhPSAwKSB7CisJCQorCQlHTV9JTjE2KElvQywgUG9ydCwgR01fU0VSSUFMX01PREUsICZPbGRSeENtZCk7CisKKwkJUnhDbWQgPSBPbGRSeENtZDsKKworCQlpZiAoKE1vZGUgJiBTS19CSUdfUEtfT0tfT04pICE9IDApIHsKKwkJCVJ4Q21kIHw9IEdNX1NNT0RfSlVNQk9fRU5BOworCQl9CisJCWVsc2UgeworCQkJUnhDbWQgJj0gfkdNX1NNT0RfSlVNQk9fRU5BOworCQl9CisJCS8qIFdyaXRlIHRoZSBuZXcgbW9kZSB0byB0aGUgUnggY29udHJvbCByZWdpc3RlciBpZiByZXF1aXJlZCAqLworCQlpZiAoT2xkUnhDbWQgIT0gUnhDbWQpIHsKKwkJCUdNX09VVDE2KElvQywgUG9ydCwgR01fU0VSSUFMX01PREUsIFJ4Q21kKTsKKwkJfQorCX0KK30JLyogU2tHbVNldFJ4Q21kICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrTWFjU2V0UnhDbWQoKSAtIE1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIE1BQydzIFJ4IENvbnRyb2wgUmVnaXN0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoJbW9kaWZpZXMgdGhlIE1BQydzIFJ4IENvbnRyb2wgcmVnLiBkZXAuIG9uIGJvYXJkIHR5cGUKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrTWFjU2V0UnhDbWQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworaW50CQlNb2RlKQkJLyogUnggTW9kZSAqLworeworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQorCQlTa1htU2V0UnhDbWQocEFDLCBJb0MsIFBvcnQsIE1vZGUpOworCX0KKwllbHNlIHsKKwkJCisJCVNrR21TZXRSeENtZChwQUMsIElvQywgUG9ydCwgTW9kZSk7CisJfQorCit9CS8qIFNrTWFjU2V0UnhDbWQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNDcmNHZW5lcigpIC0gRW5hYmxlIC8gRGlzYWJsZSBDUkMgR2VuZXJhdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgllbmFibGVzIC8gZGlzYWJsZXMgQ1JDIGdlbmVyYXRpb24gZGVwLiBvbiBib2FyZCB0eXBlCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa01hY0NyY0dlbmVyKAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK1NLX0JPT0wJRW5hYmxlKQkvKiBFbmFibGUgLyBEaXNhYmxlICovCit7CisJU0tfVTE2CVdvcmQ7CisKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkKKwkJWE1fSU4xNihJb0MsIFBvcnQsIFhNX1RYX0NNRCwgJldvcmQpOworCisJCWlmIChFbmFibGUpIHsKKwkJCVdvcmQgJj0gflhNX1RYX05PX0NSQzsKKwkJfQorCQllbHNlIHsKKwkJCVdvcmQgfD0gWE1fVFhfTk9fQ1JDOworCQl9CisJCS8qIHNldHVwIFR4IENvbW1hbmQgUmVnaXN0ZXIgKi8KKwkJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9UWF9DTUQsIFdvcmQpOworCX0KKwllbHNlIHsKKwkJCisJCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9UWF9DVFJMLCAmV29yZCk7CisJCQorCQlpZiAoRW5hYmxlKSB7CisJCQlXb3JkICY9IH5HTV9UWENSX0NSQ19ESVM7CisJCX0KKwkJZWxzZSB7CisJCQlXb3JkIHw9IEdNX1RYQ1JfQ1JDX0RJUzsKKwkJfQorCQkvKiBzZXR1cCBUeCBDb250cm9sIFJlZ2lzdGVyICovCisJCUdNX09VVDE2KElvQywgUG9ydCwgR01fVFhfQ1RSTCwgV29yZCk7CisJfQorCit9CS8qIFNrTWFjQ3JjR2VuZXIqLworCisjZW5kaWYgLyogU0tfRElBRyAqLworCisKKyNpZmRlZiBHRU5FU0lTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbUNsckV4YWN0QWRkcigpIC0gQ2xlYXIgRXhhY3QgTWF0Y2ggQWRkcmVzcyBSZWdpc3RlcnMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUFsbCBFeGFjdCBNYXRjaCBBZGRyZXNzIHJlZ2lzdGVycyBvZiB0aGUgWE1BQyAnUG9ydCcgd2lsbCBiZQorICoJY2xlYXJlZCBzdGFydGluZyB3aXRoICdTdGFydE51bScgdXAgdG8gKGFuZCBpbmNsdWRpbmcpIHRoZQorICoJRXhhY3QgTWF0Y2ggYWRkcmVzcyBudW1iZXIgb2YgJ1N0b3BOdW0nLgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tYbUNsckV4YWN0QWRkcigKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitpbnQJCVN0YXJ0TnVtLAkvKiBCZWdpbiB3aXRoIHRoaXMgQWRkcmVzcyBSZWdpc3RlciBJbmRleCAoMC4uMTUpICovCitpbnQJCVN0b3BOdW0pCS8qIFN0b3AgYWZ0ZXIgZmluaXNoZWQgd2l0aCB0aGlzIFJlZ2lzdGVyIElkeCAoMC4uMTUpICovCit7CisJaW50CQlpOworCVNLX1UxNglaZXJvQWRkclszXSA9IHsweDAwMDAsIDB4MDAwMCwgMHgwMDAwfTsKKworCWlmICgodW5zaWduZWQpU3RhcnROdW0gPiAxNSB8fCAodW5zaWduZWQpU3RvcE51bSA+IDE1IHx8CisJCVN0YXJ0TnVtID4gU3RvcE51bSkgeworCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMDEsIFNLRVJSX0hXSV9FMDAxTVNHKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IFN0YXJ0TnVtOyBpIDw9IFN0b3BOdW07IGkrKykgeworCQlYTV9PVVRBRERSKElvQywgUG9ydCwgWE1fRVhNKGkpLCAmWmVyb0FkZHJbMF0pOworCX0KK30JLyogU2tYbUNsckV4YWN0QWRkciAqLworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNGbHVzaFR4RmlmbygpIC0gRmx1c2ggdGhlIE1BQydzIHRyYW5zbWl0IEZJRk8KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUZsdXNoIHRoZSB0cmFuc21pdCBGSUZPIG9mIHRoZSBNQUMgc3BlY2lmaWVkIGJ5IHRoZSBpbmRleCAnUG9ydCcKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrTWFjRmx1c2hUeEZpZm8oCitTS19BQwkqcEFDLAkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworI2lmZGVmIEdFTkVTSVMKKwlTS19VMzIJTWRSZWc7CisKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkKKwkJWE1fSU4zMihJb0MsIFBvcnQsIFhNX01PREUsICZNZFJlZyk7CisKKwkJWE1fT1VUMzIoSW9DLCBQb3J0LCBYTV9NT0RFLCBNZFJlZyB8IFhNX01EX0ZURik7CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkvKiBubyB3YXkgdG8gZmx1c2ggdGhlIEZJRk8gd2UgaGF2ZSB0byBpc3N1ZSBhIHJlc2V0ICovCisJCS8qIFRCRCAqLworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCit9CS8qIFNrTWFjRmx1c2hUeEZpZm8gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNGbHVzaFJ4RmlmbygpIC0gRmx1c2ggdGhlIE1BQydzIHJlY2VpdmUgRklGTworICoKKyAqIERlc2NyaXB0aW9uOgorICoJRmx1c2ggdGhlIHJlY2VpdmUgRklGTyBvZiB0aGUgTUFDIHNwZWNpZmllZCBieSB0aGUgaW5kZXggJ1BvcnQnCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa01hY0ZsdXNoUnhGaWZvKAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKyNpZmRlZiBHRU5FU0lTCisJU0tfVTMyCU1kUmVnOworCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKworCQlYTV9JTjMyKElvQywgUG9ydCwgWE1fTU9ERSwgJk1kUmVnKTsKKworCQlYTV9PVVQzMihJb0MsIFBvcnQsIFhNX01PREUsIE1kUmVnIHwgWE1fTURfRlJGKTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCS8qIG5vIHdheSB0byBmbHVzaCB0aGUgRklGTyB3ZSBoYXZlIHRvIGlzc3VlIGEgcmVzZXQgKi8KKwkJLyogVEJEICovCisJfQorI2VuZGlmIC8qIFlVS09OICovCisKK30JLyogU2tNYWNGbHVzaFJ4RmlmbyAqLworCisKKyNpZmRlZiBHRU5FU0lTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbVNvZnRSc3QoKSAtIERvIGEgWE1BQyBzb2Z0d2FyZSByZXNldAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIFBIWSByZWdpc3RlcnMgc2hvdWxkIG5vdCBiZSBkZXN0cm95ZWQgZHVyaW5nIHRoaXMKKyAqCWtpbmQgb2Ygc29mdHdhcmUgcmVzZXQuIFRoZXJlZm9yZSB0aGUgWE1BQyBTb2Z0d2FyZSBSZXNldAorICoJKFhNX0dQX1JFU19NQUMgYml0IGluIFhNX0dQX1BPUlQpIG11c3Qgbm90IGJlIHVzZWQhCisgKgorICoJVGhlIHNvZnR3YXJlIHJlc2V0IGlzIGRvbmUgYnkKKyAqCQktIGRpc2FibGluZyB0aGUgUnggYW5kIFR4IHN0YXRlIG1hY2hpbmUsCisgKgkJLSByZXNldHRpbmcgdGhlIHN0YXRpc3RpY3MgbW9kdWxlLAorICoJCS0gY2xlYXIgYWxsIG90aGVyIHNpZ25pZmljYW50IFhNQUMgTW9kZSwKKyAqCQkgIENvbW1hbmQsIGFuZCBDb250cm9sIFJlZ2lzdGVycworICoJCS0gY2xlYXJpbmcgdGhlIEhhc2ggUmVnaXN0ZXIgYW5kIHRoZQorICoJCSAgRXhhY3QgTWF0Y2ggQWRkcmVzcyByZWdpc3RlcnMsIGFuZAorICoJCS0gZmx1c2hpbmcgdGhlIFhNQUMncyBSeCBhbmQgVHggRklGT3MuCisgKgorICogTm90ZToKKyAqCUFub3RoZXIgcmVxdWlyZW1lbnQgd2hlbiBzdG9wcGluZyB0aGUgWE1BQyBpcyB0bworICoJYXZvaWQgc2VuZGluZyBjb3JydXB0ZWQgZnJhbWVzIG9uIHRoZSBuZXR3b3JrLgorICoJRGlzYWJsaW5nIHRoZSBUeCBzdGF0ZSBtYWNoaW5lIHdpbGwgTk9UIGludGVycnVwdAorICoJdGhlIGN1cnJlbnRseSB0cmFuc21pdHRlZCBmcmFtZS4gQnV0IHdlIG11c3QgdGFrZSBjYXJlCisgKgl0aGF0IHRoZSBUeCBGSUZPIGlzIGNsZWFyZWQgQUZURVIgdGhlIGN1cnJlbnQgZnJhbWUKKyAqCWlzIGNvbXBsZXRlIHNlbnQgdG8gdGhlIG5ldHdvcmsuCisgKgorICoJSXQgdGFrZXMgYWJvdXQgMTJucyB0byBzZW5kIGEgZnJhbWUgd2l0aCAxNTM4IGJ5dGVzLgorICoJT25lIFBDSSBjbG9jayBnb2VzIGF0IGxlYXN0IDE1bnMgKDY2TUh6KS4gVGhlcmVmb3JlCisgKglhZnRlciByZWFkaW5nIFhNX0dQX1BPUlQgYmFjaywgd2UgYXJlIHN1cmUgdGhhdCB0aGUKKyAqCXRyYW5zbWl0dGVyIGlzIGRpc2FibGVkIEFORCBpZGxlLiBBbmQgdGhpcyBtZWFucworICoJd2UgbWF5IGZsdXNoIHRoZSB0cmFuc21pdCBGSUZPIG5vdy4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa1htU29mdFJzdCgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfVTE2CVplcm9BZGRyWzRdID0gezB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMH07CisJCisJLyogcmVzZXQgdGhlIHN0YXRpc3RpY3MgbW9kdWxlICovCisJWE1fT1VUMzIoSW9DLCBQb3J0LCBYTV9HUF9QT1JULCBYTV9HUF9SRVNfU1RBVCk7CisKKwkvKiBkaXNhYmxlIGFsbCBYTUFDIElSUXMgKi8KKwlYTV9PVVQxNihJb0MsIFBvcnQsIFhNX0lNU0ssIDB4ZmZmZik7CisJCisJWE1fT1VUMzIoSW9DLCBQb3J0LCBYTV9NT0RFLCAwKTsJCS8qIGNsZWFyIE1vZGUgUmVnICovCisJCisJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9UWF9DTUQsIDApOwkJLyogcmVzZXQgVFggQ01EIFJlZyAqLworCVhNX09VVDE2KElvQywgUG9ydCwgWE1fUlhfQ01ELCAwKTsJCS8qIHJlc2V0IFJYIENNRCBSZWcgKi8KKwkKKwkvKiBkaXNhYmxlIGFsbCBQSFkgSVJRcyAqLworCXN3aXRjaCAocEFDLT5HSW5pLkdQW1BvcnRdLlBoeVR5cGUpIHsKKwljYXNlIFNLX1BIWV9CQ09NOgorCQkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9JTlRfTUFTSywgMHhmZmZmKTsKKwkJCWJyZWFrOworI2lmZGVmIE9USEVSX1BIWQorCQljYXNlIFNLX1BIWV9MT05FOgorCQkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTE9ORV9JTlRfRU5BQiwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBTS19QSFlfTkFUOgorCQkJLyogdG9kbzogTmF0aW9uYWwKKwkJCSBTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9OQVRfSU5UX01BU0ssIDB4ZmZmZik7ICovCisJCQlicmVhazsKKyNlbmRpZiAvKiBPVEhFUl9QSFkgKi8KKwl9CisKKwkvKiBjbGVhciB0aGUgSGFzaCBSZWdpc3RlciAqLworCVhNX09VVEhBU0goSW9DLCBQb3J0LCBYTV9IU00sICZaZXJvQWRkcik7CisKKwkvKiBjbGVhciB0aGUgRXhhY3QgTWF0Y2ggQWRkcmVzcyByZWdpc3RlcnMgKi8KKwlTa1htQ2xyRXhhY3RBZGRyKHBBQywgSW9DLCBQb3J0LCAwLCAxNSk7CisJCisJLyogY2xlYXIgdGhlIFNvdXJjZSBDaGVjayBBZGRyZXNzIHJlZ2lzdGVycyAqLworCVhNX09VVEhBU0goSW9DLCBQb3J0LCBYTV9TUkNfQ0hLLCAmWmVyb0FkZHIpOworCit9CS8qIFNrWG1Tb2Z0UnN0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1IYXJkUnN0KCkgLSBEbyBhIFhNQUMgaGFyZHdhcmUgcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBYTUFDIG9mIHRoZSBzcGVjaWZpZWQgJ1BvcnQnIGFuZCBhbGwgY29ubmVjdGVkIGRldmljZXMKKyAqCShQSFkgYW5kIFNFUkRFUykgd2lsbCByZWNlaXZlIGEgcmVzZXQgc2lnbmFsIG9uIGl0cyAqUmVzZXQgcGlucy4KKyAqCUV4dGVybmFsIFBIWXMgbXVzdCBiZSByZXNldCBieSBjbGVhcmluZyBhIGJpdCBpbiB0aGUgR1BJTyByZWdpc3RlcgorICogIChUaW1pbmcgcmVxdWlyZW1lbnRzOiBCcm9hZGNvbTogNDAwbnMsIExldmVsIE9uZTogbm9uZSwgTmF0aW9uYWw6IDgwbnMpLgorICoKKyAqIEFUVEVOVElPTjoKKyAqIAlJdCBpcyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSB0byByZXNldCB0aGUgU1dfUlNUIEJpdCBmaXJzdAorICoJYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa1htSGFyZFJzdCgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfVTMyCVJlZzsKKwlpbnQJCWk7CisJaW50CQlUT3V0OworCVNLX1UxNglXb3JkOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkvKiBUWF9NRkZfQ1RSTDEgaGFzIDMyIGJpdHMsIGJ1dCBvbmx5IHRoZSBsb3dlc3QgMTYgYml0cyBhcmUgdXNlZCAqLworCQlTS19PVVQxNihJb0MsIE1SX0FERFIoUG9ydCwgVFhfTUZGX0NUUkwxKSwgTUZGX0NMUl9NQUNfUlNUKTsKKworCQlUT3V0ID0gMDsKKwkJZG8geworCQkJaWYgKFRPdXQrKyA+IDEwMDAwKSB7CisJCQkJLyoKKwkJCQkgKiBBZGFwdGVyIHNlZW1zIHRvIGJlIGluIFJFU0VUIHN0YXRlLgorCQkJCSAqIFJlZ2lzdGVycyBjYW5ub3QgYmUgd3JpdHRlbi4KKwkJCQkgKi8KKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCVNLX09VVDE2KElvQywgTVJfQUREUihQb3J0LCBUWF9NRkZfQ1RSTDEpLCBNRkZfU0VUX01BQ19SU1QpOworCQkJCisJCQlTS19JTjE2KElvQywgTVJfQUREUihQb3J0LCBUWF9NRkZfQ1RSTDEpLCAmV29yZCk7CisJCQorCQl9IHdoaWxlICgoV29yZCAmIE1GRl9TRVRfTUFDX1JTVCkgPT0gMCk7CisJfQorCisJLyogRm9yIGV4dGVybmFsIFBIWXMgdGhlcmUgbXVzdCBiZSBzcGVjaWFsIGhhbmRsaW5nICovCisJaWYgKHBBQy0+R0luaS5HUFtQb3J0XS5QaHlUeXBlICE9IFNLX1BIWV9YTUFDKSB7CisJCQorCQlTS19JTjMyKElvQywgQjJfR1BfSU8sICZSZWcpOworCQkKKwkJaWYgKFBvcnQgPT0gMCkgeworCQkJUmVnIHw9IEdQX0RJUl8wOyAJLyogc2V0IHRvIG91dHB1dCAqLworCQkJUmVnICY9IH5HUF9JT18wOwkvKiBzZXQgUEhZIHJlc2V0IChhY3RpdmUgbG93KSAqLworCQl9CisJCWVsc2UgeworCQkJUmVnIHw9IEdQX0RJUl8yOwkvKiBzZXQgdG8gb3V0cHV0ICovCisJCQlSZWcgJj0gfkdQX0lPXzI7CS8qIHNldCBQSFkgcmVzZXQgKGFjdGl2ZSBsb3cpICovCisJCX0KKwkJLyogcmVzZXQgZXh0ZXJuYWwgUEhZICovCisJCVNLX09VVDMyKElvQywgQjJfR1BfSU8sIFJlZyk7CisKKwkJLyogc2hvcnQgZGVsYXkgKi8KKwkJU0tfSU4zMihJb0MsIEIyX0dQX0lPLCAmUmVnKTsKKwl9Cit9CS8qIFNrWG1IYXJkUnN0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1DbGVhclJzdCgpIC0gUmVsZWFzZSB0aGUgUEhZICYgWE1BQyByZXNldAorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrWG1DbGVhclJzdCgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfVTMyCURXb3JkOworCQorCS8qIGNsZWFyIEhXIHJlc2V0ICovCisJU0tfT1VUMTYoSW9DLCBNUl9BRERSKFBvcnQsIFRYX01GRl9DVFJMMSksIE1GRl9DTFJfTUFDX1JTVCk7CisKKwlpZiAocEFDLT5HSW5pLkdQW1BvcnRdLlBoeVR5cGUgIT0gU0tfUEhZX1hNQUMpIHsKKworCQlTS19JTjMyKElvQywgQjJfR1BfSU8sICZEV29yZCk7CisKKwkJaWYgKFBvcnQgPT0gMCkgeworCQkJRFdvcmQgfD0gKEdQX0RJUl8wIHwgR1BfSU9fMCk7IC8qIHNldCB0byBvdXRwdXQgKi8KKwkJfQorCQllbHNlIHsKKwkJCURXb3JkIHw9IChHUF9ESVJfMiB8IEdQX0lPXzIpOyAvKiBzZXQgdG8gb3V0cHV0ICovCisJCX0KKwkJLyogQ2xlYXIgUEhZIHJlc2V0ICovCisJCVNLX09VVDMyKElvQywgQjJfR1BfSU8sIERXb3JkKTsKKworCQkvKiBFbmFibGUgR01JSSBpbnRlcmZhY2UgKi8KKwkJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9IV19DRkcsIFhNX0hXX0dNSUlfTUQpOworCX0KK30JLyogU2tYbUNsZWFyUnN0ICovCisjZW5kaWYgLyogR0VORVNJUyAqLworCisKKyNpZmRlZiBZVUtPTgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR21Tb2Z0UnN0KCkgLSBEbyBhIEdNQUMgc29mdHdhcmUgcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBHUEhZIHJlZ2lzdGVycyBzaG91bGQgbm90IGJlIGRlc3Ryb3llZCBkdXJpbmcgdGhpcworICoJa2luZCBvZiBzb2Z0d2FyZSByZXNldC4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa0dtU29mdFJzdCgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfVTE2CUVtcHR5SGFzaFs0XSA9IHsweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDB9OworCVNLX1UxNiAgUnhDdHJsOworCisJLyogcmVzZXQgdGhlIHN0YXRpc3RpY3MgbW9kdWxlICovCisKKwkvKiBkaXNhYmxlIGFsbCBHTUFDIElSUXMgKi8KKwlTS19PVVQ4KElvQywgR01BQ19JUlFfTVNLLCAwKTsKKwkKKwkvKiBkaXNhYmxlIGFsbCBQSFkgSVJRcyAqLworCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfSU5UX01BU0ssIDApOworCQorCS8qIGNsZWFyIHRoZSBIYXNoIFJlZ2lzdGVyICovCisJR01fT1VUSEFTSChJb0MsIFBvcnQsIEdNX01DX0FERFJfSDEsIEVtcHR5SGFzaCk7CisKKwkvKiBFbmFibGUgVW5pY2FzdCBhbmQgTXVsdGljYXN0IGZpbHRlcmluZyAqLworCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9SWF9DVFJMLCAmUnhDdHJsKTsKKwkKKwlHTV9PVVQxNihJb0MsIFBvcnQsIEdNX1JYX0NUUkwsCisJCShTS19VMTYpKFJ4Q3RybCB8IEdNX1JYQ1JfVUNGX0VOQSB8IEdNX1JYQ1JfTUNGX0VOQSkpOworCit9CS8qIFNrR21Tb2Z0UnN0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR21IYXJkUnN0KCkgLSBEbyBhIEdNQUMgaGFyZHdhcmUgcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa0dtSGFyZFJzdCgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfVTMyCURXb3JkOworCQorCS8qIFdBIGNvZGUgZm9yIENPTUEgbW9kZSAqLworCWlmIChwQUMtPkdJbmkuR0lZdWtvbkxpdGUgJiYKKwkJcEFDLT5HSW5pLkdJQ2hpcFJldiA9PSBDSElQX1JFVl9ZVV9MSVRFX0EzKSB7CisJCQorCQlTS19JTjMyKElvQywgQjJfR1BfSU8sICZEV29yZCk7CisKKwkJRFdvcmQgfD0gKEdQX0RJUl85IHwgR1BfSU9fOSk7CisKKwkJLyogc2V0IFBIWSByZXNldCAqLworCQlTS19PVVQzMihJb0MsIEIyX0dQX0lPLCBEV29yZCk7CisJfQorCisJLyogc2V0IEdQSFkgQ29udHJvbCByZXNldCAqLworCVNLX09VVDMyKElvQywgTVJfQUREUihQb3J0LCBHUEhZX0NUUkwpLCBHUENfUlNUX1NFVCk7CisKKwkvKiBzZXQgR01BQyBDb250cm9sIHJlc2V0ICovCisJU0tfT1VUMzIoSW9DLCBNUl9BRERSKFBvcnQsIEdNQUNfQ1RSTCksIEdNQ19SU1RfU0VUKTsKKworfQkvKiBTa0dtSGFyZFJzdCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtQ2xlYXJSc3QoKSAtIFJlbGVhc2UgdGhlIEdQSFkgJiBHTUFDIHJlc2V0CisgKgorICogRGVzY3JpcHRpb246CisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgU2tHbUNsZWFyUnN0KAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19VMzIJRFdvcmQ7CisJCisjaWZkZWYgWFhYCisJCS8qIGNsZWFyIEdNQUMgQ29udHJvbCByZXNldCAqLworCQlTS19PVVQzMihJb0MsIE1SX0FERFIoUG9ydCwgR01BQ19DVFJMKSwgR01DX1JTVF9DTFIpOworCisJCS8qIHNldCBHTUFDIENvbnRyb2wgcmVzZXQgKi8KKwkJU0tfT1VUMzIoSW9DLCBNUl9BRERSKFBvcnQsIEdNQUNfQ1RSTCksIEdNQ19SU1RfU0VUKTsKKyNlbmRpZiAvKiBYWFggKi8KKworCS8qIFdBIGNvZGUgZm9yIENPTUEgbW9kZSAqLworCWlmIChwQUMtPkdJbmkuR0lZdWtvbkxpdGUgJiYKKwkJcEFDLT5HSW5pLkdJQ2hpcFJldiA9PSBDSElQX1JFVl9ZVV9MSVRFX0EzKSB7CisJCQorCQlTS19JTjMyKElvQywgQjJfR1BfSU8sICZEV29yZCk7CisKKwkJRFdvcmQgfD0gR1BfRElSXzk7CQkvKiBzZXQgdG8gb3V0cHV0ICovCisJCURXb3JkICY9IH5HUF9JT185OwkJLyogY2xlYXIgUEhZIHJlc2V0IChhY3RpdmUgaGlnaCkgKi8KKworCQkvKiBjbGVhciBQSFkgcmVzZXQgKi8KKwkJU0tfT1VUMzIoSW9DLCBCMl9HUF9JTywgRFdvcmQpOworCX0KKworCS8qIHNldCBIV0NGR19NT0RFICovCisJRFdvcmQgPSBHUENfSU5UX1BPTF9ISSB8IEdQQ19ESVNfRkMgfCBHUENfRElTX1NMRUVQIHwKKwkJR1BDX0VOQV9YQyB8IEdQQ19BTkVHX0FEVl9BTExfTSB8IEdQQ19FTkFfUEFVU0UgfAorCQkocEFDLT5HSW5pLkdJQ29wcGVyVHlwZSA/IEdQQ19IV0NGR19HTUlJX0NPUCA6CisJCUdQQ19IV0NGR19HTUlJX0ZJQik7CisKKwkvKiBzZXQgR1BIWSBDb250cm9sIHJlc2V0ICovCisJU0tfT1VUMzIoSW9DLCBNUl9BRERSKFBvcnQsIEdQSFlfQ1RSTCksIERXb3JkIHwgR1BDX1JTVF9TRVQpOworCisJLyogcmVsZWFzZSBHUEhZIENvbnRyb2wgcmVzZXQgKi8KKwlTS19PVVQzMihJb0MsIE1SX0FERFIoUG9ydCwgR1BIWV9DVFJMKSwgRFdvcmQgfCBHUENfUlNUX0NMUik7CisKKyNpZmRlZiBWQ1BVCisJVkNwdVdhaXQoOTAwMCk7CisjZW5kaWYgLyogVkNQVSAqLworCisJLyogY2xlYXIgR01BQyBDb250cm9sIHJlc2V0ICovCisJU0tfT1VUMzIoSW9DLCBNUl9BRERSKFBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PTiB8IEdNQ19SU1RfQ0xSKTsKKworI2lmZGVmIFZDUFUKKwlWQ3B1V2FpdCgyMDAwKTsKKwkKKwlTS19JTjMyKElvQywgTVJfQUREUihQb3J0LCBHUEhZX0NUUkwpLCAmRFdvcmQpOworCQkJCisJU0tfSU4zMihJb0MsIEIwX0lTUkMsICZEV29yZCk7CisjZW5kaWYgLyogVkNQVSAqLworCit9CS8qIFNrR21DbGVhclJzdCAqLworI2VuZGlmIC8qIFlVS09OICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrTWFjU29mdFJzdCgpIC0gRG8gYSBNQUMgc29mdHdhcmUgcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoJY2FsbHMgYSBNQUMgc29mdHdhcmUgcmVzZXQgcm91dGluZSBkZXAuIG9uIGJvYXJkIHR5cGUKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrTWFjU29mdFJzdCgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwkvKiBkaXNhYmxlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlciAqLworCVNrTWFjUnhUeERpc2FibGUocEFDLCBJb0MsIFBvcnQpOworCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQorCQlTa1htU29mdFJzdChwQUMsIElvQywgUG9ydCk7CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkKKwkJU2tHbVNvZnRSc3QocEFDLCBJb0MsIFBvcnQpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCisJLyogZmx1c2ggdGhlIE1BQydzIFJ4IGFuZCBUeCBGSUZPcyAqLworCVNrTWFjRmx1c2hUeEZpZm8ocEFDLCBJb0MsIFBvcnQpOworCQorCVNrTWFjRmx1c2hSeEZpZm8ocEFDLCBJb0MsIFBvcnQpOworCisJcFBydC0+UFN0YXRlID0gU0tfUFJUX1NUT1A7CisKK30JLyogU2tNYWNTb2Z0UnN0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrTWFjSGFyZFJzdCgpIC0gRG8gYSBNQUMgaGFyZHdhcmUgcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoJY2FsbHMgYSBNQUMgaGFyZHdhcmUgcmVzZXQgcm91dGluZSBkZXAuIG9uIGJvYXJkIHR5cGUKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrTWFjSGFyZFJzdCgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQorCQlTa1htSGFyZFJzdChwQUMsIElvQywgUG9ydCk7CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkKKwkJU2tHbUhhcmRSc3QocEFDLCBJb0MsIFBvcnQpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCisJcEFDLT5HSW5pLkdQW1BvcnRdLlBTdGF0ZSA9IFNLX1BSVF9SRVNFVDsKKworfQkvKiBTa01hY0hhcmRSc3QgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNDbGVhclJzdCgpIC0gQ2xlYXIgdGhlIE1BQyByZXNldAorICoKKyAqIERlc2NyaXB0aW9uOgljYWxscyBhIGNsZWFyIE1BQyByZXNldCByb3V0aW5lIGRlcC4gb24gYm9hcmQgdHlwZQorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tNYWNDbGVhclJzdCgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQorCQlTa1htQ2xlYXJSc3QocEFDLCBJb0MsIFBvcnQpOworCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCisJCVNrR21DbGVhclJzdChwQUMsIElvQywgUG9ydCk7CisJfQorI2VuZGlmIC8qIFlVS09OICovCisKK30JLyogU2tNYWNDbGVhclJzdCAqLworCisKKyNpZmRlZiBHRU5FU0lTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbUluaXRNYWMoKSAtIEluaXRpYWxpemUgdGhlIFhNQUMgSUkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUluaXRpYWxpemUgdGhlIFhNQUMgb2YgdGhlIHNwZWNpZmllZCBwb3J0LgorICoJVGhlIFhNQUMgbXVzdCBiZSByZXNldCBvciBzdG9wcGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogTm90ZToKKyAqCVRoZSBYTUFDJ3MgUnggYW5kIFR4IHN0YXRlIG1hY2hpbmUgaXMgc3RpbGwgZGlzYWJsZWQgd2hlbiByZXR1cm5pbmcuCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa1htSW5pdE1hYygKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworCWludAkJCWk7CisJU0tfVTE2CQlTV29yZDsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJaWYgKHBQcnQtPlBTdGF0ZSA9PSBTS19QUlRfU1RPUCkgeworCQkvKiBQb3J0IFN0YXRlOiBTS19QUlRfU1RPUCAqLworCQkvKiBWZXJpZnkgdGhhdCB0aGUgcmVzZXQgYml0IGlzIGNsZWFyZWQgKi8KKwkJU0tfSU4xNihJb0MsIE1SX0FERFIoUG9ydCwgVFhfTUZGX0NUUkwxKSwgJlNXb3JkKTsKKworCQlpZiAoKFNXb3JkICYgTUZGX1NFVF9NQUNfUlNUKSAhPSAwKSB7CisJCQkvKiBQU3RhdGUgZG9lcyBub3QgbWF0Y2ggSFcgc3RhdGUgKi8KKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMDYsIFNLRVJSX0hXSV9FMDA2TVNHKTsKKwkJCS8qIENvcnJlY3QgaXQgKi8KKwkJCXBQcnQtPlBTdGF0ZSA9IFNLX1BSVF9SRVNFVDsKKwkJfQorCX0KKworCWlmIChwUHJ0LT5QU3RhdGUgPT0gU0tfUFJUX1JFU0VUKSB7CisKKwkJU2tYbUNsZWFyUnN0KHBBQywgSW9DLCBQb3J0KTsKKworCQlpZiAocFBydC0+UGh5VHlwZSAhPSBTS19QSFlfWE1BQykgeworCQkJLyogcmVhZCBJZCBmcm9tIGV4dGVybmFsIFBIWSAoYWxsIGhhdmUgdGhlIHNhbWUgYWRkcmVzcykgKi8KKwkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfWE1BQ19JRDEsICZwUHJ0LT5QaHlJZDEpOworCisJCQkvKgorCQkJICogT3B0aW1pemUgTURJTyB0cmFuc2ZlciBieSBzdXBwcmVzc2luZyBwcmVhbWJsZS4KKwkJCSAqIE11c3QgYmUgZG9uZSBBRlRFUiBmaXJzdCBhY2Nlc3MgdG8gQkNPTSBjaGlwLgorCQkJICovCisJCQlYTV9JTjE2KElvQywgUG9ydCwgWE1fTU1VX0NNRCwgJlNXb3JkKTsKKwkJCQorCQkJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9NTVVfQ01ELCBTV29yZCB8IFhNX01NVV9OT19QUkUpOworCisJCQlpZiAocFBydC0+UGh5SWQxID09IFBIWV9CQ09NX0lEMV9DMCkgeworCQkJCS8qCisJCQkJICogV29ya2Fyb3VuZCBCQ09NIEVycmF0YSBmb3IgdGhlIEMwIHR5cGUuCisJCQkJICogV3JpdGUgbWFnaWMgcGF0dGVybnMgdG8gcmVzZXJ2ZWQgcmVnaXN0ZXJzLgorCQkJCSAqLworCQkJCWkgPSAwOworCQkJCXdoaWxlIChCY29tUmVnQzBIYWNrW2ldLlBoeVJlZyAhPSAwKSB7CisJCQkJCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgQmNvbVJlZ0MwSGFja1tpXS5QaHlSZWcsCisJCQkJCQlCY29tUmVnQzBIYWNrW2ldLlBoeVZhbCk7CisJCQkJCWkrKzsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChwUHJ0LT5QaHlJZDEgPT0gUEhZX0JDT01fSUQxX0ExKSB7CisJCQkJLyoKKwkJCQkgKiBXb3JrYXJvdW5kIEJDT00gRXJyYXRhIGZvciB0aGUgQTEgdHlwZS4KKwkJCQkgKiBXcml0ZSBtYWdpYyBwYXR0ZXJucyB0byByZXNlcnZlZCByZWdpc3RlcnMuCisJCQkJICovCisJCQkJaSA9IDA7CisJCQkJd2hpbGUgKEJjb21SZWdBMUhhY2tbaV0uUGh5UmVnICE9IDApIHsKKwkJCQkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBCY29tUmVnQTFIYWNrW2ldLlBoeVJlZywKKwkJCQkJCUJjb21SZWdBMUhhY2tbaV0uUGh5VmFsKTsKKwkJCQkJaSsrOworCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqIFdvcmthcm91bmQgQkNPTSBFcnJhdGEgKCMxMDUyMykgZm9yIGFsbCBCQ29tIFBIWXMuCisJCQkgKiBEaXNhYmxlIFBvd2VyIE1hbmFnZW1lbnQgYWZ0ZXIgcmVzZXQuCisJCQkgKi8KKwkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCwgJlNXb3JkKTsKKwkJCQorCQkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCwKKwkJCQkoU0tfVTE2KShTV29yZCB8IFBIWV9CX0FDX0RJU19QTSkpOworCisJCQkvKiBQSFkgTEVEIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgaW4gU2tHZVhtaXRMRUQoKSAqLworCQl9CisKKwkJLyogRHVtbXkgcmVhZCB0aGUgSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciAqLworCQlYTV9JTjE2KElvQywgUG9ydCwgWE1fSVNSQywgJlNXb3JkKTsKKwkJCisJCS8qCisJCSAqIFRoZSBhdXRvLW5lZ290aWF0aW9uIHByb2Nlc3Mgc3RhcnRzIGltbWVkaWF0ZWx5IGFmdGVyCisJCSAqIGNsZWFyaW5nIHRoZSByZXNldC4gVGhlIGF1dG8tbmVnb3RpYXRpb24gcHJvY2VzcyBzaG91bGQgYmUKKwkJICogc3RhcnRlZCBieSB0aGUgU0lSUSwgdGhlcmVmb3JlIHN0b3AgaXQgaGVyZSBpbW1lZGlhdGVseS4KKwkJICovCisJCVNrTWFjSW5pdFBoeShwQUMsIElvQywgUG9ydCwgU0tfRkFMU0UpOworCisjaWZkZWYgVEVTVF9PTkxZCisJCS8qIHRlbXAuIGNvZGU6IGVuYWJsZSBzaWduYWwgZGV0ZWN0ICovCisJCS8qIFdBUk5JTkc6IGRvIG5vdCBvdmVycmlkZSBHTUlJIHNldHRpbmcgYWJvdmUgKi8KKwkJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9IV19DRkcsIFhNX0hXX0NPTTRTSUcpOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBjb25maWd1cmUgdGhlIFhNQUNzIFN0YXRpb24gQWRkcmVzcworCSAqIEIyX01BQ18yID0geHggeHggeHggeHggeHggeDEgaXMgcHJvZ3JhbW1lZCB0byBYTUFDIEEKKwkgKiBCMl9NQUNfMyA9IHh4IHh4IHh4IHh4IHh4IHgyIGlzIHByb2dyYW1tZWQgdG8gWE1BQyBCCisJICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkvKgorCQkgKiBUaGUgZm9sbG93aW5nIDIgc3RhdGVtZW50cyBhcmUgdG9nZXRoZXIgZW5kaWFuZXNzCisJCSAqIGluZGVwZW5kZW50LiBSZW1lbWJlciB0aGlzIHdoZW4gY2hhbmdpbmcuCisJCSAqLworCQlTS19JTjE2KElvQywgKEIyX01BQ18yICsgUG9ydCAqIDggKyBpICogMiksICZTV29yZCk7CisJCQorCQlYTV9PVVQxNihJb0MsIFBvcnQsIChYTV9TQSArIGkgKiAyKSwgU1dvcmQpOworCX0KKworCS8qIFR4IEludGVyIFBhY2tldCBHYXAgKFhNX1RYX0lQRyk6CXVzZSBkZWZhdWx0ICovCisJLyogVHggSGlnaCBXYXRlciBNYXJrIChYTV9UWF9ISV9XTSk6CXVzZSBkZWZhdWx0ICovCisJLyogVHggTG93IFdhdGVyIE1hcmsgKFhNX1RYX0xPX1dNKToJdXNlIGRlZmF1bHQgKi8KKwkvKiBIb3N0IFJlcXVlc3QgVGhyZXNob2xkIChYTV9IVF9USFIpOgl1c2UgZGVmYXVsdCAqLworCS8qIFJ4IFJlcXVlc3QgVGhyZXNob2xkIChYTV9SWF9USFIpOgl1c2UgZGVmYXVsdCAqLworCS8qIFJ4IExvdyBXYXRlciBNYXJrIChYTV9SWF9MT19XTSk6CXVzZSBkZWZhdWx0ICovCisKKwkvKiBjb25maWd1cmUgUnggSGlnaCBXYXRlciBNYXJrIChYTV9SWF9ISV9XTSkgKi8KKwlYTV9PVVQxNihJb0MsIFBvcnQsIFhNX1JYX0hJX1dNLCBTS19YTV9SWF9ISV9XTSk7CisKKwkvKiBDb25maWd1cmUgVHggUmVxdWVzdCBUaHJlc2hvbGQgKi8KKwlTV29yZCA9IFNLX1hNX1RIUl9TTDsJCQkJLyogZm9yIHNpbmdsZSBwb3J0ICovCisKKwlpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID4gMSkgeworCQlzd2l0Y2ggKHBBQy0+R0luaS5HSVBvcnRVc2FnZSkgeworCQljYXNlIFNLX1JFRF9MSU5LOgorCQkJU1dvcmQgPSBTS19YTV9USFJfUkVETDsJCS8qIHJlZHVuZGFudCBsaW5rICovCisJCQlicmVhazsKKwkJY2FzZSBTS19NVUxfTElOSzoKKwkJCVNXb3JkID0gU0tfWE1fVEhSX01VTEw7CQkvKiBsb2FkIGJhbGFuY2luZyAqLworCQkJYnJlYWs7CisJCWNhc2UgU0tfSlVNQk9fTElOSzoKKwkJCVNXb3JkID0gU0tfWE1fVEhSX0pVTUJPOwkvKiBqdW1ibyBmcmFtZXMgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAxNCwgU0tFUlJfSFdJX0UwMTRNU0cpOworCQkJYnJlYWs7CisJCX0KKwl9CisJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9UWF9USFIsIFNXb3JkKTsKKworCS8qIHNldHVwIHJlZ2lzdGVyIGRlZmF1bHRzIGZvciB0aGUgVHggQ29tbWFuZCBSZWdpc3RlciAqLworCVhNX09VVDE2KElvQywgUG9ydCwgWE1fVFhfQ01ELCBYTV9UWF9BVVRPX1BBRCk7CisKKwkvKiBzZXR1cCByZWdpc3RlciBkZWZhdWx0cyBmb3IgdGhlIFJ4IENvbW1hbmQgUmVnaXN0ZXIgKi8KKwlTV29yZCA9IFhNX1JYX1NUUklQX0ZDUyB8IFhNX1JYX0xFTkVSUl9PSzsKKworCWlmIChwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgPT0gU0tfSlVNQk9fTElOSykgeworCQlTV29yZCB8PSBYTV9SWF9CSUdfUEtfT0s7CisJfQorCisJaWYgKHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9IQUxGKSB7CisJCS8qCisJCSAqIElmIGluIG1hbnVhbCBoYWxmIGR1cGxleCBtb2RlIHRoZSBvdGhlciBzaWRlIG1pZ2h0IGJlIGluCisJCSAqIGZ1bGwgZHVwbGV4IG1vZGUsIHNvIGlnbm9yZSBpZiBhIGNhcnJpZXIgZXh0ZW5zaW9uIGlzIG5vdCBzZWVuCisJCSAqIG9uIGZyYW1lcyByZWNlaXZlZAorCQkgKi8KKwkJU1dvcmQgfD0gWE1fUlhfRElTX0NFWFQ7CisJfQorCQorCVhNX09VVDE2KElvQywgUG9ydCwgWE1fUlhfQ01ELCBTV29yZCk7CisKKwkvKgorCSAqIHNldHVwIHJlZ2lzdGVyIGRlZmF1bHRzIGZvciB0aGUgTW9kZSBSZWdpc3RlcgorCSAqCS0gRG9uJ3Qgc3RyaXAgZXJyb3IgZnJhbWVzIHRvIGF2b2lkIFN0b3JlICYgRm9yd2FyZAorCSAqCSAgb24gdGhlIFJ4IHNpZGUuCisJICoJLSBFbmFibGUgJ0NoZWNrIFN0YXRpb24gQWRkcmVzcycgYml0CisJICoJLSBFbmFibGUgJ0NoZWNrIEFkZHJlc3MgQXJyYXknIGJpdAorCSAqLworCVhNX09VVDMyKElvQywgUG9ydCwgWE1fTU9ERSwgWE1fREVGX01PREUpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBSZWNlaXZlIENvdW50ZXIgRXZlbnQgTWFzayAoWE1fUlhfRVZfTVNLKQorCSAqCS0gRW5hYmxlIGFsbCBiaXRzIGV4Y2VwdGluZyAnT2N0ZXRzIFJ4IE9LIExvdyBDbnRPdicKKwkgKgkgIGFuZCAnT2N0ZXRzIFJ4IE9LIEhpIENudCBPdicuCisJICovCisJWE1fT1VUMzIoSW9DLCBQb3J0LCBYTV9SWF9FVl9NU0ssIFhNUl9ERUZfTVNLKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgVHJhbnNtaXQgQ291bnRlciBFdmVudCBNYXNrIChYTV9UWF9FVl9NU0spCisJICoJLSBFbmFibGUgYWxsIGJpdHMgZXhjZXB0aW5nICdPY3RldHMgVHggT0sgTG93IENudE92JworCSAqCSAgYW5kICdPY3RldHMgVHggT0sgSGkgQ250IE92Jy4KKwkgKi8KKwlYTV9PVVQzMihJb0MsIFBvcnQsIFhNX1RYX0VWX01TSywgWE1UX0RFRl9NU0spOworCisJLyoKKwkgKiBEbyBOT1QgaW5pdCBYTUFDIGludGVycnVwdCBtYXNrIGhlcmUuCisJICogQWxsIGludGVycnVwdHMgcmVtYWluIGRpc2FibGUgdW50aWwgbGluayBjb21lcyB1cCEKKwkgKi8KKworCS8qCisJICogQW55IGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBjaGFuZ2VzIG1heSBiZSBkb25lIG5vdy4KKwkgKiBUaGUgbGFzdCBhY3Rpb24gaXMgdG8gZW5hYmxlIHRoZSBSeCBhbmQgVHggc3RhdGUgbWFjaGluZS4KKwkgKiBUaGlzIHNob3VsZCBiZSBkb25lIGFmdGVyIHRoZSBhdXRvLW5lZ290aWF0aW9uIHByb2Nlc3MKKwkgKiBoYXMgYmVlbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorCSAqLworfQkvKiBTa1htSW5pdE1hYyAqLworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKworCisjaWZkZWYgWVVLT04KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtSW5pdE1hYygpIC0gSW5pdGlhbGl6ZSB0aGUgR01BQworICoKKyAqIERlc2NyaXB0aW9uOgorICoJSW5pdGlhbGl6ZSB0aGUgR01BQyBvZiB0aGUgc3BlY2lmaWVkIHBvcnQuCisgKglUaGUgR01BQyBtdXN0IGJlIHJlc2V0IG9yIHN0b3BwZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBOb3RlOgorICoJVGhlIEdNQUMncyBSeCBhbmQgVHggc3RhdGUgbWFjaGluZSBpcyBzdGlsbCBkaXNhYmxlZCB3aGVuIHJldHVybmluZy4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR21Jbml0TWFjKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisJaW50CQkJaTsKKwlTS19VMTYJCVNXb3JkOworCVNLX1UzMgkJRFdvcmQ7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCWlmIChwUHJ0LT5QU3RhdGUgPT0gU0tfUFJUX1NUT1ApIHsKKwkJLyogUG9ydCBTdGF0ZTogU0tfUFJUX1NUT1AgKi8KKwkJLyogVmVyaWZ5IHRoYXQgdGhlIHJlc2V0IGJpdCBpcyBjbGVhcmVkICovCisJCVNLX0lOMzIoSW9DLCBNUl9BRERSKFBvcnQsIEdNQUNfQ1RSTCksICZEV29yZCk7CisJCQorCQlpZiAoKERXb3JkICYgR01DX1JTVF9TRVQpICE9IDApIHsKKwkJCS8qIFBTdGF0ZSBkb2VzIG5vdCBtYXRjaCBIVyBzdGF0ZSAqLworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAwNiwgU0tFUlJfSFdJX0UwMDZNU0cpOworCQkJLyogQ29ycmVjdCBpdCAqLworCQkJcFBydC0+UFN0YXRlID0gU0tfUFJUX1JFU0VUOworCQl9CisJfQorCisJaWYgKHBQcnQtPlBTdGF0ZSA9PSBTS19QUlRfUkVTRVQpIHsKKwkJCisJCVNrR21IYXJkUnN0KHBBQywgSW9DLCBQb3J0KTsKKworCQlTa0dtQ2xlYXJSc3QocEFDLCBJb0MsIFBvcnQpOworCQkKKwkJLyogQXV0by1uZWdvdGlhdGlvbiA/ICovCisJCWlmIChwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfSEFMRiB8fCBwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfRlVMTCkgeworCQkJLyogQXV0by1uZWdvdGlhdGlvbiBkaXNhYmxlZCAqLworCisJCQkvKiBnZXQgR2VuZXJhbCBQdXJwb3NlIENvbnRyb2wgKi8KKwkJCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9HUF9DVFJMLCAmU1dvcmQpOworCisJCQkvKiBkaXNhYmxlIGF1dG8tdXBkYXRlIGZvciBzcGVlZCwgZHVwbGV4IGFuZCBmbG93LWNvbnRyb2wgKi8KKwkJCVNXb3JkIHw9IEdNX0dQQ1JfQVVfQUxMX0RJUzsKKwkJCQorCQkJLyogc2V0dXAgR2VuZXJhbCBQdXJwb3NlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwkJCUdNX09VVDE2KElvQywgUG9ydCwgR01fR1BfQ1RSTCwgU1dvcmQpOworCQkJCisJCQlTV29yZCA9IEdNX0dQQ1JfQVVfQUxMX0RJUzsKKwkJfQorCQllbHNlIHsKKwkJCVNXb3JkID0gMDsKKwkJfQorCisJCS8qIHNwZWVkIHNldHRpbmdzICovCisJCXN3aXRjaCAocFBydC0+UExpbmtTcGVlZCkgeworCQljYXNlIFNLX0xTUEVFRF9BVVRPOgorCQljYXNlIFNLX0xTUEVFRF8xMDAwTUJQUzoKKwkJCVNXb3JkIHw9IEdNX0dQQ1JfU1BFRURfMTAwMCB8IEdNX0dQQ1JfU1BFRURfMTAwOworCQkJYnJlYWs7CisJCWNhc2UgU0tfTFNQRUVEXzEwME1CUFM6CisJCQlTV29yZCB8PSBHTV9HUENSX1NQRUVEXzEwMDsKKwkJCWJyZWFrOworCQljYXNlIFNLX0xTUEVFRF8xME1CUFM6CisJCQlicmVhazsKKwkJfQorCisJCS8qIGR1cGxleCBzZXR0aW5ncyAqLworCQlpZiAocFBydC0+UExpbmtNb2RlICE9IFNLX0xNT0RFX0hBTEYpIHsKKwkJCS8qIHNldCBmdWxsIGR1cGxleCAqLworCQkJU1dvcmQgfD0gR01fR1BDUl9EVVBfRlVMTDsKKwkJfQorCisJCS8qIGZsb3ctY29udHJvbCBzZXR0aW5ncyAqLworCQlzd2l0Y2ggKHBQcnQtPlBGbG93Q3RybE1vZGUpIHsKKwkJY2FzZSBTS19GTE9XX01PREVfTk9ORToKKwkJCS8qIHNldCBQYXVzZSBPZmYgKi8KKwkJCVNLX09VVDMyKElvQywgTVJfQUREUihQb3J0LCBHTUFDX0NUUkwpLCBHTUNfUEFVU0VfT0ZGKTsKKwkJCS8qIGRpc2FibGUgVHggJiBSeCBmbG93LWNvbnRyb2wgKi8KKwkJCVNXb3JkIHw9IEdNX0dQQ1JfRkNfVFhfRElTIHwgR01fR1BDUl9GQ19SWF9ESVMgfCBHTV9HUENSX0FVX0ZDVF9ESVM7CisJCQlicmVhazsKKwkJY2FzZSBTS19GTE9XX01PREVfTE9DX1NFTkQ6CisJCQkvKiBkaXNhYmxlIFJ4IGZsb3ctY29udHJvbCAqLworCQkJU1dvcmQgfD0gR01fR1BDUl9GQ19SWF9ESVMgfCBHTV9HUENSX0FVX0ZDVF9ESVM7CisJCQlicmVhazsKKwkJY2FzZSBTS19GTE9XX01PREVfU1lNTUVUUklDOgorCQljYXNlIFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNOgorCQkJLyogZW5hYmxlIFR4ICYgUnggZmxvdy1jb250cm9sICovCisJCQlicmVhazsKKwkJfQorCisJCS8qIHNldHVwIEdlbmVyYWwgUHVycG9zZSBDb250cm9sIFJlZ2lzdGVyICovCisJCUdNX09VVDE2KElvQywgUG9ydCwgR01fR1BfQ1RSTCwgU1dvcmQpOworCisJCS8qIGR1bW15IHJlYWQgdGhlIEludGVycnVwdCBTb3VyY2UgUmVnaXN0ZXIgKi8KKwkJU0tfSU4xNihJb0MsIEdNQUNfSVJRX1NSQywgJlNXb3JkKTsKKwkJCisjaWZuZGVmIFZDUFUKKwkJLyogcmVhZCBJZCBmcm9tIFBIWSAqLworCQlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfSUQxLCAmcFBydC0+UGh5SWQxKTsKKwkJCisJCVNrR21Jbml0UGh5TWFydihwQUMsIElvQywgUG9ydCwgU0tfRkFMU0UpOworI2VuZGlmIC8qIFZDUFUgKi8KKwl9CisKKwkodm9pZClTa0dtUmVzZXRDb3VudGVyKHBBQywgSW9DLCBQb3J0KTsKKworCS8qIHNldHVwIFRyYW5zbWl0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlHTV9PVVQxNihJb0MsIFBvcnQsIEdNX1RYX0NUUkwsIFRYX0NPTF9USFIocFBydC0+UE1hY0NvbFRocmVzKSk7CisKKwkvKiBzZXR1cCBSZWNlaXZlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlHTV9PVVQxNihJb0MsIFBvcnQsIEdNX1JYX0NUUkwsIEdNX1JYQ1JfVUNGX0VOQSB8IEdNX1JYQ1JfTUNGX0VOQSB8CisJCUdNX1JYQ1JfQ1JDX0RJUyk7CisKKwkvKiBzZXR1cCBUcmFuc21pdCBGbG93IENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlHTV9PVVQxNihJb0MsIFBvcnQsIEdNX1RYX0ZMT1dfQ1RSTCwgMHhmZmZmKTsKKworCS8qIHNldHVwIFRyYW5zbWl0IFBhcmFtZXRlciBSZWdpc3RlciAqLworI2lmZGVmIFZDUFUKKwlHTV9JTjE2KElvQywgUG9ydCwgR01fVFhfUEFSQU0sICZTV29yZCk7CisjZW5kaWYgLyogVkNQVSAqLworCisgICAgU1dvcmQgPSBUWF9KQU1fTEVOX1ZBTChwUHJ0LT5QTWFjSmFtTGVuKSB8CisJCQlUWF9KQU1fSVBHX1ZBTChwUHJ0LT5QTWFjSmFtSXBnVmFsKSB8CisJCQlUWF9JUEdfSkFNX0RBVEEocFBydC0+UE1hY0phbUlwZ0RhdGEpOworCQorCUdNX09VVDE2KElvQywgUG9ydCwgR01fVFhfUEFSQU0sIFNXb3JkKTsKKworCS8qIGNvbmZpZ3VyZSB0aGUgU2VyaWFsIE1vZGUgUmVnaXN0ZXIgKi8KKyNpZmRlZiBWQ1BVCisJR01fSU4xNihJb0MsIFBvcnQsIEdNX1NFUklBTF9NT0RFLCAmU1dvcmQpOworI2VuZGlmIC8qIFZDUFUgKi8KKwkKKwlTV29yZCA9IEdNX1NNT0RfVkxBTl9FTkEgfCBJUEdfREFUQV9WQUwocFBydC0+UE1hY0lwZ0RhdGEpOworCisJaWYgKHBQcnQtPlBNYWNMaW1pdDQpIHsKKwkJLyogcmVzZXQgb2YgY29sbGlzaW9uIGNvdW50ZXIgYWZ0ZXIgNCBjb25zZWN1dGl2ZSBjb2xsaXNpb25zICovCisJCVNXb3JkIHw9IEdNX1NNT0RfTElNSVRfNDsKKwl9CisKKwlpZiAocEFDLT5HSW5pLkdJUG9ydFVzYWdlID09IFNLX0pVTUJPX0xJTkspIHsKKwkJLyogZW5hYmxlIGp1bWJvIG1vZGUgKE1heC4gRnJhbWUgTGVuZ3RoID0gOTAxOCkgKi8KKwkJU1dvcmQgfD0gR01fU01PRF9KVU1CT19FTkE7CisJfQorCQorCUdNX09VVDE2KElvQywgUG9ydCwgR01fU0VSSUFMX01PREUsIFNXb3JkKTsKKwkKKwkvKgorCSAqIGNvbmZpZ3VyZSB0aGUgR01BQ3MgU3RhdGlvbiBBZGRyZXNzZXMKKwkgKiBpbiBQUk9NIHlvdSBjYW4gZmluZCBvdXIgYWRkcmVzc2VzIGF0OgorCSAqIEIyX01BQ18xID0geHggeHggeHggeHggeHggeDAgdmlydHVhbCBhZGRyZXNzCisJICogQjJfTUFDXzIgPSB4eCB4eCB4eCB4eCB4eCB4MSBpcyBwcm9ncmFtbWVkIHRvIEdNQUMgQQorCSAqIEIyX01BQ18zID0geHggeHggeHggeHggeHggeDIgaXMgcmVzZXJ2ZWQgZm9yIER1YWxQb3J0CisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCS8qCisJCSAqIFRoZSBmb2xsb3dpbmcgMiBzdGF0ZW1lbnRzIGFyZSB0b2dldGhlciBlbmRpYW5lc3MKKwkJICogaW5kZXBlbmRlbnQuIFJlbWVtYmVyIHRoaXMgd2hlbiBjaGFuZ2luZy4KKwkJICovCisJCS8qIHBoeXNpY2FsIGFkZHJlc3M6IHdpbGwgYmUgdXNlZCBmb3IgcGF1c2UgZnJhbWVzICovCisJCVNLX0lOMTYoSW9DLCAoQjJfTUFDXzIgKyBQb3J0ICogOCArIGkgKiAyKSwgJlNXb3JkKTsKKworI2lmZGVmIFdBX0RFVl8xNgorCQkvKiBXQSBmb3IgZGV2aWF0aW9uICMxNiAqLworCQlpZiAocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04gJiYgcEFDLT5HSW5pLkdJQ2hpcFJldiA9PSAwKSB7CisJCQkvKiBzd2FwIHRoZSBhZGRyZXNzIGJ5dGVzICovCisJCQlTV29yZCA9ICgoU1dvcmQgJiAweGZmMDApID4+IDgpCXwgKChTV29yZCAmIDB4MDBmZikgPDwgOCk7CisKKwkJCS8qIHdyaXRlIHRvIHJlZ2lzdGVyIGluIHJldmVyc2VkIG9yZGVyICovCisJCQlHTV9PVVQxNihJb0MsIFBvcnQsIChHTV9TUkNfQUREUl8xTCArICgyIC0gaSkgKiA0KSwgU1dvcmQpOworCQl9CisJCWVsc2UgeworCQkJR01fT1VUMTYoSW9DLCBQb3J0LCAoR01fU1JDX0FERFJfMUwgKyBpICogNCksIFNXb3JkKTsKKwkJfQorI2Vsc2UJCQorCQlHTV9PVVQxNihJb0MsIFBvcnQsIChHTV9TUkNfQUREUl8xTCArIGkgKiA0KSwgU1dvcmQpOworI2VuZGlmIC8qIFdBX0RFVl8xNiAqLworCQkKKwkJLyogdmlydHVhbCBhZGRyZXNzOiB3aWxsIGJlIHVzZWQgZm9yIGRhdGEgKi8KKwkJU0tfSU4xNihJb0MsIChCMl9NQUNfMSArIFBvcnQgKiA4ICsgaSAqIDIpLCAmU1dvcmQpOworCisJCUdNX09VVDE2KElvQywgUG9ydCwgKEdNX1NSQ19BRERSXzJMICsgaSAqIDQpLCBTV29yZCk7CisJCQorCQkvKiByZXNldCBNdWx0aWNhc3QgZmlsdGVyaW5nIEhhc2ggcmVnaXN0ZXJzIDEtMyAqLworCQlHTV9PVVQxNihJb0MsIFBvcnQsIEdNX01DX0FERFJfSDEgKyA0KmksIDApOworCX0KKworCS8qIHJlc2V0IE11bHRpY2FzdCBmaWx0ZXJpbmcgSGFzaCByZWdpc3RlciA0ICovCisJR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9NQ19BRERSX0g0LCAwKTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHQgbWFzayBmb3IgY291bnRlciBvdmVyZmxvd3MgKi8KKwlHTV9PVVQxNihJb0MsIFBvcnQsIEdNX1RYX0lSUV9NU0ssIDApOworCUdNX09VVDE2KElvQywgUG9ydCwgR01fUlhfSVJRX01TSywgMCk7CisJR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9UUl9JUlFfTVNLLCAwKTsKKworI2lmIGRlZmluZWQoU0tfRElBRykgfHwgZGVmaW5lZChERUJVRykKKwkvKiByZWFkIEdlbmVyYWwgUHVycG9zZSBTdGF0dXMgKi8KKwlHTV9JTjE2KElvQywgUG9ydCwgR01fR1BfU1RBVCwgJlNXb3JkKTsKKwkKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiTUFDIFN0YXQgUmVnLj0weCUwNFhcbiIsIFNXb3JkKSk7CisjZW5kaWYgLyogU0tfRElBRyB8fCBERUJVRyAqLworCisjaWZkZWYgU0tfRElBRworCWNfcHJpbnQoIk1BQyBTdGF0IFJlZz0weCUwNFhcbiIsIFNXb3JkKTsKKyNlbmRpZiAvKiBTS19ESUFHICovCisKK30JLyogU2tHbUluaXRNYWMgKi8KKyNlbmRpZiAvKiBZVUtPTiAqLworCisKKyNpZmRlZiBHRU5FU0lTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbUluaXREdXBNZCgpIC0gSW5pdGlhbGl6ZSB0aGUgWE1BQ3MgRHVwbGV4IE1vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFhNQUNzIER1cGxleCBNb2RlLgorICoJSXQgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdWNjZXNzZnVsbHkgZmluaXNoaW5nCisgKgl0aGUgQXV0by1uZWdvdGlhdGlvbiBQcm9jZXNzCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa1htSW5pdER1cE1kKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlzd2l0Y2ggKHBBQy0+R0luaS5HUFtQb3J0XS5QTGlua01vZGVTdGF0dXMpIHsKKwljYXNlIFNLX0xNT0RFX1NUQVRfQVVUT0hBTEY6CisJY2FzZSBTS19MTU9ERV9TVEFUX0hBTEY6CisJCS8qIENvbmZpZ3VyYXRpb24gQWN0aW9ucyBmb3IgSGFsZiBEdXBsZXggTW9kZSAqLworCQkvKgorCQkgKiBYTV9CVVJTVCA9IGRlZmF1bHQgdmFsdWUuIFdlIGFyZSBwcm9iYWJsZSBub3QgcXVpY2sKKwkJICogCWVub3VnaCBhdCB0aGUgJ1hNQUMnIGJ1cyB0byBidXJzdCA4a0IuCisJCSAqCVRoZSBYTUFDIHN0b3BzIGJ1cnN0aW5nIGlmIG5vIHRyYW5zbWl0IGZyYW1lcworCQkgKglhcmUgYXZhaWxhYmxlIG9yIHRoZSBidXJzdCBsaW1pdCBpcyBleGNlZWRlZC4KKwkJICovCisJCS8qIFhNX1RYX1JUX0xJTSA9IGRlZmF1bHQgdmFsdWUgKDE1KSAqLworCQkvKiBYTV9UWF9TVElNRSA9IGRlZmF1bHQgdmFsdWUgKDB4ZmYgPSA0MDk2IGJpdCB0aW1lcykgKi8KKwkJYnJlYWs7CisJY2FzZSBTS19MTU9ERV9TVEFUX0FVVE9GVUxMOgorCWNhc2UgU0tfTE1PREVfU1RBVF9GVUxMOgorCQkvKiBDb25maWd1cmF0aW9uIEFjdGlvbnMgZm9yIEZ1bGwgRHVwbGV4IE1vZGUgKi8KKwkJLyoKKwkJICogVGhlIGR1cGxleCBtb2RlIGlzIGNvbmZpZ3VyZWQgYnkgdGhlIFBIWSwKKwkJICogdGhlcmVmb3JlIGl0IHNlZW1zIHRvIGJlIHRoYXQgdGhlcmUgaXMgbm90aGluZworCQkgKiB0byBkbyBoZXJlLgorCQkgKi8KKwkJYnJlYWs7CisJY2FzZSBTS19MTU9ERV9TVEFUX1VOS05PV046CisJZGVmYXVsdDoKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAwNywgU0tFUlJfSFdJX0UwMDdNU0cpOworCQlicmVhazsKKwl9Cit9CS8qIFNrWG1Jbml0RHVwTWQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbUluaXRQYXVzZU1kKCkgLSBpbml0aWFsaXplIHRoZSBQYXVzZSBNb2RlIHRvIGJlIHVzZWQgZm9yIHRoaXMgcG9ydAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgUGF1c2UgTW9kZSB3aGljaCBzaG91bGQKKyAqCWJlIHVzZWQgZm9yIHRoaXMgcG9ydC4KKyAqCUl0IHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgc3VjY2Vzc2Z1bGx5IGZpbmlzaGluZworICoJdGhlIEF1dG8tbmVnb3RpYXRpb24gUHJvY2VzcworICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tYbUluaXRQYXVzZU1kKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisJU0tfVTMyCQlEV29yZDsKKwlTS19VMTYJCVdvcmQ7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9NTVVfQ01ELCAmV29yZCk7CisJCisJaWYgKHBQcnQtPlBGbG93Q3RybFN0YXR1cyA9PSBTS19GTE9XX1NUQVRfTk9ORSB8fAorCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPT0gU0tfRkxPV19TVEFUX0xPQ19TRU5EKSB7CisKKwkJLyogRGlzYWJsZSBQYXVzZSBGcmFtZSBSZWNlcHRpb24gKi8KKwkJV29yZCB8PSBYTV9NTVVfSUdOX1BGOworCX0KKwllbHNlIHsKKwkJLyoKKwkJICogZW5hYmxpbmcgcGF1c2UgZnJhbWUgcmVjZXB0aW9uIGlzIHJlcXVpcmVkIGZvciAxMDAwQlQKKwkJICogYmVjYXVzZSB0aGUgWE1BQyBpcyBub3QgcmVzZXQgaWYgdGhlIGxpbmsgaXMgZ29pbmcgZG93bgorCQkgKi8KKwkJLyogRW5hYmxlIFBhdXNlIEZyYW1lIFJlY2VwdGlvbiAqLworCQlXb3JkICY9IH5YTV9NTVVfSUdOX1BGOworCX0JCisJCisJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9NTVVfQ01ELCBXb3JkKTsKKworCVhNX0lOMzIoSW9DLCBQb3J0LCBYTV9NT0RFLCAmRFdvcmQpOworCisJaWYgKHBQcnQtPlBGbG93Q3RybFN0YXR1cyA9PSBTS19GTE9XX1NUQVRfU1lNTUVUUklDIHx8CisJCXBQcnQtPlBGbG93Q3RybFN0YXR1cyA9PSBTS19GTE9XX1NUQVRfTE9DX1NFTkQpIHsKKworCQkvKgorCQkgKiBDb25maWd1cmUgUGF1c2UgRnJhbWUgR2VuZXJhdGlvbgorCQkgKiBVc2UgaW50ZXJuYWwgYW5kIGV4dGVybmFsIFBhdXNlIEZyYW1lIEdlbmVyYXRpb24uCisJCSAqIFNlbmRpbmcgcGF1c2UgZnJhbWVzIGlzIGVkZ2UgdHJpZ2dlcmVkLgorCQkgKiBTZW5kIGEgUGF1c2UgZnJhbWUgd2l0aCB0aGUgbWF4aW11bSBwYXVzZSB0aW1lIGlmCisJCSAqIGludGVybmFsIG9kZXIgZXh0ZXJuYWwgRklGTyBmdWxsIGNvbmRpdGlvbiBvY2N1cnMuCisJCSAqIFNlbmQgYSB6ZXJvIHBhdXNlIHRpbWUgZnJhbWUgdG8gcmUtc3RhcnQgdHJhbnNtaXNzaW9uLgorCQkgKi8KKworCQkvKiBYTV9QQVVTRV9EQSA9ICcwMTAwMDBDMjgwMDEnIChkZWZhdWx0KSAqLworCisJCS8qIFhNX01BQ19QVElNRSA9IDB4ZmZmZiAobWF4aW11bSkgKi8KKwkJLyogcmVtZW1iZXIgdGhpcyB2YWx1ZSBpcyBkZWZpbmVkIGluIGJpZyBlbmRpYW4gKCEpICovCisJCVhNX09VVDE2KElvQywgUG9ydCwgWE1fTUFDX1BUSU1FLCAweGZmZmYpOworCisJCS8qIFNldCBQYXVzZSBNb2RlIGluIE1vZGUgUmVnaXN0ZXIgKi8KKwkJRFdvcmQgfD0gWE1fUEFVU0VfTU9ERTsKKworCQkvKiBTZXQgUGF1c2UgTW9kZSBpbiBNQUMgUnggRklGTyAqLworCQlTS19PVVQxNihJb0MsIE1SX0FERFIoUG9ydCwgUlhfTUZGX0NUUkwxKSwgTUZGX0VOQV9QQVVTRSk7CisJfQorCWVsc2UgeworCQkvKgorCQkgKiBkaXNhYmxlIHBhdXNlIGZyYW1lIGdlbmVyYXRpb24gaXMgcmVxdWlyZWQgZm9yIDEwMDBCVAorCQkgKiBiZWNhdXNlIHRoZSBYTUFDIGlzIG5vdCByZXNldCBpZiB0aGUgbGluayBpcyBnb2luZyBkb3duCisJCSAqLworCQkvKiBEaXNhYmxlIFBhdXNlIE1vZGUgaW4gTW9kZSBSZWdpc3RlciAqLworCQlEV29yZCAmPSB+WE1fUEFVU0VfTU9ERTsKKworCQkvKiBEaXNhYmxlIFBhdXNlIE1vZGUgaW4gTUFDIFJ4IEZJRk8gKi8KKwkJU0tfT1VUMTYoSW9DLCBNUl9BRERSKFBvcnQsIFJYX01GRl9DVFJMMSksIE1GRl9ESVNfUEFVU0UpOworCX0KKwkKKwlYTV9PVVQzMihJb0MsIFBvcnQsIFhNX01PREUsIERXb3JkKTsKK30JLyogU2tYbUluaXRQYXVzZU1kKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbUluaXRQaHlYbWFjKCkgLSBJbml0aWFsaXplIHRoZSBYTUFDIFBoeSByZWdpc3RlcnMKKyAqCisgKiBEZXNjcmlwdGlvbjoJaW5pdGlhbGl6ZXMgYWxsIHRoZSBYTUFDcyBQaHkgcmVnaXN0ZXJzCisgKgorICogTm90ZToKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa1htSW5pdFBoeVhtYWMoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfQk9PTAlEb0xvb3ApCQkvKiBTaG91bGQgYSBQaHkgTG9vcEJhY2sgYmUgc2V0LXVwPyAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19VMTYJCUN0cmw7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKwlDdHJsID0gMDsKKwkKKwkvKiBBdXRvLW5lZ290aWF0aW9uID8gKi8KKwlpZiAocFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0hBTEYgfHwgcFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0ZVTEwpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJJbml0UGh5WG1hYzogbm8gYXV0by1uZWdvdGlhdGlvbiBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCS8qIFNldCBEdXBsZXhNb2RlIGluIENvbmZpZyByZWdpc3RlciAqLworCQlpZiAocFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0ZVTEwpIHsKKwkJCUN0cmwgfD0gUEhZX0NUX0RVUF9NRDsKKwkJfQorCisJCS8qCisJCSAqIERvIE5PVCBlbmFibGUgQXV0by1uZWdvdGlhdGlvbiBoZXJlLiBUaGlzIHdvdWxkIGhvbGQKKwkJICogdGhlIGxpbmsgZG93biBiZWNhdXNlIG5vIElETEVzIGFyZSB0cmFuc21pdHRlZAorCQkgKi8KKwl9CisJZWxzZSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiSW5pdFBoeVhtYWM6IHdpdGggYXV0by1uZWdvdGlhdGlvbiBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCS8qIFNldCBBdXRvLW5lZ290aWF0aW9uIGFkdmVydGlzZW1lbnQgKi8KKworCQkvKiBTZXQgRnVsbC9oYWxmIGR1cGxleCBjYXBhYmlsaXRpZXMgKi8KKwkJc3dpdGNoIChwUHJ0LT5QTGlua01vZGUpIHsKKwkJY2FzZSBTS19MTU9ERV9BVVRPSEFMRjoKKwkJCUN0cmwgfD0gUEhZX1hfQU5fSEQ7CisJCQlicmVhazsKKwkJY2FzZSBTS19MTU9ERV9BVVRPRlVMTDoKKwkJCUN0cmwgfD0gUEhZX1hfQU5fRkQ7CisJCQlicmVhazsKKwkJY2FzZSBTS19MTU9ERV9BVVRPQk9USDoKKwkJCUN0cmwgfD0gUEhZX1hfQU5fRkQgfCBQSFlfWF9BTl9IRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfSFdJX0UwMTUsCisJCQkJU0tFUlJfSFdJX0UwMTVNU0cpOworCQl9CisKKwkJLyogU2V0IEZsb3ctY29udHJvbCBjYXBhYmlsaXRpZXMgKi8KKwkJc3dpdGNoIChwUHJ0LT5QRmxvd0N0cmxNb2RlKSB7CisJCWNhc2UgU0tfRkxPV19NT0RFX05PTkU6CisJCQlDdHJsIHw9IFBIWV9YX1BfTk9fUEFVU0U7CisJCQlicmVhazsKKwkJY2FzZSBTS19GTE9XX01PREVfTE9DX1NFTkQ6CisJCQlDdHJsIHw9IFBIWV9YX1BfQVNZTV9NRDsKKwkJCWJyZWFrOworCQljYXNlIFNLX0ZMT1dfTU9ERV9TWU1NRVRSSUM6CisJCQlDdHJsIHw9IFBIWV9YX1BfU1lNX01EOworCQkJYnJlYWs7CisJCWNhc2UgU0tfRkxPV19NT0RFX1NZTV9PUl9SRU06CisJCQlDdHJsIHw9IFBIWV9YX1BfQk9USF9NRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfSFdJX0UwMTYsCisJCQkJU0tFUlJfSFdJX0UwMTZNU0cpOworCQl9CisKKwkJLyogV3JpdGUgQXV0b05lZyBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyICovCisJCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX1hNQUNfQVVORV9BRFYsIEN0cmwpOworCisJCS8qIFJlc3RhcnQgQXV0by1uZWdvdGlhdGlvbiAqLworCQlDdHJsID0gUEhZX0NUX0FORSB8IFBIWV9DVF9SRV9DRkc7CisJfQorCisJaWYgKERvTG9vcCkgeworCQkvKiBTZXQgdGhlIFBoeSBMb29wYmFjayBiaXQsIHRvbyAqLworCQlDdHJsIHw9IFBIWV9DVF9MT09QOworCX0KKworCS8qIFdyaXRlIHRvIHRoZSBQaHkgY29udHJvbCByZWdpc3RlciAqLworCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX1hNQUNfQ1RSTCwgQ3RybCk7Cit9CS8qIFNrWG1Jbml0UGh5WG1hYyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htSW5pdFBoeUJjb20oKSAtIEluaXRpYWxpemUgdGhlIEJyb2FkY29tIFBoeSByZWdpc3RlcnMKKyAqCisgKiBEZXNjcmlwdGlvbjoJaW5pdGlhbGl6ZXMgYWxsIHRoZSBCcm9hZGNvbSBQaHkgcmVnaXN0ZXJzCisgKgorICogTm90ZToKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa1htSW5pdFBoeUJjb20oCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfQk9PTAlEb0xvb3ApCQkvKiBTaG91bGQgYSBQaHkgTG9vcEJhY2sgYmUgc2V0LXVwPyAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19VMTYJCUN0cmwxOworCVNLX1UxNgkJQ3RybDI7CisJU0tfVTE2CQlDdHJsMzsKKwlTS19VMTYJCUN0cmw0OworCVNLX1UxNgkJQ3RybDU7CisKKwlDdHJsMSA9IFBIWV9DVF9TUDEwMDA7CisJQ3RybDIgPSAwOworCUN0cmwzID0gUEhZX1NFTF9UWVBFOworCUN0cmw0ID0gUEhZX0JfUEVDX0VOX0xUUjsKKwlDdHJsNSA9IFBIWV9CX0FDX1RYX1RTVDsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJLyogbWFudWFsbHkgTWFzdGVyL1NsYXZlID8gKi8KKwlpZiAocFBydC0+UE1TTW9kZSAhPSBTS19NU19NT0RFX0FVVE8pIHsKKwkJQ3RybDIgfD0gUEhZX0JfMTAwMENfTVNFOworCQkKKwkJaWYgKHBQcnQtPlBNU01vZGUgPT0gU0tfTVNfTU9ERV9NQVNURVIpIHsKKwkJCUN0cmwyIHw9IFBIWV9CXzEwMDBDX01TQzsKKwkJfQorCX0KKwkvKiBBdXRvLW5lZ290aWF0aW9uID8gKi8KKwlpZiAocFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0hBTEYgfHwgcFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0ZVTEwpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJJbml0UGh5QmNvbTogbm8gYXV0by1uZWdvdGlhdGlvbiBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCS8qIFNldCBEdXBsZXhNb2RlIGluIENvbmZpZyByZWdpc3RlciAqLworCQlpZiAocFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0ZVTEwpIHsKKwkJCUN0cmwxIHw9IFBIWV9DVF9EVVBfTUQ7CisJCX0KKworCQkvKiBEZXRlcm1pbmUgTWFzdGVyL1NsYXZlIG1hbnVhbGx5IGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KKwkJaWYgKHBQcnQtPlBNU01vZGUgPT0gU0tfTVNfTU9ERV9BVVRPKSB7CisJCQlDdHJsMiB8PSBQSFlfQl8xMDAwQ19NU0U7CS8qIHNldCBpdCB0byBTbGF2ZSAqLworCQl9CisKKwkJLyoKKwkJICogRG8gTk9UIGVuYWJsZSBBdXRvLW5lZ290aWF0aW9uIGhlcmUuIFRoaXMgd291bGQgaG9sZAorCQkgKiB0aGUgbGluayBkb3duIGJlY2F1c2Ugbm8gSURMRVMgYXJlIHRyYW5zbWl0dGVkCisJCSAqLworCX0KKwllbHNlIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJJbml0UGh5QmNvbTogd2l0aCBhdXRvLW5lZ290aWF0aW9uIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJLyogU2V0IEF1dG8tbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudCAqLworCisJCS8qCisJCSAqIFdvcmthcm91bmQgQkNPTSBFcnJhdGEgIzEgZm9yIHRoZSBDNSB0eXBlLgorCQkgKiAxMDAwQmFzZS1UIExpbmsgQWNxdWlzaXRpb24gRmFpbHVyZSBpbiBTbGF2ZSBNb2RlCisJCSAqIFNldCBSZXBlYXRlci9EVEUgYml0IDEwIG9mIHRoZSAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIKKwkJICovCisJCUN0cmwyIHw9IFBIWV9CXzEwMDBDX1JEOworCQkKKwkJIC8qIFNldCBGdWxsL2hhbGYgZHVwbGV4IGNhcGFiaWxpdGllcyAqLworCQlzd2l0Y2ggKHBQcnQtPlBMaW5rTW9kZSkgeworCQljYXNlIFNLX0xNT0RFX0FVVE9IQUxGOgorCQkJQ3RybDIgfD0gUEhZX0JfMTAwMENfQUhEOworCQkJYnJlYWs7CisJCWNhc2UgU0tfTE1PREVfQVVUT0ZVTEw6CisJCQlDdHJsMiB8PSBQSFlfQl8xMDAwQ19BRkQ7CisJCQlicmVhazsKKwkJY2FzZSBTS19MTU9ERV9BVVRPQk9USDoKKwkJCUN0cmwyIHw9IFBIWV9CXzEwMDBDX0FGRCB8IFBIWV9CXzEwMDBDX0FIRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfSFdJX0UwMTUsCisJCQkJU0tFUlJfSFdJX0UwMTVNU0cpOworCQl9CisKKwkJLyogU2V0IEZsb3ctY29udHJvbCBjYXBhYmlsaXRpZXMgKi8KKwkJc3dpdGNoIChwUHJ0LT5QRmxvd0N0cmxNb2RlKSB7CisJCWNhc2UgU0tfRkxPV19NT0RFX05PTkU6CisJCQlDdHJsMyB8PSBQSFlfQl9QX05PX1BBVVNFOworCQkJYnJlYWs7CisJCWNhc2UgU0tfRkxPV19NT0RFX0xPQ19TRU5EOgorCQkJQ3RybDMgfD0gUEhZX0JfUF9BU1lNX01EOworCQkJYnJlYWs7CisJCWNhc2UgU0tfRkxPV19NT0RFX1NZTU1FVFJJQzoKKwkJCUN0cmwzIHw9IFBIWV9CX1BfU1lNX01EOworCQkJYnJlYWs7CisJCWNhc2UgU0tfRkxPV19NT0RFX1NZTV9PUl9SRU06CisJCQlDdHJsMyB8PSBQSFlfQl9QX0JPVEhfTUQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX0hXSV9FMDE2LAorCQkJCVNLRVJSX0hXSV9FMDE2TVNHKTsKKwkJfQorCisJCS8qIFJlc3RhcnQgQXV0by1uZWdvdGlhdGlvbiAqLworCQlDdHJsMSB8PSBQSFlfQ1RfQU5FIHwgUEhZX0NUX1JFX0NGRzsKKwl9CisJCisJLyogSW5pdGlhbGl6ZSBMRUQgcmVnaXN0ZXIgaGVyZT8gKi8KKwkvKiBOby4gUGxlYXNlIGRvIGl0IGluIFNrRGdYbWl0TGVkKCkgKGlmIHJlcXVpcmVkKSBhbmQgc3dhcAorCSAgIGluaXQgb3JkZXIgb2YgTEVEcyBhbmQgWE1BQy4gKE1BbCkgKi8KKwkKKwkvKiBXcml0ZSAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NXzEwMDBUX0NUUkwsIEN0cmwyKTsKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU2V0IDEwMDBCLVQgQ3RybCBSZWc9MHglMDRYXG4iLCBDdHJsMikpOworCQorCS8qIFdyaXRlIEF1dG9OZWcgQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAqLworCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVORV9BRFYsIEN0cmwzKTsKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU2V0IEF1dG8tTmVnLkFkdi5SZWc9MHglMDRYXG4iLCBDdHJsMykpOworCQorCWlmIChEb0xvb3ApIHsKKwkJLyogU2V0IHRoZSBQaHkgTG9vcGJhY2sgYml0LCB0b28gKi8KKwkJQ3RybDEgfD0gUEhZX0NUX0xPT1A7CisJfQorCisJaWYgKHBBQy0+R0luaS5HSVBvcnRVc2FnZSA9PSBTS19KVU1CT19MSU5LKSB7CisJCS8qIGNvbmZpZ3VyZSBGSUZPIHRvIGhpZ2ggbGF0ZW5jeSBmb3IgdHJhbnNtaXNzaW9uIG9mIGV4dC4gcGFja2V0cyAqLworCQlDdHJsNCB8PSBQSFlfQl9QRUNfSElHSF9MQTsKKworCQkvKiBjb25maWd1cmUgcmVjZXB0aW9uIG9mIGV4dGVuZGVkIHBhY2tldHMgKi8KKwkJQ3RybDUgfD0gUEhZX0JfQUNfTE9OR19QQUNLOworCisJCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVYX0NUUkwsIEN0cmw1KTsKKwl9CisKKwkvKiBDb25maWd1cmUgTEVEIFRyYWZmaWMgTW9kZSBhbmQgSnVtYm8gRnJhbWUgdXNhZ2UgaWYgc3BlY2lmaWVkICovCisJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9QX0VYVF9DVFJMLCBDdHJsNCk7CisJCisJLyogV3JpdGUgdG8gdGhlIFBoeSBjb250cm9sIHJlZ2lzdGVyICovCisJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9DVFJMLCBDdHJsMSk7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIlBIWSBDb250cm9sIFJlZz0weCUwNFhcbiIsIEN0cmwxKSk7Cit9CS8qIFNrWG1Jbml0UGh5QmNvbSAqLworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKworCisjaWZkZWYgWVVLT04KKyNpZm5kZWYgU0tfU0xJTQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR21FbnRlckxvd1Bvd2VyTW9kZSgpCisgKgorICogRGVzY3JpcHRpb246CQorICoJVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBNYXJ2ZWxsIEFsYXNrYSBQSFkgdG8gdGhlIGxvdyBwb3dlciBtb2RlCisgKglnaXZlbiBieSBwYXJhbWV0ZXIgbW9kZS4KKyAqCVRoZSBmb2xsb3dpbmcgbG93IHBvd2VyIG1vZGVzIGFyZSBhdmFpbGFibGU6CisgKgkJCisgKgkJLSBDb21hIE1vZGUgKERlZXAgU2xlZXApOgorICoJCQlQb3dlciBjb25zdW1wdGlvbjogfjE1IC0gMzAgbVcKKyAqCQkJVGhlIFBIWSBjYW5ub3Qgd2FrZSB1cCBvbiBpdHMgb3duLgorICoKKyAqCQktIElFRUUgMjIuMi40LjEuNSBjb21wYXRpYmxlIHBvd2VyIGRvd24gbW9kZQorICoJCQlQb3dlciBjb25zdW1wdGlvbjogfjI0MCBtVworICoJCQlUaGUgUEhZIGNhbm5vdCB3YWtlIHVwIG9uIGl0cyBvd24uCisgKgorICoJCS0gZW5lcmd5IGRldGVjdCBtb2RlCisgKgkJCVBvd2VyIGNvbnN1bXB0aW9uOiB+MTYwIG1XCisgKgkJCVRoZSBQSFkgY2FuIHdha2UgdXAgb24gaXRzIG93biBieSBkZXRlY3RpbmcgYWN0aXZpdHkKKyAqCQkJb24gdGhlIENBVCA1IGNhYmxlLgorICoKKyAqCQktIGVuZXJneSBkZXRlY3QgcGx1cyBtb2RlCisgKgkJCVBvd2VyIGNvbnN1bXB0aW9uOiB+MTUwIG1XCisgKgkJCVRoZSBQSFkgY2FuIHdha2UgdXAgb24gaXRzIG93biBieSBkZXRlY3RpbmcgYWN0aXZpdHkKKyAqCQkJb24gdGhlIENBVCA1IGNhYmxlLgorICoJCQlDb25uZWN0ZWQgZGV2aWNlcyBjYW4gYmUgd29rZW4gdXAgYnkgc2VuZGluZyBub3JtYWwgbGluaworICoJCQlwdWxzZXMgZXZlcnkgb25lIHNlY29uZC4KKyAqCisgKiBOb3RlOgorICoKKyAqIFJldHVybnM6CisgKgkJMDogb2sKKyAqCQkxOiBlcnJvcgorICovCitpbnQgU2tHbUVudGVyTG93UG93ZXJNb2RlKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKGUuZy4gTUFDXzEpICovCitTS19VOAlNb2RlKQkJLyogbG93IHBvd2VyIG1vZGUgKi8KK3sKKwlTS19VMTYJV29yZDsKKwlTS19VMzIJRFdvcmQ7CisJU0tfVTgJTGFzdE1vZGU7CisJaW50CQlSZXQgPSAwOworCisJaWYgKHBBQy0+R0luaS5HSVl1a29uTGl0ZSAmJgorCSAgICBwQUMtPkdJbmkuR0lDaGlwUmV2ID09IENISVBfUkVWX1lVX0xJVEVfQTMpIHsKKworCQkvKiBzYXZlIGN1cnJlbnQgcG93ZXIgbW9kZSAqLworCQlMYXN0TW9kZSA9IHBBQy0+R0luaS5HUFtQb3J0XS5QUGh5UG93ZXJTdGF0ZTsKKwkJcEFDLT5HSW5pLkdQW1BvcnRdLlBQaHlQb3dlclN0YXRlID0gTW9kZTsKKworCQlzd2l0Y2ggKE1vZGUpIHsKKwkJCS8qIGNvbWEgbW9kZSAoZGVlcCBzbGVlcCkgKi8KKwkJCWNhc2UgUEhZX1BNX0RFRVBfU0xFRVA6CisJCQkJLyogc2V0dXAgR2VuZXJhbCBQdXJwb3NlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwkJCQlHTV9PVVQxNihJb0MsIDAsIEdNX0dQX0NUUkwsIEdNX0dQQ1JfRkxfUEFTUyB8CisJCQkJCUdNX0dQQ1JfU1BFRURfMTAwIHwgR01fR1BDUl9BVV9BTExfRElTKTsKKworCQkJCS8qIGFwcGx5IENPTUEgbW9kZSB3b3JrYXJvdW5kICovCisJCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCAyOSwgMHgwMDFmKTsKKwkJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIDMwLCAweGZmZjMpOworCisJCQkJU0tfSU4zMihJb0MsIFBDSV9DKFBDSV9PVVJfUkVHXzEpLCAmRFdvcmQpOworCisJCQkJU0tfT1VUOChJb0MsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7CisJCQkJCisJCQkJLyogU2V0IFBIWSB0byBDb21hIE1vZGUgKi8KKwkJCQlTS19PVVQzMihJb0MsIFBDSV9DKFBDSV9PVVJfUkVHXzEpLCBEV29yZCB8IFBDSV9QSFlfQ09NQSk7CisJCQkJCisJCQkJU0tfT1VUOChJb0MsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PRkYpOworCisJCQlicmVhazsKKwkJCQorCQkJLyogSUVFRSAyMi4yLjQuMS41IGNvbXBhdGlibGUgcG93ZXIgZG93biBtb2RlICovCisJCQljYXNlIFBIWV9QTV9JRUVFX1BPV0VSX0RPV046CisJCQkJLyoKKwkJCQkgKiAtIGRpc2FibGUgTUFDIDEyNSBNSHogY2xvY2sKKwkJCQkgKiAtIGFsbG93IE1BQyBwb3dlciBkb3duCisJCQkJICovCisJCQkJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1BIWV9DVFJMLCAmV29yZCk7CisJCQkJV29yZCB8PSBQSFlfTV9QQ19ESVNfMTI1Q0xLOworCQkJCVdvcmQgJj0JflBIWV9NX1BDX01BQ19QT1dfVVA7CisJCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwgV29yZCk7CisKKwkJCQkvKgorCQkJCSAqIHJlZ2lzdGVyIGNoYW5nZXMgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNvZnR3YXJlCisJCQkJICogcmVzZXQgdG8gdGFrZSBlZmZlY3QKKwkJCQkgKi8KKwkJCQlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfQ1RSTCwgJldvcmQpOworCQkJCVdvcmQgfD0gUEhZX0NUX1JFU0VUOworCQkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfQ1RSTCwgV29yZCk7CisKKwkJCQkvKiBzd2l0Y2ggSUVFRSBjb21wYXRpYmxlIHBvd2VyIGRvd24gbW9kZSBvbiAqLworCQkJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9DVFJMLCAmV29yZCk7CisJCQkJV29yZCB8PSBQSFlfQ1RfUERPV047CisJCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9DVFJMLCBXb3JkKTsKKwkJCWJyZWFrOworCisJCQkvKiBlbmVyZ3kgZGV0ZWN0IGFuZCBlbmVyZ3kgZGV0ZWN0IHBsdXMgbW9kZSAqLworCQkJY2FzZSBQSFlfUE1fRU5FUkdZX0RFVEVDVDoKKwkJCWNhc2UgUEhZX1BNX0VORVJHWV9ERVRFQ1RfUExVUzoKKwkJCQkvKgorCQkJCSAqIC0gZGlzYWJsZSBNQUMgMTI1IE1IeiBjbG9jaworCQkJCSAqLworCQkJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwgJldvcmQpOworCQkJCVdvcmQgfD0gUEhZX01fUENfRElTXzEyNUNMSzsKKwkJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1BIWV9DVFJMLCBXb3JkKTsKKwkJCQkKKwkJCQkvKiBhY3RpdmF0ZSBlbmVyZ3kgZGV0ZWN0IG1vZGUgMSAqLworCQkJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwgJldvcmQpOworCisJCQkJLyogZW5lcmd5IGRldGVjdCBtb2RlICovCisJCQkJaWYgKE1vZGUgPT0gUEhZX1BNX0VORVJHWV9ERVRFQ1QpIHsKKwkJCQkJV29yZCB8PSBQSFlfTV9QQ19FTl9ERVQ7CisJCQkJfQorCQkJCS8qIGVuZXJneSBkZXRlY3QgcGx1cyBtb2RlICovCisJCQkJZWxzZSB7CisJCQkJCVdvcmQgfD0gUEhZX01fUENfRU5fREVUX1BMVVM7CisJCQkJfQorCisJCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwgV29yZCk7CisKKwkJCQkvKgorCQkJCSAqIHJlaW5pdGlhbGl6ZSB0aGUgUEhZIHRvIGZvcmNlIGEgc29mdHdhcmUgcmVzZXQKKwkJCQkgKiB3aGljaCBpcyBuZWNlc3NhcnkgYWZ0ZXIgdGhlIHJlZ2lzdGVyIHNldHRpbmdzCisJCQkJICogZm9yIHRoZSBlbmVyZ3kgZGV0ZWN0IG1vZGVzLgorCQkJCSAqIEZ1cnRoZXJtb3JlIHJlaW5pdGlhbGlzYXRpb24gcHJldmVudHMgdGhhdCB0aGUKKwkJCQkgKiBQSFkgaXMgcnVubmluZyBvdXQgb2YgYSBzdGFibGUgc3RhdGUuCisJCQkJICovCisJCQkJU2tHbUluaXRQaHlNYXJ2KHBBQywgSW9DLCBQb3J0LCBTS19GQUxTRSk7CisJCQlicmVhazsKKworCQkJLyogZG9uJ3QgY2hhbmdlIGN1cnJlbnQgcG93ZXIgbW9kZSAqLworCQkJZGVmYXVsdDoKKwkJCQlwQUMtPkdJbmkuR1BbUG9ydF0uUFBoeVBvd2VyU3RhdGUgPSBMYXN0TW9kZTsKKwkJCQlSZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogbG93IHBvd2VyIG1vZGVzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY2hpcCAqLworCWVsc2UgeworCQlSZXQgPSAxOworCX0KKworCXJldHVybihSZXQpOworCit9CS8qIFNrR21FbnRlckxvd1Bvd2VyTW9kZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHbUxlYXZlTG93UG93ZXJNb2RlKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoJCisgKglMZWF2ZSB0aGUgY3VycmVudCBsb3cgcG93ZXIgbW9kZSBhbmQgc3dpdGNoIHRvIG5vcm1hbCBtb2RlCisgKgorICogTm90ZToKKyAqCisgKiBSZXR1cm5zOgorICoJCTA6CW9rCisgKgkJMToJZXJyb3IKKyAqLworaW50IFNrR21MZWF2ZUxvd1Bvd2VyTW9kZSgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IEluZGV4IChlLmcuIE1BQ18xKSAqLworeworCVNLX1UzMglEV29yZDsKKwlTS19VMTYJV29yZDsKKwlTS19VOAlMYXN0TW9kZTsKKwlpbnQJCVJldCA9IDA7CisKKwlpZiAocEFDLT5HSW5pLkdJWXVrb25MaXRlICYmCisJCXBBQy0+R0luaS5HSUNoaXBSZXYgPT0gQ0hJUF9SRVZfWVVfTElURV9BMykgeworCisJCS8qIHNhdmUgY3VycmVudCBwb3dlciBtb2RlICovCisJCUxhc3RNb2RlID0gcEFDLT5HSW5pLkdQW1BvcnRdLlBQaHlQb3dlclN0YXRlOworCQlwQUMtPkdJbmkuR1BbUG9ydF0uUFBoeVBvd2VyU3RhdGUgPSBQSFlfUE1fT1BFUkFUSU9OQUxfTU9ERTsKKworCQlzd2l0Y2ggKExhc3RNb2RlKSB7CisJCQkvKiBjb21hIG1vZGUgKGRlZXAgc2xlZXApICovCisJCQljYXNlIFBIWV9QTV9ERUVQX1NMRUVQOgorCQkJCVNLX0lOMzIoSW9DLCBQQ0lfQyhQQ0lfT1VSX1JFR18xKSwgJkRXb3JkKTsKKworCQkJCVNLX09VVDgoSW9DLCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT04pOworCQkJCQorCQkJCS8qIFJlbGVhc2UgUEhZIGZyb20gQ29tYSBNb2RlICovCisJCQkJU0tfT1VUMzIoSW9DLCBQQ0lfQyhQQ0lfT1VSX1JFR18xKSwgRFdvcmQgJiB+UENJX1BIWV9DT01BKTsKKwkJCQkKKwkJCQlTS19PVVQ4KElvQywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09GRik7CisJCQkJCisJCQkJU0tfSU4zMihJb0MsIEIyX0dQX0lPLCAmRFdvcmQpOworCisJCQkJLyogc2V0IHRvIG91dHB1dCAqLworCQkJCURXb3JkIHw9IChHUF9ESVJfOSB8IEdQX0lPXzkpOworCisJCQkJLyogc2V0IFBIWSByZXNldCAqLworCQkJCVNLX09VVDMyKElvQywgQjJfR1BfSU8sIERXb3JkKTsKKworCQkJCURXb3JkICY9IH5HUF9JT185OyAvKiBjbGVhciBQSFkgcmVzZXQgKGFjdGl2ZSBoaWdoKSAqLworCisJCQkJLyogY2xlYXIgUEhZIHJlc2V0ICovCisJCQkJU0tfT1VUMzIoSW9DLCBCMl9HUF9JTywgRFdvcmQpOworCQkJYnJlYWs7CisJCQkKKwkJCS8qIElFRUUgMjIuMi40LjEuNSBjb21wYXRpYmxlIHBvd2VyIGRvd24gbW9kZSAqLworCQkJY2FzZSBQSFlfUE1fSUVFRV9QT1dFUl9ET1dOOgorCQkJCS8qCisJCQkJICogLSBlbmFibGUgTUFDIDEyNSBNSHogY2xvY2sKKwkJCQkgKiAtIHNldCBNQUMgcG93ZXIgdXAKKwkJCQkgKi8KKwkJCQlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfUEhZX0NUUkwsICZXb3JkKTsKKwkJCQlXb3JkICY9IH5QSFlfTV9QQ19ESVNfMTI1Q0xLOworCQkJCVdvcmQgfD0JUEhZX01fUENfTUFDX1BPV19VUDsKKwkJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1BIWV9DVFJMLCBXb3JkKTsKKworCQkJCS8qCisJCQkJICogcmVnaXN0ZXIgY2hhbmdlcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc29mdHdhcmUKKwkJCQkgKiByZXNldCB0byB0YWtlIGVmZmVjdAorCQkJCSAqLworCQkJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9DVFJMLCAmV29yZCk7CisJCQkJV29yZCB8PSBQSFlfQ1RfUkVTRVQ7CisJCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9DVFJMLCBXb3JkKTsKKworCQkJCS8qIHN3aXRjaCBJRUVFIGNvbXBhdGlibGUgcG93ZXIgZG93biBtb2RlIG9mZiAqLworCQkJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9DVFJMLCAmV29yZCk7CisJCQkJV29yZCAmPSB+UEhZX0NUX1BET1dOOworCQkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfQ1RSTCwgV29yZCk7CisJCQlicmVhazsKKworCQkJLyogZW5lcmd5IGRldGVjdCBhbmQgZW5lcmd5IGRldGVjdCBwbHVzIG1vZGUgKi8KKwkJCWNhc2UgUEhZX1BNX0VORVJHWV9ERVRFQ1Q6CisJCQljYXNlIFBIWV9QTV9FTkVSR1lfREVURUNUX1BMVVM6CisJCQkJLyoKKwkJCQkgKiAtIGVuYWJsZSBNQUMgMTI1IE1IeiBjbG9jaworCQkJCSAqLworCQkJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwgJldvcmQpOworCQkJCVdvcmQgJj0gflBIWV9NX1BDX0RJU18xMjVDTEs7CisJCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwgV29yZCk7CisJCQkJCisJCQkJLyogZGlzYWJsZSBlbmVyZ3kgZGV0ZWN0IG1vZGUgKi8KKwkJCQlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfUEhZX0NUUkwsICZXb3JkKTsKKwkJCQlXb3JkICY9IH5QSFlfTV9QQ19FTl9ERVRfTVNLOworCQkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfUEhZX0NUUkwsIFdvcmQpOworCisJCQkJLyoKKwkJCQkgKiByZWluaXRpYWxpemUgdGhlIFBIWSB0byBmb3JjZSBhIHNvZnR3YXJlIHJlc2V0CisJCQkJICogd2hpY2ggaXMgbmVjZXNzYXJ5IGFmdGVyIHRoZSByZWdpc3RlciBzZXR0aW5ncworCQkJCSAqIGZvciB0aGUgZW5lcmd5IGRldGVjdCBtb2Rlcy4KKwkJCQkgKiBGdXJ0aGVybW9yZSByZWluaXRpYWxpc2F0aW9uIHByZXZlbnRzIHRoYXQgdGhlCisJCQkJICogUEhZIGlzIHJ1bm5pbmcgb3V0IG9mIGEgc3RhYmxlIHN0YXRlLgorCQkJCSAqLworCQkJCVNrR21Jbml0UGh5TWFydihwQUMsIElvQywgUG9ydCwgU0tfRkFMU0UpOworCQkJYnJlYWs7CisKKwkJCS8qIGRvbid0IGNoYW5nZSBjdXJyZW50IHBvd2VyIG1vZGUgKi8KKwkJCWRlZmF1bHQ6CisJCQkJcEFDLT5HSW5pLkdQW1BvcnRdLlBQaHlQb3dlclN0YXRlID0gTGFzdE1vZGU7CisJCQkJUmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIGxvdyBwb3dlciBtb2RlcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNoaXAgKi8KKwllbHNlIHsKKwkJUmV0ID0gMTsKKwl9CisKKwlyZXR1cm4oUmV0KTsKKworfQkvKiBTa0dtTGVhdmVMb3dQb3dlck1vZGUgKi8KKyNlbmRpZiAvKiAhU0tfU0xJTSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtSW5pdFBoeU1hcnYoKSAtIEluaXRpYWxpemUgdGhlIE1hcnZlbGwgUGh5IHJlZ2lzdGVycworICoKKyAqIERlc2NyaXB0aW9uOglpbml0aWFsaXplcyBhbGwgdGhlIE1hcnZlbGwgUGh5IHJlZ2lzdGVycworICoKKyAqIE5vdGU6CisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgU2tHbUluaXRQaHlNYXJ2KAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK1NLX0JPT0wJRG9Mb29wKQkJLyogU2hvdWxkIGEgUGh5IExvb3BCYWNrIGJlIHNldC11cD8gKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisJU0tfVTE2CQlQaHlDdHJsOworCVNLX1UxNgkJQzEwMDBCYXNlVDsKKwlTS19VMTYJCUF1dG9OZWdBZHY7CisJU0tfVTE2CQlFeHRQaHlDdHJsOworCVNLX1UxNgkJTGVkQ3RybDsKKwlTS19CT09MCQlBdXRvTmVnOworI2lmIGRlZmluZWQoU0tfRElBRykgfHwgZGVmaW5lZChERUJVRykKKwlTS19VMTYJCVBoeVN0YXQ7CisJU0tfVTE2CQlQaHlTdGF0MTsKKwlTS19VMTYJCVBoeVNwZWNTdGF0OworI2VuZGlmIC8qIFNLX0RJQUcgfHwgREVCVUcgKi8KKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJLyogQXV0by1uZWdvdGlhdGlvbiA/ICovCisJaWYgKHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9IQUxGIHx8IHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9GVUxMKSB7CisJCUF1dG9OZWcgPSBTS19GQUxTRTsKKwl9CisJZWxzZSB7CisJCUF1dG9OZWcgPSBTS19UUlVFOworCX0KKwkKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiSW5pdFBoeU1hcnY6IFBvcnQgJWQsIGF1dG8tbmVnb3RpYXRpb24gJXNcbiIsCisJCSBQb3J0LCBBdXRvTmVnID8gIk9OIiA6ICJPRkYiKSk7CisKKyNpZmRlZiBWQ1BVCisJVkNQVXByaW50ZigwLCAiU2tHbUluaXRQaHlNYXJ2KCksIFBvcnQ9JXUsIERvTG9vcD0ldVxuIiwKKwkJUG9ydCwgRG9Mb29wKTsKKyNlbHNlIC8qIFZDUFUgKi8KKwlpZiAoRG9Mb29wKSB7CisJCS8qIFNldCAnTUFDIFBvd2VyIHVwJy1iaXQsIHNldCBNYW51YWwgTURJIGNvbmZpZ3VyYXRpb24gKi8KKwkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwKKwkJCVBIWV9NX1BDX01BQ19QT1dfVVApOworCX0KKwllbHNlIGlmIChBdXRvTmVnICYmIHBQcnQtPlBMaW5rU3BlZWQgPT0gU0tfTFNQRUVEX0FVVE8pIHsKKwkJLyogUmVhZCBFeHQuIFBIWSBTcGVjaWZpYyBDb250cm9sICovCisJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9FWFRfQ1RSTCwgJkV4dFBoeUN0cmwpOworCQkKKwkJRXh0UGh5Q3RybCAmPSB+KFBIWV9NX0VDX01fRFNDX01TSyB8IFBIWV9NX0VDX1NfRFNDX01TSyB8CisJCQlQSFlfTV9FQ19NQUNfU19NU0spOworCQkKKwkJRXh0UGh5Q3RybCB8PSBQSFlfTV9FQ19NQUNfUyhNQUNfVFhfQ0xLXzI1X01IWikgfAorCQkJUEhZX01fRUNfTV9EU0MoMCkgfCBQSFlfTV9FQ19TX0RTQygxKTsKKwkKKwkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9FWFRfQ1RSTCwgRXh0UGh5Q3RybCk7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU2V0IEV4dC4gUEhZIEN0cmw9MHglMDRYXG4iLCBFeHRQaHlDdHJsKSk7CisJfQorCisJLyogUmVhZCBQSFkgQ29udHJvbCAqLworCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9DVFJMLCAmUGh5Q3RybCk7CisKKwlpZiAoIUF1dG9OZWcpIHsKKwkJLyogRGlzYWJsZSBBdXRvLW5lZ290aWF0aW9uICovCisJCVBoeUN0cmwgJj0gflBIWV9DVF9BTkU7CisJfQorCisJUGh5Q3RybCB8PSBQSFlfQ1RfUkVTRVQ7CisJLyogQXNzZXJ0IHNvZnR3YXJlIHJlc2V0ICovCisJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9DVFJMLCBQaHlDdHJsKTsKKyNlbmRpZiAvKiBWQ1BVICovCisKKwlQaHlDdHJsID0gMCAvKiBQSFlfQ1RfQ09MX1RTVCAqLzsKKwlDMTAwMEJhc2VUID0gMDsKKwlBdXRvTmVnQWR2ID0gUEhZX1NFTF9UWVBFOworCisJLyogbWFudWFsbHkgTWFzdGVyL1NsYXZlID8gKi8KKwlpZiAocFBydC0+UE1TTW9kZSAhPSBTS19NU19NT0RFX0FVVE8pIHsKKwkJLyogZW5hYmxlIE1hbnVhbCBNYXN0ZXIvU2xhdmUgKi8KKwkJQzEwMDBCYXNlVCB8PSBQSFlfTV8xMDAwQ19NU0U7CisJCQorCQlpZiAocFBydC0+UE1TTW9kZSA9PSBTS19NU19NT0RFX01BU1RFUikgeworCQkJQzEwMDBCYXNlVCB8PSBQSFlfTV8xMDAwQ19NU0M7CS8qIHNldCBpdCB0byBNYXN0ZXIgKi8KKwkJfQorCX0KKwkKKwkvKiBBdXRvLW5lZ290aWF0aW9uID8gKi8KKwlpZiAoIUF1dG9OZWcpIHsKKwkJCisJCWlmIChwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfRlVMTCkgeworCQkJLyogU2V0IEZ1bGwgRHVwbGV4IE1vZGUgKi8KKwkJCVBoeUN0cmwgfD0gUEhZX0NUX0RVUF9NRDsKKwkJfQorCisJCS8qIFNldCBNYXN0ZXIvU2xhdmUgbWFudWFsbHkgaWYgbm90IGFscmVhZHkgZG9uZSAqLworCQlpZiAocFBydC0+UE1TTW9kZSA9PSBTS19NU19NT0RFX0FVVE8pIHsKKwkJCUMxMDAwQmFzZVQgfD0gUEhZX01fMTAwMENfTVNFOwkvKiBzZXQgaXQgdG8gU2xhdmUgKi8KKwkJfQorCisJCS8qIFNldCBTcGVlZCAqLworCQlzd2l0Y2ggKHBQcnQtPlBMaW5rU3BlZWQpIHsKKwkJY2FzZSBTS19MU1BFRURfQVVUTzoKKwkJY2FzZSBTS19MU1BFRURfMTAwME1CUFM6CisJCQlQaHlDdHJsIHw9IFBIWV9DVF9TUDEwMDA7CisJCQlicmVhazsKKwkJY2FzZSBTS19MU1BFRURfMTAwTUJQUzoKKwkJCVBoeUN0cmwgfD0gUEhZX0NUX1NQMTAwOworCQkJYnJlYWs7CisJCWNhc2UgU0tfTFNQRUVEXzEwTUJQUzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfSFdJX0UwMTksCisJCQkJU0tFUlJfSFdJX0UwMTlNU0cpOworCQl9CisKKwkJaWYgKCFEb0xvb3ApIHsKKwkJCVBoeUN0cmwgfD0gUEhZX0NUX1JFU0VUOworCQl9CisJfQorCWVsc2UgeworCQkvKiBTZXQgQXV0by1uZWdvdGlhdGlvbiBhZHZlcnRpc2VtZW50ICovCisJCQorCQlpZiAocEFDLT5HSW5pLkdJQ29wcGVyVHlwZSkgeworCQkJLyogU2V0IFNwZWVkIGNhcGFiaWxpdGllcyAqLworCQkJc3dpdGNoIChwUHJ0LT5QTGlua1NwZWVkKSB7CisJCQljYXNlIFNLX0xTUEVFRF9BVVRPOgorCQkJCUMxMDAwQmFzZVQgfD0gUEhZX01fMTAwMENfQUhEIHwgUEhZX01fMTAwMENfQUZEOworCQkJCUF1dG9OZWdBZHYgfD0gUEhZX01fQU5fMTAwX0ZEIHwgUEhZX01fQU5fMTAwX0hEIHwKKwkJCQkJUEhZX01fQU5fMTBfRkQgfCBQSFlfTV9BTl8xMF9IRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0tfTFNQRUVEXzEwMDBNQlBTOgorCQkJCUMxMDAwQmFzZVQgfD0gUEhZX01fMTAwMENfQUhEIHwgUEhZX01fMTAwMENfQUZEOworCQkJCWJyZWFrOworCQkJY2FzZSBTS19MU1BFRURfMTAwTUJQUzoKKwkJCQlBdXRvTmVnQWR2IHw9IFBIWV9NX0FOXzEwMF9GRCB8IFBIWV9NX0FOXzEwMF9IRCB8CisJCQkJCS8qIGFkdmVydGlzZSAxMEJhc2UtVCBhbHNvICovCisJCQkJCVBIWV9NX0FOXzEwX0ZEIHwgUEhZX01fQU5fMTBfSEQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNLX0xTUEVFRF8xME1CUFM6CisJCQkJQXV0b05lZ0FkdiB8PSBQSFlfTV9BTl8xMF9GRCB8IFBIWV9NX0FOXzEwX0hEOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9IV0lfRTAxOSwKKwkJCQkJU0tFUlJfSFdJX0UwMTlNU0cpOworCQkJfQorCisJCQkvKiBTZXQgRnVsbC9oYWxmIGR1cGxleCBjYXBhYmlsaXRpZXMgKi8KKwkJCXN3aXRjaCAocFBydC0+UExpbmtNb2RlKSB7CisJCQljYXNlIFNLX0xNT0RFX0FVVE9IQUxGOgorCQkJCUMxMDAwQmFzZVQgJj0gflBIWV9NXzEwMDBDX0FGRDsKKwkJCQlBdXRvTmVnQWR2ICY9IH4oUEhZX01fQU5fMTAwX0ZEIHwgUEhZX01fQU5fMTBfRkQpOworCQkJCWJyZWFrOworCQkJY2FzZSBTS19MTU9ERV9BVVRPRlVMTDoKKwkJCQlDMTAwMEJhc2VUICY9IH5QSFlfTV8xMDAwQ19BSEQ7CisJCQkJQXV0b05lZ0FkdiAmPSB+KFBIWV9NX0FOXzEwMF9IRCB8IFBIWV9NX0FOXzEwX0hEKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0tfTE1PREVfQVVUT0JPVEg6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX0hXSV9FMDE1LAorCQkJCQlTS0VSUl9IV0lfRTAxNU1TRyk7CisJCQl9CisJCQkKKwkJCS8qIFNldCBGbG93LWNvbnRyb2wgY2FwYWJpbGl0aWVzICovCisJCQlzd2l0Y2ggKHBQcnQtPlBGbG93Q3RybE1vZGUpIHsKKwkJCWNhc2UgU0tfRkxPV19NT0RFX05PTkU6CisJCQkJQXV0b05lZ0FkdiB8PSBQSFlfQl9QX05PX1BBVVNFOworCQkJCWJyZWFrOworCQkJY2FzZSBTS19GTE9XX01PREVfTE9DX1NFTkQ6CisJCQkJQXV0b05lZ0FkdiB8PSBQSFlfQl9QX0FTWU1fTUQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNLX0ZMT1dfTU9ERV9TWU1NRVRSSUM6CisJCQkJQXV0b05lZ0FkdiB8PSBQSFlfQl9QX1NZTV9NRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0tfRkxPV19NT0RFX1NZTV9PUl9SRU06CisJCQkJQXV0b05lZ0FkdiB8PSBQSFlfQl9QX0JPVEhfTUQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX0hXSV9FMDE2LAorCQkJCQlTS0VSUl9IV0lfRTAxNk1TRyk7CisJCQl9CisJCX0KKwkJZWxzZSB7CS8qIHNwZWNpYWwgZGVmaW5lcyBmb3IgRklCRVIgKDg4RTEwMTFTIG9ubHkpICovCisJCQkKKwkJCS8qIFNldCBGdWxsL2hhbGYgZHVwbGV4IGNhcGFiaWxpdGllcyAqLworCQkJc3dpdGNoIChwUHJ0LT5QTGlua01vZGUpIHsKKwkJCWNhc2UgU0tfTE1PREVfQVVUT0hBTEY6CisJCQkJQXV0b05lZ0FkdiB8PSBQSFlfTV9BTl8xMDAwWF9BSEQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNLX0xNT0RFX0FVVE9GVUxMOgorCQkJCUF1dG9OZWdBZHYgfD0gUEhZX01fQU5fMTAwMFhfQUZEOworCQkJCWJyZWFrOworCQkJY2FzZSBTS19MTU9ERV9BVVRPQk9USDoKKwkJCQlBdXRvTmVnQWR2IHw9IFBIWV9NX0FOXzEwMDBYX0FIRCB8IFBIWV9NX0FOXzEwMDBYX0FGRDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfSFdJX0UwMTUsCisJCQkJCVNLRVJSX0hXSV9FMDE1TVNHKTsKKwkJCX0KKwkJCQorCQkJLyogU2V0IEZsb3ctY29udHJvbCBjYXBhYmlsaXRpZXMgKi8KKwkJCXN3aXRjaCAocFBydC0+UEZsb3dDdHJsTW9kZSkgeworCQkJY2FzZSBTS19GTE9XX01PREVfTk9ORToKKwkJCQlBdXRvTmVnQWR2IHw9IFBIWV9NX1BfTk9fUEFVU0VfWDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0tfRkxPV19NT0RFX0xPQ19TRU5EOgorCQkJCUF1dG9OZWdBZHYgfD0gUEhZX01fUF9BU1lNX01EX1g7CisJCQkJYnJlYWs7CisJCQljYXNlIFNLX0ZMT1dfTU9ERV9TWU1NRVRSSUM6CisJCQkJQXV0b05lZ0FkdiB8PSBQSFlfTV9QX1NZTV9NRF9YOworCQkJCWJyZWFrOworCQkJY2FzZSBTS19GTE9XX01PREVfU1lNX09SX1JFTToKKwkJCQlBdXRvTmVnQWR2IHw9IFBIWV9NX1BfQk9USF9NRF9YOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9IV0lfRTAxNiwKKwkJCQkJU0tFUlJfSFdJX0UwMTZNU0cpOworCQkJfQorCQl9CisKKwkJaWYgKCFEb0xvb3ApIHsKKwkJCS8qIFJlc3RhcnQgQXV0by1uZWdvdGlhdGlvbiAqLworCQkJUGh5Q3RybCB8PSBQSFlfQ1RfQU5FIHwgUEhZX0NUX1JFX0NGRzsKKwkJfQorCX0KKwkKKyNpZmRlZiBWQ1BVCisJLyoKKwkgKiBFLW1haWwgZnJvbSBHdSBMaW4gKDA4LTAzLTIwMDIpOgorCSAqLworCQorCS8qIFByb2dyYW0gUEhZIHJlZ2lzdGVyIDMwIGFzIDE2J2gwNzA4IGZvciBzaW11bGF0aW9uIHNwZWVkIHVwICovCisJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCAzMCwgMHgwNzAwIC8qIDB4MDcwOCAqLyk7CisJCisJVkNwdVdhaXQoMjAwMCk7CisKKyNlbHNlIC8qIFZDUFUgKi8KKwkKKwkvKiBXcml0ZSAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWXzEwMDBUX0NUUkwsIEMxMDAwQmFzZVQpOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTZXQgMTAwMEItVCBDdHJsID0weCUwNFhcbiIsIEMxMDAwQmFzZVQpKTsKKwkKKwkvKiBXcml0ZSBBdXRvTmVnIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKi8KKwlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0FVTkVfQURWLCBBdXRvTmVnQWR2KTsKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU2V0IEF1dG8tTmVnLkFkdi49MHglMDRYXG4iLCBBdXRvTmVnQWR2KSk7CisjZW5kaWYgLyogVkNQVSAqLworCQorCWlmIChEb0xvb3ApIHsKKwkJLyogU2V0IHRoZSBQSFkgTG9vcGJhY2sgYml0ICovCisJCVBoeUN0cmwgfD0gUEhZX0NUX0xPT1A7CisKKyNpZmRlZiBYWFgKKwkJLyogUHJvZ3JhbSBQSFkgcmVnaXN0ZXIgMTYgYXMgMTYnaDA0MDAgdG8gZm9yY2UgbGluayBnb29kICovCisJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfUEhZX0NUUkwsIFBIWV9NX1BDX0ZMX0dPT0QpOworI2VuZGlmIC8qIFhYWCAqLworCisjaWZuZGVmIFZDUFUKKwkJaWYgKHBQcnQtPlBMaW5rU3BlZWQgIT0gU0tfTFNQRUVEX0FVVE8pIHsKKwkJCS8qIFdyaXRlIEV4dC4gUEhZIFNwZWNpZmljIENvbnRyb2wgKi8KKwkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfRVhUX0NUUkwsCisJCQkJKFNLX1UxNikoKHBQcnQtPlBMaW5rU3BlZWQgKyAyKSA8PCA0KSk7CisJCX0KKyNlbmRpZiAvKiBWQ1BVICovCisJfQorI2lmZGVmIFRFU1RfT05MWQorCWVsc2UgaWYgKHBQcnQtPlBMaW5rU3BlZWQgPT0gU0tfTFNQRUVEXzEwTUJQUykgeworCQkJLyogV3JpdGUgUEhZIFNwZWNpZmljIENvbnRyb2wgKi8KKwkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfUEhZX0NUUkwsCisJCQkJUEhZX01fUENfRU5fREVUX01TSyk7CisJfQorI2VuZGlmCisKKwkvKiBXcml0ZSB0byB0aGUgUEhZIENvbnRyb2wgcmVnaXN0ZXIgKi8KKwlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0NUUkwsIFBoeUN0cmwpOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTZXQgUEhZIEN0cmwgUmVnLj0weCUwNFhcbiIsIFBoeUN0cmwpKTsKKworI2lmZGVmIFZDUFUKKwlWQ3B1V2FpdCgyMDAwKTsKKyNlbHNlCisKKwlMZWRDdHJsID0gUEhZX01fTEVEX1BVTFNfRFVSKFBVTFNfMTcwTVMpIHwgUEhZX01fTEVEX0JMSU5LX1JUKEJMSU5LXzg0TVMpOworCisJaWYgKChwQUMtPkdJbmkuR0lMZWRCbGlua0N0cmwgJiBTS19BQ1RfTEVEX0JMSU5LKSAhPSAwKSB7CisJCUxlZEN0cmwgfD0gUEhZX01fTEVEQ19SWF9DVFJMIHwgUEhZX01fTEVEQ19UWF9DVFJMOworCX0KKworCWlmICgocEFDLT5HSW5pLkdJTGVkQmxpbmtDdHJsICYgU0tfRFVQX0xFRF9OT1JNQUwpICE9IDApIHsKKwkJTGVkQ3RybCB8PSBQSFlfTV9MRURDX0RQX0NUUkw7CisJfQorCQorCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfTEVEX0NUUkwsIExlZEN0cmwpOworCisJaWYgKChwQUMtPkdJbmkuR0lMZWRCbGlua0N0cmwgJiBTS19MRURfTElOSzEwMF9PTikgIT0gMCkgeworCQkvKiBvbmx5IGluIGZvcmNlZCAxMDAgTWJwcyBtb2RlICovCisJCWlmICghQXV0b05lZyAmJiBwUHJ0LT5QTGlua1NwZWVkID09IFNLX0xTUEVFRF8xMDBNQlBTKSB7CisKKwkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfTEVEX09WRVIsCisJCQkJUEhZX01fTEVEX01PXzEwMChNT19MRURfT04pKTsKKwkJfQorCX0KKworI2lmZGVmIFNLX0RJQUcKKwljX3ByaW50KCJTZXQgUEhZIEN0cmw9MHglMDRYXG4iLCBQaHlDdHJsKTsKKwljX3ByaW50KCJTZXQgMTAwMCBCLVQ9MHglMDRYXG4iLCBDMTAwMEJhc2VUKTsKKwljX3ByaW50KCJTZXQgQXV0by1OZWc9MHglMDRYXG4iLCBBdXRvTmVnQWR2KTsKKwljX3ByaW50KCJTZXQgRXh0IEN0cmw9MHglMDRYXG4iLCBFeHRQaHlDdHJsKTsKKyNlbmRpZiAvKiBTS19ESUFHICovCisKKyNpZiBkZWZpbmVkKFNLX0RJQUcpIHx8IGRlZmluZWQoREVCVUcpCisJLyogUmVhZCBQSFkgQ29udHJvbCAqLworCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9DVFJMLCAmUGh5Q3RybCk7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIlBIWSBDdHJsIFJlZy49MHglMDRYXG4iLCBQaHlDdHJsKSk7CisJCisJLyogUmVhZCAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfMTAwMFRfQ1RSTCwgJkMxMDAwQmFzZVQpOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCIxMDAwQi1UIEN0cmwgPTB4JTA0WFxuIiwgQzEwMDBCYXNlVCkpOworCQorCS8qIFJlYWQgQXV0b05lZyBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyICovCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0FVTkVfQURWLCAmQXV0b05lZ0Fkdik7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIkF1dG8tTmVnLkFkdi49MHglMDRYXG4iLCBBdXRvTmVnQWR2KSk7CisJCisJLyogUmVhZCBFeHQuIFBIWSBTcGVjaWZpYyBDb250cm9sICovCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0VYVF9DVFJMLCAmRXh0UGh5Q3RybCk7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIkV4dC4gUEhZIEN0cmw9MHglMDRYXG4iLCBFeHRQaHlDdHJsKSk7CisJCisJLyogUmVhZCBQSFkgU3RhdHVzICovCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1NUQVQsICZQaHlTdGF0KTsKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiUEhZIFN0YXQgUmVnLj0weCUwNFhcbiIsIFBoeVN0YXQpKTsKKwlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfU1RBVCwgJlBoeVN0YXQxKTsKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiUEhZIFN0YXQgUmVnLj0weCUwNFhcbiIsIFBoeVN0YXQxKSk7CisJCisJLyogUmVhZCBQSFkgU3BlY2lmaWMgU3RhdHVzICovCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1BIWV9TVEFULCAmUGh5U3BlY1N0YXQpOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJQSFkgU3BlYyBTdGF0PTB4JTA0WFxuIiwgUGh5U3BlY1N0YXQpKTsKKyNlbmRpZiAvKiBTS19ESUFHIHx8IERFQlVHICovCisKKyNpZmRlZiBTS19ESUFHCisJY19wcmludCgiUEhZIEN0cmwgUmVnPTB4JTA0WFxuIiwgUGh5Q3RybCk7CisJY19wcmludCgiUEhZIDEwMDAgUmVnPTB4JTA0WFxuIiwgQzEwMDBCYXNlVCk7CisJY19wcmludCgiUEhZIEFuQWQgUmVnPTB4JTA0WFxuIiwgQXV0b05lZ0Fkdik7CisJY19wcmludCgiRXh0IEN0cmwgUmVnPTB4JTA0WFxuIiwgRXh0UGh5Q3RybCk7CisJY19wcmludCgiUEhZIFN0YXQgUmVnPTB4JTA0WFxuIiwgUGh5U3RhdCk7CisJY19wcmludCgiUEhZIFN0YXQgUmVnPTB4JTA0WFxuIiwgUGh5U3RhdDEpOworCWNfcHJpbnQoIlBIWSBTcGVjIFJlZz0weCUwNFhcbiIsIFBoeVNwZWNTdGF0KTsKKyNlbmRpZiAvKiBTS19ESUFHICovCisKKyNlbmRpZiAvKiBWQ1BVICovCisKK30JLyogU2tHbUluaXRQaHlNYXJ2ICovCisjZW5kaWYgLyogWVVLT04gKi8KKworCisjaWZkZWYgT1RIRVJfUEhZCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbUluaXRQaHlMb25lKCkgLSBJbml0aWFsaXplIHRoZSBMZXZlbCBPbmUgUGh5IHJlZ2lzdGVycworICoKKyAqIERlc2NyaXB0aW9uOglpbml0aWFsaXplcyBhbGwgdGhlIExldmVsIE9uZSBQaHkgcmVnaXN0ZXJzCisgKgorICogTm90ZToKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa1htSW5pdFBoeUxvbmUoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfQk9PTAlEb0xvb3ApCQkvKiBTaG91bGQgYSBQaHkgTG9vcEJhY2sgYmUgc2V0LXVwPyAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19VMTYJCUN0cmwxOworCVNLX1UxNgkJQ3RybDI7CisJU0tfVTE2CQlDdHJsMzsKKworCUN0cmwxID0gUEhZX0NUX1NQMTAwMDsKKwlDdHJsMiA9IDA7CisJQ3RybDMgPSBQSFlfU0VMX1RZUEU7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCS8qIG1hbnVhbGx5IE1hc3Rlci9TbGF2ZSA/ICovCisJaWYgKHBQcnQtPlBNU01vZGUgIT0gU0tfTVNfTU9ERV9BVVRPKSB7CisJCUN0cmwyIHw9IFBIWV9MXzEwMDBDX01TRTsKKwkJCisJCWlmIChwUHJ0LT5QTVNNb2RlID09IFNLX01TX01PREVfTUFTVEVSKSB7CisJCQlDdHJsMiB8PSBQSFlfTF8xMDAwQ19NU0M7CisJCX0KKwl9CisJLyogQXV0by1uZWdvdGlhdGlvbiA/ICovCisJaWYgKHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9IQUxGIHx8IHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9GVUxMKSB7CisJCS8qCisJCSAqIGxldmVsIG9uZSBzcGVjIHNheTogIjEwMDAgTWJwczogbWFudWFsIG1vZGUgbm90IGFsbG93ZWQiCisJCSAqIGJ1dCBsZXRzIHNlZSB3aGF0IGhhcHBlbnMuLi4KKwkJICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiSW5pdFBoeUxvbmU6IG5vIGF1dG8tbmVnb3RpYXRpb24gUG9ydCAlZFxuIiwgUG9ydCkpOworCQkvKiBTZXQgRHVwbGV4TW9kZSBpbiBDb25maWcgcmVnaXN0ZXIgKi8KKwkJaWYgKHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9GVUxMKSB7CisJCQlDdHJsMSB8PSBQSFlfQ1RfRFVQX01EOworCQl9CisKKwkJLyogRGV0ZXJtaW5lIE1hc3Rlci9TbGF2ZSBtYW51YWxseSBpZiBub3QgYWxyZWFkeSBkb25lICovCisJCWlmIChwUHJ0LT5QTVNNb2RlID09IFNLX01TX01PREVfQVVUTykgeworCQkJQ3RybDIgfD0gUEhZX0xfMTAwMENfTVNFOwkvKiBzZXQgaXQgdG8gU2xhdmUgKi8KKwkJfQorCisJCS8qCisJCSAqIERvIE5PVCBlbmFibGUgQXV0by1uZWdvdGlhdGlvbiBoZXJlLiBUaGlzIHdvdWxkIGhvbGQKKwkJICogdGhlIGxpbmsgZG93biBiZWNhdXNlIG5vIElETEVTIGFyZSB0cmFuc21pdHRlZAorCQkgKi8KKwl9CisJZWxzZSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiSW5pdFBoeUxvbmU6IHdpdGggYXV0by1uZWdvdGlhdGlvbiBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCS8qIFNldCBBdXRvLW5lZ290aWF0aW9uIGFkdmVydGlzZW1lbnQgKi8KKworCQkvKiBTZXQgRnVsbC9oYWxmIGR1cGxleCBjYXBhYmlsaXRpZXMgKi8KKwkJc3dpdGNoIChwUHJ0LT5QTGlua01vZGUpIHsKKwkJY2FzZSBTS19MTU9ERV9BVVRPSEFMRjoKKwkJCUN0cmwyIHw9IFBIWV9MXzEwMDBDX0FIRDsKKwkJCWJyZWFrOworCQljYXNlIFNLX0xNT0RFX0FVVE9GVUxMOgorCQkJQ3RybDIgfD0gUEhZX0xfMTAwMENfQUZEOworCQkJYnJlYWs7CisJCWNhc2UgU0tfTE1PREVfQVVUT0JPVEg6CisJCQlDdHJsMiB8PSBQSFlfTF8xMDAwQ19BRkQgfCBQSFlfTF8xMDAwQ19BSEQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX0hXSV9FMDE1LAorCQkJCVNLRVJSX0hXSV9FMDE1TVNHKTsKKwkJfQorCisJCS8qIFNldCBGbG93LWNvbnRyb2wgY2FwYWJpbGl0aWVzICovCisJCXN3aXRjaCAocFBydC0+UEZsb3dDdHJsTW9kZSkgeworCQljYXNlIFNLX0ZMT1dfTU9ERV9OT05FOgorCQkJQ3RybDMgfD0gUEhZX0xfUF9OT19QQVVTRTsKKwkJCWJyZWFrOworCQljYXNlIFNLX0ZMT1dfTU9ERV9MT0NfU0VORDoKKwkJCUN0cmwzIHw9IFBIWV9MX1BfQVNZTV9NRDsKKwkJCWJyZWFrOworCQljYXNlIFNLX0ZMT1dfTU9ERV9TWU1NRVRSSUM6CisJCQlDdHJsMyB8PSBQSFlfTF9QX1NZTV9NRDsKKwkJCWJyZWFrOworCQljYXNlIFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNOgorCQkJQ3RybDMgfD0gUEhZX0xfUF9CT1RIX01EOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9IV0lfRTAxNiwKKwkJCQlTS0VSUl9IV0lfRTAxNk1TRyk7CisJCX0KKworCQkvKiBSZXN0YXJ0IEF1dG8tbmVnb3RpYXRpb24gKi8KKwkJQ3RybDEgPSBQSFlfQ1RfQU5FIHwgUEhZX0NUX1JFX0NGRzsKKwl9CisJCisJLyogV3JpdGUgMTAwMEJhc2UtVCBDb250cm9sIFJlZ2lzdGVyICovCisJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTE9ORV8xMDAwVF9DVFJMLCBDdHJsMik7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIjEwMDBCLVQgQ3RybCBSZWc9MHglMDRYXG4iLCBDdHJsMikpOworCQorCS8qIFdyaXRlIEF1dG9OZWcgQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAqLworCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX0xPTkVfQVVORV9BRFYsIEN0cmwzKTsKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiQXV0by1OZWcuQWR2LlJlZz0weCUwNFhcbiIsIEN0cmwzKSk7CisKKwlpZiAoRG9Mb29wKSB7CisJCS8qIFNldCB0aGUgUGh5IExvb3BiYWNrIGJpdCwgdG9vICovCisJCUN0cmwxIHw9IFBIWV9DVF9MT09QOworCX0KKworCS8qIFdyaXRlIHRvIHRoZSBQaHkgY29udHJvbCByZWdpc3RlciAqLworCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX0xPTkVfQ1RSTCwgQ3RybDEpOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJQSFkgQ29udHJvbCBSZWc9MHglMDRYXG4iLCBDdHJsMSkpOworfQkvKiBTa1htSW5pdFBoeUxvbmUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbUluaXRQaHlOYXQoKSAtIEluaXRpYWxpemUgdGhlIE5hdGlvbmFsIFBoeSByZWdpc3RlcnMKKyAqCisgKiBEZXNjcmlwdGlvbjoJaW5pdGlhbGl6ZXMgYWxsIHRoZSBOYXRpb25hbCBQaHkgcmVnaXN0ZXJzCisgKgorICogTm90ZToKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa1htSW5pdFBoeU5hdCgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19CT09MCURvTG9vcCkJCS8qIFNob3VsZCBhIFBoeSBMb29wQmFjayBiZSBzZXQtdXA/ICovCit7CisvKiB0b2RvOiBOYXRpb25hbCAqLworfQkvKiBTa1htSW5pdFBoeU5hdCAqLworI2VuZGlmIC8qIE9USEVSX1BIWSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa01hY0luaXRQaHkoKSAtIEluaXRpYWxpemUgdGhlIFBIWSByZWdpc3RlcnMKKyAqCisgKiBEZXNjcmlwdGlvbjoJY2FsbHMgdGhlIEluaXQgUEhZIHJvdXRpbmVzIGRlcC4gb24gYm9hcmQgdHlwZQorICoKKyAqIE5vdGU6CisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa01hY0luaXRQaHkoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfQk9PTAlEb0xvb3ApCQkvKiBTaG91bGQgYSBQaHkgTG9vcEJhY2sgYmUgc2V0LXVwPyAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQorCQlzd2l0Y2ggKHBQcnQtPlBoeVR5cGUpIHsKKwkJY2FzZSBTS19QSFlfWE1BQzoKKwkJCVNrWG1Jbml0UGh5WG1hYyhwQUMsIElvQywgUG9ydCwgRG9Mb29wKTsKKwkJCWJyZWFrOworCQljYXNlIFNLX1BIWV9CQ09NOgorCQkJU2tYbUluaXRQaHlCY29tKHBBQywgSW9DLCBQb3J0LCBEb0xvb3ApOworCQkJYnJlYWs7CisjaWZkZWYgT1RIRVJfUEhZCisJCWNhc2UgU0tfUEhZX0xPTkU6CisJCQlTa1htSW5pdFBoeUxvbmUocEFDLCBJb0MsIFBvcnQsIERvTG9vcCk7CisJCQlicmVhazsKKwkJY2FzZSBTS19QSFlfTkFUOgorCQkJU2tYbUluaXRQaHlOYXQocEFDLCBJb0MsIFBvcnQsIERvTG9vcCk7CisJCQlicmVhazsKKyNlbmRpZiAvKiBPVEhFUl9QSFkgKi8KKwkJfQorCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCisJCVNrR21Jbml0UGh5TWFydihwQUMsIElvQywgUG9ydCwgRG9Mb29wKTsKKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworfQkvKiBTa01hY0luaXRQaHkgKi8KKworCisjaWZkZWYgR0VORVNJUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1BdXRvTmVnRG9uZVhtYWMoKSAtIEF1dG8tbmVnb3RpYXRpb24gaGFuZGxpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgYXV0by1uZWdvdGlhdGlvbiBpZiB0aGUgRG9uZSBiaXQgaXMgc2V0LgorICoKKyAqIFJldHVybnM6CisgKglTS19BTkRfT0sJby5rLgorICoJU0tfQU5EX0RVUF9DQVAgCUR1cGxleCBjYXBhYmlsaXR5IGVycm9yIGhhcHBlbmVkCisgKglTS19BTkRfT1RIRVIgCU90aGVyIGVycm9yIGhhcHBlbmVkCisgKi8KK3N0YXRpYyBpbnQgU2tYbUF1dG9OZWdEb25lWG1hYygKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworCVNLX1UxNgkJUmVzQWI7CQkvKiBSZXNvbHZlZCBBYmlsaXR5ICovCisJU0tfVTE2CQlMUEFiOwkJLyogTGluayBQYXJ0bmVyIEFiaWxpdHkgKi8KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJBdXRvTmVnRG9uZVhtYWMsIFBvcnQgJWRcbiIsIFBvcnQpKTsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJLyogR2V0IFBIWSBwYXJhbWV0ZXJzICovCisJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9YTUFDX0FVTkVfTFAsICZMUEFiKTsKKwlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX1hNQUNfUkVTX0FCSSwgJlJlc0FiKTsKKworCWlmICgoTFBBYiAmIFBIWV9YX0FOX1JGQikgIT0gMCkgeworCQkvKiBBdCBsZWFzdCBvbmUgb2YgdGhlIHJlbW90ZSBmYXVsdCBiaXQgaXMgc2V0ICovCisJCS8qIEVycm9yICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQXV0b05lZ0ZhaWw6IFJlbW90ZSBmYXVsdCBiaXQgc2V0IFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJcFBydC0+UEF1dG9OZWdGYWlsID0gU0tfVFJVRTsKKwkJcmV0dXJuKFNLX0FORF9PVEhFUik7CisJfQorCisJLyogQ2hlY2sgRHVwbGV4IG1pc21hdGNoICovCisJaWYgKChSZXNBYiAmIChQSFlfWF9SU19IRCB8IFBIWV9YX1JTX0ZEKSkgPT0gUEhZX1hfUlNfRkQpIHsKKwkJcFBydC0+UExpbmtNb2RlU3RhdHVzID0gKFNLX1U4KVNLX0xNT0RFX1NUQVRfQVVUT0ZVTEw7CisJfQorCWVsc2UgaWYgKChSZXNBYiAmIChQSFlfWF9SU19IRCB8IFBIWV9YX1JTX0ZEKSkgPT0gUEhZX1hfUlNfSEQpIHsKKwkJcFBydC0+UExpbmtNb2RlU3RhdHVzID0gKFNLX1U4KVNLX0xNT0RFX1NUQVRfQVVUT0hBTEY7CisJfQorCWVsc2UgeworCQkvKiBFcnJvciAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkF1dG9OZWdGYWlsOiBEdXBsZXggbW9kZSBtaXNtYXRjaCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCXBQcnQtPlBBdXRvTmVnRmFpbCA9IFNLX1RSVUU7CisJCXJldHVybihTS19BTkRfRFVQX0NBUCk7CisJfQorCisJLyogQ2hlY2sgUEFVU0UgbWlzbWF0Y2ggKi8KKwkvKiBXZSBhcmUgTk9UIHVzaW5nIGNoYXB0ZXIgNC4yMyBvZiB0aGUgWGFxdGkgbWFudWFsICovCisJLyogV2UgYXJlIHVzaW5nIElFRUUgODAyLjN6L0Q1LjAgVGFibGUgMzctNCAqLworCWlmICgocFBydC0+UEZsb3dDdHJsTW9kZSA9PSBTS19GTE9XX01PREVfU1lNTUVUUklDIHx8CisJICAgICBwUHJ0LT5QRmxvd0N0cmxNb2RlID09IFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNKSAmJgorCSAgICAoTFBBYiAmIFBIWV9YX1BfU1lNX01EKSAhPSAwKSB7CisJCS8qIFN5bW1ldHJpYyBQQVVTRSAqLworCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfU1lNTUVUUklDOworCX0KKwllbHNlIGlmIChwUHJ0LT5QRmxvd0N0cmxNb2RlID09IFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNICYmCisJCSAgIChMUEFiICYgUEhZX1hfUlNfUEFVU0UpID09IFBIWV9YX1BfQVNZTV9NRCkgeworCQkvKiBFbmFibGUgUEFVU0UgcmVjZWl2ZSwgZGlzYWJsZSBQQVVTRSB0cmFuc21pdCAqLworCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfUkVNX1NFTkQ7CisJfQorCWVsc2UgaWYgKHBQcnQtPlBGbG93Q3RybE1vZGUgPT0gU0tfRkxPV19NT0RFX0xPQ19TRU5EICYmCisJCSAgIChMUEFiICYgUEhZX1hfUlNfUEFVU0UpID09IFBIWV9YX1BfQk9USF9NRCkgeworCQkvKiBEaXNhYmxlIFBBVVNFIHJlY2VpdmUsIGVuYWJsZSBQQVVTRSB0cmFuc21pdCAqLworCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfTE9DX1NFTkQ7CisJfQorCWVsc2UgeworCQkvKiBQQVVTRSBtaXNtYXRjaCAtPiBubyBQQVVTRSAqLworCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfTk9ORTsKKwl9CisJcFBydC0+UExpbmtTcGVlZFVzZWQgPSAoU0tfVTgpU0tfTFNQRUVEX1NUQVRfMTAwME1CUFM7CisKKwlyZXR1cm4oU0tfQU5EX09LKTsKK30JLyogU2tYbUF1dG9OZWdEb25lWG1hYyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htQXV0b05lZ0RvbmVCY29tKCkgLSBBdXRvLW5lZ290aWF0aW9uIGhhbmRsaW5nCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGF1dG8tbmVnb3RpYXRpb24gaWYgdGhlIERvbmUgYml0IGlzIHNldC4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQU5EX09LCW8uay4KKyAqCVNLX0FORF9EVVBfQ0FQIAlEdXBsZXggY2FwYWJpbGl0eSBlcnJvciBoYXBwZW5lZAorICoJU0tfQU5EX09USEVSIAlPdGhlciBlcnJvciBoYXBwZW5lZAorICovCitzdGF0aWMgaW50IFNrWG1BdXRvTmVnRG9uZUJjb20oCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19VMTYJCUxQQWI7CQkvKiBMaW5rIFBhcnRuZXIgQWJpbGl0eSAqLworCVNLX1UxNgkJQXV4U3RhdDsJLyogQXV4aWxpYXJ5IFN0YXR1cyAqLworCisjaWZkZWYgVEVTVF9PTkxZCiswMS1TZXAtMjAwMCBSQTs6OzoKKwlTS19VMTYJCVJlc0FiOwkJLyogUmVzb2x2ZWQgQWJpbGl0eSAqLworI2VuZGlmCS8qIDAgKi8KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJBdXRvTmVnRG9uZUJjb20sIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCS8qIEdldCBQSFkgcGFyYW1ldGVycyAqLworCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVU5FX0xQLCAmTFBBYik7CisjaWZkZWYgVEVTVF9PTkxZCiswMS1TZXAtMjAwMCBSQTs6OzoKKwlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fMTAwMFRfU1RBVCwgJlJlc0FiKTsKKyNlbmRpZgkvKiAwICovCisJCisJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVWF9TVEFULCAmQXV4U3RhdCk7CisKKwlpZiAoKExQQWIgJiBQSFlfQl9BTl9SRikgIT0gMCkgeworCQkvKiBSZW1vdGUgZmF1bHQgYml0IGlzIHNldDogRXJyb3IgKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJBdXRvTmVnRmFpbDogUmVtb3RlIGZhdWx0IGJpdCBzZXQgUG9ydCAlZFxuIiwgUG9ydCkpOworCQlwUHJ0LT5QQXV0b05lZ0ZhaWwgPSBTS19UUlVFOworCQlyZXR1cm4oU0tfQU5EX09USEVSKTsKKwl9CisKKwkvKiBDaGVjayBEdXBsZXggbWlzbWF0Y2ggKi8KKwlpZiAoKEF1eFN0YXQgJiBQSFlfQl9BU19BTl9SRVNfTVNLKSA9PSBQSFlfQl9SRVNfMTAwMEZEKSB7CisJCXBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9IChTS19VOClTS19MTU9ERV9TVEFUX0FVVE9GVUxMOworCX0KKwllbHNlIGlmICgoQXV4U3RhdCAmIFBIWV9CX0FTX0FOX1JFU19NU0spID09IFBIWV9CX1JFU18xMDAwSEQpIHsKKwkJcFBydC0+UExpbmtNb2RlU3RhdHVzID0gKFNLX1U4KVNLX0xNT0RFX1NUQVRfQVVUT0hBTEY7CisJfQorCWVsc2UgeworCQkvKiBFcnJvciAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkF1dG9OZWdGYWlsOiBEdXBsZXggbW9kZSBtaXNtYXRjaCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCXBQcnQtPlBBdXRvTmVnRmFpbCA9IFNLX1RSVUU7CisJCXJldHVybihTS19BTkRfRFVQX0NBUCk7CisJfQorCQorI2lmZGVmIFRFU1RfT05MWQorMDEtU2VwLTIwMDAgUkE7Ojs6CisJLyogQ2hlY2sgTWFzdGVyL1NsYXZlIHJlc29sdXRpb24gKi8KKwlpZiAoKFJlc0FiICYgUEhZX0JfMTAwMFNfTVNGKSAhPSAwKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiTWFzdGVyL1NsYXZlIEZhdWx0IFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJcFBydC0+UEF1dG9OZWdGYWlsID0gU0tfVFJVRTsKKwkJcFBydC0+UE1TU3RhdHVzID0gU0tfTVNfU1RBVF9GQVVMVDsKKwkJcmV0dXJuKFNLX0FORF9PVEhFUik7CisJfQorCQorCXBQcnQtPlBNU1N0YXR1cyA9ICgoUmVzQWIgJiBQSFlfQl8xMDAwU19NU1IpICE9IDApID8KKwkJU0tfTVNfU1RBVF9NQVNURVIgOiBTS19NU19TVEFUX1NMQVZFOworI2VuZGlmCS8qIDAgKi8KKworCS8qIENoZWNrIFBBVVNFIG1pc21hdGNoID8/PyAqLworCS8qIFdlIGFyZSB1c2luZyBJRUVFIDgwMi4zei9ENS4wIFRhYmxlIDM3LTQgKi8KKwlpZiAoKEF1eFN0YXQgJiBQSFlfQl9BU19QQVVTRV9NU0spID09IFBIWV9CX0FTX1BBVVNFX01TSykgeworCQkvKiBTeW1tZXRyaWMgUEFVU0UgKi8KKwkJcFBydC0+UEZsb3dDdHJsU3RhdHVzID0gU0tfRkxPV19TVEFUX1NZTU1FVFJJQzsKKwl9CisJZWxzZSBpZiAoKEF1eFN0YXQgJiBQSFlfQl9BU19QQVVTRV9NU0spID09IFBIWV9CX0FTX1BSUikgeworCQkvKiBFbmFibGUgUEFVU0UgcmVjZWl2ZSwgZGlzYWJsZSBQQVVTRSB0cmFuc21pdCAqLworCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfUkVNX1NFTkQ7CisJfQorCWVsc2UgaWYgKChBdXhTdGF0ICYgUEhZX0JfQVNfUEFVU0VfTVNLKSA9PSBQSFlfQl9BU19QUlQpIHsKKwkJLyogRGlzYWJsZSBQQVVTRSByZWNlaXZlLCBlbmFibGUgUEFVU0UgdHJhbnNtaXQgKi8KKwkJcFBydC0+UEZsb3dDdHJsU3RhdHVzID0gU0tfRkxPV19TVEFUX0xPQ19TRU5EOworCX0KKwllbHNlIHsKKwkJLyogUEFVU0UgbWlzbWF0Y2ggLT4gbm8gUEFVU0UgKi8KKwkJcFBydC0+UEZsb3dDdHJsU3RhdHVzID0gU0tfRkxPV19TVEFUX05PTkU7CisJfQorCXBQcnQtPlBMaW5rU3BlZWRVc2VkID0gKFNLX1U4KVNLX0xTUEVFRF9TVEFUXzEwMDBNQlBTOworCisJcmV0dXJuKFNLX0FORF9PSyk7Cit9CS8qIFNrWG1BdXRvTmVnRG9uZUJjb20gKi8KKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKworI2lmZGVmIFlVS09OCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHbUF1dG9OZWdEb25lTWFydigpIC0gQXV0by1uZWdvdGlhdGlvbiBoYW5kbGluZworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBhdXRvLW5lZ290aWF0aW9uIGlmIHRoZSBEb25lIGJpdCBpcyBzZXQuCisgKgorICogUmV0dXJuczoKKyAqCVNLX0FORF9PSwlvLmsuCisgKglTS19BTkRfRFVQX0NBUCAJRHVwbGV4IGNhcGFiaWxpdHkgZXJyb3IgaGFwcGVuZWQKKyAqCVNLX0FORF9PVEhFUiAJT3RoZXIgZXJyb3IgaGFwcGVuZWQKKyAqLworc3RhdGljIGludCBTa0dtQXV0b05lZ0RvbmVNYXJ2KAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisJU0tfVTE2CQlMUEFiOwkJLyogTGluayBQYXJ0bmVyIEFiaWxpdHkgKi8KKwlTS19VMTYJCVJlc0FiOwkJLyogUmVzb2x2ZWQgQWJpbGl0eSAqLworCVNLX1UxNgkJQXV4U3RhdDsJLyogQXV4aWxpYXJ5IFN0YXR1cyAqLworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIkF1dG9OZWdEb25lTWFydiwgUG9ydCAlZFxuIiwgUG9ydCkpOworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJLyogR2V0IFBIWSBwYXJhbWV0ZXJzICovCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0FVTkVfTFAsICZMUEFiKTsKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiTGluayBQLkFiaWwuPTB4JTA0WFxuIiwgTFBBYikpOworCQorCWlmICgoTFBBYiAmIFBIWV9NX0FOX1JGKSAhPSAwKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQXV0b05lZ0ZhaWw6IFJlbW90ZSBmYXVsdCBiaXQgc2V0IFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJcFBydC0+UEF1dG9OZWdGYWlsID0gU0tfVFJVRTsKKwkJcmV0dXJuKFNLX0FORF9PVEhFUik7CisJfQorCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWXzEwMDBUX1NUQVQsICZSZXNBYik7CisJCisJLyogQ2hlY2sgTWFzdGVyL1NsYXZlIHJlc29sdXRpb24gKi8KKwlpZiAoKFJlc0FiICYgUEhZX0JfMTAwMFNfTVNGKSAhPSAwKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiTWFzdGVyL1NsYXZlIEZhdWx0IFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJcFBydC0+UEF1dG9OZWdGYWlsID0gU0tfVFJVRTsKKwkJcFBydC0+UE1TU3RhdHVzID0gU0tfTVNfU1RBVF9GQVVMVDsKKwkJcmV0dXJuKFNLX0FORF9PVEhFUik7CisJfQorCQorCXBQcnQtPlBNU1N0YXR1cyA9ICgoUmVzQWIgJiBQSFlfQl8xMDAwU19NU1IpICE9IDApID8KKwkJKFNLX1U4KVNLX01TX1NUQVRfTUFTVEVSIDogKFNLX1U4KVNLX01TX1NUQVRfU0xBVkU7CisJCisJLyogUmVhZCBQSFkgU3BlY2lmaWMgU3RhdHVzICovCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1BIWV9TVEFULCAmQXV4U3RhdCk7CisJCisJLyogQ2hlY2sgU3BlZWQgJiBEdXBsZXggcmVzb2x2ZWQgKi8KKwlpZiAoKEF1eFN0YXQgJiBQSFlfTV9QU19TUERVUF9SRVMpID09IDApIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJBdXRvTmVnRmFpbDogU3BlZWQgJiBEdXBsZXggbm90IHJlc29sdmVkLCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCXBQcnQtPlBBdXRvTmVnRmFpbCA9IFNLX1RSVUU7CisJCXBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9IChTS19VOClTS19MTU9ERV9TVEFUX1VOS05PV047CisJCXJldHVybihTS19BTkRfRFVQX0NBUCk7CisJfQorCQorCWlmICgoQXV4U3RhdCAmIFBIWV9NX1BTX0ZVTExfRFVQKSAhPSAwKSB7CisJCXBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9IChTS19VOClTS19MTU9ERV9TVEFUX0FVVE9GVUxMOworCX0KKwllbHNlIHsKKwkJcFBydC0+UExpbmtNb2RlU3RhdHVzID0gKFNLX1U4KVNLX0xNT0RFX1NUQVRfQVVUT0hBTEY7CisJfQorCQorCS8qIENoZWNrIFBBVVNFIG1pc21hdGNoID8/PyAqLworCS8qIFdlIGFyZSB1c2luZyBJRUVFIDgwMi4zei9ENS4wIFRhYmxlIDM3LTQgKi8KKwlpZiAoKEF1eFN0YXQgJiBQSFlfTV9QU19QQVVTRV9NU0spID09IFBIWV9NX1BTX1BBVVNFX01TSykgeworCQkvKiBTeW1tZXRyaWMgUEFVU0UgKi8KKwkJcFBydC0+UEZsb3dDdHJsU3RhdHVzID0gU0tfRkxPV19TVEFUX1NZTU1FVFJJQzsKKwl9CisJZWxzZSBpZiAoKEF1eFN0YXQgJiBQSFlfTV9QU19QQVVTRV9NU0spID09IFBIWV9NX1BTX1JYX1BfRU4pIHsKKwkJLyogRW5hYmxlIFBBVVNFIHJlY2VpdmUsIGRpc2FibGUgUEFVU0UgdHJhbnNtaXQgKi8KKwkJcFBydC0+UEZsb3dDdHJsU3RhdHVzID0gU0tfRkxPV19TVEFUX1JFTV9TRU5EOworCX0KKwllbHNlIGlmICgoQXV4U3RhdCAmIFBIWV9NX1BTX1BBVVNFX01TSykgPT0gUEhZX01fUFNfVFhfUF9FTikgeworCQkvKiBEaXNhYmxlIFBBVVNFIHJlY2VpdmUsIGVuYWJsZSBQQVVTRSB0cmFuc21pdCAqLworCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfTE9DX1NFTkQ7CisJfQorCWVsc2UgeworCQkvKiBQQVVTRSBtaXNtYXRjaCAtPiBubyBQQVVTRSAqLworCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfTk9ORTsKKwl9CisJCisJLyogc2V0IHVzZWQgbGluayBzcGVlZCAqLworCXN3aXRjaCAoKHVuc2lnbmVkKShBdXhTdGF0ICYgUEhZX01fUFNfU1BFRURfTVNLKSkgeworCWNhc2UgKHVuc2lnbmVkKVBIWV9NX1BTX1NQRUVEXzEwMDA6CisJCXBQcnQtPlBMaW5rU3BlZWRVc2VkID0gKFNLX1U4KVNLX0xTUEVFRF9TVEFUXzEwMDBNQlBTOworCQlicmVhazsKKwljYXNlIFBIWV9NX1BTX1NQRUVEXzEwMDoKKwkJcFBydC0+UExpbmtTcGVlZFVzZWQgPSAoU0tfVTgpU0tfTFNQRUVEX1NUQVRfMTAwTUJQUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcFBydC0+UExpbmtTcGVlZFVzZWQgPSAoU0tfVTgpU0tfTFNQRUVEX1NUQVRfMTBNQlBTOworCX0KKworCXJldHVybihTS19BTkRfT0spOworfQkvKiBTa0dtQXV0b05lZ0RvbmVNYXJ2ICovCisjZW5kaWYgLyogWVVLT04gKi8KKworCisjaWZkZWYgT1RIRVJfUEhZCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbUF1dG9OZWdEb25lTG9uZSgpIC0gQXV0by1uZWdvdGlhdGlvbiBoYW5kbGluZworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBhdXRvLW5lZ290aWF0aW9uIGlmIHRoZSBEb25lIGJpdCBpcyBzZXQuCisgKgorICogUmV0dXJuczoKKyAqCVNLX0FORF9PSwlvLmsuCisgKglTS19BTkRfRFVQX0NBUCAJRHVwbGV4IGNhcGFiaWxpdHkgZXJyb3IgaGFwcGVuZWQKKyAqCVNLX0FORF9PVEhFUiAJT3RoZXIgZXJyb3IgaGFwcGVuZWQKKyAqLworc3RhdGljIGludCBTa1htQXV0b05lZ0RvbmVMb25lKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisJU0tfVTE2CQlSZXNBYjsJCS8qIFJlc29sdmVkIEFiaWxpdHkgKi8KKwlTS19VMTYJCUxQQWI7CQkvKiBMaW5rIFBhcnRuZXIgQWJpbGl0eSAqLworCVNLX1UxNgkJUXVpY2tTdGF0OwkvKiBBdXhpbGlhcnkgU3RhdHVzICovCisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiQXV0b05lZ0RvbmVMb25lLCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwkvKiBHZXQgUEhZIHBhcmFtZXRlcnMgKi8KKwlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0xPTkVfQVVORV9MUCwgJkxQQWIpOworCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTE9ORV8xMDAwVF9TVEFULCAmUmVzQWIpOworCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTE9ORV9RX1NUQVQsICZRdWlja1N0YXQpOworCisJaWYgKChMUEFiICYgUEhZX0xfQU5fUkYpICE9IDApIHsKKwkJLyogUmVtb3RlIGZhdWx0IGJpdCBpcyBzZXQgKi8KKwkJLyogRXJyb3IgKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJBdXRvTmVnRmFpbDogUmVtb3RlIGZhdWx0IGJpdCBzZXQgUG9ydCAlZFxuIiwgUG9ydCkpOworCQlwUHJ0LT5QQXV0b05lZ0ZhaWwgPSBTS19UUlVFOworCQlyZXR1cm4oU0tfQU5EX09USEVSKTsKKwl9CisKKwkvKiBDaGVjayBEdXBsZXggbWlzbWF0Y2ggKi8KKwlpZiAoKFF1aWNrU3RhdCAmIFBIWV9MX1FTX0RVUF9NT0QpICE9IDApIHsKKwkJcFBydC0+UExpbmtNb2RlU3RhdHVzID0gKFNLX1U4KVNLX0xNT0RFX1NUQVRfQVVUT0ZVTEw7CisJfQorCWVsc2UgeworCQlwUHJ0LT5QTGlua01vZGVTdGF0dXMgPSAoU0tfVTgpU0tfTE1PREVfU1RBVF9BVVRPSEFMRjsKKwl9CisJCisJLyogQ2hlY2sgTWFzdGVyL1NsYXZlIHJlc29sdXRpb24gKi8KKwlpZiAoKFJlc0FiICYgUEhZX0xfMTAwMFNfTVNGKSAhPSAwKSB7CisJCS8qIEVycm9yICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiTWFzdGVyL1NsYXZlIEZhdWx0IFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJcFBydC0+UEF1dG9OZWdGYWlsID0gU0tfVFJVRTsKKwkJcFBydC0+UE1TU3RhdHVzID0gU0tfTVNfU1RBVF9GQVVMVDsKKwkJcmV0dXJuKFNLX0FORF9PVEhFUik7CisJfQorCWVsc2UgaWYgKFJlc0FiICYgUEhZX0xfMTAwMFNfTVNSKSB7CisJCXBQcnQtPlBNU1N0YXR1cyA9IFNLX01TX1NUQVRfTUFTVEVSOworCX0KKwllbHNlIHsKKwkJcFBydC0+UE1TU3RhdHVzID0gU0tfTVNfU1RBVF9TTEFWRTsKKwl9CisKKwkvKiBDaGVjayBQQVVTRSBtaXNtYXRjaCAqLworCS8qIFdlIGFyZSB1c2luZyBJRUVFIDgwMi4zei9ENS4wIFRhYmxlIDM3LTQgKi8KKwkvKiB3ZSBtdXN0IG1hbnVhbGx5IHJlc29sdmUgdGhlIGFiaWxpdGllcyBoZXJlICovCisJcFBydC0+UEZsb3dDdHJsU3RhdHVzID0gU0tfRkxPV19TVEFUX05PTkU7CisJCisJc3dpdGNoIChwUHJ0LT5QRmxvd0N0cmxNb2RlKSB7CisJY2FzZSBTS19GTE9XX01PREVfTk9ORToKKwkJLyogZGVmYXVsdCAqLworCQlicmVhazsKKwljYXNlIFNLX0ZMT1dfTU9ERV9MT0NfU0VORDoKKwkJaWYgKChRdWlja1N0YXQgJiAoUEhZX0xfUVNfUEFVU0UgfCBQSFlfTF9RU19BU19QQVVTRSkpID09CisJCQkoUEhZX0xfUVNfUEFVU0UgfCBQSFlfTF9RU19BU19QQVVTRSkpIHsKKwkJCS8qIERpc2FibGUgUEFVU0UgcmVjZWl2ZSwgZW5hYmxlIFBBVVNFIHRyYW5zbWl0ICovCisJCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfTE9DX1NFTkQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTS19GTE9XX01PREVfU1lNTUVUUklDOgorCQlpZiAoKFF1aWNrU3RhdCAmIFBIWV9MX1FTX1BBVVNFKSAhPSAwKSB7CisJCQkvKiBTeW1tZXRyaWMgUEFVU0UgKi8KKwkJCXBQcnQtPlBGbG93Q3RybFN0YXR1cyA9IFNLX0ZMT1dfU1RBVF9TWU1NRVRSSUM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTS19GTE9XX01PREVfU1lNX09SX1JFTToKKwkJaWYgKChRdWlja1N0YXQgJiAoUEhZX0xfUVNfUEFVU0UgfCBQSFlfTF9RU19BU19QQVVTRSkpID09CisJCQlQSFlfTF9RU19BU19QQVVTRSkgeworCQkJLyogRW5hYmxlIFBBVVNFIHJlY2VpdmUsIGRpc2FibGUgUEFVU0UgdHJhbnNtaXQgKi8KKwkJCXBQcnQtPlBGbG93Q3RybFN0YXR1cyA9IFNLX0ZMT1dfU1RBVF9SRU1fU0VORDsKKwkJfQorCQllbHNlIGlmICgoUXVpY2tTdGF0ICYgUEhZX0xfUVNfUEFVU0UpICE9IDApIHsKKwkJCS8qIFN5bW1ldHJpYyBQQVVTRSAqLworCQkJcFBydC0+UEZsb3dDdHJsU3RhdHVzID0gU0tfRkxPV19TVEFUX1NZTU1FVFJJQzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9IV0lfRTAxNiwKKwkJCVNLRVJSX0hXSV9FMDE2TVNHKTsKKwl9CisJCisJcmV0dXJuKFNLX0FORF9PSyk7Cit9CS8qIFNrWG1BdXRvTmVnRG9uZUxvbmUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbUF1dG9OZWdEb25lTmF0KCkgLSBBdXRvLW5lZ290aWF0aW9uIGhhbmRsaW5nCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGF1dG8tbmVnb3RpYXRpb24gaWYgdGhlIERvbmUgYml0IGlzIHNldC4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQU5EX09LCW8uay4KKyAqCVNLX0FORF9EVVBfQ0FQIAlEdXBsZXggY2FwYWJpbGl0eSBlcnJvciBoYXBwZW5lZAorICoJU0tfQU5EX09USEVSIAlPdGhlciBlcnJvciBoYXBwZW5lZAorICovCitzdGF0aWMgaW50IFNrWG1BdXRvTmVnRG9uZU5hdCgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisvKiB0b2RvOiBOYXRpb25hbCAqLworCXJldHVybihTS19BTkRfT0spOworfQkvKiBTa1htQXV0b05lZ0RvbmVOYXQgKi8KKyNlbmRpZiAvKiBPVEhFUl9QSFkgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNBdXRvTmVnRG9uZSgpIC0gQXV0by1uZWdvdGlhdGlvbiBoYW5kbGluZworICoKKyAqIERlc2NyaXB0aW9uOgljYWxscyB0aGUgYXV0by1uZWdvdGlhdGlvbiBkb25lIHJvdXRpbmVzIGRlcC4gb24gYm9hcmQgdHlwZQorICoKKyAqIFJldHVybnM6CisgKglTS19BTkRfT0sJby5rLgorICoJU0tfQU5EX0RVUF9DQVAgCUR1cGxleCBjYXBhYmlsaXR5IGVycm9yIGhhcHBlbmVkCisgKglTS19BTkRfT1RIRVIgCU90aGVyIGVycm9yIGhhcHBlbmVkCisgKi8KK2ludAlTa01hY0F1dG9OZWdEb25lKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisJaW50CVJ0djsKKworCVJ0diA9IFNLX0FORF9PSzsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQorCQlzd2l0Y2ggKHBQcnQtPlBoeVR5cGUpIHsKKwkJCisJCWNhc2UgU0tfUEhZX1hNQUM6CisJCQlSdHYgPSBTa1htQXV0b05lZ0RvbmVYbWFjKHBBQywgSW9DLCBQb3J0KTsKKwkJCWJyZWFrOworCQljYXNlIFNLX1BIWV9CQ09NOgorCQkJUnR2ID0gU2tYbUF1dG9OZWdEb25lQmNvbShwQUMsIElvQywgUG9ydCk7CisJCQlicmVhazsKKyNpZmRlZiBPVEhFUl9QSFkKKwkJY2FzZSBTS19QSFlfTE9ORToKKwkJCVJ0diA9IFNrWG1BdXRvTmVnRG9uZUxvbmUocEFDLCBJb0MsIFBvcnQpOworCQkJYnJlYWs7CisJCWNhc2UgU0tfUEhZX05BVDoKKwkJCVJ0diA9IFNrWG1BdXRvTmVnRG9uZU5hdChwQUMsIElvQywgUG9ydCk7CisJCQlicmVhazsKKyNlbmRpZiAvKiBPVEhFUl9QSFkgKi8KKwkJZGVmYXVsdDoKKwkJCXJldHVybihTS19BTkRfT1RIRVIpOworCQl9CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkKKwkJUnR2ID0gU2tHbUF1dG9OZWdEb25lTWFydihwQUMsIElvQywgUG9ydCk7CisJfQorI2VuZGlmIC8qIFlVS09OICovCisJCisJaWYgKFJ0diAhPSBTS19BTkRfT0spIHsKKwkJcmV0dXJuKFJ0dik7CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIkF1dG9OZWcgZG9uZSBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCisJLyogV2UgY2hlY2tlZCBldmVyeXRoaW5nIGFuZCBtYXkgbm93IGVuYWJsZSB0aGUgbGluayAqLworCXBQcnQtPlBBdXRvTmVnRmFpbCA9IFNLX0ZBTFNFOworCisJU2tNYWNSeFR4RW5hYmxlKHBBQywgSW9DLCBQb3J0KTsKKwkKKwlyZXR1cm4oU0tfQU5EX09LKTsKK30JLyogU2tNYWNBdXRvTmVnRG9uZSAqLworCisKKyNpZmRlZiBHRU5FU0lTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbVNldFJ4VHhFbigpIC0gU3BlY2lhbCBTZXQgUngvVHggRW5hYmxlIGFuZCBzb21lIGZlYXR1cmVzIGluIFhNQUMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICBzZXRzIE1BQyBvciBQSFkgTG9vcEJhY2sgYW5kIER1cGxleCBNb2RlIGluIHRoZSBNTVUgQ29tbWFuZCBSZWcuCisgKiAgZW5hYmxlcyBSeC9UeAorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBTa1htU2V0UnhUeEVuKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK2ludAkJUGFyYSkJCS8qIFBhcmFtZXRlciB0byBzZXQ6IE1BQyBvciBQSFkgTG9vcEJhY2ssIER1cGxleCBNb2RlICovCit7CisJU0tfVTE2CVdvcmQ7CisKKwlYTV9JTjE2KElvQywgUG9ydCwgWE1fTU1VX0NNRCwgJldvcmQpOworCisJc3dpdGNoIChQYXJhICYgKFNLX01BQ19MT09QQl9PTiB8IFNLX01BQ19MT09QQl9PRkYpKSB7CisJY2FzZSBTS19NQUNfTE9PUEJfT046CisJCVdvcmQgfD0gWE1fTU1VX01BQ19MQjsKKwkJYnJlYWs7CisJY2FzZSBTS19NQUNfTE9PUEJfT0ZGOgorCQlXb3JkICY9IH5YTV9NTVVfTUFDX0xCOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKFBhcmEgJiAoU0tfUEhZX0xPT1BCX09OIHwgU0tfUEhZX0xPT1BCX09GRikpIHsKKwljYXNlIFNLX1BIWV9MT09QQl9PTjoKKwkJV29yZCB8PSBYTV9NTVVfR01JSV9MT09QOworCQlicmVhazsKKwljYXNlIFNLX1BIWV9MT09QQl9PRkY6CisJCVdvcmQgJj0gflhNX01NVV9HTUlJX0xPT1A7CisJCWJyZWFrOworCX0KKwkKKwlzd2l0Y2ggKFBhcmEgJiAoU0tfUEhZX0ZVTExEX09OIHwgU0tfUEhZX0ZVTExEX09GRikpIHsKKwljYXNlIFNLX1BIWV9GVUxMRF9PTjoKKwkJV29yZCB8PSBYTV9NTVVfR01JSV9GRDsKKwkJYnJlYWs7CisJY2FzZSBTS19QSFlfRlVMTERfT0ZGOgorCQlXb3JkICY9IH5YTV9NTVVfR01JSV9GRDsKKwkJYnJlYWs7CisJfQorCQorCVhNX09VVDE2KElvQywgUG9ydCwgWE1fTU1VX0NNRCwgV29yZCB8IFhNX01NVV9FTkFfUlggfCBYTV9NTVVfRU5BX1RYKTsKKworCS8qIGR1bW15IHJlYWQgdG8gZW5zdXJlIHdyaXRpbmcgKi8KKwlYTV9JTjE2KElvQywgUG9ydCwgWE1fTU1VX0NNRCwgJldvcmQpOworCit9CS8qIFNrWG1TZXRSeFR4RW4gKi8KKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKworI2lmZGVmIFlVS09OCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHbVNldFJ4VHhFbigpIC0gU3BlY2lhbCBTZXQgUngvVHggRW5hYmxlIGFuZCBzb21lIGZlYXR1cmVzIGluIEdNQUMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICBzZXRzIE1BQyBMb29wQmFjayBhbmQgRHVwbGV4IE1vZGUgaW4gdGhlIEdlbmVyYWwgUHVycG9zZSBDb250cm9sIFJlZy4KKyAqICBlbmFibGVzIFJ4L1R4CisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIFNrR21TZXRSeFR4RW4oCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworaW50CQlQYXJhKQkJLyogUGFyYW1ldGVyIHRvIHNldDogTUFDIExvb3BCYWNrLCBEdXBsZXggTW9kZSAqLworeworCVNLX1UxNglDdHJsOworCQorCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9HUF9DVFJMLCAmQ3RybCk7CisKKwlzd2l0Y2ggKFBhcmEgJiAoU0tfTUFDX0xPT1BCX09OIHwgU0tfTUFDX0xPT1BCX09GRikpIHsKKwljYXNlIFNLX01BQ19MT09QQl9PTjoKKwkJQ3RybCB8PSBHTV9HUENSX0xPT1BfRU5BOworCQlicmVhazsKKwljYXNlIFNLX01BQ19MT09QQl9PRkY6CisJCUN0cmwgJj0gfkdNX0dQQ1JfTE9PUF9FTkE7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoUGFyYSAmIChTS19QSFlfRlVMTERfT04gfCBTS19QSFlfRlVMTERfT0ZGKSkgeworCWNhc2UgU0tfUEhZX0ZVTExEX09OOgorCQlDdHJsIHw9IEdNX0dQQ1JfRFVQX0ZVTEw7CisJCWJyZWFrOworCWNhc2UgU0tfUEhZX0ZVTExEX09GRjoKKwkJQ3RybCAmPSB+R01fR1BDUl9EVVBfRlVMTDsKKwkJYnJlYWs7CisJfQorCQorICAgIEdNX09VVDE2KElvQywgUG9ydCwgR01fR1BfQ1RSTCwgKFNLX1UxNikoQ3RybCB8IEdNX0dQQ1JfUlhfRU5BIHwKKwkJR01fR1BDUl9UWF9FTkEpKTsKKworCS8qIGR1bW15IHJlYWQgdG8gZW5zdXJlIHdyaXRpbmcgKi8KKwlHTV9JTjE2KElvQywgUG9ydCwgR01fR1BfQ1RSTCwgJkN0cmwpOworCit9CS8qIFNrR21TZXRSeFR4RW4gKi8KKyNlbmRpZiAvKiBZVUtPTiAqLworCisKKyNpZm5kZWYgU0tfU0xJTQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrTWFjU2V0UnhUeEVuKCkgLSBTcGVjaWFsIFNldCBSeC9UeCBFbmFibGUgYW5kIHBhcmFtZXRlcnMKKyAqCisgKiBEZXNjcmlwdGlvbjoJY2FsbHMgdGhlIFNwZWNpYWwgU2V0IFJ4L1R4IEVuYWJsZSByb3V0aW5lcyBkZXAuIG9uIGJvYXJkIHR5cGUKKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLwordm9pZCBTa01hY1NldFJ4VHhFbigKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitpbnQJCVBhcmEpCit7CisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQorCQlTa1htU2V0UnhUeEVuKHBBQywgSW9DLCBQb3J0LCBQYXJhKTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCQorCQlTa0dtU2V0UnhUeEVuKHBBQywgSW9DLCBQb3J0LCBQYXJhKTsKKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworfQkvKiBTa01hY1NldFJ4VHhFbiAqLworI2VuZGlmIC8qICFTS19TTElNICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrTWFjUnhUeEVuYWJsZSgpIC0gRW5hYmxlIFJ4L1R4IGFjdGl2aXR5IGlmIHBvcnQgaXMgdXAKKyAqCisgKiBEZXNjcmlwdGlvbjoJZW5hYmxlcyBSeC9UeCBkZXAuIG9uIGJvYXJkIHR5cGUKKyAqCisgKiBSZXR1cm5zOgorICoJMAlvLmsuCisgKgkhPSAwCUVycm9yIGhhcHBlbmVkCisgKi8KK2ludCBTa01hY1J4VHhFbmFibGUoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19VMTYJCVJlZzsJCS8qIDE2LWJpdCByZWdpc3RlciB2YWx1ZSAqLworCVNLX1UxNgkJSW50TWFzazsJLyogTUFDIGludGVycnVwdCBtYXNrICovCisjaWZkZWYgR0VORVNJUworCVNLX1UxNgkJU1dvcmQ7CisjZW5kaWYKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJaWYgKCFwUHJ0LT5QSFdMaW5rVXApIHsKKwkJLyogVGhlIEhhcmR3YXJlIGxpbmsgaXMgTk9UIHVwICovCisJCXJldHVybigwKTsKKwl9CisKKwlpZiAoKHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9BVVRPSEFMRiB8fAorCSAgICAgcFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0FVVE9GVUxMIHx8CisJICAgICBwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfQVVUT0JPVEgpICYmCisJICAgICBwUHJ0LT5QQXV0b05lZ0ZhaWwpIHsKKwkJLyogQXV0by1uZWdvdGlhdGlvbiBpcyBub3QgZG9uZSBvciBmYWlsZWQgKi8KKwkJcmV0dXJuKDApOworCX0KKworI2lmZGVmIEdFTkVTSVMKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkvKiBzZXQgRHVwbGV4IE1vZGUgYW5kIFBhdXNlIE1vZGUgKi8KKwkJU2tYbUluaXREdXBNZChwQUMsIElvQywgUG9ydCk7CisJCQorCQlTa1htSW5pdFBhdXNlTWQocEFDLCBJb0MsIFBvcnQpOworCQorCQkvKgorCQkgKiBJbml0aWFsaXplIHRoZSBJbnRlcnJ1cHQgTWFzayBSZWdpc3Rlci4gRGVmYXVsdCBJUlFzIGFyZS4uLgorCQkgKgktIExpbmsgQXN5bmNocm9ub3VzIEV2ZW50CisJCSAqCS0gTGluayBQYXJ0bmVyIHJlcXVlc3RzIGNvbmZpZworCQkgKgktIEF1dG8gTmVnb3RpYXRpb24gRG9uZQorCQkgKgktIFJ4IENvdW50ZXIgRXZlbnQgT3ZlcmZsb3cKKwkJICoJLSBUeCBDb3VudGVyIEV2ZW50IE92ZXJmbG93CisJCSAqCS0gVHJhbnNtaXQgRklGTyBVbmRlcnJ1bgorCQkgKi8KKwkJSW50TWFzayA9IFhNX0RFRl9NU0s7CisKKyNpZmRlZiBERUJVRworCQkvKiBhZGQgSVJRIGZvciBSZWNlaXZlIEZJRk8gT3ZlcmZsb3cgKi8KKwkJSW50TWFzayAmPSB+WE1fSVNfUlhGX09WOworI2VuZGlmIC8qIERFQlVHICovCisJCQorCQlpZiAocFBydC0+UGh5VHlwZSAhPSBTS19QSFlfWE1BQykgeworCQkJLyogZGlzYWJsZSBHUDAgaW50ZXJydXB0IGJpdCAqLworCQkJSW50TWFzayB8PSBYTV9JU19JTlBfQVNTOworCQl9CisJCVhNX09VVDE2KElvQywgUG9ydCwgWE1fSU1TSywgSW50TWFzayk7CisJCisJCS8qIGdldCBNTVUgQ29tbWFuZCBSZWcuICovCisJCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9NTVVfQ01ELCAmUmVnKTsKKwkJCisJCWlmIChwUHJ0LT5QaHlUeXBlICE9IFNLX1BIWV9YTUFDICYmCisJCQkocFBydC0+UExpbmtNb2RlU3RhdHVzID09IFNLX0xNT0RFX1NUQVRfRlVMTCB8fAorCQkJIHBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9PSBTS19MTU9ERV9TVEFUX0FVVE9GVUxMKSkgeworCQkJLyogc2V0IHRvIEZ1bGwgRHVwbGV4ICovCisJCQlSZWcgfD0gWE1fTU1VX0dNSUlfRkQ7CisJCX0KKwkJCisJCXN3aXRjaCAocFBydC0+UGh5VHlwZSkgeworCQljYXNlIFNLX1BIWV9CQ09NOgorCQkJLyoKKwkJCSAqIFdvcmthcm91bmQgQkNPTSBFcnJhdGEgKCMxMDUyMykgZm9yIGFsbCBCQ29tIFBoeXMKKwkJCSAqIEVuYWJsZSBQb3dlciBNYW5hZ2VtZW50IGFmdGVyIGxpbmsgdXAKKwkJCSAqLworCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVWF9DVFJMLCAmU1dvcmQpOworCQkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCwKKwkJCQkoU0tfVTE2KShTV29yZCAmIH5QSFlfQl9BQ19ESVNfUE0pKTsKKyAgICAgICAgICAgIFNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fSU5UX01BU0ssCisJCQkJKFNLX1UxNilQSFlfQl9ERUZfTVNLKTsKKwkJCWJyZWFrOworI2lmZGVmIE9USEVSX1BIWQorCQljYXNlIFNLX1BIWV9MT05FOgorCQkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTE9ORV9JTlRfRU5BQiwgUEhZX0xfREVGX01TSyk7CisJCQlicmVhazsKKwkJY2FzZSBTS19QSFlfTkFUOgorCQkJLyogdG9kbyBOYXRpb25hbDoKKwkJCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX05BVF9JTlRfTUFTSywgUEhZX05fREVGX01TSyk7ICovCisJCQkvKiBubyBpbnRlcnJ1cHRzIHBvc3NpYmxlIGZyb20gTmF0aW9uYWwgPz8/ICovCisJCQlicmVhazsKKyNlbmRpZiAvKiBPVEhFUl9QSFkgKi8KKwkJfQorCQkKKwkJLyogZW5hYmxlIFJ4L1R4ICovCisJCVhNX09VVDE2KElvQywgUG9ydCwgWE1fTU1VX0NNRCwgUmVnIHwgWE1fTU1VX0VOQV9SWCB8IFhNX01NVV9FTkFfVFgpOworCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSB0aGUgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIuIERlZmF1bHQgSVJRcyBhcmUuLi4KKwkJICoJLSBSeCBDb3VudGVyIEV2ZW50IE92ZXJmbG93CisJCSAqCS0gVHggQ291bnRlciBFdmVudCBPdmVyZmxvdworCQkgKgktIFRyYW5zbWl0IEZJRk8gVW5kZXJydW4KKwkJICovCisJCUludE1hc2sgPSBHTUFDX0RFRl9NU0s7CisKKyNpZmRlZiBERUJVRworCQkvKiBhZGQgSVJRIGZvciBSZWNlaXZlIEZJRk8gT3ZlcnJ1biAqLworCQlJbnRNYXNrIHw9IEdNX0lTX1JYX0ZGX09SOworI2VuZGlmIC8qIERFQlVHICovCisJCQorCQlTS19PVVQ4KElvQywgR01BQ19JUlFfTVNLLCAoU0tfVTgpSW50TWFzayk7CisJCQorCQkvKiBnZXQgR2VuZXJhbCBQdXJwb3NlIENvbnRyb2wgKi8KKwkJR01fSU4xNihJb0MsIFBvcnQsIEdNX0dQX0NUUkwsICZSZWcpOworCQkKKwkJaWYgKHBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9PSBTS19MTU9ERV9TVEFUX0ZVTEwgfHwKKwkJCXBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9PSBTS19MTU9ERV9TVEFUX0FVVE9GVUxMKSB7CisJCQkvKiBzZXQgdG8gRnVsbCBEdXBsZXggKi8KKwkJCVJlZyB8PSBHTV9HUENSX0RVUF9GVUxMOworCQl9CisJCQorCQkvKiBlbmFibGUgUngvVHggKi8KKyAgICAgICAgR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9HUF9DVFJMLCAoU0tfVTE2KShSZWcgfCBHTV9HUENSX1JYX0VOQSB8CisJCQlHTV9HUENSX1RYX0VOQSkpOworCisjaWZuZGVmIFZDUFUKKwkJLyogRW5hYmxlIGFsbCBQSFkgaW50ZXJydXB0cyAqLworICAgICAgICBTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLAorCQkJKFNLX1UxNilQSFlfTV9ERUZfTVNLKTsKKyNlbmRpZiAvKiBWQ1BVICovCisJfQorI2VuZGlmIC8qIFlVS09OICovCisJCQkJCQorCXJldHVybigwKTsKKworfQkvKiBTa01hY1J4VHhFbmFibGUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNSeFR4RGlzYWJsZSgpIC0gRGlzYWJsZSBSZWNlaXZlciBhbmQgVHJhbnNtaXR0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoJZGlzYWJsZXMgUngvVHggZGVwLiBvbiBib2FyZCB0eXBlCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3ZvaWQgU2tNYWNSeFR4RGlzYWJsZSgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfVTE2CVdvcmQ7CisKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCisJCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9NTVVfQ01ELCAmV29yZCk7CisJCQorCQlYTV9PVVQxNihJb0MsIFBvcnQsIFhNX01NVV9DTUQsIFdvcmQgJiB+KFhNX01NVV9FTkFfUlggfCBYTV9NTVVfRU5BX1RYKSk7CisJCisJCS8qIGR1bW15IHJlYWQgdG8gZW5zdXJlIHdyaXRpbmcgKi8KKwkJWE1fSU4xNihJb0MsIFBvcnQsIFhNX01NVV9DTUQsICZXb3JkKTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCQorCQlHTV9JTjE2KElvQywgUG9ydCwgR01fR1BfQ1RSTCwgJldvcmQpOworCisgICAgICAgIEdNX09VVDE2KElvQywgUG9ydCwgR01fR1BfQ1RSTCwgKFNLX1UxNikoV29yZCAmIH4oR01fR1BDUl9SWF9FTkEgfAorCQkJR01fR1BDUl9UWF9FTkEpKSk7CisKKwkJLyogZHVtbXkgcmVhZCB0byBlbnN1cmUgd3JpdGluZyAqLworCQlHTV9JTjE2KElvQywgUG9ydCwgR01fR1BfQ1RSTCwgJldvcmQpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCit9CS8qIFNrTWFjUnhUeERpc2FibGUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNJcnFEaXNhYmxlKCkgLSBEaXNhYmxlIElSUSBmcm9tIE1BQworICoKKyAqIERlc2NyaXB0aW9uOglzZXRzIHRoZSBJUlEtbWFzayB0byBkaXNhYmxlIElSUSBkZXAuIG9uIGJvYXJkIHR5cGUKKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLwordm9pZCBTa01hY0lycURpc2FibGUoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKyNpZmRlZiBHRU5FU0lTCisJU0tfVTE2CQlXb3JkOworI2VuZGlmCisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworI2lmZGVmIEdFTkVTSVMKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkKKwkJLyogZGlzYWJsZSBhbGwgWE1BQyBJUlFzICovCisJCVhNX09VVDE2KElvQywgUG9ydCwgWE1fSU1TSywgMHhmZmZmKTsJCisJCQorCQkvKiBEaXNhYmxlIGFsbCBQSFkgaW50ZXJydXB0cyAqLworCQlzd2l0Y2ggKHBQcnQtPlBoeVR5cGUpIHsKKwkJCWNhc2UgU0tfUEhZX0JDT006CisJCQkJLyogTWFrZSBzdXJlIHRoYXQgUEhZIGlzIGluaXRpYWxpemVkICovCisJCQkJaWYgKHBQcnQtPlBTdGF0ZSAhPSBTS19QUlRfUkVTRVQpIHsKKwkJCQkJLyogTk9UIGFsbG93ZWQgaWYgQkNPTSBpcyBpbiBSRVNFVCBzdGF0ZSAqLworCQkJCQkvKiBXb3JrYXJvdW5kIEJDT00gRXJyYXRhICgjMTA1MjMpIGFsbCBCQ29tICovCisJCQkJCS8qIERpc2FibGUgUG93ZXIgTWFuYWdlbWVudCBpZiBsaW5rIGlzIGRvd24gKi8KKwkJCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVWF9DVFJMLCAmV29yZCk7CisJCQkJCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVYX0NUUkwsCisJCQkJCQkoU0tfVTE2KShXb3JkIHwgUEhZX0JfQUNfRElTX1BNKSk7CisJCQkJCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fSU5UX01BU0ssIDB4ZmZmZik7CisJCQkJfQorCQkJCWJyZWFrOworI2lmZGVmIE9USEVSX1BIWQorCQkJY2FzZSBTS19QSFlfTE9ORToKKwkJCQlTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9MT05FX0lOVF9FTkFCLCAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0tfUEhZX05BVDoKKwkJCQkvKiB0b2RvOiBOYXRpb25hbAorCQkJCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX05BVF9JTlRfTUFTSywgMHhmZmZmKTsgKi8KKwkJCQlicmVhazsKKyNlbmRpZiAvKiBPVEhFUl9QSFkgKi8KKwkJfQorCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJLyogZGlzYWJsZSBhbGwgR01BQyBJUlFzICovCisJCVNLX09VVDgoSW9DLCBHTUFDX0lSUV9NU0ssIDApOworCQkKKyNpZm5kZWYgVkNQVQorCQkvKiBEaXNhYmxlIGFsbCBQSFkgaW50ZXJydXB0cyAqLworCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLCAwKTsKKyNlbmRpZiAvKiBWQ1BVICovCisJfQorI2VuZGlmIC8qIFlVS09OICovCisKK30JLyogU2tNYWNJcnFEaXNhYmxlICovCisKKworI2lmZGVmIFNLX0RJQUcKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htU2VuZENvbnQoKSAtIEVuYWJsZSAvIERpc2FibGUgU2VuZCBDb250aW51b3VzIE1vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjoJZW5hYmxlIC8gZGlzYWJsZSBTZW5kIENvbnRpbnVvdXMgTW9kZSBvbiBYTUFDCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa1htU2VuZENvbnQoCitTS19BQwkqcEFDLAkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfQk9PTAlFbmFibGUpCS8qIEVuYWJsZSAvIERpc2FibGUgKi8KK3sKKwlTS19VMzIJTWRSZWc7CisKKwlYTV9JTjMyKElvQywgUG9ydCwgWE1fTU9ERSwgJk1kUmVnKTsKKworCWlmIChFbmFibGUpIHsKKwkJTWRSZWcgfD0gWE1fTURfVFhfQ09OVDsKKwl9CisJZWxzZSB7CisJCU1kUmVnICY9IH5YTV9NRF9UWF9DT05UOworCX0KKwkvKiBzZXR1cCBNb2RlIFJlZ2lzdGVyICovCisJWE1fT1VUMzIoSW9DLCBQb3J0LCBYTV9NT0RFLCBNZFJlZyk7CisKK30JLyogU2tYbVNlbmRDb250ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrTWFjVGltZVN0YW1wKCkgLSBFbmFibGUgLyBEaXNhYmxlIFRpbWUgU3RhbXAKKyAqCisgKiBEZXNjcmlwdGlvbjoJZW5hYmxlIC8gZGlzYWJsZSBUaW1lIFN0YW1wIGdlbmVyYXRpb24gZm9yIFJ4IHBhY2tldHMKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrTWFjVGltZVN0YW1wKAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK1NLX0JPT0wJRW5hYmxlKQkvKiBFbmFibGUgLyBEaXNhYmxlICovCit7CisJU0tfVTMyCU1kUmVnOworCVNLX1U4CVRpbWVDdHJsOworCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKworCQlYTV9JTjMyKElvQywgUG9ydCwgWE1fTU9ERSwgJk1kUmVnKTsKKworCQlpZiAoRW5hYmxlKSB7CisJCQlNZFJlZyB8PSBYTV9NRF9BVFM7CisJCX0KKwkJZWxzZSB7CisJCQlNZFJlZyAmPSB+WE1fTURfQVRTOworCQl9CisJCS8qIHNldHVwIE1vZGUgUmVnaXN0ZXIgKi8KKwkJWE1fT1VUMzIoSW9DLCBQb3J0LCBYTV9NT0RFLCBNZFJlZyk7CisJfQorCWVsc2UgeworCQlpZiAoRW5hYmxlKSB7CisJCQlUaW1lQ3RybCA9IEdNVF9TVF9TVEFSVCB8IEdNVF9TVF9DTFJfSVJROworCQl9CisJCWVsc2UgeworCQkJVGltZUN0cmwgPSBHTVRfU1RfU1RPUCB8IEdNVF9TVF9DTFJfSVJROworCQl9CisJCS8qIFN0YXJ0L1N0b3AgVGltZSBTdGFtcCBUaW1lciAqLworCQlTS19PVVQ4KElvQywgR01BQ19USV9TVF9DVFJMLCBUaW1lQ3RybCk7CisJfQorCit9CS8qIFNrTWFjVGltZVN0YW1wKi8KKworI2Vsc2UgLyogIVNLX0RJQUcgKi8KKworI2lmZGVmIEdFTkVTSVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htQXV0b05lZ0xpcGFYbWFjKCkgLSBEZWNpZGVzIHdoZXRoZXIgTGluayBQYXJ0bmVyIGNvdWxkIGRvIGF1dG8tbmVnCisgKgorICoJVGhpcyBmdW5jdGlvbiBhbmFseXNlcyB0aGUgSW50ZXJydXB0IHN0YXR1cyB3b3JkLiBJZiBhbnkgb2YgdGhlCisgKglBdXRvLW5lZ290aWF0aW5nIGludGVycnVwdCBiaXRzIGFyZSBzZXQsIHRoZSBQTGlwYUF1dG9OZWcgdmFyaWFibGUKKyAqCWlzIHNldCB0cnVlLgorICovCit2b2lkIFNrWG1BdXRvTmVnTGlwYVhtYWMoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfVTE2CUlTdGF0dXMpCS8qIEludGVycnVwdCBTdGF0dXMgd29yZCB0byBhbmFseXNlICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAocFBydC0+UExpcGFBdXRvTmVnICE9IFNLX0xJUEFfQVVUTyAmJgorCQkoSVN0YXR1cyAmIChYTV9JU19MSVBBX1JDIHwgWE1fSVNfUlhfUEFHRSB8IFhNX0lTX0FORCkpICE9IDApIHsKKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkF1dG9OZWdMaXBhOiBBdXRvTmVnIGRldGVjdGVkIG9uIFBvcnQgJWQsIElTdGF0dXM9MHglMDRYXG4iLAorCQkJUG9ydCwgSVN0YXR1cykpOworCQlwUHJ0LT5QTGlwYUF1dG9OZWcgPSBTS19MSVBBX0FVVE87CisJfQorfQkvKiBTa1htQXV0b05lZ0xpcGFYbWFjICovCisjZW5kaWYgLyogR0VORVNJUyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa01hY0F1dG9OZWdMaXBhUGh5KCkgLSBEZWNpZGVzIHdoZXRoZXIgTGluayBQYXJ0bmVyIGNvdWxkIGRvIGF1dG8tbmVnCisgKgorICoJVGhpcyBmdW5jdGlvbiBhbmFseXNlcyB0aGUgUEhZIHN0YXR1cyB3b3JkLgorICogIElmIGFueSBvZiB0aGUgQXV0by1uZWdvdGlhdGluZyBiaXRzIGFyZSBzZXQsIHRoZSBQTGlwYUF1dG9OZWcgdmFyaWFibGUKKyAqCWlzIHNldCB0cnVlLgorICovCit2b2lkIFNrTWFjQXV0b05lZ0xpcGFQaHkoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfVTE2CVBoeVN0YXQpCS8qIFBIWSBTdGF0dXMgd29yZCB0byBhbmFseXNlICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAocFBydC0+UExpcGFBdXRvTmVnICE9IFNLX0xJUEFfQVVUTyAmJgorCQkoUGh5U3RhdCAmIFBIWV9TVF9BTl9PVkVSKSAhPSAwKSB7CisKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJBdXRvTmVnTGlwYTogQXV0b05lZyBkZXRlY3RlZCBvbiBQb3J0ICVkLCBQaHlTdGF0PTB4JTA0WFxuIiwKKwkJCVBvcnQsIFBoeVN0YXQpKTsKKwkJcFBydC0+UExpcGFBdXRvTmVnID0gU0tfTElQQV9BVVRPOworCX0KK30JLyogU2tNYWNBdXRvTmVnTGlwYVBoeSAqLworCisKKyNpZmRlZiBHRU5FU0lTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbUlycSgpIC0gSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZQorICoKKyAqIERlc2NyaXB0aW9uOglzZXJ2aWNlcyBhbiBJbnRlcnJ1cHQgUmVxdWVzdCBvZiB0aGUgWE1BQworICoKKyAqIE5vdGU6CisgKglXaXRoIGFuIGV4dGVybmFsIFBIWSwgc29tZSBpbnRlcnJ1cHQgYml0cyBhcmUgbm90IG1lYW5pbmdmdWxsIGFueSBtb3JlOgorICoJLSBMaW5rQXN5bmNFdmVudCAoYml0ICMxNCkgICAgICAgICAgICAgIFhNX0lTX0xOS19BRQorICoJLSBMaW5rUGFydG5lclJlcUNvbmZpZyAoYml0ICMxMCkJWE1fSVNfTElQQV9SQworICoJLSBQYWdlIFJlY2VpdmVkIChiaXQgIzkpCQlYTV9JU19SWF9QQUdFCisgKgktIE5leHRQYWdlTG9hZGVkRm9yWG10IChiaXQgIzgpCQlYTV9JU19UWF9QQUdFCisgKgktIEF1dG9OZWdEb25lIChiaXQgIzcpCQkJWE1fSVNfQU5ECisgKglBbHNvIHByb2JhYmx5IG5vdCB2YWxpZCBhbnkgbW9yZSBpcyB0aGUgR1AwIGlucHV0IGJpdDoKKyAqCS0gR1BSZWdpc3RlckJpdDBzZXQJCQlYTV9JU19JTlBfQVNTCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa1htSXJxKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisJU0tfRVZQQVJBCVBhcmE7CisJU0tfVTE2CQlJU3RhdHVzOwkvKiBJbnRlcnJ1cHQgc3RhdHVzIHJlYWQgZnJvbSB0aGUgWE1BQyAqLworCVNLX1UxNgkJSVN0YXR1czI7CisjaWZkZWYgU0tfU0xJTQorICAgIFNLX1U2NCAgICAgIE92ZXJmbG93U3RhdHVzOworI2VuZGlmCQorCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisJCisJWE1fSU4xNihJb0MsIFBvcnQsIFhNX0lTUkMsICZJU3RhdHVzKTsKKwkKKwkvKiBMaW5rUGFydG5lciBBdXRvLW5lZ2FibGU/ICovCisJaWYgKHBQcnQtPlBoeVR5cGUgPT0gU0tfUEhZX1hNQUMpIHsKKwkJU2tYbUF1dG9OZWdMaXBhWG1hYyhwQUMsIElvQywgUG9ydCwgSVN0YXR1cyk7CisJfQorCWVsc2UgeworCQkvKiBtYXNrIGJpdHMgdGhhdCBhcmUgbm90IHVzZWQgd2l0aCBleHQuIFBIWSAqLworCQlJU3RhdHVzICY9IH4oWE1fSVNfTE5LX0FFIHwgWE1fSVNfTElQQV9SQyB8CisJCQlYTV9JU19SWF9QQUdFIHwgWE1fSVNfVFhfUEFHRSB8CisJCQlYTV9JU19BTkQgfCBYTV9JU19JTlBfQVNTKTsKKwl9CisJCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCSgiWG1hY0lycSBQb3J0ICVkIElzciAweCUwNFhcbiIsIFBvcnQsIElTdGF0dXMpKTsKKworCWlmICghcFBydC0+UEhXTGlua1VwKSB7CisJCS8qIFNwdXJpb3VzIFhNQUMgaW50ZXJydXB0ICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJKCJTa1htSXJxOiBzcHVyaW91cyBpbnRlcnJ1cHQgb24gUG9ydCAlZFxuIiwgUG9ydCkpOworCQlyZXR1cm47CisJfQorCisJaWYgKChJU3RhdHVzICYgWE1fSVNfSU5QX0FTUykgIT0gMCkgeworCQkvKiBSZXJlYWQgSVNSIFJlZ2lzdGVyIGlmIGxpbmsgaXMgbm90IGluIHN5bmMgKi8KKwkJWE1fSU4xNihJb0MsIFBvcnQsIFhNX0lTUkMsICZJU3RhdHVzMik7CisKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkoIlNrWG1JcnE6IExpbmsgYXN5bmMuIERvdWJsZSBjaGVjayBQb3J0ICVkIDB4JTA0WCAweCUwNFhcbiIsCisJCQkgUG9ydCwgSVN0YXR1cywgSVN0YXR1czIpKTsKKwkJSVN0YXR1cyAmPSB+WE1fSVNfSU5QX0FTUzsKKwkJSVN0YXR1cyB8PSBJU3RhdHVzMjsKKwl9CisKKwlpZiAoKElTdGF0dXMgJiBYTV9JU19MTktfQUUpICE9IDApIHsKKwkJLyogbm90IHVzZWQsIEdQMCBpcyB1c2VkIGluc3RlYWQgKi8KKwl9CisKKwlpZiAoKElTdGF0dXMgJiBYTV9JU19UWF9BQk9SVCkgIT0gMCkgeworCQkvKiBub3QgdXNlZCAqLworCX0KKworCWlmICgoSVN0YXR1cyAmIFhNX0lTX0ZSQ19JTlQpICE9IDApIHsKKwkJLyogbm90IHVzZWQsIHVzZSBBU0lDIElSUSBpbnN0ZWFkIGlmIG5lZWRlZCAqLworCX0KKworCWlmICgoSVN0YXR1cyAmIChYTV9JU19JTlBfQVNTIHwgWE1fSVNfTElQQV9SQyB8IFhNX0lTX1JYX1BBR0UpKSAhPSAwKSB7CisJCVNrSFdMaW5rRG93bihwQUMsIElvQywgUG9ydCk7CisKKwkJLyogU2lnbmFsIHRvIFJMTVQgKi8KKwkJUGFyYS5QYXJhMzJbMF0gPSAoU0tfVTMyKVBvcnQ7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCisJCS8qIFN0YXJ0IHdvcmthcm91bmQgRXJyYXRhICMyIHRpbWVyICovCisJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBQcnQtPlBXYVRpbWVyLCBTS19XQV9JTkFfVElNRSwKKwkJCVNLR0VfSFdBQywgU0tfSFdFVl9XQVRJTSwgUGFyYSk7CisJfQorCisJaWYgKChJU3RhdHVzICYgWE1fSVNfUlhfUEFHRSkgIT0gMCkgeworCQkvKiBub3QgdXNlZCAqLworCX0KKworCWlmICgoSVN0YXR1cyAmIFhNX0lTX1RYX1BBR0UpICE9IDApIHsKKwkJLyogbm90IHVzZWQgKi8KKwl9CisKKwlpZiAoKElTdGF0dXMgJiBYTV9JU19BTkQpICE9IDApIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkoIlNrWG1JcnE6IEFORCBvbiBsaW5rIHRoYXQgaXMgdXAgUG9ydCAlZFxuIiwgUG9ydCkpOworCX0KKworCWlmICgoSVN0YXR1cyAmIFhNX0lTX1RTQ19PVikgIT0gMCkgeworCQkvKiBub3QgdXNlZCAqLworCX0KKworCS8qIENvbWJpbmVkIFR4ICYgUnggQ291bnRlciBPdmVyZmxvdyBTSVJRIEV2ZW50ICovCisJaWYgKChJU3RhdHVzICYgKFhNX0lTX1JYQ19PViB8IFhNX0lTX1RYQ19PVikpICE9IDApIHsKKyNpZmRlZiBTS19TTElNCisJCVNrWG1PdmVyZmxvd1N0YXR1cyhwQUMsIElvQywgUG9ydCwgSVN0YXR1cywgJk92ZXJmbG93U3RhdHVzKTsKKyNlbHNlCisJCVBhcmEuUGFyYTMyWzBdID0gKFNLX1UzMilQb3J0OworCQlQYXJhLlBhcmEzMlsxXSA9IChTS19VMzIpSVN0YXR1czsKKwkJU2tQbm1pRXZlbnQocEFDLCBJb0MsIFNLX1BOTUlfRVZUX1NJUlFfT1ZFUkZMT1csIFBhcmEpOworI2VuZGlmIC8qIFNLX1NMSU0gKi8KKwl9CisKKwlpZiAoKElTdGF0dXMgJiBYTV9JU19SWEZfT1YpICE9IDApIHsKKwkJLyogbm9ybWFsIHNpdHVhdGlvbiAtPiBubyBlZmZlY3QgKi8KKyNpZmRlZiBERUJVRworCQlwUHJ0LT5QUnhPdmVyQ250Kys7CisjZW5kaWYgLyogREVCVUcgKi8KKwl9CisKKwlpZiAoKElTdGF0dXMgJiBYTV9JU19UWEZfVVIpICE9IDApIHsKKwkJLyogbWF5IE5PVCBoYXBwZW4gLT4gZXJyb3IgbG9nICovCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfU0lSUV9FMDIwLCBTS0VSUl9TSVJRX0UwMjBNU0cpOworCX0KKworCWlmICgoSVN0YXR1cyAmIFhNX0lTX1RYX0NPTVApICE9IDApIHsKKwkJLyogbm90IHNlcnZlZCBoZXJlICovCisJfQorCisJaWYgKChJU3RhdHVzICYgWE1fSVNfUlhfQ09NUCkgIT0gMCkgeworCQkvKiBub3Qgc2VydmVkIGhlcmUgKi8KKwl9Cit9CS8qIFNrWG1JcnEgKi8KKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKworI2lmZGVmIFlVS09OCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHbUlycSgpIC0gSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZQorICoKKyAqIERlc2NyaXB0aW9uOglzZXJ2aWNlcyBhbiBJbnRlcnJ1cHQgUmVxdWVzdCBvZiB0aGUgR01BQworICoKKyAqIE5vdGU6CisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa0dtSXJxKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisJU0tfVTgJCUlTdGF0dXM7CS8qIEludGVycnVwdCBzdGF0dXMgKi8KKyNpZmRlZiBTS19TTElNCisgICAgU0tfVTY0ICAgICAgT3ZlcmZsb3dTdGF0dXM7CisjZWxzZQorCVNLX0VWUEFSQQlQYXJhOworI2VuZGlmCQorCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisJCisJU0tfSU44KElvQywgR01BQ19JUlFfU1JDLCAmSVN0YXR1cyk7CisJCisjaWZkZWYgWFhYCisJLyogTGlua1BhcnRuZXIgQXV0by1uZWdhYmxlPyAqLworCVNrTWFjQXV0b05lZ0xpcGFQaHkocEFDLCBJb0MsIFBvcnQsIElTdGF0dXMpOworI2VuZGlmIC8qIFhYWCAqLworCQorCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkoIkdtYWNJcnEgUG9ydCAlZCBJc3IgMHglMDRYXG4iLCBQb3J0LCBJU3RhdHVzKSk7CisKKwkvKiBDb21iaW5lZCBUeCAmIFJ4IENvdW50ZXIgT3ZlcmZsb3cgU0lSUSBFdmVudCAqLworCWlmIChJU3RhdHVzICYgKEdNX0lTX1JYX0NPX09WIHwgR01fSVNfVFhfQ09fT1YpKSB7CisJCS8qIHRoZXNlIElSUXMgd2lsbCBiZSBjbGVhcmVkIGJ5IHJlYWRpbmcgR01BQ3MgcmVnaXN0ZXIgKi8KKyNpZmRlZiBTS19TTElNCisgICAgICAgIFNrR21PdmVyZmxvd1N0YXR1cyhwQUMsIElvQywgUG9ydCwgSVN0YXR1cywgJk92ZXJmbG93U3RhdHVzKTsKKyNlbHNlCisJCVBhcmEuUGFyYTMyWzBdID0gKFNLX1UzMilQb3J0OworCQlQYXJhLlBhcmEzMlsxXSA9IChTS19VMzIpSVN0YXR1czsKKwkJU2tQbm1pRXZlbnQocEFDLCBJb0MsIFNLX1BOTUlfRVZUX1NJUlFfT1ZFUkZMT1csIFBhcmEpOworI2VuZGlmCQkKKwl9CisKKwlpZiAoSVN0YXR1cyAmIEdNX0lTX1JYX0ZGX09SKSB7CisJCS8qIGNsZWFyIEdNQUMgUnggRklGTyBPdmVycnVuIElSUSAqLworCQlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBSWF9HTUZfQ1RSTF9UKSwgKFNLX1U4KUdNRl9DTElfUlhfRk8pOworI2lmZGVmIERFQlVHCisJCXBQcnQtPlBSeE92ZXJDbnQrKzsKKyNlbmRpZiAvKiBERUJVRyAqLworCX0KKworCWlmIChJU3RhdHVzICYgR01fSVNfVFhfRkZfVVIpIHsKKwkJLyogY2xlYXIgR01BQyBUeCBGSUZPIFVuZGVycnVuIElSUSAqLworCQlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBUWF9HTUZfQ1RSTF9UKSwgKFNLX1U4KUdNRl9DTElfVFhfRlUpOworCQkvKiBtYXkgTk9UIGhhcHBlbiAtPiBlcnJvciBsb2cgKi8KKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9TSVJRX0UwMjAsIFNLRVJSX1NJUlFfRTAyME1TRyk7CisJfQorCisJaWYgKElTdGF0dXMgJiBHTV9JU19UWF9DT01QTCkgeworCQkvKiBub3Qgc2VydmVkIGhlcmUgKi8KKwl9CisKKwlpZiAoSVN0YXR1cyAmIEdNX0lTX1JYX0NPTVBMKSB7CisJCS8qIG5vdCBzZXJ2ZWQgaGVyZSAqLworCX0KK30JLyogU2tHbUlycSAqLworI2VuZGlmIC8qIFlVS09OICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrTWFjSXJxKCkgLSBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lIGZvciBNQUMKKyAqCisgKiBEZXNjcmlwdGlvbjoJY2FsbHMgdGhlIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUgZGVwLiBvbiBib2FyZCB0eXBlCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa01hY0lycSgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCS8qIElSUSBmcm9tIFhNQUMgKi8KKwkJU2tYbUlycShwQUMsIElvQywgUG9ydCk7CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkvKiBJUlEgZnJvbSBHTUFDICovCisJCVNrR21JcnEocEFDLCBJb0MsIFBvcnQpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCit9CS8qIFNrTWFjSXJxICovCisKKyNlbmRpZiAvKiAhU0tfRElBRyAqLworCisjaWZkZWYgR0VORVNJUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1VcGRhdGVTdGF0cygpIC0gRm9yY2UgdGhlIFhNQUMgdG8gb3V0cHV0IHRoZSBjdXJyZW50IHN0YXRpc3RpYworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIFhNQUMgaG9sZHMgaXRzIHN0YXRpc3RpYyBpbnRlcm5hbGx5LiBUbyBvYnRhaW4gdGhlIGN1cnJlbnQKKyAqCXZhbHVlcyBhIGNvbW1hbmQgbXVzdCBiZSBzZW50IHNvIHRoYXQgdGhlIHN0YXRpc3RpYyBkYXRhIHdpbGwKKyAqCWJlIHdyaXR0ZW4gdG8gYSBwcmVkZWZpbmVkIG1lbW9yeSBhcmVhIG9uIHRoZSBhZGFwdGVyLgorICoKKyAqIFJldHVybnM6CisgKgkwOiAgc3VjY2VzcworICoJMTogIHNvbWV0aGluZyB3ZW50IHdyb25nCisgKi8KK2ludCBTa1htVXBkYXRlU3RhdHMoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLwordW5zaWduZWQgaW50IFBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisJU0tfVTE2CQlTdGF0UmVnOworCWludAkJCVdhaXRJbmRleDsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCVdhaXRJbmRleCA9IDA7CisKKwkvKiBTZW5kIGFuIHVwZGF0ZSBjb21tYW5kIHRvIFhNQUMgc3BlY2lmaWVkICovCisJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9TVEFUX0NNRCwgWE1fU0NfU05QX1RYQyB8IFhNX1NDX1NOUF9SWEMpOworCisJLyoKKwkgKiBJdCBpcyBhbiBhdXRvLWNsZWFyaW5nIHJlZ2lzdGVyLiBJZiB0aGUgY29tbWFuZCBiaXRzCisJICogd2VudCB0byB6ZXJvIGFnYWluLCB0aGUgc3RhdGlzdGljcyBhcmUgdHJhbnNmZXJyZWQuCisJICogTm9ybWFsbHkgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LgorCSAqIEJ1dCBqdXN0IHRvIGJlIHN1cmUgd2UgZXhlY3V0ZSBhIGxvb3AuCisJICovCisJZG8geworCisJCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9TVEFUX0NNRCwgJlN0YXRSZWcpOworCQkKKwkJaWYgKCsrV2FpdEluZGV4ID4gMTApIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9IV0lfRTAyMSwgU0tFUlJfSFdJX0UwMjFNU0cpOworCisJCQlyZXR1cm4oMSk7CisJCX0KKwl9IHdoaWxlICgoU3RhdFJlZyAmIChYTV9TQ19TTlBfVFhDIHwgWE1fU0NfU05QX1JYQykpICE9IDApOworCQorCXJldHVybigwKTsKK30JLyogU2tYbVVwZGF0ZVN0YXRzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1NYWNTdGF0aXN0aWMoKSAtIEdldCBYTUFDIGNvdW50ZXIgdmFsdWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUdldHMgdGhlIDMyYml0IGNvdW50ZXIgdmFsdWUuIEV4Y2VwdCBmb3IgdGhlIG9jdGV0IGNvdW50ZXJzCisgKgl0aGUgbG93ZXIgMzJiaXQgYXJlIGNvdW50ZWQgaW4gaGFyZHdhcmUgYW5kIHRoZSB1cHBlciAzMmJpdAorICoJbXVzdCBiZSBjb3VudGVkIGluIHNvZnR3YXJlIGJ5IG1vbml0b3JpbmcgY291bnRlciBvdmVyZmxvdyBpbnRlcnJ1cHRzLgorICoKKyAqIFJldHVybnM6CisgKgkwOiAgc3VjY2VzcworICoJMTogIHNvbWV0aGluZyB3ZW50IHdyb25nCisgKi8KK2ludCBTa1htTWFjU3RhdGlzdGljKAorU0tfQUMJKnBBQywJCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkJLyogSU8gY29udGV4dCAqLwordW5zaWduZWQgaW50IFBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19VMTYJU3RhdEFkZHIsCQkvKiBNSUIgY291bnRlciBiYXNlIGFkZHJlc3MgKi8KK1NLX1UzMglTS19GQVIgKnBWYWwpCS8qIHB0ciB0byByZXR1cm4gc3RhdGlzdGljIHZhbHVlICovCit7CisJaWYgKChTdGF0QWRkciA8IFhNX1RYRl9PSykgfHwgKFN0YXRBZGRyID4gWE1fUlhGX01BWF9TWikpIHsKKwkJCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMjIsIFNLRVJSX0hXSV9FMDIyTVNHKTsKKwkJCisJCXJldHVybigxKTsKKwl9CisJCisJWE1fSU4zMihJb0MsIFBvcnQsIFN0YXRBZGRyLCBwVmFsKTsKKworCXJldHVybigwKTsKK30JLyogU2tYbU1hY1N0YXRpc3RpYyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htUmVzZXRDb3VudGVyKCkgLSBDbGVhciBNQUMgc3RhdGlzdGljIGNvdW50ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUZvcmNlIHRoZSBYTUFDIHRvIGNsZWFyIGl0cyBzdGF0aXN0aWMgY291bnRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJMDogIHN1Y2Nlc3MKKyAqCTE6ICBzb21ldGhpbmcgd2VudCB3cm9uZworICovCitpbnQgU2tYbVJlc2V0Q291bnRlcigKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCit1bnNpZ25lZCBpbnQgUG9ydCkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVhNX09VVDE2KElvQywgUG9ydCwgWE1fU1RBVF9DTUQsIFhNX1NDX0NMUl9SWEMgfCBYTV9TQ19DTFJfVFhDKTsKKwkvKiBDbGVhciB0d28gdGltZXMgYWNjb3JkaW5nIHRvIEVycmF0YSAjMyAqLworCVhNX09VVDE2KElvQywgUG9ydCwgWE1fU1RBVF9DTUQsIFhNX1NDX0NMUl9SWEMgfCBYTV9TQ19DTFJfVFhDKTsKKworCXJldHVybigwKTsKK30JLyogU2tYbVJlc2V0Q291bnRlciAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htT3ZlcmZsb3dTdGF0dXMoKSAtIEdldHMgdGhlIHN0YXR1cyBvZiBjb3VudGVyIG92ZXJmbG93IGludGVycnVwdAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQ2hlY2tzIHRoZSBzb3VyY2UgY2F1c2luZyBhbiBjb3VudGVyIG92ZXJmbG93IGludGVycnVwdC4gT24gc3VjY2VzcyB0aGUKKyAqCXJlc3VsdGluZyBjb3VudGVyIG92ZXJmbG93IHN0YXR1cyBpcyB3cml0dGVuIHRvIDxwU3RhdHVzPiwgd2hlcmVhcyB0aGUKKyAqCXVwcGVyIGR3b3JkIHN0b3JlcyB0aGUgWE1BQyBSZWNlaXZlQ291bnRlckV2ZW50IHJlZ2lzdGVyIGFuZCB0aGUgbG93ZXIKKyAqCWR3b3JkIHRoZSBYTUFDIFRyYW5zbWl0Q291bnRlckV2ZW50IHJlZ2lzdGVyLgorICoKKyAqIE5vdGU6CisgKglGb3IgWE1BQyB0aGUgaW50ZXJydXB0IHNvdXJjZSBpcyBhIHNlbGYtY2xlYXJpbmcgcmVnaXN0ZXIsIHNvIHRoZSBzb3VyY2UKKyAqCW11c3QgYmUgY2hlY2tlZCBvbmx5IG9uY2UuIFNJUlEgbW9kdWxlIGRvZXMgYW5vdGhlciBjaGVjayB0byBiZSBzdXJlCisgKgl0aGF0IG5vIGludGVycnVwdCBnZXQgbG9zdCBkdXJpbmcgcHJvY2VzcyB0aW1lLgorICoKKyAqIFJldHVybnM6CisgKgkwOiAgc3VjY2VzcworICoJMTogIHNvbWV0aGluZyB3ZW50IHdyb25nCisgKi8KK2ludCBTa1htT3ZlcmZsb3dTdGF0dXMoCitTS19BQwkqcEFDLAkJCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkJCS8qIElPIGNvbnRleHQgKi8KK3Vuc2lnbmVkIGludCBQb3J0LAkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK1NLX1UxNglJU3RhdHVzLAkJCS8qIEludGVydXB0IFN0YXR1cyBmcm9tIE1BQyAqLworU0tfVTY0CVNLX0ZBUiAqcFN0YXR1cykJLyogcHRyIGZvciByZXR1cm4gb3ZlcmZsb3cgc3RhdHVzIHZhbHVlICovCit7CisJU0tfVTY0CVN0YXR1czsJLyogT3ZlcmZsb3cgc3RhdHVzICovCisJU0tfVTMyCVJlZ1ZhbDsKKworCVN0YXR1cyA9IDA7CisKKwlpZiAoKElTdGF0dXMgJiBYTV9JU19SWENfT1YpICE9IDApIHsKKworCQlYTV9JTjMyKElvQywgUG9ydCwgWE1fUlhfQ05UX0VWLCAmUmVnVmFsKTsKKwkJU3RhdHVzIHw9IChTS19VNjQpUmVnVmFsIDw8IDMyOworCX0KKwkKKwlpZiAoKElTdGF0dXMgJiBYTV9JU19UWENfT1YpICE9IDApIHsKKworCQlYTV9JTjMyKElvQywgUG9ydCwgWE1fVFhfQ05UX0VWLCAmUmVnVmFsKTsKKwkJU3RhdHVzIHw9IChTS19VNjQpUmVnVmFsOworCX0KKworCSpwU3RhdHVzID0gU3RhdHVzOworCisJcmV0dXJuKDApOworfQkvKiBTa1htT3ZlcmZsb3dTdGF0dXMgKi8KKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKworI2lmZGVmIFlVS09OCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHbVVwZGF0ZVN0YXRzKCkgLSBGb3JjZSB0aGUgR01BQyB0byBvdXRwdXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljCisgKgorICogRGVzY3JpcHRpb246CisgKglFbXB0eSBmdW5jdGlvbiBmb3IgR01BQy4gU3RhdGlzdGljIGRhdGEgaXMgYWNjZXNzaWJsZSBpbiBkaXJlY3Qgd2F5LgorICoKKyAqIFJldHVybnM6CisgKgkwOiAgc3VjY2VzcworICoJMTogIHNvbWV0aGluZyB3ZW50IHdyb25nCisgKi8KK2ludCBTa0dtVXBkYXRlU3RhdHMoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLwordW5zaWduZWQgaW50IFBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlyZXR1cm4oMCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR21NYWNTdGF0aXN0aWMoKSAtIEdldCBHTUFDIGNvdW50ZXIgdmFsdWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUdldHMgdGhlIDMyYml0IGNvdW50ZXIgdmFsdWUuIEV4Y2VwdCBmb3IgdGhlIG9jdGV0IGNvdW50ZXJzCisgKgl0aGUgbG93ZXIgMzJiaXQgYXJlIGNvdW50ZWQgaW4gaGFyZHdhcmUgYW5kIHRoZSB1cHBlciAzMmJpdAorICoJbXVzdCBiZSBjb3VudGVkIGluIHNvZnR3YXJlIGJ5IG1vbml0b3JpbmcgY291bnRlciBvdmVyZmxvdyBpbnRlcnJ1cHRzLgorICoKKyAqIFJldHVybnM6CisgKgkwOiAgc3VjY2VzcworICoJMTogIHNvbWV0aGluZyB3ZW50IHdyb25nCisgKi8KK2ludCBTa0dtTWFjU3RhdGlzdGljKAorU0tfQUMJKnBBQywJCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkJLyogSU8gY29udGV4dCAqLwordW5zaWduZWQgaW50IFBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19VMTYJU3RhdEFkZHIsCQkvKiBNSUIgY291bnRlciBiYXNlIGFkZHJlc3MgKi8KK1NLX1UzMglTS19GQVIgKnBWYWwpCS8qIHB0ciB0byByZXR1cm4gc3RhdGlzdGljIHZhbHVlICovCit7CisKKwlpZiAoKFN0YXRBZGRyIDwgR01fUlhGX1VDX09LKSB8fCAoU3RhdEFkZHIgPiBHTV9UWEVfRklGT19VUikpIHsKKwkJCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMjIsIFNLRVJSX0hXSV9FMDIyTVNHKTsKKwkJCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU2tHbU1hY1N0YXQ6IHdyb25nIE1JQiBjb3VudGVyIDB4JTA0WFxuIiwgU3RhdEFkZHIpKTsKKwkJcmV0dXJuKDEpOworCX0KKwkJCisJR01fSU4zMihJb0MsIFBvcnQsIFN0YXRBZGRyLCBwVmFsKTsKKworCXJldHVybigwKTsKK30JLyogU2tHbU1hY1N0YXRpc3RpYyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtUmVzZXRDb3VudGVyKCkgLSBDbGVhciBNQUMgc3RhdGlzdGljIGNvdW50ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUZvcmNlIEdNQUMgdG8gY2xlYXIgaXRzIHN0YXRpc3RpYyBjb3VudGVyLgorICoKKyAqIFJldHVybnM6CisgKgkwOiAgc3VjY2VzcworICoJMTogIHNvbWV0aGluZyB3ZW50IHdyb25nCisgKi8KK2ludCBTa0dtUmVzZXRDb3VudGVyKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK3Vuc2lnbmVkIGludCBQb3J0KQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfVTE2CVJlZzsJLyogUGh5IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwlTS19VMTYJV29yZDsKKwlpbnQJCWk7CisKKwlHTV9JTjE2KElvQywgUG9ydCwgR01fUEhZX0FERFIsICZSZWcpOworCisJLyogc2V0IE1JQiBDbGVhciBDb3VudGVyIE1vZGUgKi8KKwlHTV9PVVQxNihJb0MsIFBvcnQsIEdNX1BIWV9BRERSLCBSZWcgfCBHTV9QQVJfTUlCX0NMUik7CisJCisJLyogcmVhZCBhbGwgTUlCIENvdW50ZXJzIHdpdGggQ2xlYXIgTW9kZSBzZXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgR01fTUlCX0NOVF9TSVpFOyBpKyspIHsKKwkJLyogdGhlIHJlc2V0IGlzIHBlcmZvcm1lZCBvbmx5IHdoZW4gdGhlIGxvd2VyIDE2IGJpdHMgYXJlIHJlYWQgKi8KKwkJR01fSU4xNihJb0MsIFBvcnQsIEdNX01JQl9DTlRfQkFTRSArIDgqaSwgJldvcmQpOworCX0KKwkKKwkvKiBjbGVhciBNSUIgQ2xlYXIgQ291bnRlciBNb2RlICovCisJR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9QSFlfQUREUiwgUmVnKTsKKwkKKwlyZXR1cm4oMCk7Cit9CS8qIFNrR21SZXNldENvdW50ZXIgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHbU92ZXJmbG93U3RhdHVzKCkgLSBHZXRzIHRoZSBzdGF0dXMgb2YgY291bnRlciBvdmVyZmxvdyBpbnRlcnJ1cHQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUNoZWNrcyB0aGUgc291cmNlIGNhdXNpbmcgYW4gY291bnRlciBvdmVyZmxvdyBpbnRlcnJ1cHQuIE9uIHN1Y2Nlc3MgdGhlCisgKglyZXN1bHRpbmcgY291bnRlciBvdmVyZmxvdyBzdGF0dXMgaXMgd3JpdHRlbiB0byA8cFN0YXR1cz4sIHdoZXJlYXMgdGhlCisgKgl0aGUgZm9sbG93aW5nIGJpdCBjb2RpbmcgaXMgdXNlZDoKKyAqCTYzOjU2IC0gdW51c2VkCisgKgk1NTo0OCAtIFR4UnggaW50ZXJydXB0IHJlZ2lzdGVyIGJpdDc6MAorICoJMzI6NDcgLSBSeCBpbnRlcnJ1cHQgcmVnaXN0ZXIKKyAqCTMxOjI0IC0gdW51c2VkCisgKgkyMzoxNiAtIFR4UnggaW50ZXJydXB0IHJlZ2lzdGVyIGJpdDE1OjgKKyAqCTE1OjAgIC0gVHggaW50ZXJydXB0IHJlZ2lzdGVyCisgKgorICogUmV0dXJuczoKKyAqCTA6ICBzdWNjZXNzCisgKgkxOiAgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAqLworaW50IFNrR21PdmVyZmxvd1N0YXR1cygKK1NLX0FDCSpwQUMsCQkJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCQkJLyogSU8gY29udGV4dCAqLwordW5zaWduZWQgaW50IFBvcnQsCQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfVTE2CUlTdGF0dXMsCQkJLyogSW50ZXJ1cHQgU3RhdHVzIGZyb20gTUFDICovCitTS19VNjQJU0tfRkFSICpwU3RhdHVzKQkvKiBwdHIgZm9yIHJldHVybiBvdmVyZmxvdyBzdGF0dXMgdmFsdWUgKi8KK3sKKwlTS19VNjQJU3RhdHVzOwkJLyogT3ZlcmZsb3cgc3RhdHVzICovCisJU0tfVTE2CVJlZ1ZhbDsKKworCVN0YXR1cyA9IDA7CisKKwlpZiAoKElTdGF0dXMgJiBHTV9JU19SWF9DT19PVikgIT0gMCkgeworCQkvKiB0aGlzIHJlZ2lzdGVyIGlzIHNlbGYtY2xlYXJpbmcgYWZ0ZXIgcmVhZCAqLworCQlHTV9JTjE2KElvQywgUG9ydCwgR01fUlhfSVJRX1NSQywgJlJlZ1ZhbCk7CisJCVN0YXR1cyB8PSAoU0tfVTY0KVJlZ1ZhbCA8PCAzMjsKKwl9CisJCisJaWYgKChJU3RhdHVzICYgR01fSVNfVFhfQ09fT1YpICE9IDApIHsKKwkJLyogdGhpcyByZWdpc3RlciBpcyBzZWxmLWNsZWFyaW5nIGFmdGVyIHJlYWQgKi8KKwkJR01fSU4xNihJb0MsIFBvcnQsIEdNX1RYX0lSUV9TUkMsICZSZWdWYWwpOworCQlTdGF0dXMgfD0gKFNLX1U2NClSZWdWYWw7CisJfQorCQorCS8qIHRoaXMgcmVnaXN0ZXIgaXMgc2VsZi1jbGVhcmluZyBhZnRlciByZWFkICovCisJR01fSU4xNihJb0MsIFBvcnQsIEdNX1RSX0lSUV9TUkMsICZSZWdWYWwpOworCS8qIFJ4IG92ZXJmbG93IGludGVycnVwdCByZWdpc3RlciBiaXRzIChMb0J5dGUpKi8KKwlTdGF0dXMgfD0gKFNLX1U2NCkoKFNLX1U4KVJlZ1ZhbCkgPDwgNDg7CisJLyogVHggb3ZlcmZsb3cgaW50ZXJydXB0IHJlZ2lzdGVyIGJpdHMgKEhpQnl0ZSkqLworCVN0YXR1cyB8PSAoU0tfVTY0KShSZWdWYWwgPj4gOCkgPDwgMTY7CisKKwkqcFN0YXR1cyA9IFN0YXR1czsKKworCXJldHVybigwKTsKK30JLyogU2tHbU92ZXJmbG93U3RhdHVzICovCisKKworI2lmbmRlZiBTS19TTElNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHbUNhYmxlRGlhZ1N0YXR1cygpIC0gU3RhcnRzIC8gR2V0cyBzdGF0dXMgb2YgY2FibGUgZGlhZ25vc3RpYyB0ZXN0CisgKgorICogRGVzY3JpcHRpb246CisgKiAgc3RhcnRzIHRoZSBjYWJsZSBkaWFnbm9zdGljIHRlc3QgaWYgJ1N0YXJ0VGVzdCcgaXMgdHJ1ZQorICogIGdldHMgdGhlIHJlc3VsdHMgaWYgJ1N0YXJ0VGVzdCcgaXMgdHJ1ZQorICoKKyAqIE5PVEU6CXRoaXMgdGVzdCBpcyBtZWFuaW5nZnVsIG9ubHkgd2hlbiBsaW5rIGlzIGRvd24KKyAqCQorICogUmV0dXJuczoKKyAqCTA6ICBzdWNjZXNzCisgKgkxOglubyBZVUtPTiBjb3BwZXIKKyAqCTI6CXRlc3QgaW4gcHJvZ3Jlc3MKKyAqLworaW50IFNrR21DYWJsZURpYWdTdGF0dXMoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLCAgIAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfQk9PTAlTdGFydFRlc3QpCS8qIGZsYWcgZm9yIHN0YXJ0IC8gZ2V0IHJlc3VsdCAqLworeworCWludAkJaTsKKwlTS19VMTYJUmVnVmFsOworCVNLX0dFUE9SVAkqcFBydDsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJaWYgKHBQcnQtPlBoeVR5cGUgIT0gU0tfUEhZX01BUlZfQ09QUEVSKSB7CisJCQorCQlyZXR1cm4oMSk7CisJfQorCisJaWYgKFN0YXJ0VGVzdCkgeworCQkvKiBvbmx5IHN0YXJ0IHRoZSBjYWJsZSB0ZXN0ICovCisJCWlmICgocFBydC0+UGh5SWQxICYgUEhZX0kxX1JFVl9NU0spIDwgNCkgeworCQkJLyogYXBwbHkgVERSIHdvcmthcm91bmQgZnJvbSBNYXJ2ZWxsICovCisJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIDI5LCAweDAwMWUpOworCQkJCisJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIDMwLCAweGNjMDApOworCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCAzMCwgMHhjODAwKTsKKwkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgMzAsIDB4YzQwMCk7CisJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIDMwLCAweGMwMDApOworCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCAzMCwgMHhjMTAwKTsKKwkJfQorCisJCS8qIHNldCBhZGRyZXNzIHRvIDAgZm9yIE1ESVswXSAqLworCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0VYVF9BRFIsIDApOworCisJCS8qIFJlYWQgQ2FibGUgRGlhZ25vc3RpYyBSZWcgKi8KKwkJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0NBQkxFX0RJQUcsICZSZWdWYWwpOworCisJCS8qIHN0YXJ0IENhYmxlIERpYWdub3N0aWMgVGVzdCAqLworCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0NBQkxFX0RJQUcsCisJCQkoU0tfVTE2KShSZWdWYWwgfCBQSFlfTV9DQUJEX0VOQV9URVNUKSk7CisJCisJCXJldHVybigwKTsKKwl9CisJCisJLyogUmVhZCBDYWJsZSBEaWFnbm9zdGljIFJlZyAqLworCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9DQUJMRV9ESUFHLCAmUmVnVmFsKTsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJQSFkgQ2FibGUgRGlhZy49MHglMDRYXG4iLCBSZWdWYWwpKTsKKworCWlmICgoUmVnVmFsICYgUEhZX01fQ0FCRF9FTkFfVEVTVCkgIT0gMCkgeworCQkvKiB0ZXN0IGlzIHJ1bm5pbmcgKi8KKwkJcmV0dXJuKDIpOworCX0KKworCS8qIGdldCB0aGUgdGVzdCByZXN1bHRzICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgIHsKKwkJLyogc2V0IGFkZHJlc3MgdG8gaSBmb3IgTURJW2ldICovCisJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfRVhUX0FEUiwgKFNLX1UxNilpKTsKKworCQkvKiBnZXQgQ2FibGUgRGlhZ25vc3RpYyB2YWx1ZXMgKi8KKwkJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0NBQkxFX0RJQUcsICZSZWdWYWwpOworCisJCXBQcnQtPlBNZGlQYWlyTGVuW2ldID0gKFNLX1U4KShSZWdWYWwgJiBQSFlfTV9DQUJEX0RJU1RfTVNLKTsKKworCQlwUHJ0LT5QTWRpUGFpclN0c1tpXSA9IChTS19VOCkoKFJlZ1ZhbCAmIFBIWV9NX0NBQkRfU1RBVF9NU0spID4+IDEzKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CS8qIFNrR21DYWJsZURpYWdTdGF0dXMgKi8KKyNlbmRpZiAvKiAhU0tfU0xJTSAqLworI2VuZGlmIC8qIFlVS09OICovCisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za19nMTYuYyBiL2RyaXZlcnMvbmV0L3NrX2cxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNGFlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za19nMTYuYwpAQCAtMCwwICsxLDIwNjYgQEAKKy8qLQorICogQ29weXJpZ2h0IChDKSAxOTk0IGJ5IFBKRCBXZWljaG1hbm4gJiBTV1MgQmVybiwgU3dpdHplcmxhbmQKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIE1vZHVsZSAgICAgICAgIDogc2tfZzE2LmMKKyAqCisgKiBWZXJzaW9uICAgICAgICA6ICRSZXZpc2lvbjogMS4xICQKKyAqCisgKiBBdXRob3IgICAgICAgICA6IFBhdHJpY2sgSi5ELiBXZWljaG1hbm4KKyAqCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI2CisgKiBMYXN0IFVwZGF0ZWQgICA6ICREYXRlOiAxOTk0LzA2LzMwIDE2OjI1OjE1ICQKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IFNjaG5laWRlciAmIEtvY2ggRzE2IEV0aGVybmV0IERldmljZSBEcml2ZXIgZm9yCisgKiAgICAgICAgICAgICAgICAgIExpbnV4IEtlcm5lbCA+PSAxLjEuMjIKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqICAgICAgICAgICAgICAgICAgUGF1bCBHb3J0bWFrZXIsIDAzLzk3OiBGaXggZm9yIHYyLjEueCB0byB1c2UgcmVhZHtiLHd9CisgKiAgICAgICAgICAgICAgICAgIHdyaXRle2Isd30gYW5kIG1lbWNweSAtPiBtZW1jcHlfe3RvLGZyb219aW8KKyAqCisgKgkJICAgIEplZmYgR2FyemlrLCAwNi8yMDAwLCBNb2R1bGFyaXplCisgKgorLSovCisKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPSAiJElkOiBza19nMTYuYyx2IDEuMSAxOTk0LzA2LzMwIDE2OjI1OjE1IHJvb3QgRXhwICQiOworCisvKgorICogVGhlIFNjaG5laWRlciAmIEtvY2ggKFNLKSBHMTYgTmV0d29yayBkZXZpY2UgZHJpdmVyIGlzIGJhc2VkCisgKiBvbiB0aGUgJ25pNjUxMCcgZHJpdmVyIGZyb20gTWljaGFlbCBIaXBwIHdoaWNoIGNhbiBiZSBmb3VuZCBhdAorICogZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9zeXN0ZW0vTmV0d29yay9kcml2ZXJzL25pZHJpdmVycy50YXIuZ3oKKyAqIAorICogU291cmNlczogMSkgbmk2NTEwLmMgYnkgTS4gSGlwcAorICogICAgICAgICAgMikgZGVwY2EuYyAgYnkgRC5DLiBEYXZpZXMKKyAqICAgICAgICAgIDMpIHNrZWxldG9uLmMgYnkgRC4gQmVja2VyCisgKiAgICAgICAgICA0KSBBbTc5OTAgTG9jYWwgQXJlYSBOZXR3b3JrIENvbnRyb2xsZXIgZm9yIEV0aGVybmV0IChMQU5DRSksCisgKiAgICAgICAgICAgICBBTUQsIFB1Yi4gIzA1Njk4LCBKdW5lIDE5ODkKKyAqCisgKiBNYW55IFRoYW5rcyBmb3IgaGVscGluZyBtZSB0byBnZXQgdGhpbmdzIHdvcmtpbmcgdG86IAorICogICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgIEEuIENveCAoQS5Db3hAc3dhbnNlYS5hYy51aykKKyAqICAgICAgICAgICAgICAgICBNLiBIaXBwIChtaGlwcEBzdHVkZW50LnVuaS10dWViaW5nZW4uZGUpCisgKiAgICAgICAgICAgICAgICAgUi4gQm9seiAoU2NobmVpZGVyICYgS29jaCwgR2VybWFueSkKKyAqCisgKiBUbyBEbzogCisgKiAgICAgICAgLSBTdXBwb3J0IG9mIFNLX0c4IGFuZCBvdGhlciBTSyBOZXR3b3JrIENhcmRzLgorICogICAgICAgIC0gQXV0b3NldCBtZW1vcnkgbWFwcGVkIFJBTS4gQ2hlY2sgZm9yIGZyZWUgbWVtb3J5IGFuZCB0aGVuCisgKiAgICAgICAgICBjb25maWd1cmUgUkFNIGNvcnJlY3RseS4gCisgKiAgICAgICAgLSBTS19jbG9zZSBzaG91bGQgcmVhbGx5IHNldCBjYXJkIGluIHRvIGluaXRpYWwgc3RhdGUuCisgKiAgICAgICAgLSBUZXN0IGlmIElSUSAzIGlzIG5vdCBzd2l0Y2hlZCBvZmYuIFVzZSBhdXRvaXJxKCkgZnVuY3Rpb25hbGl0eS4KKyAqICAgICAgICAgIChhcyBpbiAvZHJpdmVycy9uZXQvc2tlbGV0b24uYykKKyAqICAgICAgICAtIEltcGxlbWVudCBNdWx0aWNhc3QgYWRkcmVzc2luZy4gQXQgbWluaW11bSBzb21ldGhpbmcgbGlrZQorICogICAgICAgICAgaW4gZGVwY2EuYy4gCisgKiAgICAgICAgLSBSZWRvIHRoZSBzdGF0aXN0aWNzIHBhcnQuCisgKiAgICAgICAgLSBUcnkgdG8gZmluZCBvdXQgaWYgdGhlIGJvYXJkIGlzIGluIDggQml0IG9yIDE2IEJpdCBzbG90LgorICogICAgICAgICAgSWYgaW4gOCBCaXQgbW9kZSBkb24ndCB1c2UgSVJRIDExLgorICogICAgICAgIC0gKFRyeSB0byBtYWtlIGl0IHNsaWdodGx5IGZhc3Rlci4pIAorICoJICAtIFBvd2VyIG1hbmFnZW1lbnQgc3VwcG9ydAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4gCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJza19nMTYuaCIKKworLyogCisgKiBTY2huZWlkZXIgJiBLb2NoIENhcmQgRGVmaW5pdGlvbnMgCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLyAgCisKKyNkZWZpbmUgU0tfTkFNRSAgICJTS19HMTYiCisKKy8qCisgKiBTS19HMTYgQ29uZmlndXJhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLyAKKworLyogCisgKiBBYmJyZXZpYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tCisgKiAgCisgKiBSQU0gLSB1c2VkIGZvciB0aGUgMTZLQiBzaGFyZWQgbWVtb3J5IAorICogQm9vdF9ST00sIFJPTSAtIGFyZSB1c2VkIGZvciByZWZlcmVuY2luZyB0aGUgQm9vdEVQUk9NCisgKgorICogU0tfQk9PVF9ST00gYW5kIFNLX0FERFIgYXJlIHN5bWJvbGljIGNvbnN0YW50cyB1c2VkIHRvIGNvbmZpZ3VyZQorICogdGhlIGJlaGF2aW91ciBvZiB0aGUgZHJpdmVyIGFuZCB0aGUgU0tfRzE2LgorICoKKyAqICEgU2VlIHNrX2cxNi5pbnN0YWxsIG9uIGhvdyB0byBpbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIGRyaXZlciAhICAgCisgKgorICogU0tfQk9PVF9ST00gZGVmaW5lcyBpZiB0aGUgQm9vdF9ST00gc2hvdWxkIGJlIHN3aXRjaGVkIG9mZiBvciBub3QuCisgKgorICogU0tfQUREUiBkZWZpbmVzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBSQU0gd2lsbCBiZSBtYXBwZWQgaW50byB0aGUgcmVhbAorICogICAgICAgICBob3N0IG1lbW9yeS4KKyAqICAgICAgICAgdmFsaWQgYWRkcmVzc2VzIGFyZSBmcm9tIDB4YTAwMDAgdG8gMHhmYzAwMCBpbiAxNktieXRlIHN0ZXBzLgorICovICAKKyAKKyNkZWZpbmUgU0tfQk9PVF9ST00gICAgIDEgICAgICAgICAgICAgIC8qIDE9Qm9vdFJPTSBvbiAwPW9mZiAqLworCisjZGVmaW5lIFNLX0FERFIgICAgICAgICAweGNjMDAwCisKKy8qIAorICogSW4gUE9TMyBhcmUgYml0cyBBMTQtQTE5IG9mIHRoZSBhZGRyZXNzIGJ1cy4gVGhlc2UgYml0cyBjYW4gYmUgc2V0CisgKiB0byBjaG9vc2UgdGhlIFJBTSBhZGRyZXNzLiBUaGF0J3Mgd2h5IHdlIG9ubHkgY2FuIGNob29zZSB0aGUgUkFNIGFkZHJlc3MKKyAqIGluIDE2S0Igc3RlcHMuCisgKi8KKworI2RlZmluZSBQT1NfQUREUiAgICAgICAocm9tX2FkZHI+PjE0KSAgLyogRG8gbm90IGNoYW5nZSB0aGlzIGxpbmUgKi8KKworLyogCisgKiBTS19HMTYgSS9PIFBPUlQncyArIElSUSdzICsgQm9vdF9ST00gbG9jYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogCisgKiBBcyBuZWFybHkgZXZlcnkgY2FyZCBoYXMgYWxzbyBTS19HMTYgYSBzcGVjaWZpZWQgSS9PIFBvcnQgcmVnaW9uIGFuZAorICogb25seSBhIGZldyBwb3NzaWJsZSBJUlEncy4KKyAqIEluIHRoZSBJbnN0YWxsYXRpb24gR3VpZGUgZnJvbSBTY2huZWlkZXIgJiBLb2NoIGlzIGxpc3RlZCBhIHBvc3NpYmxlCisgKiBJbnRlcnJ1cHQgSVJRMi4gSVJRMiBpcyBhbHdheXMgSVJROSBpbiBib2FyZHMgd2l0aCB0d28gY2FzY2FkZWQgaW50ZXJydXB0CisgKiBjb250cm9sbGVycy4gU28gd2UgdXNlIGluIFNLX0lSUVMgSVJROS4KKyAqLworCisvKiBEb24ndCB0b3VjaCBhbnkgb2YgdGhlIGZvbGxvd2luZyAjZGVmaW5lcy4gKi8KKworI2RlZmluZSBTS19JT19QT1JUUyAgICAgeyAweDEwMCwgMHgxODAsIDB4MjA4LCAweDIyMCwgMHgyODgsIDB4MzIwLCAweDMyOCwgMHgzOTAsIDAgfQorCisjZGVmaW5lIFNLX0lSUVMgICAgICAgICB7IDMsIDUsIDksIDExLCAwIH0KKworI2RlZmluZSBTS19CT09UX1JPTV9MT0NBVElPTlMgeyAweGMwMDAwLCAweGM0MDAwLCAweGM4MDAwLCAweGNjMDAwLCAweGQwMDAwLCAweGQ0MDAwLCAweGQ4MDAwLCAweGRjMDAwLCAwIH0KKworI2RlZmluZSBTS19CT09UX1JPTV9JRCAgeyAweDU1LCAweGFhLCAweDEwLCAweDUwLCAweDA2LCAweDMzIH0KKworLyogCisgKiBTS19HMTYgUE9TIFJFR0lTVEVSUyAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIFNLX0cxNiBoYXMgYSBQcm9ncmFtbWFibGUgT3B0aW9uIFNlbGVjdCAoUE9TKSBSZWdpc3Rlci4KKyAqIFRoZSBQT1MgaXMgY29tcG9zZWQgb2YgOCBzZXBhcmF0ZSByZWdpc3RlcnMgKFBPUzAtNykgd2hpY2ggCisgKiBhcmUgSS9PIG1hcHBlZCBvbiBhbiBhZGRyZXNzIHNldCBieSB0aGUgVzEgc3dpdGNoLiAgICAgICAgICAgICAgICAgICAgCisgKgorICovCisKKyNkZWZpbmUgU0tfUE9TX1NJWkUgOCAgICAgICAgICAgLyogOCBJL08gUG9ydHMgYXJlIHVzZWQgYnkgU0tfRzE2ICovCisKKyNkZWZpbmUgU0tfUE9TMCAgICAgaW9hZGRyICAgICAgLyogQ2FyZC1JRCBMb3cgKFIpICovCisjZGVmaW5lIFNLX1BPUzEgICAgIGlvYWRkcisxICAgIC8qIENhcmQtSUQgSGlnaCAoUikgKi8KKyNkZWZpbmUgU0tfUE9TMiAgICAgaW9hZGRyKzIgICAgLyogQ2FyZC1FbmFibGUsIEJvb3QtUk9NIERpc2FibGUgKFJXKSAqLworI2RlZmluZSBTS19QT1MzICAgICBpb2FkZHIrMyAgICAvKiBCYXNlIGFkZHJlc3Mgb2YgUkFNICovCisjZGVmaW5lIFNLX1BPUzQgICAgIGlvYWRkcis0ICAgIC8qIElSUSAqLworCisvKiBQT1M1IC0gUE9TNyBhcmUgdW51c2VkICovCisKKy8qIAorICogU0tfRzE2IE1BQyBQUkVGSVggCisgKiAtLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIAorICogU2NoZWlkZXIgJiBLb2NoIG1hbnVmYWN0dXJlciBjb2RlICgwMDowMDphNSkuCisgKiBUaGlzIG11c3QgYmUgY2hlY2tlZCwgdGhhdCB3ZSBhcmUgc3VyZSBpdCBpcyBhIFNLIGNhcmQuCisgKi8KKworI2RlZmluZSBTS19NQUMwICAgICAgICAgMHgwMAorI2RlZmluZSBTS19NQUMxICAgICAgICAgMHgwMAorI2RlZmluZSBTS19NQUMyICAgICAgICAgMHg1YQorCisvKiAKKyAqIFNLX0cxNiBJRCAKKyAqIC0tLS0tLS0tLQorICovIAorCisvKiAKKyAqIElmIFBPUzAsUE9TMSBjb250YWluIHRoZSBmb2xsb3dpbmcgSUQsIHRoZW4gd2Uga25vdworICogYXQgd2hpY2ggSS9PIFBvcnQgQWRkcmVzcyB3ZSBhcmUuIAorICovCisKKyNkZWZpbmUgU0tfSURMT1cgIDB4ZmQgCisjZGVmaW5lIFNLX0lESElHSCAweDZhCisKKworLyogCisgKiBMQU5DRSBQT1MgQml0IGRlZmluaXRpb25zIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUgU0tfUk9NX1JBTV9PTiAgKFBPUzJfQ0FSRCkKKyNkZWZpbmUgU0tfUk9NX1JBTV9PRkYgKFBPUzJfRVBST00pCisjZGVmaW5lIFNLX1JPTV9PTiAgICAgIChpbmIoU0tfUE9TMikgJiBQT1MyX0NBUkQpCisjZGVmaW5lIFNLX1JPTV9PRkYgICAgIChpbmIoU0tfUE9TMikgfCBQT1MyX0VQUk9NKQorI2RlZmluZSBTS19SQU1fT04gICAgICAoaW5iKFNLX1BPUzIpIHwgUE9TMl9DQVJEKQorI2RlZmluZSBTS19SQU1fT0ZGICAgICAoaW5iKFNLX1BPUzIpICYgUE9TMl9FUFJPTSkgCisKKyNkZWZpbmUgUE9TMl9DQVJEICAweDAwMDEgICAgICAgICAgICAgIC8qIDEgPSBTS19HMTYgb24gICAgICAwID0gb2ZmICovCisjZGVmaW5lIFBPUzJfRVBST00gMHgwMDAyICAgICAgICAgICAgICAvKiAxID0gQm9vdCBFUFJPTSBvZmYgMCA9IG9uICovIAorCisvKiAKKyAqIFNLX0cxNiBNZW1vcnkgbWFwcGVkIFJlZ2lzdGVycworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovIAorCisjZGVmaW5lIFNLX0lPUkVHICAgICAgICAoJmJvYXJkLT5pb3JlZykgLyogTEFOQ0UgZGF0YSByZWdpc3RlcnMuICAgICAqLyAKKyNkZWZpbmUgU0tfUE9SVCAgICAgICAgICgmYm9hcmQtPnBvcnQpICAvKiBDb250cm9sLCBTdGF0dXMgcmVnaXN0ZXIgICovCisjZGVmaW5lIFNLX0lPQ09NICAgICAgICAoJmJvYXJkLT5pb2NvbSkgLyogSS9PIENvbW1hbmQgICAgICAgICAgICAgICAqLworCisvKiAKKyAqIFNLX0cxNiBTdGF0dXMvQ29udHJvbCBSZWdpc3RlciBiaXRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIChDKSBDb250cm9scmVnIChTKSBTdGF0dXNyZWcgCisgKi8KKworLyogCisgKiBSZWdpc3RlciB0cmFuc2ZlcjogMCA9IG5vIHRyYW5zZmVyCisgKiAgICAgICAgICAgICAgICAgICAgMSA9IHRyYW5zZmVycmluZyBkYXRhIGJldHdlZW4gTEFOQ0UgYW5kIEkvTyByZWcgCisgKi8KKyNkZWZpbmUgU0tfSU9SVU4gICAgICAgIDB4MjAgICAKKworLyogCisgKiBMQU5DRSBpbnRlcnJ1cHQ6IDAgPSBMQU5DRSBpbnRlcnJ1cHQgb2NjdXJyZWQJCisgKiAgICAgICAgICAgICAgICAgIDEgPSBubyBMQU5DRSBpbnRlcnJ1cHQgb2NjdXJyZWQKKyAqLworI2RlZmluZSBTS19JUlEgICAgICAgICAgMHgxMCAgIAorCQkJCisjZGVmaW5lIFNLX1JFU0VUICAgICAgICAweDA4ICAgLyogUmVzZXQgU0tfQ0FSRDogMCA9IFJFU0VUIDEgPSBub3JtYWwgKi8KKyNkZWZpbmUgU0tfUlcgICAgICAgICAgIDB4MDIgICAvKiAwID0gd3JpdGUgdG8gMSA9IHJlYWQgZnJvbSAqLworI2RlZmluZSBTS19BRFIgICAgICAgICAgMHgwMSAgIC8qIDAgPSBSRUcgRGF0YVBvcnQgMSA9IFJBUCBSZWcgYWRkciBwb3J0ICovCisKKyAgCisjZGVmaW5lIFNLX1JSRUcgICAgICAgICBTS19SVyAgLyogVHJhbnNmZXJkaXJlY3Rpb24gdG8gcmVhZCBmcm9tIGxhbmNlICovCisjZGVmaW5lIFNLX1dSRUcgICAgICAgICAwICAgICAgLyogVHJhbnNmZXJkaXJlY3Rpb24gdG8gd3JpdGUgdG8gbGFuY2UgKi8KKyNkZWZpbmUgU0tfUkFQICAgICAgICAgIFNLX0FEUiAvKiBEZXN0aW5hdGlvbiBSZWdpc3RlciBSQVAgKi8KKyNkZWZpbmUgU0tfUkRBVEEgICAgICAgIDAgICAgICAvKiBEZXN0aW5hdGlvbiBSZWdpc3RlciBSRUcgRGF0YVBvcnQgKi8KKworLyogCisgKiBTS19HMTYgSS9PIENvbW1hbmQgCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiAKKyAqIEFueSBiaXRjb21iaW5hdGlvbiBzZXRzIHRoZSBpbnRlcm5hbCBJL08gYml0ICh0cmFuc2ZlciB3aWxsIHN0YXJ0KSAKKyAqIHdoZW4gd3JpdHRlbiB0byBJL08gQ29tbWFuZAorICovCisKKyNkZWZpbmUgU0tfRE9JTyAgICAgICAgIDB4ODAgICAvKiBEbyBUcmFuc2ZlciAqLyAKKyAKKy8qIAorICogTEFOQ0UgUkFQIChSZWdpc3RlciBBZGRyZXNzIFBvcnQpLiAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qICAgCisgKiBUaGUgTEFOQ0UgaW50ZXJuYWwgcmVnaXN0ZXJzIGFyZSBzZWxlY3RlZCB0aHJvdWdoIHRoZSBSQVAuIAorICogVGhlIFJlZ2lzdGVycyBhcmU6CisgKgorICogQ1NSMCAtIFN0YXR1cyBhbmQgQ29udHJvbCBmbGFncyAKKyAqIENTUjEgLSBMb3cgb3JkZXIgYml0cyBvZiBpbml0aWFsaXplIGJsb2NrIChiaXRzIDE1OjAwKQorICogQ1NSMiAtIEhpZ2ggb3JkZXIgYml0cyBvZiBpbml0aWFsaXplIGJsb2NrIChiaXRzIDA3OjAwLCAxNTowOCBhcmUgcmVzZXJ2ZWQpCisgKiBDU1IzIC0gQWxsb3dzIHJlZGVmaW5pdGlvbiBvZiB0aGUgQnVzIE1hc3RlciBJbnRlcmZhY2UuCisgKiAgICAgICAgVGhpcyByZWdpc3RlciBtdXN0IGJlIHNldCB0byAweDAwMDIsIHdoaWNoIG1lYW5zIEJTV0FQID0gMCwKKyAqICAgICAgICBBQ09OID0gMSwgQkNPTiA9IDA7CisgKgorICovCisgCisjZGVmaW5lIENTUjAgICAgICAgICAgICAweDAwICAgCisjZGVmaW5lIENTUjEgICAgICAgICAgICAweDAxICAKKyNkZWZpbmUgQ1NSMiAgICAgICAgICAgIDB4MDIgCisjZGVmaW5lIENTUjMgICAgICAgICAgICAweDAzCisKKy8qIAorICogR2VuZXJhbCBEZWZpbml0aW9ucyAKKyAqID09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiAKKyAqIFNldCB0aGUgbnVtYmVyIG9mIFR4IGFuZCBSeCBidWZmZXJzLCB1c2luZyBMb2dfMigjIGJ1ZmZlcnMpLgorICogV2UgaGF2ZSAxNktCIFJBTSB3aGljaCBjYW4gYmUgYWNjZXNzZWQgYnkgdGhlIExBTkNFLiBJbiB0aGUgCisgKiBtZW1vcnkgYXJlIG5vdCBvbmx5IHRoZSBidWZmZXJzIGJ1dCBhbHNvIHRoZSByaW5nIGRlc2NyaXB0b3JzIGFuZAorICogdGhlIGluaXRpYWxpemUgYmxvY2suIAorICogRG9uJ3QgY2hhbmdlIGFueXRoaW5nIHVubGVzcyB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UgZG8uCisgKi8KKworI2RlZmluZSBMQ19MT0dfVFhfQlVGRkVSUyAxICAgICAgICAgICAgICAgLyogKDIgPT0gMl5eMSkgMiBUcmFuc21pdCBidWZmZXJzICovCisjZGVmaW5lIExDX0xPR19SWF9CVUZGRVJTIDMgICAgICAgICAgICAgICAvKiAoOCA9PSAyXl4zKSA4IFJlY2VpdmUgYnVmZmVycyAqLworCisvKiBEZXNjcmlwdG9yIHJpbmcgc2l6ZXMgKi8KKworI2RlZmluZSBUTUROVU0gKDEgPDwgKExDX0xPR19UWF9CVUZGRVJTKSkgLyogMiBUcmFuc21pdCBkZXNjcmlwdG9yIHJpbmdzICovCisjZGVmaW5lIFJNRE5VTSAoMSA8PCAoTENfTE9HX1JYX0JVRkZFUlMpKSAvKiA4IFJlY2VpdmUgQnVmZmVycyAqLworCisvKiBEZWZpbmUgTWFzayBmb3Igc2V0dGluZyBSTUQsIFRNRCBsZW5ndGggaW4gdGhlIExBTkNFIGluaXRfYmxvY2sgKi8KKworI2RlZmluZSBUTUROVU1NQVNLIChMQ19MT0dfVFhfQlVGRkVSUyA8PCAyOSkKKyNkZWZpbmUgUk1ETlVNTUFTSyAoTENfTE9HX1JYX0JVRkZFUlMgPDwgMjkpCisKKy8qCisgKiBEYXRhIEJ1ZmZlciBzaXplIGlzIHNldCB0byBtYXhpbXVtIHBhY2tldCBsZW5ndGguCisgKi8KKworI2RlZmluZSBQS1RfQlVGX1NaICAgICAgICAgICAgICAxNTE4IAorCisvKiAKKyAqIFRoZSBudW1iZXIgb2YgbG93IEkvTyBwb3J0cyB1c2VkIGJ5IHRoZSBldGhlcmNhcmQuIAorICovCisKKyNkZWZpbmUgRVRIRVJDQVJEX1RPVEFMX1NJWkUgICAgU0tfUE9TX1NJWkUKKworLyogCisgKiBTS19ERUJVRworICoKKyAqIEhlcmUgeW91IGNhbiBjaG9vc2Ugd2hhdCBsZXZlbCBvZiBkZWJ1Z2dpbmcgd2FudGVkLgorICoKKyAqIElmIFNLX0RFQlVHIGFuZCBTS19ERUJVRzIgYXJlIHVuZGVmaW5lZCwgdGhlbiBvbmx5IHRoZQorICogIG5lY2Vzc2FyeSBtZXNzYWdlcyB3aWxsIGJlIHByaW50ZWQuCisgKgorICogSWYgU0tfREVCVUcgaXMgZGVmaW5lZCwgdGhlcmUgd2lsbCBiZSBtYW55IGRlYnVnZ2luZyBwcmludHMKKyAqICB3aGljaCBjYW4gaGVscCB0byBmaW5kIHNvbWUgbWlzdGFrZXMgaW4gY29uZmlndXJhdGlvbiBvciBldmVuCisgKiAgaW4gdGhlIGRyaXZlciBjb2RlLgorICoKKyAqIElmIFNLX0RFQlVHMiBpcyBkZWZpbmVkLCBtYW55IG1hbnkgbWVzc2FnZXMgd2lsbCBiZSBwcmludGVkIAorICogIHdoaWNoIG5vcm1hbGx5IHlvdSBkb24ndCBuZWVkLiBJIHVzZWQgdGhpcyB0byBjaGVjayB0aGUgaW50ZXJydXB0CisgKiAgcm91dGluZS4gCisgKgorICogKElmIHlvdSBkZWZpbmUgb25seSBTS19ERUJVRzIgdGhlbiBvbmx5IHRoZSBtZXNzYWdlcyBmb3IgCisgKiAgY2hlY2tpbmcgaW50ZXJydXB0cyB3aWxsIGJlIHByaW50ZWQhKQorICoKKyAqIE5vcm1hbCB3YXkgb2YgbGl2ZSBpczogCisgKgorICogRm9yIHRoZSB3aG9sZSB0aGluZyBnZXQgZ29pbmcgbGV0IGJvdGggc3ltYm9saWMgY29uc3RhbnRzCisgKiB1bmRlZmluZWQuIElmIHlvdSBmYWNlIGFueSBwcm9ibGVtcyBhbmQgeW91IGtub3cgd2hhdCdzIGdvaW5nCisgKiBvbiAoeW91IGtub3cgc29tZXRoaW5nIGFib3V0IHRoZSBjYXJkIGFuZCB5b3UgY2FuIGludGVycHJldCBzb21lCisgKiBoZXggTEFOQ0UgcmVnaXN0ZXIgb3V0cHV0KSB0aGVuIGRlZmluZSBTS19ERUJVRworICogCisgKi8KKworI3VuZGVmICBTS19ERUJVRwkvKiBkZWJ1Z2dpbmcgKi8KKyN1bmRlZiAgU0tfREVCVUcyCS8qIGRlYnVnZ2luZyB3aXRoIG1vcmUgdmVyYm9zZSByZXBvcnQgKi8KKworI2lmZGVmIFNLX0RFQlVHCisjZGVmaW5lIFBSSU5USyh4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgUFJJTlRLKHgpIC8qKi8KKyNlbmRpZgorCisjaWZkZWYgU0tfREVCVUcyCisjZGVmaW5lIFBSSU5USzIoeCkgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIFBSSU5USzIoeCkgLyoqLworI2VuZGlmCisKKy8qIAorICogU0tfRzE2IFJBTQorICoKKyAqIFRoZSBjb21wb25lbnRzIGFyZSBtZW1vcnkgbWFwcGVkIGFuZCBjYW4gYmUgc2V0IGluIGEgcmVnaW9uIGZyb20KKyAqIDB4MDAwMDAgdGhyb3VnaCAweGZjMDAwIGluIDE2S0Igc3RlcHMuIAorICoKKyAqIFRoZSBOZXR3b3JrIGNvbXBvbmVudHMgYXJlOiBkdWFsIHBvcnRlZCBSQU0sIFByb20sIEkvTyBSZWcsIFN0YXR1cy0sCisgKiBDb250cm9scmVnaXN0ZXIgYW5kIEkvTyBDb21tYW5kLgorICoKKyAqIGR1YWwgcG9ydGVkIFJBTTogVGhpcyBpcyB0aGUgb25seSBtZW1vcnkgcmVnaW9uIHdoaWNoIHRoZSBMQU5DRSBjaGlwCisgKiAgICAgIGhhcyBhY2Nlc3MgdG8uIEZyb20gdGhlIExhbmNlIGl0IGlzIGFkZHJlc3NlZCBmcm9tIDB4MDAwMCB0bworICogICAgICAweDNmYmYuIFRoZSBob3N0IGFjY2Vzc2VzIGl0IG5vcm1hbGx5LgorICoKKyAqIFBST006IFRoZSBQUk9NIG9idGFpbnMgdGhlIEVUSEVSTkVULU1BQy1BZGRyZXNzLiBJdCBpcyByZWFsaXNlZCBhcyBhCisgKiAgICAgICA4LUJpdCBQUk9NLCB0aGlzIG1lYW5zIG9ubHkgdGhlIDE2IGV2ZW4gYWRkcmVzc2VzIGFyZSB1c2VkIG9mIHRoZQorICogICAgICAgMzIgQnl0ZSBBZGRyZXNzIHJlZ2lvbi4gQWNjZXNzIHRvIGFuIG9kZCBhZGRyZXNzIHJlc3VsdHMgaW4gaW52YWxpZAorICogICAgICAgZGF0YS4KKyAqIAorICogTEFOQ0UgSS9PIFJlZzogVGhlIEkvTyBSZWcgaXMgYnVpbGQgb2YgNCBzaW5nbGUgUmVnaXN0ZXJzLCBMb3ctQnl0ZSBXcml0ZSwKKyAqICAgICAgIEhpLUJ5dGUgV3JpdGUsIExvdy1CeXRlIFJlYWQsIEhpLUJ5dGUgUmVhZC4KKyAqICAgICAgIFRyYW5zZmVyIGZyb20gb3IgdG8gdGhlIExBTkNFIGlzIGFsd2F5cyBpbiAxNkJpdCBzbyBMb3cgYW5kIEhpZ2gKKyAqICAgICAgIHJlZ2lzdGVycyBhcmUgYWx3YXlzIHJlbGV2YW50LgorICoKKyAqICAgICAgIFRoZSBEYXRhIGZyb20gdGhlIFJlYWRyZWdpc3RlciBpcyBub3QgdGhlIGRhdGEgaW4gdGhlIFdyaXRlcmVnaXN0ZXIhIQorICogICAgICAgCisgKiBQb3J0OiBTdGF0dXMtIGFuZCBDb250cm9scmVnaXN0ZXIuIAorICogICAgICAgVHdvIGRpZmZlcmVudCByZWdpc3RlcnMgd2hpY2ggc2hhcmUgdGhlIHNhbWUgYWRkcmVzcywgU3RhdHVzIGlzIAorICogICAgICAgcmVhZC1vbmx5LCBDb250cm9sIGlzIHdyaXRlLW9ubHkuCisgKiAgICAKKyAqIEkvTyBDb21tYW5kOiAKKyAqICAgICAgIEFueSBiaXRjb21iaW5hdGlvbiB3cml0dGVuIGluIGhlcmUgc3RhcnRzIHRoZSB0cmFuc21pc3Npb24gYmV0d2VlbgorICogICAgICAgSG9zdCBhbmQgTEFOQ0UuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKwl1bnNpZ25lZCBjaGFyICByYW1bMHgzZmMwXTsgICAvKiAxNktCIGR1YWwgcG9ydGVkIHJhbSAqLworCXVuc2lnbmVkIGNoYXIgIHJvbVsweDAwMjBdOyAgIC8qIDMyQnl0ZSBQUk9NIGNvbnRhaW5pbmcgNkJ5dGUgTUFDICovCisJdW5zaWduZWQgY2hhciAgcmVzMVsweDAwMTBdOyAgLyogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCB2b2xhdGlsZSBzaG9ydCBpb3JlZzsvKiBMQU5DRSBJL08gUmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCB2b2xhdGlsZSBjaGFyICBwb3J0OyAvKiBTdGF0dXNyZWdpc3RlciBhbmQgQ29udHJvbHJlZ2lzdGVyICovCisJdW5zaWduZWQgY2hhciAgaW9jb207ICAgICAgICAgLyogSS9PIENvbW1hbmQgUmVnaXN0ZXIgKi8KK30gU0tfUkFNOworCisvKiBzdHJ1Y3QgICovCisKKy8qIAorICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIGZvciB0aGUgZHVhbCBwb3J0ZWQgcmFtLiBXZQorICogaGF2ZSBleGFjdGx5IDE2IDMyMCBCeXRlcy4gSW4gaGVyZSB0aGVyZSBtdXN0IGJlOgorICoKKyAqICAgICAtIEluaXRpYWxpemUgQmxvY2sgICAoc3RhcnRpbmcgYXQgYSB3b3JkIGJvdW5kYXJ5KQorICogICAgIC0gUmVjZWl2ZSBhbmQgVHJhbnNtaXQgRGVzY3JpcHRvciBSaW5ncyAocXVhZHdvcmQgYm91bmRhcnkpCisgKiAgICAgLSBEYXRhIEJ1ZmZlcnMgKGFyYml0cmFyeSBib3VuZGFyeSkKKyAqCisgKiBUaGlzIGlzIGJlY2F1c2UgTEFOQ0UgaGFzIG9uIFNLX0cxNiBvbmx5IGFjY2VzcyB0byB0aGUgZHVhbCBwb3J0ZWQKKyAqIFJBTSBhbmQgbm93aGVyZSBlbHNlLgorICovCisKK3N0cnVjdCBTS19yYW0KK3sKKyAgICBzdHJ1Y3QgaW5pdF9ibG9jayBpYjsKKyAgICBzdHJ1Y3QgdG1kIHRtZGVbVE1ETlVNXTsKKyAgICBzdHJ1Y3Qgcm1kIHJtZGVbUk1ETlVNXTsKKyAgICBjaGFyIHRtZGJ1ZltUTUROVU1dW1BLVF9CVUZfU1pdOworICAgIGNoYXIgcm1kYnVmW1JNRE5VTV1bUEtUX0JVRl9TWl07Cit9OworCisvKiAKKyAqIFN0cnVjdHVyZSB3aGVyZSBhbGwgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGlzIGZvciByaW5nIGJ1ZmZlciAKKyAqIG1hbmFnZW1lbnQgYW5kIHN0YXRpc3RpY3MuCisgKi8KKworc3RydWN0IHByaXYKK3sKKyAgICBzdHJ1Y3QgU0tfcmFtICpyYW07ICAvKiBkdWFsIHBvcnRlZCByYW0gc3RydWN0dXJlICovCisgICAgc3RydWN0IHJtZCAqcm1kaGVhZDsgLyogc3RhcnQgb2YgcmVjZWl2ZSByaW5nIGRlc2NyaXB0b3JzICovCisgICAgc3RydWN0IHRtZCAqdG1kaGVhZDsgLyogc3RhcnQgb2YgdHJhbnNtaXQgcmluZyBkZXNjcmlwdG9ycyAqLworICAgIGludCAgICAgICAgcm1kbnVtOyAgIC8qIGFjdHVhbCB1c2VkIHJpbmcgZGVzY3JpcHRvciAqLworICAgIGludCAgICAgICAgdG1kbnVtOyAgIC8qIGFjdHVhbCB0cmFuc21pdCBkZXNjcmlwdG9yIGZvciB0cmFuc21pdHRpbmcgZGF0YSAqLworICAgIGludCAgICAgICAgdG1kbGFzdDsgIC8qIGxhc3Qgc2VudCBkZXNjcmlwdG9yIHVzZWQgZm9yIGVycm9yIGhhbmRsaW5nLCBldGMgKi8KKyAgICB2b2lkICAgICAgICpybWRidWZzW1JNRE5VTV07IC8qIHBvaW50ZXIgdG8gdGhlIHJlY2VpdmUgYnVmZmVycyAqLworICAgIHZvaWQgICAgICAgKnRtZGJ1ZnNbVE1ETlVNXTsgLyogcG9pbnRlciB0byB0aGUgdHJhbnNtaXQgYnVmZmVycyAqLworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOyAvKiBEZXZpY2UgZHJpdmVyIHN0YXRpc3RpY3MgKi8KK307CisKKy8qIGdsb2JhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiAqLworCisvKiBJUlEgbWFwIHVzZWQgdG8gcmVzZXJ2ZSBhIElSUSAoc2VlIFNLX29wZW4oKSkgKi8KKworLyogc3RhdGljIHZhcmlhYmxlcyAqLworCitzdGF0aWMgU0tfUkFNICpib2FyZDsgIC8qIHBvaW50ZXIgdG8gb3VyIG1lbW9yeSBtYXBwZWQgYm9hcmQgY29tcG9uZW50cyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhTS19sb2NrKTsKKworLyogTWFjcm9zICovCisKKwwKKy8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgKi8KKworLyoKKyAqIERldmljZSBEcml2ZXIgZnVuY3Rpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2VlIGZvciBzaG9ydCBleHBsYW5hdGlvbiBvZiBlYWNoIGZ1bmN0aW9uIGl0cyBkZWZpbml0aW9ucyBoZWFkZXIuCisgKi8KKworc3RhdGljIGludCAgIFNLX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGlvYWRkcik7CisKK3N0YXRpYyB2b2lkICBTS190aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgIFNLX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgU0tfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgU0tfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKK3N0YXRpYyB2b2lkICBTS19yeGludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgU0tfdHhpbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgIFNLX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlNLX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordW5zaWduZWQgaW50IFNLX3JvbV9hZGRyKHZvaWQpOworCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qCisgKiBMQU5DRSBGdW5jdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbnQgU0tfbGFuY2VfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBtb2RlKTsKK3ZvaWQgICBTS19yZXNldF9ib2FyZCh2b2lkKTsKK3ZvaWQgICBTS19zZXRfUkFQKGludCByZWdfbnVtYmVyKTsKK2ludCAgICBTS19yZWFkX3JlZyhpbnQgcmVnX251bWJlcik7CitpbnQgICAgU0tfcnJlYWRfcmVnKHZvaWQpOwordm9pZCAgIFNLX3dyaXRlX3JlZyhpbnQgcmVnX251bWJlciwgaW50IHZhbHVlKTsKKworLyogCisgKiBEZWJ1Z2dpbmcgZnVuY3Rpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKwordm9pZCBTS19wcmludF9wb3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqdGV4dCk7Cit2b2lkIFNLX3ByaW50X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICp0ZXh0KTsKK3ZvaWQgU0tfcHJpbnRfcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisMCisvKi0KKyAqIEZ1bmN0aW9uICAgICAgIDogU0tfaW5pdAorICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI2CisgKgorICogRGVzY3JpcHRpb24gICAgOiBDaGVjayBmb3IgYSBTS19HMTYgbmV0d29yayBhZGFwdG9yIGFuZCBpbml0aWFsaXplIGl0LgorICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGJ5IGRldl9pbml0IHdoaWNoIGluaXRpYWxpemVzCisgKiAgICAgICAgICAgICAgICAgIGFsbCBOZXR3b3JrIGRldmljZXMuCisgKgorICogUGFyYW1ldGVycyAgICAgOiBJIDogc3RydWN0IG5ldF9kZXZpY2UgKmRldiAtIHN0cnVjdHVyZSBwcmVjb25maWd1cmVkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBTcGFjZS5jCisgKiBSZXR1cm4gVmFsdWUgICA6IDAgPSBEcml2ZXIgRm91bmQgYW5kIGluaXRpYWxpemVkIAorICogRXJyb3JzICAgICAgICAgOiBFTk9ERVYgLSBubyBkZXZpY2UgZm91bmQKKyAqICAgICAgICAgICAgICAgICAgRU5YSU8gIC0gbm90IHByb2JlZAorICogR2xvYmFscyAgICAgICAgOiBOb25lCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKy0qLworCitzdGF0aWMgaW50IGlvOwkvKiAwID09IHByb2JlICovCisKKy8qIAorICogQ2hlY2sgZm9yIGEgbmV0d29yayBhZGFwdG9yIG9mIHRoaXMgdHlwZSwgYW5kIHJldHVybiAnMCcgaWYgb25lIGV4aXN0cy4KKyAqIElmIGRldi0+YmFzZV9hZGRyID09IDAsIHByb2JlIGFsbCBsaWtlbHkgbG9jYXRpb25zLgorICogSWYgZGV2LT5iYXNlX2FkZHIgPT0gMSwgYWx3YXlzIHJldHVybiBmYWlsdXJlLgorICovCisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IFNLX2luaXQoaW50IHVuaXQpCit7CisJaW50ICpwb3J0LCBwb3J0c1tdID0gU0tfSU9fUE9SVFM7ICAvKiBTS19HMTYgc3VwcG9ydGVkIHBvcnRzICovCisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBwcml2KSk7CisJaW50IGVyciA9IC1FTk9ERVY7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwkJaW8gPSBkZXYtPmJhc2VfYWRkcjsKKwl9CisKKwlpZiAodmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkgICAgICAgIFBSSU5USygoIiVzOiAlcyIsIFNLX05BTUUsIHJjc2lkKSk7CisKKwlpZiAoaW8gPiAweGZmKSB7ICAgICAgICAvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgYWRkcmVzcyAqLworCQllcnIgPSAtRUJVU1k7CisJCS8qIENoZWNrIGlmIG9uIHNwZWNpZmllZCBhZGRyZXNzIGlzIGEgU0tfRzE2ICovCisJCWlmIChyZXF1ZXN0X3JlZ2lvbihpbywgRVRIRVJDQVJEX1RPVEFMX1NJWkUsICJza19nMTYiKSkgeworCQkJZXJyID0gU0tfcHJvYmUoZGV2LCBpbyk7CisJCQlpZiAoIWVycikKKwkJCQlnb3RvIGdvdF9pdDsKKwkJCXJlbGVhc2VfcmVnaW9uKGlvLCBFVEhFUkNBUkRfVE9UQUxfU0laRSk7CisJCX0KKwl9IGVsc2UgaWYgKGlvID4gMCkgeyAgICAgICAvKiBEb24ndCBwcm9iZSBhdCBhbGwgKi8KKwkJZXJyID0gLUVOWElPOworCX0gZWxzZSB7CisJCS8qIEF1dG9wcm9iZSBiYXNlX2FkZHIgKi8KKwkJZm9yIChwb3J0ID0gJnBvcnRzWzBdOyAqcG9ydDsgcG9ydCsrKSB7CisJCQlpbyA9ICpwb3J0OworCisJCQkvKiBDaGVjayBpZiBJL08gUG9ydCByZWdpb24gaXMgdXNlZCBieSBhbm90aGVyIGJvYXJkICovCisJCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCBFVEhFUkNBUkRfVE9UQUxfU0laRSwgInNrX2cxNiIpKQorCQkJCWNvbnRpbnVlOyAgICAgICAvKiBUcnkgbmV4dCBQb3J0IGFkZHJlc3MgKi8KKworCQkJLyogQ2hlY2sgaWYgYXQgaW9hZGRyIGlzIGEgU0tfRzE2ICovCisJCQlpZiAoU0tfcHJvYmUoZGV2LCBpbykgPT0gMCkKKwkJCQlnb3RvIGdvdF9pdDsKKworCQkJcmVsZWFzZV9yZWdpb24oaW8sIEVUSEVSQ0FSRF9UT1RBTF9TSVpFKTsKKwkJfQorCX0KK2Vycl9vdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworCitnb3RfaXQ6CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRVRIRVJDQVJEX1RPVEFMX1NJWkUpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCXJldHVybiBkZXY7CisKK30gLyogRW5kIG9mIFNLX2luaXQgKi8KKworCitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIEouRC4gV2VpY2htYW5uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNjaG5laWRlciAmIEtvY2ggRzE2IEV0aGVybmV0IERldmljZSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9QQVJNKGlvLCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhpbywgIjAgdG8gcHJvYmUgY29tbW9uIHBvcnRzICh1bnNhZmUpLCBvciB0aGUgSS9PIGJhc2Ugb2YgdGhlIGJvYXJkIik7CisKKworI2lmZGVmIE1PRFVMRQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKlNLX2RldjsKKworc3RhdGljIGludCBfX2luaXQgU0tfaW5pdF9tb2R1bGUgKHZvaWQpCit7CisgCVNLX2RldiA9IFNLX2luaXQoLTEpOworIAlyZXR1cm4gSVNfRVJSKFNLX2RldikgPyBQVFJfRVJSKFNLX2RldikgOiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgU0tfY2xlYW51cF9tb2R1bGUgKHZvaWQpCit7CisgCXVucmVnaXN0ZXJfbmV0ZGV2KFNLX2Rldik7CisgCXJlbGVhc2VfcmVnaW9uKFNLX2Rldi0+YmFzZV9hZGRyLCBFVEhFUkNBUkRfVE9UQUxfU0laRSk7CisgCWZyZWVfbmV0ZGV2KFNLX2Rldik7Cit9CisKK21vZHVsZV9pbml0KFNLX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KFNLX2NsZWFudXBfbW9kdWxlKTsKKyNlbmRpZgorCisMCisvKi0KKyAqIEZ1bmN0aW9uICAgICAgIDogU0tfcHJvYmUKKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yNgorICoKKyAqIERlc2NyaXB0aW9uICAgIDogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgU0tfaW5pdCBhbmQgCisgKiAgICAgICAgICAgICAgICAgIGRvZXMgdGhlIG1haW4gcGFydCBvZiBpbml0aWFsaXphdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgCisgKiBQYXJhbWV0ZXJzICAgICA6IEkgOiBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2IC0gU0tfRzE2IGRldmljZSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICAgSSA6IHNob3J0IGlvYWRkciAgICAgICAtIEkvTyBQb3J0IGFkZHJlc3Mgd2hlcmUgUE9TIGlzLgorICogUmV0dXJuIFZhbHVlICAgOiAwID0gSW5pdGlhbGl6YXRpb24gZG9uZSAgICAgICAgICAgICAKKyAqIEVycm9ycyAgICAgICAgIDogRU5PREVWIC0gTm8gU0tfRzE2IGZvdW5kCisgKiAgICAgICAgICAgICAgICAgIC0xICAgICAtIENvbmZpZ3VyYXRpb24gcHJvYmxlbQorICogR2xvYmFscyAgICAgICAgOiBib2FyZCAgICAgICAtIHBvaW50ZXIgdG8gU0tfUkFNCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKyAqICAgICA5NC8wNi8zMCAgcHdlICBTS19BRERSIG5vdyBjaGVja2VkIGFuZCBhdCB0aGUgY29ycmVjdCBwbGFjZQorLSovCisKK2ludCBfX2luaXQgU0tfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgaW9hZGRyKQoreworICAgIGludCBpLGo7ICAgICAgICAgICAgICAgIC8qIENvdW50ZXJzICovCisgICAgaW50IHNrX2FkZHJfZmxhZyA9IDA7ICAgLyogU0sgQUREUiBjb3JyZWN0PyAxIC0gbm8sIDAgLSB5ZXMgKi8KKyAgICB1bnNpZ25lZCBpbnQgcm9tX2FkZHI7ICAvKiB1c2VkIHRvIHN0b3JlIFJBTSBhZGRyZXNzIHVzZWQgZm9yIFBPU19BRERSICovCisKKyAgICBzdHJ1Y3QgcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CS8qIFNLX0cxNiBwcml2YXRlIHN0cnVjdHVyZSAqLworCisgICAgaWYgKGluYihTS19QT1MwKSAhPSBTS19JRExPVyB8fCBpbmIoU0tfUE9TMSkgIT0gU0tfSURISUdIKQorCXJldHVybiAtRU5PREVWOworICAgIGRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisgICAgaWYgKFNLX0FERFIgJiAweDNmZmYgfHwgU0tfQUREUiA8IDB4YTAwMDApCisgICAgeworICAgICAgCisgICAgICAgc2tfYWRkcl9mbGFnID0gMTsKKworICAgICAgIC8qIAorICAgICAgICAqIE5vdyBoZXJlIHdlIGNvdWxkIHVzZSBhIHJvdXRpbmUgd2hpY2ggc2VhcmNoZXMgZm9yIGEgZnJlZQorICAgICAgICAqIHBsYWNlIGluIHRoZSByYW0gYW5kIHNldCBTS19BRERSIGlmIGZvdW5kLiBUT0RPLiAKKyAgICAgICAgKi8KKyAgICB9CisKKyAgICBpZiAoU0tfQk9PVF9ST00pICAgICAgICAgICAgLyogU2hhbGwgd2Uga2VlcCBCb290X1JPTSBvbiA/ICovCisgICAgeworICAgICAgICBQUklOVEsoKCIjIyAlczogU0tfQk9PVF9ST00gaXMgc2V0LlxuIiwgU0tfTkFNRSkpOworCisgICAgICAgIHJvbV9hZGRyID0gU0tfcm9tX2FkZHIoKTsKKworCWlmIChyb21fYWRkciA9PSAwKSAgICAgIC8qIE5vIEJvb3RfUk9NIGZvdW5kICovCisJeworICAgICAgICAgICAgaWYgKHNrX2FkZHJfZmxhZykgICAvKiBObyBvciBJbnZhbGlkIFNLX0FERFIgaXMgZGVmaW5lZCAqLyAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIiVzOiBTS19BRERSICUjMDh4IGlzIG5vdCB2YWxpZC4gQ2hlY2sgY29uZmlndXJhdGlvbi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgU0tfQUREUik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisJICAgIHJvbV9hZGRyID0gU0tfQUREUjsgLyogYXNzaWduIHByZWRlZmluZWQgYWRkcmVzcyAqLworCisJICAgIFBSSU5USygoIiMjICVzOiBOTyBCb290cm9tIGZvdW5kIFxuIiwgU0tfTkFNRSkpOworCisJICAgIG91dGIoU0tfUk9NX1JBTV9PRkYsIFNLX1BPUzIpOyAvKiBCb290X1JPTSArIFJBTSBvZmYgKi8KKwkgICAgb3V0YihQT1NfQUREUiwgU0tfUE9TMyk7ICAgICAgIC8qIFNldCBSQU0gYWRkcmVzcyAqLworCSAgICBvdXRiKFNLX1JBTV9PTiwgU0tfUE9TMik7ICAgICAgLyogZW5hYmxlIFJBTSAqLworCX0KKwllbHNlIGlmIChyb21fYWRkciA9PSBTS19BRERSKSAKKwl7CisgICAgICAgICAgICBwcmludGsoIiVzOiBSQU0gKyBST00gYXJlIHNldCB0byB0aGUgc2FtZSBhZGRyZXNzICUjMDh4XG4iCisgICAgICAgICAgICAgICAgICAgIiAgIENoZWNrIGNvbmZpZ3VyYXRpb24uIE5vdyBzd2l0Y2hpbmcgb2ZmIEJvb3RfUk9NXG4iLAorICAgICAgICAgICAgICAgICAgIFNLX05BTUUsIHJvbV9hZGRyKTsKKworCSAgICBvdXRiKFNLX1JPTV9SQU1fT0ZGLCBTS19QT1MyKTsgLyogQm9vdF9ST00gKyBSQU0gb2ZmKi8KKwkgICAgb3V0YihQT1NfQUREUiwgU0tfUE9TMyk7ICAgICAgIC8qIFNldCBSQU0gYWRkcmVzcyAqLworCSAgICBvdXRiKFNLX1JBTV9PTiwgU0tfUE9TMik7ICAgICAgLyogZW5hYmxlIFJBTSAqLworCX0KKwllbHNlCisJeworICAgICAgICAgICAgUFJJTlRLKCgiIyMgJXM6IEZvdW5kIFJPTSBhdCAlIzA4eFxuIiwgU0tfTkFNRSwgcm9tX2FkZHIpKTsKKwkgICAgUFJJTlRLKCgiIyMgJXM6IEtlZXBpbmcgQm9vdF9ST00gb25cbiIsIFNLX05BTUUpKTsKKworICAgICAgICAgICAgaWYgKHNrX2FkZHJfZmxhZykgICAgICAgLyogTm8gb3IgSW52YWxpZCBTS19BRERSIGlzIGRlZmluZWQgKi8gCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCIlczogU0tfQUREUiAlIzA4eCBpcyBub3QgdmFsaWQuIENoZWNrIGNvbmZpZ3VyYXRpb24uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIFNLX0FERFIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworCSAgICByb21fYWRkciA9IFNLX0FERFI7CisKKwkgICAgb3V0YihTS19ST01fUkFNX09GRiwgU0tfUE9TMik7IC8qIEJvb3RfUk9NICsgUkFNIG9mZiAqLyAKKwkgICAgb3V0YihQT1NfQUREUiwgU0tfUE9TMyk7ICAgICAgIC8qIFNldCBSQU0gYWRkcmVzcyAqLworCSAgICBvdXRiKFNLX1JPTV9SQU1fT04sIFNLX1BPUzIpOyAgLyogUkFNIG9uLCBCT09UX1JPTSBvbiAqLworCX0KKyAgICB9CisgICAgZWxzZSAvKiBEb24ndCBrZWVwIEJvb3RfUk9NICovCisgICAgeworICAgICAgICBQUklOVEsoKCIjIyAlczogU0tfQk9PVF9ST00gaXMgbm90IHNldC5cbiIsIFNLX05BTUUpKTsKKworICAgICAgICBpZiAoc2tfYWRkcl9mbGFnKSAgICAgICAgICAgLyogTm8gb3IgSW52YWxpZCBTS19BRERSIGlzIGRlZmluZWQgKi8gCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiJXM6IFNLX0FERFIgJSMwOHggaXMgbm90IHZhbGlkLiBDaGVjayBjb25maWd1cmF0aW9uLlxuIiwKKyAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIFNLX0FERFIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKwlyb21fYWRkciA9IFNLX3JvbV9hZGRyKCk7ICAgICAgICAgIC8qIFRyeSB0byBmaW5kIGEgQm9vdF9ST00gKi8KKworCS8qIElGIHdlIGZpbmQgYSBCb290X1JPTSBkaXNhYmxlIGl0ICovCisKKwlvdXRiKFNLX1JPTV9SQU1fT0ZGLCBTS19QT1MyKTsgICAgIC8qIEJvb3RfUk9NICsgUkFNIG9mZiAqLyAgCisKKyAgICAgICAgLyogV2UgZm91bmQgYSBCb290X1JPTSBhbmQgaXQncyBnb25lLiBTZXQgUkFNIGFkZHJlc3Mgb24KKyAgICAgICAgICogQm9vdF9ST00gYWRkcmVzcy4gCisgICAgICAgICAqLyAKKworCWlmIChyb21fYWRkcikgCisJeworICAgICAgICAgICAgcHJpbnRrKCIlczogV2UgZm91bmQgQm9vdF9ST00gYXQgJSMwOHguIE5vdyBzZXR0aW5nIFJBTSBvbiIKKyAgICAgICAgICAgICAgICAgICAidGhhdCBhZGRyZXNzXG4iLCBTS19OQU1FLCByb21fYWRkcik7CisKKwkgICAgb3V0YihQT1NfQUREUiwgU0tfUE9TMyk7ICAgICAgIC8qIFNldCBSQU0gb24gQm9vdF9ST00gYWRkcmVzcyAqLworCX0KKwllbHNlIC8qIFdlIGRpZCBub3QgZmluZCBhIEJvb3RfUk9NLCB1c2UgcHJlZGVmaW5lZCBTS19BRERSIGZvciByYW0gKi8KKwl7CisgICAgICAgICAgICBpZiAoc2tfYWRkcl9mbGFnKSAgICAgICAvKiBObyBvciBJbnZhbGlkIFNLX0FERFIgaXMgZGVmaW5lZCAqLyAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIiVzOiBTS19BRERSICUjMDh4IGlzIG5vdCB2YWxpZC4gQ2hlY2sgY29uZmlndXJhdGlvbi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgU0tfQUREUik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisJICAgIHJvbV9hZGRyID0gU0tfQUREUjsKKworCSAgICBvdXRiKFBPU19BRERSLCBTS19QT1MzKTsgICAgICAgLyogU2V0IFJBTSBhZGRyZXNzICovIAorCX0KKwlvdXRiKFNLX1JBTV9PTiwgU0tfUE9TMik7ICAgICAgICAgIC8qIGVuYWJsZSBSQU0gKi8KKyAgICB9CisKKyNpZmRlZiBTS19ERUJVRworICAgIFNLX3ByaW50X3BvcyhkZXYsICJQT1MgcmVnaXN0ZXJzIGFmdGVyIFJPTSwgUkFNIGNvbmZpZyIpOworI2VuZGlmCisKKyAgICBib2FyZCA9IChTS19SQU0gKikgaXNhX2J1c190b192aXJ0KHJvbV9hZGRyKTsKKworICAgIC8qIFJlYWQgaW4gc3RhdGlvbiBhZGRyZXNzICovCisgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrLCBqKz0yKQorICAgIHsKKwlkZXYtPmRldl9hZGRyW2ldID0gcmVhZGIoYm9hcmQtPnJvbStqKTsgICAgICAgICAgCisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIG1hbnVmYWN0dXJlciBjb2RlICovCisgICAgaWYgKCEoZGV2LT5kZXZfYWRkclswXSA9PSBTS19NQUMwICYmCisJICBkZXYtPmRldl9hZGRyWzFdID09IFNLX01BQzEgJiYKKwkgIGRldi0+ZGV2X2FkZHJbMl0gPT0gU0tfTUFDMikgKQorICAgIHsKKyAgICAgICAgUFJJTlRLKCgiIyMgJXM6IFdlIGRpZCBub3QgZmluZCBTS19HMTYgYXQgUkFNIGxvY2F0aW9uLlxuIiwKKyAgICAgICAgICAgICAgICBTS19OQU1FKSk7IAorCXJldHVybiAtRU5PREVWOyAgICAgICAgICAgICAgICAgICAgIC8qIE5PIFNLX0cxNiBmb3VuZCAqLworICAgIH0KKworICAgIHByaW50aygiJXM6ICVzIGZvdW5kIGF0ICUjM3gsIEhXIGFkZHI6ICUjMDR4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgZGV2LT5uYW1lLAorCSAgICAiU2NobmVpZGVyICYgS29jaCBOZXRjYXJkIiwKKwkgICAgKHVuc2lnbmVkIGludCkgZGV2LT5iYXNlX2FkZHIsCisJICAgIGRldi0+ZGV2X2FkZHJbMF0sCisJICAgIGRldi0+ZGV2X2FkZHJbMV0sCisJICAgIGRldi0+ZGV2X2FkZHJbMl0sCisJICAgIGRldi0+ZGV2X2FkZHJbM10sCisJICAgIGRldi0+ZGV2X2FkZHJbNF0sCisJICAgIGRldi0+ZGV2X2FkZHJbNV0pOworCisgICAgbWVtc2V0KChjaGFyICopIGRldi0+cHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBwcml2KSk7IC8qIGNsZWFyIG1lbW9yeSAqLworCisgICAgLyogQXNzaWduIG91ciBEZXZpY2UgRHJpdmVyIGZ1bmN0aW9ucyAqLworCisgICAgZGV2LT5vcGVuICAgICAgICAgICAgICAgICAgID0gU0tfb3BlbjsKKyAgICBkZXYtPnN0b3AgICAgICAgICAgICAgICAgICAgPSBTS19jbG9zZTsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCAgICAgICAgPSBTS19zZW5kX3BhY2tldDsKKyAgICBkZXYtPmdldF9zdGF0cyAgICAgICAgICAgICAgPSBTS19nZXRfc3RhdHM7CisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgICAgID0gc2V0X211bHRpY2FzdF9saXN0OworICAgIGRldi0+dHhfdGltZW91dAkJPSBTS190aW1lb3V0OworICAgIGRldi0+d2F0Y2hkb2dfdGltZW8JCT0gSFovNzsKKworCisgICAgZGV2LT5mbGFncyAmPSB+SUZGX01VTFRJQ0FTVDsKKworICAgIC8qIEluaXRpYWxpemUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKworICAgIHAtPnJhbSA9IChzdHJ1Y3QgU0tfcmFtICopIHJvbV9hZGRyOyAvKiBTZXQgZHVhbCBwb3J0ZWQgUkFNIGFkZHIgKi8KKyAgICBwLT50bWRoZWFkID0gJihwLT5yYW0pLT50bWRlWzBdOyAgICAgLyogU2V0IFRNRCBoZWFkICovCisgICAgcC0+cm1kaGVhZCA9ICYocC0+cmFtKS0+cm1kZVswXTsgICAgIC8qIFNldCBSTUQgaGVhZCAqLworCisgICAgLyogSW5pdGlhbGl6ZSBidWZmZXIgcG9pbnRlcnMgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBUTUROVU07IGkrKykKKyAgICB7CisJcC0+dG1kYnVmc1tpXSA9ICYocC0+cmFtKS0+dG1kYnVmW2ldOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBSTUROVU07IGkrKykKKyAgICB7CisJcC0+cm1kYnVmc1tpXSA9ICYocC0+cmFtKS0+cm1kYnVmW2ldOyAKKyAgICB9CisKKyNpZmRlZiBTS19ERUJVRworICAgIFNLX3ByaW50X3BvcyhkZXYsICJFbmQgb2YgU0tfcHJvYmUiKTsKKyAgICBTS19wcmludF9yYW0oZGV2KTsKKyNlbmRpZiAKKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6YXRpb24gZG9uZSAqLworfSAvKiBFbmQgb2YgU0tfcHJvYmUoKSAqLworCisMCisvKi0gCisgKiBGdW5jdGlvbiAgICAgICA6IFNLX29wZW4KKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yNgorICoKKyAqIERlc2NyaXB0aW9uICAgIDogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgc29tZXRpbWVzIGFmdGVyIGJvb3RpbmcgCisgKiAgICAgICAgICAgICAgICAgIHdoZW4gaWZjb25maWcgcHJvZ3JhbSBpcyBydW4uCisgKgorICogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlcXVlc3RzIGFuIElSUSwgc2V0cyB0aGUgY29ycmVjdAorICogICAgICAgICAgICAgICAgICBJUlEgaW4gdGhlIGNhcmQuIFRoZW4gY2FsbHMgU0tfbGFuY2VfaW5pdCgpIHRvIAorICogICAgICAgICAgICAgICAgICBpbml0IGFuZCBzdGFydCB0aGUgTEFOQ0UgY2hpcC4gVGhlbiBpZiBldmVyeXRoaW5nIGlzIAorICogICAgICAgICAgICAgICAgICBvayByZXR1cm5zIHdpdGggMCAoT0spLCB3aGljaCBtZWFucyBTS19HMTYgaXMgbm93CisgKiAgICAgICAgICAgICAgICAgIG9wZW5lZCBhbmQgb3BlcmF0aW9uYWwuCisgKgorICogICAgICAgICAgICAgICAgICAoQ2FsbGVkIGJ5IGRldl9vcGVuKCkgL25ldC9pbmV0L2Rldi5jKQorICoKKyAqIFBhcmFtZXRlcnMgICAgIDogSSA6IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgLSBTS19HMTYgZGV2aWNlIHN0cnVjdHVyZQorICogUmV0dXJuIFZhbHVlICAgOiAwIC0gRGV2aWNlIG9wZW5lZAorICogRXJyb3JzICAgICAgICAgOiAtRUFHQUlOIC0gT3BlbiBmYWlsZWQKKyAqIFNpZGUgRWZmZWN0cyAgIDogTm9uZQorICogVXBkYXRlIEhpc3RvcnkgOgorICogICAgIFlZL01NL0REICB1aWQgIERlc2NyaXB0aW9uCistKi8KKworc3RhdGljIGludCBTS19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaW50IGkgPSAwOworICAgIGludCBpcnF2YWwgPSAwOworICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIGludCBpcnF0YWJbXSA9IFNLX0lSUVM7IAorCisgICAgc3RydWN0IHByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgUFJJTlRLKCgiIyMgJXM6IEF0IGJlZ2lubmluZyBvZiBTS19vcGVuKCkuIENTUjA6ICUjMDZ4XG4iLCAKKyAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKworICAgIGlmIChkZXYtPmlycSA9PSAwKSAvKiBBdXRvaXJxICovCisgICAgeworCWkgPSAwOworCisJLyogCisgICAgICAgICAqIENoZWNrIGlmIG9uZSBJUlEgb3V0IG9mIFNLX0lSUVMgaXMgZnJlZSBhbmQgaW5zdGFsbCAKKwkgKiBpbnRlcnJ1cHQgaGFuZGxlci4KKwkgKiBNb3N0IGRvbmUgYnkgcmVxdWVzdF9pcnEoKS4gCisJICogaXJxdmFsOiAwICAgICAgIC0gaW50ZXJydXB0IGhhbmRsZXIgaW5zdGFsbGVkIGZvciBJUlEgaXJxdGFiW2ldCisJICogICAgICAgICAtRUJVU1kgIC0gaW50ZXJydXB0IGJ1c3kgCisgICAgICAgICAqICAgICAgICAgLUVJTlZBTCAtIGlycSA+IDE1IG9yIGhhbmRsZXIgPSBOVUxMCisJICovCisKKwlkbworCXsKKwkgIGlycXZhbCA9IHJlcXVlc3RfaXJxKGlycXRhYltpXSwgJlNLX2ludGVycnVwdCwgMCwgInNrX2cxNiIsIGRldik7CisJICBpKys7CisJfSB3aGlsZSAoaXJxdmFsICYmIGlycXRhYltpXSk7CisKKwlpZiAoaXJxdmFsKSAvKiBXZSB0cmllZCBldmVyeSBwb3NzaWJsZSBJUlEgYnV0IG5vIHN1Y2Nlc3MgKi8KKwl7CisJICAgIHByaW50aygiJXM6IHVuYWJsZSB0byBnZXQgYW4gSVJRXG4iLCBkZXYtPm5hbWUpOworCSAgICByZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlkZXYtPmlycSA9IGlycXRhYlstLWldOyAKKwkKKwlvdXRiKGk8PDIsIFNLX1BPUzQpOyAgICAgICAgICAgLyogU2V0IENhcmQgb24gcHJvYmVkIElSUSAqLworCisgICAgfQorICAgIGVsc2UgaWYgKGRldi0+aXJxID09IDIpIC8qIElSUTIgaXMgYWx3YXlzIElSUTkgKi8KKyAgICB7CisJaWYgKHJlcXVlc3RfaXJxKDksICZTS19pbnRlcnJ1cHQsIDAsICJza19nMTYiLCBkZXYpKQorCXsKKwkgICAgcHJpbnRrKCIlczogdW5hYmxlIHRvIGdldCBJUlEgOVxuIiwgZGV2LT5uYW1lKTsKKwkgICAgcmV0dXJuIC1FQUdBSU47CisJfSAKKwlkZXYtPmlycSA9IDk7CisJCisgICAgICAgIC8qIAorICAgICAgICAgKiBOb3cgd2Ugc2V0IGNhcmQgb24gSVJRMi4KKyAgICAgICAgICogVGhpcyBjYW4gYmUgY29uZnVzaW5nLCBidXQgcmVtZW1iZXIgdGhhdCBJUlEyIG9uIHRoZSBuZXR3b3JrCisgICAgICAgICAqIGNhcmQgaXMgaW4gcmVhbGl0eSBJUlE5CisgICAgICAgICAqLworCW91dGIoMHgwOCwgU0tfUE9TNCk7ICAgICAgICAgICAvKiBzZXQgY2FyZCB0byBJUlEyICovCisKKyAgICB9CisgICAgZWxzZSAgLyogQ2hlY2sgSVJRIGFzIGRlZmluZWQgaW4gU3BhY2UuYyAqLworICAgIHsKKwlpbnQgaSA9IDA7CisKKwkvKiBjaGVjayBpZiBJUlEgZnJlZSBhbmQgdmFsaWQuIFRoZW4gaW5zdGFsbCBJbnRlcnJ1cHQgaGFuZGxlciAqLworCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmU0tfaW50ZXJydXB0LCAwLCAic2tfZzE2IiwgZGV2KSkKKwl7CisJICAgIHByaW50aygiJXM6IHVuYWJsZSB0byBnZXQgc2VsZWN0ZWQgSVJRXG4iLCBkZXYtPm5hbWUpOworCSAgICByZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlzd2l0Y2goZGV2LT5pcnEpCisJeworCSAgICBjYXNlIDM6IGkgPSAwOworCQkgICAgYnJlYWs7CisJICAgIGNhc2UgNTogaSA9IDE7CisJCSAgICBicmVhazsKKwkgICAgY2FzZSAyOiBpID0gMjsKKwkJICAgIGJyZWFrOworCSAgICBjYXNlIDExOmkgPSAzOworCQkgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6IAorCQlwcmludGsoIiVzOiBQcmVzZWxlY3RlZCBJUlEgJWQgaXMgaW52YWxpZCBmb3IgJXMgYm9hcmRzIiwKKwkJICAgICAgIGRldi0+bmFtZSwKKwkJICAgICAgIGRldi0+aXJxLAorICAgICAgICAgICAgICAgICAgICAgICBTS19OQU1FKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfSAgICAgIAorICAKKwlvdXRiKGk8PDIsIFNLX1BPUzQpOyAgICAgICAgICAgLyogU2V0IElSUSBvbiBjYXJkICovCisgICAgfQorCisgICAgcHJpbnRrKCIlczogU2NobmVpZGVyICYgS29jaCBHMTYgYXQgJSMzeCwgSVJRICVkLCBzaGFyZWQgbWVtIGF0ICUjMDh4XG4iLAorCSAgICBkZXYtPm5hbWUsICh1bnNpZ25lZCBpbnQpZGV2LT5iYXNlX2FkZHIsIAorCSAgICAoaW50KSBkZXYtPmlycSwgKHVuc2lnbmVkIGludCkgcC0+cmFtKTsKKworICAgIGlmICghKGkgPSBTS19sYW5jZV9pbml0KGRldiwgMCkpKSAgLyogTEFOQ0UgaW5pdCBPSz8gKi8KKyAgICB7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworI2lmZGVmIFNLX0RFQlVHCisKKyAgICAgICAgLyogCisgICAgICAgICAqIFRoaXMgZGVidWcgYmxvY2sgdHJpZXMgdG8gc3RvcCBMQU5DRSwKKyAgICAgICAgICogcmVpbml0IExBTkNFIHdpdGggdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyIGRpc2FibGVkLAorICAgICAgICAgKiB0aGVuIHN0b3AgYWdhaW4gYW5kIHJlaW5pdCB3aXRoIE5PUk1BTF9NT0RFCisgICAgICAgICAqLworCisgICAgICAgIHByaW50aygiIyMgJXM6IEFmdGVyIGxhbmNlIGluaXQuIENTUjA6ICUjMDZ4XG4iLCAKKyAgICAgICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKTsKKyAgICAgICAgU0tfd3JpdGVfcmVnKENTUjAsIENTUjBfU1RPUCk7CisgICAgICAgIHByaW50aygiIyMgJXM6IExBTkNFIHN0b3BwZWQuIENTUjA6ICUjMDZ4XG4iLCAKKyAgICAgICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKTsKKyAgICAgICAgU0tfbGFuY2VfaW5pdChkZXYsIE1PREVfRFRYIHwgTU9ERV9EUlgpOworICAgICAgICBwcmludGsoIiMjICVzOiBSZWluaXQgd2l0aCBEVFggKyBEUlggb2ZmLiBDU1IwOiAlIzA2eFxuIiwgCisgICAgICAgICAgICAgICBTS19OQU1FLCBTS19yZWFkX3JlZyhDU1IwKSk7CisgICAgICAgIFNLX3dyaXRlX3JlZyhDU1IwLCBDU1IwX1NUT1ApOworICAgICAgICBwcmludGsoIiMjICVzOiBMQU5DRSBzdG9wcGVkLiBDU1IwOiAlIzA2eFxuIiwgCisgICAgICAgICAgICAgICBTS19OQU1FLCBTS19yZWFkX3JlZyhDU1IwKSk7CisgICAgICAgIFNLX2xhbmNlX2luaXQoZGV2LCBNT0RFX05PUk1BTCk7CisgICAgICAgIHByaW50aygiIyMgJXM6IExBTkNFIGJhY2sgdG8gbm9ybWFsIG1vZGUuIENTUjA6ICUjMDZ4XG4iLCAKKyAgICAgICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKTsKKyAgICAgICAgU0tfcHJpbnRfcG9zKGRldiwgIlBPUyByZWdzIGJlZm9yZSByZXR1cm5pbmcgT0siKTsKKworI2VuZGlmIC8qIFNLX0RFQlVHICovCisgICAgICAgCisJcmV0dXJuIDA7ICAgICAgICAgICAgICAvKiBTS19vcGVuKCkgaXMgc3VjY2Vzc2Z1bCAqLworICAgIH0KKyAgICBlbHNlIC8qIExBTkNFIGluaXQgZmFpbGVkICovCisgICAgeworCisJUFJJTlRLKCgiIyMgJXM6IExBTkNFIGluaXQgZmFpbGVkOiBDU1IwOiAlIzA2eFxuIiwgCisgICAgICAgICAgICAgICBTS19OQU1FLCBTS19yZWFkX3JlZyhDU1IwKSkpOworCisJcmV0dXJuIC1FQUdBSU47CisgICAgfQorCit9IC8qIEVuZCBvZiBTS19vcGVuKCkgKi8KKworDAorLyotCisgKiBGdW5jdGlvbiAgICAgICA6IFNLX2xhbmNlX2luaXQKKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yNgorICoKKyAqIERlc2NyaXB0aW9uICAgIDogUmVzZXQgTEFOQ0UgY2hpcCwgZmlsbCBSTUQsIFRNRCBzdHJ1Y3R1cmVzIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgc3RhcnQgdmFsdWVzIGFuZCBTdGFydCBMQU5DRS4KKyAqCisgKiBQYXJhbWV0ZXJzICAgICA6IEkgOiBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2IC0gU0tfRzE2IGRldmljZSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICAgSSA6IGludCBtb2RlIC0gcHV0IExBTkNFIGludG8gIm1vZGUiIHNlZSBkYXRhLXNoZWV0IGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGluZm8uCisgKiBSZXR1cm4gVmFsdWUgICA6IDAgIC0gSW5pdCBkb25lCisgKiBFcnJvcnMgICAgICAgICA6IC0xIC0gSW5pdCBmYWlsZWQKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqICAgICBZWS9NTS9ERCAgdWlkICBEZXNjcmlwdGlvbgorLSovCisKK3N0YXRpYyBpbnQgU0tfbGFuY2VfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBtb2RlKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgc3RydWN0IHByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHN0cnVjdCB0bWQgICp0bWRwOworICAgIHN0cnVjdCBybWQgICpybWRwOworCisgICAgUFJJTlRLKCgiIyMgJXM6IEF0IGJlZ2lubmluZyBvZiBMQU5DRSBpbml0LiBDU1IwOiAlIzA2eFxuIiwgCisgICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKSk7CisKKyAgICAvKiBSZXNldCBMQU5DRSAqLworICAgIFNLX3Jlc2V0X2JvYXJkKCk7CisKKyAgICAvKiBJbml0aWFsaXplIFRNRCdzIHdpdGggc3RhcnQgdmFsdWVzICovCisgICAgcC0+dG1kbnVtID0gMDsgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgZGVzY3JpcHRvciBmb3IgdHJhbnNtaXR0aW5nICovIAorICAgIHAtPnRtZGxhc3QgPSAwOyAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IGRlc2NyaXB0b3IgZm9yIHJlYWRpbmcgc3RhdHMgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBUTUROVU07IGkrKykgICAgIC8qIEluaXQgYWxsIFRNRCdzICovCisgICAgeworCXRtZHAgPSBwLT50bWRoZWFkICsgaTsgCisgICAKKwl3cml0ZWwoKHVuc2lnbmVkIGxvbmcpIHAtPnRtZGJ1ZnNbaV0sIHRtZHAtPnUuYnVmZmVyKTsgLyogYXNzaWduIGJ1ZmZlciAqLworCQorCS8qIE1hcmsgVE1EIGFzIHN0YXJ0IGFuZCBlbmQgb2YgcGFja2V0ICovCisJd3JpdGViKFRYX1NUUCB8IFRYX0VOUCwgJnRtZHAtPnUucy5zdGF0dXMpOworICAgIH0KKworCisgICAgLyogSW5pdGlhbGl6ZSBSTUQncyB3aXRoIHN0YXJ0IHZhbHVlcyAqLworCisgICAgcC0+cm1kbnVtID0gMDsgICAgICAgICAgICAgICAgICAgLyogRmlyc3QgUk1EIHdoaWNoIHdpbGwgYmUgdXNlZCAqLworIAorICAgIGZvciAoaSA9IDA7IGkgPCBSTUROVU07IGkrKykgICAgIC8qIEluaXQgYWxsIFJNRCdzICovCisgICAgeworCXJtZHAgPSBwLT5ybWRoZWFkICsgaTsKKworCQorCXdyaXRlbCgodW5zaWduZWQgbG9uZykgcC0+cm1kYnVmc1tpXSwgcm1kcC0+dS5idWZmZXIpOyAvKiBhc3NpZ24gYnVmZmVyICovCisJCisJLyogCisgICAgICAgICAqIExBTkNFIG11c3QgYmUgb3duZXIgYXQgYmVnaW5uaW5nIHNvIHRoYXQgaGUgY2FuIGZpbGwgaW4gCisJICogcmVjZWl2aW5nIHBhY2tldHMsIHNldCBzdGF0dXMgYW5kIHJlbGVhc2UgUk1EIAorCSAqLworCisJd3JpdGViKFJYX09XTiwgJnJtZHAtPnUucy5zdGF0dXMpOworCisJd3JpdGV3KC1QS1RfQlVGX1NaLCAmcm1kcC0+Ymxlbik7IC8qIEJ1ZmZlciBTaXplICh0d28ncyBjb21wbGVtZW50KSAqLworCisJd3JpdGViKDAsICZybWRwLT5tbGVuKTsgICAgICAgICAgIC8qIGluaXQgbWVzc2FnZSBsZW5ndGggKi8gICAgICAgCisJCisgICAgfQorCisgICAgLyogRmlsbCBMQU5DRSBJbml0aWFsaXplIEJsb2NrICovCisKKyAgICB3cml0ZXcobW9kZSwgKCYoKHAtPnJhbSktPmliLm1vZGUpKSk7IC8qIFNldCBvcGVyYXRpb24gbW9kZSAqLworCisgICAgZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspICAgLyogU2V0IHBoeXNpY2FsIGFkZHJlc3MgKi8KKyAgICB7CisJd3JpdGViKGRldi0+ZGV2X2FkZHJbaV0sICgmKChwLT5yYW0pLT5pYi5wYWRkcltpXSkpKTsgCisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgICAgICAgICAgLyogU2V0IG11bHRpY2FzdCwgbG9naWNhbCBhZGRyZXNzICovCisgICAgeworCXdyaXRlYigwLCAoJigocC0+cmFtKS0+aWIubGFkZHJbaV0pKSk7IC8qIFdlIGRvIG5vdCB1c2UgbG9naWNhbCBhZGRyZXNzaW5nICovCisgICAgfSAKKworICAgIC8qIFNldCByaW5nIGRlc2NyaXB0b3IgcG9pbnRlcnMgYW5kIHNldCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgKi8KKworICAgIHdyaXRlbCgoaW50KXAtPnJtZGhlYWQgfCBSTUROVU1NQVNLLCAoJigocC0+cmFtKS0+aWIucmRycCkpKTsKKyAgICB3cml0ZWwoKGludClwLT50bWRoZWFkIHwgVE1ETlVNTUFTSywgKCYoKHAtPnJhbSktPmliLnRkcnApKSk7CisKKyAgICAvKiBQcmVwYXJlIExBTkNFIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlcnMgKi8KKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZTS19sb2NrLCBmbGFncyk7CisKKyAgICBTS193cml0ZV9yZWcoQ1NSMywgQ1NSM19BQ09OKTsgICAvKiBBbGUgQ29udHJvbCAhISFUSElTIE1VU1QgQkUgU0VUISEhISAqLworIAorICAgIC8qIAorICAgICAqIExBTkNFIGFkZHJlc3NlcyB0aGUgUkFNIGZyb20gMHgwMDAwIHRvIDB4M2ZiZiBhbmQgaGFzIG5vIGFjY2VzcyB0bworICAgICAqIFBDIE1lbW9yeSBsb2NhdGlvbnMuCisgICAgICoKKyAgICAgKiBJbiBzdHJ1Y3R1cmUgU0tfcmFtIGlzIGRlZmluZWQgdGhhdCB0aGUgZmlyc3QgdGhpbmcgaW4gcmFtCisgICAgICogaXMgdGhlIGluaXRpYWxpemF0aW9uIGJsb2NrLiBTbyBoaXMgYWRkcmVzcyBpcyBmb3IgTEFOQ0UgYWx3YXlzCisgICAgICogMHgwMDAwCisgICAgICoKKyAgICAgKiBDU1IxIGNvbnRhaW5zIGxvdyBvcmRlciBiaXRzIDE1OjAgb2YgaW5pdGlhbGl6YXRpb24gYmxvY2sgYWRkcmVzcworICAgICAqIENTUjIgaXMgYnVpbHQgb2Y6IAorICAgICAqICAgIDc6MCAgSGlnaCBvcmRlciBiaXRzIDIzOjE2IG9mIGluaXRpYWxpemF0aW9uIGJsb2NrIGFkZHJlc3MKKyAgICAgKiAgIDE1OjggIHJlc2VydmVkLCBtdXN0IGJlIDAKKyAgICAgKi8KKyAgICAKKyAgICAvKiBTZXQgaW5pdGlhbGl6YXRpb24gYmxvY2sgYWRkcmVzcyAobXVzdCBiZSBvbiB3b3JkIGJvdW5kYXJ5KSAqLworICAgIFNLX3dyaXRlX3JlZyhDU1IxLCAwKTsgICAgICAgICAgLyogU2V0IGxvdyBvcmRlciBiaXRzIDE1OjAgKi8KKyAgICBTS193cml0ZV9yZWcoQ1NSMiwgMCk7ICAgICAgICAgIC8qIFNldCBoaWdoIG9yZGVyIGJpdHMgMjM6MTYgKi8gCisgICAgCisKKyAgICBQUklOVEsoKCIjIyAlczogQWZ0ZXIgc2V0dGluZyBDU1IxLTMuIENTUjA6ICUjMDZ4XG4iLCAKKyAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKworICAgIC8qIEluaXRpYWxpemUgTEFOQ0UgKi8KKworICAgIC8qIAorICAgICAqIElOSVQgPSBJbml0aWFsaXplLCB3aGVuIHNldCwgY2F1c2VzIHRoZSBMQU5DRSB0byBiZWdpbiB0aGUKKyAgICAgKiBpbml0aWFsaXphdGlvbiBwcm9jZWR1cmUgYW5kIGFjY2VzcyB0aGUgSW5pdCBCbG9jay4KKyAgICAgKi8KKworICAgIFNLX3dyaXRlX3JlZyhDU1IwLCBDU1IwX0lOSVQpOyAKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlNLX2xvY2ssIGZsYWdzKTsKKworICAgIC8qIFdhaXQgdW50aWwgTEFOQ0UgZmluaXNoZWQgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAKKyAgICBTS19zZXRfUkFQKENTUjApOyAgICAgICAgICAgICAgLyogUmVnaXN0ZXIgQWRkcmVzcyBQb2ludGVyIHRvIENTUjAgKi8KKworICAgIGZvciAoaSA9IDA7IChpIDwgMTAwKSAmJiAhKFNLX3JyZWFkX3JlZygpICYgQ1NSMF9JRE9OKTsgaSsrKSAKKwk7IC8qIFdhaXQgdW50aWwgaW5pdCBkb25lIG9yIGdvIGFoZWFkIGlmIHByb2JsZW1zIChpPj0xMDApICovCisKKyAgICBpZiAoaSA+PSAxMDApIC8qIFNvbWV0aGluZyBpcyB3cm9uZyAhICovCisgICAgeworCXByaW50aygiJXM6IGNhbid0IGluaXQgYW03OTkwLCBzdGF0dXM6ICUwNHggIgorCSAgICAgICAiaW5pdF9ibG9jazogJSMwOHhcbiIsIAorCQlkZXYtPm5hbWUsIChpbnQpIFNLX3JlYWRfcmVnKENTUjApLCAKKwkJKHVuc2lnbmVkIGludCkgJihwLT5yYW0pLT5pYik7CisKKyNpZmRlZiBTS19ERUJVRworCVNLX3ByaW50X3BvcyhkZXYsICJMQU5DRSBJTklUIGZhaWxlZCIpOworCVNLX3ByaW50X2RldihkZXYsIkRldmljZSBTdHJ1Y3R1cmU6Iik7CisjZW5kaWYKKworCXJldHVybiAtMTsgICAgICAgICAgICAgICAgIC8qIExBTkNFIGluaXQgZmFpbGVkICovCisgICAgfQorCisgICAgUFJJTlRLKCgiIyMgJXM6IGluaXQgZG9uZSBhZnRlciAlZCB0aWNrc1xuIiwgU0tfTkFNRSwgaSkpOworCisgICAgLyogQ2xlYXIgSW5pdGlhbGl6ZSBkb25lLCBlbmFibGUgSW50ZXJydXB0cywgc3RhcnQgTEFOQ0UgKi8KKworICAgIFNLX3dyaXRlX3JlZyhDU1IwLCBDU1IwX0lET04gfCBDU1IwX0lORUEgfCBDU1IwX1NUUlQpOworCisgICAgUFJJTlRLKCgiIyMgJXM6IExBTkNFIHN0YXJ0ZWQuIENTUjA6ICUjMDZ4XG4iLCBTS19OQU1FLCAKKyAgICAgICAgICAgIFNLX3JlYWRfcmVnKENTUjApKSk7CisKKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgLyogTEFOQ0UgaXMgdXAgYW5kIHJ1bm5pbmcgKi8KKworfSAvKiBFbmQgb2YgU0tfbGFuY2VfaW5pdCgpICovCisKKworDAorLyotCisgKiBGdW5jdGlvbiAgICAgICA6IFNLX3NlbmRfcGFja2V0CisgKiBBdXRob3IgICAgICAgICA6IFBhdHJpY2sgSi5ELiBXZWljaG1hbm4KKyAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDUvMjcKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IFdyaXRlcyBhbiBzb2NrZXQgYnVmZmVyIGludG8gYSB0cmFuc21pdCBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAgICAgIGFuZCBzdGFydHMgdHJhbnNtaXNzaW9uLgorICoKKyAqIFBhcmFtZXRlcnMgICAgIDogSSA6IHN0cnVjdCBza19idWZmICpza2IgLSBwYWNrZXQgdG8gdHJhbnNmZXIKKyAqICAgICAgICAgICAgICAgICAgSSA6IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgIC0gU0tfRzE2IGRldmljZSBzdHJ1Y3R1cmUKKyAqIFJldHVybiBWYWx1ZSAgIDogMCAtIE9LCisgKiAgICAgICAgICAgICAgICAgIDEgLSBDb3VsZCBub3QgdHJhbnNtaXQgKGRldl9xdWV1ZV94bWl0IHdpbGwgcXVldWUgaXQpCisgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgdHJ5IHRvIHNlbnQgaXQgbGF0ZXIKKyAqIEdsb2JhbHMgICAgICAgIDogTm9uZQorICogU2lkZSBFZmZlY3RzICAgOiBOb25lCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKy0qLworCitzdGF0aWMgdm9pZCBTS190aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHhtaXR0ZXIgdGltZWQgb3V0LCB0cnkgdG8gcmVzdGFydCFcbiIsIGRldi0+bmFtZSk7CisJU0tfbGFuY2VfaW5pdChkZXYsIE1PREVfTk9STUFMKTsgLyogUmVpbml0IExBTkNFICovCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwkJIC8qIENsZWFyIFRyYW5zbWl0dGVyIGZsYWcgKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsgICAgICAvKiBNYXJrIFN0YXJ0IG9mIHRyYW5zbWlzc2lvbiAqLworfQorCitzdGF0aWMgaW50IFNLX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHN0cnVjdCB0bWQgKnRtZHA7CisgICAgc3RhdGljIGNoYXIgcGFkWzY0XTsKKworICAgIFBSSU5USzIoKCIjIyAlczogU0tfc2VuZF9wYWNrZXQoKSBjYWxsZWQsIENTUjAgJSMwNHguXG4iLCAKKwkgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKworCisgICAgLyogCisgICAgICogQmxvY2sgYSB0aW1lci1iYXNlZCB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nLiAKKyAgICAgKiBUaGlzIG1lYW5zIGNoZWNrIGlmIHdlIGFyZSBhbHJlYWR5IGluLiAKKyAgICAgKi8KKworICAgIG5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKyAgICB7CisKKwkvKiBFdmFsdWF0ZSBQYWNrZXQgbGVuZ3RoICovCisJc2hvcnQgbGVuID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47IAorICAgICAgIAorCXRtZHAgPSBwLT50bWRoZWFkICsgcC0+dG1kbnVtOyAvKiBXaGljaCBkZXNjcmlwdG9yIGZvciB0cmFuc21pdHRpbmcgKi8KKworCS8qIEZpbGwgaW4gVHJhbnNtaXQgTWVzc2FnZSBEZXNjcmlwdG9yICovCisKKwkvKiBDb3B5IGRhdGEgaW50byBkdWFsIHBvcnRlZCByYW0gKi8KKworCW1lbWNweV90b2lvKCh0bWRwLT51LmJ1ZmZlciAmIDB4MDBmZmZmZmYpLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlpZiAobGVuICE9IHNrYi0+bGVuKQorCQltZW1jcHlfdG9pbygodG1kcC0+dS5idWZmZXIgJiAweDAwZmZmZmZmKSArIHNrYi0+bGVuLCBwYWQsIGxlbi1za2ItPmxlbik7CisKKwl3cml0ZXcoLWxlbiwgJnRtZHAtPmJsZW4pOyAgICAgICAgICAgIC8qIHNldCBsZW5ndGggdG8gdHJhbnNtaXQgKi8KKworCS8qIAorCSAqIFBhY2tldCBzdGFydCBhbmQgZW5kIGlzIGFsd2F5cyBzZXQgYmVjYXVzZSB3ZSB1c2UgdGhlIG1heGltdW0KKwkgKiBwYWNrZXQgbGVuZ3RoIGFzIGJ1ZmZlciBsZW5ndGguCisJICogUmVsaW5xdWlzaCBvd25lcnNoaXAgdG8gTEFOQ0UKKwkgKi8KKworCXdyaXRlYihUWF9PV04gfCBUWF9TVFAgfCBUWF9FTlAsICZ0bWRwLT51LnMuc3RhdHVzKTsKKwkKKwkvKiBTdGFydCBEZW1hbmQgVHJhbnNtaXNzaW9uICovCisJU0tfd3JpdGVfcmVnKENTUjAsIENTUjBfVERNRCB8IENTUjBfSU5FQSk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsgICAvKiBNYXJrIHN0YXJ0IG9mIHRyYW5zbWlzc2lvbiAqLworCisJLyogU2V0IHBvaW50ZXIgdG8gbmV4dCB0cmFuc21pdCBidWZmZXIgKi8KKwlwLT50bWRudW0rKzsgCisJcC0+dG1kbnVtICY9IFRNRE5VTS0xOyAKKworCS8qIERvIHdlIG93biB0aGUgbmV4dCB0cmFuc21pdCBidWZmZXIgPyAqLworCWlmICghIChyZWFkYigmKChwLT50bWRoZWFkICsgcC0+dG1kbnVtKS0+dS5zLnN0YXR1cykpICYgVFhfT1dOKSApCisJeworCSAgIC8qIAorCSAgICAqIFdlIG93biBuZXh0IGJ1ZmZlciBhbmQgYXJlIHJlYWR5IHRvIHRyYW5zbWl0LCBzbworCSAgICAqIGNsZWFyIGJ1c3kgZmxhZworCSAgICAqLworCSAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJfQorCisJcC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKyAgICB9CisKKyAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CisgICAgcmV0dXJuIDA7ICAKK30gLyogRW5kIG9mIFNLX3NlbmRfcGFja2V0ICovCisKKwwKKy8qLQorICogRnVuY3Rpb24gICAgICAgOiBTS19pbnRlcnJ1cHQKKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yNworICoKKyAqIERlc2NyaXB0aW9uICAgIDogU0tfRzE2IGludGVycnVwdCBoYW5kbGVyIHdoaWNoIGNoZWNrcyBmb3IgTEFOQ0UKKyAqICAgICAgICAgICAgICAgICAgRXJyb3JzLCBoYW5kbGVzIHRyYW5zbWl0IGFuZCByZWNlaXZlIGludGVycnVwdHMKKyAqCisgKiBQYXJhbWV0ZXJzICAgICA6IEkgOiBpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncyAtCisgKiBSZXR1cm4gVmFsdWUgICA6IE5vbmUKKyAqIEVycm9ycyAgICAgICAgIDogTm9uZQorICogR2xvYmFscyAgICAgICAgOiBOb25lCisgKiBTaWRlIEVmZmVjdHMgICA6IE5vbmUKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqICAgICBZWS9NTS9ERCAgdWlkICBEZXNjcmlwdGlvbgorLSovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBTS19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisgICAgaW50IGNzcjA7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKyAgICBzdHJ1Y3QgcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisKKworICAgIFBSSU5USzIoKCIjIyAlczogU0tfaW50ZXJydXB0KCkuIHN0YXR1czogJSMwNnhcbiIsIAorICAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKworICAgIGlmIChkZXYgPT0gTlVMTCkKKyAgICB7CisJcHJpbnRrKCJTS19pbnRlcnJ1cHQoKTogSVJRICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisgICAgfQorICAgIAorICAgIHNwaW5fbG9jayAoJlNLX2xvY2spOworCisgICAgY3NyMCA9IFNLX3JlYWRfcmVnKENTUjApOyAgICAgIC8qIHN0b3JlIHJlZ2lzdGVyIGZvciBjaGVja2luZyAqLworCisgICAgLyogCisgICAgICogQWNrbm93bGVkZ2UgYWxsIG9mIHRoZSBjdXJyZW50IGludGVycnVwdCBzb3VyY2VzLCBkaXNhYmxlICAgICAgCisgICAgICogSW50ZXJydXB0cyAoSU5FQSA9IDApIAorICAgICAqLworCisgICAgU0tfd3JpdGVfcmVnKENTUjAsIGNzcjAgJiBDU1IwX0NMUkFMTCk7IAorCisgICAgaWYgKGNzcjAgJiBDU1IwX0VSUikgLyogTEFOQ0UgRXJyb3IgKi8KKyAgICB7CisJcHJpbnRrKCIlczogZXJyb3I6ICUwNHhcbiIsIGRldi0+bmFtZSwgY3NyMCk7CisgICAgICAKKyAgICAgICAgaWYgKGNzcjAgJiBDU1IwX01JU1MpICAgICAgLyogTm8gcGxhY2UgdG8gc3RvcmUgcGFja2V0ID8gKi8KKyAgICAgICAgeyAKKyAgICAgICAgICAgIHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjc3IwICYgQ1NSMF9SSU5UKSAgICAgICAgICAvKiBSZWNlaXZlIEludGVycnVwdCAocGFja2V0IGFycml2ZWQpICovIAorICAgIHsKKwlTS19yeGludHIoZGV2KTsgCisgICAgfQorCisgICAgaWYgKGNzcjAgJiBDU1IwX1RJTlQpICAgICAgICAgIC8qIFRyYW5zbWl0IGludGVycnVwdCAocGFja2V0IHNlbnQpICovCisgICAgeworCVNLX3R4aW50cihkZXYpOworICAgIH0KKworICAgIFNLX3dyaXRlX3JlZyhDU1IwLCBDU1IwX0lORUEpOyAvKiBFbmFibGUgSW50ZXJydXB0cyAqLworCisgICAgc3Bpbl91bmxvY2sgKCZTS19sb2NrKTsKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9IC8qIEVuZCBvZiBTS19pbnRlcnJ1cHQoKSAqLyAKKworDAorLyotCisgKiBGdW5jdGlvbiAgICAgICA6IFNLX3R4aW50cgorICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI3CisgKgorICogRGVzY3JpcHRpb24gICAgOiBBZnRlciBzZW5kaW5nIGEgcGFja2V0IHdlIGNoZWNrIHN0YXR1cywgdXBkYXRlCisgKiAgICAgICAgICAgICAgICAgIHN0YXRpc3RpY3MgYW5kIHJlbGlucXVpc2ggb3duZXJzaGlwIG9mIHRyYW5zbWl0IAorICogICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIHJpbmcuCisgKgorICogUGFyYW1ldGVycyAgICAgOiBJIDogc3RydWN0IG5ldF9kZXZpY2UgKmRldiAtIFNLX0cxNiBkZXZpY2Ugc3RydWN0dXJlCisgKiBSZXR1cm4gVmFsdWUgICA6IE5vbmUKKyAqIEVycm9ycyAgICAgICAgIDogTm9uZQorICogR2xvYmFscyAgICAgICAgOiBOb25lCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKy0qLworCitzdGF0aWMgdm9pZCBTS190eGludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpbnQgdG1kc3RhdDsKKyAgICBzdHJ1Y3QgdG1kICp0bWRwOworICAgIHN0cnVjdCBwcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCisgICAgUFJJTlRLMigoIiMjICVzOiBTS190eGludHIoKSBzdGF0dXM6ICUjMDZ4XG4iLCAKKyAgICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKSk7CisKKyAgICB0bWRwID0gcC0+dG1kaGVhZCArIHAtPnRtZGxhc3Q7ICAgICAvKiBXaGljaCBidWZmZXIgd2Ugc2VudCBhdCBsYXN0ID8gKi8KKworICAgIC8qIFNldCBuZXh0IGJ1ZmZlciAqLworICAgIHAtPnRtZGxhc3QrKzsKKyAgICBwLT50bWRsYXN0ICY9IFRNRE5VTS0xOworCisgICAgdG1kc3RhdCA9IHJlYWRiKCZ0bWRwLT51LnMuc3RhdHVzKTsKKworICAgIC8qIAorICAgICAqIFdlIGNoZWNrIHN0YXR1cyBvZiB0cmFuc21pdHRlZCBwYWNrZXQuCisgICAgICogc2VlIExBTkNFIGRhdGEtc2hlZXQgZm9yIGVycm9yIGV4cGxhbmF0aW9uCisgICAgICovCisgICAgaWYgKHRtZHN0YXQgJiBUWF9FUlIpIC8qIEVycm9yIG9jY3VycmVkICovCisgICAgeworCWludCBzdGF0MiA9IHJlYWR3KCZ0bWRwLT5zdGF0dXMyKTsKKworCXByaW50aygiJXM6IFRYIGVycm9yOiAlMDR4ICUwNHhcbiIsIGRldi0+bmFtZSwgdG1kc3RhdCwgc3RhdDIpOworCisJaWYgKHN0YXQyICYgVFhfVERSKSAgICAvKiBURFIgcHJvYmxlbXM/ICovCisJeworCSAgICBwcmludGsoIiVzOiB0ZHItcHJvYmxlbXMgXG4iLCBkZXYtPm5hbWUpOworCX0KKworCWlmIChzdGF0MiAmIFRYX1JUUlkpICAgLyogRmFpbGVkIGluIDE2IGF0dGVtcHRzIHRvIHRyYW5zbWl0ID8gKi8KKyAgICAgICAgICAgIHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7ICAgCisgICAgICAgIGlmIChzdGF0MiAmIFRYX0xDT0wpICAgLyogTGF0ZSBjb2xsaXNpb24gPyAqLworICAgICAgICAgICAgcC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOyAKKwlpZiAoc3RhdDIgJiBUWF9MQ0FSKSAgIC8qIExvc3Mgb2YgQ2FycmllciA/ICovICAKKyAgICAgICAgICAgIHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisgICAgICAgIGlmIChzdGF0MiAmIFRYX1VGTE8pICAgLyogVW5kZXJmbG93IGVycm9yID8gKi8KKyAgICAgICAgeworICAgICAgICAgICAgcC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKworICAgICAgICAgICAgLyogCisgICAgICAgICAgICAgKiBJZiBVRkxPIGVycm9yIG9jY3VycyBpdCB3aWxsIHR1cm4gdHJhbnNtaXR0ZXIgb2YuCisgICAgICAgICAgICAgKiBTbyB3ZSBtdXN0IHJlaW5pdCBMQU5DRQorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIFNLX2xhbmNlX2luaXQoZGV2LCBNT0RFX05PUk1BTCk7CisgICAgICAgIH0KKwkKKwlwLT5zdGF0cy50eF9lcnJvcnMrKzsKKworCXdyaXRldygwLCAmdG1kcC0+c3RhdHVzMik7ICAgICAgICAgICAgIC8qIENsZWFyIGVycm9yIGZsYWdzICovCisgICAgfQorICAgIGVsc2UgaWYgKHRtZHN0YXQgJiBUWF9NT1JFKSAgICAgICAgLyogQ29sbGlzaW9ucyBvY2N1cnJlZCA/ICovCisgICAgeworICAgICAgICAvKiAKKyAgICAgICAgICogSGVyZSBJIGhhdmUgYSBwcm9ibGVtLgorICAgICAgICAgKiBJIG9ubHkga25vdyB0aGF0IHRoZXJlIG11c3QgYmUgb25lIG9yIHVwIHRvIDE1IGNvbGxpc2lvbnMuCisgICAgICAgICAqIFRoYXQncyB3aHkgVFhfTU9SRSBpcyBzZXQsIGJlY2F1c2UgYWZ0ZXIgMTYgYXR0ZW1wdHMgVFhfUlRSWQorICAgICAgICAgKiB3aWxsIGJlIHNldCB3aGljaCBtZWFucyBjb3VsZG4ndCBzZW5kIHBhY2tldCBhYm9ydGVkIHRyYW5zZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBGaXJzdCBJIGRpZCBub3QgaGF2ZSB0aGlzIGluIGJ1dCB0aGVuIEkgdGhvdWdodCBhdCBtaW5pbXVtCisgICAgICAgICAqIHdlIHNlZSB0aGF0IHNvbWV0aGluZyB3YXMgbm90IG9rLgorICAgICAgICAgKiBJZiBhbnlvbmUga25vd3Mgc29tZXRoaW5nIGJldHRlciB0aGFuIHRoaXMgdG8gaGFuZGxlIHRoaXMKKyAgICAgICAgICogcGxlYXNlIHJlcG9ydCBpdC4KKyAgICAgICAgICovIAorCisgICAgICAgIHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsgCisgICAgfQorICAgIGVsc2UgICAvKiBQYWNrZXQgc2VudCB3aXRob3V0IGFueSBwcm9ibGVtcyAqLworICAgIHsKKyAgICAgICAgcC0+c3RhdHMudHhfcGFja2V0cysrOyAKKyAgICB9CisKKyAgICAvKiAKKyAgICAgKiBXZSBtYXJrIHRyYW5zbWl0dGVyIG5vdCBidXN5IGFueW1vcmUsIGJlY2F1c2Ugbm93IHdlIGhhdmUgYSBmcmVlCisgICAgICogdHJhbnNtaXQgZGVzY3JpcHRvciB3aGljaCBjYW4gYmUgZmlsbGVkIGJ5IFNLX3NlbmRfcGFja2V0IGFuZAorICAgICAqIGFmdGVyd2FyZHMgc2VudCBieSB0aGUgTEFOQ0UKKyAgICAgKiAKKyAgICAgKiBUaGUgZnVuY3Rpb24gd2hpY2ggZG8gaGFuZGxlIHNsb3cgSVJRIHBhcnRzIGlzIGRvX2JvdHRvbV9oYWxmKCkKKyAgICAgKiB3aGljaCBydW5zIGF0IG5vcm1hbCBrZXJuZWwgcHJpb3JpdHksIHRoYXQgbWVhbnMgYWxsIGludGVycnVwdCBhcmUKKyAgICAgKiBlbmFibGVkLiAoc2VlIGtlcm5lbC9pcnEuYykKKyAgICAgKiAgCisgICAgICogbmV0X2JoIGRvZXMgc29tZXRoaW5nIGxpa2UgdGhpczoKKyAgICAgKiAgLSBjaGVjayBpZiBhbHJlYWR5IGluIG5ldF9iaAorICAgICAqICAtIHRyeSB0byB0cmFuc21pdCBzb21ldGhpbmcgZnJvbSB0aGUgc2VuZCBxdWV1ZQorICAgICAqICAtIGlmIHNvbWV0aGluZyBpcyBpbiB0aGUgcmVjZWl2ZSBxdWV1ZSBzZW5kIGl0IHVwIHRvIGhpZ2hlciAKKyAgICAgKiAgICBsZXZlbHMgaWYgaXQgaXMgYSBrbm93biBwcm90b2NvbAorICAgICAqICAtIHRyeSB0byB0cmFuc21pdCBzb21ldGhpbmcgZnJvbSB0aGUgc2VuZCBxdWV1ZQorICAgICAqLworCisgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCit9IC8qIEVuZCBvZiBTS190eGludHIoKSAqLworCisMCisvKi0KKyAqIEZ1bmN0aW9uICAgICAgIDogU0tfcnhpbnRyCisgKiBBdXRob3IgICAgICAgICA6IFBhdHJpY2sgSi5ELiBXZWljaG1hbm4KKyAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDUvMjcKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IEJ1ZmZlciBzZW50LCBjaGVjayBmb3IgZXJyb3JzLCByZWxpbnF1aXNoIG93bmVyc2hpcAorICogICAgICAgICAgICAgICAgICBvZiB0aGUgcmVjZWl2ZSBtZXNzYWdlIGRlc2NyaXB0b3IuIAorICoKKyAqIFBhcmFtZXRlcnMgICAgIDogSSA6IFNLX0cxNiBkZXZpY2Ugc3RydWN0dXJlCisgKiBSZXR1cm4gVmFsdWUgICA6IE5vbmUKKyAqIEdsb2JhbHMgICAgICAgIDogTm9uZQorICogVXBkYXRlIEhpc3RvcnkgOgorICogICAgIFlZL01NL0REICB1aWQgIERlc2NyaXB0aW9uCistKi8KKworc3RhdGljIHZvaWQgU0tfcnhpbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKyAgICBzdHJ1Y3Qgcm1kICpybWRwOworICAgIGludCBybWRzdGF0OworICAgIHN0cnVjdCBwcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIFBSSU5USzIoKCIjIyAlczogU0tfcnhpbnRyKCkuIENTUjA6ICUjMDZ4XG4iLCAKKyAgICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKSk7CisKKyAgICBybWRwID0gcC0+cm1kaGVhZCArIHAtPnJtZG51bTsKKworICAgIC8qIEFzIGxvbmcgYXMgd2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBjaGVjayBzdGF0dXMgYW5kIHNlbmQKKyAgICAgKiBpdCB1cCB0byBoaWdoZXIgbGF5ZXIgCisgICAgICovCisKKyAgICB3aGlsZSAoISggKHJtZHN0YXQgPSByZWFkYigmcm1kcC0+dS5zLnN0YXR1cykpICYgUlhfT1dOKSkKKyAgICB7CisJLyogCisgICAgICAgICAqIFN0YXJ0IGFuZCBlbmQgb2YgcGFja2V0IG11c3QgYmUgc2V0LCBiZWNhdXNlIHdlIHVzZSAKKwkgKiB0aGUgZXRoZXJuZXQgbWF4aW11bSBwYWNrZXQgbGVuZ3RoICgxNTE4KSBhcyBidWZmZXIgc2l6ZS4KKwkgKiAKKwkgKiBCZWNhdXNlIG91ciBidWZmZXJzIGFyZSBhdCBtYXhpbXVtIE9GTE8gYW5kIEJVRkYgZXJyb3JzIGFyZQorCSAqIG5vdCB0byBiZSBjb25jZXJuZWQgKHNlZSBEYXRhIHNoZWV0KQorCSAqLworCisJaWYgKChybWRzdGF0ICYgKFJYX1NUUCB8IFJYX0VOUCkpICE9IChSWF9TVFAgfCBSWF9FTlApKQorCXsKKwkgICAgLyogU3RhcnQgb2YgYSBmcmFtZSA+IDE1MTggQnl0ZXMgPyAqLworCisJICAgIGlmIChybWRzdGF0ICYgUlhfU1RQKSAKKwkgICAgeworCQlwLT5zdGF0cy5yeF9lcnJvcnMrKzsgICAgICAgIC8qIGJhZCBwYWNrZXQgcmVjZWl2ZWQgKi8KKwkJcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOyAvKiBwYWNrZXQgdG9vIGxvbmcgKi8KKworCQlwcmludGsoIiVzOiBwYWNrZXQgdG9vIGxvbmdcbiIsIGRldi0+bmFtZSk7CisJICAgIH0KKwkgICAgCisJICAgIC8qIAorICAgICAgICAgICAgICogQWxsIG90aGVyIHBhY2tldHMgd2lsbCBiZSBpZ25vcmVkIHVudGlsIGEgbmV3IGZyYW1lIHdpdGgKKwkgICAgICogc3RhcnQgKFJYX1NUUCkgc2V0IGZvbGxvd3MuCisJICAgICAqIAorCSAgICAgKiBXaGF0IHdlIGRvIGlzIGp1c3QgZ2l2ZSBkZXNjcmlwdG9yIGZyZWUgZm9yIG5ldyBpbmNvbWluZworCSAgICAgKiBwYWNrZXRzLiAKKwkgICAgICovCisKKwkgICAgd3JpdGViKFJYX09XTiwgJnJtZHAtPnUucy5zdGF0dXMpOyAvKiBSZWxpbnF1aXNoIG93bmVyc2hpcCB0byBMQU5DRSAqLyAKKworCX0KKwllbHNlIGlmIChybWRzdGF0ICYgUlhfRVJSKSAgICAgICAgICAvKiBSZWNlaXZlIEVycm9yID8gKi8KKwl7CisJICAgIHByaW50aygiJXM6IFJYIGVycm9yOiAlMDR4XG4iLCBkZXYtPm5hbWUsIChpbnQpIHJtZHN0YXQpOworCSAgICAKKwkgICAgcC0+c3RhdHMucnhfZXJyb3JzKys7CisKKwkgICAgaWYgKHJtZHN0YXQgJiBSWF9GUkFNKSBwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkgICAgaWYgKHJtZHN0YXQgJiBSWF9DUkMpICBwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisKKwkgICAgd3JpdGViKFJYX09XTiwgJnJtZHAtPnUucy5zdGF0dXMpOyAvKiBSZWxpbnF1aXNoIG93bmVyc2hpcCB0byBMQU5DRSAqLworCisJfQorCWVsc2UgLyogV2UgaGF2ZSBhIHBhY2tldCB3aGljaCBjYW4gYmUgcXVldWVkIGZvciB0aGUgdXBwZXIgbGF5ZXJzICovCisJeworCisJICAgIGludCBsZW4gPSByZWFkdygmcm1kcC0+bWxlbikgJiAweDBmZmY7ICAvKiBleHRyYWN0IG1lc3NhZ2UgbGVuZ3RoIGZyb20gcmVjZWl2ZSBidWZmZXIgKi8KKwkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCSAgICBza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbisyKTsgLyogYWxsb2NhdGUgc29ja2V0IGJ1ZmZlciAqLyAKKworCSAgICBpZiAoc2tiID09IE5VTEwpICAgICAgICAgICAgICAgIC8qIENvdWxkIG5vdCBnZXQgbWVtID8gKi8KKwkgICAgeworICAgIAorCQkvKiAKKyAgICAgICAgICAgICAgICAgKiBDb3VsZG4ndCBhbGxvY2F0ZSBza19idWZmZXIgc28gd2UgZ2l2ZSBkZXNjcmlwdG9yIGJhY2sKKwkJICogdG8gTGFuY2UsIHVwZGF0ZSBzdGF0aXN0aWNzIGFuZCBnbyBhaGVhZC4KKwkJICovCisKKwkJd3JpdGViKFJYX09XTiwgJnJtZHAtPnUucy5zdGF0dXMpOyAvKiBSZWxpbnF1aXNoIG93bmVyc2hpcCB0byBMQU5DRSAqLworCQlwcmludGsoIiVzOiBDb3VsZG4ndCBhbGxvY2F0ZSBza19idWZmLCBkZWZlcnJpbmcgcGFja2V0LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKworCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgLyogSnVtcCBvdXQgKi8KKwkgICAgfQorCSAgICAKKwkgICAgLyogUHJlcGFyZSBza19idWZmIHRvIHF1ZXVlIGZvciB1cHBlciBsYXllcnMgKi8KKworCSAgICBza2ItPmRldiA9IGRldjsKKwkgICAgc2tiX3Jlc2VydmUoc2tiLDIpOwkJLyogQWxpZ24gSVAgaGVhZGVyIG9uIDE2IGJ5dGUgYm91bmRhcnkgKi8KKwkgICAgCisJICAgIC8qIAorICAgICAgICAgICAgICogQ29weSBkYXRhIG91dCBvZiBvdXIgcmVjZWl2ZSBkZXNjcmlwdG9yIGludG8gc2tfYnVmZi4KKwkgICAgICoKKwkgICAgICogKHJtZHAtPnUuYnVmZmVyICYgMHgwMGZmZmZmZikgLT4gZ2V0IGFkZHJlc3Mgb2YgYnVmZmVyIGFuZCAKKwkgICAgICogaWdub3JlIHN0YXR1cyBmaWVsZHMpIAorCSAgICAgKi8KKworCSAgICBtZW1jcHlfZnJvbWlvKHNrYl9wdXQoc2tiLGxlbiksIChybWRwLT51LmJ1ZmZlciAmIDB4MDBmZmZmZmYpLCBsZW4pOworCisKKwkgICAgLyogCisgICAgICAgICAgICAgKiBOb3RpZnkgdGhlIHVwcGVyIHByb3RvY29sIGxheWVycyB0aGF0IHRoZXJlIGlzIGFub3RoZXIgcGFja2V0CisJICAgICAqIHRvIGhhbmRsZQorCSAgICAgKgorCSAgICAgKiBuZXRpZl9yeCgpIGFsd2F5cyBzdWNjZWVkcy4gc2VlIC9uZXQvaW5ldC9kZXYuYyBmb3IgbW9yZS4KKwkgICAgICovCisKKwkgICAgc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkgICAgbmV0aWZfcngoc2tiKTsgICAgICAgICAgICAgICAgIC8qIHF1ZXVlIHBhY2tldCBhbmQgbWFyayBpdCBmb3IgcHJvY2Vzc2luZyAqLworCSAgIAorCSAgICAvKiAKKyAgICAgICAgICAgICAqIFBhY2tldCBpcyBxdWV1ZWQgYW5kIG1hcmtlZCBmb3IgcHJvY2Vzc2luZyBzbyB3ZQorCSAgICAgKiBmcmVlIG91ciBkZXNjcmlwdG9yIGFuZCB1cGRhdGUgc3RhdGlzdGljcyAKKwkgICAgICovCisKKwkgICAgd3JpdGViKFJYX09XTiwgJnJtZHAtPnUucy5zdGF0dXMpOworCSAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCSAgICBwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJICAgIHAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworCisJICAgIHAtPnJtZG51bSsrOworCSAgICBwLT5ybWRudW0gJT0gUk1ETlVNOworCisJICAgIHJtZHAgPSBwLT5ybWRoZWFkICsgcC0+cm1kbnVtOworCX0KKyAgICB9Cit9IC8qIEVuZCBvZiBTS19yeGludHIoKSAqLworCisMCisvKi0KKyAqIEZ1bmN0aW9uICAgICAgIDogU0tfY2xvc2UKKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yNgorICoKKyAqIERlc2NyaXB0aW9uICAgIDogY2xvc2UgZ2V0cyBjYWxsZWQgZnJvbSBkZXZfY2xvc2UoKSBhbmQgc2hvdWxkCisgKiAgICAgICAgICAgICAgICAgIGRlaW5zdGFsbCB0aGUgY2FyZCAoZnJlZV9pcnEsIG1lbSBldGMpLgorICoKKyAqIFBhcmFtZXRlcnMgICAgIDogSSA6IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgLSBvdXIgZGV2aWNlIHN0cnVjdHVyZQorICogUmV0dXJuIFZhbHVlICAgOiAwIC0gY2xvc2VkIGRldmljZSBkcml2ZXIKKyAqIEVycm9ycyAgICAgICAgIDogTm9uZQorICogR2xvYmFscyAgICAgICAgOiBOb25lCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKy0qLworCisvKiBJIGhhdmUgdHJpZWQgdG8gc2V0IEJPT1RfUk9NIG9uIGFuZCBSQU0gb2ZmIGJ1dCB0aGVuLCBhZnRlciBhICdpZmNvbmZpZworICogZG93bicgdGhlIHN5c3RlbSBzdG9wcy4gU28gSSBkb24ndCBzaHV0IHNldCBjYXJkIHRvIGluaXQgc3RhdGUuCisgKi8KKworc3RhdGljIGludCBTS19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisgICAgUFJJTlRLKCgiIyMgJXM6IFNLX2Nsb3NlKCkuIENTUjA6ICUjMDZ4XG4iLCAKKyAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsJICAgLyogVHJhbnNtaXR0ZXIgYnVzeSAqLworCisgICAgcHJpbnRrKCIlczogU2h1dHRpbmcgJXMgZG93biBDU1IwICUjMDZ4XG4iLCBkZXYtPm5hbWUsIFNLX05BTUUsIAorICAgICAgICAgICAoaW50KSBTS19yZWFkX3JlZyhDU1IwKSk7CisKKyAgICBTS193cml0ZV9yZWcoQ1NSMCwgQ1NSMF9TVE9QKTsgLyogU1RPUCB0aGUgTEFOQ0UgKi8KKworICAgIGZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOyAgICAgIC8qIEZyZWUgSVJRICovCisKKyAgICByZXR1cm4gMDsgLyogYWx3YXlzIHN1Y2NlZWQgKi8KKyAgICAKK30gLyogRW5kIG9mIFNLX2Nsb3NlKCkgKi8KKworDAorLyotCisgKiBGdW5jdGlvbiAgICAgICA6IFNLX2dldF9zdGF0cworICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI2CisgKgorICogRGVzY3JpcHRpb24gICAgOiBSZXR1cm4gY3VycmVudCBzdGF0dXMgc3RydWN0dXJlIHRvIHVwcGVyIGxheWVycy4KKyAqICAgICAgICAgICAgICAgICAgSXQgaXMgY2FsbGVkIGJ5IHNwcmludGZfc3RhdHMgKGRldi5jKS4KKyAqCisgKiBQYXJhbWV0ZXJzICAgICA6IEkgOiBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICAgLSBvdXIgZGV2aWNlIHN0cnVjdHVyZQorICogUmV0dXJuIFZhbHVlICAgOiBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIC0gb3VyIGN1cnJlbnQgc3RhdGlzdGljcworICogRXJyb3JzICAgICAgICAgOiBOb25lCisgKiBTaWRlIEVmZmVjdHMgICA6IE5vbmUKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqICAgICBZWS9NTS9ERCAgdWlkICBEZXNjcmlwdGlvbgorLSovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqU0tfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKyAgICBzdHJ1Y3QgcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICBQUklOVEsoKCIjIyAlczogU0tfZ2V0X3N0YXRzKCkuIENTUjA6ICUjMDZ4XG4iLCAKKyAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKworICAgIHJldHVybiAmcC0+c3RhdHM7ICAgICAgICAgICAgIC8qIFJldHVybiBEZXZpY2Ugc3RhdHVzICovCisKK30gLyogRW5kIG9mIFNLX2dldF9zdGF0cygpICovCisKKwwKKy8qLQorICogRnVuY3Rpb24gICAgICAgOiBzZXRfbXVsdGljYXN0X2xpc3QKKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yNgorICoKKyAqIERlc2NyaXB0aW9uICAgIDogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB3aGVuIGEgcHJvZ3JhbSBwZXJmb3JtcworICogICAgICAgICAgICAgICAgICBhIFNJT0NTSUZGTEFHUyBjYWxsLiBJZmNvbmZpZyBkb2VzIHRoaXMgaWYgeW91IGNhbGwKKyAqICAgICAgICAgICAgICAgICAgJ2lmY29uZmlnIFstXWFsbG11bHRpJyB3aGljaCBlbmFibGVzIG9yIGRpc2FibGVzIHRoZQorICogICAgICAgICAgICAgICAgICBQcm9taXNjdW91cyBtb2RlLgorICogICAgICAgICAgICAgICAgICBQcm9taXNjdW91cyBtb2RlIGlzIHdoZW4gdGhlIE5ldHdvcmsgY2FyZCBhY2NlcHRzIGFsbAorICogICAgICAgICAgICAgICAgICBwYWNrZXRzLCBub3Qgb25seSB0aGUgcGFja2V0cyB3aGljaCBtYXRjaCBvdXIgTUFDIAorICogICAgICAgICAgICAgICAgICBBZGRyZXNzLiBJdCBpcyB1c2VmdWwgZm9yIHdyaXRpbmcgYSBuZXR3b3JrIG1vbml0b3IsCisgKiAgICAgICAgICAgICAgICAgIGJ1dCBpdCBpcyBhbHNvIGEgc2VjdXJpdHkgcHJvYmxlbS4gWW91IGhhdmUgdG8gcmVtZW1iZXIKKyAqICAgICAgICAgICAgICAgICAgdGhhdCBhbGwgaW5mb3JtYXRpb24gb24gdGhlIG5ldCBpcyBub3QgZW5jcnlwdGVkLgorICoKKyAqIFBhcmFtZXRlcnMgICAgIDogSSA6IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgLSBTS19HMTYgZGV2aWNlIFN0cnVjdHVyZQorICogUmV0dXJuIFZhbHVlICAgOiBOb25lCisgKiBFcnJvcnMgICAgICAgICA6IE5vbmUKKyAqIEdsb2JhbHMgICAgICAgIDogTm9uZQorICogVXBkYXRlIEhpc3RvcnkgOgorICogICAgIFlZL01NL0REICB1aWQgIERlc2NyaXB0aW9uCisgKiAgICAgOTUvMTAvMTggIEFDb3ggIE5ldyBtdWx0aWNhc3QgY2FsbGluZyBzY2hlbWUKKy0qLworCisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgU0tfRzE2LgorICovCisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisgICAgaWYgKGRldi0+ZmxhZ3MmSUZGX1BST01JU0MpCisgICAgeworCS8qIFJlaW5pdGlhbGl6ZSBMQU5DRSB3aXRoIE1PREVfUFJPTSBzZXQgKi8KKwlTS19sYW5jZV9pbml0KGRldiwgTU9ERV9QUk9NKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZGV2LT5tY19jb3VudD09MCAmJiAhKGRldi0+ZmxhZ3MmSUZGX0FMTE1VTFRJKSkKKyAgICB7CisJLyogUmVpbml0aWFsaXplIExBTkNFIHdpdGhvdXQgTU9ERV9QUk9NICovCisJU0tfbGFuY2VfaW5pdChkZXYsIE1PREVfTk9STUFMKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBNdWx0aWNhc3Qgd2l0aCBsb2dpY2FsIGFkZHJlc3MgZmlsdGVyIG9uICovCisJLyogUmVpbml0aWFsaXplIExBTkNFIHdpdGhvdXQgTU9ERV9QUk9NICovCisJU0tfbGFuY2VfaW5pdChkZXYsIE1PREVfTk9STUFMKTsKKwkKKwkvKiBOb3QgaW1wbGVtZW50ZWQgeWV0LiAqLworICAgIH0KK30gLyogRW5kIG9mIHNldF9tdWx0aWNhc3RfbGlzdCgpICovCisKKworDAorLyotCisgKiBGdW5jdGlvbiAgICAgICA6IFNLX3JvbV9hZGRyCisgKiBBdXRob3IgICAgICAgICA6IFBhdHJpY2sgSi5ELiBXZWljaG1hbm4KKyAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDYvMDEKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IFRyeSB0byBmaW5kIGEgQm9vdF9ST00gYXQgYWxsIHBvc3NpYmxlIGxvY2F0aW9ucworICoKKyAqIFBhcmFtZXRlcnMgICAgIDogTm9uZQorICogUmV0dXJuIFZhbHVlICAgOiBBZGRyZXNzIHdoZXJlIEJvb3RfUk9NIGlzCisgKiBFcnJvcnMgICAgICAgICA6IDAgLSBEaWQgbm90IGZpbmQgQm9vdF9ST00KKyAqIEdsb2JhbHMgICAgICAgIDogTm9uZQorICogVXBkYXRlIEhpc3RvcnkgOgorICogICAgIFlZL01NL0REICB1aWQgIERlc2NyaXB0aW9uCistKi8KKwordW5zaWduZWQgaW50IF9faW5pdCBTS19yb21fYWRkcih2b2lkKQoreworICAgIGludCBpLGo7CisgICAgaW50IHJvbV9mb3VuZCA9IDA7CisgICAgdW5zaWduZWQgaW50IHJvbV9sb2NhdGlvbltdID0gU0tfQk9PVF9ST01fTE9DQVRJT05TOworICAgIHVuc2lnbmVkIGNoYXIgcm9tX2lkW10gPSBTS19CT09UX1JPTV9JRDsKKyAgICB1bnNpZ25lZCBjaGFyIHRlc3RfYnl0ZTsKKworICAgIC8qIEF1dG9kZXRlY3QgQm9vdF9ST00gKi8KKyAgICBQUklOVEsoKCIjIyAlczogQXV0b2RldGVjdGlvbiBvZiBCb290X1JPTVxuIiwgU0tfTkFNRSkpOworCisgICAgZm9yIChpID0gMDsgKHJvbV9sb2NhdGlvbltpXSAhPSAwKSAmJiAocm9tX2ZvdW5kID09IDApOyBpKyspCisgICAgeworCQorCVBSSU5USygoIiMjICAgVHJ5aW5nIFJPTSBsb2NhdGlvbiAlIzA4eCIsIHJvbV9sb2NhdGlvbltpXSkpOworCQorCXJvbV9mb3VuZCA9IDE7IAorCWZvciAoaiA9IDA7IGogPCA2OyBqKyspCisJeworCSAgICB0ZXN0X2J5dGUgPSByZWFkYihyb21fbG9jYXRpb25baV0raik7CisJICAgIFBSSU5USygoIiAlMDJ4ICIsICp0ZXN0X2J5dGUpKTsKKworCSAgICBpZih0ZXN0X2J5dGUgIT0gcm9tX2lkW2pdKQorCSAgICB7CisJCXJvbV9mb3VuZCA9IDA7CisJICAgIH0gCisJfQorCVBSSU5USygoIlxuIikpOworICAgIH0KKworICAgIGlmIChyb21fZm91bmQgPT0gMSkKKyAgICB7CisJUFJJTlRLKCgiIyMgJXM6IEJvb3RfUk9NIGZvdW5kIGF0ICUjMDh4XG4iLCAKKyAgICAgICAgICAgICAgIFNLX05BTUUsIHJvbV9sb2NhdGlvblsoaS0xKV0pKTsKKworCXJldHVybiAocm9tX2xvY2F0aW9uWy0taV0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworCVBSSU5USygoIiVzOiBObyBCb290X1JPTSBmb3VuZFxuIiwgU0tfTkFNRSkpOworCXJldHVybiAwOworICAgIH0KK30gLyogRW5kIG9mIFNLX3JvbV9hZGRyKCkgKi8KKworCisMCisvKiBMQU5DRSBhY2Nlc3MgZnVuY3Rpb25zIAorICoKKyAqICEgQ1NSMS0zIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4gaW4gQ1NSMCB0aGUgU1RPUCBiaXQgaXMgc2V0ICEKKyAqLworCisKKy8qLQorICogRnVuY3Rpb24gICAgICAgOiBTS19yZXNldF9ib2FyZAorICoKKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICoKKyAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDUvMjUKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IFRoaXMgZnVuY3Rpb24gcmVzZXRzIFNLX0cxNiBhbmQgYWxsIGNvbXBvbmVudHMsIGJ1dAorICogICAgICAgICAgICAgICAgICBQT1MgcmVnaXN0ZXJzIGFyZSBub3QgY2hhbmdlZAorICoKKyAqIFBhcmFtZXRlcnMgICAgIDogTm9uZQorICogUmV0dXJuIFZhbHVlICAgOiBOb25lCisgKiBFcnJvcnMgICAgICAgICA6IE5vbmUKKyAqIEdsb2JhbHMgICAgICAgIDogU0tfUkFNICpib2FyZCAtIFNLX1JBTSBzdHJ1Y3R1cmUgcG9pbnRlcgorICoKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqICAgICBZWS9NTS9ERCAgdWlkICBEZXNjcmlwdGlvbgorLSovCisKK3ZvaWQgU0tfcmVzZXRfYm9hcmQodm9pZCkKK3sKKyAgICB3cml0ZWIoMHgwMCwgU0tfUE9SVCk7ICAgICAgIC8qIFJlc2V0IGFjdGl2ZSAqLworICAgIG1kZWxheSg1KTsgICAgICAgICAgICAgICAgLyogRGVsYXkgbWluIDVtcyAqLworICAgIHdyaXRlYihTS19SRVNFVCwgU0tfUE9SVCk7ICAgLyogU2V0IGJhY2sgdG8gbm9ybWFsIG9wZXJhdGlvbiAqLworCit9IC8qIEVuZCBvZiBTS19yZXNldF9ib2FyZCgpICovCisKKwwKKy8qLQorICogRnVuY3Rpb24gICAgICAgOiBTS19zZXRfUkFQCisgKiBBdXRob3IgICAgICAgICA6IFBhdHJpY2sgSi5ELiBXZWljaG1hbm4KKyAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDUvMjUKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IFNldCBMQU5DRSBSZWdpc3RlciBBZGRyZXNzIFBvcnQgdG8gcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgICAgZm9yIGxhdGVyIGRhdGEgdHJhbnNmZXIuCisgKgorICogUGFyYW1ldGVycyAgICAgOiBJIDogcmVnX251bWJlciAtIHdoaWNoIENTUiB0byByZWFkL3dyaXRlIGZyb20vdG8KKyAqIFJldHVybiBWYWx1ZSAgIDogTm9uZQorICogRXJyb3JzICAgICAgICAgOiBOb25lCisgKiBHbG9iYWxzICAgICAgICA6IFNLX1JBTSAqYm9hcmQgLSBTS19SQU0gc3RydWN0dXJlIHBvaW50ZXIKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqICAgICBZWS9NTS9ERCAgdWlkICBEZXNjcmlwdGlvbgorLSovCisKK3ZvaWQgU0tfc2V0X1JBUChpbnQgcmVnX251bWJlcikKK3sKKyAgICB3cml0ZXcocmVnX251bWJlciwgU0tfSU9SRUcpOworICAgIHdyaXRlYihTS19SRVNFVCB8IFNLX1JBUCB8IFNLX1dSRUcsIFNLX1BPUlQpOworICAgIHdyaXRlYihTS19ET0lPLCBTS19JT0NPTSk7CisKKyAgICB3aGlsZSAocmVhZGIoU0tfUE9SVCkgJiBTS19JT1JVTikgCisJYmFycmllcigpOworfSAvKiBFbmQgb2YgU0tfc2V0X1JBUCgpICovCisKKwwKKy8qLQorICogRnVuY3Rpb24gICAgICAgOiBTS19yZWFkX3JlZworICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI1CisgKgorICogRGVzY3JpcHRpb24gICAgOiBTZXQgUkFQIGFuZCByZWFkIGRhdGEgZnJvbSBhIExBTkNFIENTUiByZWdpc3RlcgorICoKKyAqIFBhcmFtZXRlcnMgICAgIDogSSA6IHJlZ19udW1iZXIgLSB3aGljaCBDU1IgdG8gcmVhZCBmcm9tCisgKiBSZXR1cm4gVmFsdWUgICA6IFJlZ2lzdGVyIGNvbnRlbnRzCisgKiBFcnJvcnMgICAgICAgICA6IE5vbmUKKyAqIEdsb2JhbHMgICAgICAgIDogU0tfUkFNICpib2FyZCAtIFNLX1JBTSBzdHJ1Y3R1cmUgcG9pbnRlcgorICogVXBkYXRlIEhpc3RvcnkgOgorICogICAgIFlZL01NL0REICB1aWQgIERlc2NyaXB0aW9uCistKi8KKworaW50IFNLX3JlYWRfcmVnKGludCByZWdfbnVtYmVyKQoreworICAgIFNLX3NldF9SQVAocmVnX251bWJlcik7CisKKyAgICB3cml0ZWIoU0tfUkVTRVQgfCBTS19SREFUQSB8IFNLX1JSRUcsIFNLX1BPUlQpOworICAgIHdyaXRlYihTS19ET0lPLCBTS19JT0NPTSk7CisKKyAgICB3aGlsZSAocmVhZGIoU0tfUE9SVCkgJiBTS19JT1JVTikKKwliYXJyaWVyKCk7CisgICAgcmV0dXJuIChyZWFkdyhTS19JT1JFRykpOworCit9IC8qIEVuZCBvZiBTS19yZWFkX3JlZygpICovCisKKwwKKy8qLQorICogRnVuY3Rpb24gICAgICAgOiBTS19ycmVhZF9yZWcKKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yOAorICoKKyAqIERlc2NyaXB0aW9uICAgIDogUmVhZCBkYXRhIGZyb20gcHJlc2V0ZWQgcmVnaXN0ZXIuCisgKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdGhhdCB5b3Uga25vdyB3aGljaAorICogICAgICAgICAgICAgICAgICBSZWdpc3RlciBpcyBhY3R1YWxseSBzZXQuIEJlIGF3YXJlIHRoYXQgQ1NSMS0zCisgKiAgICAgICAgICAgICAgICAgIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4gaW4gQ1NSMCBTVE9QIGlzIHNldC4KKyAqCisgKiBSZXR1cm4gVmFsdWUgICA6IFJlZ2lzdGVyIGNvbnRlbnRzCisgKiBFcnJvcnMgICAgICAgICA6IE5vbmUKKyAqIEdsb2JhbHMgICAgICAgIDogU0tfUkFNICpib2FyZCAtIFNLX1JBTSBzdHJ1Y3R1cmUgcG9pbnRlcgorICogVXBkYXRlIEhpc3RvcnkgOgorICogICAgIFlZL01NL0REICB1aWQgIERlc2NyaXB0aW9uCistKi8KKworaW50IFNLX3JyZWFkX3JlZyh2b2lkKQoreworICAgIHdyaXRlYihTS19SRVNFVCB8IFNLX1JEQVRBIHwgU0tfUlJFRywgU0tfUE9SVCk7CisKKyAgICB3cml0ZWIoU0tfRE9JTywgU0tfSU9DT00pOworCisgICAgd2hpbGUgKHJlYWRiKFNLX1BPUlQpICYgU0tfSU9SVU4pCisJYmFycmllcigpOworICAgIHJldHVybiAocmVhZHcoU0tfSU9SRUcpKTsKKworfSAvKiBFbmQgb2YgU0tfcnJlYWRfcmVnKCkgKi8KKworDAorLyotCisgKiBGdW5jdGlvbiAgICAgICA6IFNLX3dyaXRlX3JlZworICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI1CisgKgorICogRGVzY3JpcHRpb24gICAgOiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIFJBUCB0aGVuIGZpbGxzIGluIHRoZQorICogICAgICAgICAgICAgICAgICBMQU5DRSBJL08gUmVnIGFuZCBzdGFydHMgVHJhbnNmZXIgdG8gTEFOQ0UuCisgKiAgICAgICAgICAgICAgICAgIEl0IHdhaXRzIHVudGlsIHRyYW5zZmVyIGhhcyBlbmRlZCB3aGljaCBpcyBtYXguIDcgbXMKKyAqICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaXQgcmV0dXJucy4KKyAqCisgKiBQYXJhbWV0ZXJzICAgICA6IEkgOiByZWdfbnVtYmVyIC0gd2hpY2ggQ1NSIHRvIHdyaXRlIHRvCisgKiAgICAgICAgICAgICAgICAgIEkgOiB2YWx1ZSAgICAgIC0gd2hhdCB2YWx1ZSB0byBmaWxsIGludG8gcmVnaXN0ZXIgCisgKiBSZXR1cm4gVmFsdWUgICA6IE5vbmUKKyAqIEVycm9ycyAgICAgICAgIDogTm9uZQorICogR2xvYmFscyAgICAgICAgOiBTS19SQU0gKmJvYXJkIC0gU0tfUkFNIHN0cnVjdHVyZSBwb2ludGVyCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKy0qLworCit2b2lkIFNLX3dyaXRlX3JlZyhpbnQgcmVnX251bWJlciwgaW50IHZhbHVlKQoreworICAgIFNLX3NldF9SQVAocmVnX251bWJlcik7CisKKyAgICB3cml0ZXcodmFsdWUsIFNLX0lPUkVHKTsKKyAgICB3cml0ZWIoU0tfUkVTRVQgfCBTS19SREFUQSB8IFNLX1dSRUcsIFNLX1BPUlQpOworICAgIHdyaXRlYihTS19ET0lPLCBTS19JT0NPTSk7CisKKyAgICB3aGlsZSAocmVhZGIoU0tfUE9SVCkgJiBTS19JT1JVTikKKwliYXJyaWVyKCk7Cit9IC8qIEVuZCBvZiBTS193cml0ZV9yZWcgKi8KKworDAorCisvKiAKKyAqIERlYnVnZ2luZyBmdW5jdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKi0KKyAqIEZ1bmN0aW9uICAgICAgIDogU0tfcHJpbnRfcG9zCisgKiBBdXRob3IgICAgICAgICA6IFBhdHJpY2sgSi5ELiBXZWljaG1hbm4KKyAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDUvMjUKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IFRoaXMgZnVuY3Rpb24gcHJpbnRzIG91dCB0aGUgNCBQT1MgKFByb2dyYW1tYWJsZQorICogICAgICAgICAgICAgICAgICBPcHRpb24gU2VsZWN0KSBSZWdpc3RlcnMuIFVzZWQgbWFpbmx5IHRvIGRlYnVnIG9wZXJhdGlvbi4KKyAqCisgKiBQYXJhbWV0ZXJzICAgICA6IEkgOiBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2IC0gU0tfRzE2IGRldmljZSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICAgSSA6IGNoYXIgKiAtIFRleHQgd2hpY2ggd2lsbCBiZSBwcmludGVkIGFzIHRpdGxlCisgKiBSZXR1cm4gVmFsdWUgICA6IE5vbmUKKyAqIEVycm9ycyAgICAgICAgIDogTm9uZQorICogVXBkYXRlIEhpc3RvcnkgOgorICogICAgIFlZL01NL0REICB1aWQgIERlc2NyaXB0aW9uCistKi8KKwordm9pZCBTS19wcmludF9wb3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqdGV4dCkKK3sKKyAgICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICB1bnNpZ25lZCBjaGFyIHBvczAgPSBpbmIoU0tfUE9TMCksCisJCSAgcG9zMSA9IGluYihTS19QT1MxKSwKKwkJICBwb3MyID0gaW5iKFNLX1BPUzIpLAorCQkgIHBvczMgPSBpbmIoU0tfUE9TMyksCisJCSAgcG9zNCA9IGluYihTS19QT1M0KTsKKworCisgICAgcHJpbnRrKCIjIyAlczogJXMuXG4iCisgICAgICAgICAgICIjIyAgIHBvczA9JSM0eCBwb3MxPSUjNHggcG9zMj0lIzA0eCBwb3MzPSUjMDh4IHBvczQ9JSMwNHhcbiIsCisgICAgICAgICAgIFNLX05BTUUsIHRleHQsIHBvczAsIHBvczEsIHBvczIsIChwb3MzPDwxNCksIHBvczQpOworCit9IC8qIEVuZCBvZiBTS19wcmludF9wb3MoKSAqLworCisKKwwKKy8qLQorICogRnVuY3Rpb24gICAgICAgOiBTS19wcmludF9kZXYKKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yNQorICoKKyAqIERlc2NyaXB0aW9uICAgIDogVGhpcyBmdW5jdGlvbiBzaW1wbHkgcHJpbnRzIG91dCB0aGUgaW1wb3J0YW50IGZpZWxkcworICogICAgICAgICAgICAgICAgICBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqCisgKiBQYXJhbWV0ZXJzICAgICA6IEkgOiBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICAtIFNLX0cxNiBkZXZpY2Ugc3RydWN0dXJlCisgKiAgICAgICAgICAgICAgICAgIEkgOiBjaGFyICp0ZXh0IC0gVGl0bGUgZm9yIHByaW50aW5nCisgKiBSZXR1cm4gVmFsdWUgICA6IE5vbmUKKyAqIEVycm9ycyAgICAgICAgIDogTm9uZQorICogVXBkYXRlIEhpc3RvcnkgOgorICogICAgIFlZL01NL0REICB1aWQgIERlc2NyaXB0aW9uCistKi8KKwordm9pZCBTS19wcmludF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqdGV4dCkKK3sKKyAgICBpZiAoZGV2ID09IE5VTEwpCisgICAgeworCXByaW50aygiIyMgJXM6IERldmljZSBTdHJ1Y3R1cmUuICVzXG4iLCBTS19OQU1FLCB0ZXh0KTsKKwlwcmludGsoIiMjIERFVklDRSA9PSBOVUxMXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlwcmludGsoIiMjICVzOiBEZXZpY2UgU3RydWN0dXJlLiAlc1xuIiwgU0tfTkFNRSwgdGV4dCk7CisJcHJpbnRrKCIjIyBEZXZpY2UgTmFtZTogJXMgQmFzZSBBZGRyZXNzOiAlIzA2bHggSVJROiAlZFxuIiwgCisgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisJICAgICAgIAorCXByaW50aygiIyMgbmV4dCBkZXZpY2U6ICUjMDh4IGluaXQgZnVuY3Rpb246ICUjMDh4XG4iLCAKKyAgICAgICAgICAgICAgKGludCkgZGV2LT5uZXh0LCAoaW50KSBkZXYtPmluaXQpOworICAgIH0KKworfSAvKiBFbmQgb2YgU0tfcHJpbnRfZGV2KCkgKi8KKworCisMCisvKi0KKyAqIEZ1bmN0aW9uICAgICAgIDogU0tfcHJpbnRfcmFtCisgKiBBdXRob3IgICAgICAgICA6IFBhdHJpY2sgSi5ELiBXZWljaG1hbm4KKyAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDYvMDIKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayBob3cgYXJlIHRoaW5ncyBzZXQgdXAKKyAqICAgICAgICAgICAgICAgICAgaW4gdGhlIDE2S0IgUkFNLiBBbHNvIHRoZSBwb2ludGVycyB0byB0aGUgcmVjZWl2ZSBhbmQgCisgKiAgICAgICAgICAgICAgICAgIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZ3MgYW5kIHJ4IGFuZCB0eCBidWZmZXJzIGxvY2F0aW9ucy4KKyAqICAgICAgICAgICAgICAgICAgSXQgY29udGFpbnMgYSBtaW5vciBidWcgaW4gcHJpbnRpbmcsIGJ1dCBoYXMgbm8gZWZmZWN0IHRvIHRoZSB2YWx1ZXMKKyAqICAgICAgICAgICAgICAgICAgb25seSBuZXdsaW5lcyBhcmUgbm90IGNvcnJlY3QuCisgKgorICogUGFyYW1ldGVycyAgICAgOiBJIDogc3RydWN0IG5ldF9kZXZpY2UgKmRldiAtIFNLX0cxNiBkZXZpY2Ugc3RydWN0dXJlCisgKiBSZXR1cm4gVmFsdWUgICA6IE5vbmUKKyAqIEVycm9ycyAgICAgICAgIDogTm9uZQorICogR2xvYmFscyAgICAgICAgOiBOb25lCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKy0qLworCit2b2lkIF9faW5pdCBTS19wcmludF9yYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworICAgIGludCBpOyAgICAKKyAgICBzdHJ1Y3QgcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICBwcmludGsoIiMjICVzOiBSQU0gRGV0YWlscy5cbiIKKyAgICAgICAgICAgIiMjICAgUkFNIGF0ICUjMDh4IHRtZGhlYWQ6ICUjMDh4IHJtZGhlYWQ6ICUjMDh4IGluaXRibG9jazogJSMwOHhcbiIsCisgICAgICAgICAgIFNLX05BTUUsIAorICAgICAgICAgICAodW5zaWduZWQgaW50KSBwLT5yYW0sCisgICAgICAgICAgICh1bnNpZ25lZCBpbnQpIHAtPnRtZGhlYWQsIAorICAgICAgICAgICAodW5zaWduZWQgaW50KSBwLT5ybWRoZWFkLCAKKyAgICAgICAgICAgKHVuc2lnbmVkIGludCkgJihwLT5yYW0pLT5pYik7CisgICAgICAgICAgIAorICAgIHByaW50aygiIyMgICAiKTsKKworICAgIGZvcihpID0gMDsgaSA8IFRNRE5VTTsgaSsrKQorICAgIHsKKyAgICAgICAgICAgaWYgKCEoaSAlIDMpKSAvKiBFdmVyeSB0aGlyZCBsaW5lIGRvIGEgbmV3bGluZSAqLworICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwcmludGsoIlxuIyMgICAiKTsKKyAgICAgICAgICAgfQorICAgICAgICBwcmludGsoInRtZGJ1ZnMlZDogJSMwOHggIiwgKGkrMSksIChpbnQpIHAtPnRtZGJ1ZnNbaV0pOworICAgIH0KKyAgICBwcmludGsoIiMjICAgIik7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBSTUROVU07IGkrKykKKyAgICB7CisgICAgICAgICBpZiAoIShpICUgMykpIC8qIEV2ZXJ5IHRoaXJkIGxpbmUgZG8gYSBuZXdsaW5lICovCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHByaW50aygiXG4jIyAgICIpOworICAgICAgICAgICB9CisgICAgICAgIHByaW50aygicm1kYnVmcyVkOiAlIzA4eCAiLCAoaSsxKSwgKGludCkgcC0+cm1kYnVmc1tpXSk7CisgICAgfSAKKyAgICBwcmludGsoIlxuIik7CisKK30gLyogRW5kIG9mIFNLX3ByaW50X3JhbSgpICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrX2cxNi5oIGIvZHJpdmVycy9uZXQvc2tfZzE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1ZGMwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrX2cxNi5oCkBAIC0wLDAgKzEsMTY1IEBACisvKi0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIE1vZHVsZSAgICAgICAgIDogc2tfZzE2LmgKKyAqIFZlcnNpb24gICAgICAgIDogJFJldmlzaW9uJCAgCisgKgorICogQXV0aG9yICAgICAgICAgOiBNLkhpcHAgKG1oaXBwQHN0dWRlbnQudW5pLXR1ZWJpbmdlbi5kZSkKKyAqIGNoYW5nZXMgYnkgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICoKKyAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDUvMjUKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IEluIGhlcmUgYXJlIGFsbCBuZWNlc3NhcnkgZGVmaW5pdGlvbnMgb2YgIAorICogICAgICAgICAgICAgICAgICB0aGUgYW03OTkwIChMQU5DRSkgY2hpcCB1c2VkIGZvciB3cml0aW5nIGEKKyAqICAgICAgICAgICAgICAgICAgbmV0d29yayBkZXZpY2UgZHJpdmVyIHdoaWNoIHVzZXMgdGhpcyBjaGlwIAorICoKKyAqICRMb2ckCistKi8KKworI2lmbmRlZiBTS19HMTZfSAorCisjZGVmaW5lIFNLX0cxNl9ICisKKworLyoKKyAqIAlDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgMCAoQ1NSMCkgYml0IGRlZmluaXRpb25zCisgKgorICogKFI9UmVhZGFibGUpIChXPVdyaXRlYWJsZSkgKFM9U2V0IG9uIHdyaXRlKSAoQy1DbGVhciBvbiB3cml0ZSkKKyAqCisgKi8KKworI2RlZmluZSBDU1IwX0VSUgkweDgwMDAJLyogRXJyb3Igc3VtbWFyeSAoUikgKi8KKyNkZWZpbmUgQ1NSMF9CQUJMCTB4NDAwMAkvKiBCYWJibGUgdHJhbnNtaXR0ZXIgdGltZW91dCBlcnJvciAoUkMpICovCisjZGVmaW5lIENTUjBfQ0VSUgkweDIwMDAJLyogQ29sbGlzaW9uIEVycm9yIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9NSVNTCTB4MTAwMAkvKiBNaXNzZWQgcGFja2V0IChSQykgKi8KKyNkZWZpbmUgQ1NSMF9NRVJSCTB4MDgwMAkvKiBNZW1vcnkgRXJyb3IgIChSQykgKi8gCisjZGVmaW5lIENTUjBfUklOVAkweDA0MDAJLyogUmVjZWl2ZXIgSW50ZXJydXB0IChSQykgKi8KKyNkZWZpbmUgQ1NSMF9USU5UICAgICAgIDB4MDIwMAkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgKFJDKSAqLyAKKyNkZWZpbmUgQ1NSMF9JRE9OCTB4MDEwMAkvKiBJbml0aWFsaXphdGlvbiBEb25lIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9JTlRSCTB4MDA4MAkvKiBJbnRlcnJ1cHQgRmxhZyAoUikgKi8KKyNkZWZpbmUgQ1NSMF9JTkVBCTB4MDA0MAkvKiBJbnRlcnJ1cHQgRW5hYmxlIChSVykgKi8KKyNkZWZpbmUgQ1NSMF9SWE9OCTB4MDAyMAkvKiBSZWNlaXZlciBvbiAoUikgKi8KKyNkZWZpbmUgQ1NSMF9UWE9OCTB4MDAxMCAgLyogVHJhbnNtaXR0ZXIgb24gKFIpICovCisjZGVmaW5lIENTUjBfVERNRAkweDAwMDgJLyogVHJhbnNtaXQgRGVtYW5kIChSUykgKi8KKyNkZWZpbmUgQ1NSMF9TVE9QCTB4MDAwNCAJLyogU3RvcCAoUlMpICovCisjZGVmaW5lIENTUjBfU1RSVAkweDAwMDIJLyogU3RhcnQgKFJTKSAqLworI2RlZmluZSBDU1IwX0lOSVQJMHgwMDAxCS8qIEluaXRpYWxpemUgKFJTKSAqLworCisjZGVmaW5lIENTUjBfQ0xSQUxMICAgICAweDdmMDAgIC8qIG1hc2sgZm9yIGFsbCBjbGVhcmFibGUgYml0cyAqLworCisvKgorICogICAgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyIDMgKENTUjMpIGJpdCBkZWZpbml0aW9ucworICoKKyAqLworCisjZGVmaW5lIENTUjNfQlNXQVAJMHgwMDA0CS8qIEJ5dGUgU3dhcCAoUlcpICovCisjZGVmaW5lIENTUjNfQUNPTgkweDAwMDIgIC8qIEFMRSBDb250cm9sIChSVykgKi8KKyNkZWZpbmUgQ1NSM19CQ09OCTB4MDAwMQkvKiBCeXRlIENvbnRyb2wgKFJXKSAqLworCisvKgorICoJSW5pdGlhbGl6YXRpb24gQmxvY2sgTW9kZSBvcGVyYXRpb24gQml0IERlZmluaXRpb25zLgorICovCisKKyNkZWZpbmUgTU9ERV9QUk9NCTB4ODAwMAkvKiBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIE1PREVfSU5UTAkweDAwNDAgIC8qIEludGVybmFsIExvb3BiYWNrICovCisjZGVmaW5lIE1PREVfRFJUWQkweDAwMjAgIC8qIERpc2FibGUgUmV0cnkgKi8gCisjZGVmaW5lIE1PREVfQ09MTAkweDAwMTAJLyogRm9yY2UgQ29sbGlzaW9uICovCisjZGVmaW5lIE1PREVfRFRDUgkweDAwMDgJLyogRGlzYWJsZSBUcmFuc21pdCBDUkMpICovCisjZGVmaW5lIE1PREVfTE9PUAkweDAwMDQJLyogTG9vcGJhY2sgKi8KKyNkZWZpbmUgTU9ERV9EVFgJMHgwMDAyCS8qIERpc2FibGUgdGhlIFRyYW5zbWl0dGVyICovIAorI2RlZmluZSBNT0RFX0RSWAkweDAwMDEgIC8qIERpc2FibGUgdGhlIFJlY2VpdmVyICovCisKKyNkZWZpbmUgTU9ERV9OT1JNQUwgCTB4MDAwMCAgLyogTm9ybWFsIG9wZXJhdGlvbiBtb2RlICovCisKKy8qCisgKiAJUmVjZWl2ZSBtZXNzYWdlIGRlc2NyaXB0b3Igc3RhdHVzIGJpdCBkZWZpbml0aW9ucy4KKyAqLworCisjZGVmaW5lIFJYX09XTgkJMHg4MAkvKiBPd25lciBiaXQgMCA9IGhvc3QsIDEgPSBsYW5jZSAqLworI2RlZmluZSBSWF9FUlIJCTB4NDAJLyogRXJyb3IgU3VtbWFyeSAqLworI2RlZmluZSBSWF9GUkFNCQkweDIwCS8qIEZyYW1pbmcgRXJyb3IgKi8KKyNkZWZpbmUgUlhfT0ZMTwkJMHgxMAkvKiBPdmVyZmxvdyBFcnJvciAqLworI2RlZmluZSBSWF9DUkMJCTB4MDgJLyogQ1JDIEVycm9yICovIAorI2RlZmluZSBSWF9CVUZGCQkweDA0CS8qIEJ1ZmZlciBFcnJvciAqLworI2RlZmluZSBSWF9TVFAJCTB4MDIJLyogU3RhcnQgb2YgUGFja2V0ICovCisjZGVmaW5lIFJYX0VOUAkJMHgwMQkvKiBFbmQgb2YgUGFja2V0ICovCisKKworLyoKKyAqCVRyYW5zbWl0IG1lc3NhZ2UgZGVzY3JpcHRvciBzdGF0dXMgYml0IGRlZmluaXRpb25zLgorICovCisKKyNkZWZpbmUgVFhfT1dOCQkweDgwCS8qIE93bmVyIGJpdCAwID0gaG9zdCwgMSA9IGxhbmNlICovCisjZGVmaW5lIFRYX0VSUgkJMHg0MCAgICAvKiBFcnJvciBTdW1tYXJ5ICovCisjZGVmaW5lIFRYX01PUkUJCTB4MTAJLyogTW9yZSB0aGUgMSByZXRyeSBuZWVkZWQgdG8gWG1pdCAqLworI2RlZmluZSBUWF9PTkUJCTB4MDgJLyogT25lIHJldHJ5IG5lZWRlZCB0byBYbWl0ICovCisjZGVmaW5lIFRYX0RFRgkJMHgwNAkvKiBEZWZlcnJlZCAqLworI2RlZmluZSBUWF9TVFAgCQkweDAyCS8qIFN0YXJ0IG9mIFBhY2tldCAqLworI2RlZmluZSBUWF9FTlAJCTB4MDEJLyogRW5kIG9mIFBhY2tldCAqLworCisvKgorICogICAgICBUcmFuc21pdCBzdGF0dXMgKDIpICh2YWxpZCBpZiBUWF9FUlIgPT0gMSkKKyAqLworCisjZGVmaW5lIFRYX0JVRkYgCTB4ODAwMCAgLyogQnVmZmVyaW5nIGVycm9yIChubyBFTlApICovCisjZGVmaW5lIFRYX1VGTE8gCTB4NDAwMCAgLyogVW5kZXJmbG93IChsYXRlIG1lbW9yeSkgKi8KKyNkZWZpbmUgVFhfTENPTCAJMHgxMDAwICAvKiBMYXRlIGNvbGxpc2lvbiAqLworI2RlZmluZSBUWF9MQ0FSIAkweDA0MDAgIC8qIExvc3Mgb2YgQ2FycmllciAqLworI2RlZmluZSBUWF9SVFJZIAkweDAyMDAgIC8qIEZhaWxlZCBhZnRlciAxNiByZXRyYW5zbWlzc2lvbnMgICovCisjZGVmaW5lIFRYX1REUiAgICAgICAgICAweDAwM2YgIC8qIFRpbWUtZG9tYWluLXJlZmxlY3RvbWV0ZXItdmFsdWUgKi8KKworCisvKiAKKyAqIFN0cnVjdHVyZXMgdXNlZCBmb3IgQ29tbXVuaWNhdGlvbiB3aXRoIHRoZSBMQU5DRSAKKyAqLworCisvKiBMQU5DRSBJbml0aWFsaXplIEJsb2NrICovCisKK3N0cnVjdCBpbml0X2Jsb2NrIAoreworICB1bnNpZ25lZCBzaG9ydCBtb2RlOyAgICAgLyogTW9kZSBSZWdpc3RlciAqLworICB1bnNpZ25lZCBjaGFyICBwYWRkcls2XTsgLyogUGh5c2ljYWwgQWRkcmVzcyAoTUFDKSAqLworICB1bnNpZ25lZCBjaGFyICBsYWRkcls4XTsgLyogTG9naWNhbCBGaWx0ZXIgQWRkcmVzcyAobm90IHVzZWQpICovCisgIHVuc2lnbmVkIGludCAgIHJkcnA7ICAgICAvKiBSZWNlaXZlIERlc2NyaXB0b3IgUmluZyBwb2ludGVyICovCisgIHVuc2lnbmVkIGludCAgIHRkcnA7ICAgICAvKiBUcmFuc21pdCBEZXNjcmlwdG9yIFJpbmcgcG9pbnRlciAqLworfTsKKworCisvKiBSZWNlaXZlIE1lc3NhZ2UgRGVzY3JpcHRvciBFbnRyeSAqLworCitzdHJ1Y3Qgcm1kIAoreyAKKyAgdW5pb24KKyAgeworICAgIHVuc2lnbmVkIGxvbmcgYnVmZmVyOyAgICAgLyogQWRkcmVzcyBvZiBidWZmZXIgKi8KKyAgICBzdHJ1Y3QgCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciB1bnVzZWRbM107IAorICAgICAgdW5zaWduZWQgdm9sYXRpbGUgY2hhciBzdGF0dXM7ICAgLyogU3RhdHVzIEJpdHMgKi8KKyAgICB9IHM7CisgIH0gdTsKKyAgdm9sYXRpbGUgc2hvcnQgYmxlbjsgICAgICAgIC8qIEJ1ZmZlciBMZW5ndGggKHR3bydzIGNvbXBsZW1lbnQpICovCisgIHVuc2lnbmVkIHNob3J0IG1sZW47ICAgICAgICAvKiBNZXNzYWdlIEJ5dGUgQ291bnQgKi8KK307CisKKworLyogVHJhbnNtaXQgTWVzc2FnZSBEZXNjcmlwdG9yIEVudHJ5ICovCisKK3N0cnVjdCB0bWQgICAKK3sKKyAgdW5pb24gCisgIHsKKyAgICB1bnNpZ25lZCBsb25nICBidWZmZXI7ICAgIC8qIEFkZHJlc3Mgb2YgYnVmZmVyICovCisgICAgc3RydWN0IAorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgdW51c2VkWzNdOworICAgICAgdW5zaWduZWQgdm9sYXRpbGUgY2hhciBzdGF0dXM7ICAgLyogU3RhdHVzIEJpdHMgKi8KKyAgICB9IHM7CisgIH0gdTsKKyAgdW5zaWduZWQgc2hvcnQgYmxlbjsgICAgICAgICAgICAgLyogQnVmZmVyIExlbmd0aCAodHdvJ3MgY29tcGxlbWVudCkgKi8KKyAgdW5zaWduZWQgdm9sYXRpbGUgc2hvcnQgc3RhdHVzMjsgLyogRXJyb3IgU3RhdHVzIEJpdHMgKi8KK307CisKKyNlbmRpZiAvKiBFbmQgb2YgU0tfRzE2X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrX21jYS5jIGIvZHJpdmVycy9uZXQvc2tfbWNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM1NmI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrX21jYS5jCkBAIC0wLDAgKzEsMTIxNyBAQAorLyogCituZXQtMy1kcml2ZXIgZm9yIHRoZSBTS05FVCBNQ0EtYmFzZWQgY2FyZHMKKworVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0sIGFuZCBpcyBjb3ZlcmVkIGJ5IHRoZQorc2FtZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGF0IGNvdmVycyB0aGF0IHdvcmsuCisKK0NvcHlyaWdodCAxOTk5IGJ5IEFsZnJlZCBBcm5vbGQgKGFsZnJlZEBjY2FjLnJ3dGgtYWFjaGVuLmRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxmcmVkLmFybm9sZEBsYW5jb20uZGUpCisKK1RoaXMgZHJpdmVyIGlzIGJhc2VkIGJvdGggb24gdGhlIDNDNTIzIGRyaXZlciBhbmQgdGhlIFNLX0cxNiBkcml2ZXIuCisKK3BhcGVyIHNvdXJjZXM6CisgICdQQyBIYXJkd2FyZTogQXVmYmF1LCBGdW5rdGlvbnN3ZWlzZSwgUHJvZ3JhbW1pZXJ1bmcnIGJ5IAorICBIYW5zLVBldGVyIE1lc3NtZXIgZm9yIHRoZSBiYXNpYyBNaWNyb2NoYW5uZWwgc3R1ZmYKKyAgCisgICdMaW51eCBHZXJhZXRldHJlaWJlcicgYnkgQWxsZXNhbmRybyBSdWJpbmksIEthbGxlIERhbGhlaW1lcgorICBmb3IgaGVscCBvbiBFdGhlcm5ldCBkcml2ZXIgcHJvZ3JhbW1pbmcKKworICAnRXRoZXJuZXQvSUVFRSA4MDIuMyBGYW1pbHkgMTk5MiBXb3JsZCBOZXR3b3JrIERhdGEgQm9vay9IYW5kYm9vaycgYnkgQU1ECisgIGZvciBkb2N1bWVudGF0aW9uIG9uIHRoZSBBTTc5OTAgTEFOQ0UKKworICAnU0tORVQgUGVyc29uYWwgVGVjaG5pc2NoZXMgTWFudWFsJywgVmVyc2lvbiAxLjIgYnkgU2NobmVpZGVyJktvY2gKKyAgZm9yIGRvY3VtZW50YXRpb24gb24gdGhlIEp1bmlvciBib2FyZAorCisgICdTSy1ORVQgTUMyKyBUZWNobmljYWwgTWFudWFsIiwgVmVyc2lvbiAxLjEgYnkgU2NobmVpZGVyJktvY2ggZm9yCisgIGRvY3VtZW50YXRpb24gb24gdGhlIE1DMiBib3JkCisgIAorICBBIGJpZyB0aGFuayB5b3UgdG8gdGhlIFMmSyBzdXBwb3J0IGZvciBwcm92aWRpbmcgbWUgc28gcXVpY2tseSB3aXRoCisgIGRvY3VtZW50YXRpb24hCisKKyAgQWxzbyBzZWUgaHR0cDovL3d3dy5zeXNrb25uZWN0LmNvbS8KKworICBNaXNzaW5nIHRoaW5nczoKKworICAtPiBzZXQgZGVidWcgbGV2ZWwgdmlhIGlvY3RsIGluc3RlYWQgb2YgY29tcGlsZS10aW1lIHN3aXRjaGVzCisgIC0+IEkgZGlkbid0IGZvbGxvdyB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIDIuMS54IGtlcm5lbHMsIHNvIG15CisgICAgIGFzc3VtcHRpb25zIGFib3V0IHdoaWNoIHRoaW5ncyBjaGFuZ2VkIHdpdGggd2hpY2gga2VybmVsIHZlcnNpb24gCisgICAgIGFyZSBwcm9iYWJseSBub25zZW5zZQorCitIaXN0b3J5OgorICBNYXkgMTZ0aCwgMTk5OQorICAJc3RhcnR1cAorICBNYXkgMjJzdCwgMTk5OQorCWFkZGVkIHByaXZhdGUgc3RydWN0dXJlLCBtZXRob2RzCisgICAgICAgIGJlZ3VuIGJ1aWxkaW5nIGRhdGEgc3RydWN0dXJlcyBpbiBSQU0KKyAgTWF5IDIzbmQsIDE5OTkKKwljYW4gcmVjZWl2ZSBmcmFtZXMsIHNlbmQgZnJhbWVzCisgIE1heSAyNHRoLCAxOTk5CisgICAgICAgIG1vZHVsYXJpemVkIGluaXRpYWxpemF0aW9uIG9mIExBTkNFCisgICAgICAgIGxvYWRhYmxlIGFzIG1vZHVsZQorCXN0aWxsIFR4IHByb2JsZW0gOi0oCisgIE1heSAyNnRoLCAxOTk5CisgIAlNQzIgd29ya3MKKyAgCXN1cHBvcnQgZm9yIG11bHRpcGxlIGRldmljZXMKKyAgCWRpc3BsYXkgbWVkaWEgdHlwZSBmb3IgTUMyKworICBNYXkgMjh0aCwgMTk5OQorCWZpeGVkIHByb2JsZW0gaW4gR2V0TEFOQ0UgbGVhdmluZyBpbnRlcnJ1cHRzIHR1cm5lZCBvZmYKKyAgICAgICAgaW5jcmVhc2UgVFggcXVldWUgdG8gNCBwYWNrZXRzIHRvIGltcHJvdmUgc2VuZCBwZXJmb3JtYW5jZQorICBNYXkgMjl0aCwgMTk5OQorCWEgZmV3IGNvcnJlY3Rpb25zIGluIHN0YXRpc3RpY3MsIGNhdWdodCByY3ZyIG92ZXJydW5zIAorICAgICAgICByZWluaXRpYWxpemF0aW9uIG9mIExBTkNFL2JvYXJkIGluIGNyaXRpY2FsIHNpdHVhdGlvbnMKKyAgICAgICAgTUNBIGluZm8gaW1wbGVtZW50ZWQKKwlpbXBsZW1lbnRlZCBMQU5DRSBtdWx0aWNhc3QgZmlsdGVyCisgIEp1biA2dGgsIDE5OTkKKwlhZGRpdGlvbnMgZm9yIExpbnV4IDIuMgorICBEZWMgMjV0aCwgMTk5OQorICAJdW5mb3J0dW5hdGVseSB0aGVyZSBzZWVtIHRvIGJlIG5ld2VyIE1DMisgYm9hcmRzIHRoYXQgcmVhY3QKKyAgCW9uIElSUSAzLzUvOS8xMCBpbnN0ZWFkIG9mIDMvNS8xMC8xMSwgc28gd2UgaGF2ZSB0byBhdXRvcHJvYmUKKyAgCWluIHF1ZXN0aW9uYWJsZSBjYXNlcy4uLgorICBEZWMgMjh0aCwgMTk5OQorCWludGVncmF0ZWQgcGF0Y2hlcyBmcm9tIERhdmlkIFdlaW5laGFsbCAmIEJpbGwgV2VuZGxpbmcgZm9yIDIuMworCWtlcm5lbHMgKGlzYV8uLi5mdW5jdGlvbnMpLiAgVGhpbmdzIGFyZSBkZWZpbmVkIGluIGEgd2F5IHRoYXQKKyAgICAgICAgaXQgc3RpbGwgd29ya3Mgd2l0aCAyLjAueCA4LSkKKyAgRGVjIDMwdGgsIDE5OTkKKwlhZGRlZCBoYW5kbGluZyBvZiB0aGUgcmVtYWluaW5nIGludGVycnVwdCBjb25kaXRpb25zLiAgVGhhdAorICAgICAgICBzaG91bGQgY3VyZSB0aGUgc3B1cmlvdXMgaGFuZ3MuCisgIEphbiAzMHRoLCAyMDAwCisJbmV3ZXIga2VybmVscyBhdXRvbWF0aWNhbGx5IHByb2JlIG1vcmUgdGhhbiBvbmUgYm9hcmQsIHNvIHRoZQorCSdzdGFydHNsb3QnIGFzIGEgdmFyaWFibGUgaXMgYWxzbyBuZWVkZWQgaGVyZQorICBKdW5lIDFzdCwgMjAwMAorCWFkZGVkIGNoYW5nZXMgZm9yIHJlY2VudCAyLjMga2VybmVscworCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS1sZWdhY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgX1NLX01DQV9EUklWRVJfCisjaW5jbHVkZSAic2tfbWNhLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZ2xvYmFsIHN0YXRpYyBkYXRhIC0gbm90IG1vcmUgc2luY2Ugd2UgY2FuIGhhbmRsZSBtdWx0aXBsZSBib2FyZHMgYW5kCisgKiBoYXZlIHRvIHBhY2sgYWxsIHN0YXRlIGluZm8gaW50byB0aGUgZGV2aWNlIHN0cnVjdCEKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY2hhciAqTWVkaWFOYW1lc1tNZWRpYV9Db3VudF0gPQorICAgIHsgIjEwQmFzZTIiLCAiMTBCYXNlVCIsICIxMEJhc2U1IiwgIlVua25vd24iIH07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBvbHlbXSA9CisgICAgeyAxLCAxLCAxLCAwLCAxLCAxLCAwLCAxLCAxLCAwLCAxLCAxLCAxLCAwLCAwLCAwLAorCTEsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcHJpdmF0ZSBzdWJmdW5jdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBkdW1wIHBhcnRzIG9mIHNoYXJlZCBtZW1vcnkgLSBvbmx5IG5lZWRlZCBkdXJpbmcgZGVidWdnaW5nICovCisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgZHVtcG1lbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RhcnQsIHUzMiBsZW4pCit7CisJc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHo7CisKKwlmb3IgKHogPSAwOyB6IDwgbGVuOyB6KyspIHsKKwkJaWYgKCh6ICYgMTUpID09IDApCisJCQlwcmludGsoIiUwNHg6Iiwgeik7CisJCXByaW50aygiICUwMngiLCByZWFkYihwcml2LT5iYXNlICsgc3RhcnQgKyB6KSk7CisJCWlmICgoeiAmIDE1KSA9PSAxNSkKKwkJCXByaW50aygiXG4iKTsKKwl9Cit9CisKKy8qIHByaW50IGV4YWN0IHRpbWUgLSBkaXR0byAqLworCitzdGF0aWMgdm9pZCBQclRpbWUodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCXByaW50aygiJTlkOiUwNmQ6ICIsIHR2LnR2X3NlYywgdHYudHZfdXNlYyk7Cit9CisjZW5kaWYKKworLyogZGVkdWNlIHJlc291cmNlcyBvdXQgb2YgUE9TIHJlZ2lzdGVycyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgZ2V0YWRkcnMoaW50IHNsb3QsIGludCBqdW5pb3IsIGludCAqYmFzZSwgaW50ICppcnEsCisJCSAgICAgc2ttY2FfbWVkaXVtICogbWVkaXVtKQoreworCXVfY2hhciBwb3MwLCBwb3MxLCBwb3MyOworCisJaWYgKGp1bmlvcikgeworCQlwb3MwID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCAyKTsKKwkJKmJhc2UgPSAoKHBvczAgJiAweDBlKSA8PCAxMykgKyAweGMwMDAwOworCQkqaXJxID0gKChwb3MwICYgMHgxMCkgPj4gNCkgKyAxMDsKKwkJKm1lZGl1bSA9IE1lZGlhX1Vua25vd247CisJfSBlbHNlIHsKKwkJLyogcmVzZXQgUE9TIDEwNCBCaXRzIDArMSBzbyB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24gZ29lcyB0byB0aGUKKwkJICAgY29uZmlndXJlZCBhcmVhIGJldHdlZW4gNjQwSyBhbmQgMU0uICBBZnRlcndhcmRzLCBlbmFibGUgdGhlIE1DMi4KKwkJICAgSSByZWFsbHkgZG9uJ3Qga25vdyB3aGF0IHJvZGUgU0sgdG8gZG8gdGhpcy4uLiAqLworCisJCW1jYV93cml0ZV9wb3Moc2xvdCwgNCwKKwkJCSAgICAgIG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgNCkgJiAweGZjKTsKKwkJbWNhX3dyaXRlX3BvcyhzbG90LCAyLAorCQkJICAgICAgbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCAyKSB8IDB4MDEpOworCisJCXBvczEgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDMpOworCQlwb3MyID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCA0KTsKKwkJKmJhc2UgPSAoKHBvczEgJiAweDA3KSA8PCAxNCkgKyAweGMwMDAwOworCQlzd2l0Y2ggKHBvczIgJiAweDBjKSB7CisJCWNhc2UgMDoKKwkJCSppcnEgPSAzOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCSppcnEgPSA1OworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCSppcnEgPSAtMTA7CisJCQlicmVhazsKKwkJY2FzZSAxMjoKKwkJCSppcnEgPSAtMTE7CisJCQlicmVhazsKKwkJfQorCQkqbWVkaXVtID0gKHBvczIgPj4gNikgJiAzOworCX0KK30KKworLyogY2hlY2sgZm9yIGJvdGggY2FyZHM6CisgICBXaGVuIHRoZSBNQzIgaXMgdHVybmVkIG9mZiwgaXQgd2FzIGNvbmZpZ3VyZWQgZm9yIG1vcmUgdGhhbiAxNU1CIFJBTSwKKyAgIGlzIGRpc2FibGVkIGFuZCB3b24ndCBnZXQgZGV0ZWN0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkIHByb2JlLiAgV2UKKyAgIHRoZXJlZm9yZSBoYXZlIHRvIHNjYW4gdGhlIHNsb3RzIG1hbnVhbGx5IDotKCAqLworCitzdGF0aWMgaW50IF9faW5pdCBkb2ZpbmQoaW50ICpqdW5pb3IsIGludCBmaXJzdHNsb3QpCit7CisJaW50IHNsb3Q7CisJdW5zaWduZWQgaW50IGlkOworCisJZm9yIChzbG90ID0gZmlyc3RzbG90OyBzbG90IDwgTUNBX01BWF9TTE9UX05SOyBzbG90KyspIHsKKwkJaWQgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDApCisJCSAgICArICgoKHVuc2lnbmVkIGludCkgbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCAxKSkgPDwgOCk7CisKKwkJKmp1bmlvciA9IDA7CisJCWlmIChpZCA9PSBTS05FVF9NQ0FfSUQpCisJCQlyZXR1cm4gc2xvdDsKKwkJKmp1bmlvciA9IDE7CisJCWlmIChpZCA9PSBTS05FVF9KVU5JT1JfTUNBX0lEKQorCQkJcmV0dXJuIHNsb3Q7CisJfQorCXJldHVybiBNQ0FfTk9URk9VTkQ7Cit9CisKKy8qIHJlc2V0IHRoZSB3aG9sZSBib2FyZCAqLworCitzdGF0aWMgdm9pZCBSZXNldEJvYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwl3cml0ZWIoQ1RSTF9SRVNFVF9PTiwgcHJpdi0+Y3RybGFkZHIpOworCXVkZWxheSgxMCk7CisJd3JpdGViKENUUkxfUkVTRVRfT0ZGLCBwcml2LT5jdHJsYWRkcik7Cit9CisKKy8qIHdhaXQgZm9yIExBTkNFIGludGVyZmFjZSB0byBiZWNvbWUgbm90IGJ1c3kgKi8KKworc3RhdGljIGludCBXYWl0TEFOQ0Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgdCA9IDA7CisKKwl3aGlsZSAoKHJlYWRiKHByaXYtPmN0cmxhZGRyKSAmIFNUQVRfSU9fQlVTWSkgPT0KKwkgICAgICAgU1RBVF9JT19CVVNZKSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKCsrdCA+IDEwMDApIHsKKwkJCXByaW50aygiJXM6IExBTkNFIGFjY2VzcyB0aW1lb3V0IiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIHNldCBMQU5DRSByZWdpc3RlciAtIG11c3QgYmUgYXRvbWljICovCisKK3N0YXRpYyB2b2lkIFNldExBTkNFKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBhZGRyLCB1MTYgdmFsdWUpCit7CisJc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIHdhaXQgdW50aWwgbm8gdHJhbnNmZXIgaXMgcGVuZGluZyAqLworCisJV2FpdExBTkNFKGRldik7CisKKwkvKiB0cmFuc2ZlciByZWdpc3RlciBhZGRyZXNzIHRvIFJBUCAqLworCisJd3JpdGViKENUUkxfUkVTRVRfT0ZGIHwgQ1RSTF9SV19XUklURSB8IENUUkxfQURSX1JBUCwgcHJpdi0+Y3RybGFkZHIpOworCXdyaXRldyhhZGRyLCBwcml2LT5pb3JlZ2FkZHIpOworCXdyaXRlYihJT0NNRF9HTywgcHJpdi0+Y21kYWRkcik7CisJdWRlbGF5KDEpOworCVdhaXRMQU5DRShkZXYpOworCisJLyogdHJhbnNmZXIgZGF0YSB0byByZWdpc3RlciAqLworCisJd3JpdGViKENUUkxfUkVTRVRfT0ZGIHwgQ1RSTF9SV19XUklURSB8IENUUkxfQURSX0RBVEEsIHByaXYtPmN0cmxhZGRyKTsKKwl3cml0ZXcodmFsdWUsIHByaXYtPmlvcmVnYWRkcik7CisJd3JpdGViKElPQ01EX0dPLCBwcml2LT5jbWRhZGRyKTsKKwl1ZGVsYXkoMSk7CisJV2FpdExBTkNFKGRldik7CisKKwkvKiByZWVuYWJsZSBpbnRlcnJ1cHRzICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIGdldCBMQU5DRSByZWdpc3RlciAqLworCitzdGF0aWMgdTE2IEdldExBTkNFKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBhZGRyKQoreworCXNrbWNhX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHJlczsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIHdhaXQgdW50aWwgbm8gdHJhbnNmZXIgaXMgcGVuZGluZyAqLworCisJV2FpdExBTkNFKGRldik7CisKKwkvKiB0cmFuc2ZlciByZWdpc3RlciBhZGRyZXNzIHRvIFJBUCAqLworCisJd3JpdGViKENUUkxfUkVTRVRfT0ZGIHwgQ1RSTF9SV19XUklURSB8IENUUkxfQURSX1JBUCwgcHJpdi0+Y3RybGFkZHIpOworCXdyaXRldyhhZGRyLCBwcml2LT5pb3JlZ2FkZHIpOworCXdyaXRlYihJT0NNRF9HTywgcHJpdi0+Y21kYWRkcik7CisJdWRlbGF5KDEpOworCVdhaXRMQU5DRShkZXYpOworCisJLyogdHJhbnNmZXIgZGF0YSBmcm9tIHJlZ2lzdGVyICovCisKKwl3cml0ZWIoQ1RSTF9SRVNFVF9PRkYgfCBDVFJMX1JXX1JFQUQgfCBDVFJMX0FEUl9EQVRBLCBwcml2LT5jdHJsYWRkcik7CisJd3JpdGViKElPQ01EX0dPLCBwcml2LT5jbWRhZGRyKTsKKwl1ZGVsYXkoMSk7CisJV2FpdExBTkNFKGRldik7CisJcmVzID0gcmVhZHcocHJpdi0+aW9yZWdhZGRyKTsKKworCS8qIHJlZW5hYmxlIGludGVycnVwdHMgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qIGJ1aWxkIHVwIGRlc2NyaXB0b3JzIGluIHNoYXJlZCBSQU0gKi8KKworc3RhdGljIHZvaWQgSW5pdERzY3JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIGJ1ZmFkZHI7CisKKwkvKiBTZXQgdXAgVHggZGVzY3JpcHRvcnMuIFRoZSBib2FyZCBoYXMgb25seSAxNksgUkFNIHNvIGJpdHMgMTYuLjIzCisJICAgYXJlIGFsd2F5cyAwLiAqLworCisJYnVmYWRkciA9IFJBTV9EQVRBQkFTRTsKKwl7CisJCUxBTkNFX1R4RGVzY3IgZGVzY3I7CisJCWludCB6OworCisJCWZvciAoeiA9IDA7IHogPCBUWENPVU5UOyB6KyspIHsKKwkJCWRlc2NyLkxvd0FkZHIgPSBidWZhZGRyOworCQkJZGVzY3IuRmxhZ3MgPSAwOworCQkJZGVzY3IuTGVuID0gMHhmMDAwOworCQkJZGVzY3IuU3RhdHVzID0gMDsKKwkJCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBSQU1fVFhCQVNFICsKKwkJCQkgICAoeiAqIHNpemVvZihMQU5DRV9UeERlc2NyKSksICZkZXNjciwKKwkJCQkgICBzaXplb2YoTEFOQ0VfVHhEZXNjcikpOworCQkJbWVtc2V0X2lvKHByaXYtPmJhc2UgKyBidWZhZGRyLCAwLCBSQU1fQlVGU0laRSk7CisJCQlidWZhZGRyICs9IFJBTV9CVUZTSVpFOworCQl9CisJfQorCisJLyogZG8gdGhlIHNhbWUgZm9yIHRoZSBSeCBkZXNjcmlwdG9ycyAqLworCisJeworCQlMQU5DRV9SeERlc2NyIGRlc2NyOworCQlpbnQgejsKKworCQlmb3IgKHogPSAwOyB6IDwgUlhDT1VOVDsgeisrKSB7CisJCQlkZXNjci5Mb3dBZGRyID0gYnVmYWRkcjsKKwkJCWRlc2NyLkZsYWdzID0gUlhEU0NSX0ZMQUdTX09XTjsKKwkJCWRlc2NyLk1heExlbiA9IC1SQU1fQlVGU0laRTsKKwkJCWRlc2NyLkxlbiA9IDA7CisJCQltZW1jcHlfdG9pbyhwcml2LT5iYXNlICsgUkFNX1JYQkFTRSArCisJCQkJICAgKHogKiBzaXplb2YoTEFOQ0VfUnhEZXNjcikpLCAmZGVzY3IsCisJCQkJICAgc2l6ZW9mKExBTkNFX1J4RGVzY3IpKTsKKwkJCW1lbXNldF9pbyhwcml2LT5iYXNlICsgYnVmYWRkciwgMCwgUkFNX0JVRlNJWkUpOworCQkJYnVmYWRkciArPSBSQU1fQlVGU0laRTsKKwkJfQorCX0KK30KKworLyogY2FsY3VsYXRlIHRoZSBoYXNoIGJpdCBwb3NpdGlvbiBmb3IgYSBnaXZlbiBtdWx0aWNhc3QgYWRkcmVzcworICAgdGFrZW4gbW9yZSBvciBsZXNzIGRpcmVjdGx5IGZyb20gdGhlIEFNRCBkYXRhc2hlZXQuLi4gKi8KKworc3RhdGljIHZvaWQgVXBkYXRlQ1JDKHVuc2lnbmVkIGNoYXIgKkNSQywgaW50IGJpdCkKK3sKKwlpbnQgajsKKworCS8qIHNoaWZ0IENSQyBvbmUgYml0ICovCisKKwltZW1tb3ZlKENSQyArIDEsIENSQywgMzIgKiBzaXplb2YodW5zaWduZWQgY2hhcikpOworCUNSQ1swXSA9IDA7CisKKwkvKiBpZiBiaXQgWE9SIGNvbnRyb2xiaXQgPSAxLCBzZXQgQ1JDID0gQ1JDIFhPUiBwb2x5bm9taWFsICovCisKKwlpZiAoYml0IF4gQ1JDWzMyXSkKKwkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspCisJCQlDUkNbal0gXj0gcG9seVtqXTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBHZXRIYXNoKGNoYXIgKmFkZHJlc3MpCit7CisJdW5zaWduZWQgY2hhciBDUkNbMzNdOworCWludCBpLCBieXRlLCBoYXNoY29kZTsKKworCS8qIGEgbXVsdGljYXN0IGFkZHJlc3MgaGFzIGJpdCAwIGluIHRoZSBmaXJzdCBieXRlIHNldCAqLworCisJaWYgKChhZGRyZXNzWzBdICYgMSkgPT0gMCkKKwkJcmV0dXJuIC0xOworCisJLyogaW5pdGlhbGl6ZSBDUkMgKi8KKworCW1lbXNldChDUkMsIDEsIHNpemVvZihDUkMpKTsKKworCS8qIGxvb3AgdGhyb3VnaCBhZGRyZXNzIGJpdHMgKi8KKworCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCA2OyBieXRlKyspCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlVcGRhdGVDUkMoQ1JDLCAoYWRkcmVzc1tieXRlXSA+PiBpKSAmIDEpOworCisJLyogaGFzaGNvZGUgaXMgdGhlIDYgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgQ1JDICovCisKKwloYXNoY29kZSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJaGFzaGNvZGUgPSAoaGFzaGNvZGUgPDwgMSkgKyBDUkNbaV07CisJcmV0dXJuIGhhc2hjb2RlOworfQorCisvKiBmZWVkIHJlYWR5LWJ1aWx0IGluaXRpYWxpemF0aW9uIGJsb2NrIGludG8gTEFOQ0UgKi8KKworc3RhdGljIHZvaWQgSW5pdExBTkNFKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBidWlsZCB1cCBkZXNjcmlwdG9ycy4gKi8KKworCUluaXREc2NycyhkZXYpOworCisJLyogbmV4dCBSWCBkZXNjcmlwdG9yIHRvIGJlIHJlYWQgaXMgdGhlIGZpcnN0IG9uZS4gIFNpbmNlIHRoZSBMQU5DRQorCSAgIHdpbGwgc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIGFmdGVyIGluaXRpYWxpemF0aW9uLCB3ZSBoYXZlIHRvIAorCSAgIHJlc2V0IG91dCBwb2ludGVycyB0b28uICovCisKKwlwcml2LT5uZXh0cnggPSAwOworCisJLyogbm8gVFggZGVzY3JpcHRvcnMgYWN0aXZlICovCisKKwlwcml2LT5uZXh0dHhwdXQgPSBwcml2LT5uZXh0dHhkb25lID0gcHJpdi0+dHhidXN5ID0gMDsKKworCS8qIHNldCB1cCB0aGUgTEFOQ0UgYnVzIGNvbnRyb2wgcmVnaXN0ZXIgLSBjb25zdGFudCBmb3IgU0tuZXQgYm9hcmRzICovCisKKwlTZXRMQU5DRShkZXYsIExBTkNFX0NTUjMsCisJCSBDU1IzX0JTV0FQX09GRiB8IENTUjNfQUxFX0xPVyB8IENTUjNfQkNPTl9IT0xEKTsKKworCS8qIHdyaXRlIGFkZHJlc3Mgb2YgaW5pdGlhbGl6YXRpb24gYmxvY2sgaW50byBMQU5DRSAqLworCisJU2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IxLCBSQU1fSU5JVEJBU0UgJiAweGZmZmYpOworCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMiwgKFJBTV9JTklUQkFTRSA+PiAxNikgJiAweGZmKTsKKworCS8qIHdlIGRvbid0IGdldCByZWFkeSB1bnRpbCB0aGUgTEFOQ0UgaGFzIHJlYWQgdGhlIGluaXQgYmxvY2sgKi8KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIGxldCBMQU5DRSByZWFkIHRoZSBpbml0aWFsaXphdGlvbiBibG9jay4gIExBTkNFIGlzIHJlYWR5CisJICAgd2hlbiB3ZSByZWNlaXZlIHRoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdC4gKi8KKworCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCwgQ1NSMF9JTkVBIHwgQ1NSMF9JTklUKTsKK30KKworLyogc3RvcCB0aGUgTEFOQ0Ugc28gd2UgY2FuIHJlaW5pdGlhbGl6ZSBpdCAqLworCitzdGF0aWMgdm9pZCBTdG9wTEFOQ0Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBjYW4ndCB0YWtlIGZyYW1lcyBhbnkgbW9yZSAqLworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzLCBzdG9wIGl0ICovCisKKwlTZXRMQU5DRShkZXYsIExBTkNFX0NTUjAsIENTUjBfU1RPUCk7Cit9CisKKy8qIGluaXRpYWxpemUgY2FyZCBhbmQgTEFOQ0UgZm9yIHByb3BlciBvcGVyYXRpb24gKi8KKworc3RhdGljIHZvaWQgSW5pdEJvYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJTEFOQ0VfSW5pdEJsb2NrIGJsb2NrOworCisJLyogTGF5IG91dCB0aGUgc2hhcmVkIFJBTSAtIGZpcnN0IHdlIGNyZWF0ZSB0aGUgaW5pdCBibG9jayBmb3IgdGhlIExBTkNFLgorCSAgIFdlIGRvIG5vdCBvdmVyd3JpdGUgaXQgbGF0ZXIgYmVjYXVzZSB3ZSBuZWVkIGl0IGFnYWluIHdoZW4gd2Ugc3dpdGNoCisJICAgcHJvbWlzY291cyBtb2RlIG9uL29mZi4gKi8KKworCWJsb2NrLk1vZGUgPSAwOworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCWJsb2NrLk1vZGUgfD0gTEFOQ0VfSU5JVF9QUk9NOworCW1lbWNweShibG9jay5QQWRyLCBkZXYtPmRldl9hZGRyLCA2KTsKKwltZW1zZXQoYmxvY2suTEFkckYsIDAsIHNpemVvZihibG9jay5MQWRyRikpOworCWJsb2NrLlJkclAgPSAoUkFNX1JYQkFTRSAmIDB4ZmZmZmZmKSB8IChMUlhDT1VOVCA8PCAyOSk7CisJYmxvY2suVGRyUCA9IChSQU1fVFhCQVNFICYgMHhmZmZmZmYpIHwgKExUWENPVU5UIDw8IDI5KTsKKworCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBSQU1fSU5JVEJBU0UsICZibG9jaywgc2l6ZW9mKGJsb2NrKSk7CisKKwkvKiBpbml0aWFsaXplIExBTkNFLiBJbXBsaWNpdGx5IHNldHMgdXAgb3RoZXIgc3RydWN0dXJlcyBpbiBSQU0uICovCisKKwlJbml0TEFOQ0UoZGV2KTsKK30KKworLyogZGVpbml0aWFsaXplIGNhcmQgYW5kIExBTkNFICovCisKK3N0YXRpYyB2b2lkIERlaW5pdEJvYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogc3RvcCBMQU5DRSAqLworCisJU3RvcExBTkNFKGRldik7CisKKwkvKiByZXNldCBib2FyZCAqLworCisJUmVzZXRCb2FyZChkZXYpOworfQorCisvKiBwcm9iZSBmb3IgZGV2aWNlJ3MgaXJxICovCisKK3N0YXRpYyBpbnQgX19pbml0IFByb2JlSVJRKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBpbWFza3ZhbCwgbmppZmZpZXMsIGlycTsKKwl1MTYgY3NyMHZhbDsKKworCS8qIGVuYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCisJaW1hc2t2YWwgPSBwcm9iZV9pcnFfb24oKTsKKworCS8qIGluaXRpYWxpemUgdGhlIGJvYXJkLiBXYWl0IGZvciBpbnRlcnJ1cHQgJ0luaXRpYWxpemF0aW9uIGRvbmUnLiAqLworCisJUmVzZXRCb2FyZChkZXYpOworCUluaXRCb2FyZChkZXYpOworCisJbmppZmZpZXMgPSBqaWZmaWVzICsgSFo7CisJZG8geworCQljc3IwdmFsID0gR2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwKTsKKwl9CisJd2hpbGUgKCgoY3NyMHZhbCAmIENTUjBfSURPTikgPT0gMCkgJiYgKGppZmZpZXMgIT0gbmppZmZpZXMpKTsKKworCS8qIHR1cm4gb2YgaW50ZXJydXB0cyBhZ2FpbiAqLworCisJaXJxID0gcHJvYmVfaXJxX29mZihpbWFza3ZhbCk7CisKKwkvKiBpZiB3ZSBmb3VuZCBzb21ldGhpbmcsIGFjayB0aGUgaW50ZXJydXB0ICovCisKKwlpZiAoaXJxKQorCQlTZXRMQU5DRShkZXYsIExBTkNFX0NTUjAsIGNzcjB2YWwgfCBDU1IwX0lET04pOworCisJLyogYmFjayB0byBpZGxlIHN0YXRlICovCisKKwlEZWluaXRCb2FyZChkZXYpOworCisJcmV0dXJuIGlycTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBpbnRlcnJ1cHQgaGFuZGxlcihzKQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIExBTkNFIGhhcyByZWFkIGluaXRpYWxpemF0aW9uIGJsb2NrIC0+IHN0YXJ0IGl0ICovCisKK3N0YXRpYyB1MTYgaXJxc3RhcnRfaGFuZGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgb2xkY3NyMCkKK3sKKwkvKiBub3cgd2UncmUgcmVhZHkgdG8gdHJhbnNtaXQgKi8KKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCS8qIHJlc2V0IElET04gYml0LCBzdGFydCBMQU5DRSAqLworCisJU2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwLCBvbGRjc3IwIHwgQ1NSMF9JRE9OIHwgQ1NSMF9TVFJUKTsKKwlyZXR1cm4gR2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwKTsKK30KKworLyogZGlkIHdlIGxvc2UgYmxvY2tzIGR1ZSB0byBhIEZJRk8gb3ZlcnJ1biA/ICovCisKK3N0YXRpYyB1MTYgaXJxbWlzc19oYW5kbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBvbGRjc3IwKQoreworCXNrbWNhX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogdXBkYXRlIHN0YXRpc3RpY3MgKi8KKworCXByaXYtPnN0YXQucnhfZmlmb19lcnJvcnMrKzsKKworCS8qIHJlc2V0IE1JU1MgYml0ICovCisKKwlTZXRMQU5DRShkZXYsIExBTkNFX0NTUjAsIG9sZGNzcjAgfCBDU1IwX01JU1MpOworCXJldHVybiBHZXRMQU5DRShkZXYsIExBTkNFX0NTUjApOworfQorCisvKiByZWNlaXZlIGludGVycnVwdCAqLworCitzdGF0aWMgdTE2IGlycXJ4X2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IG9sZGNzcjApCit7CisJc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJTEFOQ0VfUnhEZXNjciBkZXNjcjsKKwl1bnNpZ25lZCBpbnQgZGVzY3JhZGRyOworCisJLyogcnVuIHRocm91Z2ggcXVldWUgdW50aWwgd2UgcmVhY2ggYSBkZXNjcmlwdG9yIHdlIGRvIG5vdCBvd24gKi8KKworCWRlc2NyYWRkciA9IFJBTV9SWEJBU0UgKyAocHJpdi0+bmV4dHJ4ICogc2l6ZW9mKExBTkNFX1J4RGVzY3IpKTsKKwl3aGlsZSAoMSkgeworCQkvKiByZWFkIGRlc2NyaXB0b3IgKi8KKwkJbWVtY3B5X2Zyb21pbygmZGVzY3IsIHByaXYtPmJhc2UgKyBkZXNjcmFkZHIsCisJCQkgICAgIHNpemVvZihMQU5DRV9SeERlc2NyKSk7CisKKwkJLyogaWYgd2UgcmVhY2ggYSBkZXNjcmlwdG9yIHdlIGRvIG5vdCBvd24sIHdlJ3JlIGRvbmUgKi8KKwkJaWYgKChkZXNjci5GbGFncyAmIFJYRFNDUl9GTEFHU19PV04pICE9IDApCisJCQlicmVhazsKKworI2lmZGVmIERFQlVHCisJCVByVGltZSgpOworCQlwcmludGsoIlJlY2VpdmUgcGFja2V0IG9uIGRlc2NyICVkIGxlbiAlZFxuIiwgcHJpdi0+bmV4dHJ4LAorCQkgICAgICAgZGVzY3IuTGVuKTsKKyNlbmRpZgorCisJCS8qIGVycm9uZW91cyBwYWNrZXQgPyAqLworCQlpZiAoKGRlc2NyLkZsYWdzICYgUlhEU0NSX0ZMQUdTX0VSUikgIT0gMCkgeworCQkJcHJpdi0+c3RhdC5yeF9lcnJvcnMrKzsKKwkJCWlmICgoZGVzY3IuRmxhZ3MgJiBSWERTQ1JfRkxBR1NfQ1JDKSAhPSAwKQorCQkJCXByaXYtPnN0YXQucnhfY3JjX2Vycm9ycysrOworCQkJZWxzZSBpZiAoKGRlc2NyLkZsYWdzICYgUlhEU0NSX0ZMQUdTX0NSQykgIT0gMCkKKwkJCQlwcml2LT5zdGF0LnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJZWxzZSBpZiAoKGRlc2NyLkZsYWdzICYgUlhEU0NSX0ZMQUdTX09GTE8pICE9IDApCisJCQkJcHJpdi0+c3RhdC5yeF9maWZvX2Vycm9ycysrOworCQl9CisKKwkJLyogZ29vZCBwYWNrZXQgPyAqLworCQllbHNlIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCXNrYiA9IGRldl9hbGxvY19za2IoZGVzY3IuTGVuICsgMik7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJcHJpdi0+c3RhdC5yeF9kcm9wcGVkKys7CisJCQllbHNlIHsKKwkJCQltZW1jcHlfZnJvbWlvKHNrYl9wdXQoc2tiLCBkZXNjci5MZW4pLAorCQkJCQkgICAgIHByaXYtPmJhc2UgKworCQkJCQkgICAgIGRlc2NyLkxvd0FkZHIsIGRlc2NyLkxlbik7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCQkJcHJpdi0+c3RhdC5yeF9wYWNrZXRzKys7CisJCQkJcHJpdi0+c3RhdC5yeF9ieXRlcyArPSBkZXNjci5MZW47CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJfQorCQl9CisKKwkJLyogZ2l2ZSBkZXNjcmlwdG9yIGJhY2sgdG8gTEFOQ0UgKi8KKwkJZGVzY3IuTGVuID0gMDsKKwkJZGVzY3IuRmxhZ3MgfD0gUlhEU0NSX0ZMQUdTX09XTjsKKworCQkvKiB1cGRhdGUgZGVzY3JpcHRvciBpbiBzaGFyZWQgUkFNICovCisJCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBkZXNjcmFkZHIsICZkZXNjciwKKwkJCSAgIHNpemVvZihMQU5DRV9SeERlc2NyKSk7CisKKwkJLyogZ28gdG8gbmV4dCBkZXNjcmlwdG9yICovCisJCXByaXYtPm5leHRyeCsrOworCQlkZXNjcmFkZHIgKz0gc2l6ZW9mKExBTkNFX1J4RGVzY3IpOworCQlpZiAocHJpdi0+bmV4dHJ4ID49IFJYQ09VTlQpIHsKKwkJCXByaXYtPm5leHRyeCA9IDA7CisJCQlkZXNjcmFkZHIgPSBSQU1fUlhCQVNFOworCQl9CisJfQorCisJLyogcmVzZXQgUklOVCBiaXQgKi8KKworCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCwgb2xkY3NyMCB8IENTUjBfUklOVCk7CisJcmV0dXJuIEdldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCk7Cit9CisKKy8qIHRyYW5zbWl0IGludGVycnVwdCAqLworCitzdGF0aWMgdTE2IGlycXR4X2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IG9sZGNzcjApCit7CisJc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJTEFOQ0VfVHhEZXNjciBkZXNjcjsKKwl1bnNpZ25lZCBpbnQgZGVzY3JhZGRyOworCisJLyogY2hlY2sgZGVzY3JpcHRvcnMgYXQgbW9zdCB1bnRpbCBubyBidXN5IG9uZSBpcyBsZWZ0ICovCisKKwlkZXNjcmFkZHIgPQorCSAgICBSQU1fVFhCQVNFICsgKHByaXYtPm5leHR0eGRvbmUgKiBzaXplb2YoTEFOQ0VfVHhEZXNjcikpOworCXdoaWxlIChwcml2LT50eGJ1c3kgPiAwKSB7CisJCS8qIHJlYWQgZGVzY3JpcHRvciAqLworCQltZW1jcHlfZnJvbWlvKCZkZXNjciwgcHJpdi0+YmFzZSArIGRlc2NyYWRkciwKKwkJCSAgICAgc2l6ZW9mKExBTkNFX1R4RGVzY3IpKTsKKworCQkvKiBpZiB0aGUgTEFOQ0Ugc3RpbGwgb3ducyB0aGlzIG9uZSwgd2UndmUgd29ya2VkIG91dCBhbGwgc2VudCBwYWNrZXRzICovCisJCWlmICgoZGVzY3IuRmxhZ3MgJiBUWERTQ1JfRkxBR1NfT1dOKSAhPSAwKQorCQkJYnJlYWs7CisKKyNpZmRlZiBERUJVRworCQlQclRpbWUoKTsKKwkJcHJpbnRrKCJTZW5kIHBhY2tldCBkb25lIG9uIGRlc2NyICVkXG4iLCBwcml2LT5uZXh0dHhkb25lKTsKKyNlbmRpZgorCisJCS8qIHVwZGF0ZSBzdGF0aXN0aWNzICovCisJCWlmICgoZGVzY3IuRmxhZ3MgJiBUWERTQ1JfRkxBR1NfRVJSKSA9PSAwKSB7CisJCQlwcml2LT5zdGF0LnR4X3BhY2tldHMrKzsKKwkJCXByaXYtPnN0YXQudHhfYnl0ZXMrKzsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnN0YXQudHhfZXJyb3JzKys7CisJCQlpZiAoKGRlc2NyLlN0YXR1cyAmIFRYRFNDUl9TVEFUVVNfVUZMTykgIT0gMCkgeworCQkJCXByaXYtPnN0YXQudHhfZmlmb19lcnJvcnMrKzsKKwkJCQlJbml0TEFOQ0UoZGV2KTsKKwkJCX0KKwkJCQllbHNlCisJCQkgICAgaWYgKChkZXNjci5TdGF0dXMgJiBUWERTQ1JfU1RBVFVTX0xDT0wpICE9CisJCQkJMCkgcHJpdi0+c3RhdC50eF93aW5kb3dfZXJyb3JzKys7CisJCQllbHNlIGlmICgoZGVzY3IuU3RhdHVzICYgVFhEU0NSX1NUQVRVU19MQ0FSKSAhPSAwKQorCQkJCXByaXYtPnN0YXQudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCWVsc2UgaWYgKChkZXNjci5TdGF0dXMgJiBUWERTQ1JfU1RBVFVTX1JUUlkpICE9IDApCisJCQkJcHJpdi0+c3RhdC50eF9hYm9ydGVkX2Vycm9ycysrOworCQl9CisKKwkJLyogZ28gdG8gbmV4dCBkZXNjcmlwdG9yICovCisJCXByaXYtPm5leHR0eGRvbmUrKzsKKwkJZGVzY3JhZGRyICs9IHNpemVvZihMQU5DRV9UeERlc2NyKTsKKwkJaWYgKHByaXYtPm5leHR0eGRvbmUgPj0gVFhDT1VOVCkgeworCQkJcHJpdi0+bmV4dHR4ZG9uZSA9IDA7CisJCQlkZXNjcmFkZHIgPSBSQU1fVFhCQVNFOworCQl9CisJCXByaXYtPnR4YnVzeS0tOworCX0KKworCS8qIHJlc2V0IFRYIGludGVycnVwdCBiaXQgKi8KKworCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCwgb2xkY3NyMCB8IENTUjBfVElOVCk7CisJb2xkY3NyMCA9IEdldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCk7CisKKwkvKiBhdCBsZWFzdCBvbmUgZGVzY3JpcHRvciBpcyBmcmVlZC4gIFRoZXJlZm9yZSB3ZSBjYW4gYWNjZXB0CisJICAgYSBuZXcgb25lICovCisJLyogaW5mb3JtIHVwcGVyIGxheWVycyB3ZSdyZSBpbiBidXNpbmVzcyBhZ2FpbiAqLworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJcmV0dXJuIG9sZGNzcjA7Cit9CisKKy8qIGdlbmVyYWwgaW50ZXJydXB0IGVudHJ5ICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZpY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2aWNlOworCXUxNiBjc3IwdmFsOworCisJLyogcmVhZCBDU1IwIHRvIGdldCBpbnRlcnJ1cHQgY2F1c2UgKi8KKworCWNzcjB2YWwgPSBHZXRMQU5DRShkZXYsIExBTkNFX0NTUjApOworCisJLyogaW4gY2FzZSB3ZSdyZSBub3QgbWVhbnQuLi4gKi8KKworCWlmICgoY3NyMHZhbCAmIENTUjBfSU5UUikgPT0gMCkKKwkJcmV0dXJuIElSUV9OT05FOworCisjaWYgMAorCXNldF9iaXQoTElOS19TVEFURV9SWFNFTSwgJmRldi0+c3RhdGUpOworI2VuZGlmCisKKwkvKiBsb29wIHRocm91Z2ggdGhlIGludGVycnVwdCBiaXRzIHVudGlsIGV2ZXJ5dGhpbmcgaXMgY2xlYXIgKi8KKworCWRvIHsKKwkJaWYgKChjc3IwdmFsICYgQ1NSMF9JRE9OKSAhPSAwKQorCQkJY3NyMHZhbCA9IGlycXN0YXJ0X2hhbmRsZXIoZGV2LCBjc3IwdmFsKTsKKwkJaWYgKChjc3IwdmFsICYgQ1NSMF9SSU5UKSAhPSAwKQorCQkJY3NyMHZhbCA9IGlycXJ4X2hhbmRsZXIoZGV2LCBjc3IwdmFsKTsKKwkJaWYgKChjc3IwdmFsICYgQ1NSMF9NSVNTKSAhPSAwKQorCQkJY3NyMHZhbCA9IGlycW1pc3NfaGFuZGxlcihkZXYsIGNzcjB2YWwpOworCQlpZiAoKGNzcjB2YWwgJiBDU1IwX1RJTlQpICE9IDApCisJCQljc3IwdmFsID0gaXJxdHhfaGFuZGxlcihkZXYsIGNzcjB2YWwpOworCQlpZiAoKGNzcjB2YWwgJiBDU1IwX01FUlIpICE9IDApIHsKKwkJCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCwgY3NyMHZhbCB8IENTUjBfTUVSUik7CisJCQljc3IwdmFsID0gR2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwKTsKKwkJfQorCQlpZiAoKGNzcjB2YWwgJiBDU1IwX0JBQkwpICE9IDApIHsKKwkJCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCwgY3NyMHZhbCB8IENTUjBfQkFCTCk7CisJCQljc3IwdmFsID0gR2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwKTsKKwkJfQorCX0KKwl3aGlsZSAoKGNzcjB2YWwgJiBDU1IwX0lOVFIpICE9IDApOworCisjaWYgMAorCWNsZWFyX2JpdChMSU5LX1NUQVRFX1JYU0VNLCAmZGV2LT5zdGF0ZSk7CisjZW5kaWYKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZHJpdmVyIG1ldGhvZHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBNQ0EgaW5mbyAqLworCitzdGF0aWMgaW50IHNrbWNhX2dldGluZm8oY2hhciAqYnVmLCBpbnQgc2xvdCwgdm9pZCAqZCkKK3sKKwlpbnQgbGVuID0gMCwgaTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGQ7CisJc2ttY2FfcHJpdiAqcHJpdjsKKworCS8qIGNhbid0IHNheSBhbnl0aGluZyBhYm91dCBhbiB1bmluaXRpYWxpemVkIGRldmljZS4uLiAqLworCisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gbGVuOworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogcHJpbnQgaW5mbyAqLworCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSVJROiAlZFxuIiwgcHJpdi0+cmVhbGlycSk7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiTWVtb3J5OiAlI2x4LSUjbHhcbiIsIGRldi0+bWVtX3N0YXJ0LAorCQkgICAgICAgZGV2LT5tZW1fZW5kIC0gMSk7CisJbGVuICs9CisJICAgIHNwcmludGYoYnVmICsgbGVuLCAiVHJhbnNjZWl2ZXI6ICVzXG4iLAorCQkgICAgTWVkaWFOYW1lc1twcml2LT5tZWRpdW1dKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJEZXZpY2U6ICVzXG4iLCBkZXYtPm5hbWUpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIk1BQyBhZGRyZXNzOiIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiAlMDJ4IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJYnVmW2xlbisrXSA9ICdcbic7CisJYnVmW2xlbl0gPSAwOworCisJcmV0dXJuIGxlbjsKK30KKworLyogb3BlbiBkcml2ZXIuICBNZWFucyBhbHNvIGluaXRpYWxpemF0aW9uIGFuZCBzdGFydCBvZiBMQU5DRSAqLworCitzdGF0aWMgaW50IHNrbWNhX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmVzdWx0OworCXNrbWNhX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogcmVnaXN0ZXIgcmVzb3VyY2VzIC0gb25seSBuZWNlc3NhcnkgZm9yIElSUSAqLworCXJlc3VsdCA9CisJICAgIHJlcXVlc3RfaXJxKHByaXYtPnJlYWxpcnEsIGlycV9oYW5kbGVyLAorCQkJU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NLCAic2tfbWNhIiwgZGV2KTsKKwlpZiAocmVzdWx0ICE9IDApIHsKKwkJcHJpbnRrKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGlycSAlZFxuIiwgZGV2LT5uYW1lLAorCQkgICAgICAgZGV2LT5pcnEpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlkZXYtPmlycSA9IHByaXYtPnJlYWxpcnE7CisKKwkvKiBzZXQgdXAgdGhlIGNhcmQgYW5kIExBTkNFICovCisKKwlJbml0Qm9hcmQoZGV2KTsKKworCS8qIHNldCB1cCBmbGFncyAqLworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKiBjbG9zZSBkcml2ZXIuICBTaHV0IGRvd24gYm9hcmQgYW5kIGZyZWUgYWxsb2NhdGVkIHJlc291cmNlcyAqLworCitzdGF0aWMgaW50IHNrbWNhX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogdHVybiBvZmYgYm9hcmQgKi8KKwlEZWluaXRCb2FyZChkZXYpOworCisJLyogcmVsZWFzZSByZXNvdXJjZXMgKi8KKwlpZiAoZGV2LT5pcnEgIT0gMCkKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJZGV2LT5pcnEgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHRyYW5zbWl0IGEgYmxvY2suICovCisKK3N0YXRpYyBpbnQgc2ttY2FfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlMQU5DRV9UeERlc2NyIGRlc2NyOworCXVuc2lnbmVkIGludCBhZGRyZXNzOworCWludCB0bXBsZW4sIHJldHZhbCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGlmIHdlIGdldCBjYWxsZWQgd2l0aCBhIE5VTEwgZGVzY3JpcHRvciwgdGhlIEV0aGVybmV0IGxheWVyIHRoaW5rcyAKKwkgICBvdXIgY2FyZCBpcyBzdHVjayBhbiB3ZSBzaG91bGQgcmVzZXQgaXQuICBXZSdsbCBkbyB0aGlzIGNvbXBsZXRlbHk6ICovCisKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJRGVpbml0Qm9hcmQoZGV2KTsKKwkJSW5pdEJvYXJkKGRldik7CisJCXJldHVybiAwOwkvKiBkb24ndCB0cnkgdG8gZnJlZSB0aGUgYmxvY2sgaGVyZSA7LSkgKi8KKwl9CisKKwkvKiBpcyB0aGVyZSBzcGFjZSBpbiB0aGUgVHggcXVldWUgPyBJZiBubywgdGhlIHVwcGVyIGxheWVyIGdhdmUgdXMgYQorCSAgIHBhY2tldCBpbiBzcGl0ZSBvZiB1cyBub3QgYmVpbmcgcmVhZHkgYW5kIGlzIHJlYWxseSBpbiB0cm91YmxlLgorCSAgIFdlJ2xsIGRvIHRoZSBkcm9wcGluZyBmb3IgaGltOiAqLworCWlmIChwcml2LT50eGJ1c3kgPj0gVFhDT1VOVCkgeworCQlwcml2LT5zdGF0LnR4X2Ryb3BwZWQrKzsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byB0eF9kb25lOworCX0KKworCS8qIGdldCBUWCBkZXNjcmlwdG9yICovCisJYWRkcmVzcyA9IFJBTV9UWEJBU0UgKyAocHJpdi0+bmV4dHR4cHV0ICogc2l6ZW9mKExBTkNFX1R4RGVzY3IpKTsKKwltZW1jcHlfZnJvbWlvKCZkZXNjciwgcHJpdi0+YmFzZSArIGFkZHJlc3MsIHNpemVvZihMQU5DRV9UeERlc2NyKSk7CisKKwkvKiBlbnRlciBwYWNrZXQgbGVuZ3RoIGFzIDJzIGNvbXBsZW1lbnQgLSBhc3N1cmUgbWluaW11bSBsZW5ndGggKi8KKwl0bXBsZW4gPSBza2ItPmxlbjsKKwlpZiAodG1wbGVuIDwgNjApCisJCXRtcGxlbiA9IDYwOworCWRlc2NyLkxlbiA9IDY1NTM2IC0gdG1wbGVuOworCisJLyogY29weSBmaWxsZXIgaW50byBSQU0gLSBpbiBjYXNlIHdlJ3JlIGZpbGxpbmcgdXAuLi4gCisJICAgd2UncmUgZmlsbGluZyBhIGJpdCBtb3JlIHRoYW4gbmVjZXNzYXJ5LCBidXQgdGhhdCBkb2Vzbid0IGhhcm0KKwkgICBzaW5jZSB0aGUgYnVmZmVyIGlzIGZhciBsYXJnZXIuLi4gKi8KKwlpZiAodG1wbGVuID4gc2tiLT5sZW4pIHsKKwkJY2hhciAqZmlsbCA9ICJOZXRCU0QgaXMgYSBuaWNlIE9TIHRvbyEgIjsKKwkJdW5zaWduZWQgaW50IGRlc3RvZmZzID0gMCwgbCA9IHN0cmxlbihmaWxsKTsKKworCQl3aGlsZSAoZGVzdG9mZnMgPCB0bXBsZW4pIHsKKwkJCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBkZXNjci5Mb3dBZGRyICsKKwkJCQkgICBkZXN0b2ZmcywgZmlsbCwgbCk7CisJCQlkZXN0b2ZmcyArPSBsOworCQl9CisJfQorCisJLyogZG8gdGhlIHJlYWwgZGF0YSBjb3B5aW5nICovCisJbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIGRlc2NyLkxvd0FkZHIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJLyogaGFuZCBkZXNjcmlwdG9yIG92ZXIgdG8gTEFOQ0UgLSB0aGlzIGlzIHRoZSBmaXJzdCBhbmQgbGFzdCBjaHVuayAqLworCWRlc2NyLkZsYWdzID0KKwkgICAgVFhEU0NSX0ZMQUdTX09XTiB8IFRYRFNDUl9GTEFHU19TVFAgfCBUWERTQ1JfRkxBR1NfRU5QOworCisjaWZkZWYgREVCVUcKKwlQclRpbWUoKTsKKwlwcmludGsoIlNlbmQgcGFja2V0IG9uIGRlc2NyICVkIGxlbiAlZFxuIiwgcHJpdi0+bmV4dHR4cHV0LAorCSAgICAgICBza2ItPmxlbik7CisjZW5kaWYKKworCS8qIG9uZSBtb3JlIGRlc2NyaXB0b3IgYnVzeSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXByaXYtPm5leHR0eHB1dCsrOworCWlmIChwcml2LT5uZXh0dHhwdXQgPj0gVFhDT1VOVCkKKwkJcHJpdi0+bmV4dHR4cHV0ID0gMDsKKwlwcml2LT50eGJ1c3krKzsKKworCS8qIGFyZSB3ZSBzYXR1cmF0ZWQgPyAqLworCisJaWYgKHByaXYtPnR4YnVzeSA+PSBUWENPVU5UKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiB3cml0ZSBkZXNjcmlwdG9yIGJhY2sgdG8gUkFNICovCisJbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIGFkZHJlc3MsICZkZXNjciwgc2l6ZW9mKExBTkNFX1R4RGVzY3IpKTsKKworCS8qIGlmIG5vIGRlc2NyaXB0b3JzIHdlcmUgYWN0aXZlLCBnaXZlIHRoZSBMQU5DRSBhIGhpbnQgdG8gcmVhZCBpdAorCSAgIGltbWVkaWF0ZWx5ICovCisKKwlpZiAocHJpdi0+dHhidXN5ID09IDApCisJCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCwgQ1NSMF9JTkVBIHwgQ1NSMF9URE1EKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworICAgICAgdHhfZG9uZToKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIHJldHVybiBwb2ludGVyIHRvIEV0aGVybmV0IHN0YXRpc3RpY3MgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpza21jYV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNrbWNhX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICYocHJpdi0+c3RhdCk7Cit9CisKKy8qIHN3aXRjaCByZWNlaXZlciBtb2RlLiAgV2UgdXNlIHRoZSBMQU5DRSdzIG11bHRpY2FzdCBmaWx0ZXIgdG8gcHJlZmlsdGVyCisgICBtdWx0aWNhc3QgYWRkcmVzc2VzLiAqLworCitzdGF0aWMgdm9pZCBza21jYV9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlMQU5DRV9Jbml0QmxvY2sgYmxvY2s7CisKKwkvKiBmaXJzdCBzdG9wIHRoZSBMQU5DRS4uLiAqLworCVN0b3BMQU5DRShkZXYpOworCisJLyogLi4udGhlbiBtb2RpZnkgdGhlIGluaXRpYWxpemF0aW9uIGJsb2NrLi4uICovCisJbWVtY3B5X2Zyb21pbygmYmxvY2ssIHByaXYtPmJhc2UgKyBSQU1fSU5JVEJBU0UsIHNpemVvZihibG9jaykpOworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCWJsb2NrLk1vZGUgfD0gTEFOQ0VfSU5JVF9QUk9NOworCWVsc2UKKwkJYmxvY2suTW9kZSAmPSB+TEFOQ0VfSU5JVF9QUk9NOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsJLyogZ2V0IGFsbCBtdWx0aWNhc3RzICovCisJCW1lbXNldChibG9jay5MQWRyRiwgMHhmZiwgc2l6ZW9mKGJsb2NrLkxBZHJGKSk7CisJfSBlbHNlIHsJCS8qIGdldCBzZWxlY3RlZC9ubyBtdWx0aWNhc3RzICovCisKKwkJc3RydWN0IGRldl9tY19saXN0ICptcHRyOworCQlpbnQgY29kZTsKKworCQltZW1zZXQoYmxvY2suTEFkckYsIDAsIHNpemVvZihibG9jay5MQWRyRikpOworCQlmb3IgKG1wdHIgPSBkZXYtPm1jX2xpc3Q7IG1wdHIgIT0gTlVMTDsgbXB0ciA9IG1wdHItPm5leHQpIHsKKwkJCWNvZGUgPSBHZXRIYXNoKG1wdHItPmRtaV9hZGRyKTsKKwkJCWJsb2NrLkxBZHJGWyhjb2RlID4+IDMpICYgN10gfD0gMSA8PCAoY29kZSAmIDcpOworCQl9CisJfQorCisJbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIFJBTV9JTklUQkFTRSwgJmJsb2NrLCBzaXplb2YoYmxvY2spKTsKKworCS8qIC4uLnRoZW4gcmVpbml0IExBTkNFIHdpdGggdGhlIGNvcnJlY3QgZmxhZ3MgKi8KKwlJbml0TEFOQ0UoZGV2KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBoYXJkd2FyZSBjaGVjaworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgc3RhcnRzbG90OwkJLyogY291bnRzIHRocm91Z2ggc2xvdHMgd2hlbiBwcm9iaW5nIG11bHRpcGxlIGRldmljZXMgKi8KKworc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJRGVpbml0Qm9hcmQoZGV2KTsKKwlpZiAoZGV2LT5pcnEgIT0gMCkKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJaW91bm1hcChwcml2LT5iYXNlKTsKKwltY2FfbWFya19hc191bnVzZWQocHJpdi0+c2xvdCk7CisJbWNhX3NldF9hZGFwdGVyX3Byb2Nmbihwcml2LT5zbG90LCBOVUxMLCBOVUxMKTsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgc2ttY2FfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZm9yY2VfZGV0ZWN0ID0gMDsKKwlpbnQganVuaW9yLCBzbG90LCBpOworCWludCBiYXNlID0gMCwgaXJxID0gMDsKKwlza21jYV9wcml2ICpwcml2OworCXNrbWNhX21lZGl1bSBtZWRpdW07CisJaW50IGVycjsKKworCS8qIGNhbid0IHdvcmsgd2l0aG91dCBhbiBNQ0EgYnVzIDstKSAqLworCisJaWYgKE1DQV9idXMgPT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc2ttY2FfcHJpdikpOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIHN0YXJ0IGFkZHJlc3Mgb2YgMSAtLT4gZm9yY2VkIGRldGVjdGlvbiAqLworCisJaWYgKGRldi0+bWVtX3N0YXJ0ID09IDEpCisJCWZvcmNlX2RldGVjdCA9IDE7CisKKwkvKiBzZWFyY2ggdGhyb3VnaCBzbG90cyAqLworCisJYmFzZSA9IGRldi0+bWVtX3N0YXJ0OworCWlycSA9IGRldi0+YmFzZV9hZGRyOworCWZvciAoc2xvdCA9IHN0YXJ0c2xvdDsgKHNsb3QgPSBkb2ZpbmQoJmp1bmlvciwgc2xvdCkpICE9IC0xOyBzbG90KyspIHsKKwkJLyogZGVkdWNlIGNhcmQgYWRkcmVzc2VzICovCisKKwkJZ2V0YWRkcnMoc2xvdCwganVuaW9yLCAmYmFzZSwgJmlycSwgJm1lZGl1bSk7CisKKwkJLyogc2xvdCBhbHJlYWR5IGluIHVzZSA/ICovCisKKwkJaWYgKG1jYV9pc19hZGFwdGVyX3VzZWQoc2xvdCkpCisJCQljb250aW51ZTsKKworCQkvKiB3ZXJlIHdlIGxvb2tpbmcgZm9yIHNvbWV0aGluZyBkaWZmZXJlbnQgPyAqLworCisJCWlmIChkZXYtPmlycSAmJiBkZXYtPmlycSAhPSBpcnEpCisJCQljb250aW51ZTsKKwkJaWYgKGRldi0+bWVtX3N0YXJ0ICYmIGRldi0+bWVtX3N0YXJ0ICE9IGJhc2UpCisJCQljb250aW51ZTsKKworCQkvKiBmb3VuZCBzb21ldGhpbmcgdGhhdCBtYXRjaGVzICovCisKKwkJYnJlYWs7CisJfQorCisJLyogbm90aGluZyBmb3VuZCA/ICovCisKKwlpZiAoc2xvdCA9PSAtMSkgeworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gKGJhc2UgfHwgaXJxKSA/IEVSUl9QVFIoLUVOWElPKSA6IEVSUl9QVFIoLUVOT0RFVik7CisJfQorCisJLyogbWFrZSBwcm9jZnMgZW50cmllcyAqLworCisJaWYgKGp1bmlvcikKKwkJbWNhX3NldF9hZGFwdGVyX25hbWUoc2xvdCwKKwkJCQkgICAgICJTS05FVCBqdW5pb3IgTUMyIEV0aGVybmV0IEFkYXB0ZXIiKTsKKwllbHNlCisJCW1jYV9zZXRfYWRhcHRlcl9uYW1lKHNsb3QsICJTS05FVCBNQzIrIEV0aGVybmV0IEFkYXB0ZXIiKTsKKwltY2Ffc2V0X2FkYXB0ZXJfcHJvY2ZuKHNsb3QsIChNQ0FfUHJvY0ZuKSBza21jYV9nZXRpbmZvLCBkZXYpOworCisJbWNhX21hcmtfYXNfdXNlZChzbG90KTsKKworCS8qIGFubm91bmNlIHN1Y2Nlc3MgKi8KKwlwcmludGsoIiVzOiBTS05ldCAlcyBhZGFwdGVyIGZvdW5kIGluIHNsb3QgJWRcbiIsIGRldi0+bmFtZSwKKwkgICAgICAganVuaW9yID8gIkp1bmlvciBNQzIiIDogIk1DMisiLCBzbG90ICsgMSk7CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwcml2LT5iYXNlID0gaW9yZW1hcChiYXNlLCAweDQwMDApOworCWlmICghcHJpdi0+YmFzZSkgeworCQltY2Ffc2V0X2FkYXB0ZXJfcHJvY2ZuKHNsb3QsIE5VTEwsIE5VTEwpOworCQltY2FfbWFya19hc191bnVzZWQoc2xvdCk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCXByaXYtPnNsb3QgPSBzbG90OworCXByaXYtPm1hY2Jhc2UgPSBwcml2LT5iYXNlICsgMHgzZmMwOworCXByaXYtPmlvcmVnYWRkciA9IHByaXYtPmJhc2UgKyAweDNmZjA7CisJcHJpdi0+Y3RybGFkZHIgPSBwcml2LT5iYXNlICsgMHgzZmYyOworCXByaXYtPmNtZGFkZHIgPSBwcml2LT5iYXNlICsgMHgzZmYzOworCXByaXYtPm1lZGl1bSA9IG1lZGl1bTsKKwltZW1zZXQoJnByaXYtPnN0YXQsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKworCS8qIHNldCBiYXNlICsgaXJxIGZvciB0aGlzIGRldmljZSAoaXJxIG5vdCBhbGxvY2F0ZWQgc28gZmFyKSAqLworCWRldi0+aXJxID0gMDsKKwlkZXYtPm1lbV9zdGFydCA9IGJhc2U7CisJZGV2LT5tZW1fZW5kID0gYmFzZSArIDB4NDAwMDsKKworCS8qIGF1dG9wcm9iZSA/ICovCisJaWYgKGlycSA8IDApIHsKKwkJaW50IG5pcnE7CisKKwkJcHJpbnRrCisJCSAgICAoIiVzOiBhbWJpZ291cyBQT1MgYml0IGNvbWJpbmF0aW9uLCBtdXN0IHByb2JlIGZvciBJUlEuLi5cbiIsCisJCSAgICAgZGV2LT5uYW1lKTsKKwkJbmlycSA9IFByb2JlSVJRKGRldik7CisJCWlmIChuaXJxIDw9IDApCisJCQlwcmludGsoIiVzOiBJUlEgcHJvYmUgZmFpbGVkLCBhc3N1bWluZyBJUlEgJWQiLAorCQkJICAgICAgIGRldi0+bmFtZSwgcHJpdi0+cmVhbGlycSA9IC1pcnEpOworCQllbHNlCisJCQlwcml2LT5yZWFsaXJxID0gbmlycTsKKwl9IGVsc2UKKwkJcHJpdi0+cmVhbGlycSA9IGlycTsKKworCS8qIHNldCBtZXRob2RzICovCisJZGV2LT5vcGVuID0gc2ttY2Ffb3BlbjsKKwlkZXYtPnN0b3AgPSBza21jYV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHNrbWNhX3R4OworCWRldi0+ZG9faW9jdGwgPSBOVUxMOworCWRldi0+Z2V0X3N0YXRzID0gc2ttY2Ffc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBza21jYV9zZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5mbGFncyB8PSBJRkZfTVVMVElDQVNUOworCisJLyogY29weSBvdXQgTUFDIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gcmVhZGIocHJpdi0+bWFjYmFzZSArIChpIDw8IDEpKTsKKworCS8qIHByaW50IGNvbmZpZyAqLworCXByaW50aygiJXM6IElSUSAlZCwgbWVtb3J5ICUjbHgtJSNseCwgIgorCSAgICAgICAiTUFDIGFkZHJlc3MgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHByaXYtPnJlYWxpcnEsIGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQgLSAxLAorCSAgICAgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCSAgICAgICBkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdKTsKKwlwcmludGsoIiVzOiAlcyBtZWRpdW1cbiIsIGRldi0+bmFtZSwgTWVkaWFOYW1lc1twcml2LT5tZWRpdW1dKTsKKworCS8qIHJlc2V0IGJvYXJkICovCisKKwlSZXNldEJvYXJkKGRldik7CisKKwlzdGFydHNsb3QgPSBzbG90ICsgMTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJY2xlYW51cF9jYXJkKGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCWRldiA9IEVSUl9QVFIoZXJyKTsKKwl9CisJcmV0dXJuIGRldjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBtb2R1bGFyaXphdGlvbiBzdXBwb3J0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIE1PRFVMRQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIERFVk1BWCA1CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqbW9kZGV2c1tERVZNQVhdOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgejsKKworCXN0YXJ0c2xvdCA9IDA7CisJZm9yICh6ID0gMDsgeiA8IERFVk1BWDsgeisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza21jYV9wcm9iZSgtMSk7CisJCWlmIChJU19FUlIoZGV2KSkKKwkJCWJyZWFrOworCQltb2RkZXZzW3pdID0gZGV2OworCX0KKwlpZiAoIXopCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHo7CisKKwlmb3IgKHogPSAwOyB6IDwgREVWTUFYOyB6KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG1vZGRldnNbel07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYJCQkJLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za19tY2EuaCBiL2RyaXZlcnMvbmV0L3NrX21jYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlN2M5OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za19tY2EuaApAQCAtMCwwICsxLDE3MiBAQAorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2lmbmRlZiBfU0tfTUNBX0lOQ0xVREVfCisjZGVmaW5lIF9TS19NQ0FfSU5DTFVERV8KKworI2lmZGVmIF9TS19NQ0FfRFJJVkVSXworCisvKiBBZGFwdGVyIElEJ3MgKi8KKyNkZWZpbmUgU0tORVRfTUNBX0lEIDB4NmFmZAorI2RlZmluZSBTS05FVF9KVU5JT1JfTUNBX0lEIDB4NmJlOQorCisvKiBtZWRpYSBlbnVtZXJhdGlvbiAtIGRlZmluZWQgaW4gYSB3YXkgdGhhdCBpdCBmaXRzIG9udG8gdGhlIE1DMisncworICAgUE9TIHJlZ2lzdGVycy4uLiAqLworCit0eXBlZGVmIGVudW0geyBNZWRpYV8xMEJhc2UyLCBNZWRpYV8xMEJhc2VULAorCU1lZGlhXzEwQmFzZTUsIE1lZGlhX1Vua25vd24sIE1lZGlhX0NvdW50Cit9IHNrbWNhX21lZGl1bTsKKworLyogcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgc2xvdDsJLyogTUNBLVNsb3QtIyAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdm9pZCBfX2lvbWVtICptYWNiYXNlOwkvKiBiYXNlIGFkZHJlc3Mgb2YgTUFDIGFkZHJlc3MgUFJPTSAqLworCXZvaWQgX19pb21lbSAqaW9yZWdhZGRyOy8qIGFkZHJlc3Mgb2YgSS9PLXJlZ2lzdGVyIChMbykgICAgICovCisJdm9pZCBfX2lvbWVtICpjdHJsYWRkcjsJLyogYWRkcmVzcyBvZiBjb250cm9sL3N0YXQgcmVnaXN0ZXIgKi8KKwl2b2lkIF9faW9tZW0gKmNtZGFkZHI7CS8qIGFkZHJlc3Mgb2YgSS9PLWNvbW1hbmQgcmVnaXN0ZXIgICovCisJaW50IG5leHRyeDsJCS8qIGluZGV4IG9mIG5leHQgUlggZGVzY3JpcHRvciB0bworCQkJCSAgIGJlIHJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaW50IG5leHR0eHB1dDsJCS8qIGluZGV4IG9mIG5leHQgZnJlZSBUWCBkZXNjcmlwdG9yICovCisJaW50IG5leHR0eGRvbmU7CQkvKiBpbmRleCBvZiBuZXh0IFRYIGRlc2NyaXB0b3IgdG8gCisJCQkJICAgYmUgZmluaXNoZWQgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpbnQgdHhidXN5OwkJLyogIyBvZiBidXN5IFRYIGRlc2NyaXB0b3JzICAgICAgICAgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0OwkvKiBwYWNrZXQgc3RhdGlzdGljcyAgICAgICAgICAgICovCisJaW50IHJlYWxpcnE7CQkvKiBtZW1vcml6ZXMgYWN0dWFsIElSUSwgZXZlbiB3aGVuIAorCQkJCSAgIGN1cnJlbnRseSBub3QgYWxsb2NhdGVkICAgICAgICAgICovCisJc2ttY2FfbWVkaXVtIG1lZGl1bTsJLyogcGh5c2ljYWwgY2FubmVjdG9yICAgICAgICAgICAgICAgKi8KKwlzcGlubG9ja190IGxvY2s7Cit9IHNrbWNhX3ByaXY7CisKKy8qIGNhcmQgcmVnaXN0ZXJzOiBjb250cm9sL3N0YXR1cyByZWdpc3RlciBiaXRzICovCisKKyNkZWZpbmUgQ1RSTF9BRFJfREFUQSAgICAgIDAJLyogQml0IDAgPSAwIC0+YWNjZXNzIGRhdGEgcmVnaXN0ZXIgICovCisjZGVmaW5lIENUUkxfQURSX1JBUCAgICAgICAxCS8qIEJpdCAwID0gMSAtPmFjY2VzcyBSQVAgcmVnaXN0ZXIgICAqLworI2RlZmluZSBDVFJMX1JXX1dSSVRFICAgICAgMAkvKiBCaXQgMSA9IDAgLT53cml0ZSByZWdpc3RlciAgICAgICAgKi8KKyNkZWZpbmUgQ1RSTF9SV19SRUFEICAgICAgIDIJLyogQml0IDEgPSAxIC0+cmVhZCByZWdpc3RlciAgICAgICAgICovCisjZGVmaW5lIENUUkxfUkVTRVRfT04gICAgICAwCS8qIEJpdCAzID0gMCAtPnJlc2V0IGJvYXJkICAgICAgICAgICAqLworI2RlZmluZSBDVFJMX1JFU0VUX09GRiAgICAgOAkvKiBCaXQgMyA9IDEgLT5ubyByZXNldCBvZiBib2FyZCAgICAgKi8KKworI2RlZmluZSBTVEFUX0FEUl9EQVRBICAgICAgMAkvKiBCaXQgMCBvZiBjdHJsIHJlZ2lzdGVyIHJlYWQgYmFjayAgKi8KKyNkZWZpbmUgU1RBVF9BRFJfUkFQICAgICAgIDEKKyNkZWZpbmUgU1RBVF9SV19XUklURSAgICAgIDAJLyogQml0IDEgb2YgY3RybCByZWdpc3RlciByZWFkIGJhY2sgICovCisjZGVmaW5lIFNUQVRfUldfUkVBRCAgICAgICAyCisjZGVmaW5lIFNUQVRfUkVTRVRfT04gICAgICAwCS8qIEJpdCAzIG9mIGN0cmwgcmVnaXN0ZXIgcmVhZCBiYWNrICAqLworI2RlZmluZSBTVEFUX1JFU0VUX09GRiAgICAgOAorI2RlZmluZSBTVEFUX0lSUV9BQ1QgICAgICAgMAkvKiBpbnRlcnJ1cHQgcGVuZGluZyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1RBVF9JUlFfTk9BQ1QgICAgIDE2CS8qIG5vIGludGVycnVwdCBwZW5kaW5nICAgICAgICAgICAgICAqLworI2RlZmluZSBTVEFUX0lPX05PQlVTWSAgICAgMAkvKiBubyB0cmFuc2ZlciBidXN5ICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1RBVF9JT19CVVNZICAgICAgIDMyCS8qIHRyYW5zZmVyIGJ1c3kgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBJL08gY29tbWFuZCByZWdpc3RlciBiaXRzICovCisKKyNkZWZpbmUgSU9DTURfR08gICAgICAgICAgIDEyOAkvKiBCaXQgNyA9IDEgLT4gc3RhcnQgcmVnaXN0ZXIgeGZlciAgKi8KKworLyogTEFOQ0UgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTEFOQ0VfQ1NSMCAgICAgICAgIDAJLyogU3RhdHVzL0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgQ1NSMF9FUlIgICAgICAgICAgIDB4ODAwMAkvKiBnZW5lcmFsIGVycm9yIGZsYWcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9CQUJMICAgICAgICAgIDB4NDAwMAkvKiB0cmFuc21pdHRlciB0aW1lb3V0ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9DRVJSICAgICAgICAgIDB4MjAwMAkvKiBjb2xsaXNpb24gZXJyb3IgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9NSVNTICAgICAgICAgIDB4MTAwMAkvKiBsb3N0IFJ4IGJsb2NrICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9NRVJSICAgICAgICAgIDB4MDgwMAkvKiBtZW1vcnkgYWNjZXNzIGVycm9yICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9SSU5UICAgICAgICAgIDB4MDQwMAkvKiByZWNlaXZlciBpbnRlcnJ1cHQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9USU5UICAgICAgICAgIDB4MDIwMAkvKiB0cmFuc21pdHRlciBpbnRlcnJ1cHQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9JRE9OICAgICAgICAgIDB4MDEwMAkvKiBpbml0aWFsaXphdGlvbiBkb25lICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9JTlRSICAgICAgICAgIDB4MDA4MAkvKiBnZW5lcmFsIGludGVycnVwdCBmbGFnICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9JTkVBICAgICAgICAgIDB4MDA0MAkvKiBpbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9SWE9OICAgICAgICAgIDB4MDAyMAkvKiByZWNlaXZlciBlbmFibGVkICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9UWE9OICAgICAgICAgIDB4MDAxMAkvKiB0cmFuc21pdHRlciBlbmFibGVkICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9URE1EICAgICAgICAgIDB4MDAwOAkvKiBmb3JjZSB0cmFuc21pc3Npb24gbm93ICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9TVE9QICAgICAgICAgIDB4MDAwNAkvKiBzdG9wIExBTkNFICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9TVFJUICAgICAgICAgIDB4MDAwMgkvKiBzdGFydCBMQU5DRSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSMF9JTklUICAgICAgICAgIDB4MDAwMQkvKiByZWFkIGluaXRpYWxpemF0aW9uIGJsb2NrICAgICAgICAgKi8KKworI2RlZmluZSBMQU5DRV9DU1IxICAgICAgICAgMQkvKiBhZGRyIGJpdCAwLi4xNSBvZiBpbml0aWFsaXphdGlvbiAgKi8KKyNkZWZpbmUgTEFOQ0VfQ1NSMiAgICAgICAgIDIJLyogICAgICAgICAgMTYuLjIzIGJsb2NrICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTEFOQ0VfQ1NSMyAgICAgICAgIDMJLyogQnVzIGNvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENTUjNfQkNPTl9IT0xEICAgICAwCS8qIEJpdCAwID0gMCAtPiBCTTEsQk0wLEhPTEQgICAgICAgICAqLworI2RlZmluZSBDU1IzX0JDT05fQlVTUlEgICAgMQkvKiBCaXQgMCA9IDEgLT4gQlVTQUswLEJZVEUsQlVTUlEgICAgKi8KKyNkZWZpbmUgQ1NSM19BTEVfSElHSCAgICAgIDAJLyogQml0IDEgPSAwIC0+IEFMRSBhc3NlcnRlZCBoaWdoICAgICovCisjZGVmaW5lIENTUjNfQUxFX0xPVyAgICAgICAyCS8qIEJpdCAxID0gMSAtPiBBTEUgYXNzZXJ0ZWQgbG93ICAgICAqLworI2RlZmluZSBDU1IzX0JTV0FQX09GRiAgICAgMAkvKiBCaXQgMiA9IDAgLT4gbm8gYnl0ZSBzd2FwICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSM19CU1dBUF9PTiAgICAgIDQJLyogQml0IDIgPSAxIC0+IGJ5dGUgc3dhcCAgICAgICAgICAgICovCisKKy8qIExBTkNFIHN0cnVjdHVyZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgewkJLyogTEFOQ0UgaW5pdGlhbGl6YXRpb24gYmxvY2sgICAgICAgICovCisJdTE2IE1vZGU7CQkvKiBtb2RlIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1OCBQQWRyWzZdOwkJLyogTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICovCisJdTggTEFkckZbOF07CQkvKiBNdWx0aWNhc3QgZmlsdGVyICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgUmRyUDsJCS8qIFJlY2VpdmUgZGVzY3JpcHRvciAgICAgICAgICAgICAgICAqLworCXUzMiBUZHJQOwkJLyogVHJhbnNtaXQgZGVzY3JpcHRvciAgICAgICAgICAgICAgICovCit9IExBTkNFX0luaXRCbG9jazsKKworLyogTW9kZSBmbGFncyBpbml0IGJsb2NrICovCisKKyNkZWZpbmUgTEFOQ0VfSU5JVF9QUk9NICAgIDB4ODAwMAkvKiBlbmFibGUgcHJvbWlzY291cyBtb2RlICAgICAgICAgICAgKi8KKyNkZWZpbmUgTEFOQ0VfSU5JVF9JTlRMICAgIDB4MDA0MAkvKiBpbnRlcm5hbCBsb29wYmFjayAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTEFOQ0VfSU5JVF9EUlRZICAgIDB4MDAyMAkvKiBkaXNhYmxlIHJldHJ5ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTEFOQ0VfSU5JVF9DT0xMICAgIDB4MDAxMAkvKiBmb3JjZSBjb2xsaXNpb24gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTEFOQ0VfSU5JVF9EVENSICAgIDB4MDAwOAkvKiBkaXNhYmxlIHRyYW5zbWl0IENSQyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTEFOQ0VfSU5JVF9MT09QICAgIDB4MDAwNAkvKiBsb29wYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTEFOQ0VfSU5JVF9EVFggICAgIDB4MDAwMgkvKiBkaXNhYmxlIHRyYW5zbWl0dGVyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTEFOQ0VfSU5JVF9EUlggICAgIDB4MDAwMQkvKiBkaXNhYmxlIHJlY2VpdmVyICAgICAgICAgICAgICAgICAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgewkJLyogTEFOQ0UgVHggZGVzY3JpcHRvciAgICAgICAgICAgICAgICovCisJdTE2IExvd0FkZHI7CQkvKiBiaXQgMC4uMTUgb2YgYWRkcmVzcyAgICAgICAgICAgICAgKi8KKwl1MTYgRmxhZ3M7CQkvKiBiaXQgMTYuLjIzIG9mIGFkZHJlc3MgKyBGbGFncyAgICAgKi8KKwl1MTYgTGVuOwkJLyogMnMgY29tcGxlbWVudCBvZiBwYWNrZXQgbGVuZ3RoICAgICovCisJdTE2IFN0YXR1czsJCS8qIFJlc3VsdCBvZiB0cmFuc21pc3Npb24gICAgICAgICAgICAqLworfSBMQU5DRV9UeERlc2NyOworCisjZGVmaW5lIFRYRFNDUl9GTEFHU19PV04gICAweDgwMDAJLyogTEFOQ0Ugb3ducyBkZXNjcmlwdG9yICAgICAgICAgICAgICovCisjZGVmaW5lIFRYRFNDUl9GTEFHU19FUlIgICAweDQwMDAJLyogc3VtbWFyeSBlcnJvciBmbGFnICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRYRFNDUl9GTEFHU19NT1JFICAweDEwMDAJLyogbW9yZSB0aGFuIG9uZSByZXRyeSBuZWVkZWQ/ICAgICAgICovCisjZGVmaW5lIFRYRFNDUl9GTEFHU19PTkUgICAweDA4MDAJLyogb25lIHJldHJ5PyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRYRFNDUl9GTEFHU19ERUYgICAweDA0MDAJLyogdHJhbnNtaXNzaW9uIGRlZmVycmVkPyAgICAgICAgICAgICovCisjZGVmaW5lIFRYRFNDUl9GTEFHU19TVFAgICAweDAyMDAJLyogZmlyc3QgcGFja2V0IGluIGNoYWluPyAgICAgICAgICAgICovCisjZGVmaW5lIFRYRFNDUl9GTEFHU19FTlAgICAweDAxMDAJLyogbGFzdCBwYWNrZXQgaW4gY2hhaW4/ICAgICAgICAgICAgICovCisKKyNkZWZpbmUgVFhEU0NSX1NUQVRVU19CVUZGIDB4ODAwMAkvKiBidWZmZXIgZXJyb3I/ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFhEU0NSX1NUQVRVU19VRkxPIDB4NDAwMAkvKiBzaWxvIHVuZGVyZmxvdyBkdXJpbmcgdHJhbnNtaXQ/ICAgKi8KKyNkZWZpbmUgVFhEU0NSX1NUQVRVU19MQ09MIDB4MTAwMAkvKiBsYXRlIGNvbGxpc2lvbj8gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFhEU0NSX1NUQVRVU19MQ0FSIDB4MDgwMAkvKiBsb3NzIG9mIGNhcnJpZXI/ICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFhEU0NSX1NUQVRVU19SVFJZIDB4MDQwMAkvKiByZXRyeSBlcnJvcj8gICAgICAgICAgICAgICAgICAgICAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgewkJLyogTEFOQ0UgUnggZGVzY3JpcHRvciAgICAgICAgICAgICAgICovCisJdTE2IExvd0FkZHI7CQkvKiBiaXQgMC4uMTUgb2YgYWRkcmVzcyAgICAgICAgICAgICAgKi8KKwl1MTYgRmxhZ3M7CQkvKiBiaXQgMTYuLjIzIG9mIGFkZHJlc3MgKyBGbGFncyAgICAgKi8KKwl1MTYgTWF4TGVuOwkJLyogMnMgY29tcGxlbWVudCBvZiBidWZmZXIgbGVuZ3RoICAgICovCisJdTE2IExlbjsJCS8qIHBhY2tldCBsZW5ndGggICAgICAgICAgICAgICAgICAgICAqLworfSBMQU5DRV9SeERlc2NyOworCisjZGVmaW5lIFJYRFNDUl9GTEFHU19PV04gICAweDgwMDAJLyogTEFOQ0Ugb3ducyBkZXNjcmlwdG9yICAgICAgICAgICAgICovCisjZGVmaW5lIFJYRFNDUl9GTEFHU19FUlIgICAweDQwMDAJLyogc3VtbWFyeSBlcnJvciBmbGFnICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJYRFNDUl9GTEFHU19GUkFNICAweDIwMDAJLyogZnJhbWluZyBlcnJvciBmbGFnICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJYRFNDUl9GTEFHU19PRkxPICAweDEwMDAJLyogRklGTyBvdmVyZmxvdz8gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJYRFNDUl9GTEFHU19DUkMgICAweDA4MDAJLyogQ1JDIGVycm9yPyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJYRFNDUl9GTEFHU19CVUZGICAweDA0MDAJLyogYnVmZmVyIGVycm9yPyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJYRFNDUl9GTEFHU19TVFAgICAweDAyMDAJLyogZmlyc3QgcGFja2V0IGluIGNoYWluPyAgICAgICAgICAgICovCisjZGVmaW5lIFJYRENTUl9GTEFHU19FTlAgICAweDAxMDAJLyogbGFzdCBwYWNrZXQgaW4gY2hhaW4/ICAgICAgICAgICAgICovCisKKy8qIFJBTSBsYXlvdXQgKi8KKworI2RlZmluZSBUWENPVU5UICAgICAgICAgICAgNAkvKiBsZW5ndGggb2YgVFggZGVzY3JpcHRvciBxdWV1ZSAgICAgKi8KKyNkZWZpbmUgTFRYQ09VTlQgICAgICAgICAgIDIJLyogbG9nMiBvZiBpdCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJYQ09VTlQgICAgICAgICAgICA0CS8qIGxlbmd0aCBvZiBSWCBkZXNjcmlwdG9yIHF1ZXVlICAgICAqLworI2RlZmluZSBMUlhDT1VOVCAgICAgICAgICAgMgkvKiBsb2cyIG9mIGl0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBSQU1fSU5JVEJBU0UgICAgICAgMAkvKiBMQU5DRSBpbml0IGJsb2NrICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkFNX1RYQkFTRSAgICAgICAgIDI0CS8qIFN0YXJ0IG9mIFRYIGRlc2NyaXB0b3IgcXVldWUgICAgICAqLworI2RlZmluZSBSQU1fUlhCQVNFICAgICAgICAgXAorKFJBTV9UWEJBU0UgKyAoVFhDT1VOVCAqIDgpKQkvKiBTdGFydCBvZiBSWCBkZXNjcmlwdG9yIHF1ZXVlICAgICAgKi8KKyNkZWZpbmUgUkFNX0RBVEFCQVNFICAgICAgIFwKKyhSQU1fUlhCQVNFICsgKFJYQ09VTlQgKiA4KSkJLyogU3RhcnQgb2YgZGF0YSBhcmVhIGZvciBmcmFtZXMgICAgICovCisjZGVmaW5lIFJBTV9CVUZTSVpFICAgICAgICAxNTgwCS8qIG1heC4gZnJhbWUgc2l6ZSAtIHNob3VsZCBuZXZlciBiZQorCQkJCSAgIHJlYWNoZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZW5kaWYJCQkJLyogX1NLX01DQV9EUklWRVJfICovCisKKyNlbmRpZgkvKiBfU0tfTUNBX0lOQ0xVREVfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvc2tmcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2ZjY2ZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgU3lzS29ubmVjdCBGRERJIFBDSSBhZGFwdGVyIGRyaXZlcgorIworCitvYmotJChDT05GSUdfU0tGUCkgKz0gc2tmcC5vCisKK3NrZnAtb2JqcyA6PSAgc2tmZGRpLm8gICAgaHdtdG0ubyAgICBmcGx1c3RtLm8gIHNtdC5vICAgICAgY2ZtLm8gICAgIFwKKyAgICAgICAgICAgICAgZWNtLm8gICAgICAgcGNtcGxjLm8gICBwbWYubyAgICAgIHF1ZXVlLm8gICAgcm10Lm8gICAgIFwKKwkgICAgICBzbXRkZWYubyAgICBzbXRpbml0Lm8gIHNtdHRpbWVyLm8gc3JmLm8gICAgICBsbmtzdGF0Lm8gXAorICAgICAgICAgICAgICBzbXRwYXJzZS5vICBod3QubyAgICAgIGRydmZiaS5vICAgZXNzLm8KKworIyBOT1RFOgorIyAgIENvbXBpbGluZyB0aGlzIGRyaXZlciBwcm9kdWNlcyBzb21lIHdhcm5pbmdzIChhbmQgc29tZSBtb3JlIGFyZSAKKyMgICBzd2l0Y2hlZCBvZmYgYmVsb3cpLCBidXQgSSBkaWQgbm90IGZpeCB0aGlzLCBiZWNhdXNlIHRoZSBIYXJkd2FyZQorIyAgIE1vZHVsZSBzb3VyY2UgKHNlZSBza2ZkZGkuYyBmb3IgZGV0YWlscykgaXMgdXNlZCBmb3IgZGlmZmVyZW50CisjICAgZHJpdmVycywgYW5kIGZpeGluZyBpdCBmb3IgTGludXggbWlnaHQgYnJpbmcgcHJvYmxlbXMgb24gb3RoZXIKKyMgICBwcm9qZWN0cy4gVG8ga2VlcCB0aGUgc291cmNlIGNvbW1vbiBmb3IgYWxsIHRob3NlIGRyaXZlcnMgKGFuZAorIyAgIHRodXMgc2ltcGxpZnkgZml4ZXMgdG8gaXQpLCBwbGVhc2UgZG8gbm90IGNsZWFuIGl0IHVwIQorCitFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL25ldC9za2ZwIC1EUENJIC1ETUVNX01BUFBFRF9JTyAtV25vLXN0cmljdC1wcm90b3R5cGVzIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9jYW4uYyBiL2RyaXZlcnMvbmV0L3NrZnAvY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0OWFiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvY2FuLmMKQEAgLTAsMCArMSw4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVNlZSB0aGUgZmlsZSAic2tmZGRpLmMiIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciB4SURfc2Njc1tdID0gIkAoIyljYW4uYwkxLjUgOTcvMDQvMDcgKEMpIFNLICIgOworI2VuZGlmCisKKy8qCisgKiBjYW5vbmljYWwgYml0IG9yZGVyCisgKi8KK2NvbnN0IHVfY2hhciBjYW5vbmljYWxbMjU2XSA9IHsKKwkweDAwLDB4ODAsMHg0MCwweGMwLDB4MjAsMHhhMCwweDYwLDB4ZTAsCisJMHgxMCwweDkwLDB4NTAsMHhkMCwweDMwLDB4YjAsMHg3MCwweGYwLAorCTB4MDgsMHg4OCwweDQ4LDB4YzgsMHgyOCwweGE4LDB4NjgsMHhlOCwKKwkweDE4LDB4OTgsMHg1OCwweGQ4LDB4MzgsMHhiOCwweDc4LDB4ZjgsCisJMHgwNCwweDg0LDB4NDQsMHhjNCwweDI0LDB4YTQsMHg2NCwweGU0LAorCTB4MTQsMHg5NCwweDU0LDB4ZDQsMHgzNCwweGI0LDB4NzQsMHhmNCwKKwkweDBjLDB4OGMsMHg0YywweGNjLDB4MmMsMHhhYywweDZjLDB4ZWMsCisJMHgxYywweDljLDB4NWMsMHhkYywweDNjLDB4YmMsMHg3YywweGZjLAorCTB4MDIsMHg4MiwweDQyLDB4YzIsMHgyMiwweGEyLDB4NjIsMHhlMiwKKwkweDEyLDB4OTIsMHg1MiwweGQyLDB4MzIsMHhiMiwweDcyLDB4ZjIsCisJMHgwYSwweDhhLDB4NGEsMHhjYSwweDJhLDB4YWEsMHg2YSwweGVhLAorCTB4MWEsMHg5YSwweDVhLDB4ZGEsMHgzYSwweGJhLDB4N2EsMHhmYSwKKwkweDA2LDB4ODYsMHg0NiwweGM2LDB4MjYsMHhhNiwweDY2LDB4ZTYsCisJMHgxNiwweDk2LDB4NTYsMHhkNiwweDM2LDB4YjYsMHg3NiwweGY2LAorCTB4MGUsMHg4ZSwweDRlLDB4Y2UsMHgyZSwweGFlLDB4NmUsMHhlZSwKKwkweDFlLDB4OWUsMHg1ZSwweGRlLDB4M2UsMHhiZSwweDdlLDB4ZmUsCisJMHgwMSwweDgxLDB4NDEsMHhjMSwweDIxLDB4YTEsMHg2MSwweGUxLAorCTB4MTEsMHg5MSwweDUxLDB4ZDEsMHgzMSwweGIxLDB4NzEsMHhmMSwKKwkweDA5LDB4ODksMHg0OSwweGM5LDB4MjksMHhhOSwweDY5LDB4ZTksCisJMHgxOSwweDk5LDB4NTksMHhkOSwweDM5LDB4YjksMHg3OSwweGY5LAorCTB4MDUsMHg4NSwweDQ1LDB4YzUsMHgyNSwweGE1LDB4NjUsMHhlNSwKKwkweDE1LDB4OTUsMHg1NSwweGQ1LDB4MzUsMHhiNSwweDc1LDB4ZjUsCisJMHgwZCwweDhkLDB4NGQsMHhjZCwweDJkLDB4YWQsMHg2ZCwweGVkLAorCTB4MWQsMHg5ZCwweDVkLDB4ZGQsMHgzZCwweGJkLDB4N2QsMHhmZCwKKwkweDAzLDB4ODMsMHg0MywweGMzLDB4MjMsMHhhMywweDYzLDB4ZTMsCisJMHgxMywweDkzLDB4NTMsMHhkMywweDMzLDB4YjMsMHg3MywweGYzLAorCTB4MGIsMHg4YiwweDRiLDB4Y2IsMHgyYiwweGFiLDB4NmIsMHhlYiwKKwkweDFiLDB4OWIsMHg1YiwweGRiLDB4M2IsMHhiYiwweDdiLDB4ZmIsCisJMHgwNywweDg3LDB4NDcsMHhjNywweDI3LDB4YTcsMHg2NywweGU3LAorCTB4MTcsMHg5NywweDU3LDB4ZDcsMHgzNywweGI3LDB4NzcsMHhmNywKKwkweDBmLDB4OGYsMHg0ZiwweGNmLDB4MmYsMHhhZiwweDZmLDB4ZWYsCisJMHgxZiwweDlmLDB4NWYsMHhkZiwweDNmLDB4YmYsMHg3ZiwweGZmCit9IDsKKworI2lmZGVmCU1BS0VfVEFCTEUKK2ludCBieXRlX3JldmVyc2UoeCkKK2ludCB4IDsKK3sKKwlpbnQgICAgIHkgPSAwIDsKKworCWlmICh4ICYgMHgwMSkKKwkJeSB8PSAweDgwIDsKKwlpZiAoeCAmIDB4MDIpCisJCXkgfD0gMHg0MCA7CisJaWYgKHggJiAweDA0KQorCQl5IHw9IDB4MjAgOworCWlmICh4ICYgMHgwOCkKKwkJeSB8PSAweDEwIDsKKwlpZiAoeCAmIDB4MTApCisJCXkgfD0gMHgwOCA7CisJaWYgKHggJiAweDIwKQorCQl5IHw9IDB4MDQgOworCWlmICh4ICYgMHg0MCkKKwkJeSB8PSAweDAyIDsKKwlpZiAoeCAmIDB4ODApCisJCXkgfD0gMHgwMSA7CisJcmV0dXJuKHkpIDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9jZm0uYyBiL2RyaXZlcnMvbmV0L3NrZnAvY2ZtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4YWFhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvY2ZtLmMKQEAgLTAsMCArMSw2MjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglTZWUgdGhlIGZpbGUgInNrZmRkaS5jIiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisJU01UIENGTQorCUNvbmZpZ3VyYXRpb24gTWFuYWdlbWVudAorCURBUyB3aXRoIHNpbmdsZSBNQUMKKyovCisKKy8qCisgKglIYXJkd2FyZSBpbmRlcGVuZGVudCBzdGF0ZSBtYWNoaW5lIGltcGxlbWFudGF0aW9uCisgKglUaGUgZm9sbG93aW5nIGV4dGVybmFsIFNNVCBmdW5jdGlvbnMgYXJlIHJlZmVyZW5jZWQgOgorICoKKyAqCQlxdWV1ZV9ldmVudCgpCisgKgorICoJVGhlIGZvbGxvd2luZyBleHRlcm5hbCBIVyBkZXBlbmRlbnQgZnVuY3Rpb25zIGFyZSByZWZlcmVuY2VkIDoKKyAqCQljb25maWdfbXV4KCkKKyAqCisgKglUaGUgZm9sbG93aW5nIEhXIGRlcGVuZGVudCBldmVudHMgYXJlIHJlcXVpcmVkIDoKKyAqCQlOT05FIAorICovCisKKyNpbmNsdWRlICJoL3R5cGVzLmgiCisjaW5jbHVkZSAiaC9mZGRpLmgiCisjaW5jbHVkZSAiaC9zbWMuaCIKKworI2RlZmluZSBLRVJORUwKKyNpbmNsdWRlICJoL3NtdHN0YXRlLmgiCisKKyNpZm5kZWYJbGludAorc3RhdGljIGNvbnN0IGNoYXIgSURfc2Njc1tdID0gIkAoIyljZm0uYwkyLjE4IDk4LzEwLzA2IChDKSBTSyAiIDsKKyNlbmRpZgorCisvKgorICogRlNNIE1hY3JvcworICovCisjZGVmaW5lIEFGTEFHCTB4MTAKKyNkZWZpbmUgR09fU1RBVEUoeCkJKHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSA9ICh4KXxBRkxBRykKKyNkZWZpbmUgQUNUSU9OU19ET05FKCkJKHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSAmPSB+QUZMQUcpCisjZGVmaW5lIEFDVElPTlMoeCkJKHh8QUZMQUcpCisKKyNpZmRlZglERUJVRworLyoKKyAqIHN5bWJvbGljIHN0YXRlIG5hbWVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2ZtX3N0YXRlc1tdID0geworCSJTQzBfSVNPTEFURUQiLCJDRjEiLCJDRjIiLCJDRjMiLCJDRjQiLAorCSJTQzFfV1JBUF9BIiwiU0MyX1dSQVBfQiIsIlNDNV9UUkhVX0IiLCJTQzdfV1JBUF9TIiwKKwkiU0M5X0NfV1JBUF9BIiwiU0MxMF9DX1dSQVBfQiIsIlNDMTFfQ19XUkFQX1MiLCJTQzRfVEhSVV9BIgorfSA7CisKKy8qCisgKiBzeW1ib2xpYyBldmVudCBuYW1lcworICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNmbV9ldmVudHNbXSA9IHsKKwkiTk9ORSIsIkNGX0xPT1BfQSIsIkNGX0xPT1BfQiIsIkNGX0pPSU5fQSIsIkNGX0pPSU5fQiIKK30gOworI2VuZGlmCisKKy8qCisgKiBtYXAgZnJvbSBzdGF0ZSB0byBkb3duc3RyZWFtIHBvcnQgdHlwZQorICovCitzdGF0aWMgY29uc3QgdV9jaGFyIGNmX3RvX3B0eXBlW10gPSB7CisJVE5PTkUsVE5PTkUsVE5PTkUsVE5PTkUsVE5PTkUsCisJVE5PTkUsVEIsVEIsVFMsCisJVEEsVEIsVFMsVEIKK30gOworCisvKgorICogQ0VNIHBvcnQgc3RhdGVzCisgKi8KKyNkZWZpbmUJQ0VNX1BTVF9ET1dOCTAKKyNkZWZpbmUJQ0VNX1BTVF9VUAkxCisjZGVmaW5lCUNFTV9QU1RfSE9MRAkyCisvKiBkZWZpbmUgcG9ydHN0YXRlIGFycmF5IG9ubHkgZm9yIEEgYW5kIEIgcG9ydCAqLworLyogRG8gdGhpcyB3aXRoaW4gdGhlIHNtYyBzdHJ1Y3R1cmUgKHVzZSBpbiBtdWx0aXBsZSBjYXJkcykgKi8KKworLyoKKyAqIGFsbCBHbG9iYWxzICBhcmUgZGVmaW5lZCBpbiBzbWMuaAorICogc3RydWN0IHNfY2ZtCisgKi8KKworLyoKKyAqIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucworICovCitzdGF0aWMgdm9pZCBjZm1fZnNtKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgY21kKTsKKworLyoKKwlpbml0IENGTSBzdGF0ZSBtYWNoaW5lCisJY2xlYXIgYWxsIENGTSB2YXJzIGFuZCBmbGFncworKi8KK3ZvaWQgY2ZtX2luaXQoc3RydWN0IHNfc21jICpzbWMpCit7CisJc21jLT5taWIuZmRkaVNNVENGX1N0YXRlID0gQUNUSU9OUyhTQzBfSVNPTEFURUQpIDsKKwlzbWMtPnIucm1fam9pbiA9IDAgOworCXNtYy0+ci5ybV9sb29wID0gMCA7CisJc21jLT55W1BBXS5zY3J1YiA9IDAgOworCXNtYy0+eVtQQl0uc2NydWIgPSAwIDsKKwlzbWMtPnlbUEFdLmNlbV9wc3QgPSBDRU1fUFNUX0RPV04gOworCXNtYy0+eVtQQl0uY2VtX3BzdCA9IENFTV9QU1RfRE9XTiA7Cit9CisKKy8qIFNvbWUgdGVybXMgY29uZGl0aW9ucyB1c2VkIGJ5IHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgKi8KKyNkZWZpbmUgVEhSVV9FTkFCTEVEKHNtYykJKHNtYy0+eVtQQV0ucGNfbW9kZSAhPSBQTV9UUkVFICYmIFwKKwkJCQkgc21jLT55W1BCXS5wY19tb2RlICE9IFBNX1RSRUUpCisvKiBTZWxlY3Rpb24gY3JpdGVyaWEgZm9yIHRoZSBwb3J0cyAqLworc3RhdGljIHZvaWQgc2VsZWN0aW9uX2NyaXRlcmlhIChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNfcGh5ICpwaHkpCit7CisKKwlzd2l0Y2ggKHBoeS0+bWliLT5mZGRpUE9SVE15X1R5cGUpIHsKKwljYXNlIFRBOgorCQlpZiAoICFUSFJVX0VOQUJMRUQoc21jKSAmJiBzbWMtPnlbUEJdLmNmX2pvaW4gKSB7CisJCQlwaHktPndjX2ZsYWcgPSBUUlVFIDsKKwkJfSBlbHNlIHsKKwkJCXBoeS0+d2NfZmxhZyA9IEZBTFNFIDsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgVEI6CisJCS8qIHRha2UgcHJlY2VkZW5jZSBvdmVyIFBBICovCisJCXBoeS0+d2NfZmxhZyA9IEZBTFNFIDsKKwkJYnJlYWs7CisJY2FzZSBUUzoKKwkJcGh5LT53Y19mbGFnID0gRkFMU0UgOworCQlicmVhazsKKwljYXNlIFRNOgorCQlwaHktPndjX2ZsYWcgPSBGQUxTRSA7CisJCWJyZWFrOworCX0KKworfQorCit2b2lkIGFsbF9zZWxlY3Rpb25fY3JpdGVyaWEoc3RydWN0IHNfc21jICpzbWMpCit7CisJc3RydWN0IHNfcGh5CSpwaHkgOworCWludAkJcCA7CisKKwlmb3IgKCBwID0gMCxwaHkgPSBzbWMtPnkgOyBwIDwgTlVNUEhZUzsgcCsrLCBwaHkrKyApIHsKKwkJLyogRG8gdGhlIHNlbGVjdGlvbiBjcml0ZXJpYSAqLworCQlzZWxlY3Rpb25fY3JpdGVyaWEgKHNtYyxwaHkpOworCX0KK30KKworc3RhdGljIHZvaWQgY2VtX3ByaXZfc3RhdGUoc3RydWN0IHNfc21jICpzbWMsIGludCBldmVudCkKKy8qIFN0YXRlIG1hY2hpbmUgZm9yIHByaXZhdGUgUE9SVCBzdGF0ZXM6IHVzZWQgdG8gb3B0aW1pemUgZHVhbCBob21pbmcgKi8KK3sKKwlpbnQJbnA7CS8qIE51bWJlciBvZiB0aGUgcG9ydCAqLworCWludAlpOworCisJLyogRG8gdGhpcyBvbmx5IGluIGEgREFTICovCisJaWYgKHNtYy0+cy5zYXMgIT0gU01UX0RBUyApCisJCXJldHVybiA7CisKKwlucCA9IGV2ZW50IC0gQ0ZfSk9JTjsKKworCWlmIChucCAhPSBQQSAmJiBucCAhPSBQQikgeworCQlyZXR1cm4gOworCX0KKwkvKiBDaGFuZ2UgdGhlIHBvcnQgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBldmVudCAocG9ydG51bWJlcikgKi8KKwlpZiAoc21jLT55W25wXS5jZl9qb2luKSB7CisJCXNtYy0+eVtucF0uY2VtX3BzdCA9IENFTV9QU1RfVVAgOworCX0gZWxzZSBpZiAoIXNtYy0+eVtucF0ud2NfZmxhZykgeworCQkvKiBzZXQgdGhlIHBvcnQgdG8gZG9uZSBvbmx5IGlmIGl0IGlzIG5vdCB3aXRoaGVsZCAqLworCQlzbWMtPnlbbnBdLmNlbV9wc3QgPSBDRU1fUFNUX0RPV04gOworCX0KKworCS8qIERvbid0IHNldCBhbiBob2xkIHBvcnQgdG8gZG93biAqLworCisJLyogQ2hlY2sgYWxsIHBvcnRzIG9mIHJlc3RhcnQgY29uZGl0aW9ucyAqLworCWZvciAoaSA9IDAgOyBpIDwgMiA7IGkgKysgKSB7CisJCS8qIENoZWNrIGFsbCBwb3J0IGZvciBQT1JUIGlzIG9uIGhvbGQgYW5kIG5vIHdpdGhob2xkIGlzIGRvbmUgKi8KKwkJaWYgKCBzbWMtPnlbaV0uY2VtX3BzdCA9PSBDRU1fUFNUX0hPTEQgJiYgIXNtYy0+eVtpXS53Y19mbGFnICkgeworCQkJc21jLT55W2ldLmNlbV9wc3QgPSBDRU1fUFNUX0RPV047CisJCQlxdWV1ZV9ldmVudChzbWMsKGludCkoRVZFTlRfUENNK2kpLFBDX1NUQVJUKSA7CisJCX0KKwkJaWYgKCBzbWMtPnlbaV0uY2VtX3BzdCA9PSBDRU1fUFNUX1VQICYmIHNtYy0+eVtpXS53Y19mbGFnICkgeworCQkJc21jLT55W2ldLmNlbV9wc3QgPSBDRU1fUFNUX0hPTEQ7CisJCQlxdWV1ZV9ldmVudChzbWMsKGludCkoRVZFTlRfUENNK2kpLFBDX1NUQVJUKSA7CisJCX0KKwkJaWYgKCBzbWMtPnlbaV0uY2VtX3BzdCA9PSBDRU1fUFNUX0RPV04gJiYgc21jLT55W2ldLndjX2ZsYWcgKSB7CisJCQkvKgorCQkJICogVGhlIHBvcnQgbXVzdCBiZSByZXN0YXJ0ZWQgd2hlbiB0aGUgd2NfZmxhZworCQkJICogd2lsbCBiZSByZXNldC4gU28gc2V0IHRoZSBwb3J0IG9uIGhvbGQuCisJCQkgKi8KKwkJCXNtYy0+eVtpXS5jZW1fcHN0ID0gQ0VNX1BTVF9IT0xEOworCQl9CisJfQorCXJldHVybiA7Cit9CisKKy8qCisJQ0ZNIHN0YXRlIG1hY2hpbmUKKwljYWxsZWQgYnkgZGlzcGF0Y2hlcgorCisJZG8KKwkJZGlzcGxheSBzdGF0ZSBjaGFuZ2UKKwkJcHJvY2VzcyBldmVudAorCXVudGlsIFNNIGlzIHN0YWJsZQorKi8KK3ZvaWQgY2ZtKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZXZlbnQpCit7CisJaW50CXN0YXRlIDsJCS8qIHJlbWVtYmVyIGxhc3Qgc3RhdGUgKi8KKwlpbnQJY29uZCA7CisJaW50CW9sZHN0YXRlIDsKKworCS8qIFdlIHdpbGwgZG8gdGhlIGZvbGxvd2luZzogKi8KKwkvKiAgLSBjb21wdXRlIHRoZSB2YXJpYWJsZSBXQ19GbGFnIGZvciBldmVyeSBwb3J0IChUaGlzIGlzIHdoZXJlICovCisJLyogICAgd2UgY2FuIGV4dGVuZCB0aGUgcmVxdWVzdGVkIHBhdGggY2hlY2tpbmcgISEpICovCisJLyogIC0gZG8gdGhlIG9sZCAoU01UIDYuMiBsaWtlKSBzdGF0ZSBtYWNoaW5lICovCisJLyogIC0gZG8gdGhlIHJlc3VsdGluZyBzdGF0aW9uIHN0YXRlcyAqLworCisJYWxsX3NlbGVjdGlvbl9jcml0ZXJpYSAoc21jKTsKKworCS8qIFdlIHdpbGwgY2hlY2sgbm93IHdoZXRoZXIgYSBzdGF0ZSB0cmFuc2l0aW9uIGlzIGFsbG93ZWQgb3Igbm90ICovCisJLyogIC0gY2hhbmdlIHRoZSBwb3J0c3RhdGVzICovCisJY2VtX3ByaXZfc3RhdGUgKHNtYywgZXZlbnQpOworCisJb2xkc3RhdGUgPSBzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGUgOworCWRvIHsKKwkJREJfQ0ZNKCJDRk0gOiBzdGF0ZSAlcyVzIiwKKwkJCShzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGUgJiBBRkxBRykgPyAiQUNUSU9OUyAiIDogIiIsCisJCQljZm1fc3RhdGVzW3NtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSAmIH5BRkxBR10pIDsKKwkJREJfQ0ZNKCIgZXZlbnQgJXNcbiIsY2ZtX2V2ZW50c1tldmVudF0sMCkgOworCQlzdGF0ZSA9IHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSA7CisJCWNmbV9mc20oc21jLGV2ZW50KSA7CisJCWV2ZW50ID0gMCA7CisJfSB3aGlsZSAoc3RhdGUgIT0gc21jLT5taWIuZmRkaVNNVENGX1N0YXRlKSA7CisKKyNpZm5kZWYJU0xJTV9TTVQKKwkvKgorCSAqIGNoZWNrIHBlZXIgd3JhcCBjb25kaXRpb24KKwkgKi8KKwljb25kID0gRkFMU0UgOworCWlmICgJKHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSA9PSBTQzlfQ19XUkFQX0EgJiYKKwkJc21jLT55W1BBXS5wY19tb2RlID09IFBNX1BFRVIpIAl8fAorCQkoc21jLT5taWIuZmRkaVNNVENGX1N0YXRlID09IFNDMTBfQ19XUkFQX0IgJiYKKwkJc21jLT55W1BCXS5wY19tb2RlID09IFBNX1BFRVIpIAl8fAorCQkoc21jLT5taWIuZmRkaVNNVENGX1N0YXRlID09IFNDMTFfQ19XUkFQX1MgJiYKKwkJc21jLT55W1BTXS5wY19tb2RlID09IFBNX1BFRVIgJiYKKwkJc21jLT55W1BTXS5taWItPmZkZGlQT1JUTmVpZ2hib3JUeXBlICE9IFRTICkgKSB7CisJCQljb25kID0gVFJVRSA7CisJfQorCWlmIChjb25kICE9IHNtYy0+bWliLmZkZGlTTVRQZWVyV3JhcEZsYWcpCisJCXNtdF9zcmZfZXZlbnQoc21jLFNNVF9DT05EX1NNVF9QRUVSX1dSQVAsMCxjb25kKSA7CisKKyNpZgkwCisJLyoKKwkgKiBEb24ndCBzZW5kIGV2ZXIgTUFDX1BBVEhfQ0hBTkdFIGV2ZW50cy4gT3VyIE1BQyBpcyBoYXJkLXdpcmVkCisJICogdG8gdGhlIHByaW1hcnkgcGF0aC4KKwkgKi8KKwkvKgorCSAqIHBhdGggY2hhbmdlCisJICovCisJaWYgKHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSAhPSBvbGRzdGF0ZSkgeworCQlzbXRfc3JmX2V2ZW50KHNtYyxTTVRfRVZFTlRfTUFDX1BBVEhfQ0hBTkdFLElOREVYX01BQywwKSA7CisJfQorI2VuZGlmCisjZW5kaWYJLyogbm8gU0xJTV9TTVQgKi8KKworCS8qCisJICogc2V0IE1BQyBwb3J0IHR5cGUKKwkgKi8KKwlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNEb3duc3RyZWFtUE9SVFR5cGUgPQorCQljZl90b19wdHlwZVtzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGVdIDsKKwljZm1fc3RhdGVfY2hhbmdlKHNtYywoaW50KXNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSkgOworfQorCisvKgorCXByb2Nlc3MgQ0ZNIGV2ZW50CisqLworLypBUkdTVVNFRDEqLworc3RhdGljIHZvaWQgY2ZtX2ZzbShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGNtZCkKK3sKKwlzd2l0Y2goc21jLT5taWIuZmRkaVNNVENGX1N0YXRlKSB7CisJY2FzZSBBQ1RJT05TKFNDMF9JU09MQVRFRCkgOgorCQlzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVEN1cnJlbnRQYXRoID0gTUlCX1BBVEhfSVNPTEFURUQgOworCQlzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVEN1cnJlbnRQYXRoID0gTUlCX1BBVEhfSVNPTEFURUQgOworCQlzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVE1BQ1BsYWNlbWVudCA9IDAgOworCQlzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVE1BQ1BsYWNlbWVudCA9IDAgOworCQlzbWMtPm1pYi5mZGRpU01UU3RhdGlvblN0YXR1cyA9IE1JQl9TTVRfU1RBU1RBX1NFUEEgOworCQljb25maWdfbXV4KHNtYyxNVVhfSVNPTEFURSkgOwkvKiBjb25maWd1cmUgUEhZIE11eCAqLworCQlzbWMtPnIucm1fbG9vcCA9IEZBTFNFIDsKKwkJc21jLT5yLnJtX2pvaW4gPSBGQUxTRSA7CisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9STVQsUk1fSk9JTikgOy8qIHNpZ25hbCBSTVQgKi8KKwkJLyogRG9uJ3QgZG8gdGhlIFdDLUZsYWcgY2hhbmdpbmcgaGVyZSAqLworCQlBQ1RJT05TX0RPTkUoKSA7CisJCURCX0NGTU4oMSwiQ0ZNIDogJXNcbiIsY2ZtX3N0YXRlc1tzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGVdLDApIDsKKwkJYnJlYWs7CisJY2FzZSBTQzBfSVNPTEFURUQgOgorCQkvKlNDMDcqLworCQkvKlNBUyBwb3J0IGNhbiBiZSBQQSBvciBQQiAhICovCisJCWlmIChzbWMtPnMuc2FzICYmIChzbWMtPnlbUEFdLmNmX2pvaW4gfHwgc21jLT55W1BBXS5jZl9sb29wIHx8CisJCQkJc21jLT55W1BCXS5jZl9qb2luIHx8IHNtYy0+eVtQQl0uY2ZfbG9vcCkpIHsKKwkJCUdPX1NUQVRFKFNDMTFfQ19XUkFQX1MpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKlNDMDEqLworCQlpZiAoKHNtYy0+eVtQQV0uY2VtX3BzdCA9PSBDRU1fUFNUX1VQICYmIHNtYy0+eVtQQV0uY2Zfam9pbiAmJgorCQkgICAgICFzbWMtPnlbUEFdLndjX2ZsYWcpIHx8IHNtYy0+eVtQQV0uY2ZfbG9vcCkgeworCQkJR09fU1RBVEUoU0M5X0NfV1JBUF9BKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypTQzAyKi8KKwkJaWYgKChzbWMtPnlbUEJdLmNlbV9wc3QgPT0gQ0VNX1BTVF9VUCAmJiBzbWMtPnlbUEJdLmNmX2pvaW4gJiYKKwkJICAgICAhc21jLT55W1BCXS53Y19mbGFnKSB8fCBzbWMtPnlbUEJdLmNmX2xvb3ApIHsKKwkJCUdPX1NUQVRFKFNDMTBfQ19XUkFQX0IpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSBBQ1RJT05TKFNDOV9DX1dSQVBfQSkgOgorCQlzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVEN1cnJlbnRQYXRoID0gTUlCX1BBVEhfQ09OQ0FURU5BVEVEIDsKKwkJc21jLT5taWIucFtQQl0uZmRkaVBPUlRDdXJyZW50UGF0aCA9IE1JQl9QQVRIX0lTT0xBVEVEIDsKKwkJc21jLT5taWIucFtQQV0uZmRkaVBPUlRNQUNQbGFjZW1lbnQgPSBJTkRFWF9NQUMgOworCQlzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVE1BQ1BsYWNlbWVudCA9IDAgOworCQlzbWMtPm1pYi5mZGRpU01UU3RhdGlvblN0YXR1cyA9IE1JQl9TTVRfU1RBU1RBX0NPTiA7CisJCWNvbmZpZ19tdXgoc21jLE1VWF9XUkFQQSkgOwkJLyogY29uZmlndXJlIFBIWSBtdXggKi8KKwkJaWYgKHNtYy0+eVtQQV0uY2ZfbG9vcCkgeworCQkJc21jLT5yLnJtX2pvaW4gPSBGQUxTRSA7CisJCQlzbWMtPnIucm1fbG9vcCA9IFRSVUUgOworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9MT09QKSA7Lyogc2lnbmFsIFJNVCAqLworCQl9CisJCWlmIChzbWMtPnlbUEFdLmNmX2pvaW4pIHsKKwkJCXNtYy0+ci5ybV9sb29wID0gRkFMU0UgOworCQkJc21jLT5yLnJtX2pvaW4gPSBUUlVFIDsKKwkJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9STVQsUk1fSk9JTikgOy8qIHNpZ25hbCBSTVQgKi8KKwkJfQorCQlBQ1RJT05TX0RPTkUoKSA7CisJCURCX0NGTU4oMSwiQ0ZNIDogJXNcbiIsY2ZtX3N0YXRlc1tzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGVdLDApIDsKKwkJYnJlYWsgOworCWNhc2UgU0M5X0NfV1JBUF9BIDoKKwkJLypTQzEwKi8KKwkJaWYgKCAoc21jLT55W1BBXS53Y19mbGFnIHx8ICFzbWMtPnlbUEFdLmNmX2pvaW4pICYmCisJCSAgICAgICFzbWMtPnlbUEFdLmNmX2xvb3AgKSB7CisJCQlHT19TVEFURShTQzBfSVNPTEFURUQpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKlNDMTIqLworCQllbHNlIGlmICggKHNtYy0+eVtQQl0uY2ZfbG9vcCAmJiBzbWMtPnlbUEFdLmNmX2pvaW4gJiYKKwkJCSAgIHNtYy0+eVtQQV0uY2VtX3BzdCA9PSBDRU1fUFNUX1VQKSB8fAorCQkJICAoKHNtYy0+eVtQQl0uY2ZfbG9vcCB8fAorCQkJICAgKHNtYy0+eVtQQl0uY2Zfam9pbiAmJgorCQkJICAgIHNtYy0+eVtQQl0uY2VtX3BzdCA9PSBDRU1fUFNUX1VQKSkgJiYKKwkJCSAgICAoc21jLT55W1BBXS5wY19tb2RlID09IFBNX1RSRUUgfHwKKwkJCSAgICAgc21jLT55W1BCXS5wY19tb2RlID09IFBNX1RSRUUpKSkgeworCQkJc21jLT55W1BBXS5zY3J1YiA9IFRSVUUgOworCQkJR09fU1RBVEUoU0MxMF9DX1dSQVBfQikgOworCQkJYnJlYWsgOworCQl9CisJCS8qU0MxNCovCisJCWVsc2UgaWYgKCFzbWMtPnMuYXR0YWNoX3MgJiYKKwkJCSAgc21jLT55W1BBXS5jZl9qb2luICYmCisJCQkgIHNtYy0+eVtQQV0uY2VtX3BzdCA9PSBDRU1fUFNUX1VQICYmCisJCQkgIHNtYy0+eVtQQV0ucGNfbW9kZSA9PSBQTV9QRUVSICYmIHNtYy0+eVtQQl0uY2Zfam9pbiAmJgorCQkJICBzbWMtPnlbUEJdLmNlbV9wc3QgPT0gQ0VNX1BTVF9VUCAmJgorCQkJICBzbWMtPnlbUEJdLnBjX21vZGUgPT0gUE1fUEVFUikgeworCQkJc21jLT55W1BBXS5zY3J1YiA9IFRSVUUgOworCQkJc21jLT55W1BCXS5zY3J1YiA9IFRSVUUgOworCQkJR09fU1RBVEUoU0M0X1RIUlVfQSkgOworCQkJYnJlYWsgOworCQl9CisJCS8qU0MxNSovCisJCWVsc2UgaWYgKCBzbWMtPnMuYXR0YWNoX3MgJiYKKwkJCSAgc21jLT55W1BBXS5jZl9qb2luICYmCisJCQkgIHNtYy0+eVtQQV0uY2VtX3BzdCA9PSBDRU1fUFNUX1VQICYmCisJCQkgIHNtYy0+eVtQQV0ucGNfbW9kZSA9PSBQTV9QRUVSICYmCisJCQkgIHNtYy0+eVtQQl0uY2Zfam9pbiAmJgorCQkJICBzbWMtPnlbUEJdLmNlbV9wc3QgPT0gQ0VNX1BTVF9VUCAmJgorCQkJICBzbWMtPnlbUEJdLnBjX21vZGUgPT0gUE1fUEVFUikgeworCQkJc21jLT55W1BBXS5zY3J1YiA9IFRSVUUgOworCQkJc21jLT55W1BCXS5zY3J1YiA9IFRSVUUgOworCQkJR09fU1RBVEUoU0M1X1RIUlVfQikgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoU0MxMF9DX1dSQVBfQikgOgorCQlzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVEN1cnJlbnRQYXRoID0gTUlCX1BBVEhfSVNPTEFURUQgOworCQlzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVEN1cnJlbnRQYXRoID0gTUlCX1BBVEhfQ09OQ0FURU5BVEVEIDsKKwkJc21jLT5taWIucFtQQV0uZmRkaVBPUlRNQUNQbGFjZW1lbnQgPSAwIDsKKwkJc21jLT5taWIucFtQQl0uZmRkaVBPUlRNQUNQbGFjZW1lbnQgPSBJTkRFWF9NQUMgOworCQlzbWMtPm1pYi5mZGRpU01UU3RhdGlvblN0YXR1cyA9IE1JQl9TTVRfU1RBU1RBX0NPTiA7CisJCWNvbmZpZ19tdXgoc21jLE1VWF9XUkFQQikgOwkJLyogY29uZmlndXJlIFBIWSBtdXggKi8KKwkJaWYgKHNtYy0+eVtQQl0uY2ZfbG9vcCkgeworCQkJc21jLT5yLnJtX2pvaW4gPSBGQUxTRSA7CisJCQlzbWMtPnIucm1fbG9vcCA9IFRSVUUgOworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9MT09QKSA7Lyogc2lnbmFsIFJNVCAqLworCQl9CisJCWlmIChzbWMtPnlbUEJdLmNmX2pvaW4pIHsKKwkJCXNtYy0+ci5ybV9sb29wID0gRkFMU0UgOworCQkJc21jLT5yLnJtX2pvaW4gPSBUUlVFIDsKKwkJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9STVQsUk1fSk9JTikgOy8qIHNpZ25hbCBSTVQgKi8KKwkJfQorCQlBQ1RJT05TX0RPTkUoKSA7CisJCURCX0NGTU4oMSwiQ0ZNIDogJXNcbiIsY2ZtX3N0YXRlc1tzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGVdLDApIDsKKwkJYnJlYWsgOworCWNhc2UgU0MxMF9DX1dSQVBfQiA6CisJCS8qU0MyMCovCisJCWlmICggIXNtYy0+eVtQQl0uY2Zfam9pbiAmJiAhc21jLT55W1BCXS5jZl9sb29wICkgeworCQkJR09fU1RBVEUoU0MwX0lTT0xBVEVEKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypTQzIxKi8KKwkJZWxzZSBpZiAoIHNtYy0+eVtQQV0uY2ZfbG9vcCAmJiBzbWMtPnlbUEFdLnBjX21vZGUgPT0gUE1fUEVFUiAmJgorCQkJICBzbWMtPnlbUEJdLmNmX2pvaW4gJiYgc21jLT55W1BCXS5wY19tb2RlID09IFBNX1BFRVIpIHsKKwkJCXNtYy0+eVtQQl0uc2NydWIgPSBUUlVFIDsKKwkJCUdPX1NUQVRFKFNDOV9DX1dSQVBfQSkgOworCQkJYnJlYWsgOworCQl9CisJCS8qU0MyNCovCisJCWVsc2UgaWYgKCFzbWMtPnMuYXR0YWNoX3MgJiYKKwkJCSBzbWMtPnlbUEFdLmNmX2pvaW4gJiYgc21jLT55W1BBXS5wY19tb2RlID09IFBNX1BFRVIgJiYKKwkJCSBzbWMtPnlbUEJdLmNmX2pvaW4gJiYgc21jLT55W1BCXS5wY19tb2RlID09IFBNX1BFRVIpIHsKKwkJCXNtYy0+eVtQQV0uc2NydWIgPSBUUlVFIDsKKwkJCXNtYy0+eVtQQl0uc2NydWIgPSBUUlVFIDsKKwkJCUdPX1NUQVRFKFNDNF9USFJVX0EpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKlNDMjUqLworCQllbHNlIGlmICggc21jLT5zLmF0dGFjaF9zICYmCisJCQkgc21jLT55W1BBXS5jZl9qb2luICYmIHNtYy0+eVtQQV0ucGNfbW9kZSA9PSBQTV9QRUVSICYmCisJCQkgc21jLT55W1BCXS5jZl9qb2luICYmIHNtYy0+eVtQQl0ucGNfbW9kZSA9PSBQTV9QRUVSKSB7CisJCQlzbWMtPnlbUEFdLnNjcnViID0gVFJVRSA7CisJCQlzbWMtPnlbUEJdLnNjcnViID0gVFJVRSA7CisJCQlHT19TVEFURShTQzVfVEhSVV9CKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgQUNUSU9OUyhTQzRfVEhSVV9BKSA6CisJCXNtYy0+bWliLnBbUEFdLmZkZGlQT1JUQ3VycmVudFBhdGggPSBNSUJfUEFUSF9USFJVIDsKKwkJc21jLT5taWIucFtQQl0uZmRkaVBPUlRDdXJyZW50UGF0aCA9IE1JQl9QQVRIX1RIUlUgOworCQlzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVE1BQ1BsYWNlbWVudCA9IDAgOworCQlzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVE1BQ1BsYWNlbWVudCA9IElOREVYX01BQyA7CisJCXNtYy0+bWliLmZkZGlTTVRTdGF0aW9uU3RhdHVzID0gTUlCX1NNVF9TVEFTVEFfVEhSVSA7CisJCWNvbmZpZ19tdXgoc21jLE1VWF9USFJVQSkgOwkJLyogY29uZmlndXJlIFBIWSBtdXggKi8KKwkJc21jLT5yLnJtX2xvb3AgPSBGQUxTRSA7CisJCXNtYy0+ci5ybV9qb2luID0gVFJVRSA7CisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9STVQsUk1fSk9JTikgOy8qIHNpZ25hbCBSTVQgKi8KKwkJQUNUSU9OU19ET05FKCkgOworCQlEQl9DRk1OKDEsIkNGTSA6ICVzXG4iLGNmbV9zdGF0ZXNbc21jLT5taWIuZmRkaVNNVENGX1N0YXRlXSwwKSA7CisJCWJyZWFrIDsKKwljYXNlIFNDNF9USFJVX0EgOgorCQkvKlNDNDEqLworCQlpZiAoc21jLT55W1BCXS53Y19mbGFnIHx8ICFzbWMtPnlbUEJdLmNmX2pvaW4pIHsKKwkJCXNtYy0+eVtQQV0uc2NydWIgPSBUUlVFIDsKKwkJCUdPX1NUQVRFKFNDOV9DX1dSQVBfQSkgOworCQkJYnJlYWsgOworCQl9CisJCS8qU0M0MiovCisJCWVsc2UgaWYgKCFzbWMtPnlbUEFdLmNmX2pvaW4gfHwgc21jLT55W1BBXS53Y19mbGFnKSB7CisJCQlzbWMtPnlbUEJdLnNjcnViID0gVFJVRSA7CisJCQlHT19TVEFURShTQzEwX0NfV1JBUF9CKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypTQzQ1Ki8KKwkJZWxzZSBpZiAoc21jLT5zLmF0dGFjaF9zKSB7CisJCQlzbWMtPnlbUEJdLnNjcnViID0gVFJVRSA7CisJCQlHT19TVEFURShTQzVfVEhSVV9CKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgQUNUSU9OUyhTQzVfVEhSVV9CKSA6CisJCXNtYy0+bWliLnBbUEFdLmZkZGlQT1JUQ3VycmVudFBhdGggPSBNSUJfUEFUSF9USFJVIDsKKwkJc21jLT5taWIucFtQQl0uZmRkaVBPUlRDdXJyZW50UGF0aCA9IE1JQl9QQVRIX1RIUlUgOworCQlzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVE1BQ1BsYWNlbWVudCA9IElOREVYX01BQyA7CisJCXNtYy0+bWliLnBbUEJdLmZkZGlQT1JUTUFDUGxhY2VtZW50ID0gMCA7CisJCXNtYy0+bWliLmZkZGlTTVRTdGF0aW9uU3RhdHVzID0gTUlCX1NNVF9TVEFTVEFfVEhSVSA7CisJCWNvbmZpZ19tdXgoc21jLE1VWF9USFJVQikgOwkJLyogY29uZmlndXJlIFBIWSBtdXggKi8KKwkJc21jLT5yLnJtX2xvb3AgPSBGQUxTRSA7CisJCXNtYy0+ci5ybV9qb2luID0gVFJVRSA7CisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9STVQsUk1fSk9JTikgOy8qIHNpZ25hbCBSTVQgKi8KKwkJQUNUSU9OU19ET05FKCkgOworCQlEQl9DRk1OKDEsIkNGTSA6ICVzXG4iLGNmbV9zdGF0ZXNbc21jLT5taWIuZmRkaVNNVENGX1N0YXRlXSwwKSA7CisJCWJyZWFrIDsKKwljYXNlIFNDNV9USFJVX0IgOgorCQkvKlNDNTEqLworCQlpZiAoIXNtYy0+eVtQQl0uY2Zfam9pbiB8fCBzbWMtPnlbUEJdLndjX2ZsYWcpIHsKKwkJCXNtYy0+eVtQQV0uc2NydWIgPSBUUlVFIDsKKwkJCUdPX1NUQVRFKFNDOV9DX1dSQVBfQSkgOworCQkJYnJlYWsgOworCQl9CisJCS8qU0M1MiovCisJCWVsc2UgaWYgKCFzbWMtPnlbUEFdLmNmX2pvaW4gfHwgc21jLT55W1BBXS53Y19mbGFnKSB7CisJCQlzbWMtPnlbUEJdLnNjcnViID0gVFJVRSA7CisJCQlHT19TVEFURShTQzEwX0NfV1JBUF9CKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypTQzU0Ki8KKwkJZWxzZSBpZiAoIXNtYy0+cy5hdHRhY2hfcykgeworCQkJc21jLT55W1BBXS5zY3J1YiA9IFRSVUUgOworCQkJR09fU1RBVEUoU0M0X1RIUlVfQSkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoU0MxMV9DX1dSQVBfUykgOgorCQlzbWMtPm1pYi5wW1BTXS5mZGRpUE9SVEN1cnJlbnRQYXRoID0gTUlCX1BBVEhfQ09OQ0FURU5BVEVEIDsKKwkJc21jLT5taWIucFtQU10uZmRkaVBPUlRNQUNQbGFjZW1lbnQgPSBJTkRFWF9NQUMgOworCQlzbWMtPm1pYi5mZGRpU01UU3RhdGlvblN0YXR1cyA9IE1JQl9TTVRfU1RBU1RBX0NPTiA7CisJCWNvbmZpZ19tdXgoc21jLE1VWF9XUkFQUykgOwkJLyogY29uZmlndXJlIFBIWSBtdXggKi8KKwkJaWYgKHNtYy0+eVtQQV0uY2ZfbG9vcCB8fCBzbWMtPnlbUEJdLmNmX2xvb3ApIHsKKwkJCXNtYy0+ci5ybV9qb2luID0gRkFMU0UgOworCQkJc21jLT5yLnJtX2xvb3AgPSBUUlVFIDsKKwkJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9STVQsUk1fTE9PUCkgOy8qIHNpZ25hbCBSTVQgKi8KKwkJfQorCQlpZiAoc21jLT55W1BBXS5jZl9qb2luIHx8IHNtYy0+eVtQQl0uY2Zfam9pbikgeworCQkJc21jLT5yLnJtX2xvb3AgPSBGQUxTRSA7CisJCQlzbWMtPnIucm1fam9pbiA9IFRSVUUgOworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9KT0lOKSA7Lyogc2lnbmFsIFJNVCAqLworCQl9CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJREJfQ0ZNTigxLCJDRk0gOiAlc1xuIixjZm1fc3RhdGVzW3NtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZV0sMCkgOworCQlicmVhayA7CisJY2FzZSBTQzExX0NfV1JBUF9TIDoKKwkJLypTQzcwKi8KKwkJaWYgKCAhc21jLT55W1BBXS5jZl9qb2luICYmICFzbWMtPnlbUEFdLmNmX2xvb3AgJiYKKwkJICAgICAhc21jLT55W1BCXS5jZl9qb2luICYmICFzbWMtPnlbUEJdLmNmX2xvb3ApIHsKKwkJCUdPX1NUQVRFKFNDMF9JU09MQVRFRCkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwlkZWZhdWx0OgorCQlTTVRfUEFOSUMoc21jLFNNVF9FMDEwNiwgU01UX0UwMTA2X01TRykgOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBnZXQgTUFDJ3MgaW5wdXQgUG9ydAorICoJcmV0dXJuIDoKKyAqCQlQQSBvciBQQgorICovCitpbnQgY2ZtX2dldF9tYWNfaW5wdXQoc3RydWN0IHNfc21jICpzbWMpCit7CisJcmV0dXJuKChzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGUgPT0gU0MxMF9DX1dSQVBfQiB8fAorCQlzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGUgPT0gU0M1X1RIUlVfQikgPyBQQiA6IFBBKSA7Cit9CisKKy8qCisgKiBnZXQgTUFDJ3Mgb3V0cHV0IFBvcnQKKyAqCXJldHVybiA6CisgKgkJUEEgb3IgUEIKKyAqLworaW50IGNmbV9nZXRfbWFjX291dHB1dChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlyZXR1cm4oKHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSA9PSBTQzEwX0NfV1JBUF9CIHx8CisJCXNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSA9PSBTQzRfVEhSVV9BKSA/IFBCIDogUEEpIDsKK30KKworc3RhdGljIGNoYXIgcGF0aF9pc29bXSA9IHsKKwkwLDAsCTAsUkVTX1BPUlQsCTAsUEEgKyBJTkRFWF9QT1JULAkwLFBBVEhfSVNPLAorCTAsMCwJMCxSRVNfTUFDLAkwLElOREVYX01BQywJCTAsUEFUSF9JU08sCisJMCwwLAkwLFJFU19QT1JULAkwLFBCICsgSU5ERVhfUE9SVCwJMCxQQVRIX0lTTworfSA7CisKK3N0YXRpYyBjaGFyIHBhdGhfd3JhcF9hW10gPSB7CisJMCwwLAkwLFJFU19QT1JULAkwLFBBICsgSU5ERVhfUE9SVCwJMCxQQVRIX1BSSU0sCisJMCwwLAkwLFJFU19NQUMsCTAsSU5ERVhfTUFDLAkJMCxQQVRIX1BSSU0sCisJMCwwLAkwLFJFU19QT1JULAkwLFBCICsgSU5ERVhfUE9SVCwJMCxQQVRIX0lTTworfSA7CisKK3N0YXRpYyBjaGFyIHBhdGhfd3JhcF9iW10gPSB7CisJMCwwLAkwLFJFU19QT1JULAkwLFBCICsgSU5ERVhfUE9SVCwJMCxQQVRIX1BSSU0sCisJMCwwLAkwLFJFU19NQUMsCTAsSU5ERVhfTUFDLAkJMCxQQVRIX1BSSU0sCisJMCwwLAkwLFJFU19QT1JULAkwLFBBICsgSU5ERVhfUE9SVCwJMCxQQVRIX0lTTworfSA7CisKK3N0YXRpYyBjaGFyIHBhdGhfdGhydVtdID0geworCTAsMCwJMCxSRVNfUE9SVCwJMCxQQSArIElOREVYX1BPUlQsCTAsUEFUSF9QUklNLAorCTAsMCwJMCxSRVNfTUFDLAkwLElOREVYX01BQywJCTAsUEFUSF9QUklNLAorCTAsMCwJMCxSRVNfUE9SVCwJMCxQQiArIElOREVYX1BPUlQsCTAsUEFUSF9QUklNCit9IDsKKworc3RhdGljIGNoYXIgcGF0aF93cmFwX3NbXSA9IHsKKwkwLDAsCTAsUkVTX1BPUlQsCTAsUFMgKyBJTkRFWF9QT1JULAkwLFBBVEhfUFJJTSwKKwkwLDAsCTAsUkVTX01BQywJMCxJTkRFWF9NQUMsCQkwLFBBVEhfUFJJTSwKK30gOworCitzdGF0aWMgY2hhciBwYXRoX2lzb19zW10gPSB7CisJMCwwLAkwLFJFU19QT1JULAkwLFBTICsgSU5ERVhfUE9SVCwJMCxQQVRIX0lTTywKKwkwLDAsCTAsUkVTX01BQywJMCxJTkRFWF9NQUMsCQkwLFBBVEhfSVNPLAorfSA7CisKK2ludCBjZW1fYnVpbGRfcGF0aChzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciAqdG8sIGludCBwYXRoX2luZGV4KQoreworCWNoYXIJKnBhdGggOworCWludAlsZW4gOworCisJc3dpdGNoIChzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGUpIHsKKwlkZWZhdWx0IDoKKwljYXNlIFNDMF9JU09MQVRFRCA6CisJCXBhdGggPSBzbWMtPnMuc2FzID8gcGF0aF9pc29fcyA6IHBhdGhfaXNvIDsKKwkJbGVuID0gc21jLT5zLnNhcyA/IHNpemVvZihwYXRoX2lzb19zKSA6ICBzaXplb2YocGF0aF9pc28pIDsKKwkJYnJlYWsgOworCWNhc2UgU0M5X0NfV1JBUF9BIDoKKwkJcGF0aCA9IHBhdGhfd3JhcF9hIDsKKwkJbGVuID0gc2l6ZW9mKHBhdGhfd3JhcF9hKSA7CisJCWJyZWFrIDsKKwljYXNlIFNDMTBfQ19XUkFQX0IgOgorCQlwYXRoID0gcGF0aF93cmFwX2IgOworCQlsZW4gPSBzaXplb2YocGF0aF93cmFwX2IpIDsKKwkJYnJlYWsgOworCWNhc2UgU0M0X1RIUlVfQSA6CisJCXBhdGggPSBwYXRoX3RocnUgOworCQlsZW4gPSBzaXplb2YocGF0aF90aHJ1KSA7CisJCWJyZWFrIDsKKwljYXNlIFNDMTFfQ19XUkFQX1MgOgorCQlwYXRoID0gcGF0aF93cmFwX3MgOworCQlsZW4gPSBzaXplb2YocGF0aF93cmFwX3MpIDsKKwkJYnJlYWsgOworCX0KKwltZW1jcHkodG8scGF0aCxsZW4pIDsKKworCUxJTlRfVVNFKHBhdGhfaW5kZXgpOworCisJcmV0dXJuKGxlbikgOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9kcnZmYmkuYyBiL2RyaXZlcnMvbmV0L3NrZnAvZHJ2ZmJpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyZTg0MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvZHJ2ZmJpLmMKQEAgLTAsMCArMSwxNTI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRkJJIGJvYXJkIGRlcGVuZGVudCBEcml2ZXIgZm9yIFNNVCBhbmQgTExDCisgKi8KKworI2luY2x1ZGUgImgvdHlwZXMuaCIKKyNpbmNsdWRlICJoL2ZkZGkuaCIKKyNpbmNsdWRlICJoL3NtYy5oIgorI2luY2x1ZGUgImgvc3VwZXJuXzIuaCIKKyNpbmNsdWRlICJoL3NrZmJpaW5jLmgiCisKKyNpZm5kZWYJbGludAorc3RhdGljIGNvbnN0IGNoYXIgSURfc2Njc1tdID0gIkAoIylkcnZmYmkuYwkxLjYzIDk5LzAyLzExIChDKSBTSyAiIDsKKyNlbmRpZgorCisvKgorICogUENNIGFjdGl2ZSBzdGF0ZQorICovCisjZGVmaW5lIFBDOF9BQ1RJVkUJOAorCisjZGVmaW5lCUxFRF9ZX09OCTB4MTEJLyogVXNlZCBmb3IgcmluZyB1cC9kb3duIGluZGljYXRpb24gKi8KKyNkZWZpbmUJTEVEX1lfT0ZGCTB4MTAKKworCisjZGVmaW5lIE1TMkJDTEsoeCkJKCh4KSoxMjUwMEwpCisKKy8qCisgKiB2YWxpZCBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmU6CisgKi8KKyNpZmRlZglJU0EKK2NvbnN0IGludCBvcHRfaW50c1tdID0gezgsCTMsIDQsIDUsIDksIDEwLCAxMSwgMTIsIDE1fSA7Citjb25zdCBpbnQgb3B0X2lvcHNbXSA9IHs4LAorCTB4MTAwLCAweDEyMCwgMHgxODAsIDB4MWEwLCAweDIyMCwgMHgyNDAsIDB4MzIwLCAweDM0MH07Citjb25zdCBpbnQgb3B0X2RtYXNbXSA9IHs0LAkzLCA1LCA2LCA3fSA7Citjb25zdCBpbnQgb3B0X2Vwcm9tc1tdID0gezE1LAkweGMwLCAweGMyLCAweGM0LCAweGM2LCAweGM4LCAweGNhLCAweGNjLCAweGNlLAorCQkJMHhkMCwgMHhkMiwgMHhkNCwgMHhkNiwgMHhkOCwgMHhkYSwgMHhkY30gOworI2VuZGlmCisjaWZkZWYJRUlTQQorY29uc3QgaW50IG9wdF9pbnRzW10gPSB7NSwgOSwgMTAsIDExfSA7Citjb25zdCBpbnQgb3B0X2RtYXNbXSA9IHswLCA1LCA2LCA3fSA7Citjb25zdCBpbnQgb3B0X2Vwcm9tc1tdID0gezB4YzAsIDB4YzIsIDB4YzQsIDB4YzYsIDB4YzgsIDB4Y2EsIDB4Y2MsIDB4Y2UsCisJCQkJMHhkMCwgMHhkMiwgMHhkNCwgMHhkNiwgMHhkOCwgMHhkYSwgMHhkY30gOworI2VuZGlmCisKKyNpZmRlZglNQ0EKK2ludAlvcHRfaW50c1tdID0gezMsIDExLCAxMCwgOX0gOwkJCS8qIEZNMSAqLworaW50CW9wdF9lcHJvbXNbXSA9IHswLCAweGM0LCAweGM4LCAweGNjLCAweGQwLCAweGQ0LCAweGQ4LCAweGRjfSA7CisjZW5kaWYJLyogTUNBICovCisKKy8qCisgKgl4UE9TX0lEOnh4eHgKKyAqCXwJXCAgLworICoJfAkgXC8KKyAqCXwJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gdGhlIHBhdGNoZWQgUE9TX0lEIG9mIHRoZSBBZGFwdGVyCisgKgl8CQkJCXh4eHggPSAoVmVuZG9yIElEIGxvdyBieXRlLAorICoJfAkJCQkJVmVuZG9yIElEIGhpZ2ggYnl0ZSwKKyAqCXwJCQkJCURldmljZSBJRCBsb3cgYnl0ZSwKKyAqCXwJCQkJCURldmljZSBJRCBoaWdoIGJ5dGUpCisgKgkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRoZSBwYXRjaGVkIG9lbV9pZCBtdXN0IGJlCisgKgkJCQkJJ1MnIGZvciBTSyBvciAnSScgZm9yIElCTQorICoJCQkJCXRoaXMgaXMgYSBzaG9ydCBpZCBmb3IgdGhlIGRyaXZlci4KKyAqLworI2lmbmRlZiBNVUxUX09FTQorI2lmbmRlZglPRU1fQ09OQ0VQVAorI2lmbmRlZiBNQ0EKK2NvbnN0IHVfY2hhciBvZW1faWRbXSA9ICJ4UE9TX0lEOnh4eHgiIDsKKyNlbHNlCitjb25zdCB1X2NoYXIgb2VtX2lkW10gPSAieFBPU0lEMTp4eHh4IiA7CS8qIEZNMSBjYXJkIGlkLiAqLworI2VuZGlmCisjZWxzZQkvKiBPRU1fQ09OQ0VQVCAqLworI2lmbmRlZiBNQ0EKK2NvbnN0IHVfY2hhciBvZW1faWRbXSA9IE9FTV9JRCA7CisjZWxzZQorY29uc3QgdV9jaGFyIG9lbV9pZFtdID0gT0VNX0lEMSA7CS8qIEZNMSBjYXJkIGlkLiAqLworI2VuZGlmCS8qIE1DQSAqLworI2VuZGlmCS8qIE9FTV9DT05DRVBUICovCisjZGVmaW5lCUlEX0JZVEUwCTgKKyNkZWZpbmUJT0VNSUQoc21jLGkpCW9lbV9pZFtJRF9CWVRFMCArIGldCisjZWxzZQkvKiBNVUxUX09FTSAqLworY29uc3Qgc3RydWN0IHNfb2VtX2lkcyBvZW1faWRzW10gPSB7CisjaW5jbHVkZSAib2VtaWRzLmgiCit7MH0KK307CisjZGVmaW5lCU9FTUlEKHNtYyxpKQlzbWMtPmh3Lm9lbV9pZC0+b2lfaWRbaV0KKyNlbmRpZgkvKiBNVUxUX09FTSAqLworCisvKiBQcm90b3R5cGVzIG9mIGV4dGVybmFsIGZ1bmN0aW9ucyAqLworI2lmZGVmIEFJWAorZXh0ZXJuIGludCBBSVhfdnBkUmVhZEJ5dGUoKSA7CisjZW5kaWYKKworCisvKiBQcm90b3R5cGVzIG9mIGxvY2FsIGZ1bmN0aW9ucy4gKi8KK3ZvaWQgc210X3N0b3Bfd2F0Y2hkb2coc3RydWN0IHNfc21jICpzbWMpOworCisjaWZkZWYgTUNBCitzdGF0aWMgaW50IHJlYWRfY2FyZF9pZCgpIDsKK3N0YXRpYyB2b2lkIERpc2FibGVTbG90QWNjZXNzKCkgOworc3RhdGljIHZvaWQgRW5hYmxlU2xvdEFjY2VzcygpIDsKKyNpZmRlZiBBSVgKK2V4dGVybiBpbnQgYXR0YWNoX1BPU19hZGRyKCkgOworZXh0ZXJuIGludCBkZXRhY2hfUE9TX2FkZHIoKSA7CitleHRlcm4gdV9jaGFyIHJlYWRfUE9TKCkgOworZXh0ZXJuIHZvaWQgd3JpdGVfUE9TKCkgOworZXh0ZXJuIGludCBBSVhfdnBkUmVhZEJ5dGUoKSA7CisjZWxzZQorI2RlZmluZQlyZWFkX1BPUyhzbWMsYTEsYTIpCSgodV9jaGFyKSBpbnAoYTEpKQorI2RlZmluZQl3cml0ZV9QT1Moc21jLGExLGEyLGEzKQlvdXRwKChhMSksKGEzKSkKKyNlbmRpZgorI2VuZGlmCS8qIE1DQSAqLworCisKKy8qCisgKiBGRERJIGNhcmQgcmVzZXQKKyAqLworc3RhdGljIHZvaWQgY2FyZF9zdGFydChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlpbnQgaSA7CisjaWZkZWYJUENJCisJdV9jaGFyCXJldl9pZCA7CisJdV9zaG9ydCB3b3JkOworI2VuZGlmCisKKwlzbXRfc3RvcF93YXRjaGRvZyhzbWMpIDsKKworI2lmZGVmCUlTQQorCW91dHB3KENTUl9BLDApIDsJCQkvKiByZXNldCBmb3IgYWxsIGNoaXBzICovCisJZm9yIChpID0gMTAgOyBpIDsgaS0tKQkJCS8qIGRlbGF5IGZvciBQTEMncyAqLworCQkodm9pZClpbnB3KElTUl9BKSA7CisJT1VUXzgyYzU0X1RJTUVSKDMsQ09VTlQoMikgfCBSV19PUCgzKSB8IFRNT0RFKDIpKSA7CisJCQkJCS8qIGNvdW50ZXIgMiwgbW9kZSAyICovCisJT1VUXzgyYzU0X1RJTUVSKDIsOTcpIDsJCS8qIExTQiAqLworCU9VVF84MmM1NF9USU1FUigyLDApIDsJCS8qIE1TQiAoIDE1LjYgdXMgKSAqLworCW91dHB3KENTUl9BLENTX0NSRVNFVCkgOworI2VuZGlmCisjaWZkZWYJRUlTQQorCW91dHB3KENTUl9BLDApIDsJCQkvKiByZXNldCBmb3IgYWxsIGNoaXBzICovCisJZm9yIChpID0gMTAgOyBpIDsgaS0tKQkJCS8qIGRlbGF5IGZvciBQTEMncyAqLworCQkodm9pZClpbnB3KElTUl9BKSA7CisJb3V0cHcoQ1NSX0EsQ1NfQ1JFU0VUKSA7CisJc21jLT5ody5sZWQgPSAoMjw8NikgOworCW91dHB3KENTUl9BLENTX0NSRVNFVCB8IHNtYy0+aHcubGVkKSA7CisjZW5kaWYKKyNpZmRlZglNQ0EKKwlvdXRwKEFERFIoQ0FSRF9ESVMpLDApIDsJCS8qIHJlc2V0IGZvciBhbGwgY2hpcHMgKi8KKwlmb3IgKGkgPSAxMCA7IGkgOyBpLS0pCQkJLyogZGVsYXkgZm9yIFBMQydzICovCisJCSh2b2lkKWlucHcoSVNSX0EpIDsKKwlvdXRwKEFERFIoQ0FSRF9FTiksMCkgOworCS8qIGZpcnN0IEkvTyBhZnRlciByZXNldCBtdXN0IG5vdCBiZSBhIGFjY2VzcyB0byBGT1JNQUMgb3IgUExDICovCisKKwkvKgorCSAqIGJ1cyB0aW1lb3V0IChNQ0EpCisJICovCisJT1VUXzgyYzU0X1RJTUVSKDMsQ09VTlQoMikgfCBSV19PUCgzKSB8IFRNT0RFKDMpKSA7CisJCQkJCS8qIGNvdW50ZXIgMiwgbW9kZSAzICovCisJT1VUXzgyYzU0X1RJTUVSKDIsKDIqMjQpKSA7CS8qIDMuOSB1cyAqIDIgc3F1YXJlIHdhdmUgKi8KKwlPVVRfODJjNTRfVElNRVIoMiwwKSA7CQkvKiBNU0IgKi8KKworCS8qIFBPUyAxMDIgaW5kaWNhdGVkIGFuIGFjdGl2IENoZWNrIExpbmUgb3IgQnVzcyBFcnJvciBtb25pdG9yaW5nICovCisJaWYgKGlucHcoQ1NBX0EpICYgKFBPU19FTl9DSEtJTlQgfCBQT1NfRU5fQlVTX0VSUikpIHsKKwkJb3V0cChBRERSKElSUV9DSENLX0VOKSwwKSA7CisJfQorCisJaWYgKCEoKGkgPSBpbnB3KENTUl9BKSkgJiBDU19TQVMpKSB7CisJCWlmICghKGkgJiBDU19CWVNUQVQpKSB7CisJCQlvdXRwKEFERFIoQllQQVNTKFNUQVRfSU5TKSksMCkgOy8qIGluc2VydCBzdGF0aW9uICovCisJCX0KKwl9CisJb3V0cHcoTEVEUl9BLExFRF8xKSA7CS8qIHllbGxvdyAqLworI2VuZGlmCS8qIE1DQSAqLworI2lmZGVmCVBDSQorCS8qCisJICogbWFrZSBzdXJlIG5vIHRyYW5zZmVyIGFjdGl2aXR5IGlzIHBlbmRpbmcKKwkgKi8KKwlvdXRwdyhGTV9BKEZNX01EUkVHMSksRk1fTUlOSVQpIDsKKwlvdXRwKEFERFIoQjBfQ1RSTCksIENUUkxfSFBJX1NFVCkgOworCWh3dF93YWl0X3RpbWUoc21jLGh3dF9xdWlja19yZWFkKHNtYyksTVMyQkNMSygxMCkpIDsKKwkvKgorCSAqIG5vdyByZXNldCBldmVyeXRoaW5nCisJICovCisJb3V0cChBRERSKEIwX0NUUkwpLENUUkxfUlNUX1NFVCkgOwkvKiByZXNldCBmb3IgYWxsIGNoaXBzICovCisJaSA9IChpbnQpIGlucChBRERSKEIwX0NUUkwpKSA7CQkvKiBkbyBkdW1teSByZWFkICovCisJU0tfVU5VU0VEKGkpIDsJCQkJLyogTWFrZSBMSU5UIGhhcHB5LiAqLworCW91dHAoQUREUihCMF9DVFJMKSwgQ1RSTF9SU1RfQ0xSKSA7CisKKwkvKgorCSAqIFJlc2V0IGFsbCBiaXRzIGluIHRoZSBQQ0kgU1RBVFVTIHJlZ2lzdGVyCisJICovCisJb3V0cChBRERSKEIwX1RTVF9DVFJMKSwgVFNUX0NGR19XUklURV9PTikgOwkvKiBlbmFibGUgZm9yIHdyaXRlcyAqLworCXdvcmQgPSBpbnB3KFBDSV9DKFBDSV9TVEFUVVMpKSA7CisJb3V0cHcoUENJX0MoUENJX1NUQVRVUyksIHdvcmQgfCBQQ0lfRVJSQklUUykgOworCW91dHAoQUREUihCMF9UU1RfQ1RSTCksIFRTVF9DRkdfV1JJVEVfT0ZGKSA7CS8qIGRpc2FibGUgd3JpdGVzICovCisKKwkvKgorCSAqIFJlbGVhc2UgdGhlIHJlc2V0IG9mIGFsbCB0aGUgU3RhdGUgbWFjaGluZXMKKwkgKiBSZWxlYXNlIE1hc3Rlcl9SZXNldAorCSAqIFJlbGVhc2UgSFBJX1NNX1Jlc2V0CisJICovCisJb3V0cChBRERSKEIwX0NUUkwpLCBDVFJMX01SU1RfQ0xSfENUUkxfSFBJX0NMUikgOworCisJLyoKKwkgKiBkZXRlcm1pbmUgdGhlIGFkYXB0ZXIgdHlwZQorCSAqIE5vdGU6IERvIGl0IGhlcmUsIGJlY2F1c2Ugc29tZSBkcml2ZXJzIG1heSBjYWxsIGNhcmRfc3RhcnQoKSBvbmNlCisJICoJIGF0IHZlcnkgZmlyc3QgYmVmb3JlIGFueSBvdGhlciBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgaXMKKwkgKgkgZXhlY3V0ZWQuCisJICovCisJcmV2X2lkID0gaW5wKFBDSV9DKFBDSV9SRVZfSUQpKSA7CisJaWYgKChyZXZfaWQgJiAweGYwKSA9PSBTS19NTF9JRF8xIHx8IChyZXZfaWQgJiAweGYwKSA9PSBTS19NTF9JRF8yKSB7CisJCXNtYy0+aHcuaHdfaXNfNjRiaXQgPSBUUlVFIDsKKwl9IGVsc2UgeworCQlzbWMtPmh3Lmh3X2lzXzY0Yml0ID0gRkFMU0UgOworCX0KKworCS8qCisJICogV2F0ZXJtYXJrIGluaXRpYWxpemF0aW9uCisJICovCisJaWYgKCFzbWMtPmh3Lmh3X2lzXzY0Yml0KSB7CisJCW91dHBkKEFERFIoQjRfUjFfRiksIFJYX1dBVEVSTUFSSykgOworCQlvdXRwZChBRERSKEI1X1hBX0YpLCBUWF9XQVRFUk1BUkspIDsKKwkJb3V0cGQoQUREUihCNV9YU19GKSwgVFhfV0FURVJNQVJLKSA7CisJfQorCisJb3V0cChBRERSKEIwX0NUUkwpLENUUkxfUlNUX0NMUikgOwkvKiBjbGVhciB0aGUgcmVzZXQgY2hpcHMgKi8KKwlvdXRwKEFERFIoQjBfTEVEKSxMRURfR0FfT0ZGfExFRF9NWV9PTnxMRURfR0JfT0ZGKSA7IC8qIHllIExFRCBvbiAqLworCisJLyogaW5pdCB0aGUgdGltZXIgdmFsdWUgZm9yIHRoZSB3YXRjaCBkb2cgMiw1IG1pbnV0ZXMgKi8KKwlvdXRwZChBRERSKEIyX1dET0dfSU5JKSwweDZGQzIzQUMwKSA7CisKKwkvKiBpbml0aWFsaXplIHRoZSBJU1IgbWFzayAqLworCXNtYy0+aHcuaXNfaW1hc2sgPSBJU1JfTUFTSyA7CisJc21jLT5ody5od19zdGF0ZSA9IFNUT1BQRUQgOworI2VuZGlmCisJR0VUX1BBR0UoMCkgOwkJLyogbmVjZXNzYXJ5IGZvciBCT09UICovCit9CisKK3ZvaWQgY2FyZF9zdG9wKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXNtdF9zdG9wX3dhdGNoZG9nKHNtYykgOworCXNtYy0+aHcubWFjX3JpbmdfaXNfdXAgPSAwIDsJCS8qIHJpbmcgZG93biAqLworI2lmZGVmCUlTQQorCW91dHB3KENTUl9BLDApIDsJCQkvKiByZXNldCBmb3IgYWxsIGNoaXBzICovCisjZW5kaWYKKyNpZmRlZglFSVNBCisJb3V0cHcoQ1NSX0EsMCkgOwkJCS8qIHJlc2V0IGZvciBhbGwgY2hpcHMgKi8KKyNlbmRpZgorI2lmZGVmCU1DQQorCW91dHAoQUREUihDQVJEX0RJUyksMCkgOwkJLyogcmVzZXQgZm9yIGFsbCBjaGlwcyAqLworI2VuZGlmCisjaWZkZWYJUENJCisJLyoKKwkgKiBtYWtlIHN1cmUgbm8gdHJhbnNmZXIgYWN0aXZpdHkgaXMgcGVuZGluZworCSAqLworCW91dHB3KEZNX0EoRk1fTURSRUcxKSxGTV9NSU5JVCkgOworCW91dHAoQUREUihCMF9DVFJMKSwgQ1RSTF9IUElfU0VUKSA7CisJaHd0X3dhaXRfdGltZShzbWMsaHd0X3F1aWNrX3JlYWQoc21jKSxNUzJCQ0xLKDEwKSkgOworCS8qCisJICogbm93IHJlc2V0IGV2ZXJ5dGhpbmcKKwkgKi8KKwlvdXRwKEFERFIoQjBfQ1RSTCksQ1RSTF9SU1RfU0VUKSA7CS8qIHJlc2V0IGZvciBhbGwgY2hpcHMgKi8KKwlvdXRwKEFERFIoQjBfQ1RSTCksQ1RSTF9SU1RfQ0xSKSA7CS8qIHJlc2V0IGZvciBhbGwgY2hpcHMgKi8KKwlvdXRwKEFERFIoQjBfTEVEKSxMRURfR0FfT0ZGfExFRF9NWV9PRkZ8TEVEX0dCX09GRikgOyAvKiBhbGwgTEVEcyBvZmYgKi8KKwlzbWMtPmh3Lmh3X3N0YXRlID0gU1RPUFBFRCA7CisjZW5kaWYKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElTUiBoYW5kbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBtYWMxX2lycShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9zaG9ydCBzdHUsIHVfc2hvcnQgc3RsKQoreworCWludAlyZXN0YXJ0X3R4ID0gMCA7CithZ2FpbjoKKyNpZm5kZWYgUENJCisjaWZuZGVmIElTQQorLyoKKyAqIEZPUk1BQysgYnVnIG1vZGlmaWVkIHRoZSBxdWV1ZSBwb2ludGVyIGlmIG1hbnkgcmVhZC93cml0ZSBhY2Nlc3NlcyBoYXBwZW5zIT8KKyAqLworCWlmIChzdGwgJiAoRk1fU1BDRVBEUyAgfAkvKiBwYXJpdC9jb2RpbmcgZXJyLiBzeW4ucS4qLworCQkgICBGTV9TUENFUERBMCB8CS8qIHBhcml0L2NvZGluZyBlcnIuIGEucS4wICovCisJCSAgIEZNX1NQQ0VQREExIHwJLyogcGFyaXQvY29kaW5nIGVyci4gYS5xLjEgKi8KKwkJICAgRk1fU1BDRVBEQTIpKSB7CS8qIHBhcml0L2NvZGluZyBlcnIuIGEucS4yICovCisJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTMyLCBTTVRfRTAxMzJfTVNHKSA7CisJfQorCWlmIChzdGwgJiAoRk1fU1RCVVJTICB8CS8qIHR4IGJ1ZmZlciB1bmRlcnJ1biBzeW4ucS4qLworCQkgICBGTV9TVEJVUkEwIHwJLyogdHggYnVmZmVyIHVuZGVycnVuIGEucS4wICovCisJCSAgIEZNX1NUQlVSQTEgfAkvKiB0eCBidWZmZXIgdW5kZXJydW4gYS5xLjEgKi8KKwkJICAgRk1fU1RCVVJBMikpIHsJLyogdHggYnVmZmVyIHVuZGVycnVuIGEucS4yICovCisJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTMzLCBTTVRfRTAxMzNfTVNHKSA7CisJfQorI2VuZGlmCisJaWYgKCAoc3R1ICYgKEZNX1NYTVRBQlQgfAkJLyogdHJhbnNtaXQgYWJvcnQgKi8KKyNpZmRlZglTWU5DCisJCSAgICAgRk1fU1RYQUJSUyB8CS8qIHN5bi4gdHggYWJvcnQgKi8KKyNlbmRpZgkvKiBTWU5DICovCisJCSAgICAgRk1fU1RYQUJSQTApKSB8fAkvKiBhc3luLiB0eCBhYm9ydCAqLworCSAgICAgKHN0bCAmIChGTV9TUUxDS1MgfAkJLyogbG9jayBmb3Igc3luLiBxLiAqLworCQkgICAgIEZNX1NRTENLQTApKSApIHsJLyogbG9jayBmb3IgYXN5bi4gcS4gKi8KKwkJZm9ybWFjX3R4X3Jlc3RhcnQoc21jKSA7CQkvKiBpbml0IHR4ICovCisJCXJlc3RhcnRfdHggPSAxIDsKKwkJc3R1ID0gaW5wdyhGTV9BKEZNX1NUMVUpKSA7CisJCXN0bCA9IGlucHcoRk1fQShGTV9TVDFMKSkgOworCQlzdHUgJj0gfiAoRk1fU1RFQ0ZSTUEwIHwgRk1fU1RFRlJNQTAgfCBGTV9TVEVGUk1TKSA7CisJCWlmIChzdHUgfHwgc3RsKQorCQkJZ290byBhZ2FpbiA7CisJfQorCisjaWZuZGVmCVNZTkMKKwlpZiAoc3R1ICYgKEZNX1NURUNGUk1BMCB8IC8qIGVuZCBvZiBjaGFpbiBhc3luIHR4ICovCisJCSAgIEZNX1NURUZSTUEwKSkgeyAvKiBlbmQgb2YgZnJhbWUgYXN5biB0eCAqLworCQkvKiBmcmVlIHR4X3F1ZXVlICovCisJCXNtYy0+aHcubl9hX3NlbmQgPSAwIDsKKwkJaWYgKCsrc21jLT5ody5mcC50eF9mcmVlIDwgc21jLT5ody5mcC50eF9tYXgpIHsKKwkJCXN0YXJ0X25leHRfc2VuZChzbWMpOworCQl9CisJCXJlc3RhcnRfdHggPSAxIDsKKwl9CisjZWxzZQkvKiBTWU5DICovCisJaWYgKHN0dSAmIChGTV9TVEVGUk1BMCB8CS8qIGVuZCBvZiBhc3luIHR4ICovCisJCSAgICBGTV9TVEVGUk1TKSkgewkvKiBlbmQgb2Ygc3luYyB0eCAqLworCQlyZXN0YXJ0X3R4ID0gMSA7CisJfQorI2VuZGlmCS8qIFNZTkMgKi8KKwlpZiAocmVzdGFydF90eCkKKwkJbGxjX3Jlc3RhcnRfdHgoc21jKSA7Cit9CisjZWxzZQkvKiBQQ0kgKi8KKworCS8qCisJICogcGFyaXR5IGVycm9yOiBub3RlIGVuY29kaW5nIGVycm9yIGlzIG5vdCBwb3NzaWJsZSBpbiB0YWcgbW9kZQorCSAqLworCWlmIChzdGwgJiAoRk1fU1BDRVBEUyAgfAkvKiBwYXJpdHkgZXJyLiBzeW4ucS4qLworCQkgICBGTV9TUENFUERBMCB8CS8qIHBhcml0eSBlcnIuIGEucS4wICovCisJCSAgIEZNX1NQQ0VQREExKSkgewkvKiBwYXJpdHkgZXJyLiBhLnEuMSAqLworCQlTTVRfUEFOSUMoc21jLFNNVF9FMDEzNCwgU01UX0UwMTM0X01TRykgOworCX0KKwkvKgorCSAqIGJ1ZmZlciB1bmRlcnJ1bjogY2FuIG9ubHkgb2NjdXIgaWYgYSB0eCB0aHJlc2hvbGQgaXMgc3BlY2lmaWVkCisJICovCisJaWYgKHN0bCAmIChGTV9TVEJVUlMgIHwJCS8qIHR4IGJ1ZmZlciB1bmRlcnJ1biBzeW4ucS4qLworCQkgICBGTV9TVEJVUkEwIHwJCS8qIHR4IGJ1ZmZlciB1bmRlcnJ1biBhLnEuMCAqLworCQkgICBGTV9TVEJVUkExKSkgewkvKiB0eCBidWZmZXIgdW5kZXJydW4gYS5xLjIgKi8KKwkJU01UX1BBTklDKHNtYyxTTVRfRTAxMzMsIFNNVF9FMDEzM19NU0cpIDsKKwl9CisKKwlpZiAoIChzdHUgJiAoRk1fU1hNVEFCVCB8CQkvKiB0cmFuc21pdCBhYm9ydCAqLworCQkgICAgIEZNX1NUWEFCUlMgfAkJLyogc3luLiB0eCBhYm9ydCAqLworCQkgICAgIEZNX1NUWEFCUkEwKSkgfHwJCS8qIGFzeW4uIHR4IGFib3J0ICovCisJICAgICAoc3RsICYgKEZNX1NRTENLUyB8CQkvKiBsb2NrIGZvciBzeW4uIHEuICovCisJCSAgICAgRk1fU1FMQ0tBMCkpICkgewkJLyogbG9jayBmb3IgYXN5bi4gcS4gKi8KKwkJZm9ybWFjX3R4X3Jlc3RhcnQoc21jKSA7CS8qIGluaXQgdHggKi8KKwkJcmVzdGFydF90eCA9IDEgOworCQlzdHUgPSBpbnB3KEZNX0EoRk1fU1QxVSkpIDsKKwkJc3RsID0gaW5wdyhGTV9BKEZNX1NUMUwpKSA7CisJCXN0dSAmPSB+IChGTV9TVEVDRlJNQTAgfCBGTV9TVEVGUk1BMCB8IEZNX1NURUZSTVMpIDsKKwkJaWYgKHN0dSB8fCBzdGwpCisJCQlnb3RvIGFnYWluIDsKKwl9CisKKwlpZiAoc3R1ICYgKEZNX1NURUZSTUEwIHwJLyogZW5kIG9mIGFzeW4gdHggKi8KKwkJICAgIEZNX1NURUZSTVMpKSB7CS8qIGVuZCBvZiBzeW5jIHR4ICovCisJCXJlc3RhcnRfdHggPSAxIDsKKwl9CisKKwlpZiAocmVzdGFydF90eCkKKwkJbGxjX3Jlc3RhcnRfdHgoc21jKSA7Cit9CisjZW5kaWYJLyogUENJICovCisvKgorICogaW50ZXJydXB0IHNvdXJjZT0gcGxjMQorICogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gbndmYmlzci5hc20KKyAqLwordm9pZCBwbGMxX2lycShzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwl1X3Nob3J0CXN0ID0gaW5wdyhQTEMoUEIsUExfSU5UUl9FVkVOVCkpIDsKKworI2lmCShkZWZpbmVkKElTQSkgfHwgZGVmaW5lZChFSVNBKSkKKwkvKiByZXNldCBQTEMgSW50LiBiaXRzICovCisJb3V0cHcoUExDMV9JLGlucHcoUExDMV9JKSkgOworI2VuZGlmCisJcGxjX2lycShzbWMsUEIsc3QpIDsKK30KKworLyoKKyAqIGludGVycnVwdCBzb3VyY2U9IHBsYzIKKyAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIG53ZmJpc3IuYXNtCisgKi8KK3ZvaWQgcGxjMl9pcnEoc3RydWN0IHNfc21jICpzbWMpCit7CisJdV9zaG9ydAlzdCA9IGlucHcoUExDKFBBLFBMX0lOVFJfRVZFTlQpKSA7CisKKyNpZgkoZGVmaW5lZChJU0EpIHx8IGRlZmluZWQoRUlTQSkpCisJLyogcmVzZXQgUExDIEludC4gYml0cyAqLworCW91dHB3KFBMQzJfSSxpbnB3KFBMQzJfSSkpIDsKKyNlbmRpZgorCXBsY19pcnEoc21jLFBBLHN0KSA7Cit9CisKKworLyoKKyAqIGludGVycnVwdCBzb3VyY2U9IHRpbWVyCisgKi8KK3ZvaWQgdGltZXJfaXJxKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWh3dF9yZXN0YXJ0KHNtYyk7CisJc21jLT5ody50X3N0b3AgPSBzbWMtPmh3LnRfc3RhcnQ7CisJc210X3RpbWVyX2RvbmUoc21jKSA7Cit9CisKKy8qCisgKiByZXR1cm4gUy1wb3J0IChQQSBvciBQQikKKyAqLworaW50IHBjbV9nZXRfc19wb3J0KHN0cnVjdCBzX3NtYyAqc21jKQoreworCVNLX1VOVVNFRChzbWMpIDsKKwlyZXR1cm4oUFMpIDsKK30KKworLyoKKyAqIFN0YXRpb24gTGFiZWwgPSAiRkRESS1YWVoiIHdoZXJlCisgKgorICoJWCA9IGNvbm5lY3RvciB0eXBlCisgKglZID0gUE1EIHR5cGUKKyAqCVogPSBwb3J0IHR5cGUKKyAqLworI2RlZmluZSBTVEFUSU9OX0xBQkVMX0NPTk5FQ1RPUl9PRkZTRVQJNQorI2RlZmluZSBTVEFUSU9OX0xBQkVMX1BNRF9PRkZTRVQJNgorI2RlZmluZSBTVEFUSU9OX0xBQkVMX1BPUlRfT0ZGU0VUCTcKKwordm9pZCByZWFkX2FkZHJlc3Moc3RydWN0IHNfc21jICpzbWMsIHVfY2hhciAqbWFjX2FkZHIpCit7CisJY2hhciBDb25uZWN0b3JUeXBlIDsKKwljaGFyIFBtZFR5cGUgOworCWludAlpIDsKKworCWV4dGVybiBjb25zdCB1X2NoYXIgY2Fub25pY2FsWzI1Nl0gOworCisjaWYJKGRlZmluZWQoSVNBKSB8fCBkZWZpbmVkKE1DQSkpCisJZm9yIChpID0gMDsgaSA8IDQgO2krKykgewkvKiByZWFkIG1hYyBhZGRyZXNzIGZyb20gYm9hcmQgKi8KKwkJc21jLT5ody5mZGRpX3BoeXNfYWRkci5hW2ldID0KKwkJCWNhbm9uaWNhbFsoaW5wdyhQUl9BKGkrU0FfTUFDKSkmMHhmZildIDsKKwl9CisJZm9yIChpID0gNDsgaSA8IDY7IGkrKykgeworCQlzbWMtPmh3LmZkZGlfcGh5c19hZGRyLmFbaV0gPQorCQkJY2Fub25pY2FsWyhpbnB3KFBSX0EoaStTQV9NQUMrUFJBX09GRikpJjB4ZmYpXSA7CisJfQorI2VuZGlmCisjaWZkZWYJRUlTQQorCS8qCisJICogTm90ZTogV2UgZ2V0IHRyb3VibGUgb24gYW4gQWxwaGEgbWFjaGluZSBpZiB3ZSBtYWtlIGEgaW5wdygpCisJICogaW5zdGVhZCBvZiBpbnAoKQorCSAqLworCWZvciAoaSA9IDA7IGkgPCA0IDtpKyspIHsJLyogcmVhZCBtYWMgYWRkcmVzcyBmcm9tIGJvYXJkICovCisJCXNtYy0+aHcuZmRkaV9waHlzX2FkZHIuYVtpXSA9CisJCQljYW5vbmljYWxbaW5wKFBSX0EoaStTQV9NQUMpKV0gOworCX0KKwlmb3IgKGkgPSA0OyBpIDwgNjsgaSsrKSB7CisJCXNtYy0+aHcuZmRkaV9waHlzX2FkZHIuYVtpXSA9CisJCQljYW5vbmljYWxbaW5wKFBSX0EoaStTQV9NQUMrUFJBX09GRikpXSA7CisJfQorI2VuZGlmCisjaWZkZWYJUENJCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewkvKiByZWFkIG1hYyBhZGRyZXNzIGZyb20gYm9hcmQgKi8KKwkJc21jLT5ody5mZGRpX3BoeXNfYWRkci5hW2ldID0KKwkJCWNhbm9uaWNhbFtpbnAoQUREUihCMl9NQUNfMCtpKSldIDsKKwl9CisjZW5kaWYKKyNpZm5kZWYJUENJCisJQ29ubmVjdG9yVHlwZSA9IGlucHcoUFJfQShTQV9QTURfVFlQRSkpICYgMHhmZiA7CisJUG1kVHlwZSA9IGlucHcoUFJfQShTQV9QTURfVFlQRSsxKSkgJiAweGZmIDsKKyNlbHNlCisJQ29ubmVjdG9yVHlwZSA9IGlucChBRERSKEIyX0NPTk5fVFlQKSkgOworCVBtZFR5cGUgPSBpbnAoQUREUihCMl9QTURfVFlQKSkgOworI2VuZGlmCisKKwlzbWMtPnlbUEFdLnBtZF90eXBlW1BNRF9TS19DT05OXSA9CisJc21jLT55W1BCXS5wbWRfdHlwZVtQTURfU0tfQ09OTl0gPSBDb25uZWN0b3JUeXBlIDsKKwlzbWMtPnlbUEFdLnBtZF90eXBlW1BNRF9TS19QTUQgXSA9CisJc21jLT55W1BCXS5wbWRfdHlwZVtQTURfU0tfUE1EIF0gPSBQbWRUeXBlIDsKKworCWlmIChtYWNfYWRkcikgeworCQlmb3IgKGkgPSAwOyBpIDwgNiA7aSsrKSB7CisJCQlzbWMtPmh3LmZkZGlfY2Fub25fYWRkci5hW2ldID0gbWFjX2FkZHJbaV0gOworCQkJc21jLT5ody5mZGRpX2hvbWVfYWRkci5hW2ldID0gY2Fub25pY2FsW21hY19hZGRyW2ldXSA7CisJCX0KKwkJcmV0dXJuIDsKKwl9CisJc21jLT5ody5mZGRpX2hvbWVfYWRkciA9IHNtYy0+aHcuZmRkaV9waHlzX2FkZHIgOworCisJZm9yIChpID0gMDsgaSA8IDYgO2krKykgeworCQlzbWMtPmh3LmZkZGlfY2Fub25fYWRkci5hW2ldID0KKwkJCWNhbm9uaWNhbFtzbWMtPmh3LmZkZGlfcGh5c19hZGRyLmFbaV1dIDsKKwl9Cit9CisKKy8qCisgKiBGRERJIGNhcmQgc29mdCByZXNldAorICovCit2b2lkIGluaXRfYm9hcmQoc3RydWN0IHNfc21jICpzbWMsIHVfY2hhciAqbWFjX2FkZHIpCit7CisJY2FyZF9zdGFydChzbWMpIDsKKwlyZWFkX2FkZHJlc3Moc21jLG1hY19hZGRyKSA7CisKKyNpZm5kZWYJUENJCisJaWYgKGlucHcoQ1NSX0EpICYgQ1NfU0FTKQorI2Vsc2UKKwlpZiAoIShpbnAoQUREUihCMF9EQVMpKSAmIERBU19BVkFJTCkpCisjZW5kaWYKKwkJc21jLT5zLnNhcyA9IFNNVF9TQVMgOwkvKiBTaW5nbGUgYXR0LiBzdGF0aW9uICovCisJZWxzZQorCQlzbWMtPnMuc2FzID0gU01UX0RBUyA7CS8qIER1YWwgYXR0LiBzdGF0aW9uICovCisKKyNpZm5kZWYJUENJCisJaWYgKGlucHcoQ1NSX0EpICYgQ1NfQllTVEFUKQorI2Vsc2UKKwlpZiAoIShpbnAoQUREUihCMF9EQVMpKSAmIERBU19CWVBfU1QpKQorI2VuZGlmCisJCXNtYy0+bWliLmZkZGlTTVRCeXBhc3NQcmVzZW50ID0gMCA7CisJCS8qIHdpdGhvdXQgb3B0LiBieXBhc3MgKi8KKwllbHNlCisJCXNtYy0+bWliLmZkZGlTTVRCeXBhc3NQcmVzZW50ID0gMSA7CisJCS8qIHdpdGggb3B0LiBieXBhc3MgKi8KK30KKworLyoKKyAqIGluc2VydCBvciBkZWluc2VydCBvcHRpY2FsIGJ5cGFzcyAoY2FsbGVkIGJ5IEVDTSkKKyAqLwordm9pZCBzbV9wbV9ieXBhc3NfcmVxKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbW9kZSkKK3sKKyNpZgkoZGVmaW5lZChJU0EpIHx8IGRlZmluZWQoRUlTQSkpCisJaW50IGNzcmFfdiA7CisjZW5kaWYKKworCURCX0VDTU4oMSwiRUNNIDogc21fcG1fYnlwYXNzX3JlcSglcylcbiIsKG1vZGUgPT0gQlBfSU5TRVJUKSA/CisJCQkJCSJCUF9JTlNFUlQiIDogIkJQX0RFSU5TRVJUIiwwKSA7CisKKwlpZiAoc21jLT5zLnNhcyAhPSBTTVRfREFTKQorCQlyZXR1cm4gOworCisjaWYJKGRlZmluZWQoSVNBKSB8fCBkZWZpbmVkKEVJU0EpKQorCisJY3NyYV92ID0gaW5wdyhDU1JfQSkgJiB+Q1NfQllQQVNTIDsKKyNpZmRlZglFSVNBCisJY3NyYV92IHw9IHNtYy0+aHcubGVkIDsKKyNlbmRpZgorCisJc3dpdGNoKG1vZGUpIHsKKwljYXNlIEJQX0lOU0VSVCA6CisJCW91dHB3KENTUl9BLGNzcmFfdiB8IENTX0JZUEFTUykgOworCQlicmVhayA7CisJY2FzZSBCUF9ERUlOU0VSVCA6CisJCW91dHB3KENTUl9BLGNzcmFfdikgOworCQlicmVhayA7CisJfQorI2VuZGlmCS8qIElTQSAvIEVJU0EgKi8KKyNpZmRlZglNQ0EKKwlzd2l0Y2gobW9kZSkgeworCWNhc2UgQlBfSU5TRVJUIDoKKwkJb3V0cChBRERSKEJZUEFTUyhTVEFUX0lOUykpLDApIDsvKiBpbnNlcnQgc3RhdGlvbiAqLworCQlicmVhayA7CisJY2FzZSBCUF9ERUlOU0VSVCA6CisJCW91dHAoQUREUihCWVBBU1MoU1RBVF9CWVApKSwwKSA7CS8qIGJ5cGFzcyBzdGF0aW9uICovCisJCWJyZWFrIDsKKwl9CisjZW5kaWYKKyNpZmRlZglQQ0kKKwlzd2l0Y2gobW9kZSkgeworCWNhc2UgQlBfSU5TRVJUIDoKKwkJb3V0cChBRERSKEIwX0RBUyksREFTX0JZUF9JTlMpIDsJLyogaW5zZXJ0IHN0YXRpb24gKi8KKwkJYnJlYWsgOworCWNhc2UgQlBfREVJTlNFUlQgOgorCQlvdXRwKEFERFIoQjBfREFTKSxEQVNfQllQX1JNVikgOwkvKiBieXBhc3Mgc3RhdGlvbiAqLworCQlicmVhayA7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBjaGVjayBpZiBieXBhc3MgY29ubmVjdGVkCisgKi8KK2ludCBzbV9wbV9ieXBhc3NfcHJlc2VudChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKyNpZm5kZWYJUENJCisJcmV0dXJuKAkoaW5wdyhDU1JfQSkgJiBDU19CWVNUQVQpID8gRkFMU0UgOiBUUlVFICkgOworI2Vsc2UKKwlyZXR1cm4oCShpbnAoQUREUihCMF9EQVMpKSAmIERBU19CWVBfU1QpID8gVFJVRTogRkFMU0UpIDsKKyNlbmRpZgorfQorCit2b2lkIHBsY19jbGVhcl9pcnEoc3RydWN0IHNfc21jICpzbWMsIGludCBwKQoreworCVNLX1VOVVNFRChwKSA7CisKKyNpZgkoZGVmaW5lZChJU0EpIHx8IGRlZmluZWQoRUlTQSkpCisJc3dpdGNoIChwKSB7CisJY2FzZSBQQSA6CisJCS8qIHJlc2V0IFBMQyBJbnQuIGJpdHMgKi8KKwkJb3V0cHcoUExDMl9JLGlucHcoUExDMl9JKSkgOworCQlicmVhayA7CisJY2FzZSBQQiA6CisJCS8qIHJlc2V0IFBMQyBJbnQuIGJpdHMgKi8KKwkJb3V0cHcoUExDMV9JLGlucHcoUExDMV9JKSkgOworCQlicmVhayA7CisJfQorI2Vsc2UKKwlTS19VTlVTRUQoc21jKSA7CisjZW5kaWYKK30KKworCisvKgorICogbGVkX2luZGljYXRpb24gY2FsbGVkIGJ5IHJtdF9pbmRpY2F0aW9uKCkgYW5kCisgKiBwY21fc3RhdGVfY2hhbmdlKCkKKyAqCisgKiBJbnB1dDoKKyAqCXNtYzoJU01UIGNvbnRleHQKKyAqCWxlZF9ldmVudDoKKyAqCTAJT25seSBzd2l0Y2ggZ3JlZW4gTEVEcyBhY2NvcmRpbmcgdG8gdGhlaXIgcmVzcGVjdGl2ZSBQQ00gc3RhdGUKKyAqCUxFRF9ZX09GRglqdXN0IHN3aXRjaCB5ZWxsb3cgTEVEIG9mZgorICoJTEVEX1lfT04JanVzdCBzd2l0Y2ggeWVsbG8gTEVEIG9uCisgKi8KK3ZvaWQgbGVkX2luZGljYXRpb24oc3RydWN0IHNfc21jICpzbWMsIGludCBsZWRfZXZlbnQpCit7CisJLyogdXNlIHNtYy0+aHcubWFjX3JpbmdfaXNfdXAgPT0gVFJVRSAKKwkgKiBhcyBpbmRpY2F0aW9uIGZvciBSaW5nIE9wZXJhdGlvbmFsCisJICovCisJdV9zaG9ydAkJCWxlZF9zdGF0ZSA7CisJc3RydWN0IHNfcGh5CQkqcGh5IDsKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqbWliX2EgOworCXN0cnVjdCBmZGRpX21pYl9wCSptaWJfYiA7CisKKwlwaHkgPSAmc21jLT55W1BBXSA7CisJbWliX2EgPSBwaHktPm1pYiA7CisJcGh5ID0gJnNtYy0+eVtQQl0gOworCW1pYl9iID0gcGh5LT5taWIgOworCisjaWZkZWYJRUlTQQorCS8qIFJpbmcgdXAgPSB5ZWxsb3cgbGVkIE9GRiovCisJaWYgKGxlZF9ldmVudCA9PSBMRURfWV9PTikgeworCQlzbWMtPmh3LmxlZCB8PSBDU19MRURfMSA7CisJfQorCWVsc2UgaWYgKGxlZF9ldmVudCA9PSBMRURfWV9PRkYpIHsKKwkJc21jLT5ody5sZWQgJj0gfkNTX0xFRF8xIDsKKwl9CisJZWxzZSB7CisJCS8qIExpbmsgYXQgUG9ydCBBIG9yIEIgPSBncmVlbiBsZWQgT04gKi8KKwkJaWYgKG1pYl9hLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDOF9BQ1RJVkUgfHwKKwkJICAgIG1pYl9iLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDOF9BQ1RJVkUpIHsKKwkJCXNtYy0+aHcubGVkIHw9IENTX0xFRF8wIDsKKwkJfQorCQllbHNlIHsKKwkJCXNtYy0+aHcubGVkICY9IH5DU19MRURfMCA7CisJCX0KKwl9CisjZW5kaWYKKyNpZmRlZglNQ0EKKwlsZWRfc3RhdGUgPSBpbnB3KExFRFJfQSkgOworCQorCS8qIFJpbmcgdXAgPSB5ZWxsb3cgbGVkIE9GRiovCisJaWYgKGxlZF9ldmVudCA9PSBMRURfWV9PTikgeworCQlsZWRfc3RhdGUgfD0gTEVEXzEgOworCX0KKwllbHNlIGlmIChsZWRfZXZlbnQgPT0gTEVEX1lfT0ZGKSB7CisJCWxlZF9zdGF0ZSAmPSB+TEVEXzEgOworCX0KKwllbHNlIHsKKyAgICAgICAgICAgICAgICBsZWRfc3RhdGUgJj0gfihMRURfMnxMRURfMCkgOworCisJCS8qIExpbmsgYXQgUG9ydCBBID0gZ3JlZW4gbGVkIEEgT04gKi8KKwkJaWYgKG1pYl9hLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDOF9BQ1RJVkUpIHsJCisJCQlsZWRfc3RhdGUgfD0gTEVEXzIgOworCQl9CisJCQorCQkvKiBMaW5rIGF0IFBvcnQgQi9TID0gZ3JlZW4gbGVkIEIgT04gKi8KKwkJaWYgKG1pYl9iLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDOF9BQ1RJVkUpIHsKKwkJCWxlZF9zdGF0ZSB8PSBMRURfMCA7CisJCX0KKwl9CisKKyAgICAgICAgb3V0cHcoTEVEUl9BLCBsZWRfc3RhdGUpIDsKKyNlbmRpZgkvKiBNQ0EgKi8KKyNpZmRlZglQQ0kKKyAgICAgICAgbGVkX3N0YXRlID0gMCA7CisJCisJLyogUmluZyB1cCA9IHllbGxvdyBsZWQgT0ZGKi8KKwlpZiAobGVkX2V2ZW50ID09IExFRF9ZX09OKSB7CisJCWxlZF9zdGF0ZSB8PSBMRURfTVlfT04gOworCX0KKwllbHNlIGlmIChsZWRfZXZlbnQgPT0gTEVEX1lfT0ZGKSB7CisJCWxlZF9zdGF0ZSB8PSBMRURfTVlfT0ZGIDsKKwl9CisJZWxzZSB7CS8qIFBDTSBzdGF0ZSBjaGFuZ2VkICovCisJCS8qIExpbmsgYXQgUG9ydCBBL1MgPSBncmVlbiBsZWQgQSBPTiAqLworCQlpZiAobWliX2EtPmZkZGlQT1JUUENNU3RhdGUgPT0gUEM4X0FDVElWRSkgewkKKwkJCWxlZF9zdGF0ZSB8PSBMRURfR0FfT04gOworCQl9CisJCWVsc2UgeworCQkJbGVkX3N0YXRlIHw9IExFRF9HQV9PRkYgOworCQl9CisJCQorCQkvKiBMaW5rIGF0IFBvcnQgQiA9IGdyZWVuIGxlZCBCIE9OICovCisJCWlmIChtaWJfYi0+ZmRkaVBPUlRQQ01TdGF0ZSA9PSBQQzhfQUNUSVZFKSB7CisJCQlsZWRfc3RhdGUgfD0gTEVEX0dCX09OIDsKKwkJfQorCQllbHNlIHsKKwkJCWxlZF9zdGF0ZSB8PSBMRURfR0JfT0ZGIDsKKwkJfQorCX0KKworICAgICAgICBvdXRwKEFERFIoQjBfTEVEKSwgbGVkX3N0YXRlKSA7CisjZW5kaWYJLyogUENJICovCisKK30KKworCit2b2lkIHBjbV9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHNfc21jICpzbWMsIGludCBwbGMsIGludCBwX3N0YXRlKQoreworCS8qCisJICogdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgcGNtX3N0YXRlX2NoYW5nZSgpIGluIHRoZSBkcml2ZXIKKwkgKiBwYXJ0cyBtdXN0IGJlIHJlbmFtZWQgdG8gZHJ2X3BjbV9zdGF0ZV9jaGFuZ2UoKSB3aGljaCB3aWxsIGJlIGNhbGxlZAorCSAqIG5vdyBhZnRlciBsZWRfaW5kaWNhdGlvbi4KKwkgKi8KKwlEUlZfUENNX1NUQVRFX0NIQU5HRShzbWMscGxjLHBfc3RhdGUpIDsKKwkKKwlsZWRfaW5kaWNhdGlvbihzbWMsMCkgOworfQorCisKK3ZvaWQgcm10X2luZGljYXRpb24oc3RydWN0IHNfc21jICpzbWMsIGludCBpKQoreworCS8qIENhbGwgYSBkcml2ZXIgc3BlY2lhbCBmdW5jdGlvbiBpZiBkZWZpbmVkICovCisJRFJWX1JNVF9JTkRJQ0FUSU9OKHNtYyxpKSA7CisKKyAgICAgICAgbGVkX2luZGljYXRpb24oc21jLCBpID8gTEVEX1lfT0ZGIDogTEVEX1lfT04pIDsKK30KKworCisvKgorICogbGxjX3JlY292ZXJfdHggY2FsbGVkIGJ5IGluaXRfdHggKGZwbHVzLmMpCisgKi8KK3ZvaWQgbGxjX3JlY292ZXJfdHgoc3RydWN0IHNfc21jICpzbWMpCit7CisjaWZkZWYJTE9BRF9HRU4KKwlleHRlcm4JaW50IGxvYWRfZ2VuX2ZsYWcgOworCisJbG9hZF9nZW5fZmxhZyA9IDAgOworI2VuZGlmCisjaWZuZGVmCVNZTkMKKwlzbWMtPmh3Lm5fYV9zZW5kPSAwIDsKKyNlbHNlCisJU0tfVU5VU0VEKHNtYykgOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERNQSBpbml0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmCUlTQQorCisvKgorICogaW5pdCBETUEKKyAqLwordm9pZCBpbml0X2RtYShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGRtYSkKK3sKKwlTS19VTlVTRUQoc21jKSA7CisKKwkvKgorCSAqIHNldCBjYXNjYWRlIG1vZGUsCisJICogY2xlYXIgbWFzayBiaXQgKGVuYWJsZSBETUEgY2FubmFsKQorCSAqLworCWlmIChkbWEgPiAzKSB7CisJCW91dHAoMHhkNiwoZG1hICYgMHgwMykgfCAweGMwKSA7CisJCW91dHAoMHhkNCwgZG1hICYgMHgwMykgOworCX0KKwllbHNlIHsKKwkJb3V0cCgweDBiLChkbWEgJiAweDAzKSB8IDB4YzApIDsKKwkJb3V0cCgweDBhLGRtYSAmIDB4MDMpIDsKKwl9Cit9CisKKy8qCisgKiBkaXNhYmxlIERNQQorICovCit2b2lkIGRpc19kbWEoc3RydWN0IHNfc21jICpzbWMsIGludCBkbWEpCit7CisJU0tfVU5VU0VEKHNtYykgOworCisJLyoKKwkgKiBzZXQgbWFzayBiaXQgKGRpc2FibGUgRE1BIGNhbm5hbCkKKwkgKi8KKwlpZiAoZG1hID4gMykgeworCQlvdXRwKDB4ZDQsKGRtYSAmIDB4MDMpIHwgMHgwNCkgOworCX0KKwllbHNlIHsKKwkJb3V0cCgweDBhLChkbWEgJiAweDAzKSB8IDB4MDQpIDsKKwl9Cit9CisKKyNlbmRpZgkvKiBJU0EgKi8KKworI2lmZGVmCUVJU0EKKworLyphcnJheXMgd2l0aCBpbyBhZGRyZXNzZXMgb2YgZG1hIGNvbnRyb2xsZXIgbGVuZ3RoIGFuZCBhZGRyZXNzIHJlZ2lzdGVycyovCitzdGF0aWMgY29uc3QgaW50IGNudHJbOF0gPSB7IDB4MDAxLDB4MDAzLDB4MDA1LDB4MDA3LDAsMHgwYzYsMHgwY2EsMHgwY2UgfSA7CitzdGF0aWMgY29uc3QgaW50IGJhc2VbOF0gPSB7IDB4MDAwLDB4MDAyLDB4MDA0LDB4MDA2LDAsMHgwYzQsMHgwYzgsMHgwY2MgfSA7CitzdGF0aWMgY29uc3QgaW50IHBhZ2VbOF0gPSB7IDB4MDg3LDB4MDgzLDB4MDgxLDB4MDgyLDAsMHgwOGIsMHgwODksMHgwOGEgfSA7CisKK3ZvaWQgaW5pdF9kbWEoc3RydWN0IHNfc21jICpzbWMsIGludCBkbWEpCit7CisJLyoKKwkgKiBleHRlbmRlZCBtb2RlIHJlZ2lzdGVyCisJICogMzIgYml0IElPCisJICogdHlwZSBjCisJICogVEMgb3V0cHV0CisJICogZGlzYWJsZSBzdG9wCisJICovCisKKwkvKiBtb2RlIHJlYWQgKHdyaXRlKSBkZW1hbmQgKi8KKwlzbWMtPmh3LmRtYV9ybW9kZSA9IChkbWEgJiAzKSB8IDB4MDggfCAweDAgOworCXNtYy0+aHcuZG1hX3dtb2RlID0gKGRtYSAmIDMpIHwgMHgwNCB8IDB4MCA7CisKKwkvKiAzMiBiaXQgSU8ncywgYnVyc3QgRE1BIG1vZGUgKHR5cGUgIkMiKSAqLworCXNtYy0+aHcuZG1hX2Vtb2RlID0gKGRtYSAmIDMpIHwgMHgwOCB8IDB4MzAgOworCisJb3V0cCgoZG1hIDwgNCkgPyAweDQwYiA6IDB4NGQ2LHNtYy0+aHcuZG1hX2Vtb2RlKSA7CisKKwkvKiBkaXNhYmxlIGNoYWluaW5nICovCisJb3V0cCgoZG1hIDwgNCkgPyAweDQwYSA6IDB4NGQ0LChkbWEmMykpIDsKKworCS8qbG9hZCBkbWEgY29udHJvbGxlciBhZGRyZXNzZXMgZm9yIGZhc3QgYWNjZXNzIGR1cmluZyBzZXQgZG1hKi8KKwlzbWMtPmh3LmRtYV9iYXNlX3dvcmRfY291bnQgPSBjbnRyW3NtYy0+aHcuZG1hXTsKKwlzbWMtPmh3LmRtYV9iYXNlX2FkZHJlc3MgPSBiYXNlW3NtYy0+aHcuZG1hXTsKKwlzbWMtPmh3LmRtYV9iYXNlX2FkZHJlc3NfcGFnZSA9IHBhZ2Vbc21jLT5ody5kbWFdOworCit9CisKK3ZvaWQgZGlzX2RtYShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGRtYSkKK3sKKwlTS19VTlVTRUQoc21jKSA7CisKKwlvdXRwKChkbWEgPCA0KSA/IDB4MGEgOiAweGQ0LChkbWEmMyl8NCkgOy8qIG1hc2sgYml0ICovCit9CisjZW5kaWYJLyogRUlTQSAqLworCisjaWZkZWYJTUNBCit2b2lkIGluaXRfZG1hKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZG1hKQoreworCVNLX1VOVVNFRChzbWMpIDsKKwlTS19VTlVTRUQoZG1hKSA7Cit9CisKK3ZvaWQgZGlzX2RtYShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGRtYSkKK3sKKwlTS19VTlVTRUQoc21jKSA7CisJU0tfVU5VU0VEKGRtYSkgOworfQorI2VuZGlmCisKKyNpZmRlZglQQ0kKK3ZvaWQgaW5pdF9kbWEoc3RydWN0IHNfc21jICpzbWMsIGludCBkbWEpCit7CisJU0tfVU5VU0VEKHNtYykgOworCVNLX1VOVVNFRChkbWEpIDsKK30KKwordm9pZCBkaXNfZG1hKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZG1hKQoreworCVNLX1VOVVNFRChzbWMpIDsKKwlTS19VTlVTRUQoZG1hKSA7Cit9CisjZW5kaWYKKworI2lmZGVmIE1VTFRfT0VNCitzdGF0aWMgaW50IGlzX2VxdWFsX251bShjaGFyIGNvbXAxW10sIGNoYXIgY29tcDJbXSwgaW50IG51bSkKK3sKKwlpbnQgaSA7CisKKwlmb3IgKGkgPSAwIDsgaSA8IG51bSA7IGkrKykgeworCQlpZiAoY29tcDFbaV0gIT0gY29tcDJbaV0pCisJCQlyZXR1cm4gKDApIDsKKwl9CisJCXJldHVybiAoMSkgOworfQkvKiBpc19lcXVhbF9udW0gKi8KKworCisvKgorICogc2V0IHRoZSBPRU0gSUQgZGVmYXVsdHMsIGFuZCB0ZXN0IHRoZSBjb250ZW50cyBvZiB0aGUgT0VNIGRhdGEgYmFzZQorICogVGhlIGRlZmF1bHQgT0VNIGlzIHRoZSBmaXJzdCBBQ1RJVkUgZW50cnkgaW4gdGhlIE9FTSBkYXRhIGJhc2UgCisgKgorICogcmV0dXJuczoJMAlzdWNjZXNzCisgKgkJMQllcnJvciBpbiBkYXRhIGJhc2UKKyAqCQkyCWRhdGEgYmFzZSBlbXB0eQorICoJCTMJbm8gYWN0aXZlIGVudHJ5CQorICovCitpbnQgc2V0X29pX2lkX2RlZihzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlpbnQgc2VsX2lkIDsKKwlpbnQgaSA7CisJaW50IGFjdF9lbnRyaWVzIDsKKworCWkgPSAwIDsKKwlzZWxfaWQgPSAtMSA7CisJYWN0X2VudHJpZXMgPSBGQUxTRSA7CisJc21jLT5ody5vZW1faWQgPSAwIDsKKwlzbWMtPmh3Lm9lbV9taW5fc3RhdHVzID0gT0lfU1RBVF9BQ1RJVkUgOworCQorCS8qIGNoZWNrIE9FTSBkYXRhIGJhc2UgKi8KKwl3aGlsZSAob2VtX2lkc1tpXS5vaV9zdGF0dXMpIHsKKwkJc3dpdGNoIChvZW1faWRzW2ldLm9pX3N0YXR1cykgeworCQljYXNlIE9JX1NUQVRfQUNUSVZFOgorCQkJYWN0X2VudHJpZXMgPSBUUlVFIDsJLyogd2UgaGF2ZSBhY3RpdmUgSURzICovCisJCQlpZiAoc2VsX2lkID09IC0xKQorCQkJCXNlbF9pZCA9IGkgOwkvKiBzYXZlIHRoZSBmaXJzdCBhY3RpdmUgSUQgKi8KKwkJY2FzZSBPSV9TVEFUX1ZBTElEOgorCQljYXNlIE9JX1NUQVRfUFJFU0VOVDoKKwkJCWkrKyA7CisJCQlicmVhayA7CQkJLyogZW50cnkgb2sgKi8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAoMSkgOwkJLyogaW52YWxpZCBvaV9zdGF0dXMgKi8KKwkJfQorCX0KKworCWlmIChpID09IDApCisJCXJldHVybiAoMikgOworCWlmICghYWN0X2VudHJpZXMpCisJCXJldHVybiAoMykgOworCisJLyogb2ssIHdlIGhhdmUgYSB2YWxpZCBPRU0gZGF0YSBiYXNlIHdpdGggYW4gYWN0aXZlIGVudHJ5ICovCisJc21jLT5ody5vZW1faWQgPSAoc3RydWN0IHNfb2VtX2lkcyAqKSAgJm9lbV9pZHNbc2VsX2lkXSA7CisJcmV0dXJuICgwKSA7Cit9CisjZW5kaWYJLyogTVVMVF9PRU0gKi8KKworCisjaWZkZWYJTUNBCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQkVHSU5fTUFOVUFMX0VOVFJZKCkKKyAqCisgKglleGlzdF9ib2FyZAorICoKKyAqCUNoZWNrIGlmIGFuIE1DQSBib2FyZCBpcyBwcmVzZW50IGluIHRoZSBzcGVjaWZpZWQgc2xvdC4KKyAqCisgKglpbnQgZXhpc3RfYm9hcmQoCisgKgkJc3RydWN0IHNfc21jICpzbWMsCisgKgkJaW50IHNsb3QpIDsKKyAqIEluCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBDb250ZXh0IHN0cnVjdC4KKyAqCisgKglzbG90IC0gVGhlIG51bWJlciBvZiB0aGUgc2xvdCB0byBpbnNwZWN0LgorICogT3V0CisgKgkwID0gTm8gYWRhcHRlciBwcmVzZW50LgorICoJMSA9IEZvdW5kIEZNMSBhZGFwdGVyLgorICoKKyAqIFBzZXVkbworICogICAgICBSZWFkIE1DQSBJRAorICoJZm9yIGFsbCB2YWxpZCBPRU1fSURzCisgKgkJY29tcGFyZSB3aXRoIElEIHJlYWQKKyAqCQlpZiBlcXVhbCwgcmV0dXJuIDEKKyAqCXJldHVybigwCisgKgorICogTm90ZQorICoJVGhlIHNtYyBwb2ludGVyIG11c3QgYmUgdmFsaWQgbm93LgorICoKKyAqIEVORF9NQU5VQUxfRU5UUlkoKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIExPTkdfQ0FSRF9JRChsbywgaGkpCSgoKChoaSkgJiAweGZmKSA8PCA4KSB8ICgobG8pICYgMHhmZikpCitpbnQgZXhpc3RfYm9hcmQoc3RydWN0IHNfc21jICpzbWMsIGludCBzbG90KQoreworI2lmZGVmIE1VTFRfT0VNCisJU0tfTE9DX0RFQ0wodV9jaGFyLGlkWzJdKSA7CisJaW50IGlkaSA7CisjZW5kaWYJLyogTVVMVF9PRU0gKi8KKworCS8qIE5vIGxvbmdlciB2YWxpZC4gKi8KKwlpZiAoc21jID09IE5VTEwpCisJCXJldHVybigwKSA7CisKKyNpZm5kZWYgTVVMVF9PRU0KKwlpZiAocmVhZF9jYXJkX2lkKHNtYywgc2xvdCkKKwkJPT0gTE9OR19DQVJEX0lEKE9FTUlEKHNtYywwKSwgT0VNSUQoc21jLDEpKSkKKwkJcmV0dXJuICgxKSA7CS8qIEZvdW5kIEZNIGFkYXB0ZXIuICovCisKKyNlbHNlCS8qIE1VTFRfT0VNICovCisJaWRpID0gcmVhZF9jYXJkX2lkKHNtYywgc2xvdCkgOworCWlkWzBdID0gaWRpICYgMHhmZiA7CisJaWRbMV0gPSBpZGkgPj4gOCA7CisKKyAgICAgICAgc21jLT5ody5vZW1faWQgPSAoc3RydWN0IHNfb2VtX2lkcyAqKSAmb2VtX2lkc1swXSA7CisJZm9yICg7IHNtYy0+aHcub2VtX2lkLT5vaV9zdGF0dXMgIT0gT0lfU1RBVF9MQVNUOyBzbWMtPmh3Lm9lbV9pZCsrKSB7CisJCWlmIChzbWMtPmh3Lm9lbV9pZC0+b2lfc3RhdHVzIDwgc21jLT5ody5vZW1fbWluX3N0YXR1cykKKwkJCWNvbnRpbnVlIDsKKworCQlpZiAoaXNfZXF1YWxfbnVtKCZpZFswXSwmT0VNSUQoc21jLDApLDIpKQorCQkJcmV0dXJuICgxKSA7CisJfQorI2VuZGlmCS8qIE1VTFRfT0VNICovCisJcmV0dXJuICgwKSA7CS8qIE5vIGFkYXB0ZXIgZm91bmQuICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglyZWFkX2NhcmRfaWQKKyAqCisgKglSZWFkIHRoZSBNQ0EgY2FyZCBpZCBmcm9tIHRoZSBzcGVjaWZpZWQgc2xvdC4KKyAqIEluCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBDb250ZXh0IHN0cnVjdC4KKyAqCUNBVkVBVDogVGhpcyBwb2ludGVyIG1heSBiZSBOVUxMIGFuZCAqbXVzdCBub3QqIGJlIHVzZWQgd2l0aGluIHRoaXMKKyAqCWZ1bmN0aW9uLiBJdCdzIG9ubHkgcHVycG9zZSBpcyBmb3IgZHJpdmVycyB0aGF0IG5lZWQgc29tZSBpbmZvcm1hdGlvbgorICoJZm9yIHRoZSBpbnAoKSBhbmQgb3V0cCgpIG1hY3Jvcy4KKyAqCisgKglzbG90IC0gVGhlIG51bWJlciBvZiB0aGUgc2xvdCBmb3Igd2hpY2ggdGhlIGNhcmQgaWQgaXMgcmV0dXJuZWQuCisgKiBPdXQKKyAqCVJldHVybnMgdGhlIGNhcmQgaWQgcmVhZCBmcm9tIHRoZSBzcGVjaWZpZWQgc2xvdC4gSWYgYW4gaWxsZWdhbCBzbG90CisgKgludW1iZXIgaXMgc3BlY2lmaWVkLCB0aGUgZnVuY3Rpb24gcmV0dXJucyB6ZXJvLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHJlYWRfY2FyZF9pZChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHNsb3QpCisvKiBzdHJ1Y3Qgc19zbWMgKnNtYyA7CURvIG5vdCB1c2UuICovCit7CisJaW50IGNhcmRfaWQgOworCisJU0tfVU5VU0VEKHNtYykgOwkvKiBNYWtlIExJTlQgaGFwcHkuICovCisJaWYgKChzbG90IDwgMSkgfHwgKHNsb3QgPiAxNSkpCS8qIG1heCAxNiBzbG90cywgMCA9IG1vdGhlcmJvYXJkICovCisJCXJldHVybiAoMCkgOwkvKiBJbGxlZ2FsIHNsb3QgbnVtYmVyIHNwZWNpZmllZC4gKi8KKworCUVuYWJsZVNsb3RBY2Nlc3Moc21jLCBzbG90KSA7CisKKwljYXJkX2lkID0gKChyZWFkX1BPUyhzbWMsUE9TX0lEX0hJR0gsc2xvdCAtIDEpICYgMHhmZikgPDwgOCkgfAorCQkJCShyZWFkX1BPUyhzbWMsUE9TX0lEX0xPVyxzbG90IC0gMSkgJiAweGZmKSA7CisKKwlEaXNhYmxlU2xvdEFjY2VzcyhzbWMpIDsKKworCXJldHVybiAoY2FyZF9pZCkgOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQkVHSU5fTUFOVUFMX0VOVFJZKCkKKyAqCisgKglnZXRfYm9hcmRfcGFyYQorICoKKyAqCUdldCBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uIEZpbGwgYWxsIGJvYXJkIHNwZWNpZmljCisgKglwYXJhbWV0ZXJzIHdpdGhpbiB0aGUgJ3NtYycgc3RydWN0dXJlLgorICoKKyAqCWludCBnZXRfYm9hcmRfcGFyYSgKKyAqCQlzdHJ1Y3Qgc19zbWMgKnNtYywKKyAqCQlpbnQgc2xvdCkgOworICogSW4KKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIENvbnRleHQgc3RydWN0LCB0byB3aGljaCB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAqCXdyaXRlIHNvbWUgYWRhcHRlciBjb25maWd1cmF0aW9uIGRhdGEuCisgKgorICoJc2xvdCAtIFRoZSBudW1iZXIgb2YgdGhlIHNsb3QsIGluIHdoaWNoIHRoZSBhZGFwdGVyIGlzIGluc3RhbGxlZC4KKyAqIE91dAorICoJMCA9IE5vIGFkYXB0ZXIgcHJlc2VudC4KKyAqCTEgPSBPay4KKyAqCTIgPSBBZGFwdGVyIHByZXNlbnQsIGJ1dCBjYXJkIGVuYWJsZSBiaXQgbm90IHNldC4KKyAqCisgKiBFTkRfTUFOVUFMX0VOVFJZKCkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGdldF9ib2FyZF9wYXJhKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgc2xvdCkKK3sKKwlpbnQgdmFsIDsKKwlpbnQgaSA7CisKKwkvKiBDaGVjayBpZiBhZGFwdGVyIHByZXNlbnQgJiBnZXQgdHlwZSBvZiBhZGFwdGVyLiAqLworCXN3aXRjaCAoZXhpc3RfYm9hcmQoc21jLCBzbG90KSkgeworCWNhc2UgMDoJLyogQWRhcHRlciBub3QgcHJlc2VudC4gKi8KKwkJcmV0dXJuICgwKSA7CisJY2FzZSAxOgkvKiBGTSBSZXYuIDEgKi8KKwkJc21jLT5ody5yZXYgPSBGTTFfUkVWIDsKKwkJc21jLT5ody5WRnVsbFJlYWQgPSAweDBhIDsKKwkJc21jLT5ody5WRnVsbFdyaXRlID0gMHgwNSA7CisJCXNtYy0+aHcuRG1hV3JpdGVFeHRyYUJ5dGVzID0gOCA7CS8qIDIgZXh0cmEgd29yZHMuICovCisJCWJyZWFrIDsKKwl9CisJc21jLT5ody5zbG90ID0gc2xvdCA7CisKKwlFbmFibGVTbG90QWNjZXNzKHNtYywgc2xvdCkgOworCisJaWYgKCEocmVhZF9QT1Moc21jLFBPU18xMDIsIHNsb3QgLSAxKSAmIFBPU19DQVJEX0VOKSkgeworCQlEaXNhYmxlU2xvdEFjY2VzcyhzbWMpIDsKKwkJcmV0dXJuICgyKSA7CS8qIENhcmQgZW5hYmxlIGJpdCBub3Qgc2V0LiAqLworCX0KKworCXZhbCA9IHJlYWRfUE9TKHNtYyxQT1NfMTA0LCBzbG90IC0gMSkgOwkvKiBJL08sIElSUSAqLworCisjaWZuZGVmIE1FTV9NQVBQRURfSU8JLyogaXMgZGVmaW5lZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSAqLworCWkgPSB2YWwgJiBQT1NfSU9TRUwgOwkvKiBJL08gYmFzZSBhZGRyLiAoMHgwMjAwIC4uIDB4ZmUwMCkgKi8KKwlzbWMtPmh3LmlvcCA9IChpICsgMSkgKiAweDA0MDAgLSAweDIwMCA7CisjZW5kaWYKKwlpID0gKCh2YWwgJiBQT1NfSVJRU0VMKSA+PiA2KSAmIDB4MDMgOwkvKiBJUlEgPDAsIDE+ICovCisJc21jLT5ody5pcnEgPSBvcHRfaW50c1tpXSA7CisKKwkvKiBGUFJPTSBiYXNlIGFkZHIuICovCisJaSA9ICgocmVhZF9QT1Moc21jLFBPU18xMDMsIHNsb3QgLSAxKSAmIFBPU19NU0VMKSA+PiA0KSAmIDB4MDcgOworCXNtYy0+aHcuZXByb20gPSBvcHRfZXByb21zW2ldIDsKKworCURpc2FibGVTbG90QWNjZXNzKHNtYykgOworCisJLyogYmVmb3JlIHRoaXMsIHRoZSBzbWMtPmh3LmlvcCBtdXN0IGJlIHNldCAhISEgKi8KKwlzbWMtPmh3LnNsb3RfMzIgPSBpbnB3KENTRl9BKSAmIFNMT1RfMzIgOworCisJcmV0dXJuICgxKSA7Cit9CisKKy8qIEVuYWJsZSBhY2Nlc3MgdG8gc3BlY2lmaWVkIE1DQSBzbG90LiAqLworc3RhdGljIHZvaWQgRW5hYmxlU2xvdEFjY2VzcyhzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHNsb3QpCit7CisJU0tfVU5VU0VEKHNsb3QpIDsKKworI2lmbmRlZiBBSVgKKwlTS19VTlVTRUQoc21jKSA7CisKKwkvKiBTeXN0ZW0gbW9kZS4gKi8KKwlvdXRwKFBPU19TWVNfU0VUVVAsIFBPU19TWVNURU0pIDsKKworCS8qIFNlbGVjdCBzbG90LiAqLworCW91dHAoUE9TX0NIQU5ORUxfUE9TLCBQT1NfQ0hBTk5FTF9CSVQgfCAoc2xvdC0xKSkgOworI2Vsc2UKKwlhdHRhY2hfUE9TX2FkZHIgKHNtYykgOworI2VuZGlmCit9CisKKy8qIERpc2FibGUgYWNjZXNzIHRvIE1DQSBzbG90IGZvcm1lcmx5IGVuYWJsZWQgdmlhIEVuYWJsZVNsb3RBY2Nlc3MoKS4gKi8KK3N0YXRpYyB2b2lkIERpc2FibGVTbG90QWNjZXNzKHN0cnVjdCBzX3NtYyAqc21jKQoreworI2lmbmRlZiBBSVgKKwlTS19VTlVTRUQoc21jKSA7CisKKwlvdXRwKFBPU19DSEFOTkVMX1BPUywgMCkgOworI2Vsc2UKKwlkZXRhY2hfUE9TX2FkZHIgKHNtYykgOworI2VuZGlmCit9CisjZW5kaWYJLyogTUNBICovCisKKyNpZmRlZglFSVNBCisjaWZuZGVmCU1FTV9NQVBQRURfSU8KKyNkZWZpbmUJU0FERFIoc2xvdCkJKCgoc2xvdCk8PDEyKSYweGYwMDApCisjZWxzZQkvKiBNRU1fTUFQUEVEX0lPICovCisjZGVmaW5lCVNBRERSKHNsb3QpCShzbWMtPmh3LmlvcCkKKyNlbmRpZgkvKiBNRU1fTUFQUEVEX0lPICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBCRUdJTl9NQU5VQUxfRU5UUlkoKQorICoKKyAqCWV4aXN0X2JvYXJkCisgKgorICoJQ2hlY2sgaWYgYW4gRUlTQSBib2FyZCBpcyBwcmVzZW50IGluIHRoZSBzcGVjaWZpZWQgc2xvdC4KKyAqCisgKglpbnQgZXhpc3RfYm9hcmQoCisgKgkJc3RydWN0IHNfc21jICpzbWMsCisgKgkJaW50IHNsb3QpIDsKKyAqIEluCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBDb250ZXh0IHN0cnVjdC4KKyAqCisgKglzbG90IC0gVGhlIG51bWJlciBvZiB0aGUgc2xvdCB0byBpbnNwZWN0LgorICogT3V0CisgKgkwID0gTm8gYWRhcHRlciBwcmVzZW50LgorICoJMSA9IEZvdW5kIGFkYXB0ZXIuCisgKgorICogUHNldWRvCisgKiAgICAgIFJlYWQgRUlTQSBJRAorICoJZm9yIGFsbCB2YWxpZCBPRU1fSURzCisgKgkJY29tcGFyZSB3aXRoIElEIHJlYWQKKyAqCQlpZiBlcXVhbCwgcmV0dXJuIDEKKyAqCXJldHVybigwCisgKgorICogTm90ZQorICoJVGhlIHNtYyBwb2ludGVyIG11c3QgYmUgdmFsaWQgbm93LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZXhpc3RfYm9hcmQoc3RydWN0IHNfc21jICpzbWMsIGludCBzbG90KQoreworCWludCBpIDsKKyNpZmRlZiBNVUxUX09FTQorCVNLX0xPQ19ERUNMKHVfY2hhcixpZFs0XSkgOworI2VuZGlmCS8qIE1VTFRfT0VNICovCisKKwkvKiBObyBsb25nZXIgdmFsaWQuICovCisJaWYgKHNtYyA9PSBOVUxMKQorCQlyZXR1cm4oMCk7CisKKwlTS19VTlVTRUQoc2xvdCkgOworCisjaWZuZGVmIE1VTFRfT0VNCisJZm9yIChpID0gMCA7IGkgPCA0IDsgaSsrKSB7CisJCWlmIChpbnAoU0FERFIoc2xvdCkrUFJBKGkpKSAhPSBPRU1JRChzbWMsaSkpCisJCQlyZXR1cm4oMCkgOworCX0KKwlyZXR1cm4oMSkgOworI2Vsc2UJLyogTVVMVF9PRU0gKi8KKwlmb3IgKGkgPSAwIDsgaSA8IDQgOyBpKyspCisJCWlkW2ldID0gaW5wKFNBRERSKHNsb3QpK1BSQShpKSkgOworCisJc21jLT5ody5vZW1faWQgPSAoc3RydWN0IHNfb2VtX2lkcyAqKSAmb2VtX2lkc1swXSA7CisKKwlmb3IgKDsgc21jLT5ody5vZW1faWQtPm9pX3N0YXR1cyAhPSBPSV9TVEFUX0xBU1Q7IHNtYy0+aHcub2VtX2lkKyspIHsKKwkJaWYgKHNtYy0+aHcub2VtX2lkLT5vaV9zdGF0dXMgPCBzbWMtPmh3Lm9lbV9taW5fc3RhdHVzKQorCQkJY29udGludWUgOworCisJCWlmIChpc19lcXVhbF9udW0oJmlkWzBdLCZPRU1JRChzbWMsMCksNCkpCisJCQlyZXR1cm4gKDEpIDsKKwl9CisJcmV0dXJuICgwKSA7CS8qIE5vIGFkYXB0ZXIgZm91bmQuICovCisjZW5kaWYJLyogTVVMVF9PRU0gKi8KK30KKworCitpbnQgZ2V0X2JvYXJkX3BhcmEoc3RydWN0IHNfc21jICpzbWMsIGludCBzbG90KQoreworCWludAlpIDsKKworCWlmICghZXhpc3RfYm9hcmQoc21jLHNsb3QpKQorCQlyZXR1cm4oMCkgOworCisJc21jLT5ody5zbG90ID0gc2xvdCA7CisjaWZuZGVmCU1FTV9NQVBQRURfSU8JCS8qIGlmIGRlZmluZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gKi8KKwlzbWMtPmh3LmlvcCA9IFNBRERSKHNsb3QpIDsKKyNlbmRpZgorCisJaWYgKCEoaW5wKEMwX0EoMCkpJkNGR19DQVJEX0VOKSkgeworCQlyZXR1cm4oMikgOwkJCS8qIENGR19DQVJEX0VOIGJpdCBub3Qgc2V0ISAqLworCX0KKworCXNtYy0+aHcuaXJxID0gb3B0X2ludHNbKGlucChDMV9BKDApKSAmIENGR19JUlFfU0VMKV0gOworCXNtYy0+aHcuZG1hID0gb3B0X2RtYXNbKChpbnAoQzFfQSgwKSkgJiBDRkdfRFJRX1NFTCk+PjMpXSA7CisKKwlpZiAoKGkgPSBpbnAoQzJfQSgwKSkgJiBDRkdfRVBST01fU0VMKSAhPSAweDBmKQorCQlzbWMtPmh3LmVwcm9tID0gb3B0X2Vwcm9tc1tpXSA7CisJZWxzZQorCQlzbWMtPmh3LmVwcm9tID0gMCA7CisKKwlzbWMtPmh3LkRtYVdyaXRlRXh0cmFCeXRlcyA9IDggOworCisJcmV0dXJuKDEpIDsKK30KKyNlbmRpZgkvKiBFSVNBICovCisKKyNpZmRlZglJU0EKKyNpZm5kZWYgTVVMVF9PRU0KK2NvbnN0IHVfY2hhciBza2xvZ29bNl0gPSBTS0xPR09fU1RSIDsKKyNkZWZpbmUJU0laRV9TS0xPR08oc21jKQlzaXplb2Yoc2tsb2dvKQorI2RlZmluZQlTS0xPR08oc21jLGkpCQlza2xvZ29baV0KKyNlbHNlCS8qIE1VTFRfT0VNICovCisjZGVmaW5lCVNJWkVfU0tMT0dPKHNtYykJc21jLT5ody5vZW1faWQtPm9pX2xvZ29fbGVuCisjZGVmaW5lCVNLTE9HTyhzbWMsaSkJCXNtYy0+aHcub2VtX2lkLT5vaV9sb2dvW2ldCisjZW5kaWYJLyogTVVMVF9PRU0gKi8KKworCitpbnQgZXhpc3RfYm9hcmQoc3RydWN0IHNfc21jICpzbWMsIEhXX1BUUiBwb3J0KQoreworCWludAlpIDsKKyNpZmRlZiBNVUxUX09FTQorCWludAlieXRlc19yZWFkIDsKKwl1X2NoYXIJYm9hcmRfbG9nb1sxNV0gOworCVNLX0xPQ19ERUNMKHVfY2hhcixpZFs0XSkgOworI2VuZGlmCS8qIE1VTFRfT0VNICovCisKKwkvKiBObyBsb25nZXIgdmFsaWQuICovCisJaWYgKHNtYyA9PSBOVUxMKQorCQlyZXR1cm4oMCk7CisKKwlTS19VTlVTRUQoc21jKSA7CisjaWZuZGVmIE1VTFRfT0VNCisJZm9yIChpID0gU0FERFJMIDsgaSA8IChzaWduZWQpIChTQUREUkwrU0laRV9TS0xPR08oc21jKSkgOyBpKyspIHsKKwkJaWYgKCh1X2NoYXIpaW5wdygoUFJBKGkpK3BvcnQpKSAhPSBTS0xPR08oc21jLGktU0FERFJMKSkgeworCQkJcmV0dXJuKDApIDsKKwkJfQorCX0KKworCS8qIGNoZWNrIE1BQyBhZGRyZXNzIChTJksgb3Igb3RoZXIpICovCisJZm9yIChpID0gMCA7IGkgPCAzIDsgaSsrKSB7CisJCWlmICgodV9jaGFyKWlucHcoKFBSQShpKStwb3J0KSkgIT0gT0VNSUQoc21jLGkpKQorCQkJcmV0dXJuKDApIDsKKwl9CisJcmV0dXJuKDEpIDsKKyNlbHNlCS8qIE1VTFRfT0VNICovCisgICAgICAgIHNtYy0+aHcub2VtX2lkID0gKHN0cnVjdCBzX29lbV9pZHMgKikgICZvZW1faWRzWzBdIDsKKwlib2FyZF9sb2dvWzBdID0gKHVfY2hhcilpbnB3KChQUkEoU0FERFJMKStwb3J0KSkgOworCWJ5dGVzX3JlYWQgPSAxIDsKKworCWZvciAoOyBzbWMtPmh3Lm9lbV9pZC0+b2lfc3RhdHVzICE9IE9JX1NUQVRfTEFTVDsgc21jLT5ody5vZW1faWQrKykgeworCQlpZiAoc21jLT5ody5vZW1faWQtPm9pX3N0YXR1cyA8IHNtYy0+aHcub2VtX21pbl9zdGF0dXMpCisJCQljb250aW51ZSA7CisKKwkJLyogVGVzdCBhbGwgcmVhZCBieXRlcyB3aXRoIGN1cnJlbnQgT0VNX2VudHJ5ICovCisJCS8qIGZvciAoaT0wOyAoaTxieXRlc19yZWFkKSAmJiAoaSA8IFNJWkVfU0tMT0dPKHNtYykpOyBpKyspIHsgKi8KKwkJZm9yIChpID0gMDsgaSA8IGJ5dGVzX3JlYWQ7IGkrKykgeworCQkJaWYgKGJvYXJkX2xvZ29baV0gIT0gU0tMT0dPKHNtYyxpKSkKKwkJCQlicmVhayA7CisJCX0KKworCQkvKiBJZiBtaXNtYXRjaCwgc3dpdGNoIHRvIG5leHQgT0VNIGVudHJ5ICovCisJCWlmICgoYm9hcmRfbG9nb1tpXSAhPSBTS0xPR08oc21jLGkpKSAmJiAoaSA8IGJ5dGVzX3JlYWQpKQorCQkJY29udGludWUgOworCisJCS0taSA7CisJCXdoaWxlIChieXRlc19yZWFkIDwgU0laRV9TS0xPR08oc21jKSkgeworCQkJLy8gICBpbnB3IG5leHQgYnl0ZSBTS19Mb2dvCisJCQlpKysgOworCQkJYm9hcmRfbG9nb1tpXSA9ICh1X2NoYXIpaW5wdygoUFJBKFNBRERSTCtpKStwb3J0KSkgOworCQkJYnl0ZXNfcmVhZCsrIDsKKwkJCWlmIChib2FyZF9sb2dvW2ldICE9IFNLTE9HTyhzbWMsaSkpCisJCQkJYnJlYWsgOworCQl9CisKKwkJZm9yIChpID0gMCA7IGkgPCAzIDsgaSsrKQorCQkJaWRbaV0gPSAodV9jaGFyKWlucHcoKFBSQShpKStwb3J0KSkgOworCisJCWlmICgoYm9hcmRfbG9nb1tpXSA9PSBTS0xPR08oc21jLGkpKQorCQkJJiYgKGJ5dGVzX3JlYWQgPT0gU0laRV9TS0xPR08oc21jKSkpIHsKKworCQkJaWYgKGlzX2VxdWFsX251bSgmaWRbMF0sJk9FTUlEKHNtYywwKSwzKSkKKwkJCQlyZXR1cm4oMSk7CisJCX0KKwl9CS8qIGZvciAqLworCXJldHVybigwKSA7CisjZW5kaWYJLyogTVVMVF9PRU0gKi8KK30KKworaW50IGdldF9ib2FyZF9wYXJhKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgc2xvdCkKK3sKKwlTS19VTlVTRUQoc21jKSA7CisJU0tfVU5VU0VEKHNsb3QpIDsKKwlyZXR1cm4oMCkgOwkvKiBmb3IgSVNBIG5vdCBzdXBwb3J0ZWQgKi8KK30KKyNlbmRpZgkvKiBJU0EgKi8KKworI2lmZGVmIFBDSQorI2lmZGVmIFVTRV9CSU9TX0ZVTgoraW50IGV4aXN0X2JvYXJkKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgc2xvdCkKK3sKKwl1X3Nob3J0IGRldl9pZCA7CisJdV9zaG9ydCB2ZW5faWQgOworCWludCBmb3VuZCA7IAorCWludCBpIDsKKworCWZvdW5kID0gRkFMU0UgOwkJLyogbWFrZSBzdXJlIHdlIHJldHVybmVkIHdpdGggYWRhdHBlciBub3QgZm91bmQqLworCQkJCS8qIGlmIGFuIGVtcHR5IG9lbWlkcy5oIHdhcyBpbmNsdWRlZCAqLworCisjaWZkZWYgTVVMVF9PRU0KKyAgICAgICAgc21jLT5ody5vZW1faWQgPSAoc3RydWN0IHNfb2VtX2lkcyAqKSAmb2VtX2lkc1swXSA7CisJZm9yICg7IHNtYy0+aHcub2VtX2lkLT5vaV9zdGF0dXMgIT0gT0lfU1RBVF9MQVNUOyBzbWMtPmh3Lm9lbV9pZCsrKSB7CisJCWlmIChzbWMtPmh3Lm9lbV9pZC0+b2lfc3RhdHVzIDwgc21jLT5ody5vZW1fbWluX3N0YXR1cykKKwkJCWNvbnRpbnVlIDsKKyNlbmRpZgorCQl2ZW5faWQgPSBPRU1JRChzbWMsMCkgKyAoT0VNSUQoc21jLDEpIDw8IDgpIDsgCisJCWRldl9pZCA9IE9FTUlEKHNtYywyKSArIChPRU1JRChzbWMsMykgPDwgOCkgOyAKKwkJZm9yIChpID0gMDsgaSA8IHNsb3Q7IGkrKykgeworCQkJaWYgKHBjaV9maW5kX2RldmljZShpLCZzbWMtPmh3LnBjaV9oYW5kbGUsCisJCQkJZGV2X2lkLHZlbl9pZCkgIT0gMCkgeworCisJCQkJZm91bmQgPSBGQUxTRSA7CisJCQl9IGVsc2UgeworCQkJCWZvdW5kID0gVFJVRSA7CisJCQl9CisJCX0KKwkJaWYgKGZvdW5kKSB7CisJCQlyZXR1cm4oMSkgOwkvKiBhZGFwdGVyIHdhcyBmb3VuZCAqLworCQl9CisjaWZkZWYgTVVMVF9PRU0KKwl9CisjZW5kaWYKKwlyZXR1cm4oMCkgOwkvKiBhZGFwdGVyIHdhcyBub3QgZm91bmQgKi8KK30KKyNlbmRpZgkvKiBQQ0kgKi8KKyNlbmRpZgkvKiBVU0VfQklPU19GVU5DICovCisKK3ZvaWQgZHJpdmVyX2dldF9iaWEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBmZGRpX2FkZHIgKmJpYV9hZGRyKQoreworCWludCBpIDsKKworCWV4dGVybiBjb25zdCB1X2NoYXIgY2Fub25pY2FsWzI1Nl0gOworCisJZm9yIChpID0gMCA7IGkgPCA2IDsgaSsrKSB7CisJCWJpYV9hZGRyLT5hW2ldID0gY2Fub25pY2FsW3NtYy0+aHcuZmRkaV9waHlzX2FkZHIuYVtpXV0gOworCX0KK30KKwordm9pZCBzbXRfc3RhcnRfd2F0Y2hkb2coc3RydWN0IHNfc21jICpzbWMpCit7CisJU0tfVU5VU0VEKHNtYykgOwkvKiBNYWtlIExJTlQgaGFwcHkuICovCisKKyNpZm5kZWYJREVCVUcKKworI2lmZGVmCVBDSQorCWlmIChzbWMtPmh3Lndkb2dfdXNlZCkgeworCQlvdXRwdyhBRERSKEIyX1dET0dfQ1JUTCksVElNX1NUQVJUKSA7CS8qIFN0YXJ0IHRpbWVyLiAqLworCX0KKyNlbmRpZgorCisjZW5kaWYJLyogREVCVUcgKi8KK30KKwordm9pZCBzbXRfc3RvcF93YXRjaGRvZyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlTS19VTlVTRUQoc21jKSA7CS8qIE1ha2UgTElOVCBoYXBweS4gKi8KKyNpZm5kZWYJREVCVUcKKworI2lmZGVmCVBDSQorCWlmIChzbWMtPmh3Lndkb2dfdXNlZCkgeworCQlvdXRwdyhBRERSKEIyX1dET0dfQ1JUTCksVElNX1NUT1ApIDsJLyogU3RvcCB0aW1lci4gKi8KKwl9CisjZW5kaWYKKworI2VuZGlmCS8qIERFQlVHICovCit9CisKKyNpZmRlZglQQ0kKK3N0YXRpYyBjaGFyIGdldF9yb21fYnl0ZShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9zaG9ydCBhZGRyKQoreworCUdFVF9QQUdFKGFkZHIpIDsKKwlyZXR1cm4gKFJFQURfUFJPTShBRERSKEIyX0ZEUCkpKSA7Cit9CisKKy8qCisgKiBST00gaW1hZ2UgZGVmaW5lcworICovCisjZGVmaW5lCVJPTV9TSUdfMQkwCisjZGVmaW5lIFJPTV9TSUdfMgkxCisjZGVmaW5lIFBDSV9EQVRBXzEJMHgxOAorI2RlZmluZSBQQ0lfREFUQV8yCTB4MTkKKworLyoKKyAqIFBDSSBkYXRhIHN0cnVjdHVyZSBkZWZpbmVzCisgKi8KKyNkZWZpbmUJVlBEX0RBVEFfMQkweDA4CisjZGVmaW5lCVZQRF9EQVRBXzIJMHgwOQorI2RlZmluZSBJTUFHRV9MRU5fMQkweDEwCisjZGVmaW5lIElNQUdFX0xFTl8yCTB4MTEKKyNkZWZpbmUJQ09ERV9UWVBFCTB4MTQKKyNkZWZpbmUJSU5ESUNBVE9SCTB4MTUKKworLyoKKyAqCUJFR0lOX01BTlVBTF9FTlRSWShtYWNfZHJ2X3ZwZF9yZWFkKQorICoJbWFjX2Rydl92cGRfcmVhZChzbWMsYnVmLHNpemUsaW1hZ2UpCisgKgorICogZnVuY3Rpb24JRE9XTkNBTEwJKEZERElXQVJFKQorICoJCXJlYWRzIHRoZSBWUEQgZGF0YSBvZiB0aGUgRlBST00gYW5kIHdyaXRlcyBpdCBpbnRvIHRoZQorICoJCWJ1ZmZlcgorICoKKyAqIHBhcmEJYnVmCXBvaW50cyB0byB0aGUgYnVmZmVyIGZvciB0aGUgVlBEIGRhdGEKKyAqCXNpemUJc2l6ZSBvZiB0aGUgVlBEIGRhdGEgYnVmZmVyCisgKglpbWFnZQlib290IGltYWdlOyBjb2RlIHR5cGUgb2YgdGhlIGJvb3QgaW1hZ2UKKyAqCQlpbWFnZSA9IDAJSW50ZWwgeDg2LCBQQy1BVCBjb21wYXRpYmxlCisgKgkJCTEJT1BFTkJPT1Qgc3RhbmRhcmQgZm9yIFBDSQorICoJCQkyLUZGCXJlc2VydmVkCisgKgorICogcmV0dXJucwlsZW4JbnVtYmVyIG9mIFZQRCBkYXRhIGJ5dGVzIHJlYWQgZm9ybSB0aGUgRlBST00KKyAqCQk8MAludW1iZXIgb2YgcmVhZCBieXRlcworICoJCT4wCWVycm9yOiBkYXRhIGludmFsaWQKKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KK2ludCBtYWNfZHJ2X3ZwZF9yZWFkKHN0cnVjdCBzX3NtYyAqc21jLCBjaGFyICpidWYsIGludCBzaXplLCBjaGFyIGltYWdlKQoreworCXVfc2hvcnQJaWJhc2UgOworCXVfc2hvcnQgcGNpX2Jhc2UgOworCXVfc2hvcnQgdnBkIDsKKwlpbnQJbGVuIDsKKworCWxlbiA9IDAgOworCWliYXNlID0gMCA7CisJLyoKKwkgKiBhcyBsb25nIGltYWdlcyBkZWZpbmVkCisJICovCisJd2hpbGUgKGdldF9yb21fYnl0ZShzbWMsaWJhc2UrUk9NX1NJR18xKSA9PSAweDU1ICYmCisJCSh1X2NoYXIpIGdldF9yb21fYnl0ZShzbWMsaWJhc2UrUk9NX1NJR18yKSA9PSAweGFhKSB7CisJCS8qCisJCSAqIGdldCB0aGUgcG9pbnRlciB0byB0aGUgUENJIGRhdGEgc3RydWN0dXJlCisJCSAqLworCQlwY2lfYmFzZSA9IGliYXNlICsgZ2V0X3JvbV9ieXRlKHNtYyxpYmFzZStQQ0lfREFUQV8xKSArCisJCQkJKGdldF9yb21fYnl0ZShzbWMsaWJhc2UrUENJX0RBVEFfMikgPDwgOCkgOworCisJCWlmIChpbWFnZSA9PSBnZXRfcm9tX2J5dGUoc21jLHBjaV9iYXNlK0NPREVfVFlQRSkpIHsKKwkJCS8qCisJCQkgKiB3ZSBoYXZlIHRoZSByaWdodCBpbWFnZSwgcmVhZCB0aGUgVlBEIGRhdGEKKwkJCSAqLworCQkJdnBkID0gaWJhc2UgKyBnZXRfcm9tX2J5dGUoc21jLHBjaV9iYXNlK1ZQRF9EQVRBXzEpICsKKwkJCQkoZ2V0X3JvbV9ieXRlKHNtYyxwY2lfYmFzZStWUERfREFUQV8yKSA8PCA4KSA7CisJCQlpZiAodnBkID09IGliYXNlKSB7CisJCQkJYnJlYWsgOwkJLyogbm8gVlBEIGRhdGEgKi8KKwkJCX0KKwkJCWZvciAobGVuID0gMDsgbGVuIDwgc2l6ZTsgbGVuKyssYnVmKyssdnBkKyspIHsKKwkJCQkqYnVmID0gZ2V0X3JvbV9ieXRlKHNtYyx2cGQpIDsKKwkJCX0KKwkJCWJyZWFrIDsKKwkJfQorCQllbHNlIHsKKwkJCS8qCisJCQkgKiB0cnkgdGhlIG5leHQgaW1hZ2UKKwkJCSAqLworCQkJaWYgKGdldF9yb21fYnl0ZShzbWMscGNpX2Jhc2UrSU5ESUNBVE9SKSAmIDB4ODApIHsKKwkJCQlicmVhayA7CQkvKiB0aGlzIHdhcyB0aGUgbGFzdCBpbWFnZSAqLworCQkJfQorCQkJaWJhc2UgPSBpYmFzZSArIGdldF9yb21fYnl0ZShzbWMsaWJhc2UrSU1BR0VfTEVOXzEpICsKKwkJCQkoZ2V0X3JvbV9ieXRlKHNtYyxpYmFzZStJTUFHRV9MRU5fMikgPDwgOCkgOworCQl9CisJfQorCisJcmV0dXJuKGxlbikgOworfQorCit2b2lkIG1hY19kcnZfcGNpX2ZpeChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIGZpeF92YWx1ZSkKK3sKKwlzbWMtPmh3LnBjaV9maXhfdmFsdWUgPSBmaXhfdmFsdWUgOworfQorCit2b2lkIG1hY19kb19wY2lfZml4KHN0cnVjdCBzX3NtYyAqc21jKQoreworCVNLX1VOVVNFRChzbWMpIDsKK30KKyNlbmRpZgkvKiBQQ0kgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9lY20uYyBiL2RyaXZlcnMvbmV0L3NrZnAvZWNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkOTIyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvZWNtLmMKQEAgLTAsMCArMSw1MzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglTZWUgdGhlIGZpbGUgInNrZmRkaS5jIiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisJU01UIEVDTQorCUVudGl0eSBDb29yZGluYXRpb24gTWFuYWdlbWVudAorCUhhcmR3YXJlIGluZGVwZW5kZW50IHN0YXRlIG1hY2hpbmUKKyovCisKKy8qCisgKiBIYXJkd2FyZSBpbmRlcGVuZGVudCBzdGF0ZSBtYWNoaW5lIGltcGxlbWFudGF0aW9uCisgKiBUaGUgZm9sbG93aW5nIGV4dGVybmFsIFNNVCBmdW5jdGlvbnMgYXJlIHJlZmVyZW5jZWQgOgorICoKKyAqIAkJcXVldWVfZXZlbnQoKQorICogCQlzbXRfdGltZXJfc3RhcnQoKQorICogCQlzbXRfdGltZXJfc3RvcCgpCisgKgorICogCVRoZSBmb2xsb3dpbmcgZXh0ZXJuYWwgSFcgZGVwZW5kZW50IGZ1bmN0aW9ucyBhcmUgcmVmZXJlbmNlZCA6CisgKiAJCXNtX3BtX2J5cGFzc19yZXEoKQorICogCQlzbV9wbV9sc19sYXRjaCgpCisgKiAJCXNtX3BtX2dldF9scygpCisgKiAKKyAqIAlUaGUgZm9sbG93aW5nIEhXIGRlcGVuZGVudCBldmVudHMgYXJlIHJlcXVpcmVkIDoKKyAqCQlOT05FCisgKgorICovCisKKyNpbmNsdWRlICJoL3R5cGVzLmgiCisjaW5jbHVkZSAiaC9mZGRpLmgiCisjaW5jbHVkZSAiaC9zbWMuaCIKKworI2RlZmluZSBLRVJORUwKKyNpbmNsdWRlICJoL3NtdHN0YXRlLmgiCisKKyNpZm5kZWYJbGludAorc3RhdGljIGNvbnN0IGNoYXIgSURfc2Njc1tdID0gIkAoIyllY20uYwkyLjcgOTkvMDgvMDUgKEMpIFNLICIgOworI2VuZGlmCisKKy8qCisgKiBGU00gTWFjcm9zCisgKi8KKyNkZWZpbmUgQUZMQUcJMHgxMAorI2RlZmluZSBHT19TVEFURSh4KQkoc21jLT5taWIuZmRkaVNNVEVDTVN0YXRlID0gKHgpfEFGTEFHKQorI2RlZmluZSBBQ1RJT05TX0RPTkUoKQkoc21jLT5taWIuZmRkaVNNVEVDTVN0YXRlICY9IH5BRkxBRykKKyNkZWZpbmUgQUNUSU9OUyh4KQkoeHxBRkxBRykKKworI2RlZmluZSBFQzBfT1VUCQkwCQkJLyogbm90IGluc2VydGVkICovCisjZGVmaW5lIEVDMV9JTgkJMQkJCS8qIGluc2VydGVkICovCisjZGVmaW5lIEVDMl9UUkFDRQkyCQkJLyogdHJhY2luZyAqLworI2RlZmluZSBFQzNfTEVBVkUJMwkJCS8qIGxlYXZpbmcgdGhlIHJpbmcgKi8KKyNkZWZpbmUgRUM0X1BBVEhfVEVTVAk0CQkJLyogcGVyZm9ybWluZyBwYXRoIHRlc3QgKi8KKyNkZWZpbmUgRUM1X0lOU0VSVAk1CQkJLyogYnlwYXNzIGJlaW5nIHR1cm5lZCBvbiAqLworI2RlZmluZSBFQzZfQ0hFQ0sJNgkJCS8qIGNoZWNraW5nIGJ5cGFzcyAqLworI2RlZmluZSBFQzdfREVJTlNFUlQJNwkJCS8qIGJ5cGFzcyBiZWluZyB0dXJuZGUgb2ZmICovCisKKyNpZmRlZglERUJVRworLyoKKyAqIHN5bWJvbGljIHN0YXRlIG5hbWVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZWNtX3N0YXRlc1tdID0geworCSJFQzBfT1VUIiwiRUMxX0lOIiwiRUMyX1RSQUNFIiwiRUMzX0xFQVZFIiwiRUM0X1BBVEhfVEVTVCIsCisJIkVDNV9JTlNFUlQiLCJFQzZfQ0hFQ0siLCJFQzdfREVJTlNFUlQiCit9IDsKKworLyoKKyAqIHN5bWJvbGljIGV2ZW50IG5hbWVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZWNtX2V2ZW50c1tdID0geworCSJOT05FIiwiRUNfQ09OTkVDVCIsIkVDX0RJU0NPTk5FQ1QiLCJFQ19UUkFDRV9QUk9QIiwiRUNfUEFUSF9URVNUIiwKKwkiRUNfVElNRU9VVF9URCIsIkVDX1RJTUVPVVRfVE1BWCIsCisJIkVDX1RJTUVPVVRfSU1BWCIsIkVDX1RJTUVPVVRfSU5NQVgiLCJFQ19URVNUX0RPTkUiCit9IDsKKyNlbmRpZgorCisvKgorICogYWxsIEdsb2JhbHMgIGFyZSBkZWZpbmVkIGluIHNtYy5oCisgKiBzdHJ1Y3Qgc19lY20KKyAqLworCisvKgorICogZnVuY3Rpb24gZGVjbGFyYXRpb25zCisgKi8KKworc3RhdGljIHZvaWQgZWNtX2ZzbShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGNtZCk7CitzdGF0aWMgdm9pZCBzdGFydF9lY21fdGltZXIoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyB2YWx1ZSwgaW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkIHN0b3BfZWNtX3RpbWVyKHN0cnVjdCBzX3NtYyAqc21jKTsKK3N0YXRpYyB2b2lkIHByb3BfYWN0aW9ucyhzdHJ1Y3Qgc19zbWMgKnNtYyk7CisKKy8qCisJaW5pdCBFQ00gc3RhdGUgbWFjaGluZQorCWNsZWFyIGFsbCBFQ00gdmFycyBhbmQgZmxhZ3MKKyovCit2b2lkIGVjbV9pbml0KHN0cnVjdCBzX3NtYyAqc21jKQoreworCXNtYy0+ZS5wYXRoX3Rlc3QgPSBQVF9QQVNTRUQgOworCXNtYy0+ZS50cmFjZV9wcm9wID0gMCA7CisJc21jLT5lLnNiX2ZsYWcgPSAwIDsKKwlzbWMtPm1pYi5mZGRpU01URUNNU3RhdGUgPSBBQ1RJT05TKEVDMF9PVVQpIDsKKwlzbWMtPmUuZWNtX2xpbmVfc3RhdGUgPSBGQUxTRSA7Cit9CisKKy8qCisJRUNNIHN0YXRlIG1hY2hpbmUKKwljYWxsZWQgYnkgZGlzcGF0Y2hlcgorCisJZG8KKwkJZGlzcGxheSBzdGF0ZSBjaGFuZ2UKKwkJcHJvY2VzcyBldmVudAorCXVudGlsIFNNIGlzIHN0YWJsZQorKi8KK3ZvaWQgZWNtKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZXZlbnQpCit7CisJaW50CXN0YXRlIDsKKworCWRvIHsKKwkJREJfRUNNKCJFQ00gOiBzdGF0ZSAlcyVzIiwKKwkJCShzbWMtPm1pYi5mZGRpU01URUNNU3RhdGUgJiBBRkxBRykgPyAiQUNUSU9OUyAiIDogIiIsCisJCQllY21fc3RhdGVzW3NtYy0+bWliLmZkZGlTTVRFQ01TdGF0ZSAmIH5BRkxBR10pIDsKKwkJREJfRUNNKCIgZXZlbnQgJXNcbiIsZWNtX2V2ZW50c1tldmVudF0sMCkgOworCQlzdGF0ZSA9IHNtYy0+bWliLmZkZGlTTVRFQ01TdGF0ZSA7CisJCWVjbV9mc20oc21jLGV2ZW50KSA7CisJCWV2ZW50ID0gMCA7CisJfSB3aGlsZSAoc3RhdGUgIT0gc21jLT5taWIuZmRkaVNNVEVDTVN0YXRlKSA7CisJZWNtX3N0YXRlX2NoYW5nZShzbWMsKGludClzbWMtPm1pYi5mZGRpU01URUNNU3RhdGUpIDsKK30KKworLyoKKwlwcm9jZXNzIEVDTSBldmVudAorKi8KK3N0YXRpYyB2b2lkIGVjbV9mc20oc3RydWN0IHNfc21jICpzbWMsIGludCBjbWQpCit7CisJaW50IGxzX2EgOwkJCS8qIGN1cnJlbnQgbGluZSBzdGF0ZSBQSFkgQSAqLworCWludCBsc19iIDsJCQkvKiBjdXJyZW50IGxpbmUgc3RhdGUgUEhZIEIgKi8KKwlpbnQJcCA7CQkJLyogcG9ydHMgKi8KKworCisJc21jLT5taWIuZmRkaVNNVEJ5cGFzc1ByZXNlbnQgPSBzbV9wbV9ieXBhc3NfcHJlc2VudChzbWMpIDsKKwlpZiAoY21kID09IEVDX0NPTk5FQ1QpCisJCXNtYy0+bWliLmZkZGlTTVRSZW1vdGVEaXNjb25uZWN0RmxhZyA9IEZBTFNFIDsKKworCS8qIEZvciBBSVggZXZlbnQgbm90aWZpY2F0aW9uOiAqLworCS8qIElzIGEgZGlzY29ubmVjdCAgY29tbWFuZCByZW1vdGVseSBpc3N1ZWQgPyAqLworCWlmIChjbWQgPT0gRUNfRElTQ09OTkVDVCAmJgorCQlzbWMtPm1pYi5mZGRpU01UUmVtb3RlRGlzY29ubmVjdEZsYWcgPT0gVFJVRSkKKwkJQUlYX0VWRU5UIChzbWMsICh1X2xvbmcpIENJT19IQVJEX0ZBSUwsICh1X2xvbmcpCisJCQlGRERJX1JFTU9URV9ESVNDT05ORUNULCBzbXRfZ2V0X2V2ZW50X3dvcmQoc21jKSwKKwkJCXNtdF9nZXRfZXJyb3Jfd29yZChzbWMpICk7CisKKwkvKmpkIDA1LUF1Zy0xOTk5IEJ1ZyAjMTA0MTkgIlBvcnQgRGlzY29ubmVjdCBmYWlscyBhdCBEdXAgTUFjIENvbmQuIiovCisJaWYgKGNtZCA9PSBFQ19DT05ORUNUKSB7CisJCXNtYy0+ZS5EaXNjb25uZWN0RmxhZyA9IEZBTFNFIDsKKwl9CisJZWxzZSBpZiAoY21kID09IEVDX0RJU0NPTk5FQ1QpIHsKKwkJc21jLT5lLkRpc2Nvbm5lY3RGbGFnID0gVFJVRSA7CisJfQorCQorCXN3aXRjaChzbWMtPm1pYi5mZGRpU01URUNNU3RhdGUpIHsKKwljYXNlIEFDVElPTlMoRUMwX09VVCkgOgorCQkvKgorCQkgKiBXZSBkbyBub3QgcGVyZm9ybSBhIHBhdGggdGVzdAorCQkgKi8KKwkJc21jLT5lLnBhdGhfdGVzdCA9IFBUX1BBU1NFRCA7CisJCXNtYy0+ZS5lY21fbGluZV9zdGF0ZSA9IEZBTFNFIDsKKwkJc3RvcF9lY21fdGltZXIoc21jKSA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWsgOworCWNhc2UgRUMwX09VVDoKKwkJLypFQzAxKi8KKwkJaWYgKGNtZCA9PSBFQ19DT05ORUNUICYmICFzbWMtPm1pYi5mZGRpU01UQnlwYXNzUHJlc2VudAorCQkJJiYgc21jLT5lLnBhdGhfdGVzdD09UFRfUEFTU0VEKSB7CisJCQlHT19TVEFURShFQzFfSU4pIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKkVDMDUqLworCQllbHNlIGlmIChjbWQgPT0gRUNfQ09OTkVDVCAmJiAoc21jLT5lLnBhdGhfdGVzdD09UFRfUEFTU0VEKSAmJgorCQkJc21jLT5taWIuZmRkaVNNVEJ5cGFzc1ByZXNlbnQgJiYKKwkJCShzbWMtPnMuc2FzID09IFNNVF9EQVMpKSB7CisJCQlHT19TVEFURShFQzVfSU5TRVJUKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBQ1RJT05TKEVDMV9JTikgOgorCQlzdG9wX2VjbV90aW1lcihzbWMpIDsKKwkJc21jLT5lLnRyYWNlX3Byb3AgPSAwIDsKKwkJc21fbWFfY29udHJvbChzbWMsTUFfVFJFUSkgOworCQlmb3IgKHAgPSAwIDsgcCA8IE5VTVBIWVMgOyBwKyspCisJCQlpZiAoc21jLT5taWIucFtwXS5mZGRpUE9SVEhhcmR3YXJlUHJlc2VudCkKKwkJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNQStwLFBDX1NUQVJUKSA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWsgOworCWNhc2UgRUMxX0lOOgorCQkvKkVDMTIqLworCQlpZiAoY21kID09IEVDX1RSQUNFX1BST1ApIHsKKwkJCXByb3BfYWN0aW9ucyhzbWMpIDsKKwkJCUdPX1NUQVRFKEVDMl9UUkFDRSkgOworCQkJYnJlYWsgOworCQl9CisJCS8qRUMxMyovCisJCWVsc2UgaWYgKGNtZCA9PSBFQ19ESVNDT05ORUNUKSB7CisJCQlHT19TVEFURShFQzNfTEVBVkUpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlicmVhazsKKwljYXNlIEFDVElPTlMoRUMyX1RSQUNFKSA6CisJCXN0YXJ0X2VjbV90aW1lcihzbWMsTUlCMlVTKHNtYy0+bWliLmZkZGlTTVRUcmFjZV9NYXhFeHBpcmF0aW9uKSwKKwkJCUVDX1RJTUVPVVRfVE1BWCkgOworCQlBQ1RJT05TX0RPTkUoKSA7CisJCWJyZWFrIDsKKwljYXNlIEVDMl9UUkFDRSA6CisJCS8qRUMyMiovCisJCWlmIChjbWQgPT0gRUNfVFJBQ0VfUFJPUCkgeworCQkJcHJvcF9hY3Rpb25zKHNtYykgOworCQkJR09fU1RBVEUoRUMyX1RSQUNFKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypFQzIzYSovCisJCWVsc2UgaWYgKGNtZCA9PSBFQ19ESVNDT05ORUNUKSB7CisJCQlzbWMtPmUucGF0aF90ZXN0ID0gUFRfRVhJVElORyA7CisJCQlHT19TVEFURShFQzNfTEVBVkUpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKkVDMjNiKi8KKwkJZWxzZSBpZiAoc21jLT5lLnBhdGhfdGVzdCA9PSBQVF9QRU5ESU5HKSB7CisJCQlHT19TVEFURShFQzNfTEVBVkUpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKkVDMjNjKi8KKwkJZWxzZSBpZiAoY21kID09IEVDX1RJTUVPVVRfVE1BWCkgeworCQkJLyogVHJhY2VfTWF4IGlzIGV4cGlyZWQgKi8KKwkJCS8qIC0+IHNlbmQgQUlYX0VWRU5UICovCisJCQlBSVhfRVZFTlQoc21jLCAodV9sb25nKSBGRERJX1JJTkdfU1RBVFVTLAorCQkJCSh1X2xvbmcpIEZERElfU01UX0VSUk9SLCAodV9sb25nKQorCQkJCUZERElfVFJBQ0VfTUFYLCBzbXRfZ2V0X2Vycm9yX3dvcmQoc21jKSk7CisJCQlzbWMtPmUucGF0aF90ZXN0ID0gUFRfUEVORElORyA7CisJCQlHT19TVEFURShFQzNfTEVBVkUpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSBBQ1RJT05TKEVDM19MRUFWRSkgOgorCQlzdGFydF9lY21fdGltZXIoc21jLHNtYy0+cy5lY21fdGRfbWluLEVDX1RJTUVPVVRfVEQpIDsKKwkJZm9yIChwID0gMCA7IHAgPCBOVU1QSFlTIDsgcCsrKQorCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1BDTUErcCxQQ19TVE9QKSA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWsgOworCWNhc2UgRUMzX0xFQVZFOgorCQkvKkVDMzAqLworCQlpZiAoY21kID09IEVDX1RJTUVPVVRfVEQgJiYgIXNtYy0+bWliLmZkZGlTTVRCeXBhc3NQcmVzZW50ICYmCisJCQkoc21jLT5lLnBhdGhfdGVzdCAhPSBQVF9QRU5ESU5HKSkgeworCQkJR09fU1RBVEUoRUMwX09VVCkgOworCQkJYnJlYWsgOworCQl9CisJCS8qRUMzNCovCisJCWVsc2UgaWYgKGNtZCA9PSBFQ19USU1FT1VUX1REICYmCisJCQkoc21jLT5lLnBhdGhfdGVzdCA9PSBQVF9QRU5ESU5HKSkgeworCQkJR09fU1RBVEUoRUM0X1BBVEhfVEVTVCkgOworCQkJYnJlYWsgOworCQl9CisJCS8qRUMzMSovCisJCWVsc2UgaWYgKGNtZCA9PSBFQ19DT05ORUNUICYmIHNtYy0+ZS5wYXRoX3Rlc3QgPT0gUFRfUEFTU0VEKSB7CisJCQlHT19TVEFURShFQzFfSU4pIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKkVDMzMqLworCQllbHNlIGlmIChjbWQgPT0gRUNfRElTQ09OTkVDVCAmJgorCQkJc21jLT5lLnBhdGhfdGVzdCA9PSBQVF9QRU5ESU5HKSB7CisJCQlzbWMtPmUucGF0aF90ZXN0ID0gUFRfRVhJVElORyA7CisJCQkvKgorCQkJICogc3RheSBpbiBzdGF0ZSAtIHN0YXRlIHdpbGwgYmUgbGVmdCB2aWEgdGltZW91dAorCQkJICovCisJCX0KKwkJLypFQzM3Ki8KKwkJZWxzZSBpZiAoY21kID09IEVDX1RJTUVPVVRfVEQgJiYKKwkJCXNtYy0+bWliLmZkZGlTTVRCeXBhc3NQcmVzZW50ICYmCisJCQlzbWMtPmUucGF0aF90ZXN0ICE9IFBUX1BFTkRJTkcpIHsKKwkJCUdPX1NUQVRFKEVDN19ERUlOU0VSVCkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoRUM0X1BBVEhfVEVTVCkgOgorCQlzdG9wX2VjbV90aW1lcihzbWMpIDsKKwkJc21jLT5lLnBhdGhfdGVzdCA9IFBUX1RFU1RJTkcgOworCQlzdGFydF9lY21fdGltZXIoc21jLHNtYy0+cy5lY21fdGVzdF9kb25lLEVDX1RFU1RfRE9ORSkgOworCQkvKiBub3cgcGVyZm9ybSBwYXRoIHRlc3QgLi4uIGp1c3QgYSBzaW11bGF0aW9uICovCisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWsgOworCWNhc2UgRUM0X1BBVEhfVEVTVCA6CisJCS8qIHBhdGggdGVzdCBkb25lIGRlbGF5ICovCisJCWlmIChjbWQgPT0gRUNfVEVTVF9ET05FKQorCQkJc21jLT5lLnBhdGhfdGVzdCA9IFBUX1BBU1NFRCA7CisKKwkJaWYgKHNtYy0+ZS5wYXRoX3Rlc3QgPT0gUFRfRkFJTEVEKQorCQkJUlNfU0VUKHNtYyxSU19QQVRIVEVTVCkgOworCisJCS8qRUM0MGEqLworCQlpZiAoc21jLT5lLnBhdGhfdGVzdCA9PSBQVF9GQUlMRUQgJiYKKwkJCSFzbWMtPm1pYi5mZGRpU01UQnlwYXNzUHJlc2VudCkgeworCQkJR09fU1RBVEUoRUMwX09VVCkgOworCQkJYnJlYWsgOworCQl9CisJCS8qRUM0MGIqLworCQllbHNlIGlmIChjbWQgPT0gRUNfRElTQ09OTkVDVCAmJgorCQkJIXNtYy0+bWliLmZkZGlTTVRCeXBhc3NQcmVzZW50KSB7CisJCQlHT19TVEFURShFQzBfT1VUKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypFQzQxKi8KKwkJZWxzZSBpZiAoc21jLT5lLnBhdGhfdGVzdCA9PSBQVF9QQVNTRUQpIHsKKwkJCUdPX1NUQVRFKEVDMV9JTikgOworCQkJYnJlYWsgOworCQl9CisJCS8qRUM0N2EqLworCQllbHNlIGlmIChzbWMtPmUucGF0aF90ZXN0ID09IFBUX0ZBSUxFRCAmJgorCQkJc21jLT5taWIuZmRkaVNNVEJ5cGFzc1ByZXNlbnQpIHsKKwkJCUdPX1NUQVRFKEVDN19ERUlOU0VSVCkgOworCQkJYnJlYWsgOworCQl9CisJCS8qRUM0N2IqLworCQllbHNlIGlmIChjbWQgPT0gRUNfRElTQ09OTkVDVCAmJgorCQkJc21jLT5taWIuZmRkaVNNVEJ5cGFzc1ByZXNlbnQpIHsKKwkJCUdPX1NUQVRFKEVDN19ERUlOU0VSVCkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoRUM1X0lOU0VSVCkgOgorCQlzbV9wbV9ieXBhc3NfcmVxKHNtYyxCUF9JTlNFUlQpOworCQlzdGFydF9lY21fdGltZXIoc21jLHNtYy0+cy5lY21faW5fbWF4LEVDX1RJTUVPVVRfSU5NQVgpIDsKKwkJQUNUSU9OU19ET05FKCkgOworCQlicmVhayA7CisJY2FzZSBFQzVfSU5TRVJUIDoKKwkJLypFQzU2Ki8KKwkJaWYgKGNtZCA9PSBFQ19USU1FT1VUX0lOTUFYKSB7CisJCQlHT19TVEFURShFQzZfQ0hFQ0spIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKkVDNTcqLworCQllbHNlIGlmIChjbWQgPT0gRUNfRElTQ09OTkVDVCkgeworCQkJR09fU1RBVEUoRUM3X0RFSU5TRVJUKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgQUNUSU9OUyhFQzZfQ0hFQ0spIDoKKwkJLyoKKwkJICogaW4gRUM2X0NIRUNLLCB3ZSAqUE9MTCogdGhlIGxpbmUgc3RhdGUgIQorCQkgKiBjaGVjayB3aGV0aGVyIGJvdGggYnlwYXNzIHN3aXRjaGVzIGhhdmUgc3dpdGNoZWQuCisJCSAqLworCQlzdGFydF9lY21fdGltZXIoc21jLHNtYy0+cy5lY21fY2hlY2tfcG9sbCwwKSA7CisJCXNtYy0+ZS5lY21fbGluZV9zdGF0ZSA9IFRSVUUgOwkvKiBmbGFnIHRvIHBjbTogcmVwb3J0IFEvSExTICovCisJCSh2b2lkKSBzbV9wbV9sc19sYXRjaChzbWMsUEEsMSkgOyAvKiBlbmFibGUgbGluZSBzdGF0ZSBsYXRjaCAqLworCQkodm9pZCkgc21fcG1fbHNfbGF0Y2goc21jLFBCLDEpIDsgLyogZW5hYmxlIGxpbmUgc3RhdGUgbGF0Y2ggKi8KKwkJQUNUSU9OU19ET05FKCkgOworCQlicmVhayA7CisJY2FzZSBFQzZfQ0hFQ0sgOgorCQlsc19hID0gc21fcG1fZ2V0X2xzKHNtYyxQQSkgOworCQlsc19iID0gc21fcG1fZ2V0X2xzKHNtYyxQQikgOworCisJCS8qRUM2MSovCisJCWlmICgoKGxzX2EgPT0gUENfUUxTKSB8fCAobHNfYSA9PSBQQ19ITFMpKSAmJgorCQkgICAgKChsc19iID09IFBDX1FMUykgfHwgKGxzX2IgPT0gUENfSExTKSkgKSB7CisJCQlzbWMtPmUuc2JfZmxhZyA9IEZBTFNFIDsKKwkJCXNtYy0+ZS5lY21fbGluZV9zdGF0ZSA9IEZBTFNFIDsKKwkJCUdPX1NUQVRFKEVDMV9JTikgOworCQkJYnJlYWsgOworCQl9CisJCS8qRUM2NiovCisJCWVsc2UgaWYgKCFzbWMtPmUuc2JfZmxhZyAmJgorCQkJICgoKGxzX2EgPT0gUENfSUxTKSAmJiAobHNfYiA9PSBQQ19RTFMpKSB8fAorCQkJICAoKGxzX2EgPT0gUENfUUxTKSAmJiAobHNfYiA9PSBQQ19JTFMpKSkpeworCQkJc21jLT5lLnNiX2ZsYWcgPSBUUlVFIDsKKwkJCURCX0VDTU4oMSwiRUNNIDogRUM2X0NIRUNLIC0gc3R1Y2sgYnlwYXNzXG4iLDAsMCkgOworCQkJQUlYX0VWRU5UKHNtYywgKHVfbG9uZykgRkRESV9SSU5HX1NUQVRVUywgKHVfbG9uZykKKwkJCQlGRERJX1NNVF9FUlJPUiwgKHVfbG9uZykgRkRESV9CWVBBU1NfU1RVQ0ssCisJCQkJc210X2dldF9lcnJvcl93b3JkKHNtYykpOworCQl9CisJCS8qRUM2NyovCisJCWVsc2UgaWYgKGNtZCA9PSBFQ19ESVNDT05ORUNUKSB7CisJCQlzbWMtPmUuZWNtX2xpbmVfc3RhdGUgPSBGQUxTRSA7CisJCQlHT19TVEFURShFQzdfREVJTlNFUlQpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQllbHNlIHsKKwkJCS8qCisJCQkgKiByZXN0YXJ0IHBvbGwKKwkJCSAqLworCQkJc3RhcnRfZWNtX3RpbWVyKHNtYyxzbWMtPnMuZWNtX2NoZWNrX3BvbGwsMCkgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoRUM3X0RFSU5TRVJUKSA6CisJCXNtX3BtX2J5cGFzc19yZXEoc21jLEJQX0RFSU5TRVJUKTsKKwkJc3RhcnRfZWNtX3RpbWVyKHNtYyxzbWMtPnMuZWNtX2lfbWF4LEVDX1RJTUVPVVRfSU1BWCkgOworCQlBQ1RJT05TX0RPTkUoKSA7CisJCWJyZWFrIDsKKwljYXNlIEVDN19ERUlOU0VSVDoKKwkJLypFQzcwKi8KKwkJaWYgKGNtZCA9PSBFQ19USU1FT1VUX0lNQVgpIHsKKwkJCUdPX1NUQVRFKEVDMF9PVVQpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKkVDNzUqLworCQllbHNlIGlmIChjbWQgPT0gRUNfQ09OTkVDVCAmJiBzbWMtPmUucGF0aF90ZXN0ID09IFBUX1BBU1NFRCkgeworCQkJR09fU1RBVEUoRUM1X0lOU0VSVCkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTA3LCBTTVRfRTAxMDdfTVNHKSA7CisJCWJyZWFrOworCX0KK30KKworI2lmbmRlZglDT05DRU5UUkFUT1IKKy8qCisgKiB0cmFjZSBwcm9wYWdhdGlvbiBhY3Rpb25zIGZvciBTQVMgJiBEQVMKKyAqLworc3RhdGljIHZvaWQgcHJvcF9hY3Rpb25zKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWludAlwb3J0X2luID0gMCA7CisJaW50CXBvcnRfb3V0ID0gMCA7CisKKwlSU19TRVQoc21jLFJTX0VWRU5UKSA7CisJc3dpdGNoIChzbWMtPnMuc2FzKSB7CisJY2FzZSBTTVRfU0FTIDoKKwkJcG9ydF9pbiA9IHBvcnRfb3V0ID0gcGNtX2dldF9zX3BvcnQoc21jKSA7CisJCWJyZWFrIDsKKwljYXNlIFNNVF9EQVMgOgorCQlwb3J0X2luID0gY2ZtX2dldF9tYWNfaW5wdXQoc21jKSA7CS8qIFBBIG9yIFBCICovCisJCXBvcnRfb3V0ID0gY2ZtX2dldF9tYWNfb3V0cHV0KHNtYykgOwkvKiBQQSBvciBQQiAqLworCQlicmVhayA7CisJY2FzZSBTTVRfTkFDIDoKKwkJU01UX1BBTklDKHNtYyxTTVRfRTAxMDgsIFNNVF9FMDEwOF9NU0cpIDsKKwkJcmV0dXJuIDsKKwl9CisKKwlEQl9FQ00oIkVDTSA6IHByb3BfYWN0aW9ucyAtIHRyYWNlX3Byb3AgJWRcbiIsIHNtYy0+ZS50cmFjZV9wcm9wLDApIDsKKwlEQl9FQ00oIkVDTSA6IHByb3BfYWN0aW9ucyAtIGluICVkIG91dCAlZFxuIiwgcG9ydF9pbixwb3J0X291dCkgOworCisJaWYgKHNtYy0+ZS50cmFjZV9wcm9wICYgRU5USVRZX0JJVChFTlRJVFlfTUFDKSkgeworCQkvKiB0cmFjZSBpbml0aWF0aW9yICovCisJCURCX0VDTSgiRUNNIDogaW5pdGlhdGUgVFJBQ0Ugb24gUEhZICVjXG4iLCdBJytwb3J0X2luLVBBLDApIDsKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1BDTStwb3J0X2luLFBDX1RSQUNFKSA7CisJfQorCWVsc2UgaWYgKChzbWMtPmUudHJhY2VfcHJvcCAmIEVOVElUWV9CSVQoRU5USVRZX1BIWShQQSkpKSAmJgorCQlwb3J0X291dCAhPSBQQSkgeworCQkvKiB0cmFjZSBwcm9wYWdhdGUgdXBzdHJlYW0gKi8KKwkJREJfRUNNKCJFQ00gOiBwcm9wYWdhdGUgVFJBQ0Ugb24gUEhZIEJcbiIsMCwwKSA7CisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9QQ01CLFBDX1RSQUNFKSA7CisJfQorCWVsc2UgaWYgKChzbWMtPmUudHJhY2VfcHJvcCAmIEVOVElUWV9CSVQoRU5USVRZX1BIWShQQikpKSAmJgorCQlwb3J0X291dCAhPSBQQikgeworCQkvKiB0cmFjZSBwcm9wYWdhdGUgdXBzdHJlYW0gKi8KKwkJREJfRUNNKCJFQ00gOiBwcm9wYWdhdGUgVFJBQ0Ugb24gUEhZIEFcbiIsMCwwKSA7CisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9QQ01BLFBDX1RSQUNFKSA7CisJfQorCWVsc2UgeworCQkvKiBzaWduYWwgdHJhY2UgdGVybWluYXRpb24gKi8KKwkJREJfRUNNKCJFQ00gOiBUUkFDRSB0ZXJtaW5hdGVkXG4iLDAsMCkgOworCQlzbWMtPmUucGF0aF90ZXN0ID0gUFRfUEVORElORyA7CisJfQorCXNtYy0+ZS50cmFjZV9wcm9wID0gMCA7Cit9CisjZWxzZQorLyoKKyAqIHRyYWNlIHByb3BhZ2F0aW9uIGFjdGlvbnMgZm9yIENvbmNlbnRyYXRvcgorICovCitzdGF0aWMgdm9pZCBwcm9wX2FjdGlvbnMoc3RydWN0IHNfc21jICpzbWMpCit7CisJaW50CWluaXRpYXRvciA7CisJaW50CXVwc3RyZWFtIDsKKwlpbnQJcCA7CisKKwlSU19TRVQoc21jLFJTX0VWRU5UKSA7CisJd2hpbGUgKHNtYy0+ZS50cmFjZV9wcm9wKSB7CisJCURCX0VDTSgiRUNNIDogcHJvcF9hY3Rpb25zIC0gdHJhY2VfcHJvcCAlZFxuIiwKKwkJCXNtYy0+ZS50cmFjZV9wcm9wLDApIDsKKworCQlpZiAoc21jLT5lLnRyYWNlX3Byb3AgJiBFTlRJVFlfQklUKEVOVElUWV9NQUMpKSB7CisJCQlpbml0aWF0b3IgPSBFTlRJVFlfTUFDIDsKKwkJCXNtYy0+ZS50cmFjZV9wcm9wICY9IH5FTlRJVFlfQklUKEVOVElUWV9NQUMpIDsKKwkJCURCX0VDTSgiRUNNOiBNQUMgaW5pdGlhdGVzIHRyYWNlXG4iLDAsMCkgOworCQl9CisJCWVsc2UgeworCQkJZm9yIChwID0gTlVNUEhZUy0xIDsgcCA+PSAwIDsgcC0tKSB7CisJCQkJaWYgKHNtYy0+ZS50cmFjZV9wcm9wICYKKwkJCQkJRU5USVRZX0JJVChFTlRJVFlfUEhZKHApKSkKKwkJCQkJYnJlYWsgOworCQkJfQorCQkJaW5pdGlhdG9yID0gRU5USVRZX1BIWShwKSA7CisJCQlzbWMtPmUudHJhY2VfcHJvcCAmPSB+RU5USVRZX0JJVChFTlRJVFlfUEhZKHApKSA7CisJCX0KKwkJdXBzdHJlYW0gPSBjZW1fZ2V0X3Vwc3RyZWFtKHNtYyxpbml0aWF0b3IpIDsKKworCQlpZiAodXBzdHJlYW0gPT0gRU5USVRZX01BQykgeworCQkJLyogc2lnbmFsIHRyYWNlIHRlcm1pbmF0aW9uICovCisJCQlEQl9FQ00oIkVDTSA6IFRSQUNFIHRlcm1pbmF0ZWRcbiIsMCwwKSA7CisJCQlzbWMtPmUucGF0aF90ZXN0ID0gUFRfUEVORElORyA7CisJCX0KKwkJZWxzZSB7CisJCQkvKiB0cmFjZSBwcm9wYWdhdGUgdXBzdHJlYW0gKi8KKwkJCURCX0VDTSgiRUNNIDogcHJvcGFnYXRlIFRSQUNFIG9uIFBIWSAlZFxuIix1cHN0cmVhbSwwKSA7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNK3Vwc3RyZWFtLFBDX1RSQUNFKSA7CisJCX0KKwl9Cit9CisjZW5kaWYKKworCisvKgorICogU01UIHRpbWVyIGludGVyZmFjZQorICoJc3RhcnQgRUNNIHRpbWVyCisgKi8KK3N0YXRpYyB2b2lkIHN0YXJ0X2VjbV90aW1lcihzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIHZhbHVlLCBpbnQgZXZlbnQpCit7CisJc210X3RpbWVyX3N0YXJ0KHNtYywmc21jLT5lLmVjbV90aW1lcix2YWx1ZSxFVl9UT0tFTihFVkVOVF9FQ00sZXZlbnQpKTsKK30KKworLyoKKyAqIFNNVCB0aW1lciBpbnRlcmZhY2UKKyAqCXN0b3AgRUNNIHRpbWVyCisgKi8KK3N0YXRpYyB2b2lkIHN0b3BfZWNtX3RpbWVyKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWlmIChzbWMtPmUuZWNtX3RpbWVyLnRtX2FjdGl2ZSkKKwkJc210X3RpbWVyX3N0b3Aoc21jLCZzbWMtPmUuZWNtX3RpbWVyKSA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2Vzcy5jIGIvZHJpdmVycy9uZXQvc2tmcC9lc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDM5YjRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9lc3MuYwpAQCAtMCwwICsxLDcyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVNlZSB0aGUgZmlsZSAic2tmZGRpLmMiIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgU0JBIGNvZGUgaW1wbGVtZW50cyB0aGUgU3luY2hyb25vdXMgQmFuZHdpZHRoIEFsbG9jYXRpb24KKyAqIGZ1bmN0aW9ucyBkZXNjcmliZWQgaW4gdGhlICJGRERJIFN5bmNocm9ub3VzIEZvcnVtIEltcGxlbWVudGVyJ3MKKyAqIEFncmVlbWVudCIgZGF0ZWQgRGVjZW1iZXIgMXRoLCAxOTkzLgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVBVUlBPU0U6IFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gY29udHJvbAorICoJCSBzeW5jaHJvbm91cyBhbGxvY2F0aW9ucyBvbiBhIHNpbmdsZSBGRERJIHNlZ21lbnQuCisgKgkJIEFsbG9jYXRpb25zIGFyZSBsaW1pdGVkIHRvIHRoZSBwcmltYXJ5IEZEREkgcmluZy4KKyAqCQkgVGhlIFNCTSBwcm92aWRlcyByZWNvdmVyeSBtZWNoYW5pc21zIHRvIHJlY292ZXIKKyAqCQkgdW51c2VkIGJhbmR3aWR0aCBhbHNvIHJlc29sdmVzIFRfTmVnIGFuZAorICoJCSByZWNvbmZpZ3VyYXRpb24gY2hhbmdlcy4gTWFueSBvZiB0aGUgU0JNIHN0YXRlCisgKgkJIG1hY2hpbmUgaW5wdXRzIGFyZSBzb3VyY2VkIGJ5IHRoZSB1bmRlcmx5aW5nCisgKgkJIEZEREkgc3ViLXN5c3RlbSBzdXBwb3J0aW5nIHRoZSBTQkEgYXBwbGljYXRpb24uCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICJoL3R5cGVzLmgiCisjaW5jbHVkZSAiaC9mZGRpLmgiCisjaW5jbHVkZSAiaC9zbWMuaCIKKyNpbmNsdWRlICJoL3NtdF9wLmgiCisKKworI2lmbmRlZglTTElNX1NNVAorCisjaWZkZWYgRVNTCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgSURfc2Njc1tdID0gIkAoIyllc3MuYwkxLjEwIDk2LzAyLzIzIChDKSBTSyIgOworI2RlZmluZSBMSU5UX1VTRSh4KQorI2Vsc2UKKyNkZWZpbmUgTElOVF9VU0UoeCkJKHgpPSh4KQorI2VuZGlmCisjZGVmaW5lIE1TMkJDTEsoeCkJKCh4KSoxMjUwMEwpCisKKy8qCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUxPQ0FMIFZBUklBQkxFUzoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitzdGF0aWMgY29uc3QgdV9zaG9ydCBwbGlzdF9yYWZfYWxjX3Jlc1tdID0geyBTTVRfUDAwMTIsIFNNVF9QMzIwQiwgU01UX1AzMjBGLAorCQkJCQlTTVRfUDMyMTAsIFNNVF9QMDAxOSwgU01UX1AwMDFBLAorCQkJCQlTTVRfUDAwMUQsIDAgfSA7CisKK3N0YXRpYyBjb25zdCB1X3Nob3J0IHBsaXN0X3JhZl9jaGdfcmVxW10gPSB7IFNNVF9QMzIwQiwgU01UX1AzMjBGLCBTTVRfUDMyMTAsCisJCQkJCVNNVF9QMDAxQSwgMCB9IDsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmZGRpX2FkZHIgc210X3NiYV9kYSA9IHt7MHg4MCwweDAxLDB4NDMsMHgwMCwweDgwLDB4MEN9fSA7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZkZGlfYWRkciBudWxsX2FkZHIgPSB7ezAsMCwwLDAsMCwwfX0gOworCisvKgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlHTE9CQUwgVkFSSUFCTEVTOgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTE9DQUwgRlVOQ1RJT05TOgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3N0YXRpYyB2b2lkIGVzc19zZW5kX3Jlc3BvbnNlKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X2hlYWRlciAqc20sCisJCQkgICAgICBpbnQgc2JhX2NtZCk7CitzdGF0aWMgdm9pZCBlc3NfY29uZmlnX2ZpZm8oc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgZXNzX3NlbmRfYWxjX3JlcShzdHJ1Y3Qgc19zbWMgKnNtYyk7CitzdGF0aWMgdm9pZCBlc3Nfc2VuZF9mcmFtZShzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iKTsKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJRVhURVJOQUwgRlVOQ1RJT05TOgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBVQkxJQyBGVU5DVElPTlM6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZCBlc3NfdGltZXJfcG9sbChzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIGVzc19wYXJhX2NoYW5nZShzdHJ1Y3Qgc19zbWMgKnNtYyk7CitpbnQgZXNzX3JhZl9yZWNlaXZlZF9wYWNrKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIsIHN0cnVjdCBzbXRfaGVhZGVyICpzbSwKKwkJCSAgaW50IGZzKTsKK2ludCBwcm9jZXNzX2J3X2FsbG9jKHN0cnVjdCBzX3NtYyAqc21jLCBsb25nIGludCBwYXlsb2FkLCBsb25nIGludCBvdmVyaGVhZCk7CisKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglFbmQgU3RhdGlvbiBTdXBwb3J0CShFU1MpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBldmFsdWF0ZSB0aGUgUkFGIGZyYW1lCisgKi8KK2ludCBlc3NfcmFmX3JlY2VpdmVkX3BhY2soc3RydWN0IHNfc21jICpzbWMsIFNNYnVmICptYiwgc3RydWN0IHNtdF9oZWFkZXIgKnNtLAorCQkJICBpbnQgZnMpCit7CisJdm9pZAkJCSpwIDsJCS8qIHVuaXZlcnNhbCBwb2ludGVyICovCisJc3RydWN0IHNtdF9wXzAwMTYJKmNtZCA7CQkvKiBwYXJhOiBjb21tYW5kIGZvciB0aGUgRVNTICovCisJU01idWYJCQkqZGIgOworCXVfbG9uZwkJCW1zZ19yZXNfdHlwZSA7CS8qIHJlY291cmNlIHR5cGUgKi8KKwl1X2xvbmcJCQlwYXlsb2FkLCBvdmVyaGVhZCA7CisJaW50CQkJbG9jYWwgOworCWludAkJCWkgOworCisJLyoKKwkgKiBNZXNzYWdlIFByb2Nlc3NpbmcgQ29kZQorCSAqLworCSBsb2NhbCA9ICgoZnMgJiBMX0lORElDQVRPUikgIT0gMCkgOworCisJLyoKKwkgKiBnZXQgdGhlIHJlc291cmNlIHR5cGUKKwkgKi8KKwlpZiAoIShwID0gKHZvaWQgKikgc21fdG9fcGFyYShzbWMsc20sU01UX1AwMDE1KSkpIHsKKwkJREJfRVNTKCJFU1M6IFJBRiBmcmFtZSBlcnJvciwgcGFyYW1ldGVyIHR5cGUgbm90IGZvdW5kXG4iLDAsMCkgOworCQlyZXR1cm4oZnMpIDsKKwl9CisJbXNnX3Jlc190eXBlID0gKChzdHJ1Y3Qgc210X3BfMDAxNSAqKXApLT5yZXNfdHlwZSA7CisKKwkvKgorCSAqIGdldCB0aGUgcG9pbnRlciB0byB0aGUgRVNTIGNvbW1hbmQKKwkgKi8KKwlpZiAoIShjbWQgPSAoc3RydWN0IHNtdF9wXzAwMTYgKikgc21fdG9fcGFyYShzbWMsc20sU01UX1AwMDE2KSkpIHsKKwkJLyoKKwkJICogZXJyb3IgaW4gZnJhbWU6IHBhcmEgRVNTIGNvbW1hbmQgd2FzIG5vdCBmb3VuZAorCQkgKi8KKwkJIERCX0VTUygiRVNTOiBSQUYgZnJhbWUgZXJyb3IsIHBhcmFtZXRlciBjb21tYW5kIG5vdCBmb3VuZFxuIiwwLDApOworCQkgcmV0dXJuKGZzKSA7CisJfQorCisJREJfRVNTTigyLCJmYyAleAlmdCAleFxuIixzbS0+c210X2NsYXNzLHNtLT5zbXRfdHlwZSkgOworCURCX0VTU04oMiwidmVyICV4CXRyYW4gJWx4XG4iLHNtLT5zbXRfdmVyc2lvbixzbS0+c210X3RpZCkgOworCURCX0VTU04oMiwic3RuX2lkICVzXG4iLGFkZHJfdG9fc3RyaW5nKCZzbS0+c210X3NvdXJjZSksMCkgOworCisJREJfRVNTTigyLCJpbmZvbGVuICV4CXJlcyAleFxuIixzbS0+c210X2xlbiwgbXNnX3Jlc190eXBlKSA7CisJREJfRVNTTigyLCJzYmFjbWQgJXhcbiIsY21kLT5zYmFfY21kLDApIDsKKworCS8qCisJICogZXZhbHVhdGUgdGhlIEVTUyBjb21tYW5kCisJICovCisJc3dpdGNoIChjbWQtPnNiYV9jbWQpIHsKKworCS8qCisJICogUHJvY2VzcyBhbiBFU1MgQWxsb2NhdGlvbiBSZXF1ZXN0CisJICovCisJY2FzZSBSRVFVRVNUX0FMTE9DQVRJT04gOgorCQkvKgorCQkgKiBjaGVjayBmb3IgYW4gUkFGIFJlcXVlc3QgKEFsbG9jYXRpb24gUmVxdWVzdCkKKwkJICovCisJCWlmIChzbS0+c210X3R5cGUgPT0gU01UX1JFUVVFU1QpIHsKKwkJCS8qCisJCQkgKiBwcm9jZXNzIHRoZSBBbGxvY2F0aW9uIHJlcXVlc3Qgb25seSBpZiB0aGUgZnJhbWUgaXMKKwkJCSAqIGxvY2FsIGFuZCBubyBzdGF0aWMgYWxsb2NhdGlvbiBpcyB1c2VkCisJCQkgKi8KKwkJCWlmICghbG9jYWwgfHwgc21jLT5taWIuZmRkaUVTU1BheWxvYWQpCisJCQkJcmV0dXJuKGZzKSA7CisJCQkKKwkJCXAgPSAodm9pZCAqKSBzbV90b19wYXJhKHNtYyxzbSxTTVRfUDAwMTkpICA7CisJCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCQkJaWYgKCgoc3RydWN0IHNtdF9wXzAwMTkgKilwKS0+YWxsb2NfYWRkci5hW2ldKSB7CisJCQkJCXJldHVybihmcykgOworCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqIE5vdGU6IFRoZSBBcHBsaWNhdGlvbiBzaG91bGQgc2VuZCBhIExBTl9MT0NfRlJBTUUuCisJCQkgKgkgVGhlIEVTUyBkbyBub3Qgc2VuZCB0aGUgRnJhbWUgdG8gdGhlIG5ldHdvcmshCisJCQkgKi8KKwkJCXNtYy0+ZXNzLmFsbG9jX3RyYW5zX2lkID0gc20tPnNtdF90aWQgOworCQkJREJfRVNTKCJFU1M6IHNhdmUgQWxsb2MgUmVxIFRyYW5zIElEICVseFxuIixzbS0+c210X3RpZCwwKTsKKwkJCXAgPSAodm9pZCAqKSBzbV90b19wYXJhKHNtYyxzbSxTTVRfUDMyMEYpIDsKKwkJCSgoc3RydWN0IHNtdF9wXzMyMGYgKilwKS0+bWliX3BheWxvYWQgPQorCQkJCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIU2JhUGF5bG9hZCA7CisJCQlwID0gKHZvaWQgKikgc21fdG9fcGFyYShzbWMsc20sU01UX1AzMjEwKSA7CisJCQkoKHN0cnVjdCBzbXRfcF8zMjEwICopcCktPm1pYl9vdmVyaGVhZCA9CisJCQkJc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhTYmFPdmVyaGVhZCA7CisJCQlzbS0+c210X2Rlc3QgPSBzbXRfc2JhX2RhIDsKKworCQkJaWYgKHNtYy0+ZXNzLmxvY2FsX3NiYV9hY3RpdmUpCisJCQkJcmV0dXJuKGZzIHwgSV9JTkRJQ0FUT1IpIDsKKworCQkJaWYgKCEoZGIgPSBzbXRfZ2V0X21idWYoc21jKSkpCisJCQkJcmV0dXJuKGZzKSA7CisKKwkJCWRiLT5zbV9sZW4gPSBtYi0+c21fbGVuIDsKKwkJCWRiLT5zbV9vZmYgPSBtYi0+c21fb2ZmIDsKKwkJCW1lbWNweSgoKGNoYXIgKikoZGItPnNtX2RhdGErZGItPnNtX29mZikpLChjaGFyICopc20sCisJCQkJKGludClkYi0+c21fbGVuKSA7CisJCQlkdW1wX3NtdChzbWMsCisJCQkJKHN0cnVjdCBzbXRfaGVhZGVyICopKGRiLT5zbV9kYXRhK2RiLT5zbV9vZmYpLAorCQkJCSJSQUYiKSA7CisJCQlzbXRfc2VuZF9mcmFtZShzbWMsZGIsRkNfU01UX0lORk8sMCkgOworCQkJcmV0dXJuKGZzKSA7CisJCX0KKworCQkvKgorCQkgKiBUaGUgUkFGIGZyYW1lIGlzIGFuIEFsbG9jYXRpb24gUmVzcG9uc2UgIQorCQkgKiBjaGVjayB0aGUgcGFyYW1ldGVycworCQkgKi8KKwkJaWYgKHNtdF9jaGVja19wYXJhKHNtYyxzbSxwbGlzdF9yYWZfYWxjX3JlcykpIHsKKwkJCURCX0VTUygiRVNTOiBSQUYgd2l0aCBwYXJhIHByb2JsZW0sIGlnbm9yaW5nXG4iLDAsMCkgOworCQkJcmV0dXJuKGZzKSA7CisJCX0KKworCQkvKgorCQkgKiBWRVJJRlkgVEhFIEZSQU1FIElTIFdFTEwgQlVJTFQ6CisJCSAqCisJCSAqCTEuIHBhdGggaW5kZXggPSBwcmltYXJ5IHJpbmcgb25seQorCQkgKgkyLiByZXNvdXJjZSB0eXBlID0gc3luYyBidyBvbmx5CisJCSAqCTMuIHRyYW5zIGFjdGlvbiBpZCA9IGFsbG9jX3RyYW5zX2lkCisJCSAqCTQuIHJlYXNvbiBjb2RlID0gc3VjY2VzcworCQkgKgorCQkgKiBJZiBhbnkgYXJlIHZpb2xhdGVkLCBkaXNjYXJkIHRoZSBSQUYgZnJhbWUKKwkJICovCisJCWlmICgoKChzdHJ1Y3Qgc210X3BfMzIwYiAqKXNtX3RvX3BhcmEoc21jLHNtLFNNVF9QMzIwQikpLT5wYXRoX2luZGV4CisJCQkhPSBQUklNQVJZX1JJTkcpIHx8CisJCQkobXNnX3Jlc190eXBlICE9IFNZTkNfQlcpIHx8CisJCSgoKHN0cnVjdCBzbXRfcF9yZWFzb24gKilzbV90b19wYXJhKHNtYyxzbSxTTVRfUDAwMTIpKS0+cmRmX3JlYXNvbgorCQkJIT0gU01UX1JERl9TVUNDRVNTKSB8fAorCQkJKHNtLT5zbXRfdGlkICE9IHNtYy0+ZXNzLmFsbG9jX3RyYW5zX2lkKSkgeworCisJCQlEQl9FU1MoIkVTUzogQWxsb2NhdGlvbiBSZXNwb25jZSBub3QgYWNjZXB0ZWRcbiIsMCwwKSA7CisJCQlyZXR1cm4oZnMpIDsKKwkJfQorCisJCS8qCisJCSAqIEV4dHJhY3QgbWVzc2FnZSBwYXJhbWV0ZXJzCisJCSAqLworCQlwID0gKHZvaWQgKikgc21fdG9fcGFyYShzbWMsc20sU01UX1AzMjBGKSA7CisgICAgICAgICAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkVTUzogc21fdG9fcGFyYSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmczsKKyAgICAgICAgICAgICAgICB9ICAgICAgIAorCQlwYXlsb2FkID0gKChzdHJ1Y3Qgc210X3BfMzIwZiAqKXApLT5taWJfcGF5bG9hZCA7CisJCXAgPSAodm9pZCAqKSBzbV90b19wYXJhKHNtYyxzbSxTTVRfUDMyMTApIDsKKyAgICAgICAgICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRVNTOiBzbV90b19wYXJhIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZzOworICAgICAgICAgICAgICAgIH0gICAgICAgCisJCW92ZXJoZWFkID0gKChzdHJ1Y3Qgc210X3BfMzIxMCAqKXApLT5taWJfb3ZlcmhlYWQgOworCisJCURCX0VTU04oMiwicGF5bG9hZD0gJWx4CW92ZXJoZWFkPSAlbHhcbiIscGF5bG9hZCxvdmVyaGVhZCkgOworCisJCS8qCisJCSAqIHByb2Nlc3MgdGhlIGJhbmR3aWR0aCBhbGxvY2F0aW9uCisJCSAqLworCQkodm9pZClwcm9jZXNzX2J3X2FsbG9jKHNtYywobG9uZylwYXlsb2FkLChsb25nKW92ZXJoZWFkKSA7CisKKwkJcmV0dXJuKGZzKSA7CisJCS8qIGVuZCBvZiBQcm9jZXNzIEFsbG9jYXRpb24gUmVxdWVzdCAqLworCisJLyoKKwkgKiBQcm9jZXNzIGFuIEVTUyBDaGFuZ2UgUmVxdWVzdAorCSAqLworCWNhc2UgQ0hBTkdFX0FMTE9DQVRJT04gOgorCQkvKgorCQkgKiBleGNlcHQgb25seSByZXBsaWVzCisJCSAqLworCQlpZiAoc20tPnNtdF90eXBlICE9IFNNVF9SRVFVRVNUKSB7CisJCQlEQl9FU1MoIkVTUzogRG8gbm90IHByb2Nlc3MgQ2hhbmdlIFJlc3BvbnNlc1xuIiwwLDApIDsKKwkJCXJldHVybihmcykgOworCQl9CisKKwkJLyoKKwkJICogY2hlY2sgdGhlIHBhcmEgZm9yIHRoZSBDaGFuZ2UgUmVxdWVzdAorCQkgKi8KKwkJaWYgKHNtdF9jaGVja19wYXJhKHNtYyxzbSxwbGlzdF9yYWZfY2hnX3JlcSkpIHsKKwkJCURCX0VTUygiRVNTOiBSQUYgd2l0aCBwYXJhIHByb2JsZW0sIGlnbm9yaW5nXG4iLDAsMCkgOworCQkJcmV0dXJuKGZzKSA7CisJCX0KKworCQkvKgorCQkgKiBWZXJpZnkgdGhlIHBhdGggaW5kZXggYW5kIHJlc291cmNlCisJCSAqIHR5cGUgYXJlIGNvcnJlY3QuIElmIGFueSBvZgorCQkgKiB0aGVzZSBhcmUgZmFsc2UsIGRvbid0IHByb2Nlc3MgdGhpcworCQkgKiBjaGFuZ2UgcmVxdWVzdCBmcmFtZS4KKwkJICovCisJCWlmICgoKChzdHJ1Y3Qgc210X3BfMzIwYiAqKXNtX3RvX3BhcmEoc21jLHNtLFNNVF9QMzIwQikpLT5wYXRoX2luZGV4CisJCQkhPSBQUklNQVJZX1JJTkcpIHx8IChtc2dfcmVzX3R5cGUgIT0gU1lOQ19CVykpIHsKKwkJCURCX0VTUygiRVNTOiBSQUYgZnJhbWUgd2l0aCBwYXJhIHByb2JsZW0sIGlnbm9yaW5nXG4iLDAsMCkgOworCQkJcmV0dXJuKGZzKSA7CisJCX0KKworCQkvKgorCQkgKiBFeHRyYWN0IG1lc3NhZ2UgcXVldWUgcGFyYW1ldGVycworCQkgKi8KKwkJcCA9ICh2b2lkICopIHNtX3RvX3BhcmEoc21jLHNtLFNNVF9QMzIwRikgOworCQlwYXlsb2FkID0gKChzdHJ1Y3Qgc210X3BfMzIwZiAqKXApLT5taWJfcGF5bG9hZCA7CisJCXAgPSAodm9pZCAqKSBzbV90b19wYXJhKHNtYyxzbSxTTVRfUDMyMTApIDsKKwkJb3ZlcmhlYWQgPSAoKHN0cnVjdCBzbXRfcF8zMjEwICopcCktPm1pYl9vdmVyaGVhZCA7CisKKwkJREJfRVNTTigyLCJFU1M6IENoYW5nZSBSZXF1ZXN0IGZyb20gJXNcbiIsCisJCQlhZGRyX3RvX3N0cmluZygmc20tPnNtdF9zb3VyY2UpLDApIDsKKwkJREJfRVNTTigyLCJwYXlsb2FkPSAlbHgJb3ZlcmhlYWQ9ICVseFxuIixwYXlsb2FkLG92ZXJoZWFkKSA7CisKKwkJLyoKKwkJICogcHJvY2VzcyB0aGUgYmFuZHdpZHRoIGFsbG9jYXRpb24KKwkJICovCisJCWlmKCFwcm9jZXNzX2J3X2FsbG9jKHNtYywobG9uZylwYXlsb2FkLChsb25nKW92ZXJoZWFkKSkKKwkJCXJldHVybihmcykgOworCisJCS8qCisJCSAqIHNlbmQgYW4gUkFGIENoYW5nZSBSZXBseQorCQkgKi8KKwkJZXNzX3NlbmRfcmVzcG9uc2Uoc21jLHNtLENIQU5HRV9BTExPQ0FUSU9OKSA7CisKKwkJcmV0dXJuKGZzKSA7CisJCS8qIGVuZCBvZiBQcm9jZXNzIENoYW5nZSBSZXF1ZXN0ICovCisKKwkvKgorCSAqIFByb2Nlc3MgUmVwb3J0IFJlc3BvbnNlCisJICovCisJY2FzZSBSRVBPUlRfQUxMT0NBVElPTiA6CisJCS8qCisJCSAqIGV4Y2VwdCBvbmx5IHJlcXVlc3RzCisJCSAqLworCQlpZiAoc20tPnNtdF90eXBlICE9IFNNVF9SRVFVRVNUKSB7CisJCQlEQl9FU1MoIkVTUzogRG8gbm90IHByb2Nlc3MgYSBSZXBvcnQgUmVwbHlcbiIsMCwwKSA7CisJCQlyZXR1cm4oZnMpIDsKKwkJfQorCisJCURCX0VTU04oMiwiRVNTOiBSZXBvcnQgUmVxdWVzdCBmcm9tICVzXG4iLAorCQkJYWRkcl90b19zdHJpbmcoJihzbS0+c210X3NvdXJjZSkpLDApIDsKKworCQkvKgorCQkgKiB2ZXJpZnkgdGhhdCB0aGUgcmVzb3VyY2UgdHlwZSBpcyBzeW5jIGJ3IG9ubHkKKwkJICovCisJCWlmIChtc2dfcmVzX3R5cGUgIT0gU1lOQ19CVykgeworCQkJREJfRVNTKCJFU1M6IGlnbm9yaW5nIFJBRiB3aXRoIHBhcmEgcHJvYmxlbVxuIiwwLDApIDsKKwkJCXJldHVybihmcykgOworCQl9CisKKwkJLyoKKwkJICogc2VuZCBhbiBSQUYgQ2hhbmdlIFJlcGx5CisJCSAqLworCQllc3Nfc2VuZF9yZXNwb25zZShzbWMsc20sUkVQT1JUX0FMTE9DQVRJT04pIDsKKworCQlyZXR1cm4oZnMpIDsKKwkJLyogZW5kIG9mIFByb2Nlc3MgUmVwb3J0IFJlcXVlc3QgKi8KKworCWRlZmF1bHQ6CisJCS8qCisJCSAqIGVycm9yIGluIGZyYW1lCisJCSAqLworCQlEQl9FU1MoIkVTUzogaWdub3JpbmcgUkFGIHdpdGggYmFkIHNiYV9jbWRcbiIsMCwwKSA7CisJCWJyZWFrIDsKKwl9CisKKwlyZXR1cm4oZnMpIDsKK30KKworLyoKKyAqIGRldGVybWluZXMgdGhlIHN5bmNocm9ub3VzIGJhbmR3aWR0aCwgc2V0IHRoZSBUU1lOQyByZWdpc3RlciBhbmQgdGhlCisgKiBtaWIgdmFyaWFibGVzIFNCQVBheWxvYWQsIFNCQU92ZXJoZWFkIGFuZCBmZGRpTUFDVC1ORUcuCisgKi8KK2ludCBwcm9jZXNzX2J3X2FsbG9jKHN0cnVjdCBzX3NtYyAqc21jLCBsb25nIGludCBwYXlsb2FkLCBsb25nIGludCBvdmVyaGVhZCkKK3sKKwkvKgorCSAqIGRldGVybWluZSB0aGUgc3luY2hyb25vdXMgYmFuZHdpZHRoIChzeW5jX2J3KSBpbiBieXRlcyBwZXIgVC1ORUcsCisJICogaWYgdGhlIHBheWxvYWQgaXMgZ3JlYXRlciB0aGFuIHplcm8uCisJICogRm9yIHRoZSBTQkFQYXlsb2FkIGFuZCB0aGUgU0JBT3ZlcmhlYWQgd2UgaGF2ZSB0aGUgZm9sbG93aW5nCisJICogdW5pdGUgcXVhdGlvbnMKKyAJICoJCSAgICAgIF8JCSAgXworCSAqCQkgICAgIHwJICAgICBieXRlcyB8CisJICoJU0JBUGF5bG9hZCA9IHwgODAwMCAtLS0tLS0gfAorCSAqCQkgICAgIHwJCXMgIHwKKwkgKgkJICAgICAgLQkJICAtCisgCSAqCQkgICAgICAgXyAgICAgICBfCisJICoJCSAgICAgIHwJIGJ5dGVzCXwKKwkgKglTQkFPdmVyaGVhZCA9IHwgLS0tLS0tCXwKKwkgKgkJICAgICAgfAkgVC1ORUcJfAorCSAqCQkgICAgICAgLSAgICAgICAtCisgCSAqCisJICogVC1ORUcgaXMgZGlzY3JpYmVkIGJ5IHRoZSBlcXVhdGlvbjoKKwkgKgorCSAqCQkgICAgICgtKSBmZGRpTUFDVC1ORUcKKwkgKglULU5FRyA9CSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tCisJICoJCQkxMjUwMDAwMCAxL3MKKwkgKgorCSAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGFibGUgdG8gc2VuZCBpcyB0aGUgcGF5bG9hZAorCSAqIHBsdXMgdGhlIG92ZXJoZWFkLgorCSAqCisJICoJCQkgIGJ5dGVzICAgIFQtTkVHIFNCQVBheWxvYWQgODAwMCBieXRlcy9zCisJICogc3luY19idyA9ICBTQkFPdmVyaGVhZCAtLS0tLS0gKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqCSAgIAkJICBULU5FRwkJVC1ORUcKKwkgKgorCSAqCisJICoJICAgICAgCQkgICAgIDEKKwkgKiBzeW5jX2J3ID0gIFNCQU92ZXJoZWFkICsgLS0tLSAoLSlmZGRpTUFDVC1ORUcgKiBTQkFQYXlsb2FkCisJICoJICAgICAgIAkJICAgIDE1NjIKKwkgKgorCSAqLworCisJLyoKKwkgKiBzZXQgdGhlIG1pYiBhdHRyaWJ1dGVzIGZkZGlQQVRIU2JhT3ZlcmhlYWQsIGZkZGlQQVRIU2JhUGF5bG9hZAorCSAqLworLyoJaWYgKHNtdF9zZXRfb2JqKHNtYyxTTVRfUDMyMEYscGF5bG9hZCxTX1NFVCkpIHsKKwkJREJfRVNTKCJFU1M6IFNNVCBkb2VzIG5vdCBhY2NlcHQgdGhlIHBheWxvYWQgdmFsdWVcbiIsMCwwKSA7CisJCXJldHVybihGQUxTRSkgOworCX0KKwlpZiAoc210X3NldF9vYmooc21jLFNNVF9QMzIxMCxvdmVyaGVhZCxTX1NFVCkpIHsKKwkJREJfRVNTKCJFU1M6IFNNVCBkb2VzIG5vdCBhY2NlcHQgdGhlIG92ZXJoZWFkIHZhbHVlXG4iLDAsMCkgOworCQlyZXR1cm4oRkFMU0UpIDsKKwl9ICovCisKKwkvKiBwcmVtbGltaW5hcnkgKi8KKwlpZiAocGF5bG9hZCA+IE1BWF9QQVlMT0FEIHx8IG92ZXJoZWFkID4gNTAwMCkgeworCQlEQl9FU1MoIkVTUzogcGF5bG9hZCAvIG92ZXJoZWFkIG5vdCBhY2NlcHRlZFxuIiwwLDApIDsKKwkJcmV0dXJuKEZBTFNFKSA7CisJfQorCisJLyoKKwkgKiBzdGFydCB0aGUgaXRlcmF0aXZlIGFsbG9jYXRpb24gcHJvY2VzcyBpZiB0aGUgcGF5bG9hZCBvciB0aGUgb3ZlcmhlYWQKKwkgKiBhcmUgc21hbGxlciB0aGFuIHRoZSBwYXJzZWQgdmFsdWVzCisJICovCisJaWYgKHNtYy0+bWliLmZkZGlFU1NQYXlsb2FkICYmCisJCSgodV9sb25nKXBheWxvYWQgIT0gc21jLT5taWIuZmRkaUVTU1BheWxvYWQgfHwKKwkJKHVfbG9uZylvdmVyaGVhZCAhPSBzbWMtPm1pYi5mZGRpRVNTT3ZlcmhlYWQpKSB7CisJCXNtYy0+ZXNzLnJhZl9hY3RfdGltZXJfcG9sbCA9IFRSVUUgOworCQlzbWMtPmVzcy50aW1lcl9jb3VudCA9IDAgOworCX0KKworCS8qCisJICogZXZ1bGF0ZSB0aGUgUGF5bG9hZAorCSAqLworCWlmIChwYXlsb2FkKSB7CisJCURCX0VTU04oMiwiRVNTOiB0dXJuIFNNVF9TVF9TWU5DX1NFUlZJQ0UgYml0IG9uXG4iLDAsMCkgOworCQlzbWMtPmVzcy5zeW5jX2J3X2F2YWlsYWJsZSA9IFRSVUUgOworCisJCXNtYy0+ZXNzLnN5bmNfYncgPSBvdmVyaGVhZCAtCisJCQkobG9uZylzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUX05lZyAqCisJCQlwYXlsb2FkIC8gMTU2MiA7CisJfQorCWVsc2UgeworCQlEQl9FU1NOKDIsIkVTUzogdHVybiBTTVRfU1RfU1lOQ19TRVJWSUNFIGJpdCBvZmZcbiIsMCwwKSA7CisJCXNtYy0+ZXNzLnN5bmNfYndfYXZhaWxhYmxlID0gRkFMU0UgOworCQlzbWMtPmVzcy5zeW5jX2J3ID0gMCA7CisJCW92ZXJoZWFkID0gMCA7CisJfQorCisJc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhTYmFQYXlsb2FkID0gcGF5bG9hZCA7CisJc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhTYmFPdmVyaGVhZCA9IG92ZXJoZWFkIDsKKworCisJREJfRVNTTigyLCJ0c3luYyA9ICVseFxuIixzbWMtPmVzcy5zeW5jX2J3LDApIDsKKworCWVzc19jb25maWdfZmlmbyhzbWMpIDsKKwlzZXRfZm9ybWFjX3RzeW5jKHNtYyxzbWMtPmVzcy5zeW5jX2J3KSA7CisJcmV0dXJuKFRSVUUpIDsKK30KKworc3RhdGljIHZvaWQgZXNzX3NlbmRfcmVzcG9uc2Uoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfaGVhZGVyICpzbSwKKwkJCSAgICAgIGludCBzYmFfY21kKQoreworCXN0cnVjdCBzbXRfc2JhX2NoZwkqY2hnIDsKKwlTTWJ1ZgkJCSptYiA7CisJdm9pZAkJCSpwIDsKKworCS8qCisJICogZ2V0IGFuZCBpbml0aWFsaXplIHRoZSByZXNwb25jZSBmcmFtZQorCSAqLworCWlmIChzYmFfY21kID09IENIQU5HRV9BTExPQ0FUSU9OKSB7CisJCWlmICghKG1iPXNtdF9idWlsZF9mcmFtZShzbWMsU01UX1JBRixTTVRfUkVQTFksCisJCQkJc2l6ZW9mKHN0cnVjdCBzbXRfc2JhX2NoZykpKSkKKwkJCQlyZXR1cm4gOworCX0KKwllbHNlIHsKKwkJaWYgKCEobWI9c210X2J1aWxkX2ZyYW1lKHNtYyxTTVRfUkFGLFNNVF9SRVBMWSwKKwkJCQlzaXplb2Yoc3RydWN0IHNtdF9zYmFfcmVwX3JlcykpKSkKKwkJCQlyZXR1cm4gOworCX0KKworCWNoZyA9IHNtdG9kKG1iLHN0cnVjdCBzbXRfc2JhX2NoZyAqKSA7CisJY2hnLT5zbXQuc210X3RpZCA9IHNtLT5zbXRfdGlkIDsKKwljaGctPnNtdC5zbXRfZGVzdCA9IHNtLT5zbXRfc291cmNlIDsKKworCS8qIHNldCBQMTUgKi8KKwljaGctPnNfdHlwZS5wYXJhLnBfdHlwZSA9IFNNVF9QMDAxNSA7CisJY2hnLT5zX3R5cGUucGFyYS5wX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMDAxNSkgLSBQQVJBX0xFTiA7CisJY2hnLT5zX3R5cGUucmVzX3R5cGUgPSBTWU5DX0JXIDsKKworCS8qIHNldCBQMTYgKi8KKwljaGctPmNtZC5wYXJhLnBfdHlwZSA9IFNNVF9QMDAxNiA7CisJY2hnLT5jbWQucGFyYS5wX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMDAxNikgLSBQQVJBX0xFTiA7CisJY2hnLT5jbWQuc2JhX2NtZCA9IHNiYV9jbWQgOworCisJLyogc2V0IFAzMjBCICovCisJY2hnLT5wYXRoLnBhcmEucF90eXBlID0gU01UX1AzMjBCIDsKKwljaGctPnBhdGgucGFyYS5wX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMzIwYikgLSBQQVJBX0xFTiA7CisJY2hnLT5wYXRoLm1pYl9pbmRleCA9IFNCQVBBVEhJTkRFWCA7CisJY2hnLT5wYXRoLnBhdGhfcGFkID0gKHVfc2hvcnQpTlVMTCA7CisJY2hnLT5wYXRoLnBhdGhfaW5kZXggPSBQUklNQVJZX1JJTkcgOworCisJLyogc2V0IFAzMjBGICovCisJY2hnLT5wYXlsb2FkLnBhcmEucF90eXBlID0gU01UX1AzMjBGIDsKKwljaGctPnBheWxvYWQucGFyYS5wX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMzIwZikgLSBQQVJBX0xFTiA7CisJY2hnLT5wYXlsb2FkLm1pYl9pbmRleCA9IFNCQVBBVEhJTkRFWCA7CisJY2hnLT5wYXlsb2FkLm1pYl9wYXlsb2FkID0gc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhTYmFQYXlsb2FkIDsKKworCS8qIHNldCBQMzIxMCAqLworCWNoZy0+b3ZlcmhlYWQucGFyYS5wX3R5cGUgPSBTTVRfUDMyMTAgOworCWNoZy0+b3ZlcmhlYWQucGFyYS5wX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMzIxMCkgLSBQQVJBX0xFTiA7CisJY2hnLT5vdmVyaGVhZC5taWJfaW5kZXggPSBTQkFQQVRISU5ERVggOworCWNoZy0+b3ZlcmhlYWQubWliX292ZXJoZWFkID0gc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhTYmFPdmVyaGVhZCA7CisKKwlpZiAoc2JhX2NtZCA9PSBDSEFOR0VfQUxMT0NBVElPTikgeworCQkvKiBzZXQgUDFBICovCisJCWNoZy0+Y2F0LnBhcmEucF90eXBlID0gU01UX1AwMDFBIDsKKwkJY2hnLT5jYXQucGFyYS5wX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMDAxYSkgLSBQQVJBX0xFTiA7CisJCXAgPSAodm9pZCAqKSBzbV90b19wYXJhKHNtYyxzbSxTTVRfUDAwMUEpIDsKKwkJY2hnLT5jYXQuY2F0ZWdvcnkgPSAoKHN0cnVjdCBzbXRfcF8wMDFhICopcCktPmNhdGVnb3J5IDsKKwl9CisJZHVtcF9zbXQoc21jLChzdHJ1Y3Qgc210X2hlYWRlciAqKWNoZywiUkFGIikgOworCWVzc19zZW5kX2ZyYW1lKHNtYyxtYikgOworfQorCit2b2lkIGVzc190aW1lcl9wb2xsKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWlmICghc21jLT5lc3MucmFmX2FjdF90aW1lcl9wb2xsKQorCQlyZXR1cm4gOworCisJREJfRVNTTigyLCJFU1M6IHRpbWVyX3BvbGxcbiIsMCwwKSA7CisKKwlzbWMtPmVzcy50aW1lcl9jb3VudCsrIDsKKwlpZiAoc21jLT5lc3MudGltZXJfY291bnQgPT0gMTApIHsKKwkJc21jLT5lc3MudGltZXJfY291bnQgPSAwIDsKKwkJZXNzX3NlbmRfYWxjX3JlcShzbWMpIDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVzc19zZW5kX2FsY19yZXEoc3RydWN0IHNfc21jICpzbWMpCit7CisJc3RydWN0IHNtdF9zYmFfYWxjX3JlcSAqcmVxIDsKKwlTTWJ1ZgkqbWIgOworCisJLyoKKwkgKiBzZW5kIG5ldmVyIGFsbG9jYXRpb24gcmVxdWVzdCB3aGVyZSB0aGUgcmVxdWVzdGVkIHBheWxvYWQgYW5kCisJICogb3ZlcmhlYWQgaXMgemVybyBvciBkZWFsbG9jYXRlIGJhbmR3aWRodCB3aGVuIG5vIGJhbmR3aWR0aCBpcworCSAqIHBhcnNlZAorCSAqLworCWlmICghc21jLT5taWIuZmRkaUVTU1BheWxvYWQpIHsKKwkJc21jLT5taWIuZmRkaUVTU092ZXJoZWFkID0gMCA7CisJfQorCWVsc2UgeworCQlpZiAoIXNtYy0+bWliLmZkZGlFU1NPdmVyaGVhZCkKKwkJCXNtYy0+bWliLmZkZGlFU1NPdmVyaGVhZCA9IERFRkFVTFRfT1YgOworCX0KKworCWlmIChzbWMtPm1pYi5mZGRpRVNTT3ZlcmhlYWQgPT0KKwkJc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhTYmFPdmVyaGVhZCAmJgorCQlzbWMtPm1pYi5mZGRpRVNTUGF5bG9hZCA9PQorCQlzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFNiYVBheWxvYWQpeworCQlzbWMtPmVzcy5yYWZfYWN0X3RpbWVyX3BvbGwgPSBGQUxTRSA7CisJCXNtYy0+ZXNzLnRpbWVyX2NvdW50ID0gNyA7CS8qIG5leHQgUkFGIGFsYyByZXEgYWZ0ZXIgMyBzICovCisJCXJldHVybiA7CisJfQorCQorCS8qCisJICogZ2V0IGFuZCBpbml0aWFsaXplIHRoZSByZXNwb25jZSBmcmFtZQorCSAqLworCWlmICghKG1iPXNtdF9idWlsZF9mcmFtZShzbWMsU01UX1JBRixTTVRfUkVRVUVTVCwKKwkJCXNpemVvZihzdHJ1Y3Qgc210X3NiYV9hbGNfcmVxKSkpKQorCQkJcmV0dXJuIDsKKwlyZXEgPSBzbXRvZChtYixzdHJ1Y3Qgc210X3NiYV9hbGNfcmVxICopIDsKKwlyZXEtPnNtdC5zbXRfdGlkID0gc21jLT5lc3MuYWxsb2NfdHJhbnNfaWQgPSBzbXRfZ2V0X3RpZChzbWMpIDsKKwlyZXEtPnNtdC5zbXRfZGVzdCA9IHNtdF9zYmFfZGEgOworCisJLyogc2V0IFAxNSAqLworCXJlcS0+c190eXBlLnBhcmEucF90eXBlID0gU01UX1AwMDE1IDsKKwlyZXEtPnNfdHlwZS5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF8wMDE1KSAtIFBBUkFfTEVOIDsKKwlyZXEtPnNfdHlwZS5yZXNfdHlwZSA9IFNZTkNfQlcgOworCisJLyogc2V0IFAxNiAqLworCXJlcS0+Y21kLnBhcmEucF90eXBlID0gU01UX1AwMDE2IDsKKwlyZXEtPmNtZC5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF8wMDE2KSAtIFBBUkFfTEVOIDsKKwlyZXEtPmNtZC5zYmFfY21kID0gUkVRVUVTVF9BTExPQ0FUSU9OIDsKKworCS8qCisJICogc2V0IHRoZSBwYXJhbWV0ZXIgdHlwZSBhbmQgcGFyYW1ldGVyIGxlbmdodCBvZiBhbGwgdXNlZAorCSAqIHBhcmFtZXRlcnMKKwkgKi8KKworCS8qIHNldCBQMzIwQiAqLworCXJlcS0+cGF0aC5wYXJhLnBfdHlwZSA9IFNNVF9QMzIwQiA7CisJcmVxLT5wYXRoLnBhcmEucF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzMyMGIpIC0gUEFSQV9MRU4gOworCXJlcS0+cGF0aC5taWJfaW5kZXggPSBTQkFQQVRISU5ERVggOworCXJlcS0+cGF0aC5wYXRoX3BhZCA9ICh1X3Nob3J0KU5VTEwgOworCXJlcS0+cGF0aC5wYXRoX2luZGV4ID0gUFJJTUFSWV9SSU5HIDsKKworCS8qIHNldCBQMDAxNyAqLworCXJlcS0+cGxfcmVxLnBhcmEucF90eXBlID0gU01UX1AwMDE3IDsKKwlyZXEtPnBsX3JlcS5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF8wMDE3KSAtIFBBUkFfTEVOIDsKKwlyZXEtPnBsX3JlcS5zYmFfcGxfcmVxID0gc21jLT5taWIuZmRkaUVTU1BheWxvYWQgLQorCQlzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFNiYVBheWxvYWQgOworCisJLyogc2V0IFAwMDE4ICovCisJcmVxLT5vdl9yZXEucGFyYS5wX3R5cGUgPSBTTVRfUDAwMTggOworCXJlcS0+b3ZfcmVxLnBhcmEucF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzAwMTgpIC0gUEFSQV9MRU4gOworCXJlcS0+b3ZfcmVxLnNiYV9vdl9yZXEgPSBzbWMtPm1pYi5mZGRpRVNTT3ZlcmhlYWQgLQorCQlzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFNiYU92ZXJoZWFkIDsKKworCS8qIHNldCBQMzIwRiAqLworCXJlcS0+cGF5bG9hZC5wYXJhLnBfdHlwZSA9IFNNVF9QMzIwRiA7CisJcmVxLT5wYXlsb2FkLnBhcmEucF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzMyMGYpIC0gUEFSQV9MRU4gOworCXJlcS0+cGF5bG9hZC5taWJfaW5kZXggPSBTQkFQQVRISU5ERVggOworCXJlcS0+cGF5bG9hZC5taWJfcGF5bG9hZCA9IHNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIU2JhUGF5bG9hZCA7CisKKwkvKiBzZXQgUDMyMTAgKi8KKwlyZXEtPm92ZXJoZWFkLnBhcmEucF90eXBlID0gU01UX1AzMjEwIDsKKwlyZXEtPm92ZXJoZWFkLnBhcmEucF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzMyMTApIC0gUEFSQV9MRU4gOworCXJlcS0+b3ZlcmhlYWQubWliX2luZGV4ID0gU0JBUEFUSElOREVYIDsKKwlyZXEtPm92ZXJoZWFkLm1pYl9vdmVyaGVhZCA9IHNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIU2JhT3ZlcmhlYWQgOworCisJLyogc2V0IFAxOSAqLworCXJlcS0+YV9hZGRyLnBhcmEucF90eXBlID0gU01UX1AwMDE5IDsKKwlyZXEtPmFfYWRkci5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF8wMDE5KSAtIFBBUkFfTEVOIDsKKwlyZXEtPmFfYWRkci5zYmFfcGFkID0gKHVfc2hvcnQpTlVMTCA7CisJcmVxLT5hX2FkZHIuYWxsb2NfYWRkciA9IG51bGxfYWRkciA7CisKKwkvKiBzZXQgUDFBICovCisJcmVxLT5jYXQucGFyYS5wX3R5cGUgPSBTTVRfUDAwMUEgOworCXJlcS0+Y2F0LnBhcmEucF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzAwMWEpIC0gUEFSQV9MRU4gOworCXJlcS0+Y2F0LmNhdGVnb3J5ID0gc21jLT5taWIuZmRkaUVTU0NhdGVnb3J5IDsKKworCS8qIHNldCBQMUIgKi8KKwlyZXEtPnRuZWcucGFyYS5wX3R5cGUgPSBTTVRfUDAwMUIgOworCXJlcS0+dG5lZy5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF8wMDFiKSAtIFBBUkFfTEVOIDsKKwlyZXEtPnRuZWcubWF4X3RfbmVnID0gc21jLT5taWIuZmRkaUVTU01heFROZWcgOworCisJLyogc2V0IFAxQyAqLworCXJlcS0+c2VnbS5wYXJhLnBfdHlwZSA9IFNNVF9QMDAxQyA7CisJcmVxLT5zZWdtLnBhcmEucF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzAwMWMpIC0gUEFSQV9MRU4gOworCXJlcS0+c2VnbS5taW5fc2VnX3NpeiA9IHNtYy0+bWliLmZkZGlFU1NNaW5TZWdtZW50U2l6ZSA7CisKKwlkdW1wX3NtdChzbWMsKHN0cnVjdCBzbXRfaGVhZGVyICopcmVxLCJSQUYiKSA7CisJZXNzX3NlbmRfZnJhbWUoc21jLG1iKSA7Cit9CisKK3N0YXRpYyB2b2lkIGVzc19zZW5kX2ZyYW1lKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIpCit7CisJLyoKKwkgKiBjaGVjayBpZiB0aGUgZnJhbWUgbXVzdCBiZSBzZW5kIHRvIHRoZSBvd24gRVNTCisJICovCisJaWYgKHNtYy0+ZXNzLmxvY2FsX3NiYV9hY3RpdmUpIHsKKwkJLyoKKwkJICogU2VuZCB0aGUgQ2hhbmdlIFJlcGx5IHRvIHRoZSBsb2NhbCBTQkEKKwkJICovCisJCURCX0VTUygiRVNTOlNlbmQgdG8gdGhlIGxvY2FsIFNCQVxuIiwwLDApIDsKKwkJaWYgKCFzbWMtPmVzcy5zYmFfcmVwbHlfcGVuZCkKKwkJCXNtYy0+ZXNzLnNiYV9yZXBseV9wZW5kID0gbWIgOworCQllbHNlIHsKKwkJCURCX0VTUygiRnJhbWUgaXMgbG9zdCAtIGFub3RoZXIgZnJhbWUgd2FzIHBlbmRpbmdcbiIsMCwwKTsKKwkJCXNtdF9mcmVlX21idWYoc21jLG1iKSA7CisJCX0KKwl9CisJZWxzZSB7CisJCS8qCisJCSAqIFNlbmQgdGhlIFNCQSBSQUYgQ2hhbmdlIFJlcGx5IHRvIHRoZSBuZXR3b3JrCisJCSAqLworCQlEQl9FU1MoIkVTUzpTZW5kIHRvIHRoZSBuZXR3b3JrXG4iLDAsMCkgOworCQlzbXRfc2VuZF9mcmFtZShzbWMsbWIsRkNfU01UX0lORk8sMCkgOworCX0KK30KKwordm9pZCBlc3NfcGFyYV9jaGFuZ2Uoc3RydWN0IHNfc21jICpzbWMpCit7CisJKHZvaWQpcHJvY2Vzc19id19hbGxvYyhzbWMsKGxvbmcpc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhTYmFQYXlsb2FkLAorCQkobG9uZylzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFNiYU92ZXJoZWFkKSA7Cit9CisKK3N0YXRpYyB2b2lkIGVzc19jb25maWdfZmlmbyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwkvKgorCSAqIGlmIG5vdGhpbmcgdG8gZG8gZXhpdCAKKwkgKi8KKwlpZiAoc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhTYmFQYXlsb2FkKSB7CisJCWlmIChzbWMtPmh3LmZwLmZpZm8uZmlmb19jb25maWdfbW9kZSAmIFNZTkNfVFJBRkZJQ19PTiAmJgorCQkJKHNtYy0+aHcuZnAuZmlmby5maWZvX2NvbmZpZ19tb2RlJlNFTkRfQVNZTkNfQVNfU1lOQykgPT0KKwkJCXNtYy0+bWliLmZkZGlFU1NTeW5jaFR4TW9kZSkgeworCQkJcmV0dXJuIDsKKwkJfQorCX0KKwllbHNlIHsKKwkJaWYgKCEoc21jLT5ody5mcC5maWZvLmZpZm9fY29uZmlnX21vZGUgJiBTWU5DX1RSQUZGSUNfT04pKSB7CisJCQlyZXR1cm4gOworCQl9CisJfQorCisJLyoKKwkgKiBzcGxpdCB1cCB0aGUgRklGTyBhbmQgcmVpbml0aWFsaXplIHRoZSBxdWV1ZXMKKwkgKi8KKwlmb3JtYWNfcmVpbml0X3R4KHNtYykgOworfQorCisjZW5kaWYgLyogRVNTICovCisKKyNlbmRpZgkvKiBubyBTTElNX1NNVCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2ZwbHVzdG0uYyBiL2RyaXZlcnMvbmV0L3NrZnAvZnBsdXN0bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZTc4NDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2ZwbHVzdG0uYwpAQCAtMCwwICsxLDE1NjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglTZWUgdGhlIGZpbGUgInNrZmRkaS5jIiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBGT1JNQUMrIERyaXZlciBmb3IgdGFnIG1vZGUKKyAqLworCisjaW5jbHVkZSAiaC90eXBlcy5oIgorI2luY2x1ZGUgImgvZmRkaS5oIgorI2luY2x1ZGUgImgvc21jLmgiCisjaW5jbHVkZSAiaC9zdXBlcm5fMi5oIgorI2luY2x1ZGUgImNhbi5jIgorCisjaWZuZGVmCWxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIElEX3NjY3NbXSA9ICJAKCMpZnBsdXN0bS5jCTEuMzIgOTkvMDIvMjMgKEMpIFNLICIgOworI2VuZGlmCisKKyNpZm5kZWYgVU5VU0VECisjaWZkZWYgIGxpbnQKKyNkZWZpbmUgVU5VU0VEKHgpCSh4KSA9ICh4KQorI2Vsc2UKKyNkZWZpbmUgVU5VU0VEKHgpCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIEZNX0FERFJYCSAoRk1fQURERVR8Rk1fRVhHUEEwfEZNX0VYR1BBMSkKKyNkZWZpbmUgTVMyQkNMSyh4KQkoKHgpKjEyNTAwTCkKKyNkZWZpbmUgVVMyQkNMSyh4KQkoKHgpKjEyNTBMKQorCisvKgorICogcHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGJ1aWxkX2NsYWltX2JlYWNvbihzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIHRfcmVxdWVzdCk7CitzdGF0aWMgaW50IGluaXRfbWFjKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgYWxsKTsKK3N0YXRpYyB2b2lkIHJ0bV9pbml0KHN0cnVjdCBzX3NtYyAqc21jKTsKK3N0YXRpYyB2b2lkIHNtdF9zcGxpdF91cF9maWZvKHN0cnVjdCBzX3NtYyAqc21jKTsKKworI2lmICghZGVmaW5lZChOT19TTVRfUEFOSUMpIHx8IGRlZmluZWQoREVCVUcpKQorc3RhdGljCWNoYXIgd3JpdGVfbWRyX3dhcm5pbmcgW10gPSAiRTM1MCB3cml0ZV9tZHIoKSBGTV9TTlBQTkQgaXMgc2V0XG4iOworc3RhdGljCWNoYXIgY2FtX3dhcm5pbmcgW10gPSAiRV9TTVRfMDA0OiBDQU0gc3RpbGwgYnVzeVxuIjsKKyNlbmRpZgorCisjZGVmaW5lCURVTU1ZX1JFQUQoKQlzbWMtPmh3Lm1jX2R1bW15ID0gKHVfc2hvcnQpIGlucChBRERSKEIwX1JBUCkpCisKKyNkZWZpbmUJQ0hFQ0tfTlBQKCkgewl1bnNpZ25lZCBrID0gMTAwMDAgO1wKKwkJCXdoaWxlICgoaW5wdyhGTV9BKEZNX1NUTUNITikpICYgRk1fU05QUE5EKSAmJiBrKSBrLS07XAorCQkJaWYgKCFrKSB7IFwKKwkJCQlTTVRfUEFOSUMoc21jLFNNVF9FMDEzMCwgU01UX0UwMTMwX01TRykgOyBcCisJCQl9CVwKKwkJfQorCisjZGVmaW5lCUNIRUNLX0NBTSgpIHsJdW5zaWduZWQgayA9IDEwIDtcCisJCQl3aGlsZSAoIShpbnB3KEZNX0EoRk1fQUZTVEFUKSkgJiBGTV9ET05FKSAmJiBrKSBrLS07XAorCQkJaWYgKCFrKSB7IFwKKwkJCQlTTVRfUEFOSUMoc21jLFNNVF9FMDEzMSwgU01UX0UwMTMxX01TRykgOyBcCisJCQl9CVwKKwkJfQorCitjb25zdCBzdHJ1Y3QgZmRkaV9hZGRyIGZkZGlfYnJvYWRjYXN0ID0ge3sweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZn19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBmZGRpX2FkZHIgbnVsbF9hZGRyID0ge3swLDAsMCwwLDAsMH19Oworc3RhdGljIGNvbnN0IHN0cnVjdCBmZGRpX2FkZHIgZGJlYWNvbl9tdWx0aSA9IHt7MHgwMSwweDgwLDB4YzIsMHgwMCwweDAxLDB4MDB9fTsKKworc3RhdGljIGNvbnN0IHVfc2hvcnQgbXlfc2FpZCA9IDB4ZmZmZiA7CS8qIHNob3J0IGFkZHJlc3MgKG4udS4pICovCitzdGF0aWMgY29uc3QgdV9zaG9ydCBteV9zYWdwID0gMHhmZmZmIDsJLyogc2hvcnQgZ3JvdXAgYWRkcmVzcyAobi51LikgKi8KKworLyoKKyAqIGRlZmluZSBteSBhZGRyZXNzCisgKi8KKyNpZmRlZglVU0VfQ0FOX0FERFIKKyNkZWZpbmUgTUEJc21jLT5ody5mZGRpX2Nhbm9uX2FkZHIKKyNlbHNlCisjZGVmaW5lIE1BCXNtYy0+aHcuZmRkaV9ob21lX2FkZHIKKyNlbmRpZgorCisKKy8qCisgKiB1c2VmdWwgaW50ZXJydXB0IGJpdHMKKyAqLworc3RhdGljIGludCBtYWNfaW1zazF1ID0gRk1fU1RYQUJSUyB8IEZNX1NUWEFCUkEwIHwgRk1fU1hNVEFCVCA7CitzdGF0aWMgaW50IG1hY19pbXNrMWwgPSBGTV9TUUxDS1MgfCBGTV9TUUxDS0EwIHwgRk1fU1BDRVBEUyB8IEZNX1NQQ0VQREEwfAorCQkJRk1fU1RCVVJTIHwgRk1fU1RCVVJBMCA7CisKKwkvKiBkZWxldGUgRk1fU1JCRkwgYWZ0ZXIgdGVzdHMgKi8KK3N0YXRpYyBpbnQgbWFjX2ltc2sydSA9IEZNX1NFUlJTRiB8IEZNX1NORlNMRCB8IEZNX1NSQ1ZPVlIgfCBGTV9TUkJGTCB8CisJCQlGTV9TTVlDTE0gOworc3RhdGljIGludCBtYWNfaW1zazJsID0gRk1fU1RSVEVYUiB8IEZNX1NEVVBDTE0gfCBGTV9TRlJNQ1RSIHwKKwkJCUZNX1NFUlJDVFIgfCBGTV9TTFNUQ1RSIHwKKwkJCUZNX1NUUlRFWFAgfCBGTV9TTVVMVERBIHwgRk1fU1JOR09QIDsKKworc3RhdGljIGludCBtYWNfaW1zazN1ID0gRk1fU1JDVk9WUjIgfCBGTV9TUkJGTDIgOworc3RhdGljIGludCBtYWNfaW1zazNsID0gRk1fU1JQRVJSUTIgfCBGTV9TUlBFUlJRMSA7CisKK3N0YXRpYyBpbnQgbWFjX2JlYWNvbl9pbXNrMnUgPSBGTV9TT1RSQkVDIHwgRk1fU01ZQkVDIHwgRk1fU0JFQyB8CisJCQlGTV9TTE9DTE0gfCBGTV9TSElDTE0gfCBGTV9TTVlDTE0gfCBGTV9TQ0xNIDsKKworCitzdGF0aWMgdV9sb25nIG1hY19nZXRfdG5lZyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwl1X2xvbmcJdG5lZyA7CisKKwl0bmVnID0gKHVfbG9uZykoKGxvbmcpaW5wdyhGTV9BKEZNX1RORUcpKTw8NSkgOworCXJldHVybigodV9sb25nKSgodG5lZyArICgoaW5wdyhGTV9BKEZNX1RNUlMpKT4+MTApJjB4MWYpKSB8CisJCTB4ZmZlMDAwMDBMKSkgOworfQorCit2b2lkIG1hY191cGRhdGVfY291bnRlcihzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNGcmFtZV9DdCA9CisJCShzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNGcmFtZV9DdCAmIDB4ZmZmZjAwMDBMKQorCQkrICh1X3Nob3J0KSBpbnB3KEZNX0EoRk1fRkNOVFIpKSA7CisJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDTG9zdF9DdCA9CisJCShzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNMb3N0X0N0ICYgMHhmZmZmMDAwMEwpCisJCSsgKHVfc2hvcnQpIGlucHcoRk1fQShGTV9MQ05UUikpIDsKKwlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNFcnJvcl9DdCA9CisJCShzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNFcnJvcl9DdCAmIDB4ZmZmZjAwMDBMKQorCQkrICh1X3Nob3J0KSBpbnB3KEZNX0EoRk1fRUNOVFIpKSA7CisJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVF9OZWcgPSBtYWNfZ2V0X3RuZWcoc21jKSA7CisjaWZkZWYgU01UX1JFQUxfVE9LRU5fQ1QKKwkvKgorCSAqIElmIHRoZSB0b2tlbiBjb3VudGVyIGlzIGVtdWxhdGVkIGl0IGlzIHVwZGF0ZWQgaW4gc210X2V2ZW50LgorCSAqLworCVRCRAorI2Vsc2UKKwlzbXRfZW11bGF0ZV90b2tlbl9jdCggc21jLCBNQUMwICk7CisjZW5kaWYKK30KKworLyoKKyAqIHdyaXRlIGxvbmcgdmFsdWUgaW50byBidWZmZXIgbWVtb3J5IG92ZXIgbWVtb3J5IGRhdGEgcmVnaXN0ZXIgKE1EUiksCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX21kcihzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIHZhbCkKK3sKKwlDSEVDS19OUFAoKSA7CisJTURSVyh2YWwpIDsKK30KKworI2lmIDAKKy8qCisgKiByZWFkIGxvbmcgdmFsdWUgZnJvbSBidWZmZXIgbWVtb3J5IG92ZXIgbWVtb3J5IGRhdGEgcmVnaXN0ZXIgKE1EUiksCisgKi8KK3N0YXRpYyB1X2xvbmcgcmVhZF9tZHIoc3RydWN0IHNfc21jICpzbWMsIHVuc2lnbmVkIGludCBhZGRyKQoreworCWxvbmcgcCA7CisJQ0hFQ0tfTlBQKCkgOworCU1BUlIoYWRkcikgOworCW91dHB3KEZNX0EoRk1fQ01EUkVHMSksRk1fSVJNRU1XTykgOworCUNIRUNLX05QUCgpIDsJLyogbmVlZGVkIGZvciBQQ0kgdG8gcHJldmVudCBmcm9tIHRpbWVpbmcgdmlvbGF0aW9ucyAqLworLyoJcCA9IE1EUlIoKSA7ICovCS8qIGJhZCByZWFkIHZhbHVlcyBpZiB0aGUgd29ya2Fyb3VuZCAqLworCQkJLyogc21jLT5ody5tY19kdW1teSA9ICooKHNob3J0IHZvbGF0aWxlIGZhciAqKShhZGRyKSkpKi8KKwkJCS8qIGlzIHVzZWQgKi8KKwlwID0gKHVfbG9uZylpbnB3KEZNX0EoRk1fTURSVSkpPDwxNiA7CisJcCArPSAodV9sb25nKWlucHcoRk1fQShGTV9NRFJMKSkgOworCXJldHVybihwKSA7Cit9CisjZW5kaWYKKworLyoKKyAqIGNsZWFyIGJ1ZmZlciBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQgaW5pdF9yYW0oc3RydWN0IHNfc21jICpzbWMpCit7CisJdV9zaG9ydCBpIDsKKworCXNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX3N0YXJ0ID0gMCA7CisJc21jLT5ody5mcC5maWZvLnJiY19yYW1fZW5kID0KKwkJc21jLT5ody5mcC5maWZvLnJiY19yYW1fc3RhcnQgKyBSQkNfTUVNX1NJWkUgOworCUNIRUNLX05QUCgpIDsKKwlNQVJXKHNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX3N0YXJ0KSA7CisJZm9yIChpID0gc21jLT5ody5mcC5maWZvLnJiY19yYW1fc3RhcnQ7CisJCWkgPCAodV9zaG9ydCkgKHNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX2VuZC0xKTsgaSsrKQorCQl3cml0ZV9tZHIoc21jLDBMKSA7CisJLyogRXJhc2UgdGhlIGxhc3QgYnl0ZSB0b28gKi8KKwl3cml0ZV9tZHIoc21jLDBMKSA7Cit9CisKKy8qCisgKiBzZXQgcmVjZWl2ZSBGSUZPIHBvaW50ZXIKKyAqLworc3RhdGljIHZvaWQgc2V0X3JlY3ZwdHIoc3RydWN0IHNfc21jICpzbWMpCit7CisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSBwb2ludGVyIGZvciByZWNlaXZlIHF1ZXVlIDEKKwkgKi8KKwlvdXRwdyhGTV9BKEZNX1JQUjEpLHNtYy0+aHcuZnAuZmlmby5yeDFfZmlmb19zdGFydCkgOwkvKiBSUFIxICovCisJb3V0cHcoRk1fQShGTV9TV1BSMSksc21jLT5ody5mcC5maWZvLnJ4MV9maWZvX3N0YXJ0KSA7CS8qIFNXUFIxICovCisJb3V0cHcoRk1fQShGTV9XUFIxKSxzbWMtPmh3LmZwLmZpZm8ucngxX2ZpZm9fc3RhcnQpIDsJLyogV1BSMSAqLworCW91dHB3KEZNX0EoRk1fRUFSVjEpLHNtYy0+aHcuZnAuZmlmby50eF9zX3N0YXJ0LTEpIDsJLyogRUFSVjEgKi8KKworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgcG9pbnRlciBmb3IgcmVjZWl2ZSBxdWV1ZSAyCisJICovCisJaWYgKHNtYy0+aHcuZnAuZmlmby5yeDJfZmlmb19zaXplKSB7CisJCW91dHB3KEZNX0EoRk1fUlBSMiksc21jLT5ody5mcC5maWZvLnJ4Ml9maWZvX3N0YXJ0KSA7CisJCW91dHB3KEZNX0EoRk1fU1dQUjIpLHNtYy0+aHcuZnAuZmlmby5yeDJfZmlmb19zdGFydCkgOworCQlvdXRwdyhGTV9BKEZNX1dQUjIpLHNtYy0+aHcuZnAuZmlmby5yeDJfZmlmb19zdGFydCkgOworCQlvdXRwdyhGTV9BKEZNX0VBUlYyKSxzbWMtPmh3LmZwLmZpZm8ucmJjX3JhbV9lbmQtMSkgOworCX0KKwllbHNlIHsKKwkJb3V0cHcoRk1fQShGTV9SUFIyKSxzbWMtPmh3LmZwLmZpZm8ucmJjX3JhbV9lbmQtMSkgOworCQlvdXRwdyhGTV9BKEZNX1NXUFIyKSxzbWMtPmh3LmZwLmZpZm8ucmJjX3JhbV9lbmQtMSkgOworCQlvdXRwdyhGTV9BKEZNX1dQUjIpLHNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX2VuZC0xKSA7CisJCW91dHB3KEZNX0EoRk1fRUFSVjIpLHNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX2VuZC0xKSA7CisJfQorfQorCisvKgorICogc2V0IHRyYW5zbWl0IEZJRk8gcG9pbnRlcgorICovCitzdGF0aWMgdm9pZCBzZXRfdHhwdHIoc3RydWN0IHNfc21jICpzbWMpCit7CisJb3V0cHcoRk1fQShGTV9DTURSRUcyKSxGTV9JUlNUUSkgOwkvKiByZXNldCB0cmFuc21pdCBxdWV1ZXMgKi8KKworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgcG9pbnRlciBmb3IgYXN5bmNocm9ub3VzIHRyYW5zbWl0IHF1ZXVlCisJICovCisJb3V0cHcoRk1fQShGTV9SUFhBMCksc21jLT5ody5mcC5maWZvLnR4X2EwX3N0YXJ0KSA7CS8qIFJQWEEwICovCisJb3V0cHcoRk1fQShGTV9TV1BYQTApLHNtYy0+aHcuZnAuZmlmby50eF9hMF9zdGFydCkgOwkvKiBTV1BYQTAgKi8KKwlvdXRwdyhGTV9BKEZNX1dQWEEwKSxzbWMtPmh3LmZwLmZpZm8udHhfYTBfc3RhcnQpIDsJLyogV1BYQTAgKi8KKwlvdXRwdyhGTV9BKEZNX0VBQTApLHNtYy0+aHcuZnAuZmlmby5yeDJfZmlmb19zdGFydC0xKSA7CS8qIEVBQTAgKi8KKworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgcG9pbnRlciBmb3Igc3luY2hyb25vdXMgdHJhbnNtaXQgcXVldWUKKwkgKi8KKwlpZiAoc21jLT5ody5mcC5maWZvLnR4X3Nfc2l6ZSkgeworCQlvdXRwdyhGTV9BKEZNX1JQWFMpLHNtYy0+aHcuZnAuZmlmby50eF9zX3N0YXJ0KSA7CisJCW91dHB3KEZNX0EoRk1fU1dQWFMpLHNtYy0+aHcuZnAuZmlmby50eF9zX3N0YXJ0KSA7CisJCW91dHB3KEZNX0EoRk1fV1BYUyksc21jLT5ody5mcC5maWZvLnR4X3Nfc3RhcnQpIDsKKwkJb3V0cHcoRk1fQShGTV9FQVMpLHNtYy0+aHcuZnAuZmlmby50eF9hMF9zdGFydC0xKSA7CisJfQorCWVsc2UgeworCQlvdXRwdyhGTV9BKEZNX1JQWFMpLHNtYy0+aHcuZnAuZmlmby50eF9hMF9zdGFydC0xKSA7CisJCW91dHB3KEZNX0EoRk1fU1dQWFMpLHNtYy0+aHcuZnAuZmlmby50eF9hMF9zdGFydC0xKSA7CisJCW91dHB3KEZNX0EoRk1fV1BYUyksc21jLT5ody5mcC5maWZvLnR4X2EwX3N0YXJ0LTEpIDsKKwkJb3V0cHcoRk1fQShGTV9FQVMpLHNtYy0+aHcuZnAuZmlmby50eF9hMF9zdGFydC0xKSA7CisJfQorfQorCisvKgorICogaW5pdCBtZW1vcnkgYnVmZmVyIG1hbmFnZW1lbnQgcmVnaXN0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfcmJjKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXVfc2hvcnQJcmJjX3JhbV9hZGRyIDsKKworCS8qCisJICogc2V0IHVudXNlZCBwb2ludGVycyBvciBwZXJtYW5lbnQgcG9pbnRlcnMKKwkgKi8KKwlyYmNfcmFtX2FkZHIgPSBzbWMtPmh3LmZwLmZpZm8ucngyX2ZpZm9fc3RhcnQgLSAxIDsKKworCW91dHB3KEZNX0EoRk1fUlBYQTEpLHJiY19yYW1fYWRkcikgOwkvKiBhMS1zZW5kIHBvaW50ZXIgKi8KKwlvdXRwdyhGTV9BKEZNX1dQWEExKSxyYmNfcmFtX2FkZHIpIDsKKwlvdXRwdyhGTV9BKEZNX1NXUFhBMSkscmJjX3JhbV9hZGRyKSA7CisJb3V0cHcoRk1fQShGTV9FQUExKSxyYmNfcmFtX2FkZHIpIDsKKworCXNldF9yZWN2cHRyKHNtYykgOworCXNldF90eHB0cihzbWMpIDsKK30KKworLyoKKyAqIGluaXQgcnggcG9pbnRlcgorICovCitzdGF0aWMgdm9pZCBpbml0X3J4KHN0cnVjdCBzX3NtYyAqc21jKQoreworCXN0cnVjdCBzX3NtdF9yeF9xdWV1ZQkqcXVldWUgOworCisJLyoKKwkgKiBpbml0IGFsbCB0eCBkYXRhIHN0cnVjdHVyZXMgZm9yIHJlY2VpdmUgcXVldWUgMQorCSAqLworCXNtYy0+aHcuZnAucnhbUVVFVUVfUjFdID0gcXVldWUgPSAmc21jLT5ody5mcC5yeF9xW1FVRVVFX1IxXSA7CisJcXVldWUtPnJ4X2JtdV9jdGwgPSAoSFdfUFRSKSBBRERSKEIwX1IxX0NTUikgOworCXF1ZXVlLT5yeF9ibXVfZHNjID0gKEhXX1BUUikgQUREUihCNF9SMV9EQSkgOworCisJLyoKKwkgKiBpbml0IGFsbCB0eCBkYXRhIHN0cnVjdHVyZXMgZm9yIHJlY2VpdmUgcXVldWUgMgorCSAqLworCXNtYy0+aHcuZnAucnhbUVVFVUVfUjJdID0gcXVldWUgPSAmc21jLT5ody5mcC5yeF9xW1FVRVVFX1IyXSA7CisJcXVldWUtPnJ4X2JtdV9jdGwgPSAoSFdfUFRSKSBBRERSKEIwX1IyX0NTUikgOworCXF1ZXVlLT5yeF9ibXVfZHNjID0gKEhXX1BUUikgQUREUihCNF9SMl9EQSkgOworfQorCisvKgorICogc2V0IHRoZSBUU1lOQyByZWdpc3RlciBvZiB0aGUgRk9STUFDIHRvIHJlZ3VsYXRlIHN5bmNocm9ub3VzIHRyYW5zbWlzc2lvbgorICovCit2b2lkIHNldF9mb3JtYWNfdHN5bmMoc3RydWN0IHNfc21jICpzbWMsIGxvbmcgc3luY19idykKK3sKKwlvdXRwdyhGTV9BKEZNX1RTWU5DKSwodW5zaWduZWQgaW50KSAoKCgtc3luY19idykgPj4gNSkgJiAweGZmZmYpICkgOworfQorCisvKgorICogaW5pdCBhbGwgdHggZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfdHgoc3RydWN0IHNfc21jICpzbWMpCit7CisJc3RydWN0IHNfc210X3R4X3F1ZXVlCSpxdWV1ZSA7CisKKwkvKgorCSAqIGluaXQgYWxsIHR4IGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIHN5bmNocm9ub3VzIHF1ZXVlCisJICovCisJc21jLT5ody5mcC50eFtRVUVVRV9TXSA9IHF1ZXVlID0gJnNtYy0+aHcuZnAudHhfcVtRVUVVRV9TXSA7CisJcXVldWUtPnR4X2JtdV9jdGwgPSAoSFdfUFRSKSBBRERSKEIwX1hTX0NTUikgOworCXF1ZXVlLT50eF9ibXVfZHNjID0gKEhXX1BUUikgQUREUihCNV9YU19EQSkgOworCisjaWZkZWYgRVNTCisJc2V0X2Zvcm1hY190c3luYyhzbWMsc21jLT5lc3Muc3luY19idykgOworI2VuZGlmCisKKwkvKgorCSAqIGluaXQgYWxsIHR4IGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIGFzeW5jaHJvbm91cyBxdWV1ZSAwCisJICovCisJc21jLT5ody5mcC50eFtRVUVVRV9BMF0gPSBxdWV1ZSA9ICZzbWMtPmh3LmZwLnR4X3FbUVVFVUVfQTBdIDsKKwlxdWV1ZS0+dHhfYm11X2N0bCA9IChIV19QVFIpIEFERFIoQjBfWEFfQ1NSKSA7CisJcXVldWUtPnR4X2JtdV9kc2MgPSAoSFdfUFRSKSBBRERSKEI1X1hBX0RBKSA7CisKKworCWxsY19yZWNvdmVyX3R4KHNtYykgOworfQorCitzdGF0aWMgdm9pZCBtYWNfY291bnRlcl9pbml0KHN0cnVjdCBzX3NtYyAqc21jKQoreworCWludCBpIDsKKwl1X2xvbmcgKmVjIDsKKworCS8qCisJICogY2xlYXIgRk9STUFDKyBmcmFtZS0sIGxvc3QtIGFuZCBlcnJvciBjb3VudGVyCisJICovCisJb3V0cHcoRk1fQShGTV9GQ05UUiksMCkgOworCW91dHB3KEZNX0EoRk1fTENOVFIpLDApIDsKKwlvdXRwdyhGTV9BKEZNX0VDTlRSKSwwKSA7CisJLyoKKwkgKiBjbGVhciBpbnRlcm5hbCBlcnJvciBjb3VudGVyIHN0dWN0dXJlCisJICovCisJZWMgPSAodV9sb25nICopJnNtYy0+aHcuZnAuZXJyX3N0YXRzIDsKKwlmb3IgKGkgPSAoc2l6ZW9mKHN0cnVjdCBlcnJfc3QpL3NpemVvZihsb25nKSkgOyBpIDsgaS0tKQorCQkqZWMrKyA9IDBMIDsKKwlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNSaW5nT3BfQ3QgPSAwIDsKK30KKworLyoKKyAqIHNldCBGT1JNQUMgYWRkcmVzcywgYW5kIHRfcmVxdWVzdAorICovCitzdGF0aWMJdm9pZCBzZXRfZm9ybWFjX2FkZHIoc3RydWN0IHNfc21jICpzbWMpCit7CisJbG9uZwl0X3JlcXUgPSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUX1JlcSA7CisKKwlvdXRwdyhGTV9BKEZNX1NBSUQpLG15X3NhaWQpIDsJLyogc2V0IHNob3J0IGFkZHJlc3MgKi8KKwlvdXRwdyhGTV9BKEZNX0xBSUwpLCh1bnNpZ25lZCkoKHNtYy0+aHcuZmRkaV9ob21lX2FkZHIuYVs0XTw8OCkgKworCQkJCQlzbWMtPmh3LmZkZGlfaG9tZV9hZGRyLmFbNV0pKSA7CisJb3V0cHcoRk1fQShGTV9MQUlDKSwodW5zaWduZWQpKChzbWMtPmh3LmZkZGlfaG9tZV9hZGRyLmFbMl08PDgpICsKKwkJCQkJc21jLT5ody5mZGRpX2hvbWVfYWRkci5hWzNdKSkgOworCW91dHB3KEZNX0EoRk1fTEFJTSksKHVuc2lnbmVkKSgoc21jLT5ody5mZGRpX2hvbWVfYWRkci5hWzBdPDw4KSArCisJCQkJCXNtYy0+aHcuZmRkaV9ob21lX2FkZHIuYVsxXSkpIDsKKworCW91dHB3KEZNX0EoRk1fU0FHUCksbXlfc2FncCkgOwkvKiBzZXQgc2hvcnQgZ3JvdXAgYWRkcmVzcyAqLworCisJb3V0cHcoRk1fQShGTV9MQUdMKSwodW5zaWduZWQpKChzbWMtPmh3LmZwLmdyb3VwX2FkZHIuYVs0XTw8OCkgKworCQkJCQlzbWMtPmh3LmZwLmdyb3VwX2FkZHIuYVs1XSkpIDsKKwlvdXRwdyhGTV9BKEZNX0xBR0MpLCh1bnNpZ25lZCkoKHNtYy0+aHcuZnAuZ3JvdXBfYWRkci5hWzJdPDw4KSArCisJCQkJCXNtYy0+aHcuZnAuZ3JvdXBfYWRkci5hWzNdKSkgOworCW91dHB3KEZNX0EoRk1fTEFHTSksKHVuc2lnbmVkKSgoc21jLT5ody5mcC5ncm91cF9hZGRyLmFbMF08PDgpICsKKwkJCQkJc21jLT5ody5mcC5ncm91cF9hZGRyLmFbMV0pKSA7CisKKwkvKiBzZXQgcl9yZXF1ZXN0IHJlZ3MuIChNU1cgJiBMU1cgb2YgVFJUICkgKi8KKwlvdXRwdyhGTV9BKEZNX1RSRVExKSwodW5zaWduZWQpKHRfcmVxdT4+MTYpKSA7CisJb3V0cHcoRk1fQShGTV9UUkVRMCksKHVuc2lnbmVkKXRfcmVxdSkgOworfQorCitzdGF0aWMgdm9pZCBzZXRfaW50KGNoYXIgKnAsIGludCBsKQoreworCXBbMF0gPSAoY2hhcikobCA+PiAyNCkgOworCXBbMV0gPSAoY2hhcikobCA+PiAxNikgOworCXBbMl0gPSAoY2hhcikobCA+PiA4KSA7CisJcFszXSA9IChjaGFyKShsID4+IDApIDsKK30KKworLyoKKyAqIGNvcHkgVFggZGVzY3JpcHRvciB0byBidWZmZXIgbWVtCisgKiBhcHBlbmQgRkMgZmllbGQgYW5kIE1BQyBmcmFtZQorICogaWYgbW9yZSBiaXQgaXMgc2V0IGluIGRlc2NyCisgKglhcHBlbmQgcG9pbnRlciB0byBkZXNjcmlwdG9yIChlbmRsZXNzIGxvb3ApCisgKiBlbHNlCisgKglhcHBlbmQgJ2VuZCBvZiBjaGFpbicgcG9pbnRlcgorICovCitzdGF0aWMgdm9pZCBjb3B5X3R4X21hYyhzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIHRkLCBzdHJ1Y3QgZmRkaV9tYWMgKm1hYywKKwkJCXVuc2lnbmVkIG9mZiwgaW50IGxlbikKKy8qIHVfbG9uZyB0ZDsJCSB0cmFuc21pdCBkZXNjcmlwdG9yICovCisvKiBzdHJ1Y3QgZmRkaV9tYWMgKm1hYzsgbWFjIGZyYW1lIHBvaW50ZXIgKi8KKy8qIHVuc2lnbmVkIG9mZjsJIHN0YXJ0IGFkZHJlc3Mgd2l0aGluIGJ1ZmZlciBtZW1vcnkgKi8KKy8qIGludCBsZW4gOwkJIGxlbmdodCBvZiB0aGUgZnJhbWUgaW5jbHVkaW5nIHRoZSBGQyAqLworeworCWludAlpIDsKKwl1X2ludAkqcCA7CisKKwlDSEVDS19OUFAoKSA7CisJTUFSVyhvZmYpIDsJCS8qIHNldCBtZW1vcnkgYWRkcmVzcyByZWcgZm9yIHdyaXRlcyAqLworCisJcCA9ICh1X2ludCAqKSBtYWMgOworCWZvciAoaSA9IChsZW4gKyAzKS80IDsgaSA7IGktLSkgeworCQlpZiAoaSA9PSAxKSB7CisJCQkvKiBsYXN0IHdvcmQsIHNldCB0aGUgdGFnIGJpdCAqLworCQkJb3V0cHcoRk1fQShGTV9DTURSRUcyKSxGTV9JU1RUQikgOworCQl9CisJCXdyaXRlX21kcihzbWMsTURSX1JFVkVSU0UoKnApKSA7CisJCXArKyA7CisJfQorCisJb3V0cHcoRk1fQShGTV9DTURSRUcyKSxGTV9JU1RUQikgOwkvKiBzZXQgdGhlIHRhZyBiaXQgKi8KKwl3cml0ZV9tZHIoc21jLHRkKSA7CS8qIHdyaXRlIG92ZXIgbWVtb3J5IGRhdGEgcmVnIHRvIGJ1ZmZlciAqLworfQorCisvKgorCUJFR0lOX01BTlVBTF9FTlRSWShtb2R1bGU7dGVzdHM7MykKKwlIb3cgdG8gdGVzdCBkaXJlY3RlZCBiZWFjb24gZnJhbWVzCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJbyBJbnNlcnQgYSBicmVhayBwb2ludCBpbiB0aGUgZnVuY3Rpb24gYnVpbGRfY2xhaW1fYmVhY29uKCkKKwkgIGJlZm9yZSBjYWxsaW5nIGNvcHlfdHhfbWFjKCkgZm9yIGJ1aWxkaW5nIHRoZSBjbGFpbSBmcmFtZS4KKwlvIE1vZGlmeSB0aGUgUk0zX0RFVEVDVCBjYXNlIHNvIHRoYXQgdGhlIFJNNl9ERVRFQ1Qgc3RhdGUKKwkgIHdpbGwgYWx3YXlzIGVudGVyZWQgZnJvbSB0aGUgUk0zX0RFVEVDVCBzdGF0ZSAoZnVuY3Rpb24gcm10X2ZzbSgpLAorCSAgcm10LmMpCisJbyBDb21waWxlIHRoZSBkcml2ZXIuCisJbyBTZXQgdGhlIHBhcmFtZXRlciBUUkVRIGluIHRoZSBwcm90b2NvbC5pbmkgb3IgbmV0LmNmZyB0byBhCisJICBzbWFsbCB2YWx1ZSB0byBtYWtlIHN1cmUgeW91ciBzdGF0aW9uIHdpbGwgd2luIHRoZSBjbGFpbQorCSAgcHJvY2Vzcy4KKwlvIFN0YXJ0IHRoZSBkcml2ZXIuCisJbyBXaGVuIHlvdSByZWFjaCB0aGUgYnJlYWsgcG9pbnQsIG1vZGlmeSB0aGUgU0EgYW5kIERBIGFkZHJlc3MKKwkgIG9mIHRoZSBjbGFpbSBmcmFtZSAoZS5nLiBTQSA9IERBID0gMTAwMDVhZmZmZmZmKS4KKwlvIFdoZW4geW91IHNlZSBSTTNfREVURUNUIGFuZCBSTTZfREVURUNULCBvYnNlcnZlIHRoZSBkaXJlY3QKKwkgIGJlYWNvbiBmcmFtZXMgb24gdGhlIFVQUFNMQU5BLgorCisJRU5EX01BTlVBTF9FTlRSWQorICovCitzdGF0aWMgdm9pZCBkaXJlY3RlZF9iZWFjb24oc3RydWN0IHNfc21jICpzbWMpCit7CisJU0tfTE9DX0RFQ0wodV9pbnQsYVsyXSkgOworCisJLyoKKwkgKiBzZXQgVU5BIGluIGZyYW1lCisJICogZW5hYmxlIEZPUk1BQyB0byBzZW5kIGVuZGxlc3MgcXVldWUgb2YgZGlyZWN0ZWQgYmVhY29uCisJICogaW1wb3J0YW50OiB0aGUgVU5BIHN0YXJ0cyBhdCBieXRlIDEgKG5vdCBhdCBieXRlIDApCisJICovCisJKiAoY2hhciAqKSBhID0gKGNoYXIpICgobG9uZylEQkVBQ09OX0lORk88PDI0TCkgOworCWFbMV0gPSAwIDsKKwltZW1jcHkoKGNoYXIgKilhKzEsKGNoYXIgKikgJnNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1Vwc3RyZWFtTmJyLDYpIDsKKworCUNIRUNLX05QUCgpIDsKKwkgLyogc2V0IG1lbW9yeSBhZGRyZXNzIHJlZyBmb3Igd3JpdGVzICovCisJTUFSVyhzbWMtPmh3LmZwLmZpZm8ucmJjX3JhbV9zdGFydCtEQkVBQ09OX0ZSQU1FX09GRis0KSA7CisJd3JpdGVfbWRyKHNtYyxNRFJfUkVWRVJTRShhWzBdKSkgOworCW91dHB3KEZNX0EoRk1fQ01EUkVHMiksRk1fSVNUVEIpIDsJLyogc2V0IHRoZSB0YWcgYml0ICovCisJd3JpdGVfbWRyKHNtYyxNRFJfUkVWRVJTRShhWzFdKSkgOworCisJb3V0cHcoRk1fQShGTV9TQUJDKSxzbWMtPmh3LmZwLmZpZm8ucmJjX3JhbV9zdGFydCArIERCRUFDT05fRlJBTUVfT0ZGKSA7Cit9CisKKy8qCisJc2V0dXAgY2xhaW0gJiBiZWFjb24gcG9pbnRlcgorCU5PVEUgOgorCQlzcGVjaWFsIGZyYW1lIHBhY2tldHMgZW5kIHdpdGggYSBwb2ludGVyIHRvIHRoZWlyIG93bgorCQlkZXNjcmlwdG9yLCBhbmQgdGhlIE1PUkUgYml0IGlzIHNldCBpbiB0aGUgZGVzY3JpcHRvcgorKi8KK3N0YXRpYyB2b2lkIGJ1aWxkX2NsYWltX2JlYWNvbihzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIHRfcmVxdWVzdCkKK3sKKwl1X2ludAl0ZCA7CisJaW50CWxlbiA7CisJc3RydWN0IGZkZGlfbWFjX3NmICptYWMgOworCisJLyoKKwkgKiBidWlsZCBjbGFpbSBwYWNrZXQKKwkgKi8KKwlsZW4gPSAxNyA7CisJdGQgPSBUWF9ERVNDUklQVE9SIHwgKCgoKHVfaW50KWxlbi0xKSYzKTw8MjcpIDsKKwltYWMgPSAmc21jLT5ody5mcC5tYWNfc2ZiIDsKKwltYWMtPm1hY19mYyA9IEZDX0NMQUlNIDsKKwkvKiBEQSA9PSBTQSBpbiBjbGFpbSBmcmFtZSAqLworCW1hYy0+bWFjX3NvdXJjZSA9IG1hYy0+bWFjX2Rlc3QgPSBNQSA7CisJLyogMidzIGNvbXBsZW1lbnQgKi8KKwlzZXRfaW50KChjaGFyICopbWFjLT5tYWNfaW5mbywoaW50KXRfcmVxdWVzdCkgOworCisJY29weV90eF9tYWMoc21jLHRkLChzdHJ1Y3QgZmRkaV9tYWMgKiltYWMsCisJCXNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX3N0YXJ0ICsgQ0xBSU1fRlJBTUVfT0ZGLGxlbikgOworCS8qIHNldCBDTEFJTSBzdGFydCBwb2ludGVyICovCisJb3V0cHcoRk1fQShGTV9TQUNMKSxzbWMtPmh3LmZwLmZpZm8ucmJjX3JhbV9zdGFydCArIENMQUlNX0ZSQU1FX09GRikgOworCisJLyoKKwkgKiBidWlsZCBiZWFjb24gcGFja2V0CisJICovCisJbGVuID0gMTcgOworCXRkID0gVFhfREVTQ1JJUFRPUiB8ICgoKCh1X2ludClsZW4tMSkmMyk8PDI3KSA7CisJbWFjLT5tYWNfZmMgPSBGQ19CRUFDT04gOworCW1hYy0+bWFjX3NvdXJjZSA9IE1BIDsKKwltYWMtPm1hY19kZXN0ID0gbnVsbF9hZGRyIDsJCS8qIERBID09IDAgaW4gYmVhY29uIGZyYW1lICovCisJc2V0X2ludCgoY2hhciAqKSBtYWMtPm1hY19pbmZvLCgoaW50KUJFQUNPTl9JTkZPPDwyNCkgKyAwICkgOworCisJY29weV90eF9tYWMoc21jLHRkLChzdHJ1Y3QgZmRkaV9tYWMgKiltYWMsCisJCXNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX3N0YXJ0ICsgQkVBQ09OX0ZSQU1FX09GRixsZW4pIDsKKwkvKiBzZXQgYmVhY29uIHN0YXJ0IHBvaW50ZXIgKi8KKwlvdXRwdyhGTV9BKEZNX1NBQkMpLHNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX3N0YXJ0ICsgQkVBQ09OX0ZSQU1FX09GRikgOworCisJLyoKKwkgKiBidWlsZCBkaXJlY3RlZCBiZWFjb24gcGFja2V0CisJICogY29udGFpbnMgb3B0aW9uYWwgVU5BCisJICovCisJbGVuID0gMjMgOworCXRkID0gVFhfREVTQ1JJUFRPUiB8ICgoKCh1X2ludClsZW4tMSkmMyk8PDI3KSA7CisJbWFjLT5tYWNfZmMgPSBGQ19CRUFDT04gOworCW1hYy0+bWFjX3NvdXJjZSA9IE1BIDsKKwltYWMtPm1hY19kZXN0ID0gZGJlYWNvbl9tdWx0aSA7CQkvKiBtdWx0aWNhc3QgKi8KKwlzZXRfaW50KChjaGFyICopIG1hYy0+bWFjX2luZm8sKChpbnQpREJFQUNPTl9JTkZPPDwyNCkgKyAwICkgOworCXNldF9pbnQoKGNoYXIgKikgbWFjLT5tYWNfaW5mbys0LDApIDsKKwlzZXRfaW50KChjaGFyICopIG1hYy0+bWFjX2luZm8rOCwwKSA7CisKKwljb3B5X3R4X21hYyhzbWMsdGQsKHN0cnVjdCBmZGRpX21hYyAqKW1hYywKKwkJc21jLT5ody5mcC5maWZvLnJiY19yYW1fc3RhcnQgKyBEQkVBQ09OX0ZSQU1FX09GRixsZW4pIDsKKworCS8qIGVuZCBvZiBjbGFpbS9iZWFjb24gcXVldWUgKi8KKwlvdXRwdyhGTV9BKEZNX0VBQ0IpLHNtYy0+aHcuZnAuZmlmby5yeDFfZmlmb19zdGFydC0xKSA7CisKKwlvdXRwdyhGTV9BKEZNX1dQWFNGKSwwKSA7CisJb3V0cHcoRk1fQShGTV9SUFhTRiksMCkgOworfQorCitzdGF0aWMgdm9pZCBmb3JtYWNfcmN2X3Jlc3RhcnQoc3RydWN0IHNfc21jICpzbWMpCit7CisJLyogZW5hYmxlIHJlY2VpdmUgZnVuY3Rpb24gKi8KKwlTRVRNQVNLKEZNX0EoRk1fTURSRUcxKSxzbWMtPmh3LmZwLnJ4X21vZGUsRk1fQUREUlgpIDsKKworCW91dHB3KEZNX0EoRk1fQ01EUkVHMSksRk1fSUNMTFIpIDsJLyogY2xlYXIgcmVjZWl2ZSBsb2NrICovCit9CisKK3ZvaWQgZm9ybWFjX3R4X3Jlc3RhcnQoc3RydWN0IHNfc21jICpzbWMpCit7CisJb3V0cHcoRk1fQShGTV9DTURSRUcxKSxGTV9JQ0xMUykgOwkvKiBjbGVhciBzLWZyYW1lIGxvY2sgKi8KKwlvdXRwdyhGTV9BKEZNX0NNRFJFRzEpLEZNX0lDTExBMCkgOwkvKiBjbGVhciBhLWZyYW1lIGxvY2sgKi8KK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2Zvcm1hYyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwkvKiBzZXQgZm9ybWFjIElNU0sgOiAwIGVuYWJsZXMgaXJxICovCisJb3V0cHcoRk1fQShGTV9JTVNLMVUpLH5tYWNfaW1zazF1KSA7CisJb3V0cHcoRk1fQShGTV9JTVNLMUwpLH5tYWNfaW1zazFsKSA7CisJb3V0cHcoRk1fQShGTV9JTVNLMlUpLH5tYWNfaW1zazJ1KSA7CisJb3V0cHcoRk1fQShGTV9JTVNLMkwpLH5tYWNfaW1zazJsKSA7CisJb3V0cHcoRk1fQShGTV9JTVNLM1UpLH5tYWNfaW1zazN1KSA7CisJb3V0cHcoRk1fQShGTV9JTVNLM0wpLH5tYWNfaW1zazNsKSA7Cit9CisKKyNpZiAwCS8qIFJlbW92ZWQgYmVjYXVzZSB0aGUgZHJpdmVyIHNob3VsZCB1c2UgdGhlIEFTSUNzIFRYIGNvbXBsZXRlIElSUS4gKi8KKwkvKiBUaGUgRk9STUFDcyB0eCBjb21wbGV0ZSBJUlEgc2hvdWxkIGJlIHVzZWQgYW55IGxvbmdlciAqLworCisvKgorCUJFR0lOX01BTlVBTF9FTlRSWShpZixmdW5jO290aGVyczs0KQorCisJdm9pZCBlbmFibGVfdHhfaXJxKHNtYywgcXVldWUpCisJc3RydWN0IHNfc21jICpzbWMgOworCXVfc2hvcnQJcXVldWUgOworCitGdW5jdGlvbglET1dOQ0FMTAkoU01ULCBmcGx1c3RtLmMpCisJCWVuYWJsZV90eF9pcnEoKSBlbmFibGVzIHRoZSBGT1JNQUNzIHRyYW5zbWl0IGNvbXBsZXRlCisJCWludGVycnVwdCBvZiB0aGUgcXVldWUuCisKK1BhcmEJcXVldWUJPSBRVUVVRV9TOglzeW5jaHJvbm91cyBxdWV1ZQorCQk9IFFVRVVFX0EwOglhc3luY2hyb25vdXMgcXVldWUKKworTm90ZQlBZnRlciBhbnkgcmluZyBvcGVyYXRpb25hbCBjaGFuZ2UgdGhlIHRyYW5zbWl0IGNvbXBsZXRlCisJaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuCisJVGhlIG9wZXJhdGluZyBzeXN0ZW0gZGVwZW5kZW50IG1vZHVsZSBtdXN0IGVuYWJsZQorCXRoZSB0cmFuc21pdCBjb21wbGV0ZSBpbnRlcnJ1cHQgb2YgYSBxdWV1ZSwKKwkJLSB3aGVuIGl0IHF1ZXVlcyB0aGUgZmlyc3QgZnJhbWUsCisJCSAgYmVjYXVzZSBvZiBubyB0cmFuc21pdCByZXNvdXJjZXMgYXJlIGJlZWluZworCQkgIGF2YWlsYWJsZSBhbmQKKwkJLSB3aGVuIGl0IGVzY2FwZXMgZnJvbSB0aGUgZnVuY3Rpb24gbGxjX3Jlc3RhcnRfdHgKKwkJICB3aGlsZSBzb21lIGZyYW1lcyBhcmUgc3RpbGwgcXVldWVkLgorCisJRU5EX01BTlVBTF9FTlRSWQorICovCit2b2lkIGVuYWJsZV90eF9pcnEoc3RydWN0IHNfc21jICpzbWMsIHVfc2hvcnQgcXVldWUpCisvKiB1X3Nob3J0IHF1ZXVlOyAwID0gc3luY2hyb25vdXMgcXVldWUsIDEgPSBhc3luY2hyb25vdXMgcXVldWUgMCAqLworeworCXVfc2hvcnQJaW1hc2sgOworCisJaW1hc2sgPSB+KGlucHcoRk1fQShGTV9JTVNLMVUpKSkgOworCisJaWYgKHF1ZXVlID09IDApIHsKKwkJb3V0cHcoRk1fQShGTV9JTVNLMVUpLH4oaW1hc2t8Rk1fU1RFRlJNUykpIDsKKwl9CisJaWYgKHF1ZXVlID09IDEpIHsKKwkJb3V0cHcoRk1fQShGTV9JTVNLMVUpLH4oaW1hc2t8Rk1fU1RFRlJNQTApKSA7CisJfQorfQorCisvKgorCUJFR0lOX01BTlVBTF9FTlRSWShpZixmdW5jO290aGVyczs0KQorCisJdm9pZCBkaXNhYmxlX3R4X2lycShzbWMsIHF1ZXVlKQorCXN0cnVjdCBzX3NtYyAqc21jIDsKKwl1X3Nob3J0CXF1ZXVlIDsKKworRnVuY3Rpb24JRE9XTkNBTEwJKFNNVCwgZnBsdXN0bS5jKQorCQlkaXNhYmxlX3R4X2lycSBkaXNhYmxlcyB0aGUgRk9STUFDcyB0cmFuc21pdCBjb21wbGV0ZQorCQlpbnRlcnJ1cHQgb2YgdGhlIHF1ZXVlCisKK1BhcmEJcXVldWUJPSBRVUVVRV9TOglzeW5jaHJvbm91cyBxdWV1ZQorCQk9IFFVRVVFX0EwOglhc3luY2hyb25vdXMgcXVldWUKKworTm90ZQlUaGUgb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQgbW9kdWxlIHNob3VsZCBkaXNhYmxlCisJdGhlIHRyYW5zbWl0IGNvbXBsZXRlIGludGVycnVwdHMgaWYgaXQgZXNjYXBlcyBmcm9tIHRoZQorCWZ1bmN0aW9uIGxsY19yZXN0YXJ0X3R4IGFuZCBubyBmcmFtZXMgYXJlIHF1ZXVlZC4KKworCUVORF9NQU5VQUxfRU5UUlkKKyAqLwordm9pZCBkaXNhYmxlX3R4X2lycShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9zaG9ydCBxdWV1ZSkKKy8qIHVfc2hvcnQgcXVldWU7IDAgPSBzeW5jaHJvbm91cyBxdWV1ZSwgMSA9IGFzeW5jaHJvbm91cyBxdWV1ZSAwICovCit7CisJdV9zaG9ydAlpbWFzayA7CisKKwlpbWFzayA9IH4oaW5wdyhGTV9BKEZNX0lNU0sxVSkpKSA7CisKKwlpZiAocXVldWUgPT0gMCkgeworCQlvdXRwdyhGTV9BKEZNX0lNU0sxVSksfihpbWFzayZ+Rk1fU1RFRlJNUykpIDsKKwl9CisJaWYgKHF1ZXVlID09IDEpIHsKKwkJb3V0cHcoRk1fQShGTV9JTVNLMVUpLH4oaW1hc2smfkZNX1NURUZSTUEwKSkgOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkaXNhYmxlX2Zvcm1hYyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwkvKiBjbGVhciBmb3JtYWMgSU1TSyA6IDEgZGlzYWJsZXMgaXJxICovCisJb3V0cHcoRk1fQShGTV9JTVNLMVUpLE1XKSA7CisJb3V0cHcoRk1fQShGTV9JTVNLMUwpLE1XKSA7CisJb3V0cHcoRk1fQShGTV9JTVNLMlUpLE1XKSA7CisJb3V0cHcoRk1fQShGTV9JTVNLMkwpLE1XKSA7CisJb3V0cHcoRk1fQShGTV9JTVNLM1UpLE1XKSA7CisJb3V0cHcoRk1fQShGTV9JTVNLM0wpLE1XKSA7Cit9CisKKworc3RhdGljIHZvaWQgbWFjX3JpbmdfdXAoc3RydWN0IHNfc21jICpzbWMsIGludCB1cCkKK3sKKwlpZiAodXApIHsKKwkJZm9ybWFjX3Jjdl9yZXN0YXJ0KHNtYykgOwkvKiBlbmFibGUgcmVjZWl2ZSBmdW5jdGlvbiAqLworCQlzbWMtPmh3Lm1hY19yaW5nX2lzX3VwID0gVFJVRSA7CisJCWxsY19yZXN0YXJ0X3R4KHNtYykgOwkJLyogVFggcXVldWUgKi8KKwl9CisJZWxzZSB7CisJCS8qIGRpc2FibGUgcmVjZWl2ZSBmdW5jdGlvbiAqLworCQlTRVRNQVNLKEZNX0EoRk1fTURSRUcxKSxGTV9NRElTUkNWLEZNX0FEREVUKSA7CisKKwkJLyogYWJvcnQgY3VycmVudCB0cmFuc21pdCBhY3Rpdml0eSAqLworCQlvdXRwdyhGTV9BKEZNX0NNRFJFRzIpLEZNX0lBQ1RSKSA7CisKKwkJc21jLT5ody5tYWNfcmluZ19pc191cCA9IEZBTFNFIDsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElTUiBoYW5kbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBtYWMxX2lycSBpcyBpbiBkcnZmYmkuYworICovCisKKy8qCisgKiBtYWMyX2lycToJc3RhdHVzIGJpdHMgZm9yIHRoZSByZWNlaXZlIHF1ZXVlIDEsIGFuZCByaW5nIHN0YXR1cworICogCQlyaW5nIHN0YXR1cyBpbmRpY2F0aW9uIGJpdHMKKyAqLwordm9pZCBtYWMyX2lycShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9zaG9ydCBjb2RlX3MydSwgdV9zaG9ydCBjb2RlX3MybCkKK3sKKwl1X3Nob3J0CWNoYW5nZV9zMmwgOworCXVfc2hvcnQJY2hhbmdlX3MydSA7CisKKwkvKiAoamQpIDIyLUZlYi0xOTk5CisJICogUmVzdGFydCAyX0RNYXggVGltZXIgYWZ0ZXIgZW5kIG9mIGNsYWltaW5nIG9yIGJlYWNvbmluZworCSAqLworCWlmIChjb2RlX3MydSAmIChGTV9TQ0xNfEZNX1NISUNMTXxGTV9TQkVDfEZNX1NPVFJCRUMpKSB7CisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9STVQsUk1fVFhfU1RBVEVfQ0hBTkdFKSA7CisJfQorCWVsc2UgaWYgKGNvZGVfczJsICYgKEZNX1NUS0lTUykpIHsKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9UWF9TVEFURV9DSEFOR0UpIDsKKwl9CisKKwkvKgorCSAqIFhPUiBjdXJyZW50IHN0IGJpdHMgd2l0aCB0aGUgbGFzdCB0byBhdm9pZCB1c2VsZXNzIFJNVCBldmVudCBxdWV1aW5nCisJICovCisJY2hhbmdlX3MybCA9IHNtYy0+aHcuZnAuczJsIF4gY29kZV9zMmwgOworCWNoYW5nZV9zMnUgPSBzbWMtPmh3LmZwLnMydSBeIGNvZGVfczJ1IDsKKworCWlmICgoY2hhbmdlX3MybCAmIEZNX1NSTkdPUCkgfHwKKwkJKCFzbWMtPmh3Lm1hY19yaW5nX2lzX3VwICYmICgoY29kZV9zMmwgJiBGTV9TUk5HT1ApKSkpIHsKKwkJaWYgKGNvZGVfczJsICYgRk1fU1JOR09QKSB7CisJCQltYWNfcmluZ191cChzbWMsMSkgOworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9SSU5HX09QKSA7CisJCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNSaW5nT3BfQ3QrKyA7CisJCX0KKwkJZWxzZSB7CisJCQltYWNfcmluZ191cChzbWMsMCkgOworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9SSU5HX05PTl9PUCkgOworCQl9CisJCWdvdG8gbWFjMl9lbmQgOworCX0KKwlpZiAoY29kZV9zMmwgJiBGTV9TTUlTRlJNKSB7CS8qIG1pc3NlZCBmcmFtZSAqLworCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNOb3RDb3BpZWRfQ3QrKyA7CisJfQorCWlmIChjb2RlX3MydSAmIChGTV9TUkNWT1ZSIHwJLyogcmVjdi4gRklGTyBvdmVyZmxvdyAqLworCQkJRk1fU1JCRkwpKSB7CS8qIHJlY3YuIGJ1ZmZlciBmdWxsICovCisJCXNtYy0+aHcubWFjX2N0Lm1hY19yX3Jlc3RhcnRfY291bnRlcisrIDsKKy8qCQlmb3JtYWNfcmN2X3Jlc3RhcnQoc21jKSA7CSovCisJCXNtdF9zdGF0X2NvdW50ZXIoc21jLDEpIDsKKy8qCQlnb3RvIG1hYzJfZW5kIDsJCQkqLworCX0KKwlpZiAoY29kZV9zMnUgJiBGTV9TT1RSQkVDKQorCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUk1ULFJNX09USEVSX0JFQUNPTikgOworCWlmIChjb2RlX3MydSAmIEZNX1NNWUJFQykKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9NWV9CRUFDT04pIDsKKwlpZiAoY2hhbmdlX3MydSAmIGNvZGVfczJ1ICYgRk1fU0xPQ0xNKSB7CisJCURCX1JNVE4oMiwiUk1UIDogbG93ZXIgY2xhaW0gcmVjZWl2ZWRcbiIsMCwwKSA7CisJfQorCWlmICgoY29kZV9zMnUgJiBGTV9TTVlDTE0pICYmICEoY29kZV9zMmwgJiBGTV9TRFVQQ0xNKSkgeworCQkvKgorCQkgKiBUaGlzIGlzIG15IGNsYWltIGFuZCB0aGF0IGNsYWltIGlzIG5vdCBkZXRlY3RlZCBhcyBhCisJCSAqIGR1cGxpY2F0ZSBvbmUuCisJCSAqLworCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUk1ULFJNX01ZX0NMQUlNKSA7CisJfQorCWlmIChjb2RlX3MybCAmIEZNX1NEVVBDTE0pIHsKKwkJLyoKKwkJICogSWYgYSBkdXBsaWNhdGUgY2xhaW0gZnJhbWUgKHNhbWUgU0EgYnV0IFRfQmlkICE9IFRfUmVxKQorCQkgKiB0aGlzIGZsYWcgd2lsbCBiZSBzZXQuCisJCSAqIEluIHRoZSBSTVQgc3RhdGUgbWFjaGluZSB3ZSBuZWVkIGEgUk1fVkFMSURfQ0xBSU0gZXZlbnQKKwkJICogdG8gZG8gdGhlIGFwcHJvcHJpYXRlIHN0YXRlIGNoYW5nZS4KKwkJICogUk0oMzRjKQorCQkgKi8KKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9WQUxJRF9DTEFJTSkgOworCX0KKwlpZiAoY2hhbmdlX3MydSAmIGNvZGVfczJ1ICYgRk1fU0hJQ0xNKSB7CisJCURCX1JNVE4oMiwiUk1UIDogaGlnaGVyIGNsYWltIHJlY2VpdmVkXG4iLDAsMCkgOworCX0KKwlpZiAoIChjb2RlX3MybCAmIEZNX1NUUlRFWFApIHx8CisJICAgICAoY29kZV9zMmwgJiBGTV9TVFJURVhSKSApCisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9STVQsUk1fVFJUX0VYUCkgOworCWlmIChjb2RlX3MybCAmIEZNX1NNVUxUREEpIHsKKwkJLyoKKwkJICogVGhlIE1BQyBoYXMgZm91bmQgYSAyLiBNQUMgd2l0aCB0aGUgc2FtZSBhZGRyZXNzLgorCQkgKiBTaWduYWwgZHVwX2FkZHJfdGVzdCA9IGZhaWxlZCB0byBSTVQgc3RhdGUgbWFjaGluZS4KKwkJICogUk0oMjUpCisJCSAqLworCQlzbWMtPnIuZHVwX2FkZHJfdGVzdCA9IERBX0ZBSUxFRCA7CisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9STVQsUk1fRFVQX0FERFIpIDsKKwl9CisJaWYgKGNvZGVfczJ1ICYgRk1fU0JFQykKKwkJc21jLT5ody5mcC5lcnJfc3RhdHMuZXJyX2JlY19zdGF0KysgOworCWlmIChjb2RlX3MydSAmIEZNX1NDTE0pCisJCXNtYy0+aHcuZnAuZXJyX3N0YXRzLmVycl9jbG1fc3RhdCsrIDsKKwlpZiAoY29kZV9zMmwgJiBGTV9TVFZYRVhQKQorCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUdnhFeHBpcmVkX0N0KysgOworCWlmICgoY29kZV9zMnUgJiAoRk1fU0JFQ3xGTV9TQ0xNKSkpIHsKKwkJaWYgKCEoY2hhbmdlX3MybCAmIEZNX1NSTkdPUCkgJiYgKHNtYy0+aHcuZnAuczJsICYgRk1fU1JOR09QKSkgeworCQkJbWFjX3JpbmdfdXAoc21jLDApIDsKKwkJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9STVQsUk1fUklOR19OT05fT1ApIDsKKworCQkJbWFjX3JpbmdfdXAoc21jLDEpIDsKKwkJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9STVQsUk1fUklOR19PUCkgOworCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDUmluZ09wX0N0KysgOworCQl9CisJfQorCWlmIChjb2RlX3MybCAmIEZNX1NQSElOVikKKwkJc21jLT5ody5mcC5lcnJfc3RhdHMuZXJyX3BoaW52KysgOworCWlmIChjb2RlX3MybCAmIEZNX1NTSUZHKQorCQlzbWMtPmh3LmZwLmVycl9zdGF0cy5lcnJfc2lmZ19kZXQrKyA7CisJaWYgKGNvZGVfczJsICYgRk1fU1RLSVNTKQorCQlzbWMtPmh3LmZwLmVycl9zdGF0cy5lcnJfdGtpc3MrKyA7CisJaWYgKGNvZGVfczJsICYgRk1fU1RLRVJSKQorCQlzbWMtPmh3LmZwLmVycl9zdGF0cy5lcnJfdGtlcnIrKyA7CisJaWYgKGNvZGVfczJsICYgRk1fU0ZSTUNUUikKKwkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRnJhbWVfQ3QgKz0gMHgxMDAwMEwgOworCWlmIChjb2RlX3MybCAmIEZNX1NFUlJDVFIpCisJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0Vycm9yX0N0ICs9IDB4MTAwMDBMIDsKKwlpZiAoY29kZV9zMmwgJiBGTV9TTFNUQ1RSKQorCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNMb3N0X0N0ICArPSAweDEwMDAwTCA7CisJaWYgKGNvZGVfczJ1ICYgRk1fU0VSUlNGKSB7CisJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTE0LCBTTVRfRTAxMTRfTVNHKSA7CisJfQorbWFjMl9lbmQ6CisJLyogbm90aWNlIG9sZCBzdGF0dXMgKi8KKwlzbWMtPmh3LmZwLnMybCA9IGNvZGVfczJsIDsKKwlzbWMtPmh3LmZwLnMydSA9IGNvZGVfczJ1IDsKKwlvdXRwdyhGTV9BKEZNX0lNU0syVSksfm1hY19pbXNrMnUpIDsKK30KKworLyoKKyAqIG1hYzNfaXJxOglyZWNlaXZlIHF1ZXVlIDIgYml0cyBhbmQgYWRkcmVzcyBkZXRlY3Rpb24gYml0cworICovCit2b2lkIG1hYzNfaXJxKHN0cnVjdCBzX3NtYyAqc21jLCB1X3Nob3J0IGNvZGVfczN1LCB1X3Nob3J0IGNvZGVfczNsKQoreworCVVOVVNFRChjb2RlX3MzbCkgOworCisJaWYgKGNvZGVfczN1ICYgKEZNX1NSQ1ZPVlIyIHwJLyogcmVjdi4gRklGTyBvdmVyZmxvdyAqLworCQkJRk1fU1JCRkwyKSkgewkvKiByZWN2LiBidWZmZXIgZnVsbCAqLworCQlzbWMtPmh3Lm1hY19jdC5tYWNfcl9yZXN0YXJ0X2NvdW50ZXIrKyA7CisJCXNtdF9zdGF0X2NvdW50ZXIoc21jLDEpOworCX0KKworCisJaWYgKGNvZGVfczN1ICYgRk1fU1JQRVJSUTIpIHsJLyogcGFyaXR5IGVycm9yIHJlY2VpdmUgcXVldWUgMiAqLworCQlTTVRfUEFOSUMoc21jLFNNVF9FMDExNSwgU01UX0UwMTE1X01TRykgOworCX0KKwlpZiAoY29kZV9zM3UgJiBGTV9TUlBFUlJRMSkgewkvKiBwYXJpdHkgZXJyb3IgcmVjZWl2ZSBxdWV1ZSAyICovCisJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTE2LCBTTVRfRTAxMTZfTVNHKSA7CisJfQorfQorCisKKy8qCisgKiB0YWtlIGZvcm1hYyBvZmZsaW5lCisgKi8KK3N0YXRpYyB2b2lkIGZvcm1hY19vZmZsaW5lKHN0cnVjdCBzX3NtYyAqc21jKQoreworCW91dHB3KEZNX0EoRk1fQ01EUkVHMiksRk1fSUFDVFIpIDsvKiBhYm9ydCBjdXJyZW50IHRyYW5zbWl0IGFjdGl2aXR5ICovCisKKwkvKiBkaXNhYmxlIHJlY2VpdmUgZnVuY3Rpb24gKi8KKwlTRVRNQVNLKEZNX0EoRk1fTURSRUcxKSxGTV9NRElTUkNWLEZNX0FEREVUKSA7CisKKwkvKiBGT1JNQUMrICdJbml0aWFsaXplIE1vZGUnICovCisJU0VUTUFTSyhGTV9BKEZNX01EUkVHMSksRk1fTUlOSVQsRk1fTU1PREUpIDsKKworCWRpc2FibGVfZm9ybWFjKHNtYykgOworCXNtYy0+aHcubWFjX3JpbmdfaXNfdXAgPSBGQUxTRSA7CisJc21jLT5ody5od19zdGF0ZSA9IFNUT1BQRUQgOworfQorCisvKgorICogYnJpbmcgZm9ybWFjIG9ubGluZQorICovCitzdGF0aWMgdm9pZCBmb3JtYWNfb25saW5lKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWVuYWJsZV9mb3JtYWMoc21jKSA7CisJU0VUTUFTSyhGTV9BKEZNX01EUkVHMSksRk1fTU9OTElORSB8IEZNX1NFTFJBIHwgTURSMUlOSVQgfAorCQlzbWMtPmh3LmZwLnJ4X21vZGUsIEZNX01NT0RFIHwgRk1fU0VMUkEgfCBGTV9BRERSWCkgOworfQorCisvKgorICogRk9STUFDKyBmdWxsIGluaXQuICh0eCwgcngsIHRpbWVyLCBjb3VudGVyLCBjbGFpbSAmIGJlYWNvbikKKyAqLworaW50IGluaXRfZnBsdXMoc3RydWN0IHNfc21jICpzbWMpCit7CisJc21jLT5ody5mcC5uc2FfbW9kZSA9IEZNX01STk5TQUZOTUEgOworCXNtYy0+aHcuZnAucnhfbW9kZSA9IEZNX01EQU1BIDsKKwlzbWMtPmh3LmZwLmdyb3VwX2FkZHIgPSBmZGRpX2Jyb2FkY2FzdCA7CisJc21jLT5ody5mcC5mdW5jX2FkZHIgPSAwIDsKKwlzbWMtPmh3LmZwLmZyc2VscmVnX2luaXQgPSAwIDsKKworCWluaXRfZHJpdmVyX2ZwbHVzKHNtYykgOworCWlmIChzbWMtPnMuc2FzID09IFNNVF9EQVMpCisJCXNtYy0+aHcuZnAubWRyM2luaXQgfD0gRk1fTUVOREFTIDsKKworCXNtYy0+aHcubWFjX2N0Lm1hY19ub2J1Zl9jb3VudGVyID0gMCA7CisJc21jLT5ody5tYWNfY3QubWFjX3JfcmVzdGFydF9jb3VudGVyID0gMCA7CisKKwlzbWMtPmh3LmZwLmZtX3N0MXUgPSAoSFdfUFRSKSBBRERSKEIwX1NUMVUpIDsKKwlzbWMtPmh3LmZwLmZtX3N0MWwgPSAoSFdfUFRSKSBBRERSKEIwX1NUMUwpIDsKKwlzbWMtPmh3LmZwLmZtX3N0MnUgPSAoSFdfUFRSKSBBRERSKEIwX1NUMlUpIDsKKwlzbWMtPmh3LmZwLmZtX3N0MmwgPSAoSFdfUFRSKSBBRERSKEIwX1NUMkwpIDsKKwlzbWMtPmh3LmZwLmZtX3N0M3UgPSAoSFdfUFRSKSBBRERSKEIwX1NUM1UpIDsKKwlzbWMtPmh3LmZwLmZtX3N0M2wgPSAoSFdfUFRSKSBBRERSKEIwX1NUM0wpIDsKKworCXNtYy0+aHcuZnAuczJsID0gc21jLT5ody5mcC5zMnUgPSAwIDsKKwlzbWMtPmh3Lm1hY19yaW5nX2lzX3VwID0gMCA7CisKKwltYWNfY291bnRlcl9pbml0KHNtYykgOworCisJLyogY29udmVydCBCQ0tMIHVuaXRzIHRvIHN5bWJvbCB0aW1lICovCisJc21jLT5ody5tYWNfcGEudF9uZWcgPSAodV9sb25nKTAgOworCXNtYy0+aHcubWFjX3BhLnRfcHJpID0gKHVfbG9uZykwIDsKKworCS8qIG1ha2Ugc3VyZSBhbGwgUENJIHNldHRpbmdzIGFyZSBjb3JyZWN0ICovCisJbWFjX2RvX3BjaV9maXgoc21jKSA7CisKKwlyZXR1cm4oaW5pdF9tYWMoc21jLDEpKSA7CisJLyogZW5hYmxlX2Zvcm1hYyhzbWMpIDsgKi8KK30KKworc3RhdGljIGludCBpbml0X21hYyhzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGFsbCkKK3sKKwl1X3Nob3J0CXRfbWF4LHggOworCXVfbG9uZwl0aW1lPTAgOworCisJLyoKKwkgKiBjbGVhciBtZW1vcnkKKwkgKi8KKwlvdXRwdyhGTV9BKEZNX01EUkVHMSksRk1fTUlOSVQpIDsJLyogRk9STUFDKyBpbml0IG1vZGUgKi8KKwlzZXRfZm9ybWFjX2FkZHIoc21jKSA7CisJb3V0cHcoRk1fQShGTV9NRFJFRzEpLEZNX01NRU1BQ1QpIDsJLyogRk9STUFDKyBtZW1vcnkgYWN0aXYgbW9kZSAqLworCS8qIE5vdGU6IE1vZGUgcmVnaXN0ZXIgMiBpcyBzZXQgaGVyZSwgaW5jYXNlIHBhcml0eSBpcyBlbmFibGVkLiAqLworCW91dHB3KEZNX0EoRk1fTURSRUcyKSxzbWMtPmh3LmZwLm1kcjJpbml0KSA7CisKKwlpZiAoYWxsKSB7CisJCWluaXRfcmFtKHNtYykgOworCX0KKwllbHNlIHsKKwkJLyoKKwkJICogcmVzZXQgdGhlIEhQSSwgdGhlIE1hc3RlciBhbmQgdGhlIEJNVXMKKwkJICovCisJCW91dHAoQUREUihCMF9DVFJMKSwgQ1RSTF9IUElfU0VUKSA7CisJCXRpbWUgPSBod3RfcXVpY2tfcmVhZChzbWMpIDsKKwl9CisKKwkvKgorCSAqIHNldCBhbGwgcG9pbnRlcnMsIGZyYW1lcyBldGMKKwkgKi8KKwlzbXRfc3BsaXRfdXBfZmlmbyhzbWMpIDsKKworCWluaXRfdHgoc21jKSA7CisJaW5pdF9yeChzbWMpIDsKKwlpbml0X3JiYyhzbWMpIDsKKworCWJ1aWxkX2NsYWltX2JlYWNvbihzbWMsc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVF9SZXEpIDsKKworCS8qIHNldCBSWCB0aHJlc2hvbGQgKi8KKwkvKiBzZWUgRXJyYXRhICNTTjIgUGhhbnRvbSByZWNlaXZlIG92ZXJmbG93ICovCisJb3V0cHcoRk1fQShGTV9GUk1USFIpLDE0PDwxMikgOwkJLyogc3dpdGNoIG9uICovCisKKwkvKiBzZXQgZm9ybWFjIHdvcmsgbW9kZSAqLworCW91dHB3KEZNX0EoRk1fTURSRUcxKSxNRFIxSU5JVCB8IEZNX1NFTFJBIHwgc21jLT5ody5mcC5yeF9tb2RlKSA7CisJb3V0cHcoRk1fQShGTV9NRFJFRzIpLHNtYy0+aHcuZnAubWRyMmluaXQpIDsKKwlvdXRwdyhGTV9BKEZNX01EUkVHMyksc21jLT5ody5mcC5tZHIzaW5pdCkgOworCW91dHB3KEZNX0EoRk1fRlJTRUxSRUcpLHNtYy0+aHcuZnAuZnJzZWxyZWdfaW5pdCkgOworCisJLyogc2V0IHRpbWVyICovCisJLyoKKwkgKiBlcnJhdGEgIzIyIGZwbHVzOgorCSAqIFRfTUFYIG11c3Qgbm90IGJlIEZGRkUKKwkgKiBvciBvbmUgb2YgRkZERiwgRkZCOCwgRkY5MSAoLTB4MjcgZXRjLi4pCisJICovCisJdF9tYXggPSAodV9zaG9ydCkoc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVF9NYXgvMzIpIDsKKwl4ID0gdF9tYXgvMHgyNyA7CisJeCAqPSAweDI3IDsKKwlpZiAoKHRfbWF4ID09IDB4ZmZmZSkgfHwgKHRfbWF4IC0geCA9PSAweDE2KSkKKwkJdF9tYXgtLSA7CisJb3V0cHcoRk1fQShGTV9UTUFYKSwodV9zaG9ydCl0X21heCkgOworCisJLyogQnVnRml4IGZvciByZXBvcnQgIzEwMjA0ICovCisJaWYgKHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1R2eFZhbHVlIDwgKHVfbG9uZykgKC0gVVMyQkNMSyg1MikpKSB7CisJCW91dHB3KEZNX0EoRk1fVFZYKSwgKHVfc2hvcnQpICgtIFVTMkJDTEsoNTIpKS8yNTUgJiBNQikgOworCX0gZWxzZSB7CisJCW91dHB3KEZNX0EoRk1fVFZYKSwKKwkJCSh1X3Nob3J0KSgoc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVHZ4VmFsdWUvMjU1KSAmIE1CKSkgOworCX0KKworCW91dHB3KEZNX0EoRk1fQ01EUkVHMSksRk1fSUNMTFMpIDsJLyogY2xlYXIgcy1mcmFtZSBsb2NrICovCisJb3V0cHcoRk1fQShGTV9DTURSRUcxKSxGTV9JQ0xMQTApIDsJLyogY2xlYXIgYS1mcmFtZSBsb2NrICovCisJb3V0cHcoRk1fQShGTV9DTURSRUcxKSxGTV9JQ0xMUik7CS8qIGNsZWFyIHJlY2VpdmUgbG9jayAqLworCisJLyogQXV0byB1bmxvY2sgcmVjZWljZSB0aHJlc2hvbGQgZm9yIHJlY2VpdmUgcXVldWUgMSBhbmQgMiAqLworCW91dHB3KEZNX0EoRk1fVU5MQ0tETFkpLCgweGZmfCgweGZmPDw4KSkpIDsKKworCXJ0bV9pbml0KHNtYykgOwkJCQkvKiBSVC1Nb25pdG9yICovCisKKwlpZiAoIWFsbCkgeworCQkvKgorCQkgKiBhZnRlciAxMG1zLCByZXNldCB0aGUgQk1VcyBhbmQgcmVwYWlyIHRoZSByaW5ncworCQkgKi8KKwkJaHd0X3dhaXRfdGltZShzbWMsdGltZSxNUzJCQ0xLKDEwKSkgOworCQlvdXRwZChBRERSKEIwX1IxX0NTUiksQ1NSX1NFVF9SRVNFVCkgOworCQlvdXRwZChBRERSKEIwX1hBX0NTUiksQ1NSX1NFVF9SRVNFVCkgOworCQlvdXRwZChBRERSKEIwX1hTX0NTUiksQ1NSX1NFVF9SRVNFVCkgOworCQlvdXRwKEFERFIoQjBfQ1RSTCksIENUUkxfSFBJX0NMUikgOworCQlvdXRwZChBRERSKEIwX1IxX0NTUiksQ1NSX0NMUl9SRVNFVCkgOworCQlvdXRwZChBRERSKEIwX1hBX0NTUiksQ1NSX0NMUl9SRVNFVCkgOworCQlvdXRwZChBRERSKEIwX1hTX0NTUiksQ1NSX0NMUl9SRVNFVCkgOworCQlpZiAoIXNtYy0+aHcuaHdfaXNfNjRiaXQpIHsKKwkJCW91dHBkKEFERFIoQjRfUjFfRiksIFJYX1dBVEVSTUFSSykgOworCQkJb3V0cGQoQUREUihCNV9YQV9GKSwgVFhfV0FURVJNQVJLKSA7CisJCQlvdXRwZChBRERSKEI1X1hTX0YpLCBUWF9XQVRFUk1BUkspIDsKKwkJfQorCQlzbWMtPmh3Lmh3X3N0YXRlID0gU1RPUFBFRCA7CisJCW1hY19kcnZfcmVwYWlyX2Rlc2NyKHNtYykgOworCX0KKwlzbWMtPmh3Lmh3X3N0YXRlID0gU1RBUlRFRCA7CisKKwlyZXR1cm4oMCkgOworfQorCisKKy8qCisgKiBjYWxsZWQgYnkgQ0ZNCisgKi8KK3ZvaWQgY29uZmlnX211eChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG11eCkKK3sKKwlwbGNfY29uZmlnX211eChzbWMsbXV4KSA7CisKKwlTRVRNQVNLKEZNX0EoRk1fTURSRUcxKSxGTV9TRUxSQSxGTV9TRUxSQSkgOworfQorCisvKgorICogY2FsbGVkIGJ5IFJNVAorICogZW5hYmxlIENMQUlNL0JFQUNPTiBpbnRlcnJ1cHRzCisgKiAob25seSBjYWxsZWQgaWYgdGhlc2UgZXZlbnRzIGFyZSBvZiBpbnRlcmVzdCwgZS5nLiBpbiBERVRFQ1Qgc3RhdGUKKyAqIHRoZSBpbnRlcnJ1cHQgbXVzdCBub3QgYmUgcGVybWFuZW50bHkgZW5hYmxlZAorICogUk1UIGNhbGxzIHRoaXMgZnVuY3Rpb24gcGVyaW9kaWNhbGx5ICh0aW1lciBkcml2ZW4gcG9sbGluZykKKyAqLwordm9pZCBzbV9tYWNfY2hlY2tfYmVhY29uX2NsYWltKHN0cnVjdCBzX3NtYyAqc21jKQoreworCS8qIHNldCBmb3JtYWMgSU1TSyA6IDAgZW5hYmxlcyBpcnEgKi8KKwlvdXRwdyhGTV9BKEZNX0lNU0syVSksfihtYWNfaW1zazJ1IHwgbWFjX2JlYWNvbl9pbXNrMnUpKSA7CisJLyogdGhlIGRyaXZlciBtdXN0IHJlY2VpdmUgdGhlIGRpcmVjdGVkIGJlYWNvbnMgKi8KKwlmb3JtYWNfcmN2X3Jlc3RhcnQoc21jKSA7CisJcHJvY2Vzc19yZWNlaXZlKHNtYykgOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGludGVyZmFjZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogY29udHJvbCBNQUMgbGF5ZXIJKGNhbGxlZCBieSBSTVQpCisgKi8KK3ZvaWQgc21fbWFfY29udHJvbChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG1vZGUpCit7CisJc3dpdGNoKG1vZGUpIHsKKwljYXNlIE1BX09GRkxJTkUgOgorCQkvKiBBZGQgdG8gbWFrZSB0aGUgTUFDIG9mZmxpbmUgaW4gUk0wX0lTT0xBVEVEIHN0YXRlICovCisJCWZvcm1hY19vZmZsaW5lKHNtYykgOworCQlicmVhayA7CisJY2FzZSBNQV9SRVNFVCA6CisJCSh2b2lkKWluaXRfbWFjKHNtYywwKSA7CisJCWJyZWFrIDsKKwljYXNlIE1BX0JFQUNPTiA6CisJCWZvcm1hY19vbmxpbmUoc21jKSA7CisJCWJyZWFrIDsKKwljYXNlIE1BX0RJUkVDVEVEIDoKKwkJZGlyZWN0ZWRfYmVhY29uKHNtYykgOworCQlicmVhayA7CisJY2FzZSBNQV9UUkVRIDoKKwkJLyoKKwkJICogbm8gYWN0aW9ucyBuZWNlc3NhcnksIFRSRVEgaXMgYWxyZWFkeSBzZXQKKwkJICovCisJCWJyZWFrIDsKKwl9Cit9CisKK2ludCBzbV9tYWNfZ2V0X3R4X3N0YXRlKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXJldHVybigoaW5wdyhGTV9BKEZNX1NUTUNITikpPj40KSY3KSA7Cit9CisKKy8qCisgKiBtdWx0aWNhc3QgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHN0cnVjdCBzX2ZwbWMqIG1hY19nZXRfbWNfdGFibGUoc3RydWN0IHNfc21jICpzbWMsCisJCQkJICAgICAgIHN0cnVjdCBmZGRpX2FkZHIgKnVzZXIsCisJCQkJICAgICAgIHN0cnVjdCBmZGRpX2FkZHIgKm93biwKKwkJCQkgICAgICAgaW50IGRlbCwgaW50IGNhbikKK3sKKwlzdHJ1Y3Qgc19mcG1jCSp0YiA7CisJc3RydWN0IHNfZnBtYwkqc2xvdCA7CisJdV9jaGFyCSpwIDsKKwlpbnQgaSA7CisKKwkvKgorCSAqIHNldCBvd24gPSBjYW4odXNlcikKKwkgKi8KKwkqb3duID0gKnVzZXIgOworCWlmIChjYW4pIHsKKwkJcCA9IG93bi0+YSA7CisJCWZvciAoaSA9IDAgOyBpIDwgNiA7IGkrKywgcCsrKQorCQkJKnAgPSBjYW5vbmljYWxbKnBdIDsKKwl9CisJc2xvdCA9IE5VTEw7CisJZm9yIChpID0gMCwgdGIgPSBzbWMtPmh3LmZwLm1jLnRhYmxlIDsgaSA8IEZQTUFYX01VTFRJQ0FTVCA7IGkrKywgdGIrKyl7CisJCWlmICghdGItPm4pIHsJCS8qIG5vdCB1c2VkICovCisJCQlpZiAoIWRlbCAmJiAhc2xvdCkJLyogaWYgIWRlbCBzYXZlIGZpcnN0IGZyZWUgKi8KKwkJCQlzbG90ID0gdGIgOworCQkJY29udGludWUgOworCQl9CisJCWlmIChtZW1jbXAoKGNoYXIgKikmdGItPmEsKGNoYXIgKilvd24sNikpCisJCQljb250aW51ZSA7CisJCXJldHVybih0YikgOworCX0KKwlyZXR1cm4oc2xvdCkgOwkJCS8qIHJldHVybiBmaXJzdCBmcmVlIG9yIE5VTEwgKi8KK30KKworLyoKKwlCRUdJTl9NQU5VQUxfRU5UUlkoaWYsZnVuYztvdGhlcnM7MikKKworCXZvaWQgbWFjX2NsZWFyX211bHRpY2FzdChzbWMpCisJc3RydWN0IHNfc21jICpzbWMgOworCitGdW5jdGlvbglET1dOQ0FMTAkoU01ULCBmcGx1c3RtLmMpCisJCUNsZWFyIGFsbCBtdWx0aWNhc3QgZW50cmllcworCisJRU5EX01BTlVBTF9FTlRSWSgpCisgKi8KK3ZvaWQgbWFjX2NsZWFyX211bHRpY2FzdChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3Qgc19mcG1jCSp0YiA7CisJaW50IGkgOworCisJc21jLT5ody5mcC5vc19zbG90c191c2VkID0gMCA7CS8qIG5vdGUgdGhlIFNNVCBhZGRyZXNzZXMgKi8KKwkJCQkJLyogd2lsbCBub3QgYmUgZGVsZXRlZCAqLworCWZvciAoaSA9IDAsIHRiID0gc21jLT5ody5mcC5tYy50YWJsZSA7IGkgPCBGUE1BWF9NVUxUSUNBU1QgOyBpKyssIHRiKyspeworCQlpZiAoIXRiLT5wZXJtKSB7CisJCQl0Yi0+biA9IDAgOworCQl9CisJfQorfQorCisvKgorCUJFR0lOX01BTlVBTF9FTlRSWShpZixmdW5jO290aGVyczsyKQorCisJaW50IG1hY19zZXRfZnVuY19hZGRyKHNtYyxmX2FkZHIpCisJc3RydWN0IHNfc21jICpzbWMgOworCXVfbG9uZyBmX2FkZHIgOworCitGdW5jdGlvbglET1dOQ0FMTAkoU01ULCBmcGx1c3RtLmMpCisJCVNldCBhIFRva2VuLVJpbmcgZnVuY3Rpb25hbCBhZGRyZXNzLCB0aGUgYWRkcmVzcyB3aWxsCisJCWJlIGFjdGl2YXRlZCBhZnRlciBjYWxsaW5nIG1hY191cGRhdGVfbXVsdGljYXN0KCkKKworUGFyYQlmX2FkZHIJZnVuY3Rpb25hbCBiaXRzIGluIG5vbi1jYW5vbmljYWwgZm9ybWF0CisKK1JldHVybnMJMDogYWx3YXlzIHN1Y2Nlc3MKKworCUVORF9NQU5VQUxfRU5UUlkoKQorICovCitpbnQgbWFjX3NldF9mdW5jX2FkZHIoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyBmX2FkZHIpCit7CisJc21jLT5ody5mcC5mdW5jX2FkZHIgPSBmX2FkZHIgOworCXJldHVybigwKSA7Cit9CisKKworLyoKKwlCRUdJTl9NQU5VQUxfRU5UUlkoaWYsZnVuYztvdGhlcnM7MikKKworCWludCBtYWNfYWRkX211bHRpY2FzdChzbWMsYWRkcixjYW4pCisJc3RydWN0IHNfc21jICpzbWMgOworCXN0cnVjdCBmZGRpX2FkZHIgKmFkZHIgOworCWludCBjYW4gOworCitGdW5jdGlvbglET1dOQ0FMTAkoU01DLCBmcGx1c3RtLmMpCisJCUFkZCBhbiBlbnRyeSB0byB0aGUgbXVsdGljYXN0IHRhYmxlCisKK1BhcmEJYWRkcglwb2ludGVyIHRvIGEgbXVsdGljYXN0IGFkZHJlc3MKKwljYW4JPSAwOgl0aGUgbXVsdGljYXN0IGFkZHJlc3MgaGFzIHRoZSBwaHlzaWNhbCBmb3JtYXQKKwkJPSAxOgl0aGUgbXVsdGljYXN0IGFkZHJlc3MgaGFzIHRoZSBjYW5vbmljYWwgZm9ybWF0CisJCXwgMHg4MAlwZXJtYW5lbnQKKworUmV0dXJucwkwOiBzdWNjZXNzCisJMTogYWRkcmVzcyB0YWJsZSBmdWxsCisKK05vdGUJQWZ0ZXIgYSAnZHJpdmVyIHJlc2V0JyBvciBhICdzdGF0aW9uIHNldCBhZGRyZXNzJyBhbGwKKwllbnRyaWVzIG9mIHRoZSBtdWx0aWNhc3QgdGFibGUgYXJlIGNsZWFyZWQuCisJSW4gdGhpcyBjYXNlIHRoZSBkcml2ZXIgaGFzIHRvIGZpbGwgdGhlIG11bHRpY2FzdCB0YWJsZSBhZ2Fpbi4KKwlBZnRlciB0aGUgb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQgbW9kdWxlIGZpbGxlZAorCXRoZSBtdWx0aWNhc3QgdGFibGUgaXQgbXVzdCBjYWxsIG1hY191cGRhdGVfbXVsdGljYXN0CisJdG8gYWN0aXZhdGUgdGhlIG5ldyBtdWx0aWNhc3QgYWRkcmVzc2VzIQorCisJRU5EX01BTlVBTF9FTlRSWSgpCisgKi8KK2ludCBtYWNfYWRkX211bHRpY2FzdChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqYWRkciwgaW50IGNhbikKK3sKKwlTS19MT0NfREVDTChzdHJ1Y3QgZmRkaV9hZGRyLG93bikgOworCXN0cnVjdCBzX2ZwbWMJKnRiIDsKKworCS8qCisJICogY2hlY2sgaWYgdGhlcmUgYXJlIGZyZWUgdGFibGUgZW50cmllcworCSAqLworCWlmIChjYW4gJiAweDgwKSB7CisJCWlmIChzbWMtPmh3LmZwLnNtdF9zbG90c191c2VkID49IFNNVF9NQVhfTVVMVEkpIHsKKwkJCXJldHVybigxKSA7CisJCX0KKwl9CisJZWxzZSB7CisJCWlmIChzbWMtPmh3LmZwLm9zX3Nsb3RzX3VzZWQgPj0gRlBNQVhfTVVMVElDQVNULVNNVF9NQVhfTVVMVEkpIHsKKwkJCXJldHVybigxKSA7CisJCX0KKwl9CisKKwkvKgorCSAqIGZpbmQgZW1wdHkgc2xvdAorCSAqLworCWlmICghKHRiID0gbWFjX2dldF9tY190YWJsZShzbWMsYWRkciwmb3duLDAsY2FuICYgfjB4ODApKSkKKwkJcmV0dXJuKDEpIDsKKwl0Yi0+bisrIDsKKwl0Yi0+YSA9IG93biA7CisJdGItPnBlcm0gPSAoY2FuICYgMHg4MCkgPyAxIDogMCA7CisKKwlpZiAoY2FuICYgMHg4MCkKKwkJc21jLT5ody5mcC5zbXRfc2xvdHNfdXNlZCsrIDsKKwllbHNlCisJCXNtYy0+aHcuZnAub3Nfc2xvdHNfdXNlZCsrIDsKKworCXJldHVybigwKSA7Cit9CisKKy8qCisJQkVHSU5fTUFOVUFMX0VOVFJZKGlmLGZ1bmM7b3RoZXJzOzIpCisKKwl2b2lkIG1hY19kZWxfbXVsdGljYXN0KHNtYyxhZGRyLGNhbikKKwlzdHJ1Y3Qgc19zbWMgKnNtYyA7CisJc3RydWN0IGZkZGlfYWRkciAqYWRkciA7CisJaW50IGNhbiA7CisKK0Z1bmN0aW9uCURPV05DQUxMCShTTVQsIGZwbHVzdG0uYykKKwkJRGVsZXRlIGFuIGVudHJ5IGZyb20gdGhlIG11bHRpY2FzdCB0YWJsZQorCitQYXJhCWFkZHIJcG9pbnRlciB0byBhIG11bHRpY2FzdCBhZGRyZXNzCisJY2FuCT0gMDoJdGhlIG11bHRpY2FzdCBhZGRyZXNzIGhhcyB0aGUgcGh5c2ljYWwgZm9ybWF0CisJCT0gMToJdGhlIG11bHRpY2FzdCBhZGRyZXNzIGhhcyB0aGUgY2Fub25pY2FsIGZvcm1hdAorCQl8IDB4ODAJcGVybWFuZW50CisKKwlFTkRfTUFOVUFMX0VOVFJZKCkKKyAqLwordm9pZCBtYWNfZGVsX211bHRpY2FzdChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqYWRkciwgaW50IGNhbikKK3sKKwlTS19MT0NfREVDTChzdHJ1Y3QgZmRkaV9hZGRyLG93bikgOworCXN0cnVjdCBzX2ZwbWMJKnRiIDsKKworCWlmICghKHRiID0gbWFjX2dldF9tY190YWJsZShzbWMsYWRkciwmb3duLDEsY2FuICYgfjB4ODApKSkKKwkJcmV0dXJuIDsKKwkvKgorCSAqIHBlcm1hbmVudCBhZGRyZXNzZXMgbXVzdCBiZSBkZWxldGVkIHdpdGggcGVybSBiaXQKKwkgKiBhbmQgdmljZSB2ZXJzYQorCSAqLworCWlmICgoIHRiLT5wZXJtICYmICAoY2FuICYgMHg4MCkpIHx8CisJICAgICghdGItPnBlcm0gJiYgIShjYW4gJiAweDgwKSkpIHsKKwkJLyoKKwkJICogZGVsZXRlIGl0CisJCSAqLworCQlpZiAodGItPm4pIHsKKwkJCXRiLT5uLS0gOworCQkJaWYgKHRiLT5wZXJtKSB7CisJCQkJc21jLT5ody5mcC5zbXRfc2xvdHNfdXNlZC0tIDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXNtYy0+aHcuZnAub3Nfc2xvdHNfdXNlZC0tIDsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqIG1vZGUKKyAqLworCisjZGVmaW5lIFJYX01PREVfUFJPTQkJMHgxCisjZGVmaW5lIFJYX01PREVfQUxMX01VTFRJCTB4MgorCisvKgorCUJFR0lOX01BTlVBTF9FTlRSWShpZixmdW5jO290aGVyczsyKQorCisJdm9pZCBtYWNfdXBkYXRlX211bHRpY2FzdChzbWMpCisJc3RydWN0IHNfc21jICpzbWMgOworCitGdW5jdGlvbglET1dOQ0FMTAkoU01ULCBmcGx1c3RtLmMpCisJCVVwZGF0ZSBGT1JNQUMgbXVsdGljYXN0IHJlZ2lzdGVycworCisJRU5EX01BTlVBTF9FTlRSWSgpCisgKi8KK3ZvaWQgbWFjX3VwZGF0ZV9tdWx0aWNhc3Qoc3RydWN0IHNfc21jICpzbWMpCit7CisJc3RydWN0IHNfZnBtYwkqdGIgOworCXVfY2hhcgkqZnUgOworCWludAlpIDsKKworCS8qCisJICogaW52YWxpZGF0ZSB0aGUgQ0FNCisJICovCisJb3V0cHcoRk1fQShGTV9BRkNNRCksRk1fSUlOVl9DQU0pIDsKKworCS8qCisJICogc2V0IHRoZSBmdW5jdGlvbmFsIGFkZHJlc3MKKwkgKi8KKwlpZiAoc21jLT5ody5mcC5mdW5jX2FkZHIpIHsKKwkJZnUgPSAodV9jaGFyICopICZzbWMtPmh3LmZwLmZ1bmNfYWRkciA7CisJCW91dHB3KEZNX0EoRk1fQUZNQVNLMiksMHhmZmZmKSA7CisJCW91dHB3KEZNX0EoRk1fQUZNQVNLMSksKHVfc2hvcnQpIH4oKGZ1WzBdIDw8IDgpICsgZnVbMV0pKSA7CisJCW91dHB3KEZNX0EoRk1fQUZNQVNLMCksKHVfc2hvcnQpIH4oKGZ1WzJdIDw8IDgpICsgZnVbM10pKSA7CisJCW91dHB3KEZNX0EoRk1fQUZQRVJTKSxGTV9WQUxJRHxGTV9EQSkgOworCQlvdXRwdyhGTV9BKEZNX0FGQ09NUDIpLCAweGMwMDApIDsKKwkJb3V0cHcoRk1fQShGTV9BRkNPTVAxKSwgMHgwMDAwKSA7CisJCW91dHB3KEZNX0EoRk1fQUZDT01QMCksIDB4MDAwMCkgOworCQlvdXRwdyhGTV9BKEZNX0FGQ01EKSxGTV9JV1JJVEVfQ0FNKSA7CisJfQorCisJLyoKKwkgKiBzZXQgdGhlIG1hc2sgYW5kIHRoZSBwZXJzb25hbGl0eSByZWdpc3RlcihzKQorCSAqLworCW91dHB3KEZNX0EoRk1fQUZNQVNLMCksMHhmZmZmKSA7CisJb3V0cHcoRk1fQShGTV9BRk1BU0sxKSwweGZmZmYpIDsKKwlvdXRwdyhGTV9BKEZNX0FGTUFTSzIpLDB4ZmZmZikgOworCW91dHB3KEZNX0EoRk1fQUZQRVJTKSxGTV9WQUxJRHxGTV9EQSkgOworCisJZm9yIChpID0gMCwgdGIgPSBzbWMtPmh3LmZwLm1jLnRhYmxlOyBpIDwgRlBNQVhfTVVMVElDQVNUOyBpKyssIHRiKyspIHsKKwkJaWYgKHRiLT5uKSB7CisJCQlDSEVDS19DQU0oKSA7CisKKwkJCS8qCisJCQkgKiB3cml0ZSB0aGUgbXVsdGljYXN0IGFkZHJlc3MgaW50byB0aGUgQ0FNCisJCQkgKi8KKwkJCW91dHB3KEZNX0EoRk1fQUZDT01QMiksCisJCQkJKHVfc2hvcnQpKCh0Yi0+YS5hWzBdPDw4KSt0Yi0+YS5hWzFdKSkgOworCQkJb3V0cHcoRk1fQShGTV9BRkNPTVAxKSwKKwkJCQkodV9zaG9ydCkoKHRiLT5hLmFbMl08PDgpK3RiLT5hLmFbM10pKSA7CisJCQlvdXRwdyhGTV9BKEZNX0FGQ09NUDApLAorCQkJCSh1X3Nob3J0KSgodGItPmEuYVs0XTw8OCkrdGItPmEuYVs1XSkpIDsKKwkJCW91dHB3KEZNX0EoRk1fQUZDTUQpLEZNX0lXUklURV9DQU0pIDsKKwkJfQorCX0KK30KKworLyoKKwlCRUdJTl9NQU5VQUxfRU5UUlkoaWYsZnVuYztvdGhlcnM7MykKKworCXZvaWQgbWFjX3NldF9yeF9tb2RlKHNtYyxtb2RlKQorCXN0cnVjdCBzX3NtYyAqc21jIDsKKwlpbnQgbW9kZSA7CisKK0Z1bmN0aW9uCURPV05DQUxML0lOVEVSTgkoU01ULCBmcGx1c3RtLmMpCisJCVRoaXMgZnVuY3Rpb24gZW5hYmxlcyAvIGRpc2FibGVzIHRoZSBzZWxlY3RlZCByZWNlaXZlLgorCQlEb24ndCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgdGhlIGhhcmR3YXJlIG1vZHVsZSBpcworCQl1c2VkIC0tIHVzZSBtYWNfZHJ2X3J4X21vZGUoKSBpbnN0ZWFkIG9mLgorCitQYXJhCW1vZGUgPQkxCVJYX0VOQUJMRV9BTExNVUxUSQllbmFibGUgYWxsIG11bHRpY2FzdHMKKwkJMglSWF9ESVNBQkxFX0FMTE1VTFRJCWRpc2FibGUgImVuYWJsZSBhbGwgbXVsdGljYXN0cyIKKwkJMwlSWF9FTkFCTEVfUFJPTUlTQwllbmFibGUgcHJvbWlzY291cworCQk0CVJYX0RJU0FCTEVfUFJPTUlTQwlkaXNhYmxlIHByb21pc2NvdXMKKwkJNQlSWF9FTkFCTEVfTlNBCQllbmFibGUgcmVjZXB0aW9uIG9mIE5TQSBmcmFtZXMKKwkJNglSWF9ESVNBQkxFX05TQQkJZGlzYWJsZSByZWNlcHRpb24gb2YgTlNBIGZyYW1lcworCitOb3RlCVRoZSBzZWxlY3RlZCByZWNlaXZlIG1vZGVzIHdpbGwgYmUgbG9zdCBhZnRlciAnZHJpdmVyIHJlc2V0JworCW9yICdzZXQgc3RhdGlvbiBhZGRyZXNzJworCisJRU5EX01BTlVBTF9FTlRSWQorICovCit2b2lkIG1hY19zZXRfcnhfbW9kZShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBSWF9FTkFCTEVfQUxMTVVMVEkgOgorCQlzbWMtPmh3LmZwLnJ4X3Byb20gfD0gUlhfTU9ERV9BTExfTVVMVEkgOworCQlicmVhayA7CisJY2FzZSBSWF9ESVNBQkxFX0FMTE1VTFRJIDoKKwkJc21jLT5ody5mcC5yeF9wcm9tICY9IH5SWF9NT0RFX0FMTF9NVUxUSSA7CisJCWJyZWFrIDsKKwljYXNlIFJYX0VOQUJMRV9QUk9NSVNDIDoKKwkJc21jLT5ody5mcC5yeF9wcm9tIHw9IFJYX01PREVfUFJPTSA7CisJCWJyZWFrIDsKKwljYXNlIFJYX0RJU0FCTEVfUFJPTUlTQyA6CisJCXNtYy0+aHcuZnAucnhfcHJvbSAmPSB+UlhfTU9ERV9QUk9NIDsKKwkJYnJlYWsgOworCWNhc2UgUlhfRU5BQkxFX05TQSA6CisJCXNtYy0+aHcuZnAubnNhX21vZGUgPSBGTV9NREFNQSA7CisJCXNtYy0+aHcuZnAucnhfbW9kZSA9IChzbWMtPmh3LmZwLnJ4X21vZGUgJiB+Rk1fQURERVQpIHwKKwkJCXNtYy0+aHcuZnAubnNhX21vZGUgOworCQlicmVhayA7CisJY2FzZSBSWF9ESVNBQkxFX05TQSA6CisJCXNtYy0+aHcuZnAubnNhX21vZGUgPSBGTV9NUk5OU0FGTk1BIDsKKwkJc21jLT5ody5mcC5yeF9tb2RlID0gKHNtYy0+aHcuZnAucnhfbW9kZSAmIH5GTV9BRERFVCkgfAorCQkJc21jLT5ody5mcC5uc2FfbW9kZSA7CisJCWJyZWFrIDsKKwl9CisJaWYgKHNtYy0+aHcuZnAucnhfcHJvbSAmIFJYX01PREVfUFJPTSkgeworCQlzbWMtPmh3LmZwLnJ4X21vZGUgPSBGTV9NTElNUFJPTSA7CisJfQorCWVsc2UgaWYgKHNtYy0+aHcuZnAucnhfcHJvbSAmIFJYX01PREVfQUxMX01VTFRJKSB7CisJCXNtYy0+aHcuZnAucnhfbW9kZSA9IHNtYy0+aHcuZnAubnNhX21vZGUgfCBGTV9FWEdQQTAgOworCX0KKwllbHNlCisJCXNtYy0+aHcuZnAucnhfbW9kZSA9IHNtYy0+aHcuZnAubnNhX21vZGUgOworCVNFVE1BU0soRk1fQShGTV9NRFJFRzEpLHNtYy0+aHcuZnAucnhfbW9kZSxGTV9BRERSWCkgOworCW1hY191cGRhdGVfbXVsdGljYXN0KHNtYykgOworfQorCisvKgorCUJFR0lOX01BTlVBTF9FTlRSWShtb2R1bGU7dGVzdHM7MykKKwlIb3cgdG8gdGVzdCB0aGUgUmVzdHJpY3RlZCBUb2tlbiBNb25pdG9yCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJbyBJbnNlcnQgYSBicmVhayBwb2ludCBpbiB0aGUgZnVuY3Rpb24gcnRtX2lycSgpCisJbyBSZW1vdmUgYWxsIHN0YXRpb25zIHdpdGggYSByZXN0cmljdGVkIHRva2VuIG1vbml0b3IgZnJvbSB0aGUKKwkgIG5ldHdvcmsuCisJbyBDb25uZWN0IGEgVVBQUyBJU0Egb3IgRUlTQSBzdGF0aW9uIHRvIHRoZSBuZXR3b3JrLgorCW8gR2l2ZSB0aGUgRk9STUFDIG9mIFVQUFMgc3RhdGlvbiB0aGUgY29tbWFuZCB0byBzZW5kCisJICByZXN0cmljdGVkIHRva2VucyB1bnRpbCB0aGUgcmluZyBiZWNvbWVzIGluc3RhYmxlLgorCW8gTm93IGNvbm5lY3QgeW91ciB0ZXN0IHRlc3QgY2xpZW50LgorCW8gVGhlIHJlc3RyaWN0ZWQgdG9rZW4gbW9uaXRvciBzaG91bGQgZGV0ZWN0IHRoZSByZXN0cmljdGVkIHRva2VuLAorCSAgYW5kIHlvdXIgYnJlYWsgcG9pbnQgd2lsbCBiZSByZWFjaGVkLgorCW8gWW91IGNhbiBvdnNlcnZlIGhvdyB0aGUgc3RhdGlvbiB3aWxsIGNsZWFuIHRoZSByaW5nLgorCisJRU5EX01BTlVBTF9FTlRSWQorICovCit2b2lkIHJ0bV9pcnEoc3RydWN0IHNfc21jICpzbWMpCit7CisJb3V0cHcoQUREUihCMl9SVE1fQ1JUTCksVElNX0NMX0lSUSkgOwkJLyogY2xlYXIgSVJRICovCisJaWYgKGlucHcoQUREUihCMl9SVE1fQ1JUTCkpICYgVElNX1JFU19UT0spIHsKKwkJb3V0cHcoRk1fQShGTV9DTURSRUcxKSxGTV9JQ0wpIDsJLyogZm9yY2UgY2xhaW0gKi8KKwkJREJfUk1UKCJSTVQ6IGZkZGlQQVRIVF9SbW9kZSBleHBpcmVkXG4iLDAsMCkgOworCQlBSVhfRVZFTlQoc21jLCAodV9sb25nKSBGRERJX1JJTkdfU1RBVFVTLAorCQkJCSh1X2xvbmcpIEZERElfU01UX0VWRU5ULAorCQkJCSh1X2xvbmcpIEZERElfUlRULCBzbXRfZ2V0X2V2ZW50X3dvcmQoc21jKSk7CisJfQorCW91dHB3KEFERFIoQjJfUlRNX0NSVEwpLFRJTV9TVEFSVCkgOwkvKiBlbmFibGUgUlRNIG1vbml0b3JpbmcgKi8KK30KKworc3RhdGljIHZvaWQgcnRtX2luaXQoc3RydWN0IHNfc21jICpzbWMpCit7CisJb3V0cGQoQUREUihCMl9SVE1fSU5JKSwwKSA7CQkvKiB0aW1lciA9IDAgKi8KKwlvdXRwdyhBRERSKEIyX1JUTV9DUlRMKSxUSU1fU1RBUlQpIDsJLyogZW5hYmxlIElSUSAqLworfQorCit2b2lkIHJ0bV9zZXRfdGltZXIoc3RydWN0IHNfc21jICpzbWMpCit7CisJLyoKKwkgKiBNSUIgdGltZXIgYW5kIGhhcmR3YXJlIHRpbWVyIGhhdmUgdGhlIHNhbWUgcmVzb2x1dGlvbiBvZiA4MG5TCisJICovCisJREJfUk1UKCJSTVQ6IHNldHRpbmcgbmV3IGZkZGlQQVRIVF9SbW9kZSwgdCA9ICVkIG5zIFxuIiwKKwkJKGludCkgc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhUX1Jtb2RlLDApIDsKKwlvdXRwZChBRERSKEIyX1JUTV9JTkkpLHNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIVF9SbW9kZSkgOworfQorCitzdGF0aWMgdm9pZCBzbXRfc3BsaXRfdXBfZmlmbyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKworLyoKKwlCRUdJTl9NQU5VQUxfRU5UUlkobW9kdWxlO21lbTsxKQorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlSRUNFSVZFIEJVRkZFUiBNRU1PUlkgRElWRVJTSU9OCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJUjFfUnhEID09IFNNVF9SMV9SWERfQ09VTlQKKwlSMl9SeEQgPT0gU01UX1IyX1JYRF9DT1VOVAorCisJU01UX1IxX1JYRF9DT1VOVCBtdXN0IGJlIHVuZXF1YWwgemVybworCisJCSAgIHwgUjFfUnhEIFIyX1J4RCB8UjFfUnhEIFIyX1J4RCB8IFIxX1J4RCBSMl9SeEQKKwkJICAgfCAgIHggICAgICAwCSAgIHwgIHgJICAgIDEtMwkgIHwgICB4ICAgICA8IDMKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSAgIHwgICA2Myw3NSBrQgkgICB8ICAgIDU0LDc1CSAgfAlSMV9SeEQKKwlyeCBxdWV1ZSAxIHwgUlhfRklGT19TUEFDRSB8IFJYX0xBUkdFX0ZJRk98IC0tLS0tLS0tLS0tLS0gKiA2Myw3NSBrQgorCQkgICB8CQkgICB8CQkgIHwgUjFfUnhEK1IyX1J4RAorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJICAgfAkJICAgfCAgICA5IGtCCSAgfCAgICAgUjJfUnhECisJcnggcXVldWUgMiB8CTAga0IJICAgfCBSWF9TTUFMTF9GSUZPfCAtLS0tLS0tLS0tLS0tICogNjMsNzUga0IKKwkJICAgfCAgKG5vdCB1c2VkKSAgIHwJCSAgfCBSMV9SeEQrUjJfUnhECisKKwlFTkRfTUFOVUFMX0VOVFJZCisqLworCisJaWYgKFNNVF9SMV9SWERfQ09VTlQgPT0gMCkgeworCQlTTVRfUEFOSUMoc21jLFNNVF9FMDExNywgU01UX0UwMTE3X01TRykgOworCX0KKworCXN3aXRjaChTTVRfUjJfUlhEX0NPVU5UKSB7CisJY2FzZSAwOgorCQlzbWMtPmh3LmZwLmZpZm8ucngxX2ZpZm9fc2l6ZSA9IFJYX0ZJRk9fU1BBQ0UgOworCQlzbWMtPmh3LmZwLmZpZm8ucngyX2ZpZm9fc2l6ZSA9IDAgOworCQlicmVhayA7CisJY2FzZSAxOgorCWNhc2UgMjoKKwljYXNlIDM6CisJCXNtYy0+aHcuZnAuZmlmby5yeDFfZmlmb19zaXplID0gUlhfTEFSR0VfRklGTyA7CisJCXNtYy0+aHcuZnAuZmlmby5yeDJfZmlmb19zaXplID0gUlhfU01BTExfRklGTyA7CisJCWJyZWFrIDsKKwlkZWZhdWx0OgkvKiB0aGlzIGlzIG5vdCB0aGUgcmVhbCBkZWZhdWxlICovCisJCXNtYy0+aHcuZnAuZmlmby5yeDFfZmlmb19zaXplID0gUlhfRklGT19TUEFDRSAqCisJCVNNVF9SMV9SWERfQ09VTlQvKFNNVF9SMV9SWERfQ09VTlQrU01UX1IyX1JYRF9DT1VOVCkgOworCQlzbWMtPmh3LmZwLmZpZm8ucngyX2ZpZm9fc2l6ZSA9IFJYX0ZJRk9fU1BBQ0UgKgorCQlTTVRfUjJfUlhEX0NPVU5ULyhTTVRfUjFfUlhEX0NPVU5UK1NNVF9SMl9SWERfQ09VTlQpIDsKKwkJYnJlYWsgOworCX0KKworLyoKKwlCRUdJTl9NQU5VQUxfRU5UUlkobW9kdWxlO21lbTsxKQorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlUUkFOU01JVCBCVUZGRVIgTUVNT1JZIERJVkVSU0lPTgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisJCSB8IG5vIHN5bmMgYncJfCBzeW5jIGJ3IGF2YWlsYWJsZSBhbmQgfCBzeW5jIGJ3IGF2YWlsYWJsZSBhbmQKKwkJIHwgYXZhaWxhYmxlCXwgU3luY2hUeE1vZGUgPSBTUExJVAl8IFN5bmNoVHhNb2RlID0gQUxMCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlzeW5jIHR4CSB8ICAgICAwIGtCCXwJMzIga0IJCXwJNTUga0IKKwlxdWV1ZQkgfAkJfCAgIFRYX01FRElVTV9GSUZPCXwgICBUWF9MQVJHRV9GSUZPCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlhc3luYyB0eCB8ICAgIDY0IGtCCXwJMzIga0IJCXwJIDkgaworCXF1ZXVlCSB8IFRYX0ZJRk9fU1BBQ0V8ICAgVFhfTUVESVVNX0ZJRk8JfCAgIFRYX1NNQUxMX0ZJRk8KKworCUVORF9NQU5VQUxfRU5UUlkKKyovCisKKwkvKgorCSAqIHNldCB0aGUgdHggbW9kZSBiaXRzCisJICovCisJaWYgKHNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIU2JhUGF5bG9hZCkgeworI2lmZGVmIEVTUworCQlzbWMtPmh3LmZwLmZpZm8uZmlmb19jb25maWdfbW9kZSB8PQorCQkJc21jLT5taWIuZmRkaUVTU1N5bmNoVHhNb2RlIHwgU1lOQ19UUkFGRklDX09OIDsKKyNlbmRpZgorCX0KKwllbHNlIHsKKwkJc21jLT5ody5mcC5maWZvLmZpZm9fY29uZmlnX21vZGUgJj0KKwkJCX4oU0VORF9BU1lOQ19BU19TWU5DfFNZTkNfVFJBRkZJQ19PTikgOworCX0KKworCS8qCisJICogc3BsaXQgdXAgdGhlIEZJRk8KKwkgKi8KKwlpZiAoc21jLT5ody5mcC5maWZvLmZpZm9fY29uZmlnX21vZGUgJiBTWU5DX1RSQUZGSUNfT04pIHsKKwkJaWYgKHNtYy0+aHcuZnAuZmlmby5maWZvX2NvbmZpZ19tb2RlICYgU0VORF9BU1lOQ19BU19TWU5DKSB7CisJCQlzbWMtPmh3LmZwLmZpZm8udHhfc19zaXplID0gVFhfTEFSR0VfRklGTyA7CisJCQlzbWMtPmh3LmZwLmZpZm8udHhfYTBfc2l6ZSA9IFRYX1NNQUxMX0ZJRk8gOworCQl9CisJCWVsc2UgeworCQkJc21jLT5ody5mcC5maWZvLnR4X3Nfc2l6ZSA9IFRYX01FRElVTV9GSUZPIDsKKwkJCXNtYy0+aHcuZnAuZmlmby50eF9hMF9zaXplID0gVFhfTUVESVVNX0ZJRk8gOworCQl9CisJfQorCWVsc2UgeworCQkJc21jLT5ody5mcC5maWZvLnR4X3Nfc2l6ZSA9IDAgOworCQkJc21jLT5ody5mcC5maWZvLnR4X2EwX3NpemUgPSBUWF9GSUZPX1NQQUNFIDsKKwl9CisKKwlzbWMtPmh3LmZwLmZpZm8ucngxX2ZpZm9fc3RhcnQgPSBzbWMtPmh3LmZwLmZpZm8ucmJjX3JhbV9zdGFydCArCisJCVJYX0ZJRk9fT0ZGIDsKKwlzbWMtPmh3LmZwLmZpZm8udHhfc19zdGFydCA9IHNtYy0+aHcuZnAuZmlmby5yeDFfZmlmb19zdGFydCArCisJCXNtYy0+aHcuZnAuZmlmby5yeDFfZmlmb19zaXplIDsKKwlzbWMtPmh3LmZwLmZpZm8udHhfYTBfc3RhcnQgPSBzbWMtPmh3LmZwLmZpZm8udHhfc19zdGFydCArCisJCXNtYy0+aHcuZnAuZmlmby50eF9zX3NpemUgOworCXNtYy0+aHcuZnAuZmlmby5yeDJfZmlmb19zdGFydCA9IHNtYy0+aHcuZnAuZmlmby50eF9hMF9zdGFydCArCisJCXNtYy0+aHcuZnAuZmlmby50eF9hMF9zaXplIDsKKworCURCX1NNVCgiRklGTyBzcGxpdDogbW9kZSA9ICV4XG4iLHNtYy0+aHcuZnAuZmlmby5maWZvX2NvbmZpZ19tb2RlLDApIDsKKwlEQl9TTVQoInJiY19yYW1fc3RhcnQgPQkleAkgcmJjX3JhbV9lbmQgPSAJJXhcbiIsCisJCXNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX3N0YXJ0LCBzbWMtPmh3LmZwLmZpZm8ucmJjX3JhbV9lbmQpIDsKKwlEQl9TTVQoInJ4MV9maWZvX3N0YXJ0ID0gJXgJIHR4X3Nfc3RhcnQgPSAJJXhcbiIsCisJCXNtYy0+aHcuZnAuZmlmby5yeDFfZmlmb19zdGFydCwgc21jLT5ody5mcC5maWZvLnR4X3Nfc3RhcnQpIDsKKwlEQl9TTVQoInR4X2EwX3N0YXJ0ID0JJXgJIHJ4Ml9maWZvX3N0YXJ0ID0gCSV4XG4iLAorCQlzbWMtPmh3LmZwLmZpZm8udHhfYTBfc3RhcnQsIHNtYy0+aHcuZnAuZmlmby5yeDJfZmlmb19zdGFydCkgOworfQorCit2b2lkIGZvcm1hY19yZWluaXRfdHgoc3RydWN0IHNfc21jICpzbWMpCit7CisJLyoKKwkgKiBTcGxpdCB1cCB0aGUgRklGTyBhbmQgcmVpbml0aWFsaXplIHRoZSBNQUMgaWYgc3luY2hyb25vdXMKKwkgKiBiYW5kd2lkdGggYmVjb21lcyBhdmFpbGFibGUgYnV0IG5vIHN5bmNocm9ub3VzIHF1ZXVlIGlzCisJICogY29uZmlndXJlZC4KKwkgKi8KKwlpZiAoIXNtYy0+aHcuZnAuZmlmby50eF9zX3NpemUgJiYgc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhTYmFQYXlsb2FkKXsKKwkJKHZvaWQpaW5pdF9tYWMoc21jLDApIDsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9jbXRkZWYuaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC9jbXRkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDM5ODJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9oL2NtdGRlZi5oCkBAIC0wLDAgKzEsNzYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCV9DTVRERUZfCisjZGVmaW5lIF9DTVRERUZfCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyoKKyAqIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnN0YW50cworICogTU9ESUlGWSBUSEUgRk9MTFdPSU5HIFRIUkVFIERFRklORVMKKyAqLworI2RlZmluZSBBTURQTEMJCQkvKiBpZiBBbWQgUExDIGNoaXAgdXNlZCAqLworI2lmZGVmCUNPTkMKKyNkZWZpbmUgTlVNUEhZUwkJMTIJLyogMiBmb3IgU0FTIG9yIERBUywgbW9yZSBmb3IgQ29uY2VudHJhdG9yICovCisjZWxzZQorI2lmZGVmCUNPTkNfSUkKKyNkZWZpbmUgTlVNUEhZUwkJMjQJLyogMiBmb3IgU0FTIG9yIERBUywgbW9yZSBmb3IgQ29uY2VudHJhdG9yICovCisjZWxzZQorI2RlZmluZSBOVU1QSFlTCQkyCS8qIDIgZm9yIFNBUyBvciBEQVMsIG1vcmUgZm9yIENvbmNlbnRyYXRvciAqLworI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgTlVNTUFDUwkJMQkvKiBvbmx5IDEgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQgKi8KKyNkZWZpbmUgTlVNUEFUSFMJMgkvKiBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgcGF0aCBzdXBwb3J0ZWQgKi8KKworLyoKKyAqIERPIE5PVCBNT0RJRlkgQkVZT05EIFRISVMgUE9JTlQKKyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZglOVU1QSFlTID4gMgorI2RlZmluZSBDT05DRU5UUkFUT1IKKyNlbmRpZgorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIGNvbWZvcnRhYmxlIExJTlQgdXNhZ2UKKyAqLworI2lmZGVmCWxpbnQKKyNkZWZpbmUgTElOVF9VU0UoeCkJKHgpPSh4KQorI2Vsc2UKKyNkZWZpbmUgTElOVF9VU0UoeCkKKyNlbmRpZgorCisjaWZkZWYJREVCVUcKKyNkZWZpbmUJREJfUFIoZmxhZyxhLGIsYykJeyBpZiAoZmxhZykgcHJpbnRmKGEsYixjKSA7IH0KKyNlbHNlCisjZGVmaW5lCURCX1BSKGZsYWcsYSxiLGMpCisjZW5kaWYKKworI2lmZGVmIERFQlVHX0JSRAorI2RlZmluZSBEQl9FQ00oYSxiLGMpCQlEQl9QUigoc21jLT5kZWJ1Zy5kX3NtdCYxKSxhLGIsYykKKyNkZWZpbmUgREJfRUNNTihuLGEsYixjKQlEQl9QUigoc21jLT5kZWJ1Zy5kX2VjbSA+PShuKSksYSxiLGMpCisjZGVmaW5lIERCX1JNVChhLGIsYykJCURCX1BSKChzbWMtPmRlYnVnLmRfc210JjIpLGEsYixjKQorI2RlZmluZSBEQl9STVROKG4sYSxiLGMpCURCX1BSKChzbWMtPmRlYnVnLmRfcm10ID49KG4pKSxhLGIsYykKKyNkZWZpbmUgREJfQ0ZNKGEsYixjKQkJREJfUFIoKHNtYy0+ZGVidWcuZF9zbXQmNCksYSxiLGMpCisjZGVmaW5lIERCX0NGTU4obixhLGIsYykJREJfUFIoKHNtYy0+ZGVidWcuZF9jZm0gPj0obikpLGEsYixjKQorI2RlZmluZSBEQl9QQ00oYSxiLGMpCQlEQl9QUigoc21jLT5kZWJ1Zy5kX3NtdCY4KSxhLGIsYykKKyNkZWZpbmUgREJfUENNTihuLGEsYixjKQlEQl9QUigoc21jLT5kZWJ1Zy5kX3BjbSA+PShuKSksYSxiLGMpCisjZGVmaW5lIERCX1NNVChhLGIsYykJCURCX1BSKChzbWMtPmRlYnVnLmRfc210ZiksYSxiLGMpCisjZGVmaW5lIERCX1NNVE4obixhLGIsYykJREJfUFIoKHNtYy0+ZGVidWcuZF9zbXRmID49KG4pKSxhLGIsYykKKyNkZWZpbmUgREJfU0JBKGEsYixjKQkJREJfUFIoKHNtYy0+ZGVidWcuZF9zYmEpLGEsYixjKQorI2RlZmluZSBEQl9TQkFOKG4sYSxiLGMpCURCX1BSKChzbWMtPmRlYnVnLmRfc2JhID49KG4pKSxhLGIsYykKKyNkZWZpbmUgREJfRVNTKGEsYixjKQkJREJfUFIoKHNtYy0+ZGVidWcuZF9lc3MpLGEsYixjKQorI2RlZmluZSBEQl9FU1NOKG4sYSxiLGMpCURCX1BSKChzbWMtPmRlYnVnLmRfZXNzID49KG4pKSxhLGIsYykKKyNlbHNlCisjZGVmaW5lIERCX0VDTShhLGIsYykJCURCX1BSKChkZWJ1Zy5kX3NtdCYxKSxhLGIsYykKKyNkZWZpbmUgREJfRUNNTihuLGEsYixjKQlEQl9QUigoZGVidWcuZF9lY20gPj0obikpLGEsYixjKQorI2RlZmluZSBEQl9STVQoYSxiLGMpCQlEQl9QUigoZGVidWcuZF9zbXQmMiksYSxiLGMpCisjZGVmaW5lIERCX1JNVE4obixhLGIsYykJREJfUFIoKGRlYnVnLmRfcm10ID49KG4pKSxhLGIsYykKKyNkZWZpbmUgREJfQ0ZNKGEsYixjKQkJREJfUFIoKGRlYnVnLmRfc210JjQpLGEsYixjKQorI2RlZmluZSBEQl9DRk1OKG4sYSxiLGMpCURCX1BSKChkZWJ1Zy5kX2NmbSA+PShuKSksYSxiLGMpCisjZGVmaW5lIERCX1BDTShhLGIsYykJCURCX1BSKChkZWJ1Zy5kX3NtdCY4KSxhLGIsYykKKyNkZWZpbmUgREJfUENNTihuLGEsYixjKQlEQl9QUigoZGVidWcuZF9wY20gPj0obikpLGEsYixjKQorI2RlZmluZSBEQl9TTVQoYSxiLGMpCQlEQl9QUigoZGVidWcuZF9zbXRmKSxhLGIsYykKKyNkZWZpbmUgREJfU01UTihuLGEsYixjKQlEQl9QUigoZGVidWcuZF9zbXRmID49KG4pKSxhLGIsYykKKyNkZWZpbmUgREJfU0JBKGEsYixjKQkJREJfUFIoKGRlYnVnLmRfc2JhKSxhLGIsYykKKyNkZWZpbmUgREJfU0JBTihuLGEsYixjKQlEQl9QUigoZGVidWcuZF9zYmEgPj0obikpLGEsYixjKQorI2RlZmluZSBEQl9FU1MoYSxiLGMpCQlEQl9QUigoZGVidWcuZF9lc3MpLGEsYixjKQorI2RlZmluZSBEQl9FU1NOKG4sYSxiLGMpCURCX1BSKChkZWJ1Zy5kX2VzcyA+PShuKSksYSxiLGMpCisjZW5kaWYKKworI2lmbmRlZglTU19OT1RfRFMKKyNkZWZpbmUJU0tfTE9DX0RFQ0wodHlwZSx2YXIpCXR5cGUgdmFyCisjZWxzZQorI2RlZmluZQlTS19MT0NfREVDTCh0eXBlLHZhcikJc3RhdGljIHR5cGUgdmFyCisjZW5kaWYKKy8qCisgKiBQSFlzIGFuZCBQT1JUUworICogTm90ZTogRG9uJ3QgdG91Y2ggdGhlIGRlZmluaXRpb24gb2YgUEEgYW5kIFBCLiBUaG9zZSBtaWdodCBiZSB1c2VkCisgKglieSBzb21lICJmb3IiIGxvb3BzLgorICovCisjZGVmaW5lIFBBCQkwCisjZGVmaW5lIFBCCQkxCisjaWYJZGVmaW5lZChTVVBFUk5FVF8zKSB8fCBkZWZpbmVkKENPTkNfSUkpCisvKgorICogVGhlIHBvcnQgaW5kaWNlcyBoYXZlIHRvIGJlIGRpZmZlcmVudCwKKyAqIGJlY2F1c2UgdGhlIE1BQyBvdXRwdXQgZ29lcyB0aHJvdWdoIHRoZSAyLiBQTEMKKyAqIENvbmMgSUk6IEl0IGhhcyB0byBiZSB0aGUgZmlyc3QgcG9ydCBpbiB0aGUgcm93LgorICovCisjZGVmaW5lIFBTCQkwCS8qIEludGVybmFsIFBMQyB3aGljaCBpcyB0aGUgc2FtZSBhcyBQQSAqLworI2Vsc2UKKyNkZWZpbmUgUFMJCTEKKyNlbmRpZgorI2RlZmluZSBQTQkJMgkJLyogUE0gLi4gUEErTlVNX1BIWVMtMSAqLworCisvKgorICogUEhZIHR5cGVzIC0gYXMgaW4gcGF0aCBkZXNjcmlwdG9yICdmZGRpUEhZVHlwZScKKyAqLworI2RlZmluZSBUQQkJCTAJLyogQSBwb3J0ICovCisjZGVmaW5lIFRCCQkJMQkvKiBCIHBvcnQgKi8KKyNkZWZpbmUgVFMJCQkyCS8qIFMgcG9ydCAqLworI2RlZmluZSBUTQkJCTMJLyogTSBwb3J0ICovCisjZGVmaW5lIFROT05FCQkJNAorCisKKy8qCisgKiBpbmRleGVzIGluIE1JQgorICovCisjZGVmaW5lIElOREVYX01BQwkxCisjZGVmaW5lIElOREVYX1BBVEgJMQorI2RlZmluZSBJTkRFWF9QT1JUCTEKKworCisvKgorICogcG9saWNpZXMKKyAqLworI2RlZmluZSBQT0xJQ1lfQUEJKDE8PDApCQkvKiByZWplY3QgQUEgKi8KKyNkZWZpbmUgUE9MSUNZX0FCCSgxPDwxKQkJLyogcmVqZWN0IEFCICovCisjZGVmaW5lIFBPTElDWV9BUwkoMTw8MikJCS8qIHJlamVjdCBBUyAqLworI2RlZmluZSBQT0xJQ1lfQU0JKDE8PDMpCQkvKiByZWplY3QgQU0gKi8KKyNkZWZpbmUgUE9MSUNZX0JBCSgxPDw0KQkJLyogcmVqZWN0IEJBICovCisjZGVmaW5lIFBPTElDWV9CQgkoMTw8NSkJCS8qIHJlamVjdCBCQiAqLworI2RlZmluZSBQT0xJQ1lfQlMJKDE8PDYpCQkvKiByZWplY3QgQlMgKi8KKyNkZWZpbmUgUE9MSUNZX0JNCSgxPDw3KQkJLyogcmVqZWN0IEJNICovCisjZGVmaW5lIFBPTElDWV9TQQkoMTw8OCkJCS8qIHJlamVjdCBTQSAqLworI2RlZmluZSBQT0xJQ1lfU0IJKDE8PDkpCQkvKiByZWplY3QgU0IgKi8KKyNkZWZpbmUgUE9MSUNZX1NTCSgxPDwxMCkJCS8qIHJlamVjdCBTUyAqLworI2RlZmluZSBQT0xJQ1lfU00JKDE8PDExKQkJLyogcmVqZWN0IFNNICovCisjZGVmaW5lIFBPTElDWV9NQQkoMTw8MTIpCQkvKiByZWplY3QgTUEgKi8KKyNkZWZpbmUgUE9MSUNZX01CCSgxPDwxMykJCS8qIHJlamVjdCBNQiAqLworI2RlZmluZSBQT0xJQ1lfTVMJKDE8PDE0KQkJLyogcmVqZWN0IE1TICovCisjZGVmaW5lIFBPTElDWV9NTQkoMTw8MTUpCQkvKiByZWplY3QgTU0gKi8KKworLyoKKyAqIGNvbW1hbmRzCisgKi8KKworLyoKKyAqIEVWRU5UUworICogZXZlbnQgY2xhc3NlcworICovCisjZGVmaW5lIEVWRU5UX0VDTQkxCQkvKiBldmVudCBjbGFzcyBFQ00gKi8KKyNkZWZpbmUgRVZFTlRfQ0ZNCTIJCS8qIGV2ZW50IGNsYXNzIENGTSAqLworI2RlZmluZSBFVkVOVF9STVQJMwkJLyogZXZlbnQgY2xhc3MgUk1UICovCisjZGVmaW5lIEVWRU5UX1NNVAk0CQkvKiBldmVudCBjbGFzcyBTTVQgKi8KKyNkZWZpbmUgRVZFTlRfUENNCTUJCS8qIGV2ZW50IGNsYXNzIFBDTSAqLworI2RlZmluZSBFVkVOVF9QQ01BCTUJCS8qIGV2ZW50IGNsYXNzIFBDTUEgKi8KKyNkZWZpbmUgRVZFTlRfUENNQgk2CQkvKiBldmVudCBjbGFzcyBQQ01CICovCisKKy8qIFdBUk5JTkcgOgorICogRVZFTlRfUENNKiBtdXN0IGJlIGxhc3QgaW4gdGhlIGFib3ZlIGxpc3QKKyAqIGlmIG1vcmUgdGhhbiB0d28gcG9ydHMgYXJlIHVzZWQsIEVWRU5UX1BDTSAuLiBFVkVOVF9QQ01BK05VTV9QSFlTLTEKKyAqIGFyZSB1c2VkICEKKyAqLworCisjZGVmaW5lIEVWX1RPS0VOKGNsYXNzLGV2ZW50KQkoKCh1X2xvbmcpKGNsYXNzKTw8MTZMKXwoKHVfbG9uZykoZXZlbnQpKSkKKyNkZWZpbmUgRVZfVF9DTEFTUyh0b2tlbikJKChpbnQpKCh0b2tlbik+PjE2KSYweGZmZmYpCisjZGVmaW5lIEVWX1RfRVZFTlQodG9rZW4pCSgoaW50KSh0b2tlbikmMHhmZmZmKQorCisvKgorICogRUNNIGV2ZW50cworICovCisjZGVmaW5lIEVDX0NPTk5FQ1QJMQkJLyogY29ubmVjdCByZXF1ZXN0ICovCisjZGVmaW5lIEVDX0RJU0NPTk5FQ1QJMgkJLyogZGlzY29ubmVjdCByZXF1ZXN0ICovCisjZGVmaW5lIEVDX1RSQUNFX1BST1AJMwkJLyogdHJhY2UgcHJvcGFnYXRpb24gKi8KKyNkZWZpbmUgRUNfUEFUSF9URVNUCTQJCS8qIHBhdGggdGVzdCAqLworI2RlZmluZSBFQ19USU1FT1VUX1RECTUJCS8qIHRpbWVyIFREX21pbiAqLworI2RlZmluZSBFQ19USU1FT1VUX1RNQVgJNgkJLyogdGltZXIgdHJhY2VfbWF4ICovCisjZGVmaW5lIEVDX1RJTUVPVVRfSU1BWAk3CQkvKiB0aW1lciBJX21heCAqLworI2RlZmluZSBFQ19USU1FT1VUX0lOTUFYIDgJCS8qIHRpbWVyIElOX21heCAqLworI2RlZmluZSBFQ19URVNUX0RPTkUJOQkJLyogcGF0aCB0ZXN0IGRvbmUgKi8KKworLyoKKyAqIENGTSBldmVudHMKKyAqLworI2RlZmluZSBDRl9MT09QCQkxCQkvKiBjZl9sb29wIGZsYWcgZnJvbSBQQ00gKi8KKyNkZWZpbmUgQ0ZfTE9PUF9BCTEJCS8qIGNmX2xvb3AgZmxhZyBmcm9tIFBDTSAqLworI2RlZmluZSBDRl9MT09QX0IJMgkJLyogY2ZfbG9vcCBmbGFnIGZyb20gUENNICovCisjZGVmaW5lIENGX0pPSU4JCTMJCS8qIGNmX2pvaW4gZmxhZyBmcm9tIFBDTSAqLworI2RlZmluZSBDRl9KT0lOX0EJMwkJLyogY2Zfam9pbiBmbGFnIGZyb20gUENNICovCisjZGVmaW5lIENGX0pPSU5fQgk0CQkvKiBjZl9qb2luIGZsYWcgZnJvbSBQQ00gKi8KKworLyoKKyAqIFBDTSBldmVudHMKKyAqLworI2RlZmluZSBQQ19TVEFSVAkJMQorI2RlZmluZSBQQ19TVE9QCQkJMgorI2RlZmluZSBQQ19MT09QCQkJMworI2RlZmluZSBQQ19KT0lOCQkJNAorI2RlZmluZSBQQ19TSUdOQUwJCTUKKyNkZWZpbmUgUENfUkVKRUNUCQk2CisjZGVmaW5lIFBDX01BSU5UICAgIAkJNworI2RlZmluZSBQQ19UUkFDRQkJOAorI2RlZmluZSBQQ19QRFIJCQk5CisjZGVmaW5lIFBDX0VOQUJMRQkJMTAKKyNkZWZpbmUgUENfRElTQUJMRQkJMTEKKworLyoKKyAqIG11c3QgYmUgb3JkZXJlZCBhcyBpbiBMaW5lU3RhdGVUeXBlCisgKi8KKyNkZWZpbmUgUENfUUxTCQkJMTIKKyNkZWZpbmUgUENfSUxTCQkJMTMKKyNkZWZpbmUgUENfTUxTCQkJMTQKKyNkZWZpbmUgUENfSExTCQkJMTUKKyNkZWZpbmUgUENfTFNfUERSCQkxNgorI2RlZmluZSBQQ19MU19OT05FCQkxNworI2RlZmluZSBMUzJNSUIoeCkJKCh4KS1QQ19RTFMpCisjZGVmaW5lIE1JQjJMUyh4KQkoKHgpK1BDX1FMUykKKworI2RlZmluZSBQQ19USU1FT1VUX1RCX01BWAkxOAkvKiB0aW1lciBUQl9tYXggKi8KKyNkZWZpbmUgUENfVElNRU9VVF9UQl9NSU4JMTkJLyogdGltZXIgVEJfbWluICovCisjZGVmaW5lIFBDX1RJTUVPVVRfQ19NSU4JMjAJLyogdGltZXIgQ19NaW4gKi8KKyNkZWZpbmUgUENfVElNRU9VVF9UX09VVAkyMQkvKiB0aW1lciBUX091dCAqLworI2RlZmluZSBQQ19USU1FT1VUX1RMX01JTgkyMgkvKiB0aW1lciBUTF9NaW4gKi8KKyNkZWZpbmUgUENfVElNRU9VVF9UX05FWFQJMjMJLyogdGltZXIgdF9uZXh0W10gKi8KKyNkZWZpbmUgUENfVElNRU9VVF9MQ1QJCTI0CisjZGVmaW5lIFBDX05TRQkJCTI1CS8qIE5PSVNFIGhhcmR3YXJlIHRpbWVyICovCisjZGVmaW5lIFBDX0xFTQkJCTI2CS8qIExFTSBkb25lICovCisKKy8qCisgKiBSTVQgZXZlbnRzCQkJCSAgbWVhbmluZwkJZnJvbQorICovCisjZGVmaW5lIFJNX1JJTkdfT1AJMQkJLyogcmluZyBvcGVyYXRpb25hbAlNQUMJKi8KKyNkZWZpbmUgUk1fUklOR19OT05fT1AJMgkJLyogcmluZyBub3Qgb3BlcmF0aW9uYWwJTUFDCSovCisjZGVmaW5lIFJNX01ZX0JFQUNPTgkzCQkvKiByZWN2ZCBteSBiZWFjb24JTUFDCSovCisjZGVmaW5lIFJNX09USEVSX0JFQUNPTgk0CQkvKiByZWN2ZCBvdGhlciBiZWFjb24JTUFDCSovCisjZGVmaW5lIFJNX01ZX0NMQUlNCTUJCS8qIHJlY3ZkIG15IGNsYWltCU1BQwkqLworI2RlZmluZSBSTV9UUlRfRVhQCTYJCS8qIFRSVCBleHAJCU1BQwkqLworI2RlZmluZSBSTV9WQUxJRF9DTEFJTQk3CQkvKiBjbGFpbSBmcm9tIGR1cCBhZGRyCU1BQwkqLworI2RlZmluZSBSTV9KT0lOCQk4CQkvKiBzaWduYWwgcm1fam9pbglDRk0JKi8KKyNkZWZpbmUgUk1fTE9PUAkJOQkJLyogc2lnbmFsIHJtX2xvb3AJQ0ZNCSovCisjZGVmaW5lIFJNX0RVUF9BRERSCTEwCQkvKiBkdXBfYWRkcl90ZXN0IGhhbmdlCVNNVC1OSUYJKi8KKyNkZWZpbmUgUk1fRU5BQkxFX0ZMQUcJMTEJCS8qIGVuYWJsZSBmbGFnICovCisKKyNkZWZpbmUgUk1fVElNRU9VVF9OT05fT1AJMTIJLyogdGltZW91dCBUX05vbl9PUAkqLworI2RlZmluZSBSTV9USU1FT1VUX1RfU1RVQ0sJMTMJLyogdGltZW91dCBUX1N0dWNrCSovCisjZGVmaW5lIFJNX1RJTUVPVVRfQU5OT1VOQ0UJMTQJLyogdGltZW91dCBUX0Fubm91bmNlCSovCisjZGVmaW5lIFJNX1RJTUVPVVRfVF9ESVJFQ1QJMTUJLyogdGltZW91dCBUX0RpcmVjdAkqLworI2RlZmluZSBSTV9USU1FT1VUX0RfTUFYCTE2CS8qIHRpbWVvdXQgRF9NYXgJKi8KKyNkZWZpbmUgUk1fVElNRU9VVF9QT0xMCQkxNwkvKiBjbGFpbS9iZWFjb24gcG9sbGVyCSovCisjZGVmaW5lIFJNX1RYX1NUQVRFX0NIQU5HRQkxOAkvKiBUbyByZXN0YXJ0IHRpbWVyIGZvciBEX01heCAqLworCisvKgorICogU01UIGV2ZW50cworICovCisjZGVmaW5lIFNNX1RJTUVSCTEJCS8qIHRpbWVyICovCisjZGVmaW5lIFNNX0ZBU1QJCTIJCS8qIHNtdF9mb3JjZV9pcnEgKi8KKworLyogUEMgbW9kZXMgKi8KKyNkZWZpbmUgUE1fTk9ORQkJMAorI2RlZmluZSBQTV9QRUVSCQkxCisjZGVmaW5lIFBNX1RSRUUJCTIKKworLyoKKyAqIFBDTSB3aXRoaG9sZCBjb2RlcworICogTUlCIFBDLVdpdGhob2xkVHlwZSBFTlVNCisgKi8KKyNkZWZpbmUgUENfV0hfTk9ORQkwCQkvKiBvayAqLworI2RlZmluZSBQQ19XSF9NX00JMQkJLyogTSB0byBNICovCisjZGVmaW5lIFBDX1dIX09USEVSCTIJCS8qIG90aGVyIGluY29tcGF0aWJsZSBwaHlzICovCisjZGVmaW5lIFBDX1dIX1BBVEgJMwkJLyogcGF0aCBub3QgYXZhaWxhYmxlICovCisvKgorICogTENUIGR1cmF0aW9uCisgKi8KKyNkZWZpbmUgTENfU0hPUlQJMQkJLyogc2hvcnQgTENUICovCisjZGVmaW5lIExDX01FRElVTQkyCQkvKiBtZWRpdW0gTENUICovCisjZGVmaW5lIExDX0xPTkcJCTMJCS8qIGxvbmcgTENUICovCisjZGVmaW5lIExDX0VYVEVOREVECTQJCS8qIGV4dGVuZGVkIExDVCAqLworCisvKgorICogcGF0aF90ZXN0IHZhbHVlcworICovCisjZGVmaW5lIFBUX05PTkUJCTAKKyNkZWZpbmUgUFRfVEVTVElORwkxCQkvKiB0ZXN0IGlzIHJ1bm5pbmcgKi8KKyNkZWZpbmUgUFRfUEFTU0VECTIJCS8qIHRlc3QgcGFzc2VkICovCisjZGVmaW5lIFBUX0ZBSUxFRAkzCQkvKiB0ZXN0IGZhaWxlZCAqLworI2RlZmluZSBQVF9QRU5ESU5HCTQJCS8qIHBhdGggdGVzdCBmb2xsb3dzICovCisjZGVmaW5lIFBUX0VYSVRJTkcJNQkJLyogZGlzY29ubmVjdGVkIHdoaWxlIGluIHRyYWNlL2xlYXZlICovCisKKy8qCisgKiBkdXBsaWNhdGUgYWRkcmVzcyB0ZXN0CisgKiBNSUIgRHVwQWRkcmVzc1Rlc3QgRU5VTQorICovCisjZGVmaW5lIERBX05PTkUJCTAJCS8qIAkJKi8KKyNkZWZpbmUgREFfUEFTU0VECTEJCS8qIHRlc3QgcGFzc2VkICovCisjZGVmaW5lIERBX0ZBSUxFRAkyCQkvKiB0ZXN0IGZhaWxlZCAqLworCisKKy8qCisgKiBvcHRpY2FsIGJ5cGFzcworICovCisjZGVmaW5lIEJQX0RFSU5TRVJUCTAJCS8qIGRpc2FibGUgYnlwYXNzICovCisjZGVmaW5lIEJQX0lOU0VSVAkxCQkvKiBlbmFibGUgYnlwYXNzICovCisKKy8qCisgKiBPREwgZW5hYmxlL2Rpc2FibGUKKyAqLworI2RlZmluZSBQTV9UUkFOU01JVF9ESVNBQkxFCTAJLyogZGlzYWJsZSB4bWl0ICovCisjZGVmaW5lIFBNX1RSQU5TTUlUX0VOQUJMRQkxCS8qIGVuYWJsZSB4bWl0ICovCisKKy8qCisgKiBwYXJhbWV0ZXIgZm9yIGNvbmZpZ19tdXgKKyAqIG5vdGUgOiBudW1iZXIgaXMgaW5kZXggaW4gY29uZmlnX2VuZGVjIHRhYmxlICEKKyAqLworI2RlZmluZSBNVVhfVEhSVUEJMAkJLyogdGhyb3VnaCBBICovCisjZGVmaW5lIE1VWF9USFJVQgkxCQkvKiB0aHJvdWdoIEIgKi8KKyNkZWZpbmUgTVVYX1dSQVBBCTIJCS8qIHdyYXAgQSAqLworI2RlZmluZSBNVVhfV1JBUEIJMwkJLyogd3JhcCBCICovCisjZGVmaW5lIE1VWF9JU09MQVRFCTQJCS8qIGlzb2xhdGVkICovCisjZGVmaW5lIE1VWF9XUkFQUwk1CQkvKiBTQVMgKi8KKworLyoKKyAqIE1BQyBjb250cm9sCisgKi8KKyNkZWZpbmUgTUFfUkVTRVQJMAorI2RlZmluZSBNQV9CRUFDT04JMQorI2RlZmluZSBNQV9DTEFJTQkyCisjZGVmaW5lIE1BX0RJUkVDVEVECTMJCS8qIGRpcmVjdGVkIGJlYWNvbiAqLworI2RlZmluZSBNQV9UUkVRCQk0CQkvKiBjaGFuZ2UgVF9SZXEgKi8KKyNkZWZpbmUgTUFfT0ZGTElORQk1CQkvKiBzd2l0Y2ggTUFDIHRvIG9mZmxpbmUgKi8KKworCisvKgorICogdHJhY2UgcHJvcAorICogYml0IG1hcCBmb3IgdHJhY2UgcHJvcGFnYXRpb24KKyAqLworI2RlZmluZSBFTlRJVFlfTUFDCShOVU1QSFlTKQorI2RlZmluZSBFTlRJVFlfUEhZKHApCShwKQorI2RlZmluZSBFTlRJVFlfQklUKG0pCSgxPDwobSkpCisKKy8qCisgKiBSZXNvdXJjZSBUYWcgVHlwZXMKKyAqLworI2RlZmluZSBQQVRIX0lTTwkwCS8qIGlzb2xhdGVkICovCisjZGVmaW5lIFBBVEhfUFJJTQkzCS8qIHByaW1hcnkgcGF0aCAqLworI2RlZmluZSBQQVRIX1RIUlUJNQkvKiB0aHJvdWdoIHBhdGggKi8KKworI2RlZmluZSBSRVNfTUFDCQkyCS8qIHJlc291cmNlIHR5cGUgTUFDICovCisjZGVmaW5lIFJFU19QT1JUCTQJLyogcmVzb3VyY2UgdHlwZSBQT1JUICovCisKKworLyoKKyAqIENGTSBzdGF0ZQorICogb29wczogTVVTVCBNQVRDSCBDRi1TdGF0ZVR5cGUgaW4gU01UNy4yICEKKyAqLworI2RlZmluZSBTQzBfSVNPTEFURUQJMAkJLyogaXNvbGF0ZWQgKi8KKyNkZWZpbmUgU0MxX1dSQVBfQQk1CQkvKiB3cmFwIEEgKG5vdCB1c2VkKSAqLworI2RlZmluZSBTQzJfV1JBUF9CCTYJCS8qIHdyYXAgQiAobm90IHVzZWQpICovCisjZGVmaW5lIFNDNF9USFJVX0EJMTIJCS8qIHRocm91Z2ggQSAqLworI2RlZmluZSBTQzVfVEhSVV9CCTcJCS8qIHRocm91Z2ggQiAodXNlZCBpbiBTTVQgNi4yKSAqLworI2RlZmluZSBTQzdfV1JBUF9TCTgJCS8qIFNBUyAobm90IHVzZWQpICovCisjZGVmaW5lIFNDOV9DX1dSQVBfQQk5CQkvKiBjIHdyYXAgQSAqLworI2RlZmluZSBTQzEwX0NfV1JBUF9CCTEwCQkvKiBjIHdyYXAgQiAqLworI2RlZmluZSBTQzExX0NfV1JBUF9TCTExCQkvKiBjIHdyYXAgUyAqLworCisvKgorICogY29udmVydCBNSUIgdGltZSBpbiB1bml0cyBvZiA4MG5TIHRvIHVTCisgKi8KKyNkZWZpbmUgTUlCMlVTKHQpCQkoKHQpLzEyKQorI2RlZmluZSBTRUMyTUlCKHMpCSgocykqMTI1MDAwMDBMKQorLyoKKyAqIFNNVCB0aW1lcgorICovCitzdHJ1Y3Qgc210X3RpbWVyIHsKKwlzdHJ1Y3Qgc210X3RpbWVyCSp0bV9uZXh0IDsJLyogbGlua2VkIGxpc3QgKi8KKwlzdHJ1Y3Qgc19zbWMJCSp0bV9zbWMgOwkvKiBwb2ludGVyIHRvIGNvbnRleHQgKi8KKwl1X2xvbmcJCQl0bV9kZWx0YSA7CS8qIGRlbHRhIHRpbWUgKi8KKwl1X2xvbmcJCQl0bV90b2tlbiA7CS8qIHRva2VuIHZhbHVlICovCisJdV9zaG9ydAkJCXRtX2FjdGl2ZSA7CS8qIGZsYWcgOiBhY3RpdmUvaW5hY3RpdmUgKi8KKwl1X3Nob3J0CQkJdG1fcGFkIDsJLyogcGFkIGZpZWxkICovCit9IDsKKworLyoKKyAqIGNvbW11bmljYXRpb24gc3RydWN0dXJlcworICovCitzdHJ1Y3QgbWFjX3BhcmFtZXRlciB7CisJdV9sb25nCXRfbmVnIDsJCS8qIFRfTmVnIHBhcmFtZXRlciAqLworCXVfbG9uZwl0X3ByaSA7CQkvKiBUX1ByaSByZWdpc3RlciBpbiBNQUMgKi8KK30gOworCisvKgorICogTUFDIGNvdW50ZXJzCisgKi8KK3N0cnVjdCBtYWNfY291bnRlciB7CisJdV9sb25nCW1hY19ub2J1Zl9jb3VudGVyIDsJLyogTUFDIFNXIGNvdW50ZXI6IG5vIGJ1ZmZlciAqLworCXVfbG9uZwltYWNfcl9yZXN0YXJ0X2NvdW50ZXIgOwkvKiBNQUMgU1cgY291bnRlcjogcnggcmVzdGFydGVkICovCit9IDsKKworLyoKKyAqIHBhcmEgc3RydWN0IGNvbnRleHQgZm9yIFNNVCBwYXJhbWV0ZXJzCisgKi8KK3N0cnVjdCBzX3Bjb24geworCWludAlwY19sZW4gOworCWludAlwY19lcnIgOworCWludAlwY19iYWRzZXQgOworCXZvaWQJKnBjX3AgOworfSA7CisKKy8qCisgKiBsaW5rIGVycm9yIG1vbml0b3IKKyAqLworI2RlZmluZSBMRU1fQVZHCTUKK3N0cnVjdCBsZW1fY291bnRlciB7CisjaWZkZWYJQU0yOUsKKwlpbnQJbGVtX29uCTsKKwl1X2xvbmcJbGVtX2Vycm9ycyA7CisJdV9sb25nCWxlbV9zeW1ib2xzIDsKKwl1X2xvbmcJbGVtX3RzeW1ib2xzIDsKKwlpbnQJbGVtX3NfY291bnQgOworCWludAlsZW1fbl9zIDsKKwlpbnQJbGVtX3ZhbHVlcyA7CisJaW50CWxlbV9pbmRleCA7CisJaW50CWxlbV9hdmdfYmVyW0xFTV9BVkddIDsKKwlpbnQJbGVtX3N1bSA7CisjZWxzZQorCXVfc2hvcnQJbGVtX2Zsb2F0X2JlciA7CQkvKiAxMEUtbm4gYml0IGVycm9yIHJhdGUgKi8KKwl1X2xvbmcJbGVtX2Vycm9ycyA7CQkvKiBhY2N1bXVsYXRlZCBlcnJvciBjb3VudCAqLworCXVfc2hvcnQJbGVtX29uCTsKKyNlbmRpZgorfSA7CisKKyNkZWZpbmUgTlVNQklUUwkxMAorCisjaWZkZWYJQU1EUExDCisKKy8qCisgKiBQTEMgc3RhdGUgdGFibGUKKyAqLworc3RydWN0IHNfcGxjIHsKKwl1X3Nob3J0CXBfc3RhdGUgOwkJLyogY3VycmVudCBzdGF0ZSAqLworCXVfc2hvcnQJcF9iaXRzIDsJCS8qIG51bWJlciBvZiBiaXRzIHRvIHNlbmQgKi8KKwl1X3Nob3J0CXBfc3RhcnQgOwkJLyogZmlyc3QgYml0IHBvcyAqLworCXVfc2hvcnQJcF9wYWQgOwkJCS8qIHBhZGRpbmcgZm9yIGFsaWdubWVudCAqLworCXVfbG9uZyBzb2Z0X2VyciA7CQkvKiBlcnJvciBjb3VudGVyICovCisJdV9sb25nIHBhcml0eV9lcnIgOwkJLyogZXJyb3IgY291bnRlciAqLworCXVfbG9uZyBlYnVmX2VyciA7CQkvKiBlcnJvciBjb3VudGVyICovCisJdV9sb25nIGVidWZfY29udCA7CQkvKiBjb250aW5vdXMgZXJyb3IgY291bnRlciAqLworCXVfbG9uZyBwaHlpbnYgOwkJCS8qIGVycm9yIGNvdW50ZXIgKi8KKwl1X2xvbmcgdnN5bV9jdHIgOwkJLyogZXJyb3IgY291bnRlciAqLworCXVfbG9uZyBtaW5pX2N0ciA7CQkvKiBlcnJvciBjb3VudGVyICovCisJdV9sb25nIHRwY19leHAgOwkJLyogZXJyb3IgY291bnRlciAqLworCXVfbG9uZyBucF9lcnIgOwkJCS8qIGVycm9yIGNvdW50ZXIgKi8KKwl1X2xvbmcgYl9wY3MgOwkJCS8qIGVycm9yIGNvdW50ZXIgKi8KKwl1X2xvbmcgYl90cGMgOwkJCS8qIGVycm9yIGNvdW50ZXIgKi8KKwl1X2xvbmcgYl90bmUgOwkJCS8qIGVycm9yIGNvdW50ZXIgKi8KKwl1X2xvbmcgYl9xbHMgOwkJCS8qIGVycm9yIGNvdW50ZXIgKi8KKwl1X2xvbmcgYl9pbHMgOwkJCS8qIGVycm9yIGNvdW50ZXIgKi8KKwl1X2xvbmcgYl9obHMgOwkJCS8qIGVycm9yIGNvdW50ZXIgKi8KK30gOworI2VuZGlmCisKKyNpZmRlZglQUk9UT1RZUF9JTkMKKyNpbmNsdWRlICJmZGRpL2RyaXZlci5wcm8iCisjZWxzZQkvKiBQUk9UT1RZUF9JTkMgKi8KKy8qCisgKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KKyNpbmNsdWRlICJoL21idWYuaCIJLyogVHlwZSBkZWZpbml0aW9ucyBmb3IgTUJVRnMgKi8KKyNpbmNsdWRlICJoL3NtdHN0YXRlLmgiCS8qIHN0cnVjdCBzbXRfc3RhdGUgKi8KKwordm9pZCBod3RfcmVzdGFydChzdHJ1Y3Qgc19zbWMgKnNtYyk7CS8qIGh3dC5jICovCitTTWJ1ZiAqc210X2J1aWxkX2ZyYW1lKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgY2xhc3MsIGludCB0eXBlLAorCQkgICAgICAgaW50IGxlbmd0aCk7CS8qIHNtdC5jICovCitTTWJ1ZiAqc210X2dldF9tYnVmKHN0cnVjdCBzX3NtYyAqc21jKTsJLyogZHJ2c3IuYyAqLwordm9pZCAqc21fdG9fcGFyYShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9oZWFkZXIgKnNtLAorCQkgaW50IHBhcmEpOwkJLyogc210LmMgKi8KKworI2lmbmRlZiBTS19VTlVTRUQKKyNkZWZpbmUgU0tfVU5VU0VEKHZhcikJCSh2b2lkKSh2YXIpCisjZW5kaWYKKwordm9pZCBxdWV1ZV9ldmVudChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGNsYXNzLCBpbnQgZXZlbnQpOwordm9pZCBlY20oc3RydWN0IHNfc21jICpzbWMsIGludCBldmVudCk7Cit2b2lkIGVjbV9pbml0KHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgcm10KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZXZlbnQpOwordm9pZCBybXRfaW5pdChzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIHBjbShzdHJ1Y3Qgc19zbWMgKnNtYywgY29uc3QgaW50IG5wLCBpbnQgZXZlbnQpOwordm9pZCBwY21faW5pdChzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIGNmbShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGV2ZW50KTsKK3ZvaWQgY2ZtX2luaXQoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBzbXRfdGltZXJfc3RhcnQoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfdGltZXIgKnRpbWVyLCB1X2xvbmcgdGltZSwKKwkJICAgICB1X2xvbmcgdG9rZW4pOwordm9pZCBzbXRfdGltZXJfc3RvcChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF90aW1lciAqdGltZXIpOwordm9pZCBwY21fc3RhdHVzX3N0YXRlKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbnAsIGludCAqdHlwZSwgaW50ICpzdGF0ZSwKKwkJICAgICAgaW50ICpyZW1vdGUsIGludCAqbWFjKTsKK3ZvaWQgcGxjX2NvbmZpZ19tdXgoc3RydWN0IHNfc21jICpzbWMsIGludCBtdXgpOwordm9pZCBzbV9sZW1fZXZhbHVhdGUoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBzbXRfY2xlYXJfdW5hX2RuYShzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIG1hY191cGRhdGVfY291bnRlcihzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIHNtX3BtX2xzX2xhdGNoKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcGh5LCBpbnQgb25fb2ZmKTsKK3ZvaWQgc21fbWFfY29udHJvbChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG1vZGUpOwordm9pZCBzbV9tYWNfY2hlY2tfYmVhY29uX2NsYWltKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgY29uZmlnX211eChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG11eCk7Cit2b2lkIHNtdF9hZ2VudF9pbml0KHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgc210X3RpbWVyX2luaXQoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBzbXRfcmVjZWl2ZWRfcGFjayhzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iLCBpbnQgZnMpOwordm9pZCBzbXRfYWRkX3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzX3Bjb24gKnBjb24sIHVfc2hvcnQgcGFyYSwKKwkJICBpbnQgaW5kZXgsIGludCBsb2NhbCk7Cit2b2lkIHNtdF9zd2FwX3BhcmEoc3RydWN0IHNtdF9oZWFkZXIgKnNtLCBpbnQgbGVuLCBpbnQgZGlyZWN0aW9uKTsKK3ZvaWQgZXZfaW5pdChzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIGh3dF9pbml0KHN0cnVjdCBzX3NtYyAqc21jKTsKK3VfbG9uZyBod3RfcmVhZChzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIGh3dF9zdG9wKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgaHd0X3N0YXJ0KHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdGltZSk7Cit2b2lkIHNtdF9zZW5kX21idWYoc3RydWN0IHNfc21jICpzbWMsIFNNYnVmICptYiwgaW50IGZjKTsKK3ZvaWQgc210X2ZyZWVfbWJ1ZihzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iKTsKK3ZvaWQgc21fcG1fYnlwYXNzX3JlcShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG1vZGUpOwordm9pZCBybXRfaW5kaWNhdGlvbihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGkpOwordm9pZCBjZm1fc3RhdGVfY2hhbmdlKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgY19zdGF0ZSk7CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCAhZGVmaW5lZChOT19TTVRfUEFOSUMpCit2b2lkIHNtdF9wYW5pYyhzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciAqdGV4dCk7CisjZWxzZQorI2RlZmluZQlzbXRfcGFuaWMoc21jLHRleHQpCisjZW5kaWYgLyogREVCVUcgfHwgIU5PX1NNVF9QQU5JQyAqLworCit2b2lkIHNtdF9zdGF0X2NvdW50ZXIoc3RydWN0IHNfc21jICpzbWMsIGludCBzdGF0KTsKK3ZvaWQgc210X3RpbWVyX3BvbGwoc3RydWN0IHNfc21jICpzbWMpOwordV9sb25nIHNtdF9nZXRfdGltZSh2b2lkKTsKK3VfbG9uZyBzbXRfZ2V0X3RpZChzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIHNtdF90aW1lcl9kb25lKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgc210X3NldF9kZWZhdWx0cyhzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIHNtdF9maXh1cF9taWIoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBzbXRfcmVzZXRfZGVmYXVsdHMoc3RydWN0IHNfc21jICpzbWMsIGludCBsZXZlbCk7Cit2b2lkIHNtdF9hZ2VudF90YXNrKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgc210X3BsZWFzZV9yZWNvbm5lY3Qoc3RydWN0IHNfc21jICpzbWMsIGludCByZWNvbm5fdGltZSk7CitpbnQgc210X2NoZWNrX3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfaGVhZGVyICpzbSwKKwkJICAgY29uc3QgdV9zaG9ydCBsaXN0W10pOwordm9pZCBkcml2ZXJfZ2V0X2JpYShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqYmlhX2FkZHIpOworCisjaWZkZWYgU1VQRVJORVRfMwordm9pZCBkcnZfcmVzZXRfaW5kaWNhdGlvbihzdHJ1Y3Qgc19zbWMgKnNtYyk7CisjZW5kaWYJLyogU1VQRVJORVRfMyAqLworCit2b2lkIHNtdF9zdGFydF93YXRjaGRvZyhzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIHNtdF9ldmVudChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGV2ZW50KTsKK3ZvaWQgdGltZXJfZXZlbnQoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyB0b2tlbik7Cit2b2lkIGV2X2Rpc3BhdGNoZXIoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBwY21fZ2V0X3N0YXRlKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3N0YXRlICpzdGF0ZSk7Cit2b2lkIGVjbV9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHNfc21jICpzbWMsIGludCBlX3N0YXRlKTsKK2ludCBzbV9wbV9ieXBhc3NfcHJlc2VudChzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIHBjbV9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHNfc21jICpzbWMsIGludCBwbGMsIGludCBwX3N0YXRlKTsKK3ZvaWQgcm10X3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHJfc3RhdGUpOworaW50IHNtX3BtX2dldF9scyhzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHBoeSk7CitpbnQgcGNtX2dldF9zX3BvcnQoc3RydWN0IHNfc21jICpzbWMpOworaW50IHBjbV9yb290ZWRfc3RhdGlvbihzdHJ1Y3Qgc19zbWMgKnNtYyk7CitpbnQgY2ZtX2dldF9tYWNfaW5wdXQoc3RydWN0IHNfc21jICpzbWMpOworaW50IGNmbV9nZXRfbWFjX291dHB1dChzdHJ1Y3Qgc19zbWMgKnNtYyk7CitpbnQgcG9ydF90b19taWIoc3RydWN0IHNfc21jICpzbWMsIGludCBwKTsKK2ludCBjZW1fYnVpbGRfcGF0aChzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciAqdG8sIGludCBwYXRoX2luZGV4KTsKK2ludCBzbV9tYWNfZ2V0X3R4X3N0YXRlKHN0cnVjdCBzX3NtYyAqc21jKTsKK2NoYXIgKmdldF9wY21zdGF0ZShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG5wKTsKK2ludCBzbXRfYWN0aW9uKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgY2xhc3MsIGludCBjb2RlLCBpbnQgaW5kZXgpOwordV9zaG9ydCBzbXRfb25saW5lKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgb24pOwordm9pZCBzbXRfZm9yY2VfaXJxKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgc210X3BtZl9yZWNlaXZlZF9wYWNrKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIsIGludCBsb2NhbCk7Cit2b2lkIHNtdF9zZW5kX2ZyYW1lKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIsIGludCBmYywgaW50IGxvY2FsKTsKK3ZvaWQgc210X3NldF90aW1lc3RhbXAoc3RydWN0IHNfc21jICpzbWMsIHVfY2hhciAqcCk7Cit2b2lkIG1hY19zZXRfcnhfbW9kZShzdHJ1Y3Qgc19zbWMgKnNtYywJaW50IG1vZGUpOworaW50IG1hY19hZGRfbXVsdGljYXN0KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyLCBpbnQgY2FuKTsKK2ludCBtYWNfc2V0X2Z1bmNfYWRkcihzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIGZfYWRkcik7Cit2b2lkIG1hY19kZWxfbXVsdGljYXN0KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyLCBpbnQgY2FuKTsKK3ZvaWQgbWFjX3VwZGF0ZV9tdWx0aWNhc3Qoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBtYWNfY2xlYXJfbXVsdGljYXN0KHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgc2V0X2Zvcm1hY190c3luYyhzdHJ1Y3Qgc19zbWMgKnNtYywgbG9uZyBzeW5jX2J3KTsKK3ZvaWQgZm9ybWFjX3JlaW5pdF90eChzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIGZvcm1hY190eF9yZXN0YXJ0KHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgcHJvY2Vzc19yZWNlaXZlKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgaW5pdF9kcml2ZXJfZnBsdXMoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBydG1faXJxKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgcnRtX3NldF90aW1lcihzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIHJpbmdfc3RhdHVzX2luZGljYXRpb24oc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyBzdGF0dXMpOwordm9pZCBsbGNfcmVjb3Zlcl90eChzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIGxsY19yZXN0YXJ0X3R4KHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgcGxjX2NsZWFyX2lycShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHApOwordm9pZCBwbGNfaXJxKHN0cnVjdCBzX3NtYyAqc21jLAlpbnQgbnAsCXVuc2lnbmVkIGludCBjbWQpOworaW50IHNtdF9zZXRfbWFjX29wdmFsdWVzKHN0cnVjdCBzX3NtYyAqc21jKTsKKworI2lmZGVmIFRBR19NT0RFCit2b2lkIG1hY19kcnZfcGNpX2ZpeChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIGZpeF92YWx1ZSk7Cit2b2lkIG1hY19kb19wY2lfZml4KHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgbWFjX2Rydl9jbGVhcl90eF9xdWV1ZShzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIG1hY19kcnZfcmVwYWlyX2Rlc2NyKHN0cnVjdCBzX3NtYyAqc21jKTsKK3VfbG9uZyBod3RfcXVpY2tfcmVhZChzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIGh3dF93YWl0X3RpbWUoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyBzdGFydCwgbG9uZyBkdXJhdGlvbik7CisjZW5kaWYKKworI2lmZGVmIFNNVF9QTk1JCitpbnQgcG5taV9pbml0KHN0cnVjdCBzX3NtYyogc21jKTsKK2ludCBwbm1pX3Byb2Nlc3NfbmRpc19pZChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIG5kaXNfb2lkLCB2b2lkICpidWYsIGludCBsZW4sCisJCQkgaW50ICpCeXRlc0FjY2Vzc2VkLCBpbnQgKkJ5dGVzTmVlZGVkLCB1X2NoYXIgYWN0aW9uKTsKKyNlbmRpZgorCisjaWZkZWYJU0JBCisjaWZuZGVmIF9IMklOQwordm9pZCBzYmEoKTsKKyNlbmRpZgordm9pZCBzYmFfcmFmX3JlY2VpdmVkX3BhY2soKTsKK3ZvaWQgc2JhX3RpbWVyX3BvbGwoKTsKK3ZvaWQgc210X2luaXRfc2JhKCk7CisjZW5kaWYKKworI2lmZGVmCUVTUworaW50IGVzc19yYWZfcmVjZWl2ZWRfcGFjayhzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iLCBzdHJ1Y3Qgc210X2hlYWRlciAqc20sCisJCQkgIGludCBmcyk7Cit2b2lkIGVzc190aW1lcl9wb2xsKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgZXNzX3BhcmFfY2hhbmdlKHN0cnVjdCBzX3NtYyAqc21jKTsKKyNlbmRpZgorCisjaWZuZGVmCUJPT1QKK3ZvaWQgc210X2luaXRfZXZjKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgc210X3NyZl9ldmVudChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGNvZGUsIGludCBpbmRleCwgaW50IGNvbmQpOworI2Vsc2UKKyNkZWZpbmUgc210X2luaXRfZXZjKHNtYykKKyNkZWZpbmUgc210X3NyZl9ldmVudChzbWMsY29kZSxpbmRleCxjb25kKQorI2VuZGlmCisKKyNpZm5kZWYgU01UX1JFQUxfVE9LRU5fQ1QKK3ZvaWQgc210X2VtdWxhdGVfdG9rZW5fY3Qoc3RydWN0IHNfc21jICpzbWMsIGludCBtYWNfaW5kZXgpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHKSAmJiAhZGVmaW5lZChCT09UKQordm9pZCBkdW1wX3NtdChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9oZWFkZXIgKnNtLCBjaGFyICp0ZXh0KTsKKyNlbHNlCisjZGVmaW5lCWR1bXBfc210KHNtYyxzbSx0ZXh0KQorI2VuZGlmCisKKyNpZmRlZglERUJVRworY2hhciogYWRkcl90b19zdHJpbmcoc3RydWN0IGZkZGlfYWRkciAqYWRkcik7Cit2b2lkIGR1bXBfaGV4KGNoYXIgKnAsIGludCBsZW4pOworI2VuZGlmCisKKyNlbmRpZgkvKiBQUk9UT1RZUF9JTkMgKi8KKworLyogUE5NSSBkZWZhdWx0IGRlZmluZXMgKi8KKyNpZm5kZWYgUE5NSV9JTklUCisjZGVmaW5lCVBOTUlfSU5JVChzbWMpCS8qIE5vdGhpbmcgKi8KKyNlbmRpZgorI2lmbmRlZiBQTk1JX0dFVF9JRAorI2RlZmluZSBQTk1JX0dFVF9JRCggc21jLCBuZGlzX29pZCwgYnVmLCBsZW4sIEJ5dGVzV3JpdHRlbiwgQnl0ZXNOZWVkZWQgKSBcCisJCSggMSA/ICgtMSkgOiAoLTEpICkKKyNlbmRpZgorI2lmbmRlZiBQTk1JX1NFVF9JRAorI2RlZmluZSBQTk1JX1NFVF9JRCggc21jLCBuZGlzX29pZCwgYnVmLCBsZW4sIEJ5dGVzUmVhZCwgQnl0ZXNOZWVkZWQsIFwKKwkJc2V0X3R5cGUpICggMSA/ICgtMSkgOiAoLTEpICkKKyNlbmRpZgorCisvKgorICogU01UX1BBTklDIGRlZmluZXMKKyAqLworI2lmbmRlZglTTVRfUEFOSUMKKyNkZWZpbmUJU01UX1BBTklDKHNtYyxucixtc2cpCXNtdF9wYW5pYyAoc21jLCBtc2cpCisjZW5kaWYKKworI2lmbmRlZglTTVRfRVJSX0xPRworI2RlZmluZQlTTVRfRVJSX0xPRyhzbWMsbnIsbXNnKQlTTVRfUEFOSUMgKHNtYywgbnIsIG1zZykKKyNlbmRpZgorCisjaWZuZGVmCVNNVF9FQkFTRQorI2RlZmluZQlTTVRfRUJBU0UJMTAwCisjZW5kaWYKKworI2RlZmluZQlTTVRfRTAxMDAJU01UX0VCQVNFICsgMAorI2RlZmluZQlTTVRfRTAxMDBfTVNHCSJjZm0gRlNNOiBpbnZhbGlkIGNlX3R5cGUiCisjZGVmaW5lCVNNVF9FMDEwMQlTTVRfRUJBU0UgKyAxCisjZGVmaW5lCVNNVF9FMDEwMV9NU0cJIkNFTTogY2FzZSA/Pz8iCisjZGVmaW5lCVNNVF9FMDEwMglTTVRfRUJBU0UgKyAyCisjZGVmaW5lCVNNVF9FMDEwMl9NU0cJIkNFTSBBOiBpbnZhbGlkIHN0YXRlIgorI2RlZmluZQlTTVRfRTAxMDMJU01UX0VCQVNFICsgMworI2RlZmluZQlTTVRfRTAxMDNfTVNHCSJDRU0gQjogaW52YWxpZCBzdGF0ZSIKKyNkZWZpbmUJU01UX0UwMTA0CVNNVF9FQkFTRSArIDQKKyNkZWZpbmUJU01UX0UwMTA0X01TRwkiQ0VNIE06IGludmFsaWQgc3RhdGUiCisjZGVmaW5lCVNNVF9FMDEwNQlTTVRfRUJBU0UgKyA1CisjZGVmaW5lCVNNVF9FMDEwNV9NU0cJIkNFTSBTOiBpbnZhbGlkIHN0YXRlIgorI2RlZmluZQlTTVRfRTAxMDYJU01UX0VCQVNFICsgNgorI2RlZmluZQlTTVRfRTAxMDZfTVNHCSJDRk0gOiBpbnZhbGlkIHN0YXRlIgorI2RlZmluZQlTTVRfRTAxMDcJU01UX0VCQVNFICsgNworI2RlZmluZQlTTVRfRTAxMDdfTVNHCSJFQ00gOiBpbnZhbGlkIHN0YXRlIgorI2RlZmluZQlTTVRfRTAxMDgJU01UX0VCQVNFICsgOAorI2RlZmluZQlTTVRfRTAxMDhfTVNHCSJwcm9wX2FjdGlvbnMgOiBOQUMgaW4gREFTIENGTSIKKyNkZWZpbmUJU01UX0UwMTA5CVNNVF9FQkFTRSArIDkKKyNkZWZpbmUJU01UX0UwMTA5X01TRwkiU1QyVS5GTV9TRVJSU0YgZXJyb3IgaW4gc3BlY2lhbCBmcmFtZSIKKyNkZWZpbmUJU01UX0UwMTEwCVNNVF9FQkFTRSArIDEwCisjZGVmaW5lCVNNVF9FMDExMF9NU0cJIlNUMlUuRk1fU1JGUkNUT1YgcmVjdi4gY291bnQuIG92ZXJmbG93IgorI2RlZmluZQlTTVRfRTAxMTEJU01UX0VCQVNFICsgMTEKKyNkZWZpbmUJU01UX0UwMTExX01TRwkiU1QyVS5GTV9TTkZTTEQgTlAgJiBGT1JNQUMgc2ltdWx0LiBsb2FkIgorI2RlZmluZQlTTVRfRTAxMTIJU01UX0VCQVNFICsgMTIKKyNkZWZpbmUJU01UX0UwMTEyX01TRwkiU1QyVS5GTV9TUkNWRlJNIHNpbmdsZS1mcmFtZSByZWN2Li1tb2RlIgorI2RlZmluZQlTTVRfRTAxMTMJU01UX0VCQVNFICsgMTMKKyNkZWZpbmUJU01UX0UwMTEzX01TRwkiRlBMVVM6IEJ1ZmZlciBNZW1vcnkgRXJyb3IiCisjZGVmaW5lCVNNVF9FMDExNAlTTVRfRUJBU0UgKyAxNAorI2RlZmluZQlTTVRfRTAxMTRfTVNHCSJTVDJVLkZNX1NFUlJTRiBlcnJvciBpbiBzcGVjaWFsIGZyYW1lIgorI2RlZmluZQlTTVRfRTAxMTUJU01UX0VCQVNFICsgMTUKKyNkZWZpbmUJU01UX0UwMTE1X01TRwkiU1QzTDogcGFyaXR5IGVycm9yIGluIHJlY2VpdmUgcXVldWUgMiIKKyNkZWZpbmUJU01UX0UwMTE2CVNNVF9FQkFTRSArIDE2CisjZGVmaW5lCVNNVF9FMDExNl9NU0cJIlNUM0w6IHBhcml0eSBlcnJvciBpbiByZWNlaXZlIHF1ZXVlIDEiCisjZGVmaW5lCVNNVF9FMDExNwlTTVRfRUJBU0UgKyAxNworI2RlZmluZQlTTVRfRTAxMTdfTVNHCSJFX1NNVF8wMDE6IFJ4RCBjb3VudCBmb3IgcmVjZWl2ZSBxdWV1ZSAxID0gMCIKKyNkZWZpbmUJU01UX0UwMTE4CVNNVF9FQkFTRSArIDE4CisjZGVmaW5lCVNNVF9FMDExOF9NU0cJIlBDTSA6IGludmFsaWQgc3RhdGUiCisjZGVmaW5lCVNNVF9FMDExOQlTTVRfRUJBU0UgKyAxOQorI2RlZmluZQlTTVRfRTAxMTlfTVNHCSJzbXRfYWRkX3BhcmEiCisjZGVmaW5lCVNNVF9FMDEyMAlTTVRfRUJBU0UgKyAyMAorI2RlZmluZQlTTVRfRTAxMjBfTVNHCSJzbXRfc2V0X3BhcmEiCisjZGVmaW5lCVNNVF9FMDEyMQlTTVRfRUJBU0UgKyAyMQorI2RlZmluZQlTTVRfRTAxMjFfTVNHCSJpbnZhbGlkIGV2ZW50IGluIGRpc3BhdGNoZXIiCisjZGVmaW5lCVNNVF9FMDEyMglTTVRfRUJBU0UgKyAyMgorI2RlZmluZQlTTVRfRTAxMjJfTVNHCSJSTVQgOiBpbnZhbGlkIHN0YXRlIgorI2RlZmluZQlTTVRfRTAxMjMJU01UX0VCQVNFICsgMjMKKyNkZWZpbmUJU01UX0UwMTIzX01TRwkiU0JBOiBzdGF0ZSBtYWNoaW5lIGhhcyBpbnZhbGlkIHN0YXRlIgorI2RlZmluZQlTTVRfRTAxMjQJU01UX0VCQVNFICsgMjQKKyNkZWZpbmUJU01UX0UwMTI0X01TRwkic2JhX2ZyZWVfc2Vzc2lvbigpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIKKyNkZWZpbmUJU01UX0UwMTI1CVNNVF9FQkFTRSArIDI1CisjZGVmaW5lCVNNVF9FMDEyNV9NU0cJIlNCQSA6IGludmFsaWQgc2Vzc2lvbiBwb2ludGVyIgorI2RlZmluZQlTTVRfRTAxMjYJU01UX0VCQVNFICsgMjYKKyNkZWZpbmUJU01UX0UwMTI2X01TRwkic210X2ZyZWVfbWJ1ZigpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlclxuIgorI2RlZmluZQlTTVRfRTAxMjcJU01UX0VCQVNFICsgMjcKKyNkZWZpbmUJU01UX0UwMTI3X01TRwkic2l6ZW9mIGV2Y3MiCisjZGVmaW5lCVNNVF9FMDEyOAlTTVRfRUJBU0UgKyAyOAorI2RlZmluZQlTTVRfRTAxMjhfTVNHCSJldmMtPmV2Y19jb25kX3N0YXRlID0gMCIKKyNkZWZpbmUJU01UX0UwMTI5CVNNVF9FQkFTRSArIDI5CisjZGVmaW5lCVNNVF9FMDEyOV9NU0cJImV2Yy0+ZXZjX211bHRpcGxlID0gMCIKKyNkZWZpbmUJU01UX0UwMTMwCVNNVF9FQkFTRSArIDMwCisjZGVmaW5lCVNNVF9FMDEzMF9NU0cJd3JpdGVfbWRyX3dhcm5pbmcKKyNkZWZpbmUJU01UX0UwMTMxCVNNVF9FQkFTRSArIDMxCisjZGVmaW5lCVNNVF9FMDEzMV9NU0cJY2FtX3dhcm5pbmcKKyNkZWZpbmUgU01UX0UwMTMyCVNNVF9FQkFTRSArIDMyCisjZGVmaW5lIFNNVF9FMDEzMl9NU0cJIlNUMUwuRk1fU1BDRVBEeCBwYXJpdHkvY29kaW5nIGVycm9yIgorI2RlZmluZSBTTVRfRTAxMzMJU01UX0VCQVNFICsgMzMKKyNkZWZpbmUgU01UX0UwMTMzX01TRwkiU1QxTC5GTV9TVEJVUnggdHggYnVmZmVyIHVuZGVycnVuIgorI2RlZmluZSBTTVRfRTAxMzQJU01UX0VCQVNFICsgMzQKKyNkZWZpbmUgU01UX0UwMTM0X01TRwkiU1QxTC5GTV9TUENFUER4IHBhcml0eSBlcnJvciIKKyNkZWZpbmUgU01UX0UwMTM1CVNNVF9FQkFTRSArIDM1CisjZGVmaW5lIFNNVF9FMDEzNV9NU0cJIlJNVDogZHVwbGljYXRlIE1BQyBhZGRyZXNzIGRldGVjdGVkLiBSaW5nIGxlZnQhIgorI2RlZmluZSBTTVRfRTAxMzYJU01UX0VCQVNFICsgMzYKKyNkZWZpbmUgU01UX0UwMTM2X01TRwkiRWxhc3RpY2l0eSBCdWZmZXIgaGFuZy11cCIKKyNkZWZpbmUgU01UX0UwMTM3CVNNVF9FQkFTRSArIDM3CisjZGVmaW5lIFNNVF9FMDEzN19NU0cJIlNNVDogcXVldWUgb3ZlcnJ1biIKKyNkZWZpbmUgU01UX0UwMTM4CVNNVF9FQkFTRSArIDM4CisjZGVmaW5lIFNNVF9FMDEzOF9NU0cJIlJNVDogZHVwbGljYXRlIE1BQyBhZGRyZXNzIGRldGVjdGVkLiBSaW5nIE5PVCBsZWZ0ISIKKyNlbmRpZgkvKiBfQ01UREVGXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9oL2ZkZGkuaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC9mZGRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhMjhhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC9mZGRpLmgKQEAgLTAsMCArMSw2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglfRkRESV8KKyNkZWZpbmUgX0ZERElfCisKK3N0cnVjdCBmZGRpX2FkZHIgeworCXVfY2hhcglhWzZdIDsKK30gOworCisjZGVmaW5lIEdST1VQX0FERFIJMHg4MAkJLyogTVNCIGluIGFbMF0gKi8KKworc3RydWN0IGZkZGlfbWFjIHsKKwlzdHJ1Y3QgZmRkaV9hZGRyCW1hY19kZXN0IDsKKwlzdHJ1Y3QgZmRkaV9hZGRyCW1hY19zb3VyY2UgOworCXVfY2hhcgkJCW1hY19pbmZvWzQ0NzhdIDsKK30gOworCisjZGVmaW5lIEZERElfTUFDX1NJWkUJKDEyKQorI2RlZmluZSBGRERJX1JBV19NVFUJKDQ1MDAtNSkJLyogZXhsLiBQcixTRCwgRUQvRlMgKi8KKyNkZWZpbmUgRkRESV9SQVcJKDQ1MDApCisKKy8qCisgKiBGQyB2YWx1ZXMKKyAqLworI2RlZmluZSBGQ19WT0lECQkweDQwCQkvKiB2b2lkIGZyYW1lICovCisjZGVmaW5lIEZDX1RPS0VOCTB4ODAJCS8qIHRva2VuICovCisjZGVmaW5lIEZDX1JFU19UT0tFTgkweGMwCQkvKiByZXN0cmljdGVkIHRva2VuICovCisjZGVmaW5lIEZDX1NNVF9JTkZPCTB4NDEJCS8qIFNNVCBJbmZvIGZyYW1lICovCisvKgorICogRkNfU01UX0xBTl9MT0MgJiYgRkNfU01UX0xPQyBhcmUgU0sgc3BlY2lmaWMgIQorICovCisjZGVmaW5lIEZDX1NNVF9MQU5fTE9DCTB4NDIJCS8qIGxvY2FsIFNNVCBJbmZvIGZyYW1lICovCisjZGVmaW5lIEZDX1NNVF9MT0MJMHg0MwkJLyogbG9jYWwgU01UIEluZm8gZnJhbWUgKi8KKyNkZWZpbmUgRkNfU01UX05TQQkweDRmCQkvKiBTTVQgTlNBIGZyYW1lICovCisjZGVmaW5lIEZDX01BQwkJMHhjMAkJLyogTUFDIGZyYW1lICovCisjZGVmaW5lIEZDX0JFQUNPTgkweGMyCQkvKiBNQUMgYmVhY29uIGZyYW1lICovCisjZGVmaW5lIEZDX0NMQUlNCTB4YzMJCS8qIE1BQyBjbGFpbSBmcmFtZSAqLworI2RlZmluZSBGQ19TWU5DX0xMQwkweGQwCQkvKiBzeW5jLiBMTEMgZnJhbWUgKi8KKyNkZWZpbmUgRkNfQVNZTkNfTExDCTB4NTAJCS8qIGFzeW5jLiBMTEMgZnJhbWUgKi8KKyNkZWZpbmUgRkNfU1lOQ19CSVQJMHg4MAkJLyogc3luYy4gYml0IGluIEZDICovCisKKyNkZWZpbmUgRkNfTExDX1BSSU9SCTB4MDcJCS8qIHByaW9yaXR5IGJpdHMgKi8KKworI2RlZmluZSBCRUFDT05fSU5GTwkwCQkvKiBiZWFjb24gdHlwZSAqLworI2RlZmluZSBEQkVBQ09OX0lORk8JMQkJLyogYmVhY29uIHR5cGUgRElSRUNURUQgKi8KKworCisvKgorICogaW5kaWNhdG9yIGJpdHMKKyAqLworI2RlZmluZSBDX0lORElDQVRPUgkoMTw8MCkKKyNkZWZpbmUgQV9JTkRJQ0FUT1IJKDE8PDEpCisjZGVmaW5lIEVfSU5ESUNBVE9SCSgxPDwyKQorI2RlZmluZSBJX0lORElDQVRPUgkoMTw8NikJCS8qIFNLIHNwZWNpZmljICovIAorI2RlZmluZSBMX0lORElDQVRPUgkoMTw8NykJCS8qIFNLIHNwZWNpZmljICovCisKKyNlbmRpZgkvKiBfRkRESV8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9mZGRpbWliLmggYi9kcml2ZXJzL25ldC9za2ZwL2gvZmRkaW1pYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYWNkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvZmRkaW1pYi5oCkBAIC0wLDAgKzEsMzQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRkRESSBNSUIKKyAqLworCisvKgorICogdHlwZWRlZnMKKyAqLworCit0eXBlZGVmCXVfbG9uZwlDb3VudGVyIDsKK3R5cGVkZWYgdV9jaGFyCVRpbWVTdGFtcFs4XSA7Cit0eXBlZGVmIHN0cnVjdCBmZGRpX2FkZHIgTG9uZ0FkZHIgOwordHlwZWRlZgl1X2xvbmcJVGltZXJfMiA7Cit0eXBlZGVmCXVfbG9uZwlUaW1lciA7Cit0eXBlZGVmCXVfc2hvcnQJUmVzSWQgOwordHlwZWRlZiB1X3Nob3J0CVNNVEVudW0gOwordHlwZWRlZgl1X2NoYXIJU01URmxhZyA7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlDb3VudGVyCQljb3VudCA7CisJVGltZVN0YW1wCXRpbWVzdGFtcCA7Cit9IFNldENvdW50VHlwZSA7CisKKy8qCisgKiBiaXRzIGZvciBiaXQgc3RyaW5nICJhdmFpbGFibGVfcGF0aCIKKyAqLworI2RlZmluZSBNSUJfUEFUSF9QCSgxPDwwKQorI2RlZmluZSBNSUJfUEFUSF9TCSgxPDwxKQorI2RlZmluZSBNSUJfUEFUSF9MCSgxPDwyKQorCisvKgorICogYml0cyBmb3IgYml0IHN0cmluZyBQZXJtaXR0ZWRQYXRocyAmIFJlcXVlc3RlZFBhdGhzIChTSVpFKDgpKQorICovCisjZGVmaW5lIE1JQl9QX1BBVEhfTE9DQUwJKDE8PDApCisjZGVmaW5lIE1JQl9QX1BBVEhfU0VDX0FMVEVSCSgxPDwxKQorI2RlZmluZSBNSUJfUF9QQVRIX1BSSU1fQUxURVIJKDE8PDIpCisjZGVmaW5lIE1JQl9QX1BBVEhfQ09OX0FMVEVSCSgxPDwzKQorI2RlZmluZSBNSUJfUF9QQVRIX1NFQ19QUkVGRVIJKDE8PDQpCisjZGVmaW5lIE1JQl9QX1BBVEhfUFJJTV9QUkVGRVIJKDE8PDUpCisjZGVmaW5lIE1JQl9QX1BBVEhfQ09OX1BSRUZFUgkoMTw8NikKKyNkZWZpbmUgTUlCX1BfUEFUSF9USFJVCQkoMTw8NykKKworLyoKKyAqIGVudW0gY3VycmVudCBwYXRoCisgKi8KKyNkZWZpbmUgTUlCX1BBVEhfSVNPTEFURUQJMAorI2RlZmluZSBNSUJfUEFUSF9MT0NBTAkJMQorI2RlZmluZSBNSUJfUEFUSF9TRUNPTkRBUlkJMgorI2RlZmluZSBNSUJfUEFUSF9QUklNQVJZCTMKKyNkZWZpbmUgTUlCX1BBVEhfQ09OQ0FURU5BVEVECTQKKyNkZWZpbmUgTUlCX1BBVEhfVEhSVQkJNQorCisvKgorICogZW51bSBQTURDbGFzcworICovCisjZGVmaW5lIE1JQl9QTURDTEFTU19NVUxUSQkwCisjZGVmaW5lIE1JQl9QTURDTEFTU19TSU5HTEUxCTEKKyNkZWZpbmUgTUlCX1BNRENMQVNTX1NJTkdMRTIJMgorI2RlZmluZSBNSUJfUE1EQ0xBU1NfU09ORVQJMworI2RlZmluZSBNSUJfUE1EQ0xBU1NfTENGCTQKKyNkZWZpbmUgTUlCX1BNRENMQVNTX1RQCQk1CisjZGVmaW5lIE1JQl9QTURDTEFTU19VTktOT1dOCTYKKyNkZWZpbmUgTUlCX1BNRENMQVNTX1VOU1BFQwk3CisKKy8qCisgKiBlbnVtIFNNVFN0YXRpb25TdGF0dXMKKyAqLworI2RlZmluZSBNSUJfU01UX1NUQVNUQV9DT04JMAorI2RlZmluZSBNSUJfU01UX1NUQVNUQV9TRVBBCTEKKyNkZWZpbmUgTUlCX1NNVF9TVEFTVEFfVEhSVQkyCisKKworc3RydWN0IGZkZGlfbWliIHsKKwkvKgorCSAqIHByaXZhdGUKKwkgKi8KKwl1X2NoYXIJCQlmZGRpUFJQTUZQYXNzd2RbOF0gOworCXN0cnVjdCBzbXRfc2lkCQlmZGRpUFJQTUZTdGF0aW9uIDsKKworI2lmZGVmCUVTUworCS8qCisJICogcHJpdmF0ZSB2YXJpYWJsZXMgZm9yIHN0YXRpYyBhbGxvY2F0aW9uIG9mIHRoZQorCSAqIEVuZCBTdGF0aW9uIFN1cHBvcnQKKwkgKi8KKwl1X2xvbmcJZmRkaUVTU1BheWxvYWQgOwkvKiBwYXlsb2FkIGZvciBzdGF0aWMgYWxsb2MgKi8KKwl1X2xvbmcJZmRkaUVTU092ZXJoZWFkIDsJLyogZnJhbWUgb3YgZm9yIHN0YXRpYyBhbGxvYyAqLworCXVfbG9uZwlmZGRpRVNTTWF4VE5lZyA7CS8qIG1heGltdW0gb2YgVC1ORUcgKi8KKwl1X2xvbmcJZmRkaUVTU01pblNlZ21lbnRTaXplIDsJLyogbWluIHNpemUgb2YgdGhlIHN5bmMgZnJhbWVzICovCisJdV9sb25nCWZkZGlFU1NDYXRlZ29yeSA7CS8qIGNhdGVnb3J5IGZvciB0aGUgQWxsb2MgcmVxICovCisJc2hvcnQJZmRkaUVTU1N5bmNoVHhNb2RlIDsJLyogc2VuZCBhbGwgTExDIGZyYW1lcyBhcyBzeW5jICovCisjZW5kaWYJLyogRVNTICovCisjaWZkZWYJU0JBCisJLyoKKwkgKiBwcml2YXRlIHZhcmlhYmxlcyBmb3IgdGhlIFN5bmNocm9ub3VzIEJhbmR3aWR0aCBBbGxvY2F0b3IKKwkgKi8KKwljaGFyCWZkZGlTQkFDb21tYW5kIDsJLyogaG9sZHMgdGhlIHBhcnNlZCBTQkEgY21kICovCisJdV9jaGFyCWZkZGlTQkFBdmFpbGFibGUgOwkvKiBTQkEgYWxsb2NhdGFibGUgdmFsdWUgKi8KKyNlbmRpZgkvKiBTQkEgKi8KKworCS8qCisJICogU01UIHN0YW5kYXJkIG1pYgorCSAqLworCXN0cnVjdCBzbXRfc2lkCQlmZGRpU01UU3RhdGlvbklkIDsKKwl1X3Nob3J0CQkJZmRkaVNNVE9wVmVyc2lvbklkIDsKKwl1X3Nob3J0CQkJZmRkaVNNVEhpVmVyc2lvbklkIDsKKwl1X3Nob3J0CQkJZmRkaVNNVExvVmVyc2lvbklkIDsKKwl1X2NoYXIJCQlmZGRpU01UTWFudWZhY3R1cmVyRGF0YVszMl0gOworCXVfY2hhcgkJCWZkZGlTTVRVc2VyRGF0YVszMl0gOworCXVfc2hvcnQJCQlmZGRpU01UTUlCVmVyc2lvbklkIDsKKworCS8qCisJICogQ29uZmlnR3JwCisJICovCisJdV9jaGFyCQkJZmRkaVNNVE1hY19DdCA7CisJdV9jaGFyCQkJZmRkaVNNVE5vbk1hc3Rlcl9DdCA7CisJdV9jaGFyCQkJZmRkaVNNVE1hc3Rlcl9DdCA7CisJdV9jaGFyCQkJZmRkaVNNVEF2YWlsYWJsZVBhdGhzIDsKKwl1X3Nob3J0CQkJZmRkaVNNVENvbmZpZ0NhcGFiaWxpdGllcyA7CisJdV9zaG9ydAkJCWZkZGlTTVRDb25maWdQb2xpY3kgOworCXVfc2hvcnQJCQlmZGRpU01UQ29ubmVjdGlvblBvbGljeSA7CisJdV9zaG9ydAkJCWZkZGlTTVRUVF9Ob3RpZnkgOworCXVfY2hhcgkJCWZkZGlTTVRTdGF0UnB0UG9saWN5IDsKKwl1X2xvbmcJCQlmZGRpU01UVHJhY2VfTWF4RXhwaXJhdGlvbiA7CisJdV9zaG9ydAkJCWZkZGlTTVRQT1JUSW5kZXhlc1tOVU1QSFlTXSA7CisJdV9zaG9ydAkJCWZkZGlTTVRNQUNJbmRleGVzIDsKKwl1X2NoYXIJCQlmZGRpU01UQnlwYXNzUHJlc2VudCA7CisKKwkvKgorCSAqIFN0YXR1c0dycAorCSAqLworCVNNVEVudW0JCQlmZGRpU01URUNNU3RhdGUgOworCVNNVEVudW0JCQlmZGRpU01UQ0ZfU3RhdGUgOworCVNNVEVudW0JCQlmZGRpU01UU3RhdGlvblN0YXR1cyA7CisJdV9jaGFyCQkJZmRkaVNNVFJlbW90ZURpc2Nvbm5lY3RGbGFnIDsKKwl1X2NoYXIJCQlmZGRpU01UUGVlcldyYXBGbGFnIDsKKworCS8qCisJICogTUlCT3BlcmF0aW9uR3JwCisJICovCisJVGltZVN0YW1wCQlmZGRpU01UVGltZVN0YW1wIDsKKwlUaW1lU3RhbXAJCWZkZGlTTVRUcmFuc2l0aW9uVGltZVN0YW1wIDsKKwlTZXRDb3VudFR5cGUJCWZkZGlTTVRTZXRDb3VudCA7CisJc3RydWN0IHNtdF9zaWQJCWZkZGlTTVRMYXN0U2V0U3RhdGlvbklkIDsKKworCXN0cnVjdCBmZGRpX21pYl9tIHsKKwkJdV9zaG9ydAkJZmRkaU1BQ0ZyYW1lU3RhdHVzRnVuY3Rpb25zIDsKKwkJVGltZXJfMgkJZmRkaU1BQ1RfTWF4Q2FwYWJpbGl0aXkgOworCQlUaW1lcl8yCQlmZGRpTUFDVFZYQ2FwYWJpbGl0aXkgOworCisJCS8qIENvbmZpZ0dycCAqLworCQl1X2NoYXIJCWZkZGlNQUNNdWx0aXBsZV9OIDsJLyogcHJpdmF0ZSAqLworCQl1X2NoYXIJCWZkZGlNQUNNdWx0aXBsZV9QIDsJLyogcHJpdmF0ZSAqLworCQl1X2NoYXIJCWZkZGlNQUNEdXBsaWNhdGVBZGRyZXNzQ29uZCA7LyogcHJpdmF0ZSAqLworCQl1X2NoYXIJCWZkZGlNQUNBdmFpbGFibGVQYXRocyA7CisJCXVfc2hvcnQJCWZkZGlNQUNDdXJyZW50UGF0aCA7CisJCUxvbmdBZGRyCWZkZGlNQUNVcHN0cmVhbU5iciA7CisJCUxvbmdBZGRyCWZkZGlNQUNEb3duc3RyZWFtTmJyIDsKKwkJTG9uZ0FkZHIJZmRkaU1BQ09sZFVwc3RyZWFtTmJyIDsKKwkJTG9uZ0FkZHIJZmRkaU1BQ09sZERvd25zdHJlYW1OYnIgOworCQlTTVRFbnVtCQlmZGRpTUFDRHVwQWRkcmVzc1Rlc3QgOworCQl1X3Nob3J0CQlmZGRpTUFDUmVxdWVzdGVkUGF0aHMgOworCQlTTVRFbnVtCQlmZGRpTUFDRG93bnN0cmVhbVBPUlRUeXBlIDsKKwkJUmVzSWQJCWZkZGlNQUNJbmRleCA7CisKKwkJLyogQWRkcmVzc0dycCAqLworCQlMb25nQWRkcglmZGRpTUFDU01UQWRkcmVzcyA7CisKKwkJLyogT3BlcmF0aW9uR3JwICovCisJCVRpbWVyXzIJCWZkZGlNQUNUX01pbiA7CS8qIHByaXZhdGUgKi8KKwkJVGltZXJfMgkJZmRkaU1BQ1RfUmVxTUlCIDsKKwkJVGltZXJfMgkJZmRkaU1BQ1RfUmVxIDsJLyogcHJpdmF0ZSAqLworCQlUaW1lcl8yCQlmZGRpTUFDVF9OZWcgOworCQlUaW1lcl8yCQlmZGRpTUFDVF9NYXhNSUIgOworCQlUaW1lcl8yCQlmZGRpTUFDVF9NYXggOwkvKiBwcml2YXRlICovCisJCVRpbWVyXzIJCWZkZGlNQUNUdnhWYWx1ZU1JQiA7CisJCVRpbWVyXzIJCWZkZGlNQUNUdnhWYWx1ZSA7IC8qIHByaXZhdGUgKi8KKwkJVGltZXJfMgkJZmRkaU1BQ1RfUHJpMCA7CisJCVRpbWVyXzIJCWZkZGlNQUNUX1ByaTEgOworCQlUaW1lcl8yCQlmZGRpTUFDVF9QcmkyIDsKKwkJVGltZXJfMgkJZmRkaU1BQ1RfUHJpMyA7CisJCVRpbWVyXzIJCWZkZGlNQUNUX1ByaTQgOworCQlUaW1lcl8yCQlmZGRpTUFDVF9Qcmk1IDsKKwkJVGltZXJfMgkJZmRkaU1BQ1RfUHJpNiA7CisKKwkJLyogQ291bnRlcnNHcnAgKi8KKwkJQ291bnRlcgkJZmRkaU1BQ0ZyYW1lX0N0IDsKKwkJQ291bnRlcgkJZmRkaU1BQ0NvcGllZF9DdCA7CisJCUNvdW50ZXIJCWZkZGlNQUNUcmFuc21pdF9DdCA7CisJCUNvdW50ZXIJCWZkZGlNQUNUb2tlbl9DdCA7CisJCUNvdW50ZXIJCWZkZGlNQUNFcnJvcl9DdCA7CisJCUNvdW50ZXIJCWZkZGlNQUNMb3N0X0N0IDsKKwkJQ291bnRlcgkJZmRkaU1BQ1R2eEV4cGlyZWRfQ3QgOworCQlDb3VudGVyCQlmZGRpTUFDTm90Q29waWVkX0N0IDsKKwkJQ291bnRlcgkJZmRkaU1BQ1JpbmdPcF9DdCA7CisKKwkJQ291bnRlcgkJZmRkaU1BQ1NNVENvcGllZF9DdCA7CQkvKiBwcml2YXRlICovCisJCUNvdW50ZXIJCWZkZGlNQUNTTVRUcmFuc21pdF9DdCA7CQkvKiBwcml2YXRlICovCisKKwkJLyogcHJpdmF0ZSBmb3IgZGVsdGEgcmF0aW8gKi8KKwkJQ291bnRlcgkJZmRkaU1BQ09sZF9GcmFtZV9DdCA7CisJCUNvdW50ZXIJCWZkZGlNQUNPbGRfQ29waWVkX0N0IDsKKwkJQ291bnRlcgkJZmRkaU1BQ09sZF9FcnJvcl9DdCA7CisJCUNvdW50ZXIJCWZkZGlNQUNPbGRfTG9zdF9DdCA7CisJCUNvdW50ZXIJCWZkZGlNQUNPbGRfTm90Q29waWVkX0N0IDsKKworCQkvKiBGcmFtZUVycm9yQ29uZGl0aW9uR3JwICovCisJCXVfc2hvcnQJCWZkZGlNQUNGcmFtZUVycm9yVGhyZXNob2xkIDsKKwkJdV9zaG9ydAkJZmRkaU1BQ0ZyYW1lRXJyb3JSYXRpbyA7CisKKwkJLyogTm90Q29waWVkQ29uZGl0aW9uR3JwICovCisJCXVfc2hvcnQJCWZkZGlNQUNOb3RDb3BpZWRUaHJlc2hvbGQgOworCQl1X3Nob3J0CQlmZGRpTUFDTm90Q29waWVkUmF0aW8gOworCisJCS8qIFN0YXR1c0dycCAqLworCQlTTVRFbnVtCQlmZGRpTUFDUk1UU3RhdGUgOworCQlTTVRGbGFnCQlmZGRpTUFDREFfRmxhZyA7CisJCVNNVEZsYWcJCWZkZGlNQUNVTkRBX0ZsYWcgOworCQlTTVRGbGFnCQlmZGRpTUFDRnJhbWVFcnJvckZsYWcgOworCQlTTVRGbGFnCQlmZGRpTUFDTm90Q29waWVkRmxhZyA7CisJCVNNVEZsYWcJCWZkZGlNQUNNQV9Vbml0ZGF0YUF2YWlsYWJsZSA7CisJCVNNVEZsYWcJCWZkZGlNQUNIYXJkd2FyZVByZXNlbnQgOworCQlTTVRGbGFnCQlmZGRpTUFDTUFfVW5pdGRhdGFFbmFibGUgOworCisJfSBtW05VTU1BQ1NdIDsKKyNkZWZpbmUgTUFDMAkwCisKKwlzdHJ1Y3QgZmRkaV9taWJfYSB7CisJCVJlc0lkCQlmZGRpUEFUSEluZGV4IDsKKwkJdV9sb25nCQlmZGRpUEFUSFNiYVBheWxvYWQgOworCQl1X2xvbmcJCWZkZGlQQVRIU2JhT3ZlcmhlYWQgOworCQkvKiBmZGRpUEFUSENvbmZpZ3VyYXRpb24gaXMgYnVpbHQgb24gZGVtYW5kICovCisJCS8qIHVfbG9uZwkJZmRkaVBBVEhDb25maWd1cmF0aW9uIDsgKi8KKwkJVGltZXIJCWZkZGlQQVRIVF9SbW9kZSA7CisJCXVfbG9uZwkJZmRkaVBBVEhTYmFBdmFpbGFibGUgOworCQlUaW1lcl8yCQlmZGRpUEFUSFRWWExvd2VyQm91bmQgOworCQlUaW1lcl8yCQlmZGRpUEFUSFRfTWF4TG93ZXJCb3VuZCA7CisJCVRpbWVyXzIJCWZkZGlQQVRITWF4VF9SZXEgOworCX0gYVtOVU1QQVRIU10gOworI2RlZmluZSBQQVRIMAkwCisKKwlzdHJ1Y3QgZmRkaV9taWJfcCB7CisJCS8qIENvbmZpZ0dycCAqLworCQlTTVRFbnVtCQlmZGRpUE9SVE15X1R5cGUgOworCQlTTVRFbnVtCQlmZGRpUE9SVE5laWdoYm9yVHlwZSA7CisJCXVfY2hhcgkJZmRkaVBPUlRDb25uZWN0aW9uUG9saWNpZXMgOworCQlzdHJ1Y3QgeworCQkJdV9jaGFyCVRfdmFsIDsKKwkJCXVfY2hhcglSX3ZhbCA7CisJCX0gZmRkaVBPUlRNYWNJbmRpY2F0ZWQgOworCQlTTVRFbnVtCQlmZGRpUE9SVEN1cnJlbnRQYXRoIDsKKwkJLyogbXVzdCBiZSA0OiBpcyAzMiBiaXQgaW4gU01UIGZvcm1hdAorCQkgKiBpbmRpY2VzIDoKKwkJICoJMQlub25lCisJCSAqCTIJdHJlZQorCQkgKgkzCXBlZXIKKwkJICovCisJCXVfY2hhcgkJZmRkaVBPUlRSZXF1ZXN0ZWRQYXRoc1s0XSA7CisJCXVfc2hvcnQJCWZkZGlQT1JUTUFDUGxhY2VtZW50IDsKKwkJdV9jaGFyCQlmZGRpUE9SVEF2YWlsYWJsZVBhdGhzIDsKKwkJdV9jaGFyCQlmZGRpUE9SVENvbm5lY3Rpb25DYXBhYmlsaXRpZXMgOworCQlTTVRFbnVtCQlmZGRpUE9SVFBNRENsYXNzIDsKKwkJUmVzSWQJCWZkZGlQT1JUSW5kZXggOworCisJCS8qIE9wZXJhdGlvbkdycCAqLworCQlTTVRFbnVtCQlmZGRpUE9SVE1haW50X0xTIDsKKwkJU01URW51bQkJZmRkaVBPUlRQQ19MUyA7CisJCXVfY2hhcgkJZmRkaVBPUlRCU19GbGFnIDsKKworCQkvKiBFcnJvckN0cnNHcnAgKi8KKwkJQ291bnRlcgkJZmRkaVBPUlRMQ1RGYWlsX0N0IDsKKwkJQ291bnRlcgkJZmRkaVBPUlRFQkVycm9yX0N0IDsKKwkJQ291bnRlcgkJZmRkaVBPUlRPbGRFQkVycm9yX0N0IDsKKworCQkvKiBMZXJHcnAgKi8KKwkJQ291bnRlcgkJZmRkaVBPUlRMZW1fUmVqZWN0X0N0IDsKKwkJQ291bnRlcgkJZmRkaVBPUlRMZW1fQ3QgOworCQl1X2NoYXIJCWZkZGlQT1JUTGVyX0VzdGltYXRlIDsKKwkJdV9jaGFyCQlmZGRpUE9SVExlcl9DdXRvZmYgOworCQl1X2NoYXIJCWZkZGlQT1JUTGVyX0FsYXJtIDsKKworCQkvKiBTdGF0dXNHcnAgKi8KKwkJU01URW51bQkJZmRkaVBPUlRDb25uZWN0U3RhdGUgOworCQlTTVRFbnVtCQlmZGRpUE9SVFBDTVN0YXRlIDsJLyogcmVhbCB2YWx1ZSAqLworCQlTTVRFbnVtCQlmZGRpUE9SVFBDTVN0YXRlWCA7CS8qIHZhbHVlIGZvciBNSUIgKi8KKwkJU01URW51bQkJZmRkaVBPUlRQQ19XaXRoaG9sZCA7CisJCVNNVEZsYWcJCWZkZGlQT1JUSGFyZHdhcmVQcmVzZW50IDsKKwkJdV9jaGFyCQlmZGRpUE9SVExlckZsYWcgOworCisJCXVfY2hhcgkJZmRkaVBPUlRNdWx0aXBsZV9VIDsJLyogcHJpdmF0ZSAqLworCQl1X2NoYXIJCWZkZGlQT1JUTXVsdGlwbGVfUCA7CS8qIHByaXZhdGUgKi8KKwkJdV9jaGFyCQlmZGRpUE9SVEVCX0NvbmRpdGlvbiA7CS8qIHByaXZhdGUgKi8KKwl9IHBbTlVNUEhZU10gOworCXN0cnVjdCB7CisJCUNvdW50ZXIJCWZkZGlQUklWRUNGX1JlcV9SeCA7CS8qIEVDRiByZXEgcmVjZWl2ZWQgKi8KKwkJQ291bnRlcgkJZmRkaVBSSVZFQ0ZfUmVwbHlfUnggOwkvKiBFQ0YgcmVwbCByZWNlaXZlZCAqLworCQlDb3VudGVyCQlmZGRpUFJJVkVDRl9SZXFfVHggOwkvKiBFQ0YgcmVxIHRyYW5zbSAqLworCQlDb3VudGVyCQlmZGRpUFJJVkVDRl9SZXBseV9UeCA7CS8qIEVDRiByZXBsIHRyYW5zbSAqLworCQlDb3VudGVyCQlmZGRpUFJJVlBNRl9HZXRfUnggOwkvKiBQTUYgR2V0IHJlYyAqLworCQlDb3VudGVyCQlmZGRpUFJJVlBNRl9TZXRfUnggOwkvKiBQTUYgU2V0IHJlYyAqLworCQlDb3VudGVyCQlmZGRpUFJJVlJERl9SeCA7CS8qIFJERiByZWNlaXZlZCAqLworCQlDb3VudGVyCQlmZGRpUFJJVlJERl9UeCA7CS8qIFJERiB0cmFuc21pdHRlZCAqLworCX0gcHJpdiA7Cit9IDsKKworLyoKKyAqIE9JRHMgZm9yIHN0YXRpc3RpY3MKKyAqLworI2RlZmluZQlTTVRfT0lEX0NGX1NUQVRFCTEJLyogZmRkaVNNVENGX1N0YXRlICovCisjZGVmaW5lCVNNVF9PSURfUENNX1NUQVRFX0EJMgkvKiBmZGRpUE9SVFBDTVN0YXRlIHBvcnQgQSAqLworI2RlZmluZQlTTVRfT0lEX1BDTV9TVEFURV9CCTE3CS8qIGZkZGlQT1JUUENNU3RhdGUgcG9ydCBCICovCisjZGVmaW5lCVNNVF9PSURfUk1UX1NUQVRFCTMJLyogZmRkaU1BQ1JNVFN0YXRlICovCisjZGVmaW5lCVNNVF9PSURfVU5BCQk0CS8qIGZkZGlNQUNVcHN0cmVhbU5iciAqLworI2RlZmluZQlTTVRfT0lEX0ROQQkJNQkvKiBmZGRpTUFDT2xkRG93bnN0cmVhbU5iciAqLworI2RlZmluZQlTTVRfT0lEX0VSUk9SX0NUCTYJLyogZmRkaU1BQ0Vycm9yX0N0ICovCisjZGVmaW5lCVNNVF9PSURfTE9TVF9DVAkJNwkvKiBmZGRpTUFDTG9zdF9DdCAqLworI2RlZmluZQlTTVRfT0lEX0xFTV9DVAkJOAkvKiBmZGRpUE9SVExlbV9DdCAqLworI2RlZmluZQlTTVRfT0lEX0xFTV9DVF9BCTExCS8qIGZkZGlQT1JUTGVtX0N0IHBvcnQgQSAqLworI2RlZmluZQlTTVRfT0lEX0xFTV9DVF9CCTEyCS8qIGZkZGlQT1JUTGVtX0N0IHBvcnQgQiAqLworI2RlZmluZQlTTVRfT0lEX0xDVF9GQUlMX0NUCTkJLyogZmRkaVBPUlRMQ1RGYWlsX0N0ICovCisjZGVmaW5lCVNNVF9PSURfTENUX0ZBSUxfQ1RfQQkxMwkvKiBmZGRpUE9SVExDVEZhaWxfQ3QgcG9ydCBBICovCisjZGVmaW5lCVNNVF9PSURfTENUX0ZBSUxfQ1RfQgkxNAkvKiBmZGRpUE9SVExDVEZhaWxfQ3QgcG9ydCBCICovCisjZGVmaW5lCVNNVF9PSURfTEVNX1JFSkVDVF9DVAkxMAkvKiBmZGRpUE9SVExlbV9SZWplY3RfQ3QgKi8KKyNkZWZpbmUJU01UX09JRF9MRU1fUkVKRUNUX0NUX0EJMTUJLyogZmRkaVBPUlRMZW1fUmVqZWN0X0N0IHBvcnQgQSAqLworI2RlZmluZQlTTVRfT0lEX0xFTV9SRUpFQ1RfQ1RfQgkxNgkvKiBmZGRpUE9SVExlbV9SZWplY3RfQ3QgcG9ydCBCICovCisKKy8qCisgKiBTSyBNSUIKKyAqLworI2RlZmluZSBTTVRfT0lEX0VDRl9SRVFfUlgJMjAJLyogRUNGIHJlcXVlc3RzIHJlY2VpdmVkICovCisjZGVmaW5lIFNNVF9PSURfRUNGX1JFUExZX1JYCTIxCS8qIEVDRiByZXBsaWVzIHJlY2VpdmVkICovCisjZGVmaW5lIFNNVF9PSURfRUNGX1JFUV9UWAkyMgkvKiBFQ0YgcmVxdWVzdHMgdHJhbnNtaXR0ZWQgKi8KKyNkZWZpbmUgU01UX09JRF9FQ0ZfUkVQTFlfVFgJMjMJLyogRUNGIHJlcGxpZXMgdHJhbnNtaXR0ZWQgKi8KKyNkZWZpbmUgU01UX09JRF9QTUZfR0VUX1JYCTI0CS8qIFBNRiBnZXQgcmVxdWVzdHMgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgU01UX09JRF9QTUZfU0VUX1JYCTI1CS8qIFBNRiBzZXQgcmVxdWVzdHMgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgU01UX09JRF9SREZfUlgJCTI2CS8qIFJERiByZWNlaXZlZCAqLworI2RlZmluZSBTTVRfT0lEX1JERl9UWAkJMjcJLyogUkRGIHRyYW5zbWl0dGVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvZnBsdXN0bS5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL2ZwbHVzdG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGJiZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9oL2ZwbHVzdG0uaApAQCAtMCwwICsxLDI3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCUFNRCBGcGx1cyBpbiB0YWcgbW9kZSBkYXRhIHN0cnVjdHMKKyAqCWRlZnMgZm9yIGZwbHVzdG0uYworICovCisKKyNpZm5kZWYJX0ZQTFVTXworI2RlZmluZSBfRlBMVVNfCisKKyNpZm5kZWYJSFdfUFRSCisjZGVmaW5lCUhXX1BUUgl2b2lkIF9faW9tZW0gKgorI2VuZGlmCisKKy8qCisgKiBmcGx1cyBlcnJvciBzdGF0aXN0aWMgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBlcnJfc3QgeworCXVfbG9uZyBlcnJfdmFsaWQgOwkJLyogbWVtb3J5IHN0YXR1cyB2YWxpZCAqLworCXVfbG9uZyBlcnJfYWJvcnQgOwkJLyogbWVtb3J5IHN0YXR1cyByZWNlaXZlIGFib3J0ICovCisJdV9sb25nIGVycl9lX2luZGljYXRvciA7CS8qIGVycm9yIGluZGljYXRvciAqLworCXVfbG9uZyBlcnJfY3JjIDsJCS8qIGVycm9yIGRldGVjdGVkIChDUkMgb3IgbGVuZ3RoKSAqLworCXVfbG9uZyBlcnJfbGxjX2ZyYW1lIDsJCS8qIExMQyBmcmFtZSAqLworCXVfbG9uZyBlcnJfbWFjX2ZyYW1lIDsJCS8qIE1BQyBmcmFtZSAqLworCXVfbG9uZyBlcnJfc210X2ZyYW1lIDsJCS8qIFNNVCBmcmFtZSAqLworCXVfbG9uZyBlcnJfaW1wX2ZyYW1lIDsJCS8qIGltcGxlbWVudGVyIGZyYW1lICovCisJdV9sb25nIGVycl9ub19idWYgOwkJLyogbm8gYnVmZmVyIGF2YWlsYWJsZSAqLworCXVfbG9uZyBlcnJfdG9vX2xvbmcgOwkJLyogbG9uZ2VyIHRoYW4gbWF4LiBidWZmZXIgKi8KKwl1X2xvbmcgZXJyX2JlY19zdGF0IDsJCS8qIGJlYWNvbiBzdGF0ZSBlbnRlcmVkICovCisJdV9sb25nIGVycl9jbG1fc3RhdCA7CQkvKiBjbGFpbSBzdGF0ZSBlbnRlcmVkICovCisJdV9sb25nIGVycl9zaWZnX2RldCA7CQkvKiBzaG9ydCBpbnRlcmZyYW1lIGdhcCBkZXRlY3QgKi8KKwl1X2xvbmcgZXJyX3BoaW52IDsJCS8qIFBIWSBpbnZhbGlkICovCisJdV9sb25nIGVycl90a2lzcyA7CQkvKiB0b2tlbiBpc3N1ZWQgKi8KKwl1X2xvbmcgZXJyX3RrZXJyIDsJCS8qIHRva2VuIGVycm9yICovCit9IDsKKworLyoKKyAqCVRyYW5zbWl0IERlc2NyaXB0b3Igc3RydWN0CisgKi8KK3N0cnVjdCBzX3NtdF9mcF90eGQgeworCXVfaW50IHR4ZF90YmN0cmwgOwkJLyogdHJhbnNtaXQgYnVmZmVyIGNvbnRyb2wgKi8KKwl1X2ludCB0eGRfdHhkc2NyIDsJCS8qIHRyYW5zbWl0IGZyYW1lIHN0YXR1cyB3b3JkICovCisJdV9pbnQgdHhkX3RiYWRyIDsJCS8qIHBoeXNpY2FsIHR4IGJ1ZmZlciBhZGRyZXNzICovCisJdV9pbnQgdHhkX250ZGFkciA7CQkvKiBwaHlzaWNhbCBwb2ludGVyIHRvIHRoZSBuZXh0IFR4RCAqLworI2lmZGVmCUVOQV82NEJJVF9TVVAKKwl1X2ludCB0eGRfdGJhZHJfaGkgOwkJLyogcGh5c2ljYWwgdHggYnVmZmVyIGFkZHIgKGhpZ2ggZHdvcmQpKi8KKyNlbmRpZgorCWNoYXIgZmFyICp0eGRfdmlydCA7CQkvKiB2aXJ0dWFsIHBvaW50ZXIgdG8gdGhlIGRhdGEgZnJhZyAqLworCQkJCQkvKiB2aXJ0IHBvaW50ZXIgdG8gdGhlIG5leHQgVHhEICovCisJc3RydWN0IHNfc210X2ZwX3R4ZCB2b2xhdGlsZSBmYXIgKnR4ZF9uZXh0IDsKKwlzdHJ1Y3Qgc190eGRfb3MgdHhkX29zIDsJLyogT1MgLSBzcGVjaWZpYyBzdHJ1Y3QgKi8KK30gOworCisvKgorICoJUmVjZWl2ZSBEZXNjcmlwdG9yIHN0cnVjdAorICovCitzdHJ1Y3Qgc19zbXRfZnBfcnhkIHsKKwl1X2ludCByeGRfcmJjdHJsIDsJCS8qIHJlY2VpdmUgYnVmZmVyIGNvbnRyb2wgKi8KKwl1X2ludCByeGRfcmZzdyA7CQkvKiByZWNlaXZlIGZyYW1lIHN0YXR1cyB3b3JkICovCisJdV9pbnQgcnhkX3JiYWRyIDsJCS8qIHBoeXNpY2FsIHJ4IGJ1ZmZlciBhZGRyZXNzICovCisJdV9pbnQgcnhkX25yZGFkciA7CQkvKiBwaHlzaWNhbCBwb2ludGVyIHRvIHRoZSBuZXh0IFJ4RCAqLworI2lmZGVmCUVOQV82NEJJVF9TVVAKKwl1X2ludCByeGRfcmJhZHJfaGkgOwkJLyogcGh5c2ljYWwgdHggYnVmZmVyIGFkZHIgKGhpZ2ggZHdvcmQpKi8KKyNlbmRpZgorCWNoYXIgZmFyICpyeGRfdmlydCA7CQkvKiB2aXJ0dWFsIHBvaW50ZXIgdG8gdGhlIGRhdGEgZnJhZyAqLworCQkJCQkvKiB2aXJ0IHBvaW50ZXIgdG8gdGhlIG5leHQgUnhEICovCisJc3RydWN0IHNfc210X2ZwX3J4ZCB2b2xhdGlsZSBmYXIgKnJ4ZF9uZXh0IDsKKwlzdHJ1Y3Qgc19yeGRfb3MgcnhkX29zIDsJLyogT1MgLSBzcGVjaWZpYyBzdHJ1Y3QgKi8KK30gOworCisvKgorICoJRGVzY3JpcHRvciBVbmlvbiBEZWZpbml0aW9uCisgKi8KK3VuaW9uIHNfZnBfZGVzY3IgeworCXN0cnVjdAlzX3NtdF9mcF90eGQgdCA7CQkvKiBwb2ludGVyIHRvIHRoZSBUeEQgKi8KKwlzdHJ1Y3QJc19zbXRfZnBfcnhkIHIgOwkJLyogcG9pbnRlciB0byB0aGUgUnhEICovCit9IDsKKworLyoKKyAqCVR4RCBSaW5nIENvbnRyb2wgc3RydWN0CisgKi8KK3N0cnVjdCBzX3NtdF90eF9xdWV1ZSB7CisJc3RydWN0IHNfc210X2ZwX3R4ZCB2b2xhdGlsZSAqdHhfY3Vycl9wdXQgOyAvKiBuZXh0IGZyZWUgVHhEICovCisJc3RydWN0IHNfc210X2ZwX3R4ZCB2b2xhdGlsZSAqdHhfcHJldl9wdXQgOyAvKiBzaGFkb3cgcHV0IHBvaW50ZXIgKi8KKwlzdHJ1Y3Qgc19zbXRfZnBfdHhkIHZvbGF0aWxlICp0eF9jdXJyX2dldCA7IC8qIG5leHQgVHhEIHRvIHJlbGVhc2UqLworCXVfc2hvcnQgdHhfZnJlZSA7CQkJLyogY291bnQgb2YgZnJlZSBUeEQncyAqLworCXVfc2hvcnQgdHhfdXNlZCA7CQkJLyogY291bnQgb2YgdXNlZCBUeEQncyAqLworCUhXX1BUUiB0eF9ibXVfY3RsIDsJCQkvKiBCTVUgYWRkciBmb3IgdHggc3RhcnQgKi8KKwlIV19QVFIgdHhfYm11X2RzYyA7CQkJLyogQk1VIGFkZHIgZm9yIGN1cnIgZHNjLiAqLworfSA7CisKKy8qCisgKglSeEQgUmluZyBDb250cm9sIHN0cnVjdAorICovCitzdHJ1Y3Qgc19zbXRfcnhfcXVldWUgeworCXN0cnVjdCBzX3NtdF9mcF9yeGQgdm9sYXRpbGUgKnJ4X2N1cnJfcHV0IDsgLyogbmV4dCBSeEQgdG8gcXVldWUgaW50byAqLworCXN0cnVjdCBzX3NtdF9mcF9yeGQgdm9sYXRpbGUgKnJ4X3ByZXZfcHV0IDsgLyogc2hhZG93IHB1dCBwb2ludGVyICovCisJc3RydWN0IHNfc210X2ZwX3J4ZCB2b2xhdGlsZSAqcnhfY3Vycl9nZXQgOyAvKiBuZXh0IFJ4RCB0byBmaWxsICovCisJdV9zaG9ydCByeF9mcmVlIDsJCQkvKiBjb3VudCBvZiBmcmVlIFJ4RCdzICovCisJdV9zaG9ydCByeF91c2VkIDsJCQkvKiBjb3VudCBvZiB1c2VkIFJ4RCdzICovCisJSFdfUFRSIHJ4X2JtdV9jdGwgOwkJCS8qIEJNVSBhZGRyIGZvciByeCBzdGFydCAqLworCUhXX1BUUiByeF9ibXVfZHNjIDsJCQkvKiBCTVUgYWRkciBmb3IgY3VyciBkc2MuICovCit9IDsKKworI2RlZmluZSBWT0lEX0ZSQU1FX09GRgkJMHgwMAorI2RlZmluZSBDTEFJTV9GUkFNRV9PRkYJCTB4MDgKKyNkZWZpbmUgQkVBQ09OX0ZSQU1FX09GRgkweDEwCisjZGVmaW5lIERCRUFDT05fRlJBTUVfT0ZGCTB4MTgKKyNkZWZpbmUgUlhfRklGT19PRkYJCTB4MjEJCS8qIHRvIGdldCBhIHByaW1lIG51bWJlciBmb3IgKi8KKwkJCQkJCS8qIHRoZSBSWF9GSUZPX1NQQUNFICovCisKKyNkZWZpbmUgUkJDX01FTV9TSVpFCQkweDgwMDAKKyNkZWZpbmUgU0VORF9BU1lOQ19BU19TWU5DCTB4MQorI2RlZmluZQlTWU5DX1RSQUZGSUNfT04JCTB4MgorCisvKiBiaWcgRklGTyBtZW1vcnkgKi8KKyNkZWZpbmUJUlhfRklGT19TUEFDRQkJMHg0MDAwIC0gUlhfRklGT19PRkYKKyNkZWZpbmUJVFhfRklGT19TUEFDRQkJMHg0MDAwCisKKyNkZWZpbmUJVFhfU01BTExfRklGTwkJMHgwOTAwCisjZGVmaW5lCVRYX01FRElVTV9GSUZPCQlUWF9GSUZPX1NQQUNFIC8gMgkKKyNkZWZpbmUJVFhfTEFSR0VfRklGTwkJVFhfRklGT19TUEFDRSAtIFRYX1NNQUxMX0ZJRk8JCisKKyNkZWZpbmUJUlhfU01BTExfRklGTwkJMHgwOTAwCisjZGVmaW5lCVJYX0xBUkdFX0ZJRk8JCVJYX0ZJRk9fU1BBQ0UgLSBSWF9TTUFMTF9GSUZPCQorCitzdHJ1Y3Qgc19zbXRfZmlmb19jb25mIHsKKwl1X3Nob3J0CXJiY19yYW1fc3RhcnQgOwkJLyogRklGTyBzdGFydCBhZGRyZXNzICovCisJdV9zaG9ydAlyYmNfcmFtX2VuZCA7CQkvKiBGSUZPIHNpemUgKi8KKwl1X3Nob3J0CXJ4MV9maWZvX3N0YXJ0IDsJLyogcnggcXVldWUgc3RhcnQgYWRkcmVzcyAqLworCXVfc2hvcnQJcngxX2ZpZm9fc2l6ZSA7CQkvKiByeCBxdWV1ZSBzaXplICovCisJdV9zaG9ydAlyeDJfZmlmb19zdGFydCA7CS8qIHJ4IHF1ZXVlIHN0YXJ0IGFkZHJlc3MgKi8KKwl1X3Nob3J0CXJ4Ml9maWZvX3NpemUgOwkJLyogcnggcXVldWUgc2l6ZSAqLworCXVfc2hvcnQJdHhfc19zdGFydCA7CQkvKiBzeW5jIHF1ZXVlIHN0YXJ0IGFkZHJlc3MgKi8KKwl1X3Nob3J0CXR4X3Nfc2l6ZSA7CQkvKiBzeW5jIHF1ZXVlIHNpemUgKi8KKwl1X3Nob3J0CXR4X2EwX3N0YXJ0IDsJCS8qIGFzeW5jIHF1ZXVlIEEwIHN0YXJ0IGFkZHJlc3MgKi8KKwl1X3Nob3J0CXR4X2EwX3NpemUgOwkJLyogYXN5bmMgcXVldWUgQTAgc2l6ZSAqLworCXVfc2hvcnQJZmlmb19jb25maWdfbW9kZSA7CS8qIEZJRk8gY29uZmlndXJhdGlvbiBtb2RlICovCit9IDsKKworI2RlZmluZSBGTV9BRERSWAkoRk1fQURERVR8Rk1fRVhHUEEwfEZNX0VYR1BBMSkKKworc3RydWN0IHNfc210X2ZwIHsKKwl1X3Nob3J0CW1kcjJpbml0IDsJCS8qIG1vZGUgcmVnaXN0ZXIgMiBpbml0IHZhbHVlICovCisJdV9zaG9ydAltZHIzaW5pdCA7CQkvKiBtb2RlIHJlZ2lzdGVyIDMgaW5pdCB2YWx1ZSAqLworCXVfc2hvcnQgZnJzZWxyZWdfaW5pdCA7CQkvKiBmcmFtZSBzZWxlY3Rpb24gcmVnaXN0ZXIgaW5pdCB2YWwgKi8KKwl1X3Nob3J0CXJ4X21vZGUgOwkJLyogYWRkcmVzcyBtb2RlIGJyb2FkL211bHRpL3Byb21pc2MgKi8KKwl1X3Nob3J0CW5zYV9tb2RlIDsKKwl1X3Nob3J0IHJ4X3Byb20gOworCXVfc2hvcnQJZXhncGEgOworCisJc3RydWN0IGVycl9zdCBlcnJfc3RhdHMgOwkvKiBlcnJvciBzdGF0aXN0aWNzICovCisKKwkvKgorCSAqIE1BQyBidWZmZXJzCisJICovCisJc3RydWN0IGZkZGlfbWFjX3NmIHsJCS8qIHNwZWNpYWwgZnJhbWUgYnVpbGQgYnVmZmVyICovCisJCXVfY2hhcgkJCW1hY19mYyA7CisJCXN0cnVjdCBmZGRpX2FkZHIJbWFjX2Rlc3QgOworCQlzdHJ1Y3QgZmRkaV9hZGRyCW1hY19zb3VyY2UgOworCQl1X2NoYXIJCQltYWNfaW5mb1sweDIwXSA7CisJfSBtYWNfc2ZiIDsKKworCisJLyoKKwkgKiBxdWV1ZXMKKwkgKi8KKyNkZWZpbmUgUVVFVUVfUwkJCTAKKyNkZWZpbmUgUVVFVUVfQTAJCTEKKyNkZWZpbmUgUVVFVUVfUjEJCTAKKyNkZWZpbmUgUVVFVUVfUjIJCTEKKyNkZWZpbmUgVVNFRF9RVUVVRVMJCTIKKworCS8qCisJICogcXVldWUgcG9pbnRlcnM7IHBvaW50cyB0byB0aGUgcXVldWUgZGVwZW5kZW50IHZhcmlhYmxlcworCSAqLworCXN0cnVjdCBzX3NtdF90eF9xdWV1ZSAqdHhbVVNFRF9RVUVVRVNdIDsKKwlzdHJ1Y3Qgc19zbXRfcnhfcXVldWUgKnJ4W1VTRURfUVVFVUVTXSA7CisKKwkvKgorCSAqIHF1ZXVlIGRlcGVuZGVudCB2YXJpYWJsZXMKKwkgKi8KKwlzdHJ1Y3Qgc19zbXRfdHhfcXVldWUgdHhfcVtVU0VEX1FVRVVFU10gOworCXN0cnVjdCBzX3NtdF9yeF9xdWV1ZSByeF9xW1VTRURfUVVFVUVTXSA7CisKKwkvKgorCSAqIEZJRk8gY29uZmlndXJhdGlvbiBzdHJ1Y3QKKwkgKi8KKwlzdHJ1Y3QJc19zbXRfZmlmb19jb25mCWZpZm8gOworCisJLyogbGFzdCBmb3JtYWMgc3RhdHVzICovCisJdV9zaG9ydAkgczJ1IDsKKwl1X3Nob3J0CSBzMmwgOworCisJLyogY2FsY3VsYXRlZCBGT1JNQUMrIHJlZy5hZGRyLiAqLworCUhXX1BUUglmbV9zdDF1IDsKKwlIV19QVFIJZm1fc3QxbCA7CisJSFdfUFRSCWZtX3N0MnUgOworCUhXX1BUUglmbV9zdDJsIDsKKwlIV19QVFIJZm1fc3QzdSA7CisJSFdfUFRSCWZtX3N0M2wgOworCisKKwkvKgorCSAqIG11bHRpY2FzdCB0YWJsZQorCSAqLworI2RlZmluZSBGUE1BWF9NVUxUSUNBU1QgMzIgCisjZGVmaW5lCVNNVF9NQVhfTVVMVEkJNAorCXN0cnVjdCB7CisJCXN0cnVjdCBzX2ZwbWMgeworCQkJc3RydWN0IGZkZGlfYWRkcglhIDsJLyogbWMgYWRkcmVzcyAqLworCQkJdV9jaGFyCQkJbiA7CS8qIHVzYWdlIGNvdW50ZXIgKi8KKwkJCXVfY2hhcgkJCXBlcm0gOwkvKiBmbGFnOiBwZXJtYW5lbnQgKi8KKwkJfSB0YWJsZVtGUE1BWF9NVUxUSUNBU1RdIDsKKwl9IG1jIDsKKwlzdHJ1Y3QgZmRkaV9hZGRyCWdyb3VwX2FkZHIgOworCXVfbG9uZwlmdW5jX2FkZHIgOwkJLyogZnVuY3Rpb25hbCBhZGRyZXNzICovCisJaW50CXNtdF9zbG90c191c2VkIDsJLyogY291bnQgb2YgdGFibGUgZW50cmllcyBmb3IgdGhlIFNNVCAqLworCWludAlvc19zbG90c191c2VkIDsJCS8qIGNvdW50IG9mIHRhYmxlIGVudHJpZXMgKi8gCisJCQkJCS8qIHVzZWQgYnkgdGhlIG9zLXNwZWNpZmljIG1vZHVsZSAqLworfSA7CisKKy8qCisgKiBtb2RlcyBmb3IgbWFjX3NldF9yeF9tb2RlKCkKKyAqLworI2RlZmluZSBSWF9FTkFCTEVfQUxMTVVMVEkJMQkvKiBlbmFibGUgYWxsIG11bHRpY2FzdHMgKi8KKyNkZWZpbmUgUlhfRElTQUJMRV9BTExNVUxUSQkyCS8qIGRpc2FibGUgImVuYWJsZSBhbGwgbXVsdGljYXN0cyIgKi8KKyNkZWZpbmUgUlhfRU5BQkxFX1BST01JU0MJMwkvKiBlbmFibGUgcHJvbWlzY291cyAqLworI2RlZmluZSBSWF9ESVNBQkxFX1BST01JU0MJNAkvKiBkaXNhYmxlIHByb21pc2NvdXMgKi8KKyNkZWZpbmUgUlhfRU5BQkxFX05TQQkJNQkvKiBlbmFibGUgcmVjZXB0aW9uIG9mIE5TQSBmcmFtZXMgKi8KKyNkZWZpbmUgUlhfRElTQUJMRV9OU0EJCTYJLyogZGlzYWJsZSByZWNlcHRpb24gb2YgTlNBIGZyYW1lcyAqLworCisKKy8qCisgKiBzdXBwb3J0IGZvciBieXRlIHJldmVyc2FsIGluIEFJWAorICogKGRlc2NyaXB0b3JzIGFuZCBwb2ludGVycyBtdXN0IGJlIGJ5dGUgcmV2ZXJzZWQgaW4gbWVtb3J5CisgKiAgQ1BVIGlzIGJpZyBlbmRpYW47IE0tQ2hhbm5lbCBpcyBsaXR0bGUgZW5kaWFuKQorICovCisjaWZkZWYJQUlYCisjZGVmaW5lIE1EUl9SRVYKKyNkZWZpbmUJQUlYX1JFVkVSU0UoeCkJCSgoKCh4KTw8MjRMKSYweGZmMDAwMDAwTCkJKwlcCisJCQkJICgoKHgpPDwgOEwpJjB4MDBmZjAwMDBMKQkrCVwKKwkJCQkgKCgoeCk+PiA4TCkmMHgwMDAwZmYwMEwpCSsJXAorCQkJCSAoKCh4KT4+MjRMKSYweDAwMDAwMGZmTCkpCisjZWxzZQorI2lmbmRlZiBBSVhfUkVWRVJTRQorI2RlZmluZQlBSVhfUkVWRVJTRSh4KQkoeCkKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZglNRFJfUkVWCQorI2RlZmluZQlNRFJfUkVWRVJTRSh4KQkJKCgoKHgpPDwyNEwpJjB4ZmYwMDAwMDBMKQkrCVwKKwkJCQkgKCgoeCk8PCA4TCkmMHgwMGZmMDAwMEwpCSsJXAorCQkJCSAoKCh4KT4+IDhMKSYweDAwMDBmZjAwTCkJKwlcCisJCQkJICgoKHgpPj4yNEwpJjB4MDAwMDAwZmZMKSkKKyNlbHNlCisjaWZuZGVmIE1EUl9SRVZFUlNFCisjZGVmaW5lCU1EUl9SRVZFUlNFKHgpCSh4KQorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvaHdtdG0uaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC9od210bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMzYwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvaHdtdG0uaApAQCAtMCwwICsxLDQyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglfSFdNXworI2RlZmluZQlfSFdNXworCisjaW5jbHVkZSAiaC9tYnVmLmgiCisKKy8qCisgKiBNQUNSTyBmb3IgRE1BIHN5bmNocm9uaXphdGlvbjoKKyAqCVRoZSBkZXNjcmlwdG9yICdkZXNjJyBpcyBmbHVzaGVkIGZvciB0aGUgZGV2aWNlICdmbGFnJy4KKyAqCURldmljZXMgYXJlIHRoZSBDUFUgKERESV9ETUFfU1lOQ19GT1JDUFUpIGFuZCB0aGUKKyAqCWFkYXB0ZXIgKERESV9ETUFfU1lOQ19GT1JERVYpLgorICoKKyAqCSdkZXNjJwlQb2ludGVyIHRvIGEgUnggb3IgVHggZGVzY3JpcHRvci4KKyAqCSdmbGFnJwlGbGFnIGZvciBkaXJlY3Rpb24gKHZpZXcgZm9yIENQVSBvciBERVZJQ0UpIHRoYXQKKyAqCQlzaG91bGQgYmUgc3luY2hyb25pemVkLgorICoKKyAqCUVtcHR5IG1hY3JvcyBhbmQgZGVmaW5lcyBhcmUgc3BlY2lmaWVkIGhlcmUuIFRoZSByZWFsIG1hY3JvCisgKglpcyBvcy1zcGVjaWZpYyBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gb3NkZWYxc3QuaC4KKyAqLworI2lmbmRlZiBEUlZfQlVGX0ZMVVNICisjZGVmaW5lIERSVl9CVUZfRkxVU0goZGVzYyxmbGFnKQorI2RlZmluZSBERElfRE1BX1NZTkNfRk9SQ1BVCisjZGVmaW5lIERESV9ETUFfU1lOQ19GT1JERVYKKyNlbmRpZgorCisJLyoKKwkgKiBoYXJkd2FyZSBtb2R1bCBkZXBlbmRlbnQgcmVjZWl2ZSBtb2RlcworCSAqLworI2RlZmluZQlSWF9FTkFCTEVfUEFTU19TTVQJMjEKKyNkZWZpbmUJUlhfRElTQUJMRV9QQVNTX1NNVAkyMgorI2RlZmluZQlSWF9FTkFCTEVfUEFTU19OU0EJMjMKKyNkZWZpbmUJUlhfRElTQUJMRV9QQVNTX05TQQkyNAorI2RlZmluZQlSWF9FTkFCTEVfUEFTU19EQgkyNQorI2RlZmluZQlSWF9ESVNBQkxFX1BBU1NfREIJMjYKKyNkZWZpbmUJUlhfRElTQUJMRV9QQVNTX0FMTAkyNworI2RlZmluZQlSWF9ESVNBQkxFX0xMQ19QUk9NSVNDCTI4CisjZGVmaW5lCVJYX0VOQUJMRV9MTENfUFJPTUlTQwkyOQorCisKKyNpZm5kZWYJRE1BX1JECisjZGVmaW5lIERNQV9SRAkJMQkvKiBtZW1vcnkgLT4gaHcgKi8KKyNlbmRpZgorI2lmbmRlZiBETUFfV1IKKyNkZWZpbmUgRE1BX1dSCQkyCS8qIGh3IC0+IG1lbW9yeSAqLworI2VuZGlmCisjZGVmaW5lIFNNVF9CVUYJCTB4ODAKKworCS8qCisJICogYml0cyBvZiB0aGUgZnJhbWUgc3RhdHVzIGJ5dGUKKwkgKi8KKyNkZWZpbmUgRU5fSVJRX0VPRgkweDAyCS8qIGdldCBJUlEgYWZ0ZXIgZW5kIG9mIGZyYW1lIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZQlMT0NfVFgJCTB4MDQJLyogc2VuZCBmcmFtZSB0byB0aGUgbG9jYWwgU01UICovCisjZGVmaW5lIExBU1RfRlJBRwkweDA4CS8qIGxhc3QgVHhEIG9mIHRoZSBmcmFtZSAqLworI2RlZmluZQlGSVJTVF9GUkFHCTB4MTAJLyogZmlyc3QgVHhEIG9mIHRoZSBmcmFtZSAqLworI2RlZmluZQlMQU5fVFgJCTB4MjAJLyogc2VuZCBmcmFtZSB0byBuZXR3b3JrIGlmIHNldCAqLworI2RlZmluZSBSSU5HX0RPV04JMHg0MAkvKiBlcnJvcjogdW5hYmxlIHRvIHNlbmQsIHJpbmcgZG93biAqLworI2RlZmluZSBPVVRfT0ZfVFhECTB4ODAJLyogZXJyb3I6IG5vdCBlbm91Z2ggVHhEcyBhdmFpbGFibGUgKi8KKworCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAJCTAKKyNlbmRpZgorCisjaWZkZWYJTElUVExFX0VORElBTgorI2RlZmluZSBIV01fUkVWRVJTRSh4KQkoeCkKKyNlbHNlCisjZGVmaW5lCUhXTV9SRVZFUlNFKHgpCQkoKCgoeCk8PDI0TCkmMHhmZjAwMDAwMEwpCSsJXAorCQkJCSAoKCh4KTw8IDhMKSYweDAwZmYwMDAwTCkJKwlcCisJCQkJICgoKHgpPj4gOEwpJjB4MDAwMGZmMDBMKQkrCVwKKwkJCQkgKCgoeCk+PjI0TCkmMHgwMDAwMDBmZkwpKQorI2VuZGlmCisKKyNkZWZpbmUgQ19JTkRJQwkJKDFMPDwyNSkKKyNkZWZpbmUgQV9JTkRJQwkJKDFMPDwyNikKKyNkZWZpbmUJUkRfRlNfTE9DQUwJMHg4MAorCisJLyoKKwkgKiBERUJVRyBGTEFHUworCSAqLworI2RlZmluZQlERUJVR19TTVRGCTEKKyNkZWZpbmUJREVCVUdfU01UCTIKKyNkZWZpbmUJREVCVUdfRUNNCTMKKyNkZWZpbmUJREVCVUdfUk1UCTQKKyNkZWZpbmUJREVCVUdfQ0ZNCTUKKyNkZWZpbmUJREVCVUdfUENNCTYKKyNkZWZpbmUJREVCVUdfU0JBCTcKKyNkZWZpbmUJREVCVUdfRVNTCTgKKworI2RlZmluZQlEQl9IV01fUlgJMTAKKyNkZWZpbmUJREJfSFdNX1RYCTExCisjZGVmaW5lIERCX0hXTV9HRU4JMTIKKworc3RydWN0IHNfbWJ1Zl9wb29sIHsKKyNpZm5kZWYJTUJfT1VUU0lERV9TTUMKKwlTTWJ1ZgkJbWJbTUFYX01CVUZdIDsJCS8qIG1idWYgcG9vbCAqLworI2VuZGlmCisJU01idWYJCSptYl9zdGFydCA7CQkvKiBwb2ludHMgdG8gdGhlIGZpcnN0IG1iICovCisJU01idWYJCSptYl9mcmVlIDsJCS8qIGZyZWUgcXVldWUgKi8KK30gOworCitzdHJ1Y3QgaHdtX3IgeworCS8qCisJICogaGFyZHdhcmUgbW9kdWwgc3BlY2lmaWMgcmVjZWl2ZSB2YXJpYWJsZXMKKwkgKi8KKwl1X2ludAkJCWxlbiA7CQkvKiBsZW5ndGggb2YgdGhlIHdob2xlIGZyYW1lICovCisJY2hhcgkJCSptYl9wb3MgOwkvKiBTTWJ1ZiByZWNlaXZlIHBvc2l0aW9uICovCit9IDsKKworc3RydWN0IGh3X21vZHVsIHsKKwkvKgorCSAqIEFsbCBoYXJkd2FyZSBtb2R1bCBzcGVjaWZpYyB2YXJpYWJsZXMKKwkgKi8KKwlzdHJ1Y3QJc19tYnVmX3Bvb2wJbWJ1Zl9wb29sIDsKKwlzdHJ1Y3QJaHdtX3IJciA7CisKKwl1bmlvbiBzX2ZwX2Rlc2NyIHZvbGF0aWxlICpkZXNjcl9wIDsgLyogcG9pbnRzIHRvIHRoZSBkZXNyaXB0b3IgYXJlYSAqLworCisJdV9zaG9ydCBwYXNzX1NNVCA7CQkvKiBwYXNzIFNNVCBmcmFtZXMgKi8KKwl1X3Nob3J0IHBhc3NfTlNBIDsJCS8qIHBhc3MgYWxsIE5TQSBmcmFtZXMgKi8KKwl1X3Nob3J0IHBhc3NfREIgOwkJLyogcGFzcyBEaXJlY3QgQmVhY29uIEZyYW1lcyAqLworCXVfc2hvcnQgcGFzc19sbGNfcHJvbWlzYyA7CS8qIHBhc3MgYWxsIGxsYyBmcmFtZXMgKGRlZmF1bHQgT04pICovCisKKwlTTWJ1ZgkqbGxjX3J4X3BpcGUgOwkJLyogcG9pbnRzIHRvIHRoZSBmaXJzdCBxdWV1ZWQgbGxjIGZyICovCisJU01idWYJKmxsY19yeF90YWlsIDsJCS8qIHBvaW50cyB0byB0aGUgbGFzdCBxdWV1ZWQgbGxjIGZyICovCisJaW50CXF1ZXVlZF9yeF9mcmFtZXMgOwkvKiBudW1iZXIgb2YgcXVldWVkIGZyYW1lcyAqLworCisJU01idWYJKnR4ZF90eF9waXBlIDsJCS8qIHBvaW50cyB0byBmaXJzdCBtYiBpbiB0aGUgdHhkIHJpbmcgKi8KKwlTTWJ1ZgkqdHhkX3R4X3RhaWwgOwkJLyogcG9pbnRzIHRvIGxhc3QgbWIgaW4gdGhlIHR4ZCByaW5nICovCisJaW50CXF1ZXVlZF90eGRfbWIgOwkJLyogbnVtYmVyIG9mIFNNVCBNQnVmcyBpbiB0eGQgcmluZyAqLworCisJaW50CXJ4X2JyZWFrIDsJCS8qIHJldi4gd2FzIGJyZWFrZWQgYmVjYXVzZSBpbmQuIG9mZiAqLworCWludAlsZWF2ZV9pc3IgOwkJLyogbGVhdmUgZmRkaV9pc3IgaW1tZWRlYXRlbHkgaWYgc2V0ICovCisJaW50CWlzcl9mbGFnIDsJCS8qIHNldCwgd2hlbiBIV00gaXMgZW50ZXJlZCBmcm9tIGlzciAqLworCS8qCisJICogdmFyYWlibGVzIGZvciB0aGUgY3VycmVudCB0cmFuc21pdCBmcmFtZQorCSAqLworCXN0cnVjdCBzX3NtdF90eF9xdWV1ZSAqdHhfcCA7CS8qIHBvaW50ZXIgdG8gdGhlIHRyYW5zbWl0IHF1ZXVlICovCisJdV9sb25nCXR4X2Rlc2NyIDsJCS8qIHR4IGRlc2NyaXB0b3IgZm9yIEZPUk1BQysgKi8KKwlpbnQJdHhfbGVuIDsJCS8qIHR4IGZyYW1lIGxlbmd0aCAqLworCVNNYnVmCSp0eF9tYiA7CQkvKiBTTVQgdHggTUJ1ZiBwb2ludGVyICovCisJY2hhcgkqdHhfZGF0YSA7CQkvKiBkYXRhIHBvaW50ZXIgdG8gdGhlIFNNVCB0eCBNYnVmICovCisKKwlpbnQJZGV0ZWNfY291bnQgOwkJLyogY291bnRlciBmb3Igb3V0IG9mIFJ4RCBjb25kaXRpb24gKi8KKwl1X2xvbmcJcnhfbGVuX2Vycm9yIDsJCS8qIHJ4IGxlbiBGT1JNQUMgIT0gc3VtIG9mIGZyYWdtZW50cyAqLworfSA7CisKKworLyoKKyAqIERFQlVHIHN0cnVjdHMgYW5kIG1hY3JvcworICovCisKKyNpZmRlZglERUJVRworc3RydWN0IG9zX2RlYnVnIHsKKwlpbnQJaHdtX3J4IDsKKwlpbnQJaHdtX3R4IDsKKwlpbnQJaHdtX2dlbiA7Cit9IDsKKyNlbmRpZgorCisjaWZkZWYJREVCVUcKKyNpZmRlZglERUJVR19CUkQKKyNkZWZpbmUJREJfUAlzbWMtPmRlYnVnCisjZWxzZQorI2RlZmluZSBEQl9QCWRlYnVnCisjZW5kaWYKKworI2RlZmluZSBEQl9SWChhLGIsYyxsZXYpIGlmIChEQl9QLmRfb3MuaHdtX3J4ID49IChsZXYpKQlwcmludGYoYSxiLGMpCisjZGVmaW5lIERCX1RYKGEsYixjLGxldikgaWYgKERCX1AuZF9vcy5od21fdHggPj0gKGxldikpCXByaW50ZihhLGIsYykKKyNkZWZpbmUgREJfR0VOKGEsYixjLGxldikgaWYgKERCX1AuZF9vcy5od21fZ2VuID49IChsZXYpKSBwcmludGYoYSxiLGMpCisjZWxzZQkvKiBERUJVRyAqLworI2RlZmluZSBEQl9SWChhLGIsYyxsZXYpCisjZGVmaW5lIERCX1RYKGEsYixjLGxldikKKyNkZWZpbmUgREJfR0VOKGEsYixjLGxldikKKyNlbmRpZgkvKiBERUJVRyAqLworCisjaWZuZGVmCVNLX0JSRUFLCisjZGVmaW5lCVNLX0JSRUFLKCkKKyNlbmRpZgorCisKKy8qCisgKiBIV00gTWFjcm9zCisgKi8KKworLyoKKyAqCUJFR0lOX01BTlVBTF9FTlRSWShIV01fR0VUX1RYX1BIWVMpCisgKgl1X2xvbmcgSFdNX0dFVF9UWF9QSFlTKHR4ZCkKKyAqCisgKiBmdW5jdGlvbglNQUNSTwkJKGhhcmR3YXJlIG1vZHVsZSwgaHdtdG0uaCkKKyAqCQlUaGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIGJ5IHRoZSBPUy1zcGVjaWZpYyBtb2R1bGUgdG8gcmVhZAorICoJCXRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgVHhELgorICoKKyAqIHBhcmEJdHhkCXBvaW50ZXIgdG8gdGhlIFR4RAorICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLworI2RlZmluZQlIV01fR0VUX1RYX1BIWVModHhkKQkJKHVfbG9uZylBSVhfUkVWRVJTRSgodHhkKS0+dHhkX3RiYWRyKQorCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKEhXTV9HRVRfVFhfTEVOKQorICoJaW50IEhXTV9HRVRfVFhfTEVOKHR4ZCkKKyAqCisgKiBmdW5jdGlvbglNQUNSTwkJKGhhcmR3YXJlIG1vZHVsZSwgaHdtdG0uaCkKKyAqCQlUaGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIGJ5IHRoZSBPUy1zcGVjaWZpYyBtb2R1bGUgdG8gcmVhZAorICoJCXRoZSBmcmFnbWVudCBsZW5ndGggb2YgdGhlIHNwZWNpZmllZCBUeEQKKyAqCisgKiBwYXJhCXJ4ZAlwb2ludGVyIHRvIHRoZSBUeEQKKyAqCisgKiByZXR1cm4JdGhlIGxlbmd0aCBvZiB0aGUgZnJhZ21lbnQgaW4gYnl0ZXMKKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KKyNkZWZpbmUJSFdNX0dFVF9UWF9MRU4odHhkKQkoKGludClBSVhfUkVWRVJTRSgodHhkKS0+dHhkX3RiY3RybCkmIFJEX0xFTkdUSCkKKworLyoKKyAqCUJFR0lOX01BTlVBTF9FTlRSWShIV01fR0VUX1RYX1VTRUQpCisgKgl0eGQgKkhXTV9HRVRfVFhfVVNFRChzbWMscXVldWUpCisgKgorICogZnVuY3Rpb24JTUFDUk8JCShoYXJkd2FyZSBtb2R1bGUsIGh3bXRtLmgpCisgKgkJVGhpcyBtYWNybyBtYXkgYmUgaW52b2tlZCBieSB0aGUgT1Mtc3BlY2lmaWMgbW9kdWxlIHRvIGdldCB0aGUKKyAqCQludW1iZXIgb2YgdXNlZCBUeERzIGZvciB0aGUgcXVldWUsIHNwZWNpZmllZCBieSB0aGUgaW5kZXguCisgKgorICogcGFyYQlxdWV1ZQl0aGUgbnVtYmVyIG9mIHRoZSBzZW5kIHF1ZXVlOiBDYW4gYmUgc3BlY2lmaWVkIGJ5CisgKgkJUVVFVUVfQTAsIFFVRVVFX1Mgb3IgKGZyYW1lX3N0YXR1cyAmIFFVRVVFX0EwKQorICoKKyAqIHJldHVybgludW1iZXIgb2YgdXNlZCBUeERzIGZvciB0aGlzIHNlbmQgcXVldWUKKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KKyNkZWZpbmUJSFdNX0dFVF9UWF9VU0VEKHNtYyxxdWV1ZSkJKGludCkgKHNtYyktPmh3LmZwLnR4X3FbcXVldWVdLnR4X3VzZWQKKworLyoKKyAqCUJFR0lOX01BTlVBTF9FTlRSWShIV01fR0VUX0NVUlJfVFhEKQorICoJdHhkICpIV01fR0VUX0NVUlJfVFhEKHNtYyxxdWV1ZSkKKyAqCisgKiBmdW5jdGlvbglNQUNSTwkJKGhhcmR3YXJlIG1vZHVsZSwgaHdtdG0uaCkKKyAqCQlUaGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIGJ5IHRoZSBPUy1zcGVjaWZpYyBtb2R1bGUgdG8gZ2V0IHRoZQorICoJCXBvaW50ZXIgdG8gdGhlIFR4RCB3aGljaCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgcXVldWUgcHV0CisgKgkJcG9zaXRpb24uCisgKgorICogcGFyYQlxdWV1ZQl0aGUgbnVtYmVyIG9mIHRoZSBzZW5kIHF1ZXVlOiBDYW4gYmUgc3BlY2lmaWVkIGJ5CisgKgkJUVVFVUVfQTAsIFFVRVVFX1Mgb3IgKGZyYW1lX3N0YXR1cyAmIFFVRVVFX0EwKQorICoKKyAqIHJldHVybglwb2ludGVyIHRvIHRoZSBjdXJyZW50IFR4RAorICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLworI2RlZmluZQlIV01fR0VUX0NVUlJfVFhEKHNtYyxxdWV1ZSkJKHN0cnVjdCBzX3NtdF9mcF90eGQgdm9sYXRpbGUgKilcCisJCQkJCShzbWMpLT5ody5mcC50eF9xW3F1ZXVlXS50eF9jdXJyX3B1dAorCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKEhXTV9UWF9DSEVDSykKKyAqCXZvaWQgSFdNX1RYX0NIRUNLKHNtYyxmcmFtZV9zdGF0dXMsbG93X3dhdGVyKQorICoKKyAqIGZ1bmN0aW9uCU1BQ1JPCQkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5oKQorICoJCVRoaXMgbWFjcm8gaXMgaW52b2tlZCBieSB0aGUgT1Mtc3BlY2lmaWMgYmVmb3JlIGl0IGxlZnQgaXQncworICoJCWRyaXZlcl9zZW5kIGZ1bmN0aW9uLiBUaGlzIG1hY3JvIGNhbGxzIG1hY19kcnZfY2xlYXJfdHhkCisgKgkJaWYgdGhlIGZyZWUgVHhEcyBvZiB0aGUgY3VycmVudCB0cmFuc21pdCBxdWV1ZSBpcyBlcXVhbCBvcgorICoJCWxvd2VyIHRoYW4gdGhlIGdpdmVuIGxvdyB3YXRlciBtYXJrLgorICoKKyAqIHBhcmEJZnJhbWVfc3RhdHVzCXN0YXR1cyBvZiB0aGUgZnJhbWUsIHNlZSBkZXNpZ24gZGVzY3JpcHRpb24KKyAqCWxvd193YXRlcglsb3cgd2F0ZXIgbWFyayBvZiBmcmVlIFR4RCdzCisgKgorICoJRU5EX01BTlVBTF9FTlRSWQorICovCisjaWZuZGVmIEhXTV9OT19GTE9XX0NUTAorI2RlZmluZQlIV01fVFhfQ0hFQ0soc21jLGZyYW1lX3N0YXR1cyxsb3dfd2F0ZXIpIHtcCisJaWYgKChsb3dfd2F0ZXIpPj0oc21jKS0+aHcuZnAudHhfcVsoZnJhbWVfc3RhdHVzKSZRVUVVRV9BMF0udHhfZnJlZSkge1wKKwkJbWFjX2Rydl9jbGVhcl90eGQoc21jKSA7XAorCX1cCit9CisjZWxzZQorI2RlZmluZQlIV01fVFhfQ0hFQ0soc21jLGZyYW1lX3N0YXR1cyxsb3dfd2F0ZXIpCW1hY19kcnZfY2xlYXJfdHhkKHNtYykKKyNlbmRpZgorCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKEhXTV9HRVRfUlhfRlJBR19MRU4pCisgKglpbnQgSFdNX0dFVF9SWF9GUkFHX0xFTihyeGQpCisgKgorICogZnVuY3Rpb24JTUFDUk8JCShoYXJkd2FyZSBtb2R1bGUsIGh3bXRtLmgpCisgKgkJVGhpcyBtYWNybyBtYXkgYmUgaW52b2tlZCBieSB0aGUgT1Mtc3BlY2lmaWMgbW9kdWxlIHRvIHJlYWQKKyAqCQl0aGUgZnJhZ21lbnQgbGVuZ3RoIG9mIHRoZSBzcGVjaWZpZWQgUnhECisgKgorICogcGFyYQlyeGQJcG9pbnRlciB0byB0aGUgUnhECisgKgorICogcmV0dXJuCXRoZSBsZW5ndGggb2YgdGhlIGZyYWdtZW50IGluIGJ5dGVzCisgKgorICoJRU5EX01BTlVBTF9FTlRSWQorICovCisjZGVmaW5lCUhXTV9HRVRfUlhfRlJBR19MRU4ocnhkKQkoKGludClBSVhfUkVWRVJTRSgocnhkKS0+cnhkX3JiY3RybCkmIFwKKwkJCQlSRF9MRU5HVEgpCisKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkoSFdNX0dFVF9SWF9QSFlTKQorICoJdV9sb25nIEhXTV9HRVRfUlhfUEhZUyhyeGQpCisgKgorICogZnVuY3Rpb24JTUFDUk8JCShoYXJkd2FyZSBtb2R1bGUsIGh3bXRtLmgpCisgKgkJVGhpcyBtYWNybyBtYXkgYmUgaW52b2tlZCBieSB0aGUgT1Mtc3BlY2lmaWMgbW9kdWxlIHRvIHJlYWQKKyAqCQl0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIFJ4RC4KKyAqCisgKiBwYXJhCXJ4ZAlwb2ludGVyIHRvIHRoZSBSeEQKKyAqCisgKiByZXR1cm4JdGhlIFJ4RCdzIHBoeXNpY2FsIHBvaW50ZXIgdG8gdGhlIGRhdGEgZnJhZ21lbnQKKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KKyNkZWZpbmUJSFdNX0dFVF9SWF9QSFlTKHJ4ZCkJKHVfbG9uZylBSVhfUkVWRVJTRSgocnhkKS0+cnhkX3JiYWRyKQorCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKEhXTV9HRVRfUlhfVVNFRCkKKyAqCWludCBIV01fR0VUX1JYX1VTRUQoc21jKQorICoKKyAqIGZ1bmN0aW9uCU1BQ1JPCQkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5oKQorICoJCVRoaXMgbWFjcm8gbWF5IGJlIGludm9rZWQgYnkgdGhlIE9TLXNwZWNpZmljIG1vZHVsZSB0byBnZXQKKyAqCQl0aGUgY291bnQgb2YgdXNlZCBSWERzIGluIHJlY2VpdmUgcXVldWUgMS4KKyAqCisgKiByZXR1cm4JdGhlIHVzZWQgUlhEIGNvdW50IG9mIHJlY2VpdmUgcXVldWUgMQorICoKKyAqIE5PVEU6IFJlbWVtYmVyLCBiZWNhdXNlIG9mIGFuIEFTSUMgYnVnIGF0IGxlYXN0IG9uZSBSWEQgc2hvdWxkIGJlIHVudXNlZAorICoJIGluIHRoZSBkZXNjcmlwdG9yIHJpbmcgIQorICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLworI2RlZmluZQlIV01fR0VUX1JYX1VTRUQoc21jKQkoKGludCkoc21jKS0+aHcuZnAucnhfcVtRVUVVRV9SMV0ucnhfdXNlZCkKKworLyoKKyAqCUJFR0lOX01BTlVBTF9FTlRSWShIV01fR0VUX1JYX0ZSRUUpCisgKglpbnQgSFdNX0dFVF9SWF9GUkVFKHNtYykKKyAqCisgKiBmdW5jdGlvbglNQUNSTwkJKGhhcmR3YXJlIG1vZHVsZSwgaHdtdG0uaCkKKyAqCQlUaGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIGJ5IHRoZSBPUy1zcGVjaWZpYyBtb2R1bGUgdG8gZ2V0CisgKgkJdGhlIHJ4ZF9mcmVlIGNvdW50IG9mIHJlY2VpdmUgcXVldWUgMS4KKyAqCisgKiByZXR1cm4JdGhlIHJ4ZF9mcmVlIGNvdW50IG9mIHJlY2VpdmUgcXVldWUgMQorICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLworI2RlZmluZQlIV01fR0VUX1JYX0ZSRUUoc21jKQkoKGludCkoc21jKS0+aHcuZnAucnhfcVtRVUVVRV9SMV0ucnhfZnJlZS0xKQorCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKEhXTV9HRVRfQ1VSUl9SWEQpCisgKglyeGQgKkhXTV9HRVRfQ1VSUl9SWEQoc21jKQorICoKKyAqIGZ1bmN0aW9uCU1BQ1JPCQkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5oKQorICoJCVRoaXMgbWFjcm8gbWF5IGJlIGludm9rZWQgYnkgdGhlIE9TLXNwZWNpZmljIG1vZHVsZSB0byBnZXQgdGhlCisgKgkJcG9pbnRlciB0byB0aGUgUnhEIHdoaWNoIHBvaW50cyB0byB0aGUgY3VycmVudCBxdWV1ZSBwdXQKKyAqCQlwb3NpdGlvbi4KKyAqCisgKiByZXR1cm4JcG9pbnRlciB0byB0aGUgY3VycmVudCBSeEQKKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KKyNkZWZpbmUJSFdNX0dFVF9DVVJSX1JYRChzbWMpCShzdHJ1Y3Qgc19zbXRfZnBfcnhkIHZvbGF0aWxlICopXAorCQkJCShzbWMpLT5ody5mcC5yeF9xW1FVRVVFX1IxXS5yeF9jdXJyX3B1dAorCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKEhXTV9SWF9DSEVDSykKKyAqCXZvaWQgSFdNX1JYX0NIRUNLKHNtYyxsb3dfd2F0ZXIpCisgKgorICogZnVuY3Rpb24JTUFDUk8JCShoYXJkd2FyZSBtb2R1bGUsIGh3bXRtLmgpCisgKgkJVGhpcyBtYWNybyBpcyBpbnZva2VkIGJ5IHRoZSBPUy1zcGVjaWZpYyBiZWZvcmUgaXQgbGVmdCB0aGUKKyAqCQlmdW5jdGlvbiBtYWNfZHJ2X3J4X2NvbXBsZXRlLiBUaGlzIG1hY3JvIGNhbGxzIG1hY19kcnZfZmlsbF9yeGQKKyAqCQlpZiB0aGUgbnVtYmVyIG9mIHVzZWQgUnhEcyBpcyBlcXVhbCBvciBsb3dlciB0aGFuIHRoZQorICoJCXRoZSBnaXZlbiBsb3cgd2F0ZXIgbWFyay4KKyAqCisgKiBwYXJhCWxvd193YXRlcglsb3cgd2F0ZXIgbWFyayBvZiB1c2VkIFJ4RCdzCisgKgorICoJRU5EX01BTlVBTF9FTlRSWQorICovCisjaWZuZGVmIEhXTV9OT19GTE9XX0NUTAorI2RlZmluZQlIV01fUlhfQ0hFQ0soc21jLGxvd193YXRlcikge1wKKwlpZiAoKGxvd193YXRlcikgPj0gKHNtYyktPmh3LmZwLnJ4X3FbUVVFVUVfUjFdLnJ4X3VzZWQpIHtcCisJCW1hY19kcnZfZmlsbF9yeGQoc21jKSA7XAorCX1cCit9CisjZWxzZQorI2RlZmluZQlIV01fUlhfQ0hFQ0soc21jLGxvd193YXRlcikJCW1hY19kcnZfZmlsbF9yeGQoc21jKQorI2VuZGlmCisKKyNpZm5kZWYJSFdNX0VCQVNFCisjZGVmaW5lCUhXTV9FQkFTRQk1MDAKKyNlbmRpZgorCisjZGVmaW5lCUhXTV9FMDAwMQlIV01fRUJBU0UgKyAxCisjZGVmaW5lCUhXTV9FMDAwMV9NU0cJIkhXTTogV3Jvbmcgc2l6ZSBvZiBzX3J4ZF9vcyBzdHJ1Y3QiCisjZGVmaW5lCUhXTV9FMDAwMglIV01fRUJBU0UgKyAyCisjZGVmaW5lCUhXTV9FMDAwMl9NU0cJIkhXTTogV3Jvbmcgc2l6ZSBvZiBzX3R4ZF9vcyBzdHJ1Y3QiCisjZGVmaW5lCUhXTV9FMDAwMwlIV01fRUJBU0UgKyAzCisjZGVmaW5lCUhXTV9FMDAwM19NU0cJIkhXTTogc210X2ZyZWVfbWJ1ZigpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIKKyNkZWZpbmUJSFdNX0UwMDA0CUhXTV9FQkFTRSArIDQKKyNkZWZpbmUJSFdNX0UwMDA0X01TRwkiSFdNOiBQYXJpdHkgZXJyb3IgcnggcXVldWUgMSIKKyNkZWZpbmUJSFdNX0UwMDA1CUhXTV9FQkFTRSArIDUKKyNkZWZpbmUJSFdNX0UwMDA1X01TRwkiSFdNOiBFbmNvZGluZyBlcnJvciByeCBxdWV1ZSAxIgorI2RlZmluZQlIV01fRTAwMDYJSFdNX0VCQVNFICsgNgorI2RlZmluZQlIV01fRTAwMDZfTVNHCSJIV006IEVuY29kaW5nIGVycm9yIGFzeW5jIHR4IHF1ZXVlIgorI2RlZmluZQlIV01fRTAwMDcJSFdNX0VCQVNFICsgNworI2RlZmluZQlIV01fRTAwMDdfTVNHCSJIV006IEVuY29kaW5nIGVycm9yIHN5bmMgdHggcXVldWUiCisjZGVmaW5lCUhXTV9FMDAwOAlIV01fRUJBU0UgKyA4CisjZGVmaW5lCUhXTV9FMDAwOF9NU0cJIiIKKyNkZWZpbmUJSFdNX0UwMDA5CUhXTV9FQkFTRSArIDkKKyNkZWZpbmUJSFdNX0UwMDA5X01TRwkiSFdNOiBPdXQgb2YgUnhEIGNvbmRpdGlvbiBkZXRlY3RlZCIKKyNkZWZpbmUJSFdNX0UwMDEwCUhXTV9FQkFTRSArIDEwCisjZGVmaW5lCUhXTV9FMDAxMF9NU0cJIkhXTTogQSBwcm90b2NvbCBsYXllciBoYXMgdHJpZWQgdG8gc2VuZCBhIGZyYW1lIHdpdGggYW4gaW52YWxpZCBmcmFtZSBjb250cm9sIgorI2RlZmluZSBIV01fRTAwMTEJSFdNX0VCQVNFICsgMTEKKyNkZWZpbmUgSFdNX0UwMDExX01TRwkiSFdNOiBtYWNfZHJ2X2NsZWFyX3R4X3F1ZXVlIHdhcyBjYWxsZWQgYWx0aG91Z2ggdGhlIGhhcmR3YXJlIHdhc24ndCBzdG9wcGVkIgorI2RlZmluZSBIV01fRTAwMTIJSFdNX0VCQVNFICsgMTIKKyNkZWZpbmUgSFdNX0UwMDEyX01TRwkiSFdNOiBtYWNfZHJ2X2NsZWFyX3J4X3F1ZXVlIHdhcyBjYWxsZWQgYWx0aG91Z2ggdGhlIGhhcmR3YXJlIHdhc24ndCBzdG9wcGVkIgorI2RlZmluZSBIV01fRTAwMTMJSFdNX0VCQVNFICsgMTMKKyNkZWZpbmUgSFdNX0UwMDEzX01TRwkiSFdNOiBtYWNfZHJ2X3JlcGFpcl9kZXNjciB3YXMgY2FsbGVkIGFsdGhvdWdoIHRoZSBoYXJkd2FyZSB3YXNuJ3Qgc3RvcHBlZCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvbG5rc3RhdC5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL2xua3N0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzNkY2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9oL2xua3N0YXQuaApAQCAtMCwwICsxLDg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRGVmaW5pdGlvbiBvZiB0aGUgRXJyb3IgTG9nIFN0cnVjdHVyZQorICogVGhpcyBzdHJ1Y3R1cmUgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgRXJyb3IgTG9nIGJ1ZmZlcgorICogZHVyaW5nIHRoZSBORElTIEdlbmVyYWwgUmVxdWVzdCBSZWFkRXJyb3JMb2cgYnkgdGhlIE1BQyBEcml2ZXIKKyAqLworCitzdHJ1Y3QJc19lcnJvcl9sb2cgeworCisJLyoKKwkgKiBwbGFjZSBob2xkZXIgZm9yIHRva2VuIHJpbmcgYWRhcHRlciBlcnJvciBsb2cgKHplcm9zKQorCSAqLworCXVfY2hhcglyZXNlcnZlZF8wIDsJCQkvKiBieXRlIDAgaW5zaWRlIEVycm9yIExvZyAqLworCXVfY2hhcglyZXNlcnZlZF8xIDsJCQkvKiBieXRlIDEgKi8KKwl1X2NoYXIJcmVzZXJ2ZWRfMiA7CQkJLyogYnl0ZSAyICovCQorCXVfY2hhcglyZXNlcnZlZF8zIDsJCQkvKiBieXRlIDMgKi8KKwl1X2NoYXIJcmVzZXJ2ZWRfNCA7CQkJLyogYnl0ZSA0ICovCisJdV9jaGFyCXJlc2VydmVkXzUgOwkJCS8qIGJ5dGUgNSAqLworCXVfY2hhcglyZXNlcnZlZF82IDsJCQkvKiBieXRlIDYgKi8KKwl1X2NoYXIJcmVzZXJ2ZWRfNyA7CQkJLyogYnl0ZSA3ICovCisJdV9jaGFyCXJlc2VydmVkXzggOwkJCS8qIGJ5dGUgOCAqLworCXVfY2hhcglyZXNlcnZlZF85IDsJCQkvKiBieXRlIDkgKi8KKwl1X2NoYXIJcmVzZXJ2ZWRfMTAgOwkJCS8qIGJ5dGUgMTAgKi8KKwl1X2NoYXIJcmVzZXJ2ZWRfMTEgOwkJCS8qIGJ5dGUgMTEgKi8KKwl1X2NoYXIJcmVzZXJ2ZWRfMTIgOwkJCS8qIGJ5dGUgMTIgKi8KKwl1X2NoYXIJcmVzZXJ2ZWRfMTMgOwkJCS8qIGJ5dGUgMTMgKi8KKworCS8qCisJICogRkRESSBsaW5rIHN0YXRpc3RpY3MgCisJICovCisvKgorICogc210IGVycm9yIGxvdworICovCisjZGVmaW5lIFNNVF9FUkxfQUVCCSgxPDwxNSkJCQkvKiBBIGVsYXN0LiBidWZmZXIgKi8KKyNkZWZpbmUgU01UX0VSTF9CTEMJKDE8PDE0KQkJCS8qIEIgbGluayBlcnJvciBjb25kaXRpb24gKi8KKyNkZWZpbmUgU01UX0VSTF9BTEMJKDE8PDEzKQkJCS8qIEEgbGluayBlcnJvciBjb25kaXRpb24gKi8KKyNkZWZpbmUgU01UX0VSTF9OQ0MJKDE8PDEyKQkJCS8qIG5vdCBjb3BpZWQgY29uZGl0aW9uICovCisjZGVmaW5lIFNNVF9FUkxfRkVDCSgxPDwxMSkJCQkvKiBmcmFtZSBlcnJvciBjb25kaXRpb24gKi8KKworLyoKKyAqIHNtdCBldmVudCBsb3cKKyAqLworI2RlZmluZSBTTVRfRVZMX05DRQkoMTw8NSkKKworCXVfc2hvcnQJc210X2Vycm9yX2xvdyA7CQkJLyogYnl0ZSAxNC8xNSAqLworCXVfc2hvcnQJc210X2Vycm9yX2hpZ2ggOwkJLyogYnl0ZSAxNi8xNyAqLworCXVfc2hvcnQJc210X2V2ZW50X2xvdyA7CQkJLyogYnl0ZSAxOC8xOSAqLworCXVfc2hvcnQJc210X2V2ZW50X2hpZ2ggOwkJLyogYnl0ZSAyMC8yMSAqLworCXVfc2hvcnQJY29ubmVjdGlvbl9wb2xpY3lfdmlvbGF0aW9uIDsJLyogYnl0ZSAyMi8yMyAqLworCXVfc2hvcnQgcG9ydF9ldmVudCA7CQkJLyogYnl0ZSAyNC8yNSAqLworCXVfc2hvcnQgc2V0X2NvdW50X2xvdyA7CQkJLyogYnl0ZSAyNi8yNyAqLworCXVfc2hvcnQgc2V0X2NvdW50X2hpZ2ggOwkJLyogYnl0ZSAyOC8yOSAqLworCXVfc2hvcnQJYWNpX2lkX2NvZGUgOwkJCS8qIGJ5dGUgMzAvMzEgKi8KKwl1X3Nob3J0CXB1cmdlX2ZyYW1lX2NvdW50ZXIgOwkJLyogYnl0ZSAzMi8zMyAqLworCisJLyoKKwkgKiBDTVQgYW5kIFJNVCBzdGF0ZSBtYWNoaW5lcworCSAqLworCXVfc2hvcnQJZWNtX3N0YXRlIDsJCQkvKiBieXRlIDM0LzM1ICovCisJdV9zaG9ydAlwY21fYV9zdGF0ZSA7CQkJLyogYnl0ZSAzNi8zNyAqLworCXVfc2hvcnQgcGNtX2Jfc3RhdGUgOwkJCS8qIGJ5dGUgMzgvMzkgKi8KKwl1X3Nob3J0CWNmbV9zdGF0ZSA7CQkJLyogYnl0ZSA0MC80MSAqLworCXVfc2hvcnQJcm10X3N0YXRlIDsJCQkvKiBieXRlIDQyLzQzICovCisKKwl1X3Nob3J0CW5vdF91c2VkWzMwXSA7CQkJLyogYnl0ZSA0NC0xMDMgKi8KKworCXVfc2hvcnQJdWNvZGVfdmVyc2lvbl9sZXZlbCA7CQkvKiBieXRlIDEwNC8xMDUgKi8KKworCXVfc2hvcnQJbm90X3VzZWRfMSA7CQkJLyogYnl0ZSAxMDYvMTA3ICovCisJdV9zaG9ydCBub3RfdXNlZF8yIDsJCQkvKiBieXRlIDEwOC8xMDkgKi8KK30gOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9oL21idWYuaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC9tYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzOWQxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC9tYnVmLmgKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglfTUJVRl8KKyNkZWZpbmUgX01CVUZfCisKKyNpZm5kZWYgUENJCisjZGVmaW5lIE1fU0laRQk0NTUwCisjZWxzZQorI2RlZmluZSBNX1NJWkUJNDUwNAorI2VuZGlmCisKKyNpZm5kZWYgTUFYX01CVUYKKyNkZWZpbmUgTUFYX01CVUYJNAorI2VuZGlmCisKKyNpZm5kZWYgTk9fU1REX01CVUYKKyNkZWZpbmUgc21fbmV4dCAgICAgICAgIG1fbmV4dAorI2RlZmluZSBzbV9vZmYgICAgICAgICAgbV9vZmYKKyNkZWZpbmUgc21fbGVuICAgICAgICAgIG1fbGVuCisjZGVmaW5lIHNtX2RhdGEgICAgICAgICBtX2RhdGEKKyNkZWZpbmUgU01idWYgICAgICAgICAgIE1idWYKKyNkZWZpbmUgbXRvZAkJc210b2QKKyNkZWZpbmUgbXRvZG9mZgkJc210b2RvZmYKKyNlbmRpZgorCitzdHJ1Y3Qgc19tYnVmIHsKKwlzdHJ1Y3Qgc19tYnVmCSpzbV9uZXh0IDsJCS8qIGxvdyBsZXZlbCBsaW5rZWQgbGlzdCAqLworCXNob3J0CQlzbV9vZmYgOwkJCS8qIG9mZnNldCBpbiBtX2RhdGEgKi8KKwl1X2ludAkJc21fbGVuIDsJCQkvKiBsZW4gb2YgZGF0YSAqLworI2lmZGVmCVBDSQorCWludAkJc21fdXNlX2NvdW50IDsKKyNlbmRpZgorCWNoYXIJCXNtX2RhdGFbTV9TSVpFXSA7Cit9IDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19tYnVmIFNNYnVmIDsKKworLyogbWJ1ZiBoZWFkLCB0byB0eXBlZCBkYXRhICovCisjZGVmaW5lCXNtdG9kKHgsdCkJKCh0KSgoeCktPnNtX2RhdGEgKyAoeCktPnNtX29mZikpCisjZGVmaW5lCXNtdG9kb2ZmKHgsdCxvKQkoKHQpKCh4KS0+c21fZGF0YSArIChvKSkpCisKKyNlbmRpZgkvKiBfTUJVRl8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9vc2RlZjFzdC5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL29zZGVmMXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1OWViNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC9vc2RlZjFzdC5oCkBAIC0wLDAgKzEsMTIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAKKyAqIE9wZXJhdGluZyBzeXN0ZW0tZGVwZW5kZW50IGRlZmluaXRpb25zIHRoYXQgaGF2ZSB0byBiZSBkZWZpbmVkCisgKiBiZWZvcmUgYW55IG90aGVyIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuCisgKi8KKworLy8gSFdNIChIYXJkV2FyZSBNb2R1bGUpIERlZmluaXRpb25zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIExJVFRMRV9FTkRJQU4KKyNlbHNlCisjZGVmaW5lIEJJR19FTkRJQU4KKyNlbmRpZgorCisvLyB0aGlzIGlzIHNldCBpbiB0aGUgbWFrZWZpbGUKKy8vICNkZWZpbmUgUENJCQkJLyogb25seSBQQ0kgYWRhcHRlcnMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyICovCisvLyAjZGVmaW5lIE1FTV9NQVBQRURfSU8JLyogdXNlIG1lbW9yeSBtYXBwZWQgSS9PICovCisKKworI2RlZmluZSBVU0VfQ0FOX0FERFIJCS8qIERBIGFuZCBTQSBpbiBNQUMgaGVhZGVyIGFyZSBjYW5vbmljYWwuICovCisKKyNkZWZpbmUgTUJfT1VUU0lERV9TTUMJCS8qIFNNVCBNYnVmcyBvdXRzaWRlIG9mIHNtYyBzdHJ1Y3QuICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworLy8gU01UIERlZmluaXRpb25zIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgU1lOQwkgICAgICAgCQkvKiBhbGxvdyBzeW5jaHJvbm91cyBmcmFtZXMgKi8KKworLy8gI2RlZmluZSBTQkEJCQkvKiBTeW5jaHJvbm91cyBCYW5kd2lkdGggQWxsb2NhdG9yIHN1cHBvcnQgKi8KKwkJCQkvKiBub3QgYXZhaWxhYmxlIGFzIGZyZWUgc291cmNlICovCisKKyNkZWZpbmUgRVNTCQkJLyogU0JBIEVuZCBTdGF0aW9uIFN1cHBvcnQgKi8KKworI2RlZmluZQlTTVRfUEFOSUMoc21jLCBuciwgbXNnKQlwcmludGsoS0VSTl9JTkZPICJTTVQgUEFOSUM6IGNvZGU6ICVkLCBtc2c6ICVzXG4iLG5yLG1zZykKKworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgcHJpbnRmKHMsYXJncy4uLikgcHJpbnRrKEtFUk5fSU5GTyBzLCAjIyBhcmdzKQorI2VuZGlmCisKKy8vICNkZWZpbmUgSFdfUFRSCXVfbG9uZworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKy8vIEhXTSBhbmQgT1Mtc3BlY2lmaWMgYnVmZmVyIGRlZmluaXRpb25zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBkZWZhdWx0IG51bWJlciBvZiByZWNlaXZlIGJ1ZmZlcnMuCisjZGVmaW5lIE5VTV9SRUNFSVZFX0JVRkZFUlMJCTEwCisKKy8vIGRlZmF1bHQgbnVtYmVyIG9mIHRyYW5zbWl0IGJ1ZmZlcnMuCisjZGVmaW5lIE5VTV9UUkFOU01JVF9CVUZGRVJTCQkxMAorCisvLyBOdW1iZXIgb2YgU01UIGJ1ZmZlcnMgKE1idWZzKS4KKyNkZWZpbmUgTlVNX1NNVF9CVUYJNAorCisvLyBOdW1iZXIgb2YgVFhEcyBmb3IgYXN5bmNocm9ub3VzIHRyYW5zbWl0IHF1ZXVlLgorI2RlZmluZSBIV01fQVNZTkNfVFhEX0NPVU5UCShOVU1fVFJBTlNNSVRfQlVGRkVSUyArIE5VTV9TTVRfQlVGKQorCisvLyBOdW1iZXIgb2YgVFhEcyBmb3Igc3luY2hyb25vdXMgdHJhbnNtaXQgcXVldWUuCisjZGVmaW5lIEhXTV9TWU5DX1RYRF9DT1VOVAlIV01fQVNZTkNfVFhEX0NPVU5UCisKKworLy8gTnVtYmVyIG9mIFJYRHMgZm9yIHJlY2VpdmUgcXVldWUgIzEuCisvLyBOb3RlOiBXb3JrYXJvdW5kIGZvciBBU0lDIEVycmF0YSAjNzogT25lIGV4dHJhIFJYRCBpcyByZXF1aXJlZC4KKyNpZiAoTlVNX1JFQ0VJVkVfQlVGRkVSUyA+IDEwMCkKKyNkZWZpbmUgU01UX1IxX1JYRF9DT1VOVAkoMSArIDEwMCkKKyNlbHNlCisjZGVmaW5lIFNNVF9SMV9SWERfQ09VTlQJKDEgKyBOVU1fUkVDRUlWRV9CVUZGRVJTKQorI2VuZGlmCisKKy8vIE51bWJlciBvZiBSWERzIGZvciByZWNlaXZlIHF1ZXVlICMyLgorI2RlZmluZSBTTVRfUjJfUlhEX0NPVU5UCTAJLy8gTm90IHVzZWQuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworLyoKKyAqIE9TLXNwZWNpZmljIHBhcnQgb2YgdGhlIHRyYW5zbWl0L3JlY2VpdmUgZGVzY3JpcHRvciBzdHJ1Y3R1cmUgKFRYRC9SWEQpLgorICoKKyAqIE5vdGU6IFRoZSBzaXplIG9mIHRoZXNlIHN0cnVjdHVyZXMgbXVzdCBmb2xsb3cgdGhpcyBydWxlOgorICoKKyAqCXNpemVvZihzdHJ1Y3QpICsgMipzaXplb2Yodm9pZCopID09IG4gKiAxNiwgbiA+PSAxCisgKgorICogV2UgdXNlIHRoZSBkbWFfYWRkciBmaWVsZHMgdW5kZXIgTGludXggdG8ga2VlcCB0cmFjayBvZiB0aGUKKyAqIERNQSBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgZGF0YSwgZm9yIGxhdGVyIHBjaV91bm1hcF9zaW5nbGUuIC1EYXZlTQorICovCisKK3N0cnVjdCBzX3R4ZF9vcyB7CS8vIG9zLXNwZWNpZmljIHBhcnQgb2YgdHJhbnNtaXQgZGVzY3JpcHRvcgorCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKK30gOworCitzdHJ1Y3Qgc19yeGRfb3MgewkvLyBvcy1zcGVjaWZpYyBwYXJ0IG9mIHJlY2VpdmUgZGVzY3JpcHRvcgorCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKK30gOworCisKKy8qCisgKiBTbyB3ZSBkbyBub3QgbmVlZCB0byBtYWtlIHRvbyBtYW55IG1vZGlmaWNhdGlvbnMgdG8gdGhlIGdlbmVyaWMgZHJpdmVyCisgKiBwYXJ0cywgd2UgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIEFJWCBieXRlIHN3YXBwaW5nIG1hY3JvIGludGVyZmFjZS4KKyAqLworCisjZGVmaW5lIEFJWF9SRVZFUlNFKHgpCQkoKHUzMilsZTMyX3RvX2NwdSgodTMyKSh4KSkpCisjZGVmaW5lIE1EUl9SRVZFUlNFKHgpCQkoKHUzMilsZTMyX3RvX2NwdSgodTMyKSh4KSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvc2JhLmggYi9kcml2ZXJzL25ldC9za2ZwL2gvc2JhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3MTZjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC9zYmEuaApAQCAtMCwwICsxLDE0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFN5bmNocm9ub3VzIEJhbmR3aXRoIEFsbG9jYXRpb24gKFNCQSkgc3RydWN0cworICovCisgCisjaWZuZGVmIF9TQkFfCisjZGVmaW5lIF9TQkFfCisKKyNpbmNsdWRlICJoL21idWYuaCIKKyNpbmNsdWRlICJoL3NiYV9kZWYuaCIKKworI2lmZGVmCVNCQQorCisvKiBUaW1lciBDZWxsIFRlbXBsYXRlICovCitzdHJ1Y3QgdGltZXJfY2VsbCB7CisJc3RydWN0IHRpbWVyX2NlbGwJKm5leHRfcHRyIDsKKwlzdHJ1Y3QgdGltZXJfY2VsbAkqcHJldl9wdHIgOworCXVfbG9uZwkJCXN0YXJ0X3RpbWUgOworCXN0cnVjdCBzX3NiYV9ub2RlX3ZhcnMJKm5vZGVfdmFyIDsKK30gOworCisvKgorICogTm9kZSB2YXJpYWJsZXMKKyAqLworc3RydWN0IHNfc2JhX25vZGVfdmFycyB7CisJdV9jaGFyCQkJY2hhbmdlX3Jlc3BfZmxhZyA7CisJdV9jaGFyCQkJcmVwb3J0X3Jlc3BfZmxhZyA7CisJdV9jaGFyCQkJY2hhbmdlX3JlcV9mbGFnIDsKKwl1X2NoYXIJCQlyZXBvcnRfcmVxX2ZsYWcgOworCWxvbmcJCQljaGFuZ2VfYW1vdW50IDsKKwlsb25nCQkJbm9kZV9vdmVyaGVhZCA7CisJbG9uZwkJCW5vZGVfcGF5bG9hZCA7CisJdV9sb25nCQkJbm9kZV9zdGF0dXMgOworCXVfY2hhcgkJCWRlYWxsb2NhdGVfc3RhdHVzIDsKKwl1X2NoYXIJCQl0aW1lcl9zdGF0ZSA7CisJdV9zaG9ydAkJCXJlcG9ydF9jbnQgOworCWxvbmcJCQlsYXN0cmVwX3JlcV90cmFuaWQgOworCXN0cnVjdCBmZGRpX2FkZHIJbWFjX2FkZHJlc3MgOworCXN0cnVjdCBzX3NiYV9zZXNzaW9ucyAJKm5vZGVfc2Vzc2lvbnMgOworCXN0cnVjdCB0aW1lcl9jZWxsCXRpbWVyIDsKK30gOworCisvKgorICogU2Vzc2lvbiB2YXJpYWJsZXMKKyAqLworc3RydWN0IHNfc2JhX3Nlc3Npb25zIHsKKwl1X2xvbmcJCQlkZWFsbG9jYXRlX3N0YXR1cyA7CisJbG9uZwkJCXNlc3Npb25fb3ZlcmhlYWQgOworCXVfbG9uZwkJCW1pbl9zZWdtZW50X3NpemUgOworCWxvbmcJCQlzZXNzaW9uX3BheWxvYWQgOworCXVfbG9uZwkJCXNlc3Npb25fc3RhdHVzIDsKKwl1X2xvbmcJCQlzYmFfY2F0ZWdvcnkgOworCWxvbmcJCQlsYXN0Y2hnX3JlcV90cmFuaWQgOworCXVfc2hvcnQJCQlzZXNzaW9uX2lkIDsKKwl1X2NoYXIJCQljbGFzcyA7CisJdV9jaGFyCQkJZmRkaTIgOworCXVfbG9uZwkJCW1heF90X25lZyA7CisJc3RydWN0IHNfc2JhX3Nlc3Npb25zCSpuZXh0X3Nlc3Npb24gOworfSA7CisKK3N0cnVjdCBzX3NiYSB7CisKKwlzdHJ1Y3Qgc19zYmFfbm9kZV92YXJzCW5vZGVbTUFYX05PREVTXSA7CisJc3RydWN0IHNfc2JhX3Nlc3Npb25zCXNlc3Npb25bTUFYX1NFU1NJT05TXSA7CisKKwlzdHJ1Y3Qgc19zYmFfc2Vzc2lvbnMJKmZyZWVfc2Vzc2lvbiA7CS8qIHBvaW50cyB0byB0aGUgZmlyc3QgKi8KKwkJCQkJCS8qIGZyZWUgc2Vzc2lvbiAqLworCisJc3RydWN0IHRpbWVyX2NlbGwJKnRhaWxfdGltZXIgOwkvKiBwb2ludHMgdG8gdGhlIGxhc3QgdGltZXIgY2VsbCAqLworCisJLyoKKwkgKiB2YXJpYWJsZXMgZm9yIGFsbG9jYXRpb24gYWN0aW9ucworCSAqLworCWxvbmcJdG90YWxfcGF5bG9hZCA7CQkvKiBUb3RhbCBQYXlsb2FkICovCisJbG9uZwl0b3RhbF9vdmVyaGVhZCA7CS8qIFRvdGFsIE92ZXJoZWFkICovCisJbG9uZwlzYmFfYWxsb2NhdGFibGUgOwkvKiBhbGxvY2F0YWJsZSBzeW5jIGJhbmR3aWR0aCAqLworCisJLyoKKwkgKiBSQUYgbWVzc2FnZSByZWNlaXZlIHBhcmFtZXRlcnMKKwkgKi8KKwlsb25nCQltc2dfcGF0aF9pbmRleCA7CS8qIFBhdGggVHlwZSAqLworCWxvbmcJCW1zZ19zYmFfcGxfcmVxIDsJLyogUGF5bG9hZCBSZXF1ZXN0ICovCisJbG9uZwkJbXNnX3NiYV9vdl9yZXEgOwkvKiBPdmVyaGVhZCBSZXF1ZXN0ICovCisJbG9uZwkJbXNnX21pYl9wbCA7CQkvKiBDdXJyZW50IFBheWxvYWQgZm9yIHRoaXMgUGF0aCAqLworCWxvbmcJCW1zZ19taWJfb3YgOwkJLyogQ3VycmVudCBPdmVyaGVhZCBmb3IgdGhpcyBQYXRoKi8KKwlsb25nCQltc2dfY2F0ZWdvcnkgOwkJLyogQ2F0ZWdvcnkgb2YgdGhlIEFsbG9jYXRpb24gKi8KKwl1X2xvbmcJCW1zZ19tYXhfdF9uZWcgOwkJLyogbG9uZ2VzdCBUX05lZyBhY2NlcHRhYmxlICovCisJdV9sb25nCQltc2dfbWluX3NlZ19zaXogOwkvKiBtaW5pbXVtIHNlZ2VtZW50IHNpemUgKi8KKwlzdHJ1Y3Qgc210X2hlYWRlcgkqc20gOwkJLyogcG9pbnRzIHRvIHRoZSByZWMgbWVzc2FnZSAqLworCXN0cnVjdCBmZGRpX2FkZHIJKm1zZ19hbGxvY19hZGRyIDsJLyogQWxsb2NhdGlvbiBBZGRyZXNzICovCisKKwkvKgorCSAqIFNCQSB2YXJpYWJsZXMKKwkgKi8KKwl1X2xvbmcJc2JhX3RfbmVnIDsJCS8qIGhvbGRzIHRoZSBsYXN0IFRfTkVHICovCisJbG9uZwlzYmFfbWF4X2FsbG9jIDsJCS8qIHRoZSBwYXJzZWQgdmFsdWUgb2YgU0JBQXZhaWxhYmxlICovCQorCisJLyoKKwkgKiBTQkEgc3RhdGUgbWFjaGluZSB2YXJpYWJsZXMKKwkgKi8KKwlzaG9ydAlzYmFfbmV4dF9zdGF0ZSA7CS8qIHRoZSBuZXh0IHN0YXRlIG9mIHRoZSBTQkEgKi8KKwljaGFyCXNiYV9jb21tYW5kIDsJCS8qIGhvbGRzIHRoZSBleGVjdWRlZCBTQkEgY21kICovCisJdV9jaGFyCXNiYV9hdmFpbGFibGUgOwkJLyogcGFyc2VkIHZhbHVlIGFmdGVyIHBvc3NpYmxlIGNoZWNrICovCit9IDsKKworI2VuZGlmCS8qIFNCQSAqLworCisJLyoKKwkgKiB2YXJpYWJsZXMgZm9yIHRoZSBFbmQgU3RhdGlvbiBTdXBwb3J0CisJICovCitzdHJ1Y3Qgc19lc3MgeworCisJLyoKKwkgKiBmbGFncyBhbmQgY291bnRlcnMKKwkgKi8KKwl1X2NoYXIJc3luY19id19hdmFpbGFibGUgOwkvKiBpcyBzZXQgaWYgc3luYyBidyBpcyBhbGxvY2F0ZWQgKi8KKwl1X2NoYXIJbG9jYWxfc2JhX2FjdGl2ZSA7CS8qIHNldCB3aGVuIGEgbG9jYWwgc2JhIGlzIGF2YWlsYWJsZSAqLworCWNoYXIJcmFmX2FjdF90aW1lcl9wb2xsIDsJLyogYWN0aXZhdGUgdGhlIHRpbWVyIHRvIHNlbmQgYWxsYyByZXEgKi8KKwljaGFyCXRpbWVyX2NvdW50IDsJCS8qIGNvdW50cyBldmVyeSB0aW1lciBmdW5jdGlvbiBjYWxsICovCisKKwlTTWJ1Zgkqc2JhX3JlcGx5X3BlbmQgOwkvKiBsb2NhbCByZXBseSBmb3IgdGhlIHNiYSBpcyBwZW5kaW5nICovCisJCisJLyoKKwkgKiB2YXJpYWJsZXMgZm9yIHRoZSBlc3MgYmFuZHdpZHRoIGNvbnRyb2wKKwkgKi8KKwlsb25nCXN5bmNfYncgOwkJLyogaG9sZHMgdGhlIGFsbG9jYWVkIHN5bmMgYncgKi8KKwl1X2xvbmcJYWxsb2NfdHJhbnNfaWQgOwkvKiB0cmFucyBpZCBvZiB0aGUgbGFzdCBhbGxvYyByZXEgKi8KK30gOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvc2JhX2RlZi5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL3NiYV9kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDU5YTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9oL3NiYV9kZWYuaApAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBIWVMJCQkwCQkvKiBwaHlzaWNhbCBhZGRyICovCisjZGVmaW5lIFBFUk1fQUREUgkJMHg4MAkJLyogcGVybWFuZXQgYWRkcmVzcyAqLworI2RlZmluZSBTQl9TVEFUSUMJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUFYX1BBWUxPQUQJCTE1NjIKKyNkZWZpbmUgUFJJTUFSWV9SSU5HCQkweDAwMDAwMDAxCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTAkJCTB4MDAKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKiogU0JfSW5wdXQgVmFyaWFibGUgVmFsdWVzICoqKioqKioqKioqKioqKioqKioqKioqLworLyoJIG1heSBiZSBuZWVkZWQgd2hlbiBldmVyIHRoZSBTQkEgc3RhdGUgbWFjaGluZSBpcyBjYWxsZWQJKi8KKworI2RlZmluZSBVTktOT1dOX1NZTkNfU09VUkNFCTB4MDAwMQorI2RlZmluZSBSRVFfQUxMT0NBVElPTgkJMHgwMDAyCisjZGVmaW5lIFJFUE9SVF9SRVNQCQkweDAwMDMKKyNkZWZpbmUgQ0hBTkdFX1JFU1AJCTB4MDAwNAorI2RlZmluZSBUTkVHCQkJMHgwMDA1CisjZGVmaW5lIE5JRgkJCTB4MDAwNgorI2RlZmluZSBTQl9TVE9QCQkJMHgwMDA3CisjZGVmaW5lIFNCX1NUQVJUCQkweDAwMDgKKyNkZWZpbmUgUkVQT1JUX1RJTUVSCQkweDAwMDkKKyNkZWZpbmUgQ0hBTkdFX1JFUVVJUkVECQkweDAwMEEKKworI2RlZmluZSBERUZBVUxUX09WCQk1MAorCisjaWZkZWYgU0JBCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTQkEgU1RBVEVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNCQV9TVEFOREJZCQkweDAwMDAwMDAwCisjZGVmaW5lIFNCQV9BQ1RJVkUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgU0JBX1JFQ09WRVJZCQkweDAwMDAwMDAyCisjZGVmaW5lIFNCQV9SRVBPUlQJCTB4MDAwMDAwMDMKKyNkZWZpbmUgU0JBX0NIQU5HRQkJMHgwMDAwMDAwNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBPVEhFUlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZJRlRZX1BFUkNFTlQJCTUwCQkvKiBieXRlcyBwZXIgc2Vjb25kICovCisjZGVmaW5lIE1BWF9TRVNTSU9OUwkJMTUwCQorI2RlZmluZSBUV09fTUlOVVRFUwkJMTMwNzkJCS8qIDkuMTc1IG1zL3RpY2sgKi8KKyNkZWZpbmUgRklGVFlfQllURVMJCTUwCisjZGVmaW5lIFNCQV9ERU5JRUQJCTB4MDAwMDAwMEQKKyNkZWZpbmUgSV9ORUVEX09ORQkJMHgwMDAwMDAwMAorI2RlZmluZSBNQVhfTk9ERVMJCTUwCisvKiNkZWZpbmUgVF9SRVBPUlQJCTB4NTk2ODJGMDBMKi8JLyogMTIwcy84MG5zIGluIEhleCAqLworI2RlZmluZQlUV09fTUlOCQkJMTIwCQkvKiBzZWNvbmRzICovCisjZGVmaW5lIFNCQV9TVF9VTktOT1dOCQkweDAwMDAwMDAyCisjZGVmaW5lIFNCQV9TVF9BQ1RJVkUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgU19DTEVBUgkJCTB4MDAwMDAwMDBMCisjZGVmaW5lIFpFUk8JCQkweDAwMDAwMDAwCisjZGVmaW5lIEZVTEwJCQkweDAwMDAwMDAwCS8qIG9sZDogMHhGRkZGRkZGRkYgKi8KKyNkZWZpbmUgU19TRVQJCQkweDAwMDAwMDAxTAorI2RlZmluZSBMT1dfUFJJTwkJMHgwMgkJLyogPz8/Pz8/PyAqLworI2RlZmluZSBPSwkJCTB4MDEJCS8qID8/Pz8/Pz8gKi8KKyNkZWZpbmUgTk9UX09LCQkJMHgwMAkJLyogPz8/Pz8/PyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGRlYWxsb2NhdGVfc3RhdHVzW25pXVtzaV0gdmFsdWVzCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVFhfQ0hBTkdFCQkwWDAwMDAwMDAxTAorI2RlZmluZSBQRU5ESU5HCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgTk9ORQkJCTBYMDAwMDAwMDBMCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9za2ZiaS5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL3NrZmJpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzNDdkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC9za2ZiaS5oCkBAIC0wLDAgKzEsMTkxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglfU0tGQklfSF8KKyNkZWZpbmUJX1NLRkJJX0hfCisKKyNpZmRlZiBTWU5DCisjZGVmaW5lIGV4aXN0X2JvYXJkX2ZhcgkJCWV4aXN0X2JvYXJkCisjZGVmaW5lIGdldF9ib2FyZF9wYXJhX2ZhcgkJZ2V0X2JvYXJkX3BhcmEKKyNlbmRpZgorCisvKgorICogcGh5c2ljYWwgYWRkcmVzcyBvZmZzZXQgKyBJTy1Qb3J0IGJhc2UgYWRkcmVzcworICovCisjaWZuZGVmCVBDSQorI2RlZmluZQlBRERSKGEpCSgoYSkrc21jLT5ody5pb3ApCisjZGVmaW5lCUFERFJTKHNtYyxhKSAoKGEpKyhzbWMpLT5ody5pb3ApCisjZW5kaWYKKworLyoKKyAqIEZEREktRnggKHggOj0ge0koU0EpLCBFKElTQSksIE0oQ0EpLCBQKENJKX0pCisgKglhZGRyZXNzIGNhbGN1bGF0aW9uICYgZnVuY3Rpb24gZGVmaW5lcworICovCisKKyNpZmRlZglFSVNBCisKKy8qCisgKiBDb25maWd1cmF0aW9uIFBST006CSAhISBhbGwgOC1CaXQgSU8ncyAhIQorICoJCQkJCSAgICB8PC0JICBNQUMtQWRkcmVzcwkgLT58CisgKgkvLSstLSstLSstLSstLSstLy8tKy0tKy0tKy0tKy0tKy0vLy0rLS0rLS0rLS0rLS0rLS8vLSstLSstLSstLSstLSstLworICogdmFsOgkgIHxQUk9EX0lEMC4uM3wJICAgfCBmcmVlICAgICAgfCAgICB8MDB8MDB8NUF8NDB8ICAgIHxubnxtbXwwMHwwMHwKKyAqCS8tKy0tKy0tKy0tKy0tKy0vLy0rLS0rLS0rLS0rLS0rLS8vLSstLSstLSstLSstLSstLy8tKy0tKy0tKy0tKy0tKy0vCisgKiBJTy0JICBeCSAgICAgIF4JICAgXgkJICAgIF4JCSAgICAgXgorICogcG9ydAkwQzgwCSAgICAwQzgzICAwQzg4CQkgICAwQzkwCQkgICAgMEM5OAorICoJICB8CSAgICAgICBcCisgKgkgIHwJCVwKKyAqCSAgfAkJIFxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBFSVNBIEV4cGFuc2lvbiBCb2FyZCBQcm9kdWN0IElEOgkJCQkJXAorICogQklUOgkgIHw3IDYgNSA0IDMgMiAxIDB8CQkJCQkJIFwKKyAqCSAgfCBQUk9EX0lEMAkgIHwgUFJPRF9JRDEJICB8IFBST0RfSUQyCSAgfCBQUk9EX0lEMwkgIHwKKyAqCSAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqCSAgfDB8IE1BTl9DMCAgfCBNQU5fQzEJfCBNQU5fQzIgIHwgUFJPRDEgfCBQUk9EMCB8IFJFVjEgIHwgUkVWMCAgfAorICoJICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICoJICAgXj1yZXNlcnZlZAkJCSAgfCBwcm9kdWN0IG51bWIuIHwgcmV2aXNpb24gbnVtYiB8CisgKiBNQU5fQ3ggPSBjb21wcmVzc2VkIG1hbnVmYWN0ZXJlciBjb2RlICh4Oj0wLi4yKQorICoJQVNDSUkgOiAnQScuLidaJyA6IDB4NDEuLjB4NUEgLT4gY29tcHIuKGMtMHg0MCkgOiAweDAxLi4weDFBICg1Qml0cyEpCisgKi8KKworI2lmbmRlZglNVUxUX09FTQorI2lmbmRlZglPRU1fQ09OQ0VQVAorI2RlZmluZQlNQU5fQzAJCSgnUyctMHg0MCkKKyNkZWZpbmUJTUFOX0MxCQkoJ0snLTB4NDApCisjZGVmaW5lCU1BTl9DMgkJKCdEJy0weDQwKQorI2RlZmluZQlQUk9EX0lEMAkodV9jaGFyKSgoTUFOX0MwPDwyKSB8IChNQU5fQzE+PjMpKQorI2RlZmluZQlQUk9EX0lEMQkodV9jaGFyKSgoKE1BTl9DMTw8NSkgJiAweGZmKSB8IE1BTl9DMikKKyNkZWZpbmUJUFJPRF9JRDIJKHVfY2hhcikoMSkJLyogcHJvZC4gbnIuICovCisjZGVmaW5lCVBST0RfSUQzCSh1X2NoYXIpKDApCS8qIHJldi4gbnIuICovCisKKyNpZm5kZWYJT0VNX1VTRVJfREFUQQorI2RlZmluZQlPRU1fVVNFUl9EQVRBCSJTSy1ORVQgRkRESSBWMi4wIFVzZXJkYXRhIgorI2VuZGlmCisjZWxzZQkvKiAgT0VNX0NPTkNFUFQgKi8KKworLyogTUFOX0MoMHwxfDIpIG5vIGxvbmdlciBwcmVzZW50IChyYSkuICovCisjZGVmaW5lCVBST0RfSUQwCSh1X2NoYXIpT0VNX1BST0RfSUQwCisjZGVmaW5lCVBST0RfSUQxCSh1X2NoYXIpT0VNX1BST0RfSUQxCisjZGVmaW5lCVBST0RfSUQyCSh1X2NoYXIpT0VNX1BST0RfSUQyCisjZGVmaW5lCVBST0RfSUQzCSh1X2NoYXIpT0VNX1BST0RfSUQzCisjZW5kaWYJLyogT0VNX0NPTkNFUFQgKi8KKworI2RlZmluZQlTS0xPR08JCVBST0RfSUQwLCBQUk9EX0lEMSwgUFJPRF9JRDIsIFBST0RfSUQzCisjZW5kaWYJLyogTVVMVF9PRU0gKi8KKworI2RlZmluZQlTQUREUkwJKDApCQkvKiBzdGFydCBhZGRyZXNzIFNLTE9HTyAqLworI2RlZmluZQlTQV9NQUMJKDB4MTApCQkvKiBzdGFydCBhZGRyLiBNQUNfQUQgd2l0aGluIHRoZSBQUk9NICovCisjZGVmaW5lCVBSQV9PRkYJKDQpCisjZGVmaW5lIFNBX1BNRF9UWVBFCSg4KQkvKiBzdGFydCBhZGRyLiBQTUQtVHlwZSAqLworCisjZGVmaW5lCVNLRkRESV9QU1oJMzIJCS8qIGFkZHJlc3MgUFJPTSBzaXplICovCisKKy8qCisgKiBhZGRyZXNzIHRyYW5zbWlzc2lvbiBmcm9tIGxvZ2ljYWwgdG8gcGh5c2ljYWwgb2Zmc2V0IGFkZHJlc3Mgb24gYm9hcmQKKyAqLworI2RlZmluZSBGTUEoYSkJKDB4MDQwMHwoKGEpPDwxKSkJLyogRk9STUFDKyAoci93KSAqLworI2RlZmluZSBQMUEoYSkJKDB4MDgwMHwoKGEpPDwxKSkJLyogUExDMSAoci93KSAqLworI2RlZmluZSBQMkEoYSkJKDB4MDg0MHwoKGEpPDwxKSkJLyogUExDMiAoci93KSAqLworI2RlZmluZSBUSUEoYSkJKDB4MDg4MHwoKGEpPDwxKSkJLyogVGltZXIgKHIvdykgKi8KKyNkZWZpbmUgUFJBKGEpCSgweDBjODB8IChhKSkJCS8qIGNvbmZpZ3VyYXRpb24gUFJPTSAqLworI2RlZmluZQlDMEEoYSkJKDB4MGM4NHwgKGEpKQkJLyogY29uZmlnLiBSQU0gKi8KKyNkZWZpbmUJQzFBKGEpCSgweDBjYTB8IChhKSkJCS8qIElSUS0sIERNQS1uci4sIEVQUk9NIHR5cGUgKi8KKyNkZWZpbmUJQzJBKGEpCSgweDBjYTR8IChhKSkJCS8qIEVQUk9NIGFuZCBQQUdFIHNlbGVjdG9yICovCisKKyNkZWZpbmUJQ09ORglDMEEoMCkJCQkvKiBjb25maWcgUkFNIChjYXJkIGVuYWJsZSBiaXQgcG9ydCkgKi8KKyNkZWZpbmUgUEdSQQlDMkEoMCkJCQkvKiBGbGFzaCBwYWdlIHJlZ2lzdGVyICovCisjZGVmaW5lCUNESUQJUFJBKDApCQkJLyogQ2FyZCBJRCBJL08gcG9ydCBhZGRyLiBvZmZzZXQgKi8KKworCisvKgorICogcGh5c2ljYWwgYWRkcmVzcyBvZmZzZXQgKyBzbG90IHNwZWNpZmljIElPLVBvcnQgYmFzZSBhZGRyZXNzCisgKi8KKyNkZWZpbmUgRk1fQShhKQkoRk1BKGEpK3NtYy0+aHcuaW9wKQkvKiBGT1JNQUMgUGx1cyBwaHlzaWNhbCBhZGRyICovCisjZGVmaW5lIFAxX0EoYSkJKFAxQShhKStzbWMtPmh3LmlvcCkJLyogUExDMSAoci93KSAqLworI2RlZmluZSBQMl9BKGEpCShQMkEoYSkrc21jLT5ody5pb3ApCS8qIFBMQzIgKHIvdykgKi8KKyNkZWZpbmUgVElfQShhKQkoVElBKGEpK3NtYy0+aHcuaW9wKQkvKiBUaW1lciAoci93KSAqLworI2RlZmluZSBQUl9BKGEpCShQUkEoYSkrc21jLT5ody5pb3ApCS8qIGNvbmZpZy4gUFJPTSAqLworI2RlZmluZSBDMF9BKGEpCShDMEEoYSkrc21jLT5ody5pb3ApCS8qIGNvbmZpZy4gUkFNICovCisjZGVmaW5lIEMxX0EoYSkJKEMxQShhKStzbWMtPmh3LmlvcCkJLyogY29uZmlnLiBSQU0gKi8KKyNkZWZpbmUgQzJfQShhKQkoQzJBKGEpK3NtYy0+aHcuaW9wKQkvKiBjb25maWcuIFJBTSAqLworCisKKyNkZWZpbmUJQ1NSQQkweDAwMDgJCS8qIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyIGFkZHJlc3MgKHIvdykgKi8KKyNkZWZpbmUJSVNSQQkweDAwMDgJCS8qIGludC4gc291cmNlIHJlZ2lzdGVyIGFkZHJlc3MgKHVwcGVyIDhCaXRzKSAqLworI2RlZmluZSBQTEMxSQkweDAwMWEJCS8qIGNsZWFyIFBMQzEgaW50ZXJydXB0ICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBQTEMySQkweDAwMjAJCS8qIGNsZWFyIFBMQzIgaW50ZXJydXB0ICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBDU0ZBCTB4MDAxYwkJLyogY29udHJvbC9zdGF0dXMgRklGTyBCVVNZIGZsYWdzIChyZWFkIG9ubHkpICovCisjZGVmaW5lIFJRQUEJMHgwMDFjCQkvKiBSZXF1ZXN0IHJlZy4gKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFdDVEEJMHgwMDFlCQkvKiB3b3JkIGNvdW50ZXIgKHIvdykgKi8KKyNkZWZpbmUJRkZMQUcJMHgwMDVlCQkvKiBGTEFHL1ZfRlVMTCAoRklGTyBhbG1vc3QgZnVsbCwgd3JpdGUgb25seSkqLworCisjZGVmaW5lCUNTUl9BCShDU1JBK3NtYy0+aHcuaW9wKQkvKiBjb250cm9sL3N0YXR1cyByZWdpc3RlciBhZGRyZXNzIChyL3cpICovCisjaWZkZWYgVU5JWAorI2RlZmluZQlDU1JfQVMoc21jKQkoQ1NSQSsoc21jKS0+aHcuaW9wKQkvKiBjb250cm9sL3N0YXR1cyByZWdpc3RlciBhZGRyZXNzIChyL3cpICovCisjZW5kaWYKKyNkZWZpbmUJSVNSX0EJKElTUkErc21jLT5ody5pb3ApCS8qIGludC4gc291cmNlIHJlZ2lzdGVyIGFkZHJlc3MgKHVwcGVyIDhCaXRzKSAqLworI2RlZmluZSBQTEMxX0kJKFBMQzFJK3NtYy0+aHcuaW9wKQkvKiBjbGVhciBQTEMxIGludGVybnVwdCAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUExDMl9JCShQTEMySStzbWMtPmh3LmlvcCkJLyogY2xlYXIgUExDMiBpbnRlcnJ1cHQgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIENTRl9BCShDU0ZBK3NtYy0+aHcuaW9wKQkvKiBjb250cm9sL3N0YXR1cyBGSUZPIEJVU1kgZmxhZ3MgKHIvdykgKi8KKyNkZWZpbmUgUlFBX0EJKFJRQUErc21jLT5ody5pb3ApCS8qIFJlcXVlc3QgcmVnLiAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgV0NUX0EJKFdDVEErc21jLT5ody5pb3ApCS8qIHdvcmQgY291bnRlciAoci93KSAqLworI2RlZmluZQlGRkxBR19BCShGRkxBRytzbWMtPmh3LmlvcCkJLyogRkxBRy9WX0ZVTEwgKEZJRk8gYWxtb3N0IGZ1bGwsIHdyaXRlIG9ubHkpKi8KKworLyoKKyAqIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyIENTUkEJYml0cworICovCisvKiB3cml0ZSAqLworI2RlZmluZSBDU19DUkVTRVQJMHgwMQkJLyogQ2FyZCByZXNldCAoMD1yZXNldCkgKi8KKyNkZWZpbmUJQ1NfUkVTRVRfRklGTwkweDAyCQkvKiBGSUZPIHJlc2V0ICgwPXJlc2V0KSAqLworI2RlZmluZQlDU19JTVNLCQkweDA0CQkvKiBlbmFibGUgSVJRICgxPWVuYWJsZSwgMD1kaXNhYmxlKSAqLworI2RlZmluZQlDU19FTl9JUlFfVEMJMHgwOAkJLyogZW5hYmxlIElSUSBmcm9tIHRyYW5zZmVyIGNvdW50ZXIgKi8KKyNkZWZpbmUgQ1NfQllQQVNTCTB4MjAJCS8qIGJ5cGFzcyBzd2l0Y2ggKDA9cmVtb3ZlLCAxPWluc2VydCkqLworI2RlZmluZSBDU19MRURfMAkweDQwCQkvKiBzd2l0Y2ggTEVEIDAgKi8KKyNkZWZpbmUJQ1NfTEVEXzEJMHg4MAkJLyogc3dpdGNoIExFRCAxICovCisvKiByZWFkICovCisjZGVmaW5lCUNTX0JZU1RBVAkweDQwCQkvKiAwPUJ5cGFzcyBleGlzdCwgMT0gLi5ub3QgKi8KKyNkZWZpbmUJQ1NfU0FTCQkweDgwCQkvKiBzaW5nbGUgYXR0YWNoZW1lbnQgc3RhdGlvbiAoPTEpICovCisKKy8qCisgKiBjb250cm9sL3N0YXR1cyByZWdpc3RlciBDU0ZBIGJpdHMgKEZJRk8pCisgKi8KKyNkZWZpbmUJQ1NGX01VWDAJMHgwMQorI2RlZmluZQlDU0ZfTVVYMQkweDAyCisjZGVmaW5lCUNTRl9IU1JFUTAJMHgwNAorI2RlZmluZQlDU0ZfSFNSRVExCTB4MDgKKyNkZWZpbmUJQ1NGX0hTUkVRMgkweDEwCisjZGVmaW5lCUNTRl9CVVNZX0RNQQkweDQwCisjZGVmaW5lCUNTRl9CVVNZX0ZJRk8JMHg4MAorCisvKgorICogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciBJU1JBICh1cHBlciA4IGRhdGEgYml0cykgcmVhZCBvbmx5ICYgbG93IGFjdGl2LgorICovCisjZGVmaW5lIElTX01JTlRSMQkweDAxMDAJCS8qIEZPUk1BQyBTVDFVL0wgJiB+SU1TSzFVL0wqLworI2RlZmluZSBJU19NSU5UUjIJMHgwMjAwCQkvKiBGT1JNQUMgU1QyVS9MICYgfklNU0syVS9MKi8KKyNkZWZpbmUgSVNfUExJTlQxCTB4MDQwMAkJLyogUExDMSAqLworI2RlZmluZSBJU19QTElOVDIJMHgwODAwCQkvKiBQTEMyICovCisjZGVmaW5lIElTX1RJTUlOVAkweDEwMDAJCS8qIFRpbWVyIDgyQzU0LTIgKi8KKyNkZWZpbmUJSVNfVEMJCTB4MjAwMAkJLyogdHJhbnNmLiBjb3VudGVyICovCisKKyNkZWZpbmUJQUxMX0lSU1IgKElTX01JTlRSMXxJU19NSU5UUjJ8SVNfUExJTlQxfElTX1BMSU5UMnxJU19USU1JTlR8SVNfVEMpCisKKy8qCisgKiBDT05GSUc8MD4gUkFNIChDMF9BKCkpCisgKi8KKyNkZWZpbmUJQ0ZHX0NBUkRfRU4JMHgwMQkJLyogY2FyZCBlbmFibGUgKi8KKworLyoKKyAqIENPTkZJRzwxPiBSQU0gKEMxX0EoKSkKKyAqLworI2RlZmluZQlDRkdfSVJRX1NFTAkweDAzCQkvKiBJUlEgc2VsZWN0ICg0IG5yLikgKi8KKyNkZWZpbmUJQ0ZHX0lSUV9UVAkweDA0CQkvKiBJUlEgdHJpZ2dlciB0eXBlIChMRVZFTC9FREdFKSAqLworI2RlZmluZQlDRkdfRFJRX1NFTAkweDE4CQkvKiBETUEgcmVxdS4gKDQgbnIuKSAqLworI2RlZmluZQlDRkdfQk9PVF9FTgkweDIwCQkvKiAwPUJPT1QtLCAxPUFwcGxpY2F0aW9uIFNvZnR3YXJlICovCisjZGVmaW5lCUNGR19QUk9HX0VOCTB4NDAJCS8qIFZfUHJvZyBmb3IgRkxBU0hfUFJPTSAoMT1vbikgKi8KKworLyoKKyAqIENPTkZJRzwyPiBSQU0gKEMyX0EoKSkKKyAqLworI2RlZmluZQlDRkdfRVBST01fU0VMCTB4MGYJCS8qIEZQUk9NIHN0YXJ0IGFkZHJlc3Mgc2VsZWN0aW9uICovCisjZGVmaW5lCUNGR19QQUdFCTB4ZjAJCS8qIEZQUk9NIHBhZ2Ugc2VsZWN0aW9uICovCisKKworI2RlZmluZQlSRUFEX1BST00oYSkJKCh1X2NoYXIpaW5wKGEpKQorI2RlZmluZQlHRVRfUEFHRShpKQlvdXRwKEMyX0EoMCksKChpbnQpKGkpPDw0KSB8IChpbnAoQzJfQSgwKSkgJiB+Q0ZHX1BBR0UpKQorI2RlZmluZQlGUFJPTV9TVygpCShpbnAoQzFfQSgwKSkgJiBDRkdfQk9PVF9FTikKKworI2RlZmluZQlNQVhfUEFHRVMJMTYJCS8qIDE2IHBhZ2VzICovCisjZGVmaW5lCU1BWF9GQUREUgkweDIwMDAJCS8qIDhLIHBlciBwYWdlICovCisjZGVmaW5lCVZQUF9PTigpCW91dHAoQzFfQSgwKSxpbnAoQzFfQSgwKSkgfCAgQ0ZHX1BST0dfRU4pCisjZGVmaW5lCVZQUF9PRkYoKQlvdXRwKEMxX0EoMCksaW5wKEMxX0EoMCkpICYgfkNGR19QUk9HX0VOKQorCisjZGVmaW5lCURNQV9CVVNZKCkJKGlucHcoQ1NGX0EpICYgQ1NGX0JVU1lfRE1BKQorI2RlZmluZSBGSUZPX0JVU1koKQkoaW5wdyhDU0ZfQSkgJiBDU0ZfQlVTWV9GSUZPKQorI2RlZmluZQlETUFfRklGT19CVVNZKCkJKGlucHcoQ1NGX0EpICYgKENTRl9CVVNZX0RNQSB8IENTRl9CVVNZX0ZJRk8pKQorI2RlZmluZQlCVVNfQ0hFQ0soKQorCisjaWZkZWYgVU5JU1lTCisvKiBGb3IgVU5JU1lTIHVzZSBhbm90aGVyIG1hY3JvIHdpdGggZHJ2X3VzZWNld2FpdCBmdW5jdGlvbiAqLworI2RlZmluZSBDSEVDS19ETUEoKSB7dV9sb25nIGsgPSAxMDAwMDAwOyBcCisJCXdoaWxlIChrICYmIChETUFfQlVTWSgpKSkgeyBrLS07IGRydl91c2Vjd2FpdCgyMCk7IH0gXAorCQlpZiAoIWspIFNNVF9QQU5JQyhzbWMsSFdNX0UwMDAzLEhXTV9FMDAwM19NU0cpIDsgfQorI2Vsc2UKKyNkZWZpbmUgQ0hFQ0tfRE1BKCkge3VfbG9uZyBrID0gMTAwMDAwMCA7XAorCQl3aGlsZSAoayAmJiAoRE1BX0JVU1koKSkpIGstLSA7XAorCQlpZiAoIWspIFNNVF9QQU5JQyhzbWMsSFdNX0UwMDAzLEhXTV9FMDAwM19NU0cpIDsgfQorI2VuZGlmCisKKyNkZWZpbmUgQ0hFQ0tfRklGTygpIHt1X2xvbmcgayA9IDEwMDAwMDAgO1wKKwkJd2hpbGUgKGsgJiYgKEZJRk9fQlVTWSgpKSkgay0tIDtcCisJCWlmICghaykgU01UX1BBTklDKHNtYyxIV01fRTAwMTksSFdNX0UwMDE5X01TRykgOyB9CisKKyNkZWZpbmUgQ0hFQ0tfRE1BX0ZJRk8oKSB7dV9sb25nIGsgPSAxMDAwMDAwIDtcCisJCXdoaWxlIChrICYmIChETUFfRklGT19CVVNZKCkpKSBrLS0gO1wKKwkJaWYgKCFrKSBTTVRfUEFOSUMoc21jLEhXTV9FMDAwNCxIV01fRTAwMDRfTVNHKSA7IH0KKworI2RlZmluZQlHRVRfSVNSKCkJfmlucHcoSVNSX0EpCisjZGVmaW5lIENIRUNLX0lTUigpCX5pbnB3KElTUl9BKQorCisjaWZuZGVmIFVOSVgKKyNpZm5kZWYJV0lOTlQKKyNkZWZpbmUJQ0xJX0ZCSSgpCW91dHB3KENTUl9BLChpbnB3KENTUl9BKSZcCisJCQkoQ1NfQ1JFU0VUfENTX0JZUEFTUykpfENTX1JFU0VUX0ZJRk98c21jLT5ody5sZWQpCisjZWxzZQkvKiBXSU5OVCAqLworI2RlZmluZSBDTElfRkJJKCkJb3V0cHcoQ1NSX0EsKGxfaW5wdyhDU1JfQSkmXAorCQkJKENTX0NSRVNFVHxDU19CWVBBU1MpKXxDU19SRVNFVF9GSUZPfHNtYy0+aHcubGVkKQorI2VuZGlmCS8qIFdJTk5UICovCisjZWxzZQkvKiBVTklYICovCisjZGVmaW5lCUNMSV9GQkkoc21jKQlvdXRwdyhDU1JfQVMoc21jKSwoaW5wdyhDU1JfQVMoc21jKSkmXAorCQkJKENTX0NSRVNFVHxDU19CWVBBU1MpKXxDU19SRVNFVF9GSUZPfChzbWMpLT5ody5sZWQpCisjZW5kaWYKKworI2lmbmRlZiBVTklYCisjZGVmaW5lCVNUSV9GQkkoKQlvdXRwdyhDU1JfQSwoaW5wdyhDU1JfQSkmXAorCQkoQ1NfQ1JFU0VUfENTX0JZUEFTU3xDU19SRVNFVF9GSUZPKSl8Q1NfSU1TS3xzbWMtPmh3LmxlZCkKKyNlbHNlCisjZGVmaW5lCVNUSV9GQkkoc21jKQlvdXRwdyhDU1JfQVMoc21jKSwoaW5wdyhDU1JfQVMoc21jKSkmXAorCQkoQ1NfQ1JFU0VUfENTX0JZUEFTU3xDU19SRVNFVF9GSUZPKSl8Q1NfSU1TS3woc21jKS0+aHcubGVkKQorI2VuZGlmCisKKy8qIEVJU0EgRE1BIENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRE1BX1dSSVRFX1NJTkdMRV9NQVNLX0JJVF9NCTB4MGEJLyogTWFzdGVyIERNQSBDb250cm9sbGVyICovCisjZGVmaW5lIERNQV9XUklURV9TSU5HTEVfTUFTS19CSVRfUwkweGQ0CS8qIFNsYXZlIERNQSBDb250cm9sbGVyICovCisjZGVmaW5lIERNQV9DTEVBUl9CWVRFX1BPSU5URVJfTQkweDBjCisjZGVmaW5lIERNQV9DTEVBUl9CWVRFX1BPSU5URVJfUwkweGQ4CisKKyNlbmRpZgkvKiBFSVNBICovCisKKyNpZmRlZglNQ0EKKworLyoKKyAqIFBPUyBSZWdpc3RlcjoJICEhIGFsbCBJL08ncyBhcmUgOC1CaXQgISEKKyAqLworI2RlZmluZQlQT1NfU1lTX1NFVFVQCTB4OTQJLyogc3lzdGVtIHNldHVwIHJlZ2lzdGVyICovCisjZGVmaW5lCVBPU19TWVNURU0JMHhmZgkvKiBzeXN0ZW0gbW9kZSAqLworCisjZGVmaW5lCVBPU19DSEFOTkVMX1BPUwkweDk2CS8qIHJlZ2lzdGVyIHNsb3QgSUQgKi8KKyNkZWZpbmUJUE9TX0NIQU5ORUxfQklUCTB4MDgJLyogbWFzayBmb3IgLSItICovCisKKyNkZWZpbmUJUE9TX0JBU0UJMHgxMDAJLyogUE9TIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZQlQT1NfSURfTE9XCVBPU19CQVNFCS8qIGNhcmQgSUQgbG93ICovCisjZGVmaW5lCVBPU19JRF9ISUdICShQT1NfQkFTRSsxKQkvKiBjYXJkIElEIGhpZ2ggKi8KKyNkZWZpbmUJUE9TXzEwMgkJKFBPU19CQVNFKzIpCS8qIGNhcmQgZW4uLCBhcmJpdHJhdGlvbiBsZXZlbCAuLiAqLworI2RlZmluZQlQT1NfMTAzCQkoUE9TX0JBU0UrMykJLyogRlBST00gYWRkciwgcGFnZSAqLworI2RlZmluZQlQT1NfMTA0CQkoUE9TX0JBU0UrNCkJLyogSS9PLCBJUlEgKi8KKyNkZWZpbmUJUE9TXzEwNQkJKFBPU19CQVNFKzUpCS8qIFBPU19DSENLICovCisjZGVmaW5lCVBPU18xMDYJCShQT1NfQkFTRSs2KQkvKiB0byByZWFkIFZQRCAqLworI2RlZmluZQlQT1NfMTA3CQkoUE9TX0JBU0UrNykJLyogYWRkZWQgd2l0aG91dCBmdW5jdGlvbiAqLworCisvKiBGTTEgY2FyZCBJRHMgKi8KKyNkZWZpbmUJRk0xX0NBUkRfSUQwCTB4ODMKKyNkZWZpbmUJRk0xX0NBUkRfSUQxCTAKKworI2RlZmluZQlGTTFfSUJNX0lEMAkweDljCisjZGVmaW5lCUZNMV9JQk1fSUQxCTB4OGYKKworCisvKiBGTTIgY2FyZCBJRHMgKi8KKyNkZWZpbmUJRk0yX0NBUkRfSUQwCTB4YWIKKyNkZWZpbmUJRk0yX0NBUkRfSUQxCTAKKworI2RlZmluZQlGTTJfSUJNX0lEMAkweDdlCisjZGVmaW5lCUZNMl9JQk1fSUQxCTB4OGYKKworLyogQm9hcmQgcmV2aXNpb24uICovCisjZGVmaW5lIEZNMV9SRVYJCTAKKyNkZWZpbmUgRk0yX1JFVgkJMQorCisjZGVmaW5lCU1BWF9TTE9UCTgKKworLyoKKyAqIFBPU18xMDIKKyAqLworI2RlZmluZQlQT1NfQ0FSRF9FTgkweDAxCS8qIGNhcmQgZW5hYmxlID0xICovCisjZGVmaW5lCVBPU19TREFUX0VOCTB4MDIJLyogZW5hYmxlIDMyLWJpdCBzdHJlYW1pbmcgZGF0YSBtb2RlICovCisjZGVmaW5lCVBPU19FTl9DSEtJTlQJMHgwNAkvKiBlbmFibGUgaW50LiBmcm9tIGNoZWNrIGxpbmUgYXNzZXJ0ZWQgKi8KKyNkZWZpbmUJUE9TX0VOX0JVU19FUlIJMHgwOAkvKiBlbmFibGUgaW50LiBvbiBpbnZhbGlkIGJ1c21hc3RlciB0cmFuc2YuICovCisjZGVmaW5lCVBPU19GQUlSTkVTUwkweDEwCS8qIGZhaXJuZXMgb24gPTEgKi8KKy8qIGF0dGVudGlvbjogYXJiaXRyYXRpb24gbGV2ZWwgdXNlZCB3aXRoIGJpdCAwIFBPUyAxMDUgKi8KKyNkZWZpbmUJUE9TX0xBUkJJVAkweGUwCS8qIGFyYml0cmF0aW9uIGxldmVsCSgwLDAsMCktPmxldmVsID0gMHg4CisJCQkJCQkJKDEsMSwxKS0+bGV2ZWwgPSAweGYgKi8KKy8qCisgKiBQT1NfMTAzCisgKi8KKyNkZWZpbmUJUE9TX1BBR0UJMHgwNwkvKiBGUFJPTSBwYWdlIHNlbGVjdGlvbiAqLworI2RlZmluZQlQT1NfQk9PVF9FTgkweDA4CS8qIGJvb3QgUFJPTSBlbmFibGUgPTEgKi8KKyNkZWZpbmUJUE9TX01TRUwJMHg3MAkvKiBtZW1vcnkgc3RhcnQgYWRkcmVzcyBmb3IgRlBST00gbWFwcGluZyAqLworI2RlZmluZQlQUk9HX0VOCQkweDgwCS8qIEZNMTogVnBwIHByb2cgb24vb2ZmICovCisjZGVmaW5lCVBPU19TRFIJCTB4ODAJLyogRk0yOiBTdHJlYW1pbmcgZGF0YSBiaXQgKi8KKworLyoKKyAqIFBPU18xMDQKKyAqLworI2RlZmluZQlQT1NfSU9TRUwJMHgzZgkvKiBzZWxlY3RlZCBJL08gYmFzZSBhZGRyZXNzICovCisjZGVmaW5lCVBPU19JUlFTRUwJMHhjMAkvKiBzZWxlY3RlZCBpbnRlcnJ1cHQgKi8KKworLyoKKyAqIFBPU18xMDUKKyAqLworI2RlZmluZQlQT1NfQ0hDSwkweDgwCisjZGVmaW5lIFBPU19TWU5DX0VSUgkweDIwCS8qIEZNMjogc3luY2hyb25vdXMgZXJyb3IgcmVwb3J0aW5nCSovCisjZGVmaW5lIFBPU19QQVJfREFUQQkweDEwCS8qIEZNMjogZGF0YSBwYXJpdHkgZW5hYmxlIGJpdAkqLworI2RlZmluZSBQT1NfUEFSX0FERFIJMHgwOAkvKiBGTTI6IGFkZHJlc3MgcGFyaXR5IGVuYWJsZSBiaXQJKi8KKyNkZWZpbmUJUE9TX0lSUUhTRUwJMHgwMgkvKiBGTTI6IEhpZ2hlc3QgYml0IGZvciBJUlFfc2VsZWN0aW9uCSovCisjZGVmaW5lIFBPU19IQVJCSVQJMHgwMQkvKiBIaWdoZXN0IGJpdCBpbiBCdXMgYXJiaXRyYXRpb24gc2VsZWN0aW9uICovCisKKyNkZWZpbmUJU0FfTUFDCSgwKQkJLyogc3RhcnQgYWRkci4gTUFDX0FEIHdpdGhpbiB0aGUgUFJPTQkqLworI2RlZmluZQlQUkFfT0ZGCSgwKQorI2RlZmluZSBTQV9QTURfVFlQRQkoOCkJLyogc3RhcnQgYWRkci4gUE1ELVR5cGUJKi8KKworLyoKKyAqIGFkZHJlc3MgdHJhbnNtaXNzaW9uIGZyb20gbG9naWNhbCB0byBwaHlzaWNhbCBvZmZzZXQgYWRkcmVzcyBvbiBib2FyZAorICovCisjZGVmaW5lCUZNQShhKQkoMHgwMTAwfCgoYSk8PDEpKQkvKiBGT1JNQUMrIChyL3cpICovCisjZGVmaW5lCVAyKGEpCSgweDAwYzB8KChhKTw8MSkpCS8qIFBMQzIgKHIvdykgKERBUykgKi8KKyNkZWZpbmUJUDEoYSkJKDB4MDA4MHwoKGEpPDwxKSkJLyogUExDMSAoci93KSAqLworI2RlZmluZQlUSShhKQkoMHgwMDYwfCgoYSk8PDEpKQkvKiBUaW1lciAoci93KSAqLworI2RlZmluZQlQUihhKQkoMHgwMDQwfCgoYSk8PDEpKQkvKiBjb25maWd1cmF0aW9uIFBST00gKi8KKyNkZWZpbmUJQ1MoYSkJKDB4MDAyMHwgKGEpKQkJLyogY29udHJvbC9zdGF0dXMgKi8KKyNkZWZpbmUJRkYoYSkJKDB4MDAxMHwoKGEpPDwxKSkJLyogRklGTyBBU0lDICovCisjZGVmaW5lCUNUKGEpCSgweDAwMDB8KChhKTw8MSkpCS8qIGNvdW50ZXIgKi8KKworLyoKKyAqIGNvdW50ZXIKKyAqLworI2RlZmluZQlBQ0xBCUNUKDApCQkvKiBhZGRyZXNzIGNvdW50ZXIgbG93ICovCisjZGVmaW5lCUFDSEEJQ1QoMSkJCS8qIGFkZHJlc3MgY291bnRlciBoaWdoICovCisjZGVmaW5lCUJDTglDVCgyKQkJLyogYnl0ZSBjb3VudGVyICovCisjZGVmaW5lCU1VWAlDVCgzKQkJLyogTVVYLXJlZ2lzdGVyICovCisjZGVmaW5lCVdDTglDVCgweDA4KQkvKiB3b3JkIGNvdW50ZXIgKi8KKyNkZWZpbmUJRkZMRwlDVCgweDA5KQkvKiBGSUZPIEZsYWdzICovCisKKy8qCisgKiB0ZXN0L2NvbnRyb2wgcmVnaXN0ZXIgKEZNMiBvbmx5KQorICovCisjZGVmaW5lIENOVF9UU1QJMHgwMTgJCS8qIENvdW50ZXIgdGVzdCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIENOVF9TVFAgMHgwMWEJCS8qIENvdW50ZXIgdGVzdCBzdGVwIHJlZy4gKDggQml0KSAqLworCisvKgorICogQ1MgcmVnaXN0ZXIgKHJlYWQgb25seSkKKyAqLworI2RlZmluZQlDU1JBCUNTKDApCQkvKiBjb250cm9sL3N0YXR1cyByZWdpc3RlciBhZGRyZXNzICovCisjZGVmaW5lCUNTRkEJQ1MoMikJCS8qIGNvbnRyb2wvc3RhdHVzIEZJRk8gQlVTWSAuLi4JICovCisjZGVmaW5lCUlTUkEJQ1MoNCkJCS8qIGZpcnN0IGludC4gc291cmNlIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUJSVNSMglDUyg2KQkJLyogc2Vjb25kIGludC4gc291cmNlIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUJTEVEUglDUygweDBjKQkvKiBMRUQgcmVnaXN0ZXIgci93ICovCisjZGVmaW5lCUNTSUwJQ1MoMHgxMCkJLyogSS9PIG1hcHBlZCBQT1NfSURfbG93ICgxMDApICovCisjZGVmaW5lCUNTSUgJQ1MoMHgxMikJLyoJLSAiIC0gUE9TX0lEX0hJR0ggKDEwMSkgKi8KKyNkZWZpbmUJQ1NBCUNTKDB4MTQpCS8qCS0gIiAtIFBPU18xMDIgKi8KKyNkZWZpbmUJQ1NNCUNTKDB4MGUpCS8qCS0gIiAtIFBPU18xMDMgKi8KKyNkZWZpbmUJQ1NNX0ZNMQlDUygweDE2KQkvKgktICIgLSBQT1NfMTAzIChjb3B5IGluIEZNMSkgKi8KKyNkZWZpbmUJQ1NJCUNTKDB4MTgpCS8qCS0gIiAtIFBPU18xMDQgKi8KKyNkZWZpbmUJQ1NTCUNTKDB4MWEpCS8qCS0gIiAtIFBPU18xMDUgKi8KKyNkZWZpbmUJQ1NQXzA2CUNTKDB4MWMpCS8qCS0gIiAtIFBPU18xMDYgKi8KKyNkZWZpbmUJV0RPR19TVAkJMHgxYwkvKiBXYXRjaGRvZyBzdGF0dXMgKEZNMiBvbmx5KQkqLworI2RlZmluZQlXRE9HX0VOCQkweDFjCS8qIFdhdGNoZG9nIGVuYWJsaW5nIChGTTIgb25seSwgOEJpdCkJKi8KKyNkZWZpbmUJV0RPR19ESVMJMHgxZQkvKiBXYXRjaGRvZyBkaXNhYmxpbmcgKEZNMiBvbmx5LCA4Qml0KQkqLworCisjZGVmaW5lIFBHUkEJQ1NNCQkvKiBGbGFzaCBwYWdlIHJlZ2lzdGVyICovCisKKworI2RlZmluZQlXQ1RBCUZGKDApCQkvKiB3b3JkIGNvdW50ZXIgKi8KKyNkZWZpbmUJRkZMQUcJRkYoMSkJCS8qIEZMQUcvVl9GVUxMIChGSUZPIGFsbW9zdCBmdWxsLCB3cml0ZSBvbmx5KSovCisKKy8qCisgKiBUaW1lciByZWdpc3RlciAoRk0yIG9ubHkpCisgKi8KKyNkZWZpbmUgUlRNX0NOVAkJMHgyOAkJLyogUlRNIENvdW50ZXIgKi8KKyNkZWZpbmUgVElfRElWCQkweDYwCQkvKiBUaW1lciBQcmVzY2FsZXIgKi8KKyNkZWZpbmUgVElfQ0gxCQkweDYyCQkvKiBUaW1lciBjaGFubmVsIDEgY291bnRlciAqLworI2RlZmluZSBUSV9TVE9QCQkweDY0CQkvKiBTdG9wIHRpbWVyIG9uIGNoYW5uZWwgMSAqLworI2RlZmluZSBUSV9TVFJUCQkweDY2CQkvKiBTdGFydCB0aW1lciBvbiBjaGFubmVsIDEgKi8KKyNkZWZpbmUgVElfSU5JMgkJMHg2OAkJLyogVGltZXI6IEJ1cyBtYXN0ZXIgcHJlZW1wdGlvbiAqLworI2RlZmluZSBUSV9DTlQyCQkweDZhCQkvKiBUaW1lciAqLworI2RlZmluZSBUSV9JTkkzCQkweDZjCQkvKiBUaW1lcjogU3RyZWFtaW5nIGRhdGEgKi8KKyNkZWZpbmUgVElfQ05UMwkJMHg2ZQkJLyogVGltZXIgKi8KKyNkZWZpbmUgV0RPR19MTwkJMHg3MAkJLyogV2F0Y2hkb2cgY291bnRlciBsb3cgKi8KKyNkZWZpbmUgV0RPR19ISQkJMHg3MgkJLyogV2F0Y2hkb2cgY291bnRlciBoaWdoICovCisjZGVmaW5lIFJUTV9QUkUJCTB4NzQJCS8qIHJlc3RyLiB0b2tlbiBwcmVzY2FsZXIgKi8KKyNkZWZpbmUgUlRNX1RJTQkJMHg3NgkJLyogcmVzdHIuIHRva2VuIHRpbWVyICovCisKKy8qCisgKiBSZWNvbW1lbmRlZCBUaW1lb3V0IHZhbHVlcyAoZm9yIEZNMiB0aW1lciBvbmx5KQorICovCisjZGVmaW5lIFRPVVRfQk1fUFJFCTE4OAkJLyogMy43NiB1c2VjCSovCisjZGVmaW5lIFRPVVRfU19EQVQJMzc0CQkvKiA3LjQ4IHVzZWMJKi8KKworLyoKKyAqIENTIHJlZ2lzdGVyICh3cml0ZSBvbmx5KQorICovCisjZGVmaW5lCUhTUihwKQlDUygweDE4fChwKSkJLyogSG9zdCByZXF1ZXN0IHJlZ2lzdGVyICovCisKKyNkZWZpbmUJUlRNX1BVVAkJMHgzNgkJLyogcmVzdHIuIHRva2VuIGNvdW50ZXIgd3JpdGUgKi8KKyNkZWZpbmUJUlRNX0dFVAkJMHgyOAkJLyoJLSAiIC0JY2xlYXIgKi8KKyNkZWZpbmUJUlRNX0NMRUFSCTB4MzQJCS8qCS0gIiAtCXJlYWQgKi8KKworLyoKKyAqIEJDTglCaXQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBCQ05fQlVTWQkweDgwMDAJCS8qIERNQSBCdXN5IGZsYWcgKi8KKyNkZWZpbmUgQkNOX0FaRVJPCTB4NDAwMAkJLyogQWxtb3N0IHplcm8gZmxhZyAoQkNOIDwgNCkgKi8KKyNkZWZpbmUgQkNOX1NUUkVBTQkweDIwMDAJCS8qIEFsbG93IHN0cmVhbWluZyBkYXRhIChCQ04gPj0gOCkgKi8KKworLyoKKyAqIFdDTglCaXQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBXQ05fWkVSTwkweDIwMDAJCS8qIFplcm8gZmxhZyAoY291bnRlZCB0byB6ZXJvKSAqLworI2RlZmluZSBXQ05fQVpFUk8JMHgxMDAwCQkvKiBBbG1vc3QgemVybyBmbGFnIChCQ04gPCA0KSAqLworCisvKgorICogQ05UX1RTVAlCaXQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBDTlRfTU9ERQkweDAxCQkvKiBHbyBpbnRvIHRlc3QgbW9kZSAqLworI2RlZmluZQlDTlRfRDMyCQkweDAyCQkvKiAxNi8zMiBCSVQgdGVzdCBtb2RlICovCisKKy8qCisgKiBGSUZPIEZsYWcJCUZJRk8gRmxhZ3MvVmZ1bGwgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBGRl9WRlVMTAkweDAwM2YJCS8qIFZfZnVsbCB2YWx1ZSBtYXNrICovCisjZGVmaW5lIEZGTEdfRlVMTAkweDIwMDAJCS8qIEZVTEwgZmxhZyAqLworI2RlZmluZSBGRkxHX0FfRlVMTAkweDEwMDAJCS8qIEFsbW9zdCBmdWxsIGZsYWcgKi8KKyNkZWZpbmUgRkZMR19WRlVMTAkweDA4MDAJCS8qIFZfZnVsbCBGbGFnICovCisjZGVmaW5lIEZGTEdfQV9FTVAJMHgwNDAwCQkvKiBhbG1vc3QgZW1wdHkgZmxhZyAqLworI2RlZmluZSBGRkxHX0VNUAkweDAyMDAJCS8qIGVtcHR5IGZsYWcgKi8KKyNkZWZpbmUgRkZMR19UX0VNUAkweDAxMDAJCS8qIHRvdGFsbHkgZW1wdHkgZmxhZyAqLworCisvKgorICogV0RPRwkJV2F0Y2hkb2cgc3RhdHVzIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgV0RPR19BTE0JMHgwMQkJLyogV2F0Y2hkb2cgYWxhcm0gQml0ICovCisjZGVmaW5lIFdET0dfQUNUCTB4MDIJCS8qIFdhdGNoZG9nIGFjdGl2ZSBCaXQgKi8KKworLyoKKyAqIENTKDApCUNPTlRST0xTCisgKi8KKyNkZWZpbmUJQ1NfQ1JFU0VUCTB4MDAwMQorI2RlZmluZQlGSUZPX1JTVAkweDAwMDIKKyNkZWZpbmUJQ1NfSU1TSwkJMHgwMDA0CisjZGVmaW5lCUVOX0lSUV9DSENLCTB4MDAwOAorI2RlZmluZQlFTl9JUlFfVE9LRU4JMHgwMDEwCisjZGVmaW5lCUVOX0lSUV9UQwkweDAwMjAKKyNkZWZpbmUJVE9LRU5fU1RBVFVTCTB4MDA0MAorI2RlZmluZQlSVE1fQ0hBTkdFCTB4MDA4MAorCisjZGVmaW5lCUNTX1NBUwkJMHgwMTAwCisjZGVmaW5lCUNTX0JZU1RBVAkweDAyMDAJLyogYnlwYXNzIGNvbm5lY3RlZCAoMD1jb25uLikgKi8KKyNkZWZpbmUJQ1NfQllQQVNTCTB4MDQwMAkvKiBieXBhc3Mgb24vb2ZmIGluZGljYXRpb24gKi8KKworLyoKKyAqIENTKDIpCUZJRk9TVEFUCisgKi8KKyNkZWZpbmUJSFNSRVEJCTB4MDAwNworI2RlZmluZQlCSUdESVIJCTB4MDAwOAorI2RlZmluZQlDU0ZfQlVTWV9GSUZPCTB4MDAxMAorI2RlZmluZQlDU0ZfQlVTWV9ETUEJMHgwMDIwCisjZGVmaW5lCVNMT1RfMzIJCTB4MDA0MAorCisjZGVmaW5lCUxFRF8wCQkweDAwMDEKKyNkZWZpbmUJTEVEXzEJCTB4MDAwMgorI2RlZmluZQlMRURfMgkJMHgwMTAwCisKKyNkZWZpbmUJTUFYX1BBR0VTCTgJCS8qIHBhZ2VzICovCisjZGVmaW5lCU1BWF9GQUREUgkweDQwMDAJCS8qIDE2SyBwZXIgcGFnZSAqLworCisvKgorICoJSVJRID0gSVNSQSB8fCBJU1IyIDsKKyAqCisgKglJU1JBID0gSVJRX09USF9FTiAmJiAoSVNfTEFOIHwgSVNfQlVTKSA7CisgKglJU1IyID0gSVJRX1RDX0VOICYmIElTX1RDIDsKKyAqCisgKglJU19MQU4gPSAoSVNfTUlOVFIxIHwgSVNfTUlOVFIyIHwgSVNfUExJTlQxIHwgSVNfUExJTlQyIHwgSVNfVElNSU5UKSB8fAorICoJCSAoSVJRX0VOX1RPS0VOICYmIElTX1RPS0VOKSA7CisgKglJU19CVVMgPSBJUlFfQ0hDS19FTiAmJiAoSVNfQlVTRVJSIHwgSVNfQ0hDS19MKSA7CisgKi8KKy8qCisgKglJU1JBCSEhISBhY3RpdiBoaWdoICEhIQorICovCisjZGVmaW5lCUlTX01JTlRSMQkweDAwMDEJCS8qIEZPUk1BQyBTVDFVL0wgJiB+SU1TSzFVL0wqLworI2RlZmluZQlJU19NSU5UUjIJMHgwMDAyCQkvKiBGT1JNQUMgU1QyVS9MICYgfklNU0syVS9MKi8KKyNkZWZpbmUJSVNfUExJTlQxCTB4MDAwNAkJLyogUExDMSAqLworI2RlZmluZQlJU19QTElOVDIJMHgwMDA4CQkvKiBQTEMyICovCisjZGVmaW5lCUlTX1RJTUlOVAkweDAwMTAJCS8qIFRpbWVyIDgyQzU0LTIgKi8KKyNkZWZpbmUJSVNfVE9LRU4JMHgwMDIwCQkvKiByZXN0cmljdGV0IHRva2VuIG1vbml0b3JpbmcgKi8KKyNkZWZpbmUJSVNfQ0hDS19MCTB4MDA0MAkJLyogY2hlY2sgbGluZSBhc3NlcnRlZCAqLworI2RlZmluZQlJU19CVVNFUlIJMHgwMDgwCQkvKiBidXMgZXJyb3IgKi8KKy8qCisgKglJU1IyCisgKi8KKyNkZWZpbmUJSVNfVEMJCTB4MDAwMQkJLyogdGVybWluYWwgY291bnQgaXJxICovCisjZGVmaW5lIElTX1NGREJLUlROCTB4MDAwMgkJLyogc2VsZWN0ZWQgZmVlZGJhY2sgcmV0dXJuICovCisjZGVmaW5lIElTX0QxNgkJMHgwMDA0CQkvKiBEUzE2ICovCisjZGVmaW5lCUlTX0QzMgkJMHgwMDA4CQkvKiBEUzMyICovCisjZGVmaW5lIElTX0RQRUkJCTB4MDAxMAkJLyogRGF0YSBQYXJpdHkgSW5kaWNhdGlvbiAqLworCisjZGVmaW5lCUFMTF9JUlNSCTB4MDBmZgorCisjZGVmaW5lCUZNX0EoYSkJQUREUihGTUEoYSkpCS8qIEZPUk1BQyBQbHVzIHBoeXNpY2FsIGFkZHIgKi8KKyNkZWZpbmUJUDFfQShhKQlBRERSKFAxKGEpKQkvKiBQTEMxIChyL3cpICovCisjZGVmaW5lCVAyX0EoYSkJQUREUihQMihhKSkJLyogUExDMiAoci93KSAoREFTKSAqLworI2RlZmluZQlUSV9BKGEpCUFERFIoVEkoYSkpCS8qIFRpbWVyIChyL3cpIEZNMSBvbmx5ISAqLworI2RlZmluZQlQUl9BKGEpCUFERFIoUFIoYSkpCS8qIGNvbmZpZy4gUFJPTSAqLworI2RlZmluZQlDU19BKGEpCUFERFIoQ1MoYSkpCS8qIGNvbnRyb2wvc3RhdHVzICovCisKKyNkZWZpbmUJSVNSMV9BCUFERFIoSVNSQSkJLyogZmlyc3QgaW50LiBzb3VyY2UgcmVnaXN0ZXIgYWRkcmVzcyAqLworI2RlZmluZQlJU1IyX0EJQUREUihJU1IyKQkvKiBzZWNvbmQJLSItCSAqLworI2RlZmluZQlDU1JfQQlBRERSKENTUkEpCS8qIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUJQ1NGX0EJQUREUihDU0ZBKQkvKiBjb250cm9sL3N0YXR1cyBGSUZPIEJVU1kgZmxhZ3MgKHIvdykgKi8KKworI2RlZmluZQlDU0lMX0EJQUREUihDU0lMKQkvKiBJL08gbWFwcGVkIFBPU19JRF9sb3cgKDEwMikgKi8KKyNkZWZpbmUJQ1NJSF9BCUFERFIoQ1NJSCkJLyoJLSAiIC0gUE9TX0lEX0hJR0ggKDEwMSkgKi8KKyNkZWZpbmUJQ1NBX0EJQUREUihDU0EpCS8qCS0gIiAtIFBPU18xMDIgKi8KKyNkZWZpbmUJQ1NJX0EJQUREUihDU0kpCS8qCS0gIiAtIFBPU18xMDQgKi8KKyNkZWZpbmUJQ1NNX0EJQUREUihDU00pCS8qCS0gIiAtIFBPU18xMDMgKi8KKyNkZWZpbmUJQ1NNX0ZNMV9BCUFERFIoQ1NNX0ZNMSkJLyoJLSAiIC0gUE9TXzEwMyAoMm5kIGNvcHksIEZNMSkgKi8KKyNkZWZpbmUJQ1NQXzA2X0EJQUREUihDU1BfMDYpCS8qCS0gIiAtIFBPU18xMDYgKi8KKworI2RlZmluZQlXQ1RfQQlBRERSKFdDVEEpCS8qIHdvcmQgY291bnRlciAoci93KSAqLworI2RlZmluZQlGRkxBR19BCUFERFIoRkZMQUcpCS8qIEZMQUcvVl9GVUxMIChGSUZPIGFsbW9zdCBmdWxsLCB3cml0ZSBvbmx5KSovCisKKyNkZWZpbmUJQUNMX0EJQUREUihBQ0xBKQkvKiBhZGRyZXNzIGNvdW50ZXIgbG93ICovCisjZGVmaW5lCUFDSF9BCUFERFIoQUNIQSkJLyogYWRkcmVzcyBjb3VudGVyIGhpZ2ggKi8KKyNkZWZpbmUJQkNOX0EJQUREUihCQ04pCS8qIGJ5dGUgY291bnRlciAqLworI2RlZmluZQlNVVhfQQlBRERSKE1VWCkJLyogTVVYLXJlZ2lzdGVyICovCisKKyNkZWZpbmUJSVNSX0EJQUREUihJU1JBKQkvKiBJbnRlcnJ1cHQgU291cmNlIFJlZ2lzdGVyICovCisjZGVmaW5lCUZJRk9fUkVTRVRfQQlBRERSKEZJRk9fUkVTRVQpCS8qIHJlc2V0IHRoZSBGSUZPICovCisjZGVmaW5lCUZJRk9fRU5fQQlBRERSKEZJRk9fRU4pCQkvKiBlbmFibGUgdGhlIEZJRk8gKi8KKworI2RlZmluZSBXRE9HX0VOX0EJQUREUihXRE9HX0VOKQkJLyogcmVzZXQgYW5kIHN0YXJ0IHRoZSBXRE9HICovCisjZGVmaW5lIFdET0dfRElTX0EJQUREUihXRE9HX0RJUykJCS8qIGRpc2FibGUgdGhlIFdET0cgKi8KKy8qCisgKiBhbGwgY29udHJvbCByZWcuIChyZWFkISkgYXJlIDggYml0IChleGNlcHQgUEFHRV9SR19BIGFuZCBMRURSX0EpCisgKi8KKyNkZWZpbmUJSFNSX0EocCkJQUREUihIU1IocCkpCS8qIEhvc3QgcmVxdWVzdCByZWdpc3RlciAqLworCisjZGVmaW5lCVNUQVRfQllQCTAJCS8qIGJ5cGFzcyBzdGF0aW9uICovCisjZGVmaW5lCVNUQVRfSU5TCTIJCS8qIGluc2VydCBzdGF0aW9uICovCisjZGVmaW5lCUJZUEFTUyhvKQlDUygweDEwfChvKSkJLyogbz1TVEFUX0JZUCB8fCBTVEFUX0lOUyAqLworCisjZGVmaW5lCUlSUV9UQ19FTglDUygweDBiKQkvKiBlbmFibGUvZGlzYWJsZSBJUlEgb24gVEMgKi8KKyNkZWZpbmUJSVJRX1RDX0RJUwlDUygweDBhKQorI2RlZmluZQlJUlFfVE9LRU5fRU4JQ1MoOSkJCS8qIGVuYWJsZS9kaXNhYmxlIElSUSBvbiByZXN0ci4gVG9rZW4gKi8KKyNkZWZpbmUJSVJRX1RPS0VOX0RJUwlDUyg4KQorI2RlZmluZQlJUlFfQ0hDS19FTglDUyg3KQkJLyoJLSItCUlSUSBhZnRlciBDSENLIGxpbmUgKi8KKyNkZWZpbmUJSVJRX0NIQ0tfRElTCUNTKDYpCisjZGVmaW5lCUlSUV9PVEhfRU4JQ1MoNSkJCS8qCS0iLQlvdGhlciBJUlEncyAqLworI2RlZmluZQlJUlFfT1RIX0RJUwlDUyg0KQorI2RlZmluZQlGSUZPX0VOCQlDUygzKQkJLyogZGlzYWJsZSAocmVzZXQpLCBlbmFibGUgRklGTyAqLworI2RlZmluZQlGSUZPX1JFU0VUCUNTKDIpCisjZGVmaW5lCUNBUkRfRU4JCUNTKDEpCQkvKiBkaXNhYmxlIChyZXNldCksIGVuYWJsZSBjYXJkICovCisjZGVmaW5lCUNBUkRfRElTCUNTKDApCisKKyNkZWZpbmUJTEVEUl9BCQlBRERSKExFRFIpCS8qIEQwPWdyZWVuLCBEMT15ZWxsb3csIEQ4PUwyICovCisjZGVmaW5lCVBBR0VfUkdfQQlBRERSKENTTSkJLyogRDwyLi4wPiAqLworI2RlZmluZQlJUlFfQ0hDS19FTl9BCUFERFIoSVJRX0NIQ0tfRU4pCisjZGVmaW5lIElSUV9DSENLX0RJU19BCUFERFIoSVJRX0NIQ0tfRElTKQorCisjZGVmaW5lCUdFVF9QQUdFKGJhbmspCW91dHB3KFBBR0VfUkdfQSwoaW5wdyhQQUdFX1JHX0EpICZcCisJCQkJKH5QT1NfUEFHRSkpIHwoaW50KSAoYmFuaykpCisjZGVmaW5lCVZQUF9PTigpCWlmIChzbWMtPmh3LnJldiA9PSBGTTFfUkVWKSB7CVwKKwkJCQlvdXRwdyhQQUdFX1JHX0EsCVwKKwkJCQkoaW5wdyhQQUdFX1JHX0EpICYgUE9TX1BBR0UpIHwgUFJPR19FTik7IFwKKwkJCX0KKyNkZWZpbmUJVlBQX09GRigpCWlmIChzbWMtPmh3LnJldiA9PSBGTTFfUkVWKSB7CVwKKwkJCQlvdXRwdyhQQUdFX1JHX0EsKGlucHcoUEFHRV9SR19BKSAmIFBPU19QQUdFKSk7IFwKKwkJCX0KKworI2RlZmluZQlTS0ZERElfUFNaCTE2CQkvKiBhZGRyZXNzIFBST00gc2l6ZSAqLworCisjZGVmaW5lCVJFQURfUFJPTShhKQkoKHVfY2hhcilpbnAoYSkpCisKKyNkZWZpbmUJR0VUX0lTUigpCX5pbnB3KElTUjFfQSkKKyNpZm5kZWYJVENJCisjZGVmaW5lCUNIRUNLX0lTUigpCX5pbnB3KElTUjFfQSkKKyNkZWZpbmUJQ0hFQ0tfSVNSX1NNUChpb3ApCX5pbnB3KChpb3ApK0lTUkEpCisjZWxzZQorI2RlZmluZQlDSEVDS19JU1IoKQkJKH5pbnB3KElTUjFfQSkgfCB+aW5wdyhJU1IyX0EpKQorI2RlZmluZQlDSEVDS19JU1JfU01QKGlvcCkJKH5pbnB3KChpb3ApK0lTUkEpIHwgfmlucHcoKGlvcCkrSVNSMikpCisjZW5kaWYKKworI2RlZmluZQlETUFfQlVTWSgpCShpbnB3KENTRl9BKSAmIENTRl9CVVNZX0RNQSkKKyNkZWZpbmUJRklGT19CVVNZKCkJKGlucHcoQ1NGX0EpICYgQ1NGX0JVU1lfRklGTykKKyNkZWZpbmUJRE1BX0ZJRk9fQlVTWSgpCShpbnB3KENTRl9BKSAmIChDU0ZfQlVTWV9ETUEgfCBDU0ZfQlVTWV9GSUZPKSkKKyNkZWZpbmUJQlVTX0NIRUNLKCkgewlpbnQgaSA7IFwKKwkJCWlmICgoaSA9IEdFVF9JU1IoKSkgJiBJU19CVVNFUlIpIFwKKwkJCQlTTVRfUEFOSUMoc21jLEhXTV9FMDAyMCxIV01fRTAwMjBfTVNHKSA7IFwKKwkJCWlmIChpICYgSVNfQ0hDS19MKSBcCisJCQkJU01UX1BBTklDKHNtYyxIV01fRTAwMTQsSFdNX0UwMDE0X01TRykgOyBcCisJCX0KKworI2RlZmluZQlDSEVDS19ETUEoKSB7CXVfbG9uZyBrID0gMTAwMDAgOyBcCisJCSB3aGlsZSAoayAmJiAoRE1BX0JVU1koKSkpIHsgXAorCQkJay0tIDsgXAorCQkJQlVTX0NIRUNLKCkgOyBcCisJCSB9IFwKKwkJIGlmICghaykgU01UX1BBTklDKHNtYyxIV01fRTAwMDMsSFdNX0UwMDAzX01TRykgOyB9CisKKyNkZWZpbmUJQ0hFQ0tfRklGTygpIHt1X2xvbmcgayA9IDEwMDAwMDAgO1wKKwkJIHdoaWxlIChrICYmIChGSUZPX0JVU1koKSkpIGstLSA7XAorCQkgaWYgKCFrKSBTTVRfUEFOSUMoc21jLEhXTV9FMDAxOSxIV01fRTAwMTlfTVNHKSA7IH0KKworI2RlZmluZQlDSEVDS19ETUFfRklGTygpIHt1X2xvbmcgayA9IDEwMDAwMDAgO1wKKwkJIHdoaWxlIChrICYmIChETUFfRklGT19CVVNZKCkpKSB7IFwKKwkJCWstLSA7XAorCQkJQlVTX0NIRUNLKCkgOyBcCisJCSB9IFwKKwkJIGlmICghaykgU01UX1BBTklDKHNtYyxIV01fRTAwMDQsSFdNX0UwMDA0X01TRykgOyB9CisKKyNpZm5kZWYgVU5JWAorI2RlZmluZQlDTElfRkJJKCkJb3V0cChBRERSKElSUV9PVEhfRElTKSwwKQorI2Vsc2UKKyNkZWZpbmUJQ0xJX0ZCSShzbWMpCW91dHAoQUREUlMoKHNtYyksSVJRX09USF9ESVMpLDApCisjZW5kaWYKKworI2lmbmRlZglUQ0kKKyNkZWZpbmUJQ0xJX0ZCSV9TTVAoaW9wKQlvdXRwKChpb3ApK0lSUV9PVEhfRElTLDApCisjZWxzZQorI2RlZmluZQlDTElfRkJJX1NNUChpb3ApCW91dHAoKGlvcCkrSVJRX09USF9ESVMsMCkgO1wKKwkJCQlvdXRwKChpb3ApK0lSUV9UQ19ESVMsMCkKKyNlbmRpZgorCisjaWZuZGVmIFVOSVgKKyNkZWZpbmUJU1RJX0ZCSSgpCW91dHAoQUREUihJUlFfT1RIX0VOKSwwKQorI2Vsc2UKKyNkZWZpbmUJU1RJX0ZCSShzbWMpCW91dHAoQUREUlMoKHNtYyksSVJRX09USF9FTiksMCkKKyNlbmRpZgorCisvKgorICogVGVybWluYWwgY291bnQgcHJpbWl0aXZlcworICovCisjZGVmaW5lIENMSV9UQ0koc21jKQlvdXRwKEFERFJTKChzbWMpLElSUV9UQ19ESVMpLDApCisjZGVmaW5lIFNUSV9UQ0koc21jKQlvdXRwKEFERFJTKChzbWMpLElSUV9UQ19FTiksMCkKKyNkZWZpbmUgQ0hFQ0tfVEMoc21jLGspCXsoaykgPSAxMDAwMCA7XAorCXdoaWxlICgoaykgJiYgKH5pbnB3KElTUjJfQSkgJiBJU19UQykpIChrKS0tIDtcCisJaWYgKCFrKSBTTVRfUEFOSUMoc21jLEhXTV9FMDAxOCxIV01fRTAwMThfTVNHKSA7IH0KKworI2VuZGlmCS8qIE1DQSAqLworCisjaWZkZWYJSVNBCisKKy8qCisgKiBhZGRyZXNzIHRyYW5zbWlzc2lvbiBmcm9tIGxvZ2ljIE5QQUREUjYtMCB0byBwaHlzaWNhbCBvZmZzZXQgYWRkcmVzcyBvbiBib2FyZAorICovCisjZGVmaW5lIEZNQShhKQkoMHg4MDAwfCgoKGEpJjB4MDcpPDwxKXwoKChhKSYweDc4KTw8NykpICAvKiBGT1JNQUMrIChyL3cpICovCisjZGVmaW5lIFBSQShhKQkoMHgxMDAwfCgoKGEpJjB4MDcpPDwxKXwoKChhKSYweDE4KTw8NykpICAvKiBQUk9NIChyZWFkIG9ubHkpKi8KKyNkZWZpbmUgUDFBKGEpCSgweDQwMDB8KCgoYSkmMHgwNyk8PDEpfCgoKGEpJjB4MTgpPDw3KSkgIC8qIFBMQzEgKHIvdykgKi8KKyNkZWZpbmUgUDJBKGEpCSgweDUwMDB8KCgoYSkmMHgwNyk8PDEpfCgoKGEpJjB4MTgpPDw3KSkgIC8qIFBMQzIgKHIvdykgKi8KKyNkZWZpbmUgVElBKGEpCSgweDYwMDB8KCgoYSkmMHgwMyk8PDEpKQkJICAvKiBUaW1lciAoci93KSAqLworCisjZGVmaW5lCUlTUkEJMHgwMDAwCQkvKiBpbnQuIHNvdXJjZSByZWdpc3RlciBhZGRyZXNzIChyZWFkIG9ubHkpICovCisjZGVmaW5lCUFDTEEJMHgwMDAwCQkvKiBhZGRyZXNzIGNvdW50ZXIgbG93IGFkZHJlc3MgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lCUFDSEEJMHgwMDAyCQkvKiBhZGRyZXNzIGNvdW50ZXIgaGlnaCBhZGRyZXNzICh3cml0ZSBvbmx5KSAqLworI2RlZmluZQlUUkNBCTB4MDAwNAkJLyogdHJhbnNmZXIgY291bnRlciBhZGRyZXNzICh3cml0ZSBvbmx5KSAqLworI2RlZmluZQlQR1JBCTB4MDAwNgkJLyogcGFnZSByZWdpc3RlciBhZGRyZXNzICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBSUUFBCTB4MjAwMAkJLyogUmVxdWVzdCByZWcuICh3cml0ZSBvbmx5KSAqLworI2RlZmluZQlDU1JBCTB4MzAwMAkJLyogY29udHJvbC9zdGF0dXMgcmVnaXN0ZXIgYWRkcmVzcyAoci93KSAqLworCisvKgorICogcGh5c2ljYWwgYWRkcmVzcyBvZmZzZXQgKyBJTy1Qb3J0IGJhc2UgYWRkcmVzcworICovCisjZGVmaW5lIEZNX0EoYSkJKEZNQShhKStzbWMtPmh3LmlvcCkJLyogRk9STUFDIFBsdXMgcGh5c2ljYWwgYWRkciAqLworI2RlZmluZSBQUl9BKGEpCShQUkEoYSkrc21jLT5ody5pb3ApCS8qIFBST00gKHJlYWQgb25seSkqLworI2RlZmluZSBQMV9BKGEpCShQMUEoYSkrc21jLT5ody5pb3ApCS8qIFBMQzEgKHIvdykgKi8KKyNkZWZpbmUgUDJfQShhKQkoUDJBKGEpK3NtYy0+aHcuaW9wKQkvKiBQTEMyIChyL3cpICovCisjZGVmaW5lIFRJX0EoYSkJKFRJQShhKStzbWMtPmh3LmlvcCkJLyogVGltZXIgKHIvdykgKi8KKworI2RlZmluZQlJU1JfQQkoMHgwMDAwK3NtYy0+aHcuaW9wKSAvKiBpbnQuIHNvdXJjZSByZWdpc3RlciBhZGRyZXNzIChyZWFkIG9ubHkpICovCisjZGVmaW5lCUFDTF9BCSgweDAwMDArc21jLT5ody5pb3ApIC8qIGFkZHJlc3MgY291bnRlciBsb3cgYWRkcmVzcyAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUJQUNIX0EJKDB4MDAwMitzbWMtPmh3LmlvcCkgLyogYWRkcmVzcyBjb3VudGVyIGhpZ2ggYWRkcmVzcyAod3JpdGUgb25seSkqLworI2RlZmluZQlUUkNfQQkoMHgwMDA0K3NtYy0+aHcuaW9wKSAvKiB0cmFuc2ZlciBjb3VudGVyIGFkZHJlc3MgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lCVBHUl9BCSgweDAwMDYrc21jLT5ody5pb3ApIC8qIHBhZ2UgcmVnaXN0ZXIgYWRkcmVzcyAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUlFBX0EJKDB4MjAwMCtzbWMtPmh3LmlvcCkgLyogUmVxdWVzdCByZWcuICh3cml0ZSBvbmx5KSAqLworI2RlZmluZQlDU1JfQQkoMHgzMDAwK3NtYy0+aHcuaW9wKSAvKiBjb250cm9sL3N0YXR1cyByZWdpc3RlciBhZGRyZXNzIChyL3cpICovCisjaWZkZWYgVU5JWAorI2RlZmluZQlDU1JfQVMoc21jKSAoMHgzMDAwKyhzbWMpLT5ody5pb3ApIC8qIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKyNlbmRpZgorI2RlZmluZQlQTEMxX0kJKDB4MzQwMCtzbWMtPmh3LmlvcCkgLyogY2xlYXIgUExDMSBpbnRlcnJ1cHQgYml0ICovCisjZGVmaW5lCVBMQzJfSQkoMHgzODAwK3NtYy0+aHcuaW9wKSAvKiBjbGVhciBQTEMyIGludGVycnVwdCBiaXQgKi8KKworI2lmbmRlZglNVUxUX09FTQorI2lmbmRlZglPRU1fQ09OQ0VQVAorI2RlZmluZQlTS0xPR09fU1RSCSJTS0ZEREkiCisjZWxzZQkvKiBPRU1fQ09OQ0VQVCAqLworI2RlZmluZQlTS0xPR09fU1RSCU9FTV9GRERJX0xPR08KKyNlbmRpZgkvKiBPRU1fQ09OQ0VQVCAqLworI2VuZGlmICAvKiBNVUxUX09FTSAqLworI2RlZmluZQlTQUREUkwJKDI0KQkJLyogc3RhcnQgYWRkcmVzcyBTS0xPR08gKi8KKyNkZWZpbmUJU0FfTUFDCSgwKQkJLyogc3RhcnQgYWRkci4gTUFDX0FEIHdpdGhpbiB0aGUgUFJPTSAqLworI2RlZmluZQlQUkFfT0ZGCSgwKQorI2RlZmluZSBTQV9QTURfVFlQRQkoOCkJLyogc3RhcnQgYWRkci4gUE1ELVR5cGUgKi8KKworI2RlZmluZQlDRElECShQUkEoU0FERFJMKSkJLyogQ2FyZCBJRCBpbnQvTyBwb3J0IGFkZHIuIG9mZnNldCAqLworI2RlZmluZQlORVhUX0NESUQJKChQUkEoU0FERFJMKzEpKSAtIENESUQpCisKKyNkZWZpbmUJU0tGRERJX1BTWgkzMgkJLyogYWRkcmVzcyBQUk9NIHNpemUgKi8KKworI2RlZmluZQlSRUFEX1BST00oYSkJKCh1X2NoYXIpaW5wdyhhKSkKKyNkZWZpbmUJR0VUX1BBR0UoaSkJb3V0cHcoUEdSX0EsKGludCkoaSkpCisKKyNkZWZpbmUJTUFYX1BBR0VTCTE2CQkvKiAxNiBwYWdlcyAqLworI2RlZmluZQlNQVhfRkFERFIJMHgyMDAwCQkvKiA4SyBwZXIgcGFnZSAqLworI2RlZmluZQlWUFBfT0ZGKCkJb3V0cHcoQ1NSX0EsKGlucHcoQ1NSX0EpICYgKENTX0NSRVNFVHxDU19CWVBBU1MpKSkKKyNkZWZpbmUJVlBQX09OKCkJb3V0cHcoQ1NSX0EsKGlucHcoQ1NSX0EpICYgKENTX0NSRVNFVHxDU19CWVBBU1MpKSB8IFwKKwkJCQlDU19WUFBTVykKKworLyoKKyAqIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyIENTUkEJYml0cyAobG9nLiBhZGRyOiAweDMwMDApCisgKi8KKy8qIHdyaXRlICovCisjZGVmaW5lIENTX0NSRVNFVAkweDAxCQkvKiBDYXJkIHJlc2V0ICgwPXJlc2V0KSAqLworI2RlZmluZQlDU19JTVNLCQkweDAyCQkvKiBlbmFibGUgSVJRICgxPWVuYWJsZSwgMD1kaXNhYmxlKSAqLworI2RlZmluZSBDU19SRVNJTlQxCTB4MDQJCS8qIFBMSU5UMSByZXNldCAqLworI2RlZmluZQlDU19WUFBTVwkweDEwCQkvKiAxMlYgcG93ZXIgc3dpdGNoICgwPW9mZiwgMT1vbikgKi8KKyNkZWZpbmUgQ1NfQllQQVNTCTB4MjAJCS8qIGJ5cGFzcyBzd2l0Y2ggKDA9cmVtb3ZlLCAxPWluc2VydCkqLworI2RlZmluZSBDU19SRVNJTlQyCTB4NDAJCS8qIFBMSU5UMiByZXNldCAqLworLyogcmVhZCAqLworI2RlZmluZQlDU19CVVNZCQkweDA0CQkvKiBtYXN0ZXIgdHJhbnNmZXIgYWN0aXYgKD0xKSAqLworI2RlZmluZQlDU19TV19FUFJPTQkweDA4CQkvKiAwPUFwcGxpY2F0aW9uIFNvZnQuIDE9Qk9PVC1FUFJPTSAqLworI2RlZmluZQlDU19CWVNUQVQJMHg0MAkJLyogMD1CeXBhc3MgZXhpc3QsIDE9IC4ubm90ICovCisjZGVmaW5lCUNTX1NBUwkJMHg4MAkJLyogc2luZ2xlIGF0dGFjaGVtZW50IHN0YXRpb24gKD0xKSAqLworCisvKgorICogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciBJU1JBIChsb2cuIGFkZHI6IDB4MDAwMCkgcmVhZCBvbmx5ICYgbG93IGFjdGl2LgorICovCisjZGVmaW5lIElTX01JTlRSMQkweDAxCQkvKiBGT1JNQUMgU1QxVS9MICYmIH5JTVNLMVUvTCovCisjZGVmaW5lIElTX01JTlRSMgkweDAyCQkvKiBGT1JNQUMgU1QyVS9MICYmIH5JTVNLMlUvTCovCisjZGVmaW5lIElTX1BMSU5UMQkweDA0CQkvKiBQTEMxICovCisjZGVmaW5lIElTX1BMSU5UMgkweDA4CQkvKiBQTEMyICovCisjZGVmaW5lIElTX1RJTUlOVAkweDEwCQkvKiBUaW1lciA4MkM1NC0yICovCisKKyNkZWZpbmUJQUxMX0lSU1IJKElTX01JTlRSMXxJU19NSU5UUjJ8SVNfUExJTlQxfElTX1BMSU5UMnxJU19USU1JTlQpCisKKyNkZWZpbmUJRlBST01fU1coKQkoaW5wdyhDU1JfQSkmQ1NfU1dfRVBST00pCisjZGVmaW5lCURNQV9CVVNZKCkJKGlucHcoQ1NSX0EpJkNTX0JVU1kpCisjZGVmaW5lIENIRUNLX0ZJRk8oKQorI2RlZmluZQlCVVNfQ0hFQ0soKQorCisvKgorICogc2V0IEhvc3QgUmVxdWVzdCByZWdpc3RlciAod3IuKQorICovCisjZGVmaW5lIFNFVF9IUlEocXVwKQlvdXRwdyhSUUFfQSsoKHF1cCk8PDEpLDApCisKKyNpZm5kZWYgVU5JWAorI2lmbmRlZiBXSU5OVAorI2RlZmluZQlDTElfRkJJKCkJb3V0cHcoQ1NSX0EsKGlucHcoQ1NSX0EpJihDU19DUkVTRVR8Q1NfQllQQVNTfENTX1ZQUFNXKSkpCisjZWxzZQorI2RlZmluZQlDTElfRkJJKCkJb3V0cHcoQ1NSX0EsKGxfaW5wdyhDU1JfQSkgJiBcCisJCQkJKENTX0NSRVNFVHxDU19CWVBBU1N8Q1NfVlBQU1cpKSkKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUJQ0xJX0ZCSShzbWMpCW91dHB3KENTUl9BUyhzbWMpLChpbnB3KENTUl9BUyhzbWMpKSYgXAorCQkJCQkJKENTX0NSRVNFVHxDU19CWVBBU1N8Q1NfVlBQU1cpKSkKKyNlbmRpZgorCisjaWZuZGVmIFVOSVgKKyNkZWZpbmUJU1RJX0ZCSSgpCW91dHB3KENTUl9BLChpbnB3KENTUl9BKSAmIFwKKwkJCQkoQ1NfQ1JFU0VUfENTX0JZUEFTU3xDU19WUFBTVykpIHwgQ1NfSU1TSykKKyNlbHNlCisjZGVmaW5lCVNUSV9GQkkoc21jKQlvdXRwdyhDU1JfQVMoc21jKSwoaW5wdyhDU1JfQVMoc21jKSkgJiBcCisJCQkJKENTX0NSRVNFVHxDU19CWVBBU1N8Q1NfVlBQU1cpKSB8IENTX0lNU0spCisjZW5kaWYKKworI2RlZmluZSBDSEVDS19ETUEoKQl7dW5zaWduZWQgayA9IDEwMDAwIDtcCisJCQl3aGlsZSAoayAmJiAoRE1BX0JVU1koKSkpIGstLSA7XAorCQkJaWYgKCFrKSBTTVRfUEFOSUMoc21jLEhXTV9FMDAwMyxIV01fRTAwMDNfTVNHKSA7IH0KKworI2RlZmluZQlHRVRfSVNSKCkJfmlucHcoSVNSX0EpCisKKyNlbmRpZgkvKiBJU0EgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYJUENJCisKKy8qCisgKgkoRFYpCT0gb25seSBkZWZpbmVkIGZvciBEYSBWaW5jaQorICoJKE1MKQk9IG9ubHkgZGVmaW5lZCBmb3IgTW9uYWxpc2EKKyAqLworCisvKgorICogQ29uZmlndXJhdGlvbiBTcGFjZSBoZWFkZXIKKyAqLworI2RlZmluZQlQQ0lfVkVORE9SX0lECTB4MDAJLyogMTYgYml0CVZlbmRvciBJRCAqLworI2RlZmluZQlQQ0lfREVWSUNFX0lECTB4MDIJLyogMTYgYml0CURldmljZSBJRCAqLworI2RlZmluZQlQQ0lfQ09NTUFORAkweDA0CS8qIDE2IGJpdAlDb21tYW5kICovCisjZGVmaW5lCVBDSV9TVEFUVVMJMHgwNgkvKiAxNiBiaXQJU3RhdHVzICovCisjZGVmaW5lCVBDSV9SRVZfSUQJMHgwOAkvKiAgOCBiaXQJUmV2aXNpb24gSUQgKi8KKyNkZWZpbmUJUENJX0NMQVNTX0NPREUJMHgwOQkvKiAyNCBiaXQJQ2xhc3MgQ29kZSAqLworI2RlZmluZQlQQ0lfQ0FDSEVfTFNaCTB4MGMJLyogIDggYml0CUNhY2hlIExpbmUgU2l6ZSAqLworI2RlZmluZQlQQ0lfTEFUX1RJTQkweDBkCS8qICA4IGJpdAlMYXRlbmN5IFRpbWVyICovCisjZGVmaW5lCVBDSV9IRUFERVJfVAkweDBlCS8qICA4IGJpdAlIZWFkZXIgVHlwZSAqLworI2RlZmluZQlQQ0lfQklTVAkweDBmCS8qICA4IGJpdAlCdWlsdC1pbiBzZWxmdGVzdCAqLworI2RlZmluZQlQQ0lfQkFTRV8xU1QJMHgxMAkvKiAzMiBiaXQJMXN0IEJhc2UgYWRkcmVzcyAqLworI2RlZmluZQlQQ0lfQkFTRV8yTkQJMHgxNAkvKiAzMiBiaXQJMm5kIEJhc2UgYWRkcmVzcyAqLworLyogQnl0ZSAxOC4uMmI6CVJlc2VydmVkICovCisjZGVmaW5lCVBDSV9TVUJfVklECTB4MmMJLyogMTYgYml0CVN1YnN5c3RlbSBWZW5kb3IgSUQgKi8KKyNkZWZpbmUJUENJX1NVQl9JRAkweDJlCS8qIDE2IGJpdAlTdWJzeXN0ZW0gSUQgKi8KKyNkZWZpbmUJUENJX0JBU0VfUk9NCTB4MzAJLyogMzIgYml0CUV4cGFuc2lvbiBST00gQmFzZSBBZGRyZXNzICovCisvKiBCeXRlIDM0Li4zMzoJUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NBUF9QVFIJMHgzNAkvKiAgOCBiaXQgKE1MKQlDYXBhYmlsaXRpZXMgUHRyICovCisvKiBCeXRlIDM1Li4zYjoJUmVzZXJ2ZWQgKi8KKyNkZWZpbmUJUENJX0lSUV9MSU5FCTB4M2MJLyogIDggYml0CUludGVycnVwdCBMaW5lICovCisjZGVmaW5lCVBDSV9JUlFfUElOCTB4M2QJLyogIDggYml0CUludGVycnVwdCBQaW4gKi8KKyNkZWZpbmUJUENJX01JTl9HTlQJMHgzZQkvKiAgOCBiaXQJTWluX0dudCAqLworI2RlZmluZQlQQ0lfTUFYX0xBVAkweDNmCS8qICA4IGJpdAlNYXhfTGF0ICovCisvKiBEZXZpY2UgRGVwZW5kZW50IFJlZ2lvbiAqLworI2RlZmluZQlQQ0lfT1VSX1JFRwkweDQwCS8qIDMyIGJpdCAoRFYpCU91ciBSZWdpc3RlciAqLworI2RlZmluZQlQQ0lfT1VSX1JFR18xCTB4NDAJLyogMzIgYml0IChNTCkJT3VyIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJUENJX09VUl9SRUdfMgkweDQ0CS8qIDMyIGJpdCAoTUwpCU91ciBSZWdpc3RlciAyICovCisvKiBQb3dlciBNYW5hZ2VtZW50IFJlZ2lvbiAqLworI2RlZmluZSBQQ0lfUE1fQ0FQX0lECTB4NDgJLyogIDggYml0IChNTCkJUG93ZXIgTWFuYWdlbWVudCBDYXAuIElEICovCisjZGVmaW5lIFBDSV9QTV9OSVRFTQkweDQ5CS8qICA4IGJpdCAoTUwpCU5leHQgSXRlbSBQdHIgKi8KKyNkZWZpbmUgUENJX1BNX0NBUF9SRUcJMHg0YQkvKiAxNiBiaXQgKE1MKQlQb3dlciBNYW5hZ2VtZW50IENhcGFiaWxpdGllcyAqLworI2RlZmluZSBQQ0lfUE1fQ1RMX1NUUwkweDRjCS8qIDE2IGJpdCAoTUwpCVBvd2VyIE1hbmFnLiBDb250cm9sL1N0YXR1cyAqLworLyogQnl0ZSAweDRlOglSZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfUE1fREFUX1JFRwkweDRmCS8qICA4IGJpdCAoTUwpCVBvd2VyIE1hbmFnLiBEYXRhIFJlZ2lzdGVyICovCisvKiBWUEQgUmVnaW9uICovCisjZGVmaW5lCVBDSV9WUERfQ0FQX0lECTB4NTAJLyogIDggYml0IChNTCkJVlBEIENhcC4gSUQgKi8KKyNkZWZpbmUgUENJX1ZQRF9OSVRFTQkweDUxCS8qICA4IGJpdCAoTUwpCU5leHQgSXRlbSBQdHIgKi8KKyNkZWZpbmUgUENJX1ZQRF9BRFJfUkVHCTB4NTIJLyogMTYgYml0IChNTCkJVlBEIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1ZQRF9EQVRfUkVHCTB4NTQJLyogMzIgYml0IChNTCkJVlBEIERhdGEgUmVnaXN0ZXIgKi8KKy8qIEJ5dGUgNTguLmZmOglSZXNlcnZlZCAqLworCisvKgorICogSTJDIEFkZHJlc3MgKFBDSSBDb25maWcpCisgKgorICogTm90ZTogVGhlIHRlbXBlcmF0dXJlIGFuZCB2b2x0YWdlIHNlbnNvcnMgYXJlIHJlbG9jYXRlZCBvbiBhIGRpZmZlcmVudAorICoJIEkyQyBidXMuCisgKi8KKyNkZWZpbmUgSTJDX0FERFJfVlBECTB4QTAJLyogSTJDIGFkZHJlc3MgZm9yIHRoZSBWUEQgRUVQUk9NICovIAorCisvKgorICogRGVmaW5lIEJpdHMgYW5kIFZhbHVlcyBvZiB0aGUgcmVnaXN0ZXJzCisgKi8KKy8qCVBDSV9WRU5ET1JfSUQJMTYgYml0CVZlbmRvciBJRCAqLworLyoJUENJX0RFVklDRV9JRAkxNiBiaXQJRGV2aWNlIElEICovCisvKiBWYWx1ZXMgZm9yIFZlbmRvciBJRCBhbmQgRGV2aWNlIElEIHNoYWxsIGJlIHBhdGNoZWQgaW50byB0aGUgY29kZSAqLworLyoJUENJX0NPTU1BTkQJMTYgYml0CUNvbW1hbmQgKi8KKyNkZWZpbmUJUENJX0ZCVEVOCTB4MDIwMAkvKiBCaXQgOToJRmFzdCBCYWNrLVRvLUJhY2sgZW5hYmxlICovCisjZGVmaW5lCVBDSV9TRVJSRU4JMHgwMTAwCS8qIEJpdCA4OglTRVJSIGVuYWJsZSAqLworI2RlZmluZQlQQ0lfQURTVEVQCTB4MDA4MAkvKiBCaXQgNzoJQWRkcmVzcyBTdGVwcGluZyAqLworI2RlZmluZQlQQ0lfUEVSUkVOCTB4MDA0MAkvKiBCaXQgNjoJUGFyaXR5IFJlcG9ydCBSZXNwb25zZSBlbmFibGUgKi8KKyNkZWZpbmUJUENJX1ZHQV9TTk9PUAkweDAwMjAJLyogQml0IDU6CVZHQSBwYWxldHRlIHNub29wICovCisjZGVmaW5lCVBDSV9NV0lFTgkweDAwMTAJLyogQml0IDQ6CU1lbW9yeSB3cml0ZSBhbiBpbnYgY3ljbCBlbmEgKi8KKyNkZWZpbmUJUENJX1NDWUNFTgkweDAwMDgJLyogQml0IDM6CVNwZWNpYWwgQ3ljbGUgZW5hYmxlICovCisjZGVmaW5lCVBDSV9CTUVOCTB4MDAwNAkvKiBCaXQgMjoJQnVzIE1hc3RlciBlbmFibGUgKi8KKyNkZWZpbmUJUENJX01FTUVOCTB4MDAwMgkvKiBCaXQgMToJTWVtb3J5IFNwYWNlIEFjY2VzcyBlbmFibGUgKi8KKyNkZWZpbmUJUENJX0lPRU4JMHgwMDAxCS8qIEJpdCAwOglJTyBTcGFjZSBBY2Nlc3MgZW5hYmxlICovCisKKy8qCVBDSV9TVEFUVVMJMTYgYml0CVN0YXR1cyAqLworI2RlZmluZQlQQ0lfUEVSUgkweDgwMDAJLyogQml0IDE1OglQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUJUENJX1NFUlIJMHg0MDAwCS8qIEJpdCAxNDoJU2lnbmFsZWQgU0VSUiAqLworI2RlZmluZQlQQ0lfUk1BQk9SVAkweDIwMDAJLyogQml0IDEzOglSZWNlaXZlZCBNYXN0ZXIgQWJvcnQgKi8KKyNkZWZpbmUJUENJX1JUQUJPUlQJMHgxMDAwCS8qIEJpdCAxMjoJUmVjZWl2ZWQgVGFyZ2V0IEFib3J0ICovCisjZGVmaW5lCVBDSV9TVEFCT1JUCTB4MDgwMAkvKiBCaXQgMTE6CVNlbnQgVGFyZ2V0IEFib3J0ICovCisjZGVmaW5lCVBDSV9ERVZTRUwJMHgwNjAwCS8qIEJpdCAxMC4uOToJREVWU0VMIFRpbWluZyAqLworI2RlZmluZQlQQ0lfREVWX0ZBU1QJKDA8PDkpCS8qCQlmYXN0ICovCisjZGVmaW5lCVBDSV9ERVZfTUVESVVNCSgxPDw5KQkvKgkJbWVkaXVtICovCisjZGVmaW5lCVBDSV9ERVZfU0xPVwkoMjw8OSkJLyoJCXNsb3cgKi8KKyNkZWZpbmUJUENJX0RBVEFQRVJSCTB4MDEwMAkvKiBCaXQgODoJREFUQSBQYXJpdHkgZXJyb3IgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUJUENJX0ZCMkJDQVAJMHgwMDgwCS8qIEJpdCA3OglGYXN0IEJhY2stdG8tQmFjayBDYXBhYmlsaXR5ICovCisjZGVmaW5lCVBDSV9VREYJCTB4MDA0MAkvKiBCaXQgNjoJVXNlciBEZWZpbmVkIEZlYXR1cmVzICovCisjZGVmaW5lIFBDSV82Nk1IWkNBUAkweDAwMjAJLyogQml0IDU6CTY2IE1IeiBQQ0kgYnVzIGNsb2NrIGNhcGFibGUgKi8KKyNkZWZpbmUgUENJX05FV0NBUAkweDAwMTAJLyogQml0IDQ6CU5ldyBjYXAuIGxpc3QgaW1wbGVtZW50ZWQgKi8KKworI2RlZmluZSBQQ0lfRVJSQklUUwkoUENJX1BFUlJ8UENJX1NFUlJ8UENJX1JNQUJPUlR8UENJX1NUQUJPUlR8UENJX0RBVEFQRVJSKQorCisvKglQQ0lfUkVWX0lECTggYml0CVJldmlzaW9uIElEICovCisvKglQQ0lfQ0xBU1NfQ09ERQkyNCBiaXQJQ2xhc3MgQ29kZSAqLworLyoJQnl0ZSAyOgkJQmFzZSBDbGFzcwkJKDAyKSAqLworLyoJQnl0ZSAxOgkJU3ViQ2xhc3MJCSgwMikgKi8KKy8qCUJ5dGUgMDoJCVByb2dyYW1taW5nIEludGVyZmFjZQkoMDApICovCisKKy8qCVBDSV9DQUNIRV9MU1oJOCBiaXQJQ2FjaGUgTGluZSBTaXplICovCisvKglQb3NzaWJsZSB2YWx1ZXM6IDAsMiw0LDgsMTYJKi8KKworLyoJUENJX0xBVF9USU0JOCBiaXQJTGF0ZW5jeSBUaW1lciAqLworCisvKglQQ0lfSEVBREVSX1QJOCBiaXQJSGVhZGVyIFR5cGUgKi8KKyNkZWZpbmUJUENJX0hEX01GX0RFVgkweDgwCS8qIEJpdCA3OgkwPSBzaW5nbGUsIDE9IG11bHRpLWZ1bmMgZGV2ICovCisjZGVmaW5lCVBDSV9IRF9UWVBFCTB4N2YJLyogQml0IDYuLjA6CUhlYWRlciBMYXlvdXQgMD0gbm9ybWFsICovCisKKy8qCVBDSV9CSVNUCTggYml0CUJ1aWx0LWluIHNlbGZ0ZXN0ICovCisjZGVmaW5lCVBDSV9CSVNUX0NBUAkweDgwCS8qIEJpdCA3OglCSVNUIENhcGFibGUgKi8KKyNkZWZpbmUJUENJX0JJU1RfU1QJMHg0MAkvKiBCaXQgNjoJU3RhcnQgQklTVCAqLworI2RlZmluZQlQQ0lfQklTVF9SRVQJMHgwZgkvKiBCaXQgMy4uMDoJQ29tcGxldGlvbiBDb2RlICovCisKKy8qCVBDSV9CQVNFXzFTVAkzMiBiaXQJMXN0IEJhc2UgYWRkcmVzcyAqLworI2RlZmluZQlQQ0lfTUVNU0laRQkweDgwMEwgICAgICAgLyogdXNlIDIga0IgTWVtb3J5IEJhc2UgKi8KKyNkZWZpbmUJUENJX01FTUJBU0VfQklUUyAweGZmZmZmODAwTCAvKiBCaXQgMzEuLjExOglNZW1vcnkgQmFzZSBBZGRyZXNzICovCisjZGVmaW5lCVBDSV9NRU1TSVpFX0JJSVMgMHgwMDAwMDdmMEwgLyogQml0IDEwLi40OglNZW1vcnkgU2l6ZSBSZXEuICovCisjZGVmaW5lCVBDSV9QUkVGRU4JMHgwMDAwMDAwOEwgIC8qIEJpdCAzOgkJUHJlZmV0Y2hhYmxlICovCisjZGVmaW5lCVBDSV9NRU1fVFlQCTB4MDAwMDAwMDZMICAvKiBCaXQgMi4uMToJTWVtb3J5IFR5cGUgKi8KKyNkZWZpbmUJUENJX01FTTMyQklUCSgwPDwxKQkgICAgIC8qIEJhc2UgYWRkciBhbnl3aGVyZSBpbiAzMiBCaXQgcmFuZ2UgKi8KKyNkZWZpbmUJUENJX01FTTFNCSgxPDwxKQkgICAgIC8qIEJhc2UgYWRkciBiZWxvdyAxIE1lZ2FCeXRlICovCisjZGVmaW5lCVBDSV9NRU02NEJJVAkoMjw8MSkJICAgICAvKiBCYXNlIGFkZHIgYW55d2hlcmUgaW4gNjQgQml0IHJhbmdlICovCisjZGVmaW5lCVBDSV9NRU1TUEFDRQkweDAwMDAwMDAxTCAgLyogQml0IDA6CU1lbW9yeSBTcGFjZSBJbmRpYy4gKi8KKworLyoJUENJX0JBU0VfMk5ECTMyIGJpdAkybmQgQmFzZSBhZGRyZXNzICovCisjZGVmaW5lCVBDSV9JT0JBU0UJMHhmZmZmZmYwMEwgIC8qIEJpdCAzMS4uODogIEkvTyBCYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUJUENJX0lPU0laRQkweDAwMDAwMGZjTCAgLyogQml0IDcuLjI6ICAgSS9PIFNpemUgUmVxdWlyZW1lbnRzICovCisjZGVmaW5lCVBDSV9JT1NQQUNFCTB4MDAwMDAwMDFMICAvKiBCaXQgMDoJICAgIEkvTyBTcGFjZSBJbmRpY2F0b3IgKi8KKworLyoJUENJX1NVQl9WSUQJMTYgYml0CVN1YnN5c3RlbSBWZW5kb3IgSUQgKi8KKy8qCVBDSV9TVUJfSUQJMTYgYml0CVN1YnN5c3RlbSBJRCAqLworCisvKglQQ0lfQkFTRV9ST00JMzIgYml0CUV4cGFuc2lvbiBST00gQmFzZSBBZGRyZXNzICovCisjZGVmaW5lCVBDSV9ST01CQVNFCTB4ZmZmZTAwMDBMICAvKiBCaXQgMzEuLjE3OiBST00gQkFTRSBhZGRyZXNzICgxc3QpICovCisjZGVmaW5lCVBDSV9ST01CQVNaCTB4MDAwMWMwMDBMICAvKiBCaXQgMTYuLjE0OiBUcmVhdCBhcyBCQVNFIG9yIFNJWkUgKi8KKyNkZWZpbmUJUENJX1JPTVNJWkUJMHgwMDAwMzgwMEwgIC8qIEJpdCAxMy4uMTE6IFJPTSBTaXplIFJlcXVpcmVtZW50cyAqLworI2RlZmluZQlQQ0lfUk9NRU4JMHgwMDAwMDAwMUwgIC8qIEJpdCAwOgkgICAgQWRkcmVzcyBEZWNvZGUgZW5hYmxlICovCisKKy8qCVBDSV9DQVBfUFRSCTggYml0CU5ldyBDYXBhYmlsaXRpZXMgUG9pbnRlcnMgKi8KKy8qCVBDSV9JUlFfTElORQk4IGJpdAlJbnRlcnJ1cHQgTGluZSAqLworLyoJUENJX0lSUV9QSU4JOCBiaXQJSW50ZXJydXB0IFBpbiAqLworLyoJUENJX01JTl9HTlQJOCBiaXQJTWluX0dudCAqLworLyoJUENJX01BWF9MQVQJOCBiaXQJTWF4X0xhdCAqLworLyogRGV2aWNlIERlcGVuZGVudCBSZWdpb24gKi8KKy8qCVBDSV9PVVJfUkVHCShEVikJMzIgYml0CU91ciBSZWdpc3RlciAqLworLyoJUENJX09VUl9SRUdfMQkoTUwpCTMyIGJpdAlPdXIgUmVnaXN0ZXIgMSAqLworCQkJCSAgLyoJIEJpdCAzMS4uMjk6CXJlc2VydmVkICovCisjZGVmaW5lCVBDSV9QQVRDSF9ESVIJKDNMPDwyNykgIC8qKERWKSBCaXQgMjguLjI3OglFeHQgUGF0Y2hzIGRpcmVjdGlvbiAqLworI2RlZmluZSBQQ0lfUEFUQ0hfRElSXzAJKDFMPDwyNykgIC8qKERWKSBUeXBlIG9mIHRoZSBwaW5zIEVYVF9QQVRDSFM8MS4uMD4gICAqLworI2RlZmluZSBQQ0lfUEFUQ0hfRElSXzEgKDFMPDwyOCkgIC8qCSAgIDAgPSBpbnB1dAkJCSAgICAgKi8KKwkJCQkgIC8qCSAgIDEgPSBvdXRwdXQJCQkgICAgICovCisjZGVmaW5lCVBDSV9FWFRfUEFUQ0hTCSgzTDw8MjUpICAvKihEVikgQml0IDI2Li4yNToJRXh0ZW5kZWQgUGF0Y2hlcyAgICAgKi8KKyNkZWZpbmUgUENJX0VYVF9QQVRDSF8wICgxTDw8MjUpICAvKihEVikJCQkJICAgICAqLworI2RlZmluZSBQQ0lfRVhUX1BBVENIXzEgKDFMPDwyNikgIC8qCSBDTEsgZm9yIE1pY3JvV2lyZSAoTUwpCQkgICAgICovCisjZGVmaW5lIFBDSV9WSU8JCSgxTDw8MjUpICAvKihNTCkJCQkJICAgICAqLworI2RlZmluZQlQQ0lfRU5fQk9PVAkoMUw8PDI0KSAgLyoJIEJpdCAyNDoJRW5hYmxlIEJPT1QgdmlhIFJPTSAgKi8KKwkJCQkgIC8qCSAgIDEgPSBEb24ndCBib290IHdpdGggUk9NCSAgICAgKi8KKwkJCQkgIC8qCSAgIDAgPSBCb290IHdpdGggUk9NCQkgICAgICovCisjZGVmaW5lCVBDSV9FTl9JTwkoMUw8PDIzKSAgLyoJIEJpdCAyMzoJTWFwcGluZyB0byBJTyBzcGFjZSAgKi8KKyNkZWZpbmUJUENJX0VOX0ZQUk9NCSgxTDw8MjIpICAvKgkgQml0IDIyOglGTEFTSCBtYXBwZWQgdG8gbWVtPyAqLworCQkJCSAgLyoJICAgMSA9IE1hcCBGbGFzaCB0byBNZW1vcnkJICAgICAqLworCQkJICAJICAvKgkgICAwID0gRGlzYWJsZSBhbGwgYWRkci4gZGVjb2RpbmcgICAgKi8KKyNkZWZpbmUJUENJX1BBR0VTSVpFCSgzTDw8MjApICAvKgkgQml0IDIxLi4yMDoJRkxBU0ggUGFnZSBTaXplCSAgICAgKi8KKyNkZWZpbmUJUENJX1BBR0VfMTYJKDBMPDwyMCkgIC8qCQkxNiBrIHBhZ2VzCQkgICAgICovCisjZGVmaW5lCVBDSV9QQUdFXzMySwkoMUw8PDIwKSAgLyoJCTMyIGsgcGFnZXMJCSAgICAgKi8KKyNkZWZpbmUJUENJX1BBR0VfNjRLCSgyTDw8MjApICAvKgkJNjQgayBwYWdlcwkJICAgICAqLworI2RlZmluZQlQQ0lfUEFHRV8xMjhLCSgzTDw8MjApICAvKgkJMTI4IGsgcGFnZXMJCSAgICAgKi8KKwkJCQkgIC8qCSBCaXQgMTk6IHJlc2VydmVkIChNTCkgYW5kIChEVikJICAgICAqLworI2RlZmluZQlQQ0lfUEFHRVJFRwkoN0w8PDE2KSAgLyoJIEJpdCAxOC4uMTY6CVBhZ2UgUmVnaXN0ZXIJICAgICAqLworCQkJCSAgLyoJIEJpdCAxNToJcmVzZXJ2ZWQJICAgICAqLworI2RlZmluZQlQQ0lfRk9SQ0VfQkUJKDFMPDwxNCkgIC8qCSBCaXQgMTQ6CUFzc2VydCBhbGwgQkVzIG9uIE1SICovCisjZGVmaW5lCVBDSV9ESVNfTVJMCSgxTDw8MTMpICAvKgkgQml0IDEzOglEaXNhYmxlIE1lbSBSIExpbmUgICAqLworI2RlZmluZQlQQ0lfRElTX01STQkoMUw8PDEyKSAgLyoJIEJpdCAxMjoJRGlzYWJsZSBNZW0gUiBtdWx0aXAgKi8KKyNkZWZpbmUJUENJX0RJU19NV0kJKDFMPDwxMSkgIC8qCSBCaXQgMTE6CURpc2FibGUgTWVtIFcgJiBpbnYgICovCisjZGVmaW5lCVBDSV9ESVNDX0NMUwkoMUw8PDEwKSAgLyoJIEJpdCAxMDoJRGlzYzogY2FjaGVMc3ogYm91bmQgKi8KKyNkZWZpbmUJUENJX0JVUlNUX0RJUwkoMUw8PDkpCSAgLyoJIEJpdCAgOToJQnVyc3QgRGlzYWJsZQkgICAgICovCisjZGVmaW5lCVBDSV9CWVRFX1NXQVAJKDFMPDw4KQkgIC8qKERWKSBCaXQgIDg6CUJ5dGUgU3dhcCBpbiBEQVRBICAgICovCisjZGVmaW5lCVBDSV9TS0VXX0RBUwkoMHhmTDw8NCkgLyoJIEJpdCA3Li40OglTa2V3IEN0cmwsIERBUyBFeHQgICAqLworI2RlZmluZQlQQ0lfU0tFV19CQVNFCSgweGZMPDwwKSAvKgkgQml0IDMuLjA6CVNrZXcgQ3RybCwgQmFzZQkgICAgICovCisKKy8qCVBDSV9PVVJfUkVHXzIJKE1MKQkzMiBiaXQJT3VyIFJlZ2lzdGVyIDIgKE1vbmFsaXNhIG9ubHkpICovCisjZGVmaW5lIFBDSV9WUERfV1JfVEgJKDB4ZmZMPDwyNCkJLyogQml0IDI0Li4zMQlWUEQgV3JpdGUgVGhyZXNob2xkICAqLworI2RlZmluZQlQQ0lfREVWX1NFTAkoMHg3Zkw8PDE3KQkvKiBCaXQgMTcuLjIzCUVFUFJPTSBEZXZpY2UgU2VsZWN0ICovCisjZGVmaW5lCVBDSV9WUERfUk9NX1NaCSg3TDw8MTQpCS8qIEJpdCAxNC4uMTYJVlBEIFJPTSBTaXplCSAgICAgKi8KKwkJCQkJLyogQml0IDEyLi4xMwlyZXNlcnZlZAkgICAgICovCisjZGVmaW5lCVBDSV9QQVRDSF9ESVIyCSgweGZMPDw4KQkvKiBCaXQgIDguLjExCUV4dCBQYXRjaHMgZGlyIDIuLjUgICovCisjZGVmaW5lCVBDSV9QQVRDSF9ESVJfMgkoMUw8PDgpCQkvKiBCaXQgIDgJQ1MgZm9yIE1pY3JvV2lyZSAgICAgKi8KKyNkZWZpbmUJUENJX1BBVENIX0RJUl8zCSgxTDw8OSkKKyNkZWZpbmUJUENJX1BBVENIX0RJUl80CSgxTDw8MTApCisjZGVmaW5lCVBDSV9QQVRDSF9ESVJfNQkoMUw8PDExKQorI2RlZmluZSBQQ0lfRVhUX1BBVENIUzIgKDB4Zkw8PDQpCS8qIEJpdCAgNC4uNwlFeHRlbmRlZCBQYXRjaGVzICAgICAqLworI2RlZmluZQlQQ0lfRVhUX1BBVENIXzIJKDFMPDw0KQkJLyogQml0ICA0CUNTIGZvciBNaWNyb1dpcmUgICAgICovCisjZGVmaW5lCVBDSV9FWFRfUEFUQ0hfMwkoMUw8PDUpCisjZGVmaW5lCVBDSV9FWFRfUEFUQ0hfNAkoMUw8PDYpCisjZGVmaW5lCVBDSV9FWFRfUEFUQ0hfNQkoMUw8PDcpCisjZGVmaW5lCVBDSV9FTl9EVU1NWV9SRAkoMUw8PDMpCQkvKiBCaXQgIDMJRW5hYmxlIER1bW15IFJlYWQgICAgKi8KKyNkZWZpbmUgUENJX1JFVl9ERVNDCSgxTDw8MikJCS8qIEJpdCAgMglSZXZlcnNlIERlc2MuIEJ5dGVzICAqLworI2RlZmluZSBQQ0lfVVNFQUREUjY0CSgxTDw8MSkJCS8qIEJpdCAgMQlVc2UgNjQgQml0IEFkZHJlc3NlICAqLworI2RlZmluZSBQQ0lfVVNFREFUQTY0CSgxTDw8MCkJCS8qIEJpdCAgMAlVc2UgNjQgQml0IERhdGEgYnVzIGV4dCovCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgUmVnaW9uICovCisvKglQQ0lfUE1fQ0FQX0lECQkgOCBiaXQgKE1MKQlQb3dlciBNYW5hZ2VtZW50IENhcC4gSUQgKi8KKy8qCVBDSV9QTV9OSVRFTQkJIDggYml0IChNTCkJTmV4dCBJdGVtIFB0ciAqLworLyoJUENJX1BNX0NBUF9SRUcJCTE2IGJpdCAoTUwpCVBvd2VyIE1hbmFnZW1lbnQgQ2FwYWJpbGl0aWVzKi8KKyNkZWZpbmUJUENJX1BNRV9TVVAJKDB4MWY8PDExKQkvKiBCaXQgMTEuLjE1CVBNIE1hbmFnLiBFdmVudCBTdXBwb3J0Ki8KKyNkZWZpbmUgUENJX1BNX0QyX1NVQgkoMTw8MTApCQkvKiBCaXQgMTAJRDIgU3VwcG9ydCBCaXQJICAgICAqLworI2RlZmluZSBQQ0lfUE1fRDFfU1VCCSgxPDw5KQkJLyogQml0IDkJRDEgU3VwcG9ydCBCaXQgICAgICAgKi8KKwkJCQkJLyogQml0IDYuLjggcmVzZXJ2ZWQJCSAgICAgKi8KKyNkZWZpbmUgUENJX1BNX0RTSQkoMTw8NSkJCS8qIEJpdCA1CURldmljZSBTcGVjaWZpYyBJbml0LiovCisjZGVmaW5lIFBDSV9QTV9BUFMJKDE8PDQpCQkvKiBCaXQgNAlBdXhpYWxpYXJ5IFBvd2VyIFNyYyAqLworI2RlZmluZSBQQ0lfUE1FX0NMT0NLCSgxPDwzKQkJLyogQml0IDMJUE0gRXZlbnQgQ2xvY2sgICAgICAgKi8KKyNkZWZpbmUgUENJX1BNX1ZFUgkoNzw8MCkJCS8qIEJpdCAwLi4yCVBNIFBDSSBTcGVjLiB2ZXJzaW9uICovCisKKy8qCVBDSV9QTV9DVExfU1RTCQkxNiBiaXQgKE1MKQlQb3dlciBNYW5hZy4gQ29udHJvbC9TdGF0dXMgICovCisjZGVmaW5lCVBDSV9QTUVfU1RBVFVTCSgxPDwxNSkJCS8qIEJpdCAxNSAJUEZBIGRvZXNuJ3Qgc3VwLiBQTUUjKi8KKyNkZWZpbmUgUENJX1BNX0RBVF9TQ0wJKDM8PDEzKQkJLyogQml0IDEzLi4xNAlkYXQgcmVnIFNjYWxpbmcgZmFjdG9yICovCisjZGVmaW5lIFBDSV9QTV9EQVRfU0VMCSgweGY8PDkpCS8qIEJpdCAgOS4uMTIJUE0gZGF0YSBzZWxlY3RvciBmaWVsZCAqLworCQkJCQkvKiBCaXQgIDcuLiAyCXJlc2VydmVkCSAgICAgKi8KKyNkZWZpbmUgUENJX1BNX1NUQVRFCSgzPDwwKQkJLyogQml0ICAwLi4gMQlQb3dlciBNYW5hZ2VtZW50IFN0YXRlICovCisjZGVmaW5lIFBDSV9QTV9TVEFURV9EMAkoMDw8MCkJCS8qIEQwOglPcGVyYXRpb25hbCAoZGVmYXVsdCkgKi8KKyNkZWZpbmUJUENJX1BNX1NUQVRFX0QxCSgxPDwwKQkJLyogRDE6CW5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUENJX1BNX1NUQVRFX0QyCSgyPDwwKQkJLyogRDI6CW5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUENJX1BNX1NUQVRFX0QzICgzPDwwKQkJLyogRDM6CUhPVCwgUG93ZXIgRG93biBhbmQgUmVzZXQgKi8KKworLyoJUENJX1BNX0RBVF9SRUcJCSA4IGJpdCAoTUwpCVBvd2VyIE1hbmFnLiBEYXRhIFJlZ2lzdGVyICovCisvKiBWUEQgUmVnaW9uICovCisvKglQQ0lfVlBEX0NBUF9JRAkJIDggYml0IChNTCkJVlBEIENhcC4gSUQgKi8KKy8qCVBDSV9WUERfTklURU0JCSA4IGJpdCAoTUwpCU5leHQgSXRlbSBQdHIgKi8KKy8qCVBDSV9WUERfQURSX1JFRwkJMTYgYml0IChNTCkJVlBEIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUENJX1ZQRF9GTEFHCSgxPDwxNSkJCS8qIEJpdCAxNQlzdGFydHMgVlBEIHJkL3dkIGN5Y2xlKi8KKworLyoJUENJX1ZQRF9EQVRfUkVHCQkzMiBiaXQgKE1MKQlWUEQgRGF0YSBSZWdpc3RlciAqLworCisvKgorICoJQ29udHJvbCBSZWdpc3RlciBGaWxlOgorICoJQmFuayAwCisgKi8KKyNkZWZpbmUJQjBfUkFQCQkweDAwMDAJLyogIDggYml0IHJlZ2lzdGVyIGFkZHJlc3MgcG9ydCAqLworCS8qIDB4MDAwMSAtIDB4MDAwMzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUJQjBfQ1RSTAkJMHgwMDA0CS8qICA4IGJpdCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lCUIwX0RBUwkJMHgwMDA1CS8qICA4IEJpdCBjb250cm9sIHJlZ2lzdGVyIChEQVMpICovCisjZGVmaW5lCUIwX0xFRAkJMHgwMDA2CS8qICA4IEJpdCBMRUQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJQjBfVFNUX0NUUkwJMHgwMDA3CS8qICA4IGJpdCB0ZXN0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJQjBfSVNSQwkJMHgwMDA4CS8qIDMyIGJpdCBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICovCisjZGVmaW5lCUIwX0lNU0sJCTB4MDAwYwkvKiAzMiBiaXQgSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKworLyogMHgwMDEwIC0gMHgwMDZiOglmb3JtYWMrIChzdXBlcm5ldF8zKSBmZXF1ZW50bHkgdXNlZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQjBfQ01EUkVHMQkweDAwMTAJLyogd3JpdGUgY29tbWFuZCByZWcgMSBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBCMF9DTURSRUcyCTB4MDAxNAkvKiB3cml0ZSBjb21tYW5kIHJlZyAyIGluc3RydWN0aW9uICovCisjZGVmaW5lIEIwX1NUMVUJCTB4MDAxMAkvKiByZWFkIHVwcGVyIDE2LWJpdCBvZiBzdGF0dXMgcmVnIDEgKi8KKyNkZWZpbmUgQjBfU1QxTAkJMHgwMDE0CS8qIHJlYWQgbG93ZXIgMTYtYml0IG9mIHN0YXR1cyByZWcgMSAqLworI2RlZmluZSBCMF9TVDJVCQkweDAwMTgJLyogcmVhZCB1cHBlciAxNi1iaXQgb2Ygc3RhdHVzIHJlZyAyICovCisjZGVmaW5lIEIwX1NUMkwJCTB4MDAxYwkvKiByZWFkIGxvd2VyIDE2LWJpdCBvZiBzdGF0dXMgcmVnIDIgKi8KKworI2RlZmluZSBCMF9NQVJSCQkweDAwMjAJLyogci93IHRoZSBtZW1vcnkgcmVhZCBhZGRyIHJlZ2lzdGVyICovCisjZGVmaW5lIEIwX01BUlcJCTB4MDAyNAkvKiByL3cgdGhlIG1lbW9yeSB3cml0ZSBhZGRyIHJlZ2lzdGVyKi8KKyNkZWZpbmUgQjBfTURSVQkJMHgwMDI4CS8qIHIvdyB1cHBlciAxNi1iaXQgb2YgbWVtLiBkYXRhIHJlZyAqLworI2RlZmluZSBCMF9NRFJMCQkweDAwMmMJLyogci93IGxvd2VyIDE2LWJpdCBvZiBtZW0uIGRhdGEgcmVnICovCisKKyNkZWZpbmUJQjBfTURSRUczCTB4MDAzMAkvKiByL3cgTW9kZSBSZWdpc3RlciAzICovCisjZGVmaW5lCUIwX1NUM1UJCTB4MDAzNAkvKiByZWFkIHVwcGVyIDE2LWJpdCBvZiBzdGF0dXMgcmVnIDMgKi8KKyNkZWZpbmUJQjBfU1QzTAkJMHgwMDM4CS8qIHJlYWQgbG93ZXIgMTYtYml0IG9mIHN0YXR1cyByZWcgMyAqLworI2RlZmluZQlCMF9JTVNLM1UJMHgwMDNjCS8qIHIvdyB1cHBlciAxNi1iaXQgb2YgSU1TSyByZWcgMyAqLworI2RlZmluZQlCMF9JTVNLM0wJMHgwMDQwCS8qIHIvdyBsb3dlciAxNi1iaXQgb2YgSU1TSyByZWcgMyAqLworI2RlZmluZQlCMF9JVlIJCTB4MDA0NAkvKiByZWFkIEludGVycnVwdCBWZWN0b3IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJQjBfSU1SCQkweDAwNDgJLyogci93IEludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisvKiAweDRjCUhpZGRlbiAqLworCisjZGVmaW5lIEIwX0NOVFJMX0EJMHgwMDUwCS8qIGNvbnRyb2wgcmVnaXN0ZXIgQSAoci93KSAqLworI2RlZmluZSBCMF9DTlRSTF9CCTB4MDA1NAkvKiBjb250cm9sIHJlZ2lzdGVyIEIgKHIvdykgKi8KKyNkZWZpbmUgQjBfSU5UUl9NQVNLCTB4MDA1OAkvKiBpbnRlcnJ1cHQgbWFzayAoci93KSAqLworI2RlZmluZSBCMF9YTUlUX1ZFQ1RPUgkweDAwNWMJLyogdHJhbnNtaXQgdmVjdG9yIHJlZ2lzdGVyIChyL3cpICovCisKKyNkZWZpbmUgQjBfU1RBVFVTX0EJMHgwMDYwCS8qIHN0YXR1cyByZWdpc3RlciBBIChyZWFkIG9ubHkpICovCisjZGVmaW5lIEIwX1NUQVRVU19CCTB4MDA2NAkvKiBzdGF0dXMgcmVnaXN0ZXIgQiAocmVhZCBvbmx5KSAqLworI2RlZmluZSBCMF9DTlRSTF9DCTB4MDA2OAkvKiBjb250cm9sIHJlZ2lzdGVyIEMgKHIvdykgKi8KKyNkZWZpbmUJQjBfTURSRUcxCTB4MDA2YwkvKiByL3cgTW9kZSBSZWdpc3RlciAxICovCisKKyNkZWZpbmUJQjBfUjFfQ1NSCTB4MDA3MAkvKiAzMiBiaXQgQk1VIGNvbnRyb2wvc3RhdHVzIHJlZyAocmVjIHEgMSkgKi8KKyNkZWZpbmUJQjBfUjJfQ1NSCTB4MDA3NAkvKiAzMiBiaXQgQk1VIGNvbnRyb2wvc3RhdHVzIHJlZyAocmVjIHEgMikoRFYpKi8KKyNkZWZpbmUJQjBfWEFfQ1NSCTB4MDA3OAkvKiAzMiBiaXQgQk1VIGNvbnRyb2wvc3RhdHVzIHJlZyAoYSB4bWl0IHEpICovCisjZGVmaW5lCUIwX1hTX0NTUgkweDAwN2MJLyogMzIgYml0IEJNVSBjb250cm9sL3N0YXR1cyByZWcgKHMgeG1pdCBxKSAqLworCisvKgorICoJQmFuayAxCisgKgktIGNvbXBsZXRlbHkgZW1wdHkgKHRoaXMgaXMgdGhlIFJBUCBCbG9jayB3aW5kb3cpCisgKglOb3RlOiBpZiBSQVAgPSAxIHRoaXMgcGFnZSBpcyByZXNlcnZlZAorICovCisKKy8qCisgKglCYW5rIDIKKyAqLworI2RlZmluZQlCMl9NQUNfMAkweDAxMDAJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgMCAqLworI2RlZmluZQlCMl9NQUNfMQkweDAxMDEJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgMSAqLworI2RlZmluZQlCMl9NQUNfMgkweDAxMDIJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgMiAqLworI2RlZmluZQlCMl9NQUNfMwkweDAxMDMJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgMyAqLworI2RlZmluZQlCMl9NQUNfNAkweDAxMDQJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgNCAqLworI2RlZmluZQlCMl9NQUNfNQkweDAxMDUJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgNSAqLworI2RlZmluZQlCMl9NQUNfNgkweDAxMDYJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgNiAoPT0gMCkgKERWKSAqLworI2RlZmluZQlCMl9NQUNfNwkweDAxMDcJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgNyAoPT0gMCkgKERWKSAqLworCisjZGVmaW5lIEIyX0NPTk5fVFlQCTB4MDEwOAkvKiAgOCBiaXQgQ29ubmVjdG9yIHR5cGUgKi8KKyNkZWZpbmUgQjJfUE1EX1RZUAkweDAxMDkJLyogIDggYml0IFBNRCB0eXBlICovCisJCQkJLyogMHgwMTBhIC0gMHgwMTBiOglyZXNlcnZlZCAqLworCS8qIEVwcm9tIHJlZ2lzdGVycyBhcmUgY3VycmVudGx5IG9mIG5vIHVzZSAqLworI2RlZmluZSBCMl9FXzAJCTB4MDEwYwkvKiAgOCBiaXQgRVBST00gQnl0ZSAwICovCisjZGVmaW5lIEIyX0VfMQkJMHgwMTBkCS8qICA4IGJpdCBFUFJPTSBCeXRlIDEgKi8KKyNkZWZpbmUgQjJfRV8yCQkweDAxMGUJLyogIDggYml0IEVQUk9NIEJ5dGUgMiAqLworI2RlZmluZSBCMl9FXzMJCTB4MDEwZgkvKiAgOCBiaXQgRVBST00gQnl0ZSAzICovCisjZGVmaW5lIEIyX0ZBUgkJMHgwMTEwCS8qIDMyIGJpdCBGbGFzaC1Qcm9tIEFkZHJlc3MgUmVnaXN0ZXIvQ291bnRlciAqLworI2RlZmluZSBCMl9GRFAJCTB4MDExNAkvKiAgOCBiaXQgRmxhc2gtUHJvbSBEYXRhIFBvcnQgKi8KKwkJCQkvKiAweDAxMTUgLSAweDAxMTc6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX0xEX0NSVEwJMHgwMTE4CS8qICA4IGJpdCBsb2FkZXIgY29udHJvbCAqLworI2RlZmluZSBCMl9MRF9URVNUCTB4MDExOQkvKiAgOCBiaXQgbG9hZGVyIHRlc3QgKi8KKwkJCQkvKiAweDAxMWEgLSAweDAxMWY6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX1RJX0lOSQkweDAxMjAJLyogMzIgYml0IFRpbWVyIGluaXQgdmFsdWUgKi8KKyNkZWZpbmUgQjJfVElfVkFMCTB4MDEyNAkvKiAzMiBiaXQgVGltZXIgdmFsdWUgKi8KKyNkZWZpbmUgQjJfVElfQ1JUTAkweDAxMjgJLyogIDggYml0IFRpbWVyIGNvbnRyb2wgKi8KKyNkZWZpbmUgQjJfVElfVEVTVAkweDAxMjkJLyogIDggQml0IFRpbWVyIFRlc3QgKi8KKwkJCQkvKiAweDAxMmEgLSAweDAxMmY6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX1dET0dfSU5JCTB4MDEzMAkvKiAzMiBiaXQgV2F0Y2hkb2cgaW5pdCB2YWx1ZSAqLworI2RlZmluZSBCMl9XRE9HX1ZBTAkweDAxMzQJLyogMzIgYml0IFdhdGNoZG9nIHZhbHVlICovCisjZGVmaW5lIEIyX1dET0dfQ1JUTAkweDAxMzgJLyogIDggYml0IFdhdGNoZG9nIGNvbnRyb2wgKi8KKyNkZWZpbmUgQjJfV0RPR19URVNUCTB4MDEzOQkvKiAgOCBCaXQgV2F0Y2hkb2cgVGVzdCAqLworCQkJCS8qIDB4MDEzYSAtIDB4MDEzZjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjJfUlRNX0lOSQkweDAxNDAJLyogMzIgYml0IFJUTSBpbml0IHZhbHVlICovCisjZGVmaW5lIEIyX1JUTV9WQUwJMHgwMTQ0CS8qIDMyIGJpdCBSVE0gdmFsdWUgKi8KKyNkZWZpbmUgQjJfUlRNX0NSVEwJMHgwMTQ4CS8qICA4IGJpdCBSVE0gY29udHJvbCAqLworI2RlZmluZSBCMl9SVE1fVEVTVAkweDAxNDkJLyogIDggQml0IFJUTSBUZXN0ICovCisKKyNkZWZpbmUgQjJfVE9LX0NPVU5UCTB4MDE0YwkvKiAoTUwpCTMyIGJpdAlUb2tlbiBDb3VudGVyICovCisjZGVmaW5lIEIyX0RFU0NfQUREUl9ICTB4MDE1MAkvKiAoTUwpIDMyIGJpdAlEZXNjaXB0b3IgQmFzZSBBZGRyIFJlZyBIaWdoICovCisjZGVmaW5lIEIyX0NUUkxfMgkweDAxNTQJLyogKE1MKQkgOCBiaXQJQ29udHJvbCBSZWdpc3RlciAyICovCisjZGVmaW5lIEIyX0lGQUNFX1JFRwkweDAxNTUJLyogKE1MKQkgOCBiaXQJSW50ZXJmYWNlIFJlZ2lzdGVyICovCisJCQkJLyogMHgwMTU2OgkJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjJfVFNUX0NUUkxfMgkweDAxNTcJLyogKE1MKSAgOCBiaXQJVGVzdCBDb250cm9sIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgQjJfSTJDX0NUUkwJMHgwMTU4CS8qIChNTCkJMzIgYml0CUkyQyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEIyX0kyQ19EQVRBCTB4MDE1YwkvKiAoTUwpIDMyIGJpdAlJMkMgRGF0YSBSZWdpc3RlciAqLworCisjZGVmaW5lIEIyX0lSUV9NT0RfSU5JCTB4MDE2MAkvKiAoTUwpIDMyIGJpdAlJUlEgTW9kZXJhdGlvbiBUaW1lciBJbml0IFJlZy4gKi8KKyNkZWZpbmUgQjJfSVJRX01PRF9WQUwJMHgwMTY0CS8qIChNTCkJMzIgYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIFZhbHVlICovCisjZGVmaW5lIEIyX0lSUV9NT0RfQ1RSTAkweDAxNjgJLyogKE1MKSAgOCBiaXQJSVJRIE1vZGVyYXRpb24gVGltZXIgQ29udHJvbCAqLworI2RlZmluZSBCMl9JUlFfTU9EX1RFU1QJMHgwMTY5CS8qIChNTCkJIDggYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIFRlc3QgKi8KKwkJCQkvKiAweDAxNmEgLSAweDAxN2Y6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDMKKyAqLworLyoKKyAqIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIGZpbGUgKGxvd2VyIGhhbGYpCisgKi8KKyNkZWZpbmUgQjNfQ0ZHX1NQQwkweDE4MAorCisvKgorICoJQmFuayA0CisgKi8KKyNkZWZpbmUgQjRfUjFfRAkJMHgwMjAwCS8qIAk0KjMyIGJpdCBjdXJyZW50IHJlY2VpdmUgRGVzY3JpcHRvciAgKi8KKyNkZWZpbmUgQjRfUjFfREEJMHgwMjEwCS8qIAkzMiBiaXQgY3VycmVudCByZWMgZGVzYyBhZGRyZXNzCSAgICAgKi8KKyNkZWZpbmUgQjRfUjFfQUMJMHgwMjE0CS8qIAkzMiBiaXQgY3VycmVudCByZWNlaXZlIEFkZHJlc3MgQ291bnQgKi8KKyNkZWZpbmUgQjRfUjFfQkMJMHgwMjE4CS8qCTMyIGJpdCBjdXJyZW50IHJlY2VpdmUgQnl0ZSBDb3VudGVyICAqLworI2RlZmluZSBCNF9SMV9DU1IJMHgwMjFjCS8qIAkzMiBiaXQgQk1VIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUgQjRfUjFfRgkJMHgwMjIwCS8qIAkzMiBiaXQgZmxhZyByZWdpc3RlcgkJICAgICAqLworI2RlZmluZSBCNF9SMV9UMQkweDAyMjQJLyogCTMyIGJpdCBUZXN0IFJlZ2lzdGVyIDEJCSAgICAgKi8KKyNkZWZpbmUgQjRfUjFfVDFfVFIJMHgwMjI0CS8qIAk4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgVFIJICAgICAqLworI2RlZmluZSBCNF9SMV9UMV9XUgkweDAyMjUJLyogCTggYml0IFRlc3QgUmVnaXN0ZXIgMSBXUgkgICAgICovCisjZGVmaW5lIEI0X1IxX1QxX1JECTB4MDIyNgkvKiAJOCBiaXQgVGVzdCBSZWdpc3RlciAxIFJECSAgICAgKi8KKyNkZWZpbmUgQjRfUjFfVDFfU1YJMHgwMjI3CS8qIAk4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgU1YJICAgICAqLworI2RlZmluZSBCNF9SMV9UMgkweDAyMjgJLyogCTMyIGJpdCBUZXN0IFJlZ2lzdGVyIDIJCSAgICAgKi8KKyNkZWZpbmUgQjRfUjFfVDMJMHgwMjJjCS8qIAkzMiBiaXQgVGVzdCBSZWdpc3RlciAzCQkgICAgICovCisjZGVmaW5lIEI0X1IxX0RBX0gJMHgwMjMwCS8qIChNTCkJMzIgYml0IEN1cnIgUnggRGVzYyBBZGRyZXNzIEhpZ2ggICAgICovCisjZGVmaW5lIEI0X1IxX0FDX0gJMHgwMjM0CS8qIChNTCkJMzIgYml0IEN1cnIgQWRkciBDb3VudGVyIEhpZ2ggZHdvcmQgICovCisJCQkJLyogMHgwMjM4IC0gMHgwMjNmOglyZXNlcnZlZAkgICovCisJCQkJLyogUmVjZWl2ZSBxdWV1ZSAyIGlzIHJlbW92ZWQgb24gTW9uYWxpc2EgKi8KKyNkZWZpbmUgQjRfUjJfRAkJMHgwMjQwCS8qIDQqMzIgYml0IGN1cnJlbnQgcmVjZWl2ZSBEZXNjcmlwdG9yCShxMikgKi8KKyNkZWZpbmUgQjRfUjJfREEJMHgwMjUwCS8qIDMyIGJpdCBjdXJyZW50IHJlYyBkZXNjIGFkZHJlc3MJKHEyKSAqLworI2RlZmluZSBCNF9SMl9BQwkweDAyNTQJLyogMzIgYml0IGN1cnJlbnQgcmVjZWl2ZSBBZGRyZXNzIENvdW50CShxMikgKi8KKyNkZWZpbmUgQjRfUjJfQkMJMHgwMjU4CS8qIDMyIGJpdCBjdXJyZW50IHJlY2VpdmUgQnl0ZSBDb3VudGVyCShxMikgKi8KKyNkZWZpbmUgQjRfUjJfQ1NSCTB4MDI1YwkvKiAzMiBiaXQgQk1VIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyCShxMikgKi8KKyNkZWZpbmUgQjRfUjJfRgkJMHgwMjYwCS8qIDMyIGJpdCBmbGFnIHJlZ2lzdGVyCQkJKHEyKSAqLworI2RlZmluZSBCNF9SMl9UMQkweDAyNjQJLyogMzIgYml0IFRlc3QgUmVnaXN0ZXIgMQkJKHEyKSAqLworI2RlZmluZSBCNF9SMl9UMV9UUgkweDAyNjQJLyogOCBiaXQgVGVzdCBSZWdpc3RlciAxIFRSCQkocTIpICovCisjZGVmaW5lIEI0X1IyX1QxX1dSCTB4MDI2NQkvKiA4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgV1IJCShxMikgKi8KKyNkZWZpbmUgQjRfUjJfVDFfUkQJMHgwMjY2CS8qIDggYml0IFRlc3QgUmVnaXN0ZXIgMSBSRAkJKHEyKSAqLworI2RlZmluZSBCNF9SMl9UMV9TVgkweDAyNjcJLyogOCBiaXQgVGVzdCBSZWdpc3RlciAxIFNWCQkocTIpICovCisjZGVmaW5lIEI0X1IyX1QyCTB4MDI2OAkvKiAzMiBiaXQgVGVzdCBSZWdpc3RlciAyCQkocTIpICovCisjZGVmaW5lIEI0X1IyX1QzCTB4MDI2YwkvKiAzMiBiaXQgVGVzdCBSZWdpc3RlciAzCQkocTIpICovCisJCQkJLyogMHgwMjcwIC0gMHgwMjdjOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayA1CisgKi8KKyNkZWZpbmUgQjVfWEFfRAkJMHgwMjgwCS8qIDQqMzIgYml0IGN1cnJlbnQgdHJhbnNtaXQgRGVzY3JpcHRvcgkoeGEpICovCisjZGVmaW5lIEI1X1hBX0RBCTB4MDI5MAkvKiAzMiBiaXQgY3VycmVudCB0eCBkZXNjIGFkZHJlc3MJKHhhKSAqLworI2RlZmluZSBCNV9YQV9BQwkweDAyOTQJLyogMzIgYml0IGN1cnJlbnQgdHggQWRkcmVzcyBDb3VudAkoeGEpICovCisjZGVmaW5lIEI1X1hBX0JDCTB4MDI5OAkvKiAzMiBiaXQgY3VycmVudCB0eCBCeXRlIENvdW50ZXIJKHhhKSAqLworI2RlZmluZSBCNV9YQV9DU1IJMHgwMjljCS8qIDMyIGJpdCBCTVUgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIJKHhhKSAqLworI2RlZmluZSBCNV9YQV9GCQkweDAyYTAJLyogMzIgYml0IGZsYWcgcmVnaXN0ZXIJCQkoeGEpICovCisjZGVmaW5lIEI1X1hBX1QxCTB4MDJhNAkvKiAzMiBiaXQgVGVzdCBSZWdpc3RlciAxCQkoeGEpICovCisjZGVmaW5lIEI1X1hBX1QxX1RSCTB4MDJhNAkvKiA4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgVFIJCSh4YSkgKi8KKyNkZWZpbmUgQjVfWEFfVDFfV1IJMHgwMmE1CS8qIDggYml0IFRlc3QgUmVnaXN0ZXIgMSBXUgkJKHhhKSAqLworI2RlZmluZSBCNV9YQV9UMV9SRAkweDAyYTYJLyogOCBiaXQgVGVzdCBSZWdpc3RlciAxIFJECQkoeGEpICovCisjZGVmaW5lIEI1X1hBX1QxX1NWCTB4MDJhNwkvKiA4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgU1YJCSh4YSkgKi8KKyNkZWZpbmUgQjVfWEFfVDIJMHgwMmE4CS8qIDMyIGJpdCBUZXN0IFJlZ2lzdGVyIDIJCSh4YSkgKi8KKyNkZWZpbmUgQjVfWEFfVDMJMHgwMmFjCS8qIDMyIGJpdCBUZXN0IFJlZ2lzdGVyIDMJCSh4YSkgKi8KKyNkZWZpbmUgQjVfWEFfREFfSAkweDAyYjAJLyogKE1MKQkzMiBiaXQgQ3VyciBUeCBEZXNjIEFkZHJlc3MgSGlnaCAgICAgKi8KKyNkZWZpbmUgQjVfWEFfQUNfSAkweDAyYjQJLyogKE1MKQkzMiBiaXQgQ3VyciBBZGRyIENvdW50ZXIgSGlnaCBkd29yZCAgKi8KKwkJCQkvKiAweDAyYjggLSAweDAyYmM6CXJlc2VydmVkICovCisjZGVmaW5lIEI1X1hTX0QJCTB4MDJjMAkvKiA0KjMyIGJpdCBjdXJyZW50IHRyYW5zbWl0IERlc2NyaXB0b3IJKHhzKSAqLworI2RlZmluZSBCNV9YU19EQQkweDAyZDAJLyogMzIgYml0IGN1cnJlbnQgdHggZGVzYyBhZGRyZXNzCSh4cykgKi8KKyNkZWZpbmUgQjVfWFNfQUMJMHgwMmQ0CS8qIDMyIGJpdCBjdXJyZW50IHRyYW5zbWl0IEFkZHJlc3MgQ291bnQoeHMpICovCisjZGVmaW5lIEI1X1hTX0JDCTB4MDJkOAkvKiAzMiBiaXQgY3VycmVudCB0cmFuc21pdCBCeXRlIENvdW50ZXIJKHhzKSAqLworI2RlZmluZSBCNV9YU19DU1IJMHgwMmRjCS8qIDMyIGJpdCBCTVUgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIJKHhzKSAqLworI2RlZmluZSBCNV9YU19GCQkweDAyZTAJLyogMzIgYml0IGZsYWcgcmVnaXN0ZXIJCQkoeHMpICovCisjZGVmaW5lIEI1X1hTX1QxCTB4MDJlNAkvKiAzMiBiaXQgVGVzdCBSZWdpc3RlciAxCQkoeHMpICovCisjZGVmaW5lIEI1X1hTX1QxX1RSCTB4MDJlNAkvKiA4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgVFIJCSh4cykgKi8KKyNkZWZpbmUgQjVfWFNfVDFfV1IJMHgwMmU1CS8qIDggYml0IFRlc3QgUmVnaXN0ZXIgMSBXUgkJKHhzKSAqLworI2RlZmluZSBCNV9YU19UMV9SRAkweDAyZTYJLyogOCBiaXQgVGVzdCBSZWdpc3RlciAxIFJECQkoeHMpICovCisjZGVmaW5lIEI1X1hTX1QxX1NWCTB4MDJlNwkvKiA4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgU1YJCSh4cykgKi8KKyNkZWZpbmUgQjVfWFNfVDIJMHgwMmU4CS8qIDMyIGJpdCBUZXN0IFJlZ2lzdGVyIDIJCSh4cykgKi8KKyNkZWZpbmUgQjVfWFNfVDMJMHgwMmVjCS8qIDMyIGJpdCBUZXN0IFJlZ2lzdGVyIDMJCSh4cykgKi8KKyNkZWZpbmUgQjVfWFNfREFfSAkweDAyZjAJLyogKE1MKQkzMiBiaXQgQ3VyciBUeCBEZXNjIEFkZHJlc3MgSGlnaCAgICAgKi8KKyNkZWZpbmUgQjVfWFNfQUNfSAkweDAyZjQJLyogKE1MKQkzMiBiaXQgQ3VyciBBZGRyIENvdW50ZXIgSGlnaCBkd29yZCAgKi8KKwkJCQkvKiAweDAyZjggLSAweDAyZmM6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDYKKyAqLworLyogRXh0ZXJuYWwgUExDLVMgcmVnaXN0ZXJzIChTTjIgY29tcGF0aWJpbGl0eSBmb3IgRFYpICovCisvKiBFeHRlcm5hbCByZWdpc3RlcnMgKE1MKSAqLworI2RlZmluZSBCNl9FWFRfUkVHCTB4MzAwCisKKy8qCisgKglCYW5rIDcKKyAqLworLyogREFTIFBMQy1TIFJlZ2lzdGVycyAqLworCisvKgorICoJQmFuayA4IC0gMTUKKyAqLworLyogSUZDUCByZWdpc3RlcnMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRGVmaW5pdGlvbnMgb2YgdGhlIEJpdHMgaW4gdGhlIHJlZ2lzdGVycyAqLworCisvKglCMF9SQVAJCTE2IGJpdCByZWdpc3RlciBhZGRyZXNzIHBvcnQgKi8KKyNkZWZpbmUJUkFQX1JBUAkJMHgwZgkvKiBCaXQgMy4uMDoJMCA9IGJsb2NrMCwgLi4sIGYgPSBibG9jazE1ICovCisKKy8qCUIwX0NUUkwJCTggYml0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ1RSTF9GRERJX0NMUgkoMTw8NykJLyogQml0IDc6IChNTCkJQ2xlYXIgRkRESSBSZXNldCAqLworI2RlZmluZSBDVFJMX0ZERElfU0VUCSgxPDw2KQkvKiBCaXQgNjogKE1MKQlTZXQgRkRESSBSZXNldCAqLworI2RlZmluZQlDVFJMX0hQSV9DTFIJKDE8PDUpCS8qIEJpdCA1OglDbGVhciBIUEkgU00gcmVzZXQgKi8KKyNkZWZpbmUJQ1RSTF9IUElfU0VUCSgxPDw0KQkvKiBCaXQgNDoJU2V0IEhQSSBTTSByZXNldCAqLworI2RlZmluZQlDVFJMX01SU1RfQ0xSCSgxPDwzKQkvKiBCaXQgMzoJQ2xlYXIgTWFzdGVyIHJlc2V0ICovCisjZGVmaW5lCUNUUkxfTVJTVF9TRVQJKDE8PDIpCS8qIEJpdCAyOglTZXQgTWFzdGVyIHJlc2V0ICovCisjZGVmaW5lCUNUUkxfUlNUX0NMUgkoMTw8MSkJLyogQml0IDE6CUNsZWFyIFNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lCUNUUkxfUlNUX1NFVAkoMTw8MCkJLyogQml0IDA6CVNldCBTb2Z0d2FyZSByZXNldCAqLworCisvKglCMF9EQVMJCTggQml0IGNvbnRyb2wgcmVnaXN0ZXIgKERBUykgKi8KKyNkZWZpbmUgQlVTX0NMT0NLCSgxPDw3KQkvKiBCaXQgNzogKE1MKQlCdXMgQ2xvY2sgMC8xID0gMzMvNjZNSHogKi8KKyNkZWZpbmUgQlVTX1NMT1RfU1oJKDE8PDYpCS8qIEJpdCA2OiAoTUwpCVNsb3QgU2l6ZSAwLzEgPSAzMi82NCBiaXQgc2xvdCovCisJCQkJLyogQml0IDUuLjQ6CXJlc2VydmVkICovCisjZGVmaW5lCURBU19BVkFJTAkoMTw8MykJLyogQml0IDM6CTEgPSBEQVMsIDAgPSBTQVMgKi8KKyNkZWZpbmUgREFTX0JZUF9TVAkoMTw8MikJLyogQml0IDI6CTEgPSBhdmFpbCxTQVMsIDAgPSBub3QgYXZhaWwgKi8KKyNkZWZpbmUgREFTX0JZUF9JTlMJKDE8PDEpCS8qIEJpdCAxOgkxID0gaW5zZXJ0IEJ5cGFzcyAqLworI2RlZmluZSBEQVNfQllQX1JNVgkoMTw8MCkJLyogQml0IDA6CTEgPSByZW1vdmUgQnlwYXNzICovCisKKy8qCUIwX0xFRAkJOCBCaXQgTEVEIHJlZ2lzdGVyICovCisJCQkJLyogQml0IDcuLjY6CXJlc2VydmVkICovCisjZGVmaW5lIExFRF8yX09OCSgxPDw1KQkvKiBCaXQgNToJMSA9IHN3aXRjaCBMRURfMiBvbiAobGVmdCxnbikqLworI2RlZmluZSBMRURfMl9PRkYJKDE8PDQpCS8qIEJpdCA0OgkxID0gc3dpdGNoIExFRF8yIG9mZiAqLworI2RlZmluZSBMRURfMV9PTgkoMTw8MykJLyogQml0IDM6CTEgPSBzd2l0Y2ggTEVEXzEgb24gKG1pZCx5ZWwpKi8KKyNkZWZpbmUgTEVEXzFfT0ZGCSgxPDwyKQkvKiBCaXQgMjoJMSA9IHN3aXRjaCBMRURfMSBvZmYgKi8KKyNkZWZpbmUgTEVEXzBfT04JKDE8PDEpCS8qIEJpdCAxOgkxID0gc3dpdGNoIExFRF8wIG9uIChyZ2h0LGduKSovCisjZGVmaW5lIExFRF8wX09GRgkoMTw8MCkJLyogQml0IDA6CTEgPSBzd2l0Y2ggTEVEXzAgb2ZmICovCisvKiBUaGlzIGhhcmR3YXJlIGRlZmluZXMgYXJlIHZlcnkgdWdseSB0aGVyZWZvcmUgd2UgZGVmaW5lIHNvbWUgb3RoZXJzICovCisKKyNkZWZpbmUgTEVEX0dBX09OCUxFRF8yX09OCS8qIFMgcG9ydCA9IEEgcG9ydCAqLworI2RlZmluZSBMRURfR0FfT0ZGCUxFRF8yX09GRgkvKiBTIHBvcnQgPSBBIHBvcnQgKi8KKyNkZWZpbmUgTEVEX01ZX09OCUxFRF8xX09OCisjZGVmaW5lIExFRF9NWV9PRkYJTEVEXzFfT0ZGCisjZGVmaW5lIExFRF9HQl9PTglMRURfMF9PTgorI2RlZmluZSBMRURfR0JfT0ZGCUxFRF8wX09GRgorCisvKglCMF9UU1RfQ1RSTAk4IGJpdCB0ZXN0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFNUX0ZSQ19EUEVSUl9NUgkoMTw8NykJLyogQml0IDc6ICBmb3JjZSBEQVRBUEVSUiBvbiBNU1QgUkUuICovCisjZGVmaW5lCVRTVF9GUkNfRFBFUlJfTVcJKDE8PDYpCS8qIEJpdCA2OiAgZm9yY2UgREFUQVBFUlIgb24gTVNUIFdSLiAqLworI2RlZmluZQlUU1RfRlJDX0RQRVJSX1RSCSgxPDw1KQkvKiBCaXQgNTogIGZvcmNlIERBVEFQRVJSIG9uIFRSRyBSRS4gKi8KKyNkZWZpbmUJVFNUX0ZSQ19EUEVSUl9UVwkoMTw8NCkJLyogQml0IDQ6ICBmb3JjZSBEQVRBUEVSUiBvbiBUUkcgV1IuICovCisjZGVmaW5lCVRTVF9GUkNfQVBFUlJfTQkJKDE8PDMpCS8qIEJpdCAzOiAgZm9yY2UgQUREUlBFUlIgb24gTVNUICAgICAqLworI2RlZmluZQlUU1RfRlJDX0FQRVJSX1QJCSgxPDwyKQkvKiBCaXQgMjogIGZvcmNlIEFERFJQRVJSIG9uIFRSRyAgICAgKi8KKyNkZWZpbmUJVFNUX0NGR19XUklURV9PTgkoMTw8MSkJLyogQml0IDE6ICBlbmEgY29uZmlndXJhdGlvbiByZWcuIFdSICovCisjZGVmaW5lCVRTVF9DRkdfV1JJVEVfT0ZGCSgxPDwwKQkvKiBCaXQgMDogIGRpcyBjb25maWd1cmF0aW9uIHJlZy4gV1IgKi8KKworLyoJQjBfSVNSQwkJMzIgYml0IEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgKi8KKwkJCQkJLyogQml0IDMxLi4yODoJcmVzZXJ2ZWQJICAgICAqLworI2RlZmluZSBJU19JMkNfUkVBRFkJKDFMPDwyNykJLyogQml0IDI3OiAoTUwpCUlSUSBvbiBlbmQgb2YgSTJDIHR4ICovCisjZGVmaW5lIElTX0lSUV9TVwkoMUw8PDI2KQkvKiBCaXQgMjY6IChNTCkJU1cgZm9yY2VkIElSUQkgICAgICovCisjZGVmaW5lIElTX0VYVF9SRUcJKDFMPDwyNSkJLyogQml0IDI1OiAoTUwpIElSUSBmcm9tIGV4dGVybmFsIHJlZyovCisjZGVmaW5lCUlTX0lSUV9TVEFUCSgxTDw8MjQpCS8qIEJpdCAyNDoJSVJRIHN0YXR1cyBleGNlcHRpb24gKi8KKwkJCQkJLyogICBQRVJSLCBSTUFCT1JULCBSVEFCT1JUIERBVEFQRVJSICovCisjZGVmaW5lCUlTX0lSUV9NU1RfRVJSCSgxTDw8MjMpCS8qIEJpdCAyMzoJSVJRIG1hc3RlciBlcnJvciAgICAgKi8KKwkJCQkJLyogICBSTUFCT1JULCBSVEFCT1JULCBEQVRBUEVSUgkgICAgICovCisjZGVmaW5lCUlTX1RJTUlOVAkoMUw8PDIyKQkvKiBCaXQgMjI6CUlSUV9USU1FUgkqLworI2RlZmluZQlJU19UT0tFTgkoMUw8PDIxKQkvKiBCaXQgMjE6CUlSUV9SVE0JCSovCisvKgorICogTm90ZTogVGhlIERBUyBpcyBvdXIgRmlyc3QgUG9ydCAoIT1QQSkKKyAqLworI2RlZmluZQlJU19QTElOVDEJKDFMPDwyMCkJLyogQml0IDIwOglJUlFfUEhZX0RBUwkqLworI2RlZmluZQlJU19QTElOVDIJKDFMPDwxOSkJLyogQml0IDE5OglJUlFfSUZDUF80CSovCisjZGVmaW5lCUlTX01JTlRSMwkoMUw8PDE4KQkvKiBCaXQgMTg6CUlSUV9JRkNQXzMvSVJRX1BIWSAqLworI2RlZmluZQlJU19NSU5UUjIJKDFMPDwxNykJLyogQml0IDE3OglJUlFfSUZDUF8yL0lSUV9NQUNfMiAqLworI2RlZmluZQlJU19NSU5UUjEJKDFMPDwxNikJLyogQml0IDE2OglJUlFfSUZDUF8xL0lSUV9NQUNfMSAqLworLyogUmVjZWl2ZSBRdWV1ZSAxICovCisjZGVmaW5lCUlTX1IxX1AJCSgxTDw8MTUpCS8qIEJpdCAxNToJUGFyaXR5IEVycm9yIChxMSkgKi8KKyNkZWZpbmUJSVNfUjFfQgkJKDFMPDwxNCkJLyogQml0IDE0OglFbmQgb2YgQnVmZmVyIChxMSkgKi8KKyNkZWZpbmUJSVNfUjFfRgkJKDFMPDwxMykJLyogQml0IDEzOglFbmQgb2YgRnJhbWUgKHExKSAqLworI2RlZmluZQlJU19SMV9DCQkoMUw8PDEyKQkvKiBCaXQgMTI6CUVuY29kaW5nIEVycm9yIChxMSkgKi8KKy8qIFJlY2VpdmUgUXVldWUgMiAqLworI2RlZmluZQlJU19SMl9QCQkoMUw8PDExKQkvKiBCaXQgMTE6IChEVikJUGFyaXR5IEVycm9yIChxMikgKi8KKyNkZWZpbmUJSVNfUjJfQgkJKDFMPDwxMCkJLyogQml0IDEwOiAoRFYpCUVuZCBvZiBCdWZmZXIgKHEyKSAqLworI2RlZmluZQlJU19SMl9GCQkoMUw8PDkpCQkvKiBCaXQJOTogKERWKQlFbmQgb2YgRnJhbWUgKHEyKSAqLworI2RlZmluZQlJU19SMl9DCQkoMUw8PDgpCQkvKiBCaXQJODogKERWKQlFbmNvZGluZyBFcnJvciAocTIpICovCisvKiBBc3luY2hyb25vdXMgVHJhbnNtaXQgcXVldWUgKi8KKwkJCQkJLyogQml0ICA3OglyZXNlcnZlZCAqLworI2RlZmluZQlJU19YQV9CCQkoMUw8PDYpCQkvKiBCaXQJNjoJRW5kIG9mIEJ1ZmZlciAoeGEpICovCisjZGVmaW5lCUlTX1hBX0YJCSgxTDw8NSkJCS8qIEJpdAk1OglFbmQgb2YgRnJhbWUgKHhhKSAqLworI2RlZmluZQlJU19YQV9DCQkoMUw8PDQpCQkvKiBCaXQJNDoJRW5jb2RpbmcgRXJyb3IgKHhhKSAqLworLyogU3luY2hyb25vdXMgVHJhbnNtaXQgcXVldWUgKi8KKwkJCQkJLyogQml0ICAzOglyZXNlcnZlZCAqLworI2RlZmluZQlJU19YU19CCQkoMUw8PDIpCQkvKiBCaXQJMjoJRW5kIG9mIEJ1ZmZlciAoeHMpICovCisjZGVmaW5lCUlTX1hTX0YJCSgxTDw8MSkJCS8qIEJpdAkxOglFbmQgb2YgRnJhbWUgKHhzKSAqLworI2RlZmluZQlJU19YU19DCQkoMUw8PDApCQkvKiBCaXQJMDoJRW5jb2RpbmcgRXJyb3IgKHhzKSAqLworCisvKgorICogRGVmaW5lIGFsbCB2YWxpZCBpbnRlcnJ1cHQgc291cmNlIEJpdHMgZnJvbSBHRVRfSVNSICgpCisgKi8KKyNkZWZpbmUJQUxMX0lSU1IJMHgwMWZmZmY3N0wJLyogKERWKSAqLworI2RlZmluZQlBTExfSVJTUl9NTAkweDBmZmZmMDc3TAkvKiAoTUwpICovCisKKworLyoJQjBfSU1TSwkJMzIgYml0IEludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisvKgorICogVGhlIEJpdCBkZWZpbm5pdGlvbiBvZiB0aGlzIHJlZ2lzdGVyIGFyZSB0aGUgc2FtZSBhcyBvZiB0aGUgaW50ZXJydXB0CisgKiBzb3VyY2UgcmVnaXN0ZXIuIFRoZXNlIGRlZmluaXRpb24gYXJlIGRpcmVjdGx5IGRlcml2ZWQgZnJvbSB0aGUgSGFyZHdhcmUKKyAqIHNwZWMuCisgKi8KKwkJCQkJLyogQml0IDMxLi4yODoJcmVzZXJ2ZWQJICAgICAqLworI2RlZmluZSBJUlFfSTJDX1JFQURZCSgxTDw8MjcpCS8qIEJpdCAyNzogKE1MKQlJUlEgb24gZW5kIG9mIEkyQyB0eCAqLworI2RlZmluZSBJUlFfU1cJCSgxTDw8MjYpCS8qIEJpdCAyNjogKE1MKQlTVyBmb3JjZWQgSVJRCSAgICAgKi8KKyNkZWZpbmUgSVJRX0VYVF9SRUcJKDFMPDwyNSkJLyogQml0IDI1OiAoTUwpIElSUSBmcm9tIGV4dGVybmFsIHJlZyovCisjZGVmaW5lCUlSUV9TVEFUCSgxTDw8MjQpCS8qIEJpdCAyNDoJSVJRIHN0YXR1cyBleGNlcHRpb24gKi8KKwkJCQkJLyogICBQRVJSLCBSTUFCT1JULCBSVEFCT1JUIERBVEFQRVJSICovCisjZGVmaW5lCUlSUV9NU1RfRVJSCSgxTDw8MjMpCS8qIEJpdCAyMzoJSVJRIG1hc3RlciBlcnJvciAgICAgKi8KKwkJCQkJLyogICBSTUFCT1JULCBSVEFCT1JULCBEQVRBUEVSUgkgICAgICovCisjZGVmaW5lCUlSUV9USU1FUgkoMUw8PDIyKQkvKiBCaXQgMjI6CUlSUV9USU1FUgkqLworI2RlZmluZQlJUlFfUlRNCQkoMUw8PDIxKQkvKiBCaXQgMjE6CUlSUV9SVE0JCSovCisjZGVmaW5lCUlSUV9EQVMJCSgxTDw8MjApCS8qIEJpdCAyMDoJSVJRX1BIWV9EQVMJKi8KKyNkZWZpbmUJSVJRX0lGQ1BfNAkoMUw8PDE5KQkvKiBCaXQgMTk6CUlSUV9JRkNQXzQJKi8KKyNkZWZpbmUJSVJRX0lGQ1BfMwkoMUw8PDE4KQkvKiBCaXQgMTg6CUlSUV9JRkNQXzMvSVJRX1BIWSAqLworI2RlZmluZQlJUlFfSUZDUF8yCSgxTDw8MTcpCS8qIEJpdCAxNzoJSVJRX0lGQ1BfMi9JUlFfTUFDXzIgKi8KKyNkZWZpbmUJSVJRX0lGQ1BfMQkoMUw8PDE2KQkvKiBCaXQgMTY6CUlSUV9JRkNQXzEvSVJRX01BQ18xICovCisvKiBSZWNlaXZlIFF1ZXVlIDEgKi8KKyNkZWZpbmUJSVJRX1IxX1AJKDFMPDwxNSkJLyogQml0IDE1OglQYXJpdHkgRXJyb3IgKHExKSAqLworI2RlZmluZQlJUlFfUjFfQgkoMUw8PDE0KQkvKiBCaXQgMTQ6CUVuZCBvZiBCdWZmZXIgKHExKSAqLworI2RlZmluZQlJUlFfUjFfRgkoMUw8PDEzKQkvKiBCaXQgMTM6CUVuZCBvZiBGcmFtZSAocTEpICovCisjZGVmaW5lCUlSUV9SMV9DCSgxTDw8MTIpCS8qIEJpdCAxMjoJRW5jb2RpbmcgRXJyb3IgKHExKSAqLworLyogUmVjZWl2ZSBRdWV1ZSAyICovCisjZGVmaW5lCUlSUV9SMl9QCSgxTDw8MTEpCS8qIEJpdCAxMTogKERWKQlQYXJpdHkgRXJyb3IgKHEyKSAqLworI2RlZmluZQlJUlFfUjJfQgkoMUw8PDEwKQkvKiBCaXQgMTA6IChEVikJRW5kIG9mIEJ1ZmZlciAocTIpICovCisjZGVmaW5lCUlSUV9SMl9GCSgxTDw8OSkJCS8qIEJpdAk5OiAoRFYpCUVuZCBvZiBGcmFtZSAocTIpICovCisjZGVmaW5lCUlSUV9SMl9DCSgxTDw8OCkJCS8qIEJpdAk4OiAoRFYpCUVuY29kaW5nIEVycm9yIChxMikgKi8KKy8qIEFzeW5jaHJvbm91cyBUcmFuc21pdCBxdWV1ZSAqLworCQkJCQkvKiBCaXQgIDc6CXJlc2VydmVkICovCisjZGVmaW5lCUlSUV9YQV9CCSgxTDw8NikJCS8qIEJpdAk2OglFbmQgb2YgQnVmZmVyICh4YSkgKi8KKyNkZWZpbmUJSVJRX1hBX0YJKDFMPDw1KQkJLyogQml0CTU6CUVuZCBvZiBGcmFtZSAoeGEpICovCisjZGVmaW5lCUlSUV9YQV9DCSgxTDw8NCkJCS8qIEJpdAk0OglFbmNvZGluZyBFcnJvciAoeGEpICovCisvKiBTeW5jaHJvbm91cyBUcmFuc21pdCBxdWV1ZSAqLworCQkJCQkvKiBCaXQgIDM6CXJlc2VydmVkICovCisjZGVmaW5lCUlSUV9YU19CCSgxTDw8MikJCS8qIEJpdAkyOglFbmQgb2YgQnVmZmVyICh4cykgKi8KKyNkZWZpbmUJSVJRX1hTX0YJKDFMPDwxKQkJLyogQml0CTE6CUVuZCBvZiBGcmFtZSAoeHMpICovCisjZGVmaW5lCUlSUV9YU19DCSgxTDw8MCkJCS8qIEJpdAkwOglFbmNvZGluZyBFcnJvciAoeHMpICovCisKKy8qIDB4MDAxMCAtIDB4MDA2YjoJZm9ybWFjKyAoc3VwZXJuZXRfMykgZmVxdWVudGx5IHVzZWQgcmVnaXN0ZXJzICovCisvKglCMF9SMV9DU1IJMzIgYml0IEJNVSBjb250cm9sL3N0YXR1cyByZWcgKHJlYyBxIDEgKSAqLworLyoJQjBfUjJfQ1NSCTMyIGJpdCBCTVUgY29udHJvbC9zdGF0dXMgcmVnIChyZWMgcSAyICkgKi8KKy8qCUIwX1hBX0NTUgkzMiBiaXQgQk1VIGNvbnRyb2wvc3RhdHVzIHJlZyAoYSB4bWl0IHEgKSAqLworLyoJQjBfWFNfQ1NSCTMyIGJpdCBCTVUgY29udHJvbC9zdGF0dXMgcmVnIChzIHhtaXQgcSApICovCisvKiBUaGUgcmVnaXN0ZXJzIGFyZSB0aGUgc2FtZSBhcyBCNF9SMV9DU1IsIEI0X1IyX0NTUiwgQjVfWGFfQ1NSLCBCNV9YU19DU1IgKi8KKworLyoJQjJfTUFDXzAJOCBiaXQgTUFDIGFkZHJlc3MgQnl0ZSAwICovCisvKglCMl9NQUNfMQk4IGJpdCBNQUMgYWRkcmVzcyBCeXRlIDEgKi8KKy8qCUIyX01BQ18yCTggYml0IE1BQyBhZGRyZXNzIEJ5dGUgMiAqLworLyoJQjJfTUFDXzMJOCBiaXQgTUFDIGFkZHJlc3MgQnl0ZSAzICovCisvKglCMl9NQUNfNAk4IGJpdCBNQUMgYWRkcmVzcyBCeXRlIDQgKi8KKy8qCUIyX01BQ181CTggYml0IE1BQyBhZGRyZXNzIEJ5dGUgNSAqLworLyoJQjJfTUFDXzYJOCBiaXQgTUFDIGFkZHJlc3MgQnl0ZSA2ICg9PSAwKSAoRFYpICovCisvKglCMl9NQUNfNwk4IGJpdCBNQUMgYWRkcmVzcyBCeXRlIDcgKD09IDApIChEVikgKi8KKworLyoJQjJfQ09OTl9UWVAJOCBiaXQgQ29ubmVjdG9yIHR5cGUgKi8KKy8qCUIyX1BNRF9UWVAJOCBiaXQgUE1EIHR5cGUgKi8KKy8qCVZhbHVlcyBvZiBjb25uZWN0b3IgYW5kIFBNRCB0eXBlIGNvbXBseSB0byBTeXNLb25uZWN0IGludGVybmFsIHN0ZCAqLworCisvKglUaGUgRVBST00gcmVnaXN0ZXIgYXJlIGN1cnJlbnRseSBvZiBubyB1c2UgKi8KKy8qCUIyX0VfMAkJOCBiaXQgRVBST00gQnl0ZSAwICovCisvKglCMl9FXzEJCTggYml0IEVQUk9NIEJ5dGUgMSAqLworLyoJQjJfRV8yCQk4IGJpdCBFUFJPTSBCeXRlIDIgKi8KKy8qCUIyX0VfMwkJOCBiaXQgRVBST00gQnl0ZSAzICovCisKKy8qCUIyX0ZBUgkJMzIgYml0IEZsYXNoLVByb20gQWRkcmVzcyBSZWdpc3Rlci9Db3VudGVyICovCisjZGVmaW5lCUZBUl9BRERSCTB4MWZmZmZMCS8qIEJpdCAxNi4uMDoJRlBST00gQWRkcmVzcyBtYXNrICovCisKKy8qCUIyX0ZEUAkJOCBiaXQgRmxhc2gtUHJvbSBEYXRhIFBvcnQgKi8KKworLyoJQjJfTERfQ1JUTAk4IGJpdCBsb2FkZXIgY29udHJvbCAqLworLyoJQml0cyBhcmUgY3VycmVudGx5IHJlc2VydmVkICovCisKKy8qCUIyX0xEX1RFU1QJOCBiaXQgbG9hZGVyIHRlc3QgKi8KKyNkZWZpbmUJTERfVF9PTgkJKDE8PDMpCS8qIEJpdCAzOiAgICBMb2FkZXIgVGVzdG1vZGUgb24gKi8KKyNkZWZpbmUJTERfVF9PRkYJKDE8PDIpCS8qIEJpdCAyOiAgICBMb2FkZXIgVGVzdG1vZGUgb2ZmICovCisjZGVmaW5lCUxEX1RfU1RFUAkoMTw8MSkJLyogQml0IDE6ICAgIERlY3JlbWVudCBGUFJPTSBhZGRyLiBDb3VudGVyICovCisjZGVmaW5lCUxEX1NUQVJUCSgxPDwwKQkvKiBCaXQgMDogICAgU3RhcnQgbG9hZGluZyBGUFJPTSAqLworCisvKglCMl9USV9JTkkJMzIgYml0IFRpbWVyIGluaXQgdmFsdWUgKi8KKy8qCUIyX1RJX1ZBTAkzMiBiaXQgVGltZXIgdmFsdWUgKi8KKy8qCUIyX1RJX0NSVEwJOCBiaXQgVGltZXIgY29udHJvbCAqLworLyoJQjJfVElfVEVTVAk4IEJpdCBUaW1lciBUZXN0ICovCisvKglCMl9XRE9HX0lOSQkzMiBiaXQgV2F0Y2hkb2cgaW5pdCB2YWx1ZSAqLworLyoJQjJfV0RPR19WQUwJMzIgYml0IFdhdGNoZG9nIHZhbHVlICovCisvKglCMl9XRE9HX0NSVEwJOCBiaXQgV2F0Y2hkb2cgY29udHJvbCAqLworLyoJQjJfV0RPR19URVNUCTggQml0IFdhdGNoZG9nIFRlc3QgKi8KKy8qCUIyX1JUTV9JTkkJMzIgYml0IFJUTSBpbml0IHZhbHVlICovCisvKglCMl9SVE1fVkFMCTMyIGJpdCBSVE0gdmFsdWUgKi8KKy8qCUIyX1JUTV9DUlRMCTggYml0IFJUTSBjb250cm9sICovCisvKglCMl9SVE1fVEVTVAk4IEJpdCBSVE0gVGVzdCAqLworLyoJQjJfPFRJTT5fQ1JUTAk4IGJpdCA8VElNPiBjb250cm9sICovCisvKglCMl9JUlFfTU9EX0lOSQkzMiBiaXQgSVJRIE1vZGVyYXRpb24gVGltZXIgSW5pdCBSZWcuCShNTCkgKi8KKy8qCUIyX0lSUV9NT0RfVkFMCTMyIGJpdCBJUlEgTW9kZXJhdGlvbiBUaW1lciBWYWx1ZQkoTUwpICovCisvKglCMl9JUlFfTU9EX0NUUkwJOCBiaXQgSVJRIE1vZGVyYXRpb24gVGltZXIgQ29udHJvbAkoTUwpICovCisvKglCMl9JUlFfTU9EX1RFU1QJOCBiaXQgSVJRIE1vZGVyYXRpb24gVGltZXIgVGVzdAkJKE1MKSAqLworI2RlZmluZSBHRVRfVE9LX0NUCSgxPDw0KQkvKiBCaXQgNDogR2V0IHRoZSBUb2tlbiBDb3VudGVyIChSVE0pICovCisjZGVmaW5lIFRJTV9SRVNfVE9LCSgxPDwzKQkvKiBCaXQgMzogUlRNIFN0YXR1czogMSA9PSByZXN0cmljdGVkICovCisjZGVmaW5lIFRJTV9BTEFSTQkoMTw8MykJLyogQml0IDM6IFRpbWVyIEFsYXJtIChXRE9HKSAqLworI2RlZmluZSBUSU1fU1RBUlQJKDE8PDIpCS8qIEJpdCAyOiBTdGFydCBUaW1lciAoVEksV0RPRyxSVE0sSVJRX01PRCkqLworI2RlZmluZSBUSU1fU1RPUAkoMTw8MSkJLyogQml0IDE6IFN0b3AgVGltZXIgKFRJLFdET0csUlRNLElSUV9NT0QpICovCisjZGVmaW5lIFRJTV9DTF9JUlEJKDE8PDApCS8qIEJpdCAwOiBDbGVhciBUaW1lciBJUlEgKFRJLFdET0csUlRNKSAqLworLyoJQjJfPFRJTT5fVEVTVAk4IEJpdCA8VElNPiBUZXN0ICovCisjZGVmaW5lCVRJTV9UX09OCSgxPDwyKQkvKiBCaXQgMjogVGVzdCBtb2RlIG9uIChUSSxXRE9HLFJUTSxJUlFfTU9EKSAqLworI2RlZmluZQlUSU1fVF9PRkYJKDE8PDEpCS8qIEJpdCAxOiBUZXN0IG1vZGUgb2ZmIChUSSxXRE9HLFJUTSxJUlFfTU9EKSAqLworI2RlZmluZQlUSU1fVF9TVEVQCSgxPDwwKQkvKiBCaXQgMDogVGVzdCBzdGVwIChUSSxXRE9HLFJUTSxJUlFfTU9EKSAqLworCisvKglCMl9UT0tfQ09VTlQJMHgwMTRjCShNTCkJMzIgYml0CVRva2VuIENvdW50ZXIgKi8KKy8qCUIyX0RFU0NfQUREUl9ICTB4MDE1MAkoTUwpCTMyIGJpdAlEZXNjaXB0b3IgQmFzZSBBZGRyIFJlZyBIaWdoICovCisvKglCMl9DVFJMXzIJMHgwMTU0CShNTCkJIDggYml0CUNvbnRyb2wgUmVnaXN0ZXIgMiAqLworCQkJCS8qIEJpdCA3Li41OglyZXNlcnZlZAkJKi8KKyNkZWZpbmUgQ1RSTF9DTF9JMkNfSVJRICgxPDw0KQkvKiBCaXQgNDoJQ2xlYXIgSTJDIElSUQkJKi8KKyNkZWZpbmUgQ1RSTF9TVF9TV19JUlEJKDE8PDMpCS8qIEJpdCAzOglTZXQgSVJRIFNXIFJlcXVlc3QJKi8KKyNkZWZpbmUgQ1RSTF9DTF9TV19JUlEJKDE8PDIpCS8qIEJpdCAyOglDbGVhciBJUlEgU1cgUmVxdWVzdAkqLworI2RlZmluZSBDVFJMX1NUT1BfRE9ORQkoMTw8MSkJLyogQml0IDE6CVN0b3AgTWFzdGVyIGlzIGZpbmlzaGVkICovCisjZGVmaW5lCUNUUkxfU1RPUF9NQVNUCSgxPDwwKQkvKiBCaXQgMDoJQ29tbWFuZCBCaXQgdG8gc3RvcCB0aGUgbWFzdGVyKi8KKworLyoJQjJfSUZBQ0VfUkVHCTB4MDE1NQkoTUwpCSA4IGJpdAlJbnRlcmZhY2UgUmVnaXN0ZXIgKi8KKwkJCQkvKiBCaXQgNy4uMzoJcmVzZXJ2ZWQJCSovCisjZGVmaW5lCUlGX0kyQ19EQVRBX0RJUgkoMTw8MikJLyogQml0IDI6CWRpcmVjdGlvbiBvZiBJRl9JMkNfREFUQSovCisjZGVmaW5lIElGX0kyQ19EQVRBCSgxPDwxKQkvKiBCaXQgMToJSTJDIERhdGEgUG9ydAkJKi8KKyNkZWZpbmUJSUZfSTJDX0NMSwkoMTw8MCkJLyogQml0IDA6CUkyQyBDbG9jayBQb3J0CQkqLworCisJCQkJLyogMHgwMTU2OgkJcmVzZXJ2ZWQgKi8KKy8qCUIyX1RTVF9DVFJMXzIJMHgwMTU3CShNTCkJIDggYml0CVRlc3QgQ29udHJvbCBSZWdpc3RlciAyICovCisJCQkJCS8qIEJpdCA3Li40OglyZXNlcnZlZCAqLworCQkJCQkvKiBmb3JjZSB0aGUgZm9sbG93aW5nIGVycm9yIG9uICovCisJCQkJCS8qIHRoZSBuZXh0IG1hc3RlciByZWFkL3dyaXRlCSovCisjZGVmaW5lIFRTVF9GUkNfRFBFUlJfTVI2NAkoMTw8MykJLyogQml0IDM6CURhdGFQRVJSIFJEIDY0CSovCisjZGVmaW5lIFRTVF9GUkNfRFBFUlJfTVc2NAkoMTw8MikJLyogQml0IDI6CURhdGFQRVJSIFdSIDY0CSovCisjZGVmaW5lIFRTVF9GUkNfQVBFUlJfMU02NAkoMTw8MSkJLyogQml0IDE6CUFkZHJQRVJSIG9uIDEuIHBoYXNlICovCisjZGVmaW5lIFRTVF9GUkNfQVBFUlJfMk02NAkoMTw8MCkJLyogQml0IDA6CUFkZHJQRVJSIG9uIDIuIHBoYXNlICovCisKKy8qCUIyX0kyQ19DVFJMCTB4MDE1OAkoTUwpCTMyIGJpdAlJMkMgQ29udHJvbCBSZWdpc3RlcgkgICAgICAgKi8KKyNkZWZpbmUJSTJDX0ZMQUcJKDFMPDwzMSkJLyogQml0IDMxOglTdGFydCByZWFkL3dyaXRlIGlmIFdSICovCisjZGVmaW5lIEkyQ19BRERSCSgweDdmZmZMPDwxNikJLyogQml0IDMwLi4xNjoJQWRkciB0byBiZSByZWFkL3dyaXR0ZW4qLworI2RlZmluZQlJMkNfREVWX1NFTAkoMHg3Zkw8PDkpCS8qIEJpdCAgOS4uMTU6CUkyQyBEZXZpY2UgU2VsZWN0ICAgICAgKi8KKwkJCQkJLyogQml0ICA1Li4gODoJcmVzZXJ2ZWQJICAgICAgICovCisjZGVmaW5lIEkyQ19CVVJTVF9MRU4JKDFMPDw0KQkJLyogQml0ICA0CUJ1cnN0IExlbiwgMS80IGJ5dGVzICAgKi8KKyNkZWZpbmUgSTJDX0RFVl9TSVpFCSg3TDw8MSkJCS8qIEJpdAkxLi4gMzoJSTJDIERldmljZSBTaXplCSAgICAgICAqLworI2RlZmluZSBJMkNfMDI1S19ERVYJKDBMPDwxKQkJLyoJCTA6IDI1NiBCeXRlcyBvciBzbWFsbGVyKi8KKyNkZWZpbmUgSTJDXzA1S19ERVYJKDFMPDwxKQkJLyogCQkxOiA1MTIJQnl0ZXMJICAgICAgICovCisjZGVmaW5lCUkyQ18xS19ERVYJKDJMPDwxKQkJLyoJCTI6IDEwMjQgQnl0ZXMJICAgICAgICovCisjZGVmaW5lIEkyQ18yS19ERVYJKDNMPDwxKQkJLyoJCTM6IDIwNDgJQnl0ZXMJICAgICAgICovCisjZGVmaW5lCUkyQ180S19ERVYJKDRMPDwxKQkJLyoJCTQ6IDQwOTYgQnl0ZXMJICAgICAgICovCisjZGVmaW5lCUkyQ184S19ERVYJKDVMPDwxKQkJLyoJCTU6IDgxOTIgQnl0ZXMJICAgICAgICovCisjZGVmaW5lCUkyQ18xNktfREVWCSg2TDw8MSkJCS8qCQk2OiAxNjM4NCBCeXRlcwkgICAgICAgKi8KKyNkZWZpbmUJSTJDXzMyS19ERVYJKDdMPDwxKQkJLyoJCTc6IDMyNzY4IEJ5dGVzCSAgICAgICAqLworI2RlZmluZSBJMkNfU1RPUF9CSVQJKDE8PDApCQkvKiBCaXQgIDA6CUludGVycnVwdCBJMkMgdHJhbnNmZXIgKi8KKworLyoKKyAqIEkyQyBBZGRyZXNzZXMKKyAqCisgKiBUaGUgdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCB0aGUgdm9sdGFnZSBzZW5zb3IgYXJlIG9uIHRoZSBzYW1lIEkyQyBidXMuCisgKiBOb3RlOiBUaGUgdm9sdGFnZSBzZW5zb3IgKE1pY29yd2lyZSkgd2lsbCBiZSBzZWxlY3RlZCBieSBQQ0lfRVhUX1BBVENIXzEKKyAqCSBpbiBQQ0lfT1VSX1JFRyAxLgorICovCisjZGVmaW5lCUkyQ19BRERSX1RFTVAJMHg5MAkvKiBJMkMgQWRkcmVzcyBUZW1wZXJhdHVyZSBTZW5zb3IgKi8KKworLyoJQjJfSTJDX0RBVEEJMHgwMTVjCShNTCkJMzIgYml0CUkyQyBEYXRhIFJlZ2lzdGVyICovCisKKy8qCUI0X1IxX0QJCTQqMzIgYml0IGN1cnJlbnQgcmVjZWl2ZSBEZXNjcmlwdG9yCShxMSkgKi8KKy8qCUI0X1IxX0RBCTMyIGJpdCBjdXJyZW50IHJlYyBkZXNjIGFkZHJlc3MJCShxMSkgKi8KKy8qCUI0X1IxX0FDCTMyIGJpdCBjdXJyZW50IHJlY2VpdmUgQWRkcmVzcyBDb3VudAkocTEpICovCisvKglCNF9SMV9CQwkzMiBiaXQgY3VycmVudCByZWNlaXZlIEJ5dGUgQ291bnRlcgkocTEpICovCisvKglCNF9SMV9DU1IJMzIgYml0IEJNVSBDb250cm9sL1N0YXR1cyBSZWdpc3RlcgkocTEpICovCisvKglCNF9SMV9GCQkzMiBiaXQgZmxhZyByZWdpc3RlcgkJCShxMSkgKi8KKy8qCUI0X1IxX1QxCTMyIGJpdCBUZXN0IFJlZ2lzdGVyIDEJCSAJKHExKSAqLworLyoJQjRfUjFfVDIJMzIgYml0IFRlc3QgUmVnaXN0ZXIgMgkJIAkocTEpICovCisvKglCNF9SMV9UMwkzMiBiaXQgVGVzdCBSZWdpc3RlciAzCQkgCShxMSkgKi8KKy8qCUI0X1IyX0QJCTQqMzIgYml0IGN1cnJlbnQgcmVjZWl2ZSBEZXNjcmlwdG9yCShxMikgKi8KKy8qCUI0X1IyX0RBCTMyIGJpdCBjdXJyZW50IHJlYyBkZXNjIGFkZHJlc3MJCShxMikgKi8KKy8qCUI0X1IyX0FDCTMyIGJpdCBjdXJyZW50IHJlY2VpdmUgQWRkcmVzcyBDb3VudAkocTIpICovCisvKglCNF9SMl9CQwkzMiBiaXQgY3VycmVudCByZWNlaXZlIEJ5dGUgQ291bnRlcgkocTIpICovCisvKglCNF9SMl9DU1IJMzIgYml0IEJNVSBDb250cm9sL1N0YXR1cyBSZWdpc3RlcgkocTIpICovCisvKglCNF9SMl9GCQkzMiBiaXQgZmxhZyByZWdpc3RlcgkJCShxMikgKi8KKy8qCUI0X1IyX1QxCTMyIGJpdCBUZXN0IFJlZ2lzdGVyIDEJCQkocTIpICovCisvKglCNF9SMl9UMgkzMiBiaXQgVGVzdCBSZWdpc3RlciAyCQkJKHEyKSAqLworLyoJQjRfUjJfVDMJMzIgYml0IFRlc3QgUmVnaXN0ZXIgMwkJCShxMikgKi8KKy8qCUI1X1hBX0QJCTQqMzIgYml0IGN1cnJlbnQgcmVjZWl2ZSBEZXNjcmlwdG9yCSh4YSkgKi8KKy8qCUI1X1hBX0RBCTMyIGJpdCBjdXJyZW50IHJlYyBkZXNjIGFkZHJlc3MJCSh4YSkgKi8KKy8qCUI1X1hBX0FDCTMyIGJpdCBjdXJyZW50IHJlY2VpdmUgQWRkcmVzcyBDb3VudAkoeGEpICovCisvKglCNV9YQV9CQwkzMiBiaXQgY3VycmVudCByZWNlaXZlIEJ5dGUgQ291bnRlcgkoeGEpICovCisvKglCNV9YQV9DU1IJMzIgYml0IEJNVSBDb250cm9sL1N0YXR1cyBSZWdpc3RlcgkoeGEpICovCisvKglCNV9YQV9GCQkzMiBiaXQgZmxhZyByZWdpc3RlcgkJCSh4YSkgKi8KKy8qCUI1X1hBX1QxCTMyIGJpdCBUZXN0IFJlZ2lzdGVyIDEJCQkoeGEpICovCisvKglCNV9YQV9UMgkzMiBiaXQgVGVzdCBSZWdpc3RlciAyCQkJKHhhKSAqLworLyoJQjVfWEFfVDMJMzIgYml0IFRlc3QgUmVnaXN0ZXIgMwkJCSh4YSkgKi8KKy8qCUI1X1hTX0QJCTQqMzIgYml0IGN1cnJlbnQgcmVjZWl2ZSBEZXNjcmlwdG9yCSh4cykgKi8KKy8qCUI1X1hTX0RBCTMyIGJpdCBjdXJyZW50IHJlYyBkZXNjIGFkZHJlc3MJCSh4cykgKi8KKy8qCUI1X1hTX0FDCTMyIGJpdCBjdXJyZW50IHJlY2VpdmUgQWRkcmVzcyBDb3VudAkoeHMpICovCisvKglCNV9YU19CQwkzMiBiaXQgY3VycmVudCByZWNlaXZlIEJ5dGUgQ291bnRlcgkoeHMpICovCisvKglCNV9YU19DU1IJMzIgYml0IEJNVSBDb250cm9sL1N0YXR1cyBSZWdpc3RlcgkoeHMpICovCisvKglCNV9YU19GCQkzMiBiaXQgZmxhZyByZWdpc3RlcgkJCSh4cykgKi8KKy8qCUI1X1hTX1QxCTMyIGJpdCBUZXN0IFJlZ2lzdGVyIDEJCQkoeHMpICovCisvKglCNV9YU19UMgkzMiBiaXQgVGVzdCBSZWdpc3RlciAyCQkJKHhzKSAqLworLyoJQjVfWFNfVDMJMzIgYml0IFRlc3QgUmVnaXN0ZXIgMwkJCSh4cykgKi8KKy8qCUI1Xzx4eD5fQ1NSCTMyIGJpdCBCTVUgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIJKHh4KSAqLworI2RlZmluZQlDU1JfREVTQ19DTEVBUgkoMUw8PDIxKSAgICAvKiBCaXQgMjE6CUNsZWFyIFJlc2V0IGZvciBEZXNjciAqLworI2RlZmluZQlDU1JfREVTQ19TRVQJKDFMPDwyMCkgICAgLyogQml0IDIwOglTZXQgUmVzZXQgZm9yIERlc2NyICovCisjZGVmaW5lCUNTUl9GSUZPX0NMRUFSCSgxTDw8MTkpICAgIC8qIEJpdCAxOToJQ2xlYXIgUmVzZXQgZm9yIEZJRk8gKi8KKyNkZWZpbmUJQ1NSX0ZJRk9fU0VUCSgxTDw8MTgpICAgIC8qIEJpdCAxODoJU2V0IFJlc2V0IGZvciBGSUZPICovCisjZGVmaW5lCUNTUl9IUElfUlVOCSgxTDw8MTcpICAgIC8qIEJpdCAxNzoJUmVsZWFzZSBIUEkgU00gKi8KKyNkZWZpbmUJQ1NSX0hQSV9SU1QJKDFMPDwxNikgICAgLyogQml0IDE2OglSZXNldCBIUEkgU00gdG8gSWRsZSAqLworI2RlZmluZQlDU1JfU1ZfUlVOCSgxTDw8MTUpICAgIC8qIEJpdCAxNToJUmVsZWFzZSBTdXBlcnZpc29yIFNNICovCisjZGVmaW5lCUNTUl9TVl9SU1QJKDFMPDwxNCkgICAgLyogQml0IDE0OglSZXNldCBTdXBlcnZpc29yIFNNICovCisjZGVmaW5lCUNTUl9EUkVBRF9SVU4JKDFMPDwxMykgICAgLyogQml0IDEzOglSZWxlYXNlIERlc2NyIFJlYWQgU00gKi8KKyNkZWZpbmUJQ1NSX0RSRUFEX1JTVAkoMUw8PDEyKSAgICAvKiBCaXQgMTI6CVJlc2V0IERlc2NyIFJlYWQgU00gKi8KKyNkZWZpbmUJQ1NSX0RXUklURV9SVU4JKDFMPDwxMSkgICAgLyogQml0IDExOglSZWwuIERlc2NyIFdyaXRlIFNNICovCisjZGVmaW5lCUNTUl9EV1JJVEVfUlNUCSgxTDw8MTApICAgIC8qIEJpdCAxMDoJUmVzZXQgRGVzY3IgV3JpdGUgU00gKi8KKyNkZWZpbmUJQ1NSX1RSQU5TX1JVTgkoMUw8PDkpICAgICAvKiBCaXQgOToJUmVsZWFzZSBUcmFuc2ZlciBTTSAqLworI2RlZmluZQlDU1JfVFJBTlNfUlNUCSgxTDw8OCkgICAgIC8qIEJpdCA4OglSZXNldCBUcmFuc2ZlciBTTSAqLworCQkJCSAgICAvKiBCaXQgNy4uNTogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUJQ1NSX1NUQVJUCSgxTDw8NCkgICAgIC8qIEJpdCA0OglTdGFydCBSZWMvWG1pdCBRdWV1ZSAqLworI2RlZmluZQlDU1JfSVJRX0NMX1AJKDFMPDwzKSAgICAgLyogQml0IDM6CUNsZWFyIFBhcml0eSBJUlEsIFJjdiAqLworI2RlZmluZQlDU1JfSVJRX0NMX0IJKDFMPDwyKSAgICAgLyogQml0IDI6CUNsZWFyIEVPQiBJUlEgKi8KKyNkZWZpbmUJQ1NSX0lSUV9DTF9GCSgxTDw8MSkgICAgIC8qIEJpdCAxOglDbGVhciBFT0YgSVJRICovCisjZGVmaW5lCUNTUl9JUlFfQ0xfQwkoMUw8PDApICAgICAvKiBCaXQgMDoJQ2xlYXIgRVJSIElSUSAqLworCisjZGVmaW5lIENTUl9TRVRfUkVTRVQJKENTUl9ERVNDX1NFVHxDU1JfRklGT19TRVR8Q1NSX0hQSV9SU1R8Q1NSX1NWX1JTVHxcCisJCQlDU1JfRFJFQURfUlNUfENTUl9EV1JJVEVfUlNUfENTUl9UUkFOU19SU1QpCisjZGVmaW5lIENTUl9DTFJfUkVTRVQJKENTUl9ERVNDX0NMRUFSfENTUl9GSUZPX0NMRUFSfENTUl9IUElfUlVOfENTUl9TVl9SVU58XAorCQkJQ1NSX0RSRUFEX1JVTnxDU1JfRFdSSVRFX1JVTnxDU1JfVFJBTlNfUlVOKQorCisKKy8qCUI1Xzx4eD5fRgkzMiBiaXQgZmxhZyByZWdpc3RlcgkJICh4eCkgKi8KKwkJCQkJLyogQml0IDI4Li4zMToJcmVzZXJ2ZWQJICAgICAgKi8KKyNkZWZpbmUgRl9BTE1fRlVMTAkoMUw8PDI3KQkvKiBCaXQgMjc6IChNTCkJRklGTyBhbG1vc3QgZnVsbCAgICAgICovCisjZGVmaW5lIEZfRklGT19FT0YJKDFMPDwyNikJLyogQml0IDI2OiAoTUwpCUZhZyBiaXQgaW4gRklGTyAgICAgICAqLworI2RlZmluZSBGX1dNX1JFQUNIRUQJKDFMPDwyNSkJLyogQml0IDI1OiAoTUwpCVdhdGVybWFyayByZWFjaGVkICAgICAqLworI2RlZmluZSBGX1VQX0RXX1VTRUQJKDFMPDwyNCkJLyogQml0IDI0OiAoTUwpIFVwcGVyIER3b3JkIHVzZWQgKGJ1ZykqLworCQkJCQkvKiBCaXQgMjM6IAlyZXNlcnZlZAkgICAgICAqLworI2RlZmluZSBGX0ZJRk9fTEVWRUwJKDB4MWZMPDwxNikJLyogQml0IDE2Li4yMjooTUwpICMgb2YgUXdvcmRzIGluIEZJRk8qLworCQkJCQkvKiBCaXQgIDguLjE1OiAJcmVzZXJ2ZWQJICAgICAgKi8KKyNkZWZpbmUgRl9NTF9XQVRFUl9NCTB4MDAwMGZmTAkvKiBCaXQgIDAuLiA3OihNTCkgV2F0ZXJtYXJrCSAgICAgICovCisjZGVmaW5lCUZMQUdfV0FURVIJMHgwMDAwMWZMCS8qIEJpdCA0Li4wOihEVikgTGV2ZWwgb2YgcmVxIGRhdGEgdHIuKi8KKworLyoJQjVfPHh4Pl9UMQkzMiBiaXQgVGVzdCBSZWdpc3RlciAxCQkgKHh4KSAqLworLyoJCUhvbGRzIGZvdXIgU3RhdGUgTWFjaGluZSBjb250cm9sIEJ5dGVzICovCisjZGVmaW5lCVNNX0NSVExfU1YJKDB4ZmZMPDwyNCkgLyogQml0IDMxLi4yNDogIENvbnRyb2wgU3VwZXJ2aXNvciBTTSAqLworI2RlZmluZQlTTV9DUlRMX1JECSgweGZmTDw8MTYpIC8qIEJpdCAyMy4uMTY6ICBDb250cm9sIFJlYWQgRGVzYyBTTSAqLworI2RlZmluZQlTTV9DUlRMX1dSCSgweGZmTDw8OCkgIC8qIEJpdCAxNS4uODogICBDb250cm9sIFdyaXRlIERlc2MgU00gKi8KKyNkZWZpbmUJU01fQ1JUTF9UUgkoMHhmZkw8PDApICAvKiBCaXQgNy4uMDogICAgQ29udHJvbCBUcmFuc2ZlciBTTSAqLworCisvKglCNF88eHg+X1QxX1RSCTggYml0IFRlc3QgUmVnaXN0ZXIgMSBUUgkJKHh4KSAqLworLyoJQjRfPHh4Pl9UMV9XUgk4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgV1IJCSh4eCkgKi8KKy8qCUI0Xzx4eD5fVDFfUkQJOCBiaXQgVGVzdCBSZWdpc3RlciAxIFJECQkoeHgpICovCisvKglCNF88eHg+X1QxX1NWCTggYml0IFRlc3QgUmVnaXN0ZXIgMSBTVgkJKHh4KSAqLworLyogVGhlIGNvbnRyb2wgc3RhdHVzIGJ5dGUgb2YgZWFjaCBtYWNoaW5lIGxvb2tzIGxpa2UgLi4uICovCisjZGVmaW5lCVNNX1NUQVRFCTB4ZjAJLyogQml0IDcuLjQ6CVN0YXRlIHdoaWNoIHNoYWxsIGJlIGxvYWRlZCAqLworI2RlZmluZQlTTV9MT0FECQkweDA4CS8qIEJpdCAzOglMb2FkIHRoZSBTTSB3aXRoIFNNX1NUQVRFICovCisjZGVmaW5lCVNNX1RFU1RfT04JMHgwNAkvKiBCaXQgMjoJU3dpdGNoIG9uIFNNIFRlc3QgTW9kZSAqLworI2RlZmluZQlTTV9URVNUX09GRgkweDAyCS8qIEJpdCAxOglHbyBvZmYgdGhlIFRlc3QgTW9kZSAqLworI2RlZmluZQlTTV9TVEVQCQkweDAxCS8qIEJpdCAwOglTdGVwIHRoZSBTdGF0ZSBNYWNoaW5lICovCisKKy8qIFRoZSBjb2Rpbmcgb2YgdGhlIHN0YXRlcyAqLworI2RlZmluZQlTTV9TVl9JRExFCTB4MAkvKiBTdXBlcnZpc29yCUlkbGUJCVRyL1JlCSAgICAgKi8KKyNkZWZpbmUJU01fU1ZfUkVTX1NUQVJUCTB4MQkvKiBTdXBlcnZpc29yCVJlc19TdGFydAlUci9SZQkgICAgICovCisjZGVmaW5lCVNNX1NWX0dFVF9ERVNDCTB4MwkvKiBTdXBlcnZpc29yCUdldF9EZXNjCVRyL1JlCSAgICAgKi8KKyNkZWZpbmUJU01fU1ZfQ0hFQ0sJMHgyCS8qIFN1cGVydmlzb3IJQ2hlY2sJCVRyL1JlCSAgICAgKi8KKyNkZWZpbmUJU01fU1ZfTU9WX0RBVEEJMHg2CS8qIFN1cGVydmlzb3IJTW92ZV9EYXRhCVRyL1JlCSAgICAgKi8KKyNkZWZpbmUJU01fU1ZfUFVUX0RFU0MJMHg3CS8qIFN1cGVydmlzb3IJUHV0X0Rlc2MJVHIvUmUJICAgICAqLworI2RlZmluZQlTTV9TVl9TRVRfSVJRCTB4NQkvKiBTdXBlcnZpc29yCVNldF9JcnEJCVRyL1JlCSAgICAgKi8KKworI2RlZmluZQlTTV9SRF9JRExFCTB4MAkvKiBSZWFkIERlc2MuCUlkbGUJCVRyL1JlCSAgICAgKi8KKyNkZWZpbmUJU01fUkRfTE9BRAkweDEJLyogUmVhZCBEZXNjLglMb2FkCQlUci9SZQkgICAgICovCisjZGVmaW5lCVNNX1JEX1dBSVRfVEMJMHgzCS8qIFJlYWQgRGVzYy4JV2FpdF9UQwkJVHIvUmUJICAgICAqLworI2RlZmluZQlTTV9SRF9SU1RfRU9GCTB4NgkvKiBSZWFkIERlc2MuCVJlc2V0X0VPRgkgICBSZQkgICAgICovCisjZGVmaW5lCVNNX1JEX1dET05FX1IJMHgyCS8qIFJlYWQgRGVzYy4JV2FpdF9Eb25lCSAgIFJlCSAgICAgKi8KKyNkZWZpbmUJU01fUkRfV0RPTkVfVAkweDQJLyogUmVhZCBEZXNjLglXYWl0X0RvbmUJVHIgICAJICAgICAqLworCisjZGVmaW5lCVNNX1RSX0lETEUJMHgwCS8qIFRyYW5zLiBEYXRhCUlkbGUJCVRyL1JlCSAgICAgKi8KKyNkZWZpbmUJU01fVFJfTE9BRAkweDMJLyogVHJhbnMuIERhdGEJTG9hZAkJVHIvUmUJICAgICAqLworI2RlZmluZQlTTV9UUl9MT0FEX1JfTUwJMHgxCS8qIFRyYW5zLiBEYXRhCUxvYWQJCSAgL1JlCShNTCkgKi8KKyNkZWZpbmUJU01fVFJfV0FJVF9UQwkweDIJLyogVHJhbnMuIERhdGEJV2FpdF9UQwkJVHIvUmUJICAgICAqLworI2RlZmluZQlTTV9UUl9XRE9ORQkweDQJLyogVHJhbnMuIERhdGEJV2FpdF9Eb25lCVRyL1JlCSAgICAgKi8KKworI2RlZmluZQlTTV9XUl9JRExFCTB4MAkvKiBXcml0ZSBEZXNjLglJZGxlCQlUci9SZQkgICAgICovCisjZGVmaW5lCVNNX1dSX0FCTEVOCTB4MQkvKiBXcml0ZSBEZXNjLglBY3RfQnVmX0xlbmd0aAlUci9SZQkgICAgICovCisjZGVmaW5lCVNNX1dSX0xEX0E0CTB4MgkvKiBXcml0ZSBEZXNjLglMb2FkX0E0CQkgICBSZQkgICAgICovCisjZGVmaW5lCVNNX1dSX1JFU19PV04JMHgyCS8qIFdyaXRlIERlc2MuCVJlc19PV04JCVRyICAgCSAgICAgKi8KKyNkZWZpbmUJU01fV1JfV0FJVF9FT0YJMHgzCS8qIFdyaXRlIERlc2MuCVdhaXRfRU9GCSAgIFJlCSAgICAgKi8KKyNkZWZpbmUJU01fV1JfTERfTjJDX1IJMHg0CS8qIFdyaXRlIERlc2MuCUxvYWRfTjJDCSAgIFJlCSAgICAgKi8KKyNkZWZpbmUJU01fV1JfV0FJVF9UQ19SCTB4NQkvKiBXcml0ZSBEZXNjLglXYWl0X1RDCQkgICBSZQkgICAgICovCisjZGVmaW5lCVNNX1dSX1dBSVRfVEM0CTB4NgkvKiBXcml0ZSBEZXNjLglXYWl0X1RDNAkgICBSZQkgICAgICovCisjZGVmaW5lCVNNX1dSX0xEX0FfVAkweDYJLyogV3JpdGUgRGVzYy4JTG9hZF9BCQlUciAgIAkgICAgICovCisjZGVmaW5lCVNNX1dSX0xEX0FfUgkweDcJLyogV3JpdGUgRGVzYy4JTG9hZF9BCQkgICBSZQkgICAgICovCisjZGVmaW5lCVNNX1dSX1dBSVRfVENfVAkweDcJLyogV3JpdGUgRGVzYy4JV2FpdF9UQwkJVHIgICAJICAgICAqLworI2RlZmluZQlTTV9XUl9MRF9OMkNfVAkweGMJLyogV3JpdGUgRGVzYy4JTG9hZF9OMkMJVHIgICAJICAgICAqLworI2RlZmluZQlTTV9XUl9XRE9ORV9UCTB4OQkvKiBXcml0ZSBEZXNjLglXYWl0X0RvbmUJVHIgICAJICAgICAqLworI2RlZmluZQlTTV9XUl9XRE9ORV9SCTB4YwkvKiBXcml0ZSBEZXNjLglXYWl0X0RvbmUJICAgUmUJICAgICAqLworI2RlZmluZSBTTV9XUl9MRF9EX0FECTB4ZQkvKiBXcml0ZSBEZXNjLiAgTG9hZF9EdW1yX0EJICAgUmUJKE1MKSAqLworI2RlZmluZSBTTV9XUl9XQUlUX0RfVEMJMHhmCS8qIFdyaXRlIERlc2MuCVdhaXRfRHVtcl9UQwkgICBSZQkoTUwpICovCisKKy8qCUI1Xzx4eD5fVDIJMzIgYml0IFRlc3QgUmVnaXN0ZXIgMgkJICh4eCkgKi8KKy8qIE5vdGU6IFRoaXMgcmVnaXN0ZXIgaXMgb25seSBkZWZpbmVkIGZvciB0aGUgdHJhbnNtaXQgcXVldWVzICovCisJCQkJLyogQml0IDMxLi44OglyZXNlcnZlZCAqLworI2RlZmluZQlBQ19URVNUX09OCSgxPDw3KQkvKiBCaXQgNzoJQWRkcmVzcyBDb3VudGVyIFRlc3QgTW9kZSBvbiAqLworI2RlZmluZQlBQ19URVNUX09GRgkoMTw8NikJLyogQml0IDY6CUFkZHJlc3MgQ291bnRlciBUZXN0IE1vZGUgb2ZmKi8KKyNkZWZpbmUJQkNfVEVTVF9PTgkoMTw8NSkJLyogQml0IDU6CUJ5dGUgQ291bnRlciBUZXN0IE1vZGUgb24gKi8KKyNkZWZpbmUJQkNfVEVTVF9PRkYJKDE8PDQpCS8qIEJpdCA0OglCeXRlIENvdW50ZXIgVGVzdCBNb2RlIG9mZiAqLworI2RlZmluZQlURVNUX1NURVAwNAkoMTw8MykJLyogQml0IDM6CUluYyBBQy9EZWMgQkMgYnkgNCAqLworI2RlZmluZQlURVNUX1NURVAwMwkoMTw8MikJLyogQml0IDI6CUluYyBBQy9EZWMgQkMgYnkgMyAqLworI2RlZmluZQlURVNUX1NURVAwMgkoMTw8MSkJLyogQml0IDE6CUluYyBBQy9EZWMgQkMgYnkgMiAqLworI2RlZmluZQlURVNUX1NURVAwMQkoMTw8MCkJLyogQml0IDA6CUluYyBBQy9EZWMgQkMgYnkgMSAqLworCisvKglCNV88eHg+X1QzCTMyIGJpdCBUZXN0IFJlZ2lzdGVyIDMJCSAoeHgpICovCisvKiBOb3RlOiBUaGlzIHJlZ2lzdGVyIGlzIG9ubHkgZGVmaW5lZCBmb3IgdGhlIHRyYW5zbWl0IHF1ZXVlcyAqLworCQkJCS8qIEJpdCAzMS4uODoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVDNfTVVYXzIJKDE8PDcpCS8qIEJpdCA3OiAoTUwpCU11eCBwb3NpdGlvbiBNU0IgKi8KKyNkZWZpbmUgVDNfVlJBTV8yCSgxPDw2KQkvKiBCaXQgNjogKE1MKQlWaXJ0dWFsIFJBTSBidWZmZXIgYWRkciBNU0IgKi8KKyNkZWZpbmUJVDNfTE9PUAkJKDE8PDUpCS8qIEJpdCA1OiAJU2V0IExvb3BiYWNrIChYbWl0KSAqLworI2RlZmluZQlUM19VTkxPT1AJKDE8PDQpCS8qIEJpdCA0OiAJVW5zZXQgTG9vcGJhY2sgKFhtaXQpICovCisjZGVmaW5lCVQzX01VWAkJKDM8PDIpCS8qIEJpdCAzLi4yOglNdXggcG9zaXRpb24gKi8KKyNkZWZpbmUJVDNfVlJBTQkJKDM8PDApCS8qIEJpdCAxLi4wOglWaXJ0dWFsIFJBTSBidWZmZXIgQWRkcmVzcyAqLworCisvKiBQQ0kgY2FyZCBJRHMgKi8KKy8qCisgKiBOb3RlOiBUaGUgZm9sbG93aW5nIDQgYnl0ZSBkZWZpbml0aW9ucyBzaGFsbCBub3QgYmUgdXNlZCEgVXNlIE9FTSBDb25jZXB0IQorICovCisjZGVmaW5lCVBDSV9WRU5EX0lEMAkweDQ4CQkvKiBQQ0kgdmVuZG9yIElEIChTeXNLb25uZWN0KSAqLworI2RlZmluZQlQQ0lfVkVORF9JRDEJMHgxMQkJLyogUENJIHZlbmRvciBJRCAoU3lzS29ubmVjdCkgKi8KKwkJCQkJLyoJCSAoSGlnaCBieXRlKSAqLworI2RlZmluZQlQQ0lfREVWX0lEMAkweDAwCQkvKiBQQ0kgZGV2aWNlIElEICovCisjZGVmaW5lCVBDSV9ERVZfSUQxCTB4NDAJCS8qIFBDSSBkZXZpY2UgSUQgKEhpZ2ggYnl0ZSkgKi8KKworLyojZGVmaW5lIFBDSV9DTEFTUwkweDAyKi8JCS8qIFBDSSBjbGFzcyBjb2RlOiBuZXR3b3JrIGRldmljZSAqLworI2RlZmluZSBQQ0lfTldfQ0xBU1MJMHgwMgkJLyogUENJIGNsYXNzIGNvZGU6IG5ldHdvcmsgZGV2aWNlICovCisjZGVmaW5lIFBDSV9TVUJfQ0xBU1MJMHgwMgkJLyogUENJIHN1YmNsYXNzIElEOiBGRERJIGRldmljZSAqLworI2RlZmluZSBQQ0lfUFJPR19JTlRGQwkweDAwCQkvKiBQQ0kgcHJvZ3JhbW1pbmcgSW50ZXJmYWNlICg9MCkgKi8KKworLyoKKyAqIGFkZHJlc3MgdHJhbnNtaXNzaW9uIGZyb20gbG9naWNhbCB0byBwaHlzaWNhbCBvZmZzZXQgYWRkcmVzcyBvbiBib2FyZAorICovCisjZGVmaW5lCUZNQShhKQkoMHgwNDAwfCgoYSk8PDIpKQkvKiBGT1JNQUMrIChyL3cpIChTTjMpICovCisjZGVmaW5lCVAxKGEpCSgweDAzODB8KChhKTw8MikpCS8qIFBMQzEgKHIvdykgKERBUykgKi8KKyNkZWZpbmUJUDIoYSkJKDB4MDYwMHwoKGEpPDwyKSkJLyogUExDMiAoci93KSAoY292ZXJlZCBieSB0aGUgU04zKSAqLworI2RlZmluZSBQUkEoYSkJKEIyX01BQ18wICsgKGEpKQkvKiBjb25maWd1cmF0aW9uIFBST00gKE1BQyBhZGRyZXNzKSAqLworCisvKgorICogRmxhc2hQcm9tIHNwZWNpZmljYXRpb24KKyAqLworI2RlZmluZQlNQVhfUEFHRVMJMHgyMDAwMEwJLyogRXZlcnkgYnl0ZSBoYXMgYSBzaW5nbGUgcGFnZSAqLworI2RlZmluZQlNQVhfRkFERFIJMQkJLyogMSBieXRlIHBlciBwYWdlICovCisKKy8qCisgKiBSZWNlaXZlIC8gVHJhbnNtaXQgQnVmZmVyIENvbnRyb2wgd29yZAorICovCisjZGVmaW5lCUJNVV9PV04JCSgxVUw8PDMxKQkvKiBPV04gYml0OiAwID09IGhvc3QsIDEgPT0gYWRhcHRlciAqLworI2RlZmluZQlCTVVfU1RGCQkoMUw8PDMwKQkvKiBTdGFydCBvZiBGcmFtZSA/CQkqLworI2RlZmluZQlCTVVfRU9GCQkoMUw8PDI5KQkvKiBFbmQgb2YgRnJhbWUgPwkJKi8KKyNkZWZpbmUJQk1VX0VOX0lSUV9FT0IJKDFMPDwyOCkJLyogRW5hYmxlICJFbmQgb2YgQnVmZmVyIiBJUlEJKi8KKyNkZWZpbmUJQk1VX0VOX0lSUV9FT0YJKDFMPDwyNykJLyogRW5hYmxlICJFbmQgb2YgRnJhbWUiIElSUQkqLworI2RlZmluZQlCTVVfREVWXzAJKDFMPDwyNikJLyogUlg6IGRvbid0IHRyYW5zZmVyIHRvIHN5c3RlbSBtZW0gKi8KKyNkZWZpbmUgQk1VX1NNVF9UWAkoMUw8PDI1KQkvKiBUWDogaWYgc2V0LCBidWZmZXIgdHlwZSBTTVRfTUJ1ZiAqLworI2RlZmluZSBCTVVfU1RfQlVGCSgxTDw8MjUpCS8qIFJYOiBjb3B5IG9mIHN0YXJ0IG9mIGZyYW1lICovCisjZGVmaW5lIEJNVV9VTlVTRUQJKDFMPDwyNCkJLyogU2V0IGlmIHRoZSBEZXNjciBpcyBjdXJyIHVudXNlZCAqLworI2RlZmluZSBCTVVfU1cJCSgzTDw8MjQpCS8qIDIgQml0cyByZXNlcnZlZCBmb3IgU1cgdXNhZ2UgKi8KKyNkZWZpbmUJQk1VX0NIRUNLCTB4MDA1NTAwMDBMCS8qIFRvIGlkZW50aWZ5IHRoZSBjb250cm9sIHdvcmQgKi8KKyNkZWZpbmUJQk1VX0JCQwkJMHgwMDAwRkZGRkwJLyogUi9UIEJ1ZmZlciBCeXRlIENvdW50ICAgICAgICAqLworCisvKgorICogcGh5c2ljYWwgYWRkcmVzcyBvZmZzZXQgKyBJTy1Qb3J0IGJhc2UgYWRkcmVzcworICovCisjaWZkZWYgTUVNX01BUFBFRF9JTworI2RlZmluZQlBRERSKGEpCQkoY2hhciBmYXIgKikgc21jLT5ody5pb3ArKGEpCisjZGVmaW5lCUFERFJTKHNtYyxhKQkoY2hhciBmYXIgKikgKHNtYyktPmh3LmlvcCsoYSkKKyNlbHNlCisjZGVmaW5lCUFERFIoYSkJKCgoYSk+PjcpID8gKG91dHAoc21jLT5ody5pb3ArQjBfUkFQLChhKT4+NyksIFwKKwkoc21jLT5ody5pb3ArKCgoYSkmMHg3Ril8KChhKT4+NyA/IDB4ODA6MCkpKSkgOiBcCisJKHNtYy0+aHcuaW9wKygoKGEpJjB4N0YpfCgoYSk+PjcgPyAweDgwOjApKSkpCisjZGVmaW5lCUFERFJTKHNtYyxhKSAoKChhKT4+NykgPyAob3V0cCgoc21jKS0+aHcuaW9wK0IwX1JBUCwoYSk+PjcpLCBcCisJKChzbWMpLT5ody5pb3ArKCgoYSkmMHg3Ril8KChhKT4+NyA/IDB4ODA6MCkpKSkgOiBcCisJKChzbWMpLT5ody5pb3ArKCgoYSkmMHg3Ril8KChhKT4+NyA/IDB4ODA6MCkpKSkKKyNlbmRpZgorCisvKgorICogRGVmaW5lIGEgbWFjcm8gdG8gYWNjZXNzIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlCisgKi8KKyNkZWZpbmUgUENJX0MoYSkJQUREUihCM19DRkdfU1BDICsgKGEpKQkvKiBQQ0kgQ29uZmlnIFNwYWNlICovCisKKyNkZWZpbmUgRVhUX1IoYSkJQUREUihCNl9FWFRfUkVHICsgKGEpKQkvKiBFeHRlcm5hbCBSZWdpc3RlcnMgKi8KKworLyoKKyAqIERlZmluZSBzb21lIHZhbHVlcyBuZWVkZWQgZm9yIHRoZSBNQUMgYWRkcmVzcyAoUFJPTSkKKyAqLworI2RlZmluZQlTQV9NQUMJCSgwKQkvKiBzdGFydCBhZGRyLiBNQUNfQUQgd2l0aGluIHRoZSBQUk9NICovCisjZGVmaW5lCVBSQV9PRkYJCSgwKQkvKiBvZmZzZXQgY29ycmVjdGlvbiB3aGVuIDR0aCBieXRlIHJlYWRpbmcgKi8KKworI2RlZmluZQlTS0ZERElfUFNaCTgJLyogYWRkcmVzcyBQUk9NIHNpemUgKi8KKworI2RlZmluZQlGTV9BKGEpCUFERFIoRk1BKGEpKQkvKiBGT1JNQUMgUGx1cyBwaHlzaWNhbCBhZGRyICovCisjZGVmaW5lCVAxX0EoYSkJQUREUihQMShhKSkJLyogUExDMSAoci93KSAqLworI2RlZmluZQlQMl9BKGEpCUFERFIoUDIoYSkpCS8qIFBMQzIgKHIvdykgKERBUykgKi8KKyNkZWZpbmUgUFJfQShhKQlBRERSKFBSQShhKSkJLyogY29uZmlnLiBQUk9NIChNQUMgYWRkcmVzcykgKi8KKworLyoKKyAqIE1hY3JvIHRvIHJlYWQgdGhlIFBST00KKyAqLworI2RlZmluZQlSRUFEX1BST00oYSkJKCh1X2NoYXIpaW5wKGEpKQorCisjZGVmaW5lCUdFVF9QQUdFKGJhbmspCW91dHBkKEFERFIoQjJfRkFSKSxiYW5rKQorI2RlZmluZQlWUFBfT04oKQorI2RlZmluZQlWUFBfT0ZGKCkKKworLyoKKyAqIE5vdGU6IFZhbHVlcyBvZiB0aGUgSW50ZXJydXB0IFNvdXJjZSBSZWdpc3RlciBhcmUgZGVmaW5lZCBhYm92ZQorICovCisjZGVmaW5lIElTUl9BCQlBRERSKEIwX0lTUkMpCisjZGVmaW5lCUdFVF9JU1IoKQkJaW5wZChJU1JfQSkKKyNkZWZpbmUgR0VUX0lTUl9TTVAoaW9wKQlpbnBkKChpb3ApK0IwX0lTUkMpCisjZGVmaW5lCUNIRUNLX0lTUigpCQkoaW5wZChJU1JfQSkgJiBpbnBkKEFERFIoQjBfSU1TSykpKQorI2RlZmluZSBDSEVDS19JU1JfU01QKGlvcCkJKGlucGQoKGlvcCkrQjBfSVNSQykgJiBpbnBkKChpb3ApK0IwX0lNU0spKQorCisjZGVmaW5lCUJVU19DSEVDSygpCisKKy8qCisgKiBDTElfRkJJOglEaXNhYmxlIEJvYXJkIEludGVycnVwdHMKKyAqIFNUSV9GQkk6CUVuYWJsZSBCb2FyZCBJbnRlcnJ1cHRzCisgKi8KKyNpZm5kZWYgVU5JWAorI2RlZmluZQlDTElfRkJJKCkJb3V0cGQoQUREUihCMF9JTVNLKSwwKQorI2Vsc2UKKyNkZWZpbmUJQ0xJX0ZCSShzbWMpCW91dHBkKEFERFJTKChzbWMpLEIwX0lNU0spLDApCisjZW5kaWYKKworI2lmbmRlZiBVTklYCisjZGVmaW5lCVNUSV9GQkkoKQlvdXRwZChBRERSKEIwX0lNU0spLHNtYy0+aHcuaXNfaW1hc2spCisjZWxzZQorI2RlZmluZQlTVElfRkJJKHNtYykJb3V0cGQoQUREUlMoKHNtYyksQjBfSU1TSyksKHNtYyktPmh3LmlzX2ltYXNrKQorI2VuZGlmCisKKyNkZWZpbmUgQ0xJX0ZCSV9TTVAoaW9wKQlvdXRwZCgoaW9wKStCMF9JTVNLLDApCisjZGVmaW5lCVNUSV9GQklfU01QKHNtYyxpb3ApCW91dHBkKChpb3ApK0IwX0lNU0ssKHNtYyktPmh3LmlzX2ltYXNrKQorCisjZW5kaWYJLyogUENJICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIDEyIGJpdCB0cmFuc2ZlciAoZHdvcmQpIGNvdW50ZXI6CisgKgkoSVNBOgkyKnRyYyA9IG51bWJlciBvZiBieXRlKQorICoJKEVJU0E6CTQqdHJjID0gbnVtYmVyIG9mIGJ5dGUpCisgKgkoTUNBOgk0KnRyYyA9IG51bWJlciBvZiBieXRlKQorICovCisjZGVmaW5lCU1BWF9UUkFOUwkoMHgwZmZmKQorCisvKgorICogUEMgUElDCisgKi8KKyNkZWZpbmUJTVNUXzgyNTkgKDB4MjApCisjZGVmaW5lCVNMVl84MjU5ICgweEEwKQorCisjZGVmaW5lIFRQUwkJKDE4KQkJLyogdGlja3MgcGVyIHNlY29uZCAqLworCisvKgorICogZXJyb3IgdGltZXIgZGVmcworICovCisjZGVmaW5lCVROCQkoNCkJLyogbnVtYmVyIG9mIHN1cHBvcnRlZCB0aW1lciA9IFROKzEgKi8KKyNkZWZpbmUJU05QUE5EX1RJTUUJKDUpCS8qIGJ1ZmZlciBtZW1vcnkgYWNjZXNzIG92ZXIgbWVtLiBkYXRhIHJlZy4gKi8KKworI2RlZmluZQlNQUNfQUQJMHg0MDVhMDAwMAorCisjZGVmaW5lIE1PRFIxCUZNX0EoRk1fTURSRUcxKQkvKiBtb2RlIHJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgTU9EUjIJRk1fQShGTV9NRFJFRzIpCS8qIG1vZGUgcmVnaXN0ZXIgMiAqLworCisjZGVmaW5lIENNRFIxCUZNX0EoRk1fQ01EUkVHMSkJLyogY29tbWFuZCByZWdpc3RlciAxICovCisjZGVmaW5lIENNRFIyCUZNX0EoRk1fQ01EUkVHMikJLyogY29tbWFuZCByZWdpc3RlciAyICovCisKKworLyoKKyAqIGZ1bmN0aW9uIGRlZmluZXMKKyAqLworI2RlZmluZQlDTEVBUihpbyxtYXNrKQkJb3V0cHcoKGlvKSxpbnB3KGlvKSYofihtYXNrKSkpCisjZGVmaW5lCVNFVChpbyxtYXNrKQkJb3V0cHcoKGlvKSxpbnB3KGlvKXwobWFzaykpCisjZGVmaW5lCUdFVChpbyxtYXNrKQkJKGlucHcoaW8pJihtYXNrKSkKKyNkZWZpbmUJU0VUTUFTSyhpbyx2YWwsbWFzaykJb3V0cHcoKGlvKSwoaW5wdyhpbykgJiB+KG1hc2spKSB8ICh2YWwpKQorCisvKgorICogUEhZIFBvcnQgQSAoUEEpID0gUExDIDEKKyAqIFdpdGggU3VwZXJOZXQgMyBQSFktQSBhbmQgUEhZIFMgYXJlIGlkZW50aWNhbC4KKyAqLworI2RlZmluZQlQTEMobnAscmVnKQkoKChucCkgPT0gUEEpID8gUDJfQShyZWcpIDogUDFfQShyZWcpKQorCisvKgorICogc2V0IG1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVyIGZvciB3cml0ZSBhbmQgcmVhZAorICovCisjZGVmaW5lCU1BUlcobWEpCW91dHB3KEZNX0EoRk1fTUFSVyksKHVuc2lnbmVkIGludCkobWEpKQorI2RlZmluZQlNQVJSKG1hKQlvdXRwdyhGTV9BKEZNX01BUlIpLCh1bnNpZ25lZCBpbnQpKG1hKSkKKworLyoKKyAqIHJlYWQvd3JpdGUgZnJvbS90byBtZW1vcnkgZGF0YSByZWdpc3RlcgorICovCisvKiB3cml0ZSBkb3VibGUgd29yZCAqLworI2RlZmluZQlNRFJXKGRkKQlvdXRwdyhGTV9BKEZNX01EUlUpLCh1bnNpZ25lZCBpbnQpKChkZCk+PjE2KSkgO1wKKwkJCW91dHB3KEZNX0EoRk1fTURSTCksKHVuc2lnbmVkIGludCkoZGQpKQorCisjaWZuZGVmIFdJTk5UCisvKiByZWFkIGRvdWJsZSB3b3JkICovCisjZGVmaW5lCU1EUlIoKQkJKCgobG9uZylpbnB3KEZNX0EoRk1fTURSVSkpPDwxNikgKyBpbnB3KEZNX0EoRk1fTURSTCkpKQorCisvKiByZWFkIEZPUk1BQysgMzItYml0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQlHRVRfU1QxKCkJKCgobG9uZylpbnB3KEZNX0EoRk1fU1QxVSkpPDwxNikgKyBpbnB3KEZNX0EoRk1fU1QxTCkpKQorI2RlZmluZQlHRVRfU1QyKCkJKCgobG9uZylpbnB3KEZNX0EoRk1fU1QyVSkpPDwxNikgKyBpbnB3KEZNX0EoRk1fU1QyTCkpKQorI2lmZGVmCVNVUEVSTkVUXzMKKyNkZWZpbmUJR0VUX1NUMygpCSgoKGxvbmcpaW5wdyhGTV9BKEZNX1NUM1UpKTw8MTYpICsgaW5wdyhGTV9BKEZNX1NUM0wpKSkKKyNlbmRpZgorI2Vsc2UKKy8qIHJlYWQgZG91YmxlIHdvcmQgKi8KKyNkZWZpbmUgTURSUigpCQlpbnAydygoRk1fQShGTV9NRFJVKSksKEZNX0EoRk1fTURSTCkpKQorCisvKiByZWFkIEZPUk1BQysgMzItYml0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBHRVRfU1QxKCkJaW5wMncoKEZNX0EoRk1fU1QxVSkpLChGTV9BKEZNX1NUMUwpKSkKKyNkZWZpbmUgR0VUX1NUMigpCWlucDJ3KChGTV9BKEZNX1NUMlUpKSwoRk1fQShGTV9TVDJMKSkpCisjaWZkZWYJU1VQRVJORVRfMworI2RlZmluZSBHRVRfU1QzKCkJaW5wMncoKEZNX0EoRk1fU1QzVSkpLChGTV9BKEZNX1NUM0wpKSkKKyNlbmRpZgorI2VuZGlmCisKKy8qIFNwZWNpYWwgdGltZXIgbWFjcm8gZm9yIDgyYzU0ICovCisJCQkJLyogdGltZXIgYWNjZXNzIG92ZXIgZGF0YSBidXMgYml0IDguLjE1ICovCisjZGVmaW5lCU9VVF84MmM1NF9USU1FUihwb3J0LHZhbCkJb3V0cHcoVElfQShwb3J0KSwodmFsKTw8OCkKKyNkZWZpbmUJSU5fODJjNTRfVElNRVIocG9ydCkJCSgoaW5wdyhUSV9BKHBvcnQpKT4+OCkgJiAweGZmKQorCisKKyNpZmRlZglERUJVRworI2RlZmluZQlEQl9NQUMobWFjLHN0KSB7aWYgKGRlYnVnX21hYyAmIDB4MSlcCisJCQkJcHJpbnRmKCJNIikgO1wKKwkJCWlmIChkZWJ1Z19tYWMgJiAweDIpXAorCQkJCXByaW50ZigiXHRNQUMgJWQgc3RhdHVzIDB4JTA4bHhcbiIsbWFjLHN0KSA7XAorCQkJaWYgKGRlYnVnX21hYyAmIDB4NClcCisJCQkJZHBfbWFjKG1hYyxzdCkgO1wKK30KKworI2RlZmluZQlEQl9QTEMocCxpZXYpIHsJaWYgKGRlYnVnX3BsYyAmIDB4MSlcCisJCQkJcHJpbnRmKCJQIikgO1wKKwkJCWlmIChkZWJ1Z19wbGMgJiAweDIpXAorCQkJCXByaW50ZigiXHRQTEMgJXMgSW50IDB4JTA0eFxuIiwgXAorCQkJCQkocCA9PSBQQSkgPyAiQSIgOiAiQiIsIGlldikgO1wKKwkJCWlmIChkZWJ1Z19wbGMgJiAweDQpXAorCQkJCWRwX3BsYyhwLGlldikgO1wKK30KKworI2RlZmluZQlEQl9USU1FUigpIHsJaWYgKGRlYnVnX3RpbWVyICYgMHgxKVwKKwkJCQlwcmludGYoIlQiKSA7XAorCQkJaWYgKGRlYnVnX3RpbWVyICYgMHgyKVwKKwkJCQlwcmludGYoIlx0VGltZXIgSVNSXG4iKSA7XAorfQorCisjZWxzZQkvKiBubyBERUJVRyAqLworCisjZGVmaW5lCURCX01BQyhtYWMsc3QpCisjZGVmaW5lCURCX1BMQyhwLGlldikKKyNkZWZpbmUJREJfVElNRVIoKQorCisjZW5kaWYJLyogbm8gREVCVUcgKi8KKworI2RlZmluZQlJTkNfUFRSKHNwLGNwLGVwKQlpZiAoKytjcCA9PSBlcCkgY3AgPSBzcAorLyoKKyAqIHRpbWVyIGRlZnMKKyAqLworI2RlZmluZQlDT1VOVCh0KQkoKHQpPDw2KQkvKiBjb3VudGVyICovCisjZGVmaW5lCVJXX09QKG8pCSgobyk8PDQpCS8qIHJlYWQvd3JpdGUgb3BlcmF0aW9uICovCisjZGVmaW5lCVRNT0RFKG0pCSgobSk8PDEpCS8qIHRpbWVyIG1vZGUgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvc2tmYmlpbmMuaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC9za2ZiaWluYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZDU1YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvc2tmYmlpbmMuaApAQCAtMCwwICsxLDEyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglfU0tGQklJTkNfCisjZGVmaW5lIF9TS0ZCSUlOQ18KKworI2luY2x1ZGUgImgvc3VwZXJuXzIuaCIKKworLyoKKyAqIHNwZWNpYWwgZGVmaW5lcyBmb3IgdXNlIGludG8gLmFzbSBmaWxlcworICovCisjZGVmaW5lIEVSUl9GTEFHUyAoRlNfTVNSQUJUIHwgRlNfU0VBQzIgfCBGU19TRlJNRVJSIHwgRlNfU0ZSTVRZMSkKKworI2lmZGVmCUlTQQorI2RlZmluZSBETUFfQlVTWV9DSEVDSwlDU1JBCisjZGVmaW5lCUlNQVNLX0ZBU1QJKElTX1BMSU5UMSB8IElTX1BMSU5UMiB8IElTX1RJTUlOVCkKKyNkZWZpbmUJSFJRUgkJKFJRQUErKFJRX1JSUTw8MSkpCisjZGVmaW5lCUhSUVcJCShSUUFBKyhSUV9XQTI8PDEpKQorI2RlZmluZQlIUlFBMAkJKFJRQUErKFJRX1dBMDw8MSkpCisjZGVmaW5lIEhSUVNRCQkoUlFBQSsoUlFfV1NRPDwxKSkKKyNlbmRpZgorCisjaWZkZWYJRUlTQQorI2RlZmluZQlETUFfQlVTWV9DSEVDSwlDU1JBCisjZGVmaW5lIERNQV9ISUdIX1dPUkQJMHgwNDAwCisjZGVmaW5lIERNQV9NQVNLX00JMHgwYQorI2RlZmluZSBETUFfTU9ERV9NCTB4MGIKKyNkZWZpbmUgRE1BX0JZVEVfUFRSX00JMHgwYworI2RlZmluZSBETUFfTUFTS19TCTB4MGQ0CisjZGVmaW5lIERNQV9NT0RFX1MJMHgwZDYKKyNkZWZpbmUgRE1BX0JZVEVfUFRSX1MJMHgwZDgKKyNkZWZpbmUJSU1BU0tfRkFTVAkoSVNfUExJTlQxIHwgSVNfUExJTlQyIHwgSVNfVElNSU5UIHwgSVNfVEMpCisjZW5kaWYJLyogRUlTQSAqLworCisjaWZkZWYJTUNBCisjZGVmaW5lCUlNQVNLX0ZBU1QJKElTX1BMSU5UMSB8IElTX1BMSU5UMiB8IElTX1RJTUlOVCB8IElTX1RPS0VOIHwgXAorCQkJIElTX0NIQ0tfTCB8IElTX0JVU0VSUikKKyNlbmRpZgorCisjaWZkZWYgUENJCisjZGVmaW5lCUlNQVNLX0ZBU1QJKElTX1BMSU5UMSB8IElTX1BMSU5UMiB8IElTX1RJTUlOVCB8IElTX1RPS0VOIHwgXAorCQkJIElTX01JTlRSMiB8IElTX01JTlRSMyB8IElTX1IxX1AgfCBcCisJCQkgSVNfUjFfQyB8IElTX1hBX0MgfCBJU19YU19DKQorI2VuZGlmCisKKyNpZmRlZglQQ0kKKyNkZWZpbmUJSVNSX01BU0sJKElTX01JTlRSMSB8IElTX1IxX0YgfCBJU19YU19GfCBJU19YQV9GIHwgSU1BU0tfRkFTVCkKKyNlbHNlCisjZGVmaW5lCUlTUl9NQVNLCShJU19NSU5UUjEgfCBJU19NSU5UUjIgfCBJTUFTS19GQVNUKQorI2VuZGlmCisKKyNkZWZpbmUJRk1BX0ZNX0NNRFJFRzEJRk1BKEZNX0NNRFJFRzEpCisjZGVmaW5lCUZNQV9GTV9DTURSRUcyCUZNQShGTV9DTURSRUcyKQorI2RlZmluZQlGTUFfRk1fU1RNQ0hOCUZNQShGTV9TVE1DSE4pCisjZGVmaW5lCUZNQV9GTV9SUFIJRk1BKEZNX1JQUikKKyNkZWZpbmUJRk1BX0ZNX1dQWEEwCUZNQShGTV9XUFhBMCkKKyNkZWZpbmUJRk1BX0ZNX1dQWEEyCUZNQShGTV9XUFhBMikKKyNkZWZpbmUJRk1BX0ZNX01BUlIJRk1BKEZNX01BUlIpCisjZGVmaW5lCUZNQV9GTV9NQVJXCUZNQShGTV9NQVJXKQorI2RlZmluZQlGTUFfRk1fTURSVQlGTUEoRk1fTURSVSkKKyNkZWZpbmUJRk1BX0ZNX01EUkwJRk1BKEZNX01EUkwpCisjZGVmaW5lCUZNQV9TVDFMCUZNQShGTV9TVDFMKQorI2RlZmluZQlGTUFfU1QxVQlGTUEoRk1fU1QxVSkKKyNkZWZpbmUJRk1BX1NUMkwJRk1BKEZNX1NUMkwpCisjZGVmaW5lCUZNQV9TVDJVCUZNQShGTV9TVDJVKQorI2lmZGVmCVNVUEVSTkVUXzMKKyNkZWZpbmUgRk1BX1NUM0wJRk1BKEZNX1NUM0wpCisjZGVmaW5lIEZNQV9TVDNVCUZNQShGTV9TVDNVKQorI2VuZGlmCisKKyNkZWZpbmUgVE1PREVfUlJRCVJRX1JSUQorI2RlZmluZSBUTU9ERV9XQVEyCVJRX1dBMgorI2RlZmluZQlIU1JBCQlIU1IoMCkKKworCisjZGVmaW5lIEZNQV9GTV9TVDFMCUZNQV9TVDFMCisjZGVmaW5lIEZNQV9GTV9TVDFVCUZNQV9TVDFVCisjZGVmaW5lIEZNQV9GTV9TVDJMCUZNQV9TVDJMCisjZGVmaW5lIEZNQV9GTV9TVDJVCUZNQV9TVDJVCisjaWZkZWYJU1VQRVJORVRfMworI2RlZmluZSBGTUFfRk1fU1QzTAlGTUFfU1QzTAorI2RlZmluZSBGTUFfRk1fU1QzVQlGTUFfU1QzVQorI2VuZGlmCisKKyNkZWZpbmUgRk1BX0ZNX1NXUFIJRk1BKEZNX1NXUFIpCisKKyNkZWZpbmUgRk1BX0ZNX1JQWEEwCUZNQShGTV9SUFhBMCkKKworI2RlZmluZQlGTUFfRk1fUlBYUwlGTUEoRk1fUlBYUykKKyNkZWZpbmUJRk1BX0ZNX1dQWFMJRk1BKEZNX1dQWFMpCisKKyNkZWZpbmUJRk1BX0ZNX0lNU0sxVQlGTUEoRk1fSU1TSzFVKQorI2RlZmluZQlGTUFfRk1fSU1TSzFMCUZNQShGTV9JTVNLMUwpCisKKyNkZWZpbmUJRk1BX0ZNX0VBUwlGTUEoRk1fRUFTKQorI2RlZmluZQlGTUFfRk1fRUFBMAlGTUEoRk1fRUFBMCkKKworI2RlZmluZQlUTU9ERV9XQVEwCVJRX1dBMAorI2RlZmluZSBUTU9ERV9XU1EJUlFfV1NRCisKKy8qIERlZmluZSBkZWZhdWx0IGZvciBEUlZfUENNX1NUQVRFX0NIQU5HRSAqLworI2lmbmRlZglEUlZfUENNX1NUQVRFX0NIQU5HRQorI2RlZmluZQlEUlZfUENNX1NUQVRFX0NIQU5HRShzbWMscGxjLHBfc3RhdGUpCS8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisvKiBEZWZpbmUgZGVmYXVsdCBmb3IgRFJWX1JNVF9JTkRJQ0FUSU9OICovCisjaWZuZGVmCURSVl9STVRfSU5ESUNBVElPTgorI2RlZmluZQlEUlZfUk1UX0lORElDQVRJT04oc21jLGkpCS8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisjZW5kaWYJLyogbl9TS0ZCSUlOQ18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9oL3NtYy5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL3NtYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzI1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvc21jLmgKQEAgLTAsMCArMSw0NzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYJX1NDTUVDTV8KKyNkZWZpbmUgX1NDTUVDTV8KKworI2lmCWRlZmluZWQoUENJKSAmJiAhZGVmaW5lZChPU0RFRikKKy8qCisgKiBJbiB0aGUgY2FzZSBvZiB0aGUgUENJIGJ1cyB0aGUgZmlsZSBvc2RlZjFzdC5oIG11c3QgYmUgcHJlc2VudAorICovCisjZGVmaW5lCU9TREVGCisjZW5kaWYKKworI2lmZGVmCVBDSQorI2lmbmRlZglTVVBFUk5FVF8zCisjZGVmaW5lCVNVUEVSTkVUXzMKKyNlbmRpZgorI2lmbmRlZglUQUdfTU9ERQorI2RlZmluZQlUQUdfTU9ERQorI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIGluY2x1ZGUgYWxsIG90aGVyIGZpbGVzIGluIHJlcXVpcmVkIG9yZGVyCisgKiB0aGUgZm9sbG93aW5nIGZpbGVzIG11c3QgaGF2ZSBiZWVuIGluY2x1ZGVkIGJlZm9yZToKKyAqCXR5cGVzLmgKKyAqCWZkZGkuaAorICovCisjaWZkZWYJT1NERUYKKyNpbmNsdWRlICJoL29zZGVmMXN0LmgiCisjZW5kaWYJLyogT1NERUYgKi8KKyNpZmRlZglPRU1fQ09OQ0VQVAorI2luY2x1ZGUgIm9lbWRlZi5oIgorI2VuZGlmCS8qIE9FTV9DT05DRVBUICovCisjaW5jbHVkZSAiaC9zbXQuaCIKKyNpbmNsdWRlICJoL2NtdGRlZi5oIgorI2luY2x1ZGUgImgvZmRkaW1pYi5oIgorI2luY2x1ZGUgImgvdGFyZ2V0aHcuaCIJCS8qIGFsbCB0YXJnZXQgaHcgZGVwZW5kZW5jaWVzICovCisjaW5jbHVkZSAiaC90YXJnZXRvcy5oIgkJLyogYWxsIHRhcmdldCBvcyBkZXBlbmRlbmNpZXMgKi8KKyNpZmRlZglFU1MKKyNpbmNsdWRlICJoL3NiYS5oIgorI2VuZGlmCisKKy8qCisgKiBFdmVudCBRdWV1ZQorICoJcXVldWUuYworICogZXZlbnRzIGFyZSBjbGFzcy92YWx1ZSBwYWlycworICoJY2xhc3MJaXMgYWRkcmVzc2VlLCBlLmcuIFJNVCwgUENNIGV0Yy4KKyAqCXZhbHVlCWlzIGNvbW1hbmQsIGUuZy4gbGluZSBzdGF0ZSBjaGFuZ2UsIHJpbmcgb3AgY2hhbmdlIGV0Yy4KKyAqLworc3RydWN0IGV2ZW50X3F1ZXVlIHsKKwl1X3Nob3J0CWNsYXNzIDsJCQkvKiBldmVudCBjbGFzcyAqLworCXVfc2hvcnQJZXZlbnQgOwkJCS8qIGV2ZW50IHZhbHVlICovCit9IDsKKworLyoKKyAqIGRlZmluZSBldmVudCBxdWV1ZSBhcyBjaXJjdWxhciBidWZmZXIKKyAqLworI2lmZGVmCUNPTkNFTlRSQVRPUgorI2RlZmluZSBNQVhfRVZFTlQJMTI4CisjZWxzZQkvKiBuQ09OQ0VOVFJBVE9SICovCisjZGVmaW5lIE1BWF9FVkVOVAk2NAorI2VuZGlmCS8qIG5DT05DRU5UUkFUT1IgKi8KKworc3RydWN0IHNfcXVldWUgeworCisJc3RydWN0IGV2ZW50X3F1ZXVlIGV2X3F1ZXVlW01BWF9FVkVOVF07CisJc3RydWN0IGV2ZW50X3F1ZXVlICpldl9wdXQgOworCXN0cnVjdCBldmVudF9xdWV1ZSAqZXZfZ2V0IDsKK30gOworCisvKgorICogRUNNIC0gRW50aXR5IENvb3JkaW5hdGlvbiBNYW5hZ2VtZW50CisgKiBlY20uYworICovCitzdHJ1Y3Qgc19lY20geworCXVfY2hhciBwYXRoX3Rlc3QgOwkJLyogRUNNIHBhdGggdGVzdCB2YXJpYWJsZSAqLworCXVfY2hhciBzYl9mbGFnIDsJCS8qIEVDTSBzdHVjayBieXBhc3MgKi8KKwl1X2NoYXIgRGlzY29ubmVjdEZsYWcgOwkJLyogamQgMDUtQXVnLTE5OTkgQnVnICMxMDQxOSAKKwkJCQkJICogRUNNIGRpc2Nvbm5lY3RlZCAqLworCXVfY2hhciBlY21fbGluZV9zdGF0ZSA7CQkvKiBmbGFnIHRvIGRpc3BhdGNoZXIgOiBsaW5lIHN0YXRlcyAqLworCXVfbG9uZyB0cmFjZV9wcm9wIDsJCS8qIEVDTSBUcmFjZV9Qcm9wIGZsYWcgPj0gMTYgYml0cyAhISAqLworCS8qIE5VTVBIWVMgbm90ZToKKwkgKiB0aGlzIHZhcmlhYmxlIG11c3QgaGF2ZSBlbm91Z2ggYml0cyB0byBob2xkIGFsbCBlbnRpaWVzIGluCisJICogdGhlIHN0YXRpb24uIFNvIE5VTVBIWVMgbWF5IG5vdCBiZSBncmVhdGVyIHRoYW4gMzEuCisJICovCisJY2hhcgllY19wYWRbMl0gOworCXN0cnVjdCBzbXRfdGltZXIgZWNtX3RpbWVyIDsJLyogdGltZXIgKi8KK30gOworCisKKy8qCisgKiBSTVQgLSBSaW5nIE1hbmFnZW1lbnQKKyAqIHJtdC5jCisgKi8KK3N0cnVjdCBzX3JtdCB7CisJdV9jaGFyIGR1cF9hZGRyX3Rlc3QgOwkJLyogc3RhdGUgb2YgZHVwbC4gYWRkci4gdGVzdCAqLworCXVfY2hhciBkYV9mbGFnIDsJCS8qIGZsYWcgOiBkdXBsaWNhdGUgYWRkcmVzcyBkZXQuICovCisJdV9jaGFyIGxvb3BfYXZhaWwgOwkJLyogZmxhZyA6IE1BQyBhdmFpbGFibGUgZm9yIGxvb3BiYWNrICovCisJdV9jaGFyIHNtX21hX2F2YWlsIDsJCS8qIGZsYWcgOiBNQUMgYXZhaWxhYmxlIGZvciBTTVQgKi8KKwl1X2NoYXIgbm9fZmxhZyA7CQkvKiBmbGFnIDogcmluZyBub3Qgb3BlcmF0aW9uYWwgKi8KKwl1X2NoYXIgYm5fZmxhZyA7CQkvKiBmbGFnIDogTUFDIHJlYWNoZWQgYmVhY29uIHN0YXRlICovCisJdV9jaGFyIGptX2ZsYWcgOwkJLyogZmxhZyA6IGphbW1pbmcgaW4gTk9OX09QX0RVUCAqLworCXVfY2hhciBybV9qb2luIDsJCS8qIENGTSBmbGFnIFJNX0pvaW4gKi8KKwl1X2NoYXIgcm1fbG9vcCA7CQkvKiBDRk0gZmxhZyBSTV9Mb29wICovCisKKwlsb25nIGZhc3Rfcm1fam9pbiA7CQkvKiBiaXQgbWFzayBvZiBhY3RpdmUgcG9ydHMgKi8KKwkvKgorCSAqIHRpbWVyIGFuZCBmbGFncworCSAqLworCXN0cnVjdCBzbXRfdGltZXIgcm10X3RpbWVyMCA7CS8qIHRpbWVyIDAgKi8KKwlzdHJ1Y3Qgc210X3RpbWVyIHJtdF90aW1lcjEgOwkvKiB0aW1lciAxICovCisJc3RydWN0IHNtdF90aW1lciBybXRfdGltZXIyIDsJLyogdGltZXIgMiAqLworCXVfY2hhciB0aW1lcjBfZXhwIDsJCS8qIGZsYWcgOiB0aW1lciAwIGV4cGlyZWQgKi8KKwl1X2NoYXIgdGltZXIxX2V4cCA7CQkvKiBmbGFnIDogdGltZXIgMSBleHBpcmVkICovCisJdV9jaGFyIHRpbWVyMl9leHAgOwkJLyogZmxhZyA6IHRpbWVyIDIgZXhwaXJlZCAqLworCisJdV9jaGFyIHJtX3BhZDFbMV0gOworfSA7CisKKy8qCisgKiBDRk0gLSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQKKyAqIGNmbS5jCisgKiB1c2VkIGZvciBTQVMgYW5kIERBUworICovCitzdHJ1Y3Qgc19jZm0geworCXVfY2hhciBjZl9zdGF0ZTsJCS8qIENGTSBzdGF0ZSBtYWNoaW5lIGN1cnJlbnQgc3RhdGUgKi8KKwl1X2NoYXIgY2ZfcGFkWzNdIDsKK30gOworCisvKgorICogQ0VNIC0gQ29uZmlndXJhdGlvbiBFbGVtZW50IE1hbmFnZW1lbnQKKyAqIGNlbS5jCisgKiB1c2VkIGZvciBDb25jZW50cmF0b3IKKyAqLworI2lmZGVmCUNPTkNFTlRSQVRPUgorc3RydWN0IHNfY2VtIHsKKwlpbnQJY2Vfc3RhdGUgOwkvKiBDRU0gc3RhdGUgKi8KKwlpbnQJY2VfcG9ydCA7CS8qIFBBIFBCIFBNIFBNKzEgLi4gKi8KKwlpbnQJY2VfdHlwZSA7CS8qIFRBIFRCIFRTIFRNICovCit9IDsKKworLyoKKyAqIGxpbmtlZCBsaXN0IG9mIENDRXMgaW4gY3VycmVudCB0b2tlbiBwYXRoCisgKi8KK3N0cnVjdCBzX2NfcmluZyB7CisJc3RydWN0IHNfY19yaW5nCSpjX25leHQgOworCWNoYXIJCWNfZW50aXR5IDsKK30gOworCitzdHJ1Y3QgbWliX3BhdGhfY29uZmlnIHsKKwl1X2xvbmcJZmRkaW1pYlBBVEhDb25maWdTTVRJbmRleDsKKwl1X2xvbmcJZmRkaW1pYlBBVEhDb25maWdQQVRISW5kZXg7CisJdV9sb25nCWZkZGltaWJQQVRIQ29uZmlnVG9rZW5PcmRlcjsKKwl1X2xvbmcJZmRkaW1pYlBBVEhDb25maWdSZXNvdXJjZVR5cGU7CisjZGVmaW5lIFNOTVBfUkVTX1RZUEVfTUFDCTIJLyogUmVzb3VyY2UgaXMgYSBNQUMgKi8KKyNkZWZpbmUgU05NUF9SRVNfVFlQRV9QT1JUCTQJLyogUmVzb3VyY2UgaXMgYSBQT1JUICovCisJdV9sb25nCWZkZGltaWJQQVRIQ29uZmlnUmVzb3VyY2VJbmRleDsKKwl1X2xvbmcJZmRkaW1pYlBBVEhDb25maWdDdXJyZW50UGF0aDsKKyNkZWZpbmUgU05NUF9QQVRIX0lTT0xBVEVECTEJLyogQ3VycmVudCBwYXRoIGlzIGlzb2xhdGVkICovCisjZGVmaW5lIFNOTVBfUEFUSF9MT0NBTAkJMgkvKiBDdXJyZW50IHBhdGggaXMgbG9jYWwgKi8KKyNkZWZpbmUgU05NUF9QQVRIX1NFQ09OREFSWQkzCS8qIEN1cnJlbnQgcGF0aCBpcyBzZWNvbmRhcnkgKi8KKyNkZWZpbmUgU05NUF9QQVRIX1BSSU1BUlkJNAkvKiBDdXJyZW50IHBhdGggaXMgcHJpbWFyeSAqLworI2RlZmluZSBTTk1QX1BBVEhfQ09OQ0FURU5BVEVECTUJLyogQ3VycmVudCBwYXRoIGlzIGNvbmNhdGVuYXRlZCAqLworI2RlZmluZSBTTk1QX1BBVEhfVEhSVQkJNgkvKiBDdXJyZW50IHBhdGggaXMgdGhydSAqLworfTsKKworCisjZW5kaWYKKworLyoKKyAqIFBDTSBjb25uZWN0IHN0YXRlcworICovCisjZGVmaW5lIFBDTV9ESVNBQkxFRAkwCisjZGVmaW5lIFBDTV9DT05ORUNUSU5HCTEKKyNkZWZpbmUgUENNX1NUQU5EQlkJMgorI2RlZmluZSBQQ01fQUNUSVZFCTMKKworc3RydWN0IHNfcGNtIHsKKwl1X2NoYXIJcGNtX3BhZFszXSA7Cit9IDsKKworLyoKKyAqIFBIWSBzdHJ1Y3QKKyAqIG9uZSBwZXIgcGh5c2ljYWwgcG9ydAorICovCitzdHJ1Y3Qgc19waHkgeworCS8qIEludGVyIE1vZHVsZSBHbG9iYWxzICovCisJc3RydWN0IGZkZGlfbWliX3AJKm1pYiA7CisKKwl1X2NoYXIgbnAgOwkJLyogaW5kZXggMCAuLiBOVU1QSFlTICovCisJdV9jaGFyIGNmX2pvaW4gOworCXVfY2hhciBjZl9sb29wIDsKKwl1X2NoYXIgd2NfZmxhZyA7CS8qIHdpdGhob2xkIGNvbm5lY3Rpb24gZmxhZyAqLworCXVfY2hhciBwY19tb2RlIDsJLyogSG9sZHMgdGhlIG5lZ290aWF0ZWQgbW9kZSBvZiB0aGUgUENNICovCisJdV9jaGFyIHBjX2xlbV9mYWlsIDsJLyogZmxhZyA6IExDVCBmYWlsZWQgKi8KKwl1X2NoYXIgbGNfdGVzdCA7CisJdV9jaGFyIHNjcnViIDsJCS8qIENGTSBmbGFnIFNjcnViIC0+IFBDTSAqLworCWNoYXIgcGh5X25hbWUgOworCXVfY2hhciBwbWRfdHlwZVsyXSA7CS8qIFNLIGNvbm5lY3Rvci90cmFuc2NlaXZlciB0eXBlIGNvZGVzICovCisjZGVmaW5lIFBNRF9TS19DT05OCTAJLyogcG1kX3R5cGVbUE1EX1NLX0NPTk5dID0gQ29ubmVjdG9yICovCisjZGVmaW5lIFBNRF9TS19QTUQJMQkvKiBwbWRfdHlwZVtQTURfU0tfUE1EXSA9IFh2ZXIgKi8KKwl1X2NoYXIgcG1kX3NjcmFtYmxlIDsJLyogc2NyYW1ibGVyIG9uL29mZiAqLworCisJLyogaW5uZXIgTW9kdWxlIEdsb2JhbHMgKi8KKwl1X2NoYXIgY3Vycl9scyA7CS8qIGN1cnJlbnQgbGluZSBzdGF0ZSAqLworCXVfY2hhciBsc19mbGFnIDsKKwl1X2NoYXIgcmNfZmxhZyA7CisJdV9jaGFyIHRjX2ZsYWcgOworCXVfY2hhciB0ZF9mbGFnIDsKKwl1X2NoYXIgYml0biA7CisJdV9jaGFyIHRyX2ZsYWcgOwkvKiB0cmFjZSByZWN2ZCB3aGlsZSBpbiBhY3RpdmUgKi8KKwl1X2NoYXIgdHdpc3RlZCA7CS8qIGZsYWcgdG8gaW5kaWNhdGUgYW4gQS1BIG9yIEItQiBjb25uZWN0aW9uICovCisJdV9jaGFyIHRfdmFsW05VTUJJVFNdIDsJLyogdHJhbnNtaXQgYml0cyBmb3Igc2lnbmFsaW5nICovCisJdV9jaGFyIHJfdmFsW05VTUJJVFNdIDsJLyogcmVjZWl2ZSBiaXRzIGZvciBzaWduYWxpbmcgKi8KKwl1X2xvbmcgdF9uZXh0W05VTUJJVFNdIDsKKwlzdHJ1Y3Qgc210X3RpbWVyIHBjbV90aW1lcjAgOworCXN0cnVjdCBzbXRfdGltZXIgcGNtX3RpbWVyMSA7CisJc3RydWN0IHNtdF90aW1lciBwY21fdGltZXIyIDsKKwl1X2NoYXIgdGltZXIwX2V4cCA7CisJdV9jaGFyIHRpbWVyMV9leHAgOworCXVfY2hhciB0aW1lcjJfZXhwIDsKKwl1X2NoYXIgcGNtX3BhZDFbMV0gOworCWludAljZW1fcHN0IDsJLyogQ0VNIHByaXZhZSBzdGF0ZTsgdXNlZCBmb3IgZHVhbCBob21pbmcgKi8KKwlzdHJ1Y3QgbGVtX2NvdW50ZXIgbGVtIDsKKyNpZmRlZglBTURQTEMKKwlzdHJ1Y3Qgc19wbGMJcGxjIDsKKyNlbmRpZgorfSA7CisKKy8qCisgKiB0aW1lciBwYWNrYWdlCisgKiBzbXR0aW1lci5jCisgKi8KK3N0cnVjdCBzX3RpbWVyIHsKKwlzdHJ1Y3Qgc210X3RpbWVyCSpzdF9xdWV1ZSA7CisJc3RydWN0IHNtdF90aW1lcglzdF9mYXN0IDsKK30gOworCisvKgorICogU1JGIHR5cGVzIGFuZCBkYXRhCisgKi8KKyNkZWZpbmUgU01UX0VWRU5UX0JBU0UJCQkxCisjZGVmaW5lIFNNVF9FVkVOVF9NQUNfUEFUSF9DSEFOR0UJKFNNVF9FVkVOVF9CQVNFKzApCisjZGVmaW5lIFNNVF9FVkVOVF9NQUNfTkVJR0hCT1JfQ0hBTkdFCShTTVRfRVZFTlRfQkFTRSsxKQorI2RlZmluZSBTTVRfRVZFTlRfUE9SVF9QQVRIX0NIQU5HRQkoU01UX0VWRU5UX0JBU0UrMikKKyNkZWZpbmUgU01UX0VWRU5UX1BPUlRfQ09OTkVDVElPTgkoU01UX0VWRU5UX0JBU0UrMykKKworI2RlZmluZSBTTVRfSVNfQ09ORElUSU9OKHgpCQkJKCh4KT49U01UX0NPTkRfQkFTRSkKKworI2RlZmluZSBTTVRfQ09ORF9CQVNFCQkoU01UX0VWRU5UX1BPUlRfQ09OTkVDVElPTisxKQorI2RlZmluZSBTTVRfQ09ORF9TTVRfUEVFUl9XUkFQCQkoU01UX0NPTkRfQkFTRSswKQorI2RlZmluZSBTTVRfQ09ORF9TTVRfSE9MRAkJKFNNVF9DT05EX0JBU0UrMSkKKyNkZWZpbmUgU01UX0NPTkRfTUFDX0ZSQU1FX0VSUk9SCShTTVRfQ09ORF9CQVNFKzIpCisjZGVmaW5lIFNNVF9DT05EX01BQ19EVVBfQUREUgkJKFNNVF9DT05EX0JBU0UrMykKKyNkZWZpbmUgU01UX0NPTkRfTUFDX05PVF9DT1BJRUQJCShTTVRfQ09ORF9CQVNFKzQpCisjZGVmaW5lIFNNVF9DT05EX1BPUlRfRUJfRVJST1IJCShTTVRfQ09ORF9CQVNFKzUpCisjZGVmaW5lIFNNVF9DT05EX1BPUlRfTEVSCQkoU01UX0NPTkRfQkFTRSs2KQorCisjZGVmaW5lIFNSMF9XQUlUCTAKKyNkZWZpbmUgU1IxX0hPTERPRkYJMQorI2RlZmluZSBTUjJfRElTQUJMRUQJMgorCitzdHJ1Y3Qgc19zcmYgeworCXVfbG9uZwlTUlRocmVzaG9sZCA7CQkJLyogdGhyZXNob2xkIHZhbHVlICovCisJdV9jaGFyCVJUX0ZsYWcgOwkJCS8qIHJlcG9ydCB0cmFuc21pdHRlZCBmbGFnICovCisJdV9jaGFyCXNyX3N0YXRlIDsJCQkvKiBzdGF0ZS1tYWNoaW5lICovCisJdV9jaGFyCWFueV9yZXBvcnQgOwkJCS8qIGFueSByZXBvcnQgcmVxdWlyZWQgKi8KKwl1X2xvbmcJVFNSIDsJCQkJLyogdGltZXIgKi8KKwl1X3Nob3J0CXJpbmdfc3RhdHVzIDsJCQkvKiBJQk0gcmluZyBzdGF0dXMgKi8KK30gOworCisvKgorICogSUJNIHRva2VuIHJpbmcgc3RhdHVzCisgKi8KKyNkZWZpbmUgUlNfUkVTMTUJKDE8PDE1KQkJCS8qIHJlc2VydmVkICovCisjZGVmaW5lIFJTX0hBUkRFUlJPUgkoMTw8MTQpCQkJLyogcmluZyBkb3duICovCisjZGVmaW5lIFJTX1NPRlRFUlJPUgkoMTw8MTMpCQkJLyogc2VudCBTUkYgKi8KKyNkZWZpbmUgUlNfQkVBQ09OCSgxPDwxMikJCQkvKiB0cmFuc21pdHRlZCBiZWFjb24gKi8KKyNkZWZpbmUgUlNfUEFUSFRFU1QJKDE8PDExKQkJCS8qIHBhdGggdGVzdCBmYWlsZWQgKi8KKyNkZWZpbmUgUlNfU0VMRlRFU1QJKDE8PDEwKQkJCS8qIHNlbGZ0ZXN0IHJlcXVpcmVkICovCisjZGVmaW5lIFJTX1JFUzkJCSgxPDwgOSkJCQkvKiByZXNlcnZlZCAqLworI2RlZmluZSBSU19ESVNDT05ORUNUCSgxPDwgOCkJCQkvKiByZW1vdGUgZGlzY29ubmVjdCAqLworI2RlZmluZSBSU19SRVM3CQkoMTw8IDcpCQkJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUlNfRFVQQUREUgkoMTw8IDYpCQkJLyogZHVwbGljYXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUlNfTk9SSU5HT1AJKDE8PCA1KQkJCS8qIG5vIHJpbmcgb3AgKi8KKyNkZWZpbmUgUlNfVkVSU0lPTgkoMTw8IDQpCQkJLyogU01UIHZlcnNpb24gbWlzbWF0Y2ggKi8KKyNkZWZpbmUgUlNfU1RVQ0tCWVBBU1NTCSgxPDwgMykJCQkvKiBzdHVjayBieXBhc3MgKi8KKyNkZWZpbmUgUlNfRVZFTlQJKDE8PCAyKQkJCS8qIEZEREkgZXZlbnQgb2NjdXJyZWQgKi8KKyNkZWZpbmUgUlNfUklOR09QQ0hBTkdFCSgxPDwgMSkJCQkvKiByaW5nIG9wIGNoYW5nZWQgKi8KKyNkZWZpbmUgUlNfUkVTMAkJKDE8PCAwKQkJCS8qIHJlc2VydmVkICovCisKKyNkZWZpbmUgUlNfU0VUKHNtYyxiaXQpIFwKKwlyaW5nX3N0YXR1c19pbmRpY2F0aW9uKHNtYyxzbWMtPnNyZi5yaW5nX3N0YXR1cyB8PSBiaXQpCisjZGVmaW5lIFJTX0NMRUFSKHNtYyxiaXQpCVwKKwlyaW5nX3N0YXR1c19pbmRpY2F0aW9uKHNtYyxzbWMtPnNyZi5yaW5nX3N0YXR1cyAmPSB+Yml0KQorCisjZGVmaW5lIFJTX0NMRUFSX0VWRU5UCSgweGZmZmYgJiB+KFJTX05PUklOR09QKSkKKworLyogRGVmaW5lIHRoZSBBSVgtZXZlbnQtTm90aWZpY2F0aW9uIGFzIG51bGwgZnVuY3Rpb24gaWYgaXQgaXNuJ3QgZGVmaW5lZCAqLworLyogaW4gdGhlIHRhcmdldG9zLmggZmlsZSAqLworI2lmbmRlZiBBSVhfRVZFTlQKKyNkZWZpbmUgQUlYX0VWRU5UKHNtYyxvcHQwLG9wdDEsb3B0MixvcHQzKQkvKiBub3RoaW5nICovCisjZW5kaWYKKworc3RydWN0IHNfc3JmX2V2YyB7CisJdV9jaGFyCWV2Y19jb2RlIDsJCQkvKiBldmVudCBjb2RlIHR5cGUgKi8KKwl1X2NoYXIJZXZjX2luZGV4IDsJCQkvKiBpbmRleCBmb3IgbXVsdC4gaW5zdGFuY2VzICovCisJdV9jaGFyCWV2Y19yZXBfcmVxdWlyZWQgOwkJLyogcmVwb3J0IHJlcXVpcmVkICovCisJdV9zaG9ydAlldmNfcGFyYSA7CQkJLyogU01UIFBhcmEgTnVtYmVyICovCisJdV9jaGFyCSpldmNfY29uZF9zdGF0ZSA7CQkvKiBjb25kaXRpb24gc3RhdGUgKi8KKwl1X2NoYXIJKmV2Y19tdWx0aXBsZSA7CQkJLyogbXVsdGlwbGUgb2NjdXJyZW5jZSAqLworfSA7CisKKy8qCisgKiBWYWx1ZXMgdXNlZCBieSBmcmFtZSBiYXNlZCBzZXJ2aWNlcworICogc210LmMKKyAqLworI2RlZmluZSBTTVRfTUFYX1RFU1QJCTUKKyNkZWZpbmUgU01UX1RJRF9OSUYJCTAJCS8qIHBlbmRpbmcgTklGIHJlcXVlc3QgKi8KKyNkZWZpbmUgU01UX1RJRF9OSUZfVEVTVAkxCQkvKiBwZW5kaW5nIE5JRiB0ZXN0ICovCisjZGVmaW5lIFNNVF9USURfRUNGX1VOQQkJMgkJLyogcGVuZGluZyBFQ0YgVU5BIHRlc3QgKi8KKyNkZWZpbmUgU01UX1RJRF9FQ0ZfRE5BCQkzCQkvKiBwZW5kaW5nIEVDRiBETkEgdGVzdCAqLworI2RlZmluZSBTTVRfVElEX0VDRgkJNAkJLyogcGVuZGluZyBFQ0YgdGVzdCAqLworCitzdHJ1Y3Qgc210X3ZhbHVlcyB7CisJdV9sb25nCQlzbXRfdHZ1IDsJCS8qIHRpbWVyIHZhbGlkIHVuYSAqLworCXVfbG9uZwkJc210X3R2ZCA7CQkvKiB0aW1lciB2YWxpZCBkbmEgKi8KKwl1X2xvbmcJCXNtdF90aWQgOwkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKwl1X2xvbmcJCXBlbmRbU01UX01BWF9URVNUXSA7CS8qIFRJRCBvZiByZXF1ZXN0cyAqLworCXVfbG9uZwkJdW5pcV90aW1lIDsJCS8qIHVuaXF1ZSB0aW1lIHN0YW1wICovCisJdV9zaG9ydAkJdW5pcV90aWNrcyAgOwkJLyogdW5pcXVlIHRpbWUgc3RhbXAgKi8KKwl1X3Nob3J0CQlwbGVhc2VfcmVjb25uZWN0IDsJLyogZmxhZyA6IHJlY29ubmVjdCAqLworCXVfbG9uZwkJc210X2xhc3RfbGVtIDsKKwl1X2xvbmcJCXNtdF9sYXN0X25vdGlmeSA7CisJc3RydWN0IHNtdF90aW1lcglzbXRfdGltZXIgOwkvKiBTTVQgTklGIHRpbWVyICovCisJdV9sb25nCQlsYXN0X3Rva190aW1lW05VTU1BQ1NdOwkvKiB0b2tlbiBjbnQgZW11bGF0aW9uICovCit9IDsKKworLyoKKyAqIFNNVC9DTVQgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMKKyAqLworI2RlZmluZSBTTVRfREFTCTAJCQkvKiBkdWFsIGF0dGFjaCAqLworI2RlZmluZSBTTVRfU0FTCTEJCQkvKiBzaW5nbGUgYXR0YWNoICovCisjZGVmaW5lIFNNVF9OQUMJMgkJCS8qIG51bGwgYXR0YWNoIGNvbmNlbnRyYXRvciAqLworCitzdHJ1Y3Qgc210X2NvbmZpZyB7CisJdV9jaGFyCWF0dGFjaF9zIDsJCS8qIENGTSBhdHRhY2ggdG8gc2Vjb25kYXJ5IHBhdGggKi8KKwl1X2NoYXIJc2FzIDsJCQkvKiBTTVRfREFTL1NBUy9OQUMgKi8KKwl1X2NoYXIJYnVpbGRfcmluZ19tYXAgOwkvKiBidWlsZCByaW5nbWFwIGlmIFRSVUUgKi8KKwl1X2NoYXIJbnVtcGh5cyA7CQkvKiBudW1iZXIgb2YgYWN0aXZlIHBoeXMgKi8KKwl1X2NoYXIJc2NfcGFkWzFdIDsKKworCXVfbG9uZwlwY21fdGJfbWluIDsJCS8qIFBDTSA6IFRCX01pbiB0aW1lciB2YWx1ZSAqLworCXVfbG9uZwlwY21fdGJfbWF4IDsJCS8qIFBDTSA6IFRCX01heCB0aW1lciB2YWx1ZSAqLworCXVfbG9uZwlwY21fY19taW4gOwkJLyogUENNIDogQ19NaW4gdGltZXIgdmFsdWUgKi8KKwl1X2xvbmcJcGNtX3Rfb3V0IDsJCS8qIFBDTSA6IFRfT3V0IHRpbWVyIHZhbHVlICovCisJdV9sb25nCXBjbV90bF9taW4gOwkJLyogUENNIDogVExfbWluIHRpbWVyIHZhbHVlICovCisJdV9sb25nCXBjbV9sY19zaG9ydCA7CQkvKiBQQ00gOiBMQ19TaG9ydCB0aW1lciB2YWx1ZSAqLworCXVfbG9uZwlwY21fbGNfbWVkaXVtIDsJCS8qIFBDTSA6IExDX01lZGl1bSB0aW1lciB2YWx1ZSAqLworCXVfbG9uZwlwY21fbGNfbG9uZyA7CQkvKiBQQ00gOiBMQ19Mb25nIHRpbWVyIHZhbHVlICovCisJdV9sb25nCXBjbV9sY19leHRlbmRlZCA7CS8qIFBDTSA6IExDX0V4dGVuZGVkIHRpbWVyIHZhbHVlICovCisJdV9sb25nCXBjbV90X25leHRfOSA7CQkvKiBQQ00gOiBUX05leHRbOV0gdGltZXIgdmFsdWUgKi8KKwl1X2xvbmcJcGNtX25zX21heCA7CQkvKiBQQ00gOiBOU19NYXggdGltZXIgdmFsdWUgKi8KKworCXVfbG9uZwllY21faV9tYXggOwkJLyogRUNNIDogSV9NYXggdGltZXIgdmFsdWUgKi8KKwl1X2xvbmcJZWNtX2luX21heCA7CQkvKiBFQ00gOiBJTl9NYXggdGltZXIgdmFsdWUgKi8KKwl1X2xvbmcJZWNtX3RkX21pbiA7CQkvKiBFQ00gOiBURF9NaW4gdGltZXIgKi8KKwl1X2xvbmcJZWNtX3Rlc3RfZG9uZSA7CQkvKiBFQ00gOiBwYXRoIHRlc3QgZG9uZSB0aW1lciAqLworCXVfbG9uZwllY21fY2hlY2tfcG9sbCA7CS8qIEVDTSA6IGNoZWNrIGJ5cGFzcyBwb2xsZXIgKi8KKworCXVfbG9uZwlybXRfdF9ub25fb3AgOwkJLyogUk1UIDogVF9Ob25fT1AgdGltZXIgdmFsdWUgKi8KKwl1X2xvbmcJcm10X3Rfc3R1Y2sgOwkJLyogUk1UIDogVF9TdHVjayB0aW1lciB2YWx1ZSAqLworCXVfbG9uZwlybXRfdF9kaXJlY3QgOwkJLyogUk1UIDogVF9EaXJlY3QgdGltZXIgdmFsdWUgKi8KKwl1X2xvbmcJcm10X3RfamFtIDsJCS8qIFJNVCA6IFRfSmFtIHRpbWVyIHZhbHVlICovCisJdV9sb25nCXJtdF90X2Fubm91bmNlIDsJLyogUk1UIDogVF9Bbm5vdW5jZSB0aW1lciB2YWx1ZSAqLworCXVfbG9uZwlybXRfdF9wb2xsIDsJCS8qIFJNVCA6IGNsYWltL2JlYWNvbiBwb2xsZXIgKi8KKwl1X2xvbmcgIHJtdF9kdXBfbWFjX2JlaGF2aW9yIDsgIC8qIEZsYWcgZm9yIHRoZSBiZWF2aW9yIG9mIFNNVCBpZgorCQkJCQkgKiBhIER1cGxpY2F0ZSBNQUMgQWRkcmVzcyB3YXMgZGV0ZWN0ZWQuCisJCQkJCSAqIEZBTFNFOiBTTVQgd2lsbCBsZWF2ZSBmaW5hbHkgdGhlIHJpbmcKKwkJCQkJICogVFJVRTogIFNNVCB3aWxsIHJlaW5zdGVydCBpbnRvIHRoZSByaW5nCisJCQkJCSAqLworCXVfbG9uZwltYWNfZF9tYXggOwkJLyogTUFDIDogRF9NYXggdGltZXIgdmFsdWUgKi8KKworCXVfbG9uZyBsY3Rfc2hvcnQgOwkJLyogTENUIDogZXJyb3IgdGhyZXNoaG9sZCAqLworCXVfbG9uZyBsY3RfbWVkaXVtIDsJCS8qIExDVCA6IGVycm9yIHRocmVzaGhvbGQgKi8KKwl1X2xvbmcgbGN0X2xvbmcgOwkJLyogTENUIDogZXJyb3IgdGhyZXNoaG9sZCAqLworCXVfbG9uZyBsY3RfZXh0ZW5kZWQgOwkJLyogTENUIDogZXJyb3IgdGhyZXNoaG9sZCAqLworfSA7CisKKyNpZmRlZglERUJVRworLyoKKyAqIERlYnVnZ2luZyBzdHJ1Y3Qgc29tZXRpbWVzIHVzZWQgaW4gc21jCisgKi8KK3N0cnVjdAlzbXRfZGVidWcgeworCWludAlkX3NtdGYgOworCWludAlkX3NtdCA7CisJaW50CWRfZWNtIDsKKwlpbnQJZF9ybXQgOworCWludAlkX2NmbSA7CisJaW50CWRfcGNtIDsKKwlpbnQJZF9wbGMgOworI2lmZGVmCUVTUworCWludAlkX2VzcyA7CisjZW5kaWYKKyNpZmRlZglTQkEKKwlpbnQJZF9zYmEgOworI2VuZGlmCisJc3RydWN0CW9zX2RlYnVnCWRfb3M7CS8qIEluY2x1ZGUgc3BlY2lmaWMgT1MgREVCVUcgc3RydWN0ICovCit9IDsKKworI2lmbmRlZglERUJVR19CUkQKKy8qIGFsbCBib2FyZHMgc2hhbGwgYmUgZGVidWdnZWQgd2l0aCBvbmUgZGVidWcgc3RydWN0ICovCitleHRlcm4Jc3RydWN0CXNtdF9kZWJ1ZwlkZWJ1ZzsJLyogRGVjbGFyYXRpb24gb2YgZGVidWcgc3RydWN0ICovCisjZW5kaWYJLyogREVCVUdfQlJEICovCisKKyNlbmRpZgkvKiBERUJVRyAqLworCisvKgorICogdGhlIFNNVCBDb250ZXh0IFN0cnVjdCBTTUMKKyAqIHRoaXMgc3RydWN0IGNvbnRhaW5zIEFMTCBnbG9iYWwgdmFyaWFibGVzIG9mIFNNVAorICovCitzdHJ1Y3Qgc19zbWMgeworCXN0cnVjdCBzX3NtdF9vcwlvcyA7CQkvKiBvcyBzcGVjaWZpYyAqLworCXN0cnVjdCBzX3NtdF9odwlodyA7CQkvKiBoYXJkd2FyZSAqLworCisvKgorICogTk9URTogb3MgYW5kIGh3IE1VU1QgQkUgdGhlIGZpcnN0IHR3byBzdHJ1Y3RzCisgKiBhbnl0aGluZyBiZXlvbmQgaHcgV0lMTCBCRSBTRVQgVE8gWkVSTyBpbiBzbXRfc2V0X2RlZmF1bHRzKCkKKyAqLworCXN0cnVjdCBzbXRfY29uZmlnIHMgOwkJLyogc210IGNvbnN0YW50cyAqLworCXN0cnVjdCBzbXRfdmFsdWVzIHNtIDsJCS8qIHNtdCB2YXJpYWJsZXMgKi8KKwlzdHJ1Y3Qgc19lY20JZSA7CQkvKiBlY20gKi8KKwlzdHJ1Y3Qgc19ybXQJciA7CQkvKiBybXQgKi8KKwlzdHJ1Y3Qgc19jZm0JY2YgOwkJLyogY2ZtL2NlbSAqLworI2lmZGVmCUNPTkNFTlRSQVRPUgorCXN0cnVjdCBzX2NlbQljZVtOVU1QSFlTXSA7CS8qIGNlbSAqLworCXN0cnVjdCBzX2NfcmluZwljcltOVU1QSFlTK05VTU1BQ1NdIDsKKyNlbmRpZgorCXN0cnVjdCBzX3BjbQlwIDsJCS8qIHBjbSAqLworCXN0cnVjdCBzX3BoeQl5W05VTVBIWVNdIDsJLyogcGh5ICovCisJc3RydWN0IHNfcXVldWUJcSA7CQkvKiBxdWV1ZSAqLworCXN0cnVjdCBzX3RpbWVyCXQgOwkJLyogdGltZXIgKi8KKwlzdHJ1Y3Qgc19zcmYgc3JmIDsJCS8qIFNSRiAqLworCXN0cnVjdCBzX3NyZl9ldmMgZXZjc1s2K05VTVBIWVMqNF0gOworCXN0cnVjdCBmZGRpX21pYgltaWIgOwkJLyogX19USEVfTUlCX18gKi8KKyNpZmRlZglTQkEKKwlzdHJ1Y3Qgc19zYmEJc2JhIDsJCS8qIFNCQSB2YXJpYWJsZXMgKi8KKyNlbmRpZgorI2lmZGVmCUVTUworCXN0cnVjdCBzX2Vzcwllc3MgOwkJLyogRXNzIHZhcmlhYmxlcyAqLworI2VuZGlmCisjaWYJZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChERUJVR19CUkQpCisJLyogSWYgeW91IHdhbnQgYWxsIHNpbmdsZSBib2FyZCB0byBiZSBkZWJ1Z2dlZCBzZXBhcmF0ZWx5ICovCisJc3RydWN0IHNtdF9kZWJ1ZwlkZWJ1ZzsJLyogRGVjbGFyYXRpb24gb2YgZGVidWcgc3RydWN0ICovCisjZW5kaWYJLyogREVCVUdfQlJEICYmIERFQlVHICovCit9IDsKKworI2VuZGlmCS8qIF9TQ01FQ01fICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9zbXQuaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC9zbXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmY1ODk5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9oL3NtdC5oCkBAIC0wLDAgKzEsODgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU01UIDcuMiBmcmFtZSBkZWZpbml0aW9ucworICovCisKKyNpZm5kZWYJX1NNVF8KKyNkZWZpbmUgX1NNVF8KKworLyogI2RlZmluZSBTTVQ1XzEwICovCisjZGVmaW5lIFNNVDZfMTAKKyNkZWZpbmUgU01UN18yMAorCisjZGVmaW5lCU9QVF9QTUYJCS8qIGlmIHBhcmFtZXRlciBtYW5hZ2VtZW50IGlzIHN1cHBvcnRlZCAqLworI2RlZmluZQlPUFRfU1JGCQkvKiBpZiBzdGF0dXMgcmVwb3J0IGlzIHN1cHBvcnRlZCAqLworCisvKgorICogU01UIGZyYW1lIHZlcnNpb24gNS4xCisgKi8KKworI2RlZmluZSBTTVRfVklECTB4MDAwMQkJCS8qIFYgNS4xIC4uIDYuMSAqLworI2RlZmluZSBTTVRfVklEXzIgMHgwMDAyCQkvKiBWIDcuMiAqLworCitzdHJ1Y3Qgc210X3NpZCB7CisJdV9jaGFyCXNpZF9vZW1bMl0gOwkJCS8qIGltcGxlbWVudGF0aW9uIHNwZWMuICovCisJc3RydWN0IGZkZGlfYWRkciBzaWRfbm9kZSA7CQkvKiBub2RlIGFkZHJlc3MgKi8KK30gOworCit0eXBlZGVmIHVfY2hhcgl0X3N0YXRpb25faWRbOF0gOworCisvKgorICogbm90ZSBvbiBhbGlnbm1lbnQgOgorICogc2l6ZW9mKHN0cnVjdCBzbXRfaGVhZGVyKSA9IDMyCisgKiBhbGwgcGFyYW1ldGVycyBhcmUgbG9uZyBhbGlnbmVkCisgKiBpZiBzdHJ1Y3Qgc210X2hlYWRlciBzdGFydHMgYXQgb2Zmc2V0IDAsIGFsbCBsb25ncyBhcmUgYWxpZ25lZCBjb3JyZWN0bHkKKyAqIChGQyBzdGFydHMgYXQgb2Zmc2V0IDMpCisgKi8KK19wYWNrZWQgc3RydWN0IHNtdF9oZWFkZXIgeworCXN0cnVjdCBmZGRpX2FkZHIgICAgCXNtdF9kZXN0IDsJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCXN0cnVjdCBmZGRpX2FkZHIJc210X3NvdXJjZSA7CS8qIHNvdXJjZSBhZGRyZXNzICovCisJdV9jaGFyCQkJc210X2NsYXNzIDsJLyogTklGLCBTSUYgLi4uICovCisJdV9jaGFyCQkJc210X3R5cGUgOwkvKiByZXEuLCByZXNwb25zZSAuLiAqLworCXVfc2hvcnQJCQlzbXRfdmVyc2lvbiA7CS8qIHZlcnNpb24gaWQgKi8KKwl1X2ludAkJCXNtdF90aWQgOwkvKiB0cmFuc2FjdGlvbiBJRCAqLworCXN0cnVjdCBzbXRfc2lkCQlzbXRfc2lkIDsJLyogc3RhdGlvbiBJRCAqLworCXVfc2hvcnQJCQlzbXRfcGFkIDsJLyogcGFkIHdpdGggMCAqLworCXVfc2hvcnQJCQlzbXRfbGVuIDsJLyogbGVuZ3RoIG9mIGluZm8gZmllbGQgKi8KK30gOworI2RlZmluZSBTV0FQX1NNVEhFQURFUgkiNjYyc2w4c3MiCisKKyNpZgkwCisvKgorICogTUFDIEZDIHZhbHVlcworICovCisjZGVmaW5lIEZDX1NNVF9JTkZPCTB4NDEJCS8qIFNNVCBpbmZvICovCisjZGVmaW5lIEZDX1NNVF9OU0EJMHg0ZgkJLyogU01UIE5leHQgU3RhdGlvbiBBZGRyZXNzaW5nICovCisjZW5kaWYKKworCisvKgorICogdHlwZSBjb2RlcworICovCisjZGVmaW5lIFNNVF9BTk5PVU5DRQkweDAxCQkvKiBhbm5vdW5jZW1lbnQgKi8KKyNkZWZpbmUgU01UX1JFUVVFU1QJMHgwMgkJLyogcmVxdWVzdCAqLworI2RlZmluZSBTTVRfUkVQTFkJMHgwMwkJLyogcmVwbHkgKi8KKworLyoKKyAqIGNsYXNzIGNvZGVzCisgKi8KKyNkZWZpbmUgU01UX05JRgkJMHgwMQkJLyogbmVpZ2hib3IgaW5mb3JtYXRpb24gZnJhbWVzICovCisjZGVmaW5lIFNNVF9TSUZfQ09ORklHCTB4MDIJCS8qIHN0YXRpb24gaW5mb3JtYXRpb24gY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBTTVRfU0lGX09QRVIJMHgwMwkJLyogc3RhdGlvbiBpbmZvcm1hdGlvbiBvcGVyYXRpb24gKi8KKyNkZWZpbmUgU01UX0VDRgkJMHgwNAkJLyogZWNobyBmcmFtZXMgKi8KKyNkZWZpbmUgU01UX1JBRgkJMHgwNQkJLyogcmVzb3VyY2UgYWxsb2NhdGlvbiAqLworI2RlZmluZSBTTVRfUkRGCQkweDA2CQkvKiByZXF1ZXN0IGRlbmllZCAqLworI2RlZmluZSBTTVRfU1JGCQkweDA3CQkvKiBzdGF0dXMgcmVwb3J0ICovCisjZGVmaW5lIFNNVF9QTUZfR0VUCTB4MDgJCS8qIHBhcmFtZXRlciBtYW5hZ2VtZW50IGdldCAqLworI2RlZmluZSBTTVRfUE1GX1NFVAkweDA5CQkvKiBwYXJhbWV0ZXIgbWFuYWdlbWVudCBzZXQgKi8KKyNkZWZpbmUgU01UX0VTRgkJMHhmZgkJLyogZXh0ZW5kZWQgc2VydmljZSAqLworCisjZGVmaW5lIFNNVF9NQVhfRUNIT19MRU4JNDQ1OAkvKiBtYXggbGVuZ3RoIG9mIFNNVCBFY2hvICovCisjaWYJZGVmaW5lZChDT05DKSB8fCBkZWZpbmVkKENPTkNfSUkpCisjZGVmaW5lIFNNVF9URVNUX0VDSE9fTEVOCTUwCS8qIHRlc3QgbGVuZ3RoIG9mIFNNVCBFY2hvICovCisjZWxzZQorI2RlZmluZSBTTVRfVEVTVF9FQ0hPX0xFTglTTVRfTUFYX0VDSE9fTEVOCS8qIHRlc3QgbGVuZ3RoICovCisjZW5kaWYKKworI2RlZmluZSBTTVRfTUFYX0lORk9fTEVOCSg0MzUyLTIwKQkvKiBtYXggbGVuZ3RoIGZvciBTTVQgaW5mbyAqLworCisKKy8qCisgKiBwYXJhbWV0ZXIgdHlwZXMKKyAqLworCitzdHJ1Y3Qgc210X3BhcmEgeworCXVfc2hvcnQJcF90eXBlIDsJCS8qIHR5cGUgKi8KKwl1X3Nob3J0CXBfbGVuIDsJCQkvKiBsZW5ndGggb2YgcGFyYW1ldGVyICovCit9IDsKKworI2RlZmluZSBQQVJBX0xFTgkoc2l6ZW9mKHN0cnVjdCBzbXRfcGFyYSkpCisKKyNkZWZpbmUgU01UU0VUUEFSQShwLHQpCQkocCktPnBhcmEucF90eXBlID0gKHQpLFwKKwkJCQkocCktPnBhcmEucF9sZW4gPSBzaXplb2YoKihwKSkgLSBQQVJBX0xFTgorCisvKgorICogUDAxIDogVXBzdHJlYW0gTmVpZ2hib3IgQWRkcmVzcywgVU5BCisgKi8KKyNkZWZpbmUgU01UX1BfVU5BCTB4MDAwMQkJLyogdXBzdHJlYW0gbmVpZ2hib3IgYWRkcmVzcyAqLworI2RlZmluZSBTV0FQX1NNVF9QX1VOQQkiczYiCisKK3N0cnVjdCBzbXRfcF91bmEgeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfc2hvcnQJdW5hX3BhZCA7CisJc3RydWN0IGZkZGlfYWRkciB1bmFfbm9kZSA7CS8qIG5vZGUgYWRkcmVzcywgemVybyBpZiB1bmtub3duICovCit9IDsKKworLyoKKyAqIFAwMiA6IFN0YXRpb24gRGVzY3JpcHRvcgorICovCisjZGVmaW5lIFNNVF9QX1NERQkweDAwMDIJCS8qIHN0YXRpb24gZGVzY3JpcHRvciAqLworI2RlZmluZSBTV0FQX1NNVF9QX1NERQkiMTExMSIKKworI2RlZmluZSBTTVRfU0RFX1NUQVRJT04JCTAJLyogZW5kIG5vZGUgKi8KKyNkZWZpbmUgU01UX1NERV9DT05DRU5UUkFUT1IJMQkvKiBjb25jZW50cmF0b3IgKi8KKworc3RydWN0IHNtdF9wX3NkZSB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9jaGFyCXNkZV90eXBlIDsJCS8qIHN0YXRpb24gdHlwZSAqLworCXVfY2hhcglzZGVfbWFjX2NvdW50IDsJCS8qIG51bWJlciBvZiBNQUNzICovCisJdV9jaGFyCXNkZV9ub25fbWFzdGVyIDsJLyogbnVtYmVyIG9mIEEsQiBvciBTIHBvcnRzICovCisJdV9jaGFyCXNkZV9tYXN0ZXIgOwkJLyogbnVtYmVyIG9mIFMgcG9ydHMgb24gY29uYy4gKi8KK30gOworCisvKgorICogUDAzIDogU3RhdGlvbiBTdGF0ZQorICovCisjZGVmaW5lIFNNVF9QX1NUQVRFCTB4MDAwMwkJLyogc3RhdGlvbiBzdGF0ZSAqLworI2RlZmluZSBTV0FQX1NNVF9QX1NUQVRFCSJzY2MiCisKK3N0cnVjdCBzbXRfcF9zdGF0ZSB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydAlzdF9wYWQgOworCXVfY2hhcglzdF90b3BvbG9neSA7CQkvKiB0b3BvbG9neSAqLworCXVfY2hhcglzdF9kdXBsX2FkZHIgOwkJLyogZHVwbGljYXRlIGFkZHJlc3MgZGV0ZWN0ZWQgKi8KK30gOworI2RlZmluZSBTTVRfU1RfV1JBUFBFRAkJKDE8PDApCS8qIHN0YXRpb24gd3JhcHBlZCAqLworI2RlZmluZSBTTVRfU1RfVU5BVFRBQ0hFRAkoMTw8MSkJLyogdW5hdHRhY2hlZCBjb25jZW50cmF0b3IgKi8KKyNkZWZpbmUgU01UX1NUX1RXSVNURURfQQkoMTw8MikJLyogQS1BIGNvbm5lY3Rpb24sIHR3aXN0ZWQgcmluZyAqLworI2RlZmluZSBTTVRfU1RfVFdJU1RFRF9CCSgxPDwzKQkvKiBCLUIgY29ubmVjdGlvbiwgdHdpc3RlZCByaW5nICovCisjZGVmaW5lIFNNVF9TVF9ST09URURfUwkJKDE8PDQpCS8qIHJvb3RlZCBzdGF0aW9uICovCisjZGVmaW5lIFNNVF9TVF9TUkYJCSgxPDw1KQkvKiBTUkYgcHJvdG9jb2wgc3VwcG9ydGVkICovCisjZGVmaW5lIFNNVF9TVF9TWU5DX1NFUlZJQ0UJKDE8PDYpCS8qIHVzZSBzeW5jaHJvbm91cyBiYW5kd2lkdGggKi8KKworI2RlZmluZSBTTVRfU1RfTVlfRFVQQQkJKDE8PDApCS8qIG15IHN0YXRpb24gZGV0ZWN0ZWQgZHVwbC4gKi8KKyNkZWZpbmUgU01UX1NUX1VOQV9EVVBBCQkoMTw8MSkJLyogbXkgVU5BIGRldGVjdGVkIGR1cGxpY2F0ZSAqLworCisvKgorICogUDA0IDogdGltZXN0YW1wCisgKi8KKyNkZWZpbmUgU01UX1BfVElNRVNUQU1QCTB4MDAwNAkJLyogdGltZSBzdGFtcCAqLworI2RlZmluZSBTV0FQX1NNVF9QX1RJTUVTVEFNUAkiOCIKK3N0cnVjdCBzbXRfcF90aW1lc3RhbXAgeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfY2hhcgl0c190aW1lWzhdIDsJCS8qIHRpbWUsIHJlc29sdXRpb24gODBuUywgdW5pcXVlICovCit9IDsKKworLyoKKyAqIFAwNSA6IHN0YXRpb24gcG9saWNpZXMKKyAqLworI2RlZmluZSBTTVRfUF9QT0xJQ1kJMHgwMDA1CQkvKiBzdGF0aW9uIHBvbGljaWVzICovCisjZGVmaW5lIFNXQVBfU01UX1BfUE9MSUNZCSJzcyIKKworc3RydWN0IHNtdF9wX3BvbGljeSB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydAlwbF9jb25maWcgOworCXVfc2hvcnQgcGxfY29ubmVjdCA7CQkvKiBiaXQgc3RyaW5nIFBPTElDWV9BQSAuLi4gKi8KK30gOworI2RlZmluZSBTTVRfUExfSE9MRAkJMQkvKiBob2xkIHBvbGljeSBzdXBwb3J0ZWQgKER1YWwgTUFDKSAqLworCisvKgorICogUDA2IDogbGF0ZW5jeSBlcXVpdmFsZW50CisgKi8KKyNkZWZpbmUgU01UX1BfTEFURU5DWQkweDAwMDYJCS8qIGxhdGVuY3kgKi8KKyNkZWZpbmUgU1dBUF9TTVRfUF9MQVRFTkNZCSJzc3NzIgorCisvKgorICogbm90ZTogbGF0ZW5jeSBoYXMgdHdvIHBoeSBlbnRyaWVzIGJ5IGRlZmluaXRpb24KKyAqIGZvciBhIFNBUywgdGhlIDJuZCBvbmUgaXMgbnVsbAorICovCitzdHJ1Y3Qgc210X3BfbGF0ZW5jeSB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydAlsdF9waHlvdXRfaWR4MSA7CS8qIGluZGV4ICovCisJdV9zaG9ydAlsdF9sYXRlbmN5MSA7CQkvKiBsYXRlbmN5ICwgdW5pdCA6IGJ5dGUgY2xvY2sgKi8KKwl1X3Nob3J0CWx0X3BoeW91dF9pZHgyIDsJLyogMCBpZiBTQVMgKi8KKwl1X3Nob3J0CWx0X2xhdGVuY3kyIDsJCS8qIDAgaWYgU0FTICovCit9IDsKKworLyoKKyAqIFAwNyA6IE1BQyBuZWlnaGJvcnMKKyAqLworI2RlZmluZSBTTVRfUF9ORUlHSEJPUlMJMHgwMDA3CQkvKiBNQUMgbmVpZ2hib3IgZGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgU1dBUF9TTVRfUF9ORUlHSEJPUlMJInNzNjYiCisKK3N0cnVjdCBzbXRfcF9uZWlnaGJvciB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydAluYl9taWJfaW5kZXggOwkJLyogTUlCIGluZGV4ICovCisJdV9zaG9ydAluYl9tYWNfaW5kZXggOwkJLyogbisxIC4uIG4rbSwgbSA9ICNNQUNzLCBuID0gI1BIWXMgKi8KKwlzdHJ1Y3QgZmRkaV9hZGRyIG5iX3VuYSA7CS8qIFVOQSAsIDAgZm9yIHVua25vd24gKi8KKwlzdHJ1Y3QgZmRkaV9hZGRyIG5iX2RuYSA7CS8qIEROQSAsIDAgZm9yIHVua25vd24gKi8KK30gOworCisvKgorICogUEhZIHJlY29yZAorICovCisjZGVmaW5lIFNNVF9QSFlfQQkwCQkvKiBBIHBvcnQgKi8KKyNkZWZpbmUgU01UX1BIWV9CCTEJCS8qIEIgcG9ydCAqLworI2RlZmluZSBTTVRfUEhZX1MJMgkJLyogc2xhdmUgcG9ydCAqLworI2RlZmluZSBTTVRfUEhZX00JMwkJLyogbWFzdGVyIHBvcnQgKi8KKworI2RlZmluZSBTTVRfQ1NfRElTQUJMRUQJMAkJLyogY29ubmVjdCBzdGF0ZSA6IGRpc2FibGVkICovCisjZGVmaW5lIFNNVF9DU19DT05ORUNUSU5HCTEJLyogY29ubmVjdCBzdGF0ZSA6IGNvbm5lY3RpbmcgKi8KKyNkZWZpbmUgU01UX0NTX1NUQU5EQlkJMgkJLyogY29ubmVjdCBzdGF0ZSA6IHN0YW5kIGJ5ICovCisjZGVmaW5lIFNNVF9DU19BQ1RJVkUJMwkJLyogY29ubmVjdCBzdGF0ZSA6IGFjdGl2ZSAqLworCisjZGVmaW5lIFNNVF9STV9OT05FCTAKKyNkZWZpbmUgU01UX1JNX01BQwkxCisKK3N0cnVjdCBzbXRfcGh5X3JlYyB7CisJdV9zaG9ydAlwaHlfbWliX2luZGV4IDsJCS8qIE1JQiBpbmRleCAqLworCXVfY2hhcglwaHlfdHlwZSA7CQkvKiBBL0IvUy9NICovCisJdV9jaGFyCXBoeV9jb25uZWN0X3N0YXRlIDsJLyogZGlzYWJsZWQvY29ubmVjdGluZy9hY3RpdmUgKi8KKwl1X2NoYXIJcGh5X3JlbW90ZV90eXBlIDsJLyogQS9CL1MvTSAqLworCXVfY2hhcglwaHlfcmVtb3RlX21hYyA7CS8qIG5vbmUvcmVtb3RlICovCisJdV9zaG9ydAlwaHlfcmVzb3VyY2VfaWR4IDsJLyogMSAuLiBuICovCit9IDsKKworLyoKKyAqIE1BQyByZWNvcmQKKyAqLworc3RydWN0IHNtdF9tYWNfcmVjIHsKKwlzdHJ1Y3QgZmRkaV9hZGRyIG1hY19hZGRyIDsJCS8qIE1BQyBhZGRyZXNzICovCisJdV9zaG9ydAkJbWFjX3Jlc291cmNlX2lkeCA7CS8qIG4rMSAuLiBuK20gKi8KK30gOworCisvKgorICogUDA4IDogcGF0aCBkZXNjcmlwdG9ycworICogc2hvdWxkIGJlIHJlYWxseSBhbiBhcnJheSA7IGhvd2V2ZXIgb3VyIGVudmlyb25tZW50IGhhcyBhIGZpeGVkIG51bWJlciBvZgorICogUEhZcyBhbmQgTUFDcworICovCisjZGVmaW5lIFNNVF9QX1BBVEgJMHgwMDA4CQkJLyogcGF0aCBkZXNjcmlwdG9yICovCisjZGVmaW5lIFNXQVBfU01UX1BfUEFUSAkiWzZzXSIKKworc3RydWN0IHNtdF9wX3BhdGggeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXN0cnVjdCBzbXRfcGh5X3JlYwlwZF9waHlbMl0gOwkvKiBQSFkgQSAqLworCXN0cnVjdCBzbXRfbWFjX3JlYwlwZF9tYWMgOwkvKiBNQUMgcmVjb3JkICovCit9IDsKKworLyoKKyAqIFAwOSA6IE1BQyBzdGF0dXMKKyAqLworI2RlZmluZSBTTVRfUF9NQUNfU1RBVFVTCTB4MDAwOQkJLyogTUFDIHN0YXR1cyAqLworI2RlZmluZSBTV0FQX1NNVF9QX01BQ19TVEFUVVMJInNzbGxsbGxsbGxsIgorCitzdHJ1Y3Qgc210X3BfbWFjX3N0YXR1cyB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydCBzdF9taWJfaW5kZXggOwkJLyogTUlCIGluZGV4ICovCisJdV9zaG9ydAlzdF9tYWNfaW5kZXggOwkJLyogbisxIC4uIG4rbSAqLworCXVfaW50CXN0X3RfcmVxIDsJCS8qIFRfUmVxICovCisJdV9pbnQJc3RfdF9uZWcgOwkJLyogVF9OZWcgKi8KKwl1X2ludAlzdF90X21heCA7CQkvKiBUX01heCAqLworCXVfaW50CXN0X3R2eF92YWx1ZSA7CQkvKiBUVlhfVmFsdWUgKi8KKwl1X2ludAlzdF90X21pbiA7CQkvKiBUX01pbiAqLworCXVfaW50CXN0X3NiYSA7CQkvKiBzeW5jaHIuIGJhbmR3aWR0aCBhbGxvYyAqLworCXVfaW50CXN0X2ZyYW1lX2N0IDsJCS8qIGZyYW1lIGNvdW50ZXIgKi8KKwl1X2ludAlzdF9lcnJvcl9jdCA7CQkvKiBlcnJvciBjb3VudGVyICovCisJdV9pbnQJc3RfbG9zdF9jdCA7CQkvKiBsb3N0IGZyYW1lcyBjb3VudGVyICovCit9IDsKKworLyoKKyAqIFAwQSA6IFBIWSBsaW5rIGVycm9yIHJhdGUgbW9uaXRvcmluZworICovCisjZGVmaW5lIFNNVF9QX0xFTQkweDAwMGEJCS8qIGxpbmsgZXJyb3IgbW9uaXRvciAqLworI2RlZmluZSBTV0FQX1NNVF9QX0xFTQkic3NjY2NjbGwiCisvKgorICogdW5pdHMgb2YgbGVtX2N1dG9mZixsZW1fYWxhcm0sbGVtX2VzdGltYXRlIDogMTAqKi14CisgKi8KK3N0cnVjdCBzbXRfcF9sZW0geworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfc2hvcnQJbGVtX21pYl9pbmRleCA7CQkvKiBNSUIgaW5kZXggKi8KKwl1X3Nob3J0CWxlbV9waHlfaW5kZXggOwkJLyogMSAuLiBuICovCisJdV9jaGFyCWxlbV9wYWQyIDsJCS8qIGJlIG5pY2UgYW5kIG1ha2UgaXQgZXZlbiAuICovCisJdV9jaGFyCWxlbV9jdXRvZmYgOwkJLyogMHg0IC4uIDB4ZiwgZGVmYXVsdCAweDcgKi8KKwl1X2NoYXIJbGVtX2FsYXJtIDsJCS8qIDB4NCAuLiAweGYsIGRlZmF1bHQgMHg4ICovCisJdV9jaGFyCWxlbV9lc3RpbWF0ZSA7CQkvKiAweDAgLi4gMHhmZiAqLworCXVfaW50CWxlbV9yZWplY3RfY3QgOwkJLyogMHgwMDAwMDAwMCAuLiAweGZmZmZmZmZmICovCisJdV9pbnQJbGVtX2N0IDsJCS8qIDB4MDAwMDAwMDAgLi4gMHhmZmZmZmZmZiAqLworfSA7CisKKy8qCisgKiBQMEIgOiBNQUMgZnJhbWUgY291bnRlcnMKKyAqLworI2RlZmluZSBTTVRfUF9NQUNfQ09VTlRFUiAweDAwMGIJLyogTUFDIGZyYW1lIGNvdW50ZXJzICovCisjZGVmaW5lIFNXQVBfU01UX1BfTUFDX0NPVU5URVIJInNzbGwiCisKK3N0cnVjdCBzbXRfcF9tYWNfY291bnRlciB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydAltY19taWJfaW5kZXggOwkJLyogTUlCIGluZGV4ICovCisJdV9zaG9ydAltY19pbmRleCA7CQkvKiBtYWMgaW5kZXggKi8KKwl1X2ludAltY19yZWNlaXZlX2N0IDsJCS8qIHJlY2VpdmUgY291bnRlciAqLworCXVfaW50CW1jX3RyYW5zbWl0X2N0IDsJLyogdHJhbnNtaXQgY291bnRlciAqLworfSA7CisKKy8qCisgKiBQMEMgOiBNQUMgZnJhbWUgbm90IGNvcGllZCBjb3VudGVyCisgKi8KKyNkZWZpbmUgU01UX1BfTUFDX0ZOQwkweDAwMGMJCS8qIE1BQyBmcmFtZSBub3QgY29waWVkIGNvdW50ZXIgKi8KKyNkZWZpbmUgU1dBUF9TTVRfUF9NQUNfRk5DCSJzc2wiCisKK3N0cnVjdCBzbXRfcF9tYWNfZm5jIHsKKwlzdHJ1Y3Qgc210X3BhcmEJcGFyYSA7CQkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwl1X3Nob3J0CW5jX21pYl9pbmRleCA7CQkvKiBNSUIgaW5kZXggKi8KKwl1X3Nob3J0CW5jX2luZGV4IDsJCS8qIG1hYyBpbmRleCAqLworCXVfaW50CW5jX2NvdW50ZXIgOwkJLyogbm90IGNvcGllZCBjb3VudGVyICovCit9IDsKKworCisvKgorICogUDBEIDogTUFDIHByaW9yaXR5IHZhbHVlcworICovCisjZGVmaW5lIFNNVF9QX1BSSU9SSVRZCTB4MDAwZAkJLyogTUFDIHByaW9yaXR5IHZhbHVlcyAqLworI2RlZmluZSBTV0FQX1NNVF9QX1BSSU9SSVRZCSJzc2wiCisKK3N0cnVjdCBzbXRfcF9wcmlvcml0eSB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydAlwcl9taWJfaW5kZXggOwkJLyogTUlCIGluZGV4ICovCisJdV9zaG9ydAlwcl9pbmRleCA7CQkvKiBtYWMgaW5kZXggKi8KKwl1X2ludAlwcl9wcmlvcml0eVs3XSA7CS8qIHByaW9yaXR5IHZhbHVlcyAqLworfSA7CisKKy8qCisgKiBQMEUgOiBQSFkgZWxhc3RpY2l0eSBidWZmZXIgc3RhdHVzCisgKi8KKyNkZWZpbmUgU01UX1BfRUIJMHgwMDBlCQkvKiBQSFkgRUIgc3RhdHVzICovCisjZGVmaW5lIFNXQVBfU01UX1BfRUIJInNzbCIKKworc3RydWN0IHNtdF9wX2ViIHsKKwlzdHJ1Y3Qgc210X3BhcmEJcGFyYSA7CQkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwl1X3Nob3J0CWViX21pYl9pbmRleCA7CQkvKiBNSUIgaW5kZXggKi8KKwl1X3Nob3J0CWViX2luZGV4IDsJCS8qIHBoeSBpbmRleCAqLworCXVfaW50CWViX2Vycm9yX2N0IDsJCS8qICMgb2YgZWIgb3ZlcmZsb3dzICovCit9IDsKKworLyoKKyAqIFAwRiA6IG1hbnVmYWN0dXJlciBmaWVsZAorICovCisjZGVmaW5lIFNNVF9QX01BTlVGQUNUVVJFUgkweDAwMGYJLyogbWFudWZhY3R1cmVyIGZpZWxkICovCisjZGVmaW5lIFNXQVBfU01UX1BfTUFOVUZBQ1RVUkVSCSIiCisKK3N0cnVjdCBzbXBfcF9tYW51ZmFjdHVyZXIgeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfY2hhciBtZl9kYXRhWzMyXSA7CQkvKiBPVUkgKyBhcmJpdHJhcnkgZGF0YSAqLworfSA7CisKKy8qCisgKiBQMTAgOiB1c2VyIGZpZWxkCisgKi8KKyNkZWZpbmUgU01UX1BfVVNFUgkJMHgwMDEwCS8qIG1hbnVmYWN0dXJlciBmaWVsZCAqLworI2RlZmluZSBTV0FQX1NNVF9QX1VTRVIJIiIKKworc3RydWN0IHNtcF9wX3VzZXIgeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfY2hhciB1c19kYXRhWzMyXSA7CQkvKiBhcmJpdHJhcnkgZGF0YSAqLworfSA7CisKKworCisvKgorICogUDExIDogZWNobyBkYXRhCisgKi8KKyNkZWZpbmUgU01UX1BfRUNIT0RBVEEJMHgwMDExCQkvKiBlY2hvIGRhdGEgKi8KKyNkZWZpbmUgU1dBUF9TTVRfUF9FQ0hPREFUQQkiIgorCitzdHJ1Y3Qgc210X3BfZWNobyB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9jaGFyCWVjX2RhdGFbU01UX01BWF9FQ0hPX0xFTi00XSA7CS8qIGVjaG8gZGF0YSAqLworfSA7CisKKy8qCisgKiBQMTIgOiByZWFzb24gY29kZQorICovCisjZGVmaW5lIFNNVF9QX1JFQVNPTgkweDAwMTIJCS8qIHJlYXNvbiBjb2RlICovCisjZGVmaW5lIFNXQVBfU01UX1BfUkVBU09OCSJsIgorCitzdHJ1Y3Qgc210X3BfcmVhc29uIHsKKwlzdHJ1Y3Qgc210X3BhcmEJcGFyYSA7CQkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwl1X2ludAlyZGZfcmVhc29uIDsJCS8qIENMQVNTL1ZFUlNJT04gKi8KK30gOworI2RlZmluZSBTTVRfUkRGX0NMQVNTCTB4MDAwMDAwMDEJLyogY2xhc3Mgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBTTVRfUkRGX1ZFUlNJT04JMHgwMDAwMDAwMgkvKiB2ZXJzaW9uIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU01UX1JERl9TVUNDRVNTCTB4MDAwMDAwMDMJLyogc3VjY2VzcyAoUE1GKSAqLworI2RlZmluZSBTTVRfUkRGX0JBRFNFVAkweDAwMDAwMDA0CS8qIGJhZCBzZXQgY291bnQgKFBNRikgKi8KKyNkZWZpbmUgU01UX1JERl9JTExFR0FMIDB4MDAwMDAwMDUJLyogcmVhZCBvbmx5IChQTUYpICovCisjZGVmaW5lIFNNVF9SREZfTk9QQVJBTQkweDYJCS8qIHBhcmFtdGVyIG5vdCBzdXBwb3J0ZWQgKFBNRikgKi8KKyNkZWZpbmUgU01UX1JERl9SQU5HRQkweDgJCS8qIG91dCBvZiByYW5nZSAqLworI2RlZmluZSBTTVRfUkRGX0FVVEhPUgkweDkJCS8qIG5vdCBhdXRvaG9yaXplZCAqLworI2RlZmluZSBTTVRfUkRGX0xFTkdUSAkweDBhCQkvKiBsZW5ndGggZXJyb3IgKi8KKyNkZWZpbmUgU01UX1JERl9UT09MT05HCTB4MGIJCS8qIGxlbmd0aCBlcnJvciAqLworI2RlZmluZSBTTVRfUkRGX1NCQQkweDBkCQkvKiBTQkEgZGVuaWVkICovCisKKy8qCisgKiBQMTMgOiByZWZ1c2VkIGZyYW1lIGJlZ2lubmluZworICovCisjZGVmaW5lIFNNVF9QX1JFRlVTRUQJMHgwMDEzCQkvKiByZWZ1c2VkIGZyYW1lIGJlZ2lubmluZyAqLworI2RlZmluZSBTV0FQX1NNVF9QX1JFRlVTRUQJImwiCisKK3N0cnVjdCBzbXRfcF9yZWZ1c2VkIHsKKwlzdHJ1Y3Qgc210X3BhcmEJcGFyYSA7CQkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwl1X2ludAlyZWZfZmMgOwkJLyogMyBieXRlcyAwICsgRkMgKi8KKwlzdHJ1Y3Qgc210X2hlYWRlcglyZWZfaGVhZGVyIDsJLyogcmVmdXNlZCBoZWFkZXIgKi8KK30gOworCisvKgorICogUDE0IDogc3VwcG9ydGVkIFNNVCB2ZXJzaW9ucworICovCisjZGVmaW5lIFNNVF9QX1ZFUlNJT04JMHgwMDE0CQkvKiBTTVQgc3VwcG9ydGVkIHZlcnNpb25zICovCisjZGVmaW5lIFNXQVBfU01UX1BfVkVSU0lPTgkic2Njc3MiCisKK3N0cnVjdCBzbXRfcF92ZXJzaW9uIHsKKwlzdHJ1Y3Qgc210X3BhcmEJcGFyYSA7CQkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwl1X3Nob3J0CXZfcGFkIDsKKwl1X2NoYXIJdl9uIDsJCQkvKiAxIC4uIDB4ZmYsICN2ZXJzaW9ucyAqLworCXVfY2hhcgl2X2luZGV4IDsJCS8qIDEgLi4gMHhmZiwgaW5kZXggb2Ygb3AuIHYuICovCisJdV9zaG9ydAl2X3ZlcnNpb25bMV0gOwkJLyogbGlzdCBvZiBtaW4uIDEgdmVyc2lvbiAqLworCXVfc2hvcnQJdl9wYWQyIDsJCS8qIHBhZCBpZiBuZWNlc3NhcnkgKi8KK30gOworCisvKgorICogUDE1IDogUmVzb3VyY2UgVHlwZQorICovCisjZGVmaW5lCVNXQVBfU01UX1AwMDE1CQkibCIKKworc3RydWN0IHNtdF9wXzAwMTUgeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfaW50CQlyZXNfdHlwZSA7CS8qIHJlY3NvdXJjZSB0eXBlICovCit9IDsKKworI2RlZmluZQlTWU5DX0JXCQkweDAwMDAwMDAxTAkvKiBTeW5jaHJvbm91cyBCYW5kd2lkdGggKi8KKworLyoKKyAqIFAxNiA6IFNCQSBDb21tYW5kCisgKi8KKyNkZWZpbmUJU1dBUF9TTVRfUDAwMTYJCSJsIgorCitzdHJ1Y3Qgc210X3BfMDAxNiB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9pbnQJCXNiYV9jbWQgOwkvKiBjb21tYW5kIGZvciB0aGUgU0JBICovCit9IDsKKworI2RlZmluZQlSRVFVRVNUX0FMTE9DQVRJT04JMHgxCS8qIHJlcSBhbGxvY2F0aW9uIG9mIHN5bmMgYmFuZHdpZHRoICovCisjZGVmaW5lCVJFUE9SVF9BTExPQ0FUSU9OCTB4MgkvKiByZXAgb2Ygc3luYyBiYW5kd2lkdGggYWxsb2NhdGlvbiAqLworI2RlZmluZQlDSEFOR0VfQUxMT0NBVElPTgkweDMJLyogZm9yY2VzIGEgc3RhdGlvbiB1c2luZyBzeW5jIGJhbmQtKi8KKwkJCQkJLyogd2lkdGggdG8gY2hhbmdlIGl0cyBjdXJyZW50IGFsbG8tKi8KKwkJCQkJLyogY2F0aW9uICovCisKKy8qCisgKiBQMTcgOiBTQkEgUGF5bG9hZCBSZXF1ZXN0CisgKi8KKyNkZWZpbmUJU1dBUF9TTVRfUDAwMTcJCSJsIgorCitzdHJ1Y3Qgc210X3BfMDAxNyB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJaW50CQlzYmFfcGxfcmVxIDsJLyogdG90YWwgc3luYyBiYW5kd2lkdGggbWVhc3VyZWQgaW4gKi8KK30gOwkJCQkJLyogYnl0ZXMgcGVyIDEyNSB1cyAqLworCisvKgorICogUDE4IDogU0JBIE92ZXJoZWFkIFJlcXVlc3QKKyAqLworI2RlZmluZQlTV0FQX1NNVF9QMDAxOAkJImwiCisKK3N0cnVjdCBzbXRfcF8wMDE4IHsKKwlzdHJ1Y3Qgc210X3BhcmEJcGFyYSA7CQkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwlpbnQJCXNiYV9vdl9yZXEgOwkvKiB0b3RhbCBzeW5jIGJhbmR3aWR0aCByZXEgZm9yIG92ZXJoZWFkKi8KK30gOwkJCQkJLyogbWVhc3VlcmVkIGluIGJ5dGVzIHBlciBUX05lZyAqLworCisvKgorICogUDE5IDogU0JBIEFsbG9jYXRpb24gQWRkcmVzcworICovCisjZGVmaW5lCVNXQVBfU01UX1AwMDE5CQkiczYiCisKK3N0cnVjdCBzbXRfcF8wMDE5IHsKKwlzdHJ1Y3Qgc210X3BhcmEJcGFyYSA7CQkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwl1X3Nob3J0CQlzYmFfcGFkIDsKKwlzdHJ1Y3QgZmRkaV9hZGRyIGFsbG9jX2FkZHIgOwkvKiBBbGxvY2F0aW9uIEFkZHJlc3MgKi8KK30gOworCisvKgorICogUDFBIDogU0JBIENhdGVnb3J5CisgKi8KKyNkZWZpbmUJU1dBUF9TTVRfUDAwMUEJCSJsIgorCitzdHJ1Y3Qgc210X3BfMDAxYSB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9pbnQJCWNhdGVnb3J5IDsJLyogQWxsb2NhdG9yIGRlZmluZWQgY2xhc3NpZmljYXRpb24gKi8KK30gOworCisvKgorICogUDFCIDogTWF4aW11bSBUX05lZworICovCisjZGVmaW5lCVNXQVBfU01UX1AwMDFCCQkibCIKKworc3RydWN0IHNtdF9wXzAwMWIgeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfaW50CQltYXhfdF9uZWcgOwkvKiBsb25nZXN0IFRfTkVHIGZvciB0aGUgc3luYyBzZXJ2aWNlKi8KK30gOworCisvKgorICogUDFDIDogTWluaW11bSBTQkEgU2VnbWVudCBTaXplCisgKi8KKyNkZWZpbmUJU1dBUF9TTVRfUDAwMUMJCSJsIgorCitzdHJ1Y3Qgc210X3BfMDAxYyB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9pbnQJCW1pbl9zZWdfc2l6IDsJLyogc21hbGxlc3QgbnVtYmVyIG9mIGJ5dGVzIHBlciBmcmFtZSovCit9IDsKKworLyoKKyAqIFAxRCA6IFNCQSBBbGxvY2F0YWJsZQorICovCisjZGVmaW5lCVNXQVBfU01UX1AwMDFECQkibCIKKworc3RydWN0IHNtdF9wXzAwMWQgeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfaW50CQlhbGxvY2F0YWJsZSA7CS8qIHRvdGFsIHN5bmMgYncgYXZhaWxhYmxlIGZvciBhbGxvYyAqLworfSA7CisKKy8qCisgKiBQMjAgMEIgOiBmcmFtZSBzdGF0dXMgY2FwYWJpbGl0aWVzCisgKiBOT1RFOiBub3QgaW4gc3dhcCB0YWJsZSwgaXMgdXNlZCBieSBzbXQuYyBBTkQgUE1GIHRhYmxlCisgKi8KKyNkZWZpbmUgU01UX1BfRlNDCTB4MjAwYgorLyogI2RlZmluZSBTV0FQX1NNVF9QX0ZTQwkic3NzcyIgKi8KKworc3RydWN0IHNtdF9wX2ZzYyB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydAlmc2NfcGFkMCA7CisJdV9zaG9ydAlmc2NfbWFjX2luZGV4IDsJCS8qIG1hYyBpbmRleCAxIC4uIGZmICovCisJdV9zaG9ydAlmc2NfcGFkMSA7CisJdV9zaG9ydAlmc2NfdmFsdWUgOwkJLyogRlNDX1RZUEVbMC0yXSAqLworfSA7CisKKyNkZWZpbmUgRlNDX1RZUEUwCTAJCS8qICJub3JtYWwiIG5vZGUgKEEvQyBoYW5kbGluZykgKi8KKyNkZWZpbmUgRlNDX1RZUEUxCTEJCS8qIFNwZWNpYWwgQS9DIGluZGljYXRvciBmb3J3YXJkaW5nICovCisjZGVmaW5lIEZTQ19UWVBFMgkyCQkvKiBTcGVjaWFsIEEvQyBpbmRpY2F0b3IgZm9yd2FyZGluZyAqLworCisvKgorICogUDAwIDIxIDogdXNlciBkZWZpbmVkIGF1dGhvcml6aWF0aW9uIChzZWUgcG1mLmMpCisgKi8KKyNkZWZpbmUgU01UX1BfQVVUSE9SCTB4MDAyMQorCisvKgorICogbm90aWZpY2F0aW9uIHBhcmFtZXRlcnMKKyAqLworI2RlZmluZSBTV0FQX1NNVF9QMTA0OAkibGwiCitzdHJ1Y3Qgc210X3BfMTA0OCB7CisJdV9pbnQgcDEwNDhfZmxhZyA7CisJdV9pbnQgcDEwNDhfY2Zfc3RhdGUgOworfSA7CisKKy8qCisgKiBOT1RFOiBhbGwgMnh4eCAzeHh4IGFuZCA0eHh4IG11c3QgaW5jbHVkZSB0aGUgSU5ERVggaW4gdGhlIHN3YXAgc3RyaW5nLAorICoJZXZlbiBzbyB0aGUgSU5ERVggaXMgTk9UIHBhcnQgb2YgdGhlIHN0cnVjdC4KKyAqCUlOREVYIGlzIGFscmVhZHkgc3dhcHBlZCBpbiBwbWYuYywgZm9ybWF0IGluIHN0cmluZyBpcyAnNCcKKyAqLworI2RlZmluZSBTV0FQX1NNVF9QMjA4QwkiNGxzczY2Igorc3RydWN0IHNtdF9wXzIwOGMgeworCXVfaW50CQkJcDIwOGNfZmxhZyA7CisJdV9zaG9ydAkJCXAyMDhjX3BhZCA7CisJdV9zaG9ydAkJCXAyMDhjX2R1cGNvbmRpdGlvbiA7CisJc3RydWN0CWZkZGlfYWRkcglwMjA4Y19mZGRpbG9uZyA7CisJc3RydWN0CWZkZGlfYWRkcglwMjA4Y19mZGRpdW5hbG9uZyA7Cit9IDsKKworI2RlZmluZSBTV0FQX1NNVF9QMjA4RAkiNGxsbGxsIgorc3RydWN0IHNtdF9wXzIwOGQgeworCXVfaW50CQkJcDIwOGRfZmxhZyA7CisJdV9pbnQJCQlwMjA4ZF9mcmFtZV9jdCA7CisJdV9pbnQJCQlwMjA4ZF9lcnJvcl9jdCA7CisJdV9pbnQJCQlwMjA4ZF9sb3N0X2N0IDsKKwl1X2ludAkJCXAyMDhkX3JhdGlvIDsKK30gOworCisjZGVmaW5lIFNXQVBfU01UX1AyMDhFCSI0bGxsbCIKK3N0cnVjdCBzbXRfcF8yMDhlIHsKKwl1X2ludAkJCXAyMDhlX2ZsYWcgOworCXVfaW50CQkJcDIwOGVfbm90X2NvcGllZCA7CisJdV9pbnQJCQlwMjA4ZV9jb3BpZWQgOworCXVfaW50CQkJcDIwOGVfbm90X2NvcGllZF9yYXRpbyA7Cit9IDsKKworI2RlZmluZSBTV0FQX1NNVF9QMjA4RgkiNGxsNjY2NnM2IgorCitzdHJ1Y3Qgc210X3BfMjA4ZiB7CisJdV9pbnQJCQlwMjA4Zl9tdWx0aXBsZSA7CisJdV9pbnQJCQlwMjA4Zl9uYWNvbmRpdGlvbiA7CisJc3RydWN0IGZkZGlfYWRkcglwMjA4Zl9vbGRfdW5hIDsKKwlzdHJ1Y3QgZmRkaV9hZGRyCXAyMDhmX25ld191bmEgOworCXN0cnVjdCBmZGRpX2FkZHIJcDIwOGZfb2xkX2RuYSA7CisJc3RydWN0IGZkZGlfYWRkcglwMjA4Zl9uZXdfZG5hIDsKKwl1X3Nob3J0CQkJcDIwOGZfY3VycmVuX3BhdGggOworCXN0cnVjdCBmZGRpX2FkZHIJcDIwOGZfc210X2FkZHJlc3MgOworfSA7CisKKyNkZWZpbmUgU1dBUF9TTVRfUDIwOTAJIjRsc3NsIgorCitzdHJ1Y3Qgc210X3BfMjA5MCB7CisJdV9pbnQJCQlwMjA5MF9tdWx0aXBsZSA7CisJdV9zaG9ydAkJCXAyMDkwX2F2YWlsYWJsZXBhdGhzIDsKKwl1X3Nob3J0CQkJcDIwOTBfY3VycmVudHBhdGggOworCXVfaW50CQkJcDIwOTBfcmVxdWVzdGVkcGF0aHMgOworfSA7CisKKy8qCisgKiBOT1RFOgorICogc3BlY2lhbCBrbHVkZ2UgZm9yIHBhcmFtZXRlcnMgMzIwYiwzMjBmLDMyMTAKKyAqIHRoZXNlIHBhcmFtZXRlcnMgYXJlIHBhcnQgb2YgUkFGIGZyYW1lcworICogUkFGIGZyYW1lcyBhcmUgcGFyc2VkIGluIFNCQS5DIGFuZCBtdXN0IGJlIHN3YXBwZWQKKyAqIFBNRi5DIGhhcyBzcGVjaWFsIGNvZGUgdG8gYXZvaWQgZG91YmxlIHN3YXBwaW5nCisgKi8KKyNpZmRlZglMSVRUTEVfRU5ESUFOCisjZGVmaW5lIFNCQVBBVEhJTkRFWAkoMHgwMTAwMDAwMEwpCisjZWxzZQorI2RlZmluZSBTQkFQQVRISU5ERVgJKDB4MDFMKQorI2VuZGlmCisKKyNkZWZpbmUJU1dBUF9TTVRfUDMyMEIJIjQycyIKKworc3RydWN0CXNtdF9wXzMyMGIgeworCXN0cnVjdCBzbXRfcGFyYSBwYXJhIDsJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9pbnQJbWliX2luZGV4IDsKKwl1X3Nob3J0IHBhdGhfcGFkIDsKKwl1X3Nob3J0CXBhdGhfaW5kZXggOworfSA7CisKKyNkZWZpbmUJU1dBUF9TTVRfUDMyMEYJIjRsIgorCitzdHJ1Y3QJc210X3BfMzIwZiB7CisJc3RydWN0IHNtdF9wYXJhIHBhcmEgOwkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwl1X2ludAltaWJfaW5kZXggOworCXVfaW50CW1pYl9wYXlsb2FkIDsKK30gOworCisjZGVmaW5lCVNXQVBfU01UX1AzMjEwCSI0bCIKKworc3RydWN0CXNtdF9wXzMyMTAgeworCXN0cnVjdCBzbXRfcGFyYSBwYXJhIDsJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9pbnQJbWliX2luZGV4IDsKKwl1X2ludAltaWJfb3ZlcmhlYWQgOworfSA7CisKKyNkZWZpbmUgU1dBUF9TTVRfUDQwNTAJIjRsMTExMWxsIgorCitzdHJ1Y3Qgc210X3BfNDA1MCB7CisJdV9pbnQJCQlwNDA1MF9mbGFnIDsKKwl1X2NoYXIJCQlwNDA1MF9wYWQgOworCXVfY2hhcgkJCXA0MDUwX2N1dG9mZiA7CisJdV9jaGFyCQkJcDQwNTBfYWxhcm0gOworCXVfY2hhcgkJCXA0MDUwX2VzdGltYXRlIDsKKwl1X2ludAkJCXA0MDUwX3JlamVjdF9jdCA7CisJdV9pbnQJCQlwNDA1MF9jdCA7Cit9IDsKKworI2RlZmluZSBTV0FQX1NNVF9QNDA1MQkiNGxzc3NzIgorc3RydWN0IHNtdF9wXzQwNTEgeworCXVfaW50CQkJcDQwNTFfbXVsdGlwbGUgOworCXVfc2hvcnQJCQlwNDA1MV9wb3J0dHlwZSA7CisJdV9zaG9ydAkJCXA0MDUxX2Nvbm5lY3RzdGF0ZSA7CisJdV9zaG9ydAkJCXA0MDUxX3BjX25laWdoYm9yIDsKKwl1X3Nob3J0CQkJcDQwNTFfcGNfd2l0aGhvbGQgOworfSA7CisKKyNkZWZpbmUgU1dBUF9TTVRfUDQwNTIJIjRsbCIKK3N0cnVjdCBzbXRfcF80MDUyIHsKKwl1X2ludAkJCXA0MDUyX2ZsYWcgOworCXVfaW50CQkJcDQwNTJfZWJlcnJvcmNvdW50IDsKK30gOworCisjZGVmaW5lIFNXQVBfU01UX1A0MDUzCSI0bHNzbHNzIgorCitzdHJ1Y3Qgc210X3BfNDA1MyB7CisJdV9pbnQJCQlwNDA1M19tdWx0aXBsZSA7CisJdV9zaG9ydAkJCXA0MDUzX2F2YWlsYWJsZXBhdGhzIDsKKwl1X3Nob3J0CQkJcDQwNTNfY3VycmVudHBhdGggOworCXVfaW50CQkJcDQwNTNfcmVxdWVzdGVkcGF0aHMgOworCXVfc2hvcnQJCQlwNDA1M19teXR5cGUgOworCXVfc2hvcnQJCQlwNDA1M19uZWlnaGJvcnR5cGUgOworfSA7CisKKworI2RlZmluZSBTTVRfUF9TRVRDT1VOVAkweDEwMzUKKyNkZWZpbmUgU1dBUF9TTVRfUF9TRVRDT1VOVAkibDgiCisKK3N0cnVjdCBzbXRfcF9zZXRjb3VudCB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9pbnQJCWNvdW50IDsKKwl1X2NoYXIJCXRpbWVzdGFtcFs4XSA7Cit9IDsKKworLyoKKyAqIFNNVCBGUkFNRVMKKyAqLworCisvKgorICogTklGIDogbmVpZ2hib3IgaW5mb3JtYXRpb24gZnJhbWVzCisgKi8KK3N0cnVjdCBzbXRfbmlmIHsKKwlzdHJ1Y3Qgc210X2hlYWRlcglzbXQgOwkJLyogZ2VuZXJpYyBoZWFkZXIgKi8KKwlzdHJ1Y3Qgc210X3BfdW5hCXVuYSA7CQkvKiBVTkEgKi8KKwlzdHJ1Y3Qgc210X3Bfc2RlCXNkZSA7CQkvKiBzdGF0aW9uIGRlc2NyaXB0b3IgKi8KKwlzdHJ1Y3Qgc210X3Bfc3RhdGUJc3RhdGUgOwkJLyogc3RhdGlvbiBzdGF0ZSAqLworI2lmZGVmCVNNVDZfMTAKKwlzdHJ1Y3Qgc210X3BfZnNjCWZzYyA7CQkvKiBmcmFtZSBzdGF0dXMgY2FwLiAqLworI2VuZGlmCit9IDsKKworLyoKKyAqIFNJRiA6IHN0YXRpb24gaW5mb3JtYXRpb24gZnJhbWVzCisgKi8KK3N0cnVjdCBzbXRfc2lmX2NvbmZpZyB7CisJc3RydWN0IHNtdF9oZWFkZXIJc210IDsJCS8qIGdlbmVyaWMgaGVhZGVyICovCisJc3RydWN0IHNtdF9wX3RpbWVzdGFtcAl0cyA7CQkvKiB0aW1lIHN0YW1wICovCisJc3RydWN0IHNtdF9wX3NkZQlzZGUgOwkJLyogc3RhdGlvbiBkZXNjcmlwdG9yICovCisJc3RydWN0IHNtdF9wX3ZlcnNpb24JdmVyc2lvbiA7CS8qIHN1cHBvcnRlZCB2ZXJzaW9ucyAqLworCXN0cnVjdCBzbXRfcF9zdGF0ZQlzdGF0ZSA7CQkvKiBzdGF0aW9uIHN0YXRlICovCisJc3RydWN0IHNtdF9wX3BvbGljeQlwb2xpY3kgOwkvKiBzdGF0aW9uIHBvbGljeSAqLworCXN0cnVjdCBzbXRfcF9sYXRlbmN5CWxhdGVuY3kgOwkvKiBwYXRoIGxhdGVuY3kgKi8KKwlzdHJ1Y3Qgc210X3BfbmVpZ2hib3IJbmVpZ2hib3IgOwkvKiBuZWlnaGJvcnMsIHdlIGhhdmUgb25seSBvbmUqLworI2lmZGVmCU9QVF9QTUYKKwlzdHJ1Y3Qgc210X3Bfc2V0Y291bnQJc2V0Y291bnQgOwkgLyogU2V0IENvdW50IG1hbmRhdG9yeSAqLworI2VuZGlmCisJLyogV0FSTklORyA6IHBhdGggTVVTVCBCRSBMQVNUIEZJRUxEICEhISAoc2VlIHNtdC5jOnNtdF9maWxsX3BhdGgpICovCisJc3RydWN0IHNtdF9wX3BhdGgJcGF0aCA7CQkvKiBwYXRoIGRlc2NyaXB0b3IgKi8KK30gOworI2RlZmluZSBTSVpFT0ZfU01UX1NJRl9DT05GSUcJKHNpemVvZihzdHJ1Y3Qgc210X3NpZl9jb25maWcpLSBcCisJCQkJIHNpemVvZihzdHJ1Y3Qgc210X3BfcGF0aCkpCisKK3N0cnVjdCBzbXRfc2lmX29wZXJhdGlvbiB7CisJc3RydWN0IHNtdF9oZWFkZXIJc210IDsJCS8qIGdlbmVyaWMgaGVhZGVyICovCisJc3RydWN0IHNtdF9wX3RpbWVzdGFtcAl0cyA7CQkvKiB0aW1lIHN0YW1wICovCisJc3RydWN0IHNtdF9wX21hY19zdGF0dXMJc3RhdHVzIDsJLyogbWFjIHN0YXR1cyAqLworCXN0cnVjdCBzbXRfcF9tYWNfY291bnRlciBtYyA7CQkvKiBNQUMgY291bnRlciAqLworCXN0cnVjdCBzbXRfcF9tYWNfZm5jIAlmbmMgOwkJLyogTUFDIGZyYW1lIG5vdCBjb3BpZWQgKi8KKwlzdHJ1Y3Qgc21wX3BfbWFudWZhY3R1cmVyIG1hbiA7CQkvKiBtYW51ZmFjdHVyZXIgZmllbGQgKi8KKwlzdHJ1Y3Qgc21wX3BfdXNlcgl1c2VyIDsJCS8qIHVzZXIgZmllbGQgKi8KKyNpZmRlZglPUFRfUE1GCisJc3RydWN0IHNtdF9wX3NldGNvdW50CXNldGNvdW50IDsJIC8qIFNldCBDb3VudCBtYW5kYXRvcnkgKi8KKyNlbmRpZgorCS8qIG11c3QgYmUgbGFzdCAqLworCXN0cnVjdCBzbXRfcF9sZW0JbGVtWzFdIDsJLyogcGh5IGxlbSBzdGF0dXMgKi8KK30gOworI2RlZmluZSBTSVpFT0ZfU01UX1NJRl9PUEVSQVRJT04JKHNpemVvZihzdHJ1Y3Qgc210X3NpZl9vcGVyYXRpb24pLSBcCisJCQkJCSBzaXplb2Yoc3RydWN0IHNtdF9wX2xlbSkpCisKKy8qCisgKiBFQ0YgOiBlY2hvIGZyYW1lCisgKi8KK3N0cnVjdCBzbXRfZWNmIHsKKwlzdHJ1Y3Qgc210X2hlYWRlcglzbXQgOwkJLyogZ2VuZXJpYyBoZWFkZXIgKi8KKwlzdHJ1Y3Qgc210X3BfZWNobwllY19lY2hvIDsJLyogZWNobyBwYXJhbWV0ZXIgKi8KK30gOworI2RlZmluZSBTTVRfRUNGX0xFTgkoc2l6ZW9mKHN0cnVjdCBzbXRfaGVhZGVyKStzaXplb2Yoc3RydWN0IHNtdF9wYXJhKSkKKworLyoKKyAqIFJERiA6IHJlcXVlc3QgZGVuaWVkIGZyYW1lCisgKi8KK3N0cnVjdCBzbXRfcmRmIHsKKwlzdHJ1Y3Qgc210X2hlYWRlcglzbXQgOwkJLyogZ2VuZXJpYyBoZWFkZXIgKi8KKwlzdHJ1Y3Qgc210X3BfcmVhc29uCXJlYXNvbiA7CS8qIHJlYXNvbiBjb2RlICovCisJc3RydWN0IHNtdF9wX3ZlcnNpb24JdmVyc2lvbiA7CS8qIHN1cHBvcnRlZCB2ZXJzaW9ucyAqLworCXN0cnVjdCBzbXRfcF9yZWZ1c2VkCXJlZnVzZWQgOwkvKiByZWZ1c2VkIGZyYW1lIGZyYWdtZW50ICovCit9IDsKKworLyoKKyAqIFNCQSBSZXF1ZXN0IEFsbG9jYXRpb24gUmVzcG9uY2UgRnJhbWUKKyAqLworc3RydWN0IHNtdF9zYmFfYWxjX3JlcyB7CisJc3RydWN0IHNtdF9oZWFkZXIJc210IDsJCS8qIGdlbmVyaWMgaGVhZGVyICovCisJc3RydWN0IHNtdF9wXzAwMTUJc190eXBlIDsJLyogcmVzb3VyY2UgdHlwZSAqLworCXN0cnVjdCBzbXRfcF8wMDE2CWNtZCA7CQkvKiBTQkEgY29tbWFuZCAqLworCXN0cnVjdCBzbXRfcF9yZWFzb24JcmVhc29uIDsJLyogcmVhc29uIGNvZGUgKi8KKwlzdHJ1Y3Qgc210X3BfMzIwYglwYXRoIDsJCS8qIHBhdGggdHlwZSAqLworCXN0cnVjdCBzbXRfcF8zMjBmCXBheWxvYWQgOwkvKiBjdXJyZW50IFNCQSBwYXlsb2FkICovCisJc3RydWN0IHNtdF9wXzMyMTAJb3ZlcmhlYWQgOwkvKiBjdXJyZW50IFNCQSBvdmVyaGVhZCAqLworCXN0cnVjdCBzbXRfcF8wMDE5CWFfYWRkciA7CS8qIEFsbG9jYXRpb24gQWRkcmVzcyAqLworCXN0cnVjdCBzbXRfcF8wMDFhCWNhdCA7CQkvKiBDYXRlZ29yeSAtIGZyb20gdGhlIHJlcXVlc3QgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxZAlhbGxvYyA7CQkvKiBTQkEgQWxsb2NhdGFibGUgKi8KK30gOworCisvKgorICogU0JBIFJlcXVlc3QgQWxsb2NhdGlvbiBSZXF1ZXN0IEZyYW1lCisgKi8KK3N0cnVjdCBzbXRfc2JhX2FsY19yZXEgeworCXN0cnVjdCBzbXRfaGVhZGVyCXNtdCA7CQkvKiBnZW5lcmljIGhlYWRlciAqLworCXN0cnVjdCBzbXRfcF8wMDE1CXNfdHlwZSA7CS8qIHJlc291cmNlIHR5cGUgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxNgljbWQgOwkJLyogU0JBIGNvbW1hbmQgKi8KKwlzdHJ1Y3Qgc210X3BfMzIwYglwYXRoIDsJCS8qIHBhdGggdHlwZSAqLworCXN0cnVjdCBzbXRfcF8wMDE3CXBsX3JlcSA7CS8qIHJlcXVlc3RlZCBwYXlsb2FkICovCisJc3RydWN0IHNtdF9wXzAwMTgJb3ZfcmVxIDsJLyogcmVxdWVzdGVkIFNCQSBvdmVyaGVhZCAqLworCXN0cnVjdCBzbXRfcF8zMjBmCXBheWxvYWQgOwkvKiBjdXJyZW50IFNCQSBwYXlsb2FkICovCisJc3RydWN0IHNtdF9wXzMyMTAJb3ZlcmhlYWQgOwkvKiBjdXJyZW50IFNCQSBvdmVyaGVhZCAqLworCXN0cnVjdCBzbXRfcF8wMDE5CWFfYWRkciA7CS8qIEFsbG9jYXRpb24gQWRkcmVzcyAqLworCXN0cnVjdCBzbXRfcF8wMDFhCWNhdCA7CQkvKiBDYXRlZ29yeSAtIGZyb20gdGhlIHJlcXVlc3QgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxYgl0bmVnIDsJCS8qIG1heCBULU5FRyAqLworCXN0cnVjdCBzbXRfcF8wMDFjCXNlZ20gOwkJLyogbWluaW11bSBzZWdtZW50IHNpemUgKi8KK30gOworCisvKgorICogU0JBIENoYW5nZSBBbGxvY2F0aW9uIFJlcXVlc3QgRnJhbWUKKyAqLworc3RydWN0IHNtdF9zYmFfY2hnIHsKKwlzdHJ1Y3Qgc210X2hlYWRlcglzbXQgOwkJLyogZ2VuZXJpYyBoZWFkZXIgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxNQlzX3R5cGUgOwkvKiByZXNvdXJjZSB0eXBlICovCisJc3RydWN0IHNtdF9wXzAwMTYJY21kIDsJCS8qIFNCQSBjb21tYW5kICovCisJc3RydWN0IHNtdF9wXzMyMGIJcGF0aCA7CQkvKiBwYXRoIHR5cGUgKi8KKwlzdHJ1Y3Qgc210X3BfMzIwZglwYXlsb2FkIDsJLyogY3VycmVudCBTQkEgcGF5bG9hZCAqLworCXN0cnVjdCBzbXRfcF8zMjEwCW92ZXJoZWFkIDsJLyogY3VycmVudCBTQkEgb3ZlcmhlYWQgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxYQljYXQgOwkJLyogQ2F0ZWdvcnkgLSBmcm9tIHRoZSByZXF1ZXN0ICovCit9IDsKKworLyoKKyAqIFNCQSBSZXBvcnQgQWxsb2NhdGlvbiBSZXF1ZXN0IEZyYW1lCisgKi8KK3N0cnVjdCBzbXRfc2JhX3JlcF9yZXEgeworCXN0cnVjdCBzbXRfaGVhZGVyCXNtdCA7CQkvKiBnZW5lcmljIGhlYWRlciAqLworCXN0cnVjdCBzbXRfcF8wMDE1CXNfdHlwZSA7CS8qIHJlc291cmNlIHR5cGUgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxNgljbWQgOwkJLyogU0JBIGNvbW1hbmQgKi8KK30gOworCisvKgorICogU0JBIFJlcG9ydCBBbGxvY2F0aW9uIFJlc3BvbnNlIEZyYW1lCisgKi8KK3N0cnVjdCBzbXRfc2JhX3JlcF9yZXMgeworCXN0cnVjdCBzbXRfaGVhZGVyCXNtdCA7CQkvKiBnZW5lcmljIGhlYWRlciAqLworCXN0cnVjdCBzbXRfcF8wMDE1CXNfdHlwZSA7CS8qIHJlc291cmNlIHR5cGUgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxNgljbWQgOwkJLyogU0JBIGNvbW1hbmQgKi8KKwlzdHJ1Y3Qgc210X3BfMzIwYglwYXRoIDsJCS8qIHBhdGggdHlwZSAqLworCXN0cnVjdCBzbXRfcF8zMjBmCXBheWxvYWQgOwkvKiBjdXJyZW50IFNCQSBwYXlsb2FkICovCisJc3RydWN0IHNtdF9wXzMyMTAJb3ZlcmhlYWQgOwkvKiBjdXJyZW50IFNCQSBvdmVyaGVhZCAqLworfSA7CisKKy8qCisgKiBhY3Rpb25zCisgKi8KKyNkZWZpbmUgU01UX1NUQVRJT05fQUNUSU9OCTEKKyNkZWZpbmUgU01UX1NUQVRJT05fQUNUSU9OX0NPTk5FQ1QJMAorI2RlZmluZSBTTVRfU1RBVElPTl9BQ1RJT05fRElTQ09OTkVDVAkxCisjZGVmaW5lIFNNVF9TVEFUSU9OX0FDVElPTl9QQVRIVEVTVAkyCisjZGVmaW5lIFNNVF9TVEFUSU9OX0FDVElPTl9TRUxGVEVTVAkzCisjZGVmaW5lIFNNVF9TVEFUSU9OX0FDVElPTl9ESVNBQkxFX0EJNAorI2RlZmluZSBTTVRfU1RBVElPTl9BQ1RJT05fRElTQUJMRV9CCTUKKyNkZWZpbmUgU01UX1NUQVRJT05fQUNUSU9OX0RJU0FCTEVfTQk2CisKKyNkZWZpbmUgU01UX1BPUlRfQUNUSU9OCQkyCisjZGVmaW5lIFNNVF9QT1JUX0FDVElPTl9NQUlOVAkwCisjZGVmaW5lIFNNVF9QT1JUX0FDVElPTl9FTkFCTEUJMQorI2RlZmluZSBTTVRfUE9SVF9BQ1RJT05fRElTQUJMRQkyCisjZGVmaW5lIFNNVF9QT1JUX0FDVElPTl9TVEFSVAkzCisjZGVmaW5lIFNNVF9QT1JUX0FDVElPTl9TVE9QCTQKKworI2VuZGlmCS8qIF9TTVRfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvc210X3AuaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC9zbXRfcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZjliZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvc210X3AuaApAQCAtMCwwICsxLDMyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGRlZmluZXMgZm9yIGFsbCBTTVQgYXR0cmlidXRlcworICovCisKKy8qCisgKiB0aGlzIGJvcmluZyBmaWxlIHdhcyBwcm9kdWNlZCBieSBwZXJsCisgKiB0aGFua3MgTGFycnkgIQorICovCisjZGVmaW5lCVNNVF9QMDAxMgkweDAwMTIKKworI2RlZmluZQlTTVRfUDAwMTUJMHgwMDE1CisjZGVmaW5lCVNNVF9QMDAxNgkweDAwMTYKKyNkZWZpbmUJU01UX1AwMDE3CTB4MDAxNworI2RlZmluZQlTTVRfUDAwMTgJMHgwMDE4CisjZGVmaW5lCVNNVF9QMDAxOQkweDAwMTkKKworI2RlZmluZQlTTVRfUDAwMUEJMHgwMDFhCisjZGVmaW5lCVNNVF9QMDAxQgkweDAwMWIKKyNkZWZpbmUJU01UX1AwMDFDCTB4MDAxYworI2RlZmluZQlTTVRfUDAwMUQJMHgwMDFkCisKKyNkZWZpbmUJU01UX1AxMDBBCTB4MTAwYQorI2RlZmluZQlTTVRfUDEwMEIJMHgxMDBiCisjZGVmaW5lCVNNVF9QMTAwQwkweDEwMGMKKyNkZWZpbmUJU01UX1AxMDBECTB4MTAwZAorI2RlZmluZQlTTVRfUDEwMEUJMHgxMDBlCisjZGVmaW5lCVNNVF9QMTAwRgkweDEwMGYKKyNkZWZpbmUJU01UX1AxMDEwCTB4MTAxMAorI2RlZmluZQlTTVRfUDEwMTEJMHgxMDExCisjZGVmaW5lCVNNVF9QMTAxMgkweDEwMTIKKyNkZWZpbmUJU01UX1AxMDEzCTB4MTAxMworI2RlZmluZQlTTVRfUDEwMTQJMHgxMDE0CisjZGVmaW5lCVNNVF9QMTAxNQkweDEwMTUKKyNkZWZpbmUJU01UX1AxMDE2CTB4MTAxNgorI2RlZmluZQlTTVRfUDEwMTcJMHgxMDE3CisjZGVmaW5lCVNNVF9QMTAxOAkweDEwMTgKKyNkZWZpbmUJU01UX1AxMDE5CTB4MTAxOQorI2RlZmluZQlTTVRfUDEwMUEJMHgxMDFhCisjZGVmaW5lCVNNVF9QMTAxQgkweDEwMWIKKyNkZWZpbmUJU01UX1AxMDFDCTB4MTAxYworI2RlZmluZQlTTVRfUDEwMUQJMHgxMDFkCisjZGVmaW5lCVNNVF9QMTAxRQkweDEwMWUKKyNkZWZpbmUJU01UX1AxMDFGCTB4MTAxZgorI2RlZmluZQlTTVRfUDEwMjAJMHgxMDIwCisjZGVmaW5lCVNNVF9QMTAyMQkweDEwMjEKKyNkZWZpbmUJU01UX1AxMDIyCTB4MTAyMgorI2RlZmluZQlTTVRfUDEwMjMJMHgxMDIzCisjZGVmaW5lCVNNVF9QMTAyNAkweDEwMjQKKyNkZWZpbmUJU01UX1AxMDI1CTB4MTAyNQorI2RlZmluZQlTTVRfUDEwMjYJMHgxMDI2CisjZGVmaW5lCVNNVF9QMTAyNwkweDEwMjcKKyNkZWZpbmUJU01UX1AxMDI4CTB4MTAyOAorI2RlZmluZQlTTVRfUDEwMjkJMHgxMDI5CisjZGVmaW5lCVNNVF9QMTAyQQkweDEwMmEKKyNkZWZpbmUJU01UX1AxMDJCCTB4MTAyYgorI2RlZmluZQlTTVRfUDEwMkMJMHgxMDJjCisjZGVmaW5lCVNNVF9QMTAyRAkweDEwMmQKKyNkZWZpbmUJU01UX1AxMDJFCTB4MTAyZQorI2RlZmluZQlTTVRfUDEwMkYJMHgxMDJmCisjZGVmaW5lCVNNVF9QMTAzMAkweDEwMzAKKyNkZWZpbmUJU01UX1AxMDMxCTB4MTAzMQorI2RlZmluZQlTTVRfUDEwMzIJMHgxMDMyCisjZGVmaW5lCVNNVF9QMTAzMwkweDEwMzMKKyNkZWZpbmUJU01UX1AxMDM0CTB4MTAzNAorI2RlZmluZQlTTVRfUDEwMzUJMHgxMDM1CisjZGVmaW5lCVNNVF9QMTAzNgkweDEwMzYKKyNkZWZpbmUJU01UX1AxMDM3CTB4MTAzNworI2RlZmluZQlTTVRfUDEwMzgJMHgxMDM4CisjZGVmaW5lCVNNVF9QMTAzOQkweDEwMzkKKyNkZWZpbmUJU01UX1AxMDNBCTB4MTAzYQorI2RlZmluZQlTTVRfUDEwM0IJMHgxMDNiCisjZGVmaW5lCVNNVF9QMTAzQwkweDEwM2MKKyNkZWZpbmUJU01UX1AxMDNECTB4MTAzZAorI2RlZmluZQlTTVRfUDEwM0UJMHgxMDNlCisjZGVmaW5lCVNNVF9QMTAzRgkweDEwM2YKKyNkZWZpbmUJU01UX1AxMDQwCTB4MTA0MAorI2RlZmluZQlTTVRfUDEwNDEJMHgxMDQxCisjZGVmaW5lCVNNVF9QMTA0MgkweDEwNDIKKyNkZWZpbmUJU01UX1AxMDQzCTB4MTA0MworI2RlZmluZQlTTVRfUDEwNDQJMHgxMDQ0CisjZGVmaW5lCVNNVF9QMTA0NQkweDEwNDUKKyNkZWZpbmUJU01UX1AxMDQ2CTB4MTA0NgorI2RlZmluZQlTTVRfUDEwNDcJMHgxMDQ3CisjZGVmaW5lCVNNVF9QMTA0OAkweDEwNDgKKyNkZWZpbmUJU01UX1AxMDQ5CTB4MTA0OQorI2RlZmluZQlTTVRfUDEwNEEJMHgxMDRhCisjZGVmaW5lCVNNVF9QMTA0QgkweDEwNGIKKyNkZWZpbmUJU01UX1AxMDRDCTB4MTA0YworI2RlZmluZQlTTVRfUDEwNEQJMHgxMDRkCisjZGVmaW5lCVNNVF9QMTA0RQkweDEwNGUKKyNkZWZpbmUJU01UX1AxMDRGCTB4MTA0ZgorI2RlZmluZQlTTVRfUDEwNTAJMHgxMDUwCisjZGVmaW5lCVNNVF9QMTA1MQkweDEwNTEKKyNkZWZpbmUJU01UX1AxMDUyCTB4MTA1MgorI2RlZmluZQlTTVRfUDEwNTMJMHgxMDUzCisjZGVmaW5lCVNNVF9QMTA1NAkweDEwNTQKKworI2RlZmluZQlTTVRfUDEwRjAJMHgxMGYwCisjZGVmaW5lCVNNVF9QMTBGMQkweDEwZjEKKyNpZmRlZglFU1MKKyNkZWZpbmUJU01UX1AxMEYyCTB4MTBmMgorI2RlZmluZQlTTVRfUDEwRjMJMHgxMGYzCisjZGVmaW5lCVNNVF9QMTBGNAkweDEwZjQKKyNkZWZpbmUJU01UX1AxMEY1CTB4MTBmNQorI2RlZmluZQlTTVRfUDEwRjYJMHgxMGY2CisjZGVmaW5lCVNNVF9QMTBGNwkweDEwZjcKKyNlbmRpZgorI2lmZGVmCVNCQQorI2RlZmluZQlTTVRfUDEwRjgJMHgxMGY4CisjZGVmaW5lCVNNVF9QMTBGOQkweDEwZjkKKyNlbmRpZgorCisjZGVmaW5lCVNNVF9QMjAwQQkweDIwMGEKKyNkZWZpbmUJU01UX1AyMDBCCTB4MjAwYgorI2RlZmluZQlTTVRfUDIwMEMJMHgyMDBjCisjZGVmaW5lCVNNVF9QMjAwRAkweDIwMGQKKyNkZWZpbmUJU01UX1AyMDBFCTB4MjAwZQorI2RlZmluZQlTTVRfUDIwMEYJMHgyMDBmCisjZGVmaW5lCVNNVF9QMjAxMAkweDIwMTAKKyNkZWZpbmUJU01UX1AyMDExCTB4MjAxMQorI2RlZmluZQlTTVRfUDIwMTIJMHgyMDEyCisjZGVmaW5lCVNNVF9QMjAxMwkweDIwMTMKKyNkZWZpbmUJU01UX1AyMDE0CTB4MjAxNAorI2RlZmluZQlTTVRfUDIwMTUJMHgyMDE1CisjZGVmaW5lCVNNVF9QMjAxNgkweDIwMTYKKyNkZWZpbmUJU01UX1AyMDE3CTB4MjAxNworI2RlZmluZQlTTVRfUDIwMTgJMHgyMDE4CisjZGVmaW5lCVNNVF9QMjAxOQkweDIwMTkKKyNkZWZpbmUJU01UX1AyMDFBCTB4MjAxYQorI2RlZmluZQlTTVRfUDIwMUIJMHgyMDFiCisjZGVmaW5lCVNNVF9QMjAxQwkweDIwMWMKKyNkZWZpbmUJU01UX1AyMDFECTB4MjAxZAorI2RlZmluZQlTTVRfUDIwMUUJMHgyMDFlCisjZGVmaW5lCVNNVF9QMjAxRgkweDIwMWYKKyNkZWZpbmUJU01UX1AyMDIwCTB4MjAyMAorI2RlZmluZQlTTVRfUDIwMjEJMHgyMDIxCisjZGVmaW5lCVNNVF9QMjAyMgkweDIwMjIKKyNkZWZpbmUJU01UX1AyMDIzCTB4MjAyMworI2RlZmluZQlTTVRfUDIwMjQJMHgyMDI0CisjZGVmaW5lCVNNVF9QMjAyNQkweDIwMjUKKyNkZWZpbmUJU01UX1AyMDI2CTB4MjAyNgorI2RlZmluZQlTTVRfUDIwMjcJMHgyMDI3CisjZGVmaW5lCVNNVF9QMjAyOAkweDIwMjgKKyNkZWZpbmUJU01UX1AyMDI5CTB4MjAyOQorI2RlZmluZQlTTVRfUDIwMkEJMHgyMDJhCisjZGVmaW5lCVNNVF9QMjAyQgkweDIwMmIKKyNkZWZpbmUJU01UX1AyMDJDCTB4MjAyYworI2RlZmluZQlTTVRfUDIwMkQJMHgyMDJkCisjZGVmaW5lCVNNVF9QMjAyRQkweDIwMmUKKyNkZWZpbmUJU01UX1AyMDJGCTB4MjAyZgorI2RlZmluZQlTTVRfUDIwMzAJMHgyMDMwCisjZGVmaW5lCVNNVF9QMjAzMQkweDIwMzEKKyNkZWZpbmUJU01UX1AyMDMyCTB4MjAzMgorI2RlZmluZQlTTVRfUDIwMzMJMHgyMDMzCisjZGVmaW5lCVNNVF9QMjAzNAkweDIwMzQKKyNkZWZpbmUJU01UX1AyMDM1CTB4MjAzNQorI2RlZmluZQlTTVRfUDIwMzYJMHgyMDM2CisjZGVmaW5lCVNNVF9QMjAzNwkweDIwMzcKKyNkZWZpbmUJU01UX1AyMDM4CTB4MjAzOAorI2RlZmluZQlTTVRfUDIwMzkJMHgyMDM5CisjZGVmaW5lCVNNVF9QMjAzQQkweDIwM2EKKyNkZWZpbmUJU01UX1AyMDNCCTB4MjAzYgorI2RlZmluZQlTTVRfUDIwM0MJMHgyMDNjCisjZGVmaW5lCVNNVF9QMjAzRAkweDIwM2QKKyNkZWZpbmUJU01UX1AyMDNFCTB4MjAzZQorI2RlZmluZQlTTVRfUDIwM0YJMHgyMDNmCisjZGVmaW5lCVNNVF9QMjA0MAkweDIwNDAKKyNkZWZpbmUJU01UX1AyMDQxCTB4MjA0MQorI2RlZmluZQlTTVRfUDIwNDIJMHgyMDQyCisjZGVmaW5lCVNNVF9QMjA0MwkweDIwNDMKKyNkZWZpbmUJU01UX1AyMDQ0CTB4MjA0NAorI2RlZmluZQlTTVRfUDIwNDUJMHgyMDQ1CisjZGVmaW5lCVNNVF9QMjA0NgkweDIwNDYKKyNkZWZpbmUJU01UX1AyMDQ3CTB4MjA0NworI2RlZmluZQlTTVRfUDIwNDgJMHgyMDQ4CisjZGVmaW5lCVNNVF9QMjA0OQkweDIwNDkKKyNkZWZpbmUJU01UX1AyMDRBCTB4MjA0YQorI2RlZmluZQlTTVRfUDIwNEIJMHgyMDRiCisjZGVmaW5lCVNNVF9QMjA0QwkweDIwNGMKKyNkZWZpbmUJU01UX1AyMDRECTB4MjA0ZAorI2RlZmluZQlTTVRfUDIwNEUJMHgyMDRlCisjZGVmaW5lCVNNVF9QMjA0RgkweDIwNGYKKyNkZWZpbmUJU01UX1AyMDUwCTB4MjA1MAorI2RlZmluZQlTTVRfUDIwNTEJMHgyMDUxCisjZGVmaW5lCVNNVF9QMjA1MgkweDIwNTIKKyNkZWZpbmUJU01UX1AyMDUzCTB4MjA1MworI2RlZmluZQlTTVRfUDIwNTQJMHgyMDU0CisjZGVmaW5lCVNNVF9QMjA1NQkweDIwNTUKKyNkZWZpbmUJU01UX1AyMDU2CTB4MjA1NgorI2RlZmluZQlTTVRfUDIwNTcJMHgyMDU3CisjZGVmaW5lCVNNVF9QMjA1OAkweDIwNTgKKyNkZWZpbmUJU01UX1AyMDU5CTB4MjA1OQorI2RlZmluZQlTTVRfUDIwNUEJMHgyMDVhCisjZGVmaW5lCVNNVF9QMjA1QgkweDIwNWIKKyNkZWZpbmUJU01UX1AyMDVDCTB4MjA1YworI2RlZmluZQlTTVRfUDIwNUQJMHgyMDVkCisjZGVmaW5lCVNNVF9QMjA1RQkweDIwNWUKKyNkZWZpbmUJU01UX1AyMDVGCTB4MjA1ZgorI2RlZmluZQlTTVRfUDIwNjAJMHgyMDYwCisjZGVmaW5lCVNNVF9QMjA2MQkweDIwNjEKKyNkZWZpbmUJU01UX1AyMDYyCTB4MjA2MgorI2RlZmluZQlTTVRfUDIwNjMJMHgyMDYzCisjZGVmaW5lCVNNVF9QMjA2NAkweDIwNjQKKyNkZWZpbmUJU01UX1AyMDY1CTB4MjA2NQorI2RlZmluZQlTTVRfUDIwNjYJMHgyMDY2CisjZGVmaW5lCVNNVF9QMjA2NwkweDIwNjcKKyNkZWZpbmUJU01UX1AyMDY4CTB4MjA2OAorI2RlZmluZQlTTVRfUDIwNjkJMHgyMDY5CisjZGVmaW5lCVNNVF9QMjA2QQkweDIwNmEKKyNkZWZpbmUJU01UX1AyMDZCCTB4MjA2YgorI2RlZmluZQlTTVRfUDIwNkMJMHgyMDZjCisjZGVmaW5lCVNNVF9QMjA2RAkweDIwNmQKKyNkZWZpbmUJU01UX1AyMDZFCTB4MjA2ZQorI2RlZmluZQlTTVRfUDIwNkYJMHgyMDZmCisjZGVmaW5lCVNNVF9QMjA3MAkweDIwNzAKKyNkZWZpbmUJU01UX1AyMDcxCTB4MjA3MQorI2RlZmluZQlTTVRfUDIwNzIJMHgyMDcyCisjZGVmaW5lCVNNVF9QMjA3MwkweDIwNzMKKyNkZWZpbmUJU01UX1AyMDc0CTB4MjA3NAorI2RlZmluZQlTTVRfUDIwNzUJMHgyMDc1CisjZGVmaW5lCVNNVF9QMjA3NgkweDIwNzYKKworI2RlZmluZQlTTVRfUDIwOEMJMHgyMDhjCisjZGVmaW5lCVNNVF9QMjA4RAkweDIwOGQKKyNkZWZpbmUJU01UX1AyMDhFCTB4MjA4ZQorI2RlZmluZQlTTVRfUDIwOEYJMHgyMDhmCisjZGVmaW5lCVNNVF9QMjA5MAkweDIwOTAKKworI2RlZmluZQlTTVRfUDIwRjAJMHgyMEYwCisjZGVmaW5lCVNNVF9QMjBGMQkweDIwRjEKKworI2RlZmluZQlTTVRfUDMyMEEJMHgzMjBhCisjZGVmaW5lCVNNVF9QMzIwQgkweDMyMGIKKyNkZWZpbmUJU01UX1AzMjBDCTB4MzIwYworI2RlZmluZQlTTVRfUDMyMEQJMHgzMjBkCisjZGVmaW5lCVNNVF9QMzIwRQkweDMyMGUKKyNkZWZpbmUJU01UX1AzMjBGCTB4MzIwZgorI2RlZmluZQlTTVRfUDMyMTAJMHgzMjEwCisjZGVmaW5lCVNNVF9QMzIxMQkweDMyMTEKKyNkZWZpbmUJU01UX1AzMjEyCTB4MzIxMgorI2RlZmluZQlTTVRfUDMyMTMJMHgzMjEzCisjZGVmaW5lCVNNVF9QMzIxNAkweDMyMTQKKyNkZWZpbmUJU01UX1AzMjE1CTB4MzIxNQorI2RlZmluZQlTTVRfUDMyMTYJMHgzMjE2CisjZGVmaW5lCVNNVF9QMzIxNwkweDMyMTcKKworI2RlZmluZQlTTVRfUDQwMEEJMHg0MDBhCisjZGVmaW5lCVNNVF9QNDAwQgkweDQwMGIKKyNkZWZpbmUJU01UX1A0MDBDCTB4NDAwYworI2RlZmluZQlTTVRfUDQwMEQJMHg0MDBkCisjZGVmaW5lCVNNVF9QNDAwRQkweDQwMGUKKyNkZWZpbmUJU01UX1A0MDBGCTB4NDAwZgorI2RlZmluZQlTTVRfUDQwMTAJMHg0MDEwCisjZGVmaW5lCVNNVF9QNDAxMQkweDQwMTEKKyNkZWZpbmUJU01UX1A0MDEyCTB4NDAxMgorI2RlZmluZQlTTVRfUDQwMTMJMHg0MDEzCisjZGVmaW5lCVNNVF9QNDAxNAkweDQwMTQKKyNkZWZpbmUJU01UX1A0MDE1CTB4NDAxNQorI2RlZmluZQlTTVRfUDQwMTYJMHg0MDE2CisjZGVmaW5lCVNNVF9QNDAxNwkweDQwMTcKKyNkZWZpbmUJU01UX1A0MDE4CTB4NDAxOAorI2RlZmluZQlTTVRfUDQwMTkJMHg0MDE5CisjZGVmaW5lCVNNVF9QNDAxQQkweDQwMWEKKyNkZWZpbmUJU01UX1A0MDFCCTB4NDAxYgorI2RlZmluZQlTTVRfUDQwMUMJMHg0MDFjCisjZGVmaW5lCVNNVF9QNDAxRAkweDQwMWQKKyNkZWZpbmUJU01UX1A0MDFFCTB4NDAxZQorI2RlZmluZQlTTVRfUDQwMUYJMHg0MDFmCisjZGVmaW5lCVNNVF9QNDAyMAkweDQwMjAKKyNkZWZpbmUJU01UX1A0MDIxCTB4NDAyMQorI2RlZmluZQlTTVRfUDQwMjIJMHg0MDIyCisjZGVmaW5lCVNNVF9QNDAyMwkweDQwMjMKKyNkZWZpbmUJU01UX1A0MDI0CTB4NDAyNAorI2RlZmluZQlTTVRfUDQwMjUJMHg0MDI1CisjZGVmaW5lCVNNVF9QNDAyNgkweDQwMjYKKyNkZWZpbmUJU01UX1A0MDI3CTB4NDAyNworI2RlZmluZQlTTVRfUDQwMjgJMHg0MDI4CisjZGVmaW5lCVNNVF9QNDAyOQkweDQwMjkKKyNkZWZpbmUJU01UX1A0MDJBCTB4NDAyYQorI2RlZmluZQlTTVRfUDQwMkIJMHg0MDJiCisjZGVmaW5lCVNNVF9QNDAyQwkweDQwMmMKKyNkZWZpbmUJU01UX1A0MDJECTB4NDAyZAorI2RlZmluZQlTTVRfUDQwMkUJMHg0MDJlCisjZGVmaW5lCVNNVF9QNDAyRgkweDQwMmYKKyNkZWZpbmUJU01UX1A0MDMwCTB4NDAzMAorI2RlZmluZQlTTVRfUDQwMzEJMHg0MDMxCisjZGVmaW5lCVNNVF9QNDAzMgkweDQwMzIKKyNkZWZpbmUJU01UX1A0MDMzCTB4NDAzMworI2RlZmluZQlTTVRfUDQwMzQJMHg0MDM0CisjZGVmaW5lCVNNVF9QNDAzNQkweDQwMzUKKyNkZWZpbmUJU01UX1A0MDM2CTB4NDAzNgorI2RlZmluZQlTTVRfUDQwMzcJMHg0MDM3CisjZGVmaW5lCVNNVF9QNDAzOAkweDQwMzgKKyNkZWZpbmUJU01UX1A0MDM5CTB4NDAzOQorI2RlZmluZQlTTVRfUDQwM0EJMHg0MDNhCisjZGVmaW5lCVNNVF9QNDAzQgkweDQwM2IKKyNkZWZpbmUJU01UX1A0MDNDCTB4NDAzYworI2RlZmluZQlTTVRfUDQwM0QJMHg0MDNkCisjZGVmaW5lCVNNVF9QNDAzRQkweDQwM2UKKyNkZWZpbmUJU01UX1A0MDNGCTB4NDAzZgorI2RlZmluZQlTTVRfUDQwNDAJMHg0MDQwCisjZGVmaW5lCVNNVF9QNDA0MQkweDQwNDEKKyNkZWZpbmUJU01UX1A0MDQyCTB4NDA0MgorI2RlZmluZQlTTVRfUDQwNDMJMHg0MDQzCisjZGVmaW5lCVNNVF9QNDA0NAkweDQwNDQKKyNkZWZpbmUJU01UX1A0MDQ1CTB4NDA0NQorI2RlZmluZQlTTVRfUDQwNDYJMHg0MDQ2CisKKyNkZWZpbmUJU01UX1A0MDUwCTB4NDA1MAorI2RlZmluZQlTTVRfUDQwNTEJMHg0MDUxCisjZGVmaW5lCVNNVF9QNDA1MgkweDQwNTIKKyNkZWZpbmUJU01UX1A0MDUzCTB4NDA1MwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9oL3NtdHN0YXRlLmggYi9kcml2ZXJzL25ldC9za2ZwL2gvc210c3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmZlNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9oL3NtdHN0YXRlLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NLRlBfSF9TTVRTVEFURV9IXworI2RlZmluZSBfU0tGUF9IX1NNVFNUQVRFX0hfCisKKy8qCisgKglTTVQgc3RhdGUgZGVmaW5pdGlvbnMKKyAqLworCisjaWZuZGVmCUtFUk5FTAorLyoKKyAqIFBDTSBzdGF0ZXMKKyAqLworI2RlZmluZSBQQzBfT0ZGCQkJMAorI2RlZmluZSBQQzFfQlJFQUsJCTEKKyNkZWZpbmUgUEMyX1RSQUNFCQkyCisjZGVmaW5lIFBDM19DT05ORUNUCQkzCisjZGVmaW5lIFBDNF9ORVhUCQk0CisjZGVmaW5lIFBDNV9TSUdOQUwJCTUKKyNkZWZpbmUgUEM2X0pPSU4JCTYKKyNkZWZpbmUgUEM3X1ZFUklGWQkJNworI2RlZmluZSBQQzhfQUNUSVZFCQk4CisjZGVmaW5lIFBDOV9NQUlOVAkJOQorCisvKgorICogUENNIG1vZGVzCisgKi8KKyNkZWZpbmUgUE1fTk9ORQkJCTAKKyNkZWZpbmUgUE1fUEVFUgkJCTEKKyNkZWZpbmUgUE1fVFJFRQkJCTIKKworLyoKKyAqIFBDTSB0eXBlCisgKi8KKyNkZWZpbmUgVEEJCQkwCisjZGVmaW5lIFRCCQkJMQorI2RlZmluZSBUUwkJCTIKKyNkZWZpbmUgVE0JCQkzCisjZGVmaW5lIFROT05FCQkJNAorCisvKgorICogQ0ZNIHN0YXRlcworICovCisjZGVmaW5lIFNDMF9JU09MQVRFRAkwCQkvKiBpc29sYXRlZCAqLworI2RlZmluZSBTQzFfV1JBUF9BCTUJCS8qIHdyYXAgQSAqLworI2RlZmluZSBTQzJfV1JBUF9CCTYJCS8qIHdyYXAgQiAqLworI2RlZmluZSBTQzRfVEhSVV9BCTEyCQkvKiB0aHJvdWdoIEEgKi8KKyNkZWZpbmUgU0M1X1RIUlVfQgk3CQkvKiB0aHJvdWdoIEIgKFNNdCA2LjIpICovCisjZGVmaW5lIFNDN19XUkFQX1MJOAkJLyogU0FTICovCisKKy8qCisgKiBFQ00gc3RhdGVzCisgKi8KKyNkZWZpbmUgRUMwX09VVAkJMAorI2RlZmluZSBFQzFfSU4JCTEKKyNkZWZpbmUgRUMyX1RSQUNFCTIKKyNkZWZpbmUgRUMzX0xFQVZFCTMKKyNkZWZpbmUgRUM0X1BBVEhfVEVTVAk0CisjZGVmaW5lIEVDNV9JTlNFUlQJNQorI2RlZmluZSBFQzZfQ0hFQ0sJNgorI2RlZmluZSBFQzdfREVJTlNFUlQJNworCisvKgorICogUk1UIHN0YXRlcworICovCisjZGVmaW5lIFJNMF9JU09MQVRFRAkwCisjZGVmaW5lIFJNMV9OT05fT1AJMQkJLyogbm90IG9wZXJhdGlvbmFsICovCisjZGVmaW5lIFJNMl9SSU5HX09QCTIJCS8qIHJpbmcgb3BlcmF0aW9uYWwgKi8KKyNkZWZpbmUgUk0zX0RFVEVDVAkzCQkvKiBkZXRlY3QgZHVwbCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgUk00X05PTl9PUF9EVVAJNAkJLyogZHVwbC4gYWRkciBkZXRlY3RlZCAqLworI2RlZmluZSBSTTVfUklOR19PUF9EVVAJNQkJLyogcmluZyBvcGVyLiB3aXRoIGR1cGwuIGFkZHIgKi8KKyNkZWZpbmUgUk02X0RJUkVDVEVECTYJCS8qIHNlbmRpbmcgZGlyZWN0ZWQgYmVhY29ucyAqLworI2RlZmluZSBSTTdfVFJBQ0UJNwkJLyogdHJhY2UgaW5pdGlhdGVkICovCisjZW5kaWYKKworc3RydWN0IHBjbV9zdGF0ZSB7CisJdW5zaWduZWQgY2hhcglwY21fdHlwZSA7CQkvKiBUQSBUQiBUUyBUTSAqLworCXVuc2lnbmVkIGNoYXIJcGNtX3N0YXRlIDsJCS8qIHN0YXRlIFBDWzAtOV1fKiAqLworCXVuc2lnbmVkIGNoYXIJcGNtX21vZGUgOwkJLyogUE1fe05PTkUsUEVFUixUUkVFfSAqLworCXVuc2lnbmVkIGNoYXIJcGNtX25laWdoYm9yIDsJCS8qIFRBIFRCIFRTIFRNICovCisJdW5zaWduZWQgY2hhcglwY21fYnNmIDsJCS8qIGZsYWcgYnMgOiBUUlVFL0ZBTFNFICovCisJdW5zaWduZWQgY2hhcglwY21fbHNmIDsJCS8qIGZsYWcgbHMgOiBUUlVFL0ZBTFNFICovCisJdW5zaWduZWQgY2hhcglwY21fbGN0X2ZhaWwgOwkJLyogY291bnRlciBsY3RfZmFpbCAqLworCXVuc2lnbmVkIGNoYXIJcGNtX2xzX3J4IDsJCS8qIHJ4IGxpbmUgc3RhdGUgKi8KKwlzaG9ydAkJcGNtX3JfdmFsIDsJCS8qIHNpZ25hbGluZyBiaXRzICovCisJc2hvcnQJCXBjbV90X3ZhbCA7CQkvKiBzaWduYWxpbmcgYml0cyAqLworfSA7CisKK3N0cnVjdCBzbXRfc3RhdGUgeworCXN0cnVjdCBwY21fc3RhdGUgcGNtX3N0YXRlW05VTVBIWVNdIDsJLyogcG9ydCBBICYgcG9ydCBCICovCit9IDsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9zdXBlcm5fMi5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL3N1cGVybl8yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhMGI4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC9zdXBlcm5fMi5oCkBAIC0wLDAgKzEsMTA1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKwlkZWZpbmVzIGZvciBBTUQgU3VwZXJuZXQgSUkgY2hpcCBzZXQKKwl0aGUgY2hpcHMgYXJlIHJlZmVyZWQgdG8gYXMKKwkJRlBMVVMJRm9ybWFjIFBsdXMKKwkJUExDCVBoeXNpY2FsIExheWVyCisKKwlhZGRlZCBkZWZpbmVzIGZvciBBTUQgU3VwZXJuZXQgSUlJIGNoaXAgc2V0CisJYWRkZWQgY29tbWVudHMgb24gZGlmZmVyZW5jZXMgYmV0d2VlbiBTdXBlcm5ldCBJSSBhbmQgU3VwZXJuZXQgSUlJCisJYWRkZWQgZGVmaW5lcyBmb3IgdGhlIE1vdG9yb2xhIEVMTSAoTU9UX0VMTSkKKyovCisKKyNpZm5kZWYJX1NVUEVSTkVUXworI2RlZmluZSBfU1VQRVJORVRfCisKKy8qCisgKiBEZWZpbmUgU3VwZXJuZXQgMyB3aGVuIHVzZWQKKyAqLworI2lmZGVmCVBDSQorI2lmbmRlZglTVVBFUk5FVF8zCisjZGVmaW5lCVNVUEVSTkVUXzMKKyNlbmRpZgorI2RlZmluZSBUQUcKKyNlbmRpZgorCisjZGVmaW5lCU1CCTB4ZmYKKyNkZWZpbmUJTVcJMHhmZmZmCisjZGVmaW5lCU1ECTB4ZmZmZmZmZmYKKworLyoKKyAqIEZPUk1BQyBmcmFtZSBzdGF0dXMgKHJ4X21zZXh0KQorICovCisjZGVmaW5lCUZTX0VJCQkoMTw8MikKKyNkZWZpbmUJRlNfQUkJCSgxPDwxKQorI2RlZmluZQlGU19DSQkJKDE8PDApCisKKyNkZWZpbmUgRlNfTVNWQUxJRAkoMTw8MTUpCQkvKiBlbmQgb2YgcXVldWUgKi8KKyNkZWZpbmUgRlNfTVNSQUJUCSgxPDwxNCkJCS8qIGZyYW1lIHdhcyBhYm9ydGVkIGR1cmluZyByZWNlcHRpb24qLworI2RlZmluZSBGU19TU1JDUlRHCSgxPDwxMikJCS8qIGlmIFNBIGhhcyBzZXQgTVNCIChzb3VyY2Utcm91dGluZykqLworI2RlZmluZSBGU19TRUFDMgkoRlNfRUk8PDkpCS8qIGVycm9yIGluZGljYXRvciAqLworI2RlZmluZSBGU19TRUFDMQkoRlNfQUk8PDkpCS8qIGFkZHJlc3MgaW5kaWNhdG9yICovCisjZGVmaW5lIEZTX1NFQUMwCShGU19DSTw8OSkJLyogY29weSBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgRlNfU0ZSTUVSUgkoMTw8OCkJCS8qIGVycm9yIGRldGVjdGVkIChDUkMgb3IgbGVuZ3RoKSAqLworI2RlZmluZSBGU19TQURSUkcJKDE8PDcpCQkvKiBhZGRyZXNzIHJlY29nbml6ZWQgKi8KKyNkZWZpbmUgRlNfU0ZSTVRZMgkoMTw8NikJCS8qIGZyYW1lLWNsYXNzIGJpdCAqLworI2RlZmluZSBGU19TRlJNVFkxCSgxPDw1KQkJLyogZnJhbWUtdHlwZSBiaXQgKGltcGVtZW50b3IpICovCisjZGVmaW5lIEZTX1NGUk1UWTAJKDE8PDQpCQkvKiBmcmFtZS10eXBlIGJpdCAoTExDKSAqLworI2RlZmluZSBGU19FUkZCQjEJKDE8PDEpCQkvKiBieXRlIG9mZnNldCAoZGVwZW5kcyBvbiBMU0IgYml0KSAqLworI2RlZmluZSBGU19FUkZCQjAJKDE8PDApCQkvKiAgLSAiIC0gKi8KKworLyoKKyAqIHN0YXR1cyBmcmFtZSB0eXBlCisgKi8KKyNkZWZpbmUJRlJNX1NNVAkJKDApCS8qIGFzeW5jaHIuIGZyYW1lcyAqLworI2RlZmluZQlGUk1fTExDQQkoMSkKKyNkZWZpbmUJRlJNX0lNUEEJKDIpCQorI2RlZmluZQlGUk1fTUFDCQkoNCkJLyogc3luY2hyLiBmcmFtZXMgKi8KKyNkZWZpbmUJRlJNX0xMQ1MJKDUpCisjZGVmaW5lCUZSTV9JTVBTCSg2KQorCisvKgorICogYml0cyBpbiByeF9kZXNjci5pCShyZWNlaXZlIGZyYW1lIHN0YXR1cyB3b3JkKQorICovCisjZGVmaW5lIFJYX01TVkFMSUQJKChsb25nKTE8PDMxKQkvKiBtZW1vcnkgc3RhdHVzIHZhbGlkICovCisjZGVmaW5lIFJYX01TUkFCVAkoKGxvbmcpMTw8MzApCS8qIG1lbW9yeSBzdGF0dXMgcmVjZWl2ZSBhYm9ydCAqLworI2RlZmluZSBSWF9GU19FCQkoKGxvbmcpRlNfU0VBQzI8PDE2KQkvKiBlcnJvciBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgUlhfRlNfQQkJKChsb25nKUZTX1NFQUMxPDwxNikJLyogYWRkcmVzcyBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgUlhfRlNfQwkJKChsb25nKUZTX1NFQUMwPDwxNikJLyogY29weSBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgUlhfRlNfQ1JDCSgobG9uZylGU19TRlJNRVJSPDwxNikvKiBlcnJvciBkZXRlY3RlZCAqLworI2RlZmluZSBSWF9GU19BRERSRVNTCSgobG9uZylGU19TQURSUkc8PDE2KQkvKiBhZGRyZXNzIHJlY29nbml6ZWQgKi8KKyNkZWZpbmUgUlhfRlNfTUFDCSgobG9uZylGU19TRlJNVFkyPDwxNikvKiBNQUMgZnJhbWUgKi8KKyNkZWZpbmUgUlhfRlNfU01UCSgobG9uZykwPDwxNikJCS8qIFNNVCBmcmFtZSAqLworI2RlZmluZSBSWF9GU19JTVBMCSgobG9uZylGU19TRlJNVFkxPDwxNikvKiBpbXBsZW1lbnRlciBmcmFtZSAqLworI2RlZmluZSBSWF9GU19MTEMJKChsb25nKUZTX1NGUk1UWTA8PDE2KS8qIExMQyBmcmFtZSAqLworCisvKgorICogcmVjZWl2ZSBmcmFtZSBkZXNjcmlwdG9yCisgKi8KK3VuaW9uIHJ4X2Rlc2NyIHsKKwlzdHJ1Y3QgeworI2lmZGVmCUxJVFRMRV9FTkRJQU4KKwl1bnNpZ25lZAlyeF9sZW5ndGggOjE2IDsJLyogZnJhbWUgbGVuZ3RoIGxvd2VyL3VwcGVyIGJ5dGUgKi8KKwl1bnNpZ25lZAlyeF9lcmZiYiAgOjIgOwkvKiByZWNlaXZlZCBmcmFtZSBieXRlIGJvdW5kYXJ5ICovCisJdW5zaWduZWQJcnhfcmVzZXJ2MjoyIDsJLyogcmVzZXJ2ZWQgKi8JCisJdW5zaWduZWQJcnhfc2ZybXR5IDozIDsJLyogZnJhbWUgdHlwZSBiaXRzICovCisJdW5zaWduZWQJcnhfc2FkcnJnIDoxIDsJLyogREEgPT0gTUEgb3IgYnJvYWQtL211bHRpY2FzdCAqLworCXVuc2lnbmVkCXJ4X3Nmcm1lcnI6MSA7CS8qIHJlY2VpdmVkIGZyYW1lIG5vdCB2YWxpZCAqLworCXVuc2lnbmVkCXJ4X3NlYWMwICA6MSA7CS8qIGZyYW1lLWNvcGllZCAgQy1pbmRpY2F0b3IgKi8KKwl1bnNpZ25lZAlyeF9zZWFjMSAgOjEgOwkvKiBhZGRyZXNzLW1hdGNoIEEtaW5kaWNhdG9yICovCisJdW5zaWduZWQJcnhfc2VhYzIgIDoxIDsJLyogZnJhbWUtZXJyb3IgICBFLWluZGljYXRvciAqLworCXVuc2lnbmVkCXJ4X3NzcmNydGc6MSA7CS8qID09IDEgU0EgaGFzIE1TQiBzZXQgKi8KKwl1bnNpZ25lZAlyeF9yZXNlcnYxOjEgOwkvKiByZXNlcnZlZCAqLwkKKwl1bnNpZ25lZAlyeF9tc3JhYnQgOjEgOwkvKiBtZW1vcnkgc3RhdHVzIHJlY2VpdmUgYWJvcnQgKi8KKwl1bnNpZ25lZAlyeF9tc3ZhbGlkOjEgOwkvKiBtZW1vcnkgc3RhdHVzIHZhbGlkICovCisjZWxzZQorCXVuc2lnbmVkCXJ4X21zdmFsaWQ6MSA7CS8qIG1lbW9yeSBzdGF0dXMgdmFsaWQgKi8KKwl1bnNpZ25lZAlyeF9tc3JhYnQgOjEgOwkvKiBtZW1vcnkgc3RhdHVzIHJlY2VpdmUgYWJvcnQgKi8KKwl1bnNpZ25lZAlyeF9yZXNlcnYxOjEgOwkvKiByZXNlcnZlZCAqLwkKKwl1bnNpZ25lZAlyeF9zc3JjcnRnOjEgOwkvKiA9PSAxIFNBIGhhcyBNU0Igc2V0ICovCisJdW5zaWduZWQJcnhfc2VhYzIgIDoxIDsJLyogZnJhbWUtZXJyb3IgICBFLWluZGljYXRvciAqLworCXVuc2lnbmVkCXJ4X3NlYWMxICA6MSA7CS8qIGFkZHJlc3MtbWF0Y2ggQS1pbmRpY2F0b3IgKi8KKwl1bnNpZ25lZAlyeF9zZWFjMCAgOjEgOwkvKiBmcmFtZS1jb3BpZWQgIEMtaW5kaWNhdG9yICovCisJdW5zaWduZWQJcnhfc2ZybWVycjoxIDsJLyogcmVjZWl2ZWQgZnJhbWUgbm90IHZhbGlkICovCisJdW5zaWduZWQJcnhfc2FkcnJnIDoxIDsJLyogREEgPT0gTUEgb3IgYnJvYWQtL211bHRpY2FzdCAqLworCXVuc2lnbmVkCXJ4X3Nmcm10eSA6MyA7CS8qIGZyYW1lIHR5cGUgYml0cyAqLworCXVuc2lnbmVkCXJ4X2VyZmJiICA6MiA7CS8qIHJlY2VpdmVkIGZyYW1lIGJ5dGUgYm91bmRhcnkgKi8KKwl1bnNpZ25lZAlyeF9yZXNlcnYyOjIgOwkvKiByZXNlcnZlZCAqLwkKKwl1bnNpZ25lZAlyeF9sZW5ndGggOjE2IDsJLyogZnJhbWUgbGVuZ3RoIGxvd2VyL3VwcGVyIGJ5dGUgKi8KKyNlbmRpZgorCX0gciA7CisJbG9uZwlpIDsKK30gOworCisvKiBkZWZpbmVzIGZvciBSZWNlaXZlIEZyYW1lIERlc2NyaXB0b3IgYWNjZXNzICovCisjZGVmaW5lIFJEX1NfRVJGQkIJMHgwMDAzMDAwMEwJLyogcmVjZWl2ZWQgZnJhbWUgYnl0ZSBib3VuZGFyeSAqLworI2RlZmluZSBSRF9TX1JFUzIJMHgwMDBjMDAwMEwJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUkRfU19TRlJNVFkJMHgwMDcwMDAwMEwJLyogZnJhbWUgdHlwZSBiaXRzICovCisjZGVmaW5lIFJEX1NfU0FEUlJHCTB4MDA4MDAwMDBMCS8qIERBID09IE1BIG9yIGJyb2FkLS9tdWx0aWNhc3QgKi8KKyNkZWZpbmUgUkRfU19TRlJNRVJSCTB4MDEwMDAwMDBMCS8qIHJlY2VpdmVkIGZyYW1lIG5vdCB2YWxpZCAqLworI2RlZmluZQlSRF9TX1NFQUMJMHgwZTAwMDAwMEwJLyogZnJhbWUgc3RhdHVzIGluZGljYXRvcnMgKi8KKyNkZWZpbmUgUkRfU19TRUFDMAkweDAyMDAwMDAwTAkvKiBmcmFtZS1jb3BpZWQgIGNhc2UtaW5kaWNhdG9yICovCisjZGVmaW5lIFJEX1NfU0VBQzEJMHgwNDAwMDAwMEwJLyogYWRkcmVzcy1tYXRjaCBBLWluZGljYXRvciAqLworI2RlZmluZSBSRF9TX1NFQUMyCTB4MDgwMDAwMDBMCS8qIGZyYW1lLWVycm9yICAgRS1pbmRpY2F0b3IgKi8KKyNkZWZpbmUgUkRfU19TU1JDUlRHCTB4MTAwMDAwMDBMCS8qID09IDEgU0EgaGFzIE1TQiBzZXQgKi8KKyNkZWZpbmUgUkRfU19SRVMxCTB4MjAwMDAwMDBMCS8qIHJlc2VydmVkICovCisjZGVmaW5lIFJEX1NfTVNSQUJUCTB4NDAwMDAwMDBMCS8qIG1lbW9yeSBzdGF0dXMgcmVjZWl2ZSBhYm9ydCAqLworI2RlZmluZSBSRF9TX01TVkFMSUQJMHg4MDAwMDAwMEwJLyogbWVtb3J5IHN0YXR1cyB2YWxpZCAqLworCisjZGVmaW5lCVJEX1NUQVRVUwkweGZmZmYwMDAwTAorI2RlZmluZQlSRF9MRU5HVEgJMHgwMDAwZmZmZkwKKworLyogZGVmaW5lcyBmb3IgUmVjZWl2ZSBGcmFtZXMgU3RhdHVzIFdvcmQgdmFsdWVzICovCisvKlJEX1NfU0ZSTVRZKi8KKyNkZWZpbmUgUkRfRlJNX1NNVAkodW5zaWduZWQgbG9uZykoMDw8MjApICAgICAvKiBhc3luY2hyLiBmcmFtZXMgKi8KKyNkZWZpbmUgUkRfRlJNX0xMQ0EJKHVuc2lnbmVkIGxvbmcpKDE8PDIwKQorI2RlZmluZSBSRF9GUk1fSU1QQQkodW5zaWduZWQgbG9uZykoMjw8MjApCisjZGVmaW5lIFJEX0ZSTV9NQUMJKHVuc2lnbmVkIGxvbmcpKDQ8PDIwKSAgICAgLyogc3luY2hyLiBmcmFtZXMgKi8KKyNkZWZpbmUgUkRfRlJNX0xMQ1MJKHVuc2lnbmVkIGxvbmcpKDU8PDIwKQorI2RlZmluZSBSRF9GUk1fSU1QUwkodW5zaWduZWQgbG9uZykoNjw8MjApCisKKyNkZWZpbmUgVFhfREVTQ1JJUFRPUgkweDQwMDAwMDAwTAorI2RlZmluZSBUWF9PRkZTRVRfMwkweDE4MDAwMDAwTAorCisjZGVmaW5lIFRYUDEJMgorCisvKgorICogdHJhbnNtaXQgZnJhbWUgZGVzY3JpcHRvcgorICovCit1bmlvbiB0eF9kZXNjciB7CisJc3RydWN0IHsKKyNpZmRlZglMSVRUTEVfRU5ESUFOCisJdW5zaWduZWQJdHhfbGVuZ3RoOjE2IDsJLyogZnJhbWUgbGVuZ3RoIGxvd2VyL3VwcGVyIGJ5dGUgKi8KKwl1bnNpZ25lZAl0eF9yZXMJIDo4IDsJLyogcmVzZXJ2ZWQgCSAoYml0IDE2Li4yMykgKi8KKwl1bnNpZ25lZAl0eF94bXRhYnQ6MSA7CS8qIHRyYW5zbWl0IGFib3J0ICovCisJdW5zaWduZWQJdHhfbmZjcyAgOjEgOwkvKiBubyBmcmFtZSBjaGVjayBzZXF1ZW5jZSAqLworCXVuc2lnbmVkCXR4X3hkb25lIDoxIDsJLyogZ2l2ZSB1cCB0b2tlbiAqLworCXVuc2lnbmVkCXR4X3JweG0gIDoyIDsJLyogYnl0ZSBvZmZzZXQgKi8KKwl1bnNpZ25lZAl0eF9wYXQxICA6MiA7CS8qIG11c3QgYmUgVFhQMSAqLworCXVuc2lnbmVkCXR4X21vcmUJIDoxIDsJLyogbW9yZSBmcmFtZSBpbiBjaGFpbiAqLworI2Vsc2UKKwl1bnNpZ25lZAl0eF9tb3JlCSA6MSA7CS8qIG1vcmUgZnJhbWUgaW4gY2hhaW4gKi8KKwl1bnNpZ25lZAl0eF9wYXQxICA6MiA7CS8qIG11c3QgYmUgVFhQMSAqLworCXVuc2lnbmVkCXR4X3JweG0gIDoyIDsJLyogYnl0ZSBvZmZzZXQgKi8KKwl1bnNpZ25lZAl0eF94ZG9uZSA6MSA7CS8qIGdpdmUgdXAgdG9rZW4gKi8KKwl1bnNpZ25lZAl0eF9uZmNzICA6MSA7CS8qIG5vIGZyYW1lIGNoZWNrIHNlcXVlbmNlICovCisJdW5zaWduZWQJdHhfeG10YWJ0OjEgOwkvKiB0cmFuc21pdCBhYm9ydCAqLworCXVuc2lnbmVkCXR4X3JlcwkgOjggOwkvKiByZXNlcnZlZCAJIChiaXQgMTYuLjIzKSAqLworCXVuc2lnbmVkCXR4X2xlbmd0aDoxNiA7CS8qIGZyYW1lIGxlbmd0aCBsb3dlci91cHBlciBieXRlICovCisjZW5kaWYKKwl9IHQgOworCWxvbmcJaSA7Cit9IDsKKworLyogZGVmaW5lcyBmb3IgVHJhbnNtaXQgRGVzY3JpcHRvciBhY2Nlc3MgKi8KKyNkZWZpbmUJVERfQ19NT1JFCTB4ODAwMDAwMDBMCS8qIG1vcmUgZnJhbWUgaW4gY2hhaW4gKi8KKyNkZWZpbmUJVERfQ19ERVNDUgkweDYwMDAwMDAwTAkvKiBtdXN0IGJlIFRYUDEgKi8KKyNkZWZpbmUJVERfQ19UWEZCQgkweDE4MDAwMDAwTAkvKiBieXRlIG9mZnNldCAqLworI2RlZmluZQlURF9DX1hET05FCTB4MDQwMDAwMDBMCS8qIGdpdmUgdXAgdG9rZW4gKi8KKyNkZWZpbmUgVERfQ19ORkNTCTB4MDIwMDAwMDBMCS8qIG5vIGZyYW1lIGNoZWNrIHNlcXVlbmNlICovCisjZGVmaW5lIFREX0NfWE1UQUJUCTB4MDEwMDAwMDBMCS8qIHRyYW5zbWl0IGFib3J0ICovCisKKyNkZWZpbmUJVERfQ19MTkNOVQkweDAwMDBmZjAwTAkKKyNkZWZpbmUgVERfQ19MTkNOTAkweDAwMDAwMGZmTAorI2RlZmluZSBURF9DX0xOQ04JMHgwMDAwZmZmZkwJLyogZnJhbWUgbGVuZ3RoIGxvd2VyL3VwcGVyIGJ5dGUgKi8KKyAKKy8qCisgKiB0cmFuc21pdCBwb2ludGVyCisgKi8KK3VuaW9uIHR4X3BvaW50ZXIgeworCXN0cnVjdCB0IHsKKyNpZmRlZglMSVRUTEVfRU5ESUFOCisJdW5zaWduZWQJdHBfcG9pbnRlcjoxNiA7CS8qIHBvaW50ZXIgdG8gdHhfZGVzY3IgKGxvdy9oaWdoKSAqLworCXVuc2lnbmVkCXRwX3JlcwkgIDo4IDsJLyogcmVzZXJ2ZWQgCSAoYml0IDE2Li4yMykgKi8KKwl1bnNpZ25lZAl0cF9wYXR0ZXJuOjggOwkvKiBmaXhlZCBwYXR0ZXJuIChiaXQgMjQuLjMxKSAqLworI2Vsc2UKKwl1bnNpZ25lZAl0cF9wYXR0ZXJuOjggOwkvKiBmaXhlZCBwYXR0ZXJuIChiaXQgMjQuLjMxKSAqLworCXVuc2lnbmVkCXRwX3JlcwkgIDo4IDsJLyogcmVzZXJ2ZWQgCSAoYml0IDE2Li4yMykgKi8KKwl1bnNpZ25lZAl0cF9wb2ludGVyOjE2IDsJLyogcG9pbnRlciB0byB0eF9kZXNjciAobG93L2hpZ2gpICovCisjZW5kaWYKKwl9IHQgOworCWxvbmcJaSA7Cit9IDsKKworLyogZGVmaW5lcyBmb3IgTm9udGFnIE1vZGUgUG9pbnRlciBhY2Nlc3MgKi8KKyNkZWZpbmUJVERfUF9DTlRSTAkweGZmMDAwMDAwTAorI2RlZmluZSBURF9QX1JQWFUJMHgwMDAwZmYwMEwKKyNkZWZpbmUgVERfUF9SUFhMCTB4MDAwMDAwZmZMCisjZGVmaW5lIFREX1BfUlBYCTB4MDAwMGZmZmZMCisKKworI2RlZmluZSBUWF9QQVRURVJOCTB4YTAKKyNkZWZpbmUgVFhfUE9JTlRFUl9FTkQJMHhhMDAwMDAwMEwKKyNkZWZpbmUgVFhfSU5UX1BBVFRFUk4JMHhhMDAwMDAwMEwKKworc3RydWN0IHR4X3F1ZXVlIHsKKwlzdHJ1Y3QgdHhfcXVldWUgKnRxX25leHQgOworCXVfc2hvcnQgdHFfcGFja19vZmZzZXQgOwkvKiBvZmZzZXQgYnVmZmVyIG1lbW9yeSAqLworCXVfY2hhciAgdHFfcGFkWzJdIDsKK30gOworCisvKgorCWRlZmluZXMgZm9yIEZPUk1BQyBQbHVzIChBbTc5QzgzMCkKKyovCisKKy8qCisgKiAgRk9STUFDKyByZWFkL3dyaXRlIChyL3cpIHJlZ2lzdGVycworICovCisjZGVmaW5lIEZNX0NNRFJFRzEJMHgwMAkJLyogd3JpdGUgY29tbWFuZCByZWcgMSBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBGTV9DTURSRUcyCTB4MDEJCS8qIHdyaXRlIGNvbW1hbmQgcmVnIDIgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgRk1fU1QxVQkJMHgwMAkJLyogcmVhZCB1cHBlciAxNi1iaXQgb2Ygc3RhdHVzIHJlZyAxICovCisjZGVmaW5lIEZNX1NUMUwJCTB4MDEJCS8qIHJlYWQgbG93ZXIgMTYtYml0IG9mIHN0YXR1cyByZWcgMSAqLworI2RlZmluZSBGTV9TVDJVCQkweDAyCQkvKiByZWFkIHVwcGVyIDE2LWJpdCBvZiBzdGF0dXMgcmVnIDIgKi8KKyNkZWZpbmUgRk1fU1QyTAkJMHgwMwkJLyogcmVhZCBsb3dlciAxNi1iaXQgb2Ygc3RhdHVzIHJlZyAyICovCisjZGVmaW5lIEZNX0lNU0sxVQkweDA0CQkvKiByL3cgdXBwZXIgMTYtYml0IG9mIElNU0sgMSAqLworI2RlZmluZSBGTV9JTVNLMUwJMHgwNQkJLyogci93IGxvd2VyIDE2LWJpdCBvZiBJTVNLIDEgKi8KKyNkZWZpbmUgRk1fSU1TSzJVCTB4MDYJCS8qIHIvdyB1cHBlciAxNi1iaXQgb2YgSU1TSyAyICovCisjZGVmaW5lIEZNX0lNU0syTAkweDA3CQkvKiByL3cgbG93ZXIgMTYtYml0IG9mIElNU0sgMiAqLworI2RlZmluZSBGTV9TQUlECQkweDA4CQkvKiByL3cgc2hvcnQgYWRkci4taW5kaXZpZHVhbCAqLworI2RlZmluZSBGTV9MQUlNCQkweDA5CQkvKiByL3cgbG9uZyBhZGRyLi1pbmQuIChNU1cgb2YgTEFJRCkgKi8KKyNkZWZpbmUgRk1fTEFJQwkJMHgwYQkJLyogci93IGxvbmcgYWRkci4taW5kLiAobWlkZGxlKSovCisjZGVmaW5lIEZNX0xBSUwJCTB4MGIJCS8qIHIvdyBsb25nIGFkZHIuLWluZC4gKExTVykgKi8KKyNkZWZpbmUgRk1fU0FHUAkJMHgwYwkJLyogci93IHNob3J0IGFkZHJlc3MtZ3JvdXAgKi8KKyNkZWZpbmUgRk1fTEFHTQkJMHgwZAkJLyogci93IGxvbmcgYWRkci4tZ3IuIChNU1cgb2YgTEFHUCkgKi8KKyNkZWZpbmUgRk1fTEFHQwkJMHgwZQkJLyogci93IGxvbmcgYWRkci4tZ3IuIChtaWRkbGUpICovCisjZGVmaW5lIEZNX0xBR0wJCTB4MGYJCS8qIHIvdyBsb25nIGFkZHIuLWdyLiAoTFNXKSAqLworI2RlZmluZSBGTV9NRFJFRzEJMHgxMAkJLyogci93IDE2LWJpdCBtb2RlIHJlZyAxICovCisjZGVmaW5lIEZNX1NUTUNITgkweDExCQkvKiByZWFkIHN0YXRlLW1hY2hpbmUgcmVnICovCisjZGVmaW5lIEZNX01JUjEJCTB4MTIJCS8qIHJlYWQgdXBwZXIgMTYtYml0IG9mIE1BQyBJbmZvIFJlZyAqLworI2RlZmluZSBGTV9NSVIwCQkweDEzCQkvKiByZWFkIGxvd2VyIDE2LWJpdCBvZiBNQUMgSW5mbyBSZWcgKi8KKyNkZWZpbmUgRk1fVE1BWAkJMHgxNAkJLyogci93IDE2LWJpdCBUTUFYIHJlZyAqLworI2RlZmluZSBGTV9UVlgJCTB4MTUJCS8qIHdyaXRlIDgtYml0IFRWWCByZWcgd2l0aCBOUDctMAorCQkJCQkgICByZWFkIFRWWCBvbiBOUDctMCwgdGltZXIgb24gTlAxNS04Ki8KKyNkZWZpbmUgRk1fVFJUCQkweDE2CQkvKiByL3cgdXBwZXIgMTYtYml0IG9mIFRSVCB0aW1lciAqLworI2RlZmluZSBGTV9USFQJCTB4MTcJCS8qIHIvdyB1cHBlciAxNi1iaXQgb2YgVEhUIHRpbWVyICovCisjZGVmaW5lIEZNX1RORUcJCTB4MTgJCS8qIHJlYWQgdXBwZXIgMTYtYml0IG9mIFRORUcgKFRUUlQpICovCisjZGVmaW5lIEZNX1RNUlMJCTB4MTkJCS8qIHJlYWQgbG93ZXIgNS1iaXQgb2YgVE5FRyxUUlQsVEhUICovCisJCQkvKiBGIEUgRCBDICBCIEEgOSA4ICA3IDYgNSA0ICAzIDIgMSAwCisJCQkgICB4IHwtVE5FRzQtMHwgfC1UUlQ0LTAtfCB8LVRIVDQtMC18ICh4LWxhdGUgY291bnQpICovCisjZGVmaW5lIEZNX1RSRVEwCTB4MWEJCS8qIHIvdyAxNi1iaXQgVFJFUTAgcmVnIChMU1cgb2YgVFJUKSAqLworI2RlZmluZSBGTV9UUkVRMQkweDFiCQkvKiByL3cgMTYtYml0IFRSRVExIHJlZyAoTVNXIG9mIFRSVCkgKi8KKyNkZWZpbmUgRk1fUFJJMAkJMHgxYwkJLyogci93IHByaW9yaXR5IHIuIGZvciBhc3luLi1xdWV1ZSAwICovCisjZGVmaW5lIEZNX1BSSTEJCTB4MWQJCS8qIHIvdyBwcmlvcml0eSByLiBmb3IgYXN5bi4tcXVldWUgMSAqLworI2RlZmluZSBGTV9QUkkyCQkweDFlCQkvKiByL3cgcHJpb3JpdHkgci4gZm9yIGFzeW4uLXF1ZXVlIDIgKi8KKyNkZWZpbmUgRk1fVFNZTkMJMHgxZgkJLyogci93IDE2LWJpdCBvZiB0aGUgVFNZTkMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRk1fTURSRUcyCTB4MjAJCS8qIHIvdyAxNi1iaXQgbW9kZSByZWcgMiAqLworI2RlZmluZSBGTV9GUk1USFIJMHgyMQkJLyogci93IHRoZSBmcmFtZSB0aHJlc2hvbGQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRk1fRUFDQgkJMHgyMgkJLyogci93IGVuZCBhZGRyIG9mIGNsYWltL2JlYWNvbiBhcmVhICovCisjZGVmaW5lIEZNX0VBUlYJCTB4MjMJCS8qIHIvdyBlbmQgYWRkciBvZiByZWNlaXZlIHF1ZXVlICovCisvKiBTdXBlcm5ldCAzICovCisjZGVmaW5lCUZNX0VBUlYxCUZNX0VBUlYKKworI2RlZmluZSBGTV9FQVMJCTB4MjQJCS8qIHIvdyBlbmQgYWRkciBvZiBzeW5jaHIuIHF1ZXVlICovCisjZGVmaW5lIEZNX0VBQTAJCTB4MjUJCS8qIHIvdyBlbmQgYWRkciBvZiBhc3luLiBxdWV1ZSAwICovCisjZGVmaW5lIEZNX0VBQTEJCTB4MjYJCS8qIHIvdyBlbmQgYWRkciBvZiBhc3luLiBxdWV1ZSAxICovCisjZGVmaW5lIEZNX0VBQTIJCTB4MjcJCS8qIHIvdyBlbmQgYWRkciBvZiBhc3luLiBxdWV1ZSAyICovCisjZGVmaW5lIEZNX1NBQ0wJCTB4MjgJCS8qIHIvdyBzdGFydCBhZGRyIG9mIGNsYWltIGZyYW1lICovCisjZGVmaW5lIEZNX1NBQkMJCTB4MjkJCS8qIHIvdyBzdGFydCBhZGRyIG9mIGJlYWNvbiBmcmFtZSAqLworI2RlZmluZSBGTV9XUFhTRgkweDJhCQkvKiByL3cgdGhlIHdyaXRlIHB0ci4gZm9yIHNwZWNpYWwgZnIuKi8KKyNkZWZpbmUgRk1fUlBYU0YJMHgyYgkJLyogci93IHRoZSByZWFkIHB0ci4gZm9yIHNwZWNpYWwgZnIuICovCisjZGVmaW5lIEZNX1JQUgkJMHgyZAkJLyogci93IHRoZSByZWFkIHB0ci4gZm9yIHJlY2VpdmUgcXUuICovCisjZGVmaW5lIEZNX1dQUgkJMHgyZQkJLyogci93IHRoZSB3cml0ZSBwdHIuIGZvciByZWNlaXZlIHF1LiovCisjZGVmaW5lIEZNX1NXUFIJCTB4MmYJCS8qIHIvdyB0aGUgc2hhZG93IHdyLi1wdHIuIGZvciByZWMucS4qLworLyogU3VwZXJuZXQgMyAqLyAKKyNkZWZpbmUgRk1fUlBSMSAgICAgICAgIEZNX1JQUiAgIAorI2RlZmluZSBGTV9XUFIxICAgICAgICAgRk1fV1BSIAorI2RlZmluZSBGTV9TV1BSMSAgICAgICAgRk1fU1dQUgorCisjZGVmaW5lIEZNX1dQWFMJCTB4MzAJCS8qIHIvdyB0aGUgd3JpdGUgcHRyLiBmb3Igc3luY2hyLiBxdS4qLworI2RlZmluZSBGTV9XUFhBMAkweDMxCQkvKiByL3cgdGhlIHdyaXRlIHB0ci4gZm9yIGFzeW4uIHF1LjAgKi8KKyNkZWZpbmUgRk1fV1BYQTEJMHgzMgkJLyogci93IHRoZSB3cml0ZSBwdHIuIGZvciBhc3luLiBxdS4xICovCisjZGVmaW5lIEZNX1dQWEEyCTB4MzMJCS8qIHIvdyB0aGUgd3JpdGUgcHRyLiBmb3IgYXN5bi4gcXUuMiAqLworI2RlZmluZSBGTV9TV1BYUwkweDM0CQkvKiByL3cgdGhlIHNoYWRvdyB3ci4tcHRyLiBmb3Igc3luLnEuKi8KKyNkZWZpbmUgRk1fU1dQWEEwCTB4MzUJCS8qIHIvdyB0aGUgc2hhZC4gd3IuLXB0ci4gZm9yIGFzeW4ucTAqLworI2RlZmluZSBGTV9TV1BYQTEJMHgzNgkJLyogci93IHRoZSBzaGFkLiB3ci4tcHRyLiBmb3IgYXN5bi5xMSovCisjZGVmaW5lIEZNX1NXUFhBMgkweDM3CQkvKiByL3cgdGhlIHNoYWQuIHdyLi1wdHIuIGZvciBhc3luLnEyKi8KKyNkZWZpbmUgRk1fUlBYUwkJMHgzOAkJLyogci93IHRoZSByZWFkIHB0ci4gZm9yIHN5bmNoci4gcXUuICovCisjZGVmaW5lIEZNX1JQWEEwCTB4MzkJCS8qIHIvdyB0aGUgcmVhZCBwdHIuIGZvciBhc3luLiBxdS4gMCAqLworI2RlZmluZSBGTV9SUFhBMQkweDNhCQkvKiByL3cgdGhlIHJlYWQgcHRyLiBmb3IgYXN5bi4gcXUuIDEgKi8KKyNkZWZpbmUgRk1fUlBYQTIJMHgzYgkJLyogci93IHRoZSByZWFkIHB0ci4gZm9yIGFzeW4uIHF1LiAyICovCisjZGVmaW5lIEZNX01BUlIJCTB4M2MJCS8qIHIvdyB0aGUgbWVtb3J5IHJlYWQgYWRkciByZWdpc3RlciAqLworI2RlZmluZSBGTV9NQVJXCQkweDNkCQkvKiByL3cgdGhlIG1lbW9yeSB3cml0ZSBhZGRyIHJlZ2lzdGVyKi8KKyNkZWZpbmUgRk1fTURSVQkJMHgzZQkJLyogci93IHVwcGVyIDE2LWJpdCBvZiBtZW0uIGRhdGEgcmVnICovCisjZGVmaW5lIEZNX01EUkwJCTB4M2YJCS8qIHIvdyBsb3dlciAxNi1iaXQgb2YgbWVtLiBkYXRhIHJlZyAqLworCisvKiBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHJlbGF0ZSB0byBNQUMgY291bnRlcnMgYW5kIHRpbWVyICovCisjZGVmaW5lIEZNX1RNU1lOQwkweDQwCQkvKiByL3cgdXBwZXIgMTYgYml0cyBvZiBUTVNZTkMgdGltZXIgKi8KKyNkZWZpbmUgRk1fRkNOVFIJMHg0MQkJLyogci93IHRoZSAxNi1iaXQgZnJhbWUgY291bnRlciAqLworI2RlZmluZSBGTV9MQ05UUgkweDQyCQkvKiByL3cgdGhlIDE2LWJpdCBsb3N0IGNvdW50ZXIgKi8KKyNkZWZpbmUgRk1fRUNOVFIJMHg0MwkJLyogci93IHRoZSAxNi1iaXQgZXJyb3IgY291bnRlciAqLworCisvKiBTdXBlcm5ldCAzOglleHRlbnNpb25zIHRvIG9sZCByZWdpc3RlciBibG9jayAqLworI2RlZmluZQlGTV9GU0NOVFIJMHg0NAkJLyogci8/IEZyYW1lIFN0cmlwIENvdW50ZXIgKi8KKyNkZWZpbmUJRk1fRlJTRUxSRUcJMHg0NQkJLyogci93IEZyYW1lIFNlbGVjdGlvbiBSZWdpc3RlciAqLworCisvKiBTdXBlcm5ldCAzOglleHRlbnNpb25zIGZvciAyLiByZWNlaXZlIHF1ZXVlIGV0Yy4gKi8KKyNkZWZpbmUJRk1fTURSRUczCTB4NjAJCS8qIHIvdyBNb2RlIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUJRk1fU1QzVQkJMHg2MQkJLyogcmVhZCB1cHBlciAxNi1iaXQgb2Ygc3RhdHVzIHJlZyAzICovCisjZGVmaW5lCUZNX1NUM0wJCTB4NjIJCS8qIHJlYWQgbG93ZXIgMTYtYml0IG9mIHN0YXR1cyByZWcgMyAqLworI2RlZmluZQlGTV9JTVNLM1UJMHg2MwkJLyogci93IHVwcGVyIDE2LWJpdCBvZiBJTVNLIHJlZyAzICovCisjZGVmaW5lCUZNX0lNU0szTAkweDY0CQkvKiByL3cgbG93ZXIgMTYtYml0IG9mIElNU0sgcmVnIDMgKi8KKyNkZWZpbmUJRk1fSVZSCQkweDY1CQkvKiByZWFkIEludGVycnVwdCBWZWN0b3IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJRk1fSU1SCQkweDY2CQkvKiByL3cgSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKy8qIDB4NjcJSGlkZGVuICovCisjZGVmaW5lCUZNX1JQUjIJCTB4NjgJCS8qIHIvdyB0aGUgcmVhZCBwdHIuIGZvciByZWMuIHF1LiAyICovCisjZGVmaW5lCUZNX1dQUjIJCTB4NjkJCS8qIHIvdyB0aGUgd3JpdGUgcHRyLiBmb3IgcmVjLiBxdS4gMiAqLworI2RlZmluZQlGTV9TV1BSMgkweDZhCQkvKiByL3cgdGhlIHNoYWRvdyB3cHRyLiBmb3IgcmVjLiBxLiAyICovCisjZGVmaW5lCUZNX0VBUlYyCTB4NmIJCS8qIHIvdyBlbmQgYWRkciBvZiByZWMuIHF1LiAyICovCisjZGVmaW5lCUZNX1VOTENLRExZCTB4NmMJCS8qIHIvdyBBdXRvIFVubG9jayBEZWxheSByZWdpc3RlciAqLworCQkJCQkvKiBCaXQgMTUtODogUkVDVjIgdW5sb2NrIHRocmVzaG9sZCAqLworCQkJCQkvKiBCaXQgIDctMDogUkVDVjEgdW5sb2NrIHRocmVzaG9sZCAqLworLyogMHg2Zi0weDczCUhpZGRlbiAqLworI2RlZmluZQlGTV9MVERQQTEJMHg3OQkJLyogci93IExhc3QgVHJhbnMgZGVzYyBwdHIgZm9yIEExIHF1LiAqLworLyogMHg4MC0weDlhCVBMQ1MgcmVnaXN0ZXJzIG9mIGJ1aWx0LWluIFBMQ1MgIChTdXBlcm5ldCAzIG9ubHkpICovCisKKy8qIFN1cGVybmV0IDM6IEFkZGVyc3MgRmlsdGVyIFJlZ2lzdGVycyAqLworI2RlZmluZQlGTV9BRkNNRAkweGIwCQkvKiByL3cgQWRkcmVzcyBGaWx0ZXIgQ29tbWFuZCBSZWcgKi8KKyNkZWZpbmUJRk1fQUZTVEFUCTB4YjIJCS8qIHIvdyBBZGRyZXNzIEZpbHRlciBTdGF0dXMgUmVnICovCisjZGVmaW5lCUZNX0FGQklTVAkweGI0CQkvKiByL3cgQWRkcmVzcyBGaWx0ZXIgQklTVCBzaWduYXR1cmUgKi8KKyNkZWZpbmUJRk1fQUZDT01QMgkweGI2CQkvKiByL3cgQWRkcmVzcyBGaWx0ZXIgQ29tcGFyYW5kIDIgKi8KKyNkZWZpbmUJRk1fQUZDT01QMQkweGI4CQkvKiByL3cgQWRkcmVzcyBGaWx0ZXIgQ29tcGFyYW5kIDEgKi8KKyNkZWZpbmUJRk1fQUZDT01QMAkweGJhCQkvKiByL3cgQWRkcmVzcyBGaWx0ZXIgQ29tcGFyYW5kIDAgKi8KKyNkZWZpbmUJRk1fQUZNQVNLMgkweGJjCQkvKiByL3cgQWRkcmVzcyBGaWx0ZXIgTWFzayAyICovCisjZGVmaW5lCUZNX0FGTUFTSzEJMHhiZQkJLyogci93IEFkZHJlc3MgRmlsdGVyIE1hc2sgMSAqLworI2RlZmluZQlGTV9BRk1BU0swCTB4YzAJCS8qIHIvdyBBZGRyZXNzIEZpbHRlciBNYXNrIDAgKi8KKyNkZWZpbmUJRk1fQUZQRVJTCTB4YzIJCS8qIHIvdyBBZGRyZXNzIEZpbHRlciBQZXJzb25hbGl0eSBSZWcgKi8KKworLyogU3VwZXJuZXQgMzogT3Jpb24gKFBEWD8pIFJlZ2lzdGVycyAqLworI2RlZmluZQlGTV9PUkJJU1QJMHhkMAkJLyogci93IE9yaW9uIEJJU1Qgc2lnbmF0dXJlICovCisjZGVmaW5lCUZNX09SU1RBVAkweGQyCQkvKiByL3cgT3Jpb24gU3RhdHVzIFJlZ2lzdGVyICovCisKKworLyoKKyAqIE1vZGUgUmVnaXN0ZXIgMSAoTURSRUcxKQorICovCisjZGVmaW5lIEZNX1JFUzAJCTB4MDAwMQkJLyogcmVzZXJ2ZWQgKi8KKwkJCQkJLyogU04zOiBvdGhlciBkZWZpbml0aW9uICovCisjZGVmaW5lCUZNX1hNVElOSF9IT0xECTB4MDAwMgkJLyogdHJhbnNtaXQtaW5oaWJpdC9ob2xkIGJpdCAqLworCQkJCQkvKiBTTjM6IG90aGVyIGRlZmluaXRpb24gKi8KKyNkZWZpbmUJRk1fSE9GTFhJCTB4MDAwMwkJLyogU04zOiBIb2xkIC8gRmx1c2ggLyBJbmhpYml0ICovCisjZGVmaW5lCUZNX0ZVTExfSEFMRgkweDAwMDQJCS8qIGZ1bGwtZHVwbGV4L2hhbGYtZHVwbGV4IGJpdCAqLworI2RlZmluZQlGTV9MT0NLVFgJMHgwMDA4CQkvKiBsb2NrLXRyYW5zbWl0LWFzeW5jaHIuLXF1ZXVlcyBiaXQgKi8KKyNkZWZpbmUgRk1fRVhHUEEwCTB4MDAxMAkJLyogZXh0ZW5kZWQtZ3JvdXAtYWRkcmVzc2luZyBiaXQgMCAqLworI2RlZmluZSBGTV9FWEdQQTEJMHgwMDIwCQkvKiBleHRlbmRlZC1ncm91cC1hZGRyZXNzaW5nIGJpdCAxICovCisjZGVmaW5lIEZNX0RJU0NSWQkweDAwNDAJCS8qIGRpc2FibGUtY2FycnkgYml0ICovCisJCQkJCS8qIFNOMzogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fU0VMUkEJMHgwMDgwCQkvKiBzZWxlY3QgaW5wdXQgZnJvbSBQSFkgKDE9UkEsMD1SQikgKi8KKworI2RlZmluZSBGTV9BRERFVAkweDA3MDAJCS8qIGFkZHJlc3MgZGV0ZWN0aW9uICovCisjZGVmaW5lIEZNX01EQU1BCSgwPDw4KQkJLyogYWRkcmVzcyBkZXRlY3Rpb24gOiBEQSA9IE1BICovCisjZGVmaW5lIEZNX01EQVNBTUEJKDE8PDgpCQkvKiBhZGRyZXNzIGRldGVjdGlvbiA6IERBPU1BfHxTQT1NQSAqLworI2RlZmluZQlGTV9NUk5OU0FGTk1BCSgyPDw4KQkJLyogcmVjLiBub24tTlNBIGZyYW1lcyBEQT1NQSYmU0EhPU1BICovCisjZGVmaW5lCUZNX01STk5TQUYJKDM8PDgpCQkvKiByZWMuIG5vbi1OU0EgZnJhbWVzIERBID0gTUEgKi8KKyNkZWZpbmUJRk1fTURJU1JDVgkoNDw8OCkJCS8qIGRpc2FibGUgcmVjZWl2ZSBmdW5jdGlvbiAqLworI2RlZmluZQlGTV9NUkVTMAkoNTw8OCkJCS8qIHJlc2VydmUgKi8KKyNkZWZpbmUJRk1fTUxJTVBST00JKDY8PDgpCQkvKiBsaW1pdGVkLXByb21pc2N1b3VzIG1vZGUgKi8KKyNkZWZpbmUgRk1fTVBST01JU0NPVVMJKDc8PDgpCQkvKiBhZGRyZXNzIGRldGVjdGlvbiA6IHByb21pc2NvdXMgKi8KKworI2RlZmluZSBGTV9TRUxTQQkweDA4MDAJCS8qIHNlbGVjdC1zaG9ydC1hZGRyZXNzIGJpdCAqLworCisjZGVmaW5lIEZNX01NT0RFCTB4NzAwMAkJLyogbW9kZSBzZWxlY3QgKi8KKyNkZWZpbmUgRk1fTUlOSVQJKDA8PDEyKQkJLyogaW5pdGlhbGl6ZSAqLworI2RlZmluZSBGTV9NTUVNQUNUCSgxPDwxMikJCS8qIG1lbW9yeSBhY3RpdmF0ZSAqLworI2RlZmluZSBGTV9NT05MSU5FU1AJKDI8PDEyKQkJLyogb24tbGluZSBzcGVjaWFsICovCisjZGVmaW5lIEZNX01PTkxJTkUJKDM8PDEyKQkJLyogb24tbGluZSAoRkRESSBvcGVyYXRpb25hbCBtb2RlKSAqLworI2RlZmluZSBGTV9NSUxPT1AJKDQ8PDEyKQkJLyogaW50ZXJuYWwgbG9vcGJhY2sgKi8KKyNkZWZpbmUgRk1fTVJFUzEJKDU8PDEyKQkJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fTVJFUzIJKDY8PDEyKQkJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fTUVMT09QCSg3PDwxMikJCS8qIGV4dGVybmFsIGxvb3BiYWNrICovCisKKyNkZWZpbmUJRk1fU05HTEZSTQkweDgwMDAJCS8qIHNpbmdsZS1mcmFtZS1yZWNlaXZlIG1vZGUgKi8KKwkJCQkJLyogU04zOiByZXNlcnZlZCAqLworCisjZGVmaW5lCU1EUjFJTklUCShGTV9NSU5JVCB8IEZNX01EQU1BKQorCisvKgorICogTW9kZSBSZWdpc3RlciAyIChNRFJFRzIpCisgKi8KKyNkZWZpbmUJRk1fQUZVTEwJMHgwMDBmCQkvKiA0LWJpdCB2YWx1ZSAoZW1wdHkgbG9jLmluIHR4cXVldWUpKi8KKyNkZWZpbmUJRk1fUkNWRVJSCTB4MDAxMAkJLyogcmVjLi1lcnJvcmVkLWZyYW1lcyBiaXQgKi8KKyNkZWZpbmUJRk1fU1lNQ1RMCTB4MDAyMAkJLyogc3lzbWJvbC1jb250cm9sIGJpdCAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lCUZNX1NZTlBSUQkweDAwNDAJCS8qIHN5bmNocm9uLi1OUC1ETUEtcmVxdWVzdCBiaXQgKi8KKyNkZWZpbmUJRk1fRU5OUFJRCTB4MDA4MAkJLyogZW5hYmxlLU5QLURNQS1yZXF1ZXN0IGJpdCAqLworI2RlZmluZQlGTV9FTkhTUlEJMHgwMTAwCQkvKiBlbmFibGUtaG9zdC1yZXF1ZXN0IGJpdCAqLworI2RlZmluZQlGTV9SWEZCQjAxCTB4MDYwMAkJLyogcmVjLiBmcmFtZSBieXRlIGJvdW5kYXJ5IGJpdDAgJiAxICovCisjZGVmaW5lCUZNX0xTQgkJMHgwODAwCQkvKiBkZXRlcm0uIG9yZGVyaW5nIG9mIGJ5dGVzIGluIGJ1ZmZlciovCisjZGVmaW5lCUZNX1BBUklUWQkweDEwMDAJCS8qIDEgPSBldmVuLCAwID0gb2RkICovCisjZGVmaW5lCUZNX0NIS1BBUgkweDIwMDAJCS8qIDEgPSBwYXJpdHkgb2YgMzItYml0IGJ1ZmZlciBCRC1idXMqLworI2RlZmluZQlGTV9TVFJQRkNTCTB4NDAwMAkJLyogMSA9IHN0cmlwcyBGQ1MgZmllbGQgb2YgcmVjLmZyYW1lICovCisjZGVmaW5lCUZNX0JNTU9ERQkweDgwMDAJCS8qIEJ1ZmZlci1NZW1vcnktTW9kZSAoMSA9IHRhZyBtb2RlKSAqLworCQkJCQkvKiBTTjM6IDEgPSB0YWcsIDAgPSBtb2RpZmllZCB0YWcgKi8KKworLyoKKyAqIFN0YXR1cyBSZWdpc3RlciAxLCBVcHBlciAxNiBCaXRzIChTVDFVKQorICovCisjZGVmaW5lIEZNX1NURUZSTVMJMHgwMDAxCQkvKiB0cmFuc21pdCBlbmQgb2YgZnJhbWU6IHN5bmNoci4gcXUuKi8KKyNkZWZpbmUgRk1fU1RFRlJNQTAJMHgwMDAyCQkvKiB0cmFuc21pdCBlbmQgb2YgZnJhbWU6IGFzeW4uIHF1LjAgKi8KKyNkZWZpbmUgRk1fU1RFRlJNQTEJMHgwMDA0CQkvKiB0cmFuc21pdCBlbmQgb2YgZnJhbWU6IGFzeW4uIHF1LjEgKi8KKyNkZWZpbmUgRk1fU1RFRlJNQTIJMHgwMDA4CQkvKiB0cmFuc21pdCBlbmQgb2YgZnJhbWU6IGFzeW4uIHF1LjIgKi8KKwkJCQkJLyogU04zOiByZXNlcnZlZCAqLworI2RlZmluZSBGTV9TVEVDRlJNUwkweDAwMTAJCS8qIHRyYW5zbWl0IGVuZCBvZiBjaGFpbiBvZiBzeW4uIHF1LiAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NURUNGUk1BMAkweDAwMjAJCS8qIHRyYW5zbWl0IGVuZCBvZiBjaGFpbiBvZiBhc3luLiBxMCAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NURUNGUk1BMQkweDAwNDAJCS8qIHRyYW5zbWl0IGVuZCBvZiBjaGFpbiBvZiBhc3luLiBxMSAqLworCQkJCQkvKiBTTjM6IFNURUNNREExICovCisjZGVmaW5lIEZNX1NURUNNREExCTB4MDA0MAkJLyogU04zOiAnbm8gZGVzY3JpcHRpb24nICovCisjZGVmaW5lIEZNX1NURUNGUk1BMgkweDAwODAJCS8qIHRyYW5zbWl0IGVuZCBvZiBjaGFpbiBvZiBhc3luLiBxMiAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lCUZNX1NURVhET05TCTB4MDEwMAkJLyogdHJhbnNtaXQgdW50aWwgWERPTkUgaW4gc3luLiBxdS4gKi8KKyNkZWZpbmUJRk1fU1RCRkxBCTB4MDIwMAkJLyogYXN5bmNoci4tcXVldWUgdHJhbnMuIGJ1ZmZlciBmdWxsICovCisjZGVmaW5lCUZNX1NUQkZMUwkweDA0MDAJCS8qIHN5bmNoci4tcXVldWUgdHJhbnNtLiBidWZmZXIgZnVsbCAqLworI2RlZmluZQlGTV9TVFhBQlJTCTB4MDgwMAkJLyogc3luY2hyLiBxdWV1ZSB0cmFuc21pdC1hYm9ydCAqLworI2RlZmluZQlGTV9TVFhBQlJBMAkweDEwMDAJCS8qIGFzeW5jaHIuIHF1ZXVlIDAgdHJhbnNtaXQtYWJvcnQgKi8KKyNkZWZpbmUJRk1fU1RYQUJSQTEJMHgyMDAwCQkvKiBhc3luY2hyLiBxdWV1ZSAxIHRyYW5zbWl0LWFib3J0ICovCisjZGVmaW5lCUZNX1NUWEFCUkEyCTB4NDAwMAkJLyogYXN5bmNoci4gcXVldWUgMiB0cmFuc21pdC1hYm9ydCAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lCUZNX1NYTVRBQlQJMHg4MDAwCQkvKiB0cmFuc21pdCBhYm9ydCAqLworCisvKgorICogU3RhdHVzIFJlZ2lzdGVyIDEsIExvd2VyIDE2IEJpdHMgKFNUMUwpCisgKi8KKyNkZWZpbmUgRk1fU1FMQ0tTCTB4MDAwMQkJLyogcXVldWUgbG9jayBmb3Igc3luY2hyLiBxdWV1ZSAqLworI2RlZmluZSBGTV9TUUxDS0EwCTB4MDAwMgkJLyogcXVldWUgbG9jayBmb3IgYXN5bmNoci4gcXVldWUgMCAqLworI2RlZmluZSBGTV9TUUxDS0ExCTB4MDAwNAkJLyogcXVldWUgbG9jayBmb3IgYXN5bmNoci4gcXVldWUgMSAqLworI2RlZmluZSBGTV9TUUxDS0EyCTB4MDAwOAkJLyogcXVldWUgbG9jayBmb3IgYXN5bmNoci4gcXVldWUgMiAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NUWElORkxTCTB4MDAxMAkJLyogdHJhbnNtaXQgaW5zdHJ1Y3Rpb24gZnVsbDogc3luLiAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NUWElORkxBMAkweDAwMjAJCS8qIHRyYW5zbWl0IGluc3RydWN0aW9uIGZ1bGw6IGFzeW4uMCAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NUWElORkxBMQkweDAwNDAJCS8qIHRyYW5zbWl0IGluc3RydWN0aW9uIGZ1bGw6IGFzeW4uMSAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NUWElORkxBMgkweDAwODAJCS8qIHRyYW5zbWl0IGluc3RydWN0aW9uIGZ1bGw6IGFzeW4uMiAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NQQ0VQRFMJMHgwMTAwCQkvKiBwYXJpdHkvY29kaW5nIGVycm9yOiBzeW4uIHF1ZXVlICovCisjZGVmaW5lIEZNX1NQQ0VQREEwCTB4MDIwMAkJLyogcGFyaXR5L2NvZGluZyBlcnJvcjogYXN5bi4gcXVldWUwICovCisjZGVmaW5lIEZNX1NQQ0VQREExCTB4MDQwMAkJLyogcGFyaXR5L2NvZGluZyBlcnJvcjogYXN5bi4gcXVldWUxICovCisjZGVmaW5lIEZNX1NQQ0VQREEyCTB4MDgwMAkJLyogcGFyaXR5L2NvZGluZyBlcnJvcjogYXN5bi4gcXVldWUyICovCisJCQkJCS8qIFNOMzogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fU1RCVVJTCTB4MTAwMAkJLyogdHJhbnNtaXQgYnVmZmVyIHVuZGVycnVuOiBzeW4uIHEuICovCisjZGVmaW5lIEZNX1NUQlVSQTAJMHgyMDAwCQkvKiB0cmFuc21pdCBidWZmZXIgdW5kZXJydW46IGFzeW4uMCAqLworI2RlZmluZSBGTV9TVEJVUkExCTB4NDAwMAkJLyogdHJhbnNtaXQgYnVmZmVyIHVuZGVycnVuOiBhc3luLjEgKi8KKyNkZWZpbmUgRk1fU1RCVVJBMgkweDgwMDAJCS8qIHRyYW5zbWl0IGJ1ZmZlciB1bmRlcnJ1bjogYXN5bi4yICovCisJCQkJCS8qIFNOMzogcmVzZXJ2ZWQgKi8KKworLyoKKyAqIFN0YXR1cyBSZWdpc3RlciAyLCBVcHBlciAxNiBCaXRzIChTVDJVKQorICovCisjZGVmaW5lIEZNX1NPVFJCRUMJMHgwMDAxCQkvKiBvdGhlciBiZWFjb24gcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRk1fU01ZQkVDCTB4MDAwMgkJLyogbXkgYmVhY29uIHJlY2VpdmVkICovCisjZGVmaW5lIEZNX1NCRUMJCTB4MDAwNAkJLyogYmVhY29uIHN0YXRlIGVudGVyZWQgKi8KKyNkZWZpbmUgRk1fU0xPQ0xNCTB4MDAwOAkJLyogbG93IGNsYWltIHJlY2VpdmVkICovCisjZGVmaW5lIEZNX1NISUNMTQkweDAwMTAJCS8qIGhpZ2ggY2xhaW0gcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRk1fU01ZQ0xNCTB4MDAyMAkJLyogbXkgY2xhaW0gcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRk1fU0NMTQkJMHgwMDQwCQkvKiBjbGFpbSBzdGF0ZSBlbnRlcmVkICovCisjZGVmaW5lIEZNX1NFUlJTRgkweDAwODAJCS8qIGVycm9yIGluIHNwZWNpYWwgZnJhbWUgKi8KKyNkZWZpbmUgRk1fU05GU0xECTB4MDEwMAkJLyogTlAgYW5kIEZPUk1BQysgc2ltdWx0YW5lb3VzIGxvYWQgKi8KKyNkZWZpbmUgRk1fU1JGUkNUT1YJMHgwMjAwCQkvKiByZWNlaXZlIGZyYW1lIGNvdW50ZXIgb3ZlcmZsb3cgKi8KKwkJCQkJLyogU04zOiByZXNlcnZlZCAqLworI2RlZmluZSBGTV9TUkNWRlJNCTB4MDQwMAkJLyogcmVjZWl2ZSBmcmFtZSAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NSQ1ZPVlIJMHgwODAwCQkvKiByZWNlaXZlIEZJRk8gb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRk1fU1JCRkwJMHgxMDAwCQkvKiByZWNlaXZlIGJ1ZmZlciBmdWxsICovCisjZGVmaW5lIEZNX1NSQUJUCTB4MjAwMAkJLyogcmVjZWl2ZSBhYm9ydCAqLworI2RlZmluZSBGTV9TUkJNVAkweDQwMDAJCS8qIHJlY2VpdmUgYnVmZmVyIGVtcHR5ICovCisjZGVmaW5lIEZNX1NSQ09NUAkweDgwMDAJCS8qIHJlY2VpdmUgY29tcGxldGUuIE5vbnRhZyBtb2RlICovCisKKy8qCisgKiBTdGF0dXMgUmVnaXN0ZXIgMiwgTG93ZXIgMTYgQml0cyAoU1QyTCkKKyAqIEF0dGVudGlvbjogU04zIGRvY3Ugc2hvd3MgdGhlc2UgYml0cyB0aGUgb3RoZXIgd2F5IGFyb3VuZAorICovCisjZGVmaW5lIEZNX1NSRVMwCTB4MDAwMQkJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fU0VTVFJJUFRLCTB4MDAwMQkJLyogU04zOiAnbm8gZGVzY3JpcHRpb24nICovCisjZGVmaW5lIEZNX1NUUlRFWFIJMHgwMDAyCQkvKiBUUlQgZXhwaXJlZCBpbiBjbGFpbSB8IGJlYWNvbiBzdC4gKi8KKyNkZWZpbmUgRk1fU0RVUENMTQkweDAwMDQJCS8qIGR1cGxpY2F0ZSBjbGFpbSByZWNlaXZlZCAqLworI2RlZmluZSBGTV9TU0lGRwkweDAwMDgJCS8qIHNob3J0IGludGVyZnJhbWUgZ2FwICovCisjZGVmaW5lIEZNX1NGUk1DVFIJMHgwMDEwCQkvKiBmcmFtZSBjb3VudGVyIG92ZXJmbG93ICovCisjZGVmaW5lIEZNX1NFUlJDVFIJMHgwMDIwCQkvKiBlcnJvciBjb3VudGVyIG92ZXJmbG93ICovCisjZGVmaW5lIEZNX1NMU1RDVFIJMHgwMDQwCQkvKiBsb3N0IGNvdW50ZXIgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRk1fU1BISU5WCTB4MDA4MAkJLyogUEhZIGludmFsaWQgKi8KKyNkZWZpbmUgRk1fU0FERVQJMHgwMTAwCQkvKiBhZGRyZXNzIGRldGVjdCAqLworI2RlZmluZSBGTV9TTUlTRlJNCTB4MDIwMAkJLyogbWlzc2VkIGZyYW1lICovCisjZGVmaW5lIEZNX1NUUlRFWFAJMHgwNDAwCQkvKiBUUlQgZXhwaXJlZCBhbmQgbGF0ZSBjb3VudCA+IDAgKi8KKyNkZWZpbmUgRk1fU1RWWEVYUAkweDA4MDAJCS8qIFRWWCBleHBpcmVkICovCisjZGVmaW5lIEZNX1NUS0lTUwkweDEwMDAJCS8qIHRva2VuIGlzc3VlZCAqLworI2RlZmluZSBGTV9TVEtFUlIJMHgyMDAwCQkvKiB0b2tlbiBlcnJvciAqLworI2RlZmluZSBGTV9TTVVMVERBCTB4NDAwMAkJLyogbXVsdGlwbGUgZGVzdGluYXRpb24gYWRkcmVzcyAqLworI2RlZmluZSBGTV9TUk5HT1AJMHg4MDAwCQkvKiByaW5nIG9wZXJhdGlvbmFsICovCisKKy8qCisgKiBTdXBlcm5ldCAzOgorICogU3RhdHVzIFJlZ2lzdGVyIDMsIFVwcGVyIDE2IEJpdHMgKFNUM1UpCisgKi8KKyNkZWZpbmUJRk1fU1JRVU5MQ0sxCTB4MDAwMQkJLyogcmVjZWl2ZSBxdWV1ZSB1bmxvY2tlZCBxdWV1ZSAxICovCisjZGVmaW5lCUZNX1NSUVVOTENLMgkweDAwMDIJCS8qIHJlY2VpdmUgcXVldWUgdW5sb2NrZWQgcXVldWUgMiAqLworI2RlZmluZQlGTV9TUlBFUlJRMQkweDAwMDQJCS8qIHJlY2VpdmUgcGFyaXR5IGVycm9yIHJ4IHF1ZXVlIDEgKi8KKyNkZWZpbmUJRk1fU1JQRVJSUTIJMHgwMDA4CQkvKiByZWNlaXZlIHBhcml0eSBlcnJvciByeCBxdWV1ZSAyICovCisJCQkJCS8qIEJpdCA0LTEwOiByZXNlcnZlZCAqLworI2RlZmluZQlGTV9TUkNWT1ZSMgkweDA4MDAJCS8qIHJlY2VpdmUgRklGTyBvdmVyZnVsbCByeCBxdWV1ZSAyICovCisjZGVmaW5lCUZNX1NSQkZMMgkweDEwMDAJCS8qIHJlY2VpdmUgYnVmZmVyIGZ1bGwgcnggcXVldWUgMiAqLworI2RlZmluZQlGTV9TUkFCVDIJMHgyMDAwCQkvKiByZWNlaXZlIGFib3J0IHJ4IHF1ZXVlIDIgKi8KKyNkZWZpbmUJRk1fU1JCTVQyCTB4NDAwMAkJLyogcmVjZWl2ZSBidWYgZW1wdHkgcnggcXVldWUgMiAqLworI2RlZmluZQlGTV9TUkNPTVAyCTB4ODAwMAkJLyogcmVjZWl2ZSBjb21wIHJ4IHF1ZXVlIDIgKi8KKworLyoKKyAqIFN1cGVybmV0IDM6CisgKiBTdGF0dXMgUmVnaXN0ZXIgMywgTG93ZXIgMTYgQml0cyAoU1QzTCkKKyAqLworI2RlZmluZQlGTV9BRl9CSVNUX0RPTkUJCTB4MDAwMQkvKiBBZGRyZXNzIEZpbHRlciBCSVNUIGlzIGRvbmUgKi8KKyNkZWZpbmUJRk1fUExDX0JJU1RfRE9ORQkweDAwMDIJLyogaW50ZXJuYWwgUExDIEJpc3QgaXMgZG9uZSAqLworI2RlZmluZQlGTV9QRFhfQklTVF9ET05FCTB4MDAwNAkvKiBQRFggQklTVCBpcyBkb25lICovCisJCQkJCS8qIEJpdCAgMzogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUJRk1fU0lDQU1EQU1BVAkJMHgwMDEwCS8qIFN0YXR1cyBpbnRlcm5hbCBDQU0gREEgbWF0Y2ggKi8KKyNkZWZpbmUJRk1fU0lDQU1EQVhBQ1QJCTB4MDAyMAkvKiBTdGF0dXMgaW50ZXJuYWwgQ0FNIERBIGV4YWN0IG1hdGNoICovCisjZGVmaW5lCUZNX1NJQ0FNU0FNQVQJCTB4MDA0MAkvKiBTdGF0dXMgaW50ZXJuYWwgQ0FNIFNBIG1hdGNoICovCisjZGVmaW5lCUZNX1NJQ0FNU0FYQUNUCQkweDAwODAJLyogU3RhdHVzIGludGVybmFsIENBTSBTQSBleGFjdCBtYXRjaCAqLworCisvKgorICogTUFDIFN0YXRlLU1hY2hpbmUgUmVnaXN0ZXIgRk1fU1RNQ0hOCisgKi8KKyNkZWZpbmUJRk1fTURSVEFHCTB4MDAwNAkJLyogdGFnIGJpdCBvZiBsb25nIHdvcmQgcmVhZCAqLworI2RlZmluZQlGTV9TTlBQTkQJMHgwMDA4CQkvKiByL3cgZnJvbSBidWZmZXIgbWVtLiBpcyBwZW5kaW5nICovCisjZGVmaW5lCUZNX1RYU1RBVAkweDAwNzAJCS8qIHRyYW5zbWl0dGVyIHN0YXRlIG1hY2hpbmUgc3RhdGUgKi8KKyNkZWZpbmUJRk1fUkNTVEFUCTB4MDM4MAkJLyogcmVjZWl2ZXIgc3RhdGUgbWFjaGluZSBzdGF0ZSAqLworI2RlZmluZQlGTV9UTTAxCQkweDBjMDAJCS8qIGluZGljYXRlIHRva2VuIG1vZGUgKi8KKyNkZWZpbmUJRk1fU0lNCQkweDEwMDAJCS8qIGluZGljYXRlIHNlbmQgaW1tZWRpYXRlLW1vZGUgKi8KKyNkZWZpbmUJRk1fUkVWCQkweGUwMDAJCS8qIEZPUk1BQyBQbHVzIHJldmlzaW9uIG51bWJlciAqLworCisvKgorICogU3VwZXJuZXQgMworICogTW9kZSBSZWdpc3RlciAzCisgKi8KKyNkZWZpbmUJRk1fTUVOUlMJMHgwMDAxCQkvKiBFbmEgZW5oYW5jZWQgcmVjIHN0YXR1cyBlbmNvZGluZyAqLworI2RlZmluZQlGTV9NRU5YUwkweDAwMDIJCS8qIEVuYSBlbmhhbmNlZCB4bWl0IHN0YXR1cyBlbmNvZGluZyAqLworI2RlZmluZQlGTV9NRU5YQ1QJMHgwMDA0CQkvKiBFbmEgRVhBQ1QvSU5FWEFDVCBtYXRjaGluZyAqLworI2RlZmluZQlGTV9NRU5BRlVMTAkweDAwMDgJCS8qIEVuYSBlbmggUUNUUkwgZW5jb2RpbmcgZm9yIEFGVUxMICovCisjZGVmaW5lCUZNX01FSU5ECTB4MDAzMAkJLyogRW5hIGVuaCBBLEMgaW5kaWNhdG9yIHNldHRpbmdzICovCisjZGVmaW5lCUZNX01FTlFDVFJMCTB4MDA0MAkJLyogRW5hIGVuaCBRQ1RSTCBlbmNvZGluZyAqLworI2RlZmluZQlGTV9NRU5SUUFVTkxDSwkweDAwODAJCS8qIEVuYSByZWMgcSBhdXRvIHVubG9jayAqLworI2RlZmluZQlGTV9NRU5EQVMJMHgwMTAwCQkvKiBFbmEgREFTIGNvbm5lY3Rpb25zIGJ5IGNudHIgTVVYICovCisjZGVmaW5lCUZNX01FTlBMQ0NTVAkweDAyMDAJCS8qIEVuYSBDb3VudGVyIFNlZ20gdGVzdCBpbiBQTEMgYmxjayAqLworI2RlZmluZQlGTV9NRU5TR0xJTlQJMHgwNDAwCQkvKiBFbmEgVmVjdG9yZWQgSW50ZXJydXB0IHJlYWRpbmcgKi8KKyNkZWZpbmUJRk1fTUVORFJDVgkweDA4MDAJCS8qIEVuYSBkdWFsIHJlY2VpdmUgcXVldWUgb3BlcmF0aW9uICovCisjZGVmaW5lCUZNX01FTkZDTE9DCTB4MzAwMAkJLyogRW5hIEZDIGxvY2F0aW9uIHdpdGhpbiBmcm0gZGF0YSAqLworI2RlZmluZQlGTV9NRU5UUkNNRAkweDQwMDAJCS8qIEVuYSBBU1lOQzEgeG1pdCBvbmx5IGFmdGVyIGNvbW1hbmQgKi8KKyNkZWZpbmUJRk1fTUVOVERMUEJLCTB4ODAwMAkJLyogRW5hIFREQVQgdG8gUkRBVCBsa29vcGJhY2sgKi8KKworLyoKKyAqIFN1cGVybmV0IDMKKyAqIEZyYW1lIFNlbGVjdGlvbiBSZWdpc3RlcgorICovCisjZGVmaW5lCUZNX1JFQ1YxCTB4MDAwZgkJLyogb3B0aW9ucyBmb3IgcmVjZWl2ZSBxdWV1ZSAxICovCisjZGVmaW5lCUZNX1JDVjFfQUxMCSgwPDwwKQkJLyogcmVjZWl2ZSBhbGwgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjFfTExDCSgxPDwwKQkJLyogcmVjIGFsbCBMTEMgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjFfU01UCSgyPDwwKQkJLyogcmVjIGFsbCBTTVQgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjFfTlNNVAkoMzw8MCkJCS8qIHJlYyBub24tU01UIGZyYW1lcyAqLworI2RlZmluZQlGTV9SQ1YxX0lNUAkoNDw8MCkJCS8qIHJlYyBJbXBsZW1lbnRvciBmcmFtZXMgKi8KKyNkZWZpbmUJRk1fUkNWMV9NQUMJKDU8PDApCQkvKiByZWMgYWxsIE1BQyBmcmFtZXMgKi8KKyNkZWZpbmUJRk1fUkNWMV9TTExDCSg2PDwwKQkJLyogcmVjIGFsbCBzeW5jIExMQyBmcmFtZXMgKi8KKyNkZWZpbmUJRk1fUkNWMV9BTExDCSg3PDwwKQkJLyogcmVjIGFsbCBhc3luYyBMTEMgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjFfVk9JRAkoODw8MCkJCS8qIHJlYyBhbGwgdm9pZCBmcmFtZXMgKi8KKyNkZWZpbmUJRk1fUkNWMV9BTFNNVAkoOTw8MCkJCS8qIHJlYyBhbGwgYXN5bmMgTExDICYgU01UIGZyYW1lcyAqLworI2RlZmluZQlGTV9SRUNWMgkweDAwZjAJCS8qIG9wdGlvbnMgZm9yIHJlY2VpdmUgcXVldWUgMiAqLworI2RlZmluZQlGTV9SQ1YyX0FMTAkoMDw8NCkJCS8qIHJlY2VpdmUgYWxsIG90aGVyIGZyYW1lcyAqLworI2RlZmluZQlGTV9SQ1YyX0xMQwkoMTw8NCkJCS8qIHJlYyBhbGwgTExDIGZyYW1lcyAqLworI2RlZmluZQlGTV9SQ1YyX1NNVAkoMjw8NCkJCS8qIHJlYyBhbGwgU01UIGZyYW1lcyAqLworI2RlZmluZQlGTV9SQ1YyX05TTVQJKDM8PDQpCQkvKiByZWMgbm9uLVNNVCBmcmFtZXMgKi8KKyNkZWZpbmUJRk1fUkNWMl9JTVAJKDQ8PDQpCQkvKiByZWMgSW1wbGVtZW50b3IgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjJfTUFDCSg1PDw0KQkJLyogcmVjIGFsbCBNQUMgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjJfU0xMQwkoNjw8NCkJCS8qIHJlYyBhbGwgc3luYyBMTEMgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjJfQUxMQwkoNzw8NCkJCS8qIHJlYyBhbGwgYXN5bmMgTExDIGZyYW1lcyAqLworI2RlZmluZQlGTV9SQ1YyX1ZPSUQJKDg8PDQpCQkvKiByZWMgYWxsIHZvaWQgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjJfQUxTTVQJKDk8PDQpCQkvKiByZWMgYWxsIGFzeW5jIExMQyAmIFNNVCBmcmFtZXMgKi8KKyNkZWZpbmUJRk1fRU5YTVRBRFNXQVAJMHg0MDAwCQkvKiBlbmggcmVjIGFkZHIgc3dhcCAocGh5cyAtPiBjYW4pICovCisjZGVmaW5lCUZNX0VOUkNWQURTV0FQCTB4ODAwMAkJLyogZW5oIHR4IGFkZHIgc3dhcCAoY2FuIC0+IHBoeXMpICovCisKKy8qCisgKiBTdXBlcm5ldCAzOgorICogQWRkcmVzcyBGaWx0ZXIgQ29tbWFuZCBSZWdpc3RlciAoQUZDTUQpCisgKi8KKyNkZWZpbmUJRk1fSU5TVAkJMHgwMDA3CQkvKiBBZGRyZXNzIEZpbHRlciBPcGVyYXRpb24gKi8KKyNkZWZpbmUgRk1fSUlOVl9DQU0JKDA8PDApCQkvKiBJbnZhbGlkYXRlIENBTSAqLworI2RlZmluZSBGTV9JV1JJVEVfQ0FNCSgxPDwwKQkJLyogV3JpdGUgQ0FNICovCisjZGVmaW5lIEZNX0lSRUFEX0NBTQkoMjw8MCkJCS8qIFJlYWQgQ0FNICovCisjZGVmaW5lIEZNX0lSVU5fQklTVAkoMzw8MCkJCS8qIFJ1biBCSVNUICovCisjZGVmaW5lIEZNX0lGSU5ECSg0PDwwKQkJLyogRmluZCAqLworI2RlZmluZSBGTV9JSU5WCQkoNTw8MCkJCS8qIEludmFsaWRhdGUgKi8KKyNkZWZpbmUgRk1fSVNLSVAJKDY8PDApCQkvKiBTa2lwICovCisjZGVmaW5lIEZNX0lDTF9TS0lQCSg3PDwwKQkJLyogQ2xlYXIgYWxsIFNLSVAgYml0cyAqLworCisvKgorICogU3VwZXJuZXQgMzoKKyAqIEFkZHJlc3MgRmlsdGVyIFN0YXR1cyBSZWdpc3RlciAoQUZTVEFUKQorICovCisJCQkJCS8qIEJpdCAgMC00OiByZXNlcnZlZCAqLworI2RlZmluZQlGTV9SRVZfTk8JMHgwMGUwCQkvKiBSZXZpc2lvbiBOdW1iZXIgb2YgQWRkcmVzcyBGaWx0ZXIgKi8KKyNkZWZpbmUJRk1fQklTVF9ET05FCTB4MDEwMAkJLyogQklTVCBjb21wbGV0ZSAqLworI2RlZmluZQlGTV9FTVBUWQkweDAyMDAJCS8qIENBTSBlbXB0eSAqLworI2RlZmluZQlGTV9FUlJPUgkweDA0MDAJCS8qIEVycm9yIChpbXByb3BlciBvcGVyYXRpb24pICovCisjZGVmaW5lCUZNX01VTFQJCTB4MDgwMAkJLyogTXVsdGlwbGUgTWF0Y2ggKi8KKyNkZWZpbmUJRk1fRVhBQ1QJMHgxMDAwCQkvKiBFeGFjdCBNYXRjaCAqLworI2RlZmluZQlGTV9GT1VORAkweDIwMDAJCS8qIENvbXBhcmFuZCBmb3VuZCBpbiBDQU0gKi8KKyNkZWZpbmUJRk1fRlVMTAkJMHg0MDAwCQkvKiBDQU0gZnVsbCAqLworI2RlZmluZQlGTV9ET05FCQkweDgwMDAJCS8qIERPTkUgaW5kaWNhdG9yICovCisKKy8qCisgKiBTdXBlcm5ldCAzOgorICogQklTVCBTaWduYXR1cmUgUmVnaXN0ZXIgKEFGQklTVCkKKyAqLworI2RlZmluZQlBRl9CSVNUX1NJR05BVAkweDA1NTMJCS8qIEFkZHJlc3MgRmlsdGVyIEJJU1QgU2lnbmF0dXJlICovCisKKy8qCisgKiBTdXBlcm5ldCAzOgorICogUGVyc29uYWxpdHkgUmVnaXN0ZXIgKEFGUEVSUykKKyAqLworI2RlZmluZQlGTV9WQUxJRAkweDAwMDEJCS8qIENBTSBFbnRyeSBWYWxpZCAqLworI2RlZmluZQlGTV9EQQkJMHgwMDAyCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzICovCisjZGVmaW5lCUZNX0RBWAkJMHgwMDA0CQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzIEV4YWN0ICovCisjZGVmaW5lCUZNX1NBCQkweDAwMDgJCS8qIFNvdXJjZSBBZGRyZXNzICovCisjZGVmaW5lCUZNX1NBWAkJMHgwMDEwCQkvKiBTb3VyY2UgQWRkcmVzcyBFeGFjdCAqLworI2RlZmluZQlGTV9TS0lQCQkweDAwMjAJCS8qIFNraXAgdGhpcyBlbnRyeSAqLworCisvKgorICogaW5zdHJ1Y3Rpb24gc2V0IGZvciBjb21tYW5kIHJlZ2lzdGVyIDEgKE5QQUREUjYtMCA9IDB4MDApCisgKi8KKyNkZWZpbmUgRk1fSVJFU0VUCTB4MDEJCS8qIHNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lIEZNX0lSTUVNV0kJMHgwMgkJLyogbG9hZCBNZW1vcnkgRGF0YSBSZWcuLCBpbmMgTUFSUiAqLworI2RlZmluZSBGTV9JUk1FTVdPCTB4MDMJCS8qIGxvYWQgTURSIGZyb20gYnVmZmVyIG1lbW9yeSwgbi5pLiAqLworI2RlZmluZSBGTV9JSUwJCTB4MDQJCS8qIGlkbGUvbGlzdGVuICovCisjZGVmaW5lIEZNX0lDTAkJMHgwNQkJLyogY2xhaW0vbGlzdGVuICovCisjZGVmaW5lIEZNX0lCTAkJMHgwNgkJLyogYmVhY29uL2xpc3RlbiAqLworI2RlZmluZSBGTV9JTFRWWAkweDA3CQkvKiBsb2FkIFRWWCB0aW1lciBmcm9tIFRWWCByZWcgKi8KKyNkZWZpbmUgRk1fSU5SVE0JMHgwOAkJLyogbm9ucmVzdHJpY3RlZCB0b2tlbiBtb2RlICovCisjZGVmaW5lIEZNX0lFTlRNCTB4MDkJCS8qIGVudGVyIG5vbnJlc3RyaWN0ZWQgdG9rZW4gbW9kZSAqLworI2RlZmluZSBGTV9JRVJUTQkweDBhCQkvKiBlbnRlciByZXN0cmljdGVkIHRva2VuIG1vZGUgKi8KKyNkZWZpbmUgRk1fSVJUTQkJMHgwYgkJLyogcmVzdHJpY3RlZCB0b2tlbiBtb2RlICovCisjZGVmaW5lIEZNX0lTVVJUCTB4MGMJCS8qIHNlbmQgdW5yZXN0cmljdGVkIHRva2VuICovCisjZGVmaW5lIEZNX0lTUlQJCTB4MGQJCS8qIHNlbmQgcmVzdHJpY3RlZCB0b2tlbiAqLworI2RlZmluZSBGTV9JU0lNCQkweDBlCQkvKiBlbnRlciBzZW5kLWltbWVkaWF0ZSBtb2RlICovCisjZGVmaW5lIEZNX0lFU0lNCTB4MGYJCS8qIGV4aXQgc2VuZC1pbW1lZGlhdGUgbW9kZSAqLworI2RlZmluZSBGTV9JQ0xMUwkweDExCQkvKiBjbGVhciBzeW5jaHJvbm91cyBxdWV1ZSBsb2NrICovCisjZGVmaW5lIEZNX0lDTExBMAkweDEyCQkvKiBjbGVhciBhc3luY2hyb25vdXMgcXVldWUgMCBsb2NrICovCisjZGVmaW5lIEZNX0lDTExBMQkweDE0CQkvKiBjbGVhciBhc3luY2hyb25vdXMgcXVldWUgMSBsb2NrICovCisjZGVmaW5lIEZNX0lDTExBMgkweDE4CQkvKiBjbGVhciBhc3luY2hyb25vdXMgcXVldWUgMiBsb2NrICovCisJCQkJCS8qIFNOMzogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fSUNMTFIJMHgyMAkJLyogY2xlYXIgcmVjZWl2ZSBxdWV1ZSAoU04zOjEpIGxvY2sgKi8KKyNkZWZpbmUgRk1fSUNMTFIyCTB4MjEJCS8qIFNOMzogY2xlYXIgcmVjZWl2ZSBxdWV1ZSAyIGxvY2sgKi8KKyNkZWZpbmUgRk1fSVRSWEJVUwkweDIyCQkvKiBTTjM6IFRyaXN0YXRlIFgtQnVzIChTQVMgb25seSkgKi8KKyNkZWZpbmUgRk1fSURSWEJVUwkweDIzCQkvKiBTTjM6IGRyaXZlIFgtQnVzICovCisjZGVmaW5lIEZNX0lDTExBTAkweDNmCQkvKiBjbGVhciBhbGwgcXVldWUgbG9ja3MgKi8KKworLyoKKyAqIGluc3RydWN0aW9uIHNldCBmb3IgY29tbWFuZCByZWdpc3RlciAyIChOUEFERFI2LTAgPSAweDAxKQorICovCisjZGVmaW5lIEZNX0lUUlMJCTB4MDEJCS8qIHRyYW5zbWl0IHN5bmNocm9ub3VzIHF1ZXVlICovCisJCQkJCS8qIFNOMzogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fSVRSQTAJMHgwMgkJLyogdHJhbnNtaXQgYXN5bmNocm9ub3VzIHF1ZXVlIDAgKi8KKwkJCQkJLyogU04zOiByZXNlcnZlZCAqLworI2RlZmluZSBGTV9JVFJBMQkweDA0CQkvKiB0cmFuc21pdCBhc3luY2hyb25vdXMgcXVldWUgMSAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX0lUUkEyCTB4MDgJCS8qIHRyYW5zbWl0IGFzeW5jaHJvbm91cyBxdWV1ZSAyICovCisJCQkJCS8qIFNOMzogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fSUFDVFIJMHgxMAkJLyogYWJvcnQgY3VycmVudCB0cmFuc21pdCBhY3Rpdml0eSAqLworI2RlZmluZSBGTV9JUlNUUQkweDIwCQkvKiByZXNldCB0cmFuc21pdCBxdWV1ZXMgKi8KKyNkZWZpbmUgRk1fSVNUVEIJMHgzMAkJLyogc2V0IHRhZyBiaXQgKi8KKyNkZWZpbmUgRk1fSUVSU0YJMHg0MAkJLyogZW5hYmxlIHJlY2VpdmUgc2luZ2xlIGZyYW1lICovCisJCQkJCS8qIFNOMzogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUJRk1fSVRSCQkweDUwCQkvKiBTTjM6IFRyYW5zbWl0IENvbW1hbmQgKi8KKworCisvKgorICoJZGVmaW5lcyBmb3IgUExDIChBbTc5Qzg2NCkKKyAqLworCisvKgorICogIFBMQyByZWFkL3dyaXRlIChyL3cpIHJlZ2lzdGVycworICovCisjZGVmaW5lIFBMX0NOVFJMX0EJMHgwMAkJLyogY29udHJvbCByZWdpc3RlciBBIChyL3cpICovCisjZGVmaW5lIFBMX0NOVFJMX0IJMHgwMQkJLyogY29udHJvbCByZWdpc3RlciBCIChyL3cpICovCisjZGVmaW5lIFBMX0lOVFJfTUFTSwkweDAyCQkvKiBpbnRlcnJ1cHQgbWFzayAoci93KSAqLworI2RlZmluZSBQTF9YTUlUX1ZFQ1RPUgkweDAzCQkvKiB0cmFuc21pdCB2ZWN0b3IgcmVnaXN0ZXIgKHIvdykgKi8KKyNkZWZpbmUgUExfVkVDVE9SX0xFTgkweDA0CQkvKiB0cmFuc21pdCB2ZWN0b3IgbGVuZ3RoIChyL3cpICovCisjZGVmaW5lIFBMX0xFX1RIUkVTSE9MRAkweDA1CQkvKiBsaW5rIGVycm9yIGV2ZW50IHRocmVzaG9sZCAoci93KSAqLworI2RlZmluZSBQTF9DX01JTgkweDA2CQkvKiBtaW5pbXVtIGNvbm5lY3Qgc3RhdGUgdGltZSAoci93KSAqLworI2RlZmluZSBQTF9UTF9NSU4JMHgwNwkJLyogbWluLiBsaW5lIHN0YXRlIHRyYW5zbWl0IHQuIChyL3cpICovCisjZGVmaW5lIFBMX1RCX01JTgkweDA4CQkvKiBtaW5pbXVtIGJyZWFrIHRpbWUgKHIvdykgKi8KKyNkZWZpbmUgUExfVF9PVVQJMHgwOQkJLyogc2lnbmFsIHRpbWVvdXQgKHIvdykgKi8KKyNkZWZpbmUgUExfQ05UUkxfQwkweDBhCQkvKiBjb250cm9sIHJlZ2lzdGVyIEMgKHIvdykgKi8KKyNkZWZpbmUgUExfTENfTEVOR1RICTB4MGIJCS8qIGxpbmsgY29uZmlkZW5jZSB0ZXN0IHRpbWUgKHIvdykgKi8KKyNkZWZpbmUgUExfVF9TQ1JVQgkweDBjCQkvKiBzY3J1YiB0aW1lID0gTUFDIFRWWCAoci93KSAqLworI2RlZmluZSBQTF9OU19NQVgJMHgwZAkJLyogbWF4LiBub2lzZSB0aW1lIGJlZm9yZSBicmVhayAoci93KSovCisjZGVmaW5lIFBMX1RQQ19MT0FEX1YJMHgwZQkJLyogVFBDIHRpbWVyIGxvYWQgdmFsdWUgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFBMX1RORV9MT0FEX1YJMHgwZgkJLyogVE5FIHRpbWVyIGxvYWQgdmFsdWUgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFBMX1NUQVRVU19BCTB4MTAJCS8qIHN0YXR1cyByZWdpc3RlciBBIChyZWFkIG9ubHkpICovCisjZGVmaW5lIFBMX1NUQVRVU19CCTB4MTEJCS8qIHN0YXR1cyByZWdpc3RlciBCIChyZWFkIG9ubHkpICovCisjZGVmaW5lIFBMX1RQQwkJMHgxMgkJLyogdGltZXIgZm9yIFBDTSAocm8pIFsyMC40OCB1c10gKi8KKyNkZWZpbmUgUExfVE5FCQkweDEzCQkvKiB0aW1lIG9mIG5vaXNlIGV2ZW50IFswLjMyIHVzXSAqLworI2RlZmluZSBQTF9DTEtfRElWCTB4MTQJCS8qIFRORSBjbG9jayBkaXZpZGVyIChyZWFkIG9ubHkpICovCisjZGVmaW5lIFBMX0JJU1RfU0lHTkFUCTB4MTUJCS8qIGJ1aWx0IGluIHNlbGYgdGVzdCBzaWduYXR1cmUgKHJvKSovCisjZGVmaW5lIFBMX1JDVl9WRUNUT1IJMHgxNgkJLyogcmVjZWl2ZSB2ZWN0b3IgcmVnLiAocmVhZCBvbmx5KSAqLworI2RlZmluZSBQTF9JTlRSX0VWRU5UCTB4MTcJCS8qIGludGVycnVwdCBldmVudCByZWcuIChyZWFkIG9ubHkpICovCisjZGVmaW5lIFBMX1ZJT0xfU1lNX0NUUgkweDE4CQkvKiB2aW9sYXRpb24gc3ltYm9sIGNvdW50LiAocmVhZCBvKSAqLworI2RlZmluZSBQTF9NSU5fSURMRV9DVFIJMHgxOQkJLyogbWluaW11bSBpZGxlIGNvdW50ZXIgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgUExfTElOS19FUlJfQ1RSCTB4MWEJCS8qIGxpbmsgZXJyb3IgZXZlbnQgY3RyLihyZWFkIG9ubHkpICovCisjaWZkZWYJTU9UX0VMTQorI2RlZmluZQlQTF9UX0ZPVF9BU1MJMHgxZQkJLyogRk9UT0ZGIEFzc2VydCBUaW1lciAqLworI2RlZmluZQlQTF9UX0ZPVF9ERUFTUwkweDFmCQkvKiBGT1RPRkYgRGVhc3NlcnQgVGltZXIgKi8KKyNlbmRpZgkvKiBNT1RfRUxNICovCisKKyNpZmRlZglNT1RfRUxNCisvKgorICogU3BlY2lhbCBRdWFkLUVsbSBSZWdpc3RlcnMuCisgKiBBIFF1YWQtRUxNIGNvbnNpc3RzIG9mIGZvciBFTE1zIGFuZCB0aGVzZSBhZGRpdGlvbmFsIHJlZ2lzdGVycy4KKyAqLworI2RlZmluZQlRRUxNX1hCQVJfVwkweDgwCQkvKiBDcm9zc2JhciBDb250cm9sIEVMTSBXICovCisjZGVmaW5lCVFFTE1fWEJBUl9YCTB4ODEJCS8qIENyb3NzYmFyIENvbnRyb2wgRUxNIFggKi8KKyNkZWZpbmUJUUVMTV9YQkFSX1kJMHg4MgkJLyogQ3Jvc3NiYXIgQ29udHJvbCBFTE0gWSAqLworI2RlZmluZQlRRUxNX1hCQVJfWgkweDgzCQkvKiBDcm9zc2JhciBDb250cm9sIEVMTSBaICovCisjZGVmaW5lCVFFTE1fWEJBUl9QCTB4ODQJCS8qIENyb3NzYmFyIENvbnRyb2wgQnVzIFAgKi8KKyNkZWZpbmUJUUVMTV9YQkFSX1MJMHg4NQkJLyogQ3Jvc3NiYXIgQ29udHJvbCBCdXMgUyAqLworI2RlZmluZQlRRUxNX1hCQVJfUgkweDg2CQkvKiBDcm9zc2JhciBDb250cm9sIEJ1cyBSICovCisjZGVmaW5lCVFFTE1fV1JfWEJBUgkweDg3CQkvKiBXcml0ZSB0aGUgQ3Jvc3NiYXIgbm93ICh3cml0ZSkgKi8KKyNkZWZpbmUJUUVMTV9DVFJfVwkweDg4CQkvKiBDb3VudGVyIFcgKi8KKyNkZWZpbmUJUUVMTV9DVFJfWAkweDg5CQkvKiBDb3VudGVyIFggKi8KKyNkZWZpbmUJUUVMTV9DVFJfWQkweDhhCQkvKiBDb3VudGVyIFkgKi8KKyNkZWZpbmUJUUVMTV9DVFJfWgkweDhiCQkvKiBDb3VudGVyIFogKi8KKyNkZWZpbmUJUUVMTV9JTlRfTUFTSwkweDhjCQkvKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworI2RlZmluZQlRRUxNX0lOVF9EQVRBCTB4OGQJCS8qIEludGVycnVwdCBkYXRhIChldmVudCkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUUVMTV9FTE1CCTB4MDAJCS8qIEVsbSBiYXNlICovCisjZGVmaW5lCVFFTE1fRUxNX1NJWkUJMHgyMAkJLyogRUxNIHNpemUgKi8KKyNlbmRpZgkvKiBNT1RfRUxNICovCisvKgorICogUExDIGNvbnRyb2wgcmVnaXN0ZXIgQSAoUExfQ05UUkxfQTogbG9nLiBhZGRyLiAweDAwKQorICogSXQgaXMgdXNlZCBmb3IgdGltZXIgY29uZmlndXJhdGlvbiwgc3BlY2lmaWNhdGlvbiBvZiBQQ00gTUFJTlQgc3RhdGUgb3B0aW9uLAorICogY291bnRlciBpbnRlcnJ1cHQgZnJlcXVlbmN5LCBQTEMgZGF0YSBwYXRoIGNvbmZpZy4gYW5kIEJ1aWx0IEluIFNlbGYgVGVzdC4KKyAqLworI2RlZmluZQlQTF9SVU5fQklTVAkweDAwMDEJCS8qIGJlZ2luIHJ1bm5pbmcgaXRzIEJ1aWx0IEluIFNlbGYgVC4qLworI2RlZmluZQlQTF9SRl9ESVNBQkxFCTB4MDAwMgkJLyogZGlzYWJsZSB0aGUgUmVwZWF0IEZpbHRlciBzdGF0ZSBtLiovCisjZGVmaW5lCVBMX1NDX1JFTV9MT09QCTB4MDAwNAkJLyogcmVtb3RlIGxvb3BiYWNrIHBhdGggKi8KKyNkZWZpbmUJUExfU0NfQllQQVNTCTB4MDAwOAkJLyogYnkgcHJvdmlkaW5nIGEgcGh5c2ljYWwgYnlwYXNzICovCisjZGVmaW5lCVBMX0xNX0xPQ19MT09QCTB4MDAxMAkJLyogbG9vcCBwYXRoIGp1c3QgYWZ0ZXIgZWxhc3RpYyBidWZmLiovCisjZGVmaW5lCVBMX0VCX0xPQ19MT09QCTB4MDAyMAkJLyogbG9vcCBwYXRoIGp1c3QgcHJpb3IgdG8gUERUL1BEUiBJRiovCisjZGVmaW5lCVBMX0ZPVF9PRkYJMHgwMDQwCQkvKiBhc3NlcnRpb24gb2YgL0ZPVE9GRiBwaW4gb2YgUExDICovCisjZGVmaW5lCVBMX0xPT1BCQUNLCTB4MDA4MAkJLyogaXQgY2F1c2UgdGhlIC9MUEJDSyBwaW4gYXNzLiBsb3cgKi8KKyNkZWZpbmUJUExfTUlOSV9DVFJfSU5UIDB4MDEwMAkJLyogcGFydGlhbGx5IGNvbnRyLiB3aGVuIGJpdCBpcyBhc3MuICovCisjZGVmaW5lCVBMX1ZTWU1fQ1RSX0lOVAkweDAyMDAJCS8qIGNvbnRyb2xzIHdoZW4gaW50IGJpdCBpcyBhc3NlcnRlZCAqLworI2RlZmluZQlQTF9FTkFfUEFSX0NISwkweDA0MDAJCS8qIGVuYWJsZSBwYXJpdHkgY2hlY2sgKi8KKyNkZWZpbmUJUExfUkVRX1NDUlVCCTB4MDgwMAkJLyogbGltaXRlZCBhY2Nlc3MgdG8gc2NydWIgY2FwYWJpbGl0eSovCisjZGVmaW5lCVBMX1RQQ18xNkJJVAkweDEwMDAJCS8qIGNhdXNlcyB0aGUgVFBDIGFzIGEgMTYgYml0IHRpbWVyICovCisjZGVmaW5lCVBMX1RORV8xNkJJVAkweDIwMDAJCS8qIGNhdXNlcyB0aGUgVE5FIGFzIGEgMTYgYml0IHRpbWVyICovCisjZGVmaW5lCVBMX05PSVNFX1RJTUVSCTB4NDAwMAkJLyogYWxsb3dzIHRoZSBub2lzZSB0aW1pbmcgZnVuY3Rpb24gKi8KKworLyoKKyAqIFBMQyBjb250cm9sIHJlZ2lzdGVyIEIgKFBMX0NOVFJMX0I6IGxvZy4gYWRkci4gMHgwMSkKKyAqIEl0IGNvbnRhaW5zIHNpZ25hbHMgYW5kIHJlcXVlc3RlIHRvIGRpcmVjdCB0aGUgcHJvY2VzcyBvZiBQQ00gYW5kIGl0IGlzIGFsc28KKyAqIHVzZWQgdG8gY29udHJvbCB0aGUgTGluZSBTdGF0ZSBNYXRjaCBpbnRlcnJ1cHQuCisgKi8KKyNkZWZpbmUJUExfUENNX0NOVFJMCTB4MDAwMwkJLyogY29udHJvbCBQQ00gc3RhdGUgbWFjaGluZSAqLworI2RlZmluZQlQTF9QQ01fTkFGCSgwKQkJLyogc3RhdGUgaXMgbm90IGFmZmVjdGVkICovCisjZGVmaW5lCVBMX1BDTV9TVEFSVAkoMSkJCS8qIGdvZXMgdG8gdGhlIEJSRUFLIHN0YXRlICovCisjZGVmaW5lCVBMX1BDTV9UUkFDRQkoMikJCS8qIGdvZXMgdG8gdGhlIFRSQUNFIHN0YXRlICovCisjZGVmaW5lCVBMX1BDTV9TVE9QCSgzKQkJLyogZ29lcyB0byB0aGUgT0ZGIHN0YXRlICovCisKKyNkZWZpbmUJUExfTUFJTlQJMHgwMDA0CQkvKiBpZiBPRkYgc3RhdGUgLS0+IE1BSU5UIHN0YXRlICovCisjZGVmaW5lCVBMX0xPTkcJCTB4MDAwOAkJLyogcGVyZi4gYSBsb25nIExpbmsgQ29uZmlkLlRlc3QoTENUKSovCisjZGVmaW5lCVBMX1BDX0pPSU4JMHgwMDEwCQkvKiBpZiBORVhUIHN0YXRlIC0tPiBKT0lOIHN0YXRlICovCisKKyNkZWZpbmUJUExfUENfTE9PUAkweDAwNjAJCS8qIGxvb3BiYWNrIHVzZWQgaW4gdGhlIExDVCAqLworI2RlZmluZQlQTF9OT0xDVAkoMDw8NSkJCS8qIG5vIExDVCBpcyBwZXJmb3JtZWQgKi8KKyNkZWZpbmUJUExfVFBEUgkJKDE8PDUpCQkvKiBQQ00gYXNzZXJ0cyB0cmFuc21pdCBQRFIgKi8KKyNkZWZpbmUJUExfVElETEUJKDI8PDUpCQkvKiBQQ00gYXNzZXJ0cyB0cmFuc21pdCBpZGxlICovCisjZGVmaW5lCVBMX1JMQlAJCSgzPDw1KQkJLyogdHJhbnMuIFBEUiAmIHJlbW90ZSBsb29wYi4gcGF0aCAqLworCisjZGVmaW5lCVBMX0NMQVNTX1MJMHgwMDgwCQkvKiBzaWduaWYuIHRoYXQgc2luZ2xlIGF0dC4gc3RhdGlvbiAqLworCisjZGVmaW5lCVBMX01BSU5UX0xTCTB4MDcwMAkJLyogbGluZSBzdGF0ZSB3aGlsZSBpbiB0aGUgTUFJTlQgc3QuICovCisjZGVmaW5lCVBMX01fUVVJMAkoMDw8OCkJCS8qIHRyYW5zbWl0IFFVSUVUIGxpbmUgc3RhdGUgKi8KKyNkZWZpbmUJUExfTV9JRExFCSgxPDw4KQkJLyogdHJhbnNtaXQgSURMRSBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX01fSEFMVAkoMjw8OCkJCS8qIHRyYW5zbWl0IEhBTFQgbGluZSBzdGF0ZSAqLworI2RlZmluZQlQTF9NX01BU1RSCSgzPDw4KQkJLyogdHJhbnNtaXQgTUFTVEVSIGxpbmUgc3RhdGUgKi8KKyNkZWZpbmUJUExfTV9RVUkxCSg0PDw4KQkJLyogdHJhbnNtaXQgUVVJRVQgbGluZSBzdGF0ZSAqLworI2RlZmluZQlQTF9NX1FVSTIJKDU8PDgpCQkvKiB0cmFuc21pdCBRVUlFVCBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX01fVFBEUgkoNjw8OCkJCS8qIHRyLiBQSFlfREFUQSByZXF1Li1zeW1ib2wgaXMgdHIuZWQqLworI2RlZmluZQlQTF9NX1FVSTMJKDc8PDgpCQkvKiB0cmFuc21pdCBRVUlFVCBsaW5lIHN0YXRlICovCisKKyNkZWZpbmUJUExfTUFUQ0hfTFMJMHg3ODAwCQkvKiBsaW5lIHN0YXRlIHRvIGJlIGNvbXAuIHdpdGggY3Vyci4qLworI2RlZmluZQlQTF9JX0FOWQkoMDw8MTEpCQkvKiBJbnQuIG9uIGFueSBjaGFuZ2UgaW4gKl9MSU5FX1NUICovCisjZGVmaW5lCVBMX0lfSURMRQkoMTw8MTEpCQkvKiBJbnRlcnJ1cHQgb24gSURMRSBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX0lfSEFMVAkoMjw8MTEpCQkvKiBJbnRlcnJ1cHQgb24gSEFMVCBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX0lfTUFTVFIJKDQ8PDExKQkJLyogSW50ZXJydXB0IG9uIE1BU1RFUiBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX0lfUVVJRVQJKDg8PDExKQkJLyogSW50ZXJydXB0IG9uIFFVSUVUIGxpbmUgc3RhdGUgKi8KKworI2RlZmluZQlQTF9DT05GSUdfQ05UUkwJMHg4MDAwCQkvKiBjb250cm9sIG92ZXIgc2NydWIsIGJ5cC4gJiBsb29wYi4qLworCisvKgorICogUExDIGNvbnRyb2wgcmVnaXN0ZXIgQyAoUExfQ05UUkxfQzogbG9nLiBhZGRyLiAweDBhKQorICogSXQgY29udGFpbnMgdGhlIHNjcmFtYmxpbmcgY29udHJvbCByZWdpc3RlcnMgKFBMQy1TIG9ubHkpCisgKi8KKyNkZWZpbmUgUExfQ19DSVBIRVJfRU5BQkxFCSgxPDwwKQkvKiBlbmFibGUgc2NyYW1ibGVyICovCisjZGVmaW5lIFBMX0NfQ0lQSEVSX0xQQkNLCSgxPDwxKQkvKiBsb29wYmFjayBzY3JhbWJsZXIgKi8KKyNkZWZpbmUgUExfQ19TRE9GRl9FTkFCTEUJKDE8PDYpCS8qIGVuYWJsZSBTRE9GRiB0aW1lciAqLworI2RlZmluZSBQTF9DX1NET05fRU5BQkxFCSgxPDw3KQkvKiBlbmFibGUgU0RPTiB0aW1lciAqLworI2lmZGVmCU1PVF9FTE0KKyNkZWZpbmUgUExfQ19GT1RPRkZfQ1RSTAkoMzw8MikJLyogRk9UT0ZGIHRpbWVyIGNvbnRyb2wgKi8KKyNkZWZpbmUgUExfQ19GT1RPRkZfVElNCQkoMDw8MikJLyogRk9UT0ZGIHVzZSB0aW1lciBmb3IgKGRlKS1hc3NlcnQgKi8KKyNkZWZpbmUgUExfQ19GT1RPRkZfSU5BCQkoMjw8MikJLyogRk9UT0ZGIGZvcmNlZCBpbmFjdGl2ZSAqLworI2RlZmluZSBQTF9DX0ZPVE9GRl9BQ1QJCSgzPDwyKQkvKiBGT1RPRkYgZm9yY2VkIGFjdGl2ZSAqLworI2RlZmluZSBQTF9DX0ZPVE9GRl9TUkNFCSgxPDw0KQkvKiBGT1RPRkYgc291cmNlIGlzIFBDTSBzdGF0ZSAhPSBPRkYgKi8KKyNkZWZpbmUJUExfQ19SWERBVEFfRU4JCSgxPDw1KQkvKiBSZWMgc2NyIGRhdGEgZm9yY2VkIHRvIDAgKi8KKyNkZWZpbmUJUExfQ19TRE5SWkVOCQkoMTw8OCkJLyogTW9uaXRvciByZWMgZGVzY3IuIGRhdGEgZm9yIGFjdCAqLworI2Vsc2UJLyogbk1PVF9FTE0gKi8KKyNkZWZpbmUgUExfQ19GT1RPRkZfQ1RSTAkoMzw8OCkJLyogRk9UT0ZGIHRpbWVyIGNvbnRyb2wgKi8KKyNkZWZpbmUgUExfQ19GT1RPRkZfMAkJKDA8PDgpCS8qIHRpbWVyIG9mZiAqLworI2RlZmluZSBQTF9DX0ZPVE9GRl8zMAkJKDE8PDgpCS8qIDMwdVMgKi8KKyNkZWZpbmUgUExfQ19GT1RPRkZfNTAJCSgyPDw4KQkvKiA1MHVTICovCisjZGVmaW5lIFBMX0NfRk9UT0ZGX05FVkVSCSgzPDw4KQkvKiBuZXZlciAqLworI2RlZmluZSBQTF9DX1NET05fVElNRVIJCSgzPDwxMCkJLyogU0RPTiB0aW1lciBjb250cm9sICovCisjZGVmaW5lIFBMX0NfU0RPTl8wODQJCSgwPDwxMCkJLyogMC44NCB1UyAqLworI2RlZmluZSBQTF9DX1NET05fMTMyCQkoMTw8MTApCS8qIDEuMzIgdVMgKi8KKyNkZWZpbmUgUExfQ19TRE9OXzI1MgkJKDI8PDEwKQkvKiAyLjUyIHVTICovCisjZGVmaW5lIFBMX0NfU0RPTl81MTIJCSgzPDwxMCkJLyogNS4xMiB1UyAqLworI2RlZmluZSBQTF9DX1NPRkZfVElNRVIJCSgzPDwxMikJLyogU0RPRkYgdGltZXIgY29udHJvbCAqLworI2RlZmluZSBQTF9DX1NPRkZfMDc2CQkoMDw8MTIpCS8qIDAuNzYgdVMgKi8KKyNkZWZpbmUgUExfQ19TT0ZGXzEzMgkJKDE8PDEyKQkvKiAxLjMyIHVTICovCisjZGVmaW5lIFBMX0NfU09GRl8yNTIJCSgyPDwxMikJLyogMi41MiB1UyAqLworI2RlZmluZSBQTF9DX1NPRkZfNTEyCQkoMzw8MTIpCS8qIDUuMTIgdVMgKi8KKyNkZWZpbmUgUExfQ19UU0VMCQkoMzw8MTQpCS8qIHNjcmFtYmxlciBwYXRoIHNlbGVjdCAqLworI2VuZGlmCS8qIG5NT1RfRUxNICovCisKKy8qCisgKiBQTEMgc3RhdHVzIHJlZ2lzdGVyIEEgKFBMX1NUQVRVU19BOiBsb2cuIGFkZHIuIDB4MTApCisgKiBJdCBpcyB1c2VkIHRvIHJlcG9ydCBzdGF0dXMgaW5mb3JtYXRpb24gdG8gdGhlIE5vZGUgUHJvY2Vzc29yIGFib3V0IHRoZSAKKyAqIExpbmUgU3RhdGUgTWFjaGluZSAoTFNNKS4KKyAqLworI2lmZGVmCU1PVF9FTE0KKyNkZWZpbmUgUExDX0lOVF9NQVNLCTB4YzAwMAkJLyogRUxNIGludGVncmF0aW9uIGJpdHMgaW4gc3RhdHVzIEEgKi8KKyNkZWZpbmUgUExDX0lOVF9DCTB4MDAwMAkJLyogRUxNIFJldmlzaW9uIEJhbmQgQyAqLworI2RlZmluZSBQTENfSU5UX0NBTUVMCTB4NDAwMAkJLyogRUxNIGludGVncmF0ZWQgaW50byBDQU1FTCAqLworI2RlZmluZSBQTENfSU5UX1FFCTB4ODAwMAkJLyogRUxNIGludGVncmF0ZWQgaW50byBRdWFkIEVMTSAqLworI2RlZmluZSBQTENfUkVWX01BU0sJMHgzODAwCQkvKiByZXZpc2lvbiBiaXRzIGluIHN0YXR1cyBBICovCisjZGVmaW5lIFBMQ19SRVZJU0lPTl9CCTB4MDAwMAkJLyogcmV2IGJpdHMgZm9yIEVMTSBSZXYgQiAqLworI2RlZmluZSBQTENfUkVWSVNJT05fUUEJMHgwODAwCQkvKiByZXYgYml0cyBmb3IgRUxNIGNvcmUgaW4gUUVMTS1BICovCisjZWxzZQkvKiBuTU9UX0VMTSAqLworI2RlZmluZSBQTENfUkVWX01BU0sJMHhmODAwCQkvKiByZXZpc2lvbiBiaXRzIGluIHN0YXR1cyBBICovCisjZGVmaW5lIFBMQ19SRVZJU0lPTl9BCTB4MDAwMAkJLyogcmV2aXNpb24gYml0cyBmb3IgUExDICovCisjZGVmaW5lIFBMQ19SRVZJU0lPTl9TCTB4ZjgwMAkJLyogcmV2aXNpb24gYml0cyBmb3IgUExDLVMgKi8KKyNkZWZpbmUgUExDX1JFVl9TTjMJMHg3ODAwCQkvKiByZXZpc2lvbiBiaXRzIGZvciBQTEMtUyBpbiBJRkNQICovCisjZW5kaWYJLyogbk1PVF9FTE0gKi8KKyNkZWZpbmUJUExfU1lNX1BSX0NUUgkweDAwMDcJCS8qIGNvbnRhaW5zIHRoZSBMU00gc3ltYm9sIHBhaXIgQ3RyLiAqLworI2RlZmluZQlQTF9VTktOX0xJTkVfU1QJMHgwMDA4CQkvKiB1bmtub3duIGxpbmUgc3RhdGUgYml0IGZyb20gTFNNICovCisjZGVmaW5lCVBMX0xTTV9TVEFURQkweDAwMTAJCS8qIHN0YXRlIGJpdCBvZiBMU00gKi8KKworI2RlZmluZQlQTF9MSU5FX1NUCTB4MDBlMAkJLyogY29udGFpbnMgcmVjb2duLiBsaW5lIHN0YXRlIG9mIExTTSovCisjZGVmaW5lCVBMX0xfTkxTCSgwPDw1KQkJLyogbm9pc2UgbGluZSBzdGF0ZSAqLworI2RlZmluZQlQTF9MX0FMUwkoMTw8NSkJCS8qIGFjdGl2IGxpbmUgc3RhdGUgKi8KKyNkZWZpbmUJUExfTF9VTkQJKDI8PDUpCQkvKiB1bmRlZmluZWQgKi8KKyNkZWZpbmUJUExfTF9JTFM0CSgzPDw1KQkJLyogaWRsZSBsLiBzLiAoYWZ0ZXIgNCBpZGxlIHN5bWJvbHMpICovCisjZGVmaW5lCVBMX0xfUUxTCSg0PDw1KQkJLyogcXVpZXQgbGluZSBzdGF0ZSAqLworI2RlZmluZQlQTF9MX01MUwkoNTw8NSkJCS8qIG1hc3RlciBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX0xfSExTCSg2PDw1KQkJLyogaGFsdCBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX0xfSUxTMTYJKDc8PDUpCQkvKiBpZGxlIGxpbmUgc3RhdGUgKGFmdGVyIDE2IGlkbGUgcy4pKi8KKworI2RlZmluZQlQTF9QUkVWX0xJTkVfU1QJMHgwMzAwCQkvKiB2YWx1ZSBvZiBwcmV2aW91cyBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX1BfUUxTCSgwPDw4KQkJLyogcXVpZXQgbGluZSBzdGF0ZSAqLworI2RlZmluZQlQTF9QX01MUwkoMTw8OCkJCS8qIG1hc3RlciBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX1BfSExTCSgyPDw4KQkJLyogaGFsdCBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX1BfSUxTMTYJKDM8PDgpCQkvKiBpZGxlIGxpbmUgc3RhdGUgKGFmdGVyIDE2IGlkbGUgcy4pKi8KKworI2RlZmluZQlQTF9TSUdOQUxfREVUCTB4MDQwMAkJLyogMT10aGF0IHNpZ25hbCBkZXRlY3QgaXMgZGVhc3NlcnRlZCovCisKKworLyoKKyAqIFBMQyBzdGF0dXMgcmVnaXN0ZXIgQiAoUExfU1RBVFVTX0I6IGxvZy4gYWRkci4gMHgxMSkKKyAqIEl0IGNvbnRhaW5zIHNpZ25hbHMgYW5kIHN0YXR1cyBmcm9tIHRoZSByZXBlYXQgZmlsdGVyIGFuZCBQQ00gc3RhdGUgbWFjaGluZS4KKyAqLworI2RlZmluZQlQTF9CUkVBS19SRUFTT04JMHgwMDA3CQkvKiByZWFzb24gZm9yIFBDTSBzdGF0ZSBtYWNoLnMgdG8gYnIuKi8KKyNkZWZpbmUJUExfQl9OT1QJKDApCQkvKiBQQ00gU00gaGFzIG5vdCBnb25lIHRvIEJSRUFLIHN0YXRlKi8KKyNkZWZpbmUJUExfQl9QQ1MJKDEpCQkvKiBQQ19TdGFydCBpc3N1ZWQgKi8KKyNkZWZpbmUJUExfQl9UUEMJKDIpCQkvKiBUUEMgdGltZXIgZXhwaXJlZCBhZnRlciBUX09VVCAqLworI2RlZmluZQlQTF9CX1RORQkoMykJCS8qIFRORSB0aW1lciBleHBpcmVkIGFmdGVyIE5TX01BWCAqLworI2RlZmluZQlQTF9CX1FMUwkoNCkJCS8qIHF1aXQgbGluZSBzdGF0ZSBkZXRlY3RlZCAqLworI2RlZmluZQlQTF9CX0lMUwkoNSkJCS8qIGlkbGUgbGluZSBzdGF0ZSBkZXRlY3RlZCAqLworI2RlZmluZQlQTF9CX0hMUwkoNikJCS8qIGhhbHQgbGluZSBzdGF0ZSBkZXRlY3RlZCAqLworCisjZGVmaW5lCVBMX1RDRgkJMHgwMDA4CQkvKiB0cmFuc21pdCBjb2RlIGZsYWcgKHN0YXJ0IGV4ZWMuKSAqLworI2RlZmluZQlQTF9SQ0YJCTB4MDAxMAkJLyogcmVjZWl2ZSBjb2RlIGZsYWcgKHN0YXJ0IGV4ZWMuKSAqLworI2RlZmluZQlQTF9MU0YJCTB4MDAyMAkJLyogbGluZSBzdGF0ZSBmbGFnIChsLnMuIGhhcyBiZWVuIHIuKSovCisjZGVmaW5lCVBMX1BDTV9TSUdOQUwJMHgwMDQwCQkvKiBpbmRpYy4gdGhhdCBYTUlUX1ZFQ1RPUiBoYi53cml0dGVuKi8KKworI2RlZmluZQlQTF9QQ01fU1RBVEUJMHgwNzgwCQkvKiBzdGF0ZSBiaXRzIG9mIFBDTSBzdGF0ZSBtYWNoaW5lICovCisjZGVmaW5lCVBMX1BDMAkJKDA8PDcpCQkvKiBPRkYJICAgLSB3aGVuIC9SU1Qgb3IgUENNX0NOVFJMICovCisjZGVmaW5lCVBMX1BDMQkJKDE8PDcpCQkvKiBCUkVBSyAgIC0gZW50cnkgcG9pbnQgaW4gc3RhcnQgUENNKi8KKyNkZWZpbmUJUExfUEMyCQkoMjw8NykJCS8qIFRSQUNFICAgLSB0byBsb2NhbGl6ZSBzdHVjayBCZWFjb24qLworI2RlZmluZQlQTF9QQzMJCSgzPDw3KQkJLyogQ09OTkVDVCAtIHN5bmNocm9uaXplIGVuZHMgb2YgY29ubiovCisjZGVmaW5lCVBMX1BDNAkJKDQ8PDcpCQkvKiBORVhUCSAgIC0gdG8gc2VwYXJhdGUgdGhlIHNpZ25hbG5nKi8KKyNkZWZpbmUJUExfUEM1CQkoNTw8NykJCS8qIFNJR05BTCAgLSBQQ00gdHJhbnMvcmVjLiBiaXQgaW5mb3MqLworI2RlZmluZQlQTF9QQzYJCSg2PDw3KQkJLyogSk9JTgkgICAtIDEuIHN0YXRlIHRvIGFjdGl2IGNvbm4uICovCisjZGVmaW5lCVBMX1BDNwkJKDc8PDcpCQkvKiBWRVJJRlkgIC0gMi4gLSAiIC0gKDMuIEFDVElWRSkgKi8KKyNkZWZpbmUJUExfUEM4CQkoODw8NykJCS8qIEFDVElWRSAgLSBQSFkgaGFzIGJlZW4gaW5jb3Jwb3JhdGVkKi8KKyNkZWZpbmUJUExfUEM5CQkoOTw8NykJCS8qIE1BSU5UICAgLSBmb3IgdGVzdCBwdXJwb3NlcyBvciBzbyAKKwkJCQkJICAgdGhhdCBQQ00gb3AuIGNvbXBsZXRlbHkgaW4gc29mdHcuICovCisKKyNkZWZpbmUJUExfUENJX1NDUlVCCTB4MDgwMAkJLyogc2NydWJiaW5nIGZ1bmN0aW9uIGlzIGJlaW5nIGV4ZWMuICovCisKKyNkZWZpbmUJUExfUENJX1NUQVRFCTB4MzAwMAkJLyogUGh5c2ljYWwgQ29ubmVjdC4gSW5zZXJ0aW9uIFNNICovCisjZGVmaW5lCVBMX0NJX1JFTVYJKDA8PDEyKQkJLyogUkVNT1ZFRCAqLworI2RlZmluZQlQTF9DSV9JU0NSCSgxPDwxMikJCS8qIElOU0VSVF9TQ1JVQiAqLworI2RlZmluZQlQTF9DSV9SU0NSCSgyPDwxMikJCS8qIFJFTU9WRV9TQ1JVQiAqLworI2RlZmluZQlQTF9DSV9JTlMJKDM8PDEyKQkJLyogSU5TRVJURUQgKi8KKworI2RlZmluZQlQTF9SRl9TVEFURQkweGMwMDAJCS8qIHN0YXRlIGJpdCBvZiByZXBlYXRlIGZpbHRlciBTTSAqLworI2RlZmluZQlQTF9SRl9SRVBUCSgwPDwxNCkJCS8qIFJFUEVBVCAqLworI2RlZmluZQlQTF9SRl9JRExFCSgxPDwxNCkJCS8qIElETEUgKi8KKyNkZWZpbmUJUExfUkZfSEFMVDEJKDI8PDE0KQkJLyogSEFMVDEgKi8KKyNkZWZpbmUJUExfUkZfSEFMVDIJKDM8PDE0KQkJLyogSEFMVDIgKi8KKworCisvKgorICogUExDIGludGVycnVwdCBldmVudCByZWdpc3RlciAoUExfSU5UUl9FVkVOVDogbG9nLiBhZGRyLiAweDE3KQorICogSXQgaXMgcmVhZCBvbmx5IGFuZCBpcyBjbGVhcmRlIHdoZW5ldmVyIGl0IGlzIHJlYWQhCisgKiBJdCBpcyB1c2VkIGJ5IHRoZSBQTEMgdG8gcmVwb3J0IGV2ZW50cyB0byB0aGUgbm9kZSBwcm9jZXNzb3IuCisgKi8KKyNkZWZpbmUJUExfUEFSSVRZX0VSUgkweDAwMDEJCS8qIHAuIGVycm9yIGguYi5kZXRlY3RlZCBvbiBUWDktMCBpbnAqLworI2RlZmluZQlQTF9MU19NQVRDSAkweDAwMDIJCS8qIGwucy49PSBsLnMuIFBMQ19DTlRSTF9CJ3MgTUFUQ0hfTFMqLworI2RlZmluZQlQTF9QQ01fQ09ERQkweDAwMDQJCS8qIHRyYW5zbWl0JnJlY2VpdmUgfCBMQ1QgY29tcGxldGUgKi8KKyNkZWZpbmUJUExfVFJBQ0VfUFJPUAkweDAwMDgJCS8qIG1hc3RlciBsLnMuIHdoaWxlIFBDTSBBQ1RJVnxUUkFDRSAqLworI2RlZmluZQlQTF9TRUxGX1RFU1QJMHgwMDEwCQkvKiBRVUlFVHxIQUxUIHdoaWxlIFBDTSBpbiBUUkFDRSBzdC4gKi8KKyNkZWZpbmUJUExfUENNX0JSRUFLCTB4MDAyMAkJLyogUENNIGhhcyBlbnRlcmVkIHRoZSBCUkVBSyBzdGF0ZSAqLworI2RlZmluZQlQTF9QQ01fRU5BQkxFRAkweDAwNDAJCS8qIGFzc2VydGVkIFNDX0pPSU4sIHNjcnViLiAmIEFDVElWICovCisjZGVmaW5lCVBMX1RQQ19FWFBJUkVECTB4MDA4MAkJLyogVFBDIHRpbWVyIHJlYWNoZWQgemVybyAqLworI2RlZmluZQlQTF9UTkVfRVhQSVJFRAkweDAxMDAJCS8qIFRORSB0aW1lciByZWFjaGVkIHplcm8gKi8KKyNkZWZpbmUJUExfRUJVRl9FUlIJMHgwMjAwCQkvKiBlbGFzdGljIGJ1ZmYuIGRldC4gb3Zlci18dW5kZXJmbG93Ki8KKyNkZWZpbmUJUExfUEhZSU5WCTB4MDQwMAkJLyogcGh5c2ljYWwgbGF5ZXIgaW52YWxpZCBzaWduYWwgKi8KKyNkZWZpbmUJUExfVlNZTV9DVFIJMHgwODAwCQkvKiB2aW9sYXRpb24gc3ltYm9sIGNvdW50ZXIgaGFzIGluY3IuKi8KKyNkZWZpbmUJUExfTUlOSV9DVFIJMHgxMDAwCQkvKiBkZXAuIG9uIFBMQ19DTlRSTF9BJ3MgTUlOSV9DVFJfSU5UKi8KKyNkZWZpbmUJUExfTEVfQ1RSCTB4MjAwMAkJLyogbGluayBlcnJvciBldmVudCBjb3VudGVyICovCisjZGVmaW5lCVBMX0xTRE8JCTB4NDAwMAkJLyogU0RPIGlucHV0IHBpbiBjaGFuZ2VkIHRvIGEgMSAqLworI2RlZmluZQlQTF9OUF9FUlIJMHg4MDAwCQkvKiBOUCBoYXMgcmVxdWVzdGVkIHRvIHIvdyBhbiBpbnYuIHIuKi8KKworLyoKKyAqIFRoZSBQTEMgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKFBMX0lOVFJfTUFTSzogbG9nLiBhZGRyLiAweDAyKSBjb25zdHIuIGlzCisgKiBlcXVhbCBQTF9JTlRSX0VWRU5UIHJlZ2lzdGVyLgorICogRm9yIGVhY2ggc2V0IGJpdCwgdGhlIHNldHRpbmcgb2YgY29ycmVzcG9uZGluZyBiaXQgZ2VuZXJhdGUgYW4gaW50IHRvIE5QLiAKKyAqLworCisjaWZkZWYJTU9UX0VMTQorLyoKKyAqIFF1YWQgRUxNIENyb3NiYXIgQ29udHJvbCByZWdpc3RlciB2YWx1ZXMgKFFFTE1fWEJBUl8/KQorICovCisjZGVmaW5lCVFFTE1fWE9VVF9JRExFCTB4MDAwMAkJLyogSWRsZXMvUGFzc3Rocm91Z2ggKi8KKyNkZWZpbmUJUUVMTV9YT1VUX1AJMHgwMDAxCQkvKiBPdXRwdXQgdG86IEJ1cyBQICovCisjZGVmaW5lCVFFTE1fWE9VVF9TCTB4MDAwMgkJLyogT3V0cHV0IHRvOiBCdXMgUyAqLworI2RlZmluZQlRRUxNX1hPVVRfUgkweDAwMDMJCS8qIE91dHB1dCB0bzogQnVzIFIgKi8KKyNkZWZpbmUJUUVMTV9YT1VUX1cJMHgwMDA0CQkvKiBPdXRwdXQgdG86IEVMTSBXICovCisjZGVmaW5lCVFFTE1fWE9VVF9YCTB4MDAwNQkJLyogT3V0cHV0IHRvOiBFTE0gWCAqLworI2RlZmluZQlRRUxNX1hPVVRfWQkweDAwMDYJCS8qIE91dHB1dCB0bzogRUxNIFkgKi8KKyNkZWZpbmUJUUVMTV9YT1VUX1oJMHgwMDA3CQkvKiBPdXRwdXQgdG86IEVMTSBaICovCisKKy8qCisgKiBRdWFkIEVMTSBJbnRlcnJ1cHQgZGF0YSBhbmQgZXZlbnQgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lCVFFTE1fTlBfRVJSCSgxPDwxNSkJCS8qIE5vZGUgUHJvY2Vzc29yIEVycm9yICovCisjZGVmaW5lCVFFTE1fQ09VTlRfWgkoMTw8NykJCS8qIENvdW50ZXIgWiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJUUVMTV9DT1VOVF9ZCSgxPDw2KQkJLyogQ291bnRlciBZIEludGVycnVwdCAqLworI2RlZmluZQlRRUxNX0NPVU5UX1gJKDE8PDUpCQkvKiBDb3VudGVyIFggSW50ZXJydXB0ICovCisjZGVmaW5lCVFFTE1fQ09VTlRfVwkoMTw8NCkJCS8qIENvdW50ZXIgVyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJUUVMTV9FTE1fWgkoMTw8MykJCS8qIEVMTSBaIEludGVycnVwdCAqLworI2RlZmluZQlRRUxNX0VMTV9ZCSgxPDwyKQkJLyogRUxNIFkgSW50ZXJydXB0ICovCisjZGVmaW5lCVFFTE1fRUxNX1gJKDE8PDEpCQkvKiBFTE0gWCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJUUVMTV9FTE1fVwkoMTw8MCkJCS8qIEVMTSBXIEludGVycnVwdCAqLworI2VuZGlmCS8qIE1PVF9FTE0gKi8KKy8qCisgKiBQTEMgVGltaW5nIFBhcmFtZXRlcnMKKyAqLworI2RlZmluZQlUUF9DX01JTgkweGZmOWMJLyogICAyICAgIG1zICovCisjZGVmaW5lCVRQX1RMX01JTgkweGZmZjAJLyogICAwLjMgIG1zICovCisjZGVmaW5lCVRQX1RCX01JTgkweGZmMTAJLyogICA1ICAgIG1zICovCisjZGVmaW5lCVRQX1RfT1VUCTB4ZDlkYgkvKiAyMDAgICAgbXMgKi8KKyNkZWZpbmUJVFBfTENfTEVOR1RICTB4ZjY3NgkvKiAgNTAgICAgbXMgKi8KKyNkZWZpbmUJVFBfTENfTE9OR0xOCTB4YTBhMgkvKiA1MDAgICAgbXMgKi8KKyNkZWZpbmUJVFBfVF9TQ1JVQgkweGZmNmQJLyogICAzLjUgIG1zICovCisjZGVmaW5lCVRQX05TX01BWAkweGYwMjEJLyogICAxLjMgICBtcyAqLworCisvKgorICogQklTVCB2YWx1ZXMKKyAqLworI2RlZmluZSBQTENfQklTVAkweDZlY2QJCS8qIEJJU1Qgc2lnbmF0dXJlIGZvciBQTEMgKi8KKyNkZWZpbmUgUExDU19CSVNUCTB4NWI2YiAJCS8qIEJJU1Qgc2lnbmF0dXJlIGZvciBQTEMtUyAqLworI2RlZmluZQlQTENfRUxNX0JfQklTVAkweDZlY2QJCS8qIEJJU1Qgc2lnbmF0dXJlIG9mIEVMTSBSZXYuIEIgKi8KKyNkZWZpbmUJUExDX0VMTV9EX0JJU1QJMHg1YjZiCQkvKiBCSVNUIHNpZ25hdHVyZSBvZiBFTE0gUmV2LiBEICovCisjZGVmaW5lCVBMQ19DQU1fQV9CSVNUCTB4OWU3NQkJLyogQklTVCBzaWduYXR1cmUgb2YgQ0FNRUwgUmV2LiBBICovCisjZGVmaW5lCVBMQ19DQU1fQl9CSVNUCTB4NWI2YgkJLyogQklTVCBzaWduYXR1cmUgb2YgQ0FNRUwgUmV2LiBCICovCisjZGVmaW5lCVBMQ19JRkRfQV9CSVNUCTB4OWU3NQkJLyogQklTVCBzaWduYXR1cmUgb2YgSUZEREkgUmV2LiBBICovCisjZGVmaW5lCVBMQ19JRkRfQl9CSVNUCTB4NWI2YgkJLyogQklTVCBzaWduYXR1cmUgb2YgSUZEREkgUmV2LiBCICovCisjZGVmaW5lCVBMQ19RRUxNX0FfQklTVAkweDViNmIJCS8qIEJJU1Qgc2lnbmF0dXJlIG9mIFFFTE0gUmV2LiBBICovCisKKy8qCisgCUZEREkgYm9hcmQgcmVjb3VyY2VzCQorICovCisKKy8qCisgKiByZXF1ZXN0IHJlZ2lzdGVyIGFycmF5IChsb2cuIGFkZHI6IFJRQV9BICsgYTw8MSB7YT0wLi43fSkgd3JpdGUgb25seS4KKyAqIEl0IHNwZWNpZmllcyB0byBGT1JNQUMrIHRoZSB0eXBlIG9mIGJ1ZmZlciBtZW1vcnkgYWNjZXNzIHRoZSBob3N0IHJlcXVpcmVzLgorICovCisjZGVmaW5lCVJRX05PVAkJMAkJLyogbm90IHJlcXVlc3QgKi8KKyNkZWZpbmUJUlFfUkVTCQkxCQkvKiByZXNlcnZlZCAqLworI2RlZmluZQlSUV9TRlcJCTIJCS8qIHNwZWNpYWwgZnJhbWUgd3JpdGUgKi8KKyNkZWZpbmUJUlFfUlJRCQkzCQkvKiByZWFkIHJlcXVlc3Q6IHJlY2VpdmUgcXVldWUgKi8KKyNkZWZpbmUJUlFfV1NRCQk0CQkvKiB3cml0ZSByZXF1ZXN0OiBzeW5jaHJvbm91cyBxdWV1ZSAqLworI2RlZmluZQlSUV9XQTAJCTUJCS8qIHdyaXRlIHJlcXUuOiBhc3luY2hyb25vdXMgcXVldWUgMCAqLworI2RlZmluZQlSUV9XQTEJCTYJCS8qIHdyaXRlIHJlcXUuOiBhc3luY2hyb25vdXMgcXVldWUgMSAqLworI2RlZmluZQlSUV9XQTIJCTcJCS8qIHdyaXRlIHJlcXUuOiBhc3luY2hyb25vdXMgcXVldWUgMiAqLworCisjZGVmaW5lCVNaX0xPTkcJCShzaXplb2YobG9uZykpCisKKy8qCisgKiBGRERJIGRlZmF1bHRzCisgKiBOT1RFIDogSW4gdGhlIEFOU0kgZG9jcywgdGltZXMgYXJlIHNwZWNpZmllZCBpbiB1bml0cyBvZiAic3ltYm9sIHRpbWUiLgorICogCSAgQU1EIGNoaXBzIHVzZSBCQ0xLIGFzIHVuaXQuIDEgQkNLTCA9PSAyIHN5bWJvbHMKKyAqLworI2RlZmluZQlDT01QTFJFRgkoKHVfbG9uZykzMioyNTYqMjU2KQkvKiB0d28ncyBjb21wbGVtZW50IDIxIGJpdCAqLworI2RlZmluZSBNU1RPQkNMSyh4KQkoKHVfbG9uZykoeCkqMTI1MDBMKQorI2RlZmluZSBNU1RPVFZYKHgpCSgoKHVfbG9uZykoeCkqMTAwMEwpLzgwLzI1NSkKKworI2VuZGlmCS8qIF9TVVBFUk5FVF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC90YXJnZXRody5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL3RhcmdldGh3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJjNDkyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC90YXJnZXRody5oCkBAIC0wLDAgKzEsMTY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCV9UQVJHRVRIV18KKyNkZWZpbmUgX1RBUkdFVEhXXworCisJLyoKKwkgKiAgUENJIFdhdGVybWFyayBkZWZpbml0aW9uCisJICovCisjaWZkZWYJUENJCisjZGVmaW5lCVJYX1dBVEVSTUFSSwkyNAorI2RlZmluZSBUWF9XQVRFUk1BUksJMjQKKyNkZWZpbmUgU0tfTUxfSURfMQkweDIwCisjZGVmaW5lIFNLX01MX0lEXzIJMHgzMAorI2VuZGlmCisKKyNpbmNsdWRlCSJoL3NrZmJpLmgiCisjaWZuZGVmIFRBR19NT0RFCQorI2luY2x1ZGUJImgvZnBsdXMuaCIKKyNlbHNlCisjaW5jbHVkZQkiaC9mcGx1c3RtLmgiCisjZW5kaWYKKworI2lmbmRlZglIV19QVFIKKyNkZWZpbmUgSFdfUFRSICB2b2lkIF9faW9tZW0gKgorI2VuZGlmCisKKyNpZmRlZiBNVUxUX09FTQorI2RlZmluZQlPSV9TVEFUX0xBU1QJCTAJLyogZW5kIG9mIE9FTSBkYXRhIGJhc2UgKi8KKyNkZWZpbmUJT0lfU1RBVF9QUkVTRU5UCQkxCS8qIGVudHJ5IHByZXNlbnQgYnV0IG5vdCBlbXB0eSAqLworI2RlZmluZQlPSV9TVEFUX1ZBTElECQkyCS8qIGhvbGRzIHZhbGlkIElELCBidXQgaXMgbm90IGFjdGl2ZSAqLyAKKyNkZWZpbmUJT0lfU1RBVF9BQ1RJVkUJCTMJLyogaG9sZHMgdmFsaWQgSUQsIGVudHJ5IGlzIGFjdGl2ZSAqLworCQkJCQkvKiBhY3RpdmUgPSBhZGFwdGVyIGlzIHN1cHBvcnRlZCAqLworCisvKiBNZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgSURzIG11c3QgbWF0Y2ggcmVwcmVzZW50YXRpb24gaW4gYWRhcHRlci4gKi8KK3N0cnVjdAlzX29lbV9pZHMgeworCXVfY2hhcglvaV9zdGF0dXMgOwkJLyogU3RhdDogbGFzdCwgcHJlc2VudCwgdmFsaWQsIGFjdGl2ZSAqLworCXVfY2hhcglvaV9tYXJrWzVdIDsJCS8qICJQSUQwMCIgLi4gIlBJRDA3IiAuLgkqLworCXVfY2hhciAJb2lfaWRbNF0gOwkJLyogaWQgYnl0ZXMsIHJlcHJlc2VudGF0aW9uIGFzCSovCisJCQkJCS8qIGRlZmluZWQgYnkgaGFyZHdhcmUsCQkqLwkKKyNpZmRlZiBQQ0kKKwl1X2NoYXIgCW9pX3N1Yl9pZFs0XSA7CQkvKiBzdWIgaWQgYnl0ZXMsIHJlcHJlc2VudGF0aW9uIGFzICovCisJCQkJCS8qIGRlZmluZWQgYnkgaGFyZHdhcmUsCQkqLworI2VuZGlmCisjaWZkZWYgSVNBCisJdV9jaGFyCW9pX2xvZ29fbGVuIDsJCS8qIHRoZSBsZW5ndGggb2YgdGhlIGFkYXB0ZXIgbG9nbyAqLwkKKwl1X2NoYXIJb2lfbG9nb1s2XSA7CQkvKiB0aGUgYWRhcHRlciBsb2dvCQkqLworCXVfY2hhcglvaV9yZXNlcnZlZDEgOworI2VuZGlmCS8qIElTQSAqLworfSA7CisjZW5kaWYJLyogTVVMVF9PRU0gKi8KKworCitzdHJ1Y3Qgc19zbXRfaHcgeworCS8qCisJICogZ2xvYmFsCisJICovCisJSFdfUFRSCWlvcCA7CQkJLyogSU8gYmFzZSBhZGRyZXNzICovCisJc2hvcnQJZG1hIDsJCQkvKiBETUEgY2hhbm5lbCAqLworCXNob3J0CWlycSA7CQkJLyogSVJRIGxldmVsICovCisJc2hvcnQJZXByb20gOwkJCS8qIEZMQVNIIHByb20gKi8KKyNpZm5kZWYJUENJCisJc2hvcnQJRG1hV3JpdGVFeHRyYUJ5dGVzIDsJLyogYWRkIGJ5dGVzIGZvciBETUEgd3JpdGUgKi8KKyNlbmRpZgorCisjaWZuZGVmIFNZTkMKKwl1X3Nob3J0CW5fYV9zZW5kIDsJCS8qIHBlbmRpbmcgc2VuZCByZXF1ZXN0cyAqLworI2VuZGlmCisKKyNpZgkoZGVmaW5lZChFSVNBKSB8fCBkZWZpbmVkKE1DQSkgfHwgZGVmaW5lZChQQ0kpKQorCXNob3J0CXNsb3QgOwkJCS8qIHNsb3QgbnVtYmVyICovCisJc2hvcnQgICBtYXhfc2xvdHMgOwkJLyogbWF4aW11bSBudW1iZXIgb2Ygc2xvdHMgKi8KKyNlbmRpZgorCisjaWYJKGRlZmluZWQoUENJKSB8fCBkZWZpbmVkKE1DQSkpCisJc2hvcnQJd2RvZ191c2VkIDsJCS8qIFRSVUUgaWYgdGhlIHdhdGNoIGRvZyBpcyB1c2VkICovCisjZW5kaWYKKworI2lmZGVmCU1DQQorCXNob3J0CXNsb3RfMzIgOwkJLyogMzJiaXQgc2xvdCAoMSkgb3IgMTZiaXQgc2xvdCAoMCkgKi8KKwlzaG9ydAlyZXYgOwkJCS8qIEJvYXJkIHJldmlzaW9uIChGTXhfUkVWKS4gKi8KKwlzaG9ydAlWRnVsbFJlYWQgOwkJLyogVl9mdWxsIHZhbHVlIGZvciBETUEgcmVhZCAqLworCXNob3J0CVZGdWxsV3JpdGUgOwkJLyogVl9mdWxsIHZhbHVlIGZvciBETUEgd3JpdGUgKi8KKyNlbmRpZgorCisjaWZkZWYJRUlTQQorCXNob3J0CWxlZCA7CQkJLyogTEVEIGZvciBGRSBjYXJkICovCisKKwlzaG9ydAlkbWFfcm1vZGUgOwkJLyogcmVhZCBtb2RlICovCisJc2hvcnQJZG1hX3dtb2RlIDsJCS8qIHdyaXRlIG1vZGUgKi8KKwlzaG9ydAlkbWFfZW1vZGUgOwkJLyogZXh0ZW5kIG1vZGUgKi8KKworCS8qIERNQSBjb250cm9sbGVyIGNoYW5uZWwgZGVwZW5kZW50IGlvIGFkZHJlc3NlcyAqLworCXVfc2hvcnQgZG1hX2Jhc2Vfd29yZF9jb3VudCA7CisJdV9zaG9ydCBkbWFfYmFzZV9hZGRyZXNzIDsKKwl1X3Nob3J0IGRtYV9iYXNlX2FkZHJlc3NfcGFnZSA7CisjZW5kaWYKKworI2lmZGVmCVBDSQorCXVfc2hvcnQJcGNpX2hhbmRsZSA7CQkvKiBoYW5kbGUgdG8gYWNjZXNzIHRoZSBCSU9TIGZ1bmMgKi8KKwl1X2xvbmcJaXNfaW1hc2sgOwkJLyogaW50IG1hc2tlIGZvciB0aGUgaW50IHNvdXJjZSByZWcgKi8KKwl1X2xvbmcJcGh5c19tZW1fYWRkciA7CQkvKiBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcyAqLworCXVfc2hvcnQJbWNfZHVtbXkgOwkJLyogd29yayBhcm91bmQgZm9yIE1DIGNvbXBpbGVyIGJ1ZyAqLwkKKwkvKgorCSAqIHN0YXRlIG9mIHRoZSBoYXJkd2FyZQorCSAqLworCXVfc2hvcnQgaHdfc3RhdGUgOwkJLyogc3RhcnRlZCBvciBzdG9wcGVkICovCisKKyNkZWZpbmUJU1RBUlRFRAkJMQorI2RlZmluZQlTVE9QUEVECQkwCisKKwlpbnQJaHdfaXNfNjRiaXQgOwkJLyogZG9lcyB3ZSBoYXZlIGEgNjQgYml0IGFkYXB0ZXIgKi8KKyNlbmRpZgorCisjaWZkZWYJVEFHX01PREUKKwl1X2xvbmcJcGNpX2ZpeF92YWx1ZSA7CQkvKiB2YWx1ZSBwYXJzZWQgYnkgUENJRklYICovCisjZW5kaWYKKworCS8qCisJICogaHd0LmMKKwkgKi8KKwl1X2xvbmcJdF9zdGFydCA7CQkvKiBIV1Qgc3RhcnQgKi8KKwl1X2xvbmcJdF9zdG9wIDsJCS8qIEhXVCBzdG9wICovCisJdV9zaG9ydAl0aW1lcl9hY3RpdiA7CQkvKiBIV1QgdGltZXIgYWN0aXZlICovCisKKwkvKgorCSAqIFBJQworCSAqLworCXVfY2hhcglwaWNfYTEgOworCXVfY2hhcglwaWNfMjEgOworCisJLyoKKwkgKiBHRU5FUklDIDsgZG8gbm90IG1vZGlmeSBiZXlvbmQgdGhpcyBsaW5lCisJICovCisKKwkvKgorCSAqIHBoeXNpY2FsIGFuZCBjYW5vbmljYWwgYWRkcmVzcworCSAqLworCXN0cnVjdCBmZGRpX2FkZHIgZmRkaV9ob21lX2FkZHIgOworCXN0cnVjdCBmZGRpX2FkZHIgZmRkaV9jYW5vbl9hZGRyIDsKKwlzdHJ1Y3QgZmRkaV9hZGRyIGZkZGlfcGh5c19hZGRyIDsKKworCS8qCisJICogbWFjIHZhcmlhYmxlcworCSAqLworCXN0cnVjdCBtYWNfcGFyYW1ldGVyIG1hY19wYSA7CS8qIHRtaW4sIHRtYXgsIHR2eCwgdHJlcSAuLiAqLworCXN0cnVjdCBtYWNfY291bnRlciBtYWNfY3QgOwkvKiByZWN2LiwgbG9zdCwgZXJyb3IgICovCisJdV9zaG9ydAltYWNfcmluZ19pc191cCA7CS8qIHJpbmcgaXMgdXAgZmxhZyAqLworCisJc3RydWN0IHNfc210X2ZwCWZwIDsJCS8qIGZvcm1hYysgKi8KKworI2lmZGVmIE1VTFRfT0VNCisJc3RydWN0IHNfb2VtX2lkcyAqb2VtX2lkIDsJLyogcG9pbnRlciB0byBzZWxlY3RlZCBpZCAqLworCWludCBvZW1fbWluX3N0YXR1cyA7CQkvKiBJRHMgdG8gdGFrZSBjYXJlIG9mICovCisjZW5kaWYJLyogTVVMVF9PRU0gKi8KKworfSA7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC90YXJnZXRvcy5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL3RhcmdldG9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5NDBlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC90YXJnZXRvcy5oCkBAIC0wLDAgKzEsMTY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJT3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgZHJpdmVyIGFuZAorICoJaGFyZHdhcmUgbW9kdWxlLgorICovCisKKyNpZm5kZWYJVEFSR0VUT1NfSAorI2RlZmluZSBUQVJHRVRPU19ICisKKworLy8tLS0tLS0tLSB0aG9zZSBzaG91bGQgZ28gaW50byBpbmNsdWRlL2xpbnV4L3BjaS5oCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0sJCTB4MTE0OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NLX0ZQCQkweDQwMDAKKy8vLS0tLS0tLS0KKworCisKKy8vLS0tLS0tLS0gdGhvc2Ugc2hvdWxkIGdvIGludG8gaW5jbHVkZS9saW51eC9pZl9mZGRpLmgKKyNkZWZpbmUgRkRESV9NQUNfSERSX0xFTiAxMworCisjZGVmaW5lIEZERElfUklJCTB4MDEgLyogcm91dGluZyBpbmZvcm1hdGlvbiBiaXQgKi8KKyNkZWZpbmUgRkRESV9SQ0ZfRElSX0JJVCAweDgwCisjZGVmaW5lIEZERElfUkNGX0xFTl9NQVNLIDB4MWYKKyNkZWZpbmUgRkRESV9SQ0ZfQlJPQURDQVNUIDB4ODAwMAorI2RlZmluZSBGRERJX1JDRl9MSU1JVEVEX0JST0FEQ0FTVCAweEEwMDAKKyNkZWZpbmUgRkRESV9SQ0ZfRlJBTUUySyAweDIwCisjZGVmaW5lIEZERElfUkNGX0ZSQU1FNEsgMHgzMAorLy8tLS0tLS0tLQorCisKKyN1bmRlZiBBRERSCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mZGRpZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisvLyBpcyByZWRlZmluZWQgYnkgbGludXgsIGJ1dCB3ZSBuZWVkIG91ciBkZWZpbml0aW9uCisjdW5kZWYgQUREUgorI2lmZGVmIE1FTV9NQVBQRURfSU8KKyNkZWZpbmUJQUREUihhKSAoc21jLT5ody5pb3ArKGEpKQorI2Vsc2UKKyNkZWZpbmUJQUREUihhKSAoKChhKT4+NykgPyAob3V0cChzbWMtPmh3LmlvcCtCMF9SQVAsKGEpPj43KSwgKHNtYy0+aHcuaW9wKyggKChhKSYweDdGKSB8ICgoYSk+PjcgPyAweDgwOjApKSApKSA6IChzbWMtPmh3LmlvcCsoKChhKSYweDdGKXwoKGEpPj43ID8gMHg4MDowKSkpKQorI2VuZGlmCisKKyNpbmNsdWRlICJoL2h3bXRtLmgiCisKKyNkZWZpbmUgVFJVRSAgMQorI2RlZmluZSBGQUxTRSAwCisKKy8vIEhXTSBEZWZpbml0aW9ucworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRkRESV9UUkFDRShzdHJpbmcsIGFyZzEsIGFyZzIsIGFyZzMpCS8vIFBlcmZvcm1hbmNlIGFuYWx5c2lzLgorI2lmZGVmIFBDSQorI2RlZmluZSBORERfVFJBQ0Uoc3RyaW5nLCBhcmcxLCBhcmcyLCBhcmczKQkvLyBQZXJmb3JtYW5jZSBhbmFseXNpcy4KKyNlbmRpZgkvLyBQQ0kKKyNkZWZpbmUgU01UX1BBR0VTSVpFCVBBR0VfU0laRQkvLyBTaXplIG9mIGEgbWVtb3J5IHBhZ2UgKHBvd2VyIG9mIDIpLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyBTTVQgRGVmaW5pdGlvbnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lCVRJQ0tTX1BFUl9TRUNPTkQJSFoKKyNkZWZpbmUgU01DX1ZFUlNJT04gICAgCQkxCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy8vIE9TLURyaXZlciBEZWZpbml0aW9ucworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTk9fQUREUkVTUyAweGZmZTAJLyogTm8gRGV2aWNlIChJL08pIEFkZHJlc3MgKi8KKyNkZWZpbmUgU0tGUF9NQVhfTlVNX0JPQVJEUyA4CS8qIG1heGltdW0gbnVtYmVyIG9mIFBDSSBib2FyZHMgKi8KKworI2RlZmluZSBTS19CVVNfVFlQRV9QQ0kJCTAKKyNkZWZpbmUgU0tfQlVTX1RZUEVfRUlTQQkxCisKKyNkZWZpbmUgRlBfSU9fTEVOCQkyNTYJLyogbGVuZ3RoIG9mIElPIGFyZWEgdXNlZCAqLworCisjZGVmaW5lIHU4CXVuc2lnbmVkIGNoYXIKKyNkZWZpbmUgdTE2CXVuc2lnbmVkIHNob3J0CisjZGVmaW5lIHUzMgl1bnNpZ25lZCBpbnQKKworI2RlZmluZSBNQVhfVFhfUVVFVUVfTEVOCTIwIC8vIG51bWJlciBvZiBwYWNrZXRzIHF1ZXVlZCBieSBkcml2ZXIKKyNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUJCTQ1NTAKKworI2RlZmluZQlSWF9MT1dfV0FURVJNQVJLCU5VTV9SRUNFSVZFX0JVRkZFUlMgIC8gMgorI2RlZmluZSBUWF9MT1dfV0FURVJNQVJLCU5VTV9UUkFOU01JVF9CVUZGRVJTIC0gMgorCisvKgorKiogSW5jbHVkZSB0aGUgSU9DVEwgc3R1ZmYKKyovCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCisjZGVmaW5lCVNLRlBJT0NUTAlTSU9DREVWUFJJVkFURQorCitzdHJ1Y3Qgc19za2ZwX2lvY3RsIHsKKwl1bnNpZ25lZCBzaG9ydCBjbWQ7ICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgdG8gcnVuICovCisJdW5zaWduZWQgc2hvcnQgbGVuOyAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyICovCisJdW5zaWduZWQgY2hhciBfX3VzZXIgKmRhdGE7ICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciAqLworfTsKKworLyogCisqKiBSZWNvZ25pc2VkIGlvY3RsIGNvbW1hbmRzIGZvciB0aGUgZHJpdmVyIAorKi8KKyNkZWZpbmUgU0tGUF9HRVRfU1RBVFMJCTB4MDUgLyogR2V0IHRoZSBkcml2ZXIgc3RhdGlzdGljcyAqLworI2RlZmluZSBTS0ZQX0NMUl9TVEFUUwkJMHgwNiAvKiBaZXJvIG91dCB0aGUgZHJpdmVyIHN0YXRpc3RpY3MgKi8KKworLy8gVGhlIHBlci1hZGFwdGVyIGRyaXZlciBzdHJ1Y3R1cmUKK3N0cnVjdCBzX3NtdF9vcyB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dF9tb2R1bGU7CisJdTMyCWJ1c190eXBlOwkJLyogYnVzIHR5cGUgKDAgPT0gUENJLCAxID09IEVJU0EpICovCisJc3RydWN0IHBjaV9kZXYgCXBkZXY7CQkvKiBQQ0kgZGV2aWNlIHN0cnVjdHVyZSAqLworCQorCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyOworCXVuc2lnbmVkIGNoYXIgZmFjdG9yeV9tYWNfYWRkcls4XTsKKwl1bG9uZwlTaGFyZWRNZW1TaXplOworCXVsb25nCVNoYXJlZE1lbUhlYXA7CisJdm9pZCoJU2hhcmVkTWVtQWRkcjsKKwlkbWFfYWRkcl90IFNoYXJlZE1lbURNQTsKKworCXVsb25nCVF1ZXVlU2tiOworCXN0cnVjdAlza19idWZmX2hlYWQgU2VuZFNrYlF1ZXVlOworCisJdWxvbmcJTWF4RnJhbWVTaXplOworCXU4CVJlc2V0UmVxdWVzdGVkOworCisJLy8gTUFDIHN0YXRpc3RpY3Mgc3RydWN0dXJlCisJc3RydWN0IGZkZGlfc3RhdGlzdGljcyBNYWNTdGF0OworCisJLy8gcmVjZWl2ZSBpbnRvIHRoaXMgbG9jYWwgYnVmZmVyIGlmIG5vIHNrYiBhdmFpbGFibGUKKwkvLyBkYXRhIHdpbGwgYmUgbm90IHZhbGlkLCBiZWNhdXNlIG11bHRpcGxlIFJ4RHMgY2FuCisJLy8gcG9pbnQgaGVyZSBhdCB0aGUgc2FtZSB0aW1lLCBpdCBtdXN0IGJlIGF0IGxlYXN0CisJLy8gTUFYX0ZSQU1FX1NJWkUgYnl0ZXMgaW4gc2l6ZQorCXVuc2lnbmVkIGNoYXIgKkxvY2FsUnhCdWZmZXI7CisJZG1hX2FkZHJfdCBMb2NhbFJ4QnVmZmVyRE1BOworCQorCS8vIFZlcnNpb24gKHJlcXVpcmVkIGJ5IFNNVCBtb2R1bGUpLgorCXVfbG9uZyBzbWNfdmVyc2lvbiA7CisKKwkvLyBSZXF1aXJlZCBieSBIYXJkd2FyZSBNb2R1bGUgKEhXTSkuCisJc3RydWN0IGh3X21vZHVsIGh3bSA7CisJCisJLy8gRm9yIFNNUC1zYXZldHkKKwlzcGlubG9ja190IERyaXZlckxvY2s7CisJCit9OworCit0eXBlZGVmIHN0cnVjdCBzX3NtdF9vcyBza2ZkZGlfcHJpdjsKKworI2VuZGlmCSAvLyBfVEFSR0VUT1NfCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvdHlwZXMuaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhM2JmODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvdHlwZXMuaApAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZQk8bGludXgvdHlwZXMuaD4KKy8qCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUJhc2ljIFNNVCBzeXN0ZW0gdHlwZXMKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmbmRlZiBfVFlQRVNfCisjZGVmaW5lCV9UWVBFU18KKworI2RlZmluZSBfcGFja2VkCisjaWZuZGVmIGZhcgorI2RlZmluZSBmYXIKKyNlbmRpZgorI2lmbmRlZiBfZmFyCisjZGVmaW5lIF9mYXIKKyNlbmRpZgorCisjZGVmaW5lIGlucChwKSAgaW9yZWFkOChwKQorI2RlZmluZSBpbnB3KHApCWlvcmVhZDE2KHApCisjZGVmaW5lIGlucGQocCkgaW9yZWFkMzIocCkKKyNkZWZpbmUgb3V0cChwLGMpICBpb3dyaXRlOChjLHApCisjZGVmaW5lIG91dHB3KHAscykgaW93cml0ZTE2KHMscCkKKyNkZWZpbmUgb3V0cGQocCxsKSBpb3dyaXRlMzIobCxwKQorCisjZW5kaWYJLyogX1RZUEVTXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9od210bS5jIGIvZHJpdmVycy9uZXQvc2tmcC9od210bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDQyOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2h3bXRtLmMKQEAgLTAsMCArMSwyMjE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCWxpbnQKK3N0YXRpYyBjaGFyIGNvbnN0IElEX3NjY3NbXSA9ICJAKCMpaHdtdG0uYwkxLjQwIDk5LzA1LzMxIChDKSBTSyIgOworI2VuZGlmCisKKyNkZWZpbmUJSFdNVE0KKworI2lmbmRlZiBGRERJCisjZGVmaW5lCUZEREkKKyNlbmRpZgorCisjaW5jbHVkZSAiaC90eXBlcy5oIgorI2luY2x1ZGUgImgvZmRkaS5oIgorI2luY2x1ZGUgImgvc21jLmgiCisjaW5jbHVkZSAiaC9zdXBlcm5fMi5oIgorI2luY2x1ZGUgImgvc2tmYmlpbmMuaCIKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJRE9DVU1FTlRBVElPTgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlCRUdJTl9NQU5VQUxfRU5UUlkoRE9DVU1FTlRBVElPTikKKworCQkJVCBCIEQKKworCUVORF9NQU5VQUxfRU5UUlkKKyovCisvKgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlMT0NBTCBWQVJJQUJMRVM6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNpZmRlZiBDT01NT05fTUJfUE9PTAorc3RhdGljCVNNYnVmICptYl9zdGFydCA9IDAgOworc3RhdGljCVNNYnVmICptYl9mcmVlID0gMCA7CitzdGF0aWMJaW50IG1iX2luaXQgPSBGQUxTRSA7CitzdGF0aWMJaW50IGNhbGxfY291bnQgPSAwIDsKKyNlbmRpZgorCisvKgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlFWFRFUk5FIFZBUklBQkxFUzoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZkZWYJREVCVUcKKyNpZm5kZWYJREVCVUdfQlJECitleHRlcm4Jc3RydWN0IHNtdF9kZWJ1ZwlkZWJ1ZyA7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYJTkRJU19PUzIKK2V4dGVybgl1X2NoYXIJb2ZmRGVwdGggOworZXh0ZXJuCXVfY2hhcglmb3JjZV9pcnFfcGVuZGluZyA7CisjZW5kaWYKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTE9DQUwgRlVOQ1RJT05TOgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3N0YXRpYyB2b2lkIHF1ZXVlX2xsY19yeChzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iKTsKK3N0YXRpYyB2b2lkIHNtdF90b19sbGMoc3RydWN0IHNfc21jICpzbWMsIFNNYnVmICptYik7CitzdGF0aWMgdm9pZCBpbml0X3R4ZF9yaW5nKHN0cnVjdCBzX3NtYyAqc21jKTsKK3N0YXRpYyB2b2lkIGluaXRfcnhkX3Jpbmcoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgcXVldWVfdHhkX21iKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIpOworc3RhdGljIHVfbG9uZyBpbml0X2Rlc2NyX3Jpbmcoc3RydWN0IHNfc21jICpzbWMsIHVuaW9uIHNfZnBfZGVzY3Igdm9sYXRpbGUgKnN0YXJ0LAorCQkJICAgICAgaW50IGNvdW50KTsKK3N0YXRpYyB1X2xvbmcgcmVwYWlyX3R4ZF9yaW5nKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19zbXRfdHhfcXVldWUgKnF1ZXVlKTsKK3N0YXRpYyB1X2xvbmcgcmVwYWlyX3J4ZF9yaW5nKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19zbXRfcnhfcXVldWUgKnF1ZXVlKTsKK3N0YXRpYyBTTWJ1ZiogZ2V0X2xsY19yeChzdHJ1Y3Qgc19zbWMgKnNtYyk7CitzdGF0aWMgU01idWYqIGdldF90eGRfbWIoc3RydWN0IHNfc21jICpzbWMpOworCisvKgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlFWFRFUk5BTCBGVU5DVElPTlM6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKy8qCVRoZSBleHRlcm5hbCBTTVQgZnVuY3Rpb25zIGFyZSBsaXN0ZWQgaW4gY210ZGVmLmggKi8KKworZXh0ZXJuIHZvaWQqIG1hY19kcnZfZ2V0X3NwYWNlKHN0cnVjdCBzX3NtYyAqc21jLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCogbWFjX2Rydl9nZXRfZGVzY19tZW0oc3RydWN0IHNfc21jICpzbWMsIHVuc2lnbmVkIGludCBzaXplKTsKK2V4dGVybiB2b2lkIGluaXRfYm9hcmQoc3RydWN0IHNfc21jICpzbWMsIHVfY2hhciAqbWFjX2FkZHIpOworZXh0ZXJuIHZvaWQgbWFjX2Rydl9maWxsX3J4ZChzdHJ1Y3Qgc19zbWMgKnNtYyk7CitleHRlcm4gdm9pZCBwbGMxX2lycShzdHJ1Y3Qgc19zbWMgKnNtYyk7CitleHRlcm4gdm9pZCBtYWNfZHJ2X3R4X2NvbXBsZXRlKHN0cnVjdCBzX3NtYyAqc21jLAorCQkJCXZvbGF0aWxlIHN0cnVjdCBzX3NtdF9mcF90eGQgKnR4ZCk7CitleHRlcm4gdm9pZCBwbGMyX2lycShzdHJ1Y3Qgc19zbWMgKnNtYyk7CitleHRlcm4gdm9pZCBtYWMxX2lycShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9zaG9ydCBzdHUsIHVfc2hvcnQgc3RsKTsKK2V4dGVybiB2b2lkIG1hYzJfaXJxKHN0cnVjdCBzX3NtYyAqc21jLCB1X3Nob3J0IGNvZGVfczJ1LCB1X3Nob3J0IGNvZGVfczJsKTsKK2V4dGVybiB2b2lkIG1hYzNfaXJxKHN0cnVjdCBzX3NtYyAqc21jLCB1X3Nob3J0IGNvZGVfczN1LCB1X3Nob3J0IGNvZGVfczNsKTsKK2V4dGVybiB2b2lkIHRpbWVyX2lycShzdHJ1Y3Qgc19zbWMgKnNtYyk7CitleHRlcm4gdm9pZCBtYWNfZHJ2X3J4X2NvbXBsZXRlKHN0cnVjdCBzX3NtYyAqc21jLAorCQkJCXZvbGF0aWxlIHN0cnVjdCBzX3NtdF9mcF9yeGQgKnJ4ZCwKKwkJCQlpbnQgZnJhZ19jb3VudCwgaW50IGxlbik7CitleHRlcm4gdm9pZCBtYWNfZHJ2X3JlcXVldWVfcnhkKHN0cnVjdCBzX3NtYyAqc21jLCAKKwkJCQl2b2xhdGlsZSBzdHJ1Y3Qgc19zbXRfZnBfcnhkICpyeGQsCisJCQkJaW50IGZyYWdfY291bnQpOworZXh0ZXJuIHZvaWQgaW5pdF9wbGMoc3RydWN0IHNfc21jICpzbWMpOworZXh0ZXJuIHZvaWQgbWFjX2Rydl9jbGVhcl9yeGQoc3RydWN0IHNfc21jICpzbWMsCisJCQkgICAgICB2b2xhdGlsZSBzdHJ1Y3Qgc19zbXRfZnBfcnhkICpyeGQsIGludCBmcmFnX2NvdW50KTsKKworI2lmZGVmCVVTRV9PU19DUFkKK2V4dGVybiB2b2lkIGh3bV9jcHlfcnhkMm1iKHZvaWQpOworZXh0ZXJuIHZvaWQgaHdtX2NweV90eGQybWIodm9pZCk7CisjZW5kaWYKKworI2lmZGVmCUFMTF9SWF9DT01QTEVURQorZXh0ZXJuIHZvaWQgbWFjX2Rydl9hbGxfcmVjZWl2ZXNfY29tcGxldGUodm9pZCk7CisjZW5kaWYKKworZXh0ZXJuIHVfbG9uZyBtYWNfZHJ2X3ZpcnQycGh5cyhzdHJ1Y3Qgc19zbWMgKnNtYywgdm9pZCAqdmlydCk7CitleHRlcm4gdV9sb25nIGRtYV9tYXN0ZXIoc3RydWN0IHNfc21jICpzbWMsIHZvaWQgKnZpcnQsIGludCBsZW4sIGludCBmbGFnKTsKKworI2lmZGVmCU5ESVNfT1MyCitleHRlcm4gdm9pZCBwb3N0X3Byb2Modm9pZCk7CisjZWxzZQorZXh0ZXJuIHZvaWQgZG1hX2NvbXBsZXRlKHN0cnVjdCBzX3NtYyAqc21jLCB2b2xhdGlsZSB1bmlvbiBzX2ZwX2Rlc2NyICpkZXNjciwKKwkJCSBpbnQgZmxhZyk7CisjZW5kaWYKKworZXh0ZXJuIGludCBpbml0X2ZwbHVzKHN0cnVjdCBzX3NtYyAqc21jKTsKK2V4dGVybiBpbnQgbWFjX2Rydl9yeF9pbml0KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbGVuLCBpbnQgZmMsIGNoYXIgKmxvb2tfYWhlYWQsCisJCQkgICBpbnQgbGFfbGVuKTsKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUFVCTElDIEZVTkNUSU9OUzoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwordm9pZCBwcm9jZXNzX3JlY2VpdmUoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBmZGRpX2lzcihzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIG1hY19kcnZfY2xlYXJfdHhkKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgc210X2ZyZWVfbWJ1ZihzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iKTsKK3ZvaWQgaW5pdF9kcml2ZXJfZnBsdXMoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBtYWNfZHJ2X3J4X21vZGUoc3RydWN0IHNfc21jICpzbWMsIGludCBtb2RlKTsKK3ZvaWQgaW5pdF9mZGRpX2RyaXZlcihzdHJ1Y3Qgc19zbWMgKnNtYywgdV9jaGFyICptYWNfYWRkcik7Cit2b2lkIG1hY19kcnZfY2xlYXJfdHhfcXVldWUoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBtYWNfZHJ2X2NsZWFyX3J4X3F1ZXVlKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgaHdtX3R4X2ZyYWcoc3RydWN0IHNfc21jICpzbWMsIGNoYXIgZmFyICp2aXJ0LCB1X2xvbmcgcGh5cywgaW50IGxlbiwKKwkJIGludCBmcmFtZV9zdGF0dXMpOwordm9pZCBod21fcnhfZnJhZyhzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciBmYXIgKnZpcnQsIHVfbG9uZyBwaHlzLCBpbnQgbGVuLAorCQkgaW50IGZyYW1lX3N0YXR1cyk7CisKK2ludCBtYWNfZHJ2X3J4X2ZyYWcoc3RydWN0IHNfc21jICpzbWMsIHZvaWQgZmFyICp2aXJ0LCBpbnQgbGVuKTsKK2ludCBtYWNfZHJ2X2luaXQoc3RydWN0IHNfc21jICpzbWMpOworaW50IGh3bV90eF9pbml0KHN0cnVjdCBzX3NtYyAqc21jLCB1X2NoYXIgZmMsIGludCBmcmFnX2NvdW50LCBpbnQgZnJhbWVfbGVuLAorCQlpbnQgZnJhbWVfc3RhdHVzKTsKKwordV9pbnQgbWFjX2Rydl9jaGVja19zcGFjZSh2b2lkKTsKKworU01idWYqIHNtdF9nZXRfbWJ1ZihzdHJ1Y3Qgc19zbWMgKnNtYyk7CisKKyNpZmRlZiBERUJVRworCXZvaWQgbWFjX2Rydl9kZWJ1Z19sZXYodm9pZCk7CisjZW5kaWYKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTUFDUk9TOgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjaWZuZGVmCVVOVVNFRAorI2lmZGVmCWxpbnQKKyNkZWZpbmUgVU5VU0VEKHgpCSh4KSA9ICh4KQorI2Vsc2UKKyNkZWZpbmUgVU5VU0VEKHgpCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYJVVNFX0NBTl9BRERSCisjZGVmaW5lIE1BCQlzbWMtPmh3LmZkZGlfY2Fub25fYWRkci5hCisjZGVmaW5lCUdST1VQX0FERFJfQklUCTB4MDEKKyNlbHNlCisjZGVmaW5lCU1BCQlzbWMtPmh3LmZkZGlfaG9tZV9hZGRyLmEKKyNkZWZpbmUJR1JPVVBfQUREUl9CSVQJMHg4MAorI2VuZGlmCisKKyNkZWZpbmUgUlhEX1RYRF9DT1VOVAkoSFdNX0FTWU5DX1RYRF9DT1VOVCtIV01fU1lOQ19UWERfQ09VTlQrXAorCQkJU01UX1IxX1JYRF9DT1VOVCtTTVRfUjJfUlhEX0NPVU5UKQorCisjaWZkZWYJTUJfT1VUU0lERV9TTUMKKyNkZWZpbmUJRVhUX1ZJUlRfTUVNCSgoUlhEX1RYRF9DT1VOVCsxKSpzaXplb2Yoc3RydWN0IHNfc210X2ZwX3R4ZCkgK1wKKwkJCU1BWF9NQlVGKnNpemVvZihTTWJ1ZikpCisjZGVmaW5lCUVYVF9WSVJUX01FTV8yCSgoUlhEX1RYRF9DT1VOVCsxKSpzaXplb2Yoc3RydWN0IHNfc210X2ZwX3R4ZCkpCisjZWxzZQorI2RlZmluZQlFWFRfVklSVF9NRU0JKChSWERfVFhEX0NPVU5UKzEpKnNpemVvZihzdHJ1Y3Qgc19zbXRfZnBfdHhkKSkKKyNlbmRpZgorCisJLyoKKwkgKiBkZWZpbmUgY3JpdGljYWwgcmVhZCBmb3IgMTYgQml0IGRyaXZlcnMKKwkgKi8KKyNpZglkZWZpbmVkKE5ESVNfT1MyKSB8fCBkZWZpbmVkKE9ESTIpCisjZGVmaW5lIENSX1JFQUQodmFyKQkoKHZhcikgJiAweGZmZmYwMDAwIHwgKCh2YXIpICYgMHhmZmZmKSkKKyNlbHNlCisjZGVmaW5lIENSX1JFQUQodmFyKQkodV9sb25nKSh2YXIpCisjZW5kaWYKKworI2RlZmluZSBJTUFTS19TTE9XCShJU19QTElOVDEgfCBJU19QTElOVDIgfCBJU19USU1JTlQgfCBJU19UT0tFTiB8IFwKKwkJCSBJU19NSU5UUjEgfCBJU19NSU5UUjIgfCBJU19NSU5UUjMgfCBJU19SMV9QIHwgXAorCQkJIElTX1IxX0MgfCBJU19YQV9DIHwgSVNfWFNfQykKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSU5JVC0gQU5EIFNNVCBGVU5DVElPTlM6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKG1hY19kcnZfY2hlY2tfc3BhY2UpCisgKgl1X2ludCBtYWNfZHJ2X2NoZWNrX3NwYWNlKCkKKyAqCisgKglmdW5jdGlvbglET1dOQ0FMTAkoZHJ2c3IuYykKKyAqCQkJVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBuZWVkZWQgbm9uIHZpcnR1YWwKKyAqCQkJbWVtb3J5IGZvciBNQnVmcywgUnhEIGFuZCBUeEQgZGVzY3JpcHRvcnMgZXRjLgorICoJCQluZWVkZWQgYnkgdGhlIGRyaXZlci4KKyAqCisgKglyZXR1cm4JCXVfaW50CW1lbW9yeSBpbiBieXRlcworICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLwordV9pbnQgbWFjX2Rydl9jaGVja19zcGFjZSh2b2lkKQoreworI2lmZGVmCU1CX09VVFNJREVfU01DCisjaWZkZWYJQ09NTU9OX01CX1BPT0wKKwljYWxsX2NvdW50KysgOworCWlmIChjYWxsX2NvdW50ID09IDEpIHsKKwkJcmV0dXJuKEVYVF9WSVJUX01FTSkgOworCX0KKwllbHNlIHsKKwkJcmV0dXJuKEVYVF9WSVJUX01FTV8yKSA7CisJfQorI2Vsc2UKKwlyZXR1cm4gKEVYVF9WSVJUX01FTSkgOworI2VuZGlmCisjZWxzZQorCXJldHVybiAoMCkgOworI2VuZGlmCit9CisKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkobWFjX2Rydl9pbml0KQorICoJdm9pZCBtYWNfZHJ2X2luaXQoc21jKQorICoKKyAqCWZ1bmN0aW9uCURPV05DQUxMCShkcnZzci5jKQorICoJCQlJbiB0aGlzIGZ1bmN0aW9uIHRoZSBoYXJkd2FyZSBtb2R1bGUgYWxsb2NhdGVzIGl0J3MKKyAqCQkJbWVtb3J5LgorICoJCQlUaGUgb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQgbW9kdWxlIHNob3VsZCBjYWxsCisgKgkJCW1hY19kcnZfaW5pdCBvbmNlLCBhZnRlciB0aGUgYWRhdHBlciBpcyBkZXRlY3RlZC4KKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLworaW50IG1hY19kcnZfaW5pdChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlpZiAoc2l6ZW9mKHN0cnVjdCBzX3NtdF9mcF9yeGQpICUgMTYpIHsKKwkJU01UX1BBTklDKHNtYyxIV01fRTAwMDEsSFdNX0UwMDAxX01TRykgOworCX0KKwlpZiAoc2l6ZW9mKHN0cnVjdCBzX3NtdF9mcF90eGQpICUgMTYpIHsKKwkJU01UX1BBTklDKHNtYyxIV01fRTAwMDIsSFdNX0UwMDAyX01TRykgOworCX0KKworCS8qCisJICogZ2V0IHRoZSByZXF1aXJlZCBtZW1vcnkgZm9yIHRoZSBSeERzIGFuZCBUeERzCisJICovCisJaWYgKCEoc21jLT5vcy5od20uZGVzY3JfcCA9ICh1bmlvbiBzX2ZwX2Rlc2NyIHZvbGF0aWxlICopCisJCW1hY19kcnZfZ2V0X2Rlc2NfbWVtKHNtYywodV9pbnQpCisJCShSWERfVFhEX0NPVU5UKzEpKnNpemVvZihzdHJ1Y3Qgc19zbXRfZnBfdHhkKSkpKSB7CisJCXJldHVybigxKSA7CS8qIG5vIHNwYWNlIHRoZSBod20gbW9kdWwgY2FuJ3Qgd29yayAqLworCX0KKworCS8qCisJICogZ2V0IHRoZSBtZW1vcnkgZm9yIHRoZSBTTVQgTUJ1ZnMKKwkgKi8KKyNpZm5kZWYJTUJfT1VUU0lERV9TTUMKKwlzbWMtPm9zLmh3bS5tYnVmX3Bvb2wubWJfc3RhcnQ9KFNNYnVmICopKCZzbWMtPm9zLmh3bS5tYnVmX3Bvb2wubWJbMF0pIDsKKyNlbHNlCisjaWZuZGVmCUNPTU1PTl9NQl9QT09MCisJaWYgKCEoc21jLT5vcy5od20ubWJ1Zl9wb29sLm1iX3N0YXJ0ID0gKFNNYnVmICopIG1hY19kcnZfZ2V0X3NwYWNlKHNtYywKKwkJTUFYX01CVUYqc2l6ZW9mKFNNYnVmKSkpKSB7CisJCXJldHVybigxKSA7CS8qIG5vIHNwYWNlIHRoZSBod20gbW9kdWwgY2FuJ3Qgd29yayAqLworCX0KKyNlbHNlCisJaWYgKCFtYl9zdGFydCkgeworCQlpZiAoIShtYl9zdGFydCA9IChTTWJ1ZiAqKSBtYWNfZHJ2X2dldF9zcGFjZShzbWMsCisJCQlNQVhfTUJVRipzaXplb2YoU01idWYpKSkpIHsKKwkJCXJldHVybigxKSA7CS8qIG5vIHNwYWNlIHRoZSBod20gbW9kdWwgY2FuJ3Qgd29yayAqLworCQl9CisJfQorI2VuZGlmCisjZW5kaWYKKwlyZXR1cm4gKDApIDsKK30KKworLyoKKyAqCUJFR0lOX01BTlVBTF9FTlRSWShpbml0X2RyaXZlcl9mcGx1cykKKyAqCWluaXRfZHJpdmVyX2ZwbHVzKHNtYykKKyAqCisgKiBTZXRzIGhhcmR3YXJlIG1vZHVsIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIG1vZGUgcmVnaXN0ZXIgMgorICogKGUuZy4gdGhlIGJ5dGUgYWxpZ25tZW50IGZvciB0aGUgcmVjZWl2ZWQgZnJhbWVzLCB0aGUgcG9zaXRpb24gb2YgdGhlCisgKgkgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBldGMuKQorICoJRU5EX01BTlVBTF9FTlRSWQorICovCit2b2lkIGluaXRfZHJpdmVyX2ZwbHVzKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXNtYy0+aHcuZnAubWRyMmluaXQgPSBGTV9MU0IgfCBGTV9CTU1PREUgfCBGTV9FTk5QUlEgfCBGTV9FTkhTUlEgfCAzIDsKKworI2lmZGVmCVBDSQorCXNtYy0+aHcuZnAubWRyMmluaXQgfD0gRk1fQ0hLUEFSIHwgRk1fUEFSSVRZIDsKKyNlbmRpZgorCXNtYy0+aHcuZnAubWRyM2luaXQgPSBGTV9NRU5SUUFVTkxDSyB8IEZNX01FTlJTIDsKKworI2lmZGVmCVVTRV9DQU5fQUREUgorCS8qIGVuYWJsZSBhZGRyZXNzIGJpdCBzd2FwcGluZyAqLworCXNtYy0+aHcuZnAuZnJzZWxyZWdfaW5pdCA9IEZNX0VOWE1UQURTV0FQIHwgRk1fRU5SQ1ZBRFNXQVAgOworI2VuZGlmCit9CisKK3N0YXRpYyB1X2xvbmcgaW5pdF9kZXNjcl9yaW5nKHN0cnVjdCBzX3NtYyAqc21jLAorCQkJICAgICAgdW5pb24gc19mcF9kZXNjciB2b2xhdGlsZSAqc3RhcnQsCisJCQkgICAgICBpbnQgY291bnQpCit7CisJaW50IGkgOworCXVuaW9uIHNfZnBfZGVzY3Igdm9sYXRpbGUgKmQxIDsKKwl1bmlvbiBzX2ZwX2Rlc2NyIHZvbGF0aWxlICpkMiA7CisJdV9sb25nCXBoeXMgOworCisJREJfR0VOKCJkZXNjciByaW5nIHN0YXJ0cyBhdCA9ICV4ICIsKHZvaWQgKilzdGFydCwwLDMpIDsKKwlmb3IgKGk9Y291bnQtMSwgZDE9c3RhcnQ7IGkgOyBpLS0pIHsKKwkJZDIgPSBkMSA7CisJCWQxKysgOwkJLyogZGVzY3IgaXMgb3duZWQgYnkgdGhlIGhvc3QgKi8KKwkJZDItPnIucnhkX3JiY3RybCA9IEFJWF9SRVZFUlNFKEJNVV9DSEVDSykgOworCQlkMi0+ci5yeGRfbmV4dCA9ICZkMS0+ciA7CisJCXBoeXMgPSBtYWNfZHJ2X3ZpcnQycGh5cyhzbWMsKHZvaWQgKilkMSkgOworCQlkMi0+ci5yeGRfbnJkYWRyID0gQUlYX1JFVkVSU0UocGh5cykgOworCX0KKwlEQl9HRU4oImRlc2NyIHJpbmcgZW5kcyBhdCA9ICV4ICIsKHZvaWQgKilkMSwwLDMpIDsKKwlkMS0+ci5yeGRfcmJjdHJsID0gQUlYX1JFVkVSU0UoQk1VX0NIRUNLKSA7CisJZDEtPnIucnhkX25leHQgPSAmc3RhcnQtPnIgOworCXBoeXMgPSBtYWNfZHJ2X3ZpcnQycGh5cyhzbWMsKHZvaWQgKilzdGFydCkgOworCWQxLT5yLnJ4ZF9ucmRhZHIgPSBBSVhfUkVWRVJTRShwaHlzKSA7CisKKwlmb3IgKGk9Y291bnQsIGQxPXN0YXJ0OyBpIDsgaS0tKSB7CisJCURSVl9CVUZfRkxVU0goJmQxLT5yLERESV9ETUFfU1lOQ19GT1JERVYpIDsKKwkJZDErKzsKKwl9CisJcmV0dXJuKHBoeXMpIDsKK30KKworc3RhdGljIHZvaWQgaW5pdF90eGRfcmluZyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3Qgc19zbXRfZnBfdHhkIHZvbGF0aWxlICpkcyA7CisJc3RydWN0IHNfc210X3R4X3F1ZXVlICpxdWV1ZSA7CisJdV9sb25nCXBoeXMgOworCisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9ycworCSAqLworCWRzID0gKHN0cnVjdCBzX3NtdF9mcF90eGQgdm9sYXRpbGUgKikgKChjaGFyICopc21jLT5vcy5od20uZGVzY3JfcCArCisJCVNNVF9SMV9SWERfQ09VTlQqc2l6ZW9mKHN0cnVjdCBzX3NtdF9mcF9yeGQpKSA7CisJcXVldWUgPSBzbWMtPmh3LmZwLnR4W1FVRVVFX0EwXSA7CisJREJfR0VOKCJJbml0IGFzeW5jIFR4RCByaW5nLCAlZCBUeERzICIsSFdNX0FTWU5DX1RYRF9DT1VOVCwwLDMpIDsKKwkodm9pZClpbml0X2Rlc2NyX3Jpbmcoc21jLCh1bmlvbiBzX2ZwX2Rlc2NyIHZvbGF0aWxlICopZHMsCisJCUhXTV9BU1lOQ19UWERfQ09VTlQpIDsKKwlwaHlzID0gQUlYX1JFVkVSU0UoZHMtPnR4ZF9udGRhZHIpIDsKKwlkcysrIDsKKwlxdWV1ZS0+dHhfY3Vycl9wdXQgPSBxdWV1ZS0+dHhfY3Vycl9nZXQgPSBkcyA7CisJZHMtLSA7CisJcXVldWUtPnR4X2ZyZWUgPSBIV01fQVNZTkNfVFhEX0NPVU5UIDsKKwlxdWV1ZS0+dHhfdXNlZCA9IDAgOworCW91dHBkKEFERFIoQjVfWEFfREEpLHBoeXMpIDsKKworCWRzID0gKHN0cnVjdCBzX3NtdF9mcF90eGQgdm9sYXRpbGUgKikgKChjaGFyICopZHMgKworCQlIV01fQVNZTkNfVFhEX0NPVU5UKnNpemVvZihzdHJ1Y3Qgc19zbXRfZnBfdHhkKSkgOworCXF1ZXVlID0gc21jLT5ody5mcC50eFtRVUVVRV9TXSA7CisJREJfR0VOKCJJbml0IHN5bmMgVHhEIHJpbmcsICVkIFR4RHMgIixIV01fU1lOQ19UWERfQ09VTlQsMCwzKSA7CisJKHZvaWQpaW5pdF9kZXNjcl9yaW5nKHNtYywodW5pb24gc19mcF9kZXNjciB2b2xhdGlsZSAqKWRzLAorCQlIV01fU1lOQ19UWERfQ09VTlQpIDsKKwlwaHlzID0gQUlYX1JFVkVSU0UoZHMtPnR4ZF9udGRhZHIpIDsKKwlkcysrIDsKKwlxdWV1ZS0+dHhfY3Vycl9wdXQgPSBxdWV1ZS0+dHhfY3Vycl9nZXQgPSBkcyA7CisJcXVldWUtPnR4X2ZyZWUgPSBIV01fU1lOQ19UWERfQ09VTlQgOworCXF1ZXVlLT50eF91c2VkID0gMCA7CisJb3V0cGQoQUREUihCNV9YU19EQSkscGh5cykgOworfQorCitzdGF0aWMgdm9pZCBpbml0X3J4ZF9yaW5nKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXN0cnVjdCBzX3NtdF9mcF9yeGQgdm9sYXRpbGUgKmRzIDsKKwlzdHJ1Y3Qgc19zbXRfcnhfcXVldWUgKnF1ZXVlIDsKKwl1X2xvbmcJcGh5cyA7CisKKwkvKgorCSAqIGluaXRpYWxpemUgdGhlIHJlY2VpdmUgZGVzY3JpcHRvcnMKKwkgKi8KKwlkcyA9IChzdHJ1Y3Qgc19zbXRfZnBfcnhkIHZvbGF0aWxlICopIHNtYy0+b3MuaHdtLmRlc2NyX3AgOworCXF1ZXVlID0gc21jLT5ody5mcC5yeFtRVUVVRV9SMV0gOworCURCX0dFTigiSW5pdCBSeEQgcmluZywgJWQgUnhEcyAiLFNNVF9SMV9SWERfQ09VTlQsMCwzKSA7CisJKHZvaWQpaW5pdF9kZXNjcl9yaW5nKHNtYywodW5pb24gc19mcF9kZXNjciB2b2xhdGlsZSAqKWRzLAorCQlTTVRfUjFfUlhEX0NPVU5UKSA7CisJcGh5cyA9IEFJWF9SRVZFUlNFKGRzLT5yeGRfbnJkYWRyKSA7CisJZHMrKyA7CisJcXVldWUtPnJ4X2N1cnJfcHV0ID0gcXVldWUtPnJ4X2N1cnJfZ2V0ID0gZHMgOworCXF1ZXVlLT5yeF9mcmVlID0gU01UX1IxX1JYRF9DT1VOVCA7CisJcXVldWUtPnJ4X3VzZWQgPSAwIDsKKwlvdXRwZChBRERSKEI0X1IxX0RBKSxwaHlzKSA7Cit9CisKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkoaW5pdF9mZGRpX2RyaXZlcikKKyAqCXZvaWQgaW5pdF9mZGRpX2RyaXZlcihzbWMsbWFjX2FkZHIpCisgKgorICogaW5pdGlhbGl6ZXMgdGhlIGRyaXZlciBhbmQgaXQncyB2YXJpYWJsZXMKKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KK3ZvaWQgaW5pdF9mZGRpX2RyaXZlcihzdHJ1Y3Qgc19zbWMgKnNtYywgdV9jaGFyICptYWNfYWRkcikKK3sKKwlTTWJ1ZgkqbWIgOworCWludAlpIDsKKworCWluaXRfYm9hcmQoc21jLG1hY19hZGRyKSA7CisJKHZvaWQpaW5pdF9mcGx1cyhzbWMpIDsKKworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgU01idWZzIGZvciB0aGUgU01UCisJICovCisjaWZuZGVmCUNPTU1PTl9NQl9QT09MCisJbWIgPSBzbWMtPm9zLmh3bS5tYnVmX3Bvb2wubWJfc3RhcnQgOworCXNtYy0+b3MuaHdtLm1idWZfcG9vbC5tYl9mcmVlID0gKFNNYnVmICopTlVMTCA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9NQlVGOyBpKyspIHsKKwkJbWItPnNtX3VzZV9jb3VudCA9IDEgOworCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikJOworCQltYisrIDsKKwl9CisjZWxzZQorCW1iID0gbWJfc3RhcnQgOworCWlmICghbWJfaW5pdCkgeworCQltYl9mcmVlID0gMCA7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTUJVRjsgaSsrKSB7CisJCQltYi0+c21fdXNlX2NvdW50ID0gMSA7CisJCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikJOworCQkJbWIrKyA7CisJCX0KKwkJbWJfaW5pdCA9IFRSVUUgOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSBvdGhlciB2YXJpYWJsZXMKKwkgKi8KKwlzbWMtPm9zLmh3bS5sbGNfcnhfcGlwZSA9IHNtYy0+b3MuaHdtLmxsY19yeF90YWlsID0gKFNNYnVmICopTlVMTCA7CisJc21jLT5vcy5od20udHhkX3R4X3BpcGUgPSBzbWMtPm9zLmh3bS50eGRfdHhfdGFpbCA9IE5VTEwgOworCXNtYy0+b3MuaHdtLnBhc3NfU01UID0gc21jLT5vcy5od20ucGFzc19OU0EgPSBzbWMtPm9zLmh3bS5wYXNzX0RCID0gMCA7CisJc21jLT5vcy5od20ucGFzc19sbGNfcHJvbWlzYyA9IFRSVUUgOworCXNtYy0+b3MuaHdtLnF1ZXVlZF9yeF9mcmFtZXMgPSBzbWMtPm9zLmh3bS5xdWV1ZWRfdHhkX21iID0gMCA7CisJc21jLT5vcy5od20uZGV0ZWNfY291bnQgPSAwIDsKKwlzbWMtPm9zLmh3bS5yeF9icmVhayA9IDAgOworCXNtYy0+b3MuaHdtLnJ4X2xlbl9lcnJvciA9IDAgOworCXNtYy0+b3MuaHdtLmlzcl9mbGFnID0gRkFMU0UgOworCisJLyoKKwkgKiBtYWtlIHN1cmUgdGhhdCB0aGUgc3RhcnQgcG9pbnRlciBpcyAxNiBieXRlIGFsaWduZWQKKwkgKi8KKwlpID0gMTYgLSAoKGxvbmcpc21jLT5vcy5od20uZGVzY3JfcCAmIDB4ZikgOworCWlmIChpICE9IDE2KSB7CisJCURCX0dFTigiaSA9ICVkIixpLDAsMykgOworCQlzbWMtPm9zLmh3bS5kZXNjcl9wID0gKHVuaW9uIHNfZnBfZGVzY3Igdm9sYXRpbGUgKikKKwkJCSgoY2hhciAqKXNtYy0+b3MuaHdtLmRlc2NyX3AraSkgOworCX0KKwlEQl9HRU4oInB0IHRvIGRlc2NyIGFyZWEgPSAleCIsKHZvaWQgKilzbWMtPm9zLmh3bS5kZXNjcl9wLDAsMykgOworCisJaW5pdF90eGRfcmluZyhzbWMpIDsKKwlpbml0X3J4ZF9yaW5nKHNtYykgOworCW1hY19kcnZfZmlsbF9yeGQoc21jKSA7CisKKwlpbml0X3BsYyhzbWMpIDsKK30KKworCitTTWJ1ZiAqc210X2dldF9tYnVmKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXJlZ2lzdGVyIFNNYnVmCSptYiA7CisKKyNpZm5kZWYJQ09NTU9OX01CX1BPT0wKKwltYiA9IHNtYy0+b3MuaHdtLm1idWZfcG9vbC5tYl9mcmVlIDsKKyNlbHNlCisJbWIgPSBtYl9mcmVlIDsKKyNlbmRpZgorCWlmIChtYikgeworI2lmbmRlZglDT01NT05fTUJfUE9PTAorCQlzbWMtPm9zLmh3bS5tYnVmX3Bvb2wubWJfZnJlZSA9IG1iLT5zbV9uZXh0IDsKKyNlbHNlCisJCW1iX2ZyZWUgPSBtYi0+c21fbmV4dCA7CisjZW5kaWYKKwkJbWItPnNtX29mZiA9IDggOworCQltYi0+c21fdXNlX2NvdW50ID0gMSA7CisJfQorCURCX0dFTigiZ2V0IFNNYnVmOiBtYiA9ICV4Iiwodm9pZCAqKW1iLDAsMykgOworCXJldHVybiAobWIpIDsJLyogTWF5IGJlIE5VTEwgKi8KK30KKwordm9pZCBzbXRfZnJlZV9tYnVmKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIpCit7CisKKwlpZiAobWIpIHsKKwkJbWItPnNtX3VzZV9jb3VudC0tIDsKKwkJREJfR0VOKCJmcmVlX21idWY6IHNtX3VzZV9jb3VudCA9ICVkIixtYi0+c21fdXNlX2NvdW50LDAsMykgOworCQkvKgorCQkgKiBJZiB0aGUgdXNlX2NvdW50IGlzICE9IHplcm8gdGhlIE1CdWYgaXMgcXVldWVkCisJCSAqIG1vcmUgdGhhbiBvbmNlIGFuZCBtdXN0IG5vdCBxdWV1ZWQgaW50byB0aGUKKwkJICogZnJlZSBNQnVmIHF1ZXVlCisJCSAqLworCQlpZiAoIW1iLT5zbV91c2VfY291bnQpIHsKKwkJCURCX0dFTigiZnJlZSBTTWJ1ZjogbWIgPSAleCIsKHZvaWQgKiltYiwwLDMpIDsKKyNpZm5kZWYJQ09NTU9OX01CX1BPT0wKKwkJCW1iLT5zbV9uZXh0ID0gc21jLT5vcy5od20ubWJ1Zl9wb29sLm1iX2ZyZWUgOworCQkJc21jLT5vcy5od20ubWJ1Zl9wb29sLm1iX2ZyZWUgPSBtYiA7CisjZWxzZQorCQkJbWItPnNtX25leHQgPSBtYl9mcmVlIDsKKwkJCW1iX2ZyZWUgPSBtYiA7CisjZW5kaWYKKwkJfQorCX0KKwllbHNlCisJCVNNVF9QQU5JQyhzbWMsSFdNX0UwMDAzLEhXTV9FMDAwM19NU0cpIDsKK30KKworCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKG1hY19kcnZfcmVwYWlyX2Rlc2NyKQorICoJdm9pZCBtYWNfZHJ2X3JlcGFpcl9kZXNjcihzbWMpCisgKgorICogZnVuY3Rpb24JY2FsbGVkIGZyb20gU01UCShIV00gLyBod210bS5jKQorICoJCVRoZSBCTVUgaXMgaWRsZSB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoJCU1hY19kcnZfcmVwYWlyX2Rlc2NyIHNldHMgdXAgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKyAqCQlmb3IgYWxsIHJlY2VpdmUgYW5kIHRyYW5zbWl0IHF1ZXVlcyB3aGVyZSB0aGUgQk1VCisgKgkJc2hvdWxkIGNvbnRpbnVlLgorICoJCUl0IG1heSBiZSB0aGF0IHRoZSBCTVUgd2FzIHJlc2V0ZWQgZHVyaW5nIGEgZnJhZ21lbnRlZAorICoJCXRyYW5zZmVyLiBJbiB0aGlzIGNhc2UgdGhlcmUgYXJlIHNvbWUgZnJhZ21lbnRzIHdoaWNoIHdpbGwKKyAqCQluZXZlciBjb21wbGV0ZWQgYnkgdGhlIEJNVS4gVGhlIE9XTiBiaXQgb2YgdGhpcyBmcmFnbWVudHMKKyAqCQltdXN0IGJlIHN3aXRjaGVkIHRvIGJlIG93bmVkIGJ5IHRoZSBob3N0LgorICoKKyAqCQlHaXZlIGEgc3RhcnQgY29tbWFuZCB0byB0aGUgcmVjZWl2ZSBCTVUuCisgKgkJU3RhcnQgdGhlIHRyYW5zbWl0IEJNVXMgaWYgdHJhbnNtaXQgZnJhbWVzIHBlbmRpbmcuCisgKgorICoJRU5EX01BTlVBTF9FTlRSWQorICovCit2b2lkIG1hY19kcnZfcmVwYWlyX2Rlc2NyKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXVfbG9uZwlwaHlzIDsKKworCWlmIChzbWMtPmh3Lmh3X3N0YXRlICE9IFNUT1BQRUQpIHsKKwkJU0tfQlJFQUsoKSA7CisJCVNNVF9QQU5JQyhzbWMsSFdNX0UwMDEzLEhXTV9FMDAxM19NU0cpIDsKKwkJcmV0dXJuIDsKKwl9CisKKwkvKgorCSAqIHJlcGFpciB0eCBxdWV1ZXM6IGRvbid0IHN0YXJ0CisJICovCisJcGh5cyA9IHJlcGFpcl90eGRfcmluZyhzbWMsc21jLT5ody5mcC50eFtRVUVVRV9BMF0pIDsKKwlvdXRwZChBRERSKEI1X1hBX0RBKSxwaHlzKSA7CisJaWYgKHNtYy0+aHcuZnAudHhfcVtRVUVVRV9BMF0udHhfdXNlZCkgeworCQlvdXRwZChBRERSKEIwX1hBX0NTUiksQ1NSX1NUQVJUKSA7CisJfQorCXBoeXMgPSByZXBhaXJfdHhkX3Jpbmcoc21jLHNtYy0+aHcuZnAudHhbUVVFVUVfU10pIDsKKwlvdXRwZChBRERSKEI1X1hTX0RBKSxwaHlzKSA7CisJaWYgKHNtYy0+aHcuZnAudHhfcVtRVUVVRV9TXS50eF91c2VkKSB7CisJCW91dHBkKEFERFIoQjBfWFNfQ1NSKSxDU1JfU1RBUlQpIDsKKwl9CisKKwkvKgorCSAqIHJlcGFpciByeCBxdWV1ZXMKKwkgKi8KKwlwaHlzID0gcmVwYWlyX3J4ZF9yaW5nKHNtYyxzbWMtPmh3LmZwLnJ4W1FVRVVFX1IxXSkgOworCW91dHBkKEFERFIoQjRfUjFfREEpLHBoeXMpIDsKKwlvdXRwZChBRERSKEIwX1IxX0NTUiksQ1NSX1NUQVJUKSA7Cit9CisKK3N0YXRpYyB1X2xvbmcgcmVwYWlyX3R4ZF9yaW5nKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19zbXRfdHhfcXVldWUgKnF1ZXVlKQoreworCWludCBpIDsKKwlpbnQgdHhfdXNlZCA7CisJdV9sb25nIHBoeXMgOworCXVfbG9uZyB0YmN0cmwgOworCXN0cnVjdCBzX3NtdF9mcF90eGQgdm9sYXRpbGUgKnQgOworCisJU0tfVU5VU0VEKHNtYykgOworCisJdCA9IHF1ZXVlLT50eF9jdXJyX2dldCA7CisJdHhfdXNlZCA9IHF1ZXVlLT50eF91c2VkIDsKKwlmb3IgKGkgPSB0eF91c2VkK3F1ZXVlLT50eF9mcmVlLTEgOyBpIDsgaS0tICkgeworCQl0ID0gdC0+dHhkX25leHQgOworCX0KKwlwaHlzID0gQUlYX1JFVkVSU0UodC0+dHhkX250ZGFkcikgOworCisJdCA9IHF1ZXVlLT50eF9jdXJyX2dldCA7CisJd2hpbGUgKHR4X3VzZWQpIHsKKwkJRFJWX0JVRl9GTFVTSCh0LERESV9ETUFfU1lOQ19GT1JDUFUpIDsKKwkJdGJjdHJsID0gQUlYX1JFVkVSU0UodC0+dHhkX3RiY3RybCkgOworCisJCWlmICh0YmN0cmwgJiBCTVVfT1dOKSB7CisJCQlpZiAodGJjdHJsICYgQk1VX1NURikgeworCQkJCWJyZWFrIDsJCS8qIGV4aXQgdGhlIGxvb3AgKi8KKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogcmVwYWlyIHRoZSBkZXNjcmlwdG9yCisJCQkJICovCisJCQkJdC0+dHhkX3RiY3RybCAmPSBBSVhfUkVWRVJTRSh+Qk1VX09XTikgOworCQkJfQorCQl9CisJCXBoeXMgPSBBSVhfUkVWRVJTRSh0LT50eGRfbnRkYWRyKSA7CisJCURSVl9CVUZfRkxVU0godCxERElfRE1BX1NZTkNfRk9SREVWKSA7CisJCXQgPSB0LT50eGRfbmV4dCA7CisJCXR4X3VzZWQtLSA7CisJfQorCXJldHVybihwaHlzKSA7Cit9CisKKy8qCisgKiBSZXBhaXJzIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgcmluZyBhbmQgcmV0dXJucyB0aGUgcGh5c2ljYWwgYWRkcmVzcworICogd2hlcmUgdGhlIEJNVSBzaG91bGQgY29udGludWUgd29ya2luZy4KKyAqCisgKglvIFRoZSBwaHlzaWNhbCBhZGRyZXNzIHdoZXJlIHRoZSBCTVUgd2FzIHN0b3BwZWQgaGFzIHRvIGJlCisgKgkgIGRldGVybWluZWQuIFRoaXMgaXMgdGhlIG5leHQgUnhEIGFmdGVyIHJ4X2N1cnJfZ2V0IHdpdGggYW4gT1dOCisgKgkgIGJpdCBzZXQuCisgKglvIFRoZSBCTVUgc2hvdWxkIHN0YXJ0IHdvcmtpbmcgYXQgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGZyYW1lLgorICoJICBSeERzIHdpdGggYW4gT1dOIGJpdCBzZXQgYnV0IHdpdGggYSByZXNldCBTVEYgYml0IHNob3VsZCBiZQorICoJICBza2lwcGVkIGFuZCBvd25lZCBieSB0aGUgZHJpdmVyIChPV04gPSAwKS4gCisgKi8KK3N0YXRpYyB1X2xvbmcgcmVwYWlyX3J4ZF9yaW5nKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19zbXRfcnhfcXVldWUgKnF1ZXVlKQoreworCWludCBpIDsKKwlpbnQgcnhfdXNlZCA7CisJdV9sb25nIHBoeXMgOworCXVfbG9uZyByYmN0cmwgOworCXN0cnVjdCBzX3NtdF9mcF9yeGQgdm9sYXRpbGUgKnIgOworCisJU0tfVU5VU0VEKHNtYykgOworCisJciA9IHF1ZXVlLT5yeF9jdXJyX2dldCA7CisJcnhfdXNlZCA9IHF1ZXVlLT5yeF91c2VkIDsKKwlmb3IgKGkgPSBTTVRfUjFfUlhEX0NPVU5ULTEgOyBpIDsgaS0tICkgeworCQlyID0gci0+cnhkX25leHQgOworCX0KKwlwaHlzID0gQUlYX1JFVkVSU0Uoci0+cnhkX25yZGFkcikgOworCisJciA9IHF1ZXVlLT5yeF9jdXJyX2dldCA7CisJd2hpbGUgKHJ4X3VzZWQpIHsKKwkJRFJWX0JVRl9GTFVTSChyLERESV9ETUFfU1lOQ19GT1JDUFUpIDsKKwkJcmJjdHJsID0gQUlYX1JFVkVSU0Uoci0+cnhkX3JiY3RybCkgOworCisJCWlmIChyYmN0cmwgJiBCTVVfT1dOKSB7CisJCQlpZiAocmJjdHJsICYgQk1VX1NURikgeworCQkJCWJyZWFrIDsJCS8qIGV4aXQgdGhlIGxvb3AgKi8KKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogcmVwYWlyIHRoZSBkZXNjcmlwdG9yCisJCQkJICovCisJCQkJci0+cnhkX3JiY3RybCAmPSBBSVhfUkVWRVJTRSh+Qk1VX09XTikgOworCQkJfQorCQl9CisJCXBoeXMgPSBBSVhfUkVWRVJTRShyLT5yeGRfbnJkYWRyKSA7CisJCURSVl9CVUZfRkxVU0gocixERElfRE1BX1NZTkNfRk9SREVWKSA7CisJCXIgPSByLT5yeGRfbmV4dCA7CisJCXJ4X3VzZWQtLSA7CisJfQorCXJldHVybihwaHlzKSA7Cit9CisKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSU5URVJSVVBUIFNFUlZJQ0UgUk9VVElORToKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKGZkZGlfaXNyKQorICoJdm9pZCBmZGRpX2lzcihzbWMpCisgKgorICogZnVuY3Rpb24JRE9XTkNBTEwJKGRydnNyLmMpCisgKgkJaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSwgaGFuZGxlcyB0aGUgaW50ZXJydXB0IHJlcXVlc3RzCisgKgkJZ2VuZXJhdGVkIGJ5IHRoZSBGRERJIGFkYXB0ZXIuCisgKgorICogTk9URToJVGhlIG9wZXJhdGluZyBzeXN0ZW0gZGVwZW5kZW50IG1vZHVsZSBtdXN0IGdhcmFudGVlIHRoYXQgdGhlCisgKgkJaW50ZXJydXB0cyBvZiB0aGUgYWRhcHRlciBhcmUgZGlzYWJsZWQgd2hlbiBpdCBjYWxscyBmZGRpX2lzci4KKyAqCisgKglBYm91dCB0aGUgVVNFX0JSRUFLX0lTUiBtZWNoYW5pc21uOgorICoKKyAqCVRoZSBtYWluIHJlcXVpcmVtZW50IG9mIHRoaXMgbWVjaGFuaXNtbiBpcyB0byBmb3JjZSBhbiB0aW1lciBJUlEgd2hlbgorICoJbGVhdmluZyBwcm9jZXNzX3JlY2VpdmUoKSB3aXRoIGxlYXZlX2lzciBzZXQuIHByb2Nlc3NfcmVjZWl2ZSgpIG1heQorICoJYmUgY2FsbGVkIGF0IGFueSB0aW1lIGZyb20gYW55d2hlcmUhCisgKglUbyBiZSBzdXJlIHdlIGRvbid0IG1pc3Mgc3VjaCBldmVudCB3ZSBzZXQgJ2ZvcmNlX2lycScgcGVyIGRlZmF1bHQuCisgKglXZSBoYXZlIHRvIGZvcmNlIGFuZCBUaW1lciBJUlEgaWYgJ3NtYy0+b3MuaHdtLmxlYXZlX2lzcicgQU5ECisgKgknZm9yY2VfaXJxJyBhcmUgc2V0LiAnZm9yY2VfaXJxJyBtYXkgYmUgcmVzZXQgaWYgYSByZWNlaXZlIGNvbXBsZXRlCisgKglJUlEgaXMgcGVuZGluZy4KKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KK3ZvaWQgZmRkaV9pc3Ioc3RydWN0IHNfc21jICpzbWMpCit7CisJdV9sb25nCQlpcyA7CQkvKiBJU1Igc291cmNlICovCisJdV9zaG9ydAkJc3R1LCBzdGwgOworCVNNYnVmCQkqbWIgOworCisjaWZkZWYJVVNFX0JSRUFLX0lTUgorCWludAlmb3JjZV9pcnEgOworI2VuZGlmCisKKyNpZmRlZglPREkyCisJaWYgKHNtYy0+b3MuaHdtLnJ4X2JyZWFrKSB7CisJCW1hY19kcnZfZmlsbF9yeGQoc21jKSA7CisJCWlmIChzbWMtPmh3LmZwLnJ4X3FbUVVFVUVfUjFdLnJ4X3VzZWQgPiAwKSB7CisJCQlzbWMtPm9zLmh3bS5yeF9icmVhayA9IDAgOworCQkJcHJvY2Vzc19yZWNlaXZlKHNtYykgOworCQl9CisJCWVsc2UgeworCQkJc21jLT5vcy5od20uZGV0ZWNfY291bnQgPSAwIDsKKwkJCXNtdF9mb3JjZV9pcnEoc21jKSA7CisJCX0KKwl9CisjZW5kaWYKKwlzbWMtPm9zLmh3bS5pc3JfZmxhZyA9IFRSVUUgOworCisjaWZkZWYJVVNFX0JSRUFLX0lTUgorCWZvcmNlX2lycSA9IFRSVUUgOworCWlmIChzbWMtPm9zLmh3bS5sZWF2ZV9pc3IpIHsKKwkJc21jLT5vcy5od20ubGVhdmVfaXNyID0gRkFMU0UgOworCQlwcm9jZXNzX3JlY2VpdmUoc21jKSA7CisJfQorI2VuZGlmCisKKwl3aGlsZSAoKGlzID0gR0VUX0lTUigpICYgSVNSX01BU0spKSB7CisJCU5ERF9UUkFDRSgiQ0gwQiIsaXMsMCwwKSA7CisJCURCX0dFTigiSVNBID0gMHgleCIsaXMsMCw3KSA7CisKKwkJaWYgKGlzICYgSU1BU0tfU0xPVykgeworCQkJTkREX1RSQUNFKCJDSDFiIixpcywwLDApIDsKKwkJCWlmIChpcyAmIElTX1BMSU5UMSkgewkvKiBQTEMxICovCisJCQkJcGxjMV9pcnEoc21jKSA7CisJCQl9CisJCQlpZiAoaXMgJiBJU19QTElOVDIpIHsJLyogUExDMiAqLworCQkJCXBsYzJfaXJxKHNtYykgOworCQkJfQorCQkJaWYgKGlzICYgSVNfTUlOVFIxKSB7CS8qIEZPUk1BQysgU1RVMShVL0wpICovCisJCQkJc3R1ID0gaW5wdyhGTV9BKEZNX1NUMVUpKSA7CisJCQkJc3RsID0gaW5wdyhGTV9BKEZNX1NUMUwpKSA7CisJCQkJREJfR0VOKCJTbG93IHRyYW5zbWl0IGNvbXBsZXRlIiwwLDAsNikgOworCQkJCW1hYzFfaXJxKHNtYyxzdHUsc3RsKSA7CisJCQl9CisJCQlpZiAoaXMgJiBJU19NSU5UUjIpIHsJLyogRk9STUFDKyBTVFUyKFUvTCkgKi8KKwkJCQlzdHU9IGlucHcoRk1fQShGTV9TVDJVKSkgOworCQkJCXN0bD0gaW5wdyhGTV9BKEZNX1NUMkwpKSA7CisJCQkJREJfR0VOKCJTbG93IHJlY2VpdmUgY29tcGxldGUiLDAsMCw2KSA7CisJCQkJREJfR0VOKCJzdGwgPSAleCA6IHN0dSA9ICV4IixzdGwsc3R1LDcpIDsKKwkJCQltYWMyX2lycShzbWMsc3R1LHN0bCkgOworCQkJfQorCQkJaWYgKGlzICYgSVNfTUlOVFIzKSB7CS8qIEZPUk1BQysgU1RVMyhVL0wpICovCisJCQkJc3R1PSBpbnB3KEZNX0EoRk1fU1QzVSkpIDsKKwkJCQlzdGw9IGlucHcoRk1fQShGTV9TVDNMKSkgOworCQkJCURCX0dFTigiRk9STUFDIE1vZGUgUmVnaXN0ZXIgMyIsMCwwLDYpIDsKKwkJCQltYWMzX2lycShzbWMsc3R1LHN0bCkgOworCQkJfQorCQkJaWYgKGlzICYgSVNfVElNSU5UKSB7CS8qIFRpbWVyIDgyQzU0LTIgKi8KKwkJCQl0aW1lcl9pcnEoc21jKSA7CisjaWZkZWYJTkRJU19PUzIKKwkJCQlmb3JjZV9pcnFfcGVuZGluZyA9IDAgOworI2VuZGlmCisJCQkJLyoKKwkJCQkgKiBvdXQgb2YgUnhEIGRldGVjdGlvbgorCQkJCSAqLworCQkJCWlmICgrK3NtYy0+b3MuaHdtLmRldGVjX2NvdW50ID4gNCkgeworCQkJCQkvKgorCQkJCQkgKiBjaGVjayBvdXQgb2YgUnhEIGNvbmRpdGlvbgorCQkJCQkgKi8KKwkJCQkJIHByb2Nlc3NfcmVjZWl2ZShzbWMpIDsKKwkJCQl9CisJCQl9CisJCQlpZiAoaXMgJiBJU19UT0tFTikgewkvKiBSZXN0cmljdGVkIFRva2VuIE1vbml0b3IgKi8KKwkJCQlydG1faXJxKHNtYykgOworCQkJfQorCQkJaWYgKGlzICYgSVNfUjFfUCkgewkvKiBQYXJpdHkgZXJyb3IgcnggcXVldWUgMSAqLworCQkJCS8qIGNsZWFyIElSUSAqLworCQkJCW91dHBkKEFERFIoQjRfUjFfQ1NSKSxDU1JfSVJRX0NMX1ApIDsKKwkJCQlTTVRfUEFOSUMoc21jLEhXTV9FMDAwNCxIV01fRTAwMDRfTVNHKSA7CisJCQl9CisJCQlpZiAoaXMgJiBJU19SMV9DKSB7CS8qIEVuY29kaW5nIGVycm9yIHJ4IHF1ZXVlIDEgKi8KKwkJCQkvKiBjbGVhciBJUlEgKi8KKwkJCQlvdXRwZChBRERSKEI0X1IxX0NTUiksQ1NSX0lSUV9DTF9DKSA7CisJCQkJU01UX1BBTklDKHNtYyxIV01fRTAwMDUsSFdNX0UwMDA1X01TRykgOworCQkJfQorCQkJaWYgKGlzICYgSVNfWEFfQykgewkvKiBFbmNvZGluZyBlcnJvciBhc3luYyB0eCBxICovCisJCQkJLyogY2xlYXIgSVJRICovCisJCQkJb3V0cGQoQUREUihCNV9YQV9DU1IpLENTUl9JUlFfQ0xfQykgOworCQkJCVNNVF9QQU5JQyhzbWMsSFdNX0UwMDA2LEhXTV9FMDAwNl9NU0cpIDsKKwkJCX0KKwkJCWlmIChpcyAmIElTX1hTX0MpIHsJLyogRW5jb2RpbmcgZXJyb3Igc3luYyB0eCBxICovCisJCQkJLyogY2xlYXIgSVJRICovCisJCQkJb3V0cGQoQUREUihCNV9YU19DU1IpLENTUl9JUlFfQ0xfQykgOworCQkJCVNNVF9QQU5JQyhzbWMsSFdNX0UwMDA3LEhXTV9FMDAwN19NU0cpIDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqCUZhc3QgVHggY29tcGxldGUgQXN5bmMvU3luYyBRdWV1ZSAoQk1VIHNlcnZpY2UpCisJCSAqLworCQlpZiAoaXMgJiAoSVNfWFNfRnxJU19YQV9GKSkgeworCQkJREJfR0VOKCJGYXN0IHR4IGNvbXBsZXRlIHF1ZXVlIiwwLDAsNikgOworCQkJLyoKKwkJCSAqIGNsZWFyIElSUSwgTm90ZTogbm8gSVJRIGlzIGxvc3QsIGJlY2F1c2UKKwkJCSAqIAl3ZSBhbHdheXMgc2VydmljZSBib3RoIHF1ZXVlcworCQkJICovCisJCQlvdXRwZChBRERSKEI1X1hTX0NTUiksQ1NSX0lSUV9DTF9GKSA7CisJCQlvdXRwZChBRERSKEI1X1hBX0NTUiksQ1NSX0lSUV9DTF9GKSA7CisJCQltYWNfZHJ2X2NsZWFyX3R4ZChzbWMpIDsKKwkJCWxsY19yZXN0YXJ0X3R4KHNtYykgOworCQl9CisKKwkJLyoKKwkJICoJRmFzdCBSeCBDb21wbGV0ZSAoQk1VIHNlcnZpY2UpCisJCSAqLworCQlpZiAoaXMgJiBJU19SMV9GKSB7CisJCQlEQl9HRU4oIkZhc3QgcmVjZWl2ZSBjb21wbGV0ZSIsMCwwLDYpIDsKKwkJCS8qIGNsZWFyIElSUSAqLworI2lmbmRlZiBVU0VfQlJFQUtfSVNSCisJCQlvdXRwZChBRERSKEI0X1IxX0NTUiksQ1NSX0lSUV9DTF9GKSA7CisJCQlwcm9jZXNzX3JlY2VpdmUoc21jKSA7CisjZWxzZQorCQkJcHJvY2Vzc19yZWNlaXZlKHNtYykgOworCQkJaWYgKHNtYy0+b3MuaHdtLmxlYXZlX2lzcikgeworCQkJCWZvcmNlX2lycSA9IEZBTFNFIDsKKwkJCX0gZWxzZSB7CisJCQkJb3V0cGQoQUREUihCNF9SMV9DU1IpLENTUl9JUlFfQ0xfRikgOworCQkJCXByb2Nlc3NfcmVjZWl2ZShzbWMpIDsKKwkJCX0KKyNlbmRpZgorCQl9CisKKyNpZm5kZWYJTkRJU19PUzIKKwkJd2hpbGUgKChtYiA9IGdldF9sbGNfcngoc21jKSkpIHsKKwkJCXNtdF90b19sbGMoc21jLG1iKSA7CisJCX0KKyNlbHNlCisJCWlmIChvZmZEZXB0aCkKKwkJCXBvc3RfcHJvYygpIDsKKworCQl3aGlsZSAoIW9mZkRlcHRoICYmIChtYiA9IGdldF9sbGNfcngoc21jKSkpIHsKKwkJCXNtdF90b19sbGMoc21jLG1iKSA7CisJCX0KKworCQlpZiAoIW9mZkRlcHRoICYmIHNtYy0+b3MuaHdtLnJ4X2JyZWFrKSB7CisJCQlwcm9jZXNzX3JlY2VpdmUoc21jKSA7CisJCX0KKyNlbmRpZgorCQlpZiAoc21jLT5xLmV2X2dldCAhPSBzbWMtPnEuZXZfcHV0KSB7CisJCQlORERfVFJBQ0UoIkNIMmEiLDAsMCwwKSA7CisJCQlldl9kaXNwYXRjaGVyKHNtYykgOworCQl9CisjaWZkZWYJTkRJU19PUzIKKwkJcG9zdF9wcm9jKCkgOworCQlpZiAob2ZmRGVwdGgpIHsJCS8qIGxlYXZlIGZkZGlfaXNyIGJlY2F1c2UgKi8KKwkJCWJyZWFrIDsJCS8qIGluZGljYXRpb25zIG5vdCBhbGxvd2VkICovCisJCX0KKyNlbmRpZgorI2lmZGVmCVVTRV9CUkVBS19JU1IKKwkJaWYgKHNtYy0+b3MuaHdtLmxlYXZlX2lzcikgeworCQkJYnJlYWsgOwkJLyogbGVhdmUgZmRkaV9pc3IgKi8KKwkJfQorI2VuZGlmCisKKwkJLyogTk9URTogd2hlbiB0aGUgaXNyIGlzIGxlZnQsIG5vIHJ4IGlzIHBlbmRpbmcgKi8KKwl9CS8qIGVuZCBvZiBpbnRlcnJ1cHQgc291cmNlIHBvbGxpbmcgbG9vcCAqLworCisjaWZkZWYJVVNFX0JSRUFLX0lTUgorCWlmIChzbWMtPm9zLmh3bS5sZWF2ZV9pc3IgJiYgZm9yY2VfaXJxKSB7CisJCXNtdF9mb3JjZV9pcnEoc21jKSA7CisJfQorI2VuZGlmCisJc21jLT5vcy5od20uaXNyX2ZsYWcgPSBGQUxTRSA7CisJTkREX1RSQUNFKCJDSDBFIiwwLDAsMCkgOworfQorCisKKy8qCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVJFQ0VJVkUgRlVOQ1RJT05TOgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYJTkRJU19PUzIKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkobWFjX2Rydl9yeF9tb2RlKQorICoJdm9pZCBtYWNfZHJ2X3J4X21vZGUoc21jLG1vZGUpCisgKgorICogZnVuY3Rpb24JRE9XTkNBTEwJKGZwbHVzLmMpCisgKgkJQ29ycmVzcG9uZGluZyB0byB0aGUgcGFyYW1ldGVyIG1vZGUsIHRoZSBvcGVyYXRpbmcgc3lzdGVtCisgKgkJZGVwZW5kZW50IG1vZHVsZSBjYW4gYWN0aXZhdGUgc2V2ZXJhbCByZWNlaXZlIG1vZGVzLgorICoKKyAqIHBhcmEJbW9kZQk9IDE6CVJYX0VOQUJMRV9BTExNVUxUSQllbmFibGUgYWxsIG11bHRpY2FzdHMKKyAqCQk9IDI6CVJYX0RJU0FCTEVfQUxMTVVMVEkJZGlzYWJsZSAiZW5hYmxlIGFsbCBtdWx0aWNhc3RzIgorICoJCT0gMzoJUlhfRU5BQkxFX1BST01JU0MJZW5hYmxlIHByb21pc2N1b3VzCisgKgkJPSA0OglSWF9ESVNBQkxFX1BST01JU0MJZGlzYWJsZSBwcm9taXNjdW91cworICoJCT0gNToJUlhfRU5BQkxFX05TQQkJZW5hYmxlIHJlYy4gb2YgYWxsIE5TQSBmcmFtZXMKKyAqCQkJKGRpc2FibGVkIGFmdGVyICdkcml2ZXIgcmVzZXQnICYgJ3NldCBzdGF0aW9uIGFkZHJlc3MnKQorICoJCT0gNjoJUlhfRElTQUJMRV9OU0EJCWRpc2FibGUgcmVjLiBvZiBhbGwgTlNBIGZyYW1lcworICoKKyAqCQk9IDIxOglSWF9FTkFCTEVfUEFTU19TTVQJKCBzZWUgZGVzY3JpcHRpb24gKQorICoJCT0gMjI6CVJYX0RJU0FCTEVfUEFTU19TTVQJKCAgIgkgICAiCSAgKQorICoJCT0gMjM6CVJYX0VOQUJMRV9QQVNTX05TQQkoICAiCSAgICIJICApCisgKgkJPSAyNDoJUlhfRElTQUJMRV9QQVNTX05TQQkoICAiCSAgICIJICApCisgKgkJPSAyNToJUlhfRU5BQkxFX1BBU1NfREIJKCAgIgkgICAiCSAgKQorICoJCT0gMjY6CVJYX0RJU0FCTEVfUEFTU19EQgkoICAiCSAgICIJICApCisgKgkJPSAyNzoJUlhfRElTQUJMRV9QQVNTX0FMTAkoICAiCSAgICIJICApCisgKgkJPSAyODoJUlhfRElTQUJMRV9MTENfUFJPTUlTQwkoICAiCSAgICIJICApCisgKgkJPSAyOToJUlhfRU5BQkxFX0xMQ19QUk9NSVNDCSggICIJICAgIgkgICkKKyAqCisgKgorICoJCVJYX0VOQUJMRV9QQVNTX1NNVCAvIFJYX0RJU0FCTEVfUEFTU19TTVQKKyAqCisgKgkJSWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZGVwZW5kZW50IG1vZHVsZSBhY3RpdmF0ZXMgdGhlCisgKgkJbW9kZSBSWF9FTkFCTEVfUEFTU19TTVQsIHRoZSBoYXJkd2FyZSBtb2R1bGUKKyAqCQlkdXBsaWNhdGVzIGFsbCBTTVQgZnJhbWVzIHdpdGggdGhlIGZyYW1lIGNvbnRyb2wKKyAqCQlGQ19TTVRfSU5GTyBhbmQgcGFzc2VzIHRoZW0gdG8gdGhlIExMQyByZWNlaXZlIGNoYW5uZWwKKyAqCQlieSBjYWxsaW5nIG1hY19kcnZfcnhfaW5pdC4KKyAqCQlUaGUgU01UIEZyYW1lcyB3aGljaCBhcmUgc2VudCBieSB0aGUgbG9jYWwgU01UIGFuZCB0aGUgTlNBCisgKgkJZnJhbWVzIHdob3NlIEEtIGFuZCBDLUluZGljYXRvciBpcyBub3Qgc2V0IGFyZSBhbHNvIGR1cGxpY2F0ZWQKKyAqCQlhbmQgcGFzc2VkLgorICoJCVRoZSByZWNlaXZlIG1vZGUgUlhfRElTQUJMRV9QQVNTX1NNVCBkaXNhYmxlcyB0aGUgcGFzc2luZworICoJCW9mIFNNVCBmcmFtZXMuCisgKgorICoJCVJYX0VOQUJMRV9QQVNTX05TQSAvIFJYX0RJU0FCTEVfUEFTU19OU0EKKyAqCisgKgkJSWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZGVwZW5kZW50IG1vZHVsZSBhY3RpdmF0ZXMgdGhlCisgKgkJbW9kZSBSWF9FTkFCTEVfUEFTU19OU0EsIHRoZSBoYXJkd2FyZSBtb2R1bGUKKyAqCQlkdXBsaWNhdGVzIGFsbCBOU0EgZnJhbWVzIHdpdGggZnJhbWUgY29udHJvbCBGQ19TTVRfTlNBCisgKgkJYW5kIGEgc2V0IEEtSW5kaWNhdG9yIGFuZCBwYXNzZWQgdGhlbSB0byB0aGUgTExDCisgKgkJcmVjZWl2ZSBjaGFubmVsIGJ5IGNhbGxpbmcgbWFjX2Rydl9yeF9pbml0LgorICoJCUFsbCBOU0EgRnJhbWVzIHdoaWNoIGFyZSBzZW50IGJ5IHRoZSBsb2NhbCBTTVQKKyAqCQlhcmUgYWxzbyBkdXBsaWNhdGVkIGFuZCBwYXNzZWQuCisgKgkJVGhlIHJlY2VpdmUgbW9kZSBSWF9ESVNBQkxFX1BBU1NfTlNBIGRpc2FibGVzIHRoZSBwYXNzaW5nCisgKgkJb2YgTlNBIGZyYW1lcyB3aXRoIHRoZSBBLSBvciBDLUluZGljYXRvciBzZXQuCisgKgorICogTk9URToJRm9yIGZlYXIgdGhhdCB0aGUgaGFyZHdhcmUgbW9kdWxlIHJlY2VpdmVzIE5TQSBmcmFtZXMgd2l0aAorICoJCWEgcmVzZXQgQS1JbmRpY2F0b3IsIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGRlcGVuZGVudCBtb2R1bGUKKyAqCQloYXMgdG8gY2FsbCBtYWNfZHJ2X3J4X21vZGUgd2l0aCB0aGUgbW9kZSBSWF9FTkFCTEVfTlNBCisgKgkJYmVmb3JlIGFjdGl2YXRlIHRoZSBSWF9FTkFCTEVfUEFTU19OU0EgbW9kZSBhbmQgYWZ0ZXIgZXZlcnkKKyAqCQknZHJpdmVyIHJlc2V0JyBhbmQgJ3NldCBzdGF0aW9uIGFkZHJlc3MnLgorICoKKyAqCQlSWF9FTkFCTEVfUEFTU19EQiAvIFJYX0RJU0FCTEVfUEFTU19EQgorICoKKyAqCQlJZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQgbW9kdWxlIGFjdGl2YXRlcyB0aGUKKyAqCQltb2RlIFJYX0VOQUJMRV9QQVNTX0RCLCBkaXJlY3QgQkVBQ09OIGZyYW1lcworICoJCShGQ19CRUFDT04gZnJhbWUgY29udHJvbCkgYXJlIHBhc3NlZCB0byB0aGUgTExDIHJlY2VpdmUKKyAqCQljaGFubmVsIGJ5IG1hY19kcnZfcnhfaW5pdC4KKyAqCQlUaGUgcmVjZWl2ZSBtb2RlIFJYX0RJU0FCTEVfUEFTU19EQiBkaXNhYmxlcyB0aGUgcGFzc2luZworICoJCW9mIGRpcmVjdCBCRUFDT04gZnJhbWVzLgorICoKKyAqCQlSWF9ESVNBQkxFX1BBU1NfQUxMCisgKgorICoJCURpc2FibGVzIGFsbCBzcGVjaWFsIHJlY2VpdmVzIG1vZGVzLiBJdCBpcyBlcXVhbCB0bworICoJCWNhbGwgbWFjX2Rydl9zZXRfcnhfbW9kZSBzdWNjZXNzaXZlbHkgd2l0aCB0aGUKKyAqCQlwYXJhbWV0ZXJzIFJYX0RJU0FCTEVfTlNBLCBSWF9ESVNBQkxFX1BBU1NfU01ULAorICoJCVJYX0RJU0FCTEVfUEFTU19OU0EgYW5kIFJYX0RJU0FCTEVfUEFTU19EQi4KKyAqCisgKgkJUlhfRU5BQkxFX0xMQ19QUk9NSVNDCisgKgorICoJCShkZWZhdWx0KSBhbGwgcmVjZWl2ZWQgTExDIGZyYW1lcyBhbmQgYWxsIFNNVC9OU0EvREJFQUNPTgorICoJCWZyYW1lcyBkZXBlbmRpbmcgb24gdGhlIGF0dGl0dWRlIG9mIHRoZSBmbGFncworICoJCVBBU1NfU01UL1BBU1NfTlNBL1BBU1NfREJFQUNPTiB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGUKKyAqCQlMTEMgbGF5ZXIKKyAqCisgKgkJUlhfRElTQUJMRV9MTENfUFJPTUlTQworICoKKyAqCQlhbGwgcmVjZWl2ZWQgU01UL05TQS9EQkVBQ09OIGZyYW1lcyBkZXBlbmRpbmcgb24gdGhlCisgKgkJYXR0aXR1ZGUgb2YgdGhlIGZsYWdzIFBBU1NfU01UL1BBU1NfTlNBL1BBU1NfREJFQUNPTgorICoJCXdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBMTEMgbGF5ZXIuCisgKgkJYWxsIHJlY2VpdmVkIExMQyBmcmFtZXMgd2l0aCBhIGRpcmVjdGVkIGFkZHJlc3MsIE11bHRpY2FzdAorICoJCW9yIEJyb2FkY2FzdCBhZGRyZXNzIHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBMTEMKKyAqCQlsYXllciB0b28uCisgKgorICoJRU5EX01BTlVBTF9FTlRSWQorICovCit2b2lkIG1hY19kcnZfcnhfbW9kZShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG1vZGUpCit7CisJc3dpdGNoKG1vZGUpIHsKKwljYXNlIFJYX0VOQUJMRV9QQVNTX1NNVDoKKwkJc21jLT5vcy5od20ucGFzc19TTVQgPSBUUlVFIDsKKwkJYnJlYWsgOworCWNhc2UgUlhfRElTQUJMRV9QQVNTX1NNVDoKKwkJc21jLT5vcy5od20ucGFzc19TTVQgPSBGQUxTRSA7CisJCWJyZWFrIDsKKwljYXNlIFJYX0VOQUJMRV9QQVNTX05TQToKKwkJc21jLT5vcy5od20ucGFzc19OU0EgPSBUUlVFIDsKKwkJYnJlYWsgOworCWNhc2UgUlhfRElTQUJMRV9QQVNTX05TQToKKwkJc21jLT5vcy5od20ucGFzc19OU0EgPSBGQUxTRSA7CisJCWJyZWFrIDsKKwljYXNlIFJYX0VOQUJMRV9QQVNTX0RCOgorCQlzbWMtPm9zLmh3bS5wYXNzX0RCID0gVFJVRSA7CisJCWJyZWFrIDsKKwljYXNlIFJYX0RJU0FCTEVfUEFTU19EQjoKKwkJc21jLT5vcy5od20ucGFzc19EQiA9IEZBTFNFIDsKKwkJYnJlYWsgOworCWNhc2UgUlhfRElTQUJMRV9QQVNTX0FMTDoKKwkJc21jLT5vcy5od20ucGFzc19TTVQgPSBzbWMtPm9zLmh3bS5wYXNzX05TQSA9IEZBTFNFIDsKKwkJc21jLT5vcy5od20ucGFzc19EQiA9IEZBTFNFIDsKKwkJc21jLT5vcy5od20ucGFzc19sbGNfcHJvbWlzYyA9IFRSVUUgOworCQltYWNfc2V0X3J4X21vZGUoc21jLFJYX0RJU0FCTEVfTlNBKSA7CisJCWJyZWFrIDsKKwljYXNlIFJYX0RJU0FCTEVfTExDX1BST01JU0M6CisJCXNtYy0+b3MuaHdtLnBhc3NfbGxjX3Byb21pc2MgPSBGQUxTRSA7CisJCWJyZWFrIDsKKwljYXNlIFJYX0VOQUJMRV9MTENfUFJPTUlTQzoKKwkJc21jLT5vcy5od20ucGFzc19sbGNfcHJvbWlzYyA9IFRSVUUgOworCQlicmVhayA7CisJY2FzZSBSWF9FTkFCTEVfQUxMTVVMVEk6CisJY2FzZSBSWF9ESVNBQkxFX0FMTE1VTFRJOgorCWNhc2UgUlhfRU5BQkxFX1BST01JU0M6CisJY2FzZSBSWF9ESVNBQkxFX1BST01JU0M6CisJY2FzZSBSWF9FTkFCTEVfTlNBOgorCWNhc2UgUlhfRElTQUJMRV9OU0E6CisJZGVmYXVsdDoKKwkJbWFjX3NldF9yeF9tb2RlKHNtYyxtb2RlKSA7CisJCWJyZWFrIDsKKwl9Cit9CisjZW5kaWYJLyogaWZuZGVmIE5ESVNfT1MyICovCisKKy8qCisgKiBwcm9jZXNzIHJlY2VpdmUgcXVldWUKKyAqLwordm9pZCBwcm9jZXNzX3JlY2VpdmUoc3RydWN0IHNfc21jICpzbWMpCit7CisJaW50IGkgOworCWludCBuIDsKKwlpbnQgZnJhZ19jb3VudCA7CQkvKiBudW1iZXIgb2YgUnhEcyBvZiB0aGUgY3VyciByeCBidWYgKi8KKwlpbnQgdXNlZF9mcmFncyA7CQkvKiBudW1iZXIgb2YgUnhEcyBvZiB0aGUgY3VyciBmcmFtZSAqLworCXN0cnVjdCBzX3NtdF9yeF9xdWV1ZSAqcXVldWUgOwkvKiBwb2ludHMgdG8gdGhlIHF1ZXVlIGN0bCBzdHJ1Y3QgKi8KKwlzdHJ1Y3Qgc19zbXRfZnBfcnhkIHZvbGF0aWxlICpyIDsJLyogcnhkIHBvaW50ZXIgKi8KKwlzdHJ1Y3Qgc19zbXRfZnBfcnhkIHZvbGF0aWxlICpyeGQgOwkvKiBmaXJzdCByeGQgb2YgcnggZnJhbWUgKi8KKwl1X2xvbmcgcmJjdHJsIDsJCQkvKiByZWNlaXZlIGJ1ZmZlciBjb250cm9sIHdvcmQgKi8KKwl1X2xvbmcgcmZzdyA7CQkJLyogcmVjZWl2ZSBmcmFtZSBzdGF0dXMgd29yZCAqLworCXVfc2hvcnQgcnhfdXNlZCA7CisJdV9jaGFyIGZhciAqdmlydCA7CisJY2hhciBmYXIgKmRhdGEgOworCVNNYnVmICptYiA7CisJdV9jaGFyIGZjIDsJCQkvKiBGcmFtZSBjb250cm9sICovCisJaW50IGxlbiA7CQkJLyogRnJhbWUgbGVuZ3RoICovCisKKwlzbWMtPm9zLmh3bS5kZXRlY19jb3VudCA9IDAgOworCXF1ZXVlID0gc21jLT5ody5mcC5yeFtRVUVVRV9SMV0gOworCU5ERF9UUkFDRSgiUkh4QiIsMCwwLDApIDsKKwlmb3IgKCA7IDsgKSB7CisJCXIgPSBxdWV1ZS0+cnhfY3Vycl9nZXQgOworCQlyeF91c2VkID0gcXVldWUtPnJ4X3VzZWQgOworCQlmcmFnX2NvdW50ID0gMCA7CisKKyNpZmRlZglVU0VfQlJFQUtfSVNSCisJCWlmIChzbWMtPm9zLmh3bS5sZWF2ZV9pc3IpIHsKKwkJCWdvdG8gcnhfZW5kIDsKKwkJfQorI2VuZGlmCisjaWZkZWYJTkRJU19PUzIKKwkJaWYgKG9mZkRlcHRoKSB7CisJCQlzbWMtPm9zLmh3bS5yeF9icmVhayA9IDEgOworCQkJZ290byByeF9lbmQgOworCQl9CisJCXNtYy0+b3MuaHdtLnJ4X2JyZWFrID0gMCA7CisjZW5kaWYKKyNpZmRlZglPREkyCisJCWlmIChzbWMtPm9zLmh3bS5yeF9icmVhaykgeworCQkJZ290byByeF9lbmQgOworCQl9CisjZW5kaWYKKwkJbiA9IDAgOworCQlkbyB7CisJCQlEQl9SWCgiQ2hlY2sgUnhEICV4IGZvciBPV04gYW5kIEVPRiIsKHZvaWQgKilyLDAsNSkgOworCQkJRFJWX0JVRl9GTFVTSChyLERESV9ETUFfU1lOQ19GT1JDUFUpIDsKKwkJCXJiY3RybCA9IENSX1JFQUQoci0+cnhkX3JiY3RybCkgOworCQkJcmJjdHJsID0gQUlYX1JFVkVSU0UocmJjdHJsKSA7CisKKwkJCWlmIChyYmN0cmwgJiBCTVVfT1dOKSB7CisJCQkJTkREX1RSQUNFKCJSSHhFIixyLHJmc3cscmJjdHJsKSA7CisJCQkJREJfUlgoIkVuZCBvZiBSeERzIiwwLDAsNCkgOworCQkJCWdvdG8gcnhfZW5kIDsKKwkJCX0KKwkJCS8qCisJCQkgKiBvdXQgb2YgUnhEIGRldGVjdGlvbgorCQkJICovCisJCQlpZiAoIXJ4X3VzZWQpIHsKKwkJCQlTS19CUkVBSygpIDsKKwkJCQlTTVRfUEFOSUMoc21jLEhXTV9FMDAwOSxIV01fRTAwMDlfTVNHKSA7CisJCQkJLyogRWl0aGVyIHdlIGRvbid0IGhhdmUgYW4gUnhEIG9yIGFsbAorCQkJCSAqIFJ4RHMgYXJlIGZpbGxlZC4gVGhlcmVmb3JlIGl0J3MgYWxsb3dlZAorCQkJCSAqIGZvciB0byBzZXQgdGhlIFNUT1BQRUQgZmxhZyAqLworCQkJCXNtYy0+aHcuaHdfc3RhdGUgPSBTVE9QUEVEIDsKKwkJCQltYWNfZHJ2X2NsZWFyX3J4X3F1ZXVlKHNtYykgOworCQkJCXNtYy0+aHcuaHdfc3RhdGUgPSBTVEFSVEVEIDsKKwkJCQltYWNfZHJ2X2ZpbGxfcnhkKHNtYykgOworCQkJCXNtYy0+b3MuaHdtLmRldGVjX2NvdW50ID0gMCA7CisJCQkJZ290byByeF9lbmQgOworCQkJfQorCQkJcmZzdyA9IEFJWF9SRVZFUlNFKHItPnJ4ZF9yZnN3KSA7CisJCQlpZiAoKHJiY3RybCAmIEJNVV9TVEYpICE9ICgocmJjdHJsICYgQk1VX1NUX0JVRikgPDw1KSkgeworCQkJCS8qCisJCQkJICogVGhlIEJNVV9TVEYgYml0IGlzIGRlbGV0ZWQsIDEgZnJhbWUgaXMKKwkJCQkgKiBwbGFjZWQgaW50byBtb3JlIHRoYW4gMSByeCBidWZmZXIKKwkJCQkgKgorCQkJCSAqIHNraXAgZnJhbWUgYnkgc2V0dGluZyB0aGUgcnggbGVuIHRvIDAKKwkJCQkgKgorCQkJCSAqIGlmIGZyYWdtZW50IGNvdW50ID09IDAKKwkJCQkgKglUaGUgbWlzc2luZyBTVEYgYml0IGJlbG9uZ3MgdG8gdGhlCisJCQkJICoJY3VycmVudCBmcmFtZSwgc2VhcmNoIGZvciB0aGUKKwkJCQkgKglFT0YgYml0IHRvIGNvbXBsZXRlIHRoZSBmcmFtZQorCQkJCSAqIGVsc2UKKwkJCQkgKgl0aGUgZnJhZ21lbnQgYmVsb25ncyB0byB0aGUgbmV4dCBmcmFtZSwKKwkJCQkgKglleGl0IHRoZSBsb29wIGFuZCBwcm9jZXNzIHRoZSBmcmFtZQorCQkJCSAqLworCQkJCVNLX0JSRUFLKCkgOworCQkJCXJmc3cgPSAwIDsKKwkJCQlpZiAoZnJhZ19jb3VudCkgeworCQkJCQlicmVhayA7CisJCQkJfQorCQkJfQorCQkJbiArPSByYmN0cmwgJiAweGZmZmYgOworCQkJciA9IHItPnJ4ZF9uZXh0IDsKKwkJCWZyYWdfY291bnQrKyA7CisJCQlyeF91c2VkLS0gOworCQl9IHdoaWxlICghKHJiY3RybCAmIEJNVV9FT0YpKSA7CisJCXVzZWRfZnJhZ3MgPSBmcmFnX2NvdW50IDsKKwkJREJfUlgoIkVPRiBzZXQgaW4gUnhELCB1c2VkX2ZyYWdzID0gJWQgIix1c2VkX2ZyYWdzLDAsNSkgOworCisJCS8qIG1heSBiZSBuZXh0IDIgRFJWX0JVRl9GTFVTSCgpIGNhbiBiZSBza2lwcGVkLCBiZWNhdXNlICovCisJCS8qIEJNVV9TVF9CVUYgd2lsbCBub3QgYmUgY2hhbmdlZCBieSB0aGUgQVNJQyAqLworCQlEUlZfQlVGX0ZMVVNIKHIsRERJX0RNQV9TWU5DX0ZPUkNQVSkgOworCQl3aGlsZSAocnhfdXNlZCAmJiAhKHItPnJ4ZF9yYmN0cmwgJiBBSVhfUkVWRVJTRShCTVVfU1RfQlVGKSkpIHsKKwkJCURCX1JYKCJDaGVjayBTVEYgYml0IGluICV4Iiwodm9pZCAqKXIsMCw1KSA7CisJCQlyID0gci0+cnhkX25leHQgOworCQkJRFJWX0JVRl9GTFVTSChyLERESV9ETUFfU1lOQ19GT1JDUFUpIDsKKwkJCWZyYWdfY291bnQrKyA7CisJCQlyeF91c2VkLS0gOworCQl9CisJCURCX1JYKCJTVEYgYml0IGZvdW5kIiwwLDAsNSkgOworCisJCS8qCisJCSAqIFRoZSByZWNlaXZlZCBmcmFtZSBpcyBmaW5pc2hlZCBmb3IgdGhlIHByb2Nlc3MgcmVjZWl2ZQorCQkgKi8KKwkJcnhkID0gcXVldWUtPnJ4X2N1cnJfZ2V0IDsKKwkJcXVldWUtPnJ4X2N1cnJfZ2V0ID0gciA7CisJCXF1ZXVlLT5yeF9mcmVlICs9IGZyYWdfY291bnQgOworCQlxdWV1ZS0+cnhfdXNlZCA9IHJ4X3VzZWQgOworCisJCS8qCisJCSAqIEFTSUMgRXJyYXRhIG5vLiA3IChTVEYgLSBCaXQgQnVnKQorCQkgKi8KKwkJcnhkLT5yeGRfcmJjdHJsICY9IEFJWF9SRVZFUlNFKH5CTVVfU1RGKSA7CisKKwkJZm9yIChyPXJ4ZCwgaT1mcmFnX2NvdW50IDsgaSA7IHI9ci0+cnhkX25leHQsIGktLSl7CisJCQlEQl9SWCgiZG1hX2NvbXBsZXRlIGZvciBSeEQgJXgiLCh2b2lkICopciwwLDUpIDsKKwkJCWRtYV9jb21wbGV0ZShzbWMsKHVuaW9uIHNfZnBfZGVzY3Igdm9sYXRpbGUgKilyLERNQV9XUik7CisJCX0KKwkJc21jLT5ody5mcC5lcnJfc3RhdHMuZXJyX3ZhbGlkKysgOworCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNDb3BpZWRfQ3QrKyA7CisKKwkJLyogdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbmNsdWRpbmcgdGhlIEZDICovCisJCWxlbiA9IChyZnN3ICYgUkRfTEVOR1RIKSAtIDQgOworCisJCURCX1JYKCJmcmFtZSBsZW5ndGggPSAlZCIsbGVuLDAsNCkgOworCQkvKgorCQkgKiBjaGVjayB0aGUgZnJhbWVfbGVuZ2h0IGFuZCBhbGwgZXJyb3IgZmxhZ3MKKwkJICovCisJCWlmIChyZnN3ICYgKFJYX01TUkFCVHxSWF9GU19FfFJYX0ZTX0NSQ3xSWF9GU19JTVBMKSl7CisJCQlpZiAocmZzdyAmIFJEX1NfTVNSQUJUKSB7CisJCQkJREJfUlgoIkZyYW1lIGFib3J0ZWQgYnkgdGhlIEZPUk1BQyIsMCwwLDIpIDsKKwkJCQlzbWMtPmh3LmZwLmVycl9zdGF0cy5lcnJfYWJvcnQrKyA7CisJCQl9CisJCQkvKgorCQkJICogY2hlY2sgZnJhbWUgc3RhdHVzCisJCQkgKi8KKwkJCWlmIChyZnN3ICYgUkRfU19TRUFDMikgeworCQkJCURCX1JYKCJFLUluZGljYXRvciBzZXQiLDAsMCwyKSA7CisJCQkJc21jLT5ody5mcC5lcnJfc3RhdHMuZXJyX2VfaW5kaWNhdG9yKysgOworCQkJfQorCQkJaWYgKHJmc3cgJiBSRF9TX1NGUk1FUlIpIHsKKwkJCQlEQl9SWCgiQ1JDIGVycm9yIiwwLDAsMikgOworCQkJCXNtYy0+aHcuZnAuZXJyX3N0YXRzLmVycl9jcmMrKyA7CisJCQl9CisJCQlpZiAocmZzdyAmIFJYX0ZTX0lNUEwpIHsKKwkJCQlEQl9SWCgiSW1wbGVtZW50ZXIgZnJhbWUiLDAsMCwyKSA7CisJCQkJc21jLT5ody5mcC5lcnJfc3RhdHMuZXJyX2ltcF9mcmFtZSsrIDsKKwkJCX0KKwkJCWdvdG8gYWJvcnRfZnJhbWUgOworCQl9CisJCWlmIChsZW4gPiBGRERJX1JBV19NVFUtNCkgeworCQkJREJfUlgoIkZyYW1lIHRvbyBsb25nIGVycm9yIiwwLDAsMikgOworCQkJc21jLT5ody5mcC5lcnJfc3RhdHMuZXJyX3Rvb19sb25nKysgOworCQkJZ290byBhYm9ydF9mcmFtZSA7CisJCX0KKwkJLyoKKwkJICogU1VQRVJORVQgMyBCdWc6IEZPUk1BQyBkZWxpdmVycyBzdGF0dXMgd29yZHMKKwkJICogb2YgYWJvcmRlZCBmcmFtZXMgdG8gdGhlIEJNVQorCQkgKi8KKwkJaWYgKGxlbiA8PSA0KSB7CisJCQlEQl9SWCgiRnJhbWUgbGVuZ3RoID0gMCIsMCwwLDIpIDsKKwkJCWdvdG8gYWJvcnRfZnJhbWUgOworCQl9CisKKwkJaWYgKGxlbiAhPSAobi00KSkgeworCQkJREJfUlgoIkJNVTogcnggbGVuIGRpZmZlcnM6IFslZDolZF0iLGxlbixuLDQpOworCQkJc21jLT5vcy5od20ucnhfbGVuX2Vycm9yKysgOworCQkJZ290byBhYm9ydF9mcmFtZSA7CisJCX0KKworCQkvKgorCQkgKiBDaGVjayBTQSA9PSBNQQorCQkgKi8KKwkJdmlydCA9ICh1X2NoYXIgZmFyICopIHJ4ZC0+cnhkX3ZpcnQgOworCQlEQl9SWCgiRkMgPSAleCIsKnZpcnQsMCwyKSA7CisJCWlmICh2aXJ0WzEyXSA9PSBNQVs1XSAmJgorCQkgICAgdmlydFsxMV0gPT0gTUFbNF0gJiYKKwkJICAgIHZpcnRbMTBdID09IE1BWzNdICYmCisJCSAgICB2aXJ0WzldID09IE1BWzJdICYmCisJCSAgICB2aXJ0WzhdID09IE1BWzFdICYmCisJCSAgICAodmlydFs3XSAmIH5HUk9VUF9BRERSX0JJVCkgPT0gTUFbMF0pIHsKKwkJCWdvdG8gYWJvcnRfZnJhbWUgOworCQl9CisKKwkJLyoKKwkJICogdGVzdCBpZiBMTEMgZnJhbWUKKwkJICovCisJCWlmIChyZnN3ICYgUlhfRlNfTExDKSB7CisJCQkvKgorCQkJICogaWYgcGFzc19sbGNfcHJvbWlzYyBpcyBkaXNhYmxlCisJCQkgKglpZiBEQSAhPSBNdWx0aWNhc3Qgb3IgQnJvYWRjYXN0IG9yIERBIT1NQQorCQkJICoJCWFib3J0IHRoZSBmcmFtZQorCQkJICovCisJCQlpZiAoIXNtYy0+b3MuaHdtLnBhc3NfbGxjX3Byb21pc2MpIHsKKwkJCQlpZighKHZpcnRbMV0gJiBHUk9VUF9BRERSX0JJVCkpIHsKKwkJCQkJaWYgKHZpcnRbNl0gIT0gTUFbNV0gfHwKKwkJCQkJICAgIHZpcnRbNV0gIT0gTUFbNF0gfHwKKwkJCQkJICAgIHZpcnRbNF0gIT0gTUFbM10gfHwKKwkJCQkJICAgIHZpcnRbM10gIT0gTUFbMl0gfHwKKwkJCQkJICAgIHZpcnRbMl0gIT0gTUFbMV0gfHwKKwkJCQkJICAgIHZpcnRbMV0gIT0gTUFbMF0pIHsKKwkJCQkJCURCX1JYKCJEQSAhPSBNQSBhbmQgbm90IG11bHRpLSBvciBicm9hZGNhc3QiLDAsMCwyKSA7CisJCQkJCQlnb3RvIGFib3J0X2ZyYW1lIDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqIExMQyBmcmFtZSByZWNlaXZlZAorCQkJICovCisJCQlEQl9SWCgiTExDIC0gcmVjZWl2ZSIsMCwwLDQpIDsKKwkJCW1hY19kcnZfcnhfY29tcGxldGUoc21jLHJ4ZCxmcmFnX2NvdW50LGxlbikgOworCQl9CisJCWVsc2UgeworCQkJaWYgKCEobWIgPSBzbXRfZ2V0X21idWYoc21jKSkpIHsKKwkJCQlzbWMtPmh3LmZwLmVycl9zdGF0cy5lcnJfbm9fYnVmKysgOworCQkJCURCX1JYKCJObyBTTWJ1ZjsgcmVjZWl2ZSB0ZXJtaW5hdGVkIiwwLDAsNCkgOworCQkJCWdvdG8gYWJvcnRfZnJhbWUgOworCQkJfQorCQkJZGF0YSA9IHNtdG9kKG1iLGNoYXIgKikgLSAxIDsKKworCQkJLyoKKwkJCSAqIGNvcHkgdGhlIGZyYW1lIGludG8gYSBTTVRfTUJ1ZgorCQkJICovCisjaWZkZWYgVVNFX09TX0NQWQorCQkJaHdtX2NweV9yeGQybWIocnhkLGRhdGEsbGVuKSA7CisjZWxzZQorCQkJZm9yIChyPXJ4ZCwgaT11c2VkX2ZyYWdzIDsgaSA7IHI9ci0+cnhkX25leHQsIGktLSl7CisJCQkJbiA9IEFJWF9SRVZFUlNFKHItPnJ4ZF9yYmN0cmwpICYgUkRfTEVOR1RIIDsKKwkJCQlEQl9SWCgiY3AgU01UIGZyYW1lIHRvIG1iOiBsZW4gPSAlZCIsbiwwLDYpIDsKKwkJCQltZW1jcHkoZGF0YSxyLT5yeGRfdmlydCxuKSA7CisJCQkJZGF0YSArPSBuIDsKKwkJCX0KKwkJCWRhdGEgPSBzbXRvZChtYixjaGFyICopIC0gMSA7CisjZW5kaWYKKwkJCWZjID0gKihjaGFyICopbWItPnNtX2RhdGEgPSAqZGF0YSA7CisJCQltYi0+c21fbGVuID0gbGVuIC0gMSA7CQkvKiBsZW4gLSBmYyAqLworCQkJZGF0YSsrIDsKKworCQkJLyoKKwkJCSAqIFNNVCBmcmFtZSByZWNlaXZlZAorCQkJICovCisJCQlzd2l0Y2goZmMpIHsKKwkJCWNhc2UgRkNfU01UX0lORk8gOgorCQkJCXNtYy0+aHcuZnAuZXJyX3N0YXRzLmVycl9zbXRfZnJhbWUrKyA7CisJCQkJREJfUlgoIlNNVCBmcmFtZSByZWNlaXZlZCAiLDAsMCw1KSA7CisKKwkJCQlpZiAoc21jLT5vcy5od20ucGFzc19TTVQpIHsKKwkJCQkJREJfUlgoInBhc3MgU01UIGZyYW1lICIsMCwwLDUpIDsKKwkJCQkJbWFjX2Rydl9yeF9jb21wbGV0ZShzbWMsIHJ4ZCwKKwkJCQkJCWZyYWdfY291bnQsbGVuKSA7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlEQl9SWCgicmVxdWV1ZSBSeEQiLDAsMCw1KSA7CisJCQkJCW1hY19kcnZfcmVxdWV1ZV9yeGQoc21jLHJ4ZCxmcmFnX2NvdW50KTsKKwkJCQl9CisKKwkJCQlzbXRfcmVjZWl2ZWRfcGFjayhzbWMsbWIsKGludCkocmZzdz4+MjUpKSA7CisJCQkJYnJlYWsgOworCQkJY2FzZSBGQ19TTVRfTlNBIDoKKwkJCQlzbWMtPmh3LmZwLmVycl9zdGF0cy5lcnJfc210X2ZyYW1lKysgOworCQkJCURCX1JYKCJTTVQgZnJhbWUgcmVjZWl2ZWQgIiwwLDAsNSkgOworCisJCQkJLyogaWYgcGFzc19OU0Egc2V0IHBhc3MgdGhlIE5TQSBmcmFtZSBvciAqLworCQkJCS8qIHBhc3NfU01UIHNldCBhbmQgdGhlIEEtSW5kaWNhdG9yICovCisJCQkJLyogaXMgbm90IHNldCwgcGFzcyB0aGUgTlNBIGZyYW1lICovCisJCQkJaWYgKHNtYy0+b3MuaHdtLnBhc3NfTlNBIHx8CisJCQkJCShzbWMtPm9zLmh3bS5wYXNzX1NNVCAmJgorCQkJCQkhKHJmc3cgJiBBX0lORElDKSkpIHsKKwkJCQkJREJfUlgoInBhc3MgU01UIGZyYW1lICIsMCwwLDUpIDsKKwkJCQkJbWFjX2Rydl9yeF9jb21wbGV0ZShzbWMsIHJ4ZCwKKwkJCQkJCWZyYWdfY291bnQsbGVuKSA7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlEQl9SWCgicmVxdWV1ZSBSeEQiLDAsMCw1KSA7CisJCQkJCW1hY19kcnZfcmVxdWV1ZV9yeGQoc21jLHJ4ZCxmcmFnX2NvdW50KTsKKwkJCQl9CisKKwkJCQlzbXRfcmVjZWl2ZWRfcGFjayhzbWMsbWIsKGludCkocmZzdz4+MjUpKSA7CisJCQkJYnJlYWsgOworCQkJY2FzZSBGQ19CRUFDT04gOgorCQkJCWlmIChzbWMtPm9zLmh3bS5wYXNzX0RCKSB7CisJCQkJCURCX1JYKCJwYXNzIERCIGZyYW1lICIsMCwwLDUpIDsKKwkJCQkJbWFjX2Rydl9yeF9jb21wbGV0ZShzbWMsIHJ4ZCwKKwkJCQkJCWZyYWdfY291bnQsbGVuKSA7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlEQl9SWCgicmVxdWV1ZSBSeEQiLDAsMCw1KSA7CisJCQkJCW1hY19kcnZfcmVxdWV1ZV9yeGQoc21jLHJ4ZCxmcmFnX2NvdW50KTsKKwkJCQl9CisJCQkJc210X2ZyZWVfbWJ1ZihzbWMsbWIpIDsKKwkJCQlicmVhayA7CisJCQlkZWZhdWx0IDoKKwkJCQkvKgorCQkJCSAqIHVua25vd24gRkMgYWJvcmQgdGhlIGZyYW1lCisJCQkJICovCisJCQkJREJfUlgoInVua25vd24gRkMgZXJyb3IiLDAsMCwyKSA7CisJCQkJc210X2ZyZWVfbWJ1ZihzbWMsbWIpIDsKKwkJCQlEQl9SWCgicmVxdWV1ZSBSeEQiLDAsMCw1KSA7CisJCQkJbWFjX2Rydl9yZXF1ZXVlX3J4ZChzbWMscnhkLGZyYWdfY291bnQpIDsKKwkJCQlpZiAoKGZjICYgMHhmMCkgPT0gRkNfTUFDKQorCQkJCQlzbWMtPmh3LmZwLmVycl9zdGF0cy5lcnJfbWFjX2ZyYW1lKysgOworCQkJCWVsc2UKKwkJCQkJc21jLT5ody5mcC5lcnJfc3RhdHMuZXJyX2ltcF9mcmFtZSsrIDsKKworCQkJCWJyZWFrIDsKKwkJCX0KKwkJfQorCisJCURCX1JYKCJuZXh0IFJ4RCBpcyAleCAiLHF1ZXVlLT5yeF9jdXJyX2dldCwwLDMpIDsKKwkJTkREX1RSQUNFKCJSSHgxIixxdWV1ZS0+cnhfY3Vycl9nZXQsMCwwKSA7CisKKwkJY29udGludWUgOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworYWJvcnRfZnJhbWU6CisJCURCX1JYKCJyZXF1ZXVlIFJ4RCIsMCwwLDUpIDsKKwkJbWFjX2Rydl9yZXF1ZXVlX3J4ZChzbWMscnhkLGZyYWdfY291bnQpIDsKKworCQlEQl9SWCgibmV4dCBSeEQgaXMgJXggIixxdWV1ZS0+cnhfY3Vycl9nZXQsMCwzKSA7CisJCU5ERF9UUkFDRSgiUkh4MiIscXVldWUtPnJ4X2N1cnJfZ2V0LDAsMCkgOworCX0KK3J4X2VuZDoKKyNpZmRlZglBTExfUlhfQ09NUExFVEUKKwltYWNfZHJ2X2FsbF9yZWNlaXZlc19jb21wbGV0ZShzbWMpIDsKKyNlbmRpZgorCXJldHVybiA7CS8qIGxpbnQgYnVnOiBuZWVkcyByZXR1cm4gZGV0ZWN0IGVuZCBvZiBmdW5jdGlvbiAqLworfQorCitzdGF0aWMgdm9pZCBzbXRfdG9fbGxjKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIpCit7CisJdV9jaGFyCWZjIDsKKworCURCX1JYKCJzZW5kIGEgcXVldWVkIGZyYW1lIHRvIHRoZSBsbGMgbGF5ZXIiLDAsMCw0KSA7CisJc21jLT5vcy5od20uci5sZW4gPSBtYi0+c21fbGVuIDsKKwlzbWMtPm9zLmh3bS5yLm1iX3BvcyA9IHNtdG9kKG1iLGNoYXIgKikgOworCWZjID0gKnNtYy0+b3MuaHdtLnIubWJfcG9zIDsKKwkodm9pZCltYWNfZHJ2X3J4X2luaXQoc21jLChpbnQpbWItPnNtX2xlbiwoaW50KWZjLAorCQlzbWMtPm9zLmh3bS5yLm1iX3BvcywoaW50KW1iLT5zbV9sZW4pIDsKKwlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworfQorCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKGh3bV9yeF9mcmFnKQorICoJdm9pZCBod21fcnhfZnJhZyhzbWMsdmlydCxwaHlzLGxlbixmcmFtZV9zdGF0dXMpCisgKgorICogZnVuY3Rpb24JTUFDUk8JCShoYXJkd2FyZSBtb2R1bGUsIGh3bXRtLmgpCisgKgkJVGhpcyBmdW5jdGlvbiBjYWxscyBkbWFfbWFzdGVyIGZvciBwcmVwYXJpbmcgdGhlCisgKgkJc3lzdGVtIGhhcmR3YXJlIGZvciB0aGUgRE1BIHRyYW5zZmVyIGFuZCBpbml0aWFsaXplcworICoJCXRoZSBjdXJyZW50IFJ4RCB3aXRoIHRoZSBsZW5ndGggYW5kIHRoZSBwaHlzaWNhbCBhbmQKKyAqCQl2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGZyYWdtZW50LiBGdXJ0aGVybW9yZSwgaXQgc2V0cyB0aGUKKyAqCQlTVEYgYW5kIEVPRiBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZnJhbWUgc3RhdHVzIGJ5dGUsCisgKgkJc3dpdGNoZXMgdGhlIE9XTiBmbGFnIG9mIHRoZSBSeEQsIHNvIHRoYXQgaXQgaXMgb3duZWQgYnkgdGhlCisgKgkJYWRhcHRlciBhbmQgaXNzdWVzIGFuIHJ4X3N0YXJ0LgorICoKKyAqIHBhcmEJdmlydAl2aXJ0dWFsIHBvaW50ZXIgdG8gdGhlIGZyYWdtZW50CisgKglsZW4JdGhlIGxlbmd0aCBvZiB0aGUgZnJhZ21lbnQKKyAqCWZyYW1lX3N0YXR1cwlzdGF0dXMgb2YgdGhlIGZyYW1lLCBzZWUgZGVzaWduIGRlc2NyaXB0aW9uCisgKgorICogTk9URToJSXQgaXMgcG9zc2libGUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggYSBmcmFnbWVudCBsZW5ndGgKKyAqCQlvZiB6ZXJvLgorICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLwordm9pZCBod21fcnhfZnJhZyhzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciBmYXIgKnZpcnQsIHVfbG9uZyBwaHlzLCBpbnQgbGVuLAorCQkgaW50IGZyYW1lX3N0YXR1cykKK3sKKwlzdHJ1Y3Qgc19zbXRfZnBfcnhkIHZvbGF0aWxlICpyIDsKKwl1X2ludAlyYmN0cmwgOworCisJTkREX1RSQUNFKCJSSGZCIix2aXJ0LGxlbixmcmFtZV9zdGF0dXMpIDsKKwlEQl9SWCgiaHdtX3J4X2ZyYWc6IGxlbiA9ICVkLCBmcmFtZV9zdGF0dXMgPSAleFxuIixsZW4sZnJhbWVfc3RhdHVzLDIpIDsKKwlyID0gc21jLT5ody5mcC5yeF9xW1FVRVVFX1IxXS5yeF9jdXJyX3B1dCA7CisJci0+cnhkX3ZpcnQgPSB2aXJ0IDsKKwlyLT5yeGRfcmJhZHIgPSBBSVhfUkVWRVJTRShwaHlzKSA7CisJcmJjdHJsID0gQUlYX1JFVkVSU0UoICgoKHVfbG9uZylmcmFtZV9zdGF0dXMgJgorCQkoRklSU1RfRlJBR3xMQVNUX0ZSQUcpKTw8MjYpIHwKKwkJKCgodV9sb25nKSBmcmFtZV9zdGF0dXMgJiBGSVJTVF9GUkFHKSA8PCAyMSkgfAorCQlCTVVfT1dOIHwgQk1VX0NIRUNLIHwgQk1VX0VOX0lSUV9FT0YgfCBsZW4pIDsKKwlyLT5yeGRfcmJjdHJsID0gcmJjdHJsIDsKKworCURSVl9CVUZfRkxVU0gocixERElfRE1BX1NZTkNfRk9SREVWKSA7CisJb3V0cGQoQUREUihCMF9SMV9DU1IpLENTUl9TVEFSVCkgOworCXNtYy0+aHcuZnAucnhfcVtRVUVVRV9SMV0ucnhfZnJlZS0tIDsKKwlzbWMtPmh3LmZwLnJ4X3FbUVVFVUVfUjFdLnJ4X3VzZWQrKyA7CisJc21jLT5ody5mcC5yeF9xW1FVRVVFX1IxXS5yeF9jdXJyX3B1dCA9IHItPnJ4ZF9uZXh0IDsKKwlORERfVFJBQ0UoIlJIZkUiLHIsQUlYX1JFVkVSU0Uoci0+cnhkX3JiYWRyKSwwKSA7Cit9CisKKyNpZm5kZWYJTkRJU19PUzIKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkobWFjX2Rydl9yeF9mcmFnKQorICoJaW50IG1hY19kcnZfcnhfZnJhZyhzbWMsdmlydCxsZW4pCisgKgorICogZnVuY3Rpb24JRE9XTkNBTEwJKGh3bXRtLmMpCisgKgkJbWFjX2Rydl9yeF9mcmFnIGZpbGxzIHRoZSBmcmFnbWVudCB3aXRoIGEgcGFydCBvZiB0aGUgZnJhbWUuCisgKgorICogcGFyYQl2aXJ0CXRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGZyYWdtZW50CisgKglsZW4JdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZnJhZ21lbnQKKyAqCisgKiByZXR1cm4gMDoJc3VjY2VzcyBjb2RlLCBubyBlcnJvcnMgcG9zc2libGUKKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KK2ludCBtYWNfZHJ2X3J4X2ZyYWcoc3RydWN0IHNfc21jICpzbWMsIHZvaWQgZmFyICp2aXJ0LCBpbnQgbGVuKQoreworCU5ERF9UUkFDRSgiUkhTQiIsdmlydCxsZW4sc21jLT5vcy5od20uci5tYl9wb3MpIDsKKworCURCX1JYKCJyZWNlaXZlIGZyb20gcXVldWU6IGxlbi92aXJ0OiA9ICVkLyV4IixsZW4sdmlydCw0KSA7CisJbWVtY3B5KChjaGFyIGZhciAqKXZpcnQsc21jLT5vcy5od20uci5tYl9wb3MsbGVuKSA7CisJc21jLT5vcy5od20uci5tYl9wb3MgKz0gbGVuIDsKKworCU5ERF9UUkFDRSgiUkhTRSIsc21jLT5vcy5od20uci5tYl9wb3MsMCwwKSA7CisJcmV0dXJuKDApIDsKK30KKyNlbmRpZgorCisKKy8qCisgKglCRUdJTk5fTUFOVUFMX0VOVFJZKG1hY19kcnZfY2xlYXJfcnhfcXVldWUpCisgKgorICogdm9pZCBtYWNfZHJ2X2NsZWFyX3J4X3F1ZXVlKHNtYykKKyAqIHN0cnVjdCBzX3NtYyAqc21jIDsKKyAqCisgKiBmdW5jdGlvbglET1dOQ0FMTAkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5jKQorICoJCW1hY19kcnZfY2xlYXJfcnhfcXVldWUgaXMgY2FsbGVkIGJ5IHRoZSBPUy1zcGVjaWZpYyBtb2R1bGUKKyAqCQlhZnRlciBpdCBoYXMgaXNzdWVkIGEgY2FyZF9zdG9wLgorICoJCUluIHRoaXMgY2FzZSwgdGhlIGZyYW1lcyBpbiB0aGUgcmVjZWl2ZSBxdWV1ZSBhcmUgb2Jzb2xldGUgYW5kCisgKgkJc2hvdWxkIGJlIHJlbW92ZWQuIEZvciByZW1vdmluZyBtYWNfZHJ2X2NsZWFyX3J4X3F1ZXVlCisgKgkJY2FsbHMgZG1hX21hc3RlciBmb3IgZWFjaCBSeEQgYW5kIG1hY19kcnZfY2xlYXJfcnhkIGZvciBlYWNoCisgKgkJcmVjZWl2ZSBidWZmZXIuCisgKgorICogTk9URToJY2FsbGluZyBzZXF1ZW5jZSBjYXJkX3N0b3A6CisgKgkJQ0xJX0ZCSSgpLCBjYXJkX3N0b3AoKSwKKyAqCQltYWNfZHJ2X2NsZWFyX3R4X3F1ZXVlKCksIG1hY19kcnZfY2xlYXJfcnhfcXVldWUoKSwKKyAqCisgKiBOT1RFOglUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRoYXQgdGhlIEJNVXMgYXJlIGlkbGUKKyAqCQl3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLwordm9pZCBtYWNfZHJ2X2NsZWFyX3J4X3F1ZXVlKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXN0cnVjdCBzX3NtdF9mcF9yeGQgdm9sYXRpbGUgKnIgOworCXN0cnVjdCBzX3NtdF9mcF9yeGQgdm9sYXRpbGUgKm5leHRfcnhkIDsKKwlzdHJ1Y3Qgc19zbXRfcnhfcXVldWUgKnF1ZXVlIDsKKwlpbnQgZnJhZ19jb3VudCA7CisJaW50IGkgOworCisJaWYgKHNtYy0+aHcuaHdfc3RhdGUgIT0gU1RPUFBFRCkgeworCQlTS19CUkVBSygpIDsKKwkJU01UX1BBTklDKHNtYyxIV01fRTAwMTIsSFdNX0UwMDEyX01TRykgOworCQlyZXR1cm4gOworCX0KKworCXF1ZXVlID0gc21jLT5ody5mcC5yeFtRVUVVRV9SMV0gOworCURCX1JYKCJjbGVhcl9yeF9xdWV1ZSIsMCwwLDUpIDsKKworCS8qCisJICogZG1hX2NvbXBsZXRlIGFuZCBtYWNfZHJ2X2NsZWFyX3J4ZCBmb3IgYWxsIFJ4RHMgLyByZWNlaXZlIGJ1ZmZlcnMKKwkgKi8KKwlyID0gcXVldWUtPnJ4X2N1cnJfZ2V0IDsKKwl3aGlsZSAocXVldWUtPnJ4X3VzZWQpIHsKKwkJRFJWX0JVRl9GTFVTSChyLERESV9ETUFfU1lOQ19GT1JDUFUpIDsKKwkJREJfUlgoInN3aXRjaCBPV04gYml0IG9mIFJ4RCAweCV4ICIsciwwLDUpIDsKKwkJci0+cnhkX3JiY3RybCAmPSBBSVhfUkVWRVJTRSh+Qk1VX09XTikgOworCQlmcmFnX2NvdW50ID0gMSA7CisJCURSVl9CVUZfRkxVU0gocixERElfRE1BX1NZTkNfRk9SREVWKSA7CisJCXIgPSByLT5yeGRfbmV4dCA7CisJCURSVl9CVUZfRkxVU0gocixERElfRE1BX1NZTkNfRk9SQ1BVKSA7CisJCXdoaWxlIChyICE9IHF1ZXVlLT5yeF9jdXJyX3B1dCAmJgorCQkJIShyLT5yeGRfcmJjdHJsICYgQUlYX1JFVkVSU0UoQk1VX1NUX0JVRikpKSB7CisJCQlEQl9SWCgiQ2hlY2sgU1RGIGJpdCBpbiAleCIsKHZvaWQgKilyLDAsNSkgOworCQkJci0+cnhkX3JiY3RybCAmPSBBSVhfUkVWRVJTRSh+Qk1VX09XTikgOworCQkJRFJWX0JVRl9GTFVTSChyLERESV9ETUFfU1lOQ19GT1JERVYpIDsKKwkJCXIgPSByLT5yeGRfbmV4dCA7CisJCQlEUlZfQlVGX0ZMVVNIKHIsRERJX0RNQV9TWU5DX0ZPUkNQVSkgOworCQkJZnJhZ19jb3VudCsrIDsKKwkJfQorCQlEQl9SWCgiU1RGIGJpdCBmb3VuZCIsMCwwLDUpIDsKKwkJbmV4dF9yeGQgPSByIDsKKworCQlmb3IgKHI9cXVldWUtPnJ4X2N1cnJfZ2V0LGk9ZnJhZ19jb3VudDsgaSA7IHI9ci0+cnhkX25leHQsaS0tKXsKKwkJCURCX1JYKCJkbWFfY29tcGxldGUgZm9yIFJ4RCAleCIsKHZvaWQgKilyLDAsNSkgOworCQkJZG1hX2NvbXBsZXRlKHNtYywodW5pb24gc19mcF9kZXNjciB2b2xhdGlsZSAqKXIsRE1BX1dSKTsKKwkJfQorCisJCURCX1JYKCJtYWNfZHJ2X2NsZWFyX3J4ZDogUnhEICV4IGZyYWdfY291bnQgJWQgIiwKKwkJCSh2b2lkICopcXVldWUtPnJ4X2N1cnJfZ2V0LGZyYWdfY291bnQsNSkgOworCQltYWNfZHJ2X2NsZWFyX3J4ZChzbWMscXVldWUtPnJ4X2N1cnJfZ2V0LGZyYWdfY291bnQpIDsKKworCQlxdWV1ZS0+cnhfY3Vycl9nZXQgPSBuZXh0X3J4ZCA7CisJCXF1ZXVlLT5yeF91c2VkIC09IGZyYWdfY291bnQgOworCQlxdWV1ZS0+cnhfZnJlZSArPSBmcmFnX2NvdW50IDsKKwl9Cit9CisKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJU0VORCBGVU5DVElPTlM6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyoKKyAqCUJFR0lOX01BTlVBTF9FTlRSWShod21fdHhfaW5pdCkKKyAqCWludCBod21fdHhfaW5pdChzbWMsZmMsZnJhZ19jb3VudCxmcmFtZV9sZW4sZnJhbWVfc3RhdHVzKQorICoKKyAqIGZ1bmN0aW9uCURPV05fQ0FMTAkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5jKQorICoJCWh3bV90eF9pbml0IGNoZWNrcyBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCB0aGUKKyAqCQljb3JyZXNwb25kaW5nIHNlbmQgcXVldWUuCisgKgorICogcGFyYQlmYwl0aGUgZnJhbWUgY29udHJvbC4gVG8gZGV0ZXJtaW5lIHRocm91Z2ggd2hpY2gKKyAqCQlzZW5kIHF1ZXVlIHRoZSBmcmFtZSBzaG91bGQgYmUgdHJhbnNtaXR0ZWQuCisgKgkJMHg1MCAtIDB4NTc6CWFzeW5jaHJvbm91cyBMTEMgZnJhbWUKKyAqCQkweEQwIC0gMHhENzoJc3luY2hyb25vdXMgTExDIGZyYW1lCisgKgkJMHg0MSwgMHg0RjoJU01UIGZyYW1lIHRvIHRoZSBuZXR3b3JrCisgKgkJMHg0MjoJCVNNVCBmcmFtZSB0byB0aGUgbmV0d29yayBhbmQgdG8gdGhlIGxvY2FsIFNNVAorICoJCTB4NDM6CQlTTVQgZnJhbWUgdG8gdGhlIGxvY2FsIFNNVAorICoJZnJhZ19jb3VudAljb3VudCBvZiB0aGUgZnJhZ21lbnRzIGZvciB0aGlzIGZyYW1lCisgKglmcmFtZV9sZW4JbGVuZ3RoIG9mIHRoZSBmcmFtZQorICoJZnJhbWVfc3RhdHVzCXN0YXR1cyBvZiB0aGUgZnJhbWUsIHRoZSBzZW5kIHF1ZXVlIGJpdCBpcyBhbHJlYWR5CisgKgkJCXNwZWNpZmllZAorICoKKyAqIHJldHVybgkJZnJhbWVfc3RhdHVzCisgKgorICoJRU5EX01BTlVBTF9FTlRSWQorICovCitpbnQgaHdtX3R4X2luaXQoc3RydWN0IHNfc21jICpzbWMsIHVfY2hhciBmYywgaW50IGZyYWdfY291bnQsIGludCBmcmFtZV9sZW4sCisJCWludCBmcmFtZV9zdGF0dXMpCit7CisJTkREX1RSQUNFKCJUSGlCIixmYyxmcmFnX2NvdW50LGZyYW1lX2xlbikgOworCXNtYy0+b3MuaHdtLnR4X3AgPSBzbWMtPmh3LmZwLnR4W2ZyYW1lX3N0YXR1cyAmIFFVRVVFX0EwXSA7CisJc21jLT5vcy5od20udHhfZGVzY3IgPSBUWF9ERVNDUklQVE9SIHwgKCgodV9sb25nKShmcmFtZV9sZW4tMSkmMyk8PDI3KSA7CisJc21jLT5vcy5od20udHhfbGVuID0gZnJhbWVfbGVuIDsKKwlEQl9UWCgiaHdtX3R4X2luaXQ6IGZjID0gJXgsIGxlbiA9ICVkIixmYyxmcmFtZV9sZW4sMykgOworCWlmICgoZmMgJiB+KEZDX1NZTkNfQklUfEZDX0xMQ19QUklPUikpID09IEZDX0FTWU5DX0xMQykgeworCQlmcmFtZV9zdGF0dXMgfD0gTEFOX1RYIDsKKwl9CisJZWxzZSB7CisJCXN3aXRjaCAoZmMpIHsKKwkJY2FzZSBGQ19TTVRfSU5GTyA6CisJCWNhc2UgRkNfU01UX05TQSA6CisJCQlmcmFtZV9zdGF0dXMgfD0gTEFOX1RYIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBGQ19TTVRfTE9DIDoKKwkJCWZyYW1lX3N0YXR1cyB8PSBMT0NfVFggOworCQkJYnJlYWsgOworCQljYXNlIEZDX1NNVF9MQU5fTE9DIDoKKwkJCWZyYW1lX3N0YXR1cyB8PSBMQU5fVFggfCBMT0NfVFggOworCQkJYnJlYWsgOworCQlkZWZhdWx0IDoKKwkJCVNNVF9QQU5JQyhzbWMsSFdNX0UwMDEwLEhXTV9FMDAxMF9NU0cpIDsKKwkJfQorCX0KKwlpZiAoIXNtYy0+aHcubWFjX3JpbmdfaXNfdXApIHsKKwkJZnJhbWVfc3RhdHVzICY9IH5MQU5fVFggOworCQlmcmFtZV9zdGF0dXMgfD0gUklOR19ET1dOIDsKKwkJREJfVFgoIlJpbmcgaXMgZG93bjogdGVybWluYXRlIExBTl9UWCIsMCwwLDIpIDsKKwl9CisJaWYgKGZyYWdfY291bnQgPiBzbWMtPm9zLmh3bS50eF9wLT50eF9mcmVlKSB7CisjaWZuZGVmCU5ESVNfT1MyCisJCW1hY19kcnZfY2xlYXJfdHhkKHNtYykgOworCQlpZiAoZnJhZ19jb3VudCA+IHNtYy0+b3MuaHdtLnR4X3AtPnR4X2ZyZWUpIHsKKwkJCURCX1RYKCJPdXQgb2YgVHhEcywgdGVybWluYXRlIExBTl9UWCIsMCwwLDIpIDsKKwkJCWZyYW1lX3N0YXR1cyAmPSB+TEFOX1RYIDsKKwkJCWZyYW1lX3N0YXR1cyB8PSBPVVRfT0ZfVFhEIDsKKwkJfQorI2Vsc2UKKwkJREJfVFgoIk91dCBvZiBUeERzLCB0ZXJtaW5hdGUgTEFOX1RYIiwwLDAsMikgOworCQlmcmFtZV9zdGF0dXMgJj0gfkxBTl9UWCA7CisJCWZyYW1lX3N0YXR1cyB8PSBPVVRfT0ZfVFhEIDsKKyNlbmRpZgorCX0KKwlEQl9UWCgiZnJhbWVfc3RhdHVzID0gJXgiLGZyYW1lX3N0YXR1cywwLDMpIDsKKwlORERfVFJBQ0UoIlRIaUUiLGZyYW1lX3N0YXR1cyxzbWMtPm9zLmh3bS50eF9wLT50eF9mcmVlLDApIDsKKwlyZXR1cm4oZnJhbWVfc3RhdHVzKSA7Cit9CisKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkoaHdtX3R4X2ZyYWcpCisgKgl2b2lkIGh3bV90eF9mcmFnKHNtYyx2aXJ0LHBoeXMsbGVuLGZyYW1lX3N0YXR1cykKKyAqCisgKiBmdW5jdGlvbglET1dOQ0FMTAkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5jKQorICoJCUlmIHRoZSBmcmFtZSBzaG91bGQgYmUgc2VudCB0byB0aGUgTEFOLCB0aGlzIGZ1bmN0aW9uIGNhbGxzCisgKgkJZG1hX21hc3RlciwgZmlsbHMgdGhlIGN1cnJlbnQgVHhEIHdpdGggdGhlIHZpcnR1YWwgYW5kIHRoZQorICoJCXBoeXNpY2FsIGFkZHJlc3MsIHNldHMgdGhlIFNURiBhbmQgRU9GIGJpdHMgZGVwZW5kZW50IG9uCisgKgkJdGhlIGZyYW1lIHN0YXR1cywgYW5kIHJlcXVlc3RzIHRoZSBCTVUgdG8gc3RhcnQgdGhlCisgKgkJdHJhbnNtaXQuCisgKgkJSWYgdGhlIGZyYW1lIHNob3VsZCBiZSBzZW50IHRvIHRoZSBsb2NhbCBTTVQsIGFuIFNNVF9NQnVmCisgKgkJaXMgYWxsb2NhdGVkIGlmIHRoZSBGSVJTVF9GUkFHIGJpdCBpcyBzZXQgaW4gdGhlIGZyYW1lX3N0YXR1cy4KKyAqCQlUaGUgZnJhZ21lbnQgb2YgdGhlIGZyYW1lIGlzIGNvcGllZCBpbnRvIHRoZSBTTVQgTUJ1Zi4KKyAqCQlUaGUgZnVuY3Rpb24gc210X3JlY2VpdmVkX3BhY2sgaXMgY2FsbGVkIGlmIHRoZSBMQVNUX0ZSQUcKKyAqCQliaXQgaXMgc2V0IGluIHRoZSBmcmFtZV9zdGF0dXMgd29yZC4KKyAqCisgKiBwYXJhCXZpcnQJdmlydHVhbCBwb2ludGVyIHRvIHRoZSBmcmFnbWVudAorICoJbGVuCXRoZSBsZW5ndGggb2YgdGhlIGZyYWdtZW50CisgKglmcmFtZV9zdGF0dXMJc3RhdHVzIG9mIHRoZSBmcmFtZSwgc2VlIGRlc2lnbiBkZXNjcmlwdGlvbgorICoKKyAqIHJldHVybglub3RoaW5nIHJldHVybmVkLCBubyBwYXJhbWV0ZXIgaXMgbW9kaWZpZWQKKyAqCisgKiBOT1RFOglJdCBpcyBwb3NzaWJsZSB0byBpbnZva2UgdGhpcyBtYWNybyB3aXRoIGEgZnJhZ21lbnQgbGVuZ3RoCisgKgkJb2YgemVyby4KKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KK3ZvaWQgaHdtX3R4X2ZyYWcoc3RydWN0IHNfc21jICpzbWMsIGNoYXIgZmFyICp2aXJ0LCB1X2xvbmcgcGh5cywgaW50IGxlbiwKKwkJIGludCBmcmFtZV9zdGF0dXMpCit7CisJc3RydWN0IHNfc210X2ZwX3R4ZCB2b2xhdGlsZSAqdCA7CisJc3RydWN0IHNfc210X3R4X3F1ZXVlICpxdWV1ZSA7CisJdV9pbnQJdGJjdHJsIDsKKworCXF1ZXVlID0gc21jLT5vcy5od20udHhfcCA7CisKKwlORERfVFJBQ0UoIlRIZkIiLHZpcnQsbGVuLGZyYW1lX3N0YXR1cykgOworCS8qIEJ1ZyBmaXg6IEFGIC8gTWF5IDMxIDE5OTkgKCNtaXNzaW5nKQorCSAqIHNubXBpbmZvIHByb2JsZW0gcmVwb3J0ZWQgYnkgSUJNIGlzIGNhdXNlZCBieSBpbnZhbGlkCisJICogdC1wb2ludGVyICh0eGQpIGlmIExBTl9UWCBpcyBub3Qgc2V0IGJ1dCBMT0NfVFggb25seS4KKwkgKiBTZXQ6IHQgPSBxdWV1ZS0+dHhfY3Vycl9wdXQgIGhlcmUgIQorCSAqLworCXQgPSBxdWV1ZS0+dHhfY3Vycl9wdXQgOworCisJREJfVFgoImh3bV90eF9mcmFnOiBsZW4gPSAlZCwgZnJhbWVfc3RhdHVzID0gJXggIixsZW4sZnJhbWVfc3RhdHVzLDIpIDsKKwlpZiAoZnJhbWVfc3RhdHVzICYgTEFOX1RYKSB7CisJCS8qICcqdCcgaXMgYWxyZWFkeSBkZWZpbmVkICovCisJCURCX1RYKCJMQU5fVFg6IFR4RCA9ICV4LCB2aXJ0ID0gJXggIix0LHZpcnQsMykgOworCQl0LT50eGRfdmlydCA9IHZpcnQgOworCQl0LT50eGRfdHhkc2NyID0gQUlYX1JFVkVSU0Uoc21jLT5vcy5od20udHhfZGVzY3IpIDsKKwkJdC0+dHhkX3RiYWRyID0gQUlYX1JFVkVSU0UocGh5cykgOworCQl0YmN0cmwgPSBBSVhfUkVWRVJTRSgoKCh1X2xvbmcpZnJhbWVfc3RhdHVzICYKKwkJCShGSVJTVF9GUkFHfExBU1RfRlJBR3xFTl9JUlFfRU9GKSk8PCAyNikgfAorCQkJQk1VX09XTnxCTVVfQ0hFQ0sgfGxlbikgOworCQl0LT50eGRfdGJjdHJsID0gdGJjdHJsIDsKKworI2lmbmRlZglBSVgKKwkJRFJWX0JVRl9GTFVTSCh0LERESV9ETUFfU1lOQ19GT1JERVYpIDsKKwkJb3V0cGQocXVldWUtPnR4X2JtdV9jdGwsQ1NSX1NUQVJUKSA7CisjZWxzZQkvKiBpZm5kZWYgQUlYICovCisJCURSVl9CVUZfRkxVU0godCxERElfRE1BX1NZTkNfRk9SREVWKSA7CisJCWlmIChmcmFtZV9zdGF0dXMgJiBRVUVVRV9BMCkgeworCQkJb3V0cGQoQUREUihCMF9YQV9DU1IpLENTUl9TVEFSVCkgOworCQl9CisJCWVsc2UgeworCQkJb3V0cGQoQUREUihCMF9YU19DU1IpLENTUl9TVEFSVCkgOworCQl9CisjZW5kaWYKKwkJcXVldWUtPnR4X2ZyZWUtLSA7CisJCXF1ZXVlLT50eF91c2VkKysgOworCQlxdWV1ZS0+dHhfY3Vycl9wdXQgPSB0LT50eGRfbmV4dCA7CisJCWlmIChmcmFtZV9zdGF0dXMgJiBMQVNUX0ZSQUcpIHsKKwkJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1RyYW5zbWl0X0N0KysgOworCQl9CisJfQorCWlmIChmcmFtZV9zdGF0dXMgJiBMT0NfVFgpIHsKKwkJREJfVFgoIkxPQ19UWDogIiwwLDAsMykgOworCQlpZiAoZnJhbWVfc3RhdHVzICYgRklSU1RfRlJBRykgeworCQkJaWYoIShzbWMtPm9zLmh3bS50eF9tYiA9IHNtdF9nZXRfbWJ1ZihzbWMpKSkgeworCQkJCXNtYy0+aHcuZnAuZXJyX3N0YXRzLmVycl9ub19idWYrKyA7CisJCQkJREJfVFgoIk5vIFNNYnVmOyB0cmFuc21pdCB0ZXJtaW5hdGVkIiwwLDAsNCkgOworCQkJfQorCQkJZWxzZSB7CisJCQkJc21jLT5vcy5od20udHhfZGF0YSA9CisJCQkJCXNtdG9kKHNtYy0+b3MuaHdtLnR4X21iLGNoYXIgKikgLSAxIDsKKyNpZmRlZiBVU0VfT1NfQ1BZCisjaWZkZWYgUEFTU18xU1RfVFhEXzJfVFhfQ09NUAorCQkJCWh3bV9jcHlfdHhkMm1iKHQsc21jLT5vcy5od20udHhfZGF0YSwKKwkJCQkJc21jLT5vcy5od20udHhfbGVuKSA7CisjZW5kaWYKKyNlbmRpZgorCQkJfQorCQl9CisJCWlmIChzbWMtPm9zLmh3bS50eF9tYikgeworI2lmbmRlZglVU0VfT1NfQ1BZCisJCQlEQl9UWCgiY29weSBmcmFnbWVudCBpbnRvIE1CdWYgIiwwLDAsMykgOworCQkJbWVtY3B5KHNtYy0+b3MuaHdtLnR4X2RhdGEsdmlydCxsZW4pIDsKKwkJCXNtYy0+b3MuaHdtLnR4X2RhdGEgKz0gbGVuIDsKKyNlbmRpZgorCQkJaWYgKGZyYW1lX3N0YXR1cyAmIExBU1RfRlJBRykgeworI2lmZGVmCVVTRV9PU19DUFkKKyNpZm5kZWYgUEFTU18xU1RfVFhEXzJfVFhfQ09NUAorCQkJCS8qCisJCQkJICogaHdtX2NweV90eGQybWIodHhkLGRhdGEsbGVuKSBjb3BpZXMgJ2xlbicgCisJCQkJICogYnl0ZXMgZnJvbSB0aGUgdmlydHVhbCBwb2ludGVyIGluICdyeGQnCisJCQkJICogdG8gJ2RhdGEnLiBUaGUgdmlydHVhbCBwb2ludGVyIG9mIHRoZSAKKwkJCQkgKiBvcy1zcGVjaWZpYyB0eC1idWZmZXIgc2hvdWxkIGJlIHdyaXR0ZW4KKwkJCQkgKiBpbiB0aGUgTEFTVCB0eGQuCisJCQkJICovIAorCQkJCWh3bV9jcHlfdHhkMm1iKHQsc21jLT5vcy5od20udHhfZGF0YSwKKwkJCQkJc21jLT5vcy5od20udHhfbGVuKSA7CisjZW5kaWYJLyogblBBU1NfMVNUX1RYRF8yX1RYX0NPTVAgKi8KKyNlbmRpZgkvKiBVU0VfT1NfQ1BZICovCisJCQkJc21jLT5vcy5od20udHhfZGF0YSA9CisJCQkJCXNtdG9kKHNtYy0+b3MuaHdtLnR4X21iLGNoYXIgKikgLSAxIDsKKwkJCQkqKGNoYXIgKilzbWMtPm9zLmh3bS50eF9tYi0+c21fZGF0YSA9CisJCQkJCSpzbWMtPm9zLmh3bS50eF9kYXRhIDsKKwkJCQlzbWMtPm9zLmh3bS50eF9kYXRhKysgOworCQkJCXNtYy0+b3MuaHdtLnR4X21iLT5zbV9sZW4gPQorCQkJCQlzbWMtPm9zLmh3bS50eF9sZW4gLSAxIDsKKwkJCQlEQl9UWCgicGFzcyBMTEMgZnJhbWUgdG8gU01UICIsMCwwLDMpIDsKKwkJCQlzbXRfcmVjZWl2ZWRfcGFjayhzbWMsc21jLT5vcy5od20udHhfbWIsCisJCQkJCQlSRF9GU19MT0NBTCkgOworCQkJfQorCQl9CisJfQorCU5ERF9UUkFDRSgiVEhmRSIsdCxxdWV1ZS0+dHhfZnJlZSwwKSA7Cit9CisKKworLyoKKyAqIHF1ZXVlcyBhIHJlY2VpdmUgZm9yIGxhdGVyIHNlbmQKKyAqLworc3RhdGljIHZvaWQgcXVldWVfbGxjX3J4KHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIpCit7CisJREJfR0VOKCJxdWV1ZV9sbGNfcng6IG1iID0gJXgiLCh2b2lkICopbWIsMCw0KSA7CisJc21jLT5vcy5od20ucXVldWVkX3J4X2ZyYW1lcysrIDsKKwltYi0+c21fbmV4dCA9IChTTWJ1ZiAqKU5VTEwgOworCWlmIChzbWMtPm9zLmh3bS5sbGNfcnhfcGlwZSA9PSAwKSB7CisJCXNtYy0+b3MuaHdtLmxsY19yeF9waXBlID0gbWIgOworCX0KKwllbHNlIHsKKwkJc21jLT5vcy5od20ubGxjX3J4X3RhaWwtPnNtX25leHQgPSBtYiA7CisJfQorCXNtYy0+b3MuaHdtLmxsY19yeF90YWlsID0gbWIgOworCisJLyoKKwkgKiBmb3JjZSBhbiB0aW1lciBJUlEgdG8gcmVjZWl2ZSB0aGUgZGF0YQorCSAqLworCWlmICghc21jLT5vcy5od20uaXNyX2ZsYWcpIHsKKwkJc210X2ZvcmNlX2lycShzbWMpIDsKKwl9Cit9CisKKy8qCisgKiBnZXQgYSBTTWJ1ZiBmcm9tIHRoZSBsbGNfcnhfcXVldWUKKyAqLworc3RhdGljIFNNYnVmICpnZXRfbGxjX3J4KHN0cnVjdCBzX3NtYyAqc21jKQoreworCVNNYnVmCSptYiA7CisKKwlpZiAoKG1iID0gc21jLT5vcy5od20ubGxjX3J4X3BpcGUpKSB7CisJCXNtYy0+b3MuaHdtLnF1ZXVlZF9yeF9mcmFtZXMtLSA7CisJCXNtYy0+b3MuaHdtLmxsY19yeF9waXBlID0gbWItPnNtX25leHQgOworCX0KKwlEQl9HRU4oImdldF9sbGNfcng6IG1iID0gMHgleCIsKHZvaWQgKiltYiwwLDQpIDsKKwlyZXR1cm4obWIpIDsKK30KKworLyoKKyAqIHF1ZXVlcyBhIHRyYW5zbWl0IFNNVCBNQnVmIGR1cmluZyB0aGUgdGltZSB3ZXJlIHRoZSBNQnVmIGlzCisgKiBxdWV1ZWQgdGhlIFR4RCByaW5nCisgKi8KK3N0YXRpYyB2b2lkIHF1ZXVlX3R4ZF9tYihzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iKQoreworCURCX0dFTigiX3J4OiBxdWV1ZV90eGRfbWIgPSAleCIsKHZvaWQgKiltYiwwLDQpIDsKKwlzbWMtPm9zLmh3bS5xdWV1ZWRfdHhkX21iKysgOworCW1iLT5zbV9uZXh0ID0gKFNNYnVmICopTlVMTCA7CisJaWYgKHNtYy0+b3MuaHdtLnR4ZF90eF9waXBlID09IDApIHsKKwkJc21jLT5vcy5od20udHhkX3R4X3BpcGUgPSBtYiA7CisJfQorCWVsc2UgeworCQlzbWMtPm9zLmh3bS50eGRfdHhfdGFpbC0+c21fbmV4dCA9IG1iIDsKKwl9CisJc21jLT5vcy5od20udHhkX3R4X3RhaWwgPSBtYiA7Cit9CisKKy8qCisgKiBnZXQgYSBTTWJ1ZiBmcm9tIHRoZSB0eGRfdHhfcXVldWUKKyAqLworc3RhdGljIFNNYnVmICpnZXRfdHhkX21iKHN0cnVjdCBzX3NtYyAqc21jKQoreworCVNNYnVmICptYiA7CisKKwlpZiAoKG1iID0gc21jLT5vcy5od20udHhkX3R4X3BpcGUpKSB7CisJCXNtYy0+b3MuaHdtLnF1ZXVlZF90eGRfbWItLSA7CisJCXNtYy0+b3MuaHdtLnR4ZF90eF9waXBlID0gbWItPnNtX25leHQgOworCX0KKwlEQl9HRU4oImdldF90eGRfbWI6IG1iID0gMHgleCIsKHZvaWQgKiltYiwwLDQpIDsKKwlyZXR1cm4obWIpIDsKK30KKworLyoKKyAqCVNNVCBTZW5kIGZ1bmN0aW9uCisgKi8KK3ZvaWQgc210X3NlbmRfbWJ1ZihzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iLCBpbnQgZmMpCit7CisJY2hhciBmYXIgKmRhdGEgOworCWludAlsZW4gOworCWludAluIDsKKwlpbnQJaSA7CisJaW50CWZyYWdfY291bnQgOworCWludAlmcmFtZV9zdGF0dXMgOworCVNLX0xPQ19ERUNMKGNoYXIgZmFyLCp2aXJ0WzNdKSA7CisJaW50CWZyYWdfbGVuWzNdIDsKKwlzdHJ1Y3Qgc19zbXRfdHhfcXVldWUgKnF1ZXVlIDsKKwlzdHJ1Y3Qgc19zbXRfZnBfdHhkIHZvbGF0aWxlICp0IDsKKwl1X2xvbmcJcGh5cyA7CisJdV9pbnQJdGJjdHJsIDsKKworCU5ERF9UUkFDRSgiVEhTQiIsbWIsZmMsMCkgOworCURCX1RYKCJzbXRfc2VuZF9tYnVmOiBtYiA9IDB4JXgsIGZjID0gMHgleCIsbWIsZmMsNCkgOworCisJbWItPnNtX29mZi0tIDsJLyogc2V0IHRvIGZjICovCisJbWItPnNtX2xlbisrIDsJLyogKyBmYyAqLworCWRhdGEgPSBzbXRvZChtYixjaGFyICopIDsKKwkqZGF0YSA9IGZjIDsKKwlpZiAoZmMgPT0gRkNfU01UX0xPQykKKwkJKmRhdGEgPSBGQ19TTVRfSU5GTyA7CisKKwkvKgorCSAqIGRldGVybWluZSB0aGUgZnJhZyBjb3VudCBhbmQgdGhlIHZpcnQgYWRkcmVzc2VzIG9mIHRoZSBmcmFncworCSAqLworCWZyYWdfY291bnQgPSAwIDsKKwlsZW4gPSBtYi0+c21fbGVuIDsKKwl3aGlsZSAobGVuKSB7CisJCW4gPSBTTVRfUEFHRVNJWkUgLSAoKGxvbmcpZGF0YSAmIChTTVRfUEFHRVNJWkUtMSkpIDsKKwkJaWYgKG4gPj0gbGVuKSB7CisJCQluID0gbGVuIDsKKwkJfQorCQlEQl9UWCgiZnJhZzogdmlydC9sZW4gPSAweCV4LyVkICIsKHZvaWQgKilkYXRhLG4sNSkgOworCQl2aXJ0W2ZyYWdfY291bnRdID0gZGF0YSA7CisJCWZyYWdfbGVuW2ZyYWdfY291bnRdID0gbiA7CisJCWZyYWdfY291bnQrKyA7CisJCWxlbiAtPSBuIDsKKwkJZGF0YSArPSBuIDsKKwl9CisKKwkvKgorCSAqIGRldGVybWluZSB0aGUgZnJhbWUgc3RhdHVzCisJICovCisJcXVldWUgPSBzbWMtPmh3LmZwLnR4W1FVRVVFX0EwXSA7CisJaWYgKGZjID09IEZDX0JFQUNPTiB8fCBmYyA9PSBGQ19TTVRfTE9DKSB7CisJCWZyYW1lX3N0YXR1cyA9IExPQ19UWCA7CisJfQorCWVsc2UgeworCQlmcmFtZV9zdGF0dXMgPSBMQU5fVFggOworCQlpZiAoKHNtYy0+b3MuaHdtLnBhc3NfTlNBICYmKGZjID09IEZDX1NNVF9OU0EpKSB8fAorCQkgICAoc21jLT5vcy5od20ucGFzc19TTVQgJiYoZmMgPT0gRkNfU01UX0lORk8pKSkKKwkJCWZyYW1lX3N0YXR1cyB8PSBMT0NfVFggOworCX0KKworCWlmICghc21jLT5ody5tYWNfcmluZ19pc191cCB8fCBmcmFnX2NvdW50ID4gcXVldWUtPnR4X2ZyZWUpIHsKKwkJZnJhbWVfc3RhdHVzICY9IH5MQU5fVFg7CisJCWlmIChmcmFtZV9zdGF0dXMpIHsKKwkJCURCX1RYKCJSaW5nIGlzIGRvd246IHRlcm1pbmF0ZSBMQU5fVFgiLDAsMCwyKSA7CisJCX0KKwkJZWxzZSB7CisJCQlEQl9UWCgiUmluZyBpcyBkb3duOiB0ZXJtaW5hdGUgdHJhbnNtaXNzaW9uIiwwLDAsMikgOworCQkJc210X2ZyZWVfbWJ1ZihzbWMsbWIpIDsKKwkJCXJldHVybiA7CisJCX0KKwl9CisJREJfVFgoImZyYW1lX3N0YXR1cyA9IDB4JXggIixmcmFtZV9zdGF0dXMsMCw1KSA7CisKKwlpZiAoKGZyYW1lX3N0YXR1cyAmIExBTl9UWCkgJiYgKGZyYW1lX3N0YXR1cyAmIExPQ19UWCkpIHsKKwkJbWItPnNtX3VzZV9jb3VudCA9IDIgOworCX0KKworCWlmIChmcmFtZV9zdGF0dXMgJiBMQU5fVFgpIHsKKwkJdCA9IHF1ZXVlLT50eF9jdXJyX3B1dCA7CisJCWZyYW1lX3N0YXR1cyB8PSBGSVJTVF9GUkFHIDsKKwkJZm9yIChpID0gMDsgaSA8IGZyYWdfY291bnQ7IGkrKykgeworCQkJREJfVFgoImluaXQgVHhEID0gMHgleCIsKHZvaWQgKil0LDAsNSkgOworCQkJaWYgKGkgPT0gZnJhZ19jb3VudC0xKSB7CisJCQkJZnJhbWVfc3RhdHVzIHw9IExBU1RfRlJBRyA7CisJCQkJdC0+dHhkX3R4ZHNjciA9IEFJWF9SRVZFUlNFKFRYX0RFU0NSSVBUT1IgfAorCQkJCQkoKCh1X2xvbmcpKG1iLT5zbV9sZW4tMSkmMykgPDwgMjcpKSA7CisJCQl9CisJCQl0LT50eGRfdmlydCA9IHZpcnRbaV0gOworCQkJcGh5cyA9IGRtYV9tYXN0ZXIoc21jLCAodm9pZCBmYXIgKil2aXJ0W2ldLAorCQkJCWZyYWdfbGVuW2ldLCBETUFfUkR8U01UX0JVRikgOworCQkJdC0+dHhkX3RiYWRyID0gQUlYX1JFVkVSU0UocGh5cykgOworCQkJdGJjdHJsID0gQUlYX1JFVkVSU0UoKCgodV9sb25nKSBmcmFtZV9zdGF0dXMgJgorCQkJCShGSVJTVF9GUkFHfExBU1RfRlJBRykpIDw8IDI2KSB8CisJCQkJQk1VX09XTiB8IEJNVV9DSEVDSyB8IEJNVV9TTVRfVFggfGZyYWdfbGVuW2ldKSA7CisJCQl0LT50eGRfdGJjdHJsID0gdGJjdHJsIDsKKyNpZm5kZWYJQUlYCisJCQlEUlZfQlVGX0ZMVVNIKHQsRERJX0RNQV9TWU5DX0ZPUkRFVikgOworCQkJb3V0cGQocXVldWUtPnR4X2JtdV9jdGwsQ1NSX1NUQVJUKSA7CisjZWxzZQorCQkJRFJWX0JVRl9GTFVTSCh0LERESV9ETUFfU1lOQ19GT1JERVYpIDsKKwkJCW91dHBkKEFERFIoQjBfWEFfQ1NSKSxDU1JfU1RBUlQpIDsKKyNlbmRpZgorCQkJZnJhbWVfc3RhdHVzICY9IH5GSVJTVF9GUkFHIDsKKwkJCXF1ZXVlLT50eF9jdXJyX3B1dCA9IHQgPSB0LT50eGRfbmV4dCA7CisJCQlxdWV1ZS0+dHhfZnJlZS0tIDsKKwkJCXF1ZXVlLT50eF91c2VkKysgOworCQl9CisJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1RyYW5zbWl0X0N0KysgOworCQlxdWV1ZV90eGRfbWIoc21jLG1iKSA7CisJfQorCisJaWYgKGZyYW1lX3N0YXR1cyAmIExPQ19UWCkgeworCQlEQl9UWCgicGFzcyBNYnVmIHRvIExMQyBxdWV1ZSIsMCwwLDUpIDsKKwkJcXVldWVfbGxjX3J4KHNtYyxtYikgOworCX0KKworCS8qCisJICogV2UgbmVlZCB0byB1bnF1ZXVlIHRoZSBmcmVlIFNNVF9NQlVGcyBoZXJlLCBiZWNhdXNlIGl0IG1heQorCSAqIGJlIHRoYXQgdGhlIFNNVCB3YW50J3MgdG8gc2VuZCBtb3JlIHRoYW4gMSBmcmFtZSBmb3Igb25lIGRvd24gY2FsbAorCSAqLworCW1hY19kcnZfY2xlYXJfdHhkKHNtYykgOworCU5ERF9UUkFDRSgiVEhTRSIsdCxxdWV1ZS0+dHhfZnJlZSxmcmFnX2NvdW50KSA7Cit9CisKKy8qCUJFR0lOX01BTlVBTF9FTlRSWShtYWNfZHJ2X2NsZWFyX3R4ZCkKKyAqCXZvaWQgbWFjX2Rydl9jbGVhcl90eGQoc21jKQorICoKKyAqIGZ1bmN0aW9uCURPV05DQUxMCShoYXJkd2FyZSBtb2R1bGUsIGh3bXRtLmMpCisgKgkJbWFjX2Rydl9jbGVhcl90eGQgc2VhcmNoZXMgaW4gYm90aCBzZW5kIHF1ZXVlcyBmb3IgVHhEJ3MKKyAqCQl3aGljaCB3ZXJlIGZpbmlzaGVkIGJ5IHRoZSBhZGFwdGVyLiBJdCBjYWxscyBkbWFfY29tcGxldGUKKyAqCQlmb3IgZWFjaCBUeEQuIElmIHRoZSBsYXN0IGZyYWdtZW50IG9mIGFuIExMQyBmcmFtZSBpcworICoJCXJlYWNoZWQsIGl0IGNhbGxzIG1hY19kcnZfdHhfY29tcGxldGUgdG8gcmVsZWFzZSB0aGUKKyAqCQlzZW5kIGJ1ZmZlci4KKyAqCisgKiByZXR1cm4Jbm90aGluZworICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLwordm9pZCBtYWNfZHJ2X2NsZWFyX3R4ZChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3Qgc19zbXRfdHhfcXVldWUgKnF1ZXVlIDsKKwlzdHJ1Y3Qgc19zbXRfZnBfdHhkIHZvbGF0aWxlICp0MSA7CisJc3RydWN0IHNfc210X2ZwX3R4ZCB2b2xhdGlsZSAqdDIgPSBOVUxMIDsKKwlTTWJ1ZiAqbWIgOworCXVfbG9uZwl0YmN0cmwgOworCWludCBpIDsKKwlpbnQgZnJhZ19jb3VudCA7CisJaW50IG4gOworCisJTkREX1RSQUNFKCJUSGNCIiwwLDAsMCkgOworCWZvciAoaSA9IFFVRVVFX1M7IGkgPD0gUVVFVUVfQTA7IGkrKykgeworCQlxdWV1ZSA9IHNtYy0+aHcuZnAudHhbaV0gOworCQl0MSA9IHF1ZXVlLT50eF9jdXJyX2dldCA7CisJCURCX1RYKCJjbGVhcl90eGQ6IFFVRVVFID0gJWQgKDA9c3luYy8xPWFzeW5jKSIsaSwwLDUpIDsKKworCQlmb3IgKCA7IDsgKSB7CisJCQlmcmFnX2NvdW50ID0gMCA7CisKKwkJCWRvIHsKKwkJCQlEUlZfQlVGX0ZMVVNIKHQxLERESV9ETUFfU1lOQ19GT1JDUFUpIDsKKwkJCQlEQl9UWCgiY2hlY2sgT1dOL0VPRiBiaXQgb2YgVHhEIDB4JXgiLHQxLDAsNSkgOworCQkJCXRiY3RybCA9IENSX1JFQUQodDEtPnR4ZF90YmN0cmwpIDsKKwkJCQl0YmN0cmwgPSBBSVhfUkVWRVJTRSh0YmN0cmwpIDsKKworCQkJCWlmICh0YmN0cmwgJiBCTVVfT1dOIHx8ICFxdWV1ZS0+dHhfdXNlZCl7CisJCQkJCURCX1RYKCJFbmQgb2YgVHhEcyBxdWV1ZSAlZCIsaSwwLDQpIDsKKwkJCQkJZ290byBmcmVlX25leHRfcXVldWUgOwkvKiBuZXh0IHF1ZXVlICovCisJCQkJfQorCQkJCXQxID0gdDEtPnR4ZF9uZXh0IDsKKwkJCQlmcmFnX2NvdW50KysgOworCQkJfSB3aGlsZSAoISh0YmN0cmwgJiBCTVVfRU9GKSkgOworCisJCQl0MSA9IHF1ZXVlLT50eF9jdXJyX2dldCA7CisJCQlmb3IgKG4gPSBmcmFnX2NvdW50OyBuOyBuLS0pIHsKKwkJCQl0YmN0cmwgPSBBSVhfUkVWRVJTRSh0MS0+dHhkX3RiY3RybCkgOworCQkJCWRtYV9jb21wbGV0ZShzbWMsCisJCQkJCSh1bmlvbiBzX2ZwX2Rlc2NyIHZvbGF0aWxlICopIHQxLAorCQkJCQkoaW50KSAoRE1BX1JEIHwKKwkJCQkJKCh0YmN0cmwgJiBCTVVfU01UX1RYKSA+PiAxOCkpKSA7CisJCQkJdDIgPSB0MSA7CisJCQkJdDEgPSB0MS0+dHhkX25leHQgOworCQkJfQorCisJCQlpZiAodGJjdHJsICYgQk1VX1NNVF9UWCkgeworCQkJCW1iID0gZ2V0X3R4ZF9tYihzbWMpIDsKKwkJCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworCQkJfQorCQkJZWxzZSB7CisjaWZuZGVmIFBBU1NfMVNUX1RYRF8yX1RYX0NPTVAKKwkJCQlEQl9UWCgibWFjX2Rydl90eF9jb21wIGZvciBUeEQgMHgleCIsdDIsMCw0KSA7CisJCQkJbWFjX2Rydl90eF9jb21wbGV0ZShzbWMsdDIpIDsKKyNlbHNlCisJCQkJREJfVFgoIm1hY19kcnZfdHhfY29tcCBmb3IgVHhEIDB4JXgiLAorCQkJCQlxdWV1ZS0+dHhfY3Vycl9nZXQsMCw0KSA7CisJCQkJbWFjX2Rydl90eF9jb21wbGV0ZShzbWMscXVldWUtPnR4X2N1cnJfZ2V0KSA7CisjZW5kaWYKKwkJCX0KKwkJCXF1ZXVlLT50eF9jdXJyX2dldCA9IHQxIDsKKwkJCXF1ZXVlLT50eF9mcmVlICs9IGZyYWdfY291bnQgOworCQkJcXVldWUtPnR4X3VzZWQgLT0gZnJhZ19jb3VudCA7CisJCX0KK2ZyZWVfbmV4dF9xdWV1ZTogOworCX0KKwlORERfVFJBQ0UoIlRIY0UiLDAsMCwwKSA7Cit9CisKKy8qCisgKglCRUdJTk5fTUFOVUFMX0VOVFJZKG1hY19kcnZfY2xlYXJfdHhfcXVldWUpCisgKgorICogdm9pZCBtYWNfZHJ2X2NsZWFyX3R4X3F1ZXVlKHNtYykKKyAqIHN0cnVjdCBzX3NtYyAqc21jIDsKKyAqCisgKiBmdW5jdGlvbglET1dOQ0FMTAkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5jKQorICoJCW1hY19kcnZfY2xlYXJfdHhfcXVldWUgaXMgY2FsbGVkIGZyb20gdGhlIFNNVCB3aGVuCisgKgkJdGhlIFJNVCBzdGF0ZSBtYWNoaW5lIGhhcyBlbnRlcmVkIHRoZSBJU09MQVRFIHN0YXRlLgorICoJCVRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgYnkgdGhlIG9zLXNwZWNpZmljIG1vZHVsZQorICoJCWFmdGVyIGl0IGhhcyBjYWxsZWQgdGhlIGZ1bmN0aW9uIGNhcmRfc3RvcCgpLgorICoJCUluIHRoaXMgY2FzZSwgdGhlIGZyYW1lcyBpbiB0aGUgc2VuZCBxdWV1ZXMgYXJlIG9ic29sZXRlIGFuZAorICoJCXNob3VsZCBiZSByZW1vdmVkLgorICoKKyAqIG5vdGUJCWNhbGxpbmcgc2VxdWVuY2U6CisgKgkJQ0xJX0ZCSSgpLCBjYXJkX3N0b3AoKSwKKyAqCQltYWNfZHJ2X2NsZWFyX3R4X3F1ZXVlKCksIG1hY19kcnZfY2xlYXJfcnhfcXVldWUoKSwKKyAqCisgKiBOT1RFOglUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRoYXQgdGhlIEJNVXMgYXJlIGlkbGUKKyAqCQl3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLwordm9pZCBtYWNfZHJ2X2NsZWFyX3R4X3F1ZXVlKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXN0cnVjdCBzX3NtdF9mcF90eGQgdm9sYXRpbGUgKnQgOworCXN0cnVjdCBzX3NtdF90eF9xdWV1ZSAqcXVldWUgOworCWludCB0eF91c2VkIDsKKwlpbnQgaSA7CisKKwlpZiAoc21jLT5ody5od19zdGF0ZSAhPSBTVE9QUEVEKSB7CisJCVNLX0JSRUFLKCkgOworCQlTTVRfUEFOSUMoc21jLEhXTV9FMDAxMSxIV01fRTAwMTFfTVNHKSA7CisJCXJldHVybiA7CisJfQorCisJZm9yIChpID0gUVVFVUVfUzsgaSA8PSBRVUVVRV9BMDsgaSsrKSB7CisJCXF1ZXVlID0gc21jLT5ody5mcC50eFtpXSA7CisJCURCX1RYKCJjbGVhcl90eF9xdWV1ZTogUVVFVUUgPSAlZCAoMD1zeW5jLzE9YXN5bmMpIixpLDAsNSkgOworCisJCS8qCisJCSAqIHN3aXRjaCB0aGUgT1dOIGJpdCBvZiBhbGwgcGVuZGluZyBmcmFtZXMgdG8gdGhlIGhvc3QKKwkJICovCisJCXQgPSBxdWV1ZS0+dHhfY3Vycl9nZXQgOworCQl0eF91c2VkID0gcXVldWUtPnR4X3VzZWQgOworCQl3aGlsZSAodHhfdXNlZCkgeworCQkJRFJWX0JVRl9GTFVTSCh0LERESV9ETUFfU1lOQ19GT1JDUFUpIDsKKwkJCURCX1RYKCJzd2l0Y2ggT1dOIGJpdCBvZiBUeEQgMHgleCAiLHQsMCw1KSA7CisJCQl0LT50eGRfdGJjdHJsICY9IEFJWF9SRVZFUlNFKH5CTVVfT1dOKSA7CisJCQlEUlZfQlVGX0ZMVVNIKHQsRERJX0RNQV9TWU5DX0ZPUkRFVikgOworCQkJdCA9IHQtPnR4ZF9uZXh0IDsKKwkJCXR4X3VzZWQtLSA7CisJCX0KKwl9CisKKwkvKgorCSAqIHJlbGVhc2UgYWxsIFR4RCdzIGZvciBib3RoIHNlbmQgcXVldWVzCisJICovCisJbWFjX2Rydl9jbGVhcl90eGQoc21jKSA7CisKKwlmb3IgKGkgPSBRVUVVRV9TOyBpIDw9IFFVRVVFX0EwOyBpKyspIHsKKwkJcXVldWUgPSBzbWMtPmh3LmZwLnR4W2ldIDsKKwkJdCA9IHF1ZXVlLT50eF9jdXJyX2dldCA7CisKKwkJLyoKKwkJICogd3JpdGUgdGhlIHBoeXMgcG9pbnRlciBvZiB0aGUgTkVYVCBkZXNjcmlwdG9yIGludG8gdGhlCisJCSAqIEJNVSdzIGN1cnJlbnQgYWRkcmVzcyBkZXNjcmlwdG9yIHBvaW50ZXIgYW5kIHNldAorCQkgKiB0eF9jdXJyX2dldCBhbmQgdHhfY3Vycl9wdXQgdG8gdGhpcyBwb3NpdGlvbgorCQkgKi8KKwkJaWYgKGkgPT0gUVVFVUVfUykgeworCQkJb3V0cGQoQUREUihCNV9YU19EQSksQUlYX1JFVkVSU0UodC0+dHhkX250ZGFkcikpIDsKKwkJfQorCQllbHNlIHsKKwkJCW91dHBkKEFERFIoQjVfWEFfREEpLEFJWF9SRVZFUlNFKHQtPnR4ZF9udGRhZHIpKSA7CisJCX0KKworCQlxdWV1ZS0+dHhfY3Vycl9wdXQgPSBxdWV1ZS0+dHhfY3Vycl9nZXQtPnR4ZF9uZXh0IDsKKwkJcXVldWUtPnR4X2N1cnJfZ2V0ID0gcXVldWUtPnR4X2N1cnJfcHV0IDsKKwl9Cit9CisKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVEVTVCBGVU5DVElPTlM6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmZGVmCURFQlVHCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKG1hY19kcnZfZGVidWdfbGV2KQorICoJdm9pZCBtYWNfZHJ2X2RlYnVnX2xldihzbWMsZmxhZyxsZXYpCisgKgorICogZnVuY3Rpb24JRE9XTkNBTEwJKGRydnNyLmMpCisgKgkJVG8gZ2V0IGEgc3BlY2lhbCBkZWJ1ZyBpbmZvIHRoZSB1c2VyIGNhbiBhc3NpZ24gYSBkZWJ1ZyBsZXZlbAorICoJCXRvIGFueSBkZWJ1ZyBmbGFnLgorICoKKyAqIHBhcmEJZmxhZwlkZWJ1ZyBmbGFnLCBwb3NzaWJsZSB2YWx1ZXMgYXJlOgorICoJCQk9IDA6CXJlc2V0IGFsbCBkZWJ1ZyBmbGFncyAodGhlIGRlZmluZWQgbGV2ZWwgaXMKKyAqCQkJCWlnbm9yZWQpCisgKgkJCT0gMToJZGVidWcuZF9zbXRmCisgKgkJCT0gMjoJZGVidWcuZF9zbXQKKyAqCQkJPSAzOglkZWJ1Zy5kX2VjbQorICoJCQk9IDQ6CWRlYnVnLmRfcm10CisgKgkJCT0gNToJZGVidWcuZF9jZm0KKyAqCQkJPSA2OglkZWJ1Zy5kX3BjbQorICoKKyAqCQkJPSAxMDoJZGVidWcuZF9vcy5od21fcnggKGhhcmR3YXJlIG1vZHVsZSByZWNlaXZlIHBhdGgpCisgKgkJCT0gMTE6CWRlYnVnLmRfb3MuaHdtX3R4KGhhcmR3YXJlIG1vZHVsZSB0cmFuc21pdCBwYXRoKQorICoJCQk9IDEyOglkZWJ1Zy5kX29zLmh3bV9nZW4oaGFyZHdhcmUgbW9kdWxlIGdlbmVyYWwgZmxhZykKKyAqCisgKglsZXYJZGVidWcgbGV2ZWwKKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KK3ZvaWQgbWFjX2Rydl9kZWJ1Z19sZXYoc3RydWN0IHNfc21jICpzbWMsIGludCBmbGFnLCBpbnQgbGV2KQoreworCXN3aXRjaChmbGFnKSB7CisJY2FzZSAoaW50KU5VTEw6CisJCURCX1AuZF9zbXRmID0gREJfUC5kX3NtdCA9IERCX1AuZF9lY20gPSBEQl9QLmRfcm10ID0gMCA7CisJCURCX1AuZF9jZm0gPSAwIDsKKwkJREJfUC5kX29zLmh3bV9yeCA9IERCX1AuZF9vcy5od21fdHggPSBEQl9QLmRfb3MuaHdtX2dlbiA9IDAgOworI2lmZGVmCVNCQQorCQlEQl9QLmRfc2JhID0gMCA7CisjZW5kaWYKKyNpZmRlZglFU1MKKwkJREJfUC5kX2VzcyA9IDAgOworI2VuZGlmCisJCWJyZWFrIDsKKwljYXNlIERFQlVHX1NNVEY6CisJCURCX1AuZF9zbXRmID0gbGV2IDsKKwkJYnJlYWsgOworCWNhc2UgREVCVUdfU01UOgorCQlEQl9QLmRfc210ID0gbGV2IDsKKwkJYnJlYWsgOworCWNhc2UgREVCVUdfRUNNOgorCQlEQl9QLmRfZWNtID0gbGV2IDsKKwkJYnJlYWsgOworCWNhc2UgREVCVUdfUk1UOgorCQlEQl9QLmRfcm10ID0gbGV2IDsKKwkJYnJlYWsgOworCWNhc2UgREVCVUdfQ0ZNOgorCQlEQl9QLmRfY2ZtID0gbGV2IDsKKwkJYnJlYWsgOworCWNhc2UgREVCVUdfUENNOgorCQlEQl9QLmRfcGNtID0gbGV2IDsKKwkJYnJlYWsgOworCWNhc2UgREVCVUdfU0JBOgorI2lmZGVmCVNCQQorCQlEQl9QLmRfc2JhID0gbGV2IDsKKyNlbmRpZgorCQlicmVhayA7CisJY2FzZSBERUJVR19FU1M6CisjaWZkZWYJRVNTCisJCURCX1AuZF9lc3MgPSBsZXYgOworI2VuZGlmCisJCWJyZWFrIDsKKwljYXNlIERCX0hXTV9SWDoKKwkJREJfUC5kX29zLmh3bV9yeCA9IGxldiA7CisJCWJyZWFrIDsKKwljYXNlIERCX0hXTV9UWDoKKwkJREJfUC5kX29zLmh3bV90eCA9IGxldiA7CisJCWJyZWFrIDsKKwljYXNlIERCX0hXTV9HRU46CisJCURCX1AuZF9vcy5od21fZ2VuID0gbGV2IDsKKwkJYnJlYWsgOworCWRlZmF1bHQ6CisJCWJyZWFrIDsKKwl9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaHd0LmMgYi9kcml2ZXJzL25ldC9za2ZwL2h3dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMWY4YTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2h3dC5jCkBAIC0wLDAgKzEsMzA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGltZXIgRHJpdmVyIGZvciBGQkkgYm9hcmQgKHRpbWVyIGNoaXAgODJDNTQpCisgKi8KKworLyoKKyAqIE1vZGlmaWNhdGlvbnM6CisgKgorICoJMjgtSnVuLTE5OTQgc3cJRWRpdCB2MS42LgorICoJCQlNQ0E6IEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBTSy1ORVQgRkRESS1GTTIgYWRhcHRlci4gVGhlCisgKgkJCSBmb2xsb3dpbmcgZnVuY3Rpb25zIGhhdmUgYmVlbiBhZGRlZCgrKSBvciBtb2RpZmllZCgqKToKKyAqCQkJIGh3dF9zdGFydCgqKSwgaHd0X3N0b3AoKiksIGh3dF9yZXN0YXJ0KCopLCBod3RfcmVhZCgqKQorICovCisKKyNpbmNsdWRlICJoL3R5cGVzLmgiCisjaW5jbHVkZSAiaC9mZGRpLmgiCisjaW5jbHVkZSAiaC9zbWMuaCIKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKWh3dC5jCTEuMTMgOTcvMDQvMjMgKEMpIFNLICIgOworI2VuZGlmCisKKy8qCisgKiBQcm90b3R5cGVzIG9mIGxvY2FsIGZ1bmN0aW9ucy4KKyAqLworLyogMjgtSnVuLTE5OTQgc3cgLSBOb3RlOiBod3RfcmVzdGFydCgpIGlzIGFsc28gdXNlZCBpbiBtb2R1bGUgJ2RydmZiaS5jJy4gKi8KKy8qc3RhdGljIHZvaWQgaHd0X3Jlc3RhcnQoKSA7ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglod3Rfc3RhcnQKKyAqCisgKglTdGFydCBoYXJkd2FyZSB0aW1lciAoY2xvY2sgdGlja3MgYXJlIDE2dXMpLgorICoKKyAqCXZvaWQgaHd0X3N0YXJ0KAorICoJCXN0cnVjdCBzX3NtYyAqc21jLAorICoJCXVfbG9uZyB0aW1lKSA7CisgKiBJbgorICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgQ29udGV4dCBzdHJ1Y3R1cmUuCisgKgorICoJdGltZSAtIFRoZSB0aW1lIGluIHVuaXRzIG9mIDE2dXMgdG8gbG9hZCB0aGUgdGltZXIgd2l0aC4KKyAqIE91dAorICoJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlIV1RfTUFYCSg2NTAwMCkKKwordm9pZCBod3Rfc3RhcnQoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyB0aW1lKQoreworCXVfc2hvcnQJY250IDsKKworCWlmICh0aW1lID4gSFdUX01BWCkKKwkJdGltZSA9IEhXVF9NQVggOworCisJc21jLT5ody50X3N0YXJ0ID0gdGltZSA7CisJc21jLT5ody50X3N0b3AgPSAwTCA7CisKKwljbnQgPSAodV9zaG9ydCl0aW1lIDsKKwkvKgorCSAqIGlmIHRpbWUgPCAxNiB1cworCSAqCXRpbWUgPSAxNiB1cworCSAqLworCWlmICghY250KQorCQljbnQrKyA7CisjaWZuZGVmCVBDSQorCS8qCisJICogNi4yNU1IeiAtPiBDTEswIDogVDAgKGNudDAgPSAxNnVzKQktPiBPVVQwCisJICogICAgT1VUMCAtPiBDTEsxIDogVDEgKGNudDEpCU9VVDEJLT4gSVNSQShJU19USU1JTlQpCisJICovCisJT1VUXzgyYzU0X1RJTUVSKDMsMTw8NiB8IDM8PDQgfCAwPDwxKSA7CS8qIGNvdW50ZXIgMSwgbW9kZSAwICovCisJT1VUXzgyYzU0X1RJTUVSKDEsY250ICYgMHhmZikgOwkJLyogTFNCICovCisJT1VUXzgyYzU0X1RJTUVSKDEsKGNudD4+OCkgJiAweGZmKSA7CS8qIE1TQiAqLworCS8qCisJICogc3RhcnQgdGltZXIgYnkgc3dpdGNoaW5nIGNvdW50ZXIgMCB0byBtb2RlIDMKKwkgKglUMCByZXNvbHV0aW9uIDE2IHVzIChDTEswPTAuMTZ1cykKKwkgKi8KKwlPVVRfODJjNTRfVElNRVIoMywwPDw2IHwgMzw8NCB8IDM8PDEpIDsJLyogY291bnRlciAwLCBtb2RlIDMgKi8KKwlPVVRfODJjNTRfVElNRVIoMCwxMDApIDsJCS8qIExTQiAqLworCU9VVF84MmM1NF9USU1FUigwLDApIDsJCQkvKiBNU0IgKi8KKyNlbHNlCS8qIFBDSSAqLworCW91dHBkKEFERFIoQjJfVElfSU5JKSwgKHVfbG9uZykgY250ICogMjAwKSA7CS8qIExvYWQgdGltZXIgdmFsdWUuICovCisJb3V0cHcoQUREUihCMl9USV9DUlRMKSwgVElNX1NUQVJUKSA7CQkvKiBTdGFydCB0aW1lci4gKi8KKyNlbmRpZgkvKiBQQ0kgKi8KKwlzbWMtPmh3LnRpbWVyX2FjdGl2ID0gVFJVRSA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglod3Rfc3RvcAorICoKKyAqCVN0b3AgaGFyZHdhcmUgdGltZXIuCisgKgorICoJdm9pZCBod3Rfc3RvcCgKKyAqCQlzdHJ1Y3Qgc19zbWMgKnNtYykgOworICogSW4KKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIENvbnRleHQgc3RydWN0dXJlLgorICogT3V0CisgKglOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGh3dF9zdG9wKHN0cnVjdCBzX3NtYyAqc21jKQoreworI2lmbmRlZiBQQ0kKKwkvKiBzdG9wIGNvdW50ZXIgMCBieSBzd2l0Y2hpbmcgdG8gbW9kZSAwICovCisJT1VUXzgyYzU0X1RJTUVSKDMsMDw8NiB8IDM8PDQgfCAwPDwxKSA7CS8qIGNvdW50ZXIgMCwgbW9kZSAwICovCisJT1VUXzgyYzU0X1RJTUVSKDAsMCkgOwkJCS8qIExTQiAqLworCU9VVF84MmM1NF9USU1FUigwLDApIDsJCQkvKiBNU0IgKi8KKyNlbHNlCS8qIFBDSSAqLworCW91dHB3KEFERFIoQjJfVElfQ1JUTCksIFRJTV9TVE9QKSA7CisJb3V0cHcoQUREUihCMl9USV9DUlRMKSwgVElNX0NMX0lSUSkgOworI2VuZGlmCS8qIFBDSSAqLworCisJc21jLT5ody50aW1lcl9hY3RpdiA9IEZBTFNFIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCWh3dF9pbml0CisgKgorICoJSW5pdGlhbGl6ZSBoYXJkd2FyZSB0aW1lci4KKyAqCisgKgl2b2lkIGh3dF9pbml0KAorICoJCXN0cnVjdCBzX3NtYyAqc21jKSA7CisgKiBJbgorICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgQ29udGV4dCBzdHJ1Y3R1cmUuCisgKiBPdXQKKyAqCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaHd0X2luaXQoc3RydWN0IHNfc21jICpzbWMpCit7CisJc21jLT5ody50X3N0YXJ0ID0gMCA7CisJc21jLT5ody50X3N0b3AJPSAwIDsKKwlzbWMtPmh3LnRpbWVyX2FjdGl2ID0gRkFMU0UgOworCisJaHd0X3Jlc3RhcnQoc21jKSA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglod3RfcmVzdGFydAorICoKKyAqCUNsZWFyIHRpbWVyIGludGVycnVwdC4KKyAqCisgKgl2b2lkIGh3dF9yZXN0YXJ0KAorICoJCXN0cnVjdCBzX3NtYyAqc21jKSA7CisgKiBJbgorICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgQ29udGV4dCBzdHJ1Y3R1cmUuCisgKiBPdXQKKyAqCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaHd0X3Jlc3RhcnQoc3RydWN0IHNfc21jICpzbWMpCit7CisJaHd0X3N0b3Aoc21jKSA7CisjaWZuZGVmCVBDSQorCU9VVF84MmM1NF9USU1FUigzLDE8PDYgfCAzPDw0IHwgMDw8MSkgOwkvKiBjb3VudGVyIDEsIG1vZGUgMCAqLworCU9VVF84MmM1NF9USU1FUigxLDEgKSA7CQkJLyogTFNCICovCisJT1VUXzgyYzU0X1RJTUVSKDEsMCApIDsJCQkvKiBNU0IgKi8KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJaHd0X3JlYWQKKyAqCisgKglTdG9wIGhhcmR3YXJlIHRpbWVyIGFuZCByZWFkIHRpbWUgZWxhcHNlZCBzaW5jZSBsYXN0IHN0YXJ0LgorICoKKyAqCXVfbG9uZyBod3RfcmVhZChzbWMpIDsKKyAqIEluCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBDb250ZXh0IHN0cnVjdHVyZS4KKyAqIE91dAorICoJVGhlIGVsYXBzZWQgdGltZSBzaW5jZSBsYXN0IHN0YXJ0IGluIHVuaXRzIG9mIDE2dXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3VfbG9uZyBod3RfcmVhZChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwl1X3Nob3J0CXRyIDsKKyNpZm5kZWYJUENJCisJdV9zaG9ydAlpcyA7CisjZWxzZQorCXVfbG9uZwlpcyA7CisjZW5kaWYKKworCWlmIChzbWMtPmh3LnRpbWVyX2FjdGl2KSB7CisJCWh3dF9zdG9wKHNtYykgOworI2lmbmRlZglQQ0kKKwkJT1VUXzgyYzU0X1RJTUVSKDMsMTw8NikgOwkvKiBsYXRjaCBjb21tYW5kICovCisJCXRyID0gSU5fODJjNTRfVElNRVIoMSkgJiAweGZmIDsKKwkJdHIgKz0gKElOXzgyYzU0X1RJTUVSKDEpICYgMHhmZik8PDggOworI2Vsc2UJLyogUENJICovCisJCXRyID0gKHVfc2hvcnQpKChpbnBkKEFERFIoQjJfVElfVkFMKSkvMjAwKSAmIDB4ZmZmZikgOworI2VuZGlmCS8qIFBDSSAqLworCQlpcyA9IEdFVF9JU1IoKSA7CisJCS8qIENoZWNrIGlmIHRpbWVyIGV4cGlyZWQgKG9yIHdyYXBhcm91bmQpLiAqLworCQlpZiAoKHRyID4gc21jLT5ody50X3N0YXJ0KSB8fCAoaXMgJiBJU19USU1JTlQpKSB7CisJCQlod3RfcmVzdGFydChzbWMpIDsKKwkJCXNtYy0+aHcudF9zdG9wID0gc21jLT5ody50X3N0YXJ0IDsKKwkJfQorCQllbHNlCisJCQlzbWMtPmh3LnRfc3RvcCA9IHNtYy0+aHcudF9zdGFydCAtIHRyIDsKKwl9CisJcmV0dXJuIChzbWMtPmh3LnRfc3RvcCkgOworfQorCisjaWZkZWYJUENJCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJaHd0X3F1aWNrX3JlYWQKKyAqCisgKglTdG9wIGhhcmR3YXJlIHRpbWVyIGFuZCByZWFkIHRpbWVyIHZhbHVlIGFuZCBzdGFydCB0aGUgdGltZXIgYWdhaW4uCisgKgorICoJdV9sb25nIGh3dF9yZWFkKHNtYykgOworICogSW4KKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIENvbnRleHQgc3RydWN0dXJlLgorICogT3V0CisgKgljdXJyZW50IHRpbWVyIHZhbHVlIGluIHVuaXRzIG9mIDgwbnMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3VfbG9uZyBod3RfcXVpY2tfcmVhZChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwl1X2xvbmcgaW50ZXJ2YWwgOworCXVfbG9uZyB0aW1lIDsKKworCWludGVydmFsID0gaW5wZChBRERSKEIyX1RJX0lOSSkpIDsKKwlvdXRwdyhBRERSKEIyX1RJX0NSVEwpLCBUSU1fU1RPUCkgOworCXRpbWUgPSBpbnBkKEFERFIoQjJfVElfVkFMKSkgOworCW91dHBkKEFERFIoQjJfVElfSU5JKSx0aW1lKSA7CisJb3V0cHcoQUREUihCMl9USV9DUlRMKSwgVElNX1NUQVJUKSA7CisJb3V0cGQoQUREUihCMl9USV9JTkkpLGludGVydmFsKSA7CisKKwlyZXR1cm4odGltZSkgOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJaHd0X3dhaXRfdGltZShzbWMsc3RhcnQsZHVyYXRpb24pCisgKgorICoJVGhpcyBmdW5jdGlvbiByZXR1cm5lcyBhZnRlciB0aGUgYW1vdW50IG9mIHRpbWUgaXMgZWxhcHNlZAorICoJc2luY2UgdGhlIHN0YXJ0IHRpbWUuCisgKiAKKyAqIHBhcmEJc3RhcnQJCXN0YXJ0IHRpbWUKKyAqCWR1cmF0aW9uCXRpbWUgdG8gd2FpdAorICoKKyAqIE5PVEU6IFRoZSBmdWN0aW9uIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LCBpZiB0aGUgdGltZXIgaXMgbm90IAorICoJIHN0YXJ0ZWQKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGh3dF93YWl0X3RpbWUoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyBzdGFydCwgbG9uZyBpbnQgZHVyYXRpb24pCit7CisJbG9uZwlkaWZmIDsKKwlsb25nCWludGVydmFsIDsKKwlpbnQJd3JhcHBlZCA7CisKKwkvKgorCSAqIGNoZWNrIGlmIHRpbWVyIGlzIHJ1bm5pbmcKKwkgKi8KKwlpZiAoc21jLT5ody50aW1lcl9hY3RpdiA9PSBGQUxTRSB8fAorCQlod3RfcXVpY2tfcmVhZChzbWMpID09IGh3dF9xdWlja19yZWFkKHNtYykpIHsKKwkJcmV0dXJuIDsKKwl9CisKKwlpbnRlcnZhbCA9IGlucGQoQUREUihCMl9USV9JTkkpKSA7CisJaWYgKGludGVydmFsID4gZHVyYXRpb24pIHsKKwkJZG8geworCQkJZGlmZiA9IChsb25nKShzdGFydCAtIGh3dF9xdWlja19yZWFkKHNtYykpIDsKKwkJCWlmIChkaWZmIDwgMCkgeworCQkJCWRpZmYgKz0gaW50ZXJ2YWwgOworCQkJfQorCQl9IHdoaWxlIChkaWZmIDw9IGR1cmF0aW9uKSA7CisJfQorCWVsc2UgeworCQlkaWZmID0gaW50ZXJ2YWwgOworCQl3cmFwcGVkID0gMCA7CisJCWRvIHsKKwkJCWlmICghd3JhcHBlZCkgeworCQkJCWlmIChod3RfcXVpY2tfcmVhZChzbWMpID49IHN0YXJ0KSB7CisJCQkJCWRpZmYgKz0gaW50ZXJ2YWwgOworCQkJCQl3cmFwcGVkID0gMSA7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJaWYgKGh3dF9xdWlja19yZWFkKHNtYykgPCBzdGFydCkgeworCQkJCQl3cmFwcGVkID0gMCA7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChkaWZmIDw9IGR1cmF0aW9uKSA7CisJfQorfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvbG5rc3RhdC5jIGIvZHJpdmVycy9uZXQvc2tmcC9sbmtzdGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBhMjQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvbG5rc3RhdC5jCkBAIC0wLDAgKzEsMjA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCUlCTSBGRERJIHJlYWQgZXJyb3IgbG9nIGZ1bmN0aW9uCisqLworCisjaW5jbHVkZSAiaC90eXBlcy5oIgorI2luY2x1ZGUgImgvZmRkaS5oIgorI2luY2x1ZGUgImgvc21jLmgiCisjaW5jbHVkZSAiaC9sbmtzdGF0LmgiCisKKyNpZm5kZWYJbGludAorc3RhdGljIGNvbnN0IGNoYXIgSURfc2Njc1tdID0gIkAoIylsbmtzdGF0LmMJMS44IDk3LzA0LzExIChDKSBTSyAiIDsKKyNlbmRpZgorCisjaWZkZWYJc3VuCisjZGVmaW5lIF9mYXIKKyNlbmRpZgorCisjZGVmaW5lIEVMX0lTX09LKHgsbCkJKCgoKGludCkmKCgoc3RydWN0IHNfZXJyb3JfbG9nICopMCktPngpKSArIFwKKwkJCXNpemVvZihlci0+eCkpIDw9IGwpCisKKy8qCisJQkVHSU5fTUFOVUFMX0VOVFJZKGlmLGZ1bmM7b3RoZXJzOzExKQorCisJdV9sb25nIHNtdF9nZXRfZXJyb3Jfd29yZChzbWMpCisJc3RydWN0IHNfc21jICpzbWMgOworCitGdW5jdGlvbglET1dOQ0FMTAkoU01ULCBsbmtzdGF0LmMpCisJCVRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIFNNVCBlcnJvciB3b3JrIGZvciBBSVggZXZlbnRzLgorCitSZXR1cm4Jc210X2Vycm9yX3dvcmQJVGhlc2UgYml0cyBhcmUgc3VwcG9ydGVkOgorCisJCVNNVF9FUkxfQUxDCT09IAlbUFMvUEFdLmZkZGlQT1JUTGVyRmxhZworCQlTTVRfRVJMX0JMQwk9PQlbUEJdLmZkZGlQT1JUTGVyRmxhZworCQlTTVRfRVJMX05DQwk9PQlmZGRpTUFDTm90Q29waWVkRmxhZworCQlTTVRfRVJMX0ZFQwk9PQlmZGRpTUFDRnJhbWVFcnJvckZsYWcKKworCUVORF9NQU5VQUxfRU5UUlkoKQorICovCit1X2xvbmcgc210X2dldF9lcnJvcl93b3JkKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXVfbG9uZwlzdDsKKworCS8qCisJICogc210IGVycm9yIHdvcmQgbG93CisJICovCisJc3QgPSAwIDsKKwlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKSB7CisJCWlmIChzbWMtPm1pYi5wW1BTXS5mZGRpUE9SVExlckZsYWcpCisJCQlzdCB8PSBTTVRfRVJMX0FMQyA7CisJfQorCWVsc2UgeworCQlpZiAoc21jLT5taWIucFtQQV0uZmRkaVBPUlRMZXJGbGFnKQorCQkJc3QgfD0gU01UX0VSTF9BTEMgOworCQlpZiAoc21jLT5taWIucFtQQl0uZmRkaVBPUlRMZXJGbGFnKQorCQkJc3QgfD0gU01UX0VSTF9CTEMgOworCX0KKwlpZiAoc21jLT5taWIubVtNQUMwXS5mZGRpTUFDTm90Q29waWVkRmxhZykKKwkJc3QgfD0gU01UX0VSTF9OQ0MgOwkJLyogbm90IGNvcGllZCBjb25kaXRpb24gKi8KKwlpZiAoc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRnJhbWVFcnJvckZsYWcpCisJCXN0IHw9IFNNVF9FUkxfRkVDIDsJCS8qIGZyYW1lIGVycm9yIGNvbmRpdGlvbiAqLworCisJcmV0dXJuIHN0OworfQorCisvKgorCUJFR0lOX01BTlVBTF9FTlRSWShpZixmdW5jO290aGVyczsxMSkKKworCXVfbG9uZyBzbXRfZ2V0X2V2ZW50X3dvcmQoc21jKQorCXN0cnVjdCBzX3NtYyAqc21jIDsKKworRnVuY3Rpb24JRE9XTkNBTEwJKFNNVCwgbG5rc3RhdC5jKQorCQlUaGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZSBTTVQgZXZlbnQgd29yayBmb3IgQUlYIGV2ZW50cy4KKworUmV0dXJuCXNtdF9ldmVudF93b3JkCWFsd2F5cyAwCisKKwlFTkRfTUFOVUFMX0VOVFJZKCkKKyAqLwordV9sb25nIHNtdF9nZXRfZXZlbnRfd29yZChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlyZXR1cm4gKHVfbG9uZykgMDsKK30KKworLyoKKwlCRUdJTl9NQU5VQUxfRU5UUlkoaWYsZnVuYztvdGhlcnM7MTEpCisKKwl1X2xvbmcgc210X2dldF9wb3J0X2V2ZW50X3dvcmQoc21jKQorCXN0cnVjdCBzX3NtYyAqc21jIDsKKworRnVuY3Rpb24JRE9XTkNBTEwJKFNNVCwgbG5rc3RhdC5jKQorCQlUaGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZSBTTVQgcG9ydCBldmVudCB3b3JrIGZvciBBSVggZXZlbnRzLgorCitSZXR1cm4Jc210X3BvcnRfZXZlbnRfd29yZAlhbHdheXMgMAorCisJRU5EX01BTlVBTF9FTlRSWSgpCisgKi8KK3VfbG9uZyBzbXRfZ2V0X3BvcnRfZXZlbnRfd29yZChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlyZXR1cm4gKHVfbG9uZykgMDsKK30KKworLyoKKwlCRUdJTl9NQU5VQUxfRU5UUlkoaWYsZnVuYztvdGhlcnM7MTEpCisKKwl1X2xvbmcgc210X3JlYWRfZXJyb3Jsb2coc21jLHAsbGVuKQorCXN0cnVjdCBzX3NtYyAqc21jIDsKKwljaGFyIF9mYXIgKnAgOworCWludCBsZW4gOworCitGdW5jdGlvbglET1dOQ0FMTAkoU01ULCBsbmtzdGF0LmMpCisJCVRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIFNNVCBlcnJvciBsb2cgZmllbGQgZm9yIEFJWCBldmVudHMuCisKK1BhcmEJcAlwb2ludGVyIHRvIHRoZSBlcnJvciBsb2cgZmllbGQKKwlsZW4JbGVuIG9mIHRoZSBlcnJvciBsb2cgZmllbGQKKworUmV0dXJuCWxlbgl1c2VkIGxlbiBvZiB0aGUgZXJyb3IgbG9nIGZpZWxkCisKKwlFTkRfTUFOVUFMX0VOVFJZKCkKKyAqLworaW50IHNtdF9yZWFkX2Vycm9ybG9nKHN0cnVjdCBzX3NtYyAqc21jLCBjaGFyIF9mYXIgKnAsIGludCBsZW4pCit7CisJaW50CQkJaSA7CisJaW50CQkJc3QgOworCXN0cnVjdCBzX2Vycm9yX2xvZyBfZmFyCSplciA7CisKKwllciA9IChzdHJ1Y3Qgc19lcnJvcl9sb2cgX2ZhciAqKSBwIDsKKwlpZiAobGVuID4gc2l6ZW9mKHN0cnVjdCBzX2Vycm9yX2xvZykpCisJCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc19lcnJvcl9sb2cpIDsKKwlmb3IgKGkgPSAwIDsgaSA8IGxlbiA7IGkrKykKKwkJKnArKyA9IDAgOworCS8qCisJICogc2V0IGNvdW50CisJICovCisJaWYgKEVMX0lTX09LKHNldF9jb3VudF9oaWdoLGxlbikpIHsKKwkJZXItPnNldF9jb3VudF9sb3cgPSAodV9zaG9ydClzbWMtPm1pYi5mZGRpU01UU2V0Q291bnQuY291bnQgOworCQllci0+c2V0X2NvdW50X2hpZ2ggPQorCQkJKHVfc2hvcnQpKHNtYy0+bWliLmZkZGlTTVRTZXRDb3VudC5jb3VudCA+PiAxNkwpIDsKKwl9CisJLyoKKwkgKiBhY2kKKwkgKi8KKwlpZiAoRUxfSVNfT0soYWNpX2lkX2NvZGUsbGVuKSkgeworCQllci0+YWNpX2lkX2NvZGUgPSAwIDsKKwl9CisJLyoKKwkgKiBwdXJnZSBjb3VudGVyIGlzIG1pc3NlZCBmcmFtZXM7IDE2IGJpdHMgb25seQorCSAqLworCWlmIChFTF9JU19PSyhwdXJnZV9mcmFtZV9jb3VudGVyLGxlbikpIHsKKwkJaWYgKHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0NvcGllZF9DdCA+IDB4ZmZmZikKKwkJCWVyLT5wdXJnZV9mcmFtZV9jb3VudGVyID0gMHhmZmZmIDsKKwkJZWxzZQorCQkJZXItPnB1cmdlX2ZyYW1lX2NvdW50ZXIgPQorCQkJCSh1X3Nob3J0KXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0NvcGllZF9DdCA7CisJfQorCS8qCisJICogQ01UIGFuZCBSTVQgc3RhdGUgbWFjaGluZXMKKwkgKi8KKwlpZiAoRUxfSVNfT0soZWNtX3N0YXRlLGxlbikpCisJCWVyLT5lY21fc3RhdGUgPSBzbWMtPm1pYi5mZGRpU01URUNNU3RhdGUgOworCisJaWYgKEVMX0lTX09LKHBjbV9iX3N0YXRlLGxlbikpIHsKKwkJaWYgKHNtYy0+cy5zYXMgPT0gU01UX1NBUykgeworCQkJZXItPnBjbV9hX3N0YXRlID0gc21jLT55W1BTXS5taWItPmZkZGlQT1JUUENNU3RhdGUgOworCQkJZXItPnBjbV9iX3N0YXRlID0gMCA7CisJCX0KKwkJZWxzZSB7CisJCQllci0+cGNtX2Ffc3RhdGUgPSBzbWMtPnlbUEFdLm1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSA7CisJCQllci0+cGNtX2Jfc3RhdGUgPSBzbWMtPnlbUEJdLm1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSA7CisJCX0KKwl9CisJaWYgKEVMX0lTX09LKGNmbV9zdGF0ZSxsZW4pKQorCQllci0+Y2ZtX3N0YXRlID0gc21jLT5taWIuZmRkaVNNVENGX1N0YXRlIDsKKwlpZiAoRUxfSVNfT0socm10X3N0YXRlLGxlbikpCisJCWVyLT5ybXRfc3RhdGUgPSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNSTVRTdGF0ZSA7CisKKwkvKgorCSAqIHNtdCBlcnJvciB3b3JkIGxvdyAod2Ugb25seSBuZWVkIHRoZSBsb3cgb3JkZXIgMTYgYml0cy4pCisJICovCisKKwlzdCA9IHNtdF9nZXRfZXJyb3Jfd29yZChzbWMpICYgMHhmZmZmIDsKKworCWlmIChFTF9JU19PSyhzbXRfZXJyb3JfbG93LGxlbikpCisJCWVyLT5zbXRfZXJyb3JfbG93ID0gc3QgOworCisJaWYgKEVMX0lTX09LKHVjb2RlX3ZlcnNpb25fbGV2ZWwsbGVuKSkKKwkJZXItPnVjb2RlX3ZlcnNpb25fbGV2ZWwgPSAweDAxMDEgOworCXJldHVybihsZW4pIDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9wY21wbGMuYyBiL2RyaXZlcnMvbmV0L3NrZnAvcGNtcGxjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxZjA1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvcGNtcGxjLmMKQEAgLTAsMCArMSwyMDI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCVBDTQorCVBoeXNpY2FsIENvbm5lY3Rpb24gTWFuYWdlbWVudAorKi8KKworLyoKKyAqIEhhcmR3YXJlIGluZGVwZW5kZW50IHN0YXRlIG1hY2hpbmUgaW1wbGVtYW50YXRpb24KKyAqIFRoZSBmb2xsb3dpbmcgZXh0ZXJuYWwgU01UIGZ1bmN0aW9ucyBhcmUgcmVmZXJlbmNlZCA6CisgKgorICogCQlxdWV1ZV9ldmVudCgpCisgKiAJCXNtdF90aW1lcl9zdGFydCgpCisgKiAJCXNtdF90aW1lcl9zdG9wKCkKKyAqCisgKiAJVGhlIGZvbGxvd2luZyBleHRlcm5hbCBIVyBkZXBlbmRlbnQgZnVuY3Rpb25zIGFyZSByZWZlcmVuY2VkIDoKKyAqIAkJc21fcG1fY29udHJvbCgpCisgKgkJc21fcGhfbGluZXN0YXRlKCkKKyAqCQlzbV9wbV9sc19sYXRjaCgpCisgKgorICogCVRoZSBmb2xsb3dpbmcgSFcgZGVwZW5kZW50IGV2ZW50cyBhcmUgcmVxdWlyZWQgOgorICoJCVBDX1FMUworICoJCVBDX0lMUworICoJCVBDX0hMUworICoJCVBDX01MUworICoJCVBDX05TRQorICoJCVBDX0xFTQorICoKKyAqLworCisKKyNpbmNsdWRlICJoL3R5cGVzLmgiCisjaW5jbHVkZSAiaC9mZGRpLmgiCisjaW5jbHVkZSAiaC9zbWMuaCIKKyNpbmNsdWRlICJoL3N1cGVybl8yLmgiCisjZGVmaW5lIEtFUk5FTAorI2luY2x1ZGUgImgvc210c3RhdGUuaCIKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKXBjbXBsYy5jCTIuNTUgOTkvMDgvMDUgKEMpIFNLICIgOworI2VuZGlmCisKKyNpZmRlZglGRERJX01JQgorZXh0ZXJuIGludCBzbm1wX2ZkZGlfdHJhcCgKKyNpZmRlZglBTlNJQworc3RydWN0IHNfc21jCSogc21jLCBpbnQgIHR5cGUsIGludCAgaW5kZXgKKyNlbmRpZgorKTsKKyNlbmRpZgorI2lmZGVmCUNPTkNFTlRSQVRPUgorZXh0ZXJuIGludCBwbGNfaXNfaW5zdGFsbGVkKAorI2lmZGVmCUFOU0lDCitzdHJ1Y3Qgc19zbWMgKnNtYyAsCitpbnQgcAorI2VuZGlmCispIDsKKyNlbmRpZgorLyoKKyAqIEZTTSBNYWNyb3MKKyAqLworI2RlZmluZSBBRkxBRwkJKDB4MjApCisjZGVmaW5lIEdPX1NUQVRFKHgpCShtaWItPmZkZGlQT1JUUENNU3RhdGUgPSAoeCl8QUZMQUcpCisjZGVmaW5lIEFDVElPTlNfRE9ORSgpCShtaWItPmZkZGlQT1JUUENNU3RhdGUgJj0gfkFGTEFHKQorI2RlZmluZSBBQ1RJT05TKHgpCSh4fEFGTEFHKQorCisvKgorICogUENNIHN0YXRlcworICovCisjZGVmaW5lIFBDMF9PRkYJCQkwCisjZGVmaW5lIFBDMV9CUkVBSwkJMQorI2RlZmluZSBQQzJfVFJBQ0UJCTIKKyNkZWZpbmUgUEMzX0NPTk5FQ1QJCTMKKyNkZWZpbmUgUEM0X05FWFQJCTQKKyNkZWZpbmUgUEM1X1NJR05BTAkJNQorI2RlZmluZSBQQzZfSk9JTgkJNgorI2RlZmluZSBQQzdfVkVSSUZZCQk3CisjZGVmaW5lIFBDOF9BQ1RJVkUJCTgKKyNkZWZpbmUgUEM5X01BSU5UCQk5CisKKyNpZmRlZglERUJVRworLyoKKyAqIHN5bWJvbGljIHN0YXRlIG5hbWVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNtX3N0YXRlc1tdID0gIHsKKwkiUEMwX09GRiIsIlBDMV9CUkVBSyIsIlBDMl9UUkFDRSIsIlBDM19DT05ORUNUIiwiUEM0X05FWFQiLAorCSJQQzVfU0lHTkFMIiwiUEM2X0pPSU4iLCJQQzdfVkVSSUZZIiwiUEM4X0FDVElWRSIsIlBDOV9NQUlOVCIKK30gOworCisvKgorICogc3ltYm9saWMgZXZlbnQgbmFtZXMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwY21fZXZlbnRzW10gPSB7CisJIk5PTkUiLCJQQ19TVEFSVCIsIlBDX1NUT1AiLCJQQ19MT09QIiwiUENfSk9JTiIsIlBDX1NJR05BTCIsCisJIlBDX1JFSkVDVCIsIlBDX01BSU5UIiwiUENfVFJBQ0UiLCJQQ19QRFIiLAorCSJQQ19FTkFCTEUiLCJQQ19ESVNBQkxFIiwKKwkiUENfUUxTIiwiUENfSUxTIiwiUENfTUxTIiwiUENfSExTIiwiUENfTFNfUERSIiwiUENfTFNfTk9ORSIsCisJIlBDX1RJTUVPVVRfVEJfTUFYIiwiUENfVElNRU9VVF9UQl9NSU4iLAorCSJQQ19USU1FT1VUX0NfTUlOIiwiUENfVElNRU9VVF9UX09VVCIsCisJIlBDX1RJTUVPVVRfVExfTUlOIiwiUENfVElNRU9VVF9UX05FWFQiLCJQQ19USU1FT1VUX0xDVCIsCisJIlBDX05TRSIsIlBDX0xFTSIKK30gOworI2VuZGlmCisKKyNpZmRlZglNT1RfRUxNCisvKgorICogUENMLVMgY29udHJvbCByZWdpc3RlcgorICogdGhpcyByZWdpc3RlciBpbiB0aGUgUExDLVMgY29udHJvbHMgdGhlIHNjcmFtYmxpbmcgcGFyYW1ldGVycworICovCisjZGVmaW5lIFBMQ1NfQ09OVFJPTF9DX1UJMAorI2RlZmluZSBQTENTX0NPTlRST0xfQ19TCShQTF9DX1NET0ZGX0VOQUJMRSB8IFBMX0NfU0RPTl9FTkFCTEUgfCBcCisJCQkJIFBMX0NfQ0lQSEVSX0VOQUJMRSkKKyNkZWZpbmUJUExDU19GQVNTRVJUX1UJCTAKKyNkZWZpbmUJUExDU19GQVNTRVJUX1MJCTB4RmQ3NgkvKiA1Mi4wIHVzICovCisjZGVmaW5lCVBMQ1NfRkRFQVNTRVJUX1UJMAorI2RlZmluZQlQTENTX0ZERUFTU0VSVF9TCTAKKyNlbHNlCS8qIG5NT1RfRUxNICovCisvKgorICogUENMLVMgY29udHJvbCByZWdpc3RlcgorICogdGhpcyByZWdpc3RlciBpbiB0aGUgUExDLVMgY29udHJvbHMgdGhlIHNjcmFtYmxpbmcgcGFyYW1ldGVycworICogY2FuIGJlIHBhdGNoZWQgZm9yIEFOU0kgY29tcGxpYW5jZSBpZiBzdGFuZGFyZCBjaGFuZ2VzCisgKi8KK3N0YXRpYyBjb25zdCB1X2NoYXIgcGxjc19jb250cm9sX2NfdVsxN10gPSAiUExDX0NOVFJMX0NfVT1cMFwwIiA7CitzdGF0aWMgY29uc3QgdV9jaGFyIHBsY3NfY29udHJvbF9jX3NbMTddID0gIlBMQ19DTlRSTF9DX1M9XDAxXDAyIiA7CisKKyNkZWZpbmUgUExDU19DT05UUk9MX0NfVSAocGxjc19jb250cm9sX2NfdVsxNF0gfCAocGxjc19jb250cm9sX2NfdVsxNV08PDgpKQorI2RlZmluZSBQTENTX0NPTlRST0xfQ19TIChwbGNzX2NvbnRyb2xfY19zWzE0XSB8IChwbGNzX2NvbnRyb2xfY19zWzE1XTw8OCkpCisjZW5kaWYJLyogbk1PVF9FTE0gKi8KKworLyoKKyAqIGV4dGVybmFsIHZhcnMKKyAqLworLyogc3RydWN0IGRlZmluaXRpb24gc2VlICdjbXRkZWYuaCcgKGFsc28gdXNlZCBieSBDRk0pICovCisKKyNkZWZpbmUgUFNfT0ZGCQkwCisjZGVmaW5lIFBTX0JJVDMJCTEKKyNkZWZpbmUgUFNfQklUNAkJMgorI2RlZmluZSBQU19CSVQ3CQkzCisjZGVmaW5lIFBTX0xDVAkJNAorI2RlZmluZSBQU19CSVQ4CQk1CisjZGVmaW5lIFBTX0pPSU4JCTYKKyNkZWZpbmUgUFNfQUNUSVZFCTcKKworI2RlZmluZSBMQ1RfTEVNX01BWAkyNTUKKworLyoKKyAqIFBMQyB0aW1pbmcgcGFyYW1ldGVyCisgKi8KKworI2RlZmluZSBQTENfTVMobSkJKChpbnQpKCgweDEwMDAwTC0obSoxMDAwMDBMLzIwNDgpKSkpCisjZGVmaW5lIFNMT1dfVExfTUlOCVBMQ19NUyg2KQorI2RlZmluZSBTTE9XX0NfTUlOCVBMQ19NUygxMCkKKworc3RhdGljCWNvbnN0IHN0cnVjdCBwbHQgeworCWludAl0aW1lciA7CQkJLyogcmVsYXRpdmUgcGxjIHRpbWVyIGFkZHJlc3MgKi8KKwlpbnQJcGFyYSA7CQkJLyogZGVmYXVsdCB0aW1pbmcgcGFyYW1ldGVycyAqLworfSBwbHRtW10gPSB7CisJeyBQTF9DX01JTiwgU0xPV19DX01JTiB9LAkvKiBtaW4gdC4gdG8gcmVtYWluIENvbm5lY3QgU3RhdGUgKi8KKwl7IFBMX1RMX01JTiwgU0xPV19UTF9NSU4gfSwJLyogbWluIHQuIHRvIHRyYW5zbWl0IGEgTGluZSBTdGF0ZSAqLworCXsgUExfVEJfTUlOLCBUUF9UQl9NSU4gfSwJLyogbWluIGJyZWFrIHRpbWUgKi8KKwl7IFBMX1RfT1VULCBUUF9UX09VVCB9LAkJLyogU2lnbmFsaW5nIHRpbWVvdXQgKi8KKwl7IFBMX0xDX0xFTkdUSCwgVFBfTENfTEVOR1RIIH0sCS8qIExpbmsgQ29uZmlkZW5jZSBUZXN0IFRpbWUgKi8KKwl7IFBMX1RfU0NSVUIsIFRQX1RfU0NSVUIgfSwJLyogU2NydWIgVGltZSA9PSBNQUMgVFZYIHRpbWUgISAqLworCXsgUExfTlNfTUFYLCBUUF9OU19NQVggfSwJLyogbWF4IHQuIHRoYXQgbm9pc2UgaXMgdG9sZXJhdGVkICovCisJeyAwLDAgfQorfSA7CisKKy8qCisgKiBpbnRlcnJ1cHQgbWFzaworICovCisjaWZkZWYJU1VQRVJORVRfMworLyoKKyAqIERvIHdlIG5lZWQgdGhlIEVCVUYgZXJyb3IgZHVyaW5nIHNpZ25hbGluZywgdG9vLCB0byBkZXRlY3QgU1VQRVJORVRfMworICogUExMIGJ1Zz8KKyAqLworc3RhdGljIGludCBwbGNfaW1za19uYSA9IFBMX1BDTV9DT0RFIHwgUExfVFJBQ0VfUFJPUCB8IFBMX1BDTV9CUkVBSyB8CisJCQlQTF9QQ01fRU5BQkxFRCB8IFBMX1NFTEZfVEVTVCB8IFBMX0VCVUZfRVJSOworI2Vsc2UJLyogU1VQRVJORVRfMyAqLworLyoKKyAqIFdlIGRvIE5PVCBuZWVkIHRoZSBlbGFzdGljaXR5IGJ1ZmZlciBlcnJvciBkdXJpbmcgc2lnbmFsaW5nLgorICovCitzdGF0aWMgaW50IHBsY19pbXNrX25hID0gUExfUENNX0NPREUgfCBQTF9UUkFDRV9QUk9QIHwgUExfUENNX0JSRUFLIHwKKwkJCVBMX1BDTV9FTkFCTEVEIHwgUExfU0VMRl9URVNUIDsKKyNlbmRpZgkvKiBTVVBFUk5FVF8zICovCitzdGF0aWMgaW50IHBsY19pbXNrX2FjdCA9IFBMX1BDTV9DT0RFIHwgUExfVFJBQ0VfUFJPUCB8IFBMX1BDTV9CUkVBSyB8CisJCQlQTF9QQ01fRU5BQkxFRCB8IFBMX1NFTEZfVEVTVCB8IFBMX0VCVUZfRVJSOworCisvKiBleHRlcm5hbCBmdW5jdGlvbnMgKi8KK3ZvaWQgYWxsX3NlbGVjdGlvbl9jcml0ZXJpYShzdHJ1Y3Qgc19zbWMgKnNtYyk7CisKKy8qIGludGVybmFsIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgcGNtX2ZzbShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNfcGh5ICpwaHksIGludCBjbWQpOworc3RhdGljIHZvaWQgcGNfcmNvZGVfYWN0aW9ucyhzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGJpdCwgc3RydWN0IHNfcGh5ICpwaHkpOworc3RhdGljIHZvaWQgcGNfdGNvZGVfYWN0aW9ucyhzdHJ1Y3Qgc19zbWMgKnNtYywgY29uc3QgaW50IGJpdCwgc3RydWN0IHNfcGh5ICpwaHkpOworc3RhdGljIHZvaWQgcmVzZXRfbGVtX3N0cnVjdChzdHJ1Y3Qgc19waHkgKnBoeSk7CitzdGF0aWMgdm9pZCBwbGNfaW5pdChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHApOworc3RhdGljIHZvaWQgc21fcGhfbGVtX3N0YXJ0KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbnAsIGludCB0aHJlc2hvbGQpOworc3RhdGljIHZvaWQgc21fcGhfbGVtX3N0b3Aoc3RydWN0IHNfc21jICpzbWMsIGludCBucCk7CitzdGF0aWMgdm9pZCBzbV9waF9saW5lc3RhdGUoc3RydWN0IHNfc21jICpzbWMsIGludCBwaHksIGludCBscyk7CitzdGF0aWMgdm9pZCByZWFsX2luaXRfcGxjKHN0cnVjdCBzX3NtYyAqc21jKTsKKworLyoKKyAqIFNNVCB0aW1lciBpbnRlcmZhY2UKKyAqICAgICAgc3RhcnQgUENNIHRpbWVyIDAKKyAqLworc3RhdGljIHZvaWQgc3RhcnRfcGNtX3RpbWVyMChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIHZhbHVlLCBpbnQgZXZlbnQsCisJCQkgICAgIHN0cnVjdCBzX3BoeSAqcGh5KQoreworCXBoeS0+dGltZXIwX2V4cCA9IEZBTFNFIDsgICAgICAgLyogY2xlYXIgdGltZXIgZXZlbnQgZmxhZyAqLworCXNtdF90aW1lcl9zdGFydChzbWMsJnBoeS0+cGNtX3RpbWVyMCx2YWx1ZSwKKwkJRVZfVE9LRU4oRVZFTlRfUENNK3BoeS0+bnAsZXZlbnQpKSA7Cit9CisvKgorICogU01UIHRpbWVyIGludGVyZmFjZQorICogICAgICBzdG9wIFBDTSB0aW1lciAwCisgKi8KK3N0YXRpYyB2b2lkIHN0b3BfcGNtX3RpbWVyMChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNfcGh5ICpwaHkpCit7CisJaWYgKHBoeS0+cGNtX3RpbWVyMC50bV9hY3RpdmUpCisJCXNtdF90aW1lcl9zdG9wKHNtYywmcGh5LT5wY21fdGltZXIwKSA7Cit9CisKKy8qCisJaW5pdCBQQ00gc3RhdGUgbWFjaGluZSAoY2FsbGVkIGJ5IGRyaXZlcikKKwljbGVhciBhbGwgUENNIHZhcnMgYW5kIGZsYWdzCisqLwordm9pZCBwY21faW5pdChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlpbnQJCWkgOworCWludAkJbnAgOworCXN0cnVjdCBzX3BoeQkqcGh5IDsKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqbWliIDsKKworCWZvciAobnAgPSAwLHBoeSA9IHNtYy0+eSA7IG5wIDwgTlVNUEhZUyA7IG5wKysscGh5KyspIHsKKwkJLyogSW5kaWNhdGVzIHRoZSB0eXBlIG9mIFBIWSBiZWluZyB1c2VkICovCisJCW1pYiA9IHBoeS0+bWliIDsKKwkJbWliLT5mZGRpUE9SVFBDTVN0YXRlID0gQUNUSU9OUyhQQzBfT0ZGKSA7CisJCXBoeS0+bnAgPSBucCA7CisJCXN3aXRjaCAoc21jLT5zLnNhcykgeworI2lmZGVmCUNPTkNFTlRSQVRPUgorCQljYXNlIFNNVF9TQVMgOgorCQkJbWliLT5mZGRpUE9SVE15X1R5cGUgPSAobnAgPT0gUFMpID8gVFMgOiBUTSA7CisJCQlicmVhayA7CisJCWNhc2UgU01UX0RBUyA6CisJCQltaWItPmZkZGlQT1JUTXlfVHlwZSA9IChucCA9PSBQQSkgPyBUQSA6CisJCQkJCShucCA9PSBQQikgPyBUQiA6IFRNIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBTTVRfTkFDIDoKKwkJCW1pYi0+ZmRkaVBPUlRNeV9UeXBlID0gVE0gOworCQkJYnJlYWs7CisjZWxzZQorCQljYXNlIFNNVF9TQVMgOgorCQkJbWliLT5mZGRpUE9SVE15X1R5cGUgPSAobnAgPT0gUFMpID8gVFMgOiBUTk9ORSA7CisJCQltaWItPmZkZGlQT1JUSGFyZHdhcmVQcmVzZW50ID0gKG5wID09IFBTKSA/IFRSVUUgOgorCQkJCQlGQUxTRSA7CisjaWZuZGVmCVNVUEVSTkVUXzMKKwkJCXNtYy0+eVtQQV0ubWliLT5mZGRpUE9SVFBDTVN0YXRlID0gUEMwX09GRiA7CisjZWxzZQorCQkJc21jLT55W1BCXS5taWItPmZkZGlQT1JUUENNU3RhdGUgPSBQQzBfT0ZGIDsKKyNlbmRpZgorCQkJYnJlYWsgOworCQljYXNlIFNNVF9EQVMgOgorCQkJbWliLT5mZGRpUE9SVE15X1R5cGUgPSAobnAgPT0gUEIpID8gVEIgOiBUQSA7CisJCQlicmVhayA7CisjZW5kaWYKKwkJfQorCQkvKgorCQkgKiBzZXQgUE1ELXR5cGUKKwkJICovCisJCXBoeS0+cG1kX3NjcmFtYmxlID0gMCA7CisJCXN3aXRjaCAocGh5LT5wbWRfdHlwZVtQTURfU0tfUE1EXSkgeworCQljYXNlICdQJyA6CisJCQltaWItPmZkZGlQT1JUUE1EQ2xhc3MgPSBNSUJfUE1EQ0xBU1NfTVVMVEkgOworCQkJYnJlYWsgOworCQljYXNlICdMJyA6CisJCQltaWItPmZkZGlQT1JUUE1EQ2xhc3MgPSBNSUJfUE1EQ0xBU1NfTENGIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnRCcgOgorCQkJbWliLT5mZGRpUE9SVFBNRENsYXNzID0gTUlCX1BNRENMQVNTX1RQIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnUycgOgorCQkJbWliLT5mZGRpUE9SVFBNRENsYXNzID0gTUlCX1BNRENMQVNTX1RQIDsKKwkJCXBoeS0+cG1kX3NjcmFtYmxlID0gVFJVRSA7CisJCQlicmVhayA7CisJCWNhc2UgJ1UnIDoKKwkJCW1pYi0+ZmRkaVBPUlRQTURDbGFzcyA9IE1JQl9QTURDTEFTU19UUCA7CisJCQlwaHktPnBtZF9zY3JhbWJsZSA9IFRSVUUgOworCQkJYnJlYWsgOworCQljYXNlICcxJyA6CisJCQltaWItPmZkZGlQT1JUUE1EQ2xhc3MgPSBNSUJfUE1EQ0xBU1NfU0lOR0xFMSA7CisJCQlicmVhayA7CisJCWNhc2UgJzInIDoKKwkJCW1pYi0+ZmRkaVBPUlRQTURDbGFzcyA9IE1JQl9QTURDTEFTU19TSU5HTEUyIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnMycgOgorCQkJbWliLT5mZGRpUE9SVFBNRENsYXNzID0gTUlCX1BNRENMQVNTX1NJTkdMRTIgOworCQkJYnJlYWsgOworCQljYXNlICc0JyA6CisJCQltaWItPmZkZGlQT1JUUE1EQ2xhc3MgPSBNSUJfUE1EQ0xBU1NfU0lOR0xFMSA7CisJCQlicmVhayA7CisJCWNhc2UgJ0gnIDoKKwkJCW1pYi0+ZmRkaVBPUlRQTURDbGFzcyA9IE1JQl9QTURDTEFTU19VTktOT1dOIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnSScgOgorCQkJbWliLT5mZGRpUE9SVFBNRENsYXNzID0gTUlCX1BNRENMQVNTX1RQIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnRycgOgorCQkJbWliLT5mZGRpUE9SVFBNRENsYXNzID0gTUlCX1BNRENMQVNTX1RQIDsKKwkJCWJyZWFrIDsKKwkJZGVmYXVsdDoKKwkJCW1pYi0+ZmRkaVBPUlRQTURDbGFzcyA9IE1JQl9QTURDTEFTU19VTktOT1dOIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKgorCQkgKiBBIGFuZCBCIHBvcnQgY2FuIGJlIG9uIHByaW1hcnkgYW5kIHNlY29uZGFyeSBwYXRoCisJCSAqLworCQlzd2l0Y2ggKG1pYi0+ZmRkaVBPUlRNeV9UeXBlKSB7CisJCWNhc2UgVEEgOgorCQkJbWliLT5mZGRpUE9SVEF2YWlsYWJsZVBhdGhzIHw9IE1JQl9QQVRIX1MgOworCQkJbWliLT5mZGRpUE9SVFJlcXVlc3RlZFBhdGhzWzFdID0gTUlCX1BfUEFUSF9MT0NBTCA7CisJCQltaWItPmZkZGlQT1JUUmVxdWVzdGVkUGF0aHNbMl0gPQorCQkJCU1JQl9QX1BBVEhfTE9DQUwgfAorCQkJCU1JQl9QX1BBVEhfQ09OX0FMVEVSIHwKKwkJCQlNSUJfUF9QQVRIX1NFQ19QUkVGRVIgOworCQkJbWliLT5mZGRpUE9SVFJlcXVlc3RlZFBhdGhzWzNdID0KKwkJCQlNSUJfUF9QQVRIX0xPQ0FMIHwKKwkJCQlNSUJfUF9QQVRIX0NPTl9BTFRFUiB8CisJCQkJTUlCX1BfUEFUSF9TRUNfUFJFRkVSIHwKKwkJCQlNSUJfUF9QQVRIX1RIUlUgOworCQkJYnJlYWsgOworCQljYXNlIFRCIDoKKwkJCW1pYi0+ZmRkaVBPUlRBdmFpbGFibGVQYXRocyB8PSBNSUJfUEFUSF9TIDsKKwkJCW1pYi0+ZmRkaVBPUlRSZXF1ZXN0ZWRQYXRoc1sxXSA9IE1JQl9QX1BBVEhfTE9DQUwgOworCQkJbWliLT5mZGRpUE9SVFJlcXVlc3RlZFBhdGhzWzJdID0KKwkJCQlNSUJfUF9QQVRIX0xPQ0FMIHwKKwkJCQlNSUJfUF9QQVRIX1BSSU1fUFJFRkVSIDsKKwkJCW1pYi0+ZmRkaVBPUlRSZXF1ZXN0ZWRQYXRoc1szXSA9CisJCQkJTUlCX1BfUEFUSF9MT0NBTCB8CisJCQkJTUlCX1BfUEFUSF9QUklNX1BSRUZFUiB8CisJCQkJTUlCX1BfUEFUSF9DT05fUFJFRkVSIHwKKwkJCQlNSUJfUF9QQVRIX1RIUlUgOworCQkJYnJlYWsgOworCQljYXNlIFRTIDoKKwkJCW1pYi0+ZmRkaVBPUlRBdmFpbGFibGVQYXRocyB8PSBNSUJfUEFUSF9TIDsKKwkJCW1pYi0+ZmRkaVBPUlRSZXF1ZXN0ZWRQYXRoc1sxXSA9IE1JQl9QX1BBVEhfTE9DQUwgOworCQkJbWliLT5mZGRpUE9SVFJlcXVlc3RlZFBhdGhzWzJdID0KKwkJCQlNSUJfUF9QQVRIX0xPQ0FMIHwKKwkJCQlNSUJfUF9QQVRIX0NPTl9BTFRFUiB8CisJCQkJTUlCX1BfUEFUSF9QUklNX1BSRUZFUiA7CisJCQltaWItPmZkZGlQT1JUUmVxdWVzdGVkUGF0aHNbM10gPQorCQkJCU1JQl9QX1BBVEhfTE9DQUwgfAorCQkJCU1JQl9QX1BBVEhfQ09OX0FMVEVSIHwKKwkJCQlNSUJfUF9QQVRIX1BSSU1fUFJFRkVSIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBUTSA6CisJCQltaWItPmZkZGlQT1JUUmVxdWVzdGVkUGF0aHNbMV0gPSBNSUJfUF9QQVRIX0xPQ0FMIDsKKwkJCW1pYi0+ZmRkaVBPUlRSZXF1ZXN0ZWRQYXRoc1syXSA9CisJCQkJTUlCX1BfUEFUSF9MT0NBTCB8CisJCQkJTUlCX1BfUEFUSF9TRUNfQUxURVIgfAorCQkJCU1JQl9QX1BBVEhfUFJJTV9BTFRFUiA7CisJCQltaWItPmZkZGlQT1JUUmVxdWVzdGVkUGF0aHNbM10gPSAwIDsKKwkJCWJyZWFrIDsKKwkJfQorCisJCXBoeS0+cGNfbGVtX2ZhaWwgPSBGQUxTRSA7CisJCW1pYi0+ZmRkaVBPUlRQQ01TdGF0ZVggPSBtaWItPmZkZGlQT1JUUENNU3RhdGUgOworCQltaWItPmZkZGlQT1JUTENURmFpbF9DdCA9IDAgOworCQltaWItPmZkZGlQT1JUQlNfRmxhZyA9IDAgOworCQltaWItPmZkZGlQT1JUQ3VycmVudFBhdGggPSBNSUJfUEFUSF9JU09MQVRFRCA7CisJCW1pYi0+ZmRkaVBPUlROZWlnaGJvclR5cGUgPSBUTk9ORSA7CisJCXBoeS0+bHNfZmxhZyA9IDAgOworCQlwaHktPnJjX2ZsYWcgPSAwIDsKKwkJcGh5LT50Y19mbGFnID0gMCA7CisJCXBoeS0+dGRfZmxhZyA9IDAgOworCQlpZiAobnAgPj0gUE0pCisJCQlwaHktPnBoeV9uYW1lID0gJzAnICsgbnAgLSBQTSA7CisJCWVsc2UKKwkJCXBoeS0+cGh5X25hbWUgPSAnQScgKyBucCA7CisJCXBoeS0+d2NfZmxhZyA9IEZBTFNFIDsJCS8qIHNldCBieSBTTVQgKi8KKwkJbWVtc2V0KChjaGFyICopJnBoeS0+bGVtLDAsc2l6ZW9mKHN0cnVjdCBsZW1fY291bnRlcikpIDsKKwkJcmVzZXRfbGVtX3N0cnVjdChwaHkpIDsKKwkJbWVtc2V0KChjaGFyICopJnBoeS0+cGxjLDAsc2l6ZW9mKHN0cnVjdCBzX3BsYykpIDsKKwkJcGh5LT5wbGMucF9zdGF0ZSA9IFBTX09GRiA7CisJCWZvciAoaSA9IDAgOyBpIDwgTlVNQklUUyA7IGkrKykgeworCQkJcGh5LT50X25leHRbaV0gPSAwIDsKKwkJfQorCX0KKwlyZWFsX2luaXRfcGxjKHNtYykgOworfQorCit2b2lkIGluaXRfcGxjKHN0cnVjdCBzX3NtYyAqc21jKQoreworCVNLX1VOVVNFRChzbWMpIDsKKworCS8qCisJICogZHVtbXkKKwkgKiB0aGlzIGlzIGFuIG9ic29sZXRlIHB1YmxpYyBlbnRyeSBwb2ludCB0aGF0IGhhcyB0byByZW1haW4KKwkgKiBmb3IgY29tcGF0LiBJdCBpcyB1c2VkIGJ5IHZhcmlvdXMgZHJpdmVycy4KKwkgKiB0aGUgd29yayBpcyBub3cgZG9uZSBpbiByZWFsX2luaXRfcGxjKCkKKwkgKiB3aGljaCBpcyBjYWxsZWQgZnJvbSBwY21faW5pdCgpIDsKKwkgKi8KK30KKworc3RhdGljIHZvaWQgcmVhbF9pbml0X3BsYyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlpbnQJcCA7CisKKwlmb3IgKHAgPSAwIDsgcCA8IE5VTVBIWVMgOyBwKyspCisJCXBsY19pbml0KHNtYyxwKSA7Cit9CisKK3N0YXRpYyB2b2lkIHBsY19pbml0KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcCkKK3sKKwlpbnQJaSA7CisjaWZuZGVmCU1PVF9FTE0KKwlpbnQJcmV2IDsJLyogUmV2aXNpb24gb2YgUExDLXggKi8KKyNlbmRpZgkvKiBNT1RfRUxNICovCisKKwkvKiB0cmFuc2l0IFBDTSBzdGF0ZSBtYWNoaW5lIHRvIE1BSU5UIHN0YXRlICovCisJb3V0cHcoUExDKHAsUExfQ05UUkxfQiksMCkgOworCW91dHB3KFBMQyhwLFBMX0NOVFJMX0IpLFBMX1BDTV9TVE9QKSA7CisJb3V0cHcoUExDKHAsUExfQ05UUkxfQSksMCkgOworCisJLyoKKwkgKiBpZiBQTEMtUyB0aGVuIHNldCBjb250cm9sIHJlZ2lzdGVyIEMKKwkgKi8KKyNpZm5kZWYJTU9UX0VMTQorCXJldiA9IGlucHcoUExDKHAsUExfU1RBVFVTX0EpKSAmIFBMQ19SRVZfTUFTSyA7CisJaWYgKHJldiAhPSBQTENfUkVWSVNJT05fQSkKKyNlbmRpZgkvKiBNT1RfRUxNICovCisJeworCQlpZiAoc21jLT55W3BdLnBtZF9zY3JhbWJsZSkgeworCQkJb3V0cHcoUExDKHAsUExfQ05UUkxfQyksUExDU19DT05UUk9MX0NfUykgOworI2lmZGVmCU1PVF9FTE0KKwkJCW91dHB3KFBMQyhwLFBMX1RfRk9UX0FTUyksUExDU19GQVNTRVJUX1MpIDsKKwkJCW91dHB3KFBMQyhwLFBMX1RfRk9UX0RFQVNTKSxQTENTX0ZERUFTU0VSVF9TKSA7CisjZW5kaWYJLyogTU9UX0VMTSAqLworCQl9CisJCWVsc2UgeworCQkJb3V0cHcoUExDKHAsUExfQ05UUkxfQyksUExDU19DT05UUk9MX0NfVSkgOworI2lmZGVmCU1PVF9FTE0KKwkJCW91dHB3KFBMQyhwLFBMX1RfRk9UX0FTUyksUExDU19GQVNTRVJUX1UpIDsKKwkJCW91dHB3KFBMQyhwLFBMX1RfRk9UX0RFQVNTKSxQTENTX0ZERUFTU0VSVF9VKSA7CisjZW5kaWYJLyogTU9UX0VMTSAqLworCQl9CisJfQorCisJLyoKKwkgKiBzZXQgdGltZXIgcmVnaXN0ZXIKKwkgKi8KKwlmb3IgKCBpID0gMCA7IHBsdG1baV0udGltZXI7IGkrKykJLyogc2V0IHRpbWVyIHBhcmFtZXRlciByZWcgKi8KKwkJb3V0cHcoUExDKHAscGx0bVtpXS50aW1lcikscGx0bVtpXS5wYXJhKSA7CisKKwkodm9pZClpbnB3KFBMQyhwLFBMX0lOVFJfRVZFTlQpKSA7CS8qIGNsZWFyIGludGVycnVwdCBldmVudCByZWcgKi8KKwlwbGNfY2xlYXJfaXJxKHNtYyxwKSA7CisJb3V0cHcoUExDKHAsUExfSU5UUl9NQVNLKSxwbGNfaW1za19uYSk7IC8qIGVuYWJsZSBub24gYWN0aXZlIGlycSdzICovCisKKwkvKgorCSAqIGlmIFBDTSBpcyBjb25maWd1cmVkIGZvciBjbGFzcyBzLCBpdCB3aWxsIE5PVCBnbyB0byB0aGUKKwkgKiBSRU1PVkUgc3RhdGUgaWYgb2ZmbGluZSAocGFnZSAzLTM2OykKKwkgKiBpbiB0aGUgY29uY2VudHJhdG9yLCBhbGwgaW5hY3RpdmUgUEhZUyBhbHdheXMgbXVzdCBiZSBpbgorCSAqIHRoZSByZW1vdmUgc3RhdGUKKwkgKiB0aGVyZSdzIG5vIHJlYWwgbmVlZCB0byB1c2UgdGhpcyBmZWF0dXJlIGF0IGFsbCAuLgorCSAqLworI2lmbmRlZglDT05DRU5UUkFUT1IKKwlpZiAoKHNtYy0+cy5zYXMgPT0gU01UX1NBUykgJiYgKHAgPT0gUFMpKSB7CisJCW91dHB3KFBMQyhwLFBMX0NOVFJMX0IpLFBMX0NMQVNTX1MpIDsKKwl9CisjZW5kaWYKK30KKworLyoKKyAqIGNvbnRyb2wgUENNIHN0YXRlIG1hY2hpbmUKKyAqLworc3RhdGljIHZvaWQgcGxjX2dvX3N0YXRlKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcCwgaW50IHN0YXRlKQoreworCUhXX1BUUiBwb3J0IDsKKwlpbnQgdmFsIDsKKworCVNLX1VOVVNFRChzbWMpIDsKKworCXBvcnQgPSAoSFdfUFRSKSAoUExDKHAsUExfQ05UUkxfQikpIDsKKwl2YWwgPSBpbnB3KHBvcnQpICYgfihQTF9QQ01fQ05UUkwgfCBQTF9NQUlOVCkgOworCW91dHB3KHBvcnQsdmFsKSA7CisJb3V0cHcocG9ydCx2YWwgfCBzdGF0ZSkgOworfQorCisvKgorICogcmVhZCBjdXJyZW50IGxpbmUgc3RhdGUgKGNhbGxlZCBieSBFQ00gJiBQQ00pCisgKi8KK2ludCBzbV9wbV9nZXRfbHMoc3RydWN0IHNfc21jICpzbWMsIGludCBwaHkpCit7CisJaW50CXN0YXRlIDsKKworI2lmZGVmCUNPTkNFTlRSQVRPUgorCWlmICghcGxjX2lzX2luc3RhbGxlZChzbWMscGh5KSkKKwkJcmV0dXJuKFBDX1FMUykgOworI2VuZGlmCisKKwlzdGF0ZSA9IGlucHcoUExDKHBoeSxQTF9TVEFUVVNfQSkpICYgUExfTElORV9TVCA7CisJc3dpdGNoKHN0YXRlKSB7CisJY2FzZSBQTF9MX1FMUzoKKwkJc3RhdGUgPSBQQ19RTFMgOworCQlicmVhayA7CisJY2FzZSBQTF9MX01MUzoKKwkJc3RhdGUgPSBQQ19NTFMgOworCQlicmVhayA7CisJY2FzZSBQTF9MX0hMUzoKKwkJc3RhdGUgPSBQQ19ITFMgOworCQlicmVhayA7CisJY2FzZSBQTF9MX0lMUzQ6CisJY2FzZSBQTF9MX0lMUzE2OgorCQlzdGF0ZSA9IFBDX0lMUyA7CisJCWJyZWFrIDsKKwljYXNlIFBMX0xfQUxTOgorCQlzdGF0ZSA9IFBDX0xTX1BEUiA7CisJCWJyZWFrIDsKKwlkZWZhdWx0IDoKKwkJc3RhdGUgPSBQQ19MU19OT05FIDsKKwl9CisJcmV0dXJuKHN0YXRlKSA7Cit9CisKK3N0YXRpYyBpbnQgcGxjX3NlbmRfYml0cyhzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNfcGh5ICpwaHksIGludCBsZW4pCit7CisJaW50IG5wID0gcGh5LT5ucCA7CQkvKiBQSFkgaW5kZXggKi8KKwlpbnQJbiA7CisJaW50CWkgOworCisJU0tfVU5VU0VEKHNtYykgOworCisJLyogY3JlYXRlIGJpdCB2ZWN0b3IgKi8KKwlmb3IgKGkgPSBsZW4tMSxuID0gMCA7IGkgPj0gMCA7IGktLSkgeworCQluID0gKG48PDEpIHwgcGh5LT50X3ZhbFtwaHktPmJpdG4raV0gOworCX0KKwlpZiAoaW5wdyhQTEMobnAsUExfU1RBVFVTX0IpKSAmIFBMX1BDTV9TSUdOQUwpIHsKKyNpZgkwCisJCXByaW50ZigiUExfUENNX1NJR05BTCBpcyBzZXRcbiIpIDsKKyNlbmRpZgorCQlyZXR1cm4oMSkgOworCX0KKwkvKiB3cml0ZSBiaXRbbl0gJiBsZW5ndGggPSAxIHRvIHJlZ3MgKi8KKwlvdXRwdyhQTEMobnAsUExfVkVDVE9SX0xFTiksbGVuLTEpIDsJLyogbGVuPW5yLTEgKi8KKwlvdXRwdyhQTEMobnAsUExfWE1JVF9WRUNUT1IpLG4pIDsKKyNpZmRlZglERUJVRworI2lmIDEKKyNpZmRlZglERUJVR19CUkQKKwlpZiAoc21jLT5kZWJ1Zy5kX3BsYyAmIDB4ODApCisjZWxzZQorCWlmIChkZWJ1Zy5kX3BsYyAmIDB4ODApCisjZW5kaWYKKwkJcHJpbnRmKCJTSUdOQUxJTkcgYml0ICVkIC4uICVkXG4iLHBoeS0+Yml0bixwaHktPmJpdG4rbGVuLTEpIDsKKyNlbmRpZgorI2VuZGlmCisJcmV0dXJuKDApIDsKK30KKworLyoKKyAqIGNvbmZpZyBwbGMgbXV4ZXMKKyAqLwordm9pZCBwbGNfY29uZmlnX211eChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG11eCkKK3sKKwlpZiAoc21jLT5zLnNhcyAhPSBTTVRfREFTKQorCQlyZXR1cm4gOworCWlmIChtdXggPT0gTVVYX1dSQVBCKSB7CisJCVNFVE1BU0soUExDKFBBLFBMX0NOVFJMX0IpLFBMX0NPTkZJR19DTlRSTCxQTF9DT05GSUdfQ05UUkwpIDsKKwkJU0VUTUFTSyhQTEMoUEEsUExfQ05UUkxfQSksUExfU0NfUkVNX0xPT1AsUExfU0NfUkVNX0xPT1ApIDsKKwl9CisJZWxzZSB7CisJCUNMRUFSKFBMQyhQQSxQTF9DTlRSTF9CKSxQTF9DT05GSUdfQ05UUkwpIDsKKwkJQ0xFQVIoUExDKFBBLFBMX0NOVFJMX0EpLFBMX1NDX1JFTV9MT09QKSA7CisJfQorCUNMRUFSKFBMQyhQQixQTF9DTlRSTF9CKSxQTF9DT05GSUdfQ05UUkwpIDsKKwlDTEVBUihQTEMoUEIsUExfQ05UUkxfQSksUExfU0NfUkVNX0xPT1ApIDsKK30KKworLyoKKwlQQ00gc3RhdGUgbWFjaGluZQorCWNhbGxlZCBieSBkaXNwYXRjaGVyICAmIGZkZGlfaW5pdCgpIChkcml2ZXIpCisJZG8KKwkJZGlzcGxheSBzdGF0ZSBjaGFuZ2UKKwkJcHJvY2VzcyBldmVudAorCXVudGlsIFNNIGlzIHN0YWJsZQorKi8KK3ZvaWQgcGNtKHN0cnVjdCBzX3NtYyAqc21jLCBjb25zdCBpbnQgbnAsIGludCBldmVudCkKK3sKKwlpbnQJc3RhdGUgOworCWludAlvbGRzdGF0ZSA7CisJc3RydWN0IHNfcGh5CSpwaHkgOworCXN0cnVjdCBmZGRpX21pYl9wCSptaWIgOworCisjaWZuZGVmCUNPTkNFTlRSQVRPUgorCS8qCisJICogaWdub3JlIDJuZCBQSFkgaWYgU0FTCisJICovCisJaWYgKChucCAhPSBQUykgJiYgKHNtYy0+cy5zYXMgPT0gU01UX1NBUykpCisJCXJldHVybiA7CisjZW5kaWYKKwlwaHkgPSAmc21jLT55W25wXSA7CisJbWliID0gcGh5LT5taWIgOworCW9sZHN0YXRlID0gbWliLT5mZGRpUE9SVFBDTVN0YXRlIDsKKwlkbyB7CisJCURCX1BDTSgiUENNICVjOiBzdGF0ZSAlcyIsCisJCQlwaHktPnBoeV9uYW1lLAorCQkJKG1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSAmIEFGTEFHKSA/ICJBQ1RJT05TICIgOiAiIikgOworCQlEQl9QQ00oIiVzLCBldmVudCAlc1xuIiwKKwkJCXBjbV9zdGF0ZXNbbWliLT5mZGRpUE9SVFBDTVN0YXRlICYgfkFGTEFHXSwKKwkJCXBjbV9ldmVudHNbZXZlbnRdKSA7CisJCXN0YXRlID0gbWliLT5mZGRpUE9SVFBDTVN0YXRlIDsKKwkJcGNtX2ZzbShzbWMscGh5LGV2ZW50KSA7CisJCWV2ZW50ID0gMCA7CisJfSB3aGlsZSAoc3RhdGUgIT0gbWliLT5mZGRpUE9SVFBDTVN0YXRlKSA7CisJLyoKKwkgKiBiZWNhdXNlIHRoZSBQTEMgZG9lcyB0aGUgYml0IHNpZ25hbGluZyBmb3IgdXMsCisJICogd2UncmUgYWx3YXlzIGluIFNJR05BTCBzdGF0ZQorCSAqIHRoZSBNSUIgd2FudCdzIHRvIHNlZSBDT05ORUNUCisJICogd2UgdGhlcmVmb3JlIGZha2UgYW4gZW50cnkgaW4gdGhlIE1JQgorCSAqLworCWlmIChzdGF0ZSA9PSBQQzVfU0lHTkFMKQorCQltaWItPmZkZGlQT1JUUENNU3RhdGVYID0gUEMzX0NPTk5FQ1QgOworCWVsc2UKKwkJbWliLT5mZGRpUE9SVFBDTVN0YXRlWCA9IHN0YXRlIDsKKworI2lmbmRlZglTTElNX1NNVAorCS8qCisJICogcGF0aCBjaGFuZ2UKKwkgKi8KKwlpZiAoCW1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSAhPSBvbGRzdGF0ZSAmJgorCQkoKG9sZHN0YXRlID09IFBDOF9BQ1RJVkUpIHx8IChtaWItPmZkZGlQT1JUUENNU3RhdGUgPT0gUEM4X0FDVElWRSkpKSB7CisJCXNtdF9zcmZfZXZlbnQoc21jLFNNVF9FVkVOVF9QT1JUX1BBVEhfQ0hBTkdFLAorCQkJKGludCkgKElOREVYX1BPUlQrIHBoeS0+bnApLDApIDsKKwl9CisjZW5kaWYKKworI2lmZGVmIEZERElfTUlCCisJLyogY2hlY2sgd2hldGhlciBhIHNubXAtdHJhcCBoYXMgdG8gYmUgc2VudCAqLworCisJaWYgKCBtaWItPmZkZGlQT1JUUENNU3RhdGUgIT0gb2xkc3RhdGUgKSB7CisJCS8qIGEgcmVhbCBzdGF0ZSBjaGFuZ2UgdG9vayBwbGFjZSAqLworCQlEQl9TTk1QICgiUENNIGZyb20gJWQgdG8gJWRcbiIsIG9sZHN0YXRlLCBtaWItPmZkZGlQT1JUUENNU3RhdGUpOworCQlpZiAoIG1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSA9PSBQQzBfT0ZGICkgeworCQkJLyogc2VuZCBmaXJzdCB0cmFwICovCisJCQlzbm1wX2ZkZGlfdHJhcCAoc21jLCAxLCAoaW50KSBtaWItPmZkZGlQT1JUSW5kZXggKTsKKwkJfSBlbHNlIGlmICggb2xkc3RhdGUgPT0gUEMwX09GRiApIHsKKwkJCS8qIHNlbmQgc2Vjb25kIHRyYXAgKi8KKwkJCXNubXBfZmRkaV90cmFwIChzbWMsIDIsIChpbnQpIG1pYi0+ZmRkaVBPUlRJbmRleCApOworCQl9IGVsc2UgaWYgKCBtaWItPmZkZGlQT1JUUENNU3RhdGUgIT0gUEMyX1RSQUNFICYmCisJCQlvbGRzdGF0ZSA9PSBQQzhfQUNUSVZFICkgeworCQkJLyogc2VuZCB0aGlyZCB0cmFwICovCisJCQlzbm1wX2ZkZGlfdHJhcCAoc21jLCAzLCAoaW50KSBtaWItPmZkZGlQT1JUSW5kZXggKTsKKwkJfSBlbHNlIGlmICggbWliLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDOF9BQ1RJVkUgKSB7CisJCQkvKiBzZW5kIGZvdXJ0aCB0cmFwICovCisJCQlzbm1wX2ZkZGlfdHJhcCAoc21jLCA0LCAoaW50KSBtaWItPmZkZGlQT1JUSW5kZXggKTsKKwkJfQorCX0KKyNlbmRpZgorCisJcGNtX3N0YXRlX2NoYW5nZShzbWMsbnAsc3RhdGUpIDsKK30KKworLyoKKyAqIFBDTSBzdGF0ZSBtYWNoaW5lCisgKi8KK3N0YXRpYyB2b2lkIHBjbV9mc20oc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzX3BoeSAqcGh5LCBpbnQgY21kKQoreworCWludAlpIDsKKwlpbnQJbnAgPSBwaHktPm5wIDsJCS8qIFBIWSBpbmRleCAqLworCXN0cnVjdCBzX3BsYwkqcGxjIDsKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqbWliIDsKKyNpZm5kZWYJTU9UX0VMTQorCXVfc2hvcnQJcGxjX3JldiA7CQkvKiBSZXZpc2lvbiBvZiB0aGUgcGxjICovCisjZW5kaWYJLyogbk1PVF9FTE0gKi8KKworCXBsYyA9ICZwaHktPnBsYyA7CisJbWliID0gcGh5LT5taWIgOworCisJLyoKKwkgKiBnZW5lcmFsIHRyYW5zaXRpb25zIGluZGVwZW5kZW50IG9mIHN0YXRlCisJICovCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBDX1NUT1AgOgorCQkvKlBDMDAtUEM4MCovCisJCWlmIChtaWItPmZkZGlQT1JUUENNU3RhdGUgIT0gUEM5X01BSU5UKSB7CisJCQlHT19TVEFURShQQzBfT0ZGKSA7CisJCQlBSVhfRVZFTlQoc21jLCAodV9sb25nKSBGRERJX1JJTkdfU1RBVFVTLCAodV9sb25nKQorCQkJCUZERElfUE9SVF9FVkVOVCwgKHVfbG9uZykgRkRESV9QT1JUX1NUT1AsCisJCQkJc210X2dldF9wb3J0X2V2ZW50X3dvcmQoc21jKSk7CisJCX0KKwkJcmV0dXJuIDsKKwljYXNlIFBDX1NUQVJUIDoKKwkJLypQQzAxLVBDODEqLworCQlpZiAobWliLT5mZGRpUE9SVFBDTVN0YXRlICE9IFBDOV9NQUlOVCkKKwkJCUdPX1NUQVRFKFBDMV9CUkVBSykgOworCQlyZXR1cm4gOworCWNhc2UgUENfRElTQUJMRSA6CisJCS8qIFBDMDktUEM5OSAqLworCQlHT19TVEFURShQQzlfTUFJTlQpIDsKKwkJQUlYX0VWRU5UKHNtYywgKHVfbG9uZykgRkRESV9SSU5HX1NUQVRVUywgKHVfbG9uZykKKwkJCUZERElfUE9SVF9FVkVOVCwgKHVfbG9uZykgRkRESV9QT1JUX0RJU0FCTEVELAorCQkJc210X2dldF9wb3J0X2V2ZW50X3dvcmQoc21jKSk7CisJCXJldHVybiA7CisJY2FzZSBQQ19USU1FT1VUX0xDVCA6CisJCS8qIGlmIGxvbmcgb3IgZXh0ZW5kZWQgTENUICovCisJCXN0b3BfcGNtX3RpbWVyMChzbWMscGh5KSA7CisJCUNMRUFSKFBMQyhucCxQTF9DTlRSTF9CKSxQTF9MT05HKSA7CisJCS8qIGVuZCBvZiBMQ1QgaXMgaW5kaWNhdGUgYnkgUENNX0NPREUgKGluaXRpYXRlIFBDTSBldmVudCkgKi8KKwkJcmV0dXJuIDsKKwl9CisKKwlzd2l0Y2gobWliLT5mZGRpUE9SVFBDTVN0YXRlKSB7CisJY2FzZSBBQ1RJT05TKFBDMF9PRkYpIDoKKwkJc3RvcF9wY21fdGltZXIwKHNtYyxwaHkpIDsKKwkJb3V0cHcoUExDKG5wLFBMX0NOVFJMX0EpLDApIDsKKwkJQ0xFQVIoUExDKG5wLFBMX0NOVFJMX0IpLFBMX1BDX0pPSU4pIDsKKwkJQ0xFQVIoUExDKG5wLFBMX0NOVFJMX0IpLFBMX0xPTkcpIDsKKwkJc21fcGhfbGVtX3N0b3Aoc21jLG5wKSA7CQkvKiBkaXNhYmxlIExFTSAqLworCQlwaHktPmNmX2xvb3AgPSBGQUxTRSA7CisJCXBoeS0+Y2Zfam9pbiA9IEZBTFNFIDsKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX0NGTSxDRl9KT0lOK25wKSA7CisJCXBsY19nb19zdGF0ZShzbWMsbnAsUExfUENNX1NUT1ApIDsKKwkJbWliLT5mZGRpUE9SVENvbm5lY3RTdGF0ZSA9IFBDTV9ESVNBQkxFRCA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWsgOworCWNhc2UgUEMwX09GRjoKKwkJLypQQzA5Ki8KKwkJaWYgKGNtZCA9PSBQQ19NQUlOVCkgeworCQkJR09fU1RBVEUoUEM5X01BSU5UKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgQUNUSU9OUyhQQzFfQlJFQUspIDoKKwkJLyogU3RvcCB0aGUgTENUIHRpbWVyIGlmIHdlIGNhbWUgZnJvbSBTaWduYWwgc3RhdGUgKi8KKwkJc3RvcF9wY21fdGltZXIwKHNtYyxwaHkpIDsKKwkJQUNUSU9OU19ET05FKCkgOworCQlwbGNfZ29fc3RhdGUoc21jLG5wLDApIDsKKwkJQ0xFQVIoUExDKG5wLFBMX0NOVFJMX0IpLFBMX1BDX0pPSU4pIDsKKwkJQ0xFQVIoUExDKG5wLFBMX0NOVFJMX0IpLFBMX0xPTkcpIDsKKwkJc21fcGhfbGVtX3N0b3Aoc21jLG5wKSA7CQkvKiBkaXNhYmxlIExFTSAqLworCQkvKgorCQkgKiBpZiB2ZWN0b3IgaXMgYWxyZWFkeSBsb2FkZWQsIGdvIHRvIE9GRiB0byBjbGVhciBQQ01fU0lHTkFMCisJCSAqLworI2lmCTAKKwkJaWYgKGlucHcoUExDKG5wLFBMX1NUQVRVU19CKSkgJiBQTF9QQ01fU0lHTkFMKSB7CisJCQlwbGNfZ29fc3RhdGUoc21jLG5wLFBMX1BDTV9TVE9QKSA7CisJCQkvKiBUQl9NSU4gPyAqLworCQl9CisjZW5kaWYKKwkJLyoKKwkJICogR28gdG8gT0ZGIHN0YXRlIGluIGFueSBjYXNlLgorCQkgKi8KKwkJcGxjX2dvX3N0YXRlKHNtYyxucCxQTF9QQ01fU1RPUCkgOworCisJCWlmIChtaWItPmZkZGlQT1JUUENfV2l0aGhvbGQgPT0gUENfV0hfTk9ORSkKKwkJCW1pYi0+ZmRkaVBPUlRDb25uZWN0U3RhdGUgPSBQQ01fQ09OTkVDVElORyA7CisJCXBoeS0+Y2ZfbG9vcCA9IEZBTFNFIDsKKwkJcGh5LT5jZl9qb2luID0gRkFMU0UgOworCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfQ0ZNLENGX0pPSU4rbnApIDsKKwkJcGh5LT5sc19mbGFnID0gRkFMU0UgOworCQlwaHktPnBjX21vZGUgPSBQTV9OT05FIDsJLyogbmVlZGVkIGJ5IENGTSAqLworCQlwaHktPmJpdG4gPSAwIDsJCQkvKiBiaXQgc2lnbmFsaW5nIHN0YXJ0IGJpdCAqLworCQlmb3IgKGkgPSAwIDsgaSA8IDMgOyBpKyspCisJCQlwY190Y29kZV9hY3Rpb25zKHNtYyxpLHBoeSkgOworCisJCS8qIFNldCB0aGUgbm9uLWFjdGl2ZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworCQlvdXRwdyhQTEMobnAsUExfSU5UUl9NQVNLKSxwbGNfaW1za19uYSkgOworCisJCS8qCisJCSAqIElmIHRoZSBMQ1Qgd2FzIHN0b3BwZWQuIFRoZXJlIG1pZ2h0IGJlIGEKKwkJICogUENNX0NPREUgaW50ZXJydXB0IGV2ZW50IHByZXNlbnQuCisJCSAqIFRoaXMgbXVzdCBiZSBjbGVhcmVkLgorCQkgKi8KKwkJKHZvaWQpaW5wdyhQTEMobnAsUExfSU5UUl9FVkVOVCkpIDsKKyNpZm5kZWYJTU9UX0VMTQorCQkvKiBHZXQgdGhlIHBsYyByZXZpc2lvbiBmb3IgcmV2aXNpb24gZGVwZW5kZW50IGNvZGUgKi8KKwkJcGxjX3JldiA9IGlucHcoUExDKG5wLFBMX1NUQVRVU19BKSkgJiBQTENfUkVWX01BU0sgOworCisJCWlmIChwbGNfcmV2ICE9IFBMQ19SRVZfU04zKQorI2VuZGlmCS8qIE1PVF9FTE0gKi8KKwkJeworCQkJLyoKKwkJCSAqIE5vIHN1cGVybmV0IElJSSBQTEMsIHNvIHNldCBYbWl0IHZlcmN0b3IgYW5kCisJCQkgKiBsZW5ndGggQkVGT1JFIHN0YXJ0aW5nIHRoZSBzdGF0ZSBtYWNoaW5lLgorCQkJICovCisJCQlpZiAocGxjX3NlbmRfYml0cyhzbWMscGh5LDMpKSB7CisJCQkJcmV0dXJuIDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIE5vdyBnaXZlIHRoZSBTdGFydCBjb21tYW5kLgorCQkgKiAtIFRoZSBzdGFydCBjb21tYW5kIHNoYWxsIGJlIGRvbmUgYmVmb3JlIHNldHRpbmcgdGhlIGJpdHMKKwkJICogICB0byBiZSBzaWduYWxlZC4gKEluIFBMQy1TIGRlc2NyaXB0aW9uIGFuZCBQTENTIGluIFNOMy4KKwkJICogLSBUaGUgc3RhcnQgY29tbWFuZCBzaGFsbCBiZSBpc3N1ZWQgQUZURVIgc2V0dGluZyB0aGUKKwkJICogICBYTUlUIHZlY3RvciBhbmQgdGhlIFhNSVQgbGVuZ3RoIHJlZ2lzdGVyLgorCQkgKgorCQkgKiBXZSBkbyBpdCBleGFjdGx5IGFjY29yZGluZyB0aGlzIHNwZWNzIGZvciB0aGUgb2xkIFBMQyBhbmQKKwkJICogdGhlIG5ldyBQTENTIGluc2lkZSB0aGUgU04zLgorCQkgKiBGb3IgdGhlIHVzdWFsIFBMQ1Mgd2UgdHJ5IGl0IHRoZSB3YXkgaXQgaXMgZG9uZSBmb3IgdGhlCisJCSAqIG9sZCBQTEMgYW5kIHNldCB0aGUgWE1JVCByZWdpc3RlcnMgYWdhaW4sIGlmIHRoZSBQTEMgaXMKKwkJICogbm90IGluIFNJR05BTCBzdGF0ZS4gVGhpcyBpcyBkb25lIGFjY29yZGluZyB0byBhbiBQTENTCisJCSAqIGVycmF0YSB3b3JrYXJvdW5kLgorCQkgKi8KKworCQlwbGNfZ29fc3RhdGUoc21jLG5wLFBMX1BDTV9TVEFSVCkgOworCisJCS8qCisJCSAqIHdvcmthcm91bmQgZm9yIFBMQy1TIGVuZy4gc2FtcGxlIGVycmF0YQorCQkgKi8KKyNpZmRlZglNT1RfRUxNCisJCWlmICghKGlucHcoUExDKG5wLFBMX1NUQVRVU19CKSkgJiBQTF9QQ01fU0lHTkFMKSkKKyNlbHNlCS8qIG5NT1RfRUxNICovCisJCWlmICgoKGlucHcoUExDKG5wLFBMX1NUQVRVU19BKSkgJiBQTENfUkVWX01BU0spICE9CisJCQlQTENfUkVWSVNJT05fQSkgJiYKKwkJCSEoaW5wdyhQTEMobnAsUExfU1RBVFVTX0IpKSAmIFBMX1BDTV9TSUdOQUwpKQorI2VuZGlmCS8qIG5NT1RfRUxNICovCisJCXsKKwkJCS8qCisJCQkgKiBTZXQgcmVnaXN0ZXIgYWdhaW4gKFBMQ1MgZXJyYXRhKSBvciB0aGUgZmlyc3QgdGltZQorCQkJICogKG5ldyBTTjMgUExDUykuCisJCQkgKi8KKwkJCSh2b2lkKSBwbGNfc2VuZF9iaXRzKHNtYyxwaHksMykgOworCQl9CisJCS8qCisJCSAqIGVuZCBvZiB3b3JrYXJvdW5kCisJCSAqLworCisJCUdPX1NUQVRFKFBDNV9TSUdOQUwpIDsKKwkJcGxjLT5wX3N0YXRlID0gUFNfQklUMyA7CisJCXBsYy0+cF9iaXRzID0gMyA7CisJCXBsYy0+cF9zdGFydCA9IDAgOworCisJCWJyZWFrIDsKKwljYXNlIFBDMV9CUkVBSyA6CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoUEMyX1RSQUNFKSA6CisJCXBsY19nb19zdGF0ZShzbWMsbnAsUExfUENNX1RSQUNFKSA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWsgOworCWNhc2UgUEMyX1RSQUNFIDoKKwkJYnJlYWsgOworCisJY2FzZSBQQzNfQ09OTkVDVCA6CS8qIHRoZXNlIHN0YXRlcyBhcmUgZG9uZSBieSBoYXJkd2FyZSAqLworCWNhc2UgUEM0X05FWFQgOgorCQlicmVhayA7CisKKwljYXNlIEFDVElPTlMoUEM1X1NJR05BTCkgOgorCQlBQ1RJT05TX0RPTkUoKSA7CisJY2FzZSBQQzVfU0lHTkFMIDoKKwkJaWYgKChjbWQgIT0gUENfU0lHTkFMKSAmJiAoY21kICE9IFBDX1RJTUVPVVRfTENUKSkKKwkJCWJyZWFrIDsKKwkJc3dpdGNoIChwbGMtPnBfc3RhdGUpIHsKKwkJY2FzZSBQU19CSVQzIDoKKwkJCWZvciAoaSA9IDAgOyBpIDw9IDIgOyBpKyspCisJCQkJcGNfcmNvZGVfYWN0aW9ucyhzbWMsaSxwaHkpIDsKKwkJCXBjX3Rjb2RlX2FjdGlvbnMoc21jLDMscGh5KSA7CisJCQlwbGMtPnBfc3RhdGUgPSBQU19CSVQ0IDsKKwkJCXBsYy0+cF9iaXRzID0gMSA7CisJCQlwbGMtPnBfc3RhcnQgPSAzIDsKKwkJCXBoeS0+Yml0biA9IDMgOworCQkJaWYgKHBsY19zZW5kX2JpdHMoc21jLHBoeSwxKSkgeworCQkJCXJldHVybiA7CisJCQl9CisJCQlicmVhayA7CisJCWNhc2UgUFNfQklUNCA6CisJCQlwY19yY29kZV9hY3Rpb25zKHNtYywzLHBoeSkgOworCQkJZm9yIChpID0gNCA7IGkgPD0gNiA7IGkrKykKKwkJCQlwY190Y29kZV9hY3Rpb25zKHNtYyxpLHBoeSkgOworCQkJcGxjLT5wX3N0YXRlID0gUFNfQklUNyA7CisJCQlwbGMtPnBfYml0cyA9IDMgOworCQkJcGxjLT5wX3N0YXJ0ID0gNCA7CisJCQlwaHktPmJpdG4gPSA0IDsKKwkJCWlmIChwbGNfc2VuZF9iaXRzKHNtYyxwaHksMykpIHsKKwkJCQlyZXR1cm4gOworCQkJfQorCQkJYnJlYWsgOworCQljYXNlIFBTX0JJVDcgOgorCQkJZm9yIChpID0gMyA7IGkgPD0gNiA7IGkrKykKKwkJCQlwY19yY29kZV9hY3Rpb25zKHNtYyxpLHBoeSkgOworCQkJcGxjLT5wX3N0YXRlID0gUFNfTENUIDsKKwkJCXBsYy0+cF9iaXRzID0gMCA7CisJCQlwbGMtPnBfc3RhcnQgPSA3IDsKKwkJCXBoeS0+Yml0biA9IDcgOworCQlzbV9waF9sZW1fc3RhcnQoc21jLG5wLChpbnQpc21jLT5zLmxjdF9zaG9ydCkgOyAvKiBlbmFibGUgTEVNICovCisJCQkvKiBzdGFydCBMQ1QgKi8KKwkJCWkgPSBpbnB3KFBMQyhucCxQTF9DTlRSTF9CKSkgJiB+UExfUENfTE9PUCA7CisJCQlvdXRwdyhQTEMobnAsUExfQ05UUkxfQiksaSkgOwkvKiBtdXN0IGJlIGNsZWFyZWQgKi8KKwkJCW91dHB3KFBMQyhucCxQTF9DTlRSTF9CKSxpIHwgUExfUkxCUCkgOworCQkJYnJlYWsgOworCQljYXNlIFBTX0xDVCA6CisJCQkvKiBjaGVjayBmb3IgbG9jYWwgTENUIGZhaWx1cmUgKi8KKwkJCXBjX3Rjb2RlX2FjdGlvbnMoc21jLDcscGh5KSA7CisJCQkvKgorCQkJICogc2V0IHR2YWxbN10KKwkJCSAqLworCQkJcGxjLT5wX3N0YXRlID0gUFNfQklUOCA7CisJCQlwbGMtPnBfYml0cyA9IDEgOworCQkJcGxjLT5wX3N0YXJ0ID0gNyA7CisJCQlwaHktPmJpdG4gPSA3IDsKKwkJCWlmIChwbGNfc2VuZF9iaXRzKHNtYyxwaHksMSkpIHsKKwkJCQlyZXR1cm4gOworCQkJfQorCQkJYnJlYWsgOworCQljYXNlIFBTX0JJVDggOgorCQkJLyogY2hlY2sgZm9yIHJlbW90ZSBMQ1QgZmFpbHVyZSAqLworCQkJcGNfcmNvZGVfYWN0aW9ucyhzbWMsNyxwaHkpIDsKKwkJCWlmIChwaHktPnRfdmFsWzddIHx8IHBoeS0+cl92YWxbN10pIHsKKwkJCQlwbGNfZ29fc3RhdGUoc21jLG5wLFBMX1BDTV9TVE9QKSA7CisJCQkJR09fU1RBVEUoUEMxX0JSRUFLKSA7CisJCQkJYnJlYWsgOworCQkJfQorCQkJZm9yIChpID0gOCA7IGkgPD0gOSA7IGkrKykKKwkJCQlwY190Y29kZV9hY3Rpb25zKHNtYyxpLHBoeSkgOworCQkJcGxjLT5wX3N0YXRlID0gUFNfSk9JTiA7CisJCQlwbGMtPnBfYml0cyA9IDIgOworCQkJcGxjLT5wX3N0YXJ0ID0gOCA7CisJCQlwaHktPmJpdG4gPSA4IDsKKwkJCWlmIChwbGNfc2VuZF9iaXRzKHNtYyxwaHksMikpIHsKKwkJCQlyZXR1cm4gOworCQkJfQorCQkJYnJlYWsgOworCQljYXNlIFBTX0pPSU4gOgorCQkJZm9yIChpID0gOCA7IGkgPD0gOSA7IGkrKykKKwkJCQlwY19yY29kZV9hY3Rpb25zKHNtYyxpLHBoeSkgOworCQkJcGxjLT5wX3N0YXRlID0gUFNfQUNUSVZFIDsKKwkJCUdPX1NUQVRFKFBDNl9KT0lOKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCisJY2FzZSBBQ1RJT05TKFBDNl9KT0lOKSA6CisJCS8qCisJCSAqIHByZXZlbnQgbXV4IGVycm9yIHdoZW4gZ29pbmcgZnJvbSBXUkFQX0EgdG8gV1JBUF9CCisJCSAqLworCQlpZiAoc21jLT5zLnNhcyA9PSBTTVRfREFTICYmIG5wID09IFBCICYmCisJCQkoc21jLT55W1BBXS5wY19tb2RlID09IFBNX1RSRUUgfHwKKwkJCSBzbWMtPnlbUEJdLnBjX21vZGUgPT0gUE1fVFJFRSkpIHsKKwkJCVNFVE1BU0soUExDKG5wLFBMX0NOVFJMX0EpLAorCQkJCVBMX1NDX1JFTV9MT09QLFBMX1NDX1JFTV9MT09QKSA7CisJCQlTRVRNQVNLKFBMQyhucCxQTF9DTlRSTF9CKSwKKwkJCQlQTF9DT05GSUdfQ05UUkwsUExfQ09ORklHX0NOVFJMKSA7CisJCX0KKwkJU0VUTUFTSyhQTEMobnAsUExfQ05UUkxfQiksUExfUENfSk9JTixQTF9QQ19KT0lOKSA7CisJCVNFVE1BU0soUExDKG5wLFBMX0NOVFJMX0IpLFBMX1BDX0pPSU4sUExfUENfSk9JTikgOworCQlBQ1RJT05TX0RPTkUoKSA7CisJCWNtZCA9IDAgOworCQkvKiBmYWxsIHRocnUgKi8KKwljYXNlIFBDNl9KT0lOIDoKKwkJc3dpdGNoIChwbGMtPnBfc3RhdGUpIHsKKwkJY2FzZSBQU19BQ1RJVkU6CisJCQkvKlBDODhiKi8KKwkJCWlmICghcGh5LT5jZl9qb2luKSB7CisJCQkJcGh5LT5jZl9qb2luID0gVFJVRSA7CisJCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX0NGTSxDRl9KT0lOK25wKSA7IDsKKwkJCX0KKwkJCWlmIChjbWQgPT0gUENfSk9JTikKKwkJCQlHT19TVEFURShQQzhfQUNUSVZFKSA7CisJCQkvKlBDODIqLworCQkJaWYgKGNtZCA9PSBQQ19UUkFDRSkgeworCQkJCUdPX1NUQVRFKFBDMl9UUkFDRSkgOworCQkJCWJyZWFrIDsKKwkJCX0KKwkJCWJyZWFrIDsKKwkJfQorCQlicmVhayA7CisKKwljYXNlIFBDN19WRVJJRlkgOgorCQlicmVhayA7CisKKwljYXNlIEFDVElPTlMoUEM4X0FDVElWRSkgOgorCQkvKgorCQkgKiBzdGFydCBMRU0gZm9yIFNNVAorCQkgKi8KKwkJc21fcGhfbGVtX3N0YXJ0KHNtYywoaW50KXBoeS0+bnAsTENUX0xFTV9NQVgpIDsKKworCQlwaHktPnRyX2ZsYWcgPSBGQUxTRSA7CisJCW1pYi0+ZmRkaVBPUlRDb25uZWN0U3RhdGUgPSBQQ01fQUNUSVZFIDsKKworCQkvKiBTZXQgdGhlIGFjdGl2ZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworCQlvdXRwdyhQTEMobnAsUExfSU5UUl9NQVNLKSxwbGNfaW1za19hY3QpIDsKKworCQlBQ1RJT05TX0RPTkUoKSA7CisJCWJyZWFrIDsKKwljYXNlIFBDOF9BQ1RJVkUgOgorCQkvKlBDODEgaXMgZG9uZSBieSBQTF9UTkVfRVhQSVJFRCBpcnEgKi8KKwkJLypQQzgyKi8KKwkJaWYgKGNtZCA9PSBQQ19UUkFDRSkgeworCQkJR09fU1RBVEUoUEMyX1RSQUNFKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypQQzg4YzogaXMgZG9uZSBieSBUUkFDRV9QUk9QIGlycSAqLworCisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoUEM5X01BSU5UKSA6CisJCXN0b3BfcGNtX3RpbWVyMChzbWMscGh5KSA7CisJCUNMRUFSKFBMQyhucCxQTF9DTlRSTF9CKSxQTF9QQ19KT0lOKSA7CisJCUNMRUFSKFBMQyhucCxQTF9DTlRSTF9CKSxQTF9MT05HKSA7CisJCUNMRUFSKFBMQyhucCxQTF9JTlRSX01BU0spLFBMX0xFX0NUUikgOwkvKiBkaXNhYmxlIExFTSBpbnQuICovCisJCXNtX3BoX2xlbV9zdG9wKHNtYyxucCkgOwkJLyogZGlzYWJsZSBMRU0gKi8KKwkJcGh5LT5jZl9sb29wID0gRkFMU0UgOworCQlwaHktPmNmX2pvaW4gPSBGQUxTRSA7CisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9DRk0sQ0ZfSk9JTitucCkgOworCQlwbGNfZ29fc3RhdGUoc21jLG5wLFBMX1BDTV9TVE9QKSA7CisJCW1pYi0+ZmRkaVBPUlRDb25uZWN0U3RhdGUgPSBQQ01fRElTQUJMRUQgOworCQlTRVRNQVNLKFBMQyhucCxQTF9DTlRSTF9CKSxQTF9NQUlOVCxQTF9NQUlOVCkgOworCQlzbV9waF9saW5lc3RhdGUoc21jLG5wLChpbnQpIE1JQjJMUyhtaWItPmZkZGlQT1JUTWFpbnRfTFMpKSA7CisJCW91dHB3KFBMQyhucCxQTF9DTlRSTF9BKSxQTF9TQ19CWVBBU1MpIDsKKwkJQUNUSU9OU19ET05FKCkgOworCQlicmVhayA7CisJY2FzZSBQQzlfTUFJTlQgOgorCQlEQl9QQ01OKDEsIlBDTSAlYyA6IE1BSU5UXG4iLHBoeS0+cGh5X25hbWUsMCkgOworCQkvKlBDOTAqLworCQlpZiAoY21kID09IFBDX0VOQUJMRSkgeworCQkJR09fU1RBVEUoUEMwX09GRikgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKworCWRlZmF1bHQ6CisJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTE4LCBTTVRfRTAxMThfTVNHKSA7CisJCWJyZWFrIDsKKwl9Cit9CisKKy8qCisgKiBmb3JjZSBsaW5lIHN0YXRlIG9uIGEgUEhZIG91dHB1dAkob25seSBpbiBNQUlOVCBzdGF0ZSkKKyAqLworc3RhdGljIHZvaWQgc21fcGhfbGluZXN0YXRlKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcGh5LCBpbnQgbHMpCit7CisJaW50CWNudHJsIDsKKworCVNLX1VOVVNFRChzbWMpIDsKKworCWNudHJsID0gKGlucHcoUExDKHBoeSxQTF9DTlRSTF9CKSkgJiB+UExfTUFJTlRfTFMpIHwKKwkJCQkJCVBMX1BDTV9TVE9QIHwgUExfTUFJTlQgOworCXN3aXRjaChscykgeworCWNhc2UgUENfUUxTOiAJCS8qIEZvcmNlIFF1aWV0ICovCisJCWNudHJsIHw9IFBMX01fUVVJMCA7CisJCWJyZWFrIDsKKwljYXNlIFBDX01MUzogCQkvKiBGb3JjZSBNYXN0ZXIgKi8KKwkJY250cmwgfD0gUExfTV9NQVNUUiA7CisJCWJyZWFrIDsKKwljYXNlIFBDX0hMUzogCQkvKiBGb3JjZSBIYWx0ICovCisJCWNudHJsIHw9IFBMX01fSEFMVCA7CisJCWJyZWFrIDsKKwlkZWZhdWx0IDoKKwljYXNlIFBDX0lMUzogCQkvKiBGb3JjZSBJZGxlICovCisJCWNudHJsIHw9IFBMX01fSURMRSA7CisJCWJyZWFrIDsKKwljYXNlIFBDX0xTX1BEUjogCS8qIEVuYWJsZSByZXBlYXQgZmlsdGVyICovCisJCWNudHJsIHw9IFBMX01fVFBEUiA7CisJCWJyZWFrIDsKKwl9CisJb3V0cHcoUExDKHBoeSxQTF9DTlRSTF9CKSxjbnRybCkgOworfQorCitzdGF0aWMgdm9pZCByZXNldF9sZW1fc3RydWN0KHN0cnVjdCBzX3BoeSAqcGh5KQoreworCXN0cnVjdCBsZW1fY291bnRlciAqbGVtID0gJnBoeS0+bGVtIDsKKworCXBoeS0+bWliLT5mZGRpUE9SVExlcl9Fc3RpbWF0ZSA9IDE1IDsKKwlsZW0tPmxlbV9mbG9hdF9iZXIgPSAxNSAqIDEwMCA7Cit9CisKKy8qCisgKiBsaW5rIGVycm9yIG1vbml0b3IKKyAqLworc3RhdGljIHZvaWQgbGVtX2V2YWx1YXRlKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19waHkgKnBoeSkKK3sKKwlpbnQgYmVyIDsKKwl1X2xvbmcgZXJyb3JzIDsKKwlzdHJ1Y3QgbGVtX2NvdW50ZXIgKmxlbSA9ICZwaHktPmxlbSA7CisJc3RydWN0IGZkZGlfbWliX3AJKm1pYiA7CisJaW50CQkJY29uZCA7CisKKwltaWIgPSBwaHktPm1pYiA7CisKKwlpZiAoIWxlbS0+bGVtX29uKQorCQlyZXR1cm4gOworCisJZXJyb3JzID0gaW5wdyhQTEMoKChpbnQpIHBoeS0+bnApLFBMX0xJTktfRVJSX0NUUikpIDsKKwlsZW0tPmxlbV9lcnJvcnMgKz0gZXJyb3JzIDsKKwltaWItPmZkZGlQT1JUTGVtX0N0ICs9IGVycm9ycyA7CisKKwllcnJvcnMgPSBsZW0tPmxlbV9lcnJvcnMgOworCS8qCisJICogY2FsY3VsYXRpb24gaXMgY2FsbGVkIG9uIGEgaW50ZXJ2YWxsIG9mIDggc2Vjb25kcworCSAqCS0+IHRoaXMgbWVhbnMsIHRoYXQgb25lIGVycm9yIGluIDggc2VjLiBpcyBvbmUgb2YgOCoxMjUqMTBFNgorCSAqCXRoZSBzYW1lIGFzIEJFUiA9IDEwRS05CisJICogUGxlYXNlIG5vdGU6CisJICoJLT4gOSBlcnJvcnMgaW4gOCBzZWNvbmRzIG1lYW46CisJICoJICAgQkVSID0gOSAqIDEwRS05ICBhbmQgdGhpcyBpcworCSAqCSAgICA8IDEwRS04LCBzbyB0aGUgbGltaXQgb2YgMTBFLTggaXMgbm90IHJlYWNoZWQhCisJICovCisKKwkJaWYgKCFlcnJvcnMpCQliZXIgPSAxNSA7CisJZWxzZQlpZiAoZXJyb3JzIDw9IDkpCWJlciA9IDkgOworCWVsc2UJaWYgKGVycm9ycyA8PSA5OSkJYmVyID0gOCA7CisJZWxzZQlpZiAoZXJyb3JzIDw9IDk5OSkJYmVyID0gNyA7CisJZWxzZQlpZiAoZXJyb3JzIDw9IDk5OTkpCWJlciA9IDYgOworCWVsc2UJaWYgKGVycm9ycyA8PSA5OTk5OSkJYmVyID0gNSA7CisJZWxzZQlpZiAoZXJyb3JzIDw9IDk5OTk5OSkJYmVyID0gNCA7CisJZWxzZQlpZiAoZXJyb3JzIDw9IDk5OTk5OTkpCWJlciA9IDMgOworCWVsc2UJaWYgKGVycm9ycyA8PSA5OTk5OTk5OSkJYmVyID0gMiA7CisJZWxzZQlpZiAoZXJyb3JzIDw9IDk5OTk5OTk5OSkgYmVyID0gMSA7CisJZWxzZQkJCQliZXIgPSAwIDsKKworCS8qCisJICogd2VpZ2h0ZWQgYXZlcmFnZQorCSAqLworCWJlciAqPSAxMDAgOworCWxlbS0+bGVtX2Zsb2F0X2JlciA9IGxlbS0+bGVtX2Zsb2F0X2JlciAqIDcgKyBiZXIgKiAzIDsKKwlsZW0tPmxlbV9mbG9hdF9iZXIgLz0gMTAgOworCW1pYi0+ZmRkaVBPUlRMZXJfRXN0aW1hdGUgPSBsZW0tPmxlbV9mbG9hdF9iZXIgLyAxMDAgOworCWlmIChtaWItPmZkZGlQT1JUTGVyX0VzdGltYXRlIDwgNCkgeworCQltaWItPmZkZGlQT1JUTGVyX0VzdGltYXRlID0gNCA7CisJfQorCisJaWYgKGxlbS0+bGVtX2Vycm9ycykgeworCQlEQl9QQ01OKDEsIkxFTSAlYyA6XG4iLHBoeS0+bnAgPT0gUEI/ICdCJyA6ICdBJywwKSA7CisJCURCX1BDTU4oMSwiZXJyb3JzICAgICAgOiAlbGRcbiIsbGVtLT5sZW1fZXJyb3JzLDApIDsKKwkJREJfUENNTigxLCJzdW1fZXJyb3JzICA6ICVsZFxuIixtaWItPmZkZGlQT1JUTGVtX0N0LDApIDsKKwkJREJfUENNTigxLCJjdXJyZW50IEJFUiA6IDEwRS0lZFxuIixiZXIvMTAwLDApIDsKKwkJREJfUENNTigxLCJmbG9hdCBCRVIgICA6IDEwRS0oJWQvMTAwKVxuIixsZW0tPmxlbV9mbG9hdF9iZXIsMCkgOworCQlEQl9QQ01OKDEsImF2Zy4gQkVSICAgIDogMTBFLSVkXG4iLAorCQkJbWliLT5mZGRpUE9SVExlcl9Fc3RpbWF0ZSwwKSA7CisJfQorCisJbGVtLT5sZW1fZXJyb3JzID0gMEwgOworCisjaWZuZGVmCVNMSU1fU01UCisJY29uZCA9IChtaWItPmZkZGlQT1JUTGVyX0VzdGltYXRlIDw9IG1pYi0+ZmRkaVBPUlRMZXJfQWxhcm0pID8KKwkJVFJVRSA6IEZBTFNFIDsKKyNpZmRlZglTTVRfRVhUX0NVVE9GRgorCXNtdF9sZXJfYWxhcm1fY2hlY2soc21jLHBoeSxjb25kKSA7CisjZW5kaWYJLyogblNNVF9FWFRfQ1VUT0ZGICovCisJaWYgKGNvbmQgIT0gbWliLT5mZGRpUE9SVExlckZsYWcpIHsKKwkJc210X3NyZl9ldmVudChzbWMsU01UX0NPTkRfUE9SVF9MRVIsCisJCQkoaW50KSAoSU5ERVhfUE9SVCsgcGh5LT5ucCkgLGNvbmQpIDsKKwl9CisjZW5kaWYKKworCWlmICgJbWliLT5mZGRpUE9SVExlcl9Fc3RpbWF0ZSA8PSBtaWItPmZkZGlQT1JUTGVyX0N1dG9mZikgeworCQlwaHktPnBjX2xlbV9mYWlsID0gVFJVRSA7CQkvKiBmbGFnICovCisJCW1pYi0+ZmRkaVBPUlRMZW1fUmVqZWN0X0N0KysgOworCQkvKgorCQkgKiAiZm9yZ2l2ZSAxMGUtMiIgaWYgd2UgY3V0b2ZmIHNvIHdlIGNhbiBjb21lCisJCSAqIHVwIGFnYWluIC4uCisJCSAqLworCQlsZW0tPmxlbV9mbG9hdF9iZXIgKz0gMioxMDAgOworCisJCS8qUEM4MWIqLworI2lmZGVmCUNPTkNFTlRSQVRPUgorCQlEQl9QQ01OKDEsIlBDTTogTEVSIGN1dG9mZiBvbiBwb3J0ICVkIGN1dG9mZiAlZFxuIiwKKwkJCXBoeS0+bnAsIG1pYi0+ZmRkaVBPUlRMZXJfQ3V0b2ZmKSA7CisjZW5kaWYKKyNpZmRlZglTTVRfRVhUX0NVVE9GRgorCQlzbXRfcG9ydF9vZmZfZXZlbnQoc21jLHBoeS0+bnApOworI2Vsc2UJLyogblNNVF9FWFRfQ1VUT0ZGICovCisJCXF1ZXVlX2V2ZW50KHNtYywoaW50KShFVkVOVF9QQ00rcGh5LT5ucCksUENfU1RBUlQpIDsKKyNlbmRpZgkvKiBuU01UX0VYVF9DVVRPRkYgKi8KKwl9Cit9CisKKy8qCisgKiBjYWxsZWQgYnkgU01UIHRvIGNhbGN1bGF0ZSBMRU0gYml0IGVycm9yIHJhdGUKKyAqLwordm9pZCBzbV9sZW1fZXZhbHVhdGUoc3RydWN0IHNfc21jICpzbWMpCit7CisJaW50IG5wIDsKKworCWZvciAobnAgPSAwIDsgbnAgPCBOVU1QSFlTIDsgbnArKykKKwkJbGVtX2V2YWx1YXRlKHNtYywmc21jLT55W25wXSkgOworfQorCitzdGF0aWMgdm9pZCBsZW1fY2hlY2tfbGN0KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19waHkgKnBoeSkKK3sKKwlzdHJ1Y3QgbGVtX2NvdW50ZXIJKmxlbSA9ICZwaHktPmxlbSA7CisJc3RydWN0IGZkZGlfbWliX3AJKm1pYiA7CisJaW50IGVycm9ycyA7CisKKwltaWIgPSBwaHktPm1pYiA7CisKKwlwaHktPnBjX2xlbV9mYWlsID0gRkFMU0UgOwkJLyogZmxhZyAqLworCWVycm9ycyA9IGlucHcoUExDKCgoaW50KXBoeS0+bnApLFBMX0xJTktfRVJSX0NUUikpIDsKKwlsZW0tPmxlbV9lcnJvcnMgKz0gZXJyb3JzIDsKKwltaWItPmZkZGlQT1JUTGVtX0N0ICs9IGVycm9ycyA7CisJaWYgKGxlbS0+bGVtX2Vycm9ycykgeworCQlzd2l0Y2gocGh5LT5sY190ZXN0KSB7CisJCWNhc2UgTENfU0hPUlQ6CisJCQlpZiAobGVtLT5sZW1fZXJyb3JzID49IHNtYy0+cy5sY3Rfc2hvcnQpCisJCQkJcGh5LT5wY19sZW1fZmFpbCA9IFRSVUUgOworCQkJYnJlYWsgOworCQljYXNlIExDX01FRElVTToKKwkJCWlmIChsZW0tPmxlbV9lcnJvcnMgPj0gc21jLT5zLmxjdF9tZWRpdW0pCisJCQkJcGh5LT5wY19sZW1fZmFpbCA9IFRSVUUgOworCQkJYnJlYWsgOworCQljYXNlIExDX0xPTkc6CisJCQlpZiAobGVtLT5sZW1fZXJyb3JzID49IHNtYy0+cy5sY3RfbG9uZykKKwkJCQlwaHktPnBjX2xlbV9mYWlsID0gVFJVRSA7CisJCQlicmVhayA7CisJCWNhc2UgTENfRVhURU5ERUQ6CisJCQlpZiAobGVtLT5sZW1fZXJyb3JzID49IHNtYy0+cy5sY3RfZXh0ZW5kZWQpCisJCQkJcGh5LT5wY19sZW1fZmFpbCA9IFRSVUUgOworCQkJYnJlYWsgOworCQl9CisJCURCX1BDTU4oMSwiID4+ZXJyb3JzIDogJWRcbiIsbGVtLT5sZW1fZXJyb3JzLDApIDsKKwl9CisJaWYgKHBoeS0+cGNfbGVtX2ZhaWwpIHsKKwkJbWliLT5mZGRpUE9SVExDVEZhaWxfQ3QrKyA7CisJCW1pYi0+ZmRkaVBPUlRMZW1fUmVqZWN0X0N0KysgOworCX0KKwllbHNlCisJCW1pYi0+ZmRkaVBPUlRMQ1RGYWlsX0N0ID0gMCA7Cit9CisKKy8qCisgKiBMRU0gZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkIHNtX3BoX2xlbV9zdGFydChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG5wLCBpbnQgdGhyZXNob2xkKQoreworCXN0cnVjdCBsZW1fY291bnRlciAqbGVtID0gJnNtYy0+eVtucF0ubGVtIDsKKworCWxlbS0+bGVtX29uID0gMSA7CisJbGVtLT5sZW1fZXJyb3JzID0gMEwgOworCisJLyogRG8gTk9UIHJlc2V0IG1pYi0+ZmRkaVBPUlRMZXJfRXN0aW1hdGUgaGVyZS4gSXQgaXMgY2FsbGVkIHRvbworCSAqIG9mdGVuLgorCSAqLworCisJb3V0cHcoUExDKG5wLFBMX0xFX1RIUkVTSE9MRCksdGhyZXNob2xkKSA7CisJKHZvaWQpaW5wdyhQTEMobnAsUExfTElOS19FUlJfQ1RSKSkgOwkvKiBjbGVhciBlcnJvciBjb3VudGVyICovCisKKwkvKiBlbmFibGUgTEUgSU5UICovCisJU0VUTUFTSyhQTEMobnAsUExfSU5UUl9NQVNLKSxQTF9MRV9DVFIsUExfTEVfQ1RSKSA7Cit9CisKK3N0YXRpYyB2b2lkIHNtX3BoX2xlbV9zdG9wKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbnApCit7CisJc3RydWN0IGxlbV9jb3VudGVyICpsZW0gPSAmc21jLT55W25wXS5sZW0gOworCisJbGVtLT5sZW1fb24gPSAwIDsKKwlDTEVBUihQTEMobnAsUExfSU5UUl9NQVNLKSxQTF9MRV9DVFIpIDsKK30KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQgc21fcG1fbHNfbGF0Y2goc3RydWN0IHNfc21jICpzbWMsIGludCBwaHksIGludCBvbl9vZmYpCisvKiBpbnQgb25fb2ZmOwllbi0gb3IgZGlzYWJsZSBpZGVudC4gbHMgKi8KK3sKKwlTS19VTlVTRUQoc21jKSA7CisKKwlwaHkgPSBwaHkgOyBvbl9vZmYgPSBvbl9vZmYgOworfQorCisKKy8qCisgKiBQQ00gcHNldWRvIGNvZGUKKyAqIHJlY2VpdmUgYWN0aW9ucyBhcmUgY2FsbGVkIEFGVEVSIHRoZSBiaXQgbiBpcyByZWNlaXZlZCwKKyAqIGkuZS4gaWYgcGNfcmNvZGVfYWN0aW9ucyg1KSBpcyBjYWxsZWQsIGJpdCA2IGlzIHRoZSBuZXh0IGJpdCB0byBiZSByZWNlaXZlZAorICovCisKKy8qCisgKiBQQ00gcHNldWRvIGNvZGUgNS4xIC4uIDYuMQorICovCitzdGF0aWMgdm9pZCBwY19yY29kZV9hY3Rpb25zKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgYml0LCBzdHJ1Y3Qgc19waHkgKnBoeSkKK3sKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqbWliIDsKKworCW1pYiA9IHBoeS0+bWliIDsKKworCURCX1BDTU4oMSwiU0lHIHJlYyAleCAleDogXG4iLCBiaXQscGh5LT5yX3ZhbFtiaXRdICkgOworCWJpdCsrIDsKKworCXN3aXRjaChiaXQpIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCWNhc2UgMjoKKwkJYnJlYWsgOworCWNhc2UgMyA6CisJCWlmIChwaHktPnJfdmFsWzFdID09IDAgJiYgcGh5LT5yX3ZhbFsyXSA9PSAwKQorCQkJbWliLT5mZGRpUE9SVE5laWdoYm9yVHlwZSA9IFRBIDsKKwkJZWxzZSBpZiAocGh5LT5yX3ZhbFsxXSA9PSAwICYmIHBoeS0+cl92YWxbMl0gPT0gMSkKKwkJCW1pYi0+ZmRkaVBPUlROZWlnaGJvclR5cGUgPSBUQiA7CisJCWVsc2UgaWYgKHBoeS0+cl92YWxbMV0gPT0gMSAmJiBwaHktPnJfdmFsWzJdID09IDApCisJCQltaWItPmZkZGlQT1JUTmVpZ2hib3JUeXBlID0gVFMgOworCQllbHNlIGlmIChwaHktPnJfdmFsWzFdID09IDEgJiYgcGh5LT5yX3ZhbFsyXSA9PSAxKQorCQkJbWliLT5mZGRpUE9SVE5laWdoYm9yVHlwZSA9IFRNIDsKKwkJYnJlYWsgOworCWNhc2UgNDoKKwkJaWYgKG1pYi0+ZmRkaVBPUlRNeV9UeXBlID09IFRNICYmCisJCQltaWItPmZkZGlQT1JUTmVpZ2hib3JUeXBlID09IFRNKSB7CisJCQlEQl9QQ01OKDEsIlBDTSAlYyA6IEUxMDAgd2l0aGhvbGQgTS1NXG4iLAorCQkJCXBoeS0+cGh5X25hbWUsMCkgOworCQkJbWliLT5mZGRpUE9SVFBDX1dpdGhob2xkID0gUENfV0hfTV9NIDsKKwkJCVJTX1NFVChzbWMsUlNfRVZFTlQpIDsKKwkJfQorCQllbHNlIGlmIChwaHktPnRfdmFsWzNdIHx8IHBoeS0+cl92YWxbM10pIHsKKwkJCW1pYi0+ZmRkaVBPUlRQQ19XaXRoaG9sZCA9IFBDX1dIX05PTkUgOworCQkJaWYgKG1pYi0+ZmRkaVBPUlRNeV9UeXBlID09IFRNIHx8CisJCQkgICAgbWliLT5mZGRpUE9SVE5laWdoYm9yVHlwZSA9PSBUTSkKKwkJCQlwaHktPnBjX21vZGUgPSBQTV9UUkVFIDsKKwkJCWVsc2UKKwkJCQlwaHktPnBjX21vZGUgPSBQTV9QRUVSIDsKKworCQkJLyogcmVldmFsdWF0ZSB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhICh3Y19mbGFnKSAqLworCQkJYWxsX3NlbGVjdGlvbl9jcml0ZXJpYSAoc21jKTsKKworCQkJaWYgKHBoeS0+d2NfZmxhZykgeworCQkJCW1pYi0+ZmRkaVBPUlRQQ19XaXRoaG9sZCA9IFBDX1dIX1BBVEggOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJbWliLT5mZGRpUE9SVFBDX1dpdGhob2xkID0gUENfV0hfT1RIRVIgOworCQkJUlNfU0VUKHNtYyxSU19FVkVOVCkgOworCQkJREJfUENNTigxLCJQQ00gJWMgOiBFMTAxIHdpdGhob2xkIG90aGVyXG4iLAorCQkJCXBoeS0+cGh5X25hbWUsMCkgOworCQl9CisJCXBoeS0+dHdpc3RlZCA9ICgobWliLT5mZGRpUE9SVE15X1R5cGUgIT0gVFMpICYmCisJCQkJKG1pYi0+ZmRkaVBPUlRNeV9UeXBlICE9IFRNKSAmJgorCQkJCShtaWItPmZkZGlQT1JUTmVpZ2hib3JUeXBlID09CisJCQkJbWliLT5mZGRpUE9SVE15X1R5cGUpKSA7CisJCWlmIChwaHktPnR3aXN0ZWQpIHsKKwkJCURCX1BDTU4oMSwiUENNICVjIDogRTEwMiAhISEgVFdJU1RFRCAhISFcbiIsCisJCQkJcGh5LT5waHlfbmFtZSwwKSA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgNSA6CisJCWJyZWFrIDsKKwljYXNlIDY6CisJCWlmIChwaHktPnRfdmFsWzRdIHx8IHBoeS0+cl92YWxbNF0pIHsKKwkJCWlmICgocGh5LT50X3ZhbFs0XSAmJiBwaHktPnRfdmFsWzVdKSB8fAorCQkJICAgIChwaHktPnJfdmFsWzRdICYmIHBoeS0+cl92YWxbNV0pICkKKwkJCQlwaHktPmxjX3Rlc3QgPSBMQ19FWFRFTkRFRCA7CisJCQllbHNlCisJCQkJcGh5LT5sY190ZXN0ID0gTENfTE9ORyA7CisJCX0KKwkJZWxzZSBpZiAocGh5LT50X3ZhbFs1XSB8fCBwaHktPnJfdmFsWzVdKQorCQkJcGh5LT5sY190ZXN0ID0gTENfTUVESVVNIDsKKwkJZWxzZQorCQkJcGh5LT5sY190ZXN0ID0gTENfU0hPUlQgOworCQlzd2l0Y2ggKHBoeS0+bGNfdGVzdCkgeworCQljYXNlIExDX1NIT1JUIDoJCQkJLyogNTBtcyAqLworCQkJb3V0cHcoUExDKChpbnQpcGh5LT5ucCxQTF9MQ19MRU5HVEgpLCBUUF9MQ19MRU5HVEggKSA7CisJCQlwaHktPnRfbmV4dFs3XSA9IHNtYy0+cy5wY21fbGNfc2hvcnQgOworCQkJYnJlYWsgOworCQljYXNlIExDX01FRElVTSA6CQkJLyogNTAwbXMgKi8KKwkJCW91dHB3KFBMQygoaW50KXBoeS0+bnAsUExfTENfTEVOR1RIKSwgVFBfTENfTE9OR0xOICkgOworCQkJcGh5LT50X25leHRbN10gPSBzbWMtPnMucGNtX2xjX21lZGl1bSA7CisJCQlicmVhayA7CisJCWNhc2UgTENfTE9ORyA6CisJCQlTRVRNQVNLKFBMQygoaW50KXBoeS0+bnAsUExfQ05UUkxfQiksUExfTE9ORyxQTF9MT05HKSA7CisJCQlwaHktPnRfbmV4dFs3XSA9IHNtYy0+cy5wY21fbGNfbG9uZyA7CisJCQlicmVhayA7CisJCWNhc2UgTENfRVhURU5ERUQgOgorCQkJU0VUTUFTSyhQTEMoKGludClwaHktPm5wLFBMX0NOVFJMX0IpLFBMX0xPTkcsUExfTE9ORykgOworCQkJcGh5LT50X25leHRbN10gPSBzbWMtPnMucGNtX2xjX2V4dGVuZGVkIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlpZiAocGh5LT50X25leHRbN10gPiBzbWMtPnMucGNtX2xjX21lZGl1bSkgeworCQkJc3RhcnRfcGNtX3RpbWVyMChzbWMscGh5LT50X25leHRbN10sUENfVElNRU9VVF9MQ1QscGh5KTsKKwkJfQorCQlEQl9QQ01OKDEsIkxDVCB0aW1lciA9ICVsZCB1c1xuIiwgcGh5LT50X25leHRbN10sIDApIDsKKwkJcGh5LT50X25leHRbOV0gPSBzbWMtPnMucGNtX3RfbmV4dF85IDsKKwkJYnJlYWsgOworCWNhc2UgNzoKKwkJaWYgKHBoeS0+dF92YWxbNl0pIHsKKwkJCXBoeS0+Y2ZfbG9vcCA9IFRSVUUgOworCQl9CisJCXBoeS0+dGRfZmxhZyA9IFRSVUUgOworCQlicmVhayA7CisJY2FzZSA4OgorCQlpZiAocGh5LT50X3ZhbFs3XSB8fCBwaHktPnJfdmFsWzddKSB7CisJCQlEQl9QQ01OKDEsIlBDTSAlYyA6IEUxMDMgTENUIGZhaWwgJXNcbiIsCisJCQkJcGh5LT5waHlfbmFtZSxwaHktPnRfdmFsWzddPyAibG9jYWwiOiJyZW1vdGUiKSA7CisJCQlxdWV1ZV9ldmVudChzbWMsKGludCkoRVZFTlRfUENNK3BoeS0+bnApLFBDX1NUQVJUKSA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgOToKKwkJaWYgKHBoeS0+dF92YWxbOF0gfHwgcGh5LT5yX3ZhbFs4XSkgeworCQkJaWYgKHBoeS0+dF92YWxbOF0pCisJCQkJcGh5LT5jZl9sb29wID0gVFJVRSA7CisJCQlwaHktPnRkX2ZsYWcgPSBUUlVFIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSAxMDoKKwkJaWYgKHBoeS0+cl92YWxbOV0pIHsKKwkJCS8qIG5laWdoYm9yIGludGVuZHMgdG8gaGF2ZSBNQUMgb24gb3V0cHV0ICovIDsKKwkJCW1pYi0+ZmRkaVBPUlRNYWNJbmRpY2F0ZWQuUl92YWwgPSBUUlVFIDsKKwkJfQorCQllbHNlIHsKKwkJCS8qIG5laWdoYm9yIGRvZXMgbm90IGludGVuZCB0byBoYXZlIE1BQyBvbiBvdXRwdXQgKi8gOworCQkJbWliLT5mZGRpUE9SVE1hY0luZGljYXRlZC5SX3ZhbCA9IEZBTFNFIDsKKwkJfQorCQlicmVhayA7CisJfQorfQorCisvKgorICogUENNIHBzZXVkbyBjb2RlIDUuMSAuLiA2LjEKKyAqLworc3RhdGljIHZvaWQgcGNfdGNvZGVfYWN0aW9ucyhzdHJ1Y3Qgc19zbWMgKnNtYywgY29uc3QgaW50IGJpdCwgc3RydWN0IHNfcGh5ICpwaHkpCit7CisJaW50CW5wID0gcGh5LT5ucCA7CisJc3RydWN0IGZkZGlfbWliX3AJKm1pYiA7CisKKwltaWIgPSBwaHktPm1pYiA7CisKKwlzd2l0Y2goYml0KSB7CisJY2FzZSAwOgorCQlwaHktPnRfdmFsWzBdID0gMCA7CQkvKiBubyBlc2NhcGUgdXNlZCAqLworCQlicmVhayA7CisJY2FzZSAxOgorCQlpZiAobWliLT5mZGRpUE9SVE15X1R5cGUgPT0gVFMgfHwgbWliLT5mZGRpUE9SVE15X1R5cGUgPT0gVE0pCisJCQlwaHktPnRfdmFsWzFdID0gMSA7CisJCWVsc2UKKwkJCXBoeS0+dF92YWxbMV0gPSAwIDsKKwkJYnJlYWsgOworCWNhc2UgMiA6CisJCWlmIChtaWItPmZkZGlQT1JUTXlfVHlwZSA9PSBUQiB8fCBtaWItPmZkZGlQT1JUTXlfVHlwZSA9PSBUTSkKKwkJCXBoeS0+dF92YWxbMl0gPSAxIDsKKwkJZWxzZQorCQkJcGh5LT50X3ZhbFsyXSA9IDAgOworCQlicmVhayA7CisJY2FzZSAzOgorCQl7CisJCWludAl0eXBlLG5lIDsKKwkJaW50CXBvbGljeSA7CisKKwkJdHlwZSA9IG1pYi0+ZmRkaVBPUlRNeV9UeXBlIDsKKwkJbmUgPSBtaWItPmZkZGlQT1JUTmVpZ2hib3JUeXBlIDsKKwkJcG9saWN5ID0gc21jLT5taWIuZmRkaVNNVENvbm5lY3Rpb25Qb2xpY3kgOworCisJCXBoeS0+dF92YWxbM10gPSAxIDsJLyogQWNjZXB0IGNvbm5lY3Rpb24gKi8KKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgVEEgOgorCQkJaWYgKAorCQkJCSgocG9saWN5ICYgUE9MSUNZX0FBKSAmJiBuZSA9PSBUQSkgfHwKKwkJCQkoKHBvbGljeSAmIFBPTElDWV9BQikgJiYgbmUgPT0gVEIpIHx8CisJCQkJKChwb2xpY3kgJiBQT0xJQ1lfQVMpICYmIG5lID09IFRTKSB8fAorCQkJCSgocG9saWN5ICYgUE9MSUNZX0FNKSAmJiBuZSA9PSBUTSkgKQorCQkJCXBoeS0+dF92YWxbM10gPSAwIDsJLyogUmVqZWN0ICovCisJCQlicmVhayA7CisJCWNhc2UgVEIgOgorCQkJaWYgKAorCQkJCSgocG9saWN5ICYgUE9MSUNZX0JBKSAmJiBuZSA9PSBUQSkgfHwKKwkJCQkoKHBvbGljeSAmIFBPTElDWV9CQikgJiYgbmUgPT0gVEIpIHx8CisJCQkJKChwb2xpY3kgJiBQT0xJQ1lfQlMpICYmIG5lID09IFRTKSB8fAorCQkJCSgocG9saWN5ICYgUE9MSUNZX0JNKSAmJiBuZSA9PSBUTSkgKQorCQkJCXBoeS0+dF92YWxbM10gPSAwIDsJLyogUmVqZWN0ICovCisJCQlicmVhayA7CisJCWNhc2UgVFMgOgorCQkJaWYgKAorCQkJCSgocG9saWN5ICYgUE9MSUNZX1NBKSAmJiBuZSA9PSBUQSkgfHwKKwkJCQkoKHBvbGljeSAmIFBPTElDWV9TQikgJiYgbmUgPT0gVEIpIHx8CisJCQkJKChwb2xpY3kgJiBQT0xJQ1lfU1MpICYmIG5lID09IFRTKSB8fAorCQkJCSgocG9saWN5ICYgUE9MSUNZX1NNKSAmJiBuZSA9PSBUTSkgKQorCQkJCXBoeS0+dF92YWxbM10gPSAwIDsJLyogUmVqZWN0ICovCisJCQlicmVhayA7CisJCWNhc2UgVE0gOgorCQkJaWYgKAluZSA9PSBUTSB8fAorCQkJCSgocG9saWN5ICYgUE9MSUNZX01BKSAmJiBuZSA9PSBUQSkgfHwKKwkJCQkoKHBvbGljeSAmIFBPTElDWV9NQikgJiYgbmUgPT0gVEIpIHx8CisJCQkJKChwb2xpY3kgJiBQT0xJQ1lfTVMpICYmIG5lID09IFRTKSB8fAorCQkJCSgocG9saWN5ICYgUE9MSUNZX01NKSAmJiBuZSA9PSBUTSkgKQorCQkJCXBoeS0+dF92YWxbM10gPSAwIDsJLyogUmVqZWN0ICovCisJCQlicmVhayA7CisJCX0KKyNpZm5kZWYJU0xJTV9TTVQKKwkJLyoKKwkJICogZGV0ZWN0IHVuZGVzaXJhYmxlIGNvbm5lY3Rpb24gYXR0ZW1wdCBldmVudAorCQkgKi8KKwkJaWYgKAkodHlwZSA9PSBUQSAmJiBuZSA9PSBUQSApIHx8CisJCQkodHlwZSA9PSBUQSAmJiBuZSA9PSBUUyApIHx8CisJCQkodHlwZSA9PSBUQiAmJiBuZSA9PSBUQiApIHx8CisJCQkodHlwZSA9PSBUQiAmJiBuZSA9PSBUUyApIHx8CisJCQkodHlwZSA9PSBUUyAmJiBuZSA9PSBUQSApIHx8CisJCQkodHlwZSA9PSBUUyAmJiBuZSA9PSBUQiApICkgeworCQkJc210X3NyZl9ldmVudChzbWMsU01UX0VWRU5UX1BPUlRfQ09OTkVDVElPTiwKKwkJCQkoaW50KSAoSU5ERVhfUE9SVCsgcGh5LT5ucCkgLDApIDsKKwkJfQorI2VuZGlmCisJCX0KKwkJYnJlYWsgOworCWNhc2UgNDoKKwkJaWYgKG1pYi0+ZmRkaVBPUlRQQ19XaXRoaG9sZCA9PSBQQ19XSF9OT05FKSB7CisJCQlpZiAocGh5LT5wY19sZW1fZmFpbCkgeworCQkJCXBoeS0+dF92YWxbNF0gPSAxIDsJLyogbG9uZyAqLworCQkJCXBoeS0+dF92YWxbNV0gPSAwIDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBoeS0+dF92YWxbNF0gPSAwIDsKKwkJCQlpZiAobWliLT5mZGRpUE9SVExDVEZhaWxfQ3QgPiAwKQorCQkJCQlwaHktPnRfdmFsWzVdID0gMSA7CS8qIG1lZGl1bSAqLworCQkJCWVsc2UKKwkJCQkJcGh5LT50X3ZhbFs1XSA9IDAgOwkvKiBzaG9ydCAqLworCisJCQkJLyoKKwkJCQkgKiBJbXBsZW1lbnRlcnMgY2hvaWNlOiB1c2UgbWVkaXVtCisJCQkJICogaW5zdGVhZCBvZiBzaG9ydCB3aGVuIHVuZGVzaXJlZAorCQkJCSAqIGNvbm5lY3Rpb24gYXR0ZW1wdCBpcyBtYWRlLgorCQkJCSAqLworCQkJCWlmIChwaHktPndjX2ZsYWcpCisJCQkJCXBoeS0+dF92YWxbNV0gPSAxIDsJLyogbWVkaXVtICovCisJCQl9CisJCQltaWItPmZkZGlQT1JUQ29ubmVjdFN0YXRlID0gUENNX0NPTk5FQ1RJTkcgOworCQl9CisJCWVsc2UgeworCQkJbWliLT5mZGRpUE9SVENvbm5lY3RTdGF0ZSA9IFBDTV9TVEFOREJZIDsKKwkJCXBoeS0+dF92YWxbNF0gPSAxIDsJLyogZXh0ZW5kZWQgKi8KKwkJCXBoeS0+dF92YWxbNV0gPSAxIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSA1OgorCQlicmVhayA7CisJY2FzZSA2OgorCQkvKiB3ZSBkbyBOT1QgaGF2ZSBhIE1BQyBmb3IgTENUICovCisJCXBoeS0+dF92YWxbNl0gPSAwIDsKKwkJYnJlYWsgOworCWNhc2UgNzoKKwkJcGh5LT5jZl9sb29wID0gRkFMU0UgOworCQlsZW1fY2hlY2tfbGN0KHNtYyxwaHkpIDsKKwkJaWYgKHBoeS0+cGNfbGVtX2ZhaWwpIHsKKwkJCURCX1BDTU4oMSwiUENNICVjIDogRTEwNCBMQ1QgZmFpbGVkXG4iLAorCQkJCXBoeS0+cGh5X25hbWUsMCkgOworCQkJcGh5LT50X3ZhbFs3XSA9IDEgOworCQl9CisJCWVsc2UKKwkJCXBoeS0+dF92YWxbN10gPSAwIDsKKwkJYnJlYWsgOworCWNhc2UgODoKKwkJcGh5LT50X3ZhbFs4XSA9IDAgOwkvKiBEb24ndCByZXF1ZXN0IE1BQyBsb29wYmFjayAqLworCQlicmVhayA7CisJY2FzZSA5OgorCQlwaHktPmNmX2xvb3AgPSAwIDsKKwkJaWYgKChtaWItPmZkZGlQT1JUUENfV2l0aGhvbGQgIT0gUENfV0hfTk9ORSkgfHwKKwkJICAgICAoKHNtYy0+cy5zYXMgPT0gU01UX0RBUykgJiYgKHBoeS0+d2NfZmxhZykpKSB7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNK25wLFBDX1NUQVJUKSA7CisJCQlicmVhayA7CisJCX0KKwkJcGh5LT50X3ZhbFs5XSA9IEZBTFNFIDsKKwkJc3dpdGNoIChzbWMtPnMuc2FzKSB7CisJCWNhc2UgU01UX0RBUyA6CisJCQkvKgorCQkJICogTUFDIGludGVuZGVkIG9uIG91dHB1dAorCQkJICovCisJCQlpZiAocGh5LT5wY19tb2RlID09IFBNX1RSRUUpIHsKKwkJCQlpZiAoKG5wID09IFBCKSB8fCAoKG5wID09IFBBKSAmJgorCQkJCShzbWMtPnlbUEJdLm1pYi0+ZmRkaVBPUlRDb25uZWN0U3RhdGUgIT0KKwkJCQkJUENNX0FDVElWRSkpKQorCQkJCQlwaHktPnRfdmFsWzldID0gVFJVRSA7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAobnAgPT0gUEIpCisJCQkJCXBoeS0+dF92YWxbOV0gPSBUUlVFIDsKKwkJCX0KKwkJCWJyZWFrIDsKKwkJY2FzZSBTTVRfU0FTIDoKKwkJCWlmIChucCA9PSBQUykKKwkJCQlwaHktPnRfdmFsWzldID0gVFJVRSA7CisJCQlicmVhayA7CisjaWZkZWYJQ09OQ0VOVFJBVE9SCisJCWNhc2UgU01UX05BQyA6CisJCQkvKgorCQkJICogTUFDIGludGVuZGVkIG9uIG91dHB1dAorCQkJICovCisJCQlpZiAobnAgPT0gUEIpCisJCQkJcGh5LT50X3ZhbFs5XSA9IFRSVUUgOworCQkJYnJlYWsgOworI2VuZGlmCisJCX0KKwkJbWliLT5mZGRpUE9SVE1hY0luZGljYXRlZC5UX3ZhbCA9IHBoeS0+dF92YWxbOV0gOworCQlicmVhayA7CisJfQorCURCX1BDTU4oMSwiU0lHIHNuZCAleCAleDogXG4iLCBiaXQscGh5LT50X3ZhbFtiaXRdICkgOworfQorCisvKgorICogcmV0dXJuIHN0YXR1cyB0d2lzdGVkIChjYWxsZWQgYnkgU01UKQorICovCitpbnQgcGNtX3N0YXR1c190d2lzdGVkKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWludAl0d2lzdCA9IDAgOworCWlmIChzbWMtPnMuc2FzICE9IFNNVF9EQVMpCisJCXJldHVybigwKSA7CisJaWYgKHNtYy0+eVtQQV0udHdpc3RlZCAmJiAoc21jLT55W1BBXS5taWItPmZkZGlQT1JUUENNU3RhdGUgPT0gUEM4X0FDVElWRSkpCisJCXR3aXN0IHw9IDEgOworCWlmIChzbWMtPnlbUEJdLnR3aXN0ZWQgJiYgKHNtYy0+eVtQQl0ubWliLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDOF9BQ1RJVkUpKQorCQl0d2lzdCB8PSAyIDsKKwlyZXR1cm4odHdpc3QpIDsKK30KKworLyoKKyAqIHJldHVybiBzdGF0dXMJKGNhbGxlZCBieSBTTVQpCisgKgl0eXBlCisgKglzdGF0ZQorICoJcmVtb3RlIHBoeSB0eXBlCisgKglyZW1vdGUgbWFjIHllcy9ubworICovCit2b2lkIHBjbV9zdGF0dXNfc3RhdGUoc3RydWN0IHNfc21jICpzbWMsIGludCBucCwgaW50ICp0eXBlLCBpbnQgKnN0YXRlLAorCQkgICAgICBpbnQgKnJlbW90ZSwgaW50ICptYWMpCit7CisJc3RydWN0IHNfcGh5CSpwaHkgPSAmc21jLT55W25wXSA7CisJc3RydWN0IGZkZGlfbWliX3AJKm1pYiA7CisKKwltaWIgPSBwaHktPm1pYiA7CisKKwkvKiByZW1vdGUgUEhZIHR5cGUgYW5kIE1BQyAtIHNldCBvbmx5IGlmIGFjdGl2ZSAqLworCSptYWMgPSAwIDsKKwkqdHlwZSA9IG1pYi0+ZmRkaVBPUlRNeV9UeXBlIDsJCS8qIG91ciBQSFkgdHlwZSAqLworCSpzdGF0ZSA9IG1pYi0+ZmRkaVBPUlRDb25uZWN0U3RhdGUgOworCSpyZW1vdGUgPSBtaWItPmZkZGlQT1JUTmVpZ2hib3JUeXBlIDsKKworCXN3aXRjaChtaWItPmZkZGlQT1JUUENNU3RhdGUpIHsKKwljYXNlIFBDOF9BQ1RJVkUgOgorCQkqbWFjID0gbWliLT5mZGRpUE9SVE1hY0luZGljYXRlZC5SX3ZhbCA7CisJCWJyZWFrIDsKKwl9Cit9CisKKy8qCisgKiByZXR1cm4gcm9vdGVkIHN0YXRpb24gc3RhdHVzIChjYWxsZWQgYnkgU01UKQorICovCitpbnQgcGNtX3Jvb3RlZF9zdGF0aW9uKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWludAluIDsKKworCWZvciAobiA9IDAgOyBuIDwgTlVNUEhZUyA7IG4rKykgeworCQlpZiAoc21jLT55W25dLm1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSA9PSBQQzhfQUNUSVZFICYmCisJCSAgICBzbWMtPnlbbl0ubWliLT5mZGRpUE9SVE5laWdoYm9yVHlwZSA9PSBUTSkKKwkJCXJldHVybigwKSA7CisJfQorCXJldHVybigxKSA7Cit9CisKKy8qCisgKiBJbnRlcnJ1cHQgYWN0aW9ucyBmb3IgUExDICYgUENNIGV2ZW50cworICovCit2b2lkIHBsY19pcnEoc3RydWN0IHNfc21jICpzbWMsIGludCBucCwgdW5zaWduZWQgaW50IGNtZCkKKy8qIGludCBucDsJUEhZIGluZGV4ICovCit7CisJc3RydWN0IHNfcGh5ICpwaHkgPSAmc21jLT55W25wXSA7CisJc3RydWN0IHNfcGxjICpwbGMgPSAmcGh5LT5wbGMgOworCWludAkJbiA7CisjaWZkZWYJU1VQRVJORVRfMworCWludAkJY29ycl9tYXNrIDsKKyNlbmRpZgkvKiBTVVBFUk5FVF8zICovCisJaW50CQlpIDsKKworCWlmIChucCA+PSBzbWMtPnMubnVtcGh5cykgeworCQlwbGMtPnNvZnRfZXJyKysgOworCQlyZXR1cm4gOworCX0KKwlpZiAoY21kICYgUExfRUJVRl9FUlIpIHsJLyogZWxhc3RpYyBidWZmLiBkZXQuIG92ZXItfHVuZGVyZmxvdyovCisJCS8qCisJCSAqIENoZWNrIHdoZXRoZXIgdGhlIFNSRiBDb25kaXRpb24gb2NjdXJyZWQuCisJCSAqLworCQlpZiAoIXBsYy0+ZWJ1Zl9jb250ICYmIHBoeS0+bWliLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDOF9BQ1RJVkUpeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgdGhlIHJlYWwgRWxhc3RpY2l0eSBFcnJvci4KKwkJCSAqIE1vcmUgdGhhbiBvbmUgaW4gYSByb3cgYXJlIHRyZWF0ZWQgYXMgYQorCQkJICogc2luZ2xlIG9uZS4KKwkJCSAqIE9ubHkgY291bnQgdGhpcyBpbiB0aGUgYWN0aXZlIHN0YXRlLgorCQkJICovCisJCQlwaHktPm1pYi0+ZmRkaVBPUlRFQkVycm9yX0N0ICsrIDsKKworCQl9CisKKwkJcGxjLT5lYnVmX2VycisrIDsKKwkJaWYgKHBsYy0+ZWJ1Zl9jb250IDw9IDEwMDApIHsKKwkJCS8qCisJCQkgKiBQcmV2ZW50IGNvdW50ZXIgZnJvbSBiZWluZyB3cmFwcGVkIGFmdGVyCisJCQkgKiBoYW5naW5nIHllYXJzIGluIHRoYXQgaW50ZXJydXB0LgorCQkJICovCisJCQlwbGMtPmVidWZfY29udCsrIDsJLyogRWJ1ZiBjb250aW5vdXMgZXJyb3IgKi8KKwkJfQorCisjaWZkZWYJU1VQRVJORVRfMworCQlpZiAocGxjLT5lYnVmX2NvbnQgPT0gMTAwMCAmJgorCQkJKChpbnB3KFBMQyhucCxQTF9TVEFUVVNfQSkpICYgUExDX1JFVl9NQVNLKSA9PQorCQkJUExDX1JFVl9TTjMpKSB7CisJCQkvKgorCQkJICogVGhpcyBpbnRlcnJ1cHQgcmVtZWFpbmVkIGhpZ2ggZm9yIGF0IGxlYXN0CisJCQkgKiAxMDAwIGNvbnNlY3V0aXZlIGludGVycnVwdCBjYWxscy4KKwkJCSAqCisJCQkgKiBUaGlzIGlzIGNhdXNlZCBieSBhIGhhcmR3YXJlIGVycm9yIG9mIHRoZQorCQkJICogT1JJT04gcGFydCBvZiB0aGUgU3VwZXJuZXQgSUlJIGNoaXBzZXQuCisJCQkgKgorCQkJICogRGlzYWJsZSB0aGlzIGJpdCBmcm9tIHRoZSBtYXNrLgorCQkJICovCisJCQljb3JyX21hc2sgPSAocGxjX2ltc2tfbmEgJiB+UExfRUJVRl9FUlIpIDsKKwkJCW91dHB3KFBMQyhucCxQTF9JTlRSX01BU0spLGNvcnJfbWFzayk7CisKKwkJCS8qCisJCQkgKiBEaXNjb25uZWN0IGZyb20gdGhlIHJpbmcuCisJCQkgKiBDYWxsIHRoZSBkcml2ZXIgd2l0aCB0aGUgcmVzZXQgaW5kaWNhdGlvbi4KKwkJCSAqLworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX0VDTSxFQ19ESVNDT05ORUNUKSA7CisKKwkJCS8qCisJCQkgKiBNYWtlIGFuIGVycm9yIGxvZyBlbnRyeS4KKwkJCSAqLworCQkJU01UX0VSUl9MT0coc21jLFNNVF9FMDEzNiwgU01UX0UwMTM2X01TRykgOworCisJCQkvKgorCQkJICogSW5kaWNhdGUgdGhlIFJlc2V0LgorCQkJICovCisJCQlkcnZfcmVzZXRfaW5kaWNhdGlvbihzbWMpIDsKKwkJfQorI2VuZGlmCS8qIFNVUEVSTkVUXzMgKi8KKwl9IGVsc2UgeworCQkvKiBSZXNldCB0aGUgY29udGlub3VzIGVycm9yIHZhcmlhYmxlICovCisJCXBsYy0+ZWJ1Zl9jb250ID0gMCA7CS8qIHJlc2V0IEVidWYgY29udGlub3VzIGVycm9yICovCisJfQorCWlmIChjbWQgJiBQTF9QSFlJTlYpIHsJCS8qIHBoeXNpY2FsIGxheWVyIGludmFsaWQgc2lnbmFsICovCisJCXBsYy0+cGh5aW52KysgOworCX0KKwlpZiAoY21kICYgUExfVlNZTV9DVFIpIHsJLyogdmlvbGF0aW9uIHN5bWJvbCBjb3VudGVyIGhhcyBpbmNyLiovCisJCXBsYy0+dnN5bV9jdHIrKyA7CisJfQorCWlmIChjbWQgJiBQTF9NSU5JX0NUUikgewkvKiBkZXAuIG9uIFBMQ19DTlRSTF9BJ3MgTUlOSV9DVFJfSU5UKi8KKwkJcGxjLT5taW5pX2N0cisrIDsKKwl9CisJaWYgKGNtZCAmIFBMX0xFX0NUUikgewkJLyogbGluayBlcnJvciBldmVudCBjb3VudGVyICovCisJCWludAlqIDsKKworCQkvKgorCQkgKiBub3RlOiBQTF9MSU5LX0VSUl9DVFIgTVVTVCBiZSByZWFkIHRvIGNsZWFyIGl0CisJCSAqLworCQlqID0gaW5wdyhQTEMobnAsUExfTEVfVEhSRVNIT0xEKSkgOworCQlpID0gaW5wdyhQTEMobnAsUExfTElOS19FUlJfQ1RSKSkgOworCisJCWlmIChpIDwgaikgeworCQkJLyogd3JhcHBlZCBhcm91bmQgKi8KKwkJCWkgKz0gMjU2IDsKKwkJfQorCisJCWlmIChwaHktPmxlbS5sZW1fb24pIHsKKwkJCS8qIE5vdGU6IExlbSBlcnJvcnMgc2hhbGwgb25seSBiZSBjb3VudGVkIHdoZW4KKwkJCSAqIGxpbmsgaXMgQUNUSVZFIG9yIExDVCBpcyBhY3RpdmUuCisJCQkgKi8KKwkJCXBoeS0+bGVtLmxlbV9lcnJvcnMgKz0gaSA7CisJCQlwaHktPm1pYi0+ZmRkaVBPUlRMZW1fQ3QgKz0gaSA7CisJCX0KKwl9CisJaWYgKGNtZCAmIFBMX1RQQ19FWFBJUkVEKSB7CS8qIFRQQyB0aW1lciByZWFjaGVkIHplcm8gKi8KKwkJaWYgKHBsYy0+cF9zdGF0ZSA9PSBQU19MQ1QpIHsKKwkJCS8qCisJCQkgKiBlbmQgb2YgTENUCisJCQkgKi8KKwkJCTsKKwkJfQorCQlwbGMtPnRwY19leHArKyA7CisJfQorCWlmIChjbWQgJiBQTF9MU19NQVRDSCkgewkvKiBMUyA9PSBMUyBpbiBQTENfQ05UUkxfQidzIE1BVENIX0xTKi8KKwkJc3dpdGNoIChpbnB3KFBMQyhucCxQTF9DTlRSTF9CKSkgJiBQTF9NQVRDSF9MUykgeworCQljYXNlIFBMX0lfSURMRSA6CXBoeS0+Y3Vycl9scyA9IFBDX0lMUyA7CQlicmVhayA7CisJCWNhc2UgUExfSV9IQUxUIDoJcGh5LT5jdXJyX2xzID0gUENfSExTIDsJCWJyZWFrIDsKKwkJY2FzZSBQTF9JX01BU1RSIDoJcGh5LT5jdXJyX2xzID0gUENfTUxTIDsJCWJyZWFrIDsKKwkJY2FzZSBQTF9JX1FVSUVUIDoJcGh5LT5jdXJyX2xzID0gUENfUUxTIDsJCWJyZWFrIDsKKwkJfQorCX0KKwlpZiAoY21kICYgUExfUENNX0JSRUFLKSB7CS8qIFBDTSBoYXMgZW50ZXJlZCB0aGUgQlJFQUsgc3RhdGUgKi8KKwkJaW50CXJlYXNvbjsKKworCQlyZWFzb24gPSBpbnB3KFBMQyhucCxQTF9TVEFUVVNfQikpICYgUExfQlJFQUtfUkVBU09OIDsKKworCQlzd2l0Y2ggKHJlYXNvbikgeworCQljYXNlIFBMX0JfUENTIDoJCXBsYy0+Yl9wY3MrKyA7CWJyZWFrIDsKKwkJY2FzZSBQTF9CX1RQQyA6CQlwbGMtPmJfdHBjKysgOwlicmVhayA7CisJCWNhc2UgUExfQl9UTkUgOgkJcGxjLT5iX3RuZSsrIDsJYnJlYWsgOworCQljYXNlIFBMX0JfUUxTIDoJCXBsYy0+Yl9xbHMrKyA7CWJyZWFrIDsKKwkJY2FzZSBQTF9CX0lMUyA6CQlwbGMtPmJfaWxzKysgOwlicmVhayA7CisJCWNhc2UgUExfQl9ITFMgOgkJcGxjLT5iX2hscysrIDsJYnJlYWsgOworCQl9CisKKwkJLypqZCAwNS1BdWctMTk5OSBjaGFuZ2VkOiBCdWcgIzEwNDE5ICovCisJCURCX1BDTU4oMSwiUExDICVkOiBNRGNGID0gJXhcbiIsIG5wLCBzbWMtPmUuRGlzY29ubmVjdEZsYWcpOworCQlpZiAoc21jLT5lLkRpc2Nvbm5lY3RGbGFnID09IEZBTFNFKSB7CisJCQlEQl9QQ01OKDEsIlBMQyAlZDogcmVzdGFydCAocmVhc29uICV4KVxuIiwgbnAsIHJlYXNvbik7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNK25wLFBDX1NUQVJUKSA7CisJCX0KKwkJZWxzZSB7CisJCQlEQl9QQ01OKDEsIlBMQyAlZDogTk8hISByZXN0YXJ0IChyZWFzb24gJXgpXG4iLCBucCwgcmVhc29uKTsKKwkJfQorCQlyZXR1cm4gOworCX0KKwkvKgorCSAqIElmIGJvdGggQ09ERSAmIEVOQUJMRSBhcmUgc2V0IGlnbm9yZSBlbmFibGUKKwkgKi8KKwlpZiAoY21kICYgUExfUENNX0NPREUpIHsgLyogcmVjZWl2ZSBsYXN0IHNpZ24uLWJpdCB8IExDVCBjb21wbGV0ZSAqLworCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNK25wLFBDX1NJR05BTCkgOworCQluID0gaW5wdyhQTEMobnAsUExfUkNWX1ZFQ1RPUikpIDsKKwkJZm9yIChpID0gMCA7IGkgPCBwbGMtPnBfYml0cyA7IGkrKykgeworCQkJcGh5LT5yX3ZhbFtwbGMtPnBfc3RhcnQraV0gPSBuICYgMSA7CisJCQluID4+PSAxIDsKKwkJfQorCX0KKwllbHNlIGlmIChjbWQgJiBQTF9QQ01fRU5BQkxFRCkgeyAvKiBhc3NlcnRlZCBTQ19KT0lOLCBzY3J1Yi5jb21wbGV0ZWQqLworCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNK25wLFBDX0pPSU4pIDsKKwl9CisJaWYgKGNtZCAmIFBMX1RSQUNFX1BST1ApIHsJLyogTUxTIHdoaWxlIFBDOF9BQ1RJViB8fCBQQzJfVFJBQ0UgKi8KKwkJLypQQzIyYiovCisJCWlmICghcGh5LT50cl9mbGFnKSB7CisJCQlEQl9QQ01OKDEsIlBDTSA6IGlycSBUUkFDRV9QUk9QICVkICVkXG4iLAorCQkJCW5wLHNtYy0+bWliLmZkZGlTTVRFQ01TdGF0ZSkgOworCQkJcGh5LT50cl9mbGFnID0gVFJVRSA7CisJCQlzbWMtPmUudHJhY2VfcHJvcCB8PSBFTlRJVFlfQklUKEVOVElUWV9QSFkobnApKSA7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfRUNNLEVDX1RSQUNFX1BST1ApIDsKKwkJfQorCX0KKwkvKgorCSAqIGZpbHRlciBQTEMgZ2xpdGNoID8/PworCSAqIFFMUyB8fCBITFMgb25seSB3aGlsZSBpbiBQQzJfVFJBQ0Ugc3RhdGUKKwkgKi8KKwlpZiAoKGNtZCAmIFBMX1NFTEZfVEVTVCkgJiYgKHBoeS0+bWliLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDMl9UUkFDRSkpIHsKKwkJLypQQzIyYSovCisJCWlmIChzbWMtPmUucGF0aF90ZXN0ID09IFBUX1BBU1NFRCkgeworCQkJREJfUENNTigxLCJQQ00gOiBzdGF0ZSA9ICVzICVkXG4iLCBnZXRfcGNtc3RhdGUoc21jLG5wKSwKKwkJCQlwaHktPm1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSkgOworCisJCQlzbWMtPmUucGF0aF90ZXN0ID0gUFRfUEVORElORyA7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfRUNNLEVDX1BBVEhfVEVTVCkgOworCQl9CisJfQorCWlmIChjbWQgJiBQTF9UTkVfRVhQSVJFRCkgewkvKiBUTkU6IGxlbmd0aCBvZiBub2lzZSBldmVudHMgKi8KKwkJLyogYnJlYWtfcmVxdWlyZWQgKFRORSA+IE5TX01heCkgKi8KKwkJaWYgKHBoeS0+bWliLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDOF9BQ1RJVkUpIHsKKwkJCWlmICghcGh5LT50cl9mbGFnKSB7CisJCQkgICBEQl9QQ01OKDEsIlBDTSAlYyA6IFBDODEgJXNcbiIscGh5LT5waHlfbmFtZSwiTlNFIik7CisJCQkgICBxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNK25wLFBDX1NUQVJUKSA7CisJCQkgICByZXR1cm4gOworCQkJfQorCQl9CisJfQorI2lmCTAKKwlpZiAoY21kICYgUExfTlBfRVJSKSB7CQkvKiBOUCBoYXMgcmVxdWVzdGVkIHRvIHIvdyBhbiBpbnYgcmVnKi8KKwkJLyoKKwkJICogSXQncyBhIGJ1ZyBieSBBTUQKKwkJICovCisJCXBsYy0+bnBfZXJyKysgOworCX0KKwkvKiBwaW4gaW5hY3RpdiAoR05EKSAqLworCWlmIChjbWQgJiBQTF9QQVJJVFlfRVJSKSB7CS8qIHAuIGVycm9yIGRlZGVjdGVkIG9uIFRYOS0wIGlucCAqLworCQlwbGMtPnBhcml0eV9lcnIrKyA7CisJfQorCWlmIChjbWQgJiBQTF9MU0RPKSB7CQkvKiBjYXJyaWVyIGRldGVjdGVkICovCisJCTsKKwl9CisjZW5kaWYKK30KKwordm9pZCBwY21fc2V0X2xjdF9zaG9ydChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG4pCit7CisJaWYgKG4gPD0gMCB8fCBuID4gMTAwMCkKKwkJcmV0dXJuIDsKKwlzbWMtPnMubGN0X3Nob3J0ID0gbiA7Cit9CisKKyNpZmRlZglERUJVRworLyoKKyAqIGZpbGwgc3RhdGUgc3RydWN0CisgKi8KK3ZvaWQgcGNtX2dldF9zdGF0ZShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHNfcGh5CSpwaHkgOworCXN0cnVjdCBwY21fc3RhdGUgKnBjcyA7CisJaW50CWkgOworCWludAlpaSA7CisJc2hvcnQJcmJpdHMgOworCXNob3J0CXRiaXRzIDsKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqbWliIDsKKworCWZvciAoaSA9IDAsIHBoeSA9IHNtYy0+eSwgcGNzID0gc3RhdGUtPnBjbV9zdGF0ZSA7IGkgPCBOVU1QSFlTIDsKKwkJaSsrICwgcGh5KyssIHBjcysrICkgeworCQltaWIgPSBwaHktPm1pYiA7CisJCXBjcy0+cGNtX3R5cGUgPSAodV9jaGFyKSBtaWItPmZkZGlQT1JUTXlfVHlwZSA7CisJCXBjcy0+cGNtX3N0YXRlID0gKHVfY2hhcikgbWliLT5mZGRpUE9SVFBDTVN0YXRlIDsKKwkJcGNzLT5wY21fbW9kZSA9IHBoeS0+cGNfbW9kZSA7CisJCXBjcy0+cGNtX25laWdoYm9yID0gKHVfY2hhcikgbWliLT5mZGRpUE9SVE5laWdoYm9yVHlwZSA7CisJCXBjcy0+cGNtX2JzZiA9IG1pYi0+ZmRkaVBPUlRCU19GbGFnIDsKKwkJcGNzLT5wY21fbHNmID0gcGh5LT5sc19mbGFnIDsKKwkJcGNzLT5wY21fbGN0X2ZhaWwgPSAodV9jaGFyKSBtaWItPmZkZGlQT1JUTENURmFpbF9DdCA7CisJCXBjcy0+cGNtX2xzX3J4ID0gTFMyTUlCKHNtX3BtX2dldF9scyhzbWMsaSkpIDsKKwkJZm9yIChpaSA9IDAsIHJiaXRzID0gdGJpdHMgPSAwIDsgaWkgPCBOVU1CSVRTIDsgaWkrKykgeworCQkJcmJpdHMgPDw9IDEgOworCQkJdGJpdHMgPDw9IDEgOworCQkJaWYgKHBoeS0+cl92YWxbTlVNQklUUy0xLWlpXSkKKwkJCQlyYml0cyB8PSAxIDsKKwkJCWlmIChwaHktPnRfdmFsW05VTUJJVFMtMS1paV0pCisJCQkJdGJpdHMgfD0gMSA7CisJCX0KKwkJcGNzLT5wY21fcl92YWwgPSByYml0cyA7CisJCXBjcy0+cGNtX3RfdmFsID0gdGJpdHMgOworCX0KK30KKworaW50IGdldF9wY21fc3RhdGUoc3RydWN0IHNfc21jICpzbWMsIGludCBucCkKK3sKKwlpbnQgcGNzIDsKKworCVNLX1VOVVNFRChzbWMpIDsKKworCXN3aXRjaCAoaW5wdyhQTEMobnAsUExfU1RBVFVTX0IpKSAmIFBMX1BDTV9TVEFURSkgeworCQljYXNlIFBMX1BDMCA6CXBjcyA9IFBDX1NUT1AgOwkJYnJlYWsgOworCQljYXNlIFBMX1BDMSA6CXBjcyA9IFBDX1NUQVJUIDsJYnJlYWsgOworCQljYXNlIFBMX1BDMiA6CXBjcyA9IFBDX1RSQUNFIDsJYnJlYWsgOworCQljYXNlIFBMX1BDMyA6CXBjcyA9IFBDX1NJR05BTCA7CWJyZWFrIDsKKwkJY2FzZSBQTF9QQzQgOglwY3MgPSBQQ19TSUdOQUwgOwlicmVhayA7CisJCWNhc2UgUExfUEM1IDoJcGNzID0gUENfU0lHTkFMIDsJYnJlYWsgOworCQljYXNlIFBMX1BDNiA6CXBjcyA9IFBDX0pPSU4gOwkJYnJlYWsgOworCQljYXNlIFBMX1BDNyA6CXBjcyA9IFBDX0pPSU4gOwkJYnJlYWsgOworCQljYXNlIFBMX1BDOCA6CXBjcyA9IFBDX0VOQUJMRSA7CWJyZWFrIDsKKwkJY2FzZSBQTF9QQzkgOglwY3MgPSBQQ19NQUlOVCA7CWJyZWFrIDsKKwkJZGVmYXVsdCA6CXBjcyA9IFBDX0RJU0FCTEUgOyAJYnJlYWsgOworCX0KKwlyZXR1cm4ocGNzKSA7Cit9CisKK2NoYXIgKmdldF9saW5lc3RhdGUoc3RydWN0IHNfc21jICpzbWMsIGludCBucCkKK3sKKwljaGFyICpscyA9ICIiIDsKKworCVNLX1VOVVNFRChzbWMpIDsKKworCXN3aXRjaCAoaW5wdyhQTEMobnAsUExfU1RBVFVTX0EpKSAmIFBMX0xJTkVfU1QpIHsKKwkJY2FzZSBQTF9MX05MUyA6CWxzID0gIk5PSVNFIiA7CWJyZWFrIDsKKwkJY2FzZSBQTF9MX0FMUyA6CWxzID0gIkFDVElWIiA7CWJyZWFrIDsKKwkJY2FzZSBQTF9MX1VORCA6CWxzID0gIlVOREVGIiA7CWJyZWFrIDsKKwkJY2FzZSBQTF9MX0lMUzQ6CWxzID0gIklMUyA0IiA7CWJyZWFrIDsKKwkJY2FzZSBQTF9MX1FMUyA6CWxzID0gIlFMUyIgOwlicmVhayA7CisJCWNhc2UgUExfTF9NTFMgOglscyA9ICJNTFMiIDsJYnJlYWsgOworCQljYXNlIFBMX0xfSExTIDoJbHMgPSAiSExTIiA7CWJyZWFrIDsKKwkJY2FzZSBQTF9MX0lMUzE2OmxzID0gIklMUzE2IiA7CWJyZWFrIDsKKyNpZmRlZglsaW50CisJCWRlZmF1bHQ6CWxzID0gInVua25vd24iIDsgYnJlYWsgOworI2VuZGlmCisJfQorCXJldHVybihscykgOworfQorCitjaGFyICpnZXRfcGNtc3RhdGUoc3RydWN0IHNfc21jICpzbWMsIGludCBucCkKK3sKKwljaGFyICpwY3MgOworCQorCVNLX1VOVVNFRChzbWMpIDsKKworCXN3aXRjaCAoaW5wdyhQTEMobnAsUExfU1RBVFVTX0IpKSAmIFBMX1BDTV9TVEFURSkgeworCQljYXNlIFBMX1BDMCA6CXBjcyA9ICJPRkYiIDsJCWJyZWFrIDsKKwkJY2FzZSBQTF9QQzEgOglwY3MgPSAiQlJFQUsiIDsJCWJyZWFrIDsKKwkJY2FzZSBQTF9QQzIgOglwY3MgPSAiVFJBQ0UiIDsJCWJyZWFrIDsKKwkJY2FzZSBQTF9QQzMgOglwY3MgPSAiQ09OTkVDVCI7CWJyZWFrIDsKKwkJY2FzZSBQTF9QQzQgOglwY3MgPSAiTkVYVCIgOwkJYnJlYWsgOworCQljYXNlIFBMX1BDNSA6CXBjcyA9ICJTSUdOQUwiIDsJYnJlYWsgOworCQljYXNlIFBMX1BDNiA6CXBjcyA9ICJKT0lOIiA7CQlicmVhayA7CisJCWNhc2UgUExfUEM3IDoJcGNzID0gIlZFUklGWSIgOwlicmVhayA7CisJCWNhc2UgUExfUEM4IDoJcGNzID0gIkFDVElWIiA7CQlicmVhayA7CisJCWNhc2UgUExfUEM5IDoJcGNzID0gIk1BSU5UIiA7CQlicmVhayA7CisJCWRlZmF1bHQgOglwY3MgPSAiVU5LTk9XTiIgOyAJYnJlYWsgOworCX0KKwlyZXR1cm4ocGNzKSA7Cit9CisKK3ZvaWQgbGlzdF9waHkoc3RydWN0IHNfc21jICpzbWMpCit7CisJc3RydWN0IHNfcGxjICpwbGMgOworCWludCBucCA7CisKKwlmb3IgKG5wID0gMCA7IG5wIDwgTlVNUEhZUyA7IG5wKyspIHsKKwkJcGxjICA9ICZzbWMtPnlbbnBdLnBsYyA7CisJCXByaW50ZigiUEhZICVkOlx0RVJST1JTXHRcdFx0QlJFQUtfUkVBU09OU1x0XHRTVEFURVM6XG4iLG5wKSA7CisJCXByaW50ZigiXHRzb2Z0X2Vycm9yOiAlbGQgXHRcdFBDX1N0YXJ0IDogJWxkXG4iLAorCQkJCQkJcGxjLT5zb2Z0X2VycixwbGMtPmJfcGNzKTsKKwkJcHJpbnRmKCJcdHBhcml0eV9lcnI6ICVsZCBcdFx0VFBDIGV4cC4gOiAlbGRcdFx0TGluZTogJXNcbiIsCisJCQlwbGMtPnBhcml0eV9lcnIscGxjLT5iX3RwYyxnZXRfbGluZXN0YXRlKHNtYyxucCkpIDsKKwkJcHJpbnRmKCJcdGVidWZfZXJyb3I6ICVsZCBcdFx0VE5FIGV4cC4gOiAlbGRcbiIsCisJCQkJCQlwbGMtPmVidWZfZXJyLHBsYy0+Yl90bmUpIDsKKwkJcHJpbnRmKCJcdHBoeWludmFsaWQ6ICVsZCBcdFx0UUxTIGRldC4gOiAlbGRcdFx0UENNIDogJXNcbiIsCisJCQlwbGMtPnBoeWludixwbGMtPmJfcWxzLGdldF9wY21zdGF0ZShzbWMsbnApKSA7CisJCXByaW50ZigiXHR2aW9zeW1fY3RyOiAlbGQgXHRcdElMUyBkZXQuIDogJWxkXG4iLAorCQkJCQkJcGxjLT52c3ltX2N0cixwbGMtPmJfaWxzKSAgOworCQlwcmludGYoIlx0bWluZ2FwX2N0cjogJWxkIFx0XHRITFMgZGV0LiA6ICVsZFxuIiwKKwkJCQkJCXBsYy0+bWluaV9jdHIscGxjLT5iX2hscykgOworCQlwcmludGYoIlx0bm9kZXByX2VycjogJWxkXG4iLHBsYy0+bnBfZXJyKSA7CisJCXByaW50ZigiXHRUUENfZXhwIDogJWxkXG4iLHBsYy0+dHBjX2V4cCkgOworCQlwcmludGYoIlx0TEVNX2VyciA6ICVsZFxuIixzbWMtPnlbbnBdLmxlbS5sZW1fZXJyb3JzKSA7CisJfQorfQorCisKKyNpZmRlZglDT05DRU5UUkFUT1IKK3ZvaWQgcGNtX2xlbV9kdW1wKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWludAkJaSA7CisJc3RydWN0IHNfcGh5CSpwaHkgOworCXN0cnVjdCBmZGRpX21pYl9wCSptaWIgOworCisJY2hhcgkJKmVudG9zdHJpbmcoKSA7CisKKwlwcmludGYoIlBIWQllcnJvcnMJQkVSXG4iKSA7CisJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKSA7CisJZm9yIChpID0gMCxwaHkgPSBzbWMtPnkgOyBpIDwgTlVNUEhZUyA7IGkrKyxwaHkrKykgeworCQlpZiAoIXBsY19pc19pbnN0YWxsZWQoc21jLGkpKQorCQkJY29udGludWUgOworCQltaWIgPSBwaHktPm1pYiA7CisJCXByaW50ZigiJXNcdCVsZFx0MTBFLSVkXG4iLAorCQkJZW50b3N0cmluZyhzbWMsRU5USVRZX1BIWShpKSksCisJCQltaWItPmZkZGlQT1JUTGVtX0N0LAorCQkJbWliLT5mZGRpUE9SVExlcl9Fc3RpbWF0ZSkgOworCX0KK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL3BtZi5jIGIvZHJpdmVycy9uZXQvc2tmcC9wbWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmI0NDZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9wbWYuYwpAQCAtMCwwICsxLDE2NzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglTZWUgdGhlIGZpbGUgInNrZmRkaS5jIiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisJUGFyYW1ldGVyIE1hbmFnZW1lbnQgRnJhbWUgcHJvY2Vzc2luZyBmb3IgU01UIDcuMgorKi8KKworI2luY2x1ZGUgImgvdHlwZXMuaCIKKyNpbmNsdWRlICJoL2ZkZGkuaCIKKyNpbmNsdWRlICJoL3NtYy5oIgorI2luY2x1ZGUgImgvc210X3AuaCIKKworI2RlZmluZSBLRVJORUwKKyNpbmNsdWRlICJoL3NtdHN0YXRlLmgiCisKKyNpZm5kZWYJU0xJTV9TTVQKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKXBtZi5jCTEuMzcgOTcvMDgvMDQgKEMpIFNLICIgOworI2VuZGlmCisKK3N0YXRpYyBpbnQgc210X2F1dGhvcml6ZShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9oZWFkZXIgKnNtKTsKK3N0YXRpYyBpbnQgc210X2NoZWNrX3NldF9jb3VudChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9oZWFkZXIgKnNtKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc19wX3RhYiogc210X2dldF9wdGFiKHVfc2hvcnQgcGFyYSk7CitzdGF0aWMgaW50IHNtdF9taWJfcGh5cyhzdHJ1Y3Qgc19zbWMgKnNtYyk7CitpbnQgc210X3NldF9wYXJhKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BhcmEgKnBhLCBpbnQgaW5kZXgsIGludCBsb2NhbCwKKwkJIGludCBzZXQpOwordm9pZCBzbXRfYWRkX3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzX3Bjb24gKnBjb24sIHVfc2hvcnQgcGFyYSwKKwkJICBpbnQgaW5kZXgsIGludCBsb2NhbCk7CitzdGF0aWMgU01idWYgKnNtdF9idWlsZF9wbWZfcmVzcG9uc2Uoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfaGVhZGVyICpyZXEsCisJCQkJICAgICBpbnQgc2V0LCBpbnQgbG9jYWwpOworCisjZGVmaW5lIE1PRkZTUyhlKQkoKGludCkmKCgoc3RydWN0IGZkZGlfbWliICopMCktPmUpKQorI2RlZmluZSBNT0ZGU0EoZSkJKChpbnQpICgoKHN0cnVjdCBmZGRpX21pYiAqKTApLT5lKSkKKworI2RlZmluZSBNT0ZGTVMoZSkJKChpbnQpJigoKHN0cnVjdCBmZGRpX21pYl9tICopMCktPmUpKQorI2RlZmluZSBNT0ZGTUEoZSkJKChpbnQpICgoKHN0cnVjdCBmZGRpX21pYl9tICopMCktPmUpKQorCisjZGVmaW5lIE1PRkZBUyhlKQkoKGludCkmKCgoc3RydWN0IGZkZGlfbWliX2EgKikwKS0+ZSkpCisjZGVmaW5lIE1PRkZBQShlKQkoKGludCkgKCgoc3RydWN0IGZkZGlfbWliX2EgKikwKS0+ZSkpCisKKyNkZWZpbmUgTU9GRlBTKGUpCSgoaW50KSYoKChzdHJ1Y3QgZmRkaV9taWJfcCAqKTApLT5lKSkKKyNkZWZpbmUgTU9GRlBBKGUpCSgoaW50KSAoKChzdHJ1Y3QgZmRkaV9taWJfcCAqKTApLT5lKSkKKworCisjZGVmaW5lIEFDX0cJMHgwMQkJLyogR2V0ICovCisjZGVmaW5lIEFDX0dSCTB4MDIJCS8qIEdldC9TZXQgKi8KKyNkZWZpbmUgQUNfUwkweDA0CQkvKiBTZXQgKi8KKyNkZWZpbmUgQUNfTkEJMHgwOAorI2RlZmluZSBBQ19HUk9VUAkweDEwCQkvKiBHcm91cCAqLworI2RlZmluZSBNUzJCQ0xLKHgpCSgoeCkqMTI1MDBMKQorLyoKKwlGCUxGYWcgKGJ5dGUpCisJQglieXRlCisJUwl1X3Nob3J0CTE2IGJpdAorCUMJQ291bnRlciAzMiBiaXQKKwlMCUxvbmcgMzIgYml0CisJVAlUaW1lcl8yCTMyIGJpdAorCVAJVGltZVN0YW1wIDsKKwlBCUxvbmdBZGRyZXNzICg2IGJ5dGUpCisJRQlFbnVtIDE2IGJpdAorCVIJUmVzSWQgMTYgQml0CisqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzX3BfdGFiIHsKKwl1X3Nob3J0CXBfbnVtIDsJCS8qIHBhcmFtZXRlciBjb2RlICovCisJdV9jaGFyCXBfYWNjZXNzIDsJLyogYWNjZXNzIHJpZ2h0cyAqLworCXVfc2hvcnQJcF9vZmZzZXQgOwkvKiBvZmZzZXQgaW4gbWliICovCisJY2hhcglwX3N3YXBbM10gOwkvKiBmb3JtYXQgc3RyaW5nICovCit9IHBfdGFiW10gPSB7CisJLyogU3RhdGlvbklkR3JwICovCisJeyBTTVRfUDEwMEEsQUNfR1JPVVAJfSAsCisJeyBTTVRfUDEwMEIsQUNfRywJTU9GRlNTKGZkZGlTTVRTdGF0aW9uSWQpLAkiOCIJfSAsCisJeyBTTVRfUDEwMEQsQUNfRywJTU9GRlNTKGZkZGlTTVRPcFZlcnNpb25JZCksCSJTIgl9ICwKKwl7IFNNVF9QMTAwRSxBQ19HLAlNT0ZGU1MoZmRkaVNNVEhpVmVyc2lvbklkKSwJIlMiCX0gLAorCXsgU01UX1AxMDBGLEFDX0csCU1PRkZTUyhmZGRpU01UTG9WZXJzaW9uSWQpLAkiUyIJfSAsCisJeyBTTVRfUDEwMTAsQUNfRywJTU9GRlNBKGZkZGlTTVRNYW51ZmFjdHVyZXJEYXRhKSwgIkQiIH0gLAorCXsgU01UX1AxMDExLEFDX0dSLAlNT0ZGU0EoZmRkaVNNVFVzZXJEYXRhKSwJIkQiCX0gLAorCXsgU01UX1AxMDEyLEFDX0csCU1PRkZTUyhmZGRpU01UTUlCVmVyc2lvbklkKSwJIlMiCX0gLAorCisJLyogU3RhdGlvbkNvbmZpZ0dycCAqLworCXsgU01UX1AxMDE0LEFDX0dST1VQCX0gLAorCXsgU01UX1AxMDE1LEFDX0csCU1PRkZTUyhmZGRpU01UTWFjX0N0KSwJCSJCIgl9ICwKKwl7IFNNVF9QMTAxNixBQ19HLAlNT0ZGU1MoZmRkaVNNVE5vbk1hc3Rlcl9DdCksCSJCIgl9ICwKKwl7IFNNVF9QMTAxNyxBQ19HLAlNT0ZGU1MoZmRkaVNNVE1hc3Rlcl9DdCksCSJCIgl9ICwKKwl7IFNNVF9QMTAxOCxBQ19HLAlNT0ZGU1MoZmRkaVNNVEF2YWlsYWJsZVBhdGhzKSwJIkIiCX0gLAorCXsgU01UX1AxMDE5LEFDX0csCU1PRkZTUyhmZGRpU01UQ29uZmlnQ2FwYWJpbGl0aWVzKSwiUyIJfSAsCisJeyBTTVRfUDEwMUEsQUNfR1IsCU1PRkZTUyhmZGRpU01UQ29uZmlnUG9saWN5KSwJIndTIgl9ICwKKwl7IFNNVF9QMTAxQixBQ19HUiwJTU9GRlNTKGZkZGlTTVRDb25uZWN0aW9uUG9saWN5KSwid1MiCX0gLAorCXsgU01UX1AxMDFELEFDX0dSLAlNT0ZGU1MoZmRkaVNNVFRUX05vdGlmeSksCSJ3UyIJfSAsCisJeyBTTVRfUDEwMUUsQUNfR1IsCU1PRkZTUyhmZGRpU01UU3RhdFJwdFBvbGljeSksCSJiQiIJfSAsCisJeyBTTVRfUDEwMUYsQUNfR1IsCU1PRkZTUyhmZGRpU01UVHJhY2VfTWF4RXhwaXJhdGlvbiksImxMIgl9ICwKKwl7IFNNVF9QMTAyMCxBQ19HLAlNT0ZGU0EoZmRkaVNNVFBPUlRJbmRleGVzKSwJIklJIgl9ICwKKwl7IFNNVF9QMTAyMSxBQ19HLAlNT0ZGU1MoZmRkaVNNVE1BQ0luZGV4ZXMpLAkiSSIJfSAsCisJeyBTTVRfUDEwMjIsQUNfRywJTU9GRlNTKGZkZGlTTVRCeXBhc3NQcmVzZW50KSwJIkYiCX0gLAorCisJLyogU3RhdHVzR3JwICovCisJeyBTTVRfUDEwMjgsQUNfR1JPVVAJfSAsCisJeyBTTVRfUDEwMjksQUNfRywJTU9GRlNTKGZkZGlTTVRFQ01TdGF0ZSksCSJFIgl9ICwKKwl7IFNNVF9QMTAyQSxBQ19HLAlNT0ZGU1MoZmRkaVNNVENGX1N0YXRlKSwJIkUiCX0gLAorCXsgU01UX1AxMDJDLEFDX0csCU1PRkZTUyhmZGRpU01UUmVtb3RlRGlzY29ubmVjdEZsYWcpLCJGIgl9ICwKKwl7IFNNVF9QMTAyRCxBQ19HLAlNT0ZGU1MoZmRkaVNNVFN0YXRpb25TdGF0dXMpLAkiRSIJfSAsCisJeyBTTVRfUDEwMkUsQUNfRywJTU9GRlNTKGZkZGlTTVRQZWVyV3JhcEZsYWcpLAkiRiIJfSAsCisKKwkvKiBNSUJPcGVyYXRpb25HcnAgKi8KKwl7IFNNVF9QMTAzMixBQ19HUk9VUAl9ICwKKwl7IFNNVF9QMTAzMyxBQ19HLAlNT0ZGU0EoZmRkaVNNVFRpbWVTdGFtcCksIlAiCQl9ICwKKwl7IFNNVF9QMTAzNCxBQ19HLAlNT0ZGU0EoZmRkaVNNVFRyYW5zaXRpb25UaW1lU3RhbXApLCJQIgl9ICwKKwkvKiBOT1RFIDogU01UX1AxMDM1IGlzIGFscmVhZHkgc3dhcHBlZCAhIFNNVF9QX1NFVENPVU5UICovCisJeyBTTVRfUDEwMzUsQUNfRywJTU9GRlNTKGZkZGlTTVRTZXRDb3VudCksIjRQIgkJfSAsCisJeyBTTVRfUDEwMzYsQUNfRywJTU9GRlNTKGZkZGlTTVRMYXN0U2V0U3RhdGlvbklkKSwiOCIJfSAsCisKKwl7IFNNVF9QMTAzQyxBQ19TLAkwLAkJCQkid1MiCX0gLAorCisJLyoKKwkgKiBQUklWQVRFIEVYVEVOU0lPTlMKKwkgKiBvbmx5IGFjY2Vzc2libGUgbG9jYWxseSB0byBnZXQvc2V0IHBhc3N3ZAorCSAqLworCXsgU01UX1AxMEYwLEFDX0dSLAlNT0ZGU0EoZmRkaVBSUE1GUGFzc3dkKSwJIjgiCX0gLAorCXsgU01UX1AxMEYxLEFDX0dSLAlNT0ZGU1MoZmRkaVBSUE1GU3RhdGlvbiksCSI4Igl9ICwKKyNpZmRlZglFU1MKKwl7IFNNVF9QMTBGMixBQ19HUiwJTU9GRlNTKGZkZGlFU1NQYXlsb2FkKSwJCSJsTCIJfSAsCisJeyBTTVRfUDEwRjMsQUNfR1IsCU1PRkZTUyhmZGRpRVNTT3ZlcmhlYWQpLAkibEwiCX0gLAorCXsgU01UX1AxMEY0LEFDX0dSLAlNT0ZGU1MoZmRkaUVTU01heFROZWcpLAkJImxMIgl9ICwKKwl7IFNNVF9QMTBGNSxBQ19HUiwJTU9GRlNTKGZkZGlFU1NNaW5TZWdtZW50U2l6ZSksCSJsTCIJfSAsCisJeyBTTVRfUDEwRjYsQUNfR1IsCU1PRkZTUyhmZGRpRVNTQ2F0ZWdvcnkpLAkibEwiCX0gLAorCXsgU01UX1AxMEY3LEFDX0dSLAlNT0ZGU1MoZmRkaUVTU1N5bmNoVHhNb2RlKSwJIndTIgl9ICwKKyNlbmRpZgorI2lmZGVmCVNCQQorCXsgU01UX1AxMEY4LEFDX0dSLAlNT0ZGU1MoZmRkaVNCQUNvbW1hbmQpLAkJImJGIgl9ICwKKwl7IFNNVF9QMTBGOSxBQ19HUiwJTU9GRlNTKGZkZGlTQkFBdmFpbGFibGUpLAkiYkYiCX0gLAorI2VuZGlmCisJLyogTUFDIEF0dHJpYnV0ZXMgKi8KKwl7IFNNVF9QMjAwQSxBQ19HUk9VUAl9ICwKKwl7IFNNVF9QMjAwQixBQ19HLAlNT0ZGTVMoZmRkaU1BQ0ZyYW1lU3RhdHVzRnVuY3Rpb25zKSwiUyIJfSAsCisJeyBTTVRfUDIwMEQsQUNfRywJTU9GRk1TKGZkZGlNQUNUX01heENhcGFiaWxpdGl5KSwiVCIJfSAsCisJeyBTTVRfUDIwMEUsQUNfRywJTU9GRk1TKGZkZGlNQUNUVlhDYXBhYmlsaXRpeSksIlQiCX0gLAorCisJLyogQ29uZmlnR3JwICovCisJeyBTTVRfUDIwMTQsQUNfR1JPVVAJfSAsCisJeyBTTVRfUDIwMTYsQUNfRywJTU9GRk1TKGZkZGlNQUNBdmFpbGFibGVQYXRocyksCSJCIgl9ICwKKwl7IFNNVF9QMjAxNyxBQ19HLAlNT0ZGTVMoZmRkaU1BQ0N1cnJlbnRQYXRoKSwJIlMiCX0gLAorCXsgU01UX1AyMDE4LEFDX0csCU1PRkZNUyhmZGRpTUFDVXBzdHJlYW1OYnIpLAkiQSIJfSAsCisJeyBTTVRfUDIwMTksQUNfRywJTU9GRk1TKGZkZGlNQUNEb3duc3RyZWFtTmJyKSwJIkEiCX0gLAorCXsgU01UX1AyMDFBLEFDX0csCU1PRkZNUyhmZGRpTUFDT2xkVXBzdHJlYW1OYnIpLAkiQSIJfSAsCisJeyBTTVRfUDIwMUIsQUNfRywJTU9GRk1TKGZkZGlNQUNPbGREb3duc3RyZWFtTmJyKSwiQSIJfSAsCisJeyBTTVRfUDIwMUQsQUNfRywJTU9GRk1TKGZkZGlNQUNEdXBBZGRyZXNzVGVzdCksCSJFIgl9ICwKKwl7IFNNVF9QMjAyMCxBQ19HUiwJTU9GRk1TKGZkZGlNQUNSZXF1ZXN0ZWRQYXRocyksCSJ3UyIJfSAsCisJeyBTTVRfUDIwMjEsQUNfRywJTU9GRk1TKGZkZGlNQUNEb3duc3RyZWFtUE9SVFR5cGUpLCJFIgl9ICwKKwl7IFNNVF9QMjAyMixBQ19HLAlNT0ZGTVMoZmRkaU1BQ0luZGV4KSwJCSJTIgl9ICwKKworCS8qIEFkZHJlc3NHcnAgKi8KKwl7IFNNVF9QMjAyOCxBQ19HUk9VUAl9ICwKKwl7IFNNVF9QMjAyOSxBQ19HLAlNT0ZGTVMoZmRkaU1BQ1NNVEFkZHJlc3MpLAkiQSIJfSAsCisKKwkvKiBPcGVyYXRpb25HcnAgKi8KKwl7IFNNVF9QMjAzMixBQ19HUk9VUAl9ICwKKwl7IFNNVF9QMjAzMyxBQ19HLAlNT0ZGTVMoZmRkaU1BQ1RfUmVxKSwJCSJUIgl9ICwKKwl7IFNNVF9QMjAzNCxBQ19HLAlNT0ZGTVMoZmRkaU1BQ1RfTmVnKSwJCSJUIgl9ICwKKwl7IFNNVF9QMjAzNSxBQ19HLAlNT0ZGTVMoZmRkaU1BQ1RfTWF4KSwJCSJUIgl9ICwKKwl7IFNNVF9QMjAzNixBQ19HLAlNT0ZGTVMoZmRkaU1BQ1R2eFZhbHVlKSwJIlQiCX0gLAorCXsgU01UX1AyMDM4LEFDX0csCU1PRkZNUyhmZGRpTUFDVF9QcmkwKSwJCSJUIgl9ICwKKwl7IFNNVF9QMjAzOSxBQ19HLAlNT0ZGTVMoZmRkaU1BQ1RfUHJpMSksCQkiVCIJfSAsCisJeyBTTVRfUDIwM0EsQUNfRywJTU9GRk1TKGZkZGlNQUNUX1ByaTIpLAkJIlQiCX0gLAorCXsgU01UX1AyMDNCLEFDX0csCU1PRkZNUyhmZGRpTUFDVF9QcmkzKSwJCSJUIgl9ICwKKwl7IFNNVF9QMjAzQyxBQ19HLAlNT0ZGTVMoZmRkaU1BQ1RfUHJpNCksCQkiVCIJfSAsCisJeyBTTVRfUDIwM0QsQUNfRywJTU9GRk1TKGZkZGlNQUNUX1ByaTUpLAkJIlQiCX0gLAorCXsgU01UX1AyMDNFLEFDX0csCU1PRkZNUyhmZGRpTUFDVF9Qcmk2KSwJCSJUIgl9ICwKKworCisJLyogQ291bnRlcnNHcnAgKi8KKwl7IFNNVF9QMjA0NixBQ19HUk9VUAl9ICwKKwl7IFNNVF9QMjA0NyxBQ19HLAlNT0ZGTVMoZmRkaU1BQ0ZyYW1lX0N0KSwJIkMiCX0gLAorCXsgU01UX1AyMDQ4LEFDX0csCU1PRkZNUyhmZGRpTUFDQ29waWVkX0N0KSwJIkMiCX0gLAorCXsgU01UX1AyMDQ5LEFDX0csCU1PRkZNUyhmZGRpTUFDVHJhbnNtaXRfQ3QpLAkiQyIJfSAsCisJeyBTTVRfUDIwNEEsQUNfRywJTU9GRk1TKGZkZGlNQUNUb2tlbl9DdCksCSJDIgl9ICwKKwl7IFNNVF9QMjA1MSxBQ19HLAlNT0ZGTVMoZmRkaU1BQ0Vycm9yX0N0KSwJIkMiCX0gLAorCXsgU01UX1AyMDUyLEFDX0csCU1PRkZNUyhmZGRpTUFDTG9zdF9DdCksCQkiQyIJfSAsCisJeyBTTVRfUDIwNTMsQUNfRywJTU9GRk1TKGZkZGlNQUNUdnhFeHBpcmVkX0N0KSwJIkMiCX0gLAorCXsgU01UX1AyMDU0LEFDX0csCU1PRkZNUyhmZGRpTUFDTm90Q29waWVkX0N0KSwJIkMiCX0gLAorCXsgU01UX1AyMDU2LEFDX0csCU1PRkZNUyhmZGRpTUFDUmluZ09wX0N0KSwJIkMiCX0gLAorCisJLyogRnJhbWVFcnJvckNvbmRpdGlvbkdycCAqLworCXsgU01UX1AyMDVBLEFDX0dST1VQCX0gLAorCXsgU01UX1AyMDVGLEFDX0dSLAlNT0ZGTVMoZmRkaU1BQ0ZyYW1lRXJyb3JUaHJlc2hvbGQpLCJ3UyIJfSAsCisJeyBTTVRfUDIwNjAsQUNfRywJTU9GRk1TKGZkZGlNQUNGcmFtZUVycm9yUmF0aW8pLAkiUyIJfSAsCisKKwkvKiBOb3RDb3BpZWRDb25kaXRpb25HcnAgKi8KKwl7IFNNVF9QMjA2NCxBQ19HUk9VUAl9ICwKKwl7IFNNVF9QMjA2NyxBQ19HUiwJTU9GRk1TKGZkZGlNQUNOb3RDb3BpZWRUaHJlc2hvbGQpLCJ3UyIJfSAsCisJeyBTTVRfUDIwNjksQUNfRywJTU9GRk1TKGZkZGlNQUNOb3RDb3BpZWRSYXRpbyksCSJTIgl9ICwKKworCS8qIFN0YXR1c0dycCAqLworCXsgU01UX1AyMDZFLEFDX0dST1VQCX0gLAorCXsgU01UX1AyMDZGLEFDX0csCU1PRkZNUyhmZGRpTUFDUk1UU3RhdGUpLAkiUyIJfSAsCisJeyBTTVRfUDIwNzAsQUNfRywJTU9GRk1TKGZkZGlNQUNEQV9GbGFnKSwJIkYiCX0gLAorCXsgU01UX1AyMDcxLEFDX0csCU1PRkZNUyhmZGRpTUFDVU5EQV9GbGFnKSwJIkYiCX0gLAorCXsgU01UX1AyMDcyLEFDX0csCU1PRkZNUyhmZGRpTUFDRnJhbWVFcnJvckZsYWcpLAkiRiIJfSAsCisJeyBTTVRfUDIwNzMsQUNfRywJTU9GRk1TKGZkZGlNQUNOb3RDb3BpZWRGbGFnKSwJIkYiCX0gLAorCXsgU01UX1AyMDc0LEFDX0csCU1PRkZNUyhmZGRpTUFDTUFfVW5pdGRhdGFBdmFpbGFibGUpLCJGIgl9ICwKKwl7IFNNVF9QMjA3NSxBQ19HLAlNT0ZGTVMoZmRkaU1BQ0hhcmR3YXJlUHJlc2VudCksCSJGIgl9ICwKKwl7IFNNVF9QMjA3NixBQ19HUiwJTU9GRk1TKGZkZGlNQUNNQV9Vbml0ZGF0YUVuYWJsZSksImJGIgl9ICwKKworCS8qCisJICogUFJJVkFURSBFWFRFTlNJT05TCisJICogb25seSBhY2Nlc3NpYmxlIGxvY2FsbHkgdG8gZ2V0L3NldCBUTUlOCisJICovCisJeyBTTVRfUDIwRjAsQUNfTkEJCQkJCQl9ICwKKwl7IFNNVF9QMjBGMSxBQ19HUiwJTU9GRk1TKGZkZGlNQUNUX01pbiksCQkibFQiCX0gLAorCisJLyogUGF0aCBBdHRyaWJ1dGVzICovCisJLyoKKwkgKiBET04ndCBzd2FwIDMyMEIsMzIwRiwzMjEwOiB0aGV5IGFyZSBhbHJlYWR5IHN3YXBwZWQgaW4gc3dhcF9wYXJhKCkKKwkgKi8KKwl7IFNNVF9QMzIwQSxBQ19HUk9VUAl9ICwKKwl7IFNNVF9QMzIwQixBQ19HLAlNT0ZGQVMoZmRkaVBBVEhJbmRleCksCQkiciIJfSAsCisJeyBTTVRfUDMyMEYsQUNfR1IsCU1PRkZBUyhmZGRpUEFUSFNiYVBheWxvYWQpLAkibDQiCX0gLAorCXsgU01UX1AzMjEwLEFDX0dSLAlNT0ZGQVMoZmRkaVBBVEhTYmFPdmVyaGVhZCksCSJsNCIJfSAsCisJLyogZmRkaVBBVEhDb25maWd1cmF0aW9uICovCisJeyBTTVRfUDMyMTIsQUNfRywJMCwJCQkJIiIJfSAsCisJeyBTTVRfUDMyMTMsQUNfR1IsCU1PRkZBUyhmZGRpUEFUSFRfUm1vZGUpLAkibFQiCX0gLAorCXsgU01UX1AzMjE0LEFDX0dSLAlNT0ZGQVMoZmRkaVBBVEhTYmFBdmFpbGFibGUpLAkibEwiCX0gLAorCXsgU01UX1AzMjE1LEFDX0dSLAlNT0ZGQVMoZmRkaVBBVEhUVlhMb3dlckJvdW5kKSwJImxUIgl9ICwKKwl7IFNNVF9QMzIxNixBQ19HUiwJTU9GRkFTKGZkZGlQQVRIVF9NYXhMb3dlckJvdW5kKSwibFQiCX0gLAorCXsgU01UX1AzMjE3LEFDX0dSLAlNT0ZGQVMoZmRkaVBBVEhNYXhUX1JlcSksCSJsVCIJfSAsCisKKwkvKiBQb3J0IEF0dHJpYnV0ZXMgKi8KKwkvKiBDb25maWdHcnAgKi8KKwl7IFNNVF9QNDAwQSxBQ19HUk9VUAl9ICwKKwl7IFNNVF9QNDAwQyxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRNeV9UeXBlKSwJIkUiCX0gLAorCXsgU01UX1A0MDBELEFDX0csCU1PRkZQUyhmZGRpUE9SVE5laWdoYm9yVHlwZSksCSJFIgl9ICwKKwl7IFNNVF9QNDAwRSxBQ19HUiwJTU9GRlBTKGZkZGlQT1JUQ29ubmVjdGlvblBvbGljaWVzKSwiYkIiCX0gLAorCXsgU01UX1A0MDBGLEFDX0csCU1PRkZQUyhmZGRpUE9SVE1hY0luZGljYXRlZCksCSIyIgl9ICwKKwl7IFNNVF9QNDAxMCxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRDdXJyZW50UGF0aCksCSJFIgl9ICwKKwl7IFNNVF9QNDAxMSxBQ19HUiwJTU9GRlBBKGZkZGlQT1JUUmVxdWVzdGVkUGF0aHMpLAkibDQiCX0gLAorCXsgU01UX1A0MDEyLEFDX0csCU1PRkZQUyhmZGRpUE9SVE1BQ1BsYWNlbWVudCksCSJTIgl9ICwKKwl7IFNNVF9QNDAxMyxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRBdmFpbGFibGVQYXRocyksCSJCIgl9ICwKKwl7IFNNVF9QNDAxNixBQ19HLAlNT0ZGUFMoZmRkaVBPUlRQTURDbGFzcyksCSJFIgl9ICwKKwl7IFNNVF9QNDAxNyxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRDb25uZWN0aW9uQ2FwYWJpbGl0aWVzKSwJIkIifSAsCisJeyBTTVRfUDQwMUQsQUNfRywJTU9GRlBTKGZkZGlQT1JUSW5kZXgpLAkJIlIiCX0gLAorCisJLyogT3BlcmF0aW9uR3JwICovCisJeyBTTVRfUDQwMUUsQUNfR1JPVVAJfSAsCisJeyBTTVRfUDQwMUYsQUNfR1IsCU1PRkZQUyhmZGRpUE9SVE1haW50X0xTKSwJIndFIgl9ICwKKwl7IFNNVF9QNDAyMSxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRCU19GbGFnKSwJIkYiCX0gLAorCXsgU01UX1A0MDIyLEFDX0csCU1PRkZQUyhmZGRpUE9SVFBDX0xTKSwJCSJFIgl9ICwKKworCS8qIEVycm9yQ3Ryc0dycCAqLworCXsgU01UX1A0MDI4LEFDX0dST1VQCX0gLAorCXsgU01UX1A0MDI5LEFDX0csCU1PRkZQUyhmZGRpUE9SVEVCRXJyb3JfQ3QpLAkiQyIJfSAsCisJeyBTTVRfUDQwMkEsQUNfRywJTU9GRlBTKGZkZGlQT1JUTENURmFpbF9DdCksCSJDIgl9ICwKKworCS8qIExlckdycCAqLworCXsgU01UX1A0MDMyLEFDX0dST1VQCX0gLAorCXsgU01UX1A0MDMzLEFDX0csCU1PRkZQUyhmZGRpUE9SVExlcl9Fc3RpbWF0ZSksCSJGIgl9ICwKKwl7IFNNVF9QNDAzNCxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRMZW1fUmVqZWN0X0N0KSwJIkMiCX0gLAorCXsgU01UX1A0MDM1LEFDX0csCU1PRkZQUyhmZGRpUE9SVExlbV9DdCksCQkiQyIJfSAsCisJeyBTTVRfUDQwM0EsQUNfR1IsCU1PRkZQUyhmZGRpUE9SVExlcl9DdXRvZmYpLAkiYkIiCX0gLAorCXsgU01UX1A0MDNCLEFDX0dSLAlNT0ZGUFMoZmRkaVBPUlRMZXJfQWxhcm0pLAkiYkIiCX0gLAorCisJLyogU3RhdHVzR3JwICovCisJeyBTTVRfUDQwM0MsQUNfR1JPVVAJfSAsCisJeyBTTVRfUDQwM0QsQUNfRywJTU9GRlBTKGZkZGlQT1JUQ29ubmVjdFN0YXRlKSwJIkUiCX0gLAorCXsgU01UX1A0MDNFLEFDX0csCU1PRkZQUyhmZGRpUE9SVFBDTVN0YXRlWCksCSJFIgl9ICwKKwl7IFNNVF9QNDAzRixBQ19HLAlNT0ZGUFMoZmRkaVBPUlRQQ19XaXRoaG9sZCksCSJFIgl9ICwKKwl7IFNNVF9QNDA0MCxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRMZXJGbGFnKSwJIkYiCX0gLAorCXsgU01UX1A0MDQxLEFDX0csCU1PRkZQUyhmZGRpUE9SVEhhcmR3YXJlUHJlc2VudCksIkYiCX0gLAorCisJeyBTTVRfUDQwNDYsQUNfUywJMCwJCQkJIndTIgl9ICwKKworCXsgMCwJQUNfR1JPVVAJfSAsCisJeyAwIH0KK30gOworCit2b2lkIHNtdF9wbWZfcmVjZWl2ZWRfcGFjayhzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iLCBpbnQgbG9jYWwpCit7CisJc3RydWN0IHNtdF9oZWFkZXIJKnNtIDsKKwlTTWJ1ZgkJKnJlcGx5IDsKKworCXNtID0gc210b2QobWIsc3RydWN0IHNtdF9oZWFkZXIgKikgOworCURCX1NNVCgiU01UOiBwcm9jZXNzaW5nIFBNRiBmcmFtZSBhdCAleCBsZW4gJWRcbiIsc20sbWItPnNtX2xlbikgOworI2lmZGVmCURFQlVHCisJZHVtcF9zbXQoc21jLHNtLCJQTUYgUmVjZWl2ZWQiKSA7CisjZW5kaWYKKwkvKgorCSAqIFN0YXJ0IHRoZSB3YXRjaGRvZzogSXQgbWF5IGJlIGEgbG9uZywgbG9uZyBwYWNrZXQgYW5kCisJICogbWF5YmUgdGhlIHdhdGNoZG9nIG9jY3VycyAuLi4KKwkgKi8KKwlzbXRfc3RhcnRfd2F0Y2hkb2coc21jKSA7CisKKwlpZiAoc20tPnNtdF9jbGFzcyA9PSBTTVRfUE1GX0dFVCB8fAorCSAgICBzbS0+c210X2NsYXNzID09IFNNVF9QTUZfU0VUKSB7CisJCXJlcGx5ID0gc210X2J1aWxkX3BtZl9yZXNwb25zZShzbWMsc20sCisJCQlzbS0+c210X2NsYXNzID09IFNNVF9QTUZfU0VULGxvY2FsKSA7CisJCWlmIChyZXBseSkgeworCQkJc20gPSBzbXRvZChyZXBseSxzdHJ1Y3Qgc210X2hlYWRlciAqKSA7CisjaWZkZWYJREVCVUcKKwkJCWR1bXBfc210KHNtYyxzbSwiUE1GIFJlcGx5IikgOworI2VuZGlmCisJCQlzbXRfc2VuZF9mcmFtZShzbWMscmVwbHksRkNfU01UX0lORk8sbG9jYWwpIDsKKwkJfQorCX0KK30KKworc3RhdGljIFNNYnVmICpzbXRfYnVpbGRfcG1mX3Jlc3BvbnNlKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X2hlYWRlciAqcmVxLAorCQkJCSAgICAgaW50IHNldCwgaW50IGxvY2FsKQoreworCVNNYnVmCQkJKm1iIDsKKwlzdHJ1Y3Qgc210X2hlYWRlcgkqc210IDsKKwlzdHJ1Y3Qgc210X3BhcmEJCSpwYSA7CisJc3RydWN0IHNtdF9wX3JlYXNvbgkqcmVzIDsKKwljb25zdCBzdHJ1Y3Qgc19wX3RhYgkqcHQgOworCWludAkJCWxlbiA7CisJaW50CQkJaW5kZXggOworCWludAkJCWlkeF9lbmQgOworCWludAkJCWVycm9yIDsKKwlpbnQJCQlyYW5nZSA7CisJU0tfTE9DX0RFQ0woc3RydWN0IHNfcGNvbixwY29uKSA7CisJU0tfTE9DX0RFQ0woc3RydWN0IHNfcGNvbixzZXRfcGNvbikgOworCisJLyoKKwkgKiBidWlsZCBTTVQgaGVhZGVyCisJICovCisJaWYgKCEobWIgPSBzbXRfZ2V0X21idWYoc21jKSkpCisJCXJldHVybihtYikgOworCisJc210ID0gc210b2QobWIsIHN0cnVjdCBzbXRfaGVhZGVyICopIDsKKwlzbXQtPnNtdF9kZXN0ID0gcmVxLT5zbXRfc291cmNlIDsJLyogREEgPT0gc291cmNlIG9mIHJlcXVlc3QgKi8KKwlzbXQtPnNtdF9jbGFzcyA9IHJlcS0+c210X2NsYXNzIDsJLyogc2FtZSBjbGFzcyAoR0VUL1NFVCkgKi8KKwlzbXQtPnNtdF90eXBlID0gU01UX1JFUExZIDsKKwlzbXQtPnNtdF92ZXJzaW9uID0gU01UX1ZJRF8yIDsKKwlzbXQtPnNtdF90aWQgPSByZXEtPnNtdF90aWQgOwkJLyogc2FtZSBUSUQgKi8KKwlzbXQtPnNtdF9wYWQgPSAwIDsKKwlzbXQtPnNtdF9sZW4gPSAwIDsKKworCS8qCisJICogc2V0dXAgcGFyYW1ldGVyIHN0YXR1cworCSAqLworCXBjb24ucGNfbGVuID0gU01UX01BWF9JTkZPX0xFTiA7CS8qIG1heCBwYXJhIGxlbmd0aCAqLworCXBjb24ucGNfZXJyID0gMCA7CQkJLyogbm8gZXJyb3IgKi8KKwlwY29uLnBjX2JhZHNldCA9IDAgOwkJCS8qIG5vIGJhZCBzZXQgY291bnQgKi8KKwlwY29uLnBjX3AgPSAodm9pZCAqKSAoc210ICsgMSkgOwkvKiBwYXJhcyBzdGFydCBoZXJlICovCisKKwkvKgorCSAqIGNoZWNrIGF1dGhvcml6aWF0aW9uIGFuZCBzZXQgY291bnQKKwkgKi8KKwllcnJvciA9IDAgOworCWlmIChzZXQpIHsKKwkJaWYgKCFsb2NhbCAmJiBzbXRfYXV0aG9yaXplKHNtYyxyZXEpKQorCQkJZXJyb3IgPSBTTVRfUkRGX0FVVEhPUiA7CisJCWVsc2UgaWYgKHNtdF9jaGVja19zZXRfY291bnQoc21jLHJlcSkpCisJCQlwY29uLnBjX2JhZHNldCA9IFNNVF9SREZfQkFEU0VUIDsKKwl9CisJLyoKKwkgKiBhZGQgcmVhc29uIGNvZGUgYW5kIGFsbCBtYW5kYXRvcnkgcGFyYW1ldGVycworCSAqLworCXJlcyA9IChzdHJ1Y3Qgc210X3BfcmVhc29uICopIHBjb24ucGNfcCA7CisJc210X2FkZF9wYXJhKHNtYywmcGNvbiwodV9zaG9ydCkgU01UX1BfUkVBU09OLDAsMCkgOworCXNtdF9hZGRfcGFyYShzbWMsJnBjb24sKHVfc2hvcnQpIFNNVF9QMTAzMywwLDApIDsKKwkvKiB1cGRhdGUgMTAzNSBhbmQgMTAzNiBsYXRlciBpZiBzZXQgKi8KKwlzZXRfcGNvbiA9IHBjb24gOworCXNtdF9hZGRfcGFyYShzbWMsJnBjb24sKHVfc2hvcnQpIFNNVF9QMTAzNSwwLDApIDsKKwlzbXRfYWRkX3BhcmEoc21jLCZwY29uLCh1X3Nob3J0KSBTTVRfUDEwMzYsMCwwKSA7CisKKwlwY29uLnBjX2VyciA9IGVycm9yIDsKKwlsZW4gPSByZXEtPnNtdF9sZW4gOworCXBhID0gKHN0cnVjdCBzbXRfcGFyYSAqKSAocmVxICsgMSkgOworCS8qCisJICogcHJvY2VzcyBsaXN0IG9mIHBhcmFzCisJICovCisJd2hpbGUgKCFwY29uLnBjX2VyciAmJiBsZW4gPiAwICkgeworCQlpZiAoKCh1X3Nob3J0KWxlbiA8IHBhLT5wX2xlbiArIFBBUkFfTEVOKSB8fCAocGEtPnBfbGVuICYgMykpIHsKKwkJCXBjb24ucGNfZXJyID0gU01UX1JERl9MRU5HVEggOworCQkJYnJlYWsgOworCQl9CisKKwkJaWYgKCgocmFuZ2UgPSAocGEtPnBfdHlwZSAmIDB4ZjAwMCkpID09IDB4MjAwMCkgfHwKKwkJCXJhbmdlID09IDB4MzAwMCB8fCByYW5nZSA9PSAweDQwMDApIHsKKwkJCS8qCisJCQkgKiBnZXQgaW5kZXggZm9yIFBBUlQsTUFDIGFkIFBBVEggZ3JvdXAKKwkJCSAqLworCQkJaW5kZXggPSAqKCh1X2NoYXIgKilwYSArIFBBUkFfTEVOICsgMykgOy8qIGluZGV4ICovCisJCQlpZHhfZW5kID0gaW5kZXggOworCQkJaWYgKCFzZXQgJiYgKHBhLT5wX2xlbiAhPSA0KSkgeworCQkJCXBjb24ucGNfZXJyID0gU01UX1JERl9MRU5HVEggOworCQkJCWJyZWFrIDsKKwkJCX0KKwkJCWlmICghaW5kZXggJiYgIXNldCkgeworCQkJCXN3aXRjaCAocmFuZ2UpIHsKKwkJCQljYXNlIDB4MjAwMCA6CisJCQkJCWluZGV4ID0gSU5ERVhfTUFDIDsKKwkJCQkJaWR4X2VuZCA9IGluZGV4IC0gMSArIE5VTU1BQ1MgOworCQkJCQlicmVhayA7CisJCQkJY2FzZSAweDMwMDAgOgorCQkJCQlpbmRleCA9IElOREVYX1BBVEggOworCQkJCQlpZHhfZW5kID0gaW5kZXggLSAxICsgTlVNUEFUSFMgOworCQkJCQlicmVhayA7CisJCQkJY2FzZSAweDQwMDAgOgorCQkJCQlpbmRleCA9IElOREVYX1BPUlQgOworCQkJCQlpZHhfZW5kID0gaW5kZXggLSAxICsgTlVNUEhZUyA7CisjaWZuZGVmCUNPTkNFTlRSQVRPUgorCQkJCQlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKQorCQkJCQkJaWR4X2VuZCA9IElOREVYX1BPUlQgOworI2VuZGlmCisJCQkJCWJyZWFrIDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKgorCQkJICogc210IGdyb3VwIGhhcyBubyBpbmRleAorCQkJICovCisJCQlpZiAoIXNldCAmJiAocGEtPnBfbGVuICE9IDApKSB7CisJCQkJcGNvbi5wY19lcnIgPSBTTVRfUkRGX0xFTkdUSCA7CisJCQkJYnJlYWsgOworCQkJfQorCQkJaW5kZXggPSAwIDsKKwkJCWlkeF9lbmQgPSAwIDsKKwkJfQorCQl3aGlsZSAoaW5kZXggPD0gaWR4X2VuZCkgeworCQkJLyoKKwkJCSAqIGlmIGdyb3VwCisJCQkgKglhZGQgYWxsIHBhcmFzIG9mIGdyb3VwCisJCQkgKi8KKwkJCXB0ID0gc210X2dldF9wdGFiKHBhLT5wX3R5cGUpIDsKKwkJCWlmIChwdCAmJiBwdC0+cF9hY2Nlc3MgPT0gQUNfR1JPVVAgJiYgIXNldCkgeworCQkJCXB0KysgOworCQkJCXdoaWxlIChwdC0+cF9hY2Nlc3MgPT0gQUNfRyB8fAorCQkJCQlwdC0+cF9hY2Nlc3MgPT0gQUNfR1IpIHsKKwkJCQkJc210X2FkZF9wYXJhKHNtYywmcGNvbixwdC0+cF9udW0sCisJCQkJCQlpbmRleCxsb2NhbCk7CisJCQkJCXB0KysgOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBpZ25vcmUKKwkJCSAqCUFVVEhPUklaQVRJT04gaW4gZ2V0L3NldAorCQkJICoJU0VUIENPVU5UIGluIHNldAorCQkJICovCisJCQllbHNlIGlmIChwYS0+cF90eXBlICE9IFNNVF9QX0FVVEhPUiAmJgorCQkJCSAoIXNldCB8fCAocGEtPnBfdHlwZSAhPSBTTVRfUDEwMzUpKSkgeworCQkJCWludAlzdCA7CisJCQkJaWYgKHBjb24ucGNfYmFkc2V0KSB7CisJCQkJCXNtdF9hZGRfcGFyYShzbWMsJnBjb24scGEtPnBfdHlwZSwKKwkJCQkJCWluZGV4LGxvY2FsKSA7CisJCQkJfQorCQkJCWVsc2UgaWYgKHNldCkgeworCQkJCQlzdCA9IHNtdF9zZXRfcGFyYShzbWMscGEsaW5kZXgsbG9jYWwsMSk7CisJCQkJCS8qCisJCQkJCSAqIHJldHVybiBwYXJhIGV2ZW4gaWYgZXJyb3IKKwkJCQkJICovCisJCQkJCXNtdF9hZGRfcGFyYShzbWMsJnBjb24scGEtPnBfdHlwZSwKKwkJCQkJCWluZGV4LGxvY2FsKSA7CisJCQkJCXBjb24ucGNfZXJyID0gc3QgOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJaWYgKHB0ICYmIHB0LT5wX2FjY2VzcyA9PSBBQ19TKSB7CisJCQkJCQlwY29uLnBjX2VyciA9CisJCQkJCQkJU01UX1JERl9JTExFR0FMIDsKKwkJCQkJfQorCQkJCQlzbXRfYWRkX3BhcmEoc21jLCZwY29uLHBhLT5wX3R5cGUsCisJCQkJCQlpbmRleCxsb2NhbCkgOworCQkJCX0KKwkJCX0KKwkJCWlmIChwY29uLnBjX2VycikKKwkJCQlicmVhayA7CisJCQlpbmRleCsrIDsKKwkJfQorCQlsZW4gLT0gcGEtPnBfbGVuICsgUEFSQV9MRU4gOworCQlwYSA9IChzdHJ1Y3Qgc210X3BhcmEgKikgKChjaGFyICopcGEgKyBwYS0+cF9sZW4gKyBQQVJBX0xFTikgOworCX0KKwlzbXQtPnNtdF9sZW4gPSBTTVRfTUFYX0lORk9fTEVOIC0gcGNvbi5wY19sZW4gOworCW1iLT5zbV9sZW4gPSBzbXQtPnNtdF9sZW4gKyBzaXplb2Yoc3RydWN0IHNtdF9oZWFkZXIpIDsKKworCS8qIHVwZGF0ZSByZWFzb24gY29kZSAqLworCXJlcy0+cmRmX3JlYXNvbiA9IHBjb24ucGNfYmFkc2V0ID8gcGNvbi5wY19iYWRzZXQgOgorCQkJcGNvbi5wY19lcnIgPyBwY29uLnBjX2VyciA6IFNNVF9SREZfU1VDQ0VTUyA7CisJaWYgKHNldCAmJiAocmVzLT5yZGZfcmVhc29uID09IFNNVF9SREZfU1VDQ0VTUykpIHsKKwkJLyoKKwkJICogaW5jcmVtZW50IHNldCBjb3VudAorCQkgKiBzZXQgdGltZSBzdGFtcAorCQkgKiBzdG9yZSBzdGF0aW9uIGlkIG9mIGxhc3Qgc2V0CisJCSAqLworCQlzbWMtPm1pYi5mZGRpU01UU2V0Q291bnQuY291bnQrKyA7CisJCXNtdF9zZXRfdGltZXN0YW1wKHNtYyxzbWMtPm1pYi5mZGRpU01UU2V0Q291bnQudGltZXN0YW1wKSA7CisJCXNtYy0+bWliLmZkZGlTTVRMYXN0U2V0U3RhdGlvbklkID0gcmVxLT5zbXRfc2lkIDsKKwkJc210X2FkZF9wYXJhKHNtYywmc2V0X3Bjb24sKHVfc2hvcnQpIFNNVF9QMTAzNSwwLDApIDsKKwkJc210X2FkZF9wYXJhKHNtYywmc2V0X3Bjb24sKHVfc2hvcnQpIFNNVF9QMTAzNiwwLDApIDsKKwl9CisJcmV0dXJuKG1iKSA7Cit9CisKK3N0YXRpYyBpbnQgc210X2F1dGhvcml6ZShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9oZWFkZXIgKnNtKQoreworCXN0cnVjdCBzbXRfcGFyYQkqcGEgOworCWludAkJaSA7CisJY2hhcgkJKnAgOworCisJLyoKKwkgKiBjaGVjayBzb3VyY2Ugc3RhdGlvbiBpZCBpZiBub3QgemVybworCSAqLworCXAgPSAoY2hhciAqKSAmc21jLT5taWIuZmRkaVBSUE1GU3RhdGlvbiA7CisJZm9yIChpID0gMCA7IGkgPCA4ICYmICFwW2ldIDsgaSsrKQorCQk7CisJaWYgKGkgIT0gOCkgeworCQlpZiAobWVtY21wKChjaGFyICopICZzbS0+c210X3NpZCwKKwkJCShjaGFyICopICZzbWMtPm1pYi5mZGRpUFJQTUZTdGF0aW9uLDgpKQorCQkJcmV0dXJuKDEpIDsKKwl9CisJLyoKKwkgKiBjaGVjayBhdXRob3JpemlhdGlvbiBwYXJhbWV0ZXIgaWYgcGFzc3dkIG5vdCB6ZXJvCisJICovCisJcCA9IChjaGFyICopIHNtYy0+bWliLmZkZGlQUlBNRlBhc3N3ZCA7CisJZm9yIChpID0gMCA7IGkgPCA4ICYmICFwW2ldIDsgaSsrKQorCQk7CisJaWYgKGkgIT0gOCkgeworCQlwYSA9IChzdHJ1Y3Qgc210X3BhcmEgKikgc21fdG9fcGFyYShzbWMsc20sU01UX1BfQVVUSE9SKSA7CisJCWlmICghcGEpCisJCQlyZXR1cm4oMSkgOworCQlpZiAocGEtPnBfbGVuICE9IDgpCisJCQlyZXR1cm4oMSkgOworCQlpZiAobWVtY21wKChjaGFyICopKHBhKzEpLChjaGFyICopc21jLT5taWIuZmRkaVBSUE1GUGFzc3dkLDgpKQorCQkJcmV0dXJuKDEpIDsKKwl9CisJcmV0dXJuKDApIDsKK30KKworc3RhdGljIGludCBzbXRfY2hlY2tfc2V0X2NvdW50KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X2hlYWRlciAqc20pCit7CisJc3RydWN0IHNtdF9wYXJhCSpwYSA7CisJc3RydWN0IHNtdF9wX3NldGNvdW50CSpzYyA7CisKKwlwYSA9IChzdHJ1Y3Qgc210X3BhcmEgKikgc21fdG9fcGFyYShzbWMsc20sU01UX1AxMDM1KSA7CisJaWYgKHBhKSB7CisJCXNjID0gKHN0cnVjdCBzbXRfcF9zZXRjb3VudCAqKSBwYSA7CisJCWlmICgoc21jLT5taWIuZmRkaVNNVFNldENvdW50LmNvdW50ICE9IHNjLT5jb3VudCkgfHwKKwkJCW1lbWNtcCgoY2hhciAqKSBzbWMtPm1pYi5mZGRpU01UU2V0Q291bnQudGltZXN0YW1wLAorCQkJKGNoYXIgKilzYy0+dGltZXN0YW1wLDgpKQorCQkJcmV0dXJuKDEpIDsKKwl9CisJcmV0dXJuKDApIDsKK30KKwordm9pZCBzbXRfYWRkX3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzX3Bjb24gKnBjb24sIHVfc2hvcnQgcGFyYSwKKwkJICBpbnQgaW5kZXgsIGludCBsb2NhbCkKK3sKKwlzdHJ1Y3Qgc210X3BhcmEJKnBhIDsKKwljb25zdCBzdHJ1Y3Qgc19wX3RhYgkqcHQgOworCXN0cnVjdCBmZGRpX21pYl9tICptaWJfbSA9IE5VTEw7CisJc3RydWN0IGZkZGlfbWliX3AgKm1pYl9wID0gTlVMTDsKKwlpbnQJCWxlbiA7CisJaW50CQlwbGVuIDsKKwljaGFyCQkqZnJvbSA7CisJY2hhcgkJKnRvIDsKKwljb25zdCBjaGFyCSpzd2FwIDsKKwljaGFyCQljIDsKKwlpbnQJCXJhbmdlIDsKKwljaGFyCQkqbWliX2FkZHIgOworCWludAkJbWFjIDsKKwlpbnQJCXBhdGggOworCWludAkJcG9ydCA7CisJaW50CQlzcF9sZW4gOworCisJLyoKKwkgKiBza2lwIGlmIGVycnJvcgorCSAqLworCWlmIChwY29uLT5wY19lcnIpCisJCXJldHVybiA7CisKKwkvKgorCSAqIGFjdGlvbnMgZG9uJ3QgaGF2ZSBhIHZhbHVlCisJICovCisJcHQgPSBzbXRfZ2V0X3B0YWIocGFyYSkgOworCWlmIChwdCAmJiBwdC0+cF9hY2Nlc3MgPT0gQUNfUykKKwkJcmV0dXJuIDsKKworCXRvID0gKGNoYXIgKikgKHBjb24tPnBjX3ApIDsJLyogZGVzdGluYXRpb24gcG9pbnRlciAqLworCWxlbiA9IHBjb24tPnBjX2xlbiA7CQkvKiBmcmVlIHNwYWNlICovCisJcGxlbiA9IGxlbiA7CQkJLyogcmVtZW1iZXIgc3RhcnQgbGVuZ3RoICovCisJcGEgPSAoc3RydWN0IHNtdF9wYXJhICopIHRvIDsJLyogdHlwZS9sZW5ndGggcG9pbnRlciAqLworCXRvICs9IFBBUkFfTEVOIDsJCS8qIHNraXAgc210X3BhcmEgKi8KKwlsZW4gLT0gUEFSQV9MRU4gOworCS8qCisJICogc2V0IGluZGV4IGlmIHJlcXVpcmVkCisJICovCisJaWYgKCgocmFuZ2UgPSAocGFyYSAmIDB4ZjAwMCkpID09IDB4MjAwMCkgfHwKKwkJcmFuZ2UgPT0gMHgzMDAwIHx8IHJhbmdlID09IDB4NDAwMCkgeworCQlpZiAobGVuIDwgNCkKKwkJCWdvdG8gd3JvbmdfZXJyb3IgOworCQl0b1swXSA9IDAgOworCQl0b1sxXSA9IDAgOworCQl0b1syXSA9IDAgOworCQl0b1szXSA9IGluZGV4IDsKKwkJbGVuIC09IDQgOworCQl0byArPSA0IDsKKwl9CisJbWFjID0gaW5kZXggLSBJTkRFWF9NQUMgOworCXBhdGggPSBpbmRleCAtIElOREVYX1BBVEggOworCXBvcnQgPSBpbmRleCAtIElOREVYX1BPUlQgOworCS8qCisJICogZ2V0IHBvaW50ZXIgdG8gbWliCisJICovCisJc3dpdGNoIChyYW5nZSkgeworCWNhc2UgMHgxMDAwIDoKKwlkZWZhdWx0IDoKKwkJbWliX2FkZHIgPSAoY2hhciAqKSAoJnNtYy0+bWliKSA7CisJCWJyZWFrIDsKKwljYXNlIDB4MjAwMCA6CisJCWlmIChtYWMgPCAwIHx8IG1hYyA+PSBOVU1NQUNTKSB7CisJCQlwY29uLT5wY19lcnIgPSBTTVRfUkRGX05PUEFSQU0gOworCQkJcmV0dXJuIDsKKwkJfQorCQltaWJfYWRkciA9IChjaGFyICopICgmc21jLT5taWIubVttYWNdKSA7CisJCW1pYl9tID0gKHN0cnVjdCBmZGRpX21pYl9tICopIG1pYl9hZGRyIDsKKwkJYnJlYWsgOworCWNhc2UgMHgzMDAwIDoKKwkJaWYgKHBhdGggPCAwIHx8IHBhdGggPj0gTlVNUEFUSFMpIHsKKwkJCXBjb24tPnBjX2VyciA9IFNNVF9SREZfTk9QQVJBTSA7CisJCQlyZXR1cm4gOworCQl9CisJCW1pYl9hZGRyID0gKGNoYXIgKikgKCZzbWMtPm1pYi5hW3BhdGhdKSA7CisJCWJyZWFrIDsKKwljYXNlIDB4NDAwMCA6CisJCWlmIChwb3J0IDwgMCB8fCBwb3J0ID49IHNtdF9taWJfcGh5cyhzbWMpKSB7CisJCQlwY29uLT5wY19lcnIgPSBTTVRfUkRGX05PUEFSQU0gOworCQkJcmV0dXJuIDsKKwkJfQorCQltaWJfYWRkciA9IChjaGFyICopICgmc21jLT5taWIucFtwb3J0X3RvX21pYihzbWMscG9ydCldKSA7CisJCW1pYl9wID0gKHN0cnVjdCBmZGRpX21pYl9wICopIG1pYl9hZGRyIDsKKwkJYnJlYWsgOworCX0KKwkvKgorCSAqIGNoZWNrIHNwZWNpYWwgcGFyYXMKKwkgKi8KKwlzd2FwID0gTlVMTDsKKwlzd2l0Y2ggKHBhcmEpIHsKKwljYXNlIFNNVF9QMTBGMCA6CisJY2FzZSBTTVRfUDEwRjEgOgorI2lmZGVmCUVTUworCWNhc2UgU01UX1AxMEYyIDoKKwljYXNlIFNNVF9QMTBGMyA6CisJY2FzZSBTTVRfUDEwRjQgOgorCWNhc2UgU01UX1AxMEY1IDoKKwljYXNlIFNNVF9QMTBGNiA6CisJY2FzZSBTTVRfUDEwRjcgOgorI2VuZGlmCisjaWZkZWYJU0JBCisJY2FzZSBTTVRfUDEwRjggOgorCWNhc2UgU01UX1AxMEY5IDoKKyNlbmRpZgorCWNhc2UgU01UX1AyMEYxIDoKKwkJaWYgKCFsb2NhbCkgeworCQkJcGNvbi0+cGNfZXJyID0gU01UX1JERl9OT1BBUkFNIDsKKwkJCXJldHVybiA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgU01UX1AyMDM0IDoKKwljYXNlIFNNVF9QMjA0NiA6CisJY2FzZSBTTVRfUDIwNDcgOgorCWNhc2UgU01UX1AyMDRBIDoKKwljYXNlIFNNVF9QMjA1MSA6CisJY2FzZSBTTVRfUDIwNTIgOgorCQltYWNfdXBkYXRlX2NvdW50ZXIoc21jKSA7CisJCWJyZWFrIDsKKwljYXNlIFNNVF9QNDAyMjoKKwkJbWliX3AtPmZkZGlQT1JUUENfTFMgPSBMUzJNSUIoCisJCQlzbV9wbV9nZXRfbHMoc21jLHBvcnRfdG9fbWliKHNtYyxwb3J0KSkpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1BfUkVBU09OIDoKKwkJKiAodV9sb25nICopIHRvID0gMCA7CisJCXNwX2xlbiA9IDQgOworCQlnb3RvIHNwX2RvbmUgOworCWNhc2UgU01UX1AxMDMzIDoJCQkvKiB0aW1lIHN0YW1wICovCisJCXNtdF9zZXRfdGltZXN0YW1wKHNtYyxzbWMtPm1pYi5mZGRpU01UVGltZVN0YW1wKSA7CisJCWJyZWFrIDsKKworCWNhc2UgU01UX1AxMDIwOgkJCQkvKiBwb3J0IGluZGV4ZXMgKi8KKyNpZglOVU1QSFlTID09IDEyCisJCXN3YXAgPSAiSUlJSUlJSUlJSUlJIiA7CisjZWxzZQorI2lmCU5VTVBIWVMgPT0gMgorCQlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKQorCQkJc3dhcCA9ICJJIiA7CisJCWVsc2UKKwkJCXN3YXAgPSAiSUkiIDsKKyNlbHNlCisjaWYJTlVNUEhZUyA9PSAyNAorCQlzd2FwID0gIklJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSSIgOworI2Vsc2UKKwk/Pz8/CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisJCWJyZWFrIDsKKwljYXNlIFNNVF9QMzIxMiA6CisJCXsKKwkJCXNwX2xlbiA9IGNlbV9idWlsZF9wYXRoKHNtYyx0byxwYXRoKSA7CisJCQlnb3RvIHNwX2RvbmUgOworCQl9CisJY2FzZSBTTVRfUDEwNDggOgkJLyogcGVlciB3cmFwIGNvbmRpdGlvbiAqLworCQl7CisJCQlzdHJ1Y3Qgc210X3BfMTA0OAkqc3AgOworCQkJc3AgPSAoc3RydWN0IHNtdF9wXzEwNDggKikgdG8gOworCQkJc3AtPnAxMDQ4X2ZsYWcgPSBzbWMtPm1pYi5mZGRpU01UUGVlcldyYXBGbGFnIDsKKwkJCXNwLT5wMTA0OF9jZl9zdGF0ZSA9IHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSA7CisJCQlzcF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzEwNDgpIDsKKwkJCWdvdG8gc3BfZG9uZSA7CisJCX0KKwljYXNlIFNNVF9QMjA4QyA6CisJCXsKKwkJCXN0cnVjdCBzbXRfcF8yMDhjCSpzcCA7CisJCQlzcCA9IChzdHJ1Y3Qgc210X3BfMjA4YyAqKSB0byA7CisJCQlzcC0+cDIwOGNfZmxhZyA9CisJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRHVwbGljYXRlQWRkcmVzc0NvbmQgOworCQkJc3AtPnAyMDhjX2R1cGNvbmRpdGlvbiA9CisJCQkJKG1pYl9tLT5mZGRpTUFDREFfRmxhZyA/IFNNVF9TVF9NWV9EVVBBIDogMCkgfAorCQkJCShtaWJfbS0+ZmRkaU1BQ1VOREFfRmxhZyA/IFNNVF9TVF9VTkFfRFVQQSA6IDApOworCQkJc3AtPnAyMDhjX2ZkZGlsb25nID0KKwkJCQltaWJfbS0+ZmRkaU1BQ1NNVEFkZHJlc3MgOworCQkJc3AtPnAyMDhjX2ZkZGl1bmFsb25nID0KKwkJCQltaWJfbS0+ZmRkaU1BQ1Vwc3RyZWFtTmJyIDsKKwkJCXNwLT5wMjA4Y19wYWQgPSAwIDsKKwkJCXNwX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMjA4YykgOworCQkJZ290byBzcF9kb25lIDsKKwkJfQorCWNhc2UgU01UX1AyMDhEIDoJCS8qIGZyYW1lIGVycm9yIGNvbmRpdGlvbiAqLworCQl7CisJCQlzdHJ1Y3Qgc210X3BfMjA4ZAkqc3AgOworCQkJc3AgPSAoc3RydWN0IHNtdF9wXzIwOGQgKikgdG8gOworCQkJc3AtPnAyMDhkX2ZsYWcgPQorCQkJCW1pYl9tLT5mZGRpTUFDRnJhbWVFcnJvckZsYWcgOworCQkJc3AtPnAyMDhkX2ZyYW1lX2N0ID0KKwkJCQltaWJfbS0+ZmRkaU1BQ0ZyYW1lX0N0IDsKKwkJCXNwLT5wMjA4ZF9lcnJvcl9jdCA9CisJCQkJbWliX20tPmZkZGlNQUNFcnJvcl9DdCA7CisJCQlzcC0+cDIwOGRfbG9zdF9jdCA9CisJCQkJbWliX20tPmZkZGlNQUNMb3N0X0N0IDsKKwkJCXNwLT5wMjA4ZF9yYXRpbyA9CisJCQkJbWliX20tPmZkZGlNQUNGcmFtZUVycm9yUmF0aW8gOworCQkJc3BfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF8yMDhkKSA7CisJCQlnb3RvIHNwX2RvbmUgOworCQl9CisJY2FzZSBTTVRfUDIwOEUgOgkJLyogbm90IGNvcGllZCBjb25kaXRpb24gKi8KKwkJeworCQkJc3RydWN0IHNtdF9wXzIwOGUJKnNwIDsKKwkJCXNwID0gKHN0cnVjdCBzbXRfcF8yMDhlICopIHRvIDsKKwkJCXNwLT5wMjA4ZV9mbGFnID0KKwkJCQltaWJfbS0+ZmRkaU1BQ05vdENvcGllZEZsYWcgOworCQkJc3AtPnAyMDhlX25vdF9jb3BpZWQgPQorCQkJCW1pYl9tLT5mZGRpTUFDTm90Q29waWVkX0N0IDsKKwkJCXNwLT5wMjA4ZV9jb3BpZWQgPQorCQkJCW1pYl9tLT5mZGRpTUFDQ29waWVkX0N0IDsKKwkJCXNwLT5wMjA4ZV9ub3RfY29waWVkX3JhdGlvID0KKwkJCQltaWJfbS0+ZmRkaU1BQ05vdENvcGllZFJhdGlvIDsKKwkJCXNwX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMjA4ZSkgOworCQkJZ290byBzcF9kb25lIDsKKwkJfQorCWNhc2UgU01UX1AyMDhGIDoJLyogbmVpZ2hib3IgY2hhbmdlIGV2ZW50ICovCisJCXsKKwkJCXN0cnVjdCBzbXRfcF8yMDhmCSpzcCA7CisJCQlzcCA9IChzdHJ1Y3Qgc210X3BfMjA4ZiAqKSB0byA7CisJCQlzcC0+cDIwOGZfbXVsdGlwbGUgPQorCQkJCW1pYl9tLT5mZGRpTUFDTXVsdGlwbGVfTiA7CisJCQlzcC0+cDIwOGZfbmFjb25kaXRpb24gPQorCQkJCW1pYl9tLT5mZGRpTUFDRHVwbGljYXRlQWRkcmVzc0NvbmQgOworCQkJc3AtPnAyMDhmX29sZF91bmEgPQorCQkJCW1pYl9tLT5mZGRpTUFDT2xkVXBzdHJlYW1OYnIgOworCQkJc3AtPnAyMDhmX25ld191bmEgPQorCQkJCW1pYl9tLT5mZGRpTUFDVXBzdHJlYW1OYnIgOworCQkJc3AtPnAyMDhmX29sZF9kbmEgPQorCQkJCW1pYl9tLT5mZGRpTUFDT2xkRG93bnN0cmVhbU5iciA7CisJCQlzcC0+cDIwOGZfbmV3X2RuYSA9CisJCQkJbWliX20tPmZkZGlNQUNEb3duc3RyZWFtTmJyIDsKKwkJCXNwLT5wMjA4Zl9jdXJyZW5fcGF0aCA9CisJCQkJbWliX20tPmZkZGlNQUNDdXJyZW50UGF0aCA7CisJCQlzcC0+cDIwOGZfc210X2FkZHJlc3MgPQorCQkJCW1pYl9tLT5mZGRpTUFDU01UQWRkcmVzcyA7CisJCQlzcF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzIwOGYpIDsKKwkJCWdvdG8gc3BfZG9uZSA7CisJCX0KKwljYXNlIFNNVF9QMjA5MCA6CisJCXsKKwkJCXN0cnVjdCBzbXRfcF8yMDkwCSpzcCA7CisJCQlzcCA9IChzdHJ1Y3Qgc210X3BfMjA5MCAqKSB0byA7CisJCQlzcC0+cDIwOTBfbXVsdGlwbGUgPQorCQkJCW1pYl9tLT5mZGRpTUFDTXVsdGlwbGVfUCA7CisJCQlzcC0+cDIwOTBfYXZhaWxhYmxlcGF0aHMgPQorCQkJCW1pYl9tLT5mZGRpTUFDQXZhaWxhYmxlUGF0aHMgOworCQkJc3AtPnAyMDkwX2N1cnJlbnRwYXRoID0KKwkJCQltaWJfbS0+ZmRkaU1BQ0N1cnJlbnRQYXRoIDsKKwkJCXNwLT5wMjA5MF9yZXF1ZXN0ZWRwYXRocyA9CisJCQkJbWliX20tPmZkZGlNQUNSZXF1ZXN0ZWRQYXRocyA7CisJCQlzcF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzIwOTApIDsKKwkJCWdvdG8gc3BfZG9uZSA7CisJCX0KKwljYXNlIFNNVF9QNDA1MCA6CisJCXsKKwkJCXN0cnVjdCBzbXRfcF80MDUwCSpzcCA7CisJCQlzcCA9IChzdHJ1Y3Qgc210X3BfNDA1MCAqKSB0byA7CisJCQlzcC0+cDQwNTBfZmxhZyA9CisJCQkJbWliX3AtPmZkZGlQT1JUTGVyRmxhZyA7CisJCQlzcC0+cDQwNTBfcGFkID0gMCA7CisJCQlzcC0+cDQwNTBfY3V0b2ZmID0KKwkJCQltaWJfcC0+ZmRkaVBPUlRMZXJfQ3V0b2ZmIDsgOworCQkJc3AtPnA0MDUwX2FsYXJtID0KKwkJCQltaWJfcC0+ZmRkaVBPUlRMZXJfQWxhcm0gOyA7CisJCQlzcC0+cDQwNTBfZXN0aW1hdGUgPQorCQkJCW1pYl9wLT5mZGRpUE9SVExlcl9Fc3RpbWF0ZSA7CisJCQlzcC0+cDQwNTBfcmVqZWN0X2N0ID0KKwkJCQltaWJfcC0+ZmRkaVBPUlRMZW1fUmVqZWN0X0N0IDsKKwkJCXNwLT5wNDA1MF9jdCA9CisJCQkJbWliX3AtPmZkZGlQT1JUTGVtX0N0IDsKKwkJCXNwX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfNDA1MCkgOworCQkJZ290byBzcF9kb25lIDsKKwkJfQorCisJY2FzZSBTTVRfUDQwNTEgOgorCQl7CisJCQlzdHJ1Y3Qgc210X3BfNDA1MQkqc3AgOworCQkJc3AgPSAoc3RydWN0IHNtdF9wXzQwNTEgKikgdG8gOworCQkJc3AtPnA0MDUxX211bHRpcGxlID0KKwkJCQltaWJfcC0+ZmRkaVBPUlRNdWx0aXBsZV9VIDsKKwkJCXNwLT5wNDA1MV9wb3J0dHlwZSA9CisJCQkJbWliX3AtPmZkZGlQT1JUTXlfVHlwZSA7CisJCQlzcC0+cDQwNTFfY29ubmVjdHN0YXRlID0KKwkJCQltaWJfcC0+ZmRkaVBPUlRDb25uZWN0U3RhdGUgOyA7CisJCQlzcC0+cDQwNTFfcGNfbmVpZ2hib3IgPQorCQkJCW1pYl9wLT5mZGRpUE9SVE5laWdoYm9yVHlwZSA7CisJCQlzcC0+cDQwNTFfcGNfd2l0aGhvbGQgPQorCQkJCW1pYl9wLT5mZGRpUE9SVFBDX1dpdGhob2xkIDsKKwkJCXNwX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfNDA1MSkgOworCQkJZ290byBzcF9kb25lIDsKKwkJfQorCWNhc2UgU01UX1A0MDUyIDoKKwkJeworCQkJc3RydWN0IHNtdF9wXzQwNTIJKnNwIDsKKwkJCXNwID0gKHN0cnVjdCBzbXRfcF80MDUyICopIHRvIDsKKwkJCXNwLT5wNDA1Ml9mbGFnID0KKwkJCQltaWJfcC0+ZmRkaVBPUlRFQl9Db25kaXRpb24gOworCQkJc3AtPnA0MDUyX2ViZXJyb3Jjb3VudCA9CisJCQkJbWliX3AtPmZkZGlQT1JURUJFcnJvcl9DdCA7CisJCQlzcF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzQwNTIpIDsKKwkJCWdvdG8gc3BfZG9uZSA7CisJCX0KKwljYXNlIFNNVF9QNDA1MyA6CisJCXsKKwkJCXN0cnVjdCBzbXRfcF80MDUzCSpzcCA7CisJCQlzcCA9IChzdHJ1Y3Qgc210X3BfNDA1MyAqKSB0byA7CisJCQlzcC0+cDQwNTNfbXVsdGlwbGUgPQorCQkJCW1pYl9wLT5mZGRpUE9SVE11bHRpcGxlX1AgOyA7CisJCQlzcC0+cDQwNTNfYXZhaWxhYmxlcGF0aHMgPQorCQkJCW1pYl9wLT5mZGRpUE9SVEF2YWlsYWJsZVBhdGhzIDsKKwkJCXNwLT5wNDA1M19jdXJyZW50cGF0aCA9CisJCQkJbWliX3AtPmZkZGlQT1JUQ3VycmVudFBhdGggOworCQkJbWVtY3B5KAkoY2hhciAqKSAmc3AtPnA0MDUzX3JlcXVlc3RlZHBhdGhzLAorCQkJCShjaGFyICopIG1pYl9wLT5mZGRpUE9SVFJlcXVlc3RlZFBhdGhzLDQpIDsKKwkJCXNwLT5wNDA1M19teXR5cGUgPQorCQkJCW1pYl9wLT5mZGRpUE9SVE15X1R5cGUgOworCQkJc3AtPnA0MDUzX25laWdoYm9ydHlwZSA9CisJCQkJbWliX3AtPmZkZGlQT1JUTmVpZ2hib3JUeXBlIDsKKwkJCXNwX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfNDA1MykgOworCQkJZ290byBzcF9kb25lIDsKKwkJfQorCWRlZmF1bHQgOgorCQlicmVhayA7CisJfQorCS8qCisJICogaW4gdGFibGUgPworCSAqLworCWlmICghcHQpIHsKKwkJcGNvbi0+cGNfZXJyID0gKHBhcmEgJiAweGZmMDApID8gU01UX1JERl9OT1BBUkFNIDoKKwkJCQkJCVNNVF9SREZfSUxMRUdBTCA7CisJCXJldHVybiA7CisJfQorCS8qCisJICogY2hlY2sgYWNjZXNzIHJpZ2h0cworCSAqLworCXN3aXRjaCAocHQtPnBfYWNjZXNzKSB7CisJY2FzZSBBQ19HIDoKKwljYXNlIEFDX0dSIDoKKwkJYnJlYWsgOworCWRlZmF1bHQgOgorCQlwY29uLT5wY19lcnIgPSBTTVRfUkRGX0lMTEVHQUwgOworCQlyZXR1cm4gOworCX0KKwlmcm9tID0gbWliX2FkZHIgKyBwdC0+cF9vZmZzZXQgOworCWlmICghc3dhcCkKKwkJc3dhcCA9IHB0LT5wX3N3YXAgOwkJLyogcG9pbnRlciB0byBzd2FwIHN0cmluZyAqLworCisJLyoKKwkgKiBjb3B5IHZhbHVlcworCSAqLworCXdoaWxlICgoYyA9ICpzd2FwKyspKSB7CisJCXN3aXRjaChjKSB7CisJCWNhc2UgJ2InIDoKKwkJY2FzZSAndycgOgorCQljYXNlICdsJyA6CisJCQlicmVhayA7CisJCWNhc2UgJ1MnIDoKKwkJY2FzZSAnRScgOgorCQljYXNlICdSJyA6CisJCWNhc2UgJ3InIDoKKwkJCWlmIChsZW4gPCA0KQorCQkJCWdvdG8gbGVuX2Vycm9yIDsKKwkJCXRvWzBdID0gMCA7CisJCQl0b1sxXSA9IDAgOworI2lmZGVmCUxJVFRMRV9FTkRJQU4KKwkJCWlmIChjID09ICdyJykgeworCQkJCXRvWzJdID0gKmZyb20rKyA7CisJCQkJdG9bM10gPSAqZnJvbSsrIDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXRvWzNdID0gKmZyb20rKyA7CisJCQkJdG9bMl0gPSAqZnJvbSsrIDsKKwkJCX0KKyNlbHNlCisJCQl0b1syXSA9ICpmcm9tKysgOworCQkJdG9bM10gPSAqZnJvbSsrIDsKKyNlbmRpZgorCQkJdG8gKz0gNCA7CisJCQlsZW4gLT0gNCA7CisJCQlicmVhayA7CisJCWNhc2UgJ0knIDoJCS8qIGZvciBTRVQgb2YgcG9ydCBpbmRleGVzICovCisJCQlpZiAobGVuIDwgMikKKwkJCQlnb3RvIGxlbl9lcnJvciA7CisjaWZkZWYJTElUVExFX0VORElBTgorCQkJdG9bMV0gPSAqZnJvbSsrIDsKKwkJCXRvWzBdID0gKmZyb20rKyA7CisjZWxzZQorCQkJdG9bMF0gPSAqZnJvbSsrIDsKKwkJCXRvWzFdID0gKmZyb20rKyA7CisjZW5kaWYKKwkJCXRvICs9IDIgOworCQkJbGVuIC09IDIgOworCQkJYnJlYWsgOworCQljYXNlICdGJyA6CisJCWNhc2UgJ0InIDoKKwkJCWlmIChsZW4gPCA0KQorCQkJCWdvdG8gbGVuX2Vycm9yIDsKKwkJCWxlbiAtPSA0IDsKKwkJCXRvWzBdID0gMCA7CisJCQl0b1sxXSA9IDAgOworCQkJdG9bMl0gPSAwIDsKKwkJCXRvWzNdID0gKmZyb20rKyA7CisJCQl0byArPSA0IDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnQycgOgorCQljYXNlICdUJyA6CisJCWNhc2UgJ0wnIDoKKwkJCWlmIChsZW4gPCA0KQorCQkJCWdvdG8gbGVuX2Vycm9yIDsKKyNpZmRlZglMSVRUTEVfRU5ESUFOCisJCQl0b1szXSA9ICpmcm9tKysgOworCQkJdG9bMl0gPSAqZnJvbSsrIDsKKwkJCXRvWzFdID0gKmZyb20rKyA7CisJCQl0b1swXSA9ICpmcm9tKysgOworI2Vsc2UKKwkJCXRvWzBdID0gKmZyb20rKyA7CisJCQl0b1sxXSA9ICpmcm9tKysgOworCQkJdG9bMl0gPSAqZnJvbSsrIDsKKwkJCXRvWzNdID0gKmZyb20rKyA7CisjZW5kaWYKKwkJCWxlbiAtPSA0IDsKKwkJCXRvICs9IDQgOworCQkJYnJlYWsgOworCQljYXNlICcyJyA6CQkvKiBQb3J0TWFjSW5kaWNhdGVkICovCisJCQlpZiAobGVuIDwgNCkKKwkJCQlnb3RvIGxlbl9lcnJvciA7CisJCQl0b1swXSA9IDAgOworCQkJdG9bMV0gPSAwIDsKKwkJCXRvWzJdID0gKmZyb20rKyA7CisJCQl0b1szXSA9ICpmcm9tKysgOworCQkJbGVuIC09IDQgOworCQkJdG8gKz0gNCA7CisJCQlicmVhayA7CisJCWNhc2UgJzQnIDoKKwkJCWlmIChsZW4gPCA0KQorCQkJCWdvdG8gbGVuX2Vycm9yIDsKKwkJCXRvWzBdID0gKmZyb20rKyA7CisJCQl0b1sxXSA9ICpmcm9tKysgOworCQkJdG9bMl0gPSAqZnJvbSsrIDsKKwkJCXRvWzNdID0gKmZyb20rKyA7CisJCQlsZW4gLT0gNCA7CisJCQl0byArPSA0IDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnQScgOgorCQkJaWYgKGxlbiA8IDgpCisJCQkJZ290byBsZW5fZXJyb3IgOworCQkJdG9bMF0gPSAwIDsKKwkJCXRvWzFdID0gMCA7CisJCQltZW1jcHkoKGNoYXIgKikgdG8rMiwoY2hhciAqKSBmcm9tLDYpIDsKKwkJCXRvICs9IDggOworCQkJZnJvbSArPSA4IDsKKwkJCWxlbiAtPSA4IDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnOCcgOgorCQkJaWYgKGxlbiA8IDgpCisJCQkJZ290byBsZW5fZXJyb3IgOworCQkJbWVtY3B5KChjaGFyICopIHRvLChjaGFyICopIGZyb20sOCkgOworCQkJdG8gKz0gOCA7CisJCQlmcm9tICs9IDggOworCQkJbGVuIC09IDggOworCQkJYnJlYWsgOworCQljYXNlICdEJyA6CisJCQlpZiAobGVuIDwgMzIpCisJCQkJZ290byBsZW5fZXJyb3IgOworCQkJbWVtY3B5KChjaGFyICopIHRvLChjaGFyICopIGZyb20sMzIpIDsKKwkJCXRvICs9IDMyIDsKKwkJCWZyb20gKz0gMzIgOworCQkJbGVuIC09IDMyIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnUCcgOgkJLyogdGltZXN0YW1wIGlzIE5PVCBzd2FwcGVkICovCisJCQlpZiAobGVuIDwgOCkKKwkJCQlnb3RvIGxlbl9lcnJvciA7CisJCQl0b1swXSA9ICpmcm9tKysgOworCQkJdG9bMV0gPSAqZnJvbSsrIDsKKwkJCXRvWzJdID0gKmZyb20rKyA7CisJCQl0b1szXSA9ICpmcm9tKysgOworCQkJdG9bNF0gPSAqZnJvbSsrIDsKKwkJCXRvWzVdID0gKmZyb20rKyA7CisJCQl0b1s2XSA9ICpmcm9tKysgOworCQkJdG9bN10gPSAqZnJvbSsrIDsKKwkJCXRvICs9IDggOworCQkJbGVuIC09IDggOworCQkJYnJlYWsgOworCQlkZWZhdWx0IDoKKwkJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTE5LCBTTVRfRTAxMTlfTVNHKSA7CisJCQlicmVhayA7CisJCX0KKwl9CisKK2RvbmU6CisJLyoKKwkgKiBtYWtlIGl0IGV2ZW4gKGluIGNhc2Ugb2YgJ0knIGVuY29kaW5nKQorCSAqIG5vdGU6IGxlbiBpcyBERUNSRU1FTlRFRAorCSAqLworCWlmIChsZW4gJiAzKSB7CisJCXRvWzBdID0gMCA7CisJCXRvWzFdID0gMCA7CisJCXRvICs9IDQgLSAobGVuICYgMyApIDsKKwkJbGVuID0gbGVuICYgfiAzIDsKKwl9CisKKwkvKiBzZXQgdHlwZSBhbmQgbGVuZ3RoICovCisJcGEtPnBfdHlwZSA9IHBhcmEgOworCXBhLT5wX2xlbiA9IHBsZW4gLSBsZW4gLSBQQVJBX0xFTiA7CisJLyogcmV0dXJuIHZhbHVlcyAqLworCXBjb24tPnBjX3AgPSAodm9pZCAqKSB0byA7CisJcGNvbi0+cGNfbGVuID0gbGVuIDsKKwlyZXR1cm4gOworCitzcF9kb25lOgorCWxlbiAtPSBzcF9sZW4gOworCXRvICs9IHNwX2xlbiA7CisJZ290byBkb25lIDsKKworbGVuX2Vycm9yOgorCS8qIHBhcmFtZXRlciBkb2VzIG5vdCBmaXQgaW4gZnJhbWUgKi8KKwlwY29uLT5wY19lcnIgPSBTTVRfUkRGX1RPT0xPTkcgOworCXJldHVybiA7CisKK3dyb25nX2Vycm9yOgorCXBjb24tPnBjX2VyciA9IFNNVF9SREZfTEVOR1RIIDsKK30KKworLyoKKyAqIHNldCBwYXJhbWV0ZXIKKyAqLworaW50IHNtdF9zZXRfcGFyYShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wYXJhICpwYSwgaW50IGluZGV4LCBpbnQgbG9jYWwsCisJCSBpbnQgc2V0KQoreworI2RlZmluZSBJRlNFVCh4KQlpZiAoc2V0KSAoeCkKKworCWNvbnN0IHN0cnVjdCBzX3BfdGFiCSpwdCA7CisJaW50CQlsZW4gOworCWNoYXIJCSpmcm9tIDsKKwljaGFyCQkqdG8gOworCWNvbnN0IGNoYXIJKnN3YXAgOworCWNoYXIJCWMgOworCWNoYXIJCSptaWJfYWRkciA7CisJc3RydWN0IGZkZGlfbWliCSptaWIgOworCXN0cnVjdCBmZGRpX21pYl9tCSptaWJfbSA9IE5VTEw7CisJc3RydWN0IGZkZGlfbWliX2EJKm1pYl9hID0gTlVMTDsKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqbWliX3AgPSBOVUxMOworCWludAkJbWFjIDsKKwlpbnQJCXBhdGggOworCWludAkJcG9ydCA7CisJU0tfTE9DX0RFQ0wodV9jaGFyLGJ5dGVfdmFsKSA7CisJU0tfTE9DX0RFQ0wodV9zaG9ydCx3b3JkX3ZhbCkgOworCVNLX0xPQ19ERUNMKHVfbG9uZyxsb25nX3ZhbCkgOworCisJbWFjID0gaW5kZXggLSBJTkRFWF9NQUMgOworCXBhdGggPSBpbmRleCAtIElOREVYX1BBVEggOworCXBvcnQgPSBpbmRleCAtIElOREVYX1BPUlQgOworCWxlbiA9IHBhLT5wX2xlbiA7CisJZnJvbSA9IChjaGFyICopIChwYSArIDEgKSA7CisKKwltaWIgPSAmc21jLT5taWIgOworCXN3aXRjaCAocGEtPnBfdHlwZSAmIDB4ZjAwMCkgeworCWNhc2UgMHgxMDAwIDoKKwlkZWZhdWx0IDoKKwkJbWliX2FkZHIgPSAoY2hhciAqKSBtaWIgOworCQlicmVhayA7CisJY2FzZSAweDIwMDAgOgorCQlpZiAobWFjIDwgMCB8fCBtYWMgPj0gTlVNTUFDUykgeworCQkJcmV0dXJuKFNNVF9SREZfTk9QQVJBTSkgOworCQl9CisJCW1pYl9tID0gJnNtYy0+bWliLm1bbWFjXSA7CisJCW1pYl9hZGRyID0gKGNoYXIgKikgbWliX20gOworCQlmcm9tICs9IDQgOwkJLyogc2tpcCBpbmRleCAqLworCQlsZW4gLT0gNCA7CisJCWJyZWFrIDsKKwljYXNlIDB4MzAwMCA6CisJCWlmIChwYXRoIDwgMCB8fCBwYXRoID49IE5VTVBBVEhTKSB7CisJCQlyZXR1cm4oU01UX1JERl9OT1BBUkFNKSA7CisJCX0KKwkJbWliX2EgPSAmc21jLT5taWIuYVtwYXRoXSA7CisJCW1pYl9hZGRyID0gKGNoYXIgKikgbWliX2EgOworCQlmcm9tICs9IDQgOwkJLyogc2tpcCBpbmRleCAqLworCQlsZW4gLT0gNCA7CisJCWJyZWFrIDsKKwljYXNlIDB4NDAwMCA6CisJCWlmIChwb3J0IDwgMCB8fCBwb3J0ID49IHNtdF9taWJfcGh5cyhzbWMpKSB7CisJCQlyZXR1cm4oU01UX1JERl9OT1BBUkFNKSA7CisJCX0KKwkJbWliX3AgPSAmc21jLT5taWIucFtwb3J0X3RvX21pYihzbWMscG9ydCldIDsKKwkJbWliX2FkZHIgPSAoY2hhciAqKSBtaWJfcCA7CisJCWZyb20gKz0gNCA7CQkvKiBza2lwIGluZGV4ICovCisJCWxlbiAtPSA0IDsKKwkJYnJlYWsgOworCX0KKwlzd2l0Y2ggKHBhLT5wX3R5cGUpIHsKKwljYXNlIFNNVF9QMTBGMCA6CisJY2FzZSBTTVRfUDEwRjEgOgorI2lmZGVmCUVTUworCWNhc2UgU01UX1AxMEYyIDoKKwljYXNlIFNNVF9QMTBGMyA6CisJY2FzZSBTTVRfUDEwRjQgOgorCWNhc2UgU01UX1AxMEY1IDoKKwljYXNlIFNNVF9QMTBGNiA6CisJY2FzZSBTTVRfUDEwRjcgOgorI2VuZGlmCisjaWZkZWYJU0JBCisJY2FzZSBTTVRfUDEwRjggOgorCWNhc2UgU01UX1AxMEY5IDoKKyNlbmRpZgorCWNhc2UgU01UX1AyMEYxIDoKKwkJaWYgKCFsb2NhbCkgeworCQkJcmV0dXJuKFNNVF9SREZfTk9QQVJBTSkgOworCQl9CisJCWJyZWFrIDsKKwl9CisJcHQgPSBzbXRfZ2V0X3B0YWIocGEtPnBfdHlwZSkgOworCWlmICghcHQpIHsKKwkJcmV0dXJuKCAocGEtPnBfdHlwZSAmIDB4ZmYwMCkgPyBTTVRfUkRGX05PUEFSQU0gOgorCQkJCQkJU01UX1JERl9JTExFR0FMICkgOworCX0KKwlzd2l0Y2ggKHB0LT5wX2FjY2VzcykgeworCWNhc2UgQUNfR1IgOgorCWNhc2UgQUNfUyA6CisJCWJyZWFrIDsKKwlkZWZhdWx0IDoKKwkJcmV0dXJuKFNNVF9SREZfSUxMRUdBTCkgOworCX0KKwl0byA9IG1pYl9hZGRyICsgcHQtPnBfb2Zmc2V0IDsKKwlzd2FwID0gcHQtPnBfc3dhcCA7CQkvKiBwb2ludGVyIHRvIHN3YXAgc3RyaW5nICovCisKKwl3aGlsZSAoc3dhcCAmJiAoYyA9ICpzd2FwKyspKSB7CisJCXN3aXRjaChjKSB7CisJCWNhc2UgJ2InIDoKKwkJCXRvID0gKGNoYXIgKikgJmJ5dGVfdmFsIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAndycgOgorCQkJdG8gPSAoY2hhciAqKSAmd29yZF92YWwgOworCQkJYnJlYWsgOworCQljYXNlICdsJyA6CisJCQl0byA9IChjaGFyICopICZsb25nX3ZhbCA7CisJCQlicmVhayA7CisJCWNhc2UgJ1MnIDoKKwkJY2FzZSAnRScgOgorCQljYXNlICdSJyA6CisJCWNhc2UgJ3InIDoKKwkJCWlmIChsZW4gPCA0KSB7CisJCQkJZ290byBsZW5fZXJyb3IgOworCQkJfQorCQkJaWYgKGZyb21bMF0gfCBmcm9tWzFdKQorCQkJCWdvdG8gdmFsX2Vycm9yIDsKKyNpZmRlZglMSVRUTEVfRU5ESUFOCisJCQlpZiAoYyA9PSAncicpIHsKKwkJCQl0b1swXSA9IGZyb21bMl0gOworCQkJCXRvWzFdID0gZnJvbVszXSA7CisJCQl9CisJCQllbHNlIHsKKwkJCQl0b1sxXSA9IGZyb21bMl0gOworCQkJCXRvWzBdID0gZnJvbVszXSA7CisJCQl9CisjZWxzZQorCQkJdG9bMF0gPSBmcm9tWzJdIDsKKwkJCXRvWzFdID0gZnJvbVszXSA7CisjZW5kaWYKKwkJCWZyb20gKz0gNCA7CisJCQl0byArPSAyIDsKKwkJCWxlbiAtPSA0IDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnRicgOgorCQljYXNlICdCJyA6CisJCQlpZiAobGVuIDwgNCkgeworCQkJCWdvdG8gbGVuX2Vycm9yIDsKKwkJCX0KKwkJCWlmIChmcm9tWzBdIHwgZnJvbVsxXSB8IGZyb21bMl0pCisJCQkJZ290byB2YWxfZXJyb3IgOworCQkJdG9bMF0gPSBmcm9tWzNdIDsKKwkJCWxlbiAtPSA0IDsKKwkJCWZyb20gKz0gNCA7CisJCQl0byArPSA0IDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnQycgOgorCQljYXNlICdUJyA6CisJCWNhc2UgJ0wnIDoKKwkJCWlmIChsZW4gPCA0KSB7CisJCQkJZ290byBsZW5fZXJyb3IgOworCQkJfQorI2lmZGVmCUxJVFRMRV9FTkRJQU4KKwkJCXRvWzNdID0gKmZyb20rKyA7CisJCQl0b1syXSA9ICpmcm9tKysgOworCQkJdG9bMV0gPSAqZnJvbSsrIDsKKwkJCXRvWzBdID0gKmZyb20rKyA7CisjZWxzZQorCQkJdG9bMF0gPSAqZnJvbSsrIDsKKwkJCXRvWzFdID0gKmZyb20rKyA7CisJCQl0b1syXSA9ICpmcm9tKysgOworCQkJdG9bM10gPSAqZnJvbSsrIDsKKyNlbmRpZgorCQkJbGVuIC09IDQgOworCQkJdG8gKz0gNCA7CisJCQlicmVhayA7CisJCWNhc2UgJ0EnIDoKKwkJCWlmIChsZW4gPCA4KQorCQkJCWdvdG8gbGVuX2Vycm9yIDsKKwkJCWlmIChzZXQpCisJCQkJbWVtY3B5KChjaGFyICopIHRvLChjaGFyICopIGZyb20rMiw2KSA7CisJCQl0byArPSA4IDsKKwkJCWZyb20gKz0gOCA7CisJCQlsZW4gLT0gOCA7CisJCQlicmVhayA7CisJCWNhc2UgJzQnIDoKKwkJCWlmIChsZW4gPCA0KQorCQkJCWdvdG8gbGVuX2Vycm9yIDsKKwkJCWlmIChzZXQpCisJCQkJbWVtY3B5KChjaGFyICopIHRvLChjaGFyICopIGZyb20sNCkgOworCQkJdG8gKz0gNCA7CisJCQlmcm9tICs9IDQgOworCQkJbGVuIC09IDQgOworCQkJYnJlYWsgOworCQljYXNlICc4JyA6CisJCQlpZiAobGVuIDwgOCkKKwkJCQlnb3RvIGxlbl9lcnJvciA7CisJCQlpZiAoc2V0KQorCQkJCW1lbWNweSgoY2hhciAqKSB0bywoY2hhciAqKSBmcm9tLDgpIDsKKwkJCXRvICs9IDggOworCQkJZnJvbSArPSA4IDsKKwkJCWxlbiAtPSA4IDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnRCcgOgorCQkJaWYgKGxlbiA8IDMyKQorCQkJCWdvdG8gbGVuX2Vycm9yIDsKKwkJCWlmIChzZXQpCisJCQkJbWVtY3B5KChjaGFyICopIHRvLChjaGFyICopIGZyb20sMzIpIDsKKwkJCXRvICs9IDMyIDsKKwkJCWZyb20gKz0gMzIgOworCQkJbGVuIC09IDMyIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnUCcgOgkJLyogdGltZXN0YW1wIGlzIE5PVCBzd2FwcGVkICovCisJCQlpZiAoc2V0KSB7CisJCQkJdG9bMF0gPSAqZnJvbSsrIDsKKwkJCQl0b1sxXSA9ICpmcm9tKysgOworCQkJCXRvWzJdID0gKmZyb20rKyA7CisJCQkJdG9bM10gPSAqZnJvbSsrIDsKKwkJCQl0b1s0XSA9ICpmcm9tKysgOworCQkJCXRvWzVdID0gKmZyb20rKyA7CisJCQkJdG9bNl0gPSAqZnJvbSsrIDsKKwkJCQl0b1s3XSA9ICpmcm9tKysgOworCQkJfQorCQkJdG8gKz0gOCA7CisJCQlsZW4gLT0gOCA7CisJCQlicmVhayA7CisJCWRlZmF1bHQgOgorCQkJU01UX1BBTklDKHNtYyxTTVRfRTAxMjAsIFNNVF9FMDEyMF9NU0cpIDsKKwkJCXJldHVybihTTVRfUkRGX0lMTEVHQUwpIDsKKwkJfQorCX0KKwkvKgorCSAqIGFjdGlvbnMgYW5kIGludGVybmFsIHVwZGF0ZXMKKwkgKi8KKwlzd2l0Y2ggKHBhLT5wX3R5cGUpIHsKKwljYXNlIFNNVF9QMTAxQToJCQkvKiBmZGRpU01UQ29uZmlnUG9saWN5ICovCisJCWlmICh3b3JkX3ZhbCAmIH4xKQorCQkJZ290byB2YWxfZXJyb3IgOworCQlJRlNFVChtaWItPmZkZGlTTVRDb25maWdQb2xpY3kgPSB3b3JkX3ZhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfUDEwMUIgOgkJLyogZmRkaVNNVENvbm5lY3Rpb25Qb2xpY3kgKi8KKwkJaWYgKCEod29yZF92YWwgJiBQT0xJQ1lfTU0pKQorCQkJZ290byB2YWxfZXJyb3IgOworCQlJRlNFVChtaWItPmZkZGlTTVRDb25uZWN0aW9uUG9saWN5ID0gd29yZF92YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1AxMDFEIDogCQkvKiBmZGRpU01UVFRfTm90aWZ5ICovCisJCWlmICh3b3JkX3ZhbCA8IDIgfHwgd29yZF92YWwgPiAzMCkKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJSUZTRVQobWliLT5mZGRpU01UVFRfTm90aWZ5ID0gd29yZF92YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1AxMDFFIDoJCS8qIGZkZGlTTVRTdGF0UnB0UG9saWN5ICovCisJCWlmIChieXRlX3ZhbCAmIH4xKQorCQkJZ290byB2YWxfZXJyb3IgOworCQlJRlNFVChtaWItPmZkZGlTTVRTdGF0UnB0UG9saWN5ID0gYnl0ZV92YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1AxMDFGIDoJCS8qIGZkZGlTTVRUcmFjZV9NYXhFeHBpcmF0aW9uICovCisJCS8qCisJCSAqIG5vdGU6IGxvd2VyIGxpbWl0IHRyYWNlX21heCA9IDYuMDAxNzczLi4uIHMKKwkJICogTk8gdXBwZXIgbGltaXQKKwkJICovCisJCWlmIChsb25nX3ZhbCA8IChsb25nKTB4NDc4YmY1MUwpCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYi0+ZmRkaVNNVFRyYWNlX01heEV4cGlyYXRpb24gPSBsb25nX3ZhbCkgOworCQlicmVhayA7CisjaWZkZWYJRVNTCisJY2FzZSBTTVRfUDEwRjIgOgkJLyogZmRkaUVTU1BheWxvYWQgKi8KKwkJaWYgKGxvbmdfdmFsID4gMTU2MikKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJaWYgKHNldCAmJiBzbWMtPm1pYi5mZGRpRVNTUGF5bG9hZCAhPSBsb25nX3ZhbCkgeworCQkJc21jLT5lc3MucmFmX2FjdF90aW1lcl9wb2xsID0gVFJVRSA7CisJCQlzbWMtPm1pYi5mZGRpRVNTUGF5bG9hZCA9IGxvbmdfdmFsIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSBTTVRfUDEwRjMgOgkJLyogZmRkaUVTU092ZXJoZWFkICovCisJCWlmIChsb25nX3ZhbCA8IDUwIHx8IGxvbmdfdmFsID4gNTAwMCkKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJaWYgKHNldCAmJiBzbWMtPm1pYi5mZGRpRVNTUGF5bG9hZCAmJgorCQkJc21jLT5taWIuZmRkaUVTU092ZXJoZWFkICE9IGxvbmdfdmFsKSB7CisJCQlzbWMtPmVzcy5yYWZfYWN0X3RpbWVyX3BvbGwgPSBUUlVFIDsKKwkJCXNtYy0+bWliLmZkZGlFU1NPdmVyaGVhZCA9IGxvbmdfdmFsIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSBTTVRfUDEwRjQgOgkJLyogZmRkaUVTU01heFROZWcgKi8KKwkJaWYgKGxvbmdfdmFsID4gLU1TMkJDTEsoNSkgfHwgbG9uZ192YWwgPCAtTVMyQkNMSygxNjUpKQorCQkJZ290byB2YWxfZXJyb3IgOworCQlJRlNFVChtaWItPmZkZGlFU1NNYXhUTmVnID0gbG9uZ192YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1AxMEY1IDoJCS8qIGZkZGlFU1NNaW5TZWdtZW50U2l6ZSAqLworCQlpZiAobG9uZ192YWwgPCAxIHx8IGxvbmdfdmFsID4gNDQ3OCkKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJSUZTRVQobWliLT5mZGRpRVNTTWluU2VnbWVudFNpemUgPSBsb25nX3ZhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfUDEwRjYgOgkJLyogZmRkaUVTU0NhdGVnb3J5ICovCisJCWlmICgobG9uZ192YWwgJiAweGZmZmYpICE9IDEpCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYi0+ZmRkaUVTU0NhdGVnb3J5ID0gbG9uZ192YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1AxMEY3IDoJCS8qIGZkZGlFU1NTeW5jVHhNb2RlICovCisJCWlmICh3b3JkX3ZhbCA+IDEpCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYi0+ZmRkaUVTU1N5bmNoVHhNb2RlID0gd29yZF92YWwpIDsKKwkJYnJlYWsgOworI2VuZGlmCisjaWZkZWYJU0JBCisJY2FzZSBTTVRfUDEwRjggOgkJLyogZmRkaVNCQUNvbW1hbmQgKi8KKwkJaWYgKGJ5dGVfdmFsICE9IFNCX1NUT1AgJiYgYnl0ZV92YWwgIT0gU0JfU1RBUlQpCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYi0+ZmRkaVNCQUNvbW1hbmQgPSBieXRlX3ZhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfUDEwRjkgOgkJLyogZmRkaVNCQUF2YWlsYWJsZSAqLworCQlpZiAoYnl0ZV92YWwgPiAxMDApCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYi0+ZmRkaVNCQUF2YWlsYWJsZSA9IGJ5dGVfdmFsKSA7CisJCWJyZWFrIDsKKyNlbmRpZgorCWNhc2UgU01UX1AyMDIwIDoJCS8qIGZkZGlNQUNSZXF1ZXN0ZWRQYXRocyAqLworCQlpZiAoKHdvcmRfdmFsICYgKE1JQl9QX1BBVEhfUFJJTV9QUkVGRVIgfAorCQkJTUlCX1BfUEFUSF9QUklNX0FMVEVSKSkgPT0gMCApCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYl9tLT5mZGRpTUFDUmVxdWVzdGVkUGF0aHMgPSB3b3JkX3ZhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfUDIwNUYgOgkJLyogZmRkaU1BQ0ZyYW1lRXJyb3JUaHJlc2hvbGQgKi8KKwkJLyogMCAuLiBmZmZmIGFjY2VwdGFibGUgKi8KKwkJSUZTRVQobWliX20tPmZkZGlNQUNGcmFtZUVycm9yVGhyZXNob2xkID0gd29yZF92YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1AyMDY3IDoJCS8qIGZkZGlNQUNOb3RDb3BpZWRUaHJlc2hvbGQgKi8KKwkJLyogMCAuLiBmZmZmIGFjY2VwdGFibGUgKi8KKwkJSUZTRVQobWliX20tPmZkZGlNQUNOb3RDb3BpZWRUaHJlc2hvbGQgPSB3b3JkX3ZhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfUDIwNzY6CQkJLyogZmRkaU1BQ01BX1VuaXRkYXRhRW5hYmxlICovCisJCWlmIChieXRlX3ZhbCAmIH4xKQorCQkJZ290byB2YWxfZXJyb3IgOworCQlpZiAoc2V0KSB7CisJCQltaWJfbS0+ZmRkaU1BQ01BX1VuaXRkYXRhRW5hYmxlID0gYnl0ZV92YWwgOworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9FTkFCTEVfRkxBRykgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIFNNVF9QMjBGMSA6CQkvKiBmZGRpTUFDVF9NaW4gKi8KKwkJSUZTRVQobWliX20tPmZkZGlNQUNUX01pbiA9IGxvbmdfdmFsKSA7CisJCWJyZWFrIDsKKwljYXNlIFNNVF9QMzIwRiA6CisJCWlmIChsb25nX3ZhbCA+IDE1NjIpCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYl9hLT5mZGRpUEFUSFNiYVBheWxvYWQgPSBsb25nX3ZhbCkgOworI2lmZGVmCUVTUworCQlpZiAoc2V0KQorCQkJZXNzX3BhcmFfY2hhbmdlKHNtYykgOworI2VuZGlmCisJCWJyZWFrIDsKKwljYXNlIFNNVF9QMzIxMCA6CisJCWlmIChsb25nX3ZhbCA+IDUwMDApCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCQorCQlpZiAobG9uZ192YWwgIT0gMCAmJiBtaWJfYS0+ZmRkaVBBVEhTYmFQYXlsb2FkID09IDApCisJCQlnb3RvIHZhbF9lcnJvciA7CisKKwkJSUZTRVQobWliX2EtPmZkZGlQQVRIU2JhT3ZlcmhlYWQgPSBsb25nX3ZhbCkgOworI2lmZGVmCUVTUworCQlpZiAoc2V0KQorCQkJZXNzX3BhcmFfY2hhbmdlKHNtYykgOworI2VuZGlmCisJCWJyZWFrIDsKKwljYXNlIFNNVF9QMzIxMzoJCQkvKiBmZGRpUEFUSFRfUm1vZGUgKi8KKwkJLyogbm8gbGltaXQgOgorCQkgKiAwIC4uIDM0My41OTcgPT4gMCAuLiAyZTMyICogODBuUworCQkgKi8KKwkJaWYgKHNldCkgeworCQkJbWliX2EtPmZkZGlQQVRIVF9SbW9kZSA9IGxvbmdfdmFsIDsKKwkJCXJ0bV9zZXRfdGltZXIoc21jKSA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgU01UX1AzMjE0IDoJCS8qIGZkZGlQQVRIU2JhQXZhaWxhYmxlICovCisJCWlmIChsb25nX3ZhbCA+IDB4MDBCRUJDMjBMKQorCQkJZ290byB2YWxfZXJyb3IgOworI2lmZGVmIFNCQSAKKwkJaWYgKHNldCAmJiBtaWItPmZkZGlTQkFDb21tYW5kID09IFNCX1NUT1ApCisJCQlnb3RvIHZhbF9lcnJvciA7CisjZW5kaWYKKwkJSUZTRVQobWliX2EtPmZkZGlQQVRIU2JhQXZhaWxhYmxlID0gbG9uZ192YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1AzMjE1IDoJCS8qIGZkZGlQQVRIVFZYTG93ZXJCb3VuZCAqLworCQlJRlNFVChtaWJfYS0+ZmRkaVBBVEhUVlhMb3dlckJvdW5kID0gbG9uZ192YWwpIDsKKwkJZ290byBjaGFuZ2VfbWFjX3BhcmEgOworCWNhc2UgU01UX1AzMjE2IDoJCS8qIGZkZGlQQVRIVF9NYXhMb3dlckJvdW5kICovCisJCUlGU0VUKG1pYl9hLT5mZGRpUEFUSFRfTWF4TG93ZXJCb3VuZCA9IGxvbmdfdmFsKSA7CisJCWdvdG8gY2hhbmdlX21hY19wYXJhIDsKKwljYXNlIFNNVF9QMzIxNyA6CQkvKiBmZGRpUEFUSE1heFRfUmVxICovCisJCUlGU0VUKG1pYl9hLT5mZGRpUEFUSE1heFRfUmVxID0gbG9uZ192YWwpIDsKKworY2hhbmdlX21hY19wYXJhOgorCQlpZiAoc2V0ICYmIHNtdF9zZXRfbWFjX29wdmFsdWVzKHNtYykpIHsKKwkJCVJTX1NFVChzbWMsUlNfRVZFTlQpIDsKKwkJCXNtYy0+c20ucGxlYXNlX3JlY29ubmVjdCA9IDEgOworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX0VDTSxFQ19ESVNDT05ORUNUKSA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgU01UX1A0MDBFIDoJCS8qIGZkZGlQT1JUQ29ubmVjdGlvblBvbGljaWVzICovCisJCWlmIChieXRlX3ZhbCA+IDEpCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYl9wLT5mZGRpUE9SVENvbm5lY3Rpb25Qb2xpY2llcyA9IGJ5dGVfdmFsKSA7CisJCWJyZWFrIDsKKwljYXNlIFNNVF9QNDAxMSA6CQkvKiBmZGRpUE9SVFJlcXVlc3RlZFBhdGhzICovCisJCS8qIGFsbCAzKjggYml0cyBhbGxvd2VkICovCisJCUlGU0VUKG1lbWNweSgoY2hhciAqKW1pYl9wLT5mZGRpUE9SVFJlcXVlc3RlZFBhdGhzLAorCQkJKGNoYXIgKikmbG9uZ192YWwsNCkpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1A0MDFGOgkJCS8qIGZkZGlQT1JUTWFpbnRfTFMgKi8KKwkJaWYgKHdvcmRfdmFsID4gNCkKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJSUZTRVQobWliX3AtPmZkZGlQT1JUTWFpbnRfTFMgPSB3b3JkX3ZhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfUDQwM0EgOgkJLyogZmRkaVBPUlRMZXJfQ3V0b2ZmICovCisJCWlmIChieXRlX3ZhbCA8IDQgfHwgYnl0ZV92YWwgPiAxNSkKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJSUZTRVQobWliX3AtPmZkZGlQT1JUTGVyX0N1dG9mZiA9IGJ5dGVfdmFsKSA7CisJCWJyZWFrIDsKKwljYXNlIFNNVF9QNDAzQiA6CQkvKiBmZGRpUE9SVExlcl9BbGFybSAqLworCQlpZiAoYnl0ZV92YWwgPCA0IHx8IGJ5dGVfdmFsID4gMTUpCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYl9wLT5mZGRpUE9SVExlcl9BbGFybSA9IGJ5dGVfdmFsKSA7CisJCWJyZWFrIDsKKworCS8qCisJICogQWN0aW9ucworCSAqLworCWNhc2UgU01UX1AxMDNDIDoJCS8qIGZkZGlTTVRTdGF0aW9uQWN0aW9uICovCisJCWlmIChzbXRfYWN0aW9uKHNtYyxTTVRfU1RBVElPTl9BQ1RJT04sIChpbnQpIHdvcmRfdmFsLCAwKSkKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1A0MDQ2OgkJCS8qIGZkZGlQT1JUQWN0aW9uICovCisJCWlmIChzbXRfYWN0aW9uKHNtYyxTTVRfUE9SVF9BQ1RJT04sIChpbnQpIHdvcmRfdmFsLAorCQkJcG9ydF90b19taWIoc21jLHBvcnQpKSkKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJYnJlYWsgOworCWRlZmF1bHQgOgorCQlicmVhayA7CisJfQorCXJldHVybigwKSA7CisKK3ZhbF9lcnJvcjoKKwkvKiBwYXJhbWV0ZXIgdmFsdWUgaW4gZnJhbWUgaXMgb3V0IG9mIHJhbmdlICovCisJcmV0dXJuKFNNVF9SREZfUkFOR0UpIDsKKworbGVuX2Vycm9yOgorCS8qIHBhcmFtZXRlciB2YWx1ZSBpbiBmcmFtZSBpcyB0b28gc2hvcnQgKi8KKwlyZXR1cm4oU01UX1JERl9MRU5HVEgpIDsKKworI2lmCTAKK25vX2F1dGhvcl9lcnJvcjoKKwkvKiBwYXJhbWV0ZXIgbm90IHNldGFibGUsIGJlY2F1c2UgdGhlIFNCQSBpcyBub3QgYWN0aXZlCisJICogUGxlYXNlIG5vdGU6IHdlIGdpdmUgdGhlIHJldHVybiBjb2RlICdub3QgYXV0aG9yaXplZWQKKwkgKiAgYmVjYXVzZSBTQkEgZGVuaWVkIGlzIG5vdCBhIHZhbGlkIHJldHVybiBjb2RlIGluIHRoZQorCSAqIFBNRiBwcm90b2NvbC4KKwkgKi8KKwlyZXR1cm4oU01UX1JERl9BVVRIT1IpIDsKKyNlbmRpZgorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNfcF90YWIgKnNtdF9nZXRfcHRhYih1X3Nob3J0IHBhcmEpCit7CisJY29uc3Qgc3RydWN0IHNfcF90YWIJKnB0IDsKKwlmb3IgKHB0ID0gcF90YWIgOyBwdC0+cF9udW0gJiYgcHQtPnBfbnVtICE9IHBhcmEgOyBwdCsrKQorCQk7CisJcmV0dXJuKHB0LT5wX251bSA/IHB0IDogTlVMTCkgOworfQorCitzdGF0aWMgaW50IHNtdF9taWJfcGh5cyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKyNpZmRlZglDT05DRU5UUkFUT1IKKwlTS19VTlVTRUQoc21jKSA7CisKKwlyZXR1cm4oTlVNUEhZUykgOworI2Vsc2UKKwlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKQorCQlyZXR1cm4oMSkgOworCXJldHVybihOVU1QSFlTKSA7CisjZW5kaWYKK30KKworaW50IHBvcnRfdG9fbWliKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcCkKK3sKKyNpZmRlZglDT05DRU5UUkFUT1IKKwlTS19VTlVTRUQoc21jKSA7CisKKwlyZXR1cm4ocCkgOworI2Vsc2UKKwlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKQorCQlyZXR1cm4oUFMpIDsKKwlyZXR1cm4ocCkgOworI2VuZGlmCit9CisKKworI2lmZGVmCURFQlVHCisjaWZuZGVmCUJPT1QKK3ZvaWQgZHVtcF9zbXQoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfaGVhZGVyICpzbSwgY2hhciAqdGV4dCkKK3sKKwlpbnQJbGVuIDsKKwlzdHJ1Y3Qgc210X3BhcmEJKnBhIDsKKwljaGFyCSpjIDsKKwlpbnQJbiA7CisJaW50CW5uIDsKKyNpZmRlZglMSVRUTEVfRU5ESUFOCisJaW50CXNtdGxlbiA7CisjZW5kaWYKKworCVNLX1VOVVNFRChzbWMpIDsKKworI2lmZGVmCURFQlVHX0JSRAorCWlmIChzbWMtPmRlYnVnLmRfc210ZiA8IDIpCisjZWxzZQorCWlmIChkZWJ1Zy5kX3NtdGYgPCAyKQorI2VuZGlmCisJCXJldHVybiA7CisjaWZkZWYJTElUVExFX0VORElBTgorCXNtdGxlbiA9IHNtLT5zbXRfbGVuICsgc2l6ZW9mKHN0cnVjdCBzbXRfaGVhZGVyKSA7CisjZW5kaWYKKwlwcmludGYoIlNNVCBGcmFtZSBbJXNdOlxuREEgICIsdGV4dCkgOworCWR1bXBfaGV4KChjaGFyICopICZzbS0+c210X2Rlc3QsNikgOworCXByaW50ZigiXHRTQSAiKSA7CisJZHVtcF9oZXgoKGNoYXIgKikgJnNtLT5zbXRfc291cmNlLDYpIDsKKwlwcmludGYoIiBDbGFzcyAleCBUeXBlICV4IFZlcnNpb24gJXhcbiIsCisJCXNtLT5zbXRfY2xhc3Msc20tPnNtdF90eXBlLHNtLT5zbXRfdmVyc2lvbikgIDsKKwlwcmludGYoIlRJRCAlbHhcdFx0U0lEICIsc20tPnNtdF90aWQpIDsKKwlkdW1wX2hleCgoY2hhciAqKSAmc20tPnNtdF9zaWQsOCkgOworCXByaW50ZigiIExFTiAleFxuIixzbS0+c210X2xlbikgOworCisJbGVuID0gc20tPnNtdF9sZW4gOworCXBhID0gKHN0cnVjdCBzbXRfcGFyYSAqKSAoc20gKyAxKSA7CisJd2hpbGUgKGxlbiA+IDAgKSB7CisJCWludAlwbGVuIDsKKyNpZmRlZiBVTklYCisJCXByaW50ZigiVFlQRSAleCBMRU4gJXggVkFMVUVcdCIscGEtPnBfdHlwZSxwYS0+cF9sZW4pIDsKKyNlbHNlCisJCXByaW50ZigiVFlQRSAlMDR4IExFTiAlMnggVkFMVUVcdCIscGEtPnBfdHlwZSxwYS0+cF9sZW4pIDsKKyNlbmRpZgorCQluID0gcGEtPnBfbGVuIDsKKwkJaWYgKCAobiA8IDAgKSB8fCAobiA+IChpbnQpKGxlbiAtIFBBUkFfTEVOKSkpIHsKKwkJCW4gPSBsZW4gLSBQQVJBX0xFTiA7CisJCQlwcmludGYoIiBCQUQgTEVOR1RIXG4iKSA7CisJCQlicmVhayA7CisJCX0KKyNpZmRlZglMSVRUTEVfRU5ESUFOCisJCXNtdF9zd2FwX3BhcmEoc20sc210bGVuLDApIDsKKyNlbmRpZgorCQlpZiAobiA8IDI0KSB7CisJCQlkdW1wX2hleCgoY2hhciAqKShwYSsxKSwoaW50KSBuKSA7CisJCQlwcmludGYoIlxuIikgOworCQl9CisJCWVsc2UgeworCQkJaW50CWZpcnN0ID0gMCA7CisJCQljID0gKGNoYXIgKikocGErMSkgOworCQkJZHVtcF9oZXgoYywxNikgOworCQkJcHJpbnRmKCJcbiIpIDsKKwkJCW4gLT0gMTYgOworCQkJYyArPSAxNiA7CisJCQl3aGlsZSAobiA+IDApIHsKKwkJCQlubiA9IChuID4gMTYpID8gMTYgOiBuIDsKKwkJCQlpZiAobiA+IDY0KSB7CisJCQkJCWlmIChmaXJzdCA9PSAwKQorCQkJCQkJcHJpbnRmKCJcdFx0XHQuLi5cbiIpIDsKKwkJCQkJZmlyc3QgPSAxIDsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXByaW50ZigiXHRcdFx0IikgOworCQkJCQlkdW1wX2hleChjLG5uKSA7CisJCQkJCXByaW50ZigiXG4iKSA7CisJCQkJfQorCQkJCW4gLT0gbm4gOworCQkJCWMgKz0gMTYgOworCQkJfQorCQl9CisjaWZkZWYJTElUVExFX0VORElBTgorCQlzbXRfc3dhcF9wYXJhKHNtLHNtdGxlbiwxKSA7CisjZW5kaWYKKwkJcGxlbiA9IChwYS0+cF9sZW4gKyBQQVJBX0xFTiArIDMpICYgfjMgOworCQlsZW4gLT0gcGxlbiA7CisJCXBhID0gKHN0cnVjdCBzbXRfcGFyYSAqKSgoY2hhciAqKXBhICsgcGxlbikgOworCX0KKwlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIikgOworfQorCit2b2lkIGR1bXBfaGV4KGNoYXIgKnAsIGludCBsZW4pCit7CisJaW50CW4gPSAwIDsKKwl3aGlsZSAobGVuLS0pIHsKKwkJbisrIDsKKyNpZmRlZiBVTklYCisJCXByaW50ZigiJXglcyIsKnArKyAmIDB4ZmYsbGVuID8gKCAobiAmIDcpID8gIiAiIDogIi0iKSA6ICIiKSA7CisjZWxzZQorCQlwcmludGYoIiUwMnglcyIsKnArKyAmIDB4ZmYsbGVuID8gKCAobiAmIDcpID8gIiAiIDogIi0iKSA6ICIiKSA7CisjZW5kaWYKKwl9Cit9CisjZW5kaWYJLyogbm8gQk9PVCAqLworI2VuZGlmCS8qIERFQlVHICovCisKKworI2VuZGlmCS8qIG5vIFNMSU1fU01UICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL3F1ZXVlLmMgYi9kcml2ZXJzL25ldC9za2ZwL3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlhZGIzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvcXVldWUuYwpAQCAtMCwwICsxLDE3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVNlZSB0aGUgZmlsZSAic2tmZGRpLmMiIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKwlTTVQgRXZlbnQgUXVldWUgTWFuYWdlbWVudAorKi8KKworI2luY2x1ZGUgImgvdHlwZXMuaCIKKyNpbmNsdWRlICJoL2ZkZGkuaCIKKyNpbmNsdWRlICJoL3NtYy5oIgorCisjaWZuZGVmCWxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIElEX3NjY3NbXSA9ICJAKCMpcXVldWUuYwkyLjkgOTcvMDgvMDQgKEMpIFNLICIgOworI2VuZGlmCisKKyNkZWZpbmUgUFJJTlRGKGEsYixjKQorCisvKgorICogaW5pdCBldmVudCBxdWV1ZSBtYW5hZ2VtZW50CisgKi8KK3ZvaWQgZXZfaW5pdChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzbWMtPnEuZXZfcHV0ID0gc21jLT5xLmV2X2dldCA9IHNtYy0+cS5ldl9xdWV1ZSA7Cit9CisKKy8qCisgKiBhZGQgZXZlbnQgdG8gcXVldWUKKyAqLwordm9pZCBxdWV1ZV9ldmVudChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGNsYXNzLCBpbnQgZXZlbnQpCit7CisJUFJJTlRGKCJxdWV1ZSBjbGFzcyAlZCBldmVudCAlZFxuIixjbGFzcyxldmVudCkgOworCXNtYy0+cS5ldl9wdXQtPmNsYXNzID0gY2xhc3MgOworCXNtYy0+cS5ldl9wdXQtPmV2ZW50ID0gZXZlbnQgOworCWlmICgrK3NtYy0+cS5ldl9wdXQgPT0gJnNtYy0+cS5ldl9xdWV1ZVtNQVhfRVZFTlRdKQorCQlzbWMtPnEuZXZfcHV0ID0gc21jLT5xLmV2X3F1ZXVlIDsKKworCWlmIChzbWMtPnEuZXZfcHV0ID09IHNtYy0+cS5ldl9nZXQpIHsKKwkJU01UX0VSUl9MT0coc21jLFNNVF9FMDEzNywgU01UX0UwMTM3X01TRykgOworCX0KK30KKworLyoKKyAqIHRpbWVyX2V2ZW50IGlzIGNhbGxlZCBmcm9tIEhXIHRpbWVyIHBhY2thZ2UuCisgKi8KK3ZvaWQgdGltZXJfZXZlbnQoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyB0b2tlbikKK3sKKwlQUklOVEYoInRpbWVyIGV2ZW50IGNsYXNzICVkIHRva2VuICVkXG4iLAorCQlFVl9UX0NMQVNTKHRva2VuKSwKKwkJRVZfVF9FVkVOVCh0b2tlbikpIDsKKwlxdWV1ZV9ldmVudChzbWMsRVZfVF9DTEFTUyh0b2tlbiksRVZfVF9FVkVOVCh0b2tlbikpOworfQorCisvKgorICogZXZlbnQgZGlzcGF0Y2hlcgorICoJd2hpbGUgZXZlbnQgcXVldWUgaXMgbm90IGVtcHR5CisgKgkJZ2V0IGV2ZW50IGZyb20gcXVldWUKKyAqCQlzZW5kIGNvbW1hbmQgdG8gc3RhdGUgbWFjaGluZQorICoJZW5kCisgKi8KK3ZvaWQgZXZfZGlzcGF0Y2hlcihzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3QgZXZlbnRfcXVldWUgKmV2IDsJLyogcG9pbnRlciBpbnRvIHF1ZXVlICovCisJaW50CQljbGFzcyA7CisKKwlldiA9IHNtYy0+cS5ldl9nZXQgOworCVBSSU5URigiZGlzcGF0Y2ggZ2V0ICV4IHB1dCAleFxuIixldixzbWMtPnEuZXZfcHV0KSA7CisJd2hpbGUgKGV2ICE9IHNtYy0+cS5ldl9wdXQpIHsKKwkJUFJJTlRGKCJkaXNwYXRjaCBjbGFzcyAlZCBldmVudCAlZFxuIixldi0+Y2xhc3MsZXYtPmV2ZW50KSA7CisJCXN3aXRjaChjbGFzcyA9IGV2LT5jbGFzcykgeworCQljYXNlIEVWRU5UX0VDTSA6CQkvKiBFbnRpdHkgQ29yb3JkaW5hdGlvbiAgTWFuLiAqLworCQkJZWNtKHNtYywoaW50KWV2LT5ldmVudCkgOworCQkJYnJlYWsgOworCQljYXNlIEVWRU5UX0NGTSA6CQkvKiBDb25maWd1cmF0aW9uIE1hbi4gKi8KKwkJCWNmbShzbWMsKGludClldi0+ZXZlbnQpIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBFVkVOVF9STVQgOgkJLyogUmluZyBNYW4uICovCisJCQlybXQoc21jLChpbnQpZXYtPmV2ZW50KSA7CisJCQlicmVhayA7CisJCWNhc2UgRVZFTlRfU01UIDoKKwkJCXNtdF9ldmVudChzbWMsKGludClldi0+ZXZlbnQpIDsKKwkJCWJyZWFrIDsKKyNpZmRlZglDT05DRU5UUkFUT1IKKwkJY2FzZSA5OSA6CisJCQl0aW1lcl90ZXN0X2V2ZW50KHNtYywoaW50KWV2LT5ldmVudCkgOworCQkJYnJlYWsgOworI2VuZGlmCisJCWNhc2UgRVZFTlRfUENNQSA6CQkvKiBQSFkgQSAqLworCQljYXNlIEVWRU5UX1BDTUIgOgkJLyogUEhZIEIgKi8KKwkJZGVmYXVsdCA6CisJCQlpZiAoY2xhc3MgPj0gRVZFTlRfUENNQSAmJgorCQkJICAgIGNsYXNzIDwgRVZFTlRfUENNQSArIE5VTVBIWVMpIHsKKwkJCQlwY20oc21jLGNsYXNzIC0gRVZFTlRfUENNQSwoaW50KWV2LT5ldmVudCkgOworCQkJCWJyZWFrIDsKKwkJCX0KKwkJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTIxLCBTTVRfRTAxMjFfTVNHKSA7CisJCQlyZXR1cm4gOworCQl9CisKKwkJaWYgKCsrZXYgPT0gJnNtYy0+cS5ldl9xdWV1ZVtNQVhfRVZFTlRdKQorCQkJZXYgPSBzbWMtPnEuZXZfcXVldWUgOworCisJCS8qIFJlbmV3IGdldDogaXQgaXMgdXNlZCBpbiBxdWV1ZV9ldmVudHMgdG8gZGV0ZWN0IG92ZXJydW5zICovCisJCXNtYy0+cS5ldl9nZXQgPSBldjsKKwl9Cit9CisKKy8qCisgKiBzbXRfb25saW5lIGNvbm5lY3RzIHRvIG9yIGRpc2Nvbm5lY3RzIGZyb20gdGhlIHJpbmcKKyAqIE1VU1QgYmUgY2FsbGVkIHRvIGluaXRpYXRlIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudAorICoKKyAqCW9uCTAJZGlzY29ubmVjdAorICoJb24JMQljb25uZWN0CisgKi8KK3Vfc2hvcnQgc210X29ubGluZShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG9uKQoreworCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9FQ00sb24gPyBFQ19DT05ORUNUIDogRUNfRElTQ09OTkVDVCkgOworCWV2X2Rpc3BhdGNoZXIoc21jKSA7CisJcmV0dXJuKHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSkgOworfQorCisvKgorICogc2V0IFNNVCBmbGFnIHRvIHZhbHVlCisgKglmbGFnCQlmbGFnIG5hbWUKKyAqCXZhbHVlCQlmbGFnIHZhbHVlCisgKiBkdW1wIGN1cnJlbnQgZmxhZyBzZXR0aW5nCisgKi8KKyNpZmRlZglDT05DRU5UUkFUT1IKK3ZvaWQgZG9fc210X2ZsYWcoc3RydWN0IHNfc21jICpzbWMsIGNoYXIgKmZsYWcsIGludCB2YWx1ZSkKK3sKKyNpZmRlZglERUJVRworCXN0cnVjdCBzbXRfZGVidWcJKmRlYjsKKworCVNLX1VOVVNFRChzbWMpIDsKKworI2lmZGVmCURFQlVHX0JSRAorCWRlYiA9ICZzbWMtPmRlYnVnOworI2Vsc2UKKwlkZWIgPSAmZGVidWc7CisjZW5kaWYKKwlpZiAoIXN0cmNtcChmbGFnLCJzbXQiKSkKKwkJZGViLT5kX3NtdCA9IHZhbHVlIDsKKwllbHNlIGlmICghc3RyY21wKGZsYWcsInNtdGYiKSkKKwkJZGViLT5kX3NtdGYgPSB2YWx1ZSA7CisJZWxzZSBpZiAoIXN0cmNtcChmbGFnLCJwY20iKSkKKwkJZGViLT5kX3BjbSA9IHZhbHVlIDsKKwllbHNlIGlmICghc3RyY21wKGZsYWcsInJtdCIpKQorCQlkZWItPmRfcm10ID0gdmFsdWUgOworCWVsc2UgaWYgKCFzdHJjbXAoZmxhZywiY2ZtIikpCisJCWRlYi0+ZF9jZm0gPSB2YWx1ZSA7CisJZWxzZSBpZiAoIXN0cmNtcChmbGFnLCJlY20iKSkKKwkJZGViLT5kX2VjbSA9IHZhbHVlIDsKKwlwcmludGYoInNtdAklZFxuIixkZWItPmRfc210KSA7CisJcHJpbnRmKCJzbXRmCSVkXG4iLGRlYi0+ZF9zbXRmKSA7CisJcHJpbnRmKCJwY20JJWRcbiIsZGViLT5kX3BjbSkgOworCXByaW50Zigicm10CSVkXG4iLGRlYi0+ZF9ybXQpIDsKKwlwcmludGYoImNmbQklZFxuIixkZWItPmRfY2ZtKSA7CisJcHJpbnRmKCJlY20JJWRcbiIsZGViLT5kX2VjbSkgOworI2VuZGlmCS8qIERFQlVHICovCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvcm10LmMgYi9kcml2ZXJzL25ldC9za2ZwL3JtdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOGQ1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL3JtdC5jCkBAIC0wLDAgKzEsNjU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCVNNVCBSTVQKKwlSaW5nIE1hbmFnZW1lbnQKKyovCisKKy8qCisgKiBIYXJkd2FyZSBpbmRlcGVuZGVudCBzdGF0ZSBtYWNoaW5lIGltcGxlbWFudGF0aW9uCisgKiBUaGUgZm9sbG93aW5nIGV4dGVybmFsIFNNVCBmdW5jdGlvbnMgYXJlIHJlZmVyZW5jZWQgOgorICoKKyAqIAkJcXVldWVfZXZlbnQoKQorICogCQlzbXRfdGltZXJfc3RhcnQoKQorICogCQlzbXRfdGltZXJfc3RvcCgpCisgKgorICogCVRoZSBmb2xsb3dpbmcgZXh0ZXJuYWwgSFcgZGVwZW5kZW50IGZ1bmN0aW9ucyBhcmUgcmVmZXJlbmNlZCA6CisgKgkJc21fbWFfY29udHJvbCgpCisgKgkJc21fbWFjX2NoZWNrX2JlYWNvbl9jbGFpbSgpCisgKgorICogCVRoZSBmb2xsb3dpbmcgSFcgZGVwZW5kZW50IGV2ZW50cyBhcmUgcmVxdWlyZWQgOgorICoJCVJNX1JJTkdfT1AKKyAqCQlSTV9SSU5HX05PTl9PUAorICoJCVJNX01ZX0JFQUNPTgorICoJCVJNX09USEVSX0JFQUNPTgorICoJCVJNX01ZX0NMQUlNCisgKgkJUk1fVFJUX0VYUAorICoJCVJNX1ZBTElEX0NMQUlNCisgKgorICovCisKKyNpbmNsdWRlICJoL3R5cGVzLmgiCisjaW5jbHVkZSAiaC9mZGRpLmgiCisjaW5jbHVkZSAiaC9zbWMuaCIKKworI2RlZmluZSBLRVJORUwKKyNpbmNsdWRlICJoL3NtdHN0YXRlLmgiCisKKyNpZm5kZWYJbGludAorc3RhdGljIGNvbnN0IGNoYXIgSURfc2Njc1tdID0gIkAoIylybXQuYwkyLjEzIDk5LzA3LzAyIChDKSBTSyAiIDsKKyNlbmRpZgorCisvKgorICogRlNNIE1hY3JvcworICovCisjZGVmaW5lIEFGTEFHCTB4MTAKKyNkZWZpbmUgR09fU1RBVEUoeCkJKHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1JNVFN0YXRlID0gKHgpfEFGTEFHKQorI2RlZmluZSBBQ1RJT05TX0RPTkUoKQkoc21jLT5taWIubVtNQUMwXS5mZGRpTUFDUk1UU3RhdGUgJj0gfkFGTEFHKQorI2RlZmluZSBBQ1RJT05TKHgpCSh4fEFGTEFHKQorCisjZGVmaW5lIFJNMF9JU09MQVRFRAkwCisjZGVmaW5lIFJNMV9OT05fT1AJMQkJLyogbm90IG9wZXJhdGlvbmFsICovCisjZGVmaW5lIFJNMl9SSU5HX09QCTIJCS8qIHJpbmcgb3BlcmF0aW9uYWwgKi8KKyNkZWZpbmUgUk0zX0RFVEVDVAkzCQkvKiBkZXRlY3QgZHVwbCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgUk00X05PTl9PUF9EVVAJNAkJLyogZHVwbC4gYWRkciBkZXRlY3RlZCAqLworI2RlZmluZSBSTTVfUklOR19PUF9EVVAJNQkJLyogcmluZyBvcGVyLiB3aXRoIGR1cGwuIGFkZHIgKi8KKyNkZWZpbmUgUk02X0RJUkVDVEVECTYJCS8qIHNlbmRpbmcgZGlyZWN0ZWQgYmVhY29ucyAqLworI2RlZmluZSBSTTdfVFJBQ0UJNwkJLyogdHJhY2UgaW5pdGlhdGVkICovCisKKyNpZmRlZglERUJVRworLyoKKyAqIHN5bWJvbGljIHN0YXRlIG5hbWVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgcm10X3N0YXRlc1tdID0geworCSJSTTBfSVNPTEFURUQiLCJSTTFfTk9OX09QIiwiUk0yX1JJTkdfT1AiLCJSTTNfREVURUNUIiwKKwkiUk00X05PTl9PUF9EVVAiLCJSTTVfUklOR19PUF9EVVAiLCJSTTZfRElSRUNURUQiLAorCSJSTTdfVFJBQ0UiCit9IDsKKworLyoKKyAqIHN5bWJvbGljIGV2ZW50IG5hbWVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgcm10X2V2ZW50c1tdID0geworCSJOT05FIiwiUk1fUklOR19PUCIsIlJNX1JJTkdfTk9OX09QIiwiUk1fTVlfQkVBQ09OIiwKKwkiUk1fT1RIRVJfQkVBQ09OIiwiUk1fTVlfQ0xBSU0iLCJSTV9UUlRfRVhQIiwiUk1fVkFMSURfQ0xBSU0iLAorCSJSTV9KT0lOIiwiUk1fTE9PUCIsIlJNX0RVUF9BRERSIiwiUk1fRU5BQkxFX0ZMQUciLAorCSJSTV9USU1FT1VUX05PTl9PUCIsIlJNX1RJTUVPVVRfVF9TVFVDSyIsCisJIlJNX1RJTUVPVVRfQU5OT1VOQ0UiLCJSTV9USU1FT1VUX1RfRElSRUNUIiwKKwkiUk1fVElNRU9VVF9EX01BWCIsIlJNX1RJTUVPVVRfUE9MTCIsIlJNX1RYX1NUQVRFX0NIQU5HRSIKK30gOworI2VuZGlmCisKKy8qCisgKiBHbG9iYWxzCisgKiBpbiBzdHJ1Y3Qgc19ybXQKKyAqLworCisKKy8qCisgKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHZvaWQgcm10X2ZzbShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGNtZCk7CitzdGF0aWMgdm9pZCBzdGFydF9ybXRfdGltZXIwKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdmFsdWUsIGludCBldmVudCk7CitzdGF0aWMgdm9pZCBzdGFydF9ybXRfdGltZXIxKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdmFsdWUsIGludCBldmVudCk7CitzdGF0aWMgdm9pZCBzdGFydF9ybXRfdGltZXIyKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdmFsdWUsIGludCBldmVudCk7CitzdGF0aWMgdm9pZCBzdG9wX3JtdF90aW1lcjAoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgc3RvcF9ybXRfdGltZXIxKHN0cnVjdCBzX3NtYyAqc21jKTsKK3N0YXRpYyB2b2lkIHN0b3Bfcm10X3RpbWVyMihzdHJ1Y3Qgc19zbWMgKnNtYyk7CitzdGF0aWMgdm9pZCBybXRfZHVwX2FjdGlvbnMoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgcm10X3JlaW5zZXJ0X2FjdGlvbnMoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgcm10X2xlYXZlX2FjdGlvbnMoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgcm10X25ld19kdXBfYWN0aW9ucyhzdHJ1Y3Qgc19zbWMgKnNtYyk7CisKKyNpZm5kZWYgU1VQRVJORVRfMworZXh0ZXJuIHZvaWQgcmVzdGFydF90cnRfZm9yX2RiY24oKSA7CisjZW5kaWYgLypTVVBFUk5FVF8zKi8KKworLyoKKwlpbml0IFJNVCBzdGF0ZSBtYWNoaW5lCisJY2xlYXIgYWxsIFJNVCB2YXJzIGFuZCBmbGFncworKi8KK3ZvaWQgcm10X2luaXQoc3RydWN0IHNfc21jICpzbWMpCit7CisJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDUk1UU3RhdGUgPSBBQ1RJT05TKFJNMF9JU09MQVRFRCkgOworCXNtYy0+ci5kdXBfYWRkcl90ZXN0ID0gREFfTk9ORSA7CisJc21jLT5yLmRhX2ZsYWcgPSAwIDsKKwlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNNQV9Vbml0ZGF0YUF2YWlsYWJsZSA9IEZBTFNFIDsKKwlzbWMtPnIuc21fbWFfYXZhaWwgPSBGQUxTRSA7CisJc21jLT5yLmxvb3BfYXZhaWwgPSAwIDsKKwlzbWMtPnIuYm5fZmxhZyA9IDAgOworCXNtYy0+ci5qbV9mbGFnID0gMCA7CisJc21jLT5yLm5vX2ZsYWcgPSBUUlVFIDsKK30KKworLyoKKwlSTVQgc3RhdGUgbWFjaGluZQorCWNhbGxlZCBieSBkaXNwYXRjaGVyCisKKwlkbworCQlkaXNwbGF5IHN0YXRlIGNoYW5nZQorCQlwcm9jZXNzIGV2ZW50CisJdW50aWwgU00gaXMgc3RhYmxlCisqLwordm9pZCBybXQoc3RydWN0IHNfc21jICpzbWMsIGludCBldmVudCkKK3sKKwlpbnQJc3RhdGUgOworCisJZG8geworCQlEQl9STVQoIlJNVCA6IHN0YXRlICVzJXMiLAorCQkJKHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1JNVFN0YXRlICYgQUZMQUcpID8gIkFDVElPTlMgIiA6ICIiLAorCQkJcm10X3N0YXRlc1tzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNSTVRTdGF0ZSAmIH5BRkxBR10pIDsKKwkJREJfUk1UKCIgZXZlbnQgJXNcbiIscm10X2V2ZW50c1tldmVudF0sMCkgOworCQlzdGF0ZSA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1JNVFN0YXRlIDsKKwkJcm10X2ZzbShzbWMsZXZlbnQpIDsKKwkJZXZlbnQgPSAwIDsKKwl9IHdoaWxlIChzdGF0ZSAhPSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNSTVRTdGF0ZSkgOworCXJtdF9zdGF0ZV9jaGFuZ2Uoc21jLChpbnQpc21jLT5taWIubVtNQUMwXS5mZGRpTUFDUk1UU3RhdGUpIDsKK30KKworLyoKKwlwcm9jZXNzIFJNVCBldmVudAorKi8KK3N0YXRpYyB2b2lkIHJtdF9mc20oc3RydWN0IHNfc21jICpzbWMsIGludCBjbWQpCit7CisJLyoKKwkgKiBSTTAwLVJNNzAgOiBmcm9tIGFsbCBzdGF0ZXMKKwkgKi8KKwlpZiAoIXNtYy0+ci5ybV9qb2luICYmICFzbWMtPnIucm1fbG9vcCAmJgorCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNSTVRTdGF0ZSAhPSBBQ1RJT05TKFJNMF9JU09MQVRFRCkgJiYKKwkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDUk1UU3RhdGUgIT0gUk0wX0lTT0xBVEVEKSB7CisJCVJTX1NFVChzbWMsUlNfTk9SSU5HT1ApIDsKKwkJcm10X2luZGljYXRpb24oc21jLDApIDsKKwkJR09fU1RBVEUoUk0wX0lTT0xBVEVEKSA7CisJCXJldHVybiA7CisJfQorCisJc3dpdGNoKHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1JNVFN0YXRlKSB7CisJY2FzZSBBQ1RJT05TKFJNMF9JU09MQVRFRCkgOgorCQlzdG9wX3JtdF90aW1lcjAoc21jKSA7CisJCXN0b3Bfcm10X3RpbWVyMShzbWMpIDsKKwkJc3RvcF9ybXRfdGltZXIyKHNtYykgOworCisJCS8qCisJCSAqIERpc2FibGUgTUFDLgorCQkgKi8KKwkJc21fbWFfY29udHJvbChzbWMsTUFfT0ZGTElORSkgOworCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNNQV9Vbml0ZGF0YUF2YWlsYWJsZSA9IEZBTFNFIDsKKwkJc21jLT5yLmxvb3BfYXZhaWwgPSBGQUxTRSA7CisJCXNtYy0+ci5zbV9tYV9hdmFpbCA9IEZBTFNFIDsKKwkJc21jLT5yLm5vX2ZsYWcgPSBUUlVFIDsKKwkJREJfUk1UTigxLCJSTVQgOiBJU09MQVRFRFxuIiwwLDApIDsKKwkJQUNUSU9OU19ET05FKCkgOworCQlicmVhayA7CisJY2FzZSBSTTBfSVNPTEFURUQgOgorCQkvKlJNMDEqLworCQlpZiAoc21jLT5yLnJtX2pvaW4gfHwgc21jLT5yLnJtX2xvb3ApIHsKKwkJCS8qCisJCQkgKiBBY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkIHRoZSBNQUMgbXVzdCBiZSByZXNldAorCQkJICogaGVyZS4gVGhlIEZPUk1BQyB3aWxsIGJlIGluaXRpYWxpemVkIGFuZCBDbGFpbQorCQkJICogYW5kIEJlYWNvbiBGcmFtZXMgd2lsbCBiZSB1cGxvYWRlZCB0byB0aGUgTUFDLgorCQkJICogU28gYW55IGNoYW5nZSBvZiBUcmVxIHdpbGwgdGFrZSBlZmZlY3QgTk9XLgorCQkJICovCisJCQlzbV9tYV9jb250cm9sKHNtYyxNQV9SRVNFVCkgOworCQkJR09fU1RBVEUoUk0xX05PTl9PUCkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoUk0xX05PTl9PUCkgOgorCQlzdGFydF9ybXRfdGltZXIwKHNtYyxzbWMtPnMucm10X3Rfbm9uX29wLFJNX1RJTUVPVVRfTk9OX09QKSA7CisJCXN0b3Bfcm10X3RpbWVyMShzbWMpIDsKKwkJc3RvcF9ybXRfdGltZXIyKHNtYykgOworCQlzbV9tYV9jb250cm9sKHNtYyxNQV9CRUFDT04pIDsKKwkJREJfUk1UTigxLCJSTVQgOiBSSU5HIERPV05cbiIsMCwwKSA7CisJCVJTX1NFVChzbWMsUlNfTk9SSU5HT1ApIDsKKwkJc21jLT5yLnNtX21hX2F2YWlsID0gRkFMU0UgOworCQlybXRfaW5kaWNhdGlvbihzbWMsMCkgOworCQlBQ1RJT05TX0RPTkUoKSA7CisJCWJyZWFrIDsKKwljYXNlIFJNMV9OT05fT1AgOgorCQkvKlJNMTIqLworCQlpZiAoY21kID09IFJNX1JJTkdfT1ApIHsKKwkJCVJTX1NFVChzbWMsUlNfUklOR09QQ0hBTkdFKSA7CisJCQlHT19TVEFURShSTTJfUklOR19PUCkgOworCQkJYnJlYWsgOworCQl9CisJCS8qUk0xMyovCisJCWVsc2UgaWYgKGNtZCA9PSBSTV9USU1FT1VUX05PTl9PUCkgeworCQkJc21jLT5yLmJuX2ZsYWcgPSBGQUxTRSA7CisJCQlzbWMtPnIubm9fZmxhZyA9IFRSVUUgOworCQkJR09fU1RBVEUoUk0zX0RFVEVDVCkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoUk0yX1JJTkdfT1ApIDoKKwkJc3RvcF9ybXRfdGltZXIwKHNtYykgOworCQlzdG9wX3JtdF90aW1lcjEoc21jKSA7CisJCXN0b3Bfcm10X3RpbWVyMihzbWMpIDsKKwkJc21jLT5yLm5vX2ZsYWcgPSBGQUxTRSA7CisJCWlmIChzbWMtPnIucm1fbG9vcCkKKwkJCXNtYy0+ci5sb29wX2F2YWlsID0gVFJVRSA7CisJCWlmIChzbWMtPnIucm1fam9pbikgeworCQkJc21jLT5yLnNtX21hX2F2YWlsID0gVFJVRSA7CisJCQlpZiAoc21jLT5taWIubVtNQUMwXS5mZGRpTUFDTUFfVW5pdGRhdGFFbmFibGUpCisJCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNNQV9Vbml0ZGF0YUF2YWlsYWJsZSA9IFRSVUUgOworCQkJCWVsc2UKKwkJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ01BX1VuaXRkYXRhQXZhaWxhYmxlID0gRkFMU0UgOworCQl9CisJCURCX1JNVE4oMSwiUk1UIDogUklORyBVUFxuIiwwLDApIDsKKwkJUlNfQ0xFQVIoc21jLFJTX05PUklOR09QKSA7CisJCVJTX1NFVChzbWMsUlNfUklOR09QQ0hBTkdFKSA7CisJCXJtdF9pbmRpY2F0aW9uKHNtYywxKSA7CisJCXNtdF9zdGF0X2NvdW50ZXIoc21jLDApIDsKKwkJQUNUSU9OU19ET05FKCkgOworCQlicmVhayA7CisJY2FzZSBSTTJfUklOR19PUCA6CisJCS8qUk0yMSovCisJCWlmIChjbWQgPT0gUk1fUklOR19OT05fT1ApIHsKKwkJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ01BX1VuaXRkYXRhQXZhaWxhYmxlID0gRkFMU0UgOworCQkJc21jLT5yLmxvb3BfYXZhaWwgPSBGQUxTRSA7CisJCQlSU19TRVQoc21jLFJTX1JJTkdPUENIQU5HRSkgOworCQkJR09fU1RBVEUoUk0xX05PTl9PUCkgOworCQkJYnJlYWsgOworCQl9CisJCS8qUk0yMmEqLworCQllbHNlIGlmIChjbWQgPT0gUk1fRU5BQkxFX0ZMQUcpIHsKKwkJCWlmIChzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNNQV9Vbml0ZGF0YUVuYWJsZSkKKwkJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ01BX1VuaXRkYXRhQXZhaWxhYmxlID0gVFJVRSA7CisJCQkJZWxzZQorCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDTUFfVW5pdGRhdGFBdmFpbGFibGUgPSBGQUxTRSA7CisJCX0KKwkJLypSTTI1Ki8KKwkJZWxzZSBpZiAoc21jLT5yLmR1cF9hZGRyX3Rlc3QgPT0gREFfRkFJTEVEKSB7CisJCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNNQV9Vbml0ZGF0YUF2YWlsYWJsZSA9IEZBTFNFIDsKKwkJCXNtYy0+ci5sb29wX2F2YWlsID0gRkFMU0UgOworCQkJc21jLT5yLmRhX2ZsYWcgPSBUUlVFIDsKKwkJCUdPX1NUQVRFKFJNNV9SSU5HX09QX0RVUCkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoUk0zX0RFVEVDVCkgOgorCQlzdGFydF9ybXRfdGltZXIwKHNtYyxzbWMtPnMubWFjX2RfbWF4KjIsUk1fVElNRU9VVF9EX01BWCkgOworCQlzdGFydF9ybXRfdGltZXIxKHNtYyxzbWMtPnMucm10X3Rfc3R1Y2ssUk1fVElNRU9VVF9UX1NUVUNLKSA7CisJCXN0YXJ0X3JtdF90aW1lcjIoc21jLHNtYy0+cy5ybXRfdF9wb2xsLFJNX1RJTUVPVVRfUE9MTCkgOworCQlzbV9tYWNfY2hlY2tfYmVhY29uX2NsYWltKHNtYykgOworCQlEQl9STVROKDEsIlJNVCA6IFJNM19ERVRFQ1RcbiIsMCwwKSA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWsgOworCWNhc2UgUk0zX0RFVEVDVCA6CisJCWlmIChjbWQgPT0gUk1fVElNRU9VVF9QT0xMKSB7CisJCQlzdGFydF9ybXRfdGltZXIyKHNtYyxzbWMtPnMucm10X3RfcG9sbCxSTV9USU1FT1VUX1BPTEwpOworCQkJc21fbWFjX2NoZWNrX2JlYWNvbl9jbGFpbShzbWMpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlpZiAoY21kID09IFJNX1RJTUVPVVRfRF9NQVgpIHsKKwkJCXNtYy0+ci50aW1lcjBfZXhwID0gVFJVRSA7CisJCX0KKwkJLyoKKwkJICpqZCgyMi1GZWItMTk5OSkKKwkJICogV2UgbmVlZCBhIHRpbWUgIj49IDIqbWFjX2RfbWF4IiBzaW5jZSB3ZSBoYWQgZmluaXNoZWQKKwkJICogQ2xhaW0gb3IgQmVhY29uIHN0YXRlLiBTbyB3ZSB3aWxsIHJlc3RhcnQgdGltZXIwIGF0CisJCSAqIGV2ZXJ5IHN0YXRlIGNoYW5nZS4KKwkJICovCisJCWlmIChjbWQgPT0gUk1fVFhfU1RBVEVfQ0hBTkdFKSB7CisJCQlzdGFydF9ybXRfdGltZXIwKHNtYywKKwkJCQkJIHNtYy0+cy5tYWNfZF9tYXgqMiwKKwkJCQkJIFJNX1RJTUVPVVRfRF9NQVgpIDsKKwkJfQorCQkvKlJNMzIqLworCQlpZiAoY21kID09IFJNX1JJTkdfT1ApIHsKKwkJCUdPX1NUQVRFKFJNMl9SSU5HX09QKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypSTTMzYSovCisJCWVsc2UgaWYgKChjbWQgPT0gUk1fTVlfQkVBQ09OIHx8IGNtZCA9PSBSTV9PVEhFUl9CRUFDT04pCisJCQkmJiBzbWMtPnIuYm5fZmxhZykgeworCQkJc21jLT5yLmJuX2ZsYWcgPSBGQUxTRSA7CisJCX0KKwkJLypSTTMzYiovCisJCWVsc2UgaWYgKGNtZCA9PSBSTV9UUlRfRVhQICYmICFzbWMtPnIuYm5fZmxhZykgeworCQkJaW50CXR4IDsKKwkJCS8qCisJCQkgKiBzZXQgYm5fZmxhZyBvbmx5IGlmIGluIHN0YXRlIFQ0IG9yIFQ1OgorCQkJICogb25seSBpZiB3ZSdyZSB0aGUgYmVhY29uZXIgc2hvdWxkIHdlIHN0YXJ0IHRoZQorCQkJICogdHJhY2UgIQorCQkJICovCisJCQlpZiAoKHR4ID0gIHNtX21hY19nZXRfdHhfc3RhdGUoc21jKSkgPT0gNCB8fCB0eCA9PSA1KSB7CisJCQlEQl9STVROKDIsIlJNVCA6IERFVEVDVCAmJiBUUlRfRVhQSVJFRCAmJiBUNC9UNVxuIiwwLDApOworCQkJCXNtYy0+ci5ibl9mbGFnID0gVFJVRSA7CisJCQkJLyoKKwkJCQkgKiBJZiBvbmUgb2YgdGhlIHVwc3RyZWFtIHN0YXRpb25zIGJlYWNvbmVkCisJCQkJICogYW5kIHRoZSBsaW5rIHRvIHRoZSB1cHN0cmVhbSBuZWlnaGJvciBpcworCQkJCSAqIGxvc3Qgd2UgbmVlZCB0byByZXN0YXJ0IHRoZSBzdHVjayB0aW1lciB0bworCQkJCSAqIGNoZWNrIHRoZSAic3R1Y2sgYmVhY29uIiBjb25kaXRpb24uCisJCQkJICovCisJCQkJc3RhcnRfcm10X3RpbWVyMShzbWMsc21jLT5zLnJtdF90X3N0dWNrLAorCQkJCQlSTV9USU1FT1VUX1RfU1RVQ0spIDsKKwkJCX0KKwkJCS8qCisJCQkgKiBXZSBkbyBOT1QgbmVlZCB0byBjbGVhciBzbWMtPnIuYm5fZmxhZyBpbiBjYXNlIG9mCisJCQkgKiBub3QgYmVpbmcgaW4gc3RhdGUgVDQgb3IgVDUsIGJlY2F1c2UgdGhlIGZsYWcKKwkJCSAqIG11c3QgYmUgY2xlYXJlZCBpbiBvcmRlciB0byBnZXQgaW4gdGhpcyBjb25kaXRpb24uCisJCQkgKi8KKworCQkJREJfUk1UTigyLAorCQkJIlJNVCA6IHNtX21hY19nZXRfdHhfc3RhdGUoKSA9ICVkIChibl9mbGFnID0gJWQpXG4iLAorCQkJdHgsc21jLT5yLmJuX2ZsYWcpIDsKKwkJfQorCQkvKlJNMzRhKi8KKwkJZWxzZSBpZiAoY21kID09IFJNX01ZX0NMQUlNICYmIHNtYy0+ci50aW1lcjBfZXhwKSB7CisJCQlybXRfbmV3X2R1cF9hY3Rpb25zKHNtYykgOworCQkJR09fU1RBVEUoUk00X05PTl9PUF9EVVApIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKlJNMzRiKi8KKwkJZWxzZSBpZiAoY21kID09IFJNX01ZX0JFQUNPTiAmJiBzbWMtPnIudGltZXIwX2V4cCkgeworCQkJcm10X25ld19kdXBfYWN0aW9ucyhzbWMpIDsKKwkJCUdPX1NUQVRFKFJNNF9OT05fT1BfRFVQKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypSTTM0YyovCisJCWVsc2UgaWYgKGNtZCA9PSBSTV9WQUxJRF9DTEFJTSkgeworCQkJcm10X25ld19kdXBfYWN0aW9ucyhzbWMpIDsKKwkJCUdPX1NUQVRFKFJNNF9OT05fT1BfRFVQKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypSTTM2Ki8KKwkJZWxzZSBpZiAoY21kID09IFJNX1RJTUVPVVRfVF9TVFVDSyAmJgorCQkJc21jLT5yLnJtX2pvaW4gJiYgc21jLT5yLmJuX2ZsYWcpIHsKKwkJCUdPX1NUQVRFKFJNNl9ESVJFQ1RFRCkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoUk00X05PTl9PUF9EVVApIDoKKwkJc3RhcnRfcm10X3RpbWVyMChzbWMsc21jLT5zLnJtdF90X2Fubm91bmNlLFJNX1RJTUVPVVRfQU5OT1VOQ0UpOworCQlzdGFydF9ybXRfdGltZXIxKHNtYyxzbWMtPnMucm10X3Rfc3R1Y2ssUk1fVElNRU9VVF9UX1NUVUNLKSA7CisJCXN0YXJ0X3JtdF90aW1lcjIoc21jLHNtYy0+cy5ybXRfdF9wb2xsLFJNX1RJTUVPVVRfUE9MTCkgOworCQlzbV9tYWNfY2hlY2tfYmVhY29uX2NsYWltKHNtYykgOworCQlEQl9STVROKDEsIlJNVCA6IFJNNF9OT05fT1BfRFVQXG4iLDAsMCkgOworCQlBQ1RJT05TX0RPTkUoKSA7CisJCWJyZWFrIDsKKwljYXNlIFJNNF9OT05fT1BfRFVQIDoKKwkJaWYgKGNtZCA9PSBSTV9USU1FT1VUX1BPTEwpIHsKKwkJCXN0YXJ0X3JtdF90aW1lcjIoc21jLHNtYy0+cy5ybXRfdF9wb2xsLFJNX1RJTUVPVVRfUE9MTCk7CisJCQlzbV9tYWNfY2hlY2tfYmVhY29uX2NsYWltKHNtYykgOworCQkJYnJlYWsgOworCQl9CisJCS8qUk00MSovCisJCWlmICghc21jLT5yLmRhX2ZsYWcpIHsKKwkJCUdPX1NUQVRFKFJNMV9OT05fT1ApIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKlJNNDRhKi8KKwkJZWxzZSBpZiAoKGNtZCA9PSBSTV9NWV9CRUFDT04gfHwgY21kID09IFJNX09USEVSX0JFQUNPTikgJiYKKwkJCXNtYy0+ci5ibl9mbGFnKSB7CisJCQlzbWMtPnIuYm5fZmxhZyA9IEZBTFNFIDsKKwkJfQorCQkvKlJNNDRiKi8KKwkJZWxzZSBpZiAoY21kID09IFJNX1RSVF9FWFAgJiYgIXNtYy0+ci5ibl9mbGFnKSB7CisJCQlpbnQJdHggOworCQkJLyoKKwkJCSAqIHNldCBibl9mbGFnIG9ubHkgaWYgaW4gc3RhdGUgVDQgb3IgVDU6CisJCQkgKiBvbmx5IGlmIHdlJ3JlIHRoZSBiZWFjb25lciBzaG91bGQgd2Ugc3RhcnQgdGhlCisJCQkgKiB0cmFjZSAhCisJCQkgKi8KKwkJCWlmICgodHggPSAgc21fbWFjX2dldF90eF9zdGF0ZShzbWMpKSA9PSA0IHx8IHR4ID09IDUpIHsKKwkJCURCX1JNVE4oMiwiUk1UIDogTk9QRFVQICYmIFRSVF9FWFBJUkVEICYmIFQ0L1Q1XG4iLDAsMCk7CisJCQkJc21jLT5yLmJuX2ZsYWcgPSBUUlVFIDsKKwkJCQkvKgorCQkJCSAqIElmIG9uZSBvZiB0aGUgdXBzdHJlYW0gc3RhdGlvbnMgYmVhY29uZWQKKwkJCQkgKiBhbmQgdGhlIGxpbmsgdG8gdGhlIHVwc3RyZWFtIG5laWdoYm9yIGlzCisJCQkJICogbG9zdCB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHN0dWNrIHRpbWVyIHRvCisJCQkJICogY2hlY2sgdGhlICJzdHVjayBiZWFjb24iIGNvbmRpdGlvbi4KKwkJCQkgKi8KKwkJCQlzdGFydF9ybXRfdGltZXIxKHNtYyxzbWMtPnMucm10X3Rfc3R1Y2ssCisJCQkJCVJNX1RJTUVPVVRfVF9TVFVDSykgOworCQkJfQorCQkJLyoKKwkJCSAqIFdlIGRvIE5PVCBuZWVkIHRvIGNsZWFyIHNtYy0+ci5ibl9mbGFnIGluIGNhc2Ugb2YKKwkJCSAqIG5vdCBiZWluZyBpbiBzdGF0ZSBUNCBvciBUNSwgYmVjYXVzZSB0aGUgZmxhZworCQkJICogbXVzdCBiZSBjbGVhcmVkIGluIG9yZGVyIHRvIGdldCBpbiB0aGlzIGNvbmRpdGlvbi4KKwkJCSAqLworCisJCQlEQl9STVROKDIsCisJCQkiUk1UIDogc21fbWFjX2dldF90eF9zdGF0ZSgpID0gJWQgKGJuX2ZsYWcgPSAlZClcbiIsCisJCQl0eCxzbWMtPnIuYm5fZmxhZykgOworCQl9CisJCS8qUk00NGMqLworCQllbHNlIGlmIChjbWQgPT0gUk1fVElNRU9VVF9BTk5PVU5DRSAmJiAhc21jLT5yLmJuX2ZsYWcpIHsKKwkJCXJtdF9kdXBfYWN0aW9ucyhzbWMpIDsKKwkJfQorCQkvKlJNNDUqLworCQllbHNlIGlmIChjbWQgPT0gUk1fUklOR19PUCkgeworCQkJc21jLT5yLm5vX2ZsYWcgPSBGQUxTRSA7CisJCQlHT19TVEFURShSTTVfUklOR19PUF9EVVApIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKlJNNDYqLworCQllbHNlIGlmIChjbWQgPT0gUk1fVElNRU9VVF9UX1NUVUNLICYmCisJCQlzbWMtPnIucm1fam9pbiAmJiBzbWMtPnIuYm5fZmxhZykgeworCQkJR09fU1RBVEUoUk02X0RJUkVDVEVEKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgQUNUSU9OUyhSTTVfUklOR19PUF9EVVApIDoKKwkJc3RvcF9ybXRfdGltZXIwKHNtYykgOworCQlzdG9wX3JtdF90aW1lcjEoc21jKSA7CisJCXN0b3Bfcm10X3RpbWVyMihzbWMpIDsKKwkJREJfUk1UTigxLCJSTVQgOiBSTTVfUklOR19PUF9EVVBcbiIsMCwwKSA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWs7CisJY2FzZSBSTTVfUklOR19PUF9EVVAgOgorCQkvKlJNNTIqLworCQlpZiAoc21jLT5yLmR1cF9hZGRyX3Rlc3QgPT0gREFfUEFTU0VEKSB7CisJCQlzbWMtPnIuZGFfZmxhZyA9IEZBTFNFIDsKKwkJCUdPX1NUQVRFKFJNMl9SSU5HX09QKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypSTTU0Ki8KKwkJZWxzZSBpZiAoY21kID09IFJNX1JJTkdfTk9OX09QKSB7CisJCQlzbWMtPnIuam1fZmxhZyA9IEZBTFNFIDsKKwkJCXNtYy0+ci5ibl9mbGFnID0gRkFMU0UgOworCQkJR09fU1RBVEUoUk00X05PTl9PUF9EVVApIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSBBQ1RJT05TKFJNNl9ESVJFQ1RFRCkgOgorCQlzdGFydF9ybXRfdGltZXIwKHNtYyxzbWMtPnMucm10X3RfZGlyZWN0LFJNX1RJTUVPVVRfVF9ESVJFQ1QpIDsKKwkJc3RvcF9ybXRfdGltZXIxKHNtYykgOworCQlzdGFydF9ybXRfdGltZXIyKHNtYyxzbWMtPnMucm10X3RfcG9sbCxSTV9USU1FT1VUX1BPTEwpIDsKKwkJc21fbWFfY29udHJvbChzbWMsTUFfRElSRUNURUQpIDsKKwkJUlNfU0VUKHNtYyxSU19CRUFDT04pIDsKKwkJREJfUk1UTigxLCJSTVQgOiBSTTZfRElSRUNURURcbiIsMCwwKSA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWsgOworCWNhc2UgUk02X0RJUkVDVEVEIDoKKwkJLypSTTYzKi8KKwkJaWYgKGNtZCA9PSBSTV9USU1FT1VUX1BPTEwpIHsKKwkJCXN0YXJ0X3JtdF90aW1lcjIoc21jLHNtYy0+cy5ybXRfdF9wb2xsLFJNX1RJTUVPVVRfUE9MTCk7CisJCQlzbV9tYWNfY2hlY2tfYmVhY29uX2NsYWltKHNtYykgOworI2lmbmRlZiBTVVBFUk5FVF8zCisJCQkvKiBCZWNhdXNlIG9mIHByb2JsZW1zIHdpdGggdGhlIFN1cGVybmV0IElJIGNoaXAgc2V0CisJCQkgKiBzZW5kaW5nIG9mIERpcmVjdGVkIEJlYWNvbiB3aWxsIHN0b3AgYWZ0ZXIgMTY1bXMKKwkJCSAqIHRoZXJlZm9yZSByZXN0YXJ0X3RydF9mb3JfZGJjbihzbWMpIHdpbGwgYmUgY2FsbGVkCisJCQkgKiB0byBwcmV2ZW50IHRoaXMuCisJCQkgKi8KKwkJCXJlc3RhcnRfdHJ0X2Zvcl9kYmNuKHNtYykgOworI2VuZGlmIC8qU1VQRVJORVRfMyovCisJCQlicmVhayA7CisJCX0KKwkJaWYgKChjbWQgPT0gUk1fTVlfQkVBQ09OIHx8IGNtZCA9PSBSTV9PVEhFUl9CRUFDT04pICYmCisJCQkhc21jLT5yLmRhX2ZsYWcpIHsKKwkJCXNtYy0+ci5ibl9mbGFnID0gRkFMU0UgOworCQkJR09fU1RBVEUoUk0zX0RFVEVDVCkgOworCQkJYnJlYWsgOworCQl9CisJCS8qUk02NCovCisJCWVsc2UgaWYgKChjbWQgPT0gUk1fTVlfQkVBQ09OIHx8IGNtZCA9PSBSTV9PVEhFUl9CRUFDT04pICYmCisJCQlzbWMtPnIuZGFfZmxhZykgeworCQkJc21jLT5yLmJuX2ZsYWcgPSBGQUxTRSA7CisJCQlHT19TVEFURShSTTRfTk9OX09QX0RVUCkgOworCQkJYnJlYWsgOworCQl9CisJCS8qUk02NyovCisJCWVsc2UgaWYgKGNtZCA9PSBSTV9USU1FT1VUX1RfRElSRUNUKSB7CisJCQlHT19TVEFURShSTTdfVFJBQ0UpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSBBQ1RJT05TKFJNN19UUkFDRSkgOgorCQlzdG9wX3JtdF90aW1lcjAoc21jKSA7CisJCXN0b3Bfcm10X3RpbWVyMShzbWMpIDsKKwkJc3RvcF9ybXRfdGltZXIyKHNtYykgOworCQlzbWMtPmUudHJhY2VfcHJvcCB8PSBFTlRJVFlfQklUKEVOVElUWV9NQUMpIDsKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX0VDTSxFQ19UUkFDRV9QUk9QKSA7CisJCURCX1JNVE4oMSwiUk1UIDogUk03X1RSQUNFXG4iLDAsMCkgOworCQlBQ1RJT05TX0RPTkUoKSA7CisJCWJyZWFrIDsKKwljYXNlIFJNN19UUkFDRSA6CisJCWJyZWFrIDsKKwlkZWZhdWx0OgorCQlTTVRfUEFOSUMoc21jLFNNVF9FMDEyMiwgU01UX0UwMTIyX01TRykgOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiAoamQpIFJNVCBkdXBsaWNhdGUgYWRkcmVzcyBhY3Rpb25zCisgKiBsZWF2ZSB0aGUgcmluZyBvciByZWluc2VydCBqdXN0IGFzIGNvbmZpZ3VyZWQKKyAqLworc3RhdGljIHZvaWQgcm10X2R1cF9hY3Rpb25zKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWlmIChzbWMtPnIuam1fZmxhZykgeworCX0KKwllbHNlIHsKKwkJaWYgKHNtYy0+cy5ybXRfZHVwX21hY19iZWhhdmlvcikgeworCQkJU01UX0VSUl9MT0coc21jLFNNVF9FMDEzOCwgU01UX0UwMTM4X01TRykgOworICAgICAgICAgICAgICAgICAgICAgICAgcm10X3JlaW5zZXJ0X2FjdGlvbnMoc21jKSA7CisJCX0KKwkJZWxzZSB7CisJCQlTTVRfRVJSX0xPRyhzbWMsU01UX0UwMTM1LCBTTVRfRTAxMzVfTVNHKSA7CisJCQlybXRfbGVhdmVfYWN0aW9ucyhzbWMpIDsKKwkJfQorCX0KK30KKworLyoKKyAqIFJlY29ubmVjdCB0byB0aGUgUmluZworICovCitzdGF0aWMgdm9pZCBybXRfcmVpbnNlcnRfYWN0aW9ucyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlxdWV1ZV9ldmVudChzbWMsRVZFTlRfRUNNLEVDX0RJU0NPTk5FQ1QpIDsKKwlxdWV1ZV9ldmVudChzbWMsRVZFTlRfRUNNLEVDX0NPTk5FQ1QpIDsKK30KKworLyoKKyAqIGR1cGxpY2F0ZSBhZGRyZXNzIGRldGVjdGVkCisgKi8KK3N0YXRpYyB2b2lkIHJtdF9uZXdfZHVwX2FjdGlvbnMoc3RydWN0IHNfc21jICpzbWMpCit7CisJc21jLT5yLmRhX2ZsYWcgPSBUUlVFIDsKKwlzbWMtPnIuYm5fZmxhZyA9IEZBTFNFIDsKKwlzbWMtPnIuam1fZmxhZyA9IEZBTFNFIDsKKwkvKgorCSAqIHdlIGhhdmUgdGhyZWUgb3B0aW9ucyA6IGNoYW5nZSBhZGRyZXNzLCBqYW0gb3IgbGVhdmUKKwkgKiB3ZSBsZWF2ZSB0aGUgcmluZyBhcyBkZWZhdWx0IAorCSAqIE9wdGlvbmFsbHkgaXQncyBwb3NzaWJsZSB0byByZWluc2VydCBhZnRlciBsZWF2aW5nIHRoZSBSaW5nCisJICogYnV0IHRoaXMgd2lsbCBub3QgY29uZm9ybSB3aXRoIFNNVCBTcGVjLgorCSAqLworCWlmIChzbWMtPnMucm10X2R1cF9tYWNfYmVoYXZpb3IpIHsKKwkJU01UX0VSUl9MT0coc21jLFNNVF9FMDEzOCwgU01UX0UwMTM4X01TRykgOworCQlybXRfcmVpbnNlcnRfYWN0aW9ucyhzbWMpIDsKKwl9CisJZWxzZSB7CisJCVNNVF9FUlJfTE9HKHNtYyxTTVRfRTAxMzUsIFNNVF9FMDEzNV9NU0cpIDsKKwkJcm10X2xlYXZlX2FjdGlvbnMoc21jKSA7CisJfQorfQorCisKKy8qCisgKiBsZWF2ZSB0aGUgcmluZworICovCitzdGF0aWMgdm9pZCBybXRfbGVhdmVfYWN0aW9ucyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlxdWV1ZV9ldmVudChzbWMsRVZFTlRfRUNNLEVDX0RJU0NPTk5FQ1QpIDsKKwkvKgorCSAqIE5vdGU6IERvIE5PVCB0cnkgYWdhaW4gbGF0ZXIuICh3aXRoIHBsZWFzZSByZWNvbm5lY3QpCisJICogVGhlIHN0YXRpb24gbXVzdCBiZSBsZWZ0IGZyb20gdGhlIHJpbmchCisJICovCit9CisKKy8qCisgKiBTTVQgdGltZXIgaW50ZXJmYWNlCisgKglzdGFydCBSTVQgdGltZXIgMAorICovCitzdGF0aWMgdm9pZCBzdGFydF9ybXRfdGltZXIwKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdmFsdWUsIGludCBldmVudCkKK3sKKwlzbWMtPnIudGltZXIwX2V4cCA9IEZBTFNFIDsJCS8qIGNsZWFyIHRpbWVyIGV2ZW50IGZsYWcgKi8KKwlzbXRfdGltZXJfc3RhcnQoc21jLCZzbWMtPnIucm10X3RpbWVyMCx2YWx1ZSxFVl9UT0tFTihFVkVOVF9STVQsZXZlbnQpKTsKK30KKworLyoKKyAqIFNNVCB0aW1lciBpbnRlcmZhY2UKKyAqCXN0YXJ0IFJNVCB0aW1lciAxCisgKi8KK3N0YXRpYyB2b2lkIHN0YXJ0X3JtdF90aW1lcjEoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyB2YWx1ZSwgaW50IGV2ZW50KQoreworCXNtYy0+ci50aW1lcjFfZXhwID0gRkFMU0UgOwkvKiBjbGVhciB0aW1lciBldmVudCBmbGFnICovCisJc210X3RpbWVyX3N0YXJ0KHNtYywmc21jLT5yLnJtdF90aW1lcjEsdmFsdWUsRVZfVE9LRU4oRVZFTlRfUk1ULGV2ZW50KSk7Cit9CisKKy8qCisgKiBTTVQgdGltZXIgaW50ZXJmYWNlCisgKglzdGFydCBSTVQgdGltZXIgMgorICovCitzdGF0aWMgdm9pZCBzdGFydF9ybXRfdGltZXIyKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdmFsdWUsIGludCBldmVudCkKK3sKKwlzbWMtPnIudGltZXIyX2V4cCA9IEZBTFNFIDsJCS8qIGNsZWFyIHRpbWVyIGV2ZW50IGZsYWcgKi8KKwlzbXRfdGltZXJfc3RhcnQoc21jLCZzbWMtPnIucm10X3RpbWVyMix2YWx1ZSxFVl9UT0tFTihFVkVOVF9STVQsZXZlbnQpKTsKK30KKworLyoKKyAqIFNNVCB0aW1lciBpbnRlcmZhY2UKKyAqCXN0b3AgUk1UIHRpbWVyIDAKKyAqLworc3RhdGljIHZvaWQgc3RvcF9ybXRfdGltZXIwKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWlmIChzbWMtPnIucm10X3RpbWVyMC50bV9hY3RpdmUpCisJCXNtdF90aW1lcl9zdG9wKHNtYywmc21jLT5yLnJtdF90aW1lcjApIDsKK30KKworLyoKKyAqIFNNVCB0aW1lciBpbnRlcmZhY2UKKyAqCXN0b3AgUk1UIHRpbWVyIDEKKyAqLworc3RhdGljIHZvaWQgc3RvcF9ybXRfdGltZXIxKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWlmIChzbWMtPnIucm10X3RpbWVyMS50bV9hY3RpdmUpCisJCXNtdF90aW1lcl9zdG9wKHNtYywmc21jLT5yLnJtdF90aW1lcjEpIDsKK30KKworLyoKKyAqIFNNVCB0aW1lciBpbnRlcmZhY2UKKyAqCXN0b3AgUk1UIHRpbWVyIDIKKyAqLworc3RhdGljIHZvaWQgc3RvcF9ybXRfdGltZXIyKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWlmIChzbWMtPnIucm10X3RpbWVyMi50bV9hY3RpdmUpCisJCXNtdF90aW1lcl9zdG9wKHNtYywmc21jLT5yLnJtdF90aW1lcjIpIDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9za2ZkZGkuYyBiL2RyaXZlcnMvbmV0L3NrZnAvc2tmZGRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4YWFkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvc2tmZGRpLmMKQEAgLTAsMCArMSwyMjkzIEBACisvKgorICogRmlsZSBOYW1lOgorICogICBza2ZkZGkuYworICoKKyAqIENvcHlyaWdodCBJbmZvcm1hdGlvbjoKKyAqICAgQ29weXJpZ2h0IFN5c0tvbm5lY3QgMTk5OCwxOTk5LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICogQWJzdHJhY3Q6CisgKiAgIEEgTGludXggZGV2aWNlIGRyaXZlciBzdXBwb3J0aW5nIHRoZSBTeXNLb25uZWN0IEZEREkgUENJIGNvbnRyb2xsZXIKKyAqICAgZmFtaWxpZS4KKyAqCisgKiBNYWludGFpbmVyczoKKyAqICAgQ0cgICAgQ2hyaXN0b3BoIEdvb3MgKGNnb29zQHN5c2tvbm5lY3QuZGUpCisgKgorICogQ29udHJpYnV0b3JzOgorICogICBETSAgICBEYXZpZCBTLiBNaWxsZXIKKyAqCisgKiBBZGRyZXNzIGFsbCBxdWVzdGlvbiB0bzoKKyAqICAgbGludXhAc3lza29ubmVjdC5kZQorICoKKyAqIFRoZSB0ZWNobmljYWwgbWFudWFsIGZvciB0aGUgYWRhcHRlcnMgaXMgYXZhaWxhYmxlIGZyb20gU3lzS29ubmVjdCdzCisgKiB3ZWIgcGFnZXM6IHd3dy5zeXNrb25uZWN0LmNvbQorICogR290byAiU3VwcG9ydCIgYW5kIHNlYXJjaCBLbm93bGVkZ2UgQmFzZSBmb3IgIm1hbnVhbCIuCisgKgorICogRHJpdmVyIEFyY2hpdGVjdHVyZToKKyAqICAgVGhlIGRyaXZlciBhcmNoaXRlY3R1cmUgaXMgYmFzZWQgb24gdGhlIERFQyBGRERJIGRyaXZlciBieQorICogICBMYXdyZW5jZSBWLiBTdGVmYW5pIGFuZCBzZXZlcmFsIGV0aGVybmV0IGRyaXZlcnMuCisgKiAgIEkgYWxzbyB1c2VkIGFuIGV4aXN0aW5nIFdpbmRvd3MgTlQgbWluaXBvcnQgZHJpdmVyLgorICogICBBbGwgaGFyZHdhcmUgZGVwZW5kZW50IGZ1Y3Rpb25zIGFyZSBoYW5kbGVkIGJ5IHRoZSBTeXNLb25uZWN0CisgKiAgIEhhcmR3YXJlIE1vZHVsZS4KKyAqICAgVGhlIG9ubHkgaGVhZGVyZmlsZXMgdGhhdCBhcmUgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGlzIHNvdXJjZQorICogICBhcmUgc2tmZGRpLmMsIGgvdHlwZXMuaCwgaC9vc2RlZjFzdC5oLCBoL3RhcmdldG9zLmguCisgKiAgIFRoZSBvdGhlcnMgYmVsb25nIHRvIHRoZSBTeXNLb25uZWN0IEZEREkgSGFyZHdhcmUgTW9kdWxlIGFuZAorICogICBzaG91bGQgYmV0dGVyIG5vdCBiZSBjaGFuZ2VkLgorICoKKyAqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorICogICAgICAgICAgICAgIERhdGUgICAgICAgICAgICBOYW1lICAgIERlc2NyaXB0aW9uCisgKiAgICAgICAgICAgICAgMDItTWFyLTk4ICAgICAgIENHCUNyZWF0ZWQuCisgKgorICoJCTEwLU1hci05OQlDRwlTdXBwb3J0IGZvciAyLjIueCBhZGRlZC4KKyAqCQkyNS1NYXItOTkJQ0cJQ29ycmVjdGVkIElSUSByb3V0aW5nIGZvciBTTVAgKEFQSUMpCisgKgkJMjYtT2N0LTk5CUNHCUZpeGVkIGNvbXBpbGF0aW9uIGVycm9yIG9uIDIuMi4xMworICoJCTEyLU5vdi05OQlDRwlTb3VyY2UgY29kZSByZWxlYXNlCisgKgkJMjItTm92LTk5CUNHCUluY2x1ZGVkIGluIGtlcm5lbCBzb3VyY2UuCisgKgkJMDctTWF5LTAwCURNCTY0IGJpdCBmaXhlcywgbmV3IGRtYSBpbnRlcmZhY2UKKyAqCQkzMS1KdWwtMDMJREIJQXVkaXQgY29weV8qX3VzZXIgaW4gc2tmcF9pb2N0bAorICoJCQkJCSAgRGFuaWVsZSBCZWxsdWNjaSA8YmVsbHVjZGFAdGlzY2FsaS5pdD4KKyAqCQkwMy1EZWMtMDMJU0gJQ29udmVydCB0byBQQ0kgZGV2aWNlIG1vZGVsCisgKgorICogQ29tcGlsYXRpb24gb3B0aW9ucyAoLUR4eHgpOgorICogICAgICAgICAgICAgIERSSVZFUkRFQlVHICAgICBwcmludCBsb3RzIG9mIG1lc3NhZ2VzIHRvIGxvZyBmaWxlCisgKiAgICAgICAgICAgICAgRFVNUFBBQ0tFVFMgICAgIHByaW50IHJlY2VpdmVkL3RyYW5zbWl0dGVkIHBhY2tldHMgdG8gbG9nZmlsZQorICogCisgKiBUZXN0ZWQgY3B1IGFyY2hpdGVjdHVyZXM6CisgKgktIGkzODYKKyAqCS0gc3BhcmM2NAorICovCisKKy8qIFZlcnNpb24gaW5mb3JtYXRpb24gc3RyaW5nIC0gc2hvdWxkIGJlIHVwZGF0ZWQgcHJpb3IgdG8gKi8KKy8qIGVhY2ggbmV3IHJlbGVhc2UhISEgKi8KKyNkZWZpbmUgVkVSU0lPTgkJIjIuMDciCisKK3N0YXRpYyBjb25zdCBjaGFyICpib290X21zZyA9IAorCSJTeXNLb25uZWN0IEZEREkgUENJIEFkYXB0ZXIgZHJpdmVyIHYiIFZFUlNJT04gIiBmb3JcbiIKKwkiICBTSy01NXh4L1NLLTU4eHggYWRhcHRlcnMgKFNLLU5FVCBGRERJLUZQL1VQL0xQKSI7CisKKy8qIEluY2x1ZGUgZmlsZXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZkZGlkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZQkiaC90eXBlcy5oIgorI3VuZGVmIEFERFIJCQkvLyB1bmRvIExpbnV4IGRlZmluaXRpb24KKyNpbmNsdWRlCSJoL3NrZmJpLmgiCisjaW5jbHVkZQkiaC9mZGRpLmgiCisjaW5jbHVkZQkiaC9zbWMuaCIKKyNpbmNsdWRlCSJoL3NtdHN0YXRlLmgiCisKKworLy8gRGVmaW5lIG1vZHVsZS13aWRlIChzdGF0aWMpIHJvdXRpbmVzCitzdGF0aWMgaW50IHNrZnBfZHJpdmVyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNrZnBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2tmcF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBza2ZwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2tmcF9jdGxfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2tmcF9jdGxfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2tmcF9jdGxfc2V0X211bHRpY2FzdF9saXN0X3dvX2xvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNrZnBfY3RsX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKTsKK3N0YXRpYyBpbnQgc2tmcF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgc2tmcF9zZW5kX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNlbmRfcXVldWVkX3BhY2tldHMoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgQ2hlY2tTb3VyY2VBZGRyZXNzKHVuc2lnbmVkIGNoYXIgKmZyYW1lLCB1bnNpZ25lZCBjaGFyICpod19hZGRyKTsKK3N0YXRpYyB2b2lkIFJlc2V0QWRhcHRlcihzdHJ1Y3Qgc19zbWMgKnNtYyk7CisKKworLy8gRnVuY3Rpb25zIG5lZWRlZCBieSB0aGUgaGFyZHdhcmUgbW9kdWxlCit2b2lkICptYWNfZHJ2X2dldF9zcGFjZShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9pbnQgc2l6ZSk7Cit2b2lkICptYWNfZHJ2X2dldF9kZXNjX21lbShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9pbnQgc2l6ZSk7Cit1bnNpZ25lZCBsb25nIG1hY19kcnZfdmlydDJwaHlzKHN0cnVjdCBzX3NtYyAqc21jLCB2b2lkICp2aXJ0KTsKK3Vuc2lnbmVkIGxvbmcgZG1hX21hc3RlcihzdHJ1Y3Qgc19zbWMgKnNtYywgdm9pZCAqdmlydCwgaW50IGxlbiwgaW50IGZsYWcpOwordm9pZCBkbWFfY29tcGxldGUoc3RydWN0IHNfc21jICpzbWMsIHZvbGF0aWxlIHVuaW9uIHNfZnBfZGVzY3IgKmRlc2NyLAorCQkgIGludCBmbGFnKTsKK3ZvaWQgbWFjX2Rydl90eF9jb21wbGV0ZShzdHJ1Y3Qgc19zbWMgKnNtYywgdm9sYXRpbGUgc3RydWN0IHNfc210X2ZwX3R4ZCAqdHhkKTsKK3ZvaWQgbGxjX3Jlc3RhcnRfdHgoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBtYWNfZHJ2X3J4X2NvbXBsZXRlKHN0cnVjdCBzX3NtYyAqc21jLCB2b2xhdGlsZSBzdHJ1Y3Qgc19zbXRfZnBfcnhkICpyeGQsCisJCQkgaW50IGZyYWdfY291bnQsIGludCBsZW4pOwordm9pZCBtYWNfZHJ2X3JlcXVldWVfcnhkKHN0cnVjdCBzX3NtYyAqc21jLCB2b2xhdGlsZSBzdHJ1Y3Qgc19zbXRfZnBfcnhkICpyeGQsCisJCQkgaW50IGZyYWdfY291bnQpOwordm9pZCBtYWNfZHJ2X2ZpbGxfcnhkKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgbWFjX2Rydl9jbGVhcl9yeGQoc3RydWN0IHNfc21jICpzbWMsIHZvbGF0aWxlIHN0cnVjdCBzX3NtdF9mcF9yeGQgKnJ4ZCwKKwkJICAgICAgIGludCBmcmFnX2NvdW50KTsKK2ludCBtYWNfZHJ2X3J4X2luaXQoc3RydWN0IHNfc21jICpzbWMsIGludCBsZW4sIGludCBmYywgY2hhciAqbG9va19haGVhZCwKKwkJICAgIGludCBsYV9sZW4pOwordm9pZCBkdW1wX2RhdGEodW5zaWduZWQgY2hhciAqRGF0YSwgaW50IGxlbmd0aCk7CisKKy8vIEV4dGVybmFsIGZ1bmN0aW9ucyBmcm9tIHRoZSBoYXJkd2FyZSBtb2R1bGUKK2V4dGVybiB1X2ludCBtYWNfZHJ2X2NoZWNrX3NwYWNlKHZvaWQpOworZXh0ZXJuIHZvaWQgcmVhZF9hZGRyZXNzKHN0cnVjdCBzX3NtYyAqc21jLCB1X2NoYXIgKiBtYWNfYWRkcik7CitleHRlcm4gdm9pZCBjYXJkX3N0b3Aoc3RydWN0IHNfc21jICpzbWMpOworZXh0ZXJuIGludCBtYWNfZHJ2X2luaXQoc3RydWN0IHNfc21jICpzbWMpOworZXh0ZXJuIHZvaWQgaHdtX3R4X2ZyYWcoc3RydWN0IHNfc21jICpzbWMsIGNoYXIgZmFyICogdmlydCwgdV9sb25nIHBoeXMsCisJCQlpbnQgbGVuLCBpbnQgZnJhbWVfc3RhdHVzKTsKK2V4dGVybiBpbnQgaHdtX3R4X2luaXQoc3RydWN0IHNfc21jICpzbWMsIHVfY2hhciBmYywgaW50IGZyYWdfY291bnQsCisJCSAgICAgICBpbnQgZnJhbWVfbGVuLCBpbnQgZnJhbWVfc3RhdHVzKTsKK2V4dGVybiBpbnQgaW5pdF9zbXQoc3RydWN0IHNfc21jICpzbWMsIHVfY2hhciAqIG1hY19hZGRyKTsKK2V4dGVybiB2b2lkIGZkZGlfaXNyKHN0cnVjdCBzX3NtYyAqc21jKTsKK2V4dGVybiB2b2lkIGh3bV9yeF9mcmFnKHN0cnVjdCBzX3NtYyAqc21jLCBjaGFyIGZhciAqIHZpcnQsIHVfbG9uZyBwaHlzLAorCQkJaW50IGxlbiwgaW50IGZyYW1lX3N0YXR1cyk7CitleHRlcm4gdm9pZCBtYWNfZHJ2X3J4X21vZGUoc3RydWN0IHNfc21jICpzbWMsIGludCBtb2RlKTsKK2V4dGVybiB2b2lkIG1hY19kcnZfY2xlYXJfcnhfcXVldWUoc3RydWN0IHNfc21jICpzbWMpOworZXh0ZXJuIHZvaWQgZW5hYmxlX3R4X2lycShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9zaG9ydCBxdWV1ZSk7CitleHRlcm4gdm9pZCBtYWNfZHJ2X2NsZWFyX3R4ZChzdHJ1Y3Qgc19zbWMgKnNtYyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBza2ZkZGlfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9TSywgUENJX0RFVklDRV9JRF9TS19GUCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IH0JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBza2ZkZGlfcGNpX3RibCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNaXJrbyBMaW5kbmVyIDxtbGluZG5lckBzeXNrb25uZWN0LmRlPiIpOworCisvLyBEZWZpbmUgbW9kdWxlLXdpZGUgKHN0YXRpYykgdmFyaWFibGVzCisKK3N0YXRpYyBpbnQgbnVtX2JvYXJkczsJLyogdG90YWwgbnVtYmVyIG9mIGFkYXB0ZXJzIGNvbmZpZ3VyZWQgKi8KKworI2lmZGVmIERSSVZFUkRFQlVHCisjZGVmaW5lIFBSSU5USyhzLCBhcmdzLi4uKSBwcmludGsocywgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFBSSU5USyhzLCBhcmdzLi4uKQorI2VuZGlmCQkJCS8vIERSSVZFUkRFQlVHCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PQorICogPSBza2ZwX2luaXRfb25lID0KKyAqID09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIFByb2JlcyBmb3Igc3VwcG9ydGVkIEZEREkgUENJIGNvbnRyb2xsZXJzCisgKiAgCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIHBkZXYgLSBwb2ludGVyIHRvIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBUaGlzIGlzIG5vdyBjYWxsZWQgYnkgUENJIGRyaXZlciByZWdpc3RyYXRpb24gcHJvY2VzcworICogICBmb3IgZWFjaCBib2FyZCBmb3VuZC4KKyAqICAgCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIDAgICAgICAgICAgIC0gVGhpcyBkZXZpY2UgKGZkZGkwLCBmZGRpMSwgZXRjKSBjb25maWd1cmVkIHN1Y2Nlc3NmdWxseQorICogICAtRU5PREVWIC0gTm8gZGV2aWNlcyBwcmVzZW50LCBvciBubyBTeXNLb25uZWN0IEZEREkgUENJIGRldmljZQorICogICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudCBmb3IgdGhpcyBkZXZpY2UgbmFtZQorICoKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIERldmljZSBzdHJ1Y3R1cmVzIGZvciBGRERJIGFkYXB0ZXJzIChmZGRpMCwgZmRkaTEsIGV0YykgYXJlCisgKiAgIGluaXRpYWxpemVkIGFuZCB0aGUgYm9hcmQgcmVzb3VyY2VzIGFyZSByZWFkIGFuZCBzdG9yZWQgaW4KKyAqICAgdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBpbnQgc2tmcF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNfc21jICpzbWM7CS8qIGJvYXJkIHBvaW50ZXIgKi8KKwl2b2lkIF9faW9tZW0gKm1lbTsKKwlpbnQgZXJyOworCisJUFJJTlRLKEtFUk5fSU5GTyAiZW50ZXJpbmcgc2tmcF9pbml0X29uZVxuIik7CisKKwlpZiAobnVtX2JvYXJkcyA9PSAwKSAKKwkJcHJpbnRrKCIlc1xuIiwgYm9vdF9tc2cpOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgInNrZmRkaSIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDE7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworI2lmZGVmIE1FTV9NQVBQRURfSU8KKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJza2ZwOiByZWdpb24gaXMgbm90IGFuIE1NSU8gcmVzb3VyY2VcbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9vdXQyOworCX0KKworCW1lbSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCAweDQwMDApOworI2Vsc2UKKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMSkgJiBJT19SRVNPVVJDRV9JTykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJza2ZwOiByZWdpb24gaXMgbm90IFBJTyByZXNvdXJjZVxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX291dDI7CisJfQorCisJbWVtID0gaW9wb3J0X21hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksIEZQX0lPX0xFTik7CisjZW5kaWYKKwlpZiAoIW1lbSkgeworCQlwcmludGsoS0VSTl9FUlIgInNrZnA6ICBVbmFibGUgdG8gbWFwIHJlZ2lzdGVyLCAiCisJCQkJIkZEREkgYWRhcHRlciB3aWxsIGJlIGRpc2FibGVkLlxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX291dDI7CisJfQorCisJZGV2ID0gYWxsb2NfZmRkaWRldihzaXplb2Yoc3RydWN0IHNfc21jKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJza2ZwOiBVbmFibGUgdG8gYWxsb2NhdGUgZmRkaSBkZXZpY2UsICIKKwkJCQkiRkRESSBhZGFwdGVyIHdpbGwgYmUgZGlzYWJsZWQuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0MzsKKwl9CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPmdldF9zdGF0cyA9ICZza2ZwX2N0bF9nZXRfc3RhdHM7CisJZGV2LT5vcGVuID0gJnNrZnBfb3BlbjsKKwlkZXYtPnN0b3AgPSAmc2tmcF9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZza2ZwX3NlbmRfcGt0OworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNrZnBfY3RsX3NldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZza2ZwX2N0bF9zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5kb19pb2N0bCA9ICZza2ZwX2lvY3RsOworCWRldi0+aGVhZGVyX2NhY2hlX3VwZGF0ZSA9IE5VTEw7CS8qIG5vdCBzdXBwb3J0ZWQgKi8KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJLyogSW5pdGlhbGl6ZSBib2FyZCBzdHJ1Y3R1cmUgd2l0aCBidXMtc3BlY2lmaWMgaW5mbyAqLworCXNtYyA9IG5ldGRldl9wcml2KGRldik7CisJc21jLT5vcy5kZXYgPSBkZXY7CisJc21jLT5vcy5idXNfdHlwZSA9IFNLX0JVU19UWVBFX1BDSTsKKwlzbWMtPm9zLnBkZXYgPSAqcGRldjsKKwlzbWMtPm9zLlF1ZXVlU2tiID0gTUFYX1RYX1FVRVVFX0xFTjsKKwlzbWMtPm9zLk1heEZyYW1lU2l6ZSA9IE1BWF9GUkFNRV9TSVpFOworCXNtYy0+b3MuZGV2ID0gZGV2OworCXNtYy0+aHcuc2xvdCA9IC0xOworCXNtYy0+aHcuaW9wID0gbWVtOworCXNtYy0+b3MuUmVzZXRSZXF1ZXN0ZWQgPSBGQUxTRTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZzbWMtPm9zLlNlbmRTa2JRdWV1ZSk7CisKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKW1lbTsKKworCWVyciA9IHNrZnBfZHJpdmVyX2luaXQoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQ0OworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0NTsKKworCSsrbnVtX2JvYXJkczsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCWlmICgocGRldi0+c3Vic3lzdGVtX2RldmljZSAmIDB4ZmYwMCkgPT0gMHg1NTAwIHx8CisJICAgIChwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlICYgMHhmZjAwKSA9PSAweDU4MDApIAorCQlwcmludGsoIiVzOiBTeXNLb25uZWN0IEZEREkgUENJIGFkYXB0ZXIiCisJCSAgICAgICAiIGZvdW5kIChTSy0lMDRYKVxuIiwgZGV2LT5uYW1lLAkKKwkJICAgICAgIHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOworCWVsc2UKKwkJcHJpbnRrKCIlczogRkRESSBQQ0kgYWRhcHRlciBmb3VuZFxuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworZXJyX291dDU6CisJaWYgKHNtYy0+b3MuU2hhcmVkTWVtQWRkcikgCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc21jLT5vcy5TaGFyZWRNZW1TaXplLAorCQkJCSAgICBzbWMtPm9zLlNoYXJlZE1lbUFkZHIsIAorCQkJCSAgICBzbWMtPm9zLlNoYXJlZE1lbURNQSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBNQVhfRlJBTUVfU0laRSwKKwkJCSAgICBzbWMtPm9zLkxvY2FsUnhCdWZmZXIsIHNtYy0+b3MuTG9jYWxSeEJ1ZmZlckRNQSk7CitlcnJfb3V0NDoKKwlmcmVlX25ldGRldihkZXYpOworZXJyX291dDM6CisjaWZkZWYgTUVNX01BUFBFRF9JTworCWlvdW5tYXAobWVtKTsKKyNlbHNlCisJaW9wb3J0X3VubWFwKG1lbSk7CisjZW5kaWYKK2Vycl9vdXQyOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0MToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENhbGxlZCBmb3IgZWFjaCBhZGFwdGVyIGJvYXJkIGZyb20gcGNpX3VucmVnaXN0ZXJfZHJpdmVyCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBza2ZwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKnAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNfc21jICpscCA9IG5ldGRldl9wcml2KHApOworCisJdW5yZWdpc3Rlcl9uZXRkZXYocCk7CisKKwlpZiAobHAtPm9zLlNoYXJlZE1lbUFkZHIpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCgmbHAtPm9zLnBkZXYsCisJCQkJICAgIGxwLT5vcy5TaGFyZWRNZW1TaXplLAorCQkJCSAgICBscC0+b3MuU2hhcmVkTWVtQWRkciwKKwkJCQkgICAgbHAtPm9zLlNoYXJlZE1lbURNQSk7CisJCWxwLT5vcy5TaGFyZWRNZW1BZGRyID0gTlVMTDsKKwl9CisJaWYgKGxwLT5vcy5Mb2NhbFJ4QnVmZmVyKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoJmxwLT5vcy5wZGV2LAorCQkJCSAgICBNQVhfRlJBTUVfU0laRSwKKwkJCQkgICAgbHAtPm9zLkxvY2FsUnhCdWZmZXIsCisJCQkJICAgIGxwLT5vcy5Mb2NhbFJ4QnVmZmVyRE1BKTsKKwkJbHAtPm9zLkxvY2FsUnhCdWZmZXIgPSBOVUxMOworCX0KKyNpZmRlZiBNRU1fTUFQUEVEX0lPCisJaW91bm1hcChscC0+aHcuaW9wKTsKKyNlbHNlCisJaW9wb3J0X3VubWFwKGxwLT5ody5pb3ApOworI2VuZGlmCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlmcmVlX25ldGRldihwKTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PQorICogPSBza2ZwX2RyaXZlcl9pbml0ID0KKyAqID09PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIEluaXRpYWxpemVzIHJlbWFpbmluZyBhZGFwdGVyIGJvYXJkIHN0cnVjdHVyZSBpbmZvcm1hdGlvbgorICogICBhbmQgbWFrZXMgc3VyZSBhZGFwdGVyIGlzIGluIGEgc2FmZSBzdGF0ZSBwcmlvciB0byBza2ZwX29wZW4oKS4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIENvbmRpdGlvbiBjb2RlCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgZGV2IC0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhZGRpdGlvbmFsIHJlc291cmNlcyBzdWNoIGFzIHRoZSBob3N0IG1lbW9yeQorICogICBibG9ja3MgbmVlZGVkIGJ5IHRoZSBhZGFwdGVyLgorICogICBUaGUgYWRhcHRlciBpcyBhbHNvIHJlc2V0LiBUaGUgT1MgbXVzdCBjYWxsIHNrZnBfb3BlbigpIHRvIG9wZW4gCisgKiAgIHRoZSBhZGFwdGVyIGFuZCBicmluZyBpdCBvbi1saW5lLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgIDAgLSBpbml0aWFsaXphdGlvbiBzdWNjZWVkZWQKKyAqICAgLTEgLSBpbml0aWFsaXphdGlvbiBmYWlsZWQKKyAqLworc3RhdGljICBpbnQgc2tmcF9kcml2ZXJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzX3NtYyAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlza2ZkZGlfcHJpdiAqYnAgPSAmc21jLT5vczsKKwlpbnQgZXJyID0gLUVJTzsKKworCVBSSU5USyhLRVJOX0lORk8gImVudGVyaW5nIHNrZnBfZHJpdmVyX2luaXRcbiIpOworCisJLy8gc2V0IHRoZSBpbyBhZGRyZXNzIGluIHByaXZhdGUgc3RydWN0dXJlcworCWJwLT5iYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8vIEdldCB0aGUgaW50ZXJydXB0IGxldmVsIGZyb20gdGhlIFBDSSBDb25maWd1cmF0aW9uIFRhYmxlCisJc21jLT5ody5pcnEgPSBkZXYtPmlycTsKKworCXNwaW5fbG9ja19pbml0KCZicC0+RHJpdmVyTG9jayk7CisJCisJLy8gQWxsb2NhdGUgaW52YWxpZCBmcmFtZQorCWJwLT5Mb2NhbFJ4QnVmZmVyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoJmJwLT5wZGV2LCBNQVhfRlJBTUVfU0laRSwgJmJwLT5Mb2NhbFJ4QnVmZmVyRE1BKTsKKwlpZiAoIWJwLT5Mb2NhbFJ4QnVmZmVyKSB7CisJCXByaW50aygiY291bGQgbm90IGFsbG9jYXRlIG1lbSBmb3IgIik7CisJCXByaW50aygiTG9jYWxSeEJ1ZmZlcjogJWQgYnl0ZVxuIiwgTUFYX0ZSQU1FX1NJWkUpOworCQlnb3RvIGZhaWw7CisJfQorCisJLy8gRGV0ZXJtaW5lIHRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSAnc2hhcmVkJyBtZW1vcnkgYXJlYS4KKwlicC0+U2hhcmVkTWVtU2l6ZSA9IG1hY19kcnZfY2hlY2tfc3BhY2UoKTsKKwlQUklOVEsoS0VSTl9JTkZPICJNZW1vcnkgZm9yIEhXTTogJWxkXG4iLCBicC0+U2hhcmVkTWVtU2l6ZSk7CisJaWYgKGJwLT5TaGFyZWRNZW1TaXplID4gMCkgeworCQlicC0+U2hhcmVkTWVtU2l6ZSArPSAxNjsJLy8gZm9yIGRlc2NyaXB0b3IgYWxpZ25tZW50CisKKwkJYnAtPlNoYXJlZE1lbUFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudCgmYnAtPnBkZXYsCisJCQkJCQkJIGJwLT5TaGFyZWRNZW1TaXplLAorCQkJCQkJCSAmYnAtPlNoYXJlZE1lbURNQSk7CisJCWlmICghYnAtPlNoYXJlZE1lbVNpemUpIHsKKwkJCXByaW50aygiY291bGQgbm90IGFsbG9jYXRlIG1lbSBmb3IgIik7CisJCQlwcmludGsoImhhcmR3YXJlIG1vZHVsZTogJWxkIGJ5dGVcbiIsCisJCQkgICAgICAgYnAtPlNoYXJlZE1lbVNpemUpOworCQkJZ290byBmYWlsOworCQl9CisJCWJwLT5TaGFyZWRNZW1IZWFwID0gMDsJLy8gTm90aGluZyB1c2VkIHlldC4KKworCX0gZWxzZSB7CisJCWJwLT5TaGFyZWRNZW1BZGRyID0gTlVMTDsKKwkJYnAtPlNoYXJlZE1lbUhlYXAgPSAwOworCX0JCQkvLyBTaGFyZWRNZW1TaXplID4gMAorCisJbWVtc2V0KGJwLT5TaGFyZWRNZW1BZGRyLCAwLCBicC0+U2hhcmVkTWVtU2l6ZSk7CisKKwljYXJkX3N0b3Aoc21jKTsJCS8vIFJlc2V0IGFkYXB0ZXIuCisKKwlQUklOVEsoS0VSTl9JTkZPICJtYWNfZHJ2X2luaXQoKS4uXG4iKTsKKwlpZiAobWFjX2Rydl9pbml0KHNtYykgIT0gMCkgeworCQlQUklOVEsoS0VSTl9JTkZPICJtYWNfZHJ2X2luaXQoKSBmYWlsZWQuXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlyZWFkX2FkZHJlc3Moc21jLCBOVUxMKTsKKwlQUklOVEsoS0VSTl9JTkZPICJIVy1BZGRyOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkgICAgICAgc21jLT5ody5mZGRpX2Nhbm9uX2FkZHIuYVswXSwKKwkgICAgICAgc21jLT5ody5mZGRpX2Nhbm9uX2FkZHIuYVsxXSwKKwkgICAgICAgc21jLT5ody5mZGRpX2Nhbm9uX2FkZHIuYVsyXSwKKwkgICAgICAgc21jLT5ody5mZGRpX2Nhbm9uX2FkZHIuYVszXSwKKwkgICAgICAgc21jLT5ody5mZGRpX2Nhbm9uX2FkZHIuYVs0XSwKKwkgICAgICAgc21jLT5ody5mZGRpX2Nhbm9uX2FkZHIuYVs1XSk7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHNtYy0+aHcuZmRkaV9jYW5vbl9hZGRyLmEsIDYpOworCisJc210X3Jlc2V0X2RlZmF1bHRzKHNtYywgMCk7CisKKwlyZXR1cm4gKDApOworCitmYWlsOgorCWlmIChicC0+U2hhcmVkTWVtQWRkcikgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KCZicC0+cGRldiwKKwkJCQkgICAgYnAtPlNoYXJlZE1lbVNpemUsCisJCQkJICAgIGJwLT5TaGFyZWRNZW1BZGRyLAorCQkJCSAgICBicC0+U2hhcmVkTWVtRE1BKTsKKwkJYnAtPlNoYXJlZE1lbUFkZHIgPSBOVUxMOworCX0KKwlpZiAoYnAtPkxvY2FsUnhCdWZmZXIpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCgmYnAtPnBkZXYsIE1BWF9GUkFNRV9TSVpFLAorCQkJCSAgICBicC0+TG9jYWxSeEJ1ZmZlciwgYnAtPkxvY2FsUnhCdWZmZXJETUEpOworCQlicC0+TG9jYWxSeEJ1ZmZlciA9IE5VTEw7CisJfQorCXJldHVybiBlcnI7Cit9CQkJCS8vIHNrZnBfZHJpdmVyX2luaXQKKworCisvKgorICogPT09PT09PT09PT09PQorICogPSBza2ZwX29wZW4gPQorICogPT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBPcGVucyB0aGUgYWRhcHRlcgorICogIAorICogUmV0dXJuczoKKyAqICAgQ29uZGl0aW9uIGNvZGUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBkZXYgLSBwb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIFRoaXMgZnVuY3Rpb24gYnJpbmdzIHRoZSBhZGFwdGVyIHRvIGFuIG9wZXJhdGlvbmFsIHN0YXRlLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgMCAgICAgICAgICAgLSBBZGFwdGVyIHdhcyBzdWNjZXNzZnVsbHkgb3BlbmVkCisgKiAgIC1FQUdBSU4gLSBDb3VsZCBub3QgcmVnaXN0ZXIgSVJRCisgKi8KK3N0YXRpYyBpbnQgc2tmcF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNfc21jICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwlQUklOVEsoS0VSTl9JTkZPICJlbnRlcmluZyBza2ZwX29wZW5cbiIpOworCS8qIFJlZ2lzdGVyIElSUSAtIHN1cHBvcnQgc2hhcmVkIGludGVycnVwdHMgYnkgcGFzc2luZyBkZXZpY2UgcHRyICovCisJZXJyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICh2b2lkICopIHNrZnBfaW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCSAgZGV2LT5uYW1lLCBkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKgorCSAqIFNldCBjdXJyZW50IGFkZHJlc3MgdG8gZmFjdG9yeSBNQUMgYWRkcmVzcworCSAqCisJICogTm90ZTogV2UndmUgYWxyZWFkeSBkb25lIHRoaXMgc3RlcCBpbiBza2ZwX2RyaXZlcl9pbml0LgorCSAqICAgICAgIEhvd2V2ZXIsIGl0J3MgcG9zc2libGUgdGhhdCBhIHVzZXIgaGFzIHNldCBhIG5vZGUKKwkgKiAgICAgICAgICAgICAgIGFkZHJlc3Mgb3ZlcnJpZGUsIHRoZW4gY2xvc2VkIGFuZCByZW9wZW5lZCB0aGUKKwkgKiAgICAgICAgICAgICAgIGFkYXB0ZXIuICBVbmxlc3Mgd2UgcmVzZXQgdGhlIGRldmljZSBhZGRyZXNzIGZpZWxkCisJICogICAgICAgICAgICAgICBub3csIHdlJ2xsIGNvbnRpbnVlIHRvIHVzZSB0aGUgZXhpc3RpbmcgbW9kaWZpZWQKKwkgKiAgICAgICAgICAgICAgIGFkZHJlc3MuCisJICovCisJcmVhZF9hZGRyZXNzKHNtYywgTlVMTCk7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHNtYy0+aHcuZmRkaV9jYW5vbl9hZGRyLmEsIDYpOworCisJaW5pdF9zbXQoc21jLCBOVUxMKTsKKwlzbXRfb25saW5lKHNtYywgMSk7CisJU1RJX0ZCSSgpOworCisJLyogQ2xlYXIgbG9jYWwgbXVsdGljYXN0IGFkZHJlc3MgdGFibGVzICovCisJbWFjX2NsZWFyX211bHRpY2FzdChzbWMpOworCisJLyogRGlzYWJsZSBwcm9taXNjdW91cyBmaWx0ZXIgc2V0dGluZ3MgKi8KKwltYWNfZHJ2X3J4X21vZGUoc21jLCBSWF9ESVNBQkxFX1BST01JU0MpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gKDApOworfQkJCQkvLyBza2ZwX29wZW4KKworCisvKgorICogPT09PT09PT09PT09PT0KKyAqID0gc2tmcF9jbG9zZSA9CisgKiA9PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBDbG9zZXMgdGhlIGRldmljZS9tb2R1bGUuCisgKiAgCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGRldiAtIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyByb3V0aW5lIGNsb3NlcyB0aGUgYWRhcHRlciBhbmQgYnJpbmdzIGl0IHRvIGEgc2FmZSBzdGF0ZS4KKyAqICAgVGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgaXMgZGVyZWdpc3RlcmVkIHdpdGggdGhlIE9TLgorICogICBUaGUgYWRhcHRlciBjYW4gYmUgb3BlbmVkIGFnYWluIHdpdGggYW5vdGhlciBjYWxsIHRvIHNrZnBfb3BlbigpLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgQWx3YXlzIHJldHVybiAwLgorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBObyBmdXJ0aGVyIHJlcXVlc3RzIGZvciB0aGlzIGFkYXB0ZXIgYXJlIG1hZGUgYWZ0ZXIgdGhpcyByb3V0aW5lIGlzCisgKiAgIGNhbGxlZC4gIHNrZnBfb3BlbigpIGNhbiBiZSBjYWxsZWQgdG8gcmVzZXQgYW5kIHJlaW5pdGlhbGl6ZSB0aGUKKyAqICAgYWRhcHRlci4KKyAqLworc3RhdGljIGludCBza2ZwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNfc21jICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXNrZmRkaV9wcml2ICpicCA9ICZzbWMtPm9zOworCisJQ0xJX0ZCSSgpOworCXNtdF9yZXNldF9kZWZhdWx0cyhzbWMsIDEpOworCWNhcmRfc3RvcChzbWMpOworCW1hY19kcnZfY2xlYXJfdHhfcXVldWUoc21jKTsKKwltYWNfZHJ2X2NsZWFyX3J4X3F1ZXVlKHNtYyk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJLyogRGVyZWdpc3RlciAoZnJlZSkgSVJRICovCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlza2JfcXVldWVfcHVyZ2UoJmJwLT5TZW5kU2tiUXVldWUpOworCWJwLT5RdWV1ZVNrYiA9IE1BWF9UWF9RVUVVRV9MRU47CisKKwlyZXR1cm4gKDApOworfQkJCQkvLyBza2ZwX2Nsb3NlCisKKworLyoKKyAqID09PT09PT09PT09PT09PT09PQorICogPSBza2ZwX2ludGVycnVwdCA9CisgKiA9PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgSW50ZXJydXB0IHByb2Nlc3Npbmcgcm91dGluZQorICogIAorICogUmV0dXJuczoKKyAqICAgTm9uZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGlycSAgICAgICAgLSBpbnRlcnJ1cHQgdmVjdG9yCisgKiAgIGRldl9pZCAgICAgLSBwb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgorICogICAgICAgcmVncyAgIC0gcG9pbnRlciB0byByZWdpc3RlcnMgc3RydWN0dXJlCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyByb3V0aW5lIGNhbGxzIHRoZSBpbnRlcnJ1cHQgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGlzIGFkYXB0ZXIuICBJdAorICogICBkaXNhYmxlcyBhbmQgcmVlbmFibGVzIGFkYXB0ZXIgaW50ZXJydXB0cywgYXMgYXBwcm9wcmlhdGUuICBXZSBjYW4gc3VwcG9ydAorICogICBzaGFyZWQgaW50ZXJydXB0cyBzaW5jZSB0aGUgaW5jb21pbmcgZGV2X2lkIHBvaW50ZXIgcHJvdmlkZXMgb3VyIGRldmljZQorICogICBzdHJ1Y3R1cmUgY29udGV4dC4gQWxsIHRoZSByZWFsIHdvcmsgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUgbW9kdWxlLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgTm9uZQorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBUaGUgaW50ZXJydXB0IGFja25vd2xlZGdlbWVudCBhdCB0aGUgaGFyZHdhcmUgbGV2ZWwgKGVnLiBBQ0tpbmcgdGhlIFBJQworICogICBvbiBJbnRlbC1iYXNlZCBzeXN0ZW1zKSBpcyBkb25lIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIG91dHNpZGUgdGhpcworICogICByb3V0aW5lLgorICoKKyAqICAgICAgIFN5c3RlbSBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIHRocm91Z2ggdGhpcyBjYWxsLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIHRoZW4gcmVlbmFibGVkIGF0IHRoZSBhZGFwdGVyLgorICovCisKK2lycXJldHVybl90IHNrZnBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IHNfc21jICpzbWM7CS8qIHByaXZhdGUgYm9hcmQgc3RydWN0dXJlIHBvaW50ZXIgKi8KKwlza2ZkZGlfcHJpdiAqYnA7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZVxuIiwgZGV2LT5uYW1lLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlicCA9ICZzbWMtPm9zOworCisJLy8gSVJRcyBlbmFibGVkIG9yIGRpc2FibGVkID8KKwlpZiAoaW5wZChBRERSKEIwX0lNU0spKSA9PSAwKSB7CisJCS8vIElSUXMgYXJlIGRpc2FibGVkOiBtdXN0IGJlIHNoYXJlZCBpbnRlcnJ1cHQKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwkvLyBOb3RlOiBBdCB0aGlzIHBvaW50LCBJUlFzIGFyZSBlbmFibGVkLgorCWlmICgoaW5wZChJU1JfQSkgJiBzbWMtPmh3LmlzX2ltYXNrKSA9PSAwKSB7CS8vIElSUT8KKwkJLy8gQWRhcHRlciBkaWQgbm90IGlzc3VlIGFuIElSUTogbXVzdCBiZSBzaGFyZWQgaW50ZXJydXB0CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJQ0xJX0ZCSSgpOwkJLy8gRGlzYWJsZSBJUlFzIGZyb20gb3VyIGFkYXB0ZXIuCisJc3Bpbl9sb2NrKCZicC0+RHJpdmVyTG9jayk7CisKKwkvLyBDYWxsIGludGVycnVwdCBoYW5kbGVyIGluIGhhcmR3YXJlIG1vZHVsZSAoSFdNKS4KKwlmZGRpX2lzcihzbWMpOworCisJaWYgKHNtYy0+b3MuUmVzZXRSZXF1ZXN0ZWQpIHsKKwkJUmVzZXRBZGFwdGVyKHNtYyk7CisJCXNtYy0+b3MuUmVzZXRSZXF1ZXN0ZWQgPSBGQUxTRTsKKwl9CisJc3Bpbl91bmxvY2soJmJwLT5Ecml2ZXJMb2NrKTsKKwlTVElfRkJJKCk7CQkvLyBFbmFibGUgSVJRcyBmcm9tIG91ciBhZGFwdGVyLgorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQkJCQkvLyBza2ZwX2ludGVycnVwdAorCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09CisgKiA9IHNrZnBfY3RsX2dldF9zdGF0cyA9CisgKiA9PT09PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIEdldCBzdGF0aXN0aWNzIGZvciBGRERJIGFkYXB0ZXIKKyAqICAKKyAqIFJldHVybnM6CisgKiAgIFBvaW50ZXIgdG8gRkRESSBzdGF0aXN0aWNzIHN0cnVjdHVyZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGRldiAtIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgR2V0cyBjdXJyZW50IE1JQiBvYmplY3RzIGZyb20gYWRhcHRlciwgdGhlbgorICogICByZXR1cm5zIEZEREkgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgYXMgZGVmaW5lZAorICogICBpbiBpZl9mZGRpLmguCisgKgorICogICBOb3RlOiBTaW5jZSB0aGUgRkRESSBzdGF0aXN0aWNzIHN0cnVjdHVyZSBpcworICogICBzdGlsbCBuZXcgYW5kIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGRvZXNuJ3QKKyAqICAgaGF2ZSBhbiBGRERJLXNwZWNpZmljIGdldCBzdGF0aXN0aWNzIGhhbmRsZXIsCisgKiAgIHdlJ2xsIHJldHVybiB0aGUgRkRESSBzdGF0aXN0aWNzIHN0cnVjdHVyZSBhcworICogICBhIHBvaW50ZXIgdG8gYW4gRXRoZXJuZXQgc3RhdGlzdGljcyBzdHJ1Y3R1cmUuCisgKiAgIFRoYXQgd2F5LCBhdCBsZWFzdCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgc3RhdGlzdGljcworICogICBzdHJ1Y3R1cmUgY2FuIGJlIGRlY29kZWQgcHJvcGVybHkuCisgKiAgIFdlJ2xsIGhhdmUgdG8gcGF5IGF0dGVudGlvbiB0byB0aGlzIHJvdXRpbmUgYXMgdGhlCisgKiAgIGRldmljZSBzdHJ1Y3R1cmUgYmVjb21lcyBtb3JlIG1hdHVyZSBhbmQgTEFOIG1lZGlhCisgKiAgIGluZGVwZW5kZW50LgorICoKKyAqLworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNrZnBfY3RsX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzX3NtYyAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogRmlsbCB0aGUgYnAtPnN0YXRzIHN0cnVjdHVyZSB3aXRoIGRyaXZlci1tYWludGFpbmVkIGNvdW50ZXJzICovCisKKwlicC0+b3MuTWFjU3RhdC5wb3J0X2JzX2ZsYWdbMF0gPSAweDEyMzQ7CisJYnAtPm9zLk1hY1N0YXQucG9ydF9ic19mbGFnWzFdID0gMHg1Njc4OworLy8gZ29vczogbmVlZCB0byBmaWxsIG91dCBmZGRpIHN0YXRpc3RpYworI2lmIDAKKwkvKiBHZXQgRkRESSBTTVQgTUlCIG9iamVjdHMgKi8KKworLyogRmlsbCB0aGUgYnAtPnN0YXRzIHN0cnVjdHVyZSB3aXRoIHRoZSBTTVQgTUlCIG9iamVjdCB2YWx1ZXMgKi8KKworCW1lbWNweShicC0+c3RhdHMuc210X3N0YXRpb25faWQsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfc3RhdGlvbl9pZCwgc2l6ZW9mKGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9zdGF0aW9uX2lkKSk7CisJYnAtPnN0YXRzLnNtdF9vcF92ZXJzaW9uX2lkID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X29wX3ZlcnNpb25faWQ7CisJYnAtPnN0YXRzLnNtdF9oaV92ZXJzaW9uX2lkID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2hpX3ZlcnNpb25faWQ7CisJYnAtPnN0YXRzLnNtdF9sb192ZXJzaW9uX2lkID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2xvX3ZlcnNpb25faWQ7CisJbWVtY3B5KGJwLT5zdGF0cy5zbXRfdXNlcl9kYXRhLCAmYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X3VzZXJfZGF0YSwgc2l6ZW9mKGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF91c2VyX2RhdGEpKTsKKwlicC0+c3RhdHMuc210X21pYl92ZXJzaW9uX2lkID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X21pYl92ZXJzaW9uX2lkOworCWJwLT5zdGF0cy5zbXRfbWFjX2N0cyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9tYWNfY3Q7CisJYnAtPnN0YXRzLnNtdF9ub25fbWFzdGVyX2N0cyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9ub25fbWFzdGVyX2N0OworCWJwLT5zdGF0cy5zbXRfbWFzdGVyX2N0cyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9tYXN0ZXJfY3Q7CisJYnAtPnN0YXRzLnNtdF9hdmFpbGFibGVfcGF0aHMgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfYXZhaWxhYmxlX3BhdGhzOworCWJwLT5zdGF0cy5zbXRfY29uZmlnX2NhcGFiaWxpdGllcyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9jb25maWdfY2FwYWJpbGl0aWVzOworCWJwLT5zdGF0cy5zbXRfY29uZmlnX3BvbGljeSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9jb25maWdfcG9saWN5OworCWJwLT5zdGF0cy5zbXRfY29ubmVjdGlvbl9wb2xpY3kgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfY29ubmVjdGlvbl9wb2xpY3k7CisJYnAtPnN0YXRzLnNtdF90X25vdGlmeSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF90X25vdGlmeTsKKwlicC0+c3RhdHMuc210X3N0YXRfcnB0X3BvbGljeSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9zdGF0X3JwdF9wb2xpY3k7CisJYnAtPnN0YXRzLnNtdF90cmFjZV9tYXhfZXhwaXJhdGlvbiA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF90cmFjZV9tYXhfZXhwaXJhdGlvbjsKKwlicC0+c3RhdHMuc210X2J5cGFzc19wcmVzZW50ID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2J5cGFzc19wcmVzZW50OworCWJwLT5zdGF0cy5zbXRfZWNtX3N0YXRlID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2VjbV9zdGF0ZTsKKwlicC0+c3RhdHMuc210X2NmX3N0YXRlID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2NmX3N0YXRlOworCWJwLT5zdGF0cy5zbXRfcmVtb3RlX2Rpc2Nvbm5lY3RfZmxhZyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9yZW1vdGVfZGlzY29ubmVjdF9mbGFnOworCWJwLT5zdGF0cy5zbXRfc3RhdGlvbl9zdGF0dXMgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfc3RhdGlvbl9zdGF0dXM7CisJYnAtPnN0YXRzLnNtdF9wZWVyX3dyYXBfZmxhZyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9wZWVyX3dyYXBfZmxhZzsKKwlicC0+c3RhdHMuc210X3RpbWVfc3RhbXAgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfbXNnX3RpbWVfc3RhbXAubHM7CisJYnAtPnN0YXRzLnNtdF90cmFuc2l0aW9uX3RpbWVfc3RhbXAgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfdHJhbnNpdGlvbl90aW1lX3N0YW1wLmxzOworCWJwLT5zdGF0cy5tYWNfZnJhbWVfc3RhdHVzX2Z1bmN0aW9ucyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19mcmFtZV9zdGF0dXNfZnVuY3Rpb25zOworCWJwLT5zdGF0cy5tYWNfdF9tYXhfY2FwYWJpbGl0eSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY190X21heF9jYXBhYmlsaXR5OworCWJwLT5zdGF0cy5tYWNfdHZ4X2NhcGFiaWxpdHkgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfdHZ4X2NhcGFiaWxpdHk7CisJYnAtPnN0YXRzLm1hY19hdmFpbGFibGVfcGF0aHMgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfYXZhaWxhYmxlX3BhdGhzOworCWJwLT5zdGF0cy5tYWNfY3VycmVudF9wYXRoID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX2N1cnJlbnRfcGF0aDsKKwltZW1jcHkoYnAtPnN0YXRzLm1hY191cHN0cmVhbV9uYnIsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfdXBzdHJlYW1fbmJyLCBGRERJX0tfQUxFTik7CisJbWVtY3B5KGJwLT5zdGF0cy5tYWNfZG93bnN0cmVhbV9uYnIsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZG93bnN0cmVhbV9uYnIsIEZERElfS19BTEVOKTsKKwltZW1jcHkoYnAtPnN0YXRzLm1hY19vbGRfdXBzdHJlYW1fbmJyLCAmYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX29sZF91cHN0cmVhbV9uYnIsIEZERElfS19BTEVOKTsKKwltZW1jcHkoYnAtPnN0YXRzLm1hY19vbGRfZG93bnN0cmVhbV9uYnIsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfb2xkX2Rvd25zdHJlYW1fbmJyLCBGRERJX0tfQUxFTik7CisJYnAtPnN0YXRzLm1hY19kdXBfYWRkcmVzc190ZXN0ID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX2R1cF9hZGRyZXNzX3Rlc3Q7CisJYnAtPnN0YXRzLm1hY19yZXF1ZXN0ZWRfcGF0aHMgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfcmVxdWVzdGVkX3BhdGhzOworCWJwLT5zdGF0cy5tYWNfZG93bnN0cmVhbV9wb3J0X3R5cGUgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZG93bnN0cmVhbV9wb3J0X3R5cGU7CisJbWVtY3B5KGJwLT5zdGF0cy5tYWNfc210X2FkZHJlc3MsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfc210X2FkZHJlc3MsIEZERElfS19BTEVOKTsKKwlicC0+c3RhdHMubWFjX3RfcmVxID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX3RfcmVxOworCWJwLT5zdGF0cy5tYWNfdF9uZWcgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfdF9uZWc7CisJYnAtPnN0YXRzLm1hY190X21heCA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY190X21heDsKKwlicC0+c3RhdHMubWFjX3R2eF92YWx1ZSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY190dnhfdmFsdWU7CisJYnAtPnN0YXRzLm1hY19mcmFtZV9lcnJvcl90aHJlc2hvbGQgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZnJhbWVfZXJyb3JfdGhyZXNob2xkOworCWJwLT5zdGF0cy5tYWNfZnJhbWVfZXJyb3JfcmF0aW8gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZnJhbWVfZXJyb3JfcmF0aW87CisJYnAtPnN0YXRzLm1hY19ybXRfc3RhdGUgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfcm10X3N0YXRlOworCWJwLT5zdGF0cy5tYWNfZGFfZmxhZyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19kYV9mbGFnOworCWJwLT5zdGF0cy5tYWNfdW5hX2RhX2ZsYWcgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfdW5kYV9mbGFnOworCWJwLT5zdGF0cy5tYWNfZnJhbWVfZXJyb3JfZmxhZyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19mcmFtZV9lcnJvcl9mbGFnOworCWJwLT5zdGF0cy5tYWNfbWFfdW5pdGRhdGFfYXZhaWxhYmxlID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX21hX3VuaXRkYXRhX2F2YWlsYWJsZTsKKwlicC0+c3RhdHMubWFjX2hhcmR3YXJlX3ByZXNlbnQgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfaGFyZHdhcmVfcHJlc2VudDsKKwlicC0+c3RhdHMubWFjX21hX3VuaXRkYXRhX2VuYWJsZSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19tYV91bml0ZGF0YV9lbmFibGU7CisJYnAtPnN0YXRzLnBhdGhfdHZ4X2xvd2VyX2JvdW5kID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucGF0aF90dnhfbG93ZXJfYm91bmQ7CisJYnAtPnN0YXRzLnBhdGhfdF9tYXhfbG93ZXJfYm91bmQgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wYXRoX3RfbWF4X2xvd2VyX2JvdW5kOworCWJwLT5zdGF0cy5wYXRoX21heF90X3JlcSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBhdGhfbWF4X3RfcmVxOworCW1lbWNweShicC0+c3RhdHMucGF0aF9jb25maWd1cmF0aW9uLCAmYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucGF0aF9jb25maWd1cmF0aW9uLCBzaXplb2YoYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucGF0aF9jb25maWd1cmF0aW9uKSk7CisJYnAtPnN0YXRzLnBvcnRfbXlfdHlwZVswXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbXlfdHlwZVswXTsKKwlicC0+c3RhdHMucG9ydF9teV90eXBlWzFdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9teV90eXBlWzFdOworCWJwLT5zdGF0cy5wb3J0X25laWdoYm9yX3R5cGVbMF0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X25laWdoYm9yX3R5cGVbMF07CisJYnAtPnN0YXRzLnBvcnRfbmVpZ2hib3JfdHlwZVsxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbmVpZ2hib3JfdHlwZVsxXTsKKwlicC0+c3RhdHMucG9ydF9jb25uZWN0aW9uX3BvbGljaWVzWzBdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9jb25uZWN0aW9uX3BvbGljaWVzWzBdOworCWJwLT5zdGF0cy5wb3J0X2Nvbm5lY3Rpb25fcG9saWNpZXNbMV0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2Nvbm5lY3Rpb25fcG9saWNpZXNbMV07CisJYnAtPnN0YXRzLnBvcnRfbWFjX2luZGljYXRlZFswXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbWFjX2luZGljYXRlZFswXTsKKwlicC0+c3RhdHMucG9ydF9tYWNfaW5kaWNhdGVkWzFdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9tYWNfaW5kaWNhdGVkWzFdOworCWJwLT5zdGF0cy5wb3J0X2N1cnJlbnRfcGF0aFswXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfY3VycmVudF9wYXRoWzBdOworCWJwLT5zdGF0cy5wb3J0X2N1cnJlbnRfcGF0aFsxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfY3VycmVudF9wYXRoWzFdOworCW1lbWNweSgmYnAtPnN0YXRzLnBvcnRfcmVxdWVzdGVkX3BhdGhzWzAgKiAzXSwgJmJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfcmVxdWVzdGVkX3BhdGhzWzBdLCAzKTsKKwltZW1jcHkoJmJwLT5zdGF0cy5wb3J0X3JlcXVlc3RlZF9wYXRoc1sxICogM10sICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X3JlcXVlc3RlZF9wYXRoc1sxXSwgMyk7CisJYnAtPnN0YXRzLnBvcnRfbWFjX3BsYWNlbWVudFswXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbWFjX3BsYWNlbWVudFswXTsKKwlicC0+c3RhdHMucG9ydF9tYWNfcGxhY2VtZW50WzFdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9tYWNfcGxhY2VtZW50WzFdOworCWJwLT5zdGF0cy5wb3J0X2F2YWlsYWJsZV9wYXRoc1swXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfYXZhaWxhYmxlX3BhdGhzWzBdOworCWJwLT5zdGF0cy5wb3J0X2F2YWlsYWJsZV9wYXRoc1sxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfYXZhaWxhYmxlX3BhdGhzWzFdOworCWJwLT5zdGF0cy5wb3J0X3BtZF9jbGFzc1swXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfcG1kX2NsYXNzWzBdOworCWJwLT5zdGF0cy5wb3J0X3BtZF9jbGFzc1sxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfcG1kX2NsYXNzWzFdOworCWJwLT5zdGF0cy5wb3J0X2Nvbm5lY3Rpb25fY2FwYWJpbGl0aWVzWzBdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9jb25uZWN0aW9uX2NhcGFiaWxpdGllc1swXTsKKwlicC0+c3RhdHMucG9ydF9jb25uZWN0aW9uX2NhcGFiaWxpdGllc1sxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfY29ubmVjdGlvbl9jYXBhYmlsaXRpZXNbMV07CisJYnAtPnN0YXRzLnBvcnRfYnNfZmxhZ1swXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfYnNfZmxhZ1swXTsKKwlicC0+c3RhdHMucG9ydF9ic19mbGFnWzFdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9ic19mbGFnWzFdOworCWJwLT5zdGF0cy5wb3J0X2xlcl9lc3RpbWF0ZVswXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbGVyX2VzdGltYXRlWzBdOworCWJwLT5zdGF0cy5wb3J0X2xlcl9lc3RpbWF0ZVsxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbGVyX2VzdGltYXRlWzFdOworCWJwLT5zdGF0cy5wb3J0X2xlcl9jdXRvZmZbMF0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2xlcl9jdXRvZmZbMF07CisJYnAtPnN0YXRzLnBvcnRfbGVyX2N1dG9mZlsxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbGVyX2N1dG9mZlsxXTsKKwlicC0+c3RhdHMucG9ydF9sZXJfYWxhcm1bMF0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2xlcl9hbGFybVswXTsKKwlicC0+c3RhdHMucG9ydF9sZXJfYWxhcm1bMV0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2xlcl9hbGFybVsxXTsKKwlicC0+c3RhdHMucG9ydF9jb25uZWN0X3N0YXRlWzBdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9jb25uZWN0X3N0YXRlWzBdOworCWJwLT5zdGF0cy5wb3J0X2Nvbm5lY3Rfc3RhdGVbMV0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2Nvbm5lY3Rfc3RhdGVbMV07CisJYnAtPnN0YXRzLnBvcnRfcGNtX3N0YXRlWzBdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9wY21fc3RhdGVbMF07CisJYnAtPnN0YXRzLnBvcnRfcGNtX3N0YXRlWzFdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9wY21fc3RhdGVbMV07CisJYnAtPnN0YXRzLnBvcnRfcGNfd2l0aGhvbGRbMF0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X3BjX3dpdGhob2xkWzBdOworCWJwLT5zdGF0cy5wb3J0X3BjX3dpdGhob2xkWzFdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9wY193aXRoaG9sZFsxXTsKKwlicC0+c3RhdHMucG9ydF9sZXJfZmxhZ1swXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbGVyX2ZsYWdbMF07CisJYnAtPnN0YXRzLnBvcnRfbGVyX2ZsYWdbMV0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2xlcl9mbGFnWzFdOworCWJwLT5zdGF0cy5wb3J0X2hhcmR3YXJlX3ByZXNlbnRbMF0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2hhcmR3YXJlX3ByZXNlbnRbMF07CisJYnAtPnN0YXRzLnBvcnRfaGFyZHdhcmVfcHJlc2VudFsxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfaGFyZHdhcmVfcHJlc2VudFsxXTsKKworCisJLyogRmlsbCB0aGUgYnAtPnN0YXRzIHN0cnVjdHVyZSB3aXRoIHRoZSBGRERJIGNvdW50ZXIgdmFsdWVzICovCisKKwlicC0+c3RhdHMubWFjX2ZyYW1lX2N0cyA9IGJwLT5jbWRfcnNwX3ZpcnQtPmNudHJzX2dldC5jbnRycy5mcmFtZV9jbnQubHM7CisJYnAtPnN0YXRzLm1hY19jb3BpZWRfY3RzID0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLmNvcGllZF9jbnQubHM7CisJYnAtPnN0YXRzLm1hY190cmFuc21pdF9jdHMgPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMudHJhbnNtaXRfY250LmxzOworCWJwLT5zdGF0cy5tYWNfZXJyb3JfY3RzID0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLmVycm9yX2NudC5sczsKKwlicC0+c3RhdHMubWFjX2xvc3RfY3RzID0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLmxvc3RfY250LmxzOworCWJwLT5zdGF0cy5wb3J0X2xjdF9mYWlsX2N0c1swXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPmNudHJzX2dldC5jbnRycy5sY3RfcmVqZWN0c1swXS5sczsKKwlicC0+c3RhdHMucG9ydF9sY3RfZmFpbF9jdHNbMV0gPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMubGN0X3JlamVjdHNbMV0ubHM7CisJYnAtPnN0YXRzLnBvcnRfbGVtX3JlamVjdF9jdHNbMF0gPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMubGVtX3JlamVjdHNbMF0ubHM7CisJYnAtPnN0YXRzLnBvcnRfbGVtX3JlamVjdF9jdHNbMV0gPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMubGVtX3JlamVjdHNbMV0ubHM7CisJYnAtPnN0YXRzLnBvcnRfbGVtX2N0c1swXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPmNudHJzX2dldC5jbnRycy5saW5rX2Vycm9yc1swXS5sczsKKwlicC0+c3RhdHMucG9ydF9sZW1fY3RzWzFdID0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLmxpbmtfZXJyb3JzWzFdLmxzOworCisjZW5kaWYKKwlyZXR1cm4gKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSAmYnAtPm9zLk1hY1N0YXQpOworfQkJCQkvLyBjdGxfZ2V0X3N0YXQKKworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiA9IHNrZnBfY3RsX3NldF9tdWx0aWNhc3RfbGlzdCA9CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgRW5hYmxlL0Rpc2FibGUgTExDIGZyYW1lIHByb21pc2N1b3VzIG1vZGUgcmVjZXB0aW9uCisgKiAgIG9uIHRoZSBhZGFwdGVyIGFuZC9vciB1cGRhdGUgbXVsdGljYXN0IGFkZHJlc3MgdGFibGUuCisgKiAgCisgKiBSZXR1cm5zOgorICogICBOb25lCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgZGV2IC0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBUaGlzIGZ1bmN0aW9uIGFjcXVpcmVzIHRoZSBkcml2ZXIgbG9jayBhbmQgb25seSBjYWxscworICogICBza2ZwX2N0bF9zZXRfbXVsdGljYXN0X2xpc3Rfd29fbG9jayB0aGVuLgorICogICBUaGlzIHJvdXRpbmUgZm9sbG93cyBhIGZhaXJseSBzaW1wbGUgYWxnb3JpdGhtIGZvciBzZXR0aW5nIHRoZQorICogICBhZGFwdGVyIGZpbHRlcnMgYW5kIENBTToKKyAqCisgKiAgICAgIGlmIElGRl9QUk9NSVNDIGZsYWcgaXMgc2V0CisgKiAgICAgICAgICAgICAgZW5hYmxlIHByb21pc2N1b3VzIG1vZGUKKyAqICAgICAgZWxzZQorICogICAgICAgICAgICAgIGRpc2FibGUgcHJvbWlzY3VvdXMgbW9kZQorICogICAgICAgICAgICAgIGlmIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIDw9IG1heC4gbXVsdGljYXN0IG51bWJlcgorICogICAgICAgICAgICAgICAgICAgICAgYWRkIG1jIGFkZHJlc3NlcyB0byBhZGFwdGVyIHRhYmxlCisgKiAgICAgICAgICAgICAgZWxzZQorICogICAgICAgICAgICAgICAgICAgICAgZW5hYmxlIHByb21pc2N1b3VzIG1vZGUKKyAqICAgICAgICAgICAgICB1cGRhdGUgYWRhcHRlciBmaWx0ZXJzCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIE11bHRpY2FzdCBhZGRyZXNzZXMgYXJlIHByZXNlbnRlZCBpbiBjYW5vbmljYWwgKExTQikgZm9ybWF0LgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgT24tYm9hcmQgYWRhcHRlciBmaWx0ZXJzIGFyZSB1cGRhdGVkLgorICovCitzdGF0aWMgdm9pZCBza2ZwX2N0bF9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc19zbWMgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisJc2tmZGRpX3ByaXYgKmJwID0gJnNtYy0+b3M7CisJdW5zaWduZWQgbG9uZyBGbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+RHJpdmVyTG9jaywgRmxhZ3MpOworCXNrZnBfY3RsX3NldF9tdWx0aWNhc3RfbGlzdF93b19sb2NrKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPkRyaXZlckxvY2ssIEZsYWdzKTsKKwlyZXR1cm47Cit9CQkJCS8vIHNrZnBfY3RsX3NldF9tdWx0aWNhc3RfbGlzdAorCisKKworc3RhdGljIHZvaWQgc2tmcF9jdGxfc2V0X211bHRpY2FzdF9saXN0X3dvX2xvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc19zbWMgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWk7CS8qIHB0ciB0byBtdWx0aWNhc3QgYWRkciBlbnRyeSAqLworCWludCBpOworCisJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUsIGlmIG5lY2Vzc2FyeSAqLworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJbWFjX2Rydl9yeF9tb2RlKHNtYywgUlhfRU5BQkxFX1BST01JU0MpOworCQlQUklOVEsoS0VSTl9JTkZPICJQUk9NSVNDVU9VUyBNT0RFIEVOQUJMRURcbiIpOworCX0KKwkvKiBFbHNlLCB1cGRhdGUgbXVsdGljYXN0IGFkZHJlc3MgdGFibGUgKi8KKwllbHNlIHsKKwkJbWFjX2Rydl9yeF9tb2RlKHNtYywgUlhfRElTQUJMRV9QUk9NSVNDKTsKKwkJUFJJTlRLKEtFUk5fSU5GTyAiUFJPTUlTQ1VPVVMgTU9ERSBESVNBQkxFRFxuIik7CisKKwkJLy8gUmVzZXQgYWxsIE1DIGFkZHJlc3NlcworCQltYWNfY2xlYXJfbXVsdGljYXN0KHNtYyk7CisJCW1hY19kcnZfcnhfbW9kZShzbWMsIFJYX0RJU0FCTEVfQUxMTVVMVEkpOworCisJCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCQltYWNfZHJ2X3J4X21vZGUoc21jLCBSWF9FTkFCTEVfQUxMTVVMVEkpOworCQkJUFJJTlRLKEtFUk5fSU5GTyAiRU5BQkxFIEFMTCBNQyBBRERSRVNTRVNcbiIpOworCQl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPiAwKSB7CisJCQlpZiAoZGV2LT5tY19jb3VudCA8PSBGUE1BWF9NVUxUSUNBU1QpIHsKKwkJCQkvKiB1c2UgZXhhY3QgZmlsdGVyaW5nICovCisKKwkJCQkvLyBwb2ludCB0byBmaXJzdCBtdWx0aWNhc3QgYWRkcgorCQkJCWRtaSA9IGRldi0+bWNfbGlzdDsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJCQkJbWFjX2FkZF9tdWx0aWNhc3Qoc21jLCAKKwkJCQkJCQkgIChzdHJ1Y3QgZmRkaV9hZGRyICopZG1pLT5kbWlfYWRkciwgCisJCQkJCQkJICAxKTsKKworCQkJCQlQUklOVEsoS0VSTl9JTkZPICJFTkFCTEUgTUMgQUREUkVTUzoiKTsKKwkJCQkJUFJJTlRLKCIgJTAyeCAlMDJ4ICUwMnggIiwKKwkJCQkJICAgICAgIGRtaS0+ZG1pX2FkZHJbMF0sCisJCQkJCSAgICAgICBkbWktPmRtaV9hZGRyWzFdLAorCQkJCQkgICAgICAgZG1pLT5kbWlfYWRkclsyXSk7CisJCQkJCVBSSU5USygiJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJCSAgICAgICBkbWktPmRtaV9hZGRyWzNdLAorCQkJCQkgICAgICAgZG1pLT5kbWlfYWRkcls0XSwKKwkJCQkJICAgICAgIGRtaS0+ZG1pX2FkZHJbNV0pOworCQkJCQlkbWkgPSBkbWktPm5leHQ7CisJCQkJfQkvLyBmb3IKKworCQkJfSBlbHNlIHsJLy8gbW9yZSBNQyBhZGRyZXNzZXMgdGhhbiBIVyBzdXBwb3J0cworCisJCQkJbWFjX2Rydl9yeF9tb2RlKHNtYywgUlhfRU5BQkxFX0FMTE1VTFRJKTsKKwkJCQlQUklOVEsoS0VSTl9JTkZPICJFTkFCTEUgQUxMIE1DIEFERFJFU1NFU1xuIik7CisJCQl9CisJCX0gZWxzZSB7CS8vIG5vIE1DIGFkZHJlc3NlcworCisJCQlQUklOVEsoS0VSTl9JTkZPICJESVNBQkxFIEFMTCBNQyBBRERSRVNTRVNcbiIpOworCQl9CisKKwkJLyogVXBkYXRlIGFkYXB0ZXIgZmlsdGVycyAqLworCQltYWNfdXBkYXRlX211bHRpY2FzdChzbWMpOworCX0KKwlyZXR1cm47Cit9CQkJCS8vIHNrZnBfY3RsX3NldF9tdWx0aWNhc3RfbGlzdF93b19sb2NrCisKKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogPSBza2ZwX2N0bF9zZXRfbWFjX2FkZHJlc3MgPQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIHNldCBuZXcgbWFjIGFkZHJlc3Mgb24gYWRhcHRlciBhbmQgdXBkYXRlIGRldl9hZGRyIGZpZWxkIGluIGRldmljZSB0YWJsZS4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBkZXYgIC0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKyAqICAgYWRkciAtIHBvaW50ZXIgdG8gc29ja2FkZHIgc3RydWN0dXJlIGNvbnRhaW5pbmcgdW5pY2FzdCBhZGRyZXNzIHRvIHNldAorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBUaGUgYWRkcmVzcyBwb2ludGVkIHRvIGJ5IGFkZHItPnNhX2RhdGEgaXMgYSB2YWxpZCB1bmljYXN0CisgKiAgIGFkZHJlc3MgYW5kIGlzIHByZXNlbnRlZCBpbiBjYW5vbmljYWwgKExTQikgZm9ybWF0LgorICovCitzdGF0aWMgaW50IHNrZnBfY3RsX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzX3NtYyAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnBfc29ja2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopIGFkZHI7CisJc2tmZGRpX3ByaXYgKmJwID0gJnNtYy0+b3M7CisJdW5zaWduZWQgbG9uZyBGbGFnczsKKworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHBfc29ja2FkZHItPnNhX2RhdGEsIEZERElfS19BTEVOKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPkRyaXZlckxvY2ssIEZsYWdzKTsKKwlSZXNldEFkYXB0ZXIoc21jKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+RHJpdmVyTG9jaywgRmxhZ3MpOworCisJcmV0dXJuICgwKTsJCS8qIGFsd2F5cyByZXR1cm4gemVybyAqLworfQkJCQkvLyBza2ZwX2N0bF9zZXRfbWFjX2FkZHJlc3MKKworCisvKgorICogPT09PT09PT09PT09PT0KKyAqID0gc2tmcF9pb2N0bCA9CisgKiA9PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICoKKyAqIFBlcmZvcm0gSU9DVEwgY2FsbCBmdW5jdGlvbnMgaGVyZS4gU29tZSBhcmUgcHJpdmlsZWdlZCBvcGVyYXRpb25zIGFuZCB0aGUKKyAqIGVmZmVjdGl2ZSB1aWQgaXMgY2hlY2tlZCBpbiB0aG9zZSBjYXNlcy4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIHN0YXR1cyB2YWx1ZQorICogICAwIC0gc3VjY2VzcworICogICBvdGhlciAtIGZhaWx1cmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBkZXYgIC0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKyAqICAgcnEgLSBwb2ludGVyIHRvIGlvY3RsIHJlcXVlc3Qgc3RydWN0dXJlCisgKiAgIGNtZCAtID8KKyAqCisgKi8KKworCitzdGF0aWMgaW50IHNrZnBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc19zbWMgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisJc2tmZGRpX3ByaXYgKmxwID0gJnNtYy0+b3M7CisJc3RydWN0IHNfc2tmcF9pb2N0bCBpb2M7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlvYywgcnEtPmlmcl9kYXRhLCBzaXplb2Yoc3RydWN0IHNfc2tmcF9pb2N0bCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoaW9jLmNtZCkgeworCWNhc2UgU0tGUF9HRVRfU1RBVFM6CS8qIEdldCB0aGUgZHJpdmVyIHN0YXRpc3RpY3MgKi8KKwkJaW9jLmxlbiA9IHNpemVvZihscC0+TWFjU3RhdCk7CisJCXN0YXR1cyA9IGNvcHlfdG9fdXNlcihpb2MuZGF0YSwgc2tmcF9jdGxfZ2V0X3N0YXRzKGRldiksIGlvYy5sZW4pCisJCQkJPyAtRUZBVUxUIDogMDsKKwkJYnJlYWs7CisJY2FzZSBTS0ZQX0NMUl9TVEFUUzoJLyogWmVybyBvdXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJbWVtc2V0KCZscC0+TWFjU3RhdCwgMCwgc2l6ZW9mKGxwLT5NYWNTdGF0KSk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJpb2N0bCBmb3IgJXM6IHVua25vdyBjbWQ6ICUwNHhcbiIsIGRldi0+bmFtZSwgaW9jLmNtZCk7CisJCXN0YXR1cyA9IC1FT1BOT1RTVVBQOworCisJfQkJCS8vIHN3aXRjaAorCisJcmV0dXJuIHN0YXR1czsKK30JCQkJLy8gc2tmcF9pb2N0bAorCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT0KKyAqID0gc2tmcF9zZW5kX3BrdCAgICAgPQorICogPT09PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIFF1ZXVlcyBhIHBhY2tldCBmb3IgdHJhbnNtaXNzaW9uIGFuZCB0cnkgdG8gdHJhbnNtaXQgaXQuCisgKiAgCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIHNrYiAtIHBvaW50ZXIgdG8gc2tfYnVmZiB0byBxdWV1ZSBmb3IgdHJhbnNtaXNzaW9uCisgKiAgIGRldiAtIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgSGVyZSB3ZSBhc3N1bWUgdGhhdCBhbiBpbmNvbWluZyBza2IgdHJhbnNtaXQgcmVxdWVzdAorICogICBpcyBjb250YWluZWQgaW4gYSBzaW5nbGUgcGh5c2ljYWxseSBjb250aWd1b3VzIGJ1ZmZlcgorICogICBpbiB3aGljaCB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiBwYWNrZXQKKyAqICAgKHNrYi0+ZGF0YSkgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHBoeXNpY2FsIGFkZHJlc3MKKyAqICAgYnkgdXNpbmcgcGNpX21hcF9zaW5nbGUoKS4KKyAqCisgKiAgIFdlIGhhdmUgYW4gaW50ZXJuYWwgcXVldWUgZm9yIHBhY2tldHMgd2UgY2FuIG5vdCBzZW5kIAorICogICBpbW1lZGlhdGVseS4gUGFja2V0cyBpbiB0aGlzIHF1ZXVlIGNhbiBiZSBnaXZlbiB0byB0aGUgCisgKiAgIGFkYXB0ZXIgaWYgdHJhbnNtaXQgYnVmZmVycyBhcmUgZnJlZWQuCisgKgorICogICBXZSBjYW4ndCBmcmVlIHRoZSBza2IgdW50aWwgYWZ0ZXIgaXQncyBiZWVuIERNQSdkCisgKiAgIG91dCBieSB0aGUgYWRhcHRlciwgc28gd2UnbGwga2VlcCBpdCBpbiB0aGUgZHJpdmVyIGFuZAorICogICByZXR1cm4gaXQgaW4gbWFjX2Rydl90eF9jb21wbGV0ZS4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIDAgLSBkcml2ZXIgaGFzIHF1ZXVlZCBhbmQvb3Igc2VudCBwYWNrZXQKKyAqICAgICAgIDEgLSBjYWxsZXIgc2hvdWxkIHJlcXVldWUgdGhlIHNrX2J1ZmYgZm9yIGxhdGVyIHRyYW5zbWlzc2lvbgorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBUaGUgZW50aXJlIHBhY2tldCBpcyBzdG9yZWQgaW4gb25lIHBoeXNpY2FsbHkKKyAqICAgY29udGlndW91cyBidWZmZXIgd2hpY2ggaXMgbm90IGNhY2hlZCBhbmQgd2hvc2UKKyAqICAgMzItYml0IHBoeXNpY2FsIGFkZHJlc3MgY2FuIGJlIGRldGVybWluZWQuCisgKgorICogICBJdCdzIHZpdGFsIHRoYXQgdGhpcyByb3V0aW5lIGlzIE5PVCByZWVudGVyZWQgZm9yIHRoZQorICogICBzYW1lIGJvYXJkIGFuZCB0aGF0IHRoZSBPUyBpcyBub3QgaW4gYW5vdGhlciBzZWN0aW9uIG9mCisgKiAgIGNvZGUgKGVnLiBza2ZwX2ludGVycnVwdCkgZm9yIHRoZSBzYW1lIGJvYXJkIG9uIGEKKyAqICAgZGlmZmVyZW50IHRocmVhZC4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIE5vbmUKKyAqLworc3RhdGljIGludCBza2ZwX3NlbmRfcGt0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNfc21jICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXNrZmRkaV9wcml2ICpicCA9ICZzbWMtPm9zOworCisJUFJJTlRLKEtFUk5fSU5GTyAic2tmcF9zZW5kX3BrdFxuIik7CisKKwkvKgorCSAqIFZlcmlmeSB0aGF0IGluY29taW5nIHRyYW5zbWl0IHJlcXVlc3QgaXMgT0sKKwkgKgorCSAqIE5vdGU6IFRoZSBwYWNrZXQgc2l6ZSBjaGVjayBpcyBjb25zaXN0ZW50IHdpdGggb3RoZXIKKwkgKiAgICAgICAgICAgICAgIExpbnV4IGRldmljZSBkcml2ZXJzLCBhbHRob3VnaCB0aGUgY29ycmVjdCBwYWNrZXQKKwkgKiAgICAgICAgICAgICAgIHNpemUgc2hvdWxkIGJlIHZlcmlmaWVkIGJlZm9yZSBjYWxsaW5nIHRoZQorCSAqICAgICAgICAgICAgICAgdHJhbnNtaXQgcm91dGluZS4KKwkgKi8KKworCWlmICghKHNrYi0+bGVuID49IEZERElfS19MTENfWkxFTiAmJiBza2ItPmxlbiA8PSBGRERJX0tfTExDX0xFTikpIHsKKwkJYnAtPk1hY1N0YXQuZ2VuLnR4X2Vycm9ycysrOwkvKiBidW1wIGVycm9yIGNvdW50ZXIgKi8KKwkJLy8gZGVxdWV1ZSBwYWNrZXRzIGZyb20geG10IHF1ZXVlIGFuZCBzZW5kIHRoZW0KKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gKDApOwkvKiByZXR1cm4gInN1Y2Nlc3MiICovCisJfQorCWlmIChicC0+UXVldWVTa2IgPT0gMCkgewkvLyByZXR1cm4gd2l0aCB0YnVzeSBzZXQ6IHF1ZXVlIGZ1bGwKKworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXJldHVybiAxOworCX0KKwlicC0+UXVldWVTa2ItLTsKKwlza2JfcXVldWVfdGFpbCgmYnAtPlNlbmRTa2JRdWV1ZSwgc2tiKTsKKwlzZW5kX3F1ZXVlZF9wYWNrZXRzKG5ldGRldl9wcml2KGRldikpOworCWlmIChicC0+UXVldWVTa2IgPT0gMCkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJldHVybiAwOworCit9CQkJCS8vIHNrZnBfc2VuZF9wa3QKKworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT0KKyAqID0gc2VuZF9xdWV1ZWRfcGFja2V0cyA9CisgKiA9PT09PT09PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBTZW5kIHBhY2tldHMgZnJvbSB0aGUgZHJpdmVyIHF1ZXVlIGFzIGxvbmcgYXMgdGhlcmUgYXJlIHNvbWUgYW5kCisgKiAgIHRyYW5zbWl0IHJlc291cmNlcyBhcmUgYXZhaWxhYmxlLgorICogIAorICogUmV0dXJuczoKKyAqICAgTm9uZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIHNtYyAtIHBvaW50ZXIgdG8gc21jIChhZGFwdGVyKSBzdHJ1Y3R1cmUKKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBUYWtlIGEgcGFja2V0IGZyb20gcXVldWUgaWYgdGhlcmUgaXMgYW55LiBJZiBub3QsIHRoZW4gd2UgYXJlIGRvbmUuCisgKiAgIENoZWNrIGlmIHRoZXJlIGFyZSByZXNvdXJjZXMgdG8gc2VuZCB0aGUgcGFja2V0LiBJZiBub3QsIHJlcXVldWUgaXQKKyAqICAgYW5kIGV4aXQuIAorICogICBTZXQgcGFja2V0IGRlc2NyaXB0b3IgZmxhZ3MgYW5kIGdpdmUgcGFja2V0IHRvIGFkYXB0ZXIuCisgKiAgIENoZWNrIGlmIGFueSBzZW5kIHJlc291cmNlcyBjYW4gYmUgZnJlZWQgKHdlIGRvIG5vdCB1c2UgdGhlCisgKiAgIHRyYW5zbWl0IGNvbXBsZXRlIGludGVycnVwdCkuCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfcXVldWVkX3BhY2tldHMoc3RydWN0IHNfc21jICpzbWMpCit7CisJc2tmZGRpX3ByaXYgKmJwID0gJnNtYy0+b3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyIGZjOworCWludCBxdWV1ZTsKKwlzdHJ1Y3Qgc19zbXRfZnBfdHhkICp0eGQ7CS8vIEN1cnJlbnQgVHhELgorCWRtYV9hZGRyX3QgZG1hX2FkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBGbGFnczsKKworCWludCBmcmFtZV9zdGF0dXM7CS8vIEhXTSB0eCBmcmFtZSBzdGF0dXMuCisKKwlQUklOVEsoS0VSTl9JTkZPICJzZW5kIHF1ZXVlZCBwYWNrZXRzXG4iKTsKKwlmb3IgKDs7KSB7CisJCS8vIHNlbmQgZmlyc3QgYnVmZmVyIGZyb20gcXVldWUKKwkJc2tiID0gc2tiX2RlcXVldWUoJmJwLT5TZW5kU2tiUXVldWUpOworCisJCWlmICghc2tiKSB7CisJCQlQUklOVEsoS0VSTl9JTkZPICJxdWV1ZSBlbXB0eVxuIik7CisJCQlyZXR1cm47CisJCX0JCS8vIHF1ZXVlIGVtcHR5ICEKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPkRyaXZlckxvY2ssIEZsYWdzKTsKKwkJZmMgPSBza2ItPmRhdGFbMF07CisJCXF1ZXVlID0gKGZjICYgRkNfU1lOQ19CSVQpID8gUVVFVUVfUyA6IFFVRVVFX0EwOworI2lmZGVmIEVTUworCQkvLyBDaGVjayBpZiB0aGUgZnJhbWUgbWF5L211c3QgYmUgc2VudCBhcyBhIHN5bmNocm9ub3VzIGZyYW1lLgorCisJCWlmICgoZmMgJiB+KEZDX1NZTkNfQklUIHwgRkNfTExDX1BSSU9SKSkgPT0gRkNfQVNZTkNfTExDKSB7CisJCQkvLyBJdCdzIGFuIExMQyBmcmFtZS4KKwkJCWlmICghc21jLT5lc3Muc3luY19id19hdmFpbGFibGUpCisJCQkJZmMgJj0gfkZDX1NZTkNfQklUOyAvLyBObyBiYW5kd2lkdGggYXZhaWxhYmxlLgorCisJCQllbHNlIHsJLy8gQmFuZHdpZHRoIGlzIGF2YWlsYWJsZS4KKworCQkJCWlmIChzbWMtPm1pYi5mZGRpRVNTU3luY2hUeE1vZGUpIHsKKwkJCQkJLy8gU2VuZCBhcyBzeW5jLiBmcmFtZS4KKwkJCQkJZmMgfD0gRkNfU1lOQ19CSVQ7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYJCQkJLy8gRVNTCisJCWZyYW1lX3N0YXR1cyA9IGh3bV90eF9pbml0KHNtYywgZmMsIDEsIHNrYi0+bGVuLCBxdWV1ZSk7CisKKwkJaWYgKChmcmFtZV9zdGF0dXMgJiAoTE9DX1RYIHwgTEFOX1RYKSkgPT0gMCkgeworCQkJLy8gVW5hYmxlIHRvIHNlbmQgdGhlIGZyYW1lLgorCisJCQlpZiAoKGZyYW1lX3N0YXR1cyAmIFJJTkdfRE9XTikgIT0gMCkgeworCQkJCS8vIFJpbmcgaXMgZG93bi4KKwkJCQlQUklOVEsoIlR4IGF0dGVtcHQgd2hpbGUgcmluZyBkb3duLlxuIik7CisJCQl9IGVsc2UgaWYgKChmcmFtZV9zdGF0dXMgJiBPVVRfT0ZfVFhEKSAhPSAwKSB7CisJCQkJUFJJTlRLKCIlczogb3V0IG9mIFRYRHMuXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJUFJJTlRLKCIlczogb3V0IG9mIHRyYW5zbWl0IHJlc291cmNlcyIsCisJCQkJCWJwLT5kZXYtPm5hbWUpOworCQkJfQorCisJCQkvLyBOb3RlOiBXZSB3aWxsIHJldHJ5IHRoZSBvcGVyYXRpb24gYXMgc29vbiBhcworCQkJLy8gdHJhbnNtaXQgcmVzb3VyY2VzIGJlY29tZSBhdmFpbGFibGUuCisJCQlza2JfcXVldWVfaGVhZCgmYnAtPlNlbmRTa2JRdWV1ZSwgc2tiKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5Ecml2ZXJMb2NrLCBGbGFncyk7CisJCQlyZXR1cm47CS8vIFBhY2tldCBoYXMgYmVlbiBxdWV1ZWQuCisKKwkJfQkJLy8gaWYgKHVuYWJsZSB0byBzZW5kIGZyYW1lKQorCisJCWJwLT5RdWV1ZVNrYisrOwkvLyBvbmUgcGFja2V0IGxlc3MgaW4gbG9jYWwgcXVldWUKKworCQkvLyBzb3VyY2UgYWRkcmVzcyBpbiBwYWNrZXQgPworCQlDaGVja1NvdXJjZUFkZHJlc3Moc2tiLT5kYXRhLCBzbWMtPmh3LmZkZGlfY2Fub25fYWRkci5hKTsKKworCQl0eGQgPSAoc3RydWN0IHNfc210X2ZwX3R4ZCAqKSBIV01fR0VUX0NVUlJfVFhEKHNtYywgcXVldWUpOworCisJCWRtYV9hZGRyZXNzID0gcGNpX21hcF9zaW5nbGUoJmJwLT5wZGV2LCBza2ItPmRhdGEsCisJCQkJCSAgICAgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlpZiAoZnJhbWVfc3RhdHVzICYgTEFOX1RYKSB7CisJCQl0eGQtPnR4ZF9vcy5za2IgPSBza2I7CQkJLy8gc2F2ZSBza2IKKwkJCXR4ZC0+dHhkX29zLmRtYV9hZGRyID0gZG1hX2FkZHJlc3M7CS8vIHNhdmUgZG1hIG1hcHBpbmcKKwkJfQorCQlod21fdHhfZnJhZyhzbWMsIHNrYi0+ZGF0YSwgZG1hX2FkZHJlc3MsIHNrYi0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3N0YXR1cyB8IEZJUlNUX0ZSQUcgfCBMQVNUX0ZSQUcgfCBFTl9JUlFfRU9GKTsKKworCQlpZiAoIShmcmFtZV9zdGF0dXMgJiBMQU5fVFgpKSB7CQkvLyBsb2NhbCBvbmx5IGZyYW1lCisJCQlwY2lfdW5tYXBfc2luZ2xlKCZicC0+cGRldiwgZG1hX2FkZHJlc3MsCisJCQkJCSBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5Ecml2ZXJMb2NrLCBGbGFncyk7CisJfQkJCS8vIGZvcgorCisJcmV0dXJuOwkJCS8vIG5ldmVyIHJlYWNoZWQKKworfQkJCQkvLyBzZW5kX3F1ZXVlZF9wYWNrZXRzCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDaGVja1NvdXJjZUFkZHJlc3MKKyAqCisgKiBWZXJpZnkgaWYgdGhlIHNvdXJjZSBhZGRyZXNzIGlzIHNldC4gSW5zZXJ0IGl0IGlmIG5lY2Vzc2FyeS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBDaGVja1NvdXJjZUFkZHJlc3ModW5zaWduZWQgY2hhciAqZnJhbWUsIHVuc2lnbmVkIGNoYXIgKmh3X2FkZHIpCit7CisJdW5zaWduZWQgY2hhciBTUkJpdDsKKworCWlmICgoKCh1bnNpZ25lZCBsb25nKSBmcmFtZVsxICsgNl0pICYgfjB4MDEpICE9IDApIC8vIHNvdXJjZSByb3V0aW5nIGJpdAorCisJCXJldHVybjsKKwlpZiAoKHVuc2lnbmVkIHNob3J0KSBmcmFtZVsxICsgMTBdICE9IDApCisJCXJldHVybjsKKwlTUkJpdCA9IGZyYW1lWzEgKyA2XSAmIDB4MDE7CisJbWVtY3B5KCZmcmFtZVsxICsgNl0sIGh3X2FkZHIsIDYpOworCWZyYW1lWzhdIHw9IFNSQml0OworfQkJCQkvLyBDaGVja1NvdXJjZUFkZHJlc3MKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJUmVzZXRBZGFwdGVyCisgKgorICoJUmVzZXQgdGhlIGFkYXB0ZXIgYW5kIGJyaW5nIGl0IGJhY2sgdG8gb3BlcmF0aW9uYWwgbW9kZS4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICogT3V0CisgKglOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBSZXNldEFkYXB0ZXIoc3RydWN0IHNfc21jICpzbWMpCit7CisKKwlQUklOVEsoS0VSTl9JTkZPICJbZmRkaTogUmVzZXRBZGFwdGVyXVxuIik7CisKKwkvLyBTdG9wIHRoZSBhZGFwdGVyLgorCisJY2FyZF9zdG9wKHNtYyk7CQkvLyBTdG9wIGFsbCBhY3Rpdml0eS4KKworCS8vIENsZWFyIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBkZXNjcmlwdG9yIHF1ZXVlcy4KKwltYWNfZHJ2X2NsZWFyX3R4X3F1ZXVlKHNtYyk7CisJbWFjX2Rydl9jbGVhcl9yeF9xdWV1ZShzbWMpOworCisJLy8gUmVzdGFydCB0aGUgYWRhcHRlci4KKworCXNtdF9yZXNldF9kZWZhdWx0cyhzbWMsIDEpOwkvLyBJbml0aWFsaXplIHRoZSBTTVQgbW9kdWxlLgorCisJaW5pdF9zbXQoc21jLCAoc21jLT5vcy5kZXYpLT5kZXZfYWRkcik7CS8vIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlLgorCisJc210X29ubGluZShzbWMsIDEpOwkvLyBJbnNlcnQgaW50byB0aGUgcmluZyBhZ2Fpbi4KKwlTVElfRkJJKCk7CisKKwkvLyBSZXN0b3JlIG9yaWdpbmFsIHJlY2VpdmUgbW9kZSAobXVsdGljYXN0cywgcHJvbWlzY3VvdXMsIGV0Yy4pLgorCXNrZnBfY3RsX3NldF9tdWx0aWNhc3RfbGlzdF93b19sb2NrKHNtYy0+b3MuZGV2KTsKK30JCQkJLy8gUmVzZXRBZGFwdGVyCisKKworLy8tLS0tLS0tLS0tLS0tLS0gZnVuY3Rpb25zIGNhbGxlZCBieSBoYXJkd2FyZSBtb2R1bGUgLS0tLS0tLS0tLS0tLS0tLQorCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJbGxjX3Jlc3RhcnRfdHgKKyAqCisgKglUaGUgaGFyZHdhcmUgZHJpdmVyIGNhbGxzIHRoaXMgcm91dGluZSB3aGVuIHRoZSB0cmFuc21pdCBjb21wbGV0ZQorICoJaW50ZXJydXB0IGJpdHMgKGVuZCBvZiBmcmFtZSkgZm9yIHRoZSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMKKyAqCXF1ZXVlIGlzIHNldC4KKyAqCisgKiBOT1RFIFRoZSBoYXJkd2FyZSBkcml2ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbiBhbHNvIGlmIG5vIHBhY2tldHMgYXJlIHF1ZXVlZC4KKyAqCVRoZSByb3V0aW5lIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgdGhpcyBjYXNlLgorICogQXJncworICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgY29udGV4dCBzdHJ1Y3QuCisgKiBPdXQKKyAqCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbGxjX3Jlc3RhcnRfdHgoc3RydWN0IHNfc21jICpzbWMpCit7CisJc2tmZGRpX3ByaXYgKmJwID0gJnNtYy0+b3M7CisKKwlQUklOVEsoS0VSTl9JTkZPICJbbGxjX3Jlc3RhcnRfdHhdXG4iKTsKKworCS8vIFRyeSB0byBzZW5kIHF1ZXVlZCBwYWNrZXRzCisJc3Bpbl91bmxvY2soJmJwLT5Ecml2ZXJMb2NrKTsKKwlzZW5kX3F1ZXVlZF9wYWNrZXRzKHNtYyk7CisJc3Bpbl9sb2NrKCZicC0+RHJpdmVyTG9jayk7CisJbmV0aWZfc3RhcnRfcXVldWUoYnAtPmRldik7Ly8gc3lzdGVtIG1heSBzZW5kIGFnYWluIGlmIGl0IHdhcyBibG9ja2VkCisKK30JCQkJLy8gbGxjX3Jlc3RhcnRfdHgKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJbWFjX2Rydl9nZXRfc3BhY2UKKyAqCisgKglUaGUgaGFyZHdhcmUgbW9kdWxlIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gYWxsb2NhdGUgdGhlIG1lbW9yeQorICoJZm9yIHRoZSBTTVQgTUJ1ZnMgaWYgdGhlIGRlZmluZSBNQl9PVVRTSURFX1NNQyBpcyBzcGVjaWZpZWQuCisgKiBBcmdzCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBjb250ZXh0IHN0cnVjdC4KKyAqCisgKglzaXplIC0gU2l6ZSBvZiBtZW1vcnkgaW4gYnl0ZXMgdG8gYWxsb2NhdGUuCisgKiBPdXQKKyAqCSE9IDAJQSBwb2ludGVyIHRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisgKgk9PSAwCUFsbG9jYXRpb24gZXJyb3IuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKm1hY19kcnZfZ2V0X3NwYWNlKHN0cnVjdCBzX3NtYyAqc21jLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl2b2lkICp2aXJ0OworCisJUFJJTlRLKEtFUk5fSU5GTyAibWFjX2Rydl9nZXRfc3BhY2UgKCVkIGJ5dGVzKSwgIiwgc2l6ZSk7CisJdmlydCA9ICh2b2lkICopIChzbWMtPm9zLlNoYXJlZE1lbUFkZHIgKyBzbWMtPm9zLlNoYXJlZE1lbUhlYXApOworCisJaWYgKChzbWMtPm9zLlNoYXJlZE1lbUhlYXAgKyBzaXplKSA+IHNtYy0+b3MuU2hhcmVkTWVtU2l6ZSkgeworCQlwcmludGsoIlVuZXhwZWN0ZWQgU01UIG1lbW9yeSBzaXplIHJlcXVlc3RlZDogJWRcbiIsIHNpemUpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlzbWMtPm9zLlNoYXJlZE1lbUhlYXAgKz0gc2l6ZTsJLy8gTW92ZSBoZWFwIHBvaW50ZXIuCisKKwlQUklOVEsoS0VSTl9JTkZPICJtYWNfZHJ2X2dldF9zcGFjZSBlbmRcbiIpOworCVBSSU5USyhLRVJOX0lORk8gInZpcnQgYWRkcjogJWx4XG4iLCAodWxvbmcpIHZpcnQpOworCVBSSU5USyhLRVJOX0lORk8gImJ1cyAgYWRkcjogJWx4XG4iLCAodWxvbmcpCisJICAgICAgIChzbWMtPm9zLlNoYXJlZE1lbURNQSArCisJCSgoY2hhciAqKSB2aXJ0IC0gKGNoYXIgKilzbWMtPm9zLlNoYXJlZE1lbUFkZHIpKSk7CisJcmV0dXJuICh2aXJ0KTsKK30JCQkJLy8gbWFjX2Rydl9nZXRfc3BhY2UKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJbWFjX2Rydl9nZXRfZGVzY19tZW0KKyAqCisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgaGFyZHdhcmUgZGVwZW5kZW50IG1vZHVsZS4KKyAqCUl0IGFsbG9jYXRlcyB0aGUgbWVtb3J5IGZvciB0aGUgUnhEIGFuZCBUeEQgZGVzY3JpcHRvcnMuCisgKgorICoJVGhpcyBtZW1vcnkgbXVzdCBiZSBub24tY2FjaGVkLCBub24tbW92YWJsZSBhbmQgbm9uLXN3YXBwYWJsZS4KKyAqCVRoaXMgbWVtb3J5IHNob3VsZCBzdGFydCBhdCBhIHBoeXNpY2FsIHBhZ2UgYm91bmRhcnkuCisgKiBBcmdzCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBjb250ZXh0IHN0cnVjdC4KKyAqCisgKglzaXplIC0gU2l6ZSBvZiBtZW1vcnkgaW4gYnl0ZXMgdG8gYWxsb2NhdGUuCisgKiBPdXQKKyAqCSE9IDAJQSBwb2ludGVyIHRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisgKgk9PSAwCUFsbG9jYXRpb24gZXJyb3IuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKm1hY19kcnZfZ2V0X2Rlc2NfbWVtKHN0cnVjdCBzX3NtYyAqc21jLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKworCWNoYXIgKnZpcnQ7CisKKwlQUklOVEsoS0VSTl9JTkZPICJtYWNfZHJ2X2dldF9kZXNjX21lbVxuIik7CisKKwkvLyBEZXNjcmlwdG9yIG1lbW9yeSBtdXN0IGJlIGFsaWduZWQgb24gMTYtYnl0ZSBib3VuZGFyeS4KKworCXZpcnQgPSBtYWNfZHJ2X2dldF9zcGFjZShzbWMsIHNpemUpOworCisJc2l6ZSA9ICh1X2ludCkgKDE2IC0gKCgodW5zaWduZWQgbG9uZykgdmlydCkgJiAxNVVMKSk7CisJc2l6ZSA9IHNpemUgJSAxNjsKKworCVBSSU5USygiQWxsb2NhdGUgJXUgYnl0ZXMgYWxpZ25tZW50IGdhcCAiLCBzaXplKTsKKwlQUklOVEsoImZvciBkZXNjcmlwdG9yIG1lbW9yeS5cbiIpOworCisJaWYgKCFtYWNfZHJ2X2dldF9zcGFjZShzbWMsIHNpemUpKSB7CisJCXByaW50aygiZmRkaTogVW5hYmxlIHRvIGFsaWduIGRlc2NyaXB0b3IgbWVtb3J5LlxuIik7CisJCXJldHVybiAoTlVMTCk7CisJfQorCXJldHVybiAodmlydCArIHNpemUpOworfQkJCQkvLyBtYWNfZHJ2X2dldF9kZXNjX21lbQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgltYWNfZHJ2X3ZpcnQycGh5cworICoKKyAqCUdldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGdpdmVuIHZpcnR1YWwgYWRkcmVzcy4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICoKKyAqCXZpcnQgLSBBICh2aXJ0dWFsKSBwb2ludGVyIGludG8gb3VyICdzaGFyZWQnIG1lbW9yeSBhcmVhLgorICogT3V0CisgKglQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBnaXZlbiB2aXJ0dWFsIGFkZHJlc3MuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGxvbmcgbWFjX2Rydl92aXJ0MnBoeXMoc3RydWN0IHNfc21jICpzbWMsIHZvaWQgKnZpcnQpCit7CisJcmV0dXJuIChzbWMtPm9zLlNoYXJlZE1lbURNQSArCisJCSgoY2hhciAqKSB2aXJ0IC0gKGNoYXIgKilzbWMtPm9zLlNoYXJlZE1lbUFkZHIpKTsKK30JCQkJLy8gbWFjX2Rydl92aXJ0MnBoeXMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJZG1hX21hc3RlcgorICoKKyAqCVRoZSBIV00gY2FsbHMgdGhpcyBmdW5jdGlvbiwgd2hlbiB0aGUgZHJpdmVyIGxlYWRzIHRocm91Z2ggYSBETUEKKyAqCXRyYW5zZmVyLiBJZiB0aGUgT1Mtc3BlY2lmaWMgbW9kdWxlIG11c3QgcHJlcGFyZSB0aGUgc3lzdGVtIGhhcmR3YXJlCisgKglmb3IgdGhlIERNQSB0cmFuc2ZlciwgaXQgc2hvdWxkIGRvIGl0IGluIHRoaXMgZnVuY3Rpb24uCisgKgorICoJVGhlIGhhcmR3YXJlIG1vZHVsZSBjYWxscyB0aGlzIGRtYV9tYXN0ZXIgaWYgaXQgd2FudHMgdG8gc2VuZCBhbiBTTVQKKyAqCWZyYW1lLiAgVGhpcyBtZWFucyB0aGF0IHRoZSB2aXJ0IGFkZHJlc3MgcGFzc2VkIGluIGhlcmUgaXMgcGFydCBvZgorICogICAgICB0aGUgJ3NoYXJlZCcgbWVtb3J5IGFyZWEuCisgKiBBcmdzCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBjb250ZXh0IHN0cnVjdC4KKyAqCisgKgl2aXJ0IC0gVGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgZGF0YS4KKyAqCisgKglsZW4gLSBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBkYXRhLgorICoKKyAqCWZsYWcgLSBJbmRpY2F0ZXMgdGhlIHRyYW5zbWl0IGRpcmVjdGlvbiBhbmQgdGhlIGJ1ZmZlciB0eXBlOgorICoJCURNQV9SRAkoMHgwMSkJc3lzdGVtIFJBTSA9PT4gYWRhcHRlciBidWZmZXIgbWVtb3J5CisgKgkJRE1BX1dSCSgweDAyKQlhZGFwdGVyIGJ1ZmZlciBtZW1vcnkgPT0+IHN5c3RlbSBSQU0KKyAqCQlTTVRfQlVGICgweDgwKQlTTVQgYnVmZmVyCisgKgorICoJPj4gTk9URTogU01UX0JVRiBhbmQgRE1BX1JEIGFyZSBhbHdheXMgc2V0IGZvciBQQ0kuIDw8CisgKiBPdXQKKyAqCVJldHVybnMgdGhlIHB5aHNpY2FsIGFkZHJlc3MgZm9yIHRoZSBETUEgdHJhbnNmZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3VfbG9uZyBkbWFfbWFzdGVyKHN0cnVjdCBzX3NtYyAqIHNtYywgdm9pZCAqdmlydCwgaW50IGxlbiwgaW50IGZsYWcpCit7CisJcmV0dXJuIChzbWMtPm9zLlNoYXJlZE1lbURNQSArCisJCSgoY2hhciAqKSB2aXJ0IC0gKGNoYXIgKilzbWMtPm9zLlNoYXJlZE1lbUFkZHIpKTsKK30JCQkJLy8gZG1hX21hc3RlcgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglkbWFfY29tcGxldGUKKyAqCisgKglUaGUgaGFyZHdhcmUgbW9kdWxlIGNhbGxzIHRoaXMgcm91dGluZSB3aGVuIGl0IGhhcyBjb21wbGV0ZWQgYSBETUEKKyAqCXRyYW5zZmVyLiBJZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQgbW9kdWxlIGhhcyBzZXQgdXAgdGhlIERNQQorICoJY2hhbm5lbCB2aWEgZG1hX21hc3RlcigpIChlLmcuIFdpbmRvd3MgTlQgb3IgQUlYKSBpdCBzaG91bGQgY2xlYW4gdXAKKyAqCXRoZSBETUEgY2hhbm5lbC4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICoKKyAqCWRlc2NyIC0gQSBwb2ludGVyIHRvIGEgVHhEIG9yIFJ4RCwgcmVzcGVjdGl2ZWx5LgorICoKKyAqCWZsYWcgLSBJbmRpY2F0ZXMgdGhlIERNQSB0cmFuc2ZlciBkaXJlY3Rpb24gLyBTTVQgYnVmZmVyOgorICoJCURNQV9SRAkoMHgwMSkJc3lzdGVtIFJBTSA9PT4gYWRhcHRlciBidWZmZXIgbWVtb3J5CisgKgkJRE1BX1dSCSgweDAyKQlhZGFwdGVyIGJ1ZmZlciBtZW1vcnkgPT0+IHN5c3RlbSBSQU0KKyAqCQlTTVRfQlVGICgweDgwKQlTTVQgYnVmZmVyIChtYW5hZ2VkIGJ5IEhXTSkKKyAqIE91dAorICoJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBkbWFfY29tcGxldGUoc3RydWN0IHNfc21jICpzbWMsIHZvbGF0aWxlIHVuaW9uIHNfZnBfZGVzY3IgKmRlc2NyLCBpbnQgZmxhZykKK3sKKwkvKiBGb3IgVFggYnVmZmVycywgdGhlcmUgYXJlIHR3byBjYXNlcy4gIElmIGl0IGlzIGFuIFNNVCB0cmFuc21pdAorCSAqIGJ1ZmZlciwgdGhlcmUgaXMgbm90aGluZyB0byBkbyBzaW5jZSB3ZSB1c2UgY29uc2lzdGVudCBtZW1vcnkKKwkgKiBmb3IgdGhlICdzaGFyZWQnIG1lbW9yeSBhcmVhLiAgVGhlIG90aGVyIGNhc2UgaXMgZm9yIG5vcm1hbAorCSAqIHRyYW5zbWl0IHBhY2tldHMgZ2l2ZW4gdG8gdXMgYnkgdGhlIG5ldHdvcmtpbmcgc3RhY2ssIGFuZCBpbgorCSAqIHRoYXQgY2FzZSB3ZSBjbGVhbnVwIHRoZSBQQ0kgRE1BIG1hcHBpbmcgaW4gbWFjX2Rydl90eF9jb21wbGV0ZQorCSAqIGJlbG93LgorCSAqCisJICogRm9yIFJYIGJ1ZmZlcnMsIHdlIGhhdmUgdG8gdW5tYXAgZHluYW1pYyBQQ0kgRE1BIG1hcHBpbmdzIGhlcmUKKwkgKiBiZWNhdXNlIHRoZSBoYXJkd2FyZSBtb2R1bGUgaXMgYWJvdXQgdG8gcG90ZW50aWFsbHkgbG9vayBhdAorCSAqIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyLiAgSWYgd2UgZGlkIG5vdCBjYWxsIHRoZSBQQ0kgRE1BCisJICogdW5tYXAgZmlyc3QsIHRoZSBoYXJkd2FyZSBtb2R1bGUgY291bGQgcmVhZCBpbmNvbnNpc3RlbnQgZGF0YS4KKwkgKi8KKwlpZiAoZmxhZyAmIERNQV9XUikgeworCQlza2ZkZGlfcHJpdiAqYnAgPSAmc21jLT5vczsKKwkJdm9sYXRpbGUgc3RydWN0IHNfc210X2ZwX3J4ZCAqciA9ICZkZXNjci0+cjsKKworCQkvKiBJZiBTS0IgaXMgTlVMTCwgd2UgdXNlZCB0aGUgbG9jYWwgYnVmZmVyLiAqLworCQlpZiAoci0+cnhkX29zLnNrYiAmJiByLT5yeGRfb3MuZG1hX2FkZHIpIHsKKwkJCWludCBNYXhGcmFtZVNpemUgPSBicC0+TWF4RnJhbWVTaXplOworCisJCQlwY2lfdW5tYXBfc2luZ2xlKCZicC0+cGRldiwgci0+cnhkX29zLmRtYV9hZGRyLAorCQkJCQkgTWF4RnJhbWVTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJci0+cnhkX29zLmRtYV9hZGRyID0gMDsKKwkJfQorCX0KK30JCQkJLy8gZG1hX2NvbXBsZXRlCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCW1hY19kcnZfdHhfY29tcGxldGUKKyAqCisgKglUcmFuc21pdCBvZiBhIHBhY2tldCBpcyBjb21wbGV0ZS4gUmVsZWFzZSB0aGUgdHggc3RhZ2luZyBidWZmZXIuCisgKgorICogQXJncworICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgY29udGV4dCBzdHJ1Y3QuCisgKgorICoJdHhkIC0gQSBwb2ludGVyIHRvIHRoZSBsYXN0IFR4RCB3aGljaCBpcyB1c2VkIGJ5IHRoZSBmcmFtZS4KKyAqIE91dAorICoJUmV0dXJucyBub3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG1hY19kcnZfdHhfY29tcGxldGUoc3RydWN0IHNfc21jICpzbWMsIHZvbGF0aWxlIHN0cnVjdCBzX3NtdF9mcF90eGQgKnR4ZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJUFJJTlRLKEtFUk5fSU5GTyAiZW50ZXJpbmcgbWFjX2Rydl90eF9jb21wbGV0ZVxuIik7CisJLy8gQ2hlY2sgaWYgdGhpcyBUeEQgcG9pbnRzIHRvIGEgc2tiCisKKwlpZiAoIShza2IgPSB0eGQtPnR4ZF9vcy5za2IpKSB7CisJCVBSSU5USygiVFhEIHdpdGggbm8gc2tiIGFzc2lnbmVkLlxuIik7CisJCXJldHVybjsKKwl9CisJdHhkLT50eGRfb3Muc2tiID0gTlVMTDsKKworCS8vIHJlbGVhc2UgdGhlIERNQSBtYXBwaW5nCisJcGNpX3VubWFwX3NpbmdsZSgmc21jLT5vcy5wZGV2LCB0eGQtPnR4ZF9vcy5kbWFfYWRkciwKKwkJCSBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJdHhkLT50eGRfb3MuZG1hX2FkZHIgPSAwOworCisJc21jLT5vcy5NYWNTdGF0Lmdlbi50eF9wYWNrZXRzKys7CS8vIENvdW50IHRyYW5zbWl0dGVkIHBhY2tldHMuCisJc21jLT5vcy5NYWNTdGF0Lmdlbi50eF9ieXRlcys9c2tiLT5sZW47CS8vIENvdW50IGJ5dGVzCisKKwkvLyBmcmVlIHRoZSBza2IKKwlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCisJUFJJTlRLKEtFUk5fSU5GTyAibGVhdmluZyBtYWNfZHJ2X3R4X2NvbXBsZXRlXG4iKTsKK30JCQkJLy8gbWFjX2Rydl90eF9jb21wbGV0ZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBkdW1wIHBhY2tldHMgdG8gbG9nZmlsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgRFVNUFBBQ0tFVFMKK3ZvaWQgZHVtcF9kYXRhKHVuc2lnbmVkIGNoYXIgKkRhdGEsIGludCBsZW5ndGgpCit7CisJaW50IGksIGo7CisJdW5zaWduZWQgY2hhciBzWzI1NV0sIHNoWzEwXTsKKwlpZiAobGVuZ3RoID4gNjQpIHsKKwkJbGVuZ3RoID0gNjQ7CisJfQorCXByaW50ayhLRVJOX0lORk8gIi0tLVBhY2tldCBzdGFydC0tLVxuIik7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsZW5ndGggLyA4OyBpKyssIGogKz0gOCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkgICAgICAgRGF0YVtqICsgMF0sIERhdGFbaiArIDFdLCBEYXRhW2ogKyAyXSwgRGF0YVtqICsgM10sCisJCSAgICAgICBEYXRhW2ogKyA0XSwgRGF0YVtqICsgNV0sIERhdGFbaiArIDZdLCBEYXRhW2ogKyA3XSk7CisJc3RyY3B5KHMsICIiKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoICUgODsgaSsrKSB7CisJCXNwcmludGYoc2gsICIlMDJ4ICIsIERhdGFbaiArIGldKTsKKwkJc3RyY2F0KHMsIHNoKTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHMpOworCXByaW50ayhLRVJOX0lORk8gIi0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Cit9CQkJCS8vIGR1bXBfZGF0YQorI2Vsc2UKKyNkZWZpbmUgZHVtcF9kYXRhKGRhdGEsbGVuKQorI2VuZGlmCQkJCS8vIERVTVBQQUNLRVRTCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgltYWNfZHJ2X3J4X2NvbXBsZXRlCisgKgorICoJVGhlIGhhcmR3YXJlIG1vZHVsZSBjYWxscyB0aGlzIGZ1bmN0aW9uIGlmIGFuIExMQyBmcmFtZSBpcyByZWNlaXZlZAorICoJaW4gYSByZWNlaXZlIGJ1ZmZlci4gQWxzbyB0aGUgU01ULCBOU0EsIGFuZCBkaXJlY3RlZCBiZWFjb24gZnJhbWVzCisgKglmcm9tIHRoZSBuZXR3b3JrIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBMTEMgbGF5ZXIgYnkgdGhpcyBmdW5jdGlvbgorICoJaWYgcGFzc2luZyBpcyBlbmFibGVkLgorICoKKyAqCW1hY19kcnZfcnhfY29tcGxldGUgZm9yd2FyZHMgdGhlIGZyYW1lIHRvIHRoZSBMTEMgbGF5ZXIgaWYgaXQgc2hvdWxkCisgKgliZSByZWNlaXZlZC4gSXQgYWxzbyBmaWxscyB0aGUgUnhEIHJpbmcgd2l0aCBuZXcgcmVjZWl2ZSBidWZmZXJzIGlmCisgKglzb21lIGNhbiBiZSBxdWV1ZWQuCisgKiBBcmdzCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBjb250ZXh0IHN0cnVjdC4KKyAqCisgKglyeGQgLSBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IFJ4RCB3aGljaCBpcyB1c2VkIGJ5IHRoZSByZWNlaXZlIGZyYW1lLgorICoKKyAqCWZyYWdfY291bnQgLSBDb3VudCBvZiBSeERzIHVzZWQgYnkgdGhlIHJlY2VpdmVkIGZyYW1lLgorICoKKyAqCWxlbiAtIEZyYW1lIGxlbmd0aC4KKyAqIE91dAorICoJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtYWNfZHJ2X3J4X2NvbXBsZXRlKHN0cnVjdCBzX3NtYyAqc21jLCB2b2xhdGlsZSBzdHJ1Y3Qgc19zbXRfZnBfcnhkICpyeGQsCisJCQkgaW50IGZyYWdfY291bnQsIGludCBsZW4pCit7CisJc2tmZGRpX3ByaXYgKmJwID0gJnNtYy0+b3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICp2aXJ0LCAqY3A7CisJdW5zaWduZWQgc2hvcnQgcmk7CisJdV9pbnQgUmlmTGVuZ3RoOworCisJUFJJTlRLKEtFUk5fSU5GTyAiZW50ZXJpbmcgbWFjX2Rydl9yeF9jb21wbGV0ZSAobGVuPSVkKVxuIiwgbGVuKTsKKwlpZiAoZnJhZ19jb3VudCAhPSAxKSB7CS8vIFRoaXMgaXMgbm90IGFsbG93ZWQgdG8gaGFwcGVuLgorCisJCXByaW50aygiZmRkaTogTXVsdGktZnJhZ21lbnQgcmVjZWl2ZSFcbiIpOworCQlnb3RvIFJlcXVldWVSeGQ7CS8vIFJlLXVzZSB0aGUgZ2l2ZW4gUlhEKHMpLgorCisJfQorCXNrYiA9IHJ4ZC0+cnhkX29zLnNrYjsKKwlpZiAoIXNrYikgeworCQlQUklOVEsoS0VSTl9JTkZPICJObyBza2IgaW4gcnhkXG4iKTsKKwkJc21jLT5vcy5NYWNTdGF0Lmdlbi5yeF9lcnJvcnMrKzsKKwkJZ290byBSZXF1ZXVlUnhkOworCX0KKwl2aXJ0ID0gc2tiLT5kYXRhOworCisJLy8gVGhlIERNQSBtYXBwaW5nIHdhcyByZWxlYXNlZCBpbiBkbWFfY29tcGxldGUgYWJvdmUuCisKKwlkdW1wX2RhdGEoc2tiLT5kYXRhLCBsZW4pOworCisJLyoKKwkgKiBGRERJIEZyYW1lIGZvcm1hdDoKKwkgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKKwkgKiB8IEZDWzFdIHwgREFbNl0gfCBTQVs2XSB8IFJJRlswLi4xOF0gfCBMTENbM10gfCBEYXRhWzAuLm5dIHwKKwkgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKKwkgKgorCSAqIEZDID0gRnJhbWUgQ29udHJvbAorCSAqIERBID0gRGVzdGluYXRpb24gQWRkcmVzcworCSAqIFNBID0gU291cmNlIEFkZHJlc3MKKwkgKiBSSUYgPSBSb3V0aW5nIEluZm9ybWF0aW9uIEZpZWxkCisJICogTExDID0gTG9naWNhbCBMaW5rIENvbnRyb2wKKwkgKi8KKworCS8vIFJlbW92ZSBSb3V0aW5nIEluZm9ybWF0aW9uIEZpZWxkIChSSUYpLCBpZiBwcmVzZW50LgorCisJaWYgKCh2aXJ0WzEgKyA2XSAmIEZERElfUklJKSA9PSAwKQorCQlSaWZMZW5ndGggPSAwOworCWVsc2UgeworCQlpbnQgbjsKKy8vIGdvb3M6IFJJRiByZW1vdmFsIGhhcyBzdGlsbCB0byBiZSB0ZXN0ZWQKKwkJUFJJTlRLKEtFUk5fSU5GTyAiUklGIGZvdW5kXG4iKTsKKwkJLy8gR2V0IFJJRiBsZW5ndGggZnJvbSBSb3V0aW5nIENvbnRyb2wgKFJDKSBmaWVsZC4KKwkJY3AgPSB2aXJ0ICsgRkRESV9NQUNfSERSX0xFTjsJLy8gUG9pbnQgYmVoaW5kIE1BQyBoZWFkZXIuCisKKwkJcmkgPSBudG9ocygqKCh1bnNpZ25lZCBzaG9ydCAqKSBjcCkpOworCQlSaWZMZW5ndGggPSByaSAmIEZERElfUkNGX0xFTl9NQVNLOworCQlpZiAobGVuIDwgKGludCkgKEZERElfTUFDX0hEUl9MRU4gKyBSaWZMZW5ndGgpKSB7CisJCQlwcmludGsoImZkZGk6IEludmFsaWQgUklGLlxuIik7CisJCQlnb3RvIFJlcXVldWVSeGQ7CS8vIERpc2NhcmQgdGhlIGZyYW1lLgorCisJCX0KKwkJdmlydFsxICsgNl0gJj0gfkZERElfUklJOwkvLyBDbGVhciBSSUkgYml0LgorCQkvLyByZWdpb25zIG92ZXJsYXAKKworCQl2aXJ0ID0gY3AgKyBSaWZMZW5ndGg7CisJCWZvciAobiA9IEZERElfTUFDX0hEUl9MRU47IG47IG4tLSkKKwkJCSotLXZpcnQgPSAqLS1jcDsKKwkJLy8gYWRqdXN0IHNiZC0+ZGF0YSBwb2ludGVyCisJCXNrYl9wdWxsKHNrYiwgUmlmTGVuZ3RoKTsKKwkJbGVuIC09IFJpZkxlbmd0aDsKKwkJUmlmTGVuZ3RoID0gMDsKKwl9CisKKwkvLyBDb3VudCBzdGF0aXN0aWNzLgorCXNtYy0+b3MuTWFjU3RhdC5nZW4ucnhfcGFja2V0cysrOwkvLyBDb3VudCBpbmRpY2F0ZWQgcmVjZWl2ZQorCQkJCQkJLy8gcGFja2V0cy4KKwlzbWMtPm9zLk1hY1N0YXQuZ2VuLnJ4X2J5dGVzKz1sZW47CS8vIENvdW50IGJ5dGVzLgorCisJLy8gdmlydCBwb2ludHMgdG8gaGVhZGVyIGFnYWluCisJaWYgKHZpcnRbMV0gJiAweDAxKSB7CS8vIENoZWNrIGdyb3VwIChtdWx0aWNhc3QpIGJpdC4KKworCQlzbWMtPm9zLk1hY1N0YXQuZ2VuLm11bHRpY2FzdCsrOworCX0KKworCS8vIGRlbGl2ZXIgZnJhbWUgdG8gc3lzdGVtCisJcnhkLT5yeGRfb3Muc2tiID0gTlVMTDsKKwlza2JfdHJpbShza2IsIGxlbik7CisJc2tiLT5wcm90b2NvbCA9IGZkZGlfdHlwZV90cmFucyhza2IsIGJwLT5kZXYpOworCXNrYi0+ZGV2ID0gYnAtPmRldjsJLyogcGFzcyB1cCBkZXZpY2UgcG9pbnRlciAqLworCisJbmV0aWZfcngoc2tiKTsKKwlicC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCUhXTV9SWF9DSEVDSyhzbWMsIFJYX0xPV19XQVRFUk1BUkspOworCXJldHVybjsKKworICAgICAgUmVxdWV1ZVJ4ZDoKKwlQUklOVEsoS0VSTl9JTkZPICJSeDogcmUtcXVldWUgUlhELlxuIik7CisJbWFjX2Rydl9yZXF1ZXVlX3J4ZChzbWMsIHJ4ZCwgZnJhZ19jb3VudCk7CisJc21jLT5vcy5NYWNTdGF0Lmdlbi5yeF9lcnJvcnMrKzsJLy8gQ291bnQgcmVjZWl2ZSBwYWNrZXRzCisJCQkJCQkvLyBub3QgaW5kaWNhdGVkLgorCit9CQkJCS8vIG1hY19kcnZfcnhfY29tcGxldGUKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJbWFjX2Rydl9yZXF1ZXVlX3J4ZAorICoKKyAqCVRoZSBoYXJkd2FyZSBtb2R1bGUgY2FsbHMgdGhpcyBmdW5jdGlvbiB0byByZXF1ZXN0IHRoZSBPUy1zcGVjaWZpYworICoJbW9kdWxlIHRvIHF1ZXVlIHRoZSByZWNlaXZlIGJ1ZmZlcihzKSByZXByZXNlbnRlZCBieSB0aGUgcG9pbnRlcgorICoJdG8gdGhlIFJ4RCBhbmQgdGhlIGZyYWdfY291bnQgaW50byB0aGUgcmVjZWl2ZSBxdWV1ZSBhZ2Fpbi4gVGhpcworICoJYnVmZmVyIHdhcyBmaWxsZWQgd2l0aCBhbiBpbnZhbGlkIGZyYW1lIG9yIGFuIFNNVCBmcmFtZS4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICoKKyAqCXJ4ZCAtIEEgcG9pbnRlciB0byB0aGUgZmlyc3QgUnhEIHdoaWNoIGlzIHVzZWQgYnkgdGhlIHJlY2VpdmUgZnJhbWUuCisgKgorICoJZnJhZ19jb3VudCAtIENvdW50IG9mIFJ4RHMgdXNlZCBieSB0aGUgcmVjZWl2ZWQgZnJhbWUuCisgKiBPdXQKKyAqCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbWFjX2Rydl9yZXF1ZXVlX3J4ZChzdHJ1Y3Qgc19zbWMgKnNtYywgdm9sYXRpbGUgc3RydWN0IHNfc210X2ZwX3J4ZCAqcnhkLAorCQkJIGludCBmcmFnX2NvdW50KQoreworCXZvbGF0aWxlIHN0cnVjdCBzX3NtdF9mcF9yeGQgKm5leHRfcnhkOworCXZvbGF0aWxlIHN0cnVjdCBzX3NtdF9mcF9yeGQgKnNyY19yeGQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgTWF4RnJhbWVTaXplOworCXVuc2lnbmVkIGNoYXIgKnZfYWRkcjsKKwlkbWFfYWRkcl90IGJfYWRkcjsKKworCWlmIChmcmFnX2NvdW50ICE9IDEpCS8vIFRoaXMgaXMgbm90IGFsbG93ZWQgdG8gaGFwcGVuLgorCisJCXByaW50aygiZmRkaTogTXVsdGktZnJhZ21lbnQgcmVxdWV1ZSFcbiIpOworCisJTWF4RnJhbWVTaXplID0gc21jLT5vcy5NYXhGcmFtZVNpemU7CisJc3JjX3J4ZCA9IHJ4ZDsKKwlmb3IgKDsgZnJhZ19jb3VudCA+IDA7IGZyYWdfY291bnQtLSkgeworCQluZXh0X3J4ZCA9IHNyY19yeGQtPnJ4ZF9uZXh0OworCQlyeGQgPSBIV01fR0VUX0NVUlJfUlhEKHNtYyk7CisKKwkJc2tiID0gc3JjX3J4ZC0+cnhkX29zLnNrYjsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CS8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KKworCQkJUFJJTlRLKCJSZXF1ZXVlIHdpdGggbm8gc2tiIGluIHJ4ZCFcbiIpOworCQkJc2tiID0gYWxsb2Nfc2tiKE1heEZyYW1lU2l6ZSArIDMsIEdGUF9BVE9NSUMpOworCQkJaWYgKHNrYikgeworCQkJCS8vIHdlIGdvdCBhIHNrYgorCQkJCXJ4ZC0+cnhkX29zLnNrYiA9IHNrYjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDMpOworCQkJCXNrYl9wdXQoc2tiLCBNYXhGcmFtZVNpemUpOworCQkJCXZfYWRkciA9IHNrYi0+ZGF0YTsKKwkJCQliX2FkZHIgPSBwY2lfbWFwX3NpbmdsZSgmc21jLT5vcy5wZGV2LAorCQkJCQkJCXZfYWRkciwKKwkJCQkJCQlNYXhGcmFtZVNpemUsCisJCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlyeGQtPnJ4ZF9vcy5kbWFfYWRkciA9IGJfYWRkcjsKKwkJCX0gZWxzZSB7CisJCQkJLy8gbm8gc2tiIGF2YWlsYWJsZSwgdXNlIGxvY2FsIGJ1ZmZlcgorCQkJCVBSSU5USygiUXVldWVpbmcgaW52YWxpZCBidWZmZXIhXG4iKTsKKwkJCQlyeGQtPnJ4ZF9vcy5za2IgPSBOVUxMOworCQkJCXZfYWRkciA9IHNtYy0+b3MuTG9jYWxSeEJ1ZmZlcjsKKwkJCQliX2FkZHIgPSBzbWMtPm9zLkxvY2FsUnhCdWZmZXJETUE7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyB3ZSB1c2Ugc2tiIGZyb20gb2xkIHJ4ZAorCQkJcnhkLT5yeGRfb3Muc2tiID0gc2tiOworCQkJdl9hZGRyID0gc2tiLT5kYXRhOworCQkJYl9hZGRyID0gcGNpX21hcF9zaW5nbGUoJnNtYy0+b3MucGRldiwKKwkJCQkJCXZfYWRkciwKKwkJCQkJCU1heEZyYW1lU2l6ZSwKKwkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlyeGQtPnJ4ZF9vcy5kbWFfYWRkciA9IGJfYWRkcjsKKwkJfQorCQlod21fcnhfZnJhZyhzbWMsIHZfYWRkciwgYl9hZGRyLCBNYXhGcmFtZVNpemUsCisJCQkgICAgRklSU1RfRlJBRyB8IExBU1RfRlJBRyk7CisKKwkJc3JjX3J4ZCA9IG5leHRfcnhkOworCX0KK30JCQkJLy8gbWFjX2Rydl9yZXF1ZXVlX3J4ZAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgltYWNfZHJ2X2ZpbGxfcnhkCisgKgorICoJVGhlIGhhcmR3YXJlIG1vZHVsZSBjYWxscyB0aGlzIGZ1bmN0aW9uIGF0IGluaXRpYWxpemF0aW9uIHRpbWUKKyAqCXRvIGZpbGwgdGhlIFJ4RCByaW5nIHdpdGggcmVjZWl2ZSBidWZmZXJzLiBJdCBpcyBhbHNvIGNhbGxlZCBieQorICoJbWFjX2Rydl9yeF9jb21wbGV0ZSBpZiByeF9mcmVlIGlzIGxhcmdlIGVub3VnaCB0byBxdWV1ZSBzb21lIG5ldworICoJcmVjZWl2ZSBidWZmZXJzIGludG8gdGhlIFJ4RCByaW5nLiBtYWNfZHJ2X2ZpbGxfcnhkIHF1ZXVlcyBuZXcKKyAqCXJlY2VpdmUgYnVmZmVycyBhcyBsb25nIGFzIGVub3VnaCBSeERzIGFuZCByZWNlaXZlIGJ1ZmZlcnMgYXJlCisgKglhdmFpbGFibGUuCisgKiBBcmdzCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBjb250ZXh0IHN0cnVjdC4KKyAqIE91dAorICoJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtYWNfZHJ2X2ZpbGxfcnhkKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWludCBNYXhGcmFtZVNpemU7CisJdW5zaWduZWQgY2hhciAqdl9hZGRyOworCXVuc2lnbmVkIGxvbmcgYl9hZGRyOworCXN0cnVjdCBza19idWZmICpza2I7CisJdm9sYXRpbGUgc3RydWN0IHNfc210X2ZwX3J4ZCAqcnhkOworCisJUFJJTlRLKEtFUk5fSU5GTyAiZW50ZXJpbmcgbWFjX2Rydl9maWxsX3J4ZFxuIik7CisKKwkvLyBXYWxrIHRocm91Z2ggdGhlIGxpc3Qgb2YgZnJlZSByZWNlaXZlIGJ1ZmZlcnMsIHBhc3NpbmcgcmVjZWl2ZQorCS8vIGJ1ZmZlcnMgdG8gdGhlIEhXTSBhcyBsb25nIGFzIFJYRHMgYXJlIGF2YWlsYWJsZS4KKworCU1heEZyYW1lU2l6ZSA9IHNtYy0+b3MuTWF4RnJhbWVTaXplOworCS8vIENoZWNrIGlmIHRoZXJlIGlzIGFueSBSWEQgbGVmdC4KKwl3aGlsZSAoSFdNX0dFVF9SWF9GUkVFKHNtYykgPiAwKSB7CisJCVBSSU5USyhLRVJOX0lORk8gIi5cbiIpOworCisJCXJ4ZCA9IEhXTV9HRVRfQ1VSUl9SWEQoc21jKTsKKwkJc2tiID0gYWxsb2Nfc2tiKE1heEZyYW1lU2l6ZSArIDMsIEdGUF9BVE9NSUMpOworCQlpZiAoc2tiKSB7CisJCQkvLyB3ZSBnb3QgYSBza2IKKwkJCXNrYl9yZXNlcnZlKHNrYiwgMyk7CisJCQlza2JfcHV0KHNrYiwgTWF4RnJhbWVTaXplKTsKKwkJCXZfYWRkciA9IHNrYi0+ZGF0YTsKKwkJCWJfYWRkciA9IHBjaV9tYXBfc2luZ2xlKCZzbWMtPm9zLnBkZXYsCisJCQkJCQl2X2FkZHIsCisJCQkJCQlNYXhGcmFtZVNpemUsCisJCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcnhkLT5yeGRfb3MuZG1hX2FkZHIgPSBiX2FkZHI7CisJCX0gZWxzZSB7CisJCQkvLyBubyBza2IgYXZhaWxhYmxlLCB1c2UgbG9jYWwgYnVmZmVyCisJCQkvLyBTeXN0ZW0gaGFzIHJ1biBvdXQgb2YgYnVmZmVyIG1lbW9yeSwgYnV0IHdlIHdhbnQgdG8KKwkJCS8vIGtlZXAgdGhlIHJlY2VpdmVyIHJ1bm5pbmcgaW4gaG9wZSBvZiBiZXR0ZXIgdGltZXMuCisJCQkvLyBNdWx0aXBsZSBkZXNjcmlwdG9ycyBtYXkgcG9pbnQgdG8gdGhpcyBsb2NhbCBidWZmZXIsCisJCQkvLyBzbyBkYXRhIGluIGl0IG11c3QgYmUgY29uc2lkZXJlZCBpbnZhbGlkLgorCQkJUFJJTlRLKCJRdWV1ZWluZyBpbnZhbGlkIGJ1ZmZlciFcbiIpOworCQkJdl9hZGRyID0gc21jLT5vcy5Mb2NhbFJ4QnVmZmVyOworCQkJYl9hZGRyID0gc21jLT5vcy5Mb2NhbFJ4QnVmZmVyRE1BOworCQl9CisKKwkJcnhkLT5yeGRfb3Muc2tiID0gc2tiOworCisJCS8vIFBhc3MgcmVjZWl2ZSBidWZmZXIgdG8gSFdNLgorCQlod21fcnhfZnJhZyhzbWMsIHZfYWRkciwgYl9hZGRyLCBNYXhGcmFtZVNpemUsCisJCQkgICAgRklSU1RfRlJBRyB8IExBU1RfRlJBRyk7CisJfQorCVBSSU5USyhLRVJOX0lORk8gImxlYXZpbmcgbWFjX2Rydl9maWxsX3J4ZFxuIik7Cit9CQkJCS8vIG1hY19kcnZfZmlsbF9yeGQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJbWFjX2Rydl9jbGVhcl9yeGQKKyAqCisgKglUaGUgaGFyZHdhcmUgbW9kdWxlIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gcmVsZWFzZSB1bnVzZWQKKyAqCXJlY2VpdmUgYnVmZmVycy4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICoKKyAqCXJ4ZCAtIEEgcG9pbnRlciB0byB0aGUgZmlyc3QgUnhEIHdoaWNoIGlzIHVzZWQgYnkgdGhlIHJlY2VpdmUgYnVmZmVyLgorICoKKyAqCWZyYWdfY291bnQgLSBDb3VudCBvZiBSeERzIHVzZWQgYnkgdGhlIHJlY2VpdmUgYnVmZmVyLgorICogT3V0CisgKglOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG1hY19kcnZfY2xlYXJfcnhkKHN0cnVjdCBzX3NtYyAqc21jLCB2b2xhdGlsZSBzdHJ1Y3Qgc19zbXRfZnBfcnhkICpyeGQsCisJCSAgICAgICBpbnQgZnJhZ19jb3VudCkKK3sKKworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlQUklOVEsoImVudGVyaW5nIG1hY19kcnZfY2xlYXJfcnhkXG4iKTsKKworCWlmIChmcmFnX2NvdW50ICE9IDEpCS8vIFRoaXMgaXMgbm90IGFsbG93ZWQgdG8gaGFwcGVuLgorCisJCXByaW50aygiZmRkaTogTXVsdGktZnJhZ21lbnQgY2xlYXIhXG4iKTsKKworCWZvciAoOyBmcmFnX2NvdW50ID4gMDsgZnJhZ19jb3VudC0tKSB7CisJCXNrYiA9IHJ4ZC0+cnhkX29zLnNrYjsKKwkJaWYgKHNrYiAhPSBOVUxMKSB7CisJCQlza2ZkZGlfcHJpdiAqYnAgPSAmc21jLT5vczsKKwkJCWludCBNYXhGcmFtZVNpemUgPSBicC0+TWF4RnJhbWVTaXplOworCisJCQlwY2lfdW5tYXBfc2luZ2xlKCZicC0+cGRldiwgcnhkLT5yeGRfb3MuZG1hX2FkZHIsCisJCQkJCSBNYXhGcmFtZVNpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJ4ZC0+cnhkX29zLnNrYiA9IE5VTEw7CisJCX0KKwkJcnhkID0gcnhkLT5yeGRfbmV4dDsJLy8gTmV4dCBSWEQuCisKKwl9Cit9CQkJCS8vIG1hY19kcnZfY2xlYXJfcnhkCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCW1hY19kcnZfcnhfaW5pdAorICoKKyAqCVRoZSBoYXJkd2FyZSBtb2R1bGUgY2FsbHMgdGhpcyByb3V0aW5lIHdoZW4gYW4gU01UIG9yIE5TQSBmcmFtZSBvZiB0aGUKKyAqCWxvY2FsIFNNVCBzaG91bGQgYmUgZGVsaXZlcmVkIHRvIHRoZSBMTEMgbGF5ZXIuCisgKgorICoJSXQgaXMgbmVjZXNzYXJ5IHRvIGhhdmUgdGhpcyBmdW5jdGlvbiwgYmVjYXVzZSB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8KKyAqCWNvcHkgdGhlIGNvbnRlbnRzIG9mIFNNVCBNQnVmcyBpbnRvIHJlY2VpdmUgYnVmZmVycy4KKyAqCisgKgltYWNfZHJ2X3J4X2luaXQgYWxsb2NhdGVzIHRoZSByZXF1aXJlZCB0YXJnZXQgbWVtb3J5IGZvciB0aGlzIGZyYW1lLAorICoJYW5kIHJlY2VpdmVzIHRoZSBmcmFtZSBmcmFnbWVudCBieSBmcmFnbWVudCBieSBjYWxsaW5nIG1hY19kcnZfcnhfZnJhZy4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICoKKyAqCWxlbiAtIFRoZSBsZW5ndGggKGluIGJ5dGVzKSBvZiB0aGUgcmVjZWl2ZWQgZnJhbWUgKEZDLCBEQSwgU0EsIERhdGEpLgorICoKKyAqCWZjIC0gVGhlIEZyYW1lIENvbnRyb2wgZmllbGQgb2YgdGhlIHJlY2VpdmVkIGZyYW1lLgorICoKKyAqCWxvb2tfYWhlYWQgLSBBIHBvaW50ZXIgdG8gdGhlIGxvb2thaGVhZCBkYXRhIGJ1ZmZlciAobWF5IGJlIE5VTEwpLgorICoKKyAqCWxhX2xlbiAtIFRoZSBsZW5ndGggb2YgdGhlIGxvb2thaGVhZCBkYXRhIHN0b3JlZCBpbiB0aGUgbG9va2FoZWFkCisgKglidWZmZXIgKG1heSBiZSB6ZXJvKS4KKyAqIE91dAorICoJQWx3YXlzIHJldHVybnMgemVybyAoMCkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYWNfZHJ2X3J4X2luaXQoc3RydWN0IHNfc21jICpzbWMsIGludCBsZW4sIGludCBmYywKKwkJICAgIGNoYXIgKmxvb2tfYWhlYWQsIGludCBsYV9sZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCVBSSU5USygiZW50ZXJpbmcgbWFjX2Rydl9yeF9pbml0KGxlbj0lZClcbiIsIGxlbik7CisKKwkvLyAiUmVjZWl2ZWQiIGEgU01UIG9yIE5TQSBmcmFtZSBvZiB0aGUgbG9jYWwgU01ULgorCisJaWYgKGxlbiAhPSBsYV9sZW4gfHwgbGVuIDwgRkRESV9NQUNfSERSX0xFTiB8fCAhbG9va19haGVhZCkgeworCQlQUklOVEsoImZkZGk6IERpc2NhcmQgaW52YWxpZCBsb2NhbCBTTVQgZnJhbWVcbiIpOworCQlQUklOVEsoIiAgbGVuPSVkLCBsYV9sZW49JWQsIChVTE9ORykgbG9va19haGVhZD0lMDhsWGguXG4iLAorCQkgICAgICAgbGVuLCBsYV9sZW4sICh1bnNpZ25lZCBsb25nKSBsb29rX2FoZWFkKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJc2tiID0gYWxsb2Nfc2tiKGxlbiArIDMsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKSB7CisJCVBSSU5USygiZmRkaTogTG9jYWwgU01UOiBza2IgbWVtb3J5IGV4aGF1c3RlZC5cbiIpOworCQlyZXR1cm4gKDApOworCX0KKwlza2JfcmVzZXJ2ZShza2IsIDMpOworCXNrYl9wdXQoc2tiLCBsZW4pOworCW1lbWNweShza2ItPmRhdGEsIGxvb2tfYWhlYWQsIGxlbik7CisKKwkvLyBkZWxpdmVyIGZyYW1lIHRvIHN5c3RlbQorCXNrYi0+cHJvdG9jb2wgPSBmZGRpX3R5cGVfdHJhbnMoc2tiLCBzbWMtPm9zLmRldik7CisJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCW5ldGlmX3J4KHNrYik7CisKKwlyZXR1cm4gKDApOworfQkJCQkvLyBtYWNfZHJ2X3J4X2luaXQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJc210X3RpbWVyX3BvbGwKKyAqCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHBlcmlvZGljYWxseSBieSB0aGUgU01UIG1vZHVsZSB0byBjbGVhbiB1cCB0aGUKKyAqCWRyaXZlci4KKyAqCisgKglSZXR1cm4gYW55IHF1ZXVlZCBmcmFtZXMgYmFjayB0byB0aGUgdXBwZXIgcHJvdG9jb2wgbGF5ZXJzIGlmIHRoZSByaW5nCisgKglpcyBkb3duLgorICogQXJncworICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgY29udGV4dCBzdHJ1Y3QuCisgKiBPdXQKKyAqCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc210X3RpbWVyX3BvbGwoc3RydWN0IHNfc21jICpzbWMpCit7Cit9CQkJCS8vIHNtdF90aW1lcl9wb2xsCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCXJpbmdfc3RhdHVzX2luZGljYXRpb24KKyAqCisgKglUaGlzIGZ1bmN0aW9uIGluZGljYXRlcyBhIGNoYW5nZSBvZiB0aGUgcmluZyBzdGF0ZS4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICoKKyAqCXN0YXR1cyAtIFRoZSBjdXJyZW50IHJpbmcgc3RhdHVzLgorICogT3V0CisgKglOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJpbmdfc3RhdHVzX2luZGljYXRpb24oc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyBzdGF0dXMpCit7CisJUFJJTlRLKCJyaW5nX3N0YXR1c19pbmRpY2F0aW9uKCAiKTsKKwlpZiAoc3RhdHVzICYgUlNfUkVTMTUpCisJCVBSSU5USygiUlNfUkVTMTUgIik7CisJaWYgKHN0YXR1cyAmIFJTX0hBUkRFUlJPUikKKwkJUFJJTlRLKCJSU19IQVJERVJST1IgIik7CisJaWYgKHN0YXR1cyAmIFJTX1NPRlRFUlJPUikKKwkJUFJJTlRLKCJSU19TT0ZURVJST1IgIik7CisJaWYgKHN0YXR1cyAmIFJTX0JFQUNPTikKKwkJUFJJTlRLKCJSU19CRUFDT04gIik7CisJaWYgKHN0YXR1cyAmIFJTX1BBVEhURVNUKQorCQlQUklOVEsoIlJTX1BBVEhURVNUICIpOworCWlmIChzdGF0dXMgJiBSU19TRUxGVEVTVCkKKwkJUFJJTlRLKCJSU19TRUxGVEVTVCAiKTsKKwlpZiAoc3RhdHVzICYgUlNfUkVTOSkKKwkJUFJJTlRLKCJSU19SRVM5ICIpOworCWlmIChzdGF0dXMgJiBSU19ESVNDT05ORUNUKQorCQlQUklOVEsoIlJTX0RJU0NPTk5FQ1QgIik7CisJaWYgKHN0YXR1cyAmIFJTX1JFUzcpCisJCVBSSU5USygiUlNfUkVTNyAiKTsKKwlpZiAoc3RhdHVzICYgUlNfRFVQQUREUikKKwkJUFJJTlRLKCJSU19EVVBBRERSICIpOworCWlmIChzdGF0dXMgJiBSU19OT1JJTkdPUCkKKwkJUFJJTlRLKCJSU19OT1JJTkdPUCAiKTsKKwlpZiAoc3RhdHVzICYgUlNfVkVSU0lPTikKKwkJUFJJTlRLKCJSU19WRVJTSU9OICIpOworCWlmIChzdGF0dXMgJiBSU19TVFVDS0JZUEFTU1MpCisJCVBSSU5USygiUlNfU1RVQ0tCWVBBU1NTICIpOworCWlmIChzdGF0dXMgJiBSU19FVkVOVCkKKwkJUFJJTlRLKCJSU19FVkVOVCAiKTsKKwlpZiAoc3RhdHVzICYgUlNfUklOR09QQ0hBTkdFKQorCQlQUklOVEsoIlJTX1JJTkdPUENIQU5HRSAiKTsKKwlpZiAoc3RhdHVzICYgUlNfUkVTMCkKKwkJUFJJTlRLKCJSU19SRVMwICIpOworCVBSSU5USygiXVxuIik7Cit9CQkJCS8vIHJpbmdfc3RhdHVzX2luZGljYXRpb24KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJc210X2dldF90aW1lCisgKgorICoJR2V0cyB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIHN5c3RlbS4KKyAqIEFyZ3MKKyAqCU5vbmUuCisgKiBPdXQKKyAqCVRoZSBjdXJyZW50IHRpbWUgaW4gVElDS1NfUEVSX1NFQ09ORC4KKyAqCisgKglUSUNLU19QRVJfU0VDT05EIGhhcyB0aGUgdW5pdCAnY291bnQgb2YgdGltZXIgdGlja3MgcGVyIHNlY29uZCcuIEl0IGlzCisgKglkZWZpbmVkIGluICJ0YXJnZXRvcy5oIi4gVGhlIGRlZmluaXRpb24gb2YgVElDS1NfUEVSX1NFQ09ORCBtdXN0IGNvbXBseQorICoJdG8gdGhlIHRpbWUgcmV0dXJuZWQgYnkgc210X2dldF90aW1lKCkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGxvbmcgc210X2dldF90aW1lKHZvaWQpCit7CisJcmV0dXJuIGppZmZpZXM7Cit9CQkJCS8vIHNtdF9nZXRfdGltZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglzbXRfc3RhdF9jb3VudGVyCisgKgorICoJU3RhdHVzIGNvdW50ZXIgdXBkYXRlIChyaW5nX29wLCBmaWZvIGZ1bGwpLgorICogQXJncworICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgY29udGV4dCBzdHJ1Y3QuCisgKgorICoJc3RhdCAtCT0gMDogQSByaW5nIG9wZXJhdGlvbmFsIGNoYW5nZSBvY2N1cnJlZC4KKyAqCQk9IDE6IFRoZSBGT1JNQUMgRklGTyBidWZmZXIgaXMgZnVsbCAvIEZJRk8gb3ZlcmZsb3cuCisgKiBPdXQKKyAqCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc210X3N0YXRfY291bnRlcihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHN0YXQpCit7CisvLyAgICAgIEJPT0xFQU4gUmluZ0lzVXAgOworCisJUFJJTlRLKEtFUk5fSU5GTyAic210X3N0YXRfY291bnRlclxuIik7CisJc3dpdGNoIChzdGF0KSB7CisJY2FzZSAwOgorCQlQUklOVEsoS0VSTl9JTkZPICJSaW5nIG9wZXJhdGlvbmFsIGNoYW5nZS5cbiIpOworCQlicmVhazsKKwljYXNlIDE6CisJCVBSSU5USyhLRVJOX0lORk8gIlJlY2VpdmUgZmlmbyBvdmVyZmxvdy5cbiIpOworCQlzbWMtPm9zLk1hY1N0YXQuZ2VuLnJ4X2Vycm9ycysrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQUklOVEsoS0VSTl9JTkZPICJVbmtub3duIHN0YXR1cyAoJWQpLlxuIiwgc3RhdCk7CisJCWJyZWFrOworCX0KK30JCQkJLy8gc210X3N0YXRfY291bnRlcgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgljZm1fc3RhdGVfY2hhbmdlCisgKgorICoJU2V0cyBDRk0gc3RhdGUgaW4gY3VzdG9tIHN0YXRpc3RpY3MuCisgKiBBcmdzCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBjb250ZXh0IHN0cnVjdC4KKyAqCisgKgljX3N0YXRlIC0gUG9zc2libGUgdmFsdWVzIGFyZToKKyAqCisgKgkJRUMwX09VVCwgRUMxX0lOLCBFQzJfVFJBQ0UsIEVDM19MRUFWRSwgRUM0X1BBVEhfVEVTVCwKKyAqCQlFQzVfSU5TRVJULCBFQzZfQ0hFQ0ssIEVDN19ERUlOU0VSVAorICogT3V0CisgKglOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNmbV9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHNfc21jICpzbWMsIGludCBjX3N0YXRlKQoreworI2lmZGVmIERSSVZFUkRFQlVHCisJY2hhciAqczsKKworCXN3aXRjaCAoY19zdGF0ZSkgeworCWNhc2UgU0MwX0lTT0xBVEVEOgorCQlzID0gIlNDMF9JU09MQVRFRCI7CisJCWJyZWFrOworCWNhc2UgU0MxX1dSQVBfQToKKwkJcyA9ICJTQzFfV1JBUF9BIjsKKwkJYnJlYWs7CisJY2FzZSBTQzJfV1JBUF9COgorCQlzID0gIlNDMl9XUkFQX0IiOworCQlicmVhazsKKwljYXNlIFNDNF9USFJVX0E6CisJCXMgPSAiU0M0X1RIUlVfQSI7CisJCWJyZWFrOworCWNhc2UgU0M1X1RIUlVfQjoKKwkJcyA9ICJTQzVfVEhSVV9CIjsKKwkJYnJlYWs7CisJY2FzZSBTQzdfV1JBUF9TOgorCQlzID0gIlNDN19XUkFQX1MiOworCQlicmVhazsKKwljYXNlIFNDOV9DX1dSQVBfQToKKwkJcyA9ICJTQzlfQ19XUkFQX0EiOworCQlicmVhazsKKwljYXNlIFNDMTBfQ19XUkFQX0I6CisJCXMgPSAiU0MxMF9DX1dSQVBfQiI7CisJCWJyZWFrOworCWNhc2UgU0MxMV9DX1dSQVBfUzoKKwkJcyA9ICJTQzExX0NfV1JBUF9TIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUFJJTlRLKEtFUk5fSU5GTyAiY2ZtX3N0YXRlX2NoYW5nZTogdW5rbm93biAlZFxuIiwgY19zdGF0ZSk7CisJCXJldHVybjsKKwl9CisJUFJJTlRLKEtFUk5fSU5GTyAiY2ZtX3N0YXRlX2NoYW5nZTogJXNcbiIsIHMpOworI2VuZGlmCQkJCS8vIERSSVZFUkRFQlVHCit9CQkJCS8vIGNmbV9zdGF0ZV9jaGFuZ2UKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJZWNtX3N0YXRlX2NoYW5nZQorICoKKyAqCVNldHMgRUNNIHN0YXRlIGluIGN1c3RvbSBzdGF0aXN0aWNzLgorICogQXJncworICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgY29udGV4dCBzdHJ1Y3QuCisgKgorICoJZV9zdGF0ZSAtIFBvc3NpYmxlIHZhbHVlcyBhcmU6CisgKgorICoJCVNDMF9JU09MQVRFRCwgU0MxX1dSQVBfQSAoNSksIFNDMl9XUkFQX0IgKDYpLCBTQzRfVEhSVV9BICgxMiksCisgKgkJU0M1X1RIUlVfQiAoNyksIFNDN19XUkFQX1MgKDgpCisgKiBPdXQKKyAqCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZWNtX3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGVfc3RhdGUpCit7CisjaWZkZWYgRFJJVkVSREVCVUcKKwljaGFyICpzOworCisJc3dpdGNoIChlX3N0YXRlKSB7CisJY2FzZSBFQzBfT1VUOgorCQlzID0gIkVDMF9PVVQiOworCQlicmVhazsKKwljYXNlIEVDMV9JTjoKKwkJcyA9ICJFQzFfSU4iOworCQlicmVhazsKKwljYXNlIEVDMl9UUkFDRToKKwkJcyA9ICJFQzJfVFJBQ0UiOworCQlicmVhazsKKwljYXNlIEVDM19MRUFWRToKKwkJcyA9ICJFQzNfTEVBVkUiOworCQlicmVhazsKKwljYXNlIEVDNF9QQVRIX1RFU1Q6CisJCXMgPSAiRUM0X1BBVEhfVEVTVCI7CisJCWJyZWFrOworCWNhc2UgRUM1X0lOU0VSVDoKKwkJcyA9ICJFQzVfSU5TRVJUIjsKKwkJYnJlYWs7CisJY2FzZSBFQzZfQ0hFQ0s6CisJCXMgPSAiRUM2X0NIRUNLIjsKKwkJYnJlYWs7CisJY2FzZSBFQzdfREVJTlNFUlQ6CisJCXMgPSAiRUM3X0RFSU5TRVJUIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcyA9ICJ1bmtub3duIjsKKwkJYnJlYWs7CisJfQorCVBSSU5USyhLRVJOX0lORk8gImVjbV9zdGF0ZV9jaGFuZ2U6ICVzXG4iLCBzKTsKKyNlbmRpZgkJCQkvL0RSSVZFUkRFQlVHCit9CQkJCS8vIGVjbV9zdGF0ZV9jaGFuZ2UKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJcm10X3N0YXRlX2NoYW5nZQorICoKKyAqCVNldHMgUk1UIHN0YXRlIGluIGN1c3RvbSBzdGF0aXN0aWNzLgorICogQXJncworICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgY29udGV4dCBzdHJ1Y3QuCisgKgorICoJcl9zdGF0ZSAtIFBvc3NpYmxlIHZhbHVlcyBhcmU6CisgKgorICoJCVJNMF9JU09MQVRFRCwgUk0xX05PTl9PUCwgUk0yX1JJTkdfT1AsIFJNM19ERVRFQ1QsCisgKgkJUk00X05PTl9PUF9EVVAsIFJNNV9SSU5HX09QX0RVUCwgUk02X0RJUkVDVEVELCBSTTdfVFJBQ0UKKyAqIE91dAorICoJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBybXRfc3RhdGVfY2hhbmdlKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcl9zdGF0ZSkKK3sKKyNpZmRlZiBEUklWRVJERUJVRworCWNoYXIgKnM7CisKKwlzd2l0Y2ggKHJfc3RhdGUpIHsKKwljYXNlIFJNMF9JU09MQVRFRDoKKwkJcyA9ICJSTTBfSVNPTEFURUQiOworCQlicmVhazsKKwljYXNlIFJNMV9OT05fT1A6CisJCXMgPSAiUk0xX05PTl9PUCAtIG5vdCBvcGVyYXRpb25hbCI7CisJCWJyZWFrOworCWNhc2UgUk0yX1JJTkdfT1A6CisJCXMgPSAiUk0yX1JJTkdfT1AgLSByaW5nIG9wZXJhdGlvbmFsIjsKKwkJYnJlYWs7CisJY2FzZSBSTTNfREVURUNUOgorCQlzID0gIlJNM19ERVRFQ1QgLSBkZXRlY3QgZHVwbCBhZGRyZXNzZXMiOworCQlicmVhazsKKwljYXNlIFJNNF9OT05fT1BfRFVQOgorCQlzID0gIlJNNF9OT05fT1BfRFVQIC0gZHVwbC4gYWRkciBkZXRlY3RlZCI7CisJCWJyZWFrOworCWNhc2UgUk01X1JJTkdfT1BfRFVQOgorCQlzID0gIlJNNV9SSU5HX09QX0RVUCAtIHJpbmcgb3Blci4gd2l0aCBkdXBsLiBhZGRyIjsKKwkJYnJlYWs7CisJY2FzZSBSTTZfRElSRUNURUQ6CisJCXMgPSAiUk02X0RJUkVDVEVEIC0gc2VuZGluZyBkaXJlY3RlZCBiZWFjb25zIjsKKwkJYnJlYWs7CisJY2FzZSBSTTdfVFJBQ0U6CisJCXMgPSAiUk03X1RSQUNFIC0gdHJhY2UgaW5pdGlhdGVkIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcyA9ICJ1bmtub3duIjsKKwkJYnJlYWs7CisJfQorCVBSSU5USyhLRVJOX0lORk8gIltybXRfc3RhdGVfY2hhbmdlOiAlc11cbiIsIHMpOworI2VuZGlmCQkJCS8vIERSSVZFUkRFQlVHCit9CQkJCS8vIHJtdF9zdGF0ZV9jaGFuZ2UKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJZHJ2X3Jlc2V0X2luZGljYXRpb24KKyAqCisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgU01UIHdoZW4gaXQgaGFzIGRldGVjdGVkIGEgc2V2ZXJlCisgKgloYXJkd2FyZSBwcm9ibGVtLiBUaGUgZHJpdmVyIHNob3VsZCBwZXJmb3JtIGEgcmVzZXQgb24gdGhlIGFkYXB0ZXIKKyAqCWFzIHNvb24gYXMgcG9zc2libGUsIGJ1dCBub3QgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICogT3V0CisgKglOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGRydl9yZXNldF9pbmRpY2F0aW9uKHN0cnVjdCBzX3NtYyAqc21jKQoreworCVBSSU5USyhLRVJOX0lORk8gImVudGVyaW5nIGRydl9yZXNldF9pbmRpY2F0aW9uXG4iKTsKKworCXNtYy0+b3MuUmVzZXRSZXF1ZXN0ZWQgPSBUUlVFOwkvLyBTZXQgZmxhZy4KKworfQkJCQkvLyBkcnZfcmVzZXRfaW5kaWNhdGlvbgorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2tmZGRpX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInNrZmRkaSIsCisJLmlkX3RhYmxlCT0gc2tmZGRpX3BjaV90YmwsCisJLnByb2JlCQk9IHNrZnBfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChza2ZwX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2tmZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmc2tmZGRpX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2tmZF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZza2ZkZGlfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNrZmRfaW5pdCk7Cittb2R1bGVfZXhpdChza2ZkX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9zbXQuYyBiL2RyaXZlcnMvbmV0L3NrZnAvc210LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5MzVlYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvc210LmMKQEAgLTAsMCArMSwyMDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaC90eXBlcy5oIgorI2luY2x1ZGUgImgvZmRkaS5oIgorI2luY2x1ZGUgImgvc21jLmgiCisjaW5jbHVkZSAiaC9zbXRfcC5oIgorCisjZGVmaW5lIEtFUk5FTAorI2luY2x1ZGUgImgvc210c3RhdGUuaCIKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKXNtdC5jCTIuNDMgOTgvMTEvMjMgKEMpIFNLICIgOworI2VuZGlmCisKK2V4dGVybiBjb25zdCB1X2NoYXIgY2Fub25pY2FsWzI1Nl0gOworCisvKgorICogRkMgaW4gU01idWYKKyAqLworI2RlZmluZSBtX2ZjKG1iKQkoKG1iKS0+c21fZGF0YVswXSkKKworI2RlZmluZSBTTVRfVElEX01BR0lDCTB4MWYwYTdiM2MKKworI2lmZGVmCURFQlVHCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc210X3R5cGVfbmFtZVtdID0geworCSJTTVRfMDA/PyIsICJTTVRfSU5GTyIsICJTTVRfMDI/PyIsICJTTVRfMDM/PyIsCisJIlNNVF8wND8/IiwgIlNNVF8wNT8/IiwgIlNNVF8wNj8/IiwgIlNNVF8wNz8/IiwKKwkiU01UXzA4Pz8iLCAiU01UXzA5Pz8iLCAiU01UXzBBPz8iLCAiU01UXzBCPz8iLAorCSJTTVRfMEM/PyIsICJTTVRfMEQ/PyIsICJTTVRfMEU/PyIsICJTTVRfTlNBIgorfSA7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbXRfY2xhc3NfbmFtZVtdID0geworCSJVTktOT1dOIiwiTklGIiwiU0lGX0NPTkZJRyIsIlNJRl9PUEVSIiwiRUNGIiwiUkFGIiwiUkRGIiwKKwkiU1JGIiwiUE1GX0dFVCIsIlBNRl9TRVQiLCJFU0YiCit9IDsKKyNlbmRpZgorI2RlZmluZSBMQVNUX0NMQVNTCShTTVRfUE1GX1NFVCkKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmZGRpX2FkZHIgU01UX1Vua25vd24gPSB7CisJeyAwLDAsMHgxZiwwLDAsMCB9Cit9IDsKKworLyoKKyAqIGV4dGVybmFsIHZhcmlhYmxlcworICovCitleHRlcm4gY29uc3Qgc3RydWN0IGZkZGlfYWRkciBmZGRpX2Jyb2FkY2FzdCA7CisKKy8qCisgKiBleHRlcm5hbCBmdW5jdGlvbnMKKyAqLworaW50IHBjbV9zdGF0dXNfdHdpc3RlZChzdHJ1Y3Qgc19zbWMgKnNtYyk7CisKKy8qCisgKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KKyNpZmRlZglMSVRUTEVfRU5ESUFOCitzdGF0aWMgaW50IHNtdF9zd2FwX3Nob3J0KHVfc2hvcnQgcyk7CisjZW5kaWYKK3N0YXRpYyBpbnQgbWFjX2luZGV4KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbWFjKTsKK3N0YXRpYyBpbnQgcGh5X2luZGV4KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcGh5KTsKK3N0YXRpYyBpbnQgbWFjX2Nvbl9yZXNvdXJjZV9pbmRleChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG1hYyk7CitzdGF0aWMgaW50IHBoeV9jb25fcmVzb3VyY2VfaW5kZXgoc3RydWN0IHNfc21jICpzbWMsIGludCBwaHkpOworc3RhdGljIHZvaWQgc210X3NlbmRfcmRmKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqcmVqLCBpbnQgZmMsIGludCByZWFzb24sCisJCQkgaW50IGxvY2FsKTsKK3N0YXRpYyB2b2lkIHNtdF9zZW5kX25pZihzdHJ1Y3Qgc19zbWMgKnNtYywgY29uc3Qgc3RydWN0IGZkZGlfYWRkciAqZGVzdCwgCisJCQkgaW50IGZjLCB1X2xvbmcgdGlkLCBpbnQgdHlwZSwgaW50IGxvY2FsKTsKK3N0YXRpYyB2b2lkIHNtdF9zZW5kX2VjZihzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqZGVzdCwgaW50IGZjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVfbG9uZyB0aWQsIGludCB0eXBlLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIHNtdF9lY2hvX3Rlc3Qoc3RydWN0IHNfc21jICpzbWMsIGludCBkbmEpOworc3RhdGljIHZvaWQgc210X3NlbmRfc2lmX2NvbmZpZyhzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqZGVzdCwKKwkJCQl1X2xvbmcgdGlkLCBpbnQgbG9jYWwpOworc3RhdGljIHZvaWQgc210X3NlbmRfc2lmX29wZXJhdGlvbihzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqZGVzdCwKKwkJCQkgICB1X2xvbmcgdGlkLCBpbnQgbG9jYWwpOworI2lmZGVmIExJVFRMRV9FTkRJQU4KK3N0YXRpYyB2b2lkIHNtdF9zdHJpbmdfc3dhcCh2b2lkKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgc210X2FkZF9mcmFtZV9sZW4oU01idWYgKm1iLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIHNtdF9maWxsX3VuYShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3VuYSAqdW5hKTsKK3N0YXRpYyB2b2lkIHNtdF9maWxsX3NkZShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3NkZSAqc2RlKTsKK3N0YXRpYyB2b2lkIHNtdF9maWxsX3N0YXRlKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3Bfc3RhdGUgKnN0YXRlKTsKK3N0YXRpYyB2b2lkIHNtdF9maWxsX3RpbWVzdGFtcChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3RpbWVzdGFtcCAqdHMpOworc3RhdGljIHZvaWQgc210X2ZpbGxfcG9saWN5KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfcG9saWN5ICpwb2xpY3kpOworc3RhdGljIHZvaWQgc210X2ZpbGxfbGF0ZW5jeShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX2xhdGVuY3kgKmxhdGVuY3kpOworc3RhdGljIHZvaWQgc210X2ZpbGxfbmVpZ2hib3Ioc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcF9uZWlnaGJvciAqbmVpZ2hib3IpOworc3RhdGljIGludCBzbXRfZmlsbF9wYXRoKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfcGF0aCAqcGF0aCk7CitzdGF0aWMgdm9pZCBzbXRfZmlsbF9tYWNfc3RhdHVzKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfbWFjX3N0YXR1cyAqc3QpOworc3RhdGljIHZvaWQgc210X2ZpbGxfbGVtKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfbGVtICpsZW0sIGludCBwaHkpOworc3RhdGljIHZvaWQgc210X2ZpbGxfdmVyc2lvbihzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3ZlcnNpb24gKnZlcnMpOworc3RhdGljIHZvaWQgc210X2ZpbGxfZnNjKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfZnNjICpmc2MpOworc3RhdGljIHZvaWQgc210X2ZpbGxfbWFjX2NvdW50ZXIoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcF9tYWNfY291bnRlciAqbWMpOworc3RhdGljIHZvaWQgc210X2ZpbGxfbWFjX2ZuYyhzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX21hY19mbmMgKmZuYyk7CitzdGF0aWMgdm9pZCBzbXRfZmlsbF9tYW51ZmFjdHVyZXIoc3RydWN0IHNfc21jICpzbWMsIAorCQkJCSAgc3RydWN0IHNtcF9wX21hbnVmYWN0dXJlciAqbWFuKTsKK3N0YXRpYyB2b2lkIHNtdF9maWxsX3VzZXIoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXBfcF91c2VyICp1c2VyKTsKK3N0YXRpYyB2b2lkIHNtdF9maWxsX3NldGNvdW50KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3Bfc2V0Y291bnQgKnNldGNvdW50KTsKK3N0YXRpYyB2b2lkIHNtdF9maWxsX2VjaG8oc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcF9lY2hvICplY2hvLCB1X2xvbmcgc2VlZCwKKwkJCSAgaW50IGxlbik7CisKK3ZvaWQgc210X2NsZWFyX3VuYV9kbmEoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgc210X2NsZWFyX29sZF91bmFfZG5hKHN0cnVjdCBzX3NtYyAqc21jKTsKKyNpZmRlZglDT05DRU5UUkFUT1IKK3N0YXRpYyBpbnQgZW50aXR5X3RvX2luZGV4KHZvaWQpOworI2VuZGlmCitzdGF0aWMgdm9pZCB1cGRhdGVfZGFjKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcmVwb3J0KTsKK3N0YXRpYyBpbnQgZGl2X3JhdGlvKHVfbG9uZyB1cHBlciwgdV9sb25nIGxvd2VyKTsKKyNpZmRlZiAgVVNFX0NBTl9BRERSCit2b2lkCWh3bV9jb252X2NhbihzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciAqZGF0YSwgaW50IGxlbik7CisjZWxzZQorI2RlZmluZQkJaHdtX2NvbnZfY2FuKHNtYyxkYXRhLGxlbikKKyNlbmRpZgorCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX215X2FkZHIoY29uc3Qgc3RydWN0IHNfc21jICpzbWMsIAorCQkJICAgICBjb25zdCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyKQoreworCXJldHVybigqKHNob3J0ICopKCZhZGRyLT5hWzBdKSA9PQorCQkqKHNob3J0ICopKCZzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNTTVRBZGRyZXNzLmFbMF0pCisJICAmJiAqKHNob3J0ICopKCZhZGRyLT5hWzJdKSA9PQorCQkqKHNob3J0ICopKCZzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNTTVRBZGRyZXNzLmFbMl0pCisJICAmJiAqKHNob3J0ICopKCZhZGRyLT5hWzRdKSA9PQorCQkqKHNob3J0ICopKCZzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNTTVRBZGRyZXNzLmFbNF0pKSA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2Jyb2FkY2FzdChjb25zdCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyKQoreworCXJldHVybigqKHVfc2hvcnQgKikoJmFkZHItPmFbMF0pID09IDB4ZmZmZiAmJgorCSAgICAgICAqKHVfc2hvcnQgKikoJmFkZHItPmFbMl0pID09IDB4ZmZmZiAmJgorCSAgICAgICAqKHVfc2hvcnQgKikoJmFkZHItPmFbNF0pID09IDB4ZmZmZiApIDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfaW5kaXZpZHVhbChjb25zdCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyKQoreworCXJldHVybighKGFkZHItPmFbMF0gJiBHUk9VUF9BRERSKSkgOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19lcXVhbChjb25zdCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyMSwgCisJCQkgICBjb25zdCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyMikKK3sKKwlyZXR1cm4oKih1X3Nob3J0ICopKCZhZGRyMS0+YVswXSkgPT0gKih1X3Nob3J0ICopKCZhZGRyMi0+YVswXSkgJiYKKwkgICAgICAgKih1X3Nob3J0ICopKCZhZGRyMS0+YVsyXSkgPT0gKih1X3Nob3J0ICopKCZhZGRyMi0+YVsyXSkgJiYKKwkgICAgICAgKih1X3Nob3J0ICopKCZhZGRyMS0+YVs0XSkgPT0gKih1X3Nob3J0ICopKCZhZGRyMi0+YVs0XSkgKSA7Cit9CisKKy8qCisgKiBsaXN0IG9mIG1hbmRhdG9yeSBwYXJhcyBpbiBmcmFtZXMKKyAqLworc3RhdGljIGNvbnN0IHVfc2hvcnQgcGxpc3RfbmlmW10gPSB7IFNNVF9QX1VOQSxTTVRfUF9TREUsU01UX1BfU1RBVEUsMCB9IDsKKworLyoKKyAqIGluaXQgU01UIGFnZW50CisgKi8KK3ZvaWQgc210X2FnZW50X2luaXQoc3RydWN0IHNfc21jICpzbWMpCit7CisJaW50CQlpIDsKKworCS8qCisJICogZ2V0IE1BQyBhZGRyZXNzCisJICovCisJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDU01UQWRkcmVzcyA9IHNtYy0+aHcuZmRkaV9ob21lX2FkZHIgOworCisJLyoKKwkgKiBnZXQgT1VJIGFkZHJlc3MgZnJvbSBkcml2ZXIgKGJpYSA9PSBidWlsdC1pbi1hZGRyZXNzKQorCSAqLworCXNtYy0+bWliLmZkZGlTTVRTdGF0aW9uSWQuc2lkX29lbVswXSA9IDAgOworCXNtYy0+bWliLmZkZGlTTVRTdGF0aW9uSWQuc2lkX29lbVsxXSA9IDAgOworCWRyaXZlcl9nZXRfYmlhKHNtYywmc21jLT5taWIuZmRkaVNNVFN0YXRpb25JZC5zaWRfbm9kZSkgOworCWZvciAoaSA9IDAgOyBpIDwgNiA7IGkgKyspIHsKKwkJc21jLT5taWIuZmRkaVNNVFN0YXRpb25JZC5zaWRfbm9kZS5hW2ldID0KKwkJCWNhbm9uaWNhbFtzbWMtPm1pYi5mZGRpU01UU3RhdGlvbklkLnNpZF9ub2RlLmFbaV1dIDsKKwl9CisJc21jLT5taWIuZmRkaVNNVE1hbnVmYWN0dXJlckRhdGFbMF0gPQorCQlzbWMtPm1pYi5mZGRpU01UU3RhdGlvbklkLnNpZF9ub2RlLmFbMF0gOworCXNtYy0+bWliLmZkZGlTTVRNYW51ZmFjdHVyZXJEYXRhWzFdID0KKwkJc21jLT5taWIuZmRkaVNNVFN0YXRpb25JZC5zaWRfbm9kZS5hWzFdIDsKKwlzbWMtPm1pYi5mZGRpU01UTWFudWZhY3R1cmVyRGF0YVsyXSA9CisJCXNtYy0+bWliLmZkZGlTTVRTdGF0aW9uSWQuc2lkX25vZGUuYVsyXSA7CisJc21jLT5zbS5zbXRfdGlkID0gMCA7CisJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRHVwQWRkcmVzc1Rlc3QgPSBEQV9OT05FIDsKKwlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVTkRBX0ZsYWcgPSBGQUxTRSA7CisjaWZuZGVmCVNMSU1fU01UCisJc210X2NsZWFyX3VuYV9kbmEoc21jKSA7CisJc210X2NsZWFyX29sZF91bmFfZG5hKHNtYykgOworI2VuZGlmCisJZm9yIChpID0gMCA7IGkgPCBTTVRfTUFYX1RFU1QgOyBpKyspCisJCXNtYy0+c20ucGVuZFtpXSA9IDAgOworCXNtYy0+c20ucGxlYXNlX3JlY29ubmVjdCA9IDAgOworCXNtYy0+c20udW5pcV90aWNrcyA9IDAgOworfQorCisvKgorICogU01UIHRhc2sKKyAqIGZvcmV2ZXIKKyAqCWRlbGF5IDMwIHNlY29uZHMKKyAqCXNlbmQgTklGCisgKgljaGVjayB0dnUgJiB0dmQKKyAqIGVuZAorICovCit2b2lkIHNtdF9hZ2VudF90YXNrKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXNtdF90aW1lcl9zdGFydChzbWMsJnNtYy0+c20uc210X3RpbWVyLCAodV9sb25nKTEwMDAwMDBMLAorCQlFVl9UT0tFTihFVkVOVF9TTVQsU01fVElNRVIpKSA7CisJREJfU01UKCJTTVQgYWdlbnQgdGFza1xuIiwwLDApIDsKK30KKwordm9pZCBzbXRfcGxlYXNlX3JlY29ubmVjdChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHJlY29ubl90aW1lKQorLyogc3RydWN0IHNfc21jCSpzbWM7ICBQb2ludGVyIHRvIFNNVCBjb250ZXh0ICovCisvKiBpbnQgcmVjb25uX3RpbWU7ICAgIFdhaXQgZm9yIHJlY29ubmVjdCB0aW1lIGluIHNlY29uZHMgKi8KK3sKKwkvKgorCSAqIFRoZSBwbGVhc2UgcmVjb25uZWN0IHZhcmlhYmxlIGlzIHVzZWQgYXMgYSB0aW1lci4KKwkgKiBJdCBpcyBkZWNyZW1lbnRlZCBlYWNoIHRpbWUgc210X2V2ZW50IGlzIGNhbGxlZC4KKwkgKiBUaGlzIGhhcHBlbnMgZXZlcnkgc2Vjb25kIG9yIHdoZW4gc210X2ZvcmNlX2lycSBpcyBjYWxsZWQuCisJICogTm90ZTogc210X2ZvcmNlX2lycSAoKSBpcyBjYWxsZWQgb24gc29tZSBwYWNrZXQgcmVjZWl2ZXMgYW5kCisJICogICAgICAgd2hlbiBhIG11bHRpY2FzdCBhZGRyZXNzIGlzIGNoYW5nZWQuIFNpbmNlIG5vdGhpbmcKKwkgKiAgICAgICBpcyByZWNlaXZlZCBkdXJpbmcgdGhlIGRpc2Nvbm5lY3QgYW5kIHRoZSBtdWx0aWNhc3QKKwkgKiAgICAgICBhZGRyZXNzIGNoYW5nZXMgY2FuIGJlIHZpZXdlZCBhcyBub3QgdmVyeSBvZnRlbiBhbmQKKwkgKiAgICAgICB0aGUgdGltZXIgcnVucyBvdXQgY2xvc2UgdG8gaXRzIGdpdmVuIHZhbHVlCisJICogICAgICAgKHJlY29ubl90aW1lKS4KKwkgKi8KKwlzbWMtPnNtLnBsZWFzZV9yZWNvbm5lY3QgPSByZWNvbm5fdGltZSA7Cit9CisKKyNpZm5kZWYgU01UX1JFQUxfVE9LRU5fQ1QKK3ZvaWQgc210X2VtdWxhdGVfdG9rZW5fY3Qoc3RydWN0IHNfc21jICpzbWMsIGludCBtYWNfaW5kZXgpCit7CisJdV9sb25nCWNvdW50OworCXVfbG9uZwl0aW1lOworCisKKwl0aW1lID0gc210X2dldF90aW1lKCk7CisJY291bnQgPQkoKHRpbWUgLSBzbWMtPnNtLmxhc3RfdG9rX3RpbWVbbWFjX2luZGV4XSkgKgorCQkJCQkxMDApL1RJQ0tTX1BFUl9TRUNPTkQ7CisKKwkvKgorCSAqIE9ubHkgd2hlbiByaW5nIGlzIHVwIHdlIHdpbGwgaGF2ZSBhIHRva2VuIGNvdW50LiBUaGUKKwkgKiBmbGFnIGlzIHVuZm9ydHVuYXRseSBhIHNpbmdsZSBpbnN0YW5jZSB2YWx1ZS4gVGhpcworCSAqIGRvZXNuJ3QgbWF0dGVyIG5vdywgYmVjYXVzZSB3ZSBjdXJyZW50bHkgaGF2ZSBvbmx5CisJICogb25lIE1BQyBpbnN0YW5jZS4KKwkgKi8KKwlpZiAoc21jLT5ody5tYWNfcmluZ19pc191cCl7CisJCXNtYy0+bWliLm1bbWFjX2luZGV4XS5mZGRpTUFDVG9rZW5fQ3QgKz0gY291bnQ7CisJfQorCisJLyogUmVtZW1iZXIgY3VycmVudCB0aW1lICovCisJc21jLT5zbS5sYXN0X3Rva190aW1lW21hY19pbmRleF0gPSB0aW1lOworCit9CisjZW5kaWYKKworLypBUkdTVVNFRDEqLwordm9pZCBzbXRfZXZlbnQoc3RydWN0IHNfc21jICpzbWMsIGludCBldmVudCkKK3sKKwl1X2xvbmcJCXRpbWUgOworI2lmbmRlZiBTTVRfUkVBTF9UT0tFTl9DVAorCWludAkJaSA7CisjZW5kaWYKKworCisJaWYgKHNtYy0+c20ucGxlYXNlX3JlY29ubmVjdCkgeworCQlzbWMtPnNtLnBsZWFzZV9yZWNvbm5lY3QgLS0gOworCQlpZiAoc21jLT5zbS5wbGVhc2VfcmVjb25uZWN0ID09IDApIHsKKwkJCS8qIENvdW50ZWQgZG93biAqLworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX0VDTSxFQ19DT05ORUNUKSA7CisJCX0KKwl9CisKKwlpZiAoZXZlbnQgPT0gU01fRkFTVCkKKwkJcmV0dXJuIDsKKworCS8qCisJICogdGltZXIgZm9yIHBlcmlvZGljIGNsZWFudXAgaW4gZHJpdmVyCisJICogcmVzZXQgYW5kIHN0YXJ0IHRoZSB3YXRjaGRvZyAoRk0yKQorCSAqIEVTUyB0aW1lcgorCSAqIFNCQSB0aW1lcgorCSAqLworCXNtdF90aW1lcl9wb2xsKHNtYykgOworCXNtdF9zdGFydF93YXRjaGRvZyhzbWMpIDsKKyNpZm5kZWYJU0xJTV9TTVQKKyNpZm5kZWYgQk9PVAorI2lmZGVmCUVTUworCWVzc190aW1lcl9wb2xsKHNtYykgOworI2VuZGlmCisjZW5kaWYKKyNpZmRlZglTQkEKKwlzYmFfdGltZXJfcG9sbChzbWMpIDsKKyNlbmRpZgorCisJc210X3NyZl9ldmVudChzbWMsMCwwLDApIDsKKworI2VuZGlmCS8qIG5vIFNMSU1fU01UICovCisKKwl0aW1lID0gc210X2dldF90aW1lKCkgOworCisJaWYgKHRpbWUgLSBzbWMtPnNtLnNtdF9sYXN0X2xlbSA+PSBUSUNLU19QRVJfU0VDT05EKjgpIHsKKwkJLyoKKwkJICogVXNlIDggc2VjLiBmb3IgdGhlIHRpbWUgaW50ZXJ2YWxsLCBpdCBzaW1wbGlmaWVzIHRoZQorCQkgKiBMRVIgZXN0aW1hdGlvbi4KKwkJICovCisJCXN0cnVjdCBmZGRpX21pYl9tCSptaWIgOworCQl1X2xvbmcJCQl1cHBlciA7CisJCXVfbG9uZwkJCWxvd2VyIDsKKwkJaW50CQkJY29uZCA7CisJCWludAkJCXBvcnQ7CisJCXN0cnVjdCBzX3BoeQkJKnBoeSA7CisJCS8qCisJCSAqIGNhbGN1bGF0ZSBMRU0gYml0IGVycm9yIHJhdGUKKwkJICovCisJCXNtX2xlbV9ldmFsdWF0ZShzbWMpIDsKKwkJc21jLT5zbS5zbXRfbGFzdF9sZW0gPSB0aW1lIDsKKworCQkvKgorCQkgKiBjaGVjayBjb25kaXRpb25zCisJCSAqLworI2lmbmRlZglTTElNX1NNVAorCQltYWNfdXBkYXRlX2NvdW50ZXIoc21jKSA7CisJCW1pYiA9IHNtYy0+bWliLm0gOworCQl1cHBlciA9CisJCShtaWItPmZkZGlNQUNMb3N0X0N0IC0gbWliLT5mZGRpTUFDT2xkX0xvc3RfQ3QpICsKKwkJKG1pYi0+ZmRkaU1BQ0Vycm9yX0N0IC0gbWliLT5mZGRpTUFDT2xkX0Vycm9yX0N0KSA7CisJCWxvd2VyID0KKwkJKG1pYi0+ZmRkaU1BQ0ZyYW1lX0N0IC0gbWliLT5mZGRpTUFDT2xkX0ZyYW1lX0N0KSArCisJCShtaWItPmZkZGlNQUNMb3N0X0N0IC0gbWliLT5mZGRpTUFDT2xkX0xvc3RfQ3QpIDsKKwkJbWliLT5mZGRpTUFDRnJhbWVFcnJvclJhdGlvID0gZGl2X3JhdGlvKHVwcGVyLGxvd2VyKSA7CisKKwkJY29uZCA9CisJCQkoKCFtaWItPmZkZGlNQUNGcmFtZUVycm9yVGhyZXNob2xkICYmCisJCQltaWItPmZkZGlNQUNFcnJvcl9DdCAhPSBtaWItPmZkZGlNQUNPbGRfRXJyb3JfQ3QpIHx8CisJCQkobWliLT5mZGRpTUFDRnJhbWVFcnJvclJhdGlvID4KKwkJCW1pYi0+ZmRkaU1BQ0ZyYW1lRXJyb3JUaHJlc2hvbGQpKSA7CisKKwkJaWYgKGNvbmQgIT0gbWliLT5mZGRpTUFDRnJhbWVFcnJvckZsYWcpCisJCQlzbXRfc3JmX2V2ZW50KHNtYyxTTVRfQ09ORF9NQUNfRlJBTUVfRVJST1IsCisJCQkJSU5ERVhfTUFDLGNvbmQpIDsKKworCQl1cHBlciA9CisJCShtaWItPmZkZGlNQUNOb3RDb3BpZWRfQ3QgLSBtaWItPmZkZGlNQUNPbGRfTm90Q29waWVkX0N0KSA7CisJCWxvd2VyID0KKwkJdXBwZXIgKworCQkobWliLT5mZGRpTUFDQ29waWVkX0N0IC0gbWliLT5mZGRpTUFDT2xkX0NvcGllZF9DdCkgOworCQltaWItPmZkZGlNQUNOb3RDb3BpZWRSYXRpbyA9IGRpdl9yYXRpbyh1cHBlcixsb3dlcikgOworCisJCWNvbmQgPQorCQkJKCghbWliLT5mZGRpTUFDTm90Q29waWVkVGhyZXNob2xkICYmCisJCQltaWItPmZkZGlNQUNOb3RDb3BpZWRfQ3QgIT0KKwkJCQltaWItPmZkZGlNQUNPbGRfTm90Q29waWVkX0N0KXx8CisJCQkobWliLT5mZGRpTUFDTm90Q29waWVkUmF0aW8gPgorCQkJbWliLT5mZGRpTUFDTm90Q29waWVkVGhyZXNob2xkKSkgOworCisJCWlmIChjb25kICE9IG1pYi0+ZmRkaU1BQ05vdENvcGllZEZsYWcpCisJCQlzbXRfc3JmX2V2ZW50KHNtYyxTTVRfQ09ORF9NQUNfTk9UX0NPUElFRCwKKwkJCQlJTkRFWF9NQUMsY29uZCkgOworCisJCS8qCisJCSAqIHNldCBvbGQgdmFsdWVzCisJCSAqLworCQltaWItPmZkZGlNQUNPbGRfRnJhbWVfQ3QgPSBtaWItPmZkZGlNQUNGcmFtZV9DdCA7CisJCW1pYi0+ZmRkaU1BQ09sZF9Db3BpZWRfQ3QgPSBtaWItPmZkZGlNQUNDb3BpZWRfQ3QgOworCQltaWItPmZkZGlNQUNPbGRfRXJyb3JfQ3QgPSBtaWItPmZkZGlNQUNFcnJvcl9DdCA7CisJCW1pYi0+ZmRkaU1BQ09sZF9Mb3N0X0N0ID0gbWliLT5mZGRpTUFDTG9zdF9DdCA7CisJCW1pYi0+ZmRkaU1BQ09sZF9Ob3RDb3BpZWRfQ3QgPSBtaWItPmZkZGlNQUNOb3RDb3BpZWRfQ3QgOworCisJCS8qCisJCSAqIENoZWNrIHBvcnQgRUJFcnJvciBDb25kaXRpb24KKwkJICovCisJCWZvciAocG9ydCA9IDA7IHBvcnQgPCBOVU1QSFlTOyBwb3J0ICsrKSB7CisJCQlwaHkgPSAmc21jLT55W3BvcnRdIDsKKworCQkJaWYgKCFwaHktPm1pYi0+ZmRkaVBPUlRIYXJkd2FyZVByZXNlbnQpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJY29uZCA9IChwaHktPm1pYi0+ZmRkaVBPUlRFQkVycm9yX0N0IC0KKwkJCQlwaHktPm1pYi0+ZmRkaVBPUlRPbGRFQkVycm9yX0N0ID4gNSkgOworCisJCQkvKiBJZiByYXRpbyBpcyBtb3JlIHRoYW4gNSBpbiA4IHNlY29uZHMKKwkJCSAqIFNldCB0aGUgY29uZGl0aW9uLgorCQkJICovCisJCQlzbXRfc3JmX2V2ZW50KHNtYyxTTVRfQ09ORF9QT1JUX0VCX0VSUk9SLAorCQkJCShpbnQpIChJTkRFWF9QT1JUKyBwaHktPm5wKSAsY29uZCkgOworCisJCQkvKgorCQkJICogc2V0IG9sZCB2YWx1ZXMKKwkJCSAqLworCQkJcGh5LT5taWItPmZkZGlQT1JUT2xkRUJFcnJvcl9DdCA9CisJCQkJcGh5LT5taWItPmZkZGlQT1JURUJFcnJvcl9DdCA7CisJCX0KKworI2VuZGlmCS8qIG5vIFNMSU1fU01UICovCisJfQorCisjaWZuZGVmCVNMSU1fU01UCisKKwlpZiAodGltZSAtIHNtYy0+c20uc210X2xhc3Rfbm90aWZ5ID49ICh1X2xvbmcpCisJCShzbWMtPm1pYi5mZGRpU01UVFRfTm90aWZ5ICogVElDS1NfUEVSX1NFQ09ORCkgKSB7CisJCS8qCisJCSAqIHdlIGNhbiBlaXRoZXIgc2VuZCBhbiBhbm5vdW5jZW1lbnQgb3IgYSByZXF1ZXN0CisJCSAqIGEgcmVxdWVzdCB3aWxsIHRyaWdnZXIgYSByZXBseSBzbyB0aGF0IHdlIGNhbiB1cGRhdGUKKwkJICogb3VyIGRuYQorCQkgKiBub3RlOiBzYW1lIHRpZCBtdXN0IGJlIHVzZWQgdW50aWwgcmVwbHkgaXMgcmVjZWl2ZWQKKwkJICovCisJCWlmICghc21jLT5zbS5wZW5kW1NNVF9USURfTklGXSkKKwkJCXNtYy0+c20ucGVuZFtTTVRfVElEX05JRl0gPSBzbXRfZ2V0X3RpZChzbWMpIDsKKwkJc210X3NlbmRfbmlmKHNtYywmZmRkaV9icm9hZGNhc3QsIEZDX1NNVF9OU0EsCisJCQlzbWMtPnNtLnBlbmRbU01UX1RJRF9OSUZdLCBTTVRfUkVRVUVTVCwwKSA7CisJCXNtYy0+c20uc210X2xhc3Rfbm90aWZ5ID0gdGltZSA7CisJfQorCisJLyoKKwkgKiBjaGVjayB0aW1lcgorCSAqLworCWlmIChzbWMtPnNtLnNtdF90dnUgJiYKKwkgICAgdGltZSAtIHNtYy0+c20uc210X3R2dSA+IDIyOCpUSUNLU19QRVJfU0VDT05EKSB7CisJCURCX1NNVCgiU01UIDogVU5BIGV4cGlyZWRcbiIsMCwwKSA7CisJCXNtYy0+c20uc210X3R2dSA9IDAgOworCisJCWlmICghaXNfZXF1YWwoJnNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1Vwc3RyZWFtTmJyLAorCQkJJlNNVF9Vbmtub3duKSl7CisJCQkvKiBEbyBub3QgdXBkYXRlIHVua25vd24gYWRkcmVzcyAqLworCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDT2xkVXBzdHJlYW1OYnI9CisJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVXBzdHJlYW1OYnIgOworCQl9CisJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1Vwc3RyZWFtTmJyID0gU01UX1Vua25vd24gOworCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVTkRBX0ZsYWcgPSBGQUxTRSA7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGUgZmRkaU1BQ1VOREFfRmxhZyA9IEZBTFNFIGlzCisJCSAqIGluY2x1ZGVkIGluIHRoZSBTUkYgc28gd2UgZG9uJ3QgZ2VuZXJhdGUKKwkJICogYSBzZXBhcmF0ZSBTUkYgZm9yIHRoZSBkZWFzc2VydGlvbiBvZiB0aGlzCisJCSAqIGNvbmRpdGlvbgorCQkgKi8KKwkJdXBkYXRlX2RhYyhzbWMsMCkgOworCQlzbXRfc3JmX2V2ZW50KHNtYywgU01UX0VWRU5UX01BQ19ORUlHSEJPUl9DSEFOR0UsCisJCQlJTkRFWF9NQUMsMCkgOworCX0KKwlpZiAoc21jLT5zbS5zbXRfdHZkICYmCisJICAgIHRpbWUgLSBzbWMtPnNtLnNtdF90dmQgPiAyMjgqVElDS1NfUEVSX1NFQ09ORCkgeworCQlEQl9TTVQoIlNNVCA6IEROQSBleHBpcmVkXG4iLDAsMCkgOworCQlzbWMtPnNtLnNtdF90dmQgPSAwIDsKKwkJaWYgKCFpc19lcXVhbCgmc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRG93bnN0cmVhbU5iciwKKwkJCSZTTVRfVW5rbm93bikpeworCQkJLyogRG8gbm90IHVwZGF0ZSB1bmtub3duIGFkZHJlc3MgKi8KKwkJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ09sZERvd25zdHJlYW1OYnI9CisJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRG93bnN0cmVhbU5iciA7CisJCX0KKwkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRG93bnN0cmVhbU5iciA9IFNNVF9Vbmtub3duIDsKKwkJc210X3NyZl9ldmVudChzbWMsIFNNVF9FVkVOVF9NQUNfTkVJR0hCT1JfQ0hBTkdFLAorCQkJSU5ERVhfTUFDLDApIDsKKwl9CisKKyNlbmRpZgkvKiBubyBTTElNX1NNVCAqLworCisjaWZuZGVmIFNNVF9SRUFMX1RPS0VOX0NUCisJLyoKKwkgKiBUb2tlbiBjb3VudGVyIGVtdWxhdGlvbiBzZWN0aW9uLiBJZiBoYXJkd2FyZSBzdXBwb3J0cyB0aGUgdG9rZW4KKwkgKiBjb3VudCwgdGhlIHRva2VuIGNvdW50ZXIgd2lsbCBiZSB1cGRhdGVkIGluIG1hY191cGRhdGVfY291bnRlci4KKwkgKi8KKwlmb3IgKGkgPSBNQUMwOyBpIDwgTlVNTUFDUzsgaSsrICl7CisJCWlmICh0aW1lIC0gc21jLT5zbS5sYXN0X3Rva190aW1lW2ldID4gMipUSUNLU19QRVJfU0VDT05EICl7CisJCQlzbXRfZW11bGF0ZV90b2tlbl9jdCggc21jLCBpICk7CisJCX0KKwl9CisjZW5kaWYKKworCXNtdF90aW1lcl9zdGFydChzbWMsJnNtYy0+c20uc210X3RpbWVyLCAodV9sb25nKTEwMDAwMDBMLAorCQlFVl9UT0tFTihFVkVOVF9TTVQsU01fVElNRVIpKSA7Cit9CisKK3N0YXRpYyBpbnQgZGl2X3JhdGlvKHVfbG9uZyB1cHBlciwgdV9sb25nIGxvd2VyKQoreworCWlmICgodXBwZXI8PDE2TCkgPCB1cHBlcikKKwkJdXBwZXIgPSAweGZmZmYwMDAwTCA7CisJZWxzZQorCQl1cHBlciA8PD0gMTZMIDsKKwlpZiAoIWxvd2VyKQorCQlyZXR1cm4oMCkgOworCXJldHVybigoaW50KSh1cHBlci9sb3dlcikpIDsKK30KKworI2lmbmRlZglTTElNX1NNVAorCisvKgorICogcmVjZWl2ZSBwYWNrZXQgaGFuZGxlcgorICovCit2b2lkIHNtdF9yZWNlaXZlZF9wYWNrKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIsIGludCBmcykKKy8qIGludCBmczsgIGZyYW1lIHN0YXR1cyAqLworeworCXN0cnVjdCBzbXRfaGVhZGVyCSpzbSA7CisJaW50CQkJbG9jYWwgOworCisJaW50CQkJaWxsZWdhbCA9IDAgOworCisJc3dpdGNoIChtX2ZjKG1iKSkgeworCWNhc2UgRkNfU01UX0lORk8gOgorCWNhc2UgRkNfU01UX0xBTl9MT0MgOgorCWNhc2UgRkNfU01UX0xPQyA6CisJY2FzZSBGQ19TTVRfTlNBIDoKKwkJYnJlYWsgOworCWRlZmF1bHQgOgorCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworCQlyZXR1cm4gOworCX0KKworCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1NNVENvcGllZF9DdCsrIDsKKwlzbSA9IHNtdG9kKG1iLHN0cnVjdCBzbXRfaGVhZGVyICopIDsKKwlsb2NhbCA9ICgoZnMgJiBMX0lORElDQVRPUikgIT0gMCkgOworCWh3bV9jb252X2NhbihzbWMsKGNoYXIgKilzbSwxMikgOworCisJLyogY2hlY2sgZGVzdGluYXRpb24gYWRkcmVzcyAqLworCWlmIChpc19pbmRpdmlkdWFsKCZzbS0+c210X2Rlc3QpICYmICFpc19teV9hZGRyKHNtYywmc20tPnNtdF9kZXN0KSkgeworCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworCQlyZXR1cm4gOworCX0KKyNpZgkwCQkvKiBmb3IgRFVQIHJlY29nbml0aW9uLCBkbyBOT1QgZmlsdGVyIHRoZW0gKi8KKwkvKiBpZ25vcmUgbG9vcCBiYWNrIHBhY2tldHMgKi8KKwlpZiAoaXNfbXlfYWRkcihzbWMsJnNtLT5zbXRfc291cmNlKSAmJiAhbG9jYWwpIHsKKwkJc210X2ZyZWVfbWJ1ZihzbWMsbWIpIDsKKwkJcmV0dXJuIDsKKwl9CisjZW5kaWYKKworCXNtdF9zd2FwX3BhcmEoc20sKGludCkgbWItPnNtX2xlbiwxKSA7CisJREJfU01UKCJTTVQgOiByZWNlaXZlZCBwYWNrZXQgWyVzXSBhdCAweCV4XG4iLAorCQlzbXRfdHlwZV9uYW1lW21fZmMobWIpICYgMHhmXSxzbSkgOworCURCX1NNVCgiU01UIDogdmVyc2lvbiAlZCwgY2xhc3MgJXNcbiIsc20tPnNtdF92ZXJzaW9uLAorCQlzbXRfY2xhc3NfbmFtZVsoc20tPnNtdF9jbGFzcz5MQVNUX0NMQVNTKT8wIDogc20tPnNtdF9jbGFzc10pIDsKKworI2lmZGVmCVNCQQorCS8qCisJICogY2hlY2sgaWYgTlNBIGZyYW1lCisJICovCisJaWYgKG1fZmMobWIpID09IEZDX1NNVF9OU0EgJiYgc20tPnNtdF9jbGFzcyA9PSBTTVRfTklGICYmCisJCShzbS0+c210X3R5cGUgPT0gU01UX0FOTk9VTkNFIHx8IHNtLT5zbXRfdHlwZSA9PSBTTVRfUkVRVUVTVCkpIHsKKwkJCXNtYy0+c2JhLnNtID0gc20gOworCQkJc2JhKHNtYyxOSUYpIDsKKwl9CisjZW5kaWYKKworCS8qCisJICogaWdub3JlIGFueSBwYWNrZXQgd2l0aCBOU0EgYW5kIEEtaW5kaWNhdG9yIHNldAorCSAqLworCWlmICggKGZzICYgQV9JTkRJQ0FUT1IpICYmIG1fZmMobWIpID09IEZDX1NNVF9OU0EpIHsKKwkJREJfU01UKCJTTVQgOiBpZ25vcmluZyBOU0Egd2l0aCBBLWluZGljYXRvciBzZXQgZnJvbSAlc1xuIiwKKwkJCWFkZHJfdG9fc3RyaW5nKCZzbS0+c210X3NvdXJjZSksMCkgOworCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworCQlyZXR1cm4gOworCX0KKworCS8qCisJICogaWdub3JlIGZyYW1lcyB3aXRoIGlsbGVnYWwgbGVuZ3RoCisJICovCisJaWYgKCgoc20tPnNtdF9jbGFzcyA9PSBTTVRfRUNGKSAmJiAoc20tPnNtdF9sZW4gPiBTTVRfTUFYX0VDSE9fTEVOKSkgfHwKKwkgICAgKChzbS0+c210X2NsYXNzICE9IFNNVF9FQ0YpICYmIChzbS0+c210X2xlbiA+IFNNVF9NQVhfSU5GT19MRU4pKSkgeworCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworCQlyZXR1cm4gOworCX0KKworCS8qCisJICogY2hlY2sgU01UIHZlcnNpb24KKwkgKi8KKwlzd2l0Y2ggKHNtLT5zbXRfY2xhc3MpIHsKKwljYXNlIFNNVF9OSUYgOgorCWNhc2UgU01UX1NJRl9DT05GSUcgOgorCWNhc2UgU01UX1NJRl9PUEVSIDoKKwljYXNlIFNNVF9FQ0YgOgorCQlpZiAoc20tPnNtdF92ZXJzaW9uICE9IFNNVF9WSUQpCisJCQlpbGxlZ2FsID0gMTsKKwkJYnJlYWsgOworCWRlZmF1bHQgOgorCQlpZiAoc20tPnNtdF92ZXJzaW9uICE9IFNNVF9WSURfMikKKwkJCWlsbGVnYWwgPSAxOworCQlicmVhayA7CisJfQorCWlmIChpbGxlZ2FsKSB7CisJCURCX1NNVCgiU01UIDogdmVyc2lvbiA9ICVkLCBkZXN0ID0gJXNcbiIsCisJCQlzbS0+c210X3ZlcnNpb24sYWRkcl90b19zdHJpbmcoJnNtLT5zbXRfc291cmNlKSkgOworCQlzbXRfc2VuZF9yZGYoc21jLG1iLG1fZmMobWIpLFNNVF9SREZfVkVSU0lPTixsb2NhbCkgOworCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworCQlyZXR1cm4gOworCX0KKwlpZiAoKHNtLT5zbXRfbGVuID4gbWItPnNtX2xlbiAtIHNpemVvZihzdHJ1Y3Qgc210X2hlYWRlcikpIHx8CisJICAgICgoc20tPnNtdF9sZW4gJiAzKSAmJiAoc20tPnNtdF9jbGFzcyAhPSBTTVRfRUNGKSkpIHsKKwkJREJfU01UKCJTTVQ6IGluZm8gbGVuZ3RoIGVycm9yLCBsZW4gPSAlZFxuIixzbS0+c210X2xlbiwwKSA7CisJCXNtdF9zZW5kX3JkZihzbWMsbWIsbV9mYyhtYiksU01UX1JERl9MRU5HVEgsbG9jYWwpIDsKKwkJc210X2ZyZWVfbWJ1ZihzbWMsbWIpIDsKKwkJcmV0dXJuIDsKKwl9CisJc3dpdGNoIChzbS0+c210X2NsYXNzKSB7CisJY2FzZSBTTVRfTklGIDoKKwkJaWYgKHNtdF9jaGVja19wYXJhKHNtYyxzbSxwbGlzdF9uaWYpKSB7CisJCQlEQl9TTVQoIlNNVDogTklGIHdpdGggcGFyYSBwcm9ibGVtLCBpZ25vcmluZ1xuIiwwLDApIDsKKwkJCWJyZWFrIDsKKwkJfSA7CisJCXN3aXRjaCAoc20tPnNtdF90eXBlKSB7CisJCWNhc2UgU01UX0FOTk9VTkNFIDoKKwkJY2FzZSBTTVRfUkVRVUVTVCA6CisJCQlpZiAoIShmcyAmIENfSU5ESUNBVE9SKSAmJiBtX2ZjKG1iKSA9PSBGQ19TTVRfTlNBCisJCQkJJiYgaXNfYnJvYWRjYXN0KCZzbS0+c210X2Rlc3QpKSB7CisJCQkJc3RydWN0IHNtdF9wX3N0YXRlCSpzdCA7CisKKwkJCQkvKiBzZXQgbXkgVU5BICovCisJCQkJaWYgKCFpc19lcXVhbCgKKwkJCQkJJnNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1Vwc3RyZWFtTmJyLAorCQkJCQkmc20tPnNtdF9zb3VyY2UpKSB7CisJCQkJCURCX1NNVCgiU01UIDogdXBkYXRlZCBteSBVTkEgPSAlc1xuIiwKKwkJCQkJYWRkcl90b19zdHJpbmcoJnNtLT5zbXRfc291cmNlKSwwKSA7CisJCQkJCWlmICghaXNfZXF1YWwoJnNtYy0+bWliLm1bTUFDMF0uCisJCQkJCSAgICBmZGRpTUFDVXBzdHJlYW1OYnIsJlNNVF9Vbmtub3duKSl7CisJCQkJCSAvKiBEbyBub3QgdXBkYXRlIHVua25vd24gYWRkcmVzcyAqLworCQkJCQkgc21jLT5taWIubVtNQUMwXS5mZGRpTUFDT2xkVXBzdHJlYW1OYnI9CisJCQkJCSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVcHN0cmVhbU5iciA7CisJCQkJCX0KKworCQkJCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVcHN0cmVhbU5iciA9CisJCQkJCQlzbS0+c210X3NvdXJjZSA7CisJCQkJCXNtdF9zcmZfZXZlbnQoc21jLAorCQkJCQkJU01UX0VWRU5UX01BQ19ORUlHSEJPUl9DSEFOR0UsCisJCQkJCQlJTkRFWF9NQUMsMCkgOworCQkJCQlzbXRfZWNob190ZXN0KHNtYywwKSA7CisJCQkJfQorCQkJCXNtYy0+c20uc210X3R2dSA9IHNtdF9nZXRfdGltZSgpIDsKKwkJCQlzdCA9IChzdHJ1Y3Qgc210X3Bfc3RhdGUgKikKKwkJCQkJc21fdG9fcGFyYShzbWMsc20sU01UX1BfU1RBVEUpIDsKKwkJCQlpZiAoc3QpIHsKKwkJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVU5EQV9GbGFnID0KKwkJCQkJKHN0LT5zdF9kdXBsX2FkZHIgJiBTTVRfU1RfTVlfRFVQQSkgPworCQkJCQlUUlVFIDogRkFMU0UgOworCQkJCQl1cGRhdGVfZGFjKHNtYywxKSA7CisJCQkJfQorCQkJfQorCQkJaWYgKChzbS0+c210X3R5cGUgPT0gU01UX1JFUVVFU1QpICYmCisJCQkgICAgaXNfaW5kaXZpZHVhbCgmc20tPnNtdF9zb3VyY2UpICYmCisJCQkgICAgKCghKGZzICYgQV9JTkRJQ0FUT1IpICYmIG1fZmMobWIpID09IEZDX1NNVF9OU0EpIHx8CisJCQkgICAgIChtX2ZjKG1iKSAhPSBGQ19TTVRfTlNBKSkpIHsKKwkJCQlEQl9TTVQoIlNNVCA6IHJlcGx5aW5nIHRvIE5JRiByZXF1ZXN0ICVzXG4iLAorCQkJCQlhZGRyX3RvX3N0cmluZygmc20tPnNtdF9zb3VyY2UpLDApIDsKKwkJCQlzbXRfc2VuZF9uaWYoc21jLCZzbS0+c210X3NvdXJjZSwKKwkJCQkJRkNfU01UX0lORk8sCisJCQkJCXNtLT5zbXRfdGlkLAorCQkJCQlTTVRfUkVQTFksbG9jYWwpIDsKKwkJCX0KKwkJCWJyZWFrIDsKKwkJY2FzZSBTTVRfUkVQTFkgOgorCQkJREJfU01UKCJTTVQgOiByZWNlaXZlZCBOSUYgcmVzcG9uc2UgZnJvbSAlc1xuIiwKKwkJCQlhZGRyX3RvX3N0cmluZygmc20tPnNtdF9zb3VyY2UpLDApIDsKKwkJCWlmIChmcyAmIEFfSU5ESUNBVE9SKSB7CisJCQkJc21jLT5zbS5wZW5kW1NNVF9USURfTklGXSA9IDAgOworCQkJCURCX1NNVCgiU01UIDogZHVwbGljYXRlIGFkZHJlc3NcbiIsMCwwKSA7CisJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRHVwQWRkcmVzc1Rlc3QgPQorCQkJCQlEQV9GQUlMRUQgOworCQkJCXNtYy0+ci5kdXBfYWRkcl90ZXN0ID0gREFfRkFJTEVEIDsKKwkJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUk1ULFJNX0RVUF9BRERSKSA7CisJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDREFfRmxhZyA9IFRSVUUgOworCQkJCXVwZGF0ZV9kYWMoc21jLDEpIDsKKwkJCQlicmVhayA7CisJCQl9CisJCQlpZiAoc20tPnNtdF90aWQgPT0gc21jLT5zbS5wZW5kW1NNVF9USURfTklGXSkgeworCQkJCXNtYy0+c20ucGVuZFtTTVRfVElEX05JRl0gPSAwIDsKKwkJCQkvKiBzZXQgbXkgRE5BICovCisJCQkJaWYgKCFpc19lcXVhbCgKKwkJCQkJJnNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0Rvd25zdHJlYW1OYnIsCisJCQkJCSZzbS0+c210X3NvdXJjZSkpIHsKKwkJCQkJREJfU01UKCJTTVQgOiB1cGRhdGVkIG15IEROQVxuIiwwLDApIDsKKwkJCQkJaWYgKCFpc19lcXVhbCgmc21jLT5taWIubVtNQUMwXS4KKwkJCQkJIGZkZGlNQUNEb3duc3RyZWFtTmJyLCAmU01UX1Vua25vd24pKXsKKwkJCQkJIC8qIERvIG5vdCB1cGRhdGUgdW5rbm93biBhZGRyZXNzICovCisJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDT2xkRG93bnN0cmVhbU5iciA9CisJCQkJCSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNEb3duc3RyZWFtTmJyIDsKKwkJCQkJfQorCisJCQkJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0Rvd25zdHJlYW1OYnIgPQorCQkJCQkJc20tPnNtdF9zb3VyY2UgOworCQkJCQlzbXRfc3JmX2V2ZW50KHNtYywKKwkJCQkJCVNNVF9FVkVOVF9NQUNfTkVJR0hCT1JfQ0hBTkdFLAorCQkJCQkJSU5ERVhfTUFDLDApIDsKKwkJCQkJc210X2VjaG9fdGVzdChzbWMsMSkgOworCQkJCX0KKwkJCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNEQV9GbGFnID0gRkFMU0UgOworCQkJCXVwZGF0ZV9kYWMoc21jLDEpIDsKKwkJCQlzbWMtPnNtLnNtdF90dmQgPSBzbXRfZ2V0X3RpbWUoKSA7CisJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRHVwQWRkcmVzc1Rlc3QgPQorCQkJCQlEQV9QQVNTRUQgOworCQkJCWlmIChzbWMtPnIuZHVwX2FkZHJfdGVzdCAhPSBEQV9QQVNTRUQpIHsKKwkJCQkJc21jLT5yLmR1cF9hZGRyX3Rlc3QgPSBEQV9QQVNTRUQgOworCQkJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUk1ULFJNX0RVUF9BRERSKSA7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoc20tPnNtdF90aWQgPT0KKwkJCQlzbWMtPnNtLnBlbmRbU01UX1RJRF9OSUZfVEVTVF0pIHsKKwkJCQlEQl9TTVQoIlNNVCA6IE5JRiB0ZXN0IFRJRCBva1xuIiwwLDApIDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCURCX1NNVCgiU01UIDogZXhwZWN0ZWQgVElEICVseCwgZ290ICVseFxuIiwKKwkJCQlzbWMtPnNtLnBlbmRbU01UX1RJRF9OSUZdLHNtLT5zbXRfdGlkKSA7CisJCQl9CisJCQlicmVhayA7CisJCWRlZmF1bHQgOgorCQkJaWxsZWdhbCA9IDIgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIFNNVF9TSUZfQ09ORklHIDoJLyogc3RhdGlvbiBpbmZvcm1hdGlvbiAqLworCQlpZiAoc20tPnNtdF90eXBlICE9IFNNVF9SRVFVRVNUKQorCQkJYnJlYWsgOworCQlEQl9TTVQoIlNNVCA6IHJlcGx5aW5nIHRvIFNJRiBDb25maWcgcmVxdWVzdCBmcm9tICVzXG4iLAorCQkJYWRkcl90b19zdHJpbmcoJnNtLT5zbXRfc291cmNlKSwwKSA7CisJCXNtdF9zZW5kX3NpZl9jb25maWcoc21jLCZzbS0+c210X3NvdXJjZSxzbS0+c210X3RpZCxsb2NhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfU0lGX09QRVIgOgkvKiBzdGF0aW9uIGluZm9ybWF0aW9uICovCisJCWlmIChzbS0+c210X3R5cGUgIT0gU01UX1JFUVVFU1QpCisJCQlicmVhayA7CisJCURCX1NNVCgiU01UIDogcmVwbHlpbmcgdG8gU0lGIE9wZXJhdGlvbiByZXF1ZXN0IGZyb20gJXNcbiIsCisJCQlhZGRyX3RvX3N0cmluZygmc20tPnNtdF9zb3VyY2UpLDApIDsKKwkJc210X3NlbmRfc2lmX29wZXJhdGlvbihzbWMsJnNtLT5zbXRfc291cmNlLHNtLT5zbXRfdGlkLGxvY2FsKSA7CisJCWJyZWFrIDsKKwljYXNlIFNNVF9FQ0YgOgkJLyogZWNobyBmcmFtZSAqLworCQlzd2l0Y2ggKHNtLT5zbXRfdHlwZSkgeworCQljYXNlIFNNVF9SRVBMWSA6CisJCQlzbWMtPm1pYi5wcml2LmZkZGlQUklWRUNGX1JlcGx5X1J4KysgOworCQkJREJfU01UKCJTTVQ6IHJlY2VpdmVkIEVDRiByZXBseSBmcm9tICVzXG4iLAorCQkJCWFkZHJfdG9fc3RyaW5nKCZzbS0+c210X3NvdXJjZSksMCkgOworCQkJaWYgKHNtX3RvX3BhcmEoc21jLHNtLFNNVF9QX0VDSE9EQVRBKSA9PSAwKSB7CisJCQkJREJfU01UKCJTTVQ6IEVDSE9EQVRBIG1pc3NpbmdcbiIsMCwwKSA7CisJCQkJYnJlYWsgOworCQkJfQorCQkJaWYgKHNtLT5zbXRfdGlkID09IHNtYy0+c20ucGVuZFtTTVRfVElEX0VDRl0pIHsKKwkJCQlEQl9TTVQoIlNNVCA6IEVDRiB0ZXN0IFRJRCBva1xuIiwwLDApIDsKKwkJCX0KKwkJCWVsc2UgaWYgKHNtLT5zbXRfdGlkID09IHNtYy0+c20ucGVuZFtTTVRfVElEX0VDRl9VTkFdKSB7CisJCQkJREJfU01UKCJTTVQgOiBFQ0YgdGVzdCBVTkEgb2tcbiIsMCwwKSA7CisJCQl9CisJCQllbHNlIGlmIChzbS0+c210X3RpZCA9PSBzbWMtPnNtLnBlbmRbU01UX1RJRF9FQ0ZfRE5BXSkgeworCQkJCURCX1NNVCgiU01UIDogRUNGIHRlc3QgRE5BIG9rXG4iLDAsMCkgOworCQkJfQorCQkJZWxzZSB7CisJCQkJREJfU01UKCJTTVQgOiBleHBlY3RlZCBUSUQgJWx4LCBnb3QgJWx4XG4iLAorCQkJCQlzbWMtPnNtLnBlbmRbU01UX1RJRF9FQ0ZdLAorCQkJCQlzbS0+c210X3RpZCkgOworCQkJfQorCQkJYnJlYWsgOworCQljYXNlIFNNVF9SRVFVRVNUIDoKKwkJCXNtYy0+bWliLnByaXYuZmRkaVBSSVZFQ0ZfUmVxX1J4KysgOworCQkJeworCQkJaWYgKHNtLT5zbXRfbGVuICYmICFzbV90b19wYXJhKHNtYyxzbSxTTVRfUF9FQ0hPREFUQSkpIHsKKwkJCURCX1NNVCgiU01UOiBFQ0Ygd2l0aCBwYXJhIHByb2JsZW0sc2VuZGluZyBSREZcbiIsMCwwKSA7CisJCQkJc210X3NlbmRfcmRmKHNtYyxtYixtX2ZjKG1iKSxTTVRfUkRGX0xFTkdUSCwKKwkJCQkJbG9jYWwpIDsKKwkJCQlicmVhayA7CisJCQl9CisJCQlEQl9TTVQoIlNNVCAtIHNlbmRpbmcgRUNGIHJlcGx5IHRvICVzXG4iLAorCQkJCWFkZHJfdG9fc3RyaW5nKCZzbS0+c210X3NvdXJjZSksMCkgOworCisJCQkvKiBzZXQgZGVzdGluYXRpb24gYWRkci4gICYgcmVwbHkgKi8KKwkJCXNtLT5zbXRfZGVzdCA9IHNtLT5zbXRfc291cmNlIDsKKwkJCXNtLT5zbXRfdHlwZSA9IFNNVF9SRVBMWSA7CisJCQlkdW1wX3NtdChzbWMsc20sIkVDRiBSRVBMWSIpIDsKKwkJCXNtYy0+bWliLnByaXYuZmRkaVBSSVZFQ0ZfUmVwbHlfVHgrKyA7CisJCQlzbXRfc2VuZF9mcmFtZShzbWMsbWIsRkNfU01UX0lORk8sbG9jYWwpIDsKKwkJCXJldHVybiA7CQkvKiBET04nVCBmcmVlIG1idWYgKi8KKwkJCX0KKwkJZGVmYXVsdCA6CisJCQlpbGxlZ2FsID0gMSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworI2lmbmRlZglCT09UCisJY2FzZSBTTVRfUkFGIDoJCS8qIHJlc291cmNlIGFsbG9jYXRpb24gKi8KKyNpZmRlZglFU1MKKwkJREJfRVNTTigyLCJFU1M6IFJBRiBmcmFtZSByZWNlaXZlZFxuIiwwLDApIDsKKwkJZnMgPSBlc3NfcmFmX3JlY2VpdmVkX3BhY2soc21jLG1iLHNtLGZzKSA7CisjZW5kaWYKKworI2lmZGVmCVNCQQorCQlEQl9TQkFOKDIsIlNCQTogUkFGIGZyYW1lIHJlY2VpdmVkXG4iLDAsMCkgOworCQlzYmFfcmFmX3JlY2VpdmVkX3BhY2soc21jLHNtLGZzKSA7CisjZW5kaWYKKwkJYnJlYWsgOworCWNhc2UgU01UX1JERiA6CQkvKiByZXF1ZXN0IGRlbmllZCAqLworCQlzbWMtPm1pYi5wcml2LmZkZGlQUklWUkRGX1J4KysgOworCQlicmVhayA7CisJY2FzZSBTTVRfRVNGIDoJCS8qIGV4dGVuZGVkIHNlcnZpY2UgLSBub3Qgc3VwcG9ydGVkICovCisJCWlmIChzbS0+c210X3R5cGUgPT0gU01UX1JFUVVFU1QpIHsKKwkJCURCX1NNVCgiU01UIC0gcmVjZWl2ZWQgRVNGLCBzZW5kaW5nIFJERlxuIiwwLDApIDsKKwkJCXNtdF9zZW5kX3JkZihzbWMsbWIsbV9mYyhtYiksU01UX1JERl9DTEFTUyxsb2NhbCkgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIFNNVF9QTUZfR0VUIDoKKwljYXNlIFNNVF9QTUZfU0VUIDoKKwkJaWYgKHNtLT5zbXRfdHlwZSAhPSBTTVRfUkVRVUVTVCkKKwkJCWJyZWFrIDsKKwkJLyogdXBkYXRlIHN0YXRpc3RpY3MgKi8KKwkJaWYgKHNtLT5zbXRfY2xhc3MgPT0gU01UX1BNRl9HRVQpCisJCQlzbWMtPm1pYi5wcml2LmZkZGlQUklWUE1GX0dldF9SeCsrIDsKKwkJZWxzZQorCQkJc21jLT5taWIucHJpdi5mZGRpUFJJVlBNRl9TZXRfUngrKyA7CisJCS8qCisJCSAqIGlnbm9yZSBQTUYgU0VUIHdpdGggSS9HIHNldAorCQkgKi8KKwkJaWYgKChzbS0+c210X2NsYXNzID09IFNNVF9QTUZfU0VUKSAmJgorCQkJIWlzX2luZGl2aWR1YWwoJnNtLT5zbXRfZGVzdCkpIHsKKwkJCURCX1NNVCgiU01UOiBpZ25vcmluZyBQTUYtU0VUIHdpdGggSS9HIHNldFxuIiwwLDApIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlzbXRfcG1mX3JlY2VpdmVkX3BhY2soc21jLG1iLCBsb2NhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfU1JGIDoKKwkJZHVtcF9zbXQoc21jLHNtLCJTUkYgcmVjZWl2ZWQiKSA7CisJCWJyZWFrIDsKKwlkZWZhdWx0IDoKKwkJaWYgKHNtLT5zbXRfdHlwZSAhPSBTTVRfUkVRVUVTVCkKKwkJCWJyZWFrIDsKKwkJLyoKKwkJICogRm9yIGZyYW1lcyB3aXRoIHVua25vd24gY2xhc3M6CisJCSAqIHdlIG5lZWQgdG8gc2VuZCBhIFJERiBmcmFtZSBhY2NvcmRpbmcgdG8gOC4xLjMuMS4xLAorCQkgKiBvbmx5IGlmIGl0IGlzIGEgUkVRVUVTVC4KKwkJICovCisJCURCX1NNVCgiU01UIDogY2xhc3MgPSAlZCwgc2VuZCBSREYgdG8gJXNcbiIsCisJCQlzbS0+c210X2NsYXNzLCBhZGRyX3RvX3N0cmluZygmc20tPnNtdF9zb3VyY2UpKSA7CisKKwkJc210X3NlbmRfcmRmKHNtYyxtYixtX2ZjKG1iKSxTTVRfUkRGX0NMQVNTLGxvY2FsKSA7CisJCWJyZWFrIDsKKyNlbmRpZgorCX0KKwlpZiAoaWxsZWdhbCkgeworCQlEQl9TTVQoIlNNVDogZGlzY2FyZGluZyBpbnZhbGlkIGZyYW1lLCByZWFzb24gPSAlZFxuIiwKKwkJCWlsbGVnYWwsMCkgOworCX0KKwlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfZGFjKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcmVwb3J0KQoreworCWludAljb25kIDsKKworCWNvbmQgPSAoIHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1VOREFfRmxhZyB8CisJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0RBX0ZsYWcpICE9IDAgOworCWlmIChyZXBvcnQgJiYgKGNvbmQgIT0gc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRHVwbGljYXRlQWRkcmVzc0NvbmQpKQorCQlzbXRfc3JmX2V2ZW50KHNtYywgU01UX0NPTkRfTUFDX0RVUF9BRERSLElOREVYX01BQyxjb25kKSA7CisJZWxzZQorCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNEdXBsaWNhdGVBZGRyZXNzQ29uZCA9IGNvbmQgOworfQorCisvKgorICogc2VuZCBTTVQgZnJhbWUKKyAqCXNldCBzb3VyY2UgYWRkcmVzcworICoJc2V0IHN0YXRpb24gSUQKKyAqCXNlbmQgZnJhbWUKKyAqLwordm9pZCBzbXRfc2VuZF9mcmFtZShzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iLCBpbnQgZmMsIGludCBsb2NhbCkKKy8qIFNNYnVmICptYjsJYnVmZmVyIHRvIHNlbmQgKi8KKy8qIGludCBmYzsJRkMgdmFsdWUgKi8KK3sKKwlzdHJ1Y3Qgc210X2hlYWRlcgkqc20gOworCisJaWYgKCFzbWMtPnIuc21fbWFfYXZhaWwgJiYgIWxvY2FsKSB7CisJCXNtdF9mcmVlX21idWYoc21jLG1iKSA7CisJCXJldHVybiA7CisJfQorCXNtID0gc210b2QobWIsc3RydWN0IHNtdF9oZWFkZXIgKikgOworCXNtLT5zbXRfc291cmNlID0gc21jLT5taWIubVtNQUMwXS5mZGRpTUFDU01UQWRkcmVzcyA7CisJc20tPnNtdF9zaWQgPSBzbWMtPm1pYi5mZGRpU01UU3RhdGlvbklkIDsKKworCXNtdF9zd2FwX3BhcmEoc20sKGludCkgbWItPnNtX2xlbiwwKSA7CQkvKiBzd2FwIHBhcmEgJiBoZWFkZXIgKi8KKwlod21fY29udl9jYW4oc21jLChjaGFyICopc20sMTIpIDsJCS8qIGNvbnZlcnQgU0EgYW5kIERBICovCisJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDU01UVHJhbnNtaXRfQ3QrKyA7CisJc210X3NlbmRfbWJ1ZihzbWMsbWIsbG9jYWwgPyBGQ19TTVRfTE9DIDogZmMpIDsKK30KKworLyoKKyAqIGdlbmVyYXRlIGFuZCBzZW5kIFJERgorICovCitzdGF0aWMgdm9pZCBzbXRfc2VuZF9yZGYoc3RydWN0IHNfc21jICpzbWMsIFNNYnVmICpyZWosIGludCBmYywgaW50IHJlYXNvbiwKKwkJCSBpbnQgbG9jYWwpCisvKiBTTWJ1ZiAqcmVqOwltYnVmIG9mIG9mZmVuZGluZyBmcmFtZSAqLworLyogaW50IGZjOwlGQyBvZiBkZW5pZWQgZnJhbWUgKi8KKy8qIGludCByZWFzb247CXJlYXNvbiBjb2RlICovCit7CisJU01idWYJKm1iIDsKKwlzdHJ1Y3Qgc210X2hlYWRlcgkqc20gOwkvKiBoZWFkZXIgb2Ygb2ZmZW5kaW5nIGZyYW1lICovCisJc3RydWN0IHNtdF9yZGYJKnJkZiA7CisJaW50CQlsZW4gOworCWludAkJZnJhbWVfbGVuIDsKKworCXNtID0gc210b2QocmVqLHN0cnVjdCBzbXRfaGVhZGVyICopIDsKKwlpZiAoc20tPnNtdF90eXBlICE9IFNNVF9SRVFVRVNUKQorCQlyZXR1cm4gOworCisJREJfU01UKCJTTVQ6IHNlbmRpbmcgUkRGIHRvICVzLHJlYXNvbiA9IDB4JXhcbiIsCisJCWFkZHJfdG9fc3RyaW5nKCZzbS0+c210X3NvdXJjZSkscmVhc29uKSA7CisKKworCS8qCisJICogbm90ZTogZ2V0IGZyYW1lbGVuZ3RoIGZyb20gTUFDIGxlbmd0aCwgTk9UIGZyb20gU01UIGhlYWRlcgorCSAqIHNtdCBoZWFkZXIgbGVuZ3RoIGlzIGluY2x1ZGVkIGluIHNtX2xlbgorCSAqLworCWZyYW1lX2xlbiA9IHJlai0+c21fbGVuIDsKKworCWlmICghKG1iPXNtdF9idWlsZF9mcmFtZShzbWMsU01UX1JERixTTVRfUkVQTFksc2l6ZW9mKHN0cnVjdCBzbXRfcmRmKSkpKQorCQlyZXR1cm4gOworCXJkZiA9IHNtdG9kKG1iLHN0cnVjdCBzbXRfcmRmICopIDsKKwlyZGYtPnNtdC5zbXRfdGlkID0gc20tPnNtdF90aWQgOwkJLyogdXNlIFRJRCBmcm9tIHNtICovCisJcmRmLT5zbXQuc210X2Rlc3QgPSBzbS0+c210X3NvdXJjZSA7CQkvKiBzZXQgZGVzdCA9IHNvdXJjZSAqLworCisJLyogc2V0IFAxMiAqLworCXJkZi0+cmVhc29uLnBhcmEucF90eXBlID0gU01UX1BfUkVBU09OIDsKKwlyZGYtPnJlYXNvbi5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF9yZWFzb24pIC0gUEFSQV9MRU4gOworCXJkZi0+cmVhc29uLnJkZl9yZWFzb24gPSByZWFzb24gOworCisJLyogc2V0IFAxNCAqLworCXJkZi0+dmVyc2lvbi5wYXJhLnBfdHlwZSA9IFNNVF9QX1ZFUlNJT04gOworCXJkZi0+dmVyc2lvbi5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF92ZXJzaW9uKSAtIFBBUkFfTEVOIDsKKwlyZGYtPnZlcnNpb24udl9wYWQgPSAwIDsKKwlyZGYtPnZlcnNpb24udl9uID0gMSA7CisJcmRmLT52ZXJzaW9uLnZfaW5kZXggPSAxIDsKKwlyZGYtPnZlcnNpb24udl92ZXJzaW9uWzBdID0gU01UX1ZJRF8yIDsKKwlyZGYtPnZlcnNpb24udl9wYWQyID0gMCA7CisKKwkvKiBzZXQgUDEzICovCisJaWYgKCh1bnNpZ25lZCkgZnJhbWVfbGVuIDw9IFNNVF9NQVhfSU5GT19MRU4gLSBzaXplb2YoKnJkZikgKworCQkyKnNpemVvZihzdHJ1Y3Qgc210X2hlYWRlcikpCisJCWxlbiA9IGZyYW1lX2xlbiA7CisJZWxzZQorCQlsZW4gPSBTTVRfTUFYX0lORk9fTEVOIC0gc2l6ZW9mKCpyZGYpICsKKwkJCTIqc2l6ZW9mKHN0cnVjdCBzbXRfaGVhZGVyKSA7CisJLyogbWFrZSBsZW5ndGggbXVsdGlwbGUgb2YgNCAqLworCWxlbiAmPSB+MyA7CisJcmRmLT5yZWZ1c2VkLnBhcmEucF90eXBlID0gU01UX1BfUkVGVVNFRCA7CisJLyogbGVuZ3RoIG9mIHBhcmEgaXMgc210X2ZyYW1lICsgcmVmX2ZjICovCisJcmRmLT5yZWZ1c2VkLnBhcmEucF9sZW4gPSBsZW4gKyA0IDsKKwlyZGYtPnJlZnVzZWQucmVmX2ZjID0gZmMgOworCisJLyogc3dhcCBpdCBiYWNrICovCisJc210X3N3YXBfcGFyYShzbSxmcmFtZV9sZW4sMCkgOworCisJbWVtY3B5KChjaGFyICopICZyZGYtPnJlZnVzZWQucmVmX2hlYWRlciwoY2hhciAqKSBzbSxsZW4pIDsKKworCWxlbiAtPSBzaXplb2Yoc3RydWN0IHNtdF9oZWFkZXIpIDsKKwltYi0+c21fbGVuICs9IGxlbiA7CisJcmRmLT5zbXQuc210X2xlbiArPSBsZW4gOworCisJZHVtcF9zbXQoc21jLChzdHJ1Y3Qgc210X2hlYWRlciAqKXJkZiwiUkRGIikgOworCXNtYy0+bWliLnByaXYuZmRkaVBSSVZSREZfVHgrKyA7CisJc210X3NlbmRfZnJhbWUoc21jLG1iLEZDX1NNVF9JTkZPLGxvY2FsKSA7Cit9CisKKy8qCisgKiBnZW5lcmF0ZSBhbmQgc2VuZCBOSUYKKyAqLworc3RhdGljIHZvaWQgc210X3NlbmRfbmlmKHN0cnVjdCBzX3NtYyAqc21jLCBjb25zdCBzdHJ1Y3QgZmRkaV9hZGRyICpkZXN0LCAKKwkJCSBpbnQgZmMsIHVfbG9uZyB0aWQsIGludCB0eXBlLCBpbnQgbG9jYWwpCisvKiBzdHJ1Y3QgZmRkaV9hZGRyICpkZXN0OwlkZXN0IGFkZHJlc3MgKi8KKy8qIGludCBmYzsJCQlmcmFtZSBjb250cm9sICovCisvKiB1X2xvbmcgdGlkOwkJCXRyYW5zYWN0aW9uIGlkICovCisvKiBpbnQgdHlwZTsJCQlmcmFtZSB0eXBlICovCit7CisJc3RydWN0IHNtdF9uaWYJKm5pZiA7CisJU01idWYJCSptYiA7CisKKwlpZiAoIShtYiA9IHNtdF9idWlsZF9mcmFtZShzbWMsU01UX05JRix0eXBlLHNpemVvZihzdHJ1Y3Qgc210X25pZikpKSkKKwkJcmV0dXJuIDsKKwluaWYgPSBzbXRvZChtYiwgc3RydWN0IHNtdF9uaWYgKikgOworCXNtdF9maWxsX3VuYShzbWMsJm5pZi0+dW5hKSA7CS8qIHNldCBVTkEgKi8KKwlzbXRfZmlsbF9zZGUoc21jLCZuaWYtPnNkZSkgOwkvKiBzZXQgc3RhdGlvbiBkZXNjcmlwdG9yICovCisJc210X2ZpbGxfc3RhdGUoc21jLCZuaWYtPnN0YXRlKSA7CS8qIHNldCBzdGF0ZSBpbmZvcm1hdGlvbiAqLworI2lmZGVmCVNNVDZfMTAKKwlzbXRfZmlsbF9mc2Moc21jLCZuaWYtPmZzYykgOwkvKiBzZXQgZnJhbWUgc3RhdHVzIGNhcC4gKi8KKyNlbmRpZgorCW5pZi0+c210LnNtdF9kZXN0ID0gKmRlc3QgOwkvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJbmlmLT5zbXQuc210X3RpZCA9IHRpZCA7CS8qIHRyYW5zYWN0aW9uIElEICovCisJZHVtcF9zbXQoc21jLChzdHJ1Y3Qgc210X2hlYWRlciAqKW5pZiwiTklGIikgOworCXNtdF9zZW5kX2ZyYW1lKHNtYyxtYixmYyxsb2NhbCkgOworfQorCisjaWZkZWYJREVCVUcKKy8qCisgKiBzZW5kIE5JRiByZXF1ZXN0ICh0ZXN0IHB1cnBvc2UpCisgKi8KK3N0YXRpYyB2b2lkIHNtdF9zZW5kX25pZl9yZXF1ZXN0KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3QgZmRkaV9hZGRyICpkZXN0KQoreworCXNtYy0+c20ucGVuZFtTTVRfVElEX05JRl9URVNUXSA9IHNtdF9nZXRfdGlkKHNtYykgOworCXNtdF9zZW5kX25pZihzbWMsZGVzdCwgRkNfU01UX0lORk8sIHNtYy0+c20ucGVuZFtTTVRfVElEX05JRl9URVNUXSwKKwkJU01UX1JFUVVFU1QsMCkgOworfQorCisvKgorICogc2VuZCBFQ0YgcmVxdWVzdCAodGVzdCBwdXJwb3NlKQorICovCitzdGF0aWMgdm9pZCBzbXRfc2VuZF9lY2ZfcmVxdWVzdChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqZGVzdCwKKwkJCQkgaW50IGxlbikKK3sKKwlzbWMtPnNtLnBlbmRbU01UX1RJRF9FQ0ZdID0gc210X2dldF90aWQoc21jKSA7CisJc210X3NlbmRfZWNmKHNtYyxkZXN0LCBGQ19TTVRfSU5GTywgc21jLT5zbS5wZW5kW1NNVF9USURfRUNGXSwKKwkJU01UX1JFUVVFU1QsbGVuKSA7Cit9CisjZW5kaWYKKworLyoKKyAqIGVjaG8gdGVzdAorICovCitzdGF0aWMgdm9pZCBzbXRfZWNob190ZXN0KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZG5hKQoreworCXVfbG9uZwl0aWQgOworCisJc21jLT5zbS5wZW5kW2RuYSA/IFNNVF9USURfRUNGX0ROQSA6IFNNVF9USURfRUNGX1VOQV0gPQorCQl0aWQgPSBzbXRfZ2V0X3RpZChzbWMpIDsKKwlzbXRfc2VuZF9lY2Yoc21jLCBkbmEgPworCQkmc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRG93bnN0cmVhbU5iciA6CisJCSZzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVcHN0cmVhbU5iciwKKwkJRkNfU01UX0lORk8sdGlkLCBTTVRfUkVRVUVTVCwgKFNNVF9URVNUX0VDSE9fTEVOICYgfjMpLTgpIDsKK30KKworLyoKKyAqIGdlbmVyYXRlIGFuZCBzZW5kIEVDRgorICovCitzdGF0aWMgdm9pZCBzbXRfc2VuZF9lY2Yoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBmZGRpX2FkZHIgKmRlc3QsIGludCBmYywKKwkJCSB1X2xvbmcgdGlkLCBpbnQgdHlwZSwgaW50IGxlbikKKy8qIHN0cnVjdCBmZGRpX2FkZHIgKmRlc3Q7CWRlc3QgYWRkcmVzcyAqLworLyogaW50IGZjOwkJCWZyYW1lIGNvbnRyb2wgKi8KKy8qIHVfbG9uZyB0aWQ7CQkJdHJhbnNhY3Rpb24gaWQgKi8KKy8qIGludCB0eXBlOwkJCWZyYW1lIHR5cGUgKi8KKy8qIGludCBsZW47CQkJZnJhbWUgbGVuZ3RoICovCit7CisJc3RydWN0IHNtdF9lY2YJKmVjZiA7CisJU01idWYJCSptYiA7CisKKwlpZiAoIShtYiA9IHNtdF9idWlsZF9mcmFtZShzbWMsU01UX0VDRix0eXBlLFNNVF9FQ0ZfTEVOICsgbGVuKSkpCisJCXJldHVybiA7CisJZWNmID0gc210b2QobWIsIHN0cnVjdCBzbXRfZWNmICopIDsKKworCXNtdF9maWxsX2VjaG8oc21jLCZlY2YtPmVjX2VjaG8sdGlkLGxlbikgOwkvKiBzZXQgRUNITyAqLworCWVjZi0+c210LnNtdF9kZXN0ID0gKmRlc3QgOwkvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJZWNmLT5zbXQuc210X3RpZCA9IHRpZCA7CS8qIHRyYW5zYWN0aW9uIElEICovCisJc21jLT5taWIucHJpdi5mZGRpUFJJVkVDRl9SZXFfVHgrKyA7CisJc210X3NlbmRfZnJhbWUoc21jLG1iLGZjLDApIDsKK30KKworLyoKKyAqIGdlbmVyYXRlIGFuZCBzZW5kIFNJRiBjb25maWcgcmVzcG9uc2UKKyAqLworCitzdGF0aWMgdm9pZCBzbXRfc2VuZF9zaWZfY29uZmlnKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3QgZmRkaV9hZGRyICpkZXN0LAorCQkJCXVfbG9uZyB0aWQsIGludCBsb2NhbCkKKy8qIHN0cnVjdCBmZGRpX2FkZHIgKmRlc3Q7CWRlc3QgYWRkcmVzcyAqLworLyogdV9sb25nIHRpZDsJCQl0cmFuc2FjdGlvbiBpZCAqLworeworCXN0cnVjdCBzbXRfc2lmX2NvbmZpZwkqc2lmIDsKKwlTTWJ1ZgkJCSptYiA7CisJaW50CQkJbGVuIDsKKwlpZiAoIShtYiA9IHNtdF9idWlsZF9mcmFtZShzbWMsU01UX1NJRl9DT05GSUcsU01UX1JFUExZLAorCQlTSVpFT0ZfU01UX1NJRl9DT05GSUcpKSkKKwkJcmV0dXJuIDsKKworCXNpZiA9IHNtdG9kKG1iLCBzdHJ1Y3Qgc210X3NpZl9jb25maWcgKikgOworCXNtdF9maWxsX3RpbWVzdGFtcChzbWMsJnNpZi0+dHMpIDsJLyogc2V0IHRpbWUgc3RhbXAgKi8KKwlzbXRfZmlsbF9zZGUoc21jLCZzaWYtPnNkZSkgOwkJLyogc2V0IHN0YXRpb24gZGVzY3JpcHRvciAqLworCXNtdF9maWxsX3ZlcnNpb24oc21jLCZzaWYtPnZlcnNpb24pIDsJLyogc2V0IHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKwlzbXRfZmlsbF9zdGF0ZShzbWMsJnNpZi0+c3RhdGUpIDsJLyogc2V0IHN0YXRlIGluZm9ybWF0aW9uICovCisJc210X2ZpbGxfcG9saWN5KHNtYywmc2lmLT5wb2xpY3kpIDsJLyogc2V0IHN0YXRpb24gcG9saWN5ICovCisJc210X2ZpbGxfbGF0ZW5jeShzbWMsJnNpZi0+bGF0ZW5jeSk7CS8qIHNldCBzdGF0aW9uIGxhdGVuY3kgKi8KKwlzbXRfZmlsbF9uZWlnaGJvcihzbWMsJnNpZi0+bmVpZ2hib3IpOwkvKiBzZXQgc3RhdGlvbiBuZWlnaGJvciAqLworCXNtdF9maWxsX3NldGNvdW50KHNtYywmc2lmLT5zZXRjb3VudCkgOwkvKiBzZXQgY291bnQgKi8KKwlsZW4gPSBzbXRfZmlsbF9wYXRoKHNtYywmc2lmLT5wYXRoKTsJLyogc2V0IHN0YXRpb24gcGF0aCBkZXNjcmlwdG9yKi8KKwlzaWYtPnNtdC5zbXRfZGVzdCA9ICpkZXN0IDsJCS8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlzaWYtPnNtdC5zbXRfdGlkID0gdGlkIDsJCS8qIHRyYW5zYWN0aW9uIElEICovCisJc210X2FkZF9mcmFtZV9sZW4obWIsbGVuKSA7CQkvKiBhZGp1c3QgbGVuZ3RoIGZpZWxkcyAqLworCWR1bXBfc210KHNtYywoc3RydWN0IHNtdF9oZWFkZXIgKilzaWYsIlNJRiBDb25maWd1cmF0aW9uIFJlcGx5IikgOworCXNtdF9zZW5kX2ZyYW1lKHNtYyxtYixGQ19TTVRfSU5GTyxsb2NhbCkgOworfQorCisvKgorICogZ2VuZXJhdGUgYW5kIHNlbmQgU0lGIG9wZXJhdGlvbiByZXNwb25zZQorICovCisKK3N0YXRpYyB2b2lkIHNtdF9zZW5kX3NpZl9vcGVyYXRpb24oc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBmZGRpX2FkZHIgKmRlc3QsCisJCQkJICAgdV9sb25nIHRpZCwgaW50IGxvY2FsKQorLyogc3RydWN0IGZkZGlfYWRkciAqZGVzdDsJZGVzdCBhZGRyZXNzICovCisvKiB1X2xvbmcgdGlkOwkJCXRyYW5zYWN0aW9uIGlkICovCit7CisJc3RydWN0IHNtdF9zaWZfb3BlcmF0aW9uICpzaWYgOworCVNNYnVmCQkJKm1iIDsKKwlpbnQJCQlwb3J0cyA7CisJaW50CQkJaSA7CisKKwlwb3J0cyA9IE5VTVBIWVMgOworI2lmbmRlZglDT05DRU5UUkFUT1IKKwlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKQorCQlwb3J0cyA9IDEgOworI2VuZGlmCisKKwlpZiAoIShtYiA9IHNtdF9idWlsZF9mcmFtZShzbWMsU01UX1NJRl9PUEVSLFNNVF9SRVBMWSwKKwkJU0laRU9GX1NNVF9TSUZfT1BFUkFUSU9OK3BvcnRzKnNpemVvZihzdHJ1Y3Qgc210X3BfbGVtKSkpKQorCQlyZXR1cm4gOworCXNpZiA9IHNtdG9kKG1iLCBzdHJ1Y3Qgc210X3NpZl9vcGVyYXRpb24gKikgOworCXNtdF9maWxsX3RpbWVzdGFtcChzbWMsJnNpZi0+dHMpIDsJLyogc2V0IHRpbWUgc3RhbXAgKi8KKwlzbXRfZmlsbF9tYWNfc3RhdHVzKHNtYywmc2lmLT5zdGF0dXMpIDsgLyogc2V0IG1hYyBzdGF0dXMgKi8KKwlzbXRfZmlsbF9tYWNfY291bnRlcihzbWMsJnNpZi0+bWMpIDsgLyogc2V0IG1hYyBjb3VudGVyIGZpZWxkICovCisJc210X2ZpbGxfbWFjX2ZuYyhzbWMsJnNpZi0+Zm5jKSA7IC8qIHNldCBmcmFtZSBub3QgY29waWVkIGNvdW50ZXIgKi8KKwlzbXRfZmlsbF9tYW51ZmFjdHVyZXIoc21jLCZzaWYtPm1hbikgOyAvKiBzZXQgbWFudWZhY3R1cmVyIGZpZWxkICovCisJc210X2ZpbGxfdXNlcihzbWMsJnNpZi0+dXNlcikgOwkJLyogc2V0IHVzZXIgZmllbGQgKi8KKwlzbXRfZmlsbF9zZXRjb3VudChzbWMsJnNpZi0+c2V0Y291bnQpIDsJLyogc2V0IGNvdW50ICovCisJLyoKKwkgKiBzZXQgbGluayBlcnJvciBtb24gaW5mb3JtYXRpb24KKwkgKi8KKwlpZiAocG9ydHMgPT0gMSkgeworCQlzbXRfZmlsbF9sZW0oc21jLHNpZi0+bGVtLFBTKSA7CisJfQorCWVsc2UgeworCQlmb3IgKGkgPSAwIDsgaSA8IHBvcnRzIDsgaSsrKSB7CisJCQlzbXRfZmlsbF9sZW0oc21jLCZzaWYtPmxlbVtpXSxpKSA7CisJCX0KKwl9CisKKwlzaWYtPnNtdC5zbXRfZGVzdCA9ICpkZXN0IDsJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCXNpZi0+c210LnNtdF90aWQgPSB0aWQgOwkvKiB0cmFuc2FjdGlvbiBJRCAqLworCWR1bXBfc210KHNtYywoc3RydWN0IHNtdF9oZWFkZXIgKilzaWYsIlNJRiBPcGVyYXRpb24gUmVwbHkiKSA7CisJc210X3NlbmRfZnJhbWUoc21jLG1iLEZDX1NNVF9JTkZPLGxvY2FsKSA7Cit9CisKKy8qCisgKiBnZXQgYW5kIGluaXRpYWxpemUgU01UIGZyYW1lCisgKi8KK1NNYnVmICpzbXRfYnVpbGRfZnJhbWUoc3RydWN0IHNfc21jICpzbWMsIGludCBjbGFzcywgaW50IHR5cGUsCisJCQkJICBpbnQgbGVuZ3RoKQoreworCVNNYnVmCQkJKm1iIDsKKwlzdHJ1Y3Qgc210X2hlYWRlcgkqc210IDsKKworI2lmCTAKKwlpZiAoIXNtYy0+ci5zbV9tYV9hdmFpbCkgeworCQlyZXR1cm4oMCkgOworCX0KKyNlbmRpZgorCWlmICghKG1iID0gc210X2dldF9tYnVmKHNtYykpKQorCQlyZXR1cm4obWIpIDsKKworCW1iLT5zbV9sZW4gPSBsZW5ndGggOworCXNtdCA9IHNtdG9kKG1iLCBzdHJ1Y3Qgc210X2hlYWRlciAqKSA7CisJc210LT5zbXRfZGVzdCA9IGZkZGlfYnJvYWRjYXN0IDsgLyogc2V0IGRlc3QgPSBicm9hZGNhc3QgKi8KKwlzbXQtPnNtdF9jbGFzcyA9IGNsYXNzIDsKKwlzbXQtPnNtdF90eXBlID0gdHlwZSA7CisJc3dpdGNoIChjbGFzcykgeworCWNhc2UgU01UX05JRiA6CisJY2FzZSBTTVRfU0lGX0NPTkZJRyA6CisJY2FzZSBTTVRfU0lGX09QRVIgOgorCWNhc2UgU01UX0VDRiA6CisJCXNtdC0+c210X3ZlcnNpb24gPSBTTVRfVklEIDsKKwkJYnJlYWsgOworCWRlZmF1bHQgOgorCQlzbXQtPnNtdF92ZXJzaW9uID0gU01UX1ZJRF8yIDsKKwkJYnJlYWsgOworCX0KKwlzbXQtPnNtdF90aWQgPSBzbXRfZ2V0X3RpZChzbWMpIDsJLyogc2V0IHRyYW5zYWN0aW9uIElEICovCisJc210LT5zbXRfcGFkID0gMCA7CisJc210LT5zbXRfbGVuID0gbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBzbXRfaGVhZGVyKSA7CisJcmV0dXJuKG1iKSA7Cit9CisKK3N0YXRpYyB2b2lkIHNtdF9hZGRfZnJhbWVfbGVuKFNNYnVmICptYiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc210X2hlYWRlcgkqc210IDsKKworCXNtdCA9IHNtdG9kKG1iLCBzdHJ1Y3Qgc210X2hlYWRlciAqKSA7CisJc210LT5zbXRfbGVuICs9IGxlbiA7CisJbWItPnNtX2xlbiArPSBsZW4gOworfQorCisKKworLyoKKyAqIGZpbGwgdmFsdWVzIGluIFVOQSBwYXJhbWV0ZXIKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfdW5hKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfdW5hICp1bmEpCit7CisJU01UU0VUUEFSQSh1bmEsU01UX1BfVU5BKSA7CisJdW5hLT51bmFfcGFkID0gMCA7CisJdW5hLT51bmFfbm9kZSA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1Vwc3RyZWFtTmJyIDsKK30KKworLyoKKyAqIGZpbGwgdmFsdWVzIGluIFNERSBwYXJhbWV0ZXIKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfc2RlKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3Bfc2RlICpzZGUpCit7CisJU01UU0VUUEFSQShzZGUsU01UX1BfU0RFKSA7CisJc2RlLT5zZGVfbm9uX21hc3RlciA9IHNtYy0+bWliLmZkZGlTTVROb25NYXN0ZXJfQ3QgOworCXNkZS0+c2RlX21hc3RlciA9IHNtYy0+bWliLmZkZGlTTVRNYXN0ZXJfQ3QgOworCXNkZS0+c2RlX21hY19jb3VudCA9IE5VTU1BQ1MgOwkJLyogb25seSAxIE1BQyAqLworI2lmZGVmCUNPTkNFTlRSQVRPUgorCXNkZS0+c2RlX3R5cGUgPSBTTVRfU0RFX0NPTkNFTlRSQVRPUiA7CisjZWxzZQorCXNkZS0+c2RlX3R5cGUgPSBTTVRfU0RFX1NUQVRJT04gOworI2VuZGlmCit9CisKKy8qCisgKiBmaWxsIGluIHZhbHVlcyBpbiBzdGF0aW9uIHN0YXRlIHBhcmFtZXRlcgorICovCitzdGF0aWMgdm9pZCBzbXRfZmlsbF9zdGF0ZShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQJdG9wIDsKKwlpbnQJdHdpc3QgOworCisJU01UU0VUUEFSQShzdGF0ZSxTTVRfUF9TVEFURSkgOworCXN0YXRlLT5zdF9wYWQgPSAwIDsKKworCS8qIGRldGVybWluZSB0b3BvbG9neSAqLworCXRvcCA9IDAgOworCWlmIChzbWMtPm1pYi5mZGRpU01UUGVlcldyYXBGbGFnKSB7CisJCXRvcCB8PSBTTVRfU1RfV1JBUFBFRCA7CQkvKiBzdGF0ZSB3cmFwcGVkICovCisJfQorI2lmZGVmCUNPTkNFTlRSQVRPUgorCWlmIChjZm1fc3RhdHVzX3VuYXR0YWNoZWQoc21jKSkgeworCQl0b3AgfD0gU01UX1NUX1VOQVRUQUNIRUQgOwkvKiB1bmF0dGFjaGVkIGNvbmNlbnRyYXRvciAqLworCX0KKyNlbmRpZgorCWlmICgodHdpc3QgPSBwY21fc3RhdHVzX3R3aXN0ZWQoc21jKSkgJiAxKSB7CisJCXRvcCB8PSBTTVRfU1RfVFdJU1RFRF9BIDsJLyogdHdpc3RlZCBjYWJsZSAqLworCX0KKwlpZiAodHdpc3QgJiAyKSB7CisJCXRvcCB8PSBTTVRfU1RfVFdJU1RFRF9CIDsJLyogdHdpc3RlZCBjYWJsZSAqLworCX0KKyNpZmRlZglPUFRfU1JGCisJdG9wIHw9IFNNVF9TVF9TUkYgOworI2VuZGlmCisJaWYgKHBjbV9yb290ZWRfc3RhdGlvbihzbWMpKQorCQl0b3AgfD0gU01UX1NUX1JPT1RFRF9TIDsKKwlpZiAoc21jLT5taWIuYVswXS5mZGRpUEFUSFNiYVBheWxvYWQgIT0gMCkKKwkJdG9wIHw9IFNNVF9TVF9TWU5DX1NFUlZJQ0UgOworCXN0YXRlLT5zdF90b3BvbG9neSA9IHRvcCA7CisJc3RhdGUtPnN0X2R1cGxfYWRkciA9CisJCSgoc21jLT5taWIubVtNQUMwXS5mZGRpTUFDREFfRmxhZyA/IFNNVF9TVF9NWV9EVVBBIDogMCApIHwKKwkJIChzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVTkRBX0ZsYWcgPyBTTVRfU1RfVU5BX0RVUEEgOiAwKSkgOworfQorCisvKgorICogZmlsbCB2YWx1ZXMgaW4gdGltZXN0YW1wIHBhcmFtZXRlcgorICovCitzdGF0aWMgdm9pZCBzbXRfZmlsbF90aW1lc3RhbXAoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcF90aW1lc3RhbXAgKnRzKQoreworCisJU01UU0VUUEFSQSh0cyxTTVRfUF9USU1FU1RBTVApIDsKKwlzbXRfc2V0X3RpbWVzdGFtcChzbWMsdHMtPnRzX3RpbWUpIDsKK30KKwordm9pZCBzbXRfc2V0X3RpbWVzdGFtcChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9jaGFyICpwKQoreworCXVfbG9uZwl0aW1lIDsKKwl1X2xvbmcJdXRpbWUgOworCisJLyoKKwkgKiB0aW1lc3RhbXAgaXMgNjQgYml0cyBsb25nIDsgcmVzb2x1dGlvbiBpcyA4MCBuUworCSAqIG91ciBjbG9jayByZXNvbHV0aW9uIGlzIDEwbVMKKwkgKiAxMG1TLzgwbnMgPSAxMjUwMDAgfiAyXjE3ID0gMTMxMDcyCisJICovCisJdXRpbWUgPSBzbXRfZ2V0X3RpbWUoKSA7CisJdGltZSA9IHV0aW1lICogMTAwIDsKKwl0aW1lIC89IFRJQ0tTX1BFUl9TRUNPTkQgOworCXBbMF0gPSAwIDsKKwlwWzFdID0gKHVfY2hhcikoKHRpbWU+Pig4KzgrOCs4LTEpKSAmIDEpIDsKKwlwWzJdID0gKHVfY2hhcikodGltZT4+KDgrOCs4LTEpKSA7CisJcFszXSA9ICh1X2NoYXIpKHRpbWU+Pig4KzgtMSkpIDsKKwlwWzRdID0gKHVfY2hhcikodGltZT4+KDgtMSkpIDsKKwlwWzVdID0gKHVfY2hhcikodGltZTw8MSkgOworCXBbNl0gPSAodV9jaGFyKShzbWMtPnNtLnVuaXFfdGlja3M+PjgpIDsKKwlwWzddID0gKHVfY2hhcilzbWMtPnNtLnVuaXFfdGlja3MgOworCS8qCisJICogbWFrZSBzdXJlIHdlIGRvbid0IHdyYXA6IHJlc3RhcnQgd2hlbmV2ZXIgdGhlIHVwcGVyIGRpZ2l0cyBjaGFuZ2UKKwkgKi8KKwlpZiAodXRpbWUgIT0gc21jLT5zbS51bmlxX3RpbWUpIHsKKwkJc21jLT5zbS51bmlxX3RpY2tzID0gMCA7CisJfQorCXNtYy0+c20udW5pcV90aWNrcysrIDsKKwlzbWMtPnNtLnVuaXFfdGltZSA9IHV0aW1lIDsKK30KKworLyoKKyAqIGZpbGwgdmFsdWVzIGluIHN0YXRpb24gcG9saWN5IHBhcmFtZXRlcgorICovCitzdGF0aWMgdm9pZCBzbXRfZmlsbF9wb2xpY3koc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcF9wb2xpY3kgKnBvbGljeSkKK3sKKwlpbnQJaSA7CisJdV9jaGFyCSptYXAgOworCXVfc2hvcnQJaW4gOworCXVfc2hvcnQJb3V0IDsKKworCS8qCisJICogTUlCIHBhcmEgMTAxYiAoZmRkaVNNVENvbm5lY3Rpb25Qb2xpY3kpIGNvZGluZworCSAqIGlzIGRpZmZlcmVudCBmcm9tIDAwMDUgY29kaW5nCisJICovCisJc3RhdGljIHVfY2hhcglhbnNpX3dlaXJkbmVzc1sxNl0gPSB7CisJCTAsNyw1LDMsOCwxLDYsNCw5LDEwLDIsMTEsMTIsMTMsMTQsMTUKKwl9IDsKKwlTTVRTRVRQQVJBKHBvbGljeSxTTVRfUF9QT0xJQ1kpIDsKKworCW91dCA9IDAgOworCWluID0gc21jLT5taWIuZmRkaVNNVENvbm5lY3Rpb25Qb2xpY3kgOworCWZvciAoaSA9IDAsIG1hcCA9IGFuc2lfd2VpcmRuZXNzIDsgaSA8IDE2IDsgaSsrKSB7CisJCWlmIChpbiAmIDEpCisJCQlvdXQgfD0gKDE8PCptYXApIDsKKwkJaW4gPj49IDEgOworCQltYXArKyA7CisJfQorCXBvbGljeS0+cGxfY29uZmlnID0gc21jLT5taWIuZmRkaVNNVENvbmZpZ1BvbGljeSA7CisJcG9saWN5LT5wbF9jb25uZWN0ID0gb3V0IDsKK30KKworLyoKKyAqIGZpbGwgdmFsdWVzIGluIGxhdGVuY3kgZXF1aXZhbGVudCBwYXJhbWV0ZXIKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfbGF0ZW5jeShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX2xhdGVuY3kgKmxhdGVuY3kpCit7CisJU01UU0VUUEFSQShsYXRlbmN5LFNNVF9QX0xBVEVOQ1kpIDsKKworCWxhdGVuY3ktPmx0X3BoeW91dF9pZHgxID0gcGh5X2luZGV4KHNtYywwKSA7CisJbGF0ZW5jeS0+bHRfbGF0ZW5jeTEgPSAxMCA7CS8qIGluIG9jdGV0cyAoYnl0ZSBjbG9jaykgKi8KKwkvKgorCSAqIG5vdGU6IGxhdGVuY3kgaGFzIHR3byBwaHkgZW50cmllcyBieSBkZWZpbml0aW9uCisJICogZm9yIGEgU0FTLCB0aGUgMm5kIG9uZSBpcyBudWxsCisJICovCisJaWYgKHNtYy0+cy5zYXMgPT0gU01UX0RBUykgeworCQlsYXRlbmN5LT5sdF9waHlvdXRfaWR4MiA9IHBoeV9pbmRleChzbWMsMSkgOworCQlsYXRlbmN5LT5sdF9sYXRlbmN5MiA9IDEwIDsJLyogaW4gb2N0ZXRzIChieXRlIGNsb2NrKSAqLworCX0KKwllbHNlIHsKKwkJbGF0ZW5jeS0+bHRfcGh5b3V0X2lkeDIgPSAwIDsKKwkJbGF0ZW5jeS0+bHRfbGF0ZW5jeTIgPSAwIDsKKwl9Cit9CisKKy8qCisgKiBmaWxsIHZhbHVlcyBpbiBNQUMgbmVpZ2hib3JzIHBhcmFtZXRlcgorICovCitzdGF0aWMgdm9pZCBzbXRfZmlsbF9uZWlnaGJvcihzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX25laWdoYm9yICpuZWlnaGJvcikKK3sKKwlTTVRTRVRQQVJBKG5laWdoYm9yLFNNVF9QX05FSUdIQk9SUykgOworCisJbmVpZ2hib3ItPm5iX21pYl9pbmRleCA9IElOREVYX01BQyA7CisJbmVpZ2hib3ItPm5iX21hY19pbmRleCA9IG1hY19pbmRleChzbWMsMSkgOworCW5laWdoYm9yLT5uYl91bmEgPSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVcHN0cmVhbU5iciA7CisJbmVpZ2hib3ItPm5iX2RuYSA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0Rvd25zdHJlYW1OYnIgOworfQorCisvKgorICogZmlsbCB2YWx1ZXMgaW4gcGF0aCBkZXNjcmlwdG9yCisgKi8KKyNpZmRlZglDT05DRU5UUkFUT1IKKyNkZWZpbmUgQUxMUEhZUwlOVU1QSFlTCisjZWxzZQorI2RlZmluZSBBTExQSFlTCSgoc21jLT5zLnNhcyA9PSBTTVRfU0FTKSA/IDEgOiAyKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc210X2ZpbGxfcGF0aChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3BhdGggKnBhdGgpCit7CisJU0tfTE9DX0RFQ0woaW50LHR5cGUpIDsKKwlTS19MT0NfREVDTChpbnQsc3RhdGUpIDsKKwlTS19MT0NfREVDTChpbnQscmVtb3RlKSA7CisJU0tfTE9DX0RFQ0woaW50LG1hYykgOworCWludAlsZW4gOworCWludAlwIDsKKwlpbnQJcGh5c3AgOworCXN0cnVjdCBzbXRfcGh5X3JlYwkqcGh5IDsKKwlzdHJ1Y3Qgc210X21hY19yZWMJKnBkX21hYyA7CisKKwlsZW4gPQlQQVJBX0xFTiArCisJCXNpemVvZihzdHJ1Y3Qgc210X21hY19yZWMpICogTlVNTUFDUyArCisJCXNpemVvZihzdHJ1Y3Qgc210X3BoeV9yZWMpICogQUxMUEhZUyA7CisJcGF0aC0+cGFyYS5wX3R5cGUgPSBTTVRfUF9QQVRIIDsKKwlwYXRoLT5wYXJhLnBfbGVuID0gbGVuIC0gUEFSQV9MRU4gOworCisJLyogUEhZcyAqLworCWZvciAocCA9IDAscGh5ID0gcGF0aC0+cGRfcGh5IDsgcCA8IEFMTFBIWVMgOyBwKyssIHBoeSsrKSB7CisJCXBoeXNwID0gcCA7CisjaWZuZGVmCUNPTkNFTlRSQVRPUgorCQlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKQorCQkJcGh5c3AgPSBQUyA7CisjZW5kaWYKKwkJcGNtX3N0YXR1c19zdGF0ZShzbWMscGh5c3AsJnR5cGUsJnN0YXRlLCZyZW1vdGUsJm1hYykgOworI2lmZGVmCUxJVFRMRV9FTkRJQU4KKwkJcGh5LT5waHlfbWliX2luZGV4ID0gc210X3N3YXBfc2hvcnQoKHVfc2hvcnQpcCtJTkRFWF9QT1JUKSA7CisjZWxzZQorCQlwaHktPnBoeV9taWJfaW5kZXggPSBwK0lOREVYX1BPUlQgOworI2VuZGlmCisJCXBoeS0+cGh5X3R5cGUgPSB0eXBlIDsKKwkJcGh5LT5waHlfY29ubmVjdF9zdGF0ZSA9IHN0YXRlIDsKKwkJcGh5LT5waHlfcmVtb3RlX3R5cGUgPSByZW1vdGUgOworCQlwaHktPnBoeV9yZW1vdGVfbWFjID0gbWFjIDsKKwkJcGh5LT5waHlfcmVzb3VyY2VfaWR4ID0gcGh5X2Nvbl9yZXNvdXJjZV9pbmRleChzbWMscCkgOworCX0KKworCS8qIE1BQyAqLworCXBkX21hYyA9IChzdHJ1Y3Qgc210X21hY19yZWMgKikgcGh5IDsKKwlwZF9tYWMtPm1hY19hZGRyID0gc21jLT5taWIubVtNQUMwXS5mZGRpTUFDU01UQWRkcmVzcyA7CisJcGRfbWFjLT5tYWNfcmVzb3VyY2VfaWR4ID0gbWFjX2Nvbl9yZXNvdXJjZV9pbmRleChzbWMsMSkgOworCXJldHVybihsZW4pIDsKK30KKworLyoKKyAqIGZpbGwgdmFsdWVzIGluIG1hYyBzdGF0dXMKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfbWFjX3N0YXR1cyhzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX21hY19zdGF0dXMgKnN0KQoreworCVNNVFNFVFBBUkEoc3QsU01UX1BfTUFDX1NUQVRVUykgOworCisJc3QtPnN0X21pYl9pbmRleCA9IElOREVYX01BQyA7CisJc3QtPnN0X21hY19pbmRleCA9IG1hY19pbmRleChzbWMsMSkgOworCisJbWFjX3VwZGF0ZV9jb3VudGVyKHNtYykgOworCS8qCisJICogdGltZXIgdmFsdWVzIGFyZSByZXByZXNlbnRlZCBpbiBTTVQgYXMgMidzIGNvbXBsZW1lbnQgbnVtYmVycworCSAqIHVuaXRzIDoJaW50ZXJuYWwgOiAgMidzIGNvbXBsZW1lbnQgQkNMSworCSAqLworCXN0LT5zdF90X3JlcSA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1RfUmVxIDsKKwlzdC0+c3RfdF9uZWcgPSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUX05lZyA7CisJc3QtPnN0X3RfbWF4ID0gc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVF9NYXggOworCXN0LT5zdF90dnhfdmFsdWUgPSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUdnhWYWx1ZSA7CisJc3QtPnN0X3RfbWluID0gc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVF9NaW4gOworCisJc3QtPnN0X3NiYSA9IHNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIU2JhUGF5bG9hZCA7CisJc3QtPnN0X2ZyYW1lX2N0ID0gc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRnJhbWVfQ3QgOworCXN0LT5zdF9lcnJvcl9jdCA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0Vycm9yX0N0IDsKKwlzdC0+c3RfbG9zdF9jdCA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0xvc3RfQ3QgOworfQorCisvKgorICogZmlsbCB2YWx1ZXMgaW4gTEVNIHN0YXR1cworICovCitzdGF0aWMgdm9pZCBzbXRfZmlsbF9sZW0oc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcF9sZW0gKmxlbSwgaW50IHBoeSkKK3sKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqbWliIDsKKworCW1pYiA9IHNtYy0+eVtwaHldLm1pYiA7CisKKwlTTVRTRVRQQVJBKGxlbSxTTVRfUF9MRU0pIDsKKwlsZW0tPmxlbV9taWJfaW5kZXggPSBwaHkrSU5ERVhfUE9SVCA7CisJbGVtLT5sZW1fcGh5X2luZGV4ID0gcGh5X2luZGV4KHNtYyxwaHkpIDsKKwlsZW0tPmxlbV9wYWQyID0gMCA7CisJbGVtLT5sZW1fY3V0b2ZmID0gbWliLT5mZGRpUE9SVExlcl9DdXRvZmYgOworCWxlbS0+bGVtX2FsYXJtID0gbWliLT5mZGRpUE9SVExlcl9BbGFybSA7CisJLyogbG9uZyB0ZXJtIGJpdCBlcnJvciByYXRlICovCisJbGVtLT5sZW1fZXN0aW1hdGUgPSBtaWItPmZkZGlQT1JUTGVyX0VzdGltYXRlIDsKKwkvKiAjIG9mIHJlamVjdGVkIGNvbm5lY3Rpb25zICovCisJbGVtLT5sZW1fcmVqZWN0X2N0ID0gbWliLT5mZGRpUE9SVExlbV9SZWplY3RfQ3QgOworCWxlbS0+bGVtX2N0ID0gbWliLT5mZGRpUE9SVExlbV9DdCA7CS8qIHRvdGFsIG51bWJlciBvZiBlcnJvcnMgKi8KK30KKworLyoKKyAqIGZpbGwgdmVyc2lvbiBwYXJhbWV0ZXIKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfdmVyc2lvbihzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3ZlcnNpb24gKnZlcnMpCit7CisJU0tfVU5VU0VEKHNtYykgOworCVNNVFNFVFBBUkEodmVycyxTTVRfUF9WRVJTSU9OKSA7CisJdmVycy0+dl9wYWQgPSAwIDsKKwl2ZXJzLT52X24gPSAxIDsJCQkJLyogb25lIHZlcnNpb24gaXMgZW5vdWdoIC4uICovCisJdmVycy0+dl9pbmRleCA9IDEgOworCXZlcnMtPnZfdmVyc2lvblswXSA9IFNNVF9WSURfMiA7CisJdmVycy0+dl9wYWQyID0gMCA7Cit9CisKKyNpZmRlZglTTVQ2XzEwCisvKgorICogZmlsbCBmcmFtZSBzdGF0dXMgY2FwYWJpbGl0aWVzCisgKi8KKy8qCisgKiBub3RlOiB0aGlzIHBhcmEgMjAwQiBpcyBOT1QgaW4gc3dhcCB0YWJsZSwgYmVjYXVzZSBpdCdzIGFsc28gc2V0IGluCisgKiBQTUYgYWRkX3BhcmEKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfZnNjKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfZnNjICpmc2MpCit7CisJU0tfVU5VU0VEKHNtYykgOworCVNNVFNFVFBBUkEoZnNjLFNNVF9QX0ZTQykgOworCWZzYy0+ZnNjX3BhZDAgPSAwIDsKKwlmc2MtPmZzY19tYWNfaW5kZXggPSBJTkRFWF9NQUMgOwkvKiB0aGlzIGlzIE1JQiA7IE1JQiBpcyBOT1QKKwkJCQkJCSAqIG1hY19pbmRleCAoKWkgIQorCQkJCQkJICovCisJZnNjLT5mc2NfcGFkMSA9IDAgOworCWZzYy0+ZnNjX3ZhbHVlID0gRlNDX1RZUEUwIDsJCS8qICJub3JtYWwiIG5vZGUgKi8KKyNpZmRlZglMSVRUTEVfRU5ESUFOCisJZnNjLT5mc2NfbWFjX2luZGV4ID0gc210X3N3YXBfc2hvcnQoSU5ERVhfTUFDKSA7CisJZnNjLT5mc2NfdmFsdWUgPSBzbXRfc3dhcF9zaG9ydChGU0NfVFlQRTApIDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qCisgKiBmaWxsIG1hYyBjb3VudGVyIGZpZWxkCisgKi8KK3N0YXRpYyB2b2lkIHNtdF9maWxsX21hY19jb3VudGVyKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfbWFjX2NvdW50ZXIgKm1jKQoreworCVNNVFNFVFBBUkEobWMsU01UX1BfTUFDX0NPVU5URVIpIDsKKwltYy0+bWNfbWliX2luZGV4ID0gSU5ERVhfTUFDIDsKKwltYy0+bWNfaW5kZXggPSBtYWNfaW5kZXgoc21jLDEpIDsKKwltYy0+bWNfcmVjZWl2ZV9jdCA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0NvcGllZF9DdCA7CisJbWMtPm1jX3RyYW5zbWl0X2N0ID0gIHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1RyYW5zbWl0X0N0IDsKK30KKworLyoKKyAqIGZpbGwgbWFjIGZyYW1lIG5vdCBjb3BpZWQgY291bnRlcgorICovCitzdGF0aWMgdm9pZCBzbXRfZmlsbF9tYWNfZm5jKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfbWFjX2ZuYyAqZm5jKQoreworCVNNVFNFVFBBUkEoZm5jLFNNVF9QX01BQ19GTkMpIDsKKwlmbmMtPm5jX21pYl9pbmRleCA9IElOREVYX01BQyA7CisJZm5jLT5uY19pbmRleCA9IG1hY19pbmRleChzbWMsMSkgOworCWZuYy0+bmNfY291bnRlciA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ05vdENvcGllZF9DdCA7Cit9CisKKworLyoKKyAqIGZpbGwgbWFudWZhY3R1cmVyIGZpZWxkCisgKi8KK3N0YXRpYyB2b2lkIHNtdF9maWxsX21hbnVmYWN0dXJlcihzdHJ1Y3Qgc19zbWMgKnNtYywgCisJCQkJICBzdHJ1Y3Qgc21wX3BfbWFudWZhY3R1cmVyICptYW4pCit7CisJU01UU0VUUEFSQShtYW4sU01UX1BfTUFOVUZBQ1RVUkVSKSA7CisJbWVtY3B5KChjaGFyICopIG1hbi0+bWZfZGF0YSwKKwkJKGNoYXIgKikgc21jLT5taWIuZmRkaVNNVE1hbnVmYWN0dXJlckRhdGEsCisJCXNpemVvZihtYW4tPm1mX2RhdGEpKSA7Cit9CisKKy8qCisgKiBmaWxsIHVzZXIgZmllbGQKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfdXNlcihzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtcF9wX3VzZXIgKnVzZXIpCit7CisJU01UU0VUUEFSQSh1c2VyLFNNVF9QX1VTRVIpIDsKKwltZW1jcHkoKGNoYXIgKikgdXNlci0+dXNfZGF0YSwKKwkJKGNoYXIgKikgc21jLT5taWIuZmRkaVNNVFVzZXJEYXRhLAorCQlzaXplb2YodXNlci0+dXNfZGF0YSkpIDsKK30KKworLyoKKyAqIGZpbGwgc2V0IGNvdW50CisgKi8KK3N0YXRpYyB2b2lkIHNtdF9maWxsX3NldGNvdW50KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3Bfc2V0Y291bnQgKnNldGNvdW50KQoreworCVNLX1VOVVNFRChzbWMpIDsKKwlTTVRTRVRQQVJBKHNldGNvdW50LFNNVF9QX1NFVENPVU5UKSA7CisJc2V0Y291bnQtPmNvdW50ID0gc21jLT5taWIuZmRkaVNNVFNldENvdW50LmNvdW50IDsKKwltZW1jcHkoKGNoYXIgKilzZXRjb3VudC0+dGltZXN0YW1wLAorCQkoY2hhciAqKXNtYy0+bWliLmZkZGlTTVRTZXRDb3VudC50aW1lc3RhbXAsOCkgOworfQorCisvKgorICogZmlsbCBlY2hvIGRhdGEKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfZWNobyhzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX2VjaG8gKmVjaG8sIHVfbG9uZyBzZWVkLAorCQkJICBpbnQgbGVuKQoreworCXVfY2hhcgkqcCA7CisKKwlTS19VTlVTRUQoc21jKSA7CisJU01UU0VUUEFSQShlY2hvLFNNVF9QX0VDSE9EQVRBKSA7CisJZWNoby0+cGFyYS5wX2xlbiA9IGxlbiA7CisJZm9yIChwID0gZWNoby0+ZWNfZGF0YSA7IGxlbiA7IGxlbi0tKSB7CisJCSpwKysgPSAodV9jaGFyKSBzZWVkIDsKKwkJc2VlZCArPSAxMyA7CisJfQorfQorCisvKgorICogY2xlYXIgRE5BIGFuZCBVTkEKKyAqIGNhbGxlZCBmcm9tIENGTSBpZiBjb25maWd1cmF0aW9uIGNoYW5nZXMKKyAqLwordm9pZCBzbXRfY2xlYXJfdW5hX2RuYShzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVcHN0cmVhbU5iciA9IFNNVF9Vbmtub3duIDsKKwlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNEb3duc3RyZWFtTmJyID0gU01UX1Vua25vd24gOworfQorCitzdGF0aWMgdm9pZCBzbXRfY2xlYXJfb2xkX3VuYV9kbmEoc3RydWN0IHNfc21jICpzbWMpCit7CisJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDT2xkVXBzdHJlYW1OYnIgPSBTTVRfVW5rbm93biA7CisJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDT2xkRG93bnN0cmVhbU5iciA9IFNNVF9Vbmtub3duIDsKK30KKwordV9sb25nIHNtdF9nZXRfdGlkKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXVfbG9uZwl0aWQgOworCXdoaWxlICgodGlkID0gKysoc21jLT5zbS5zbXRfdGlkKSBeIFNNVF9USURfTUFHSUMpID09IDApCisJCTsKKwlyZXR1cm4odGlkICYgMHgzZmZmZmZmZkwpIDsKK30KKworCisvKgorICogdGFibGUgb2YgcGFyYW1ldGVyIGxlbmd0aHMKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbXRfcGRlZiB7CisJaW50CXB0eXBlIDsKKwlpbnQJcGxlbiA7CisJY29uc3QgY2hhcgkqcHN3YXAgOworfSBzbXRfcGRlZltdID0geworCXsgU01UX1BfVU5BLAlzaXplb2Yoc3RydWN0IHNtdF9wX3VuYSkgLAorCQlTV0FQX1NNVF9QX1VOQQkJCQkJfSAsCisJeyBTTVRfUF9TREUsCXNpemVvZihzdHJ1Y3Qgc210X3Bfc2RlKSAsCisJCVNXQVBfU01UX1BfU0RFCQkJCQl9ICwKKwl7IFNNVF9QX1NUQVRFLAlzaXplb2Yoc3RydWN0IHNtdF9wX3N0YXRlKSAsCisJCVNXQVBfU01UX1BfU1RBVEUJCQkJfSAsCisJeyBTTVRfUF9USU1FU1RBTVAsc2l6ZW9mKHN0cnVjdCBzbXRfcF90aW1lc3RhbXApICwKKwkJU1dBUF9TTVRfUF9USU1FU1RBTVAJCQkJfSAsCisJeyBTTVRfUF9QT0xJQ1ksCXNpemVvZihzdHJ1Y3Qgc210X3BfcG9saWN5KSAsCisJCVNXQVBfU01UX1BfUE9MSUNZCQkJCX0gLAorCXsgU01UX1BfTEFURU5DWSwJc2l6ZW9mKHN0cnVjdCBzbXRfcF9sYXRlbmN5KSAsCisJCVNXQVBfU01UX1BfTEFURU5DWQkJCQl9ICwKKwl7IFNNVF9QX05FSUdIQk9SUyxzaXplb2Yoc3RydWN0IHNtdF9wX25laWdoYm9yKSAsCisJCVNXQVBfU01UX1BfTkVJR0hCT1JTCQkJCX0gLAorCXsgU01UX1BfUEFUSCwJc2l6ZW9mKHN0cnVjdCBzbXRfcF9wYXRoKSAsCisJCVNXQVBfU01UX1BfUEFUSAkJCQkJfSAsCisJeyBTTVRfUF9NQUNfU1RBVFVTLHNpemVvZihzdHJ1Y3Qgc210X3BfbWFjX3N0YXR1cykgLAorCQlTV0FQX1NNVF9QX01BQ19TVEFUVVMJCQkJfSAsCisJeyBTTVRfUF9MRU0sCXNpemVvZihzdHJ1Y3Qgc210X3BfbGVtKSAsCisJCVNXQVBfU01UX1BfTEVNCQkJCQl9ICwKKwl7IFNNVF9QX01BQ19DT1VOVEVSLHNpemVvZihzdHJ1Y3Qgc210X3BfbWFjX2NvdW50ZXIpICwKKwkJU1dBUF9TTVRfUF9NQUNfQ09VTlRFUgkJCQl9ICwKKwl7IFNNVF9QX01BQ19GTkMsc2l6ZW9mKHN0cnVjdCBzbXRfcF9tYWNfZm5jKSAsCisJCVNXQVBfU01UX1BfTUFDX0ZOQwkJCQl9ICwKKwl7IFNNVF9QX1BSSU9SSVRZLHNpemVvZihzdHJ1Y3Qgc210X3BfcHJpb3JpdHkpICwKKwkJU1dBUF9TTVRfUF9QUklPUklUWQkJCQl9ICwKKwl7IFNNVF9QX0VCLHNpemVvZihzdHJ1Y3Qgc210X3BfZWIpICwKKwkJU1dBUF9TTVRfUF9FQgkJCQkJfSAsCisJeyBTTVRfUF9NQU5VRkFDVFVSRVIsc2l6ZW9mKHN0cnVjdCBzbXBfcF9tYW51ZmFjdHVyZXIpICwKKwkJU1dBUF9TTVRfUF9NQU5VRkFDVFVSRVIJCQkJfSAsCisJeyBTTVRfUF9SRUFTT04sCXNpemVvZihzdHJ1Y3Qgc210X3BfcmVhc29uKSAsCisJCVNXQVBfU01UX1BfUkVBU09OCQkJCX0gLAorCXsgU01UX1BfUkVGVVNFRCwgc2l6ZW9mKHN0cnVjdCBzbXRfcF9yZWZ1c2VkKSAsCisJCVNXQVBfU01UX1BfUkVGVVNFRAkJCQl9ICwKKwl7IFNNVF9QX1ZFUlNJT04sIHNpemVvZihzdHJ1Y3Qgc210X3BfdmVyc2lvbikgLAorCQlTV0FQX1NNVF9QX1ZFUlNJT04JCQkJfSAsCisjaWZkZWYgRVNTCisJeyBTTVRfUDAwMTUsIHNpemVvZihzdHJ1Y3Qgc210X3BfMDAxNSkgLCBTV0FQX1NNVF9QMDAxNSB9ICwKKwl7IFNNVF9QMDAxNiwgc2l6ZW9mKHN0cnVjdCBzbXRfcF8wMDE2KSAsIFNXQVBfU01UX1AwMDE2IH0gLAorCXsgU01UX1AwMDE3LCBzaXplb2Yoc3RydWN0IHNtdF9wXzAwMTcpICwgU1dBUF9TTVRfUDAwMTcgfSAsCisJeyBTTVRfUDAwMTgsIHNpemVvZihzdHJ1Y3Qgc210X3BfMDAxOCkgLCBTV0FQX1NNVF9QMDAxOCB9ICwKKwl7IFNNVF9QMDAxOSwgc2l6ZW9mKHN0cnVjdCBzbXRfcF8wMDE5KSAsIFNXQVBfU01UX1AwMDE5IH0gLAorCXsgU01UX1AwMDFBLCBzaXplb2Yoc3RydWN0IHNtdF9wXzAwMWEpICwgU1dBUF9TTVRfUDAwMUEgfSAsCisJeyBTTVRfUDAwMUIsIHNpemVvZihzdHJ1Y3Qgc210X3BfMDAxYikgLCBTV0FQX1NNVF9QMDAxQiB9ICwKKwl7IFNNVF9QMDAxQywgc2l6ZW9mKHN0cnVjdCBzbXRfcF8wMDFjKSAsIFNXQVBfU01UX1AwMDFDIH0gLAorCXsgU01UX1AwMDFELCBzaXplb2Yoc3RydWN0IHNtdF9wXzAwMWQpICwgU1dBUF9TTVRfUDAwMUQgfSAsCisjZW5kaWYKKyNpZgkwCisJeyBTTVRfUF9GU0MsCXNpemVvZihzdHJ1Y3Qgc210X3BfZnNjKSAsCisJCVNXQVBfU01UX1BfRlNDCQkJCQl9ICwKKyNlbmRpZgorCisJeyBTTVRfUF9TRVRDT1VOVCwwLAlTV0FQX1NNVF9QX1NFVENPVU5UCQl9ICwKKwl7IFNNVF9QMTA0OCwJMCwJU1dBUF9TTVRfUDEwNDgJCQl9ICwKKwl7IFNNVF9QMjA4QywJMCwJU1dBUF9TTVRfUDIwOEMJCQl9ICwKKwl7IFNNVF9QMjA4RCwJMCwJU1dBUF9TTVRfUDIwOEQJCQl9ICwKKwl7IFNNVF9QMjA4RSwJMCwJU1dBUF9TTVRfUDIwOEUJCQl9ICwKKwl7IFNNVF9QMjA4RiwJMCwJU1dBUF9TTVRfUDIwOEYJCQl9ICwKKwl7IFNNVF9QMjA5MCwJMCwJU1dBUF9TTVRfUDIwOTAJCQl9ICwKKyNpZmRlZglFU1MKKwl7IFNNVF9QMzIwQiwgc2l6ZW9mKHN0cnVjdCBzbXRfcF8zMjBiKSAsIFNXQVBfU01UX1AzMjBCIH0gLAorCXsgU01UX1AzMjBGLCBzaXplb2Yoc3RydWN0IHNtdF9wXzMyMGYpICwgU1dBUF9TTVRfUDMyMEYgfSAsCisJeyBTTVRfUDMyMTAsIHNpemVvZihzdHJ1Y3Qgc210X3BfMzIxMCkgLCBTV0FQX1NNVF9QMzIxMCB9ICwKKyNlbmRpZgorCXsgU01UX1A0MDUwLAkwLAlTV0FQX1NNVF9QNDA1MAkJCX0gLAorCXsgU01UX1A0MDUxLAkwLAlTV0FQX1NNVF9QNDA1MQkJCX0gLAorCXsgU01UX1A0MDUyLAkwLAlTV0FQX1NNVF9QNDA1MgkJCX0gLAorCXsgU01UX1A0MDUzLAkwLAlTV0FQX1NNVF9QNDA1MwkJCX0gLAorfSA7CisKKyNkZWZpbmUgTl9TTVRfUExFTgkoc2l6ZW9mKHNtdF9wZGVmKS9zaXplb2Yoc210X3BkZWZbMF0pKQorCitpbnQgc210X2NoZWNrX3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfaGVhZGVyCSpzbSwKKwkJICAgY29uc3QgdV9zaG9ydCBsaXN0W10pCit7CisJY29uc3QgdV9zaG9ydAkJKnAgPSBsaXN0IDsKKwl3aGlsZSAoKnApIHsKKwkJaWYgKCFzbV90b19wYXJhKHNtYyxzbSwoaW50KSAqcCkpIHsKKwkJCURCX1NNVCgiU01UOiBzbXRfY2hlY2tfcGFyYSAtIG1pc3NpbmcgcGFyYSAleFxuIiwqcCwwKTsKKwkJCXJldHVybigtMSkgOworCQl9CisJCXArKyA7CisJfQorCXJldHVybigwKSA7Cit9CisKK3ZvaWQgKnNtX3RvX3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfaGVhZGVyICpzbSwgaW50IHBhcmEpCit7CisJY2hhcgkqcCA7CisJaW50CWxlbiA7CisJaW50CXBsZW4gOworCXZvaWQJKmZvdW5kID0gTlVMTDsKKworCVNLX1VOVVNFRChzbWMpIDsKKworCWxlbiA9IHNtLT5zbXRfbGVuIDsKKwlwID0gKGNoYXIgKikoc20rMSkgOwkJLyogcG9pbnRlciB0byBpbmZvICovCisJd2hpbGUgKGxlbiA+IDAgKSB7CisJCWlmICgoKHN0cnVjdCBzbXRfcGFyYSAqKXApLT5wX3R5cGUgPT0gcGFyYSkKKwkJCWZvdW5kID0gKHZvaWQgKikgcCA7CisJCXBsZW4gPSAoKHN0cnVjdCBzbXRfcGFyYSAqKXApLT5wX2xlbiArIFBBUkFfTEVOIDsKKwkJcCArPSBwbGVuIDsKKwkJbGVuIC09IHBsZW4gOworCQlpZiAobGVuIDwgMCkgeworCQkJREJfU01UKCJTTVQgOiBzbV90b19wYXJhIC0gbGVuZ3RoIGVycm9yICVkXG4iLHBsZW4sMCkgOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKChwbGVuICYgMykgJiYgKHBhcmEgIT0gU01UX1BfRUNIT0RBVEEpKSB7CisJCQlEQl9TTVQoIlNNVCA6IHNtX3RvX3BhcmEgLSBvZGQgbGVuZ3RoICVkXG4iLHBsZW4sMCkgOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKGZvdW5kKQorCQkJcmV0dXJuKGZvdW5kKSA7CisJfQorCXJldHVybiBOVUxMOworfQorCisjaWYJMAorLyoKKyAqIHNlbmQgQU5UQyBkYXRhIHRlc3QgZnJhbWUKKyAqLwordm9pZCBmZGRpX3NlbmRfYW50YyhzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqZGVzdCkKK3sKKwlTS19VTlVTRUQoc21jKSA7CisJU0tfVU5VU0VEKGRlc3QpIDsKKyNpZgkwCisJU01idWYJCQkqbWIgOworCXN0cnVjdCBzbXRfaGVhZGVyCSpzbXQgOworCWludAkJCWkgOworCWNoYXIJCQkqcCA7CisKKwltYiA9IHNtdF9nZXRfbWJ1ZigpIDsKKwltYi0+c21fbGVuID0gMzAwMCsxMiA7CisJcCA9IHNtdG9kKG1iLCBjaGFyICopICsgMTIgOworCWZvciAoaSA9IDAgOyBpIDwgMzAwMCA7IGkrKykKKwkJKnArKyA9IDEgPDwgKGkmNykgOworCisJc210ID0gc210b2QobWIsIHN0cnVjdCBzbXRfaGVhZGVyICopIDsKKwlzbXQtPnNtdF9kZXN0ID0gKmRlc3QgOworCXNtdC0+c210X3NvdXJjZSA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1NNVEFkZHJlc3MgOworCXNtdF9zZW5kX21idWYoc21jLG1iLEZDX0FTWU5DX0xMQykgOworI2VuZGlmCit9CisjZW5kaWYKKworI2lmZGVmCURFQlVHCisjZGVmaW5lIGhleHRvYXNjKHgpCSIwMTIzNDU2Nzg5YWJjZGVmIlt4XQorCitjaGFyICphZGRyX3RvX3N0cmluZyhzdHJ1Y3QgZmRkaV9hZGRyICphZGRyKQoreworCWludAlpIDsKKwlzdGF0aWMgY2hhcglzdHJpbmdbNiozXSA9ICIqKioqIiA7CisKKwlmb3IgKGkgPSAwIDsgaSA8IDYgOyBpKyspIHsKKwkJc3RyaW5nW2kqM10gPSBoZXh0b2FzYygoYWRkci0+YVtpXT4+NCkmMHhmKSA7CisJCXN0cmluZ1tpKjMrMV0gPSBoZXh0b2FzYygoYWRkci0+YVtpXSkmMHhmKSA7CisJCXN0cmluZ1tpKjMrMl0gPSAnOicgOworCX0KKwlzdHJpbmdbNSozKzJdID0gMCA7CisJcmV0dXJuKHN0cmluZykgOworfQorI2VuZGlmCisKKyNpZmRlZglBTTI5Sworc210X2lmY29uZmlnKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaWYgKGFyZ2MgPj0gMiAmJiAhc3RyY21wKGFyZ3ZbMF0sIm9wdF9ieXBhc3MiKSAmJgorCSAgICAhc3RyY21wKGFyZ3ZbMV0sInllcyIpKSB7CisJCXNtYy0+bWliLmZkZGlTTVRCeXBhc3NQcmVzZW50ID0gMSA7CisJCXJldHVybigwKSA7CisJfQorCXJldHVybihhbWRmZGRpX2NvbmZpZygwLGFyZ2MsYXJndikpIDsKK30KKyNlbmRpZgorCisvKgorICogcmV0dXJuIHN0YXRpYyBtYWMgaW5kZXgKKyAqLworc3RhdGljIGludCBtYWNfaW5kZXgoc3RydWN0IHNfc21jICpzbWMsIGludCBtYWMpCit7CisJU0tfVU5VU0VEKG1hYykgOworI2lmZGVmCUNPTkNFTlRSQVRPUgorCVNLX1VOVVNFRChzbWMpIDsKKwlyZXR1cm4oTlVNUEhZUysxKSA7CisjZWxzZQorCXJldHVybigoc21jLT5zLnNhcyA9PSBTTVRfU0FTKSA/IDIgOiAzKSA7CisjZW5kaWYKK30KKworLyoKKyAqIHJldHVybiBzdGF0aWMgcGh5IGluZGV4CisgKi8KK3N0YXRpYyBpbnQgcGh5X2luZGV4KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcGh5KQoreworCVNLX1VOVVNFRChzbWMpIDsKKwlyZXR1cm4ocGh5KzEpOworfQorCisvKgorICogcmV0dXJuIGR5bmFtaWMgbWFjIGNvbm5lY3Rpb24gcmVzb3VyY2UgaW5kZXgKKyAqLworc3RhdGljIGludCBtYWNfY29uX3Jlc291cmNlX2luZGV4KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbWFjKQoreworI2lmZGVmCUNPTkNFTlRSQVRPUgorCVNLX1VOVVNFRChzbWMpIDsKKwlTS19VTlVTRUQobWFjKSA7CisJcmV0dXJuKGVudGl0eV90b19pbmRleChzbWMsY2VtX2dldF9kb3duc3RyZWFtKHNtYyxFTlRJVFlfTUFDKSkpIDsKKyNlbHNlCisJU0tfVU5VU0VEKG1hYykgOworCXN3aXRjaCAoc21jLT5taWIuZmRkaVNNVENGX1N0YXRlKSB7CisJY2FzZSBTQzlfQ19XUkFQX0EgOgorCWNhc2UgU0M1X1RIUlVfQiA6CisJY2FzZSBTQzExX0NfV1JBUF9TIDoKKwkJcmV0dXJuKDEpIDsKKwljYXNlIFNDMTBfQ19XUkFQX0IgOgorCWNhc2UgU0M0X1RIUlVfQSA6CisJCXJldHVybigyKSA7CisJfQorCXJldHVybihzbWMtPnMuc2FzID09IFNNVF9TQVMgPyAyIDogMykgOworI2VuZGlmCit9CisKKy8qCisgKiByZXR1cm4gZHluYW1pYyBwaHkgY29ubmVjdGlvbiByZXNvdXJjZSBpbmRleAorICovCitzdGF0aWMgaW50IHBoeV9jb25fcmVzb3VyY2VfaW5kZXgoc3RydWN0IHNfc21jICpzbWMsIGludCBwaHkpCit7CisjaWZkZWYJQ09OQ0VOVFJBVE9SCisJcmV0dXJuKGVudGl0eV90b19pbmRleChzbWMsY2VtX2dldF9kb3duc3RyZWFtKHNtYyxFTlRJVFlfUEhZKHBoeSkpKSkgOworI2Vsc2UKKwlzd2l0Y2ggKHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSkgeworCWNhc2UgU0M5X0NfV1JBUF9BIDoKKwkJcmV0dXJuKHBoeSA9PSBQQSA/IDMgOiAyKSA7CisJY2FzZSBTQzEwX0NfV1JBUF9CIDoKKwkJcmV0dXJuKHBoeSA9PSBQQSA/IDEgOiAzKSA7CisJY2FzZSBTQzRfVEhSVV9BIDoKKwkJcmV0dXJuKHBoeSA9PSBQQSA/IDMgOiAxKSA7CisJY2FzZSBTQzVfVEhSVV9CIDoKKwkJcmV0dXJuKHBoeSA9PSBQQSA/IDIgOiAzKSA7CisJY2FzZSBTQzExX0NfV1JBUF9TIDoKKwkJcmV0dXJuKDIpIDsKKwl9CisJcmV0dXJuKHBoeSkgOworI2VuZGlmCit9CisKKyNpZmRlZglDT05DRU5UUkFUT1IKK3N0YXRpYyBpbnQgZW50aXR5X3RvX2luZGV4KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZSkKK3sKKwlpZiAoZSA9PSBFTlRJVFlfTUFDKQorCQlyZXR1cm4obWFjX2luZGV4KHNtYywxKSkgOworCWVsc2UKKwkJcmV0dXJuKHBoeV9pbmRleChzbWMsZSAtIEVOVElUWV9QSFkoMCkpKSA7Cit9CisjZW5kaWYKKworI2lmZGVmCUxJVFRMRV9FTkRJQU4KK3N0YXRpYyBpbnQgc210X3N3YXBfc2hvcnQodV9zaG9ydCBzKQoreworCXJldHVybigoKHM+PjgpJjB4ZmYpfCgocyYweGZmKTw8OCkpIDsKK30KKwordm9pZCBzbXRfc3dhcF9wYXJhKHN0cnVjdCBzbXRfaGVhZGVyICpzbSwgaW50IGxlbiwgaW50IGRpcmVjdGlvbikKKy8qIGludCBkaXJlY3Rpb247CTAgZW5jb2RlIDEgZGVjb2RlICovCit7CisJc3RydWN0IHNtdF9wYXJhCSpwYSA7CisJY29uc3QgIHN0cnVjdCBzbXRfcGRlZgkqcGQgOworCWNoYXIJKnAgOworCWludAlwbGVuIDsKKwlpbnQJdHlwZSA7CisJaW50CWkgOworCisvKglwcmludGYoInNtdF9zd2FwX3BhcmEgc20gJXggbGVuICVkIGRpciAlZFxuIiwKKwkJc20sbGVuLGRpcmVjdGlvbikgOworICovCisJc210X3N0cmluZ19zd2FwKChjaGFyICopc20sU1dBUF9TTVRIRUFERVIsbGVuKSA7CisKKwkvKiBzd2FwIGFyZ3MgKi8KKwlsZW4gLT0gc2l6ZW9mKHN0cnVjdCBzbXRfaGVhZGVyKSA7CisKKwlwID0gKGNoYXIgKikgKHNtICsgMSkgOworCXdoaWxlIChsZW4gPiAwKSB7CisJCXBhID0gKHN0cnVjdCBzbXRfcGFyYSAqKSBwIDsKKwkJcGxlbiA9IHBhLT5wX2xlbiA7CisJCXR5cGUgPSBwYS0+cF90eXBlIDsKKwkJcGEtPnBfdHlwZSA9IHNtdF9zd2FwX3Nob3J0KHBhLT5wX3R5cGUpIDsKKwkJcGEtPnBfbGVuID0gc210X3N3YXBfc2hvcnQocGEtPnBfbGVuKSA7CisJCWlmIChkaXJlY3Rpb24pIHsKKwkJCXBsZW4gPSBwYS0+cF9sZW4gOworCQkJdHlwZSA9IHBhLT5wX3R5cGUgOworCQl9CisJCS8qCisJCSAqIG5vdGU6IHBhcmFzIGNhbiBoYXZlIDAgbGVuZ3RoICEKKwkJICovCisJCWlmIChwbGVuIDwgMCkKKwkJCWJyZWFrIDsKKwkJcGxlbiArPSBQQVJBX0xFTiA7CisJCWZvciAoaSA9IE5fU01UX1BMRU4sIHBkID0gc210X3BkZWY7IGkgOyBpLS0scGQrKykgeworCQkJaWYgKHBkLT5wdHlwZSA9PSB0eXBlKQorCQkJCWJyZWFrIDsKKwkJfQorCQlpZiAoaSAmJiBwZC0+cHN3YXApIHsKKwkJCXNtdF9zdHJpbmdfc3dhcChwK1BBUkFfTEVOLHBkLT5wc3dhcCxsZW4pIDsKKwkJfQorCQlsZW4gLT0gcGxlbiA7CisJCXAgKz0gcGxlbiA7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbXRfc3RyaW5nX3N3YXAoY2hhciAqZGF0YSwgY29uc3QgY2hhciAqZm9ybWF0LCBpbnQgbGVuKQoreworCWNvbnN0IGNoYXIJKm9wZW5fcGFyZW4gPSAwIDsKKwlpbnQJeCA7CisKKwl3aGlsZSAobGVuID4gMCAgJiYgKmZvcm1hdCkgeworCQlzd2l0Y2ggKCpmb3JtYXQpIHsKKwkJY2FzZSAnWycgOgorCQkJb3Blbl9wYXJlbiA9IGZvcm1hdCA7CisJCQlicmVhayA7CisJCWNhc2UgJ10nIDoKKwkJCWZvcm1hdCA9IG9wZW5fcGFyZW4gOworCQkJYnJlYWsgOworCQljYXNlICcxJyA6CisJCWNhc2UgJzInIDoKKwkJY2FzZSAnMycgOgorCQljYXNlICc0JyA6CisJCWNhc2UgJzUnIDoKKwkJY2FzZSAnNicgOgorCQljYXNlICc3JyA6CisJCWNhc2UgJzgnIDoKKwkJY2FzZSAnOScgOgorCQkJZGF0YSAgKz0gKmZvcm1hdCAtICcwJyA7CisJCQlsZW4gICAtPSAqZm9ybWF0IC0gJzAnIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnYyc6CisJCQlkYXRhKysgOworCQkJbGVuLS0gOworCQkJYnJlYWsgOworCQljYXNlICdzJyA6CisJCQl4ID0gZGF0YVswXSA7CisJCQlkYXRhWzBdID0gZGF0YVsxXSA7CisJCQlkYXRhWzFdID0geCA7CisJCQlkYXRhICs9IDIgOworCQkJbGVuIC09IDIgOworCQkJYnJlYWsgOworCQljYXNlICdsJyA6CisJCQl4ID0gZGF0YVswXSA7CisJCQlkYXRhWzBdID0gZGF0YVszXSA7CisJCQlkYXRhWzNdID0geCA7CisJCQl4ID0gZGF0YVsxXSA7CisJCQlkYXRhWzFdID0gZGF0YVsyXSA7CisJCQlkYXRhWzJdID0geCA7CisJCQlkYXRhICs9IDQgOworCQkJbGVuIC09IDQgOworCQkJYnJlYWsgOworCQl9CisJCWZvcm1hdCsrIDsKKwl9Cit9CisjZWxzZQordm9pZCBzbXRfc3dhcF9wYXJhKHN0cnVjdCBzbXRfaGVhZGVyICpzbSwgaW50IGxlbiwgaW50IGRpcmVjdGlvbikKKy8qIGludCBkaXJlY3Rpb247CTAgZW5jb2RlIDEgZGVjb2RlICovCit7CisJU0tfVU5VU0VEKHNtKSA7CisJU0tfVU5VU0VEKGxlbikgOworCVNLX1VOVVNFRChkaXJlY3Rpb24pIDsKK30KKyNlbmRpZgorCisvKgorICogUE1GIGFjdGlvbnMKKyAqLworaW50IHNtdF9hY3Rpb24oc3RydWN0IHNfc21jICpzbWMsIGludCBjbGFzcywgaW50IGNvZGUsIGludCBpbmRleCkKK3sKKwlpbnQJZXZlbnQgOworCWludAlwb3J0IDsKKwlEQl9TTVQoIlNNVDogYWN0aW9uICVkIGNvZGUgJWRcbiIsY2xhc3MsY29kZSkgOworCXN3aXRjaChjbGFzcykgeworCWNhc2UgU01UX1NUQVRJT05fQUNUSU9OIDoKKwkJc3dpdGNoKGNvZGUpIHsKKwkJY2FzZSBTTVRfU1RBVElPTl9BQ1RJT05fQ09OTkVDVCA6CisJCQlzbWMtPm1pYi5mZGRpU01UUmVtb3RlRGlzY29ubmVjdEZsYWcgPSBGQUxTRSA7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfRUNNLEVDX0NPTk5FQ1QpIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBTTVRfU1RBVElPTl9BQ1RJT05fRElTQ09OTkVDVCA6CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfRUNNLEVDX0RJU0NPTk5FQ1QpIDsKKwkJCXNtYy0+bWliLmZkZGlTTVRSZW1vdGVEaXNjb25uZWN0RmxhZyA9IFRSVUUgOworCQkJUlNfU0VUKHNtYyxSU19ESVNDT05ORUNUKSA7CisJCQlBSVhfRVZFTlQoc21jLCAodV9sb25nKSBGRERJX1JJTkdfU1RBVFVTLCAodV9sb25nKQorCQkJCUZERElfU01UX0VWRU5ULCAodV9sb25nKSBGRERJX1JFTU9URV9ESVNDT05ORUNULAorCQkJCXNtdF9nZXRfZXZlbnRfd29yZChzbWMpKTsKKwkJCWJyZWFrIDsKKwkJY2FzZSBTTVRfU1RBVElPTl9BQ1RJT05fUEFUSFRFU1QgOgorCQkJQUlYX0VWRU5UKHNtYywgKHVfbG9uZykgRkRESV9SSU5HX1NUQVRVUywgKHVfbG9uZykKKwkJCQlGRERJX1NNVF9FVkVOVCwgKHVfbG9uZykgRkRESV9QQVRIX1RFU1QsCisJCQkJc210X2dldF9ldmVudF93b3JkKHNtYykpOworCQkJYnJlYWsgOworCQljYXNlIFNNVF9TVEFUSU9OX0FDVElPTl9TRUxGVEVTVCA6CisJCQlBSVhfRVZFTlQoc21jLCAodV9sb25nKSBGRERJX1JJTkdfU1RBVFVTLCAodV9sb25nKQorCQkJCUZERElfU01UX0VWRU5ULCAodV9sb25nKSBGRERJX1JFTU9URV9TRUxGX1RFU1QsCisJCQkJc210X2dldF9ldmVudF93b3JkKHNtYykpOworCQkJYnJlYWsgOworCQljYXNlIFNNVF9TVEFUSU9OX0FDVElPTl9ESVNBQkxFX0EgOgorCQkJaWYgKHNtYy0+eVtQQV0ucGNfbW9kZSA9PSBQTV9QRUVSKSB7CisJCQkJUlNfU0VUKHNtYyxSU19FVkVOVCkgOworCQkJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9QQ00rUEEsUENfRElTQUJMRSkgOworCQkJfQorCQkJYnJlYWsgOworCQljYXNlIFNNVF9TVEFUSU9OX0FDVElPTl9ESVNBQkxFX0IgOgorCQkJaWYgKHNtYy0+eVtQQl0ucGNfbW9kZSA9PSBQTV9QRUVSKSB7CisJCQkJUlNfU0VUKHNtYyxSU19FVkVOVCkgOworCQkJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9QQ00rUEIsUENfRElTQUJMRSkgOworCQkJfQorCQkJYnJlYWsgOworCQljYXNlIFNNVF9TVEFUSU9OX0FDVElPTl9ESVNBQkxFX00gOgorCQkJZm9yIChwb3J0ID0gMCA7IHBvcnQgPCAgTlVNUEhZUyA7IHBvcnQrKykgeworCQkJCWlmIChzbWMtPm1pYi5wW3BvcnRdLmZkZGlQT1JUTXlfVHlwZSAhPSBUTSkKKwkJCQkJY29udGludWUgOworCQkJCVJTX1NFVChzbWMsUlNfRVZFTlQpIDsKKwkJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNK3BvcnQsUENfRElTQUJMRSkgOworCQkJfQorCQkJYnJlYWsgOworCQlkZWZhdWx0IDoKKwkJCXJldHVybigxKSA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgU01UX1BPUlRfQUNUSU9OIDoKKwkJc3dpdGNoKGNvZGUpIHsKKwkJY2FzZSBTTVRfUE9SVF9BQ1RJT05fRU5BQkxFIDoKKwkJCWV2ZW50ID0gUENfRU5BQkxFIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBTTVRfUE9SVF9BQ1RJT05fRElTQUJMRSA6CisJCQlldmVudCA9IFBDX0RJU0FCTEUgOworCQkJYnJlYWsgOworCQljYXNlIFNNVF9QT1JUX0FDVElPTl9NQUlOVCA6CisJCQlldmVudCA9IFBDX01BSU5UIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBTTVRfUE9SVF9BQ1RJT05fU1RBUlQgOgorCQkJZXZlbnQgPSBQQ19TVEFSVCA7CisJCQlicmVhayA7CisJCWNhc2UgU01UX1BPUlRfQUNUSU9OX1NUT1AgOgorCQkJZXZlbnQgPSBQQ19TVE9QIDsKKwkJCWJyZWFrIDsKKwkJZGVmYXVsdCA6CisJCQlyZXR1cm4oMSkgOworCQl9CisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9QQ00raW5kZXgsZXZlbnQpIDsKKwkJYnJlYWsgOworCWRlZmF1bHQgOgorCQlyZXR1cm4oMSkgOworCX0KKwlyZXR1cm4oMCkgOworfQorCisvKgorICogY2hhbmdlIHRuZWcKKyAqCXNldCBUX1JlcSBpbiBNSUIgKFBhdGggQXR0cmlidXRlKQorICoJY2FsY3VsYXRlIG5ldyB2YWx1ZXMgZm9yIE1BQworICoJaWYgY2hhbmdlIHJlcXVpcmVkCisgKgkJZGlzY29ubmVjdAorICoJCXNldCByZWNvbm5lY3QKKyAqCWVuZAorICovCit2b2lkIHNtdF9jaGFuZ2VfdF9uZWcoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyB0bmVnKQoreworCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRITWF4VF9SZXEgPSB0bmVnIDsKKworCWlmIChzbXRfc2V0X21hY19vcHZhbHVlcyhzbWMpKSB7CisJCVJTX1NFVChzbWMsUlNfRVZFTlQpIDsKKwkJc21jLT5zbS5wbGVhc2VfcmVjb25uZWN0ID0gMSA7CisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9FQ00sRUNfRElTQ09OTkVDVCkgOworCX0KK30KKworLyoKKyAqIGNhbm9uaWNhbCBjb252ZXJzaW9uIG9mIDxsZW4+IGJ5dGVzIGJlZ2lubmluZyBmb3JtICpkYXRhCisgKi8KKyNpZmRlZiAgVVNFX0NBTl9BRERSCit2b2lkIGh3bV9jb252X2NhbihzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgaSA7CisKKwlTS19VTlVTRUQoc21jKSA7CisKKwlmb3IgKGkgPSBsZW47IGkgOyBpLS0sIGRhdGErKykgeworCQkqZGF0YSA9IGNhbm9uaWNhbFsqKHVfY2hhciAqKWRhdGFdIDsKKwl9Cit9CisjZW5kaWYKKworI2VuZGlmCS8qIG5vIFNMSU1fU01UICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvc210ZGVmLmMgYi9kcml2ZXJzL25ldC9za2ZwL3NtdGRlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMGM4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL3NtdGRlZi5jCkBAIC0wLDAgKzEsMzYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCVNNVC9DTVQgZGVmYXVsdHMKKyovCisKKyNpbmNsdWRlICJoL3R5cGVzLmgiCisjaW5jbHVkZSAiaC9mZGRpLmgiCisjaW5jbHVkZSAiaC9zbWMuaCIKKworI2lmbmRlZiBPRU1fVVNFUl9EQVRBCisjZGVmaW5lIE9FTV9VU0VSX0RBVEEJIlNLLU5FVCBGRERJIFYyLjAgVXNlcmRhdGEiCisjZW5kaWYKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKXNtdGRlZi5jCTIuNTMgOTkvMDgvMTEgKEMpIFNLICIgOworI2VuZGlmCisKKy8qCisgKiBkZWZhdWx0cworICovCisjZGVmaW5lIFRUTVMoeCkJKCh1X2xvbmcpKHgpKjEwMDBMKQorI2RlZmluZSBUVFMoeCkJKCh1X2xvbmcpKHgpKjEwMDAwMDBMKQorI2RlZmluZSBUVFVTKHgpCSgodV9sb25nKSh4KSkKKworI2RlZmluZSBERUZBVUxUX1RCX01JTgkJVFRNUyg1KQorI2RlZmluZSBERUZBVUxUX1RCX01BWAkJVFRNUyg1MCkKKyNkZWZpbmUgREVGQVVMVF9DX01JTgkJVFRVUygxNjAwKQorI2RlZmluZSBERUZBVUxUX1RfT1VUCQlUVE1TKDEwMCs1KQorI2RlZmluZSBERUZBVUxUX1RMX01JTgkJVFRVUygzMCkKKyNkZWZpbmUgREVGQVVMVF9MQ19TSE9SVAlUVE1TKDUwKzUpCisjZGVmaW5lIERFRkFVTFRfTENfTUVESVVNCVRUTVMoNTAwKzIwKQorI2RlZmluZSBERUZBVUxUX0xDX0xPTkcJCVRUUyg1KStUVE1TKDUwKQorI2RlZmluZSBERUZBVUxUX0xDX0VYVEVOREVECVRUUyg1MCkrVFRNUyg1MCkKKyNkZWZpbmUgREVGQVVMVF9UX05FWFRfOQlUVE1TKDIwMCsxMCkKKyNkZWZpbmUgREVGQVVMVF9OU19NQVgJCVRUVVMoMTMxMCkKKyNkZWZpbmUgREVGQVVMVF9JX01BWAkJVFRNUygyNSkKKyNkZWZpbmUgREVGQVVMVF9JTl9NQVgJCVRUTVMoNDApCisjZGVmaW5lIERFRkFVTFRfVERfTUlOCQlUVE1TKDUpCisjZGVmaW5lIERFRkFVTFRfVF9OT05fT1AJVFRTKDEpCisjZGVmaW5lIERFRkFVTFRfVF9TVFVDSwkJVFRTKDgpCisjZGVmaW5lIERFRkFVTFRfVF9ESVJFQ1QJVFRNUygzNzApCisjZGVmaW5lIERFRkFVTFRfVF9KQU0JCVRUTVMoMzcwKQorI2RlZmluZSBERUZBVUxUX1RfQU5OT1VOQ0UJVFRNUygyNTAwKQorI2RlZmluZSBERUZBVUxUX0RfTUFYCQlUVFVTKDE2MTcpCisjZGVmaW5lIERFRkFVTFRfTEVNX0FMQVJNCSg4KQorI2RlZmluZSBERUZBVUxUX0xFTV9DVVRPRkYJKDcpCisjZGVmaW5lIERFRkFVTFRfVEVTVF9ET05FCVRUUygxKQorI2RlZmluZSBERUZBVUxUX0NIRUNLX1BPTEwJVFRTKDEpCisjZGVmaW5lIERFRkFVTFRfUE9MTAkJVFRNUyg1MCkKKworLyoKKyAqIExDVCBlcnJvcnMgdGhyZXNob2xkCisgKi8KKyNkZWZpbmUgREVGQVVMVF9MQ1RfU0hPUlQJMQorI2RlZmluZSBERUZBVUxUX0xDVF9NRURJVU0JMworI2RlZmluZSBERUZBVUxUX0xDVF9MT05HCTUKKyNkZWZpbmUgREVGQVVMVF9MQ1RfRVhURU5ECTUwCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCit2b2lkIHNtdF9yZXNldF9kZWZhdWx0cyhzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGxldmVsKTsKK3N0YXRpYyB2b2lkIHNtdF9pbml0X21pYihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGxldmVsKTsKK3N0YXRpYyBpbnQgc2V0X21pbl9tYXgoaW50IG1heGZsYWcsIHVfbG9uZyBtaWIsIHVfbG9uZyBsaW1pdCwgdV9sb25nICpvcGVyKTsKKwordm9pZCBzbXRfc2V0X2RlZmF1bHRzKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXNtdF9yZXNldF9kZWZhdWx0cyhzbWMsMCkgOworfQorCisjZGVmaW5lIE1TMkJDTEsoeCkJKCh4KSoxMjUwMEwpCisjZGVmaW5lIFVTMkJDTEsoeCkJKCh4KSoxMjUwTCkKKwordm9pZCBzbXRfcmVzZXRfZGVmYXVsdHMoc3RydWN0IHNfc21jICpzbWMsIGludCBsZXZlbCkKK3sKKwlzdHJ1Y3Qgc210X2NvbmZpZwkqc210IDsKKwlpbnQJCQlpIDsKKwl1X2xvbmcJCQlzbXRfYm9vdF90aW1lOworCisKKwlzbXRfaW5pdF9taWIoc21jLGxldmVsKSA7CisKKwlzbWMtPm9zLnNtY192ZXJzaW9uID0gU01DX1ZFUlNJT04gOworCXNtdF9ib290X3RpbWUgPSBzbXRfZ2V0X3RpbWUoKTsKKwlmb3IoIGkgPSAwOyBpIDwgTlVNTUFDUzsgaSsrICkKKwkJc21jLT5zbS5sYXN0X3Rva190aW1lW2ldID0gc210X2Jvb3RfdGltZSA7CisJc210ID0gJnNtYy0+cyA7CisJc210LT5hdHRhY2hfcyA9IDAgOworCXNtdC0+YnVpbGRfcmluZ19tYXAgPSAxIDsKKwlzbXQtPnNhcyA9IFNNVF9EQVMgOworCXNtdC0+bnVtcGh5cyA9IE5VTVBIWVMgOworCXNtdC0+cGNtX3RiX21pbiA9IERFRkFVTFRfVEJfTUlOIDsKKwlzbXQtPnBjbV90Yl9tYXggPSBERUZBVUxUX1RCX01BWCA7CisJc210LT5wY21fY19taW4gPSBERUZBVUxUX0NfTUlOIDsKKwlzbXQtPnBjbV90X291dCA9IERFRkFVTFRfVF9PVVQgOworCXNtdC0+cGNtX3RsX21pbiA9IERFRkFVTFRfVExfTUlOIDsKKwlzbXQtPnBjbV9sY19zaG9ydCA9IERFRkFVTFRfTENfU0hPUlQgOworCXNtdC0+cGNtX2xjX21lZGl1bSA9IERFRkFVTFRfTENfTUVESVVNIDsKKwlzbXQtPnBjbV9sY19sb25nID0gREVGQVVMVF9MQ19MT05HIDsKKwlzbXQtPnBjbV9sY19leHRlbmRlZCA9IERFRkFVTFRfTENfRVhURU5ERUQgOworCXNtdC0+cGNtX3RfbmV4dF85ID0gREVGQVVMVF9UX05FWFRfOSA7CisJc210LT5wY21fbnNfbWF4ID0gREVGQVVMVF9OU19NQVggOworCXNtdC0+ZWNtX2lfbWF4ID0gREVGQVVMVF9JX01BWCA7CisJc210LT5lY21faW5fbWF4ID0gREVGQVVMVF9JTl9NQVggOworCXNtdC0+ZWNtX3RkX21pbiA9IERFRkFVTFRfVERfTUlOIDsKKwlzbXQtPmVjbV90ZXN0X2RvbmUgPSBERUZBVUxUX1RFU1RfRE9ORSA7CisJc210LT5lY21fY2hlY2tfcG9sbCA9IERFRkFVTFRfQ0hFQ0tfUE9MTCA7CisJc210LT5ybXRfdF9ub25fb3AgPSBERUZBVUxUX1RfTk9OX09QIDsKKwlzbXQtPnJtdF90X3N0dWNrID0gREVGQVVMVF9UX1NUVUNLIDsKKwlzbXQtPnJtdF90X2RpcmVjdCA9IERFRkFVTFRfVF9ESVJFQ1QgOworCXNtdC0+cm10X3RfamFtID0gREVGQVVMVF9UX0pBTSA7CisJc210LT5ybXRfdF9hbm5vdW5jZSA9IERFRkFVTFRfVF9BTk5PVU5DRSA7CisJc210LT5ybXRfdF9wb2xsID0gREVGQVVMVF9QT0xMIDsKKyAgICAgICAgc210LT5ybXRfZHVwX21hY19iZWhhdmlvciA9IEZBTFNFIDsgIC8qIFNlZSBTdHJ1Y3Qgc210X2NvbmZpZyAqLworCXNtdC0+bWFjX2RfbWF4ID0gREVGQVVMVF9EX01BWCA7CisKKwlzbXQtPmxjdF9zaG9ydCA9IERFRkFVTFRfTENUX1NIT1JUIDsKKwlzbXQtPmxjdF9tZWRpdW0gPSBERUZBVUxUX0xDVF9NRURJVU0gOworCXNtdC0+bGN0X2xvbmcgPSBERUZBVUxUX0xDVF9MT05HIDsKKwlzbXQtPmxjdF9leHRlbmRlZCA9IERFRkFVTFRfTENUX0VYVEVORCA7CisKKyNpZm5kZWYJU0xJTV9TTVQKKyNpZmRlZglFU1MKKwlpZiAobGV2ZWwgPT0gMCkgeworCQlzbWMtPmVzcy5zeW5jX2J3X2F2YWlsYWJsZSA9IEZBTFNFIDsKKwkJc21jLT5taWIuZmRkaUVTU1BheWxvYWQgPSAwIDsKKwkJc21jLT5taWIuZmRkaUVTU092ZXJoZWFkID0gMCA7CisJCXNtYy0+bWliLmZkZGlFU1NNYXhUTmVnID0gKHVfbG9uZykoLSBNUzJCQ0xLKDI1KSkgOworCQlzbWMtPm1pYi5mZGRpRVNTTWluU2VnbWVudFNpemUgPSAxIDsKKwkJc21jLT5taWIuZmRkaUVTU0NhdGVnb3J5ID0gU0JfU1RBVElDIDsKKwkJc21jLT5taWIuZmRkaUVTU1N5bmNoVHhNb2RlID0gRkFMU0UgOworCQlzbWMtPmVzcy5yYWZfYWN0X3RpbWVyX3BvbGwgPSBGQUxTRSA7CisJCXNtYy0+ZXNzLnRpbWVyX2NvdW50ID0gNyA7IAkvKiBmaXJzdCBSQUYgYWxjIHJlcSBhZnRlciAzcyAqLworCX0KKwlzbWMtPmVzcy5sb2NhbF9zYmFfYWN0aXZlID0gRkFMU0UgOworCXNtYy0+ZXNzLnNiYV9yZXBseV9wZW5kID0gTlVMTCA7CisjZW5kaWYKKyNpZmRlZglTQkEKKwlzbXRfaW5pdF9zYmEoc21jLGxldmVsKSA7CisjZW5kaWYKKyNlbmRpZgkvKiBubyBTTElNX1NNVCAqLworI2lmZGVmCVRBR19NT0RFCisJaWYgKGxldmVsID09IDApIHsKKwkJc21jLT5ody5wY2lfZml4X3ZhbHVlID0gMCA7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBtYW51ZmFjdHVyZXIgZGF0YQorICovCitzdGF0aWMgY29uc3QgY2hhciBtYW5fZGF0YVszMl0gPQorLyoJIDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxCSovCisJInh4eFNLLU5FVCBGRERJIFNNVCA3LjMgLSBWMi44LjgiIDsKKworc3RhdGljIHZvaWQgc210X2luaXRfbWliKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbGV2ZWwpCit7CisJc3RydWN0IGZkZGlfbWliCQkqbWliIDsKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqcG0gOworCWludAkJCXBvcnQgOworCWludAkJCXBhdGggOworCisJbWliID0gJnNtYy0+bWliIDsKKwlpZiAobGV2ZWwgPT0gMCkgeworCQkvKgorCQkgKiBzZXQgRVZFUllUSElORyB0byBaRVJPCisJCSAqIEVYQ0VQVCBodyBhbmQgb3MKKwkJICovCisJCW1lbXNldCgoKGNoYXIgKilzbWMpKworCQkJc2l6ZW9mKHN0cnVjdCBzX3NtdF9vcykrc2l6ZW9mKHN0cnVjdCBzX3NtdF9odyksIDAsCisJCQlzaXplb2Yoc3RydWN0IHNfc21jKSAtCisJCQlzaXplb2Yoc3RydWN0IHNfc210X29zKSAtIHNpemVvZihzdHJ1Y3Qgc19zbXRfaHcpKSA7CisJfQorCWVsc2UgeworCQltaWItPmZkZGlTTVRSZW1vdGVEaXNjb25uZWN0RmxhZyA9IDAgOworCQltaWItPmZkZGlTTVRQZWVyV3JhcEZsYWcgPSAwIDsKKwl9CisKKwltaWItPmZkZGlTTVRPcFZlcnNpb25JZCA9IDIgOworCW1pYi0+ZmRkaVNNVEhpVmVyc2lvbklkID0gMiA7CisJbWliLT5mZGRpU01UTG9WZXJzaW9uSWQgPSAyIDsKKwltZW1jcHkoKGNoYXIgKikgbWliLT5mZGRpU01UTWFudWZhY3R1cmVyRGF0YSxtYW5fZGF0YSwzMikgOworCWlmIChsZXZlbCA9PSAwKSB7CisJCXN0cmNweShtaWItPmZkZGlTTVRVc2VyRGF0YSxPRU1fVVNFUl9EQVRBKSA7CisJfQorCW1pYi0+ZmRkaVNNVE1JQlZlcnNpb25JZCA9IDEgOworCW1pYi0+ZmRkaVNNVE1hY19DdCA9IE5VTU1BQ1MgOworCW1pYi0+ZmRkaVNNVENvbm5lY3Rpb25Qb2xpY3kgPSBQT0xJQ1lfTU0gfCBQT0xJQ1lfQUEgfCBQT0xJQ1lfQkIgOworCisJLyoKKwkgKiBmZGRpU01UTm9uTWFzdGVyX0N0IGFuZCBmZGRpU01UTWFzdGVyX0N0IGFyZSBzZXQgaW4gc210X2ZpeHVwX21pYgorCSAqIHMuc2FzIGlzIG5vdCBzZXQgeWV0IChpcyBzZXQgaW4gaW5pdCBkcml2ZXIpCisJICovCisJbWliLT5mZGRpU01UQXZhaWxhYmxlUGF0aHMgPSBNSUJfUEFUSF9QIHwgTUlCX1BBVEhfUyA7CisKKwltaWItPmZkZGlTTVRDb25maWdDYXBhYmlsaXRpZXMgPSAwIDsJLyogbm8gaG9sZCxubyB3cmFwX2FiKi8KKwltaWItPmZkZGlTTVRUVF9Ob3RpZnkgPSAxMCA7CisJbWliLT5mZGRpU01UU3RhdFJwdFBvbGljeSA9IFRSVUUgOworCW1pYi0+ZmRkaVNNVFRyYWNlX01heEV4cGlyYXRpb24gPSBTRUMyTUlCKDcpIDsKKwltaWItPmZkZGlTTVRNQUNJbmRleGVzID0gSU5ERVhfTUFDIDsKKwltaWItPmZkZGlTTVRTdGF0aW9uU3RhdHVzID0gTUlCX1NNVF9TVEFTVEFfU0VQQSA7CS8qIHNlcGFyYXRlZCAqLworCisJbWliLT5tW01BQzBdLmZkZGlNQUNJbmRleCA9IElOREVYX01BQyA7CisJbWliLT5tW01BQzBdLmZkZGlNQUNGcmFtZVN0YXR1c0Z1bmN0aW9ucyA9IEZTQ19UWVBFMCA7CisJbWliLT5tW01BQzBdLmZkZGlNQUNSZXF1ZXN0ZWRQYXRocyA9CisJCU1JQl9QX1BBVEhfTE9DQUwgfAorCQlNSUJfUF9QQVRIX1NFQ19BTFRFUiB8CisJCU1JQl9QX1BBVEhfUFJJTV9BTFRFUiA7CisJbWliLT5tW01BQzBdLmZkZGlNQUNBdmFpbGFibGVQYXRocyA9IE1JQl9QQVRIX1AgOworCW1pYi0+bVtNQUMwXS5mZGRpTUFDQ3VycmVudFBhdGggPSBNSUJfUEFUSF9QUklNQVJZIDsKKwltaWItPm1bTUFDMF0uZmRkaU1BQ1RfTWF4Q2FwYWJpbGl0aXkgPSAodV9sb25nKSgtIE1TMkJDTEsoMTY1KSkgOworCW1pYi0+bVtNQUMwXS5mZGRpTUFDVFZYQ2FwYWJpbGl0aXkgPSAodV9sb25nKSgtIFVTMkJDTEsoNTIpKSA7CisJaWYgKGxldmVsID09IDApIHsKKwkJbWliLT5tW01BQzBdLmZkZGlNQUNUdnhWYWx1ZSA9ICh1X2xvbmcpKC0gVVMyQkNMSygyNykpIDsKKwkJbWliLT5tW01BQzBdLmZkZGlNQUNUdnhWYWx1ZU1JQiA9ICh1X2xvbmcpKC0gVVMyQkNMSygyNykpIDsKKwkJbWliLT5tW01BQzBdLmZkZGlNQUNUX1JlcSA9ICh1X2xvbmcpKC0gTVMyQkNMSygxNjUpKSA7CisJCW1pYi0+bVtNQUMwXS5mZGRpTUFDVF9SZXFNSUIgPSAodV9sb25nKSgtIE1TMkJDTEsoMTY1KSkgOworCQltaWItPm1bTUFDMF0uZmRkaU1BQ1RfTWF4ID0gKHVfbG9uZykoLSBNUzJCQ0xLKDE2NSkpIDsKKwkJbWliLT5tW01BQzBdLmZkZGlNQUNUX01heE1JQiA9ICh1X2xvbmcpKC0gTVMyQkNMSygxNjUpKSA7CisJCW1pYi0+bVtNQUMwXS5mZGRpTUFDVF9NaW4gPSAodV9sb25nKSgtIE1TMkJDTEsoNCkpIDsKKwl9CisJbWliLT5tW01BQzBdLmZkZGlNQUNIYXJkd2FyZVByZXNlbnQgPSBUUlVFIDsKKwltaWItPm1bTUFDMF0uZmRkaU1BQ01BX1VuaXRkYXRhRW5hYmxlID0gVFJVRSA7CisJbWliLT5tW01BQzBdLmZkZGlNQUNGcmFtZUVycm9yVGhyZXNob2xkID0gMSA7CisJbWliLT5tW01BQzBdLmZkZGlNQUNOb3RDb3BpZWRUaHJlc2hvbGQgPSAxIDsKKwkvKgorCSAqIFBhdGggYXR0cmlidXRlcworCSAqLworCWZvciAocGF0aCA9IDAgOyBwYXRoIDwgTlVNUEFUSFMgOyBwYXRoKyspIHsKKwkJbWliLT5hW3BhdGhdLmZkZGlQQVRISW5kZXggPSBJTkRFWF9QQVRIICsgcGF0aCA7CisJCWlmIChsZXZlbCA9PSAwKSB7CisJCQltaWItPmFbcGF0aF0uZmRkaVBBVEhUVlhMb3dlckJvdW5kID0KKwkJCQkodV9sb25nKSgtIFVTMkJDTEsoMjcpKSA7CisJCQltaWItPmFbcGF0aF0uZmRkaVBBVEhUX01heExvd2VyQm91bmQgPQorCQkJCSh1X2xvbmcpKC0gTVMyQkNMSygxNjUpKSA7CisJCQltaWItPmFbcGF0aF0uZmRkaVBBVEhNYXhUX1JlcSA9CisJCQkJKHVfbG9uZykoLSBNUzJCQ0xLKDE2NSkpIDsKKwkJfQorCX0KKworCisJLyoKKwkgKiBQb3J0IGF0dHJpYnV0ZXMKKwkgKi8KKwlwbSA9IG1pYi0+cCA7CisJZm9yIChwb3J0ID0gMCA7IHBvcnQgPCAgTlVNUEhZUyA7IHBvcnQrKykgeworCQkvKgorCQkgKiBzZXQgTUlCIHBvaW50ZXIgaW4gcGh5CisJCSAqLworCQkvKiBBdHRlbnRpb246IGRvbid0IGluaXRpYWxpemUgbWliIHBvaW50ZXIgaGVyZSEgKi8KKwkJLyogIEl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgZHVyaW5nIHBoYXNlIDIgKi8KKwkJc21jLT55W3BvcnRdLm1pYiA9IE5VTEw7CisJCW1pYi0+ZmRkaVNNVFBPUlRJbmRleGVzW3BvcnRdID0gcG9ydCtJTkRFWF9QT1JUIDsKKworCQlwbS0+ZmRkaVBPUlRJbmRleCA9IHBvcnQrSU5ERVhfUE9SVCA7CisJCXBtLT5mZGRpUE9SVEhhcmR3YXJlUHJlc2VudCA9IFRSVUUgOworCQlpZiAobGV2ZWwgPT0gMCkgeworCQkJcG0tPmZkZGlQT1JUTGVyX0FsYXJtID0gREVGQVVMVF9MRU1fQUxBUk0gOworCQkJcG0tPmZkZGlQT1JUTGVyX0N1dG9mZiA9IERFRkFVTFRfTEVNX0NVVE9GRiA7CisJCX0KKwkJLyoKKwkJICogZmRkaVBPUlRSZXF1ZXN0ZWRQYXRocyBhcmUgc2V0IGluIHBjbXBsYy5jCisJCSAqIHdlIGRvbid0IGtub3cgdGhlIHBvcnQgdHlwZSB5ZXQgIQorCQkgKi8KKwkJcG0tPmZkZGlQT1JUUmVxdWVzdGVkUGF0aHNbMV0gPSAwIDsKKwkJcG0tPmZkZGlQT1JUUmVxdWVzdGVkUGF0aHNbMl0gPSAwIDsKKwkJcG0tPmZkZGlQT1JUUmVxdWVzdGVkUGF0aHNbM10gPSAwIDsKKwkJcG0tPmZkZGlQT1JUQXZhaWxhYmxlUGF0aHMgPSBNSUJfUEFUSF9QIDsKKwkJcG0tPmZkZGlQT1JUUE1EQ2xhc3MgPSBNSUJfUE1EQ0xBU1NfTVVMVEkgOworCQlwbSsrIDsKKwl9CisKKwkodm9pZCkgc210X3NldF9tYWNfb3B2YWx1ZXMoc21jKSA7Cit9CisKK2ludCBzbXRfc2V0X21hY19vcHZhbHVlcyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlpbnQJc3QgOworCWludAlzdDIgOworCisJc3QgPSBzZXRfbWluX21heCgxLHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1R2eFZhbHVlTUlCLAorCQlzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFRWWExvd2VyQm91bmQsCisJCSZzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUdnhWYWx1ZSkgOworCXN0IHw9IHNldF9taW5fbWF4KDAsc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVF9NYXhNSUIsCisJCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIVF9NYXhMb3dlckJvdW5kLAorCQkmc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVF9NYXgpIDsKKwlzdCB8PSAoc3QyID0gc2V0X21pbl9tYXgoMCxzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUX1JlcU1JQiwKKwkJc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhNYXhUX1JlcSwKKwkJJnNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1RfUmVxKSkgOworCWlmIChzdDIpIHsKKwkJLyogVHJlcSBhdHRyaWJ1dGUgY2hhbmdlZCByZW1vdGVseS4gU28gc2VuZCBhbiBBSVhfRVZFTlQgdG8gdGhlCisJCSAqIHVzZXIKKwkJICovCisJCUFJWF9FVkVOVChzbWMsICh1X2xvbmcpIEZERElfUklOR19TVEFUVVMsICh1X2xvbmcpCisJCQlGRERJX1NNVF9FVkVOVCwgKHVfbG9uZykgRkRESV9SRU1PVEVfVF9SRVEsCisJCQlzbXRfZ2V0X2V2ZW50X3dvcmQoc21jKSk7CisJfQorCXJldHVybihzdCkgOworfQorCit2b2lkIHNtdF9maXh1cF9taWIoc3RydWN0IHNfc21jICpzbWMpCit7CisjaWZkZWYJQ09OQ0VOVFJBVE9SCisJc3dpdGNoIChzbWMtPnMuc2FzKSB7CisJY2FzZSBTTVRfU0FTIDoKKwkJc21jLT5taWIuZmRkaVNNVE5vbk1hc3Rlcl9DdCA9IDEgOworCQlicmVhayA7CisJY2FzZSBTTVRfREFTIDoKKwkJc21jLT5taWIuZmRkaVNNVE5vbk1hc3Rlcl9DdCA9IDIgOworCQlicmVhayA7CisJY2FzZSBTTVRfTkFDIDoKKwkJc21jLT5taWIuZmRkaVNNVE5vbk1hc3Rlcl9DdCA9IDAgOworCQlicmVhayA7CisJfQorCXNtYy0+bWliLmZkZGlTTVRNYXN0ZXJfQ3QgPSBOVU1QSFlTIC0gc21jLT5taWIuZmRkaVNNVE5vbk1hc3Rlcl9DdCA7CisjZWxzZQorCXN3aXRjaCAoc21jLT5zLnNhcykgeworCWNhc2UgU01UX1NBUyA6CisJCXNtYy0+bWliLmZkZGlTTVROb25NYXN0ZXJfQ3QgPSAxIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX0RBUyA6CisJCXNtYy0+bWliLmZkZGlTTVROb25NYXN0ZXJfQ3QgPSAyIDsKKwkJYnJlYWsgOworCX0KKwlzbWMtPm1pYi5mZGRpU01UTWFzdGVyX0N0ID0gMCA7CisjZW5kaWYKK30KKworLyoKKyAqIGRldGVybWluZSBuZXcgc2V0dGluZyBmb3Igb3BlcmF0aW9uYWwgdmFsdWUKKyAqIGlmIGxpbWl0IGlzIGxvd2VyIHRoYW4gbWliCisgKgl1c2UgbGltaXQKKyAqIGVsc2UKKyAqCXVzZSBtaWIKKyAqIE5PVEUgOiBudW1iZXJzIGFyZSBuZWdhdGl2ZSwgbmVnYXRlIGNvbXBhcmlzb24gIQorICovCitzdGF0aWMgaW50IHNldF9taW5fbWF4KGludCBtYXhmbGFnLCB1X2xvbmcgbWliLCB1X2xvbmcgbGltaXQsIHVfbG9uZyAqb3BlcikKK3sKKwl1X2xvbmcJb2xkIDsKKwlvbGQgPSAqb3BlciA7CisJaWYgKChsaW1pdCA+IG1pYikgXiBtYXhmbGFnKQorCQkqb3BlciA9IGxpbWl0IDsKKwllbHNlCisJCSpvcGVyID0gbWliIDsKKwlyZXR1cm4ob2xkICE9ICpvcGVyKSA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvc210aW5pdC5jIGIvZHJpdmVycy9uZXQvc2tmcC9zbXRpbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4OTY0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvc210aW5pdC5jCkBAIC0wLDAgKzEsMTI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCUluaXQgU01UCisJY2FsbCBhbGwgbW9kdWxlIGxldmVsIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzCisqLworCisjaW5jbHVkZSAiaC90eXBlcy5oIgorI2luY2x1ZGUgImgvZmRkaS5oIgorI2luY2x1ZGUgImgvc21jLmgiCisKKyNpZm5kZWYJbGludAorc3RhdGljIGNvbnN0IGNoYXIgSURfc2Njc1tdID0gIkAoIylzbXRpbml0LmMJMS4xNSA5Ny8wNS8wNiAoQykgU0sgIiA7CisjZW5kaWYKKwordm9pZCBpbml0X2ZkZGlfZHJpdmVyKHN0cnVjdCBzX3NtYyAqc21jLCB1X2NoYXIgKm1hY19hZGRyKTsKKworLyogZGVmaW5lIGdsb2JhbCBkZWJ1ZyB2YXJpYWJsZSAqLworI2lmIGRlZmluZWQoREVCVUcpICYmICFkZWZpbmVkKERFQlVHX0JSRCkKK3N0cnVjdCBzbXRfZGVidWcgZGVidWc7CisjZW5kaWYKKworI2lmbmRlZiBNVUxUX09FTQorI2RlZmluZSBPRU1JRChzbWMsaSkJb2VtX2lkW2ldCisJZXh0ZXJuIHVfY2hhcglvZW1faWRbXSA7CisjZWxzZQkvKiBNVUxUX09FTSAqLworI2RlZmluZSBPRU1JRChzbWMsaSkJc21jLT5ody5vZW1faWQtPm9pX21hcmtbaV0KKwlleHRlcm4gc3RydWN0IHNfb2VtX2lkcwlvZW1faWRzW10gOworI2VuZGlmCS8qIE1VTFRfT0VNICovCisKKy8qCisgKiBTZXQgT0VNIHNwZWNpZmljIHZhbHVlcworICoKKyAqIENhbiBub3QgYmUgY2FsbGVkIGluIHNtdF9yZXNldF9kZWZhdWx0cywgYmVjYXVzZSBpdCBpcyBub3Qgc3VyZSB0aGF0CisgKiB0aGUgT0VNIElEIGlzIGFscmVhZHkgZGVmaW5lZC4KKyAqLworc3RhdGljIHZvaWQgc2V0X29lbV9zcGVjX3ZhbChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3QgZmRkaV9taWIgKm1pYiA7CisKKwltaWIgPSAmc21jLT5taWIgOworCisJLyoKKwkgKiBzZXQgSUJNIHNwZWNpZmljIHZhbHVlcworCSAqLworCWlmIChPRU1JRChzbWMsMCkgPT0gJ0knKSB7CisJCW1pYi0+ZmRkaVNNVENvbm5lY3Rpb25Qb2xpY3kgPSBQT0xJQ1lfTU0gOworCX0KK30KKworLyoKKyAqIEluaXQgU01UCisgKi8KK2ludCBpbml0X3NtdChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9jaGFyICptYWNfYWRkcikKKy8qIHVfY2hhciAqbWFjX2FkZHI7CWNhbm9uaWNhbCBhZGRyZXNzIG9yIE5VTEwgKi8KK3sKKwlpbnQJcCA7CisKKyNpZiBkZWZpbmVkKERFQlVHKSAmJiAhZGVmaW5lZChERUJVR19CUkQpCisJZGVidWcuZF9zbXQgPSAwIDsKKwlkZWJ1Zy5kX3NtdGYgPSAwIDsKKwlkZWJ1Zy5kX3JtdCA9IDAgOworCWRlYnVnLmRfZWNtID0gMCA7CisJZGVidWcuZF9wY20gPSAwIDsKKwlkZWJ1Zy5kX2NmbSA9IDAgOworCisJZGVidWcuZF9wbGMgPSAwIDsKKyNpZmRlZglFU1MKKwlkZWJ1Zy5kX2VzcyA9IDAgOworI2VuZGlmCisjaWZkZWYJU0JBCisJZGVidWcuZF9zYmEgPSAwIDsKKyNlbmRpZgorI2VuZGlmCS8qIERFQlVHICYmICFERUJVR19CUkQgKi8KKworCS8qIEZpcnN0IGluaXRpYWxpemUgdGhlIHBvcnRzIG1pYi0+cG9pbnRlcnMgKi8KKwlmb3IgKCBwID0gMDsgcCA8IE5VTVBIWVM7IHAgKysgKSB7CisJCXNtYy0+eVtwXS5taWIgPSAmIHNtYy0+bWliLnBbcF0gOworCX0KKworCXNldF9vZW1fc3BlY192YWwoc21jKSA7CQorCSh2b2lkKSBzbXRfc2V0X21hY19vcHZhbHVlcyhzbWMpIDsKKwlpbml0X2ZkZGlfZHJpdmVyKHNtYyxtYWNfYWRkcikgOwkvKiBIVyBkcml2ZXIgKi8KKwlzbXRfZml4dXBfbWliKHNtYykgOwkJLyogdXBkYXRlIHZhbHVlcyB0aGF0IGRlcGVuZCBvbiBzLnNhcyAqLworCisJZXZfaW5pdChzbWMpIDsJCQkvKiBldmVudCBxdWV1ZSAqLworI2lmbmRlZglTTElNX1NNVAorCXNtdF9pbml0X2V2YyhzbWMpIDsJCS8qIGV2Y3MgaW4gTUlCICovCisjZW5kaWYJLyogbm8gU0xJTV9TTVQgKi8KKwlzbXRfdGltZXJfaW5pdChzbWMpIDsJCS8qIHRpbWVyIHBhY2thZ2UgKi8KKwlzbXRfYWdlbnRfaW5pdChzbWMpIDsJCS8qIFNNVCBmcmFtZSBtYW5hZ2VyICovCisKKwlwY21faW5pdChzbWMpIDsJCQkvKiBQQ00gc3RhdGUgbWFjaGluZSAqLworCWVjbV9pbml0KHNtYykgOwkJCS8qIEVDTSBzdGF0ZSBtYWNoaW5lICovCisJY2ZtX2luaXQoc21jKSA7CQkJLyogQ0ZNIHN0YXRlIG1hY2hpbmUgKi8KKwlybXRfaW5pdChzbWMpIDsJCQkvKiBSTVQgc3RhdGUgbWFjaGluZSAqLworCisJZm9yIChwID0gMCA7IHAgPCBOVU1QSFlTIDsgcCsrKSB7CisJCXBjbShzbWMscCwwKSA7CQkvKiBQQ00gQSBzdGF0ZSBtYWNoaW5lICovCisJfQorCWVjbShzbWMsMCkgOwkJCS8qIEVDTSBzdGF0ZSBtYWNoaW5lICovCisJY2ZtKHNtYywwKSA7CQkJLyogQ0ZNIHN0YXRlIG1hY2hpbmUgKi8KKwlybXQoc21jLDApIDsJCQkvKiBSTVQgc3RhdGUgbWFjaGluZSAqLworCisJc210X2FnZW50X3Rhc2soc21jKSA7CQkvKiBOSUYgRlNNIGV0YyAqLworCisgICAgICAgIFBOTUlfSU5JVChzbWMpIDsgICAgICAgICAgICAgICAgLyogUE5NSSBpbml0aWFsaXphdGlvbiAqLworCisJcmV0dXJuKDApIDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9zbXRwYXJzZS5jIGIvZHJpdmVycy9uZXQvc2tmcC9zbXRwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Nzc5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL3NtdHBhcnNlLmMKQEAgLTAsMCArMSw0NjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglTZWUgdGhlIGZpbGUgInNrZmRkaS5jIiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKwlwYXJzZXIgZm9yIFNNVCBwYXJhbWV0ZXJzCisqLworCisjaW5jbHVkZSAiaC90eXBlcy5oIgorI2luY2x1ZGUgImgvZmRkaS5oIgorI2luY2x1ZGUgImgvc21jLmgiCisjaW5jbHVkZSAiaC9zbXRfcC5oIgorCisjZGVmaW5lIEtFUk5FTAorI2luY2x1ZGUgImgvc210c3RhdGUuaCIKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKXNtdHBhcnNlLmMJMS4xMiA5OC8xMC8wNiAoQykgU0sgIiA7CisjZW5kaWYKKworI2lmZGVmCXN1bgorI2RlZmluZSBfZmFyCisjZW5kaWYKKworLyoKKyAqIGNvbnZlcnQgdG8gQkNMSyB1bml0cworICovCisjZGVmaW5lIE1TMkJDTEsoeCkgICAgICAoKHgpKjEyNTAwTCkKKyNkZWZpbmUgVVMyQkNMSyh4KSAgICAgICgoeC8xMCkqMTI1TCkKKworLyoKKyAqIHBhcmFtZXRlciB0YWJsZQorICovCitzdGF0aWMgc3RydWN0IHNfcHRhYiB7CisJY2hhcgkqcHRfbmFtZSA7CisJdV9zaG9ydAlwdF9udW0gOworCXVfc2hvcnQJcHRfdHlwZSA7CisJdV9sb25nCXB0X21pbiA7CisJdV9sb25nCXB0X21heCA7Cit9IHB0YWJbXSA9IHsKKwl7ICJQTUZQQVNTV0QiLDAsCTAgfSAsCisJeyAiVVNFUkRBVEEiLDEsCQkwIH0gLAorCXsgIkxFUkNVVE9GRkEiLDIsCTEsCTQsCTE1CX0gLAorCXsgIkxFUkNVVE9GRkIiLDMsCTEsCTQsCTE1CX0gLAorCXsgIkxFUkFMQVJNQSIsNCwJMSwJNCwJMTUJfSAsCisJeyAiTEVSQUxBUk1CIiw1LAkxLAk0LAkxNQl9ICwKKwl7ICJUTUFYIiw2LAkJMSwJNSwJMTY1CX0gLAorCXsgIlRNSU4iLDcsCQkxLAk1LAkxNjUJfSAsCisJeyAiVFJFUSIsOCwJCTEsCTUsCTE2NQl9ICwKKwl7ICJUVlgiLDksCQkxLAkyNTAwLAkxMDAwMAl9ICwKKyNpZmRlZiBFU1MKKwl7ICJTQkFQQVlMT0FEIiwxMCwJMSwJMCwJMTU2Mgl9ICwKKwl7ICJTQkFPVkVSSEVBRCIsMTEsCTEsCTUwLAk1MDAwCX0gLAorCXsgIk1BWFRORUciLDEyLAkJMSwJNSwJMTY1CX0gLAorCXsgIk1JTlNFR01FTlRTSVpFIiwxMywJMSwJMCwJNDQ3OAl9ICwKKwl7ICJTQkFDQVRFR09SWSIsMTQsCTEsCTAsCTB4ZmZmZgl9ICwKKwl7ICJTWU5DSFRYTU9ERSIsMTUsCTAgfSAsCisjZW5kaWYKKyNpZmRlZiBTQkEKKwl7ICJTQkFDT01NQU5EIiwxNiwJMCB9ICwKKwl7ICJTQkFBVkFJTEFCTEUiLDE3LAkxLAkwLAkxMDAJfSAsCisjZW5kaWYKKwl7IE5VTEwgfQorfSA7CisKKy8qIERlZmluZSBtYXhpbXVtIHN0cmluZyBzaXplIGZvciB2YWx1ZXMgYW5kIGtleWJ1ZmZlciAqLworI2RlZmluZSBNQVhfVkFMCTQwCisKKy8qCisgKiBsb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHVfbG9uZyBwYXJzZV9udW0oaW50IHR5cGUsIGNoYXIgX2ZhciAqdmFsdWUsIGNoYXIgKnYsIHVfbG9uZyBtbiwKKwkJCXVfbG9uZyBteCwgaW50IHNjYWxlKTsKK3N0YXRpYyBpbnQgcGFyc2Vfd29yZChjaGFyICpidWYsIGNoYXIgX2ZhciAqdGV4dCk7CisKKyNpZmRlZiBTSU0KKyNkZWZpbmUgREJfTUFJTihhLGIsYykJcHJpbnRmKGEsYixjKQorI2Vsc2UKKyNkZWZpbmUgREJfTUFJTihhLGIsYykKKyNlbmRpZgorCisvKgorICogQkVHSU5fTUFOVUFMX0VOVFJZKCkKKyAqCisgKglpbnQgc210X3BhcnNlX2FyZyhzdHJ1Y3Qgc19zbWMgKixjaGFyIF9mYXIgKmtleXdvcmQsaW50IHR5cGUsCisJCWNoYXIgX2ZhciAqdmFsdWUpCisgKgorICoJcGFyc2UgU01UIHBhcmFtZXRlcgorICoJKmtleXdvcmQKKyAqCQlwb2ludGVyIHRvIGtleXdvcmQsIG11c3QgYmUgXDAsIFxuIG9yIFxyIHRlcm1pbmF0ZWQKKyAqCSp2YWx1ZQlwb2ludGVyIHRvIHZhbHVlLCBlaXRoZXIgY2hhciAqIG9yIHVfbG9uZyAqCisgKgkJaWYgY2hhciAqCisgKgkJCXBvaW50ZXIgdG8gdmFsdWUsIG11c3QgYmUgXDAsIFxuIG9yIFxyIHRlcm1pbmF0ZWQKKyAqCQlpZiB1X2xvbmcgKgorICoJCQljb250YWlucyBiaW5hcnkgdmFsdWUKKyAqCisgKgl0eXBlCTA6IGludGVnZXIKKyAqCQkxOiBzdHJpbmcKKyAqCXJldHVybgorICoJCTAJcGFyYW1ldGVyIHBhcnNlZCBvaworICoJCSE9IDAJZXJyb3IKKyAqCU5PVEU6CisgKgkJZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB3aXRoIERTICE9IFNTCisgKgorICoKKyAqIEVORF9NQU5VQUxfRU5UUlkoKQorICovCitpbnQgc210X3BhcnNlX2FyZyhzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciBfZmFyICprZXl3b3JkLCBpbnQgdHlwZSwKKwkJICBjaGFyIF9mYXIgKnZhbHVlKQoreworCWNoYXIJCWtleWJ1ZltNQVhfVkFMKzFdOworCWNoYXIJCXZhbGJ1ZltNQVhfVkFMKzFdOworCWNoYXIJCWMgOworCWNoYXIgCQkqcCA7CisJY2hhcgkJKnYgOworCWNoYXIJCSpkIDsKKwl1X2xvbmcJCXZhbCA9IDAgOworCXN0cnVjdCBzX3B0YWIJKnB0IDsKKwlpbnQJCXN0IDsKKwlpbnQJCWkgOworCisJLyoKKwkgKiBwYXJzZSBrZXl3b3JkCisJICovCisJaWYgKChzdCA9IHBhcnNlX3dvcmQoa2V5YnVmLGtleXdvcmQpKSkKKwkJcmV0dXJuKHN0KSA7CisJLyoKKwkgKiBwYXJzZSB2YWx1ZSBpZiBnaXZlbiBhcyBzdHJpbmcKKwkgKi8KKwlpZiAodHlwZSA9PSAxKSB7CisJCWlmICgoc3QgPSBwYXJzZV93b3JkKHZhbGJ1Zix2YWx1ZSkpKQorCQkJcmV0dXJuKHN0KSA7CisJfQorCS8qCisJICogc2VhcmNoIGluIHRhYmxlCisJICovCisJc3QgPSAwIDsKKwlmb3IgKHB0ID0gcHRhYiA7ICh2ID0gcHQtPnB0X25hbWUpIDsgcHQrKykgeworCQlmb3IgKHAgPSBrZXlidWYgOyAoYyA9ICpwKSA7IHArKyx2KyspIHsKKwkJCWlmIChjICE9ICp2KQorCQkJCWJyZWFrIDsKKwkJfQorCQlpZiAoIWMgJiYgISp2KQorCQkJYnJlYWsgOworCX0KKwlpZiAoIXYpCisJCXJldHVybigtMSkgOworI2lmCTAKKwlwcmludGYoIj0+JXM8PT0+JXM8PVxuIixwdC0+cHRfbmFtZSx2YWxidWYpIDsKKyNlbmRpZgorCS8qCisJICogc2V0IHZhbHVlIGluIE1JQgorCSAqLworCWlmIChwdC0+cHRfdHlwZSkKKwkJdmFsID0gcGFyc2VfbnVtKHR5cGUsdmFsdWUsdmFsYnVmLHB0LT5wdF9taW4scHQtPnB0X21heCwxKSA7CisJc3dpdGNoIChwdC0+cHRfbnVtKSB7CisJY2FzZSAwIDoKKwkJdiA9IHZhbGJ1ZiA7CisJCWQgPSAoY2hhciAqKSBzbWMtPm1pYi5mZGRpUFJQTUZQYXNzd2QgOworCQlmb3IgKGkgPSAwIDsgaSA8IChzaWduZWQpc2l6ZW9mKHNtYy0+bWliLmZkZGlQUlBNRlBhc3N3ZCkgOyBpKyspCisJCQkqZCsrID0gKnYrKyA7CisJCURCX01BSU4oIlNFVCAlcyA9ICVzXG4iLHB0LT5wdF9uYW1lLHNtYy0+bWliLmZkZGlQUlBNRlBhc3N3ZCkgOworCQlicmVhayA7CisJY2FzZSAxIDoKKwkJdiA9IHZhbGJ1ZiA7CisJCWQgPSAoY2hhciAqKSBzbWMtPm1pYi5mZGRpU01UVXNlckRhdGEgOworCQlmb3IgKGkgPSAwIDsgaSA8IChzaWduZWQpc2l6ZW9mKHNtYy0+bWliLmZkZGlTTVRVc2VyRGF0YSkgOyBpKyspCisJCQkqZCsrID0gKnYrKyA7CisJCURCX01BSU4oIlNFVCAlcyA9ICVzXG4iLHB0LT5wdF9uYW1lLHNtYy0+bWliLmZkZGlTTVRVc2VyRGF0YSkgOworCQlicmVhayA7CisJY2FzZSAyIDoKKwkJc21jLT5taWIucFtQQV0uZmRkaVBPUlRMZXJfQ3V0b2ZmID0gKHVfY2hhcikgdmFsIDsKKwkJREJfTUFJTigiU0VUICVzID0gJWRcbiIsCisJCQlwdC0+cHRfbmFtZSxzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVExlcl9DdXRvZmYpIDsKKwkJYnJlYWsgOworCWNhc2UgMyA6CisJCXNtYy0+bWliLnBbUEJdLmZkZGlQT1JUTGVyX0N1dG9mZiA9ICh1X2NoYXIpIHZhbCA7CisJCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLAorCQkJcHQtPnB0X25hbWUsc21jLT5taWIucFtQQl0uZmRkaVBPUlRMZXJfQ3V0b2ZmKSA7CisJCWJyZWFrIDsKKwljYXNlIDQgOgorCQlzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVExlcl9BbGFybSA9ICh1X2NoYXIpIHZhbCA7CisJCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLAorCQkJcHQtPnB0X25hbWUsc21jLT5taWIucFtQQV0uZmRkaVBPUlRMZXJfQWxhcm0pIDsKKwkJYnJlYWsgOworCWNhc2UgNSA6CisJCXNtYy0+bWliLnBbUEJdLmZkZGlQT1JUTGVyX0FsYXJtID0gKHVfY2hhcikgdmFsIDsKKwkJREJfTUFJTigiU0VUICVzID0gJWRcbiIsCisJCQlwdC0+cHRfbmFtZSxzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVExlcl9BbGFybSkgOworCQlicmVhayA7CisJY2FzZSA2IDoJCQkvKiBUTUFYICovCisJCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLHB0LT5wdF9uYW1lLHZhbCkgOworCQlzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFRfTWF4TG93ZXJCb3VuZCA9CisJCQkodV9sb25nKSAtTVMyQkNMSygobG9uZyl2YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgNyA6CQkJLyogVE1JTiAqLworCQlEQl9NQUlOKCJTRVQgJXMgPSAlZFxuIixwdC0+cHRfbmFtZSx2YWwpIDsKKwkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVF9NaW4gPQorCQkJKHVfbG9uZykgLU1TMkJDTEsoKGxvbmcpdmFsKSA7CisJCWJyZWFrIDsKKwljYXNlIDggOgkJCS8qIFRSRVEgKi8KKwkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7CisJCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRITWF4VF9SZXEgPQorCQkJKHVfbG9uZykgLU1TMkJDTEsoKGxvbmcpdmFsKSA7CisJCWJyZWFrIDsKKwljYXNlIDkgOgkJCS8qIFRWWCAqLworCQlEQl9NQUlOKCJTRVQgJXMgPSAlZCBcbiIscHQtPnB0X25hbWUsdmFsKSA7CisJCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIVFZYTG93ZXJCb3VuZCA9CisJCQkodV9sb25nKSAtVVMyQkNMSygobG9uZyl2YWwpIDsKKwkJYnJlYWsgOworI2lmZGVmCUVTUworCWNhc2UgMTAgOgkJCS8qIFNCQVBBWUxPQUQgKi8KKwkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7CisJCWlmIChzbWMtPm1pYi5mZGRpRVNTUGF5bG9hZCAhPSB2YWwpIHsKKwkJCXNtYy0+ZXNzLnJhZl9hY3RfdGltZXJfcG9sbCA9IFRSVUUgOworCQkJc21jLT5taWIuZmRkaUVTU1BheWxvYWQgPSB2YWwgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIDExIDoJCQkvKiBTQkFPVkVSSEVBRCAqLworCQlEQl9NQUlOKCJTRVQgJXMgPSAlZFxuIixwdC0+cHRfbmFtZSx2YWwpIDsKKwkJc21jLT5taWIuZmRkaUVTU092ZXJoZWFkID0gdmFsIDsKKwkJYnJlYWsgOworCWNhc2UgMTIgOgkJCS8qIE1BWFRORUcgKi8KKwkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7CisJCXNtYy0+bWliLmZkZGlFU1NNYXhUTmVnID0gKHVfbG9uZykgLU1TMkJDTEsoKGxvbmcpdmFsKSA7CisJCWJyZWFrIDsKKwljYXNlIDEzIDoJCQkvKiBNSU5TRUdNRU5UU0laRSAqLworCQlEQl9NQUlOKCJTRVQgJXMgPSAlZFxuIixwdC0+cHRfbmFtZSx2YWwpIDsKKwkJc21jLT5taWIuZmRkaUVTU01pblNlZ21lbnRTaXplID0gdmFsIDsKKwkJYnJlYWsgOworCWNhc2UgMTQgOgkJCS8qIFNCQUNBVEVHT1JZICovCisJCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLHB0LT5wdF9uYW1lLHZhbCkgOworCQlzbWMtPm1pYi5mZGRpRVNTQ2F0ZWdvcnkgPQorCQkJKHNtYy0+bWliLmZkZGlFU1NDYXRlZ29yeSAmIDB4ZmZmZikgfAorCQkJKCh1X2xvbmcpKHZhbCA8PCAxNikpIDsKKwkJYnJlYWsgOworCWNhc2UgMTUgOgkJCS8qIFNZTkNIVFhNT0RFICovCisJCS8qIGRvIG5vdCB1c2UgbWVtY21wKHZhbGJ1ZiwiQUxMIiwzKSBiZWNhdXNlIERTICE9IFNTICovCisJCWlmICh2YWxidWZbMF0gPT0gJ0EnICYmIHZhbGJ1ZlsxXSA9PSAnTCcgJiYgdmFsYnVmWzJdID09ICdMJykgeworCQkJc21jLT5taWIuZmRkaUVTU1N5bmNoVHhNb2RlID0gVFJVRSA7CisJCQlEQl9NQUlOKCJTRVQgJXMgPSAlc1xuIixwdC0+cHRfbmFtZSx2YWxidWYpIDsKKwkJfQorCQkvKiBpZiAoIW1lbWNtcCh2YWxidWYsIlNQTElUIiw1KSkgeyAqLworCQlpZiAodmFsYnVmWzBdID09ICdTJyAmJiB2YWxidWZbMV0gPT0gJ1AnICYmIHZhbGJ1ZlsyXSA9PSAnTCcgJiYKKwkJCXZhbGJ1ZlszXSA9PSAnSScgJiYgdmFsYnVmWzRdID09ICdUJykgeworCQkJREJfTUFJTigiU0VUICVzID0gJXNcbiIscHQtPnB0X25hbWUsdmFsYnVmKSA7CisJCQlzbWMtPm1pYi5mZGRpRVNTU3luY2hUeE1vZGUgPSBGQUxTRSA7CisJCX0KKwkJYnJlYWsgOworI2VuZGlmCisjaWZkZWYJU0JBCisJY2FzZSAxNiA6CQkJLyogU0JBQ09NTUFORCAqLworCQkvKiBpZiAoIW1lbWNtcCh2YWxidWYsIlNUQVJUIiw1KSkgeyAqLworCQlpZiAodmFsYnVmWzBdID09ICdTJyAmJiB2YWxidWZbMV0gPT0gJ1QnICYmIHZhbGJ1ZlsyXSA9PSAnQScgJiYKKwkJCXZhbGJ1ZlszXSA9PSAnUicgJiYgdmFsYnVmWzRdID09ICdUJykgeworCQkJREJfTUFJTigiU0VUICVzID0gJXNcbiIscHQtPnB0X25hbWUsdmFsYnVmKSA7CisJCQlzbWMtPm1pYi5mZGRpU0JBQ29tbWFuZCA9IFNCX1NUQVJUIDsKKwkJfQorCQkvKiBpZiAoIW1lbWNtcCh2YWxidWYsIlNUT1AiLDQpKSB7ICovCisJCWlmICh2YWxidWZbMF0gPT0gJ1MnICYmIHZhbGJ1ZlsxXSA9PSAnVCcgJiYgdmFsYnVmWzJdID09ICdPJyAmJgorCQkJdmFsYnVmWzNdID09ICdQJykgeworCQkJREJfTUFJTigiU0VUICVzID0gJXNcbiIscHQtPnB0X25hbWUsdmFsYnVmKSA7CisJCQlzbWMtPm1pYi5mZGRpU0JBQ29tbWFuZCA9IFNCX1NUT1AgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIDE3IDoJCQkvKiBTQkFBVkFJTEFCTEUgKi8KKwkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7CisJCXNtYy0+bWliLmZkZGlTQkFBdmFpbGFibGUgPSAodV9jaGFyKSB2YWwgOworCQlicmVhayA7CisjZW5kaWYKKwl9CisJcmV0dXJuKDApIDsKK30KKworc3RhdGljIGludCBwYXJzZV93b3JkKGNoYXIgKmJ1ZiwgY2hhciBfZmFyICp0ZXh0KQoreworCWNoYXIJCWMgOworCWNoYXIgCQkqcCA7CisJaW50CQlwX2xlbiA7CisJaW50CQlxdW90ZSA7CisJaW50CQlpIDsKKwlpbnQJCW9rIDsKKworCS8qCisJICogc2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlCisJICovCisJcCA9IGJ1ZiA7CisJZm9yIChpID0gMCA7IGkgPCBNQVhfVkFMIDsgaSsrKQorCQkqcCsrID0gMCA7CisJcCA9IGJ1ZiA7CisJcF9sZW4gPSAwIDsKKwlvayA9IDAgOworCXdoaWxlICggKGMgPSAqdGV4dCsrKSAmJiAoYyAhPSAnXG4nKSAmJiAoYyAhPSAnXHInKSkgeworCQlpZiAoKGMgIT0gJyAnKSAmJiAoYyAhPSAnXHQnKSkgeworCQkJb2sgPSAxIDsKKwkJCWJyZWFrIDsKKwkJfQorCX0KKwlpZiAoIW9rKQorCQlyZXR1cm4oLTEpIDsKKwlpZiAoYyA9PSAnIicpIHsKKwkJcXVvdGUgPSAxIDsKKwl9CisJZWxzZSB7CisJCXF1b3RlID0gMCA7CisJCXRleHQtLSA7CisJfQorCS8qCisJICogcGFyc2UgdmFsYnVmCisJICovCisJb2sgPSAwIDsKKwl3aGlsZSAoIW9rICYmIHBfbGVuIDwgTUFYX1ZBTC0xICYmIChjID0gKnRleHQrKykgJiYgKGMgIT0gJ1xuJykKKwkJJiYgKGMgIT0gJ1xyJykpIHsKKwkJc3dpdGNoIChxdW90ZSkgeworCQljYXNlIDAgOgorCQkJaWYgKChjID09ICcgJykgfHwgKGMgPT0gJ1x0JykgfHwgKGMgPT0gJz0nKSkgeworCQkJCW9rID0gMSA7CisJCQkJYnJlYWsgOworCQkJfQorCQkJKnArKyA9IGMgOworCQkJcF9sZW4rKyA7CisJCQlicmVhayA7CisJCWNhc2UgMiA6CisJCQkqcCsrID0gYyA7CisJCQlwX2xlbisrIDsKKwkJCXF1b3RlID0gMSA7CisJCQlicmVhayA7CisJCWNhc2UgMSA6CisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJyInIDoKKwkJCQlvayA9IDEgOworCQkJCWJyZWFrIDsKKwkJCWNhc2UgJ1xcJyA6CisJCQkJcXVvdGUgPSAyIDsKKwkJCQlicmVhayA7CisJCQlkZWZhdWx0IDoKKwkJCQkqcCsrID0gYyA7CisJCQkJcF9sZW4rKyA7CisJCQl9CisJCX0KKwl9CisJKnArKyA9IDAgOworCWZvciAocCA9IGJ1ZiA7IChjID0gKnApIDsgcCsrKSB7CisJCWlmIChjID49ICdhJyAmJiBjIDw9ICd6JykKKwkJCSpwID0gYyArICdBJyAtICdhJyA7CisJfQorCXJldHVybigwKSA7Cit9CisKK3N0YXRpYyB1X2xvbmcgcGFyc2VfbnVtKGludCB0eXBlLCBjaGFyIF9mYXIgKnZhbHVlLCBjaGFyICp2LCB1X2xvbmcgbW4sCisJCQl1X2xvbmcgbXgsIGludCBzY2FsZSkKK3sKKwl1X2xvbmcJeCA9IDAgOworCWNoYXIJYyA7CisKKwlpZiAodHlwZSA9PSAwKSB7CQkvKiBpbnRlZ2VyICovCisJCXVfbG9uZyBfZmFyCSpsIDsKKwkJdV9sb25nCQl1MSA7CisKKwkJbCA9ICh1X2xvbmcgX2ZhciAqKSB2YWx1ZSA7CisJCXUxID0gKmwgOworCQkvKgorCQkgKiBpZiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUgdGFrZSB0aGUgbG93ZXIgbGltaXQKKwkJICovCisJCWlmICgobG9uZyl1MSA8IDApIHsKKwkJCWlmICgtICgobG9uZyl1MSkgPiAobG9uZykgbXgpIHsKKwkJCQl1MSA9IDAgOworCQkJfQorCQkJZWxzZSB7CisJCQkJdTEgPSAodV9sb25nKSAtICgobG9uZyl1MSkgOworCQkJfQorCQl9CisJCXggPSB1MSA7CisJfQorCWVsc2UgewkJCQkvKiBzdHJpbmcgKi8KKwkJaW50CXNpZ24gPSAwIDsKKworCQlpZiAoKnYgPT0gJy0nKSB7CisJCQlzaWduID0gMSA7CisJCX0KKwkJd2hpbGUgKChjID0gKnYrKykgJiYgKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSB7CisJCQl4ID0geCAqIDEwICsgYyAtICcwJyA7CisJCX0KKwkJaWYgKHNjYWxlID09IDEwKSB7CisJCQl4ICo9IDEwIDsKKwkJCWlmIChjID09ICcuJykgeworCQkJCWlmICgoYyA9ICp2KyspICYmIChjID49ICcwJykgJiYgKGMgPD0gJzknKSkgeworCQkJCQl4ICs9IGMgLSAnMCcgOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoc2lnbikKKwkJCXggPSAodV9sb25nKSAtICgobG9uZyl4KSA7CisJfQorCS8qCisJICogaWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlCisJICoJYW5kIHRoZSBhYnNvbHV0ZSB2YWx1ZSBpcyBvdXRzaWRlIHRoZSBsaW1pdHMKKwkgKgkJdGFrZSB0aGUgbG93ZXIgbGltaXQKKwkgKgllbHNlCisJICoJCXRha2UgdGhlIGFic291dGUgdmFsdWUKKwkgKi8KKwlpZiAoKGxvbmcpeCA8IDApIHsKKwkJaWYgKC0gKChsb25nKXgpID4gKGxvbmcpIG14KSB7CisJCQl4ID0gMCA7CisJCX0KKwkJZWxzZSB7CisJCQl4ID0gKHVfbG9uZykgLSAoKGxvbmcpeCkgOworCQl9CisJfQorCWlmICh4IDwgbW4pCisJCXJldHVybihtbikgOworCWVsc2UgaWYgKHggPiBteCkKKwkJcmV0dXJuKG14KSA7CisJcmV0dXJuKHgpIDsKK30KKworI2lmIDAKK3N0cnVjdAlzX3NtYwlTTUMgOworbWFpbigpCit7CisJY2hhcgkqcCA7CisJY2hhcgkqdiA7CisJY2hhcglidWZbMTAwXSA7CisJaW50CXRvZ2dsZSA9IDAgOworCisJd2hpbGUgKGdldHMoYnVmKSkgeworCQlwID0gYnVmIDsKKwkJd2hpbGUgKCpwICYmICgoKnAgPT0gJyAnKSB8fCAoKnAgPT0gJ1x0JykpKQorCQkJcCsrIDsKKworCQl3aGlsZSAoKnAgJiYgKCgqcCAhPSAnICcpICYmICgqcCAhPSAnXHQnKSkpCisJCQlwKysgOworCisJCXYgPSBwIDsKKwkJd2hpbGUgKCp2ICYmICgoKnYgPT0gJyAnKSB8fCAoKnYgPT0gJ1x0JykpKQorCQkJdisrIDsKKwkJaWYgKCgqdiA+PSAnMCcpICYmICgqdiA8PSAnOScpKSB7CisJCQl0b2dnbGUgPSAhdG9nZ2xlIDsKKwkJCWlmICh0b2dnbGUpIHsKKwkJCQl1X2xvbmcJbCA7CisJCQkJbCA9IGF0b2wodikgOworCQkJCXNtdF9wYXJzZV9hcmcoJlNNQyxidWYsMCwoY2hhciBfZmFyICopJmwpIDsKKwkJCX0KKwkJCWVsc2UKKwkJCQlzbXRfcGFyc2VfYXJnKCZTTUMsYnVmLDEsKGNoYXIgX2ZhciAqKXApIDsKKwkJfQorCQllbHNlIHsKKwkJCXNtdF9wYXJzZV9hcmcoJlNNQyxidWYsMSwoY2hhciBfZmFyICopcCkgOworCQl9CisJfQorCWV4aXQoMCkgOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvc210dGltZXIuYyBiL2RyaXZlcnMvbmV0L3NrZnAvc210dGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzE3OTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9zbXR0aW1lci5jCkBAIC0wLDAgKzEsMTU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCVNNVCB0aW1lcgorKi8KKworI2luY2x1ZGUgImgvdHlwZXMuaCIKKyNpbmNsdWRlICJoL2ZkZGkuaCIKKyNpbmNsdWRlICJoL3NtYy5oIgorCisjaWZuZGVmCWxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIElEX3NjY3NbXSA9ICJAKCMpc210dGltZXIuYwkyLjQgOTcvMDgvMDQgKEMpIFNLICIgOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHRpbWVyX2RvbmUoc3RydWN0IHNfc21jICpzbWMsIGludCByZXN0YXJ0KTsKKwordm9pZCBzbXRfdGltZXJfaW5pdChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzbWMtPnQuc3RfcXVldWUgPSBOVUxMOworCXNtYy0+dC5zdF9mYXN0LnRtX2FjdGl2ZSA9IEZBTFNFIDsKKwlzbWMtPnQuc3RfZmFzdC50bV9uZXh0ID0gTlVMTDsKKwlod3RfaW5pdChzbWMpIDsKK30KKwordm9pZCBzbXRfdGltZXJfc3RvcChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF90aW1lciAqdGltZXIpCit7CisJc3RydWN0IHNtdF90aW1lcgkqKnByZXYgOworCXN0cnVjdCBzbXRfdGltZXIJKnRtIDsKKworCS8qCisJICogcmVtb3ZlIHRpbWVyIGZyb20gcXVldWUKKwkgKi8KKwl0aW1lci0+dG1fYWN0aXZlID0gRkFMU0UgOworCWlmIChzbWMtPnQuc3RfcXVldWUgPT0gdGltZXIgJiYgIXRpbWVyLT50bV9uZXh0KSB7CisJCWh3dF9zdG9wKHNtYykgOworCX0KKwlmb3IgKHByZXYgPSAmc21jLT50LnN0X3F1ZXVlIDsgKHRtID0gKnByZXYpIDsgcHJldiA9ICZ0bS0+dG1fbmV4dCApIHsKKwkJaWYgKHRtID09IHRpbWVyKSB7CisJCQkqcHJldiA9IHRtLT50bV9uZXh0IDsKKwkJCWlmICh0bS0+dG1fbmV4dCkgeworCQkJCXRtLT50bV9uZXh0LT50bV9kZWx0YSArPSB0bS0+dG1fZGVsdGEgOworCQkJfQorCQkJcmV0dXJuIDsKKwkJfQorCX0KK30KKwordm9pZCBzbXRfdGltZXJfc3RhcnQoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfdGltZXIgKnRpbWVyLCB1X2xvbmcgdGltZSwKKwkJICAgICB1X2xvbmcgdG9rZW4pCit7CisJc3RydWN0IHNtdF90aW1lcgkqKnByZXYgOworCXN0cnVjdCBzbXRfdGltZXIJKnRtIDsKKwl1X2xvbmcJCQlkZWx0YSA9IDAgOworCisJdGltZSAvPSAxNiA7CQkvKiBpbnB1dCBpcyB1UywgY2xvY2sgdGlja3MgYXJlIDE2dVMgKi8KKwlpZiAoIXRpbWUpCisJCXRpbWUgPSAxIDsKKwlzbXRfdGltZXJfc3RvcChzbWMsdGltZXIpIDsKKwl0aW1lci0+dG1fc21jID0gc21jIDsKKwl0aW1lci0+dG1fdG9rZW4gPSB0b2tlbiA7CisJdGltZXItPnRtX2FjdGl2ZSA9IFRSVUUgOworCWlmICghc21jLT50LnN0X3F1ZXVlKSB7CisJCXNtYy0+dC5zdF9xdWV1ZSA9IHRpbWVyIDsKKwkJdGltZXItPnRtX25leHQgPSBOVUxMOworCQl0aW1lci0+dG1fZGVsdGEgPSB0aW1lIDsKKwkJaHd0X3N0YXJ0KHNtYyx0aW1lKSA7CisJCXJldHVybiA7CisJfQorCS8qCisJICogdGltZXIgY29ycmVjdGlvbgorCSAqLworCXRpbWVyX2RvbmUoc21jLDApIDsKKworCS8qCisJICogZmluZCBwb3NpdGlvbiBpbiBxdWV1ZQorCSAqLworCWRlbHRhID0gMCA7CisJZm9yIChwcmV2ID0gJnNtYy0+dC5zdF9xdWV1ZSA7ICh0bSA9ICpwcmV2KSA7IHByZXYgPSAmdG0tPnRtX25leHQgKSB7CisJCWlmIChkZWx0YSArIHRtLT50bV9kZWx0YSA+IHRpbWUpIHsKKwkJCWJyZWFrIDsKKwkJfQorCQlkZWx0YSArPSB0bS0+dG1fZGVsdGEgOworCX0KKwkvKiBpbnNlcnQgaW4gcXVldWUgKi8KKwkqcHJldiA9IHRpbWVyIDsKKwl0aW1lci0+dG1fbmV4dCA9IHRtIDsKKwl0aW1lci0+dG1fZGVsdGEgPSB0aW1lIC0gZGVsdGEgOworCWlmICh0bSkKKwkJdG0tPnRtX2RlbHRhIC09IHRpbWVyLT50bV9kZWx0YSA7CisJLyoKKwkgKiBzdGFydCBuZXcgd2l0aCBmaXJzdAorCSAqLworCWh3dF9zdGFydChzbWMsc21jLT50LnN0X3F1ZXVlLT50bV9kZWx0YSkgOworfQorCit2b2lkIHNtdF9mb3JjZV9pcnEoc3RydWN0IHNfc21jICpzbWMpCit7CisJc210X3RpbWVyX3N0YXJ0KHNtYywmc21jLT50LnN0X2Zhc3QsMzJMLCBFVl9UT0tFTihFVkVOVF9TTVQsU01fRkFTVCkpOyAKK30KKwordm9pZCBzbXRfdGltZXJfZG9uZShzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwl0aW1lcl9kb25lKHNtYywxKSA7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX2RvbmUoc3RydWN0IHNfc21jICpzbWMsIGludCByZXN0YXJ0KQoreworCXVfbG9uZwkJCWRlbHRhIDsKKwlzdHJ1Y3Qgc210X3RpbWVyCSp0bSA7CisJc3RydWN0IHNtdF90aW1lcgkqbmV4dCA7CisJc3RydWN0IHNtdF90aW1lcgkqKmxhc3QgOworCWludAkJCWRvbmUgPSAwIDsKKworCWRlbHRhID0gaHd0X3JlYWQoc21jKSA7CisJbGFzdCA9ICZzbWMtPnQuc3RfcXVldWUgOworCXRtID0gc21jLT50LnN0X3F1ZXVlIDsKKwl3aGlsZSAodG0gJiYgIWRvbmUpIHsKKwkJaWYgKGRlbHRhID49IHRtLT50bV9kZWx0YSkgeworCQkJdG0tPnRtX2FjdGl2ZSA9IEZBTFNFIDsKKwkJCWRlbHRhIC09IHRtLT50bV9kZWx0YSA7CisJCQlsYXN0ID0gJnRtLT50bV9uZXh0IDsKKwkJCXRtID0gdG0tPnRtX25leHQgOworCQl9CisJCWVsc2UgeworCQkJdG0tPnRtX2RlbHRhIC09IGRlbHRhIDsKKwkJCWRlbHRhID0gMCA7CisJCQlkb25lID0gMSA7CisJCX0KKwl9CisJKmxhc3QgPSBOVUxMOworCW5leHQgPSBzbWMtPnQuc3RfcXVldWUgOworCXNtYy0+dC5zdF9xdWV1ZSA9IHRtIDsKKworCWZvciAoIHRtID0gbmV4dCA7IHRtIDsgdG0gPSBuZXh0KSB7CisJCW5leHQgPSB0bS0+dG1fbmV4dCA7CisJCXRpbWVyX2V2ZW50KHNtYyx0bS0+dG1fdG9rZW4pIDsKKwl9CisKKwlpZiAocmVzdGFydCAmJiBzbWMtPnQuc3RfcXVldWUpCisJCWh3dF9zdGFydChzbWMsc21jLT50LnN0X3F1ZXVlLT50bV9kZWx0YSkgOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL3NyZi5jIGIvZHJpdmVycy9uZXQvc2tmcC9zcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjU3M2FjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9zcmYuYwpAQCAtMCwwICsxLDQyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVNlZSB0aGUgZmlsZSAic2tmZGRpLmMiIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKwlTTVQgNy4yIFN0YXR1cyBSZXNwb25zZSBGcmFtZSBJbXBsZW1lbnRhdGlvbgorCVNSRiBzdGF0ZSBtYWNoaW5lIGFuZCBmcmFtZSBnZW5lcmF0aW9uCisqLworCisjaW5jbHVkZSAiaC90eXBlcy5oIgorI2luY2x1ZGUgImgvZmRkaS5oIgorI2luY2x1ZGUgImgvc21jLmgiCisjaW5jbHVkZSAiaC9zbXRfcC5oIgorCisjZGVmaW5lIEtFUk5FTAorI2luY2x1ZGUgImgvc210c3RhdGUuaCIKKworI2lmbmRlZglTTElNX1NNVAorI2lmbmRlZglCT09UCisKKyNpZm5kZWYJbGludAorc3RhdGljIGNvbnN0IGNoYXIgSURfc2Njc1tdID0gIkAoIylzcmYuYwkxLjE4IDk3LzA4LzA0IChDKSBTSyAiIDsKKyNlbmRpZgorCisKKy8qCisgKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHZvaWQgY2xlYXJfYWxsX3JlcChzdHJ1Y3Qgc19zbWMgKnNtYyk7CitzdGF0aWMgdm9pZCBjbGVhcl9yZXBvcnRlZChzdHJ1Y3Qgc19zbWMgKnNtYyk7CitzdGF0aWMgdm9pZCBzbXRfc2VuZF9zcmYoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHN0cnVjdCBzX3NyZl9ldmMgKnNtdF9nZXRfZXZjKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgY29kZSwgaW50IGluZGV4KTsKKworI2RlZmluZSBNQVhfRVZDUwkoc2l6ZW9mKHNtYy0+ZXZjcykvc2l6ZW9mKHNtYy0+ZXZjc1swXSkpCisKK3N0cnVjdCBldmNfaW5pdCB7CisJdV9jaGFyIGNvZGUgOworCXVfY2hhciBpbmRleCA7CisJdV9jaGFyIG4gOworCXVfc2hvcnQJcGFyYSA7Cit9ICA7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXZjX2luaXQgZXZjX2luaXRzW10gPSB7CisJeyBTTVRfQ09ORF9TTVRfUEVFUl9XUkFQLAkJMCwxLFNNVF9QMTA0OAl9ICwKKworCXsgU01UX0NPTkRfTUFDX0RVUF9BRERSLAkJSU5ERVhfTUFDLCBOVU1NQUNTLFNNVF9QMjA4QyB9ICwKKwl7IFNNVF9DT05EX01BQ19GUkFNRV9FUlJPUiwJCUlOREVYX01BQywgTlVNTUFDUyxTTVRfUDIwOEQgfSAsCisJeyBTTVRfQ09ORF9NQUNfTk9UX0NPUElFRCwJCUlOREVYX01BQywgTlVNTUFDUyxTTVRfUDIwOEUgfSAsCisJeyBTTVRfRVZFTlRfTUFDX05FSUdIQk9SX0NIQU5HRSwJSU5ERVhfTUFDLCBOVU1NQUNTLFNNVF9QMjA4RiB9ICwKKwl7IFNNVF9FVkVOVF9NQUNfUEFUSF9DSEFOR0UsCQlJTkRFWF9NQUMsIE5VTU1BQ1MsU01UX1AyMDkwIH0gLAorCisJeyBTTVRfQ09ORF9QT1JUX0xFUiwJCQlJTkRFWF9QT1JULE5VTVBIWVMsU01UX1A0MDUwIH0gLAorCXsgU01UX0NPTkRfUE9SVF9FQl9FUlJPUiwJCUlOREVYX1BPUlQsTlVNUEhZUyxTTVRfUDQwNTIgfSAsCisJeyBTTVRfRVZFTlRfUE9SVF9DT05ORUNUSU9OLAkJSU5ERVhfUE9SVCxOVU1QSFlTLFNNVF9QNDA1MSB9ICwKKwl7IFNNVF9FVkVOVF9QT1JUX1BBVEhfQ0hBTkdFLAkJSU5ERVhfUE9SVCxOVU1QSFlTLFNNVF9QNDA1MyB9ICwKK30gOworCisjZGVmaW5lIE1BWF9JTklUX0VWQwkoc2l6ZW9mKGV2Y19pbml0cykvc2l6ZW9mKGV2Y19pbml0c1swXSkpCisKK3ZvaWQgc210X2luaXRfZXZjKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXN0cnVjdCBzX3NyZl9ldmMJKmV2YyA7CisJY29uc3Qgc3RydWN0IGV2Y19pbml0IAkqaW5pdCA7CisJaW50CQkJaSA7CisJaW50CQkJaW5kZXggOworCWludAkJCW9mZnNldCA7CisKKwlzdGF0aWMgdV9jaGFyCQlmYWlsX3NhZmUgPSBGQUxTRSA7CisKKwltZW1zZXQoKGNoYXIgKilzbWMtPmV2Y3MsMCxzaXplb2Yoc21jLT5ldmNzKSkgOworCisJZXZjID0gc21jLT5ldmNzIDsKKwlpbml0ID0gZXZjX2luaXRzIDsKKworCWZvciAoaSA9IDAgOyAodW5zaWduZWQpIGkgPCBNQVhfSU5JVF9FVkMgOyBpKyspIHsKKwkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IGluaXQtPm4gOyBpbmRleCsrKSB7CisJCQlldmMtPmV2Y19jb2RlID0gaW5pdC0+Y29kZSA7CisJCQlldmMtPmV2Y19wYXJhID0gaW5pdC0+cGFyYSA7CisJCQlldmMtPmV2Y19pbmRleCA9IGluaXQtPmluZGV4ICsgaW5kZXggOworI2lmbmRlZglERUJVRworCQkJZXZjLT5ldmNfbXVsdGlwbGUgPSAmZmFpbF9zYWZlIDsKKwkJCWV2Yy0+ZXZjX2NvbmRfc3RhdGUgPSAmZmFpbF9zYWZlIDsKKyNlbmRpZgorCQkJZXZjKysgOworCQl9CisJCWluaXQrKyA7CisJfQorCisJaWYgKCh1bnNpZ25lZCkgKGV2YyAtIHNtYy0+ZXZjcykgPiBNQVhfRVZDUykgeworCQlTTVRfUEFOSUMoc21jLFNNVF9FMDEyNywgU01UX0UwMTI3X01TRykgOworCX0KKworCS8qCisJICogY29uZGl0aW9ucworCSAqLworCXNtYy0+ZXZjc1swXS5ldmNfY29uZF9zdGF0ZSA9ICZzbWMtPm1pYi5mZGRpU01UUGVlcldyYXBGbGFnIDsKKwlzbWMtPmV2Y3NbMV0uZXZjX2NvbmRfc3RhdGUgPQorCQkmc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRHVwbGljYXRlQWRkcmVzc0NvbmQgOworCXNtYy0+ZXZjc1syXS5ldmNfY29uZF9zdGF0ZSA9CisJCSZzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNGcmFtZUVycm9yRmxhZyA7CisJc21jLT5ldmNzWzNdLmV2Y19jb25kX3N0YXRlID0KKwkJJnNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ05vdENvcGllZEZsYWcgOworCisJLyoKKwkgKiBldmVudHMKKwkgKi8KKwlzbWMtPmV2Y3NbNF0uZXZjX211bHRpcGxlID0gJnNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ011bHRpcGxlX04gOworCXNtYy0+ZXZjc1s1XS5ldmNfbXVsdGlwbGUgPSAmc21jLT5taWIubVtNQUMwXS5mZGRpTUFDTXVsdGlwbGVfUCA7CisKKwlvZmZzZXQgPSA2IDsKKwlmb3IgKGkgPSAwIDsgaSA8IE5VTVBIWVMgOyBpKyspIHsKKwkJLyoKKwkJICogY29uZGl0aW9ucworCQkgKi8KKwkJc21jLT5ldmNzW29mZnNldCArIDAqTlVNUEhZU10uZXZjX2NvbmRfc3RhdGUgPQorCQkJJnNtYy0+bWliLnBbaV0uZmRkaVBPUlRMZXJGbGFnIDsKKwkJc21jLT5ldmNzW29mZnNldCArIDEqTlVNUEhZU10uZXZjX2NvbmRfc3RhdGUgPQorCQkJJnNtYy0+bWliLnBbaV0uZmRkaVBPUlRFQl9Db25kaXRpb24gOworCisJCS8qCisJCSAqIGV2ZW50cworCQkgKi8KKwkJc21jLT5ldmNzW29mZnNldCArIDIqTlVNUEhZU10uZXZjX211bHRpcGxlID0KKwkJCSZzbWMtPm1pYi5wW2ldLmZkZGlQT1JUTXVsdGlwbGVfVSA7CisJCXNtYy0+ZXZjc1tvZmZzZXQgKyAzKk5VTVBIWVNdLmV2Y19tdWx0aXBsZSA9CisJCQkmc21jLT5taWIucFtpXS5mZGRpUE9SVE11bHRpcGxlX1AgOworCQlvZmZzZXQrKyA7CisJfQorI2lmZGVmCURFQlVHCisJZm9yIChpID0gMCwgZXZjID0gc21jLT5ldmNzIDsgKHVuc2lnbmVkKSBpIDwgTUFYX0VWQ1MgOyBpKyssIGV2YysrKSB7CisJCWlmIChTTVRfSVNfQ09ORElUSU9OKGV2Yy0+ZXZjX2NvZGUpKSB7CisJCQlpZiAoIWV2Yy0+ZXZjX2NvbmRfc3RhdGUpIHsKKwkJCQlTTVRfUEFOSUMoc21jLFNNVF9FMDEyOCwgU01UX0UwMTI4X01TRykgOworCQkJfQorCQkJZXZjLT5ldmNfbXVsdGlwbGUgPSAmZmFpbF9zYWZlIDsKKwkJfQorCQllbHNlIHsKKwkJCWlmICghZXZjLT5ldmNfbXVsdGlwbGUpIHsKKwkJCQlTTVRfUEFOSUMoc21jLFNNVF9FMDEyOSwgU01UX0UwMTI5X01TRykgOworCQkJfQorCQkJZXZjLT5ldmNfY29uZF9zdGF0ZSA9ICZmYWlsX3NhZmUgOworCQl9CisJfQorI2VuZGlmCisJc21jLT5zcmYuVFNSID0gc210X2dldF90aW1lKCkgOworCXNtYy0+c3JmLnNyX3N0YXRlID0gU1IwX1dBSVQgOworfQorCitzdGF0aWMgc3RydWN0IHNfc3JmX2V2YyAqc210X2dldF9ldmMoc3RydWN0IHNfc21jICpzbWMsIGludCBjb2RlLCBpbnQgaW5kZXgpCit7CisJaW50CQkJaSA7CisJc3RydWN0IHNfc3JmX2V2YwkqZXZjIDsKKworCWZvciAoaSA9IDAsIGV2YyA9IHNtYy0+ZXZjcyA7ICh1bnNpZ25lZCkgaSA8IE1BWF9FVkNTIDsgaSsrLCBldmMrKykgeworCQlpZiAoZXZjLT5ldmNfY29kZSA9PSBjb2RlICYmIGV2Yy0+ZXZjX2luZGV4ID09IGluZGV4KQorCQkJcmV0dXJuKGV2YykgOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBUSFJFU0hPTERfMgkoMipUSUNLU19QRVJfU0VDT05EKQorI2RlZmluZSBUSFJFU0hPTERfMzIJKDMyKlRJQ0tTX1BFUl9TRUNPTkQpCisKKyNpZmRlZglERUJVRworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcmZfbmFtZXNbXSA9IHsKKwkiTm9uZSIsIk1BQ1BhdGhDaGFuZ2VFdmVudCIsCSJNQUNOZWlnaGJvckNoYW5nZUV2ZW50IiwKKwkiUE9SVFBhdGhDaGFuZ2VFdmVudCIsCQkiUE9SVFVuZGVzaXJlZENvbm5lY3Rpb25BdHRlbXB0RXZlbnQiLAorCSJTTVRQZWVyV3JhcENvbmRpdGlvbiIsCQkiU01USG9sZENvbmRpdGlvbiIsCisJIk1BQ0ZyYW1lRXJyb3JDb25kaXRpb24iLAkiTUFDRHVwbGljYXRlQWRkcmVzc0NvbmRpdGlvbiIsCisJIk1BQ05vdENvcGllZENvbmRpdGlvbiIsCSJQT1JURUJFcnJvckNvbmRpdGlvbiIsCisJIlBPUlRMZXJDb25kaXRpb24iCit9IDsKKyNlbmRpZgorCit2b2lkIHNtdF9zcmZfZXZlbnQoc3RydWN0IHNfc21jICpzbWMsIGludCBjb2RlLCBpbnQgaW5kZXgsIGludCBjb25kKQoreworCXN0cnVjdCBzX3NyZl9ldmMJKmV2YyA7CisJaW50CQkJY29uZF9hc3NlcnRlZCA9IDAgOworCWludAkJCWNvbmRfZGVhc3NlcnRlZCA9IDAgOworCWludAkJCWV2ZW50X29jY3VycmVkID0gMCA7CisJaW50CQkJdHNyIDsKKwlpbnQJCQlUX0xpbWl0ID0gMipUSUNLU19QRVJfU0VDT05EIDsKKworCWlmIChjb2RlID09IFNNVF9DT05EX01BQ19EVVBfQUREUiAmJiBjb25kKSB7CisJCVJTX1NFVChzbWMsUlNfRFVQQUREUikgOworCX0KKworCWlmIChjb2RlKSB7CisJCURCX1NNVCgiU1JGOiAlcyBpbmRleCAlZFxuIixzcmZfbmFtZXNbY29kZV0saW5kZXgpIDsKKworCQlpZiAoIShldmMgPSBzbXRfZ2V0X2V2YyhzbWMsY29kZSxpbmRleCkpKSB7CisJCQlEQl9TTVQoIlNSRiA6IHNtdF9nZXRfZXZjKCkgZmFpbGVkXG4iLDAsMCkgOworCQkJcmV0dXJuIDsKKwkJfQorCQkvKgorCQkgKiBpZ25vcmUgY29uZGl0aW9uIGlmIG5vIGNoYW5nZQorCQkgKi8KKwkJaWYgKFNNVF9JU19DT05ESVRJT04oY29kZSkpIHsKKwkJCWlmICgqZXZjLT5ldmNfY29uZF9zdGF0ZSA9PSBjb25kKQorCQkJCXJldHVybiA7CisJCX0KKworCQkvKgorCQkgKiBzZXQgdHJhbnNpdGlvbiB0aW1lIHN0YW1wCisJCSAqLworCQlzbXRfc2V0X3RpbWVzdGFtcChzbWMsc21jLT5taWIuZmRkaVNNVFRyYW5zaXRpb25UaW1lU3RhbXApIDsKKwkJaWYgKFNNVF9JU19DT05ESVRJT04oY29kZSkpIHsKKwkJCURCX1NNVCgiU1JGOiBjb25kaXRpb24gaXMgJXNcbiIsY29uZCA/ICJPTiI6Ik9GRiIsMCkgOworCQkJaWYgKGNvbmQpIHsKKwkJCQkqZXZjLT5ldmNfY29uZF9zdGF0ZSA9IFRSVUUgOworCQkJCWV2Yy0+ZXZjX3JlcF9yZXF1aXJlZCA9IFRSVUUgOworCQkJCXNtYy0+c3JmLmFueV9yZXBvcnQgPSBUUlVFIDsKKwkJCQljb25kX2Fzc2VydGVkID0gVFJVRSA7CisJCQl9CisJCQllbHNlIHsKKwkJCQkqZXZjLT5ldmNfY29uZF9zdGF0ZSA9IEZBTFNFIDsKKwkJCQljb25kX2RlYXNzZXJ0ZWQgPSBUUlVFIDsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWlmIChldmMtPmV2Y19yZXBfcmVxdWlyZWQpIHsKKwkJCQkqZXZjLT5ldmNfbXVsdGlwbGUgID0gVFJVRSA7CisJCQl9CisJCQllbHNlIHsKKwkJCQlldmMtPmV2Y19yZXBfcmVxdWlyZWQgPSBUUlVFIDsKKwkJCQkqZXZjLT5ldmNfbXVsdGlwbGUgID0gRkFMU0UgOworCQkJfQorCQkJc21jLT5zcmYuYW55X3JlcG9ydCA9IFRSVUUgOworCQkJZXZlbnRfb2NjdXJyZWQgPSBUUlVFIDsKKwkJfQorI2lmZGVmCUZERElfTUlCCisJCXNubXBfc3JmX2V2ZW50KHNtYyxldmMpIDsKKyNlbmRpZgkvKiBGRERJX01JQiAqLworCX0KKwl0c3IgPSBzbXRfZ2V0X3RpbWUoKSAtIHNtYy0+c3JmLlRTUiA7CisKKwlzd2l0Y2ggKHNtYy0+c3JmLnNyX3N0YXRlKSB7CisJY2FzZSBTUjBfV0FJVCA6CisJCS8qIFNSMDFhICovCisJCWlmIChjb25kX2Fzc2VydGVkICYmIHRzciA8IFRfTGltaXQpIHsKKwkJCXNtYy0+c3JmLlNSVGhyZXNob2xkID0gVEhSRVNIT0xEXzIgOworCQkJc21jLT5zcmYuc3Jfc3RhdGUgPSBTUjFfSE9MRE9GRiA7CisJCQlicmVhayA7CisJCX0KKwkJLyogU1IwMWIgKi8KKwkJaWYgKGNvbmRfZGVhc3NlcnRlZCAmJiB0c3IgPCBUX0xpbWl0KSB7CisJCQlzbWMtPnNyZi5zcl9zdGF0ZSA9IFNSMV9IT0xET0ZGIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKiBTUjAxYyAqLworCQlpZiAoZXZlbnRfb2NjdXJyZWQgJiYgdHNyIDwgVF9MaW1pdCkgeworCQkJc21jLT5zcmYuc3Jfc3RhdGUgPSBTUjFfSE9MRE9GRiA7CisJCQlicmVhayA7CisJCX0KKwkJLyogU1IwMGIgKi8KKwkJaWYgKGNvbmRfYXNzZXJ0ZWQgJiYgdHNyID49IFRfTGltaXQpIHsKKwkJCXNtYy0+c3JmLlNSVGhyZXNob2xkID0gVEhSRVNIT0xEXzIgOworCQkJc21jLT5zcmYuVFNSID0gc210X2dldF90aW1lKCkgOworCQkJc210X3NlbmRfc3JmKHNtYykgOworCQkJYnJlYWsgOworCQl9CisJCS8qIFNSMDBjICovCisJCWlmIChjb25kX2RlYXNzZXJ0ZWQgJiYgdHNyID49IFRfTGltaXQpIHsKKwkJCXNtYy0+c3JmLlRTUiA9IHNtdF9nZXRfdGltZSgpIDsKKwkJCXNtdF9zZW5kX3NyZihzbWMpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKiBTUjAwZCAqLworCQlpZiAoZXZlbnRfb2NjdXJyZWQgJiYgdHNyID49IFRfTGltaXQpIHsKKwkJCXNtYy0+c3JmLlRTUiA9IHNtdF9nZXRfdGltZSgpIDsKKwkJCXNtdF9zZW5kX3NyZihzbWMpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKiBTUjAwZSAqLworCQlpZiAoc21jLT5zcmYuYW55X3JlcG9ydCAmJiAodV9sb25nKSB0c3IgPj0KKwkJCXNtYy0+c3JmLlNSVGhyZXNob2xkKSB7CisJCQlzbWMtPnNyZi5TUlRocmVzaG9sZCAqPSAyIDsKKwkJCWlmIChzbWMtPnNyZi5TUlRocmVzaG9sZCA+IFRIUkVTSE9MRF8zMikKKwkJCQlzbWMtPnNyZi5TUlRocmVzaG9sZCA9IFRIUkVTSE9MRF8zMiA7CisJCQlzbWMtPnNyZi5UU1IgPSBzbXRfZ2V0X3RpbWUoKSA7CisJCQlzbXRfc2VuZF9zcmYoc21jKSA7CisJCQlicmVhayA7CisJCX0KKwkJLyogU1IwMiAqLworCQlpZiAoIXNtYy0+bWliLmZkZGlTTVRTdGF0UnB0UG9saWN5KSB7CisJCQlzbWMtPnNyZi5zcl9zdGF0ZSA9IFNSMl9ESVNBQkxFRCA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgU1IxX0hPTERPRkYgOgorCQkvKiBTUjEwYiAqLworCQlpZiAodHNyID49IFRfTGltaXQpIHsKKwkJCXNtYy0+c3JmLnNyX3N0YXRlID0gU1IwX1dBSVQgOworCQkJc21jLT5zcmYuVFNSID0gc210X2dldF90aW1lKCkgOworCQkJc210X3NlbmRfc3JmKHNtYykgOworCQkJYnJlYWsgOworCQl9CisJCS8qIFNSMTFhICovCisJCWlmIChjb25kX2Fzc2VydGVkKSB7CisJCQlzbWMtPnNyZi5TUlRocmVzaG9sZCA9IFRIUkVTSE9MRF8yIDsKKwkJfQorCQkvKiBTUjExYiAqLworCQkvKiBTUjExYyAqLworCQkvKiBoYW5kbGVkIGFib3ZlICovCisJCS8qIFNSMTIgKi8KKwkJaWYgKCFzbWMtPm1pYi5mZGRpU01UU3RhdFJwdFBvbGljeSkgeworCQkJc21jLT5zcmYuc3Jfc3RhdGUgPSBTUjJfRElTQUJMRUQgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIFNSMl9ESVNBQkxFRCA6CisJCWlmIChzbWMtPm1pYi5mZGRpU01UU3RhdFJwdFBvbGljeSkgeworCQkJc21jLT5zcmYuc3Jfc3RhdGUgPSBTUjBfV0FJVCA7CisJCQlzbWMtPnNyZi5UU1IgPSBzbXRfZ2V0X3RpbWUoKSA7CisJCQlzbWMtPnNyZi5TUlRocmVzaG9sZCA9IFRIUkVTSE9MRF8yIDsKKwkJCWNsZWFyX2FsbF9yZXAoc21jKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCX0KK30KKworc3RhdGljIHZvaWQgY2xlYXJfYWxsX3JlcChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3Qgc19zcmZfZXZjCSpldmMgOworCWludAkJCWkgOworCisJZm9yIChpID0gMCwgZXZjID0gc21jLT5ldmNzIDsgKHVuc2lnbmVkKSBpIDwgTUFYX0VWQ1MgOyBpKyssIGV2YysrKSB7CisJCWV2Yy0+ZXZjX3JlcF9yZXF1aXJlZCA9IEZBTFNFIDsKKwkJaWYgKFNNVF9JU19DT05ESVRJT04oZXZjLT5ldmNfY29kZSkpCisJCQkqZXZjLT5ldmNfY29uZF9zdGF0ZSA9IEZBTFNFIDsKKwl9CisJc21jLT5zcmYuYW55X3JlcG9ydCA9IEZBTFNFIDsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfcmVwb3J0ZWQoc3RydWN0IHNfc21jICpzbWMpCit7CisJc3RydWN0IHNfc3JmX2V2YwkqZXZjIDsKKwlpbnQJCQlpIDsKKworCXNtYy0+c3JmLmFueV9yZXBvcnQgPSBGQUxTRSA7CisJZm9yIChpID0gMCwgZXZjID0gc21jLT5ldmNzIDsgKHVuc2lnbmVkKSBpIDwgTUFYX0VWQ1MgOyBpKyssIGV2YysrKSB7CisJCWlmIChTTVRfSVNfQ09ORElUSU9OKGV2Yy0+ZXZjX2NvZGUpKSB7CisJCQlpZiAoKmV2Yy0+ZXZjX2NvbmRfc3RhdGUgPT0gRkFMU0UpCisJCQkJZXZjLT5ldmNfcmVwX3JlcXVpcmVkID0gRkFMU0UgOworCQkJZWxzZQorCQkJCXNtYy0+c3JmLmFueV9yZXBvcnQgPSBUUlVFIDsKKwkJfQorCQllbHNlIHsKKwkJCWV2Yy0+ZXZjX3JlcF9yZXF1aXJlZCA9IEZBTFNFIDsKKwkJCSpldmMtPmV2Y19tdWx0aXBsZSA9IEZBTFNFIDsKKwkJfQorCX0KK30KKworLyoKKyAqIGJ1aWxkIGFuZCBzZW5kIFNNVCBTUkYgZnJhbWUKKyAqLworc3RhdGljIHZvaWQgc210X3NlbmRfc3JmKHN0cnVjdCBzX3NtYyAqc21jKQoreworCisJc3RydWN0IHNtdF9oZWFkZXIJKnNtdCA7CisJc3RydWN0IHNfc3JmX2V2YwkqZXZjIDsKKwlTS19MT0NfREVDTChzdHJ1Y3Qgc19wY29uLHBjb24pIDsKKwlTTWJ1ZgkJCSptYiA7CisJaW50CQkJaSA7CisKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGZkZGlfYWRkciBTTVRfU1JGX0RBID0geworCQl7IDB4ODAsIDB4MDEsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDggfQorCX0gOworCisJLyoKKwkgKiBidWlsZCBTTVQgaGVhZGVyCisJICovCisJaWYgKCFzbWMtPnIuc21fbWFfYXZhaWwpCisJCXJldHVybiA7CisJaWYgKCEobWIgPSBzbXRfYnVpbGRfZnJhbWUoc21jLFNNVF9TUkYsU01UX0FOTk9VTkNFLDApKSkKKwkJcmV0dXJuIDsKKworCVJTX1NFVChzbWMsUlNfU09GVEVSUk9SKSA7CisKKwlzbXQgPSBzbXRvZChtYiwgc3RydWN0IHNtdF9oZWFkZXIgKikgOworCXNtdC0+c210X2Rlc3QgPSBTTVRfU1JGX0RBIDsJCS8qIERBID09IFNSRiBtdWx0aWNhc3QgKi8KKworCS8qCisJICogc2V0dXAgcGFyYW1ldGVyIHN0YXR1cworCSAqLworCXBjb24ucGNfbGVuID0gU01UX01BWF9JTkZPX0xFTiA7CS8qIG1heCBwYXJhIGxlbmd0aCAqLworCXBjb24ucGNfZXJyID0gMCA7CQkJLyogbm8gZXJyb3IgKi8KKwlwY29uLnBjX2JhZHNldCA9IDAgOwkJCS8qIG5vIGJhZCBzZXQgY291bnQgKi8KKwlwY29uLnBjX3AgPSAodm9pZCAqKSAoc210ICsgMSkgOwkvKiBwYXJhcyBzdGFydCBoZXJlICovCisKKwlzbXRfYWRkX3BhcmEoc21jLCZwY29uLCh1X3Nob3J0KSBTTVRfUDEwMzMsMCwwKSA7CisJc210X2FkZF9wYXJhKHNtYywmcGNvbiwodV9zaG9ydCkgU01UX1AxMDM0LDAsMCkgOworCisJZm9yIChpID0gMCwgZXZjID0gc21jLT5ldmNzIDsgKHVuc2lnbmVkKSBpIDwgTUFYX0VWQ1MgOyBpKyssIGV2YysrKSB7CisJCWlmIChldmMtPmV2Y19yZXBfcmVxdWlyZWQpIHsKKwkJCXNtdF9hZGRfcGFyYShzbWMsJnBjb24sZXZjLT5ldmNfcGFyYSwKKwkJCQkoaW50KWV2Yy0+ZXZjX2luZGV4LDApIDsKKwkJfQorCX0KKwlzbXQtPnNtdF9sZW4gPSBTTVRfTUFYX0lORk9fTEVOIC0gcGNvbi5wY19sZW4gOworCW1iLT5zbV9sZW4gPSBzbXQtPnNtdF9sZW4gKyBzaXplb2Yoc3RydWN0IHNtdF9oZWFkZXIpIDsKKworCURCX1NNVCgiU1JGOiBzZW5kaW5nIFNSRiBhdCAleCwgbGVuICVkIFxuIixzbXQsbWItPnNtX2xlbikgOworCURCX1NNVCgiU1JGOiBzdGF0ZSBTUiVkIFRocmVzaG9sZCAlZFxuIiwKKwkJc21jLT5zcmYuc3Jfc3RhdGUsc21jLT5zcmYuU1JUaHJlc2hvbGQvVElDS1NfUEVSX1NFQ09ORCkgOworI2lmZGVmCURFQlVHCisJZHVtcF9zbXQoc21jLHNtdCwiU1JGIFNlbmQiKSA7CisjZW5kaWYKKwlzbXRfc2VuZF9mcmFtZShzbWMsbWIsRkNfU01UX0lORk8sMCkgOworCWNsZWFyX3JlcG9ydGVkKHNtYykgOworfQorCisjZW5kaWYJLyogbm8gQk9PVCAqLworI2VuZGlmCS8qIG5vIFNMSU1fU01UICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NsaGMuYyBiL2RyaXZlcnMvbmV0L3NsaGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmZiYjFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2xoYy5jCkBAIC0wLDAgKzEsNzY4IEBACisvKgorICogUm91dGluZXMgdG8gY29tcHJlc3MgYW5kIHVuY29tcHJlc3MgdGNwIHBhY2tldHMgKGZvciB0cmFuc21pc3Npb24KKyAqIG92ZXIgbG93IHNwZWVkIHNlcmlhbCBsaW5lcykuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg5IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleS4gIFRoZSBuYW1lIG9mIHRoZQorICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqCVZhbiBKYWNvYnNvbiAodmFuQGhlbGlvcy5lZS5sYmwuZ292KSwgRGVjIDMxLCAxOTg5OgorICoJLSBJbml0aWFsIGRpc3RyaWJ1dGlvbi4KKyAqCisgKgorICogbW9kaWZpZWQgZm9yIEtBOVEgSW50ZXJuZXQgU29mdHdhcmUgUGFja2FnZSBieQorICogS2F0aWUgU3RldmVucyAoZGtzdGV2ZW5zQHVjZGF2aXMuZWR1KQorICogVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBEYXZpcworICogQ29tcHV0aW5nIFNlcnZpY2VzCisgKgktIDAxLTMxLTkwCWluaXRpYWwgYWRhcHRhdGlvbiAoZnJvbSAxLjE5KQorICoJUFBQLjA1CTAyLTE1LTkwIFtrc10KKyAqCVBQUC4wOAkwNS0wMi05MCBba3NdCXVzZSBQUFAgcHJvdG9jb2wgZmllbGQgdG8gc2lnbmFsIGNvbXByZXNzaW9uCisgKglQUFAuMTUJMDktOTAJIFtrc10JaW1wcm92ZSBtYnVmIGhhbmRsaW5nCisgKglQUFAuMTYJMTEtMDIJIFtrYXJuXQlzdWJzdGFudGlhbGx5IHJld3JpdHRlbiB0byB1c2UgTk9TIGZhY2lsaXRpZXMKKyAqCisgKgktIEZlYiAxOTkxCUJpbGxfU2ltcHNvbkB1bS5jYy51bWljaC5lZHUKKyAqCQkJdmFyaWFibGUgbnVtYmVyIG9mIGNvbnZlcnNhdGlvbiBzbG90cworICoJCQlhbGxvdyB6ZXJvIG9yIG9uZSBzbG90cworICoJCQlzZXBhcmF0ZSByb3V0aW5lcworICoJCQlzdGF0dXMgZGlzcGxheQorICoJLSBKdWwgMTk5NAlEbWl0cnkgR29yb2RjaGFuaW4KKyAqCQkJRml4ZXMgZm9yIG1lbW9yeSBsZWFrcy4KKyAqICAgICAgLSBPY3QgMTk5NCAgICAgIERtaXRyeSBHb3JvZGNoYW5pbgorICogICAgICAgICAgICAgICAgICAgICAgTW9kdWxhcml6YXRpb24uCisgKgktIEphbiAxOTk1CUJqb3JuIEVrd2FsbAorICoJCQlVc2UgaXBfZmFzdF9jc3VtIGZyb20gaXAuaAorICoJLSBKdWx5IDE5OTUJQ2hyaXN0b3MgQS4gUG9seXpvbHMgCisgKgkJCVNwb3R0ZWQgYnVnIGluIHRjcCBvcHRpb24gY2hlY2tpbmcKKyAqCisgKgorICoJVGhpcyBtb2R1bGUgaXMgYSBkaWZmaWN1bHQgaXNzdWUuIEl0J3MgY2xlYXJseSBpbmV0IGNvZGUgYnV0IGl0J3MgYWxzbyBjbGVhcmx5CisgKglkcml2ZXIgY29kZSBiZWxvbmdpbmcgY2xvc2UgdG8gUFBQIGFuZCBTTElQCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxuZXQvc2xoY192ai5oPgorCisjaWZkZWYgQ09ORklHX0lORVQKKy8qIEVudGlyZSBtb2R1bGUgaXMgZm9yIElQIG9ubHkgKi8KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqZW5jb2RlKHVuc2lnbmVkIGNoYXIgKmNwLCB1bnNpZ25lZCBzaG9ydCBuKTsKK3N0YXRpYyBsb25nIGRlY29kZSh1bnNpZ25lZCBjaGFyICoqY3BwKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICogcHV0MTYodW5zaWduZWQgY2hhciAqY3AsIHVuc2lnbmVkIHNob3J0IHgpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHB1bGwxNih1bnNpZ25lZCBjaGFyICoqY3BwKTsKKworLyogSW5pdGlhbGl6ZSBjb21wcmVzc2lvbiBkYXRhIHN0cnVjdHVyZQorICoJc2xvdHMgbXVzdCBiZSBpbiByYW5nZSAwIHRvIDI1NSAoemVybyBtZWFuaW5nIG5vIGNvbXByZXNzaW9uKQorICovCitzdHJ1Y3Qgc2xjb21wcmVzcyAqCitzbGhjX2luaXQoaW50IHJzbG90cywgaW50IHRzbG90cykKK3sKKwlyZWdpc3RlciBzaG9ydCBpOworCXJlZ2lzdGVyIHN0cnVjdCBjc3RhdGUgKnRzOworCXN0cnVjdCBzbGNvbXByZXNzICpjb21wOworCisJY29tcCA9IChzdHJ1Y3Qgc2xjb21wcmVzcyAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbGNvbXByZXNzKSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghIGNvbXApCisJCWdvdG8gb3V0X2ZhaWw7CisJbWVtc2V0KGNvbXAsIDAsIHNpemVvZihzdHJ1Y3Qgc2xjb21wcmVzcykpOworCisJaWYgKCByc2xvdHMgPiAwICAmJiAgcnNsb3RzIDwgMjU2ICkgeworCQlzaXplX3QgcnNpemUgPSByc2xvdHMgKiBzaXplb2Yoc3RydWN0IGNzdGF0ZSk7CisJCWNvbXAtPnJzdGF0ZSA9IChzdHJ1Y3QgY3N0YXRlICopIGttYWxsb2MocnNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoISBjb21wLT5yc3RhdGUpCisJCQlnb3RvIG91dF9mcmVlOworCQltZW1zZXQoY29tcC0+cnN0YXRlLCAwLCByc2l6ZSk7CisJCWNvbXAtPnJzbG90X2xpbWl0ID0gcnNsb3RzIC0gMTsKKwl9CisKKwlpZiAoIHRzbG90cyA+IDAgICYmICB0c2xvdHMgPCAyNTYgKSB7CisJCXNpemVfdCB0c2l6ZSA9IHRzbG90cyAqIHNpemVvZihzdHJ1Y3QgY3N0YXRlKTsKKwkJY29tcC0+dHN0YXRlID0gKHN0cnVjdCBjc3RhdGUgKikga21hbGxvYyh0c2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghIGNvbXAtPnRzdGF0ZSkKKwkJCWdvdG8gb3V0X2ZyZWUyOworCQltZW1zZXQoY29tcC0+dHN0YXRlLCAwLCB0c2l6ZSk7CisJCWNvbXAtPnRzbG90X2xpbWl0ID0gdHNsb3RzIC0gMTsKKwl9CisKKwljb21wLT54bWl0X29sZGVzdCA9IDA7CisJY29tcC0+eG1pdF9jdXJyZW50ID0gMjU1OworCWNvbXAtPnJlY3ZfY3VycmVudCA9IDI1NTsKKwkvKgorCSAqIGRvbid0IGFjY2VwdCBhbnkgcGFja2V0cyB3aXRoIGltcGxpY2l0IGluZGV4IHVudGlsIHdlIGdldAorCSAqIG9uZSB3aXRoIGFuIGV4cGxpY2l0IGluZGV4LiAgT3RoZXJ3aXNlIHRoZSB1bmNvbXByZXNzIGNvZGUKKwkgKiB3aWxsIHRyeSB0byB1c2UgY29ubmVjdGlvbiAyNTUsIHdoaWNoIGlzIGFsbW9zdCBjZXJ0YWlubHkKKwkgKiBvdXQgb2YgcmFuZ2UKKwkgKi8KKwljb21wLT5mbGFncyB8PSBTTEZfVE9TUzsKKworCWlmICggdHNsb3RzID4gMCApIHsKKwkJdHMgPSBjb21wLT50c3RhdGU7CisJCWZvcihpID0gY29tcC0+dHNsb3RfbGltaXQ7IGkgPiAwOyAtLWkpeworCQkJdHNbaV0uY3NfdGhpcyA9IGk7CisJCQl0c1tpXS5uZXh0ID0gJih0c1tpIC0gMV0pOworCQl9CisJCXRzWzBdLm5leHQgPSAmKHRzW2NvbXAtPnRzbG90X2xpbWl0XSk7CisJCXRzWzBdLmNzX3RoaXMgPSAwOworCX0KKwlyZXR1cm4gY29tcDsKKworb3V0X2ZyZWUyOgorCWtmcmVlKCh1bnNpZ25lZCBjaGFyICopY29tcC0+cnN0YXRlKTsKK291dF9mcmVlOgorCWtmcmVlKCh1bnNpZ25lZCBjaGFyICopY29tcCk7CitvdXRfZmFpbDoKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKiBGcmVlIGEgY29tcHJlc3Npb24gZGF0YSBzdHJ1Y3R1cmUgKi8KK3ZvaWQKK3NsaGNfZnJlZShzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCkKK3sKKwlpZiAoIGNvbXAgPT0gTlVMTFNMQ09NUFIgKQorCQlyZXR1cm47CisKKwlpZiAoIGNvbXAtPnRzdGF0ZSAhPSBOVUxMU0xTVEFURSApCisJCWtmcmVlKCBjb21wLT50c3RhdGUgKTsKKworCWlmICggY29tcC0+cnN0YXRlICE9IE5VTExTTFNUQVRFICkKKwkJa2ZyZWUoIGNvbXAtPnJzdGF0ZSApOworCisJa2ZyZWUoIGNvbXAgKTsKK30KKworCisvKiBQdXQgYSBzaG9ydCBpbiBob3N0IG9yZGVyIGludG8gYSBjaGFyIGFycmF5IGluIG5ldHdvcmsgb3JkZXIgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqCitwdXQxNih1bnNpZ25lZCBjaGFyICpjcCwgdW5zaWduZWQgc2hvcnQgeCkKK3sKKwkqY3ArKyA9IHggPj4gODsKKwkqY3ArKyA9IHg7CisKKwlyZXR1cm4gY3A7Cit9CisKKworLyogRW5jb2RlIGEgbnVtYmVyICovCit1bnNpZ25lZCBjaGFyICoKK2VuY29kZSh1bnNpZ25lZCBjaGFyICpjcCwgdW5zaWduZWQgc2hvcnQgbikKK3sKKwlpZihuID49IDI1NiB8fCBuID09IDApeworCQkqY3ArKyA9IDA7CisJCWNwID0gcHV0MTYoY3Asbik7CisJfSBlbHNlIHsKKwkJKmNwKysgPSBuOworCX0KKwlyZXR1cm4gY3A7Cit9CisKKy8qIFB1bGwgYSAxNi1iaXQgaW50ZWdlciBpbiBob3N0IG9yZGVyIGZyb20gYnVmZmVyIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0CitwdWxsMTYodW5zaWduZWQgY2hhciAqKmNwcCkKK3sKKwlzaG9ydCBydmFsOworCisJcnZhbCA9ICooKmNwcCkrKzsKKwlydmFsIDw8PSA4OworCXJ2YWwgfD0gKigqY3BwKSsrOworCXJldHVybiBydmFsOworfQorCisvKiBEZWNvZGUgYSBudW1iZXIgKi8KK2xvbmcKK2RlY29kZSh1bnNpZ25lZCBjaGFyICoqY3BwKQoreworCXJlZ2lzdGVyIGludCB4OworCisJeCA9ICooKmNwcCkrKzsKKwlpZih4ID09IDApeworCQlyZXR1cm4gcHVsbDE2KGNwcCkgJiAweGZmZmY7CS8qIHB1bGwxNiByZXR1cm5zIC0xIG9uIGVycm9yICovCisJfSBlbHNlIHsKKwkJcmV0dXJuIHggJiAweGZmOwkJLyogLTEgaWYgUFVMTENIQVIgcmV0dXJuZWQgZXJyb3IgKi8KKwl9Cit9CisKKy8qCisgKiBpY3AgYW5kIGlzaXplIGFyZSB0aGUgb3JpZ2luYWwgcGFja2V0LgorICogb2NwIGlzIGEgcGxhY2UgdG8gcHV0IGEgY29weSBpZiBuZWNlc3NhcnkuCisgKiBjcHAgaXMgaW5pdGlhbGx5IGEgcG9pbnRlciB0byBpY3AuICBJZiB0aGUgY29weSBpcyB1c2VkLAorICogICAgY2hhbmdlIGl0IHRvIG9jcC4KKyAqLworCitpbnQKK3NsaGNfY29tcHJlc3Moc3RydWN0IHNsY29tcHJlc3MgKmNvbXAsIHVuc2lnbmVkIGNoYXIgKmljcCwgaW50IGlzaXplLAorCXVuc2lnbmVkIGNoYXIgKm9jcCwgdW5zaWduZWQgY2hhciAqKmNwcCwgaW50IGNvbXByZXNzX2NpZCkKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgY3N0YXRlICpvY3MgPSAmKGNvbXAtPnRzdGF0ZVtjb21wLT54bWl0X29sZGVzdF0pOworCXJlZ2lzdGVyIHN0cnVjdCBjc3RhdGUgKmxjcyA9IG9jczsKKwlyZWdpc3RlciBzdHJ1Y3QgY3N0YXRlICpjcyA9IGxjcy0+bmV4dDsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGRlbHRhUywgZGVsdGFBOworCXJlZ2lzdGVyIHNob3J0IGNoYW5nZXMgPSAwOworCWludCBobGVuOworCXVuc2lnbmVkIGNoYXIgbmV3X3NlcVsxNl07CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqY3AgPSBuZXdfc2VxOworCXN0cnVjdCBpcGhkciAqaXA7CisJc3RydWN0IHRjcGhkciAqdGgsICpvdGg7CisKKworCS8qCisJICoJRG9uJ3QgcGxheSB3aXRoIHJ1bnQgcGFja2V0cy4KKwkgKi8KKwkgCisJaWYoaXNpemU8c2l6ZW9mKHN0cnVjdCBpcGhkcikpCisJCXJldHVybiBpc2l6ZTsKKwkJCisJaXAgPSAoc3RydWN0IGlwaGRyICopIGljcDsKKworCS8qIEJhaWwgaWYgdGhpcyBwYWNrZXQgaXNuJ3QgVENQLCBvciBpcyBhbiBJUCBmcmFnbWVudCAqLworCWlmIChpcC0+cHJvdG9jb2wgIT0gSVBQUk9UT19UQ1AgfHwgKG50b2hzKGlwLT5mcmFnX29mZikgJiAweDNmZmYpKSB7CisJCS8qIFNlbmQgYXMgcmVndWxhciBJUCAqLworCQlpZihpcC0+cHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApCisJCQljb21wLT5zbHNfb19ub250Y3ArKzsKKwkJZWxzZQorCQkJY29tcC0+c2xzX29fdGNwKys7CisJCXJldHVybiBpc2l6ZTsKKwl9CisJLyogRXh0cmFjdCBUQ1AgaGVhZGVyICovCisKKwl0aCA9IChzdHJ1Y3QgdGNwaGRyICopKCgodW5zaWduZWQgY2hhciAqKWlwKSArIGlwLT5paGwqNCk7CisJaGxlbiA9IGlwLT5paGwqNCArIHRoLT5kb2ZmKjQ7CisKKwkvKiAgQmFpbCBpZiB0aGUgVENQIHBhY2tldCBpc24ndCBgY29tcHJlc3NpYmxlJyAoaS5lLiwgQUNLIGlzbid0IHNldCBvcgorCSAqICBzb21lIG90aGVyIGNvbnRyb2wgYml0IGlzIHNldCkuIEFsc28gdW5jb21wcmVzc2libGUgaWYKKwkgKiAgaXQncyBhIHJ1bnQuCisJICovCisJaWYoaGxlbiA+IGlzaXplIHx8IHRoLT5zeW4gfHwgdGgtPmZpbiB8fCB0aC0+cnN0IHx8CisJICAgICEgKHRoLT5hY2spKXsKKwkJLyogVENQIGNvbm5lY3Rpb24gc3R1ZmY7IHNlbmQgYXMgcmVndWxhciBJUCAqLworCQljb21wLT5zbHNfb190Y3ArKzsKKwkJcmV0dXJuIGlzaXplOworCX0KKwkvKgorCSAqIFBhY2tldCBpcyBjb21wcmVzc2libGUgLS0gd2UncmUgZ29pbmcgdG8gc2VuZCBlaXRoZXIgYQorCSAqIENPTVBSRVNTRURfVENQIG9yIFVOQ09NUFJFU1NFRF9UQ1AgcGFja2V0LiAgRWl0aGVyIHdheSwKKwkgKiB3ZSBuZWVkIHRvIGxvY2F0ZSAob3IgY3JlYXRlKSB0aGUgY29ubmVjdGlvbiBzdGF0ZS4KKwkgKgorCSAqIFN0YXRlcyBhcmUga2VwdCBpbiBhIGNpcmN1bGFybHkgbGlua2VkIGxpc3Qgd2l0aAorCSAqIHhtaXRfb2xkZXN0IHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICBUaGUKKwkgKiBsaXN0IGlzIGtlcHQgaW4gbHJ1IG9yZGVyIGJ5IG1vdmluZyBhIHN0YXRlIHRvIHRoZQorCSAqIGhlYWQgb2YgdGhlIGxpc3Qgd2hlbmV2ZXIgaXQgaXMgcmVmZXJlbmNlZC4gIFNpbmNlCisJICogdGhlIGxpc3QgaXMgc2hvcnQgYW5kLCBlbXBpcmljYWxseSwgdGhlIGNvbm5lY3Rpb24KKwkgKiB3ZSB3YW50IGlzIGFsbW9zdCBhbHdheXMgbmVhciB0aGUgZnJvbnQsIHdlIGxvY2F0ZQorCSAqIHN0YXRlcyB2aWEgbGluZWFyIHNlYXJjaC4gIElmIHdlIGRvbid0IGZpbmQgYSBzdGF0ZQorCSAqIGZvciB0aGUgZGF0YWdyYW0sIHRoZSBvbGRlc3Qgc3RhdGUgaXMgKHJlLSl1c2VkLgorCSAqLworCWZvciAoIDsgOyApIHsKKwkJaWYoIGlwLT5zYWRkciA9PSBjcy0+Y3NfaXAuc2FkZHIKKwkJICYmIGlwLT5kYWRkciA9PSBjcy0+Y3NfaXAuZGFkZHIKKwkJICYmIHRoLT5zb3VyY2UgPT0gY3MtPmNzX3RjcC5zb3VyY2UKKwkJICYmIHRoLT5kZXN0ID09IGNzLT5jc190Y3AuZGVzdCkKKwkJCWdvdG8gZm91bmQ7CisKKwkJLyogaWYgY3VycmVudCBlcXVhbCBvbGRlc3QsIGF0IGVuZCBvZiBsaXN0ICovCisJCWlmICggY3MgPT0gb2NzICkKKwkJCWJyZWFrOworCQlsY3MgPSBjczsKKwkJY3MgPSBjcy0+bmV4dDsKKwkJY29tcC0+c2xzX29fc2VhcmNoZXMrKzsKKwl9OworCS8qCisJICogRGlkbid0IGZpbmQgaXQgLS0gcmUtdXNlIG9sZGVzdCBjc3RhdGUuICBTZW5kIGFuCisJICogdW5jb21wcmVzc2VkIHBhY2tldCB0aGF0IHRlbGxzIHRoZSBvdGhlciBzaWRlIHdoYXQKKwkgKiBjb25uZWN0aW9uIG51bWJlciB3ZSdyZSB1c2luZyBmb3IgdGhpcyBjb252ZXJzYXRpb24uCisJICoKKwkgKiBOb3RlIHRoYXQgc2luY2UgdGhlIHN0YXRlIGxpc3QgaXMgY2lyY3VsYXIsIHRoZSBvbGRlc3QKKwkgKiBzdGF0ZSBwb2ludHMgdG8gdGhlIG5ld2VzdCBhbmQgd2Ugb25seSBuZWVkIHRvIHNldAorCSAqIHhtaXRfb2xkZXN0IHRvIHVwZGF0ZSB0aGUgbHJ1IGxpbmthZ2UuCisJICovCisJY29tcC0+c2xzX29fbWlzc2VzKys7CisJY29tcC0+eG1pdF9vbGRlc3QgPSBsY3MtPmNzX3RoaXM7CisJZ290byB1bmNvbXByZXNzZWQ7CisKK2ZvdW5kOgorCS8qCisJICogRm91bmQgaXQgLS0gbW92ZSB0byB0aGUgZnJvbnQgb24gdGhlIGNvbm5lY3Rpb24gbGlzdC4KKwkgKi8KKwlpZihsY3MgPT0gb2NzKSB7CisgCQkvKiBmb3VuZCBhdCBtb3N0IHJlY2VudGx5IHVzZWQgKi8KKwl9IGVsc2UgaWYgKGNzID09IG9jcykgeworCQkvKiBmb3VuZCBhdCBsZWFzdCByZWNlbnRseSB1c2VkICovCisJCWNvbXAtPnhtaXRfb2xkZXN0ID0gbGNzLT5jc190aGlzOworCX0gZWxzZSB7CisJCS8qIG1vcmUgdGhhbiAyIGVsZW1lbnRzICovCisJCWxjcy0+bmV4dCA9IGNzLT5uZXh0OworCQljcy0+bmV4dCA9IG9jcy0+bmV4dDsKKwkJb2NzLT5uZXh0ID0gY3M7CisJfQorCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCBvbmx5IHdoYXQgd2UgZXhwZWN0IHRvIGNoYW5nZSBjaGFuZ2VkLgorCSAqIENoZWNrIHRoZSBmb2xsb3dpbmc6CisJICogSVAgcHJvdG9jb2wgdmVyc2lvbiwgaGVhZGVyIGxlbmd0aCAmIHR5cGUgb2Ygc2VydmljZS4KKwkgKiBUaGUgIkRvbid0IGZyYWdtZW50IiBiaXQuCisJICogVGhlIHRpbWUtdG8tbGl2ZSBmaWVsZC4KKwkgKiBUaGUgVENQIGhlYWRlciBsZW5ndGguCisJICogSVAgb3B0aW9ucywgaWYgYW55LgorCSAqIFRDUCBvcHRpb25zLCBpZiBhbnkuCisJICogSWYgYW55IG9mIHRoZXNlIHRoaW5ncyBhcmUgZGlmZmVyZW50IGJldHdlZW4gdGhlIHByZXZpb3VzICYKKwkgKiBjdXJyZW50IGRhdGFncmFtLCB3ZSBzZW5kIHRoZSBjdXJyZW50IGRhdGFncmFtIGB1bmNvbXByZXNzZWQnLgorCSAqLworCW90aCA9ICZjcy0+Y3NfdGNwOworCisJaWYoaXAtPnZlcnNpb24gIT0gY3MtPmNzX2lwLnZlcnNpb24gfHwgaXAtPmlobCAhPSBjcy0+Y3NfaXAuaWhsCisJIHx8IGlwLT50b3MgIT0gY3MtPmNzX2lwLnRvcworCSB8fCAoaXAtPmZyYWdfb2ZmICYgaHRvbnMoMHg0MDAwKSkgIT0gKGNzLT5jc19pcC5mcmFnX29mZiAmIGh0b25zKDB4NDAwMCkpCisJIHx8IGlwLT50dGwgIT0gY3MtPmNzX2lwLnR0bAorCSB8fCB0aC0+ZG9mZiAhPSBjcy0+Y3NfdGNwLmRvZmYKKwkgfHwgKGlwLT5paGwgPiA1ICYmIG1lbWNtcChpcCsxLGNzLT5jc19pcG9wdCwoKGlwLT5paGwpLTUpKjQpICE9IDApCisJIHx8ICh0aC0+ZG9mZiA+IDUgJiYgbWVtY21wKHRoKzEsY3MtPmNzX3RjcG9wdCwoKHRoLT5kb2ZmKS01KSo0KSAhPSAwKSl7CisJCWdvdG8gdW5jb21wcmVzc2VkOworCX0KKworCS8qCisJICogRmlndXJlIG91dCB3aGljaCBvZiB0aGUgY2hhbmdpbmcgZmllbGRzIGNoYW5nZWQuICBUaGUKKwkgKiByZWNlaXZlciBleHBlY3RzIGNoYW5nZXMgaW4gdGhlIG9yZGVyOiB1cmdlbnQsIHdpbmRvdywKKwkgKiBhY2ssIHNlcSAodGhlIG9yZGVyIG1pbmltaXplcyB0aGUgbnVtYmVyIG9mIHRlbXBvcmFyaWVzCisJICogbmVlZGVkIGluIHRoaXMgc2VjdGlvbiBvZiBjb2RlKS4KKwkgKi8KKwlpZih0aC0+dXJnKXsKKwkJZGVsdGFTID0gbnRvaHModGgtPnVyZ19wdHIpOworCQljcCA9IGVuY29kZShjcCxkZWx0YVMpOworCQljaGFuZ2VzIHw9IE5FV19VOworCX0gZWxzZSBpZih0aC0+dXJnX3B0ciAhPSBvdGgtPnVyZ19wdHIpeworCQkvKiBhcmdoISBVUkcgbm90IHNldCBidXQgdXJwIGNoYW5nZWQgLS0gYSBzZW5zaWJsZQorCQkgKiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgbmV2ZXIgZG8gdGhpcyBidXQgUkZDNzkzCisJCSAqIGRvZXNuJ3QgcHJvaGliaXQgdGhlIGNoYW5nZSBzbyB3ZSBoYXZlIHRvIGRlYWwKKwkJICogd2l0aCBpdC4gKi8KKwkJZ290byB1bmNvbXByZXNzZWQ7CisJfQorCWlmKChkZWx0YVMgPSBudG9ocyh0aC0+d2luZG93KSAtIG50b2hzKG90aC0+d2luZG93KSkgIT0gMCl7CisJCWNwID0gZW5jb2RlKGNwLGRlbHRhUyk7CisJCWNoYW5nZXMgfD0gTkVXX1c7CisJfQorCWlmKChkZWx0YUEgPSBudG9obCh0aC0+YWNrX3NlcSkgLSBudG9obChvdGgtPmFja19zZXEpKSAhPSAwTCl7CisJCWlmKGRlbHRhQSA+IDB4MDAwMGZmZmYpCisJCQlnb3RvIHVuY29tcHJlc3NlZDsKKwkJY3AgPSBlbmNvZGUoY3AsZGVsdGFBKTsKKwkJY2hhbmdlcyB8PSBORVdfQTsKKwl9CisJaWYoKGRlbHRhUyA9IG50b2hsKHRoLT5zZXEpIC0gbnRvaGwob3RoLT5zZXEpKSAhPSAwTCl7CisJCWlmKGRlbHRhUyA+IDB4MDAwMGZmZmYpCisJCQlnb3RvIHVuY29tcHJlc3NlZDsKKwkJY3AgPSBlbmNvZGUoY3AsZGVsdGFTKTsKKwkJY2hhbmdlcyB8PSBORVdfUzsKKwl9CisKKwlzd2l0Y2goY2hhbmdlcyl7CisJY2FzZSAwOgkvKiBOb3RoaW5nIGNoYW5nZWQuIElmIHRoaXMgcGFja2V0IGNvbnRhaW5zIGRhdGEgYW5kIHRoZQorCQkgKiBsYXN0IG9uZSBkaWRuJ3QsIHRoaXMgaXMgcHJvYmFibHkgYSBkYXRhIHBhY2tldCBmb2xsb3dpbmcKKwkJICogYW4gYWNrIChub3JtYWwgb24gYW4gaW50ZXJhY3RpdmUgY29ubmVjdGlvbikgYW5kIHdlIHNlbmQKKwkJICogaXQgY29tcHJlc3NlZC4gIE90aGVyd2lzZSBpdCdzIHByb2JhYmx5IGEgcmV0cmFuc21pdCwKKwkJICogcmV0cmFuc21pdHRlZCBhY2sgb3Igd2luZG93IHByb2JlLiAgU2VuZCBpdCB1bmNvbXByZXNzZWQKKwkJICogaW4gY2FzZSB0aGUgb3RoZXIgc2lkZSBtaXNzZWQgdGhlIGNvbXByZXNzZWQgdmVyc2lvbi4KKwkJICovCisJCWlmKGlwLT50b3RfbGVuICE9IGNzLT5jc19pcC50b3RfbGVuICYmCisJCSAgIG50b2hzKGNzLT5jc19pcC50b3RfbGVuKSA9PSBobGVuKQorCQkJYnJlYWs7CisJCWdvdG8gdW5jb21wcmVzc2VkOworCQlicmVhazsKKwljYXNlIFNQRUNJQUxfSToKKwljYXNlIFNQRUNJQUxfRDoKKwkJLyogYWN0dWFsIGNoYW5nZXMgbWF0Y2ggb25lIG9mIG91ciBzcGVjaWFsIGNhc2UgZW5jb2RpbmdzIC0tCisJCSAqIHNlbmQgcGFja2V0IHVuY29tcHJlc3NlZC4KKwkJICovCisJCWdvdG8gdW5jb21wcmVzc2VkOworCWNhc2UgTkVXX1N8TkVXX0E6CisJCWlmKGRlbHRhUyA9PSBkZWx0YUEgJiYKKwkJICAgIGRlbHRhUyA9PSBudG9ocyhjcy0+Y3NfaXAudG90X2xlbikgLSBobGVuKXsKKwkJCS8qIHNwZWNpYWwgY2FzZSBmb3IgZWNob2VkIHRlcm1pbmFsIHRyYWZmaWMgKi8KKwkJCWNoYW5nZXMgPSBTUEVDSUFMX0k7CisJCQljcCA9IG5ld19zZXE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBORVdfUzoKKwkJaWYoZGVsdGFTID09IG50b2hzKGNzLT5jc19pcC50b3RfbGVuKSAtIGhsZW4peworCQkJLyogc3BlY2lhbCBjYXNlIGZvciBkYXRhIHhmZXIgKi8KKwkJCWNoYW5nZXMgPSBTUEVDSUFMX0Q7CisJCQljcCA9IG5ld19zZXE7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlbHRhUyA9IG50b2hzKGlwLT5pZCkgLSBudG9ocyhjcy0+Y3NfaXAuaWQpOworCWlmKGRlbHRhUyAhPSAxKXsKKwkJY3AgPSBlbmNvZGUoY3AsZGVsdGFTKTsKKwkJY2hhbmdlcyB8PSBORVdfSTsKKwl9CisJaWYodGgtPnBzaCkKKwkJY2hhbmdlcyB8PSBUQ1BfUFVTSF9CSVQ7CisJLyogR3JhYiB0aGUgY2tzdW0gYmVmb3JlIHdlIG92ZXJ3cml0ZSBpdCBiZWxvdy4gIFRoZW4gdXBkYXRlIG91cgorCSAqIHN0YXRlIHdpdGggdGhpcyBwYWNrZXQncyBoZWFkZXIuCisJICovCisJZGVsdGFBID0gbnRvaHModGgtPmNoZWNrKTsKKwltZW1jcHkoJmNzLT5jc19pcCxpcCwyMCk7CisJbWVtY3B5KCZjcy0+Y3NfdGNwLHRoLDIwKTsKKwkvKiBXZSB3YW50IHRvIHVzZSB0aGUgb3JpZ2luYWwgcGFja2V0IGFzIG91ciBjb21wcmVzc2VkIHBhY2tldC4KKwkgKiAoY3AgLSBuZXdfc2VxKSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIG5lZWQgZm9yIGNvbXByZXNzZWQKKwkgKiBzZXF1ZW5jZSBudW1iZXJzLiAgSW4gYWRkaXRpb24gd2UgbmVlZCBvbmUgYnl0ZSBmb3IgdGhlIGNoYW5nZQorCSAqIG1hc2ssIG9uZSBmb3IgdGhlIGNvbm5lY3Rpb24gaWQgYW5kIHR3byBmb3IgdGhlIHRjcCBjaGVja3N1bS4KKwkgKiBTbywgKGNwIC0gbmV3X3NlcSkgKyA0IGJ5dGVzIG9mIGhlYWRlciBhcmUgbmVlZGVkLgorCSAqLworCWRlbHRhUyA9IGNwIC0gbmV3X3NlcTsKKwlpZihjb21wcmVzc19jaWQgPT0gMCB8fCBjb21wLT54bWl0X2N1cnJlbnQgIT0gY3MtPmNzX3RoaXMpeworCQljcCA9IG9jcDsKKwkJKmNwcCA9IG9jcDsKKwkJKmNwKysgPSBjaGFuZ2VzIHwgTkVXX0M7CisJCSpjcCsrID0gY3MtPmNzX3RoaXM7CisJCWNvbXAtPnhtaXRfY3VycmVudCA9IGNzLT5jc190aGlzOworCX0gZWxzZSB7CisJCWNwID0gb2NwOworCQkqY3BwID0gb2NwOworCQkqY3ArKyA9IGNoYW5nZXM7CisJfQorCWNwID0gcHV0MTYoY3AsKHNob3J0KWRlbHRhQSk7CS8qIFdyaXRlIFRDUCBjaGVja3N1bSAqLworLyogZGVsdGFTIGlzIG5vdyB0aGUgc2l6ZSBvZiB0aGUgY2hhbmdlIHNlY3Rpb24gb2YgdGhlIGNvbXByZXNzZWQgaGVhZGVyICovCisJbWVtY3B5KGNwLG5ld19zZXEsZGVsdGFTKTsJLyogV3JpdGUgbGlzdCBvZiBkZWx0YXMgKi8KKwltZW1jcHkoY3ArZGVsdGFTLGljcCtobGVuLGlzaXplLWhsZW4pOworCWNvbXAtPnNsc19vX2NvbXByZXNzZWQrKzsKKwlvY3BbMF0gfD0gU0xfVFlQRV9DT01QUkVTU0VEX1RDUDsKKwlyZXR1cm4gaXNpemUgLSBobGVuICsgZGVsdGFTICsgKGNwIC0gb2NwKTsKKworCS8qIFVwZGF0ZSBjb25uZWN0aW9uIHN0YXRlIGNzICYgc2VuZCB1bmNvbXByZXNzZWQgcGFja2V0IChpLmUuLAorCSAqIGEgcmVndWxhciBpcC90Y3AgcGFja2V0IGJ1dCB3aXRoIHRoZSAnY29udmVyc2F0aW9uIGlkJyB3ZSBob3BlCisJICogdG8gdXNlIG9uIGZ1dHVyZSBjb21wcmVzc2VkIHBhY2tldHMgaW4gdGhlIHByb3RvY29sIGZpZWxkKS4KKwkgKi8KK3VuY29tcHJlc3NlZDoKKwltZW1jcHkoJmNzLT5jc19pcCxpcCwyMCk7CisJbWVtY3B5KCZjcy0+Y3NfdGNwLHRoLDIwKTsKKwlpZiAoaXAtPmlobCA+IDUpCisJICBtZW1jcHkoY3MtPmNzX2lwb3B0LCBpcCsxLCAoKGlwLT5paGwpIC0gNSkgKiA0KTsKKwlpZiAodGgtPmRvZmYgPiA1KQorCSAgbWVtY3B5KGNzLT5jc190Y3BvcHQsIHRoKzEsICgodGgtPmRvZmYpIC0gNSkgKiA0KTsKKwljb21wLT54bWl0X2N1cnJlbnQgPSBjcy0+Y3NfdGhpczsKKwljb21wLT5zbHNfb191bmNvbXByZXNzZWQrKzsKKwltZW1jcHkob2NwLCBpY3AsIGlzaXplKTsKKwkqY3BwID0gb2NwOworCW9jcFs5XSA9IGNzLT5jc190aGlzOworCW9jcFswXSB8PSBTTF9UWVBFX1VOQ09NUFJFU1NFRF9UQ1A7CisJcmV0dXJuIGlzaXplOworfQorCisKK2ludAorc2xoY191bmNvbXByZXNzKHN0cnVjdCBzbGNvbXByZXNzICpjb21wLCB1bnNpZ25lZCBjaGFyICppY3AsIGludCBpc2l6ZSkKK3sKKwlyZWdpc3RlciBpbnQgY2hhbmdlczsKKwlsb25nIHg7CisJcmVnaXN0ZXIgc3RydWN0IHRjcGhkciAqdGhwOworCXJlZ2lzdGVyIHN0cnVjdCBpcGhkciAqaXA7CisJcmVnaXN0ZXIgc3RydWN0IGNzdGF0ZSAqY3M7CisJaW50IGxlbiwgaGRybGVuOworCXVuc2lnbmVkIGNoYXIgKmNwID0gaWNwOworCisJLyogV2UndmUgZ290IGEgY29tcHJlc3NlZCBwYWNrZXQ7IHJlYWQgdGhlIGNoYW5nZSBieXRlICovCisJY29tcC0+c2xzX2lfY29tcHJlc3NlZCsrOworCWlmKGlzaXplIDwgMyl7CisJCWNvbXAtPnNsc19pX2Vycm9yKys7CisJCXJldHVybiAwOworCX0KKwljaGFuZ2VzID0gKmNwKys7CisJaWYoY2hhbmdlcyAmIE5FV19DKXsKKwkJLyogTWFrZSBzdXJlIHRoZSBzdGF0ZSBpbmRleCBpcyBpbiByYW5nZSwgdGhlbiBncmFiIHRoZSBzdGF0ZS4KKwkJICogSWYgd2UgaGF2ZSBhIGdvb2Qgc3RhdGUgaW5kZXgsIGNsZWFyIHRoZSAnZGlzY2FyZCcgZmxhZy4KKwkJICovCisJCXggPSAqY3ArKzsJLyogUmVhZCBjb25uIGluZGV4ICovCisJCWlmKHggPCAwIHx8IHggPiBjb21wLT5yc2xvdF9saW1pdCkKKwkJCWdvdG8gYmFkOworCisJCWNvbXAtPmZsYWdzICY9fiBTTEZfVE9TUzsKKwkJY29tcC0+cmVjdl9jdXJyZW50ID0geDsKKwl9IGVsc2UgeworCQkvKiB0aGlzIHBhY2tldCBoYXMgYW4gaW1wbGljaXQgc3RhdGUgaW5kZXguICBJZiB3ZSd2ZQorCQkgKiBoYWQgYSBsaW5lIGVycm9yIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZ290IGFuCisJCSAqIGV4cGxpY2l0IHN0YXRlIGluZGV4LCB3ZSBoYXZlIHRvIHRvc3MgdGhlIHBhY2tldC4gKi8KKwkJaWYoY29tcC0+ZmxhZ3MgJiBTTEZfVE9TUyl7CisJCQljb21wLT5zbHNfaV90b3NzZWQrKzsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWNzID0gJmNvbXAtPnJzdGF0ZVtjb21wLT5yZWN2X2N1cnJlbnRdOworCXRocCA9ICZjcy0+Y3NfdGNwOworCWlwID0gJmNzLT5jc19pcDsKKworCWlmKCh4ID0gcHVsbDE2KCZjcCkpID09IC0xKSB7CS8qIFJlYWQgdGhlIFRDUCBjaGVja3N1bSAqLworCQlnb3RvIGJhZDsKKyAgICAgICAgfQorCXRocC0+Y2hlY2sgPSBodG9ucyh4KTsKKworCXRocC0+cHNoID0gKGNoYW5nZXMgJiBUQ1BfUFVTSF9CSVQpID8gMSA6IDA7CisvKgorICogd2UgY2FuIHVzZSB0aGUgc2FtZSBudW1iZXIgZm9yIHRoZSBsZW5ndGggb2YgdGhlIHNhdmVkIGhlYWRlciBhbmQKKyAqIHRoZSBjdXJyZW50IG9uZSwgYmVjYXVzZSB0aGUgcGFja2V0IHdvdWxkbid0IGhhdmUgYmVlbiBzZW50CisgKiBhcyBjb21wcmVzc2VkIHVubGVzcyB0aGUgb3B0aW9ucyB3ZXJlIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBvbmUKKyAqLworCisJaGRybGVuID0gaXAtPmlobCAqIDQgKyB0aHAtPmRvZmYgKiA0OworCisJc3dpdGNoKGNoYW5nZXMgJiBTUEVDSUFMU19NQVNLKXsKKwljYXNlIFNQRUNJQUxfSToJCS8qIEVjaG9lZCB0ZXJtaW5hbCB0cmFmZmljICovCisJCXsKKwkJcmVnaXN0ZXIgc2hvcnQgaTsKKwkJaSA9IG50b2hzKGlwLT50b3RfbGVuKSAtIGhkcmxlbjsKKwkJdGhwLT5hY2tfc2VxID0gaHRvbmwoIG50b2hsKHRocC0+YWNrX3NlcSkgKyBpKTsKKwkJdGhwLT5zZXEgPSBodG9ubCggbnRvaGwodGhwLT5zZXEpICsgaSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNQRUNJQUxfRDoJCQkvKiBVbmlkaXJlY3Rpb25hbCBkYXRhICovCisJCXRocC0+c2VxID0gaHRvbmwoIG50b2hsKHRocC0+c2VxKSArCisJCQkJICBudG9ocyhpcC0+dG90X2xlbikgLSBoZHJsZW4pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlmKGNoYW5nZXMgJiBORVdfVSl7CisJCQl0aHAtPnVyZyA9IDE7CisJCQlpZigoeCA9IGRlY29kZSgmY3ApKSA9PSAtMSkgeworCQkJCWdvdG8gYmFkOworCQkJfQorCQkJdGhwLT51cmdfcHRyID0gaHRvbnMoeCk7CisJCX0gZWxzZQorCQkJdGhwLT51cmcgPSAwOworCQlpZihjaGFuZ2VzICYgTkVXX1cpeworCQkJaWYoKHggPSBkZWNvZGUoJmNwKSkgPT0gLTEpIHsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCXRocC0+d2luZG93ID0gaHRvbnMoIG50b2hzKHRocC0+d2luZG93KSArIHgpOworCQl9CisJCWlmKGNoYW5nZXMgJiBORVdfQSl7CisJCQlpZigoeCA9IGRlY29kZSgmY3ApKSA9PSAtMSkgeworCQkJCWdvdG8gYmFkOworCQkJfQorCQkJdGhwLT5hY2tfc2VxID0gaHRvbmwoIG50b2hsKHRocC0+YWNrX3NlcSkgKyB4KTsKKwkJfQorCQlpZihjaGFuZ2VzICYgTkVXX1MpeworCQkJaWYoKHggPSBkZWNvZGUoJmNwKSkgPT0gLTEpIHsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCXRocC0+c2VxID0gaHRvbmwoIG50b2hsKHRocC0+c2VxKSArIHgpOworCQl9CisJCWJyZWFrOworCX0KKwlpZihjaGFuZ2VzICYgTkVXX0kpeworCQlpZigoeCA9IGRlY29kZSgmY3ApKSA9PSAtMSkgeworCQkJZ290byBiYWQ7CisJCX0KKwkJaXAtPmlkID0gaHRvbnMgKG50b2hzIChpcC0+aWQpICsgeCk7CisJfSBlbHNlCisJCWlwLT5pZCA9IGh0b25zIChudG9ocyAoaXAtPmlkKSArIDEpOworCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50LCBjcCBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgZGF0YSBpbiB0aGUKKwkgKiBwYWNrZXQuICBQdXQgdGhlIHJlY29uc3RydWN0ZWQgVENQIGFuZCBJUCBoZWFkZXJzIGJhY2sgb24gdGhlCisJICogcGFja2V0LiAgUmVjYWxjdWxhdGUgSVAgY2hlY2tzdW0gKGJ1dCBub3QgVENQIGNoZWNrc3VtKS4KKwkgKi8KKworCWxlbiA9IGlzaXplIC0gKGNwIC0gaWNwKTsKKwlpZiAobGVuIDwgMCkKKwkJZ290byBiYWQ7CisJbGVuICs9IGhkcmxlbjsKKwlpcC0+dG90X2xlbiA9IGh0b25zKGxlbik7CisJaXAtPmNoZWNrID0gMDsKKworCW1lbW1vdmUoaWNwICsgaGRybGVuLCBjcCwgbGVuIC0gaGRybGVuKTsKKworCWNwID0gaWNwOworCW1lbWNweShjcCwgaXAsIDIwKTsKKwljcCArPSAyMDsKKworCWlmIChpcC0+aWhsID4gNSkgeworCSAgbWVtY3B5KGNwLCBjcy0+Y3NfaXBvcHQsIChpcC0+aWhsIC0gNSkgKiA0KTsKKwkgIGNwICs9IChpcC0+aWhsIC0gNSkgKiA0OworCX0KKworCXB1dF91bmFsaWduZWQoaXBfZmFzdF9jc3VtKGljcCwgaXAtPmlobCksCisJCSAgICAgICYoKHN0cnVjdCBpcGhkciAqKWljcCktPmNoZWNrKTsKKworCW1lbWNweShjcCwgdGhwLCAyMCk7CisJY3AgKz0gMjA7CisKKwlpZiAodGhwLT5kb2ZmID4gNSkgeworCSAgbWVtY3B5KGNwLCBjcy0+Y3NfdGNwb3B0LCAoKHRocC0+ZG9mZikgLSA1KSAqIDQpOworCSAgY3AgKz0gKCh0aHAtPmRvZmYpIC0gNSkgKiA0OworCX0KKworCXJldHVybiBsZW47CitiYWQ6CisJY29tcC0+c2xzX2lfZXJyb3IrKzsKKwlyZXR1cm4gc2xoY190b3NzKCBjb21wICk7Cit9CisKKworaW50CitzbGhjX3JlbWVtYmVyKHN0cnVjdCBzbGNvbXByZXNzICpjb21wLCB1bnNpZ25lZCBjaGFyICppY3AsIGludCBpc2l6ZSkKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgY3N0YXRlICpjczsKKwl1bnNpZ25lZCBpaGw7CisKKwl1bnNpZ25lZCBjaGFyIGluZGV4OworCisJaWYoaXNpemUgPCAyMCkgeworCQkvKiBUaGUgcGFja2V0IGlzIHNob3J0ZXIgdGhhbiBhIGxlZ2FsIElQIGhlYWRlciAqLworCQljb21wLT5zbHNfaV9ydW50Kys7CisJCXJldHVybiBzbGhjX3Rvc3MoIGNvbXAgKTsKKwl9CisJLyogUGVlayBhdCB0aGUgSVAgaGVhZGVyJ3MgSUhMIGZpZWxkIHRvIGZpbmQgaXRzIGxlbmd0aCAqLworCWlobCA9IGljcFswXSAmIDB4ZjsKKwlpZihpaGwgPCAyMCAvIDQpeworCQkvKiBUaGUgSVAgaGVhZGVyIGxlbmd0aCBmaWVsZCBpcyB0b28gc21hbGwgKi8KKwkJY29tcC0+c2xzX2lfcnVudCsrOworCQlyZXR1cm4gc2xoY190b3NzKCBjb21wICk7CisJfQorCWluZGV4ID0gaWNwWzldOworCWljcFs5XSA9IElQUFJPVE9fVENQOworCisJaWYgKGlwX2Zhc3RfY3N1bShpY3AsIGlobCkpIHsKKwkJLyogQmFkIElQIGhlYWRlciBjaGVja3N1bTsgZGlzY2FyZCAqLworCQljb21wLT5zbHNfaV9iYWRjaGVjaysrOworCQlyZXR1cm4gc2xoY190b3NzKCBjb21wICk7CisJfQorCWlmKGluZGV4ID4gY29tcC0+cnNsb3RfbGltaXQpIHsKKwkJY29tcC0+c2xzX2lfZXJyb3IrKzsKKwkJcmV0dXJuIHNsaGNfdG9zcyhjb21wKTsKKwl9CisKKwkvKiBVcGRhdGUgbG9jYWwgc3RhdGUgKi8KKwljcyA9ICZjb21wLT5yc3RhdGVbY29tcC0+cmVjdl9jdXJyZW50ID0gaW5kZXhdOworCWNvbXAtPmZsYWdzICY9fiBTTEZfVE9TUzsKKwltZW1jcHkoJmNzLT5jc19pcCxpY3AsMjApOworCW1lbWNweSgmY3MtPmNzX3RjcCxpY3AgKyBpaGwqNCwyMCk7CisJaWYgKGlobCA+IDUpCisJICBtZW1jcHkoY3MtPmNzX2lwb3B0LCBpY3AgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSwgKGlobCAtIDUpICogNCk7CisJaWYgKGNzLT5jc190Y3AuZG9mZiA+IDUpCisJICBtZW1jcHkoY3MtPmNzX3RjcG9wdCwgaWNwICsgaWhsKjQgKyBzaXplb2Yoc3RydWN0IHRjcGhkciksIChjcy0+Y3NfdGNwLmRvZmYgLSA1KSAqIDQpOworCWNzLT5jc19oc2l6ZSA9IGlobCoyICsgY3MtPmNzX3RjcC5kb2ZmKjI7CisJLyogUHV0IGhlYWRlcnMgYmFjayBvbiBwYWNrZXQKKwkgKiBOZWl0aGVyIGhlYWRlciBjaGVja3N1bSBpcyByZWNhbGN1bGF0ZWQKKwkgKi8KKwljb21wLT5zbHNfaV91bmNvbXByZXNzZWQrKzsKKwlyZXR1cm4gaXNpemU7Cit9CisKK2ludAorc2xoY190b3NzKHN0cnVjdCBzbGNvbXByZXNzICpjb21wKQoreworCWlmICggY29tcCA9PSBOVUxMU0xDT01QUiApCisJCXJldHVybiAwOworCisJY29tcC0+ZmxhZ3MgfD0gU0xGX1RPU1M7CisJcmV0dXJuIDA7Cit9CisKKworLyogVkogaGVhZGVyIGNvbXByZXNzaW9uICovCitFWFBPUlRfU1lNQk9MKHNsaGNfaW5pdCk7CitFWFBPUlRfU1lNQk9MKHNsaGNfZnJlZSk7CitFWFBPUlRfU1lNQk9MKHNsaGNfcmVtZW1iZXIpOworRVhQT1JUX1NZTUJPTChzbGhjX2NvbXByZXNzKTsKK0VYUE9SVF9TWU1CT0woc2xoY191bmNvbXByZXNzKTsKK0VYUE9SVF9TWU1CT0woc2xoY190b3NzKTsKKworI2lmZGVmIE1PRFVMRQorCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJDU0xJUDogY29kZSBjb3B5cmlnaHQgMTk4OSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWFcbiIpOworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuOworfQorCisjZW5kaWYgLyogTU9EVUxFICovCisjZWxzZSAvKiBDT05GSUdfSU5FVCAqLworCisKK2ludAorc2xoY190b3NzKHN0cnVjdCBzbGNvbXByZXNzICpjb21wKQoreworICBwcmludGsoS0VSTl9ERUJVRyAiQ2FsbGVkIElQIGZ1bmN0aW9uIG9uIG5vbiBJUC1zeXN0ZW06IHNsaGNfdG9zcyIpOworICByZXR1cm4gLUVJTlZBTDsKK30KK2ludAorc2xoY191bmNvbXByZXNzKHN0cnVjdCBzbGNvbXByZXNzICpjb21wLCB1bnNpZ25lZCBjaGFyICppY3AsIGludCBpc2l6ZSkKK3sKKyAgcHJpbnRrKEtFUk5fREVCVUcgIkNhbGxlZCBJUCBmdW5jdGlvbiBvbiBub24gSVAtc3lzdGVtOiBzbGhjX3VuY29tcHJlc3MiKTsKKyAgcmV0dXJuIC1FSU5WQUw7Cit9CitpbnQKK3NsaGNfY29tcHJlc3Moc3RydWN0IHNsY29tcHJlc3MgKmNvbXAsIHVuc2lnbmVkIGNoYXIgKmljcCwgaW50IGlzaXplLAorCXVuc2lnbmVkIGNoYXIgKm9jcCwgdW5zaWduZWQgY2hhciAqKmNwcCwgaW50IGNvbXByZXNzX2NpZCkKK3sKKyAgcHJpbnRrKEtFUk5fREVCVUcgIkNhbGxlZCBJUCBmdW5jdGlvbiBvbiBub24gSVAtc3lzdGVtOiBzbGhjX2NvbXByZXNzIik7CisgIHJldHVybiAtRUlOVkFMOworfQorCitpbnQKK3NsaGNfcmVtZW1iZXIoc3RydWN0IHNsY29tcHJlc3MgKmNvbXAsIHVuc2lnbmVkIGNoYXIgKmljcCwgaW50IGlzaXplKQoreworICBwcmludGsoS0VSTl9ERUJVRyAiQ2FsbGVkIElQIGZ1bmN0aW9uIG9uIG5vbiBJUC1zeXN0ZW06IHNsaGNfcmVtZW1iZXIiKTsKKyAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3ZvaWQKK3NsaGNfZnJlZShzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCkKK3sKKyAgcHJpbnRrKEtFUk5fREVCVUcgIkNhbGxlZCBJUCBmdW5jdGlvbiBvbiBub24gSVAtc3lzdGVtOiBzbGhjX2ZyZWUiKTsKKyAgcmV0dXJuOworfQorc3RydWN0IHNsY29tcHJlc3MgKgorc2xoY19pbml0KGludCByc2xvdHMsIGludCB0c2xvdHMpCit7CisgIHByaW50ayhLRVJOX0RFQlVHICJDYWxsZWQgSVAgZnVuY3Rpb24gb24gbm9uIElQLXN5c3RlbTogc2xoY19pbml0Iik7CisgIHJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChzbGhjX2luaXQpOworRVhQT1JUX1NZTUJPTChzbGhjX2ZyZWUpOworRVhQT1JUX1NZTUJPTChzbGhjX3JlbWVtYmVyKTsKK0VYUE9SVF9TWU1CT0woc2xoY19jb21wcmVzcyk7CitFWFBPUlRfU1lNQk9MKHNsaGNfdW5jb21wcmVzcyk7CitFWFBPUlRfU1lNQk9MKHNsaGNfdG9zcyk7CisKKyNlbmRpZiAvKiBDT05GSUdfSU5FVCAqLworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2xpcC5jIGIvZHJpdmVycy9uZXQvc2xpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTUyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zbGlwLmMKQEAgLTAsMCArMSwxNTIyIEBACisvKgorICogc2xpcC5jCVRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIFNMSVAgcHJvdG9jb2wgZm9yIGtlcm5lbC1iYXNlZAorICoJCWRldmljZXMgbGlrZSBUVFkuICBJdCBpbnRlcmZhY2VzIGJldHdlZW4gYSByYXcgVFRZLCBhbmQgdGhlCisgKgkJa2VybmVsJ3MgSU5FVCBwcm90b2NvbCBsYXllcnMuCisgKgorICogVmVyc2lvbjoJQCgjKXNsaXAuYwkwLjguMwkxMi8yNC85NAorICoKKyAqIEF1dGhvcnM6CUxhdXJlbmNlIEN1bGhhbmUsIDxsb3pAaG9sbWVzLmRlbW9uLmNvLnVrPgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1d2FsdC5ubC5tdWduZXQub3JnPgorICoKKyAqIEZpeGVzOgorICoJCUFsYW4gQ294CTogCVNhbml0eSBjaGVja3MgYW5kIGF2b2lkIHR4IG92ZXJydW5zLgorICoJCQkJCUhhcyBhIG5ldyBzbC0+bXR1IGZpZWxkLgorICoJCUFsYW4gQ294CTogCUZvdW5kIGNhdXNlIG9mIG92ZXJydW4uIGlmY29uZmlnIHNsMCBtdHUgdXB3YXJkcy4KKyAqCQkJCQlEcml2ZXIgbm93IHNwb3RzIHRoaXMgYW5kIGdyb3dzL3Nocmlua3MgaXRzIGJ1ZmZlcnMoaGFjayEpLgorICoJCQkJCU1lbW9yeSBsZWFrIGlmIHlvdSBydW4gb3V0IG9mIG1lbW9yeSBzZXR0aW5nIHVwIGEgc2xpcCBkcml2ZXIgZml4ZWQuCisgKgkJTWF0dCBEaWxsb24JOglQcmludGFibGUgc2xpcCAoYm9ycm93ZWQgZnJvbSBORVQyRSkKKyAqCVBhdWxpbmUgTWlkZGVsaW5rCToJU2xpcCBkcml2ZXIgZml4ZXMuCisgKgkJQWxhbiBDb3gJOglIb25vdXJzIHRoZSBvbGQgU0xfQ09NUFJFU1NFRCBmbGFnCisgKgkJQWxhbiBDb3gJOglLSVNTIEFYLjI1IGFuZCBBWFVJIElQIHN1cHBvcnQKKyAqCQlNaWNoYWVsIFJpZXBlCToJQXV0b21hdGljIENTTElQIHJlY29nbml0aW9uIGFkZGVkCisgKgkJQ2hhcmxlcyBIZWRyaWNrIDoJQ1NMSVAgaGVhZGVyIGxlbmd0aCBwcm9ibGVtIGZpeC4KKyAqCQlBbGFuIENveAk6CUNvcnJlY3RlZCBub24tSVAgY2FzZXMgb2YgdGhlIGFib3ZlLgorICoJCUFsYW4gQ294CToJTm93IHVzZXMgaGFyZHdhcmUgdHlwZSBhcyBwZXIgRnZLLgorICoJCUFsYW4gQ294CToJRGVmYXVsdCB0byAxOTIuMTY4LjAuMCAoUkZDIDE1OTcpCisgKgkJQS5OLkt1em5ldHNvdgk6CWRldl90aW50KCkgcmVjdXJzaW9uIGZpeC4KKyAqCURtaXRyeSBHb3JvZGNoYW5pbgk6CVNMSVAgbWVtb3J5IGxlYWtzCisgKiAgICAgIERtaXRyeSBHb3JvZGNoYW5pbiAgICAgIDogICAgICAgQ29kZSBjbGVhbnVwLiBSZWR1Y2UgdHR5IGRyaXZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmluZyBmcm9tIDQwOTYgdG8gMjU2IGJ5dGVzLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcHJvdmluZyBTTElQIHJlc3BvbnNlIHRpbWUuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX1NMSVBfTU9ERV9TTElQNi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmNvbmZpZyBzbD8gdXAgJiBkb3duIG5vdyB3b3JrcyBjb3JyZWN0bHkuCisgKgkJCQkJTW9kdWxhcml6YXRpb24uCisgKiAgICAgICAgICAgICAgQWxhbiBDb3ggICAgICAgIDogICAgICAgT29wcyAtIGZpeCBBWC4yNSBidWZmZXIgbGVuZ3RocworICogICAgICBEbWl0cnkgR29yb2RjaGFuaW4gICAgICA6ICAgICAgIEV2ZW4gbW9yZSBjbGVhbnVwcy4gUHJlc2VydmUgQ1NMSVAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWNzLiBJbmNsdWRlIENTTElQIGNvZGUgb25seQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0IHJlYWxseSBuZWVkZWQuCisgKgkJQWxhbiBDb3gJOglGcmVlIHNsaGMgYnVmZmVycyBpbiB0aGUgcmlnaHQgcGxhY2UuCisgKgkJQWxhbiBDb3gJOglBbGxvdyBmb3IgZGlnaXBlYXRlZCBJUCBvdmVyIEFYLjI1CisgKgkJTWF0dGkgQWFybmlvCToJRHluYW1pYyBTTElQIGRldmljZXMsIHdpdGggaWRlYXMgdGFrZW4KKyAqCQkJCQlmcm9tIEppbSBGcmVlbWFuJ3MgPGpmcmVlQGNhbGRlcmEuY29tPgorICoJCQkJCWR5bmFtaWMgUFBQIGRldmljZXMuICBXZSBkbyBOT1Qga2ZyZWUoKQorICoJCQkJCWRldmljZSBlbnRyaWVzLCBqdXN0IHJlZy4vdW5yZWcuIHRoZW0KKyAqCQkJCQlhcyB0aGV5IGFyZSBuZWVkZWQuICBXZSBrZnJlZSgpIHRoZW0KKyAqCQkJCQlhdCBtb2R1bGUgY2xlYW51cC4KKyAqCQkJCQlXaXRoIE1PRFVMRS1sb2FkaW5nIGBgaW5zbW9kJycsIHVzZXIgY2FuCisgKgkJCQkJaXNzdWUgcGFyYW1ldGVyOiAgIHNsaXBfbWF4ZGV2PTEwMjQKKyAqCQkJCQkoT3IgaG93IG11Y2ggaGUvc2hlIHdhbnRzLi4gRGVmYXVsdCBpcyAyNTYpCisgKiAqCVN0YW5pc2xhdiBWb3JvbnlpCToJU2xpcCBsaW5lIGNoZWNraW5nLCB3aXRoIGlkZWFzIHRha2VuCisgKgkJCQkJZnJvbSBtdWx0aXNsaXAgQlNESSBkcml2ZXIgd2hpY2ggd2FzIHdyaXR0ZW4KKyAqCQkJCQlieSBJZ29yIENoZWNoaWssIFJFTENPTSBDb3JwLiBPbmx5IGFsZ29yaXRobXMKKyAqIAkJCQkJaGF2ZSBiZWVuIHBvcnRlZCB0byBMaW51eCBTTElQIGRyaXZlci4KKyAqCVZpdGFseSBFLiBMYXZyb3YJOglTYW5lIGJlaGF2aW91ciBvbiB0dHkgaGFuZ3VwLgorICoJQWxleGV5IEt1em5ldHNvdgk6CUNsZWFudXAgaW50ZXJmYWNlcyB0byB0dHkmbmV0ZGV2aWNlIG1vZHVsZXMuCisgKi8KKworI2RlZmluZSBTTF9DSEVDS19UUkFOU01JVAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3NsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSAic2xpcC5oIgorI2lmZGVmIENPTkZJR19JTkVUCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvc2xoY192ai5oPgorI2VuZGlmCisKKyNkZWZpbmUgU0xJUF9WRVJTSU9OCSIwLjguNC1ORVQzLjAxOS1ORVdUVFkiCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqKnNsaXBfZGV2czsKKworc3RhdGljIGludCBzbGlwX21heGRldiA9IFNMX05SVU5JVDsKK21vZHVsZV9wYXJhbShzbGlwX21heGRldiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2xpcF9tYXhkZXYsICJNYXhpbXVtIG51bWJlciBvZiBzbGlwIGRldmljZXMiKTsKKworc3RhdGljIGludCBzbGlwX2VzYyh1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIHNsaXBfdW5lc2Moc3RydWN0IHNsaXAgKnNsLCB1bnNpZ25lZCBjaGFyIGMpOworI2lmZGVmIENPTkZJR19TTElQX01PREVfU0xJUDYKK3N0YXRpYyBpbnQgc2xpcF9lc2M2KHVuc2lnbmVkIGNoYXIgKnAsIHVuc2lnbmVkIGNoYXIgKmQsIGludCBsZW4pOworc3RhdGljIHZvaWQgc2xpcF91bmVzYzYoc3RydWN0IHNsaXAgKnNsLCB1bnNpZ25lZCBjaGFyIGMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKK3N0YXRpYyB2b2lkIHNsX2tlZXBhbGl2ZSh1bnNpZ25lZCBsb25nIHNscyk7CitzdGF0aWMgdm9pZCBzbF9vdXRmaWxsKHVuc2lnbmVkIGxvbmcgc2xzKTsKK3N0YXRpYyBpbnQgc2xfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgaWZyZXEgKnJxLGludCBjbWQpOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgQnVmZmVyIGFkbWluaXN0cmF0aW9uIHJvdXRpbmVzOgorKglzbF9hbGxvY19idWZzKCkKKyoJc2xfZnJlZV9idWZzKCkKKyoJc2xfcmVhbGxvY19idWZzKCkKKyoKKyogTk9URTogc2xfcmVhbGxvY19idWZzICE9IHNsX2ZyZWVfYnVmcyArIHNsX2FsbG9jX2J1ZnMsIGJlY2F1c2UKKyoJc2xfcmVhbGxvY19idWZzIHByb3ZpZGVzIHN0cm9uZyBhdG9taWNpdHkgYW5kIHJlYWxsb2NhdGlvbgorKglvbiBhY3RpdmVseSBydW5uaW5nIGRldmljZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogCisgICBBbGxvY2F0ZSBjaGFubmVsIGJ1ZmZlcnMuCisgKi8KKworc3RhdGljIGludAorc2xfYWxsb2NfYnVmcyhzdHJ1Y3Qgc2xpcCAqc2wsIGludCBtdHUpCit7CisJaW50IGVyciA9IC1FTk9CVUZTOworCXVuc2lnbmVkIGxvbmcgbGVuOworCWNoYXIgKiByYnVmZiA9IE5VTEw7CisJY2hhciAqIHhidWZmID0gTlVMTDsKKyNpZmRlZiBTTF9JTkNMVURFX0NTTElQCisJY2hhciAqIGNidWZmID0gTlVMTDsKKwlzdHJ1Y3Qgc2xjb21wcmVzcyAqc2xjb21wID0gTlVMTDsKKyNlbmRpZgorCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgU0xJUCBmcmFtZSBidWZmZXJzOgorCSAqCisJICogcmJ1ZmYJUmVjZWl2ZSBidWZmZXIuCisJICogeGJ1ZmYJVHJhbnNtaXQgYnVmZmVyLgorCSAqIGNidWZmICAgICAgICBUZW1wb3JhcnkgY29tcHJlc3Npb24gYnVmZmVyLgorCSAqLworCWxlbiA9IG10dSAqIDI7CisKKwkvKgorCSAqIGFsbG93IGZvciBhcnJpdmFsIG9mIGxhcmdlciBVRFAgcGFja2V0cywgZXZlbiBpZiB3ZSBzYXkgbm90IHRvCisJICogYWxzbyBmaXhlcyBhIGJ1ZyBpbiB3aGljaCBTdW5PUyBzZW5kcyA1MTItYnl0ZSBwYWNrZXRzIGV2ZW4gd2l0aAorCSAqIGFuIE1TUyBvZiAxMjgKKwkgKi8KKwlpZiAobGVuIDwgNTc2ICogMikKKwkJbGVuID0gNTc2ICogMjsKKwlyYnVmZiA9IGttYWxsb2MobGVuICsgNCwgR0ZQX0tFUk5FTCk7CisJaWYgKHJidWZmID09IE5VTEwpCisJCWdvdG8gZXJyX2V4aXQ7CisJeGJ1ZmYgPSBrbWFsbG9jKGxlbiArIDQsIEdGUF9LRVJORUwpOworCWlmICh4YnVmZiA9PSBOVUxMKQorCQlnb3RvIGVycl9leGl0OworI2lmZGVmIFNMX0lOQ0xVREVfQ1NMSVAKKwljYnVmZiA9IGttYWxsb2MobGVuICsgNCwgR0ZQX0tFUk5FTCk7CisJaWYgKGNidWZmID09IE5VTEwpCisJCWdvdG8gZXJyX2V4aXQ7CisJc2xjb21wID0gc2xoY19pbml0KDE2LCAxNik7CisJaWYgKHNsY29tcCA9PSBOVUxMKQorCQlnb3RvIGVycl9leGl0OworI2VuZGlmCisJc3Bpbl9sb2NrX2JoKCZzbC0+bG9jayk7CisJaWYgKHNsLT50dHkgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9leGl0OworCX0KKwlzbC0+bXR1CSAgICAgPSBtdHU7CisJc2wtPmJ1ZmZzaXplID0gbGVuOworCXNsLT5yY291bnQgICA9IDA7CisJc2wtPnhsZWZ0ICAgID0gMDsKKwlyYnVmZiA9IHhjaGcoJnNsLT5yYnVmZiwgcmJ1ZmYpOworCXhidWZmID0geGNoZygmc2wtPnhidWZmLCB4YnVmZik7CisjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAorCWNidWZmID0geGNoZygmc2wtPmNidWZmLCBjYnVmZik7CisJc2xjb21wID0geGNoZygmc2wtPnNsY29tcCwgc2xjb21wKTsKKyNpZmRlZiBDT05GSUdfU0xJUF9NT0RFX1NMSVA2CisJc2wtPnhkYXRhICAgID0gMDsKKwlzbC0+eGJpdHMgICAgPSAwOworI2VuZGlmCisjZW5kaWYKKwlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCWVyciA9IDA7CisKKwkvKiBDbGVhbnVwICovCitlcnJfZXhpdDoKKyNpZmRlZiBTTF9JTkNMVURFX0NTTElQCisJaWYgKGNidWZmKQorCQlrZnJlZShjYnVmZik7CisJaWYgKHNsY29tcCkKKwkJc2xoY19mcmVlKHNsY29tcCk7CisjZW5kaWYKKwlpZiAoeGJ1ZmYpCisJCWtmcmVlKHhidWZmKTsKKwlpZiAocmJ1ZmYpCisJCWtmcmVlKHJidWZmKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBGcmVlIGEgU0xJUCBjaGFubmVsIGJ1ZmZlcnMuICovCitzdGF0aWMgdm9pZAorc2xfZnJlZV9idWZzKHN0cnVjdCBzbGlwICpzbCkKK3sKKwl2b2lkICogdG1wOworCisJLyogRnJlZSBhbGwgU0xJUCBmcmFtZSBidWZmZXJzLiAqLworCWlmICgodG1wID0geGNoZygmc2wtPnJidWZmLCBOVUxMKSkgIT0gTlVMTCkKKwkJa2ZyZWUodG1wKTsKKwlpZiAoKHRtcCA9IHhjaGcoJnNsLT54YnVmZiwgTlVMTCkpICE9IE5VTEwpCisJCWtmcmVlKHRtcCk7CisjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAorCWlmICgodG1wID0geGNoZygmc2wtPmNidWZmLCBOVUxMKSkgIT0gTlVMTCkKKwkJa2ZyZWUodG1wKTsKKwlpZiAoKHRtcCA9IHhjaGcoJnNsLT5zbGNvbXAsIE5VTEwpKSAhPSBOVUxMKQorCQlzbGhjX2ZyZWUodG1wKTsKKyNlbmRpZgorfQorCisvKiAKKyAgIFJlYWxsb2NhdGUgc2xpcCBjaGFubmVsIGJ1ZmZlcnMuCisgKi8KKworc3RhdGljIGludCBzbF9yZWFsbG9jX2J1ZnMoc3RydWN0IHNsaXAgKnNsLCBpbnQgbXR1KQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzbC0+ZGV2OworCXVuc2lnbmVkIGNoYXIgKnhidWZmLCAqcmJ1ZmY7CisjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAorCXVuc2lnbmVkIGNoYXIgKmNidWZmOworI2VuZGlmCisJaW50IGxlbiA9IG10dSAqIDI7CisKKy8qCisgKiBhbGxvdyBmb3IgYXJyaXZhbCBvZiBsYXJnZXIgVURQIHBhY2tldHMsIGV2ZW4gaWYgd2Ugc2F5IG5vdCB0bworICogYWxzbyBmaXhlcyBhIGJ1ZyBpbiB3aGljaCBTdW5PUyBzZW5kcyA1MTItYnl0ZSBwYWNrZXRzIGV2ZW4gd2l0aAorICogYW4gTVNTIG9mIDEyOAorICovCisJaWYgKGxlbiA8IDU3NiAqIDIpCisJCWxlbiA9IDU3NiAqIDI7CisKKwl4YnVmZiA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MgKGxlbiArIDQsIEdGUF9BVE9NSUMpOworCXJidWZmID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYyAobGVuICsgNCwgR0ZQX0FUT01JQyk7CisjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAorCWNidWZmID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYyAobGVuICsgNCwgR0ZQX0FUT01JQyk7CisjZW5kaWYKKworCisjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAorCWlmICh4YnVmZiA9PSBOVUxMIHx8IHJidWZmID09IE5VTEwgfHwgY2J1ZmYgPT0gTlVMTCkgIHsKKyNlbHNlCisJaWYgKHhidWZmID09IE5VTEwgfHwgcmJ1ZmYgPT0gTlVMTCkgIHsKKyNlbmRpZgorCQlpZiAobXR1ID49IHNsLT5tdHUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gZ3JvdyBzbGlwIGJ1ZmZlcnMsIE1UVSBjaGFuZ2UgY2FuY2VsbGVkLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZXJyID0gLUVOT0JVRlM7CisJCX0KKwkJZ290byBkb25lOworCX0KKworCXNwaW5fbG9ja19iaCgmc2wtPmxvY2spOworCisJZXJyID0gLUVOT0RFVjsKKwlpZiAoc2wtPnR0eSA9PSBOVUxMKQorCQlnb3RvIGRvbmVfb25fYmg7CisKKwl4YnVmZiAgICA9IHhjaGcoJnNsLT54YnVmZiwgeGJ1ZmYpOworCXJidWZmICAgID0geGNoZygmc2wtPnJidWZmLCByYnVmZik7CisjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAorCWNidWZmICAgID0geGNoZygmc2wtPmNidWZmLCBjYnVmZik7CisjZW5kaWYKKwlpZiAoc2wtPnhsZWZ0KSAgeworCQlpZiAoc2wtPnhsZWZ0IDw9IGxlbikgIHsKKwkJCW1lbWNweShzbC0+eGJ1ZmYsIHNsLT54aGVhZCwgc2wtPnhsZWZ0KTsKKwkJfSBlbHNlICB7CisJCQlzbC0+eGxlZnQgPSAwOworCQkJc2wtPnR4X2Ryb3BwZWQrKzsKKwkJfQorCX0KKwlzbC0+eGhlYWQgPSBzbC0+eGJ1ZmY7CisKKwlpZiAoc2wtPnJjb3VudCkgIHsKKwkJaWYgKHNsLT5yY291bnQgPD0gbGVuKSB7CisJCQltZW1jcHkoc2wtPnJidWZmLCByYnVmZiwgc2wtPnJjb3VudCk7CisJCX0gZWxzZSAgeworCQkJc2wtPnJjb3VudCA9IDA7CisJCQlzbC0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJCXNldF9iaXQoU0xGX0VSUk9SLCAmc2wtPmZsYWdzKTsKKwkJfQorCX0KKwlzbC0+bXR1ICAgICAgPSBtdHU7CisJZGV2LT5tdHUgICAgICA9IG10dTsKKwlzbC0+YnVmZnNpemUgPSBsZW47CisJZXJyID0gMDsKKworZG9uZV9vbl9iaDoKKwlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCitkb25lOgorCWlmICh4YnVmZikKKwkJa2ZyZWUoeGJ1ZmYpOworCWlmIChyYnVmZikKKwkJa2ZyZWUocmJ1ZmYpOworI2lmZGVmIFNMX0lOQ0xVREVfQ1NMSVAKKwlpZiAoY2J1ZmYpCisJCWtmcmVlKGNidWZmKTsKKyNlbmRpZgorCXJldHVybiBlcnI7Cit9CisKKworLyogU2V0IHRoZSAic2VuZGluZyIgZmxhZy4gIFRoaXMgbXVzdCBiZSBhdG9taWMgaGVuY2UgdGhlIHNldF9iaXQuICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3NsX2xvY2soc3RydWN0IHNsaXAgKnNsKQoreworCW5ldGlmX3N0b3BfcXVldWUoc2wtPmRldik7Cit9CisKKworLyogQ2xlYXIgdGhlICJzZW5kaW5nIiBmbGFnLiAgVGhpcyBtdXN0IGJlIGF0b21pYywgaGVuY2UgdGhlIEFTTS4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2xfdW5sb2NrKHN0cnVjdCBzbGlwICpzbCkKK3sKKwluZXRpZl93YWtlX3F1ZXVlKHNsLT5kZXYpOworfQorCisvKiBTZW5kIG9uZSBjb21wbGV0ZWx5IGRlY2Fwc3VsYXRlZCBJUCBkYXRhZ3JhbSB0byB0aGUgSVAgbGF5ZXIuICovCitzdGF0aWMgdm9pZAorc2xfYnVtcChzdHJ1Y3Qgc2xpcCAqc2wpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgY291bnQ7CisKKwljb3VudCA9IHNsLT5yY291bnQ7CisjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAorCWlmIChzbC0+bW9kZSAmIChTTF9NT0RFX0FEQVBUSVZFIHwgU0xfTU9ERV9DU0xJUCkpIHsKKwkJdW5zaWduZWQgY2hhciBjOworCQlpZiAoKGMgPSBzbC0+cmJ1ZmZbMF0pICYgU0xfVFlQRV9DT01QUkVTU0VEX1RDUCkgeworCQkJLyogaWdub3JlIGNvbXByZXNzZWQgcGFja2V0cyB3aGVuIENTTElQIGlzIG9mZiAqLworCQkJaWYgKCEoc2wtPm1vZGUgJiBTTF9NT0RFX0NTTElQKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb21wcmVzc2VkIHBhY2tldCBpZ25vcmVkXG4iLCBzbC0+ZGV2LT5uYW1lKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvKiBtYWtlIHN1cmUgd2UndmUgcmVzZXJ2ZWQgZW5vdWdoIHNwYWNlIGZvciB1bmNvbXByZXNzIHRvIHVzZSAqLworCQkJaWYgKGNvdW50ICsgODAgPiBzbC0+YnVmZnNpemUpIHsKKwkJCQlzbC0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJCQlyZXR1cm47CisJCQl9CisJCQljb3VudCA9IHNsaGNfdW5jb21wcmVzcyhzbC0+c2xjb21wLCBzbC0+cmJ1ZmYsIGNvdW50KTsKKwkJCWlmIChjb3VudCA8PSAwKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgaWYgKGMgPj0gU0xfVFlQRV9VTkNPTVBSRVNTRURfVENQKSB7CisJCQlpZiAoIShzbC0+bW9kZSAmIFNMX01PREVfQ1NMSVApKSB7CisJCQkJLyogdHVybiBvbiBoZWFkZXIgY29tcHJlc3Npb24gKi8KKwkJCQlzbC0+bW9kZSB8PSBTTF9NT0RFX0NTTElQOworCQkJCXNsLT5tb2RlICY9IH5TTF9NT0RFX0FEQVBUSVZFOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBoZWFkZXIgY29tcHJlc3Npb24gdHVybmVkIG9uXG4iLCBzbC0+ZGV2LT5uYW1lKTsKKwkJCX0KKwkJCXNsLT5yYnVmZlswXSAmPSAweDRmOworCQkJaWYgKHNsaGNfcmVtZW1iZXIoc2wtPnNsY29tcCwgc2wtPnJidWZmLCBjb3VudCkgPD0gMCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAgLyogU0xfSU5DTFVERV9DU0xJUCAqLworCisJc2wtPnJ4X2J5dGVzKz1jb3VudDsKKwkKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGNvdW50KTsKKwlpZiAoc2tiID09IE5VTEwpICB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgc2wtPmRldi0+bmFtZSk7CisJCXNsLT5yeF9kcm9wcGVkKys7CisJCXJldHVybjsKKwl9CisJc2tiLT5kZXYgPSBzbC0+ZGV2OworCW1lbWNweShza2JfcHV0KHNrYixjb3VudCksIHNsLT5yYnVmZiwgY291bnQpOworCXNrYi0+bWFjLnJhdz1za2ItPmRhdGE7CisJc2tiLT5wcm90b2NvbD1odG9ucyhFVEhfUF9JUCk7CisJbmV0aWZfcngoc2tiKTsKKwlzbC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlzbC0+cnhfcGFja2V0cysrOworfQorCisvKiBFbmNhcHN1bGF0ZSBvbmUgSVAgZGF0YWdyYW0gYW5kIHN0dWZmIGludG8gYSBUVFkgcXVldWUuICovCitzdGF0aWMgdm9pZAorc2xfZW5jYXBzKHN0cnVjdCBzbGlwICpzbCwgdW5zaWduZWQgY2hhciAqaWNwLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnA7CisJaW50IGFjdHVhbCwgY291bnQ7CisKKwlpZiAobGVuID4gc2wtPm10dSkgewkJLyogU2lnaCwgc2hvdWxkbid0IG9jY3VyIEJVVCAuLi4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRydW5jYXRpbmcgb3ZlcnNpemVkIHRyYW5zbWl0IHBhY2tldCFcbiIsIHNsLT5kZXYtPm5hbWUpOworCQlzbC0+dHhfZHJvcHBlZCsrOworCQlzbF91bmxvY2soc2wpOworCQlyZXR1cm47CisJfQorCisJcCA9IGljcDsKKyNpZmRlZiBTTF9JTkNMVURFX0NTTElQCisJaWYgKHNsLT5tb2RlICYgU0xfTU9ERV9DU0xJUCkgIHsKKwkJbGVuID0gc2xoY19jb21wcmVzcyhzbC0+c2xjb21wLCBwLCBsZW4sIHNsLT5jYnVmZiwgJnAsIDEpOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19TTElQX01PREVfU0xJUDYKKwlpZihzbC0+bW9kZSAmIFNMX01PREVfU0xJUDYpCisJCWNvdW50ID0gc2xpcF9lc2M2KHAsICh1bnNpZ25lZCBjaGFyICopIHNsLT54YnVmZiwgbGVuKTsKKwllbHNlCisjZW5kaWYKKwkJY291bnQgPSBzbGlwX2VzYyhwLCAodW5zaWduZWQgY2hhciAqKSBzbC0+eGJ1ZmYsIGxlbik7CisKKwkvKiBPcmRlciBvZiBuZXh0IHR3byBsaW5lcyBpcyAqdmVyeSogaW1wb3J0YW50LgorCSAqIFdoZW4gd2UgYXJlIHNlbmRpbmcgYSBsaXR0bGUgYW1vdW50IG9mIGRhdGEsCisJICogdGhlIHRyYW5zZmVyIG1heSBiZSBjb21wbGV0ZWQgaW5zaWRlIGRyaXZlci53cml0ZSgpCisJICogcm91dGluZSwgYmVjYXVzZSBpdCdzIHJ1bm5pbmcgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuCisJICogSW4gdGhpcyBjYXNlIHdlICpuZXZlciogZ290IFdSSVRFX1dBS0VVUCBldmVudCwKKwkgKiBpZiB3ZSBkaWQgbm90IHJlcXVlc3QgaXQgYmVmb3JlIHdyaXRlIG9wZXJhdGlvbi4KKwkgKiAgICAgICAxNCBPY3QgMTk5NCAgRG1pdHJ5IEdvcm9kY2hhbmluLgorCSAqLworCXNsLT50dHktPmZsYWdzIHw9ICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCWFjdHVhbCA9IHNsLT50dHktPmRyaXZlci0+d3JpdGUoc2wtPnR0eSwgc2wtPnhidWZmLCBjb3VudCk7CisjaWZkZWYgU0xfQ0hFQ0tfVFJBTlNNSVQKKwlzbC0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisjZW5kaWYKKwlzbC0+eGxlZnQgPSBjb3VudCAtIGFjdHVhbDsKKwlzbC0+eGhlYWQgPSBzbC0+eGJ1ZmYgKyBhY3R1YWw7CisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKKwkvKiBWU1YgKi8KKwljbGVhcl9iaXQoU0xGX09VVFdBSVQsICZzbC0+ZmxhZ3MpOwkvKiByZXNldCBvdXRmaWxsIGZsYWcgKi8KKyNlbmRpZgorfQorCisvKgorICogQ2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZGF0YS4gIElmIHdlIGhhdmUKKyAqIG1vcmUgcGFja2V0cyB0byBzZW5kLCB3ZSBzZW5kIHRoZW0gaGVyZS4KKyAqLworc3RhdGljIHZvaWQgc2xpcF93cml0ZV93YWtldXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpbnQgYWN0dWFsOworCXN0cnVjdCBzbGlwICpzbCA9IChzdHJ1Y3Qgc2xpcCAqKSB0dHktPmRpc2NfZGF0YTsKKworCS8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuICovCisJaWYgKCFzbCB8fCBzbC0+bWFnaWMgIT0gU0xJUF9NQUdJQyB8fCAhbmV0aWZfcnVubmluZyhzbC0+ZGV2KSkgeworCQlyZXR1cm47CisJfQorCWlmIChzbC0+eGxlZnQgPD0gMCkgIHsKKwkJLyogTm93IHNlcmlhbCBidWZmZXIgaXMgYWxtb3N0IGZyZWUgJiB3ZSBjYW4gc3RhcnQKKwkJICogdHJhbnNtaXNzaW9uIG9mIGFub3RoZXIgcGFja2V0ICovCisJCXNsLT50eF9wYWNrZXRzKys7CisJCXR0eS0+ZmxhZ3MgJj0gfigxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCQlzbF91bmxvY2soc2wpOworCQlyZXR1cm47CisJfQorCisJYWN0dWFsID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgc2wtPnhoZWFkLCBzbC0+eGxlZnQpOworCXNsLT54bGVmdCAtPSBhY3R1YWw7CisJc2wtPnhoZWFkICs9IGFjdHVhbDsKK30KKworc3RhdGljIHZvaWQgc2xfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbGlwICpzbCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2soJnNsLT5sb2NrKTsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCQlnb3RvIG91dDsKKworCQkvKiBNYXkgYmUgd2UgbXVzdCBjaGVjayB0cmFuc21pdHRlciB0aW1lb3V0IGhlcmUgPworCQkgKiAgICAgIDE0IE9jdCAxOTk0IERtaXRyeSBHb3JvZGNoYW5pbi4KKwkJICovCisjaWZkZWYgU0xfQ0hFQ0tfVFJBTlNNSVQKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGRldi0+dHJhbnNfc3RhcnQgKyAyMCAqIEhaKSkgIHsKKwkJCS8qIDIwIHNlYyB0aW1lb3V0IG5vdCByZWFjaGVkICovCisJCQlnb3RvIG91dDsKKwkJfQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCAlcz9cbiIsIGRldi0+bmFtZSwKKwkJICAgICAgIChzbC0+dHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlcihzbC0+dHR5KSB8fCBzbC0+eGxlZnQpID8KKwkJICAgICAgICJiYWQgbGluZSBxdWFsaXR5IiA6ICJkcml2ZXIgZXJyb3IiKTsKKwkJc2wtPnhsZWZ0ID0gMDsKKwkJc2wtPnR0eS0+ZmxhZ3MgJj0gfigxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCQlzbF91bmxvY2soc2wpOworI2VuZGlmCisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2soJnNsLT5sb2NrKTsKK30KKworCisvKiBFbmNhcHN1bGF0ZSBhbiBJUCBkYXRhZ3JhbSBhbmQga2ljayBpdCBpbnRvIGEgVFRZIHF1ZXVlLiAqLworc3RhdGljIGludAorc2xfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbGlwICpzbCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2soJnNsLT5sb2NrKTsKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgIHsKKwkJc3Bpbl91bmxvY2soJnNsLT5sb2NrKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHhtaXQgY2FsbCB3aGVuIGlmYWNlIGlzIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzbC0+dHR5ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2soJnNsLT5sb2NrKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzbF9sb2NrKHNsKTsKKwlzbC0+dHhfYnl0ZXMrPXNrYi0+bGVuOworCXNsX2VuY2FwcyhzbCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc3Bpbl91bmxvY2soJnNsLT5sb2NrKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIFJvdXRpbmVzIGxvb2tpbmcgYXQgbmV0ZGV2aWNlIHNpZGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBOZXRkZXZpY2UgVVAgLT4gRE9XTiByb3V0aW5lICovCisKK3N0YXRpYyBpbnQKK3NsX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNsaXAgKnNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19iaCgmc2wtPmxvY2spOworCWlmIChzbC0+dHR5KSB7CisJCS8qIFRUWSBkaXNjaXBsaW5lIGlzIHJ1bm5pbmcuICovCisJCXNsLT50dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwl9CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNsLT5yY291bnQgICA9IDA7CisJc2wtPnhsZWZ0ICAgID0gMDsKKwlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE5ldGRldmljZSBET1dOIC0+IFVQIHJvdXRpbmUgKi8KKworc3RhdGljIGludCBzbF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNsaXAgKnNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChzbC0+dHR5PT1OVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNsLT5mbGFncyAmPSAoMSA8PCBTTEZfSU5VU0UpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qIE5ldGRldmljZSBjaGFuZ2UgTVRVIHJlcXVlc3QgKi8KKworc3RhdGljIGludCBzbF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBzbGlwICpzbCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobmV3X210dSA8IDY4IHx8IG5ld19tdHUgPiA2NTUzNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobmV3X210dSAhPSBkZXYtPm10dSkKKwkJcmV0dXJuIHNsX3JlYWxsb2NfYnVmcyhzbCwgbmV3X210dSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE5ldGRldmljZSBnZXQgc3RhdGlzdGljcyByZXF1ZXN0ICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitzbF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHNsaXAgKnNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyNpZmRlZiBTTF9JTkNMVURFX0NTTElQCisJc3RydWN0IHNsY29tcHJlc3MgKmNvbXA7CisjZW5kaWYKKworCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCisJc3RhdHMucnhfcGFja2V0cyAgICAgPSBzbC0+cnhfcGFja2V0czsKKwlzdGF0cy50eF9wYWNrZXRzICAgICA9IHNsLT50eF9wYWNrZXRzOworCXN0YXRzLnJ4X2J5dGVzCSAgICAgPSBzbC0+cnhfYnl0ZXM7CisJc3RhdHMudHhfYnl0ZXMJICAgICA9IHNsLT50eF9ieXRlczsKKwlzdGF0cy5yeF9kcm9wcGVkICAgICA9IHNsLT5yeF9kcm9wcGVkOworCXN0YXRzLnR4X2Ryb3BwZWQgICAgID0gc2wtPnR4X2Ryb3BwZWQ7CisJc3RhdHMudHhfZXJyb3JzICAgICAgPSBzbC0+dHhfZXJyb3JzOworCXN0YXRzLnJ4X2Vycm9ycyAgICAgID0gc2wtPnJ4X2Vycm9yczsKKwlzdGF0cy5yeF9vdmVyX2Vycm9ycyA9IHNsLT5yeF9vdmVyX2Vycm9yczsKKyNpZmRlZiBTTF9JTkNMVURFX0NTTElQCisJc3RhdHMucnhfZmlmb19lcnJvcnMgPSBzbC0+cnhfY29tcHJlc3NlZDsKKwlzdGF0cy50eF9maWZvX2Vycm9ycyA9IHNsLT50eF9jb21wcmVzc2VkOworCXN0YXRzLmNvbGxpc2lvbnMgICAgID0gc2wtPnR4X21pc3NlczsKKwljb21wID0gc2wtPnNsY29tcDsKKwlpZiAoY29tcCkgeworCQlzdGF0cy5yeF9maWZvX2Vycm9ycyArPSBjb21wLT5zbHNfaV9jb21wcmVzc2VkOworCQlzdGF0cy5yeF9kcm9wcGVkICAgICArPSBjb21wLT5zbHNfaV90b3NzZWQ7CisJCXN0YXRzLnR4X2ZpZm9fZXJyb3JzICs9IGNvbXAtPnNsc19vX2NvbXByZXNzZWQ7CisJCXN0YXRzLmNvbGxpc2lvbnMgICAgICs9IGNvbXAtPnNsc19vX21pc3NlczsKKwl9CisjZW5kaWYgLyogQ09ORklHX0lORVQgKi8KKwlyZXR1cm4gKCZzdGF0cyk7Cit9CisKKy8qIE5ldGRldmljZSByZWdpc3RlciBjYWxsYmFjayAqLworCitzdGF0aWMgaW50IHNsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2xpcCAqc2wgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyoKKwkgKglGaW5pc2ggc2V0dGluZyB1cCB0aGUgREVWSUNFIGluZm8uIAorCSAqLworCisJZGV2LT5tdHUJCT0gc2wtPm10dTsKKwlkZXYtPnR5cGUJCT0gQVJQSFJEX1NMSVAgKyBzbC0+bW9kZTsKKyNpZmRlZiBTTF9DSEVDS19UUkFOU01JVAorCWRldi0+dHhfdGltZW91dAkJPSBzbF90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSAyMCpIWjsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHNsX3VuaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbGlwICpzbCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzbF9mcmVlX2J1ZnMoc2wpOworfQorCitzdGF0aWMgdm9pZCBzbF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRldi0+aW5pdAkJPSBzbF9pbml0OworCWRldi0+dW5pbml0CSAgCT0gc2xfdW5pbml0OworCWRldi0+b3BlbgkJPSBzbF9vcGVuOworCWRldi0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKKwlkZXYtPnN0b3AJCT0gc2xfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMJICAgICAgICA9IHNsX2dldF9zdGF0czsKKwlkZXYtPmNoYW5nZV9tdHUJCT0gc2xfY2hhbmdlX210dTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHNsX3htaXQ7CisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKKwlkZXYtPmRvX2lvY3RsCQk9IHNsX2lvY3RsOworI2VuZGlmCisJZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSAwOworCWRldi0+YWRkcl9sZW4JCT0gMDsKKwlkZXYtPnR4X3F1ZXVlX2xlbgk9IDEwOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJLyogTmV3LXN0eWxlIGZsYWdzLiAqLworCWRldi0+ZmxhZ3MJCT0gSUZGX05PQVJQfElGRl9QT0lOVE9QT0lOVHxJRkZfTVVMVElDQVNUOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIFJvdXRpbmVzIGxvb2tpbmcgYXQgVFRZIHNpZGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQgc2xpcF9yZWNlaXZlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm4gNjU1MzY7ICAvKiBXZSBjYW4gaGFuZGxlIGFuIGluZmluaXRlIGFtb3VudCBvZiBkYXRhLiA6LSkgKi8KK30KKworLyoKKyAqIEhhbmRsZSB0aGUgJ3JlY2VpdmVyIGRhdGEgcmVhZHknIGludGVycnVwdC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSAndHR5X2lvJyBtb2R1bGUgaW4gdGhlIGtlcm5lbCB3aGVuCisgKiBhIGJsb2NrIG9mIFNMSVAgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCwgd2hpY2ggY2FuIG5vdyBiZSBkZWNhcHN1bGF0ZWQKKyAqIGFuZCBzZW50IG9uIHRvIHNvbWUgSVAgbGF5ZXIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gVGhpcyB3aWxsIG5vdAorICogYmUgcmUtZW50ZXJlZCB3aGlsZSBydW5uaW5nIGJ1dCBvdGhlciBsZGlzYyBmdW5jdGlvbnMgbWF5IGJlIGNhbGxlZAorICogaW4gcGFyYWxsZWwKKyAqLworIAorc3RhdGljIHZvaWQgc2xpcF9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgY2hhciAqZnAsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2xpcCAqc2wgPSAoc3RydWN0IHNsaXAgKikgdHR5LT5kaXNjX2RhdGE7CisKKwlpZiAoIXNsIHx8IHNsLT5tYWdpYyAhPSBTTElQX01BR0lDIHx8CisJICAgICFuZXRpZl9ydW5uaW5nKHNsLT5kZXYpKQorCQlyZXR1cm47CisKKwkvKiBSZWFkIHRoZSBjaGFyYWN0ZXJzIG91dCBvZiB0aGUgYnVmZmVyICovCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJaWYgKGZwICYmICpmcCsrKSB7CisJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoU0xGX0VSUk9SLCAmc2wtPmZsYWdzKSkgIHsKKwkJCQlzbC0+cnhfZXJyb3JzKys7CisJCQl9CisJCQljcCsrOworCQkJY29udGludWU7CisJCX0KKyNpZmRlZiBDT05GSUdfU0xJUF9NT0RFX1NMSVA2CisJCWlmIChzbC0+bW9kZSAmIFNMX01PREVfU0xJUDYpCisJCQlzbGlwX3VuZXNjNihzbCwgKmNwKyspOworCQllbHNlCisjZW5kaWYKKwkJCXNsaXBfdW5lc2Moc2wsICpjcCsrKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBzbGlwX29wZW4gaGVscGVyIHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29sbGVjdCBoYW5nZWQgdXAgY2hhbm5lbHMgKi8KKworc3RhdGljIHZvaWQgc2xfc3luYyh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNsaXAJICAqc2w7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2xpcF9tYXhkZXY7IGkrKykgeworCQlpZiAoKGRldiA9IHNsaXBfZGV2c1tpXSkgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCXNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJaWYgKHNsLT50dHkgfHwgc2wtPmxlYXNlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGV2LT5mbGFncyZJRkZfVVApCisJCQlkZXZfY2xvc2UoZGV2KTsKKwl9Cit9CisKKworLyogRmluZCBhIGZyZWUgU0xJUCBjaGFubmVsLCBhbmQgbGluayBpbiB0aGlzIGB0dHknIGxpbmUuICovCitzdGF0aWMgc3RydWN0IHNsaXAgKgorc2xfYWxsb2MoZGV2X3QgbGluZSkKK3sKKwlpbnQgaTsKKwlpbnQgc2VsID0gLTE7CisJaW50IHNjb3JlID0gLTE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHNsaXAgICAgICAgKnNsOworCisJaWYgKHNsaXBfZGV2cyA9PSBOVUxMKSAKKwkJcmV0dXJuIE5VTEw7CS8qIE1hc3RlciBhcnJheSBtaXNzaW5nICEgKi8KKworCWZvciAoaSA9IDA7IGkgPCBzbGlwX21heGRldjsgaSsrKSB7CisJCWRldiA9IHNsaXBfZGV2c1tpXTsKKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJc2wgPSBuZXRkZXZfcHJpdihkZXYpOworCQlpZiAoc2wtPmxlYXNlZCkgeworCQkJaWYgKHNsLT5saW5lICE9IGxpbmUpCisJCQkJY29udGludWU7CisJCQlpZiAoc2wtPnR0eSkKKwkJCQlyZXR1cm4gTlVMTDsKKworCQkJLyogQ2xlYXIgRVNDQVBFICYgRVJST1IgZmxhZ3MgKi8KKwkJCXNsLT5mbGFncyAmPSAoMSA8PCBTTEZfSU5VU0UpOworCQkJcmV0dXJuIHNsOworCQl9CisKKwkJaWYgKHNsLT50dHkpCisJCQljb250aW51ZTsKKworCQlpZiAoY3VycmVudC0+cGlkID09IHNsLT5waWQpIHsKKwkJCWlmIChzbC0+bGluZSA9PSBsaW5lICYmIHNjb3JlIDwgMykgeworCQkJCXNlbCA9IGk7CisJCQkJc2NvcmUgPSAzOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHNjb3JlIDwgMikgeworCQkJCXNlbCA9IGk7CisJCQkJc2NvcmUgPSAyOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKHNsLT5saW5lID09IGxpbmUgJiYgc2NvcmUgPCAxKSB7CisJCQlzZWwgPSBpOworCQkJc2NvcmUgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHNjb3JlIDwgMCkgeworCQkJc2VsID0gaTsKKwkJCXNjb3JlID0gMDsKKwkJfQorCX0KKworCWlmIChzZWwgPj0gMCkgeworCQlpID0gc2VsOworCQlkZXYgPSBzbGlwX2RldnNbaV07CisJCWlmIChzY29yZSA+IDEpIHsKKwkJCXNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJCXNsLT5mbGFncyAmPSAoMSA8PCBTTEZfSU5VU0UpOworCQkJcmV0dXJuIHNsOworCQl9CisJfQorCisJLyogU29ycnksIHRvbyBtYW55LCBhbGwgc2xvdHMgaW4gdXNlICovCisJaWYgKGkgPj0gc2xpcF9tYXhkZXYpCisJCXJldHVybiBOVUxMOworCisJaWYgKGRldikgeworCQlzbCA9IG5ldGRldl9wcml2KGRldik7CisJCWlmICh0ZXN0X2JpdChTTEZfSU5VU0UsICZzbC0+ZmxhZ3MpKSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCQkJZGV2ID0gTlVMTDsKKwkJCXNsaXBfZGV2c1tpXSA9IE5VTEw7CisJCX0KKwl9CisJCisJaWYgKCFkZXYpIHsKKwkJY2hhciBuYW1lW0lGTkFNU0laXTsKKwkJc3ByaW50ZihuYW1lLCAic2wlZCIsIGkpOworCisJCWRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKnNsKSwgbmFtZSwgc2xfc2V0dXApOworCQlpZiAoIWRldikKKwkJCXJldHVybiBOVUxMOworCQlkZXYtPmJhc2VfYWRkciAgPSBpOworCX0KKworCXNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIEluaXRpYWxpemUgY2hhbm5lbCBjb250cm9sIGRhdGEgKi8KKwlzbC0+bWFnaWMgICAgICAgPSBTTElQX01BR0lDOworCXNsLT5kZXYJICAgICAgCT0gZGV2OworCXNwaW5fbG9ja19pbml0KCZzbC0+bG9jayk7CisJc2wtPm1vZGUgICAgICAgID0gU0xfTU9ERV9ERUZBVUxUOworI2lmZGVmIENPTkZJR19TTElQX1NNQVJUCisJaW5pdF90aW1lcigmc2wtPmtlZXBhbGl2ZV90aW1lcik7CS8qIGluaXRpYWxpemUgdGltZXJfbGlzdCBzdHJ1Y3QgKi8KKwlzbC0+a2VlcGFsaXZlX3RpbWVyLmRhdGE9KHVuc2lnbmVkIGxvbmcpc2w7CisJc2wtPmtlZXBhbGl2ZV90aW1lci5mdW5jdGlvbj1zbF9rZWVwYWxpdmU7CisJaW5pdF90aW1lcigmc2wtPm91dGZpbGxfdGltZXIpOworCXNsLT5vdXRmaWxsX3RpbWVyLmRhdGE9KHVuc2lnbmVkIGxvbmcpc2w7CisJc2wtPm91dGZpbGxfdGltZXIuZnVuY3Rpb249c2xfb3V0ZmlsbDsKKyNlbmRpZgorCXNsaXBfZGV2c1tpXSA9IGRldjsKKwkJCQkgICAKKwlyZXR1cm4gc2w7Cit9CisKKy8qCisgKiBPcGVuIHRoZSBoaWdoLWxldmVsIHBhcnQgb2YgdGhlIFNMSVAgY2hhbm5lbC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBUVFkgbW9kdWxlIHdoZW4gdGhlCisgKiBTTElQIGxpbmUgZGlzY2lwbGluZSBpcyBjYWxsZWQgZm9yLiAgQmVjYXVzZSB3ZSBhcmUKKyAqIHN1cmUgdGhlIHR0eSBsaW5lIGV4aXN0cywgd2Ugb25seSBoYXZlIHRvIGxpbmsgaXQgdG8KKyAqIGEgZnJlZSBTTElQIGNoYW5uZWwuLi4KKyAqCisgKiBDYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0IHNlcmlhbGl6ZWQgZnJvbSBvdGhlciBsZGlzYyBjYWxscy4KKyAqLworCitzdGF0aWMgaW50IHNsaXBfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzbGlwICpzbDsKKwlpbnQgZXJyOworCisJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJCQorCS8qIFJUbmV0bGluayBsb2NrIGlzIG1pc3VzZWQgaGVyZSB0byBzZXJpYWxpemUgY29uY3VycmVudAorCSAgIG9wZW5zIG9mIHNsaXAgY2hhbm5lbHMuIFRoZXJlIGFyZSBiZXR0ZXIgd2F5cywgYnV0IGl0IGlzCisJICAgdGhlIHNpbXBsZXN0IG9uZS4KKwkgKi8KKwlydG5sX2xvY2soKTsKKworCS8qIENvbGxlY3QgaGFuZ2VkIHVwIGNoYW5uZWxzLiAqLworCXNsX3N5bmMoKTsKKworCXNsID0gKHN0cnVjdCBzbGlwICopIHR0eS0+ZGlzY19kYXRhOworCisJZXJyID0gLUVFWElTVDsKKwkvKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgbm90IGFscmVhZHkgY29ubmVjdGVkLiAqLworCWlmIChzbCAmJiBzbC0+bWFnaWMgPT0gU0xJUF9NQUdJQykKKwkJZ290byBlcnJfZXhpdDsKKworCS8qIE9LLiAgRmluZCBhIGZyZWUgU0xJUCBjaGFubmVsIHRvIHVzZS4gKi8KKwllcnIgPSAtRU5GSUxFOworCWlmICgoc2wgPSBzbF9hbGxvYyh0dHlfZGV2bnVtKHR0eSkpKSA9PSBOVUxMKQorCQlnb3RvIGVycl9leGl0OworCisJc2wtPnR0eSA9IHR0eTsKKwl0dHktPmRpc2NfZGF0YSA9IHNsOworCXNsLT5saW5lID0gdHR5X2Rldm51bSh0dHkpOworCXNsLT5waWQgPSBjdXJyZW50LT5waWQ7CisJCisJLyogRklYTUU6IGFscmVhZHkgZG9uZSBiZWZvcmUgd2Ugd2VyZSBjYWxsZWQgLSBzZWVtcyB0aGlzIGNhbiBnbyAqLworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCQorCWlmICghdGVzdF9iaXQoU0xGX0lOVVNFLCAmc2wtPmZsYWdzKSkgeworCQkvKiBQZXJmb3JtIHRoZSBsb3ctbGV2ZWwgU0xJUCBpbml0aWFsaXphdGlvbi4gKi8KKwkJaWYgKChlcnIgPSBzbF9hbGxvY19idWZzKHNsLCBTTF9NVFUpKSAhPSAwKQorCQkJZ290byBlcnJfZnJlZV9jaGFuOworCisJCXNldF9iaXQoU0xGX0lOVVNFLCAmc2wtPmZsYWdzKTsKKworCQlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldmljZShzbC0+ZGV2KSkpCisJCQlnb3RvIGVycl9mcmVlX2J1ZnM7CisJfQorCisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKKwlpZiAoc2wtPmtlZXBhbGl2ZSkgeworCQlzbC0+a2VlcGFsaXZlX3RpbWVyLmV4cGlyZXM9amlmZmllcytzbC0+a2VlcGFsaXZlKkhaOworCQlhZGRfdGltZXIgKCZzbC0+a2VlcGFsaXZlX3RpbWVyKTsKKwl9CisJaWYgKHNsLT5vdXRmaWxsKSB7CisJCXNsLT5vdXRmaWxsX3RpbWVyLmV4cGlyZXM9amlmZmllcytzbC0+b3V0ZmlsbCpIWjsKKwkJYWRkX3RpbWVyICgmc2wtPm91dGZpbGxfdGltZXIpOworCX0KKyNlbmRpZgorCisJLyogRG9uZS4gIFdlIGhhdmUgbGlua2VkIHRoZSBUVFkgbGluZSB0byBhIGNoYW5uZWwuICovCisJcnRubF91bmxvY2soKTsKKwlyZXR1cm4gc2wtPmRldi0+YmFzZV9hZGRyOworCitlcnJfZnJlZV9idWZzOgorCXNsX2ZyZWVfYnVmcyhzbCk7CisKK2Vycl9mcmVlX2NoYW46CisJc2wtPnR0eSA9IE5VTEw7CisJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOworCWNsZWFyX2JpdChTTEZfSU5VU0UsICZzbC0+ZmxhZ3MpOworCitlcnJfZXhpdDoKKwlydG5sX3VubG9jaygpOworCisJLyogQ291bnQgcmVmZXJlbmNlcyBmcm9tIFRUWSBtb2R1bGUgKi8KKwlyZXR1cm4gZXJyOworfQorCisvKgorCisgIEZJWE1FOiAxLDIgYXJlIGZpeGVkIDMgd2FzIG5ldmVyIHRydWUgYW55d2F5LgorICAKKyAgIExldCBtZSB0byBibGFtZSBhIGJpdC4KKyAgIDEuIFRUWSBtb2R1bGUgY2FsbHMgdGhpcyBmdW5zdGlvbiBvbiBzb2Z0IGludGVycnVwdC4KKyAgIDIuIFRUWSBtb2R1bGUgY2FsbHMgdGhpcyBmdW5jdGlvbiBXSVRIIE1BU0tFRCBJTlRFUlJVUFRTIQorICAgMy4gVFRZIG1vZHVsZSBkb2VzIG5vdCBub3RpZnkgdXMgYWJvdXQgbGluZSBkaXNjaXBsaW5lCisgICAgICBzaHV0ZG93biwKKworICAgU2VlbXMsIG5vdyBpdCBpcyBjbGVhbi4gVGhlIHNvbHV0aW9uIGlzIHRvIGNvbnNpZGVyIG5ldGRldmljZSBhbmQKKyAgIGxpbmUgZGlzY2lwbGluZSBzaWRlcyBhcyB0d28gaW5kZXBlbmRlbnQgdGhyZWFkcy4KKworICAgQnktcHJvZHVjdCAobm90IGRlc2lyZWQpOiBzbD8gZG9lcyBub3QgZmVlbCBoYW5ndXBzIGFuZCByZW1haW5zIG9wZW4uCisgICBJdCBpcyBzdXBwb3NlZCwgdGhhdCB1c2VyIGxldmVsIHByb2dyYW0gKGRpcCwgZGlhbGQsIHNsYXR0YWNoLi4uKQorICAgd2lsbCBjYXRjaCBTSUdIVVAgYW5kIG1ha2UgdGhlIHJlc3Qgb2Ygd29yay4gCisKKyAgIEkgc2VlIG5vIHdheSB0byBtYWtlIG1vcmUgd2l0aCBjdXJyZW50IHR0eSBjb2RlLiAtLUFOSworICovCisKKy8qCisgKiBDbG9zZSBkb3duIGEgU0xJUCBjaGFubmVsLgorICogVGhpcyBtZWFucyBmbHVzaGluZyBvdXQgYW55IHBlbmRpbmcgcXVldWVzLCBhbmQgdGhlbiByZXR1cm5pbmcuIFRoaXMKKyAqIGNhbGwgaXMgc2VyaWFsaXplZCBhZ2FpbnN0IG90aGVyIGxkaXNjIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQKK3NsaXBfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc2xpcCAqc2wgPSAoc3RydWN0IHNsaXAgKikgdHR5LT5kaXNjX2RhdGE7CisKKwkvKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgY29ubmVjdGVkLiAqLworCWlmICghc2wgfHwgc2wtPm1hZ2ljICE9IFNMSVBfTUFHSUMgfHwgc2wtPnR0eSAhPSB0dHkpCisJCXJldHVybjsKKworCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKKwlzbC0+dHR5ID0gTlVMTDsKKwlpZiAoIXNsLT5sZWFzZWQpCisJCXNsLT5saW5lID0gMDsKKworCS8qIFZTViA9IHZlcnkgaW1wb3J0YW50IHRvIHJlbW92ZSB0aW1lcnMgKi8KKyNpZmRlZiBDT05GSUdfU0xJUF9TTUFSVAorCWRlbF90aW1lcl9zeW5jKCZzbC0+a2VlcGFsaXZlX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmc2wtPm91dGZpbGxfdGltZXIpOworI2VuZGlmCisKKwkvKiBDb3VudCByZWZlcmVuY2VzIGZyb20gVFRZIG1vZHVsZSAqLworfQorCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCQkJU1RBTkRBUkQgU0xJUCBFTkNBUFNVTEFUSU9OCQkgIAkgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludAorc2xpcF9lc2ModW5zaWduZWQgY2hhciAqcywgdW5zaWduZWQgY2hhciAqZCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSBkOworCXVuc2lnbmVkIGNoYXIgYzsKKworCS8qCisJICogU2VuZCBhbiBpbml0aWFsIEVORCBjaGFyYWN0ZXIgdG8gZmx1c2ggb3V0IGFueQorCSAqIGRhdGEgdGhhdCBtYXkgaGF2ZSBhY2N1bXVsYXRlZCBpbiB0aGUgcmVjZWl2ZXIKKwkgKiBkdWUgdG8gbGluZSBub2lzZS4KKwkgKi8KKworCSpwdHIrKyA9IEVORDsKKworCS8qCisJICogRm9yIGVhY2ggYnl0ZSBpbiB0aGUgcGFja2V0LCBzZW5kIHRoZSBhcHByb3ByaWF0ZQorCSAqIGNoYXJhY3RlciBzZXF1ZW5jZSwgYWNjb3JkaW5nIHRvIHRoZSBTTElQIHByb3RvY29sLgorCSAqLworCisJd2hpbGUgKGxlbi0tID4gMCkgeworCQlzd2l0Y2goYyA9ICpzKyspIHsKKwkJIGNhc2UgRU5EOgorCQkJKnB0cisrID0gRVNDOworCQkJKnB0cisrID0gRVNDX0VORDsKKwkJCWJyZWFrOworCQkgY2FzZSBFU0M6CisJCQkqcHRyKysgPSBFU0M7CisJCQkqcHRyKysgPSBFU0NfRVNDOworCQkJYnJlYWs7CisJCSBkZWZhdWx0OgorCQkJKnB0cisrID0gYzsKKwkJCWJyZWFrOworCQl9CisJfQorCSpwdHIrKyA9IEVORDsKKwlyZXR1cm4gKHB0ciAtIGQpOworfQorCitzdGF0aWMgdm9pZCBzbGlwX3VuZXNjKHN0cnVjdCBzbGlwICpzbCwgdW5zaWduZWQgY2hhciBzKQoreworCisJc3dpdGNoKHMpIHsKKwkgY2FzZSBFTkQ6CisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKKwkJLyogZHJvcCBrZWVwdGVzdCBiaXQgPSBWU1YgKi8KKwkJaWYgKHRlc3RfYml0KFNMRl9LRUVQVEVTVCwgJnNsLT5mbGFncykpCisJCQljbGVhcl9iaXQoU0xGX0tFRVBURVNULCAmc2wtPmZsYWdzKTsKKyNlbmRpZgorCisJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KFNMRl9FUlJPUiwgJnNsLT5mbGFncykgJiYgKHNsLT5yY291bnQgPiAyKSkgIHsKKwkJCXNsX2J1bXAoc2wpOworCQl9CisJCWNsZWFyX2JpdChTTEZfRVNDQVBFLCAmc2wtPmZsYWdzKTsKKwkJc2wtPnJjb3VudCA9IDA7CisJCXJldHVybjsKKworCSBjYXNlIEVTQzoKKwkJc2V0X2JpdChTTEZfRVNDQVBFLCAmc2wtPmZsYWdzKTsKKwkJcmV0dXJuOworCSBjYXNlIEVTQ19FU0M6CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0xGX0VTQ0FQRSwgJnNsLT5mbGFncykpICB7CisJCQlzID0gRVNDOworCQl9CisJCWJyZWFrOworCSBjYXNlIEVTQ19FTkQ6CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0xGX0VTQ0FQRSwgJnNsLT5mbGFncykpICB7CisJCQlzID0gRU5EOworCQl9CisJCWJyZWFrOworCX0KKwlpZiAoIXRlc3RfYml0KFNMRl9FUlJPUiwgJnNsLT5mbGFncykpICB7CisJCWlmIChzbC0+cmNvdW50IDwgc2wtPmJ1ZmZzaXplKSAgeworCQkJc2wtPnJidWZmW3NsLT5yY291bnQrK10gPSBzOworCQkJcmV0dXJuOworCQl9CisJCXNsLT5yeF9vdmVyX2Vycm9ycysrOworCQlzZXRfYml0KFNMRl9FUlJPUiwgJnNsLT5mbGFncyk7CisJfQorfQorCisKKyNpZmRlZiBDT05GSUdfU0xJUF9NT0RFX1NMSVA2CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCSA2IEJJVCBTTElQIEVOQ0FQU1VMQVRJT04JCQkqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQKK3NsaXBfZXNjNih1bnNpZ25lZCBjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IGQ7CisJdW5zaWduZWQgY2hhciBjOworCWludCBpOworCXVuc2lnbmVkIHNob3J0IHYgPSAwOworCXNob3J0IGJpdHMgPSAwOworCisJLyoKKwkgKiBTZW5kIGFuIGluaXRpYWwgRU5EIGNoYXJhY3RlciB0byBmbHVzaCBvdXQgYW55CisJICogZGF0YSB0aGF0IG1heSBoYXZlIGFjY3VtdWxhdGVkIGluIHRoZSByZWNlaXZlcgorCSAqIGR1ZSB0byBsaW5lIG5vaXNlLgorCSAqLworCisJKnB0cisrID0gMHg3MDsKKworCS8qCisJICogRW5jb2RlIHRoZSBwYWNrZXQgaW50byBwcmludGFibGUgYXNjaWkgY2hhcmFjdGVycworCSAqLworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCXYgPSAodiA8PCA4KSB8IHNbaV07CisJCWJpdHMgKz0gODsKKwkJd2hpbGUgKGJpdHMgPj0gNikgeworCQkJYml0cyAtPSA2OworCQkJYyA9IDB4MzAgKyAoKHYgPj4gYml0cykgJiAweDNGKTsKKwkJCSpwdHIrKyA9IGM7CisJCX0KKwl9CisJaWYgKGJpdHMpIHsKKwkJYyA9IDB4MzAgKyAoKHYgPDwgKDYgLSBiaXRzKSkgJiAweDNGKTsKKwkJKnB0cisrID0gYzsKKwl9CisJKnB0cisrID0gMHg3MDsKKwlyZXR1cm4gcHRyIC0gZDsKK30KKwordm9pZAorc2xpcF91bmVzYzYoc3RydWN0IHNsaXAgKnNsLCB1bnNpZ25lZCBjaGFyIHMpCit7CisJdW5zaWduZWQgY2hhciBjOworCisJaWYgKHMgPT0gMHg3MCkgeworI2lmZGVmIENPTkZJR19TTElQX1NNQVJUCisJCS8qIGRyb3Aga2VlcHRlc3QgYml0ID0gVlNWICovCisJCWlmICh0ZXN0X2JpdChTTEZfS0VFUFRFU1QsICZzbC0+ZmxhZ3MpKQorCQkJY2xlYXJfYml0KFNMRl9LRUVQVEVTVCwgJnNsLT5mbGFncyk7CisjZW5kaWYKKworCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChTTEZfRVJST1IsICZzbC0+ZmxhZ3MpICYmIChzbC0+cmNvdW50ID4gMikpICB7CisJCQlzbF9idW1wKHNsKTsKKwkJfQorCQlzbC0+cmNvdW50ID0gMDsKKwkJc2wtPnhiaXRzID0gMDsKKwkJc2wtPnhkYXRhID0gMDsKKyAJfSBlbHNlIGlmIChzID49IDB4MzAgJiYgcyA8IDB4NzApIHsKKwkJc2wtPnhkYXRhID0gKHNsLT54ZGF0YSA8PCA2KSB8ICgocyAtIDB4MzApICYgMHgzRik7CisJCXNsLT54Yml0cyArPSA2OworCQlpZiAoc2wtPnhiaXRzID49IDgpIHsKKwkJCXNsLT54Yml0cyAtPSA4OworCQkJYyA9ICh1bnNpZ25lZCBjaGFyKShzbC0+eGRhdGEgPj4gc2wtPnhiaXRzKTsKKwkJCWlmICghdGVzdF9iaXQoU0xGX0VSUk9SLCAmc2wtPmZsYWdzKSkgIHsKKwkJCQlpZiAoc2wtPnJjb3VudCA8IHNsLT5idWZmc2l6ZSkgIHsKKwkJCQkJc2wtPnJidWZmW3NsLT5yY291bnQrK10gPSBjOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXNsLT5yeF9vdmVyX2Vycm9ycysrOworCQkJCXNldF9iaXQoU0xGX0VSUk9SLCAmc2wtPmZsYWdzKTsKKwkJCX0KKwkJfQorIAl9Cit9CisjZW5kaWYgLyogQ09ORklHX1NMSVBfTU9ERV9TTElQNiAqLworCisvKiBQZXJmb3JtIEkvTyBjb250cm9sIG9uIGFuIGFjdGl2ZSBTTElQIGNoYW5uZWwuICovCitzdGF0aWMgaW50IHNsaXBfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzbGlwICpzbCA9IChzdHJ1Y3Qgc2xpcCAqKSB0dHktPmRpc2NfZGF0YTsKKwl1bnNpZ25lZCBpbnQgdG1wOworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCS8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuICovCisJaWYgKCFzbCB8fCBzbC0+bWFnaWMgIT0gU0xJUF9NQUdJQykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2goY21kKSB7CisJIGNhc2UgU0lPQ0dJRk5BTUU6CisJCXRtcCA9IHN0cmxlbihzbC0+ZGV2LT5uYW1lKSArIDE7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBzbC0+ZGV2LT5uYW1lLCB0bXApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBTSU9DR0lGRU5DQVA6CisJCWlmIChwdXRfdXNlcihzbC0+bW9kZSwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNJT0NTSUZFTkNBUDoKKwkJaWYgKGdldF91c2VyKHRtcCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKyNpZm5kZWYgU0xfSU5DTFVERV9DU0xJUAorCQlpZiAodG1wICYgKFNMX01PREVfQ1NMSVB8U0xfTU9ERV9BREFQVElWRSkpICB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorI2Vsc2UKKwkJaWYgKCh0bXAgJiAoU0xfTU9ERV9BREFQVElWRSB8IFNMX01PREVfQ1NMSVApKSA9PQorCQkgICAgKFNMX01PREVfQURBUFRJVkUgfCBTTF9NT0RFX0NTTElQKSkgIHsKKwkJCS8qIHJldHVybiAtRUlOVkFMOyAqLworCQkJdG1wICY9IH5TTF9NT0RFX0FEQVBUSVZFOworCQl9CisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1NMSVBfTU9ERV9TTElQNgorCQlpZiAodG1wICYgU0xfTU9ERV9TTElQNikgIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisjZW5kaWYKKwkJc2wtPm1vZGUgPSB0bXA7CisJCXNsLT5kZXYtPnR5cGUgPSBBUlBIUkRfU0xJUCtzbC0+bW9kZTsKKwkJcmV0dXJuIDA7CisKKwkgY2FzZSBTSU9DU0lGSFdBRERSOgorCQlyZXR1cm4gLUVJTlZBTDsKKworI2lmZGVmIENPTkZJR19TTElQX1NNQVJUCisJLyogVlNWIGNoYW5nZXMgc3RhcnQgaGVyZSAqLworICAgICAgICBjYXNlIFNJT0NTS0VFUEFMSVZFOgorCQlpZiAoZ2V0X3VzZXIodG1wLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgICAgIGlmICh0bXAgPiAyNTUpIC8qIG1heCBmb3IgdW5jaGFyICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzcGluX2xvY2tfYmgoJnNsLT5sb2NrKTsKKwkJaWYgKCFzbC0+dHR5KSB7CisJCQlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKChzbC0+a2VlcGFsaXZlID0gKHVuY2hhcikgdG1wKSAhPSAwKSB7CisJCQltb2RfdGltZXIoJnNsLT5rZWVwYWxpdmVfdGltZXIsIGppZmZpZXMrc2wtPmtlZXBhbGl2ZSpIWik7CisJCQlzZXRfYml0KFNMRl9LRUVQVEVTVCwgJnNsLT5mbGFncyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbF90aW1lciAoJnNsLT5rZWVwYWxpdmVfdGltZXIpOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZzbC0+bG9jayk7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU0lPQ0dLRUVQQUxJVkU6CisJCWlmIChwdXRfdXNlcihzbC0+a2VlcGFsaXZlLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNJT0NTT1VURklMTDoKKwkJaWYgKGdldF91c2VyKHRtcCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICBpZiAodG1wID4gMjU1KSAvKiBtYXggZm9yIHVuY2hhciAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19iaCgmc2wtPmxvY2spOworCQlpZiAoIXNsLT50dHkpIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzbC0+bG9jayk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorICAgICAgICAgICAgICAgIGlmICgoc2wtPm91dGZpbGwgPSAodW5jaGFyKSB0bXApICE9IDApeworCQkJbW9kX3RpbWVyKCZzbC0+b3V0ZmlsbF90aW1lciwgamlmZmllcytzbC0+b3V0ZmlsbCpIWik7CisJCQlzZXRfYml0KFNMRl9PVVRXQUlULCAmc2wtPmZsYWdzKTsKKwkJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbF90aW1lciAoJnNsLT5vdXRmaWxsX3RpbWVyKTsKKwkJfQorCQlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU0lPQ0dPVVRGSUxMOgorCQlpZiAocHV0X3VzZXIoc2wtPm91dGZpbGwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCS8qIFZTViBjaGFuZ2VzIGVuZCAqLworI2VuZGlmCisKKwkvKiBBbGxvdyBzdHR5IHRvIHJlYWQsIGJ1dCBub3Qgc2V0LCB0aGUgc2VyaWFsIHBvcnQgKi8KKwljYXNlIFRDR0VUUzoKKwljYXNlIFRDR0VUQToKKwkJcmV0dXJuIG5fdHR5X2lvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKKy8qIFZTViBjaGFuZ2VzIHN0YXJ0IGhlcmUgKi8KKyNpZmRlZiBDT05GSUdfU0xJUF9TTUFSVAorLyogZnVuY3Rpb24gZG9faW9jdGwgY2FsbGVkIGZyb20gbmV0L2NvcmUvZGV2LmMKKyAgIHRvIGFsbG93IGdldC9zZXQgb3V0ZmlsbC9rZWVwYWxpdmUgcGFyYW1ldGVyCisgICBieSBpZmNvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBpbnQgc2xfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgaWZyZXEgKnJxLGludCBjbWQpCit7CisJc3RydWN0IHNsaXAgKnNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nICpwID0gKHVuc2lnbmVkIGxvbmcgKikmcnEtPmlmcl9pZnJ1OworCisJaWYgKHNsID09IE5VTEwpCQkvKiBBbGxvY2F0aW9uIGZhaWxlZCA/PyAqLworCQlyZXR1cm4gLUVOT0RFVjsKKworCXNwaW5fbG9ja19iaCgmc2wtPmxvY2spOworCisJaWYgKCFzbC0+dHR5KSB7CisJCXNwaW5fdW5sb2NrX2JoKCZzbC0+bG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXN3aXRjaChjbWQpeworICAgICAgICBjYXNlIFNJT0NTS0VFUEFMSVZFOgorCQkvKiBtYXggZm9yIHVuY2hhciAqLworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKnAgPiAyNTUpIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzbC0+bG9jayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzbC0+a2VlcGFsaXZlID0gKHVuY2hhcikgKnA7CisJCWlmIChzbC0+a2VlcGFsaXZlICE9IDApIHsKKwkJCXNsLT5rZWVwYWxpdmVfdGltZXIuZXhwaXJlcz1qaWZmaWVzK3NsLT5rZWVwYWxpdmUqSFo7CisJCQltb2RfdGltZXIoJnNsLT5rZWVwYWxpdmVfdGltZXIsIGppZmZpZXMrc2wtPmtlZXBhbGl2ZSpIWik7CisJCQlzZXRfYml0KFNMRl9LRUVQVEVTVCwgJnNsLT5mbGFncyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbF90aW1lcigmc2wtPmtlZXBhbGl2ZV90aW1lcik7CisJCX0KKwkJYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSU9DR0tFRVBBTElWRToKKwkJKnAgPSBzbC0+a2VlcGFsaXZlOworCQlicmVhazsKKworICAgICAgICBjYXNlIFNJT0NTT1VURklMTDoKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSpwID4gMjU1KSB7IC8qIG1heCBmb3IgdW5jaGFyICovCisJCQlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKyAgICAgICAgICAgICAgICBpZiAoKHNsLT5vdXRmaWxsID0gKHVuY2hhcikqcCkgIT0gMCl7CisJCQltb2RfdGltZXIoJnNsLT5vdXRmaWxsX3RpbWVyLCBqaWZmaWVzK3NsLT5vdXRmaWxsKkhaKTsKKwkJCXNldF9iaXQoU0xGX09VVFdBSVQsICZzbC0+ZmxhZ3MpOworCQl9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsX3RpbWVyICgmc2wtPm91dGZpbGxfdGltZXIpOworCQl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSU9DR09VVEZJTEw6CisJCSpwID0gc2wtPm91dGZpbGw7CisJCWJyZWFrOworCisgICAgICAgIGNhc2UgU0lPQ1NMRUFTRToKKwkJLyogUmVzb2x2ZSByYWNlIGNvbmRpdGlvbiwgd2hlbiBpb2N0bCdpbmcgaGFuZ2VkIHVwIAorCQkgICBhbmQgb3BlbmVkIGJ5IGFub3RoZXIgcHJvY2VzcyBkZXZpY2UuCisJCSAqLworCQlpZiAoc2wtPnR0eSAhPSBjdXJyZW50LT5zaWduYWwtPnR0eSAmJiBzbC0+cGlkICE9IGN1cnJlbnQtPnBpZCkgeworCQkJc3Bpbl91bmxvY2tfYmgoJnNsLT5sb2NrKTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJc2wtPmxlYXNlZCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCpwKQorCQkJc2wtPmxlYXNlZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSU9DR0xFQVNFOgorCQkqcCA9IHNsLT5sZWFzZWQ7CisJfTsKKwlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCXJldHVybiAwOworfQorI2VuZGlmCisvKiBWU1YgY2hhbmdlcyBlbmQgKi8KKworc3RhdGljIHN0cnVjdCB0dHlfbGRpc2MJc2xfbGRpc2MgPSB7CisJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKKwkubWFnaWMgCQk9IFRUWV9MRElTQ19NQUdJQywKKwkubmFtZSAJCT0gInNsaXAiLAorCS5vcGVuIAkJPSBzbGlwX29wZW4sCisJLmNsb3NlCSAJPSBzbGlwX2Nsb3NlLAorCS5pb2N0bAkJPSBzbGlwX2lvY3RsLAorCS5yZWNlaXZlX2J1Zgk9IHNsaXBfcmVjZWl2ZV9idWYsCisJLnJlY2VpdmVfcm9vbQk9IHNsaXBfcmVjZWl2ZV9yb29tLAorCS53cml0ZV93YWtldXAJPSBzbGlwX3dyaXRlX3dha2V1cCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNsaXBfaW5pdCh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoc2xpcF9tYXhkZXYgPCA0KQorCQlzbGlwX21heGRldiA9IDQ7IC8qIFNhbml0eSAqLworCisJcHJpbnRrKEtFUk5fSU5GTyAiU0xJUDogdmVyc2lvbiAlcyAoZHluYW1pYyBjaGFubmVscywgbWF4PSVkKSIKKyNpZmRlZiBDT05GSUdfU0xJUF9NT0RFX1NMSVA2CisJICAgICAgICIgKDYgYml0IGVuY2Fwc3VsYXRpb24gZW5hYmxlZCkiCisjZW5kaWYKKwkgICAgICAgIi5cbiIsCisJICAgICAgIFNMSVBfVkVSU0lPTiwgc2xpcF9tYXhkZXYgKTsKKyNpZiBkZWZpbmVkKFNMX0lOQ0xVREVfQ1NMSVApCisJcHJpbnRrKEtFUk5fSU5GTyAiQ1NMSVA6IGNvZGUgY29weXJpZ2h0IDE5ODkgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuIik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0xJUF9TTUFSVAorCXByaW50ayhLRVJOX0lORk8gIlNMSVAgbGluZWZpbGwva2VlcGFsaXZlIG9wdGlvbi5cbiIpOworI2VuZGlmCisKKwlzbGlwX2RldnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZSAqKSpzbGlwX21heGRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbGlwX2RldnMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTTElQOiBDYW4ndCBhbGxvY2F0ZSBzbGlwIGRldmljZXMgYXJyYXkhICBVYWFyZ2ghICgtPiBObyBTTElQIGF2YWlsYWJsZSlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBDbGVhciB0aGUgcG9pbnRlciBhcnJheSwgd2UgYWxsb2NhdGUgZGV2aWNlcyB3aGVuIHdlIG5lZWQgdGhlbSAqLworCW1lbXNldChzbGlwX2RldnMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZSAqKSpzbGlwX21heGRldik7IAorCisJLyogRmlsbCBpbiBvdXIgbGluZSBwcm90b2NvbCBkaXNjaXBsaW5lLCBhbmQgcmVnaXN0ZXIgaXQgKi8KKwlpZiAoKHN0YXR1cyA9IHR0eV9yZWdpc3Rlcl9sZGlzYyhOX1NMSVAsICZzbF9sZGlzYykpICE9IDApICB7CisJCXByaW50ayhLRVJOX0VSUiAiU0xJUDogY2FuJ3QgcmVnaXN0ZXIgbGluZSBkaXNjaXBsaW5lIChlcnIgPSAlZClcbiIsIHN0YXR1cyk7CisJCWtmcmVlKHNsaXBfZGV2cyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbGlwX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBzbGlwICpzbDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJaW50IGJ1c3kgPSAwOworCisJaWYgKHNsaXBfZGV2cyA9PSBOVUxMKSAKKwkJcmV0dXJuOworCisJLyogRmlyc3Qgb2YgYWxsOiBjaGVjayBmb3IgYWN0aXZlIGRpc2NpcGxpbmVzIGFuZCBoYW5ndXAgdGhlbS4KKwkgKi8KKwlkbyB7CisJCWlmIChidXN5KSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChIWiAvIDEwKTsKKwkJfQorCisJCWJ1c3kgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgc2xpcF9tYXhkZXY7IGkrKykgeworCQkJZGV2ID0gc2xpcF9kZXZzW2ldOworCQkJaWYgKCFkZXYpCisJCQkJY29udGludWU7CisJCQlzbCA9IG5ldGRldl9wcml2KGRldik7CisJCQlzcGluX2xvY2tfYmgoJnNsLT5sb2NrKTsKKwkJCWlmIChzbC0+dHR5KSB7CisJCQkJYnVzeSsrOworCQkJCXR0eV9oYW5ndXAoc2wtPnR0eSk7CisJCQl9CisJCQlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCQl9CisJfSB3aGlsZSAoYnVzeSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSk7CisKKworCWZvciAoaSA9IDA7IGkgPCBzbGlwX21heGRldjsgaSsrKSB7CisJCWRldiA9IHNsaXBfZGV2c1tpXTsKKwkJaWYgKCFkZXYpCisJCQljb250aW51ZTsKKwkJc2xpcF9kZXZzW2ldID0gTlVMTDsKKworCQlzbCA9IG5ldGRldl9wcml2KGRldik7CisJCWlmIChzbC0+dHR5KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0dHkgZGlzY2lwbGluZSBzdGlsbCBydW5uaW5nXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkvKiBJbnRlbnRpb25hbGx5IGxlYWsgdGhlIGNvbnRyb2wgYmxvY2suICovCisJCQlkZXYtPmRlc3RydWN0b3IgPSBOVUxMOworCQl9IAorCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJfQorCisJa2ZyZWUoc2xpcF9kZXZzKTsKKwlzbGlwX2RldnMgPSBOVUxMOworCisJaWYgKChpID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fU0xJUCwgTlVMTCkpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJTTElQOiBjYW4ndCB1bnJlZ2lzdGVyIGxpbmUgZGlzY2lwbGluZSAoZXJyID0gJWQpXG4iLCBpKTsKKwl9Cit9CisKK21vZHVsZV9pbml0KHNsaXBfaW5pdCk7Cittb2R1bGVfZXhpdChzbGlwX2V4aXQpOworCisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKKy8qCisgKiBUaGlzIGlzIHN0YXJ0IG9mIHRoZSBjb2RlIGZvciBtdWx0aXNsaXAgc3R5bGUgbGluZSBjaGVja2luZworICogYWRkZWQgYnkgU3RhbmlzbGF2IFZvcm9ueWkuIEFsbCBjaGFuZ2VzIGJlZm9yZSBtYXJrZWQgVlNWCisgKi8KKworc3RhdGljIHZvaWQgc2xfb3V0ZmlsbCh1bnNpZ25lZCBsb25nIHNscykKK3sKKwlzdHJ1Y3Qgc2xpcCAqc2w9KHN0cnVjdCBzbGlwICopc2xzOworCisJc3Bpbl9sb2NrKCZzbC0+bG9jayk7CisKKwlpZiAoc2wtPnR0eSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWlmKHNsLT5vdXRmaWxsKQorCXsKKwkJaWYoIHRlc3RfYml0KFNMRl9PVVRXQUlULCAmc2wtPmZsYWdzKSApCisJCXsKKwkJCS8qIG5vIHBhY2tldHMgd2VyZSB0cmFuc21pdHRlZCwgZG8gb3V0ZmlsbCAqLworI2lmZGVmIENPTkZJR19TTElQX01PREVfU0xJUDYKKwkJCXVuc2lnbmVkIGNoYXIgcyA9IChzbC0+bW9kZSAmIFNMX01PREVfU0xJUDYpPzB4NzA6RU5EOworI2Vsc2UKKwkJCXVuc2lnbmVkIGNoYXIgcyA9IEVORDsKKyNlbmRpZgorCQkJLyogcHV0IEVORCBpbnRvIHR0eSBxdWV1ZS4gSXMgaXQgcmlnaHQgPz8/ICovCisJCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoc2wtPmRldikpCisJCQl7CisJCQkJLyogaWYgZGV2aWNlIGJ1c3kgbm8gb3V0ZmlsbCAqLworCQkJCXNsLT50dHktPmRyaXZlci0+d3JpdGUoc2wtPnR0eSwgJnMsIDEpOworCQkJfQorCQl9CisJCWVsc2UKKwkJCXNldF9iaXQoU0xGX09VVFdBSVQsICZzbC0+ZmxhZ3MpOworCisJCW1vZF90aW1lcigmc2wtPm91dGZpbGxfdGltZXIsIGppZmZpZXMrc2wtPm91dGZpbGwqSFopOworCX0KK291dDoKKwlzcGluX3VubG9jaygmc2wtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBzbF9rZWVwYWxpdmUodW5zaWduZWQgbG9uZyBzbHMpCit7CisJc3RydWN0IHNsaXAgKnNsPShzdHJ1Y3Qgc2xpcCAqKXNsczsKKworCXNwaW5fbG9jaygmc2wtPmxvY2spOworCisJaWYgKHNsLT50dHkgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZiggc2wtPmtlZXBhbGl2ZSkKKwl7CisJCWlmKHRlc3RfYml0KFNMRl9LRUVQVEVTVCwgJnNsLT5mbGFncykpCisJCXsKKwkJCS8qIGtlZXBhbGl2ZSBzdGlsbCBoaWdoIDooLCB3ZSBtdXN0IGhhbmd1cCAqLworCQkJaWYoIHNsLT5vdXRmaWxsICkgLyogb3V0ZmlsbCB0aW1lciBtdXN0IGJlIGRlbGV0ZWQgdG9vICovCisJCQkJKHZvaWQpZGVsX3RpbWVyKCZzbC0+b3V0ZmlsbF90aW1lcik7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5vIHBhY2tldHMgcmVjZWl2ZWQgZHVyaW5nIGtlZXBhbGl2ZSB0aW1lb3V0LCBoYW5ndXAuXG4iLCBzbC0+ZGV2LT5uYW1lKTsKKwkJCXR0eV9oYW5ndXAoc2wtPnR0eSk7IC8qIHRoaXMgbXVzdCBoYW5ndXAgdHR5ICYgY2xvc2Ugc2xpcCAqLworCQkJLyogSSB0aGluayB3ZSBuZWVkIG5vdCBzb21ldGhpbmcgZWxzZSAqLworCQkJZ290byBvdXQ7CisJCX0KKwkJZWxzZQorCQkJc2V0X2JpdChTTEZfS0VFUFRFU1QsICZzbC0+ZmxhZ3MpOworCisJCW1vZF90aW1lcigmc2wtPmtlZXBhbGl2ZV90aW1lciwgamlmZmllcytzbC0+a2VlcGFsaXZlKkhaKTsKKwl9CisKK291dDoKKwlzcGluX3VubG9jaygmc2wtPmxvY2spOworfQorCisjZW5kaWYKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19MRElTQyhOX1NMSVApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2xpcC5oIGIvZHJpdmVycy9uZXQvc2xpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiM2VmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zbGlwLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBzbGlwLmgJRGVmaW5lIHRoZSBTTElQIGRldmljZSBkcml2ZXIgaW50ZXJmYWNlIGFuZCBjb25zdGFudHMuCisgKgorICogTk9URToJVEhJUyBGSUxFIFdJTEwgQkUgTU9WRUQgVE8gVEhFIExJTlVYIElOQ0xVREUgRElSRUNUT1JZCisgKgkJQVMgU09PTiBBUyBQT1NTSUJMRSEKKyAqCisgKiBWZXJzaW9uOglAKCMpc2xpcC5oCTEuMi4wCTAzLzI4LzkzCisgKgorICogRml4ZXM6CisgKgkJQWxhbiBDb3gJOiAJQWRkZWQgc2xpcCBtdHUgZmllbGQuCisgKgkJTWF0dCBEaWxsb24JOglQcmludGFibGUgc2xpcCAoYm9ycm93ZWQgZnJvbSBuZXQyZSkKKyAqCQlBbGFuIENveAk6CUFkZGVkIFNMX1NMSVBfTE9UUworICoJRG1pdHJ5IEdvcm9kY2hhbmluCToJQSBsb3Qgb2YgY2hhbmdlcyBpbiB0aGUgJ3N0cnVjdCBzbGlwJworICoJRG1pdHJ5IEdvcm9kY2hhbmluCToJQWRkZWQgQ1NMSVAgc3RhdGlzdGljcy4KKyAqCVN0YW5pc2xhdiBWb3JvbnlpCToJTWFrZSBsaW5lIGNoZWNraW5nIGFzIGNyZWF0ZWQgYnkKKyAqCQkJCQlJZ29yIENoZWNoaWssIFJFTENPTSBDb3JwLgorICoJQ3JhaWcgU2NobGVudGVyCQk6CUZpeGVkICNkZWZpbmUgYnVnIHRoYXQgY2F1c2VkCisgKgkJCQkJQ1NMSVAgdGVsbmV0cyB0byBoYW5nIGluIDEuMy42MS02CisgKgorICogQXV0aG9yOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdXdhbHQubmwubXVnbmV0Lm9yZz4KKyAqLworI2lmbmRlZiBfTElOVVhfU0xJUF9ICisjZGVmaW5lIF9MSU5VWF9TTElQX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfSU5FVCkgJiYgZGVmaW5lZChDT05GSUdfU0xJUF9DT01QUkVTU0VEKQorIyBkZWZpbmUgU0xfSU5DTFVERV9DU0xJUAorI2VuZGlmCisKKyNpZmRlZiBTTF9JTkNMVURFX0NTTElQCisjIGRlZmluZSBTTF9NT0RFX0RFRkFVTFQgU0xfTU9ERV9BREFQVElWRQorI2Vsc2UKKyMgZGVmaW5lIFNMX01PREVfREVGQVVMVCBTTF9NT0RFX1NMSVAKKyNlbmRpZgorCisvKiBTTElQIGNvbmZpZ3VyYXRpb24uICovCisjZGVmaW5lIFNMX05SVU5JVAkyNTYJCS8qIE1BWCBudW1iZXIgb2YgU0xJUCBjaGFubmVsczsKKwkJCQkJICAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoCisJCQkJCSAgIGluc21vZCAtb3NsaXBfbWF4ZGV2PW5ubgkqLworI2RlZmluZSBTTF9NVFUJCTI5NgkJLyogMjk2OyBJIGFtIHVzZWQgdG8gNjAwLSBGdksJKi8KKworLyogU0xJUCBwcm90b2NvbCBjaGFyYWN0ZXJzLiAqLworI2RlZmluZSBFTkQgICAgICAgICAgICAgMDMwMAkJLyogaW5kaWNhdGVzIGVuZCBvZiBmcmFtZQkqLworI2RlZmluZSBFU0MgICAgICAgICAgICAgMDMzMwkJLyogaW5kaWNhdGVzIGJ5dGUgc3R1ZmZpbmcJKi8KKyNkZWZpbmUgRVNDX0VORCAgICAgICAgIDAzMzQJCS8qIEVTQyBFU0NfRU5EIG1lYW5zIEVORCAnZGF0YScJKi8KKyNkZWZpbmUgRVNDX0VTQyAgICAgICAgIDAzMzUJCS8qIEVTQyBFU0NfRVNDIG1lYW5zIEVTQyAnZGF0YScJKi8KKworCitzdHJ1Y3Qgc2xpcCB7CisgIGludAkJCW1hZ2ljOworCisgIC8qIFZhcmlvdXMgZmllbGRzLiAqLworICBzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwkJLyogcHRyIHRvIFRUWSBzdHJ1Y3R1cmUJCSovCisgIHN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CQkvKiBlYXN5IGZvciBpbnRyIGhhbmRsaW5nCSovCisgIHNwaW5sb2NrX3QJCWxvY2s7CisKKyNpZmRlZiBTTF9JTkNMVURFX0NTTElQCisgIHN0cnVjdCBzbGNvbXByZXNzCSpzbGNvbXA7CS8qIGZvciBoZWFkZXIgY29tcHJlc3Npb24gCSovCisgIHVuc2lnbmVkIGNoYXIJCSpjYnVmZjsJCS8qIGNvbXByZXNzaW9uIGJ1ZmZlcgkJKi8KKyNlbmRpZgorCisgIC8qIFRoZXNlIGFyZSBwb2ludGVycyB0byB0aGUgbWFsbG9jKCllZCBmcmFtZSBidWZmZXJzLiAqLworICB1bnNpZ25lZCBjaGFyCQkqcmJ1ZmY7CQkvKiByZWNlaXZlciBidWZmZXIJCSovCisgIGludCAgICAgICAgICAgICAgICAgICByY291bnQ7ICAgICAgICAgLyogcmVjZWl2ZWQgY2hhcnMgY291bnRlciAgICAgICAqLworICB1bnNpZ25lZCBjaGFyCQkqeGJ1ZmY7CQkvKiB0cmFuc21pdHRlciBidWZmZXIJCSovCisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAqeGhlYWQ7ICAgICAgICAgLyogcG9pbnRlciB0byBuZXh0IGJ5dGUgdG8gWE1JVCAqLworICBpbnQgICAgICAgICAgICAgICAgICAgeGxlZnQ7ICAgICAgICAgIC8qIGJ5dGVzIGxlZnQgaW4gWE1JVCBxdWV1ZSAgICAgKi8KKworICAvKiBTTElQIGludGVyZmFjZSBzdGF0aXN0aWNzLiAqLworICB1bnNpZ25lZCBsb25nCQlyeF9wYWNrZXRzOwkvKiBpbmJvdW5kIGZyYW1lcyBjb3VudGVyCSovCisgIHVuc2lnbmVkIGxvbmcgICAgICAgICB0eF9wYWNrZXRzOyAgICAgLyogb3V0Ym91bmQgZnJhbWVzIGNvdW50ZXIgICAgICAqLworICB1bnNpZ25lZCBsb25nCQlyeF9ieXRlczsJLyogaW5ib3VuZCBieXRlIGNvdW50ZQkJKi8KKyAgdW5zaWduZWQgbG9uZyAgICAgICAgIHR4X2J5dGVzOyAgICAgICAvKiBvdXRib3VuZCBieXRlIGNvdW50ZXIJKi8KKyAgdW5zaWduZWQgbG9uZyAgICAgICAgIHJ4X2Vycm9yczsgICAgICAvKiBQYXJpdHksIGV0Yy4gZXJyb3JzICAgICAgICAgICovCisgIHVuc2lnbmVkIGxvbmcgICAgICAgICB0eF9lcnJvcnM7ICAgICAgLyogUGxhbm5lZCBzdHVmZiAgICAgICAgICAgICAgICAqLworICB1bnNpZ25lZCBsb25nICAgICAgICAgcnhfZHJvcHBlZDsgICAgIC8qIE5vIG1lbW9yeSBmb3Igc2tiICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgbG9uZyAgICAgICAgIHR4X2Ryb3BwZWQ7ICAgICAvKiBXaGVuIE1UVSBjaGFuZ2UgICAgICAgICAgICAgICovCisgIHVuc2lnbmVkIGxvbmcgICAgICAgICByeF9vdmVyX2Vycm9yczsgLyogRnJhbWUgYmlnZ2VyIHRoZW4gU0xJUCBidWYuICAqLworI2lmZGVmIFNMX0lOQ0xVREVfQ1NMSVAKKyAgdW5zaWduZWQgbG9uZwkJdHhfY29tcHJlc3NlZDsKKyAgdW5zaWduZWQgbG9uZwkJcnhfY29tcHJlc3NlZDsKKyAgdW5zaWduZWQgbG9uZwkJdHhfbWlzc2VzOworI2VuZGlmCisgIC8qIERldGFpbGVkIFNMSVAgc3RhdGlzdGljcy4gKi8KKworICBpbnQJCQltdHU7CQkvKiBPdXIgbXR1ICh0byBzcG90IGNoYW5nZXMhKSAgICovCisgIGludCAgICAgICAgICAgICAgICAgICBidWZmc2l6ZTsgICAgICAgLyogTWF4IGJ1ZmZlcnMgc2l6ZXMgICAgICAgICAgICAqLworCisjaWZkZWYgQ09ORklHX1NMSVBfTU9ERV9TTElQNgorICBpbnQJCQl4ZGF0YSwgeGJpdHM7CS8qIDYgYml0IHNsaXAgY29udHJvbHMgCQkqLworI2VuZGlmCisKKyAgdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBGbGFnIHZhbHVlcy8gbW9kZSBldGMJKi8KKyNkZWZpbmUgU0xGX0lOVVNFCTAJCS8qIENoYW5uZWwgaW4gdXNlICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0xGX0VTQ0FQRQkxICAgICAgICAgICAgICAgLyogRVNDIHJlY2VpdmVkICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTTEZfRVJST1IJMiAgICAgICAgICAgICAgIC8qIFBhcml0eSwgZXRjLiBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgU0xGX0tFRVBURVNUCTMJCS8qIEtlZXBhbGl2ZSB0ZXN0IGZsYWcJCSovCisjZGVmaW5lIFNMRl9PVVRXQUlUCTQJCS8qIGlzIG91dHBhY2tldCB3YXMgZmxhZwkqLworCisgIHVuc2lnbmVkIGNoYXIJCW1vZGU7CQkvKiBTTElQIG1vZGUJCQkqLworICB1bnNpZ25lZCBjaGFyCQlsZWFzZWQ7CisgIGRldl90CQkJbGluZTsKKyAgcGlkX3QJCQlwaWQ7CisjZGVmaW5lIFNMX01PREVfU0xJUAkwCisjZGVmaW5lIFNMX01PREVfQ1NMSVAJMQorI2RlZmluZSBTTF9NT0RFX1NMSVA2CTIJCS8qIE1hdHQgRGlsbG9uJ3MgcHJpbnRhYmxlIHNsaXAgKi8KKyNkZWZpbmUgU0xfTU9ERV9DU0xJUDYJKFNMX01PREVfU0xJUDZ8U0xfTU9ERV9DU0xJUCkKKyNkZWZpbmUgU0xfTU9ERV9BWDI1CTQKKyNkZWZpbmUgU0xfTU9ERV9BREFQVElWRSA4CisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQgIAorICB1bnNpZ25lZCBjaGFyCQlvdXRmaWxsOwkvKiAjIG9mIHNlYyBiZXR3ZWVuIG91dGZpbGwgcGFja2V0ICovCisgIHVuc2lnbmVkIGNoYXIJCWtlZXBhbGl2ZTsJLyoga2VlcGFsaXZlIHNlY29uZHMJCSovCisgIHN0cnVjdCB0aW1lcl9saXN0CW91dGZpbGxfdGltZXI7CisgIHN0cnVjdCB0aW1lcl9saXN0CWtlZXBhbGl2ZV90aW1lcjsKKyNlbmRpZiAgCit9OworCisjZGVmaW5lIFNMSVBfTUFHSUMgMHg1MzAyCisKKyNlbmRpZgkvKiBfTElOVVhfU0xJUC5IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWMtbWNhLmMgYi9kcml2ZXJzL25ldC9zbWMtbWNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkwMjAxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NtYy1tY2EuYwpAQCAtMCwwICsxLDUwOCBAQAorLyogc21jLW1jYS5jOiBBIFNNQyBVbHRyYSBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKyAgICBNb3N0IG9mIHRoaXMgZHJpdmVyLCBleGNlcHQgZm9yIHVsdHJhbWNhX3Byb2JlIGlzIG5lYXJseQorICAgIHZlcmJhdGltIGZyb20gc21jLXVsdHJhLmMgYnkgRG9uYWxkIEJlY2tlci4gVGhlIHJlc3QgaXMKKyAgICB3cml0dGVuIGFuZCBjb3B5cmlnaHQgMTk5NiBieSBEYXZpZCBXZWlzLCB3ZWlzZDM0NThAdW5pLmVkdQorCisgICAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNNQyBVbHRyYSBhbmQgU01DIEV0aGVyRVogZXRoZXJjYXJkcy4KKworICAgIFRoaXMgZHJpdmVyIHVzZXMgdGhlIGNhcmRzIGluIHRoZSA4MzkwLWNvbXBhdGlibGUsIHNoYXJlZCBtZW1vcnkgbW9kZS4KKyAgICBNb3N0IG9mIHRoZSBydW4tdGltZSBjb21wbGV4aXR5IGlzIGhhbmRsZWQgYnkgdGhlIGdlbmVyaWMgY29kZSBpbgorICAgIDgzOTAuYy4KKworICAgIFRoaXMgZHJpdmVyIGVuYWJsZXMgdGhlIHNoYXJlZCBtZW1vcnkgb25seSB3aGVuIGRvaW5nIHRoZSBhY3R1YWwgZGF0YQorICAgIHRyYW5zZmVycyB0byBhdm9pZCBhIGJ1ZyBpbiBlYXJseSB2ZXJzaW9uIG9mIHRoZSBjYXJkIHRoYXQgY29ycnVwdGVkCisgICAgZGF0YSB0cmFuc2ZlcnJlZCBieSBhIEFIQTE1NDIuCisKKyAgICBUaGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBwcm9ncmFtbWVkLUkvTyBkYXRhIHRyYW5zZmVyIG1vZGUgb2YKKyAgICB0aGUgRXRoZXJFWi4gIFRoYXQgc3VwcG9ydCAoaWYgYXZhaWxhYmxlKSBpcyBzbWMtZXouYy4gIE5vciBkb2VzIGl0CisgICAgdXNlIHRoZSBub24tODM5MC1jb21wYXRpYmxlICJBbHRlZ28iIG1vZGUuIChObyBzdXBwb3J0IGN1cnJlbnRseSBwbGFubmVkLikKKworICAgIENoYW5nZWxvZzoKKworICAgIFBhdWwgR29ydG1ha2VyCSA6IG11bHRpcGxlIGNhcmQgc3VwcG9ydCBmb3IgbW9kdWxlIHVzZXJzLgorICAgIERhdmlkIFdlaXMJCSA6IE1pY3JvIENoYW5uZWwtaXplZCBpdC4KKyAgICBUb20gU2lnaHRsZXIJIDogQWRkZWQgc3VwcG9ydCBmb3IgSUJNIFBTLzIgRXRoZXJuZXQgQWRhcHRlci9BCisgICAgQ2hyaXN0b3BoZXIgVHVyY2tzaW4gOiBDaGFuZ2VkIE1DQS1wcm9iZSBzbyB0aGF0IG11bHRpcGxlIGFkYXB0ZXJzIGFyZQorCQkJICAgZm91bmQgY29ycmVjdGx5IChKdWwgMTYsIDE5OTcpCisgICAgQ2hyaXMgQmVhdXJlZ2FyZAkgOiBUcmllZCB0byBtZXJnZSB0aGUgdHdvIGNoYW5nZXMgYWJvdmUgKERlYyAxNSwgMTk5NykKKyAgICBUb20gU2lnaHRsZXIJIDogRml4ZWQgbWlub3IgZGV0ZWN0aW9uIGJ1ZyBjYXVzZWQgYnkgYWJvdmUgbWVyZ2UKKyAgICBUb20gU2lnaHRsZXIJIDogQWRkZWQgc3VwcG9ydCBmb3IgdGhyZWUgbW9yZSBXZXN0ZXJuIERpZ2l0YWwKKwkJCSAgIE1DQS1hZGFwdGVycworICAgIFRvbSBTaWdodGxlcgkgOiBBZGRlZCBzdXBwb3J0IGZvciAyLjIueCBtY2FfZmluZF91bnVzZWRfYWRhcHRlcgorICAgIEhhcnRtdXQgU2NobWlkdAkgOiAtIE1vZGlmaWVkIHBhcmFtZXRlciBkZXRlY3Rpb24gdG8gaGFuZGxlIGVhY2gKKwkJCSAgICAgY2FyZCBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gYSBzd2l0Y2gtbGlzdAorCQkJICAgLSAnY2FyZF92ZXInIHJlbW92ZWQgZnJvbSB0aGUgYWRhcHRlciBsaXN0CisJCQkgICAtIFNvbWUgbWlub3IgYnVnIGZpeGVzCisqLworCisjaW5jbHVkZSA8bGludXgvbWNhLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKyNpbmNsdWRlICJzbWMtbWNhLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgInNtYy1tY2EiCisKK3N0YXRpYyBpbnQgdWx0cmFtY2Ffb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHVsdHJhbWNhX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB1bHRyYW1jYV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgdWx0cmFtY2FfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCB1bHRyYW1jYV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3RhcnRfcGFnZSk7CitzdGF0aWMgaW50IHVsdHJhbWNhX2Nsb3NlX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNkZWZpbmUgU1RBUlRfUEcgICAgICAgIDB4MDAgICAgLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKworI2RlZmluZSBVTFRSQV9DTURSRUcgMCAgICAgIC8qIE9mZnNldCB0byBBU0lDIGNvbW1hbmQgcmVnaXN0ZXIuICovCisjZGVmaW5lIFVMVFJBX1JFU0VUICAweDgwICAgLyogQm9hcmQgcmVzZXQsIGluIFVMVFJBX0NNRFJFRy4gKi8KKyNkZWZpbmUgVUxUUkFfTUVNRU5CIDB4NDAgICAvKiBFbmFibGUgdGhlIHNoYXJlZCBtZW1vcnkuICovCisjZGVmaW5lIFVMVFJBX05JQ19PRkZTRVQgMTYgLyogTklDIHJlZ2lzdGVyIG9mZnNldCBmcm9tIHRoZSBiYXNlX2FkZHIuICovCisjZGVmaW5lIFVMVFJBX0lPX0VYVEVOVCAzMgorI2RlZmluZSBFTjBfRVJXQ05UICAgICAgMHgwOCAgLyogRWFybHkgcmVjZWl2ZSB3YXJuaW5nIGNvdW50LiAqLworCisjZGVmaW5lIF82MWM4X1NNQ19FdGhlcmNhcmRfUExVU19FbGl0ZV9BX0JOQ19BVUlfV0Q4MDEzRVBfQSAgICAgICAgICAgIDAKKyNkZWZpbmUgXzYxYzlfU01DX0V0aGVyY2FyZF9QTFVTX0VsaXRlX0FfVVRQX0FVSV9XRDgwMTNFUF9BICAgICAgICAgICAgMQorI2RlZmluZSBfNmZjMF9XRF9FdGhlcmNhcmRfUExVU19BX1dEODAwM0VfQV9PUl9XRDgwMDNFVF9BICAgICAgICAgICAgICAyCisjZGVmaW5lIF82ZmMxX1dEX1N0YXJjYXJkX1BMVVNfQV9XRDgwMDNTVF9BICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgXzZmYzJfV0RfRXRoZXJjYXJkX1BMVVNfMTBUX0FfV0Q4MDAzV19BICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBfZWZkNF9JQk1fUFMyX0FkYXB0ZXJfQV9mb3JfRXRoZXJuZXRfVVRQX0FVSV9XRDgwMTNXUF9BICAgICAgICA1CisjZGVmaW5lIF9lZmQ1X0lCTV9QUzJfQWRhcHRlcl9BX2Zvcl9FdGhlcm5ldF9CTkNfQVVJX1dEODAxM1dQX0EgICAgICAgIDYKKyNkZWZpbmUgX2VmZTVfSUJNX1BTMl9BZGFwdGVyX0FfZm9yX0V0aGVybmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgNworCitzdHJ1Y3Qgc21jX21jYV9hZGFwdGVyc190IHsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJY2hhciAqbmFtZTsKK307CisKKyNkZWZpbmUgTUFYX1VMVFJBTUNBX0NBUkRTIDQJLyogTWF4IG51bWJlciBvZiBVbHRyYSBjYXJkcyBwZXIgbW9kdWxlICovCisKK3N0YXRpYyBpbnQgdWx0cmFfaW9bTUFYX1VMVFJBTUNBX0NBUkRTXTsKK3N0YXRpYyBpbnQgdWx0cmFfaXJxW01BWF9VTFRSQU1DQV9DQVJEU107CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbV9hcnJheSh1bHRyYV9pbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh1bHRyYV9pcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHVsdHJhX2lvLCAiU01DIFVsdHJhL0V0aGVyRVogTUNBIEkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKHVsdHJhX2lycSwgIlNNQyBVbHRyYS9FdGhlckVaIE1DQSBJUlEgbnVtYmVyKHMpIik7CisKK3N0YXRpYyBzaG9ydCBzbWNfbWNhX2FkYXB0ZXJfaWRzW10gX19pbml0ZGF0YSA9IHsKKwkweDYxYzgsCisJMHg2MWM5LAorCTB4NmZjMCwKKwkweDZmYzEsCisJMHg2ZmMyLAorCTB4ZWZkNCwKKwkweGVmZDUsCisJMHhlZmU1LAorCTB4MDAwMAorfTsKKworc3RhdGljIGNoYXIgKnNtY19tY2FfYWRhcHRlcl9uYW1lc1tdIF9faW5pdGRhdGEgPSB7CisJIlNNQyBFdGhlcmNhcmQgUExVUyBFbGl0ZS9BIEJOQy9BVUkgKFdEODAxM0VQL0EpIiwKKwkiU01DIEV0aGVyY2FyZCBQTFVTIEVsaXRlL0EgVVRQL0FVSSAoV0Q4MDEzV1AvQSkiLAorCSJXRCBFdGhlcmNhcmQgUExVUy9BIChXRDgwMDNFL0Egb3IgV0Q4MDAzRVQvQSkiLAorCSJXRCBTdGFyY2FyZCBQTFVTL0EgKFdEODAwM1NUL0EpIiwKKwkiV0QgRXRoZXJjYXJkIFBMVVMgMTBUL0EgKFdEODAwM1cvQSkiLAorCSJJQk0gUFMvMiBBZGFwdGVyL0EgZm9yIEV0aGVybmV0IFVUUC9BVUkgKFdEODAxM1dQL0EpIiwKKwkiSUJNIFBTLzIgQWRhcHRlci9BIGZvciBFdGhlcm5ldCBCTkMvQVVJIChXRDgwMTNFUC9BKSIsCisJIklCTSBQUy8yIEFkYXB0ZXIvQSBmb3IgRXRoZXJuZXQiLAorCU5VTEwKK307CisKK3N0YXRpYyBpbnQgdWx0cmFfZm91bmQgPSAwOworCitpbnQgX19pbml0IHVsdHJhbWNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmdlbl9kZXYpCit7CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgY2hhciByZWc0LCBudW1fcGFnZXM7CisJc3RydWN0IG1jYV9kZXZpY2UgKm1jYV9kZXYgPSB0b19tY2FfZGV2aWNlKGdlbl9kZXYpOworCWNoYXIgc2xvdCA9IG1jYV9kZXYtPnNsb3Q7CisJdW5zaWduZWQgY2hhciBwb3MyID0gMHhmZiwgcG9zMyA9IDB4ZmYsIHBvczQgPSAweGZmLCBwb3M1ID0gMHhmZjsKKwlpbnQgaSwgcmM7CisJaW50IGFkYXB0ZXIgPSBtY2FfZGV2LT5pbmRleDsKKwlpbnQgdGJhc2UgPSAwOworCWludCB0aXJxID0gMDsKKwlpbnQgYmFzZV9hZGRyID0gdWx0cmFfaW9bdWx0cmFfZm91bmRdOworCWludCBpcnEgPSB1bHRyYV9pcnFbdWx0cmFfZm91bmRdOworCisJaWYgKGJhc2VfYWRkciB8fCBpcnEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUHJvYmluZyBmb3IgU01DIE1DQSBhZGFwdGVyIik7CisJCWlmIChiYXNlX2FkZHIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiBhdCBJL08gYWRkcmVzcyAweCUwNHglYyIsCisJCQkgICAgICAgYmFzZV9hZGRyLCBpcnEgPyAnICcgOiAnXG4nKTsKKwkJfQorCQlpZiAoaXJxKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJ1c2luZyBpcnEgJWRcbiIsIGlycSk7CisJCX0KKwl9CisKKwl0aXJxID0gMDsKKwl0YmFzZSA9IDA7CisKKwkvKiBJZiB3ZSdyZSB0cnlpbmcgdG8gbWF0Y2ggYSBzcGVjaWZpY2llZCBpcnEgb3IgaW8gYWRkcmVzcywKKwkgKiB3ZSdsbCByZWplY3QgdGhlIGFkYXB0ZXIgZm91bmQgdW5sZXNzIGl0J3MgdGhlIG9uZSB3ZSdyZQorCSAqIGxvb2tpbmcgZm9yICovCisKKwlwb3MyID0gbWNhX2RldmljZV9yZWFkX3N0b3JlZF9wb3MobWNhX2RldiwgMik7IC8qIGlvX2FkZHIgKi8KKwlwb3MzID0gbWNhX2RldmljZV9yZWFkX3N0b3JlZF9wb3MobWNhX2RldiwgMyk7IC8qIHNoYXJlZCBtZW0gKi8KKwlwb3M0ID0gbWNhX2RldmljZV9yZWFkX3N0b3JlZF9wb3MobWNhX2RldiwgNCk7IC8qIFJPTSBiaW9zIGFkZHIgcmFuZ2UgKi8KKwlwb3M1ID0gbWNhX2RldmljZV9yZWFkX3N0b3JlZF9wb3MobWNhX2RldiwgNSk7IC8qIGlycSwgbWVkaWEgYW5kIFJJUEwgKi8KKworCS8qIFRlc3QgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCSAqIC0gSWYgYW4gaXJxIHBhcmFtZXRlciBpcyBzdXBwbGllZCwgY29tcGFyZSBpdAorCSAqICAgd2l0aCB0aGUgaXJxIG9mIHRoZSBhZGFwdGVyIHdlIGZvdW5kCisJICogLSBJZiBhIGJhc2VfYWRkciBwYXJhbWF0ZXIgaXMgZ2l2ZW4sIGNvbXBhcmUgaXQKKwkgKiAgIHdpdGggdGhlIGJhc2VfYWRkciBvZiB0aGUgYWRhcHRlciB3ZSBmb3VuZAorCSAqIC0gQ2hlY2sgdGhhdCB0aGUgaXJxIGFuZCB0aGUgYmFzZV9hZGRyIG9mIHRoZQorCSAqICAgYWRhcHRlciB3ZSBmb3VuZCBpcyBub3QgYWxyZWFkeSBpbiB1c2UgYnkKKwkgKiAgIHRoaXMgZHJpdmVyCisJICovCisKKwlzd2l0Y2ggKG1jYV9kZXYtPmluZGV4KSB7CisJY2FzZSBfNjFjOF9TTUNfRXRoZXJjYXJkX1BMVVNfRWxpdGVfQV9CTkNfQVVJX1dEODAxM0VQX0E6CisJY2FzZSBfNjFjOV9TTUNfRXRoZXJjYXJkX1BMVVNfRWxpdGVfQV9VVFBfQVVJX1dEODAxM0VQX0E6CisJY2FzZSBfZWZkNF9JQk1fUFMyX0FkYXB0ZXJfQV9mb3JfRXRoZXJuZXRfVVRQX0FVSV9XRDgwMTNXUF9BOgorCWNhc2UgX2VmZDVfSUJNX1BTMl9BZGFwdGVyX0FfZm9yX0V0aGVybmV0X0JOQ19BVUlfV0Q4MDEzV1BfQToKKwkJeworCQkJdGJhc2UgPSBhZGRyX3RhYmxlWyhwb3MyICYgMHhmMCkgPj4gNF0uYmFzZV9hZGRyOworCQkJdGlycSAgPSBpcnFfdGFibGVbKHBvczUgJiAweGMpID4+IDJdLm5ld19pcnE7CisJCQlicmVhazsKKwkJfQorCWNhc2UgXzZmYzBfV0RfRXRoZXJjYXJkX1BMVVNfQV9XRDgwMDNFX0FfT1JfV0Q4MDAzRVRfQToKKwljYXNlIF82ZmMxX1dEX1N0YXJjYXJkX1BMVVNfQV9XRDgwMDNTVF9BOgorCWNhc2UgXzZmYzJfV0RfRXRoZXJjYXJkX1BMVVNfMTBUX0FfV0Q4MDAzV19BOgorCWNhc2UgX2VmZTVfSUJNX1BTMl9BZGFwdGVyX0FfZm9yX0V0aGVybmV0OgorCQl7CisJCQl0YmFzZSA9ICgocG9zMiAmIDB4MGZlKSAqIDB4MTApOworCQkJdGlycSAgPSBpcnFfdGFibGVbKHBvczUgJiAzKV0ub2xkX2lycTsKKwkJCWJyZWFrOworCQl9CisJfQorCQorCWlmKCF0aXJxIHx8ICF0YmFzZSAKKwkgICB8fCAoaXJxICYmIGlycSAhPSB0aXJxKSAKKwkgICB8fCAoYmFzZV9hZGRyICYmIHRiYXNlICE9IGJhc2VfYWRkcikpCisJCS8qIEZJWE1FOiB3ZSdyZSB0cnlpbmcgdG8gZm9yY2UgdGhlIG9yZGVyaW5nIG9mIHRoZQorCQkgKiBkZXZpY2VzIGhlcmUsIHRoZXJlIHNob3VsZCBiZSBhIHdheSBvZiBnZXR0aW5nIHRoaXMKKwkJICogdG8gaGFwcGVuICovCisJCXJldHVybiAtRU5YSU87CisKKyAgICAgICAgLyogQWRhcHRlciBmb3VuZC4gKi8KKwlkZXYgID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaWYoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCBnZW5fZGV2KTsKKwltY2FfZGV2aWNlX3NldF9uYW1lKG1jYV9kZXYsIHNtY19tY2FfYWRhcHRlcl9uYW1lc1thZGFwdGVyXSk7CisJbWNhX2RldmljZV9zZXRfY2xhaW0obWNhX2RldiwgMSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJzbWNfbWNhOiAlcyBmb3VuZCBpbiBzbG90ICVkXG4iLAorCQkgICAgICAgc21jX21jYV9hZGFwdGVyX25hbWVzW2FkYXB0ZXJdLCBzbG90ICsgMSk7CisKKwl1bHRyYV9mb3VuZCsrOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHIgPSBtY2FfZGV2aWNlX3RyYW5zZm9ybV9pb3BvcnQobWNhX2RldiwgdGJhc2UpOworCWRldi0+aXJxICAgICAgID0gbWNhX2RldmljZV90cmFuc2Zvcm1faXJxKG1jYV9kZXYsIHRpcnEpOworCWRldi0+bWVtX3N0YXJ0ID0gMDsKKwludW1fcGFnZXMgICAgICA9IDQwOworCisJc3dpdGNoIChhZGFwdGVyKSB7CS8qIGNhcmQtIyBpbiBjb25zdCBhcnJheSBhYm92ZSBbaHNdICovCisJCWNhc2UgXzYxYzhfU01DX0V0aGVyY2FyZF9QTFVTX0VsaXRlX0FfQk5DX0FVSV9XRDgwMTNFUF9BOgorCQljYXNlIF82MWM5X1NNQ19FdGhlcmNhcmRfUExVU19FbGl0ZV9BX1VUUF9BVUlfV0Q4MDEzRVBfQToKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsgLyogdGFraW5nIDE2IGNvdW50cworCQkJCQkJICAgICogdXAgdG8gMTUgW2hzXSAqLworCQkJCWlmIChtZW1fdGFibGVbaV0ubWVtX2luZGV4ID09IChwb3MzICYgfk1FTV9NQVNLKSkgeworCQkJCQlkZXYtPm1lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKQorCQkJCQkgIG1jYV9kZXZpY2VfdHJhbnNmb3JtX21lbW9yeShtY2FfZGV2LCAodm9pZCAqKW1lbV90YWJsZVtpXS5tZW1fc3RhcnQpOworCQkJCQludW1fcGFnZXMgPSBtZW1fdGFibGVbaV0ubnVtX3BhZ2VzOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgXzZmYzBfV0RfRXRoZXJjYXJkX1BMVVNfQV9XRDgwMDNFX0FfT1JfV0Q4MDAzRVRfQToKKwkJY2FzZSBfNmZjMV9XRF9TdGFyY2FyZF9QTFVTX0FfV0Q4MDAzU1RfQToKKwkJY2FzZSBfNmZjMl9XRF9FdGhlcmNhcmRfUExVU18xMFRfQV9XRDgwMDNXX0E6CisJCWNhc2UgX2VmZTVfSUJNX1BTMl9BZGFwdGVyX0FfZm9yX0V0aGVybmV0OgorCQl7CisJCQlkZXYtPm1lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKQorCQkJICBtY2FfZGV2aWNlX3RyYW5zZm9ybV9tZW1vcnkobWNhX2RldiwgKHZvaWQgKikoKHBvczMgJiAweGZjKSAqIDB4MTAwMCkpOworCQkJbnVtX3BhZ2VzID0gMHg0MDsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgX2VmZDRfSUJNX1BTMl9BZGFwdGVyX0FfZm9yX0V0aGVybmV0X1VUUF9BVUlfV0Q4MDEzV1BfQToKKwkJY2FzZSBfZWZkNV9JQk1fUFMyX0FkYXB0ZXJfQV9mb3JfRXRoZXJuZXRfQk5DX0FVSV9XRDgwMTNXUF9BOgorCQl7CisJCQkvKiBjb3VydGVzeSBvZiBnYW1lcmFAcXVhcnR6Lm9jbi5uZS5qcCwgcG9zMyBpbmRpY2F0ZXMKKwkJCSAqIHRoZSBpbmRleCBvZiB0aGUgMHgyMDAwIHN0ZXAuCisJCQkgKiBiZXdhcmUgZGlmZmVyZW50IG51bWJlciBvZiBwYWdlcyBbaHNdCisJCQkgKi8KKwkJCWRldi0+bWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIAorCQkJICBtY2FfZGV2aWNlX3RyYW5zZm9ybV9tZW1vcnkobWNhX2RldiwgKHZvaWQgKikoMHhjMDAwMCArICgweDIwMDAgKiAocG9zMyAmIDB4ZikpKSk7CisJCQludW1fcGFnZXMgPSAweDIwICsgKDIgKiAocG9zMyAmIDB4MTApKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogc2FuaXR5IGNoZWNrLCBzaG91bGRuJ3QgaGFwcGVuICovCisJaWYgKGRldi0+bWVtX3N0YXJ0ID09IDApIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl91bmNsYWltOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBVTFRSQV9JT19FWFRFTlQsIERSVl9OQU1FKSkgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3VuY2xhaW07CisJfQorCisJcmVnNCA9IGluYihpb2FkZHIgKyA0KSAmIDB4N2Y7CisJb3V0YihyZWc0LCBpb2FkZHIgKyA0KTsKKworCXByaW50ayhLRVJOX0lORk8gInNtY19tY2FbJWRdOiBQYXJhbWV0ZXJzOiAlIzN4LCIsIHNsb3QgKyAxLCBpb2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMlgiLCBkZXYtPmRldl9hZGRyW2ldID0gaW5iKGlvYWRkciArIDggKyBpKSk7CisKKwkvKiBTd2l0Y2ggZnJvbSB0aGUgc3RhdGlvbiBhZGRyZXNzIHRvIHRoZSBhbHRlcm5hdGUgcmVnaXN0ZXIgc2V0CisJICogYW5kIHJlYWQgdGhlIHVzZWZ1bCByZWdpc3RlcnMgdGhlcmUuCisJICovCisKKwlvdXRiKDB4ODAgfCByZWc0LCBpb2FkZHIgKyA0KTsKKworCS8qIEVuYWJsZSBGSU5FMTYgbW9kZSB0byBhdm9pZCBCSU9TIFJPTSB3aWR0aCBtaXNtYXRjaGVzIEAgcmVib290LgorCSAqLworCisJb3V0YigweDgwIHwgaW5iKGlvYWRkciArIDB4MGMpLCBpb2FkZHIgKyAweDBjKTsKKworCS8qIFN3aXRjaCBiYWNrIHRvIHRoZSBzdGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgc2V0IHNvIHRoYXQKKwkgKiB0aGUgTVMtRE9TIGRyaXZlciBjYW4gZmluZCB0aGUgY2FyZCBhZnRlciBhIHdhcm0gYm9vdC4KKwkgKi8KKworCW91dGIocmVnNCwgaW9hZGRyICsgNCk7CisKKwlnZW5fZGV2LT5kcml2ZXJfZGF0YSA9IGRldjsKKworCS8qIFRoZSA4MzkwIGlzbid0IGF0IHRoZSBiYXNlIGFkZHJlc3MsIHNvIGZha2UgdGhlIG9mZnNldAorCSAqLworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHIgKyBVTFRSQV9OSUNfT0ZGU0VUOworCisJZWlfc3RhdHVzLm5hbWUgPSAiU01DIFVsdHJhIE1DQSI7CisJZWlfc3RhdHVzLndvcmQxNiA9IDE7CisJZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBTVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IFNUQVJUX1BHICsgVFhfUEFHRVM7CisJZWlfc3RhdHVzLnN0b3BfcGFnZSA9IG51bV9wYWdlczsKKworCWVpX3N0YXR1cy5tZW0gPSBpb3JlbWFwKGRldi0+bWVtX3N0YXJ0LCAoZWlfc3RhdHVzLnN0b3BfcGFnZSAtIFNUQVJUX1BHKSAqIDI1Nik7CisJaWYgKCFlaV9zdGF0dXMubWVtKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisJfQorCisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAoZWlfc3RhdHVzLnN0b3BfcGFnZSAtIFNUQVJUX1BHKSAqIDI1NjsKKworCXByaW50aygiLCBJUlEgJWQgbWVtb3J5ICUjbHgtJSNseC5cbiIsCisJZGV2LT5pcnEsIGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQgLSAxKTsKKworCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJnVsdHJhbWNhX3Jlc2V0XzgzOTA7CisJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJnVsdHJhbWNhX2Jsb2NrX2lucHV0OworCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmdWx0cmFtY2FfYmxvY2tfb3V0cHV0OworCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmdWx0cmFtY2FfZ2V0XzgzOTBfaGRyOworCisJZWlfc3RhdHVzLnByaXYgPSBzbG90OworCisJZGV2LT5vcGVuID0gJnVsdHJhbWNhX29wZW47CisJZGV2LT5zdG9wID0gJnVsdHJhbWNhX2Nsb3NlX2NhcmQ7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKworCU5TODM5MF9pbml0KGRldiwgMCk7CisKKwlyYyA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfdW5tYXA7CisKKwlyZXR1cm4gMDsKKworZXJyX3VubWFwOgorCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7CitlcnJfcmVsZWFzZV9yZWdpb246CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBVTFRSQV9JT19FWFRFTlQpOworZXJyX3VuY2xhaW06CisJbWNhX2RldmljZV9zZXRfY2xhaW0obWNhX2RldiwgMCk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdWx0cmFtY2Ffb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQ7IC8qIEFTSUMgYWRkciAqLworCWludCByZXR2YWw7CisKKwlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkpCisJCXJldHVybiByZXR2YWw7CisKKwlvdXRiKFVMVFJBX01FTUVOQiwgaW9hZGRyKTsgLyogRW5hYmxlIG1lbW9yeSAqLworCW91dGIoMHg4MCwgaW9hZGRyICsgNSk7ICAgICAvKiA/Pz8gKi8KKwlvdXRiKDB4MDEsIGlvYWRkciArIDYpOyAgICAgLyogRW5hYmxlIGludGVycnVwdHMgYW5kIG1lbW9yeS4gKi8KKwlvdXRiKDB4MDQsIGlvYWRkciArIDUpOyAgICAgLyogPz8/ICovCisKKwkvKiBTZXQgdGhlIGVhcmx5IHJlY2VpdmUgd2FybmluZyBsZXZlbCBpbiB3aW5kb3cgMCBoaWdoIGVub3VnaCBub3QKKwkgKiB0byByZWNlaXZlIEVSVyBpbnRlcnJ1cHRzLgorCSAqLworCisJLyogb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAsIGRldi0+YmFzZV9hZGRyKTsKKwkgKiBvdXRiKDB4ZmYsIGRldi0+YmFzZV9hZGRyICsgRU4wX0VSV0NOVCk7CisJICovCisKKwllaV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVsdHJhbWNhX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBVTFRSQV9OSUNfT0ZGU0VUOyAvKiBBU0lDIGFkZHIgKi8KKworCW91dGIoVUxUUkFfUkVTRVQsIGlvYWRkcik7CisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKCJyZXNldHRpbmcgVWx0cmEsIHQ9JWxkLi4uIiwgamlmZmllcyk7CisJZWlfc3RhdHVzLnR4aW5nID0gMDsKKworCW91dGIoMHg4MCwgaW9hZGRyICsgNSk7ICAgICAvKiA/Pz8gKi8KKwlvdXRiKDB4MDEsIGlvYWRkciArIDYpOyAgICAgLyogRW5hYmxlIGludGVycnVwdHMgYW5kIG1lbW9yeS4gKi8KKworCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50aygicmVzZXQgZG9uZVxuIik7CisJcmV0dXJuOworfQorCisvKiBHcmFiIHRoZSA4MzkwIHNwZWNpZmljIGhlYWRlci4gU2ltaWxhciB0byB0aGUgYmxvY2tfaW5wdXQgcm91dGluZSwgYnV0CisgKiB3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcCBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQKKyAqIHRoZSBzdGFydCBvZiBhIHBhZ2UsIHNvIHdlIG9wdGltaXplIGFjY29yZGluZ2x5LgorICovCisKK3N0YXRpYyB2b2lkIHVsdHJhbWNhX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCXZvaWQgX19pb21lbSAqaGRyX3N0YXJ0ID0gZWlfc3RhdHVzLm1lbSArICgocmluZ19wYWdlIC0gU1RBUlRfUEcpIDw8IDgpOworCisjaWZkZWYgbm90ZGVmCisJLyogT2ZmaWNpYWxseSB0aGlzIGlzIHdoYXQgd2UgYXJlIGRvaW5nLCBidXQgdGhlIHJlYWRsKCkgaXMgZmFzdGVyICovCisJbWVtY3B5X2Zyb21pbyhoZHIsIGhkcl9zdGFydCwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSk7CisjZWxzZQorCSgodW5zaWduZWQgaW50KiloZHIpWzBdID0gcmVhZGwoaGRyX3N0YXJ0KTsKKyNlbmRpZgorfQorCisvKiBCbG9jayBpbnB1dCBhbmQgb3V0cHV0IGFyZSBlYXN5IG9uIHNoYXJlZCBtZW1vcnkgZXRoZXJjYXJkcywgdGhlIG9ubHkKKyAqIGNvbXBsaWNhdGlvbiBpcyB3aGVuIHRoZSByaW5nIGJ1ZmZlciB3cmFwcy4KKyAqLworCitzdGF0aWMgdm9pZCB1bHRyYW1jYV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKwl2b2lkIF9faW9tZW0gKnhmZXJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgcmluZ19vZmZzZXQgLSBTVEFSVF9QRyAqIDI1NjsKKworCWlmIChyaW5nX29mZnNldCArIGNvdW50ID4gZWlfc3RhdHVzLnN0b3BfcGFnZSAqIDI1NikgeworCQkvKiBXZSBtdXN0IHdyYXAgdGhlIGlucHV0IG1vdmUuICovCisJCWludCBzZW1pX2NvdW50ID0gZWlfc3RhdHVzLnN0b3BfcGFnZSAqIDI1NiAtIHJpbmdfb2Zmc2V0OworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgeGZlcl9zdGFydCwgc2VtaV9jb3VudCk7CisJCWNvdW50IC09IHNlbWlfY291bnQ7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgc2VtaV9jb3VudCwgZWlfc3RhdHVzLm1lbSArIFRYX1BBR0VTICogMjU2LCBjb3VudCk7CisJfSBlbHNlIHsKKwkJLyogUGFja2V0IGlzIGluIG9uZSBjaHVuayAtLSB3ZSBjYW4gY29weSArIGNrc3VtLiAqLworCQlldGhfaW9fY29weV9hbmRfc3VtKHNrYiwgeGZlcl9zdGFydCwgY291bnQsIDApOworCX0KKworfQorCitzdGF0aWMgdm9pZCB1bHRyYW1jYV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3BhZ2UpCit7CisJdm9pZCBfX2lvbWVtICpzaG1lbSA9IGVpX3N0YXR1cy5tZW0gKyAoKHN0YXJ0X3BhZ2UgLSBTVEFSVF9QRykgPDwgOCk7CisKKwltZW1jcHlfdG9pbyhzaG1lbSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgdWx0cmFtY2FfY2xvc2VfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQ7IC8qIEFTSUMgYWRkciAqLworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKworCW91dGIoMHgwMCwgaW9hZGRyICsgNik7ICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMuICovCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlOUzgzOTBfaW5pdChkZXYsIDApOworCS8qIFdlIHNob3VsZCBzb21lZGF5IGRpc2FibGUgc2hhcmVkIG1lbW9yeSBhbmQgY2hhbmdlIHRvIDgtYml0IG1vZGUKKyAgICAgICAgICogImp1c3QgaW4gY2FzZSIuLi4KKwkgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVsdHJhbWNhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpnZW5fZGV2KQoreworCXN0cnVjdCBtY2FfZGV2aWNlICptY2FfZGV2ID0gdG9fbWNhX2RldmljZShnZW5fZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZ2VuX2Rldi0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoZGV2KSB7CisJCS8qIE5COiB1bHRyYV9jbG9zZV9jYXJkKCkgZG9lcyBmcmVlX2lycSAqLworCQlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBVTFRSQV9OSUNfT0ZGU0VUOworCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCW1jYV9kZXZpY2Vfc2V0X2NsYWltKG1jYV9kZXYsIDApOworCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIFVMVFJBX0lPX0VYVEVOVCk7CisJCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbWNhX2RyaXZlciB1bHRyYV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gc21jX21jYV9hZGFwdGVyX2lkcywKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzbWMtbWNhIiwKKwkJLmJ1cyA9ICZtY2FfYnVzX3R5cGUsCisJCS5wcm9iZSA9IHVsdHJhbWNhX3Byb2JlLAorCQkucmVtb3ZlID0gdWx0cmFtY2FfcmVtb3ZlLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHVsdHJhbWNhX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaWYoIU1DQV9idXMpCisJCXJldHVybiAtRU5YSU87CisKKwltY2FfcmVnaXN0ZXJfZHJpdmVyKCZ1bHRyYV9kcml2ZXIpOworCisJcmV0dXJuIHVsdHJhX2ZvdW5kID8gMCA6IC1FTlhJTzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVsdHJhbWNhX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJbWNhX3VucmVnaXN0ZXJfZHJpdmVyKCZ1bHRyYV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQodWx0cmFtY2FfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQodWx0cmFtY2FfY2xlYW51cF9tb2R1bGUpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWMtbWNhLmggYi9kcml2ZXJzL25ldC9zbWMtbWNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1MDExNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NtYy1tY2EuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogZGp3ZWlzIHdlaXNkMzQ1OEB1bmkuZWR1CisgKiBtb3N0IG9mIHRoaXMgZmlsZSB3YXMgdGFrZW4gZnJvbSBwczJlc2RpLmgKKyAqLworCitzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYmFzZV9hZGRyOworfSBhZGRyX3RhYmxlW10gPSB7CisgICAgeyAweDA4MDAgfSwKKyAgICB7IDB4MTgwMCB9LAorICAgIHsgMHgyODAwIH0sCisgICAgeyAweDM4MDAgfSwKKyAgICB7IDB4NDgwMCB9LAorICAgIHsgMHg1ODAwIH0sCisgICAgeyAweDY4MDAgfSwKKyAgICB7IDB4NzgwMCB9LAorICAgIHsgMHg4ODAwIH0sCisgICAgeyAweDk4MDAgfSwKKyAgICB7IDB4YTgwMCB9LAorICAgIHsgMHhiODAwIH0sCisgICAgeyAweGM4MDAgfSwKKyAgICB7IDB4ZDgwMCB9LAorICAgIHsgMHhlODAwIH0sCisgICAgeyAweGY4MDAgfQorfTsKKworI2RlZmluZSBNRU1fTUFTSyA2NAorCitzdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyIG1lbV9pbmRleDsKKyAgdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQ7CisgIHVuc2lnbmVkIGNoYXIgbnVtX3BhZ2VzOworfSBtZW1fdGFibGVbXSA9IHsKKyAgICB7IDE2LCAweDBjMDAwMCwgNDAgfSwKKyAgICB7IDE4LCAweDBjNDAwMCwgNDAgfSwKKyAgICB7IDIwLCAweDBjODAwMCwgNDAgfSwKKyAgICB7IDIyLCAweDBjYzAwMCwgNDAgfSwKKyAgICB7IDI0LCAweDBkMDAwMCwgNDAgfSwKKyAgICB7IDI2LCAweDBkNDAwMCwgNDAgfSwKKyAgICB7IDI4LCAweDBkODAwMCwgNDAgfSwKKyAgICB7IDMwLCAweDBkYzAwMCwgNDAgfSwKKyAgICB7MTQ0LCAweGZjMDAwMCwgNDAgfSwKKyAgICB7MTQ4LCAweGZjODAwMCwgNDAgfSwKKyAgICB7MTU0LCAweGZkMDAwMCwgNDAgfSwKKyAgICB7MTU2LCAweGZkODAwMCwgNDAgfSwKKyAgICB7ICAwLCAweDBjMDAwMCwgMjAgfSwKKyAgICB7ICAxLCAweDBjMjAwMCwgMjAgfSwKKyAgICB7ICAyLCAweDBjNDAwMCwgMjAgfSwKKyAgICB7ICAzLCAweDBjNjAwMCwgMjAgfQorfTsKKworI2RlZmluZSBJUlFfTUFTSyAyNDMKK3N0cnVjdCB7CisgICB1bnNpZ25lZCBjaGFyIG5ld19pcnE7CisgICB1bnNpZ25lZCBjaGFyIG9sZF9pcnE7Cit9IGlycV90YWJsZVtdID0geworICAgeyAgMywgIDMgfSwKKyAgIHsgIDQsICA0IH0sCisgICB7IDEwLCAxMCB9LAorICAgeyAxNCwgMTUgfQorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYy11bHRyYS5jIGIvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2NGM2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NtYy11bHRyYS5jCkBAIC0wLDAgKzEsNjE1IEBACisvKiBzbWMtdWx0cmEuYzogQSBTTUMgVWx0cmEgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4gKi8KKy8qCisJVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNNQyBVbHRyYSBhbmQgU01DIEV0aGVyRVogSVNBIGV0aGVyY2FyZHMuCisKKwlXcml0dGVuIDE5OTMtMTk5OCBieSBEb25hbGQgQmVja2VyLgorCisJQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCVRoaXMgZHJpdmVyIHVzZXMgdGhlIGNhcmRzIGluIHRoZSA4MzkwLWNvbXBhdGlibGUgbW9kZS4KKwlNb3N0IG9mIHRoZSBydW4tdGltZSBjb21wbGV4aXR5IGlzIGhhbmRsZWQgYnkgdGhlIGdlbmVyaWMgY29kZSBpbgorCTgzOTAuYy4gIFRoZSBjb2RlIGluIHRoaXMgZmlsZSBpcyByZXNwb25zaWJsZSBmb3IKKworCQl1bHRyYV9wcm9iZSgpCSAJRGV0ZWN0aW5nIGFuZCBpbml0aWFsaXppbmcgdGhlIGNhcmQuCisJCXVsdHJhX3Byb2JlMSgpCisJCXVsdHJhX3Byb2JlX2lzYXBucCgpCisKKwkJdWx0cmFfb3BlbigpCQlUaGUgY2FyZC1zcGVjaWZpYyBkZXRhaWxzIG9mIHN0YXJ0aW5nLCBzdG9wcGluZworCQl1bHRyYV9yZXNldF84MzkwKCkJYW5kIHJlc2V0dGluZyB0aGUgODM5MCBOSUMgY29yZS4KKwkJdWx0cmFfY2xvc2UoKQorCisJCXVsdHJhX2Jsb2NrX2lucHV0KCkJCVJvdXRpbmVzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIGJsb2NrcyBvZgorCQl1bHRyYV9ibG9ja19vdXRwdXQoKQlwYWNrZXQgYnVmZmVyIG1lbW9yeS4KKwkJdWx0cmFfcGlvX2lucHV0KCkKKwkJdWx0cmFfcGlvX291dHB1dCgpCisKKwlUaGlzIGRyaXZlciBlbmFibGVzIHRoZSBzaGFyZWQgbWVtb3J5IG9ubHkgd2hlbiBkb2luZyB0aGUgYWN0dWFsIGRhdGEKKwl0cmFuc2ZlcnMgdG8gYXZvaWQgYSBidWcgaW4gZWFybHkgdmVyc2lvbiBvZiB0aGUgY2FyZCB0aGF0IGNvcnJ1cHRlZAorCWRhdGEgdHJhbnNmZXJyZWQgYnkgYSBBSEExNTQyLgorCisJVGhpcyBkcml2ZXIgbm93IHN1cHBvcnRzIHRoZSBwcm9ncmFtbWVkLUkvTyAoUElPKSBkYXRhIHRyYW5zZmVyIG1vZGUgb2YKKwl0aGUgRXRoZXJFWi4gSXQgZG9lcyBub3QgdXNlIHRoZSBub24tODM5MC1jb21wYXRpYmxlICJBbHRlZ28iIG1vZGUuCisJVGhhdCBzdXBwb3J0IChpZiBhdmFpbGFibGUpIGlzIGluIHNtYy1lei5jLgorCisJQ2hhbmdlbG9nOgorCisJUGF1bCBHb3J0bWFrZXIJOiBtdWx0aXBsZSBjYXJkIHN1cHBvcnQgZm9yIG1vZHVsZSB1c2Vycy4KKwlEb25hbGQgQmVja2VyCTogNC8xNy85NiBQSU8gc3VwcG9ydCwgbWlub3IgcG90ZW50aWFsIHByb2JsZW1zIGF2b2lkZWQuCisJRG9uYWxkIEJlY2tlcgk6IDYvNi85NiBjb3JyZWN0bHkgc2V0IGF1dG8td3JhcCBiaXQuCisJQWxleGFuZGVyIFNvdGlyb3YgOiAxLzIwLzAxIEFkZGVkIHN1cHBvcnQgZm9yIElTQVBuUCBjYXJkcworCisJTm90ZSBhYm91dCB0aGUgSVNBIFBuUCBzdXBwb3J0OgorCisJVGhpcyBkcml2ZXIgY2FuIG5vdCBhdXRvcHJvYmUgZm9yIG1vcmUgdGhhbiBvbmUgU01DIEV0aGVyRVogUG5QIGNhcmQuCisJWW91IGhhdmUgdG8gY29uZmlndXJlIHRoZSBzZWNvbmQgY2FyZCBtYW51YWxseSB0aHJvdWdoIHRoZSAvcHJvYy9pc2FwbnAKKwlpbnRlcmZhY2UgYW5kIHRoZW4gbG9hZCB0aGUgbW9kdWxlIHdpdGggYW4gZXhwbGljaXQgaW89MHhfX18gb3B0aW9uLgorKi8KKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKwkic21jLXVsdHJhLmM6djIuMDIgMi8zLzk4IERvbmFsZCBCZWNrZXIgKGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdilcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2FwbnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAiODM5MC5oIgorCisjZGVmaW5lIERSVl9OQU1FICJzbWMtdWx0cmEiCisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSS9PIGFkZHJlc3NlcyB0byBiZSBwcm9iZWQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHVsdHJhX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9Cit7MHgyMDAsIDB4MjIwLCAweDI0MCwgMHgyODAsIDB4MzAwLCAweDM0MCwgMHgzODAsIDB9OworCitzdGF0aWMgaW50IHVsdHJhX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKKworI2lmZGVmIF9fSVNBUE5QX18KK3N0YXRpYyBpbnQgdWx0cmFfcHJvYmVfaXNhcG5wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgdWx0cmFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHVsdHJhX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB1bHRyYV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCQkJCWludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgdWx0cmFfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgdWx0cmFfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIHVsdHJhX3Bpb19nZXRfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsCisJCQkJCQlpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIHVsdHJhX3Bpb19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCB1bHRyYV9waW9fb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSk7CitzdGF0aWMgaW50IHVsdHJhX2Nsb3NlX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNpZmRlZiBfX0lTQVBOUF9fCitzdGF0aWMgc3RydWN0IGlzYXBucF9kZXZpY2VfaWQgdWx0cmFfZGV2aWNlX2lkc1tdIF9faW5pdGRhdGEgPSB7CisgICAgICAgIHsgICAgICAgSVNBUE5QX1ZFTkRPUignUycsJ00nLCdDJyksIElTQVBOUF9GVU5DVElPTigweDg0MTYpLAorICAgICAgICAgICAgICAgIElTQVBOUF9WRU5ET1IoJ1MnLCdNJywnQycpLCBJU0FQTlBfRlVOQ1RJT04oMHg4NDE2KSwKKyAgICAgICAgICAgICAgICAobG9uZykgIlNNQyBFdGhlckVaICg4NDE2KSIgfSwKKyAgICAgICAgeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGlzYXBucCwgdWx0cmFfZGV2aWNlX2lkcyk7CisjZW5kaWYKKworDAorI2RlZmluZSBTVEFSVF9QRwkJMHgwMAkvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlciAqLworCisjZGVmaW5lIFVMVFJBX0NNRFJFRwkwCQkvKiBPZmZzZXQgdG8gQVNJQyBjb21tYW5kIHJlZ2lzdGVyLiAqLworI2RlZmluZQkgVUxUUkFfUkVTRVQJMHg4MAkvKiBCb2FyZCByZXNldCwgaW4gVUxUUkFfQ01EUkVHLiAqLworI2RlZmluZQkgVUxUUkFfTUVNRU5CCTB4NDAJLyogRW5hYmxlIHRoZSBzaGFyZWQgbWVtb3J5LiAqLworI2RlZmluZSBJT1BECTB4MDIJCQkvKiBJL08gUGlwZSBEYXRhICgxNiBiaXRzKSwgUElPIG9wZXJhdGlvbi4gKi8KKyNkZWZpbmUgSU9QQQkweDA3CQkJLyogSS9PIFBpcGUgQWRkcmVzcyBmb3IgUElPIG9wZXJhdGlvbi4gKi8KKyNkZWZpbmUgVUxUUkFfTklDX09GRlNFVCAgMTYJLyogTklDIHJlZ2lzdGVyIG9mZnNldCBmcm9tIHRoZSBiYXNlX2FkZHIuICovCisjZGVmaW5lIFVMVFJBX0lPX0VYVEVOVCAzMgorI2RlZmluZSBFTjBfRVJXQ05UCQkweDA4CS8qIEVhcmx5IHJlY2VpdmUgd2FybmluZyBjb3VudC4gKi8KKwwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgdWx0cmFfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwllaV9pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKy8qCVByb2JlIGZvciB0aGUgVWx0cmEuICBUaGlzIGxvb2tzIGxpa2UgYSA4MDEzIHdpdGggdGhlIHN0YXRpb24KKwlhZGRyZXNzIFBST00gYXQgSS9PIHBvcnRzIDxiYXNlPis4IHRvIDxiYXNlPisxMywgd2l0aCBhIGNoZWNrc3VtCisJZm9sbG93aW5nLgorKi8KKworc3RhdGljIGludCBfX2luaXQgZG9fdWx0cmFfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlpbnQgYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGlycSA9IGRldi0+aXJxOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9ICZ1bHRyYV9wb2xsOworI2VuZGlmCisJaWYgKGJhc2VfYWRkciA+IDB4MWZmKQkJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQlyZXR1cm4gdWx0cmFfcHJvYmUxKGRldiwgYmFzZV9hZGRyKTsKKwllbHNlIGlmIChiYXNlX2FkZHIgIT0gMCkJLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCQlyZXR1cm4gLUVOWElPOworCisjaWZkZWYgX19JU0FQTlBfXworCS8qIExvb2sgZm9yIGFueSBpbnN0YWxsZWQgSVNBUG5QIGNhcmRzICovCisJaWYgKGlzYXBucF9wcmVzZW50KCkgJiYgKHVsdHJhX3Byb2JlX2lzYXBucChkZXYpID09IDApKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgdWx0cmFfcG9ydGxpc3RbaV07IGkrKykgeworCQlkZXYtPmlycSA9IGlycTsKKwkJaWYgKHVsdHJhX3Byb2JlMShkZXYsIHVsdHJhX3BvcnRsaXN0W2ldKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIE5COiB1bHRyYV9jbG9zZV9jYXJkKCkgZG9lcyBmcmVlX2lycSAqLworI2lmZGVmIF9fSVNBUE5QX18KKwlzdHJ1Y3QgcG5wX2RldiAqaWRldiA9IChzdHJ1Y3QgcG5wX2RldiAqKWVpX3N0YXR1cy5wcml2OworCWlmIChpZGV2KQorCQlwbnBfZGV2aWNlX2RldGFjaChpZGV2KTsKKyNlbmRpZgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyIC0gVUxUUkFfTklDX09GRlNFVCwgVUxUUkFfSU9fRVhURU5UKTsKKwlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgdWx0cmFfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2VpX25ldGRldigpOworCWludCBlcnI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCWVyciA9IGRvX3VsdHJhX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCB1bHRyYV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlpbnQgaSwgcmV0dmFsOworCWludCBjaGVja3N1bSA9IDA7CisJY29uc3QgY2hhciAqbW9kZWxfbmFtZTsKKwl1bnNpZ25lZCBjaGFyIGVlcHJvbV9pcnEgPSAwOworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisJLyogVmFsdWVzIGZyb20gdmFyaW91cyBjb25maWcgcmVncy4gKi8KKwl1bnNpZ25lZCBjaGFyIG51bV9wYWdlcywgaXJxcmVnLCBhZGRyLCBwaW9tb2RlOworCXVuc2lnbmVkIGNoYXIgaWRyZWcgPSBpbmIoaW9hZGRyICsgNyk7CisJdW5zaWduZWQgY2hhciByZWc0ID0gaW5iKGlvYWRkciArIDQpICYgMHg3ZjsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBVTFRSQV9JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIENoZWNrIHRoZSBJRCBuaWJibGUuICovCisJaWYgKChpZHJlZyAmIDB4RjApICE9IDB4MjAgCQkJLyogU01DIFVsdHJhICovCisJCSYmIChpZHJlZyAmIDB4RjApICE9IDB4NDApIHsJCS8qIFNNQyBFdGhlckVaICovCisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFNlbGVjdCB0aGUgc3RhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIHNldC4gKi8KKwlvdXRiKHJlZzQsIGlvYWRkciArIDQpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJY2hlY2tzdW0gKz0gaW5iKGlvYWRkciArIDggKyBpKTsKKwlpZiAoKGNoZWNrc3VtICYgMHhmZikgIT0gMHhGRikgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZWlfZGVidWcgICYmICB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwltb2RlbF9uYW1lID0gKGlkcmVnICYgMHhGMCkgPT0gMHgyMCA/ICJTTUMgVWx0cmEiIDogIlNNQyBFdGhlckVaIjsKKworCXByaW50aygiJXM6ICVzIGF0ICUjM3gsIiwgZGV2LT5uYW1lLCBtb2RlbF9uYW1lLCBpb2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMlgiLCBkZXYtPmRldl9hZGRyW2ldID0gaW5iKGlvYWRkciArIDggKyBpKSk7CisKKwkvKiBTd2l0Y2ggZnJvbSB0aGUgc3RhdGlvbiBhZGRyZXNzIHRvIHRoZSBhbHRlcm5hdGUgcmVnaXN0ZXIgc2V0IGFuZAorCSAgIHJlYWQgdGhlIHVzZWZ1bCByZWdpc3RlcnMgdGhlcmUuICovCisJb3V0YigweDgwIHwgcmVnNCwgaW9hZGRyICsgNCk7CisKKwkvKiBFbmFibGVkIEZJTkUxNiBtb2RlIHRvIGF2b2lkIEJJT1MgUk9NIHdpZHRoIG1pc21hdGNoZXMgQCByZWJvb3QuICovCisJb3V0YigweDgwIHwgaW5iKGlvYWRkciArIDB4MGMpLCBpb2FkZHIgKyAweDBjKTsKKwlwaW9tb2RlID0gaW5iKGlvYWRkciArIDB4OCk7CisJYWRkciA9IGluYihpb2FkZHIgKyAweGIpOworCWlycXJlZyA9IGluYihpb2FkZHIgKyAweGQpOworCisJLyogU3dpdGNoIGJhY2sgdG8gdGhlIHN0YXRpb24gYWRkcmVzcyByZWdpc3RlciBzZXQgc28gdGhhdCB0aGUgTVMtRE9TIGRyaXZlcgorCSAgIGNhbiBmaW5kIHRoZSBjYXJkIGFmdGVyIGEgd2FybSBib290LiAqLworCW91dGIocmVnNCwgaW9hZGRyICsgNCk7CisKKwlpZiAoZGV2LT5pcnEgPCAyKSB7CisJCXVuc2lnbmVkIGNoYXIgaXJxbWFwW10gPSB7MCwgOSwgMywgNSwgNywgMTAsIDExLCAxNX07CisJCWludCBpcnE7CisKKwkJLyogVGhlIElSUSBiaXRzIGFyZSBzcGxpdC4gKi8KKwkJaXJxID0gaXJxbWFwWygoaXJxcmVnICYgMHg0MCkgPj4gNCkgKyAoKGlycXJlZyAmIDB4MGMpID4+IDIpXTsKKworCQlpZiAoaXJxID09IDApIHsKKwkJCXByaW50aygiLCBmYWlsZWQgdG8gZGV0ZWN0IElSUSBsaW5lLlxuIik7CisJCQlyZXR2YWwgPSAgLUVBR0FJTjsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRldi0+aXJxID0gaXJxOworCQllZXByb21faXJxID0gMTsKKwl9CisKKwkvKiBUaGUgODM5MCBpc24ndCBhdCB0aGUgYmFzZSBhZGRyZXNzLCBzbyBmYWtlIHRoZSBvZmZzZXQgKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcitVTFRSQV9OSUNfT0ZGU0VUOworCisJeworCQlpbnQgYWRkcl90YmxbNF0gPSB7MHgwQzAwMDAsIDB4MEUwMDAwLCAweEZDMDAwMCwgMHhGRTAwMDB9OworCQlzaG9ydCBudW1fcGFnZXNfdGJsWzRdID0gezB4MjAsIDB4NDAsIDB4ODAsIDB4ZmZ9OworCisJCWRldi0+bWVtX3N0YXJ0ID0gKChhZGRyICYgMHgwZikgPDwgMTMpICsgYWRkcl90YmxbKGFkZHIgPj4gNikgJiAzXSA7CisJCW51bV9wYWdlcyA9IG51bV9wYWdlc190YmxbKGFkZHIgPj4gNCkgJiAzXTsKKwl9CisKKwllaV9zdGF0dXMubmFtZSA9IG1vZGVsX25hbWU7CisJZWlfc3RhdHVzLndvcmQxNiA9IDE7CisJZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBTVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IFNUQVJUX1BHICsgVFhfUEFHRVM7CisJZWlfc3RhdHVzLnN0b3BfcGFnZSA9IG51bV9wYWdlczsKKworCWVpX3N0YXR1cy5tZW0gPSBpb3JlbWFwKGRldi0+bWVtX3N0YXJ0LCAoZWlfc3RhdHVzLnN0b3BfcGFnZSAtIFNUQVJUX1BHKSoyNTYpOworCWlmICghZWlfc3RhdHVzLm1lbSkgeworCQlwcmludGsoIiwgZmFpbGVkIHRvIGlvcmVtYXAuXG4iKTsKKwkJcmV0dmFsID0gIC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgKGVpX3N0YXR1cy5zdG9wX3BhZ2UgLSBTVEFSVF9QRykqMjU2OworCisJaWYgKHBpb21vZGUpIHsKKwkJcHJpbnRrKCIsJXMgSVJRICVkIHByb2dyYW1tZWQtSS9PIG1vZGUuXG4iLAorCQkJICAgZWVwcm9tX2lycSA/ICJFRVBST00iIDogImFzc2lnbmVkICIsIGRldi0+aXJxKTsKKwkJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJnVsdHJhX3Bpb19pbnB1dDsKKwkJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZ1bHRyYV9waW9fb3V0cHV0OworCQllaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJnVsdHJhX3Bpb19nZXRfaGRyOworCX0gZWxzZSB7CisJCXByaW50aygiLCVzIElSUSAlZCBtZW1vcnkgJSNseC0lI2x4LlxuIiwgZWVwcm9tX2lycSA/ICIiIDogImFzc2lnbmVkICIsCisJCQkgICBkZXYtPmlycSwgZGV2LT5tZW1fc3RhcnQsIGRldi0+bWVtX2VuZC0xKTsKKwkJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJnVsdHJhX2Jsb2NrX2lucHV0OworCQllaV9zdGF0dXMuYmxvY2tfb3V0cHV0ID0gJnVsdHJhX2Jsb2NrX291dHB1dDsKKwkJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZ1bHRyYV9nZXRfODM5MF9oZHI7CisJfQorCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJnVsdHJhX3Jlc2V0XzgzOTA7CisJZGV2LT5vcGVuID0gJnVsdHJhX29wZW47CisJZGV2LT5zdG9wID0gJnVsdHJhX2Nsb3NlX2NhcmQ7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKwlOUzgzOTBfaW5pdChkZXYsIDApOworCisJcmV0dXJuIDA7CitvdXQ6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBVTFRSQV9JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBfX0lTQVBOUF9fCitzdGF0aWMgaW50IF9faW5pdCB1bHRyYV9wcm9iZV9pc2FwbnAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgdWx0cmFfZGV2aWNlX2lkc1tpXS52ZW5kb3IgIT0gMDsgaSsrKSB7CisJCXN0cnVjdCBwbnBfZGV2ICppZGV2ID0gTlVMTDsKKworICAgICAgICAgICAgICAgIHdoaWxlICgoaWRldiA9IHBucF9maW5kX2RldihOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bHRyYV9kZXZpY2VfaWRzW2ldLnZlbmRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWx0cmFfZGV2aWNlX2lkc1tpXS5mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRldikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdm9pZCBhbHJlYWR5IGZvdW5kIGNhcmRzIGZyb20gcHJldmlvdXMgY2FsbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbnBfZGV2aWNlX2F0dGFjaChpZGV2KSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAJY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG5wX2FjdGl2YXRlX2RldihpZGV2KSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYWdhaW46CisgICAgICAgICAgICAgICAgICAgICAgICAJcG5wX2RldmljZV9kZXRhY2goaWRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAJY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkvKiBpZiBubyBpbyBhbmQgaXJxLCBzZWFyY2ggZm9yIG5leHQgKi8KKwkJCWlmICghcG5wX3BvcnRfdmFsaWQoaWRldiwgMCkgfHwgIXBucF9pcnFfdmFsaWQoaWRldiwgMCkpCisJCQkJZ290byBfX2FnYWluOworICAgICAgICAgICAgICAgICAgICAgICAgLyogZm91bmQgaXQgKi8KKwkJCWRldi0+YmFzZV9hZGRyID0gcG5wX3BvcnRfc3RhcnQoaWRldiwgMCk7CisJCQlkZXYtPmlycSA9IHBucF9pcnEoaWRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJzbWMtdWx0cmEuYzogSVNBUG5QIHJlcG9ydHMgJXMgYXQgaS9vICUjbHgsIGlycSAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIHVsdHJhX2RldmljZV9pZHNbaV0uZHJpdmVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodWx0cmFfcHJvYmUxKGRldiwgZGV2LT5iYXNlX2FkZHIpICE9IDApIHsgICAgICAvKiBTaG91bGRuJ3QgaGFwcGVuLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInNtYy11bHRyYS5jOiBQcm9iZSBvZiBJU0FQblAgY2FyZCBhdCAlI2x4IGZhaWxlZC5cbiIsIGRldi0+YmFzZV9hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5wX2RldmljZV9kZXRhY2goaWRldik7CisJCQkJcmV0dXJuIC1FTlhJTzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVpX3N0YXR1cy5wcml2ID0gKHVuc2lnbmVkIGxvbmcpaWRldjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWlkZXYpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAtRU5PREVWOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3VsdHJhX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0dmFsOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQ7IC8qIEFTSUMgYWRkciAqLworCXVuc2lnbmVkIGNoYXIgaXJxMnJlZ1tdID0gezAsIDAsIDB4MDQsIDB4MDgsIDAsIDB4MEMsIDAsIDB4NDAsCisJCQkJICAgMCwgMHgwNCwgMHg0NCwgMHg0OCwgMCwgMCwgMCwgMHg0QywgfTsKKworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJb3V0YigweDAwLCBpb2FkZHIpOwkvKiBEaXNhYmxlIHNoYXJlZCBtZW1vcnkgZm9yIHNhZmV0eS4gKi8KKwlvdXRiKDB4ODAsIGlvYWRkciArIDUpOworCS8qIFNldCB0aGUgSVJRIGxpbmUuICovCisJb3V0YihpbmIoaW9hZGRyICsgNCkgfCAweDgwLCBpb2FkZHIgKyA0KTsKKwlvdXRiKChpbmIoaW9hZGRyICsgMTMpICYgfjB4NEMpIHwgaXJxMnJlZ1tkZXYtPmlycV0sIGlvYWRkciArIDEzKTsKKwlvdXRiKGluYihpb2FkZHIgKyA0KSAmIDB4N2YsIGlvYWRkciArIDQpOworCisJaWYgKGVpX3N0YXR1cy5ibG9ja19pbnB1dCA9PSAmdWx0cmFfcGlvX2lucHV0KSB7CisJCW91dGIoMHgxMSwgaW9hZGRyICsgNik7CQkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgUElPLiAqLworCQlvdXRiKDB4MDEsIGlvYWRkciArIDB4MTkpOyAgCS8qIEVuYWJsZSByaW5nIHJlYWQgYXV0by13cmFwLiAqLworCX0gZWxzZQorCQlvdXRiKDB4MDEsIGlvYWRkciArIDYpOwkJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIG1lbW9yeS4gKi8KKwkvKiBTZXQgdGhlIGVhcmx5IHJlY2VpdmUgd2FybmluZyBsZXZlbCBpbiB3aW5kb3cgMCBoaWdoIGVub3VnaCBub3QKKwkgICB0byByZWNlaXZlIEVSVyBpbnRlcnJ1cHRzLiAqLworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCwgZGV2LT5iYXNlX2FkZHIpOworCW91dGIoMHhmZiwgZGV2LT5iYXNlX2FkZHIgKyBFTjBfRVJXQ05UKTsKKwllaV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit1bHRyYV9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGNtZF9wb3J0ID0gZGV2LT5iYXNlX2FkZHIgLSBVTFRSQV9OSUNfT0ZGU0VUOyAvKiBBU0lDIGJhc2UgYWRkciAqLworCisJb3V0YihVTFRSQV9SRVNFVCwgY21kX3BvcnQpOworCWlmIChlaV9kZWJ1ZyA+IDEpIHByaW50aygicmVzZXR0aW5nIFVsdHJhLCB0PSVsZC4uLiIsIGppZmZpZXMpOworCWVpX3N0YXR1cy50eGluZyA9IDA7CisKKwlvdXRiKDB4MDAsIGNtZF9wb3J0KTsJLyogRGlzYWJsZSBzaGFyZWQgbWVtb3J5IGZvciBzYWZldHkuICovCisJb3V0YigweDgwLCBjbWRfcG9ydCArIDUpOworCWlmIChlaV9zdGF0dXMuYmxvY2tfaW5wdXQgPT0gJnVsdHJhX3Bpb19pbnB1dCkKKwkJb3V0YigweDExLCBjbWRfcG9ydCArIDYpOwkJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIFBJTy4gKi8KKwllbHNlCisJCW91dGIoMHgwMSwgY21kX3BvcnQgKyA2KTsJCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBtZW1vcnkuICovCisKKwlpZiAoZWlfZGVidWcgPiAxKSBwcmludGsoInJlc2V0IGRvbmVcbiIpOworCXJldHVybjsKK30KKworLyogR3JhYiB0aGUgODM5MCBzcGVjaWZpYyBoZWFkZXIuIFNpbWlsYXIgdG8gdGhlIGJsb2NrX2lucHV0IHJvdXRpbmUsIGJ1dAorICAgd2UgZG9uJ3QgbmVlZCB0byBiZSBjb25jZXJuZWQgd2l0aCByaW5nIHdyYXAgYXMgdGhlIGhlYWRlciB3aWxsIGJlIGF0CisgICB0aGUgc3RhcnQgb2YgYSBwYWdlLCBzbyB3ZSBvcHRpbWl6ZSBhY2NvcmRpbmdseS4gKi8KKworc3RhdGljIHZvaWQKK3VsdHJhX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCXZvaWQgX19pb21lbSAqaGRyX3N0YXJ0ID0gZWlfc3RhdHVzLm1lbSArICgocmluZ19wYWdlIC0gU1RBUlRfUEcpPDw4KTsKKworCW91dGIoVUxUUkFfTUVNRU5CLCBkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQpOwkvKiBzaG1lbSBvbiAqLworI2lmZGVmIF9fQklHX0VORElBTgorCS8qIE9mZmljaWFsbHkgdGhpcyBpcyB3aGF0IHdlIGFyZSBkb2luZywgYnV0IHRoZSByZWFkbCgpIGlzIGZhc3RlciAqLworCS8qIHVuZm9ydHVuYXRlbHkgaXQgaXNuJ3QgZW5kaWFuIGF3YXJlIG9mIHRoZSBzdHJ1Y3QgICAgICAgICAgICAgICAqLworCW1lbWNweV9mcm9taW8oaGRyLCBoZHJfc3RhcnQsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworCWhkci0+Y291bnQgPSBsZTE2X3RvX2NwdShoZHItPmNvdW50KTsKKyNlbHNlCisJKCh1bnNpZ25lZCBpbnQqKWhkcilbMF0gPSByZWFkbChoZHJfc3RhcnQpOworI2VuZGlmCisJb3V0YigweDAwLCBkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQpOyAvKiBzaG1lbSBvZmYgKi8KK30KKworLyogQmxvY2sgaW5wdXQgYW5kIG91dHB1dCBhcmUgZWFzeSBvbiBzaGFyZWQgbWVtb3J5IGV0aGVyY2FyZHMsIHRoZSBvbmx5CisgICBjb21wbGljYXRpb24gaXMgd2hlbiB0aGUgcmluZyBidWZmZXIgd3JhcHMuICovCisKK3N0YXRpYyB2b2lkCit1bHRyYV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKwl2b2lkIF9faW9tZW0gKnhmZXJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgcmluZ19vZmZzZXQgLSAoU1RBUlRfUEc8PDgpOworCisJLyogRW5hYmxlIHNoYXJlZCBtZW1vcnkuICovCisJb3V0YihVTFRSQV9NRU1FTkIsIGRldi0+YmFzZV9hZGRyIC0gVUxUUkFfTklDX09GRlNFVCk7CisKKwlpZiAocmluZ19vZmZzZXQgKyBjb3VudCA+IGVpX3N0YXR1cy5zdG9wX3BhZ2UqMjU2KSB7CisJCS8qIFdlIG11c3Qgd3JhcCB0aGUgaW5wdXQgbW92ZS4gKi8KKwkJaW50IHNlbWlfY291bnQgPSBlaV9zdGF0dXMuc3RvcF9wYWdlKjI1NiAtIHJpbmdfb2Zmc2V0OworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgeGZlcl9zdGFydCwgc2VtaV9jb3VudCk7CisJCWNvdW50IC09IHNlbWlfY291bnQ7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgc2VtaV9jb3VudCwgZWlfc3RhdHVzLm1lbSArIFRYX1BBR0VTICogMjU2LCBjb3VudCk7CisJfSBlbHNlIHsKKwkJLyogUGFja2V0IGlzIGluIG9uZSBjaHVuayAtLSB3ZSBjYW4gY29weSArIGNrc3VtLiAqLworCQlldGhfaW9fY29weV9hbmRfc3VtKHNrYiwgeGZlcl9zdGFydCwgY291bnQsIDApOworCX0KKworCW91dGIoMHgwMCwgZGV2LT5iYXNlX2FkZHIgLSBVTFRSQV9OSUNfT0ZGU0VUKTsJLyogRGlzYWJsZSBtZW1vcnkuICovCit9CisKK3N0YXRpYyB2b2lkCit1bHRyYV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJaW50IHN0YXJ0X3BhZ2UpCit7CisJdm9pZCBfX2lvbWVtICpzaG1lbSA9IGVpX3N0YXR1cy5tZW0gKyAoKHN0YXJ0X3BhZ2UgLSBTVEFSVF9QRyk8PDgpOworCisJLyogRW5hYmxlIHNoYXJlZCBtZW1vcnkuICovCisJb3V0YihVTFRSQV9NRU1FTkIsIGRldi0+YmFzZV9hZGRyIC0gVUxUUkFfTklDX09GRlNFVCk7CisKKwltZW1jcHlfdG9pbyhzaG1lbSwgYnVmLCBjb3VudCk7CisKKwlvdXRiKDB4MDAsIGRldi0+YmFzZV9hZGRyIC0gVUxUUkFfTklDX09GRlNFVCk7IC8qIERpc2FibGUgbWVtb3J5LiAqLworfQorCisvKiBUaGUgaWRlbnRpY2FsIG9wZXJhdGlvbnMgZm9yIHByb2dyYW1tZWQgSS9PIGNhcmRzLgorICAgVGhlIFBJTyBtb2RlbCBpcyB0cml2aWFsIHRvIHVzZTogdGhlIDE2IGJpdCBzdGFydCBhZGRyZXNzIGlzIHdyaXR0ZW4KKyAgIGJ5dGUtc2VxdWVudGlhbGx5IHRvIElPUEEsIHdpdGggbm8gaW50ZXJ2ZW5pbmcgSS9PIG9wZXJhdGlvbnMsIGFuZCB0aGUKKyAgIGRhdGEgaXMgcmVhZCBvciB3cml0dGVuIHRvIHRoZSBJT1BEIGRhdGEgcG9ydC4KKyAgIFRoZSBvbmx5IHBvdGVudGlhbCBjb21wbGljYXRpb24gaXMgdGhhdCB0aGUgYWRkcmVzcyByZWdpc3RlciBpcyBzaGFyZWQKKyAgIGFuZCBtdXN0IGJlIGFsd2F5cyBiZSByZXdyaXR0ZW4gYmV0d2VlbiBlYWNoIHJlYWQvd3JpdGUgZGlyZWN0aW9uIGNoYW5nZS4KKyAgIFRoaXMgaXMgbm8gcHJvYmxlbSBmb3IgdXMsIGFzIHRoZSA4MzkwIGNvZGUgZW5zdXJlcyB0aGF0IHdlIGFyZSBzaW5nbGUKKyAgIHRocmVhZGVkLiAqLworc3RhdGljIHZvaWQgdWx0cmFfcGlvX2dldF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCQkJCWludCByaW5nX3BhZ2UpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyIC0gVUxUUkFfTklDX09GRlNFVDsgLyogQVNJQyBhZGRyICovCisJb3V0YigweDAwLCBpb2FkZHIgKyBJT1BBKTsJLyogU2V0IHRoZSBhZGRyZXNzLCBMU0IgZmlyc3QuICovCisJb3V0YihyaW5nX3BhZ2UsIGlvYWRkciArIElPUEEpOworCWluc3coaW9hZGRyICsgSU9QRCwgaGRyLCBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpPj4xKTsKK30KKworc3RhdGljIHZvaWQgdWx0cmFfcGlvX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQ7IC8qIEFTSUMgYWRkciAqLworICAgIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKworCS8qIEZvciBub3cgc2V0IHRoZSBhZGRyZXNzIGFnYWluLCBhbHRob3VnaCBpdCBzaG91bGQgYWxyZWFkeSBiZSBjb3JyZWN0LiAqLworCW91dGIocmluZ19vZmZzZXQsIGlvYWRkciArIElPUEEpOwkvKiBTZXQgdGhlIGFkZHJlc3MsIExTQiBmaXJzdC4gKi8KKwlvdXRiKHJpbmdfb2Zmc2V0ID4+IDgsIGlvYWRkciArIElPUEEpOworCS8qIFdlIGtub3cgc2tidWZmcyBhcmUgcGFkZGVkIHRvIGF0IGxlYXN0IHdvcmQgYWxpZ25tZW50LiAqLworCWluc3coaW9hZGRyICsgSU9QRCwgYnVmLCAoY291bnQrMSk+PjEpOworfQorCitzdGF0aWMgdm9pZCB1bHRyYV9waW9fb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQ7IC8qIEFTSUMgYWRkciAqLworCW91dGIoMHgwMCwgaW9hZGRyICsgSU9QQSk7CS8qIFNldCB0aGUgYWRkcmVzcywgTFNCIGZpcnN0LiAqLworCW91dGIoc3RhcnRfcGFnZSwgaW9hZGRyICsgSU9QQSk7CisJLyogQW4gZXh0cmEgb2RkIGJ5dGUgaXMgT0sgaGVyZSBhcyB3ZWxsLiAqLworCW91dHN3KGlvYWRkciArIElPUEQsIGJ1ZiwgKGNvdW50KzEpPj4xKTsKK30KKworc3RhdGljIGludAordWx0cmFfY2xvc2VfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQ7IC8qIENNRFJFRyAqLworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKCIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOworCisJb3V0YigweDAwLCBpb2FkZHIgKyA2KTsJCS8qIERpc2FibGUgaW50ZXJydXB0cy4gKi8KKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCU5TODM5MF9pbml0KGRldiwgMCk7CisKKwkvKiBXZSBzaG91bGQgc29tZWRheSBkaXNhYmxlIHNoYXJlZCBtZW1vcnkgYW5kIGNoYW5nZSB0byA4LWJpdCBtb2RlCisJICAgImp1c3QgaW4gY2FzZSIuLi4gKi8KKworCXJldHVybiAwOworfQorCisMCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIE1BWF9VTFRSQV9DQVJEUwk0CS8qIE1heCBudW1iZXIgb2YgVWx0cmEgY2FyZHMgcGVyIG1vZHVsZSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfdWx0cmFbTUFYX1VMVFJBX0NBUkRTXTsKK3N0YXRpYyBpbnQgaW9bTUFYX1VMVFJBX0NBUkRTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF9VTFRSQV9DQVJEU107CisKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGJhc2UgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIG51bWJlcihzKSAoYXNzaWduZWQpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNNQyBVbHRyYS9FdGhlckVaIElTQS9QblAgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFRoaXMgaXMgc2V0IHVwIHNvIHRoYXQgb25seSBhIHNpbmdsZSBhdXRvcHJvYmUgdGFrZXMgcGxhY2UgcGVyIGNhbGwuCitJU0EgZGV2aWNlIGF1dG9wcm9iZXMgb24gYSBydW5uaW5nIG1hY2hpbmUgYXJlIG5vdCByZWNvbW1lbmRlZC4gKi8KK2ludAoraW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX1VMVFJBX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCWlmIChpb1t0aGlzX2Rldl0gPT0gMCkgIHsKKwkJCWlmICh0aGlzX2RldiAhPSAwKSBicmVhazsgLyogb25seSBhdXRvcHJvYmUgMXN0IG9uZSAqLworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJzbWMtdWx0cmEuYzogUHJlc2VudGx5IGF1dG9wcm9iaW5nIChub3QgcmVjb21tZW5kZWQpIGZvciBhIHNpbmdsZSBjYXJkLlxuIik7CisJCX0KKwkJZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CisJCWlmIChkb191bHRyYV9wcm9iZShkZXYpID09IDApIHsKKwkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7CisJCQkJZGV2X3VsdHJhW2ZvdW5kKytdID0gZGV2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY2xlYW51cF9jYXJkKGRldik7CisJCX0KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic21jLXVsdHJhLmM6IE5vIFNNQyBVbHRyYSBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsIGlvW3RoaXNfZGV2XSk7CisJCWJyZWFrOworCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiAtRU5YSU87Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX1VMVFJBX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfdWx0cmFbdGhpc19kZXZdOworCQlpZiAoZGV2KSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorfQorI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jLXVsdHJhMzIuYyBiL2RyaXZlcnMvbmV0L3NtYy11bHRyYTMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlMzk3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NtYy11bHRyYTMyLmMKQEAgLTAsMCArMSw0NTQgQEAKKy8qIAlzbWMtdWx0cmEzMi5jOiBBbiBTTUMgVWx0cmEzMiBFSVNBIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguCisKK1NvdXJjZXM6CisKKwlUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiAoY2xvbmVkIGZyb20pIHRoZSBJU0EgU01DIFVsdHJhIGRyaXZlcgorCXdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlci4gTW9kaWZpY2F0aW9ucyB0byBzdXBwb3J0IHRoZSBFSVNBCisJdmVyc2lvbiBvZiB0aGUgY2FyZCBieSBQYXVsIEdvcnRtYWtlciBhbmQgTGVvbmFyZCBOLiBadWJrb2ZmLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKK1RoZW9yeSBvZiBPcGVyYXRpb246CisKKwlUaGUgU01DIFVsdHJhMzJDIGNhcmQgdXNlcyB0aGUgU01DIDgzYzc5MCBjaGlwIHdoaWNoIGlzIGFsc28KKwlmb3VuZCBvbiB0aGUgSVNBIFNNQyBVbHRyYSBjYXJkcy4gSXQgaGFzIGEgc2hhcmVkIG1lbW9yeSBtb2RlIG9mCisJb3BlcmF0aW9uIHRoYXQgbWFrZXMgaXQgc2ltaWxhciB0byB0aGUgSVNBIHZlcnNpb24gb2YgdGhlIGNhcmQuCisJVGhlIG1haW4gZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBFSVNBIGNhcmQgaGFzIDMyS0Igb2YgUkFNLCBidXQKKwlvbmx5IGFuIDhLQiB3aW5kb3cgaW50byB0aGF0IG1lbW9yeS4gVGhlIEVJU0EgY2FyZCBhbHNvIGNhbiBiZQorCXNldCBmb3IgYSBidXMtbWFzdGVyaW5nIG1vZGUgb2Ygb3BlcmF0aW9uIHZpYSB0aGUgRUNVLCBidXQgdGhhdAorCWlzIG5vdCAoYW5kIHByb2JhYmx5IHdpbGwgbmV2ZXIgYmUpIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKwlUaGUgRUNVIHNob3VsZCBiZSBydW4gdG8gZW5hYmxlIHNoYXJlZCBtZW1vcnkgYW5kIHRvIGRpc2FibGUgdGhlCisJYnVzLW1hc3RlcmluZyBmZWF0dXJlIGZvciB1c2Ugd2l0aCBsaW51eC4KKworCUJ5IHByb2dyYW1taW5nIHRoZSA4MzkwIHRvIHVzZSBvbmx5IDhLQiBSQU0sIHRoZSBtb2RpZmljYXRpb25zCisJdG8gdGhlIElTQSBkcml2ZXIgY2FuIGJlIGxpbWl0ZWQgdG8gdGhlIHByb2JlIGFuZCBpbml0aWFsaXphdGlvbgorCWNvZGUuIFRoaXMgYWxsb3dzIGVhc3kgaW50ZWdyYXRpb24gb2YgRUlTQSBzdXBwb3J0IGludG8gdGhlIElTQQorCWRyaXZlci4gSG93ZXZlciwgdGhlIGRyaXZlciBkZXZlbG9wbWVudCBraXQgZnJvbSBTTUMgcHJvdmlkZWQgdGhlCisJcmVnaXN0ZXIgaW5mb3JtYXRpb24gZm9yIHNsaWRpbmcgdGhlIDhLQiB3aW5kb3csIGFuZCBoZW5jZSB0aGUgODM5MAorCWlzIHByb2dyYW1tZWQgdG8gdXNlIHRoZSBmdWxsIDMyS0IgUkFNLgorCisJVW5mb3J0dW5hdGVseSB0aGlzIHJlcXVpcmVkIGNvZGUgY2hhbmdlcyBvdXRzaWRlIHRoZSBwcm9iZS9pbml0CisJcm91dGluZXMsIGFuZCB0aHVzIHdlIGRlY2lkZWQgdG8gc2VwYXJhdGUgdGhlIEVJU0EgZHJpdmVyIGZyb20KKwl0aGUgSVNBIG9uZS4gSW4gdGhpcyB3YXksIElTQSB1c2VycyBkb24ndCBlbmQgdXAgd2l0aCBhIGxhcmdlcgorCWRyaXZlciBkdWUgdG8gdGhlIEVJU0EgY29kZSwgYW5kIEVJU0EgdXNlcnMgZG9uJ3QgZW5kIHVwIHdpdGggYQorCWxhcmdlciBkcml2ZXIgZHVlIHRvIHRoZSBJU0EgRXRoZXJFWiBQSU8gY29kZS4gVGhlIGRyaXZlciBpcworCXNpbWlsYXIgdG8gdGhlIDNjNTAzLzE2IGRyaXZlciwgaW4gdGhhdCB0aGUgd2luZG93IG11c3QgYmUgc2V0CisJYmFjayB0byB0aGUgMXN0IDhLQiBvZiBzcGFjZSBmb3IgYWNjZXNzIHRvIHRoZSB0d28gODM5MCBUeCBzbG90cy4KKworCUluIHRlc3RpbmcsIHVzaW5nIG9ubHkgOEtCIFJBTSAoMyBUeCAvIDUgUngpIGRpZG4ndCBhcHBlYXIgdG8KKwliZSBhIGxpbWl0aW5nIGZhY3Rvciwgc2luY2UgdGhlIEVJU0EgYnVzIGNvdWxkIGdldCBwYWNrZXRzIG9mZgorCXRoZSBjYXJkIGZhc3QgZW5vdWdoLCBidXQgaGF2aW5nIHRoZSB1c2Ugb2YgbG90cyBvZiBSQU0gYXMgUngKKwlzcGFjZSBpcyBleHRyYSBpbnN1cmFuY2UgaWYgaW50ZXJydXB0IGxhdGVuY2llcyBiZWNvbWUgZXhjZXNzaXZlLgorCisqLworCitzdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbiA9ICJzbWMtdWx0cmEzMi5jOiAwNi85NyB2MS4wMFxuIjsKKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZWlzYS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgInNtYy11bHRyYTMyIgorCitzdGF0aWMgaW50IHVsdHJhMzJfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworc3RhdGljIGludCB1bHRyYTMyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB1bHRyYTMyX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB1bHRyYTMyX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJCSBpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIHVsdHJhMzJfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCXN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCB1bHRyYTMyX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQkgY29uc3QgaW50IHN0YXJ0X3BhZ2UpOworc3RhdGljIGludCB1bHRyYTMyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworDAorI2RlZmluZSBVTFRSQTMyX0NNRFJFRwkwCS8qIE9mZnNldCB0byBBU0lDIGNvbW1hbmQgcmVnaXN0ZXIuICovCisjZGVmaW5lCSBVTFRSQTMyX1JFU0VUCTB4ODAJLyogQm9hcmQgcmVzZXQsIGluIFVMVFJBMzJfQ01EUkVHLiAqLworI2RlZmluZQkgVUxUUkEzMl9NRU1FTkIJMHg0MAkvKiBFbmFibGUgdGhlIHNoYXJlZCBtZW1vcnkuICovCisjZGVmaW5lIFVMVFJBMzJfTklDX09GRlNFVCAxNgkvKiBOSUMgcmVnaXN0ZXIgb2Zmc2V0IGZyb20gdGhlIGJhc2VfYWRkci4gKi8KKyNkZWZpbmUgVUxUUkEzMl9JT19FWFRFTlQgMzIKKyNkZWZpbmUgRU4wX0VSV0NOVAkJMHgwOAkvKiBFYXJseSByZWNlaXZlIHdhcm5pbmcgY291bnQuICovCisKKy8qCisgKiBEZWZpbmVzIHRoYXQgYXBwbHkgb25seSB0byB0aGUgVWx0cmEzMiBFSVNBIGNhcmQuIE5vdGUgdGhhdAorICogInNtYyIgPSAxMDAxMSAwMTEwMSAwMDAxMSA9IDB4NGRhMywgYW5kIGhlbmNlICFzbWM4MDEwLmNmZyB0cmFuc2xhdGVzCisgKiBpbnRvIGFuIEVJU0EgSUQgb2YgMHgxMDgwQTM0RAorICovCisjZGVmaW5lIFVMVFJBMzJfQkFTRQkweGNhMAorI2RlZmluZSBVTFRSQTMyX0lECTB4MTA4MGEzNGQKKyNkZWZpbmUgVUxUUkEzMl9JRFBPUlQJKC0weDIwKQkvKiAweGM4MCAqLworLyogQ29uZmlnIHJlZ3MgMS0+NyBmcm9tIHRoZSBFSVNBICFTTUM4MDEwLkNGRyBmaWxlLiAqLworI2RlZmluZSBVTFRSQTMyX0NGRzEJMHgwNAkvKiAweGNhNCAqLworI2RlZmluZSBVTFRSQTMyX0NGRzIJMHgwNQkvKiAweGNhNSAqLworI2RlZmluZSBVTFRSQTMyX0NGRzMJKC0weDE4KQkvKiAweGM4OCAqLworI2RlZmluZSBVTFRSQTMyX0NGRzQJKC0weDE3KQkvKiAweGM4OSAqLworI2RlZmluZSBVTFRSQTMyX0NGRzUJKC0weDE2KQkvKiAweGM4YSAqLworI2RlZmluZSBVTFRSQTMyX0NGRzYJKC0weDE1KQkvKiAweGM4YiAqLworI2RlZmluZSBVTFRSQTMyX0NGRzcJMHgwZAkvKiAweGNhZCAqLworCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBVTFRSQTMyX05JQ19PRkZTRVQ7CisJLyogTkI6IHVsdHJhMzJfY2xvc2VfY2FyZCgpIGRvZXMgZnJlZV9pcnEgKi8KKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIFVMVFJBMzJfSU9fRVhURU5UKTsKKwlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOworfQorCisvKglQcm9iZSBmb3IgdGhlIFVsdHJhMzIuICBUaGlzIGxvb2tzIGxpa2UgYSA4MDEzIHdpdGggdGhlIHN0YXRpb24KKwlhZGRyZXNzIFBST00gYXQgSS9PIHBvcnRzIDxiYXNlPis4IHRvIDxiYXNlPisxMywgd2l0aCBhIGNoZWNrc3VtCisJZm9sbG93aW5nLgorKi8KKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgdWx0cmEzMl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBiYXNlOworCWludCBpcnE7CisJaW50IGVyciA9IC1FTk9ERVY7CisKKwlpZiAoIUVJU0FfYnVzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCWRldiA9IGFsbG9jX2VpX25ldGRldigpOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaXJxID0gZGV2LT5pcnE7CisKKwkvKiBFSVNBIHNwZWMgYWxsb3dzIGZvciB1cCB0byAxNiBzbG90cywgYnV0IDggaXMgdHlwaWNhbC4gKi8KKwlmb3IgKGJhc2UgPSAweDEwMDAgKyBVTFRSQTMyX0JBU0U7IGJhc2UgPCAweDkwMDA7IGJhc2UgKz0gMHgxMDAwKSB7CisJCWlmICh1bHRyYTMyX3Byb2JlMShkZXYsIGJhc2UpID09IDApCisJCQlicmVhazsKKwkJZGV2LT5pcnEgPSBpcnE7CisJfQorCWlmIChiYXNlID49IDB4OTAwMCkKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdWx0cmEzMl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlpbnQgaSwgZWRnZSwgbWVkaWEsIHJldHZhbDsKKwlpbnQgY2hlY2tzdW0gPSAwOworCWNvbnN0IGNoYXIgKm1vZGVsX25hbWU7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKwkvKiBWYWx1ZXMgZnJvbSB2YXJpb3VzIGNvbmZpZyByZWdzLiAqLworCXVuc2lnbmVkIGNoYXIgaWRyZWc7CisJdW5zaWduZWQgY2hhciByZWc0OworCWNvbnN0IGNoYXIgKmlmbWFwW10gPSB7IlVUUCBObyBMaW5rIiwgIiIsICJVVFAvQVVJIiwgIlVUUC9CTkMifTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBVTFRSQTMyX0lPX0VYVEVOVCwgRFJWX05BTUUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKGluYihpb2FkZHIgKyBVTFRSQTMyX0lEUE9SVCkgPT0gMHhmZiB8fAorCSAgICBpbmwoaW9hZGRyICsgVUxUUkEzMl9JRFBPUlQpICE9IFVMVFJBMzJfSUQpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJbWVkaWEgPSBpbmIoaW9hZGRyICsgVUxUUkEzMl9DRkc3KSAmIDB4MDM7CisJZWRnZSA9IGluYihpb2FkZHIgKyBVTFRSQTMyX0NGRzUpICYgMHgwODsKKwlwcmludGsoIlNNQyBVbHRyYTMyIGluIEVJU0EgU2xvdCAlZCwgTWVkaWE6ICVzLCAlcyBJUlFzLlxuIiwKKwkJaW9hZGRyID4+IDEyLCBpZm1hcFttZWRpYV0sCisJCShlZGdlID8gIkVkZ2UgVHJpZ2dlcmVkIiA6ICJMZXZlbCBTZW5zaXRpdmUiKSk7CisKKwlpZHJlZyA9IGluYihpb2FkZHIgKyA3KTsKKwlyZWc0ID0gaW5iKGlvYWRkciArIDQpICYgMHg3ZjsKKworCS8qIENoZWNrIHRoZSBJRCBuaWJibGUuICovCisJaWYgKChpZHJlZyAmIDB4ZjApICE9IDB4MjApIHsJCQkvKiBTTUMgVWx0cmEgKi8KKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU2VsZWN0IHRoZSBzdGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgc2V0LiAqLworCW91dGIocmVnNCwgaW9hZGRyICsgNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQljaGVja3N1bSArPSBpbmIoaW9hZGRyICsgOCArIGkpOworCWlmICgoY2hlY2tzdW0gJiAweGZmKSAhPSAweGZmKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChlaV9kZWJ1ZyAgJiYgIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayh2ZXJzaW9uKTsKKworCW1vZGVsX25hbWUgPSAiU01DIFVsdHJhMzIiOworCisJcHJpbnRrKCIlczogJXMgYXQgMHglWCwiLCBkZXYtPm5hbWUsIG1vZGVsX25hbWUsIGlvYWRkcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiAlMi4yWCIsIGRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgOCArIGkpKTsKKworCS8qIFN3aXRjaCBmcm9tIHRoZSBzdGF0aW9uIGFkZHJlc3MgdG8gdGhlIGFsdGVybmF0ZSByZWdpc3RlciBzZXQgYW5kCisJICAgcmVhZCB0aGUgdXNlZnVsIHJlZ2lzdGVycyB0aGVyZS4gKi8KKwlvdXRiKDB4ODAgfCByZWc0LCBpb2FkZHIgKyA0KTsKKworCS8qIEVuYWJsZSBGSU5FMTYgbW9kZSB0byBhdm9pZCBCSU9TIFJPTSB3aWR0aCBtaXNtYXRjaGVzIEAgcmVib290LiAqLworCW91dGIoMHg4MCB8IGluYihpb2FkZHIgKyAweDBjKSwgaW9hZGRyICsgMHgwYyk7CisKKwkvKiBSZXNldCBSQU0gYWRkci4gKi8KKwlvdXRiKDB4MDAsIGlvYWRkciArIDB4MGIpOworCisJLyogU3dpdGNoIGJhY2sgdG8gdGhlIHN0YXRpb24gYWRkcmVzcyByZWdpc3RlciBzZXQgc28gdGhhdCB0aGUKKwkgICBNUy1ET1MgZHJpdmVyIGNhbiBmaW5kIHRoZSBjYXJkIGFmdGVyIGEgd2FybSBib290LiAqLworCW91dGIocmVnNCwgaW9hZGRyICsgNCk7CisKKwlpZiAoKGluYihpb2FkZHIgKyBVTFRSQTMyX0NGRzUpICYgMHg0MCkgPT0gMCkgeworCQlwcmludGsoIlxuc21jLXVsdHJhMzI6IENhcmQgUkFNIGlzIGRpc2FibGVkISAgIgorCQkgICAgICAgIlJ1biBFSVNBIGNvbmZpZyB1dGlsaXR5LlxuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoKGluYihpb2FkZHIgKyBVTFRSQTMyX0NGRzIpICYgMHgwNCkgPT0gMCkKKwkJcHJpbnRrKCJcbnNtYy11bHRyYTMyOiBJZ25vcmluZyBCdXMtTWFzdGVyIGVuYWJsZSBiaXQuICAiCisJCSAgICAgICAiUnVuIEVJU0EgY29uZmlnIHV0aWxpdHkuXG4iKTsKKworCWlmIChkZXYtPmlycSA8IDIpIHsKKwkJdW5zaWduZWQgY2hhciBpcnFtYXBbXSA9IHswLCA5LCAzLCA1LCA3LCAxMCwgMTEsIDE1fTsKKwkJaW50IGlycSA9IGlycW1hcFtpbmIoaW9hZGRyICsgVUxUUkEzMl9DRkc1KSAmIDB4MDddOworCQlpZiAoaXJxID09IDApIHsKKwkJCXByaW50aygiLCBmYWlsZWQgdG8gZGV0ZWN0IElSUSBsaW5lLlxuIik7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byBvdXQ7CisJCX0KKwkJZGV2LT5pcnEgPSBpcnE7CisJfQorCisJLyogVGhlIDgzOTAgaXNuJ3QgYXQgdGhlIGJhc2UgYWRkcmVzcywgc28gZmFrZSB0aGUgb2Zmc2V0ICovCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHIgKyBVTFRSQTMyX05JQ19PRkZTRVQ7CisKKwkvKiBTYXZlIFJBTSBhZGRyZXNzIGluIHRoZSB1bnVzZWQgcmVnMCB0byBhdm9pZCBleGNlc3MgaW5iJ3MuICovCisJZWlfc3RhdHVzLnJlZzAgPSBpbmIoaW9hZGRyICsgVUxUUkEzMl9DRkczKSAmIDB4ZmM7CisKKwlkZXYtPm1lbV9zdGFydCA9ICAweGMwMDAwICsgKChlaV9zdGF0dXMucmVnMCAmIDB4N2MpIDw8IDExKTsKKworCWVpX3N0YXR1cy5uYW1lID0gbW9kZWxfbmFtZTsKKwllaV9zdGF0dXMud29yZDE2ID0gMTsKKwllaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA9IDA7CisJZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBUWF9QQUdFUzsKKwkvKiBBbGwgVWx0cmEzMiBjYXJkcyBoYXZlIDMyS0IgbWVtb3J5IHdpdGggYW4gOEtCIHdpbmRvdy4gKi8KKwllaV9zdGF0dXMuc3RvcF9wYWdlID0gMTI4OworCisJZWlfc3RhdHVzLm1lbSA9IGlvcmVtYXAoZGV2LT5tZW1fc3RhcnQsIDB4MjAwMCk7CisJaWYgKCFlaV9zdGF0dXMubWVtKSB7CisJCXByaW50aygiLCBmYWlsZWQgdG8gaW9yZW1hcC5cbiIpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAweDFmZmY7CisKKwlwcmludGsoIiwgSVJRICVkLCAzMktCIG1lbW9yeSwgOEtCIHdpbmRvdyBhdCAweCVseC0weCVseC5cbiIsCisJICAgICAgIGRldi0+aXJxLCBkZXYtPm1lbV9zdGFydCwgZGV2LT5tZW1fZW5kKTsKKwllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmdWx0cmEzMl9ibG9ja19pbnB1dDsKKwllaV9zdGF0dXMuYmxvY2tfb3V0cHV0ID0gJnVsdHJhMzJfYmxvY2tfb3V0cHV0OworCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmdWx0cmEzMl9nZXRfODM5MF9oZHI7CisJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmdWx0cmEzMl9yZXNldF84MzkwOworCWRldi0+b3BlbiA9ICZ1bHRyYTMyX29wZW47CisJZGV2LT5zdG9wID0gJnVsdHJhMzJfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKwlOUzgzOTBfaW5pdChkZXYsIDApOworCisJcmV0dXJuIDA7CitvdXQ6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBVTFRSQTMyX0lPX0VYVEVOVCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB1bHRyYTMyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBVTFRSQTMyX05JQ19PRkZTRVQ7IC8qIEFTSUMgYWRkciAqLworCWludCBpcnFfZmxhZ3MgPSAoaW5iKGlvYWRkciArIFVMVFJBMzJfQ0ZHNSkgJiAweDA4KSA/IDAgOiBTQV9TSElSUTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgaXJxX2ZsYWdzLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCW91dGIoVUxUUkEzMl9NRU1FTkIsIGlvYWRkcik7IC8qIEVuYWJsZSBTaGFyZWQgTWVtb3J5LiAqLworCW91dGIoMHg4MCwgaW9hZGRyICsgVUxUUkEzMl9DRkc2KTsgLyogRW5hYmxlIEludGVycnVwdHMuICovCisJb3V0YigweDg0LCBpb2FkZHIgKyA1KTsJLyogRW5hYmxlIE1FTTE2ICYgRGlzYWJsZSBCdXMgTWFzdGVyLiAqLworCW91dGIoMHgwMSwgaW9hZGRyICsgNik7CS8qIEVuYWJsZSBJbnRlcnJ1cHRzLiAqLworCS8qIFNldCB0aGUgZWFybHkgcmVjZWl2ZSB3YXJuaW5nIGxldmVsIGluIHdpbmRvdyAwIGhpZ2ggZW5vdWdoIG5vdAorCSAgIHRvIHJlY2VpdmUgRVJXIGludGVycnVwdHMuICovCisJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwLCBkZXYtPmJhc2VfYWRkcik7CisJb3V0YigweGZmLCBkZXYtPmJhc2VfYWRkciArIEVOMF9FUldDTlQpOworCWVpX29wZW4oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1bHRyYTMyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyIC0gVUxUUkEzMl9OSUNfT0ZGU0VUOyAvKiBDTURSRUcgKi8KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsoIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZC5cbiIsIGRldi0+bmFtZSk7CisKKwlvdXRiKDB4MDAsIGlvYWRkciArIFVMVFJBMzJfQ0ZHNik7IC8qIERpc2FibGUgSW50ZXJydXB0cy4gKi8KKwlvdXRiKDB4MDAsIGlvYWRkciArIDYpOwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLiAqLworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJTlM4MzkwX2luaXQoZGV2LCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1bHRyYTMyX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBVTFRSQTMyX05JQ19PRkZTRVQ7IC8qIEFTSUMgYmFzZSBhZGRyICovCisKKwlvdXRiKFVMVFJBMzJfUkVTRVQsIGlvYWRkcik7CisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldHRpbmcgVWx0cmEzMiwgdD0lbGQuLi4iLCBqaWZmaWVzKTsKKwllaV9zdGF0dXMudHhpbmcgPSAwOworCisJb3V0YihVTFRSQTMyX01FTUVOQiwgaW9hZGRyKTsgLyogRW5hYmxlIFNoYXJlZCBNZW1vcnkuICovCisJb3V0YigweDgwLCBpb2FkZHIgKyBVTFRSQTMyX0NGRzYpOyAvKiBFbmFibGUgSW50ZXJydXB0cy4gKi8KKwlvdXRiKDB4ODQsIGlvYWRkciArIDUpOwkvKiBFbmFibGUgTUVNMTYgJiBEaXNhYmxlIEJ1cyBNYXN0ZXIuICovCisJb3V0YigweDAxLCBpb2FkZHIgKyA2KTsJLyogRW5hYmxlIEludGVycnVwdHMuICovCisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldCBkb25lXG4iKTsKKwlyZXR1cm47Cit9CisKKy8qIEdyYWIgdGhlIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiBTaW1pbGFyIHRvIHRoZSBibG9ja19pbnB1dCByb3V0aW5lLCBidXQKKyAgIHdlIGRvbid0IG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGggcmluZyB3cmFwIGFzIHRoZSBoZWFkZXIgd2lsbCBiZSBhdAorICAgdGhlIHN0YXJ0IG9mIGEgcGFnZSwgc28gd2Ugb3B0aW1pemUgYWNjb3JkaW5nbHkuICovCisKK3N0YXRpYyB2b2lkIHVsdHJhMzJfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsCisJCQkJIGludCByaW5nX3BhZ2UpCit7CisJdm9pZCBfX2lvbWVtICpoZHJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgKChyaW5nX3BhZ2UgJiAweDFmKSA8PCA4KTsKKwl1bnNpZ25lZCBpbnQgUmFtUmVnID0gZGV2LT5iYXNlX2FkZHIgLSBVTFRSQTMyX05JQ19PRkZTRVQgKyBVTFRSQTMyX0NGRzM7CisKKwkvKiBTZWxlY3QgY29ycmVjdCA4S0IgV2luZG93LiAqLworCW91dGIoZWlfc3RhdHVzLnJlZzAgfCAoKHJpbmdfcGFnZSAmIDB4NjApID4+IDUpLCBSYW1SZWcpOworCisjaWZkZWYgX19CSUdfRU5ESUFOCisJLyogT2ZmaWNpYWxseSB0aGlzIGlzIHdoYXQgd2UgYXJlIGRvaW5nLCBidXQgdGhlIHJlYWRsKCkgaXMgZmFzdGVyICovCisJLyogdW5mb3J0dW5hdGVseSBpdCBpc24ndCBlbmRpYW4gYXdhcmUgb2YgdGhlIHN0cnVjdCAgICAgICAgICAgICAgICovCisJbWVtY3B5X2Zyb21pbyhoZHIsIGhkcl9zdGFydCwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSk7CisJaGRyLT5jb3VudCA9IGxlMTZfdG9fY3B1KGhkci0+Y291bnQpOworI2Vsc2UKKwkoKHVuc2lnbmVkIGludCopaGRyKVswXSA9IHJlYWRsKGhkcl9zdGFydCk7CisjZW5kaWYKK30KKworLyogQmxvY2sgaW5wdXQgYW5kIG91dHB1dCBhcmUgZWFzeSBvbiBzaGFyZWQgbWVtb3J5IGV0aGVyY2FyZHMsIHRoZSBvbmx5CisgICBjb21wbGljYXRpb24gaXMgd2hlbiB0aGUgcmluZyBidWZmZXIgd3JhcHMsIG9yIGluIHRoaXMgY2FzZSwgd2hlbiBhCisgICBwYWNrZXQgc3BhbnMgYW4gOEtCIGJvdW5kYXJ5LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgOEtCIHNlZ21lbnQgaXMKKyAgIGFscmVhZHkgc2V0IGJ5IHRoZSBnZXRfODM5MF9oZHIgcm91dGluZS4gKi8KKworc3RhdGljIHZvaWQgdWx0cmEzMl9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCWludCBjb3VudCwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCWludCByaW5nX29mZnNldCkKK3sKKwl2b2lkIF9faW9tZW0gKnhmZXJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgKHJpbmdfb2Zmc2V0ICYgMHgxZmZmKTsKKwl1bnNpZ25lZCBpbnQgUmFtUmVnID0gZGV2LT5iYXNlX2FkZHIgLSBVTFRSQTMyX05JQ19PRkZTRVQgKyBVTFRSQTMyX0NGRzM7CisKKwlpZiAoKHJpbmdfb2Zmc2V0ICYgfjB4MWZmZikgIT0gKChyaW5nX29mZnNldCArIGNvdW50IC0gMSkgJiB+MHgxZmZmKSkgeworCQlpbnQgc2VtaV9jb3VudCA9IDgxOTIgLSAocmluZ19vZmZzZXQgJiAweDFGRkYpOworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgeGZlcl9zdGFydCwgc2VtaV9jb3VudCk7CisJCWNvdW50IC09IHNlbWlfY291bnQ7CisJCWlmIChyaW5nX29mZnNldCA8IDk2KjI1NikgeworCQkJLyogU2VsZWN0IG5leHQgOEtCIFdpbmRvdy4gKi8KKwkJCXJpbmdfb2Zmc2V0ICs9IHNlbWlfY291bnQ7CisJCQlvdXRiKGVpX3N0YXR1cy5yZWcwIHwgKChyaW5nX29mZnNldCAmIDB4NjAwMCkgPj4gMTMpLCBSYW1SZWcpOworCQkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEgKyBzZW1pX2NvdW50LCBlaV9zdGF0dXMubWVtLCBjb3VudCk7CisJCX0gZWxzZSB7CisJCQkvKiBTZWxlY3QgZmlyc3QgOEtCIFdpbmRvdy4gKi8KKwkJCW91dGIoZWlfc3RhdHVzLnJlZzAsIFJhbVJlZyk7CisJCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSArIHNlbWlfY291bnQsIGVpX3N0YXR1cy5tZW0gKyBUWF9QQUdFUyAqIDI1NiwgY291bnQpOworCQl9CisJfSBlbHNlIHsKKwkJLyogUGFja2V0IGlzIGluIG9uZSBjaHVuayAtLSB3ZSBjYW4gY29weSArIGNrc3VtLiAqLworCQlldGhfaW9fY29weV9hbmRfc3VtKHNrYiwgeGZlcl9zdGFydCwgY291bnQsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgdWx0cmEzMl9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgaW50IGNvdW50LAorCQkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJIGludCBzdGFydF9wYWdlKQoreworCXZvaWQgX19pb21lbSAqeGZlcl9zdGFydCA9IGVpX3N0YXR1cy5tZW0gKyAoc3RhcnRfcGFnZTw8OCk7CisJdW5zaWduZWQgaW50IFJhbVJlZyA9IGRldi0+YmFzZV9hZGRyIC0gVUxUUkEzMl9OSUNfT0ZGU0VUICsgVUxUUkEzMl9DRkczOworCisJLyogU2VsZWN0IGZpcnN0IDhLQiBXaW5kb3cuICovCisJb3V0YihlaV9zdGF0dXMucmVnMCwgUmFtUmVnKTsKKworCW1lbWNweV90b2lvKHhmZXJfc3RhcnQsIGJ1ZiwgY291bnQpOworfQorDAorI2lmZGVmIE1PRFVMRQorI2RlZmluZSBNQVhfVUxUUkEzMl9DQVJEUyAgIDQJLyogTWF4IG51bWJlciBvZiBVbHRyYSBjYXJkcyBwZXIgbW9kdWxlICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl91bHRyYVtNQVhfVUxUUkEzMl9DQVJEU107CisKK01PRFVMRV9ERVNDUklQVElPTigiU01DIFVsdHJhMzIgRUlTQSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2LCBmb3VuZCA9IDA7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfVUxUUkEzMl9DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdWx0cmEzMl9wcm9iZSgtMSk7CisJCWlmIChJU19FUlIoZGV2KSkKKwkJCWJyZWFrOworCQlkZXZfdWx0cmFbZm91bmQrK10gPSBkZXY7CisJfQorCWlmIChmb3VuZCkKKwkJcmV0dXJuIDA7CisJcHJpbnRrKEtFUk5fV0FSTklORyAic21jLXVsdHJhMzIuYzogTm8gU01DIFVsdHJhMzIgZm91bmQuXG4iKTsKKwlyZXR1cm4gLUVOWElPOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX1VMVFJBMzJfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl91bHRyYVt0aGlzX2Rldl07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogTU9EVUxFICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxOTQuYyBiL2RyaXZlcnMvbmV0L3NtYzkxOTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODY2OTdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc21jOTE5NC5jCkBAIC0wLDAgKzEsMTYzMSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAuIHNtYzkxOTQuYworIC4gVGhpcyBpcyBhIGRyaXZlciBmb3IgU01DJ3MgOTAwMCBzZXJpZXMgb2YgRXRoZXJuZXQgY2FyZHMuCisgLgorIC4gQ29weXJpZ2h0IChDKSAxOTk2IGJ5IEVyaWsgU3RhaGxtYW4KKyAuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAuIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgLgorIC4gIkZlYXR1cmVzIiBvZiB0aGUgU01DIGNoaXA6CisgLiAgIDQ2MDggYnl0ZSBwYWNrZXQgbWVtb3J5LiAoIGZvciB0aGUgOTFDOTIuICBPdGhlcnMgaGF2ZSBtb3JlICkKKyAuICAgRUVQUk9NIGZvciBjb25maWd1cmF0aW9uCisgLiAgIEFVSS9UUCBzZWxlY3Rpb24gICggbWluZSBoYXMgMTBCYXNlMi8xMEJhc2VUIHNlbGVjdCApCisgLgorIC4gQXJndW1lbnRzOgorIC4gCWlvCQkgPSBmb3IgdGhlIGJhc2UgYWRkcmVzcworIC4JaXJxCSA9IGZvciB0aGUgSVJRCisgLglpZnBvcnQgPSAwIGZvciBhdXRvZGV0ZWN0LCAxIGZvciBUUCwgMiBmb3IgQVVJICggb3IgMTBiYXNlMiApCisgLgorIC4gYXV0aG9yOgorIC4gCUVyaWsgU3RhaGxtYW4JCQkJKCBlcmlrQHZ0LmVkdSApCisgLiBjb250cmlidXRvcnM6CisgLiAgICAgIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorIC4KKyAuIEhhcmR3YXJlIG11bHRpY2FzdCBjb2RlIGZyb20gUGV0ZXIgQ2FtbWFlcnQgKCBwY0BkZW5rYXJ0LmJlICkKKyAuCisgLiBTb3VyY2VzOgorIC4gICAgbyAgIFNNQyBkYXRhYm9vaworIC4gICAgbyAgIHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlciAoIGJlY2tlckBzY3lsZC5jb20gKQorIC4gICAgbyAgICggYSBMT1Qgb2YgYWR2aWNlIGZyb20gQmVja2VyIGFzIHdlbGwgKQorIC4KKyAuIEhpc3Rvcnk6CisgLgkxMi8wNy85NSAgRXJpayBTdGFobG1hbiAgd3JpdHRlbiwgZ290IHJlY2VpdmUveG1pdCBoYW5kbGVkCisgLiAJMDEvMDMvOTYgIEVyaWsgU3RhaGxtYW4gIHdvcmtlZCBvdXQgc29tZSBidWdzLCBhY3R1YWxseSB1c2FibGUhISEgOi0pCisgLgkwMS8wNi85NiAgRXJpayBTdGFobG1hbgkgY2xlYW5lZCB1cCBzb21lLCBiZXR0ZXIgdGVzdGluZywgZXRjCisgLgkwMS8yOS85NiAgRXJpayBTdGFobG1hbgkgZml4ZWQgYXV0b2lycSwgYWRkZWQgbXVsdGljYXN0CisgLiAJMDIvMDEvOTYgIEVyaWsgU3RhaGxtYW4JIDEuIGRpc2FibGVkIGFsbCBpbnRlcnJ1cHRzIGluIHNtY19yZXNldAorIC4JCSAgIAkJIDIuIGdvdCByaWQgb2YgcG9zdC1kZWNyZW1lbnRpbmcgYnVnIC0tIFVHSC4KKyAuCTAyLzEzLzk2ICBFcmlrIFN0YWhsbWFuICBUcmllZCB0byBmaXggYXV0b2lycSBmYWlsdXJlLiAgQWRkZWQgbW9yZQorIC4JCQkJIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2VzLgorIC4JMDIvMTUvOTYgIEVyaWsgU3RhaGxtYW4gIEZpeGVkIHR5cG8gdGhhdCBjYXVzZWQgZGV0ZWN0aW9uIGZhaWx1cmUKKyAuIAkwMi8yMy85NiAgRXJpayBTdGFobG1hbgkgTW9kaWZpZWQgaXQgdG8gZml0IGludG8ga2VybmVsIHRyZWUKKyAuCQkJCSBBZGRlZCBzdXBwb3J0IHRvIGNoYW5nZSBoYXJkd2FyZSBhZGRyZXNzCisgLgkJCQkgQ2xlYXJlZCBzdGF0cyBvbiBvcGVucworIC4JMDIvMjYvOTYgIEVyaWsgU3RhaGxtYW4JIFRyaWFsIHN1cHBvcnQgZm9yIEtlcm5lbCAxLjIuMTMKKyAuCQkJCSBLbHVkZ2UgZm9yIGF1dG9tYXRpYyBJUlEgZGV0ZWN0aW9uCisgLgkwMy8wNC85NiAgRXJpayBTdGFobG1hbgkgRml4ZWQga2VybmVsIDEuMy43MCArCisgLgkJCQkgRml4ZWQgYnVnIHJlcG9ydGVkIGJ5IEdhcmRuZXIgQnVjaGFuYW4gaW4KKyAuCQkJCSAgIHNtY19lbmFibGUsIHdpdGggb3V0dyBpbnN0ZWFkIG9mIG91dGIKKyAuCTAzLzA2Lzk2ICBFcmlrIFN0YWhsbWFuICBBZGRlZCBoYXJkd2FyZSBtdWx0aWNhc3QgZnJvbSBQZXRlciBDYW1tYWVydAorIC4JMDQvMTQvMDAgIEhlaWtvIFBydWVzc2luZyAoU01BIFJlZ2Vsc3lzdGVtZSkgIEZpeGVkIGJ1ZyBpbiBjaGlwIG1lbW9yeQorIC4JCQkJIGFsbG9jYXRpb24KKyAuICAgICAgMDgvMjAvMDAgIEFybmFsZG8gTWVsbyAgIGZpeCBrZnJlZShza2IpIGluIHNtY19oYXJkd2FyZV9zZW5kX3BhY2tldAorIC4gICAgICAxMi8xNS8wMCAgQ2hyaXN0aWFuIEp1bGxpZW4gZml4ICJXYXJuaW5nOiBrZnJlZV9za2Igb24gaGFyZCBJUlEiCisgLiAgICAgIDExLzA4LzAxIE1hdHQgRG9tc2NoICAgICBVc2UgY29tbW9uIGNyYzMyIGZ1bmN0aW9uCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisJInNtYzkxOTQuYzp2MC4xNCAxMi8xNS8wMCBieSBFcmlrIFN0YWhsbWFuIChlcmlrQHZ0LmVkdSlcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJzbWM5MTk0LmgiCisKKyNkZWZpbmUgRFJWX05BTUUgInNtYzkxOTQiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLgorIC4gQ29uZmlndXJhdGlvbiBvcHRpb25zLCBmb3IgdGhlIGV4cGVyaWVuY2VkIHVzZXIgdG8gY2hhbmdlLgorIC4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAuIERvIHlvdSB3YW50IHRvIHVzZSAzMiBiaXQgeGZlcnM/ICBUaGlzIHNob3VsZCB3b3JrIG9uIGFsbCBjaGlwcywgYXMKKyAuIHRoZSBjaGlwc2V0IGlzIGRlc2lnbmVkIHRvIGFjY29tbW9kYXRlIHRoZW0uCisqLworI2lmZGVmIF9fc2hfXworI3VuZGVmIFVTRV8zMl9CSVQKKyNlbHNlCisjZGVmaW5lIFVTRV8zMl9CSVQgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykKKyNkZWZpbmUgTk9fQVVUT1BST0JFCisjdW5kZWYgaW5zbAorI3VuZGVmIG91dHNsCisjZGVmaW5lIGluc2woYSxiLGwpICBpb19pbnNsX25vc3dhcChhLGIsbCkKKyNkZWZpbmUgb3V0c2woYSxiLGwpIGlvX291dHNsX25vc3dhcChhLGIsbCkKKyNlbmRpZgorCisvKgorIC50aGUgU01DOTE5NCBjYW4gYmUgYXQgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9ydCBhZGRyZXNzZXMuICBUbyBjaGFuZ2UsCisgLmZvciBhIHNsaWdodGx5IGRpZmZlcmVudCBjYXJkLCB5b3UgY2FuIGFkZCBpdCB0byB0aGUgYXJyYXkuICBLZWVwIGluCisgLm1pbmQgdGhhdCB0aGUgYXJyYXkgbXVzdCBlbmQgaW4gemVyby4KKyovCisKK3N0cnVjdCBkZXZsaXN0IHsKKwl1bnNpZ25lZCBpbnQgcG9ydDsKKwl1bnNpZ25lZCBpbnQgaXJxOworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0g4U19FRE9TSzI2NzQpCitzdGF0aWMgc3RydWN0IGRldmxpc3Qgc21jX2Rldmxpc3RbXSBfX2luaXRkYXRhID0geworCXsucG9ydCA9IDB4ZjgwMDAwLCAuaXJxID0gMTZ9LAorCXsucG9ydCA9IDAsICAgICAgICAuaXJxID0gMCB9LAorfTsKKyNlbHNlCitzdGF0aWMgc3RydWN0IGRldmxpc3Qgc21jX2Rldmxpc3RbXSBfX2luaXRkYXRhID0geworCXsucG9ydCA9IDB4MjAwLCAuaXJxID0gMH0sCisJey5wb3J0ID0gMHgyMjAsIC5pcnEgPSAwfSwKKwl7LnBvcnQgPSAweDI0MCwgLmlycSA9IDB9LAorCXsucG9ydCA9IDB4MjYwLCAuaXJxID0gMH0sCisJey5wb3J0ID0gMHgyODAsIC5pcnEgPSAwfSwKKwl7LnBvcnQgPSAweDJBMCwgLmlycSA9IDB9LAorCXsucG9ydCA9IDB4MkMwLCAuaXJxID0gMH0sCisJey5wb3J0ID0gMHgyRTAsIC5pcnEgPSAwfSwKKwl7LnBvcnQgPSAweDMwMCwgLmlycSA9IDB9LAorCXsucG9ydCA9IDB4MzIwLCAuaXJxID0gMH0sCisJey5wb3J0ID0gMHgzNDAsIC5pcnEgPSAwfSwKKwl7LnBvcnQgPSAweDM2MCwgLmlycSA9IDB9LAorCXsucG9ydCA9IDB4MzgwLCAuaXJxID0gMH0sCisJey5wb3J0ID0gMHgzQTAsIC5pcnEgPSAwfSwKKwl7LnBvcnQgPSAweDNDMCwgLmlycSA9IDB9LAorCXsucG9ydCA9IDB4M0UwLCAuaXJxID0gMH0sCisJey5wb3J0ID0gMCwgICAgIC5pcnEgPSAwfSwKK307CisjZW5kaWYKKy8qCisgLiBXYWl0IHRpbWUgZm9yIG1lbW9yeSB0byBiZSBmcmVlLiAgVGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgYmUKKyAuIHR1bmVkIHRoYXQgbXVjaCwgYXMgd2FpdGluZyBmb3IgdGhpcyBtZWFucyBub3RoaW5nIGVsc2UgaGFwcGVucworIC4gaW4gdGhlIHN5c3RlbQorKi8KKyNkZWZpbmUgTUVNT1JZX1dBSVRfVElNRSAxNgorCisvKgorIC4gREVCVUdHSU5HIExFVkVMUworIC4KKyAuIDAgZm9yIG5vcm1hbCBvcGVyYXRpb24KKyAuIDEgZm9yIHNsaWdodGx5IG1vcmUgZGV0YWlscworIC4gPjIgZm9yIHZhcmlvdXMgbGV2ZWxzIG9mIGluY3JlYXNpbmdseSB1c2VsZXNzIGluZm9ybWF0aW9uCisgLiAgICAyIGZvciBpbnRlcnJ1cHQgdHJhY2tpbmcsIHN0YXR1cyBmbGFncworIC4gICAgMyBmb3IgcGFja2V0IGR1bXBzLCBldGMuCisqLworI2RlZmluZSBTTUNfREVCVUcgMAorCisjaWYgKFNNQ19ERUJVRyA+IDIgKQorI2RlZmluZSBQUklOVEszKHgpIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBQUklOVEszKHgpCisjZW5kaWYKKworI2lmIFNNQ19ERUJVRyA+IDEKKyNkZWZpbmUgUFJJTlRLMih4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgUFJJTlRLMih4KQorI2VuZGlmCisKKyNpZmRlZiBTTUNfREVCVUcKKyNkZWZpbmUgUFJJTlRLKHgpIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBQUklOVEsoeCkKKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLgorIC4gVGhlIGludGVybmFsIHdvcmtpbmdzIG9mIHRoZSBkcml2ZXIuICBJZiB5b3UgYXJlIGNoYW5naW5nIGFueXRoaW5nCisgLiBoZXJlIHdpdGggdGhlIFNNQyBzdHVmZiwgeW91IHNob3VsZCBoYXZlIHRoZSBkYXRhc2hlZXQgYW5kIGtub3duCisgLiB3aGF0IHlvdSBhcmUgZG9pbmcuCisgLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDQVJETkFNRSAiU01DOTE5NCIKKworCisvKiBzdG9yZSB0aGlzIGluZm9ybWF0aW9uIGZvciB0aGUgZHJpdmVyLi4gKi8KK3N0cnVjdCBzbWNfbG9jYWwgeworCS8qCisgCSAgIHRoZXNlIGFyZSB0aGluZ3MgdGhhdCB0aGUga2VybmVsIHdhbnRzIG1lIHRvIGtlZXAsIHNvIHVzZXJzCisJICAgY2FuIGZpbmQgb3V0IHNlbWktdXNlbGVzcyBzdGF0aXN0aWNzIG9mIGhvdyB3ZWxsIHRoZSBjYXJkIGlzCisJICAgcGVyZm9ybWluZworIAkqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisJLyoKKwkgICBJZiBJIGhhdmUgdG8gd2FpdCB1bnRpbCBtZW1vcnkgaXMgYXZhaWxhYmxlIHRvIHNlbmQKKwkgICBhIHBhY2tldCwgSSB3aWxsIHN0b3JlIHRoZSBza2J1ZmYgaGVyZSwgdW50aWwgSSBnZXQgdGhlCisJICAgZGVzaXJlZCBtZW1vcnkuICBUaGVuLCBJJ2xsIHNlbmQgaXQgb3V0IGFuZCBmcmVlIGl0LgorCSovCisJc3RydWN0IHNrX2J1ZmYgKiBzYXZlZF9za2I7CisKKwkvKgorIAkgLiBUaGlzIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHBhY2tldHMgdGhhdCBJIGhhdmUKKyAJIC4gc2VudCBvdXQuICBXaGVuIGFuIFRYX0VNUFRZIGludGVycnVwdCBjb21lcywgSSBrbm93CisJIC4gdGhhdCBhbGwgb2YgdGhlc2UgaGF2ZSBiZWVuIHNlbnQuCisJKi8KKwlpbnQJcGFja2V0c193YWl0aW5nOworfTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLgorIC4gIFRoZSBkcml2ZXIgY2FuIGJlIGVudGVyZWQgYXQgYW55IG9mIHRoZSBmb2xsb3dpbmcgZW50cnkgcG9pbnRzLgorIC4KKyAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAqLworCisvKgorIC4gVGhpcyBpcyBjYWxsZWQgYnkgIHJlZ2lzdGVyX25ldGRldigpLiAgSXQgaXMgcmVzcG9uc2libGUgZm9yCisgLiBjaGVja2luZyB0aGUgcG9ydGxpc3QgZm9yIHRoZSBTTUM5MDAwIHNlcmllcyBjaGlwc2V0LiAgSWYgaXQgZmluZHMKKyAuIG9uZSwgdGhlbiBpdCB3aWxsIGluaXRpYWxpemUgdGhlIGRldmljZSwgZmluZCB0aGUgaGFyZHdhcmUgaW5mb3JtYXRpb24sCisgLiBhbmQgc2V0cyB1cCB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlIHBhcmFtZXRlcnMuCisgLiBOT1RFOiBJbnRlcnJ1cHRzIGFyZSAqT0ZGKiB3aGVuIHRoaXMgcHJvY2VkdXJlIGlzIGNhbGxlZC4KKyAuCisgLiBOQjpUaGlzIHNob3VsZG4ndCBiZSBzdGF0aWMgc2luY2UgaXQgaXMgcmVmZXJyZWQgdG8gZXh0ZXJuYWxseS4KKyovCitzdHJ1Y3QgbmV0X2RldmljZSAqc21jX2luaXQoaW50IHVuaXQpOworCisvKgorIC4gVGhlIGtlcm5lbCBjYWxscyB0aGlzIGZ1bmN0aW9uIHdoZW4gc29tZW9uZSB3YW50cyB0byB1c2UgdGhlIGRldmljZSwKKyAuIHR5cGljYWxseSAnaWZjb25maWcgZXRoWCB1cCcuCisqLworc3RhdGljIGludCBzbWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoKKyAuIE91ciB3YXRjaGRvZyB0aW1lZCBvdXQuIENhbGxlZCBieSB0aGUgbmV0d29ya2luZyBsYXllcgorKi8KK3N0YXRpYyB2b2lkIHNtY190aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKgorIC4gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGtlcm5lbCBpbiByZXNwb25zZSB0byAnaWZjb25maWcgZXRoWCBkb3duJy4gIEl0CisgLiBpcyByZXNwb25zaWJsZSBmb3IgY2xlYW5pbmcgdXAgZXZlcnl0aGluZyB0aGF0IHRoZSBvcGVuIHJvdXRpbmUKKyAuIGRvZXMsIGFuZCBtYXliZSBwdXR0aW5nIHRoZSBjYXJkIGludG8gYSBwb3dlcmRvd24gc3RhdGUuCisqLworc3RhdGljIGludCBzbWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qCisgLiBUaGlzIHJvdXRpbmUgYWxsb3dzIHRoZSBwcm9jIGZpbGUgc3lzdGVtIHRvIHF1ZXJ5IHRoZSBkcml2ZXIncworIC4gc3RhdGlzdGljcy4KKyovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBzbWNfcXVlcnlfc3RhdGlzdGljcyggc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qCisgLiBGaW5hbGx5LCBhIGNhbGwgdG8gc2V0IHByb21pc2N1b3VzIG1vZGUgKCBmb3IgVENQRFVNUCBhbmQgcmVsYXRlZAorIC4gcHJvZ3JhbXMgKSBhbmQgbXVsdGljYXN0IG1vZGVzLgorKi8KK3N0YXRpYyB2b2lkIHNtY19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAuCisgLiBJbnRlcnJ1cHQgbGV2ZWwgY2FsbHMuLgorIC4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAuIEhhbmRsZXMgdGhlIGFjdHVhbCBpbnRlcnJ1cHQKKyovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc21jX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKy8qCisgLiBUaGlzIGlzIGEgc2VwYXJhdGUgcHJvY2VkdXJlIHRvIGhhbmRsZSB0aGUgcmVjZWlwdCBvZiBhIHBhY2tldCwgdG8KKyAuIGxlYXZlIHRoZSBpbnRlcnJ1cHQgY29kZSBsb29raW5nIHNsaWdodGx5IGNsZWFuZXIKKyovCitzdGF0aWMgaW5saW5lIHZvaWQgc21jX3Jjdiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworLyoKKyAuIFRoaXMgaGFuZGxlcyBhIFRYIGludGVycnVwdCwgd2hpY2ggaXMgb25seSBjYWxsZWQgd2hlbiBhbiBlcnJvcgorIC4gcmVsYXRpbmcgdG8gYSBwYWNrZXQgaXMgc2VudC4KKyovCitzdGF0aWMgaW5saW5lIHZvaWQgc21jX3R4KCBzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiApOworCisvKgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4KKyAuIEludGVybmFsIHJvdXRpbmVzCisgLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyoKKyAuIFRlc3QgaWYgYSBnaXZlbiBsb2NhdGlvbiBjb250YWlucyBhIGNoaXAsIHRyeWluZyB0byBjYXVzZSBhcworIC4gbGl0dGxlIGRhbWFnZSBhcyBwb3NzaWJsZSBpZiBpdCdzIG5vdCBhIFNNQyBjaGlwLgorKi8KK3N0YXRpYyBpbnQgc21jX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworCisvKgorIC4gQSByYXRoZXIgc2ltcGxlIHJvdXRpbmUgdG8gcHJpbnQgb3V0IGEgcGFja2V0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisqLworI2lmIFNNQ19ERUJVRyA+IDIKK3N0YXRpYyB2b2lkIHByaW50X3BhY2tldCggYnl0ZSAqLCBpbnQgKTsKKyNlbmRpZgorCisjZGVmaW5lIHR4X2RvbmUoZGV2KSAxCisKKy8qIHRoaXMgaXMgY2FsbGVkIHRvIGFjdHVhbGx5IHNlbmQgdGhlIHBhY2tldCB0byB0aGUgY2hpcCAqLworc3RhdGljIHZvaWQgc21jX2hhcmR3YXJlX3NlbmRfcGFja2V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiApOworCisvKiBTaW5jZSBJIGFtIG5vdCBzdXJlIGlmIEkgd2lsbCBoYXZlIGVub3VnaCByb29tIGluIHRoZSBjaGlwJ3MgcmFtCisgLiB0byBzdG9yZSB0aGUgcGFja2V0LCBJIGNhbGwgdGhpcyByb3V0aW5lLCB3aGljaCBlaXRoZXIgc2VuZHMgaXQKKyAuIG5vdywgb3IgZ2VuZXJhdGVzIGFuIGludGVycnVwdCB3aGVuIHRoZSBjYXJkIGlzIHJlYWR5IGZvciB0aGUKKyAuIHBhY2tldCAqLworc3RhdGljIGludCAgc21jX3dhaXRfdG9fc2VuZF9wYWNrZXQoIHN0cnVjdCBza19idWZmICogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKKy8qIHRoaXMgZG9lcyBhIHNvZnQgcmVzZXQgb24gdGhlIGRldmljZSAqLworc3RhdGljIHZvaWQgc21jX3Jlc2V0KCBpbnQgaW9hZGRyICk7CisKKy8qIEVuYWJsZSBJbnRlcnJ1cHRzLCBSZWNlaXZlLCBhbmQgVHJhbnNtaXQgKi8KK3N0YXRpYyB2b2lkIHNtY19lbmFibGUoIGludCBpb2FkZHIgKTsKKworLyogdGhpcyBwdXRzIHRoZSBkZXZpY2UgaW4gYW4gaW5hY3RpdmUgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIHNtY19zaHV0ZG93biggaW50IGlvYWRkciApOworCisvKiBUaGlzIHJvdXRpbmUgd2lsbCBmaW5kIHRoZSBJUlEgb2YgdGhlIGRyaXZlciBpZiBvbmUgaXMgbm90CisgLiBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHRvIHRoZSBkZXZpY2UuICAqLworc3RhdGljIGludCBzbWNfZmluZGlycSggaW50IGlvYWRkciApOworCisvKgorIC4gRnVuY3Rpb246IHNtY19yZXNldCggaW50IGlvYWRkciApCisgLiBQdXJwb3NlOgorIC4gIAlUaGlzIHNldHMgdGhlIFNNQzkxeHggY2hpcCB0byBpdHMgbm9ybWFsIHN0YXRlLCBob3BlZnVsbHkgZnJvbSB3aGF0ZXZlcgorIC4gCW1lc3MgdGhhdCBhbnkgb3RoZXIgRE9TIGRyaXZlciBoYXMgcHV0IGl0IGluLgorIC4KKyAuIE1heWJlIEkgc2hvdWxkIHJlc2V0IG1vcmUgcmVnaXN0ZXJzIHRvIGRlZmF1bHRzIGluIGhlcmU/ICBTT0ZUUkVTRVQgIHNob3VsZAorIC4gZG8gdGhhdCBmb3IgbWUuCisgLgorIC4gTWV0aG9kOgorIC4JMS4gIHNlbmQgYSBTT0ZUIFJFU0VUCisgLgkyLiAgd2FpdCBmb3IgaXQgdG8gZmluaXNoCisgLgkzLiAgZW5hYmxlIGF1dG9yZWxlYXNlIG1vZGUKKyAuCTQuICByZXNldCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdAorIC4JNS4gIGNsZWFyIGFsbCBpbnRlcnJ1cHRzCisgLgorKi8KK3N0YXRpYyB2b2lkIHNtY19yZXNldCggaW50IGlvYWRkciApCit7CisJLyogVGhpcyByZXNldHMgdGhlIHJlZ2lzdGVycyBtb3N0bHkgdG8gZGVmYXVsdHMsIGJ1dCBkb2Vzbid0CisJICAgYWZmZWN0IEVFUFJPTS4gIFRoYXQgc2VlbXMgdW5uZWNlc3NhcnkgKi8KKwlTTUNfU0VMRUNUX0JBTksoIDAgKTsKKwlvdXR3KCBSQ1JfU09GVFJFU0VULCBpb2FkZHIgKyBSQ1IgKTsKKworCS8qIHRoaXMgc2hvdWxkIHBhdXNlIGVub3VnaCBmb3IgdGhlIGNoaXAgdG8gYmUgaGFwcHkgKi8KKwlTTUNfREVMQVkoICk7CisKKwkvKiBTZXQgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIHRvCisJICAgZGVmYXVsdCB2YWx1ZXMgKi8KKwlvdXR3KCBSQ1JfQ0xFQVIsIGlvYWRkciArIFJDUiApOworCW91dHcoIFRDUl9DTEVBUiwgaW9hZGRyICsgVENSICk7CisKKwkvKiBzZXQgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgdG8gYXV0b21hdGljYWxseQorCSAgIHJlbGVhc2Ugc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0dGVkIHBhY2tldHMsIHRvIG1ha2UgdGhlIGJlc3QKKwkgICB1c2Ugb3V0IG9mIG91ciBsaW1pdGVkIG1lbW9yeSAqLworCVNNQ19TRUxFQ1RfQkFOSyggMSApOworCW91dHcoIGludyggaW9hZGRyICsgQ09OVFJPTCApIHwgQ1RMX0FVVE9fUkVMRUFTRSAsIGlvYWRkciArIENPTlRST0wgKTsKKworCS8qIFJlc2V0IHRoZSBNTVUgKi8KKwlTTUNfU0VMRUNUX0JBTksoIDIgKTsKKwlvdXR3KCBNQ19SRVNFVCwgaW9hZGRyICsgTU1VX0NNRCApOworCisJLyogTm90ZTogIEl0IGRvZXNuJ3Qgc2VlbSB0aGF0IHdhaXRpbmcgZm9yIHRoZSBNTVUgYnVzeSBpcyBuZWVkZWQgaGVyZSwKKwkgICBidXQgdGhpcyBpcyBhIHBsYWNlIHdoZXJlIGZ1dHVyZSBjaGlwc2V0cyBfQ09VTERfIGJyZWFrLiAgQmUgd2FyeQorIAkgICBvZiBpc3N1aW5nIGFub3RoZXIgTU1VIGNvbW1hbmQgcmlnaHQgYWZ0ZXIgdGhpcyAqLworCisJb3V0YiggMCwgaW9hZGRyICsgSU5UX01BU0sgKTsKK30KKworLyoKKyAuIEZ1bmN0aW9uOiBzbWNfZW5hYmxlCisgLiBQdXJwb3NlOiBsZXQgdGhlIGNoaXAgdGFsayB0byB0aGUgb3V0c2lkZSB3b3JrCisgLiBNZXRob2Q6CisgLgkxLiAgRW5hYmxlIHRoZSB0cmFuc21pdHRlcgorIC4JMi4gIEVuYWJsZSB0aGUgcmVjZWl2ZXIKKyAuCTMuICBFbmFibGUgaW50ZXJydXB0cworKi8KK3N0YXRpYyB2b2lkIHNtY19lbmFibGUoIGludCBpb2FkZHIgKQoreworCVNNQ19TRUxFQ1RfQkFOSyggMCApOworCS8qIHNlZSB0aGUgaGVhZGVyIGZpbGUgZm9yIG9wdGlvbnMgaW4gVENSL1JDUiBOT1JNQUwqLworCW91dHcoIFRDUl9OT1JNQUwsIGlvYWRkciArIFRDUiApOworCW91dHcoIFJDUl9OT1JNQUwsIGlvYWRkciArIFJDUiApOworCisJLyogbm93LCBlbmFibGUgaW50ZXJydXB0cyAqLworCVNNQ19TRUxFQ1RfQkFOSyggMiApOworCW91dGIoIFNNQ19JTlRFUlJVUFRfTUFTSywgaW9hZGRyICsgSU5UX01BU0sgKTsKK30KKworLyoKKyAuIEZ1bmN0aW9uOiBzbWNfc2h1dGRvd24KKyAuIFB1cnBvc2U6ICBjbG9zZXMgZG93biB0aGUgU01DOTF4eHggY2hpcC4KKyAuIE1ldGhvZDoKKyAuCTEuIHplcm8gdGhlIGludGVycnVwdCBtYXNrCisgLgkyLiBjbGVhciB0aGUgZW5hYmxlIHJlY2VpdmUgZmxhZworIC4JMy4gY2xlYXIgdGhlIGVuYWJsZSB4bWl0IGZsYWdzCisgLgorIC4gVE9ETzoKKyAuICAgKDEpIG1heWJlIHV0aWxpemUgcG93ZXIgZG93biBtb2RlLgorIC4JV2h5IG5vdCB5ZXQ/ICBCZWNhdXNlIHdoaWxlIHRoZSBjaGlwIHdpbGwgZ28gaW50byBwb3dlciBkb3duIG1vZGUsCisgLgl0aGUgbWFudWFsIHNheXMgdGhhdCBpdCB3aWxsIHdha2UgdXAgaW4gcmVzcG9uc2UgdG8gYW55IEkvTyByZXF1ZXN0cworIC4JaW4gdGhlIHJlZ2lzdGVyIHNwYWNlLiAgIEVtcGlyaWNhbCByZXN1bHRzIGRvIG5vdCBzaG93IHRoaXMgd29ya2luZy4KKyovCitzdGF0aWMgdm9pZCBzbWNfc2h1dGRvd24oIGludCBpb2FkZHIgKQoreworCS8qIG5vIG1vcmUgaW50ZXJydXB0cyBmb3IgbWUgKi8KKwlTTUNfU0VMRUNUX0JBTksoIDIgKTsKKwlvdXRiKCAwLCBpb2FkZHIgKyBJTlRfTUFTSyApOworCisJLyogYW5kIHRlbGwgdGhlIGNhcmQgdG8gc3RheSBhd2F5IGZyb20gdGhhdCBuYXN0eSBvdXRzaWRlIHdvcmxkICovCisJU01DX1NFTEVDVF9CQU5LKCAwICk7CisJb3V0YiggUkNSX0NMRUFSLCBpb2FkZHIgKyBSQ1IgKTsKKwlvdXRiKCBUQ1JfQ0xFQVIsIGlvYWRkciArIFRDUiApOworI2lmIDAKKwkvKiBmaW5hbGx5LCBzaHV0IHRoZSBjaGlwIGRvd24gKi8KKwlTTUNfU0VMRUNUX0JBTksoIDEgKTsKKwlvdXR3KCBpbncoIGlvYWRkciArIENPTlRST0wgKSwgQ1RMX1BPV0VSRE9XTiwgaW9hZGRyICsgQ09OVFJPTCAgKTsKKyNlbmRpZgorfQorCisKKy8qCisgLiBGdW5jdGlvbjogc21jX3NldG11bHRpY2FzdCggaW50IGlvYWRkciwgaW50IGNvdW50LCBkZXZfbWNfbGlzdCAqIGFkZHMgKQorIC4gUHVycG9zZToKKyAuICAgIFRoaXMgc2V0cyB0aGUgaW50ZXJuYWwgaGFyZHdhcmUgdGFibGUgdG8gZmlsdGVyIG91dCB1bndhbnRlZCBtdWx0aWNhc3QKKyAuICAgIHBhY2tldHMgYmVmb3JlIHRoZXkgdGFrZSB1cCBtZW1vcnkuCisgLgorIC4gICAgVGhlIFNNQyBjaGlwIHVzZXMgYSBoYXNoIHRhYmxlIHdoZXJlIHRoZSBoaWdoIDYgYml0cyBvZiB0aGUgQ1JDIG9mCisgLiAgICBhZGRyZXNzIGFyZSB0aGUgb2Zmc2V0IGludG8gdGhlIHRhYmxlLiAgSWYgdGhhdCBiaXQgaXMgMSwgdGhlbiB0aGUKKyAuICAgIG11bHRpY2FzdCBwYWNrZXQgaXMgYWNjZXB0ZWQuICBPdGhlcndpc2UsIGl0J3MgZHJvcHBlZCBzaWxlbnRseS4KKyAuCisgLiAgICBUbyB1c2UgdGhlIDYgYml0cyBhcyBhbiBvZmZzZXQgaW50byB0aGUgdGFibGUsIHRoZSBoaWdoIDMgYml0cyBhcmUgdGhlCisgLiAgICBudW1iZXIgb2YgdGhlIDggYml0IHJlZ2lzdGVyLCB3aGlsZSB0aGUgbG93IDMgYml0cyBhcmUgdGhlIGJpdCB3aXRoaW4KKyAuICAgIHRoYXQgcmVnaXN0ZXIuCisgLgorIC4gVGhpcyByb3V0aW5lIGlzIGJhc2VkIHZlcnkgaGVhdmlseSBvbiB0aGUgb25lIHByb3ZpZGVkIGJ5IFBldGVyIENhbW1hZXJ0LgorKi8KKworCitzdGF0aWMgdm9pZCBzbWNfc2V0bXVsdGljYXN0KCBpbnQgaW9hZGRyLCBpbnQgY291bnQsIHN0cnVjdCBkZXZfbWNfbGlzdCAqIGFkZHJzICkgeworCWludAkJCWk7CisJdW5zaWduZWQgY2hhcgkJbXVsdGljYXN0X3RhYmxlWyA4IF07CisJc3RydWN0IGRldl9tY19saXN0CSogY3VyX2FkZHI7CisJLyogdGFibGUgZm9yIGZsaXBwaW5nIHRoZSBvcmRlciBvZiAzIGJpdHMgKi8KKwl1bnNpZ25lZCBjaGFyIGludmVydDNbXSA9IHsgMCwgNCwgMiwgNiwgMSwgNSwgMywgNyB9OworCisJLyogc3RhcnQgd2l0aCBhIHRhYmxlIG9mIGFsbCB6ZXJvczogcmVqZWN0IGFsbCAqLworCW1lbXNldCggbXVsdGljYXN0X3RhYmxlLCAwLCBzaXplb2YoIG11bHRpY2FzdF90YWJsZSApICk7CisKKwljdXJfYWRkciA9IGFkZHJzOworCWZvciAoIGkgPSAwOyBpIDwgY291bnQgOyBpICsrLCBjdXJfYWRkciA9IGN1cl9hZGRyLT5uZXh0ICApIHsKKwkJaW50IHBvc2l0aW9uOworCisJCS8qIGRvIHdlIGhhdmUgYSBwb2ludGVyIGhlcmU/ICovCisJCWlmICggIWN1cl9hZGRyICkKKwkJCWJyZWFrOworCQkvKiBtYWtlIHN1cmUgdGhpcyBpcyBhIG11bHRpY2FzdCBhZGRyZXNzIC0gc2hvdWxkbid0IHRoaXMKKwkJICAgYmUgYSBnaXZlbiBpZiB3ZSBoYXZlIGl0IGhlcmUgPyAqLworCQlpZiAoICEoICpjdXJfYWRkci0+ZG1pX2FkZHIgJiAxICkgKQorCQkJY29udGludWU7CisKKwkJLyogb25seSB1c2UgdGhlIGxvdyBvcmRlciBiaXRzICovCisJCXBvc2l0aW9uID0gZXRoZXJfY3JjX2xlKDYsIGN1cl9hZGRyLT5kbWlfYWRkcikgJiAweDNmOworCisJCS8qIGRvIHNvbWUgbWVzc3kgc3dhcHBpbmcgdG8gcHV0IHRoZSBiaXQgaW4gdGhlIHJpZ2h0IHNwb3QgKi8KKwkJbXVsdGljYXN0X3RhYmxlW2ludmVydDNbcG9zaXRpb24mN11dIHw9CisJCQkJCSgxPDxpbnZlcnQzWyhwb3NpdGlvbj4+MykmN10pOworCisJfQorCS8qIG5vdywgdGhlIHRhYmxlIGNhbiBiZSBsb2FkZWQgaW50byB0aGUgY2hpcHNldCAqLworCVNNQ19TRUxFQ1RfQkFOSyggMyApOworCisJZm9yICggaSA9IDA7IGkgPCA4IDsgaSsrICkgeworCQlvdXRiKCBtdWx0aWNhc3RfdGFibGVbaV0sIGlvYWRkciArIE1VTFRJQ0FTVDEgKyBpICk7CisJfQorfQorCisvKgorIC4gRnVuY3Rpb246IHNtY193YWl0X3RvX3NlbmRfcGFja2V0KCBzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKiApCisgLiBQdXJwb3NlOgorIC4gICAgQXR0ZW1wdCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgcGFja2V0LCBpZiBjaGlwLW1lbW9yeSBpcyBub3QKKyAuICAgIGF2YWlsYWJsZSwgdGhlbiB0ZWxsIHRoZSBjYXJkIHRvIGdlbmVyYXRlIGFuIGludGVycnVwdCB3aGVuIGl0CisgLiAgICBpcyBhdmFpbGFibGUuCisgLgorIC4gQWxnb3JpdGhtOgorIC4KKyAuIG8JaWYgdGhlIHNhdmVkX3NrYiBpcyBub3QgY3VycmVudGx5IG51bGwsIHRoZW4gZHJvcCB0aGlzIHBhY2tldAorIC4Jb24gdGhlIGZsb29yLiAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBiZWNhdXNlIG9mIFRCVVNZLgorIC4gbwlpZiB0aGUgc2F2ZWRfc2tiIGlzIG51bGwsIHRoZW4gcmVwbGFjZSBpdCB3aXRoIHRoZSBjdXJyZW50IHBhY2tldCwKKyAuIG8JU2VlIGlmIEkgY2FuIHNlbmRpbmcgaXQgbm93LgorIC4gbyAJKE5PKTogRW5hYmxlIGludGVycnVwdHMgYW5kIGxldCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZGVhbCB3aXRoIGl0LgorIC4gbwkoWUVTKTpTZW5kIGl0IG5vdy4KKyovCitzdGF0aWMgaW50IHNtY193YWl0X3RvX3NlbmRfcGFja2V0KCBzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYgKQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgaW9hZGRyIAk9IGRldi0+YmFzZV9hZGRyOworCXdvcmQgCQkJbGVuZ3RoOworCXVuc2lnbmVkIHNob3J0IAkJbnVtUGFnZXM7CisJd29yZAkJCXRpbWVfb3V0OworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCS8qIFdlbGwsIEkgd2FudCB0byBzZW5kIHRoZSBwYWNrZXQuLiBidXQgSSBkb24ndCBrbm93CisJICAgaWYgSSBjYW4gc2VuZCBpdCByaWdodCBub3cuLi4gICovCisKKwlpZiAoIGxwLT5zYXZlZF9za2IpIHsKKwkJLyogVEhJUyBTSE9VTEQgTkVWRVIgSEFQUEVOLiAqLworCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJcHJpbnRrKENBUkROQU1FIjogQmFkIENyYXppbmVzcyAtIHNlbnQgcGFja2V0IHdoaWxlIGJ1c3kuXG4iICk7CisJCXJldHVybiAxOworCX0KKwlscC0+c2F2ZWRfc2tiID0gc2tiOworCisJbGVuZ3RoID0gc2tiLT5sZW47CisKKwlpZiAobGVuZ3RoIDwgRVRIX1pMRU4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisJCWxlbmd0aCA9IEVUSF9aTEVOOworCX0KKwkJCisJLyoKKwkqKiBUaGUgTU1VIHdhbnRzIHRoZSBudW1iZXIgb2YgcGFnZXMgdG8gYmUgdGhlIG51bWJlciBvZiAyNTYgYnl0ZXMKKwkqKiAncGFnZXMnLCBtaW51cyAxICggc2luY2UgYSBwYWNrZXQgY2FuJ3QgZXZlciBoYXZlIDAgcGFnZXMgOikgKQorCSoqCisJKiogUGt0IHNpemUgZm9yIGFsbG9jYXRpbmcgaXMgZGF0YSBsZW5ndGggKzYgKGZvciBhZGRpdGlvbmFsIHN0YXR1cyB3b3JkcywKKwkqKiBsZW5ndGggYW5kIGN0bCEpIElmIG9kZCBzaXplIGxhc3QgYnl0ZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGhlYWRlci4KKwkqLworCW51bVBhZ2VzID0gICgobGVuZ3RoICYgMHhmZmZlKSArIDYpIC8gMjU2OworCisJaWYgKG51bVBhZ2VzID4gNyApIHsKKwkJcHJpbnRrKENBUkROQU1FIjogRmFyIHRvbyBiaWcgcGFja2V0IGVycm9yLiBcbiIpOworCQkvKiBmcmVlaW5nIHRoZSBwYWNrZXQgaXMgYSBnb29kIHRoaW5nIGhlcmUuLi4gYnV0IHNob3VsZAorCQkgLiBhbnkgcGFja2V0cyBvZiB0aGlzIHNpemUgZ2V0IGRvd24gaGVyZT8gICAqLworCQlkZXZfa2ZyZWVfc2tiIChza2IpOworCQlscC0+c2F2ZWRfc2tiID0gTlVMTDsKKwkJLyogdGhpcyBJUyBhbiBlcnJvciwgYnV0LCBpIGRvbid0IHdhbnQgdGhlIHNrYiBzYXZlZCAqLworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXJldHVybiAwOworCX0KKwkvKiBlaXRoZXIgd2F5LCBhIHBhY2tldCBpcyB3YWl0aW5nIG5vdyAqLworCWxwLT5wYWNrZXRzX3dhaXRpbmcrKzsKKworCS8qIG5vdywgdHJ5IHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkgKi8KKwlTTUNfU0VMRUNUX0JBTksoIDIgKTsKKwlvdXR3KCBNQ19BTExPQyB8IG51bVBhZ2VzLCBpb2FkZHIgKyBNTVVfQ01EICk7CisJLyoKKyAJLiBQZXJmb3JtYW5jZSBIYWNrCisJLgorIAkuIHdhaXQgYSBzaG9ydCBhbW91bnQgb2YgdGltZS4uIGlmIEkgY2FuIHNlbmQgYSBwYWNrZXQgbm93LCBJIHNlbmQKKwkuIGl0IG5vdy4gIE90aGVyd2lzZSwgSSBlbmFibGUgYW4gaW50ZXJydXB0IGFuZCB3YWl0IGZvciBvbmUgdG8gYmUKKwkuIGF2YWlsYWJsZS4KKwkuCisJLiBJIGNvdWxkIGhhdmUgaGFuZGxlZCB0aGlzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHdheSwgYnkgY2hlY2tpbmcgdG8KKwkuIHNlZSBpZiBhbnkgbWVtb3J5IHdhcyBhdmFpbGFibGUgaW4gdGhlIEZSRUUgTUVNT1JZIHJlZ2lzdGVyLiAgSG93ZXZlciwKKwkuIGVpdGhlciB3YXksIEkgbmVlZCB0byBnZW5lcmF0ZSBhbiBhbGxvY2F0aW9uLCBhbmQgdGhlIGFsbG9jYXRpb24gd29ya3MKKwkuIG5vIG1hdHRlciB3aGF0LCBzbyBJIHNhdyBubyBwb2ludCBpbiBjaGVja2luZyBmcmVlIG1lbW9yeS4KKwkqLworCXRpbWVfb3V0ID0gTUVNT1JZX1dBSVRfVElNRTsKKwlkbyB7CisJCXdvcmQJc3RhdHVzOworCisJCXN0YXR1cyA9IGluYiggaW9hZGRyICsgSU5URVJSVVBUICk7CisJCWlmICggc3RhdHVzICYgSU1fQUxMT0NfSU5UICkgeworCQkJLyogYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCAqLworCQkJb3V0YiggSU1fQUxMT0NfSU5ULCBpb2FkZHIgKyBJTlRFUlJVUFQgKTsKKyAgCQkJYnJlYWs7CisJCX0KKyAgIAl9IHdoaWxlICggLS0gdGltZV9vdXQgKTsKKworICAgCWlmICggIXRpbWVfb3V0ICkgeworCQkvKiBvaCB3ZWxsLCB3YWl0IHVudGlsIHRoZSBjaGlwIGZpbmRzIG1lbW9yeSBsYXRlciAqLworCQlTTUNfRU5BQkxFX0lOVCggSU1fQUxMT0NfSU5UICk7CisgICAgICAJCVBSSU5USzIoKENBUkROQU1FIjogbWVtb3J5IGFsbG9jYXRpb24gZGVmZXJyZWQuIFxuIikpOworCQkvKiBpdCdzIGRlZmVycmVkLCBidXQgSSdsbCBoYW5kbGUgaXQgbGF0ZXIgKi8KKyAgICAgIAkJcmV0dXJuIDA7CisgICAJfQorCS8qIG9yIFlFUyEgSSBjYW4gc2VuZCB0aGUgcGFja2V0IG5vdy4uICovCisJc21jX2hhcmR3YXJlX3NlbmRfcGFja2V0KGRldik7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisvKgorIC4gRnVuY3Rpb246ICBzbWNfaGFyZHdhcmVfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKiApCisgLiBQdXJwb3NlOgorIC4JVGhpcyBzZW5kcyB0aGUgYWN0dWFsIHBhY2tldCB0byB0aGUgU01DOXh4eCBjaGlwLgorIC4KKyAuIEFsZ29yaXRobToKKyAuIAlGaXJzdCwgc2VlIGlmIGEgc2F2ZWRfc2tiIGlzIGF2YWlsYWJsZS4KKyAuCQkoIHRoaXMgc2hvdWxkIE5PVCBiZSBjYWxsZWQgaWYgdGhlcmUgaXMgbm8gJ3NhdmVkX3NrYicKKyAuCU5vdywgZmluZCB0aGUgcGFja2V0IG51bWJlciB0aGF0IHRoZSBjaGlwIGFsbG9jYXRlZAorIC4JUG9pbnQgdGhlIGRhdGEgcG9pbnRlcnMgYXQgaXQgaW4gbWVtb3J5CisgLglTZXQgdGhlIGxlbmd0aCB3b3JkIGluIHRoZSBjaGlwJ3MgbWVtb3J5CisgLglEdW1wIHRoZSBwYWNrZXQgdG8gY2hpcCBtZW1vcnkKKyAuCUNoZWNrIGlmIGEgbGFzdCBieXRlIGlzIG5lZWRlZCAoIG9kZCBsZW5ndGggcGFja2V0ICkKKyAuCQlpZiBzbywgc2V0IHRoZSBjb250cm9sIGZsYWcgcmlnaHQKKyAuIAlUZWxsIHRoZSBjYXJkIHRvIHNlbmQgaXQKKyAuCUVuYWJsZSB0aGUgdHJhbnNtaXQgaW50ZXJydXB0LCBzbyBJIGtub3cgaWYgaXQgZmFpbGVkCisgLiAJRnJlZSB0aGUga2VybmVsIGRhdGEgaWYgSSBhY3R1YWxseSBzZW50IGl0LgorKi8KK3N0YXRpYyB2b2lkIHNtY19oYXJkd2FyZV9zZW5kX3BhY2tldCggc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYgKQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlieXRlCSAJCXBhY2tldF9ubzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqIAlza2IgPSBscC0+c2F2ZWRfc2tiOworCXdvcmQJCQlsZW5ndGg7CisJdW5zaWduZWQgaW50CQlpb2FkZHI7CisJYnl0ZQkJCSogYnVmOworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoICFza2IgKSB7CisJCVBSSU5USygoQ0FSRE5BTUUiOiBJbiBYTUlUIHdpdGggbm8gcGFja2V0IHRvIHNlbmQgXG4iKSk7CisJCXJldHVybjsKKwl9CisJbGVuZ3RoID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47CisJYnVmID0gc2tiLT5kYXRhOworCisJLyogSWYgSSBnZXQgaGVyZSwgSSBfa25vd18gdGhlcmUgaXMgYSBwYWNrZXQgc2xvdCB3YWl0aW5nIGZvciBtZSAqLworCXBhY2tldF9ubyA9IGluYiggaW9hZGRyICsgUE5SX0FSUiArIDEgKTsKKwlpZiAoIHBhY2tldF9ubyAmIDB4ODAgKSB7CisJCS8qIG9yIGlzbid0IHRoZXJlPyAgQkFEIENISVAhICovCisJCXByaW50ayhLRVJOX0RFQlVHIENBUkROQU1FIjogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiBcbiIpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlscC0+c2F2ZWRfc2tiID0gTlVMTDsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlyZXR1cm47CisJfQorCisJLyogd2UgaGF2ZSBhIHBhY2tldCBhZGRyZXNzLCBzbyB0ZWxsIHRoZSBjYXJkIHRvIHVzZSBpdCAqLworCW91dGIoIHBhY2tldF9ubywgaW9hZGRyICsgUE5SX0FSUiApOworCisJLyogcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0ICovCisJb3V0dyggUFRSX0FVVE9JTkMgLCBpb2FkZHIgKyBQT0lOVEVSICk7CisKKyAgIAlQUklOVEszKChDQVJETkFNRSI6IFRyeWluZyB0byB4bWl0IHBhY2tldCBvZiBsZW5ndGggJXhcbiIsIGxlbmd0aCApKTsKKyNpZiBTTUNfREVCVUcgPiAyCisJcHJpbnRfcGFja2V0KCBidWYsIGxlbmd0aCApOworI2VuZGlmCisKKwkvKiBzZW5kIHRoZSBwYWNrZXQgbGVuZ3RoICggKzYgZm9yIHN0YXR1cywgbGVuZ3RoIGFuZCBjdGwgYnl0ZSApCisgCSAgIGFuZCB0aGUgc3RhdHVzIHdvcmQgKCBzZXQgdG8gemVyb3MgKSAqLworI2lmZGVmIFVTRV8zMl9CSVQKKwlvdXRsKCAgKGxlbmd0aCArNiApIDw8IDE2ICwgaW9hZGRyICsgREFUQV8xICk7CisjZWxzZQorCW91dHcoIDAsIGlvYWRkciArIERBVEFfMSApOworCS8qIHNlbmQgdGhlIHBhY2tldCBsZW5ndGggKCArNiBmb3Igc3RhdHVzIHdvcmRzLCBsZW5ndGgsIGFuZCBjdGwqLworCW91dGIoIChsZW5ndGgrNikgJiAweEZGLGlvYWRkciArIERBVEFfMSApOworCW91dGIoIChsZW5ndGgrNikgPj4gOCAsIGlvYWRkciArIERBVEFfMSApOworI2VuZGlmCisKKwkvKiBzZW5kIHRoZSBhY3R1YWwgZGF0YQorCSAuIEkgX3RoaW5rXyBpdCdzIGZhc3RlciB0byBzZW5kIHRoZSBsb25ncyBmaXJzdCwgYW5kIHRoZW4KKwkgLiBtb3AgdXAgYnkgc2VuZGluZyB0aGUgbGFzdCB3b3JkLiAgSXQgZGVwZW5kcyBoZWF2aWx5CisgCSAuIG9uIGFsaWdubWVudCwgYXQgbGVhc3Qgb24gdGhlIDQ4Ni4gIE1heWJlIGl0IHdvdWxkIGJlCisgCSAuIGEgZ29vZCBpZGVhIHRvIGNoZWNrIHdoaWNoIGlzIG9wdGltYWw/ICBCdXQgdGhhdCBjb3VsZCB0YWtlCisJIC4gYWxtb3N0IGFzIG11Y2ggdGltZSBhcyBpcyBzYXZlZD8KKwkqLworI2lmZGVmIFVTRV8zMl9CSVQKKwlpZiAoIGxlbmd0aCAmIDB4MiAgKSB7CisJCW91dHNsKGlvYWRkciArIERBVEFfMSwgYnVmLCAgbGVuZ3RoID4+IDIgKTsKKyNpZiAhZGVmaW5lZChfX0g4MzAwSF9fKSAmJiAhZGVmaW5lZChfX0g4MzAwU19fKQorCQlvdXR3KCAqKCh3b3JkICopKGJ1ZiArIChsZW5ndGggJiAweEZGRkZGRkZDKSkpLGlvYWRkciArREFUQV8xKTsKKyNlbHNlCisJCWN0cmxfb3V0dyggKigod29yZCAqKShidWYgKyAobGVuZ3RoICYgMHhGRkZGRkZGQykpKSxpb2FkZHIgK0RBVEFfMSk7CisjZW5kaWYKKwl9CisJZWxzZQorCQlvdXRzbChpb2FkZHIgKyBEQVRBXzEsIGJ1ZiwgIGxlbmd0aCA+PiAyICk7CisjZWxzZQorCW91dHN3KGlvYWRkciArIERBVEFfMSAsIGJ1ZiwgKGxlbmd0aCApID4+IDEpOworI2VuZGlmCisJLyogU2VuZCB0aGUgbGFzdCBieXRlLCBpZiB0aGVyZSBpcyBvbmUuICAgKi8KKworCWlmICggKGxlbmd0aCAmIDEpID09IDAgKSB7CisJCW91dHcoIDAsIGlvYWRkciArIERBVEFfMSApOworCX0gZWxzZSB7CisJCW91dGIoIGJ1ZltsZW5ndGggLTEgXSwgaW9hZGRyICsgREFUQV8xICk7CisJCW91dGIoIDB4MjAsIGlvYWRkciArIERBVEFfMSk7CisJfQorCisJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHRzICovCisJU01DX0VOQUJMRV9JTlQoIChJTV9UWF9JTlQgfCBJTV9UWF9FTVBUWV9JTlQpICk7CisKKwkvKiBhbmQgbGV0IHRoZSBjaGlwc2V0IGRlYWwgd2l0aCBpdCAqLworCW91dHcoIE1DX0VOUVVFVUUgLCBpb2FkZHIgKyBNTVVfQ01EICk7CisKKwlQUklOVEsyKChDQVJETkFNRSI6IFNlbnQgcGFja2V0IG9mIGxlbmd0aCAlZCBcbiIsbGVuZ3RoKSk7CisKKwlscC0+c2F2ZWRfc2tiID0gTlVMTDsKKwlkZXZfa2ZyZWVfc2tiX2FueSAoc2tiKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogd2UgY2FuIHNlbmQgYW5vdGhlciBwYWNrZXQgKi8KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlyZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwKKyB8IHNtY19pbml0KGludCB1bml0KQorIHwgICBJbnB1dCBwYXJhbWV0ZXJzOgorIHwJZGV2LT5iYXNlX2FkZHIgPT0gMCwgdHJ5IHRvIGZpbmQgYWxsIHBvc3NpYmxlIGxvY2F0aW9ucworIHwJZGV2LT5iYXNlX2FkZHIgPT0gMSwgcmV0dXJuIGZhaWx1cmUgY29kZQorIHwJZGV2LT5iYXNlX2FkZHIgPT0gMiwgYWx3YXlzIGFsbG9jYXRlIHNwYWNlLCAgYW5kIHJldHVybiBzdWNjZXNzCisgfAlkZXYtPmJhc2VfYWRkciA9PSA8YW55dGhpbmcgZWxzZT4gICB0aGlzIGlzIHRoZSBhZGRyZXNzIHRvIGNoZWNrCisgfAorIHwgICBPdXRwdXQ6CisgfAlwb2ludGVyIHRvIG5ldF9kZXZpY2Ugb3IgRVJSX1BUUihlcnJvcikKKyB8CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIGludCBpbzsKK3N0YXRpYyBpbnQgaXJxOworc3RhdGljIGludCBpZnBvcnQ7CisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IHNtY19pbml0KGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHNtY19sb2NhbCkpOworCXN0YXRpYyBzdHJ1Y3QgZGV2bGlzdCAqc21jZGV2ID0gc21jX2Rldmxpc3Q7CisJaW50IGVyciA9IDA7CisKKyNpZm5kZWYgTk9fQVVUT1BST0JFCisJc21jZGV2ID0gc21jX2Rldmxpc3Q7CisjZW5kaWYKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwkJaW8gPSBkZXYtPmJhc2VfYWRkcjsKKwkJaXJxID0gZGV2LT5pcnE7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKGlvID4gMHgxZmYpIHsJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQllcnIgPSBzbWNfcHJvYmUoZGV2LCBpbyk7CisJfSBlbHNlIGlmIChpbyAhPSAwKSB7CS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJZXJyID0gLUVOWElPOworCX0gZWxzZSB7CisJCWZvciAoO3NtY2Rldi0+cG9ydDsgc21jZGV2KyspIHsKKwkJCWlmIChzbWNfcHJvYmUoZGV2LCBzbWNkZXYtPnBvcnQpID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFzbWNkZXYtPnBvcnQpCisJCQllcnIgPSAtRU5PREVWOworCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNNQ19JT19FWFRFTlQpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLiBzbWNfZmluZGlycQorIC4KKyAuIFRoaXMgcm91dGluZSBoYXMgYSBzaW1wbGUgcHVycG9zZSAtLSBtYWtlIHRoZSBTTUMgY2hpcCBnZW5lcmF0ZSBhbgorIC4gaW50ZXJydXB0LCBzbyBhbiBhdXRvLWRldGVjdCByb3V0aW5lIGNhbiBkZXRlY3QgaXQsIGFuZCBmaW5kIHRoZSBJUlEsCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworaW50IF9faW5pdCBzbWNfZmluZGlycSggaW50IGlvYWRkciApCit7CisjaWZuZGVmIE5PX0FVVE9QUk9CRQorCWludAl0aW1lb3V0ID0gMjA7CisJdW5zaWduZWQgbG9uZyBjb29raWU7CisKKworCWNvb2tpZSA9IHByb2JlX2lycV9vbigpOworCisJLyoKKwkgKiBXaGF0IEkgdHJ5IHRvIGRvIGhlcmUgaXMgdHJpZ2dlciBhbiBBTExPQ19JTlQuIFRoaXMgaXMgZG9uZQorCSAqIGJ5IGFsbG9jYXRpbmcgYSBzbWFsbCBjaHVuayBvZiBtZW1vcnksIHdoaWNoIHdpbGwgZ2l2ZSBhbiBpbnRlcnJ1cHQKKwkgKiB3aGVuIGRvbmUuCisJICovCisKKworCVNNQ19TRUxFQ1RfQkFOSygyKTsKKwkvKiBlbmFibGUgQUxMT0NhdGlvbiBpbnRlcnJ1cHRzIE9OTFkgKi8KKwlvdXRiKCBJTV9BTExPQ19JTlQsIGlvYWRkciArIElOVF9NQVNLICk7CisKKwkvKgorIAkgLiBBbGxvY2F0ZSA1MTIgYnl0ZXMgb2YgbWVtb3J5LiAgTm90ZSB0aGF0IHRoZSBjaGlwIHdhcyBqdXN0CisJIC4gcmVzZXQgc28gYWxsIHRoZSBtZW1vcnkgaXMgYXZhaWxhYmxlCisJKi8KKwlvdXR3KCBNQ19BTExPQyB8IDEsIGlvYWRkciArIE1NVV9DTUQgKTsKKworCS8qCisJIC4gV2FpdCB1bnRpbCBwb3NpdGl2ZSB0aGF0IHRoZSBpbnRlcnJ1cHQgaGFzIGJlZW4gZ2VuZXJhdGVkCisJKi8KKwl3aGlsZSAoIHRpbWVvdXQgKSB7CisJCWJ5dGUJaW50X3N0YXR1czsKKworCQlpbnRfc3RhdHVzID0gaW5iKCBpb2FkZHIgKyBJTlRFUlJVUFQgKTsKKworCQlpZiAoIGludF9zdGF0dXMgJiBJTV9BTExPQ19JTlQgKQorCQkJYnJlYWs7CQkvKiBnb3QgdGhlIGludGVycnVwdCAqLworCQl0aW1lb3V0LS07CisJfQorCS8qIHRoZXJlIGlzIHJlYWxseSBub3RoaW5nIHRoYXQgSSBjYW4gZG8gaGVyZSBpZiB0aW1lb3V0IGZhaWxzLAorCSAgIGFzIHByb2JlX2lycV9vZmYgd2lsbCByZXR1cm4gYSAwIGFueXdheSwgd2hpY2ggaXMgd2hhdCBJCisJICAgd2FudCBpbiB0aGlzIGNhc2UuICAgUGx1cywgdGhlIGNsZWFuIHVwIGlzIG5lZWRlZCBpbiBib3RoCisJICAgY2FzZXMuICAqLworCisJLyogREVMQVkgSEVSRSEKKwkgICBPbiBhIGZhc3QgbWFjaGluZSwgdGhlIHN0YXR1cyBtaWdodCBjaGFuZ2UgYmVmb3JlIHRoZSBpbnRlcnJ1cHQKKwkgICBpcyBnaXZlbiB0byB0aGUgcHJvY2Vzc29yLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBpbnRlcnJ1cHQgd2FzCisJICAgbmV2ZXIgZGV0ZWN0ZWQsIGFuZCBwcm9iZV9pcnFfb2ZmIGZhaWxzIHRvIHJlcG9ydCBhbnl0aGluZy4KKwkgICBUaGlzIHNob3VsZCBmaXggcHJvYmVfaXJxXyogcHJvYmxlbXMuCisJKi8KKwlTTUNfREVMQVkoKTsKKwlTTUNfREVMQVkoKTsKKworCS8qIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGFnYWluICovCisJb3V0YiggMCwgaW9hZGRyICsgSU5UX01BU0sgKTsKKworCS8qIGFuZCByZXR1cm4gd2hhdCBJIGZvdW5kICovCisJcmV0dXJuIHByb2JlX2lycV9vZmYoY29va2llKTsKKyNlbHNlIC8qIE5PX0FVVE9QUk9CRSAqLworCXN0cnVjdCBkZXZsaXN0ICpzbWNkZXY7CisJZm9yIChzbWNkZXYgPSBzbWNfZGV2bGlzdDsgc21jZGV2LT5wb3J0OyBzbWNkZXYrKykgeworCQlpZiAoc21jZGV2LT5wb3J0ID09IGlvYWRkcikKKwkJCXJldHVybiBzbWNkZXYtPmlycTsKKwl9CisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLiBGdW5jdGlvbjogc21jX3Byb2JlKCBpbnQgaW9hZGRyICkKKyAuCisgLiBQdXJwb3NlOgorIC4JVGVzdHMgdG8gc2VlIGlmIGEgZ2l2ZW4gaW9hZGRyIHBvaW50cyB0byBhbiBTTUM5eHh4IGNoaXAuCisgLglSZXR1cm5zIGEgMCBvbiBzdWNjZXNzCisgLgorIC4gQWxnb3JpdGhtOgorIC4JKDEpIHNlZSBpZiB0aGUgaGlnaCBieXRlIG9mIEJBTktfU0VMRUNUIGlzIDB4MzMKKyAuIAkoMikgY29tcGFyZSB0aGUgaW9hZGRyIHdpdGggdGhlIGJhc2UgcmVnaXN0ZXIncyBhZGRyZXNzCisgLgkoMykgc2VlIGlmIEkgcmVjb2duaXplIHRoZSBjaGlwIElEIGluIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcgorIC4KKyAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAuIEhlcmUgSSBkbyB0eXBpY2FsIGluaXRpYWxpemF0aW9uIHRhc2tzLgorIC4KKyAuIG8gIEluaXRpYWxpemUgdGhlIHN0cnVjdHVyZSBpZiBuZWVkZWQKKyAuIG8gIHByaW50IG91dCBteSB2YW5pdHkgbWVzc2FnZSBpZiBub3QgZG9uZSBzbyBhbHJlYWR5CisgLiBvICBwcmludCBvdXQgd2hhdCB0eXBlIG9mIGhhcmR3YXJlIGlzIGRldGVjdGVkCisgLiBvICBwcmludCBvdXQgdGhlIGV0aGVybmV0IGFkZHJlc3MKKyAuIG8gIGZpbmQgdGhlIElSUQorIC4gbyAgc2V0IHVwIG15IHByaXZhdGUgZGF0YQorIC4gbyAgY29uZmlndXJlIHRoZSBkZXYgc3RydWN0dXJlIHdpdGggbXkgc3Vicm91dGluZXMKKyAuIG8gIGFjdHVhbGx5IEdSQUIgdGhlIGlycS4KKyAuIG8gIEdSQUIgdGhlIHJlZ2lvbgorIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBpbnQgX19pbml0IHNtY19wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKQoreworCWludCBpLCBtZW1vcnksIHJldHZhbDsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCXVuc2lnbmVkIGludCBiYW5rOworCisJY29uc3QgY2hhciAqdmVyc2lvbl9zdHJpbmc7CisJY29uc3QgY2hhciAqaWZfc3RyaW5nOworCisJLyogcmVnaXN0ZXJzICovCisJd29yZCByZXZpc2lvbl9yZWdpc3RlcjsKKwl3b3JkIGJhc2VfYWRkcmVzc19yZWdpc3RlcjsKKwl3b3JkIGNvbmZpZ3VyYXRpb25fcmVnaXN0ZXI7CisJd29yZCBtZW1vcnlfaW5mb19yZWdpc3RlcjsKKwl3b3JkIG1lbW9yeV9jZmdfcmVnaXN0ZXI7CisKKwkvKiBHcmFiIHRoZSByZWdpb24gc28gdGhhdCBubyBvbmUgZWxzZSB0cmllcyB0byBwcm9iZSBvdXIgaW9wb3J0cy4gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgU01DX0lPX0VYVEVOVCwgRFJWX05BTUUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5pZl9wb3J0ID0gaWZwb3J0OworCisJLyogRmlyc3QsIHNlZSBpZiB0aGUgaGlnaCBieXRlIGlzIDB4MzMgKi8KKwliYW5rID0gaW53KCBpb2FkZHIgKyBCQU5LX1NFTEVDVCApOworCWlmICggKGJhbmsgJiAweEZGMDApICE9IDB4MzMwMCApIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBUaGUgYWJvdmUgTUlHSFQgaW5kaWNhdGUgYSBkZXZpY2UsIGJ1dCBJIG5lZWQgdG8gd3JpdGUgdG8gZnVydGhlcgorIAkgCXRlc3QgdGhpcy4gICovCisJb3V0dyggMHgwLCBpb2FkZHIgKyBCQU5LX1NFTEVDVCApOworCWJhbmsgPSBpbncoIGlvYWRkciArIEJBTktfU0VMRUNUICk7CisJaWYgKCAoYmFuayAmIDB4RkYwMCApICE9IDB4MzMwMCApIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKyNpZiAhZGVmaW5lZChDT05GSUdfSDhTX0VET1NLMjY3NCkKKwkvKiB3ZWxsLCB3ZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gb25jZSwgc28gaG9wZWZ1bGx5IGFub3RoZXIgdGltZSB3b24ndAorIAkgICBodXJ0LiAgVGhpcyB0aW1lLCBJIG5lZWQgdG8gc3dpdGNoIHRoZSBiYW5rIHJlZ2lzdGVyIHRvIGJhbmsgMSwKKwkgICBzbyBJIGNhbiBhY2Nlc3MgdGhlIGJhc2UgYWRkcmVzcyByZWdpc3RlciAqLworCVNNQ19TRUxFQ1RfQkFOSygxKTsKKwliYXNlX2FkZHJlc3NfcmVnaXN0ZXIgPSBpbncoIGlvYWRkciArIEJBU0UgKTsKKwlpZiAoIGlvYWRkciAhPSAoIGJhc2VfYWRkcmVzc19yZWdpc3RlciA+PiAzICYgMHgzRTAgKSApICB7CisJCXByaW50ayhDQVJETkFNRSAiOiBJT0FERFIgJXggZG9lc24ndCBtYXRjaCBjb25maWd1cmF0aW9uICgleCkuIgorCQkJIlByb2JhYmx5IG5vdCBhIFNNQyBjaGlwXG4iLAorCQkJaW9hZGRyLCBiYXNlX2FkZHJlc3NfcmVnaXN0ZXIgPj4gMyAmIDB4M0UwICk7CisJCS8qIHdlbGwsIHRoZSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgZGlkbid0IG1hdGNoLiAgTXVzdCBub3QgaGF2ZQorCQkgICBiZWVuIGEgU01DIGNoaXAgYWZ0ZXIgYWxsLiAqLworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorI2Vsc2UKKwkodm9pZCliYXNlX2FkZHJlc3NfcmVnaXN0ZXI7IC8qIFdhcm5pbmcgc3VwcHJlc3Npb24gKi8KKyNlbmRpZgorCisKKwkvKiAgY2hlY2sgaWYgdGhlIHJldmlzaW9uIHJlZ2lzdGVyIGlzIHNvbWV0aGluZyB0aGF0IEkgcmVjb2duaXplLgorCSAgICBUaGVzZSBtaWdodCBuZWVkIHRvIGJlIGFkZGVkIHRvIGxhdGVyLCBhcyBmdXR1cmUgcmV2aXNpb25zCisJICAgIGNvdWxkIGJlIGFkZGVkLiAgKi8KKwlTTUNfU0VMRUNUX0JBTksoMyk7CisJcmV2aXNpb25fcmVnaXN0ZXIgID0gaW53KCBpb2FkZHIgKyBSRVZJU0lPTiApOworCWlmICggIWNoaXBfaWRzWyAoIHJldmlzaW9uX3JlZ2lzdGVyICA+PiA0ICkgJiAweEYgIF0gKSB7CisJCS8qIEkgZG9uJ3QgcmVjb2duaXplIHRoaXMgY2hpcCwgc28uLi4gKi8KKwkJcHJpbnRrKENBUkROQU1FICI6IElPICV4OiBVbnJlY29nbml6ZWQgcmV2aXNpb24gcmVnaXN0ZXI6IgorCQkJIiAleCwgQ29udGFjdCBhdXRob3IuIFxuIiwgaW9hZGRyLCByZXZpc2lvbl9yZWdpc3RlciApOworCisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBhdCB0aGlzIHBvaW50IEknbGwgYXNzdW1lIHRoYXQgdGhlIGNoaXAgaXMgYW4gU01DOXh4eC4KKwkgICBJdCBtaWdodCBiZSBwcnVkZW50IHRvIGNoZWNrIGEgbGlzdGluZyBvZiBNQUMgYWRkcmVzc2VzCisJICAgYWdhaW5zdCB0aGUgaGFyZHdhcmUgYWRkcmVzcywgb3IgZG8gc29tZSBvdGhlciB0ZXN0cy4gKi8KKworCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoIiVzIiwgdmVyc2lvbik7CisKKwkvKiBmaWxsIGluIHNvbWUgb2YgdGhlIGZpZWxkcyAqLworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJLyoKKyAJIC4gR2V0IHRoZSBNQUMgYWRkcmVzcyAoIGJhbmsgMSwgcmVncyA0IC0gOSApCisJKi8KKwlTTUNfU0VMRUNUX0JBTksoIDEgKTsKKwlmb3IgKCBpID0gMDsgaSA8IDY7IGkgKz0gMiApIHsKKwkJd29yZAlhZGRyZXNzOworCisJCWFkZHJlc3MgPSBpbncoIGlvYWRkciArIEFERFIwICsgaSAgKTsKKwkJZGV2LT5kZXZfYWRkclsgaSArIDFdID0gYWRkcmVzcyA+PiA4OworCQlkZXYtPmRldl9hZGRyWyBpIF0gPSBhZGRyZXNzICYgMHhGRjsKKwl9CisKKwkvKiBnZXQgdGhlIG1lbW9yeSBpbmZvcm1hdGlvbiAqLworCisJU01DX1NFTEVDVF9CQU5LKCAwICk7CisJbWVtb3J5X2luZm9fcmVnaXN0ZXIgPSBpbncoIGlvYWRkciArIE1JUiApOworCW1lbW9yeV9jZmdfcmVnaXN0ZXIgID0gaW53KCBpb2FkZHIgKyBNQ1IgKTsKKwltZW1vcnkgPSAoIG1lbW9yeV9jZmdfcmVnaXN0ZXIgPj4gOSApICAmIDB4NzsgIC8qIG11bHRpcGxpZXIgKi8KKwltZW1vcnkgKj0gMjU2ICogKCBtZW1vcnlfaW5mb19yZWdpc3RlciAmIDB4RkYgKTsKKworCS8qCisJIE5vdywgSSB3YW50IHRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgdGhlIGNoaXAuICBUaGlzIGlzIHNvcnQgb2YKKyAJIHJlZHVuZGFudCwgYnV0IGl0J3MgY2xlYW5lciB0byBoYXZlIGl0IGluIGJvdGgsIHJhdGhlciB0aGFuIGhhdmluZworIAkgb25lIFZFUlkgbG9uZyBwcm9iZSBwcm9jZWR1cmUuCisJKi8KKwlTTUNfU0VMRUNUX0JBTksoMyk7CisJcmV2aXNpb25fcmVnaXN0ZXIgID0gaW53KCBpb2FkZHIgKyBSRVZJU0lPTiApOworCXZlcnNpb25fc3RyaW5nID0gY2hpcF9pZHNbICggcmV2aXNpb25fcmVnaXN0ZXIgID4+IDQgKSAmIDB4RiAgXTsKKwlpZiAoICF2ZXJzaW9uX3N0cmluZyApIHsKKwkJLyogSSBzaG91bGRuJ3QgZ2V0IGhlcmUgYmVjYXVzZSB0aGlzIGNhbGwgd2FzIGRvbmUgYmVmb3JlLi4uLiAqLworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogaXMgaXQgdXNpbmcgQVVJIG9yIDEwQmFzZVQgPyAqLworCWlmICggZGV2LT5pZl9wb3J0ID09IDAgKSB7CisJCVNNQ19TRUxFQ1RfQkFOSygxKTsKKwkJY29uZmlndXJhdGlvbl9yZWdpc3RlciA9IGludyggaW9hZGRyICsgQ09ORklHICk7CisJCWlmICggY29uZmlndXJhdGlvbl9yZWdpc3RlciAmIENGR19BVUlfU0VMRUNUICkKKwkJCWRldi0+aWZfcG9ydCA9IDI7CisJCWVsc2UKKwkJCWRldi0+aWZfcG9ydCA9IDE7CisJfQorCWlmX3N0cmluZyA9IGludGVyZmFjZXNbIGRldi0+aWZfcG9ydCAtIDEgXTsKKworCS8qIG5vdywgcmVzZXQgdGhlIGNoaXAsIGFuZCBwdXQgaXQgaW50byBhIGtub3duIHN0YXRlICovCisJc21jX3Jlc2V0KCBpb2FkZHIgKTsKKworCS8qCisJIC4gSWYgZGV2LT5pcnEgaXMgMCwgdGhlbiB0aGUgZGV2aWNlIGhhcyB0byBiZSBiYW5nZWQgb24gdG8gc2VlCisJIC4gd2hhdCB0aGUgSVJRIGlzLgorIAkgLgorCSAuIFRoaXMgYmFuZ2luZyBkb2Vzbid0IGFsd2F5cyBkZXRlY3QgdGhlIElSUSwgZm9yIHVua25vd24gcmVhc29ucy4KKwkgLiBhIHdvcmthcm91bmQgaXMgdG8gcmVzZXQgdGhlIGNoaXAgYW5kIHRyeSBhZ2Fpbi4KKwkgLgorCSAuIEludGVyZXN0aW5nbHksIHRoZSBET1MgcGFja2V0IGRyaXZlciAqU0VUUyogdGhlIElSUSBvbiB0aGUgY2FyZCB0bworCSAuIGJlIHdoYXQgaXMgcmVxdWVzdGVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICAgSSBkb24ndCBkbyB0aGF0LCBtb3N0bHkKKwkgLiBiZWNhdXNlIHRoZSBjYXJkIHRoYXQgSSBoYXZlIHVzZXMgYSBub24tc3RhbmRhcmQgbWV0aG9kIG9mIGFjY2Vzc2luZworCSAuIHRoZSBJUlFzLCBhbmQgYmVjYXVzZSB0aGlzIF9zaG91bGRfIHdvcmsgaW4gbW9zdCBjb25maWd1cmF0aW9ucy4KKwkgLgorCSAuIFNwZWNpZnlpbmcgYW4gSVJRIGlzIGRvbmUgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSB1c2VyIGtub3dzCisJIC4gd2hhdCAocyloZSBpcyBkb2luZy4gIE5vIGNoZWNraW5nIGlzIGRvbmUhISEhCisgCSAuCisJKi8KKwlpZiAoIGRldi0+aXJxIDwgMiApIHsKKwkJaW50CXRyaWFsczsKKworCQl0cmlhbHMgPSAzOworCQl3aGlsZSAoIHRyaWFscy0tICkgeworCQkJZGV2LT5pcnEgPSBzbWNfZmluZGlycSggaW9hZGRyICk7CisJCQlpZiAoIGRldi0+aXJxICkKKwkJCQlicmVhazsKKwkJCS8qIGtpY2sgdGhlIGNhcmQgYW5kIHRyeSBhZ2FpbiAqLworCQkJc21jX3Jlc2V0KCBpb2FkZHIgKTsKKwkJfQorCX0KKwlpZiAoZGV2LT5pcnEgPT0gMCApIHsKKwkJcHJpbnRrKENBUkROQU1FIjogQ291bGRuJ3QgYXV0b2RldGVjdCB5b3VyIElSUS4gVXNlIGlycT14eC5cbiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogbm93LCBwcmludCBvdXQgdGhlIGNhcmQgaW5mbywgaW4gYSBzaG9ydCBmb3JtYXQuLiAqLworCisJcHJpbnRrKCIlczogJXMocjolZCkgYXQgJSMzeCBJUlE6JWQgSU5URjolcyBNRU06JWRiICIsIGRldi0+bmFtZSwKKwkJdmVyc2lvbl9zdHJpbmcsIHJldmlzaW9uX3JlZ2lzdGVyICYgMHhGLCBpb2FkZHIsIGRldi0+aXJxLAorCQlpZl9zdHJpbmcsIG1lbW9yeSApOworCS8qCisJIC4gUHJpbnQgdGhlIEV0aGVybmV0IGFkZHJlc3MKKwkqLworCXByaW50aygiQUREUjogIik7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJcHJpbnRrKCIlMi4yeDoiLCBkZXYtPmRldl9hZGRyW2ldICk7CisJcHJpbnRrKCIlMi4yeCBcbiIsIGRldi0+ZGV2X2FkZHJbNV0gKTsKKworCS8qIHNldCB0aGUgcHJpdmF0ZSBkYXRhIHRvIHplcm8gYnkgZGVmYXVsdCAqLworCW1lbXNldChkZXYtPnByaXYsIDAsIHNpemVvZihzdHJ1Y3Qgc21jX2xvY2FsKSk7CisKKwkvKiBHcmFiIHRoZSBJUlEgKi8KKyAgICAgIAlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnNtY19pbnRlcnJ1cHQsIDAsIERSVl9OQU1FLCBkZXYpOworICAgICAgCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGdldCBJUlEgJWQgKGlycXZhbD0lZCkuXG4iLCBEUlZfTkFNRSwKKwkJCWRldi0+aXJxLCByZXR2YWwpOworICAJICAJZ290byBlcnJfb3V0OworICAgICAgCX0KKworCWRldi0+b3BlbgkJICAgICAgICA9IHNtY19vcGVuOworCWRldi0+c3RvcAkJICAgICAgICA9IHNtY19jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCAgICAJPSBzbWNfd2FpdF90b19zZW5kX3BhY2tldDsKKwlkZXYtPnR4X3RpbWVvdXQJCSAgICAJPSBzbWNfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCQk9IEhaLzIwOworCWRldi0+Z2V0X3N0YXRzCQkJPSBzbWNfcXVlcnlfc3RhdGlzdGljczsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCAJPSBzbWNfc2V0X211bHRpY2FzdF9saXN0OworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBTTUNfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisjaWYgU01DX0RFQlVHID4gMgorc3RhdGljIHZvaWQgcHJpbnRfcGFja2V0KCBieXRlICogYnVmLCBpbnQgbGVuZ3RoICkKK3sKKyNpZiAwCisJaW50IGk7CisJaW50IHJlbWFpbmRlcjsKKwlpbnQgbGluZXM7CisKKwlwcmludGsoIlBhY2tldCBvZiBsZW5ndGggJWQgXG4iLCBsZW5ndGggKTsKKwlsaW5lcyA9IGxlbmd0aCAvIDE2OworCXJlbWFpbmRlciA9IGxlbmd0aCAlIDE2OworCisJZm9yICggaSA9IDA7IGkgPCBsaW5lcyA7IGkgKysgKSB7CisJCWludCBjdXI7CisKKwkJZm9yICggY3VyID0gMDsgY3VyIDwgODsgY3VyICsrICkgeworCQkJYnl0ZSBhLCBiOworCisJCQlhID0gKihidWYgKysgKTsKKwkJCWIgPSAqKGJ1ZiArKyApOworCQkJcHJpbnRrKCIlMDJ4JTAyeCAiLCBhLCBiICk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KKwlmb3IgKCBpID0gMDsgaSA8IHJlbWFpbmRlci8yIDsgaSsrICkgeworCQlieXRlIGEsIGI7CisKKwkJYSA9ICooYnVmICsrICk7CisJCWIgPSAqKGJ1ZiArKyApOworCQlwcmludGsoIiUwMnglMDJ4ICIsIGEsIGIgKTsKKwl9CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCit9CisjZW5kaWYKKworCisvKgorICogT3BlbiBhbmQgSW5pdGlhbGl6ZSB0aGUgYm9hcmQKKyAqCisgKiBTZXQgdXAgZXZlcnl0aGluZywgcmVzZXQgdGhlIGNhcmQsIGV0YyAuLgorICoKKyAqLworc3RhdGljIGludCBzbWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludAlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWludAlpOwkvKiB1c2VkIHRvIHNldCBodyBldGhlcm5ldCBhZGRyZXNzICovCisKKwkvKiBjbGVhciBvdXQgYWxsIHRoZSBqdW5rIHRoYXQgd2FzIHB1dCBoZXJlIGJlZm9yZS4uLiAqLworCW1lbXNldChkZXYtPnByaXYsIDAsIHNpemVvZihzdHJ1Y3Qgc21jX2xvY2FsKSk7CisKKwkvKiByZXNldCB0aGUgaGFyZHdhcmUgKi8KKworCXNtY19yZXNldCggaW9hZGRyICk7CisJc21jX2VuYWJsZSggaW9hZGRyICk7CisKKwkvKiBTZWxlY3Qgd2hpY2ggaW50ZXJmYWNlIHRvIHVzZSAqLworCisJU01DX1NFTEVDVF9CQU5LKCAxICk7CisJaWYgKCBkZXYtPmlmX3BvcnQgPT0gMSApIHsKKwkJb3V0dyggaW53KCBpb2FkZHIgKyBDT05GSUcgKSAmIH5DRkdfQVVJX1NFTEVDVCwKKwkJCWlvYWRkciArIENPTkZJRyApOworCX0KKwllbHNlIGlmICggZGV2LT5pZl9wb3J0ID09IDIgKSB7CisJCW91dHcoIGludyggaW9hZGRyICsgQ09ORklHICkgfCBDRkdfQVVJX1NFTEVDVCwKKwkJCWlvYWRkciArIENPTkZJRyApOworCX0KKworCS8qCisgIAkJQWNjb3JkaW5nIHRvIEJlY2tlciwgSSBoYXZlIHRvIHNldCB0aGUgaGFyZHdhcmUgYWRkcmVzcworCQlhdCB0aGlzIHBvaW50LCBiZWNhdXNlIHRoZSAobCl1c2VyIGNhbiBzZXQgaXQgd2l0aCBhbgorCQlpb2N0bC4gIEVhc2lseSBkb25lLi4uCisJKi8KKwlTTUNfU0VMRUNUX0JBTksoIDEgKTsKKwlmb3IgKCBpID0gMDsgaSA8IDY7IGkgKz0gMiApIHsKKwkJd29yZAlhZGRyZXNzOworCisJCWFkZHJlc3MgPSBkZXYtPmRldl9hZGRyWyBpICsgMSBdIDw8IDggOworCQlhZGRyZXNzICB8PSBkZXYtPmRldl9hZGRyWyBpIF07CisJCW91dHcoIGFkZHJlc3MsIGlvYWRkciArIEFERFIwICsgaSApOworCX0KKwkKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLiBDYWxsZWQgYnkgdGhlIGtlcm5lbCB0byBzZW5kIGEgcGFja2V0IG91dCBpbnRvIHRoZSB2b2lkCisgLiBvZiB0aGUgbmV0LiAgVGhpcyByb3V0aW5lIGlzIGxhcmdlbHkgYmFzZWQgb24KKyAuIHNrZWxldG9uLmMsIGZyb20gQmVja2VyLgorIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworc3RhdGljIHZvaWQgc21jX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBJZiB3ZSBnZXQgaGVyZSwgc29tZSBoaWdoZXIgbGV2ZWwgaGFzIGRlY2lkZWQgd2UgYXJlIGJyb2tlbi4KKwkgICBUaGVyZSBzaG91bGQgcmVhbGx5IGJlIGEgImtpY2sgbWUiIGZ1bmN0aW9uIGNhbGwgaW5zdGVhZC4gKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HIENBUkROQU1FIjogdHJhbnNtaXQgdGltZWQgb3V0LCAlcz9cbiIsCisJCXR4X2RvbmUoZGV2KSA/ICJJUlEgY29uZmxpY3QiIDoKKwkJIm5ldHdvcmsgY2FibGUgcHJvYmxlbSIpOworCS8qICJraWNrIiB0aGUgYWRhcHRvciAqLworCXNtY19yZXNldCggZGV2LT5iYXNlX2FkZHIgKTsKKwlzbWNfZW5hYmxlKCBkZXYtPmJhc2VfYWRkciApOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCS8qIGNsZWFyIGFueXRoaW5nIHNhdmVkICovCisJKChzdHJ1Y3Qgc21jX2xvY2FsICopZGV2LT5wcml2KS0+c2F2ZWRfc2tiID0gTlVMTDsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4KKyAuIHNtY19yY3YgLSAgcmVjZWl2ZSBhIHBhY2tldCBmcm9tIHRoZSBjYXJkCisgLgorIC4gVGhlcmUgaXMgKCBhdCBsZWFzdCApIGEgcGFja2V0IHdhaXRpbmcgdG8gYmUgcmVhZCBmcm9tCisgLiBjaGlwLW1lbW9yeS4KKyAuCisgLiBvIFJlYWQgdGhlIHN0YXR1cworIC4gbyBJZiBhbiBlcnJvciwgcmVjb3JkIGl0CisgLiBvIG90aGVyd2lzZSwgcmVhZCBpbiB0aGUgcGFja2V0CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgdm9pZCBzbWNfcmN2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCAJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IAlwYWNrZXRfbnVtYmVyOworCXdvcmQJc3RhdHVzOworCXdvcmQJcGFja2V0X2xlbmd0aDsKKworCS8qIGFzc3VtZSBiYW5rIDIgKi8KKworCXBhY2tldF9udW1iZXIgPSBpbncoIGlvYWRkciArIEZJRk9fUE9SVFMgKTsKKworCWlmICggcGFja2V0X251bWJlciAmIEZQX1JYRU1QVFkgKSB7CisJCS8qIHdlIGdvdCBjYWxsZWQgLCBidXQgbm90aGluZyB3YXMgb24gdGhlIEZJRk8gKi8KKwkJUFJJTlRLKChDQVJETkFNRSAiOiBXQVJOSU5HOiBzbWNfcmN2IHdpdGggbm90aGluZyBvbiBGSUZPLiBcbiIpKTsKKwkJLyogZG9uJ3QgbmVlZCB0byByZXN0b3JlIGFueXRoaW5nICovCisJCXJldHVybjsKKwl9CisKKwkvKiAgc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcGFja2V0ICovCisJb3V0dyggUFRSX1JFQUQgfCBQVFJfUkNWIHwgUFRSX0FVVE9JTkMsIGlvYWRkciArIFBPSU5URVIgKTsKKworCS8qIEZpcnN0IHR3byB3b3JkcyBhcmUgc3RhdHVzIGFuZCBwYWNrZXRfbGVuZ3RoICovCisJc3RhdHVzIAkJPSBpbncoIGlvYWRkciArIERBVEFfMSApOworCXBhY2tldF9sZW5ndGggCT0gaW53KCBpb2FkZHIgKyBEQVRBXzEgKTsKKworCXBhY2tldF9sZW5ndGggJj0gMHgwN2ZmOyAgLyogbWFzayBvZmYgdG9wIGJpdHMgKi8KKworCVBSSU5USzIoKCJSQ1Y6IFNUQVRVUyAlNHggTEVOR1RIICU0eFxuIiwgc3RhdHVzLCBwYWNrZXRfbGVuZ3RoICkpOworCS8qCisJIC4gdGhlIHBhY2tldCBsZW5ndGggY29udGFpbnMgMyBleHRyYSB3b3JkcyA6CisJIC4gc3RhdHVzLCBsZW5ndGgsIGFuZCBhbiBleHRyYSB3b3JkIHdpdGggYW4gb2RkIGJ5dGUgLgorCSovCisJcGFja2V0X2xlbmd0aCAtPSA2OworCisJaWYgKCAhKHN0YXR1cyAmIFJTX0VSUk9SUyApICl7CisJCS8qIGRvIHN0dWZmIHRvIG1ha2UgYSBuZXcgcGFja2V0ICovCisJCXN0cnVjdCBza19idWZmICAqIHNrYjsKKwkJYnl0ZQkJKiBkYXRhOworCisJCS8qIHJlYWQgb25lIGV4dHJhIGJ5dGUgKi8KKwkJaWYgKCBzdGF0dXMgJiBSU19PRERGUkFNRSApCisJCQlwYWNrZXRfbGVuZ3RoKys7CisKKwkJLyogc2V0IG11bHRpY2FzdCBzdGF0cyAqLworCQlpZiAoIHN0YXR1cyAmIFJTX01VTFRJQ0FTVCApCisJCQlscC0+c3RhdHMubXVsdGljYXN0Kys7CisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYiggcGFja2V0X2xlbmd0aCArIDUpOworCisJCWlmICggc2tiID09IE5VTEwgKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgQ0FSRE5BTUUgIjogTG93IG1lbW9yeSwgcGFja2V0IGRyb3BwZWQuXG4iKTsKKwkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQkvKgorCQkgISBUaGlzIHNob3VsZCB3b3JrIHdpdGhvdXQgYWxpZ25tZW50LCBidXQgaXQgY291bGQgYmUKKwkJICEgaW4gdGhlIHdvcnNlIGNhc2UKKwkJKi8KKworCQlza2JfcmVzZXJ2ZSggc2tiLCAyICk7ICAgLyogMTYgYml0IGFsaWdubWVudCAqLworCisJCXNrYi0+ZGV2ID0gZGV2OworCQlkYXRhID0gc2tiX3B1dCggc2tiLCBwYWNrZXRfbGVuZ3RoKTsKKworI2lmZGVmIFVTRV8zMl9CSVQKKwkJLyogUVVFU1RJT046ICBMaWtlIGluIHRoZSBUWCByb3V0aW5lLCBkbyBJIHdhbnQKKwkJICAgdG8gc2VuZCB0aGUgRFdPUkRzIG9yIHRoZSBieXRlcyBmaXJzdCwgb3Igc29tZQorCQkgICBtaXh0dXJlLiAgQSBtaXh0dXJlIG1pZ2h0IGltcHJvdmUgYWxyZWFkeSBzbG93IFBJTworCQkgICBwZXJmb3JtYW5jZSAgKi8KKwkJUFJJTlRLMygoIiBSZWFkaW5nICVkIGR3b3JkcyAoYW5kICVkIGJ5dGVzKSBcbiIsCisJCQlwYWNrZXRfbGVuZ3RoID4+IDIsIHBhY2tldF9sZW5ndGggJiAzICkpOworCQlpbnNsKGlvYWRkciArIERBVEFfMSAsIGRhdGEsIHBhY2tldF9sZW5ndGggPj4gMiApOworCQkvKiByZWFkIHRoZSBsZWZ0IG92ZXIgYnl0ZXMgKi8KKwkJaW5zYiggaW9hZGRyICsgREFUQV8xLCBkYXRhICsgKHBhY2tldF9sZW5ndGggJiAweEZGRkZGQyksCisJCQlwYWNrZXRfbGVuZ3RoICYgMHgzICApOworI2Vsc2UKKwkJUFJJTlRLMygoIiBSZWFkaW5nICVkIHdvcmRzIGFuZCAlZCBieXRlKHMpIFxuIiwKKwkJCShwYWNrZXRfbGVuZ3RoID4+IDEgKSwgcGFja2V0X2xlbmd0aCAmIDEgKSk7CisJCWluc3coaW9hZGRyICsgREFUQV8xICwgZGF0YSwgcGFja2V0X2xlbmd0aCA+PiAxKTsKKwkJaWYgKCBwYWNrZXRfbGVuZ3RoICYgMSApIHsKKwkJCWRhdGEgKz0gcGFja2V0X2xlbmd0aCAmIH4xOworCQkJKihkYXRhKyspID0gaW5iKCBpb2FkZHIgKyBEQVRBXzEgKTsKKwkJfQorI2VuZGlmCisjaWYJU01DX0RFQlVHID4gMgorCQkJcHJpbnRfcGFja2V0KCBkYXRhLCBwYWNrZXRfbGVuZ3RoICk7CisjZW5kaWYKKworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYgKTsKKwkJbmV0aWZfcngoc2tiKTsKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBhY2tldF9sZW5ndGg7CisJfSBlbHNlIHsKKwkJLyogZXJyb3IgLi4uICovCisJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKworCQlpZiAoIHN0YXR1cyAmIFJTX0FMR05FUlIgKSAgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQlpZiAoIHN0YXR1cyAmIChSU19UT09TSE9SVCB8IFJTX1RPT0xPTkcgKSApCisJCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlpZiAoIHN0YXR1cyAmIFJTX0JBRENSQykJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwl9CisKK2RvbmU6CisJLyogIGVycm9yIG9yIGdvb2QsIHRlbGwgdGhlIGNhcmQgdG8gZ2V0IHJpZCBvZiB0aGlzIHBhY2tldCAqLworCW91dHcoIE1DX1JFTEVBU0UsIGlvYWRkciArIE1NVV9DTUQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIC4gc21jX3R4CisgLgorIC4gUHVycG9zZTogIEhhbmRsZSBhIHRyYW5zbWl0IGVycm9yIG1lc3NhZ2UuICAgVGhpcyB3aWxsIG9ubHkgYmUgY2FsbGVkCisgLiAgIHdoZW4gYW4gZXJyb3IsIGJlY2F1c2Ugb2YgdGhlIEFVVE9fUkVMRUFTRSBtb2RlLgorIC4KKyAuIEFsZ29yaXRobToKKyAuCVNhdmUgcG9pbnRlciBhbmQgcGFja2V0IG5vCisgLglHZXQgdGhlIHBhY2tldCBubyBmcm9tIHRoZSB0b3Agb2YgdGhlIHF1ZXVlCisgLgljaGVjayBpZiBpdCdzIHZhbGlkICggaWYgbm90LCBpcyB0aGlzIGFuIGVycm9yPz8/ICkKKyAuCXJlYWQgdGhlIHN0YXR1cyB3b3JkCisgLglyZWNvcmQgdGhlIGVycm9yCisgLgkoIHJlc2VuZD8gIE5vdCByZWFsbHksIHNpbmNlIHdlIGRvbid0IHdhbnQgb2xkIHBhY2tldHMgYXJvdW5kICkKKyAuCVJlc3RvcmUgc2F2ZWQgdmFsdWVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc21jX3R4KCBzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiApCit7CisJaW50CWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlieXRlIHNhdmVkX3BhY2tldDsKKwlieXRlIHBhY2tldF9ubzsKKwl3b3JkIHR4X3N0YXR1czsKKworCisJLyogYXNzdW1lIGJhbmsgMiAgKi8KKworCXNhdmVkX3BhY2tldCA9IGluYiggaW9hZGRyICsgUE5SX0FSUiApOworCXBhY2tldF9ubyA9IGludyggaW9hZGRyICsgRklGT19QT1JUUyApOworCXBhY2tldF9ubyAmPSAweDdGOworCisJLyogc2VsZWN0IHRoaXMgYXMgdGhlIHBhY2tldCB0byByZWFkIGZyb20gKi8KKwlvdXRiKCBwYWNrZXRfbm8sIGlvYWRkciArIFBOUl9BUlIgKTsKKworCS8qIHJlYWQgdGhlIGZpcnN0IHdvcmQgZnJvbSB0aGlzIHBhY2tldCAqLworCW91dHcoIFBUUl9BVVRPSU5DIHwgUFRSX1JFQUQsIGlvYWRkciArIFBPSU5URVIgKTsKKworCXR4X3N0YXR1cyA9IGludyggaW9hZGRyICsgREFUQV8xICk7CisJUFJJTlRLMygoQ0FSRE5BTUUiOiBUWCBET05FIFNUQVRVUzogJTR4IFxuIiwgdHhfc3RhdHVzICkpOworCisJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCWlmICggdHhfc3RhdHVzICYgVFNfTE9TVENBUiApIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCWlmICggdHhfc3RhdHVzICYgVFNfTEFUQ09MICApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgQ0FSRE5BTUUKKwkJCSI6IExhdGUgY29sbGlzaW9uIG9jY3VycmVkIG9uIGxhc3QgeG1pdC5cbiIpOworCQlscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCX0KKyNpZiAwCisJCWlmICggdHhfc3RhdHVzICYgVFNfMTZDT0wgKSB7IC4uLiB9CisjZW5kaWYKKworCWlmICggdHhfc3RhdHVzICYgVFNfU1VDQ0VTUyApIHsKKwkJcHJpbnRrKENBUkROQU1FIjogU3VjY2Vzc2Z1bCBwYWNrZXQgY2F1c2VkIGludGVycnVwdCBcbiIpOworCX0KKwkvKiByZS1lbmFibGUgdHJhbnNtaXQgKi8KKwlTTUNfU0VMRUNUX0JBTksoIDAgKTsKKwlvdXR3KCBpbncoIGlvYWRkciArIFRDUiApIHwgVENSX0VOQUJMRSwgaW9hZGRyICsgVENSICk7CisKKwkvKiBraWxsIHRoZSBwYWNrZXQgKi8KKwlTTUNfU0VMRUNUX0JBTksoIDIgKTsKKwlvdXR3KCBNQ19GUkVFUEtULCBpb2FkZHIgKyBNTVVfQ01EICk7CisKKwkvKiBvbmUgbGVzcyBwYWNrZXQgd2FpdGluZyBmb3IgbWUgKi8KKwlscC0+cGFja2V0c193YWl0aW5nLS07CisKKwlvdXRiKCBzYXZlZF9wYWNrZXQsIGlvYWRkciArIFBOUl9BUlIgKTsKKwlyZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAuCisgLiBUaGlzIGlzIHRoZSBtYWluIHJvdXRpbmUgb2YgdGhlIGRyaXZlciwgdG8gaGFuZGxlIHRoZSBkZXZpY2Ugd2hlbgorIC4gaXQgbmVlZHMgc29tZSBhdHRlbnRpb24uCisgLgorIC4gU286CisgLiAgIGZpcnN0LCBzYXZlIHN0YXRlIG9mIHRoZSBjaGlwc2V0CisgLiAgIGJyYW5jaCBvZmYgaW50byByb3V0aW5lcyB0byBoYW5kbGUgZWFjaCBjYXNlLCBhbmQgYWNrbm93bGVkZ2UKKyAuCSAgICBlYWNoIHRvIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIKKyAuICAgYW5kIGZpbmFsbHkgcmVzdG9yZSBzdGF0ZS4KKyAuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlycXJldHVybl90IHNtY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqIGRldl9pZCwgIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2IAk9IGRldl9pZDsKKwlpbnQgaW9hZGRyIAkJPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlieXRlCXN0YXR1czsKKwl3b3JkCWNhcmRfc3RhdHM7CisJYnl0ZQltYXNrOworCWludAl0aW1lb3V0OworCS8qIHN0YXRlIHJlZ2lzdGVycyAqLworCXdvcmQJc2F2ZWRfYmFuazsKKwl3b3JkCXNhdmVkX3BvaW50ZXI7CisJaW50IGhhbmRsZWQgPSAwOworCisKKwlQUklOVEszKChDQVJETkFNRSI6IFNNQyBpbnRlcnJ1cHQgc3RhcnRlZCBcbiIpKTsKKworCXNhdmVkX2JhbmsgPSBpbncoIGlvYWRkciArIEJBTktfU0VMRUNUICk7CisKKwlTTUNfU0VMRUNUX0JBTksoMik7CisJc2F2ZWRfcG9pbnRlciA9IGludyggaW9hZGRyICsgUE9JTlRFUiApOworCisJbWFzayA9IGluYiggaW9hZGRyICsgSU5UX01BU0sgKTsKKwkvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworCW91dGIoIDAsIGlvYWRkciArIElOVF9NQVNLICk7CisKKworCS8qIHNldCBhIHRpbWVvdXQgdmFsdWUsIHNvIEkgZG9uJ3Qgc3RheSBoZXJlIGZvcmV2ZXIgKi8KKwl0aW1lb3V0ID0gNDsKKworCVBSSU5USzIoKEtFUk5fV0FSTklORyBDQVJETkFNRSAiOiBNQVNLIElTICV4IFxuIiwgbWFzayApKTsKKwlkbyB7CisJCS8qIHJlYWQgdGhlIHN0YXR1cyBmbGFnLCBhbmQgbWFzayBpdCAqLworCQlzdGF0dXMgPSBpbmIoIGlvYWRkciArIElOVEVSUlVQVCApICYgbWFzazsKKwkJaWYgKCFzdGF0dXMgKQorCQkJYnJlYWs7CisKKwkJaGFuZGxlZCA9IDE7CisKKwkJUFJJTlRLMygoS0VSTl9XQVJOSU5HIENBUkROQU1FCisJCQkiOiBIYW5kbGluZyBpbnRlcnJ1cHQgc3RhdHVzICV4IFxuIiwgc3RhdHVzICkpOworCisJCWlmIChzdGF0dXMgJiBJTV9SQ1ZfSU5UKSB7CisJCQkvKiBHb3QgYSBwYWNrZXQocykuICovCisJCQlQUklOVEsyKChLRVJOX1dBUk5JTkcgQ0FSRE5BTUUKKwkJCQkiOiBSZWNlaXZlIEludGVycnVwdFxuIikpOworCQkJc21jX3JjdihkZXYpOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIElNX1RYX0lOVCApIHsKKwkJCVBSSU5USzIoKEtFUk5fV0FSTklORyBDQVJETkFNRQorCQkJCSI6IFRYIEVSUk9SIGhhbmRsZWRcbiIpKTsKKwkJCXNtY190eChkZXYpOworCQkJb3V0YihJTV9UWF9JTlQsIGlvYWRkciArIElOVEVSUlVQVCApOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIElNX1RYX0VNUFRZX0lOVCApIHsKKwkJCS8qIHVwZGF0ZSBzdGF0cyAqLworCQkJU01DX1NFTEVDVF9CQU5LKCAwICk7CisJCQljYXJkX3N0YXRzID0gaW53KCBpb2FkZHIgKyBDT1VOVEVSICk7CisJCQkvKiBzaW5nbGUgY29sbGlzaW9ucyAqLworCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gY2FyZF9zdGF0cyAmIDB4RjsKKwkJCWNhcmRfc3RhdHMgPj49IDQ7CisJCQkvKiBtdWx0aXBsZSBjb2xsaXNpb25zICovCisJCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSBjYXJkX3N0YXRzICYgMHhGOworCisJCQkvKiB0aGVzZSBhcmUgZm9yIHdoZW4gbGludXggc3VwcG9ydHMgdGhlc2Ugc3RhdGlzdGljcyAqLworCisJCQlTTUNfU0VMRUNUX0JBTksoIDIgKTsKKwkJCVBSSU5USzIoKEtFUk5fV0FSTklORyBDQVJETkFNRQorCQkJCSI6IFRYX0JVRkZFUl9FTVBUWSBoYW5kbGVkXG4iKSk7CisJCQlvdXRiKCBJTV9UWF9FTVBUWV9JTlQsIGlvYWRkciArIElOVEVSUlVQVCApOworCQkJbWFzayAmPSB+SU1fVFhfRU1QVFlfSU5UOworCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMgKz0gbHAtPnBhY2tldHNfd2FpdGluZzsKKwkJCWxwLT5wYWNrZXRzX3dhaXRpbmcgPSAwOworCisJCX0gZWxzZSBpZiAoc3RhdHVzICYgSU1fQUxMT0NfSU5UICkgeworCQkJUFJJTlRLMigoS0VSTl9ERUJVRyBDQVJETkFNRQorCQkJCSI6IEFsbG9jYXRpb24gaW50ZXJydXB0IFxuIikpOworCQkJLyogY2xlYXIgdGhpcyBpbnRlcnJ1cHQgc28gaXQgZG9lc24ndCBoYXBwZW4gYWdhaW4gKi8KKwkJCW1hc2sgJj0gfklNX0FMTE9DX0lOVDsKKworCQkJc21jX2hhcmR3YXJlX3NlbmRfcGFja2V0KCBkZXYgKTsKKworCQkJLyogZW5hYmxlIHhtaXQgaW50ZXJydXB0cyBiYXNlZCBvbiB0aGlzICovCisJCQltYXNrIHw9ICggSU1fVFhfRU1QVFlfSU5UIHwgSU1fVFhfSU5UICk7CisKKwkJCS8qIGFuZCBsZXQgdGhlIGNhcmQgc2VuZCBtb3JlIHBhY2tldHMgdG8gbWUgKi8KKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCQkJUFJJTlRLMigoQ0FSRE5BTUUiOiBIYW5kb2ZmIGRvbmUgc3VjY2Vzc2Z1bGx5LlxuIikpOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIElNX1JYX09WUk5fSU5UICkgeworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQlvdXRiKCBJTV9SWF9PVlJOX0lOVCwgaW9hZGRyICsgSU5URVJSVVBUICk7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgSU1fRVBIX0lOVCApIHsKKwkJCVBSSU5USygoQ0FSRE5BTUUgIjogVU5TVVBQT1JURUQ6IEVQSCBJTlRFUlJVUFQgXG4iKSk7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgSU1fRVJDVl9JTlQgKSB7CisJCQlQUklOVEsoKENBUkROQU1FICI6IFVOU1VQUE9SVEVEOiBFUkNWIElOVEVSUlVQVCBcbiIpKTsKKwkJCW91dGIoIElNX0VSQ1ZfSU5ULCBpb2FkZHIgKyBJTlRFUlJVUFQgKTsKKwkJfQorCX0gd2hpbGUgKCB0aW1lb3V0IC0tICk7CisKKworCS8qIHJlc3RvcmUgc3RhdGUgcmVnaXN0ZXIgKi8KKwlTTUNfU0VMRUNUX0JBTksoIDIgKTsKKwlvdXRiKCBtYXNrLCBpb2FkZHIgKyBJTlRfTUFTSyApOworCisJUFJJTlRLMygoIEtFUk5fV0FSTklORyBDQVJETkFNRSAiOiBNQVNLIGlzIG5vdyAleCBcbiIsIG1hc2sgKSk7CisJb3V0dyggc2F2ZWRfcG9pbnRlciwgaW9hZGRyICsgUE9JTlRFUiApOworCisJU01DX1NFTEVDVF9CQU5LKCBzYXZlZF9iYW5rICk7CisKKwlQUklOVEszKChDQVJETkFNRSAiOiBJbnRlcnJ1cHQgZG9uZVxuIikpOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4gc21jX2Nsb3NlCisgLgorIC4gdGhpcyBtYWtlcyB0aGUgYm9hcmQgY2xlYW4gdXAgZXZlcnl0aGluZyB0aGF0IGl0IGNhbgorIC4gYW5kIG5vdCB0YWxrIHRvIHRoZSBvdXRzaWRlIHdvcmxkLiAgIENhdXNlZCBieQorIC4gYW4gJ2lmY29uZmlnIGV0aFggZG93bicKKyAuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBzbWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJLyogY2xlYXIgZXZlcnl0aGluZyAqLworCXNtY19zaHV0ZG93biggZGV2LT5iYXNlX2FkZHIgKTsKKworCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBoZXJlLiAqLworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4gR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCisgLiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yIGNsb3NlZC4KKyAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqIHNtY19xdWVyeV9zdGF0aXN0aWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4gc21jX3NldF9tdWx0aWNhc3RfbGlzdAorIC4KKyAuIFRoaXMgcm91dGluZSB3aWxsLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlcyBwYXNzZWQgdG8gaXQsCisgLiBlaXRoZXIgbWFrZSBpdCBhY2NlcHQgbXVsdGljYXN0IHBhY2tldHMsIGdvIGludG8KKyAuIHByb21pc2N1b3VzIG1vZGUgKCBmb3IgVENQRFVNUCBhbmQgY291c2lucyApIG9yIGFjY2VwdAorIC4gYSBzZWxlY3Qgc2V0IG9mIG11bHRpY2FzdCBwYWNrZXRzCisqLworc3RhdGljIHZvaWQgc21jX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJU01DX1NFTEVDVF9CQU5LKDApOworCWlmICggZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDICkKKwkJb3V0dyggaW53KGlvYWRkciArIFJDUiApIHwgUkNSX1BST01JU0MsIGlvYWRkciArIFJDUiApOworCisvKiBCVUc/ICBJIG5ldmVyIGRpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSBpZiBtdWx0aWNhc3Rpbmcgd2FzIHR1cm5lZCBvbi4KKyAgIE5vdywgSSB0dXJuIG9mZiBwcm9taXNjdW91cyBtb2RlLCBidXQgSSBkb24ndCBkbyBhbnl0aGluZyB0byBtdWx0aWNhc3RpbmcKKyAgIHdoZW4gcHJvbWlzY3VvdXMgbW9kZSBpcyB0dXJuZWQgb24uCisqLworCisJLyogSGVyZSwgSSBhbSBzZXR0aW5nIHRoaXMgdG8gYWNjZXB0IGFsbCBtdWx0aWNhc3QgcGFja2V0cy4KKwkgICBJIGRvbid0IG5lZWQgdG8gemVybyB0aGUgbXVsdGljYXN0IHRhYmxlLCBiZWNhdXNlIHRoZSBmbGFnIGlzCisJICAgY2hlY2tlZCBiZWZvcmUgdGhlIHRhYmxlIGlzCisJKi8KKwllbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQlvdXR3KCBpbncoaW9hZGRyICsgUkNSICkgfCBSQ1JfQUxNVUwsIGlvYWRkciArIFJDUiApOworCisJLyogV2UganVzdCBnZXQgYWxsIG11bHRpY2FzdCBwYWNrZXRzIGV2ZW4gaWYgd2Ugb25seSB3YW50IHRoZW0KKwkgLiBmcm9tIG9uZSBzb3VyY2UuICBUaGlzIHdpbGwgYmUgY2hhbmdlZCBhdCBzb21lIGZ1dHVyZQorCSAuIHBvaW50LiAqLworCWVsc2UgaWYgKGRldi0+bWNfY291bnQgKSAgeworCQkvKiBzdXBwb3J0IGhhcmR3YXJlIG11bHRpY2FzdGluZyAqLworCisJCS8qIGJlIHN1cmUgSSBnZXQgcmlkIG9mIGZsYWdzIEkgbWlnaHQgaGF2ZSBzZXQgKi8KKwkJb3V0dyggaW53KCBpb2FkZHIgKyBSQ1IgKSAmIH4oUkNSX1BST01JU0MgfCBSQ1JfQUxNVUwpLAorCQkJaW9hZGRyICsgUkNSICk7CisJCS8qIE5PVEU6IHRoaXMgaGFzIHRvIHNldCB0aGUgYmFuaywgc28gbWFrZSBzdXJlIGl0IGlzIHRoZQorCQkgICBsYXN0IHRoaW5nIGNhbGxlZC4gIFRoZSBiYW5rIGlzIHNldCB0byB6ZXJvIGF0IHRoZSB0b3AgKi8KKwkJc21jX3NldG11bHRpY2FzdCggaW9hZGRyLCBkZXYtPm1jX2NvdW50LCBkZXYtPm1jX2xpc3QgKTsKKwl9CisJZWxzZSAgeworCQlvdXR3KCBpbncoIGlvYWRkciArIFJDUiApICYgfihSQ1JfUFJPTUlTQyB8IFJDUl9BTE1VTCksCisJCQlpb2FkZHIgKyBSQ1IgKTsKKworCQkvKgorCQkgIHNpbmNlIEknbSBkaXNhYmxpbmcgYWxsIG11bHRpY2FzdCBlbnRpcmVseSwgSSBuZWVkIHRvCisJCSAgY2xlYXIgdGhlIG11bHRpY2FzdCBsaXN0CisJCSovCisJCVNNQ19TRUxFQ1RfQkFOSyggMyApOworCQlvdXR3KCAwLCBpb2FkZHIgKyBNVUxUSUNBU1QxICk7CisJCW91dHcoIDAsIGlvYWRkciArIE1VTFRJQ0FTVDIgKTsKKwkJb3V0dyggMCwgaW9hZGRyICsgTVVMVElDQVNUMyApOworCQlvdXR3KCAwLCBpb2FkZHIgKyBNVUxUSUNBU1Q0ICk7CisJfQorfQorCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2U01DOTE5NDsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpZnBvcnQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiU01DIDk5MTk0IEkvTyBiYXNlIGFkZHJlc3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiU01DIDk5MTk0IElSUSBudW1iZXIiKTsKK01PRFVMRV9QQVJNX0RFU0MoaWZwb3J0LCAiU01DIDk5MTk0IGludGVyZmFjZSBwb3J0ICgwLWRlZmF1bHQsIDEtVFAsIDItQVVJKSIpOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpZiAoaW8gPT0gMCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQlDQVJETkFNRSI6IFlvdSBzaG91bGRuJ3QgdXNlIGF1dG8tcHJvYmluZyB3aXRoIGluc21vZCFcbiIgKTsKKworCS8qIGNvcHkgdGhlIHBhcmFtZXRlcnMgZnJvbSBpbnNtb2QgaW50byB0aGUgZGV2aWNlIHN0cnVjdHVyZSAqLworCWRldlNNQzkxOTQgPSBzbWNfaW5pdCgtMSk7CisJaWYgKElTX0VSUihkZXZTTUM5MTk0KSkKKwkJcmV0dXJuIFBUUl9FUlIoZGV2U01DOTE5NCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZTTUM5MTk0KTsKKwlmcmVlX2lycShkZXZTTUM5MTk0LT5pcnEsIGRldlNNQzkxOTQpOworCXJlbGVhc2VfcmVnaW9uKGRldlNNQzkxOTQtPmJhc2VfYWRkciwgU01DX0lPX0VYVEVOVCk7CisJZnJlZV9uZXRkZXYoZGV2U01DOTE5NCk7Cit9CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxOTQuaCBiL2RyaXZlcnMvbmV0L3NtYzkxOTQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTNhYjkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc21jOTE5NC5oCkBAIC0wLDAgKzEsMjQxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4gc21jOTE5NC5oCisgLiBDb3B5cmlnaHQgKEMpIDE5OTYgYnkgRXJpayBTdGFobG1hbiAKKyAuCisgLiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgLiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIC4KKyAuIFRoaXMgZmlsZSBjb250YWlucyByZWdpc3RlciBpbmZvcm1hdGlvbiBhbmQgYWNjZXNzIG1hY3JvcyBmb3IgCisgLiB0aGUgU01DOTF4eHggY2hpcHNldC4gICAKKyAuIAorIC4gSW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoaXMgZmlsZSB3YXMgb2J0YWluZWQgZnJvbSB0aGUgU01DOTFDOTQgCisgLiBtYW51YWwgZnJvbSBTTUMuICBUbyBnZXQgYSBjb3B5LCBpZiB5b3UgcmVhbGx5IHdhbnQgb25lLCB5b3UgY2FuIGZpbmQgCisgLiBpbmZvcm1hdGlvbiB1bmRlciB3d3cuc21jLmNvbSBpbiB0aGUgY29tcG9uZW50cyBkaXZpc2lvbi4KKyAuICggdGhpcyB0aGFua3MgdG8gYWR2aWNlIGZyb20gRG9uYWxkIEJlY2tlciApLgorIC4gCisgLiBBdXRob3JzCisgLiAJRXJpayBTdGFobG1hbgkJCQkoIGVyaWtAdnQuZWR1ICkKKyAuCisgLiBIaXN0b3J5CisgLiAwMS8wNi85NgkJIEVyaWsgU3RhaGxtYW4gICBtb3ZlZCBkZWZpbml0aW9ucyBoZXJlIGZyb20gbWFpbiAuYyBmaWxlCisgLiAwMS8xOS85NgkJIEVyaWsgU3RhaGxtYW4JICBwb2xpc2hlZCB0aGlzIHVwIHNvbWUsIGFuZCBhZGRlZCBiZXR0ZXIKKyAuCQkJCQkJCQkJCSAgZXJyb3IgaGFuZGxpbmcKKyAuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX1NNQzkxOTRfSF8KKyNkZWZpbmUgX1NNQzkxOTRfSF8KKworLyogSSB3YW50IHNvbWUgc2ltcGxlIHR5cGVzICovCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJCWJ5dGU7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQkJd29yZDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgCQlkd29yZDsKKworCisvKiBCZWNhdXNlIG9mIGJhbmsgc3dpdGNoaW5nLCB0aGUgU01DOTF4eHggdXNlcyBvbmx5IDE2IEkvTyBwb3J0cyAqLworCisjZGVmaW5lIFNNQ19JT19FWFRFTlQJMTYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4gIAorIC4gQSBkZXNjcmlwdGlvbiBvZiB0aGUgU01DIHJlZ2lzdGVycyBpcyBwcm9iYWJseSBpbiBvcmRlciBoZXJlLAorIC4gYWx0aG91Z2ggZm9yIGRldGFpbHMsIHRoZSBTTUMgZGF0YXNoZWV0IGlzIGludmFsdWFibGUuICAKKyAuIAorIC4gQmFzaWNhbGx5LCB0aGUgY2hpcCBoYXMgNCBiYW5rcyBvZiByZWdpc3RlcnMgKCAwIHRvIDMgKSwgd2hpY2gKKyAuIGFyZSBhY2Nlc3NlZCBieSB3cml0aW5nIGEgbnVtYmVyIGludG8gdGhlIEJBTktfU0VMRUNUIHJlZ2lzdGVyCisgLiAoIEkgYWxzbyB1c2UgYSBTTUNfU0VMRUNUX0JBTksgbWFjcm8gZm9yIHRoaXMgKS4KKyAuIAorIC4gVGhlIGJhbmtzIGFyZSBjb25maWd1cmVkIHNvIHRoYXQgZm9yIG1vc3QgcHVycG9zZXMsIGJhbmsgMiBpcyBhbGwKKyAuIHRoYXQgaXMgbmVlZGVkIGZvciBzaW1wbGUgcnVuIHRpbWUgdGFza3MuICAKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgLiBCYW5rIFNlbGVjdCBSZWdpc3RlcjogCisgLgorIC4JCXl5eXkgeXl5eSAwMDAwIDAweHggIAorIC4JCXh4IAkJPSBiYW5rIG51bWJlcgorIC4JCXl5eXkgeXl5eQk9IDB4MzMsIGZvciBpZGVudGlmaWNhdGlvbiBwdXJwb3Nlcy4KKyovCisjZGVmaW5lCUJBTktfU0VMRUNUCQkxNAorCisvKiBCQU5LIDAgICovCisKKyNkZWZpbmUJVENSIAkJMCAgICAJLyogdHJhbnNtaXQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBUQ1JfRU5BQkxFCTB4MDAwMQkvKiBpZiB0aGlzIGlzIDEsIHdlIGNhbiB0cmFuc21pdCAqLyAKKyNkZWZpbmUgVENSX0ZEVVBMWCAgICAJMHgwODAwICAvKiByZWNlaXZlIHBhY2tldHMgc2VudCBvdXQgKi8KKyNkZWZpbmUgVENSX1NUUF9TUUVUCTB4MTAwMAkvKiBzdG9wIHRyYW5zbWl0dGluZyBpZiBTaWduYWwgcXVhbGl0eSBlcnJvciAqLworI2RlZmluZQlUQ1JfTU9OX0NOUwkweDA0MDAJLyogbW9uaXRvcnMgdGhlIGNhcnJpZXIgc3RhdHVzICovCisjZGVmaW5lCVRDUl9QQURfRU5BQkxFCTB4MDA4MAkvKiBwYWRzIHNob3J0IHBhY2tldHMgdG8gNjQgYnl0ZXMgKi8KKworI2RlZmluZQlUQ1JfQ0xFQVIJMAkvKiBkbyBOT1RISU5HICovCisvKiB0aGUgbm9ybWFsIHNldHRpbmdzIGZvciB0aGUgVENSIHJlZ2lzdGVyIDogKi8gCisvKiBRVUVTVElPTjogZG8gSSB3YW50IHRvIGVuYWJsZSBwYWRkaW5nIG9mIHNob3J0IHBhY2tldHMgPyAqLworI2RlZmluZQlUQ1JfTk9STUFMICAJVENSX0VOQUJMRSAKKworCisjZGVmaW5lIEVQSF9TVEFUVVMJMgorI2RlZmluZSBFU19MSU5LX09LCTB4NDAwMAkvKiBpcyB0aGUgbGluayBpbnRlZ3JpdHkgb2sgPyAqLworCisjZGVmaW5lCVJDUgkJNAorI2RlZmluZSBSQ1JfU09GVFJFU0VUCTB4ODAwMCAJLyogcmVzZXRzIHRoZSBjaGlwICovCQorI2RlZmluZQlSQ1JfU1RSSVBfQ1JDCTB4MjAwCS8qIHN0cmlwcyBDUkMgKi8KKyNkZWZpbmUgUkNSX0VOQUJMRQkweDEwMAkvKiBJRkYgdGhpcyBpcyBzZXQsIHdlIGNhbiByZWNlaXZlIHBhY2tldHMgKi8KKyNkZWZpbmUgUkNSX0FMTVVMCTB4NCAJLyogcmVjZWl2ZSBhbGwgbXVsdGljYXN0IHBhY2tldHMgKi8KKyNkZWZpbmUJUkNSX1BST01JU0MJMHgyCS8qIGVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisKKy8qIHRoZSBub3JtYWwgc2V0dGluZ3MgZm9yIHRoZSBSQ1IgcmVnaXN0ZXIgOiAqLworI2RlZmluZQlSQ1JfTk9STUFMCShSQ1JfU1RSSVBfQ1JDIHwgUkNSX0VOQUJMRSkKKyNkZWZpbmUgUkNSX0NMRUFSCTB4MAkJLyogc2V0IGl0IHRvIGEgYmFzZSBzdGF0ZSAqLworCisjZGVmaW5lCUNPVU5URVIJCTYKKyNkZWZpbmUJTUlSCQk4CisjZGVmaW5lCU1DUgkJMTAKKy8qIDEyIGlzIHJlc2VydmVkICovCisKKy8qIEJBTksgMSAqLworI2RlZmluZSBDT05GSUcJCQkwCisjZGVmaW5lIENGR19BVUlfU0VMRUNUCSAJMHgxMDAKKyNkZWZpbmUJQkFTRQkJCTIKKyNkZWZpbmUJQUREUjAJCQk0CisjZGVmaW5lCUFERFIxCQkJNgorI2RlZmluZQlBRERSMgkJCTgKKyNkZWZpbmUJR0VORVJBTAkJCTEwCisjZGVmaW5lCUNPTlRST0wJCQkxMgorI2RlZmluZQlDVExfUE9XRVJET1dOCQkweDIwMDAKKyNkZWZpbmUJQ1RMX0xFX0VOQUJMRQkJMHg4MAorI2RlZmluZQlDVExfQ1JfRU5BQkxFCQkweDQwCisjZGVmaW5lCUNUTF9URV9FTkFCTEUJCTB4MDAyMAorI2RlZmluZSBDVExfQVVUT19SRUxFQVNFCTB4MDgwMAorI2RlZmluZQlDVExfRVBST01fQUNDRVNTCTB4MDAwMyAvKiBoaWdoIGlmIEVwcm9tIGlzIGJlaW5nIHJlYWQgKi8KKworLyogQkFOSyAyICovCisjZGVmaW5lIE1NVV9DTUQJCTAKKyNkZWZpbmUgTUNfQlVTWQkJMQkvKiBvbmx5IHJlYWRhYmxlIGJpdCBpbiB0aGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUNfTk9QCQkwCisjZGVmaW5lCU1DX0FMTE9DCTB4MjAgIAkvKiBvciB3aXRoIG51bWJlciBvZiAyNTYgYnl0ZSBwYWNrZXRzICovCisjZGVmaW5lCU1DX1JFU0VUCTB4NDAJCisjZGVmaW5lCU1DX1JFTU9WRQkweDYwICAJLyogcmVtb3ZlIHRoZSBjdXJyZW50IHJ4IHBhY2tldCAqLworI2RlZmluZSBNQ19SRUxFQVNFICAJMHg4MCAgCS8qIHJlbW92ZSBhbmQgcmVsZWFzZSB0aGUgY3VycmVudCByeCBwYWNrZXQgKi8KKyNkZWZpbmUgTUNfRlJFRVBLVCAgCTB4QTAgIAkvKiBSZWxlYXNlIHBhY2tldCBpbiBQTlIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUNfRU5RVUVVRQkweEMwIAkvKiBFbnF1ZXVlIHRoZSBwYWNrZXQgZm9yIHRyYW5zbWl0ICovCisgCQorI2RlZmluZQlQTlJfQVJSCQkyCisjZGVmaW5lIEZJRk9fUE9SVFMJNAorCisjZGVmaW5lIEZQX1JYRU1QVFkgIDB4ODAwMAorI2RlZmluZSBGUF9UWEVNUFRZICAweDgwCisKKyNkZWZpbmUJUE9JTlRFUgkJNgorI2RlZmluZSBQVFJfUkVBRAkweDIwMDAKKyNkZWZpbmUJUFRSX1JDVgkJMHg4MDAwCisjZGVmaW5lCVBUUl9BVVRPSU5DIAkweDQwMDAKKyNkZWZpbmUgUFRSX0FVVE9fSU5DCTB4MDA0MAorCisjZGVmaW5lCURBVEFfMQkJOAorI2RlZmluZQlEQVRBXzIJCTEwCisjZGVmaW5lCUlOVEVSUlVQVAkxMgorCisjZGVmaW5lIElOVF9NQVNLCTEzCisjZGVmaW5lIElNX1JDVl9JTlQJMHgxCisjZGVmaW5lCUlNX1RYX0lOVAkweDIKKyNkZWZpbmUJSU1fVFhfRU1QVFlfSU5UCTB4NAkKKyNkZWZpbmUJSU1fQUxMT0NfSU5UCTB4OAorI2RlZmluZQlJTV9SWF9PVlJOX0lOVAkweDEwCisjZGVmaW5lCUlNX0VQSF9JTlQJMHgyMAorI2RlZmluZQlJTV9FUkNWX0lOVAkweDQwIC8qIG5vdCBvbiBTTUM5MTkyICovCQkKKworLyogQkFOSyAzICovCisjZGVmaW5lCU1VTFRJQ0FTVDEJMAorI2RlZmluZQlNVUxUSUNBU1QyCTIKKyNkZWZpbmUJTVVMVElDQVNUMwk0CisjZGVmaW5lCU1VTFRJQ0FTVDQJNgorI2RlZmluZQlNR01UCQk4CisjZGVmaW5lCVJFVklTSU9OCTEwIC8qICggaGk6IGNoaXAgaWQgICBsb3c6IHJldiAjICkgKi8KKworCisvKiB0aGlzIGlzIE5PVCBvbiBTTUM5MTkyICovCisjZGVmaW5lCUVSQ1YJCTEyCisKKyNkZWZpbmUgQ0hJUF85MTkwCTMKKyNkZWZpbmUgQ0hJUF85MTk0CTQKKyNkZWZpbmUgQ0hJUF85MTk1CTUKKyNkZWZpbmUgQ0hJUF85MTEwMAk3CisKK3N0YXRpYyBjb25zdCBjaGFyICogY2hpcF9pZHNbIDE1IF0gPSAgeyAKKwlOVUxMLCBOVUxMLCBOVUxMLCAKKwkvKiAzICovICJTTUM5MUM5MC85MUM5MiIsCisJLyogNCAqLyAiU01DOTFDOTQiLAorCS8qIDUgKi8gIlNNQzkxQzk1IiwKKwlOVUxMLAorCS8qIDcgKi8gIlNNQzkxQzEwMCIsIAorCS8qIDggKi8gIlNNQzkxQzEwMEZEIiwgCisJTlVMTCwgTlVMTCwgTlVMTCwgCisJTlVMTCwgTlVMTCwgTlVMTH07ICAKKworLyogCisgLiBUcmFuc21pdCBzdGF0dXMgYml0cyAKKyovCisjZGVmaW5lIFRTX1NVQ0NFU1MgMHgwMDAxCisjZGVmaW5lIFRTX0xPU1RDQVIgMHgwNDAwCisjZGVmaW5lIFRTX0xBVENPTCAgMHgwMjAwCisjZGVmaW5lIFRTXzE2Q09MICAgMHgwMDEwCisKKy8qCisgLiBSZWNlaXZlIHN0YXR1cyBiaXRzCisqLworI2RlZmluZSBSU19BTEdORVJSCTB4ODAwMAorI2RlZmluZSBSU19CQURDUkMJMHgyMDAwCisjZGVmaW5lIFJTX09EREZSQU1FCTB4MTAwMAorI2RlZmluZSBSU19UT09MT05HCTB4MDgwMAorI2RlZmluZSBSU19UT09TSE9SVAkweDA0MDAKKyNkZWZpbmUgUlNfTVVMVElDQVNUCTB4MDAwMQorI2RlZmluZSBSU19FUlJPUlMJKFJTX0FMR05FUlIgfCBSU19CQURDUkMgfCBSU19UT09MT05HIHwgUlNfVE9PU0hPUlQpIAorCitzdGF0aWMgY29uc3QgY2hhciAqIGludGVyZmFjZXNbIDIgXSA9IHsgIlRQIiwgIkFVSSIgfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLiAgSSBkZWZpbmUgc29tZSBtYWNyb3MgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZG8gc29tZXdoYXQgY29tbW9uCisgLiBvciBzbGlnaHRseSBjb21wbGljYXRlZCwgcmVwZWF0ZWQgdGFza3MuIAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogc2VsZWN0IGEgcmVnaXN0ZXIgYmFuaywgMCB0byAzICAqLworCisjZGVmaW5lIFNNQ19TRUxFQ1RfQkFOSyh4KSAgeyBvdXR3KCB4LCBpb2FkZHIgKyBCQU5LX1NFTEVDVCApOyB9IAorCisvKiBkZWZpbmUgYSBzbWFsbCBkZWxheSBmb3IgdGhlIHJlc2V0ICovCisjZGVmaW5lIFNNQ19ERUxBWSgpIHsgaW53KCBpb2FkZHIgKyBSQ1IgKTtcCisJCQlpbncoIGlvYWRkciArIFJDUiApO1wKKwkJCWludyggaW9hZGRyICsgUkNSICk7ICB9CisKKy8qIHRoaXMgZW5hYmxlcyBhbiBpbnRlcnJ1cHQgaW4gdGhlIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisjZGVmaW5lIFNNQ19FTkFCTEVfSU5UKHgpIHtcCisJCXVuc2lnbmVkIGNoYXIgbWFzaztcCisJCVNNQ19TRUxFQ1RfQkFOSygyKTtcCisJCW1hc2sgPSBpbmIoIGlvYWRkciArIElOVF9NQVNLICk7XAorCQltYXNrIHw9ICh4KTtcCisJCW91dGIoIG1hc2ssIGlvYWRkciArIElOVF9NQVNLICk7IFwKK30KKworLyogdGhpcyBkaXNhYmxlcyBhbiBpbnRlcnJ1cHQgZnJvbSB0aGUgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBTTUNfRElTQUJMRV9JTlQoeCkge1wKKwkJdW5zaWduZWQgY2hhciBtYXNrO1wKKwkJU01DX1NFTEVDVF9CQU5LKDIpO1wKKwkJbWFzayA9IGluYiggaW9hZGRyICsgSU5UX01BU0sgKTtcCisJCW1hc2sgJj0gfih4KTtcCisJCW91dGIoIG1hc2ssIGlvYWRkciArIElOVF9NQVNLICk7IFwKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLiBEZWZpbmUgdGhlIGludGVycnVwdHMgdGhhdCBJIHdhbnQgdG8gcmVjZWl2ZSBmcm9tIHRoZSBjYXJkCisgLiAKKyAuIEkgd2FudDogCisgLiAgSU1fRVBIX0lOVCwgZm9yIG5hc3R5IGVycm9ycworIC4gIElNX1JDVl9JTlQsIGZvciBoYXBweSByZWNlaXZlZCBwYWNrZXRzCisgLiAgSU1fUlhfT1ZSTl9JTlQsIGJlY2F1c2UgSSBoYXZlIHRvIGtpY2sgdGhlIHJlY2VpdmVyCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTTUNfSU5URVJSVVBUX01BU0sgICAoSU1fRVBIX0lOVCB8IElNX1JYX09WUk5fSU5UIHwgSU1fUkNWX0lOVCkgCisKKyNlbmRpZiAgLyogX1NNQ185MTk0X0hfICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxeC5jIGIvZHJpdmVycy9uZXQvc21jOTF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc2NmJhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5jCkBAIC0wLDAgKzEsMjM0MyBAQAorLyoKKyAqIHNtYzkxeC5jCisgKiBUaGlzIGlzIGEgZHJpdmVyIGZvciBTTVNDJ3MgOTFDOXgvOTFDMXh4IHNpbmdsZS1jaGlwIEV0aGVybmV0IGRldmljZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IGJ5IEVyaWsgU3RhaGxtYW4KKyAqIENvcHlyaWdodCAoQykgMjAwMSBTdGFuZGFyZCBNaWNyb3N5c3RlbXMgQ29ycG9yYXRpb24KKyAqCURldmVsb3BlZCBieSBTaW1wbGUgTmV0d29yayBNYWdpYyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1vbnRhIFZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKglVbmlmaWVkIFNNQzkxeCBkcml2ZXIgYnkgTmljb2xhcyBQaXRyZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiBBcmd1bWVudHM6CisgKiAJaW8JPSBmb3IgdGhlIGJhc2UgYWRkcmVzcworICoJaXJxCT0gZm9yIHRoZSBJUlEKKyAqCW5vd2FpdAk9IDAgZm9yIG5vcm1hbCB3YWl0IHN0YXRlcywgMSBlbGltaW5hdGVzIGFkZGl0aW9uYWwgd2FpdCBzdGF0ZXMKKyAqCisgKiBvcmlnaW5hbCBhdXRob3I6CisgKiAJRXJpayBTdGFobG1hbiA8ZXJpa0B2dC5lZHU+CisgKgorICogaGFyZHdhcmUgbXVsdGljYXN0IGNvZGU6CisgKiAgICBQZXRlciBDYW1tYWVydCA8cGNAZGVua2FydC5iZT4KKyAqCisgKiBjb250cmlidXRvcnM6CisgKiAJRGFyaXMgQSBOZXZpbCA8ZG5ldmlsQHNubWMuY29tPgorICogICAgICBOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+CisgKglSdXNzZWxsIEtpbmcgPHJta0Bhcm0ubGludXgub3JnLnVrPgorICoKKyAqIEhpc3Rvcnk6CisgKiAgIDA4LzIwLzAwICBBcm5hbGRvIE1lbG8gICAgICAgZml4IGtmcmVlKHNrYikgaW4gc21jX2hhcmR3YXJlX3NlbmRfcGFja2V0CisgKiAgIDEyLzE1LzAwICBDaHJpc3RpYW4gSnVsbGllbiAgZml4ICJXYXJuaW5nOiBrZnJlZV9za2Igb24gaGFyZCBJUlEiCisgKiAgIDAzLzE2LzAxICBEYXJpcyBBIE5ldmlsICAgICAgbW9kaWZpZWQgc21jOTE5NC5jIGZvciB1c2Ugd2l0aCBMQU45MUMxMTEKKyAqICAgMDgvMjIvMDEgIFNjb3R0IEFuZGVyc29uICAgICBtZXJnZSBjaGFuZ2VzIGZyb20gc21jOTE5NCB0byBzbWM5MTExMQorICogICAwOC8yMS8wMSAgUHJhbW9kIEIgQmhhcmR3YWogIGFkZGVkIHN1cHBvcnQgZm9yIFJldkIgb2YgTEFOOTFDMTExCisgKiAgIDEyLzIwLzAxICBKZWZmIFN1dGhlcmxhbmQgICAgaW5pdGlhbCBwb3J0IHRvIFhzY2FsZSBQWEEgd2l0aCBETUEgc3VwcG9ydAorICogICAwNC8wNy8wMyAgTmljb2xhcyBQaXRyZSAgICAgIHVuaWZpZWQgU01DOTF4IGRyaXZlciwga2lsbGVkIGlycSByYWNlcywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGJ1cyBhYnN0cmFjdGlvbiwgYmlnIGNsZWFudXAsIGV0Yy4KKyAqICAgMjkvMDkvMDMgIFJ1c3NlbGwgS2luZyAgICAgICAtIGFkZCBkcml2ZXIgbW9kZWwgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZXRodG9vbCBzdXBwb3J0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBjb252ZXJ0IHRvIHVzZSBnZW5lcmljIE1JSSBpbnRlcmZhY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGFkZCBsaW5rIHVwL2Rvd24gbm90aWZpY2F0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBkb24ndCB0cnkgdG8gaGFuZGxlIGZ1bGwgbmVnb3RpYXRpb24gaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY19waHlfY29uZmlndXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBjbGVhbiB1cCAoYW5kIGZpeCBzdGFjayBvdmVycnVuKSBpbiBQSFkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JSSByZWFkL3dyaXRlIGZ1bmN0aW9ucworICogICAyMi8wOS8wNCAgTmljb2xhcyBQaXRyZSAgICAgIGJpZyB1cGRhdGUgKHNlZSBjb21taXQgbG9nIGZvciBkZXRhaWxzKQorICovCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQorCSJzbWM5MXguYzogdjEuMSwgc2VwIDIyIDIwMDQgYnkgTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPlxuIjsKKworLyogRGVidWdnaW5nIGxldmVsICovCisjaWZuZGVmIFNNQ19ERUJVRworI2RlZmluZSBTTUNfREVCVUcJCTAKKyNlbmRpZgorCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAic21jOTF4LmgiCisKKyNpZmRlZiBDT05GSUdfSVNBCisvKgorICogdGhlIExBTjkxQzExMSBjYW4gYmUgYXQgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9ydCBhZGRyZXNzZXMuICBUbyBjaGFuZ2UsCisgKiBmb3IgYSBzbGlnaHRseSBkaWZmZXJlbnQgY2FyZCwgeW91IGNhbiBhZGQgaXQgdG8gdGhlIGFycmF5LiAgS2VlcCBpbgorICogbWluZCB0aGF0IHRoZSBhcnJheSBtdXN0IGVuZCBpbiB6ZXJvLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNtY19wb3J0bGlzdFtdIF9faW5pdGRhdGEgPSB7CisJMHgyMDAsIDB4MjIwLCAweDI0MCwgMHgyNjAsIDB4MjgwLCAweDJBMCwgMHgyQzAsIDB4MkUwLAorCTB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MzYwLCAweDM4MCwgMHgzQTAsIDB4M0MwLCAweDNFMCwgMAorfTsKKworI2lmbmRlZiBTTUNfSU9BRERSCisjIGRlZmluZSBTTUNfSU9BRERSCQktMQorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbyA9IFNNQ19JT0FERFI7Cittb2R1bGVfcGFyYW0oaW8sIHVsb25nLCAwNDAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYmFzZSBhZGRyZXNzIik7CisKKyNpZm5kZWYgU01DX0lSUQorIyBkZWZpbmUgU01DX0lSUQkJLTEKKyNlbmRpZgorc3RhdGljIGludCBpcnEgPSBTTUNfSVJROworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwNDAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIG51bWJlciIpOworCisjZW5kaWYgIC8qIENPTkZJR19JU0EgKi8KKworI2lmbmRlZiBTTUNfTk9XQUlUCisjIGRlZmluZSBTTUNfTk9XQUlUCQkwCisjZW5kaWYKK3N0YXRpYyBpbnQgbm93YWl0ID0gU01DX05PV0FJVDsKK21vZHVsZV9wYXJhbShub3dhaXQsIGludCwgMDQwMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2FpdCwgInNldCB0byAxIGZvciBubyB3YWl0IHN0YXRlIik7CisKKy8qCisgKiBUcmFuc21pdCB0aW1lb3V0LCBkZWZhdWx0IDUgc2Vjb25kcy4KKyAqLworc3RhdGljIGludCB3YXRjaGRvZyA9IDUwMDA7Cittb2R1bGVfcGFyYW0od2F0Y2hkb2csIGludCwgMDQwMCk7CitNT0RVTEVfUEFSTV9ERVNDKHdhdGNoZG9nLCAidHJhbnNtaXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMiKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogVGhlIGludGVybmFsIHdvcmtpbmdzIG9mIHRoZSBkcml2ZXIuICBJZiB5b3UgYXJlIGNoYW5naW5nIGFueXRoaW5nCisgKiBoZXJlIHdpdGggdGhlIFNNQyBzdHVmZiwgeW91IHNob3VsZCBoYXZlIHRoZSBkYXRhc2hlZXQgYW5kIGtub3cKKyAqIHdoYXQgeW91IGFyZSBkb2luZy4KKyAqLworI2RlZmluZSBDQVJETkFNRSAic21jOTF4IgorCisvKgorICogVXNlIHBvd2VyLWRvd24gZmVhdHVyZSBvZiB0aGUgY2hpcAorICovCisjZGVmaW5lIFBPV0VSX0RPV04JCTEKKworLyoKKyAqIFdhaXQgdGltZSBmb3IgbWVtb3J5IHRvIGJlIGZyZWUuICBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZQorICogdHVuZWQgdGhhdCBtdWNoLCBhcyB3YWl0aW5nIGZvciB0aGlzIG1lYW5zIG5vdGhpbmcgZWxzZSBoYXBwZW5zCisgKiBpbiB0aGUgc3lzdGVtCisgKi8KKyNkZWZpbmUgTUVNT1JZX1dBSVRfVElNRQkxNgorCisvKgorICogVGhpcyBzZWxlY3RzIHdoZXRoZXIgVFggcGFja2V0cyBhcmUgc2VudCBvbmUgYnkgb25lIHRvIHRoZSBTTUM5MXggaW50ZXJuYWwKKyAqIG1lbW9yeSBhbmQgdGhyb3R0bGVkIHVudGlsIHRyYW5zbWlzc2lvbiBjb21wbGV0ZXMuICBUaGlzIG1heSBwcmV2ZW50CisgKiBSWCBvdmVycnVucyBhIGxpdGxlIGJ5IGtlZXBpbmcgbXVjaCBvZiB0aGUgbWVtb3J5IGZyZWUgZm9yIFJYIHBhY2tldHMKKyAqIGJ1dCB0byB0aGUgZXhwZW5zZSBvZiByZWR1Y2VkIFRYIHRocm91Z2hwdXQgYW5kIGluY3JlYXNlZCBJUlEgb3ZlcmhlYWQuCisgKiBOb3RlIHRoaXMgaXMgbm90IGEgY3VyZSBmb3IgYSB0b28gc2xvdyBkYXRhIGJ1cyBvciB0b28gaGlnaCBJUlEgbGF0ZW5jeS4KKyAqLworI2RlZmluZSBUSFJPVFRMRV9UWF9QS1RTCTAKKworLyoKKyAqIFRoZSBNSUkgY2xvY2sgaGlnaC9sb3cgdGltZXMuICAyeCB0aGlzIG51bWJlciBnaXZlcyB0aGUgTUlJIGNsb2NrIHBlcmlvZAorICogaW4gbWljcm9zZWNvbmRzLiAod2FzIDUwLCBidXQgdGhpcyBnaXZlcyA2LjRtcyBmb3IgZWFjaCBNSUkgdHJhbnNhY3Rpb24hKQorICovCisjZGVmaW5lIE1JSV9ERUxBWQkJMQorCisvKiBzdG9yZSB0aGlzIGluZm9ybWF0aW9uIGZvciB0aGUgZHJpdmVyLi4gKi8KK3N0cnVjdCBzbWNfbG9jYWwgeworCS8qCisJICogSWYgSSBoYXZlIHRvIHdhaXQgdW50aWwgbWVtb3J5IGlzIGF2YWlsYWJsZSB0byBzZW5kIGEKKwkgKiBwYWNrZXQsIEkgd2lsbCBzdG9yZSB0aGUgc2tidWZmIGhlcmUsIHVudGlsIEkgZ2V0IHRoZQorCSAqIGRlc2lyZWQgbWVtb3J5LiAgVGhlbiwgSSdsbCBzZW5kIGl0IG91dCBhbmQgZnJlZSBpdC4KKwkgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcGVuZGluZ190eF9za2I7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHR4X3Rhc2s7CisKKyAJLyoKKwkgKiB0aGVzZSBhcmUgdGhpbmdzIHRoYXQgdGhlIGtlcm5lbCB3YW50cyBtZSB0byBrZWVwLCBzbyB1c2VycworCSAqIGNhbiBmaW5kIG91dCBzZW1pLXVzZWxlc3Mgc3RhdGlzdGljcyBvZiBob3cgd2VsbCB0aGUgY2FyZCBpcworCSAqIHBlcmZvcm1pbmcKKwkgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCS8qIHZlcnNpb24vcmV2aXNpb24gb2YgdGhlIFNNQzkxeCBjaGlwICovCisJaW50CXZlcnNpb247CisKKwkvKiBDb250YWlucyB0aGUgY3VycmVudCBhY3RpdmUgdHJhbnNtaXNzaW9uIG1vZGUgKi8KKwlpbnQJdGNyX2N1cl9tb2RlOworCisJLyogQ29udGFpbnMgdGhlIGN1cnJlbnQgYWN0aXZlIHJlY2VpdmUgbW9kZSAqLworCWludAlyY3JfY3VyX21vZGU7CisKKwkvKiBDb250YWlucyB0aGUgY3VycmVudCBhY3RpdmUgcmVjZWl2ZS9waHkgbW9kZSAqLworCWludAlycGNfY3VyX21vZGU7CisJaW50CWN0bF9yZmR1cGx4OworCWludAljdGxfcnNwZWVkOworCisJdTMyCW1zZ19lbmFibGU7CisJdTMyCXBoeV90eXBlOworCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWk7CisKKwkvKiB3b3JrIHF1ZXVlICovCisJc3RydWN0IHdvcmtfc3RydWN0IHBoeV9jb25maWd1cmU7CisJaW50CXdvcmtfcGVuZGluZzsKKworCXNwaW5sb2NrX3QgbG9jazsKKworI2lmZGVmIFNNQ19DQU5fVVNFX0RBVEFDUworCXUzMglfX2lvbWVtICpkYXRhY3M7CisjZW5kaWYKKworI2lmZGVmIFNNQ19VU0VfUFhBX0RNQQorCS8qIERNQSBuZWVkcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY2hpcCAqLworCXVfbG9uZyBwaHlzYWRkcjsKKyNlbmRpZgorCXZvaWQgX19pb21lbSAqYmFzZTsKK307CisKKyNpZiBTTUNfREVCVUcgPiAwCisjZGVmaW5lIERCRyhuLCBhcmdzLi4uKQkJCQkJXAorCWRvIHsJCQkJCQlcCisJCWlmIChTTUNfREVCVUcgPj0gKG4pKQkJCVwKKwkJCXByaW50ayhhcmdzKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgUFJJTlRLKGFyZ3MuLi4pICAgcHJpbnRrKGFyZ3MpCisjZWxzZQorI2RlZmluZSBEQkcobiwgYXJncy4uLikgICBkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgUFJJTlRLKGFyZ3MuLi4pICAgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKKyNlbmRpZgorCisjaWYgU01DX0RFQlVHID4gMworc3RhdGljIHZvaWQgUFJJTlRfUEtUKHVfY2hhciAqYnVmLCBpbnQgbGVuZ3RoKQoreworCWludCBpOworCWludCByZW1haW5kZXI7CisJaW50IGxpbmVzOworCisJbGluZXMgPSBsZW5ndGggLyAxNjsKKwlyZW1haW5kZXIgPSBsZW5ndGggJSAxNjsKKworCWZvciAoaSA9IDA7IGkgPCBsaW5lcyA7IGkgKyspIHsKKwkJaW50IGN1cjsKKwkJZm9yIChjdXIgPSAwOyBjdXIgPCA4OyBjdXIrKykgeworCQkJdV9jaGFyIGEsIGI7CisJCQlhID0gKmJ1ZisrOworCQkJYiA9ICpidWYrKzsKKwkJCXByaW50aygiJTAyeCUwMnggIiwgYSwgYik7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgcmVtYWluZGVyLzIgOyBpKyspIHsKKwkJdV9jaGFyIGEsIGI7CisJCWEgPSAqYnVmKys7CisJCWIgPSAqYnVmKys7CisJCXByaW50aygiJTAyeCUwMnggIiwgYSwgYik7CisJfQorCXByaW50aygiXG4iKTsKK30KKyNlbHNlCisjZGVmaW5lIFBSSU5UX1BLVCh4Li4uKSAgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworCisvKiB0aGlzIGVuYWJsZXMgYW4gaW50ZXJydXB0IGluIHRoZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworI2RlZmluZSBTTUNfRU5BQkxFX0lOVCh4KSBkbyB7CQkJCQkJXAorCXVuc2lnbmVkIGNoYXIgbWFzazsJCQkJCQlcCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOwkJCQkJXAorCW1hc2sgPSBTTUNfR0VUX0lOVF9NQVNLKCk7CQkJCQlcCisJbWFzayB8PSAoeCk7CQkJCQkJCVwKKwlTTUNfU0VUX0lOVF9NQVNLKG1hc2spOwkJCQkJCVwKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIHRoaXMgZGlzYWJsZXMgYW4gaW50ZXJydXB0IGZyb20gdGhlIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisjZGVmaW5lIFNNQ19ESVNBQkxFX0lOVCh4KSBkbyB7CQkJCQkJXAorCXVuc2lnbmVkIGNoYXIgbWFzazsJCQkJCQlcCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOwkJCQkJXAorCW1hc2sgPSBTTUNfR0VUX0lOVF9NQVNLKCk7CQkJCQlcCisJbWFzayAmPSB+KHgpOwkJCQkJCQlcCisJU01DX1NFVF9JTlRfTUFTSyhtYXNrKTsJCQkJCQlcCisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CQkJCQlcCit9IHdoaWxlICgwKQorCisvKgorICogV2FpdCB3aGlsZSBNTVUgaXMgYnVzeS4gIFRoaXMgaXMgdXN1YWxseSBpbiB0aGUgb3JkZXIgb2YgYSBmZXcgbmFub3NlY3MKKyAqIGlmIGF0IGFsbCwgYnV0IGxldCdzIGF2b2lkIGRlYWRsb2NraW5nIHRoZSBzeXN0ZW0gaWYgdGhlIGhhcmR3YXJlCisgKiBkZWNpZGVzIHRvIGdvIHNvdXRoLgorICovCisjZGVmaW5lIFNNQ19XQUlUX01NVV9CVVNZKCkgZG8gewkJCQkJXAorCWlmICh1bmxpa2VseShTTUNfR0VUX01NVV9DTUQoKSAmIE1DX0JVU1kpKSB7CQkJXAorCQl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgMjsJCQlcCisJCXdoaWxlIChTTUNfR0VUX01NVV9DTUQoKSAmIE1DX0JVU1kpIHsJCQlcCisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgewkJXAorCQkJCXByaW50aygiJXM6IHRpbWVvdXQgJXMgbGluZSAlZFxuIiwJXAorCQkJCQlkZXYtPm5hbWUsIF9fRklMRV9fLCBfX0xJTkVfXyk7CVwKKwkJCQlicmVhazsJCQkJCVwKKwkJCX0JCQkJCQlcCisJCQljcHVfcmVsYXgoKTsJCQkJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworCisvKgorICogdGhpcyBkb2VzIGEgc29mdCByZXNldCBvbiB0aGUgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHNtY19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCXVuc2lnbmVkIGludCBjdGwsIGNmZzsKKworCURCRygyLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisJU01DX1NFTEVDVF9CQU5LKDIpOworCVNNQ19TRVRfSU5UX01BU0soMCk7CisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKworCS8qCisJICogVGhpcyByZXNldHMgdGhlIHJlZ2lzdGVycyBtb3N0bHkgdG8gZGVmYXVsdHMsIGJ1dCBkb2Vzbid0CisJICogYWZmZWN0IEVFUFJPTS4gIFRoYXQgc2VlbXMgdW5uZWNlc3NhcnkKKwkgKi8KKwlTTUNfU0VMRUNUX0JBTksoMCk7CisJU01DX1NFVF9SQ1IoUkNSX1NPRlRSU1QpOworCisJLyoKKwkgKiBTZXR1cCB0aGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorCSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIENPTkZJR19SRUcgaXMgbm90IGFmZmVjdGVkCisJICogYnkgYSBzb2Z0IHJlc2V0CisJICovCisJU01DX1NFTEVDVF9CQU5LKDEpOworCisJY2ZnID0gQ09ORklHX0RFRkFVTFQ7CisKKwkvKgorCSAqIFNldHVwIGZvciBmYXN0IGFjY2Vzc2VzIGlmIHJlcXVlc3RlZC4gIElmIHRoZSBjYXJkL3N5c3RlbQorCSAqIGNhbid0IGhhbmRsZSBpdCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gcmVjb3ZlcnkgZXhjZXB0IGZvcgorCSAqIGEgaGFyZCByZXNldCBvciBwb3dlciBjeWNsZQorCSAqLworCWlmIChub3dhaXQpCisJCWNmZyB8PSBDT05GSUdfTk9fV0FJVDsKKworCS8qCisJICogUmVsZWFzZSBmcm9tIHBvc3NpYmxlIHBvd2VyLWRvd24gc3RhdGUKKwkgKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIGlzIG5vdCBhZmZlY3RlZCBieSBTb2Z0IFJlc2V0CisJICovCisJY2ZnIHw9IENPTkZJR19FUEhfUE9XRVJfRU47CisKKwlTTUNfU0VUX0NPTkZJRyhjZmcpOworCisJLyogdGhpcyBzaG91bGQgcGF1c2UgZW5vdWdoIGZvciB0aGUgY2hpcCB0byBiZSBoYXBweSAqLworCS8qCisJICogZWxhYm9yYXRlPyAgV2hhdCBkb2VzIHRoZSBjaGlwIF9uZWVkXz8gLS1qZ2FyemlrCisJICoKKwkgKiBUaGlzIHNlZW1zIHRvIGJlIHVuZG9jdW1lbnRlZCwgYnV0IHNvbWV0aGluZyB0aGUgb3JpZ2luYWwKKwkgKiBkcml2ZXIocykgaGF2ZSBhbHdheXMgZG9uZS4gIFN1c3BlY3QgdW5kb2N1bWVudGVkIHRpbWluZworCSAqIGluZm8vZGV0ZXJtaW5lZCBlbXBpcmljYWxseS4gLS1ybWsKKwkgKi8KKwl1ZGVsYXkoMSk7CisKKwkvKiBEaXNhYmxlIHRyYW5zbWl0IGFuZCByZWNlaXZlIGZ1bmN0aW9uYWxpdHkgKi8KKwlTTUNfU0VMRUNUX0JBTksoMCk7CisJU01DX1NFVF9SQ1IoUkNSX0NMRUFSKTsKKwlTTUNfU0VUX1RDUihUQ1JfQ0xFQVIpOworCisJU01DX1NFTEVDVF9CQU5LKDEpOworCWN0bCA9IFNNQ19HRVRfQ1RMKCkgfCBDVExfTEVfRU5BQkxFOworCisJLyoKKwkgKiBTZXQgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgdG8gYXV0b21hdGljYWxseSByZWxlYXNlIHN1Y2Nlc3NmdWxseQorCSAqIHRyYW5zbWl0dGVkIHBhY2tldHMsIHRvIG1ha2UgdGhlIGJlc3QgdXNlIG91dCBvZiBvdXIgbGltaXRlZAorCSAqIG1lbW9yeQorCSAqLworCWlmKCFUSFJPVFRMRV9UWF9QS1RTKQorCQljdGwgfD0gQ1RMX0FVVE9fUkVMRUFTRTsKKwllbHNlCisJCWN0bCAmPSB+Q1RMX0FVVE9fUkVMRUFTRTsKKwlTTUNfU0VUX0NUTChjdGwpOworCisJLyogUmVzZXQgdGhlIE1NVSAqLworCVNNQ19TRUxFQ1RfQkFOSygyKTsKKwlTTUNfU0VUX01NVV9DTUQoTUNfUkVTRVQpOworCVNNQ19XQUlUX01NVV9CVVNZKCk7CisKKwkvKiBjbGVhciBhbnl0aGluZyBzYXZlZCAqLworCWlmIChscC0+cGVuZGluZ190eF9za2IgIT0gTlVMTCkgeworCQlkZXZfa2ZyZWVfc2tiIChscC0+cGVuZGluZ190eF9za2IpOworCQlscC0+cGVuZGluZ190eF9za2IgPSBOVUxMOworCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCX0KK30KKworLyoKKyAqIEVuYWJsZSBJbnRlcnJ1cHRzLCBSZWNlaXZlLCBhbmQgVHJhbnNtaXQKKyAqLworc3RhdGljIHZvaWQgc21jX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCWludCBtYXNrOworCisJREJHKDIsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKworCS8qIHNlZSB0aGUgaGVhZGVyIGZpbGUgZm9yIG9wdGlvbnMgaW4gVENSL1JDUiBERUZBVUxUICovCisJU01DX1NFTEVDVF9CQU5LKDApOworCVNNQ19TRVRfVENSKGxwLT50Y3JfY3VyX21vZGUpOworCVNNQ19TRVRfUkNSKGxwLT5yY3JfY3VyX21vZGUpOworCisJU01DX1NFTEVDVF9CQU5LKDEpOworCVNNQ19TRVRfTUFDX0FERFIoZGV2LT5kZXZfYWRkcik7CisKKwkvKiBub3csIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJbWFzayA9IElNX0VQSF9JTlR8SU1fUlhfT1ZSTl9JTlR8SU1fUkNWX0lOVDsKKwlpZiAobHAtPnZlcnNpb24gPj0gKENISVBfOTExMDAgPDwgNCkpCisJCW1hc2sgfD0gSU1fTURJTlQ7CisJU01DX1NFTEVDVF9CQU5LKDIpOworCVNNQ19TRVRfSU5UX01BU0sobWFzayk7CisKKwkvKgorCSAqIEZyb20gdGhpcyBwb2ludCB0aGUgcmVnaXN0ZXIgYmFuayBtdXN0IF9OT1RfIGJlIHN3aXRjaGVkIGF3YXkKKwkgKiB0byBzb21ldGhpbmcgZWxzZSB0aGFuIGJhbmsgMiB3aXRob3V0IHByb3BlciBsb2NraW5nIGFnYWluc3QKKwkgKiByYWNlcyB3aXRoIGFueSB0YXNrbGV0IG9yIGludGVycnVwdCBoYW5kbGVycyB1bnRpbCBzbWNfc2h1dGRvd24oKQorCSAqIG9yIHNtY19yZXNldCgpIGlzIGNhbGxlZC4KKwkgKi8KK30KKworLyoKKyAqIHRoaXMgcHV0cyB0aGUgZGV2aWNlIGluIGFuIGluYWN0aXZlIHN0YXRlCisgKi8KK3N0YXRpYyB2b2lkIHNtY19zaHV0ZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCisJREJHKDIsICIlczogJXNcbiIsIENBUkROQU1FLCBfX0ZVTkNUSU9OX18pOworCisJLyogbm8gbW9yZSBpbnRlcnJ1cHRzIGZvciBtZSAqLworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCVNNQ19TRUxFQ1RfQkFOSygyKTsKKwlTTUNfU0VUX0lOVF9NQVNLKDApOworCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisKKwkvKiBhbmQgdGVsbCB0aGUgY2FyZCB0byBzdGF5IGF3YXkgZnJvbSB0aGF0IG5hc3R5IG91dHNpZGUgd29ybGQgKi8KKwlTTUNfU0VMRUNUX0JBTksoMCk7CisJU01DX1NFVF9SQ1IoUkNSX0NMRUFSKTsKKwlTTUNfU0VUX1RDUihUQ1JfQ0xFQVIpOworCisjaWZkZWYgUE9XRVJfRE9XTgorCS8qIGZpbmFsbHksIHNodXQgdGhlIGNoaXAgZG93biAqLworCVNNQ19TRUxFQ1RfQkFOSygxKTsKKwlTTUNfU0VUX0NPTkZJRyhTTUNfR0VUX0NPTkZJRygpICYgfkNPTkZJR19FUEhfUE9XRVJfRU4pOworI2VuZGlmCit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBwcm9jZWR1cmUgdG8gaGFuZGxlIHRoZSByZWNlaXB0IG9mIGEgcGFja2V0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgIHNtY19yY3Yoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgcGFja2V0X251bWJlciwgc3RhdHVzLCBwYWNrZXRfbGVuOworCisJREJHKDMsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKworCXBhY2tldF9udW1iZXIgPSBTTUNfR0VUX1JYRklGTygpOworCWlmICh1bmxpa2VseShwYWNrZXRfbnVtYmVyICYgUlhGSUZPX1JFTVBUWSkpIHsKKwkJUFJJTlRLKCIlczogc21jX3JjdiB3aXRoIG5vdGhpbmcgb24gRklGTy5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiByZWFkIGZyb20gc3RhcnQgb2YgcGFja2V0ICovCisJU01DX1NFVF9QVFIoUFRSX1JFQUQgfCBQVFJfUkNWIHwgUFRSX0FVVE9JTkMpOworCisJLyogRmlyc3QgdHdvIHdvcmRzIGFyZSBzdGF0dXMgYW5kIHBhY2tldCBsZW5ndGggKi8KKwlTTUNfR0VUX1BLVF9IRFIoc3RhdHVzLCBwYWNrZXRfbGVuKTsKKwlwYWNrZXRfbGVuICY9IDB4MDdmZjsgIC8qIG1hc2sgb2ZmIHRvcCBiaXRzICovCisJREJHKDIsICIlczogUlggUE5SIDB4JXggU1RBVFVTIDB4JTA0eCBMRU5HVEggMHglMDR4ICglZClcbiIsCisJCWRldi0+bmFtZSwgcGFja2V0X251bWJlciwgc3RhdHVzLAorCQlwYWNrZXRfbGVuLCBwYWNrZXRfbGVuKTsKKworCWJhY2s6CisJaWYgKHVubGlrZWx5KHBhY2tldF9sZW4gPCA2IHx8IHN0YXR1cyAmIFJTX0VSUk9SUykpIHsKKwkJaWYgKHN0YXR1cyAmIFJTX1RPT0xPTkcgJiYgcGFja2V0X2xlbiA8PSAoMTUxNCArIDQgKyA2KSkgeworCQkJLyogYWNjZXB0IFZMQU4gcGFja2V0cyAqLworCQkJc3RhdHVzICY9IH5SU19UT09MT05HOworCQkJZ290byBiYWNrOworCQl9CisJCWlmIChwYWNrZXRfbGVuIDwgNikgeworCQkJLyogYmxvb2R5IGhhcmR3YXJlICovCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmdWJhciAocnhsZW4gJXUgc3RhdHVzICV4XG4iLAorCQkJCQlkZXYtPm5hbWUsIHBhY2tldF9sZW4sIHN0YXR1cyk7CisJCQlzdGF0dXMgfD0gUlNfVE9PU0hPUlQ7CisJCX0KKwkJU01DX1dBSVRfTU1VX0JVU1koKTsKKwkJU01DX1NFVF9NTVVfQ01EKE1DX1JFTEVBU0UpOworCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBSU19BTEdORVJSKQorCQkJbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgKFJTX1RPT1NIT1JUIHwgUlNfVE9PTE9ORykpCisJCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgUlNfQkFEQ1JDKQorCQkJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQl1bnNpZ25lZCBjaGFyICpkYXRhOworCQl1bnNpZ25lZCBpbnQgZGF0YV9sZW47CisKKwkJLyogc2V0IG11bHRpY2FzdCBzdGF0cyAqLworCQlpZiAoc3RhdHVzICYgUlNfTVVMVElDQVNUKQorCQkJbHAtPnN0YXRzLm11bHRpY2FzdCsrOworCisJCS8qCisJCSAqIEFjdHVhbCBwYXlsb2FkIGlzIHBhY2tldF9sZW4gLSA2IChvciA1IGlmIG9kZCBieXRlKS4KKwkJICogV2Ugd2FudCBza2JfcmVzZXJ2ZSgyKSBhbmQgdGhlIGZpbmFsIGN0cmwgd29yZAorCQkgKiAoMiBieXRlcywgcG9zc2libHkgY29udGFpbmluZyB0aGUgcGF5bG9hZCBvZGQgYnl0ZSkuCisJCSAqIEZ1cnRoZXJtb3JlLCB3ZSBhZGQgMiBieXRlcyB0byBhbGxvdyByb3VuZGluZyB1cCB0bworCQkgKiBtdWx0aXBsZSBvZiA0IGJ5dGVzIG9uIDMyIGJpdCBidXNlcy4KKwkJICogSGVuY2UgcGFja2V0X2xlbiAtIDYgKyAyICsgMiArIDIuCisJCSAqLworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBhY2tldF9sZW4pOworCQlpZiAodW5saWtlbHkoc2tiID09IE5VTEwpKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBMb3cgbWVtb3J5LCBwYWNrZXQgZHJvcHBlZC5cbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCVNNQ19XQUlUX01NVV9CVVNZKCk7CisJCQlTTUNfU0VUX01NVV9DTUQoTUNfUkVMRUFTRSk7CisJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogQWxpZ24gSVAgaGVhZGVyIHRvIDMyIGJpdHMgKi8KKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKworCQkvKiBCVUc6IHRoZSBMQU45MUMxMTEgcmV2IEEgbmV2ZXIgc2V0cyB0aGlzIGJpdC4gRm9yY2UgaXQuICovCisJCWlmIChscC0+dmVyc2lvbiA9PSAweDkwKQorCQkJc3RhdHVzIHw9IFJTX09EREZSQU1FOworCisJCS8qCisJCSAqIElmIG9kZCBsZW5ndGg6IHBhY2tldF9sZW4gLSA1LAorCQkgKiBvdGhlcndpc2UgcGFja2V0X2xlbiAtIDYuCisJCSAqIFdpdGggdGhlIHRyYWlsaW5nIGN0cmwgYnl0ZSBpdCdzIHBhY2tldF9sZW4gLSA0LgorCQkgKi8KKwkJZGF0YV9sZW4gPSBwYWNrZXRfbGVuIC0gKChzdGF0dXMgJiBSU19PRERGUkFNRSkgPyA1IDogNik7CisJCWRhdGEgPSBza2JfcHV0KHNrYiwgZGF0YV9sZW4pOworCQlTTUNfUFVMTF9EQVRBKGRhdGEsIHBhY2tldF9sZW4gLSA0KTsKKworCQlTTUNfV0FJVF9NTVVfQlVTWSgpOworCQlTTUNfU0VUX01NVV9DTUQoTUNfUkVMRUFTRSk7CisKKwkJUFJJTlRfUEtUKGRhdGEsIHBhY2tldF9sZW4gLSA0KTsKKworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlza2ItPmRldiA9IGRldjsKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJbmV0aWZfcngoc2tiKTsKKwkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGRhdGFfbGVuOworCX0KK30KKworI2lmZGVmIENPTkZJR19TTVAKKy8qCisgKiBPbiBTTVAgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHByb2JsZW06CisgKgorICogCUEgPSBzbWNfaGFyZHdhcmVfc2VuZF9wa3QoKQorICogCUIgPSBzbWNfaGFyZF9zdGFydF94bWl0KCkKKyAqIAlDID0gc21jX2ludGVycnVwdCgpCisgKgorICogQSBhbmQgQiBjYW4gbmV2ZXIgYmUgZXhlY3V0ZWQgc2ltdWx0YW5lb3VzbHkuICBIb3dldmVyLCBhdCBsZWFzdCBvbiBVUCwKKyAqIGl0IGlzIHBvc3NpYmxlIChhbmQgZXZlbiBkZXNpcmFibGUpIGZvciBDIHRvIGludGVycnVwdCBleGVjdXRpb24gb2YKKyAqIEEgb3IgQiBpbiBvcmRlciB0byBoYXZlIGJldHRlciBSWCByZWxpYWJpbGl0eSBhbmQgYXZvaWQgb3ZlcnJ1bnMuCisgKiBDLCBqdXN0IGxpa2UgQSBhbmQgQiwgbXVzdCBoYXZlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIGNoaXAgYW5kCisgKiBlYWNoIG9mIHRoZW0gbXVzdCBsb2NrIGFnYWluc3QgYW55IG90aGVyIGNvbmN1cnJlbnQgYWNjZXNzLgorICogVW5mb3J0dW5hdGVseSB0aGlzIGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIEMgc3VzcGVuZCBleGVjdXRpb24gb2YgQSBvcgorICogQiB0YWtpbmcgcGxhY2Ugb24gYW5vdGhlciBDUFUuIE9uIFVQIHRoaXMgaXMgbm8gYW4gaXNzdWUgc2luY2UgQSBhbmQgQgorICogYXJlIHJ1biBmcm9tIHNvZnRpcnEgY29udGV4dCBhbmQgQyBmcm9tIGhhcmQgSVJRIGNvbnRleHQsIGFuZCB0aGVyZSBpcworICogbm8gb3RoZXIgQ1BVIHdoZXJlIGNvbmN1cnJlbnQgYWNjZXNzIGNhbiBoYXBwZW4uCisgKiBJZiBldmVyIHRoZXJlIGlzIGEgd2F5IHRvIGZvcmNlIGF0IGxlYXN0IEIgYW5kIEMgdG8gYWx3YXlzIGJlIGV4ZWN1dGVkCisgKiBvbiB0aGUgc2FtZSBDUFUgdGhlbiB3ZSBjb3VsZCB1c2UgcmVhZC93cml0ZSBsb2NrcyB0byBwcm90ZWN0IGFnYWluc3QKKyAqIGFueSBvdGhlciBjb25jdXJyZW50IGFjY2VzcyBhbmQgQyB3b3VsZCBhbHdheXMgaW50ZXJydXB0IEIuIEJ1dCBsaWZlCisgKiBpc24ndCB0aGF0IGVhc3kgaW4gYSBTTVAgd29ybGQuLi4KKyAqLworI2RlZmluZSBzbWNfc3BlY2lhbF90cnlsb2NrKGxvY2spCQkJCQlcCisoewkJCQkJCQkJCVwKKwlpbnQgX19yZXQ7CQkJCQkJCVwKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOwkJCQkJCVwKKwlfX3JldCA9IHNwaW5fdHJ5bG9jayhsb2NrKTsJCQkJCVwKKwlpZiAoIV9fcmV0KQkJCQkJCQlcCisJCWxvY2FsX2lycV9lbmFibGUoKTsJCQkJCVwKKwlfX3JldDsJCQkJCQkJCVwKK30pCisjZGVmaW5lIHNtY19zcGVjaWFsX2xvY2sobG9jaykJCXNwaW5fbG9ja19pcnEobG9jaykKKyNkZWZpbmUgc21jX3NwZWNpYWxfdW5sb2NrKGxvY2spCXNwaW5fdW5sb2NrX2lycShsb2NrKQorI2Vsc2UKKyNkZWZpbmUgc21jX3NwZWNpYWxfdHJ5bG9jayhsb2NrKQkoMSkKKyNkZWZpbmUgc21jX3NwZWNpYWxfbG9jayhsb2NrKQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBzbWNfc3BlY2lhbF91bmxvY2sobG9jaykJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBhY3R1YWxseSBzZW5kIGEgcGFja2V0IHRvIHRoZSBjaGlwLgorICovCitzdGF0aWMgdm9pZCBzbWNfaGFyZHdhcmVfc2VuZF9wa3QodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IHBhY2tldF9ubywgbGVuOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCURCRygzLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoIXNtY19zcGVjaWFsX3RyeWxvY2soJmxwLT5sb2NrKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXRhc2tsZXRfc2NoZWR1bGUoJmxwLT50eF90YXNrKTsKKwkJcmV0dXJuOworCX0KKworCXNrYiA9IGxwLT5wZW5kaW5nX3R4X3NrYjsKKwlscC0+cGVuZGluZ190eF9za2IgPSBOVUxMOworCXBhY2tldF9ubyA9IFNNQ19HRVRfQVIoKTsKKwlpZiAodW5saWtlbHkocGFja2V0X25vICYgQVJfRkFJTEVEKSkgeworCQlwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iLCBkZXYtPm5hbWUpOworCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQlzbWNfc3BlY2lhbF91bmxvY2soJmxwLT5sb2NrKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldCAqLworCVNNQ19TRVRfUE4ocGFja2V0X25vKTsKKwlTTUNfU0VUX1BUUihQVFJfQVVUT0lOQyk7CisKKwlidWYgPSBza2ItPmRhdGE7CisJbGVuID0gc2tiLT5sZW47CisJREJHKDIsICIlczogVFggUE5SIDB4JXggTEVOR1RIIDB4JTA0eCAoJWQpIEJVRiAweCVwXG4iLAorCQlkZXYtPm5hbWUsIHBhY2tldF9ubywgbGVuLCBsZW4sIGJ1Zik7CisJUFJJTlRfUEtUKGJ1ZiwgbGVuKTsKKworCS8qCisJICogU2VuZCB0aGUgcGFja2V0IGxlbmd0aCAoKzYgZm9yIHN0YXR1cyB3b3JkcywgbGVuZ3RoLCBhbmQgY3RsLgorCSAqIFRoZSBjYXJkIHdpbGwgcGFkIHRvIDY0IGJ5dGVzIHdpdGggemVyb2VzIGlmIHBhY2tldCBpcyB0b28gc21hbGwuCisJICovCisJU01DX1BVVF9QS1RfSERSKDAsIGxlbiArIDYpOworCisJLyogc2VuZCB0aGUgYWN0dWFsIGRhdGEgKi8KKwlTTUNfUFVTSF9EQVRBKGJ1ZiwgbGVuICYgfjEpOworCisJLyogU2VuZCBmaW5hbCBjdGwgd29yZCB3aXRoIHRoZSBsYXN0IGJ5dGUgaWYgdGhlcmUgaXMgb25lICovCisJU01DX291dHcoKChsZW4gJiAxKSA/ICgweDIwMDAgfCBidWZbbGVuLTFdKSA6IDApLCBpb2FkZHIsIERBVEFfUkVHKTsKKworCS8qCisJICogSWYgVEhST1RUTEVfVFhfUEtUUyBpcyBzZXQsIHdlIGxvb2sgYXQgdGhlIFRYX0VNUFRZIGZsYWcKKwkgKiBiZWZvcmUgcXVldWVpbmcgdGhpcyBwYWNrZXQgZm9yIFRYLCBhbmQgaWYgaXQncyBjbGVhciB0aGVuCisJICogd2Ugc3RvcCB0aGUgcXVldWUgaGVyZS4gIFRoaXMgd2lsbCBoYXZlIHRoZSBlZmZlY3Qgb2YKKwkgKiBoYXZpbmcgYXQgbW9zdCAyIHBhY2tldHMgcXVldWVkIGZvciBUWCBpbiB0aGUgY2hpcCdzIG1lbW9yeQorCSAqIGF0IGFsbCB0aW1lLiBJZiBUSFJPVFRMRV9UWF9QS1RTIGlzIG5vdCBzZXQgdGhlbiB0aGUgcXVldWUKKwkgKiBpcyBzdG9wcGVkIG9ubHkgd2hlbiBtZW1vcnkgYWxsb2NhdGlvbiAoTUNfQUxMT0MpIGRvZXMgbm90CisJICogc3VjY2VlZCByaWdodCBhd2F5LgorCSAqLworCWlmIChUSFJPVFRMRV9UWF9QS1RTICYmICEoU01DX0dFVF9JTlQoKSAmIElNX1RYX0VNUFRZX0lOVCkpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIHF1ZXVlIHRoZSBwYWNrZXQgZm9yIFRYICovCisJU01DX1NFVF9NTVVfQ01EKE1DX0VOUVVFVUUpOworCVNNQ19BQ0tfSU5UKElNX1RYX0VNUFRZX0lOVCk7CisJc21jX3NwZWNpYWxfdW5sb2NrKCZscC0+bG9jayk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlscC0+c3RhdHMudHhfcGFja2V0cysrOworCWxwLT5zdGF0cy50eF9ieXRlcyArPSBsZW47CisKKwlTTUNfRU5BQkxFX0lOVChJTV9UWF9JTlQgfCBJTV9UWF9FTVBUWV9JTlQpOworCitkb25lOglpZiAoIVRIUk9UVExFX1RYX1BLVFMpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKworLyoKKyAqIFNpbmNlIEkgYW0gbm90IHN1cmUgaWYgSSB3aWxsIGhhdmUgZW5vdWdoIHJvb20gaW4gdGhlIGNoaXAncyByYW0KKyAqIHRvIHN0b3JlIHRoZSBwYWNrZXQsIEkgY2FsbCB0aGlzIHJvdXRpbmUgd2hpY2ggZWl0aGVyIHNlbmRzIGl0CisgKiBub3csIG9yIHNldCB0aGUgY2FyZCB0byBnZW5lcmF0ZXMgYW4gaW50ZXJydXB0IHdoZW4gcmVhZHkKKyAqIGZvciB0aGUgcGFja2V0LgorICovCitzdGF0aWMgaW50IHNtY19oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgbnVtUGFnZXMsIHBvbGxfY291bnQsIHN0YXR1czsKKworCURCRygzLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisKKwlCVUdfT04obHAtPnBlbmRpbmdfdHhfc2tiICE9IE5VTEwpOworCWxwLT5wZW5kaW5nX3R4X3NrYiA9IHNrYjsKKworCS8qCisJICogVGhlIE1NVSB3YW50cyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGJlIHRoZSBudW1iZXIgb2YgMjU2IGJ5dGVzCisJICogJ3BhZ2VzJywgbWludXMgMSAoc2luY2UgYSBwYWNrZXQgY2FuJ3QgZXZlciBoYXZlIDAgcGFnZXMgOikpCisJICoKKwkgKiBUaGUgOTFDMTExIGlnbm9yZXMgdGhlIHNpemUgYml0cywgYnV0IGVhcmxpZXIgbW9kZWxzIGRvbid0LgorCSAqCisJICogUGt0IHNpemUgZm9yIGFsbG9jYXRpbmcgaXMgZGF0YSBsZW5ndGggKzYgKGZvciBhZGRpdGlvbmFsIHN0YXR1cworCSAqIHdvcmRzLCBsZW5ndGggYW5kIGN0bCkKKwkgKgorCSAqIElmIG9kZCBzaXplIHRoZW4gbGFzdCBieXRlIGlzIGluY2x1ZGVkIGluIGN0bCB3b3JkLgorCSAqLworCW51bVBhZ2VzID0gKChza2ItPmxlbiAmIH4xKSArICg2IC0gMSkpID4+IDg7CisJaWYgKHVubGlrZWx5KG51bVBhZ2VzID4gNykpIHsKKwkJcHJpbnRrKCIlczogRmFyIHRvbyBiaWcgcGFja2V0IGVycm9yLlxuIiwgZGV2LT5uYW1lKTsKKwkJbHAtPnBlbmRpbmdfdHhfc2tiID0gTlVMTDsKKwkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQlscC0+c3RhdHMudHhfZHJvcHBlZCsrOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCXNtY19zcGVjaWFsX2xvY2soJmxwLT5sb2NrKTsKKworCS8qIG5vdywgdHJ5IHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkgKi8KKwlTTUNfU0VUX01NVV9DTUQoTUNfQUxMT0MgfCBudW1QYWdlcyk7CisKKwkvKgorCSAqIFBvbGwgdGhlIGNoaXAgZm9yIGEgc2hvcnQgYW1vdW50IG9mIHRpbWUgaW4gY2FzZSB0aGUKKwkgKiBhbGxvY2F0aW9uIHN1Y2NlZWRzIHF1aWNrbHkuCisJICovCisJcG9sbF9jb3VudCA9IE1FTU9SWV9XQUlUX1RJTUU7CisJZG8geworCQlzdGF0dXMgPSBTTUNfR0VUX0lOVCgpOworCQlpZiAoc3RhdHVzICYgSU1fQUxMT0NfSU5UKSB7CisJCQlTTUNfQUNLX0lOVChJTV9BTExPQ19JTlQpOworICAJCQlicmVhazsKKwkJfQorICAgCX0gd2hpbGUgKC0tcG9sbF9jb3VudCk7CisKKwlzbWNfc3BlY2lhbF91bmxvY2soJmxwLT5sb2NrKTsKKworICAgCWlmICghcG9sbF9jb3VudCkgeworCQkvKiBvaCB3ZWxsLCB3YWl0IHVudGlsIHRoZSBjaGlwIGZpbmRzIG1lbW9yeSBsYXRlciAqLworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCURCRygyLCAiJXM6IFRYIG1lbW9yeSBhbGxvY2F0aW9uIGRlZmVycmVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJU01DX0VOQUJMRV9JTlQoSU1fQUxMT0NfSU5UKTsKKyAgIAl9IGVsc2UgeworCQkvKgorCQkgKiBBbGxvY2F0aW9uIHN1Y2NlZWRlZDogcHVzaCBwYWNrZXQgdG8gdGhlIGNoaXAncyBvd24gbWVtb3J5CisJCSAqIGltbWVkaWF0ZWx5LgorCQkgKi8gIAorCQlzbWNfaGFyZHdhcmVfc2VuZF9wa3QoKHVuc2lnbmVkIGxvbmcpZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaGFuZGxlcyBhIFRYIGludGVycnVwdCwgd2hpY2ggaXMgb25seSBjYWxsZWQgd2hlbjoKKyAqIC0gYSBUWCBlcnJvciBvY2N1cnJlZCwgb3IKKyAqIC0gQ1RMX0FVVE9fUkVMRUFTRSBpcyBub3Qgc2V0IGFuZCBUWCBvZiBhIHBhY2tldCBjb21wbGV0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHNtY190eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCXVuc2lnbmVkIGludCBzYXZlZF9wYWNrZXQsIHBhY2tldF9ubywgdHhfc3RhdHVzLCBwa3RfbGVuOworCisJREJHKDMsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKworCS8qIElmIHRoZSBUWCBGSUZPIGlzIGVtcHR5IHRoZW4gbm90aGluZyB0byBkbyAqLworCXBhY2tldF9ubyA9IFNNQ19HRVRfVFhGSUZPKCk7CisJaWYgKHVubGlrZWx5KHBhY2tldF9ubyAmIFRYRklGT19URU1QVFkpKSB7CisJCVBSSU5USygiJXM6IHNtY190eCB3aXRoIG5vdGhpbmcgb24gRklGTy5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBzZWxlY3QgcGFja2V0IHRvIHJlYWQgZnJvbSAqLworCXNhdmVkX3BhY2tldCA9IFNNQ19HRVRfUE4oKTsKKwlTTUNfU0VUX1BOKHBhY2tldF9ubyk7CisKKwkvKiByZWFkIHRoZSBmaXJzdCB3b3JkIChzdGF0dXMgd29yZCkgZnJvbSB0aGlzIHBhY2tldCAqLworCVNNQ19TRVRfUFRSKFBUUl9BVVRPSU5DIHwgUFRSX1JFQUQpOworCVNNQ19HRVRfUEtUX0hEUih0eF9zdGF0dXMsIHBrdF9sZW4pOworCURCRygyLCAiJXM6IFRYIFNUQVRVUyAweCUwNHggUE5SIDB4JTAyeFxuIiwKKwkJZGV2LT5uYW1lLCB0eF9zdGF0dXMsIHBhY2tldF9ubyk7CisKKwlpZiAoISh0eF9zdGF0dXMgJiBUU19TVUNDRVNTKSkKKwkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCWlmICh0eF9zdGF0dXMgJiBUU19MT1NUQ0FSKQorCQlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKworCWlmICh0eF9zdGF0dXMgJiBUU19MQVRDT0wpIHsKKwkJUFJJTlRLKCIlczogbGF0ZSBjb2xsaXNpb24gb2NjdXJyZWQgb24gbGFzdCB4bWl0XG4iLCBkZXYtPm5hbWUpOworCQlscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQlpZiAoIShscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycyAmIDYzKSAmJiBuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiB1bmV4cGVjdGVkbHkgbGFyZ2UgbnVtYmVycyBvZiAiCisJCQkgICAgICAgImxhdGUgY29sbGlzaW9ucy4gUGxlYXNlIGNoZWNrIGR1cGxleCAiCisJCQkgICAgICAgInNldHRpbmcuXG4iLCBkZXYtPm5hbWUpOworCQl9CisJfQorCisJLyoga2lsbCB0aGUgcGFja2V0ICovCisJU01DX1dBSVRfTU1VX0JVU1koKTsKKwlTTUNfU0VUX01NVV9DTUQoTUNfRlJFRVBLVCk7CisKKwkvKiBEb24ndCByZXN0b3JlIFBhY2tldCBOdW1iZXIgUmVnIHVudGlsIGJ1c3kgYml0IGlzIGNsZWFyZWQgKi8KKwlTTUNfV0FJVF9NTVVfQlVTWSgpOworCVNNQ19TRVRfUE4oc2F2ZWRfcGFja2V0KTsKKworCS8qIHJlLWVuYWJsZSB0cmFuc21pdCAqLworCVNNQ19TRUxFQ1RfQkFOSygwKTsKKwlTTUNfU0VUX1RDUihscC0+dGNyX2N1cl9tb2RlKTsKKwlTTUNfU0VMRUNUX0JBTksoMik7Cit9CisKKworLyotLS1QSFkgQ09OVFJPTCBBTkQgQ09ORklHVVJBVElPTi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgc21jX21paV9vdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHZhbCwgaW50IGJpdHMpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CisJdW5zaWduZWQgaW50IG1paV9yZWcsIG1hc2s7CisKKwltaWlfcmVnID0gU01DX0dFVF9NSUkoKSAmIH4oTUlJX01DTEsgfCBNSUlfTURPRSB8IE1JSV9NRE8pOworCW1paV9yZWcgfD0gTUlJX01ET0U7CisKKwlmb3IgKG1hc2sgPSAxIDw8IChiaXRzIC0gMSk7IG1hc2s7IG1hc2sgPj49IDEpIHsKKwkJaWYgKHZhbCAmIG1hc2spCisJCQltaWlfcmVnIHw9IE1JSV9NRE87CisJCWVsc2UKKwkJCW1paV9yZWcgJj0gfk1JSV9NRE87CisKKwkJU01DX1NFVF9NSUkobWlpX3JlZyk7CisJCXVkZWxheShNSUlfREVMQVkpOworCQlTTUNfU0VUX01JSShtaWlfcmVnIHwgTUlJX01DTEspOworCQl1ZGVsYXkoTUlJX0RFTEFZKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc21jX21paV9pbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYml0cykKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgbWlpX3JlZywgbWFzaywgdmFsOworCisJbWlpX3JlZyA9IFNNQ19HRVRfTUlJKCkgJiB+KE1JSV9NQ0xLIHwgTUlJX01ET0UgfCBNSUlfTURPKTsKKwlTTUNfU0VUX01JSShtaWlfcmVnKTsKKworCWZvciAobWFzayA9IDEgPDwgKGJpdHMgLSAxKSwgdmFsID0gMDsgbWFzazsgbWFzayA+Pj0gMSkgeworCQlpZiAoU01DX0dFVF9NSUkoKSAmIE1JSV9NREkpCisJCQl2YWwgfD0gbWFzazsKKworCQlTTUNfU0VUX01JSShtaWlfcmVnKTsKKwkJdWRlbGF5KE1JSV9ERUxBWSk7CisJCVNNQ19TRVRfTUlJKG1paV9yZWcgfCBNSUlfTUNMSyk7CisJCXVkZWxheShNSUlfREVMQVkpOworCX0KKworCXJldHVybiB2YWw7Cit9CisKKy8qCisgKiBSZWFkcyBhIHJlZ2lzdGVyIGZyb20gdGhlIE1JSSBNYW5hZ2VtZW50IHNlcmlhbCBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBzbWNfcGh5X3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeWFkZHIsIGludCBwaHlyZWcpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CisJdW5zaWduZWQgaW50IHBoeWRhdGE7CisKKwlTTUNfU0VMRUNUX0JBTksoMyk7CisKKwkvKiBJZGxlIC0gMzIgb25lcyAqLworCXNtY19taWlfb3V0KGRldiwgMHhmZmZmZmZmZiwgMzIpOworCisJLyogU3RhcnQgY29kZSAoMDEpICsgcmVhZCAoMTApICsgcGh5YWRkciArIHBoeXJlZyAqLworCXNtY19taWlfb3V0KGRldiwgNiA8PCAxMCB8IHBoeWFkZHIgPDwgNSB8IHBoeXJlZywgMTQpOworCisJLyogVHVybmFyb3VuZCAoMmJpdHMpICsgcGh5ZGF0YSAqLworCXBoeWRhdGEgPSBzbWNfbWlpX2luKGRldiwgMTgpOworCisJLyogUmV0dXJuIHRvIGlkbGUgc3RhdGUgKi8KKwlTTUNfU0VUX01JSShTTUNfR0VUX01JSSgpICYgfihNSUlfTUNMS3xNSUlfTURPRXxNSUlfTURPKSk7CisKKwlEQkcoMywgIiVzOiBwaHlhZGRyPTB4JXgsIHBoeXJlZz0weCV4LCBwaHlkYXRhPTB4JXhcbiIsCisJCV9fRlVOQ1RJT05fXywgcGh5YWRkciwgcGh5cmVnLCBwaHlkYXRhKTsKKworCVNNQ19TRUxFQ1RfQkFOSygyKTsKKwlyZXR1cm4gcGh5ZGF0YTsKK30KKworLyoKKyAqIFdyaXRlcyBhIHJlZ2lzdGVyIHRvIHRoZSBNSUkgTWFuYWdlbWVudCBzZXJpYWwgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyB2b2lkIHNtY19waHlfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeWFkZHIsIGludCBwaHlyZWcsCisJCQkgIGludCBwaHlkYXRhKQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCisJU01DX1NFTEVDVF9CQU5LKDMpOworCisJLyogSWRsZSAtIDMyIG9uZXMgKi8KKwlzbWNfbWlpX291dChkZXYsIDB4ZmZmZmZmZmYsIDMyKTsKKworCS8qIFN0YXJ0IGNvZGUgKDAxKSArIHdyaXRlICgwMSkgKyBwaHlhZGRyICsgcGh5cmVnICsgdHVybmFyb3VuZCArIHBoeWRhdGEgKi8KKwlzbWNfbWlpX291dChkZXYsIDUgPDwgMjggfCBwaHlhZGRyIDw8IDIzIHwgcGh5cmVnIDw8IDE4IHwgMiA8PCAxNiB8IHBoeWRhdGEsIDMyKTsKKworCS8qIFJldHVybiB0byBpZGxlIHN0YXRlICovCisJU01DX1NFVF9NSUkoU01DX0dFVF9NSUkoKSAmIH4oTUlJX01DTEt8TUlJX01ET0V8TUlJX01ETykpOworCisJREJHKDMsICIlczogcGh5YWRkcj0weCV4LCBwaHlyZWc9MHgleCwgcGh5ZGF0YT0weCV4XG4iLAorCQlfX0ZVTkNUSU9OX18sIHBoeWFkZHIsIHBoeXJlZywgcGh5ZGF0YSk7CisKKwlTTUNfU0VMRUNUX0JBTksoMik7Cit9CisKKy8qCisgKiBGaW5kcyBhbmQgcmVwb3J0cyB0aGUgUEhZIGFkZHJlc3MKKyAqLworc3RhdGljIHZvaWQgc21jX3BoeV9kZXRlY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHBoeWFkZHI7CisKKwlEQkcoMiwgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCisJbHAtPnBoeV90eXBlID0gMDsKKworCS8qCisJICogU2NhbiBhbGwgMzIgUEhZIGFkZHJlc3NlcyBpZiBuZWNlc3NhcnksIHN0YXJ0aW5nIGF0CisJICogUEhZIzEgdG8gUEhZIzMxLCBhbmQgdGhlbiBQSFkjMCBsYXN0LgorCSAqLworCWZvciAocGh5YWRkciA9IDE7IHBoeWFkZHIgPCAzMzsgKytwaHlhZGRyKSB7CisJCXVuc2lnbmVkIGludCBpZDEsIGlkMjsKKworCQkvKiBSZWFkIHRoZSBQSFkgaWRlbnRpZmllcnMgKi8KKwkJaWQxID0gc21jX3BoeV9yZWFkKGRldiwgcGh5YWRkciAmIDMxLCBNSUlfUEhZU0lEMSk7CisJCWlkMiA9IHNtY19waHlfcmVhZChkZXYsIHBoeWFkZHIgJiAzMSwgTUlJX1BIWVNJRDIpOworCisJCURCRygzLCAiJXM6IHBoeV9pZDE9MHgleCwgcGh5X2lkMj0weCV4XG4iLAorCQkJZGV2LT5uYW1lLCBpZDEsIGlkMik7CisKKwkJLyogTWFrZSBzdXJlIGl0IGlzIGEgdmFsaWQgaWRlbnRpZmllciAqLworCQlpZiAoaWQxICE9IDB4MDAwMCAmJiBpZDEgIT0gMHhmZmZmICYmIGlkMSAhPSAweDgwMDAgJiYKKwkJICAgIGlkMiAhPSAweDAwMDAgJiYgaWQyICE9IDB4ZmZmZiAmJiBpZDIgIT0gMHg4MDAwKSB7CisJCQkvKiBTYXZlIHRoZSBQSFkncyBhZGRyZXNzICovCisJCQlscC0+bWlpLnBoeV9pZCA9IHBoeWFkZHIgJiAzMTsKKwkJCWxwLT5waHlfdHlwZSA9IGlkMSA8PCAxNiB8IGlkMjsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKgorICogU2V0cyB0aGUgUEhZIHRvIGEgY29uZmlndXJhdGlvbiBhcyBkZXRlcm1pbmVkIGJ5IHRoZSB1c2VyCisgKi8KK3N0YXRpYyBpbnQgc21jX3BoeV9maXhlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCWludCBwaHlhZGRyID0gbHAtPm1paS5waHlfaWQ7CisJaW50IGJtY3IsIGNmZzE7CisKKwlEQkcoMywgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCisJLyogRW50ZXIgTGluayBEaXNhYmxlIHN0YXRlICovCisJY2ZnMSA9IHNtY19waHlfcmVhZChkZXYsIHBoeWFkZHIsIFBIWV9DRkcxX1JFRyk7CisJY2ZnMSB8PSBQSFlfQ0ZHMV9MTktESVM7CisJc21jX3BoeV93cml0ZShkZXYsIHBoeWFkZHIsIFBIWV9DRkcxX1JFRywgY2ZnMSk7CisKKwkvKgorCSAqIFNldCBvdXIgZml4ZWQgY2FwYWJpbGl0aWVzCisJICogRGlzYWJsZSBhdXRvLW5lZ290aWF0aW9uCisJICovCisJYm1jciA9IDA7CisKKwlpZiAobHAtPmN0bF9yZmR1cGx4KQorCQlibWNyIHw9IEJNQ1JfRlVMTERQTFg7CisKKwlpZiAobHAtPmN0bF9yc3BlZWQgPT0gMTAwKQorCQlibWNyIHw9IEJNQ1JfU1BFRUQxMDA7CisKKwkvKiBXcml0ZSBvdXIgY2FwYWJpbGl0aWVzIHRvIHRoZSBwaHkgY29udHJvbCByZWdpc3RlciAqLworCXNtY19waHlfd3JpdGUoZGV2LCBwaHlhZGRyLCBNSUlfQk1DUiwgYm1jcik7CisKKwkvKiBSZS1Db25maWd1cmUgdGhlIFJlY2VpdmUvUGh5IENvbnRyb2wgcmVnaXN0ZXIgKi8KKwlTTUNfU0VMRUNUX0JBTksoMCk7CisJU01DX1NFVF9SUEMobHAtPnJwY19jdXJfbW9kZSk7CisJU01DX1NFTEVDVF9CQU5LKDIpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBzbWNfcGh5X3Jlc2V0IC0gcmVzZXQgdGhlIHBoeQorICogQGRldjogbmV0IGRldmljZQorICogQHBoeTogcGh5IGFkZHJlc3MKKyAqCisgKiBJc3N1ZSBhIHNvZnR3YXJlIHJlc2V0IGZvciB0aGUgc3BlY2lmaWVkIFBIWSBhbmQKKyAqIHdhaXQgdXAgdG8gMTAwbXMgZm9yIHRoZSByZXNldCB0byBjb21wbGV0ZS4gIFdlIHNob3VsZAorICogbm90IGFjY2VzcyB0aGUgUEhZIGZvciA1MG1zIGFmdGVyIGlzc3VpbmcgdGhlIHJlc2V0LgorICoKKyAqIFRoZSB0aW1lIHRvIHdhaXQgYXBwZWFycyB0byBiZSBkZXBlbmRlbnQgb24gdGhlIFBIWS4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGxwLT5sb2NrIGxvY2tlZC4KKyAqLworc3RhdGljIGludCBzbWNfcGh5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHkpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBibWNyOworCWludCB0aW1lb3V0OworCisJc21jX3BoeV93cml0ZShkZXYsIHBoeSwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCisJZm9yICh0aW1lb3V0ID0gMjsgdGltZW91dDsgdGltZW91dC0tKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCQltc2xlZXAoNTApOworCQlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisKKwkJYm1jciA9IHNtY19waHlfcmVhZChkZXYsIHBoeSwgTUlJX0JNQ1IpOworCQlpZiAoIShibWNyICYgQk1DUl9SRVNFVCkpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gYm1jciAmIEJNQ1JfUkVTRVQ7Cit9CisKKy8qCisgKiBzbWNfcGh5X3Bvd2VyZG93biAtIHBvd2VyZG93biBwaHkKKyAqIEBkZXY6IG5ldCBkZXZpY2UKKyAqCisgKiBQb3dlciBkb3duIHRoZSBzcGVjaWZpZWQgUEhZCisgKi8KK3N0YXRpYyB2b2lkIHNtY19waHlfcG93ZXJkb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBibWNyOworCWludCBwaHkgPSBscC0+bWlpLnBoeV9pZDsKKworCWlmIChscC0+cGh5X3R5cGUgPT0gMCkKKwkJcmV0dXJuOworCisJLyogV2UgbmVlZCB0byBlbnN1cmUgdGhhdCBubyBjYWxscyB0byBzbWNfcGh5X2NvbmZpZ3VyZSBhcmUKKwkgICBwZW5kaW5nLgorCisJICAgZmx1c2hfc2NoZWR1bGVkX3dvcmsoKSBjYW5ub3QgYmUgY2FsbGVkIGJlY2F1c2Ugd2UgYXJlCisJICAgcnVubmluZyB3aXRoIHRoZSBuZXRsaW5rIHNlbWFwaG9yZSBoZWxkIChmcm9tCisJICAgZGV2aW5ldF9pb2N0bCgpKSBhbmQgdGhlIHBlbmRpbmcgd29yayBxdWV1ZSBjb250YWlucworCSAgIGxpbmt3YXRjaF9ldmVudCgpIChzY2hlZHVsZWQgYnkgbmV0aWZfY2Fycmllcl9vZmYoKQorCSAgIGFib3ZlKS4gbGlua3dhdGNoX2V2ZW50KCkgYWxzbyB3YW50cyB0aGUgbmV0bGluayBzZW1hcGhvcmUuCisJKi8KKwl3aGlsZShscC0+d29ya19wZW5kaW5nKQorCQlzY2hlZHVsZSgpOworCisJYm1jciA9IHNtY19waHlfcmVhZChkZXYsIHBoeSwgTUlJX0JNQ1IpOworCXNtY19waHlfd3JpdGUoZGV2LCBwaHksIE1JSV9CTUNSLCBibWNyIHwgQk1DUl9QRE9XTik7Cit9CisKKy8qCisgKiBzbWNfcGh5X2NoZWNrX21lZGlhIC0gY2hlY2sgdGhlIG1lZGlhIHN0YXR1cyBhbmQgYWRqdXN0IFRDUgorICogQGRldjogbmV0IGRldmljZQorICogQGluaXQ6IHNldCB0cnVlIGZvciBpbml0aWFsaXNhdGlvbgorICoKKyAqIFNlbGVjdCBkdXBsZXggbW9kZSBkZXBlbmRpbmcgb24gbmVnb3RpYXRpb24gc3RhdGUuICBUaGlzCisgKiBhbHNvIHVwZGF0ZXMgb3VyIGNhcnJpZXIgc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkIHNtY19waHlfY2hlY2tfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluaXQpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CisKKwlpZiAobWlpX2NoZWNrX21lZGlhKCZscC0+bWlpLCBuZXRpZl9tc2dfbGluayhscCksIGluaXQpKSB7CisJCS8qIGR1cGxleCBzdGF0ZSBoYXMgY2hhbmdlZCAqLworCQlpZiAobHAtPm1paS5mdWxsX2R1cGxleCkgeworCQkJbHAtPnRjcl9jdXJfbW9kZSB8PSBUQ1JfU1dGRFVQOworCQl9IGVsc2UgeworCQkJbHAtPnRjcl9jdXJfbW9kZSAmPSB+VENSX1NXRkRVUDsKKwkJfQorCisJCVNNQ19TRUxFQ1RfQkFOSygwKTsKKwkJU01DX1NFVF9UQ1IobHAtPnRjcl9jdXJfbW9kZSk7CisJfQorfQorCisvKgorICogQ29uZmlndXJlcyB0aGUgc3BlY2lmaWVkIFBIWSB0aHJvdWdoIHRoZSBNSUkgbWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqIHVzaW5nIEF1dG9uZWdvdGlhdGlvbi4KKyAqIENhbGxzIHNtY19waHlfZml4ZWQoKSBpZiB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIGEgY2VydGFpbiBjb25maWcuCisgKiBJZiBSUEMgQU5FRyBiaXQgaXMgc2V0LCB0aGUgbWVkaWEgc2VsZWN0aW9uIGlzIGRlcGVuZGVudCBwdXJlbHkgb24KKyAqIHRoZSBzZWxlY3Rpb24gYnkgdGhlIE1JSSAoZWl0aGVyIGluIHRoZSBNSUkgQk1DUiByZWcgb3IgdGhlIHJlc3VsdAorICogb2YgYXV0b25lZ290aWF0aW9uLikgIElmIHRoZSBSUEMgQU5FRyBiaXQgaXMgY2xlYXJlZCwgdGhlIHNlbGVjdGlvbgorICogaXMgY29udHJvbGxlZCBieSB0aGUgUlBDIFNQRUVEIGFuZCBSUEMgRFBMWCBiaXRzLgorICovCitzdGF0aWMgdm9pZCBzbWNfcGh5X2NvbmZpZ3VyZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCWludCBwaHlhZGRyID0gbHAtPm1paS5waHlfaWQ7CisJaW50IG15X3BoeV9jYXBzOyAvKiBNeSBQSFkgY2FwYWJpbGl0aWVzICovCisJaW50IG15X2FkX2NhcHM7IC8qIE15IEFkdmVydGlzZWQgY2FwYWJpbGl0aWVzICovCisJaW50IHN0YXR1czsKKworCURCRygzLCAiJXM6c21jX3Byb2dyYW1fcGh5KClcbiIsIGRldi0+bmFtZSk7CisKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisKKwkvKgorCSAqIFdlIHNob3VsZCBub3QgYmUgY2FsbGVkIGlmIHBoeV90eXBlIGlzIHplcm8uCisJICovCisJaWYgKGxwLT5waHlfdHlwZSA9PSAwKQorCQlnb3RvIHNtY19waHlfY29uZmlndXJlX2V4aXQ7CisKKwlpZiAoc21jX3BoeV9yZXNldChkZXYsIHBoeWFkZHIpKSB7CisJCXByaW50aygiJXM6IFBIWSByZXNldCB0aW1lZCBvdXRcbiIsIGRldi0+bmFtZSk7CisJCWdvdG8gc21jX3BoeV9jb25maWd1cmVfZXhpdDsKKwl9CisKKwkvKgorCSAqIEVuYWJsZSBQSFkgSW50ZXJydXB0cyAoZm9yIHJlZ2lzdGVyIDE4KQorCSAqIEludGVycnVwdHMgbGlzdGVkIGhlcmUgYXJlIGRpc2FibGVkCisJICovCisJc21jX3BoeV93cml0ZShkZXYsIHBoeWFkZHIsIFBIWV9NQVNLX1JFRywKKwkJUEhZX0lOVF9MT1NTU1lOQyB8IFBIWV9JTlRfQ1dSRCB8IFBIWV9JTlRfU1NEIHwKKwkJUEhZX0lOVF9FU0QgfCBQSFlfSU5UX1JQT0wgfCBQSFlfSU5UX0pBQiB8CisJCVBIWV9JTlRfU1BEREVUIHwgUEhZX0lOVF9EUExYREVUKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgUmVjZWl2ZS9QaHkgQ29udHJvbCByZWdpc3RlciAqLworCVNNQ19TRUxFQ1RfQkFOSygwKTsKKwlTTUNfU0VUX1JQQyhscC0+cnBjX2N1cl9tb2RlKTsKKworCS8qIElmIHRoZSB1c2VyIHJlcXVlc3RlZCBubyBhdXRvIG5lZywgdGhlbiBnbyBzZXQgaGlzIHJlcXVlc3QgKi8KKwlpZiAobHAtPm1paS5mb3JjZV9tZWRpYSkgeworCQlzbWNfcGh5X2ZpeGVkKGRldik7CisJCWdvdG8gc21jX3BoeV9jb25maWd1cmVfZXhpdDsKKwl9CisKKwkvKiBDb3B5IG91ciBjYXBhYmlsaXRpZXMgZnJvbSBNSUlfQk1TUiB0byBNSUlfQURWRVJUSVNFICovCisJbXlfcGh5X2NhcHMgPSBzbWNfcGh5X3JlYWQoZGV2LCBwaHlhZGRyLCBNSUlfQk1TUik7CisKKwlpZiAoIShteV9waHlfY2FwcyAmIEJNU1JfQU5FR0NBUEFCTEUpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkF1dG8gbmVnb3RpYXRpb24gTk9UIHN1cHBvcnRlZFxuIik7CisJCXNtY19waHlfZml4ZWQoZGV2KTsKKwkJZ290byBzbWNfcGh5X2NvbmZpZ3VyZV9leGl0OworCX0KKworCW15X2FkX2NhcHMgPSBBRFZFUlRJU0VfQ1NNQTsgLyogSSBhbSBDU01BIGNhcGFibGUgKi8KKworCWlmIChteV9waHlfY2FwcyAmIEJNU1JfMTAwQkFTRTQpCisJCW15X2FkX2NhcHMgfD0gQURWRVJUSVNFXzEwMEJBU0U0OworCWlmIChteV9waHlfY2FwcyAmIEJNU1JfMTAwRlVMTCkKKwkJbXlfYWRfY2FwcyB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwlpZiAobXlfcGh5X2NhcHMgJiBCTVNSXzEwMEhBTEYpCisJCW15X2FkX2NhcHMgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJaWYgKG15X3BoeV9jYXBzICYgQk1TUl8xMEZVTEwpCisJCW15X2FkX2NhcHMgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwlpZiAobXlfcGh5X2NhcHMgJiBCTVNSXzEwSEFMRikKKwkJbXlfYWRfY2FwcyB8PSBBRFZFUlRJU0VfMTBIQUxGOworCisJLyogRGlzYWJsZSBjYXBhYmlsaXRpZXMgbm90IHNlbGVjdGVkIGJ5IG91ciB1c2VyICovCisJaWYgKGxwLT5jdGxfcnNwZWVkICE9IDEwMCkKKwkJbXlfYWRfY2FwcyAmPSB+KEFEVkVSVElTRV8xMDBCQVNFNHxBRFZFUlRJU0VfMTAwRlVMTHxBRFZFUlRJU0VfMTAwSEFMRik7CisKKwlpZiAoIWxwLT5jdGxfcmZkdXBseCkKKwkJbXlfYWRfY2FwcyAmPSB+KEFEVkVSVElTRV8xMDBGVUxMfEFEVkVSVElTRV8xMEZVTEwpOworCisJLyogVXBkYXRlIG91ciBBdXRvLU5lZyBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyICovCisJc21jX3BoeV93cml0ZShkZXYsIHBoeWFkZHIsIE1JSV9BRFZFUlRJU0UsIG15X2FkX2NhcHMpOworCWxwLT5taWkuYWR2ZXJ0aXNpbmcgPSBteV9hZF9jYXBzOworCisJLyoKKwkgKiBSZWFkIHRoZSByZWdpc3RlciBiYWNrLiAgV2l0aG91dCB0aGlzLCBpdCBhcHBlYXJzIHRoYXQgd2hlbgorCSAqIGF1dG8tbmVnb3RpYXRpb24gaXMgcmVzdGFydGVkLCBzb21ldGltZXMgaXQgaXNuJ3QgcmVhZHkgYW5kCisJICogdGhlIGxpbmsgZG9lcyBub3QgY29tZSB1cC4KKwkgKi8KKwlzdGF0dXMgPSBzbWNfcGh5X3JlYWQoZGV2LCBwaHlhZGRyLCBNSUlfQURWRVJUSVNFKTsKKworCURCRygyLCAiJXM6IHBoeSBjYXBzPSV4XG4iLCBkZXYtPm5hbWUsIG15X3BoeV9jYXBzKTsKKwlEQkcoMiwgIiVzOiBwaHkgYWR2ZXJ0aXNlZCBjYXBzPSV4XG4iLCBkZXYtPm5hbWUsIG15X2FkX2NhcHMpOworCisJLyogUmVzdGFydCBhdXRvLW5lZ290aWF0aW9uIHByb2Nlc3MgaW4gb3JkZXIgdG8gYWR2ZXJ0aXNlIG15IGNhcHMgKi8KKwlzbWNfcGh5X3dyaXRlKGRldiwgcGh5YWRkciwgTUlJX0JNQ1IsIEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisKKwlzbWNfcGh5X2NoZWNrX21lZGlhKGRldiwgMSk7CisKK3NtY19waHlfY29uZmlndXJlX2V4aXQ6CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisJbHAtPndvcmtfcGVuZGluZyA9IDA7Cit9CisKKy8qCisgKiBzbWNfcGh5X2ludGVycnVwdAorICoKKyAqIFB1cnBvc2U6ICBIYW5kbGUgaW50ZXJydXB0cyByZWxhdGluZyB0byBQSFkgcmVnaXN0ZXIgMTguIFRoaXMgaXMKKyAqICBjYWxsZWQgZnJvbSB0aGUgImhhcmQiIGludGVycnVwdCBoYW5kbGVyIHVuZGVyIG91ciBwcml2YXRlIHNwaW5sb2NrLgorICovCitzdGF0aWMgdm9pZCBzbWNfcGh5X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcGh5YWRkciA9IGxwLT5taWkucGh5X2lkOworCWludCBwaHkxODsKKworCURCRygyLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAobHAtPnBoeV90eXBlID09IDApCisJCXJldHVybjsKKworCWZvcig7OykgeworCQlzbWNfcGh5X2NoZWNrX21lZGlhKGRldiwgMCk7CisKKwkJLyogUmVhZCBQSFkgUmVnaXN0ZXIgMTgsIFN0YXR1cyBPdXRwdXQgKi8KKwkJcGh5MTggPSBzbWNfcGh5X3JlYWQoZGV2LCBwaHlhZGRyLCBQSFlfSU5UX1JFRyk7CisJCWlmICgocGh5MTggJiBQSFlfSU5UX0lOVCkgPT0gMCkKKwkJCWJyZWFrOworCX0KK30KKworLyotLS0gRU5EIFBIWSBDT05UUk9MIEFORCBDT05GSUdVUkFUSU9OLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHNtY18xMGJ0X2NoZWNrX21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbml0KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCXVuc2lnbmVkIGludCBvbGRfY2FycmllciwgbmV3X2NhcnJpZXI7CisKKwlvbGRfY2FycmllciA9IG5ldGlmX2NhcnJpZXJfb2soZGV2KSA/IDEgOiAwOworCisJU01DX1NFTEVDVF9CQU5LKDApOworCW5ld19jYXJyaWVyID0gU01DX2ludyhpb2FkZHIsIEVQSF9TVEFUVVNfUkVHKSAmIEVTX0xJTktfT0sgPyAxIDogMDsKKwlTTUNfU0VMRUNUX0JBTksoMik7CisKKwlpZiAoaW5pdCB8fCAob2xkX2NhcnJpZXIgIT0gbmV3X2NhcnJpZXIpKSB7CisJCWlmICghbmV3X2NhcnJpZXIpIHsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCX0gZWxzZSB7CisJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCX0KKwkJaWYgKG5ldGlmX21zZ19saW5rKGxwKSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rICVzXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgbmV3X2NhcnJpZXIgPyAidXAiIDogImRvd24iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNtY19lcGhfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CisJdW5zaWduZWQgaW50IGN0bDsKKworCXNtY18xMGJ0X2NoZWNrX21lZGlhKGRldiwgMCk7CisKKwlTTUNfU0VMRUNUX0JBTksoMSk7CisJY3RsID0gU01DX0dFVF9DVEwoKTsKKwlTTUNfU0VUX0NUTChjdGwgJiB+Q1RMX0xFX0VOQUJMRSk7CisJU01DX1NFVF9DVEwoY3RsKTsKKwlTTUNfU0VMRUNUX0JBTksoMik7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBtYWluIHJvdXRpbmUgb2YgdGhlIGRyaXZlciwgdG8gaGFuZGxlIHRoZSBkZXZpY2Ugd2hlbgorICogaXQgbmVlZHMgc29tZSBhdHRlbnRpb24uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzbWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKwlpbnQgc3RhdHVzLCBtYXNrLCB0aW1lb3V0LCBjYXJkX3N0YXRzOworCWludCBzYXZlZF9wb2ludGVyOworCisJREJHKDMsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCisJLyogQSBwcmVhbWJsZSBtYXkgYmUgdXNlZCB3aGVuIHRoZXJlIGlzIGEgcG90ZW50aWFsIHJhY2UKKwkgKiBiZXR3ZWVuIHRoZSBpbnRlcnJ1cHRpYmxlIHRyYW5zbWl0IGZ1bmN0aW9ucyBhbmQgdGhpcworCSAqIElTUi4gKi8KKwlTTUNfSU5URVJSVVBUX1BSRUFNQkxFOworCisJc2F2ZWRfcG9pbnRlciA9IFNNQ19HRVRfUFRSKCk7CisJbWFzayA9IFNNQ19HRVRfSU5UX01BU0soKTsKKwlTTUNfU0VUX0lOVF9NQVNLKDApOworCisJLyogc2V0IGEgdGltZW91dCB2YWx1ZSwgc28gSSBkb24ndCBzdGF5IGhlcmUgZm9yZXZlciAqLworCXRpbWVvdXQgPSA4OworCisJZG8geworCQlzdGF0dXMgPSBTTUNfR0VUX0lOVCgpOworCisJCURCRygyLCAiJXM6IElOVCAweCUwMnggTUFTSyAweCUwMnggTUVNIDB4JTA0eCBGSUZPIDB4JTA0eFxuIiwKKwkJCWRldi0+bmFtZSwgc3RhdHVzLCBtYXNrLAorCQkJKHsgaW50IG1lbWluZm87IFNNQ19TRUxFQ1RfQkFOSygwKTsKKwkJCSAgIG1lbWluZm8gPSBTTUNfR0VUX01JUigpOworCQkJICAgU01DX1NFTEVDVF9CQU5LKDIpOyBtZW1pbmZvOyB9KSwKKwkJCVNNQ19HRVRfRklGTygpKTsKKworCQlzdGF0dXMgJj0gbWFzazsKKwkJaWYgKCFzdGF0dXMpCisJCQlicmVhazsKKworCQlpZiAoc3RhdHVzICYgSU1fUkNWX0lOVCkgeworCQkJREJHKDMsICIlczogUlggaXJxXG4iLCBkZXYtPm5hbWUpOworCQkJc21jX3JjdihkZXYpOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIElNX1RYX0lOVCkgeworCQkJREJHKDMsICIlczogVFggaW50XG4iLCBkZXYtPm5hbWUpOworCQkJc21jX3R4KGRldik7CisJCQlTTUNfQUNLX0lOVChJTV9UWF9JTlQpOworCQkJaWYgKFRIUk9UVExFX1RYX1BLVFMpCisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIElNX0FMTE9DX0lOVCkgeworCQkJREJHKDMsICIlczogQWxsb2NhdGlvbiBpcnFcbiIsIGRldi0+bmFtZSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZscC0+dHhfdGFzayk7CisJCQltYXNrICY9IH5JTV9BTExPQ19JTlQ7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgSU1fVFhfRU1QVFlfSU5UKSB7CisJCQlEQkcoMywgIiVzOiBUWCBlbXB0eVxuIiwgZGV2LT5uYW1lKTsKKwkJCW1hc2sgJj0gfklNX1RYX0VNUFRZX0lOVDsKKworCQkJLyogdXBkYXRlIHN0YXRzICovCisJCQlTTUNfU0VMRUNUX0JBTksoMCk7CisJCQljYXJkX3N0YXRzID0gU01DX0dFVF9DT1VOVEVSKCk7CisJCQlTTUNfU0VMRUNUX0JBTksoMik7CisKKwkJCS8qIHNpbmdsZSBjb2xsaXNpb25zICovCisJCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSBjYXJkX3N0YXRzICYgMHhGOworCQkJY2FyZF9zdGF0cyA+Pj0gNDsKKworCQkJLyogbXVsdGlwbGUgY29sbGlzaW9ucyAqLworCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gY2FyZF9zdGF0cyAmIDB4RjsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBJTV9SWF9PVlJOX0lOVCkgeworCQkJREJHKDEsICIlczogUlggb3ZlcnJ1blxuIiwgZGV2LT5uYW1lKTsKKwkJCVNNQ19BQ0tfSU5UKElNX1JYX09WUk5fSU5UKTsKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIElNX0VQSF9JTlQpIHsKKwkJCXNtY19lcGhfaW50ZXJydXB0KGRldik7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgSU1fTURJTlQpIHsKKwkJCVNNQ19BQ0tfSU5UKElNX01ESU5UKTsKKwkJCXNtY19waHlfaW50ZXJydXB0KGRldik7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgSU1fRVJDVl9JTlQpIHsKKwkJCVNNQ19BQ0tfSU5UKElNX0VSQ1ZfSU5UKTsKKwkJCVBSSU5USygiJXM6IFVOU1VQUE9SVEVEOiBFUkNWIElOVEVSUlVQVCBcbiIsIGRldi0+bmFtZSk7CisJCX0KKwl9IHdoaWxlICgtLXRpbWVvdXQpOworCisJLyogcmVzdG9yZSByZWdpc3RlciBzdGF0ZXMgKi8KKwlTTUNfU0VUX1BUUihzYXZlZF9wb2ludGVyKTsKKwlTTUNfU0VUX0lOVF9NQVNLKG1hc2spOworCisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKworCURCRygzLCAiJXM6IEludGVycnVwdCBkb25lICglZCBsb29wcylcbiIsIGRldi0+bmFtZSwgOC10aW1lb3V0KTsKKworCS8qCisJICogV2UgcmV0dXJuIElSUV9IQU5ETEVEIHVuY29uZGl0aW9uYWxseSBoZXJlIGV2ZW4gaWYgdGhlcmUgd2FzCisJICogbm90aGluZyB0byBkby4gIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhIHBhY2tldCBtaWdodAorCSAqIGdldCBlbnF1ZXVlZCBpbnRvIHRoZSBjaGlwIHJpZ2h0IGFmdGVyIFRYX0VNUFRZX0lOVCBpcyByYWlzZWQKKwkgKiBidXQganVzdCBiZWZvcmUgdGhlIENQVSBhY2tub3dsZWRnZXMgdGhlIElSUS4KKwkgKiBCZXR0ZXIgdGFrZSBhbiB1bm5lZWRlZCBJUlEgaW4gc29tZSBvY2Nhc2lvbnMgdGhhbiBjb21wbGV4aWZ5aW5nCisJICogdGhlIGNvZGUgZm9yIGFsbCBjYXNlcy4KKwkgKi8KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyoKKyAqIFBvbGxpbmcgcmVjZWl2ZSAtIHVzZWQgYnkgbmV0Y29uc29sZSBhbmQgb3RoZXIgZGlhZ25vc3RpYyB0b29scworICogdG8gYWxsb3cgbmV0d29yayBpL28gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICovCitzdGF0aWMgdm9pZCBzbWNfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXNtY19pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworLyogT3VyIHdhdGNoZG9nIHRpbWVkIG91dC4gQ2FsbGVkIGJ5IHRoZSBuZXR3b3JraW5nIGxheWVyICovCitzdGF0aWMgdm9pZCBzbWNfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCWludCBzdGF0dXMsIG1hc2ssIG1lbWluZm8sIGZpZm87CisKKwlEQkcoMiwgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCXN0YXR1cyA9IFNNQ19HRVRfSU5UKCk7CisJbWFzayA9IFNNQ19HRVRfSU5UX01BU0soKTsKKwlmaWZvID0gU01DX0dFVF9GSUZPKCk7CisJU01DX1NFTEVDVF9CQU5LKDApOworCW1lbWluZm8gPSBTTUNfR0VUX01JUigpOworCVNNQ19TRUxFQ1RfQkFOSygyKTsKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwlQUklOVEsoICIlczogSU5UIDB4JTAyeCBNQVNLIDB4JTAyeCBNRU0gMHglMDR4IEZJRk8gMHglMDR4XG4iLAorCQlkZXYtPm5hbWUsIHN0YXR1cywgbWFzaywgbWVtaW5mbywgZmlmbyApOworCisJc21jX3Jlc2V0KGRldik7CisJc21jX2VuYWJsZShkZXYpOworCisJLyoKKwkgKiBSZWNvbmZpZ3VyaW5nIHRoZSBQSFkgZG9lc24ndCBzZWVtIGxpa2UgYSBiYWQgaWRlYSBoZXJlLCBidXQKKwkgKiBzbWNfcGh5X2NvbmZpZ3VyZSgpIGNhbGxzIG1zbGVlcCgpIHdoaWNoIGNhbGxzIHNjaGVkdWxlX3RpbWVvdXQoKQorCSAqIHdoaWNoIGNhbGxzIHNjaGVkdWxlKCkuICBIZW5jZSB3ZSB1c2UgYSB3b3JrIHF1ZXVlLgorCSAqLworCWlmIChscC0+cGh5X3R5cGUgIT0gMCkgeworCQlpZiAoc2NoZWR1bGVfd29yaygmbHAtPnBoeV9jb25maWd1cmUpKSB7CisJCQlscC0+d29ya19wZW5kaW5nID0gMTsKKwkJfQorCX0KKworCS8qIFdlIGNhbiBhY2NlcHQgVFggcGFja2V0cyBhZ2FpbiAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSB3aWxsLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlcyBwYXNzZWQgdG8gaXQsCisgKiBlaXRoZXIgbWFrZSBpdCBhY2NlcHQgbXVsdGljYXN0IHBhY2tldHMsIGdvIGludG8KKyAqIHByb21pc2N1b3VzIG1vZGUgKGZvciBUQ1BEVU1QIGFuZCBjb3VzaW5zKSBvciBhY2NlcHQKKyAqIGEgc2VsZWN0IHNldCBvZiBtdWx0aWNhc3QgcGFja2V0cworICovCitzdGF0aWMgdm9pZCBzbWNfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CisJdW5zaWduZWQgY2hhciBtdWx0aWNhc3RfdGFibGVbOF07CisJaW50IHVwZGF0ZV9tdWx0aWNhc3QgPSAwOworCisJREJHKDIsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJREJHKDIsICIlczogUkNSX1BSTVNcbiIsIGRldi0+bmFtZSk7CisJCWxwLT5yY3JfY3VyX21vZGUgfD0gUkNSX1BSTVM7CisJfQorCisvKiBCVUc/ICBJIG5ldmVyIGRpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSBpZiBtdWx0aWNhc3Rpbmcgd2FzIHR1cm5lZCBvbi4KKyAgIE5vdywgSSB0dXJuIG9mZiBwcm9taXNjdW91cyBtb2RlLCBidXQgSSBkb24ndCBkbyBhbnl0aGluZyB0byBtdWx0aWNhc3RpbmcKKyAgIHdoZW4gcHJvbWlzY3VvdXMgbW9kZSBpcyB0dXJuZWQgb24uCisqLworCisJLyoKKwkgKiBIZXJlLCBJIGFtIHNldHRpbmcgdGhpcyB0byBhY2NlcHQgYWxsIG11bHRpY2FzdCBwYWNrZXRzLgorCSAqIEkgZG9uJ3QgbmVlZCB0byB6ZXJvIHRoZSBtdWx0aWNhc3QgdGFibGUsIGJlY2F1c2UgdGhlIGZsYWcgaXMKKwkgKiBjaGVja2VkIGJlZm9yZSB0aGUgdGFibGUgaXMKKwkgKi8KKwllbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJIHx8IGRldi0+bWNfY291bnQgPiAxNikgeworCQlEQkcoMiwgIiVzOiBSQ1JfQUxNVUxcbiIsIGRldi0+bmFtZSk7CisJCWxwLT5yY3JfY3VyX21vZGUgfD0gUkNSX0FMTVVMOworCX0KKworCS8qCisJICogVGhpcyBzZXRzIHRoZSBpbnRlcm5hbCBoYXJkd2FyZSB0YWJsZSB0byBmaWx0ZXIgb3V0IHVud2FudGVkCisJICogbXVsdGljYXN0IHBhY2tldHMgYmVmb3JlIHRoZXkgdGFrZSB1cCBtZW1vcnkuCisJICoKKwkgKiBUaGUgU01DIGNoaXAgdXNlcyBhIGhhc2ggdGFibGUgd2hlcmUgdGhlIGhpZ2ggNiBiaXRzIG9mIHRoZSBDUkMgb2YKKwkgKiBhZGRyZXNzIGFyZSB0aGUgb2Zmc2V0IGludG8gdGhlIHRhYmxlLiAgSWYgdGhhdCBiaXQgaXMgMSwgdGhlbiB0aGUKKwkgKiBtdWx0aWNhc3QgcGFja2V0IGlzIGFjY2VwdGVkLiAgT3RoZXJ3aXNlLCBpdCdzIGRyb3BwZWQgc2lsZW50bHkuCisJICoKKwkgKiBUbyB1c2UgdGhlIDYgYml0cyBhcyBhbiBvZmZzZXQgaW50byB0aGUgdGFibGUsIHRoZSBoaWdoIDMgYml0cyBhcmUKKwkgKiB0aGUgbnVtYmVyIG9mIHRoZSA4IGJpdCByZWdpc3Rlciwgd2hpbGUgdGhlIGxvdyAzIGJpdHMgYXJlIHRoZSBiaXQKKwkgKiB3aXRoaW4gdGhhdCByZWdpc3Rlci4KKwkgKi8KKwllbHNlIGlmIChkZXYtPm1jX2NvdW50KSAgeworCQlpbnQgaTsKKwkJc3RydWN0IGRldl9tY19saXN0ICpjdXJfYWRkcjsKKworCQkvKiB0YWJsZSBmb3IgZmxpcHBpbmcgdGhlIG9yZGVyIG9mIDMgYml0cyAqLworCQlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbnZlcnQzW10gPSB7MCwgNCwgMiwgNiwgMSwgNSwgMywgN307CisKKwkJLyogc3RhcnQgd2l0aCBhIHRhYmxlIG9mIGFsbCB6ZXJvczogcmVqZWN0IGFsbCAqLworCQltZW1zZXQobXVsdGljYXN0X3RhYmxlLCAwLCBzaXplb2YobXVsdGljYXN0X3RhYmxlKSk7CisKKwkJY3VyX2FkZHIgPSBkZXYtPm1jX2xpc3Q7CisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyssIGN1cl9hZGRyID0gY3VyX2FkZHItPm5leHQpIHsKKwkJCWludCBwb3NpdGlvbjsKKworCQkJLyogZG8gd2UgaGF2ZSBhIHBvaW50ZXIgaGVyZT8gKi8KKwkJCWlmICghY3VyX2FkZHIpCisJCQkJYnJlYWs7CisJCQkvKiBtYWtlIHN1cmUgdGhpcyBpcyBhIG11bHRpY2FzdCBhZGRyZXNzIC0KKwkJICAgCSAgIHNob3VsZG4ndCB0aGlzIGJlIGEgZ2l2ZW4gaWYgd2UgaGF2ZSBpdCBoZXJlID8gKi8KKwkJCWlmICghKCpjdXJfYWRkci0+ZG1pX2FkZHIgJiAxKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogb25seSB1c2UgdGhlIGxvdyBvcmRlciBiaXRzICovCisJCQlwb3NpdGlvbiA9IGNyYzMyX2xlKH4wLCBjdXJfYWRkci0+ZG1pX2FkZHIsIDYpICYgMHgzZjsKKworCQkJLyogZG8gc29tZSBtZXNzeSBzd2FwcGluZyB0byBwdXQgdGhlIGJpdCBpbiB0aGUgcmlnaHQgc3BvdCAqLworCQkJbXVsdGljYXN0X3RhYmxlW2ludmVydDNbcG9zaXRpb24mN11dIHw9CisJCQkJKDE8PGludmVydDNbKHBvc2l0aW9uPj4zKSY3XSk7CisJCX0KKworCQkvKiBiZSBzdXJlIEkgZ2V0IHJpZCBvZiBmbGFncyBJIG1pZ2h0IGhhdmUgc2V0ICovCisJCWxwLT5yY3JfY3VyX21vZGUgJj0gfihSQ1JfUFJNUyB8IFJDUl9BTE1VTCk7CisKKwkJLyogbm93LCB0aGUgdGFibGUgY2FuIGJlIGxvYWRlZCBpbnRvIHRoZSBjaGlwc2V0ICovCisJCXVwZGF0ZV9tdWx0aWNhc3QgPSAxOworCX0gZWxzZSAgeworCQlEQkcoMiwgIiVzOiB+KFJDUl9QUk1TfFJDUl9BTE1VTClcbiIsIGRldi0+bmFtZSk7CisJCWxwLT5yY3JfY3VyX21vZGUgJj0gfihSQ1JfUFJNUyB8IFJDUl9BTE1VTCk7CisKKwkJLyoKKwkJICogc2luY2UgSSdtIGRpc2FibGluZyBhbGwgbXVsdGljYXN0IGVudGlyZWx5LCBJIG5lZWQgdG8KKwkJICogY2xlYXIgdGhlIG11bHRpY2FzdCBsaXN0CisJCSAqLworCQltZW1zZXQobXVsdGljYXN0X3RhYmxlLCAwLCBzaXplb2YobXVsdGljYXN0X3RhYmxlKSk7CisJCXVwZGF0ZV9tdWx0aWNhc3QgPSAxOworCX0KKworCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwlTTUNfU0VMRUNUX0JBTksoMCk7CisJU01DX1NFVF9SQ1IobHAtPnJjcl9jdXJfbW9kZSk7CisJaWYgKHVwZGF0ZV9tdWx0aWNhc3QpIHsKKwkJU01DX1NFTEVDVF9CQU5LKDMpOworCQlTTUNfU0VUX01DQVNUKG11bHRpY2FzdF90YWJsZSk7CisJfQorCVNNQ19TRUxFQ1RfQkFOSygyKTsKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKK30KKworCisvKgorICogT3BlbiBhbmQgSW5pdGlhbGl6ZSB0aGUgYm9hcmQKKyAqCisgKiBTZXQgdXAgZXZlcnl0aGluZywgcmVzZXQgdGhlIGNhcmQsIGV0Yy4uCisgKi8KK3N0YXRpYyBpbnQKK3NtY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJREJHKDIsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgYWRkcmVzcyBpcyB2YWxpZC4gIElmIGl0cyBub3QsIHJlZnVzZQorCSAqIHRvIGJyaW5nIHRoZSBkZXZpY2UgdXAuICBUaGUgdXNlciBtdXN0IHNwZWNpZnkgYW4KKwkgKiBhZGRyZXNzIHVzaW5nIGlmY29uZmlnIGV0aDAgaHcgZXRoZXIgeHg6eHg6eHg6eHg6eHg6eHgKKwkgKi8KKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpIHsKKwkJUFJJTlRLKCIlczogbm8gdmFsaWQgZXRoZXJuZXQgaHcgYWRkclxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0dXAgdGhlIGRlZmF1bHQgUmVnaXN0ZXIgTW9kZXMgKi8KKwlscC0+dGNyX2N1cl9tb2RlID0gVENSX0RFRkFVTFQ7CisJbHAtPnJjcl9jdXJfbW9kZSA9IFJDUl9ERUZBVUxUOworCWxwLT5ycGNfY3VyX21vZGUgPSBSUENfREVGQVVMVDsKKworCS8qCisJICogSWYgd2UgYXJlIG5vdCB1c2luZyBhIE1JSSBpbnRlcmZhY2UsIHdlIG5lZWQgdG8KKwkgKiBtb25pdG9yIG91ciBvd24gY2FycmllciBzaWduYWwgdG8gZGV0ZWN0IGZhdWx0cy4KKwkgKi8KKwlpZiAobHAtPnBoeV90eXBlID09IDApCisJCWxwLT50Y3JfY3VyX21vZGUgfD0gVENSX01PTl9DU047CisKKwkvKiByZXNldCB0aGUgaGFyZHdhcmUgKi8KKwlzbWNfcmVzZXQoZGV2KTsKKwlzbWNfZW5hYmxlKGRldik7CisKKwkvKiBDb25maWd1cmUgdGhlIFBIWSwgaW5pdGlhbGl6ZSB0aGUgbGluayBzdGF0ZSAqLworCWlmIChscC0+cGh5X3R5cGUgIT0gMCkKKwkJc21jX3BoeV9jb25maWd1cmUoZGV2KTsKKwllbHNlIHsKKwkJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCQlzbWNfMTBidF9jaGVja19tZWRpYShkZXYsIDEpOworCQlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisvKgorICogc21jX2Nsb3NlCisgKgorICogdGhpcyBtYWtlcyB0aGUgYm9hcmQgY2xlYW4gdXAgZXZlcnl0aGluZyB0aGF0IGl0IGNhbgorICogYW5kIG5vdCB0YWxrIHRvIHRoZSBvdXRzaWRlIHdvcmxkLiAgIENhdXNlZCBieQorICogYW4gJ2lmY29uZmlnIGV0aFggZG93bicKKyAqLworc3RhdGljIGludCBzbWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlEQkcoMiwgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwkvKiBjbGVhciBldmVyeXRoaW5nICovCisJc21jX3NodXRkb3duKGRldik7CisKKwlzbWNfcGh5X3Bvd2VyZG93bihkZXYpOworCisJaWYgKGxwLT5wZW5kaW5nX3R4X3NrYikgeworCQlkZXZfa2ZyZWVfc2tiKGxwLT5wZW5kaW5nX3R4X3NrYik7CisJCWxwLT5wZW5kaW5nX3R4X3NrYiA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4KKyAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IgY2xvc2VkLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNtY19xdWVyeV9zdGF0aXN0aWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJREJHKDIsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKgorICogRXRodG9vbCBzdXBwb3J0CisgKi8KK3N0YXRpYyBpbnQKK3NtY19ldGh0b29sX2dldHNldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJY21kLT5tYXh0eHBrdCA9IDE7CisJY21kLT5tYXhyeHBrdCA9IDE7CisKKwlpZiAobHAtPnBoeV90eXBlICE9IDApIHsKKwkJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCQlyZXQgPSBtaWlfZXRodG9vbF9nc2V0KCZscC0+bWlpLCBjbWQpOworCQlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwl9IGVsc2UgeworCQljbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQkJCSBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCQkgU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX0FVSTsKKworCQlpZiAobHAtPmN0bF9yc3BlZWQgPT0gMTApCisJCQljbWQtPnNwZWVkID0gU1BFRURfMTA7CisJCWVsc2UgaWYgKGxwLT5jdGxfcnNwZWVkID09IDEwMCkKKwkJCWNtZC0+c3BlZWQgPSBTUEVFRF8xMDA7CisKKwkJY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCQljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKwkJY21kLT5wb3J0ID0gMDsKKwkJY21kLT5kdXBsZXggPSBscC0+dGNyX2N1cl9tb2RlICYgVENSX1NXRkRVUCA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisKKwkJcmV0ID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitzbWNfZXRodG9vbF9zZXRzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldDsKKworCWlmIChscC0+cGh5X3R5cGUgIT0gMCkgeworCQlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJCXJldCA9IG1paV9ldGh0b29sX3NzZXQoJmxwLT5taWksIGNtZCk7CisJCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCX0gZWxzZSB7CisJCWlmIChjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19ESVNBQkxFIHx8CisJCSAgICBjbWQtPnNwZWVkICE9IFNQRUVEXzEwIHx8CisJCSAgICAoY21kLT5kdXBsZXggIT0gRFVQTEVYX0hBTEYgJiYgY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpIHx8CisJCSAgICAoY21kLT5wb3J0ICE9IFBPUlRfVFAgJiYgY21kLT5wb3J0ICE9IFBPUlRfQVVJKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisvLwkJbHAtPnBvcnQgPSBjbWQtPnBvcnQ7CisJCWxwLT5jdGxfcmZkdXBseCA9IGNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMOworCisvLwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKy8vCQkJc21jX3NldF9wb3J0KGRldik7CisKKwkJcmV0ID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorc21jX2V0aHRvb2xfZ2V0ZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cm5jcHkoaW5mby0+ZHJpdmVyLCBDQVJETkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cm5jcHkoaW5mby0+dmVyc2lvbiwgdmVyc2lvbiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJuY3B5KGluZm8tPmJ1c19pbmZvLCBkZXYtPmNsYXNzX2Rldi5kZXYtPmJ1c19pZCwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7Cit9CisKK3N0YXRpYyBpbnQgc21jX2V0aHRvb2xfbndheXJlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKGxwLT5waHlfdHlwZSAhPSAwKSB7CisJCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwkJcmV0ID0gbWlpX253YXlfcmVzdGFydCgmbHAtPm1paSk7CisJCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgc21jX2V0aHRvb2xfZ2V0bXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIGxwLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZCBzbWNfZXRodG9vbF9zZXRtc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxwLT5tc2dfZW5hYmxlID0gbGV2ZWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgc21jX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MJPSBzbWNfZXRodG9vbF9nZXRzZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCT0gc21jX2V0aHRvb2xfc2V0c2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCT0gc21jX2V0aHRvb2xfZ2V0ZHJ2aW5mbywKKworCS5nZXRfbXNnbGV2ZWwJPSBzbWNfZXRodG9vbF9nZXRtc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCT0gc21jX2V0aHRvb2xfc2V0bXNnbGV2ZWwsCisJLm53YXlfcmVzZXQJPSBzbWNfZXRodG9vbF9ud2F5cmVzZXQsCisJLmdldF9saW5rCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKy8vCS5nZXRfZWVwcm9tCT0gc21jX2V0aHRvb2xfZ2V0ZWVwcm9tLAorLy8JLnNldF9lZXByb20JPSBzbWNfZXRodG9vbF9zZXRlZXByb20sCit9OworCisvKgorICogc21jX2ZpbmRpcnEKKyAqCisgKiBUaGlzIHJvdXRpbmUgaGFzIGEgc2ltcGxlIHB1cnBvc2UgLS0gbWFrZSB0aGUgU01DIGNoaXAgZ2VuZXJhdGUgYW4KKyAqIGludGVycnVwdCwgc28gYW4gYXV0by1kZXRlY3Qgcm91dGluZSBjYW4gZGV0ZWN0IGl0LCBhbmQgZmluZCB0aGUgSVJRLAorICovCisvKgorICogZG9lcyB0aGlzIHN0aWxsIHdvcms/CisgKgorICogSSBqdXN0IGRlbGV0ZWQgYXV0b19pcnEuYywgc2luY2UgaXQgd2FzIG5ldmVyIGJ1aWx0Li4uCisgKiAgIC0tamdhcnppaworICovCitzdGF0aWMgaW50IF9faW5pdCBzbWNfZmluZGlycSh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlpbnQgdGltZW91dCA9IDIwOworCXVuc2lnbmVkIGxvbmcgY29va2llOworCisJREJHKDIsICIlczogJXNcbiIsIENBUkROQU1FLCBfX0ZVTkNUSU9OX18pOworCisJY29va2llID0gcHJvYmVfaXJxX29uKCk7CisKKwkvKgorCSAqIFdoYXQgSSB0cnkgdG8gZG8gaGVyZSBpcyB0cmlnZ2VyIGFuIEFMTE9DX0lOVC4gVGhpcyBpcyBkb25lCisJICogYnkgYWxsb2NhdGluZyBhIHNtYWxsIGNodW5rIG9mIG1lbW9yeSwgd2hpY2ggd2lsbCBnaXZlIGFuIGludGVycnVwdAorCSAqIHdoZW4gZG9uZS4KKwkgKi8KKwkvKiBlbmFibGUgQUxMT0NhdGlvbiBpbnRlcnJ1cHRzIE9OTFkgKi8KKwlTTUNfU0VMRUNUX0JBTksoMik7CisJU01DX1NFVF9JTlRfTUFTSyhJTV9BTExPQ19JTlQpOworCisJLyoKKyAJICogQWxsb2NhdGUgNTEyIGJ5dGVzIG9mIG1lbW9yeS4gIE5vdGUgdGhhdCB0aGUgY2hpcCB3YXMganVzdAorCSAqIHJlc2V0IHNvIGFsbCB0aGUgbWVtb3J5IGlzIGF2YWlsYWJsZQorCSAqLworCVNNQ19TRVRfTU1VX0NNRChNQ19BTExPQyB8IDEpOworCisJLyoKKwkgKiBXYWl0IHVudGlsIHBvc2l0aXZlIHRoYXQgdGhlIGludGVycnVwdCBoYXMgYmVlbiBnZW5lcmF0ZWQKKwkgKi8KKwlkbyB7CisJCWludCBpbnRfc3RhdHVzOworCQl1ZGVsYXkoMTApOworCQlpbnRfc3RhdHVzID0gU01DX0dFVF9JTlQoKTsKKwkJaWYgKGludF9zdGF0dXMgJiBJTV9BTExPQ19JTlQpCisJCQlicmVhazsJCS8qIGdvdCB0aGUgaW50ZXJydXB0ICovCisJfSB3aGlsZSAoLS10aW1lb3V0KTsKKworCS8qCisJICogdGhlcmUgaXMgcmVhbGx5IG5vdGhpbmcgdGhhdCBJIGNhbiBkbyBoZXJlIGlmIHRpbWVvdXQgZmFpbHMsCisJICogYXMgYXV0b2lycV9yZXBvcnQgd2lsbCByZXR1cm4gYSAwIGFueXdheSwgd2hpY2ggaXMgd2hhdCBJCisJICogd2FudCBpbiB0aGlzIGNhc2UuICAgUGx1cywgdGhlIGNsZWFuIHVwIGlzIG5lZWRlZCBpbiBib3RoCisJICogY2FzZXMuCisJICovCisKKwkvKiBhbmQgZGlzYWJsZSBhbGwgaW50ZXJydXB0cyBhZ2FpbiAqLworCVNNQ19TRVRfSU5UX01BU0soMCk7CisKKwkvKiBhbmQgcmV0dXJuIHdoYXQgSSBmb3VuZCAqLworCXJldHVybiBwcm9iZV9pcnFfb2ZmKGNvb2tpZSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbjogc21jX3Byb2JlKHVuc2lnbmVkIGxvbmcgaW9hZGRyKQorICoKKyAqIFB1cnBvc2U6CisgKglUZXN0cyB0byBzZWUgaWYgYSBnaXZlbiBpb2FkZHIgcG9pbnRzIHRvIGFuIFNNQzkxeCBjaGlwLgorICoJUmV0dXJucyBhIDAgb24gc3VjY2VzcworICoKKyAqIEFsZ29yaXRobToKKyAqCSgxKSBzZWUgaWYgdGhlIGhpZ2ggYnl0ZSBvZiBCQU5LX1NFTEVDVCBpcyAweDMzCisgKiAJKDIpIGNvbXBhcmUgdGhlIGlvYWRkciB3aXRoIHRoZSBiYXNlIHJlZ2lzdGVyJ3MgYWRkcmVzcworICoJKDMpIHNlZSBpZiBJIHJlY29nbml6ZSB0aGUgY2hpcCBJRCBpbiB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKKyAqCisgKiBIZXJlIEkgZG8gdHlwaWNhbCBpbml0aWFsaXphdGlvbiB0YXNrcy4KKyAqCisgKiBvICBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgaWYgbmVlZGVkCisgKiBvICBwcmludCBvdXQgbXkgdmFuaXR5IG1lc3NhZ2UgaWYgbm90IGRvbmUgc28gYWxyZWFkeQorICogbyAgcHJpbnQgb3V0IHdoYXQgdHlwZSBvZiBoYXJkd2FyZSBpcyBkZXRlY3RlZAorICogbyAgcHJpbnQgb3V0IHRoZSBldGhlcm5ldCBhZGRyZXNzCisgKiBvICBmaW5kIHRoZSBJUlEKKyAqIG8gIHNldCB1cCBteSBwcml2YXRlIGRhdGEKKyAqIG8gIGNvbmZpZ3VyZSB0aGUgZGV2IHN0cnVjdHVyZSB3aXRoIG15IHN1YnJvdXRpbmVzCisgKiBvICBhY3R1YWxseSBHUkFCIHRoZSBpcnEuCisgKiBvICBHUkFCIHRoZSByZWdpb24KKyAqLworc3RhdGljIGludCBfX2luaXQgc21jX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdGF0aWMgaW50IHZlcnNpb25fcHJpbnRlZCA9IDA7CisJaW50IGksIHJldHZhbDsKKwl1bnNpZ25lZCBpbnQgdmFsLCByZXZpc2lvbl9yZWdpc3RlcjsKKwljb25zdCBjaGFyICp2ZXJzaW9uX3N0cmluZzsKKworCURCRygyLCAiJXM6ICVzXG4iLCBDQVJETkFNRSwgX19GVU5DVElPTl9fKTsKKworCS8qIEZpcnN0LCBzZWUgaWYgdGhlIGhpZ2ggYnl0ZSBpcyAweDMzICovCisJdmFsID0gU01DX0NVUlJFTlRfQkFOSygpOworCURCRygyLCAiJXM6IGJhbmsgc2lnbmF0dXJlIHByb2JlIHJldHVybmVkIDB4JTA0eFxuIiwgQ0FSRE5BTUUsIHZhbCk7CisJaWYgKCh2YWwgJiAweEZGMDApICE9IDB4MzMwMCkgeworCQlpZiAoKHZhbCAmIDB4RkYpID09IDB4MzMpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkiJXM6IERldGVjdGVkIHBvc3NpYmxlIGJ5dGUtc3dhcHBlZCBpbnRlcmZhY2UiCisJCQkJIiBhdCBJT0FERFIgJXBcbiIsIENBUkROQU1FLCBpb2FkZHIpOworCQl9CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKgorCSAqIFRoZSBhYm92ZSBNSUdIVCBpbmRpY2F0ZSBhIGRldmljZSwgYnV0IEkgbmVlZCB0byB3cml0ZSB0bworCSAqIGZ1cnRoZXIgdGVzdCB0aGlzLgorCSAqLworCVNNQ19TRUxFQ1RfQkFOSygwKTsKKwl2YWwgPSBTTUNfQ1VSUkVOVF9CQU5LKCk7CisJaWYgKCh2YWwgJiAweEZGMDApICE9IDB4MzMwMCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyoKKwkgKiB3ZWxsLCB3ZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gb25jZSwgc28gaG9wZWZ1bGx5IGFub3RoZXIKKwkgKiB0aW1lIHdvbid0IGh1cnQuICBUaGlzIHRpbWUsIEkgbmVlZCB0byBzd2l0Y2ggdGhlIGJhbmsKKwkgKiByZWdpc3RlciB0byBiYW5rIDEsIHNvIEkgY2FuIGFjY2VzcyB0aGUgYmFzZSBhZGRyZXNzCisJICogcmVnaXN0ZXIKKwkgKi8KKwlTTUNfU0VMRUNUX0JBTksoMSk7CisJdmFsID0gU01DX0dFVF9CQVNFKCk7CisJdmFsID0gKCh2YWwgJiAweDFGMDApID4+IDMpIDw8IFNNQ19JT19TSElGVDsKKwlpZiAoKCh1bnNpZ25lZCBsb25nKWlvYWRkciAmICgoUEFHRV9TSVpFLTEpPDxTTUNfSU9fU0hJRlQpKSAhPSB2YWwpIHsgLypYWFg6IFdURj8gKi8KKwkJcHJpbnRrKCIlczogSU9BRERSICVwIGRvZXNuJ3QgbWF0Y2ggY29uZmlndXJhdGlvbiAoJXgpLlxuIiwKKwkJCUNBUkROQU1FLCBpb2FkZHIsIHZhbCk7CisJfQorCisJLyoKKwkgKiBjaGVjayBpZiB0aGUgcmV2aXNpb24gcmVnaXN0ZXIgaXMgc29tZXRoaW5nIHRoYXQgSQorCSAqIHJlY29nbml6ZS4gIFRoZXNlIG1pZ2h0IG5lZWQgdG8gYmUgYWRkZWQgdG8gbGF0ZXIsCisJICogYXMgZnV0dXJlIHJldmlzaW9ucyBjb3VsZCBiZSBhZGRlZC4KKwkgKi8KKwlTTUNfU0VMRUNUX0JBTksoMyk7CisJcmV2aXNpb25fcmVnaXN0ZXIgPSBTTUNfR0VUX1JFVigpOworCURCRygyLCAiJXM6IHJldmlzaW9uID0gMHglMDR4XG4iLCBDQVJETkFNRSwgcmV2aXNpb25fcmVnaXN0ZXIpOworCXZlcnNpb25fc3RyaW5nID0gY2hpcF9pZHNbIChyZXZpc2lvbl9yZWdpc3RlciA+PiA0KSAmIDB4Rl07CisJaWYgKCF2ZXJzaW9uX3N0cmluZyB8fCAocmV2aXNpb25fcmVnaXN0ZXIgJiAweGZmMDApICE9IDB4MzMwMCkgeworCQkvKiBJIGRvbid0IHJlY29nbml6ZSB0aGlzIGNoaXAsIHNvLi4uICovCisJCXByaW50aygiJXM6IElPICVwOiBVbnJlY29nbml6ZWQgcmV2aXNpb24gcmVnaXN0ZXIgMHglMDR4IgorCQkJIiwgQ29udGFjdCBhdXRob3IuXG4iLCBDQVJETkFNRSwKKwkJCWlvYWRkciwgcmV2aXNpb25fcmVnaXN0ZXIpOworCisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBBdCB0aGlzIHBvaW50IEknbGwgYXNzdW1lIHRoYXQgdGhlIGNoaXAgaXMgYW4gU01DOTF4LiAqLworCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoIiVzIiwgdmVyc2lvbik7CisKKwkvKiBmaWxsIGluIHNvbWUgb2YgdGhlIGZpZWxkcyAqLworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9hZGRyOworCWxwLT5iYXNlID0gaW9hZGRyOworCWxwLT52ZXJzaW9uID0gcmV2aXNpb25fcmVnaXN0ZXIgJiAweGZmOworCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisKKwkvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCisJU01DX1NFTEVDVF9CQU5LKDEpOworCVNNQ19HRVRfTUFDX0FERFIoZGV2LT5kZXZfYWRkcik7CisKKwkvKiBub3csIHJlc2V0IHRoZSBjaGlwLCBhbmQgcHV0IGl0IGludG8gYSBrbm93biBzdGF0ZSAqLworCXNtY19yZXNldChkZXYpOworCisJLyoKKwkgKiBJZiBkZXYtPmlycSBpcyAwLCB0aGVuIHRoZSBkZXZpY2UgaGFzIHRvIGJlIGJhbmdlZCBvbiB0byBzZWUKKwkgKiB3aGF0IHRoZSBJUlEgaXMuCisgCSAqCisJICogVGhpcyBiYW5naW5nIGRvZXNuJ3QgYWx3YXlzIGRldGVjdCB0aGUgSVJRLCBmb3IgdW5rbm93biByZWFzb25zLgorCSAqIGEgd29ya2Fyb3VuZCBpcyB0byByZXNldCB0aGUgY2hpcCBhbmQgdHJ5IGFnYWluLgorCSAqCisJICogSW50ZXJlc3RpbmdseSwgdGhlIERPUyBwYWNrZXQgZHJpdmVyICpTRVRTKiB0aGUgSVJRIG9uIHRoZSBjYXJkIHRvCisJICogYmUgd2hhdCBpcyByZXF1ZXN0ZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gICBJIGRvbid0IGRvIHRoYXQsIG1vc3RseQorCSAqIGJlY2F1c2UgdGhlIGNhcmQgdGhhdCBJIGhhdmUgdXNlcyBhIG5vbi1zdGFuZGFyZCBtZXRob2Qgb2YgYWNjZXNzaW5nCisJICogdGhlIElSUXMsIGFuZCBiZWNhdXNlIHRoaXMgX3Nob3VsZF8gd29yayBpbiBtb3N0IGNvbmZpZ3VyYXRpb25zLgorCSAqCisJICogU3BlY2lmeWluZyBhbiBJUlEgaXMgZG9uZSB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHVzZXIga25vd3MKKwkgKiB3aGF0IChzKWhlIGlzIGRvaW5nLiAgTm8gY2hlY2tpbmcgaXMgZG9uZSEhISEKKwkgKi8KKwlpZiAoZGV2LT5pcnEgPCAxKSB7CisJCWludCB0cmlhbHM7CisKKwkJdHJpYWxzID0gMzsKKwkJd2hpbGUgKHRyaWFscy0tKSB7CisJCQlkZXYtPmlycSA9IHNtY19maW5kaXJxKGlvYWRkcik7CisJCQlpZiAoZGV2LT5pcnEpCisJCQkJYnJlYWs7CisJCQkvKiBraWNrIHRoZSBjYXJkIGFuZCB0cnkgYWdhaW4gKi8KKwkJCXNtY19yZXNldChkZXYpOworCQl9CisJfQorCWlmIChkZXYtPmlycSA9PSAwKSB7CisJCXByaW50aygiJXM6IENvdWxkbid0IGF1dG9kZXRlY3QgeW91ciBJUlEuIFVzZSBpcnE9eHguXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKwlkZXYtPmlycSA9IGlycV9jYW5vbmljYWxpemUoZGV2LT5pcnEpOworCisJLyogRmlsbCBpbiB0aGUgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlIHdpdGggZXRoZXJuZXQgdmFsdWVzLiAqLworCWV0aGVyX3NldHVwKGRldik7CisKKwlkZXYtPm9wZW4gPSBzbWNfb3BlbjsKKwlkZXYtPnN0b3AgPSBzbWNfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzbWNfaGFyZF9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dCA9IHNtY190aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBtc2Vjc190b19qaWZmaWVzKHdhdGNoZG9nKTsKKwlkZXYtPmdldF9zdGF0cyA9IHNtY19xdWVyeV9zdGF0aXN0aWNzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc21jX3NldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnNtY19ldGh0b29sX29wczsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gc21jX3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgorCisJdGFza2xldF9pbml0KCZscC0+dHhfdGFzaywgc21jX2hhcmR3YXJlX3NlbmRfcGt0LCAodW5zaWduZWQgbG9uZylkZXYpOworCUlOSVRfV09SSygmbHAtPnBoeV9jb25maWd1cmUsIHNtY19waHlfY29uZmlndXJlLCBkZXYpOworCWxwLT5taWkucGh5X2lkX21hc2sgPSAweDFmOworCWxwLT5taWkucmVnX251bV9tYXNrID0gMHgxZjsKKwlscC0+bWlpLmZvcmNlX21lZGlhID0gMDsKKwlscC0+bWlpLmZ1bGxfZHVwbGV4ID0gMDsKKwlscC0+bWlpLmRldiA9IGRldjsKKwlscC0+bWlpLm1kaW9fcmVhZCA9IHNtY19waHlfcmVhZDsKKwlscC0+bWlpLm1kaW9fd3JpdGUgPSBzbWNfcGh5X3dyaXRlOworCisJLyoKKwkgKiBMb2NhdGUgdGhlIHBoeSwgaWYgYW55LgorCSAqLworCWlmIChscC0+dmVyc2lvbiA+PSAoQ0hJUF85MTEwMCA8PCA0KSkKKwkJc21jX3BoeV9kZXRlY3QoZGV2KTsKKworCS8qIFNldCBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KKwlscC0+bXNnX2VuYWJsZSA9IE5FVElGX01TR19MSU5LOworCWxwLT5jdGxfcmZkdXBseCA9IDA7CisJbHAtPmN0bF9yc3BlZWQgPSAxMDsKKworCWlmIChscC0+dmVyc2lvbiA+PSAoQ0hJUF85MTEwMCA8PCA0KSkgeworCQlscC0+Y3RsX3JmZHVwbHggPSAxOworCQlscC0+Y3RsX3JzcGVlZCA9IDEwMDsKKwl9CisKKwkvKiBHcmFiIHRoZSBJUlEgKi8KKyAgICAgIAlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnNtY19pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KTsKKyAgICAgIAlpZiAocmV0dmFsKQorICAgICAgCQlnb3RvIGVycl9vdXQ7CisKKwlzZXRfaXJxX3R5cGUoZGV2LT5pcnEsIElSUVRfUklTSU5HKTsKKworI2lmZGVmIFNNQ19VU0VfUFhBX0RNQQorCXsKKwkJaW50IGRtYSA9IHB4YV9yZXF1ZXN0X2RtYShkZXYtPm5hbWUsIERNQV9QUklPX0xPVywKKwkJCQkJICBzbWNfcHhhX2RtYV9pcnEsIE5VTEwpOworCQlpZiAoZG1hID49IDApCisJCQlkZXYtPmRtYSA9IGRtYTsKKwl9CisjZW5kaWYKKworCXJldHZhbCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXR2YWwgPT0gMCkgeworCQkvKiBub3csIHByaW50IG91dCB0aGUgY2FyZCBpbmZvLCBpbiBhIHNob3J0IGZvcm1hdC4uICovCisJCXByaW50aygiJXM6ICVzIChyZXYgJWQpIGF0ICVwIElSUSAlZCIsCisJCQlkZXYtPm5hbWUsIHZlcnNpb25fc3RyaW5nLCByZXZpc2lvbl9yZWdpc3RlciAmIDB4MGYsCisJCQlscC0+YmFzZSwgZGV2LT5pcnEpOworCisJCWlmIChkZXYtPmRtYSAhPSAodW5zaWduZWQgY2hhciktMSkKKwkJCXByaW50aygiIERNQSAlZCIsIGRldi0+ZG1hKTsKKworCQlwcmludGsoIiVzJXNcbiIsIG5vd2FpdCA/ICIgW25vd2FpdF0iIDogIiIsCisJCQlUSFJPVFRMRV9UWF9QS1RTID8gIiBbdGhyb3R0bGVfdHhdIiA6ICIiKTsKKworCQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpIHsKKwkJCXByaW50aygiJXM6IEludmFsaWQgZXRoZXJuZXQgTUFDIGFkZHJlc3MuICBQbGVhc2UgIgorCQkJICAgICAgICJzZXQgdXNpbmcgaWZjb25maWdcbiIsIGRldi0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQkvKiBQcmludCB0aGUgRXRoZXJuZXQgYWRkcmVzcyAqLworCQkJcHJpbnRrKCIlczogRXRoZXJuZXQgYWRkcjogIiwgZGV2LT5uYW1lKTsKKwkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCQkJcHJpbnRrKCIlMi4yeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwkJCXByaW50aygiJTIuMnhcbiIsIGRldi0+ZGV2X2FkZHJbNV0pOworCQl9CisKKwkJaWYgKGxwLT5waHlfdHlwZSA9PSAwKSB7CisJCQlQUklOVEsoIiVzOiBObyBQSFkgZm91bmRcbiIsIGRldi0+bmFtZSk7CisJCX0gZWxzZSBpZiAoKGxwLT5waHlfdHlwZSAmIDB4ZmZmZmZmZjApID09IDB4MDAxNmY4NDApIHsKKwkJCVBSSU5USygiJXM6IFBIWSBMQU44M0MxODMgKExBTjkxQzExMSBJbnRlcm5hbClcbiIsIGRldi0+bmFtZSk7CisJCX0gZWxzZSBpZiAoKGxwLT5waHlfdHlwZSAmIDB4ZmZmZmZmZjApID09IDB4MDI4MjFjNTApIHsKKwkJCVBSSU5USygiJXM6IFBIWSBMQU44M0MxODBcbiIsIGRldi0+bmFtZSk7CisJCX0KKwl9CisKK2Vycl9vdXQ6CisjaWZkZWYgU01DX1VTRV9QWEFfRE1BCisJaWYgKHJldHZhbCAmJiBkZXYtPmRtYSAhPSAodW5zaWduZWQgY2hhciktMSkKKwkJcHhhX2ZyZWVfZG1hKGRldi0+ZG1hKTsKKyNlbmRpZgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgc21jX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgZWNvciwgZWNzcjsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisJc3RydWN0IHJlc291cmNlICogcmVzOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgInNtYzkxeC1hdHRyaWIiKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIE1hcCB0aGUgYXR0cmlidXRlIHNwYWNlLiAgVGhpcyBpcyBvdmVya2lsbCwgYnV0IGNsZWFuLgorCSAqLworCWFkZHIgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIEFUVFJJQl9TSVpFKTsKKwlpZiAoIWFkZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBSZXNldCB0aGUgZGV2aWNlLiAgV2UgbXVzdCBkaXNhYmxlIElSUXMgYXJvdW5kIHRoaXMKKwkgKiBzaW5jZSBhIHJlc2V0IGNhdXNlcyB0aGUgSVJRIGxpbmUgYmVjb21lIGFjdGl2ZS4KKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZWNvciA9IHJlYWRiKGFkZHIgKyAoRUNPUiA8PCBTTUNfSU9fU0hJRlQpKSAmIH5FQ09SX1JFU0VUOworCXdyaXRlYihlY29yIHwgRUNPUl9SRVNFVCwgYWRkciArIChFQ09SIDw8IFNNQ19JT19TSElGVCkpOworCXJlYWRiKGFkZHIgKyAoRUNPUiA8PCBTTUNfSU9fU0hJRlQpKTsKKworCS8qCisJICogV2FpdCAxMDB1cyBmb3IgdGhlIGNoaXAgdG8gcmVzZXQuCisJICovCisJdWRlbGF5KDEwMCk7CisKKwkvKgorCSAqIFRoZSBkZXZpY2Ugd2lsbCBpZ25vcmUgYWxsIHdyaXRlcyB0byB0aGUgZW5hYmxlIGJpdCB3aGlsZQorCSAqIHJlc2V0IGlzIGFzc2VydGVkLCBldmVuIGlmIHRoZSByZXNldCBiaXQgaXMgY2xlYXJlZCBpbiB0aGUKKwkgKiBzYW1lIHdyaXRlLiAgTXVzdCBjbGVhciByZXNldCBmaXJzdCwgdGhlbiBlbmFibGUgdGhlIGRldmljZS4KKwkgKi8KKwl3cml0ZWIoZWNvciwgYWRkciArIChFQ09SIDw8IFNNQ19JT19TSElGVCkpOworCXdyaXRlYihlY29yIHwgRUNPUl9FTkFCTEUsIGFkZHIgKyAoRUNPUiA8PCBTTUNfSU9fU0hJRlQpKTsKKworCS8qCisJICogU2V0IHRoZSBhcHByb3ByaWF0ZSBieXRlL3dvcmQgbW9kZS4KKwkgKi8KKwllY3NyID0gcmVhZGIoYWRkciArIChFQ1NSIDw8IFNNQ19JT19TSElGVCkpICYgfkVDU1JfSU9JUzg7CisjaWZuZGVmIFNNQ19DQU5fVVNFXzE2QklUCisJZWNzciB8PSBFQ1NSX0lPSVM4OworI2VuZGlmCisJd3JpdGViKGVjc3IsIGFkZHIgKyAoRUNTUiA8PCBTTUNfSU9fU0hJRlQpKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlpb3VubWFwKGFkZHIpOworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgY2hpcCB0byB3YWtlIHVwLiAgV2UgY291bGQgcG9sbCB0aGUgY29udHJvbAorCSAqIHJlZ2lzdGVyIGluIHRoZSBtYWluIHJlZ2lzdGVyIHNwYWNlLCBidXQgdGhhdCBpc24ndCBtYXBwZWQKKwkgKiB5ZXQuICBXZSBrbm93IHRoaXMgaXMgZ29pbmcgdG8gdGFrZSA3NTB1cy4KKwkgKi8KKwltc2xlZXAoMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbWNfcmVxdWVzdF9hdHRyaWIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKiByZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAic21jOTF4LWF0dHJpYiIpOworCisJaWYgKCFyZXMpCisJCXJldHVybiAwOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgQVRUUklCX1NJWkUsIENBUkROQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbWNfcmVsZWFzZV9hdHRyaWIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKiByZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAic21jOTF4LWF0dHJpYiIpOworCisJaWYgKHJlcykKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIEFUVFJJQl9TSVpFKTsKK30KKworI2lmZGVmIFNNQ19DQU5fVVNFX0RBVEFDUworc3RhdGljIHZvaWQgc21jX3JlcXVlc3RfZGF0YWNzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqIHJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJzbWM5MXgtZGF0YTMyIik7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCWlmICghcmVzKQorCQlyZXR1cm47CisKKwlpZighcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIFNNQ19EQVRBX0VYVEVOVCwgQ0FSRE5BTUUpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBmYWlsZWQgdG8gcmVxdWVzdCBkYXRhY3MgbWVtb3J5IHJlZ2lvbi5cbiIsIENBUkROQU1FKTsKKwkJcmV0dXJuOworCX0KKworCWxwLT5kYXRhY3MgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIFNNQ19EQVRBX0VYVEVOVCk7Cit9CisKK3N0YXRpYyB2b2lkIHNtY19yZWxlYXNlX2RhdGFjcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCByZXNvdXJjZSAqIHJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJzbWM5MXgtZGF0YTMyIik7CisKKwlpZiAobHAtPmRhdGFjcykKKwkJaW91bm1hcChscC0+ZGF0YWNzKTsKKworCWxwLT5kYXRhY3MgPSBOVUxMOworCisJaWYgKHJlcykKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIFNNQ19EQVRBX0VYVEVOVCk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgc21jX3JlcXVlc3RfZGF0YWNzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KSB7fQorc3RhdGljIHZvaWQgc21jX3JlbGVhc2VfZGF0YWNzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KSB7fQorI2VuZGlmCisKKy8qCisgKiBzbWNfaW5pdCh2b2lkKQorICogICBJbnB1dCBwYXJhbWV0ZXJzOgorICoJZGV2LT5iYXNlX2FkZHIgPT0gMCwgdHJ5IHRvIGZpbmQgYWxsIHBvc3NpYmxlIGxvY2F0aW9ucworICoJZGV2LT5iYXNlX2FkZHIgPiAweDFmZiwgdGhpcyBpcyB0aGUgYWRkcmVzcyB0byBjaGVjaworICoJZGV2LT5iYXNlX2FkZHIgPT0gPGFueXRoaW5nIGVsc2U+LCByZXR1cm4gZmFpbHVyZSBjb2RlCisgKgorICogICBPdXRwdXQ6CisgKgkwIC0tPiB0aGVyZSBpcyBhIGRldmljZQorICoJYW55dGhpbmcgZWxzZSwgZXJyb3IKKyAqLworc3RhdGljIGludCBzbWNfZHJ2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdW5zaWduZWQgaW50IF9faW9tZW0gKmFkZHI7CisJaW50IHJldDsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJzbWM5MXgtcmVncyIpOworCWlmICghcmVzKQorCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgU01DX0lPX0VYVEVOVCwgQ0FSRE5BTUUpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgc21jX2xvY2FsKSk7CisJaWYgKCFuZGV2KSB7CisJCXByaW50aygiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBkZXZpY2UuXG4iLCBDQVJETkFNRSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlbGVhc2VfaW87CisJfQorCVNFVF9NT0RVTEVfT1dORVIobmRldik7CisJU0VUX05FVERFVl9ERVYobmRldiwgZGV2KTsKKworCW5kZXYtPmRtYSA9ICh1bnNpZ25lZCBjaGFyKS0xOworCW5kZXYtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisKKwlyZXQgPSBzbWNfcmVxdWVzdF9hdHRyaWIocGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnJlZV9uZXRkZXY7CisjaWYgZGVmaW5lZChDT05GSUdfU0ExMTAwX0FTU0FCRVQpCisJTkNSXzAgfD0gTkNSX0VORVRfT1NDX0VOOworI2VuZGlmCisJcmV0ID0gc21jX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfcmVsZWFzZV9hdHRyaWI7CisKKwlhZGRyID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBTTUNfSU9fRVhURU5UKTsKKwlpZiAoIWFkZHIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfcmVsZWFzZV9hdHRyaWI7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKGRldiwgbmRldik7CisJcmV0ID0gc21jX3Byb2JlKG5kZXYsIGFkZHIpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBvdXRfaW91bm1hcDsKKyNpZmRlZiBTTUNfVVNFX1BYQV9ETUEKKwllbHNlIHsKKwkJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwkJbHAtPnBoeXNhZGRyID0gcmVzLT5zdGFydDsKKwl9CisjZW5kaWYKKworCXNtY19yZXF1ZXN0X2RhdGFjcyhwZGV2LCBuZGV2KTsKKworCXJldHVybiAwOworCisgb3V0X2lvdW5tYXA6CisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJaW91bm1hcChhZGRyKTsKKyBvdXRfcmVsZWFzZV9hdHRyaWI6CisJc21jX3JlbGVhc2VfYXR0cmliKHBkZXYpOworIG91dF9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldihuZGV2KTsKKyBvdXRfcmVsZWFzZV9pbzoKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgU01DX0lPX0VYVEVOVCk7Cisgb3V0OgorCXByaW50aygiJXM6IG5vdCBmb3VuZCAoJWQpLlxuIiwgQ0FSRE5BTUUsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNtY19kcnZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisKKwl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKworCWZyZWVfaXJxKG5kZXYtPmlycSwgbmRldik7CisKKyNpZmRlZiBTTUNfVVNFX1BYQV9ETUEKKwlpZiAobmRldi0+ZG1hICE9ICh1bnNpZ25lZCBjaGFyKS0xKQorCQlweGFfZnJlZV9kbWEobmRldi0+ZG1hKTsKKyNlbmRpZgorCWlvdW5tYXAobHAtPmJhc2UpOworCisJc21jX3JlbGVhc2VfZGF0YWNzKHBkZXYsbmRldik7CisJc21jX3JlbGVhc2VfYXR0cmliKHBkZXYpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgInNtYzkxeC1yZWdzIik7CisJaWYgKCFyZXMpCisJCXBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIFNNQ19JT19FWFRFTlQpOworCisJZnJlZV9uZXRkZXYobmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbWNfZHJ2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgc3RhdGUsIHUzMiBsZXZlbCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKG5kZXYgJiYgbGV2ZWwgPT0gU1VTUEVORF9ESVNBQkxFKSB7CisJCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKSB7CisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5kZXYpOworCQkJc21jX3NodXRkb3duKG5kZXYpOworCQkJc21jX3BoeV9wb3dlcmRvd24obmRldik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21jX2Rydl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAobmRldiAmJiBsZXZlbCA9PSBSRVNVTUVfRU5BQkxFKSB7CisJCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYobmRldik7CisJCXNtY19lbmFibGVfZGV2aWNlKHBkZXYpOworCQlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkgeworCQkJc21jX3Jlc2V0KG5kZXYpOworCQkJc21jX2VuYWJsZShuZGV2KTsKKwkJCWlmIChscC0+cGh5X3R5cGUgIT0gMCkKKwkJCQlzbWNfcGh5X2NvbmZpZ3VyZShuZGV2KTsKKwkJCW5ldGlmX2RldmljZV9hdHRhY2gobmRldik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzbWNfZHJpdmVyID0geworCS5uYW1lCQk9IENBUkROQU1FLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBzbWNfZHJ2X3Byb2JlLAorCS5yZW1vdmUJCT0gc21jX2Rydl9yZW1vdmUsCisJLnN1c3BlbmQJPSBzbWNfZHJ2X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzbWNfZHJ2X3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNtY19pbml0KHZvaWQpCit7CisjaWZkZWYgTU9EVUxFCisjaWZkZWYgQ09ORklHX0lTQQorCWlmIChpbyA9PSAtMSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSIlczogWW91IHNob3VsZG4ndCB1c2UgYXV0by1wcm9iaW5nIHdpdGggaW5zbW9kIVxuIiwKKwkJCUNBUkROQU1FKTsKKyNlbmRpZgorI2VuZGlmCisKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZzbWNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNtY19jbGVhbnVwKHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnNtY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzbWNfaW5pdCk7Cittb2R1bGVfZXhpdChzbWNfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MXguaCBiL2RyaXZlcnMvbmV0L3NtYzkxeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZDI2ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zbWM5MXguaApAQCAtMCwwICsxLDEwMzIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLiBzbWM5MXguaCAtIG1hY3JvcyBmb3IgU01TQydzIDkxQzl4LzkxQzF4eCBzaW5nbGUtY2hpcCBFdGhlcm5ldCBkZXZpY2UuCisgLgorIC4gQ29weXJpZ2h0IChDKSAxOTk2IGJ5IEVyaWsgU3RhaGxtYW4KKyAuIENvcHlyaWdodCAoQykgMjAwMSBTdGFuZGFyZCBNaWNyb3N5c3RlbXMgQ29ycG9yYXRpb24KKyAuCURldmVsb3BlZCBieSBTaW1wbGUgTmV0d29yayBNYWdpYyBDb3Jwb3JhdGlvbgorIC4gQ29weXJpZ2h0IChDKSAyMDAzIE1vbnRhIFZpc3RhIFNvZnR3YXJlLCBJbmMuCisgLglVbmlmaWVkIFNNQzkxeCBkcml2ZXIgYnkgTmljb2xhcyBQaXRyZQorIC4KKyAuIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgLiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIC4gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAuIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgLgorIC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgLiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIC4gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIC4gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAuCisgLiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIC4gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAuIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAuCisgLiBJbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhpcyBmaWxlIHdhcyBvYnRhaW5lZCBmcm9tIHRoZSBMQU45MUMxMTEKKyAuIG1hbnVhbCBmcm9tIFNNQy4gIFRvIGdldCBhIGNvcHksIGlmIHlvdSByZWFsbHkgd2FudCBvbmUsIHlvdSBjYW4gZmluZAorIC4gaW5mb3JtYXRpb24gdW5kZXIgd3d3LnNtc2MuY29tLgorIC4KKyAuIEF1dGhvcnMKKyAuCUVyaWsgU3RhaGxtYW4JCTxlcmlrQHZ0LmVkdT4KKyAuCURhcmlzIEEgTmV2aWwJCTxkbmV2aWxAc25tYy5jb20+CisgLglOaWNvbGFzIFBpdHJlIAkJPG5pY29AY2FtLm9yZz4KKyAuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgX1NNQzkxWF9IXworI2RlZmluZSBfU01DOTFYX0hfCisKKworLyoKKyAqIERlZmluZSB5b3VyIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBidXMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGhlcmUuCisgKi8KKworI2lmCWRlZmluZWQoQ09ORklHX0FSQ0hfTFVCQk9DSykKKworLyogV2UgY2FuIG9ubHkgZG8gMTYtYml0IHJlYWRzIGFuZCB3cml0ZXMgaW4gdGhlIHN0YXRpYyBtZW1vcnkgc3BhY2UuICovCisjZGVmaW5lIFNNQ19DQU5fVVNFXzhCSVQJMAorI2RlZmluZSBTTUNfQ0FOX1VTRV8xNkJJVAkxCisjZGVmaW5lIFNNQ19DQU5fVVNFXzMyQklUCTAKKyNkZWZpbmUgU01DX05PV0FJVAkJMQorCisvKiBUaGUgZmlyc3QgdHdvIGFkZHJlc3MgbGluZXMgYXJlbid0IGNvbm5lY3RlZC4uLiAqLworI2RlZmluZSBTTUNfSU9fU0hJRlQJCTIKKworI2RlZmluZSBTTUNfaW53KGEsIHIpCQlyZWFkdygoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXR3KHYsIGEsIHIpCXdyaXRldyh2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19pbnN3KGEsIHIsIHAsIGwpCXJlYWRzdygoYSkgKyAociksIHAsIGwpCisjZGVmaW5lIFNNQ19vdXRzdyhhLCByLCBwLCBsKQl3cml0ZXN3KChhKSArIChyKSwgcCwgbCkKKworI2VsaWYgZGVmaW5lZChDT05GSUdfUkVEV09PRF81KSB8fCBkZWZpbmVkKENPTkZJR19SRURXT09EXzYpCisKKy8qIFdlIGNhbiBvbmx5IGRvIDE2LWJpdCByZWFkcyBhbmQgd3JpdGVzIGluIHRoZSBzdGF0aWMgbWVtb3J5IHNwYWNlLiAqLworI2RlZmluZSBTTUNfQ0FOX1VTRV84QklUCTAKKyNkZWZpbmUgU01DX0NBTl9VU0VfMTZCSVQJMQorI2RlZmluZSBTTUNfQ0FOX1VTRV8zMkJJVAkwCisjZGVmaW5lIFNNQ19OT1dBSVQJCTEKKworI2RlZmluZSBTTUNfSU9fU0hJRlQJCTAKKworI2RlZmluZSBTTUNfaW53KGEsIHIpCQlpbl9iZTE2KCh2b2xhdGlsZSB1MTYgKikoKGEpICsgKHIpKSkKKyNkZWZpbmUgU01DX291dHcodiwgYSwgcikJb3V0X2JlMTYoKHZvbGF0aWxlIHUxNiAqKSgoYSkgKyAocikpLCB2KQorI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKSAJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQl1bnNpZ25lZCBsb25nIF9fcG9ydCA9IChhKSArIChyKTsJCQlcCisJCXUxNiAqX19wID0gKHUxNiAqKShwKTsJCQkJCVwKKwkJaW50IF9fbCA9IChsKTsJCQkJCQlcCisJCWluc3coX19wb3J0LCBfX3AsIF9fbCk7CQkJCQlcCisJCXdoaWxlIChfX2wgPiAwKSB7CQkJCQlcCisJCQkqX19wID0gc3dhYjE2KCpfX3ApOwkJCQlcCisJCQlfX3ArKzsJCQkJCQlcCisJCQlfX2wtLTsJCQkJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIFNNQ19vdXRzdyhhLCByLCBwLCBsKSAJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQl1bnNpZ25lZCBsb25nIF9fcG9ydCA9IChhKSArIChyKTsJCQlcCisJCXUxNiAqX19wID0gKHUxNiAqKShwKTsJCQkJCVwKKwkJaW50IF9fbCA9IChsKTsJCQkJCQlcCisJCXdoaWxlIChfX2wgPiAwKSB7CQkJCQlcCisJCQkvKiBCZWxpZXZlIGl0IG9yIG5vdCwgdGhlIHN3YWIgaXNuJ3QgbmVlZGVkLiAqLwlcCisJCQlvdXR3KCAvKiBzd2FiMTYgKi8gKCpfX3ArKyksIF9fcG9ydCk7CQlcCisJCQlfX2wtLTsJCQkJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIHNldF9pcnFfdHlwZShpcnEsIHR5cGUpCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NBMTEwMF9QTEVCKQorLyogV2UgY2FuIG9ubHkgZG8gMTYtYml0IHJlYWRzIGFuZCB3cml0ZXMgaW4gdGhlIHN0YXRpYyBtZW1vcnkgc3BhY2UuICovCisjZGVmaW5lIFNNQ19DQU5fVVNFXzhCSVQJMQorI2RlZmluZSBTTUNfQ0FOX1VTRV8xNkJJVAkxCisjZGVmaW5lIFNNQ19DQU5fVVNFXzMyQklUCTAKKyNkZWZpbmUgU01DX0lPX1NISUZUCQkwCisjZGVmaW5lIFNNQ19OT1dBSVQJCTEKKworI2RlZmluZSBTTUNfaW5iKGEsIHIpCQlpbmIoKGEpICsgKHIpKQorI2RlZmluZSBTTUNfaW5zYihhLCByLCBwLCBsKQlpbnNiKChhKSArIChyKSwgcCwgKGwpKQorI2RlZmluZSBTTUNfaW53KGEsIHIpCQlpbncoKGEpICsgKHIpKQorI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKQlpbnN3KChhKSArIChyKSwgcCwgbCkKKyNkZWZpbmUgU01DX291dGIodiwgYSwgcikJb3V0Yih2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXRzYihhLCByLCBwLCBsKQlvdXRzYigoYSkgKyAociksIHAsIChsKSkKKyNkZWZpbmUgU01DX291dHcodiwgYSwgcikJb3V0dyh2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXRzdyhhLCByLCBwLCBsKQlvdXRzdygoYSkgKyAociksIHAsIGwpCisKKyNkZWZpbmUgc2V0X2lycV90eXBlKGlycSwgdHlwZSkgZG8ge30gd2hpbGUgKDApCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NBMTEwMF9BU1NBQkVUKQorCisjaW5jbHVkZSA8YXNtL2FyY2gvbmVwb25zZXQuaD4KKworLyogV2UgY2FuIG9ubHkgZG8gOC1iaXQgcmVhZHMgYW5kIHdyaXRlcyBpbiB0aGUgc3RhdGljIG1lbW9yeSBzcGFjZS4gKi8KKyNkZWZpbmUgU01DX0NBTl9VU0VfOEJJVAkxCisjZGVmaW5lIFNNQ19DQU5fVVNFXzE2QklUCTAKKyNkZWZpbmUgU01DX0NBTl9VU0VfMzJCSVQJMAorI2RlZmluZSBTTUNfTk9XQUlUCQkxCisKKy8qIFRoZSBmaXJzdCB0d28gYWRkcmVzcyBsaW5lcyBhcmVuJ3QgY29ubmVjdGVkLi4uICovCisjZGVmaW5lIFNNQ19JT19TSElGVAkJMgorCisjZGVmaW5lIFNNQ19pbmIoYSwgcikJCXJlYWRiKChhKSArIChyKSkKKyNkZWZpbmUgU01DX291dGIodiwgYSwgcikJd3JpdGViKHYsIChhKSArIChyKSkKKyNkZWZpbmUgU01DX2luc2IoYSwgciwgcCwgbCkJcmVhZHNiKChhKSArIChyKSwgcCwgKGwpKQorI2RlZmluZSBTTUNfb3V0c2IoYSwgciwgcCwgbCkJd3JpdGVzYigoYSkgKyAociksIHAsIChsKSkKKworI2VsaWYJZGVmaW5lZChDT05GSUdfQVJDSF9JTk5PS09NKSB8fCBcCisJZGVmaW5lZChDT05GSUdfTUFDSF9NQUlOU1RPTkUpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19BUkNIX1BYQV9JRFApIHx8IFwKKwlkZWZpbmVkKENPTkZJR19BUkNIX1JBTVNFUykKKworI2RlZmluZSBTTUNfQ0FOX1VTRV84QklUCTEKKyNkZWZpbmUgU01DX0NBTl9VU0VfMTZCSVQJMQorI2RlZmluZSBTTUNfQ0FOX1VTRV8zMkJJVAkxCisjZGVmaW5lIFNNQ19JT19TSElGVAkJMAorI2RlZmluZSBTTUNfTk9XQUlUCQkxCisjZGVmaW5lIFNNQ19VU0VfUFhBX0RNQQkJMQorCisjZGVmaW5lIFNNQ19pbmIoYSwgcikJCXJlYWRiKChhKSArIChyKSkKKyNkZWZpbmUgU01DX2ludyhhLCByKQkJcmVhZHcoKGEpICsgKHIpKQorI2RlZmluZSBTTUNfaW5sKGEsIHIpCQlyZWFkbCgoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXRiKHYsIGEsIHIpCXdyaXRlYih2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXRsKHYsIGEsIHIpCXdyaXRlbCh2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19pbnNsKGEsIHIsIHAsIGwpCXJlYWRzbCgoYSkgKyAociksIHAsIGwpCisjZGVmaW5lIFNNQ19vdXRzbChhLCByLCBwLCBsKQl3cml0ZXNsKChhKSArIChyKSwgcCwgbCkKKworLyogV2UgYWN0dWFsbHkgY2FuJ3Qgd3JpdGUgaGFsZndvcmRzIHByb3Blcmx5IGlmIG5vdCB3b3JkIGFsaWduZWQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorU01DX291dHcodTE2IHZhbCwgdW5zaWduZWQgbG9uZyBpb2FkZHIsIGludCByZWcpCit7CisJaWYgKHJlZyAmIDIpIHsKKwkJdW5zaWduZWQgaW50IHYgPSB2YWwgPDwgMTY7CisJCXYgfD0gcmVhZGwoaW9hZGRyICsgKHJlZyAmIH4yKSkgJiAweGZmZmY7CisJCXdyaXRlbCh2LCBpb2FkZHIgKyAocmVnICYgfjIpKTsKKwl9IGVsc2UgeworCQl3cml0ZXcodmFsLCBpb2FkZHIgKyByZWcpOworCX0KK30KKworI2VsaWYJZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQKQorCisvKiBXZSBjYW4gb25seSBkbyAxNi1iaXQgcmVhZHMgYW5kIHdyaXRlcyBpbiB0aGUgc3RhdGljIG1lbW9yeSBzcGFjZS4gKi8KKyNkZWZpbmUgU01DX0NBTl9VU0VfOEJJVAkwCisjZGVmaW5lIFNNQ19DQU5fVVNFXzE2QklUCTEKKyNkZWZpbmUgU01DX0NBTl9VU0VfMzJCSVQJMAorI2RlZmluZSBTTUNfSU9fU0hJRlQJCTAKKyNkZWZpbmUgU01DX05PV0FJVAkJMQorCisjZGVmaW5lIFNNQ19pbmIoYSwgcikJCXJlYWRiKChhKSArIChyKSkKKyNkZWZpbmUgU01DX291dGIodiwgYSwgcikJd3JpdGViKHYsIChhKSArIChyKSkKKyNkZWZpbmUgU01DX2ludyhhLCByKQkJcmVhZHcoKGEpICsgKHIpKQorI2RlZmluZSBTTUNfb3V0dyh2LCBhLCByKQl3cml0ZXcodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKQlyZWFkc3coKGEpICsgKHIpLCBwLCBsKQorI2RlZmluZSBTTUNfb3V0c3coYSwgciwgcCwgbCkJd3JpdGVzdygoYSkgKyAociksIHAsIGwpCisjZGVmaW5lIFNNQ19pbmwoYSwgcikJCXJlYWRsKChhKSArIChyKSkKKyNkZWZpbmUgU01DX291dGwodiwgYSwgcikJd3JpdGVsKHYsIChhKSArIChyKSkKKyNkZWZpbmUgU01DX2luc2woYSwgciwgcCwgbCkJcmVhZHNsKChhKSArIChyKSwgcCwgbCkKKyNkZWZpbmUgU01DX291dHNsKGEsIHIsIHAsIGwpCXdyaXRlc2woKGEpICsgKHIpLCBwLCBsKQorCisjZWxpZglkZWZpbmVkKENPTkZJR19TSF9TSDQyMDJfTUlDUk9ERVYpCisKKyNkZWZpbmUgU01DX0NBTl9VU0VfOEJJVAkwCisjZGVmaW5lIFNNQ19DQU5fVVNFXzE2QklUCTEKKyNkZWZpbmUgU01DX0NBTl9VU0VfMzJCSVQJMAorCisjZGVmaW5lIFNNQ19pbmIoYSwgcikJCWluYigoYSkgKyAocikgLSAweGEwMDAwMDAwKQorI2RlZmluZSBTTUNfaW53KGEsIHIpCQlpbncoKGEpICsgKHIpIC0gMHhhMDAwMDAwMCkKKyNkZWZpbmUgU01DX2lubChhLCByKQkJaW5sKChhKSArIChyKSAtIDB4YTAwMDAwMDApCisjZGVmaW5lIFNNQ19vdXRiKHYsIGEsIHIpCW91dGIodiwgKGEpICsgKHIpIC0gMHhhMDAwMDAwMCkKKyNkZWZpbmUgU01DX291dHcodiwgYSwgcikJb3V0dyh2LCAoYSkgKyAocikgLSAweGEwMDAwMDAwKQorI2RlZmluZSBTTUNfb3V0bCh2LCBhLCByKQlvdXRsKHYsIChhKSArIChyKSAtIDB4YTAwMDAwMDApCisjZGVmaW5lIFNNQ19pbnNsKGEsIHIsIHAsIGwpCWluc2woKGEpICsgKHIpIC0gMHhhMDAwMDAwMCwgcCwgbCkKKyNkZWZpbmUgU01DX291dHNsKGEsIHIsIHAsIGwpCW91dHNsKChhKSArIChyKSAtIDB4YTAwMDAwMDAsIHAsIGwpCisjZGVmaW5lIFNNQ19pbnN3KGEsIHIsIHAsIGwpCWluc3coKGEpICsgKHIpIC0gMHhhMDAwMDAwMCwgcCwgbCkKKyNkZWZpbmUgU01DX291dHN3KGEsIHIsIHAsIGwpCW91dHN3KChhKSArIChyKSAtIDB4YTAwMDAwMDAsIHAsIGwpCisKKyNkZWZpbmUgc2V0X2lycV90eXBlKGlycSwgdHlwZSkJZG8ge30gd2hpbGUoMCkKKworI2VsaWYJZGVmaW5lZChDT05GSUdfSVNBKQorCisjZGVmaW5lIFNNQ19DQU5fVVNFXzhCSVQJMQorI2RlZmluZSBTTUNfQ0FOX1VTRV8xNkJJVAkxCisjZGVmaW5lIFNNQ19DQU5fVVNFXzMyQklUCTAKKworI2RlZmluZSBTTUNfaW5iKGEsIHIpCQlpbmIoKGEpICsgKHIpKQorI2RlZmluZSBTTUNfaW53KGEsIHIpCQlpbncoKGEpICsgKHIpKQorI2RlZmluZSBTTUNfb3V0Yih2LCBhLCByKQlvdXRiKHYsIChhKSArIChyKSkKKyNkZWZpbmUgU01DX291dHcodiwgYSwgcikJb3V0dyh2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19pbnN3KGEsIHIsIHAsIGwpCWluc3coKGEpICsgKHIpLCBwLCBsKQorI2RlZmluZSBTTUNfb3V0c3coYSwgciwgcCwgbCkJb3V0c3coKGEpICsgKHIpLCBwLCBsKQorCisjZWxpZiAgIGRlZmluZWQoQ09ORklHX00zMlIpCisKKyNkZWZpbmUgU01DX0NBTl9VU0VfOEJJVAkwCisjZGVmaW5lIFNNQ19DQU5fVVNFXzE2QklUCTEKKyNkZWZpbmUgU01DX0NBTl9VU0VfMzJCSVQJMAorCisjZGVmaW5lIFNNQ19pbmIoYSwgcikJCWluYigoYSkgKyAocikgLSAweGEwMDAwMDAwKQorI2RlZmluZSBTTUNfaW53KGEsIHIpCQlpbncoKGEpICsgKHIpIC0gMHhhMDAwMDAwMCkKKyNkZWZpbmUgU01DX291dGIodiwgYSwgcikJb3V0Yih2LCAoYSkgKyAocikgLSAweGEwMDAwMDAwKQorI2RlZmluZSBTTUNfb3V0dyh2LCBhLCByKQlvdXR3KHYsIChhKSArIChyKSAtIDB4YTAwMDAwMDApCisjZGVmaW5lIFNNQ19pbnN3KGEsIHIsIHAsIGwpCWluc3coKGEpICsgKHIpIC0gMHhhMDAwMDAwMCwgcCwgbCkKKyNkZWZpbmUgU01DX291dHN3KGEsIHIsIHAsIGwpCW91dHN3KChhKSArIChyKSAtIDB4YTAwMDAwMDAsIHAsIGwpCisKKyNkZWZpbmUgc2V0X2lycV90eXBlKGlycSwgdHlwZSkJZG8ge30gd2hpbGUoMCkKKworI2RlZmluZSBSUENfTFNBX0RFRkFVTFQJCVJQQ19MRURfVFhfUlgKKyNkZWZpbmUgUlBDX0xTQl9ERUZBVUxUCQlSUENfTEVEXzEwMF8xMAorCisjZWxpZglkZWZpbmVkKENPTkZJR19NQUNIX0xQRDdBNDAwKSB8fCBkZWZpbmVkKENPTkZJR19NQUNIX0xQRDdBNDA0KQorCisvKiBUaGUgTFBEN0E0MFhfSU9CQVJSSUVSIGlzIG5lY2Vzc2FyeSB0byBvdmVyY29tZSBhIG1pc21hdGNoIGJldHdlZW4KKyAqIHRoZSB3YXkgdGhhdCB0aGUgQ1BVIGhhbmRsZXMgY2hpcCBzZWxlY3RzIGFuZCB0aGUgd2F5IHRoYXQgdGhlIFNNQworICogY2hpcCBleHBlY3RzIHRoZSBjaGlwIHNlbGVjdCB0byBvcGVyYXRlLiAgUmVmZXIgdG8KKyAqIERvY3VtZW50YXRpb24vYXJtL1NoYXJwLUxIL0lPQmFycmllciBmb3IgZGV0YWlscy4gIFRoZSByZWFkIGZyb20KKyAqIElPQkFSUklFUiBpcyBhIGJ5dGUgYXMgYSBsZWFzdC1jb21tb24gZGVub21pbmF0b3Igb2YgcG9zc2libGUKKyAqIHJlZ2lvbnMgdG8gdXNlIGFzIHRoZSBiYXJyaWVyLiAgSXQgd291bGQgYmUgd2FzdGVmdWwgdG8gcmVhZCAzMgorICogYml0cyBmcm9tIGEgYnl0ZSBvcmllbnRlZCByZWdpb24uCisgKgorICogVGhlcmUgaXMgbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBhZ2FpbnN0IGludGVycnVwdHMgaW50ZXJ2ZW5pbmcKKyAqIGJldHdlZW4gdGhlIHdyaXRldyBhbmQgdGhlIElPQkFSUklFUi4gIEluIFNNQyBJU1IgdGhlcmUgaXMgYQorICogcHJlYW1ibGUgdGhhdCBwZXJmb3JtcyBhbiBJT0JBUlJJRVIgaW4gdGhlIGV4dHJlbWVseSB1bmxpa2VseSBldmVudAorICogdGhhdCB0aGUgZHJpdmVyIGludGVycnVwdHMgaXRzZWxmIGJldHdlZW4gYSB3cml0ZXcgdG8gdGhlIGNoaXAgYW4KKyAqIHRoZSBJT0JBUlJJRVIgdGhhdCBmb2xsb3dzICphbmQqIHRoZSBjYWNoZSBpcyBsYXJnZSBlbm91Z2ggdGhhdCB0aGUKKyAqIGZpcnN0IG9mZi1jaGlwIGFjY2VzcyB3aGlsZSBoYW5kaW5nIHRoZSBpbnRlcnJ1cHQgaXMgdG8gdGhlIFNNQworICogY2hpcC4gIE90aGVyIGRldmljZXMgaW4gdGhlIHNhbWUgYWRkcmVzcyBzcGFjZSBhcyB0aGUgU01DIGNoaXAgbXVzdAorICogYmUgYXdhcmUgb2YgdGhlIHBvdGVudGlhbCBmb3IgdHJvdWJsZSBhbmQgcGVyZm9ybSBhIHNpbWlsYXIKKyAqIElPQkFSUklFUiBvbiBlbnRyeSB0byB0aGVpciBJU1IuCisgKi8KKworI2luY2x1ZGUgPGFzbS9hcmNoL2NvbnN0YW50cy5oPgkvKiBJT0JBUlJJRVJfVklSVCAqLworCisjZGVmaW5lIFNNQ19DQU5fVVNFXzhCSVQJMAorI2RlZmluZSBTTUNfQ0FOX1VTRV8xNkJJVAkxCisjZGVmaW5lIFNNQ19DQU5fVVNFXzMyQklUCTAKKyNkZWZpbmUgU01DX05PV0FJVAkJMAorI2RlZmluZSBMUEQ3QTQwWF9JT0JBUlJJRVIJcmVhZGIgKElPQkFSUklFUl9WSVJUKQorCisjZGVmaW5lIFNNQ19pbncoYSxyKQkJcmVhZHcgKCh2b2lkKikgKChhKSArIChyKSkpCisjZGVmaW5lIFNNQ19pbnN3KGEscixwLGwpCXJlYWRzdyAoKHZvaWQqKSAoKGEpICsgKHIpKSwgcCwgbCkKKyNkZWZpbmUgU01DX291dHcodixhLHIpCSAgICAgKHsgd3JpdGV3ICgodiksIChhKSArIChyKSk7IExQRDdBNDBYX0lPQkFSUklFUjsgfSkKKworc3RhdGljIGlubGluZSB2b2lkIFNNQ19vdXRzdyAodW5zaWduZWQgbG9uZyBhLCBpbnQgciwgdW5zaWduZWQgY2hhciogcCwgaW50IGwpCit7CisJdW5zaWduZWQgc2hvcnQqIHBzID0gKHVuc2lnbmVkIHNob3J0KikgcDsKKwl3aGlsZSAobC0tID4gMCkgeworCQl3cml0ZXcgKCpwcysrLCBhICsgcik7CisJCUxQRDdBNDBYX0lPQkFSUklFUjsKKwl9Cit9CisKKyNkZWZpbmUgU01DX0lOVEVSUlVQVF9QUkVBTUJMRQlMUEQ3QTQwWF9JT0JBUlJJRVIKKworI2RlZmluZSBSUENfTFNBX0RFRkFVTFQJCVJQQ19MRURfVFhfUlgKKyNkZWZpbmUgUlBDX0xTQl9ERUZBVUxUCQlSUENfTEVEXzEwMF8xMAorCisjZWxzZQorCisjZGVmaW5lIFNNQ19DQU5fVVNFXzhCSVQJMQorI2RlZmluZSBTTUNfQ0FOX1VTRV8xNkJJVAkxCisjZGVmaW5lIFNNQ19DQU5fVVNFXzMyQklUCTEKKyNkZWZpbmUgU01DX05PV0FJVAkJMQorCisjZGVmaW5lIFNNQ19pbmIoYSwgcikJCXJlYWRiKChhKSArIChyKSkKKyNkZWZpbmUgU01DX2ludyhhLCByKQkJcmVhZHcoKGEpICsgKHIpKQorI2RlZmluZSBTTUNfaW5sKGEsIHIpCQlyZWFkbCgoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXRiKHYsIGEsIHIpCXdyaXRlYih2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXR3KHYsIGEsIHIpCXdyaXRldyh2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXRsKHYsIGEsIHIpCXdyaXRlbCh2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19pbnNsKGEsIHIsIHAsIGwpCXJlYWRzbCgoYSkgKyAociksIHAsIGwpCisjZGVmaW5lIFNNQ19vdXRzbChhLCByLCBwLCBsKQl3cml0ZXNsKChhKSArIChyKSwgcCwgbCkKKworI2RlZmluZSBSUENfTFNBX0RFRkFVTFQJCVJQQ19MRURfMTAwXzEwCisjZGVmaW5lIFJQQ19MU0JfREVGQVVMVAkJUlBDX0xFRF9UWF9SWAorCisjZW5kaWYKKworCisjaWZkZWYgU01DX1VTRV9QWEFfRE1BCisvKgorICogTGV0J3MgdXNlIHRoZSBETUEgZW5naW5lIG9uIHRoZSBYU2NhbGUgUFhBMnh4IGZvciBSWCBwYWNrZXRzLiBUaGlzIGlzCisgKiBhbHdheXMgaGFwcGVuaW5nIGluIGlycSBjb250ZXh0IHNvIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgcmFjZXMuICBUWCBpcworICogZGlmZmVyZW50IGFuZCBwcm9iYWJseSBub3Qgd29ydGggaXQgZm9yIHRoYXQgcmVhc29uLCBhbmQgbm90IGFzIGNyaXRpY2FsCisgKiBhcyBSWCB3aGljaCBjYW4gb3ZlcnJ1biBtZW1vcnkgYW5kIGxvc2UgcGFja2V0cy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisKKyNpZmRlZiBTTUNfaW5zbAorI3VuZGVmIFNNQ19pbnNsCisjZGVmaW5lIFNNQ19pbnNsKGEsIHIsIHAsIGwpIFwKKwlzbWNfcHhhX2RtYV9pbnNsKGEsIGxwLT5waHlzYWRkciwgciwgZGV2LT5kbWEsIHAsIGwpCitzdGF0aWMgaW5saW5lIHZvaWQKK3NtY19weGFfZG1hX2luc2wodV9sb25nIGlvYWRkciwgdV9sb25nIHBoeXNhZGRyLCBpbnQgcmVnLCBpbnQgZG1hLAorCQkgdV9jaGFyICpidWYsIGludCBsZW4pCit7CisJZG1hX2FkZHJfdCBkbWFidWY7CisKKwkvKiBmYWxsYmFjayBpZiBubyBETUEgYXZhaWxhYmxlICovCisJaWYgKGRtYSA9PSAodW5zaWduZWQgY2hhciktMSkgeworCQlyZWFkc2woaW9hZGRyICsgcmVnLCBidWYsIGxlbik7CisJCXJldHVybjsKKwl9CisKKwkvKiA2NCBiaXQgYWxpZ25tZW50IGlzIHJlcXVpcmVkIGZvciBtZW1vcnkgdG8gbWVtb3J5IERNQSAqLworCWlmICgobG9uZylidWYgJiA0KSB7CisJCSooKHUzMiAqKWJ1ZikgPSBTTUNfaW5sKGlvYWRkciwgcmVnKTsKKwkJYnVmICs9IDQ7CisJCWxlbi0tOworCX0KKworCWxlbiAqPSA0OworCWRtYWJ1ZiA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsIGJ1ZiwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCURDU1IoZG1hKSA9IERDU1JfTk9ERVNDOworCURUQURSKGRtYSkgPSBkbWFidWY7CisJRFNBRFIoZG1hKSA9IHBoeXNhZGRyICsgcmVnOworCURDTUQoZG1hKSA9IChEQ01EX0lOQ1RSR0FERFIgfCBEQ01EX0JVUlNUMzIgfAorCQkgICAgIERDTURfV0lEVEg0IHwgKERDTURfTEVOR1RIICYgbGVuKSk7CisJRENTUihkbWEpID0gRENTUl9OT0RFU0MgfCBEQ1NSX1JVTjsKKwl3aGlsZSAoIShEQ1NSKGRtYSkgJiBEQ1NSX1NUT1BTVEFURSkpCisJCWNwdV9yZWxheCgpOworCURDU1IoZG1hKSA9IDA7CisJZG1hX3VubWFwX3NpbmdsZShOVUxMLCBkbWFidWYsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKK30KKyNlbmRpZgorCisjaWZkZWYgU01DX2luc3cKKyN1bmRlZiBTTUNfaW5zdworI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKSBcCisJc21jX3B4YV9kbWFfaW5zdyhhLCBscC0+cGh5c2FkZHIsIHIsIGRldi0+ZG1hLCBwLCBsKQorc3RhdGljIGlubGluZSB2b2lkCitzbWNfcHhhX2RtYV9pbnN3KHVfbG9uZyBpb2FkZHIsIHVfbG9uZyBwaHlzYWRkciwgaW50IHJlZywgaW50IGRtYSwKKwkJIHVfY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWRtYV9hZGRyX3QgZG1hYnVmOworCisJLyogZmFsbGJhY2sgaWYgbm8gRE1BIGF2YWlsYWJsZSAqLworCWlmIChkbWEgPT0gKHVuc2lnbmVkIGNoYXIpLTEpIHsKKwkJcmVhZHN3KGlvYWRkciArIHJlZywgYnVmLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJLyogNjQgYml0IGFsaWdubWVudCBpcyByZXF1aXJlZCBmb3IgbWVtb3J5IHRvIG1lbW9yeSBETUEgKi8KKwl3aGlsZSAoKGxvbmcpYnVmICYgNikgeworCQkqKCh1MTYgKilidWYpID0gU01DX2ludyhpb2FkZHIsIHJlZyk7CisJCWJ1ZiArPSAyOworCQlsZW4tLTsKKwl9CisKKwlsZW4gKj0gMjsKKwlkbWFidWYgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBidWYsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKKwlEQ1NSKGRtYSkgPSBEQ1NSX05PREVTQzsKKwlEVEFEUihkbWEpID0gZG1hYnVmOworCURTQURSKGRtYSkgPSBwaHlzYWRkciArIHJlZzsKKwlEQ01EKGRtYSkgPSAoRENNRF9JTkNUUkdBRERSIHwgRENNRF9CVVJTVDMyIHwKKwkJICAgICBEQ01EX1dJRFRIMiB8IChEQ01EX0xFTkdUSCAmIGxlbikpOworCURDU1IoZG1hKSA9IERDU1JfTk9ERVNDIHwgRENTUl9SVU47CisJd2hpbGUgKCEoRENTUihkbWEpICYgRENTUl9TVE9QU1RBVEUpKQorCQljcHVfcmVsYXgoKTsKKwlEQ1NSKGRtYSkgPSAwOworCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgZG1hYnVmLCBsZW4sIERNQV9GUk9NX0RFVklDRSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3NtY19weGFfZG1hX2lycShpbnQgZG1hLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJRENTUihkbWEpID0gMDsKK30KKyNlbmRpZiAgLyogU01DX1VTRV9QWEFfRE1BICovCisKKworLyogQmVjYXVzZSBvZiBiYW5rIHN3aXRjaGluZywgdGhlIExBTjkxeCB1c2VzIG9ubHkgMTYgSS9PIHBvcnRzICovCisjaWZuZGVmIFNNQ19JT19TSElGVAorI2RlZmluZSBTTUNfSU9fU0hJRlQJMAorI2VuZGlmCisjZGVmaW5lIFNNQ19JT19FWFRFTlQJKDE2IDw8IFNNQ19JT19TSElGVCkKKyNkZWZpbmUgU01DX0RBVEFfRVhURU5UICg0KQorCisvKgorIC4gQmFuayBTZWxlY3QgUmVnaXN0ZXI6CisgLgorIC4JCXl5eXkgeXl5eSAwMDAwIDAweHgKKyAuCQl4eCAJCT0gYmFuayBudW1iZXIKKyAuCQl5eXl5IHl5eXkJPSAweDMzLCBmb3IgaWRlbnRpZmljYXRpb24gcHVycG9zZXMuCisqLworI2RlZmluZSBCQU5LX1NFTEVDVAkJKDE0IDw8IFNNQ19JT19TSElGVCkKKworCisvLyBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyCisvKiBCQU5LIDAgICovCisjZGVmaW5lIFRDUl9SRUcgCVNNQ19SRUcoMHgwMDAwLCAwKQorI2RlZmluZSBUQ1JfRU5BQkxFCTB4MDAwMQkvLyBXaGVuIDEgd2UgY2FuIHRyYW5zbWl0CisjZGVmaW5lIFRDUl9MT09QCTB4MDAwMgkvLyBDb250cm9scyBvdXRwdXQgcGluIExCSworI2RlZmluZSBUQ1JfRk9SQ09MCTB4MDAwNAkvLyBXaGVuIDEgd2lsbCBmb3JjZSBhIGNvbGxpc2lvbgorI2RlZmluZSBUQ1JfUEFEX0VOCTB4MDA4MAkvLyBXaGVuIDEgd2lsbCBwYWQgdHggZnJhbWVzIDwgNjQgYnl0ZXMgdy8wCisjZGVmaW5lIFRDUl9OT0NSQwkweDAxMDAJLy8gV2hlbiAxIHdpbGwgbm90IGFwcGVuZCBDUkMgdG8gdHggZnJhbWVzCisjZGVmaW5lIFRDUl9NT05fQ1NOCTB4MDQwMAkvLyBXaGVuIDEgdHggbW9uaXRvcnMgY2FycmllcgorI2RlZmluZSBUQ1JfRkRVUExYICAgIAkweDA4MDAgIC8vIFdoZW4gMSBlbmFibGVzIGZ1bGwgZHVwbGV4IG9wZXJhdGlvbgorI2RlZmluZSBUQ1JfU1RQX1NRRVQJMHgxMDAwCS8vIFdoZW4gMSBzdG9wcyB0eCBpZiBTaWduYWwgUXVhbGl0eSBFcnJvcgorI2RlZmluZSBUQ1JfRVBIX0xPT1AJMHgyMDAwCS8vIFdoZW4gMSBlbmFibGVzIEVQSCBibG9jayBsb29wYmFjaworI2RlZmluZSBUQ1JfU1dGRFVQCTB4ODAwMAkvLyBXaGVuIDEgZW5hYmxlcyBTd2l0Y2hlZCBGdWxsIER1cGxleCBtb2RlCisKKyNkZWZpbmUgVENSX0NMRUFSCTAJLyogZG8gTk9USElORyAqLworLyogdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBUQ1IgcmVnaXN0ZXIgOiAqLworI2RlZmluZSBUQ1JfREVGQVVMVAkoVENSX0VOQUJMRSB8IFRDUl9QQURfRU4pCisKKworLy8gRVBIIFN0YXR1cyBSZWdpc3RlcgorLyogQkFOSyAwICAqLworI2RlZmluZSBFUEhfU1RBVFVTX1JFRwlTTUNfUkVHKDB4MDAwMiwgMCkKKyNkZWZpbmUgRVNfVFhfU1VDCTB4MDAwMQkvLyBMYXN0IFRYIHdhcyBzdWNjZXNzZnVsCisjZGVmaW5lIEVTX1NOR0xfQ09MCTB4MDAwMgkvLyBTaW5nbGUgY29sbGlzaW9uIGRldGVjdGVkIGZvciBsYXN0IHR4CisjZGVmaW5lIEVTX01VTF9DT0wJMHgwMDA0CS8vIE11bHRpcGxlIGNvbGxpc2lvbnMgZGV0ZWN0ZWQgZm9yIGxhc3QgdHgKKyNkZWZpbmUgRVNfTFRYX01VTFQJMHgwMDA4CS8vIExhc3QgdHggd2FzIGEgbXVsdGljYXN0CisjZGVmaW5lIEVTXzE2Q09MCTB4MDAxMAkvLyAxNiBDb2xsaXNpb25zIFJlYWNoZWQKKyNkZWZpbmUgRVNfU1FFVAkJMHgwMDIwCS8vIFNpZ25hbCBRdWFsaXR5IEVycm9yIFRlc3QKKyNkZWZpbmUgRVNfTFRYQlJECTB4MDA0MAkvLyBMYXN0IHR4IHdhcyBhIGJyb2FkY2FzdAorI2RlZmluZSBFU19UWERFRlIJMHgwMDgwCS8vIFRyYW5zbWl0IERlZmVycmVkCisjZGVmaW5lIEVTX0xBVENPTAkweDAyMDAJLy8gTGF0ZSBjb2xsaXNpb24gZGV0ZWN0ZWQgb24gbGFzdCB0eAorI2RlZmluZSBFU19MT1NUQ0FSUgkweDA0MDAJLy8gTG9zdCBDYXJyaWVyIFNlbnNlCisjZGVmaW5lIEVTX0VYQ19ERUYJMHgwODAwCS8vIEV4Y2Vzc2l2ZSBEZWZlcnJhbAorI2RlZmluZSBFU19DVFJfUk9MCTB4MTAwMAkvLyBDb3VudGVyIFJvbGwgT3ZlciBpbmRpY2F0aW9uCisjZGVmaW5lIEVTX0xJTktfT0sJMHg0MDAwCS8vIERyaXZlbiBieSBpbnZlcnRlZCB2YWx1ZSBvZiBuTE5LIHBpbgorI2RlZmluZSBFU19UWFVOUk4JMHg4MDAwCS8vIFR4IFVuZGVycnVuCisKKworLy8gUmVjZWl2ZSBDb250cm9sIFJlZ2lzdGVyCisvKiBCQU5LIDAgICovCisjZGVmaW5lIFJDUl9SRUcJCVNNQ19SRUcoMHgwMDA0LCAwKQorI2RlZmluZSBSQ1JfUlhfQUJPUlQJMHgwMDAxCS8vIFNldCBpZiBhIHJ4IGZyYW1lIHdhcyBhYm9ydGVkCisjZGVmaW5lIFJDUl9QUk1TCTB4MDAwMgkvLyBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZQorI2RlZmluZSBSQ1JfQUxNVUwJMHgwMDA0CS8vIFdoZW4gc2V0IGFjY2VwdHMgYWxsIG11bHRpY2FzdCBmcmFtZXMKKyNkZWZpbmUgUkNSX1JYRU4JMHgwMTAwCS8vIElGRiB0aGlzIGlzIHNldCwgd2UgY2FuIHJlY2VpdmUgcGFja2V0cworI2RlZmluZSBSQ1JfU1RSSVBfQ1JDCTB4MDIwMAkvLyBXaGVuIHNldCBzdHJpcHMgQ1JDIGZyb20gcnggcGFja2V0cworI2RlZmluZSBSQ1JfQUJPUlRfRU5CCTB4MDIwMAkvLyBXaGVuIHNldCB3aWxsIGFib3J0IHJ4IG9uIGNvbGxpc2lvbgorI2RlZmluZSBSQ1JfRklMVF9DQVIJMHgwNDAwCS8vIFdoZW4gc2V0IGZpbHRlcnMgbGVhZGluZyAxMiBiaXQgcyBvZiBjYXJyaWVyCisjZGVmaW5lIFJDUl9TT0ZUUlNUCTB4ODAwMCAJLy8gcmVzZXRzIHRoZSBjaGlwCisKKy8qIHRoZSBub3JtYWwgc2V0dGluZ3MgZm9yIHRoZSBSQ1IgcmVnaXN0ZXIgOiAqLworI2RlZmluZSBSQ1JfREVGQVVMVAkoUkNSX1NUUklQX0NSQyB8IFJDUl9SWEVOKQorI2RlZmluZSBSQ1JfQ0xFQVIJMHgwCS8vIHNldCBpdCB0byBhIGJhc2Ugc3RhdGUKKworCisvLyBDb3VudGVyIFJlZ2lzdGVyCisvKiBCQU5LIDAgICovCisjZGVmaW5lIENPVU5URVJfUkVHCVNNQ19SRUcoMHgwMDA2LCAwKQorCisKKy8vIE1lbW9yeSBJbmZvcm1hdGlvbiBSZWdpc3RlcgorLyogQkFOSyAwICAqLworI2RlZmluZSBNSVJfUkVHCQlTTUNfUkVHKDB4MDAwOCwgMCkKKworCisvLyBSZWNlaXZlL1BoeSBDb250cm9sIFJlZ2lzdGVyCisvKiBCQU5LIDAgICovCisjZGVmaW5lIFJQQ19SRUcJCVNNQ19SRUcoMHgwMDBBLCAwKQorI2RlZmluZSBSUENfU1BFRUQJMHgyMDAwCS8vIFdoZW4gMSBQSFkgaXMgaW4gMTAwTWJwcyBtb2RlLgorI2RlZmluZSBSUENfRFBMWAkweDEwMDAJLy8gV2hlbiAxIFBIWSBpcyBpbiBGdWxsLUR1cGxleCBNb2RlCisjZGVmaW5lIFJQQ19BTkVHCTB4MDgwMAkvLyBXaGVuIDEgUEhZIGlzIGluIEF1dG8tTmVnb3RpYXRlIE1vZGUKKyNkZWZpbmUgUlBDX0xTWEFfU0hGVAk1CS8vIEJpdHMgdG8gc2hpZnQgTFMyQSxMUzFBLExTMEEgdG8gbHNiCisjZGVmaW5lIFJQQ19MU1hCX1NIRlQJMgkvLyBCaXRzIHRvIGdldCBMUzJCLExTMUIsTFMwQiB0byBsc2IKKyNkZWZpbmUgUlBDX0xFRF8xMDBfMTAJKDB4MDApCS8vIExFRCA9IDEwME1icHMgT1IncyB3aXRoIDEwTWJwcyBsaW5rIGRldGVjdAorI2RlZmluZSBSUENfTEVEX1JFUwkoMHgwMSkJLy8gTEVEID0gUmVzZXJ2ZWQKKyNkZWZpbmUgUlBDX0xFRF8xMAkoMHgwMikJLy8gTEVEID0gMTBNYnBzIGxpbmsgZGV0ZWN0CisjZGVmaW5lIFJQQ19MRURfRkQJKDB4MDMpCS8vIExFRCA9IEZ1bGwgRHVwbGV4IE1vZGUKKyNkZWZpbmUgUlBDX0xFRF9UWF9SWAkoMHgwNCkJLy8gTEVEID0gVFggb3IgUlggcGFja2V0IG9jY3VycmVkCisjZGVmaW5lIFJQQ19MRURfMTAwCSgweDA1KQkvLyBMRUQgPSAxMDBNYnBzIGxpbmsgZGVjdGVjdAorI2RlZmluZSBSUENfTEVEX1RYCSgweDA2KQkvLyBMRUQgPSBUWCBwYWNrZXQgb2NjdXJyZWQKKyNkZWZpbmUgUlBDX0xFRF9SWAkoMHgwNykJLy8gTEVEID0gUlggcGFja2V0IG9jY3VycmVkCisKKyNpZm5kZWYgUlBDX0xTQV9ERUZBVUxUCisjZGVmaW5lIFJQQ19MU0FfREVGQVVMVAlSUENfTEVEXzEwMAorI2VuZGlmCisjaWZuZGVmIFJQQ19MU0JfREVGQVVMVAorI2RlZmluZSBSUENfTFNCX0RFRkFVTFQgUlBDX0xFRF9GRAorI2VuZGlmCisKKyNkZWZpbmUgUlBDX0RFRkFVTFQgKFJQQ19BTkVHIHwgKFJQQ19MU0FfREVGQVVMVCA8PCBSUENfTFNYQV9TSEZUKSB8IChSUENfTFNCX0RFRkFVTFQgPDwgUlBDX0xTWEJfU0hGVCkgfCBSUENfU1BFRUQgfCBSUENfRFBMWCkKKworCisvKiBCYW5rIDAgMHgwQyBpcyByZXNlcnZlZCAqLworCisvLyBCYW5rIFNlbGVjdCBSZWdpc3RlcgorLyogQWxsIEJhbmtzICovCisjZGVmaW5lIEJTUl9SRUcJCTB4MDAwRQorCisKKy8vIENvbmZpZ3VyYXRpb24gUmVnCisvKiBCQU5LIDEgKi8KKyNkZWZpbmUgQ09ORklHX1JFRwlTTUNfUkVHKDB4MDAwMCwJMSkKKyNkZWZpbmUgQ09ORklHX0VYVF9QSFkJMHgwMjAwCS8vIDE9ZXh0ZXJuYWwgTUlJLCAwPWludGVybmFsIFBoeQorI2RlZmluZSBDT05GSUdfR1BDTlRSTAkweDA0MDAJLy8gSW52ZXJzZSB2YWx1ZSBkcml2ZXMgcGluIG5DTlRSTAorI2RlZmluZSBDT05GSUdfTk9fV0FJVAkweDEwMDAJLy8gV2hlbiAxIG5vIGV4dHJhIHdhaXQgc3RhdGVzIG9uIElTQSBidXMKKyNkZWZpbmUgQ09ORklHX0VQSF9QT1dFUl9FTiAweDgwMDAgLy8gV2hlbiAwIEVQSCBpcyBwbGFjZWQgaW50byBsb3cgcG93ZXIgbW9kZS4KKworLy8gRGVmYXVsdCBpcyBwb3dlcmVkLXVwLCBJbnRlcm5hbCBQaHksIFdhaXQgU3RhdGVzLCBhbmQgcGluIG5DTlRSTD1sb3cKKyNkZWZpbmUgQ09ORklHX0RFRkFVTFQJKENPTkZJR19FUEhfUE9XRVJfRU4pCisKKworLy8gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyCisvKiBCQU5LIDEgKi8KKyNkZWZpbmUgQkFTRV9SRUcJU01DX1JFRygweDAwMDIsIDEpCisKKworLy8gSW5kaXZpZHVhbCBBZGRyZXNzIFJlZ2lzdGVycworLyogQkFOSyAxICovCisjZGVmaW5lIEFERFIwX1JFRwlTTUNfUkVHKDB4MDAwNCwgMSkKKyNkZWZpbmUgQUREUjFfUkVHCVNNQ19SRUcoMHgwMDA2LCAxKQorI2RlZmluZSBBRERSMl9SRUcJU01DX1JFRygweDAwMDgsIDEpCisKKworLy8gR2VuZXJhbCBQdXJwb3NlIFJlZ2lzdGVyCisvKiBCQU5LIDEgKi8KKyNkZWZpbmUgR1BfUkVHCQlTTUNfUkVHKDB4MDAwQSwgMSkKKworCisvLyBDb250cm9sIFJlZ2lzdGVyCisvKiBCQU5LIDEgKi8KKyNkZWZpbmUgQ1RMX1JFRwkJU01DX1JFRygweDAwMEMsIDEpCisjZGVmaW5lIENUTF9SQ1ZfQkFECTB4NDAwMCAvLyBXaGVuIDEgYmFkIENSQyBwYWNrZXRzIGFyZSByZWNlaXZlZAorI2RlZmluZSBDVExfQVVUT19SRUxFQVNFIDB4MDgwMCAvLyBXaGVuIDEgdHggcGFnZXMgYXJlIHJlbGVhc2VkIGF1dG9tYXRpY2FsbHkKKyNkZWZpbmUgQ1RMX0xFX0VOQUJMRQkweDAwODAgLy8gV2hlbiAxIGVuYWJsZXMgTGluayBFcnJvciBpbnRlcnJ1cHQKKyNkZWZpbmUgQ1RMX0NSX0VOQUJMRQkweDAwNDAgLy8gV2hlbiAxIGVuYWJsZXMgQ291bnRlciBSb2xsb3ZlciBpbnRlcnJ1cHQKKyNkZWZpbmUgQ1RMX1RFX0VOQUJMRQkweDAwMjAgLy8gV2hlbiAxIGVuYWJsZXMgVHJhbnNtaXQgRXJyb3IgaW50ZXJydXB0CisjZGVmaW5lIENUTF9FRVBST01fU0VMRUNUIDB4MDAwNCAvLyBDb250cm9scyBFRVBST00gcmVsb2FkICYgc3RvcmUKKyNkZWZpbmUgQ1RMX1JFTE9BRAkweDAwMDIgLy8gV2hlbiBzZXQgcmVhZHMgRUVQUk9NIGludG8gcmVnaXN0ZXJzCisjZGVmaW5lIENUTF9TVE9SRQkweDAwMDEgLy8gV2hlbiBzZXQgc3RvcmVzIHJlZ2lzdGVycyBpbnRvIEVFUFJPTQorCisKKy8vIE1NVSBDb21tYW5kIFJlZ2lzdGVyCisvKiBCQU5LIDIgKi8KKyNkZWZpbmUgTU1VX0NNRF9SRUcJU01DX1JFRygweDAwMDAsIDIpCisjZGVmaW5lIE1DX0JVU1kJCTEJLy8gV2hlbiAxIHRoZSBsYXN0IHJlbGVhc2UgaGFzIG5vdCBjb21wbGV0ZWQKKyNkZWZpbmUgTUNfTk9QCQkoMDw8NSkJLy8gTm8gT3AKKyNkZWZpbmUgTUNfQUxMT0MJKDE8PDUpIAkvLyBPUiB3aXRoIG51bWJlciBvZiAyNTYgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIE1DX1JFU0VUCSgyPDw1KQkvLyBSZXNldCBNTVUgdG8gaW5pdGlhbCBzdGF0ZQorI2RlZmluZSBNQ19SRU1PVkUJKDM8PDUpIAkvLyBSZW1vdmUgdGhlIGN1cnJlbnQgcnggcGFja2V0CisjZGVmaW5lIE1DX1JFTEVBU0UgIAkoNDw8NSkgCS8vIFJlbW92ZSBhbmQgcmVsZWFzZSB0aGUgY3VycmVudCByeCBwYWNrZXQKKyNkZWZpbmUgTUNfRlJFRVBLVCAgCSg1PDw1KSAJLy8gUmVsZWFzZSBwYWNrZXQgaW4gUE5SIHJlZ2lzdGVyCisjZGVmaW5lIE1DX0VOUVVFVUUJKDY8PDUpCS8vIEVucXVldWUgdGhlIHBhY2tldCBmb3IgdHJhbnNtaXQKKyNkZWZpbmUgTUNfUlNUVFhGSUZPCSg3PDw1KQkvLyBSZXNldCB0aGUgVFggRklGT3MKKworCisvLyBQYWNrZXQgTnVtYmVyIFJlZ2lzdGVyCisvKiBCQU5LIDIgKi8KKyNkZWZpbmUgUE5fUkVHCQlTTUNfUkVHKDB4MDAwMiwgMikKKworCisvLyBBbGxvY2F0aW9uIFJlc3VsdCBSZWdpc3RlcgorLyogQkFOSyAyICovCisjZGVmaW5lIEFSX1JFRwkJU01DX1JFRygweDAwMDMsIDIpCisjZGVmaW5lIEFSX0ZBSUxFRAkweDgwCS8vIEFsb2NhdGlvbiBGYWlsZWQKKworCisvLyBUWCBGSUZPIFBvcnRzIFJlZ2lzdGVyCisvKiBCQU5LIDIgKi8KKyNkZWZpbmUgVFhGSUZPX1JFRwlTTUNfUkVHKDB4MDAwNCwgMikKKyNkZWZpbmUgVFhGSUZPX1RFTVBUWQkweDgwCS8vIFRYIEZJRk8gRW1wdHkKKworLy8gUlggRklGTyBQb3J0cyBSZWdpc3RlcgorLyogQkFOSyAyICovCisjZGVmaW5lIFJYRklGT19SRUcJU01DX1JFRygweDAwMDUsIDIpCisjZGVmaW5lIFJYRklGT19SRU1QVFkJMHg4MAkvLyBSWCBGSUZPIEVtcHR5CisKKyNkZWZpbmUgRklGT19SRUcJU01DX1JFRygweDAwMDQsIDIpCisKKy8vIFBvaW50ZXIgUmVnaXN0ZXIKKy8qIEJBTksgMiAqLworI2RlZmluZSBQVFJfUkVHCQlTTUNfUkVHKDB4MDAwNiwgMikKKyNkZWZpbmUgUFRSX1JDVgkJMHg4MDAwIC8vIDE9UmVjZWl2ZSBhcmVhLCAwPVRyYW5zbWl0IGFyZWEKKyNkZWZpbmUgUFRSX0FVVE9JTkMgCTB4NDAwMCAvLyBBdXRvIGluY3JlbWVudCB0aGUgcG9pbnRlciBvbiBlYWNoIGFjY2VzcworI2RlZmluZSBQVFJfUkVBRAkweDIwMDAgLy8gV2hlbiAxIHRoZSBvcGVyYXRpb24gaXMgYSByZWFkCisKKworLy8gRGF0YSBSZWdpc3RlcgorLyogQkFOSyAyICovCisjZGVmaW5lIERBVEFfUkVHCVNNQ19SRUcoMHgwMDA4LCAyKQorCisKKy8vIEludGVycnVwdCBTdGF0dXMvQWNrbm93bGVkZ2UgUmVnaXN0ZXIKKy8qIEJBTksgMiAqLworI2RlZmluZSBJTlRfUkVHCQlTTUNfUkVHKDB4MDAwQywgMikKKworCisvLyBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgorLyogQkFOSyAyICovCisjZGVmaW5lIElNX1JFRwkJU01DX1JFRygweDAwMEQsIDIpCisjZGVmaW5lIElNX01ESU5UCTB4ODAgLy8gUEhZIE1JIFJlZ2lzdGVyIDE4IEludGVycnVwdAorI2RlZmluZSBJTV9FUkNWX0lOVAkweDQwIC8vIEVhcmx5IFJlY2VpdmUgSW50ZXJydXB0CisjZGVmaW5lIElNX0VQSF9JTlQJMHgyMCAvLyBTZXQgYnkgRXRoZXJuZXQgUHJvdG9jb2wgSGFuZGxlciBzZWN0aW9uCisjZGVmaW5lIElNX1JYX09WUk5fSU5UCTB4MTAgLy8gU2V0IGJ5IFJlY2VpdmVyIE92ZXJydW5zCisjZGVmaW5lIElNX0FMTE9DX0lOVAkweDA4IC8vIFNldCB3aGVuIGFsbG9jYXRpb24gcmVxdWVzdCBpcyBjb21wbGV0ZWQKKyNkZWZpbmUgSU1fVFhfRU1QVFlfSU5UCTB4MDQgLy8gU2V0IGlmIHRoZSBUWCBGSUZPIGdvZXMgZW1wdHkKKyNkZWZpbmUgSU1fVFhfSU5UCTB4MDIgLy8gVHJhbnNtaXQgSW50ZXJydXB0CisjZGVmaW5lIElNX1JDVl9JTlQJMHgwMSAvLyBSZWNlaXZlIEludGVycnVwdAorCisKKy8vIE11bHRpY2FzdCBUYWJsZSBSZWdpc3RlcnMKKy8qIEJBTksgMyAqLworI2RlZmluZSBNQ0FTVF9SRUcxCVNNQ19SRUcoMHgwMDAwLCAzKQorI2RlZmluZSBNQ0FTVF9SRUcyCVNNQ19SRUcoMHgwMDAyLCAzKQorI2RlZmluZSBNQ0FTVF9SRUczCVNNQ19SRUcoMHgwMDA0LCAzKQorI2RlZmluZSBNQ0FTVF9SRUc0CVNNQ19SRUcoMHgwMDA2LCAzKQorCisKKy8vIE1hbmFnZW1lbnQgSW50ZXJmYWNlIFJlZ2lzdGVyIChNSUkpCisvKiBCQU5LIDMgKi8KKyNkZWZpbmUgTUlJX1JFRwkJU01DX1JFRygweDAwMDgsIDMpCisjZGVmaW5lIE1JSV9NU0tfQ1JTMTAwCTB4NDAwMCAvLyBEaXNhYmxlcyBDUlMxMDAgZGV0ZWN0aW9uIGR1cmluZyB0eCBoYWxmIGR1cAorI2RlZmluZSBNSUlfTURPRQkweDAwMDggLy8gTUlJIE91dHB1dCBFbmFibGUKKyNkZWZpbmUgTUlJX01DTEsJMHgwMDA0IC8vIE1JSSBDbG9jaywgcGluIE1EQ0xLCisjZGVmaW5lIE1JSV9NREkJCTB4MDAwMiAvLyBNSUkgSW5wdXQsIHBpbiBNREkKKyNkZWZpbmUgTUlJX01ETwkJMHgwMDAxIC8vIE1JSSBPdXRwdXQsIHBpbiBNRE8KKworCisvLyBSZXZpc2lvbiBSZWdpc3RlcgorLyogQkFOSyAzICovCisvKiAoIGhpOiBjaGlwIGlkICAgbG93OiByZXYgIyApICovCisjZGVmaW5lIFJFVl9SRUcJCVNNQ19SRUcoMHgwMDBBLCAzKQorCisKKy8vIEVhcmx5IFJDViBSZWdpc3RlcgorLyogQkFOSyAzICovCisvKiB0aGlzIGlzIE5PVCBvbiBTTUM5MTkyICovCisjZGVmaW5lIEVSQ1ZfUkVHCVNNQ19SRUcoMHgwMDBDLCAzKQorI2RlZmluZSBFUkNWX1JDVl9ESVNDUkQJMHgwMDgwIC8vIFdoZW4gMSBkaXNjYXJkcyBhIHBhY2tldCBiZWluZyByZWNlaXZlZAorI2RlZmluZSBFUkNWX1RIUkVTSE9MRAkweDAwMUYgLy8gRVJDViBUaHJlc2hvbGQgTWFzaworCisKKy8vIEV4dGVybmFsIFJlZ2lzdGVyCisvKiBCQU5LIDcgKi8KKyNkZWZpbmUgRVhUX1JFRwkJU01DX1JFRygweDAwMDAsIDcpCisKKworI2RlZmluZSBDSElQXzkxOTIJMworI2RlZmluZSBDSElQXzkxOTQJNAorI2RlZmluZSBDSElQXzkxOTUJNQorI2RlZmluZSBDSElQXzkxOTYJNgorI2RlZmluZSBDSElQXzkxMTAwCTcKKyNkZWZpbmUgQ0hJUF85MTEwMEZECTgKKyNkZWZpbmUgQ0hJUF85MTExMUZECTkKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjaGlwX2lkc1sgMTYgXSA9ICB7CisJTlVMTCwgTlVMTCwgTlVMTCwKKwkvKiAzICovICJTTUM5MUM5MC85MUM5MiIsCisJLyogNCAqLyAiU01DOTFDOTQiLAorCS8qIDUgKi8gIlNNQzkxQzk1IiwKKwkvKiA2ICovICJTTUM5MUM5NiIsCisJLyogNyAqLyAiU01DOTFDMTAwIiwKKwkvKiA4ICovICJTTUM5MUMxMDBGRCIsCisJLyogOSAqLyAiU01DOTFDMTF4RkQiLAorCU5VTEwsIE5VTEwsIE5VTEwsCisJTlVMTCwgTlVMTCwgTlVMTH07CisKKworLyoKKyAuIFRyYW5zbWl0IHN0YXR1cyBiaXRzCisqLworI2RlZmluZSBUU19TVUNDRVNTIDB4MDAwMQorI2RlZmluZSBUU19MT1NUQ0FSIDB4MDQwMAorI2RlZmluZSBUU19MQVRDT0wgIDB4MDIwMAorI2RlZmluZSBUU18xNkNPTCAgIDB4MDAxMAorCisvKgorIC4gUmVjZWl2ZSBzdGF0dXMgYml0cworKi8KKyNkZWZpbmUgUlNfQUxHTkVSUgkweDgwMDAKKyNkZWZpbmUgUlNfQlJPRENBU1QJMHg0MDAwCisjZGVmaW5lIFJTX0JBRENSQwkweDIwMDAKKyNkZWZpbmUgUlNfT0RERlJBTUUJMHgxMDAwCisjZGVmaW5lIFJTX1RPT0xPTkcJMHgwODAwCisjZGVmaW5lIFJTX1RPT1NIT1JUCTB4MDQwMAorI2RlZmluZSBSU19NVUxUSUNBU1QJMHgwMDAxCisjZGVmaW5lIFJTX0VSUk9SUwkoUlNfQUxHTkVSUiB8IFJTX0JBRENSQyB8IFJTX1RPT0xPTkcgfCBSU19UT09TSE9SVCkKKworCisvKgorICogUEhZIElEcworICogIExBTjgzQzE4MyA9PSBMQU45MUMxMTEgSW50ZXJuYWwgUEhZCisgKi8KKyNkZWZpbmUgUEhZX0xBTjgzQzE4MwkweDAwMTZmODQwCisjZGVmaW5lIFBIWV9MQU44M0MxODAJMHgwMjgyMWM1MAorCisvKgorICogUEhZIFJlZ2lzdGVyIEFkZHJlc3NlcyAoTEFOOTFDMTExIEludGVybmFsIFBIWSkKKyAqCisgKiBHZW5lcmljIFBIWSByZWdpc3RlcnMgY2FuIGJlIGZvdW5kIGluIDxsaW51eC9taWkuaD4KKyAqCisgKiBUaGVzZSBwaHkgcmVnaXN0ZXJzIGFyZSBzcGVjaWZpYyB0byBvdXIgb24tYm9hcmQgcGh5LgorICovCisKKy8vIFBIWSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEKKyNkZWZpbmUgUEhZX0NGRzFfUkVHCQkweDEwCisjZGVmaW5lIFBIWV9DRkcxX0xOS0RJUwkJMHg4MDAwCS8vIDE9UnggTGluayBEZXRlY3QgRnVuY3Rpb24gZGlzYWJsZWQKKyNkZWZpbmUgUEhZX0NGRzFfWE1URElTCQkweDQwMDAJLy8gMT1UUCBUcmFuc21pdHRlciBEaXNhYmxlZAorI2RlZmluZSBQSFlfQ0ZHMV9YTVRQRE4JCTB4MjAwMAkvLyAxPVRQIFRyYW5zbWl0dGVyIFBvd2VyZWQgRG93bgorI2RlZmluZSBQSFlfQ0ZHMV9CWVBTQ1IJCTB4MDQwMAkvLyAxPUJ5cGFzcyBzY3JhbWJsZXIvZGVzY3JhbWJsZXIKKyNkZWZpbmUgUEhZX0NGRzFfVU5TQ0RTCQkweDAyMDAJLy8gMT1VbnNjcmFtYmxlIElkbGUgUmVjZXB0aW9uIERpc2FibGUKKyNkZWZpbmUgUEhZX0NGRzFfRVFMWlIJCTB4MDEwMAkvLyAxPVJ4IEVxdWFsaXplciBEaXNhYmxlZAorI2RlZmluZSBQSFlfQ0ZHMV9DQUJMRQkJMHgwMDgwCS8vIDE9U1RQKDE1MG9obSksIDA9VVRQKDEwMG9obSkKKyNkZWZpbmUgUEhZX0NGRzFfUkxWTDAJCTB4MDA0MAkvLyAxPVJ4IFNxdWVsY2ggbGV2ZWwgcmVkdWNlZCBieSA0LjVkYgorI2RlZmluZSBQSFlfQ0ZHMV9UTFZMX1NISUZUCTIJLy8gVHJhbnNtaXQgT3V0cHV0IExldmVsIEFkanVzdAorI2RlZmluZSBQSFlfQ0ZHMV9UTFZMX01BU0sJMHgwMDNDCisjZGVmaW5lIFBIWV9DRkcxX1RSRl9NQVNLCTB4MDAwMwkvLyBUcmFuc21pdHRlciBSaXNlL0ZhbGwgdGltZQorCisKKy8vIFBIWSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIKKyNkZWZpbmUgUEhZX0NGRzJfUkVHCQkweDExCisjZGVmaW5lIFBIWV9DRkcyX0FQT0xESVMJMHgwMDIwCS8vIDE9QXV0byBQb2xhcml0eSBDb3JyZWN0aW9uIGRpc2FibGVkCisjZGVmaW5lIFBIWV9DRkcyX0pBQkRJUwkJMHgwMDEwCS8vIDE9SmFiYmVyIGRpc2FibGVkCisjZGVmaW5lIFBIWV9DRkcyX01SRUcJCTB4MDAwOAkvLyAxPU11bHRpcGxlIHJlZ2lzdGVyIGFjY2VzcyAoTUlJIG1ndCkKKyNkZWZpbmUgUEhZX0NGRzJfSU5UTURJTwkweDAwMDQJLy8gMT1JbnRlcnJ1cHQgc2lnbmFsZWQgd2l0aCBNRElPIHB1bHNlbworCisvLyBQSFkgU3RhdHVzIE91dHB1dCAoYW5kIEludGVycnVwdCBzdGF0dXMpIFJlZ2lzdGVyCisjZGVmaW5lIFBIWV9JTlRfUkVHCQkweDEyCS8vIFN0YXR1cyBPdXRwdXQgKEludGVycnVwdCBTdGF0dXMpCisjZGVmaW5lIFBIWV9JTlRfSU5UCQkweDgwMDAJLy8gMT1iaXRzIGhhdmUgY2hhbmdlZCBzaW5jZSBsYXN0IHJlYWQKKyNkZWZpbmUgUEhZX0lOVF9MTktGQUlMCQkweDQwMDAJLy8gMT1MaW5rIE5vdCBkZXRlY3RlZAorI2RlZmluZSBQSFlfSU5UX0xPU1NTWU5DCTB4MjAwMAkvLyAxPURlc2NyYW1ibGVyIGhhcyBsb3N0IHN5bmMKKyNkZWZpbmUgUEhZX0lOVF9DV1JECQkweDEwMDAJLy8gMT1JbnZhbGlkIDRCNUIgY29kZSBkZXRlY3RlZCBvbiByeAorI2RlZmluZSBQSFlfSU5UX1NTRAkJMHgwODAwCS8vIDE9Tm8gU3RhcnQgT2YgU3RyZWFtIGRldGVjdGVkIG9uIHJ4CisjZGVmaW5lIFBIWV9JTlRfRVNECQkweDA0MDAJLy8gMT1ObyBFbmQgT2YgU3RyZWFtIGRldGVjdGVkIG9uIHJ4CisjZGVmaW5lIFBIWV9JTlRfUlBPTAkJMHgwMjAwCS8vIDE9UmV2ZXJzZSBQb2xhcml0eSBkZXRlY3RlZAorI2RlZmluZSBQSFlfSU5UX0pBQgkJMHgwMTAwCS8vIDE9SmFiYmVyIGRldGVjdGVkCisjZGVmaW5lIFBIWV9JTlRfU1BEREVUCQkweDAwODAJLy8gMT0xMDBCYXNlLVRYIG1vZGUsIDA9MTBCYXNlLVQgbW9kZQorI2RlZmluZSBQSFlfSU5UX0RQTFhERVQJCTB4MDA0MAkvLyAxPURldmljZSBpbiBGdWxsIER1cGxleAorCisvLyBQSFkgSW50ZXJydXB0L1N0YXR1cyBNYXNrIFJlZ2lzdGVyCisjZGVmaW5lIFBIWV9NQVNLX1JFRwkJMHgxMwkvLyBJbnRlcnJ1cHQgTWFzaworLy8gVXNlcyB0aGUgc2FtZSBiaXQgZGVmaW5pdGlvbnMgYXMgUEhZX0lOVF9SRUcKKworCisvKgorICogU01DOTFDOTYgZXRoZXJuZXQgY29uZmlnIGFuZCBzdGF0dXMgcmVnaXN0ZXJzLgorICogVGhlc2UgYXJlIGluIHRoZSAiYXR0cmlidXRlIiBzcGFjZS4KKyAqLworI2RlZmluZSBFQ09SCQkJMHg4MDAwCisjZGVmaW5lIEVDT1JfUkVTRVQJCTB4ODAKKyNkZWZpbmUgRUNPUl9MRVZFTF9JUlEJCTB4NDAKKyNkZWZpbmUgRUNPUl9XUl9BVFRSSUIJCTB4MDQKKyNkZWZpbmUgRUNPUl9FTkFCTEUJCTB4MDEKKworI2RlZmluZSBFQ1NSCQkJMHg4MDAyCisjZGVmaW5lIEVDU1JfSU9JUzgJCTB4MjAKKyNkZWZpbmUgRUNTUl9QV1JEV04JCTB4MDQKKyNkZWZpbmUgRUNTUl9JTlQJCTB4MDIKKworI2RlZmluZSBBVFRSSUJfU0laRQkJKCg2NCoxMDI0KSA8PCBTTUNfSU9fU0hJRlQpCisKKworLyoKKyAqIE1hY3JvcyB0byBhYnN0cmFjdCByZWdpc3RlciBhY2Nlc3MgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIGJ1cworICogY2FwYWJpbGl0aWVzLiAgUGxlYXNlIHVzZSB0aG9zZSBhbmQgbm90IHRoZSBpbi9vdXQgcHJpbWl0aXZlcy4KKyAqIE5vdGU6IHRoZSBmb2xsb3dpbmcgbWFjcm9zIGRvICpub3QqIHNlbGVjdCB0aGUgYmFuayAtLSB0aGlzIG11c3QKKyAqIGJlIGRvbmUgc2VwYXJhdGVseSBhcyBuZWVkZWQgaW4gdGhlIG1haW4gY29kZS4gIFRoZSBTTUNfUkVHKCkgbWFjcm8KKyAqIG9ubHkgdXNlcyB0aGUgYmFuayBhcmd1bWVudCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzICh3aGVuIGVuYWJsZWQpLgorICovCisKKyNpZiBTTUNfREVCVUcgPiAwCisjZGVmaW5lIFNNQ19SRUcocmVnLCBiYW5rKQkJCQkJCVwKKwkoewkJCQkJCQkJXAorCQlpbnQgX19iID0gU01DX0NVUlJFTlRfQkFOSygpOwkJCQlcCisJCWlmICh1bmxpa2VseSgoX19iICYgfjB4ZjApICE9ICgweDMzMDAgfCBiYW5rKSkpIHsJXAorCQkJcHJpbnRrKCAiJXM6IGJhbmsgcmVnIHNjcmV3ZWQgKDB4JTA0eClcbiIsCVwKKwkJCQlDQVJETkFNRSwgX19iICk7CQkJXAorCQkJQlVHKCk7CQkJCQkJXAorCQl9CQkJCQkJCVwKKwkJcmVnPDxTTUNfSU9fU0hJRlQ7CQkJCQlcCisJfSkKKyNlbHNlCisjZGVmaW5lIFNNQ19SRUcocmVnLCBiYW5rKQkocmVnPDxTTUNfSU9fU0hJRlQpCisjZW5kaWYKKworI2lmIFNNQ19DQU5fVVNFXzhCSVQKKyNkZWZpbmUgU01DX0dFVF9QTigpCQlTTUNfaW5iKCBpb2FkZHIsIFBOX1JFRyApCisjZGVmaW5lIFNNQ19TRVRfUE4oeCkJCVNNQ19vdXRiKCB4LCBpb2FkZHIsIFBOX1JFRyApCisjZGVmaW5lIFNNQ19HRVRfQVIoKQkJU01DX2luYiggaW9hZGRyLCBBUl9SRUcgKQorI2RlZmluZSBTTUNfR0VUX1RYRklGTygpCVNNQ19pbmIoIGlvYWRkciwgVFhGSUZPX1JFRyApCisjZGVmaW5lIFNNQ19HRVRfUlhGSUZPKCkJU01DX2luYiggaW9hZGRyLCBSWEZJRk9fUkVHICkKKyNkZWZpbmUgU01DX0dFVF9JTlQoKQkJU01DX2luYiggaW9hZGRyLCBJTlRfUkVHICkKKyNkZWZpbmUgU01DX0FDS19JTlQoeCkJCVNNQ19vdXRiKCB4LCBpb2FkZHIsIElOVF9SRUcgKQorI2RlZmluZSBTTUNfR0VUX0lOVF9NQVNLKCkJU01DX2luYiggaW9hZGRyLCBJTV9SRUcgKQorI2RlZmluZSBTTUNfU0VUX0lOVF9NQVNLKHgpCVNNQ19vdXRiKCB4LCBpb2FkZHIsIElNX1JFRyApCisjZWxzZQorI2RlZmluZSBTTUNfR0VUX1BOKCkJCShTTUNfaW53KCBpb2FkZHIsIFBOX1JFRyApICYgMHhGRikKKyNkZWZpbmUgU01DX1NFVF9QTih4KQkJU01DX291dHcoIHgsIGlvYWRkciwgUE5fUkVHICkKKyNkZWZpbmUgU01DX0dFVF9BUigpCQkoU01DX2ludyggaW9hZGRyLCBQTl9SRUcgKSA+PiA4KQorI2RlZmluZSBTTUNfR0VUX1RYRklGTygpCShTTUNfaW53KCBpb2FkZHIsIFRYRklGT19SRUcgKSAmIDB4RkYpCisjZGVmaW5lIFNNQ19HRVRfUlhGSUZPKCkJKFNNQ19pbncoIGlvYWRkciwgVFhGSUZPX1JFRyApID4+IDgpCisjZGVmaW5lIFNNQ19HRVRfSU5UKCkJCShTTUNfaW53KCBpb2FkZHIsIElOVF9SRUcgKSAmIDB4RkYpCisjZGVmaW5lIFNNQ19BQ0tfSU5UKHgpCQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXVuc2lnbmVkIGxvbmcgX19mbGFnczsJCQkJCVwKKwkJaW50IF9fbWFzazsJCQkJCQlcCisJCWxvY2FsX2lycV9zYXZlKF9fZmxhZ3MpOwkJCQlcCisJCV9fbWFzayA9IFNNQ19pbncoIGlvYWRkciwgSU5UX1JFRyApICYgfjB4ZmY7CQlcCisJCVNNQ19vdXR3KCBfX21hc2sgfCAoeCksIGlvYWRkciwgSU5UX1JFRyApOwkJXAorCQlsb2NhbF9pcnFfcmVzdG9yZShfX2ZsYWdzKTsJCQkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIFNNQ19HRVRfSU5UX01BU0soKQkoU01DX2ludyggaW9hZGRyLCBJTlRfUkVHICkgPj4gOCkKKyNkZWZpbmUgU01DX1NFVF9JTlRfTUFTSyh4KQlTTUNfb3V0dyggKHgpIDw8IDgsIGlvYWRkciwgSU5UX1JFRyApCisjZW5kaWYKKworI2RlZmluZSBTTUNfQ1VSUkVOVF9CQU5LKCkJU01DX2ludyggaW9hZGRyLCBCQU5LX1NFTEVDVCApCisjZGVmaW5lIFNNQ19TRUxFQ1RfQkFOSyh4KQlTTUNfb3V0dyggeCwgaW9hZGRyLCBCQU5LX1NFTEVDVCApCisjZGVmaW5lIFNNQ19HRVRfQkFTRSgpCQlTTUNfaW53KCBpb2FkZHIsIEJBU0VfUkVHICkKKyNkZWZpbmUgU01DX1NFVF9CQVNFKHgpCQlTTUNfb3V0dyggeCwgaW9hZGRyLCBCQVNFX1JFRyApCisjZGVmaW5lIFNNQ19HRVRfQ09ORklHKCkJU01DX2ludyggaW9hZGRyLCBDT05GSUdfUkVHICkKKyNkZWZpbmUgU01DX1NFVF9DT05GSUcoeCkJU01DX291dHcoIHgsIGlvYWRkciwgQ09ORklHX1JFRyApCisjZGVmaW5lIFNNQ19HRVRfQ09VTlRFUigpCVNNQ19pbncoIGlvYWRkciwgQ09VTlRFUl9SRUcgKQorI2RlZmluZSBTTUNfR0VUX0NUTCgpCQlTTUNfaW53KCBpb2FkZHIsIENUTF9SRUcgKQorI2RlZmluZSBTTUNfU0VUX0NUTCh4KQkJU01DX291dHcoIHgsIGlvYWRkciwgQ1RMX1JFRyApCisjZGVmaW5lIFNNQ19HRVRfTUlJKCkJCVNNQ19pbncoIGlvYWRkciwgTUlJX1JFRyApCisjZGVmaW5lIFNNQ19TRVRfTUlJKHgpCQlTTUNfb3V0dyggeCwgaW9hZGRyLCBNSUlfUkVHICkKKyNkZWZpbmUgU01DX0dFVF9NSVIoKQkJU01DX2ludyggaW9hZGRyLCBNSVJfUkVHICkKKyNkZWZpbmUgU01DX1NFVF9NSVIoeCkJCVNNQ19vdXR3KCB4LCBpb2FkZHIsIE1JUl9SRUcgKQorI2RlZmluZSBTTUNfR0VUX01NVV9DTUQoKQlTTUNfaW53KCBpb2FkZHIsIE1NVV9DTURfUkVHICkKKyNkZWZpbmUgU01DX1NFVF9NTVVfQ01EKHgpCVNNQ19vdXR3KCB4LCBpb2FkZHIsIE1NVV9DTURfUkVHICkKKyNkZWZpbmUgU01DX0dFVF9GSUZPKCkJCVNNQ19pbncoIGlvYWRkciwgRklGT19SRUcgKQorI2RlZmluZSBTTUNfR0VUX1BUUigpCQlTTUNfaW53KCBpb2FkZHIsIFBUUl9SRUcgKQorI2RlZmluZSBTTUNfU0VUX1BUUih4KQkJU01DX291dHcoIHgsIGlvYWRkciwgUFRSX1JFRyApCisjZGVmaW5lIFNNQ19HRVRfUkNSKCkJCVNNQ19pbncoIGlvYWRkciwgUkNSX1JFRyApCisjZGVmaW5lIFNNQ19TRVRfUkNSKHgpCQlTTUNfb3V0dyggeCwgaW9hZGRyLCBSQ1JfUkVHICkKKyNkZWZpbmUgU01DX0dFVF9SRVYoKQkJU01DX2ludyggaW9hZGRyLCBSRVZfUkVHICkKKyNkZWZpbmUgU01DX0dFVF9SUEMoKQkJU01DX2ludyggaW9hZGRyLCBSUENfUkVHICkKKyNkZWZpbmUgU01DX1NFVF9SUEMoeCkJCVNNQ19vdXR3KCB4LCBpb2FkZHIsIFJQQ19SRUcgKQorI2RlZmluZSBTTUNfR0VUX1RDUigpCQlTTUNfaW53KCBpb2FkZHIsIFRDUl9SRUcgKQorI2RlZmluZSBTTUNfU0VUX1RDUih4KQkJU01DX291dHcoIHgsIGlvYWRkciwgVENSX1JFRyApCisKKyNpZm5kZWYgU01DX0dFVF9NQUNfQUREUgorI2RlZmluZSBTTUNfR0VUX01BQ19BRERSKGFkZHIpCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJdW5zaWduZWQgaW50IF9fdjsJCQkJCVwKKwkJX192ID0gU01DX2ludyggaW9hZGRyLCBBRERSMF9SRUcgKTsJCQlcCisJCWFkZHJbMF0gPSBfX3Y7IGFkZHJbMV0gPSBfX3YgPj4gODsJCQlcCisJCV9fdiA9IFNNQ19pbncoIGlvYWRkciwgQUREUjFfUkVHICk7CQkJXAorCQlhZGRyWzJdID0gX192OyBhZGRyWzNdID0gX192ID4+IDg7CQkJXAorCQlfX3YgPSBTTUNfaW53KCBpb2FkZHIsIEFERFIyX1JFRyApOwkJCVwKKwkJYWRkcls0XSA9IF9fdjsgYWRkcls1XSA9IF9fdiA+PiA4OwkJCVwKKwl9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgU01DX1NFVF9NQUNfQUREUihhZGRyKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCVNNQ19vdXR3KCBhZGRyWzBdfChhZGRyWzFdIDw8IDgpLCBpb2FkZHIsIEFERFIwX1JFRyApOwlcCisJCVNNQ19vdXR3KCBhZGRyWzJdfChhZGRyWzNdIDw8IDgpLCBpb2FkZHIsIEFERFIxX1JFRyApOwlcCisJCVNNQ19vdXR3KCBhZGRyWzRdfChhZGRyWzVdIDw8IDgpLCBpb2FkZHIsIEFERFIyX1JFRyApOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBTTUNfU0VUX01DQVNUKHgpCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqbXQgPSAoeCk7CQkJCVwKKwkJU01DX291dHcoIG10WzBdIHwgKG10WzFdIDw8IDgpLCBpb2FkZHIsIE1DQVNUX1JFRzEgKTsJXAorCQlTTUNfb3V0dyggbXRbMl0gfCAobXRbM10gPDwgOCksIGlvYWRkciwgTUNBU1RfUkVHMiApOwlcCisJCVNNQ19vdXR3KCBtdFs0XSB8IChtdFs1XSA8PCA4KSwgaW9hZGRyLCBNQ0FTVF9SRUczICk7CVwKKwkJU01DX291dHcoIG10WzZdIHwgKG10WzddIDw8IDgpLCBpb2FkZHIsIE1DQVNUX1JFRzQgKTsJXAorCX0gd2hpbGUgKDApCisKKyNpZiBTTUNfQ0FOX1VTRV8zMkJJVAorLyoKKyAqIFNvbWUgc2V0dXBzIGp1c3QgY2FuJ3Qgd3JpdGUgOCBvciAxNiBiaXRzIHJlbGlhYmx5IHdoZW4gbm90IGFsaWduZWQKKyAqIHRvIGEgMzIgYml0IGJvdW5kYXJ5LiAgSSB0ZWxsIHlvdSB0aGF0IGV4aXN0cyEKKyAqIFdlIHJlLWRvIHRoZSBvbmVzIGhlcmUgdGhhdCBjYW4gYmUgZWFzaWx5IHdvcmtlZCBhcm91bmQgaWYgdGhleSBjYW4gaGF2ZQorICogdGhlaXIgbG93IHBhcnRzIHdyaXR0ZW4gdG8gMCB3aXRob3V0IGFkdmVyc2UgZWZmZWN0cy4KKyAqLworI3VuZGVmIFNNQ19TRUxFQ1RfQkFOSworI2RlZmluZSBTTUNfU0VMRUNUX0JBTksoeCkJU01DX291dGwoICh4KTw8MTYsIGlvYWRkciwgMTI8PFNNQ19JT19TSElGVCApCisjdW5kZWYgU01DX1NFVF9SUEMKKyNkZWZpbmUgU01DX1NFVF9SUEMoeCkJCVNNQ19vdXRsKCAoeCk8PDE2LCBpb2FkZHIsIFNNQ19SRUcoOCwgMCkgKQorI3VuZGVmIFNNQ19TRVRfUE4KKyNkZWZpbmUgU01DX1NFVF9QTih4KQkJU01DX291dGwoICh4KTw8MTYsIGlvYWRkciwgU01DX1JFRygwLCAyKSApCisjdW5kZWYgU01DX1NFVF9QVFIKKyNkZWZpbmUgU01DX1NFVF9QVFIoeCkJCVNNQ19vdXRsKCAoeCk8PDE2LCBpb2FkZHIsIFNNQ19SRUcoNCwgMikgKQorI2VuZGlmCisKKyNpZiBTTUNfQ0FOX1VTRV8zMkJJVAorI2RlZmluZSBTTUNfUFVUX1BLVF9IRFIoc3RhdHVzLCBsZW5ndGgpCQkJCQlcCisJU01DX291dGwoIChzdGF0dXMpIHwgKGxlbmd0aCkgPDwgMTYsIGlvYWRkciwgREFUQV9SRUcgKQorI2RlZmluZSBTTUNfR0VUX1BLVF9IRFIoc3RhdHVzLCBsZW5ndGgpCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQl1bnNpZ25lZCBpbnQgX192YWwgPSBTTUNfaW5sKCBpb2FkZHIsIERBVEFfUkVHICk7CVwKKwkJKHN0YXR1cykgPSBfX3ZhbCAmIDB4ZmZmZjsJCQkJXAorCQkobGVuZ3RoKSA9IF9fdmFsID4+IDE2OwkJCQkJXAorCX0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBTTUNfUFVUX1BLVF9IRFIoc3RhdHVzLCBsZW5ndGgpCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlTTUNfb3V0dyggc3RhdHVzLCBpb2FkZHIsIERBVEFfUkVHICk7CQkJXAorCQlTTUNfb3V0dyggbGVuZ3RoLCBpb2FkZHIsIERBVEFfUkVHICk7CQkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIFNNQ19HRVRfUEtUX0hEUihzdGF0dXMsIGxlbmd0aCkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCShzdGF0dXMpID0gU01DX2ludyggaW9hZGRyLCBEQVRBX1JFRyApOwkJCVwKKwkJKGxlbmd0aCkgPSBTTUNfaW53KCBpb2FkZHIsIERBVEFfUkVHICk7CQkJXAorCX0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmIFNNQ19DQU5fVVNFXzMyQklUCisjZGVmaW5lIF9TTUNfUFVTSF9EQVRBKHAsIGwpCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJY2hhciAqX19wdHIgPSAocCk7CQkJCQlcCisJCWludCBfX2xlbiA9IChsKTsJCQkJCVwKKwkJaWYgKF9fbGVuID49IDIgJiYgKHVuc2lnbmVkIGxvbmcpX19wdHIgJiAyKSB7CQlcCisJCQlfX2xlbiAtPSAyOwkJCQkJXAorCQkJU01DX291dHcoICoodTE2ICopX19wdHIsIGlvYWRkciwgREFUQV9SRUcgKTsJXAorCQkJX19wdHIgKz0gMjsJCQkJCVwKKwkJfQkJCQkJCQlcCisJCVNNQ19vdXRzbCggaW9hZGRyLCBEQVRBX1JFRywgX19wdHIsIF9fbGVuID4+IDIpOwlcCisJCWlmIChfX2xlbiAmIDIpIHsJCQkJCVwKKwkJCV9fcHRyICs9IChfX2xlbiAmIH4zKTsJCQkJXAorCQkJU01DX291dHcoICooKHUxNiAqKV9fcHRyKSwgaW9hZGRyLCBEQVRBX1JFRyApOwlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIF9TTUNfUFVMTF9EQVRBKHAsIGwpCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJY2hhciAqX19wdHIgPSAocCk7CQkJCQlcCisJCWludCBfX2xlbiA9IChsKTsJCQkJCVwKKwkJaWYgKCh1bnNpZ25lZCBsb25nKV9fcHRyICYgMikgewkJCQlcCisJCQkvKgkJCQkJCVwKKwkJCSAqIFdlIHdhbnQgMzJiaXQgYWxpZ25tZW50IGhlcmUuCQlcCisJCQkgKiBTaW5jZSBzb21lIGJ1c2VzIHBlcmZvcm0gYSBmdWxsIDMyYml0CVwKKwkJCSAqIGZldGNoIGV2ZW4gZm9yIDE2Yml0IGRhdGEgd2UgY2FuJ3QgdXNlCVwKKwkJCSAqIFNNQ19pbncoKSBoZXJlLiAgQmFjayBib3RoIHNvdXJjZSAob24gY2hpcAlcCisJCQkgKiBhbmQgZGVzdGluYXRpb24pIHBvaW50ZXJzIG9mIDIgYnl0ZXMuCVwKKwkJCSAqLwkJCQkJCVwKKwkJCV9fcHRyIC09IDI7CQkJCQlcCisJCQlfX2xlbiArPSAyOwkJCQkJXAorCQkJU01DX1NFVF9QVFIoIDJ8UFRSX1JFQUR8UFRSX1JDVnxQVFJfQVVUT0lOQyApOwlcCisJCX0JCQkJCQkJXAorCQlfX2xlbiArPSAyOwkJCQkJCVwKKwkJU01DX2luc2woIGlvYWRkciwgREFUQV9SRUcsIF9fcHRyLCBfX2xlbiA+PiAyKTsJCVwKKwl9IHdoaWxlICgwKQorI2VsaWYgU01DX0NBTl9VU0VfMTZCSVQKKyNkZWZpbmUgX1NNQ19QVVNIX0RBVEEocCwgbCkJU01DX291dHN3KCBpb2FkZHIsIERBVEFfUkVHLCBwLCAobCkgPj4gMSApCisjZGVmaW5lIF9TTUNfUFVMTF9EQVRBKHAsIGwpCVNNQ19pbnN3ICggaW9hZGRyLCBEQVRBX1JFRywgcCwgKGwpID4+IDEgKQorI2VsaWYgU01DX0NBTl9VU0VfOEJJVAorI2RlZmluZSBfU01DX1BVU0hfREFUQShwLCBsKQlTTUNfb3V0c2IoIGlvYWRkciwgREFUQV9SRUcsIHAsIGwgKQorI2RlZmluZSBfU01DX1BVTExfREFUQShwLCBsKQlTTUNfaW5zYiAoIGlvYWRkciwgREFUQV9SRUcsIHAsIGwgKQorI2VuZGlmCisKKyNpZiAhIFNNQ19DQU5fVVNFXzE2QklUCisjZGVmaW5lIFNNQ19vdXR3KHgsIGlvYWRkciwgcmVnKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJdW5zaWduZWQgaW50IF9fdmFsMTYgPSAoeCk7CQkJCVwKKwkJU01DX291dGIoIF9fdmFsMTYsIGlvYWRkciwgcmVnICk7CQkJXAorCQlTTUNfb3V0YiggX192YWwxNiA+PiA4LCBpb2FkZHIsIHJlZyArICgxIDw8IFNNQ19JT19TSElGVCkpO1wKKwl9IHdoaWxlICgwKQorI2RlZmluZSBTTUNfaW53KGlvYWRkciwgcmVnKQkJCQkJCVwKKwkoewkJCQkJCQkJXAorCQl1bnNpZ25lZCBpbnQgX192YWwxNjsJCQkJCVwKKwkJX192YWwxNiA9ICBTTUNfaW5iKCBpb2FkZHIsIHJlZyApOwkJCVwKKwkJX192YWwxNiB8PSBTTUNfaW5iKCBpb2FkZHIsIHJlZyArICgxIDw8IFNNQ19JT19TSElGVCkpIDw8IDg7IFwKKwkJX192YWwxNjsJCQkJCQlcCisJfSkKKyNlbmRpZgorCisjaWYgU01DX0NBTl9VU0VfREFUQUNTCisjZGVmaW5lIFNNQ19QVVNIX0RBVEEocCwgbCkJCQkJCQlcCisJaWYgKCBscC0+ZGF0YWNzICkgewkJCQkJCVwKKwkJdW5zaWduZWQgY2hhciAqX19wdHIgPSAocCk7CQkJCVwKKwkJaW50IF9fbGVuID0gKGwpOwkJCQkJXAorIAkJaWYgKF9fbGVuID49IDIgJiYgKHVuc2lnbmVkIGxvbmcpX19wdHIgJiAyKSB7CQlcCisgCQkJX19sZW4gLT0gMjsJCQkJCVwKKyAJCQlTTUNfb3V0dyggKigodTE2ICopX19wdHIpLCBpb2FkZHIsIERBVEFfUkVHICk7CVwKKyAJCQlfX3B0ciArPSAyOwkJCQkJXAorIAkJfQkJCQkJCQlcCisJCW91dHNsKGxwLT5kYXRhY3MsIF9fcHRyLCBfX2xlbiA+PiAyKTsJCQlcCisgCQlpZiAoX19sZW4gJiAyKSB7CQkJCQlcCisgCQkJX19wdHIgKz0gKF9fbGVuICYgfjMpOwkJCQlcCisgCQkJU01DX291dHcoICooKHUxNiAqKV9fcHRyKSwgaW9hZGRyLCBEQVRBX1JFRyApOwlcCisgCQl9CQkJCQkJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCV9TTUNfUFVTSF9EQVRBKHAsIGwpOwkJCQkJXAorCX0KKworI2RlZmluZSBTTUNfUFVMTF9EQVRBKHAsIGwpCQkJCQkJXAorCWlmICggbHAtPmRhdGFjcyApIHsgCQkJCQkJXAorCQl1bnNpZ25lZCBjaGFyICpfX3B0ciA9IChwKTsJCQkJXAorCQlpbnQgX19sZW4gPSAobCk7CQkJCQlcCisJCWlmICgodW5zaWduZWQgbG9uZylfX3B0ciAmIDIpIHsJCQkgCVwKKwkJCS8qCQkJCQkJXAorCQkJICogV2Ugd2FudCAzMmJpdCBhbGlnbm1lbnQgaGVyZS4JCVwKKwkJCSAqIFNpbmNlIHNvbWUgYnVzZXMgcGVyZm9ybSBhIGZ1bGwgMzJiaXQJXAorCQkJICogZmV0Y2ggZXZlbiBmb3IgMTZiaXQgZGF0YSB3ZSBjYW4ndCB1c2UJXAorCQkJICogU01DX2ludygpIGhlcmUuICBCYWNrIGJvdGggc291cmNlIChvbiBjaGlwCVwKKwkJCSAqIGFuZCBkZXN0aW5hdGlvbikgcG9pbnRlcnMgb2YgMiBieXRlcy4JXAorCQkJICovCQkJCQkJXAorCQkJX19wdHIgLT0gMjsJCQkJCVwKKwkJCV9fbGVuICs9IDI7CQkJCQlcCisJCQlTTUNfU0VUX1BUUiggMnxQVFJfUkVBRHxQVFJfUkNWfFBUUl9BVVRPSU5DICk7IAlcCisJCX0JCQkJCQkJXAorCQlfX2xlbiArPSAyOwkJCQkJCVwKKwkJaW5zbCggbHAtPmRhdGFjcywgX19wdHIsIF9fbGVuID4+IDIpOwkJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCV9TTUNfUFVMTF9EQVRBKHAsIGwpOwkJCQkJXAorCX0KKyNlbHNlCisjZGVmaW5lIFNNQ19QVVNIX0RBVEEocCwgbCkgX1NNQ19QVVNIX0RBVEEocCwgbCkKKyNkZWZpbmUgU01DX1BVTExfREFUQShwLCBsKSBfU01DX1BVTExfREFUQShwLCBsKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoU01DX0lOVEVSUlVQVF9QUkVBTUJMRSkKKyMgZGVmaW5lIFNNQ19JTlRFUlJVUFRfUFJFQU1CTEUKKyNlbmRpZgorCisjZW5kaWYgIC8qIF9TTUM5MVhfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NvbmljLmMgYi9kcml2ZXJzL25ldC9zb25pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYzljYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zb25pYy5jCkBAIC0wLDAgKzEsNjE2IEBACisvKgorICogc29uaWMuYworICoKKyAqIChDKSAxOTk2LDE5OTggYnkgVGhvbWFzIEJvZ2VuZG9lcmZlciAodHNib2dlbmRAYWxwaGEuZnJhbmtlbi5kZSkKKyAqIAorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gd29yayBmcm9tIEFuZHJlYXMgQnVzc2UsIGJ1dCBtb3N0IG9mCisgKiB0aGUgY29kZSBpcyByZXdyaXR0ZW4uCisgKiAKKyAqIChDKSAxOTk1IGJ5IEFuZHJlYXMgQnVzc2UgKGFuZHlAd2FsZG9yZi1nbWJoLmRlKQorICoKKyAqICAgIENvcmUgY29kZSBpbmNsdWRlZCBieSBzeXN0ZW0gc29uaWMgZHJpdmVycworICovCisKKy8qCisgKiBTb3VyY2VzOiBPbGl2ZXR0aSBNNzAwLTEwIFJpc2MgUGVyc29uYWwgQ29tcHV0ZXIgaGFyZHdhcmUgaGFuZGJvb2ssCisgKiBOYXRpb25hbCBTZW1pY29uZHVjdG9ycyBkYXRhIHNoZWV0IGZvciB0aGUgRFA4MzkzMkIgU29uaWMgRXRoZXJuZXQKKyAqIGNvbnRyb2xsZXIsIGFuZCB0aGUgZmlsZXMgIjgzOTAuYyIgYW5kICJza2VsZXRvbi5jIiBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqLworCisKKworLyoKKyAqIE9wZW4vaW5pdGlhbGl6ZSB0aGUgU09OSUMgY29udHJvbGxlci4KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgKiAgcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKKyAqICB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCitzdGF0aWMgaW50IHNvbmljX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoc29uaWNfZGVidWcgPiAyKQorCQlwcmludGsoInNvbmljX29wZW46IGluaXRpYWxpemluZyBzb25pYyBkcml2ZXIuXG4iKTsKKworCS8qCisJICogV2UgZG9uJ3QgbmVlZCB0byBkZWFsIHdpdGggYXV0by1pcnEgc3R1ZmYgc2luY2Ugd2UKKwkgKiBoYXJkd2lyZSB0aGUgc29uaWMgaW50ZXJydXB0LgorCSAqLworLyoKKyAqIFhYWCBIb3JyaWJsZSB3b3JrIGFyb3VuZDogIFdlIGluc3RhbGwgc29uaWNfaW50ZXJydXB0IGFzIGZhc3QgaW50ZXJydXB0LgorICogVGhpcyBtZWFucyB0aGF0IGR1cmluZyBleGVjdXRpb24gb2YgdGhlIGhhbmRsZXIgaW50ZXJydXB0IGFyZSBkaXNhYmxlZAorICogY292ZXJpbmcgYW5vdGhlciBidWcgb3RoZXJ3aXNlIGNvcnJ1cHRpbmcgZGF0YS4gIFRoaXMgZG9lc24ndCBtZWFuCisgKiB0aGlzIGdsdWUgd29ya3Mgb2sgdW5kZXIgYWxsIHNpdHVhdGlvbnMuCisgKi8KKy8vICAgIGlmIChzb25pY19yZXF1ZXN0X2lycShkZXYtPmlycSwgJnNvbmljX2ludGVycnVwdCwgMCwgInNvbmljIiwgZGV2KSkgeworCWlmIChzb25pY19yZXF1ZXN0X2lycShkZXYtPmlycSwgJnNvbmljX2ludGVycnVwdCwgU0FfSU5URVJSVVBULAorCSAgICAgICAgICAgICAgICAgICAgICAic29uaWMiLCBkZXYpKSB7CisJCXByaW50aygiXG4lczogdW5hYmxlIHRvIGdldCBJUlEgJWQgLlxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgU09OSUMKKwkgKi8KKwlzb25pY19pbml0KGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJaWYgKHNvbmljX2RlYnVnID4gMikKKwkJcHJpbnRrKCJzb25pY19vcGVuOiBJbml0aWFsaXphdGlvbiBkb25lLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQ2xvc2UgdGhlIFNPTklDIGRldmljZQorICovCitzdGF0aWMgaW50IHNvbmljX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKHNvbmljX2RlYnVnID4gMikKKwkJcHJpbnRrKCJzb25pY19jbG9zZVxuIik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKgorCSAqIHN0b3AgdGhlIFNPTklDLCBkaXNhYmxlIGludGVycnVwdHMKKwkgKi8KKwlTT05JQ19XUklURShTT05JQ19JU1IsIDB4N2ZmZik7CisJU09OSUNfV1JJVEUoU09OSUNfSU1SLCAwKTsKKwlTT05JQ19XUklURShTT05JQ19DTUQsIFNPTklDX0NSX1JTVCk7CisKKwlzb25pY19mcmVlX2lycShkZXYtPmlycSwgZGV2KTsJLyogcmVsZWFzZSB0aGUgSVJRICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc29uaWNfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzb25pY19sb2NhbCAqbHAgPSAoc3RydWN0IHNvbmljX2xvY2FsICopIGRldi0+cHJpdjsKKwlwcmludGsoIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQuXG4iLCBkZXYtPm5hbWUpOworCisJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuICovCisJc29uaWNfaW5pdChkZXYpOworCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKiB0cmFuc21pdCBwYWNrZXQKKyAqLworc3RhdGljIGludCBzb25pY19zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzb25pY19sb2NhbCAqbHAgPSAoc3RydWN0IHNvbmljX2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBpbnQgYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgaW50IGxhZGRyOworCWludCBlbnRyeSwgbGVuZ3RoOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKHNvbmljX2RlYnVnID4gMikKKwkJcHJpbnRrKCJzb25pY19zZW5kX3BhY2tldDogc2tiPSVwLCBkZXY9JXBcbiIsIHNrYiwgZGV2KTsKKworCS8qCisJICogTWFwIHRoZSBwYWNrZXQgZGF0YSBpbnRvIHRoZSBsb2dpY2FsIERNQSBhZGRyZXNzIHNwYWNlCisJICovCisJaWYgKChsYWRkciA9IHZkbWFfYWxsb2MoQ1BIWVNBRERSKHNrYi0+ZGF0YSksIHNrYi0+bGVuKSkgPT0gfjBVTCkgeworCQlwcmludGsoIiVzOiBubyBWRE1BIGVudHJ5IGZvciB0cmFuc21pdCBhdmFpbGFibGUuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlyZXR1cm4gMTsKKwl9CisJZW50cnkgPSBscC0+Y3VyX3R4ICYgU09OSUNfVERTX01BU0s7CisJbHAtPnR4X2xhZGRyW2VudHJ5XSA9IGxhZGRyOworCWxwLT50eF9za2JbZW50cnldID0gc2tiOworCisJbGVuZ3RoID0gKHNrYi0+bGVuIDwgRVRIX1pMRU4pID8gRVRIX1pMRU4gOiBza2ItPmxlbjsKKwlmbHVzaF9jYWNoZV9hbGwoKTsKKworCS8qCisJICogU2V0dXAgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgYW5kIGlzc3VlIHRoZSB0cmFuc21pdCBjb21tYW5kLgorCSAqLworCWxwLT50ZGFbZW50cnldLnR4X3N0YXR1cyA9IDA7CS8qIGNsZWFyIHN0YXR1cyAqLworCWxwLT50ZGFbZW50cnldLnR4X2ZyYWdfY291bnQgPSAxOwkvKiBzaW5nbGUgZnJhZ21lbnQgKi8KKwlscC0+dGRhW2VudHJ5XS50eF9wa3RzaXplID0gbGVuZ3RoOwkvKiBsZW5ndGggb2YgcGFja2V0ICovCisJbHAtPnRkYVtlbnRyeV0udHhfZnJhZ19wdHJfbCA9IGxhZGRyICYgMHhmZmZmOworCWxwLT50ZGFbZW50cnldLnR4X2ZyYWdfcHRyX2ggPSBsYWRkciA+PiAxNjsKKwlscC0+dGRhW2VudHJ5XS50eF9mcmFnX3NpemUgPSBsZW5ndGg7CisJbHAtPmN1cl90eCsrOworCWxwLT5zdGF0cy50eF9ieXRlcyArPSBsZW5ndGg7CisKKwlpZiAoc29uaWNfZGVidWcgPiAyKQorCQlwcmludGsoInNvbmljX3NlbmRfcGFja2V0OiBpc3N1ZWluZyBUeCBjb21tYW5kXG4iKTsKKworCVNPTklDX1dSSVRFKFNPTklDX0NNRCwgU09OSUNfQ1JfVFhQKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJaWYgKGxwLT5jdXJfdHggPCBscC0+ZGlydHlfdHggKyBTT05JQ19OVU1fVERTKQorCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCWVsc2UKKwkJbHAtPnR4X2Z1bGwgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgdHlwaWNhbCB3b3JrbG9hZCBvZiB0aGUgZHJpdmVyOgorICogSGFuZGxlIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc29uaWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJdW5zaWduZWQgaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBzb25pY19sb2NhbCAqbHA7CisJaW50IHN0YXR1czsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoInNvbmljX2ludGVycnVwdDogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlscCA9IChzdHJ1Y3Qgc29uaWNfbG9jYWwgKikgZGV2LT5wcml2OworCisJc3RhdHVzID0gU09OSUNfUkVBRChTT05JQ19JU1IpOworCVNPTklDX1dSSVRFKFNPTklDX0lTUiwgMHg3ZmZmKTsJLyogY2xlYXIgYWxsIGJpdHMgKi8KKworCWlmIChzb25pY19kZWJ1ZyA+IDIpCisJCXByaW50aygic29uaWNfaW50ZXJydXB0OiBJU1I9JXhcbiIsIHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgU09OSUNfSU5UX1BLVFJYKSB7CisJCXNvbmljX3J4KGRldik7CS8qIGdvdCBwYWNrZXQocykgKi8KKwl9CisKKwlpZiAoc3RhdHVzICYgU09OSUNfSU5UX1RYRE4pIHsKKwkJaW50IGRpcnR5X3R4ID0gbHAtPmRpcnR5X3R4OworCisJCXdoaWxlIChkaXJ0eV90eCA8IGxwLT5jdXJfdHgpIHsKKwkJCWludCBlbnRyeSA9IGRpcnR5X3R4ICYgU09OSUNfVERTX01BU0s7CisJCQlpbnQgc3RhdHVzID0gbHAtPnRkYVtlbnRyeV0udHhfc3RhdHVzOworCisJCQlpZiAoc29uaWNfZGVidWcgPiAzKQorCQkJCXByaW50aworCQkJCSAgICAoInNvbmljX2ludGVycnVwdDogc3RhdHVzICVkLCBjdXJfdHggJWQsIGRpcnR5X3R4ICVkXG4iLAorCQkJCSAgICAgc3RhdHVzLCBscC0+Y3VyX3R4LCBscC0+ZGlydHlfdHgpOworCisJCQlpZiAoc3RhdHVzID09IDApIHsKKwkJCQkvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBUeGVkLCBraWNrIHRoZSBzb25pYyBhZ2FpbiAqLworCQkJCVNPTklDX1dSSVRFKFNPTklDX0NNRCwgU09OSUNfQ1JfVFhQKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogcHV0IGJhY2sgRU9MIGFuZCBmcmVlIGRlc2NyaXB0b3IgKi8KKwkJCWxwLT50ZGFbZW50cnldLnR4X2ZyYWdfY291bnQgPSAwOworCQkJbHAtPnRkYVtlbnRyeV0udHhfc3RhdHVzID0gMDsKKworCQkJaWYgKHN0YXR1cyAmIDB4MDAwMSkKKwkJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJZWxzZSB7CisJCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiAweDA2NDIpCisJCQkJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiAweDAxODApCisJCQkJCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiAweDAwMjApCisJCQkJCWxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIDB4MDAwNCkKKwkJCQkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQl9CisKKwkJCS8qIFdlIG11c3QgZnJlZSB0aGUgb3JpZ2luYWwgc2tiICovCisJCQlpZiAobHAtPnR4X3NrYltlbnRyeV0pIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShscC0+dHhfc2tiW2VudHJ5XSk7CisJCQkJbHAtPnR4X3NrYltlbnRyeV0gPSAwOworCQkJfQorCQkJLyogYW5kIHRoZSBWRE1BIGFkZHJlc3MgKi8KKwkJCXZkbWFfZnJlZShscC0+dHhfbGFkZHJbZW50cnldKTsKKwkJCWRpcnR5X3R4Kys7CisJCX0KKworCQlpZiAobHAtPnR4X2Z1bGwKKwkJICAgICYmIGRpcnR5X3R4ICsgU09OSUNfTlVNX1REUyA+IGxwLT5jdXJfdHggKyAyKSB7CisJCQkvKiBUaGUgcmluZyBpcyBubyBsb25nZXIgZnVsbCwgY2xlYXIgdGJ1c3kuICovCisJCQlscC0+dHhfZnVsbCA9IDA7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKworCQlscC0+ZGlydHlfdHggPSBkaXJ0eV90eDsKKwl9CisKKwkvKgorCSAqIGNoZWNrIGVycm9yIGNvbmRpdGlvbnMKKwkgKi8KKwlpZiAoc3RhdHVzICYgU09OSUNfSU5UX1JGTykgeworCQlwcmludGsoIiVzOiByZWNlaXZlIGZpZm8gdW5kZXJydW5cbiIsIGRldi0+bmFtZSk7CisJCWxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCX0KKwlpZiAoc3RhdHVzICYgU09OSUNfSU5UX1JERSkgeworCQlwcmludGsoIiVzOiByZWNlaXZlIGRlc2NyaXB0b3JzIGV4aGF1c3RlZFxuIiwgZGV2LT5uYW1lKTsKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwl9CisJaWYgKHN0YXR1cyAmIFNPTklDX0lOVF9SQkUpIHsKKwkJcHJpbnRrKCIlczogcmVjZWl2ZSBidWZmZXIgZXhoYXVzdGVkXG4iLCBkZXYtPm5hbWUpOworCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCX0KKwlpZiAoc3RhdHVzICYgU09OSUNfSU5UX1JCQUUpIHsKKwkJcHJpbnRrKCIlczogcmVjZWl2ZSBidWZmZXIgYXJlYSBleGhhdXN0ZWRcbiIsIGRldi0+bmFtZSk7CisJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJfQorCisJLyogY291bnRlciBvdmVycnVuczsgYWxsIGNvdW50ZXJzIGFyZSAxNmJpdCB3aWRlICovCisJaWYgKHN0YXR1cyAmIFNPTklDX0lOVF9GQUUpCisJCWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gNjU1MzY7CisJaWYgKHN0YXR1cyAmIFNPTklDX0lOVF9DUkMpCisJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9IDY1NTM2OworCWlmIChzdGF0dXMgJiBTT05JQ19JTlRfTVApCisJCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IDY1NTM2OworCisJLyogdHJhbnNtaXQgZXJyb3IgKi8KKwlpZiAoc3RhdHVzICYgU09OSUNfSU5UX1RYRVIpCisJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKworCS8qCisJICogY2xlYXIgaW50ZXJydXB0IGJpdHMgYW5kIHJldHVybgorCSAqLworCVNPTklDX1dSSVRFKFNPTklDX0lTUiwgc3RhdHVzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBXZSBoYXZlIGEgZ29vZCBwYWNrZXQocyksIGdldCBpdC90aGVtIG91dCBvZiB0aGUgYnVmZmVycy4KKyAqLworc3RhdGljIHZvaWQgc29uaWNfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHNvbmljX2xvY2FsICpscCA9IChzdHJ1Y3Qgc29uaWNfbG9jYWwgKikgZGV2LT5wcml2OworCXNvbmljX3JkX3QgKnJkID0gJmxwLT5yZGFbbHAtPmN1cl9yeCAmIFNPTklDX1JEU19NQVNLXTsKKwlpbnQgc3RhdHVzOworCisJd2hpbGUgKHJkLT5pbl91c2UgPT0gMCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlpbnQgcGt0X2xlbjsKKwkJdW5zaWduZWQgY2hhciAqcGt0X3B0cjsKKworCQlzdGF0dXMgPSByZC0+cnhfc3RhdHVzOworCQlpZiAoc29uaWNfZGVidWcgPiAzKQorCQkJcHJpbnRrKCJzdGF0dXMgJXgsIGN1cl9yeCAlZCwgY3VyX3JyYSAleFxuIiwKKwkJCSAgICAgICBzdGF0dXMsIGxwLT5jdXJfcngsIGxwLT5jdXJfcnJhKTsKKwkJaWYgKHN0YXR1cyAmIFNPTklDX1JDUl9QUlgpIHsKKwkJCXBrdF9sZW4gPSByZC0+cnhfcGt0bGVuOworCQkJcGt0X3B0ciA9CisJCQkgICAgKGNoYXIgKikKKwkJCSAgICBzb25pY19jaGlwdG9tZW0oKHJkLT5yeF9wa3RwdHJfaCA8PCAxNikgKworCQkJCQkgICAgcmQtPnJ4X3BrdHB0cl9sKTsKKworCQkJaWYgKHNvbmljX2RlYnVnID4gMykKKwkJCQlwcmludGsKKwkJCQkgICAgKCJwa3RwdHIgJXAgKHJiYSAlcCkgaDoleCBsOiV4LCBic2l6ZSBoOiV4IGw6JXhcbiIsCisJCQkJICAgICBwa3RfcHRyLCBscC0+cmJhLCByZC0+cnhfcGt0cHRyX2gsCisJCQkJICAgICByZC0+cnhfcGt0cHRyX2wsCisJCQkJICAgICBTT05JQ19SRUFEKFNPTklDX1JCV0MxKSwKKwkJCQkgICAgIFNPTklDX1JFQUQoU09OSUNfUkJXQzApKTsKKworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCXByaW50aworCQkJCSAgICAoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKKwkJCQkgICAgIGRldi0+bmFtZSk7CisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiAqLworCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KKwkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBwa3RfcHRyLCBwa3RfbGVuLCAwKTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOwkvKiBwYXNzIHRoZSBwYWNrZXQgdG8gdXBwZXIgbGF5ZXJzICovCisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCisJCX0gZWxzZSB7CisJCQkvKiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiwgaWYgd2UgZW5hYmxlIGFjY2VwdGluZyBicm9rZW4gcGFja2V0cy4gKi8KKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBTT05JQ19SQ1JfRkFFUikKKwkJCQlscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgU09OSUNfUkNSX0NSQ1IpCisJCQkJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJfQorCisJCXJkLT5pbl91c2UgPSAxOworCQlyZCA9ICZscC0+cmRhWygrK2xwLT5jdXJfcngpICYgU09OSUNfUkRTX01BU0tdOworCQkvKiBub3cgZ2l2ZSBiYWNrIHRoZSBidWZmZXIgdG8gdGhlIHJlY2VpdmUgYnVmZmVyIGFyZWEgKi8KKwkJaWYgKHN0YXR1cyAmIFNPTklDX1JDUl9MUEtUKSB7CisJCQkvKgorCQkJICogdGhpcyB3YXMgdGhlIGxhc3QgcGFja2V0IG91dCBvZiB0aGUgY3VycmVudCByZWNlaWNlIGJ1ZmZlcgorCQkJICogZ2l2ZSB0aGUgYnVmZmVyIGJhY2sgdG8gdGhlIFNPTklDCisJCQkgKi8KKwkJCWxwLT5jdXJfcnJhICs9IHNpemVvZihzb25pY19ycl90KTsKKwkJCWlmIChscC0+Y3VyX3JyYSA+CisJCQkgICAgKGxwLT5ycmFfbGFkZHIgKworCQkJICAgICAoU09OSUNfTlVNX1JSUyAtCisJCQkgICAgICAxKSAqIHNpemVvZihzb25pY19ycl90KSkpIGxwLT5jdXJfcnJhID0KKwkJCQkgICAgbHAtPnJyYV9sYWRkcjsKKwkJCVNPTklDX1dSSVRFKFNPTklDX1JXUCwgbHAtPmN1cl9ycmEgJiAweGZmZmYpOworCQl9IGVsc2UKKwkJCXByaW50aworCQkJICAgICgiJXM6IHJ4IGRlc2Mgd2l0aG91dCBSQ1JfTFBLVC4gU2hvdWxkbid0IGhhcHBlbiAhP1xuIiwKKwkJCSAgICAgZGV2LT5uYW1lKTsKKwl9CisJLyoKKwkgKiBJZiBhbnkgd29ydGgtd2hpbGUgcGFja2V0cyBoYXZlIGJlZW4gcmVjZWl2ZWQsIGRldl9yaW50KCkKKwkgKiBoYXMgZG9uZSBhIG1hcmtfYmgoTkVUX0JIKSBmb3IgdXMgYW5kIHdpbGwgd29yayBvbiB0aGVtCisJICogd2hlbiB3ZSBnZXQgdG8gdGhlIGJvdHRvbS1oYWxmIHJvdXRpbmUuCisJICovCit9CisKKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLgorICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGRldmljZSBvcGVuIG9yIGNsb3NlZC4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzb25pY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc29uaWNfbG9jYWwgKmxwID0gKHN0cnVjdCBzb25pY19sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJLyogcmVhZCB0aGUgdGFsbHkgY291bnRlciBmcm9tIHRoZSBTT05JQyBhbmQgcmVzZXQgdGhlbSAqLworCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9IFNPTklDX1JFQUQoU09OSUNfQ1JDVCk7CisJU09OSUNfV1JJVEUoU09OSUNfQ1JDVCwgMHhmZmZmKTsKKwlscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IFNPTklDX1JFQUQoU09OSUNfRkFFVCk7CisJU09OSUNfV1JJVEUoU09OSUNfRkFFVCwgMHhmZmZmKTsKKwlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBTT05JQ19SRUFEKFNPTklDX01QVCk7CisJU09OSUNfV1JJVEUoU09OSUNfTVBULCAweGZmZmYpOworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKworLyoKKyAqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICovCitzdGF0aWMgdm9pZCBzb25pY19tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzb25pY19sb2NhbCAqbHAgPSAoc3RydWN0IHNvbmljX2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBpbnQgYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgaW50IHJjcjsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwl1bnNpZ25lZCBjaGFyICphZGRyOworCWludCBpOworCisJcmNyID0gU09OSUNfUkVBRChTT05JQ19SQ1IpICYgfihTT05JQ19SQ1JfUFJPIHwgU09OSUNfUkNSX0FNQyk7CisJcmNyIHw9IFNPTklDX1JDUl9CUkQ7CS8qIGFjY2VwdCBicm9hZGNhc3QgcGFja2V0cyAqLworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkvKiBzZXQgcHJvbWlzY3VvdXMgbW9kZSAqLworCQlyY3IgfD0gU09OSUNfUkNSX1BSTzsKKwl9IGVsc2UgeworCQlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8IChkZXYtPm1jX2NvdW50ID4gMTUpKSB7CisJCQlyY3IgfD0gU09OSUNfUkNSX0FNQzsKKwkJfSBlbHNlIHsKKwkJCWlmIChzb25pY19kZWJ1ZyA+IDIpCisJCQkJcHJpbnRrCisJCQkJICAgICgic29uaWNfbXVsdGljYXN0X2xpc3Q6IG1jX2NvdW50ICVkXG4iLAorCQkJCSAgICAgZGV2LT5tY19jb3VudCk7CisJCQlscC0+Y2RhLmNhbV9lbmFibGUgPSAxOwkvKiBhbHdheXMgZW5hYmxlIG91ciBvd24gYWRkcmVzcyAqLworCQkJZm9yIChpID0gMTsgaSA8PSBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJCQlhZGRyID0gZG1pLT5kbWlfYWRkcjsKKwkJCQlkbWkgPSBkbWktPm5leHQ7CisJCQkJbHAtPmNkYS5jYW1fZGVzY1tpXS5jYW1fY2FwMCA9CisJCQkJICAgIGFkZHJbMV0gPDwgOCB8IGFkZHJbMF07CisJCQkJbHAtPmNkYS5jYW1fZGVzY1tpXS5jYW1fY2FwMSA9CisJCQkJICAgIGFkZHJbM10gPDwgOCB8IGFkZHJbMl07CisJCQkJbHAtPmNkYS5jYW1fZGVzY1tpXS5jYW1fY2FwMiA9CisJCQkJICAgIGFkZHJbNV0gPDwgOCB8IGFkZHJbNF07CisJCQkJbHAtPmNkYS5jYW1fZW5hYmxlIHw9ICgxIDw8IGkpOworCQkJfQorCQkJU09OSUNfV1JJVEUoU09OSUNfQ0RDLCAxNik7CisJCQkvKiBpc3N1ZSBMb2FkIENBTSBjb21tYW5kICovCisJCQlTT05JQ19XUklURShTT05JQ19DRFAsIGxwLT5jZGFfbGFkZHIgJiAweGZmZmYpOworCQkJU09OSUNfV1JJVEUoU09OSUNfQ01ELCBTT05JQ19DUl9MQ0FNKTsKKwkJfQorCX0KKworCWlmIChzb25pY19kZWJ1ZyA+IDIpCisJCXByaW50aygic29uaWNfbXVsdGljYXN0X2xpc3Q6IHNldHRpbmcgUkNSPSV4XG4iLCByY3IpOworCisJU09OSUNfV1JJVEUoU09OSUNfUkNSLCByY3IpOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBTT05JQyBldGhlcm5ldCBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW50IHNvbmljX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgaW50IGNtZDsKKwlzdHJ1Y3Qgc29uaWNfbG9jYWwgKmxwID0gKHN0cnVjdCBzb25pY19sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgaW50IHJyYV9zdGFydDsKKwl1bnNpZ25lZCBpbnQgcnJhX2VuZDsKKwlpbnQgaTsKKworCS8qCisJICogcHV0IHRoZSBTb25pYyBpbnRvIHNvZnR3YXJlLXJlc2V0IG1vZGUgYW5kCisJICogZGlzYWJsZSBhbGwgaW50ZXJydXB0cworCSAqLworCVNPTklDX1dSSVRFKFNPTklDX0lTUiwgMHg3ZmZmKTsKKwlTT05JQ19XUklURShTT05JQ19JTVIsIDApOworCVNPTklDX1dSSVRFKFNPTklDX0NNRCwgU09OSUNfQ1JfUlNUKTsKKworCS8qCisJICogY2xlYXIgc29mdHdhcmUgcmVzZXQgZmxhZywgZGlzYWJsZSByZWNlaXZlciwgY2xlYXIgYW5kCisJICogZW5hYmxlIGludGVycnVwdHMsIHRoZW4gY29tcGxldGVseSBpbml0aWFsaXplIHRoZSBTT05JQworCSAqLworCVNPTklDX1dSSVRFKFNPTklDX0NNRCwgMCk7CisJU09OSUNfV1JJVEUoU09OSUNfQ01ELCBTT05JQ19DUl9SWERJUyk7CisKKwkvKgorCSAqIGluaXRpYWxpemUgdGhlIHJlY2VpdmUgcmVzb3VyY2UgYXJlYQorCSAqLworCWlmIChzb25pY19kZWJ1ZyA+IDIpCisJCXByaW50aygic29uaWNfaW5pdDogaW5pdGlhbGl6ZSByZWNlaXZlIHJlc291cmNlIGFyZWFcbiIpOworCisJcnJhX3N0YXJ0ID0gbHAtPnJyYV9sYWRkciAmIDB4ZmZmZjsKKwlycmFfZW5kID0KKwkgICAgKHJyYV9zdGFydCArIChTT05JQ19OVU1fUlJTICogc2l6ZW9mKHNvbmljX3JyX3QpKSkgJiAweGZmZmY7CisKKwlmb3IgKGkgPSAwOyBpIDwgU09OSUNfTlVNX1JSUzsgaSsrKSB7CisJCWxwLT5ycmFbaV0ucnhfYnVmYWRyX2wgPQorCQkgICAgKGxwLT5yYmFfbGFkZHIgKyBpICogU09OSUNfUkJTSVpFKSAmIDB4ZmZmZjsKKwkJbHAtPnJyYVtpXS5yeF9idWZhZHJfaCA9CisJCSAgICAobHAtPnJiYV9sYWRkciArIGkgKiBTT05JQ19SQlNJWkUpID4+IDE2OworCQlscC0+cnJhW2ldLnJ4X2J1ZnNpemVfbCA9IFNPTklDX1JCU0laRSA+PiAxOworCQlscC0+cnJhW2ldLnJ4X2J1ZnNpemVfaCA9IDA7CisJfQorCisJLyogaW5pdGlhbGl6ZSBhbGwgUlJBIHJlZ2lzdGVycyAqLworCVNPTklDX1dSSVRFKFNPTklDX1JTQSwgcnJhX3N0YXJ0KTsKKwlTT05JQ19XUklURShTT05JQ19SRUEsIHJyYV9lbmQpOworCVNPTklDX1dSSVRFKFNPTklDX1JSUCwgcnJhX3N0YXJ0KTsKKwlTT05JQ19XUklURShTT05JQ19SV1AsIHJyYV9lbmQpOworCVNPTklDX1dSSVRFKFNPTklDX1VSUkEsIGxwLT5ycmFfbGFkZHIgPj4gMTYpOworCVNPTklDX1dSSVRFKFNPTklDX0VPQkMsIChTT05JQ19SQlNJWkUgLSAyKSA+PiAxKTsKKworCWxwLT5jdXJfcnJhID0KKwkgICAgbHAtPnJyYV9sYWRkciArIChTT05JQ19OVU1fUlJTIC0gMSkgKiBzaXplb2Yoc29uaWNfcnJfdCk7CisKKwkvKiBsb2FkIHRoZSByZXNvdXJjZSBwb2ludGVycyAqLworCWlmIChzb25pY19kZWJ1ZyA+IDMpCisJCXByaW50aygic29uaWNfaW5pdDogaXNzdWVpbmcgUlJSQSBjb21tYW5kXG4iKTsKKworCVNPTklDX1dSSVRFKFNPTklDX0NNRCwgU09OSUNfQ1JfUlJSQSk7CisJaSA9IDA7CisJd2hpbGUgKGkrKyA8IDEwMCkgeworCQlpZiAoU09OSUNfUkVBRChTT05JQ19DTUQpICYgU09OSUNfQ1JfUlJSQSkKKwkJCWJyZWFrOworCX0KKworCWlmIChzb25pY19kZWJ1ZyA+IDIpCisJCXByaW50aygic29uaWNfaW5pdDogc3RhdHVzPSV4XG4iLCBTT05JQ19SRUFEKFNPTklDX0NNRCkpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSByZWNlaXZlIGRlc2NyaXB0b3JzIHNvIHRoYXQgdGhleQorCSAqIGJlY29tZSBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0LCBpZS4gbGV0IHRoZSBsYXN0CisJICogZGVzY3JpcHRvciBwb2ludCB0byB0aGUgZmlyc3QgYWdhaW4uCisJICovCisJaWYgKHNvbmljX2RlYnVnID4gMikKKwkJcHJpbnRrKCJzb25pY19pbml0OiBpbml0aWFsaXplIHJlY2VpdmUgZGVzY3JpcHRvcnNcbiIpOworCWZvciAoaSA9IDA7IGkgPCBTT05JQ19OVU1fUkRTOyBpKyspIHsKKwkJbHAtPnJkYVtpXS5yeF9zdGF0dXMgPSAwOworCQlscC0+cmRhW2ldLnJ4X3BrdGxlbiA9IDA7CisJCWxwLT5yZGFbaV0ucnhfcGt0cHRyX2wgPSAwOworCQlscC0+cmRhW2ldLnJ4X3BrdHB0cl9oID0gMDsKKwkJbHAtPnJkYVtpXS5yeF9zZXFubyA9IDA7CisJCWxwLT5yZGFbaV0uaW5fdXNlID0gMTsKKwkJbHAtPnJkYVtpXS5saW5rID0KKwkJICAgIGxwLT5yZGFfbGFkZHIgKyAoaSArIDEpICogc2l6ZW9mKHNvbmljX3JkX3QpOworCX0KKwkvKiBmaXggbGFzdCBkZXNjcmlwdG9yICovCisJbHAtPnJkYVtTT05JQ19OVU1fUkRTIC0gMV0ubGluayA9IGxwLT5yZGFfbGFkZHI7CisJbHAtPmN1cl9yeCA9IDA7CisJU09OSUNfV1JJVEUoU09OSUNfVVJEQSwgbHAtPnJkYV9sYWRkciA+PiAxNik7CisJU09OSUNfV1JJVEUoU09OSUNfQ1JEQSwgbHAtPnJkYV9sYWRkciAmIDB4ZmZmZik7CisKKwkvKiAKKwkgKiBpbml0aWFsaXplIHRyYW5zbWl0IGRlc2NyaXB0b3JzCisJICovCisJaWYgKHNvbmljX2RlYnVnID4gMikKKwkJcHJpbnRrKCJzb25pY19pbml0OiBpbml0aWFsaXplIHRyYW5zbWl0IGRlc2NyaXB0b3JzXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgU09OSUNfTlVNX1REUzsgaSsrKSB7CisJCWxwLT50ZGFbaV0udHhfc3RhdHVzID0gMDsKKwkJbHAtPnRkYVtpXS50eF9jb25maWcgPSAwOworCQlscC0+dGRhW2ldLnR4X3BrdHNpemUgPSAwOworCQlscC0+dGRhW2ldLnR4X2ZyYWdfY291bnQgPSAwOworCQlscC0+dGRhW2ldLmxpbmsgPQorCQkgICAgKGxwLT50ZGFfbGFkZHIgKworCQkgICAgIChpICsgMSkgKiBzaXplb2Yoc29uaWNfdGRfdCkpIHwgU09OSUNfRU5EX09GX0xJTktTOworCX0KKwlscC0+dGRhW1NPTklDX05VTV9URFMgLSAxXS5saW5rID0KKwkgICAgKGxwLT50ZGFfbGFkZHIgJiAweGZmZmYpIHwgU09OSUNfRU5EX09GX0xJTktTOworCisJU09OSUNfV1JJVEUoU09OSUNfVVREQSwgbHAtPnRkYV9sYWRkciA+PiAxNik7CisJU09OSUNfV1JJVEUoU09OSUNfQ1REQSwgbHAtPnRkYV9sYWRkciAmIDB4ZmZmZik7CisJbHAtPmN1cl90eCA9IGxwLT5kaXJ0eV90eCA9IDA7CisKKwkvKgorCSAqIHB1dCBvdXIgb3duIGFkZHJlc3MgdG8gQ0FNIGRlc2NbMF0KKwkgKi8KKwlscC0+Y2RhLmNhbV9kZXNjWzBdLmNhbV9jYXAwID0KKwkgICAgZGV2LT5kZXZfYWRkclsxXSA8PCA4IHwgZGV2LT5kZXZfYWRkclswXTsKKwlscC0+Y2RhLmNhbV9kZXNjWzBdLmNhbV9jYXAxID0KKwkgICAgZGV2LT5kZXZfYWRkclszXSA8PCA4IHwgZGV2LT5kZXZfYWRkclsyXTsKKwlscC0+Y2RhLmNhbV9kZXNjWzBdLmNhbV9jYXAyID0KKwkgICAgZGV2LT5kZXZfYWRkcls1XSA8PCA4IHwgZGV2LT5kZXZfYWRkcls0XTsKKwlscC0+Y2RhLmNhbV9lbmFibGUgPSAxOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCWxwLT5jZGEuY2FtX2Rlc2NbaV0uY2FtX2VudHJ5X3BvaW50ZXIgPSBpOworCisJLyoKKwkgKiBpbml0aWFsaXplIENBTSByZWdpc3RlcnMKKwkgKi8KKwlTT05JQ19XUklURShTT05JQ19DRFAsIGxwLT5jZGFfbGFkZHIgJiAweGZmZmYpOworCVNPTklDX1dSSVRFKFNPTklDX0NEQywgMTYpOworCisJLyoKKwkgKiBsb2FkIHRoZSBDQU0KKwkgKi8KKwlTT05JQ19XUklURShTT05JQ19DTUQsIFNPTklDX0NSX0xDQU0pOworCisJaSA9IDA7CisJd2hpbGUgKGkrKyA8IDEwMCkgeworCQlpZiAoU09OSUNfUkVBRChTT05JQ19JU1IpICYgU09OSUNfSU5UX0xDRCkKKwkJCWJyZWFrOworCX0KKwlpZiAoc29uaWNfZGVidWcgPiAyKSB7CisJCXByaW50aygic29uaWNfaW5pdDogQ01EPSV4LCBJU1I9JXhcbiIsCisJCSAgICAgICBTT05JQ19SRUFEKFNPTklDX0NNRCksIFNPTklDX1JFQUQoU09OSUNfSVNSKSk7CisJfQorCisJLyoKKwkgKiBlbmFibGUgcmVjZWl2ZXIsIGRpc2FibGUgbG9vcGJhY2sKKwkgKiBhbmQgZW5hYmxlIGFsbCBpbnRlcnJ1cHRzCisJICovCisJU09OSUNfV1JJVEUoU09OSUNfQ01ELCBTT05JQ19DUl9SWEVOIHwgU09OSUNfQ1JfU1RQKTsKKwlTT05JQ19XUklURShTT05JQ19SQ1IsIFNPTklDX1JDUl9ERUZBVUxUKTsKKwlTT05JQ19XUklURShTT05JQ19UQ1IsIFNPTklDX1RDUl9ERUZBVUxUKTsKKwlTT05JQ19XUklURShTT05JQ19JU1IsIDB4N2ZmZik7CisJU09OSUNfV1JJVEUoU09OSUNfSU1SLCBTT05JQ19JTVJfREVGQVVMVCk7CisKKwljbWQgPSBTT05JQ19SRUFEKFNPTklDX0NNRCk7CisJaWYgKChjbWQgJiBTT05JQ19DUl9SWEVOKSA9PSAwIHx8IChjbWQgJiBTT05JQ19DUl9TVFApID09IDApCisJCXByaW50aygic29uaWNfaW5pdDogZmFpbGVkLCBzdGF0dXM9JXhcbiIsIGNtZCk7CisKKwlpZiAoc29uaWNfZGVidWcgPiAyKQorCQlwcmludGsoInNvbmljX2luaXQ6IG5ldyBzdGF0dXM9JXhcbiIsCisJCSAgICAgICBTT05JQ19SRUFEKFNPTklDX0NNRCkpOworCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NvbmljLmggYi9kcml2ZXJzL25ldC9zb25pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTZkNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zb25pYy5oCkBAIC0wLDAgKzEsNDgzIEBACisvKgorICogSGVscGZpbGUgZm9yIHNvbmljLmMKKyAqCisgKiAoQykgV2FsZG9yZiBFbGVjdHJvbmljcywgR2VybWFueQorICogV3JpdHRlbiBieSBBbmRyZWFzIEJ1c3NlCisgKgorICogTk9URTogbW9zdCBvZiB0aGUgc3RydWN0dXJlIGRlZmluaXRpb25zIGhlcmUgYXJlIGVuZGlhbiBkZXBlbmRlbnQuCisgKiBJZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBkcml2ZXIgb24gYmlnIGVuZGlhbiBtYWNoaW5lcywgdGhlIGRhdGEKKyAqIGFuZCBwYWQgc3RydWN0dXJlIG1lbWJlcnMgbXVzdCBiZSBleGNoYW5nZWQuIEFsc28sIHRoZSBzdHJ1Y3R1cmVzCisgKiBuZWVkIHRvIGJlIGNoYW5nZWQgYWNjb3JkaW5nbHkgdG8gdGhlIGJ1cyBzaXplLiAKKyAqCisgKiA5ODEyMjkgTVNjaDoJZGlkIGp1c3QgdGhhdCBmb3IgdGhlIDY4ayBNYWMgcG9ydCAoMzIgYml0LCBiaWcgZW5kaWFuKSwKKyAqCQlzZWUgQ09ORklHX01BQ1NPTklDIGJyYW5jaCBiZWxvdy4KKyAqCisgKi8KKyNpZm5kZWYgU09OSUNfSAorI2RlZmluZSBTT05JQ19ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworLyoKKyAqIFNPTklDIHJlZ2lzdGVyIG9mZnNldHMKKyAqLworCisjZGVmaW5lIFNPTklDX0NNRCAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBTT05JQ19EQ1IgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgU09OSUNfUkNSICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFNPTklDX1RDUiAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBTT05JQ19JTVIgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgU09OSUNfSVNSICAgICAgICAgICAgICAweDA1CisKKyNkZWZpbmUgU09OSUNfVVREQSAgICAgICAgICAgICAweDA2CisjZGVmaW5lIFNPTklDX0NUREEgICAgICAgICAgICAgMHgwNworCisjZGVmaW5lIFNPTklDX1VSREEgICAgICAgICAgICAgMHgwZAorI2RlZmluZSBTT05JQ19DUkRBICAgICAgICAgICAgIDB4MGUKKyNkZWZpbmUgU09OSUNfRU9CQyAgICAgICAgICAgICAweDEzCisjZGVmaW5lIFNPTklDX1VSUkEgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBTT05JQ19SU0EgICAgICAgICAgICAgIDB4MTUKKyNkZWZpbmUgU09OSUNfUkVBICAgICAgICAgICAgICAweDE2CisjZGVmaW5lIFNPTklDX1JSUCAgICAgICAgICAgICAgMHgxNworI2RlZmluZSBTT05JQ19SV1AgICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgU09OSUNfUlNDICAgICAgICAgICAgICAweDJiCisKKyNkZWZpbmUgU09OSUNfQ0VQICAgICAgICAgICAgICAweDIxCisjZGVmaW5lIFNPTklDX0NBUDIgICAgICAgICAgICAgMHgyMgorI2RlZmluZSBTT05JQ19DQVAxICAgICAgICAgICAgIDB4MjMKKyNkZWZpbmUgU09OSUNfQ0FQMCAgICAgICAgICAgICAweDI0CisjZGVmaW5lIFNPTklDX0NFICAgICAgICAgICAgICAgMHgyNQorI2RlZmluZSBTT05JQ19DRFAgICAgICAgICAgICAgIDB4MjYKKyNkZWZpbmUgU09OSUNfQ0RDICAgICAgICAgICAgICAweDI3CisKKyNkZWZpbmUgU09OSUNfV1QwICAgICAgICAgICAgICAweDI5CisjZGVmaW5lIFNPTklDX1dUMSAgICAgICAgICAgICAgMHgyYQorCisjZGVmaW5lIFNPTklDX1NSICAgICAgICAgICAgICAgMHgyOAorCisKKy8qIHRlc3Qtb25seSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBTT05JQ19UUFMJCTB4MDgKKyNkZWZpbmUgU09OSUNfVEZDCQkweDA5CisjZGVmaW5lIFNPTklDX1RTQTAJCTB4MGEKKyNkZWZpbmUgU09OSUNfVFNBMQkJMHgwYgorI2RlZmluZSBTT05JQ19URlMJCTB4MGMKKworI2RlZmluZSBTT05JQ19DUkJBMAkJMHgwZgorI2RlZmluZSBTT05JQ19DUkJBMQkJMHgxMAorI2RlZmluZSBTT05JQ19SQldDMAkJMHgxMQorI2RlZmluZSBTT05JQ19SQldDMQkJMHgxMgorI2RlZmluZSBTT05JQ19UVERBCQkweDIwCisjZGVmaW5lIFNPTklDX01EVAkJMHgyZgorCisjZGVmaW5lIFNPTklDX1RSQkEwCQkweDE5CisjZGVmaW5lIFNPTklDX1RSQkExCQkweDFhCisjZGVmaW5lIFNPTklDX1RCV0MwCQkweDFiCisjZGVmaW5lIFNPTklDX1RCV0MxCQkweDFjCisjZGVmaW5lIFNPTklDX0xMRkEJCTB4MWYKKworI2RlZmluZSBTT05JQ19BRERSMAkJMHgxZAorI2RlZmluZSBTT05JQ19BRERSMQkJMHgxZQorCisvKgorICogRXJyb3IgY291bnRlcnMKKyAqLworI2RlZmluZSBTT05JQ19DUkNUICAgICAgICAgICAgICAweDJjCisjZGVmaW5lIFNPTklDX0ZBRVQgICAgICAgICAgICAgIDB4MmQKKyNkZWZpbmUgU09OSUNfTVBUICAgICAgICAgICAgICAgMHgyZQorCisjZGVmaW5lIFNPTklDX0RDUjIgICAgICAgICAgICAgIDB4M2YKKworLyoKKyAqIFNPTklDIGNvbW1hbmQgYml0cworICovCisKKyNkZWZpbmUgU09OSUNfQ1JfTENBTSAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFNPTklDX0NSX1JSUkEgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBTT05JQ19DUl9SU1QgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgU09OSUNfQ1JfU1QgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFNPTklDX0NSX1NUUCAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBTT05JQ19DUl9SWEVOICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgU09OSUNfQ1JfUlhESVMgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFNPTklDX0NSX1RYUCAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBTT05JQ19DUl9IVFggICAgICAgICAgICAweDAwMDEKKworLyoKKyAqIFNPTklDIGRhdGEgY29uZmlndXJhdGlvbiBiaXRzCisgKi8KKworI2RlZmluZSBTT05JQ19EQ1JfRVhCVVMgICAgICAgICAweDgwMDAKKyNkZWZpbmUgU09OSUNfRENSX0xCUiAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFNPTklDX0RDUl9QTzEgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBTT05JQ19EQ1JfUE8wICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgU09OSUNfRENSX1NCVVMgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFNPTklDX0RDUl9VU1IxICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBTT05JQ19EQ1JfVVNSMCAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgU09OSUNfRENSX1dDMSAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFNPTklDX0RDUl9XQzAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBTT05JQ19EQ1JfRFcgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgU09OSUNfRENSX0JNUyAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFNPTklDX0RDUl9SRlQxICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBTT05JQ19EQ1JfUkZUMCAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgU09OSUNfRENSX1RGVDEgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFNPTklDX0RDUl9URlQwICAgICAgICAgIDB4MDAwMQorCisvKgorICogQ29uc3RhbnRzIGZvciB0aGUgU09OSUMgcmVjZWl2ZSBjb250cm9sIHJlZ2lzdGVyLgorICovCisKKyNkZWZpbmUgU09OSUNfUkNSX0VSUiAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFNPTklDX1JDUl9STlQgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBTT05JQ19SQ1JfQlJEICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgU09OSUNfUkNSX1BSTyAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFNPTklDX1JDUl9BTUMgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBTT05JQ19SQ1JfTEIxICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgU09OSUNfUkNSX0xCMCAgICAgICAgICAgMHgwMjAwCisKKyNkZWZpbmUgU09OSUNfUkNSX01DICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFNPTklDX1JDUl9CQyAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBTT05JQ19SQ1JfTFBLVCAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgU09OSUNfUkNSX0NSUyAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFNPTklDX1JDUl9DT0wgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBTT05JQ19SQ1JfQ1JDUiAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgU09OSUNfUkNSX0ZBRVIgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFNPTklDX1JDUl9MQksgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBTT05JQ19SQ1JfUFJYICAgICAgICAgICAweDAwMDEKKworI2RlZmluZSBTT05JQ19SQ1JfTEJfT0ZGICAgICAgICAwCisjZGVmaW5lIFNPTklDX1JDUl9MQl9NQUMgICAgICAgIFNPTklDX1JDUl9MQjAKKyNkZWZpbmUgU09OSUNfUkNSX0xCX0VOREVDICAgICAgU09OSUNfUkNSX0xCMQorI2RlZmluZSBTT05JQ19SQ1JfTEJfVFJBTlMgICAgICAoU09OSUNfUkNSX0xCMCB8IFNPTklDX1JDUl9MQjEpCisKKy8qIGRlZmF1bHQgUkNSIHNldHVwICovCisKKyNkZWZpbmUgU09OSUNfUkNSX0RFRkFVTFQgICAgICAgKFNPTklDX1JDUl9CUkQpCisKKworLyoKKyAqIFNPTklDIFRyYW5zbWl0IENvbnRyb2wgcmVnaXN0ZXIgYml0cworICovCisKKyNkZWZpbmUgU09OSUNfVENSX1BJTlRSICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFNPTklDX1RDUl9QT1dDICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBTT05JQ19UQ1JfQ1JDSSAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgU09OSUNfVENSX0VYRElTICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFNPTklDX1RDUl9FWEQgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBTT05JQ19UQ1JfREVGICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgU09OSUNfVENSX05DUlMgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFNPTklDX1RDUl9DUkxTICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBTT05JQ19UQ1JfRVhDICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgU09OSUNfVENSX1BNQiAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFNPTklDX1RDUl9GVSAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBTT05JQ19UQ1JfQkNNICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgU09OSUNfVENSX1BUWCAgICAgICAgICAgMHgwMDAxCisKKyNkZWZpbmUgU09OSUNfVENSX0RFRkFVTFQgICAgICAgMHgwMDAwCisKKy8qIAorICogQ29uc3RhbnRzIGZvciB0aGUgU09OSUNfSU5URVJSVVBUX01BU0sgYW5kCisgKiBTT05JQ19JTlRFUlJVUFRfU1RBVFVTIHJlZ2lzdGVycy4KKyAqLworCisjZGVmaW5lIFNPTklDX0lOVF9CUgkJMHg0MDAwCisjZGVmaW5lIFNPTklDX0lOVF9IQkwJCTB4MjAwMAorI2RlZmluZSBTT05JQ19JTlRfTENEICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgU09OSUNfSU5UX1BJTlQgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFNPTklDX0lOVF9QS1RSWCAgICAgICAgIDB4MDQwMAorI2RlZmluZSBTT05JQ19JTlRfVFhETiAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgU09OSUNfSU5UX1RYRVIgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFNPTklDX0lOVF9UQyAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBTT05JQ19JTlRfUkRFICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgU09OSUNfSU5UX1JCRSAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFNPTklDX0lOVF9SQkFFCQkweDAwMTAKKyNkZWZpbmUgU09OSUNfSU5UX0NSQwkJMHgwMDA4CisjZGVmaW5lIFNPTklDX0lOVF9GQUUJCTB4MDAwNAorI2RlZmluZSBTT05JQ19JTlRfTVAJCTB4MDAwMgorI2RlZmluZSBTT05JQ19JTlRfUkZPCQkweDAwMDEKKworCisvKgorICogVGhlIGludGVycnVwdHMgd2UgYWxsb3cuCisgKi8KKworI2RlZmluZSBTT05JQ19JTVJfREVGQVVMVAkoU09OSUNfSU5UX0JSIHwgXAorCQkJCVNPTklDX0lOVF9MQ0QgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklDX0lOVF9QSU5UIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JQ19JTlRfUEtUUlggfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklDX0lOVF9UWEROIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JQ19JTlRfVFhFUiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUNfSU5UX1JERSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUNfSU5UX1JCRSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUNfSU5UX1JCQUUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklDX0lOVF9DUkMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklDX0lOVF9GQUUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklDX0lOVF9NUCkKKworCisjZGVmaW5lCVNPTklDX0VORF9PRl9MSU5LUwkweDAwMDEKKworCisjaWZkZWYgQ09ORklHX01BQ1NPTklDCisvKgorICogQmlnIGVuZGlhbiBsaWtlIHN0cnVjdHVyZXMgb24gNjgweDAgTWFjcworICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgcnhfYnVmYWRyX2w7CS8qIHJlY2VpdmUgYnVmZmVyIHB0ciAqLworCXUzMiByeF9idWZhZHJfaDsKKworCXUzMiByeF9idWZzaXplX2w7CS8qIG5vLiBvZiB3b3JkcyBpbiB0aGUgcmVjZWl2ZSBidWZmZXIgKi8KKwl1MzIgcnhfYnVmc2l6ZV9oOworfSBzb25pY19ycl90OworCisvKgorICogU29uaWMgcmVjZWl2ZSBkZXNjcmlwdG9yLiBSZWNlaXZlIGRlc2NyaXB0b3JzIGFyZQorICoga2VwdCBpbiBhIGxpbmtlZCBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCVNSRUdTX1BBRChwYWQwKTsKKwl1MTYgcnhfc3RhdHVzOwkJLyogc3RhdHVzIGFmdGVyIHJlY2VwdGlvbiBvZiBhIHBhY2tldCAqLworCSBTUkVHU19QQUQocGFkMSk7CisJdTE2IHJ4X3BrdGxlbjsJCS8qIGxlbmd0aCBvZiB0aGUgcGFja2V0IGluY2wuIENSQyAqLworCisJLyoKKwkgKiBQb2ludGVycyB0byB0aGUgbG9jYXRpb24gaW4gdGhlIHJlY2VpdmUgYnVmZmVyIGFyZWEgKFJCQSkKKwkgKiB3aGVyZSB0aGUgcGFja2V0IHJlc2lkZXMuIEEgcGFja2V0IGlzIGFsd2F5cyByZWNlaXZlZCBpbnRvCisJICogYSBjb250aWd1b3VzIHBpZWNlIG9mIG1lbW9yeS4KKwkgKi8KKwkgU1JFR1NfUEFEKHBhZDIpOworCXUxNiByeF9wa3RwdHJfbDsKKwkgU1JFR1NfUEFEKHBhZDMpOworCXUxNiByeF9wa3RwdHJfaDsKKworCSBTUkVHU19QQUQocGFkNCk7CisJdTE2IHJ4X3NlcW5vOwkJLyogc2VxdWVuY2Ugbm8uICovCisKKwkgU1JFR1NfUEFEKHBhZDUpOworCXUxNiBsaW5rOwkJLyogbGluayB0byBuZXh0IFJERCAoZW5kIGlmIEVPTCBiaXQgc2V0KSAqLworCisJLyoKKwkgKiBPd25lciBvZiB0aGlzIGRlc2NyaXB0b3IsIDA9IGRyaXZlciwgMT1zb25pYworCSAqLworCisJIFNSRUdTX1BBRChwYWQ2KTsKKwl1MTYgaW5fdXNlOworCisJY2FkZHJfdCByZGFfbmV4dDsJLyogcG9pbnRlciB0byBuZXh0IFJEICovCit9IHNvbmljX3JkX3Q7CisKKworLyoKKyAqIERlc2NyaWJlcyBhIFRyYW5zbWl0IERlc2NyaXB0b3IKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCVNSRUdTX1BBRChwYWQwKTsKKwl1MTYgdHhfc3RhdHVzOwkJLyogc3RhdHVzIGFmdGVyIHRyYW5zbWlzc2lvbiBvZiBhIHBhY2tldCAqLworCSBTUkVHU19QQUQocGFkMSk7CisJdTE2IHR4X2NvbmZpZzsJCS8qIHRyYW5zbWl0IGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgcGFja2V0ICovCisJIFNSRUdTX1BBRChwYWQyKTsKKwl1MTYgdHhfcGt0c2l6ZTsJCS8qIHNpemUgb2YgdGhlIHBhY2tldCB0byBiZSB0cmFuc21pdHRlZCAqLworCSBTUkVHU19QQUQocGFkMyk7CisJdTE2IHR4X2ZyYWdfY291bnQ7CS8qIG5vLiBvZiBmcmFnbWVudHMgKi8KKworCSBTUkVHU19QQUQocGFkNCk7CisJdTE2IHR4X2ZyYWdfcHRyX2w7CisJIFNSRUdTX1BBRChwYWQ1KTsKKwl1MTYgdHhfZnJhZ19wdHJfaDsKKwkgU1JFR1NfUEFEKHBhZDYpOworCXUxNiB0eF9mcmFnX3NpemU7CisKKwkgU1JFR1NfUEFEKHBhZDcpOworCXUxNiBsaW5rOwkJLyogcHRyIHRvIG5leHQgZGVzY3JpcHRvciAqLworfSBzb25pY190ZF90OworCisKKy8qCisgKiBEZXNjcmliZXMgYW4gZW50cnkgaW4gdGhlIENBTSBEZXNjcmlwdG9yIEFyZWEuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCVNSRUdTX1BBRChwYWQwKTsKKwl1MTYgY2FtX2VudHJ5X3BvaW50ZXI7CisJIFNSRUdTX1BBRChwYWQxKTsKKwl1MTYgY2FtX2NhcDA7CisJIFNSRUdTX1BBRChwYWQyKTsKKwl1MTYgY2FtX2NhcDE7CisJIFNSRUdTX1BBRChwYWQzKTsKKwl1MTYgY2FtX2NhcDI7Cit9IHNvbmljX2NkX3Q7CisKKyNkZWZpbmUgQ0FNX0RFU0NSSVBUT1JTIDE2CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCXNvbmljX2NkX3QgY2FtX2Rlc2NbQ0FNX0RFU0NSSVBUT1JTXTsKKwkgU1JFR1NfUEFEKHBhZCk7CisJdTE2IGNhbV9lbmFibGU7Cit9IHNvbmljX2NkYV90OworCisjZWxzZQkJCQkvKiBvcmlnaW5hbCBkZWNsYXJhdGlvbnMsIGxpdHRsZSBlbmRpYW4gMzIgYml0ICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIHJ4X2J1ZmFkcl9sOwkvKiByZWNlaXZlIGJ1ZmZlciBwdHIgKi8KKwl1MzIgcnhfYnVmYWRyX2g7CisKKwl1MzIgcnhfYnVmc2l6ZV9sOwkvKiBuby4gb2Ygd29yZHMgaW4gdGhlIHJlY2VpdmUgYnVmZmVyICovCisJdTMyIHJ4X2J1ZnNpemVfaDsKK30gc29uaWNfcnJfdDsKKworLyoKKyAqIFNvbmljIHJlY2VpdmUgZGVzY3JpcHRvci4gUmVjZWl2ZSBkZXNjcmlwdG9ycyBhcmUKKyAqIGtlcHQgaW4gYSBsaW5rZWQgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgcnhfc3RhdHVzOwkJLyogc3RhdHVzIGFmdGVyIHJlY2VwdGlvbiBvZiBhIHBhY2tldCAqLworCSBTUkVHU19QQUQocGFkMCk7CisJdTE2IHJ4X3BrdGxlbjsJCS8qIGxlbmd0aCBvZiB0aGUgcGFja2V0IGluY2wuIENSQyAqLworCSBTUkVHU19QQUQocGFkMSk7CisKKwkvKgorCSAqIFBvaW50ZXJzIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgcmVjZWl2ZSBidWZmZXIgYXJlYSAoUkJBKQorCSAqIHdoZXJlIHRoZSBwYWNrZXQgcmVzaWRlcy4gQSBwYWNrZXQgaXMgYWx3YXlzIHJlY2VpdmVkIGludG8KKwkgKiBhIGNvbnRpZ3VvdXMgcGllY2Ugb2YgbWVtb3J5LgorCSAqLworCXUxNiByeF9wa3RwdHJfbDsKKwkgU1JFR1NfUEFEKHBhZDIpOworCXUxNiByeF9wa3RwdHJfaDsKKwkgU1JFR1NfUEFEKHBhZDMpOworCisJdTE2IHJ4X3NlcW5vOwkJLyogc2VxdWVuY2Ugbm8uICovCisJIFNSRUdTX1BBRChwYWQ0KTsKKworCXUxNiBsaW5rOwkJLyogbGluayB0byBuZXh0IFJERCAoZW5kIGlmIEVPTCBiaXQgc2V0KSAqLworCSBTUkVHU19QQUQocGFkNSk7CisKKwkvKgorCSAqIE93bmVyIG9mIHRoaXMgZGVzY3JpcHRvciwgMD0gZHJpdmVyLCAxPXNvbmljCisJICovCisKKwl1MTYgaW5fdXNlOworCSBTUkVHU19QQUQocGFkNik7CisKKwljYWRkcl90IHJkYV9uZXh0OwkvKiBwb2ludGVyIHRvIG5leHQgUkQgKi8KK30gc29uaWNfcmRfdDsKKworCisvKgorICogRGVzY3JpYmVzIGEgVHJhbnNtaXQgRGVzY3JpcHRvcgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IHR4X3N0YXR1czsJCS8qIHN0YXR1cyBhZnRlciB0cmFuc21pc3Npb24gb2YgYSBwYWNrZXQgKi8KKwkgU1JFR1NfUEFEKHBhZDApOworCXUxNiB0eF9jb25maWc7CQkvKiB0cmFuc21pdCBjb25maWd1cmF0aW9uIGZvciB0aGlzIHBhY2tldCAqLworCSBTUkVHU19QQUQocGFkMSk7CisJdTE2IHR4X3BrdHNpemU7CQkvKiBzaXplIG9mIHRoZSBwYWNrZXQgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKwkgU1JFR1NfUEFEKHBhZDIpOworCXUxNiB0eF9mcmFnX2NvdW50OwkvKiBuby4gb2YgZnJhZ21lbnRzICovCisJIFNSRUdTX1BBRChwYWQzKTsKKworCXUxNiB0eF9mcmFnX3B0cl9sOworCSBTUkVHU19QQUQocGFkNCk7CisJdTE2IHR4X2ZyYWdfcHRyX2g7CisJIFNSRUdTX1BBRChwYWQ1KTsKKwl1MTYgdHhfZnJhZ19zaXplOworCSBTUkVHU19QQUQocGFkNik7CisKKwl1MTYgbGluazsJCS8qIHB0ciB0byBuZXh0IGRlc2NyaXB0b3IgKi8KKwkgU1JFR1NfUEFEKHBhZDcpOworfSBzb25pY190ZF90OworCisKKy8qCisgKiBEZXNjcmliZXMgYW4gZW50cnkgaW4gdGhlIENBTSBEZXNjcmlwdG9yIEFyZWEuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBjYW1fZW50cnlfcG9pbnRlcjsKKwkgU1JFR1NfUEFEKHBhZDApOworCXUxNiBjYW1fY2FwMDsKKwkgU1JFR1NfUEFEKHBhZDEpOworCXUxNiBjYW1fY2FwMTsKKwkgU1JFR1NfUEFEKHBhZDIpOworCXUxNiBjYW1fY2FwMjsKKwkgU1JFR1NfUEFEKHBhZDMpOworfSBzb25pY19jZF90OworCisjZGVmaW5lIENBTV9ERVNDUklQVE9SUyAxNgorCisKK3R5cGVkZWYgc3RydWN0IHsKKwlzb25pY19jZF90IGNhbV9kZXNjW0NBTV9ERVNDUklQVE9SU107CisJdTE2IGNhbV9lbmFibGU7CisJIFNSRUdTX1BBRChwYWQpOworfSBzb25pY19jZGFfdDsKKyNlbmRpZgkJCQkvKiBlbmRpYW5uZXNzICovCisKKy8qCisgKiBTb21lIHR1bmFibGVzIGZvciB0aGUgYnVmZmVyIGFyZWFzLiBQb3dlciBvZiAyIGlzIHJlcXVpcmVkCisgKiB0aGUgY3VycmVudCBkcml2ZXIgdXNlcyBvbmUgcmVjZWl2ZSBidWZmZXIgZm9yIGVhY2ggZGVzY3JpcHRvci4KKyAqCisgKiBNU2NoOiB1c2UgbW9yZSBidWZmZXIgc3BhY2UgZm9yIHRoZSBzbG93IG02OGsgTWFjcyEKKyAqLworI2lmZGVmIENPTkZJR19NQUNTT05JQworI2RlZmluZSBTT05JQ19OVU1fUlJTICAgIDMyCS8qIG51bWJlciBvZiByZWNlaXZlIHJlc291cmNlcyAqLworI2RlZmluZSBTT05JQ19OVU1fUkRTICAgIFNPTklDX05VTV9SUlMJLyogbnVtYmVyIG9mIHJlY2VpdmUgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgU09OSUNfTlVNX1REUyAgICAzMgkvKiBudW1iZXIgb2YgdHJhbnNtaXQgZGVzY3JpcHRvcnMgKi8KKyNlbHNlCisjZGVmaW5lIFNPTklDX05VTV9SUlMgICAgMTYJLyogbnVtYmVyIG9mIHJlY2VpdmUgcmVzb3VyY2VzICovCisjZGVmaW5lIFNPTklDX05VTV9SRFMgICAgU09OSUNfTlVNX1JSUwkvKiBudW1iZXIgb2YgcmVjZWl2ZSBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBTT05JQ19OVU1fVERTICAgIDE2CS8qIG51bWJlciBvZiB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLworI2VuZGlmCisjZGVmaW5lIFNPTklDX1JCU0laRSAgIDE1MjAJLyogc2l6ZSBvZiBvbmUgcmVzb3VyY2UgYnVmZmVyICovCisKKyNkZWZpbmUgU09OSUNfUkRTX01BU0sgICAoU09OSUNfTlVNX1JEUy0xKQorI2RlZmluZSBTT05JQ19URFNfTUFTSyAgIChTT05JQ19OVU1fVERTLTEpCisKKworLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuICovCitzdHJ1Y3Qgc29uaWNfbG9jYWwgeworCXNvbmljX2NkYV90IGNkYTsJLyogdmlydHVhbCBDUFUgYWRkcmVzcyBvZiBDREEgKi8KKwlzb25pY190ZF90IHRkYVtTT05JQ19OVU1fVERTXTsJLyogdHJhbnNtaXQgZGVzY3JpcHRvciBhcmVhICovCisJc29uaWNfcnJfdCBycmFbU09OSUNfTlVNX1JSU107CS8qIHJlY2VpdmUgcmVzb3VyY2UgYXJlYSAqLworCXNvbmljX3JkX3QgcmRhW1NPTklDX05VTV9SRFNdOwkvKiByZWNlaXZlIGRlc2NyaXB0b3IgYXJlYSAqLworCXN0cnVjdCBza19idWZmICp0eF9za2JbU09OSUNfTlVNX1REU107CS8qIHNrYnVmZnMgZm9yIHBhY2tldHMgdG8gdHJhbnNtaXQgKi8KKwl1bnNpZ25lZCBpbnQgdHhfbGFkZHJbU09OSUNfTlVNX1REU107CS8qIGxvZ2ljYWwgRE1BIGFkZHJlc3MgZnJvIHNrYnVmZnMgKi8KKwl1bnNpZ25lZCBjaGFyICpyYmE7CS8qIHN0YXJ0IG9mIHJlY2VpdmUgYnVmZmVyIGFyZWFzICovCisJdW5zaWduZWQgaW50IGNkYV9sYWRkcjsJLyogbG9naWNhbCBETUEgYWRkcmVzcyBvZiBDREEgKi8KKwl1bnNpZ25lZCBpbnQgdGRhX2xhZGRyOwkvKiBsb2dpY2FsIERNQSBhZGRyZXNzIG9mIFREQSAqLworCXVuc2lnbmVkIGludCBycmFfbGFkZHI7CS8qIGxvZ2ljYWwgRE1BIGFkZHJlc3Mgb2YgUlJBICovCisJdW5zaWduZWQgaW50IHJkYV9sYWRkcjsJLyogbG9naWNhbCBETUEgYWRkcmVzcyBvZiBSREEgKi8KKwl1bnNpZ25lZCBpbnQgcmJhX2xhZGRyOwkvKiBsb2dpY2FsIERNQSBhZGRyZXNzIG9mIFJCQSAqLworCXVuc2lnbmVkIGludCBjdXJfcnJhOwkvKiBjdXJyZW50IGluZGV4ZXMgdG8gcmVzb3VyY2UgYXJlYXMgKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3J4OworCXVuc2lnbmVkIGludCBjdXJfdHg7CisJdW5zaWduZWQgaW50IGRpcnR5X3R4OwkvKiBsYXN0IHVuYWNrZWQgdHJhbnNtaXQgcGFja2V0ICovCisJY2hhciB0eF9mdWxsOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworfTsKKworI2RlZmluZSBUWF9USU1FT1VUIDYKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworCitzdGF0aWMgaW50IHNvbmljX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNvbmljX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHNvbmljX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHNvbmljX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzb25pY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc29uaWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc29uaWNfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNvbmljX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzb25pY190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbiA9CisgICAgInNvbmljLmM6djAuOTIgMjAuOS45OCB0c2JvZ2VuZEBhbHBoYS5mcmFua2VuLmRlXG4iOworCisjZW5kaWYgLyogU09OSUNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RhcmZpcmUuYyBiL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2YmRkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKQEAgLTAsMCArMSwyMjE4IEBACisvKiBzdGFyZmlyZS5jOiBMaW51eCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgQWRhcHRlYyBTdGFyZmlyZSBuZXR3b3JrIGFkYXB0ZXIuICovCisvKgorCVdyaXR0ZW4gMTk5OC0yMDAwIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlDdXJyZW50IG1haW50YWluZXIgaXMgSW9uIEJhZHVsZXNjdSA8aW9udXRAY3MuY29sdW1iaWEuZWR1Pi4gUGxlYXNlCisJc2VuZCBhbGwgYnVnIHJlcG9ydHMgdG8gbWUsIGFuZCBub3QgdG8gRG9uYWxkIEJlY2tlciwgYXMgdGhpcyBjb2RlCisJaGFzIGJlZW4gaGVhdmlseSBtb2RpZmllZCBmcm9tIERvbmFsZCdzIG9yaWdpbmFsIHZlcnNpb24uCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisJdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKwlEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisJcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorCWEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisKKwlUaGUgaW5mb3JtYXRpb24gYmVsb3cgY29tZXMgZnJvbSBEb25hbGQgQmVja2VyJ3Mgb3JpZ2luYWwgZHJpdmVyOgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJU3VwcG9ydCBhbmQgdXBkYXRlcyBhdmFpbGFibGUgYXQKKwlodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL3N0YXJmaXJlLmh0bWwKKworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlMaW51eCBrZXJuZWwtc3BlY2lmaWMgY2hhbmdlczoKKworCUxLMS4xLjEgKGpnYXJ6aWspOgorCS0gVXNlIFBDSSBkcml2ZXIgaW50ZXJmYWNlCisJLSBGaXggTU9EX3h4eCByYWNlcworCS0gc29mdG5ldCBmaXh1cHMKKworCUxLMS4xLjIgKGpnYXJ6aWspOgorCS0gTWVyZ2UgQmVja2VyIHZlcnNpb24gMC4xNQorCisJTEsxLjEuMyAoQW5kcmV3IE1vcnRvbikKKwktIFRpbWVyIGNsZWFudXBzCisKKwlMSzEuMS40IChqZ2FyemlrKToKKwktIE1lcmdlIEJlY2tlciB2ZXJzaW9uIDEuMDMKKworCUxLMS4yLjEgKElvbiBCYWR1bGVzY3UgPGlvbnV0QGNzLmNvbHVtYmlhLmVkdT4pCisJLSBTdXBwb3J0IGhhcmR3YXJlIFJ4L1R4IGNoZWNrc3VtbWluZworCS0gVXNlIHRoZSBHRlAgZmlybXdhcmUgdGFrZW4gZnJvbSBBZGFwdGVjJ3MgTmV0d2FyZSBkcml2ZXIKKworCUxLMS4yLjIgKElvbiBCYWR1bGVzY3UpCisJLSBCYWNrcG9ydGVkIHRvIDIuMi54CisKKwlMSzEuMi4zIChJb24gQmFkdWxlc2N1KQorCS0gRml4IHRoZSBmbGFreSBtZGlvIGludGVyZmFjZQorCS0gTW9yZSBjb21wYXQgY2xlYW4tdXBzCisKKwlMSzEuMi40IChJb24gQmFkdWxlc2N1KQorCS0gTW9yZSAyLjIueCBpbml0aWFsaXphdGlvbiBmaXhlcworCisJTEsxLjIuNSAoSW9uIEJhZHVsZXNjdSkKKwktIFNldmVyYWwgZml4ZXMgZnJvbSBNYW5mcmVkIFNwcmF1bAorCisJTEsxLjIuNiAoSW9uIEJhZHVsZXNjdSkKKwktIEZpeGVkIGlmdXAvaWZkb3duL2lmdXAgcHJvYmxlbSBpbiAyLjQueAorCisJTEsxLjIuNyAoSW9uIEJhZHVsZXNjdSkKKwktIFJlbW92ZWQgdW51c2VkIGNvZGUKKwktIE1hZGUgbW9yZSBmdW5jdGlvbnMgc3RhdGljIGFuZCBfX2luaXQKKworCUxLMS4yLjggKElvbiBCYWR1bGVzY3UpCisJLSBRdWVsbCBib2d1cyBlcnJvciBtZXNzYWdlcywgaW5mb3JtIGFib3V0IHRoZSBUeCB0aHJlc2hvbGQKKwktIFJlbW92ZWQgI2lmZGVmIENPTkZJR19QQ0ksIHRoaXMgZHJpdmVyIGlzIFBDSSBvbmx5CisKKwlMSzEuMi45IChJb24gQmFkdWxlc2N1KQorCS0gTWVyZ2VkIEplZmYgR2FyemlrJ3MgY2hhbmdlcyBmcm9tIDIuNC40LXByZTUKKwktIEFkZGVkIDIuMi54IGNvbXBhdGliaWxpdHkgc3R1ZmYgcmVxdWlyZWQgYnkgdGhlIGFib3ZlIGNoYW5nZXMKKworCUxLMS4yLjlhIChJb24gQmFkdWxlc2N1KQorCS0gTW9yZSB1cGRhdGVzIGZyb20gSmVmZiBHYXJ6aWsKKworCUxLMS4zLjAgKElvbiBCYWR1bGVzY3UpCisJLSBNZXJnZWQgemVyb2NvcHkgc3VwcG9ydAorCisJTEsxLjMuMSAoSW9uIEJhZHVsZXNjdSkKKwktIEFkZGVkIGV0aHRvb2wgc3VwcG9ydAorCS0gQWRkZWQgR1BJTyAobWVkaWEgY2hhbmdlKSBpbnRlcnJ1cHQgc3VwcG9ydAorCisJTEsxLjMuMiAoSW9uIEJhZHVsZXNjdSkKKwktIEZpeGVkIDIuMi54IGNvbXBhdGliaWxpdHkgaXNzdWVzIGludHJvZHVjZWQgaW4gMS4zLjEKKwktIEZpeGVkIGV0aHRvb2wgaW9jdGwgcmV0dXJuaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5CisKKwlMSzEuMy4zIChJb24gQmFkdWxlc2N1KQorCS0gSW5pdGlhbGl6ZSB0aGUgVHhNb2RlIHJlZ2lzdGVyIHByb3Blcmx5CisJLSBEb24ndCBkZXJlZmVyZW5jZSBkZXYtPnByaXYgYWZ0ZXIgZnJlZWluZyBpdAorCisJTEsxLjMuNCAoSW9uIEJhZHVsZXNjdSkKKwktIEZpeGVkIGluaXRpYWxpemF0aW9uIHRpbWluZyBwcm9ibGVtcworCS0gRml4ZWQgaW50ZXJydXB0IG1hc2sgZGVmaW5pdGlvbnMKKworCUxLMS4zLjUgKGpnYXJ6aWspCisJLSBldGh0b29sIE5XQVlfUlNULCBHTElOSywgW0dTXU1TR0xWTCBzdXBwb3J0CisKKwlMSzEuMy42OgorCS0gU3BhcmM2NCBzdXBwb3J0IGFuZCBmaXhlcyAoSW9uIEJhZHVsZXNjdSkKKwktIEJldHRlciBzdGF0cyBhbmQgZXJyb3IgaGFuZGxpbmcgKElvbiBCYWR1bGVzY3UpCisJLSBVc2UgbmV3IHBjaV9zZXRfbXdpKCkgUENJIEFQSSBmdW5jdGlvbiAoamdhcnppaykKKworCUxLMS4zLjcgKElvbiBCYWR1bGVzY3UpCisJLSBtaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mIHR4X3RpbWVvdXQoKQorCS0gY29ycmVjdGx5IHNodXRkb3duIHRoZSBSeC9UeCBlbmdpbmVzIGluIG5ldGRldl9jbG9zZSgpCisJLSBhZGRlZCBjYWxscyB0byBuZXRpZl9jYXJyaWVyX29uL29mZgorCShwYXRjaCBmcm9tIFN0ZWZhbiBSb21wZiA8c3JvbXBmQGlzZy5kZT4pCisJLSBWTEFOIHN1cHBvcnQKKworCUxLMS4zLjggKElvbiBCYWR1bGVzY3UpCisJLSBhZGp1c3QgRE1BIGJ1cnN0IHNpemUgb24gc3BhcmM2NAorCS0gNjQtYml0IHN1cHBvcnQKKwktIHJld29ya2VkIHplcm9jb3B5IHN1cHBvcnQgZm9yIDY0LWJpdCBidWZmZXJzCisJLSB3b3JraW5nIGFuZCB1c2FibGUgaW50ZXJydXB0IG1pdGlnYXRpb24vbGF0ZW5jeQorCS0gcmVkdWNlZCBUeCBpbnRlcnJ1cHQgZnJlcXVlbmN5IGZvciBsb3dlciBpbnRlcnJ1cHQgb3ZlcmhlYWQKKworCUxLMS4zLjkgKElvbiBCYWR1bGVzY3UpCisJLSBidWdmaXggZm9yIG1jYXN0IGZpbHRlcgorCS0gZW5hYmxlIHRoZSByaWdodCBraW5kIG9mIFR4IGludGVycnVwdHMgKFR4RE1BRG9uZSwgbm90IFR4RG9uZSkKKworCUxLMS40LjAgKElvbiBCYWR1bGVzY3UpCisJLSBOQVBJIHN1cHBvcnQKKworCUxLMS40LjEgKElvbiBCYWR1bGVzY3UpCisJLSBmbHVzaCBQQ0kgcG9zdGluZyBidWZmZXJzIGFmdGVyIGRpc2FibGluZyBSeCBpbnRlcnJ1cHRzCisJLSBwdXQgdGhlIGNoaXAgdG8gYSBEMyBzbHVtYmVyIG9uIGRyaXZlciB1bmxvYWQKKwktIGFkZGVkIGNvbmZpZyBvcHRpb24gdG8gZW5hYmxlL2Rpc2FibGUgTkFQSQorCitUT0RPOglidWdmaXhlcyAobm8gYnVncyBrbm93biBhcyBvZiByaWdodCBub3cpCisqLworCisjZGVmaW5lIERSVl9OQU1FCSJzdGFyZmlyZSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMDMrTEsxLjQuMSIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIkZlYnJ1YXJ5IDEwLCAyMDAyIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkJLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKgorICogQWRhcHRlYydzIGxpY2Vuc2UgZm9yIHRoZWlyIGRyaXZlcnMgKHdoaWNoIGlzIHdoZXJlIEkgZ290IHRoZQorICogZmlybXdhcmUgZmlsZXMpIGRvZXMgbm90IGFsbG93IG9uZSB0byByZWRpc3RyaWJ1dGUgdGhlbS4gVGh1cywgd2UgY2FuJ3QKKyAqIGluY2x1ZGUgdGhlIGZpcm13YXJlIHdpdGggdGhpcyBkcml2ZXIuCisgKgorICogSG93ZXZlciwgc2hvdWxkIGEgbGVnYWwtdG8tZGlzdHJpYnV0ZSBmaXJtd2FyZSBiZWNvbWUgYXZhaWxhYmxlLAorICogdGhlIGRyaXZlciBkZXZlbG9wZXIgd291bGQgbmVlZCBvbmx5IHRvIG9idGFpbiB0aGUgZmlybXdhcmUgaW4gdGhlCisgKiBmb3JtIG9mIGEgQyBoZWFkZXIgZmlsZS4KKyAqIE9uY2UgdGhhdCdzIGRvbmUsIHRoZSAjdW5kZWYgYmVsb3cgbXVzdCBiZSBjaGFuZ2VkIGludG8gYSAjZGVmaW5lCisgKiBmb3IgdGhpcyBkcml2ZXIgdG8gcmVhbGx5IHVzZSB0aGUgZmlybXdhcmUuIE5vdGUgdGhhdCBSeC9UeAorICogaGFyZHdhcmUgVENQIGNoZWNrc3VtbWluZyBpcyBub3QgcG9zc2libGUgd2l0aG91dCB0aGUgZmlybXdhcmUuCisgKgorICogV0FOVEVEOiBsZWdhbCBmaXJtd2FyZSB0byBpbmNsdWRlIHdpdGggdGhpcyBHUEwnZCBkcml2ZXIuCisgKi8KKyN1bmRlZiBIQVNfRklSTVdBUkUKKy8qCisgKiBUaGUgY3VycmVudCBmcmFtZSBwcm9jZXNzb3IgZmlybXdhcmUgZmFpbHMgdG8gY2hlY2tzdW0gYSBmcmFnbWVudAorICogb2YgbGVuZ3RoIDEuIElmIGFuZCB3aGVuIHRoaXMgaXMgZml4ZWQsIHRoZSAjZGVmaW5lIGJlbG93IGNhbiBiZSByZW1vdmVkLgorICovCisjZGVmaW5lIEhBU19CUk9LRU5fRklSTVdBUkUKKy8qCisgKiBEZWZpbmUgdGhpcyBpZiB1c2luZyB0aGUgZHJpdmVyIHdpdGggdGhlIHplcm8tY29weSBwYXRjaAorICovCisjaWYgZGVmaW5lZChIQVNfRklSTVdBUkUpICYmIGRlZmluZWQoTUFYX1NLQl9GUkFHUykKKyNkZWZpbmUgWkVST0NPUFkKKyNlbmRpZgorCisjaWZkZWYgSEFTX0ZJUk1XQVJFCisjaW5jbHVkZSAic3RhcmZpcmVfZmlybXdhcmUuaCIKKyNlbmRpZiAvKiBIQVNfRklSTVdBUkUgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2RlZmluZSBWTEFOX1NVUFBPUlQKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19BREFQVEVDX1NUQVJGSVJFX05BUEkKKyN1bmRlZiBIQVZFX05FVERFVl9QT0xMCisjZW5kaWYKKworLyogVGhlIHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4KKyAgIFRoZXNlIG1heSBiZSBtb2RpZmllZCB3aGVuIGEgZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQuKi8KKworLyogVXNlZCBmb3IgdHVuaW5nIGludGVycnVwdCBsYXRlbmN5IHZzLiBvdmVyaGVhZC4gKi8KK3N0YXRpYyBpbnQgaW50cl9sYXRlbmN5Oworc3RhdGljIGludCBzbWFsbF9mcmFtZXM7CisKK3N0YXRpYyBpbnQgZGVidWcgPSAxOwkJCS8qIDEgbm9ybWFsIG1lc3NhZ2VzLCAwIHF1aWV0IC4uIDcgdmVyYm9zZS4gKi8KK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gMjA7CitzdGF0aWMgaW50IG10dTsKKy8qIE1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gZmlsdGVyICh2cy4gcngtYWxsLW11bHRpY2FzdCkuCisgICBUaGUgU3RhcmZpcmUgaGFzIGEgNTEyIGVsZW1lbnQgaGFzaCB0YWJsZSBiYXNlZCBvbiB0aGUgRXRoZXJuZXQgQ1JDLiAqLworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gNTEyOworLyogV2hldGhlciB0byBkbyBUQ1AvVURQIGNoZWNrc3VtcyBpbiBoYXJkd2FyZSAqLworI2lmZGVmIEhBU19GSVJNV0FSRQorc3RhdGljIGludCBlbmFibGVfaHdfY2tzdW0gPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgZW5hYmxlX2h3X2Nrc3VtID0gMDsKKyNlbmRpZgorCisjZGVmaW5lIFBLVF9CVUZfU1oJMTUzNgkJLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIuKi8KKy8qCisgKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWZyYW1lcyBzY2hlbWUuCisgKiBTZXR0aW5nIHRvID4gMTUxOCBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuCisgKgorICogTk9URToKKyAqIFRoZSBpYTY0IGRvZXNuJ3QgYWxsb3cgZm9yIHVuYWxpZ25lZCBsb2FkcyBldmVuIG9mIGludGVnZXJzIGJlaW5nCisgKiBtaXNhbGlnbmVkIG9uIGEgMiBieXRlIGJvdW5kYXJ5LiBUaHVzIGFsd2F5cyBmb3JjZSBjb3B5aW5nIG9mCisgKiBwYWNrZXRzIGFzIHRoZSBzdGFyZmlyZSBkb2Vzbid0IGFsbG93IGZvciBtaXNhbGlnbmVkIERNQXMgOy0oCisgKiAyMy8xMC8yMDAwIC0gSmVzCisgKgorICogVGhlIEFscGhhIGFuZCB0aGUgU3BhcmMgZG9uJ3QgbGlrZSB1bmFsaWduZWQgbG9hZHMsIGVpdGhlci4gT24gU3BhcmM2NCwKKyAqIGF0IGxlYXN0LCBoYXZpbmcgdW5hbGlnbmVkIGZyYW1lcyBsZWFkcyB0byBhIHJhdGhlciBzZXJpb3VzIHBlcmZvcm1hbmNlCisgKiBwZW5hbHR5LiAtSW9uCisgKi8KKyNpZiBkZWZpbmVkKF9faWE2NF9fKSB8fCBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3NwYXJjX18pCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IFBLVF9CVUZfU1o7CisjZWxzZQorc3RhdGljIGludCByeF9jb3B5YnJlYWsgLyogPSAwICovOworI2VuZGlmCisKKy8qIFBDSSBETUEgYnVyc3Qgc2l6ZSAtLSBvbiBzcGFyYzY0IHdlIHdhbnQgdG8gZm9yY2UgaXQgdG8gNjQgYnl0ZXMsIG9uIHRoZSBvdGhlcnMgdGhlIGRlZmF1bHQgb2YgMTI4IGlzIGZpbmUuICovCisjaWZkZWYgX19zcGFyY19fCisjZGVmaW5lIERNQV9CVVJTVF9TSVpFIDY0CisjZWxzZQorI2RlZmluZSBETUFfQlVSU1RfU0laRSAxMjgKKyNlbmRpZgorCisvKiBVc2VkIHRvIHBhc3MgdGhlIG1lZGlhIHR5cGUsIGV0Yy4KKyAgIEJvdGggJ29wdGlvbnNbXScgYW5kICdmdWxsX2R1cGxleFtdJyBleGlzdCBmb3IgZHJpdmVyIGludGVyb3BlcmFiaWxpdHkuCisgICBUaGUgbWVkaWEgdHlwZSBpcyB1c3VhbGx5IHBhc3NlZCBpbiAnb3B0aW9uc1tdJy4KKyAgIFRoZXNlIHZhcmlhYmxlcyBhcmUgZGVwcmVjYXRlZCwgdXNlIGV0aHRvb2wgaW5zdGVhZC4gLUlvbgorKi8KKyNkZWZpbmUgTUFYX1VOSVRTIDgJCS8qIE1vcmUgYXJlIHN1cHBvcnRlZCwgbGltaXQgb25seSBvbiBvcHRpb25zICovCitzdGF0aWMgaW50IG9wdGlvbnNbTUFYX1VOSVRTXSA9IHswLCB9Oworc3RhdGljIGludCBmdWxsX2R1cGxleFtNQVhfVU5JVFNdID0gezAsIH07CisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZS4gKi8KKworLyogVGhlICJuYXRpdmUiIHJpbmcgc2l6ZXMgYXJlIGVpdGhlciAyNTYgb3IgMjA0OC4KKyAgIEhvd2V2ZXIgaW4gc29tZSBtb2RlcyBhIGRlc2NyaXB0b3IgbWF5IGJlIG1hcmtlZCB0byB3cmFwIHRoZSByaW5nIGVhcmxpZXIuCisqLworI2RlZmluZSBSWF9SSU5HX1NJWkUJMjU2CisjZGVmaW5lIFRYX1JJTkdfU0laRQkzMgorLyogVGhlIGNvbXBsZXRpb24gcXVldWVzIGFyZSBmaXhlZCBhdCAxMDI0IGVudHJpZXMgaS5lLiA0SyBvciA4S0IuICovCisjZGVmaW5lIERPTkVfUV9TSVpFCTEwMjQKKy8qIEFsbCBxdWV1ZXMgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMjU2LWJ5dGUgYm91bmRhcnkgKi8KKyNkZWZpbmUgUVVFVUVfQUxJR04JMjU2CisKKyNpZiBSWF9SSU5HX1NJWkUgPiAyNTYKKyNkZWZpbmUgUlhfUV9FTlRSSUVTIFJ4MjA0OFFFbnRyaWVzCisjZWxzZQorI2RlZmluZSBSWF9RX0VOVFJJRVMgUngyNTZRRW50cmllcworI2VuZGlmCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVAkoMiAqIEhaKQorCisvKgorICogVGhpcyBTVUNLUy4KKyAqIFdlIG5lZWQgYSBtdWNoIGJldHRlciBtZXRob2QgdG8gZGV0ZXJtaW5lIGlmIGRtYV9hZGRyX3QgaXMgNjQtYml0LgorICovCisjaWYgKGRlZmluZWQoX19pMzg2X18pICYmIGRlZmluZWQoQ09ORklHX0hJR0hNRU0pICYmIChMSU5VWF9WRVJTSU9OX0NPREUgPiAweDIwNTAwIHx8IGRlZmluZWQoQ09ORklHX0hJR0hNRU02NEcpKSkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkIChfX2lhNjRfXykgfHwgZGVmaW5lZChfX21pcHM2NF9fKSB8fCAoZGVmaW5lZChfX21pcHNfXykgJiYgZGVmaW5lZChDT05GSUdfSElHSE1FTSkgJiYgZGVmaW5lZChDT05GSUdfNjRCSVRfUEhZU19BRERSKSkKKy8qIDY0LWJpdCBkbWFfYWRkcl90ICovCisjZGVmaW5lIEFERFJfNjRCSVRTCS8qIFRoaXMgY2hpcCB1c2VzIDY0IGJpdCBhZGRyZXNzZXMuICovCisjZGVmaW5lIGNwdV90b19kbWEoeCkgY3B1X3RvX2xlNjQoeCkKKyNkZWZpbmUgZG1hX3RvX2NwdSh4KSBsZTY0X3RvX2NwdSh4KQorI2RlZmluZSBSWF9ERVNDX1FfQUREUl9TSVpFIFJ4RGVzY1FBZGRyNjRiaXQKKyNkZWZpbmUgVFhfREVTQ19RX0FERFJfU0laRSBUeERlc2NRQWRkcjY0Yml0CisjZGVmaW5lIFJYX0NPTVBMX1FfQUREUl9TSVpFIFJ4Q29tcGxRQWRkcjY0Yml0CisjZGVmaW5lIFRYX0NPTVBMX1FfQUREUl9TSVpFIFR4Q29tcGxRQWRkcjY0Yml0CisjZGVmaW5lIFJYX0RFU0NfQUREUl9TSVpFIFJ4RGVzY0FkZHI2NGJpdAorI2Vsc2UgIC8qIDMyLWJpdCBkbWFfYWRkcl90ICovCisjZGVmaW5lIGNwdV90b19kbWEoeCkgY3B1X3RvX2xlMzIoeCkKKyNkZWZpbmUgZG1hX3RvX2NwdSh4KSBsZTMyX3RvX2NwdSh4KQorI2RlZmluZSBSWF9ERVNDX1FfQUREUl9TSVpFIFJ4RGVzY1FBZGRyMzJiaXQKKyNkZWZpbmUgVFhfREVTQ19RX0FERFJfU0laRSBUeERlc2NRQWRkcjMyYml0CisjZGVmaW5lIFJYX0NPTVBMX1FfQUREUl9TSVpFIFJ4Q29tcGxRQWRkcjMyYml0CisjZGVmaW5lIFRYX0NPTVBMX1FfQUREUl9TSVpFIFR4Q29tcGxRQWRkcjMyYml0CisjZGVmaW5lIFJYX0RFU0NfQUREUl9TSVpFIFJ4RGVzY0FkZHIzMmJpdAorI2VuZGlmCisKKyNpZmRlZiBNQVhfU0tCX0ZSQUdTCisjZGVmaW5lIHNrYl9maXJzdF9mcmFnX2xlbihza2IpCXNrYl9oZWFkbGVuKHNrYikKKyNkZWZpbmUgc2tiX251bV9mcmFncyhza2IpIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMSkKKyNlbHNlICAvKiBub3QgTUFYX1NLQl9GUkFHUyAqLworI2RlZmluZSBza2JfZmlyc3RfZnJhZ19sZW4oc2tiKQkoc2tiLT5sZW4pCisjZGVmaW5lIHNrYl9udW1fZnJhZ3Moc2tiKSAxCisjZW5kaWYgLyogbm90IE1BWF9TS0JfRlJBR1MgKi8KKworLyogMi4yLnggY29tcGF0aWJpbGl0eSBjb2RlICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgMHgyMDMwMAorCisjaW5jbHVkZSAic3RhcmZpcmUta2NvbXAyMi5oIgorCisjZWxzZSAgLyogTElOVVhfVkVSU0lPTl9DT0RFID4gMHgyMDMwMCAqLworCisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisKKyNkZWZpbmUgaW5pdF90eF90aW1lcihkZXYsIGZ1bmMsIHRpbWVvdXQpIFwKKwlkZXYtPnR4X3RpbWVvdXQgPSBmdW5jOyBcCisJZGV2LT53YXRjaGRvZ190aW1lbyA9IHRpbWVvdXQ7CisjZGVmaW5lIGtpY2tfdHhfdGltZXIoZGV2LCBmdW5jLCB0aW1lb3V0KQorCisjZGVmaW5lIG5ldGlmX3N0YXJ0X2lmKGRldikKKyNkZWZpbmUgbmV0aWZfc3RvcF9pZihkZXYpCisKKyNkZWZpbmUgUENJX1NMT1RfTkFNRShwY2lfZGV2KQlwY2lfbmFtZShwY2lfZGV2KQorCisjZW5kaWYgLyogTElOVVhfVkVSU0lPTl9DT0RFID4gMHgyMDMwMCAqLworCisjaWZkZWYgSEFWRV9ORVRERVZfUE9MTAorI2RlZmluZSBpbml0X3BvbGwoZGV2KSBcCisJZGV2LT5wb2xsID0gJm5ldGRldl9wb2xsOyBcCisJZGV2LT53ZWlnaHQgPSBtYXhfaW50ZXJydXB0X3dvcms7CisjZGVmaW5lIG5ldGRldl9yeChkZXYsIGlvYWRkcikgXAorZG8geyBcCisJdTMyIGludHJfZW5hYmxlOyBcCisJaWYgKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgeyBcCisJCV9fbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsgXAorCQlpbnRyX2VuYWJsZSA9IHJlYWRsKGlvYWRkciArIEludHJFbmFibGUpOyBcCisJCWludHJfZW5hYmxlICY9IH4oSW50clJ4RG9uZSB8IEludHJSeEVtcHR5KTsgXAorCQl3cml0ZWwoaW50cl9lbmFibGUsIGlvYWRkciArIEludHJFbmFibGUpOyBcCisJCXJlYWRsKGlvYWRkciArIEludHJFbmFibGUpOyAvKiBmbHVzaCBQQ0kgcG9zdGluZyBidWZmZXJzICovIFwKKwl9IGVsc2UgeyBcCisJCS8qIFBhcmFub2lhIGNoZWNrICovIFwKKwkJaW50cl9lbmFibGUgPSByZWFkbChpb2FkZHIgKyBJbnRyRW5hYmxlKTsgXAorCQlpZiAoaW50cl9lbmFibGUgJiAoSW50clJ4RG9uZSB8IEludHJSeEVtcHR5KSkgeyBcCisJCQlwcmludGsoIiVzOiBpbnRlcnJ1cHQgd2hpbGUgaW4gcG9sbGluZyBtb2RlIVxuIiwgZGV2LT5uYW1lKTsgXAorCQkJaW50cl9lbmFibGUgJj0gfihJbnRyUnhEb25lIHwgSW50clJ4RW1wdHkpOyBcCisJCQl3cml0ZWwoaW50cl9lbmFibGUsIGlvYWRkciArIEludHJFbmFibGUpOyBcCisJCX0gXAorCX0gXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgbmV0ZGV2X3JlY2VpdmVfc2tiKHNrYikgbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKQorI2RlZmluZSB2bGFuX25ldGRldl9yZWNlaXZlX3NrYihza2IsIHZsZ3JwLCB2bGlkKSB2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCB2bGdycCwgdmxpZCkKK3N0YXRpYyBpbnQJbmV0ZGV2X3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpOworI2Vsc2UgIC8qIG5vdCBIQVZFX05FVERFVl9QT0xMICovCisjZGVmaW5lIGluaXRfcG9sbChkZXYpCisjZGVmaW5lIG5ldGRldl9yZWNlaXZlX3NrYihza2IpIG5ldGlmX3J4KHNrYikKKyNkZWZpbmUgdmxhbl9uZXRkZXZfcmVjZWl2ZV9za2Ioc2tiLCB2bGdycCwgdmxpZCkgdmxhbl9od2FjY2VsX3J4KHNrYiwgdmxncnAsIHZsaWQpCisjZGVmaW5lIG5ldGRldl9yeChkZXYsIGlvYWRkcikgXAorZG8geyBcCisJaW50IHF1b3RhID0gbnAtPmRpcnR5X3J4ICsgUlhfUklOR19TSVpFIC0gbnAtPmN1cl9yeDsgXAorCV9fbmV0ZGV2X3J4KGRldiwgJnF1b3RhKTtcCit9IHdoaWxlICgwKQorI2VuZGlmIC8qIG5vdCBIQVZFX05FVERFVl9QT0xMICovCisvKiBlbmQgb2YgY29tcGF0aWJpbGl0eSBjb2RlICovCisKKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KK0tFUk5fSU5GTyAic3RhcmZpcmUuYzp2MS4wMyA3LzI2LzIwMDAgIFdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT5cbiIKK0tFUk5fSU5GTyAiICh1bm9mZmljaWFsIDIuMi8yLjQga2VybmVsIHBvcnQsIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiLCAiIERSVl9SRUxEQVRFICIpXG4iOworCitNT0RVTEVfQVVUSE9SKCJEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBZGFwdGVjIFN0YXJmaXJlIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0obWF4X2ludGVycnVwdF93b3JrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG10dSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaW50cl9sYXRlbmN5LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNtYWxsX2ZyYW1lcywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKGVuYWJsZV9od19ja3N1bSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2ludGVycnVwdF93b3JrLCAiTWF4aW11bSBldmVudHMgaGFuZGxlZCBwZXIgaW50ZXJydXB0Iik7CitNT0RVTEVfUEFSTV9ERVNDKG10dSwgIk1UVSAoYWxsIGJvYXJkcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMC02KSIpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICJDb3B5IGJyZWFrcG9pbnQgZm9yIGNvcHktb25seS10aW55LWZyYW1lcyIpOworTU9EVUxFX1BBUk1fREVTQyhpbnRyX2xhdGVuY3ksICJNYXhpbXVtIGludGVycnVwdCBsYXRlbmN5LCBpbiBtaWNyb3NlY29uZHMiKTsKK01PRFVMRV9QQVJNX0RFU0Moc21hbGxfZnJhbWVzLCAiTWF4aW11bSBzaXplIG9mIHJlY2VpdmUgZnJhbWVzIHRoYXQgYnlwYXNzIGludGVycnVwdCBsYXRlbmN5ICgwLDY0LDEyOCwyNTYsNTEyKSIpOworTU9EVUxFX1BBUk1fREVTQyhvcHRpb25zLCAiRGVwcmVjYXRlZDogQml0cyAwLTM6IG1lZGlhIHR5cGUsIGJpdCAxNzogZnVsbCBkdXBsZXgiKTsKK01PRFVMRV9QQVJNX0RFU0MoZnVsbF9kdXBsZXgsICJEZXByZWNhdGVkOiBGb3JjZWQgZnVsbC1kdXBsZXggc2V0dGluZyAoMC8xKSIpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfaHdfY2tzdW0sICJFbmFibGUvZGlzYWJsZSBoYXJkd2FyZSBja3N1bSBzdXBwb3J0ICgwLzEpIik7CisKKy8qCisJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCitJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisKK1RoaXMgZHJpdmVyIGlzIGZvciB0aGUgQWRhcHRlYyA2OTE1ICJTdGFyZmlyZSIgNjQgYml0IFBDSSBFdGhlcm5ldCBhZGFwdGVyLgorCitJSS4gQm9hcmQtc3BlY2lmaWMgc2V0dGluZ3MKKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK0lJSWEuIFJpbmcgYnVmZmVycworCitUaGUgU3RhcmZpcmUgaGFyZHdhcmUgdXNlcyBtdWx0aXBsZSBmaXhlZC1zaXplIGRlc2NyaXB0b3IgcXVldWVzL3JpbmdzLiAgVGhlCityaW5nIHNpemVzIGFyZSBzZXQgZml4ZWQgYnkgdGhlIGhhcmR3YXJlLCBidXQgbWF5IG9wdGlvbmFsbHkgYmUgd3JhcHBlZAorZWFybGllciBieSB0aGUgRU5EIGJpdCBpbiB0aGUgZGVzY3JpcHRvci4KK1RoaXMgZHJpdmVyIHVzZXMgdGhhdCBoYXJkd2FyZSBxdWV1ZSBzaXplIGZvciB0aGUgUnggcmluZywgd2hlcmUgYSBsYXJnZQorbnVtYmVyIG9mIGVudHJpZXMgaGFzIG5vIGlsbCBlZmZlY3QgYmV5b25kIGluY3JlYXNlcyB0aGUgcG90ZW50aWFsIGJhY2tsb2cuCitUaGUgVHggcmluZyBpcyB3cmFwcGVkIHdpdGggdGhlIEVORCBiaXQsIHNpbmNlIGEgbGFyZ2UgaGFyZHdhcmUgVHggcXVldWUKK2Rpc2FibGVzIHRoZSBxdWV1ZSBsYXllciBwcmlvcml0eSBvcmRlcmluZyBhbmQgd2UgaGF2ZSBubyBtZWNoYW5pc20gdG8KK3V0aWxpemUgdGhlIGhhcmR3YXJlIHR3by1sZXZlbCBwcmlvcml0eSBxdWV1ZS4gIFdoZW4gbW9kaWZ5aW5nIHRoZQorUlgvVFhfUklOR19TSVpFIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gcGFnZSBzaXplcyBhbmQgdGhlIHJpbmctZW1wdHkgd2FybmluZworbGV2ZWxzLgorCitJSUliL2MuIFRyYW5zbWl0L1JlY2VpdmUgU3RydWN0dXJlCisKK1NlZSB0aGUgQWRhcHRlYyBtYW51YWwgZm9yIHRoZSBtYW55IHBvc3NpYmxlIHN0cnVjdHVyZXMsIGFuZCBvcHRpb25zIGZvcgorZWFjaCBzdHJ1Y3R1cmUuICBUaGVyZSBhcmUgZmFyIHRvbyBtYW55IHRvIGRvY3VtZW50IGFsbCBvZiB0aGVtIGhlcmUuCisKK0ZvciB0cmFuc21pdCB0aGlzIGRyaXZlciB1c2VzIHR5cGUgMC8xIHRyYW5zbWl0IGRlc2NyaXB0b3JzIChkZXBlbmRpbmcKK29uIHRoZSAzMi82NCBiaXRuZXNzIG9mIHRoZSBhcmNoaXRlY3R1cmUpLCBhbmQgcmVsaWVzIG9uIGF1dG9tYXRpYworbWluaW11bS1sZW5ndGggcGFkZGluZy4gIEl0IGRvZXMgbm90IHVzZSB0aGUgY29tcGxldGlvbiBxdWV1ZQorY29uc3VtZXIgaW5kZXgsIGJ1dCBpbnN0ZWFkIGNoZWNrcyBmb3Igbm9uLXplcm8gc3RhdHVzIGVudHJpZXMuCisKK0ZvciByZWNlaXZlIHRoaXMgZHJpdmVyIHVzZXMgdHlwZSAwLzEvMi8zIHJlY2VpdmUgZGVzY3JpcHRvcnMuICBUaGUgZHJpdmVyCithbGxvY2F0ZXMgZnVsbCBmcmFtZSBzaXplIHNrYnVmZnMgZm9yIHRoZSBSeCByaW5nIGJ1ZmZlcnMsIHNvIGFsbCBmcmFtZXMKK3Nob3VsZCBmaXQgaW4gYSBzaW5nbGUgZGVzY3JpcHRvci4gIFRoZSBkcml2ZXIgZG9lcyBub3QgdXNlIHRoZSBjb21wbGV0aW9uCitxdWV1ZSBjb25zdW1lciBpbmRleCwgYnV0IGluc3RlYWQgY2hlY2tzIGZvciBub24temVybyBzdGF0dXMgZW50cmllcy4KKworV2hlbiBhbiBpbmNvbWluZyBmcmFtZSBpcyBsZXNzIHRoYW4gUlhfQ09QWUJSRUFLIGJ5dGVzIGxvbmcsIGEgZnJlc2ggc2tidWZmCitpcyBhbGxvY2F0ZWQgYW5kIHRoZSBmcmFtZSBpcyBjb3BpZWQgdG8gdGhlIG5ldyBza2J1ZmYuICBXaGVuIHRoZSBpbmNvbWluZworZnJhbWUgaXMgbGFyZ2VyLCB0aGUgc2tidWZmIGlzIHBhc3NlZCBkaXJlY3RseSB1cCB0aGUgcHJvdG9jb2wgc3RhY2suCitCdWZmZXJzIGNvbnN1bWVkIHRoaXMgd2F5IGFyZSByZXBsYWNlZCBieSBuZXdseSBhbGxvY2F0ZWQgc2tidWZmcyBpbiBhIGxhdGVyCitwaGFzZSBvZiByZWNlaXZlLgorCitBIG5vdGFibGUgYXNwZWN0IG9mIG9wZXJhdGlvbiBpcyB0aGF0IHVuYWxpZ25lZCBidWZmZXJzIGFyZSBub3QgcGVybWl0dGVkIGJ5Cit0aGUgU3RhcmZpcmUgaGFyZHdhcmUuICBUaHVzIHRoZSBJUCBoZWFkZXIgYXQgb2Zmc2V0IDE0IGluIGFuIGV0aGVybmV0IGZyYW1lCitpc24ndCBsb25nd29yZCBhbGlnbmVkLCB3aGljaCBtYXkgY2F1c2UgcHJvYmxlbXMgb24gc29tZSBtYWNoaW5lCitlLmcuIEFscGhhcyBhbmQgSUE2NC4gRm9yIHRoZXNlIGFyY2hpdGVjdHVyZXMsIHRoZSBkcml2ZXIgaXMgZm9yY2VkIHRvIGNvcHkKK3RoZSBmcmFtZSBpbnRvIGEgbmV3IHNrYnVmZiB1bmNvbmRpdGlvbmFsbHkuIENvcGllZCBmcmFtZXMgYXJlIHB1dCBpbnRvIHRoZQorc2tidWZmIGF0IGFuIG9mZnNldCBvZiAiKzIiLCB0aHVzIDE2LWJ5dGUgYWxpZ25pbmcgdGhlIElQIGhlYWRlci4KKworSUlJZC4gU3luY2hyb25pemF0aW9uCisKK1RoZSBkcml2ZXIgcnVucyBhcyB0d28gaW5kZXBlbmRlbnQsIHNpbmdsZS10aHJlYWRlZCBmbG93cyBvZiBjb250cm9sLiAgT25lCitpcyB0aGUgc2VuZC1wYWNrZXQgcm91dGluZSwgd2hpY2ggZW5mb3JjZXMgc2luZ2xlLXRocmVhZGVkIHVzZSBieSB0aGUKK2Rldi0+dGJ1c3kgZmxhZy4gIFRoZSBvdGhlciB0aHJlYWQgaXMgdGhlIGludGVycnVwdCBoYW5kbGVyLCB3aGljaCBpcyBzaW5nbGUKK3RocmVhZGVkIGJ5IHRoZSBoYXJkd2FyZSBhbmQgaW50ZXJydXB0IGhhbmRsaW5nIHNvZnR3YXJlLgorCitUaGUgc2VuZCBwYWNrZXQgdGhyZWFkIGhhcyBwYXJ0aWFsIGNvbnRyb2wgb3ZlciB0aGUgVHggcmluZyBhbmQgdGhlIG5ldGlmX3F1ZXVlCitzdGF0dXMuIElmIHRoZSBudW1iZXIgb2YgZnJlZSBUeCBzbG90cyBpbiB0aGUgcmluZyBmYWxscyBiZWxvdyBhIGNlcnRhaW4gbnVtYmVyCisoY3VycmVudGx5IGhhcmRjb2RlZCB0byA0KSwgaXQgc2lnbmFscyB0aGUgdXBwZXIgbGF5ZXIgdG8gc3RvcCB0aGUgcXVldWUuCisKK1RoZSBpbnRlcnJ1cHQgaGFuZGxlciBoYXMgZXhjbHVzaXZlIGNvbnRyb2wgb3ZlciB0aGUgUnggcmluZyBhbmQgcmVjb3JkcyBzdGF0cworZnJvbSB0aGUgVHggcmluZy4gIEFmdGVyIHJlYXBpbmcgdGhlIHN0YXRzLCBpdCBtYXJrcyB0aGUgVHggcXVldWUgZW50cnkgYXMKK2VtcHR5IGJ5IGluY3JlbWVudGluZyB0aGUgZGlydHlfdHggbWFyay4gSWZmIHRoZSBuZXRpZl9xdWV1ZSBpcyBzdG9wcGVkIGFuZCB0aGUKK251bWJlciBvZiBmcmVlIFR4IHNsb3cgaXMgYWJvdmUgdGhlIHRocmVzaG9sZCwgaXQgc2lnbmFscyB0aGUgdXBwZXIgbGF5ZXIgdG8KK3Jlc3RhcnQgdGhlIHF1ZXVlLgorCitJVi4gTm90ZXMKKworSVZiLiBSZWZlcmVuY2VzCisKK1RoZSBBZGFwdGVjIFN0YXJmaXJlIG1hbnVhbHMsIGF2YWlsYWJsZSBvbmx5IGZyb20gQWRhcHRlYy4KK2h0dHA6Ly93d3cuc2N5bGQuY29tL2V4cGVydC8xMDBtYnBzLmh0bWwKK2h0dHA6Ly93d3cuc2N5bGQuY29tL2V4cGVydC9OV2F5Lmh0bWwKKworSVZjLiBFcnJhdGEKKworLSBTdG9wT25QZXJyIGlzIGJyb2tlbiwgZG9uJ3QgZW5hYmxlCistIEhhcmR3YXJlIGV0aGVybmV0IHBhZGRpbmcgZXhwb3NlcyByYW5kb20gZGF0YSwgcGVyZm9ybSBzb2Z0d2FyZSBwYWRkaW5nCisgIGluc3RlYWQgKHVudmVyaWZpZWQgLS0gd29ya3MgY29ycmVjdGx5IGZvciBhbGwgdGhlIGhhcmR3YXJlIEkgaGF2ZSkKKworKi8KKworDAorCitlbnVtIGNoaXBfY2FwYWJpbGl0eV9mbGFncyB7Q2FuSGF2ZU1JST0xLCB9OworCitlbnVtIGNoaXBzZXQgeworCUNIXzY5MTUgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHN0YXJmaXJlX3BjaV90YmxbXSA9IHsKKwl7IDB4OTAwNCwgMHg2OTE1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF82OTE1IH0sCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHN0YXJmaXJlX3BjaV90YmwpOworCisvKiBBIGNoaXAgY2FwYWJpbGl0aWVzIHRhYmxlLCBtYXRjaGluZyB0aGUgQ0hfeHh4IGVudHJpZXMgaW4geHh4X3BjaV90YmxbXSBhYm92ZS4gKi8KK3N0YXRpYyBzdHJ1Y3QgY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBkcnZfZmxhZ3M7Cit9IG5ldGRydl90YmxbXSBfX2RldmluaXRkYXRhID0geworCXsgIkFkYXB0ZWMgU3RhcmZpcmUgNjkxNSIsIENhbkhhdmVNSUkgfSwKK307CisKKworLyogT2Zmc2V0cyB0byB0aGUgZGV2aWNlIHJlZ2lzdGVycy4KKyAgIFVubGlrZSBzb2Z0d2FyZS1vbmx5IHN5c3RlbXMsIGRldmljZSBkcml2ZXJzIGludGVyYWN0IHdpdGggY29tcGxleCBoYXJkd2FyZS4KKyAgIEl0J3Mgbm90IHVzZWZ1bCB0byBkZWZpbmUgc3ltYm9saWMgbmFtZXMgZm9yIGV2ZXJ5IHJlZ2lzdGVyIGJpdCBpbiB0aGUKKyAgIGRldmljZS4gIFRoZSBuYW1lIGNhbiBvbmx5IHBhcnRpYWxseSBkb2N1bWVudCB0aGUgc2VtYW50aWNzIGFuZCBtYWtlCisgICB0aGUgZHJpdmVyIGxvbmdlciBhbmQgbW9yZSBkaWZmaWN1bHQgdG8gcmVhZC4KKyAgIEluIGdlbmVyYWwsIG9ubHkgdGhlIGltcG9ydGFudCBjb25maWd1cmF0aW9uIHZhbHVlcyBvciBiaXRzIGNoYW5nZWQKKyAgIG11bHRpcGxlIHRpbWVzIHNob3VsZCBiZSBkZWZpbmVkIHN5bWJvbGljYWxseS4KKyovCitlbnVtIHJlZ2lzdGVyX29mZnNldHMgeworCVBDSURldmljZUNvbmZpZz0weDUwMDQwLCBHZW5DdHJsPTB4NTAwNzAsIEludHJUaW1lckN0cmw9MHg1MDA3NCwKKwlJbnRyQ2xlYXI9MHg1MDA4MCwgSW50clN0YXR1cz0weDUwMDg0LCBJbnRyRW5hYmxlPTB4NTAwODgsCisJTUlJQ3RybD0weDUyMDAwLCBUeFN0YXRpb25BZGRyPTB4NTAxMjAsIEVFUFJPTUN0cmw9MHg1MTAwMCwKKwlHUElPQ3RybD0weDUwMDhDLCBUeERlc2NDdHJsPTB4NTAwOTAsCisJVHhSaW5nUHRyPTB4NTAwOTgsIEhpUHJpVHhSaW5nUHRyPTB4NTAwOTQsIC8qIExvdyBhbmQgSGlnaCBwcmlvcml0eS4gKi8KKwlUeFJpbmdIaUFkZHI9MHg1MDA5QywJCS8qIDY0IGJpdCBhZGRyZXNzIGV4dGVuc2lvbi4gKi8KKwlUeFByb2R1Y2VySWR4PTB4NTAwQTAsIFR4Q29uc3VtZXJJZHg9MHg1MDBBNCwKKwlUeFRocmVzaG9sZD0weDUwMEIwLAorCUNvbXBsZXRpb25IaUFkZHI9MHg1MDBCNCwgVHhDb21wbGV0aW9uQWRkcj0weDUwMEI4LAorCVJ4Q29tcGxldGlvbkFkZHI9MHg1MDBCQywgUnhDb21wbGV0aW9uUTJBZGRyPTB4NTAwQzAsCisJQ29tcGxldGlvblFDb25zdW1lcklkeD0weDUwMEM0LCBSeERNQUN0cmw9MHg1MDBEMCwKKwlSeERlc2NRQ3RybD0weDUwMEQ0LCBSeERlc2NRSGlBZGRyPTB4NTAwREMsIFJ4RGVzY1FBZGRyPTB4NTAwRTAsCisJUnhEZXNjUUlkeD0weDUwMEU4LCBSeERNQVN0YXR1cz0weDUwMEYwLCBSeEZpbHRlck1vZGU9MHg1MDBGNCwKKwlUeE1vZGU9MHg1NTAwMCwgVmxhblR5cGU9MHg1NTA2NCwKKwlQZXJmRmlsdGVyVGFibGU9MHg1NjAwMCwgSGFzaFRhYmxlPTB4NTYxMDAsCisJVHhHZnBNZW09MHg1ODAwMCwgUnhHZnBNZW09MHg1YTAwMCwKK307CisKKy8qCisgKiBCaXRzIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzL21hc2sgcmVnaXN0ZXJzLgorICogV2FybmluZzogc2V0dGluZyBJbnRyW0FiXU5vcm1hbFN1bW1hcnkgaW4gdGhlIEludHJFbmFibGUgcmVnaXN0ZXIKKyAqIGVuYWJsZXMgYWxsIHRoZSBpbnRlcnJ1cHQgc291cmNlcyB0aGF0IGFyZSBvcidlZCBpbnRvIHRob3NlIHN0YXR1cyBiaXRzLgorICovCitlbnVtIGludHJfc3RhdHVzX2JpdHMgeworCUludHJMaW5rQ2hhbmdlPTB4ZjAwMDAwMDAsIEludHJTdGF0c01heD0weDA4MDAwMDAwLAorCUludHJBYm5vcm1hbFN1bW1hcnk9MHgwMjAwMDAwMCwgSW50ckdlbmVyYWxUaW1lcj0weDAxMDAwMDAwLAorCUludHJTb2Z0d2FyZT0weDgwMDAwMCwgSW50clJ4Q29tcGxRMUxvdz0weDQwMDAwMCwKKwlJbnRyVHhDb21wbFFMb3c9MHgyMDAwMDAsIEludHJQQ0k9MHgxMDAwMDAsCisJSW50ckRNQUVycj0weDA4MDAwMCwgSW50clR4RGF0YUxvdz0weDA0MDAwMCwKKwlJbnRyUnhDb21wbFEyTG93PTB4MDIwMDAwLCBJbnRyUnhEZXNjUTFMb3c9MHgwMTAwMDAsCisJSW50ck5vcm1hbFN1bW1hcnk9MHg4MDAwLCBJbnRyVHhEb25lPTB4NDAwMCwKKwlJbnRyVHhETUFEb25lPTB4MjAwMCwgSW50clR4RW1wdHk9MHgxMDAwLAorCUludHJFYXJseVJ4UTI9MHgwODAwLCBJbnRyRWFybHlSeFExPTB4MDQwMCwKKwlJbnRyUnhRMkRvbmU9MHgwMjAwLCBJbnRyUnhRMURvbmU9MHgwMTAwLAorCUludHJSeEdGUERlYWQ9MHg4MCwgSW50clJ4RGVzY1EyTG93PTB4NDAsCisJSW50ck5vVHhDc3VtPTB4MjAsIEludHJUeEJhZElEPTB4MTAsCisJSW50ckhpUHJpVHhCYWRJRD0weDA4LCBJbnRyUnhHZnA9MHgwNCwKKwlJbnRyVHhHZnA9MHgwMiwgSW50clBDSVBhZD0weDAxLAorCS8qIG5vdCBxdWl0ZSBiaXRzICovCisJSW50clJ4RG9uZT1JbnRyUnhRMkRvbmUgfCBJbnRyUnhRMURvbmUsCisJSW50clJ4RW1wdHk9SW50clJ4RGVzY1ExTG93IHwgSW50clJ4RGVzY1EyTG93LAorCUludHJOb3JtYWxNYXNrPTB4ZmYwMCwgSW50ckFibm9ybWFsTWFzaz0weDNmZjAwZmUsCit9OworCisvKiBCaXRzIGluIHRoZSBSeEZpbHRlck1vZGUgcmVnaXN0ZXIuICovCitlbnVtIHJ4X21vZGVfYml0cyB7CisJQWNjZXB0QnJvYWRjYXN0PTB4MDQsIEFjY2VwdEFsbE11bHRpY2FzdD0weDAyLCBBY2NlcHRBbGw9MHgwMSwKKwlBY2NlcHRNdWx0aWNhc3Q9MHgxMCwgUGVyZmVjdEZpbHRlcj0weDQwLCBIYXNoRmlsdGVyPTB4MzAsCisJUGVyZmVjdEZpbHRlclZsYW49MHg4MCwgTWluVkxBTlByaW89MHhFMDAwLCBWbGFuTW9kZT0weDAyMDAsCisJV2FrZXVwT25HRlA9MHgwODAwLAorfTsKKworLyogQml0cyBpbiB0aGUgVHhNb2RlIHJlZ2lzdGVyICovCitlbnVtIHR4X21vZGVfYml0cyB7CisJTWlpU29mdFJlc2V0PTB4ODAwMCwgTUlJTG9vcGJhY2s9MHg0MDAwLAorCVR4Rmxvd0VuYWJsZT0weDA4MDAsIFJ4Rmxvd0VuYWJsZT0weDA0MDAsCisJUGFkRW5hYmxlPTB4MDQsIEZ1bGxEdXBsZXg9MHgwMiwgSHVnZUZyYW1lPTB4MDEsCit9OworCisvKiBCaXRzIGluIHRoZSBUeERlc2NDdHJsIHJlZ2lzdGVyLiAqLworZW51bSB0eF9jdHJsX2JpdHMgeworCVR4RGVzY1NwYWNlVW5saW09MHgwMCwgVHhEZXNjU3BhY2UzMj0weDEwLCBUeERlc2NTcGFjZTY0PTB4MjAsCisJVHhEZXNjU3BhY2UxMjg9MHgzMCwgVHhEZXNjU3BhY2UyNTY9MHg0MCwKKwlUeERlc2NUeXBlMD0weDAwLCBUeERlc2NUeXBlMT0weDAxLCBUeERlc2NUeXBlMj0weDAyLAorCVR4RGVzY1R5cGUzPTB4MDMsIFR4RGVzY1R5cGU0PTB4MDQsCisJVHhOb0RNQUNvbXBsZXRpb249MHgwOCwKKwlUeERlc2NRQWRkcjY0Yml0PTB4ODAsIFR4RGVzY1FBZGRyMzJiaXQ9MCwKKwlUeEhpUHJpRklGT1RocmVzaFNoaWZ0PTI0LCBUeFBhZExlblNoaWZ0PTE2LAorCVR4RE1BQnVyc3RTaXplU2hpZnQ9OCwKK307CisKKy8qIEJpdHMgaW4gdGhlIFJ4RGVzY1FDdHJsIHJlZ2lzdGVyLiAqLworZW51bSByeF9jdHJsX2JpdHMgeworCVJ4QnVmZmVyTGVuU2hpZnQ9MTYsIFJ4TWluRGVzY3JUaHJlc2hTaGlmdD0wLAorCVJ4UHJlZmV0Y2hNb2RlPTB4ODAwMCwgUnhWYXJpYWJsZVE9MHgyMDAwLAorCVJ4MjA0OFFFbnRyaWVzPTB4NDAwMCwgUngyNTZRRW50cmllcz0wLAorCVJ4RGVzY0FkZHI2NGJpdD0weDEwMDAsIFJ4RGVzY0FkZHIzMmJpdD0wLAorCVJ4RGVzY1FBZGRyNjRiaXQ9MHgwMTAwLCBSeERlc2NRQWRkcjMyYml0PTAsCisJUnhEZXNjU3BhY2U0PTB4MDAwLCBSeERlc2NTcGFjZTg9MHgxMDAsCisJUnhEZXNjU3BhY2UxNj0weDIwMCwgUnhEZXNjU3BhY2UzMj0weDMwMCwKKwlSeERlc2NTcGFjZTY0PTB4NDAwLCBSeERlc2NTcGFjZTEyOD0weDUwMCwKKwlSeENvbnN1bWVyV3JFbj0weDgwLAorfTsKKworLyogQml0cyBpbiB0aGUgUnhETUFDdHJsIHJlZ2lzdGVyLiAqLworZW51bSByeF9kbWFjdHJsX2JpdHMgeworCVJ4UmVwb3J0QmFkRnJhbWVzPTB4ODAwMDAwMDAsIFJ4RE1BU2hvcnRGcmFtZXM9MHg0MDAwMDAwMCwKKwlSeERNQUJhZEZyYW1lcz0weDIwMDAwMDAwLCBSeERNQUNyY0Vycm9yRnJhbWVzPTB4MTAwMDAwMDAsCisJUnhETUFDb250cm9sRnJhbWU9MHgwODAwMDAwMCwgUnhETUFQYXVzZUZyYW1lPTB4MDQwMDAwMDAsCisJUnhDaGVja3N1bUlnbm9yZT0wLCBSeENoZWNrc3VtUmVqZWN0VENQVURQPTB4MDIwMDAwMDAsCisJUnhDaGVja3N1bVJlamVjdFRDUE9ubHk9MHgwMTAwMDAwMCwKKwlSeENvbXBsZXRpb25RMkVuYWJsZT0weDgwMDAwMCwKKwlSeERNQVEyRGlzYWJsZT0wLCBSeERNQVEyRlBPbmx5PTB4MTAwMDAwLAorCVJ4RE1BUTJTbWFsbFBrdD0weDIwMDAwMCwgUnhETUFRMkhpZ2hQcmlvPTB4MzAwMDAwLAorCVJ4RE1BUTJOb25JUD0weDQwMDAwMCwKKwlSeFVzZUJhY2t1cFF1ZXVlPTB4MDgwMDAwLCBSeERNQUNSQz0weDA0MDAwMCwKKwlSeEVhcmx5SW50VGhyZXNoU2hpZnQ9MTIsIFJ4SGlnaFByaW9UaHJlc2hTaGlmdD04LAorCVJ4QnVyc3RTaXplU2hpZnQ9MCwKK307CisKKy8qIEJpdHMgaW4gdGhlIFJ4Q29tcGxldGlvbkFkZHIgcmVnaXN0ZXIgKi8KK2VudW0gcnhfY29tcGxfYml0cyB7CisJUnhDb21wbFFBZGRyNjRiaXQ9MHg4MCwgUnhDb21wbFFBZGRyMzJiaXQ9MCwKKwlSeENvbXBsUHJvZHVjZXJXckVuPTB4NDAsCisJUnhDb21wbFR5cGUwPTB4MDAsIFJ4Q29tcGxUeXBlMT0weDEwLAorCVJ4Q29tcGxUeXBlMj0weDIwLCBSeENvbXBsVHlwZTM9MHgzMCwKKwlSeENvbXBsVGhyZXNoU2hpZnQ9MCwKK307CisKKy8qIEJpdHMgaW4gdGhlIFR4Q29tcGxldGlvbkFkZHIgcmVnaXN0ZXIgKi8KK2VudW0gdHhfY29tcGxfYml0cyB7CisJVHhDb21wbFFBZGRyNjRiaXQ9MHg4MCwgVHhDb21wbFFBZGRyMzJiaXQ9MCwKKwlUeENvbXBsUHJvZHVjZXJXckVuPTB4NDAsCisJVHhDb21wbEludHJTdGF0dXM9MHgyMCwKKwlDb21tb25RdWV1ZU1vZGU9MHgxMCwKKwlUeENvbXBsVGhyZXNoU2hpZnQ9MCwKK307CisKKy8qIEJpdHMgaW4gdGhlIEdlbkN0cmwgcmVnaXN0ZXIgKi8KK2VudW0gZ2VuX2N0cmxfYml0cyB7CisJUnhFbmFibGU9MHgwNSwgVHhFbmFibGU9MHgwYSwKKwlSeEdGUEVuYWJsZT0weDEwLCBUeEdGUEVuYWJsZT0weDIwLAorfTsKKworLyogQml0cyBpbiB0aGUgSW50clRpbWVyQ3RybCByZWdpc3RlciAqLworZW51bSBpbnRyX2N0cmxfYml0cyB7CisJVGltZXIxMFg9MHg4MDAsIEVuYWJsZUludHJNYXNraW5nPTB4NjAsIFNtYWxsRnJhbWVCeXBhc3M9MHgxMDAsCisJU21hbGxGcmFtZTY0PTAsIFNtYWxsRnJhbWUxMjg9MHgyMDAsIFNtYWxsRnJhbWUyNTY9MHg0MDAsIFNtYWxsRnJhbWU1MTI9MHg2MDAsCisJSW50ckxhdGVuY3lNYXNrPTB4MWYsCit9OworCisvKiBUaGUgUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KK3N0cnVjdCBzdGFyZmlyZV9yeF9kZXNjIHsKKwlkbWFfYWRkcl90IHJ4YWRkcjsKK307CitlbnVtIHJ4X2Rlc2NfYml0cyB7CisJUnhEZXNjVmFsaWQ9MSwgUnhEZXNjRW5kUmluZz0yLAorfTsKKworLyogQ29tcGxldGlvbiBxdWV1ZSBlbnRyeS4gKi8KK3N0cnVjdCBzaG9ydF9yeF9kb25lX2Rlc2MgeworCXUzMiBzdGF0dXM7CQkJLyogTG93IDE2IGJpdHMgaXMgbGVuZ3RoLiAqLworfTsKK3N0cnVjdCBiYXNpY19yeF9kb25lX2Rlc2MgeworCXUzMiBzdGF0dXM7CQkJLyogTG93IDE2IGJpdHMgaXMgbGVuZ3RoLiAqLworCXUxNiB2bGFuaWQ7CisJdTE2IHN0YXR1czI7Cit9Oworc3RydWN0IGNzdW1fcnhfZG9uZV9kZXNjIHsKKwl1MzIgc3RhdHVzOwkJCS8qIExvdyAxNiBiaXRzIGlzIGxlbmd0aC4gKi8KKwl1MTYgY3N1bTsJCQkvKiBQYXJ0aWFsIGNoZWNrc3VtICovCisJdTE2IHN0YXR1czI7Cit9Oworc3RydWN0IGZ1bGxfcnhfZG9uZV9kZXNjIHsKKwl1MzIgc3RhdHVzOwkJCS8qIExvdyAxNiBiaXRzIGlzIGxlbmd0aC4gKi8KKwl1MTYgc3RhdHVzMzsKKwl1MTYgc3RhdHVzMjsKKwl1MTYgdmxhbmlkOworCXUxNiBjc3VtOwkJCS8qIHBhcnRpYWwgY2hlY2tzdW0gKi8KKwl1MzIgdGltZXN0YW1wOworfTsKKy8qIFhYWDogdGhpcyBpcyB1Z2x5IGFuZCBJJ20gbm90IHN1cmUgaXQncyB3b3J0aCB0aGUgdHJvdWJsZSAtSW9uICovCisjaWZkZWYgSEFTX0ZJUk1XQVJFCisjaWZkZWYgVkxBTl9TVVBQT1JUCit0eXBlZGVmIHN0cnVjdCBmdWxsX3J4X2RvbmVfZGVzYyByeF9kb25lX2Rlc2M7CisjZGVmaW5lIFJ4Q29tcGxUeXBlIFJ4Q29tcGxUeXBlMworI2Vsc2UgIC8qIG5vdCBWTEFOX1NVUFBPUlQgKi8KK3R5cGVkZWYgc3RydWN0IGNzdW1fcnhfZG9uZV9kZXNjIHJ4X2RvbmVfZGVzYzsKKyNkZWZpbmUgUnhDb21wbFR5cGUgUnhDb21wbFR5cGUyCisjZW5kaWYgLyogbm90IFZMQU5fU1VQUE9SVCAqLworI2Vsc2UgIC8qIG5vdCBIQVNfRklSTVdBUkUgKi8KKyNpZmRlZiBWTEFOX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IGJhc2ljX3J4X2RvbmVfZGVzYyByeF9kb25lX2Rlc2M7CisjZGVmaW5lIFJ4Q29tcGxUeXBlIFJ4Q29tcGxUeXBlMQorI2Vsc2UgIC8qIG5vdCBWTEFOX1NVUFBPUlQgKi8KK3R5cGVkZWYgc3RydWN0IHNob3J0X3J4X2RvbmVfZGVzYyByeF9kb25lX2Rlc2M7CisjZGVmaW5lIFJ4Q29tcGxUeXBlIFJ4Q29tcGxUeXBlMAorI2VuZGlmIC8qIG5vdCBWTEFOX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBub3QgSEFTX0ZJUk1XQVJFICovCisKK2VudW0gcnhfZG9uZV9iaXRzIHsKKwlSeE9LPTB4MjAwMDAwMDAsIFJ4RklGT0Vycj0weDEwMDAwMDAwLCBSeEJ1ZlEyPTB4MDgwMDAwMDAsCit9OworCisvKiBUeXBlIDEgVHggZGVzY3JpcHRvci4gKi8KK3N0cnVjdCBzdGFyZmlyZV90eF9kZXNjXzEgeworCXUzMiBzdGF0dXM7CQkJLyogVXBwZXIgYml0cyBhcmUgc3RhdHVzLCBsb3dlciAxNiBsZW5ndGguICovCisJdTMyIGFkZHI7Cit9OworCisvKiBUeXBlIDIgVHggZGVzY3JpcHRvci4gKi8KK3N0cnVjdCBzdGFyZmlyZV90eF9kZXNjXzIgeworCXUzMiBzdGF0dXM7CQkJLyogVXBwZXIgYml0cyBhcmUgc3RhdHVzLCBsb3dlciAxNiBsZW5ndGguICovCisJdTMyIHJlc2VydmVkOworCXU2NCBhZGRyOworfTsKKworI2lmZGVmIEFERFJfNjRCSVRTCit0eXBlZGVmIHN0cnVjdCBzdGFyZmlyZV90eF9kZXNjXzIgc3RhcmZpcmVfdHhfZGVzYzsKKyNkZWZpbmUgVFhfREVTQ19UWVBFIFR4RGVzY1R5cGUyCisjZWxzZSAgLyogbm90IEFERFJfNjRCSVRTICovCit0eXBlZGVmIHN0cnVjdCBzdGFyZmlyZV90eF9kZXNjXzEgc3RhcmZpcmVfdHhfZGVzYzsKKyNkZWZpbmUgVFhfREVTQ19UWVBFIFR4RGVzY1R5cGUxCisjZW5kaWYgLyogbm90IEFERFJfNjRCSVRTICovCisjZGVmaW5lIFRYX0RFU0NfU1BBQ0lORyBUeERlc2NTcGFjZVVubGltCisKK2VudW0gdHhfZGVzY19iaXRzIHsKKwlUeERlc2NJRD0weEIwMDAwMDAwLAorCVR4Q1JDRW49MHgwMTAwMDAwMCwgVHhEZXNjSW50cj0weDA4MDAwMDAwLAorCVR4UmluZ1dyYXA9MHgwNDAwMDAwMCwgVHhDYWxUQ1A9MHgwMjAwMDAwMCwKK307CitzdHJ1Y3QgdHhfZG9uZV9kZXNjIHsKKwl1MzIgc3RhdHVzOwkJCS8qIHRpbWVzdGFtcCwgaW5kZXguICovCisjaWYgMAorCXUzMiBpbnRyc3RhdHVzOwkJCS8qIGludGVycnVwdCBzdGF0dXMgKi8KKyNlbmRpZgorfTsKKworc3RydWN0IHJ4X3JpbmdfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlkbWFfYWRkcl90IG1hcHBpbmc7Cit9Oworc3RydWN0IHR4X3JpbmdfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJdW5zaWduZWQgaW50IHVzZWRfc2xvdHM7Cit9OworCisjZGVmaW5lIFBIWV9DTlQJCTIKK3N0cnVjdCBuZXRkZXZfcHJpdmF0ZSB7CisJLyogRGVzY3JpcHRvciByaW5ncyBmaXJzdCBmb3IgYWxpZ25tZW50LiAqLworCXN0cnVjdCBzdGFyZmlyZV9yeF9kZXNjICpyeF9yaW5nOworCXN0YXJmaXJlX3R4X2Rlc2MgKnR4X3Jpbmc7CisJZG1hX2FkZHJfdCByeF9yaW5nX2RtYTsKKwlkbWFfYWRkcl90IHR4X3JpbmdfZG1hOworCS8qIFRoZSBhZGRyZXNzZXMgb2YgcngvdHgtaW4tcGxhY2Ugc2tidWZmcy4gKi8KKwlzdHJ1Y3QgcnhfcmluZ19pbmZvIHJ4X2luZm9bUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgdHhfcmluZ19pbmZvIHR4X2luZm9bVFhfUklOR19TSVpFXTsKKwkvKiBQb2ludGVycyB0byBjb21wbGV0aW9uIHF1ZXVlcyAoZnVsbCBwYWdlcykuICovCisJcnhfZG9uZV9kZXNjICpyeF9kb25lX3E7CisJZG1hX2FkZHJfdCByeF9kb25lX3FfZG1hOworCXVuc2lnbmVkIGludCByeF9kb25lOworCXN0cnVjdCB0eF9kb25lX2Rlc2MgKnR4X2RvbmVfcTsKKwlkbWFfYWRkcl90IHR4X2RvbmVfcV9kbWE7CisJdW5zaWduZWQgaW50IHR4X2RvbmU7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisjaWZkZWYgVkxBTl9TVVBQT1JUCisJc3RydWN0IHZsYW5fZ3JvdXAgKnZsZ3JwOworI2VuZGlmCisJdm9pZCAqcXVldWVfbWVtOworCWRtYV9hZGRyX3QgcXVldWVfbWVtX2RtYTsKKwlzaXplX3QgcXVldWVfbWVtX3NpemU7CisKKwkvKiBGcmVxdWVudGx5IHVzZWQgdmFsdWVzOiBrZWVwIHNvbWUgYWRqYWNlbnQgZm9yIGNhY2hlIGVmZmVjdC4gKi8KKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgaW50IGN1cl9yeCwgZGlydHlfcng7CS8qIFByb2R1Y2VyL2NvbnN1bWVyIHJpbmcgaW5kaWNlcyAqLworCXVuc2lnbmVkIGludCBjdXJfdHgsIGRpcnR5X3R4LCByZWFwX3R4OworCXVuc2lnbmVkIGludCByeF9idWZfc3o7CQkvKiBCYXNlZCBvbiBNVFUrc2xhY2suICovCisJLyogVGhlc2UgdmFsdWVzIGtlZXAgdHJhY2sgb2YgdGhlIHRyYW5zY2VpdmVyL21lZGlhIGluIHVzZS4gKi8KKwlpbnQgc3BlZWQxMDA7CQkJLyogU2V0IGlmIHNwZWVkID09IDEwME1CaXQuICovCisJdTMyIHR4X21vZGU7CisJdTMyIGludHJfdGltZXJfY3RybDsKKwl1OCB0eF90aHJlc2hvbGQ7CisJLyogTUlJIHRyYW5zY2VpdmVyIHNlY3Rpb24uICovCisJc3RydWN0IG1paV9pZl9pbmZvIG1paV9pZjsJCS8qIE1JSSBsaWIgaG9va3MvaW5mbyAqLworCWludCBwaHlfY250OwkJCS8qIE1JSSBkZXZpY2UgYWRkcmVzc2VzLiAqLworCXVuc2lnbmVkIGNoYXIgcGh5c1tQSFlfQ05UXTsJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisJdm9pZCBfX2lvbWVtICpiYXNlOworfTsKKworCitzdGF0aWMgaW50CW1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworc3RhdGljIHZvaWQJbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSk7CitzdGF0aWMgaW50CW5ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJY2hlY2tfZHVwbGV4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkCWluaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJc3RhcnRfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQJbmV0ZGV2X2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbnRyX3N0YXR1cyk7CitzdGF0aWMgaW50CV9fbmV0ZGV2X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqcXVvdGEpOworc3RhdGljIHZvaWQJcmVmaWxsX3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAluZXRkZXZfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKTsKK3N0YXRpYyB2b2lkCXNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CW5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQJbmV0ZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJbmV0ZGV2X21lZGlhX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHM7CisKKworI2lmZGVmIFZMQU5fU1VQUE9SVAorc3RhdGljIHZvaWQgbmV0ZGV2X3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKyAgICAgICAgc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJaWYgKGRlYnVnID4gMikKKwkJcHJpbnRrKCIlczogU2V0dGluZyB2bGdycCB0byAlcFxuIiwgZGV2LT5uYW1lLCBncnApOworICAgICAgICBucC0+dmxncnAgPSBncnA7CisJc2V0X3J4X21vZGUoZGV2KTsKKyAgICAgICAgc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoIiVzOiBBZGRpbmcgdmxhbmlkICVkIHRvIHZsYW4gZmlsdGVyXG4iLCBkZXYtPm5hbWUsIHZpZCk7CisJc2V0X3J4X21vZGUoZGV2KTsKKwlzcGluX3VubG9jaygmbnAtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoIiVzOiByZW1vdmluZyB2bGFuaWQgJWQgZnJvbSB2bGFuIGZpbHRlclxuIiwgZGV2LT5uYW1lLCB2aWQpOworCWlmIChucC0+dmxncnApCisJCW5wLT52bGdycC0+dmxhbl9kZXZpY2VzW3ZpZF0gPSBOVUxMOworCXNldF9yeF9tb2RlKGRldik7CisJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKK30KKyNlbmRpZiAvKiBWTEFOX1NVUFBPUlQgKi8KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzdGFyZmlyZV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wOworCWludCBpLCBpcnEsIG9wdGlvbiwgY2hpcF9pZHggPSBlbnQtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RhdGljIGludCBjYXJkX2lkeCA9IC0xOworCWxvbmcgaW9hZGRyOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlpbnQgZHJ2X2ZsYWdzLCBpb19zaXplOworCWludCBib2d1c2NudDsKKworLyogd2hlbiBidWlsdCBpbnRvIHRoZSBrZXJuZWwsIHdlIG9ubHkgcHJpbnQgdmVyc2lvbiBpZiBkZXZpY2UgaXMgZm91bmQgKi8KKyNpZm5kZWYgTU9EVUxFCisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisKKwljYXJkX2lkeCsrOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlIChwZGV2KSkKKwkJcmV0dXJuIC1FSU87CisKKwlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJaW9fc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisJaWYgKCFpb2FkZHIgfHwgKChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkgPT0gMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIgJWQ6IG5vIFBDSSBNRU0gcmVzb3VyY2VzLCBhYm9ydGluZ1xuIiwgY2FyZF9pZHgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKm5wKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIgJWQ6IGNhbm5vdCBhbGxvYyBldGhlcmRldiwgYWJvcnRpbmdcbiIsIGNhcmRfaWR4KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJaXJxID0gcGRldi0+aXJxOworCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMgKHBkZXYsIERSVl9OQU1FKSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIiAlZDogY2Fubm90IHJlc2VydmUgUENJIHJlc291cmNlcywgYWJvcnRpbmdcbiIsIGNhcmRfaWR4KTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCX0KKworCS8qIGlvcmVtYXAgaXMgYm9ya2VuIGluIExpbnV4LTIuMi54L3NwYXJjNjQgKi8KKwliYXNlID0gaW9yZW1hcChpb2FkZHIsIGlvX3NpemUpOworCWlmICghYmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIiAlZDogY2Fubm90IHJlbWFwICUjeCBAICUjbHgsIGFib3J0aW5nXG4iLAorCQkJY2FyZF9pZHgsIGlvX3NpemUsIGlvYWRkcik7CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qIGVuYWJsZSBNV0kgLS0gaXQgdmFzdGx5IGltcHJvdmVzIFJ4IHBlcmZvcm1hbmNlIG9uIHNwYXJjNjQgKi8KKwlwY2lfc2V0X213aShwZGV2KTsKKworI2lmZGVmIE1BWF9TS0JfRlJBR1MKKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0c7CisjZW5kaWYgLyogTUFYX1NLQl9GUkFHUyAqLworI2lmZGVmIFpFUk9DT1BZCisJLyogU3RhcmZpcmUgY2FuIGRvIFRDUC9VRFAgY2hlY2tzdW1taW5nICovCisJaWYgKGVuYWJsZV9od19ja3N1bSkKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU07CisjZW5kaWYgLyogWkVST0NPUFkgKi8KKyNpZmRlZiBWTEFOX1NVUFBPUlQKKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9SWCB8IE5FVElGX0ZfSFdfVkxBTl9GSUxURVI7CisJZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gbmV0ZGV2X3ZsYW5fcnhfcmVnaXN0ZXI7CisJZGV2LT52bGFuX3J4X2FkZF92aWQgPSBuZXRkZXZfdmxhbl9yeF9hZGRfdmlkOworCWRldi0+dmxhbl9yeF9raWxsX3ZpZCA9IG5ldGRldl92bGFuX3J4X2tpbGxfdmlkOworI2VuZGlmIC8qIFZMQU5fUlhfS0lMTF9WSUQgKi8KKyNpZmRlZiBBRERSXzY0QklUUworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworI2VuZGlmIC8qIEFERFJfNjRCSVRTICovCisKKwkvKiBTZXJpYWwgRUVQUk9NIHJlYWRzIGFyZSBoaWRkZW4gYnkgdGhlIGhhcmR3YXJlLiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSByZWFkYihiYXNlICsgRUVQUk9NQ3RybCArIDIwIC0gaSk7CisKKyNpZiAhIGRlZmluZWQoZmluYWxfdmVyc2lvbikgLyogRHVtcCB0aGUgRUVQUk9NIGNvbnRlbnRzIGR1cmluZyBkZXZlbG9wbWVudC4gKi8KKwlpZiAoZGVidWcgPiA0KQorCQlmb3IgKGkgPSAwOyBpIDwgMHgyMDsgaSsrKQorCQkJcHJpbnRrKCIlMi4yeCVzIiwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KXJlYWRiKGJhc2UgKyBFRVBST01DdHJsICsgaSksCisJCQkgICAgICAgaSAlIDE2ICE9IDE1ID8gIiAiIDogIlxuIik7CisjZW5kaWYKKworCS8qIElzc3VlIHNvZnQgcmVzZXQgKi8KKwl3cml0ZWwoTWlpU29mdFJlc2V0LCBiYXNlICsgVHhNb2RlKTsKKwl1ZGVsYXkoMTAwMCk7CisJd3JpdGVsKDAsIGJhc2UgKyBUeE1vZGUpOworCisJLyogUmVzZXQgdGhlIGNoaXAgdG8gZXJhc2UgcHJldmlvdXMgbWlzY29uZmlndXJhdGlvbi4gKi8KKwl3cml0ZWwoMSwgYmFzZSArIFBDSURldmljZUNvbmZpZyk7CisJYm9ndXNjbnQgPSAxMDAwOworCXdoaWxlICgtLWJvZ3VzY250ID4gMCkgeworCQl1ZGVsYXkoMTApOworCQlpZiAoKHJlYWRsKGJhc2UgKyBQQ0lEZXZpY2VDb25maWcpICYgMSkgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoYm9ndXNjbnQgPT0gMCkKKwkJcHJpbnRrKCIlczogY2hpcHNldCByZXNldCBuZXZlciBjb21wbGV0ZWQhXG4iLCBkZXYtPm5hbWUpOworCS8qIHdhaXQgYSBsaXR0bGUgbG9uZ2VyICovCisJdWRlbGF5KDEwMDApOworCisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZyliYXNlOworCWRldi0+aXJxID0gaXJxOworCisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCW5wLT5iYXNlID0gYmFzZTsKKwlzcGluX2xvY2tfaW5pdCgmbnAtPmxvY2spOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJbnAtPnBjaV9kZXYgPSBwZGV2OworCisJbnAtPm1paV9pZi5kZXYgPSBkZXY7CisJbnAtPm1paV9pZi5tZGlvX3JlYWQgPSBtZGlvX3JlYWQ7CisJbnAtPm1paV9pZi5tZGlvX3dyaXRlID0gbWRpb193cml0ZTsKKwlucC0+bWlpX2lmLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlucC0+bWlpX2lmLnJlZ19udW1fbWFzayA9IDB4MWY7CisKKwlkcnZfZmxhZ3MgPSBuZXRkcnZfdGJsW2NoaXBfaWR4XS5kcnZfZmxhZ3M7CisKKwlvcHRpb24gPSBjYXJkX2lkeCA8IE1BWF9VTklUUyA/IG9wdGlvbnNbY2FyZF9pZHhdIDogMDsKKwlpZiAoZGV2LT5tZW1fc3RhcnQpCisJCW9wdGlvbiA9IGRldi0+bWVtX3N0YXJ0OworCisJLyogVGhlIGxvd2VyIGZvdXIgYml0cyBhcmUgdGhlIG1lZGlhIHR5cGUuICovCisJaWYgKG9wdGlvbiAmIDB4MjAwKQorCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKKworCWlmIChjYXJkX2lkeCA8IE1BWF9VTklUUyAmJiBmdWxsX2R1cGxleFtjYXJkX2lkeF0gPiAwKQorCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKKworCWlmIChucC0+bWlpX2lmLmZ1bGxfZHVwbGV4KQorCQlucC0+bWlpX2lmLmZvcmNlX21lZGlhID0gMTsKKwllbHNlCisJCW5wLT5taWlfaWYuZm9yY2VfbWVkaWEgPSAwOworCW5wLT5zcGVlZDEwMCA9IDE7CisKKwkvKiB0aW1lciByZXNvbHV0aW9uIGlzIDEyOCAqIDAuOHVzICovCisJbnAtPmludHJfdGltZXJfY3RybCA9ICgoKGludHJfbGF0ZW5jeSAqIDEwKSAvIDEwMjQpICYgSW50ckxhdGVuY3lNYXNrKSB8CisJCVRpbWVyMTBYIHwgRW5hYmxlSW50ck1hc2tpbmc7CisKKwlpZiAoc21hbGxfZnJhbWVzID4gMCkgeworCQlucC0+aW50cl90aW1lcl9jdHJsIHw9IFNtYWxsRnJhbWVCeXBhc3M7CisJCXN3aXRjaCAoc21hbGxfZnJhbWVzKSB7CisJCWNhc2UgMSAuLi4gNjQ6CisJCQlucC0+aW50cl90aW1lcl9jdHJsIHw9IFNtYWxsRnJhbWU2NDsKKwkJCWJyZWFrOworCQljYXNlIDY1IC4uLiAxMjg6CisJCQlucC0+aW50cl90aW1lcl9jdHJsIHw9IFNtYWxsRnJhbWUxMjg7CisJCQlicmVhazsKKwkJY2FzZSAxMjkgLi4uIDI1NjoKKwkJCW5wLT5pbnRyX3RpbWVyX2N0cmwgfD0gU21hbGxGcmFtZTI1NjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbnAtPmludHJfdGltZXJfY3RybCB8PSBTbWFsbEZyYW1lNTEyOworCQkJaWYgKHNtYWxsX2ZyYW1lcyA+IDUxMikKKwkJCQlwcmludGsoIkFkanVzdGluZyBzbWFsbF9mcmFtZXMgZG93biB0byA1MTJcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBUaGUgY2hpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZuZXRkZXZfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzdGFydF90eDsKKwlpbml0X3R4X3RpbWVyKGRldiwgdHhfdGltZW91dCwgVFhfVElNRU9VVCk7CisJaW5pdF9wb2xsKGRldik7CisJZGV2LT5zdG9wID0gJm5ldGRldl9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZnZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7CisJZGV2LT5kb19pb2N0bCA9ICZuZXRkZXZfaW9jdGw7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmV0aHRvb2xfb3BzKTsKKworCWlmIChtdHUpCisJCWRldi0+bXR1ID0gbXR1OworCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKQorCQlnb3RvIGVycl9vdXRfY2xlYXJkZXY7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgYXQgJXAsICIsCisJCSAgIGRldi0+bmFtZSwgbmV0ZHJ2X3RibFtjaGlwX2lkeF0ubmFtZSwgYmFzZSk7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJcHJpbnRrKCIlMi4yeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiUyLjJ4LCBJUlEgJWQuXG4iLCBkZXYtPmRldl9hZGRyW2ldLCBpcnEpOworCisJaWYgKGRydl9mbGFncyAmIENhbkhhdmVNSUkpIHsKKwkJaW50IHBoeSwgcGh5X2lkeCA9IDA7CisJCWludCBtaWlfc3RhdHVzOworCQlmb3IgKHBoeSA9IDA7IHBoeSA8IDMyICYmIHBoeV9pZHggPCBQSFlfQ05UOyBwaHkrKykgeworCQkJbWRpb193cml0ZShkZXYsIHBoeSwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCQkJbWRlbGF5KDEwMCk7CisJCQlib2d1c2NudCA9IDEwMDA7CisJCQl3aGlsZSAoLS1ib2d1c2NudCA+IDApCisJCQkJaWYgKChtZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9CTUNSKSAmIEJNQ1JfUkVTRVQpID09IDApCisJCQkJCWJyZWFrOworCQkJaWYgKGJvZ3VzY250ID09IDApIHsKKwkJCQlwcmludGsoIiVzOiBQSFkgcmVzZXQgbmV2ZXIgY29tcGxldGVkIVxuIiwgZGV2LT5uYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW1paV9zdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9CTVNSKTsKKwkJCWlmIChtaWlfc3RhdHVzICE9IDApIHsKKwkJCQlucC0+cGh5c1twaHlfaWR4KytdID0gcGh5OworCQkJCW5wLT5taWlfaWYuYWR2ZXJ0aXNpbmcgPSBtZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9BRFZFUlRJU0UpOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNSUkgUEhZIGZvdW5kIGF0IGFkZHJlc3MgJWQsIHN0YXR1cyAiCisJCQkJCSAgICIlIzQuNHggYWR2ZXJ0aXNpbmcgJSM0LjR4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBwaHksIG1paV9zdGF0dXMsIG5wLT5taWlfaWYuYWR2ZXJ0aXNpbmcpOworCQkJCS8qIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBQSFkgb24tYm9hcmQgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlucC0+cGh5X2NudCA9IHBoeV9pZHg7CisJCWlmIChucC0+cGh5X2NudCA+IDApCisJCQlucC0+bWlpX2lmLnBoeV9pZCA9IG5wLT5waHlzWzBdOworCQllbHNlCisJCQltZW1zZXQoJm5wLT5taWlfaWYsIDAsIHNpemVvZihucC0+bWlpX2lmKSk7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNjYXR0ZXItZ2F0aGVyIGFuZCBoYXJkd2FyZSBUQ1AgY2tzdW1taW5nICVzLlxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBlbmFibGVfaHdfY2tzdW0gPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwlyZXR1cm4gMDsKKworZXJyX291dF9jbGVhcmRldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJaW91bm1hcChiYXNlKTsKK2Vycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyAocGRldik7CitlcnJfb3V0X2ZyZWVfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKworLyogUmVhZCB0aGUgTUlJIE1hbmFnZW1lbnQgRGF0YSBJL08gKE1ESU8pIGludGVyZmFjZXMuICovCitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICptZGlvX2FkZHIgPSBucC0+YmFzZSArIE1JSUN0cmwgKyAocGh5X2lkPDw3KSArIChsb2NhdGlvbjw8Mik7CisJaW50IHJlc3VsdCwgYm9ndXNjbnQ9MTAwMDsKKwkvKiA/Pz8gU2hvdWxkIHdlIGFkZCBhIGJ1c3ktd2FpdCBoZXJlPyAqLworCWRvCisJCXJlc3VsdCA9IHJlYWRsKG1kaW9fYWRkcik7CisJd2hpbGUgKChyZXN1bHQgJiAweEMwMDAwMDAwKSAhPSAweDgwMDAwMDAwICYmIC0tYm9ndXNjbnQgPiAwKTsKKwlpZiAoYm9ndXNjbnQgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKChyZXN1bHQgJiAweGZmZmYpID09IDB4ZmZmZikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHJlc3VsdCAmIDB4ZmZmZjsKK30KKworCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqbWRpb19hZGRyID0gbnAtPmJhc2UgKyBNSUlDdHJsICsgKHBoeV9pZDw8NykgKyAobG9jYXRpb248PDIpOworCXdyaXRlbCh2YWx1ZSwgbWRpb19hZGRyKTsKKwkvKiBUaGUgYnVzeS13YWl0IHdpbGwgb2NjdXIgYmVmb3JlIGEgcmVhZC4gKi8KK30KKworCitzdGF0aWMgaW50IG5ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwlpbnQgaSwgcmV0dmFsOworCXNpemVfdCB0eF9kb25lX3Ffc2l6ZSwgcnhfZG9uZV9xX3NpemUsIHR4X3Jpbmdfc2l6ZSwgcnhfcmluZ19zaXplOworCisJLyogRG8gd2UgZXZlciBuZWVkIHRvIHJlc2V0IHRoZSBjaGlwPz8/ICovCisJcmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZpbnRyX2hhbmRsZXIsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCS8qIERpc2FibGUgdGhlIFJ4IGFuZCBUeCwgYW5kIHJlc2V0IHRoZSBjaGlwLiAqLworCXdyaXRlbCgwLCBpb2FkZHIgKyBHZW5DdHJsKTsKKwl3cml0ZWwoMSwgaW9hZGRyICsgUENJRGV2aWNlQ29uZmlnKTsKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5ldGRldl9vcGVuKCkgaXJxICVkLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCisJLyogQWxsb2NhdGUgdGhlIHZhcmlvdXMgcXVldWVzLiAqLworCWlmIChucC0+cXVldWVfbWVtID09IDApIHsKKwkJdHhfZG9uZV9xX3NpemUgPSAoKHNpemVvZihzdHJ1Y3QgdHhfZG9uZV9kZXNjKSAqIERPTkVfUV9TSVpFICsgUVVFVUVfQUxJR04gLSAxKSAvIFFVRVVFX0FMSUdOKSAqIFFVRVVFX0FMSUdOOworCQlyeF9kb25lX3Ffc2l6ZSA9ICgoc2l6ZW9mKHJ4X2RvbmVfZGVzYykgKiBET05FX1FfU0laRSArIFFVRVVFX0FMSUdOIC0gMSkgLyBRVUVVRV9BTElHTikgKiBRVUVVRV9BTElHTjsKKwkJdHhfcmluZ19zaXplID0gKChzaXplb2Yoc3RhcmZpcmVfdHhfZGVzYykgKiBUWF9SSU5HX1NJWkUgKyBRVUVVRV9BTElHTiAtIDEpIC8gUVVFVUVfQUxJR04pICogUVVFVUVfQUxJR047CisJCXJ4X3Jpbmdfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc3RhcmZpcmVfcnhfZGVzYykgKiBSWF9SSU5HX1NJWkU7CisJCW5wLT5xdWV1ZV9tZW1fc2l6ZSA9IHR4X2RvbmVfcV9zaXplICsgcnhfZG9uZV9xX3NpemUgKyB0eF9yaW5nX3NpemUgKyByeF9yaW5nX3NpemU7CisJCW5wLT5xdWV1ZV9tZW0gPSBwY2lfYWxsb2NfY29uc2lzdGVudChucC0+cGNpX2RldiwgbnAtPnF1ZXVlX21lbV9zaXplLCAmbnAtPnF1ZXVlX21lbV9kbWEpOworCQlpZiAobnAtPnF1ZXVlX21lbSA9PSAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbnAtPnR4X2RvbmVfcSAgICAgPSBucC0+cXVldWVfbWVtOworCQlucC0+dHhfZG9uZV9xX2RtYSA9IG5wLT5xdWV1ZV9tZW1fZG1hOworCQlucC0+cnhfZG9uZV9xICAgICA9ICh2b2lkICopIG5wLT50eF9kb25lX3EgKyB0eF9kb25lX3Ffc2l6ZTsKKwkJbnAtPnJ4X2RvbmVfcV9kbWEgPSBucC0+dHhfZG9uZV9xX2RtYSArIHR4X2RvbmVfcV9zaXplOworCQlucC0+dHhfcmluZyAgICAgICA9ICh2b2lkICopIG5wLT5yeF9kb25lX3EgKyByeF9kb25lX3Ffc2l6ZTsKKwkJbnAtPnR4X3JpbmdfZG1hICAgPSBucC0+cnhfZG9uZV9xX2RtYSArIHJ4X2RvbmVfcV9zaXplOworCQlucC0+cnhfcmluZyAgICAgICA9ICh2b2lkICopIG5wLT50eF9yaW5nICsgdHhfcmluZ19zaXplOworCQlucC0+cnhfcmluZ19kbWEgICA9IG5wLT50eF9yaW5nX2RtYSArIHR4X3Jpbmdfc2l6ZTsKKwl9CisKKwkvKiBTdGFydCB3aXRoIG5vIGNhcnJpZXIsIGl0IGdldHMgYWRqdXN0ZWQgbGF0ZXIgKi8KKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCWluaXRfcmluZyhkZXYpOworCS8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgUnggYnVmZmVycy4gKi8KKwl3cml0ZWwoKG5wLT5yeF9idWZfc3ogPDwgUnhCdWZmZXJMZW5TaGlmdCkgfAorCSAgICAgICAoMCA8PCBSeE1pbkRlc2NyVGhyZXNoU2hpZnQpIHwKKwkgICAgICAgUnhQcmVmZXRjaE1vZGUgfCBSeFZhcmlhYmxlUSB8CisJICAgICAgIFJYX1FfRU5UUklFUyB8CisJICAgICAgIFJYX0RFU0NfUV9BRERSX1NJWkUgfCBSWF9ERVNDX0FERFJfU0laRSB8CisJICAgICAgIFJ4RGVzY1NwYWNlNCwKKwkgICAgICAgaW9hZGRyICsgUnhEZXNjUUN0cmwpOworCisJLyogU2V0IHVwIHRoZSBSeCBETUEgY29udHJvbGxlci4gKi8KKwl3cml0ZWwoUnhDaGVja3N1bUlnbm9yZSB8CisJICAgICAgICgwIDw8IFJ4RWFybHlJbnRUaHJlc2hTaGlmdCkgfAorCSAgICAgICAoNiA8PCBSeEhpZ2hQcmlvVGhyZXNoU2hpZnQpIHwKKwkgICAgICAgKChETUFfQlVSU1RfU0laRSAvIDMyKSA8PCBSeEJ1cnN0U2l6ZVNoaWZ0KSwKKwkgICAgICAgaW9hZGRyICsgUnhETUFDdHJsKTsKKworCS8qIFNldCBUeCBkZXNjcmlwdG9yICovCisJd3JpdGVsKCgyIDw8IFR4SGlQcmlGSUZPVGhyZXNoU2hpZnQpIHwKKwkgICAgICAgKDAgPDwgVHhQYWRMZW5TaGlmdCkgfAorCSAgICAgICAoKERNQV9CVVJTVF9TSVpFIC8gMzIpIDw8IFR4RE1BQnVyc3RTaXplU2hpZnQpIHwKKwkgICAgICAgVFhfREVTQ19RX0FERFJfU0laRSB8CisJICAgICAgIFRYX0RFU0NfU1BBQ0lORyB8IFRYX0RFU0NfVFlQRSwKKwkgICAgICAgaW9hZGRyICsgVHhEZXNjQ3RybCk7CisKKwl3cml0ZWwoIChucC0+cXVldWVfbWVtX2RtYSA+PiAxNikgPj4gMTYsIGlvYWRkciArIFJ4RGVzY1FIaUFkZHIpOworCXdyaXRlbCggKG5wLT5xdWV1ZV9tZW1fZG1hID4+IDE2KSA+PiAxNiwgaW9hZGRyICsgVHhSaW5nSGlBZGRyKTsKKwl3cml0ZWwoIChucC0+cXVldWVfbWVtX2RtYSA+PiAxNikgPj4gMTYsIGlvYWRkciArIENvbXBsZXRpb25IaUFkZHIpOworCXdyaXRlbChucC0+cnhfcmluZ19kbWEsIGlvYWRkciArIFJ4RGVzY1FBZGRyKTsKKwl3cml0ZWwobnAtPnR4X3JpbmdfZG1hLCBpb2FkZHIgKyBUeFJpbmdQdHIpOworCisJd3JpdGVsKG5wLT50eF9kb25lX3FfZG1hLCBpb2FkZHIgKyBUeENvbXBsZXRpb25BZGRyKTsKKwl3cml0ZWwobnAtPnJ4X2RvbmVfcV9kbWEgfAorCSAgICAgICBSeENvbXBsVHlwZSB8CisJICAgICAgICgwIDw8IFJ4Q29tcGxUaHJlc2hTaGlmdCksCisJICAgICAgIGlvYWRkciArIFJ4Q29tcGxldGlvbkFkZHIpOworCisJaWYgKGRlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBGaWxsaW5nIGluIHRoZSBzdGF0aW9uIGFkZHJlc3MuXG4iLCBkZXYtPm5hbWUpOworCisJLyogRmlsbCBib3RoIHRoZSBUeCBTQSByZWdpc3RlciBhbmQgdGhlIFJ4IHBlcmZlY3QgZmlsdGVyLiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXdyaXRlYihkZXYtPmRldl9hZGRyW2ldLCBpb2FkZHIgKyBUeFN0YXRpb25BZGRyICsgNSAtIGkpOworCS8qIFRoZSBmaXJzdCBlbnRyeSBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgYnlwYXNzZXMgdGhlIFZMQU4gZmlsdGVyLgorCSAgIERvbid0IHVzZSBpdC4gKi8KKwl3cml0ZXcoMCwgaW9hZGRyICsgUGVyZkZpbHRlclRhYmxlKTsKKwl3cml0ZXcoMCwgaW9hZGRyICsgUGVyZkZpbHRlclRhYmxlICsgNCk7CisJd3JpdGV3KDAsIGlvYWRkciArIFBlcmZGaWx0ZXJUYWJsZSArIDgpOworCWZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKSB7CisJCXUxNiAqZWFkZHJzID0gKHUxNiAqKWRldi0+ZGV2X2FkZHI7CisJCXZvaWQgX19pb21lbSAqc2V0dXBfZnJtID0gaW9hZGRyICsgUGVyZkZpbHRlclRhYmxlICsgaSAqIDE2OworCQl3cml0ZXcoY3B1X3RvX2JlMTYoZWFkZHJzWzJdKSwgc2V0dXBfZnJtKTsgc2V0dXBfZnJtICs9IDQ7CisJCXdyaXRldyhjcHVfdG9fYmUxNihlYWRkcnNbMV0pLCBzZXR1cF9mcm0pOyBzZXR1cF9mcm0gKz0gNDsKKwkJd3JpdGV3KGNwdV90b19iZTE2KGVhZGRyc1swXSksIHNldHVwX2ZybSk7IHNldHVwX2ZybSArPSA4OworCX0KKworCS8qIEluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzLiAqLworCS8qIENvbmZpZ3VyZSB0aGUgUENJIGJ1cyBidXJzdHMgYW5kIEZJRk8gdGhyZXNob2xkcy4gKi8KKwlucC0+dHhfbW9kZSA9IFR4Rmxvd0VuYWJsZXxSeEZsb3dFbmFibGV8UGFkRW5hYmxlOwkvKiBtb2RpZmllZCB3aGVuIGxpbmsgaXMgdXAuICovCisJd3JpdGVsKE1paVNvZnRSZXNldCB8IG5wLT50eF9tb2RlLCBpb2FkZHIgKyBUeE1vZGUpOworCXVkZWxheSgxMDAwKTsKKwl3cml0ZWwobnAtPnR4X21vZGUsIGlvYWRkciArIFR4TW9kZSk7CisJbnAtPnR4X3RocmVzaG9sZCA9IDQ7CisJd3JpdGVsKG5wLT50eF90aHJlc2hvbGQsIGlvYWRkciArIFR4VGhyZXNob2xkKTsKKworCXdyaXRlbChucC0+aW50cl90aW1lcl9jdHJsLCBpb2FkZHIgKyBJbnRyVGltZXJDdHJsKTsKKworCW5ldGlmX3N0YXJ0X2lmKGRldik7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCWlmIChkZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2V0dGluZyB0aGUgUnggYW5kIFR4IG1vZGVzLlxuIiwgZGV2LT5uYW1lKTsKKwlzZXRfcnhfbW9kZShkZXYpOworCisJbnAtPm1paV9pZi5hZHZlcnRpc2luZyA9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQURWRVJUSVNFKTsKKwljaGVja19kdXBsZXgoZGV2KTsKKworCS8qIEVuYWJsZSBHUElPIGludGVycnVwdHMgb24gbGluayBjaGFuZ2UgKi8KKwl3cml0ZWwoMHgwZjAwZmYwMCwgaW9hZGRyICsgR1BJT0N0cmwpOworCisJLyogU2V0IHRoZSBpbnRlcnJ1cHQgbWFzayAqLworCXdyaXRlbChJbnRyUnhEb25lIHwgSW50clJ4RW1wdHkgfCBJbnRyRE1BRXJyIHwKKwkgICAgICAgSW50clR4RE1BRG9uZSB8IEludHJTdGF0c01heCB8IEludHJMaW5rQ2hhbmdlIHwKKwkgICAgICAgSW50clJ4R0ZQRGVhZCB8IEludHJOb1R4Q3N1bSB8IEludHJUeEJhZElELAorCSAgICAgICBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwkvKiBFbmFibGUgUENJIGludGVycnVwdHMuICovCisJd3JpdGVsKDB4MDA4MDAwMDAgfCByZWFkbChpb2FkZHIgKyBQQ0lEZXZpY2VDb25maWcpLAorCSAgICAgICBpb2FkZHIgKyBQQ0lEZXZpY2VDb25maWcpOworCisjaWZkZWYgVkxBTl9TVVBQT1JUCisJLyogU2V0IFZMQU4gdHlwZSB0byA4MDIuMXEgKi8KKwl3cml0ZWwoRVRIX1BfODAyMVEsIGlvYWRkciArIFZsYW5UeXBlKTsKKyNlbmRpZiAvKiBWTEFOX1NVUFBPUlQgKi8KKworI2lmZGVmIEhBU19GSVJNV0FSRQorCS8qIExvYWQgUngvVHggZmlybXdhcmUgaW50byB0aGUgZnJhbWUgcHJvY2Vzc29ycyAqLworCWZvciAoaSA9IDA7IGkgPCBGSVJNV0FSRV9SWF9TSVpFICogMjsgaSsrKQorCQl3cml0ZWwoZmlybXdhcmVfcnhbaV0sIGlvYWRkciArIFJ4R2ZwTWVtICsgaSAqIDQpOworCWZvciAoaSA9IDA7IGkgPCBGSVJNV0FSRV9UWF9TSVpFICogMjsgaSsrKQorCQl3cml0ZWwoZmlybXdhcmVfdHhbaV0sIGlvYWRkciArIFR4R2ZwTWVtICsgaSAqIDQpOworI2VuZGlmIC8qIEhBU19GSVJNV0FSRSAqLworCWlmIChlbmFibGVfaHdfY2tzdW0pCisJCS8qIEVuYWJsZSB0aGUgUnggYW5kIFR4IHVuaXRzLCBhbmQgdGhlIFJ4L1R4IGZyYW1lIHByb2Nlc3NvcnMuICovCisJCXdyaXRlbChUeEVuYWJsZXxUeEdGUEVuYWJsZXxSeEVuYWJsZXxSeEdGUEVuYWJsZSwgaW9hZGRyICsgR2VuQ3RybCk7CisJZWxzZQorCQkvKiBFbmFibGUgdGhlIFJ4IGFuZCBUeCB1bml0cyBvbmx5LiAqLworCQl3cml0ZWwoVHhFbmFibGV8UnhFbmFibGUsIGlvYWRkciArIEdlbkN0cmwpOworCisJaWYgKGRlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBEb25lIG5ldGRldl9vcGVuKCkuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrX2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiByZWcwOworCWludCBzaWxseV9jb3VudCA9IDEwMDA7CisKKwltZGlvX3dyaXRlKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9BRFZFUlRJU0UsIG5wLT5taWlfaWYuYWR2ZXJ0aXNpbmcpOworCW1kaW9fd3JpdGUoZGV2LCBucC0+cGh5c1swXSwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCXVkZWxheSg1MDApOworCXdoaWxlICgtLXNpbGx5X2NvdW50ICYmIG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQk1DUikgJiBCTUNSX1JFU0VUKQorCQkvKiBkbyBub3RoaW5nICovOworCWlmICghc2lsbHlfY291bnQpIHsKKwkJcHJpbnRrKCIlczogTUlJIHJlc2V0IGZhaWxlZCFcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlyZWcwID0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTUNSKTsKKworCWlmICghbnAtPm1paV9pZi5mb3JjZV9tZWRpYSkgeworCQlyZWcwIHw9IEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVDsKKwl9IGVsc2UgeworCQlyZWcwICY9IH4oQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKwkJaWYgKG5wLT5zcGVlZDEwMCkKKwkJCXJlZzAgfD0gQk1DUl9TUEVFRDEwMDsKKwkJaWYgKG5wLT5taWlfaWYuZnVsbF9kdXBsZXgpCisJCQlyZWcwIHw9IEJNQ1JfRlVMTERQTFg7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTGluayBmb3JjZWQgdG8gJXNNYml0ICVzLWR1cGxleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwKKwkJICAgICAgIG5wLT5zcGVlZDEwMCA/ICIxMDAiIDogIjEwIiwKKwkJICAgICAgIG5wLT5taWlfaWYuZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIpOworCX0KKwltZGlvX3dyaXRlKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTUNSLCByZWcwKTsKK30KKworCitzdGF0aWMgdm9pZCB0eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwlpbnQgb2xkX2RlYnVnOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUjOC44eCwgIgorCSAgICAgICAicmVzZXR0aW5nLi4uXG4iLCBkZXYtPm5hbWUsIChpbnQpIHJlYWRsKGlvYWRkciArIEludHJTdGF0dXMpKTsKKworCS8qIFBlcmhhcHMgd2Ugc2hvdWxkIHJlaW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUgaGVyZS4gKi8KKworCS8qCisJICogU3RvcCBhbmQgcmVzdGFydCB0aGUgaW50ZXJmYWNlLgorCSAqIENoZWF0IGFuZCBpbmNyZWFzZSB0aGUgZGVidWcgbGV2ZWwgdGVtcG9yYXJpbHkuCisJICovCisJb2xkX2RlYnVnID0gZGVidWc7CisJZGVidWcgPSAyOworCW5ldGRldl9jbG9zZShkZXYpOworCW5ldGRldl9vcGVuKGRldik7CisJZGVidWcgPSBvbGRfZGVidWc7CisKKwkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQuICovCisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisKKy8qIEluaXRpYWxpemUgdGhlIFJ4IGFuZCBUeCByaW5ncywgYWxvbmcgd2l0aCB2YXJpb3VzICdkZXYnIGJpdHMuICovCitzdGF0aWMgdm9pZCBpbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCW5wLT5jdXJfcnggPSBucC0+Y3VyX3R4ID0gbnAtPnJlYXBfdHggPSAwOworCW5wLT5kaXJ0eV9yeCA9IG5wLT5kaXJ0eV90eCA9IG5wLT5yeF9kb25lID0gbnAtPnR4X2RvbmUgPSAwOworCisJbnAtPnJ4X2J1Zl9zeiA9IChkZXYtPm10dSA8PSAxNTAwID8gUEtUX0JVRl9TWiA6IGRldi0+bXR1ICsgMzIpOworCisJLyogRmlsbCBpbiB0aGUgUnggYnVmZmVycy4gIEhhbmRsZSBhbGxvY2F0aW9uIGZhaWx1cmUgZ3JhY2VmdWxseS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IobnAtPnJ4X2J1Zl9zeik7CisJCW5wLT5yeF9pbmZvW2ldLnNrYiA9IHNrYjsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CisJCW5wLT5yeF9pbmZvW2ldLm1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT50YWlsLCBucC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCS8qIEdycnIsIHdlIGNhbm5vdCBvZmZzZXQgdG8gY29ycmVjdGx5IGFsaWduIHRoZSBJUCBoZWFkZXIuICovCisJCW5wLT5yeF9yaW5nW2ldLnJ4YWRkciA9IGNwdV90b19kbWEobnAtPnJ4X2luZm9baV0ubWFwcGluZyB8IFJ4RGVzY1ZhbGlkKTsKKwl9CisJd3JpdGV3KGkgLSAxLCBucC0+YmFzZSArIFJ4RGVzY1FJZHgpOworCW5wLT5kaXJ0eV9yeCA9ICh1bnNpZ25lZCBpbnQpKGkgLSBSWF9SSU5HX1NJWkUpOworCisJLyogQ2xlYXIgdGhlIHJlbWFpbmRlciBvZiB0aGUgUnggYnVmZmVyIHJpbmcuICovCisJZm9yICggIDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT5yeF9yaW5nW2ldLnJ4YWRkciA9IDA7CisJCW5wLT5yeF9pbmZvW2ldLnNrYiA9IE5VTEw7CisJCW5wLT5yeF9pbmZvW2ldLm1hcHBpbmcgPSAwOworCX0KKwkvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IGFzIHdyYXBwaW5nIHRoZSByaW5nLiAqLworCW5wLT5yeF9yaW5nW1JYX1JJTkdfU0laRSAtIDFdLnJ4YWRkciB8PSBjcHVfdG9fZG1hKFJ4RGVzY0VuZFJpbmcpOworCisJLyogQ2xlYXIgdGhlIGNvbXBsZXRpb24gcmluZ3MuICovCisJZm9yIChpID0gMDsgaSA8IERPTkVfUV9TSVpFOyBpKyspIHsKKwkJbnAtPnJ4X2RvbmVfcVtpXS5zdGF0dXMgPSAwOworCQlucC0+dHhfZG9uZV9xW2ldLnN0YXR1cyA9IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQltZW1zZXQoJm5wLT50eF9pbmZvW2ldLCAwLCBzaXplb2YobnAtPnR4X2luZm9baV0pKTsKKworCXJldHVybjsKK30KKworCitzdGF0aWMgaW50IHN0YXJ0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IGVudHJ5OworCXUzMiBzdGF0dXM7CisJaW50IGk7CisKKwlraWNrX3R4X3RpbWVyKGRldiwgdHhfdGltZW91dCwgVFhfVElNRU9VVCk7CisKKwkvKgorCSAqIGJlIGNhdXRpb3VzIGhlcmUsIHdyYXBwaW5nIHRoZSBxdWV1ZSBoYXMgd2VpcmQgc2VtYW50aWNzCisJICogYW5kIHdlIG1heSBub3QgaGF2ZSBlbm91Z2ggc2xvdHMgZXZlbiB3aGVuIGl0IHNlZW1zIHdlIGRvLgorCSAqLworCWlmICgobnAtPmN1cl90eCAtIG5wLT5kaXJ0eV90eCkgKyBza2JfbnVtX2ZyYWdzKHNrYikgKiAyID4gVFhfUklOR19TSVpFKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDE7CisJfQorCisjaWYgZGVmaW5lZChaRVJPQ09QWSkgJiYgZGVmaW5lZChIQVNfQlJPS0VOX0ZJUk1XQVJFKQorCXsKKwkJaW50IGhhc19iYWRfbGVuZ3RoID0gMDsKKworCQlpZiAoc2tiX2ZpcnN0X2ZyYWdfbGVuKHNrYikgPT0gMSkKKwkJCWhhc19iYWRfbGVuZ3RoID0gMTsKKwkJZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKQorCQkJCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUgPT0gMSkgeworCQkJCQloYXNfYmFkX2xlbmd0aCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJfQorCisJCWlmIChoYXNfYmFkX2xlbmd0aCkKKwkJCXNrYl9jaGVja3N1bV9oZWxwKHNrYik7CisJfQorI2VuZGlmIC8qIFpFUk9DT1BZICYmIEhBU19CUk9LRU5fRklSTVdBUkUgKi8KKworCWVudHJ5ID0gbnAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKwlmb3IgKGkgPSAwOyBpIDwgc2tiX251bV9mcmFncyhza2IpOyBpKyspIHsKKwkJaW50IHdyYXBfcmluZyA9IDA7CisJCXN0YXR1cyA9IFR4RGVzY0lEOworCisJCWlmIChpID09IDApIHsKKwkJCW5wLT50eF9pbmZvW2VudHJ5XS5za2IgPSBza2I7CisJCQlzdGF0dXMgfD0gVHhDUkNFbjsKKwkJCWlmIChlbnRyeSA+PSBUWF9SSU5HX1NJWkUgLSBza2JfbnVtX2ZyYWdzKHNrYikpIHsKKwkJCQlzdGF0dXMgfD0gVHhSaW5nV3JhcDsKKwkJCQl3cmFwX3JpbmcgPSAxOworCQkJfQorCQkJaWYgKG5wLT5yZWFwX3R4KSB7CisJCQkJc3RhdHVzIHw9IFR4RGVzY0ludHI7CisJCQkJbnAtPnJlYXBfdHggPSAwOworCQkJfQorCQkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCQkJc3RhdHVzIHw9IFR4Q2FsVENQOworCQkJCW5wLT5zdGF0cy50eF9jb21wcmVzc2VkKys7CisJCQl9CisJCQlzdGF0dXMgfD0gc2tiX2ZpcnN0X2ZyYWdfbGVuKHNrYikgfCAoc2tiX251bV9mcmFncyhza2IpIDw8IDE2KTsKKworCQkJbnAtPnR4X2luZm9bZW50cnldLm1hcHBpbmcgPQorCQkJCXBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEsIHNrYl9maXJzdF9mcmFnX2xlbihza2IpLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJfSBlbHNlIHsKKyNpZmRlZiBNQVhfU0tCX0ZSQUdTCisJCQlza2JfZnJhZ190ICp0aGlzX2ZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV07CisJCQlzdGF0dXMgfD0gdGhpc19mcmFnLT5zaXplOworCQkJbnAtPnR4X2luZm9bZW50cnldLm1hcHBpbmcgPQorCQkJCXBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBwYWdlX2FkZHJlc3ModGhpc19mcmFnLT5wYWdlKSArIHRoaXNfZnJhZy0+cGFnZV9vZmZzZXQsIHRoaXNfZnJhZy0+c2l6ZSwgUENJX0RNQV9UT0RFVklDRSk7CisjZW5kaWYgLyogTUFYX1NLQl9GUkFHUyAqLworCQl9CisKKwkJbnAtPnR4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fZG1hKG5wLT50eF9pbmZvW2VudHJ5XS5tYXBwaW5nKTsKKwkJbnAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9IGNwdV90b19sZTMyKHN0YXR1cyk7CisJCWlmIChkZWJ1ZyA+IDMpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFR4ICMlZC8jJWQgc2xvdCAlZCBzdGF0dXMgJSM4Ljh4LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIG5wLT5jdXJfdHgsIG5wLT5kaXJ0eV90eCwKKwkJCSAgICAgICBlbnRyeSwgc3RhdHVzKTsKKwkJaWYgKHdyYXBfcmluZykgeworCQkJbnAtPnR4X2luZm9bZW50cnldLnVzZWRfc2xvdHMgPSBUWF9SSU5HX1NJWkUgLSBlbnRyeTsKKwkJCW5wLT5jdXJfdHggKz0gbnAtPnR4X2luZm9bZW50cnldLnVzZWRfc2xvdHM7CisJCQllbnRyeSA9IDA7CisJCX0gZWxzZSB7CisJCQlucC0+dHhfaW5mb1tlbnRyeV0udXNlZF9zbG90cyA9IDE7CisJCQlucC0+Y3VyX3R4ICs9IG5wLT50eF9pbmZvW2VudHJ5XS51c2VkX3Nsb3RzOworCQkJZW50cnkrKzsKKwkJfQorCQkvKiBzY2F2ZW5nZSB0aGUgdHggZGVzY3JpcHRvcnMgdHdpY2UgcGVyIFRYX1JJTkdfU0laRSAqLworCQlpZiAobnAtPmN1cl90eCAlIChUWF9SSU5HX1NJWkUgLyAyKSA9PSAwKQorCQkJbnAtPnJlYXBfdHggPSAxOworCX0KKworCS8qIE5vbi14ODY6IGV4cGxpY2l0bHkgZmx1c2ggZGVzY3JpcHRvciBjYWNoZSBsaW5lcyBoZXJlLiAqLworCS8qIEVuc3VyZSBhbGwgZGVzY3JpcHRvcnMgYXJlIHdyaXR0ZW4gYmFjayBiZWZvcmUgdGhlIHRyYW5zbWl0IGlzCisJICAgaW5pdGlhdGVkLiAtIEplcyAqLworCXdtYigpOworCisJLyogVXBkYXRlIHRoZSBwcm9kdWNlciBpbmRleC4gKi8KKwl3cml0ZWwoZW50cnkgKiAoc2l6ZW9mKHN0YXJmaXJlX3R4X2Rlc2MpIC8gOCksIG5wLT5iYXNlICsgVHhQcm9kdWNlcklkeCk7CisKKwkvKiA0IGlzIGFyYml0cmFyeSwgYnV0IHNob3VsZCBiZSBvayAqLworCWlmICgobnAtPmN1cl90eCAtIG5wLT5kaXJ0eV90eCkgKyA0ID4gVFhfUklOR19TSVpFKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiAwOworfQorCisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIGFsbCBvZiB0aGUgUnggdGhyZWFkIHdvcmsgYW5kIGNsZWFucyB1cAorICAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwlpbnQgYm9ndXNjbnQgPSBtYXhfaW50ZXJydXB0X3dvcms7CisJaW50IGNvbnN1bWVyOworCWludCB0eF9zdGF0dXM7CisJaW50IGhhbmRsZWQgPSAwOworCisJZG8geworCQl1MzIgaW50cl9zdGF0dXMgPSByZWFkbChpb2FkZHIgKyBJbnRyQ2xlYXIpOworCisJCWlmIChkZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEludGVycnVwdCBzdGF0dXMgJSM4Ljh4LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKworCQlpZiAoaW50cl9zdGF0dXMgPT0gMCB8fCBpbnRyX3N0YXR1cyA9PSAodTMyKSAtMSkKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisJCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyUnhEb25lIHwgSW50clJ4RW1wdHkpKQorCQkJbmV0ZGV2X3J4KGRldiwgaW9hZGRyKTsKKworCQkvKiBTY2F2ZW5nZSB0aGUgc2tidWZmIGxpc3QgYmFzZWQgb24gdGhlIFR4LWRvbmUgcXVldWUuCisJCSAgIFRoZXJlIGFyZSByZWR1bmRhbnQgY2hlY2tzIGhlcmUgdGhhdCBtYXkgYmUgY2xlYW5lZCB1cAorCQkgICBhZnRlciB0aGUgZHJpdmVyIGhhcyBwcm92ZW4gdG8gYmUgcmVsaWFibGUuICovCisJCWNvbnN1bWVyID0gcmVhZGwoaW9hZGRyICsgVHhDb25zdW1lcklkeCk7CisJCWlmIChkZWJ1ZyA+IDMpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFR4IENvbnN1bWVyIGluZGV4IGlzICVkLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGNvbnN1bWVyKTsKKworCQl3aGlsZSAoKHR4X3N0YXR1cyA9IGxlMzJfdG9fY3B1KG5wLT50eF9kb25lX3FbbnAtPnR4X2RvbmVdLnN0YXR1cykpICE9IDApIHsKKwkJCWlmIChkZWJ1ZyA+IDMpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeCBjb21wbGV0aW9uICMlZCBlbnRyeSAlZCBpcyAlIzguOHguXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIG5wLT5kaXJ0eV90eCwgbnAtPnR4X2RvbmUsIHR4X3N0YXR1cyk7CisJCQlpZiAoKHR4X3N0YXR1cyAmIDB4ZTAwMDAwMDApID09IDB4YTAwMDAwMDApIHsKKwkJCQlucC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJfSBlbHNlIGlmICgodHhfc3RhdHVzICYgMHhlMDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkgeworCQkJCXUxNiBlbnRyeSA9ICh0eF9zdGF0dXMgJiAweDdmZmYpIC8gc2l6ZW9mKHN0YXJmaXJlX3R4X2Rlc2MpOworCQkJCXN0cnVjdCBza19idWZmICpza2IgPSBucC0+dHhfaW5mb1tlbnRyeV0uc2tiOworCQkJCW5wLT50eF9pbmZvW2VudHJ5XS5za2IgPSBOVUxMOworCQkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsCisJCQkJCQkgbnAtPnR4X2luZm9bZW50cnldLm1hcHBpbmcsCisJCQkJCQkgc2tiX2ZpcnN0X2ZyYWdfbGVuKHNrYiksCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJbnAtPnR4X2luZm9bZW50cnldLm1hcHBpbmcgPSAwOworCQkJCW5wLT5kaXJ0eV90eCArPSBucC0+dHhfaW5mb1tlbnRyeV0udXNlZF9zbG90czsKKwkJCQllbnRyeSA9IChlbnRyeSArIG5wLT50eF9pbmZvW2VudHJ5XS51c2VkX3Nsb3RzKSAlIFRYX1JJTkdfU0laRTsKKyNpZmRlZiBNQVhfU0tCX0ZSQUdTCisJCQkJeworCQkJCQlpbnQgaTsKKwkJCQkJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQkJCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQkJCQkJIG5wLT50eF9pbmZvW2VudHJ5XS5tYXBwaW5nLAorCQkJCQkJCQkgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplLAorCQkJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJCQlucC0+ZGlydHlfdHgrKzsKKwkJCQkJCWVudHJ5Kys7CisJCQkJCX0KKwkJCQl9CisjZW5kaWYgLyogTUFYX1NLQl9GUkFHUyAqLworCQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQl9CisJCQlucC0+dHhfZG9uZV9xW25wLT50eF9kb25lXS5zdGF0dXMgPSAwOworCQkJbnAtPnR4X2RvbmUgPSAobnAtPnR4X2RvbmUgKyAxKSAlIERPTkVfUV9TSVpFOworCQl9CisJCXdyaXRldyhucC0+dHhfZG9uZSwgaW9hZGRyICsgQ29tcGxldGlvblFDb25zdW1lcklkeCArIDIpOworCisJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkJICAgIChucC0+Y3VyX3R4IC0gbnAtPmRpcnR5X3R4ICsgNCA8IFRYX1JJTkdfU0laRSkpIHsKKwkJCS8qIFRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsLCB3YWtlIHRoZSBxdWV1ZS4gKi8KKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCisJCS8qIFN0YXRzIG92ZXJmbG93ICovCisJCWlmIChpbnRyX3N0YXR1cyAmIEludHJTdGF0c01heCkKKwkJCWdldF9zdGF0cyhkZXYpOworCisJCS8qIE1lZGlhIGNoYW5nZSBpbnRlcnJ1cHQuICovCisJCWlmIChpbnRyX3N0YXR1cyAmIEludHJMaW5rQ2hhbmdlKQorCQkJbmV0ZGV2X21lZGlhX2NoYW5nZShkZXYpOworCisJCS8qIEFibm9ybWFsIGVycm9yIHN1bW1hcnkvdW5jb21tb24gZXZlbnRzIGhhbmRsZXJzLiAqLworCQlpZiAoaW50cl9zdGF0dXMgJiBJbnRyQWJub3JtYWxTdW1tYXJ5KQorCQkJbmV0ZGV2X2Vycm9yKGRldiwgaW50cl9zdGF0dXMpOworCisJCWlmICgtLWJvZ3VzY250IDwgMCkgeworCQkJaWYgKGRlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIG11Y2ggd29yayBhdCBpbnRlcnJ1cHQsICIKKwkJCQkgICAgICAgInN0YXR1cz0lIzguOHguXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlpZiAoZGVidWcgPiA0KQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBzdGF0dXM9JSM4Ljh4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgKGludCkgcmVhZGwoaW9hZGRyICsgSW50clN0YXR1cykpOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKKy8qIFRoaXMgcm91dGluZSBpcyBsb2dpY2FsbHkgcGFydCBvZiB0aGUgaW50ZXJydXB0L3BvbGwgaGFuZGxlciwgYnV0IHNlcGFyYXRlZAorICAgZm9yIGNsYXJpdHksIGNvZGUgc2hhcmluZyBiZXR3ZWVuIE5BUEkvbm9uLU5BUEksIGFuZCBiZXR0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbi4gKi8KK3N0YXRpYyBpbnQgX19uZXRkZXZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpxdW90YSkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgZGVzY19zdGF0dXM7CisJaW50IHJldGNvZGUgPSAwOworCisJLyogSWYgRU9QIGlzIHNldCBvbiB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKChkZXNjX3N0YXR1cyA9IGxlMzJfdG9fY3B1KG5wLT5yeF9kb25lX3FbbnAtPnJ4X2RvbmVdLnN0YXR1cykpICE9IDApIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdTE2IHBrdF9sZW47CisJCWludCBlbnRyeTsKKwkJcnhfZG9uZV9kZXNjICpkZXNjID0gJm5wLT5yeF9kb25lX3FbbnAtPnJ4X2RvbmVdOworCisJCWlmIChkZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiICBuZXRkZXZfcngoKSBzdGF0dXMgb2YgJWQgd2FzICUjOC44eC5cbiIsIG5wLT5yeF9kb25lLCBkZXNjX3N0YXR1cyk7CisJCWlmICghKGRlc2Nfc3RhdHVzICYgUnhPSykpIHsKKwkJCS8qIFRoZXJlIHdhcyBhIGVycm9yLiAqLworCQkJaWYgKGRlYnVnID4gMikKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiICBuZXRkZXZfcngoKSBSeCBlcnJvciB3YXMgJSM4Ljh4LlxuIiwgZGVzY19zdGF0dXMpOworCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKGRlc2Nfc3RhdHVzICYgUnhGSUZPRXJyKQorCQkJCW5wLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJZ290byBuZXh0X3J4OworCQl9CisKKwkJaWYgKCpxdW90YSA8PSAwKSB7CS8qIG91dCBvZiByeCBxdW90YSAqLworCQkJcmV0Y29kZSA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCQkoKnF1b3RhKS0tOworCisJCXBrdF9sZW4gPSBkZXNjX3N0YXR1czsJLyogSW1wbGljaXRseSBUcnVuY2F0ZSAqLworCQllbnRyeSA9IChkZXNjX3N0YXR1cyA+PiAxNikgJiAweDdmZjsKKworCQlpZiAoZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbmV0ZGV2X3J4KCkgbm9ybWFsIFJ4IHBrdCBsZW5ndGggJWQsIHF1b3RhICVkLlxuIiwgcGt0X2xlbiwgKnF1b3RhKTsKKwkJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBhY2NlcHQgd2l0aG91dCBjb3B5aW5nCisJCSAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KKwkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKKwkJICAgICYmIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgeworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShucC0+cGNpX2RldiwKKwkJCQkJCSAgICBucC0+cnhfaW5mb1tlbnRyeV0ubWFwcGluZywKKwkJCQkJCSAgICBwa3RfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIG5wLT5yeF9pbmZvW2VudHJ5XS5za2ItPnRhaWwsIHBrdF9sZW4sIDApOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5wLT5wY2lfZGV2LAorCQkJCQkJICAgICAgIG5wLT5yeF9pbmZvW2VudHJ5XS5tYXBwaW5nLAorCQkJCQkJICAgICAgIHBrdF9sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCX0gZWxzZSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBucC0+cnhfaW5mb1tlbnRyeV0ubWFwcGluZywgbnAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNrYiA9IG5wLT5yeF9pbmZvW2VudHJ5XS5za2I7CisJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQlucC0+cnhfaW5mb1tlbnRyeV0uc2tiID0gTlVMTDsKKwkJCW5wLT5yeF9pbmZvW2VudHJ5XS5tYXBwaW5nID0gMDsKKwkJfQorI2lmbmRlZiBmaW5hbF92ZXJzaW9uCQkJLyogUmVtb3ZlIGFmdGVyIHRlc3RpbmcuICovCisJCS8qIFlvdSB3aWxsIHdhbnQgdGhpcyBpbmZvIGZvciB0aGUgaW5pdGlhbCBkZWJ1Zy4gKi8KKwkJaWYgKGRlYnVnID4gNSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgIFJ4IGRhdGEgJTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMng6IgorCQkJICAgICAgICIlMi4yeCAlMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeCAlMi4yeCUyLjJ4LlxuIiwKKwkJCSAgICAgICBza2ItPmRhdGFbMF0sIHNrYi0+ZGF0YVsxXSwgc2tiLT5kYXRhWzJdLCBza2ItPmRhdGFbM10sCisJCQkgICAgICAgc2tiLT5kYXRhWzRdLCBza2ItPmRhdGFbNV0sIHNrYi0+ZGF0YVs2XSwgc2tiLT5kYXRhWzddLAorCQkJICAgICAgIHNrYi0+ZGF0YVs4XSwgc2tiLT5kYXRhWzldLCBza2ItPmRhdGFbMTBdLAorCQkJICAgICAgIHNrYi0+ZGF0YVsxMV0sIHNrYi0+ZGF0YVsxMl0sIHNrYi0+ZGF0YVsxM10pOworI2VuZGlmCisKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKyNpZiBkZWZpbmVkKEhBU19GSVJNV0FSRSkgfHwgZGVmaW5lZChWTEFOX1NVUFBPUlQpCisJCWlmIChkZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiICBuZXRkZXZfcngoKSBzdGF0dXMyIG9mICVkIHdhcyAlIzQuNHguXG4iLCBucC0+cnhfZG9uZSwgbGUxNl90b19jcHUoZGVzYy0+c3RhdHVzMikpOworI2VuZGlmCisjaWZkZWYgSEFTX0ZJUk1XQVJFCisJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5zdGF0dXMyKSAmIDB4MDEwMCkgeworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCW5wLT5zdGF0cy5yeF9jb21wcmVzc2VkKys7CisJCX0KKwkJLyoKKwkJICogVGhpcyBmZWF0dXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSB3b3JraW5nLCBhdCBsZWFzdAorCQkgKiB3aXRoIHRoZSB0d28gZmlybXdhcmUgdmVyc2lvbnMgSSBoYXZlLiBJZiB0aGUgR0ZQIHNlZXMKKwkJICogYW4gSVAgZnJhZ21lbnQsIGl0IGVpdGhlciBpZ25vcmVzIGl0IGNvbXBsZXRlbHksIG9yIHJlcG9ydHMKKwkJICogImJhZCBjaGVja3N1bSIgb24gaXQuCisJCSAqCisJCSAqIE1heWJlIEkgbWlzc2VkIHNvbWV0aGluZyAtLSBjb3JyZWN0aW9ucyBhcmUgd2VsY29tZS4KKwkJICogVW50aWwgdGhlbiwgdGhlIHByaW50ayBzdGF5cy4gOi0pIC1Jb24KKwkJICovCisJCWVsc2UgaWYgKGxlMTZfdG9fY3B1KGRlc2MtPnN0YXR1czIpICYgMHgwMDQwKSB7CisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0hXOworCQkJc2tiLT5jc3VtID0gbGUxNl90b19jcHUoZGVzYy0+Y3N1bSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNoZWNrc3VtX2h3LCBzdGF0dXMyID0gJSN4XG4iLCBkZXYtPm5hbWUsIGxlMTZfdG9fY3B1KGRlc2MtPnN0YXR1czIpKTsKKwkJfQorI2VuZGlmIC8qIEhBU19GSVJNV0FSRSAqLworI2lmZGVmIFZMQU5fU1VQUE9SVAorCQlpZiAobnAtPnZsZ3JwICYmIGxlMTZfdG9fY3B1KGRlc2MtPnN0YXR1czIpICYgMHgwMjAwKSB7CisJCQlpZiAoZGVidWcgPiA0KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgIG5ldGRldl9yeCgpIHZsYW5pZCA9ICVkXG4iLCBsZTE2X3RvX2NwdShkZXNjLT52bGFuaWQpKTsKKwkJCS8qIHZsYW5fbmV0ZGV2X3JlY2VpdmVfc2tiKCkgZXhwZWN0cyBhIHBhY2tldCB3aXRoIHRoZSBWTEFOIHRhZyBzdHJpcHBlZCBvdXQgKi8KKwkJCXZsYW5fbmV0ZGV2X3JlY2VpdmVfc2tiKHNrYiwgbnAtPnZsZ3JwLCBsZTE2X3RvX2NwdShkZXNjLT52bGFuaWQpICYgVkxBTl9WSURfTUFTSyk7CisJCX0gZWxzZQorI2VuZGlmIC8qIFZMQU5fU1VQUE9SVCAqLworCQkJbmV0ZGV2X3JlY2VpdmVfc2tiKHNrYik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW5wLT5zdGF0cy5yeF9wYWNrZXRzKys7CisKKwluZXh0X3J4OgorCQlucC0+Y3VyX3J4Kys7CisJCWRlc2MtPnN0YXR1cyA9IDA7CisJCW5wLT5yeF9kb25lID0gKG5wLT5yeF9kb25lICsgMSkgJSBET05FX1FfU0laRTsKKwl9CisJd3JpdGV3KG5wLT5yeF9kb25lLCBucC0+YmFzZSArIENvbXBsZXRpb25RQ29uc3VtZXJJZHgpOworCisgb3V0OgorCXJlZmlsbF9yeF9yaW5nKGRldik7CisJaWYgKGRlYnVnID4gNSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgZXhpdGluZyBuZXRkZXZfcngoKTogJWQsIHN0YXR1cyBvZiAlZCB3YXMgJSM4Ljh4LlxuIiwKKwkJICAgICAgIHJldGNvZGUsIG5wLT5yeF9kb25lLCBkZXNjX3N0YXR1cyk7CisJcmV0dXJuIHJldGNvZGU7Cit9CisKKworI2lmZGVmIEhBVkVfTkVUREVWX1BPTEwKK3N0YXRpYyBpbnQgbmV0ZGV2X3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCit7CisJdTMyIGludHJfc3RhdHVzOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJaW50IHJldGNvZGUgPSAwLCBxdW90YSA9IGRldi0+cXVvdGE7CisKKwlkbyB7CisJCXdyaXRlbChJbnRyUnhEb25lIHwgSW50clJ4RW1wdHksIGlvYWRkciArIEludHJDbGVhcik7CisKKwkJcmV0Y29kZSA9IF9fbmV0ZGV2X3J4KGRldiwgJnF1b3RhKTsKKwkJKmJ1ZGdldCAtPSAoZGV2LT5xdW90YSAtIHF1b3RhKTsKKwkJZGV2LT5xdW90YSA9IHF1b3RhOworCQlpZiAocmV0Y29kZSkKKwkJCWdvdG8gb3V0OworCisJCWludHJfc3RhdHVzID0gcmVhZGwoaW9hZGRyICsgSW50clN0YXR1cyk7CisJfSB3aGlsZSAoaW50cl9zdGF0dXMgJiAoSW50clJ4RG9uZSB8IEludHJSeEVtcHR5KSk7CisKKwluZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCWludHJfc3RhdHVzID0gcmVhZGwoaW9hZGRyICsgSW50ckVuYWJsZSk7CisJaW50cl9zdGF0dXMgfD0gSW50clJ4RG9uZSB8IEludHJSeEVtcHR5OworCXdyaXRlbChpbnRyX3N0YXR1cywgaW9hZGRyICsgSW50ckVuYWJsZSk7CisKKyBvdXQ6CisJaWYgKGRlYnVnID4gNSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgZXhpdGluZyBuZXRkZXZfcG9sbCgpOiAlZC5cbiIsIHJldGNvZGUpOworCisJLyogUmVzdGFydCBSeCBlbmdpbmUgaWYgc3RvcHBlZC4gKi8KKwlyZXR1cm4gcmV0Y29kZTsKK30KKyNlbmRpZiAvKiBIQVZFX05FVERFVl9QT0xMICovCisKKworc3RhdGljIHZvaWQgcmVmaWxsX3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlbnRyeSA9IC0xOworCisJLyogUmVmaWxsIHRoZSBSeCByaW5nIGJ1ZmZlcnMuICovCisJZm9yICg7IG5wLT5jdXJfcnggLSBucC0+ZGlydHlfcnggPiAwOyBucC0+ZGlydHlfcngrKykgeworCQllbnRyeSA9IG5wLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwkJaWYgKG5wLT5yeF9pbmZvW2VudHJ5XS5za2IgPT0gTlVMTCkgeworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihucC0+cnhfYnVmX3N6KTsKKwkJCW5wLT5yeF9pbmZvW2VudHJ5XS5za2IgPSBza2I7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CS8qIEJldHRlciBsdWNrIG5leHQgcm91bmQuICovCisJCQlucC0+cnhfaW5mb1tlbnRyeV0ubWFwcGluZyA9CisJCQkJcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+dGFpbCwgbnAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNrYi0+ZGV2ID0gZGV2OwkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCQlucC0+cnhfcmluZ1tlbnRyeV0ucnhhZGRyID0KKwkJCQljcHVfdG9fZG1hKG5wLT5yeF9pbmZvW2VudHJ5XS5tYXBwaW5nIHwgUnhEZXNjVmFsaWQpOworCQl9CisJCWlmIChlbnRyeSA9PSBSWF9SSU5HX1NJWkUgLSAxKQorCQkJbnAtPnJ4X3JpbmdbZW50cnldLnJ4YWRkciB8PSBjcHVfdG9fZG1hKFJ4RGVzY0VuZFJpbmcpOworCX0KKwlpZiAoZW50cnkgPj0gMCkKKwkJd3JpdGV3KGVudHJ5LCBucC0+YmFzZSArIFJ4RGVzY1FJZHgpOworfQorCisKK3N0YXRpYyB2b2lkIG5ldGRldl9tZWRpYV9jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCXUxNiByZWcwLCByZWcxLCByZWc0LCByZWc1OworCXUzMiBuZXdfdHhfbW9kZTsKKwl1MzIgbmV3X2ludHJfdGltZXJfY3RybDsKKworCS8qIHJlc2V0IHN0YXR1cyBmaXJzdCAqLworCW1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQk1DUik7CisJbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTVNSKTsKKworCXJlZzAgPSBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgTUlJX0JNQ1IpOworCXJlZzEgPSBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgTUlJX0JNU1IpOworCisJaWYgKHJlZzEgJiBCTVNSX0xTVEFUVVMpIHsKKwkJLyogbGluayBpcyB1cCAqLworCQlpZiAocmVnMCAmIEJNQ1JfQU5FTkFCTEUpIHsKKwkJCS8qIGF1dG9uZWdvdGlhdGlvbiBpcyBlbmFibGVkICovCisJCQlyZWc0ID0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9BRFZFUlRJU0UpOworCQkJcmVnNSA9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlfTFBBKTsKKwkJCWlmIChyZWc0ICYgQURWRVJUSVNFXzEwMEZVTEwgJiYgcmVnNSAmIExQQV8xMDBGVUxMKSB7CisJCQkJbnAtPnNwZWVkMTAwID0gMTsKKwkJCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKKwkJCX0gZWxzZSBpZiAocmVnNCAmIEFEVkVSVElTRV8xMDBIQUxGICYmIHJlZzUgJiBMUEFfMTAwSEFMRikgeworCQkJCW5wLT5zcGVlZDEwMCA9IDE7CisJCQkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDA7CisJCQl9IGVsc2UgaWYgKHJlZzQgJiBBRFZFUlRJU0VfMTBGVUxMICYmIHJlZzUgJiBMUEFfMTBGVUxMKSB7CisJCQkJbnAtPnNwZWVkMTAwID0gMDsKKwkJCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJbnAtPnNwZWVkMTAwID0gMDsKKwkJCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGF1dG9uZWdvdGlhdGlvbiBpcyBkaXNhYmxlZCAqLworCQkJaWYgKHJlZzAgJiBCTUNSX1NQRUVEMTAwKQorCQkJCW5wLT5zcGVlZDEwMCA9IDE7CisJCQllbHNlCisJCQkJbnAtPnNwZWVkMTAwID0gMDsKKwkJCWlmIChyZWcwICYgQk1DUl9GVUxMRFBMWCkKKwkJCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKKwkJCWVsc2UKKwkJCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMDsKKwkJfQorCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTGluayBpcyB1cCwgcnVubmluZyBhdCAlc01iaXQgJXMtZHVwbGV4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLAorCQkgICAgICAgbnAtPnNwZWVkMTAwID8gIjEwMCIgOiAiMTAiLAorCQkgICAgICAgbnAtPm1paV9pZi5mdWxsX2R1cGxleCA/ICJmdWxsIiA6ICJoYWxmIik7CisKKwkJbmV3X3R4X21vZGUgPSBucC0+dHhfbW9kZSAmIH5GdWxsRHVwbGV4OwkvKiBkdXBsZXggc2V0dGluZyAqLworCQlpZiAobnAtPm1paV9pZi5mdWxsX2R1cGxleCkKKwkJCW5ld190eF9tb2RlIHw9IEZ1bGxEdXBsZXg7CisJCWlmIChucC0+dHhfbW9kZSAhPSBuZXdfdHhfbW9kZSkgeworCQkJbnAtPnR4X21vZGUgPSBuZXdfdHhfbW9kZTsKKwkJCXdyaXRlbChucC0+dHhfbW9kZSB8IE1paVNvZnRSZXNldCwgaW9hZGRyICsgVHhNb2RlKTsKKwkJCXVkZWxheSgxMDAwKTsKKwkJCXdyaXRlbChucC0+dHhfbW9kZSwgaW9hZGRyICsgVHhNb2RlKTsKKwkJfQorCisJCW5ld19pbnRyX3RpbWVyX2N0cmwgPSBucC0+aW50cl90aW1lcl9jdHJsICYgflRpbWVyMTBYOworCQlpZiAobnAtPnNwZWVkMTAwKQorCQkJbmV3X2ludHJfdGltZXJfY3RybCB8PSBUaW1lcjEwWDsKKwkJaWYgKG5wLT5pbnRyX3RpbWVyX2N0cmwgIT0gbmV3X2ludHJfdGltZXJfY3RybCkgeworCQkJbnAtPmludHJfdGltZXJfY3RybCA9IG5ld19pbnRyX3RpbWVyX2N0cmw7CisJCQl3cml0ZWwobmV3X2ludHJfdGltZXJfY3RybCwgaW9hZGRyICsgSW50clRpbWVyQ3RybCk7CisJCX0KKwl9IGVsc2UgeworCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IExpbmsgaXMgZG93blxuIiwgZGV2LT5uYW1lKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgbmV0ZGV2X2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbnRyX3N0YXR1cykKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIENhbWUgY2xvc2UgdG8gdW5kZXJydW5uaW5nIHRoZSBUeCBGSUZPLCBpbmNyZWFzZSB0aHJlc2hvbGQuICovCisJaWYgKGludHJfc3RhdHVzICYgSW50clR4RGF0YUxvdykgeworCQlpZiAobnAtPnR4X3RocmVzaG9sZCA8PSBQS1RfQlVGX1NaIC8gMTYpIHsKKwkJCXdyaXRlbCgrK25wLT50eF90aHJlc2hvbGQsIG5wLT5iYXNlICsgVHhUaHJlc2hvbGQpOworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUENJIGJ1cyBjb25nZXN0aW9uLCBpbmNyZWFzaW5nIFR4IEZJRk8gdGhyZXNob2xkIHRvICVkIGJ5dGVzXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgbnAtPnR4X3RocmVzaG9sZCAqIDE2KTsKKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUENJIFR4IHVuZGVyZmxvdyAtLSBhZGFwdGVyIGlzIHByb2JhYmx5IG1hbGZ1bmN0aW9uaW5nXG4iLCBkZXYtPm5hbWUpOworCX0KKwlpZiAoaW50cl9zdGF0dXMgJiBJbnRyUnhHRlBEZWFkKSB7CisJCW5wLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyTm9UeENzdW0gfCBJbnRyRE1BRXJyKSkgeworCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJbnAtPnN0YXRzLnR4X2Vycm9ycysrOworCX0KKwlpZiAoKGludHJfc3RhdHVzICYgfihJbnRyTm9ybWFsTWFzayB8IEludHJBYm5vcm1hbFN1bW1hcnkgfCBJbnRyTGlua0NoYW5nZSB8IEludHJTdGF0c01heCB8IEludHJUeERhdGFMb3cgfCBJbnRyUnhHRlBEZWFkIHwgSW50ck5vVHhDc3VtIHwgSW50clBDSVBhZCkpICYmIGRlYnVnKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTb21ldGhpbmcgV2lja2VkIGhhcHBlbmVkISAlIzguOHguXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCisJLyogVGhpcyBhZGFwdGVyIGFyY2hpdGVjdHVyZSBuZWVkcyBubyBTTVAgbG9ja3MuICovCisJbnAtPnN0YXRzLnR4X2J5dGVzID0gcmVhZGwoaW9hZGRyICsgMHg1NzAxMCk7CisJbnAtPnN0YXRzLnJ4X2J5dGVzID0gcmVhZGwoaW9hZGRyICsgMHg1NzA0NCk7CisJbnAtPnN0YXRzLnR4X3BhY2tldHMgPSByZWFkbChpb2FkZHIgKyAweDU3MDAwKTsKKwlucC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPQorCQlyZWFkbChpb2FkZHIgKyAweDU3MDI0KSArIHJlYWRsKGlvYWRkciArIDB4NTcwMjgpOworCW5wLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gcmVhZGwoaW9hZGRyICsgMHg1NzAxOCk7CisJbnAtPnN0YXRzLmNvbGxpc2lvbnMgPQorCQlyZWFkbChpb2FkZHIgKyAweDU3MDA0KSArIHJlYWRsKGlvYWRkciArIDB4NTcwMDgpOworCisJLyogVGhlIGNoaXAgb25seSBuZWVkIHJlcG9ydCBmcmFtZSBzaWxlbnRseSBkcm9wcGVkLiAqLworCW5wLT5zdGF0cy5yeF9kcm9wcGVkICs9IHJlYWR3KGlvYWRkciArIFJ4RE1BU3RhdHVzKTsKKwl3cml0ZXcoMCwgaW9hZGRyICsgUnhETUFTdGF0dXMpOworCW5wLT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gcmVhZGwoaW9hZGRyICsgMHg1NzAzQyk7CisJbnAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IHJlYWRsKGlvYWRkciArIDB4NTcwNDApOworCW5wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gcmVhZGwoaW9hZGRyICsgMHg1NzA1OCk7CisJbnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSByZWFkbChpb2FkZHIgKyAweDU3MDdDKTsKKworCXJldHVybiAmbnAtPnN0YXRzOworfQorCisKKy8qIENoaXBzIG1heSB1c2UgdGhlIHVwcGVyIG9yIGxvd2VyIENSQyBiaXRzLCBhbmQgbWF5IHJldmVyc2UgYW5kL29yIGludmVydAorICAgdGhlbS4gIFNlbGVjdCB0aGUgZW5kaWFuLW5lc3MgdGhhdCByZXN1bHRzIGluIG1pbmltYWwgY2FsY3VsYXRpb25zLgorKi8KK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwl1MzIgcnhfbW9kZSA9IE1pblZMQU5QcmlvOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCWludCBpOworI2lmZGVmIFZMQU5fU1VQUE9SVAorCisJcnhfbW9kZSB8PSBWbGFuTW9kZTsKKwlpZiAobnAtPnZsZ3JwKSB7CisJCWludCB2bGFuX2NvdW50ID0gMDsKKwkJdm9pZCBfX2lvbWVtICpmaWx0ZXJfYWRkciA9IGlvYWRkciArIEhhc2hUYWJsZSArIDg7CisJCWZvciAoaSA9IDA7IGkgPCBWTEFOX1ZJRF9NQVNLOyBpKyspIHsKKwkJCWlmIChucC0+dmxncnAtPnZsYW5fZGV2aWNlc1tpXSkgeworCQkJCWlmICh2bGFuX2NvdW50ID49IDMyKQorCQkJCQlicmVhazsKKwkJCQl3cml0ZXcoY3B1X3RvX2JlMTYoaSksIGZpbHRlcl9hZGRyKTsKKwkJCQlmaWx0ZXJfYWRkciArPSAxNjsKKwkJCQl2bGFuX2NvdW50Kys7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gVkxBTl9WSURfTUFTSykgeworCQkJcnhfbW9kZSB8PSBQZXJmZWN0RmlsdGVyVmxhbjsKKwkJCXdoaWxlICh2bGFuX2NvdW50IDwgMzIpIHsKKwkJCQl3cml0ZXcoMCwgZmlsdGVyX2FkZHIpOworCQkJCWZpbHRlcl9hZGRyICs9IDE2OworCQkJCXZsYW5fY291bnQrKzsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvKiBWTEFOX1NVUFBPUlQgKi8KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJLyogU2V0IHByb21pc2N1b3VzLiAqLworCQlyeF9tb2RlIHw9IEFjY2VwdEFsbDsKKwl9IGVsc2UgaWYgKChkZXYtPm1jX2NvdW50ID4gbXVsdGljYXN0X2ZpbHRlcl9saW1pdCkKKwkJICAgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIG1hdGNoLCBvciBhY2NlcHQgYWxsIG11bHRpY2FzdHMuICovCisJCXJ4X21vZGUgfD0gQWNjZXB0QnJvYWRjYXN0fEFjY2VwdEFsbE11bHRpY2FzdHxQZXJmZWN0RmlsdGVyOworCX0gZWxzZSBpZiAoZGV2LT5tY19jb3VudCA8PSAxNCkgeworCQkvKiBVc2UgdGhlIDE2IGVsZW1lbnQgcGVyZmVjdCBmaWx0ZXIsIHNraXAgZmlyc3QgdHdvIGVudHJpZXMuICovCisJCXZvaWQgX19pb21lbSAqZmlsdGVyX2FkZHIgPSBpb2FkZHIgKyBQZXJmRmlsdGVyVGFibGUgKyAyICogMTY7CisJCXUxNiAqZWFkZHJzOworCQlmb3IgKGkgPSAyLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudCArIDI7CisJCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWVhZGRycyA9ICh1MTYgKiltY2xpc3QtPmRtaV9hZGRyOworCQkJd3JpdGV3KGNwdV90b19iZTE2KGVhZGRyc1syXSksIGZpbHRlcl9hZGRyKTsgZmlsdGVyX2FkZHIgKz0gNDsKKwkJCXdyaXRldyhjcHVfdG9fYmUxNihlYWRkcnNbMV0pLCBmaWx0ZXJfYWRkcik7IGZpbHRlcl9hZGRyICs9IDQ7CisJCQl3cml0ZXcoY3B1X3RvX2JlMTYoZWFkZHJzWzBdKSwgZmlsdGVyX2FkZHIpOyBmaWx0ZXJfYWRkciArPSA4OworCQl9CisJCWVhZGRycyA9ICh1MTYgKilkZXYtPmRldl9hZGRyOworCQl3aGlsZSAoaSsrIDwgMTYpIHsKKwkJCXdyaXRldyhjcHVfdG9fYmUxNihlYWRkcnNbMF0pLCBmaWx0ZXJfYWRkcik7IGZpbHRlcl9hZGRyICs9IDQ7CisJCQl3cml0ZXcoY3B1X3RvX2JlMTYoZWFkZHJzWzFdKSwgZmlsdGVyX2FkZHIpOyBmaWx0ZXJfYWRkciArPSA0OworCQkJd3JpdGV3KGNwdV90b19iZTE2KGVhZGRyc1syXSksIGZpbHRlcl9hZGRyKTsgZmlsdGVyX2FkZHIgKz0gODsKKwkJfQorCQlyeF9tb2RlIHw9IEFjY2VwdEJyb2FkY2FzdHxQZXJmZWN0RmlsdGVyOworCX0gZWxzZSB7CisJCS8qIE11c3QgdXNlIGEgbXVsdGljYXN0IGhhc2ggdGFibGUuICovCisJCXZvaWQgX19pb21lbSAqZmlsdGVyX2FkZHI7CisJCXUxNiAqZWFkZHJzOworCQl1MTYgbWNfZmlsdGVyWzMyXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZChzaXplb2YobG9uZykpKSk7CS8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworCisJCW1lbXNldChtY19maWx0ZXIsIDAsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWludCBiaXRfbnIgPSBldGhlcl9jcmNfbGUoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDIzOworCQkJX191MzIgKmZwdHIgPSAoX191MzIgKikgJm1jX2ZpbHRlclsoYml0X25yID4+IDQpICYgfjFdOworCisJCQkqZnB0ciB8PSBjcHVfdG9fbGUzMigxIDw8IChiaXRfbnIgJiAzMSkpOworCQl9CisJCS8qIENsZWFyIHRoZSBwZXJmZWN0IGZpbHRlciBsaXN0LCBza2lwIGZpcnN0IHR3byBlbnRyaWVzLiAqLworCQlmaWx0ZXJfYWRkciA9IGlvYWRkciArIFBlcmZGaWx0ZXJUYWJsZSArIDIgKiAxNjsKKwkJZWFkZHJzID0gKHUxNiAqKWRldi0+ZGV2X2FkZHI7CisJCWZvciAoaSA9IDI7IGkgPCAxNjsgaSsrKSB7CisJCQl3cml0ZXcoY3B1X3RvX2JlMTYoZWFkZHJzWzBdKSwgZmlsdGVyX2FkZHIpOyBmaWx0ZXJfYWRkciArPSA0OworCQkJd3JpdGV3KGNwdV90b19iZTE2KGVhZGRyc1sxXSksIGZpbHRlcl9hZGRyKTsgZmlsdGVyX2FkZHIgKz0gNDsKKwkJCXdyaXRldyhjcHVfdG9fYmUxNihlYWRkcnNbMl0pLCBmaWx0ZXJfYWRkcik7IGZpbHRlcl9hZGRyICs9IDg7CisJCX0KKwkJZm9yIChmaWx0ZXJfYWRkciA9IGlvYWRkciArIEhhc2hUYWJsZSwgaSA9IDA7IGkgPCAzMjsgZmlsdGVyX2FkZHIrPSAxNiwgaSsrKQorCQkJd3JpdGV3KG1jX2ZpbHRlcltpXSwgZmlsdGVyX2FkZHIpOworCQlyeF9tb2RlIHw9IEFjY2VwdEJyb2FkY2FzdHxQZXJmZWN0RmlsdGVyfEhhc2hGaWx0ZXI7CisJfQorCXdyaXRlbChyeF9tb2RlLCBpb2FkZHIgKyBSeEZpbHRlck1vZGUpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2lmX3J1bm5pbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBQQ0lfU0xPVF9OQU1FKG5wLT5wY2lfZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbWlpX2V0aHRvb2xfZ3NldCgmbnAtPm1paV9pZiwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmVzOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXMgPSBtaWlfZXRodG9vbF9zc2V0KCZucC0+bWlpX2lmLCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwljaGVja19kdXBsZXgoZGV2KTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IG53YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmbnAtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX2xpbmtfb2soJm5wLT5taWlfaWYpOworfQorCitzdGF0aWMgdTMyIGdldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBkZWJ1ZzsKK30KKworc3RhdGljIHZvaWQgc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWwpCit7CisJZGVidWcgPSB2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHMgPSB7CisJLmJlZ2luID0gY2hlY2tfaWZfcnVubmluZywKKwkuZ2V0X2RydmluZm8gPSBnZXRfZHJ2aW5mbywKKwkuZ2V0X3NldHRpbmdzID0gZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBzZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQgPSBud2F5X3Jlc2V0LAorCS5nZXRfbGluayA9IGdldF9saW5rLAorCS5nZXRfbXNnbGV2ZWwgPSBnZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbCA9IHNldF9tc2dsZXZlbCwKK307CisKK3N0YXRpYyBpbnQgbmV0ZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1paV9pb2N0bF9kYXRhICpkYXRhID0gaWZfbWlpKHJxKTsKKwlpbnQgcmM7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJcmMgPSBnZW5lcmljX21paV9pb2N0bCgmbnAtPm1paV9pZiwgZGF0YSwgY21kLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCWlmICgoY21kID09IFNJT0NTTUlJUkVHKSAmJiAoZGF0YS0+cGh5X2lkID09IG5wLT5waHlzWzBdKSkKKwkJY2hlY2tfZHVwbGV4KGRldik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwlpbnQgaTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwluZXRpZl9zdG9wX2lmKGRldik7CisKKwlpZiAoZGVidWcgPiAxKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIEludHIgc3RhdHVzICUjOC44eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIChpbnQpIHJlYWRsKGlvYWRkciArIEludHJTdGF0dXMpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBRdWV1ZSBwb2ludGVycyB3ZXJlIFR4ICVkIC8gJWQsIFJ4ICVkIC8gJWQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBucC0+Y3VyX3R4LCBucC0+ZGlydHlfdHgsCisJCSAgICAgICBucC0+Y3VyX3J4LCBucC0+ZGlydHlfcngpOworCX0KKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJd3JpdGVsKDAsIGlvYWRkciArIEludHJFbmFibGUpOworCisJLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisJd3JpdGVsKDAsIGlvYWRkciArIEdlbkN0cmwpOworCXJlYWRsKGlvYWRkciArIEdlbkN0cmwpOworCisJaWYgKGRlYnVnID4gNSkgeworCQlwcmludGsoS0VSTl9ERUJVRyIgIFR4IHJpbmcgYXQgJSNsbHg6XG4iLAorCQkgICAgICAgKGxvbmcgbG9uZykgbnAtPnR4X3JpbmdfZG1hKTsKKwkJZm9yIChpID0gMDsgaSA8IDggLyogVFhfUklOR19TSVpFIGlzIGh1Z2UhICovOyBpKyspCisJCQlwcmludGsoS0VSTl9ERUJVRyAiICMlZCBkZXNjLiAlIzguOHggJSNsbHggLT4gJSM4Ljh4LlxuIiwKKwkJCSAgICAgICBpLCBsZTMyX3RvX2NwdShucC0+dHhfcmluZ1tpXS5zdGF0dXMpLAorCQkJICAgICAgIChsb25nIGxvbmcpIGRtYV90b19jcHUobnAtPnR4X3JpbmdbaV0uYWRkciksCisJCQkgICAgICAgbGUzMl90b19jcHUobnAtPnR4X2RvbmVfcVtpXS5zdGF0dXMpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgUnggcmluZyBhdCAlI2xseCAtPiAlcDpcbiIsCisJCSAgICAgICAobG9uZyBsb25nKSBucC0+cnhfcmluZ19kbWEsIG5wLT5yeF9kb25lX3EpOworCQlpZiAobnAtPnJ4X2RvbmVfcSkKKwkJCWZvciAoaSA9IDA7IGkgPCA4IC8qIFJYX1JJTkdfU0laRSAqLzsgaSsrKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAjJWQgZGVzYy4gJSNsbHggLT4gJSM4Ljh4XG4iLAorCQkJCSAgICAgICBpLCAobG9uZyBsb25nKSBkbWFfdG9fY3B1KG5wLT5yeF9yaW5nW2ldLnJ4YWRkciksIGxlMzJfdG9fY3B1KG5wLT5yeF9kb25lX3FbaV0uc3RhdHVzKSk7CisJCX0KKwl9CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCS8qIEZyZWUgYWxsIHRoZSBza2J1ZmZzIGluIHRoZSBSeCBxdWV1ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJbnAtPnJ4X3JpbmdbaV0ucnhhZGRyID0gY3B1X3RvX2RtYSgweEJBREYwMEQwKTsgLyogQW4gaW52YWxpZCBhZGRyZXNzLiAqLworCQlpZiAobnAtPnJ4X2luZm9baV0uc2tiICE9IE5VTEwpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIG5wLT5yeF9pbmZvW2ldLm1hcHBpbmcsIG5wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKG5wLT5yeF9pbmZvW2ldLnNrYik7CisJCX0KKwkJbnAtPnJ4X2luZm9baV0uc2tiID0gTlVMTDsKKwkJbnAtPnJ4X2luZm9baV0ubWFwcGluZyA9IDA7CisJfQorCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbnAtPnR4X2luZm9baV0uc2tiOworCQlpZiAoc2tiID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQkgbnAtPnR4X2luZm9baV0ubWFwcGluZywKKwkJCQkgc2tiX2ZpcnN0X2ZyYWdfbGVuKHNrYiksIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlucC0+dHhfaW5mb1tpXS5tYXBwaW5nID0gMDsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlucC0+dHhfaW5mb1tpXS5za2IgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzdGFyZmlyZV9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCFkZXYpCisJCUJVRygpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCWlmIChucC0+cXVldWVfbWVtKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIG5wLT5xdWV1ZV9tZW1fc2l6ZSwgbnAtPnF1ZXVlX21lbSwgbnAtPnF1ZXVlX21lbV9kbWEpOworCisKKwkvKiBYWFg6IGFkZCB3YWtldXAgY29kZSAtLSByZXF1aXJlcyBmaXJtd2FyZSBmb3IgTWFnaWNQYWNrZXQgKi8KKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CS8qIGdvIHRvIHNsZWVwIGluIEQzIG1vZGUgKi8KKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlpb3VubWFwKG5wLT5iYXNlKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KGRldik7CQkJLyogV2lsbCBhbHNvIGZyZWUgbnAhISAqLworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzdGFyZmlyZV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLnByb2JlCQk9IHN0YXJmaXJlX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc3RhcmZpcmVfcmVtb3ZlX29uZSksCisJLmlkX3RhYmxlCT0gc3RhcmZpcmVfcGNpX3RibCwKK307CisKKworc3RhdGljIGludCBfX2luaXQgc3RhcmZpcmVfaW5pdCAodm9pZCkKK3sKKy8qIHdoZW4gYSBtb2R1bGUsIHRoaXMgaXMgcHJpbnRlZCB3aGV0aGVyIG9yIG5vdCBkZXZpY2VzIGFyZSBmb3VuZCBpbiBwcm9iZSAqLworI2lmZGVmIE1PRFVMRQorCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorI2lmbmRlZiBBRERSXzY0QklUUworCS8qIHdlIGNhbiBkbyB0aGlzIHRlc3Qgb25seSBhdCBydW4tdGltZS4uLiBzaWdoICovCisJaWYgKHNpemVvZihkbWFfYWRkcl90KSA9PSBzaXplb2YodTY0KSkgeworCQlwcmludGsoIlRoaXMgZHJpdmVyIGhhcyBub3QgYmVlbiBwb3J0ZWQgdG8gdGhpcyA2NC1iaXQgYXJjaGl0ZWN0dXJlIHlldFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKyNlbmRpZiAvKiBub3QgQUREUl82NEJJVFMgKi8KKyNpZm5kZWYgSEFTX0ZJUk1XQVJFCisJLyogdW5jb25kaXRpb25hbGx5IGRpc2FibGUgaHcgY2tzdW1zIGlmIGZpcm13YXJlIGlzIG5vdCBwcmVzZW50ICovCisJZW5hYmxlX2h3X2Nrc3VtID0gMDsKKyNlbmRpZiAvKiBub3QgSEFTX0ZJUk1XQVJFICovCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCAoJnN0YXJmaXJlX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHN0YXJmaXJlX2NsZWFudXAgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmc3RhcmZpcmVfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdChzdGFyZmlyZV9pbml0KTsKK21vZHVsZV9leGl0KHN0YXJmaXJlX2NsZWFudXApOworCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RhcmZpcmVfZmlybXdhcmUucGwgYi9kcml2ZXJzL25ldC9zdGFyZmlyZV9maXJtd2FyZS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzgyYjgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3RhcmZpcmVfZmlybXdhcmUucGwKQEAgLTAsMCArMSwzMSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMgVGhpcyBzY3JpcHQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgc3RhcmZpcmVfZmlybXdhcmUuaAorIyBmcm9tIEdGUF9SWC5EQVQgYW5kIEdGUF9UWC5EQVQsIGZpbGVzIGluY2x1ZGVkIHdpdGggdGhlIERESworIyBhbmQgYWxzbyB3aXRoIHRoZSBOb3ZlbGwgZHJpdmVycy4KKworb3BlbiBGVywgIkdGUF9SWC5EQVQiIHx8IGRpZTsKK29wZW4gRldILCAiPnN0YXJmaXJlX2Zpcm13YXJlLmgiIHx8IGRpZTsKKworcHJpbnRmKEZXSCAic3RhdGljIHUzMiBmaXJtd2FyZV9yeFtdID0ge1xuIik7CiskY291bnRlciA9IDA7Cit3aGlsZSAoJGZvbyA9IDxGVz4pIHsKKyAgY2hvbXA7CisgIHByaW50ZihGV0ggIiAgMHglcywgMHgwMDAwJXMsXG4iLCBzdWJzdHIoJGZvbywgNCwgOCksIHN1YnN0cigkZm9vLCAwLCA0KSk7CisgICRjb3VudGVyKys7Cit9CisKK2Nsb3NlIEZXOworb3BlbiBGVywgIkdGUF9UWC5EQVQiIHx8IGRpZTsKKworcHJpbnRmKEZXSCAifTtcdC8qICVkIFJ4IGluc3RydWN0aW9ucyAqL1xuI2RlZmluZSBGSVJNV0FSRV9SWF9TSVpFICVkXG5cbnN0YXRpYyB1MzIgZmlybXdhcmVfdHhbXSA9IHtcbiIsICRjb3VudGVyLCAkY291bnRlcik7CiskY291bnRlciA9IDA7Cit3aGlsZSAoJGZvbyA9IDxGVz4pIHsKKyAgY2hvbXA7CisgIHByaW50ZihGV0ggIiAgMHglcywgMHgwMDAwJXMsXG4iLCBzdWJzdHIoJGZvbywgNCwgOCksIHN1YnN0cigkZm9vLCAwLCA0KSk7CisgICRjb3VudGVyKys7Cit9CisKK2Nsb3NlIEZXOworcHJpbnRmKEZXSCAifTtcdC8qICVkIFR4IGluc3RydWN0aW9ucyAqL1xuI2RlZmluZSBGSVJNV0FSRV9UWF9TSVpFICVkXG4iLCAkY291bnRlciwgJGNvdW50ZXIpOworY2xvc2UoRldIKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0bmljLmMgYi9kcml2ZXJzL25ldC9zdG5pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZGZkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdG5pYy5jCkBAIC0wLDAgKzEsMzIwIEBACisvKiBzdG5pYy5jIDogQSBTSDc3NTAgc3BlY2lmaWMgcGFydCBvZiBkcml2ZXIgZm9yIE5TIERQODM5MDJBIFNULU5JQy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkga2F6IEtvamltYQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NlL3NlLmg+CisjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KKyNpZmRlZiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyAKKyNpbmNsdWRlIDxhc20vc2hfYmlvcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICI4MzkwLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgInN0bmljIgorCisjZGVmaW5lIGJ5dGUJdW5zaWduZWQgY2hhcgorI2RlZmluZSBoYWxmCXVuc2lnbmVkIHNob3J0CisjZGVmaW5lIHdvcmQJdW5zaWduZWQgaW50CisjZGVmaW5lIHZieXRlCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIKKyNkZWZpbmUgdmhhbGYJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQKKyNkZWZpbmUgdndvcmQJdm9sYXRpbGUgdW5zaWduZWQgaW50CisKKyNkZWZpbmUgU1ROSUNfUlVOCTB4MDEJLyogMSA9PSBSdW4sIDAgPT0gcmVzZXQuICovCisKKyNkZWZpbmUgU1RBUlRfUEcJMAkvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlciAqLworI2RlZmluZSBTVE9QX1BHCQkxMjgJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKworLyogQWxpYXMgKi8KKyNkZWZpbmUgU1ROSUNfQ1IJRTgzOTBfQ01ECisjZGVmaW5lIFBHMF9SU0FSMAlFTjBfUlNBUkxPCisjZGVmaW5lIFBHMF9SU0FSMQlFTjBfUlNBUkhJCisjZGVmaW5lIFBHMF9SQkNSMAlFTjBfUkNOVExPCisjZGVmaW5lIFBHMF9SQkNSMQlFTjBfUkNOVEhJCisKKyNkZWZpbmUgQ1JfUlJECQlFODM5MF9SUkVBRAorI2RlZmluZSBDUl9SV1IJCUU4MzkwX1JXUklURQorI2RlZmluZSBDUl9QRzAJCUU4MzkwX1BBR0UwCisjZGVmaW5lIENSX1NUQQkJRTgzOTBfU1RBUlQKKyNkZWZpbmUgQ1JfUkRNQQkJRTgzOTBfTk9ETUEKKworLyogRklYTUUhIFlPVSBNVVNUIFNFVCBZT1VSIE9XTiBFVEhFUiBBRERSRVNTLiAgKi8KK3N0YXRpYyBieXRlIHN0bmljX2VhZHJbNl0gPQorezB4MDAsIDB4YzAsIDB4NmUsIDB4MDAsIDB4MDAsIDB4MDd9OworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnN0bmljX2RldjsKKworc3RhdGljIGludCBzdG5pY19vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc3RuaWNfY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc3RuaWNfcmVzZXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc3RuaWNfZ2V0X2hkciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCSAgIGludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgc3RuaWNfYmxvY2tfaW5wdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiICwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIHN0bmljX2Jsb2NrX291dHB1dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHN0YXJ0X3BhZ2UpOworCitzdGF0aWMgdm9pZCBzdG5pY19pbml0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogU0g3NzUwIHNwZWNpZmljIHJlYWQvd3JpdGUgaW8uICovCitzdGF0aWMgaW5saW5lIHZvaWQKK1NUTklDX0RFTEFZICh2b2lkKQoreworICB2d29yZCB0cmFzaDsKKyAgdHJhc2ggPSAqKHZ3b3JkICopIDB4YTAwMDAwMDA7CisgIHRyYXNoID0gKih2d29yZCAqKSAweGEwMDAwMDAwOworICB0cmFzaCA9ICoodndvcmQgKikgMHhhMDAwMDAwMDsKK30KKworc3RhdGljIGlubGluZSBieXRlCitTVE5JQ19SRUFEIChpbnQgcmVnKQoreworICBieXRlIHZhbDsKKworICB2YWwgPSAoKih2aGFsZiAqKSAoUEFfODM5MDIgKyAoKHJlZykgPDwgMSkpID4+IDgpICYgMHhmZjsKKyAgU1ROSUNfREVMQVkgKCk7CisgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorU1ROSUNfV1JJVEUgKGludCByZWcsIGJ5dGUgdmFsKQoreworICAqKHZoYWxmICopIChQQV84MzkwMiArICgocmVnKSA8PCAxKSkgPSAoKGhhbGYpICh2YWwpIDw8IDgpOworICBTVE5JQ19ERUxBWSAoKTsKK30KKwwKK3N0YXRpYyBpbnQgX19pbml0IHN0bmljX3Byb2JlKHZvaWQpCit7CisgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgIGludCBpLCBlcnI7CisKKyAgLyogSWYgd2UgYXJlIG5vdCBydW5uaW5nIG9uIGEgU29sdXRpb25FbmdpbmUsIGdpdmUgdXAgbm93ICovCisgIGlmICghIE1BQ0hfU0UpCisgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgLyogTmV3IHN0eWxlIHByb2JpbmcgQVBJICovCisgIGRldiA9IGFsbG9jX2VpX25ldGRldigpOworICBpZiAoIWRldikKKyAgCXJldHVybiAtRU5PTUVNOworICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKyNpZmRlZiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyAKKyAgc2hfYmlvc19nZXRfbm9kZV9hZGRyIChzdG5pY19lYWRyKTsKKyNlbmRpZgorICBmb3IgKGkgPSAwOyBpIDwgRVRIRVJfQUREUl9MRU47IGkrKykKKyAgICBkZXYtPmRldl9hZGRyW2ldID0gc3RuaWNfZWFkcltpXTsKKworICAvKiBTZXQgdGhlIGJhc2UgYWRkcmVzcyB0byBwb2ludCB0byB0aGUgTklDLCBub3QgdGhlICJyZWFsIiBiYXNlISAqLworICBkZXYtPmJhc2VfYWRkciA9IDB4MTAwMDsKKyAgZGV2LT5pcnEgPSBJUlFfU1ROSUM7CisgIGRldi0+b3BlbiA9ICZzdG5pY19vcGVuOworICBkZXYtPnN0b3AgPSAmc3RuaWNfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKyAgZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworI2VuZGlmCisKKyAgLyogU25hcmYgdGhlIGludGVycnVwdCBub3cuICBUaGVyZSdzIG5vIHBvaW50IGluIHdhaXRpbmcgc2luY2Ugd2UgY2Fubm90CisgICAgIHNoYXJlIGFuZCB0aGUgYm9hcmQgd2lsbCB1c3VhbGx5IGJlIGVuYWJsZWQuICovCisgIGVyciA9IHJlcXVlc3RfaXJxIChkZXYtPmlycSwgZWlfaW50ZXJydXB0LCAwLCBEUlZfTkFNRSwgZGV2KTsKKyAgaWYgKGVycikgIHsKKyAgICAgIHByaW50ayAoS0VSTl9FTUVSRyAiIHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwgZGV2LT5pcnEpOworICAgICAgZnJlZV9uZXRkZXYoZGV2KTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgIGVpX3N0YXR1cy5uYW1lID0gZGV2LT5uYW1lOworICBlaV9zdGF0dXMud29yZDE2ID0gMTsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXyAKKyAgZWlfc3RhdHVzLmJpZ2VuZGlhbiA9IDA7CisjZWxzZQorICBlaV9zdGF0dXMuYmlnZW5kaWFuID0gMTsKKyNlbmRpZgorICBlaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA9IFNUQVJUX1BHOworICBlaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IFNUQVJUX1BHICsgVFhfUEFHRVM7CisgIGVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBTVE9QX1BHOworCisgIGVpX3N0YXR1cy5yZXNldF84MzkwID0gJnN0bmljX3Jlc2V0OworICBlaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJnN0bmljX2dldF9oZHI7CisgIGVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZzdG5pY19ibG9ja19pbnB1dDsKKyAgZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZzdG5pY19ibG9ja19vdXRwdXQ7CisKKyAgc3RuaWNfaW5pdCAoZGV2KTsKKworICBlcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgaWYgKGVycikgeworICAgIGZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworICAgIGZyZWVfbmV0ZGV2KGRldik7CisgICAgcmV0dXJuIGVycjsKKyAgfQorICBzdG5pY19kZXYgPSBkZXY7CisKKyAgcHJpbnRrIChLRVJOX0lORk8gIk5TIFNULU5JQyA4MzkwMkFcbiIpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzdG5pY19vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworI2lmIDAKKyAgcHJpbnRrIChLRVJOX0RFQlVHICJzdG5pYyBvcGVuXG4iKTsKKyNlbmRpZgorICBlaV9vcGVuIChkZXYpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc3RuaWNfY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIGVpX2Nsb3NlIChkZXYpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3N0bmljX3Jlc2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAqKHZoYWxmICopIFBBXzgzOTAyX1JTVCA9IDA7CisgIHVkZWxheSAoNSk7CisgIGlmIChlaV9kZWJ1ZyA+IDEpCisgICAgcHJpbnRrIChLRVJOX1dBUk5JTkcgIjgzOTAgcmVzZXQgZG9uZSAoJWxkKS5cbiIsIGppZmZpZXMpOworICAqKHZoYWxmICopIFBBXzgzOTAyX1JTVCA9IH4wOworICB1ZGVsYXkgKDUpOworfQorCitzdGF0aWMgdm9pZAorc3RuaWNfZ2V0X2hkciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkgICAgICAgaW50IHJpbmdfcGFnZSkKK3sKKyAgaGFsZiBidWZbMl07CisKKyAgU1ROSUNfV1JJVEUgKFBHMF9SU0FSMCwgMCk7CisgIFNUTklDX1dSSVRFIChQRzBfUlNBUjEsIHJpbmdfcGFnZSk7CisgIFNUTklDX1dSSVRFIChQRzBfUkJDUjAsIDQpOworICBTVE5JQ19XUklURSAoUEcwX1JCQ1IxLCAwKTsKKyAgU1ROSUNfV1JJVEUgKFNUTklDX0NSLCBDUl9SUkQgfCBDUl9QRzAgfCBDUl9TVEEpOworCisgIGJ1ZlswXSA9ICoodmhhbGYgKikgUEFfODM5MDJfSUY7CisgIFNUTklDX0RFTEFZICgpOworICBidWZbMV0gPSAqKHZoYWxmICopIFBBXzgzOTAyX0lGOworICBTVE5JQ19ERUxBWSAoKTsKKyAgaGRyLT5uZXh0ID0gYnVmWzBdID4+IDg7CisgIGhkci0+c3RhdHVzID0gYnVmWzBdICYgMHhmZjsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICBoZHItPmNvdW50ID0gYnVmWzFdOworI2Vsc2UKKyAgaGRyLT5jb3VudCA9ICgoYnVmWzFdID4+IDgpICYgMHhmZikgfCAoYnVmWzFdIDw8IDgpOworI2VuZGlmCisKKyAgaWYgKGVpX2RlYnVnID4gMSkKKyAgICBwcmludGsgKEtFUk5fREVCVUcgInJpbmcgJXggc3RhdHVzICUwMnggbmV4dCAlMDJ4IGNvdW50ICUwNHguXG4iLAorCSAgICByaW5nX3BhZ2UsIGhkci0+c3RhdHVzLCBoZHItPm5leHQsIGhkci0+Y291bnQpOworCisgIFNUTklDX1dSSVRFIChTVE5JQ19DUiwgQ1JfUkRNQSB8IENSX1BHMCB8IENSX1NUQSk7Cit9CisKKy8qIEJsb2NrIGlucHV0IGFuZCBvdXRwdXQsIHNpbWlsYXIgdG8gdGhlIENyeW53ciBwYWNrZXQgZHJpdmVyLiBJZiB5b3UgYXJlCisgICBwb3J0aW5nIHRvIGEgbmV3IGV0aGVyY2FyZCBsb29rIGF0IHRoZSBwYWNrZXQgZHJpdmVyIHNvdXJjZSBmb3IgaGludHMuCisgICBUaGUgSFAgTEFOIGRvZXNuJ3QgdXNlIHNoYXJlZCBtZW1vcnkgLS0gd2UgcHV0IHRoZSBwYWNrZXQKKyAgIG91dCB0aHJvdWdoIHRoZSAicmVtb3RlIERNQSIgZGF0YXBvcnQuICovCisKK3N0YXRpYyB2b2lkCitzdG5pY19ibG9ja19pbnB1dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGxlbmd0aCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgaW50IG9mZnNldCkKK3sKKyAgY2hhciAqYnVmID0gc2tiLT5kYXRhOworICBoYWxmIHZhbDsKKworICBTVE5JQ19XUklURSAoUEcwX1JTQVIwLCBvZmZzZXQgJiAweGZmKTsKKyAgU1ROSUNfV1JJVEUgKFBHMF9SU0FSMSwgb2Zmc2V0ID4+IDgpOworICBTVE5JQ19XUklURSAoUEcwX1JCQ1IwLCBsZW5ndGggJiAweGZmKTsKKyAgU1ROSUNfV1JJVEUgKFBHMF9SQkNSMSwgbGVuZ3RoID4+IDgpOworICBTVE5JQ19XUklURSAoU1ROSUNfQ1IsIENSX1JSRCB8IENSX1BHMCB8IENSX1NUQSk7CisKKyAgaWYgKGxlbmd0aCAmIDEpCisgICAgbGVuZ3RoKys7CisKKyAgd2hpbGUgKGxlbmd0aCA+IDApCisgICAgeworICAgICAgdmFsID0gKih2aGFsZiAqKSBQQV84MzkwMl9JRjsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICAgICAgKmJ1ZisrID0gdmFsICYgMHhmZjsKKyAgICAgICpidWYrKyA9IHZhbCA+PiA4OworI2Vsc2UKKyAgICAgICpidWYrKyA9IHZhbCA+PiA4OworICAgICAgKmJ1ZisrID0gdmFsICYgMHhmZjsKKyNlbmRpZgorICAgICAgU1ROSUNfREVMQVkgKCk7CisgICAgICBsZW5ndGggLT0gc2l6ZW9mIChoYWxmKTsKKyAgICB9CisKKyAgU1ROSUNfV1JJVEUgKFNUTklDX0NSLCBDUl9SRE1BIHwgQ1JfUEcwIHwgQ1JfU1RBKTsKK30KKworc3RhdGljIHZvaWQKK3N0bmljX2Jsb2NrX291dHB1dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGxlbmd0aCwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IG91dHB1dF9wYWdlKQoreworICBTVE5JQ19XUklURSAoUEcwX1JCQ1IwLCAxKTsJLyogV3JpdGUgbm9uLXplcm8gdmFsdWUgKi8KKyAgU1ROSUNfV1JJVEUgKFNUTklDX0NSLCBDUl9SUkQgfCBDUl9QRzAgfCBDUl9TVEEpOworICBTVE5JQ19ERUxBWSAoKTsKKworICBTVE5JQ19XUklURSAoUEcwX1JCQ1IwLCBsZW5ndGggJiAweGZmKTsKKyAgU1ROSUNfV1JJVEUgKFBHMF9SQkNSMSwgbGVuZ3RoID4+IDgpOworICBTVE5JQ19XUklURSAoUEcwX1JTQVIwLCAwKTsKKyAgU1ROSUNfV1JJVEUgKFBHMF9SU0FSMSwgb3V0cHV0X3BhZ2UpOworICBTVE5JQ19XUklURSAoU1ROSUNfQ1IsIENSX1JXUiB8IENSX1BHMCB8IENSX1NUQSk7CisKKyAgaWYgKGxlbmd0aCAmIDEpCisgICAgbGVuZ3RoKys7CisKKyAgd2hpbGUgKGxlbmd0aCA+IDApCisgICAgeworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisgICAgICAqKHZoYWxmICopIFBBXzgzOTAyX0lGID0gKChoYWxmKSBidWZbMV0gPDwgOCkgfCBidWZbMF07CisjZWxzZQorICAgICAgKih2aGFsZiAqKSBQQV84MzkwMl9JRiA9ICgoaGFsZikgYnVmWzBdIDw8IDgpIHwgYnVmWzFdOworI2VuZGlmCisgICAgICBTVE5JQ19ERUxBWSAoKTsKKyAgICAgIGJ1ZiArPSBzaXplb2YgKGhhbGYpOworICAgICAgbGVuZ3RoIC09IHNpemVvZiAoaGFsZik7CisgICAgfQorCisgIFNUTklDX1dSSVRFIChTVE5JQ19DUiwgQ1JfUkRNQSB8IENSX1BHMCB8IENSX1NUQSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBTVE5JQyBpZiBzb21ldGhpbmcgc2NyZXdzIHVwLiAgKi8KK3N0YXRpYyB2b2lkCitzdG5pY19pbml0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBzdG5pY19yZXNldCAoZGV2KTsKKyAgTlM4MzkwX2luaXQgKGRldiwgMCk7CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHN0bmljX2NsZWFudXAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihzdG5pY19kZXYpOworCWZyZWVfaXJxKHN0bmljX2Rldi0+aXJxLCBzdG5pY19kZXYpOworCWZyZWVfbmV0ZGV2KHN0bmljX2Rldik7Cit9CisKK21vZHVsZV9pbml0KHN0bmljX3Byb2JlKTsKK21vZHVsZV9leGl0KHN0bmljX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuM184MjU4Ni5jIGIvZHJpdmVycy9uZXQvc3VuM184MjU4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YTU4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW4zXzgyNTg2LmMKQEAgLTAsMCArMSwxMjExIEBACisvKgorICogU3VuMyBpODI1ODYgRXRoZXJuZXQgZHJpdmVyCisgKgorICogQ2xvbmVkIGZyb20gbmk1Mi5jIGZvciB0aGUgU3VuMyBieSBTYW0gQ3JlYXNleSAoc2FtbXlAc2FtbXkubmV0KQorICoKKyAqIE9yaWdpbmFsIGNvcHlyaWdodCBmb2xsb3dzOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBuZXQtMy1kcml2ZXIgZm9yIHRoZSBOSTUyMTAgY2FyZCAoaTgyNTg2IEV0aGVybmV0IGNoaXApCisgKgorICogVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0sIGFuZCBpcyBjb3ZlcmVkIGJ5IHRoZQorICogc2FtZSBHbnUgUHVibGljIExpY2Vuc2UgdGhhdCBjb3ZlcnMgdGhhdCB3b3JrLgorICoKKyAqIEFscGhhY29kZSAwLjgyICg5Ni8wOS8yOSkgZm9yIExpbnV4IDIuMC4wIChvciBsYXRlcikKKyAqIENvcHlyaWdodHMgKGMpIDE5OTQsMTk5NSwxOTk2IGJ5IE0uSGlwcCAoaGlwcG1AaW5mb3JtYXRpay51bmktdHVlYmluZ2VuLmRlKQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICogQ29uc3VsdCBuaTUyLmMgZm9yIGZ1cnRoZXIgbm90ZXMgZnJvbSB0aGUgb3JpZ2luYWwgZHJpdmVyLgorICoKKyAqIFRoaXMgaW5jYXJuYXRpb24gY3VycmVudGx5IHN1cHBvcnRzIHRoZSBPQklPIHZlcnNpb24gb2YgdGhlIGk4MjU4NiBjaGlwIAorICogdXNlZCBpbiBjZXJ0YWluIHN1bjMgbW9kZWxzLiAgSXQgc2hvdWxkIGJlIGZhaXJseSBkb2FibGUgdG8gZXhwYW5kIHRoaXMKKyAqIHRvIHN1cHBvcnQgVk1FIGlmIEkgc2hvdWxkIGV2ZXJ5IGFjcXVpcmUgc3VjaCBhIGJvYXJkLgorICoKKyAqLworCitzdGF0aWMgaW50IGRlYnVnbGV2ZWwgPSAwOyAvKiBkZWJ1Zy1wcmludGsgMDogb2ZmIDE6IGEgZmV3IDI6IG1vcmUgKi8KK3N0YXRpYyBpbnQgYXV0b21hdGljX3Jlc3VtZSA9IDA7IC8qIGV4cGVyaW1lbnRhbCAuLiBiZXR0ZXIgc2hvdWxkIGJlIHplcm8gKi8KK3N0YXRpYyBpbnQgcmZkYWRkID0gMDsgLyogcmZkYWRkPTEgbWF5IGJlIGJldHRlciBmb3IgOEsgTUVNIGNhcmRzICovCitzdGF0aWMgaW50IGZpZm89MHg4OwkvKiBkb24ndCBjaGFuZ2UgKi8KKworLyogI2RlZmluZSBSRUFMTFlfU0xPV19JTyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoaW5lcy5oPgorI2luY2x1ZGUgPGFzbS9zdW4zbW11Lmg+CisjaW5jbHVkZSA8YXNtL2R2bWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSAic3VuM184MjU4Ni5oIgorCisjZGVmaW5lIERSVl9OQU1FICJzdW4zXzgyNTg2IgorCisjZGVmaW5lIERFQlVHICAgICAgIC8qIGRlYnVnIG9uICovCisjZGVmaW5lIFNZU0JVU1ZBTCAwIC8qIDE2IEJpdCAqLworI2RlZmluZSBTVU4zXzgyNTg2X1RPVEFMX1NJWkUJUEFHRV9TSVpFCisKKyNkZWZpbmUgc3VuM19hdHRuNTg2KCkgIHsqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoZGV2LT5iYXNlX2FkZHIpIHw9IElFT0JfQVRURU47ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShkZXYtPmJhc2VfYWRkcikgJj0gfklFT0JfQVRURU47fQorI2RlZmluZSBzdW4zX3Jlc2V0NTg2KCkgeyoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShkZXYtPmJhc2VfYWRkcikgPSAwOyB1ZGVsYXkoMTAwKTsgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKGRldi0+YmFzZV9hZGRyKSA9IElFT0JfTk9SU0VUO30KKyNkZWZpbmUgc3VuM19kaXNpbnQoKSAgIHsqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoZGV2LT5iYXNlX2FkZHIpICY9IH5JRU9CX0lFTkFCO30KKyNkZWZpbmUgc3VuM19lbmFpbnQoKSAgIHsqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoZGV2LT5iYXNlX2FkZHIpIHw9IElFT0JfSUVOQUI7fQorI2RlZmluZSBzdW4zX2FjdGl2ZSgpICAgeyoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShkZXYtPmJhc2VfYWRkcikgfD0gKElFT0JfSUVOQUJ8SUVPQl9PTkFJUnxJRU9CX05PUlNFVCk7fQorCisjZGVmaW5lIG1ha2UzMihwdHIxNikgKHAtPm1lbXRvcCArIChzd2FiMTYoKHVuc2lnbmVkIHNob3J0KSAocHRyMTYpKSkgKQorI2RlZmluZSBtYWtlMjQocHRyMzIpIChjaGFyICopc3dhYjMyKCggKCh1bnNpZ25lZCBsb25nKSAocHRyMzIpKSAtIHAtPmJhc2UpKQorI2RlZmluZSBtYWtlMTYocHRyMzIpIChzd2FiMTYoKHVuc2lnbmVkIHNob3J0KSAoKHVuc2lnbmVkIGxvbmcpKHB0cjMyKSAtICh1bnNpZ25lZCBsb25nKSBwLT5tZW10b3AgKSkpCisKKy8qKioqKioqKioqKioqKioqKioqIGhvdyB0byBjYWxjdWxhdGUgdGhlIGJ1ZmZlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAqIElNUE9SVEFOVCBOT1RFOiBpZiB5b3UgY29uZmlndXJlIG9ubHkgb25lIE5VTV9YTUlUX0JVRkZTLCB0aGUgZHJpdmVyIHdvcmtzCisgICogLS0tLS0tLS0tLS0tLS0tIGluIGEgZGlmZmVyZW50IChtb3JlIHN0YWJsZT8pIG1vZGUuIE9ubHkgaW4gdGhpcyBtb2RlIGl0J3MKKyAgKiAgICAgICAgICAgICAgICAgcG9zc2libGUgdG8gY29uZmlndXJlIHRoZSBkcml2ZXIgd2l0aCAnTk9fTk9QQ09NTUFORFMnCisKK3NpemVvZihzY3ApPTEyOyBzaXplb2Yoc2NiKT0xNjsgc2l6ZW9mKGlzY3ApPTg7CitzaXplb2Yoc2NwKStzaXplb2YoaXNjcCkrc2l6ZW9mKHNjYikgPSAzNiA9IElOSVQKK3NpemVvZihyZmQpID0gMjQ7IHNpemVvZihyYmQpID0gMTI7CitzaXplb2YodGJkKSA9IDg7IHNpemVvZih0cmFuc21pdF9jbWQpID0gMTY7CitzaXplb2Yobm9wX2NtZCkgPSA4OworCisgICogaWYgeW91IGRvbid0IGtub3cgdGhlIGRyaXZlciwgYmV0dGVyIGRvIG5vdCBjaGFuZ2UgdGhlc2UgdmFsdWVzOiAqLworCisjZGVmaW5lIFJFQ1ZfQlVGRl9TSVpFIDE1MzYgLyogc2xpZ2h0bHkgb3ZlcnNpemVkICovCisjZGVmaW5lIFhNSVRfQlVGRl9TSVpFIDE1MzYgLyogc2xpZ2h0bHkgb3ZlcnNpemVkICovCisjZGVmaW5lIE5VTV9YTUlUX0JVRkZTIDEgICAgLyogY29uZmlnIGZvciAzMksgc2htZW0gKi8KKyNkZWZpbmUgTlVNX1JFQ1ZfQlVGRlNfOCA0IC8qIGNvbmZpZyBmb3IgMzJLIHNoYXJlZCBtZW0gKi8KKyNkZWZpbmUgTlVNX1JFQ1ZfQlVGRlNfMTYgOSAvKiBjb25maWcgZm9yIDMySyBzaGFyZWQgbWVtICovCisjZGVmaW5lIE5VTV9SRUNWX0JVRkZTXzMyIDE2IC8qIGNvbmZpZyBmb3IgMzJLIHNoYXJlZCBtZW0gKi8KKyNkZWZpbmUgTk9fTk9QQ09NTUFORFMgICAgICAvKiBvbmx5IHBvc3NpYmxlIHdpdGggTlVNX1hNSVRfQlVGRlM9MSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRpZmZlcmVudCBERUxBWXMgKi8KKyNkZWZpbmUgREVMQVkoeCkgbWRlbGF5KDMyICogeCk7CisjZGVmaW5lIERFTEFZXzE2KCk7IHsgdWRlbGF5KDE2KTsgfQorI2RlZmluZSBERUxBWV8xOCgpOyB7IHVkZWxheSg0KTsgfQorCisvKiB3YWl0IGZvciBjb21tYW5kIHdpdGggdGltZW91dDogKi8KKyNkZWZpbmUgV0FJVF80X1NDQl9DTUQoKSBcCit7IGludCBpOyBcCisgIGZvcihpPTA7aTwxNjM4NDtpKyspIHsgXAorICAgIGlmKCFwLT5zY2ItPmNtZF9jdWMpIGJyZWFrOyBcCisgICAgREVMQVlfMTgoKTsgXAorICAgIGlmKGkgPT0gMTYzODMpIHsgXAorICAgICAgcHJpbnRrKCIlczogc2NiX2NtZCB0aW1lZCBvdXQ6ICUwNHgsJTA0eCAuLiBkaXNhYmxpbmcgaTgyNTg2ISFcbiIsZGV2LT5uYW1lLHAtPnNjYi0+Y21kX2N1YyxwLT5zY2ItPmN1cyk7IFwKKyAgICAgICBpZighcC0+cmVzZXRlZCkgeyBwLT5yZXNldGVkID0gMTsgc3VuM19yZXNldDU4NigpOyB9IH0gfSB9CisKKyNkZWZpbmUgV0FJVF80X1NDQl9DTURfUlVDKCkgeyBpbnQgaTsgXAorICBmb3IoaT0wO2k8MTYzODQ7aSsrKSB7IFwKKyAgICBpZighcC0+c2NiLT5jbWRfcnVjKSBicmVhazsgXAorICAgIERFTEFZXzE4KCk7IFwKKyAgICBpZihpID09IDE2MzgzKSB7IFwKKyAgICAgIHByaW50aygiJXM6IHNjYl9jbWQgKHJ1YykgdGltZWQgb3V0OiAlMDR4LCUwNHggLi4gZGlzYWJsaW5nIGk4MjU4NiEhXG4iLGRldi0+bmFtZSxwLT5zY2ItPmNtZF9ydWMscC0+c2NiLT5ydXMpOyBcCisgICAgICAgaWYoIXAtPnJlc2V0ZWQpIHsgcC0+cmVzZXRlZCA9IDE7IHN1bjNfcmVzZXQ1ODYoKTsgfSB9IH0gfQorCisjZGVmaW5lIFdBSVRfNF9TVEFUX0NPTVBMKGFkZHIpIHsgaW50IGk7IFwKKyAgIGZvcihpPTA7aTwzMjc2NztpKyspIHsgXAorICAgICBpZihzd2FiMTYoKGFkZHIpLT5jbWRfc3RhdHVzKSAmIFNUQVRfQ09NUEwpIGJyZWFrOyBcCisgICAgIERFTEFZXzE2KCk7IERFTEFZXzE2KCk7IH0gfQorCitzdGF0aWMgaW50ICAgICBzdW4zXzgyNTg2X3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCBpb2FkZHIpOworc3RhdGljIGlycXJldHVybl90IHN1bjNfODI1ODZfaW50ZXJydXB0KGludCBpcnEsdm9pZCAqZGV2X2lkLHN0cnVjdCBwdF9yZWdzICpyZWdfcHRyKTsKK3N0YXRpYyBpbnQgICAgIHN1bjNfODI1ODZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIHN1bjNfODI1ODZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBzdW4zXzgyNTg2X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICosc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgc3RydWN0ICBuZXRfZGV2aWNlX3N0YXRzICpzdW4zXzgyNTg2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIHN1bjNfODI1ODZfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZiAwCitzdGF0aWMgdm9pZCAgICBzdW4zXzgyNTg2X2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKix2b2lkICopOworI2VuZGlmCisKKy8qIGhlbHBlci1mdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgICAgIGluaXQ1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBjaGVjazU4NihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGNoYXIgKndoZXJlLHVuc2lnbmVkIHNpemUpOworc3RhdGljIHZvaWQgICAgYWxsb2M1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBzdGFydHJlY3Y1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICphbGxvY19yZmEoc3RydWN0IG5ldF9kZXZpY2UgKmRldix2b2lkICpwdHIpOworc3RhdGljIHZvaWQgICAgc3VuM184MjU4Nl9yY3ZfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgc3VuM184MjU4Nl94bXRfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgc3VuM184MjU4Nl9ybnJfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdHJ1Y3QgcHJpdgoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwljaGFyICptZW10b3A7CisJbG9uZyBpbnQgbG9jazsKKwlpbnQgcmVzZXRlZDsKKwl2b2xhdGlsZSBzdHJ1Y3QgcmZkX3N0cnVjdAkqcmZkX2xhc3QsKnJmZF90b3AsKnJmZF9maXJzdDsKKwl2b2xhdGlsZSBzdHJ1Y3Qgc2NwX3N0cnVjdAkqc2NwOwkvKiB2b2xhdGlsZSBpcyBpbXBvcnRhbnQgKi8KKwl2b2xhdGlsZSBzdHJ1Y3QgaXNjcF9zdHJ1Y3QJKmlzY3A7CS8qIHZvbGF0aWxlIGlzIGltcG9ydGFudCAqLworCXZvbGF0aWxlIHN0cnVjdCBzY2Jfc3RydWN0CSpzY2I7CS8qIHZvbGF0aWxlIGlzIGltcG9ydGFudCAqLworCXZvbGF0aWxlIHN0cnVjdCB0YmRfc3RydWN0CSp4bWl0X2J1ZmZzW05VTV9YTUlUX0JVRkZTXTsKKwl2b2xhdGlsZSBzdHJ1Y3QgdHJhbnNtaXRfY21kX3N0cnVjdCAqeG1pdF9jbWRzW05VTV9YTUlUX0JVRkZTXTsKKyNpZiAoTlVNX1hNSVRfQlVGRlMgPT0gMSkKKwl2b2xhdGlsZSBzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QgKm5vcF9jbWRzWzJdOworI2Vsc2UKKwl2b2xhdGlsZSBzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QgKm5vcF9jbWRzW05VTV9YTUlUX0JVRkZTXTsKKyNlbmRpZgorCXZvbGF0aWxlIGludAkJbm9wX3BvaW50LG51bV9yZWN2X2J1ZmZzOworCXZvbGF0aWxlIGNoYXIJCSp4bWl0X2NidWZmc1tOVU1fWE1JVF9CVUZGU107CisJdm9sYXRpbGUgaW50CQl4bWl0X2NvdW50LHhtaXRfbGFzdDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjbG9zZSBkZXZpY2UKKyAqLworc3RhdGljIGludCBzdW4zXzgyNTg2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlzdW4zX3Jlc2V0NTg2KCk7IC8qIHRoZSBoYXJkIHdheSB0byBzdG9wIHRoZSByZWNlaXZlciAqLworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBvcGVuIGRldmljZQorICovCitzdGF0aWMgaW50IHN1bjNfODI1ODZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXQ7CisKKwlzdW4zX2Rpc2ludCgpOworCWFsbG9jNTg2KGRldik7CisJaW5pdDU4NihkZXYpOworCXN0YXJ0cmVjdjU4NihkZXYpOworCXN1bjNfZW5haW50KCk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnN1bjNfODI1ODZfaW50ZXJydXB0LDAsZGV2LT5uYW1lLGRldik7CisJaWYgKHJldCkKKwl7CisJCXN1bjNfcmVzZXQ1ODYoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7IC8qIG1vc3QgZG9uZSBieSBpbml0ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbiA4MjU4NiBvdXQgdGhlcmUuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2s1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldixjaGFyICp3aGVyZSx1bnNpZ25lZCBzaXplKQoreworCXN0cnVjdCBwcml2IHBiOworCXN0cnVjdCBwcml2ICpwID0gLyogKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdiovICZwYjsKKwljaGFyICppc2NwX2FkZHI7CisJaW50IGk7CisKKwlwLT5iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGR2bWFfYnRvdigwKTsKKwlwLT5tZW10b3AgPSAoY2hhciAqKWR2bWFfYnRvdigodW5zaWduZWQgbG9uZyl3aGVyZSk7CisJcC0+c2NwID0gKHN0cnVjdCBzY3Bfc3RydWN0ICopKHAtPmJhc2UgKyBTQ1BfREVGQVVMVF9BRERSRVNTKTsKKwltZW1zZXQoKGNoYXIgKilwLT5zY3AsMCwgc2l6ZW9mKHN0cnVjdCBzY3Bfc3RydWN0KSk7CisJZm9yKGk9MDtpPHNpemVvZihzdHJ1Y3Qgc2NwX3N0cnVjdCk7aSsrKSAvKiBtZW1vcnkgd2FzIHdyaXRlYWJsZT8gKi8KKwkJaWYoKChjaGFyICopcC0+c2NwKVtpXSkKKwkJCXJldHVybiAwOworCXAtPnNjcC0+c3lzYnVzID0gU1lTQlVTVkFMOwkJCQkvKiAxID0gOEJpdC1CdXMsIDAgPSAxNiBCaXQgKi8KKwlpZihwLT5zY3AtPnN5c2J1cyAhPSBTWVNCVVNWQUwpCisJCXJldHVybiAwOworCisJaXNjcF9hZGRyID0gKGNoYXIgKilkdm1hX2J0b3YoKHVuc2lnbmVkIGxvbmcpd2hlcmUpOworCQorCXAtPmlzY3AgPSAoc3RydWN0IGlzY3Bfc3RydWN0ICopIGlzY3BfYWRkcjsKKwltZW1zZXQoKGNoYXIgKilwLT5pc2NwLDAsIHNpemVvZihzdHJ1Y3QgaXNjcF9zdHJ1Y3QpKTsKKworCXAtPnNjcC0+aXNjcCA9IG1ha2UyNChwLT5pc2NwKTsKKwlwLT5pc2NwLT5idXN5ID0gMTsKKworCXN1bjNfcmVzZXQ1ODYoKTsKKwlzdW4zX2F0dG41ODYoKTsKKwlERUxBWSgxKTsJLyogd2FpdCBhIHdoaWxlLi4uICovCisJCisJaWYocC0+aXNjcC0+YnVzeSkgLyogaTgyNTg2IGNsZWFycyAnYnVzeScgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbml0ICovCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHNldCBpc2NwIGF0IHRoZSByaWdodCBwbGFjZSwgY2FsbGVkIGJ5IHN1bjNfODI1ODZfcHJvYmUxIGFuZCBvcGVuNTg2LgorICovCitzdGF0aWMgdm9pZCBhbGxvYzU4NihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcml2ICpwID0JKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCXN1bjNfcmVzZXQ1ODYoKTsKKwlERUxBWSgxKTsKKworCXAtPnNjcAk9IChzdHJ1Y3Qgc2NwX3N0cnVjdCAqKQkocC0+YmFzZSArIFNDUF9ERUZBVUxUX0FERFJFU1MpOworCXAtPmlzY3AJPSAoc3RydWN0IGlzY3Bfc3RydWN0ICopIGR2bWFfYnRvdihkZXYtPm1lbV9zdGFydCk7CisJcC0+c2NiICA9IChzdHJ1Y3Qgc2NiX3N0cnVjdCAqKSAgKChjaGFyICopcC0+aXNjcCArIHNpemVvZihzdHJ1Y3QgaXNjcF9zdHJ1Y3QpKTsKKworCW1lbXNldCgoY2hhciAqKSBwLT5pc2NwLDAsc2l6ZW9mKHN0cnVjdCBpc2NwX3N0cnVjdCkpOworCW1lbXNldCgoY2hhciAqKSBwLT5zY3AgLDAsc2l6ZW9mKHN0cnVjdCBzY3Bfc3RydWN0KSk7CisKKwlwLT5zY3AtPmlzY3AgPSBtYWtlMjQocC0+aXNjcCk7CisJcC0+c2NwLT5zeXNidXMgPSBTWVNCVVNWQUw7CisJcC0+aXNjcC0+c2NiX29mZnNldCA9IG1ha2UxNihwLT5zY2IpOworCXAtPmlzY3AtPnNjYl9iYXNlID0gbWFrZTI0KGR2bWFfYnRvdihkZXYtPm1lbV9zdGFydCkpOworCisJcC0+aXNjcC0+YnVzeSA9IDE7CisJc3VuM19yZXNldDU4NigpOworCXN1bjNfYXR0bjU4NigpOworCisJREVMQVkoMSk7CisKKwlpZihwLT5pc2NwLT5idXN5KQorCQlwcmludGsoIiVzOiBJbml0LVByb2JsZW1zIChhbGxvYykuXG4iLGRldi0+bmFtZSk7CisKKwlwLT5yZXNldGVkID0gMDsKKworCW1lbXNldCgoY2hhciAqKXAtPnNjYiwwLHNpemVvZihzdHJ1Y3Qgc2NiX3N0cnVjdCkpOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBzdW4zXzgyNTg2X3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHI7CisJc3RhdGljIGludCBmb3VuZCA9IDA7CisJaW50IGVyciA9IC1FTk9NRU07CisJCisJLyogY2hlY2sgdGhhdCB0aGlzIG1hY2hpbmUgaGFzIGFuIG9uYm9hcmQgODI1ODYgKi8KKwlzd2l0Y2goaWRwcm9tLT5pZF9tYWNodHlwZSkgeworCWNhc2UgU01fU1VOM3xTTV8zXzE2MDoKKwljYXNlIFNNX1NVTjN8U01fM18yNjA6CisJCS8qIHRoZXNlIG1hY2hpbmVzIGhhdmUgODI1ODYgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwl9CisKKwlpZiAoZm91bmQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCQorCWlvYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAoSUVfT0JJTywgU1VOM184MjU4Nl9UT1RBTF9TSVpFKTsKKwlpZiAoIWlvYWRkcikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJZm91bmQgPSAxOworCQorCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgcHJpdikpOworCWlmICghZGV2KQorCQlnb3RvIG91dDsKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJZGV2LT5pcnEgPSBJRV9JUlE7CisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZXJyID0gc3VuM184MjU4Nl9wcm9iZTEoZGV2LCBpb2FkZHIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDI7CisJcmV0dXJuIGRldjsKKworb3V0MjoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIFNVTjNfODI1ODZfVE9UQUxfU0laRSk7CitvdXQxOgorCWZyZWVfbmV0ZGV2KGRldik7CitvdXQ6CisJaW91bm1hcCgodm9pZCAqKWlvYWRkcik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIGludCBfX2luaXQgc3VuM184MjU4Nl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgaW9hZGRyKQoreworCWludCBpLCBzaXplLCByZXR2YWw7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgU1VOM184MjU4Nl9UT1RBTF9TSVpFLCBEUlZfTkFNRSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBjb3B5IGluIHRoZSBldGhlcm5ldCBhZGRyZXNzIGZyb20gdGhlIHByb20gKi8KKwlmb3IoaSA9IDA7IGkgPCA2IDsgaSsrKQorCSAgICAgZGV2LT5kZXZfYWRkcltpXSA9IGlkcHJvbS0+aWRfZXRoYWRkcltpXTsKKworCXByaW50aygiJXM6IFNVTjMgSW50ZWwgODI1ODYgZm91bmQgYXQgJWx4LCAiLGRldi0+bmFtZSxkZXYtPmJhc2VfYWRkcik7CisKKwkvKgorCSAqIGNoZWNrIChvciBzZWFyY2gpIElPLU1lbW9yeSwgMzJLCisJICovCisJc2l6ZSA9IDB4ODAwMDsKKworCWRldi0+bWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpZHZtYV9tYWxsb2NfYWxpZ24oMHg4MDAwLCAweDEwMDApOworCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgc2l6ZTsKKworCWlmKHNpemUgIT0gMHgyMDAwICYmIHNpemUgIT0gMHg0MDAwICYmIHNpemUgIT0gMHg4MDAwKSB7CisJCXByaW50aygiXG4lczogSWxsZWdhbCBtZW1vcnkgc2l6ZSAlZC4gQWxsb3dlZCBpcyAweDIwMDAgb3IgMHg0MDAwIG9yIDB4ODAwMCBieXRlcy5cbiIsZGV2LT5uYW1lLHNpemUpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisJaWYoIWNoZWNrNTg2KGRldiwoY2hhciAqKSBkZXYtPm1lbV9zdGFydCxzaXplKSkgeworCQlwcmludGsoIj9tZW1jaGVjaywgQ2FuJ3QgZmluZCBtZW1vcnkgYXQgMHglbHggd2l0aCBzaXplICVkIVxuIixkZXYtPm1lbV9zdGFydCxzaXplKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJKChzdHJ1Y3QgcHJpdiAqKSAoZGV2LT5wcml2KSktPm1lbXRvcCA9IChjaGFyICopZHZtYV9idG92KGRldi0+bWVtX3N0YXJ0KTsKKwkoKHN0cnVjdCBwcml2ICopIChkZXYtPnByaXYpKS0+YmFzZSA9ICh1bnNpZ25lZCBsb25nKSBkdm1hX2J0b3YoMCk7CisJYWxsb2M1ODYoZGV2KTsKKworCS8qIHNldCBudW1iZXIgb2YgcmVjZWl2ZS1idWZmcyBhY2NvcmRpbmcgdG8gbWVtc2l6ZSAqLworCWlmKHNpemUgPT0gMHgyMDAwKQorCQkoKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdiktPm51bV9yZWN2X2J1ZmZzID0gTlVNX1JFQ1ZfQlVGRlNfODsKKwllbHNlIGlmKHNpemUgPT0gMHg0MDAwKQorCQkoKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdiktPm51bV9yZWN2X2J1ZmZzID0gTlVNX1JFQ1ZfQlVGRlNfMTY7CisJZWxzZQorCQkoKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdiktPm51bV9yZWN2X2J1ZmZzID0gTlVNX1JFQ1ZfQlVGRlNfMzI7CisKKwlwcmludGsoIk1lbWFkZHI6IDB4JWx4LCBNZW1zaXplOiAlZCwgSVJRICVkXG4iLGRldi0+bWVtX3N0YXJ0LHNpemUsIGRldi0+aXJxKTsKKwkKKwlkZXYtPm9wZW4JCT0gc3VuM184MjU4Nl9vcGVuOworCWRldi0+c3RvcAkJPSBzdW4zXzgyNTg2X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzCQk9IHN1bjNfODI1ODZfZ2V0X3N0YXRzOworCWRldi0+dHhfdGltZW91dCAJPSBzdW4zXzgyNTg2X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IEhaLzIwOworCWRldi0+aGFyZF9zdGFydF94bWl0IAk9IHN1bjNfODI1ODZfc2VuZF9wYWNrZXQ7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfbXVsdGljYXN0X2xpc3Q7CisKKwlkZXYtPmlmX3BvcnQgCQk9IDA7CisJcmV0dXJuIDA7CitvdXQ6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBTVU4zXzgyNTg2X1RPVEFMX1NJWkUpOworCXJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIGludCBpbml0NTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdm9pZCAqcHRyOworCWludCBpLHJlc3VsdD0wOworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKwl2b2xhdGlsZSBzdHJ1Y3QgY29uZmlndXJlX2NtZF9zdHJ1Y3QJKmNmZ19jbWQ7CisJdm9sYXRpbGUgc3RydWN0IGlhc2V0dXBfY21kX3N0cnVjdCAqaWFzX2NtZDsKKwl2b2xhdGlsZSBzdHJ1Y3QgdGRyX2NtZF9zdHJ1Y3QgKnRkcl9jbWQ7CisJdm9sYXRpbGUgc3RydWN0IG1jc2V0dXBfY21kX3N0cnVjdCAqbWNfY21kOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pPWRldi0+bWNfbGlzdDsKKwlpbnQgbnVtX2FkZHJzPWRldi0+bWNfY291bnQ7CisKKwlwdHIgPSAodm9pZCAqKSAoKGNoYXIgKilwLT5zY2IgKyBzaXplb2Yoc3RydWN0IHNjYl9zdHJ1Y3QpKTsKKworCWNmZ19jbWQgPSAoc3RydWN0IGNvbmZpZ3VyZV9jbWRfc3RydWN0ICopcHRyOyAvKiBjb25maWd1cmUtY29tbWFuZCAqLworCWNmZ19jbWQtPmNtZF9zdGF0dXMJPSAwOworCWNmZ19jbWQtPmNtZF9jbWQJPSBzd2FiMTYoQ01EX0NPTkZJR1VSRSB8IENNRF9MQVNUKTsKKwljZmdfY21kLT5jbWRfbGluawk9IDB4ZmZmZjsKKworCWNmZ19jbWQtPmJ5dGVfY250CT0gMHgwYTsgLyogbnVtYmVyIG9mIGNmZyBieXRlcyAqLworCWNmZ19jbWQtPmZpZm8JCT0gZmlmbzsgLyogZmlmby1saW1pdCAoOD10eDozMi9yeDo2NCkgKi8KKwljZmdfY21kLT5zYXZfYmYJCT0gMHg0MDsgLyogaG9sZCBvciBkaXNjYXJkIGJhZCByZWN2IGZyYW1lcyAoYml0IDcpICovCisJY2ZnX2NtZC0+YWRyX2xlbgk9IDB4MmU7IC8qIGFkZHJfbGVuIHwhc3JjX2luc2VydCB8cHJlLWxlbiB8bG9vcGJhY2sgKi8KKwljZmdfY21kLT5wcmlvcml0eQk9IDB4MDA7CisJY2ZnX2NtZC0+aWZzCQk9IDB4NjA7CisJY2ZnX2NtZC0+dGltZV9sb3cJPSAweDAwOworCWNmZ19jbWQtPnRpbWVfaGlnaAk9IDB4ZjI7CisJY2ZnX2NtZC0+cHJvbWlzYwk9IDA7CisJaWYoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQlpbnQgbGVuID0gKChjaGFyICopIHAtPmlzY3AgLSAoY2hhciAqKSBwdHIgLSA4KSAvIDY7CisJCWlmKG51bV9hZGRycyA+IGxlbikJeworCQkJcHJpbnRrKCIlczogc3dpdGNoaW5nIHRvIHByb21pc2MuIG1vZGVcbiIsZGV2LT5uYW1lKTsKKwkJCWRldi0+ZmxhZ3N8PUlGRl9QUk9NSVNDOworCQl9CisJfQorCWlmKGRldi0+ZmxhZ3MmSUZGX1BST01JU0MpCisJeworCQkJIGNmZ19jbWQtPnByb21pc2M9MTsKKwkJCSBkZXYtPmZsYWdzfD1JRkZfUFJPTUlTQzsKKwl9CisJY2ZnX2NtZC0+Y2Fycl9jb2xsCT0gMHgwMDsKKworCXAtPnNjYi0+Y2JsX29mZnNldAk9IG1ha2UxNihjZmdfY21kKTsKKwlwLT5zY2ItPmNtZF9ydWMJCT0gMDsKKworCXAtPnNjYi0+Y21kX2N1YwkJPSBDVUNfU1RBUlQ7IC8qIGNtZC4tdW5pdCBzdGFydCAqLworCXN1bjNfYXR0bjU4NigpOworCisJV0FJVF80X1NUQVRfQ09NUEwoY2ZnX2NtZCk7CisKKwlpZigoc3dhYjE2KGNmZ19jbWQtPmNtZF9zdGF0dXMpICYgKFNUQVRfT0t8U1RBVF9DT01QTCkpICE9IChTVEFUX0NPTVBMfFNUQVRfT0spKQorCXsKKwkJcHJpbnRrKCIlczogY29uZmlndXJlIGNvbW1hbmQgZmFpbGVkOiAleFxuIixkZXYtPm5hbWUsc3dhYjE2KGNmZ19jbWQtPmNtZF9zdGF0dXMpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBpbmRpdmlkdWFsIGFkZHJlc3Mgc2V0dXAKKwkgKi8KKworCWlhc19jbWQgPSAoc3RydWN0IGlhc2V0dXBfY21kX3N0cnVjdCAqKXB0cjsKKworCWlhc19jbWQtPmNtZF9zdGF0dXMJPSAwOworCWlhc19jbWQtPmNtZF9jbWQJPSBzd2FiMTYoQ01EX0lBU0VUVVAgfCBDTURfTEFTVCk7CisJaWFzX2NtZC0+Y21kX2xpbmsJPSAweGZmZmY7CisKKwltZW1jcHkoKGNoYXIgKikmaWFzX2NtZC0+aWFkZHIsKGNoYXIgKikgZGV2LT5kZXZfYWRkcixFVEhfQUxFTik7CisKKwlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYoaWFzX2NtZCk7CisKKwlwLT5zY2ItPmNtZF9jdWMgPSBDVUNfU1RBUlQ7IC8qIGNtZC4tdW5pdCBzdGFydCAqLworCXN1bjNfYXR0bjU4NigpOworCisJV0FJVF80X1NUQVRfQ09NUEwoaWFzX2NtZCk7CisKKwlpZigoc3dhYjE2KGlhc19jbWQtPmNtZF9zdGF0dXMpICYgKFNUQVRfT0t8U1RBVF9DT01QTCkpICE9IChTVEFUX09LfFNUQVRfQ09NUEwpKSB7CisJCXByaW50aygiJXMgKDgyNTg2KTogaW5kaXZpZHVhbCBhZGRyZXNzIHNldHVwIGNvbW1hbmQgZmFpbGVkOiAlMDR4XG4iLGRldi0+bmFtZSxzd2FiMTYoaWFzX2NtZC0+Y21kX3N0YXR1cykpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIFREUiwgd2lyZSBjaGVjayAuLiBlLmcuIG5vIHJlc2lzdG9yIGUudC5jCisJICovCisJIAorCXRkcl9jbWQgPSAoc3RydWN0IHRkcl9jbWRfc3RydWN0ICopcHRyOworCisJdGRyX2NtZC0+Y21kX3N0YXR1cwk9IDA7CisJdGRyX2NtZC0+Y21kX2NtZAk9IHN3YWIxNihDTURfVERSIHwgQ01EX0xBU1QpOworCXRkcl9jbWQtPmNtZF9saW5rCT0gMHhmZmZmOworCXRkcl9jbWQtPnN0YXR1cwkJPSAwOworCisJcC0+c2NiLT5jYmxfb2Zmc2V0ID0gbWFrZTE2KHRkcl9jbWQpOworCXAtPnNjYi0+Y21kX2N1YyA9IENVQ19TVEFSVDsgLyogY21kLi11bml0IHN0YXJ0ICovCisJc3VuM19hdHRuNTg2KCk7CisKKwlXQUlUXzRfU1RBVF9DT01QTCh0ZHJfY21kKTsKKworCWlmKCEoc3dhYjE2KHRkcl9jbWQtPmNtZF9zdGF0dXMpICYgU1RBVF9DT01QTCkpCisJeworCQlwcmludGsoIiVzOiBQcm9ibGVtcyB3aGlsZSBydW5uaW5nIHRoZSBURFIuXG4iLGRldi0+bmFtZSk7CisJfQorCWVsc2UKKwl7CisJCURFTEFZXzE2KCk7IC8qIHdhaXQgZm9yIHJlc3VsdCAqLworCQlyZXN1bHQgPSBzd2FiMTYodGRyX2NtZC0+c3RhdHVzKTsKKworCQlwLT5zY2ItPmNtZF9jdWMgPSBwLT5zY2ItPmN1cyAmIFNUQVRfTUFTSzsKKwkJc3VuM19hdHRuNTg2KCk7IC8qIGFjayB0aGUgaW50ZXJydXB0cyAqLworCisJCWlmKHJlc3VsdCAmIFREUl9MTktfT0spCisJCQk7CisJCWVsc2UgaWYocmVzdWx0ICYgVERSX1hDVlJfUFJCKQorCQkJcHJpbnRrKCIlczogVERSOiBUcmFuc2NlaXZlciBwcm9ibGVtLiBDaGVjayB0aGUgY2FibGUocykhXG4iLGRldi0+bmFtZSk7CisJCWVsc2UgaWYocmVzdWx0ICYgVERSX0VUX09QTikKKwkJCXByaW50aygiJXM6IFREUjogTm8gY29ycmVjdCB0ZXJtaW5hdGlvbiAlZCBjbG9ja3MgYXdheS5cbiIsZGV2LT5uYW1lLHJlc3VsdCAmIFREUl9USU1FTUFTSyk7CisJCWVsc2UgaWYocmVzdWx0ICYgVERSX0VUX1NSVCkKKwkJeworCQkJaWYgKHJlc3VsdCAmIFREUl9USU1FTUFTSykgLyogdGltZSA9PSAwIC0+IHN0cmFuZ2UgOi0pICovCisJCQkJcHJpbnRrKCIlczogVERSOiBEZXRlY3RlZCBhIHNob3J0IGNpcmN1aXQgJWQgY2xvY2tzIGF3YXkuXG4iLGRldi0+bmFtZSxyZXN1bHQgJiBURFJfVElNRU1BU0spOworCQl9CisJCWVsc2UKKwkJCXByaW50aygiJXM6IFREUjogVW5rbm93biBzdGF0dXMgJTA0eFxuIixkZXYtPm5hbWUscmVzdWx0KTsKKwl9CisKKwkvKgorCSAqIE11bHRpY2FzdCBzZXR1cAorCSAqLworCWlmKG51bV9hZGRycyAmJiAhKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgKQorCXsKKwkJbWNfY21kID0gKHN0cnVjdCBtY3NldHVwX2NtZF9zdHJ1Y3QgKikgcHRyOworCQltY19jbWQtPmNtZF9zdGF0dXMgPSAwOworCQltY19jbWQtPmNtZF9jbWQgPSBzd2FiMTYoQ01EX01DU0VUVVAgfCBDTURfTEFTVCk7CisJCW1jX2NtZC0+Y21kX2xpbmsgPSAweGZmZmY7CisJCW1jX2NtZC0+bWNfY250ID0gc3dhYjE2KG51bV9hZGRycyAqIDYpOworCisJCWZvcihpPTA7aTxudW1fYWRkcnM7aSsrLGRtaT1kbWktPm5leHQpCisJCQltZW1jcHkoKGNoYXIgKikgbWNfY21kLT5tY19saXN0W2ldLCBkbWktPmRtaV9hZGRyLDYpOworCisJCXAtPnNjYi0+Y2JsX29mZnNldCA9IG1ha2UxNihtY19jbWQpOworCQlwLT5zY2ItPmNtZF9jdWMgPSBDVUNfU1RBUlQ7CisJCXN1bjNfYXR0bjU4NigpOworCisJCVdBSVRfNF9TVEFUX0NPTVBMKG1jX2NtZCk7CisKKwkJaWYoIChzd2FiMTYobWNfY21kLT5jbWRfc3RhdHVzKSAmIChTVEFUX0NPTVBMfFNUQVRfT0spKSAhPSAoU1RBVF9DT01QTHxTVEFUX09LKSApCisJCQlwcmludGsoIiVzOiBDYW4ndCBhcHBseSBtdWx0aWNhc3QtYWRkcmVzcy1saXN0LlxuIixkZXYtPm5hbWUpOworCX0KKworCS8qCisJICogYWxsb2Mgbm9wL3htaXQtY21kcworCSAqLworI2lmIChOVU1fWE1JVF9CVUZGUyA9PSAxKQorCWZvcihpPTA7aTwyO2krKykKKwl7CisJCXAtPm5vcF9jbWRzW2ldIAkJCT0gKHN0cnVjdCBub3BfY21kX3N0cnVjdCAqKXB0cjsKKwkJcC0+bm9wX2NtZHNbaV0tPmNtZF9jbWQJCT0gc3dhYjE2KENNRF9OT1ApOworCQlwLT5ub3BfY21kc1tpXS0+Y21kX3N0YXR1cyAJPSAwOworCQlwLT5ub3BfY21kc1tpXS0+Y21kX2xpbmsJPSBtYWtlMTYoKHAtPm5vcF9jbWRzW2ldKSk7CisJCXB0ciA9IChjaGFyICopIHB0ciArIHNpemVvZihzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QpOworCX0KKyNlbHNlCisJZm9yKGk9MDtpPE5VTV9YTUlUX0JVRkZTO2krKykKKwl7CisJCXAtPm5vcF9jbWRzW2ldCQkJPSAoc3RydWN0IG5vcF9jbWRfc3RydWN0ICopcHRyOworCQlwLT5ub3BfY21kc1tpXS0+Y21kX2NtZAkJPSBzd2FiMTYoQ01EX05PUCk7CisJCXAtPm5vcF9jbWRzW2ldLT5jbWRfc3RhdHVzCT0gMDsKKwkJcC0+bm9wX2NtZHNbaV0tPmNtZF9saW5rCT0gbWFrZTE2KChwLT5ub3BfY21kc1tpXSkpOworCQlwdHIgPSAoY2hhciAqKSBwdHIgKyBzaXplb2Yoc3RydWN0IG5vcF9jbWRfc3RydWN0KTsKKwl9CisjZW5kaWYKKworCXB0ciA9IGFsbG9jX3JmYShkZXYsKHZvaWQgKilwdHIpOyAvKiBpbml0IHJlY2VpdmUtZnJhbWUtYXJlYSAqLworCisJLyoKKwkgKiBhbGxvYyB4bWl0LWJ1ZmZzIC8gaW5pdCB4bWl0X2NtZHMKKwkgKi8KKwlmb3IoaT0wO2k8TlVNX1hNSVRfQlVGRlM7aSsrKQorCXsKKwkJcC0+eG1pdF9jbWRzW2ldID0gKHN0cnVjdCB0cmFuc21pdF9jbWRfc3RydWN0ICopcHRyOyAvKnRyYW5zbWl0IGNtZC9idWZmIDAqLworCQlwdHIgPSAoY2hhciAqKSBwdHIgKyBzaXplb2Yoc3RydWN0IHRyYW5zbWl0X2NtZF9zdHJ1Y3QpOworCQlwLT54bWl0X2NidWZmc1tpXSA9IChjaGFyICopcHRyOyAvKiBjaGFyLWJ1ZmZzICovCisJCXB0ciA9IChjaGFyICopIHB0ciArIFhNSVRfQlVGRl9TSVpFOworCQlwLT54bWl0X2J1ZmZzW2ldID0gKHN0cnVjdCB0YmRfc3RydWN0ICopcHRyOyAvKiBUQkQgKi8KKwkJcHRyID0gKGNoYXIgKikgcHRyICsgc2l6ZW9mKHN0cnVjdCB0YmRfc3RydWN0KTsKKwkJaWYoKHZvaWQgKilwdHIgPiAodm9pZCAqKWRldi0+bWVtX2VuZCkKKwkJeworCQkJcHJpbnRrKCIlczogbm90IGVub3VnaCBzaGFyZWQtbWVtIGZvciB5b3VyIGNvbmZpZ3VyYXRpb24hXG4iLGRldi0+bmFtZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQltZW1zZXQoKGNoYXIgKikocC0+eG1pdF9jbWRzW2ldKSAsMCwgc2l6ZW9mKHN0cnVjdCB0cmFuc21pdF9jbWRfc3RydWN0KSk7CisJCW1lbXNldCgoY2hhciAqKShwLT54bWl0X2J1ZmZzW2ldKSwwLCBzaXplb2Yoc3RydWN0IHRiZF9zdHJ1Y3QpKTsKKwkJcC0+eG1pdF9jbWRzW2ldLT5jbWRfbGluayA9IG1ha2UxNihwLT5ub3BfY21kc1soaSsxKSVOVU1fWE1JVF9CVUZGU10pOworCQlwLT54bWl0X2NtZHNbaV0tPmNtZF9zdGF0dXMgPSBzd2FiMTYoU1RBVF9DT01QTCk7CisJCXAtPnhtaXRfY21kc1tpXS0+Y21kX2NtZCA9IHN3YWIxNihDTURfWE1JVCB8IENNRF9JTlQpOworCQlwLT54bWl0X2NtZHNbaV0tPnRiZF9vZmZzZXQgPSBtYWtlMTYoKHAtPnhtaXRfYnVmZnNbaV0pKTsKKwkJcC0+eG1pdF9idWZmc1tpXS0+bmV4dCA9IDB4ZmZmZjsKKwkJcC0+eG1pdF9idWZmc1tpXS0+YnVmZmVyID0gbWFrZTI0KChwLT54bWl0X2NidWZmc1tpXSkpOworCX0KKworCXAtPnhtaXRfY291bnQgPSAwOworCXAtPnhtaXRfbGFzdAk9IDA7CisjaWZuZGVmIE5PX05PUENPTU1BTkRTCisJcC0+bm9wX3BvaW50CT0gMDsKKyNlbmRpZgorCisJIC8qCisJCSogJ3N0YXJ0IHRyYW5zbWl0dGVyJworCQkqLworI2lmbmRlZiBOT19OT1BDT01NQU5EUworCXAtPnNjYi0+Y2JsX29mZnNldCA9IG1ha2UxNihwLT5ub3BfY21kc1swXSk7CisJcC0+c2NiLT5jbWRfY3VjID0gQ1VDX1NUQVJUOworCXN1bjNfYXR0bjU4NigpOworCVdBSVRfNF9TQ0JfQ01EKCk7CisjZWxzZQorCXAtPnhtaXRfY21kc1swXS0+Y21kX2xpbmsgPSBtYWtlMTYocC0+eG1pdF9jbWRzWzBdKTsKKwlwLT54bWl0X2NtZHNbMF0tPmNtZF9jbWQJPSBzd2FiMTYoQ01EX1hNSVQgfCBDTURfU1VTUEVORCB8IENNRF9JTlQpOworI2VuZGlmCisKKwkvKgorCSAqIGFjay4gaW50ZXJydXB0cworCSAqLworCXAtPnNjYi0+Y21kX2N1YyA9IHAtPnNjYi0+Y3VzICYgU1RBVF9NQVNLOworCXN1bjNfYXR0bjU4NigpOworCURFTEFZXzE2KCk7CisKKwlzdW4zX2VuYWludCgpOworCXN1bjNfYWN0aXZlKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBpcyBhIGhlbHBlciByb3V0aW5lIGZvciBzdW4zXzgyNTg2X3Jucl9pbnQoKSBhbmQgaW5pdDU4NigpLgorICogSXQgc2V0cyB1cCB0aGUgUmVjZWl2ZSBGcmFtZSBBcmVhIChSRkEpLgorICovCisKK3N0YXRpYyB2b2lkICphbGxvY19yZmEoc3RydWN0IG5ldF9kZXZpY2UgKmRldix2b2lkICpwdHIpCit7CisJdm9sYXRpbGUgc3RydWN0IHJmZF9zdHJ1Y3QgKnJmZCA9IChzdHJ1Y3QgcmZkX3N0cnVjdCAqKXB0cjsKKwl2b2xhdGlsZSBzdHJ1Y3QgcmJkX3N0cnVjdCAqcmJkOworCWludCBpOworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCW1lbXNldCgoY2hhciAqKSByZmQsMCxzaXplb2Yoc3RydWN0IHJmZF9zdHJ1Y3QpKihwLT5udW1fcmVjdl9idWZmcytyZmRhZGQpKTsKKwlwLT5yZmRfZmlyc3QgPSByZmQ7CisKKwlmb3IoaSA9IDA7IGkgPCAocC0+bnVtX3JlY3ZfYnVmZnMrcmZkYWRkKTsgaSsrKSB7CisJCXJmZFtpXS5uZXh0ID0gbWFrZTE2KHJmZCArIChpKzEpICUgKHAtPm51bV9yZWN2X2J1ZmZzK3JmZGFkZCkgKTsKKwkJcmZkW2ldLnJiZF9vZmZzZXQgPSAweGZmZmY7CisJfQorCXJmZFtwLT5udW1fcmVjdl9idWZmcy0xK3JmZGFkZF0ubGFzdCA9IFJGRF9TVVNQOwkgLyogUlUgc3VzcGVuZCAqLworCisJcHRyID0gKHZvaWQgKikgKHJmZCArIChwLT5udW1fcmVjdl9idWZmcyArIHJmZGFkZCkgKTsKKworCXJiZCA9IChzdHJ1Y3QgcmJkX3N0cnVjdCAqKSBwdHI7CisJcHRyID0gKHZvaWQgKikgKHJiZCArIHAtPm51bV9yZWN2X2J1ZmZzKTsKKworCSAvKiBjbHIgZGVzY3JpcHRvcnMgKi8KKwltZW1zZXQoKGNoYXIgKikgcmJkLDAsc2l6ZW9mKHN0cnVjdCByYmRfc3RydWN0KSoocC0+bnVtX3JlY3ZfYnVmZnMpKTsKKworCWZvcihpPTA7aTxwLT5udW1fcmVjdl9idWZmcztpKyspCisJeworCQlyYmRbaV0ubmV4dCA9IG1ha2UxNigocmJkICsgKGkrMSkgJSBwLT5udW1fcmVjdl9idWZmcykpOworCQlyYmRbaV0uc2l6ZSA9IHN3YWIxNihSRUNWX0JVRkZfU0laRSk7CisJCXJiZFtpXS5idWZmZXIgPSBtYWtlMjQocHRyKTsKKwkJcHRyID0gKGNoYXIgKikgcHRyICsgUkVDVl9CVUZGX1NJWkU7CisJfQorCisJcC0+cmZkX3RvcAk9IHAtPnJmZF9maXJzdDsKKwlwLT5yZmRfbGFzdCA9IHAtPnJmZF9maXJzdCArIChwLT5udW1fcmVjdl9idWZmcyAtIDEgKyByZmRhZGQpOworCisJcC0+c2NiLT5yZmFfb2Zmc2V0CQk9IG1ha2UxNihwLT5yZmRfZmlyc3QpOworCXAtPnJmZF9maXJzdC0+cmJkX29mZnNldAk9IG1ha2UxNihyYmQpOworCisJcmV0dXJuIHB0cjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEludGVycnVwdCBIYW5kbGVyIC4uLgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzdW4zXzgyNTg2X2ludGVycnVwdChpbnQgaXJxLHZvaWQgKmRldl9pZCxzdHJ1Y3QgcHRfcmVncyAqcmVnX3B0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXVuc2lnbmVkIHNob3J0IHN0YXQ7CisJaW50IGNudD0wOworCXN0cnVjdCBwcml2ICpwOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrICgic3VuM184MjU4Ni1pbnRlcnJ1cHQ6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwlpZihkZWJ1Z2xldmVsID4gMSkKKwkJcHJpbnRrKCJJIik7CisKKwlXQUlUXzRfU0NCX0NNRCgpOyAvKiB3YWl0IGZvciBsYXN0IGNvbW1hbmQJKi8KKworCXdoaWxlKChzdGF0PXAtPnNjYi0+Y3VzICYgU1RBVF9NQVNLKSkKKwl7CisJCXAtPnNjYi0+Y21kX2N1YyA9IHN0YXQ7CisJCXN1bjNfYXR0bjU4NigpOworCisJCWlmKHN0YXQgJiBTVEFUX0ZSKQkgLyogcmVjZWl2ZWQgYSBmcmFtZSAqLworCQkJc3VuM184MjU4Nl9yY3ZfaW50KGRldik7CisKKwkJaWYoc3RhdCAmIFNUQVRfUk5SKSAvKiBSVSB3ZW50ICdub3QgcmVhZHknICovCisJCXsKKwkJCXByaW50aygiKFIpIik7CisJCQlpZihwLT5zY2ItPnJ1cyAmIFJVX1NVU1BFTkQpIC8qIHNwZWNpYWwgY2FzZTogUlVfU1VTUEVORCAqLworCQkJeworCQkJCVdBSVRfNF9TQ0JfQ01EKCk7CisJCQkJcC0+c2NiLT5jbWRfcnVjID0gUlVDX1JFU1VNRTsKKwkJCQlzdW4zX2F0dG41ODYoKTsKKwkJCQlXQUlUXzRfU0NCX0NNRF9SVUMoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwcmludGsoIiVzOiBSZWNlaXZlci1Vbml0IHdlbnQgJ05PVCBSRUFEWSc6ICUwNHgvJTAyeC5cbiIsZGV2LT5uYW1lLChpbnQpIHN0YXQsKGludCkgcC0+c2NiLT5ydXMpOworCQkJCXN1bjNfODI1ODZfcm5yX2ludChkZXYpOworCQkJfQorCQl9CisKKwkJaWYoc3RhdCAmIFNUQVRfQ1gpCQkvKiBjb21tYW5kIHdpdGggSS1iaXQgc2V0IGNvbXBsZXRlICovCisJCQkgc3VuM184MjU4Nl94bXRfaW50KGRldik7CisKKyNpZm5kZWYgTk9fTk9QQ09NTUFORFMKKwkJaWYoc3RhdCAmIFNUQVRfQ05BKQkvKiBDVSB3ZW50ICdub3QgcmVhZHknICovCisJCXsKKwkJCWlmKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCQlwcmludGsoIiVzOiBvb3BzISBDVSBoYXMgbGVmdCBhY3RpdmUgc3RhdGUuIHN0YXQ6ICUwNHgvJTAyeC5cbiIsZGV2LT5uYW1lLChpbnQpIHN0YXQsKGludCkgcC0+c2NiLT5jdXMpOworCQl9CisjZW5kaWYKKworCQlpZihkZWJ1Z2xldmVsID4gMSkKKwkJCXByaW50aygiJWQiLGNudCsrKTsKKworCQlXQUlUXzRfU0NCX0NNRCgpOyAvKiB3YWl0IGZvciBhY2suIChzdW4zXzgyNTg2X3htdF9pbnQgY2FuIGJlIGZhc3RlciB0aGFuIGFjayEhKSAqLworCQlpZihwLT5zY2ItPmNtZF9jdWMpCSAvKiB0aW1lZCBvdXQ/ICovCisJCXsKKwkJCXByaW50aygiJXM6IEFja25vd2xlZGdlIHRpbWVkIG91dC5cbiIsZGV2LT5uYW1lKTsKKwkJCXN1bjNfZGlzaW50KCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmKGRlYnVnbGV2ZWwgPiAxKQorCQlwcmludGsoImkiKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZWNlaXZlLWludGVycnVwdAorICovCisKK3N0YXRpYyB2b2lkIHN1bjNfODI1ODZfcmN2X2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBzdGF0dXMsY250PTA7CisJdW5zaWduZWQgc2hvcnQgdG90bGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJiZF9zdHJ1Y3QgKnJiZDsKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwlpZihkZWJ1Z2xldmVsID4gMCkKKwkJcHJpbnRrKCJSIik7CisKKwlmb3IoOyhzdGF0dXMgPSBwLT5yZmRfdG9wLT5zdGF0X2hpZ2gpICYgUkZEX0NPTVBMOykKKwl7CisJCQlyYmQgPSAoc3RydWN0IHJiZF9zdHJ1Y3QgKikgbWFrZTMyKHAtPnJmZF90b3AtPnJiZF9vZmZzZXQpOworCisJCQlpZihzdGF0dXMgJiBSRkRfT0spIC8qIGZyYW1lIHJlY2VpdmVkIHdpdGhvdXQgZXJyb3I/ICovCisJCQl7CisJCQkJaWYoICh0b3RsZW4gPSBzd2FiMTYocmJkLT5zdGF0dXMpKSAmIFJCRF9MQVNUKSAvKiB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGJ1ZmZlcj8gKi8KKwkJCQl7CisJCQkJCXRvdGxlbiAmPSBSQkRfTUFTSzsgLyogbGVuZ3RoIG9mIHRoaXMgZnJhbWUgKi8KKwkJCQkJcmJkLT5zdGF0dXMgPSAwOworCQkJCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgZGV2X2FsbG9jX3NrYih0b3RsZW4rMik7CisJCQkJCWlmKHNrYiAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQlza2ItPmRldiA9IGRldjsKKwkJCQkJCXNrYl9yZXNlcnZlKHNrYiwyKTsKKwkJCQkJCXNrYl9wdXQoc2tiLHRvdGxlbik7CisJCQkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwoY2hhciAqKSBwLT5iYXNlK3N3YWIzMigodW5zaWduZWQgbG9uZykgcmJkLT5idWZmZXIpLHRvdGxlbiwwKTsKKwkJCQkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCQkJCQluZXRpZl9yeChza2IpOworCQkJCQkJcC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaW50IHJzdGF0OworCQkJCQkJIC8qIGZyZWUgYWxsIFJCRCdzIHVudGlsIFJCRF9MQVNUIGlzIHNldCAqLworCQkJCQl0b3RsZW4gPSAwOworCQkJCQl3aGlsZSghKChyc3RhdD1zd2FiMTYocmJkLT5zdGF0dXMpKSAmIFJCRF9MQVNUKSkKKwkJCQkJeworCQkJCQkJdG90bGVuICs9IHJzdGF0ICYgUkJEX01BU0s7CisJCQkJCQlpZighcnN0YXQpCisJCQkJCQl7CisJCQkJCQkJcHJpbnRrKCIlczogV2hvb3BzIC4uIG5vIGVuZCBtYXJrIGluIFJCRCBsaXN0XG4iLGRldi0+bmFtZSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlyYmQtPnN0YXR1cyA9IDA7CisJCQkJCQlyYmQgPSAoc3RydWN0IHJiZF9zdHJ1Y3QgKikgbWFrZTMyKHJiZC0+bmV4dCk7CisJCQkJCX0KKwkJCQkJdG90bGVuICs9IHJzdGF0ICYgUkJEX01BU0s7CisJCQkJCXJiZC0+c3RhdHVzID0gMDsKKwkJCQkJcHJpbnRrKCIlczogcmVjZWl2ZWQgb3ZlcnNpemVkIGZyYW1lISBsZW5ndGg6ICVkXG4iLGRldi0+bmFtZSx0b3RsZW4pOworCQkJCQlwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkgfQorCQl9CisJCWVsc2UgLyogZnJhbWUgIShvayksIG9ubHkgd2l0aCAnc2F2ZS1iYWQtZnJhbWVzJyAqLworCQl7CisJCQlwcmludGsoIiVzOiBvb3BzISByZmQtZXJyb3Itc3RhdHVzOiAlMDR4XG4iLGRldi0+bmFtZSxzdGF0dXMpOworCQkJcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCX0KKwkJcC0+cmZkX3RvcC0+c3RhdF9oaWdoID0gMDsKKwkJcC0+cmZkX3RvcC0+bGFzdCA9IFJGRF9TVVNQOyAvKiBtYXliZSBleGNoYW5nZSBieSBSRkRfTEFTVCAqLworCQlwLT5yZmRfdG9wLT5yYmRfb2Zmc2V0ID0gMHhmZmZmOworCQlwLT5yZmRfbGFzdC0+bGFzdCA9IDA7CQkJCS8qIGRlbGV0ZSBSRkRfU1VTUAkqLworCQlwLT5yZmRfbGFzdCA9IHAtPnJmZF90b3A7CisJCXAtPnJmZF90b3AgPSAoc3RydWN0IHJmZF9zdHJ1Y3QgKikgbWFrZTMyKHAtPnJmZF90b3AtPm5leHQpOyAvKiBzdGVwIHRvIG5leHQgUkZEICovCisJCXAtPnNjYi0+cmZhX29mZnNldCA9IG1ha2UxNihwLT5yZmRfdG9wKTsKKworCQlpZihkZWJ1Z2xldmVsID4gMCkKKwkJCXByaW50aygiJWQiLGNudCsrKTsKKwl9CisKKwlpZihhdXRvbWF0aWNfcmVzdW1lKQorCXsKKwkJV0FJVF80X1NDQl9DTUQoKTsKKwkJcC0+c2NiLT5jbWRfcnVjID0gUlVDX1JFU1VNRTsKKwkJc3VuM19hdHRuNTg2KCk7CisJCVdBSVRfNF9TQ0JfQ01EX1JVQygpOworCX0KKworI2lmZGVmIFdBSVRfNF9CVVNZCisJeworCQlpbnQgaTsKKwkJZm9yKGk9MDtpPDEwMjQ7aSsrKQorCQl7CisJCQlpZihwLT5yZmRfdG9wLT5zdGF0dXMpCisJCQkJYnJlYWs7CisJCQlERUxBWV8xNigpOworCQkJaWYoaSA9PSAxMDIzKQorCQkJCXByaW50aygiJXM6IFJVIGhhc24ndCBmZXRjaGVkIG5leHQgUkZEIChub3QgYnVzeS9jb21wbGV0ZSlcbiIsZGV2LT5uYW1lKTsKKwkJfQorCX0KKyNlbmRpZgorCisjaWYgMAorCWlmKCFhdF9sZWFzdF9vbmUpCisJeworCQlpbnQgaTsKKwkJdm9sYXRpbGUgc3RydWN0IHJmZF9zdHJ1Y3QgKnJmZHM9cC0+cmZkX3RvcDsKKwkJdm9sYXRpbGUgc3RydWN0IHJiZF9zdHJ1Y3QgKnJiZHM7CisJCXByaW50aygiJXM6IHJlY2VpdmVkIGEgRkMgaW50ci4gd2l0aG91dCBoYXZpbmcgYSBmcmFtZTogJTA0eCAlZFxuIixkZXYtPm5hbWUsc3RhdHVzLG9sZF9hdF9sZWFzdCk7CisJCWZvcihpPTA7aTwgKHAtPm51bV9yZWN2X2J1ZmZzKzQpO2krKykKKwkJeworCQkJcmJkcyA9IChzdHJ1Y3QgcmJkX3N0cnVjdCAqKSBtYWtlMzIocmZkcy0+cmJkX29mZnNldCk7CisJCQlwcmludGsoIiUwNHg6JTA0eCAiLHJmZHMtPnN0YXR1cyxyYmRzLT5zdGF0dXMpOworCQkJcmZkcyA9IChzdHJ1Y3QgcmZkX3N0cnVjdCAqKSBtYWtlMzIocmZkcy0+bmV4dCk7CisJCX0KKwkJcHJpbnRrKCJcbmVycnM6ICUwNHggJTA0eCBzdGF0OiAlMDR4XG4iLChpbnQpcC0+c2NiLT5yc2NfZXJycywoaW50KXAtPnNjYi0+b3Zybl9lcnJzLChpbnQpcC0+c2NiLT5zdGF0dXMpOworCQlwcmludGsoIlxuZXJyczogJTA0eCAlMDR4IHJ1czogJTAyeCwgY3VzOiAlMDJ4XG4iLChpbnQpcC0+c2NiLT5yc2NfZXJycywoaW50KXAtPnNjYi0+b3Zybl9lcnJzLChpbnQpcC0+c2NiLT5ydXMsKGludClwLT5zY2ItPmN1cyk7CisJfQorCW9sZF9hdF9sZWFzdCA9IGF0X2xlYXN0X29uZTsKKyNlbmRpZgorCisJaWYoZGVidWdsZXZlbCA+IDApCisJCXByaW50aygiciIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaGFuZGxlICdSZWNlaXZlciB3ZW50IG5vdCByZWFkeScuCisgKi8KKworc3RhdGljIHZvaWQgc3VuM184MjU4Nl9ybnJfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJcC0+c3RhdHMucnhfZXJyb3JzKys7CisKKwlXQUlUXzRfU0NCX0NNRCgpOwkJLyogd2FpdCBmb3IgdGhlIGxhc3QgY21kLCBXQUlUXzRfRlVMTFNUQVQ/PyAqLworCXAtPnNjYi0+Y21kX3J1YyA9IFJVQ19BQk9SVDsgLyogdXN1YWxseSB0aGUgUlUgaXMgaW4gdGhlICdubyByZXNvdXJjZSctc3RhdGUgLi4gYWJvcnQgaXQgbm93LiAqLworCXN1bjNfYXR0bjU4NigpOworCVdBSVRfNF9TQ0JfQ01EX1JVQygpOwkJLyogd2FpdCBmb3IgYWNjZXB0IGNtZC4gKi8KKworCWFsbG9jX3JmYShkZXYsKGNoYXIgKilwLT5yZmRfZmlyc3QpOworLyogbWF5YmUgYWRkIGEgY2hlY2sgaGVyZSwgYmVmb3JlIHJlc3RhcnRpbmcgdGhlIFJVICovCisJc3RhcnRyZWN2NTg2KGRldik7IC8qIHJlc3RhcnQgUlUgKi8KKworCXByaW50aygiJXM6IFJlY2VpdmUtVW5pdCByZXN0YXJ0ZWQuIFN0YXR1czogJTA0eFxuIixkZXYtPm5hbWUscC0+c2NiLT5ydXMpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBoYW5kbGUgeG1pdCAtIGludGVycnVwdAorICovCisKK3N0YXRpYyB2b2lkIHN1bjNfODI1ODZfeG10X2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBzdGF0dXM7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJaWYoZGVidWdsZXZlbCA+IDApCisJCXByaW50aygiWCIpOworCisJc3RhdHVzID0gc3dhYjE2KHAtPnhtaXRfY21kc1twLT54bWl0X2xhc3RdLT5jbWRfc3RhdHVzKTsKKwlpZighKHN0YXR1cyAmIFNUQVRfQ09NUEwpKQorCQlwcmludGsoIiVzOiBzdHJhbmdlIC4uIHhtaXQtaW50IHdpdGhvdXQgYSAnQ09NUExFVEUnXG4iLGRldi0+bmFtZSk7CisKKwlpZihzdGF0dXMgJiBTVEFUX09LKQorCXsKKwkJcC0+c3RhdHMudHhfcGFja2V0cysrOworCQlwLT5zdGF0cy5jb2xsaXNpb25zICs9IChzdGF0dXMgJiBUQ01EX01BWENPTExNQVNLKTsKKwl9CisJZWxzZQorCXsKKwkJcC0+c3RhdHMudHhfZXJyb3JzKys7CisJCWlmKHN0YXR1cyAmIFRDTURfTEFURUNPTEwpIHsKKwkJCXByaW50aygiJXM6IGxhdGUgY29sbGlzaW9uIGRldGVjdGVkLlxuIixkZXYtPm5hbWUpOworCQkJcC0+c3RhdHMuY29sbGlzaW9ucysrOworCQl9CisJCWVsc2UgaWYoc3RhdHVzICYgVENNRF9OT0NBUlJJRVIpIHsKKwkJCXAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlwcmludGsoIiVzOiBubyBjYXJyaWVyIGRldGVjdGVkLlxuIixkZXYtPm5hbWUpOworCQl9CisJCWVsc2UgaWYoc3RhdHVzICYgVENNRF9MT1NUQ1RTKQorCQkJcHJpbnRrKCIlczogbG9zcyBvZiBDVFMgZGV0ZWN0ZWQuXG4iLGRldi0+bmFtZSk7CisJCWVsc2UgaWYoc3RhdHVzICYgVENNRF9VTkRFUlJVTikgeworCQkJcC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCXByaW50aygiJXM6IERNQSB1bmRlcnJ1biBkZXRlY3RlZC5cbiIsZGV2LT5uYW1lKTsKKwkJfQorCQllbHNlIGlmKHN0YXR1cyAmIFRDTURfTUFYQ09MTCkgeworCQkJcHJpbnRrKCIlczogTWF4LiBjb2xsaXNpb25zIGV4Y2VlZGVkLlxuIixkZXYtPm5hbWUpOworCQkJcC0+c3RhdHMuY29sbGlzaW9ucyArPSAxNjsKKwkJfQorCX0KKworI2lmIChOVU1fWE1JVF9CVUZGUyA+IDEpCisJaWYoICgrK3AtPnhtaXRfbGFzdCkgPT0gTlVNX1hNSVRfQlVGRlMpCisJCXAtPnhtaXRfbGFzdCA9IDA7CisjZW5kaWYKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogKHJlKXN0YXJ0IHRoZSByZWNlaXZlcgorICovCisKK3N0YXRpYyB2b2lkIHN0YXJ0cmVjdjU4NihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCVdBSVRfNF9TQ0JfQ01EKCk7CisJV0FJVF80X1NDQl9DTURfUlVDKCk7CisJcC0+c2NiLT5yZmFfb2Zmc2V0ID0gbWFrZTE2KHAtPnJmZF9maXJzdCk7CisJcC0+c2NiLT5jbWRfcnVjID0gUlVDX1NUQVJUOworCXN1bjNfYXR0bjU4NigpOwkJLyogc3RhcnQgY21kLiAqLworCVdBSVRfNF9TQ0JfQ01EX1JVQygpOwkvKiB3YWl0IGZvciBhY2NlcHQgY21kLiAobm8gdGltZW91dCEhKSAqLworfQorCitzdGF0aWMgdm9pZCBzdW4zXzgyNTg2X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisjaWZuZGVmIE5PX05PUENPTU1BTkRTCisJaWYocC0+c2NiLT5jdXMgJiBDVV9BQ1RJVkUpIC8qIENPTU1BTkQtVU5JVCBhY3RpdmU/ICovCisJeworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCIlczogc3RyYW5nZSAuLi4gdGltZW91dCB3aXRoIENVIGFjdGl2ZT8hP1xuIixkZXYtPm5hbWUpOworCQlwcmludGsoIiVzOiBYMDogJTA0eCBOMDogJTA0eCBOMTogJTA0eCAlZFxuIixkZXYtPm5hbWUsKGludClzd2FiMTYocC0+eG1pdF9jbWRzWzBdLT5jbWRfc3RhdHVzKSwoaW50KXN3YWIxNihwLT5ub3BfY21kc1swXS0+Y21kX3N0YXR1cyksKGludClzd2FiMTYocC0+bm9wX2NtZHNbMV0tPmNtZF9zdGF0dXMpLChpbnQpcC0+bm9wX3BvaW50KTsKKyNlbmRpZgorCQlwLT5zY2ItPmNtZF9jdWMgPSBDVUNfQUJPUlQ7CisJCXN1bjNfYXR0bjU4NigpOworCQlXQUlUXzRfU0NCX0NNRCgpOworCQlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYocC0+bm9wX2NtZHNbcC0+bm9wX3BvaW50XSk7CisJCXAtPnNjYi0+Y21kX2N1YyA9IENVQ19TVEFSVDsKKwkJc3VuM19hdHRuNTg2KCk7CisJCVdBSVRfNF9TQ0JfQ01EKCk7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwl7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCIlczogeG1pdHRlciB0aW1lZCBvdXQsIHRyeSB0byByZXN0YXJ0ISBzdGF0OiAlMDJ4XG4iLGRldi0+bmFtZSxwLT5zY2ItPmN1cyk7CisJCXByaW50aygiJXM6IGNvbW1hbmQtc3RhdHM6ICUwNHggJTA0eFxuIixkZXYtPm5hbWUsc3dhYjE2KHAtPnhtaXRfY21kc1swXS0+Y21kX3N0YXR1cyksc3dhYjE2KHAtPnhtaXRfY21kc1sxXS0+Y21kX3N0YXR1cykpOworCQlwcmludGsoIiVzOiBjaGVjaywgd2hldGhlciB5b3Ugc2V0IHRoZSByaWdodCBpbnRlcnJ1cHQgbnVtYmVyIVxuIixkZXYtPm5hbWUpOworI2VuZGlmCisJCXN1bjNfODI1ODZfY2xvc2UoZGV2KTsKKwkJc3VuM184MjU4Nl9vcGVuKGRldik7CisJfQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzZW5kIGZyYW1lCisgKi8KKworc3RhdGljIGludCBzdW4zXzgyNTg2X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGxlbixpOworI2lmbmRlZiBOT19OT1BDT01NQU5EUworCWludCBuZXh0X25vcDsKKyNlbmRpZgorCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCWlmKHNrYi0+bGVuID4gWE1JVF9CVUZGX1NJWkUpCisJeworCQlwcmludGsoIiVzOiBTb3JyeSwgbWF4LiBmcmFtZWxlbmd0aCBpcyAlZCBieXRlcy4gVGhlIGxlbmd0aCBvZiB5b3VyIGZyYW1lIGlzICVkIGJ5dGVzLlxuIixkZXYtPm5hbWUsWE1JVF9CVUZGX1NJWkUsc2tiLT5sZW4pOworCQlyZXR1cm4gMDsKKwl9CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyNpZihOVU1fWE1JVF9CVUZGUyA+IDEpCisJaWYodGVzdF9hbmRfc2V0X2JpdCgwLCh2b2lkICopICZwLT5sb2NrKSkgeworCQlwcmludGsoIiVzOiBRdWV1ZSB3YXMgbG9ja2VkXG4iLGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJCWxlbiA9IHNrYi0+bGVuOworCQlpZiAobGVuIDwgRVRIX1pMRU4pIHsKKwkJCW1lbXNldCgoY2hhciAqKXAtPnhtaXRfY2J1ZmZzW3AtPnhtaXRfY291bnRdLCAwLCBFVEhfWkxFTik7CisJCQlsZW4gPSBFVEhfWkxFTjsKKwkJfQorCQltZW1jcHkoKGNoYXIgKilwLT54bWl0X2NidWZmc1twLT54bWl0X2NvdW50XSwoY2hhciAqKShza2ItPmRhdGEpLHNrYi0+bGVuKTsKKworI2lmIChOVU1fWE1JVF9CVUZGUyA9PSAxKQorIwlpZmRlZiBOT19OT1BDT01NQU5EUworCisjaWZkZWYgREVCVUcKKwkJaWYocC0+c2NiLT5jdXMgJiBDVV9BQ1RJVkUpCisJCXsKKwkJCXByaW50aygiJXM6IEhtbW0gLi4gQ1UgaXMgc3RpbGwgcnVubmluZyBhbmQgd2Ugd2FubmEgc2VuZCBhIG5ldyBwYWNrZXQuXG4iLGRldi0+bmFtZSk7CisJCQlwcmludGsoIiVzOiBzdGF0OiAlMDR4ICUwNHhcbiIsZGV2LT5uYW1lLHAtPnNjYi0+Y3VzLHN3YWIxNihwLT54bWl0X2NtZHNbMF0tPmNtZF9zdGF0dXMpKTsKKwkJfQorI2VuZGlmCisKKwkJcC0+eG1pdF9idWZmc1swXS0+c2l6ZSA9IHN3YWIxNihUQkRfTEFTVCB8IGxlbik7CisJCWZvcihpPTA7aTwxNjtpKyspCisJCXsKKwkJCXAtPnhtaXRfY21kc1swXS0+Y21kX3N0YXR1cyA9IDA7CisJCQlXQUlUXzRfU0NCX0NNRCgpOworCQkJaWYoIChwLT5zY2ItPmN1cyAmIENVX1NUQVRVUykgPT0gQ1VfU1VTUEVORCkKKwkJCQlwLT5zY2ItPmNtZF9jdWMgPSBDVUNfUkVTVU1FOworCQkJZWxzZQorCQkJeworCQkJCXAtPnNjYi0+Y2JsX29mZnNldCA9IG1ha2UxNihwLT54bWl0X2NtZHNbMF0pOworCQkJCXAtPnNjYi0+Y21kX2N1YyA9IENVQ19TVEFSVDsKKwkJCX0KKworCQkJc3VuM19hdHRuNTg2KCk7CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWlmKCFpKQorCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCVdBSVRfNF9TQ0JfQ01EKCk7CisJCQlpZiggKHAtPnNjYi0+Y3VzICYgQ1VfQUNUSVZFKSkgLyogdGVzdCBpdCwgYmVjYXVzZSBDVSBzb21ldGltZXMgZG9lc24ndCBzdGFydCBpbW1lZGlhdGVseSAqLworCQkJCWJyZWFrOworCQkJaWYocC0+eG1pdF9jbWRzWzBdLT5jbWRfc3RhdHVzKQorCQkJCWJyZWFrOworCQkJaWYoaT09MTUpCisJCQkJcHJpbnRrKCIlczogQ2FuJ3Qgc3RhcnQgdHJhbnNtaXQtY29tbWFuZC5cbiIsZGV2LT5uYW1lKTsKKwkJfQorIwllbHNlCisJCW5leHRfbm9wID0gKHAtPm5vcF9wb2ludCArIDEpICYgMHgxOworCQlwLT54bWl0X2J1ZmZzWzBdLT5zaXplID0gc3dhYjE2KFRCRF9MQVNUIHwgbGVuKTsKKworCQlwLT54bWl0X2NtZHNbMF0tPmNtZF9saW5rCSA9IHAtPm5vcF9jbWRzW25leHRfbm9wXS0+Y21kX2xpbmsKKwkJCT0gbWFrZTE2KChwLT5ub3BfY21kc1tuZXh0X25vcF0pKTsKKwkJcC0+eG1pdF9jbWRzWzBdLT5jbWRfc3RhdHVzID0gcC0+bm9wX2NtZHNbbmV4dF9ub3BdLT5jbWRfc3RhdHVzID0gMDsKKworCQlwLT5ub3BfY21kc1twLT5ub3BfcG9pbnRdLT5jbWRfbGluayA9IG1ha2UxNigocC0+eG1pdF9jbWRzWzBdKSk7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlwLT5ub3BfcG9pbnQgPSBuZXh0X25vcDsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworIwllbmRpZgorI2Vsc2UKKwkJcC0+eG1pdF9idWZmc1twLT54bWl0X2NvdW50XS0+c2l6ZSA9IHN3YWIxNihUQkRfTEFTVCB8IGxlbik7CisJCWlmKCAobmV4dF9ub3AgPSBwLT54bWl0X2NvdW50ICsgMSkgPT0gTlVNX1hNSVRfQlVGRlMgKQorCQkJbmV4dF9ub3AgPSAwOworCisJCXAtPnhtaXRfY21kc1twLT54bWl0X2NvdW50XS0+Y21kX3N0YXR1cwk9IDA7CisJCS8qIGxpbmtwb2ludGVyIG9mIHhtaXQtY29tbWFuZCBhbHJlYWR5IHBvaW50cyB0byBuZXh0IG5vcCBjbWQgKi8KKwkJcC0+bm9wX2NtZHNbbmV4dF9ub3BdLT5jbWRfbGluayA9IG1ha2UxNigocC0+bm9wX2NtZHNbbmV4dF9ub3BdKSk7CisJCXAtPm5vcF9jbWRzW25leHRfbm9wXS0+Y21kX3N0YXR1cyA9IDA7CisKKwkJcC0+bm9wX2NtZHNbcC0+eG1pdF9jb3VudF0tPmNtZF9saW5rID0gbWFrZTE2KChwLT54bWl0X2NtZHNbcC0+eG1pdF9jb3VudF0pKTsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCXAtPnhtaXRfY291bnQgPSBuZXh0X25vcDsKKworCQl7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQkJaWYocC0+eG1pdF9jb3VudCAhPSBwLT54bWl0X2xhc3QpCisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJcC0+bG9jayA9IDA7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCX0KKwkJZGV2X2tmcmVlX3NrYihza2IpOworI2VuZGlmCisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29tZW9uZSB3YW5uYSBoYXZlIHRoZSBzdGF0aXN0aWNzCisgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdW4zXzgyNTg2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBzaG9ydCBjcmMsYWxuLHJzYyxvdnJuOworCisJY3JjID0gc3dhYjE2KHAtPnNjYi0+Y3JjX2VycnMpOyAvKiBnZXQgZXJyb3Itc3RhdGlzdGljIGZyb20gdGhlIG5pODI1ODYgKi8KKwlwLT5zY2ItPmNyY19lcnJzID0gMDsKKwlhbG4gPSBzd2FiMTYocC0+c2NiLT5hbG5fZXJycyk7CisJcC0+c2NiLT5hbG5fZXJycyA9IDA7CisJcnNjID0gc3dhYjE2KHAtPnNjYi0+cnNjX2VycnMpOworCXAtPnNjYi0+cnNjX2VycnMgPSAwOworCW92cm4gPSBzd2FiMTYocC0+c2NiLT5vdnJuX2VycnMpOworCXAtPnNjYi0+b3Zybl9lcnJzID0gMDsKKworCXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gY3JjOworCXAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzICs9IG92cm47CisJcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGFsbjsKKwlwLT5zdGF0cy5yeF9kcm9wcGVkICs9IHJzYzsKKworCXJldHVybiAmcC0+c3RhdHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0IE1DIGxpc3QgLi4KKyAqLworCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc3VuM19kaXNpbnQoKTsKKwlhbGxvYzU4NihkZXYpOworCWluaXQ1ODYoZGV2KTsKKwlzdGFydHJlY3Y1ODYoZGV2KTsKKwlzdW4zX2VuYWludCgpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworI2lmZGVmIE1PRFVMRQorI2Vycm9yIFRoaXMgY29kZSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBhcyBhIG1vZHVsZQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfc3VuM184MjU4NjsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJZGV2X3N1bjNfODI1ODYgPSBzdW4zXzgyNTg2X3Byb2JlKC0xKTsKKwlpZiAoSVNfRVJSKGRldl9zdW4zXzgyNTg2KSkKKwkJcmV0dXJuIFBUUl9FUlIoZGV2X3N1bjNfODI1ODYpOworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXZfc3VuM184MjU4Ni0+YmFzZV9hZGRyOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldl9zdW4zXzgyNTg2KTsKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIFNVTjNfODI1ODZfVE9UQUxfU0laRSk7CisJaW91bm1hcCgodm9pZCAqKWlvYWRkcik7CisJZnJlZV9uZXRkZXYoZGV2X3N1bjNfODI1ODYpOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworCisjaWYgMAorLyoKKyAqIERVTVAgLi4gd2UgZXhwZWN0IGEgbm90IHJ1bm5pbmcgQ01EIHVuaXQgYW5kIGVub3VnaCBzcGFjZQorICovCit2b2lkIHN1bjNfODI1ODZfZHVtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisJc3RydWN0IGR1bXBfY21kX3N0cnVjdCAqZHVtcF9jbWQgPSAoc3RydWN0IGR1bXBfY21kX3N0cnVjdCAqKSBwdHI7CisJaW50IGk7CisKKwlwLT5zY2ItPmNtZF9jdWMgPSBDVUNfQUJPUlQ7CisJc3VuM19hdHRuNTg2KCk7CisJV0FJVF80X1NDQl9DTUQoKTsKKwlXQUlUXzRfU0NCX0NNRF9SVUMoKTsKKworCWR1bXBfY21kLT5jbWRfc3RhdHVzID0gMDsKKwlkdW1wX2NtZC0+Y21kX2NtZCA9IENNRF9EVU1QIHwgQ01EX0xBU1Q7CisJZHVtcF9jbWQtPmR1bXBfb2Zmc2V0ID0gbWFrZTE2KChkdW1wX2NtZCArIDEpKTsKKwlkdW1wX2NtZC0+Y21kX2xpbmsgPSAweGZmZmY7CisKKwlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYoZHVtcF9jbWQpOworCXAtPnNjYi0+Y21kX2N1YyA9IENVQ19TVEFSVDsKKwlzdW4zX2F0dG41ODYoKTsKKwlXQUlUXzRfU1RBVF9DT01QTChkdW1wX2NtZCk7CisKKwlpZiggKGR1bXBfY21kLT5jbWRfc3RhdHVzICYgKFNUQVRfQ09NUEx8U1RBVF9PSykpICE9IChTVEFUX0NPTVBMfFNUQVRfT0spICkKKwkJCQlwcmludGsoIiVzOiBDYW4ndCBnZXQgZHVtcCBpbmZvcm1hdGlvbi5cbiIsZGV2LT5uYW1lKTsKKworCWZvcihpPTA7aTwxNzA7aSsrKSB7CisJCXByaW50aygiJTAyeCAiLChpbnQpICgodW5zaWduZWQgY2hhciAqKSAoZHVtcF9jbWQgKyAxKSlbaV0pOworCQlpZihpICUgMjQgPT0gMjMpCisJCQlwcmludGsoIlxuIik7CisJfQorCXByaW50aygiXG4iKTsKK30KKyNlbmRpZgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW4zXzgyNTg2LmggYi9kcml2ZXJzL25ldC9zdW4zXzgyNTg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjZmIwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bjNfODI1ODYuaApAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIEludGVsIGk4MjU4NiBFdGhlcm5ldCBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgaXMgY292ZXJlZCBieSB0aGUKKyAqIHNhbWUgR251IFB1YmxpYyBMaWNlbnNlIHRoYXQgY292ZXJzIHRoYXQgd29yay4KKyAqCisgKiBjb3B5cmlnaHRzIChjKSAxOTk0IGJ5IE1pY2hhZWwgSGlwcCAoaGlwcG1AaW5mb3JtYXRpay51bmktdHVlYmluZ2VuLmRlKQorICoKKyAqIEkgaGF2ZSBkb25lIGEgbG9vayBpbiB0aGUgZm9sbG93aW5nIHNvdXJjZXM6CisgKiAgIGNyeW53ci1wYWNrZXQtZHJpdmVyIGJ5IFJ1c3MgTmVsc29uCisgKiAgIEdhcnJldCBBLiBXb2xsbWFuJ3MgaTgyNTg2LWRyaXZlciBmb3IgQlNECisgKi8KKworLyoKKyAqIENsb25lZCBmcm9tIG5pNTIuaCwgY29weXJpZ2h0IGFzIGFib3ZlLiAgCisgKgorICogTW9kaWZpZWQgZm9yIFN1bjMgT0JJTyBpODI1ODYgYnkgU2FtIENyZWFzZXkgKHNhbW15QHNhbW15Lm5ldCkKKyAqLworCisKKy8qIGRlZmluZXMgZm9yIHRoZSBvYmlvIGNoaXAgKG5vdCB2bWUpICovIAorI2RlZmluZSBJRU9CX05PUlNFVCAweDgwICAgICAgICAvKiBkb24ndCByZXNldCB0aGUgYm9hcmQgKi8KKyNkZWZpbmUgSUVPQl9PTkFJUiAgMHg0MCAgICAgICAgLyogcHV0IHVzIG9uIHRoZSBhaXIgKi8KKyNkZWZpbmUgSUVPQl9BVFRFTiAgMHgyMCAgICAgICAgLyogYXR0ZW50aW9uISAqLworI2RlZmluZSBJRU9CX0lFTkFCICAweDEwICAgICAgICAvKiBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIElFT0JfWFhYWFggIDB4MDggICAgICAgIC8qIGZyZWUgYml0ICovCisjZGVmaW5lIElFT0JfWENWUkwyIDB4MDQgICAgICAgIC8qIGxldmVsIDIgdHJhbnNjZWl2ZXI/ICovCisjZGVmaW5lIElFT0JfQlVTRVJSIDB4MDIgICAgICAgIC8qIGJ1cyBlcnJvciAqLworI2RlZmluZSBJRU9CX0lOVCAgICAweDAxICAgICAgICAvKiBpbnRlcnJ1cHQgKi8KKworLyogd2hlcmUgdGhlIG9iaW8gb25lIGxpdmVzICovCisjZGVmaW5lIElFX09CSU8gMHhjMDAwMAorI2RlZmluZSBJRV9JUlEgMworCisvKgorICogd2hlcmUgdG8gZmluZCB0aGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAoU0NQKQorICovCisjZGVmaW5lIFNDUF9ERUZBVUxUX0FERFJFU1MgMHhmZmZmZjQKKworCisvKgorICogU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciBTdHJ1Y3QKKyAqLworCitzdHJ1Y3Qgc2NwX3N0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCB6ZXJvX2R1bTA7CS8qIGhhcyB0byBiZSB6ZXJvICovCisgIHVuc2lnbmVkIGNoYXIgIHN5c2J1czsJLyogMD0xNkJpdCwxPThCaXQgKi8KKyAgdW5zaWduZWQgY2hhciAgemVyb19kdW0xOwkvKiBoYXMgdG8gYmUgemVybyBmb3IgNTg2ICovCisgIHVuc2lnbmVkIHNob3J0IHplcm9fZHVtMjsKKyAgdW5zaWduZWQgc2hvcnQgemVyb19kdW0zOworICBjaGFyICAgICAgICAgICppc2NwOwkJLyogcG9pbnRlciB0byB0aGUgaXNjcC1ibG9jayAqLworfTsKKworCisvKgorICogSW50ZXJtZWRpYXRlIFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIgKElTQ1ApCisgKi8KK3N0cnVjdCBpc2NwX3N0cnVjdAoreworICB1bnNpZ25lZCBjaGFyICBidXN5OyAgICAgICAgICAvKiA1ODYgY2xlYXJzIGFmdGVyIHN1Y2Nlc3NmdWwgaW5pdCAqLworICB1bnNpZ25lZCBjaGFyICB6ZXJvX2R1bW15OyAgICAvKiBoYXMgdG8gYmUgemVybyAqLworICB1bnNpZ25lZCBzaG9ydCBzY2Jfb2Zmc2V0OyAgICAvKiBwb2ludGVyb2Zmc2V0IHRvIHRoZSBzY2JfYmFzZSAqLworICBjaGFyICAgICAgICAgICpzY2JfYmFzZTsgICAgICAvKiBiYXNlLWFkZHJlc3Mgb2YgYWxsIDE2LWJpdCBvZmZzZXRzICovCit9OworCisvKgorICogU3lzdGVtIENvbnRyb2wgQmxvY2sgKFNDQikKKyAqLworc3RydWN0IHNjYl9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciBydXM7CisgIHVuc2lnbmVkIGNoYXIgY3VzOworICB1bnNpZ25lZCBjaGFyIGNtZF9ydWM7ICAgICAgICAgICAvKiBjb21tYW5kIHdvcmQ6IFJVIHBhcnQgKi8KKyAgdW5zaWduZWQgY2hhciBjbWRfY3VjOyAgICAgICAgICAgLyogY29tbWFuZCB3b3JkOiBDVSBwYXJ0ICYgQUNLICovCisgIHVuc2lnbmVkIHNob3J0IGNibF9vZmZzZXQ7ICAgIC8qIHBvaW50ZXJvZmZzZXQsIGNvbW1hbmQgYmxvY2sgbGlzdCAqLworICB1bnNpZ25lZCBzaG9ydCByZmFfb2Zmc2V0OyAgICAvKiBwb2ludGVyb2Zmc2V0LCByZWNlaXZlIGZyYW1lIGFyZWEgKi8KKyAgdW5zaWduZWQgc2hvcnQgY3JjX2VycnM7ICAgICAgLyogQ1JDLUVycm9yIGNvdW50ZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgYWxuX2VycnM7ICAgICAgLyogYWxsaWdubWVudGVycm9yIGNvdW50ZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgcnNjX2VycnM7ICAgICAgLyogUmVzb3VyY2VlcnJvciBjb3VudGVyICovCisgIHVuc2lnbmVkIHNob3J0IG92cm5fZXJyczsgICAgIC8qIE9WZXJydW5lcnJvciBjb3VudGVyICovCit9OworCisvKgorICogcG9zc2libGUgY29tbWFuZCB2YWx1ZXMgZm9yIHRoZSBjb21tYW5kIHdvcmQKKyAqLworI2RlZmluZSBSVUNfTUFTSwkweDAwNzAJLyogbWFzayBmb3IgUlUgY29tbWFuZHMgKi8KKyNkZWZpbmUgUlVDX05PUAkJMHgwMDAwCS8qIE5PUC1jb21tYW5kICovCisjZGVmaW5lIFJVQ19TVEFSVAkweDAwMTAJLyogc3RhcnQgUlUgKi8KKyNkZWZpbmUgUlVDX1JFU1VNRQkweDAwMjAJLyogcmVzdW1lIFJVIGFmdGVyIHN1c3BlbmQgKi8KKyNkZWZpbmUgUlVDX1NVU1BFTkQJMHgwMDMwCS8qIHN1c3BlbmQgUlUgKi8KKyNkZWZpbmUgUlVDX0FCT1JUCTB4MDA0MAkvKiBhYm9ydCByZWNlaXZlciBvcGVyYXRpb24gaW1tZWRpYXRlbHkgKi8KKworI2RlZmluZSBDVUNfTUFTSyAgICAgICAgMHgwNyAgLyogbWFzayBmb3IgQ1UgY29tbWFuZCAqLworI2RlZmluZSBDVUNfTk9QICAgICAgICAgMHgwMCAgLyogTk9QLWNvbW1hbmQgKi8KKyNkZWZpbmUgQ1VDX1NUQVJUICAgICAgIDB4MDEgIC8qIHN0YXJ0IGV4ZWN1dGlvbiBvZiAxLiBjbWQgb24gdGhlIENCTCAqLworI2RlZmluZSBDVUNfUkVTVU1FICAgICAgMHgwMiAgLyogcmVzdW1lIGFmdGVyIHN1c3BlbmQgKi8KKyNkZWZpbmUgQ1VDX1NVU1BFTkQgICAgIDB4MDMgIC8qIFN1c3BlbmQgQ1UgKi8KKyNkZWZpbmUgQ1VDX0FCT1JUICAgICAgIDB4MDQgIC8qIGFib3J0IGNvbW1hbmQgb3BlcmF0aW9uIGltbWVkaWF0ZWx5ICovCisKKyNkZWZpbmUgQUNLX01BU0sgICAgICAgIDB4ZjAgIC8qIG1hc2sgZm9yIEFDSyBjb21tYW5kICovCisjZGVmaW5lIEFDS19DWCAgICAgICAgICAweDgwICAvKiBhY2tub3dsZWRnZXMgU1RBVF9DWCAqLworI2RlZmluZSBBQ0tfRlIgICAgICAgICAgMHg0MCAgLyogYWNrLiBTVEFUX0ZSICovCisjZGVmaW5lIEFDS19DTkEgICAgICAgICAweDIwICAvKiBhY2suIFNUQVRfQ05BICovCisjZGVmaW5lIEFDS19STlIgICAgICAgICAweDEwICAvKiBhY2suIFNUQVRfUk5SICovCisKKy8qCisgKiBwb3NzaWJsZSBzdGF0dXMgdmFsdWVzIGZvciB0aGUgc3RhdHVzIHdvcmQKKyAqLworI2RlZmluZSBTVEFUX01BU0sgICAgICAgMHhmMCAgLyogbWFzayBmb3IgY2F1c2Ugb2YgaW50ZXJydXB0ICovCisjZGVmaW5lIFNUQVRfQ1ggICAgICAgICAweDgwICAvKiBDVSBmaW5pc2hlZCBjbWQgd2l0aCBpdHMgSSBiaXQgc2V0ICovCisjZGVmaW5lIFNUQVRfRlIgICAgICAgICAweDQwICAvKiBSVSBmaW5pc2hlZCByZWNlaXZpbmcgYSBmcmFtZSAqLworI2RlZmluZSBTVEFUX0NOQSAgICAgICAgMHgyMCAgLyogQ1UgbGVmdCBhY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgU1RBVF9STlIgICAgICAgIDB4MTAgIC8qIFJVIGxlZnQgcmVhZHkgc3RhdGUgKi8KKworI2RlZmluZSBDVV9TVEFUVVMgICAgICAgMHg3ICAgLyogQ1Ugc3RhdHVzLCAwPWlkbGUgKi8KKyNkZWZpbmUgQ1VfU1VTUEVORCAgICAgIDB4MSAgIC8qIENVIGlzIHN1c3BlbmRlZCAqLworI2RlZmluZSBDVV9BQ1RJVkUgICAgICAgMHgyICAgLyogQ1UgaXMgYWN0aXZlICovCisKKyNkZWZpbmUgUlVfU1RBVFVTCTB4NzAJLyogUlUgc3RhdHVzLCAwPWlkbGUgKi8KKyNkZWZpbmUgUlVfU1VTUEVORAkweDEwCS8qIFJVIHN1c3BlbmRlZCAqLworI2RlZmluZSBSVV9OT1NQQUNFCTB4MjAJLyogUlUgbm8gcmVzb3VyY2VzICovCisjZGVmaW5lIFJVX1JFQURZCTB4NDAJLyogUlUgaXMgcmVhZHkgKi8KKworLyoKKyAqIFJlY2VpdmUgRnJhbWUgRGVzY3JpcHRvciAoUkZEKQorICovCitzdHJ1Y3QgcmZkX3N0cnVjdAoreworICB1bnNpZ25lZCBjaGFyICBzdGF0X2xvdzsJLyogc3RhdHVzIHdvcmQgKi8KKyAgdW5zaWduZWQgY2hhciAgc3RhdF9oaWdoOwkvKiBzdGF0dXMgd29yZCAqLworICB1bnNpZ25lZCBjaGFyICByZmRfc2Y7CS8qIDgyNTk2IG1vZGUgb25seSAqLworICB1bnNpZ25lZCBjaGFyICBsYXN0OwkJLyogQml0MTUsTGFzdCBGcmFtZSBvbiBMaXN0IC8gQml0MTQsc3VzcGVuZCAqLworICB1bnNpZ25lZCBzaG9ydCBuZXh0OwkJLyogbGlua29mZnNldCB0byBuZXh0IFJGRCAqLworICB1bnNpZ25lZCBzaG9ydCByYmRfb2Zmc2V0OwkvKiBwb2ludGVyb2Zmc2V0IHRvIFJCRC1idWZmZXIgKi8KKyAgdW5zaWduZWQgY2hhciAgZGVzdFs2XTsJLyogZXRoZXJuZXQtYWRkcmVzcywgZGVzdGluYXRpb24gKi8KKyAgdW5zaWduZWQgY2hhciAgc291cmNlWzZdOwkvKiBldGhlcm5ldC1hZGRyZXNzLCBzb3VyY2UgKi8KKyAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwkvKiA4MDIuMyBmcmFtZS1sZW5ndGggKi8KKyAgdW5zaWduZWQgc2hvcnQgemVyb19kdW1teTsJLyogZHVtbXkgKi8KK307CisKKyNkZWZpbmUgUkZEX0xBU1QgICAgIDB4ODAJLyogbGFzdDogbGFzdCByZmQgaW4gdGhlIGxpc3QgKi8KKyNkZWZpbmUgUkZEX1NVU1AgICAgIDB4NDAJLyogbGFzdDogc3VzcGVuZCBSVSBhZnRlciAgKi8KKyNkZWZpbmUgUkZEX0NPTVBMICAgIDB4ODAKKyNkZWZpbmUgUkZEX09LICAgICAgIDB4MjAKKyNkZWZpbmUgUkZEX0JVU1kgICAgIDB4NDAKKyNkZWZpbmUgUkZEX0VSUl9MRU4gIDB4MTAgICAgIC8qIExlbmd0aCBlcnJvciAoaWYgZW5hYmxlZCBsZW5ndGgtY2hlY2tpbmcgKi8KKyNkZWZpbmUgUkZEX0VSUl9DUkMgIDB4MDggICAgIC8qIENSQyBlcnJvciAqLworI2RlZmluZSBSRkRfRVJSX0FMR04gMHgwNCAgICAgLyogQWxpZ25tZW50IGVycm9yICovCisjZGVmaW5lIFJGRF9FUlJfUk5SICAweDAyICAgICAvKiBzdGF0dXM6IHJlY2VpdmVyIG91dCBvZiByZXNvdXJjZXMgKi8KKyNkZWZpbmUgUkZEX0VSUl9PVlIgIDB4MDEgICAgIC8qIERNQSBPdmVycnVuISAqLworCisjZGVmaW5lIFJGRF9FUlJfRlRTICAweDAwODAJLyogRnJhbWUgdG8gc2hvcnQgKi8KKyNkZWZpbmUgUkZEX0VSUl9ORU9QIDB4MDA0MAkvKiBObyBFT1AgZmxhZyAoZm9yIGJpdHN0dWZmaW5nIG9ubHkpICovCisjZGVmaW5lIFJGRF9FUlJfVFJVTiAweDAwMjAJLyogKDgyNTk2IG9ubHkvU0YgbW9kZSkgaW5kaWNhdGVzIHRydW5jYXRlZCBmcmFtZSAqLworI2RlZmluZSBSRkRfTUFUQ0hBREQgMHgwMDAyICAgICAvKiBzdGF0dXM6IERlc3RpbmF0aW9uYWRkcmVzcyAhbWF0Y2hlcyBJQSAob25seSA4MjU5NikgKi8KKyNkZWZpbmUgUkZEX0NPTExERVQgIDB4MDAwMQkvKiBEZXRlY3RlZCBjb2xsaXNpb24gZHVyaW5nIHJlY2VwdGlvbiAqLworCisvKgorICogUmVjZWl2ZSBCdWZmZXIgRGVzY3JpcHRvciAoUkJEKQorICovCitzdHJ1Y3QgcmJkX3N0cnVjdCAKK3sKKyAgdW5zaWduZWQgc2hvcnQgc3RhdHVzOwkvKiBzdGF0dXMgd29yZCxudW1iZXIgb2YgdXNlZCBieXRlcyBpbiBidWZmICovCisgIHVuc2lnbmVkIHNob3J0IG5leHQ7CQkvKiBwb2ludGVyb2Zmc2V0IHRvIG5leHQgUkJEICovCisgIGNoYXIgICAgICAgICAgKmJ1ZmZlcjsJLyogcmVjZWl2ZSBidWZmZXIgYWRkcmVzcyBwb2ludGVyICovCisgIHVuc2lnbmVkIHNob3J0IHNpemU7CQkvKiBzaXplIG9mIHRoaXMgYnVmZmVyICovCisgIHVuc2lnbmVkIHNob3J0IHplcm9fZHVtbXk7ICAgIC8qIGR1bW15ICovCit9OworCisjZGVmaW5lIFJCRF9MQVNUCTB4ODAwMAkvKiBsYXN0IGJ1ZmZlciAqLworI2RlZmluZSBSQkRfVVNFRAkweDQwMDAJLyogdGhpcyBidWZmZXIgaGFzIGRhdGEgKi8KKyNkZWZpbmUgUkJEX01BU0sJMHgzZmZmCS8qIHNpemUtbWFzayBmb3IgbGVuZ3RoICovCisKKy8qCisgKiBTdGF0dXN2YWx1ZXMgZm9yIENvbW1hbmRzL1JGRAorICovCisjZGVmaW5lIFNUQVRfQ09NUEwgICAweDgwMDAJLyogc3RhdHVzOiBmcmFtZS9jb21tYW5kIGlzIGNvbXBsZXRlICovCisjZGVmaW5lIFNUQVRfQlVTWSAgICAweDQwMDAJLyogc3RhdHVzOiBmcmFtZS9jb21tYW5kIGlzIGJ1c3kgKi8KKyNkZWZpbmUgU1RBVF9PSyAgICAgIDB4MjAwMAkvKiBzdGF0dXM6IGZyYW1lL2NvbW1hbmQgaXMgb2sgKi8KKworLyoKKyAqIEFjdGlvbi1Db21tYW5kcworICovCisjZGVmaW5lIENNRF9OT1AJCTB4MDAwMAkvKiBOT1AgKi8KKyNkZWZpbmUgQ01EX0lBU0VUVVAJMHgwMDAxCS8qIGluaXRpYWwgYWRkcmVzcyBzZXR1cCBjb21tYW5kICovCisjZGVmaW5lIENNRF9DT05GSUdVUkUJMHgwMDAyCS8qIGNvbmZpZ3VyZSBjb21tYW5kICovCisjZGVmaW5lIENNRF9NQ1NFVFVQCTB4MDAwMwkvKiBNQyBzZXR1cCBjb21tYW5kICovCisjZGVmaW5lIENNRF9YTUlUCTB4MDAwNAkvKiB0cmFuc21pdCBjb21tYW5kICovCisjZGVmaW5lIENNRF9URFIJCTB4MDAwNQkvKiB0aW1lIGRvbWFpbiByZWZsZWN0b21ldGVyIChURFIpIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX0RVTVAJMHgwMDA2CS8qIGR1bXAgY29tbWFuZCAqLworI2RlZmluZSBDTURfRElBR05PU0UJMHgwMDA3CS8qIGRpYWdub3NlIGNvbW1hbmQgKi8KKworLyoKKyAqIEFjdGlvbiBjb21tYW5kIGJpdHMKKyAqLworI2RlZmluZSBDTURfTEFTVAkweDgwMDAJLyogaW5kaWNhdGVzIGxhc3QgY29tbWFuZCBpbiB0aGUgQ0JMICovCisjZGVmaW5lIENNRF9TVVNQRU5ECTB4NDAwMAkvKiBzdXNwZW5kIENVIGFmdGVyIHRoaXMgQ0IgKi8KKyNkZWZpbmUgQ01EX0lOVAkJMHgyMDAwCS8qIGdlbmVyYXRlIGludGVycnVwdCBhZnRlciBleGVjdXRpb24gKi8KKworLyoKKyAqIE5PUCAtIGNvbW1hbmQKKyAqLworc3RydWN0IG5vcF9jbWRfc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CS8qIHN0YXR1cyBvZiB0aGlzIGNvbW1hbmQgKi8KKyAgdW5zaWduZWQgc2hvcnQgY21kX2NtZDsgICAgICAgLyogdGhlIGNvbW1hbmQgaXRzZWxmICgrYml0cykgKi8KKyAgdW5zaWduZWQgc2hvcnQgY21kX2xpbms7ICAgICAgLyogb2Zmc2V0cG9pbnRlciB0byBuZXh0IGNvbW1hbmQgKi8KK307CisKKy8qCisgKiBJQSBTZXR1cCBjb21tYW5kCisgKi8KK3N0cnVjdCBpYXNldHVwX2NtZF9zdHJ1Y3QgCit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9jbWQ7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9saW5rOworICB1bnNpZ25lZCBjaGFyICBpYWRkcls2XTsKK307CisKKy8qCisgKiBDb25maWd1cmUgY29tbWFuZCAKKyAqLworc3RydWN0IGNvbmZpZ3VyZV9jbWRfc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9jbWQ7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9saW5rOworICB1bnNpZ25lZCBjaGFyICBieXRlX2NudDsgICAvKiBzaXplIG9mIHRoZSBjb25maWctY21kICovCisgIHVuc2lnbmVkIGNoYXIgIGZpZm87ICAgICAgIC8qIGZpZm8vcmVjdiBtb25pdG9yICovCisgIHVuc2lnbmVkIGNoYXIgIHNhdl9iZjsgICAgIC8qIHNhdmUgYmFkIGZyYW1lcyAoYml0Nz0xKSovCisgIHVuc2lnbmVkIGNoYXIgIGFkcl9sZW47ICAgIC8qIGFkcl9sZW4oMC0yKSxhbF9sb2MoMykscHJlYW0oNC01KSxsb29wYmFrKDYtNykqLworICB1bnNpZ25lZCBjaGFyICBwcmlvcml0eTsgICAvKiBsaW5fcHJpbygwLTIpLGV4cF9wcmlvKDQtNiksYm9mX21ldGQoNykgKi8KKyAgdW5zaWduZWQgY2hhciAgaWZzOyAgICAgICAgLyogaW50ZXIgZnJhbWUgc3BhY2luZyAqLworICB1bnNpZ25lZCBjaGFyICB0aW1lX2xvdzsgICAvKiBzbG90IHRpbWUgbG93ICovCisgIHVuc2lnbmVkIGNoYXIgIHRpbWVfaGlnaDsgIC8qIHNsb3QgdGltZSBoaWdoKDAtMikgYW5kIG1heC4gcmV0cmllcyg0LTcpICovCisgIHVuc2lnbmVkIGNoYXIgIHByb21pc2M7ICAgIC8qIHByb21pc2MtbW9kZSgwKSAsIGV0IGFsICgxLTcpICovCisgIHVuc2lnbmVkIGNoYXIgIGNhcnJfY29sbDsgIC8qIGNhcnJpZXIoMC0zKS9jb2xsaXNpb24oNC03KSBzdHVmZiAqLworICB1bnNpZ25lZCBjaGFyICBmcmFtX2xlbjsgICAvKiBtaW5pbWFsIGZyYW1lIGxlbiAqLworICB1bnNpZ25lZCBjaGFyICBkdW1teTsJICAgICAvKiBkdW1teSAqLworfTsKKworLyoKKyAqIE11bHRpY2FzdCBTZXR1cCBjb21tYW5kIAorICovCitzdHJ1Y3QgbWNzZXR1cF9jbWRfc3RydWN0IAoreworICB1bnNpZ25lZCBzaG9ydCBjbWRfc3RhdHVzOworICB1bnNpZ25lZCBzaG9ydCBjbWRfY21kOworICB1bnNpZ25lZCBzaG9ydCBjbWRfbGluazsKKyAgdW5zaWduZWQgc2hvcnQgbWNfY250OwkJLyogbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBNQy1MaXN0ICovCisgIHVuc2lnbmVkIGNoYXIgIG1jX2xpc3RbMF1bNl07ICAJLyogcG9pbnRlciB0byA2IGJ5dGVzIGVudHJpZXMgKi8KK307CisKKy8qCisgKiBEVU1QIGNvbW1hbmQKKyAqLworc3RydWN0IGR1bXBfY21kX3N0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCBjbWRfc3RhdHVzOworICB1bnNpZ25lZCBzaG9ydCBjbWRfY21kOworICB1bnNpZ25lZCBzaG9ydCBjbWRfbGluazsKKyAgdW5zaWduZWQgc2hvcnQgZHVtcF9vZmZzZXQ7ICAgIC8qIHBvaW50ZXJvZmZzZXQgdG8gRFVNUCBzcGFjZSAqLworfTsKKworLyoKKyAqIHRyYW5zbWl0IGNvbW1hbmQgCisgKi8KK3N0cnVjdCB0cmFuc21pdF9jbWRfc3RydWN0IAoreworICB1bnNpZ25lZCBzaG9ydCBjbWRfc3RhdHVzOworICB1bnNpZ25lZCBzaG9ydCBjbWRfY21kOworICB1bnNpZ25lZCBzaG9ydCBjbWRfbGluazsKKyAgdW5zaWduZWQgc2hvcnQgdGJkX29mZnNldDsJLyogcG9pbnRlcm9mZnNldCB0byBUQkQgKi8KKyAgdW5zaWduZWQgY2hhciAgZGVzdFs2XTsgICAgICAgLyogZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUgZnJhbWUgKi8KKyAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwkvKiB1c2VyIGRlZmluZWQ6IDgwMi4zIGxlbmd0aCAvIEV0aGVyIHR5cGUgKi8KK307CisKKyNkZWZpbmUgVENNRF9FUlJNQVNLICAgICAweDBmYTAKKyNkZWZpbmUgVENNRF9NQVhDT0xMTUFTSyAweDAwMGYKKyNkZWZpbmUgVENNRF9NQVhDT0xMICAgICAweDAwMjAKKyNkZWZpbmUgVENNRF9IRUFSVEJFQVQgICAweDAwNDAKKyNkZWZpbmUgVENNRF9ERUZFUlJFRCAgICAweDAwODAKKyNkZWZpbmUgVENNRF9VTkRFUlJVTiAgICAweDAxMDAKKyNkZWZpbmUgVENNRF9MT1NUQ1RTICAgICAweDAyMDAKKyNkZWZpbmUgVENNRF9OT0NBUlJJRVIgICAweDA0MDAKKyNkZWZpbmUgVENNRF9MQVRFQ09MTCAgICAweDA4MDAKKworc3RydWN0IHRkcl9jbWRfc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9jbWQ7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9saW5rOworICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7Cit9OworCisjZGVmaW5lIFREUl9MTktfT0sJMHg4MDAwCS8qIE5vIGxpbmsgcHJvYmxlbSBpZGVudGlmaWVkICovCisjZGVmaW5lIFREUl9YQ1ZSX1BSQgkweDQwMDAJLyogaW5kaWNhdGVzIGEgdHJhbnNjZWl2ZXIgcHJvYmxlbSAqLworI2RlZmluZSBURFJfRVRfT1BOCTB4MjAwMAkvKiBvcGVuLCBubyBjb3JyZWN0IHRlcm1pbmF0aW9uICovCisjZGVmaW5lIFREUl9FVF9TUlQJMHgxMDAwCS8qIFREUiBkZXRlY3RlZCBhIHNob3J0IGNpcmN1aXQgKi8KKyNkZWZpbmUgVERSX1RJTUVNQVNLCTB4MDdmZgkvKiBtYXNrIGZvciB0aGUgdGltZSBmaWVsZCAqLworCisvKgorICogVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgKFRCRCkKKyAqLworc3RydWN0IHRiZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgc2l6ZTsJCS8qIHNpemUgKyBFT0YtRmxhZygxNSkgKi8KKyAgdW5zaWduZWQgc2hvcnQgbmV4dDsgICAgICAgICAgLyogcG9pbnRlcm9mZnNldCB0byBuZXh0IFRCRCAqLworICBjaGFyICAgICAgICAgICpidWZmZXI7ICAgICAgICAvKiBwb2ludGVyIHRvIGJ1ZmZlciAqLworfTsKKworI2RlZmluZSBUQkRfTEFTVCAweDgwMDAgICAgICAgICAvKiBFT0YtRmxhZywgaW5kaWNhdGVzIGxhc3QgYnVmZmVyIGluIGxpc3QgKi8KKworCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuM2xhbmNlLmMgYi9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjQzYmJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3VuM2xhbmNlLmMKQEAgLTAsMCArMSw5NjUgQEAKKy8qIHN1bjNsYW5jZS5jOiBFdGhlcm5ldCBkcml2ZXIgZm9yIFNVTjMgTGFuY2UgY2hpcCAqLworLyoKKworICBTdW4zIExhbmNlIGV0aGVybmV0IGRyaXZlciwgYnkgU2FtIENyZWFzZXkgKHNhbW15QHVzZXJzLnF1YWwubmV0KS4gIAorICBUaGlzIGRyaXZlciBpcyBhIHBhcnQgb2YgdGhlIGxpbnV4IGtlcm5lbCwgYW5kIGlzIHRodXMgZGlzdHJpYnV0ZWQKKyAgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICAKKyAgVGhlIHZhbHVlcyB1c2VkIGluIExBTkNFX09CSU8gYW5kIExBTkNFX0lSUSBzZWVtIHRvIGJlIGVtcGlyaWNhbGx5CisgIHRydWUgZm9yIHRoZSBjb3JyZWN0IElSUSBhbmQgYWRkcmVzcyBvZiB0aGUgbGFuY2UgcmVnaXN0ZXJzLiAgVGhleQorICBoYXZlIG5vdCBiZWVuIHdpZGVseSB0ZXN0ZWQsIGhvd2V2ZXIuICBXaGF0IHdlIHByb2JhYmx5IG5lZWQgaXMgYQorICAicHJvcGVyIiB3YXkgdG8gc2VhcmNoIGZvciBhIGRldmljZSBpbiB0aGUgc3VuMydzIHByb20sIGJ1dCwgYWxhcywKKyAgbGludXggaGFzIG5vIHN1Y2ggdGhpbmcuICAKKworICBUaGlzIGRyaXZlciBpcyBsYXJnZWx5IGJhc2VkIG9uIGF0YXJpbGFuY2UuYywgYnkgUm9tYW4gSG9kZWsuICBPdGhlcgorICBzb3VyY2VzIG9mIGluc3BpcmF0aW9uIHdlcmUgdGhlIE5ldEJTRCBzdW4zIGFtNzk5MCBkcml2ZXIsIGFuZCB0aGUKKyAgbGludXggc3BhcmMgbGFuY2UgZHJpdmVyIChzdW5sYW5jZS5jKS4gIAorCisgIFRoZXJlIGFyZSBtb3JlIGFzc3VtcHRpb25zIG1hZGUgdGhyb3VnaG91dCB0aGlzIGRyaXZlciwgaXQgYWxtb3N0CisgIGNlcnRhaW5seSBzdGlsbCBuZWVkcyB3b3JrLCBidXQgaXQgZG9lcyB3b3JrIGF0IGxlYXN0IGZvciBSQVJQL0JPT1RQIGFuZAorICBtb3VudGluZyB0aGUgcm9vdCBORlMgZmlsZXN5c3RlbS4KKyAgCisqLworCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9ICJzdW4zbGFuY2UuYzogdjEuMiAxLzEyLzIwMDEgIFNhbSBDcmVhc2V5IChzYW1teUBzYW1teS5uZXQpXG4iOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9kdm1hLmg+CisjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoaW5lcy5oPgorCisjaWZkZWYgQ09ORklHX1NVTjMKKyNpbmNsdWRlIDxhc20vc3VuM21tdS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxhc20vc3VuM3hwcm9tLmg+CisjZW5kaWYKKworLyogc3VuMy82MCBhZGRyL2lycSBmb3IgdGhlIGxhbmNlIGNoaXAuICBJZiB5b3VyIHN1biBpcyBkaWZmZXJlbnQsCisgICBjaGFuZ2UgdGhpcy4gKi8KKyNkZWZpbmUgTEFOQ0VfT0JJTyAweDEyMDAwMAorI2RlZmluZSBMQU5DRV9JUlEgSVJRMworCisvKiBEZWJ1ZyBsZXZlbDoKKyAqICAwID0gc2lsZW50LCBwcmludCBvbmx5IHNlcmlvdXMgZXJyb3JzCisgKiAgMSA9IG5vcm1hbCwgcHJpbnQgZXJyb3IgbWVzc2FnZXMKKyAqICAyID0gZGVidWcsIHByaW50IGRlYnVnIGluZm9zCisgKiAgMyA9IGRlYnVnLCBwcmludCBldmVuIG1vcmUgZGVidWcgaW5mb3MgKHBhY2tldCBkYXRhKQorICovCisKKyNkZWZpbmUJTEFOQ0VfREVCVUcJMAorCisjaWZkZWYgTEFOQ0VfREVCVUcKK3N0YXRpYyBpbnQgbGFuY2VfZGVidWcgPSBMQU5DRV9ERUJVRzsKKyNlbHNlCitzdGF0aWMgaW50IGxhbmNlX2RlYnVnID0gMTsKKyNlbmRpZgorTU9EVUxFX1BBUk0obGFuY2VfZGVidWcsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGxhbmNlX2RlYnVnLCAiU1VOMyBMYW5jZSBkZWJ1ZyBsZXZlbCAoMC0zKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lCURQUklOVEsobixhKSBcCisJZG8geyAgXAorCQlpZiAobGFuY2VfZGVidWcgPj0gbikgIFwKKwkJCXByaW50ayBhOyBcCisJfSB3aGlsZSggMCApCisKKworLyogd2UncmUgb25seSB1c2luZyAzMmsgb2YgbWVtb3J5LCBzbyB3ZSB1c2UgNCBUWAorICAgYnVmZmVycyBhbmQgMTYgUlggYnVmZmVycy4gIFRoZXNlIHZhbHVlcyBhcmUgZXhwcmVzc2VkIGFzIGxvZzIuICovCisKKyNkZWZpbmUgVFhfTE9HX1JJTkdfU0laRQkJCTMKKyNkZWZpbmUgUlhfTE9HX1JJTkdfU0laRQkJCTUKKworLyogVGhlc2UgYXJlIHRoZSBkZXJpdmVkIHZhbHVlcyAqLworCisjZGVmaW5lIFRYX1JJTkdfU0laRQkJCSgxIDw8IFRYX0xPR19SSU5HX1NJWkUpCisjZGVmaW5lIFRYX1JJTkdfTEVOX0JJVFMJCShUWF9MT0dfUklOR19TSVpFIDw8IDUpCisjZGVmaW5lCVRYX1JJTkdfTU9EX01BU0sJCShUWF9SSU5HX1NJWkUgLSAxKQorCisjZGVmaW5lIFJYX1JJTkdfU0laRQkJCSgxIDw8IFJYX0xPR19SSU5HX1NJWkUpCisjZGVmaW5lIFJYX1JJTkdfTEVOX0JJVFMJCShSWF9MT0dfUklOR19TSVpFIDw8IDUpCisjZGVmaW5lCVJYX1JJTkdfTU9EX01BU0sJCShSWF9SSU5HX1NJWkUgLSAxKQorCisvKiBEZWZpbml0aW9ucyBmb3IgcGFja2V0IGJ1ZmZlciBhY2Nlc3M6ICovCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1NDQKKworLyogR2V0IHRoZSBhZGRyZXNzIG9mIGEgcGFja2V0IGJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gYnVmZmVyIGhlYWQgKi8KKyNkZWZpbmUJUEtUQlVGX0FERFIoaGVhZCkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKE1FTSkgfCAoaGVhZCktPmJhc2UpCisKKworLyogVGhlIExBTkNFIFJ4IGFuZCBUeCByaW5nIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IGxhbmNlX3J4X2hlYWQgeworCXVuc2lnbmVkIHNob3J0CWJhc2U7CQkvKiBMb3cgd29yZCBvZiBiYXNlIGFkZHIgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCWZsYWc7CisJdW5zaWduZWQgY2hhciAgYmFzZV9oaTsJLyogSGlnaCB3b3JkIG9mIGJhc2UgYWRkciAodW51c2VkKSAqLworCXNob3J0IGJ1Zl9sZW5ndGg7CS8qIFRoaXMgbGVuZ3RoIGlzIDJzIGNvbXBsZW1lbnQhICovCisJdm9sYXRpbGUgc2hvcnQgbXNnX2xlbmd0aDsJLyogVGhpcyBsZW5ndGggaXMgIm5vcm1hbCIuICovCit9OworCitzdHJ1Y3QgbGFuY2VfdHhfaGVhZCB7CisJdW5zaWduZWQgc2hvcnQgYmFzZTsJCS8qIExvdyB3b3JkIG9mIGJhc2UgYWRkciAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJZmxhZzsKKwl1bnNpZ25lZCBjaGFyIGJhc2VfaGk7CS8qIEhpZ2ggd29yZCBvZiBiYXNlIGFkZHIgKHVudXNlZCkgKi8KKwlzaG9ydCBsZW5ndGg7CQkvKiBMZW5ndGggaXMgMnMgY29tcGxlbWVudCEgKi8KKwl2b2xhdGlsZSBzaG9ydCBtaXNjOworfTsKKworLyogVGhlIExBTkNFIGluaXRpYWxpemF0aW9uIGJsb2NrLCBkZXNjcmliZWQgaW4gZGF0YWJvb2suICovCitzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayB7CisJdW5zaWduZWQgc2hvcnQJbW9kZTsJCS8qIFByZS1zZXQgbW9kZSAqLworCXVuc2lnbmVkIGNoYXIJaHdhZGRyWzZdOwkvKiBQaHlzaWNhbCBldGhlcm5ldCBhZGRyZXNzICovCisJdW5zaWduZWQgaW50ICAgIGZpbHRlclsyXTsJLyogTXVsdGljYXN0IGZpbHRlciAodW51c2VkKS4gKi8KKwkvKiBSZWNlaXZlIGFuZCB0cmFuc21pdCByaW5nIGJhc2UsIGFsb25nIHdpdGggbGVuZ3RoIGJpdHMuICovCisJdW5zaWduZWQgc2hvcnQgcmRyYTsKKwl1bnNpZ25lZCBzaG9ydCBybGVuOworCXVuc2lnbmVkIHNob3J0IHRkcmE7CisJdW5zaWduZWQgc2hvcnQgdGxlbjsKKwl1bnNpZ25lZCBzaG9ydCBwYWRbNF07IC8qIGlzIHRoaWUgbmVlZGVkPyAqLworfTsKKworLyogVGhlIHdob2xlIGxheW91dCBvZiB0aGUgTGFuY2Ugc2hhcmVkIG1lbW9yeSAqLworc3RydWN0IGxhbmNlX21lbW9yeSB7CisJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sJaW5pdDsKKwlzdHJ1Y3QgbGFuY2VfdHhfaGVhZAl0eF9oZWFkW1RYX1JJTkdfU0laRV07CisJc3RydWN0IGxhbmNlX3J4X2hlYWQJcnhfaGVhZFtSWF9SSU5HX1NJWkVdOworCWNoYXIgICByeF9kYXRhW1JYX1JJTkdfU0laRV1bUEtUX0JVRl9TWl07CisJY2hhciAgIHR4X2RhdGFbVFhfUklOR19TSVpFXVtQS1RfQlVGX1NaXTsKK307CisKKy8qIFRoZSBkcml2ZXIncyBwcml2YXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IGxhbmNlX3ByaXZhdGUgeworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0CSppb2Jhc2U7CisJc3RydWN0IGxhbmNlX21lbW9yeQkqbWVtOworICAgICAJaW50IG5ld19yeCwgbmV3X3R4OwkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KKwlpbnQgb2xkX3R4LCBvbGRfcng7ICAgICAvKiByaW5nIGVudHJ5IHRvIGJlIHByb2Nlc3NlZCAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworLyogVGhlc2UgdHdvIG11c3QgYmUgbG9uZ3MgZm9yIHNldF9iaXQoKSAqLworCWxvbmcJICAgIHR4X2Z1bGw7CisJbG9uZwkgICAgbG9jazsKK307CisKKy8qIEkvTyByZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCisKKyNkZWZpbmUJTUVNCWxwLT5tZW0KKyNkZWZpbmUJRFJFRwlscC0+aW9iYXNlWzBdCisjZGVmaW5lCUFSRUcJbHAtPmlvYmFzZVsxXQorI2RlZmluZQlSRUdBKGEpCSggQVJFRyA9IChhKSwgRFJFRyApCisKKy8qIERlZmluaXRpb25zIGZvciB0aGUgTGFuY2UgKi8KKworLyogdHhfaGVhZCBmbGFncyAqLworI2RlZmluZSBUTUQxX0VOUAkJMHgwMQkvKiBlbmQgb2YgcGFja2V0ICovCisjZGVmaW5lIFRNRDFfU1RQCQkweDAyCS8qIHN0YXJ0IG9mIHBhY2tldCAqLworI2RlZmluZSBUTUQxX0RFRgkJMHgwNAkvKiBkZWZlcnJlZCAqLworI2RlZmluZSBUTUQxX09ORQkJMHgwOAkvKiBvbmUgcmV0cnkgbmVlZGVkICovCisjZGVmaW5lIFRNRDFfTU9SRQkJMHgxMAkvKiBtb3JlIHRoYW4gb25lIHJldHJ5IG5lZWRlZCAqLworI2RlZmluZSBUTUQxX0VSUgkJMHg0MAkvKiBlcnJvciBzdW1tYXJ5ICovCisjZGVmaW5lIFRNRDFfT1dOIAkJMHg4MAkvKiBvd25lcnNoaXAgKHNldDogY2hpcCBvd25zKSAqLworCisjZGVmaW5lIFRNRDFfT1dOX0NISVAJVE1EMV9PV04KKyNkZWZpbmUgVE1EMV9PV05fSE9TVAkwCisKKy8qIHR4X2hlYWQgbWlzYyBmaWVsZCAqLworI2RlZmluZSBUTUQzX1REUgkJMHgwM0ZGCS8qIFRpbWUgRG9tYWluIFJlZmxlY3RvbWV0cnkgY291bnRlciAqLworI2RlZmluZSBUTUQzX1JUUlkJCTB4MDQwMAkvKiBmYWlsZWQgYWZ0ZXIgMTYgcmV0cmllcyAqLworI2RlZmluZSBUTUQzX0xDQVIJCTB4MDgwMAkvKiBjYXJyaWVyIGxvc3QgKi8KKyNkZWZpbmUgVE1EM19MQ09MCQkweDEwMDAJLyogbGF0ZSBjb2xsaXNpb24gKi8KKyNkZWZpbmUgVE1EM19VRkxPCQkweDQwMDAJLyogdW5kZXJmbG93IChsYXRlIG1lbW9yeSkgKi8KKyNkZWZpbmUgVE1EM19CVUZGCQkweDgwMDAJLyogYnVmZmVyaW5nIGVycm9yIChubyBFTlApICovCisKKy8qIHJ4X2hlYWQgZmxhZ3MgKi8KKyNkZWZpbmUgUk1EMV9FTlAJCTB4MDEJLyogZW5kIG9mIHBhY2tldCAqLworI2RlZmluZSBSTUQxX1NUUAkJMHgwMgkvKiBzdGFydCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgUk1EMV9CVUZGCQkweDA0CS8qIGJ1ZmZlciBlcnJvciAqLworI2RlZmluZSBSTUQxX0NSQwkJMHgwOAkvKiBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgUk1EMV9PRkxPCQkweDEwCS8qIG92ZXJmbG93ICovCisjZGVmaW5lIFJNRDFfRlJBTQkJMHgyMAkvKiBmcmFtaW5nIGVycm9yICovCisjZGVmaW5lIFJNRDFfRVJSCQkweDQwCS8qIGVycm9yIHN1bW1hcnkgKi8KKyNkZWZpbmUgUk1EMV9PV04gCQkweDgwCS8qIG93bmVyc2hpcCAoc2V0OiBzaGlwIG93bnMpICovCisKKyNkZWZpbmUgUk1EMV9PV05fQ0hJUAlSTUQxX09XTgorI2RlZmluZSBSTUQxX09XTl9IT1NUCTAKKworLyogcmVnaXN0ZXIgbmFtZXMgKi8KKyNkZWZpbmUgQ1NSMAkwCQkvKiBtb2RlL3N0YXR1cyAqLworI2RlZmluZSBDU1IxCTEJCS8qIGluaXQgYmxvY2sgYWRkciAobG93KSAqLworI2RlZmluZSBDU1IyCTIJCS8qIGluaXQgYmxvY2sgYWRkciAoaGlnaCkgKi8KKyNkZWZpbmUgQ1NSMwkzCQkvKiBtaXNjICovCisjZGVmaW5lIENTUjgJOAkgIAkvKiBhZGRyZXNzIGZpbHRlciAqLworI2RlZmluZSBDU1IxNQkxNQkJLyogcHJvbWlzY3VvdXMgbW9kZSAqLworCisvKiBDU1IwICovCisvKiAoUj1yZWFkYWJsZSwgVz13cml0ZWFibGUsIFM9c2V0IG9uIHdyaXRlLCBDPWNsZWFyIG9uIHdyaXRlKSAqLworI2RlZmluZSBDU1IwX0lOSVQJMHgwMDAxCQkvKiBpbml0aWFsaXplIChSUykgKi8KKyNkZWZpbmUgQ1NSMF9TVFJUCTB4MDAwMgkJLyogc3RhcnQgKFJTKSAqLworI2RlZmluZSBDU1IwX1NUT1AJMHgwMDA0CQkvKiBzdG9wIChSUykgKi8KKyNkZWZpbmUgQ1NSMF9URE1ECTB4MDAwOAkJLyogdHJhbnNtaXQgZGVtYW5kIChSUykgKi8KKyNkZWZpbmUgQ1NSMF9UWE9OCTB4MDAxMAkJLyogdHJhbnNtaXR0ZXIgb24gKFIpICovCisjZGVmaW5lIENTUjBfUlhPTgkweDAwMjAJCS8qIHJlY2VpdmVyIG9uIChSKSAqLworI2RlZmluZSBDU1IwX0lORUEJMHgwMDQwCQkvKiBpbnRlcnJ1cHQgZW5hYmxlIChSVykgKi8KKyNkZWZpbmUgQ1NSMF9JTlRSCTB4MDA4MAkJLyogaW50ZXJydXB0IGFjdGl2ZSAoUikgKi8KKyNkZWZpbmUgQ1NSMF9JRE9OCTB4MDEwMAkJLyogaW5pdGlhbGl6YXRpb24gZG9uZSAoUkMpICovCisjZGVmaW5lIENTUjBfVElOVAkweDAyMDAJCS8qIHRyYW5zbWl0dGVyIGludGVycnVwdCAoUkMpICovCisjZGVmaW5lIENTUjBfUklOVAkweDA0MDAJCS8qIHJlY2VpdmVyIGludGVycnVwdCAoUkMpICovCisjZGVmaW5lIENTUjBfTUVSUgkweDA4MDAJCS8qIG1lbW9yeSBlcnJvciAoUkMpICovCisjZGVmaW5lIENTUjBfTUlTUwkweDEwMDAJCS8qIG1pc3NlZCBmcmFtZSAoUkMpICovCisjZGVmaW5lIENTUjBfQ0VSUgkweDIwMDAJCS8qIGNhcnJpZXIgZXJyb3IgKG5vIGhlYXJ0YmVhdCA6LSkgKFJDKSAqLworI2RlZmluZSBDU1IwX0JBQkwJMHg0MDAwCQkvKiBiYWJibGU6IHR4LWVkIHRvbyBtYW55IGJpdHMgKFJDKSAqLworI2RlZmluZSBDU1IwX0VSUgkweDgwMDAJCS8qIGVycm9yIChSQykgKi8KKworLyogQ1NSMyAqLworI2RlZmluZSBDU1IzX0JDT04JMHgwMDAxCQkvKiBieXRlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQ1NSM19BQ09OCTB4MDAwMgkJLyogQUxFIGNvbnRyb2wgKi8KKyNkZWZpbmUgQ1NSM19CU1dQCTB4MDAwNAkJLyogYnl0ZSBzd2FwICgxPWJpZyBlbmRpYW4pICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGxhbmNlX3Byb2JlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbGFuY2Vfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworc3RhdGljIHZvaWQgbGFuY2VfaW5pdF9yaW5nKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgaW50IGxhbmNlX3N0YXJ0X3htaXQoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBsYW5jZV9pbnRlcnJ1cHQoIGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwICk7CitzdGF0aWMgaW50IGxhbmNlX3J4KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgaW50IGxhbmNlX2Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmxhbmNlX2dldF9zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBzdW4zbGFuY2VfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdGF0aWMgaW50IGZvdW5kOworCWludCBlcnIgPSAtRU5PREVWOworCisJLyogY2hlY2sgdGhhdCB0aGlzIG1hY2hpbmUgaGFzIGFuIG9uYm9hcmQgbGFuY2UgKi8KKwlzd2l0Y2goaWRwcm9tLT5pZF9tYWNodHlwZSkgeworCWNhc2UgU01fU1VOM3xTTV8zXzUwOgorCWNhc2UgU01fU1VOM3xTTV8zXzYwOgorCWNhc2UgU01fU1VOM1h8U01fM184MDoKKwkJLyogdGhlc2UgbWFjaGluZXMgaGF2ZSBsYW5jZSAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCX0KKworCWlmIChmb3VuZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGxhbmNlX3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmICghbGFuY2VfcHJvYmUoZGV2KSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJZm91bmQgPSAxOworCXJldHVybiBkZXY7CisKK291dDE6CisjaWZkZWYgQ09ORklHX1NVTjMKKwlpb3VubWFwKCh2b2lkICopZGV2LT5iYXNlX2FkZHIpOworI2VuZGlmCitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBsYW5jZV9wcm9iZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sJCisJdW5zaWduZWQgbG9uZyBpb2FkZHI7CisJCisJc3RydWN0IGxhbmNlX3ByaXZhdGUJKmxwOworCWludCAJCQlpOworCXN0YXRpYyBpbnQgCQlkaWRfdmVyc2lvbjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqaW9hZGRyX3Byb2JlOworCXVuc2lnbmVkIHNob3J0IHRtcDEsIHRtcDI7CisKKyNpZmRlZiBDT05GSUdfU1VOMworCWlvYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAoTEFOQ0VfT0JJTywgUEFHRV9TSVpFKTsKKwlpZiAoIWlvYWRkcikKKwkJcmV0dXJuIDA7CisjZWxzZQorCWlvYWRkciA9IFNVTjNYX0xBTkNFOworI2VuZGlmCisKKwkvKiB0ZXN0IHRvIHNlZSBpZiB0aGVyZSdzIHJlYWxseSBhIGxhbmNlIGhlcmUgKi8KKwkvKiAoQ1NST19JTklUIHNob3VsZG4ndCBiZSByZWFkYWJsZSkgKi8KKwkKKwlpb2FkZHJfcHJvYmUgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilpb2FkZHI7CisJdG1wMSA9IGlvYWRkcl9wcm9iZVswXTsKKwl0bXAyID0gaW9hZGRyX3Byb2JlWzFdOworCisJaW9hZGRyX3Byb2JlWzFdID0gQ1NSMDsKKwlpb2FkZHJfcHJvYmVbMF0gPSBDU1IwX0lOSVQgfCBDU1IwX1NUT1A7CisKKwlpZihpb2FkZHJfcHJvYmVbMF0gIT0gQ1NSMF9TVE9QKSB7CisJCWlvYWRkcl9wcm9iZVswXSA9IHRtcDE7CisJCWlvYWRkcl9wcm9iZVsxXSA9IHRtcDI7CisKKyNpZmRlZiBDT05GSUdfU1VOMworCQlpb3VubWFwKCh2b2lkICopaW9hZGRyKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBYWFggLSBsZWFrPyAqLworCU1FTSA9IGR2bWFfbWFsbG9jX2FsaWduKHNpemVvZihzdHJ1Y3QgbGFuY2VfbWVtb3J5KSwgMHgxMDAwMCk7CisKKwlscC0+aW9iYXNlID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopaW9hZGRyOworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9hZGRyOyAvKiBpbmZvcm1hdGlvbmFsIG9ubHkgKi8KKworCVJFR0EoQ1NSMCkgPSBDU1IwX1NUT1A7IAorCisJcmVxdWVzdF9pcnEoTEFOQ0VfSVJRLCBsYW5jZV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwgIlNVTjMgTGFuY2UiLCBkZXYpOworCWRldi0+aXJxID0gKHVuc2lnbmVkIHNob3J0KUxBTkNFX0lSUTsKKworCisJcHJpbnRrKCIlczogU1VOMyBMYW5jZSBhdCBpbyAlI2x4LCBtZW0gJSNseCwgaXJxICVkLCBod2FkZHIgIiwKKwkJICAgZGV2LT5uYW1lLAorCQkgICAodW5zaWduZWQgbG9uZylpb2FkZHIsCisJCSAgICh1bnNpZ25lZCBsb25nKU1FTSwKKwkJICAgZGV2LT5pcnEpOworCisJLyogY29weSBpbiB0aGUgZXRoZXJuZXQgYWRkcmVzcyBmcm9tIHRoZSBwcm9tICovCisJZm9yKGkgPSAwOyBpIDwgNiA7IGkrKykKKwkgICAgIGRldi0+ZGV2X2FkZHJbaV0gPSBpZHByb20tPmlkX2V0aGFkZHJbaV07CisKKwkvKiB0ZWxsIHRoZSBjYXJkIGl0J3MgZXRoZXIgYWRkcmVzcywgYnl0ZXMgc3dhcHBlZCAqLworCU1FTS0+aW5pdC5od2FkZHJbMF0gPSBkZXYtPmRldl9hZGRyWzFdOworCU1FTS0+aW5pdC5od2FkZHJbMV0gPSBkZXYtPmRldl9hZGRyWzBdOworCU1FTS0+aW5pdC5od2FkZHJbMl0gPSBkZXYtPmRldl9hZGRyWzNdOworCU1FTS0+aW5pdC5od2FkZHJbM10gPSBkZXYtPmRldl9hZGRyWzJdOworCU1FTS0+aW5pdC5od2FkZHJbNF0gPSBkZXYtPmRldl9hZGRyWzVdOworCU1FTS0+aW5pdC5od2FkZHJbNV0gPSBkZXYtPmRldl9hZGRyWzRdOworCisJZm9yKCBpID0gMDsgaSA8IDY7ICsraSApCisJCXByaW50ayggIiUwMnglcyIsIGRldi0+ZGV2X2FkZHJbaV0sIChpIDwgNSkgPyAiOiIgOiAiXG4iICk7CisKKwlNRU0tPmluaXQubW9kZSA9IDB4MDAwMDsKKwlNRU0tPmluaXQuZmlsdGVyWzBdID0gMHgwMDAwMDAwMDsKKwlNRU0tPmluaXQuZmlsdGVyWzFdID0gMHgwMDAwMDAwMDsKKwlNRU0tPmluaXQucmRyYSA9IGR2bWFfdnRvYihNRU0tPnJ4X2hlYWQpOworCU1FTS0+aW5pdC5ybGVuICAgID0gKFJYX0xPR19SSU5HX1NJWkUgPDwgMTMpIHwKKwkJKGR2bWFfdnRvYihNRU0tPnJ4X2hlYWQpID4+IDE2KTsKKwlNRU0tPmluaXQudGRyYSA9IGR2bWFfdnRvYihNRU0tPnR4X2hlYWQpOworCU1FTS0+aW5pdC50bGVuICAgID0gKFRYX0xPR19SSU5HX1NJWkUgPDwgMTMpIHwKKwkJKGR2bWFfdnRvYihNRU0tPnR4X2hlYWQpID4+IDE2KTsKKworCURQUklOVEsoMiwgKCJpbml0YWRkcjogJTA4bHggcnhfcmluZzogJTA4bHggdHhfcmluZzogJTA4bHhcbiIsCisJICAgICAgIGR2bWFfdnRvYigmKE1FTS0+aW5pdCkpLCBkdm1hX3Z0b2IoTUVNLT5yeF9oZWFkKSwKKwkgICAgICAgKGR2bWFfdnRvYihNRU0tPnR4X2hlYWQpKSkpOyAgCisKKwlpZiAoZGlkX3ZlcnNpb24rKyA9PSAwKQorCQlwcmludGsoIHZlcnNpb24gKTsKKworCS8qIFRoZSBMQU5DRS1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZsYW5jZV9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmxhbmNlX3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gJmxhbmNlX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJmxhbmNlX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAwOworLy8JS0xVREdFIC0tIFJFTU9WRSBNRQorCXNldF9iaXQoX19MSU5LX1NUQVRFX1BSRVNFTlQsICZkZXYtPnN0YXRlKTsKKworCisJbWVtc2V0KCAmbHAtPnN0YXRzLCAwLCBzaXplb2YobHAtPnN0YXRzKSApOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbGFuY2Vfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCURQUklOVEsoIDIsICggIiVzOiBsYW5jZV9vcGVuKClcbiIsIGRldi0+bmFtZSApKTsKKworCVJFR0EoQ1NSMCkgPSBDU1IwX1NUT1A7CisKKwlsYW5jZV9pbml0X3JpbmcoZGV2KTsKKworCS8qIEZyb20gbm93IG9uLCBBUkVHIGlzIGtlcHQgdG8gcG9pbnQgdG8gQ1NSMCAqLworCVJFR0EoQ1NSMCkgPSBDU1IwX0lOSVQ7CisKKwlpID0gMTAwMDAwMDsKKwl3aGlsZSAoLS1pID4gMCkKKwkJaWYgKERSRUcgJiBDU1IwX0lET04pCisJCQlicmVhazsKKwlpZiAoaSA8IDAgfHwgKERSRUcgJiBDU1IwX0VSUikpIHsKKwkJRFBSSU5USyggMiwgKCAibGFuY2Vfb3BlbigpOiBvcGVuaW5nICVzIGZhaWxlZCwgaT0lZCwgY3NyMD0lMDR4XG4iLAorCQkJCQkgIGRldi0+bmFtZSwgaSwgRFJFRyApKTsKKwkJRFJFRyA9IENTUjBfU1RPUDsKKwkJcmV0dXJuKCAtRUlPICk7CisJfQorCisJRFJFRyA9IENTUjBfSURPTiB8IENTUjBfU1RSVCB8IENTUjBfSU5FQTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCisJRFBSSU5USyggMiwgKCAiJXM6IExBTkNFIGlzIG9wZW4sIGNzcjAgJTA0eFxuIiwgZGV2LT5uYW1lLCBEUkVHICkpOworCisJcmV0dXJuKCAwICk7Cit9CisKKworLyogSW5pdGlhbGl6ZSB0aGUgTEFOQ0UgUnggYW5kIFR4IHJpbmdzLiAqLworCitzdGF0aWMgdm9pZCBsYW5jZV9pbml0X3JpbmcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlscC0+bG9jayA9IDA7CisJbHAtPnR4X2Z1bGwgPSAwOworCWxwLT5uZXdfcnggPSBscC0+bmV3X3R4ID0gMDsKKwlscC0+b2xkX3J4ID0gbHAtPm9sZF90eCA9IDA7CisKKwlmb3IoIGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKysgKSB7CisJCU1FTS0+dHhfaGVhZFtpXS5iYXNlID0gZHZtYV92dG9iKE1FTS0+dHhfZGF0YVtpXSk7CisJCU1FTS0+dHhfaGVhZFtpXS5mbGFnID0gMDsKKyAJCU1FTS0+dHhfaGVhZFtpXS5iYXNlX2hpID0gCisJCQkoZHZtYV92dG9iKE1FTS0+dHhfZGF0YVtpXSkpID4+MTY7CisJCU1FTS0+dHhfaGVhZFtpXS5sZW5ndGggPSAwOworCQlNRU0tPnR4X2hlYWRbaV0ubWlzYyA9IDA7CisJfQorCisJZm9yKCBpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrICkgeworCQlNRU0tPnJ4X2hlYWRbaV0uYmFzZSA9IGR2bWFfdnRvYihNRU0tPnJ4X2RhdGFbaV0pOworCQlNRU0tPnJ4X2hlYWRbaV0uZmxhZyA9IFJNRDFfT1dOX0NISVA7CisJCU1FTS0+cnhfaGVhZFtpXS5iYXNlX2hpID0gCisJCQkoZHZtYV92dG9iKE1FTS0+cnhfZGF0YVtpXSkpID4+IDE2OworCQlNRU0tPnJ4X2hlYWRbaV0uYnVmX2xlbmd0aCA9IC1QS1RfQlVGX1NaIHwgMHhmMDAwOworCQlNRU0tPnJ4X2hlYWRbaV0ubXNnX2xlbmd0aCA9IDA7CisJfQorCisJLyogdGVsbCB0aGUgY2FyZCBpdCdzIGV0aGVyIGFkZHJlc3MsIGJ5dGVzIHN3YXBwZWQgKi8KKwlNRU0tPmluaXQuaHdhZGRyWzBdID0gZGV2LT5kZXZfYWRkclsxXTsKKwlNRU0tPmluaXQuaHdhZGRyWzFdID0gZGV2LT5kZXZfYWRkclswXTsKKwlNRU0tPmluaXQuaHdhZGRyWzJdID0gZGV2LT5kZXZfYWRkclszXTsKKwlNRU0tPmluaXQuaHdhZGRyWzNdID0gZGV2LT5kZXZfYWRkclsyXTsKKwlNRU0tPmluaXQuaHdhZGRyWzRdID0gZGV2LT5kZXZfYWRkcls1XTsKKwlNRU0tPmluaXQuaHdhZGRyWzVdID0gZGV2LT5kZXZfYWRkcls0XTsKKworCU1FTS0+aW5pdC5tb2RlID0gMHgwMDAwOworCU1FTS0+aW5pdC5maWx0ZXJbMF0gPSAweDAwMDAwMDAwOworCU1FTS0+aW5pdC5maWx0ZXJbMV0gPSAweDAwMDAwMDAwOworCU1FTS0+aW5pdC5yZHJhID0gZHZtYV92dG9iKE1FTS0+cnhfaGVhZCk7CisJTUVNLT5pbml0LnJsZW4gICAgPSAoUlhfTE9HX1JJTkdfU0laRSA8PCAxMykgfAorCQkoZHZtYV92dG9iKE1FTS0+cnhfaGVhZCkgPj4gMTYpOworCU1FTS0+aW5pdC50ZHJhID0gZHZtYV92dG9iKE1FTS0+dHhfaGVhZCk7CisJTUVNLT5pbml0LnRsZW4gICAgPSAoVFhfTE9HX1JJTkdfU0laRSA8PCAxMykgfAorCQkoZHZtYV92dG9iKE1FTS0+dHhfaGVhZCkgPj4gMTYpOworCisKKwkvKiB0ZWxsIHRoZSBsYW5jZSB0aGUgYWRkcmVzcyBvZiBpdHMgaW5pdCBibG9jayAqLworCVJFR0EoQ1NSMSkgPSBkdm1hX3Z0b2IoJihNRU0tPmluaXQpKTsKKwlSRUdBKENTUjIpID0gZHZtYV92dG9iKCYoTUVNLT5pbml0KSkgPj4gMTY7CisKKyNpZmRlZiBDT05GSUdfU1VOM1gKKwlSRUdBKENTUjMpID0gQ1NSM19CU1dQIHwgQ1NSM19BQ09OIHwgQ1NSM19CQ09OOworI2Vsc2UKKwlSRUdBKENTUjMpID0gQ1NSM19CU1dQOworI2VuZGlmCisKK30KKworCitzdGF0aWMgaW50IGxhbmNlX3N0YXJ0X3htaXQoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5LCBsZW47CisJc3RydWN0IGxhbmNlX3R4X2hlYWQgKmhlYWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQUklOVEsoIDEsICggIiVzOiB0cmFuc21pdCBzdGFydC5cbiIsCisJCSAgICAgIGRldi0+bmFtZSkpOworCisJLyogVHJhbnNtaXR0ZXIgdGltZW91dCwgc2VyaW91cyBwcm9ibGVtcy4gKi8KKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCWludCB0aWNrc3NvZmFyID0gamlmZmllcyAtIGRldi0+dHJhbnNfc3RhcnQ7CisJCWlmICh0aWNrc3NvZmFyIDwgMjApCisJCQlyZXR1cm4oIDEgKTsKKworCQlEUFJJTlRLKCAxLCAoICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTA0eCwgcmVzZXR0aW5nLlxuIiwKKwkJCQkJICBkZXYtPm5hbWUsIERSRUcgKSk7CisJCURSRUcgPSBDU1IwX1NUT1A7CisJCS8qCisJCSAqIEFsd2F5cyBzZXQgQlNXUCBhZnRlciBhIFNUT1AgYXMgU1RPUCBwdXRzIGl0IGJhY2sgaW50bworCQkgKiBsaXR0bGUgZW5kaWFuIG1vZGUuCisJCSAqLworCQlSRUdBKENTUjMpID0gQ1NSM19CU1dQOworCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkJaWYobGFuY2VfZGVidWcgPj0gMikgeworCQkJaW50IGk7CisJCQlwcmludGsoIlJpbmcgZGF0YTogb2xkX3R4ICVkIG5ld190eCAlZCVzIG5ld19yeCAlZFxuIiwKKwkJCSAgICAgICBscC0+b2xkX3R4LCBscC0+bmV3X3R4LAorCQkJICAgICAgIGxwLT50eF9mdWxsID8gIiAoZnVsbCkiIDogIiIsCisJCQkgICAgICAgbHAtPm5ld19yeCApOworCQkJZm9yKCBpID0gMCA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKyApCisJCQkJcHJpbnRrKCAicnggIyVkOiBiYXNlPSUwNHggYmxlbj0lMDR4IG1sZW49JTA0eFxuIiwKKwkJCQkJaSwgTUVNLT5yeF9oZWFkW2ldLmJhc2UsCisJCQkJCS1NRU0tPnJ4X2hlYWRbaV0uYnVmX2xlbmd0aCwKKwkJCQkJTUVNLT5yeF9oZWFkW2ldLm1zZ19sZW5ndGgpOworCQkJZm9yKCBpID0gMCA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKyApCisJCQkJcHJpbnRrKCJ0eCAjJWQ6IGJhc2U9JTA0eCBsZW49JTA0eCBtaXNjPSUwNHhcbiIsCisJCQkJICAgICAgIGksIE1FTS0+dHhfaGVhZFtpXS5iYXNlLAorCQkJCSAgICAgICAtTUVNLT50eF9oZWFkW2ldLmxlbmd0aCwKKwkJCQkgICAgICAgTUVNLT50eF9oZWFkW2ldLm1pc2MgKTsKKwkJfQorCisJCWxhbmNlX2luaXRfcmluZyhkZXYpOworCQlSRUdBKCBDU1IwICkgPSBDU1IwX0lORUEgfCBDU1IwX0lOSVQgfCBDU1IwX1NUUlQ7CisJCQorCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCisJCXJldHVybiAwOworCX0KKworCQorCS8qIEJsb2NrIGEgdGltZXItYmFzZWQgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4gIFRoaXMgY291bGQgYmV0dGVyIGJlCisJICAgZG9uZSB3aXRoIGF0b21pY19zd2FwKDEsIGRldi0+dGJ1c3kpLCBidXQgc2V0X2JpdCgpIHdvcmtzIGFzIHdlbGwuICovCisKKwkvKiBCbG9jayBhIHRpbWVyLWJhc2VkIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcgd2l0aCB1cyBieQorCSAgIHN0b3BwaW5nIHRoZSBxdWV1ZSBmb3IgYSBiaXQuLi4gKi8KKyAgICAgCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWlmICh0ZXN0X2FuZF9zZXRfYml0KCAwLCAodm9pZCopJmxwLT5sb2NrICkgIT0gMCkgeworCQlwcmludGsoICIlczogdHggcXVldWUgbG9jayEuXG4iLCBkZXYtPm5hbWUpOworCQkvKiBkb24ndCBjbGVhciBkZXYtPnRidXN5IGZsYWcuICovCisJCXJldHVybiAxOworCX0KKworCUFSRUcgPSBDU1IwOworICAJRFBSSU5USyggMiwgKCAiJXM6IGxhbmNlX3N0YXJ0X3htaXQoKSBjYWxsZWQsIGNzcjAgJTQuNHguXG4iLAorICAJCQkJICBkZXYtPm5hbWUsIERSRUcgKSk7CisKKyNpZmRlZiBDT05GSUdfU1VOM1gKKwkvKiB0aGlzIHdlaXJkbmVzcyBkb2Vzbid0IGFwcGVhciBvbiBzdW4zLi4uICovCisJaWYoIShEUkVHICYgQ1NSMF9JTklUKSkgeworCQlEUFJJTlRLKCAxLCAoIklOSVQgbm90IHNldCwgcmVpbml0aWFsaXppbmcuLi5cbiIpKTsKKwkJUkVHQSggQ1NSMCApID0gQ1NSMF9TVE9QOworCQlsYW5jZV9pbml0X3JpbmcoZGV2KTsKKwkJUkVHQSggQ1NSMCApID0gQ1NSMF9JTklUIHwgQ1NSMF9TVFJUOworCX0KKyNlbmRpZgorCisJLyogRmlsbCBpbiBhIFR4IHJpbmcgZW50cnkgKi8KKyNpZiAwCisJaWYgKGxhbmNlX2RlYnVnID49IDIpIHsKKwkJdV9jaGFyICpwOworCQlpbnQgaTsKKwkJcHJpbnRrKCAiJXM6IFRYIHBrdCAlZCB0eXBlIDB4JTA0eCBmcm9tICIsIGRldi0+bmFtZSwKKwkJCWxwLT5uZXdfdHgsICgodV9zaG9ydCAqKXNrYi0+ZGF0YSlbNl0pOworCQlmb3IoIHAgPSAmKCh1X2NoYXIgKilza2ItPmRhdGEpWzZdLCBpID0gMDsgaSA8IDY7IGkrKyApCisJCQlwcmludGsoIiUwMnglcyIsICpwKyssIGkgIT0gNSA/ICI6IiA6ICIiICk7CisJCXByaW50aygiIHRvICIpOworCQlmb3IoIHAgPSAodV9jaGFyICopc2tiLT5kYXRhLCBpID0gMDsgaSA8IDY7IGkrKyApCisJCQlwcmludGsoIiUwMnglcyIsICpwKyssIGkgIT0gNSA/ICI6IiA6ICIiICk7CisJCXByaW50aygiIGRhdGEgYXQgMHglMDh4IGxlbiAlZFxuIiwgKGludClza2ItPmRhdGEsCisJCSAgICAgICAoaW50KXNrYi0+bGVuICk7CisJfQorI2VuZGlmCQorCS8qIFdlJ3JlIG5vdCBwcmVwYXJlZCBmb3IgdGhlIGludCB1bnRpbCB0aGUgbGFzdCBmbGFncyBhcmUgc2V0L3Jlc2V0LgorCSAqIEFuZCB0aGUgaW50IG1heSBoYXBwZW4gYWxyZWFkeSBhZnRlciBzZXR0aW5nIHRoZSBPV05fQ0hJUC4uLiAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIE1hc2sgdG8gcmluZyBidWZmZXIgYm91bmRhcnkuICovCisJZW50cnkgPSBscC0+bmV3X3R4OworCWhlYWQgID0gJihNRU0tPnR4X2hlYWRbZW50cnldKTsKKworCS8qIENhdXRpb246IHRoZSB3cml0ZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgc2V0IHRoZSAib3duZXJzaGlwIiBiaXRzCisJICogbGFzdC4KKwkgKi8KKworCS8qIHRoZSBzdW4zJ3MgbGFuY2UgbmVlZHMgaXQncyBidWZmZXIgcGFkZGVkIHRvIHRoZSBtaW5pbXVtCisJICAgc2l6ZSAqLworCWxlbiA9IChFVEhfWkxFTiA8IHNrYi0+bGVuKSA/IHNrYi0+bGVuIDogRVRIX1pMRU47CisKKy8vCWhlYWQtPmxlbmd0aCA9IC1sZW47CisJaGVhZC0+bGVuZ3RoID0gKC1sZW4pIHwgMHhmMDAwOworCWhlYWQtPm1pc2MgPSAwOworCisJbWVtY3B5KCBQS1RCVUZfQUREUihoZWFkKSwgKHZvaWQgKilza2ItPmRhdGEsIHNrYi0+bGVuICk7CisJaWYgKGxlbiAhPSBza2ItPmxlbikKKwkJbWVtc2V0KFBLVEJVRl9BRERSKGhlYWQpICsgc2tiLT5sZW4sIDAsIGxlbi1za2ItPmxlbik7CisKKwloZWFkLT5mbGFnID0gVE1EMV9PV05fQ0hJUCB8IFRNRDFfRU5QIHwgVE1EMV9TVFA7CisJbHAtPm5ld190eCA9IChscC0+bmV3X3R4ICsgMSkgJiBUWF9SSU5HX01PRF9NQVNLOworCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCS8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHNlbmQgcG9sbC4gKi8KKwlSRUdBKENTUjApID0gQ1NSMF9JTkVBIHwgQ1NSMF9URE1EIHwgQ1NSMF9TVFJUOworCUFSRUcgPSBDU1IwOworICAJRFBSSU5USyggMiwgKCAiJXM6IGxhbmNlX3N0YXJ0X3htaXQoKSBleGl0aW5nLCBjc3IwICU0LjR4LlxuIiwKKyAgCQkJCSAgZGV2LT5uYW1lLCBEUkVHICkpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWRldl9rZnJlZV9za2IoIHNrYiApOworCisJbHAtPmxvY2sgPSAwOworCWlmICgoTUVNLT50eF9oZWFkWyhlbnRyeSsxKSAmIFRYX1JJTkdfTU9EX01BU0tdLmZsYWcgJiBUTUQxX09XTikgPT0KKwkgICAgVE1EMV9PV05fSE9TVCkgCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIExBTkNFIGludGVycnVwdCBoYW5kbGVyLiAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgbGFuY2VfaW50ZXJydXB0KCBpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGNzcjA7CisJc3RhdGljIGludCBpbl9pbnRlcnJ1cHQ7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJRFBSSU5USyggMSwgKCAibGFuY2VfaW50ZXJydXB0KCk6IGludmFsaWQgZGV2X2lkXG4iICkpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaWYgKGluX2ludGVycnVwdCkKKwkJRFBSSU5USyggMiwgKCAiJXM6IFJlLWVudGVyaW5nIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci5cbiIsIGRldi0+bmFtZSApKTsKKwlpbl9pbnRlcnJ1cHQgPSAxOworCQorIHN0aWxsX21vcmU6CisJZmx1c2hfY2FjaGVfYWxsKCk7CisJCisJQVJFRyA9IENTUjA7CisJY3NyMCA9IERSRUc7CisKKwkvKiBhY2sgaW50ZXJydXB0cyAqLworCURSRUcgPSBjc3IwICYgKENTUjBfVElOVCB8IENTUjBfUklOVCB8IENTUjBfSURPTik7CisKKwkvKiBjbGVhciBlcnJvcnMgKi8KKwlpZihjc3IwICYgQ1NSMF9FUlIpCisJCURSRUcgPSBDU1IwX0JBQkwgfCBDU1IwX01FUlIgfCBDU1IwX0NFUlIgfCBDU1IwX01JU1M7CisKKworCURQUklOVEsoIDIsICggIiVzOiBpbnRlcnJ1cHQgIGNzcjA9JTA0eCBuZXcgY3NyPSUwNHguXG4iLAorCQkgICAgICBkZXYtPm5hbWUsIGNzcjAsIERSRUcgKSk7CisKKwlpZiAoY3NyMCAmIENTUjBfVElOVCkgewkJCS8qIFR4LWRvbmUgaW50ZXJydXB0ICovCisJCWludCBvbGRfdHggPSBscC0+b2xkX3R4OworCisvLwkJaWYobGFuY2VfZGVidWcgPj0gMykgeworLy8JCQlpbnQgaTsKKy8vCQkJCisvLwkJCXByaW50aygiJXM6IHR4IGludFxuIiwgZGV2LT5uYW1lKTsKKy8vCQkJCisvLwkJCWZvcihpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorLy8JCQkJcHJpbnRrKCJyaW5nICVkIGZsYWc9JTA0eFxuIiwgaSwKKy8vCQkJCSAgICAgICBNRU0tPnR4X2hlYWRbaV0uZmxhZyk7CisvLwkJfQorCQkKKwkJd2hpbGUoIG9sZF90eCAhPSBscC0+bmV3X3R4KSB7CisJCQlzdHJ1Y3QgbGFuY2VfdHhfaGVhZCAqaGVhZCA9ICYoTUVNLT50eF9oZWFkW29sZF90eF0pOyAKKwkJCQorCQkJRFBSSU5USygzLCAoIm9uIHR4X3JpbmcgJWRcbiIsIG9sZF90eCkpOworCisJCQlpZiAoaGVhZC0+ZmxhZyAmIFRNRDFfT1dOX0NISVApCisJCQkJYnJlYWs7IC8qIEl0IHN0aWxsIGhhc24ndCBiZWVuIFR4ZWQgKi8KKwkJCQkKKwkJCWlmIChoZWFkLT5mbGFnICYgVE1EMV9FUlIpIHsKKwkJCQlpbnQgc3RhdHVzID0gaGVhZC0+bWlzYzsKKwkJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFRNRDNfUlRSWSkgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFRNRDNfTENBUikgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFRNRDNfTENPTCkgbHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgKFRNRDNfVUZMTyB8IFRNRDNfQlVGRikpIHsKKwkJCQkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJCXByaW50aygiJXM6IFR4IEZJRk8gZXJyb3JcbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUpOyAKKwkJCQkJUkVHQShDU1IwKSA9IENTUjBfU1RPUDsKKwkJCQkJUkVHQShDU1IzKSA9IENTUjNfQlNXUDsKKwkJCQkJbGFuY2VfaW5pdF9yaW5nKGRldik7CisJCQkJCVJFR0EoQ1NSMCkgPSBDU1IwX1NUUlQgfCBDU1IwX0lORUE7CisJCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCQl9CisJCQl9IGVsc2UgaWYoaGVhZC0+ZmxhZyAmIChUTUQxX0VOUCB8IFRNRDFfU1RQKSkgeworCQkJCQorCQkJCWhlYWQtPmZsYWcgJj0gfihUTUQxX0VOUCB8IFRNRDFfU1RQKTsKKwkJCQlpZihoZWFkLT5mbGFnICYgKFRNRDFfT05FIHwgVE1EMV9NT1JFKSkKKwkJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCQkKKwkJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCURQUklOVEsoMywgKCJjbGVhcmVkIHR4IHJpbmcgJWRcbiIsIG9sZF90eCkpOworCQkJfQorCQkJb2xkX3R4ID0gKG9sZF90eCArMSkgJiBUWF9SSU5HX01PRF9NQVNLOworCQl9CisKKwkJbHAtPm9sZF90eCA9IG9sZF90eDsKKwl9CisKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIGNsZWFyIHRidXN5LiAqLworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCisJaWYgKGNzcjAgJiBDU1IwX1JJTlQpCQkJLyogUnggaW50ZXJydXB0ICovCisJCWxhbmNlX3J4KCBkZXYgKTsKKwkKKwkvKiBMb2cgbWlzYyBlcnJvcnMuICovCisJaWYgKGNzcjAgJiBDU1IwX0JBQkwpIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsgLyogVHggYmFiYmxlLiAqLworCWlmIChjc3IwICYgQ1NSMF9NSVNTKSBscC0+c3RhdHMucnhfZXJyb3JzKys7IC8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLworCWlmIChjc3IwICYgQ1NSMF9NRVJSKSB7CisJCURQUklOVEsoIDEsICggIiVzOiBCdXMgbWFzdGVyIGFyYml0cmF0aW9uIGZhaWx1cmUgKD8hPyksICIKKwkJCSAgICAgICJzdGF0dXMgJTA0eC5cbiIsIGRldi0+bmFtZSwgY3NyMCApKTsKKwkJLyogUmVzdGFydCB0aGUgY2hpcC4gKi8KKwkJUkVHQShDU1IwKSA9IENTUjBfU1RPUDsKKwkJUkVHQShDU1IzKSA9IENTUjNfQlNXUDsKKwkJbGFuY2VfaW5pdF9yaW5nKGRldik7CisJCVJFR0EoQ1NSMCkgPSBDU1IwX1NUUlQgfCBDU1IwX0lORUE7CisJfQorCisKKyAgICAvKiBDbGVhciBhbnkgb3RoZXIgaW50ZXJydXB0LCBhbmQgc2V0IGludGVycnVwdCBlbmFibGUuICovCisvLwlEUkVHID0gQ1NSMF9CQUJMIHwgQ1NSMF9DRVJSIHwgQ1NSMF9NSVNTIHwgQ1NSMF9NRVJSIHwKKy8vCQkgICBDU1IwX0lET04gfCBDU1IwX0lORUE7CisKKwlSRUdBKENTUjApID0gQ1NSMF9JTkVBOworCisJaWYoRFJFRyAmIChDU1IwX1JJTlQgfCBDU1IwX1RJTlQpKSB7CisJICAgICBEUFJJTlRLKDIsICgicmVzdGFydGluZyBpbnRlcnJ1cHQsIGNzcjA9JSMwNHhcbiIsIERSRUcpKTsKKwkgICAgIGdvdG8gc3RpbGxfbW9yZTsKKwl9CisKKwlEUFJJTlRLKCAyLCAoICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIGNzcjA9JSMwNHguXG4iLAorCQkJCSAgZGV2LT5uYW1lLCBEUkVHICkpOworCWluX2ludGVycnVwdCA9IDA7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBnZXQgcGFja2V0LCB0b3NzIGludG8gc2tidWZmICovCitzdGF0aWMgaW50IGxhbmNlX3J4KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeSA9IGxwLT5uZXdfcng7CisKKwkvKiBJZiB3ZSBvd24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworCXdoaWxlKCAoTUVNLT5yeF9oZWFkW2VudHJ5XS5mbGFnICYgUk1EMV9PV04pID09IFJNRDFfT1dOX0hPU1QgKSB7CisJCXN0cnVjdCBsYW5jZV9yeF9oZWFkICpoZWFkID0gJihNRU0tPnJ4X2hlYWRbZW50cnldKTsKKwkJaW50IHN0YXR1cyA9IGhlYWQtPmZsYWc7CisJCQorCQlpZiAoc3RhdHVzICE9IChSTUQxX0VOUHxSTUQxX1NUUCkpIHsgIC8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KKwkJCS8qIFRoZXJlIGlzIGEgdHJpY2t5IGVycm9yIG5vdGVkIGJ5IEpvaG4gTXVycGh5LAorCQkJICAgPG11cmZAcGVyZnRlY2guY29tPiB0byBSdXNzIE5lbHNvbjogRXZlbiB3aXRoIAorCQkJICAgZnVsbC1zaXplZCBidWZmZXJzIGl0J3MgcG9zc2libGUgZm9yIGEgamFiYmVyIHBhY2tldCB0byB1c2UgdHdvCisJCQkgICBidWZmZXJzLCB3aXRoIG9ubHkgdGhlIGxhc3QgY29ycmVjdGx5IG5vdGluZyB0aGUgZXJyb3IuICovCisJCQlpZiAoc3RhdHVzICYgUk1EMV9FTlApCS8qIE9ubHkgY291bnQgYSBnZW5lcmFsIGVycm9yIGF0IHRoZSAqLworCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsgLyogZW5kIG9mIGEgcGFja2V0LiovCisJCQlpZiAoc3RhdHVzICYgUk1EMV9GUkFNKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUk1EMV9PRkxPKSBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBSTUQxX0NSQykgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBSTUQxX0JVRkYpIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJaGVhZC0+ZmxhZyAmPSAoUk1EMV9FTlB8Uk1EMV9TVFApOworCQl9IGVsc2UgeworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIsIGNvbXBhdGlibGUgd2l0aCBuZXQtMy4gKi8KKy8vCQkJc2hvcnQgcGt0X2xlbiA9IGhlYWQtPm1zZ19sZW5ndGg7Ly8gJiAweGZmZjsKKwkJCXNob3J0IHBrdF9sZW4gPSAoaGVhZC0+bXNnX2xlbmd0aCAmIDB4ZmZmKSAtIDQ7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlpZiAocGt0X2xlbiA8IDYwKSB7CisJCQkJcHJpbnRrKCAiJXM6IFJ1bnQgcGFja2V0IVxuIiwgZGV2LT5uYW1lICk7CisJCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJfQorCQkJZWxzZSB7CisJCQkJc2tiID0gZGV2X2FsbG9jX3NrYiggcGt0X2xlbisyICk7CisJCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJCURQUklOVEsoIDEsICggIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsCisJCQkJCQkgICAgICBkZXYtPm5hbWUgKSk7CisJCQkJCQorCQkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCQloZWFkLT5tc2dfbGVuZ3RoID0gMDsKKwkJCQkJaGVhZC0+ZmxhZyB8PSBSTUQxX09XTl9DSElQOworCQkJCQlscC0+bmV3X3J4ID0gKGxwLT5uZXdfcngrMSkgJgorCQkJCQkgICAgIFJYX1JJTkdfTU9EX01BU0s7CisJCQkJfQorCisjaWYgMAorCQkJCWlmIChsYW5jZV9kZWJ1ZyA+PSAzKSB7CisJCQkJCXVfY2hhciAqZGF0YSA9IFBLVEJVRl9BRERSKGhlYWQpLCAqcDsKKwkJCQkJcHJpbnRrKCAiJXM6IFJYIHBrdCAlZCB0eXBlIDB4JTA0eCBmcm9tICIsIGRldi0+bmFtZSwgZW50cnksICgodV9zaG9ydCAqKWRhdGEpWzZdKTsKKwkJCQkJZm9yKCBwID0gJmRhdGFbNl0sIGkgPSAwOyBpIDwgNjsgaSsrICkKKwkJCQkJCXByaW50aygiJTAyeCVzIiwgKnArKywgaSAhPSA1ID8gIjoiIDogIiIgKTsKKwkJCQkJcHJpbnRrKCIgdG8gIik7CisJCQkJCWZvciggcCA9IGRhdGEsIGkgPSAwOyBpIDwgNjsgaSsrICkKKwkJCQkJCXByaW50aygiJTAyeCVzIiwgKnArKywgaSAhPSA1ID8gIjoiIDogIiIgKTsKKwkJCQkJcHJpbnRrKCIgZGF0YSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggIgorCQkJCQkgICAgICAgImxlbiAlZCBhdCAlMDh4XG4iLAorCQkJCQkgICAgICAgZGF0YVsxNV0sIGRhdGFbMTZdLCBkYXRhWzE3XSwgZGF0YVsxOF0sCisJCQkJCSAgICAgICBkYXRhWzE5XSwgZGF0YVsyMF0sIGRhdGFbMjFdLCBkYXRhWzIyXSwKKwkJCQkJICAgICAgIHBrdF9sZW4sIGRhdGEpOworCQkJCX0KKyNlbmRpZgorCQkJCWlmIChsYW5jZV9kZWJ1ZyA+PSAzKSB7CisJCQkJCXVfY2hhciAqZGF0YSA9IFBLVEJVRl9BRERSKGhlYWQpOworCQkJCQlwcmludGsoICIlczogUlggcGt0ICVkIHR5cGUgMHglMDR4IGxlbiAlZFxuICIsIGRldi0+bmFtZSwgZW50cnksICgodV9zaG9ydCAqKWRhdGEpWzZdLCBwa3RfbGVuKTsKKwkJCQl9CQkJCQorCisKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZSggc2tiLCAyICk7CS8qIDE2IGJ5dGUgYWxpZ24gKi8KKwkJCQlza2JfcHV0KCBza2IsIHBrdF9sZW4gKTsJLyogTWFrZSByb29tICovCisvLwkJCSAgICAgICAgbWVtY3B5KCBza2ItPmRhdGEsIFBLVEJVRl9BRERSKGhlYWQpLCBwa3RfbGVuICk7CisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCisJCQkJCQkgUEtUQlVGX0FERFIoaGVhZCksCisJCQkJCQkgcGt0X2xlbiwgMCk7CisKKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoIHNrYiwgZGV2ICk7CisJCQkJbmV0aWZfcngoIHNrYiApOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCX0KKwkJfQorCisvLwkJaGVhZC0+YnVmX2xlbmd0aCA9IC1QS1RfQlVGX1NaIHwgMHhmMDAwOworCQloZWFkLT5tc2dfbGVuZ3RoID0gMDsKKwkJaGVhZC0+ZmxhZyA9IFJNRDFfT1dOX0NISVA7CisKKwkJZW50cnkgPSBscC0+bmV3X3J4ID0gKGxwLT5uZXdfcnggKzEpICYgUlhfUklOR19NT0RfTUFTSzsKKwl9CisKKwkvKiBGcm9tIGxhbmNlLmMgKERvbmFsZCBCZWNrZXIpOiAqLworCS8qIFdlIHNob3VsZCBjaGVjayB0aGF0IGF0IGxlYXN0IHR3byByaW5nIGVudHJpZXMgYXJlIGZyZWUuCisJICAgSWYgbm90LCB3ZSBzaG91bGQgZnJlZSBvbmUgYW5kIG1hcmsgc3RhdHMtPnJ4X2Ryb3BwZWQrKy4gKi8KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbGFuY2VfY2xvc2UoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlBUkVHID0gQ1NSMDsKKworCURQUklOVEsoIDIsICggIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlMi4yeC5cbiIsCisJCQkJICBkZXYtPm5hbWUsIERSRUcgKSk7CisKKwkvKiBXZSBzdG9wIHRoZSBMQU5DRSBoZXJlIC0tIGl0IG9jY2FzaW9uYWxseSBwb2xscworCSAgIG1lbW9yeSBpZiB3ZSBkb24ndC4gKi8KKwlEUkVHID0gQ1NSMF9TVE9QOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbGFuY2VfZ2V0X3N0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgICBudW1fYWRkcnMgPT0gLTEJCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKyAgIG51bV9hZGRycyA9PSAwCQlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAgIG51bV9hZGRycyA+IDAJCU11bHRpY2FzdCBtb2RlLCByZWNlaXZlIG5vcm1hbCBhbmQgTUMgcGFja2V0cywgYW5kIGRvCisJCQkJCQliZXN0LWVmZm9ydCBmaWx0ZXJpbmcuCisgKi8KKworLyogY29tcGxldGVseSB1bnRlc3RlZCBvbiBhIHN1bjMgKi8KK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJLyogT25seSBwb3NzaWJsZSBpZiBib2FyZCBpcyBhbHJlYWR5IHN0YXJ0ZWQgKi8KKwkJcmV0dXJuOworCisJLyogV2UgdGFrZSB0aGUgc2ltcGxlIHdheSBvdXQgYW5kIGFsd2F5cyBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZS4gKi8KKwlEUkVHID0gQ1NSMF9TVE9QOyAvKiBUZW1wb3JhcmlseSBzdG9wIHRoZSBsYW5jZS4gKi8KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJLyogTG9nIGFueSBuZXQgdGFwcy4gKi8KKwkJRFBSSU5USyggMSwgKCAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSApKTsKKwkJUkVHQSggQ1NSMTUgKSA9IDB4ODAwMDsgLyogU2V0IHByb21pc2N1b3VzIG1vZGUgKi8KKwl9IGVsc2UgeworCQlzaG9ydCBtdWx0aWNhc3RfdGFibGVbNF07CisJCWludCBudW1fYWRkcnMgPSBkZXYtPm1jX2NvdW50OworCQlpbnQgaTsKKwkJLyogV2UgZG9uJ3QgdXNlIHRoZSBtdWx0aWNhc3QgdGFibGUsIGJ1dCByZWx5IG9uIHVwcGVyLWxheWVyCisJCSAqIGZpbHRlcmluZy4gKi8KKwkJbWVtc2V0KCBtdWx0aWNhc3RfdGFibGUsIChudW1fYWRkcnMgPT0gMCkgPyAwIDogLTEsCisJCQkJc2l6ZW9mKG11bHRpY2FzdF90YWJsZSkgKTsKKwkJZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApCisJCQlSRUdBKCBDU1I4K2kgKSA9IG11bHRpY2FzdF90YWJsZVtpXTsKKwkJUkVHQSggQ1NSMTUgKSA9IDA7IC8qIFVuc2V0IHByb21pc2N1b3VzIG1vZGUgKi8KKwl9CisKKwkvKgorCSAqIEFsd2F5cyBzZXQgQlNXUCBhZnRlciBhIFNUT1AgYXMgU1RPUCBwdXRzIGl0IGJhY2sgaW50bworCSAqIGxpdHRsZSBlbmRpYW4gbW9kZS4KKwkgKi8KKwlSRUdBKCBDU1IzICkgPSBDU1IzX0JTV1A7CisKKwkvKiBSZXN1bWUgbm9ybWFsIG9wZXJhdGlvbiBhbmQgcmVzZXQgQVJFRyB0byBDU1IwICovCisJUkVHQSggQ1NSMCApID0gQ1NSMF9JRE9OIHwgQ1NSMF9JTkVBIHwgQ1NSMF9TVFJUOworfQorCisKKyNpZmRlZiBNT0RVTEUKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpzdW4zbGFuY2VfZGV2OworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdW4zbGFuY2VfZGV2ID0gc3VuM2xhbmNlX3Byb2JlKC0xKTsKKwlpZiAoSVNfRVJSKHN1bjNsYW5jZV9kZXYpKQorCQlyZXR1cm4gUFRSX0VSUihzdW4zbGFuY2VfZGV2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KHN1bjNsYW5jZV9kZXYpOworI2lmZGVmIENPTkZJR19TVU4zCisJaW91bm1hcCgodm9pZCAqKXN1bjNsYW5jZV9kZXYtPmJhc2VfYWRkcik7CisjZW5kaWYKKwlmcmVlX25ldGRldihzdW4zbGFuY2VfZGV2KTsKK30KKworI2VuZGlmIC8qIE1PRFVMRSAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5ibWFjLmMgYi9kcml2ZXJzL25ldC9zdW5ibWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1ZGNkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bmJtYWMuYwpAQCAtMCwwICsxLDEzMjQgQEAKKy8qICRJZDogc3VuYm1hYy5jLHYgMS4zMCAyMDAyLzAxLzE1IDA2OjQ4OjU1IGRhdmVtIEV4cCAkCisgKiBzdW5ibWFjLmM6IERyaXZlciBmb3IgU3BhcmMgQmlnTUFDIDEwMGJhc2VUIGV0aGVybmV0IGFkYXB0ZXJzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9hdXhpby5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgorI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3NidXMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICJzdW5ibWFjLmgiCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0KKyAgICAgICAgInN1bmJtYWMuYzp2Mi4wIDI0L05vdi8wMyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pXG4iOworCisjdW5kZWYgREVCVUdfUFJPQkUKKyN1bmRlZiBERUJVR19UWAorI3VuZGVmIERFQlVHX0lSUQorCisjaWZkZWYgREVCVUdfUFJPQkUKKyNkZWZpbmUgRFAoeCkgIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBEUCh4KQorI2VuZGlmCisKKyNpZmRlZiBERUJVR19UWAorI2RlZmluZSBEVFgoeCkgIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBEVFgoeCkKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfSVJRCisjZGVmaW5lIERJUlEoeCkgIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBESVJRKHgpCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBiaWdtYWMgKnJvb3RfYmlnbWFjX2RldjsKKworI2RlZmluZSBERUZBVUxUX0pBTVNJWkUgICAgNCAvKiBUb2UgamFtICovCisKKyNkZWZpbmUgUUVDX1JFU0VUX1RSSUVTIDIwMAorCitzdGF0aWMgaW50IHFlY19nbG9iYWxfcmVzZXQodm9pZCBfX2lvbWVtICpncmVncykKK3sKKwlpbnQgdHJpZXMgPSBRRUNfUkVTRVRfVFJJRVM7CisKKwlzYnVzX3dyaXRlbChHTE9CX0NUUkxfUkVTRVQsIGdyZWdzICsgR0xPQl9DVFJMKTsKKwl3aGlsZSAoLS10cmllcykgeworCQlpZiAoc2J1c19yZWFkbChncmVncyArIEdMT0JfQ1RSTCkgJiBHTE9CX0NUUkxfUkVTRVQpIHsKKwkJCXVkZWxheSgyMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlicmVhazsKKwl9CisJaWYgKHRyaWVzKQorCQlyZXR1cm4gMDsKKwlwcmludGsoS0VSTl9FUlIgIkJpZ01BQzogQ2Fubm90IHJlc2V0IHRoZSBRRUMuXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHFlY19pbml0KHN0cnVjdCBiaWdtYWMgKmJwKQoreworCXZvaWQgX19pb21lbSAqZ3JlZ3MgPSBicC0+Z3JlZ3M7CisJc3RydWN0IHNidXNfZGV2ICpxZWNfc2RldiA9IGJwLT5xZWNfc2RldjsKKwl1OCBic2l6ZXMgPSBicC0+YmlnbWFjX2J1cnN0czsKKwl1MzIgcmVndmFsOworCisJLyogNjRieXRlIGJ1cnN0cyBkbyBub3Qgd29yayBhdCB0aGUgbW9tZW50LCBkbworCSAqIG5vdCBldmVuIHRyeSB0byBlbmFibGUgdGhlbS4gIC1EYXZlTQorCSAqLworCWlmIChic2l6ZXMgJiBETUFfQlVSU1QzMikKKwkJcmVndmFsID0gR0xPQl9DVFJMX0IzMjsKKwllbHNlCisJCXJlZ3ZhbCA9IEdMT0JfQ1RSTF9CMTY7CisJc2J1c193cml0ZWwocmVndmFsIHwgR0xPQl9DVFJMX0JNT0RFLCBncmVncyArIEdMT0JfQ1RSTCk7CisJc2J1c193cml0ZWwoR0xPQl9QU0laRV8yMDQ4LCBncmVncyArIEdMT0JfUFNJWkUpOworCisJLyogQWxsIG9mIG1lbXNpemUgaXMgZ2l2ZW4gdG8gYmlnbWFjLiAqLworCXNidXNfd3JpdGVsKHFlY19zZGV2LT5yZWdfYWRkcnNbMV0ucmVnX3NpemUsCisJCSAgICBncmVncyArIEdMT0JfTVNJWkUpOworCisJLyogSGFsZiB0byB0aGUgdHJhbnNtaXR0ZXIsIGhhbGYgdG8gdGhlIHJlY2VpdmVyLiAqLworCXNidXNfd3JpdGVsKHFlY19zZGV2LT5yZWdfYWRkcnNbMV0ucmVnX3NpemUgPj4gMSwKKwkJICAgIGdyZWdzICsgR0xPQl9UU0laRSk7CisJc2J1c193cml0ZWwocWVjX3NkZXYtPnJlZ19hZGRyc1sxXS5yZWdfc2l6ZSA+PiAxLAorCQkgICAgZ3JlZ3MgKyBHTE9CX1JTSVpFKTsKK30KKworI2RlZmluZSBUWF9SRVNFVF9UUklFUyAgICAgMzIKKyNkZWZpbmUgUlhfUkVTRVRfVFJJRVMgICAgIDMyCisKK3N0YXRpYyB2b2lkIGJpZ21hY190eF9yZXNldCh2b2lkIF9faW9tZW0gKmJyZWdzKQoreworCWludCB0cmllcyA9IFRYX1JFU0VUX1RSSUVTOworCisJc2J1c193cml0ZWwoMCwgYnJlZ3MgKyBCTUFDX1RYQ0ZHKTsKKworCS8qIFRoZSBmaWZvIHRocmVzaG9sZCBiaXQgaXMgcmVhZC1vbmx5IGFuZCBkb2VzCisJICogbm90IGNsZWFyLiAgLURhdmVNCisJICovCisJd2hpbGUgKChzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19UWENGRykgJiB+KEJJR01BQ19UWENGR19GSUZPKSkgIT0gMCAmJgorCSAgICAgICAtLXRyaWVzICE9IDApCisJCXVkZWxheSgyMCk7CisKKwlpZiAoIXRyaWVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBUcmFuc21pdHRlciB3aWxsIG5vdCByZXNldC5cbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogdHhfY2ZnIGlzICUwOHhcbiIsCisJCSAgICAgICBzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19UWENGRykpOworCX0KK30KKworc3RhdGljIHZvaWQgYmlnbWFjX3J4X3Jlc2V0KHZvaWQgX19pb21lbSAqYnJlZ3MpCit7CisJaW50IHRyaWVzID0gUlhfUkVTRVRfVFJJRVM7CisKKwlzYnVzX3dyaXRlbCgwLCBicmVncyArIEJNQUNfUlhDRkcpOworCXdoaWxlIChzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19SWENGRykgJiYgLS10cmllcykKKwkJdWRlbGF5KDIwKTsKKworCWlmICghdHJpZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IFJlY2VpdmVyIHdpbGwgbm90IHJlc2V0LlxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiByeF9jZmcgaXMgJTA4eFxuIiwKKwkJICAgICAgIHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX1JYQ0ZHKSk7CisJfQorfQorCisvKiBSZXNldCB0aGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyLiAqLworc3RhdGljIHZvaWQgYmlnbWFjX3N0b3Aoc3RydWN0IGJpZ21hYyAqYnApCit7CisJYmlnbWFjX3R4X3Jlc2V0KGJwLT5icmVncyk7CisJYmlnbWFjX3J4X3Jlc2V0KGJwLT5icmVncyk7Cit9CisKK3N0YXRpYyB2b2lkIGJpZ21hY19nZXRfY291bnRlcnMoc3RydWN0IGJpZ21hYyAqYnAsIHZvaWQgX19pb21lbSAqYnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmJwLT5lbmV0X3N0YXRzOworCisJc3RhdHMtPnJ4X2NyY19lcnJvcnMgKz0gc2J1c19yZWFkbChicmVncyArIEJNQUNfUkNSQ0VDVFIpOworCXNidXNfd3JpdGVsKDAsIGJyZWdzICsgQk1BQ19SQ1JDRUNUUik7CisKKwlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzICs9IHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX1VOQUxFQ1RSKTsKKwlzYnVzX3dyaXRlbCgwLCBicmVncyArIEJNQUNfVU5BTEVDVFIpOworCisJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgKz0gc2J1c19yZWFkbChicmVncyArIEJNQUNfR0xFQ1RSKTsKKwlzYnVzX3dyaXRlbCgwLCBicmVncyArIEJNQUNfR0xFQ1RSKTsKKworCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycyArPSBzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19FWENUUik7CisKKwlzdGF0cy0+Y29sbGlzaW9ucyArPQorCQkoc2J1c19yZWFkbChicmVncyArIEJNQUNfRVhDVFIpICsKKwkJIHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX0xUQ1RSKSk7CisJc2J1c193cml0ZWwoMCwgYnJlZ3MgKyBCTUFDX0VYQ1RSKTsKKwlzYnVzX3dyaXRlbCgwLCBicmVncyArIEJNQUNfTFRDVFIpOworfQorCitzdGF0aWMgdm9pZCBiaWdtYWNfY2xlYW5fcmluZ3Moc3RydWN0IGJpZ21hYyAqYnApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKGJwLT5yeF9za2JzW2ldICE9IE5VTEwpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KGJwLT5yeF9za2JzW2ldKTsKKwkJCWJwLT5yeF9za2JzW2ldID0gTlVMTDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoYnAtPnR4X3NrYnNbaV0gIT0gTlVMTCkgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoYnAtPnR4X3NrYnNbaV0pOworCQkJYnAtPnR4X3NrYnNbaV0gPSBOVUxMOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBiaWdtYWNfaW5pdF9yaW5ncyhzdHJ1Y3QgYmlnbWFjICpicCwgaW50IGZyb21faXJxKQoreworCXN0cnVjdCBibWFjX2luaXRfYmxvY2sgKmJiID0gYnAtPmJtYWNfYmxvY2s7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJwLT5kZXY7CisJaW50IGksIGdmcF9mbGFncyA9IEdGUF9LRVJORUw7CisKKwlpZiAoZnJvbV9pcnEgfHwgaW5faW50ZXJydXB0KCkpCisJCWdmcF9mbGFncyA9IEdGUF9BVE9NSUM7CisKKwlicC0+cnhfbmV3ID0gYnAtPnJ4X29sZCA9IGJwLT50eF9uZXcgPSBicC0+dHhfb2xkID0gMDsKKworCS8qIEZyZWUgYW55IHNraXBweSBidWZzIGxlZnQgYXJvdW5kIGluIHRoZSByaW5ncy4gKi8KKwliaWdtYWNfY2xlYW5fcmluZ3MoYnApOworCisJLyogTm93IGdldCBuZXcgc2tidWZzIGZvciB0aGUgcmVjZWl2ZSByaW5nLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXNrYiA9IGJpZ19tYWNfYWxsb2Nfc2tiKFJYX0JVRl9BTExPQ19TSVpFLCBnZnBfZmxhZ3MpOworCQlpZiAoIXNrYikKKwkJCWNvbnRpbnVlOworCisJCWJwLT5yeF9za2JzW2ldID0gc2tiOworCQlza2ItPmRldiA9IGRldjsKKworCQkvKiBCZWNhdXNlIHdlIHJlc2VydmUgYWZ0ZXJ3YXJkcy4gKi8KKwkJc2tiX3B1dChza2IsIEVUSF9GUkFNRV9MRU4pOworCQlza2JfcmVzZXJ2ZShza2IsIDM0KTsKKworCQliYi0+YmVfcnhkW2ldLnJ4X2FkZHIgPQorCQkJc2J1c19tYXBfc2luZ2xlKGJwLT5iaWdtYWNfc2Rldiwgc2tiLT5kYXRhLAorCQkJCQlSWF9CVUZfQUxMT0NfU0laRSAtIDM0LAorCQkJCQlTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJYmItPmJlX3J4ZFtpXS5yeF9mbGFncyA9CisJCQkoUlhEX09XTiB8ICgoUlhfQlVGX0FMTE9DX1NJWkUgLSAzNCkgJiBSWERfTEVOR1RIKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQliYi0+YmVfdHhkW2ldLnR4X2ZsYWdzID0gYmItPmJlX3R4ZFtpXS50eF9hZGRyID0gMDsKK30KKworI2RlZmluZSBNR01UX0NMS09OICAoTUdNVF9QQUxfSU5UX01ESU98TUdNVF9QQUxfRVhUX01ESU98TUdNVF9QQUxfT0VOQUJ8TUdNVF9QQUxfRENMT0NLKQorI2RlZmluZSBNR01UX0NMS09GRiAoTUdNVF9QQUxfSU5UX01ESU98TUdNVF9QQUxfRVhUX01ESU98TUdNVF9QQUxfT0VOQUIpCisKK3N0YXRpYyB2b2lkIGlkbGVfdHJhbnNjZWl2ZXIodm9pZCBfX2lvbWVtICp0cmVncykKK3sKKwlpbnQgaSA9IDIwOworCisJd2hpbGUgKGktLSkgeworCQlzYnVzX3dyaXRlbChNR01UX0NMS09GRiwgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c193cml0ZWwoTUdNVF9DTEtPTiwgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3RjdnJfYml0KHN0cnVjdCBiaWdtYWMgKmJwLCB2b2lkIF9faW9tZW0gKnRyZWdzLCBpbnQgYml0KQoreworCWlmIChicC0+dGN2cl90eXBlID09IGludGVybmFsKSB7CisJCWJpdCA9IChiaXQgJiAxKSA8PCAzOworCQlzYnVzX3dyaXRlbChiaXQgfCAoTUdNVF9QQUxfT0VOQUIgfCBNR01UX1BBTF9FWFRfTURJTyksCisJCQkgICAgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c193cml0ZWwoYml0IHwgTUdNVF9QQUxfT0VOQUIgfCBNR01UX1BBTF9FWFRfTURJTyB8IE1HTVRfUEFMX0RDTE9DSywKKwkJCSAgICB0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCX0gZWxzZSBpZiAoYnAtPnRjdnJfdHlwZSA9PSBleHRlcm5hbCkgeworCQliaXQgPSAoYml0ICYgMSkgPDwgMjsKKwkJc2J1c193cml0ZWwoYml0IHwgTUdNVF9QQUxfSU5UX01ESU8gfCBNR01UX1BBTF9PRU5BQiwKKwkJCSAgICB0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3dyaXRlbChiaXQgfCBNR01UX1BBTF9JTlRfTURJTyB8IE1HTVRfUEFMX09FTkFCIHwgTUdNVF9QQUxfRENMT0NLLAorCQkJICAgIHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ3cml0ZV90Y3ZyX2JpdDogTm8gdHJhbnNjZWl2ZXIgdHlwZSBrbm93biFcbiIpOworCX0KK30KKworc3RhdGljIGludCByZWFkX3RjdnJfYml0KHN0cnVjdCBiaWdtYWMgKmJwLCB2b2lkIF9faW9tZW0gKnRyZWdzKQoreworCWludCByZXR2YWwgPSAwOworCisJaWYgKGJwLT50Y3ZyX3R5cGUgPT0gaW50ZXJuYWwpIHsKKwkJc2J1c193cml0ZWwoTUdNVF9QQUxfRVhUX01ESU8sIHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfd3JpdGVsKE1HTVRfUEFMX0VYVF9NRElPIHwgTUdNVF9QQUxfRENMT0NLLAorCQkJICAgIHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJCXJldHZhbCA9IChzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKSAmIE1HTVRfUEFMX0lOVF9NRElPKSA+PiAzOworCX0gZWxzZSBpZiAoYnAtPnRjdnJfdHlwZSA9PSBleHRlcm5hbCkgeworCQlzYnVzX3dyaXRlbChNR01UX1BBTF9JTlRfTURJTywgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c193cml0ZWwoTUdNVF9QQUxfSU5UX01ESU8gfCBNR01UX1BBTF9EQ0xPQ0ssIHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJCXJldHZhbCA9IChzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKSAmIE1HTVRfUEFMX0VYVF9NRElPKSA+PiAyOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAicmVhZF90Y3ZyX2JpdDogTm8gdHJhbnNjZWl2ZXIgdHlwZSBrbm93biFcbiIpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHJlYWRfdGN2cl9iaXQyKHN0cnVjdCBiaWdtYWMgKmJwLCB2b2lkIF9faW9tZW0gKnRyZWdzKQoreworCWludCByZXR2YWwgPSAwOworCisJaWYgKGJwLT50Y3ZyX3R5cGUgPT0gaW50ZXJuYWwpIHsKKwkJc2J1c193cml0ZWwoTUdNVF9QQUxfRVhUX01ESU8sIHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJCXJldHZhbCA9IChzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKSAmIE1HTVRfUEFMX0lOVF9NRElPKSA+PiAzOworCQlzYnVzX3dyaXRlbChNR01UX1BBTF9FWFRfTURJTyB8IE1HTVRfUEFMX0RDTE9DSywgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwl9IGVsc2UgaWYgKGJwLT50Y3ZyX3R5cGUgPT0gZXh0ZXJuYWwpIHsKKwkJc2J1c193cml0ZWwoTUdNVF9QQUxfSU5UX01ESU8sIHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJCXJldHZhbCA9IChzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKSAmIE1HTVRfUEFMX0VYVF9NRElPKSA+PiAyOworCQlzYnVzX3dyaXRlbChNR01UX1BBTF9JTlRfTURJTyB8IE1HTVRfUEFMX0RDTE9DSywgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgInJlYWRfdGN2cl9iaXQyOiBObyB0cmFuc2NlaXZlciB0eXBlIGtub3duIVxuIik7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF90Y3ZyX2J5dGUoc3RydWN0IGJpZ21hYyAqYnAsCisJCQkgIHZvaWQgX19pb21lbSAqdHJlZ3MsCisJCQkgIHVuc2lnbmVkIGludCBieXRlKQoreworCWludCBzaGlmdCA9IDQ7CisKKwlkbyB7CisJCXdyaXRlX3RjdnJfYml0KGJwLCB0cmVncywgKChieXRlID4+IHNoaWZ0KSAmIDEpKTsKKwkJc2hpZnQgLT0gMTsKKwl9IHdoaWxlIChzaGlmdCA+PSAwKTsKK30KKworc3RhdGljIHZvaWQgYmlnbWFjX3RjdnJfd3JpdGUoc3RydWN0IGJpZ21hYyAqYnAsIHZvaWQgX19pb21lbSAqdHJlZ3MsCisJCQkgICAgICBpbnQgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWwpCit7CisJaW50IHNoaWZ0OworCisJcmVnICY9IDB4ZmY7CisJdmFsICY9IDB4ZmZmZjsKKwlzd2l0Y2goYnAtPnRjdnJfdHlwZSkgeworCWNhc2UgaW50ZXJuYWw6CisJY2FzZSBleHRlcm5hbDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgImJpZ21hY190Y3ZyX3JlYWQ6IFdob29wcywgbm8ga25vd24gdHJhbnNjZWl2ZXIgdHlwZS5cbiIpOworCQlyZXR1cm47CisJfTsKKworCWlkbGVfdHJhbnNjZWl2ZXIodHJlZ3MpOworCXdyaXRlX3RjdnJfYml0KGJwLCB0cmVncywgMCk7CisJd3JpdGVfdGN2cl9iaXQoYnAsIHRyZWdzLCAxKTsKKwl3cml0ZV90Y3ZyX2JpdChicCwgdHJlZ3MsIDApOworCXdyaXRlX3RjdnJfYml0KGJwLCB0cmVncywgMSk7CisKKwlwdXRfdGN2cl9ieXRlKGJwLCB0cmVncywKKwkJICAgICAgKChicC0+dGN2cl90eXBlID09IGludGVybmFsKSA/CisJCSAgICAgICBCSUdNQUNfUEhZX0lOVEVSTkFMIDogQklHTUFDX1BIWV9FWFRFUk5BTCkpOworCisJcHV0X3RjdnJfYnl0ZShicCwgdHJlZ3MsIHJlZyk7CisKKwl3cml0ZV90Y3ZyX2JpdChicCwgdHJlZ3MsIDEpOworCXdyaXRlX3RjdnJfYml0KGJwLCB0cmVncywgMCk7CisKKwlzaGlmdCA9IDE1OworCWRvIHsKKwkJd3JpdGVfdGN2cl9iaXQoYnAsIHRyZWdzLCAodmFsID4+IHNoaWZ0KSAmIDEpOworCQlzaGlmdCAtPSAxOworCX0gd2hpbGUgKHNoaWZ0ID49IDApOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmlnbWFjX3RjdnJfcmVhZChzdHJ1Y3QgYmlnbWFjICpicCwKKwkJCQkgICAgICAgdm9pZCBfX2lvbWVtICp0cmVncywKKwkJCQkgICAgICAgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBzaG9ydCByZXR2YWwgPSAwOworCisJcmVnICY9IDB4ZmY7CisJc3dpdGNoKGJwLT50Y3ZyX3R5cGUpIHsKKwljYXNlIGludGVybmFsOgorCWNhc2UgZXh0ZXJuYWw6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJiaWdtYWNfdGN2cl9yZWFkOiBXaG9vcHMsIG5vIGtub3duIHRyYW5zY2VpdmVyIHR5cGUuXG4iKTsKKwkJcmV0dXJuIDB4ZmZmZjsKKwl9OworCisJaWRsZV90cmFuc2NlaXZlcih0cmVncyk7CisJd3JpdGVfdGN2cl9iaXQoYnAsIHRyZWdzLCAwKTsKKwl3cml0ZV90Y3ZyX2JpdChicCwgdHJlZ3MsIDEpOworCXdyaXRlX3RjdnJfYml0KGJwLCB0cmVncywgMSk7CisJd3JpdGVfdGN2cl9iaXQoYnAsIHRyZWdzLCAwKTsKKworCXB1dF90Y3ZyX2J5dGUoYnAsIHRyZWdzLAorCQkgICAgICAoKGJwLT50Y3ZyX3R5cGUgPT0gaW50ZXJuYWwpID8KKwkJICAgICAgIEJJR01BQ19QSFlfSU5URVJOQUwgOiBCSUdNQUNfUEhZX0VYVEVSTkFMKSk7CisKKwlwdXRfdGN2cl9ieXRlKGJwLCB0cmVncywgcmVnKTsKKworCWlmIChicC0+dGN2cl90eXBlID09IGV4dGVybmFsKSB7CisJCWludCBzaGlmdCA9IDE1OworCisJCSh2b2lkKSByZWFkX3RjdnJfYml0MihicCwgdHJlZ3MpOworCQkodm9pZCkgcmVhZF90Y3ZyX2JpdDIoYnAsIHRyZWdzKTsKKworCQlkbyB7CisJCQlpbnQgdG1wOworCisJCQl0bXAgPSByZWFkX3RjdnJfYml0MihicCwgdHJlZ3MpOworCQkJcmV0dmFsIHw9ICgodG1wICYgMSkgPDwgc2hpZnQpOworCQkJc2hpZnQgLT0gMTsKKwkJfSB3aGlsZSAoc2hpZnQgPj0gMCk7CisKKwkJKHZvaWQpIHJlYWRfdGN2cl9iaXQyKGJwLCB0cmVncyk7CisJCSh2b2lkKSByZWFkX3RjdnJfYml0MihicCwgdHJlZ3MpOworCQkodm9pZCkgcmVhZF90Y3ZyX2JpdDIoYnAsIHRyZWdzKTsKKwl9IGVsc2UgeworCQlpbnQgc2hpZnQgPSAxNTsKKworCQkodm9pZCkgcmVhZF90Y3ZyX2JpdChicCwgdHJlZ3MpOworCQkodm9pZCkgcmVhZF90Y3ZyX2JpdChicCwgdHJlZ3MpOworCisJCWRvIHsKKwkJCWludCB0bXA7CisKKwkJCXRtcCA9IHJlYWRfdGN2cl9iaXQoYnAsIHRyZWdzKTsKKwkJCXJldHZhbCB8PSAoKHRtcCAmIDEpIDw8IHNoaWZ0KTsKKwkJCXNoaWZ0IC09IDE7CisJCX0gd2hpbGUgKHNoaWZ0ID49IDApOworCisJCSh2b2lkKSByZWFkX3RjdnJfYml0KGJwLCB0cmVncyk7CisJCSh2b2lkKSByZWFkX3RjdnJfYml0KGJwLCB0cmVncyk7CisJCSh2b2lkKSByZWFkX3RjdnJfYml0KGJwLCB0cmVncyk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGJpZ21hY190Y3ZyX2luaXQoc3RydWN0IGJpZ21hYyAqYnApCit7CisJdm9pZCBfX2lvbWVtICp0cmVncyA9IGJwLT50cmVnczsKKwl1MzIgbXBhbDsKKworCWlkbGVfdHJhbnNjZWl2ZXIodHJlZ3MpOworCXNidXNfd3JpdGVsKE1HTVRfUEFMX0lOVF9NRElPIHwgTUdNVF9QQUxfRVhUX01ESU8gfCBNR01UX1BBTF9EQ0xPQ0ssCisJCSAgICB0cmVncyArIFRDVlJfTVBBTCk7CisJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisKKwkvKiBPbmx5IHRoZSBiaXQgZm9yIHRoZSBwcmVzZW50IHRyYW5zY2VpdmVyIChpbnRlcm5hbCBvcgorCSAqIGV4dGVybmFsKSB3aWxsIHN0aWNrLCBzZXQgdGhlbSBib3RoIGFuZCBzZWUgd2hhdCBzdGF5cy4KKwkgKi8KKwlzYnVzX3dyaXRlbChNR01UX1BBTF9JTlRfTURJTyB8IE1HTVRfUEFMX0VYVF9NRElPLCB0cmVncyArIFRDVlJfTVBBTCk7CisJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJdWRlbGF5KDIwKTsKKworCW1wYWwgPSBzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwlpZiAobXBhbCAmIE1HTVRfUEFMX0VYVF9NRElPKSB7CisJCWJwLT50Y3ZyX3R5cGUgPSBleHRlcm5hbDsKKwkJc2J1c193cml0ZWwofihUQ1ZSX1BBTF9FWFRMQkFDSyB8IFRDVlJfUEFMX01TRU5TRSB8IFRDVlJfUEFMX0xURU5BQkxFKSwKKwkJCSAgICB0cmVncyArIFRDVlJfVFBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX1RQQUwpOworCX0gZWxzZSBpZiAobXBhbCAmIE1HTVRfUEFMX0lOVF9NRElPKSB7CisJCWJwLT50Y3ZyX3R5cGUgPSBpbnRlcm5hbDsKKwkJc2J1c193cml0ZWwofihUQ1ZSX1BBTF9TRVJJQUwgfCBUQ1ZSX1BBTF9FWFRMQkFDSyB8CisJCQkgICAgICBUQ1ZSX1BBTF9NU0VOU0UgfCBUQ1ZSX1BBTF9MVEVOQUJMRSksCisJCQkgICAgdHJlZ3MgKyBUQ1ZSX1RQQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9UUEFMKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogQUlFRUUsIG5laXRoZXIgaW50ZXJuYWwgbm9yICIKKwkJICAgICAgICJleHRlcm5hbCBNRElPIGF2YWlsYWJsZSFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogbWdtdF9wYWxbJTA4eF0gdGN2cl9wYWxbJTA4eF1cbiIsCisJCSAgICAgICBzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKSwKKwkJICAgICAgIHNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX1RQQUwpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYmlnbWFjX2luaXQoc3RydWN0IGJpZ21hYyAqLCBpbnQpOworCitzdGF0aWMgaW50IHRyeV9uZXh0X3Blcm11dGF0aW9uKHN0cnVjdCBiaWdtYWMgKmJwLCB2b2lkIF9faW9tZW0gKnRyZWdzKQoreworCWlmIChicC0+c3dfYm1jciAmIEJNQ1JfU1BFRUQxMDApIHsKKwkJaW50IHRpbWVvdXQ7CisKKwkJLyogUmVzZXQgdGhlIFBIWS4gKi8KKwkJYnAtPnN3X2JtY3IJPSAoQk1DUl9JU09MQVRFIHwgQk1DUl9QRE9XTiB8IEJNQ1JfTE9PUEJBQ0spOworCQliaWdtYWNfdGN2cl93cml0ZShicCwgdHJlZ3MsIEJJR01BQ19CTUNSLCBicC0+c3dfYm1jcik7CisJCWJwLT5zd19ibWNyCT0gKEJNQ1JfUkVTRVQpOworCQliaWdtYWNfdGN2cl93cml0ZShicCwgdHJlZ3MsIEJJR01BQ19CTUNSLCBicC0+c3dfYm1jcik7CisKKwkJdGltZW91dCA9IDY0OworCQl3aGlsZSAoLS10aW1lb3V0KSB7CisJCQlicC0+c3dfYm1jciA9IGJpZ21hY190Y3ZyX3JlYWQoYnAsIHRyZWdzLCBCSUdNQUNfQk1DUik7CisJCQlpZiAoKGJwLT5zd19ibWNyICYgQk1DUl9SRVNFVCkgPT0gMCkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgyMCk7CisJCX0KKwkJaWYgKHRpbWVvdXQgPT0gMCkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBIWSByZXNldCBmYWlsZWQuXG4iLCBicC0+ZGV2LT5uYW1lKTsKKworCQlicC0+c3dfYm1jciA9IGJpZ21hY190Y3ZyX3JlYWQoYnAsIHRyZWdzLCBCSUdNQUNfQk1DUik7CisKKwkJLyogTm93IHdlIHRyeSAxMGJhc2VULiAqLworCQlicC0+c3dfYm1jciAmPSB+KEJNQ1JfU1BFRUQxMDApOworCQliaWdtYWNfdGN2cl93cml0ZShicCwgdHJlZ3MsIEJJR01BQ19CTUNSLCBicC0+c3dfYm1jcik7CisJCXJldHVybiAwOworCX0KKworCS8qIFdlJ3ZlIHRyaWVkIHRoZW0gYWxsLiAqLworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgYmlnbWFjX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgYmlnbWFjICpicCA9IChzdHJ1Y3QgYmlnbWFjICopIGRhdGE7CisJdm9pZCBfX2lvbWVtICp0cmVncyA9IGJwLT50cmVnczsKKwlpbnQgcmVzdGFydF90aW1lciA9IDA7CisKKwlicC0+dGltZXJfdGlja3MrKzsKKwlpZiAoYnAtPnRpbWVyX3N0YXRlID09IGx0cnl3YWl0KSB7CisJCWJwLT5zd19ibXNyID0gYmlnbWFjX3RjdnJfcmVhZChicCwgdHJlZ3MsIEJJR01BQ19CTVNSKTsKKwkJYnAtPnN3X2JtY3IgPSBiaWdtYWNfdGN2cl9yZWFkKGJwLCB0cmVncywgQklHTUFDX0JNQ1IpOworCQlpZiAoYnAtPnN3X2Jtc3IgJiBCTVNSX0xTVEFUVVMpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGlzIG5vdyB1cCBhdCAlcy5cbiIsCisJCQkgICAgICAgYnAtPmRldi0+bmFtZSwKKwkJCSAgICAgICAoYnAtPnN3X2JtY3IgJiBCTUNSX1NQRUVEMTAwKSA/CisJCQkgICAgICAgIjEwMGJhc2VUIiA6ICIxMGJhc2VUIik7CisJCQlicC0+dGltZXJfc3RhdGUgPSBhc2xlZXA7CisJCQlyZXN0YXJ0X3RpbWVyID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChicC0+dGltZXJfdGlja3MgPj0gNCkgeworCQkJCWludCByZXQ7CisKKwkJCQlyZXQgPSB0cnlfbmV4dF9wZXJtdXRhdGlvbihicCwgdHJlZ3MpOworCQkJCWlmIChyZXQgPT0gLTEpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTGluayBkb3duLCBjYWJsZSBwcm9ibGVtP1xuIiwKKwkJCQkJICAgICAgIGJwLT5kZXYtPm5hbWUpOworCQkJCQlyZXQgPSBiaWdtYWNfaW5pdChicCwgMCk7CisJCQkJCWlmIChyZXQpIHsKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yLCBjYW5ub3QgcmUtaW5pdCB0aGUgIgorCQkJCQkJICAgICAgICJCaWdNQUMuXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJCQkJfQorCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWJwLT50aW1lcl90aWNrcyA9IDA7CisJCQkJcmVzdGFydF90aW1lciA9IDE7CisJCQl9IGVsc2UgeworCQkJCXJlc3RhcnRfdGltZXIgPSAxOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogQ2FuJ3QgaGFwcGVucy4uLi4gKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQWllZWUsIGxpbmsgdGltZXIgaXMgYXNsZWVwIGJ1dCB3ZSBnb3Qgb25lIGFueXdheXMhXG4iLAorCQkgICAgICAgYnAtPmRldi0+bmFtZSk7CisJCXJlc3RhcnRfdGltZXIgPSAwOworCQlicC0+dGltZXJfdGlja3MgPSAwOworCQlicC0+dGltZXJfc3RhdGUgPSBhc2xlZXA7IC8qIGZvbyBvbiB5b3UgKi8KKwl9CisKKwlpZiAocmVzdGFydF90aW1lciAhPSAwKSB7CisJCWJwLT5iaWdtYWNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoKDEyICogSFopLzEwKTsgLyogMS4yIHNlYy4gKi8KKwkJYWRkX3RpbWVyKCZicC0+YmlnbWFjX3RpbWVyKTsKKwl9Cit9CisKKy8qIFdlbGwsIHJlYWxseSB3ZSBqdXN0IGZvcmNlIHRoZSBjaGlwIGludG8gMTAwYmFzZVQgdGhlbgorICogMTBiYXNlVCwgZWFjaCB0aW1lIGNoZWNraW5nIGZvciBhIGxpbmsgc3RhdHVzLgorICovCitzdGF0aWMgdm9pZCBiaWdtYWNfYmVnaW5fYXV0b19uZWdvdGlhdGlvbihzdHJ1Y3QgYmlnbWFjICpicCkKK3sKKwl2b2lkIF9faW9tZW0gKnRyZWdzID0gYnAtPnRyZWdzOworCWludCB0aW1lb3V0OworCisJLyogR3JhYiBuZXcgc29mdHdhcmUgY29waWVzIG9mIFBIWSByZWdpc3RlcnMuICovCisJYnAtPnN3X2Jtc3IJPSBiaWdtYWNfdGN2cl9yZWFkKGJwLCB0cmVncywgQklHTUFDX0JNU1IpOworCWJwLT5zd19ibWNyCT0gYmlnbWFjX3RjdnJfcmVhZChicCwgdHJlZ3MsIEJJR01BQ19CTUNSKTsKKworCS8qIFJlc2V0IHRoZSBQSFkuICovCisJYnAtPnN3X2JtY3IJPSAoQk1DUl9JU09MQVRFIHwgQk1DUl9QRE9XTiB8IEJNQ1JfTE9PUEJBQ0spOworCWJpZ21hY190Y3ZyX3dyaXRlKGJwLCB0cmVncywgQklHTUFDX0JNQ1IsIGJwLT5zd19ibWNyKTsKKwlicC0+c3dfYm1jcgk9IChCTUNSX1JFU0VUKTsKKwliaWdtYWNfdGN2cl93cml0ZShicCwgdHJlZ3MsIEJJR01BQ19CTUNSLCBicC0+c3dfYm1jcik7CisKKwl0aW1lb3V0ID0gNjQ7CisJd2hpbGUgKC0tdGltZW91dCkgeworCQlicC0+c3dfYm1jciA9IGJpZ21hY190Y3ZyX3JlYWQoYnAsIHRyZWdzLCBCSUdNQUNfQk1DUik7CisJCWlmICgoYnAtPnN3X2JtY3IgJiBCTUNSX1JFU0VUKSA9PSAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgyMCk7CisJfQorCWlmICh0aW1lb3V0ID09IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBIWSByZXNldCBmYWlsZWQuXG4iLCBicC0+ZGV2LT5uYW1lKTsKKworCWJwLT5zd19ibWNyID0gYmlnbWFjX3RjdnJfcmVhZChicCwgdHJlZ3MsIEJJR01BQ19CTUNSKTsKKworCS8qIEZpcnN0IHdlIHRyeSAxMDBiYXNlVC4gKi8KKwlicC0+c3dfYm1jciB8PSBCTUNSX1NQRUVEMTAwOworCWJpZ21hY190Y3ZyX3dyaXRlKGJwLCB0cmVncywgQklHTUFDX0JNQ1IsIGJwLT5zd19ibWNyKTsKKworCWJwLT50aW1lcl9zdGF0ZSA9IGx0cnl3YWl0OworCWJwLT50aW1lcl90aWNrcyA9IDA7CisJYnAtPmJpZ21hY190aW1lci5leHBpcmVzID0gamlmZmllcyArICgxMiAqIEhaKSAvIDEwOworCWJwLT5iaWdtYWNfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBicDsKKwlicC0+YmlnbWFjX3RpbWVyLmZ1bmN0aW9uID0gJmJpZ21hY190aW1lcjsKKwlhZGRfdGltZXIoJmJwLT5iaWdtYWNfdGltZXIpOworfQorCitzdGF0aWMgaW50IGJpZ21hY19pbml0KHN0cnVjdCBiaWdtYWMgKmJwLCBpbnQgZnJvbV9pcnEpCit7CisJdm9pZCBfX2lvbWVtICpncmVncyAgICAgICAgPSBicC0+Z3JlZ3M7CisJdm9pZCBfX2lvbWVtICpjcmVncyAgICAgICAgPSBicC0+Y3JlZzsKKwl2b2lkIF9faW9tZW0gKmJyZWdzICAgICAgICA9IGJwLT5icmVnczsKKwl1bnNpZ25lZCBjaGFyICplID0gJmJwLT5kZXYtPmRldl9hZGRyWzBdOworCisJLyogTGF0Y2ggY3VycmVudCBjb3VudGVycyBpbnRvIHN0YXRpc3RpY3MuICovCisJYmlnbWFjX2dldF9jb3VudGVycyhicCwgYnJlZ3MpOworCisJLyogUmVzZXQgUUVDLiAqLworCXFlY19nbG9iYWxfcmVzZXQoZ3JlZ3MpOworCisJLyogSW5pdCBRRUMuICovCisJcWVjX2luaXQoYnApOworCisJLyogQWxsb2MgYW5kIHJlc2V0IHRoZSB0eC9yeCBkZXNjcmlwdG9yIGNoYWlucy4gKi8KKwliaWdtYWNfaW5pdF9yaW5ncyhicCwgZnJvbV9pcnEpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgUEhZLiAqLworCWJpZ21hY190Y3ZyX2luaXQoYnApOworCisJLyogU3RvcCB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIuICovCisJYmlnbWFjX3N0b3AoYnApOworCisJLyogU2V0IGhhcmR3YXJlIGV0aGVybmV0IGFkZHJlc3MuICovCisJc2J1c193cml0ZWwoKChlWzRdIDw8IDgpIHwgZVs1XSksIGJyZWdzICsgQk1BQ19NQUNBRERSMik7CisJc2J1c193cml0ZWwoKChlWzJdIDw8IDgpIHwgZVszXSksIGJyZWdzICsgQk1BQ19NQUNBRERSMSk7CisJc2J1c193cml0ZWwoKChlWzBdIDw8IDgpIHwgZVsxXSksIGJyZWdzICsgQk1BQ19NQUNBRERSMCk7CisKKwkvKiBDbGVhciB0aGUgaGFzaCB0YWJsZSB1bnRpbCBtYyB1cGxvYWQgb2NjdXJzLiAqLworCXNidXNfd3JpdGVsKDAsIGJyZWdzICsgQk1BQ19IVEFCTEUzKTsKKwlzYnVzX3dyaXRlbCgwLCBicmVncyArIEJNQUNfSFRBQkxFMik7CisJc2J1c193cml0ZWwoMCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTEpOworCXNidXNfd3JpdGVsKDAsIGJyZWdzICsgQk1BQ19IVEFCTEUwKTsKKworCS8qIEVuYWJsZSBCaWcgTWFjIGhhc2ggdGFibGUgZmlsdGVyLiAqLworCXNidXNfd3JpdGVsKEJJR01BQ19SWENGR19IRU5BQkxFIHwgQklHTUFDX1JYQ0ZHX0ZJRk8sCisJCSAgICBicmVncyArIEJNQUNfUlhDRkcpOworCXVkZWxheSgyMCk7CisKKwkvKiBPaywgY29uZmlndXJlIHRoZSBCaWcgTWFjIHRyYW5zbWl0dGVyLiAqLworCXNidXNfd3JpdGVsKEJJR01BQ19UWENGR19GSUZPLCBicmVncyArIEJNQUNfVFhDRkcpOworCisJLyogVGhlIEhNRSBkb2NzIHJlY29tbWVuZCB0byB1c2UgdGhlIDEwTFNCIG9mIG91ciBNQUMgaGVyZS4gKi8KKwlzYnVzX3dyaXRlbCgoKGVbNV0gfCBlWzRdIDw8IDgpICYgMHgzZmYpLAorCQkgICAgYnJlZ3MgKyBCTUFDX1JTRUVEKTsKKworCS8qIEVuYWJsZSB0aGUgb3V0cHV0IGRyaXZlcnMgbm8gbWF0dGVyIHdoYXQuICovCisJc2J1c193cml0ZWwoQklHTUFDX1hDRkdfT0RFTkFCTEUgfCBCSUdNQUNfWENGR19SRVNWLAorCQkgICAgYnJlZ3MgKyBCTUFDX1hJRkNGRyk7CisKKwkvKiBUZWxsIHRoZSBRRUMgd2hlcmUgdGhlIHJpbmcgZGVzY3JpcHRvcnMgYXJlLiAqLworCXNidXNfd3JpdGVsKGJwLT5iYmxvY2tfZHZtYSArIGJpYl9vZmZzZXQoYmVfcnhkLCAwKSwKKwkJICAgIGNyZWdzICsgQ1JFR19SWERTKTsKKwlzYnVzX3dyaXRlbChicC0+YmJsb2NrX2R2bWEgKyBiaWJfb2Zmc2V0KGJlX3R4ZCwgMCksCisJCSAgICBjcmVncyArIENSRUdfVFhEUyk7CisKKwkvKiBTZXR1cCB0aGUgRklGTyBwb2ludGVycyBpbnRvIFFFQyBsb2NhbCBtZW1vcnkuICovCisJc2J1c193cml0ZWwoMCwgY3JlZ3MgKyBDUkVHX1JYUkJVRlBUUik7CisJc2J1c193cml0ZWwoMCwgY3JlZ3MgKyBDUkVHX1JYV0JVRlBUUik7CisJc2J1c193cml0ZWwoc2J1c19yZWFkbChncmVncyArIEdMT0JfUlNJWkUpLAorCQkgICAgY3JlZ3MgKyBDUkVHX1RYUkJVRlBUUik7CisJc2J1c193cml0ZWwoc2J1c19yZWFkbChncmVncyArIEdMT0JfUlNJWkUpLAorCQkgICAgY3JlZ3MgKyBDUkVHX1RYV0JVRlBUUik7CisKKwkvKiBUZWxsIGJpZ21hYyB3aGF0IGludGVycnVwdHMgd2UgZG9uJ3Qgd2FudCB0byBoZWFyIGFib3V0LiAqLworCXNidXNfd3JpdGVsKEJJR01BQ19JTUFTS19HT1RGUkFNRSB8IEJJR01BQ19JTUFTS19TRU5URlJBTUUsCisJCSAgICBicmVncyArIEJNQUNfSU1BU0spOworCisJLyogRW5hYmxlIHRoZSB2YXJpb3VzIG90aGVyIGlycSdzLiAqLworCXNidXNfd3JpdGVsKDAsIGNyZWdzICsgQ1JFR19SSU1BU0spOworCXNidXNfd3JpdGVsKDAsIGNyZWdzICsgQ1JFR19USU1BU0spOworCXNidXNfd3JpdGVsKDAsIGNyZWdzICsgQ1JFR19RTUFTSyk7CisJc2J1c193cml0ZWwoMCwgY3JlZ3MgKyBDUkVHX0JNQVNLKTsKKworCS8qIFNldCBqYW0gc2l6ZSB0byBhIHJlYXNvbmFibGUgZGVmYXVsdC4gKi8KKwlzYnVzX3dyaXRlbChERUZBVUxUX0pBTVNJWkUsIGJyZWdzICsgQk1BQ19KU0laRSk7CisKKwkvKiBDbGVhciBjb2xsaXNpb24gY291bnRlci4gKi8KKwlzYnVzX3dyaXRlbCgwLCBjcmVncyArIENSRUdfQ0NOVCk7CisKKwkvKiBFbmFibGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyLiAqLworCXNidXNfd3JpdGVsKHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX1RYQ0ZHKSB8IEJJR01BQ19UWENGR19FTkFCTEUsCisJCSAgICBicmVncyArIEJNQUNfVFhDRkcpOworCXNidXNfd3JpdGVsKHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX1JYQ0ZHKSB8IEJJR01BQ19SWENGR19FTkFCTEUsCisJCSAgICBicmVncyArIEJNQUNfUlhDRkcpOworCisJLyogT2ssIHN0YXJ0IGRldGVjdGluZyBsaW5rIHNwZWVkL2R1cGxleC4gKi8KKwliaWdtYWNfYmVnaW5fYXV0b19uZWdvdGlhdGlvbihicCk7CisKKwkvKiBTdWNjZXNzLiAqLworCXJldHVybiAwOworfQorCisvKiBFcnJvciBpbnRlcnJ1cHRzIGdldCBzZW50IGhlcmUuICovCitzdGF0aWMgdm9pZCBiaWdtYWNfaXNfbWVkaXVtX3JhcmUoc3RydWN0IGJpZ21hYyAqYnAsIHUzMiBxZWNfc3RhdHVzLCB1MzIgYm1hY19zdGF0dXMpCit7CisJcHJpbnRrKEtFUk5fRVJSICJiaWdtYWNfaXNfbWVkaXVtX3JhcmU6ICIpOworCWlmIChxZWNfc3RhdHVzICYgKEdMT0JfU1RBVF9FUiB8IEdMT0JfU1RBVF9CTSkpIHsKKwkJaWYgKHFlY19zdGF0dXMgJiBHTE9CX1NUQVRfRVIpCisJCQlwcmludGsoIlFFQ19FUlJPUiwgIik7CisJCWlmIChxZWNfc3RhdHVzICYgR0xPQl9TVEFUX0JNKQorCQkJcHJpbnRrKCJRRUNfQk1BQ19FUlJPUiwgIik7CisJfQorCWlmIChibWFjX3N0YXR1cyAmIENSRUdfU1RBVF9FUlJPUlMpIHsKKwkJaWYgKGJtYWNfc3RhdHVzICYgQ1JFR19TVEFUX0JFUlJPUikKKwkJCXByaW50aygiQk1BQ19FUlJPUiwgIik7CisJCWlmIChibWFjX3N0YXR1cyAmIENSRUdfU1RBVF9UWERFUlJPUikKKwkJCXByaW50aygiVFhEX0VSUk9SLCAiKTsKKwkJaWYgKGJtYWNfc3RhdHVzICYgQ1JFR19TVEFUX1RYTEVSUikKKwkJCXByaW50aygiVFhfTEFURV9FUlJPUiwgIik7CisJCWlmIChibWFjX3N0YXR1cyAmIENSRUdfU1RBVF9UWFBFUlIpCisJCQlwcmludGsoIlRYX1BBUklUWV9FUlJPUiwgIik7CisJCWlmIChibWFjX3N0YXR1cyAmIENSRUdfU1RBVF9UWFNFUlIpCisJCQlwcmludGsoIlRYX1NCVVNfRVJST1IsICIpOworCisJCWlmIChibWFjX3N0YXR1cyAmIENSRUdfU1RBVF9SWERST1ApCisJCQlwcmludGsoIlJYX0RST1BfRVJST1IsICIpOworCisJCWlmIChibWFjX3N0YXR1cyAmIENSRUdfU1RBVF9SWFNNQUxMKQorCQkJcHJpbnRrKCJSWF9TTUFMTF9FUlJPUiwgIik7CisJCWlmIChibWFjX3N0YXR1cyAmIENSRUdfU1RBVF9SWExFUlIpCisJCQlwcmludGsoIlJYX0xBVEVfRVJST1IsICIpOworCQlpZiAoYm1hY19zdGF0dXMgJiBDUkVHX1NUQVRfUlhQRVJSKQorCQkJcHJpbnRrKCJSWF9QQVJJVFlfRVJST1IsICIpOworCQlpZiAoYm1hY19zdGF0dXMgJiBDUkVHX1NUQVRfUlhTRVJSKQorCQkJcHJpbnRrKCJSWF9TQlVTX0VSUk9SLCAiKTsKKwl9CisKKwlwcmludGsoIiBSRVNFVFxuIik7CisJYmlnbWFjX2luaXQoYnAsIDEpOworfQorCisvKiBCaWdNQUMgdHJhbnNtaXQgY29tcGxldGUgc2VydmljZSByb3V0aW5lcy4gKi8KK3N0YXRpYyB2b2lkIGJpZ21hY190eChzdHJ1Y3QgYmlnbWFjICpicCkKK3sKKwlzdHJ1Y3QgYmVfdHhkICp0eGJhc2UgPSAmYnAtPmJtYWNfYmxvY2stPmJlX3R4ZFswXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYnAtPmRldjsKKwlpbnQgZWxlbTsKKworCXNwaW5fbG9jaygmYnAtPmxvY2spOworCisJZWxlbSA9IGJwLT50eF9vbGQ7CisJRFRYKCgiYmlnbWFjX3R4OiB0eF9vbGRbJWRdICIsIGVsZW0pKTsKKwl3aGlsZSAoZWxlbSAhPSBicC0+dHhfbmV3KSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXN0cnVjdCBiZV90eGQgKnRoaXMgPSAmdHhiYXNlW2VsZW1dOworCisJCURUWCgoInRoaXMoJXApIFtmbGFncyglMDh4KWFkZHIoJTA4eCldIiwKKwkJICAgICB0aGlzLCB0aGlzLT50eF9mbGFncywgdGhpcy0+dHhfYWRkcikpOworCisJCWlmICh0aGlzLT50eF9mbGFncyAmIFRYRF9PV04pCisJCQlicmVhazsKKwkJc2tiID0gYnAtPnR4X3NrYnNbZWxlbV07CisJCWJwLT5lbmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKKwkJYnAtPmVuZXRfc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCXNidXNfdW5tYXBfc2luZ2xlKGJwLT5iaWdtYWNfc2RldiwKKwkJCQkgIHRoaXMtPnR4X2FkZHIsIHNrYi0+bGVuLAorCQkJCSAgU0JVU19ETUFfVE9ERVZJQ0UpOworCisJCURUWCgoInNrYiglcCkgIiwgc2tiKSk7CisJCWJwLT50eF9za2JzW2VsZW1dID0gTlVMTDsKKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKworCQllbGVtID0gTkVYVF9UWChlbGVtKTsKKwl9CisJRFRYKCgiIERPTkUsIHR4X29sZD0lZFxuIiwgZWxlbSkpOworCWJwLT50eF9vbGQgPSBlbGVtOworCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCSAgICBUWF9CVUZGU19BVkFJTChicCkgPiAwKQorCQluZXRpZl93YWtlX3F1ZXVlKGJwLT5kZXYpOworCisJc3Bpbl91bmxvY2soJmJwLT5sb2NrKTsKK30KKworLyogQmlnTUFDIHJlY2VpdmUgY29tcGxldGUgc2VydmljZSByb3V0aW5lcy4gKi8KK3N0YXRpYyB2b2lkIGJpZ21hY19yeChzdHJ1Y3QgYmlnbWFjICpicCkKK3sKKwlzdHJ1Y3QgYmVfcnhkICpyeGJhc2UgPSAmYnAtPmJtYWNfYmxvY2stPmJlX3J4ZFswXTsKKwlzdHJ1Y3QgYmVfcnhkICp0aGlzOworCWludCBlbGVtID0gYnAtPnJ4X25ldywgZHJvcHMgPSAwOworCXUzMiBmbGFnczsKKworCXRoaXMgPSAmcnhiYXNlW2VsZW1dOworCXdoaWxlICghKChmbGFncyA9IHRoaXMtPnJ4X2ZsYWdzKSAmIFJYRF9PV04pKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWludCBsZW4gPSAoZmxhZ3MgJiBSWERfTEVOR1RIKTsgLyogRkNTIG5vdCBpbmNsdWRlZCAqLworCisJCS8qIENoZWNrIGZvciBlcnJvcnMuICovCisJCWlmIChsZW4gPCBFVEhfWkxFTikgeworCQkJYnAtPmVuZXRfc3RhdHMucnhfZXJyb3JzKys7CisJCQlicC0+ZW5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisKKwlkcm9wX2l0OgorCQkJLyogUmV0dXJuIGl0IHRvIHRoZSBCaWdNQUMuICovCisJCQlicC0+ZW5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCQl0aGlzLT5yeF9mbGFncyA9CisJCQkJKFJYRF9PV04gfCAoKFJYX0JVRl9BTExPQ19TSVpFIC0gMzQpICYgUlhEX0xFTkdUSCkpOworCQkJZ290byBuZXh0OworCQl9CisJCXNrYiA9IGJwLT5yeF9za2JzW2VsZW1dOworCQlpZiAobGVuID4gUlhfQ09QWV9USFJFU0hPTEQpIHsKKwkJCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCisJCQkvKiBOb3cgcmVmaWxsIHRoZSBlbnRyeSwgaWYgd2UgY2FuLiAqLworCQkJbmV3X3NrYiA9IGJpZ19tYWNfYWxsb2Nfc2tiKFJYX0JVRl9BTExPQ19TSVpFLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChuZXdfc2tiID09IE5VTEwpIHsKKwkJCQlkcm9wcysrOworCQkJCWdvdG8gZHJvcF9pdDsKKwkJCX0KKwkJCXNidXNfdW5tYXBfc2luZ2xlKGJwLT5iaWdtYWNfc2RldiwKKwkJCQkJICB0aGlzLT5yeF9hZGRyLAorCQkJCQkgIFJYX0JVRl9BTExPQ19TSVpFIC0gMzQsCisJCQkJCSAgU0JVU19ETUFfRlJPTURFVklDRSk7CisJCQlicC0+cnhfc2tic1tlbGVtXSA9IG5ld19za2I7CisJCQluZXdfc2tiLT5kZXYgPSBicC0+ZGV2OworCQkJc2tiX3B1dChuZXdfc2tiLCBFVEhfRlJBTUVfTEVOKTsKKwkJCXNrYl9yZXNlcnZlKG5ld19za2IsIDM0KTsKKwkJCXRoaXMtPnJ4X2FkZHIgPSBzYnVzX21hcF9zaW5nbGUoYnAtPmJpZ21hY19zZGV2LAorCQkJCQkJCW5ld19za2ItPmRhdGEsCisJCQkJCQkJUlhfQlVGX0FMTE9DX1NJWkUgLSAzNCwKKwkJCQkJCQlTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJCXRoaXMtPnJ4X2ZsYWdzID0KKwkJCQkoUlhEX09XTiB8ICgoUlhfQlVGX0FMTE9DX1NJWkUgLSAzNCkgJiBSWERfTEVOR1RIKSk7CisKKwkJCS8qIFRyaW0gdGhlIG9yaWdpbmFsIHNrYiBmb3IgdGhlIG5ldGlmLiAqLworCQkJc2tiX3RyaW0oc2tiLCBsZW4pOworCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKmNvcHlfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAyKTsKKworCQkJaWYgKGNvcHlfc2tiID09IE5VTEwpIHsKKwkJCQlkcm9wcysrOworCQkJCWdvdG8gZHJvcF9pdDsKKwkJCX0KKwkJCWNvcHlfc2tiLT5kZXYgPSBicC0+ZGV2OworCQkJc2tiX3Jlc2VydmUoY29weV9za2IsIDIpOworCQkJc2tiX3B1dChjb3B5X3NrYiwgbGVuKTsKKwkJCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoYnAtPmJpZ21hY19zZGV2LAorCQkJCQkJICAgICB0aGlzLT5yeF9hZGRyLCBsZW4sCisJCQkJCQkgICAgIFNCVVNfRE1BX0ZST01ERVZJQ0UpOworCQkJZXRoX2NvcHlfYW5kX3N1bShjb3B5X3NrYiwgKHVuc2lnbmVkIGNoYXIgKilza2ItPmRhdGEsIGxlbiwgMCk7CisJCQlzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGJwLT5iaWdtYWNfc2RldiwKKwkJCQkJCQl0aGlzLT5yeF9hZGRyLCBsZW4sCisJCQkJCQkJU0JVU19ETUFfRlJPTURFVklDRSk7CisKKwkJCS8qIFJldXNlIG9yaWdpbmFsIHJpbmcgYnVmZmVyLiAqLworCQkJdGhpcy0+cnhfZmxhZ3MgPQorCQkJCShSWERfT1dOIHwgKChSWF9CVUZfQUxMT0NfU0laRSAtIDM0KSAmIFJYRF9MRU5HVEgpKTsKKworCQkJc2tiID0gY29weV9za2I7CisJCX0KKworCQkvKiBObyBjaGVja3N1bXMgZG9uZSBieSB0aGUgQmlnTUFDIDstKCAqLworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBicC0+ZGV2KTsKKwkJbmV0aWZfcngoc2tiKTsKKwkJYnAtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCWJwLT5lbmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKKwkJYnAtPmVuZXRfc3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCW5leHQ6CisJCWVsZW0gPSBORVhUX1JYKGVsZW0pOworCQl0aGlzID0gJnJ4YmFzZVtlbGVtXTsKKwl9CisJYnAtPnJ4X25ldyA9IGVsZW07CisJaWYgKGRyb3BzKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsIGJwLT5kZXYtPm5hbWUpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYmlnbWFjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBiaWdtYWMgKmJwID0gKHN0cnVjdCBiaWdtYWMgKikgZGV2X2lkOworCXUzMiBxZWNfc3RhdHVzLCBibWFjX3N0YXR1czsKKworCURJUlEoKCJiaWdtYWNfaW50ZXJydXB0OiAiKSk7CisKKwkvKiBMYXRjaCBzdGF0dXMgcmVnaXN0ZXJzIG5vdy4gKi8KKwlibWFjX3N0YXR1cyA9IHNidXNfcmVhZGwoYnAtPmNyZWcgKyBDUkVHX1NUQVQpOworCXFlY19zdGF0dXMgPSBzYnVzX3JlYWRsKGJwLT5ncmVncyArIEdMT0JfU1RBVCk7CisKKwlESVJRKCgicWVjX3N0YXR1cz0lMDh4IGJtYWNfc3RhdHVzPSUwOHhcbiIsIHFlY19zdGF0dXMsIGJtYWNfc3RhdHVzKSk7CisJaWYgKChxZWNfc3RhdHVzICYgKEdMT0JfU1RBVF9FUiB8IEdMT0JfU1RBVF9CTSkpIHx8CisJICAgKGJtYWNfc3RhdHVzICYgQ1JFR19TVEFUX0VSUk9SUykpCisJCWJpZ21hY19pc19tZWRpdW1fcmFyZShicCwgcWVjX3N0YXR1cywgYm1hY19zdGF0dXMpOworCisJaWYgKGJtYWNfc3RhdHVzICYgQ1JFR19TVEFUX1RYSVJRKQorCQliaWdtYWNfdHgoYnApOworCisJaWYgKGJtYWNfc3RhdHVzICYgQ1JFR19TVEFUX1JYSVJRKQorCQliaWdtYWNfcngoYnApOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGJpZ21hY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJpZ21hYyAqYnAgPSAoc3RydWN0IGJpZ21hYyAqKSBkZXYtPnByaXY7CisJaW50IHJldDsKKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmYmlnbWFjX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgYnApOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IENhbid0IG9yZGVyIGlycSAlZCB0byBnby5cbiIsIGRldi0+aXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaW5pdF90aW1lcigmYnAtPmJpZ21hY190aW1lcik7CisJcmV0ID0gYmlnbWFjX2luaXQoYnAsIDApOworCWlmIChyZXQpCisJCWZyZWVfaXJxKGRldi0+aXJxLCBicCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBiaWdtYWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmlnbWFjICpicCA9IChzdHJ1Y3QgYmlnbWFjICopIGRldi0+cHJpdjsKKworCWRlbF90aW1lcigmYnAtPmJpZ21hY190aW1lcik7CisJYnAtPnRpbWVyX3N0YXRlID0gYXNsZWVwOworCWJwLT50aW1lcl90aWNrcyA9IDA7CisKKwliaWdtYWNfc3RvcChicCk7CisJYmlnbWFjX2NsZWFuX3JpbmdzKGJwKTsKKwlmcmVlX2lycShkZXYtPmlycSwgYnApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiaWdtYWNfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiaWdtYWMgKmJwID0gKHN0cnVjdCBiaWdtYWMgKikgZGV2LT5wcml2OworCisJYmlnbWFjX2luaXQoYnAsIDApOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyogUHV0IGEgcGFja2V0IG9uIHRoZSB3aXJlLiAqLworc3RhdGljIGludCBiaWdtYWNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiaWdtYWMgKmJwID0gKHN0cnVjdCBiaWdtYWMgKikgZGV2LT5wcml2OworCWludCBsZW4sIGVudHJ5OworCXUzMiBtYXBwaW5nOworCisJbGVuID0gc2tiLT5sZW47CisJbWFwcGluZyA9IHNidXNfbWFwX3NpbmdsZShicC0+YmlnbWFjX3NkZXYsIHNrYi0+ZGF0YSwgbGVuLCBTQlVTX0RNQV9UT0RFVklDRSk7CisKKwkvKiBBdm9pZCBhIHJhY2UuLi4gKi8KKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisJZW50cnkgPSBicC0+dHhfbmV3OworCURUWCgoImJpZ21hY19zdGFydF94bWl0OiBsZW4oJWQpIGVudHJ5KCVkKVxuIiwgbGVuLCBlbnRyeSkpOworCWJwLT5ibWFjX2Jsb2NrLT5iZV90eGRbZW50cnldLnR4X2ZsYWdzID0gVFhEX1VQREFURTsKKwlicC0+dHhfc2tic1tlbnRyeV0gPSBza2I7CisJYnAtPmJtYWNfYmxvY2stPmJlX3R4ZFtlbnRyeV0udHhfYWRkciA9IG1hcHBpbmc7CisJYnAtPmJtYWNfYmxvY2stPmJlX3R4ZFtlbnRyeV0udHhfZmxhZ3MgPQorCQkoVFhEX09XTiB8IFRYRF9TT1AgfCBUWERfRU9QIHwgKGxlbiAmIFRYRF9MRU5HVEgpKTsKKwlicC0+dHhfbmV3ID0gTkVYVF9UWChlbnRyeSk7CisJaWYgKFRYX0JVRkZTX0FWQUlMKGJwKSA8PSAwKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisKKwkvKiBHZXQgaXQgZ29pbmcuICovCisJc2J1c193cml0ZWwoQ1JFR19DVFJMX1RXQUtFVVAsIGJwLT5jcmVnICsgQ1JFR19DVFJMKTsKKworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpiaWdtYWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJpZ21hYyAqYnAgPSAoc3RydWN0IGJpZ21hYyAqKSBkZXYtPnByaXY7CisKKwliaWdtYWNfZ2V0X2NvdW50ZXJzKGJwLCBicC0+YnJlZ3MpOworCXJldHVybiAmYnAtPmVuZXRfc3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIGJpZ21hY19zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJpZ21hYyAqYnAgPSAoc3RydWN0IGJpZ21hYyAqKSBkZXYtPnByaXY7CisJdm9pZCBfX2lvbWVtICpicmVncyA9IGJwLT5icmVnczsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwljaGFyICphZGRyczsKKwlpbnQgaTsKKwl1MzIgdG1wLCBjcmM7CisKKwkvKiBEaXNhYmxlIHRoZSByZWNlaXZlci4gIFRoZSBiaXQgc2VsZi1jbGVhcnMgd2hlbgorCSAqIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUuCisJICovCisJdG1wID0gc2J1c19yZWFkbChicmVncyArIEJNQUNfUlhDRkcpOworCXRtcCAmPSB+KEJJR01BQ19SWENGR19FTkFCTEUpOworCXNidXNfd3JpdGVsKHRtcCwgYnJlZ3MgKyBCTUFDX1JYQ0ZHKTsKKwl3aGlsZSAoKHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX1JYQ0ZHKSAmIEJJR01BQ19SWENGR19FTkFCTEUpICE9IDApCisJCXVkZWxheSgyMCk7CisKKwlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8IChkZXYtPm1jX2NvdW50ID4gNjQpKSB7CisJCXNidXNfd3JpdGVsKDB4ZmZmZiwgYnJlZ3MgKyBCTUFDX0hUQUJMRTApOworCQlzYnVzX3dyaXRlbCgweGZmZmYsIGJyZWdzICsgQk1BQ19IVEFCTEUxKTsKKwkJc2J1c193cml0ZWwoMHhmZmZmLCBicmVncyArIEJNQUNfSFRBQkxFMik7CisJCXNidXNfd3JpdGVsKDB4ZmZmZiwgYnJlZ3MgKyBCTUFDX0hUQUJMRTMpOworCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCXRtcCA9IHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX1JYQ0ZHKTsKKwkJdG1wIHw9IEJJR01BQ19SWENGR19QTUlTQzsKKwkJc2J1c193cml0ZWwodG1wLCBicmVncyArIEJNQUNfUlhDRkcpOworCX0gZWxzZSB7CisJCXUxNiBoYXNoX3RhYmxlWzRdOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQloYXNoX3RhYmxlW2ldID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrKSB7CisJCQlhZGRycyA9IGRtaS0+ZG1pX2FkZHI7CisJCQlkbWkgPSBkbWktPm5leHQ7CisKKwkJCWlmICghKCphZGRycyAmIDEpKQorCQkJCWNvbnRpbnVlOworCisJCQljcmMgPSBldGhlcl9jcmNfbGUoNiwgYWRkcnMpOworCQkJY3JjID4+PSAyNjsKKwkJCWhhc2hfdGFibGVbY3JjID4+IDRdIHw9IDEgPDwgKGNyYyAmIDB4Zik7CisJCX0KKwkJc2J1c193cml0ZWwoaGFzaF90YWJsZVswXSwgYnJlZ3MgKyBCTUFDX0hUQUJMRTApOworCQlzYnVzX3dyaXRlbChoYXNoX3RhYmxlWzFdLCBicmVncyArIEJNQUNfSFRBQkxFMSk7CisJCXNidXNfd3JpdGVsKGhhc2hfdGFibGVbMl0sIGJyZWdzICsgQk1BQ19IVEFCTEUyKTsKKwkJc2J1c193cml0ZWwoaGFzaF90YWJsZVszXSwgYnJlZ3MgKyBCTUFDX0hUQUJMRTMpOworCX0KKworCS8qIFJlLWVuYWJsZSB0aGUgcmVjZWl2ZXIuICovCisJdG1wID0gc2J1c19yZWFkbChicmVncyArIEJNQUNfUlhDRkcpOworCXRtcCB8PSBCSUdNQUNfUlhDRkdfRU5BQkxFOworCXNidXNfd3JpdGVsKHRtcCwgYnJlZ3MgKyBCTUFDX1JYQ0ZHKTsKK30KKworLyogRXRodG9vbCBzdXBwb3J0Li4uICovCitzdGF0aWMgdm9pZCBiaWdtYWNfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgYmlnbWFjICpicCA9IGRldi0+cHJpdjsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsICJzdW5ibWFjIik7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sICIyLjAiKTsKKwlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiU0JVUzolZCIsCisJCWJwLT5xZWNfc2Rldi0+c2xvdCk7Cit9CisKK3N0YXRpYyB1MzIgYmlnbWFjX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJpZ21hYyAqYnAgPSBkZXYtPnByaXY7CisKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisJYnAtPnN3X2Jtc3IgPSBiaWdtYWNfdGN2cl9yZWFkKGJwLCBicC0+dHJlZ3MsIEJJR01BQ19CTVNSKTsKKwlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKworCXJldHVybiAoYnAtPnN3X2Jtc3IgJiBCTVNSX0xTVEFUVVMpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGJpZ21hY19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gYmlnbWFjX2dldF9kcnZpbmZvLAorCS5nZXRfbGluawkJPSBiaWdtYWNfZ2V0X2xpbmssCit9OworCitzdGF0aWMgaW50IF9faW5pdCBiaWdtYWNfZXRoZXJfaW5pdChzdHJ1Y3Qgc2J1c19kZXYgKnFlY19zZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RhdGljIGludCB2ZXJzaW9uX3ByaW50ZWQ7CisJc3RydWN0IGJpZ21hYyAqYnA7CisJdTggYnNpemVzLCBic2l6ZXNfbW9yZTsKKwlpbnQgaTsKKworCS8qIEdldCBhIG5ldyBkZXZpY2Ugc3RydWN0IGZvciB0aGlzIGludGVyZmFjZS4gKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGJpZ21hYykpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAodmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWRldi0+YmFzZV9hZGRyID0gKGxvbmcpIHFlY19zZGV2OworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBpZHByb20tPmlkX2V0aGFkZHJbaV07CisKKwkvKiBTZXR1cCBzb2Z0Yywgd2l0aCBiYWNrcG9pbnRlcnMgdG8gUUVDIGFuZCBCaWdNQUMgU0JVUyBkZXZpY2Ugc3RydWN0cy4gKi8KKwlicCA9IGRldi0+cHJpdjsKKwlicC0+cWVjX3NkZXYgPSBxZWNfc2RldjsKKwlicC0+YmlnbWFjX3NkZXYgPSBxZWNfc2Rldi0+Y2hpbGQ7CisKKwlzcGluX2xvY2tfaW5pdCgmYnAtPmxvY2spOworCisJLyogVmVyaWZ5IHRoZSByZWdpc3RlcnMgd2UgZXhwZWN0LCBhcmUgYWN0dWFsbHkgdGhlcmUuICovCisJaWYgKChicC0+YmlnbWFjX3NkZXYtPm51bV9yZWdpc3RlcnMgIT0gMykgfHwKKwkgICAoYnAtPnFlY19zZGV2LT5udW1fcmVnaXN0ZXJzICE9IDIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBEZXZpY2UgZG9lcyBub3QgaGF2ZSAyIGFuZCAzIHJlZ3MsIGl0IGhhcyAlZCBhbmQgJWQuXG4iLAorCQkgICAgICAgYnAtPnFlY19zZGV2LT5udW1fcmVnaXN0ZXJzLAorCQkgICAgICAgYnAtPmJpZ21hY19zZGV2LT5udW1fcmVnaXN0ZXJzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IFdvdWxkIHlvdSBsaWtlIHRoYXQgZm9yIGhlcmUgb3IgdG8gZ28/XG4iKTsKKwkJZ290byBmYWlsX2FuZF9jbGVhbnVwOworCX0KKworCS8qIE1hcCBpbiBRRUMgZ2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCWJwLT5ncmVncyA9IHNidXNfaW9yZW1hcCgmYnAtPnFlY19zZGV2LT5yZXNvdXJjZVswXSwgMCwKKwkJCQkgR0xPQl9SRUdfU0laRSwgIkJpZ01BQyBRRUMgR0xvYmFsIFJlZ3MiKTsKKwlpZiAoIWJwLT5ncmVncykgeworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogQ2Fubm90IG1hcCBRRUMgZ2xvYmFsIHJlZ2lzdGVycy5cbiIpOworCQlnb3RvIGZhaWxfYW5kX2NsZWFudXA7CisJfQorCisJLyogTWFrZSBzdXJlIFFFQyBpcyBpbiBCaWdNQUMgbW9kZS4gKi8KKwlpZiAoKHNidXNfcmVhZGwoYnAtPmdyZWdzICsgR0xPQl9DVFJMKSAmIDB4ZjAwMDAwMDApICE9IEdMT0JfQ1RSTF9CTU9ERSkgeworCQlwcmludGsoS0VSTl9FUlIgIkJpZ01BQzogQUlFRUUsIFFFQyBpcyBub3QgaW4gQmlnTUFDIG1vZGUhXG4iKTsKKwkJZ290byBmYWlsX2FuZF9jbGVhbnVwOworCX0KKworCS8qIFJlc2V0IHRoZSBRRUMuICovCisJaWYgKHFlY19nbG9iYWxfcmVzZXQoYnAtPmdyZWdzKSkKKwkJZ290byBmYWlsX2FuZF9jbGVhbnVwOworCisJLyogR2V0IHN1cHBvcnRlZCBTQlVTIGJ1cnN0IHNpemVzLiAqLworCWJzaXplcyA9IHByb21fZ2V0aW50ZGVmYXVsdChicC0+cWVjX3NkZXYtPnByb21fbm9kZSwKKwkJCQkgICAgImJ1cnN0LXNpemVzIiwKKwkJCQkgICAgMHhmZik7CisKKwlic2l6ZXNfbW9yZSA9IHByb21fZ2V0aW50ZGVmYXVsdChicC0+cWVjX3NkZXYtPmJ1cy0+cHJvbV9ub2RlLAorCQkJCQkgImJ1cnN0LXNpemVzIiwKKwkJCQkJIDB4ZmYpOworCisJYnNpemVzICY9IDB4ZmY7CisJaWYgKGJzaXplc19tb3JlICE9IDB4ZmYpCisJCWJzaXplcyAmPSBic2l6ZXNfbW9yZTsKKwlpZiAoYnNpemVzID09IDB4ZmYgfHwgKGJzaXplcyAmIERNQV9CVVJTVDE2KSA9PSAwIHx8CisJICAgIChic2l6ZXMgJiBETUFfQlVSU1QzMikgPT0gMCkKKwkJYnNpemVzID0gKERNQV9CVVJTVDMyIC0gMSk7CisJYnAtPmJpZ21hY19idXJzdHMgPSBic2l6ZXM7CisKKwkvKiBQZXJmb3JtIFFFQyBpbml0aWFsaXphdGlvbi4gKi8KKwlxZWNfaW5pdChicCk7CisKKwkvKiBNYXAgaW4gdGhlIEJpZ01BQyBjaGFubmVsIHJlZ2lzdGVycy4gKi8KKwlicC0+Y3JlZyA9IHNidXNfaW9yZW1hcCgmYnAtPmJpZ21hY19zZGV2LT5yZXNvdXJjZVswXSwgMCwKKwkJCQlDUkVHX1JFR19TSVpFLCAiQmlnTUFDIFFFQyBDaGFubmVsIFJlZ3MiKTsKKwlpZiAoIWJwLT5jcmVnKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBDYW5ub3QgbWFwIFFFQyBjaGFubmVsIHJlZ2lzdGVycy5cbiIpOworCQlnb3RvIGZhaWxfYW5kX2NsZWFudXA7CisJfQorCisJLyogTWFwIGluIHRoZSBCaWdNQUMgY29udHJvbCByZWdpc3RlcnMuICovCisJYnAtPmJyZWdzID0gc2J1c19pb3JlbWFwKCZicC0+YmlnbWFjX3NkZXYtPnJlc291cmNlWzFdLCAwLAorCQkJCSBCTUFDX1JFR19TSVpFLCAiQmlnTUFDIFByaW1hcnkgUmVncyIpOworCWlmICghYnAtPmJyZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBDYW5ub3QgbWFwIEJpZ01BQyBwcmltYXJ5IHJlZ2lzdGVycy5cbiIpOworCQlnb3RvIGZhaWxfYW5kX2NsZWFudXA7CisJfQorCisJLyogTWFwIGluIHRoZSBCaWdNQUMgdHJhbnNjZWl2ZXIgcmVnaXN0ZXJzLCB0aGlzIGlzIGhvdyB5b3UgcG9rZSBhdAorCSAqIHRoZSBCaWdNQUMncyBQSFkuCisJICovCisJYnAtPnRyZWdzID0gc2J1c19pb3JlbWFwKCZicC0+YmlnbWFjX3NkZXYtPnJlc291cmNlWzJdLCAwLAorCQkJCSBUQ1ZSX1JFR19TSVpFLCAiQmlnTUFDIFRyYW5zY2VpdmVyIFJlZ3MiKTsKKwlpZiAoIWJwLT50cmVncykgeworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogQ2Fubm90IG1hcCBCaWdNQUMgdHJhbnNjZWl2ZXIgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gZmFpbF9hbmRfY2xlYW51cDsKKwl9CisKKwkvKiBTdG9wIHRoZSBCaWdNQUMuICovCisJYmlnbWFjX3N0b3AoYnApOworCisJLyogQWxsb2NhdGUgdHJhbnNtaXQvcmVjZWl2ZSBkZXNjcmlwdG9yIERWTUEgYmxvY2suICovCisJYnAtPmJtYWNfYmxvY2sgPSBzYnVzX2FsbG9jX2NvbnNpc3RlbnQoYnAtPmJpZ21hY19zZGV2LAorCQkJCQkgICAgICAgUEFHRV9TSVpFLAorCQkJCQkgICAgICAgJmJwLT5iYmxvY2tfZHZtYSk7CisJaWYgKGJwLT5ibWFjX2Jsb2NrID09IE5VTEwgfHwgYnAtPmJibG9ja19kdm1hID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IENhbm5vdCBhbGxvY2F0ZSBjb25zaXN0ZW50IERNQS5cbiIpOworCQlnb3RvIGZhaWxfYW5kX2NsZWFudXA7CisJfQorCisJLyogR2V0IHRoZSBib2FyZCByZXZpc2lvbiBvZiB0aGlzIEJpZ01BQy4gKi8KKwlicC0+Ym9hcmRfcmV2ID0gcHJvbV9nZXRpbnRkZWZhdWx0KGJwLT5iaWdtYWNfc2Rldi0+cHJvbV9ub2RlLAorCQkJCQkgICAiYm9hcmQtdmVyc2lvbiIsIDEpOworCisJLyogSW5pdCBhdXRvLW5lZ290aWF0aW9uIHRpbWVyIHN0YXRlLiAqLworCWluaXRfdGltZXIoJmJwLT5iaWdtYWNfdGltZXIpOworCWJwLT50aW1lcl9zdGF0ZSA9IGFzbGVlcDsKKwlicC0+dGltZXJfdGlja3MgPSAwOworCisJLyogQmFja2xpbmsgdG8gZ2VuZXJpYyBuZXQgZGV2aWNlIHN0cnVjdC4gKi8KKwlicC0+ZGV2ID0gZGV2OworCisJLyogU2V0IGxpbmtzIHRvIG91ciBCaWdNQUMgb3BlbiBhbmQgY2xvc2Ugcm91dGluZXMuICovCisJZGV2LT5vcGVuID0gJmJpZ21hY19vcGVuOworCWRldi0+c3RvcCA9ICZiaWdtYWNfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmYmlnbWFjX3N0YXJ0X3htaXQ7CisJZGV2LT5ldGh0b29sX29wcyA9ICZiaWdtYWNfZXRodG9vbF9vcHM7CisKKwkvKiBTZXQgbGlua3MgdG8gQmlnTUFDIHN0YXRpc3RpYyBhbmQgbXVsdGktY2FzdCBsb2FkaW5nIGNvZGUuICovCisJZGV2LT5nZXRfc3RhdHMgPSAmYmlnbWFjX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZiaWdtYWNfc2V0X211bHRpY2FzdDsKKworCWRldi0+dHhfdGltZW91dCA9ICZiaWdtYWNfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKKworCS8qIEZpbmlzaCBuZXQgZGV2aWNlIHJlZ2lzdHJhdGlvbi4gKi8KKwlkZXYtPmlycSA9IGJwLT5iaWdtYWNfc2Rldi0+aXJxc1swXTsKKwlkZXYtPmRtYSA9IDA7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IENhbm5vdCByZWdpc3RlciBkZXZpY2UuXG4iKTsKKwkJZ290byBmYWlsX2FuZF9jbGVhbnVwOworCX0KKworCS8qIFB1dCB1cyBpbnRvIHRoZSBsaXN0IG9mIGluc3RhbmNlcyBhdHRhY2hlZCBmb3IgbGF0ZXIgZHJpdmVyCisJICogZXhpdC4KKwkgKi8KKwlicC0+bmV4dF9tb2R1bGUgPSByb290X2JpZ21hY19kZXY7CisJcm9vdF9iaWdtYWNfZGV2ID0gYnA7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogQmlnTUFDIDEwMGJhc2VUIEV0aGVybmV0ICIsIGRldi0+bmFtZSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVjIiwgZGV2LT5kZXZfYWRkcltpXSwKKwkJICAgICAgIGkgPT0gNSA/ICcgJyA6ICc6Jyk7CisJcHJpbnRrKCJcbiIpOworCisJcmV0dXJuIDA7CisKK2ZhaWxfYW5kX2NsZWFudXA6CisJLyogU29tZXRoaW5nIHdlbnQgd3JvbmcsIHVuZG8gd2hhdGV2ZXIgd2UgZGlkIHNvIGZhci4gKi8KKwkvKiBGcmVlIHJlZ2lzdGVyIG1hcHBpbmdzIGlmIGFueS4gKi8KKwlpZiAoYnAtPmdyZWdzKQorCQlzYnVzX2lvdW5tYXAoYnAtPmdyZWdzLCBHTE9CX1JFR19TSVpFKTsKKwlpZiAoYnAtPmNyZWcpCisJCXNidXNfaW91bm1hcChicC0+Y3JlZywgQ1JFR19SRUdfU0laRSk7CisJaWYgKGJwLT5icmVncykKKwkJc2J1c19pb3VubWFwKGJwLT5icmVncywgQk1BQ19SRUdfU0laRSk7CisJaWYgKGJwLT50cmVncykKKwkJc2J1c19pb3VubWFwKGJwLT50cmVncywgVENWUl9SRUdfU0laRSk7CisKKwlpZiAoYnAtPmJtYWNfYmxvY2spCisJCXNidXNfZnJlZV9jb25zaXN0ZW50KGJwLT5iaWdtYWNfc2RldiwKKwkJCQkgICAgIFBBR0VfU0laRSwKKwkJCQkgICAgIGJwLT5ibWFjX2Jsb2NrLAorCQkJCSAgICAgYnAtPmJibG9ja19kdm1hKTsKKworCS8qIFRoaXMgYWxzbyBmcmVlcyB0aGUgY28tbG9jYXRlZCAnZGV2LT5wcml2JyAqLworCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIFFFQyBjYW4gYmUgdGhlIHBhcmVudCBvZiBlaXRoZXIgUXVhZEV0aGVybmV0IG9yCisgKiBhIEJpZ01BQy4gIFdlIHdhbnQgdGhlIGxhdHRlci4KKyAqLworc3RhdGljIGludCBfX2luaXQgYmlnbWFjX21hdGNoKHN0cnVjdCBzYnVzX2RldiAqc2RldikKK3sKKwlzdHJ1Y3Qgc2J1c19kZXYgKmNoaWxkID0gc2Rldi0+Y2hpbGQ7CisKKwlpZiAoc3RyY21wKHNkZXYtPnByb21fbmFtZSwgInFlYyIpICE9IDApCisJCXJldHVybiAwOworCisJaWYgKGNoaWxkID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKHN0cmNtcChjaGlsZC0+cHJvbV9uYW1lLCAiYmUiKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBiaWdtYWNfcHJvYmUodm9pZCkKK3sKKwlzdHJ1Y3Qgc2J1c19idXMgKnNidXM7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gTlVMTDsKKwlzdGF0aWMgaW50IGNhbGxlZDsKKwlpbnQgY2FyZHMgPSAwLCB2OworCisJcm9vdF9iaWdtYWNfZGV2ID0gTlVMTDsKKworCWlmIChjYWxsZWQpCisJCXJldHVybiAtRU5PREVWOworCWNhbGxlZCsrOworCisJZm9yX2VhY2hfc2J1cyhzYnVzKSB7CisJCWZvcl9lYWNoX3NidXNkZXYoc2Rldiwgc2J1cykgeworCQkJaWYgKGJpZ21hY19tYXRjaChzZGV2KSkgeworCQkJCWNhcmRzKys7CisJCQkJaWYgKCh2ID0gYmlnbWFjX2V0aGVyX2luaXQoc2RldikpKQorCQkJCQlyZXR1cm4gdjsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIWNhcmRzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJpZ21hY19jbGVhbnVwKHZvaWQpCit7CisJd2hpbGUgKHJvb3RfYmlnbWFjX2RldikgeworCQlzdHJ1Y3QgYmlnbWFjICpicCA9IHJvb3RfYmlnbWFjX2RldjsKKwkJc3RydWN0IGJpZ21hYyAqYnBfbnh0ID0gcm9vdF9iaWdtYWNfZGV2LT5uZXh0X21vZHVsZTsKKworCQlzYnVzX2lvdW5tYXAoYnAtPmdyZWdzLCBHTE9CX1JFR19TSVpFKTsKKwkJc2J1c19pb3VubWFwKGJwLT5jcmVnLCBDUkVHX1JFR19TSVpFKTsKKwkJc2J1c19pb3VubWFwKGJwLT5icmVncywgQk1BQ19SRUdfU0laRSk7CisJCXNidXNfaW91bm1hcChicC0+dHJlZ3MsIFRDVlJfUkVHX1NJWkUpOworCQlzYnVzX2ZyZWVfY29uc2lzdGVudChicC0+YmlnbWFjX3NkZXYsCisJCQkJICAgICBQQUdFX1NJWkUsCisJCQkJICAgICBicC0+Ym1hY19ibG9jaywKKwkJCQkgICAgIGJwLT5iYmxvY2tfZHZtYSk7CisKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoYnAtPmRldik7CisJCWZyZWVfbmV0ZGV2KGJwLT5kZXYpOworCQlyb290X2JpZ21hY19kZXYgPSBicF9ueHQ7CisJfQorfQorCittb2R1bGVfaW5pdChiaWdtYWNfcHJvYmUpOworbW9kdWxlX2V4aXQoYmlnbWFjX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuYm1hYy5oIGIvZHJpdmVycy9uZXQvc3VuYm1hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NzQwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW5ibWFjLmgKQEAgLTAsMCArMSwzNTYgQEAKKy8qICRJZDogc3VuYm1hYy5oLHYgMS43IDIwMDAvMDcvMTEgMjI6MzU6MjIgZGF2ZW0gRXhwICQKKyAqIHN1bmJtYWMuaDogRGVmaW5lcyBmb3IgdGhlIFN1biAiQmlnIE1BQyIgMTAwYmFzZVQgZXRoZXJuZXQgY2FyZHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqLworCisjaWZuZGVmIF9TVU5CTUFDX0gKKyNkZWZpbmUgX1NVTkJNQUNfSAorCisvKiBRRUMgZ2xvYmFsIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgR0xPQl9DVFJMCTB4MDBVTAkvKiBDb250cm9sICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9TVEFUCTB4MDRVTAkvKiBTdGF0dXMgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9QU0laRQkweDA4VUwJLyogUGFja2V0IFNpemUgICAgICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfTVNJWkUJMHgwY1VMCS8qIExvY2FsLW1lbSBzaXplICg2NEspICAgICAqLworI2RlZmluZSBHTE9CX1JTSVpFCTB4MTBVTAkvKiBSZWNlaXZlIHBhcnRpdGlvbiBzaXplICAgKi8KKyNkZWZpbmUgR0xPQl9UU0laRQkweDE0VUwJLyogVHJhbnNtaXQgcGFydGl0aW9uIHNpemUgICovCisjZGVmaW5lIEdMT0JfUkVHX1NJWkUJMHgxOFVMCisKKyNkZWZpbmUgR0xPQl9DVFJMX01NT0RFICAgICAgIDB4NDAwMDAwMDAgLyogTUFDRSBxZWMgbW9kZSAgICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfQ1RSTF9CTU9ERSAgICAgICAweDEwMDAwMDAwIC8qIEJpZ01BQyBxZWMgbW9kZSAgICAgICAgICAqLworI2RlZmluZSBHTE9CX0NUUkxfRVBBUiAgICAgICAgMHgwMDAwMDAyMCAvKiBFbmFibGUgcGFyaXR5ICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX0FDTlRSTCAgICAgIDB4MDAwMDAwMTggLyogU0JVUyBhcmJpdHJhdGlvbiBjb250cm9sICovCisjZGVmaW5lIEdMT0JfQ1RSTF9CNjQgICAgICAgICAweDAwMDAwMDA0IC8qIDY0IGJ5dGUgZHZtYSBidXJzdHMgICAgICAqLworI2RlZmluZSBHTE9CX0NUUkxfQjMyICAgICAgICAgMHgwMDAwMDAwMiAvKiAzMiBieXRlIGR2bWEgYnVyc3RzICAgICAgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX0IxNiAgICAgICAgIDB4MDAwMDAwMDAgLyogMTYgYnl0ZSBkdm1hIGJ1cnN0cyAgICAgICovCisjZGVmaW5lIEdMT0JfQ1RSTF9SRVNFVCAgICAgICAweDAwMDAwMDAxIC8qIFJlc2V0IHRoZSBRRUMgICAgICAgICAgICAqLworCisjZGVmaW5lIEdMT0JfU1RBVF9UWCAgICAgICAgICAweDAwMDAwMDA4IC8qIEJpZ01BQyBUcmFuc21pdCBJUlEgICAgICAqLworI2RlZmluZSBHTE9CX1NUQVRfUlggICAgICAgICAgMHgwMDAwMDAwNCAvKiBCaWdNQUMgUmVjZWl2ZSBJUlEgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9TVEFUX0JNICAgICAgICAgIDB4MDAwMDAwMDIgLyogQmlnTUFDIEdsb2JhbCBJUlEgICAgICAgICovCisjZGVmaW5lIEdMT0JfU1RBVF9FUiAgICAgICAgICAweDAwMDAwMDAxIC8qIEJpZ01BQyBFcnJvciBJUlEgICAgICAgICAqLworCisjZGVmaW5lIEdMT0JfUFNJWkVfMjA0OCAgICAgICAweDAwICAgICAgIC8qIDJrIHBhY2tldCBzaXplICAgICAgICAgICAqLworI2RlZmluZSBHTE9CX1BTSVpFXzQwOTYgICAgICAgMHgwMSAgICAgICAvKiA0ayBwYWNrZXQgc2l6ZSAgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9QU0laRV82MTQ0ICAgICAgIDB4MTAgICAgICAgLyogNmsgcGFja2V0IHNpemUgICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfUFNJWkVfODE5MiAgICAgICAweDExICAgICAgIC8qIDhrIHBhY2tldCBzaXplICAgICAgICAgICAqLworCisvKiBRRUMgQmlnTUFDIGNoYW5uZWwgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBDUkVHX0NUUkwJMHgwMFVMCS8qIENvbnRyb2wgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19TVEFUCTB4MDRVTAkvKiBTdGF0dXMgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUlhEUwkweDA4VUwJLyogUlggZGVzY3JpcHRvciByaW5nIHB0ciAgICAqLworI2RlZmluZSBDUkVHX1RYRFMJMHgwY1VMCS8qIFRYIGRlc2NyaXB0b3IgcmluZyBwdHIgICAgKi8KKyNkZWZpbmUgQ1JFR19SSU1BU0sJMHgxMFVMCS8qIFJYIEludGVycnVwdCBNYXNrICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19USU1BU0sJMHgxNFVMCS8qIFRYIEludGVycnVwdCBNYXNrICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTSwkweDE4VUwJLyogUUVDIEVycm9yIEludGVycnVwdCBNYXNrICAqLworI2RlZmluZSBDUkVHX0JNQVNLCTB4MWNVTAkvKiBCaWdNQUMgRXJyb3IgSW50ZXJydXB0IE1hc2sqLworI2RlZmluZSBDUkVHX1JYV0JVRlBUUgkweDIwVUwJLyogTG9jYWwgbWVtb3J5IHJ4IHdyaXRlIHB0ciAqLworI2RlZmluZSBDUkVHX1JYUkJVRlBUUgkweDI0VUwJLyogTG9jYWwgbWVtb3J5IHJ4IHJlYWQgcHRyICAqLworI2RlZmluZSBDUkVHX1RYV0JVRlBUUgkweDI4VUwJLyogTG9jYWwgbWVtb3J5IHR4IHdyaXRlIHB0ciAqLworI2RlZmluZSBDUkVHX1RYUkJVRlBUUgkweDJjVUwJLyogTG9jYWwgbWVtb3J5IHR4IHJlYWQgcHRyICAqLworI2RlZmluZSBDUkVHX0NDTlQJMHgzMFVMCS8qIENvbGxpc2lvbiBDb3VudGVyICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19SRUdfU0laRQkweDM0VUwKKworI2RlZmluZSBDUkVHX0NUUkxfVFdBS0VVUCAgICAgMHgwMDAwMDAwMSAgLyogVHJhbnNtaXR0ZXIgV2FrZXVwLCAnZ28nLiAqLworCisjZGVmaW5lIENSRUdfU1RBVF9CRVJST1IgICAgICAweDgwMDAwMDAwICAvKiBCaWdNQUMgZXJyb3IgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9UWElSUSAgICAgICAweDAwMjAwMDAwICAvKiBUcmFuc21pdCBJbnRlcnJ1cHQgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9UWERFUlJPUiAgICAweDAwMDgwMDAwICAvKiBUWCBEZXNjcmlwdG9yIGlzIGJvZ3VzICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9UWExFUlIgICAgICAweDAwMDQwMDAwICAvKiBMYXRlIFRyYW5zbWl0IEVycm9yICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9UWFBFUlIgICAgICAweDAwMDIwMDAwICAvKiBUcmFuc21pdCBQYXJpdHkgRXJyb3IgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9UWFNFUlIgICAgICAweDAwMDEwMDAwICAvKiBUcmFuc21pdCBTQlVTIGVycm9yIGFjayAgICovCisjZGVmaW5lIENSRUdfU1RBVF9SWElSUSAgICAgICAweDAwMDAwMDIwICAvKiBSZWNlaXZlIEludGVycnVwdCAgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9SWERST1AgICAgICAweDAwMDAwMDEwICAvKiBEcm9wcGVkIGEgUlgnZCBwYWNrZXQgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9SWFNNQUxMICAgICAweDAwMDAwMDA4ICAvKiBSZWNlaXZlIGJ1ZmZlciB0b28gc21hbGwgICovCisjZGVmaW5lIENSRUdfU1RBVF9SWExFUlIgICAgICAweDAwMDAwMDA0ICAvKiBSZWNlaXZlIExhdGUgRXJyb3IgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9SWFBFUlIgICAgICAweDAwMDAwMDAyICAvKiBSZWNlaXZlIFBhcml0eSBFcnJvciAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVF9SWFNFUlIgICAgICAweDAwMDAwMDAxICAvKiBSZWNlaXZlIFNCVVMgRXJyb3IgQUNLICAgICovCisKKyNkZWZpbmUgQ1JFR19TVEFUX0VSUk9SUyAgICAgIChDUkVHX1NUQVRfQkVSUk9SfENSRUdfU1RBVF9UWERFUlJPUnxDUkVHX1NUQVRfVFhMRVJSfCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVHX1NUQVRfVFhQRVJSfENSRUdfU1RBVF9UWFNFUlJ8Q1JFR19TVEFUX1JYRFJPUHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVHX1NUQVRfUlhTTUFMTHxDUkVHX1NUQVRfUlhMRVJSfENSRUdfU1RBVF9SWFBFUlJ8ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVHX1NUQVRfUlhTRVJSKQorCisjZGVmaW5lIENSRUdfUU1BU0tfVFhERVJST1IgICAweDAwMDgwMDAwICAvKiBUWEQgZXJyb3IgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUU1BU0tfVFhMRVJSICAgICAweDAwMDQwMDAwICAvKiBUWCBsYXRlIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUU1BU0tfVFhQRVJSICAgICAweDAwMDIwMDAwICAvKiBUWCBwYXJpdHkgZXJyb3IgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUU1BU0tfVFhTRVJSICAgICAweDAwMDEwMDAwICAvKiBUWCBzYnVzIGVycm9yIGFjayAgICAgICAgICovCisjZGVmaW5lIENSRUdfUU1BU0tfUlhEUk9QICAgICAweDAwMDAwMDEwICAvKiBSWCBkcm9wICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUU1BU0tfUlhCRVJST1IgICAweDAwMDAwMDA4ICAvKiBSWCBidWZmZXIgZXJyb3IgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUU1BU0tfUlhMRUVSUiAgICAweDAwMDAwMDA0ICAvKiBSWCBsYXRlIGVycm9yICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUU1BU0tfUlhQRVJSICAgICAweDAwMDAwMDAyICAvKiBSWCBwYXJpdHkgZXJyb3IgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUU1BU0tfUlhTRVJSICAgICAweDAwMDAwMDAxICAvKiBSWCBzYnVzIGVycm9yIGFjayAgICAgICAgICovCisKKy8qIEJJR01BQyBjb3JlIHJlZ2lzdGVycyAqLworI2RlZmluZSBCTUFDX1hJRkNGRwkweDAwMFVMCS8qIFhJRiBjb25maWcgcmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KKwkvKiAweDAwNC0tPjB4MGZjLCByZXNlcnZlZCAqLworI2RlZmluZSBCTUFDX1NUQVRVUwkweDEwMFVMCS8qIFN0YXR1cyByZWdpc3RlciwgY2xlYXIgb24gcmVhZCAgICAgKi8KKyNkZWZpbmUgQk1BQ19JTUFTSwkweDEwNFVMCS8qIEludGVycnVwdCBtYXNrIHJlZ2lzdGVyICAgICAgICAgICAgKi8KKwkvKiAweDEwOC0tPjB4MjA0LCByZXNlcnZlZCAqLworI2RlZmluZSBCTUFDX1RYU1dSRVNFVAkweDIwOFVMCS8qIFRyYW5zbWl0dGVyIHNvZnR3YXJlIHJlc2V0ICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19UWENGRwkweDIwY1VMCS8qIFRyYW5zbWl0dGVyIGNvbmZpZyByZWdpc3RlciAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19JR0FQMQkweDIxMFVMCS8qIEludGVyLXBhY2tldCBnYXAgMSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19JR0FQMgkweDIxNFVMCS8qIEludGVyLXBhY2tldCBnYXAgMiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19BTElNSVQJMHgyMThVTAkvKiBUcmFuc21pdCBhdHRlbXB0IGxpbWl0ICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfU1RJTUUJMHgyMWNVTAkvKiBUcmFuc21pdCBzbG90IHRpbWUgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUExFTgkweDIyMFVMCS8qIFNpemUgb2YgdHJhbnNtaXQgcHJlYW1ibGUgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19QUEFUCTB4MjI0VUwJLyogUGF0dGVybiBmb3IgdHJhbnNtaXQgcHJlYW1ibGUgICAgICAqLworI2RlZmluZSBCTUFDX1RYREVMSU0JMHgyMjhVTAkvKiBUcmFuc21pdCBkZWxpbWl0ZXIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfSlNJWkUJMHgyMmNVTAkvKiBUb2UgamFtLi4uICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfVFhQTUFYCTB4MjMwVUwJLyogVHJhbnNtaXQgbWF4IHBrdCBzaXplICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1RYUE1JTgkweDIzNFVMCS8qIFRyYW5zbWl0IG1pbiBwa3Qgc2l6ZSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19QQVRURU1QVAkweDIzOFVMCS8qIENvdW50IG9mIHRyYW5zbWl0IHBlYWsgYXR0ZW1wdHMgICAgKi8KKyNkZWZpbmUgQk1BQ19EVENUUgkweDIzY1VMCS8qIFRyYW5zbWl0IGRlZmVyIHRpbWVyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19OQ0NUUgkweDI0MFVMCS8qIFRyYW5zbWl0IG5vcm1hbC1jb2xsaXNpb24gY291bnRlciAgKi8KKyNkZWZpbmUgQk1BQ19GQ0NUUgkweDI0NFVMCS8qIFRyYW5zbWl0IGZpcnN0LWNvbGxpc2lvbiBjb3VudGVyICAgKi8KKyNkZWZpbmUgQk1BQ19FWENUUgkweDI0OFVMCS8qIFRyYW5zbWl0IGV4Y2Vzcy1jb2xsaXNpb24gY291bnRlciAgKi8KKyNkZWZpbmUgQk1BQ19MVENUUgkweDI0Y1VMCS8qIFRyYW5zbWl0IGxhdGUtY29sbGlzaW9uIGNvdW50ZXIgICAgKi8KKyNkZWZpbmUgQk1BQ19SU0VFRAkweDI1MFVMCS8qIFRyYW5zbWl0IHJhbmRvbSBudW1iZXIgc2VlZCAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19UWFNNQUNISU5FCTB4MjU0VUwgLyogVHJhbnNtaXQgc3RhdGUgbWFjaGluZSAgICAgICAgICAgICAqLworCS8qIDB4MjU4LS0+MHgzMDQsIHJlc2VydmVkICovCisjZGVmaW5lIEJNQUNfUlhTV1JFU0VUCTB4MzA4VUwJLyogUmVjZWl2ZXIgc29mdHdhcmUgcmVzZXQgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1JYQ0ZHCTB4MzBjVUwJLyogUmVjZWl2ZXIgY29uZmlnIHJlZ2lzdGVyICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1JYUE1BWAkweDMxMFVMCS8qIFJlY2VpdmUgbWF4IHBrdCBzaXplICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19SWFBNSU4JMHgzMTRVTAkvKiBSZWNlaXZlIG1pbiBwa3Qgc2l6ZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfTUFDQUREUjIJMHgzMThVTAkvKiBFdGhlciBhZGRyZXNzIHJlZ2lzdGVyIDIgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfTUFDQUREUjEJMHgzMWNVTAkvKiBFdGhlciBhZGRyZXNzIHJlZ2lzdGVyIDEgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfTUFDQUREUjAJMHgzMjBVTAkvKiBFdGhlciBhZGRyZXNzIHJlZ2lzdGVyIDAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfRlJDVFIJMHgzMjRVTAkvKiBSZWNlaXZlIGZyYW1lIHJlY2VpdmUgY291bnRlciAgICAgICovCisjZGVmaW5lIEJNQUNfR0xFQ1RSCTB4MzI4VUwJLyogUmVjZWl2ZSBnaWFudC1sZW5ndGggZXJyb3IgY291bnRlciAqLworI2RlZmluZSBCTUFDX1VOQUxFQ1RSCTB4MzJjVUwJLyogUmVjZWl2ZSB1bmFsaWduZWQgZXJyb3IgY291bnRlciAgICAqLworI2RlZmluZSBCTUFDX1JDUkNFQ1RSCTB4MzMwVUwJLyogUmVjZWl2ZSBDUkMgZXJyb3IgY291bnRlciAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1JYU01BQ0hJTkUJMHgzMzRVTAkvKiBSZWNlaXZlciBzdGF0ZSBtYWNoaW5lICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUlhDVkFMSUQJMHgzMzhVTAkvKiBSZWNlaXZlciBjb2RlIHZpb2xhdGlvbiAgICAgICAgICAgICovCisJLyogMHgzM2MsIHJlc2VydmVkICovCisjZGVmaW5lIEJNQUNfSFRBQkxFMwkweDM0MFVMCS8qIEhhc2ggdGFibGUgMyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19IVEFCTEUyCTB4MzQ0VUwJLyogSGFzaCB0YWJsZSAyICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0hUQUJMRTEJMHgzNDhVTAkvKiBIYXNoIHRhYmxlIDEgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfSFRBQkxFMAkweDM0Y1VMCS8qIEhhc2ggdGFibGUgMCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19BRklMVEVSMgkweDM1MFVMCS8qIEFkZHJlc3MgZmlsdGVyIDIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19BRklMVEVSMQkweDM1NFVMCS8qIEFkZHJlc3MgZmlsdGVyIDEgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19BRklMVEVSMAkweDM1OFVMCS8qIEFkZHJlc3MgZmlsdGVyIDAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19BRk1BU0sJMHgzNWNVTAkvKiBBZGRyZXNzIGZpbHRlciBtYXNrICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUkVHX1NJWkUJMHgzNjBVTAorCisvKiBCaWdNYWMgWElGIGNvbmZpZyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQklHTUFDX1hDRkdfT0RFTkFCTEUgICAweDAwMDAwMDAxIC8qIE91dHB1dCBkcml2ZXIgZW5hYmxlICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1hDRkdfUkVTViAgICAgICAweDAwMDAwMDAyIC8qIFJlc2VydmVkLCB3cml0ZSBhbHdheXMgYXMgMSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1hDRkdfTUxCQUNLICAgICAweDAwMDAwMDA0IC8qIExvb3BiYWNrLW1vZGUgTUlJIGVuYWJsZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1hDRkdfU01PREUgICAgICAweDAwMDAwMDA4IC8qIEVuYWJsZSBzZXJpYWwgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogQmlnTUFDIHN0YXR1cyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfR09URlJBTUUgICAweDAwMDAwMDAxIC8qIFJlY2VpdmVkIGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfUkNOVEVYUCAgICAweDAwMDAwMDAyIC8qIFJlY2VpdmUgZnJhbWUgY291bnRlciBleHBpcmVkICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfQUNOVEVYUCAgICAweDAwMDAwMDA0IC8qIEFsaWduLWVycm9yIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfQ0NOVEVYUCAgICAweDAwMDAwMDA4IC8qIENSQy1lcnJvciBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfTENOVEVYUCAgICAweDAwMDAwMDEwIC8qIExlbmd0aC1lcnJvciBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfUkZJRk9WRiAgICAweDAwMDAwMDIwIC8qIFJlY2VpdmUgRklGTyBvdmVyZmxvdyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfQ1ZDTlRFWFAgICAweDAwMDAwMDQwIC8qIENvZGUtdmlvbGF0aW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfU0VOVEZSQU1FICAweDAwMDAwMTAwIC8qIFRyYW5zbWl0dGVkIGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfVEZJRk9fVU5EICAweDAwMDAwMjAwIC8qIFRyYW5zbWl0IEZJRk8gdW5kZXJydW4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfTUFYUEtURVJSICAweDAwMDAwNDAwIC8qIE1heC1wYWNrZXQgc2l6ZSBlcnJvciAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfTkNOVEVYUCAgICAweDAwMDAwODAwIC8qIE5vcm1hbC1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfRUNOVEVYUCAgICAweDAwMDAxMDAwIC8qIEV4Y2Vzcy1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfTENDTlRFWFAgICAweDAwMDAyMDAwIC8qIExhdGUtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfRkNOVEVYUCAgICAweDAwMDA0MDAwIC8qIEZpcnN0LWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1NUQVRfRFRJTUVYUCAgICAweDAwMDA4MDAwIC8qIERlZmVyLXRpbWVyIGV4cGlyZWQgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogQmlnTUFDIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfR09URlJBTUUgIDB4MDAwMDAwMDEgLyogUmVjZWl2ZWQgYSBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfUkNOVEVYUCAgIDB4MDAwMDAwMDIgLyogUmVjZWl2ZSBmcmFtZSBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfQUNOVEVYUCAgIDB4MDAwMDAwMDQgLyogQWxpZ24tZXJyb3IgY291bnRlciBleHBpcmVkICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfQ0NOVEVYUCAgIDB4MDAwMDAwMDggLyogQ1JDLWVycm9yIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfTENOVEVYUCAgIDB4MDAwMDAwMTAgLyogTGVuZ3RoLWVycm9yIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfUkZJRk9WRiAgIDB4MDAwMDAwMjAgLyogUmVjZWl2ZSBGSUZPIG92ZXJmbG93ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfQ1ZDTlRFWFAgIDB4MDAwMDAwNDAgLyogQ29kZS12aW9sYXRpb24gY291bnRlciBleHBpcmVkICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfU0VOVEZSQU1FIDB4MDAwMDAxMDAgLyogVHJhbnNtaXR0ZWQgYSBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfVEZJRk9fVU5EIDB4MDAwMDAyMDAgLyogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfTUFYUEtURVJSIDB4MDAwMDA0MDAgLyogTWF4LXBhY2tldCBzaXplIGVycm9yICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfTkNOVEVYUCAgIDB4MDAwMDA4MDAgLyogTm9ybWFsLWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfRUNOVEVYUCAgIDB4MDAwMDEwMDAgLyogRXhjZXNzLWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfTENDTlRFWFAgIDB4MDAwMDIwMDAgLyogTGF0ZS1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfRkNOVEVYUCAgIDB4MDAwMDQwMDAgLyogRmlyc3QtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfSU1BU0tfRFRJTUVYUCAgIDB4MDAwMDgwMDAgLyogRGVmZXItdGltZXIgZXhwaXJlZCAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBCaWdNYWMgdHJhbnNtaXQgY29uZmlnIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCSUdNQUNfVFhDRkdfRU5BQkxFICAgIDB4MDAwMDAwMDEgLyogRW5hYmxlIHRoZSB0cmFuc21pdHRlciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfVFhDRkdfRklGTyAgICAgIDB4MDAwMDAwMTAgLyogRGVmYXVsdCB0eCBmdGhyZXNoLi4uICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfVFhDRkdfU01PREUgICAgIDB4MDAwMDAwMjAgLyogRW5hYmxlIHNsb3cgdHJhbnNtaXQgbW9kZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfVFhDRkdfQ0lHTiAgICAgIDB4MDAwMDAwNDAgLyogSWdub3JlIHRyYW5zbWl0IGNvbGxpc2lvbnMgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfVFhDRkdfRkNTT0ZGICAgIDB4MDAwMDAwODAgLyogRG8gbm90IGVtaXQgRkNTICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfVFhDRkdfREJBQ0tPRkYgIDB4MDAwMDAxMDAgLyogRGlzYWJsZSBiYWNrb2ZmICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfVFhDRkdfRlVMTERQTFggIDB4MDAwMDAyMDAgLyogRW5hYmxlIGZ1bGwtZHVwbGV4ICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBCaWdNYWMgcmVjZWl2ZSBjb25maWcgcmVnaXN0ZXIuICovCisjZGVmaW5lIEJJR01BQ19SWENGR19FTkFCTEUgICAgMHgwMDAwMDAwMSAvKiBFbmFibGUgdGhlIHJlY2VpdmVyICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19GSUZPICAgICAgMHgwMDAwMDAwZSAvKiBEZWZhdWx0IHJ4IGZ0aHJlc2guLi4gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19QU1RSSVAgICAgMHgwMDAwMDAyMCAvKiBQYWQgYnl0ZSBzdHJpcCBlbmFibGUgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19QTUlTQyAgICAgMHgwMDAwMDA0MCAvKiBFbmFibGUgcHJvbWlzY291cyBtb2RlICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19ERVJSICAgICAgMHgwMDAwMDA4MCAvKiBEaXNhYmxlIGVycm9yIGNoZWNraW5nICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19EQ1JDUyAgICAgMHgwMDAwMDEwMCAvKiBEaXNhYmxlIENSQyBzdHJpcHBpbmcgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19NRSAgICAgICAgMHgwMDAwMDIwMCAvKiBSZWNlaXZlIHBhY2tldHMgYWRkcmVzc2VkIHRvIG1lICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19QR1JQICAgICAgMHgwMDAwMDQwMCAvKiBFbmFibGUgcHJvbWlzYyBncm91cCBtb2RlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19IRU5BQkxFICAgMHgwMDAwMDgwMCAvKiBFbmFibGUgdGhlIGhhc2ggZmlsdGVyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19BRU5BQkxFICAgMHgwMDAwMTAwMCAvKiBFbmFibGUgdGhlIGFkZHJlc3MgZmlsdGVyICAgICAgICAgICAgICAgICovCisKKy8qIFRoZSBCaWdNQUMgUEhZIHRyYW5zY2VpdmVyLiAgTm90IG5lYXJseSBhcyBzb3BoaXN0aWNhdGVkIGFzIHRoZSBoYXBweSBtZWFsCisgKiBvbmUuICBCdXQgaXQgZG9lcyBoYXZlIHRoZSAiYml0IGJhbmdlciIsIG9oIGJhYnkuCisgKi8KKyNkZWZpbmUgVENWUl9UUEFMCTB4MDBVTAorI2RlZmluZSBUQ1ZSX01QQUwJMHgwNFVMCisjZGVmaW5lIFRDVlJfUkVHX1NJWkUJMHgwOFVMCisKKy8qIEZyYW1lIGNvbW1hbmRzLiAqLworI2RlZmluZSBGUkFNRV9XUklURSAgICAgICAgICAgMHg1MDAyMDAwMAorI2RlZmluZSBGUkFNRV9SRUFEICAgICAgICAgICAgMHg2MDAyMDAwMAorCisvKiBUcmFuY2VpdmVyIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgVENWUl9QQUxfU0VSSUFMICAgICAgIDB4MDAwMDAwMDEgLyogRW5hYmxlIHNlcmlhbCBtb2RlICAgICAgICAgICAgICAqLworI2RlZmluZSBUQ1ZSX1BBTF9FWFRMQkFDSyAgICAgMHgwMDAwMDAwMiAvKiBFbmFibGUgZXh0ZXJuYWwgbG9vcGJhY2sgICAgICAgICovCisjZGVmaW5lIFRDVlJfUEFMX01TRU5TRSAgICAgICAweDAwMDAwMDA0IC8qIE1lZGlhIHNlbnNlICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENWUl9QQUxfTFRFTkFCTEUgICAgIDB4MDAwMDAwMDggLyogTGluayB0ZXN0IGVuYWJsZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUQ1ZSX1BBTF9MVFNUQVRVUyAgICAgMHgwMDAwMDAxMCAvKiBMaW5rIHRlc3Qgc3RhdHVzICAoUDEgb25seSkgICAgICovCisKKy8qIE1hbmFnZW1lbnQgUEFMLiAqLworI2RlZmluZSBNR01UX1BBTF9EQ0xPQ0sgICAgICAgMHgwMDAwMDAwMSAvKiBEYXRhIGNsb2NrICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1HTVRfUEFMX09FTkFCICAgICAgICAweDAwMDAwMDAyIC8qIE91dHB1dCBlbmFibGVyICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUdNVF9QQUxfTURJTyAgICAgICAgIDB4MDAwMDAwMDQgLyogTURJTyBEYXRhL2F0dGFjaGVkICAgICAgICAgICAgICAqLworI2RlZmluZSBNR01UX1BBTF9USU1FTyAgICAgICAgMHgwMDAwMDAwOCAvKiBUcmFuc21pdCBlbmFibGUgdGltZW91dCBlcnJvciAgICovCisjZGVmaW5lIE1HTVRfUEFMX0VYVF9NRElPICAgICBNR01UX1BBTF9NRElPCisjZGVmaW5lIE1HTVRfUEFMX0lOVF9NRElPICAgICBNR01UX1BBTF9USU1FTworCisvKiBIZXJlIGFyZSBzb21lIFBIWSBhZGRyZXNzZXMuICovCisjZGVmaW5lIEJJR01BQ19QSFlfRVhURVJOQUwgICAwIC8qIEV4dGVybmFsIHRyYW5zY2VpdmVyICovCisjZGVmaW5lIEJJR01BQ19QSFlfSU5URVJOQUwgICAxIC8qIEludGVybmFsIHRyYW5zY2VpdmVyICovCisKKy8qIFBIWSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQklHTUFDX0JNQ1IgICAgICAgICAgIDB4MDAgLyogQmFzaWMgbW9kZSBjb250cm9sIHJlZ2lzdGVyCSovCisjZGVmaW5lIEJJR01BQ19CTVNSICAgICAgICAgICAweDAxIC8qIEJhc2ljIG1vZGUgc3RhdHVzIHJlZ2lzdGVyCSovCisKKy8qIEJNQ1IgYml0cyAqLworI2RlZmluZSBCTUNSX0lTT0xBVEUgICAgICAgICAgICAweDA0MDAgIC8qIERpc2Nvbm5lY3QgRFA4Mzg0MCBmcm9tIE1JSSAqLworI2RlZmluZSBCTUNSX1BET1dOICAgICAgICAgICAgICAweDA4MDAgIC8qIFBvd2VyZG93biB0aGUgRFA4Mzg0MCAgICAgICAqLworI2RlZmluZSBCTUNSX0FORU5BQkxFICAgICAgICAgICAweDEwMDAgIC8qIEVuYWJsZSBhdXRvIG5lZ290aWF0aW9uICAgICAqLworI2RlZmluZSBCTUNSX1NQRUVEMTAwICAgICAgICAgICAweDIwMDAgIC8qIFNlbGVjdCAxMDBNYnBzICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX0xPT1BCQUNLICAgICAgICAgICAweDQwMDAgIC8qIFRYRCBsb29wYmFjayBiaXRzICAgICAgICAgICAqLworI2RlZmluZSBCTUNSX1JFU0VUICAgICAgICAgICAgICAweDgwMDAgIC8qIFJlc2V0IHRoZSBEUDgzODQwICAgICAgICAgICAqLworCisvKiBCTVNSIGJpdHMgKi8KKyNkZWZpbmUgQk1TUl9FUkNBUCAgICAgICAgICAgICAgMHgwMDAxICAvKiBFeHQtcmVnIGNhcGFiaWxpdHkgICAgICAgICAgKi8KKyNkZWZpbmUgQk1TUl9KQ0QgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBKYWJiZXIgZGV0ZWN0ZWQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1TUl9MU1RBVFVTICAgICAgICAgICAgMHgwMDA0ICAvKiBMaW5rIHN0YXR1cyAgICAgICAgICAgICAgICAgKi8KKworLyogUmluZyBkZXNjcmlwdG9ycyBhbmQgc3VjaCwgc2FtZSBhcyBRdWFkIEV0aGVybmV0LiAqLworc3RydWN0IGJlX3J4ZCB7CisJdTMyIHJ4X2ZsYWdzOworCXUzMiByeF9hZGRyOworfTsKKworI2RlZmluZSBSWERfT1dOICAgICAgMHg4MDAwMDAwMCAvKiBPd25lcnNoaXAuICAgICAgKi8KKyNkZWZpbmUgUlhEX1VQREFURSAgIDB4MTAwMDAwMDAgLyogQmVpbmcgVXBkYXRlZD8gICovCisjZGVmaW5lIFJYRF9MRU5HVEggICAweDAwMDAwN2ZmIC8qIFBhY2tldCBMZW5ndGguICAqLworCitzdHJ1Y3QgYmVfdHhkIHsKKwl1MzIgdHhfZmxhZ3M7CisJdTMyIHR4X2FkZHI7Cit9OworCisjZGVmaW5lIFRYRF9PV04gICAgICAweDgwMDAwMDAwIC8qIE93bmVyc2hpcC4gICAgICAqLworI2RlZmluZSBUWERfU09QICAgICAgMHg0MDAwMDAwMCAvKiBTdGFydCBPZiBQYWNrZXQgKi8KKyNkZWZpbmUgVFhEX0VPUCAgICAgIDB4MjAwMDAwMDAgLyogRW5kIE9mIFBhY2tldCAgICovCisjZGVmaW5lIFRYRF9VUERBVEUgICAweDEwMDAwMDAwIC8qIEJlaW5nIFVwZGF0ZWQ/ICAqLworI2RlZmluZSBUWERfTEVOR1RIICAgMHgwMDAwMDdmZiAvKiBQYWNrZXQgTGVuZ3RoLiAgKi8KKworI2RlZmluZSBUWF9SSU5HX01BWFNJWkUgICAyNTYKKyNkZWZpbmUgUlhfUklOR19NQVhTSVpFICAgMjU2CisKKyNkZWZpbmUgVFhfUklOR19TSVpFICAgICAgMjU2CisjZGVmaW5lIFJYX1JJTkdfU0laRSAgICAgIDI1NgorCisjZGVmaW5lIE5FWFRfUlgobnVtKSAgICAgICAoKChudW0pICsgMSkgJiAoUlhfUklOR19TSVpFIC0gMSkpCisjZGVmaW5lIE5FWFRfVFgobnVtKSAgICAgICAoKChudW0pICsgMSkgJiAoVFhfUklOR19TSVpFIC0gMSkpCisjZGVmaW5lIFBSRVZfUlgobnVtKSAgICAgICAoKChudW0pIC0gMSkgJiAoUlhfUklOR19TSVpFIC0gMSkpCisjZGVmaW5lIFBSRVZfVFgobnVtKSAgICAgICAoKChudW0pIC0gMSkgJiAoVFhfUklOR19TSVpFIC0gMSkpCisKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwoYnApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKChicCktPnR4X29sZCA8PSAoYnApLT50eF9uZXcpID8gICAgICAgICAgICAgICAgICAgICBcCisJICAoYnApLT50eF9vbGQgKyAoVFhfUklOR19TSVpFIC0gMSkgLSAoYnApLT50eF9uZXcgOiAgXAorCQkJICAgIChicCktPnR4X29sZCAtIChicCktPnR4X25ldyAtIDEpCisKKworI2RlZmluZSBSWF9DT1BZX1RIUkVTSE9MRCAgMjU2CisjZGVmaW5lIFJYX0JVRl9BTExPQ19TSVpFICAoRVRIX0ZSQU1FX0xFTiArICg2NCAqIDMpKQorCitzdHJ1Y3QgYm1hY19pbml0X2Jsb2NrIHsKKwlzdHJ1Y3QgYmVfcnhkIGJlX3J4ZFtSWF9SSU5HX01BWFNJWkVdOworCXN0cnVjdCBiZV90eGQgYmVfdHhkW1RYX1JJTkdfTUFYU0laRV07Cit9OworCisjZGVmaW5lIGJpYl9vZmZzZXQobWVtLCBlbGVtKSBcCisoKF9fdTMyKSgodW5zaWduZWQgbG9uZykoJigoKHN0cnVjdCBibWFjX2luaXRfYmxvY2sgKikwKS0+bWVtW2VsZW1dKSkpKQorCisvKiBOb3cgc29mdHdhcmUgc3RhdGUgc3R1ZmYuICovCitlbnVtIGJpZ21hY190cmFuc2NlaXZlciB7CisJZXh0ZXJuYWwgPSAwLAorCWludGVybmFsID0gMSwKKwlub25lICAgICA9IDIsCit9OworCisvKiBUaW1lciBzdGF0ZSBlbmdpbmUuICovCitlbnVtIGJpZ21hY190aW1lcl9zdGF0ZSB7CisJbHRyeXdhaXQgPSAxLCAgLyogRm9yY2luZyB0cnkgb2YgYWxsIG1vZGVzLCBmcm9tIGZhc3Rlc3QgdG8gc2xvd2VzdC4gKi8KKwlhc2xlZXAgICA9IDIsICAvKiBUaW1lciBpbmFjdGl2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfTsKKworc3RydWN0IGJpZ21hYyB7CisJdm9pZCBfX2lvbWVtCSpncmVnczsJLyogUUVDIEdsb2JhbCBSZWdpc3RlcnMgICAgICAgICAgICAgICAqLworCXZvaWQgX19pb21lbQkqY3JlZzsJLyogUUVDIEJpZ01BQyBDaGFubmVsIFJlZ2lzdGVycyAgICAgICAqLworCXZvaWQgX19pb21lbQkqYnJlZ3M7CS8qIEJpZ01BQyBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgKi8KKwl2b2lkIF9faW9tZW0JKnRyZWdzOwkvKiBCaWdNQUMgVHJhbnNjZWl2ZXIgICAgICAgICAgICAgICAgICovCisJc3RydWN0IGJtYWNfaW5pdF9ibG9jawkqYm1hY19ibG9jazsJLyogUlggYW5kIFRYIGRlc2NyaXB0b3JzICovCisJX191MzIJCQkgYmJsb2NrX2R2bWE7CS8qIFJYIGFuZCBUWCBkZXNjcmlwdG9ycyAqLworCisJc3BpbmxvY2tfdAkJbG9jazsKKworCXN0cnVjdCBza19idWZmCQkqcnhfc2tic1tSWF9SSU5HX1NJWkVdOworCXN0cnVjdCBza19idWZmCQkqdHhfc2tic1tUWF9SSU5HX1NJWkVdOworCisJaW50IHJ4X25ldywgdHhfbmV3LCByeF9vbGQsIHR4X29sZDsKKworCWludCBib2FyZF9yZXY7CQkJCS8qIEJpZ01BQyBib2FyZCByZXZpc2lvbi4gICAgICAgICAgICAgKi8KKworCWVudW0gYmlnbWFjX3RyYW5zY2VpdmVyCXRjdnJfdHlwZTsKKwl1bnNpZ25lZCBpbnQJCWJpZ21hY19idXJzdHM7CisJdW5zaWduZWQgaW50CQlwYWRkcjsKKwl1bnNpZ25lZCBzaG9ydAkJc3dfYm1zcjsgICAgICAgICAvKiBTVyBjb3B5IG9mIFBIWSBCTVNSICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydAkJc3dfYm1jcjsgICAgICAgICAvKiBTVyBjb3B5IG9mIFBIWSBCTUNSICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdAliaWdtYWNfdGltZXI7CisJZW51bSBiaWdtYWNfdGltZXJfc3RhdGUJdGltZXJfc3RhdGU7CisJdW5zaWduZWQgaW50CQl0aW1lcl90aWNrczsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCWVuZXRfc3RhdHM7CisJc3RydWN0IHNidXNfZGV2CQkqcWVjX3NkZXY7CisJc3RydWN0IHNidXNfZGV2CQkqYmlnbWFjX3NkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKwlzdHJ1Y3QgYmlnbWFjCQkqbmV4dF9tb2R1bGU7Cit9OworCisvKiBXZSB1c2UgdGhpcyB0byBhY3F1aXJlIHJlY2VpdmUgc2tiJ3MgdGhhdCB3ZSBjYW4gRE1BIGRpcmVjdGx5IGludG8uICovCisjZGVmaW5lIEFMSUdORURfUlhfU0tCX0FERFIoYWRkcikgXAorICAgICAgICAoKCgodW5zaWduZWQgbG9uZykoYWRkcikgKyAoNjQgLSAxKSkgJiB+KDY0IC0gMSkpIC0gKHVuc2lnbmVkIGxvbmcpKGFkZHIpKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpiaWdfbWFjX2FsbG9jX3NrYih1bnNpZ25lZCBpbnQgbGVuZ3RoLCBpbnQgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBhbGxvY19za2IobGVuZ3RoICsgNjQsIGdmcF9mbGFncyk7CisJaWYoc2tiKSB7CisJCWludCBvZmZzZXQgPSBBTElHTkVEX1JYX1NLQl9BRERSKHNrYi0+ZGF0YSk7CisKKwkJaWYob2Zmc2V0KQorCQkJc2tiX3Jlc2VydmUoc2tiLCBvZmZzZXQpOworCX0KKwlyZXR1cm4gc2tiOworfQorCisjZW5kaWYgLyogIShfU1VOQk1BQ19IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZGFuY2UuYyBiL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjYjcxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKQEAgLTAsMCArMSwxNzg1IEBACisvKiBzdW5kYW5jZS5jOiBBIExpbnV4IGRldmljZSBkcml2ZXIgZm9yIHRoZSBTdW5kYW5jZSBTVDIwMSAiQWx0YSIuICovCisvKgorCVdyaXR0ZW4gMTk5OS0yMDAwIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisJdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKwlEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisJcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorCWEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlTdXBwb3J0IGFuZCB1cGRhdGVzIGF2YWlsYWJsZSBhdAorCWh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvc3VuZGFuY2UuaHRtbAorCisKKwlWZXJzaW9uIExLMS4wMWEgKGpnYXJ6aWspOgorCS0gUmVwbGFjZSBzb21lIE1JSS1yZWxhdGVkIG1hZ2ljIG51bWJlcnMgd2l0aCBjb25zdGFudHMKKworCVZlcnNpb24gTEsxLjAyIChELUxpbmspOgorCS0gQWRkIG5ldyBib2FyZCB0byBQQ0kgSUQgbGlzdAorCS0gRml4IG11bHRpY2FzdCBidWcKKworCVZlcnNpb24gTEsxLjAzIChELUxpbmspOgorCS0gTmV3IFJ4IHNjaGVtZSwgcmVkdWNlIFJ4IGNvbmdlc3Rpb24KKwktIE9wdGlvbiB0byBkaXNhYmxlIGZsb3cgY29udHJvbAorCisJVmVyc2lvbiBMSzEuMDQgKEQtTGluayk6CisJLSBUeCB0aW1lb3V0IHJlY292ZXJ5CisJLSBNb3JlIHN1cHBvcnQgZm9yIGV0aHRvb2wuCisKKwlWZXJzaW9uIExLMS4wNGE6CisJLSBSZW1vdmUgdW51c2VkL2NvbnN0YW50IG1lbWJlcnMgZnJvbSBzdHJ1Y3QgcGNpX2lkX2luZm8KKwkod2hpY2ggdGhlbiBhbGxvd3MgcmVtb3ZhbCBvZiAnZHJ2X2ZsYWdzJyBmcm9tIHByaXZhdGUgc3RydWN0KQorCShqZ2FyemlrKQorCS0gSWYgbm8gcGh5IGlzIGZvdW5kLCBmYWlsIHRvIGxvYWQgdGhhdCBib2FyZCAoamdhcnppaykKKwktIEFsd2F5cyBzdGFydCBwaHkgaWQgc2NhbiBhdCBpZCAxIHRvIGF2b2lkIHByb2JsZW1zIChEb25hbGQgQmVja2VyKQorCS0gQXV0b2RldGVjdCB3aGVyZSBtaWlfcHJlYWJsZV9yZXF1aXJlZCBpcyBuZWVkZWQsCisJZGVmYXVsdCB0byBub3QgbmVlZGVkLiAgKERvbmFsZCBCZWNrZXIpCisKKwlWZXJzaW9uIExLMS4wNGI6CisJLSBSZW1vdmUgbWlpX3ByZWFtYmxlX3JlcXVpcmVkIG1vZHVsZSBwYXJhbWV0ZXIgKERvbmFsZCBCZWNrZXIpCisJLSBBZGQgcGVyLWludGVyZmFjZSBtaWlfcHJlYW1ibGVfcmVxdWlyZWQgKHNldHRpbmcgaXMgYXV0b2RldGVjdGVkKQorCSAgKERvbmFsZCBCZWNrZXIpCisJLSBSZW1vdmUgdW5uZWNlc3NhcnkgY2FzdCBmcm9tIHZvaWQgcG9pbnRlciAoamdhcnppaykKKwktIFJlLWFsaWduIGNvbW1lbnRzIGluIHByaXZhdGUgc3RydWN0IChqZ2FyemlrKQorCisJVmVyc2lvbiBMSzEuMDRjIChqZ2FyemlrKToKKwktIFN1cHBvcnQgYml0bWFwcGVkIG1lc3NhZ2UgbGV2ZWxzIChORVRJRl9NU0dfeHh4KSwgYW5kIHRoZQorCSAgdHdvIGV0aHRvb2wgaW9jdGxzIHRoYXQgZ2V0L3NldCB0aGVtCisJLSBEb24ndCBoYW5kLWNvZGUgTUlJIGV0aHRvb2wgc3VwcG9ydCwgdXNlIHN0YW5kYXJkIEFQSS9saWIKKworCVZlcnNpb24gTEsxLjA0ZDoKKwktIE1lcmdlIGZyb20gRG9uYWxkIEJlY2tlcidzIHN1bmRhbmNlLmM6IChKYXNvbiBMdW56KQorCQkqIHByb3BlciBzdXBwb3J0IGZvciB2YXJpYWJseS1zaXplZCBNVFVzCisJCSogZGVmYXVsdCB0byBQSU8sIHRvIGZpeCBjaGlwIGJ1Z3MKKwktIEFkZCBtaXNzaW5nIHVucmVnaXN0ZXJfbmV0ZGV2IChKYXNvbiBMdW56KQorCS0gQWRkIENPTkZJR19TVU5EQU5DRV9NTUlPIGNvbmZpZyBvcHRpb24gKGpnYXJ6aWspCisJLSBCZXR0ZXIgcnggYnVmIHNpemUgY2FsY3VsYXRpb24gKERvbmFsZCBCZWNrZXIpCisKKwlWZXJzaW9uIExLMS4wNSAoRC1MaW5rKToKKwktIEZpeCBERkUtNTgwVFggcGFja2V0IGRyb3AgaXNzdWUgKGZvciBETDEwMDUwQykKKwktIEZpeCByZXNldF90eCBsb2dpYworCisJVmVyc2lvbiBMSzEuMDYgKEQtTGluayk6CisJLSBGaXggY3Jhc2ggd2hpbGUgdW5sb2FkaW5nIGRyaXZlcgorCisJVmVyc2luIExLMS4wNmIgKEQtTGluayk6CisJLSBOZXcgdHggc2NoZW1lLCBhZGFwdGl2ZSB0eF9jb2FsZXNjZQorCQorCVZlcnNpb24gTEsxLjA3IChELUxpbmspOgorCS0gRml4IHR4IGJ1Z3MgaW4gYmlnLWVuZGlhbiBtYWNoaW5lcworCS0gUmVtb3ZlIHVudXNlZCBtYXhfaW50ZXJydXB0X3dvcmsgbW9kdWxlIHBhcmFtZXRlciwgdGhlIG5ldyAKKwkgIE5BUEktbGlrZSByeCBzY2hlbWUgZG9lc24ndCBuZWVkIGl0LgorCS0gUmVtb3ZlIHJlZHVuZGFuY3kgZ2V0X3N0YXRzKCkgaW4gaW50cl9oYW5kbGVyKCksIHRob3NlIAorCSAgSS9PIGFjY2VzcyBjb3VsZCBhZmZlY3QgcGVyZm9ybWFuY2UgaW4gQVJNLWJhc2VkIHN5c3RlbQorCS0gQWRkIExpbnV4IHNvZnR3YXJlIFZMQU4gc3VwcG9ydAorCQorCVZlcnNpb24gTEsxLjA4IChELUxpbmspOgorCS0gRml4IGJ1ZyBvZiBjdXN0b20gbWFjIGFkZHJlc3MgCisJKFN0YXRpb25BZGRyIHJlZ2lzdGVyIG9ubHkgYWNjZXB0IHdvcmQgd3JpdGUpIAorCisJVmVyc2lvbiBMSzEuMDkgKEQtTGluayk6CisJLSBGaXggdGhlIGZsb3djdHJsIGJ1Zy4JCisJLSBTZXQgUGF1c2UgYml0IGluIE1JSSBBTkFSIGlmIGZsb3cgY29udHJvbCBlbmFibGVkLgkKKworCVZlcnNpb24gTEsxLjA5YSAoSUNQbHVzKToKKwktIEFkZCB0aGUgZGVsYXkgdGltZSBpbiByZWFkaW5nIHRoZSBjb250ZW50cyBvZiBFRVBST00KKworKi8KKworI2RlZmluZSBEUlZfTkFNRQkic3VuZGFuY2UiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjAxK0xLMS4wOWEiCisjZGVmaW5lIERSVl9SRUxEQVRFCSIxMC1KdWwtMjAwMyIKKworCisvKiBUaGUgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLgorICAgVGhlc2UgbWF5IGJlIG1vZGlmaWVkIHdoZW4gYSBkcml2ZXIgbW9kdWxlIGlzIGxvYWRlZC4qLworc3RhdGljIGludCBkZWJ1ZyA9IDE7CQkJLyogMSBub3JtYWwgbWVzc2FnZXMsIDAgcXVpZXQgLi4gNyB2ZXJib3NlLiAqLworLyogTWF4aW11bSBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBmaWx0ZXIgKHZzLiByeC1hbGwtbXVsdGljYXN0KS4KKyAgIFR5cGljYWwgaXMgYSA2NCBlbGVtZW50IGhhc2ggdGFibGUgYmFzZWQgb24gdGhlIEV0aGVybmV0IENSQy4gICovCitzdGF0aWMgaW50IG11bHRpY2FzdF9maWx0ZXJfbGltaXQgPSAzMjsKKworLyogU2V0IHRoZSBjb3B5IGJyZWFrcG9pbnQgZm9yIHRoZSBjb3B5LW9ubHktdGlueS1mcmFtZXMgc2NoZW1lLgorICAgU2V0dGluZyB0byA+IDE1MTggZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhpcyBmZWF0dXJlLgorICAgVGhpcyBjaGlwIGNhbiByZWNlaXZlIGludG8gb2Zmc2V0IGJ1ZmZlcnMsIHNvIHRoZSBBbHBoYSBkb2VzIG5vdAorICAgbmVlZCBhIGNvcHktYWxpZ24uICovCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhazsKK3N0YXRpYyBpbnQgZmxvd2N0cmw9MTsKKworLyogbWVkaWFbXSBzcGVjaWZpZXMgdGhlIG1lZGlhIHR5cGUgdGhlIE5JQyBvcGVyYXRlcyBhdC4KKwkJIGF1dG9zZW5zZQlBdXRvc2Vuc2luZyBhY3RpdmUgbWVkaWEuCisJCSAxMG1icHNfaGQgCTEwTWJwcyBoYWxmIGR1cGxleC4KKwkJIDEwbWJwc19mZCAJMTBNYnBzIGZ1bGwgZHVwbGV4LgorCQkgMTAwbWJwc19oZCAJMTAwTWJwcyBoYWxmIGR1cGxleC4KKwkJIDEwMG1icHNfZmQgCTEwME1icHMgZnVsbCBkdXBsZXguCisJCSAwCQlBdXRvc2Vuc2luZyBhY3RpdmUgbWVkaWEuCisJCSAxCSAJMTBNYnBzIGhhbGYgZHVwbGV4LgorCQkgMgkgCTEwTWJwcyBmdWxsIGR1cGxleC4KKwkJIDMJIAkxMDBNYnBzIGhhbGYgZHVwbGV4LgorCQkgNAkgCTEwME1icHMgZnVsbCBkdXBsZXguCisqLworI2RlZmluZSBNQVhfVU5JVFMgOAorc3RhdGljIGNoYXIgKm1lZGlhW01BWF9VTklUU107CisKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IGFyZSBzZXQgYXQgY29tcGlsZSB0aW1lLiAqLworCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBjb21waWxlIGVmZmljaWVuY3kuCisgICBUaGUgY29tcGlsZXIgd2lsbCBjb252ZXJ0IDx1bnNpZ25lZD4nJSc8Ml5OPiBpbnRvIGEgYml0IG1hc2suCisgICBNYWtpbmcgdGhlIFR4IHJpbmcgdG9vIGxhcmdlIGRlY3JlYXNlcyB0aGUgZWZmZWN0aXZlbmVzcyBvZiBjaGFubmVsCisgICBib25kaW5nIGFuZCBwYWNrZXQgcHJpb3JpdHksIGFuZCBtb3JlIHRoYW4gMTI4IHJlcXVpcmVzIG1vZGlmeWluZyB0aGUKKyAgIFR4IGVycm9yIHJlY292ZXJ5LgorICAgTGFyZ2UgcmVjZWl2ZSByaW5ncyBtZXJlbHkgd2FzdGUgbWVtb3J5LiAqLworI2RlZmluZSBUWF9SSU5HX1NJWkUJMzIKKyNkZWZpbmUgVFhfUVVFVUVfTEVOCShUWF9SSU5HX1NJWkUgLSAxKSAvKiBMaW1pdCByaW5nIGVudHJpZXMgYWN0dWFsbHkgdXNlZC4gICovCisjZGVmaW5lIFJYX1JJTkdfU0laRQk2NAorI2RlZmluZSBSWF9CVURHRVQJMzIKKyNkZWZpbmUgVFhfVE9UQUxfU0laRQlUWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCBuZXRkZXZfZGVzYykKKyNkZWZpbmUgUlhfVE9UQUxfU0laRQlSWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCBuZXRkZXZfZGVzYykKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoNCpIWikKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTUzNgkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4qLworCisvKiBJbmNsdWRlIGZpbGVzLCBkZXNpZ25lZCB0byBzdXBwb3J0IG1vc3Qga2VybmVsIHZlcnNpb25zIDIuMC4wIGFuZCBsYXRlci4gKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkJLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaWZuZGVmIF9DT01QQVRfV0lUSF9PTERfS0VSTkVMCisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjZWxzZQorI2luY2x1ZGUgImNyYzMyLmgiCisjaW5jbHVkZSAiZXRodG9vbC5oIgorI2luY2x1ZGUgIm1paS5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2VuZGlmCisKKy8qIFRoZXNlIGlkZW50aWZ5IHRoZSBkcml2ZXIgYmFzZSB2ZXJzaW9uIGFuZCBtYXkgbm90IGJlIHJlbW92ZWQuICovCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiICBXcml0dGVuIGJ5IERvbmFsZCBCZWNrZXJcbiIKK0tFUk5fSU5GTyAiICBodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL3N1bmRhbmNlLmh0bWxcbiI7CisKK01PRFVMRV9BVVRIT1IoIkRvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1bmRhbmNlIEFsdGEgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWVkaWEsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShmbG93Y3RybCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJTdW5kYW5jZSBBbHRhIGRlYnVnIGxldmVsICgwLTUpIik7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X2NvcHlicmVhaywgIlN1bmRhbmNlIEFsdGEgY29weSBicmVha3BvaW50IGZvciBjb3B5LW9ubHktdGlueS1mcmFtZXMiKTsKK01PRFVMRV9QQVJNX0RFU0MoZmxvd2N0cmwsICJTdW5kYW5jZSBBbHRhIGZsb3cgY29udHJvbCBbMHwxXSIpOworCisvKgorCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworSS4gQm9hcmQgQ29tcGF0aWJpbGl0eQorCitUaGlzIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIFN1bmRhbmNlIFRlY2hub2xvZ2llcyAiQWx0YSIgU1QyMDEgY2hpcC4KKworSUkuIEJvYXJkLXNwZWNpZmljIHNldHRpbmdzCisKK0lJSS4gRHJpdmVyIG9wZXJhdGlvbgorCitJSUlhLiBSaW5nIGJ1ZmZlcnMKKworVGhpcyBkcml2ZXIgdXNlcyB0d28gc3RhdGljYWxseSBhbGxvY2F0ZWQgZml4ZWQtc2l6ZSBkZXNjcmlwdG9yIGxpc3RzCitmb3JtZWQgaW50byByaW5ncyBieSBhIGJyYW5jaCBmcm9tIHRoZSBmaW5hbCBkZXNjcmlwdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YKK3RoZSBsaXN0LiAgVGhlIHJpbmcgc2l6ZXMgYXJlIHNldCBhdCBjb21waWxlIHRpbWUgYnkgUlgvVFhfUklOR19TSVpFLgorU29tZSBjaGlwcyBleHBsaWNpdGx5IHVzZSBvbmx5IDJeTiBzaXplZCByaW5ncywgd2hpbGUgb3RoZXJzIHVzZSBhCisnbmV4dCBkZXNjcmlwdG9yJyBwb2ludGVyIHRoYXQgdGhlIGRyaXZlciBmb3JtcyBpbnRvIHJpbmdzLgorCitJSUliL2MuIFRyYW5zbWl0L1JlY2VpdmUgU3RydWN0dXJlCisKK1RoaXMgZHJpdmVyIHVzZXMgYSB6ZXJvLWNvcHkgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgc2NoZW1lLgorVGhlIGRyaXZlciBhbGxvY2F0ZXMgZnVsbCBmcmFtZSBzaXplIHNrYnVmZnMgZm9yIHRoZSBSeCByaW5nIGJ1ZmZlcnMgYXQKK29wZW4oKSB0aW1lIGFuZCBwYXNzZXMgdGhlIHNrYi0+ZGF0YSBmaWVsZCB0byB0aGUgY2hpcCBhcyByZWNlaXZlIGRhdGEKK2J1ZmZlcnMuICBXaGVuIGFuIGluY29taW5nIGZyYW1lIGlzIGxlc3MgdGhhbiBSWF9DT1BZQlJFQUsgYnl0ZXMgbG9uZywKK2EgZnJlc2ggc2tidWZmIGlzIGFsbG9jYXRlZCBhbmQgdGhlIGZyYW1lIGlzIGNvcGllZCB0byB0aGUgbmV3IHNrYnVmZi4KK1doZW4gdGhlIGluY29taW5nIGZyYW1lIGlzIGxhcmdlciwgdGhlIHNrYnVmZiBpcyBwYXNzZWQgZGlyZWN0bHkgdXAgdGhlCitwcm90b2NvbCBzdGFjay4gIEJ1ZmZlcnMgY29uc3VtZWQgdGhpcyB3YXkgYXJlIHJlcGxhY2VkIGJ5IG5ld2x5IGFsbG9jYXRlZAorc2tidWZmcyBpbiBhIGxhdGVyIHBoYXNlIG9mIHJlY2VpdmVzLgorCitUaGUgUlhfQ09QWUJSRUFLIHZhbHVlIGlzIGNob3NlbiB0byB0cmFkZS1vZmYgdGhlIG1lbW9yeSB3YXN0ZWQgYnkKK3VzaW5nIGEgZnVsbC1zaXplZCBza2J1ZmYgZm9yIHNtYWxsIGZyYW1lcyB2cy4gdGhlIGNvcHlpbmcgY29zdHMgb2YgbGFyZ2VyCitmcmFtZXMuICBOZXcgYm9hcmRzIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiBnZW5lcm91c2x5IGNvbmZpZ3VyZWQgbWFjaGluZXMKK2FuZCB0aGUgdW5kZXJmaWxsZWQgYnVmZmVycyBoYXZlIG5lZ2xpZ2libGUgaW1wYWN0IGNvbXBhcmVkIHRvIHRoZSBiZW5lZml0IG9mCithIHNpbmdsZSBhbGxvY2F0aW9uIHNpemUsIHNvIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHplcm8gcmVzdWx0cyBpbiBuZXZlcgorY29weWluZyBwYWNrZXRzLiAgV2hlbiBjb3B5aW5nIGlzIGRvbmUsIHRoZSBjb3N0IGlzIHVzdWFsbHkgbWl0aWdhdGVkIGJ5IHVzaW5nCithIGNvbWJpbmVkIGNvcHkvY2hlY2tzdW0gcm91dGluZS4gIENvcHlpbmcgYWxzbyBwcmVsb2FkcyB0aGUgY2FjaGUsIHdoaWNoIGlzCittb3N0IHVzZWZ1bCB3aXRoIHNtYWxsIGZyYW1lcy4KKworQSBzdWJ0bGUgYXNwZWN0IG9mIHRoZSBvcGVyYXRpb24gaXMgdGhhdCB0aGUgSVAgaGVhZGVyIGF0IG9mZnNldCAxNCBpbiBhbgorZXRoZXJuZXQgZnJhbWUgaXNuJ3QgbG9uZ3dvcmQgYWxpZ25lZCBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgorVW5hbGlnbmVkIGJ1ZmZlcnMgYXJlIHBlcm1pdHRlZCBieSB0aGUgU3VuZGFuY2UgaGFyZHdhcmUsIHNvCitmcmFtZXMgYXJlIHJlY2VpdmVkIGludG8gdGhlIHNrYnVmZiBhdCBhbiBvZmZzZXQgb2YgIisyIiwgMTYtYnl0ZSBhbGlnbmluZwordGhlIElQIGhlYWRlci4KKworSUlJZC4gU3luY2hyb25pemF0aW9uCisKK1RoZSBkcml2ZXIgcnVucyBhcyB0d28gaW5kZXBlbmRlbnQsIHNpbmdsZS10aHJlYWRlZCBmbG93cyBvZiBjb250cm9sLiAgT25lCitpcyB0aGUgc2VuZC1wYWNrZXQgcm91dGluZSwgd2hpY2ggZW5mb3JjZXMgc2luZ2xlLXRocmVhZGVkIHVzZSBieSB0aGUKK2Rldi0+dGJ1c3kgZmxhZy4gIFRoZSBvdGhlciB0aHJlYWQgaXMgdGhlIGludGVycnVwdCBoYW5kbGVyLCB3aGljaCBpcyBzaW5nbGUKK3RocmVhZGVkIGJ5IHRoZSBoYXJkd2FyZSBhbmQgaW50ZXJydXB0IGhhbmRsaW5nIHNvZnR3YXJlLgorCitUaGUgc2VuZCBwYWNrZXQgdGhyZWFkIGhhcyBwYXJ0aWFsIGNvbnRyb2wgb3ZlciB0aGUgVHggcmluZyBhbmQgJ2Rldi0+dGJ1c3knCitmbGFnLiAgSXQgc2V0cyB0aGUgdGJ1c3kgZmxhZyB3aGVuZXZlciBpdCdzIHF1ZXVpbmcgYSBUeCBwYWNrZXQuIElmIHRoZSBuZXh0CitxdWV1ZSBzbG90IGlzIGVtcHR5LCBpdCBjbGVhcnMgdGhlIHRidXN5IGZsYWcgd2hlbiBmaW5pc2hlZCBvdGhlcndpc2UgaXQgc2V0cwordGhlICdscC0+dHhfZnVsbCcgZmxhZy4KKworVGhlIGludGVycnVwdCBoYW5kbGVyIGhhcyBleGNsdXNpdmUgY29udHJvbCBvdmVyIHRoZSBSeCByaW5nIGFuZCByZWNvcmRzIHN0YXRzCitmcm9tIHRoZSBUeCByaW5nLiAgQWZ0ZXIgcmVhcGluZyB0aGUgc3RhdHMsIGl0IG1hcmtzIHRoZSBUeCBxdWV1ZSBlbnRyeSBhcworZW1wdHkgYnkgaW5jcmVtZW50aW5nIHRoZSBkaXJ0eV90eCBtYXJrLiBJZmYgdGhlICdscC0+dHhfZnVsbCcgZmxhZyBpcyBzZXQsIGl0CitjbGVhcnMgYm90aCB0aGUgdHhfZnVsbCBhbmQgdGJ1c3kgZmxhZ3MuCisKK0lWLiBOb3RlcworCitJVmIuIFJlZmVyZW5jZXMKKworVGhlIFN1bmRhbmNlIFNUMjAxIGRhdGFzaGVldCwgcHJlbGltaW5hcnkgdmVyc2lvbi4KK2h0dHA6Ly9jZXNkaXMuZ3NmYy5uYXNhLmdvdi9saW51eC9taXNjLzEwMG1icHMuaHRtbAoraHR0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L2xpbnV4L21pc2MvTldheS5odG1sCisKK0lWYy4gRXJyYXRhCisKKyovCisKKy8qIFdvcmstYXJvdW5kIGZvciBLZW5kaW4gY2hpcCBidWdzLiAqLworI2lmbmRlZiBDT05GSUdfU1VOREFOQ0VfTU1JTworI2RlZmluZSBVU0VfSU9fT1BTIDEKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3VuZGFuY2VfcGNpX3RibFtdID0geworCXsweDExODYsIDB4MTAwMiwgMHgxMTg2LCAweDEwMDIsIDAsIDAsIDB9LAorCXsweDExODYsIDB4MTAwMiwgMHgxMTg2LCAweDEwMDMsIDAsIDAsIDF9LAorCXsweDExODYsIDB4MTAwMiwgMHgxMTg2LCAweDEwMTIsIDAsIDAsIDJ9LAorCXsweDExODYsIDB4MTAwMiwgMHgxMTg2LCAweDEwNDAsIDAsIDAsIDN9LAorCXsweDExODYsIDB4MTAwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNH0sCisJezB4MTNGMCwgMHgwMjAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA1fSwKKwl7MCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHN1bmRhbmNlX3BjaV90YmwpOworCitlbnVtIHsKKwluZXRkZXZfaW9fc2l6ZSA9IDEyOAorfTsKKworc3RydWN0IHBjaV9pZF9pbmZvIHsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKK307CitzdGF0aWMgc3RydWN0IHBjaV9pZF9pbmZvIHBjaV9pZF90YmxbXSA9IHsKKwl7IkQtTGluayBERkUtNTUwVFggRkFTVCBFdGhlcm5ldCBBZGFwdGVyIn0sCisJeyJELUxpbmsgREZFLTU1MEZYIDEwME1icHMgRmliZXItb3B0aWNzIEFkYXB0ZXIifSwKKwl7IkQtTGluayBERkUtNTgwVFggNCBwb3J0IFNlcnZlciBBZGFwdGVyIn0sCisJeyJELUxpbmsgREZFLTUzMFRYUyBGQVNUIEV0aGVybmV0IEFkYXB0ZXIifSwKKwl7IkQtTGluayBETDEwMDUwLWJhc2VkIEZBU1QgRXRoZXJuZXQgQWRhcHRlciJ9LAorCXsiU3VuZGFuY2UgVGVjaG5vbG9neSBBbHRhIn0sCisJe05VTEwsfSwJCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisKKy8qIFRoaXMgZHJpdmVyIHdhcyB3cml0dGVuIHRvIHVzZSBQQ0kgbWVtb3J5IHNwYWNlLCBob3dldmVyIHg4Ni1vcmllbnRlZAorICAgaGFyZHdhcmUgb2Z0ZW4gdXNlcyBJL08gc3BhY2UgYWNjZXNzZXMuICovCisKKy8qIE9mZnNldHMgdG8gdGhlIGRldmljZSByZWdpc3RlcnMuCisgICBVbmxpa2Ugc29mdHdhcmUtb25seSBzeXN0ZW1zLCBkZXZpY2UgZHJpdmVycyBpbnRlcmFjdCB3aXRoIGNvbXBsZXggaGFyZHdhcmUuCisgICBJdCdzIG5vdCB1c2VmdWwgdG8gZGVmaW5lIHN5bWJvbGljIG5hbWVzIGZvciBldmVyeSByZWdpc3RlciBiaXQgaW4gdGhlCisgICBkZXZpY2UuICBUaGUgbmFtZSBjYW4gb25seSBwYXJ0aWFsbHkgZG9jdW1lbnQgdGhlIHNlbWFudGljcyBhbmQgbWFrZQorICAgdGhlIGRyaXZlciBsb25nZXIgYW5kIG1vcmUgZGlmZmljdWx0IHRvIHJlYWQuCisgICBJbiBnZW5lcmFsLCBvbmx5IHRoZSBpbXBvcnRhbnQgY29uZmlndXJhdGlvbiB2YWx1ZXMgb3IgYml0cyBjaGFuZ2VkCisgICBtdWx0aXBsZSB0aW1lcyBzaG91bGQgYmUgZGVmaW5lZCBzeW1ib2xpY2FsbHkuCisqLworZW51bSBhbHRhX29mZnNldHMgeworCURNQUN0cmwgPSAweDAwLAorCVR4TGlzdFB0ciA9IDB4MDQsCisJVHhETUFCdXJzdFRocmVzaCA9IDB4MDgsCisJVHhETUFVcmdlbnRUaHJlc2ggPSAweDA5LAorCVR4RE1BUG9sbFBlcmlvZCA9IDB4MGEsCisJUnhETUFTdGF0dXMgPSAweDBjLAorCVJ4TGlzdFB0ciA9IDB4MTAsCisJRGVidWdDdHJsMCA9IDB4MWEsCisJRGVidWdDdHJsMSA9IDB4MWMsCisJUnhETUFCdXJzdFRocmVzaCA9IDB4MTQsCisJUnhETUFVcmdlbnRUaHJlc2ggPSAweDE1LAorCVJ4RE1BUG9sbFBlcmlvZCA9IDB4MTYsCisJTEVEQ3RybCA9IDB4MWEsCisJQVNJQ0N0cmwgPSAweDMwLAorCUVFRGF0YSA9IDB4MzQsCisJRUVDdHJsID0gMHgzNiwKKwlUeFN0YXJ0VGhyZXNoID0gMHgzYywKKwlSeEVhcmx5VGhyZXNoID0gMHgzZSwKKwlGbGFzaEFkZHIgPSAweDQwLAorCUZsYXNoRGF0YSA9IDB4NDQsCisJVHhTdGF0dXMgPSAweDQ2LAorCVR4RnJhbWVJZCA9IDB4NDcsCisJRG93bkNvdW50ZXIgPSAweDE4LAorCUludHJDbGVhciA9IDB4NGEsCisJSW50ckVuYWJsZSA9IDB4NGMsCisJSW50clN0YXR1cyA9IDB4NGUsCisJTUFDQ3RybDAgPSAweDUwLAorCU1BQ0N0cmwxID0gMHg1MiwKKwlTdGF0aW9uQWRkciA9IDB4NTQsCisJTWF4RnJhbWVTaXplID0gMHg1QSwKKwlSeE1vZGUgPSAweDVjLAorCU1JSUN0cmwgPSAweDVlLAorCU11bHRpY2FzdEZpbHRlcjAgPSAweDYwLAorCU11bHRpY2FzdEZpbHRlcjEgPSAweDY0LAorCVJ4T2N0ZXRzTG93ID0gMHg2OCwKKwlSeE9jdGV0c0hpZ2ggPSAweDZhLAorCVR4T2N0ZXRzTG93ID0gMHg2YywKKwlUeE9jdGV0c0hpZ2ggPSAweDZlLAorCVR4RnJhbWVzT0sgPSAweDcwLAorCVJ4RnJhbWVzT0sgPSAweDcyLAorCVN0YXRzQ2FycmllckVycm9yID0gMHg3NCwKKwlTdGF0c0xhdGVDb2xsID0gMHg3NSwKKwlTdGF0c011bHRpQ29sbCA9IDB4NzYsCisJU3RhdHNPbmVDb2xsID0gMHg3NywKKwlTdGF0c1R4RGVmZXIgPSAweDc4LAorCVJ4TWlzc2VkID0gMHg3OSwKKwlTdGF0c1R4WFNEZWZlciA9IDB4N2EsCisJU3RhdHNUeEFib3J0ID0gMHg3YiwKKwlTdGF0c0JjYXN0VHggPSAweDdjLAorCVN0YXRzQmNhc3RSeCA9IDB4N2QsCisJU3RhdHNNY2FzdFR4ID0gMHg3ZSwKKwlTdGF0c01jYXN0UnggPSAweDdmLAorCS8qIEFsaWFzZWQgYW5kIGJvZ3VzIHZhbHVlcyEgKi8KKwlSeFN0YXR1cyA9IDB4MGMsCit9OworZW51bSBBU0lDQ3RybF9IaVdvcmRfYml0IHsKKwlHbG9iYWxSZXNldCA9IDB4MDAwMSwKKwlSeFJlc2V0ID0gMHgwMDAyLAorCVR4UmVzZXQgPSAweDAwMDQsCisJRE1BUmVzZXQgPSAweDAwMDgsCisJRklGT1Jlc2V0ID0gMHgwMDEwLAorCU5ldHdvcmtSZXNldCA9IDB4MDAyMCwKKwlIb3N0UmVzZXQgPSAweDAwNDAsCisJUmVzZXRCdXN5ID0gMHgwNDAwLAorfTsKKworLyogQml0cyBpbiB0aGUgaW50ZXJydXB0IHN0YXR1cy9tYXNrIHJlZ2lzdGVycy4gKi8KK2VudW0gaW50cl9zdGF0dXNfYml0cyB7CisJSW50clN1bW1hcnk9MHgwMDAxLCBJbnRyUENJRXJyPTB4MDAwMiwgSW50ck1BQ0N0cmw9MHgwMDA4LAorCUludHJUeERvbmU9MHgwMDA0LCBJbnRyUnhEb25lPTB4MDAxMCwgSW50clJ4U3RhcnQ9MHgwMDIwLAorCUludHJEcnZScXN0PTB4MDA0MCwKKwlTdGF0c01heD0weDAwODAsIExpbmtDaGFuZ2U9MHgwMTAwLAorCUludHJUeERNQURvbmU9MHgwMjAwLCBJbnRyUnhETUFEb25lPTB4MDQwMCwKK307CisKKy8qIEJpdHMgaW4gdGhlIFJ4TW9kZSByZWdpc3Rlci4gKi8KK2VudW0gcnhfbW9kZV9iaXRzIHsKKwlBY2NlcHRBbGxJUE11bHRpPTB4MjAsIEFjY2VwdE11bHRpSGFzaD0weDEwLCBBY2NlcHRBbGw9MHgwOCwKKwlBY2NlcHRCcm9hZGNhc3Q9MHgwNCwgQWNjZXB0TXVsdGljYXN0PTB4MDIsIEFjY2VwdE15UGh5cz0weDAxLAorfTsKKy8qIEJpdHMgaW4gTUFDQ3RybC4gKi8KK2VudW0gbWFjX2N0cmwwX2JpdHMgeworCUVuYkZ1bGxEdXBsZXg9MHgyMCwgRW5iUmN2TGFyZ2VGcmFtZT0weDQwLAorCUVuYkZsb3dDdHJsPTB4MTAwLCBFbmJQYXNzUnhDUkM9MHgyMDAsCit9OworZW51bSBtYWNfY3RybDFfYml0cyB7CisJU3RhdHNFbmFibGU9MHgwMDIwLAlTdGF0c0Rpc2FibGU9MHgwMDQwLCBTdGF0c0VuYWJsZWQ9MHgwMDgwLAorCVR4RW5hYmxlPTB4MDEwMCwgVHhEaXNhYmxlPTB4MDIwMCwgVHhFbmFibGVkPTB4MDQwMCwKKwlSeEVuYWJsZT0weDA4MDAsIFJ4RGlzYWJsZT0weDEwMDAsIFJ4RW5hYmxlZD0weDIwMDAsCit9OworCisvKiBUaGUgUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KKy8qIE5vdGUgdGhhdCB1c2luZyBvbmx5IDMyIGJpdCBmaWVsZHMgc2ltcGxpZmllcyBjb252ZXJzaW9uIHRvIGJpZy1lbmRpYW4KKyAgIGFyY2hpdGVjdHVyZXMuICovCitzdHJ1Y3QgbmV0ZGV2X2Rlc2MgeworCXUzMiBuZXh0X2Rlc2M7CisJdTMyIHN0YXR1czsKKwlzdHJ1Y3QgZGVzY19mcmFnIHsgdTMyIGFkZHIsIGxlbmd0aDsgfSBmcmFnWzFdOworfTsKKworLyogQml0cyBpbiBuZXRkZXZfZGVzYy5zdGF0dXMgKi8KK2VudW0gZGVzY19zdGF0dXNfYml0cyB7CisJRGVzY093bj0weDgwMDAsCisJRGVzY0VuZFBhY2tldD0weDQwMDAsCisJRGVzY0VuZFJpbmc9MHgyMDAwLAorCUxhc3RGcmFnPTB4ODAwMDAwMDAsCisJRGVzY0ludHJPblR4PTB4ODAwMCwKKwlEZXNjSW50ck9uRE1BRG9uZT0weDgwMDAwMDAwLAorCURpc2FibGVBbGlnbiA9IDB4MDAwMDAwMDEsCit9OworCisjZGVmaW5lIFBSSVZfQUxJR04JMTUgCS8qIFJlcXVpcmVkIGFsaWdubWVudCBtYXNrICovCisvKiBVc2UgIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKEwxX0NBQ0hFX0JZVEVTKSkpICB0byBtYWludGFpbiBhbGlnbm1lbnQKKyAgIHdpdGhpbiB0aGUgc3RydWN0dXJlLiAqLworI2RlZmluZSBNSUlfQ05UCQk0CitzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgeworCS8qIERlc2NyaXB0b3IgcmluZ3MgZmlyc3QgZm9yIGFsaWdubWVudC4gKi8KKwlzdHJ1Y3QgbmV0ZGV2X2Rlc2MgKnJ4X3Jpbmc7CisJc3RydWN0IG5ldGRldl9kZXNjICp0eF9yaW5nOworCXN0cnVjdCBza19idWZmKiByeF9za2J1ZmZbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZiogdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisgICAgICAgIGRtYV9hZGRyX3QgdHhfcmluZ19kbWE7CisgICAgICAgIGRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CQkvKiBNZWRpYSBtb25pdG9yaW5nIHRpbWVyLiAqLworCS8qIEZyZXF1ZW50bHkgdXNlZCB2YWx1ZXM6IGtlZXAgc29tZSBhZGphY2VudCBmb3IgY2FjaGUgZWZmZWN0LiAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlzcGlubG9ja190IHJ4X2xvY2s7CQkJLyogR3JvdXAgd2l0aCBUeCBjb250cm9sIGNhY2hlIGxpbmUuICovCisJaW50IG1zZ19lbmFibGU7CisJaW50IGNoaXBfaWQ7CisJdW5zaWduZWQgaW50IGN1cl9yeCwgZGlydHlfcng7CQkvKiBQcm9kdWNlci9jb25zdW1lciByaW5nIGluZGljZXMgKi8KKwl1bnNpZ25lZCBpbnQgcnhfYnVmX3N6OwkJCS8qIEJhc2VkIG9uIE1UVStzbGFjay4gKi8KKwlzdHJ1Y3QgbmV0ZGV2X2Rlc2MgKmxhc3RfdHg7CQkvKiBMYXN0IFR4IGRlc2NyaXB0b3IgdXNlZC4gKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3R4LCBkaXJ0eV90eDsKKwkvKiBUaGVzZSB2YWx1ZXMgYXJlIGtlZXAgdHJhY2sgb2YgdGhlIHRyYW5zY2VpdmVyL21lZGlhIGluIHVzZS4gKi8KKwl1bnNpZ25lZCBpbnQgZmxvd2N0cmw6MTsKKwl1bnNpZ25lZCBpbnQgZGVmYXVsdF9wb3J0OjQ7CQkvKiBMYXN0IGRldi0+aWZfcG9ydCB2YWx1ZS4gKi8KKwl1bnNpZ25lZCBpbnQgYW5fZW5hYmxlOjE7CisJdW5zaWduZWQgaW50IHNwZWVkOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCByeF90YXNrbGV0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0eF90YXNrbGV0OworCWludCBidWRnZXQ7CisJaW50IGN1cl90YXNrOworCS8qIE11bHRpY2FzdCBhbmQgcmVjZWl2ZSBtb2RlLiAqLworCXNwaW5sb2NrX3QgbWNhc3Rsb2NrOwkJCS8qIFNNUCBsb2NrIG11bHRpY2FzdCB1cGRhdGVzLiAqLworCXUxNiBtY2FzdF9maWx0ZXJbNF07CisJLyogTUlJIHRyYW5zY2VpdmVyIHNlY3Rpb24uICovCisJc3RydWN0IG1paV9pZl9pbmZvIG1paV9pZjsKKwlpbnQgbWlpX3ByZWFtYmxlX3JlcXVpcmVkOworCXVuc2lnbmVkIGNoYXIgcGh5c1tNSUlfQ05UXTsJCS8qIE1JSSBkZXZpY2UgYWRkcmVzc2VzLCBvbmx5IGZpcnN0IG9uZSB1c2VkLiAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl1bnNpZ25lZCBjaGFyIHBjaV9yZXZfaWQ7Cit9OworCisvKiBUaGUgc3RhdGlvbiBhZGRyZXNzIGxvY2F0aW9uIGluIHRoZSBFRVBST00uICovCisjZGVmaW5lIEVFUFJPTV9TQV9PRkZTRVQJMHgxMAorI2RlZmluZSBERUZBVUxUX0lOVFIgKEludHJSeERNQURvbmUgfCBJbnRyUENJRXJyIHwgXAorCQkJSW50ckRydlJxc3QgfCBJbnRyVHhEb25lIHwgU3RhdHNNYXggfCBcCisJCQlMaW5rQ2hhbmdlKQorCitzdGF0aWMgaW50ICBjaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KTsKK3N0YXRpYyBpbnQgIGVlcHJvbV9yZWFkKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgbG9jYXRpb24pOworc3RhdGljIGludCAgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgIG5ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgY2hlY2tfZHVwbGV4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmV0ZGV2X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCB0eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgc3RhcnRfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJlc2V0X3R4IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCByeF9wb2xsKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCB0eF9wb2xsKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCByZWZpbGxfcnggKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmV0ZGV2X2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbnRyX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBuZXRkZXZfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBfX3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuZXRkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgaW50ICBuZXRkZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzdW5kYW5jZV9wcm9iZTEgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wOworCXN0YXRpYyBpbnQgY2FyZF9pZHg7CisJaW50IGNoaXBfaWR4ID0gZW50LT5kcml2ZXJfZGF0YTsKKwlpbnQgaXJxOworCWludCBpOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCXUxNiBtaWlfY3RsOworCXZvaWQgKnJpbmdfc3BhY2U7CisJZG1hX2FkZHJfdCByaW5nX2RtYTsKKyNpZmRlZiBVU0VfSU9fT1BTCisJaW50IGJhciA9IDA7CisjZWxzZQorCWludCBiYXIgPSAxOworI2VuZGlmCisKKworLyogd2hlbiBidWlsdCBpbnRvIHRoZSBrZXJuZWwsIHdlIG9ubHkgcHJpbnQgdmVyc2lvbiBpZiBkZXZpY2UgaXMgZm91bmQgKi8KKyNpZm5kZWYgTU9EVUxFCisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCXJldHVybiAtRUlPOworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJaXJxID0gcGRldi0+aXJxOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCpucCkpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKSkKKwkJZ290byBlcnJfb3V0X25ldGRldjsKKworCWlvYWRkciA9IHBjaV9pb21hcChwZGV2LCBiYXIsIG5ldGRldl9pb19zaXplKTsKKwlpZiAoIWlvYWRkcikKKwkJZ290byBlcnJfb3V0X3JlczsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCSgodTE2ICopZGV2LT5kZXZfYWRkcilbaV0gPQorCQkJbGUxNl90b19jcHUoZWVwcm9tX3JlYWQoaW9hZGRyLCBpICsgRUVQUk9NX1NBX09GRlNFVCkpOworCisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisKKwlucCA9IG5ldGRldl9wcml2KGRldik7CisJbnAtPmJhc2UgPSBpb2FkZHI7CisJbnAtPnBjaV9kZXYgPSBwZGV2OworCW5wLT5jaGlwX2lkID0gY2hpcF9pZHg7CisJbnAtPm1zZ19lbmFibGUgPSAoMSA8PCBkZWJ1ZykgLSAxOworCXNwaW5fbG9ja19pbml0KCZucC0+bG9jayk7CisJdGFza2xldF9pbml0KCZucC0+cnhfdGFza2xldCwgcnhfcG9sbCwgKHVuc2lnbmVkIGxvbmcpZGV2KTsKKwl0YXNrbGV0X2luaXQoJm5wLT50eF90YXNrbGV0LCB0eF9wb2xsLCAodW5zaWduZWQgbG9uZylkZXYpOworCisJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CisJaWYgKCFyaW5nX3NwYWNlKQorCQlnb3RvIGVycl9vdXRfY2xlYXJkZXY7CisJbnAtPnR4X3JpbmcgPSAoc3RydWN0IG5ldGRldl9kZXNjICopcmluZ19zcGFjZTsKKwlucC0+dHhfcmluZ19kbWEgPSByaW5nX2RtYTsKKworCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCAmcmluZ19kbWEpOworCWlmICghcmluZ19zcGFjZSkKKwkJZ290byBlcnJfb3V0X3VubWFwX3R4OworCW5wLT5yeF9yaW5nID0gKHN0cnVjdCBuZXRkZXZfZGVzYyAqKXJpbmdfc3BhY2U7CisJbnAtPnJ4X3JpbmdfZG1hID0gcmluZ19kbWE7CisKKwlucC0+bWlpX2lmLmRldiA9IGRldjsKKwlucC0+bWlpX2lmLm1kaW9fcmVhZCA9IG1kaW9fcmVhZDsKKwlucC0+bWlpX2lmLm1kaW9fd3JpdGUgPSBtZGlvX3dyaXRlOworCW5wLT5taWlfaWYucGh5X2lkX21hc2sgPSAweDFmOworCW5wLT5taWlfaWYucmVnX251bV9tYXNrID0gMHgxZjsKKworCS8qIFRoZSBjaGlwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuID0gJm5ldGRldl9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnN0YXJ0X3R4OworCWRldi0+c3RvcCA9ICZuZXRkZXZfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOworCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOworCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CisJZGV2LT50eF90aW1lb3V0ID0gJnR4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisJZGV2LT5jaGFuZ2VfbXR1ID0gJmNoYW5nZV9tdHU7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZucC0+cGNpX3Jldl9pZCk7CisKKwlpID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGkpCisJCWdvdG8gZXJyX291dF91bm1hcF9yeDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBhdCAlcCwgIiwKKwkJICAgZGV2LT5uYW1lLCBwY2lfaWRfdGJsW2NoaXBfaWR4XS5uYW1lLCBpb2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCQlwcmludGsoIiUyLjJ4OiIsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiJTIuMngsIElSUSAlZC5cbiIsIGRldi0+ZGV2X2FkZHJbaV0sIGlycSk7CisKKwlpZiAoMSkgeworCQlpbnQgcGh5LCBwaHlfaWR4ID0gMDsKKwkJbnAtPnBoeXNbMF0gPSAxOwkJLyogRGVmYXVsdCBzZXR0aW5nICovCisJCW5wLT5taWlfcHJlYW1ibGVfcmVxdWlyZWQrKzsKKwkJZm9yIChwaHkgPSAxOyBwaHkgPCAzMiAmJiBwaHlfaWR4IDwgTUlJX0NOVDsgcGh5KyspIHsKKwkJCWludCBtaWlfc3RhdHVzID0gbWRpb19yZWFkKGRldiwgcGh5LCBNSUlfQk1TUik7CisJCQlpZiAobWlpX3N0YXR1cyAhPSAweGZmZmYgICYmICBtaWlfc3RhdHVzICE9IDB4MDAwMCkgeworCQkJCW5wLT5waHlzW3BoeV9pZHgrK10gPSBwaHk7CisJCQkJbnAtPm1paV9pZi5hZHZlcnRpc2luZyA9IG1kaW9fcmVhZChkZXYsIHBoeSwgTUlJX0FEVkVSVElTRSk7CisJCQkJaWYgKChtaWlfc3RhdHVzICYgMHgwMDQwKSA9PSAwKQorCQkJCQlucC0+bWlpX3ByZWFtYmxlX3JlcXVpcmVkKys7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSBQSFkgZm91bmQgYXQgYWRkcmVzcyAlZCwgc3RhdHVzICIKKwkJCQkJICAgIjB4JTQuNHggYWR2ZXJ0aXNpbmcgJTQuNHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHBoeSwgbWlpX3N0YXR1cywgbnAtPm1paV9pZi5hZHZlcnRpc2luZyk7CisJCQl9CisJCX0KKwkJbnAtPm1paV9wcmVhbWJsZV9yZXF1aXJlZC0tOworCisJCWlmIChwaHlfaWR4ID09IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBObyBNSUkgdHJhbnNjZWl2ZXIgZm91bmQsIGFib3J0aW5nLiAgQVNJQyBzdGF0dXMgJXhcbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBBU0lDQ3RybCkpOworCQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXI7CisJCX0KKworCQlucC0+bWlpX2lmLnBoeV9pZCA9IG5wLT5waHlzWzBdOworCX0KKworCS8qIFBhcnNlIG92ZXJyaWRlIGNvbmZpZ3VyYXRpb24gKi8KKwlucC0+YW5fZW5hYmxlID0gMTsKKwlpZiAoY2FyZF9pZHggPCBNQVhfVU5JVFMpIHsKKwkJaWYgKG1lZGlhW2NhcmRfaWR4XSAhPSBOVUxMKSB7CisJCQlucC0+YW5fZW5hYmxlID0gMDsKKwkJCWlmIChzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjEwMG1icHNfZmQiKSA9PSAwIHx8CisJCQkgICAgc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICI0IikgPT0gMCkgeworCQkJCW5wLT5zcGVlZCA9IDEwMDsKKwkJCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKKwkJCX0gZWxzZSBpZiAoc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICIxMDBtYnBzX2hkIikgPT0gMAorCQkJCSAgIHx8IHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiMyIpID09IDApIHsKKwkJCQlucC0+c3BlZWQgPSAxMDA7CisJCQkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDA7CisJCQl9IGVsc2UgaWYgKHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiMTBtYnBzX2ZkIikgPT0gMCB8fAorCQkJCSAgIHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiMiIpID09IDApIHsKKwkJCQlucC0+c3BlZWQgPSAxMDsKKwkJCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKKwkJCX0gZWxzZSBpZiAoc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICIxMG1icHNfaGQiKSA9PSAwIHx8CisJCQkJICAgc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICIxIikgPT0gMCkgeworCQkJCW5wLT5zcGVlZCA9IDEwOworCQkJCW5wLT5taWlfaWYuZnVsbF9kdXBsZXggPSAwOworCQkJfSBlbHNlIHsKKwkJCQlucC0+YW5fZW5hYmxlID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoZmxvd2N0cmwgPT0gMSkKKwkJCW5wLT5mbG93Y3RybCA9IDE7CisJfQorCisJLyogRmlicmUgUEhZPyAqLworCWlmIChpb3JlYWQzMiAoaW9hZGRyICsgQVNJQ0N0cmwpICYgMHg4MCkgeworCQkvKiBEZWZhdWx0IDEwME1icHMgRnVsbCAqLworCQlpZiAobnAtPmFuX2VuYWJsZSkgeworCQkJbnAtPnNwZWVkID0gMTAwOworCQkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7CisJCQlucC0+YW5fZW5hYmxlID0gMDsKKwkJfQorCX0KKwkvKiBSZXNldCBQSFkgKi8KKwltZGlvX3dyaXRlIChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisJbWRlbGF5ICgzMDApOworCS8qIElmIGZsb3cgY29udHJvbCBlbmFibGVkLCB3ZSBuZWVkIHRvIGFkdmVydGlzZSBpdC4qLworCWlmIChucC0+Zmxvd2N0cmwpCisJCW1kaW9fd3JpdGUgKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9BRFZFUlRJU0UsIG5wLT5taWlfaWYuYWR2ZXJ0aXNpbmcgfCAweDA0MDApOworCW1kaW9fd3JpdGUgKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTUNSLCBCTUNSX0FORU5BQkxFfEJNQ1JfQU5SRVNUQVJUKTsKKwkvKiBGb3JjZSBtZWRpYSB0eXBlICovCisJaWYgKCFucC0+YW5fZW5hYmxlKSB7CisJCW1paV9jdGwgPSAwOworCQltaWlfY3RsIHw9IChucC0+c3BlZWQgPT0gMTAwKSA/IEJNQ1JfU1BFRUQxMDAgOiAwOworCQltaWlfY3RsIHw9IChucC0+bWlpX2lmLmZ1bGxfZHVwbGV4KSA/IEJNQ1JfRlVMTERQTFggOiAwOworCQltZGlvX3dyaXRlIChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQk1DUiwgbWlpX2N0bCk7CisJCXByaW50ayAoS0VSTl9JTkZPICJPdmVycmlkZSBzcGVlZD0lZCwgJXMgZHVwbGV4XG4iLAorCQkJbnAtPnNwZWVkLCBucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID8gIkZ1bGwiIDogIkhhbGYiKTsKKworCX0KKworCS8qIFBlcmhhcHMgbW92ZSB0aGUgcmVzZXQgaGVyZT8gKi8KKwkvKiBSZXNldCB0aGUgY2hpcCB0byBlcmFzZSBwcmV2aW91cyBtaXNjb25maWd1cmF0aW9uLiAqLworCWlmIChuZXRpZl9tc2dfaHcobnApKQorCQlwcmludGsoIkFTSUMgQ29udHJvbCBpcyAleC5cbiIsIGlvcmVhZDMyKGlvYWRkciArIEFTSUNDdHJsKSk7CisJaW93cml0ZTE2KDB4MDA3ZiwgaW9hZGRyICsgQVNJQ0N0cmwgKyAyKTsKKwlpZiAobmV0aWZfbXNnX2h3KG5wKSkKKwkJcHJpbnRrKCJBU0lDIENvbnRyb2wgaXMgbm93ICV4LlxuIiwgaW9yZWFkMzIoaW9hZGRyICsgQVNJQ0N0cmwpKTsKKworCWNhcmRfaWR4Kys7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfdW5yZWdpc3RlcjoKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworZXJyX291dF91bm1hcF9yeDoKKyAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCBucC0+cnhfcmluZywgbnAtPnJ4X3JpbmdfZG1hKTsKK2Vycl9vdXRfdW5tYXBfdHg6CisgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgbnAtPnR4X3JpbmcsIG5wLT50eF9yaW5nX2RtYSk7CitlcnJfb3V0X2NsZWFyZGV2OgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlwY2lfaW91bm1hcChwZGV2LCBpb2FkZHIpOworZXJyX291dF9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXRfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2IChkZXYpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGNoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKChuZXdfbXR1IDwgNjgpIHx8IChuZXdfbXR1ID4gODE5MSkpIC8qIFNldCBieSBSeERNQUZyYW1lTGVuICovCisJCXJldHVybiAtRUlOVkFMOworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUJVU1k7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCisjZGVmaW5lIGVlcHJvbV9kZWxheShlZV9hZGRyKQlpb3JlYWQzMihlZV9hZGRyKQorLyogUmVhZCB0aGUgRUVQUk9NIGFuZCBNSUkgTWFuYWdlbWVudCBEYXRhIEkvTyAoTURJTykgaW50ZXJmYWNlcy4gKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGVlcHJvbV9yZWFkKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgbG9jYXRpb24pCit7CisJaW50IGJvZ3VzY250ID0gMTAwMDA7CQkvKiBUeXBpY2FsIDE5MDAgdGlja3MuICovCisJaW93cml0ZTE2KDB4MDIwMCB8IChsb2NhdGlvbiAmIDB4ZmYpLCBpb2FkZHIgKyBFRUN0cmwpOworCWRvIHsKKwkJZWVwcm9tX2RlbGF5KGlvYWRkciArIEVFQ3RybCk7CisJCWlmICghIChpb3JlYWQxNihpb2FkZHIgKyBFRUN0cmwpICYgMHg4MDAwKSkgeworCQkJcmV0dXJuIGlvcmVhZDE2KGlvYWRkciArIEVFRGF0YSk7CisJCX0KKwl9IHdoaWxlICgtLWJvZ3VzY250ID4gMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qICBNSUkgdHJhbnNjZWl2ZXIgY29udHJvbCBzZWN0aW9uLgorCVJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKwlNRElPIHByb3RvY29sLiAgU2VlIHRoZSBNSUkgc3BlY2lmaWNhdGlvbnMgb3IgRFA4Mzg0MEEgZGF0YSBzaGVldAorCWZvciBkZXRhaWxzLgorCisJVGhlIG1heGltdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICBUaGUgbWluaW11bSB0aW1pbmcgaXMgdXN1YWxseQorCW1ldCBieSBiYWNrLXRvLWJhY2sgMzNNaHogUENJIGN5Y2xlcy4gKi8KKyNkZWZpbmUgbWRpb19kZWxheSgpIGlvcmVhZDgobWRpb19hZGRyKQorCitlbnVtIG1paV9yZWdfYml0cyB7CisJTURJT19TaGlmdENsaz0weDAwMDEsIE1ESU9fRGF0YT0weDAwMDIsIE1ESU9fRW5iT3V0cHV0PTB4MDAwNCwKK307CisjZGVmaW5lIE1ESU9fRW5iSW4gICgwKQorI2RlZmluZSBNRElPX1dSSVRFMCAoTURJT19FbmJPdXRwdXQpCisjZGVmaW5lIE1ESU9fV1JJVEUxIChNRElPX0RhdGEgfCBNRElPX0VuYk91dHB1dCkKKworLyogR2VuZXJhdGUgdGhlIHByZWFtYmxlIHJlcXVpcmVkIGZvciBpbml0aWFsIHN5bmNocm9uaXphdGlvbiBhbmQKKyAgIGEgZmV3IG9sZGVyIHRyYW5zY2VpdmVycy4gKi8KK3N0YXRpYyB2b2lkIG1kaW9fc3luYyh2b2lkIF9faW9tZW0gKm1kaW9fYWRkcikKK3sKKwlpbnQgYml0cyA9IDMyOworCisJLyogRXN0YWJsaXNoIHN5bmMgYnkgc2VuZGluZyBhdCBsZWFzdCAzMiBsb2dpYyBvbmVzLiAqLworCXdoaWxlICgtLWJpdHMgPj0gMCkgeworCQlpb3dyaXRlOChNRElPX1dSSVRFMSwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlpb3dyaXRlOChNRElPX1dSSVRFMSB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKm1kaW9fYWRkciA9IG5wLT5iYXNlICsgTUlJQ3RybDsKKwlpbnQgbWlpX2NtZCA9ICgweGY2IDw8IDEwKSB8IChwaHlfaWQgPDwgNSkgfCBsb2NhdGlvbjsKKwlpbnQgaSwgcmV0dmFsID0gMDsKKworCWlmIChucC0+bWlpX3ByZWFtYmxlX3JlcXVpcmVkKQorCQltZGlvX3N5bmMobWRpb19hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKG1paV9jbWQgJiAoMSA8PCBpKSkgPyBNRElPX1dSSVRFMSA6IE1ESU9fV1JJVEUwOworCisJCWlvd3JpdGU4KGRhdGF2YWwsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJaW93cml0ZTgoZGF0YXZhbCB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJLyogUmVhZCB0aGUgdHdvIHRyYW5zaXRpb24sIDE2IGRhdGEsIGFuZCB3aXJlLWlkbGUgYml0cy4gKi8KKwlmb3IgKGkgPSAxOTsgaSA+IDA7IGktLSkgeworCQlpb3dyaXRlOChNRElPX0VuYkluLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlvcmVhZDgobWRpb19hZGRyKSAmIE1ESU9fRGF0YSkgPyAxIDogMCk7CisJCWlvd3JpdGU4KE1ESU9fRW5iSW4gfCBNRElPX1NoaWZ0Q2xrLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCXJldHVybiAocmV0dmFsPj4xKSAmIDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKm1kaW9fYWRkciA9IG5wLT5iYXNlICsgTUlJQ3RybDsKKwlpbnQgbWlpX2NtZCA9ICgweDUwMDIgPDwgMTYpIHwgKHBoeV9pZCA8PCAyMykgfCAobG9jYXRpb248PDE4KSB8IHZhbHVlOworCWludCBpOworCisJaWYgKG5wLT5taWlfcHJlYW1ibGVfcmVxdWlyZWQpCisJCW1kaW9fc3luYyhtZGlvX2FkZHIpOworCisJLyogU2hpZnQgdGhlIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKG1paV9jbWQgJiAoMSA8PCBpKSkgPyBNRElPX1dSSVRFMSA6IE1ESU9fV1JJVEUwOworCisJCWlvd3JpdGU4KGRhdGF2YWwsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJaW93cml0ZTgoZGF0YXZhbCB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJLyogQ2xlYXIgb3V0IGV4dHJhIGJpdHMuICovCisJZm9yIChpID0gMjsgaSA+IDA7IGktLSkgeworCQlpb3dyaXRlOChNRElPX0VuYkluLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCWlvd3JpdGU4KE1ESU9fRW5iSW4gfCBNRElPX1NoaWZ0Q2xrLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGludCBuZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJaW50IGk7CisKKwkvKiBEbyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBjaGlwPz8/ICovCisKKwlpID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZpbnRyX2hhbmRsZXIsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCisJaWYgKG5ldGlmX21zZ19pZnVwKG5wKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBuZXRkZXZfb3BlbigpIGlycSAlZC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwlpbml0X3JpbmcoZGV2KTsKKworCWlvd3JpdGUzMihucC0+cnhfcmluZ19kbWEsIGlvYWRkciArIFJ4TGlzdFB0cik7CisJLyogVGhlIFR4IGxpc3QgcG9pbnRlciBpcyB3cml0dGVuIGFzIHBhY2tldHMgYXJlIHF1ZXVlZC4gKi8KKworCS8qIEluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzLiAqLworCV9fc2V0X21hY19hZGRyKGRldik7CisjaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisJaW93cml0ZTE2KGRldi0+bXR1ICsgMTgsIGlvYWRkciArIE1heEZyYW1lU2l6ZSk7CisjZWxzZQorCWlvd3JpdGUxNihkZXYtPm10dSArIDE0LCBpb2FkZHIgKyBNYXhGcmFtZVNpemUpOworI2VuZGlmCisJaWYgKGRldi0+bXR1ID4gMjA0NykKKwkJaW93cml0ZTMyKGlvcmVhZDMyKGlvYWRkciArIEFTSUNDdHJsKSB8IDB4MEMsIGlvYWRkciArIEFTSUNDdHJsKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgUENJIGJ1cyBidXJzdHMgYW5kIEZJRk8gdGhyZXNob2xkcy4gKi8KKworCWlmIChkZXYtPmlmX3BvcnQgPT0gMCkKKwkJZGV2LT5pZl9wb3J0ID0gbnAtPmRlZmF1bHRfcG9ydDsKKworCXNwaW5fbG9ja19pbml0KCZucC0+bWNhc3Rsb2NrKTsKKworCXNldF9yeF9tb2RlKGRldik7CisJaW93cml0ZTE2KDAsIGlvYWRkciArIEludHJFbmFibGUpOworCWlvd3JpdGUxNigwLCBpb2FkZHIgKyBEb3duQ291bnRlcik7CisJLyogU2V0IHRoZSBjaGlwIHRvIHBvbGwgZXZlcnkgTiozMjBuc2VjLiAqLworCWlvd3JpdGU4KDEwMCwgaW9hZGRyICsgUnhETUFQb2xsUGVyaW9kKTsKKwlpb3dyaXRlOCgxMjcsIGlvYWRkciArIFR4RE1BUG9sbFBlcmlvZCk7CisJLyogRml4IERGRS01ODBUWCBwYWNrZXQgZHJvcCBpc3N1ZSAqLworCWlmIChucC0+cGNpX3Jldl9pZCA+PSAweDE0KQorCQlpb3dyaXRlOCgweDAxLCBpb2FkZHIgKyBEZWJ1Z0N0cmwxKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJaW93cml0ZTE2IChTdGF0c0VuYWJsZSB8IFJ4RW5hYmxlIHwgVHhFbmFibGUsIGlvYWRkciArIE1BQ0N0cmwxKTsKKworCWlmIChuZXRpZl9tc2dfaWZ1cChucCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRG9uZSBuZXRkZXZfb3BlbigpLCBzdGF0dXM6IFJ4ICV4IFR4ICV4ICIKKwkJCSAgICJNQUMgQ29udHJvbCAleCwgJTQuNHggJTQuNHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBSeFN0YXR1cyksIGlvcmVhZDgoaW9hZGRyICsgVHhTdGF0dXMpLAorCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgTUFDQ3RybDApLAorCQkJICAgaW9yZWFkMTYoaW9hZGRyICsgTUFDQ3RybDEpLCBpb3JlYWQxNihpb2FkZHIgKyBNQUNDdHJsMCkpOworCisJLyogU2V0IHRoZSB0aW1lciB0byBjaGVjayBmb3IgbGluayBiZWF0LiAqLworCWluaXRfdGltZXIoJm5wLT50aW1lcik7CisJbnAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMypIWjsKKwlucC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlucC0+dGltZXIuZnVuY3Rpb24gPSAmbmV0ZGV2X3RpbWVyOwkJCQkvKiB0aW1lciBoYW5kbGVyICovCisJYWRkX3RpbWVyKCZucC0+dGltZXIpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaW93cml0ZTE2KERFRkFVTFRfSU5UUiwgaW9hZGRyICsgSW50ckVuYWJsZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfZHVwbGV4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwlpbnQgbWlpX2xwYSA9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlfTFBBKTsKKwlpbnQgbmVnb3RpYXRlZCA9IG1paV9scGEgJiBucC0+bWlpX2lmLmFkdmVydGlzaW5nOworCWludCBkdXBsZXg7CisKKwkvKiBGb3JjZSBtZWRpYSAqLworCWlmICghbnAtPmFuX2VuYWJsZSB8fCBtaWlfbHBhID09IDB4ZmZmZikgeworCQlpZiAobnAtPm1paV9pZi5mdWxsX2R1cGxleCkKKwkJCWlvd3JpdGUxNiAoaW9yZWFkMTYgKGlvYWRkciArIE1BQ0N0cmwwKSB8IEVuYkZ1bGxEdXBsZXgsCisJCQkJaW9hZGRyICsgTUFDQ3RybDApOworCQlyZXR1cm47CisJfQorCisJLyogQXV0b25lZ290aWF0aW9uICovCisJZHVwbGV4ID0gKG5lZ290aWF0ZWQgJiAweDAxMDApIHx8IChuZWdvdGlhdGVkICYgMHgwMUMwKSA9PSAweDAwNDA7CisJaWYgKG5wLT5taWlfaWYuZnVsbF9kdXBsZXggIT0gZHVwbGV4KSB7CisJCW5wLT5taWlfaWYuZnVsbF9kdXBsZXggPSBkdXBsZXg7CisJCWlmIChuZXRpZl9tc2dfbGluayhucCkpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU2V0dGluZyAlcy1kdXBsZXggYmFzZWQgb24gTUlJICMlZCAiCisJCQkJICAgIm5lZ290aWF0ZWQgY2FwYWJpbGl0eSAlNC40eC5cbiIsIGRldi0+bmFtZSwKKwkJCQkgICBkdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIsIG5wLT5waHlzWzBdLCBuZWdvdGlhdGVkKTsKKwkJaW93cml0ZTE2KGlvcmVhZDE2KGlvYWRkciArIE1BQ0N0cmwwKSB8IGR1cGxleCA/IDB4MjAgOiAwLCBpb2FkZHIgKyBNQUNDdHJsMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJaW50IG5leHRfdGljayA9IDEwKkhaOworCisJaWYgKG5ldGlmX21zZ190aW1lcihucCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNZWRpYSBzZWxlY3Rpb24gdGltZXIgdGljaywgaW50ciBzdGF0dXMgJTQuNHgsICIKKwkJCSAgICJUeCAleCBSeCAleC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDE2KGlvYWRkciArIEludHJFbmFibGUpLAorCQkJICAgaW9yZWFkOChpb2FkZHIgKyBUeFN0YXR1cyksIGlvcmVhZDMyKGlvYWRkciArIFJ4U3RhdHVzKSk7CisJfQorCWNoZWNrX2R1cGxleChkZXYpOworCW5wLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG5leHRfdGljazsKKwlhZGRfdGltZXIoJm5wLT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKwkKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJdGFza2xldF9kaXNhYmxlKCZucC0+dHhfdGFza2xldCk7CisJaW93cml0ZTE2KDAsIGlvYWRkciArIEludHJFbmFibGUpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQsIFR4U3RhdHVzICUyLjJ4ICIKKwkJICAgIlR4RnJhbWVJZCAlMi4yeCwiCisJCSAgICIgcmVzZXR0aW5nLi4uXG4iLCBkZXYtPm5hbWUsIGlvcmVhZDgoaW9hZGRyICsgVHhTdGF0dXMpLAorCQkgICBpb3JlYWQ4KGlvYWRkciArIFR4RnJhbWVJZCkpOworCisJeworCQlpbnQgaTsKKwkJZm9yIChpPTA7IGk8VFhfUklOR19TSVpFOyBpKyspIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICUwOGxseCAlMDh4ICUwOHgoJTAyeCkgJTA4eCAlMDh4XG4iLCBpLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKG5wLT50eF9yaW5nX2RtYSArIGkqc2l6ZW9mKCpucC0+dHhfcmluZykpLAorCQkJCWxlMzJfdG9fY3B1KG5wLT50eF9yaW5nW2ldLm5leHRfZGVzYyksCisJCQkJbGUzMl90b19jcHUobnAtPnR4X3JpbmdbaV0uc3RhdHVzKSwKKwkJCQkobGUzMl90b19jcHUobnAtPnR4X3JpbmdbaV0uc3RhdHVzKSA+PiAyKSAmIDB4ZmYsCisJCQkJbGUzMl90b19jcHUobnAtPnR4X3JpbmdbaV0uZnJhZ1swXS5hZGRyKSwgCisJCQkJbGUzMl90b19jcHUobnAtPnR4X3JpbmdbaV0uZnJhZ1swXS5sZW5ndGgpKTsKKwkJfQorCQlwcmludGsoS0VSTl9ERUJVRyAiVHhMaXN0UHRyPSUwOHggbmV0aWZfcXVldWVfc3RvcHBlZD0lZFxuIiwgCisJCQlpb3JlYWQzMihucC0+YmFzZSArIFR4TGlzdFB0ciksIAorCQkJbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImN1cl90eD0lZCglMDJ4KSBkaXJ0eV90eD0lZCglMDJ4KVxuIiwgCisJCQlucC0+Y3VyX3R4LCBucC0+Y3VyX3R4ICUgVFhfUklOR19TSVpFLAorCQkJbnAtPmRpcnR5X3R4LCBucC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiY3VyX3J4PSVkIGRpcnR5X3J4PSVkXG4iLCBucC0+Y3VyX3J4LCBucC0+ZGlydHlfcngpOworCQlwcmludGsoS0VSTl9ERUJVRyAiY3VyX3Rhc2s9JWRcbiIsIG5wLT5jdXJfdGFzayk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZyk7CisKKwkvKiBTdG9wIGFuZCByZXN0YXJ0IHRoZSBjaGlwJ3MgVHggcHJvY2Vzc2VzIC4gKi8KKwlyZXNldF90eChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT5sb2NrLCBmbGFnKTsKKworCWRldi0+aWZfcG9ydCA9IDA7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJaWYgKG5wLT5jdXJfdHggLSBucC0+ZGlydHlfdHggPCBUWF9RVUVVRV9MRU4gLSA0KSB7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJaW93cml0ZTE2KERFRkFVTFRfSU5UUiwgaW9hZGRyICsgSW50ckVuYWJsZSk7CisJdGFza2xldF9lbmFibGUoJm5wLT50eF90YXNrbGV0KTsKK30KKworCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQgaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlucC0+Y3VyX3J4ID0gbnAtPmN1cl90eCA9IDA7CisJbnAtPmRpcnR5X3J4ID0gbnAtPmRpcnR5X3R4ID0gMDsKKwlucC0+Y3VyX3Rhc2sgPSAwOworCisJbnAtPnJ4X2J1Zl9zeiA9IChkZXYtPm10dSA8PSAxNTIwID8gUEtUX0JVRl9TWiA6IGRldi0+bXR1ICsgMTYpOworCisJLyogSW5pdGlhbGl6ZSBhbGwgUnggZGVzY3JpcHRvcnMuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT5yeF9yaW5nW2ldLm5leHRfZGVzYyA9IGNwdV90b19sZTMyKG5wLT5yeF9yaW5nX2RtYSArCisJCQkoKGkrMSklUlhfUklOR19TSVpFKSpzaXplb2YoKm5wLT5yeF9yaW5nKSk7CisJCW5wLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCW5wLT5yeF9yaW5nW2ldLmZyYWdbMF0ubGVuZ3RoID0gMDsKKwkJbnAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJfQorCisJLyogRmlsbCBpbiB0aGUgUnggYnVmZmVycy4gIEhhbmRsZSBhbGxvY2F0aW9uIGZhaWx1cmUgZ3JhY2VmdWxseS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IobnAtPnJ4X2J1Zl9zeik7CisJCW5wLT5yeF9za2J1ZmZbaV0gPSBza2I7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlza2ItPmRldiA9IGRldjsJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyLiAqLworCQlucC0+cnhfcmluZ1tpXS5mcmFnWzBdLmFkZHIgPSBjcHVfdG9fbGUzMigKKwkJCXBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPnRhaWwsIG5wLT5yeF9idWZfc3osCisJCQkJUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCW5wLT5yeF9yaW5nW2ldLmZyYWdbMF0ubGVuZ3RoID0gY3B1X3RvX2xlMzIobnAtPnJ4X2J1Zl9zeiB8IExhc3RGcmFnKTsKKwl9CisJbnAtPmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkoaSAtIFJYX1JJTkdfU0laRSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJbnAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCW5wLT50eF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgdHhfcG9sbCAodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGhlYWQgPSBucC0+Y3VyX3Rhc2sgJSBUWF9SSU5HX1NJWkU7CisJc3RydWN0IG5ldGRldl9kZXNjICp0eGRlc2MgPSAKKwkJJm5wLT50eF9yaW5nWyhucC0+Y3VyX3R4IC0gMSkgJSBUWF9SSU5HX1NJWkVdOworCQorCS8qIENoYWluIHRoZSBuZXh0IHBvaW50ZXIgKi8KKwlmb3IgKDsgbnAtPmN1cl90eCAtIG5wLT5jdXJfdGFzayA+IDA7IG5wLT5jdXJfdGFzaysrKSB7CisJCWludCBlbnRyeSA9IG5wLT5jdXJfdGFzayAlIFRYX1JJTkdfU0laRTsKKwkJdHhkZXNjID0gJm5wLT50eF9yaW5nW2VudHJ5XTsKKwkJaWYgKG5wLT5sYXN0X3R4KSB7CisJCQlucC0+bGFzdF90eC0+bmV4dF9kZXNjID0gY3B1X3RvX2xlMzIobnAtPnR4X3JpbmdfZG1hICsKKwkJCQllbnRyeSpzaXplb2Yoc3RydWN0IG5ldGRldl9kZXNjKSk7CisJCX0KKwkJbnAtPmxhc3RfdHggPSB0eGRlc2M7CisJfQorCS8qIEluZGljYXRlIHRoZSBsYXRlc3QgZGVzY3JpcHRvciBvZiB0eCByaW5nICovCisJdHhkZXNjLT5zdGF0dXMgfD0gY3B1X3RvX2xlMzIoRGVzY0ludHJPblR4KTsKKworCWlmIChpb3JlYWQzMiAobnAtPmJhc2UgKyBUeExpc3RQdHIpID09IDApCisJCWlvd3JpdGUzMiAobnAtPnR4X3JpbmdfZG1hICsgaGVhZCAqIHNpemVvZihzdHJ1Y3QgbmV0ZGV2X2Rlc2MpLAorCQkJbnAtPmJhc2UgKyBUeExpc3RQdHIpOworCXJldHVybjsKK30KKworc3RhdGljIGludAorc3RhcnRfdHggKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldGRldl9kZXNjICp0eGRlc2M7CisJdW5zaWduZWQgZW50cnk7CisKKwkvKiBDYWxjdWxhdGUgdGhlIG5leHQgVHggZGVzY3JpcHRvciBlbnRyeS4gKi8KKwllbnRyeSA9IG5wLT5jdXJfdHggJSBUWF9SSU5HX1NJWkU7CisJbnAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJdHhkZXNjID0gJm5wLT50eF9yaW5nW2VudHJ5XTsKKworCXR4ZGVzYy0+bmV4dF9kZXNjID0gMDsKKwl0eGRlc2MtPnN0YXR1cyA9IGNwdV90b19sZTMyICgoZW50cnkgPDwgMikgfCBEaXNhYmxlQWxpZ24pOworCXR4ZGVzYy0+ZnJhZ1swXS5hZGRyID0gY3B1X3RvX2xlMzIgKHBjaV9tYXBfc2luZ2xlIChucC0+cGNpX2Rldiwgc2tiLT5kYXRhLAorCQkJCQkJCXNrYi0+bGVuLAorCQkJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpKTsKKwl0eGRlc2MtPmZyYWdbMF0ubGVuZ3RoID0gY3B1X3RvX2xlMzIgKHNrYi0+bGVuIHwgTGFzdEZyYWcpOworCisJLyogSW5jcmVtZW50IGN1cl90eCBiZWZvcmUgdGFza2xldF9zY2hlZHVsZSgpICovCisJbnAtPmN1cl90eCsrOworCW1iKCk7CisJLyogU2NoZWR1bGUgYSB0eF9wb2xsKCkgdGFzayAqLworCXRhc2tsZXRfc2NoZWR1bGUoJm5wLT50eF90YXNrbGV0KTsKKworCS8qIE9uIHNvbWUgYXJjaGl0ZWN0dXJlczogZXhwbGljaXRseSBmbHVzaCBjYWNoZSBsaW5lcyBoZXJlLiAqLworCWlmIChucC0+Y3VyX3R4IC0gbnAtPmRpcnR5X3R4IDwgVFhfUVVFVUVfTEVOIC0gMQorCQkJJiYgIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQkvKiBkbyBub3RoaW5nICovCisJfSBlbHNlIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwl9CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJaWYgKG5ldGlmX21zZ190eF9xdWV1ZWQobnApKSB7CisJCXByaW50ayAoS0VSTl9ERUJVRworCQkJIiVzOiBUcmFuc21pdCBmcmFtZSAjJWQgcXVldWVkIGluIHNsb3QgJWQuXG4iLAorCQkJZGV2LT5uYW1lLCBucC0+Y3VyX3R4LCBlbnRyeSk7CisJfQorCXJldHVybiAwOworfQorCisvKiBSZXNldCBoYXJkd2FyZSB0eCBhbmQgZnJlZSBhbGwgb2YgdHggYnVmZmVycyAqLworc3RhdGljIGludAorcmVzZXRfdHggKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBpOworCWludCBpcnEgPSBpbl9pbnRlcnJ1cHQoKTsKKwkKKwkvKiBSZXNldCB0eCBsb2dpYywgVHhMaXN0UHRyIHdpbGwgYmUgY2xlYW5lZCAqLworCWlvd3JpdGUxNiAoVHhEaXNhYmxlLCBpb2FkZHIgKyBNQUNDdHJsMSk7CisJaW93cml0ZTE2IChUeFJlc2V0IHwgRE1BUmVzZXQgfCBGSUZPUmVzZXQgfCBOZXR3b3JrUmVzZXQsCisJCQlpb2FkZHIgKyBBU0lDQ3RybCArIDIpOworCWZvciAoaT01MDsgaSA+IDA7IGktLSkgeworCQlpZiAoKGlvcmVhZDE2KGlvYWRkciArIEFTSUNDdHJsICsgMikgJiBSZXNldEJ1c3kpID09IDApCisJCQlicmVhazsKKwkJbWRlbGF5KDEpOworCX0KKwkvKiBmcmVlIGFsbCB0eCBza2J1ZmYgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJc2tiID0gbnAtPnR4X3NrYnVmZltpXTsKKwkJaWYgKHNrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwgCisJCQkJbnAtPnR4X3JpbmdbaV0uZnJhZ1swXS5hZGRyLCBza2ItPmxlbiwKKwkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWlmIChpcnEpCisJCQkJZGV2X2tmcmVlX3NrYl9pcnEgKHNrYik7CisJCQllbHNlCisJCQkJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKwkJCW5wLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQkJbnAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJfQorCX0KKwlucC0+Y3VyX3R4ID0gbnAtPmRpcnR5X3R4ID0gMDsKKwlucC0+Y3VyX3Rhc2sgPSAwOworCWlvd3JpdGUxNiAoU3RhdHNFbmFibGUgfCBSeEVuYWJsZSB8IFR4RW5hYmxlLCBpb2FkZHIgKyBNQUNDdHJsMSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBjbGVhbnMgdXAgYWZ0ZXIgdGhlIFR4IHRocmVhZCwgCisgICBhbmQgc2NoZWR1bGUgYSBSeCB0aHJlYWQgd29yayAqLworc3RhdGljIGlycXJldHVybl90IGludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCWludCBod19mcmFtZV9pZDsKKwlpbnQgdHhfY250OworCWludCB0eF9zdGF0dXM7CisJaW50IGhhbmRsZWQgPSAwOworCisKKwlkbyB7CisJCWludCBpbnRyX3N0YXR1cyA9IGlvcmVhZDE2KGlvYWRkciArIEludHJTdGF0dXMpOworCQlpb3dyaXRlMTYoaW50cl9zdGF0dXMsIGlvYWRkciArIEludHJTdGF0dXMpOworCisJCWlmIChuZXRpZl9tc2dfaW50cihucCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKworCQlpZiAoIShpbnRyX3N0YXR1cyAmIERFRkFVTFRfSU5UUikpCisJCQlicmVhazsKKworCQloYW5kbGVkID0gMTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiAoSW50clJ4RE1BRG9uZSkpIHsKKwkJCWlvd3JpdGUxNihERUZBVUxUX0lOVFIgJiB+KEludHJSeERvbmV8SW50clJ4RE1BRG9uZSksCisJCQkJCWlvYWRkciArIEludHJFbmFibGUpOworCQkJaWYgKG5wLT5idWRnZXQgPCAwKQorCQkJCW5wLT5idWRnZXQgPSBSWF9CVURHRVQ7CisJCQl0YXNrbGV0X3NjaGVkdWxlKCZucC0+cnhfdGFza2xldCk7CisJCX0KKwkJaWYgKGludHJfc3RhdHVzICYgKEludHJUeERvbmUgfCBJbnRyRHJ2UnFzdCkpIHsKKwkJCXR4X3N0YXR1cyA9IGlvcmVhZDE2IChpb2FkZHIgKyBUeFN0YXR1cyk7CisJCQlmb3IgKHR4X2NudD0zMjsgdHhfc3RhdHVzICYgMHg4MDsgLS10eF9jbnQpIHsKKwkJCQlpZiAobmV0aWZfbXNnX3R4X2RvbmUobnApKQorCQkJCQlwcmludGsKKwkJCQkJICAgICgiJXM6IFRyYW5zbWl0IHN0YXR1cyBpcyAlMi4yeC5cbiIsCisJCQkJICAgICAJZGV2LT5uYW1lLCB0eF9zdGF0dXMpOworCQkJCWlmICh0eF9zdGF0dXMgJiAweDFlKSB7CisJCQkJCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQkJaWYgKHR4X3N0YXR1cyAmIDB4MTApCisJCQkJCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQkJaWYgKHR4X3N0YXR1cyAmIDB4MDgpCisJCQkJCQlucC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJCQlpZiAodHhfc3RhdHVzICYgMHgwMikKKwkJCQkJCW5wLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQkJCS8qIFRoaXMgcmVzZXQgaGFzIG5vdCBiZWVuIHZlcmlmaWVkIS4gKi8KKwkJCQkJaWYgKHR4X3N0YXR1cyAmIDB4MTApIHsJLyogUmVzZXQgdGhlIFR4LiAqLworCQkJCQkJbnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJCQkJCXJlc2V0X3R4KGRldik7CisJCQkJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQkJCQl9CisJCQkJCWlmICh0eF9zdGF0dXMgJiAweDFlKQkvKiBSZXN0YXJ0IHRoZSBUeC4gKi8KKwkJCQkJCWlvd3JpdGUxNiAoVHhFbmFibGUsCisJCQkJCQkJaW9hZGRyICsgTUFDQ3RybDEpOworCQkJCX0KKwkJCQkvKiBZdXAsIHRoaXMgaXMgYSBkb2N1bWVudGF0aW9uIGJ1Zy4gIEl0IGNvc3QgbWUgKmhvdXJzKi4gKi8KKwkJCQlpb3dyaXRlMTYgKDAsIGlvYWRkciArIFR4U3RhdHVzKTsKKwkJCQlpZiAodHhfY250IDwgMCkgeworCQkJCQlpb3dyaXRlMzIoNTAwMCwgaW9hZGRyICsgRG93bkNvdW50ZXIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJdHhfc3RhdHVzID0gaW9yZWFkMTYgKGlvYWRkciArIFR4U3RhdHVzKTsKKwkJCX0KKwkJCWh3X2ZyYW1lX2lkID0gKHR4X3N0YXR1cyA+PiA4KSAmIDB4ZmY7CisJCX0gZWxzZSAJeworCQkJaHdfZnJhbWVfaWQgPSBpb3JlYWQ4KGlvYWRkciArIFR4RnJhbWVJZCk7CisJCX0KKwkJCQorCQlpZiAobnAtPnBjaV9yZXZfaWQgPj0gMHgxNCkgewkKKwkJCXNwaW5fbG9jaygmbnAtPmxvY2spOworCQkJZm9yICg7IG5wLT5jdXJfdHggLSBucC0+ZGlydHlfdHggPiAwOyBucC0+ZGlydHlfdHgrKykgeworCQkJCWludCBlbnRyeSA9IG5wLT5kaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJCWludCBzd19mcmFtZV9pZDsKKwkJCQlzd19mcmFtZV9pZCA9IChsZTMyX3RvX2NwdSgKKwkJCQkJbnAtPnR4X3JpbmdbZW50cnldLnN0YXR1cykgPj4gMikgJiAweGZmOworCQkJCWlmIChzd19mcmFtZV9pZCA9PSBod19mcmFtZV9pZCAmJgorCQkJCQkhKGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMpCisJCQkJCSYgMHgwMDAxMDAwMCkpCisJCQkJCQlicmVhazsKKwkJCQlpZiAoc3dfZnJhbWVfaWQgPT0gKGh3X2ZyYW1lX2lkICsgMSkgJSAKKwkJCQkJVFhfUklOR19TSVpFKQorCQkJCQkJYnJlYWs7CisJCQkJc2tiID0gbnAtPnR4X3NrYnVmZltlbnRyeV07CisJCQkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsCisJCQkJCW5wLT50eF9yaW5nW2VudHJ5XS5mcmFnWzBdLmFkZHIsCisJCQkJCXNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycSAobnAtPnR4X3NrYnVmZltlbnRyeV0pOworCQkJCW5wLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCQlucC0+dHhfcmluZ1tlbnRyeV0uZnJhZ1swXS5hZGRyID0gMDsKKwkJCQlucC0+dHhfcmluZ1tlbnRyeV0uZnJhZ1swXS5sZW5ndGggPSAwOworCQkJfQorCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fbG9jaygmbnAtPmxvY2spOworCQkJZm9yICg7IG5wLT5jdXJfdHggLSBucC0+ZGlydHlfdHggPiAwOyBucC0+ZGlydHlfdHgrKykgeworCQkJCWludCBlbnRyeSA9IG5wLT5kaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJCWlmICghKGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMpIAorCQkJCQkJCSYgMHgwMDAxMDAwMCkpCisJCQkJCWJyZWFrOworCQkJCXNrYiA9IG5wLT50eF9za2J1ZmZbZW50cnldOworCQkJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KKwkJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCQlucC0+dHhfcmluZ1tlbnRyeV0uZnJhZ1swXS5hZGRyLAorCQkJCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEgKG5wLT50eF9za2J1ZmZbZW50cnldKTsKKwkJCQlucC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQkJbnAtPnR4X3JpbmdbZW50cnldLmZyYWdbMF0uYWRkciA9IDA7CisJCQkJbnAtPnR4X3JpbmdbZW50cnldLmZyYWdbMF0ubGVuZ3RoID0gMDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJCX0KKwkJCisJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkJCW5wLT5jdXJfdHggLSBucC0+ZGlydHlfdHggPCBUWF9RVUVVRV9MRU4gLSA0KSB7CisJCQkvKiBUaGUgcmluZyBpcyBubyBsb25nZXIgZnVsbCwgY2xlYXIgYnVzeSBmbGFnLiAqLworCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJfQorCQkvKiBBYm5vcm1hbCBlcnJvciBzdW1tYXJ5L3VuY29tbW9uIGV2ZW50cyBoYW5kbGVycy4gKi8KKwkJaWYgKGludHJfc3RhdHVzICYgKEludHJQQ0lFcnIgfCBMaW5rQ2hhbmdlIHwgU3RhdHNNYXgpKQorCQkJbmV0ZGV2X2Vycm9yKGRldiwgaW50cl9zdGF0dXMpOworCX0gd2hpbGUgKDApOworCWlmIChuZXRpZl9tc2dfaW50cihucCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIHN0YXR1cz0lIzQuNHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQxNihpb2FkZHIgKyBJbnRyU3RhdHVzKSk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ4X3BvbGwodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeSA9IG5wLT5jdXJfcnggJSBSWF9SSU5HX1NJWkU7CisJaW50IGJvZ3VzY250ID0gbnAtPmJ1ZGdldDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCWludCByZWNlaXZlZCA9IDA7CisKKwkvKiBJZiBFT1AgaXMgc2V0IG9uIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgbmV0ZGV2X2Rlc2MgKmRlc2MgPSAmKG5wLT5yeF9yaW5nW2VudHJ5XSk7CisJCXUzMiBmcmFtZV9zdGF0dXMgPSBsZTMyX3RvX2NwdShkZXNjLT5zdGF0dXMpOworCQlpbnQgcGt0X2xlbjsKKworCQlpZiAoLS1ib2d1c2NudCA8IDApIHsKKwkJCWdvdG8gbm90X2RvbmU7CisJCX0KKwkJaWYgKCEoZnJhbWVfc3RhdHVzICYgRGVzY093bikpCisJCQlicmVhazsKKwkJcGt0X2xlbiA9IGZyYW1lX3N0YXR1cyAmIDB4MWZmZjsJLyogQ2hpcCBvbWl0cyB0aGUgQ1JDLiAqLworCQlpZiAobmV0aWZfbXNnX3J4X3N0YXR1cyhucCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiICBuZXRkZXZfcngoKSBzdGF0dXMgd2FzICU4Ljh4LlxuIiwKKwkJCQkgICBmcmFtZV9zdGF0dXMpOworCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDFmNDAwMCkgeworCQkJLyogVGhlcmUgd2FzIGEgZXJyb3IuICovCisJCQlpZiAobmV0aWZfbXNnX3J4X2VycihucCkpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbmV0ZGV2X3J4KCkgUnggZXJyb3Igd2FzICU4Ljh4LlxuIiwKKwkJCQkJICAgZnJhbWVfc3RhdHVzKTsKKwkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiAweDAwMTAwMDAwKSBucC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAwMTAwMDApIG5wLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAwNjAwMDApIG5wLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiAweDAwMDgwMDAwKSBucC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAxMDAwMDApIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3ZlcnNpemVkIEV0aGVybmV0IGZyYW1lLCIKKwkJCQkJICAgIiBzdGF0dXMgJTguOHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIGZyYW1lX3N0YXR1cyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQlpZiAobmV0aWZfbXNnX3J4X3N0YXR1cyhucCkpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbmV0ZGV2X3J4KCkgbm9ybWFsIFJ4IHBrdCBsZW5ndGggJWQiCisJCQkJCSAgICIsIGJvZ3VzX2NudCAlZC5cbiIsCisJCQkJCSAgIHBrdF9sZW4sIGJvZ3VzY250KTsKKyNlbmRpZgorCQkJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBhY2NlcHQgd2l0aG91dCBjb3B5aW5nCisJCQkgICB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCisJCQlpZiAocGt0X2xlbiA8IHJ4X2NvcHlicmVhaworCQkJCSYmIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShucC0+cGNpX2RldiwKKwkJCQkJCQkgICAgZGVzYy0+ZnJhZ1swXS5hZGRyLAorCQkJCQkJCSAgICBucC0+cnhfYnVmX3N6LAorCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIG5wLT5yeF9za2J1ZmZbZW50cnldLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobnAtPnBjaV9kZXYsCisJCQkJCQkJICAgICAgIGRlc2MtPmZyYWdbMF0uYWRkciwKKwkJCQkJCQkgICAgICAgbnAtPnJ4X2J1Zl9zeiwKKwkJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQl9IGVsc2UgeworCQkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsCisJCQkJCWRlc2MtPmZyYWdbMF0uYWRkciwKKwkJCQkJbnAtPnJ4X2J1Zl9zeiwKKwkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlza2JfcHV0KHNrYiA9IG5wLT5yeF9za2J1ZmZbZW50cnldLCBwa3RfbGVuKTsKKwkJCQlucC0+cnhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQl9CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJLyogTm90ZTogY2hlY2tzdW0gLT4gc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsgKi8KKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQl9CisJCWVudHJ5ID0gKGVudHJ5ICsgMSkgJSBSWF9SSU5HX1NJWkU7CisJCXJlY2VpdmVkKys7CisJfQorCW5wLT5jdXJfcnggPSBlbnRyeTsKKwlyZWZpbGxfcnggKGRldik7CisJbnAtPmJ1ZGdldCAtPSByZWNlaXZlZDsKKwlpb3dyaXRlMTYoREVGQVVMVF9JTlRSLCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwlyZXR1cm47CisKK25vdF9kb25lOgorCW5wLT5jdXJfcnggPSBlbnRyeTsKKwlyZWZpbGxfcnggKGRldik7CisJaWYgKCFyZWNlaXZlZCkKKwkJcmVjZWl2ZWQgPSAxOworCW5wLT5idWRnZXQgLT0gcmVjZWl2ZWQ7CisJaWYgKG5wLT5idWRnZXQgPD0gMCkKKwkJbnAtPmJ1ZGdldCA9IFJYX0JVREdFVDsKKwl0YXNrbGV0X3NjaGVkdWxlKCZucC0+cnhfdGFza2xldCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCByZWZpbGxfcnggKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5OworCWludCBjbnQgPSAwOworCisJLyogUmVmaWxsIHRoZSBSeCByaW5nIGJ1ZmZlcnMuICovCisJZm9yICg7KG5wLT5jdXJfcnggLSBucC0+ZGlydHlfcnggKyBSWF9SSU5HX1NJWkUpICUgUlhfUklOR19TSVpFID4gMDsKKwkJbnAtPmRpcnR5X3J4ID0gKG5wLT5kaXJ0eV9yeCArIDEpICUgUlhfUklOR19TSVpFKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWVudHJ5ID0gbnAtPmRpcnR5X3J4ICUgUlhfUklOR19TSVpFOworCQlpZiAobnAtPnJ4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkgeworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihucC0+cnhfYnVmX3N6KTsKKwkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWJyZWFrOwkJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZC4gKi8KKwkJCXNrYi0+ZGV2ID0gZGV2OwkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisJCQlucC0+cnhfcmluZ1tlbnRyeV0uZnJhZ1swXS5hZGRyID0gY3B1X3RvX2xlMzIoCisJCQkJcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+dGFpbCwKKwkJCQkJbnAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCX0KKwkJLyogUGVyaGFwcyB3ZSBuZWVkIG5vdCByZXNldCB0aGlzIGZpZWxkLiAqLworCQlucC0+cnhfcmluZ1tlbnRyeV0uZnJhZ1swXS5sZW5ndGggPQorCQkJY3B1X3RvX2xlMzIobnAtPnJ4X2J1Zl9zeiB8IExhc3RGcmFnKTsKKwkJbnAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyA9IDA7CisJCWNudCsrOworCX0KKwlyZXR1cm47Cit9CitzdGF0aWMgdm9pZCBuZXRkZXZfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJdTE2IG1paV9jdGwsIG1paV9hZHZlcnRpc2UsIG1paV9scGE7CisJaW50IHNwZWVkOworCisJaWYgKGludHJfc3RhdHVzICYgTGlua0NoYW5nZSkgeworCQlpZiAobnAtPmFuX2VuYWJsZSkgeworCQkJbWlpX2FkdmVydGlzZSA9IG1kaW9fcmVhZCAoZGV2LCBucC0+cGh5c1swXSwgTUlJX0FEVkVSVElTRSk7CisJCQltaWlfbHBhPSBtZGlvX3JlYWQgKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9MUEEpOworCQkJbWlpX2FkdmVydGlzZSAmPSBtaWlfbHBhOworCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBMaW5rIGNoYW5nZWQ6ICIsIGRldi0+bmFtZSk7CisJCQlpZiAobWlpX2FkdmVydGlzZSAmIEFEVkVSVElTRV8xMDBGVUxMKSB7CisJCQkJbnAtPnNwZWVkID0gMTAwOworCQkJCXByaW50ayAoIjEwME1icHMsIGZ1bGwgZHVwbGV4XG4iKTsKKwkJCX0gZWxzZSBpZiAobWlpX2FkdmVydGlzZSAmIEFEVkVSVElTRV8xMDBIQUxGKSB7CisJCQkJbnAtPnNwZWVkID0gMTAwOworCQkJCXByaW50ayAoIjEwME1icHMsIGhhbGYgZHVwbGV4XG4iKTsKKwkJCX0gZWxzZSBpZiAobWlpX2FkdmVydGlzZSAmIEFEVkVSVElTRV8xMEZVTEwpIHsKKwkJCQlucC0+c3BlZWQgPSAxMDsKKwkJCQlwcmludGsgKCIxME1icHMsIGZ1bGwgZHVwbGV4XG4iKTsKKwkJCX0gZWxzZSBpZiAobWlpX2FkdmVydGlzZSAmIEFEVkVSVElTRV8xMEhBTEYpIHsKKwkJCQlucC0+c3BlZWQgPSAxMDsKKwkJCQlwcmludGsgKCIxME1icHMsIGhhbGYgZHVwbGV4XG4iKTsKKwkJCX0gZWxzZQorCQkJCXByaW50ayAoIlxuIik7CisKKwkJfSBlbHNlIHsKKwkJCW1paV9jdGwgPSBtZGlvX3JlYWQgKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTUNSKTsKKwkJCXNwZWVkID0gKG1paV9jdGwgJiBCTUNSX1NQRUVEMTAwKSA/IDEwMCA6IDEwOworCQkJbnAtPnNwZWVkID0gc3BlZWQ7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IExpbmsgY2hhbmdlZDogJWRNYnBzICwiLAorCQkJCWRldi0+bmFtZSwgc3BlZWQpOworCQkJcHJpbnRrICgiJXMgZHVwbGV4LlxuIiwgKG1paV9jdGwgJiBCTUNSX0ZVTExEUExYKSA/CisJCQkJImZ1bGwiIDogImhhbGYiKTsKKwkJfQorCQljaGVja19kdXBsZXggKGRldik7CisJCWlmIChucC0+Zmxvd2N0cmwgJiYgbnAtPm1paV9pZi5mdWxsX2R1cGxleCkgeworCQkJaW93cml0ZTE2KGlvcmVhZDE2KGlvYWRkciArIE11bHRpY2FzdEZpbHRlcjErMikgfCAweDAyMDAsCisJCQkJaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMSsyKTsKKwkJCWlvd3JpdGUxNihpb3JlYWQxNihpb2FkZHIgKyBNQUNDdHJsMCkgfCBFbmJGbG93Q3RybCwKKwkJCQlpb2FkZHIgKyBNQUNDdHJsMCk7CisJCX0KKwl9CisJaWYgKGludHJfc3RhdHVzICYgU3RhdHNNYXgpIHsKKwkJZ2V0X3N0YXRzKGRldik7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIEludHJQQ0lFcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogU29tZXRoaW5nIFdpY2tlZCBoYXBwZW5lZCEgJTQuNHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisJCS8qIFdlIG11c3QgZG8gYSBnbG9iYWwgcmVzZXQgb2YgRE1BIHRvIGNvbnRpbnVlLiAqLworCX0KK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCWludCBpOworCisJLyogV2Ugc2hvdWxkIGxvY2sgdGhpcyBzZWdtZW50IG9mIGNvZGUgZm9yIFNNUCBldmVudHVhbGx5LCBhbHRob3VnaAorCSAgIHRoZSB2dWxuZXJhYmlsaXR5IHdpbmRvdyBpcyB2ZXJ5IHNtYWxsIGFuZCBzdGF0aXN0aWNzIGFyZQorCSAgIG5vbi1jcml0aWNhbC4gKi8KKwkvKiBUaGUgY2hpcCBvbmx5IG5lZWQgcmVwb3J0IGZyYW1lIHNpbGVudGx5IGRyb3BwZWQuICovCisJbnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMJKz0gaW9yZWFkOChpb2FkZHIgKyBSeE1pc3NlZCk7CisJbnAtPnN0YXRzLnR4X3BhY2tldHMgKz0gaW9yZWFkMTYoaW9hZGRyICsgVHhGcmFtZXNPSyk7CisJbnAtPnN0YXRzLnJ4X3BhY2tldHMgKz0gaW9yZWFkMTYoaW9hZGRyICsgUnhGcmFtZXNPSyk7CisJbnAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gaW9yZWFkOChpb2FkZHIgKyBTdGF0c0xhdGVDb2xsKTsKKwlucC0+c3RhdHMuY29sbGlzaW9ucyArPSBpb3JlYWQ4KGlvYWRkciArIFN0YXRzTXVsdGlDb2xsKTsKKwlucC0+c3RhdHMuY29sbGlzaW9ucyArPSBpb3JlYWQ4KGlvYWRkciArIFN0YXRzT25lQ29sbCk7CisJbnAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzICs9IGlvcmVhZDgoaW9hZGRyICsgU3RhdHNDYXJyaWVyRXJyb3IpOworCWlvcmVhZDgoaW9hZGRyICsgU3RhdHNUeERlZmVyKTsKKwlmb3IgKGkgPSBTdGF0c1R4RGVmZXI7IGkgPD0gU3RhdHNNY2FzdFJ4OyBpKyspCisJCWlvcmVhZDgoaW9hZGRyICsgaSk7CisJbnAtPnN0YXRzLnR4X2J5dGVzICs9IGlvcmVhZDE2KGlvYWRkciArIFR4T2N0ZXRzTG93KTsKKwlucC0+c3RhdHMudHhfYnl0ZXMgKz0gaW9yZWFkMTYoaW9hZGRyICsgVHhPY3RldHNIaWdoKSA8PCAxNjsKKwlucC0+c3RhdHMucnhfYnl0ZXMgKz0gaW9yZWFkMTYoaW9hZGRyICsgUnhPY3RldHNMb3cpOworCW5wLT5zdGF0cy5yeF9ieXRlcyArPSBpb3JlYWQxNihpb2FkZHIgKyBSeE9jdGV0c0hpZ2gpIDw8IDE2OworCisJcmV0dXJuICZucC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwl1MTYgbWNfZmlsdGVyWzRdOwkJCS8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworCXUzMiByeF9tb2RlOworCWludCBpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkJCS8qIFNldCBwcm9taXNjdW91cy4gKi8KKwkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJbWVtc2V0KG1jX2ZpbHRlciwgMHhmZiwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlyeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0QWxsIHwgQWNjZXB0TXlQaHlzOworCX0gZWxzZSBpZiAoKGRldi0+bWNfY291bnQgPiBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0KQorCQkJICAgfHwgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBtYXRjaCwgb3IgYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQltZW1zZXQobWNfZmlsdGVyLCAweGZmLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCXJ4X21vZGUgPSBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXM7CisJfSBlbHNlIGlmIChkZXYtPm1jX2NvdW50KSB7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQlpbnQgYml0OworCQlpbnQgaW5kZXg7CisJCWludCBjcmM7CisJCW1lbXNldCAobWNfZmlsdGVyLCAwLCBzaXplb2YgKG1jX2ZpbHRlcikpOworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsKKwkJICAgICBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJY3JjID0gZXRoZXJfY3JjX2xlIChFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcik7CisJCQlmb3IgKGluZGV4PTAsIGJpdD0wOyBiaXQgPCA2OyBiaXQrKywgY3JjIDw8PSAxKQorCQkJCWlmIChjcmMgJiAweDgwMDAwMDAwKSBpbmRleCB8PSAxIDw8IGJpdDsKKwkJCW1jX2ZpbHRlcltpbmRleC8xNl0gfD0gKDEgPDwgKGluZGV4ICUgMTYpKTsKKwkJfQorCQlyeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGlIYXNoIHwgQWNjZXB0TXlQaHlzOworCX0gZWxzZSB7CisJCWlvd3JpdGU4KEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE15UGh5cywgaW9hZGRyICsgUnhNb2RlKTsKKwkJcmV0dXJuOworCX0KKwlpZiAobnAtPm1paV9pZi5mdWxsX2R1cGxleCAmJiBucC0+Zmxvd2N0cmwpCisJCW1jX2ZpbHRlclszXSB8PSAweDAyMDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlpb3dyaXRlMTYobWNfZmlsdGVyW2ldLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIwICsgaSoyKTsKKwlpb3dyaXRlOChyeF9tb2RlLCBpb2FkZHIgKyBSeE1vZGUpOworfQorCitzdGF0aWMgaW50IF9fc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdTE2IGFkZHIxNjsKKworCWFkZHIxNiA9IChkZXYtPmRldl9hZGRyWzBdIHwgKGRldi0+ZGV2X2FkZHJbMV0gPDwgOCkpOworCWlvd3JpdGUxNihhZGRyMTYsIG5wLT5iYXNlICsgU3RhdGlvbkFkZHIpOworCWFkZHIxNiA9IChkZXYtPmRldl9hZGRyWzJdIHwgKGRldi0+ZGV2X2FkZHJbM10gPDwgOCkpOworCWlvd3JpdGUxNihhZGRyMTYsIG5wLT5iYXNlICsgU3RhdGlvbkFkZHIrMik7CisJYWRkcjE2ID0gKGRldi0+ZGV2X2FkZHJbNF0gfCAoZGV2LT5kZXZfYWRkcls1XSA8PCA4KSk7CisJaW93cml0ZTE2KGFkZHIxNiwgbnAtPmJhc2UgKyBTdGF0aW9uQWRkcis0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19pZl9ydW5uaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKK30KKworc3RhdGljIGludCBnZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwltaWlfZXRodG9vbF9nc2V0KCZucC0+bWlpX2lmLCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXM7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXJlcyA9IG1paV9ldGh0b29sX3NzZXQoJm5wLT5taWlfaWYsIGVjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBtaWlfbndheV9yZXN0YXJ0KCZucC0+bWlpX2lmKTsKK30KKworc3RhdGljIHUzMiBnZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBtaWlfbGlua19vaygmbnAtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIG5wLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZCBzZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlucC0+bXNnX2VuYWJsZSA9IHZhbDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBldGh0b29sX29wcyA9IHsKKwkuYmVnaW4gPSBjaGVja19pZl9ydW5uaW5nLAorCS5nZXRfZHJ2aW5mbyA9IGdldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MgPSBnZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyA9IHNldF9zZXR0aW5ncywKKwkubndheV9yZXNldCA9IG53YXlfcmVzZXQsCisJLmdldF9saW5rID0gZ2V0X2xpbmssCisJLmdldF9tc2dsZXZlbCA9IGdldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsID0gc2V0X21zZ2xldmVsLAorfTsKKworc3RhdGljIGludCBuZXRkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCWludCByYzsKKwlpbnQgaTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyYyA9IGdlbmVyaWNfbWlpX2lvY3RsKCZucC0+bWlpX2lmLCBpZl9taWkocnEpLCBjbWQsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgU0lPQ0RFVlBSSVZBVEU6CisJCWZvciAoaT0wOyBpPFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJTAyeCAlMDhsbHggJTA4eCAlMDh4KCUwMngpICUwOHggJTA4eFxuIiwgaSwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKShucC0+dHhfcmluZ19kbWEgKyBpKnNpemVvZigqbnAtPnR4X3JpbmcpKSwJCisJCQkJbGUzMl90b19jcHUobnAtPnR4X3JpbmdbaV0ubmV4dF9kZXNjKSwKKwkJCQlsZTMyX3RvX2NwdShucC0+dHhfcmluZ1tpXS5zdGF0dXMpLAorCQkJCShsZTMyX3RvX2NwdShucC0+dHhfcmluZ1tpXS5zdGF0dXMpID4+IDIpIAorCQkJCQkmIDB4ZmYsCisJCQkJbGUzMl90b19jcHUobnAtPnR4X3JpbmdbaV0uZnJhZ1swXS5hZGRyKSwgCisJCQkJbGUzMl90b19jcHUobnAtPnR4X3JpbmdbaV0uZnJhZ1swXS5sZW5ndGgpKTsKKwkJfQorCQlwcmludGsoS0VSTl9ERUJVRyAiVHhMaXN0UHRyPSUwOHggbmV0aWZfcXVldWVfc3RvcHBlZD0lZFxuIiwgCisJCQlpb3JlYWQzMihucC0+YmFzZSArIFR4TGlzdFB0ciksIAorCQkJbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImN1cl90eD0lZCglMDJ4KSBkaXJ0eV90eD0lZCglMDJ4KVxuIiwgCisJCQlucC0+Y3VyX3R4LCBucC0+Y3VyX3R4ICUgVFhfUklOR19TSVpFLAorCQkJbnAtPmRpcnR5X3R4LCBucC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiY3VyX3J4PSVkIGRpcnR5X3J4PSVkXG4iLCBucC0+Y3VyX3J4LCBucC0+ZGlydHlfcngpOworCQlwcmludGsoS0VSTl9ERUJVRyAiY3VyX3Rhc2s9JWRcbiIsIG5wLT5jdXJfdGFzayk7CisJCXByaW50ayhLRVJOX0RFQlVHICJUeFN0YXR1cz0lMDR4XG4iLCBpb3JlYWQxNihpb2FkZHIgKyBUeFN0YXR1cykpOworCQkJcmV0dXJuIDA7CisJfQorCQkJCQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChuZXRpZl9tc2dfaWZkb3duKG5wKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzIFR4ICUyLjJ4ICIKKwkJCSAgICJSeCAlNC40eCBJbnQgJTIuMnguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQ4KGlvYWRkciArIFR4U3RhdHVzKSwKKwkJCSAgIGlvcmVhZDMyKGlvYWRkciArIFJ4U3RhdHVzKSwgaW9yZWFkMTYoaW9hZGRyICsgSW50clN0YXR1cykpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFF1ZXVlIHBvaW50ZXJzIHdlcmUgVHggJWQgLyAlZCwgIFJ4ICVkIC8gJWQuXG4iLAorCQkJICAgZGV2LT5uYW1lLCBucC0+Y3VyX3R4LCBucC0+ZGlydHlfdHgsIG5wLT5jdXJfcngsIG5wLT5kaXJ0eV9yeCk7CisJfQorCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlpb3dyaXRlMTYoMHgwMDAwLCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKworCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworCWlvd3JpdGUxNihUeERpc2FibGUgfCBSeERpc2FibGUgfCBTdGF0c0Rpc2FibGUsIGlvYWRkciArIE1BQ0N0cmwxKTsKKworCS8qIFdhaXQgYW5kIGtpbGwgdGFza2xldCAqLworCXRhc2tsZXRfa2lsbCgmbnAtPnJ4X3Rhc2tsZXQpOworCXRhc2tsZXRfa2lsbCgmbnAtPnR4X3Rhc2tsZXQpOworCisjaWZkZWYgX19pMzg2X18KKwlpZiAobmV0aWZfbXNnX2h3KG5wKSkgeworCQlwcmludGsoIlxuIktFUk5fREVCVUciICBUeCByaW5nIGF0ICU4Ljh4OlxuIiwKKwkJCSAgIChpbnQpKG5wLT50eF9yaW5nX2RtYSkpOworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAjJWQgZGVzYy4gJTQuNHggJTguOHggJTguOHguXG4iLAorCQkJCSAgIGksIG5wLT50eF9yaW5nW2ldLnN0YXR1cywgbnAtPnR4X3JpbmdbaV0uZnJhZ1swXS5hZGRyLAorCQkJCSAgIG5wLT50eF9yaW5nW2ldLmZyYWdbMF0ubGVuZ3RoKTsKKwkJcHJpbnRrKCJcbiJLRVJOX0RFQlVHICIgIFJ4IHJpbmcgJTguOHg6XG4iLAorCQkJICAgKGludCkobnAtPnJ4X3JpbmdfZG1hKSk7CisJCWZvciAoaSA9IDA7IGkgPCAvKlJYX1JJTkdfU0laRSovNCA7IGkrKykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAjJWQgZGVzYy4gJTQuNHggJTQuNHggJTguOHhcbiIsCisJCQkJICAgaSwgbnAtPnJ4X3JpbmdbaV0uc3RhdHVzLCBucC0+cnhfcmluZ1tpXS5mcmFnWzBdLmFkZHIsCisJCQkJICAgbnAtPnJ4X3JpbmdbaV0uZnJhZ1swXS5sZW5ndGgpOworCQl9CisJfQorI2VuZGlmIC8qIF9faTM4Nl9fIGRlYnVnZ2luZyBvbmx5ICovCisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCWRlbF90aW1lcl9zeW5jKCZucC0+dGltZXIpOworCisJLyogRnJlZSBhbGwgdGhlIHNrYnVmZnMgaW4gdGhlIFJ4IHF1ZXVlLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlucC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOworCQlucC0+cnhfcmluZ1tpXS5mcmFnWzBdLmFkZHIgPSAweEJBREYwMEQwOyAvKiBBbiBpbnZhbGlkIGFkZHJlc3MuICovCisJCXNrYiA9IG5wLT5yeF9za2J1ZmZbaV07CisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsCisJCQkJbnAtPnJ4X3JpbmdbaV0uZnJhZ1swXS5hZGRyLCBucC0+cnhfYnVmX3N6LAorCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlucC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJc2tiID0gbnAtPnR4X3NrYnVmZltpXTsKKwkJaWYgKHNrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQlucC0+dHhfcmluZ1tpXS5mcmFnWzBdLmFkZHIsIHNrYi0+bGVuLAorCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJbnAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHN1bmRhbmNlX3JlbW92ZTEgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoZGV2KSB7CisJCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgICAgIAlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFJYX1RPVEFMX1NJWkUsIG5wLT5yeF9yaW5nLAorCQkJbnAtPnJ4X3JpbmdfZG1hKTsKKwkgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgbnAtPnR4X3JpbmcsCisJCQlucC0+dHhfcmluZ19kbWEpOworCQlwY2lfaW91bm1hcChwZGV2LCBucC0+YmFzZSk7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzdW5kYW5jZV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0gc3VuZGFuY2VfcGNpX3RibCwKKwkucHJvYmUJCT0gc3VuZGFuY2VfcHJvYmUxLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc3VuZGFuY2VfcmVtb3ZlMSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzdW5kYW5jZV9pbml0KHZvaWQpCit7CisvKiB3aGVuIGEgbW9kdWxlLCB0aGlzIGlzIHByaW50ZWQgd2hldGhlciBvciBub3QgZGV2aWNlcyBhcmUgZm91bmQgaW4gcHJvYmUgKi8KKyNpZmRlZiBNT0RVTEUKKwlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZzdW5kYW5jZV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc3VuZGFuY2VfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc3VuZGFuY2VfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc3VuZGFuY2VfaW5pdCk7Cittb2R1bGVfZXhpdChzdW5kYW5jZV9leGl0KTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5nZW0uYyBiL2RyaXZlcnMvbmV0L3N1bmdlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDUwZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwpAQCAtMCwwICsxLDMyMDQgQEAKKy8qICRJZDogc3VuZ2VtLmMsdiAxLjQ0LjIuMjIgMjAwMi8wMy8xMyAwMToxODoxMiBkYXZlbSBFeHAgJAorICogc3VuZ2VtLmM6IFN1biBHRU0gZXRoZXJuZXQgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKiAKKyAqIFN1cHBvcnQgZm9yIEFwcGxlIEdNQUMgYW5kIGFzc29ydGVkIFBIWXMsIFdPTCwgUG93ZXIgTWFuYWdlbWVudAorICogKEMpIDIwMDEsMjAwMiwyMDAzIEJlbmphbWluIEhlcnJlbnNjbWlkdCAoYmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnKQorICogKEMpIDIwMDQsMjAwNSBCZW5qYW1pbiBIZXJyZW5zY21pZHQsIElCTSBDb3JwLgorICoKKyAqIE5BUEkgYW5kIE5FVFBPTEwgc3VwcG9ydAorICogKEMpIDIwMDQgYnkgRXJpYyBMZW1vaW5lIChlcmljLmxlbW9pbmVAZ21haWwuY29tKQorICogCisgKiBUT0RPOiAKKyAqICAtIE5vdyB0aGF0IHRoZSBkcml2ZXIgd2FzIHNpZ25pZmljYW50bHkgc2ltcGxpZmllZCwgSSBuZWVkIHRvIHJld29yaworICogICAgdGhlIGxvY2tpbmcuIEknbSBzdXJlIHdlIGRvbid0IG5lZWQgXzJfIHNwaW5sb2NrcywgYW5kIHdlIHByb2JhYmx5CisgKiAgICBjYW4gYXZvaWQgdGFraW5nIG1vc3Qgb2YgdGhlbSBmb3Igc28gbG9uZyBwZXJpb2Qgb2YgdGltZSAoYW5kIHNjaGVkdWxlCisgKiAgICBpbnN0ZWFkKS4gVGhlIG1haW4gaXNzdWVzIGF0IHRoaXMgcG9pbnQgYXJlIGNhdXNlZCBieSB0aGUgbmV0ZGV2IGxheWVyCisgKiAgICB0aG91Z2g6CisgKiAgICAKKyAqICAgIGdlbV9jaGFuZ2VfbXR1KCkgYW5kIGdlbV9zZXRfbXVsdGljYXN0KCkgYXJlIGNhbGxlZCB3aXRoIGEgcmVhZF9sb2NrKCkKKyAqICAgIGhlbHAgYnkgbmV0L2NvcmUvZGV2LmMsIHRodXMgdGhleSBjYW4ndCBzY2hlZHVsZS4gVGhhdCBtZWFucyB0aGV5IGNhbid0CisgKiAgICBjYWxsIG5ldGlmX3BvbGxfZGlzYWJsZSgpIG5laXRoZXIsIHRodXMgZm9yY2UgZ2VtX3BvbGwoKSB0byBrZWVwIGEgc3BpbmxvY2sKKyAqICAgIHdoZXJlIGl0IGNvdWxkIGhhdmUgYmVlbiBkcm9wcGVkLiBjaGFuZ2VfbXR1IGVzcGVjaWFsbHkgd291bGQgbG92ZSBhbHNvIHRvCisgKiAgICBiZSBhYmxlIHRvIG1zbGVlcCBpbnN0ZWFkIG9mIGhvcnJpZCBsb2NrZWQgZGVsYXlzIHdoZW4gcmVzZXR0aW5nIHRoZSBIVywKKyAqICAgIGJ1dCB0aGF0IHJlYWRfbG9jaygpIG1ha2VzIGl0IGltcG9zc2libGUsIHVubGVzcyBJIGRlZmVyIGl0J3MgYWN0aW9uIHRvCisgKiAgICB0aGUgcmVzZXQgdGFzaywgd2hpY2ggbWVhbnMgaXQnbGwgYmUgYXN5bmNocm9ub3VzICh3b24ndCB0YWtlIGVmZmVjdCB1bnRpbAorICogICAgdGhlIHN5c3RlbSBzY2hlZHVsZXMgYSBiaXQpLgorICoKKyAqICAgIEFsc28sIGl0IHdvdWxkIHByb2JhYmx5IGJlIHBvc3NpYmxlIHRvIGFsc28gcmVtb3ZlIG1vc3Qgb2YgdGhlIGxvbmctbGlmZQorICogICAgbG9ja2luZyBpbiBvcGVuL3Jlc3VtZSBjb2RlIHBhdGggKGdlbV9yZWluaXRfY2hpcCkgYnkgYmVlaW5nIG1vcmUgY2FyZWZ1bAorICogICAgYWJvdXQgd2hlbiB3ZSBjYW4gc3RhcnQgdGFraW5nIGludGVycnVwdHMgb3IgZ2V0IHhtaXQoKSBjYWxsZWQuLi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaWZkZWYgX19zcGFyY19fCisjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgorI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9wYm0uaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzdW5nZW1fcGh5LmgiCisjaW5jbHVkZSAic3VuZ2VtLmgiCisKKy8qIFN0cmlwcGluZyBGQ1MgaXMgY2F1c2luZyBwcm9ibGVtcywgZGlzYWJsZWQgZm9yIG5vdyAqLworI3VuZGVmIFNUUklQX0ZDUworCisjZGVmaW5lIERFRkFVTFRfTVNHCShORVRJRl9NU0dfRFJWCQl8IFwKKwkJCSBORVRJRl9NU0dfUFJPQkUJfCBcCisJCQkgTkVUSUZfTVNHX0xJTkspCisKKyNkZWZpbmUgQURWRVJUSVNFX01BU0sJKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwgXAorCQkJIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfCBcCisJCQkgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsKQorCisjZGVmaW5lIERSVl9OQU1FCSJzdW5nZW0iCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjk4IgorI2RlZmluZSBEUlZfUkVMREFURQkiOC8yNC8wMyIKKyNkZWZpbmUgRFJWX0FVVEhPUgkiRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKSIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorICAgICAgICBEUlZfTkFNRSAiLmM6diIgRFJWX1ZFUlNJT04gIiAiIERSVl9SRUxEQVRFICIgIiBEUlZfQVVUSE9SICJcbiI7CisKK01PRFVMRV9BVVRIT1IoRFJWX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1biBHRU0gR2JpdCBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBHRU1fTU9EVUxFX05BTUUJImdlbSIKKyNkZWZpbmUgUEZYIEdFTV9NT0RVTEVfTkFNRSAiOiAiCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBnZW1fcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9TVU4sIFBDSV9ERVZJQ0VfSURfU1VOX0dFTSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCisJLyogVGhlc2UgbW9kZWxzIG9ubHkgZGlmZmVyIGZyb20gdGhlIG9yaWdpbmFsIEdFTSBpbgorCSAqIHRoYXQgdGhlaXIgdHgvcnggZmlmb3MgYXJlIG9mIGEgZGlmZmVyZW50IHNpemUgYW5kCisJICogdGhleSBvbmx5IHN1cHBvcnQgMTAvMTAwIHNwZWVkcy4gLURhdmVNCisJICogCisJICogQXBwbGUncyBHTUFDIGRvZXMgc3VwcG9ydCBnaWdhYml0IG9uIG1hY2hpbmVzIHdpdGgKKwkgKiB0aGUgQkNNNTR4eCBQSFlzLiAtQmVuSAorCSAqLworCXsgUENJX1ZFTkRPUl9JRF9TVU4sIFBDSV9ERVZJQ0VfSURfU1VOX1JJT19HRU0sCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQVBQTEUsIFBDSV9ERVZJQ0VfSURfQVBQTEVfVU5JX05fR01BQywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9BUFBMRSwgUENJX0RFVklDRV9JRF9BUFBMRV9VTklfTl9HTUFDUCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9BUFBMRSwgUENJX0RFVklDRV9JRF9BUFBMRV9VTklfTl9HTUFDMiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9BUFBMRSwgUENJX0RFVklDRV9JRF9BUFBMRV9LMl9HTUFDLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FQUExFLCBQQ0lfREVWSUNFX0lEX0FQUExFX1NIX1NVTkdFTSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXswLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZ2VtX3BjaV90YmwpOworCitzdGF0aWMgdTE2IF9fcGh5X3JlYWQoc3RydWN0IGdlbSAqZ3AsIGludCBwaHlfYWRkciwgaW50IHJlZykKK3sKKwl1MzIgY21kOworCWludCBsaW1pdCA9IDEwMDAwOworCisJY21kICA9ICgxIDw8IDMwKTsKKwljbWQgfD0gKDIgPDwgMjgpOworCWNtZCB8PSAocGh5X2FkZHIgPDwgMjMpICYgTUlGX0ZSQU1FX1BIWUFEOworCWNtZCB8PSAocmVnIDw8IDE4KSAmIE1JRl9GUkFNRV9SRUdBRDsKKwljbWQgfD0gKE1JRl9GUkFNRV9UQU1TQik7CisJd3JpdGVsKGNtZCwgZ3AtPnJlZ3MgKyBNSUZfRlJBTUUpOworCisJd2hpbGUgKGxpbWl0LS0pIHsKKwkJY21kID0gcmVhZGwoZ3AtPnJlZ3MgKyBNSUZfRlJBTUUpOworCQlpZiAoY21kICYgTUlGX0ZSQU1FX1RBTFNCKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlpZiAoIWxpbWl0KQorCQljbWQgPSAweGZmZmY7CisKKwlyZXR1cm4gY21kICYgTUlGX0ZSQU1FX0RBVEE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9waHlfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnKQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCXJldHVybiBfX3BoeV9yZWFkKGdwLCBtaWlfaWQsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHBoeV9yZWFkKHN0cnVjdCBnZW0gKmdwLCBpbnQgcmVnKQoreworCXJldHVybiBfX3BoeV9yZWFkKGdwLCBncC0+bWlpX3BoeV9hZGRyLCByZWcpOworfQorCitzdGF0aWMgdm9pZCBfX3BoeV93cml0ZShzdHJ1Y3QgZ2VtICpncCwgaW50IHBoeV9hZGRyLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCXUzMiBjbWQ7CisJaW50IGxpbWl0ID0gMTAwMDA7CisKKwljbWQgID0gKDEgPDwgMzApOworCWNtZCB8PSAoMSA8PCAyOCk7CisJY21kIHw9IChwaHlfYWRkciA8PCAyMykgJiBNSUZfRlJBTUVfUEhZQUQ7CisJY21kIHw9IChyZWcgPDwgMTgpICYgTUlGX0ZSQU1FX1JFR0FEOworCWNtZCB8PSAoTUlGX0ZSQU1FX1RBTVNCKTsKKwljbWQgfD0gKHZhbCAmIE1JRl9GUkFNRV9EQVRBKTsKKwl3cml0ZWwoY21kLCBncC0+cmVncyArIE1JRl9GUkFNRSk7CisKKwl3aGlsZSAobGltaXQtLSkgeworCQljbWQgPSByZWFkbChncC0+cmVncyArIE1JRl9GUkFNRSk7CisJCWlmIChjbWQgJiBNSUZfRlJBTUVfVEFMU0IpCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTApOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIF9waHlfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZywgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwlfX3BoeV93cml0ZShncCwgbWlpX2lkLCByZWcsIHZhbCAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwaHlfd3JpdGUoc3RydWN0IGdlbSAqZ3AsIGludCByZWcsIHUxNiB2YWwpCit7CisJX19waHlfd3JpdGUoZ3AsIGdwLT5taWlfcGh5X2FkZHIsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbV9lbmFibGVfaW50cyhzdHJ1Y3QgZ2VtICpncCkKK3sKKwkvKiBFbmFibGUgYWxsIGludGVycnVwdHMgYnV0IFRYRE9ORSAqLworCXdyaXRlbChHUkVHX1NUQVRfVFhET05FLCBncC0+cmVncyArIEdSRUdfSU1BU0spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VtX2Rpc2FibGVfaW50cyhzdHJ1Y3QgZ2VtICpncCkKK3sKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLCBpbmNsdWRpbmcgVFhET05FICovCisJd3JpdGVsKEdSRUdfU1RBVF9OQVBJIHwgR1JFR19TVEFUX1RYRE9ORSwgZ3AtPnJlZ3MgKyBHUkVHX0lNQVNLKTsKK30KKworc3RhdGljIHZvaWQgZ2VtX2dldF9jZWxsKHN0cnVjdCBnZW0gKmdwKQoreworCUJVR19PTihncC0+Y2VsbF9lbmFibGVkIDwgMCk7CisJZ3AtPmNlbGxfZW5hYmxlZCsrOworI2lmZGVmIENPTkZJR19QUENfUE1BQworCWlmIChncC0+Y2VsbF9lbmFibGVkID09IDEpIHsKKwkJbWIoKTsKKwkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfR01BQ19FTkFCTEUsIGdwLT5vZl9ub2RlLCAwLCAxKTsKKwkJdWRlbGF5KDEwKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCit9CisKKy8qIFR1cm4gb2ZmIHRoZSBjaGlwJ3MgY2xvY2sgKi8KK3N0YXRpYyB2b2lkIGdlbV9wdXRfY2VsbChzdHJ1Y3QgZ2VtICpncCkKK3sKKwlCVUdfT04oZ3AtPmNlbGxfZW5hYmxlZCA8PSAwKTsKKwlncC0+Y2VsbF9lbmFibGVkLS07CisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJaWYgKGdwLT5jZWxsX2VuYWJsZWQgPT0gMCkgeworCQltYigpOworCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9HTUFDX0VOQUJMRSwgZ3AtPm9mX25vZGUsIDAsIDApOworCQl1ZGVsYXkoMTApOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KK30KKworc3RhdGljIHZvaWQgZ2VtX2hhbmRsZV9taWZfZXZlbnQoc3RydWN0IGdlbSAqZ3AsIHUzMiByZWdfdmFsLCB1MzIgY2hhbmdlZF9iaXRzKQoreworCWlmIChuZXRpZl9tc2dfaW50cihncCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogbWlmIGludGVycnVwdFxuIiwgZ3AtPmRldi0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgZ2VtX3Bjc19pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGdlbSAqZ3AsIHUzMiBnZW1fc3RhdHVzKQoreworCXUzMiBwY3NfaXN0YXQgPSByZWFkbChncC0+cmVncyArIFBDU19JU1RBVCk7CisJdTMyIHBjc19taWlzdGF0OworCisJaWYgKG5ldGlmX21zZ19pbnRyKGdwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwY3MgaW50ZXJydXB0LCBwY3NfaXN0YXQ6IDB4JXhcbiIsCisJCQlncC0+ZGV2LT5uYW1lLCBwY3NfaXN0YXQpOworCisJaWYgKCEocGNzX2lzdGF0ICYgUENTX0lTVEFUX0xTQykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUENTIGlycSBidXQgbm8gbGluayBzdGF0dXMgY2hhbmdlPz8/XG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVGhlIGxpbmsgc3RhdHVzIGJpdCBsYXRjaGVzIG9uIHplcm8sIHNvIHlvdSBtdXN0CisJICogcmVhZCBpdCB0d2ljZSBpbiBzdWNoIGEgY2FzZSB0byBzZWUgYSB0cmFuc2l0aW9uCisJICogdG8gdGhlIGxpbmsgYmVpbmcgdXAuCisJICovCisJcGNzX21paXN0YXQgPSByZWFkbChncC0+cmVncyArIFBDU19NSUlTVEFUKTsKKwlpZiAoIShwY3NfbWlpc3RhdCAmIFBDU19NSUlTVEFUX0xTKSkKKwkJcGNzX21paXN0YXQgfD0KKwkJCShyZWFkbChncC0+cmVncyArIFBDU19NSUlTVEFUKSAmCisJCQkgUENTX01JSVNUQVRfTFMpOworCisJaWYgKHBjc19taWlzdGF0ICYgUENTX01JSVNUQVRfQU5DKSB7CisJCS8qIFRoZSByZW1vdGUtZmF1bHQgaW5kaWNhdGlvbiBpcyBvbmx5IHZhbGlkCisJCSAqIHdoZW4gYXV0b25lZyBoYXMgY29tcGxldGVkLgorCQkgKi8KKwkJaWYgKHBjc19taWlzdGF0ICYgUENTX01JSVNUQVRfUkYpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUENTIEF1dG9ORUcgY29tcGxldGUsICIKKwkJCSAgICAgICAiUmVtb3RlRmF1bHRcbiIsIGRldi0+bmFtZSk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQQ1MgQXV0b05FRyBjb21wbGV0ZS5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwl9CisKKwlpZiAocGNzX21paXN0YXQgJiBQQ1NfTUlJU1RBVF9MUykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogUENTIGxpbmsgaXMgbm93IHVwLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCW5ldGlmX2NhcnJpZXJfb24oZ3AtPmRldik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBDUyBsaW5rIGlzIG5vdyBkb3duLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGdwLT5kZXYpOworCQkvKiBJZiB0aGlzIGhhcHBlbnMgYW5kIHRoZSBsaW5rIHRpbWVyIGlzIG5vdCBydW5uaW5nLAorCQkgKiByZXNldCBzbyB3ZSByZS1uZWdvdGlhdGUuCisJCSAqLworCQlpZiAoIXRpbWVyX3BlbmRpbmcoJmdwLT5saW5rX3RpbWVyKSkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbV90eG1hY19pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGdlbSAqZ3AsIHUzMiBnZW1fc3RhdHVzKQoreworCXUzMiB0eG1hY19zdGF0ID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfVFhTVEFUKTsKKworCWlmIChuZXRpZl9tc2dfaW50cihncCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHhtYWMgaW50ZXJydXB0LCB0eG1hY19zdGF0OiAweCV4XG4iLAorCQkJZ3AtPmRldi0+bmFtZSwgdHhtYWNfc3RhdCk7CisKKwkvKiBEZWZlciB0aW1lciBleHBpcmF0aW9uIGlzIHF1aXRlIG5vcm1hbCwKKwkgKiBkb24ndCBldmVuIGxvZyB0aGUgZXZlbnQuCisJICovCisJaWYgKCh0eG1hY19zdGF0ICYgTUFDX1RYU1RBVF9EVEUpICYmCisJICAgICEodHhtYWNfc3RhdCAmIH5NQUNfVFhTVEFUX0RURSkpCisJCXJldHVybiAwOworCisJaWYgKHR4bWFjX3N0YXQgJiBNQUNfVFhTVEFUX1VSVU4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVFggTUFDIHhtaXQgdW5kZXJydW4uXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ3AtPm5ldF9zdGF0cy50eF9maWZvX2Vycm9ycysrOworCX0KKworCWlmICh0eG1hY19zdGF0ICYgTUFDX1RYU1RBVF9NUEUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVFggTUFDIG1heCBwYWNrZXQgc2l6ZSBlcnJvci5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlncC0+bmV0X3N0YXRzLnR4X2Vycm9ycysrOworCX0KKworCS8qIFRoZSByZXN0IGFyZSBhbGwgY2FzZXMgb2Ygb25lIG9mIHRoZSAxNi1iaXQgVFgKKwkgKiBjb3VudGVycyBleHBpcmluZy4KKwkgKi8KKwlpZiAodHhtYWNfc3RhdCAmIE1BQ19UWFNUQVRfTkNFKQorCQlncC0+bmV0X3N0YXRzLmNvbGxpc2lvbnMgKz0gMHgxMDAwMDsKKworCWlmICh0eG1hY19zdGF0ICYgTUFDX1RYU1RBVF9FQ0UpIHsKKwkJZ3AtPm5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyArPSAweDEwMDAwOworCQlncC0+bmV0X3N0YXRzLmNvbGxpc2lvbnMgKz0gMHgxMDAwMDsKKwl9CisKKwlpZiAodHhtYWNfc3RhdCAmIE1BQ19UWFNUQVRfTENFKSB7CisJCWdwLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgKz0gMHgxMDAwMDsKKwkJZ3AtPm5ldF9zdGF0cy5jb2xsaXNpb25zICs9IDB4MTAwMDA7CisJfQorCisJLyogV2UgZG8gbm90IGtlZXAgdHJhY2sgb2YgTUFDX1RYU1RBVF9GQ0UgYW5kCisJICogTUFDX1RYU1RBVF9QQ0UgZXZlbnRzLgorCSAqLworCXJldHVybiAwOworfQorCisvKiBXaGVuIHdlIGdldCBhIFJYIGZpZm8gb3ZlcmZsb3csIHRoZSBSWCB1bml0IGluIEdFTSBpcyBwcm9iYWJseSBodW5nCisgKiBzbyB3ZSBkbyB0aGUgZm9sbG93aW5nLgorICoKKyAqIElmIGFueSBwYXJ0IG9mIHRoZSByZXNldCBnb2VzIHdyb25nLCB3ZSByZXR1cm4gMSBhbmQgdGhhdCBjYXVzZXMgdGhlCisgKiB3aG9sZSBjaGlwIHRvIGJlIHJlc2V0LgorICovCitzdGF0aWMgaW50IGdlbV9yeG1hY19yZXNldChzdHJ1Y3QgZ2VtICpncCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZ3AtPmRldjsKKwlpbnQgbGltaXQsIGk7CisJdTY0IGRlc2NfZG1hOworCXUzMiB2YWw7CisKKwkvKiBGaXJzdCwgcmVzZXQgJiBkaXNhYmxlIE1BQyBSWC4gKi8KKwl3cml0ZWwoTUFDX1JYUlNUX0NNRCwgZ3AtPnJlZ3MgKyBNQUNfUlhSU1QpOworCWZvciAobGltaXQgPSAwOyBsaW1pdCA8IDUwMDA7IGxpbWl0KyspIHsKKwkJaWYgKCEocmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhSU1QpICYgTUFDX1JYUlNUX0NNRCkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKGxpbWl0ID09IDUwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlggTUFDIHdpbGwgbm90IHJlc2V0LCByZXNldHRpbmcgd2hvbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAiY2hpcC5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCXdyaXRlbChncC0+bWFjX3J4X2NmZyAmIH5NQUNfUlhDRkdfRU5BQiwKKwkgICAgICAgZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCWZvciAobGltaXQgPSAwOyBsaW1pdCA8IDUwMDA7IGxpbWl0KyspIHsKKwkJaWYgKCEocmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpICYgTUFDX1JYQ0ZHX0VOQUIpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmIChsaW1pdCA9PSA1MDAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJYIE1BQyB3aWxsIG5vdCBkaXNhYmxlLCByZXNldHRpbmcgd2hvbGUgIgorCQkgICAgICAgImNoaXAuXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBTZWNvbmQsIGRpc2FibGUgUlggRE1BLiAqLworCXdyaXRlbCgwLCBncC0+cmVncyArIFJYRE1BX0NGRyk7CisJZm9yIChsaW1pdCA9IDA7IGxpbWl0IDwgNTAwMDsgbGltaXQrKykgeworCQlpZiAoIShyZWFkbChncC0+cmVncyArIFJYRE1BX0NGRykgJiBSWERNQV9DRkdfRU5BQkxFKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAobGltaXQgPT0gNTAwMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSWCBETUEgd2lsbCBub3QgZGlzYWJsZSwgcmVzZXR0aW5nIHdob2xlICIKKwkJICAgICAgICJjaGlwLlxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJdWRlbGF5KDUwMDApOworCisJLyogRXhlY3V0ZSBSWCByZXNldCBjb21tYW5kLiAqLworCXdyaXRlbChncC0+c3dyc3RfYmFzZSB8IEdSRUdfU1dSU1RfUlhSU1QsCisJICAgICAgIGdwLT5yZWdzICsgR1JFR19TV1JTVCk7CisJZm9yIChsaW1pdCA9IDA7IGxpbWl0IDwgNTAwMDsgbGltaXQrKykgeworCQlpZiAoIShyZWFkbChncC0+cmVncyArIEdSRUdfU1dSU1QpICYgR1JFR19TV1JTVF9SWFJTVCkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKGxpbWl0ID09IDUwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlggcmVzZXQgY29tbWFuZCB3aWxsIG5vdCBleGVjdXRlLCByZXNldHRpbmcgIgorCQkgICAgICAgIndob2xlIGNoaXAuXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBSZWZyZXNoIHRoZSBSWCByaW5nLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgZ2VtX3J4ZCAqcnhkID0gJmdwLT5pbml0X2Jsb2NrLT5yeGRbaV07CisKKwkJaWYgKGdwLT5yeF9za2JzW2ldID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBhcnRzIG9mIFJYIHJpbmcgZW1wdHksIHJlc2V0dGluZyAiCisJCQkgICAgICAgIndob2xlIGNoaXAuXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlyeGQtPnN0YXR1c193b3JkID0gY3B1X3RvX2xlNjQoUlhEQ1RSTF9GUkVTSChncCkpOworCX0KKwlncC0+cnhfbmV3ID0gZ3AtPnJ4X29sZCA9IDA7CisKKwkvKiBOb3cgd2UgbXVzdCByZXByb2dyYW0gdGhlIHJlc3Qgb2YgUlggdW5pdC4gKi8KKwlkZXNjX2RtYSA9ICh1NjQpIGdwLT5nYmxvY2tfZHZtYTsKKwlkZXNjX2RtYSArPSAoSU5JVF9CTE9DS19UWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IGdlbV90eGQpKTsKKwl3cml0ZWwoZGVzY19kbWEgPj4gMzIsIGdwLT5yZWdzICsgUlhETUFfREJISSk7CisJd3JpdGVsKGRlc2NfZG1hICYgMHhmZmZmZmZmZiwgZ3AtPnJlZ3MgKyBSWERNQV9EQkxPVyk7CisJd3JpdGVsKFJYX1JJTkdfU0laRSAtIDQsIGdwLT5yZWdzICsgUlhETUFfS0lDSyk7CisJdmFsID0gKFJYRE1BX0NGR19CQVNFIHwgKFJYX09GRlNFVCA8PCAxMCkgfAorCSAgICAgICAoKDE0IC8gMikgPDwgMTMpIHwgUlhETUFfQ0ZHX0ZUSFJFU0hfMTI4KTsKKwl3cml0ZWwodmFsLCBncC0+cmVncyArIFJYRE1BX0NGRyk7CisJaWYgKHJlYWRsKGdwLT5yZWdzICsgR1JFR19CSUZDRkcpICYgR1JFR19CSUZDRkdfTTY2RU4pCisJCXdyaXRlbCgoKDUgJiBSWERNQV9CTEFOS19JUEtUUykgfAorCQkJKCg4IDw8IDEyKSAmIFJYRE1BX0JMQU5LX0lUSU1FKSksCisJCSAgICAgICBncC0+cmVncyArIFJYRE1BX0JMQU5LKTsKKwllbHNlCisJCXdyaXRlbCgoKDUgJiBSWERNQV9CTEFOS19JUEtUUykgfAorCQkJKCg0IDw8IDEyKSAmIFJYRE1BX0JMQU5LX0lUSU1FKSksCisJCSAgICAgICBncC0+cmVncyArIFJYRE1BX0JMQU5LKTsKKwl2YWwgID0gKCgoZ3AtPnJ4X3BhdXNlX29mZiAvIDY0KSA8PCAwKSAmIFJYRE1BX1BUSFJFU0hfT0ZGKTsKKwl2YWwgfD0gKCgoZ3AtPnJ4X3BhdXNlX29uIC8gNjQpIDw8IDEyKSAmIFJYRE1BX1BUSFJFU0hfT04pOworCXdyaXRlbCh2YWwsIGdwLT5yZWdzICsgUlhETUFfUFRIUkVTSCk7CisJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBSWERNQV9DRkcpOworCXdyaXRlbCh2YWwgfCBSWERNQV9DRkdfRU5BQkxFLCBncC0+cmVncyArIFJYRE1BX0NGRyk7CisJd3JpdGVsKE1BQ19SWFNUQVRfUkNWLCBncC0+cmVncyArIE1BQ19SWE1BU0spOworCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKwl3cml0ZWwodmFsIHwgTUFDX1JYQ0ZHX0VOQUIsIGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbV9yeG1hY19pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGdlbSAqZ3AsIHUzMiBnZW1fc3RhdHVzKQoreworCXUzMiByeG1hY19zdGF0ID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhTVEFUKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChuZXRpZl9tc2dfaW50cihncCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcnhtYWMgaW50ZXJydXB0LCByeG1hY19zdGF0OiAweCV4XG4iLAorCQkJZ3AtPmRldi0+bmFtZSwgcnhtYWNfc3RhdCk7CisKKwlpZiAocnhtYWNfc3RhdCAmIE1BQ19SWFNUQVRfT0ZMVykgeworCQl1MzIgc21hYyA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX1NNQUNISU5FKTsKKworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSWCBNQUMgZmlmbyBvdmVyZmxvdyBzbWFjWyUwOHhdLlxuIiwKKwkJCQlkZXYtPm5hbWUsIHNtYWMpOworCQlncC0+bmV0X3N0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCWdwLT5uZXRfc3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKworCQlyZXQgPSBnZW1fcnhtYWNfcmVzZXQoZ3ApOworCX0KKworCWlmIChyeG1hY19zdGF0ICYgTUFDX1JYU1RBVF9BQ0UpCisJCWdwLT5uZXRfc3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IDB4MTAwMDA7CisKKwlpZiAocnhtYWNfc3RhdCAmIE1BQ19SWFNUQVRfQ0NFKQorCQlncC0+bmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMgKz0gMHgxMDAwMDsKKworCWlmIChyeG1hY19zdGF0ICYgTUFDX1JYU1RBVF9MQ0UpCisJCWdwLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyArPSAweDEwMDAwOworCisJLyogV2UgZG8gbm90IHRyYWNrIE1BQ19SWFNUQVRfRkNFIGFuZCBNQUNfUlhTVEFUX1ZDRQorCSAqIGV2ZW50cy4KKwkgKi8KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdlbV9tYWNfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBnZW0gKmdwLCB1MzIgZ2VtX3N0YXR1cykKK3sKKwl1MzIgbWFjX2NzdGF0ID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfQ1NUQVQpOworCisJaWYgKG5ldGlmX21zZ19pbnRyKGdwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBtYWMgaW50ZXJydXB0LCBtYWNfY3N0YXQ6IDB4JXhcbiIsCisJCQlncC0+ZGV2LT5uYW1lLCBtYWNfY3N0YXQpOworCisJLyogVGhpcyBpbnRlcnJ1cHQgaXMganVzdCBmb3IgcGF1c2UgZnJhbWUgYW5kIHBhdXNlCisJICogdHJhY2tpbmcuICBJdCBpcyB1c2VmdWwgZm9yIGRpYWdub3N0aWNzIGFuZCBkZWJ1ZworCSAqIGJ1dCBwcm9iYWJseSBieSBkZWZhdWx0IHdlIHdpbGwgbWFzayB0aGVzZSBldmVudHMuCisJICovCisJaWYgKG1hY19jc3RhdCAmIE1BQ19DU1RBVF9QUykKKwkJZ3AtPnBhdXNlX2VudGVyZWQrKzsKKworCWlmIChtYWNfY3N0YXQgJiBNQUNfQ1NUQVRfUFJDVikKKwkJZ3AtPnBhdXNlX2xhc3RfdGltZV9yZWN2ZCA9IChtYWNfY3N0YXQgPj4gMTYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VtX21pZl9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGdlbSAqZ3AsIHUzMiBnZW1fc3RhdHVzKQoreworCXUzMiBtaWZfc3RhdHVzID0gcmVhZGwoZ3AtPnJlZ3MgKyBNSUZfU1RBVFVTKTsKKwl1MzIgcmVnX3ZhbCwgY2hhbmdlZF9iaXRzOworCisJcmVnX3ZhbCA9IChtaWZfc3RhdHVzICYgTUlGX1NUQVRVU19EQVRBKSA+PiAxNjsKKwljaGFuZ2VkX2JpdHMgPSAobWlmX3N0YXR1cyAmIE1JRl9TVEFUVVNfU1RBVCk7CisKKwlnZW1faGFuZGxlX21pZl9ldmVudChncCwgcmVnX3ZhbCwgY2hhbmdlZF9iaXRzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbV9wY2lfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBnZW0gKmdwLCB1MzIgZ2VtX3N0YXR1cykKK3sKKwl1MzIgcGNpX2VzdGF0ID0gcmVhZGwoZ3AtPnJlZ3MgKyBHUkVHX1BDSUVTVEFUKTsKKworCWlmIChncC0+cGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU1VOICYmCisJICAgIGdwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fR0VNKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBlcnJvciBbJTA0eF0gIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcGNpX2VzdGF0KTsKKworCQlpZiAocGNpX2VzdGF0ICYgR1JFR19QQ0lFU1RBVF9CQURBQ0spCisJCQlwcmludGsoIjxObyBBQ0s2NCMgZHVyaW5nIEFCUzY0IGN5Y2xlPiAiKTsKKwkJaWYgKHBjaV9lc3RhdCAmIEdSRUdfUENJRVNUQVRfRFRSVE8pCisJCQlwcmludGsoIjxEZWxheWVkIHRyYW5zYWN0aW9uIHRpbWVvdXQ+ICIpOworCQlpZiAocGNpX2VzdGF0ICYgR1JFR19QQ0lFU1RBVF9PVEhFUikKKwkJCXByaW50aygiPG90aGVyPiIpOworCQlwcmludGsoIlxuIik7CisJfSBlbHNlIHsKKwkJcGNpX2VzdGF0IHw9IEdSRUdfUENJRVNUQVRfT1RIRVI7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwl9CisKKwlpZiAocGNpX2VzdGF0ICYgR1JFR19QQ0lFU1RBVF9PVEhFUikgeworCQl1MTYgcGNpX2NmZ19zdGF0OworCisJCS8qIEludGVycm9nYXRlIFBDSSBjb25maWcgc3BhY2UgZm9yIHRoZQorCQkgKiB0cnVlIGNhdXNlLgorCQkgKi8KKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZ3AtPnBkZXYsIFBDSV9TVEFUVVMsCisJCQkJICAgICAmcGNpX2NmZ19zdGF0KTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVhZCBQQ0kgY2ZnIHNwYWNlIHN0YXR1cyBbJTA0eF1cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHBjaV9jZmdfc3RhdCk7CisJCWlmIChwY2lfY2ZnX3N0YXQgJiBQQ0lfU1RBVFVTX1BBUklUWSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBwYXJpdHkgZXJyb3IgZGV0ZWN0ZWQuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCWlmIChwY2lfY2ZnX3N0YXQgJiBQQ0lfU1RBVFVTX1NJR19UQVJHRVRfQUJPUlQpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgdGFyZ2V0IGFib3J0LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQlpZiAocGNpX2NmZ19zdGF0ICYgUENJX1NUQVRVU19SRUNfVEFSR0VUX0FCT1JUKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIG1hc3RlciBhY2tzIHRhcmdldCBhYm9ydC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJaWYgKHBjaV9jZmdfc3RhdCAmIFBDSV9TVEFUVVNfUkVDX01BU1RFUl9BQk9SVCkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBtYXN0ZXIgYWJvcnQuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCWlmIChwY2lfY2ZnX3N0YXQgJiBQQ0lfU1RBVFVTX1NJR19TWVNURU1fRVJST1IpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgc3lzdGVtIGVycm9yIFNFUlIjLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQlpZiAocGNpX2NmZ19zdGF0ICYgUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgcGFyaXR5IGVycm9yLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCisJCS8qIFdyaXRlIHRoZSBlcnJvciBiaXRzIGJhY2sgdG8gY2xlYXIgdGhlbS4gKi8KKwkJcGNpX2NmZ19zdGF0ICY9IChQQ0lfU1RBVFVTX1BBUklUWSB8CisJCQkJIFBDSV9TVEFUVVNfU0lHX1RBUkdFVF9BQk9SVCB8CisJCQkJIFBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVCB8CisJCQkJIFBDSV9TVEFUVVNfUkVDX01BU1RFUl9BQk9SVCB8CisJCQkJIFBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUiB8CisJCQkJIFBDSV9TVEFUVVNfREVURUNURURfUEFSSVRZKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGdwLT5wZGV2LAorCQkJCSAgICAgIFBDSV9TVEFUVVMsIHBjaV9jZmdfc3RhdCk7CisJfQorCisJLyogRm9yIGFsbCBQQ0kgZXJyb3JzLCB3ZSBzaG91bGQgcmVzZXQgdGhlIGNoaXAuICovCisJcmV0dXJuIDE7Cit9CisKKy8qIEFsbCBub24tbm9ybWFsIGludGVycnVwdCBjb25kaXRpb25zIGdldCBzZXJ2aWNlZCBoZXJlLgorICogUmV0dXJucyBub24temVybyBpZiB3ZSBzaG91bGQganVzdCBleGl0IHRoZSBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIgcmlnaHQgbm93IChpZS4gaWYgd2UgcmVzZXQgdGhlIGNhcmQgd2hpY2ggaW52YWxpZGF0ZXMKKyAqIGFsbCBvZiB0aGUgb3RoZXIgb3JpZ2luYWwgaXJxIHN0YXR1cyBiaXRzKS4KKyAqLworc3RhdGljIGludCBnZW1fYWJub3JtYWxfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBnZW0gKmdwLCB1MzIgZ2VtX3N0YXR1cykKK3sKKwlpZiAoZ2VtX3N0YXR1cyAmIEdSRUdfU1RBVF9SWE5PQlVGKSB7CisJCS8qIEZyYW1lIGFycml2ZWQsIG5vIGZyZWUgUlggYnVmZmVycyBhdmFpbGFibGUuICovCisJCWlmIChuZXRpZl9tc2dfcnhfZXJyKGdwKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogbm8gYnVmZmVyIGZvciByeCBmcmFtZVxuIiwKKwkJCQlncC0+ZGV2LT5uYW1lKTsKKwkJZ3AtPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJfQorCisJaWYgKGdlbV9zdGF0dXMgJiBHUkVHX1NUQVRfUlhUQUdFUlIpIHsKKwkJLyogY29ycnVwdCBSWCB0YWcgZnJhbWluZyAqLworCQlpZiAobmV0aWZfbXNnX3J4X2VycihncCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNvcnJ1cHQgcnggdGFnIGZyYW1pbmdcbiIsCisJCQkJZ3AtPmRldi0+bmFtZSk7CisJCWdwLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7CisKKwkJZ290byBkb19yZXNldDsKKwl9CisKKwlpZiAoZ2VtX3N0YXR1cyAmIEdSRUdfU1RBVF9QQ1MpIHsKKwkJaWYgKGdlbV9wY3NfaW50ZXJydXB0KGRldiwgZ3AsIGdlbV9zdGF0dXMpKQorCQkJZ290byBkb19yZXNldDsKKwl9CisKKwlpZiAoZ2VtX3N0YXR1cyAmIEdSRUdfU1RBVF9UWE1BQykgeworCQlpZiAoZ2VtX3R4bWFjX2ludGVycnVwdChkZXYsIGdwLCBnZW1fc3RhdHVzKSkKKwkJCWdvdG8gZG9fcmVzZXQ7CisJfQorCisJaWYgKGdlbV9zdGF0dXMgJiBHUkVHX1NUQVRfUlhNQUMpIHsKKwkJaWYgKGdlbV9yeG1hY19pbnRlcnJ1cHQoZGV2LCBncCwgZ2VtX3N0YXR1cykpCisJCQlnb3RvIGRvX3Jlc2V0OworCX0KKworCWlmIChnZW1fc3RhdHVzICYgR1JFR19TVEFUX01BQykgeworCQlpZiAoZ2VtX21hY19pbnRlcnJ1cHQoZGV2LCBncCwgZ2VtX3N0YXR1cykpCisJCQlnb3RvIGRvX3Jlc2V0OworCX0KKworCWlmIChnZW1fc3RhdHVzICYgR1JFR19TVEFUX01JRikgeworCQlpZiAoZ2VtX21pZl9pbnRlcnJ1cHQoZGV2LCBncCwgZ2VtX3N0YXR1cykpCisJCQlnb3RvIGRvX3Jlc2V0OworCX0KKworCWlmIChnZW1fc3RhdHVzICYgR1JFR19TVEFUX1BDSUVSUikgeworCQlpZiAoZ2VtX3BjaV9pbnRlcnJ1cHQoZGV2LCBncCwgZ2VtX3N0YXR1cykpCisJCQlnb3RvIGRvX3Jlc2V0OworCX0KKworCXJldHVybiAwOworCitkb19yZXNldDoKKwlncC0+cmVzZXRfdGFza19wZW5kaW5nID0gMTsKKwlzY2hlZHVsZV93b3JrKCZncC0+cmVzZXRfdGFzayk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBnZW1fdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGdlbSAqZ3AsIHUzMiBnZW1fc3RhdHVzKQoreworCWludCBlbnRyeSwgbGltaXQ7CisKKwlpZiAobmV0aWZfbXNnX2ludHIoZ3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4IGludGVycnVwdCwgZ2VtX3N0YXR1czogMHgleFxuIiwKKwkJCWdwLT5kZXYtPm5hbWUsIGdlbV9zdGF0dXMpOworCisJZW50cnkgPSBncC0+dHhfb2xkOworCWxpbWl0ID0gKChnZW1fc3RhdHVzICYgR1JFR19TVEFUX1RYTlIpID4+IEdSRUdfU1RBVF9UWE5SX1NISUZUKTsKKwl3aGlsZSAoZW50cnkgIT0gbGltaXQpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJc3RydWN0IGdlbV90eGQgKnR4ZDsKKwkJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwkJdTMyIGRtYV9sZW47CisJCWludCBmcmFnOworCisJCWlmIChuZXRpZl9tc2dfdHhfZG9uZShncCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4IGRvbmUsIHNsb3QgJWRcbiIsCisJCQkJZ3AtPmRldi0+bmFtZSwgZW50cnkpOworCQlza2IgPSBncC0+dHhfc2tic1tlbnRyeV07CisJCWlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSB7CisJCQlpbnQgbGFzdCA9IGVudHJ5ICsgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwkJCWludCB3YWxrID0gZW50cnk7CisJCQlpbnQgaW5jb21wbGV0ZSA9IDA7CisKKwkJCWxhc3QgJj0gKFRYX1JJTkdfU0laRSAtIDEpOworCQkJZm9yICg7OykgeworCQkJCXdhbGsgPSBORVhUX1RYKHdhbGspOworCQkJCWlmICh3YWxrID09IGxpbWl0KQorCQkJCQlpbmNvbXBsZXRlID0gMTsKKwkJCQlpZiAod2FsayA9PSBsYXN0KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpbmNvbXBsZXRlKQorCQkJCWJyZWFrOworCQl9CisJCWdwLT50eF9za2JzW2VudHJ5XSA9IE5VTEw7CisJCWdwLT5uZXRfc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkJZm9yIChmcmFnID0gMDsgZnJhZyA8PSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmcmFnKyspIHsKKwkJCXR4ZCA9ICZncC0+aW5pdF9ibG9jay0+dHhkW2VudHJ5XTsKKworCQkJZG1hX2FkZHIgPSBsZTY0X3RvX2NwdSh0eGQtPmJ1ZmZlcik7CisJCQlkbWFfbGVuID0gbGU2NF90b19jcHUodHhkLT5jb250cm9sX3dvcmQpICYgVFhEQ1RSTF9CVUZTWjsKKworCQkJcGNpX3VubWFwX3BhZ2UoZ3AtPnBkZXYsIGRtYV9hZGRyLCBkbWFfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CisJCX0KKworCQlncC0+bmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwl9CisJZ3AtPnR4X29sZCA9IGVudHJ5OworCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCSAgICBUWF9CVUZGU19BVkFJTChncCkgPiAoTUFYX1NLQl9GUkFHUyArIDEpKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZ2VtX3Bvc3RfcnhkcyhzdHJ1Y3QgZ2VtICpncCwgaW50IGxpbWl0KQoreworCWludCBjbHVzdGVyX3N0YXJ0LCBjdXJyLCBjb3VudCwga2ljazsKKworCWNsdXN0ZXJfc3RhcnQgPSBjdXJyID0gKGdwLT5yeF9uZXcgJiB+KDQgLSAxKSk7CisJY291bnQgPSAwOworCWtpY2sgPSAtMTsKKwl3bWIoKTsKKwl3aGlsZSAoY3VyciAhPSBsaW1pdCkgeworCQljdXJyID0gTkVYVF9SWChjdXJyKTsKKwkJaWYgKCsrY291bnQgPT0gNCkgeworCQkJc3RydWN0IGdlbV9yeGQgKnJ4ZCA9CisJCQkJJmdwLT5pbml0X2Jsb2NrLT5yeGRbY2x1c3Rlcl9zdGFydF07CisJCQlmb3IgKDs7KSB7CisJCQkJcnhkLT5zdGF0dXNfd29yZCA9IGNwdV90b19sZTY0KFJYRENUUkxfRlJFU0goZ3ApKTsKKwkJCQlyeGQrKzsKKwkJCQljbHVzdGVyX3N0YXJ0ID0gTkVYVF9SWChjbHVzdGVyX3N0YXJ0KTsKKwkJCQlpZiAoY2x1c3Rlcl9zdGFydCA9PSBjdXJyKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWtpY2sgPSBjdXJyOworCQkJY291bnQgPSAwOworCQl9CisJfQorCWlmIChraWNrID49IDApIHsKKwkJbWIoKTsKKwkJd3JpdGVsKGtpY2ssIGdwLT5yZWdzICsgUlhETUFfS0lDSyk7CisJfQorfQorCitzdGF0aWMgaW50IGdlbV9yeChzdHJ1Y3QgZ2VtICpncCwgaW50IHdvcmtfdG9fZG8pCit7CisJaW50IGVudHJ5LCBkcm9wcywgd29ya19kb25lID0gMDsKKwl1MzIgZG9uZTsKKworCWlmIChuZXRpZl9tc2dfcnhfc3RhdHVzKGdwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByeCBpbnRlcnJ1cHQsIGRvbmU6ICVkLCByeF9uZXc6ICVkXG4iLAorCQkJZ3AtPmRldi0+bmFtZSwgcmVhZGwoZ3AtPnJlZ3MgKyBSWERNQV9ET05FKSwgZ3AtPnJ4X25ldyk7CisKKwllbnRyeSA9IGdwLT5yeF9uZXc7CisJZHJvcHMgPSAwOworCWRvbmUgPSByZWFkbChncC0+cmVncyArIFJYRE1BX0RPTkUpOworCWZvciAoOzspIHsKKwkJc3RydWN0IGdlbV9yeGQgKnJ4ZCA9ICZncC0+aW5pdF9ibG9jay0+cnhkW2VudHJ5XTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdTY0IHN0YXR1cyA9IGNwdV90b19sZTY0KHJ4ZC0+c3RhdHVzX3dvcmQpOworCQlkbWFfYWRkcl90IGRtYV9hZGRyOworCQlpbnQgbGVuOworCisJCWlmICgoc3RhdHVzICYgUlhEQ1RSTF9PV04pICE9IDApCisJCQlicmVhazsKKworCQlpZiAod29ya19kb25lID49IFJYX1JJTkdfU0laRSB8fCB3b3JrX2RvbmUgPj0gd29ya190b19kbykKKwkJCWJyZWFrOworCisJCS8qIFdoZW4gd3JpdGluZyBiYWNrIFJYIGRlc2NyaXB0b3IsIEdFTSB3cml0ZXMgc3RhdHVzCisJCSAqIHRoZW4gYnVmZmVyIGFkZHJlc3MsIHBvc3NpYmx5IGluIHNlcGVyYXRlIHRyYW5zYWN0aW9ucy4KKwkJICogSWYgd2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIGNoaXAgdG8gd3JpdGUgYm90aCwgd2UgY291bGQKKwkJICogcG9zdCBhIG5ldyBidWZmZXIgdG8gdGhpcyBkZXNjcmlwdG9yIHRoZW4gaGF2ZSBHRU0gc3BhbQorCQkgKiBvbiB0aGUgYnVmZmVyIGFkZHJlc3MuICBXZSBzeW5jIG9uIHRoZSBSWCBjb21wbGV0aW9uCisJCSAqIHJlZ2lzdGVyIHRvIHByZXZlbnQgdGhpcyBmcm9tIGhhcHBlbmluZy4KKwkJICovCisJCWlmIChlbnRyeSA9PSBkb25lKSB7CisJCQlkb25lID0gcmVhZGwoZ3AtPnJlZ3MgKyBSWERNQV9ET05FKTsKKwkJCWlmIChlbnRyeSA9PSBkb25lKQorCQkJCWJyZWFrOworCQl9CisKKwkJLyogV2UgY2FuIG5vdyBhY2NvdW50IGZvciB0aGUgd29yayB3ZSdyZSBhYm91dCB0byBkbyAqLworCQl3b3JrX2RvbmUrKzsKKworCQlza2IgPSBncC0+cnhfc2tic1tlbnRyeV07CisKKwkJbGVuID0gKHN0YXR1cyAmIFJYRENUUkxfQlVGU1opID4+IDE2OworCQlpZiAoKGxlbiA8IEVUSF9aTEVOKSB8fCAoc3RhdHVzICYgUlhEQ1RSTF9CQUQpKSB7CisJCQlncC0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKGxlbiA8IEVUSF9aTEVOKQorCQkJCWdwLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKGxlbiAmIFJYRENUUkxfQkFEKQorCQkJCWdwLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycysrOworCisJCQkvKiBXZSdsbCBqdXN0IHJldHVybiBpdCB0byBHRU0uICovCisJCWRyb3BfaXQ6CisJCQlncC0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCWRtYV9hZGRyID0gY3B1X3RvX2xlNjQocnhkLT5idWZmZXIpOworCQlpZiAobGVuID4gUlhfQ09QWV9USFJFU0hPTEQpIHsKKwkJCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCisJCQluZXdfc2tiID0gZ2VtX2FsbG9jX3NrYihSWF9CVUZfQUxMT0NfU0laRShncCksIEdGUF9BVE9NSUMpOworCQkJaWYgKG5ld19za2IgPT0gTlVMTCkgeworCQkJCWRyb3BzKys7CisJCQkJZ290byBkcm9wX2l0OworCQkJfQorCQkJcGNpX3VubWFwX3BhZ2UoZ3AtPnBkZXYsIGRtYV9hZGRyLAorCQkJCSAgICAgICBSWF9CVUZfQUxMT0NfU0laRShncCksCisJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlncC0+cnhfc2tic1tlbnRyeV0gPSBuZXdfc2tiOworCQkJbmV3X3NrYi0+ZGV2ID0gZ3AtPmRldjsKKwkJCXNrYl9wdXQobmV3X3NrYiwgKGdwLT5yeF9idWZfc3ogKyBSWF9PRkZTRVQpKTsKKwkJCXJ4ZC0+YnVmZmVyID0gY3B1X3RvX2xlNjQocGNpX21hcF9wYWdlKGdwLT5wZGV2LAorCQkJCQkJCSAgICAgICB2aXJ0X3RvX3BhZ2UobmV3X3NrYi0+ZGF0YSksCisJCQkJCQkJICAgICAgIG9mZnNldF9pbl9wYWdlKG5ld19za2ItPmRhdGEpLAorCQkJCQkJCSAgICAgICBSWF9CVUZfQUxMT0NfU0laRShncCksCisJCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgUlhfT0ZGU0VUKTsKKworCQkJLyogVHJpbSB0aGUgb3JpZ2luYWwgc2tiIGZvciB0aGUgbmV0aWYuICovCisJCQlza2JfdHJpbShza2IsIGxlbik7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqY29weV9za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOworCisJCQlpZiAoY29weV9za2IgPT0gTlVMTCkgeworCQkJCWRyb3BzKys7CisJCQkJZ290byBkcm9wX2l0OworCQkJfQorCisJCQljb3B5X3NrYi0+ZGV2ID0gZ3AtPmRldjsKKwkJCXNrYl9yZXNlcnZlKGNvcHlfc2tiLCAyKTsKKwkJCXNrYl9wdXQoY29weV9za2IsIGxlbik7CisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZ3AtPnBkZXYsIGRtYV9hZGRyLCBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQltZW1jcHkoY29weV9za2ItPmRhdGEsIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShncC0+cGRldiwgZG1hX2FkZHIsIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJLyogV2UnbGwgcmV1c2UgdGhlIG9yaWdpbmFsIHJpbmcgYnVmZmVyLiAqLworCQkJc2tiID0gY29weV9za2I7CisJCX0KKworCQlza2ItPmNzdW0gPSBudG9ocygoc3RhdHVzICYgUlhEQ1RSTF9UQ1BDU1VNKSBeIDB4ZmZmZik7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fSFc7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGdwLT5kZXYpOworCisJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisKKwkJZ3AtPm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7CisJCWdwLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQlncC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCW5leHQ6CisJCWVudHJ5ID0gTkVYVF9SWChlbnRyeSk7CisJfQorCisJZ2VtX3Bvc3RfcnhkcyhncCwgZW50cnkpOworCisJZ3AtPnJ4X25ldyA9IGVudHJ5OworCisJaWYgKGRyb3BzKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkgICAgICAgZ3AtPmRldi0+bmFtZSk7CisKKwlyZXR1cm4gd29ya19kb25lOworfQorCitzdGF0aWMgaW50IGdlbV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIE5BUEkgbG9ja2luZyBuaWdodG1hcmU6IFNlZSBjb21tZW50IGF0IGhlYWQgb2YgZHJpdmVyIAorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOworCisJZG8geworCQlpbnQgd29ya190b19kbywgd29ya19kb25lOworCisJCS8qIEhhbmRsZSBhbm9tYWxpZXMgKi8KKwkJaWYgKGdwLT5zdGF0dXMgJiBHUkVHX1NUQVRfQUJOT1JNQUwpIHsKKwkJCWlmIChnZW1fYWJub3JtYWxfaXJxKGRldiwgZ3AsIGdwLT5zdGF0dXMpKQorCQkJCWJyZWFrOworCQl9CisKKwkJLyogUnVuIFRYIGNvbXBsZXRpb24gdGhyZWFkICovCisJCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCQlnZW1fdHgoZGV2LCBncCwgZ3AtPnN0YXR1cyk7CisJCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBSdW4gUlggdGhyZWFkLiBXZSBkb24ndCB1c2UgYW55IGxvY2tpbmcgaGVyZSwgCisJCSAqIGNvZGUgd2lsbGluZyB0byBkbyBiYWQgdGhpbmdzIC0gbGlrZSBjbGVhbmluZyB0aGUgCisJCSAqIHJ4IHJpbmcgLSBtdXN0IGNhbGwgbmV0aWZfcG9sbF9kaXNhYmxlKCksIHdoaWNoCisJCSAqIHNjaGVkdWxlX3RpbWVvdXQoKSdzIGlmIHBvbGxpbmcgaXMgYWxyZWFkeSBkaXNhYmxlZC4KKwkJICovCisJCXdvcmtfdG9fZG8gPSBtaW4oKmJ1ZGdldCwgZGV2LT5xdW90YSk7CisKKwkJd29ya19kb25lID0gZ2VtX3J4KGdwLCB3b3JrX3RvX2RvKTsKKworCQkqYnVkZ2V0IC09IHdvcmtfZG9uZTsKKwkJZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisKKwkJaWYgKHdvcmtfZG9uZSA+PSB3b3JrX3RvX2RvKQorCQkJcmV0dXJuIDE7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7CisJCQorCQlncC0+c3RhdHVzID0gcmVhZGwoZ3AtPnJlZ3MgKyBHUkVHX1NUQVQpOworCX0gd2hpbGUgKGdwLT5zdGF0dXMgJiBHUkVHX1NUQVRfTkFQSSk7CisKKwlfX25ldGlmX3J4X2NvbXBsZXRlKGRldik7CisJZ2VtX2VuYWJsZV9pbnRzKGdwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBnZW1faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogU3dhbGxvdyBpbnRlcnJ1cHRzIHdoZW4gc2h1dHRpbmcgdGhlIGNoaXAgZG93biwgdGhvdWdoCisJICogdGhhdCBzaG91bGRuJ3QgaGFwcGVuLCB3ZSBzaG91bGQgaGF2ZSBkb25lIGZyZWVfaXJxKCkgYXQKKwkgKiB0aGlzIHBvaW50Li4uCisJICovCisJaWYgKCFncC0+cnVubmluZykKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7CisJCisJaWYgKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgeworCQl1MzIgZ2VtX3N0YXR1cyA9IHJlYWRsKGdwLT5yZWdzICsgR1JFR19TVEFUKTsKKworCQlpZiAoZ2VtX3N0YXR1cyA9PSAwKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIElSUV9OT05FOworCQl9CisJCWdwLT5zdGF0dXMgPSBnZW1fc3RhdHVzOworCQlnZW1fZGlzYWJsZV9pbnRzKGdwKTsKKwkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisgIAorCS8qIElmIHBvbGxpbmcgd2FzIGRpc2FibGVkIGF0IHRoZSB0aW1lIHdlIHJlY2VpdmVkIHRoYXQKKwkgKiBpbnRlcnJ1cHQsIHdlIG1heSByZXR1cm4gSVJRX0hBTkRMRUQgaGVyZSB3aGlsZSB3ZSAKKwkgKiBzaG91bGQgcmV0dXJuIElSUV9OT05FLiBObyBiaWcgZGVhbC4uLgorCSAqLworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBnZW1fcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogZ2VtX2ludGVycnVwdCBpcyBzYWZlIHRvIHJlZW50cmFuY2Ugc28gbm8gbmVlZAorCSAqIHRvIGRpc2FibGVfaXJxIGhlcmUuCisJICovCisJZ2VtX2ludGVycnVwdChkZXYtPmlycSwgZGV2LCBOVUxMKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBnZW1fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCisJcHJpbnRrKEtFUk5fRVJSICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCByZXNldHRpbmdcbiIsIGRldi0+bmFtZSk7CisJaWYgKCFncC0+cnVubmluZykgeworCQlwcmludGsoIiVzOiBocm0uLiBodyBub3QgcnVubmluZyAhXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCXByaW50ayhLRVJOX0VSUiAiJXM6IFRYX1NUQVRFWyUwOHg6JTA4eDolMDh4XVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLAorCSAgICAgICByZWFkbChncC0+cmVncyArIFRYRE1BX0NGRyksCisJICAgICAgIHJlYWRsKGdwLT5yZWdzICsgTUFDX1RYU1RBVCksCisJICAgICAgIHJlYWRsKGdwLT5yZWdzICsgTUFDX1RYQ0ZHKSk7CisJcHJpbnRrKEtFUk5fRVJSICIlczogUlhfU1RBVEVbJTA4eDolMDh4OiUwOHhdXG4iLAorCSAgICAgICBkZXYtPm5hbWUsCisJICAgICAgIHJlYWRsKGdwLT5yZWdzICsgUlhETUFfQ0ZHKSwKKwkgICAgICAgcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhTVEFUKSwKKwkgICAgICAgcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpKTsKKworCXNwaW5fbG9ja19pcnEoJmdwLT5sb2NrKTsKKwlzcGluX2xvY2soJmdwLT50eF9sb2NrKTsKKworCWdwLT5yZXNldF90YXNrX3BlbmRpbmcgPSAxOworCXNjaGVkdWxlX3dvcmsoJmdwLT5yZXNldF90YXNrKTsKKworCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBnZW1faW50bWUoaW50IGVudHJ5KQoreworCS8qIEFsZ29yaXRobTogSVJRIGV2ZXJ5IDEvMiBvZiBkZXNjcmlwdG9ycy4gKi8KKwlpZiAoIShlbnRyeSAmICgoVFhfUklOR19TSVpFPj4xKS0xKSkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VtX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwlpbnQgZW50cnk7CisJdTY0IGN0cmw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWN0cmwgPSAwOworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQl1NjQgY3N1bV9zdGFydF9vZmYsIGNzdW1fc3R1ZmZfb2ZmOworCisJCWNzdW1fc3RhcnRfb2ZmID0gKHU2NCkgKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpOworCQljc3VtX3N0dWZmX29mZiA9ICh1NjQpICgoc2tiLT5oLnJhdyArIHNrYi0+Y3N1bSkgLSBza2ItPmRhdGEpOworCisJCWN0cmwgPSAoVFhEQ1RSTF9DRU5BQiB8CisJCQkoY3N1bV9zdGFydF9vZmYgPDwgMTUpIHwKKwkJCShjc3VtX3N0dWZmX29mZiA8PCAyMSkpOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAoIXNwaW5fdHJ5bG9jaygmZ3AtPnR4X2xvY2spKSB7CisJCS8qIFRlbGwgdXBwZXIgbGF5ZXIgdG8gcmVxdWV1ZSAqLworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybiBORVRERVZfVFhfTE9DS0VEOworCX0KKwkvKiBXZSByYWNlZCB3aXRoIGdlbV9kb19zdG9wKCkgKi8KKwlpZiAoIWdwLT5ydW5uaW5nKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT50eF9sb2NrLCBmbGFncyk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwkvKiBUaGlzIGlzIGEgaGFyZCBlcnJvciwgbG9nIGl0LiAqLworCWlmIChUWF9CVUZGU19BVkFJTChncCkgPD0gKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT50eF9sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBCVUchIFR4IFJpbmcgZnVsbCB3aGVuIHF1ZXVlIGF3YWtlIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwllbnRyeSA9IGdwLT50eF9uZXc7CisJZ3AtPnR4X3NrYnNbZW50cnldID0gc2tiOworCisJaWYgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPT0gMCkgeworCQlzdHJ1Y3QgZ2VtX3R4ZCAqdHhkID0gJmdwLT5pbml0X2Jsb2NrLT50eGRbZW50cnldOworCQlkbWFfYWRkcl90IG1hcHBpbmc7CisJCXUzMiBsZW47CisKKwkJbGVuID0gc2tiLT5sZW47CisJCW1hcHBpbmcgPSBwY2lfbWFwX3BhZ2UoZ3AtPnBkZXYsCisJCQkJICAgICAgIHZpcnRfdG9fcGFnZShza2ItPmRhdGEpLAorCQkJCSAgICAgICBvZmZzZXRfaW5fcGFnZShza2ItPmRhdGEpLAorCQkJCSAgICAgICBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQljdHJsIHw9IFRYRENUUkxfU09GIHwgVFhEQ1RSTF9FT0YgfCBsZW47CisJCWlmIChnZW1faW50bWUoZW50cnkpKQorCQkJY3RybCB8PSBUWERDVFJMX0lOVE1FOworCQl0eGQtPmJ1ZmZlciA9IGNwdV90b19sZTY0KG1hcHBpbmcpOworCQl3bWIoKTsKKwkJdHhkLT5jb250cm9sX3dvcmQgPSBjcHVfdG9fbGU2NChjdHJsKTsKKwkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZ2VtX3R4ZCAqdHhkOworCQl1MzIgZmlyc3RfbGVuOworCQl1NjQgaW50bWU7CisJCWRtYV9hZGRyX3QgZmlyc3RfbWFwcGluZzsKKwkJaW50IGZyYWcsIGZpcnN0X2VudHJ5ID0gZW50cnk7CisKKwkJaW50bWUgPSAwOworCQlpZiAoZ2VtX2ludG1lKGVudHJ5KSkKKwkJCWludG1lIHw9IFRYRENUUkxfSU5UTUU7CisKKwkJLyogV2UgbXVzdCBnaXZlIHRoaXMgaW5pdGlhbCBjaHVuayB0byB0aGUgZGV2aWNlIGxhc3QuCisJCSAqIE90aGVyd2lzZSB3ZSBjb3VsZCByYWNlIHdpdGggdGhlIGRldmljZS4KKwkJICovCisJCWZpcnN0X2xlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisJCWZpcnN0X21hcHBpbmcgPSBwY2lfbWFwX3BhZ2UoZ3AtPnBkZXYsIHZpcnRfdG9fcGFnZShza2ItPmRhdGEpLAorCQkJCQkgICAgIG9mZnNldF9pbl9wYWdlKHNrYi0+ZGF0YSksCisJCQkJCSAgICAgZmlyc3RfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKworCQlmb3IgKGZyYWcgPSAwOyBmcmFnIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgZnJhZysrKSB7CisJCQlza2JfZnJhZ190ICp0aGlzX2ZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmcmFnXTsKKwkJCXUzMiBsZW47CisJCQlkbWFfYWRkcl90IG1hcHBpbmc7CisJCQl1NjQgdGhpc19jdHJsOworCisJCQlsZW4gPSB0aGlzX2ZyYWctPnNpemU7CisJCQltYXBwaW5nID0gcGNpX21hcF9wYWdlKGdwLT5wZGV2LAorCQkJCQkgICAgICAgdGhpc19mcmFnLT5wYWdlLAorCQkJCQkgICAgICAgdGhpc19mcmFnLT5wYWdlX29mZnNldCwKKwkJCQkJICAgICAgIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQl0aGlzX2N0cmwgPSBjdHJsOworCQkJaWYgKGZyYWcgPT0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyAtIDEpCisJCQkJdGhpc19jdHJsIHw9IFRYRENUUkxfRU9GOworCQkJCisJCQl0eGQgPSAmZ3AtPmluaXRfYmxvY2stPnR4ZFtlbnRyeV07CisJCQl0eGQtPmJ1ZmZlciA9IGNwdV90b19sZTY0KG1hcHBpbmcpOworCQkJd21iKCk7CisJCQl0eGQtPmNvbnRyb2xfd29yZCA9IGNwdV90b19sZTY0KHRoaXNfY3RybCB8IGxlbik7CisKKwkJCWlmIChnZW1faW50bWUoZW50cnkpKQorCQkJCWludG1lIHw9IFRYRENUUkxfSU5UTUU7CisKKwkJCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CisJCX0KKwkJdHhkID0gJmdwLT5pbml0X2Jsb2NrLT50eGRbZmlyc3RfZW50cnldOworCQl0eGQtPmJ1ZmZlciA9IGNwdV90b19sZTY0KGZpcnN0X21hcHBpbmcpOworCQl3bWIoKTsKKwkJdHhkLT5jb250cm9sX3dvcmQgPQorCQkJY3B1X3RvX2xlNjQoY3RybCB8IFRYRENUUkxfU09GIHwgaW50bWUgfCBmaXJzdF9sZW4pOworCX0KKworCWdwLT50eF9uZXcgPSBlbnRyeTsKKwlpZiAoVFhfQlVGRlNfQVZBSUwoZ3ApIDw9IChNQVhfU0tCX0ZSQUdTICsgMSkpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChuZXRpZl9tc2dfdHhfcXVldWVkKGdwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eCBxdWV1ZWQsIHNsb3QgJWQsIHNrYmxlbiAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZW50cnksIHNrYi0+bGVuKTsKKwltYigpOworCXdyaXRlbChncC0+dHhfbmV3LCBncC0+cmVncyArIFRYRE1BX0tJQ0spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT50eF9sb2NrLCBmbGFncyk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKyNkZWZpbmUgU1RPUF9UUklFUyAzMgorCisvKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLworc3RhdGljIHZvaWQgZ2VtX3Jlc2V0KHN0cnVjdCBnZW0gKmdwKQoreworCWludCBsaW1pdDsKKwl1MzIgdmFsOworCisJLyogTWFrZSBzdXJlIHdlIHdvbid0IGdldCBhbnkgbW9yZSBpbnRlcnJ1cHRzICovCisJd3JpdGVsKDB4ZmZmZmZmZmYsIGdwLT5yZWdzICsgR1JFR19JTUFTSyk7CisKKwkvKiBSZXNldCB0aGUgY2hpcCAqLworCXdyaXRlbChncC0+c3dyc3RfYmFzZSB8IEdSRUdfU1dSU1RfVFhSU1QgfCBHUkVHX1NXUlNUX1JYUlNULAorCSAgICAgICBncC0+cmVncyArIEdSRUdfU1dSU1QpOworCisJbGltaXQgPSBTVE9QX1RSSUVTOworCisJZG8geworCQl1ZGVsYXkoMjApOworCQl2YWwgPSByZWFkbChncC0+cmVncyArIEdSRUdfU1dSU1QpOworCQlpZiAobGltaXQtLSA8PSAwKQorCQkJYnJlYWs7CisJfSB3aGlsZSAodmFsICYgKEdSRUdfU1dSU1RfVFhSU1QgfCBHUkVHX1NXUlNUX1JYUlNUKSk7CisKKwlpZiAobGltaXQgPD0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogU1cgcmVzZXQgaXMgZ2hldHRvLlxuIiwgZ3AtPmRldi0+bmFtZSk7Cit9CisKKy8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCitzdGF0aWMgdm9pZCBnZW1fc3RhcnRfZG1hKHN0cnVjdCBnZW0gKmdwKQoreworCXUzMiB2YWw7CisJCisJLyogV2UgYXJlIHJlYWR5IHRvIHJvY2ssIHR1cm4gZXZlcnl0aGluZyBvbi4gKi8KKwl2YWwgPSByZWFkbChncC0+cmVncyArIFRYRE1BX0NGRyk7CisJd3JpdGVsKHZhbCB8IFRYRE1BX0NGR19FTkFCTEUsIGdwLT5yZWdzICsgVFhETUFfQ0ZHKTsKKwl2YWwgPSByZWFkbChncC0+cmVncyArIFJYRE1BX0NGRyk7CisJd3JpdGVsKHZhbCB8IFJYRE1BX0NGR19FTkFCTEUsIGdwLT5yZWdzICsgUlhETUFfQ0ZHKTsKKwl2YWwgPSByZWFkbChncC0+cmVncyArIE1BQ19UWENGRyk7CisJd3JpdGVsKHZhbCB8IE1BQ19UWENGR19FTkFCLCBncC0+cmVncyArIE1BQ19UWENGRyk7CisJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCXdyaXRlbCh2YWwgfCBNQUNfUlhDRkdfRU5BQiwgZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCisJKHZvaWQpIHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKwl1ZGVsYXkoMTAwKTsKKworCWdlbV9lbmFibGVfaW50cyhncCk7CisKKwl3cml0ZWwoUlhfUklOR19TSVpFIC0gNCwgZ3AtPnJlZ3MgKyBSWERNQV9LSUNLKTsKK30KKworLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gRE1BIHdvbid0IGJlCisgKiBhY3R1YWxseSBzdG9wcGVkIGJlZm9yZSBhYm91dCA0bXMgdGhvIC4uLgorICovCitzdGF0aWMgdm9pZCBnZW1fc3RvcF9kbWEoc3RydWN0IGdlbSAqZ3ApCit7CisJdTMyIHZhbDsKKworCS8qIFdlIGFyZSBkb25lIHJvY2tpbmcsIHR1cm4gZXZlcnl0aGluZyBvZmYuICovCisJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBUWERNQV9DRkcpOworCXdyaXRlbCh2YWwgJiB+VFhETUFfQ0ZHX0VOQUJMRSwgZ3AtPnJlZ3MgKyBUWERNQV9DRkcpOworCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgUlhETUFfQ0ZHKTsKKwl3cml0ZWwodmFsICYgflJYRE1BX0NGR19FTkFCTEUsIGdwLT5yZWdzICsgUlhETUFfQ0ZHKTsKKwl2YWwgPSByZWFkbChncC0+cmVncyArIE1BQ19UWENGRyk7CisJd3JpdGVsKHZhbCAmIH5NQUNfVFhDRkdfRU5BQiwgZ3AtPnJlZ3MgKyBNQUNfVFhDRkcpOworCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKwl3cml0ZWwodmFsICYgfk1BQ19SWENGR19FTkFCLCBncC0+cmVncyArIE1BQ19SWENGRyk7CisKKwkodm9pZCkgcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCisJLyogTmVlZCB0byB3YWl0IGEgYml0IC4uLiBkb25lIGJ5IHRoZSBjYWxsZXIgKi8KK30KKworCisvKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLworLy8gWFhYIGRibCBjaGVjayB3aGF0IHRoYXQgZnVuY3Rpb24gc2hvdWxkIGRvIHdoZW4gY2FsbGVkIG9uIFBDUyBQSFkKK3N0YXRpYyB2b2lkIGdlbV9iZWdpbl9hdXRvX25lZ290aWF0aW9uKHN0cnVjdCBnZW0gKmdwLCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVwKQoreworCXUzMiBhZHZlcnRpc2UsIGZlYXR1cmVzOworCWludCBhdXRvbmVnOworCWludCBzcGVlZDsKKwlpbnQgZHVwbGV4OworCisJaWYgKGdwLT5waHlfdHlwZSAhPSBwaHlfbWlpX21kaW8wICYmCisgICAgIAkgICAgZ3AtPnBoeV90eXBlICE9IHBoeV9taWlfbWRpbzEpCisgICAgIAkgICAgCWdvdG8gbm9uX21paTsKKworCS8qIFNldHVwIGFkdmVydGlzZSAqLworCWlmIChmb3VuZF9taWlfcGh5KGdwKSkKKwkJZmVhdHVyZXMgPSBncC0+cGh5X21paS5kZWYtPmZlYXR1cmVzOworCWVsc2UKKwkJZmVhdHVyZXMgPSAwOworCisJYWR2ZXJ0aXNlID0gZmVhdHVyZXMgJiBBRFZFUlRJU0VfTUFTSzsKKwlpZiAoZ3AtPnBoeV9taWkuYWR2ZXJ0aXNpbmcgIT0gMCkKKwkJYWR2ZXJ0aXNlICY9IGdwLT5waHlfbWlpLmFkdmVydGlzaW5nOworCisJYXV0b25lZyA9IGdwLT53YW50X2F1dG9uZWc7CisJc3BlZWQgPSBncC0+cGh5X21paS5zcGVlZDsKKwlkdXBsZXggPSBncC0+cGh5X21paS5kdXBsZXg7CisJCisJLyogU2V0dXAgbGluayBwYXJhbWV0ZXJzICovCisJaWYgKCFlcCkKKwkJZ290byBzdGFydF9hbmVnOworCWlmIChlcC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQlhZHZlcnRpc2UgPSBlcC0+YWR2ZXJ0aXNpbmc7CisJCWF1dG9uZWcgPSAxOworCX0gZWxzZSB7CisJCWF1dG9uZWcgPSAwOworCQlzcGVlZCA9IGVwLT5zcGVlZDsKKwkJZHVwbGV4ID0gZXAtPmR1cGxleDsKKwl9CisKK3N0YXJ0X2FuZWc6CisJLyogU2FuaXRpemUgc2V0dGluZ3MgYmFzZWQgb24gUEhZIGNhcGFiaWxpdGllcyAqLworCWlmICgoZmVhdHVyZXMgJiBTVVBQT1JURURfQXV0b25lZykgPT0gMCkKKwkJYXV0b25lZyA9IDA7CisJaWYgKHNwZWVkID09IFNQRUVEXzEwMDAgJiYKKwkgICAgIShmZWF0dXJlcyAmIChTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpKSkKKwkJc3BlZWQgPSBTUEVFRF8xMDA7CisJaWYgKHNwZWVkID09IFNQRUVEXzEwMCAmJgorCSAgICAhKGZlYXR1cmVzICYgKFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwpKSkKKwkJc3BlZWQgPSBTUEVFRF8xMDsKKwlpZiAoZHVwbGV4ID09IERVUExFWF9GVUxMICYmCisJICAgICEoZmVhdHVyZXMgJiAoU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKKwkgICAgCQkgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkgICAgCQkgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwpKSkKKwkgICAgCWR1cGxleCA9IERVUExFWF9IQUxGOworCWlmIChzcGVlZCA9PSAwKQorCQlzcGVlZCA9IFNQRUVEXzEwOworCQorCS8qIElmIHdlIGFyZSBhc2xlZXAsIHdlIGRvbid0IHRyeSB0byBhY3R1YWxseSBzZXR1cCB0aGUgUEhZLCB3ZQorCSAqIGp1c3Qgc3RvcmUgdGhlIHNldHRpbmdzCisJICovCisJaWYgKGdwLT5hc2xlZXApIHsKKwkJZ3AtPnBoeV9taWkuYXV0b25lZyA9IGdwLT53YW50X2F1dG9uZWcgPSBhdXRvbmVnOworCQlncC0+cGh5X21paS5zcGVlZCA9IHNwZWVkOworCQlncC0+cGh5X21paS5kdXBsZXggPSBkdXBsZXg7CisJCXJldHVybjsKKwl9CisKKwkvKiBDb25maWd1cmUgUEhZICYgc3RhcnQgYW5lZyAqLworCWdwLT53YW50X2F1dG9uZWcgPSBhdXRvbmVnOworCWlmIChhdXRvbmVnKSB7CisJCWlmIChmb3VuZF9taWlfcGh5KGdwKSkKKwkJCWdwLT5waHlfbWlpLmRlZi0+b3BzLT5zZXR1cF9hbmVnKCZncC0+cGh5X21paSwgYWR2ZXJ0aXNlKTsKKwkJZ3AtPmxzdGF0ZSA9IGxpbmtfYW5lZzsKKwl9IGVsc2UgeworCQlpZiAoZm91bmRfbWlpX3BoeShncCkpCisJCQlncC0+cGh5X21paS5kZWYtPm9wcy0+c2V0dXBfZm9yY2VkKCZncC0+cGh5X21paSwgc3BlZWQsIGR1cGxleCk7CisJCWdwLT5sc3RhdGUgPSBsaW5rX2ZvcmNlX29rOworCX0KKworbm9uX21paToKKwlncC0+dGltZXJfdGlja3MgPSAwOworCW1vZF90aW1lcigmZ3AtPmxpbmtfdGltZXIsIGppZmZpZXMgKyAoKDEyICogSFopIC8gMTApKTsKK30KKworLyogQSBsaW5rLXVwIGNvbmRpdGlvbiBoYXMgb2NjdXJyZWQsIGluaXRpYWxpemUgYW5kIGVuYWJsZSB0aGUKKyAqIHJlc3Qgb2YgdGhlIGNoaXAuCisgKgorICogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4KKyAqLworc3RhdGljIGludCBnZW1fc2V0X2xpbmtfbW9kZXMoc3RydWN0IGdlbSAqZ3ApCit7CisJdTMyIHZhbDsKKwlpbnQgZnVsbF9kdXBsZXgsIHNwZWVkLCBwYXVzZTsKKworCWZ1bGxfZHVwbGV4ID0gMDsKKwlzcGVlZCA9IFNQRUVEXzEwOworCXBhdXNlID0gMDsKKworCWlmIChmb3VuZF9taWlfcGh5KGdwKSkgeworCSAgICAJaWYgKGdwLT5waHlfbWlpLmRlZi0+b3BzLT5yZWFkX2xpbmsoJmdwLT5waHlfbWlpKSkKKwkgICAgCQlyZXR1cm4gMTsKKwkJZnVsbF9kdXBsZXggPSAoZ3AtPnBoeV9taWkuZHVwbGV4ID09IERVUExFWF9GVUxMKTsKKwkJc3BlZWQgPSBncC0+cGh5X21paS5zcGVlZDsKKwkJcGF1c2UgPSBncC0+cGh5X21paS5wYXVzZTsKKwl9IGVsc2UgaWYgKGdwLT5waHlfdHlwZSA9PSBwaHlfc2VyaWFsaW5rIHx8CisJICAgIAkgICBncC0+cGh5X3R5cGUgPT0gcGh5X3NlcmRlcykgeworCQl1MzIgcGNzX2xwYSA9IHJlYWRsKGdwLT5yZWdzICsgUENTX01JSUxQKTsKKworCQlpZiAocGNzX2xwYSAmIFBDU19NSUlBRFZfRkQpCisJCQlmdWxsX2R1cGxleCA9IDE7CisJCXNwZWVkID0gU1BFRURfMTAwMDsKKwl9CisKKwlpZiAobmV0aWZfbXNnX2xpbmsoZ3ApKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBpcyB1cCBhdCAlZCBNYnBzLCAlcy1kdXBsZXguXG4iLAorCQkJZ3AtPmRldi0+bmFtZSwgc3BlZWQsIChmdWxsX2R1cGxleCA/ICJmdWxsIiA6ICJoYWxmIikpOworCisJaWYgKCFncC0+cnVubmluZykKKwkJcmV0dXJuIDA7CisKKwl2YWwgPSAoTUFDX1RYQ0ZHX0VJUEcwIHwgTUFDX1RYQ0ZHX05HVSk7CisJaWYgKGZ1bGxfZHVwbGV4KSB7CisJCXZhbCB8PSAoTUFDX1RYQ0ZHX0lDUyB8IE1BQ19UWENGR19JQ09MTCk7CisJfSBlbHNlIHsKKwkJLyogTUFDX1RYQ0ZHX05CTyBtdXN0IGJlIHplcm8uICovCisJfQkKKwl3cml0ZWwodmFsLCBncC0+cmVncyArIE1BQ19UWENGRyk7CisKKwl2YWwgPSAoTUFDX1hJRkNGR19PRSB8IE1BQ19YSUZDRkdfTExFRCk7CisJaWYgKCFmdWxsX2R1cGxleCAmJgorCSAgICAoZ3AtPnBoeV90eXBlID09IHBoeV9taWlfbWRpbzAgfHwKKwkgICAgIGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8xKSkgeworCQl2YWwgfD0gTUFDX1hJRkNGR19ESVNFOworCX0gZWxzZSBpZiAoZnVsbF9kdXBsZXgpIHsKKwkJdmFsIHw9IE1BQ19YSUZDRkdfRkxFRDsKKwl9CisKKwlpZiAoc3BlZWQgPT0gU1BFRURfMTAwMCkKKwkJdmFsIHw9IChNQUNfWElGQ0ZHX0dNSUkpOworCisJd3JpdGVsKHZhbCwgZ3AtPnJlZ3MgKyBNQUNfWElGQ0ZHKTsKKworCS8qIElmIGdpZ2FiaXQgYW5kIGhhbGYtZHVwbGV4LCBlbmFibGUgY2FycmllciBleHRlbnNpb24KKwkgKiBtb2RlLiAgRWxzZSwgZGlzYWJsZSBpdC4KKwkgKi8KKwlpZiAoc3BlZWQgPT0gU1BFRURfMTAwMCAmJiAhZnVsbF9kdXBsZXgpIHsKKwkJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfVFhDRkcpOworCQl3cml0ZWwodmFsIHwgTUFDX1RYQ0ZHX1RDRSwgZ3AtPnJlZ3MgKyBNQUNfVFhDRkcpOworCisJCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKwkJd3JpdGVsKHZhbCB8IE1BQ19SWENGR19SQ0UsIGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKwl9IGVsc2UgeworCQl2YWwgPSByZWFkbChncC0+cmVncyArIE1BQ19UWENGRyk7CisJCXdyaXRlbCh2YWwgJiB+TUFDX1RYQ0ZHX1RDRSwgZ3AtPnJlZ3MgKyBNQUNfVFhDRkcpOworCisJCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKwkJd3JpdGVsKHZhbCAmIH5NQUNfUlhDRkdfUkNFLCBncC0+cmVncyArIE1BQ19SWENGRyk7CisJfQorCisJaWYgKGdwLT5waHlfdHlwZSA9PSBwaHlfc2VyaWFsaW5rIHx8CisJICAgIGdwLT5waHlfdHlwZSA9PSBwaHlfc2VyZGVzKSB7CisgCQl1MzIgcGNzX2xwYSA9IHJlYWRsKGdwLT5yZWdzICsgUENTX01JSUxQKTsKKworCQlpZiAocGNzX2xwYSAmIChQQ1NfTUlJQURWX1NQIHwgUENTX01JSUFEVl9BUCkpCisJCQlwYXVzZSA9IDE7CisJfQorCisJaWYgKG5ldGlmX21zZ19saW5rKGdwKSkgeworCQlpZiAocGF1c2UpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQYXVzZSBpcyBlbmFibGVkICIKKwkJCSAgICAgICAiKHJ4ZmlmbzogJWQgb2ZmOiAlZCBvbjogJWQpXG4iLAorCQkJICAgICAgIGdwLT5kZXYtPm5hbWUsCisJCQkgICAgICAgZ3AtPnJ4X2ZpZm9fc3osCisJCQkgICAgICAgZ3AtPnJ4X3BhdXNlX29mZiwKKwkJCSAgICAgICBncC0+cnhfcGF1c2Vfb24pOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBhdXNlIGlzIGRpc2FibGVkXG4iLAorCQkJICAgICAgIGdwLT5kZXYtPm5hbWUpOworCQl9CisJfQorCisJaWYgKCFmdWxsX2R1cGxleCkKKwkJd3JpdGVsKDUxMiwgZ3AtPnJlZ3MgKyBNQUNfU1RJTUUpOworCWVsc2UKKwkJd3JpdGVsKDY0LCBncC0+cmVncyArIE1BQ19TVElNRSk7CisJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfTUNDRkcpOworCWlmIChwYXVzZSkKKwkJdmFsIHw9IChNQUNfTUNDRkdfU1BFIHwgTUFDX01DQ0ZHX1JQRSk7CisJZWxzZQorCQl2YWwgJj0gfihNQUNfTUNDRkdfU1BFIHwgTUFDX01DQ0ZHX1JQRSk7CisJd3JpdGVsKHZhbCwgZ3AtPnJlZ3MgKyBNQUNfTUNDRkcpOworCisJZ2VtX3N0YXJ0X2RtYShncCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gKi8KK3N0YXRpYyBpbnQgZ2VtX21kaW9fbGlua19ub3RfdXAoc3RydWN0IGdlbSAqZ3ApCit7CisJc3dpdGNoIChncC0+bHN0YXRlKSB7CisJY2FzZSBsaW5rX2ZvcmNlX3JldDoKKwkJaWYgKG5ldGlmX21zZ19saW5rKGdwKSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvbmVnIGZhaWxlZCBhZ2Fpbiwga2VlcGluZyIKKwkJCQkiIGZvcmNlZCBtb2RlXG4iLCBncC0+ZGV2LT5uYW1lKTsKKwkJZ3AtPnBoeV9taWkuZGVmLT5vcHMtPnNldHVwX2ZvcmNlZCgmZ3AtPnBoeV9taWksCisJCQlncC0+bGFzdF9mb3JjZWRfc3BlZWQsIERVUExFWF9IQUxGKTsKKwkJZ3AtPnRpbWVyX3RpY2tzID0gNTsKKwkJZ3AtPmxzdGF0ZSA9IGxpbmtfZm9yY2Vfb2s7CisJCXJldHVybiAwOworCWNhc2UgbGlua19hbmVnOgorCQkvKiBXZSB0cnkgZm9yY2VkIG1vZGVzIGFmdGVyIGEgZmFpbGVkIGFuZWcgb25seSBvbiBQSFlzIHRoYXQgZG9uJ3QKKwkJICogaGF2ZSAibWFnaWNfYW5lZyIgYml0IHNldCwgd2hpY2ggbWVhbnMgdGhleSBpbnRlcm5hbGx5IGRvIHRoZQorCQkgKiB3aGlsZSBmb3JjZWQtbW9kZSB0aGluZ3kuIE9uIHRoZXNlLCB3ZSBqdXN0IHJlc3RhcnQgYW5lZworCQkgKi8KKwkJaWYgKGdwLT5waHlfbWlpLmRlZi0+bWFnaWNfYW5lZykKKwkJCXJldHVybiAxOworCQlpZiAobmV0aWZfbXNnX2xpbmsoZ3ApKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN3aXRjaGluZyB0byBmb3JjZWQgMTAwYnRcbiIsCisJCQkJZ3AtPmRldi0+bmFtZSk7CisJCS8qIFRyeSBmb3JjZWQgbW9kZXMuICovCisJCWdwLT5waHlfbWlpLmRlZi0+b3BzLT5zZXR1cF9mb3JjZWQoJmdwLT5waHlfbWlpLCBTUEVFRF8xMDAsCisJCQlEVVBMRVhfSEFMRik7CisJCWdwLT50aW1lcl90aWNrcyA9IDU7CisJCWdwLT5sc3RhdGUgPSBsaW5rX2ZvcmNlX3RyeTsKKwkJcmV0dXJuIDA7CisJY2FzZSBsaW5rX2ZvcmNlX3RyeToKKwkJLyogRG93bmdyYWRlIGZyb20gMTAwIHRvIDEwIE1icHMgaWYgbmVjZXNzYXJ5LgorCQkgKiBJZiBhbHJlYWR5IGF0IDEwTWJwcywgd2FybiB1c2VyIGFib3V0IHRoZQorCQkgKiBzaXR1YXRpb24gZXZlcnkgMTAgdGlja3MuCisJCSAqLworCQlpZiAoZ3AtPnBoeV9taWkuc3BlZWQgPT0gU1BFRURfMTAwKSB7CisJCQlncC0+cGh5X21paS5kZWYtPm9wcy0+c2V0dXBfZm9yY2VkKCZncC0+cGh5X21paSwgU1BFRURfMTAsCisJCQkJRFVQTEVYX0hBTEYpOworCQkJZ3AtPnRpbWVyX3RpY2tzID0gNTsKKwkJCWlmIChuZXRpZl9tc2dfbGluayhncCkpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN3aXRjaGluZyB0byBmb3JjZWQgMTBidFxuIiwKKwkJCQkJZ3AtPmRldi0+bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdlbV9saW5rX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IChzdHJ1Y3QgZ2VtICopIGRhdGE7CisJaW50IHJlc3RhcnRfYW5lZyA9IDA7CisJCQorCWlmIChncC0+YXNsZWVwKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7CisJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CisJZ2VtX2dldF9jZWxsKGdwKTsKKworCS8qIElmIHRoZSByZXNldCB0YXNrIGlzIHN0aWxsIHBlbmRpbmcsIHdlIGp1c3QKKwkgKiByZXNjaGVkdWxlIHRoZSBsaW5rIHRpbWVyCisJICovCisJaWYgKGdwLT5yZXNldF90YXNrX3BlbmRpbmcpCisJCWdvdG8gcmVzdGFydDsKKwkgICAgCQorCWlmIChncC0+cGh5X3R5cGUgPT0gcGh5X3NlcmlhbGluayB8fAorCSAgICBncC0+cGh5X3R5cGUgPT0gcGh5X3NlcmRlcykgeworCQl1MzIgdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBQQ1NfTUlJU1RBVCk7CisKKwkJaWYgKCEodmFsICYgUENTX01JSVNUQVRfTFMpKQorCQkJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBQQ1NfTUlJU1RBVCk7CisKKwkJaWYgKCh2YWwgJiBQQ1NfTUlJU1RBVF9MUykgIT0gMCkgeworCQkJZ3AtPmxzdGF0ZSA9IGxpbmtfdXA7CisJCQluZXRpZl9jYXJyaWVyX29uKGdwLT5kZXYpOworCQkJKHZvaWQpZ2VtX3NldF9saW5rX21vZGVzKGdwKTsKKwkJfQorCQlnb3RvIHJlc3RhcnQ7CisJfQorCWlmIChmb3VuZF9taWlfcGh5KGdwKSAmJiBncC0+cGh5X21paS5kZWYtPm9wcy0+cG9sbF9saW5rKCZncC0+cGh5X21paSkpIHsKKwkJLyogT2ssIGhlcmUgd2UgZ290IGEgbGluay4gSWYgd2UgaGFkIGl0IGR1ZSB0byBhIGZvcmNlZAorCQkgKiBmYWxsYmFjaywgYW5kIHdlIHdlcmUgY29uZmlndXJlZCBmb3IgYXV0b25lZywgd2UgZG8KKwkJICogcmV0cnkgYSBzaG9ydCBhdXRvbmVnIHBhc3MuIElmIHlvdSBrbm93IHlvdXIgaHViIGlzCisJCSAqIGJyb2tlbiwgdXNlIGV0aHRvb2wgOykKKwkJICovCisJCWlmIChncC0+bHN0YXRlID09IGxpbmtfZm9yY2VfdHJ5ICYmIGdwLT53YW50X2F1dG9uZWcpIHsKKwkJCWdwLT5sc3RhdGUgPSBsaW5rX2ZvcmNlX3JldDsKKwkJCWdwLT5sYXN0X2ZvcmNlZF9zcGVlZCA9IGdwLT5waHlfbWlpLnNwZWVkOworCQkJZ3AtPnRpbWVyX3RpY2tzID0gNTsKKwkJCWlmIChuZXRpZl9tc2dfbGluayhncCkpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdvdCBsaW5rIGFmdGVyIGZhbGxiYWNrLCByZXRyeWluZyIKKwkJCQkJIiBhdXRvbmVnIG9uY2UuLi5cbiIsIGdwLT5kZXYtPm5hbWUpOworCQkJZ3AtPnBoeV9taWkuZGVmLT5vcHMtPnNldHVwX2FuZWcoJmdwLT5waHlfbWlpLCBncC0+cGh5X21paS5hZHZlcnRpc2luZyk7CisJCX0gZWxzZSBpZiAoZ3AtPmxzdGF0ZSAhPSBsaW5rX3VwKSB7CisJCQlncC0+bHN0YXRlID0gbGlua191cDsKKwkJCW5ldGlmX2NhcnJpZXJfb24oZ3AtPmRldik7CisJCQlpZiAoZ2VtX3NldF9saW5rX21vZGVzKGdwKSkKKwkJCQlyZXN0YXJ0X2FuZWcgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJLyogSWYgdGhlIGxpbmsgd2FzIHByZXZpb3VzbHkgdXAsIHdlIHJlc3RhcnQgdGhlCisJCSAqIHdob2xlIHByb2Nlc3MKKwkJICovCisJCWlmIChncC0+bHN0YXRlID09IGxpbmtfdXApIHsKKwkJCWdwLT5sc3RhdGUgPSBsaW5rX2Rvd247CisJCQlpZiAobmV0aWZfbXNnX2xpbmsoZ3ApKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGRvd25cbiIsCisJCQkJCWdwLT5kZXYtPm5hbWUpOworCQkJbmV0aWZfY2Fycmllcl9vZmYoZ3AtPmRldik7CisJCQlncC0+cmVzZXRfdGFza19wZW5kaW5nID0gMTsKKwkJCXNjaGVkdWxlX3dvcmsoJmdwLT5yZXNldF90YXNrKTsKKwkJCXJlc3RhcnRfYW5lZyA9IDE7CisJCX0gZWxzZSBpZiAoKytncC0+dGltZXJfdGlja3MgPiAxMCkgeworCQkJaWYgKGZvdW5kX21paV9waHkoZ3ApKQorCQkJCXJlc3RhcnRfYW5lZyA9IGdlbV9tZGlvX2xpbmtfbm90X3VwKGdwKTsKKwkJCWVsc2UKKwkJCQlyZXN0YXJ0X2FuZWcgPSAxOworCQl9CisJfQorCWlmIChyZXN0YXJ0X2FuZWcpIHsKKwkJZ2VtX2JlZ2luX2F1dG9fbmVnb3RpYXRpb24oZ3AsIE5VTEwpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorcmVzdGFydDoKKwltb2RfdGltZXIoJmdwLT5saW5rX3RpbWVyLCBqaWZmaWVzICsgKCgxMiAqIEhaKSAvIDEwKSk7CitvdXRfdW5sb2NrOgorCWdlbV9wdXRfY2VsbChncCk7CisJc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKK30KKworLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gKi8KK3N0YXRpYyB2b2lkIGdlbV9jbGVhbl9yaW5ncyhzdHJ1Y3QgZ2VtICpncCkKK3sKKwlzdHJ1Y3QgZ2VtX2luaXRfYmxvY2sgKmdiID0gZ3AtPmluaXRfYmxvY2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaTsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBnZW1fcnhkICpyeGQ7CisKKwkJcnhkID0gJmdiLT5yeGRbaV07CisJCWlmIChncC0+cnhfc2tic1tpXSAhPSBOVUxMKSB7CisJCQlza2IgPSBncC0+cnhfc2tic1tpXTsKKwkJCWRtYV9hZGRyID0gbGU2NF90b19jcHUocnhkLT5idWZmZXIpOworCQkJcGNpX3VubWFwX3BhZ2UoZ3AtPnBkZXYsIGRtYV9hZGRyLAorCQkJCSAgICAgICBSWF9CVUZfQUxMT0NfU0laRShncCksCisJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJZ3AtPnJ4X3NrYnNbaV0gPSBOVUxMOworCQl9CisJCXJ4ZC0+c3RhdHVzX3dvcmQgPSAwOworCQl3bWIoKTsKKwkJcnhkLT5idWZmZXIgPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoZ3AtPnR4X3NrYnNbaV0gIT0gTlVMTCkgeworCQkJc3RydWN0IGdlbV90eGQgKnR4ZDsKKwkJCWludCBmcmFnOworCisJCQlza2IgPSBncC0+dHhfc2tic1tpXTsKKwkJCWdwLT50eF9za2JzW2ldID0gTlVMTDsKKworCQkJZm9yIChmcmFnID0gMDsgZnJhZyA8PSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmcmFnKyspIHsKKwkJCQlpbnQgZW50ID0gaSAmIChUWF9SSU5HX1NJWkUgLSAxKTsKKworCQkJCXR4ZCA9ICZnYi0+dHhkW2VudF07CisJCQkJZG1hX2FkZHIgPSBsZTY0X3RvX2NwdSh0eGQtPmJ1ZmZlcik7CisJCQkJcGNpX3VubWFwX3BhZ2UoZ3AtPnBkZXYsIGRtYV9hZGRyLAorCQkJCQkgICAgICAgbGU2NF90b19jcHUodHhkLT5jb250cm9sX3dvcmQpICYKKwkJCQkJICAgICAgIFRYRENUUkxfQlVGU1osIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCQkJaWYgKGZyYWcgIT0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykKKwkJCQkJaSsrOworCQkJfQorCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJfQorCX0KK30KKworLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gKi8KK3N0YXRpYyB2b2lkIGdlbV9pbml0X3JpbmdzKHN0cnVjdCBnZW0gKmdwKQoreworCXN0cnVjdCBnZW1faW5pdF9ibG9jayAqZ2IgPSBncC0+aW5pdF9ibG9jazsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZ3AtPmRldjsKKwlpbnQgaTsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCisJZ3AtPnJ4X25ldyA9IGdwLT5yeF9vbGQgPSBncC0+dHhfbmV3ID0gZ3AtPnR4X29sZCA9IDA7CisKKwlnZW1fY2xlYW5fcmluZ3MoZ3ApOworCisJZ3AtPnJ4X2J1Zl9zeiA9IG1heChkZXYtPm10dSArIEVUSF9ITEVOICsgVkxBTl9ITEVOLAorCQkJICAgICh1bnNpZ25lZClWTEFOX0VUSF9GUkFNRV9MRU4pOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXN0cnVjdCBnZW1fcnhkICpyeGQgPSAmZ2ItPnJ4ZFtpXTsKKworCQlza2IgPSBnZW1fYWxsb2Nfc2tiKFJYX0JVRl9BTExPQ19TSVpFKGdwKSwgR0ZQX0FUT01JQyk7CisJCWlmICghc2tiKSB7CisJCQlyeGQtPmJ1ZmZlciA9IDA7CisJCQlyeGQtPnN0YXR1c193b3JkID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZ3AtPnJ4X3NrYnNbaV0gPSBza2I7CisJCXNrYi0+ZGV2ID0gZGV2OworCQlza2JfcHV0KHNrYiwgKGdwLT5yeF9idWZfc3ogKyBSWF9PRkZTRVQpKTsKKwkJZG1hX2FkZHIgPSBwY2lfbWFwX3BhZ2UoZ3AtPnBkZXYsCisJCQkJCXZpcnRfdG9fcGFnZShza2ItPmRhdGEpLAorCQkJCQlvZmZzZXRfaW5fcGFnZShza2ItPmRhdGEpLAorCQkJCQlSWF9CVUZfQUxMT0NfU0laRShncCksCisJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCXJ4ZC0+YnVmZmVyID0gY3B1X3RvX2xlNjQoZG1hX2FkZHIpOworCQl3bWIoKTsKKwkJcnhkLT5zdGF0dXNfd29yZCA9IGNwdV90b19sZTY0KFJYRENUUkxfRlJFU0goZ3ApKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCBSWF9PRkZTRVQpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgZ2VtX3R4ZCAqdHhkID0gJmdiLT50eGRbaV07CisKKwkJdHhkLT5jb250cm9sX3dvcmQgPSAwOworCQl3bWIoKTsKKwkJdHhkLT5idWZmZXIgPSAwOworCX0KKwl3bWIoKTsKK30KKworLyogSW5pdCBQSFkgaW50ZXJmYWNlIGFuZCBzdGFydCBsaW5rIHBvbGwgc3RhdGUgbWFjaGluZSAqLworc3RhdGljIHZvaWQgZ2VtX2luaXRfcGh5KHN0cnVjdCBnZW0gKmdwKQoreworCXUzMiBtaWZjZmc7CisKKwkvKiBSZXZlcnQgTUlGIENGRyBzZXR0aW5nIGRvbmUgb24gc3RvcF9waHkgKi8KKwltaWZjZmcgPSByZWFkbChncC0+cmVncyArIE1JRl9DRkcpOworCW1pZmNmZyAmPSB+TUlGX0NGR19CQk1PREU7CisJd3JpdGVsKG1pZmNmZywgZ3AtPnJlZ3MgKyBNSUZfQ0ZHKTsKKwkKKwlpZiAoZ3AtPnBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FQUExFKSB7CisJCWludCBpOworCisJCS8qIFRob3NlIGRlbGF5IHN1Y2tzLCB0aGUgSFcgc2VlbSB0byBsb3ZlIHRoZW0gdGhvdWdoLCBJJ2xsCisJCSAqIHNlcmlzb3VseSBjb25zaWRlciBicmVha2luZyBzb21lIGxvY2tzIGhlcmUgdG8gYmUgYWJsZQorCQkgKiB0byBzY2hlZHVsZSBpbnN0ZWFkCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9HTUFDX1BIWV9SRVNFVCwgZ3AtPm9mX25vZGUsIDAsIDApOworCQkJbXNsZWVwKDIwKTsKKyNlbmRpZgorCQkJLyogU29tZSBQSFlzIHVzZWQgYnkgYXBwbGUgaGF2ZSBwcm9ibGVtIGdldHRpbmcgYmFjayB0byB1cywKKwkJCSAqIHdlIGRvIGFuIGFkZGl0aW9uYWwgcmVzZXQgaGVyZQorCQkJICovCisJCQlwaHlfd3JpdGUoZ3AsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKwkJCW1zbGVlcCgyMCk7CisJCQlpZiAocGh5X3JlYWQoZ3AsIE1JSV9CTUNSKSAhPSAweGZmZmYpCisJCQkJYnJlYWs7CisJCQlpZiAoaSA9PSAyKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBHTUFDIFBIWSBub3QgcmVzcG9uZGluZyAhXG4iLAorCQkJCSAgICAgICBncC0+ZGV2LT5uYW1lKTsKKwkJfQorCX0KKworCWlmIChncC0+cGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU1VOICYmCisJICAgIGdwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fR0VNKSB7CisJCXUzMiB2YWw7CisKKwkJLyogSW5pdCBkYXRhcGF0aCBtb2RlIHJlZ2lzdGVyLiAqLworCQlpZiAoZ3AtPnBoeV90eXBlID09IHBoeV9taWlfbWRpbzAgfHwKKwkJICAgIGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8xKSB7CisJCQl2YWwgPSBQQ1NfRE1PREVfTUdNOworCQl9IGVsc2UgaWYgKGdwLT5waHlfdHlwZSA9PSBwaHlfc2VyaWFsaW5rKSB7CisJCQl2YWwgPSBQQ1NfRE1PREVfU00gfCBQQ1NfRE1PREVfR01PRTsKKwkJfSBlbHNlIHsKKwkJCXZhbCA9IFBDU19ETU9ERV9FU007CisJCX0KKworCQl3cml0ZWwodmFsLCBncC0+cmVncyArIFBDU19ETU9ERSk7CisJfQorCisJaWYgKGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8wIHx8CisJICAgIGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8xKSB7CisJICAgIAkvLyBYWFggY2hlY2sgZm9yIGVycm9ycworCQltaWlfcGh5X3Byb2JlKCZncC0+cGh5X21paSwgZ3AtPm1paV9waHlfYWRkcik7CisKKwkJLyogSW5pdCBQSFkgKi8KKwkJaWYgKGdwLT5waHlfbWlpLmRlZiAmJiBncC0+cGh5X21paS5kZWYtPm9wcy0+aW5pdCkKKwkJCWdwLT5waHlfbWlpLmRlZi0+b3BzLT5pbml0KCZncC0+cGh5X21paSk7CisJfSBlbHNlIHsKKwkJdTMyIHZhbDsKKwkJaW50IGxpbWl0OworCisJCS8qIFJlc2V0IFBDUyB1bml0LiAqLworCQl2YWwgPSByZWFkbChncC0+cmVncyArIFBDU19NSUlDVFJMKTsKKwkJdmFsIHw9IFBDU19NSUlDVFJMX1JTVDsKKwkJd3JpdGViKHZhbCwgZ3AtPnJlZ3MgKyBQQ1NfTUlJQ1RSTCk7CisKKwkJbGltaXQgPSAzMjsKKwkJd2hpbGUgKHJlYWRsKGdwLT5yZWdzICsgUENTX01JSUNUUkwpICYgUENTX01JSUNUUkxfUlNUKSB7CisJCQl1ZGVsYXkoMTAwKTsKKwkJCWlmIChsaW1pdC0tIDw9IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGxpbWl0IDw9IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUENTIHJlc2V0IGJpdCB3b3VsZCBub3QgY2xlYXIuXG4iLAorCQkJICAgICAgIGdwLT5kZXYtPm5hbWUpOworCisJCS8qIE1ha2Ugc3VyZSBQQ1MgaXMgZGlzYWJsZWQgd2hpbGUgY2hhbmdpbmcgYWR2ZXJ0aXNlbWVudAorCQkgKiBjb25maWd1cmF0aW9uLgorCQkgKi8KKwkJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBQQ1NfQ0ZHKTsKKwkJdmFsICY9IH4oUENTX0NGR19FTkFCTEUgfCBQQ1NfQ0ZHX1RPKTsKKwkJd3JpdGVsKHZhbCwgZ3AtPnJlZ3MgKyBQQ1NfQ0ZHKTsKKworCQkvKiBBZHZlcnRpc2UgYWxsIGNhcGFiaWxpdGllcyBleGNlcHQgYXNzeW1ldHJpYworCQkgKiBwYXVzZS4KKwkJICovCisJCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgUENTX01JSUFEVik7CisJCXZhbCB8PSAoUENTX01JSUFEVl9GRCB8IFBDU19NSUlBRFZfSEQgfAorCQkJUENTX01JSUFEVl9TUCB8IFBDU19NSUlBRFZfQVApOworCQl3cml0ZWwodmFsLCBncC0+cmVncyArIFBDU19NSUlBRFYpOworCisJCS8qIEVuYWJsZSBhbmQgcmVzdGFydCBhdXRvLW5lZ290aWF0aW9uLCBkaXNhYmxlIHdyYXBiYWNrL2xvb3BiYWNrLAorCQkgKiBhbmQgcmUtZW5hYmxlIFBDUy4KKwkJICovCisJCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgUENTX01JSUNUUkwpOworCQl2YWwgfD0gKFBDU19NSUlDVFJMX1JBTiB8IFBDU19NSUlDVFJMX0FORSk7CisJCXZhbCAmPSB+UENTX01JSUNUUkxfV0I7CisJCXdyaXRlbCh2YWwsIGdwLT5yZWdzICsgUENTX01JSUNUUkwpOworCisJCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgUENTX0NGRyk7CisJCXZhbCB8PSBQQ1NfQ0ZHX0VOQUJMRTsKKwkJd3JpdGVsKHZhbCwgZ3AtPnJlZ3MgKyBQQ1NfQ0ZHKTsKKworCQkvKiBNYWtlIHN1cmUgc2VyaWFsaW5rIGxvb3BiYWNrIGlzIG9mZi4gIFRoZSBtZWFuaW5nCisJCSAqIG9mIHRoaXMgYml0IGlzIGxvZ2ljYWxseSBpbnZlcnRlZCBiYXNlZCB1cG9uIHdoZXRoZXIKKwkJICogeW91IGFyZSBpbiBTZXJpYWxpbmsgb3IgU0VSREVTIG1vZGUuCisJCSAqLworCQl2YWwgPSByZWFkbChncC0+cmVncyArIFBDU19TQ1RSTCk7CisJCWlmIChncC0+cGh5X3R5cGUgPT0gcGh5X3NlcmlhbGluaykKKwkJCXZhbCAmPSB+UENTX1NDVFJMX0xPT1A7CisJCWVsc2UKKwkJCXZhbCB8PSBQQ1NfU0NUUkxfTE9PUDsKKwkJd3JpdGVsKHZhbCwgZ3AtPnJlZ3MgKyBQQ1NfU0NUUkwpOworCX0KKworCS8qIERlZmF1bHQgYW5lZyBwYXJhbWV0ZXJzICovCisJZ3AtPnRpbWVyX3RpY2tzID0gMDsKKwlncC0+bHN0YXRlID0gbGlua19kb3duOworCW5ldGlmX2NhcnJpZXJfb2ZmKGdwLT5kZXYpOworCisJLyogQ2FuIEkgYWR2ZXJ0aXNlIGdpZ2FiaXQgaGVyZSA/IEknZCBuZWVkIEJDTSBQSFkgZG9jcy4uLiAqLworCXNwaW5fbG9ja19pcnEoJmdwLT5sb2NrKTsKKwlnZW1fYmVnaW5fYXV0b19uZWdvdGlhdGlvbihncCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7Cit9CisKKy8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCitzdGF0aWMgdm9pZCBnZW1faW5pdF9kbWEoc3RydWN0IGdlbSAqZ3ApCit7CisJdTY0IGRlc2NfZG1hID0gKHU2NCkgZ3AtPmdibG9ja19kdm1hOworCXUzMiB2YWw7CisKKwl2YWwgPSAoVFhETUFfQ0ZHX0JBU0UgfCAoMHg3ZmYgPDwgMTApIHwgVFhETUFfQ0ZHX1BNT0RFKTsKKwl3cml0ZWwodmFsLCBncC0+cmVncyArIFRYRE1BX0NGRyk7CisKKwl3cml0ZWwoZGVzY19kbWEgPj4gMzIsIGdwLT5yZWdzICsgVFhETUFfREJISSk7CisJd3JpdGVsKGRlc2NfZG1hICYgMHhmZmZmZmZmZiwgZ3AtPnJlZ3MgKyBUWERNQV9EQkxPVyk7CisJZGVzY19kbWEgKz0gKElOSVRfQkxPQ0tfVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCBnZW1fdHhkKSk7CisKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBUWERNQV9LSUNLKTsKKworCXZhbCA9IChSWERNQV9DRkdfQkFTRSB8IChSWF9PRkZTRVQgPDwgMTApIHwKKwkgICAgICAgKCgxNCAvIDIpIDw8IDEzKSB8IFJYRE1BX0NGR19GVEhSRVNIXzEyOCk7CisJd3JpdGVsKHZhbCwgZ3AtPnJlZ3MgKyBSWERNQV9DRkcpOworCisJd3JpdGVsKGRlc2NfZG1hID4+IDMyLCBncC0+cmVncyArIFJYRE1BX0RCSEkpOworCXdyaXRlbChkZXNjX2RtYSAmIDB4ZmZmZmZmZmYsIGdwLT5yZWdzICsgUlhETUFfREJMT1cpOworCisJd3JpdGVsKFJYX1JJTkdfU0laRSAtIDQsIGdwLT5yZWdzICsgUlhETUFfS0lDSyk7CisKKwl2YWwgID0gKCgoZ3AtPnJ4X3BhdXNlX29mZiAvIDY0KSA8PCAwKSAmIFJYRE1BX1BUSFJFU0hfT0ZGKTsKKwl2YWwgfD0gKCgoZ3AtPnJ4X3BhdXNlX29uIC8gNjQpIDw8IDEyKSAmIFJYRE1BX1BUSFJFU0hfT04pOworCXdyaXRlbCh2YWwsIGdwLT5yZWdzICsgUlhETUFfUFRIUkVTSCk7CisKKwlpZiAocmVhZGwoZ3AtPnJlZ3MgKyBHUkVHX0JJRkNGRykgJiBHUkVHX0JJRkNGR19NNjZFTikKKwkJd3JpdGVsKCgoNSAmIFJYRE1BX0JMQU5LX0lQS1RTKSB8CisJCQkoKDggPDwgMTIpICYgUlhETUFfQkxBTktfSVRJTUUpKSwKKwkJICAgICAgIGdwLT5yZWdzICsgUlhETUFfQkxBTkspOworCWVsc2UKKwkJd3JpdGVsKCgoNSAmIFJYRE1BX0JMQU5LX0lQS1RTKSB8CisJCQkoKDQgPDwgMTIpICYgUlhETUFfQkxBTktfSVRJTUUpKSwKKwkJICAgICAgIGdwLT5yZWdzICsgUlhETUFfQkxBTkspOworfQorCisvKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLworc3RhdGljIHUzMiBnZW1fc2V0dXBfbXVsdGljYXN0KHN0cnVjdCBnZW0gKmdwKQoreworCXUzMiByeGNmZyA9IDA7CisJaW50IGk7CisJCisJaWYgKChncC0+ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwKKwkgICAgKGdwLT5kZXYtPm1jX2NvdW50ID4gMjU2KSkgeworCSAgICAJZm9yIChpPTA7IGk8MTY7IGkrKykKKwkJCXdyaXRlbCgweGZmZmYsIGdwLT5yZWdzICsgTUFDX0hBU0gwICsgKGkgPDwgMikpOworCQlyeGNmZyB8PSBNQUNfUlhDRkdfSEZFOworCX0gZWxzZSBpZiAoZ3AtPmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlyeGNmZyB8PSBNQUNfUlhDRkdfUFJPTTsKKwl9IGVsc2UgeworCQl1MTYgaGFzaF90YWJsZVsxNl07CisJCXUzMiBjcmM7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZ3AtPmRldi0+bWNfbGlzdDsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQloYXNoX3RhYmxlW2ldID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgZ3AtPmRldi0+bWNfY291bnQ7IGkrKykgeworCQkJY2hhciAqYWRkcnMgPSBkbWktPmRtaV9hZGRyOworCisJCQlkbWkgPSBkbWktPm5leHQ7CisKKwkJCWlmICghKCphZGRycyAmIDEpKQorCQkJCWNvbnRpbnVlOworCisgCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwkJCWNyYyA+Pj0gMjQ7CisJCQloYXNoX3RhYmxlW2NyYyA+PiA0XSB8PSAxIDw8ICgxNSAtIChjcmMgJiAweGYpKTsKKwkJfQorCSAgICAJZm9yIChpPTA7IGk8MTY7IGkrKykKKwkJCXdyaXRlbChoYXNoX3RhYmxlW2ldLCBncC0+cmVncyArIE1BQ19IQVNIMCArIChpIDw8IDIpKTsKKwkJcnhjZmcgfD0gTUFDX1JYQ0ZHX0hGRTsKKwl9CisKKwlyZXR1cm4gcnhjZmc7Cit9CisKKy8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCitzdGF0aWMgdm9pZCBnZW1faW5pdF9tYWMoc3RydWN0IGdlbSAqZ3ApCit7CisJdW5zaWduZWQgY2hhciAqZSA9ICZncC0+ZGV2LT5kZXZfYWRkclswXTsKKworCXdyaXRlbCgweDFiZjAsIGdwLT5yZWdzICsgTUFDX1NORFBBVVNFKTsKKworCXdyaXRlbCgweDAwLCBncC0+cmVncyArIE1BQ19JUEcwKTsKKwl3cml0ZWwoMHgwOCwgZ3AtPnJlZ3MgKyBNQUNfSVBHMSk7CisJd3JpdGVsKDB4MDQsIGdwLT5yZWdzICsgTUFDX0lQRzIpOworCXdyaXRlbCgweDQwLCBncC0+cmVncyArIE1BQ19TVElNRSk7CisJd3JpdGVsKDB4NDAsIGdwLT5yZWdzICsgTUFDX01JTkZTWik7CisKKwkvKiBFdGhlcm5ldCBwYXlsb2FkICsgaGVhZGVyICsgRkNTICsgb3B0aW9uYWwgVkxBTiB0YWcuICovCisJd3JpdGVsKDB4MjAwMDAwMDAgfCAoZ3AtPnJ4X2J1Zl9zeiArIDQpLCBncC0+cmVncyArIE1BQ19NQVhGU1opOworCisJd3JpdGVsKDB4MDcsIGdwLT5yZWdzICsgTUFDX1BBU0laRSk7CisJd3JpdGVsKDB4MDQsIGdwLT5yZWdzICsgTUFDX0pBTVNJWkUpOworCXdyaXRlbCgweDEwLCBncC0+cmVncyArIE1BQ19BVFRMSU0pOworCXdyaXRlbCgweDg4MDgsIGdwLT5yZWdzICsgTUFDX01DVFlQRSk7CisKKwl3cml0ZWwoKGVbNV0gfCAoZVs0XSA8PCA4KSkgJiAweDNmZiwgZ3AtPnJlZ3MgKyBNQUNfUkFORFNFRUQpOworCisJd3JpdGVsKChlWzRdIDw8IDgpIHwgZVs1XSwgZ3AtPnJlZ3MgKyBNQUNfQUREUjApOworCXdyaXRlbCgoZVsyXSA8PCA4KSB8IGVbM10sIGdwLT5yZWdzICsgTUFDX0FERFIxKTsKKwl3cml0ZWwoKGVbMF0gPDwgOCkgfCBlWzFdLCBncC0+cmVncyArIE1BQ19BRERSMik7CisKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfQUREUjMpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19BRERSNCk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0FERFI1KTsKKworCXdyaXRlbCgweDAwMDEsIGdwLT5yZWdzICsgTUFDX0FERFI2KTsKKwl3cml0ZWwoMHhjMjAwLCBncC0+cmVncyArIE1BQ19BRERSNyk7CisJd3JpdGVsKDB4MDE4MCwgZ3AtPnJlZ3MgKyBNQUNfQUREUjgpOworCisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0FGSUxUMCk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0FGSUxUMSk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0FGSUxUMik7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0FGMjFNU0spOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19BRjBNU0spOworCisJZ3AtPm1hY19yeF9jZmcgPSBnZW1fc2V0dXBfbXVsdGljYXN0KGdwKTsKKyNpZmRlZiBTVFJJUF9GQ1MKKwlncC0+bWFjX3J4X2NmZyB8PSBNQUNfUlhDRkdfU0ZDUzsKKyNlbmRpZgorCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19OQ09MTCk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0ZBU1VDQyk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0VDT0xMKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfTENPTEwpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19EVElNRVIpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19QQVRNUFMpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19SRkNUUik7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0xFUlIpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19BRVJSKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfRkNTRVJSKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfUlhDVkVSUik7CisKKwkvKiBDbGVhciBSWC9UWC9NQUMvWElGIGNvbmZpZywgd2Ugd2lsbCBzZXQgdGhlc2UgdXAgYW5kIGVuYWJsZQorCSAqIHRoZW0gb25jZSBhIGxpbmsgaXMgZXN0YWJsaXNoZWQuCisJICovCisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX1RYQ0ZHKTsKKwl3cml0ZWwoZ3AtPm1hY19yeF9jZmcsIGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfTUNDRkcpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19YSUZDRkcpOworCisJLyogU2V0dXAgTUFDIGludGVycnVwdHMuICBXZSB3YW50IHRvIGdldCBhbGwgb2YgdGhlIGludGVyZXN0aW5nCisJICogY291bnRlciBleHBpcmF0aW9uIGV2ZW50cywgYnV0IHdlIGRvIG5vdCB3YW50IHRvIGhlYXIgYWJvdXQKKwkgKiBub3JtYWwgcngvdHggYXMgdGhlIERNQSBlbmdpbmUgdGVsbHMgdXMgdGhhdC4KKwkgKi8KKwl3cml0ZWwoTUFDX1RYU1RBVF9YTUlULCBncC0+cmVncyArIE1BQ19UWE1BU0spOworCXdyaXRlbChNQUNfUlhTVEFUX1JDViwgZ3AtPnJlZ3MgKyBNQUNfUlhNQVNLKTsKKworCS8qIERvbid0IGVuYWJsZSBldmVuIHRoZSBQQVVTRSBpbnRlcnJ1cHRzIGZvciBub3csIHdlCisJICogbWFrZSBubyB1c2Ugb2YgdGhvc2UgZXZlbnRzIG90aGVyIHRoYW4gdG8gcmVjb3JkIHRoZW0uCisJICovCisJd3JpdGVsKDB4ZmZmZmZmZmYsIGdwLT5yZWdzICsgTUFDX01DTUFTSyk7CisKKwkvKiBEb24ndCBlbmFibGUgR0VNJ3MgV09MIGluIG5vcm1hbCBvcGVyYXRpb25zCisJICovCisJaWYgKGdwLT5oYXNfd29sKQorCQl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBXT0xfV0FLRUNTUik7Cit9CisKKy8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCitzdGF0aWMgdm9pZCBnZW1faW5pdF9wYXVzZV90aHJlc2hvbGRzKHN0cnVjdCBnZW0gKmdwKQoreworICAgICAgIAl1MzIgY2ZnOworCisJLyogQ2FsY3VsYXRlIHBhdXNlIHRocmVzaG9sZHMuICBTZXR0aW5nIHRoZSBPRkYgdGhyZXNob2xkIHRvIHRoZQorCSAqIGZ1bGwgUlggZmlmbyBzaXplIGVmZmVjdGl2ZWx5IGRpc2FibGVzIFBBVVNFIGdlbmVyYXRpb24gd2hpY2gKKwkgKiBpcyB3aGF0IHdlIGRvIGZvciAxMC8xMDAgb25seSBHRU1zIHdoaWNoIGhhdmUgRklGT3MgdG9vIHNtYWxsCisJICogdG8gbWFrZSByZWFsIGdhaW5zIGZyb20gUEFVU0UuCisJICovCisJaWYgKGdwLT5yeF9maWZvX3N6IDw9ICgyICogMTAyNCkpIHsKKwkJZ3AtPnJ4X3BhdXNlX29mZiA9IGdwLT5yeF9wYXVzZV9vbiA9IGdwLT5yeF9maWZvX3N6OworCX0gZWxzZSB7CisJCWludCBtYXhfZnJhbWUgPSAoZ3AtPnJ4X2J1Zl9zeiArIDQgKyA2NCkgJiB+NjM7CisJCWludCBvZmYgPSAoZ3AtPnJ4X2ZpZm9fc3ogLSAobWF4X2ZyYW1lICogMikpOworCQlpbnQgb24gPSBvZmYgLSBtYXhfZnJhbWU7CisKKwkJZ3AtPnJ4X3BhdXNlX29mZiA9IG9mZjsKKwkJZ3AtPnJ4X3BhdXNlX29uID0gb247CisJfQorCisKKwkvKiBDb25maWd1cmUgdGhlIGNoaXAgImJ1cnN0IiBETUEgbW9kZSAmIGVuYWJsZSBzb21lCisJICogSFcgYnVnIGZpeGVzIG9uIEFwcGxlIHZlcnNpb24KKwkgKi8KKyAgICAgICAJY2ZnICA9IDA7CisgICAgICAgCWlmIChncC0+cGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVBQTEUpCisJCWNmZyB8PSBHUkVHX0NGR19ST05QQVVMQklUIHwgR1JFR19DRkdfRU5CVUcyRklYOworI2lmICFkZWZpbmVkKENPTkZJR19TUEFSQzY0KSAmJiAhZGVmaW5lZChDT05GSUdfQUxQSEEpCisgICAgICAgCWNmZyB8PSBHUkVHX0NGR19JQlVSU1Q7CisjZW5kaWYKKyAgICAgICAJY2ZnIHw9ICgoMzEgPDwgMSkgJiBHUkVHX0NGR19UWERNQUxJTSk7CisgICAgICAgCWNmZyB8PSAoKDMxIDw8IDYpICYgR1JFR19DRkdfUlhETUFMSU0pOworICAgICAgIAl3cml0ZWwoY2ZnLCBncC0+cmVncyArIEdSRUdfQ0ZHKTsKKworCS8qIElmIEluZmluaXRlIEJ1cnN0IGRpZG4ndCBzdGljaywgdGhlbiB1c2UgZGlmZmVyZW50CisJICogdGhyZXNob2xkcyAoYW5kIEFwcGxlIGJ1ZyBmaXhlcyBkb24ndCBleGlzdCkKKwkgKi8KKwlpZiAoIShyZWFkbChncC0+cmVncyArIEdSRUdfQ0ZHKSAmIEdSRUdfQ0ZHX0lCVVJTVCkpIHsKKwkJY2ZnID0gKCgyIDw8IDEpICYgR1JFR19DRkdfVFhETUFMSU0pOworCQljZmcgfD0gKCg4IDw8IDYpICYgR1JFR19DRkdfUlhETUFMSU0pOworCQl3cml0ZWwoY2ZnLCBncC0+cmVncyArIEdSRUdfQ0ZHKTsKKwl9CQorfQorCitzdGF0aWMgaW50IGdlbV9jaGVja19pbnZhcmlhbnRzKHN0cnVjdCBnZW0gKmdwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZ3AtPnBkZXY7CisJdTMyIG1pZl9jZmc7CisKKwkvKiBPbiBBcHBsZSdzIHN1bmdlbSwgd2UgY2FuJ3QgcmVseSBvbiByZWdpc3RlcnMgYXMgdGhlIGNoaXAKKwkgKiB3YXMgYmVlbiBwb3dlcmVkIGRvd24gYnkgdGhlIGZpcm13YXJlLiBUaGUgUEhZIGlzIGxvb2tlZAorCSAqIHVwIGxhdGVyIG9uLgorCSAqLworCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BUFBMRSkgeworCQlncC0+cGh5X3R5cGUgPSBwaHlfbWlpX21kaW8wOworCQlncC0+dHhfZmlmb19zeiA9IHJlYWRsKGdwLT5yZWdzICsgVFhETUFfRlNaKSAqIDY0OworCQlncC0+cnhfZmlmb19zeiA9IHJlYWRsKGdwLT5yZWdzICsgUlhETUFfRlNaKSAqIDY0OworCQlncC0+c3dyc3RfYmFzZSA9IDA7CisKKwkJbWlmX2NmZyA9IHJlYWRsKGdwLT5yZWdzICsgTUlGX0NGRyk7CisJCW1pZl9jZmcgJj0gfihNSUZfQ0ZHX1BTRUxFQ1R8TUlGX0NGR19QT0xMfE1JRl9DRkdfQkJNT0RFfE1JRl9DRkdfTURJMSk7CisJCW1pZl9jZmcgfD0gTUlGX0NGR19NREkwOworCQl3cml0ZWwobWlmX2NmZywgZ3AtPnJlZ3MgKyBNSUZfQ0ZHKTsKKwkJd3JpdGVsKFBDU19ETU9ERV9NR00sIGdwLT5yZWdzICsgUENTX0RNT0RFKTsKKwkJd3JpdGVsKE1BQ19YSUZDRkdfT0UsIGdwLT5yZWdzICsgTUFDX1hJRkNGRyk7CisKKwkJLyogV2UgaGFyZC1jb2RlIHRoZSBQSFkgYWRkcmVzcyBzbyB3ZSBjYW4gcHJvcGVybHkgYnJpbmcgaXQgb3V0IG9mCisJCSAqIHJlc2V0IGxhdGVyIG9uLCB3ZSBjYW4ndCByZWFsbHkgcHJvYmUgaXQgYXQgdGhpcyBwb2ludCwgdGhvdWdoCisJCSAqIHRoYXQgaXNuJ3QgYW4gaXNzdWUuCisJCSAqLworCQlpZiAoZ3AtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FQUExFX0syX0dNQUMpCisJCQlncC0+bWlpX3BoeV9hZGRyID0gMTsKKwkJZWxzZQorCQkJZ3AtPm1paV9waHlfYWRkciA9IDA7CisKKwkJcmV0dXJuIDA7CisJfQorCisJbWlmX2NmZyA9IHJlYWRsKGdwLT5yZWdzICsgTUlGX0NGRyk7CisKKwlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU1VOICYmCisJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NVTl9SSU9fR0VNKSB7CisJCS8qIE9uZSBvZiB0aGUgTUlJIFBIWXMgX211c3RfIGJlIHByZXNlbnQKKwkJICogYXMgdGhpcyBjaGlwIGhhcyBubyBnaWdhYml0IFBIWS4KKwkJICovCisJCWlmICgobWlmX2NmZyAmIChNSUZfQ0ZHX01ESTAgfCBNSUZfQ0ZHX01ESTEpKSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJSSU8gR0VNIGxhY2tzIE1JSSBwaHksIG1pZl9jZmdbJTA4eF1cbiIsCisJCQkgICAgICAgbWlmX2NmZyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKiBEZXRlcm1pbmUgaW5pdGlhbCBQSFkgaW50ZXJmYWNlIHR5cGUgZ3Vlc3MuICBNRElPMSBpcyB0aGUKKwkgKiBleHRlcm5hbCBQSFkgYW5kIHRodXMgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIE1ESU8wLgorCSAqLworCQorCWlmIChtaWZfY2ZnICYgTUlGX0NGR19NREkxKSB7CisJCWdwLT5waHlfdHlwZSA9IHBoeV9taWlfbWRpbzE7CisJCW1pZl9jZmcgfD0gTUlGX0NGR19QU0VMRUNUOworCQl3cml0ZWwobWlmX2NmZywgZ3AtPnJlZ3MgKyBNSUZfQ0ZHKTsKKwl9IGVsc2UgaWYgKG1pZl9jZmcgJiBNSUZfQ0ZHX01ESTApIHsKKwkJZ3AtPnBoeV90eXBlID0gcGh5X21paV9tZGlvMDsKKwkJbWlmX2NmZyAmPSB+TUlGX0NGR19QU0VMRUNUOworCQl3cml0ZWwobWlmX2NmZywgZ3AtPnJlZ3MgKyBNSUZfQ0ZHKTsKKwl9IGVsc2UgeworCQlncC0+cGh5X3R5cGUgPSBwaHlfc2VyaWFsaW5rOworCX0KKwlpZiAoZ3AtPnBoeV90eXBlID09IHBoeV9taWlfbWRpbzEgfHwKKwkgICAgZ3AtPnBoeV90eXBlID09IHBoeV9taWlfbWRpbzApIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJCWdwLT5taWlfcGh5X2FkZHIgPSBpOworCQkJaWYgKHBoeV9yZWFkKGdwLCBNSUlfQk1DUikgIT0gMHhmZmZmKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpID09IDMyKSB7CisJCQlpZiAocGRldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfU1VOX0dFTSkgeworCQkJCXByaW50ayhLRVJOX0VSUiBQRlggIlJJTyBNSUkgcGh5IHdpbGwgbm90IHJlc3BvbmQuXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlncC0+cGh5X3R5cGUgPSBwaHlfc2VyZGVzOworCQl9CisJfQorCisJLyogRmV0Y2ggdGhlIEZJRk8gY29uZmlndXJhdGlvbnMgbm93IHRvby4gKi8KKwlncC0+dHhfZmlmb19zeiA9IHJlYWRsKGdwLT5yZWdzICsgVFhETUFfRlNaKSAqIDY0OworCWdwLT5yeF9maWZvX3N6ID0gcmVhZGwoZ3AtPnJlZ3MgKyBSWERNQV9GU1opICogNjQ7CisKKwlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU1VOKSB7CisJCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fR0VNKSB7CisJCQlpZiAoZ3AtPnR4X2ZpZm9fc3ogIT0gKDkgKiAxMDI0KSB8fAorCQkJICAgIGdwLT5yeF9maWZvX3N6ICE9ICgyMCAqIDEwMjQpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiR0VNIGhhcyBib2d1cyBmaWZvIHNpemVzIHR4KCVkKSByeCglZClcbiIsCisJCQkJICAgICAgIGdwLT50eF9maWZvX3N6LCBncC0+cnhfZmlmb19zeik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZ3AtPnN3cnN0X2Jhc2UgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKGdwLT50eF9maWZvX3N6ICE9ICgyICogMTAyNCkgfHwKKwkJCSAgICBncC0+cnhfZmlmb19zeiAhPSAoMiAqIDEwMjQpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUklPIEdFTSBoYXMgYm9ndXMgZmlmbyBzaXplcyB0eCglZCkgcngoJWQpXG4iLAorCQkJCSAgICAgICBncC0+dHhfZmlmb19zeiwgZ3AtPnJ4X2ZpZm9fc3opOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWdwLT5zd3JzdF9iYXNlID0gKDY0IC8gNCkgPDwgR1JFR19TV1JTVF9DQUNIRV9TSElGVDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLworc3RhdGljIHZvaWQgZ2VtX3JlaW5pdF9jaGlwKHN0cnVjdCBnZW0gKmdwKQoreworCS8qIFJlc2V0IHRoZSBjaGlwICovCisJZ2VtX3Jlc2V0KGdwKTsKKworCS8qIE1ha2Ugc3VyZSBpbnRzIGFyZSBkaXNhYmxlZCAqLworCWdlbV9kaXNhYmxlX2ludHMoZ3ApOworCisJLyogQWxsb2NhdGUgJiBzZXR1cCByaW5nIGJ1ZmZlcnMgKi8KKwlnZW1faW5pdF9yaW5ncyhncCk7CisKKwkvKiBDb25maWd1cmUgcGF1c2UgdGhyZXNob2xkcyAqLworCWdlbV9pbml0X3BhdXNlX3RocmVzaG9sZHMoZ3ApOworCisJLyogSW5pdCBETUEgJiBNQUMgZW5naW5lcyAqLworCWdlbV9pbml0X2RtYShncCk7CisJZ2VtX2luaXRfbWFjKGdwKTsKK30KKworCisvKiBNdXN0IGJlIGludm9rZWQgd2l0aCBubyBsb2NrIGhlbGQuICovCitzdGF0aWMgdm9pZCBnZW1fc3RvcF9waHkoc3RydWN0IGdlbSAqZ3AsIGludCB3b2wpCit7CisJdTMyIG1pZmNmZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogTGV0IHRoZSBjaGlwIHNldHRsZSBkb3duIGEgYml0LCBpdCBzZWVtcyB0aGF0IGhlbHBzCisJICogZm9yIHNsZWVwIG1vZGUgb24gc29tZSBtb2RlbHMKKwkgKi8KKwltc2xlZXAoMTApOworCisJLyogTWFrZSBzdXJlIHdlIGFyZW4ndCBwb2xsaW5nIFBIWSBzdGF0dXMgY2hhbmdlLiBXZQorCSAqIGRvbid0IGN1cnJlbnRseSB1c2UgdGhhdCBmZWF0dXJlIHRob3VnaAorCSAqLworCW1pZmNmZyA9IHJlYWRsKGdwLT5yZWdzICsgTUlGX0NGRyk7CisJbWlmY2ZnICY9IH5NSUZfQ0ZHX1BPTEw7CisJd3JpdGVsKG1pZmNmZywgZ3AtPnJlZ3MgKyBNSUZfQ0ZHKTsKKworCWlmICh3b2wgJiYgZ3AtPmhhc193b2wpIHsKKwkJdW5zaWduZWQgY2hhciAqZSA9ICZncC0+ZGV2LT5kZXZfYWRkclswXTsKKwkJdTMyIGNzcjsKKworCQkvKiBTZXR1cCB3YWtlLW9uLWxhbiBmb3IgTUFHSUMgcGFja2V0ICovCisJCXdyaXRlbChNQUNfUlhDRkdfSEZFIHwgTUFDX1JYQ0ZHX1NGQ1MgfCBNQUNfUlhDRkdfRU5BQiwKKwkJICAgICAgIGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsJCisJCXdyaXRlbCgoZVs0XSA8PCA4KSB8IGVbNV0sIGdwLT5yZWdzICsgV09MX01BVENIMCk7CisJCXdyaXRlbCgoZVsyXSA8PCA4KSB8IGVbM10sIGdwLT5yZWdzICsgV09MX01BVENIMSk7CisJCXdyaXRlbCgoZVswXSA8PCA4KSB8IGVbMV0sIGdwLT5yZWdzICsgV09MX01BVENIMik7CisKKwkJd3JpdGVsKFdPTF9NQ09VTlRfTiB8IFdPTF9NQ09VTlRfTSwgZ3AtPnJlZ3MgKyBXT0xfTUNPVU5UKTsKKwkJY3NyID0gV09MX1dBS0VDU1JfRU5BQkxFOworCQlpZiAoKHJlYWRsKGdwLT5yZWdzICsgTUFDX1hJRkNGRykgJiBNQUNfWElGQ0ZHX0dNSUkpID09IDApCisJCQljc3IgfD0gV09MX1dBS0VDU1JfTUlJOworCQl3cml0ZWwoY3NyLCBncC0+cmVncyArIFdPTF9XQUtFQ1NSKTsKKwl9IGVsc2UgeworCQl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCQkodm9pZClyZWFkbChncC0+cmVncyArIE1BQ19SWENGRyk7CisJCS8qIE1hY2hpbmUgc2xlZXAgd2lsbCBkaWUgaW4gc3RyYW5nZSB3YXlzIGlmIHdlCisJCSAqIGRvbnQgd2FpdCBhIGJpdCBoZXJlLCBsb29rcyBsaWtlIHRoZSBjaGlwIHRha2VzCisJCSAqIHNvbWUgdGltZSB0byByZWFsbHkgc2h1dCBkb3duCisJCSAqLworCQltc2xlZXAoMTApOworCX0KKworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19UWENGRyk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX1hJRkNGRyk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgVFhETUFfQ0ZHKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBSWERNQV9DRkcpOworCisJaWYgKCF3b2wpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCQlnZW1fcmVzZXQoZ3ApOworCQl3cml0ZWwoTUFDX1RYUlNUX0NNRCwgZ3AtPnJlZ3MgKyBNQUNfVFhSU1QpOworCQl3cml0ZWwoTUFDX1JYUlNUX0NNRCwgZ3AtPnJlZ3MgKyBNQUNfUlhSU1QpOworCQlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCisJCS8qIE5vIG5lZWQgdG8gdGFrZSB0aGUgbG9jayBoZXJlICovCisKKwkJaWYgKGZvdW5kX21paV9waHkoZ3ApICYmIGdwLT5waHlfbWlpLmRlZi0+b3BzLT5zdXNwZW5kKQorCQkJZ3AtPnBoeV9taWkuZGVmLT5vcHMtPnN1c3BlbmQoJmdwLT5waHlfbWlpKTsKKworCQkvKiBBY2NvcmRpbmcgdG8gQXBwbGUsIHdlIG11c3Qgc2V0IHRoZSBNRElPIHBpbnMgdG8gdGhpcyBiZWduaWduCisJCSAqIHN0YXRlIG9yIHdlIG1heSAxKSBlYXQgbW9yZSBjdXJyZW50LCAyKSBkYW1hZ2Ugc29tZSBQSFlzCisJCSAqLworCQl3cml0ZWwobWlmY2ZnIHwgTUlGX0NGR19CQk1PREUsIGdwLT5yZWdzICsgTUlGX0NGRyk7CisJCXdyaXRlbCgwLCBncC0+cmVncyArIE1JRl9CQkNMSyk7CisJCXdyaXRlbCgwLCBncC0+cmVncyArIE1JRl9CQkRBVEEpOworCQl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNSUZfQkJPRU5BQik7CisJCXdyaXRlbChNQUNfWElGQ0ZHX0dNSUkgfCBNQUNfWElGQ0ZHX0xCQ0ssIGdwLT5yZWdzICsgTUFDX1hJRkNGRyk7CisJCSh2b2lkKSByZWFkbChncC0+cmVncyArIE1BQ19YSUZDRkcpOworCX0KK30KKworCitzdGF0aWMgaW50IGdlbV9kb19zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJmdwLT50eF9sb2NrKTsKKworCS8qIEVuYWJsZSB0aGUgY2VsbCAqLworCWdlbV9nZXRfY2VsbChncCk7CisKKwkvKiBJbml0ICYgc2V0dXAgY2hpcCBoYXJkd2FyZSAqLworCWdlbV9yZWluaXRfY2hpcChncCk7CisKKwlncC0+cnVubmluZyA9IDE7CisKKwlpZiAoZ3AtPmxzdGF0ZSA9PSBsaW5rX3VwKSB7CisJCW5ldGlmX2NhcnJpZXJfb24oZ3AtPmRldik7CisJCWdlbV9zZXRfbGlua19tb2RlcyhncCk7CisJfQorCisJbmV0aWZfd2FrZV9xdWV1ZShncC0+ZGV2KTsKKworCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKworCWlmIChyZXF1ZXN0X2lycShncC0+cGRldi0+aXJxLCBnZW1faW50ZXJydXB0LAorCQkJCSAgIFNBX1NISVJRLCBkZXYtPm5hbWUsICh2b2lkICopZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVxdWVzdCBpcnEgIVxuIiwgZ3AtPmRldi0+bmFtZSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCisJCWdwLT5ydW5uaW5nID0gIDA7CisJCWdlbV9yZXNldChncCk7CisJCWdlbV9jbGVhbl9yaW5ncyhncCk7CisJCWdlbV9wdXRfY2VsbChncCk7CisJCQorCQlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZW1fZG9fc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgd29sKQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJmdwLT50eF9sb2NrKTsKKworCWdwLT5ydW5uaW5nID0gMDsKKworCS8qIFN0b3AgbmV0aWYgcXVldWUgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBNYWtlIHN1cmUgaW50cyBhcmUgZGlzYWJsZWQgKi8KKwlnZW1fZGlzYWJsZV9pbnRzKGdwKTsKKworCS8qIFdlIGNhbiBkcm9wIHRoZSBsb2NrIG5vdyAqLworCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKworCS8qIElmIHdlIGFyZSBnb2luZyB0byBzbGVlcCB3aXRoIFdPTCAqLworCWdlbV9zdG9wX2RtYShncCk7CisJbXNsZWVwKDEwKTsKKwlpZiAoIXdvbCkKKwkJZ2VtX3Jlc2V0KGdwKTsKKwltc2xlZXAoMTApOworCisJLyogR2V0IHJpZCBvZiByaW5ncyAqLworCWdlbV9jbGVhbl9yaW5ncyhncCk7CisKKwkvKiBObyBpcnEgbmVlZGVkIGFueW1vcmUgKi8KKwlmcmVlX2lycShncC0+cGRldi0+aXJxLCAodm9pZCAqKSBkZXYpOworCisJLyogQ2VsbCBub3QgbmVlZGVkIG5laXRoZXIgaWYgbm8gV09MICovCisJaWYgKCF3b2wpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7CisJCWdlbV9wdXRfY2VsbChncCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZW1fcmVzZXRfdGFzayh2b2lkICpkYXRhKQoreworCXN0cnVjdCBnZW0gKmdwID0gKHN0cnVjdCBnZW0gKikgZGF0YTsKKworCWRvd24oJmdwLT5wbV9zZW0pOworCisJbmV0aWZfcG9sbF9kaXNhYmxlKGdwLT5kZXYpOworCisJc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOworCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCisJaWYgKGdwLT5ydW5uaW5nID09IDApCisJCWdvdG8gbm90X3J1bm5pbmc7CisKKwlpZiAoZ3AtPnJ1bm5pbmcpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShncC0+ZGV2KTsKKworCQkvKiBSZXNldCB0aGUgY2hpcCAmIHJpbmdzICovCisJCWdlbV9yZWluaXRfY2hpcChncCk7CisJCWlmIChncC0+bHN0YXRlID09IGxpbmtfdXApCisJCQlnZW1fc2V0X2xpbmtfbW9kZXMoZ3ApOworCQluZXRpZl93YWtlX3F1ZXVlKGdwLT5kZXYpOworCX0KKyBub3RfcnVubmluZzoKKwlncC0+cmVzZXRfdGFza19wZW5kaW5nID0gMDsKKworCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7CisKKwluZXRpZl9wb2xsX2VuYWJsZShncC0+ZGV2KTsKKworCXVwKCZncC0+cG1fc2VtKTsKK30KKworCitzdGF0aWMgaW50IGdlbV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJaW50IHJjID0gMDsKKworCWRvd24oJmdwLT5wbV9zZW0pOworCisJLyogV2UgbmVlZCB0aGUgY2VsbCBlbmFibGVkICovCisJaWYgKCFncC0+YXNsZWVwKQorCQlyYyA9IGdlbV9kb19zdGFydChkZXYpOworCWdwLT5vcGVuZWQgPSAocmMgPT0gMCk7CisKKwl1cCgmZ3AtPnBtX3NlbSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ2VtX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisKKwkvKiBOb3RlOiB3ZSBkb24ndCBuZWVkIHRvIGNhbGwgbmV0aWZfcG9sbF9kaXNhYmxlKCkgaGVyZSBiZWNhdXNlCisJICogb3VyIGNhbGxlciAoZGV2X2Nsb3NlKSBhbHJlYWR5IGRpZCBpdCBmb3IgdXMKKwkgKi8KKworCWRvd24oJmdwLT5wbV9zZW0pOworCisJZ3AtPm9wZW5lZCA9IDA7CQorCWlmICghZ3AtPmFzbGVlcCkKKwkJZ2VtX2RvX3N0b3AoZGV2LCAwKTsKKworCXVwKCZncC0+cG1fc2VtKTsKKwkKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBnZW1fc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRvd24oJmdwLT5wbV9zZW0pOworCisJbmV0aWZfcG9sbF9kaXNhYmxlKGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogc3VzcGVuZGluZywgV2FrZU9uTGFuICVzXG4iLAorCSAgICAgICBkZXYtPm5hbWUsCisJICAgICAgIChncC0+d2FrZV9vbl9sYW4gJiYgZ3AtPm9wZW5lZCkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwkKKwkvKiBLZWVwIHRoZSBjZWxsIGVuYWJsZWQgZHVyaW5nIHRoZSBlbnRpcmUgb3BlcmF0aW9uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CisJZ2VtX2dldF9jZWxsKGdwKTsKKwlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBJZiB0aGUgZHJpdmVyIGlzIG9wZW5lZCwgd2Ugc3RvcCB0aGUgTUFDICovCisJaWYgKGdwLT5vcGVuZWQpIHsKKwkJLyogU3RvcCB0cmFmZmljLCBtYXJrIHVzIGNsb3NlZCAqLworCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwkJLyogU3dpdGNoIG9mZiBNQUMsIHJlbWVtYmVyIFdPTCBzZXR0aW5nICovCisJCWdwLT5hc2xlZXBfd29sID0gZ3AtPndha2Vfb25fbGFuOworCQlnZW1fZG9fc3RvcChkZXYsIGdwLT5hc2xlZXBfd29sKTsKKwl9IGVsc2UKKwkJZ3AtPmFzbGVlcF93b2wgPSAwOworCisJLyogTWFyayB1cyBhc2xlZXAgKi8KKwlncC0+YXNsZWVwID0gMTsKKwl3bWIoKTsKKworCS8qIFN0b3AgdGhlIGxpbmsgdGltZXIgKi8KKwlkZWxfdGltZXJfc3luYygmZ3AtPmxpbmtfdGltZXIpOworCisJLyogTm93IHdlIHJlbGVhc2UgdGhlIHNlbWFwaG9yZSB0byBub3QgYmxvY2sgdGhlIHJlc2V0IHRhc2sgd2hvCisJICogY2FuIHRha2UgaXQgdG9vLiBXZSBhcmUgbWFya2VkIGFzbGVlcCwgc28gdGhlcmUgd2lsbCBiZSBubworCSAqIGNvbmZsaWN0IGhlcmUKKwkgKi8KKwl1cCgmZ3AtPnBtX3NlbSk7CisKKwkvKiBXYWl0IGZvciBhIHBlbmRpbmcgcmVzZXQgdGFzayB0byBjb21wbGV0ZSAqLworCXdoaWxlIChncC0+cmVzZXRfdGFza19wZW5kaW5nKQorCQl5aWVsZCgpOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwkvKiBTaHV0IHRoZSBQSFkgZG93biBldmVudHVhbGx5IGFuZCBzZXR1cCBXT0wgKi8KKwlnZW1fc3RvcF9waHkoZ3AsIGdwLT5hc2xlZXBfd29sKTsKKworCS8qIE1ha2Ugc3VyZSBidXMgbWFzdGVyIGlzIGRpc2FibGVkICovCisJcGNpX2Rpc2FibGVfZGV2aWNlKGdwLT5wZGV2KTsKKworCS8qIFJlbGVhc2UgdGhlIGNlbGwsIG5vIG5lZWQgdG8gdGFrZSBhIGxvY2sgYXQgdGhpcyBwb2ludCBzaW5jZQorCSAqIG5vdGhpbmcgZWxzZSBjYW4gaGFwcGVuIG5vdworCSAqLworCWdlbV9wdXRfY2VsbChncCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW1fcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiByZXN1bWluZ1xuIiwgZGV2LT5uYW1lKTsKKworCWRvd24oJmdwLT5wbV9zZW0pOworCisJLyogS2VlcCB0aGUgY2VsbCBlbmFibGVkIGR1cmluZyB0aGUgZW50aXJlIG9wZXJhdGlvbiwgbm8gbmVlZCB0bworCSAqIHRha2UgYSBsb2NrIGhlcmUgdGhvIHNpbmNlIG5vdGhpbmcgZWxzZSBjYW4gaGFwcGVuIHdoaWxlIHdlIGFyZQorCSAqIG1hcmtlZCBhc2xlZXAKKwkgKi8KKwlnZW1fZ2V0X2NlbGwoZ3ApOworCisJLyogTWFrZSBzdXJlIFBDSSBhY2Nlc3MgYW5kIGJ1cyBtYXN0ZXIgYXJlIGVuYWJsZWQgKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZ3AtPnBkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IHJlLWVuYWJsZSBjaGlwICFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQkvKiBQdXQgY2VsbCBhbmQgZm9yZ2V0IGl0IGZvciBub3csIGl0IHdpbGwgYmUgY29uc2lkZXJlZCBhcworCQkgKiBzdGlsbCBhc2xlZXAsIGEgbmV3IHNsZWVwIGN5Y2xlIG1heSBicmluZyBpdCBiYWNrCisJCSAqLworCQlnZW1fcHV0X2NlbGwoZ3ApOworCQl1cCgmZ3AtPnBtX3NlbSk7CisJCXJldHVybiAwOworCX0KKwlwY2lfc2V0X21hc3RlcihncC0+cGRldik7CisKKwkvKiBSZXNldCBldmVyeXRoaW5nICovCisJZ2VtX3Jlc2V0KGdwKTsKKworCS8qIE1hcmsgdXMgd29rZW4gdXAgKi8KKwlncC0+YXNsZWVwID0gMDsKKwl3bWIoKTsKKworCS8qIEJyaW5nIHRoZSBQSFkgYmFjay4gQWdhaW4sIGxvY2sgaXMgdXNlbGVzcyBhdCB0aGlzIHBvaW50IGFzCisJICogbm90aGluZyBjYW4gYmUgaGFwcGVuaW5nIHVudGlsIHdlIHJlc3RhcnQgdGhlIHdob2xlIHRoaW5nCisJICovCisJZ2VtX2luaXRfcGh5KGdwKTsKKworCS8qIElmIHdlIHdlcmUgb3BlbmVkLCBicmluZyBldmVyeXRoaW5nIGJhY2sgKi8KKwlpZiAoZ3AtPm9wZW5lZCkgeworCQkvKiBSZXN0YXJ0IE1BQyAqLworCQlnZW1fZG9fc3RhcnQoZGV2KTsKKworCQkvKiBSZS1hdHRhY2ggbmV0IGRldmljZSAqLworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJmdwLT50eF9sb2NrKTsKKworCS8qIElmIHdlIGhhZCBXT0wgZW5hYmxlZCwgdGhlIGNlbGwgY2xvY2sgd2FzIG5ldmVyIHR1cm5lZCBvZmYgZHVyaW5nCisJICogc2xlZXAsIHNvIHdlIGVuZCB1cCBiZWVpbmcgdW5iYWxhbmNlZC4gRml4IHRoYXQgaGVyZQorCSAqLworCWlmIChncC0+YXNsZWVwX3dvbCkKKwkJZ2VtX3B1dF9jZWxsKGdwKTsKKworCS8qIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBuZWVkIHRvIGhvbGQgdGhlIGNlbGwsIGl0IHdpbGwgYmUgaGVsZCBpZiB0aGUKKwkgKiBkcml2ZXIgaXMgb3BlbiBieSBnZW1fZG9fc3RhcnQoKS4KKwkgKi8KKwlnZW1fcHV0X2NlbGwoZ3ApOworCisJc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCisJbmV0aWZfcG9sbF9lbmFibGUoZGV2KTsKKwkKKwl1cCgmZ3AtPnBtX3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZW1fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmdwLT5uZXRfc3RhdHM7CisKKwlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7CisJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CisKKwkvKiBJIGhhdmUgc2VlbiB0aGlzIGJlaW5nIGNhbGxlZCB3aGlsZSB0aGUgUE0gd2FzIGluIHByb2dyZXNzLAorCSAqIHNvIHdlIHNoaWVsZCBhZ2FpbnN0IHRoaXMKKwkgKi8KKwlpZiAoZ3AtPnJ1bm5pbmcpIHsKKwkJc3RhdHMtPnJ4X2NyY19lcnJvcnMgKz0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfRkNTRVJSKTsKKwkJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0ZDU0VSUik7CisKKwkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyArPSByZWFkbChncC0+cmVncyArIE1BQ19BRVJSKTsKKwkJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0FFUlIpOworCisJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzICs9IHJlYWRsKGdwLT5yZWdzICsgTUFDX0xFUlIpOworCQl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfTEVSUik7CisKKwkJc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzICs9IHJlYWRsKGdwLT5yZWdzICsgTUFDX0VDT0xMKTsKKwkJc3RhdHMtPmNvbGxpc2lvbnMgKz0KKwkJCShyZWFkbChncC0+cmVncyArIE1BQ19FQ09MTCkgKworCQkJIHJlYWRsKGdwLT5yZWdzICsgTUFDX0xDT0xMKSk7CisJCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19FQ09MTCk7CisJCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19MQ09MTCk7CisJfQorCisJc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKKworCXJldHVybiAmZ3AtPm5ldF9zdGF0czsKK30KKworc3RhdGljIHZvaWQgZ2VtX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwl1MzIgcnhjZmcsIHJ4Y2ZnX25ldzsKKwlpbnQgbGltaXQgPSAxMDAwMDsKKwkKKworCXNwaW5fbG9ja19pcnEoJmdwLT5sb2NrKTsKKwlzcGluX2xvY2soJmdwLT50eF9sb2NrKTsKKworCWlmICghZ3AtPnJ1bm5pbmcpCisJCWdvdG8gYmFpbDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXJ4Y2ZnID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCXJ4Y2ZnX25ldyA9IGdlbV9zZXR1cF9tdWx0aWNhc3QoZ3ApOworI2lmZGVmIFNUUklQX0ZDUworCXJ4Y2ZnX25ldyB8PSBNQUNfUlhDRkdfU0ZDUzsKKyNlbmRpZgorCWdwLT5tYWNfcnhfY2ZnID0gcnhjZmdfbmV3OworCQorCXdyaXRlbChyeGNmZyAmIH5NQUNfUlhDRkdfRU5BQiwgZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCXdoaWxlIChyZWFkbChncC0+cmVncyArIE1BQ19SWENGRykgJiBNQUNfUlhDRkdfRU5BQikgeworCQlpZiAoIWxpbWl0LS0pCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlyeGNmZyAmPSB+KE1BQ19SWENGR19QUk9NIHwgTUFDX1JYQ0ZHX0hGRSk7CisJcnhjZmcgfD0gcnhjZmdfbmV3OworCisJd3JpdGVsKHJ4Y2ZnLCBncC0+cmVncyArIE1BQ19SWENGRyk7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKyBiYWlsOgorCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7Cit9CisKKy8qIEp1bWJvLWdyYW1zIGRvbid0IHNlZW0gdG8gd29yayA6LSggKi8KKyNkZWZpbmUgR0VNX01JTl9NVFUJNjgKKyNpZiAxCisjZGVmaW5lIEdFTV9NQVhfTVRVCTE1MDAKKyNlbHNlCisjZGVmaW5lIEdFTV9NQVhfTVRVCTkwMDAKKyNlbmRpZgorCitzdGF0aWMgaW50IGdlbV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCisJaWYgKG5ld19tdHUgPCBHRU1fTUlOX01UVSB8fCBuZXdfbXR1ID4gR0VNX01BWF9NVFUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikgfHwgIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIHsKKwkJLyogV2UnbGwganVzdCBjYXRjaCBpdCBsYXRlciB3aGVuIHRoZQorCQkgKiBkZXZpY2UgaXMgdXAnZCBvciByZXN1bWVkLgorCQkgKi8KKwkJZGV2LT5tdHUgPSBuZXdfbXR1OworCQlyZXR1cm4gMDsKKwl9CisKKwlkb3duKCZncC0+cG1fc2VtKTsKKwlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7CisJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCWlmIChncC0+cnVubmluZykgeworCQlnZW1fcmVpbml0X2NoaXAoZ3ApOworCQlpZiAoZ3AtPmxzdGF0ZSA9PSBsaW5rX3VwKQorCQkJZ2VtX3NldF9saW5rX21vZGVzKGdwKTsKKwl9CisJc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKKwl1cCgmZ3AtPnBtX3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2VtX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisgIAorCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoZ3AtPnBkZXYpKTsKK30KKyAgCitzdGF0aWMgaW50IGdlbV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisKKwlpZiAoZ3AtPnBoeV90eXBlID09IHBoeV9taWlfbWRpbzAgfHwKKwkgICAgZ3AtPnBoeV90eXBlID09IHBoeV9taWlfbWRpbzEpIHsKKwkJaWYgKGdwLT5waHlfbWlpLmRlZikKKwkJCWNtZC0+c3VwcG9ydGVkID0gZ3AtPnBoeV9taWkuZGVmLT5mZWF0dXJlczsKKwkJZWxzZQorCQkJY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8CisJCQkJCSAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCk7CisKKwkJLyogWFhYIGhhcmRjb2RlZCBzdHVmZiBmb3Igbm93ICovCisJCWNtZC0+cG9ydCA9IFBPUlRfTUlJOworCQljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKwkJY21kLT5waHlfYWRkcmVzcyA9IDA7IC8qIFhYWCBmaXhlZCBQSFlBRCAqLworCisJCS8qIFJldHVybiBjdXJyZW50IFBIWSBzZXR0aW5ncyAqLworCQlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7CisJCWNtZC0+YXV0b25lZyA9IGdwLT53YW50X2F1dG9uZWc7CisJCWNtZC0+c3BlZWQgPSBncC0+cGh5X21paS5zcGVlZDsKKwkJY21kLT5kdXBsZXggPSBncC0+cGh5X21paS5kdXBsZXg7CQkJCisJCWNtZC0+YWR2ZXJ0aXNpbmcgPSBncC0+cGh5X21paS5hZHZlcnRpc2luZzsKKworCQkvKiBJZiB3ZSBzdGFydGVkIHdpdGggYSBmb3JjZWQgbW9kZSwgd2UgZG9uJ3QgaGF2ZSBhIGRlZmF1bHQKKwkJICogYWR2ZXJ0aXNlIHNldCwgd2UgbmVlZCB0byByZXR1cm4gc29tZXRoaW5nIHNlbnNpYmxlIHNvCisJCSAqIHVzZXJsYW5kIGNhbiByZS1lbmFibGUgYXV0b25lZyBwcm9wZXJseS4KKwkJICovCisJCWlmIChjbWQtPmFkdmVydGlzaW5nID09IDApCisJCQljbWQtPmFkdmVydGlzaW5nID0gY21kLT5zdXBwb3J0ZWQ7CisJCXNwaW5fdW5sb2NrX2lycSgmZ3AtPmxvY2spOworCX0gZWxzZSB7IC8vIFhYWCBQQ1MgPworCQljbWQtPnN1cHBvcnRlZCA9CisJCQkoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCQkJIFNVUFBPUlRFRF9BdXRvbmVnKTsKKwkJY21kLT5hZHZlcnRpc2luZyA9IGNtZC0+c3VwcG9ydGVkOworCQljbWQtPnNwZWVkID0gMDsKKwkJY21kLT5kdXBsZXggPSBjbWQtPnBvcnQgPSBjbWQtPnBoeV9hZGRyZXNzID0KKwkJCWNtZC0+dHJhbnNjZWl2ZXIgPSBjbWQtPmF1dG9uZWcgPSAwOworCX0KKwljbWQtPm1heHR4cGt0ID0gY21kLT5tYXhyeHBrdCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW1fc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCisJLyogVmVyaWZ5IHRoZSBzZXR0aW5ncyB3ZSBjYXJlIGFib3V0LiAqLworCWlmIChjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUgJiYKKwkgICAgY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRElTQUJMRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFICYmCisJICAgIGNtZC0+YWR2ZXJ0aXNpbmcgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSAmJgorCSAgICAoKGNtZC0+c3BlZWQgIT0gU1BFRURfMTAwMCAmJgorCSAgICAgIGNtZC0+c3BlZWQgIT0gU1BFRURfMTAwICYmCisJICAgICAgY21kLT5zcGVlZCAhPSBTUEVFRF8xMCkgfHwKKwkgICAgIChjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJgorCSAgICAgIGNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKSkpCisJCXJldHVybiAtRUlOVkFMOworCSAgICAgIAorCS8qIEFwcGx5IHNldHRpbmdzIGFuZCByZXN0YXJ0IGxpbmsgcHJvY2Vzcy4gKi8KKwlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7CisJZ2VtX2dldF9jZWxsKGdwKTsKKwlnZW1fYmVnaW5fYXV0b19uZWdvdGlhdGlvbihncCwgY21kKTsKKwlnZW1fcHV0X2NlbGwoZ3ApOworCXNwaW5fdW5sb2NrX2lycSgmZ3AtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VtX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKworCWlmICghZ3AtPndhbnRfYXV0b25lZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBSZXN0YXJ0IGxpbmsgcHJvY2Vzcy4gKi8KKwlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7CisJZ2VtX2dldF9jZWxsKGdwKTsKKwlnZW1fYmVnaW5fYXV0b19uZWdvdGlhdGlvbihncCwgTlVMTCk7CisJZ2VtX3B1dF9jZWxsKGdwKTsKKwlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGdlbV9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwlyZXR1cm4gZ3AtPm1zZ19lbmFibGU7Cit9CisgIAorc3RhdGljIHZvaWQgZ2VtX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJZ3AtPm1zZ19lbmFibGUgPSB2YWx1ZTsKK30KKworCisvKiBBZGQgbW9yZSB3aGVuIEkgdW5kZXJzdGFuZCBob3cgdG8gcHJvZ3JhbSB0aGUgY2hpcCAqLworLyogbGlrZSBXQUtFX1VDQVNUIHwgV0FLRV9NQ0FTVCB8IFdBS0VfQkNBU1QgKi8KKworI2RlZmluZSBXT0xfU1VQUE9SVEVEX01BU0sJKFdBS0VfTUFHSUMpCisKK3N0YXRpYyB2b2lkIGdlbV9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKworCS8qIEFkZCBtb3JlIHdoZW4gSSB1bmRlcnN0YW5kIGhvdyB0byBwcm9ncmFtIHRoZSBjaGlwICovCisJaWYgKGdwLT5oYXNfd29sKSB7CisJCXdvbC0+c3VwcG9ydGVkID0gV09MX1NVUFBPUlRFRF9NQVNLOworCQl3b2wtPndvbG9wdHMgPSBncC0+d2FrZV9vbl9sYW47CisJfSBlbHNlIHsKKwkJd29sLT5zdXBwb3J0ZWQgPSAwOworCQl3b2wtPndvbG9wdHMgPSAwOworCX0KK30KKworc3RhdGljIGludCBnZW1fc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisKKwlpZiAoIWdwLT5oYXNfd29sKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJZ3AtPndha2Vfb25fbGFuID0gd29sLT53b2xvcHRzICYgV09MX1NVUFBPUlRFRF9NQVNLOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGdlbV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gZ2VtX2dldF9kcnZpbmZvLAorCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfc2V0dGluZ3MJCT0gZ2VtX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IGdlbV9zZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQJCT0gZ2VtX253YXlfcmVzZXQsCisJLmdldF9tc2dsZXZlbAkJPSBnZW1fZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gZ2VtX3NldF9tc2dsZXZlbCwKKwkuZ2V0X3dvbAkJPSBnZW1fZ2V0X3dvbCwKKwkuc2V0X3dvbAkJPSBnZW1fc2V0X3dvbCwKK307CisKK3N0YXRpYyBpbnQgZ2VtX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShpZnIpOworCWludCByYyA9IC1FT1BOT1RTVVBQOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBIb2xkIHRoZSBQTSBzZW1hcGhvcmUgd2hpbGUgZG9pbmcgaW9jdGwncyBvciB3ZSBtYXkgY29sbGlkZQorCSAqIHdpdGggcG93ZXIgbWFuYWdlbWVudC4KKwkgKi8KKwlkb3duKCZncC0+cG1fc2VtKTsKKwkJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7CisJZ2VtX2dldF9jZWxsKGdwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgkJLyogR2V0IGFkZHJlc3Mgb2YgTUlJIFBIWSBpbiB1c2UuICovCisJCWRhdGEtPnBoeV9pZCA9IGdwLT5taWlfcGh5X2FkZHI7CisJCS8qIEZhbGx0aHJvdWdoLi4uICovCisKKwljYXNlIFNJT0NHTUlJUkVHOgkJLyogUmVhZCBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQlpZiAoIWdwLT5ydW5uaW5nKQorCQkJcmMgPSAtRUFHQUlOOworCQllbHNlIHsKKwkJCWRhdGEtPnZhbF9vdXQgPSBfX3BoeV9yZWFkKGdwLCBkYXRhLT5waHlfaWQgJiAweDFmLAorCQkJCQkJICAgZGF0YS0+cmVnX251bSAmIDB4MWYpOworCQkJcmMgPSAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJjID0gLUVQRVJNOworCQllbHNlIGlmICghZ3AtPnJ1bm5pbmcpCisJCQlyYyA9IC1FQUdBSU47CisJCWVsc2UgeworCQkJX19waHlfd3JpdGUoZ3AsIGRhdGEtPnBoeV9pZCAmIDB4MWYsIGRhdGEtPnJlZ19udW0gJiAweDFmLAorCQkJCSAgICBkYXRhLT52YWxfaW4pOworCQkJcmMgPSAwOworCQl9CisJCWJyZWFrOworCX07CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7CisJZ2VtX3B1dF9jZWxsKGdwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCisJdXAoJmdwLT5wbV9zZW0pOworCQorCXJldHVybiByYzsKK30KKworI2lmICghZGVmaW5lZChfX3NwYXJjX18pICYmICFkZWZpbmVkKENPTkZJR19QUENfUE1BQykpCisvKiBGZXRjaCBNQUMgYWRkcmVzcyBmcm9tIHZpdGFsIHByb2R1Y3QgZGF0YSBvZiBQQ0kgUk9NLiAqLworc3RhdGljIHZvaWQgZmluZF9ldGhfYWRkcl9pbl92cGQodm9pZCBfX2lvbWVtICpyb21fYmFzZSwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqZGV2X2FkZHIpCit7CisJaW50IHRoaXNfb2Zmc2V0OworCisJZm9yICh0aGlzX29mZnNldCA9IDB4MjA7IHRoaXNfb2Zmc2V0IDwgbGVuOyB0aGlzX29mZnNldCsrKSB7CisJCXZvaWQgX19pb21lbSAqcCA9IHJvbV9iYXNlICsgdGhpc19vZmZzZXQ7CisJCWludCBpOworCisJCWlmIChyZWFkYihwICsgMCkgIT0gMHg5MCB8fAorCQkgICAgcmVhZGIocCArIDEpICE9IDB4MDAgfHwKKwkJICAgIHJlYWRiKHAgKyAyKSAhPSAweDA5IHx8CisJCSAgICByZWFkYihwICsgMykgIT0gMHg0ZSB8fAorCQkgICAgcmVhZGIocCArIDQpICE9IDB4NDEgfHwKKwkJICAgIHJlYWRiKHAgKyA1KSAhPSAweDA2KQorCQkJY29udGludWU7CisKKwkJdGhpc19vZmZzZXQgKz0gNjsKKwkJcCArPSA2OworCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlkZXZfYWRkcltpXSA9IHJlYWRiKHAgKyBpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZXRfZ2VtX21hY19ub25vYnAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVuc2lnbmVkIGNoYXIgKmRldl9hZGRyKQoreworCXUzMiByb21fcmVnX29yaWc7CisJdm9pZCBfX2lvbWVtICpwOworCisJaWYgKHBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnBhcmVudCA9PSBOVUxMKSB7CisJCWlmIChwY2lfYXNzaWduX3Jlc291cmNlKHBkZXYsIFBDSV9ST01fUkVTT1VSQ0UpIDwgMCkKKwkJCWdvdG8gdXNlX3JhbmRvbTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcGRldi0+cm9tX2Jhc2VfcmVnLCAmcm9tX3JlZ19vcmlnKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywKKwkJCSAgICAgICByb21fcmVnX29yaWcgfCBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKKworCXAgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBQQ0lfUk9NX1JFU09VUkNFKSwgKDY0ICogMTAyNCkpOworCWlmIChwICE9IE5VTEwgJiYgcmVhZGIocCkgPT0gMHg1NSAmJiByZWFkYihwICsgMSkgPT0gMHhhYSkKKwkJZmluZF9ldGhfYWRkcl9pbl92cGQocCwgKDY0ICogMTAyNCksIGRldl9hZGRyKTsKKworCWlmIChwICE9IE5VTEwpCisJCWlvdW5tYXAocCk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywgcm9tX3JlZ19vcmlnKTsKKwlyZXR1cm47CisKK3VzZV9yYW5kb206CisJLyogU3VuIE1BQyBwcmVmaXggdGhlbiAzIHJhbmRvbSBieXRlcy4gKi8KKwlkZXZfYWRkclswXSA9IDB4MDg7CisJZGV2X2FkZHJbMV0gPSAweDAwOworCWRldl9hZGRyWzJdID0gMHgyMDsKKwlnZXRfcmFuZG9tX2J5dGVzKGRldl9hZGRyICsgMywgMyk7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIG5vdCBTcGFyYyBhbmQgbm90IFBQQyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBnZW1fZ2V0X2RldmljZV9hZGRyZXNzKHN0cnVjdCBnZW0gKmdwKQoreworI2lmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKENPTkZJR19QUENfUE1BQykKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZ3AtPmRldjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX3NwYXJjX18pCisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBncC0+cGRldjsKKwlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwID0gcGRldi0+c3lzZGF0YTsKKwlpbnQgbm9kZSA9IC0xOworCisJaWYgKHBjcCAhPSBOVUxMKSB7CisJCW5vZGUgPSBwY3AtPnByb21fbm9kZTsKKwkJaWYgKHByb21fZ2V0cHJvcGxlbihub2RlLCAibG9jYWwtbWFjLWFkZHJlc3MiKSA9PSA2KQorCQkJcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAibG9jYWwtbWFjLWFkZHJlc3MiLAorCQkJCQkgZGV2LT5kZXZfYWRkciwgNik7CisJCWVsc2UKKwkJCW5vZGUgPSAtMTsKKwl9CisJaWYgKG5vZGUgPT0gLTEpCisJCW1lbWNweShkZXYtPmRldl9hZGRyLCBpZHByb20tPmlkX2V0aGFkZHIsIDYpOworI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDX1BNQUMpCisJdW5zaWduZWQgY2hhciAqYWRkcjsKKworCWFkZHIgPSBnZXRfcHJvcGVydHkoZ3AtPm9mX25vZGUsICJsb2NhbC1tYWMtYWRkcmVzcyIsIE5VTEwpOworCWlmIChhZGRyID09IE5VTEwpIHsKKwkJcHJpbnRrKCJcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBnZXQgbWFjLWFkZHJlc3NcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHIsIDYpOworI2Vsc2UKKwlnZXRfZ2VtX21hY19ub25vYnAoZ3AtPnBkZXYsIGdwLT5kZXYtPmRldl9hZGRyKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZ2VtX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkZXYpIHsKKwkJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCQkvKiBTdG9wIHRoZSBsaW5rIHRpbWVyICovCisJCWRlbF90aW1lcl9zeW5jKCZncC0+bGlua190aW1lcik7CisKKwkJLyogV2Ugc2hvdWxkbid0IG5lZWQgYW55IGxvY2tpbmcgaGVyZSAqLworCQlnZW1fZ2V0X2NlbGwoZ3ApOworCisJCS8qIFdhaXQgZm9yIGEgcGVuZGluZyByZXNldCB0YXNrIHRvIGNvbXBsZXRlICovCisJCXdoaWxlIChncC0+cmVzZXRfdGFza19wZW5kaW5nKQorCQkJeWllbGQoKTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCQkvKiBTaHV0IHRoZSBQSFkgZG93biAqLworCQlnZW1fc3RvcF9waHkoZ3AsIDApOworCisJCWdlbV9wdXRfY2VsbChncCk7CisKKwkJLyogTWFrZSBzdXJlIGJ1cyBtYXN0ZXIgaXMgZGlzYWJsZWQgKi8KKwkJcGNpX2Rpc2FibGVfZGV2aWNlKGdwLT5wZGV2KTsKKworCQkvKiBGcmVlIHJlc291cmNlcyAqLworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgZ2VtX2luaXRfYmxvY2spLAorCQkJCSAgICBncC0+aW5pdF9ibG9jaywKKwkJCQkgICAgZ3AtPmdibG9ja19kdm1hKTsKKwkJaW91bm1hcChncC0+cmVncyk7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisKKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCX0KK30KKworc3RhdGljIGludCBfX2RldmluaXQgZ2VtX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdGF0aWMgaW50IGdlbV92ZXJzaW9uX3ByaW50ZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgZ2VtcmVnX2Jhc2UsIGdlbXJlZ19sZW47CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZ2VtICpncDsKKwlpbnQgaSwgZXJyLCBwY2lfdXNpbmdfZGFjOworCisJaWYgKGdlbV92ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisJLyogQXBwbGUgZ21hYyBub3RlOiBkdXJpbmcgcHJvYmUsIHRoZSBjaGlwIGlzIHBvd2VyZWQgdXAgYnkKKwkgKiB0aGUgYXJjaCBjb2RlIHRvIGFsbG93IHRoZSBjb2RlIGJlbG93IHRvIHdvcmsgKGFuZCB0byBsZXQKKwkgKiB0aGUgY2hpcCBiZSBwcm9iZWQgb24gdGhlIGNvbmZpZyBzcGFjZS4gSXQgd29uJ3Qgc3RheSBwb3dlcmVkCisJICogdXAgdW50aWwgdGhlIGludGVyZmFjZSBpcyBicm91Z2h0IHVwIGhvd2V2ZXIsIHNvIHdlIGNhbid0IHJlbHkKKwkgKiBvbiByZWdpc3RlciBjb25maWd1cmF0aW9uIGRvbmUgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBlbmFibGUgTU1JTyBvcGVyYXRpb24sICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qIENvbmZpZ3VyZSBETUEgYXR0cmlidXRlcy4gKi8KKworCS8qIEFsbCBvZiB0aGUgR0VNIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgNjQtYml0IERNQSBhZGRyZXNzaW5nCisJICogaXMgZnVsbHkgc3VwcG9ydGVkIGFuZCBzaG91bGQgd29yayBqdXN0IGZpbmUuICBIb3dldmVyIHRoZQorCSAqIGZyb250IGVuZCBmb3IgUklPIGJhc2VkIEdFTXMgaXMgZGlmZmVyZW50IGFuZCBvbmx5IHN1cHBvcnRzCisJICogMzItYml0IGFkZHJlc3NpbmcuCisJICoKKwkgKiBGb3Igbm93IHdlIGFzc3VtZSB0aGUgdmFyaW91cyBQUEMgR0VNcyBhcmUgMzItYml0IG9ubHkgYXMgd2VsbC4KKwkgKi8KKwlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU1VOICYmCisJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NVTl9HRU0gJiYKKwkgICAgIXBjaV9zZXRfZG1hX21hc2socGRldiwgKHU2NCkgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworCQlwY2lfdXNpbmdfZGFjID0gMTsKKwl9IGVsc2UgeworCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsICh1NjQpIDB4ZmZmZmZmZmYpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb24sICIKKwkJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJCWdvdG8gZXJyX2Rpc2FibGVfZGV2aWNlOworCQl9CisJCXBjaV91c2luZ19kYWMgPSAwOworCX0KKwkKKwlnZW1yZWdfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlnZW1yZWdfbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKworCWlmICgocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9JTykgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgZmluZCBwcm9wZXIgUENJIGRldmljZSAiCisJCSAgICAgICAiYmFzZSBhZGRyZXNzLCBhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9kaXNhYmxlX2RldmljZTsKKwl9CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKmdwKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRXRoZXJkZXYgYWxsb2MgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kaXNhYmxlX2RldmljZTsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlncCA9IGRldi0+cHJpdjsKKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCX0KKworCWdwLT5wZGV2ID0gcGRldjsKKwlkZXYtPmJhc2VfYWRkciA9IChsb25nKSBwZGV2OworCWdwLT5kZXYgPSBkZXY7CisKKwlncC0+bXNnX2VuYWJsZSA9IERFRkFVTFRfTVNHOworCisJc3Bpbl9sb2NrX2luaXQoJmdwLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZ3AtPnR4X2xvY2spOworCWluaXRfTVVURVgoJmdwLT5wbV9zZW0pOworCisJaW5pdF90aW1lcigmZ3AtPmxpbmtfdGltZXIpOworCWdwLT5saW5rX3RpbWVyLmZ1bmN0aW9uID0gZ2VtX2xpbmtfdGltZXI7CisJZ3AtPmxpbmtfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBncDsKKworCUlOSVRfV09SSygmZ3AtPnJlc2V0X3Rhc2ssIGdlbV9yZXNldF90YXNrLCBncCk7CisJCisJZ3AtPmxzdGF0ZSA9IGxpbmtfZG93bjsKKwlncC0+dGltZXJfdGlja3MgPSAwOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwlncC0+cmVncyA9IGlvcmVtYXAoZ2VtcmVnX2Jhc2UsIGdlbXJlZ19sZW4pOworCWlmIChncC0+cmVncyA9PSAwVUwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG1hcCBkZXZpY2UgcmVnaXN0ZXJzLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCX0KKworCS8qIE9uIEFwcGxlLCB3ZSB3YW50IGEgcmVmZXJlbmNlIHRvIHRoZSBPcGVuIEZpcm13YXJlIGRldmljZS10cmVlCisJICogbm9kZS4gV2UgdXNlIGl0IGZvciBjbG9jayBjb250cm9sLgorCSAqLworI2lmZGVmIENPTkZJR19QUENfUE1BQworCWdwLT5vZl9ub2RlID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOworI2VuZGlmCisKKwkvKiBPbmx5IEFwcGxlIHZlcnNpb24gc3VwcG9ydHMgV09MIGFmYWlrICovCisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FQUExFKQorCQlncC0+aGFzX3dvbCA9IDE7CisKKwkvKiBNYWtlIHN1cmUgY2VsbCBpcyBlbmFibGVkICovCisJZ2VtX2dldF9jZWxsKGdwKTsKKworCS8qIE1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHN0b3BwZWQgYW5kIGluIGluaXQgc3RhdGUgKi8KKwlnZW1fcmVzZXQoZ3ApOworCisJLyogRmlsbCB1cCB0aGUgbWlpX3BoeSBzdHJ1Y3R1cmUgKGV2ZW4gaWYgd2Ugd29uJ3QgdXNlIGl0KSAqLworCWdwLT5waHlfbWlpLmRldiA9IGRldjsKKwlncC0+cGh5X21paS5tZGlvX3JlYWQgPSBfcGh5X3JlYWQ7CisJZ3AtPnBoeV9taWkubWRpb193cml0ZSA9IF9waHlfd3JpdGU7CisKKwkvKiBCeSBkZWZhdWx0LCB3ZSBzdGFydCB3aXRoIGF1dG9uZWcgKi8KKwlncC0+d2FudF9hdXRvbmVnID0gMTsKKworCS8qIENoZWNrIGZpZm8gc2l6ZXMsIFBIWSB0eXBlLCBldGMuLi4gKi8KKwlpZiAoZ2VtX2NoZWNrX2ludmFyaWFudHMoZ3ApKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCS8qIEl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUgcmV0dXJuZWQgYnVmZmVyIHdpbGwgYmUgYXQgbGVhc3QKKwkgKiBQQUdFX1NJWkUgYWxpZ25lZC4KKwkgKi8KKwlncC0+aW5pdF9ibG9jayA9IChzdHJ1Y3QgZ2VtX2luaXRfYmxvY2sgKikKKwkJcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCBnZW1faW5pdF9ibG9jayksCisJCQkJICAgICAmZ3AtPmdibG9ja19kdm1hKTsKKwlpZiAoIWdwLT5pbml0X2Jsb2NrKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBhbGxvY2F0ZSBpbml0IGJsb2NrLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJaWYgKGdlbV9nZXRfZGV2aWNlX2FkZHJlc3MoZ3ApKQorCQlnb3RvIGVycl9vdXRfZnJlZV9jb25zaXN0ZW50OworCisJZGV2LT5vcGVuID0gZ2VtX29wZW47CisJZGV2LT5zdG9wID0gZ2VtX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gZ2VtX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBnZW1fZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gZ2VtX3NldF9tdWx0aWNhc3Q7CisJZGV2LT5kb19pb2N0bCA9IGdlbV9pb2N0bDsKKwlkZXYtPnBvbGwgPSBnZW1fcG9sbDsKKwlkZXYtPndlaWdodCA9IDY0OworCWRldi0+ZXRodG9vbF9vcHMgPSAmZ2VtX2V0aHRvb2xfb3BzOworCWRldi0+dHhfdGltZW91dCA9IGdlbV90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1ICogSFo7CisJZGV2LT5jaGFuZ2VfbXR1ID0gZ2VtX2NoYW5nZV9tdHU7CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJZGV2LT5kbWEgPSAwOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBnZW1fcG9sbF9jb250cm9sbGVyOworI2VuZGlmCisKKwkvKiBTZXQgdGhhdCBub3csIGluIGNhc2UgUE0ga2lja3MgaW4gbm93ICovCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwkvKiBEZXRlY3QgJiBpbml0IFBIWSwgc3RhcnQgYXV0b25lZywgd2UgcmVsZWFzZSB0aGUgY2VsbCBub3cKKwkgKiB0b28sIGl0IHdpbGwgYmUgbWFuYWdlZCBieSB3aG9ldmVyIG5lZWRzIGl0CisJICovCisJZ2VtX2luaXRfcGh5KGdwKTsKKworCXNwaW5fbG9ja19pcnEoJmdwLT5sb2NrKTsKKwlnZW1fcHV0X2NlbGwoZ3ApOworCXNwaW5fdW5sb2NrX2lycSgmZ3AtPmxvY2spOworCisJLyogUmVnaXN0ZXIgd2l0aCBrZXJuZWwgKi8KKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9jb25zaXN0ZW50OworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdW4gR0VNIChQQ0kpIDEwLzEwMC8xMDAwQmFzZVQgRXRoZXJuZXQgIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLCBkZXYtPmRldl9hZGRyW2ldLAorCQkgICAgICAgaSA9PSA1ID8gJyAnIDogJzonKTsKKwlwcmludGsoIlxuIik7CisKKwlpZiAoZ3AtPnBoeV90eXBlID09IHBoeV9taWlfbWRpbzAgfHwKKyAgICAgCSAgICBncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZvdW5kICVzIFBIWVxuIiwgZGV2LT5uYW1lLCAKKwkJCWdwLT5waHlfbWlpLmRlZiA/IGdwLT5waHlfbWlpLmRlZi0+bmFtZSA6ICJubyIpOworCisJLyogR0VNIGNhbiBkbyBpdCBhbGwuLi4gKi8KKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0hXX0NTVU0gfCBORVRJRl9GX0xMVFg7CisJaWYgKHBjaV91c2luZ19kYWMpCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9jb25zaXN0ZW50OgorCWdlbV9yZW1vdmVfb25lKHBkZXYpOworZXJyX291dF9pb3VubWFwOgorCWdlbV9wdXRfY2VsbChncCk7CisJaW91bm1hcChncC0+cmVncyk7CisKK2Vycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworZXJyX291dF9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldihkZXYpOworZXJyX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gZXJyOworCit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGdlbV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gR0VNX01PRFVMRV9OQU1FLAorCS5pZF90YWJsZQk9IGdlbV9wY2lfdGJsLAorCS5wcm9iZQkJPSBnZW1faW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChnZW1fcmVtb3ZlX29uZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBnZW1fc3VzcGVuZCwKKwkucmVzdW1lCQk9IGdlbV9yZXN1bWUsCisjZW5kaWYgLyogQ09ORklHX1BNICovCit9OworCitzdGF0aWMgaW50IF9faW5pdCBnZW1faW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmdlbV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZ2VtX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmdlbV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChnZW1faW5pdCk7Cittb2R1bGVfZXhpdChnZW1fY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5nZW0uaCBiL2RyaXZlcnMvbmV0L3N1bmdlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNDNmZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW5nZW0uaApAQCAtMCwwICsxLDEwNTEgQEAKKy8qICRJZDogc3VuZ2VtLmgsdiAxLjEwLjIuNCAyMDAyLzAzLzExIDA4OjU0OjQ4IGRhdmVtIEV4cCAkCisgKiBzdW5nZW0uaDogRGVmaW5pdGlvbnMgZm9yIFN1biBHRU0gZXRoZXJuZXQgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKi8KKworI2lmbmRlZiBfU1VOR0VNX0gKKyNkZWZpbmUgX1NVTkdFTV9ICisKKy8qIEdsb2JhbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgR1JFR19TRUJTVEFURQkweDAwMDBVTAkvKiBTRUIgU3RhdGUgUmVnaXN0ZXIJCSovCisjZGVmaW5lIEdSRUdfQ0ZHCTB4MDAwNFVMCS8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJKi8KKyNkZWZpbmUgR1JFR19TVEFUCTB4MDAwQ1VMCS8qIFN0YXR1cyBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgR1JFR19JTUFTSwkweDAwMTBVTAkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgkqLworI2RlZmluZSBHUkVHX0lBQ0sJMHgwMDE0VUwJLyogSW50ZXJydXB0IEFDSyBSZWdpc3RlcgkqLworI2RlZmluZSBHUkVHX1NUQVQyCTB4MDAxQ1VMCS8qIEFsaWFzIG9mIEdSRUdfU1RBVAkJKi8KKyNkZWZpbmUgR1JFR19QQ0lFU1RBVAkweDEwMDBVTAkvKiBQQ0kgRXJyb3IgU3RhdHVzIFJlZ2lzdGVyCSovCisjZGVmaW5lIEdSRUdfUENJRU1BU0sJMHgxMDA0VUwJLyogUENJIEVycm9yIE1hc2sgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgR1JFR19CSUZDRkcJMHgxMDA4VUwJLyogQklGIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJKi8KKyNkZWZpbmUgR1JFR19CSUZESUFHCTB4MTAwQ1VMCS8qIEJJRiBEaWFnbm9zdGljcyBSZWdpc3RlcgkqLworI2RlZmluZSBHUkVHX1NXUlNUCTB4MTAxMFVMCS8qIFNvZnR3YXJlIFJlc2V0IFJlZ2lzdGVyCSovCisKKy8qIEdsb2JhbCBTRUIgU3RhdGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgR1JFR19TRUJTVEFURV9BUkIJMHgwMDAwMDAwMwkvKiBTdGF0ZSBvZiBBcmJpdGVyCQkqLworI2RlZmluZSBHUkVHX1NFQlNUQVRFX1JYV09OCTB4MDAwMDAwMDQJLyogUlggd29uIGludGVybmFsIGFyYml0cmF0aW9uCSovCisKKy8qIEdsb2JhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIEdSRUdfQ0ZHX0lCVVJTVAkJMHgwMDAwMDAwMQkvKiBJbmZpbml0ZSBCdXJzdAkJKi8KKyNkZWZpbmUgR1JFR19DRkdfVFhETUFMSU0JMHgwMDAwMDAzZQkvKiBUWCBETUEgZ3JhbnQgbGltaXQJCSovCisjZGVmaW5lIEdSRUdfQ0ZHX1JYRE1BTElNCTB4MDAwMDA3YzAJLyogUlggRE1BIGdyYW50IGxpbWl0CQkqLworI2RlZmluZSBHUkVHX0NGR19ST05QQVVMQklUCTB4MDAwMDA4MDAJLyogVXNlIG1lbSByZWFkIG11bHRpcGxlIGZvciBQQ0kgcmVhZAorCQkJCQkJICogYWZ0ZXIgaW5maW5pdGUgYnVyc3QgKEFwcGxlKSAqLworI2RlZmluZSBHUkVHX0NGR19FTkJVRzJGSVgJMHgwMDAwMTAwMAkvKiBGaXggUnggaGFuZyBhZnRlciBvdmVyZmxvdyAqLworCisvKiBHbG9iYWwgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3Rlci4KKyAqCisgKiBSZWFkaW5nIHRoaXMgcmVnaXN0ZXIgYXV0b21hdGljYWxseSBjbGVhcnMgYml0cyAwIHRocm91Z2ggNi4KKyAqIFRoaXMgYXV0by1jbGVhcmluZyBkb2VzIG5vdCBvY2N1ciB3aGVuIHRoZSBhbGlhcyBhdCBHUkVHX1NUQVQyCisgKiBpcyByZWFkIGluc3RlYWQuICBUaGUgcmVzdCBvZiB0aGUgaW50ZXJydXB0IGJpdHMgb25seSBjbGVhciB3aGVuCisgKiB0aGUgc2Vjb25kYXJ5IGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGF0CisgKiBiaXQgaXMgcmVhZCAoaWUuIGlmIEdSRUdfU1RBVF9QQ1MgaXMgc2V0LCBpdCB3aWxsIGJlIGNsZWFyZWQgYnkKKyAqIHJlYWRpbmcgUENTX0lTVEFUKS4KKyAqLworI2RlZmluZSBHUkVHX1NUQVRfVFhJTlRNRQkweDAwMDAwMDAxCS8qIFRYIElOVE1FIGZyYW1lIHRyYW5zZmVycmVkCSovCisjZGVmaW5lIEdSRUdfU1RBVF9UWEFMTAkJMHgwMDAwMDAwMgkvKiBBbGwgVFggZnJhbWVzIHRyYW5zZmVycmVkCSovCisjZGVmaW5lIEdSRUdfU1RBVF9UWERPTkUJMHgwMDAwMDAwNAkvKiBPbmUgVFggZnJhbWUgdHJhbnNmZXJyZWQJKi8KKyNkZWZpbmUgR1JFR19TVEFUX1JYRE9ORQkweDAwMDAwMDEwCS8qIE9uZSBSWCBmcmFtZSBhcnJpdmVkCQkqLworI2RlZmluZSBHUkVHX1NUQVRfUlhOT0JVRgkweDAwMDAwMDIwCS8qIE5vIGZyZWUgUlggYnVmZmVycyBhdmFpbGFibGUJKi8KKyNkZWZpbmUgR1JFR19TVEFUX1JYVEFHRVJSCTB4MDAwMDAwNDAJLyogUlggdGFnIGZyYW1pbmcgaXMgY29ycnVwdAkqLworI2RlZmluZSBHUkVHX1NUQVRfUENTCQkweDAwMDAyMDAwCS8qIFBDUyBzaWduYWxsZWQgaW50ZXJydXB0CSovCisjZGVmaW5lIEdSRUdfU1RBVF9UWE1BQwkJMHgwMDAwNDAwMAkvKiBUWCBNQUMgc2lnbmFsbGVkIGludGVycnVwdAkqLworI2RlZmluZSBHUkVHX1NUQVRfUlhNQUMJCTB4MDAwMDgwMDAJLyogUlggTUFDIHNpZ25hbGxlZCBpbnRlcnJ1cHQJKi8KKyNkZWZpbmUgR1JFR19TVEFUX01BQwkJMHgwMDAxMDAwMAkvKiBNQUMgQ29udHJvbCBzaWduYWxsZWQgaXJxCSovCisjZGVmaW5lIEdSRUdfU1RBVF9NSUYJCTB4MDAwMjAwMDAJLyogTUlGIHNpZ25hbGxlZCBpbnRlcnJ1cHQJKi8KKyNkZWZpbmUgR1JFR19TVEFUX1BDSUVSUgkweDAwMDQwMDAwCS8qIFBDSSBFcnJvciBpbnRlcnJ1cHQJCSovCisjZGVmaW5lIEdSRUdfU1RBVF9UWE5SCQkweGZmZjgwMDAwCS8qID09IFRYRE1BX1RYRE9ORSByZWcgdmFsCSovCisjZGVmaW5lIEdSRUdfU1RBVF9UWE5SX1NISUZUCTE5CisKKyNkZWZpbmUgR1JFR19TVEFUX0FCTk9STUFMCShHUkVHX1NUQVRfUlhOT0JVRiB8IEdSRUdfU1RBVF9SWFRBR0VSUiB8IFwKKwkJCQkgR1JFR19TVEFUX1BDUyB8IEdSRUdfU1RBVF9UWE1BQyB8IEdSRUdfU1RBVF9SWE1BQyB8IFwKKwkJCQkgR1JFR19TVEFUX01BQyB8IEdSRUdfU1RBVF9NSUYgfCBHUkVHX1NUQVRfUENJRVJSKQorCisjZGVmaW5lIEdSRUdfU1RBVF9OQVBJCQkoR1JFR19TVEFUX1RYQUxMICB8IEdSRUdfU1RBVF9UWElOVE1FIHwgXAorCQkJCSBHUkVHX1NUQVRfUlhET05FIHwgR1JFR19TVEFUX0FCTk9STUFMKQorCisvKiBUaGUgbGF5b3V0IG9mIEdSRUdfSU1BU0sgYW5kIEdSRUdfSUFDSyBpcyBpZGVudGljYWwgdG8gR1JFR19TVEFULgorICogQml0cyBzZXQgaW4gR1JFR19JTUFTSyB3aWxsIHByZXZlbnQgdGhhdCBpbnRlcnJ1cHQgdHlwZSBmcm9tIGJlaW5nCisgKiBzaWduYWxsZWQgdG8gdGhlIGNwdS4gIEdSRUdfSUFDSyBjYW4gYmUgdXNlZCB0byBjbGVhciBzcGVjaWZpYyB0b3AtbGV2ZWwKKyAqIGludGVycnVwdCBjb25kaXRpb25zIGluIEdSRUdfU1RBVCwgaWUuIGl0IG9ubHkgd29ya3MgZm9yIGJpdHMgMCB0aHJvdWdoIDYuCisgKiBTZXR0aW5nIHRoZSBiaXQgd2lsbCBjbGVhciB0aGF0IGludGVycnVwdCwgY2xlYXIgYml0cyB3aWxsIGhhdmUgbm8gZWZmZWN0CisgKiBvbiBHUkVHX1NUQVQuCisgKi8KKworLyogR2xvYmFsIFBDSSBFcnJvciBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgR1JFR19QQ0lFU1RBVF9CQURBQ0sJMHgwMDAwMDAwMQkvKiBObyBBQ0s2NCMgZHVyaW5nIEFCUzY0IGN5Y2xlCSovCisjZGVmaW5lIEdSRUdfUENJRVNUQVRfRFRSVE8JMHgwMDAwMDAwMgkvKiBEZWxheWVkIHRyYW5zYWN0aW9uIHRpbWVvdXQJKi8KKyNkZWZpbmUgR1JFR19QQ0lFU1RBVF9PVEhFUgkweDAwMDAwMDA0CS8qIE90aGVyIFBDSSBlcnJvciwgY2hlY2sgY2ZnIHNwYWNlICovCisKKy8qIFRoZSBsYXlvdXQgb2YgdGhlIEdSRUdfUENJRU1BU0sgaXMgaWRlbnRpY2FsIHRvIHRoYXQgb2YgR1JFR19QQ0lFU1RBVC4KKyAqIEJpdHMgc2V0IGluIEdSRUdfUENJRU1BU0sgd2lsbCBwcmV2ZW50IHRoYXQgaW50ZXJydXB0IHR5cGUgZnJvbSBiZWluZworICogc2lnbmFsbGVkIHRvIHRoZSBjcHUuCisgKi8KKworLyogR2xvYmFsIEJJRiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIEdSRUdfQklGQ0ZHX1NMT1dDTEsJMHgwMDAwMDAwMQkvKiBTZXQgaWYgUENJIHJ1bnMgPCAyNU1oegkqLworI2RlZmluZSBHUkVHX0JJRkNGR19CNjRESVMJMHgwMDAwMDAwMgkvKiBEaXNhYmxlIDY0Yml0IHdpZGUgZGF0YSBjeWNsZSovCisjZGVmaW5lIEdSRUdfQklGQ0ZHX002NkVOCTB4MDAwMDAwMDQJLyogU2V0IGlmIG9uIDY2TWh6IFBDSSBzZWdtZW50CSovCisKKy8qIEdsb2JhbCBCSUYgRGlhZ25vc3RpY3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgR1JFR19CSUZESUFHX0JVUlNUU00JMHgwMDdmMDAwMAkvKiBQQ0kgQnVyc3Qgc3RhdGUgbWFjaGluZQkqLworI2RlZmluZSBHUkVHX0JJRkRJQUdfQklGU00JMHhmZjAwMDAwMAkvKiBCSUYgc3RhdGUgbWFjaGluZQkJKi8KKworLyogR2xvYmFsIFNvZnR3YXJlIFJlc2V0IFJlZ2lzdGVyLgorICoKKyAqIFRoaXMgcmVnaXN0ZXIgaXMgdXNlZCB0byBwZXJmb3JtIGEgZ2xvYmFsIHJlc2V0IG9mIHRoZSBSWCBhbmQgVFggcG9ydGlvbnMKKyAqIG9mIHRoZSBHRU0gYXNpYy4gIFNldHRpbmcgdGhlIFJYIG9yIFRYIHJlc2V0IGJpdCB3aWxsIHN0YXJ0IHRoZSByZXNldC4KKyAqIFRoZSBkcml2ZXIgX01VU1RfIHBvbGwgdGhlc2UgYml0cyB1bnRpbCB0aGV5IGNsZWFyLiAgT25lIG1heSBub3QgYXR0ZW1wdAorICogdG8gcHJvZ3JhbSBhbnkgb3RoZXIgcGFydCBvZiBHRU0gdW50aWwgdGhlIGJpdHMgY2xlYXIuCisgKi8KKyNkZWZpbmUgR1JFR19TV1JTVF9UWFJTVAkweDAwMDAwMDAxCS8qIFRYIFNvZnR3YXJlIFJlc2V0CQkqLworI2RlZmluZSBHUkVHX1NXUlNUX1JYUlNUCTB4MDAwMDAwMDIJLyogUlggU29mdHdhcmUgUmVzZXQJCSovCisjZGVmaW5lIEdSRUdfU1dSU1RfUlNUT1VUCTB4MDAwMDAwMDQJLyogRm9yY2UgUlNUIyBwaW4gYWN0aXZlCSovCisjZGVmaW5lIEdSRUdfU1dSU1RfQ0FDSEVTSVpFCTB4MDBmZjAwMDAJLyogUklPIG9ubHk6IGNhY2hlIGxpbmUgc2l6ZQkqLworI2RlZmluZSBHUkVHX1NXUlNUX0NBQ0hFX1NISUZUCTE2CisKKy8qIFRYIERNQSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgVFhETUFfS0lDSwkweDIwMDBVTAkvKiBUWCBLaWNrIFJlZ2lzdGVyCQkqLworI2RlZmluZSBUWERNQV9DRkcJMHgyMDA0VUwJLyogVFggQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkqLworI2RlZmluZSBUWERNQV9EQkxPVwkweDIwMDhVTAkvKiBUWCBEZXNjLiBCYXNlIExvdwkJKi8KKyNkZWZpbmUgVFhETUFfREJISQkweDIwMENVTAkvKiBUWCBEZXNjLiBCYXNlIEhpZ2gJCSovCisjZGVmaW5lIFRYRE1BX0ZXUFRSCTB4MjAxNFVMCS8qIFRYIEZJRk8gV3JpdGUgUG9pbnRlcgkqLworI2RlZmluZSBUWERNQV9GU1dQVFIJMHgyMDE4VUwJLyogVFggRklGTyBTaGFkb3cgV3JpdGUgUG9pbnRlcgkqLworI2RlZmluZSBUWERNQV9GUlBUUgkweDIwMUNVTAkvKiBUWCBGSUZPIFJlYWQgUG9pbnRlcgkJKi8KKyNkZWZpbmUgVFhETUFfRlNSUFRSCTB4MjAyMFVMCS8qIFRYIEZJRk8gU2hhZG93IFJlYWQgUG9pbnRlcgkqLworI2RlZmluZSBUWERNQV9QQ05UCTB4MjAyNFVMCS8qIFRYIEZJRk8gUGFja2V0IENvdW50ZXIJKi8KKyNkZWZpbmUgVFhETUFfU01BQ0hJTkUJMHgyMDI4VUwJLyogVFggU3RhdGUgTWFjaGluZSBSZWdpc3RlcgkqLworI2RlZmluZSBUWERNQV9EUExPVwkweDIwMzBVTAkvKiBUWCBEYXRhIFBvaW50ZXIgTG93CQkqLworI2RlZmluZSBUWERNQV9EUEhJCTB4MjAzNFVMCS8qIFRYIERhdGEgUG9pbnRlciBIaWdoCQkqLworI2RlZmluZSBUWERNQV9UWERPTkUJMHgyMTAwVUwJLyogVFggQ29tcGxldGlvbiBSZWdpc3RlcgkqLworI2RlZmluZSBUWERNQV9GQUREUgkweDIxMDRVTAkvKiBUWCBGSUZPIEFkZHJlc3MJCSovCisjZGVmaW5lIFRYRE1BX0ZUQUcJMHgyMTA4VUwJLyogVFggRklGTyBUYWcJCQkqLworI2RlZmluZSBUWERNQV9ETE9XCTB4MjEwQ1VMCS8qIFRYIEZJRk8gRGF0YSBMb3cJCSovCisjZGVmaW5lIFRYRE1BX0RISVQxCTB4MjExMFVMCS8qIFRYIEZJRk8gRGF0YSBIaWdoVDEJCSovCisjZGVmaW5lIFRYRE1BX0RISVQwCTB4MjExNFVMCS8qIFRYIEZJRk8gRGF0YSBIaWdoVDAJCSovCisjZGVmaW5lIFRYRE1BX0ZTWgkweDIxMThVTAkvKiBUWCBGSUZPIFNpemUJCQkqLworCisvKiBUWCBLaWNrIFJlZ2lzdGVyLgorICoKKyAqIFRoaXMgMTMtYml0IHJlZ2lzdGVyIGlzIHByb2dyYW1tZWQgYnkgdGhlIGRyaXZlciB0byBob2xkIHRoZSBkZXNjcmlwdG9yCisgKiBlbnRyeSBpbmRleCB3aGljaCBmb2xsb3dzIHRoZSBsYXN0IHZhbGlkIHRyYW5zbWl0IGRlc2NyaXB0b3IuCisgKi8KKworLyogVFggQ29tcGxldGlvbiBSZWdpc3Rlci4KKyAqCisgKiBUaGlzIDEzLWJpdCByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEdFTSB0byBob2xkIHRvIGRlc2NyaXB0b3IgZW50cnkgaW5kZXgKKyAqIHdoaWNoIGZvbGxvd3MgdGhlIGxhc3QgZGVzY3JpcHRvciBhbHJlYWR5IHByb2Nlc3NlZCBieSBHRU0uICBOb3RlIHRoYXQKKyAqIHRoaXMgdmFsdWUgaXMgbWlycm9yZWQgaW4gR1JFR19TVEFUIHdoaWNoIGVsaW1pbmF0ZXMgdGhlIG5lZWQgdG8gZXZlbgorICogYWNjZXNzIHRoaXMgcmVnaXN0ZXIgaW4gdGhlIGRyaXZlciBkdXJpbmcgaW50ZXJydXB0IHByb2Nlc3NpbmcuCisgKi8KKworLyogVFggQ29uZmlndXJhdGlvbiBSZWdpc3Rlci4KKyAqCisgKiBOb3RlIHRoYXQgVFhETUFfQ0ZHX0ZUSFJFU0gsIHRoZSBUWCBGSUZPIFRocmVzaG9sZCwgaXMgYW4gb2Jzb2xldGUgZmVhdHVyZQorICogdGhhdCB3YXMgbWVhbnQgdG8gYmUgdXNlZCB3aXRoIGp1bWJvIHBhY2tldHMuICBJdCBzaG91bGQgYmUgc2V0IHRvIHRoZQorICogbWF4aW11bSB2YWx1ZSBvZiAweDRmZiwgZWxzZSBvbmUgcmlza3MgZ2V0dGluZyBUWCBNQUMgVW5kZXJydW4gZXJyb3JzLgorICovCisjZGVmaW5lIFRYRE1BX0NGR19FTkFCTEUJMHgwMDAwMDAwMQkvKiBFbmFibGUgVFggRE1BIGNoYW5uZWwJKi8KKyNkZWZpbmUgVFhETUFfQ0ZHX1JJTkdTWgkweDAwMDAwMDFlCS8qIFRYIGRlc2NyaXB0b3IgcmluZyBzaXplCSovCisjZGVmaW5lIFRYRE1BX0NGR19SSU5HU1pfMzIJMHgwMDAwMDAwMAkvKiAzMiBUWCBkZXNjcmlwdG9ycwkJKi8KKyNkZWZpbmUgVFhETUFfQ0ZHX1JJTkdTWl82NAkweDAwMDAwMDAyCS8qIDY0IFRYIGRlc2NyaXB0b3JzCQkqLworI2RlZmluZSBUWERNQV9DRkdfUklOR1NaXzEyOAkweDAwMDAwMDA0CS8qIDEyOCBUWCBkZXNjcmlwdG9ycwkJKi8KKyNkZWZpbmUgVFhETUFfQ0ZHX1JJTkdTWl8yNTYJMHgwMDAwMDAwNgkvKiAyNTYgVFggZGVzY3JpcHRvcnMJCSovCisjZGVmaW5lIFRYRE1BX0NGR19SSU5HU1pfNTEyCTB4MDAwMDAwMDgJLyogNTEyIFRYIGRlc2NyaXB0b3JzCQkqLworI2RlZmluZSBUWERNQV9DRkdfUklOR1NaXzFLCTB4MDAwMDAwMGEJLyogMTAyNCBUWCBkZXNjcmlwdG9ycwkJKi8KKyNkZWZpbmUgVFhETUFfQ0ZHX1JJTkdTWl8ySwkweDAwMDAwMDBjCS8qIDIwNDggVFggZGVzY3JpcHRvcnMJCSovCisjZGVmaW5lIFRYRE1BX0NGR19SSU5HU1pfNEsJMHgwMDAwMDAwZQkvKiA0MDk2IFRYIGRlc2NyaXB0b3JzCQkqLworI2RlZmluZSBUWERNQV9DRkdfUklOR1NaXzhLCTB4MDAwMDAwMTAJLyogODE5MiBUWCBkZXNjcmlwdG9ycwkJKi8KKyNkZWZpbmUgVFhETUFfQ0ZHX1BJT1NFTAkweDAwMDAwMDIwCS8qIEVuYWJsZSBUWCBGSUZPIFBJTyBmcm9tIGNwdQkqLworI2RlZmluZSBUWERNQV9DRkdfRlRIUkVTSAkweDAwMWZmYzAwCS8qIFRYIEZJRk8gVGhyZXNob2xkLCBvYnNvbGV0ZQkqLworI2RlZmluZSBUWERNQV9DRkdfUE1PREUJCTB4MDAyMDAwMDAJLyogVFhBTEwgaXJxIG1lYW5zIFRYIEZJRk8gZW1wdHkqLworCisvKiBUWCBEZXNjcmlwdG9yIEJhc2UgTG93L0hpZ2guCisgKgorICogVGhlc2UgdHdvIHJlZ2lzdGVycyBzdG9yZSB0aGUgNTMgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBiYXNlIGFkZHJlc3MKKyAqIG9mIHRoZSBUWCBkZXNjcmlwdG9yIHRhYmxlLiAgVGhlIDExIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlIGFsd2F5cworICogemVyby4gIEFzIGEgcmVzdWx0LCB0aGUgVFggZGVzY3JpcHRvciB0YWJsZSBtdXN0IGJlIDJLIGFsaWduZWQuCisgKi8KKworLyogVGhlIHJlc3Qgb2YgdGhlIFRYRE1BXyogcmVnaXN0ZXJzIGFyZSBmb3IgZGlhZ25vc3RpY3MgYW5kIGRlYnVnLCBJIHdpbGwgZG9jdW1lbnQKKyAqIHRoZW0gbGF0ZXIuIC1EYXZlTQorICovCisKKy8qIFdha2VPbkxhbiBSZWdpc3RlcnMJKi8KKyNkZWZpbmUgV09MX01BVENIMAkweDMwMDBVTAorI2RlZmluZSBXT0xfTUFUQ0gxCTB4MzAwNFVMCisjZGVmaW5lIFdPTF9NQVRDSDIJMHgzMDA4VUwKKyNkZWZpbmUgV09MX01DT1VOVAkweDMwMENVTAorI2RlZmluZSBXT0xfV0FLRUNTUgkweDMwMTBVTAorCisvKiBXT0wgTWF0Y2ggY291bnQgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBXT0xfTUNPVU5UX04JCTB4MDAwMDAwMTAKKyNkZWZpbmUgV09MX01DT1VOVF9NCQkweDAwMDAwMDAwIC8qIDAgPDwgOCAqLworCisjZGVmaW5lIFdPTF9XQUtFQ1NSX0VOQUJMRQkweDAwMDAwMDAxCisjZGVmaW5lIFdPTF9XQUtFQ1NSX01JSQkJMHgwMDAwMDAwMgorI2RlZmluZSBXT0xfV0FLRUNTUl9TRUVOCTB4MDAwMDAwMDQKKyNkZWZpbmUgV09MX1dBS0VDU1JfRklMVF9VQ0FTVAkweDAwMDAwMDA4CisjZGVmaW5lIFdPTF9XQUtFQ1NSX0ZJTFRfTUNBU1QJMHgwMDAwMDAxMAorI2RlZmluZSBXT0xfV0FLRUNTUl9GSUxUX0JDQVNUCTB4MDAwMDAwMjAKKyNkZWZpbmUgV09MX1dBS0VDU1JfRklMVF9TRUVOCTB4MDAwMDAwNDAKKworCisvKiBSZWNlaXZlIERNQSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUlhETUFfQ0ZHCTB4NDAwMFVMCS8qIFJYIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUlhETUFfREJMT1cJMHg0MDA0VUwJLyogUlggRGVzY3JpcHRvciBCYXNlIExvdwkqLworI2RlZmluZSBSWERNQV9EQkhJCTB4NDAwOFVMCS8qIFJYIERlc2NyaXB0b3IgQmFzZSBIaWdoCSovCisjZGVmaW5lIFJYRE1BX0ZXUFRSCTB4NDAwQ1VMCS8qIFJYIEZJRk8gV3JpdGUgUG9pbnRlcgkqLworI2RlZmluZSBSWERNQV9GU1dQVFIJMHg0MDEwVUwJLyogUlggRklGTyBTaGFkb3cgV3JpdGUgUG9pbnRlcgkqLworI2RlZmluZSBSWERNQV9GUlBUUgkweDQwMTRVTAkvKiBSWCBGSUZPIFJlYWQgUG9pbnRlcgkJKi8KKyNkZWZpbmUgUlhETUFfUENOVAkweDQwMThVTAkvKiBSWCBGSUZPIFBhY2tldCBDb3VudGVyCSovCisjZGVmaW5lIFJYRE1BX1NNQUNISU5FCTB4NDAxQ1VMCS8qIFJYIFN0YXRlIE1hY2hpbmUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUlhETUFfUFRIUkVTSAkweDQwMjBVTAkvKiBQYXVzZSBUaHJlc2hvbGRzCQkqLworI2RlZmluZSBSWERNQV9EUExPVwkweDQwMjRVTAkvKiBSWCBEYXRhIFBvaW50ZXIgTG93CQkqLworI2RlZmluZSBSWERNQV9EUEhJCTB4NDAyOFVMCS8qIFJYIERhdGEgUG9pbnRlciBIaWdoCQkqLworI2RlZmluZSBSWERNQV9LSUNLCTB4NDEwMFVMCS8qIFJYIEtpY2sgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFJYRE1BX0RPTkUJMHg0MTA0VUwJLyogUlggQ29tcGxldGlvbiBSZWdpc3RlcgkqLworI2RlZmluZSBSWERNQV9CTEFOSwkweDQxMDhVTAkvKiBSWCBCbGFua2luZyBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUlhETUFfRkFERFIJMHg0MTBDVUwJLyogUlggRklGTyBBZGRyZXNzCQkqLworI2RlZmluZSBSWERNQV9GVEFHCTB4NDExMFVMCS8qIFJYIEZJRk8gVGFnCQkJKi8KKyNkZWZpbmUgUlhETUFfRExPVwkweDQxMTRVTAkvKiBSWCBGSUZPIERhdGEgTG93CQkqLworI2RlZmluZSBSWERNQV9ESElUMQkweDQxMThVTAkvKiBSWCBGSUZPIERhdGEgSGlnaFQwCQkqLworI2RlZmluZSBSWERNQV9ESElUMAkweDQxMUNVTAkvKiBSWCBGSUZPIERhdGEgSGlnaFQxCQkqLworI2RlZmluZSBSWERNQV9GU1oJMHg0MTIwVUwJLyogUlggRklGTyBTaXplCQkJKi8KKworLyogUlggQ29uZmlndXJhdGlvbiBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX0VOQUJMRQkweDAwMDAwMDAxCS8qIEVuYWJsZSBSWCBETUEgY2hhbm5lbAkqLworI2RlZmluZSBSWERNQV9DRkdfUklOR1NaCTB4MDAwMDAwMWUJLyogUlggZGVzY3JpcHRvciByaW5nIHNpemUJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX1JJTkdTWl8zMgkweDAwMDAwMDAwCS8qIC0gMzIgICBlbnRyaWVzCQkqLworI2RlZmluZSBSWERNQV9DRkdfUklOR1NaXzY0CTB4MDAwMDAwMDIJLyogLSA2NCAgIGVudHJpZXMJCSovCisjZGVmaW5lIFJYRE1BX0NGR19SSU5HU1pfMTI4CTB4MDAwMDAwMDQJLyogLSAxMjggIGVudHJpZXMJCSovCisjZGVmaW5lIFJYRE1BX0NGR19SSU5HU1pfMjU2CTB4MDAwMDAwMDYJLyogLSAyNTYgIGVudHJpZXMJCSovCisjZGVmaW5lIFJYRE1BX0NGR19SSU5HU1pfNTEyCTB4MDAwMDAwMDgJLyogLSA1MTIgIGVudHJpZXMJCSovCisjZGVmaW5lIFJYRE1BX0NGR19SSU5HU1pfMUsJMHgwMDAwMDAwYQkvKiAtIDEwMjQgZW50cmllcwkJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX1JJTkdTWl8ySwkweDAwMDAwMDBjCS8qIC0gMjA0OCBlbnRyaWVzCQkqLworI2RlZmluZSBSWERNQV9DRkdfUklOR1NaXzRLCTB4MDAwMDAwMGUJLyogLSA0MDk2IGVudHJpZXMJCSovCisjZGVmaW5lIFJYRE1BX0NGR19SSU5HU1pfOEsJMHgwMDAwMDAxMAkvKiAtIDgxOTIgZW50cmllcwkJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX1JJTkdTWl9CRElTQUIJMHgwMDAwMDAyMAkvKiBEaXNhYmxlIFJYIGRlc2MgYmF0Y2hpbmcJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX0ZCT0ZGCQkweDAwMDAxYzAwCS8qIE9mZnNldCBvZiBmaXJzdCBkYXRhIGJ5dGUJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX0NTVU1PRkYJMHgwMDBmZTAwMAkvKiBTa2lwIGJ5dGVzIGJlZm9yZSBjc3VtIGNhbGMJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX0ZUSFJFU0gJMHgwNzAwMDAwMAkvKiBSWCBGSUZPIGRtYSBzdGFydCB0aHJlc2hvbGQJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX0ZUSFJFU0hfNjQJMHgwMDAwMDAwMAkvKiAtIDY0ICAgYnl0ZXMJCQkqLworI2RlZmluZSBSWERNQV9DRkdfRlRIUkVTSF8xMjgJMHgwMTAwMDAwMAkvKiAtIDEyOCAgYnl0ZXMJCQkqLworI2RlZmluZSBSWERNQV9DRkdfRlRIUkVTSF8yNTYJMHgwMjAwMDAwMAkvKiAtIDI1NiAgYnl0ZXMJCQkqLworI2RlZmluZSBSWERNQV9DRkdfRlRIUkVTSF81MTIJMHgwMzAwMDAwMAkvKiAtIDUxMiAgYnl0ZXMJCQkqLworI2RlZmluZSBSWERNQV9DRkdfRlRIUkVTSF8xSwkweDA0MDAwMDAwCS8qIC0gMTAyNCBieXRlcwkJCSovCisjZGVmaW5lIFJYRE1BX0NGR19GVEhSRVNIXzJLCTB4MDUwMDAwMDAJLyogLSAyMDQ4IGJ5dGVzCQkJKi8KKworLyogUlggRGVzY3JpcHRvciBCYXNlIExvdy9IaWdoLgorICoKKyAqIFRoZXNlIHR3byByZWdpc3RlcnMgc3RvcmUgdGhlIDUzIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgYmFzZSBhZGRyZXNzCisgKiBvZiB0aGUgUlggZGVzY3JpcHRvciB0YWJsZS4gIFRoZSAxMSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGFyZSBhbHdheXMKKyAqIHplcm8uICBBcyBhIHJlc3VsdCwgdGhlIFJYIGRlc2NyaXB0b3IgdGFibGUgbXVzdCBiZSAySyBhbGlnbmVkLgorICovCisKKy8qIFJYIFBBVVNFIFRocmVzaG9sZHMuCisgKgorICogVGhlc2UgdmFsdWVzIGRldGVybWluZSB3aGVuIFhPRkYgYW5kIFhPTiBQQVVTRSBmcmFtZXMgYXJlIGVtaXR0ZWQgYnkKKyAqIEdFTS4gIFRoZSB0aHJlc2hvbGRzIG1lYXN1cmUgUlggRklGTyBvY2N1cGFuY3kgaW4gdW5pdHMgb2YgNjQgYnl0ZXMuCisgKi8KKyNkZWZpbmUgUlhETUFfUFRIUkVTSF9PRkYJMHgwMDAwMDFmZgkvKiBYT0ZGIGVtaXR0ZWQgdy9GSUZPID4gdGhpcwkqLworI2RlZmluZSBSWERNQV9QVEhSRVNIX09OCTB4MDAxZmYwMDAJLyogWE9OIGVtaXR0ZWQgdy9GSUZPIDwgdGhpcwkqLworCisvKiBSWCBLaWNrIFJlZ2lzdGVyLgorICoKKyAqIFRoaXMgMTMtYml0IHJlZ2lzdGVyIGlzIHdyaXR0ZW4gYnkgdGhlIGhvc3QgQ1BVIGFuZCBob2xkcyB0aGUgbGFzdAorICogdmFsaWQgUlggZGVzY3JpcHRvciBudW1iZXIgcGx1cyBvbmUuICBUaGlzIGlzLCBpZiAnTicgaXMgd3JpdHRlbiB0bworICogdGhpcyByZWdpc3RlciwgaXQgbWVhbnMgdGhhdCBhbGwgUlggZGVzY3JpcHRvcnMgdXAgdG8gYnV0IGV4Y2x1ZGluZworICogJ04nIGFyZSB2YWxpZC4KKyAqCisgKiBUaGUgaGFyZHdhcmUgcmVxdWlyZXMgdGhhdCBSWCBkZXNjcmlwdG9ycyBhcmUgcG9zdGVkIGluIGluY3JlbWVudHMKKyAqIG9mIDQuICBUaGlzIG1lYW5zICdOJyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgZm91ci4gIEZvciB0aGUgYmVzdAorICogcGVyZm9ybWFuY2UsIHRoZSBmaXJzdCBuZXcgZGVzY3JpcHRvciBiZWluZyBwb3N0ZWQgc2hvdWxkIGJlIChQQ0kpCisgKiBjYWNoZSBsaW5lIGFsaWduZWQuCisgKi8KKworLyogUlggQ29tcGxldGlvbiBSZWdpc3Rlci4KKyAqCisgKiBUaGlzIDEzLWJpdCByZWdpc3RlciBpcyB1cGRhdGVkIGJ5IEdFTSB0byBpbmRpY2F0ZSB3aGljaCBSWCBkZXNjcmlwdG9ycworICogaGF2ZSBhbHJlYWR5IGJlZW4gdXNlZCBmb3IgcmVjZWl2ZSBmcmFtZXMuICBBbGwgZGVzY3JpcHRvcnMgdXAgdG8gYnV0CisgKiBleGNsdWRpbmcgdGhlIHZhbHVlIGluIHRoaXMgcmVnaXN0ZXIgYXJlIHJlYWR5IHRvIGJlIHByb2Nlc3NlZC4gIEdFTQorICogdXBkYXRlcyB0aGlzIHJlZ2lzdGVyIHZhbHVlIGFmdGVyIHRoZSBSWCBGSUZPIGVtcHRpZXMgY29tcGxldGVseSBpbnRvCisgKiB0aGUgUlggZGVzY3JpcHRvcidzIGJ1ZmZlciwgYnV0IGJlZm9yZSB0aGUgUlhfRE9ORSBiaXQgaXMgc2V0IGluIHRoZQorICogaW50ZXJydXB0IHN0YXR1cyByZWdpc3Rlci4KKyAqLworCisvKiBSWCBCbGFua2luZyBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgUlhETUFfQkxBTktfSVBLVFMJMHgwMDAwMDFmZgkvKiBSWF9ET05FIGFzc2VydGVkIGFmdGVyIHRoaXMKKwkJCQkJCSAqIG1hbnkgcGFja2V0cyByZWNlaXZlZCBzaW5jZQorCQkJCQkJICogcHJldmlvdXMgUlhfRE9ORS4KKwkJCQkJCSAqLworI2RlZmluZSBSWERNQV9CTEFOS19JVElNRQkweDAwMGZmMDAwCS8qIFJYX0RPTkUgYXNzZXJ0ZWQgYWZ0ZXIgdGhpcworCQkJCQkJICogbWFueSBjbG9ja3MgKG1lYXN1cmVkIGluIDIwNDgKKwkJCQkJCSAqIFBDSSBjbG9ja3MpIHdlcmUgY291bnRlZCBzaW5jZQorCQkJCQkJICogdGhlIHByZXZpb3VzIFJYX0RPTkUuCisJCQkJCQkgKi8KKworLyogUlggRklGTyBTaXplLgorICoKKyAqIFRoaXMgMTEtYml0IHJlYWQtb25seSByZWdpc3RlciBpbmRpY2F0ZXMgaG93IGxhcmdlLCBpbiB1bml0cyBvZiA2NC1ieXRlcywKKyAqIHRoZSBSWCBGSUZPIGlzLiAgVGhlIGRyaXZlciB1c2VzIHRoaXMgdG8gcHJvcGVybHkgY29uZmlndXJlIHRoZSBSWCBQQVVTRQorICogdGhyZXNob2xkcy4KKyAqLworCisvKiBUaGUgcmVzdCBvZiB0aGUgUlhETUFfKiByZWdpc3RlcnMgYXJlIGZvciBkaWFnbm9zdGljcyBhbmQgZGVidWcsIEkgd2lsbCBkb2N1bWVudAorICogdGhlbSBsYXRlci4gLURhdmVNCisgKi8KKworLyogTUFDIFJlZ2lzdGVycyAqLworI2RlZmluZSBNQUNfVFhSU1QJMHg2MDAwVUwJLyogVFggTUFDIFNvZnR3YXJlIFJlc2V0IENvbW1hbmQqLworI2RlZmluZSBNQUNfUlhSU1QJMHg2MDA0VUwJLyogUlggTUFDIFNvZnR3YXJlIFJlc2V0IENvbW1hbmQqLworI2RlZmluZSBNQUNfU05EUEFVU0UJMHg2MDA4VUwJLyogU2VuZCBQYXVzZSBDb21tYW5kIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19UWFNUQVQJMHg2MDEwVUwJLyogVFggTUFDIFN0YXR1cyBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfUlhTVEFUCTB4NjAxNFVMCS8qIFJYIE1BQyBTdGF0dXMgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0NTVEFUCTB4NjAxOFVMCS8qIE1BQyBDb250cm9sIFN0YXR1cyBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfVFhNQVNLCTB4NjAyMFVMCS8qIFRYIE1BQyBNYXNrIFJlZ2lzdGVyCQkqLworI2RlZmluZSBNQUNfUlhNQVNLCTB4NjAyNFVMCS8qIFJYIE1BQyBNYXNrIFJlZ2lzdGVyCQkqLworI2RlZmluZSBNQUNfTUNNQVNLCTB4NjAyOFVMCS8qIE1BQyBDb250cm9sIE1hc2sgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX1RYQ0ZHCTB4NjAzMFVMCS8qIFRYIE1BQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyKi8KKyNkZWZpbmUgTUFDX1JYQ0ZHCTB4NjAzNFVMCS8qIFJYIE1BQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyKi8KKyNkZWZpbmUgTUFDX01DQ0ZHCTB4NjAzOFVMCS8qIE1BQyBDb250cm9sIENvbmZpZyBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfWElGQ0ZHCTB4NjAzQ1VMCS8qIFhJRiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19JUEcwCTB4NjA0MFVMCS8qIEludGVyUGFja2V0R2FwMCBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSVBHMQkweDYwNDRVTAkvKiBJbnRlclBhY2tldEdhcDEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0lQRzIJMHg2MDQ4VUwJLyogSW50ZXJQYWNrZXRHYXAyIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19TVElNRQkweDYwNENVTAkvKiBTbG90VGltZSBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTUFDX01JTkZTWgkweDYwNTBVTAkvKiBNaW5GcmFtZVNpemUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX01BWEZTWgkweDYwNTRVTAkvKiBNYXhGcmFtZVNpemUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX1BBU0laRQkweDYwNThVTAkvKiBQQSBTaXplIFJlZ2lzdGVyCQkqLworI2RlZmluZSBNQUNfSkFNU0laRQkweDYwNUNVTAkvKiBKYW1TaXplIFJlZ2lzdGVyCQkqLworI2RlZmluZSBNQUNfQVRUTElNCTB4NjA2MFVMCS8qIEF0dGVtcHQgTGltaXQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX01DVFlQRQkweDYwNjRVTAkvKiBNQUMgQ29udHJvbCBUeXBlIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19BRERSMAkweDYwODBVTAkvKiBNQUMgQWRkcmVzcyAwIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19BRERSMQkweDYwODRVTAkvKiBNQUMgQWRkcmVzcyAxIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19BRERSMgkweDYwODhVTAkvKiBNQUMgQWRkcmVzcyAyIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19BRERSMwkweDYwOENVTAkvKiBNQUMgQWRkcmVzcyAzIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19BRERSNAkweDYwOTBVTAkvKiBNQUMgQWRkcmVzcyA0IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19BRERSNQkweDYwOTRVTAkvKiBNQUMgQWRkcmVzcyA1IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19BRERSNgkweDYwOThVTAkvKiBNQUMgQWRkcmVzcyA2IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19BRERSNwkweDYwOUNVTAkvKiBNQUMgQWRkcmVzcyA3IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19BRERSOAkweDYwQTBVTAkvKiBNQUMgQWRkcmVzcyA4IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19BRklMVDAJMHg2MEE0VUwJLyogQWRkcmVzcyBGaWx0ZXIgMCBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfQUZJTFQxCTB4NjBBOFVMCS8qIEFkZHJlc3MgRmlsdGVyIDEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0FGSUxUMgkweDYwQUNVTAkvKiBBZGRyZXNzIEZpbHRlciAyIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19BRjIxTVNLCTB4NjBCMFVMCS8qIEFkZHJlc3MgRmlsdGVyIDImMSBNYXNrIFJlZwkqLworI2RlZmluZSBNQUNfQUYwTVNLCTB4NjBCNFVMCS8qIEFkZHJlc3MgRmlsdGVyIDAgTWFzayBSZWcJKi8KKyNkZWZpbmUgTUFDX0hBU0gwCTB4NjBDMFVMCS8qIEhhc2ggVGFibGUgMCBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDEJMHg2MEM0VUwJLyogSGFzaCBUYWJsZSAxIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNIMgkweDYwQzhVTAkvKiBIYXNoIFRhYmxlIDIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0gzCTB4NjBDQ1VMCS8qIEhhc2ggVGFibGUgMyBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDQJMHg2MEQwVUwJLyogSGFzaCBUYWJsZSA0IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNINQkweDYwRDRVTAkvKiBIYXNoIFRhYmxlIDUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0g2CTB4NjBEOFVMCS8qIEhhc2ggVGFibGUgNiBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDcJMHg2MERDVUwJLyogSGFzaCBUYWJsZSA3IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNIOAkweDYwRTBVTAkvKiBIYXNoIFRhYmxlIDggUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0g5CTB4NjBFNFVMCS8qIEhhc2ggVGFibGUgOSBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDEwCTB4NjBFOFVMCS8qIEhhc2ggVGFibGUgMTAgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0gxMQkweDYwRUNVTAkvKiBIYXNoIFRhYmxlIDExIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNIMTIJMHg2MEYwVUwJLyogSGFzaCBUYWJsZSAxMiBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDEzCTB4NjBGNFVMCS8qIEhhc2ggVGFibGUgMTMgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0gxNAkweDYwRjhVTAkvKiBIYXNoIFRhYmxlIDE0IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNIMTUJMHg2MEZDVUwJLyogSGFzaCBUYWJsZSAxNSBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfTkNPTEwJMHg2MTAwVUwJLyogTm9ybWFsIENvbGxpc2lvbiBDb3VudGVyCSovCisjZGVmaW5lIE1BQ19GQVNVQ0MJMHg2MTA0VUwJLyogRmlyc3QgQXR0bXB0LiBTdWNjIENvbGwgQ3RyLgkqLworI2RlZmluZSBNQUNfRUNPTEwJMHg2MTA4VUwJLyogRXhjZXNzaXZlIENvbGxpc2lvbiBDb3VudGVyCSovCisjZGVmaW5lIE1BQ19MQ09MTAkweDYxMENVTAkvKiBMYXRlIENvbGxpc2lvbiBDb3VudGVyCSovCisjZGVmaW5lIE1BQ19EVElNRVIJMHg2MTEwVUwJLyogRGVmZXIgVGltZXIJCQkqLworI2RlZmluZSBNQUNfUEFUTVBTCTB4NjExNFVMCS8qIFBlYWsgQXR0ZW1wdHMgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX1JGQ1RSCTB4NjExOFVMCS8qIFJlY2VpdmUgRnJhbWUgQ291bnRlcgkqLworI2RlZmluZSBNQUNfTEVSUgkweDYxMUNVTAkvKiBMZW5ndGggRXJyb3IgQ291bnRlcgkJKi8KKyNkZWZpbmUgTUFDX0FFUlIJMHg2MTIwVUwJLyogQWxpZ25tZW50IEVycm9yIENvdW50ZXIJKi8KKyNkZWZpbmUgTUFDX0ZDU0VSUgkweDYxMjRVTAkvKiBGQ1MgRXJyb3IgQ291bnRlcgkJKi8KKyNkZWZpbmUgTUFDX1JYQ1ZFUlIJMHg2MTI4VUwJLyogUlggY29kZSBWaW9sYXRpb24gRXJyb3IgQ3RyCSovCisjZGVmaW5lIE1BQ19SQU5EU0VFRAkweDYxMzBVTAkvKiBSYW5kb20gTnVtYmVyIFNlZWQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX1NNQUNISU5FCTB4NjEzNFVMCS8qIFN0YXRlIE1hY2hpbmUgUmVnaXN0ZXIJKi8KKworLyogVFggTUFDIFNvZnR3YXJlIFJlc2V0IENvbW1hbmQuICovCisjZGVmaW5lIE1BQ19UWFJTVF9DTUQJMHgwMDAwMDAwMQkvKiBTdGFydCBzdyByZXNldCwgc2VsZi1jbGVhcnMJKi8KKworLyogUlggTUFDIFNvZnR3YXJlIFJlc2V0IENvbW1hbmQuICovCisjZGVmaW5lIE1BQ19SWFJTVF9DTUQJMHgwMDAwMDAwMQkvKiBTdGFydCBzdyByZXNldCwgc2VsZi1jbGVhcnMJKi8KKworLyogU2VuZCBQYXVzZSBDb21tYW5kLiAqLworI2RlZmluZSBNQUNfU05EUEFVU0VfVFMJMHgwMDAwZmZmZgkvKiBUaGUgcGF1c2VfdGltZSBvcGVyYW5kIHVzZWQgaW4KKwkJCQkJICogU2VuZF9QYXVzZSBhbmQgZmxvdy1jb250cm9sCisJCQkJCSAqIGhhbmRzaGFrZXMuCisJCQkJCSAqLworI2RlZmluZSBNQUNfU05EUEFVU0VfU1AJMHgwMDAxMDAwMAkvKiBTZXR0aW5nIHRoaXMgYml0IGluc3RydWN0cyB0aGUgTUFDCisJCQkJCSAqIHRvIHNlbmQgYSBQYXVzZSBGbG93IENvbnRyb2wKKwkJCQkJICogZnJhbWUgb250byB0aGUgbmV0d29yay4KKwkJCQkJICovCisKKy8qIFRYIE1BQyBTdGF0dXMgUmVnaXN0ZXIuICovCisjZGVmaW5lIE1BQ19UWFNUQVRfWE1JVAkweDAwMDAwMDAxCS8qIEZyYW1lIFRyYW5zbWl0dGVkCQkqLworI2RlZmluZSBNQUNfVFhTVEFUX1VSVU4JMHgwMDAwMDAwMgkvKiBUWCBVbmRlcnJ1bgkJCSovCisjZGVmaW5lIE1BQ19UWFNUQVRfTVBFCTB4MDAwMDAwMDQJLyogTWF4IFBhY2tldCBTaXplIEVycm9yCSovCisjZGVmaW5lIE1BQ19UWFNUQVRfTkNFCTB4MDAwMDAwMDgJLyogTm9ybWFsIENvbGxpc2lvbiBDbnRyIEV4cGlyZQkqLworI2RlZmluZSBNQUNfVFhTVEFUX0VDRQkweDAwMDAwMDEwCS8qIEV4Y2VzcyBDb2xsaXNpb24gQ250ciBFeHBpcmUJKi8KKyNkZWZpbmUgTUFDX1RYU1RBVF9MQ0UJMHgwMDAwMDAyMAkvKiBMYXRlIENvbGxpc2lvbiBDbnRyIEV4cGlyZQkqLworI2RlZmluZSBNQUNfVFhTVEFUX0ZDRQkweDAwMDAwMDQwCS8qIEZpcnN0IENvbGxpc2lvbiBDbnRyIEV4cGlyZQkqLworI2RlZmluZSBNQUNfVFhTVEFUX0RURQkweDAwMDAwMDgwCS8qIERlZmVyIFRpbWVyIEV4cGlyZQkJKi8KKyNkZWZpbmUgTUFDX1RYU1RBVF9QQ0UJMHgwMDAwMDEwMAkvKiBQZWFrIEF0dGVtcHRzIENudHIgRXhwaXJlCSovCisKKy8qIFJYIE1BQyBTdGF0dXMgUmVnaXN0ZXIuICovCisjZGVmaW5lIE1BQ19SWFNUQVRfUkNWCTB4MDAwMDAwMDEJLyogRnJhbWUgUmVjZWl2ZWQJCSovCisjZGVmaW5lIE1BQ19SWFNUQVRfT0ZMVwkweDAwMDAwMDAyCS8qIFJlY2VpdmUgT3ZlcmZsb3cJCSovCisjZGVmaW5lIE1BQ19SWFNUQVRfRkNFCTB4MDAwMDAwMDQJLyogRnJhbWUgQ250ciBFeHBpcmUJCSovCisjZGVmaW5lIE1BQ19SWFNUQVRfQUNFCTB4MDAwMDAwMDgJLyogQWxpZ24gRXJyb3IgQ250ciBFeHBpcmUJKi8KKyNkZWZpbmUgTUFDX1JYU1RBVF9DQ0UJMHgwMDAwMDAxMAkvKiBDUkMgRXJyb3IgQ250ciBFeHBpcmUJKi8KKyNkZWZpbmUgTUFDX1JYU1RBVF9MQ0UJMHgwMDAwMDAyMAkvKiBMZW5ndGggRXJyb3IgQ250ciBFeHBpcmUJKi8KKyNkZWZpbmUgTUFDX1JYU1RBVF9WQ0UJMHgwMDAwMDA0MAkvKiBDb2RlIFZpb2xhdGlvbiBDbnRyIEV4cGlyZQkqLworCisvKiBNQUMgQ29udHJvbCBTdGF0dXMgUmVnaXN0ZXIuICovCisjZGVmaW5lIE1BQ19DU1RBVF9QUkNWCTB4MDAwMDAwMDEJLyogUGF1c2UgUmVjZWl2ZWQJCSovCisjZGVmaW5lIE1BQ19DU1RBVF9QUwkweDAwMDAwMDAyCS8qIFBhdXNlZCBTdGF0ZQkJCSovCisjZGVmaW5lIE1BQ19DU1RBVF9OUFMJMHgwMDAwMDAwNAkvKiBOb3QgUGF1c2VkIFN0YXRlCQkqLworI2RlZmluZSBNQUNfQ1NUQVRfUFRSCTB4ZmZmZjAwMDAJLyogUGF1c2UgVGltZSBSZWNlaXZlZAkJKi8KKworLyogVGhlIGxheW91dCBvZiB0aGUgTUFDX3tUWCxSWCxDfU1BU0sgcmVnaXN0ZXJzIGlzIGlkZW50aWNhbCB0byB0aGF0CisgKiBvZiBNQUNfe1RYLFJYLEN9U1RBVC4gIEJpdHMgc2V0IGluIE1BQ197VFgsUlgsQ31NQVNLIHdpbGwgcHJldmVudAorICogdGhhdCBpbnRlcnJ1cHQgdHlwZSBmcm9tIGJlaW5nIHNpZ25hbGxlZCB0byBmcm9udCBlbmQgb2YgR0VNLiAgRm9yCisgKiB0aGUgaW50ZXJydXB0IHRvIGFjdHVhbGx5IGdldCBzZW50IHRvIHRoZSBjcHUsIGl0IGlzIG5lY2Vzc2FyeSB0bworICogcHJvcGVybHkgc2V0IHRoZSBhcHByb3ByaWF0ZSBHUkVHX0lNQVNLX3tUWCxSWCx9TUFDIGJpdHMgYXMgd2VsbC4KKyAqLworCisvKiBUWCBNQUMgQ29uZmlndXJhdGlvbiBSZWdpc3Rlci4KKyAqCisgKiBOT1RFOiBUaGUgVFggTUFDIEVuYWJsZSBiaXQgbXVzdCBiZSBjbGVhcmVkIGFuZCBwb2xsZWQgdW50aWwKKyAqCSB6ZXJvIGJlZm9yZSBhbnkgb3RoZXIgYml0cyBpbiB0aGlzIHJlZ2lzdGVyIGFyZSBjaGFuZ2VkLgorICoKKyAqCSBBbHNvLCBlbmFibGluZyB0aGUgQ2FycmllciBFeHRlbnNpb24gZmVhdHVyZSBvZiBHRU0gaXMKKyAqCSBhIDMgc3RlcCBwcm9jZXNzIDEpIFNldCBUWCBDYXJyaWVyIEV4dGVuc2lvbiAyKSBTZXQKKyAqCSBSWCBDYXJyaWVyIEV4dGVuc2lvbiAzKSBTZXQgU2xvdCBUaW1lIHRvIDB4MjAwLiAgVGhpcworICoJIG1vZGUgbXVzdCBiZSBlbmFibGVkIHdoZW4gaW4gaGFsZi1kdXBsZXggYXQgMUdicHMsIGVsc2UKKyAqCSBpdCBtdXN0IGJlIGRpc2FibGVkLgorICovCisjZGVmaW5lIE1BQ19UWENGR19FTkFCCTB4MDAwMDAwMDEJLyogVFggTUFDIEVuYWJsZQkJKi8KKyNkZWZpbmUgTUFDX1RYQ0ZHX0lDUwkweDAwMDAwMDAyCS8qIElnbm9yZSBDYXJyaWVyIFNlbnNlCQkqLworI2RlZmluZSBNQUNfVFhDRkdfSUNPTEwJMHgwMDAwMDAwNAkvKiBJZ25vcmUgQ29sbGlzaW9ucwkJKi8KKyNkZWZpbmUgTUFDX1RYQ0ZHX0VJUEcwCTB4MDAwMDAwMDgJLyogRW5hYmxlIElQRzAJCQkqLworI2RlZmluZSBNQUNfVFhDRkdfTkdVCTB4MDAwMDAwMTAJLyogTmV2ZXIgR2l2ZSBVcAkJKi8KKyNkZWZpbmUgTUFDX1RYQ0ZHX05HVUwJMHgwMDAwMDAyMAkvKiBOZXZlciBHaXZlIFVwIExpbWl0CQkqLworI2RlZmluZSBNQUNfVFhDRkdfTkJPCTB4MDAwMDAwNDAJLyogTm8gQmFja29mZgkJCSovCisjZGVmaW5lIE1BQ19UWENGR19TRAkweDAwMDAwMDgwCS8qIFNsb3cgRG93bgkJCSovCisjZGVmaW5lIE1BQ19UWENGR19ORkNTCTB4MDAwMDAxMDAJLyogTm8gRkNTCQkJKi8KKyNkZWZpbmUgTUFDX1RYQ0ZHX1RDRQkweDAwMDAwMjAwCS8qIFRYIENhcnJpZXIgRXh0ZW5zaW9uCQkqLworCisvKiBSWCBNQUMgQ29uZmlndXJhdGlvbiBSZWdpc3Rlci4KKyAqCisgKiBOT1RFOiBUaGUgUlggTUFDIEVuYWJsZSBiaXQgbXVzdCBiZSBjbGVhcmVkIGFuZCBwb2xsZWQgdW50aWwKKyAqCSB6ZXJvIGJlZm9yZSBhbnkgb3RoZXIgYml0cyBpbiB0aGlzIHJlZ2lzdGVyIGFyZSBjaGFuZ2VkLgorICoKKyAqCSBTaW1pbGFyIHJ1bGVzIGFwcGx5IHRvIHRoZSBIYXNoIEZpbHRlciBFbmFibGUgYml0IHdoZW4KKyAqCSBwcm9ncmFtbWluZyB0aGUgaGFzaCB0YWJsZSByZWdpc3RlcnMsIGFuZCB0aGUgQWRkcmVzcyBGaWx0ZXIKKyAqCSBFbmFibGUgYml0IHdoZW4gcHJvZ3JhbW1pbmcgdGhlIGFkZHJlc3MgZmlsdGVyIHJlZ2lzdGVycy4KKyAqLworI2RlZmluZSBNQUNfUlhDRkdfRU5BQgkweDAwMDAwMDAxCS8qIFJYIE1BQyBFbmFibGUJCSovCisjZGVmaW5lIE1BQ19SWENGR19TUEFECTB4MDAwMDAwMDIJLyogU3RyaXAgUGFkCQkJKi8KKyNkZWZpbmUgTUFDX1JYQ0ZHX1NGQ1MJMHgwMDAwMDAwNAkvKiBTdHJpcCBGQ1MJCQkqLworI2RlZmluZSBNQUNfUlhDRkdfUFJPTQkweDAwMDAwMDA4CS8qIFByb21pc2N1b3VzIE1vZGUJCSovCisjZGVmaW5lIE1BQ19SWENGR19QR1JQCTB4MDAwMDAwMTAJLyogUHJvbWlzY3VvdXMgR3JvdXAJCSovCisjZGVmaW5lIE1BQ19SWENGR19IRkUJMHgwMDAwMDAyMAkvKiBIYXNoIEZpbHRlciBFbmFibGUJCSovCisjZGVmaW5lIE1BQ19SWENGR19BRkUJMHgwMDAwMDA0MAkvKiBBZGRyZXNzIEZpbHRlciBFbmFibGUJKi8KKyNkZWZpbmUgTUFDX1JYQ0ZHX0RERQkweDAwMDAwMDgwCS8qIERpc2FibGUgRGlzY2FyZCBvbiBFcnJvcgkqLworI2RlZmluZSBNQUNfUlhDRkdfUkNFCTB4MDAwMDAxMDAJLyogUlggQ2FycmllciBFeHRlbnNpb24JCSovCisKKy8qIE1BQyBDb250cm9sIENvbmZpZyBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUFDX01DQ0ZHX1NQRQkweDAwMDAwMDAxCS8qIFNlbmQgUGF1c2UgRW5hYmxlCQkqLworI2RlZmluZSBNQUNfTUNDRkdfUlBFCTB4MDAwMDAwMDIJLyogUmVjZWl2ZSBQYXVzZSBFbmFibGUJCSovCisjZGVmaW5lIE1BQ19NQ0NGR19QTUMJMHgwMDAwMDAwNAkvKiBQYXNzIE1BQyBDb250cm9sCQkqLworCisvKiBYSUYgQ29uZmlndXJhdGlvbiBSZWdpc3Rlci4KKyAqCisgKiBOT1RFOiBXaGVuIGxlYXZpbmcgb3IgZW50ZXJpbmcgbG9vcGJhY2sgbW9kZSwgYSBnbG9iYWwgaGFyZHdhcmUKKyAqICAgICAgIGluaXQgb2YgR0VNIHNob3VsZCBiZSBwZXJmb3JtZWQuCisgKi8KKyNkZWZpbmUgTUFDX1hJRkNGR19PRQkweDAwMDAwMDAxCS8qIE1JSSBUWCBPdXRwdXQgRHJpdmVyIEVuYWJsZQkqLworI2RlZmluZSBNQUNfWElGQ0ZHX0xCQ0sJMHgwMDAwMDAwMgkvKiBMb29wYmFjayBUWCB0byBSWAkJKi8KKyNkZWZpbmUgTUFDX1hJRkNGR19ESVNFCTB4MDAwMDAwMDQJLyogRGlzYWJsZSBSWCBwYXRoIGR1cmluZyBUWAkqLworI2RlZmluZSBNQUNfWElGQ0ZHX0dNSUkJMHgwMDAwMDAwOAkvKiBVc2UgR01JSSBjbG9ja3MgKyBkYXRhcGF0aAkqLworI2RlZmluZSBNQUNfWElGQ0ZHX01CT0UJMHgwMDAwMDAxMAkvKiBDb250cm9scyBNSUlfQlVGX0VOIHBpbgkqLworI2RlZmluZSBNQUNfWElGQ0ZHX0xMRUQJMHgwMDAwMDAyMAkvKiBGb3JjZSBMSU5LTEVEIyBhY3RpdmUgKGxvdykJKi8KKyNkZWZpbmUgTUFDX1hJRkNGR19GTEVECTB4MDAwMDAwNDAJLyogRm9yY2UgRkRQTFhMRUQjIGFjdGl2ZSAobG93KQkqLworCisvKiBJbnRlclBhY2tldEdhcDAgUmVnaXN0ZXIuICBUaGlzIDgtYml0IHZhbHVlIGlzIHVzZWQgYXMgYW4gZXh0ZW5zaW9uCisgKiB0byB0aGUgSW50ZXJQYWNrZXRHYXAxIFJlZ2lzdGVyLiAgU3BlY2lmaWNhbGx5IGl0IGNvbnRyaWJ1dGVzIHRvIHRoZQorICogdGltaW5nIG9mIHRoZSBSWC10by1UWCBJUEcuICBUaGlzIHZhbHVlIGlzIGlnbm9yZWQgYW5kIHByZXN1bWVkIHRvCisgKiBiZSB6ZXJvIGZvciBUWC10by1UWCBJUEcgY2FsY3VsYXRpb25zIGFuZC9vciB3aGVuIHRoZSBFbmFibGUgSVBHMCBiaXQKKyAqIGlzIGNsZWFyZWQgaW4gdGhlIFRYIE1BQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLgorICoKKyAqIFRoaXMgdmFsdWUgaW4gdGhpcyByZWdpc3RlciBpbiB0ZXJtcyBvZiBtZWRpYSBieXRlIHRpbWUuCisgKgorICogUmVjb21tZW5kZWQgdmFsdWU6IDB4MDAKKyAqLworCisvKiBJbnRlclBhY2tldEdhcDEgUmVnaXN0ZXIuICBUaGlzIDgtYml0IHZhbHVlIGRlZmluZXMgdGhlIGZpcnN0IDIvMworICogcG9ydGlvbiBvZiB0aGUgSW50ZXIgUGFja2V0IEdhcC4KKyAqCisgKiBUaGlzIHZhbHVlIGluIHRoaXMgcmVnaXN0ZXIgaW4gdGVybXMgb2YgbWVkaWEgYnl0ZSB0aW1lLgorICoKKyAqIFJlY29tbWVuZGVkIHZhbHVlOiAweDA4CisgKi8KKworLyogSW50ZXJQYWNrZXRHYXAyIFJlZ2lzdGVyLiAgVGhpcyA4LWJpdCB2YWx1ZSBkZWZpbmVzIHRoZSBzZWNvbmQgMS8zCisgKiBwb3J0aW9uIG9mIHRoZSBJbnRlciBQYWNrZXQgR2FwLgorICoKKyAqIFRoaXMgdmFsdWUgaW4gdGhpcyByZWdpc3RlciBpbiB0ZXJtcyBvZiBtZWRpYSBieXRlIHRpbWUuCisgKgorICogUmVjb21tZW5kZWQgdmFsdWU6IDB4MDQKKyAqLworCisvKiBTbG90IFRpbWUgUmVnaXN0ZXIuICBUaGlzIDEwLWJpdCB2YWx1ZSBzcGVjaWZpZXMgdGhlIHNsb3QgdGltZQorICogcGFyYW1ldGVyIGluIHVuaXRzIG9mIG1lZGlhIGJ5dGUgdGltZS4gIEl0IGRldGVybWluZXMgdGhlIHBoeXNpY2FsCisgKiBzcGFuIG9mIHRoZSBuZXR3b3JrLgorICoKKyAqIFJlY29tbWVuZGVkIHZhbHVlOiAweDQwCisgKi8KKworLyogTWluaW11bSBGcmFtZSBTaXplIFJlZ2lzdGVyLiAgVGhpcyAxMC1iaXQgcmVnaXN0ZXIgc3BlY2lmaWVzIHRoZQorICogc21hbGxlc3Qgc2l6ZWQgZnJhbWUgdGhlIFRYTUFDIHdpbGwgc2VuZCBvbnRvIHRoZSBtZWRpdW0sIGFuZCB0aGUKKyAqIFJYTUFDIHdpbGwgcmVjZWl2ZSBmcm9tIHRoZSBtZWRpdW0uCisgKgorICogUmVjb21tZW5kZWQgdmFsdWU6IDB4NDAKKyAqLworCisvKiBNYXhpbXVtIEZyYW1lIGFuZCBCdXJzdCBTaXplIFJlZ2lzdGVyLgorICoKKyAqIFRoaXMgcmVnaXN0ZXIgc3BlY2lmaWVzIHR3byB0aGluZ3MuICBGaXJzdCBpdCBzcGVjaWZpZXMgdGhlIG1heGltdW0KKyAqIHNpemVkIGZyYW1lIHRoZSBUWE1BQyB3aWxsIHNlbmQgYW5kIHRoZSBSWE1BQyB3aWxsIHJlY29nbml6ZSBhcworICogdmFsaWQuICBTZWNvbmQsIGl0IHNwZWNpZmllcyB0aGUgbWF4aW11bSBydW4gbGVuZ3RoIG9mIGEgYnVyc3Qgb2YKKyAqIHBhY2tldHMgc2VudCBpbiBoYWxmLWR1cGxleCBnaWdhYml0IG1vZGVzLgorICoKKyAqIFJlY29tbWVuZGVkIHZhbHVlOiAweDIwMDAwNWVlCisgKi8KKyNkZWZpbmUgTUFDX01BWEZTWl9NRlMJMHgwMDAwN2ZmZgkvKiBNYXggRnJhbWUgU2l6ZQkJKi8KKyNkZWZpbmUgTUFDX01BWEZTWl9NQlMJMHg3ZmZmMDAwMAkvKiBNYXggQnVyc3QgU2l6ZQkJKi8KKworLyogUEEgU2l6ZSBSZWdpc3Rlci4gIFRoaXMgMTAtYml0IHJlZ2lzdGVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHByZWFtYmxlCisgKiBieXRlcyB3aGljaCB3aWxsIGJlIHRyYW5zbWl0dGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBmcmFtZS4gIEEKKyAqIHZhbHVlIG9mIHR3byBvciBncmVhdGVyIHNob3VsZCBiZSBwcm9ncmFtbWVkIGhlcmUuCisgKgorICogUmVjb21tZW5kZWQgdmFsdWU6IDB4MDcKKyAqLworCisvKiBKYW0gU2l6ZSBSZWdpc3Rlci4gIFRoaXMgNC1iaXQgcmVnaXN0ZXIgc3BlY2lmaWVzIHRoZSBkdXJhdGlvbiBvZgorICogdGhlIGphbSBpbiB1bml0cyBvZiBtZWRpYSBieXRlIHRpbWUuCisgKgorICogUmVjb21tZW5kZWQgdmFsdWU6IDB4MDQKKyAqLworCisvKiBBdHRlbXB0cyBMaW1pdCBSZWdpc3Rlci4gIFRoaXMgOC1iaXQgcmVnaXN0ZXIgc3BlY2lmaWVzIHRoZSBudW1iZXIKKyAqIG9mIGF0dGVtcHRzIHRoYXQgdGhlIFRYTUFDIHdpbGwgbWFrZSB0byB0cmFuc21pdCBhIGZyYW1lLCBiZWZvcmUgaXQKKyAqIHJlc2V0cyBpdHMgQXR0ZW1wdHMgQ291bnRlci4gIEFmdGVyIHJlYWNoaW5nIHRoZSBBdHRlbXB0cyBMaW1pdCB0aGUKKyAqIFRYTUFDIG1heSBvciBtYXkgbm90IGRyb3AgdGhlIGZyYW1lLCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBOR1UKKyAqIChOZXZlciBHaXZlIFVwKSBhbmQgTkdVTCAoTmV2ZXIgR2l2ZSBVcCBMaW1pdCkgYml0cyBpbiB0aGUgVFhNQUMKKyAqIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuCisgKgorICogUmVjb21tZW5kZWQgdmFsdWU6IDB4MTAKKyAqLworCisvKiBNQVggQ29udHJvbCBUeXBlIFJlZ2lzdGVyLiAgVGhpcyAxNi1iaXQgcmVnaXN0ZXIgc3BlY2lmaWVzIHRoZQorICogInR5cGUiIGZpZWxkIG9mIGEgTUFDIENvbnRyb2wgZnJhbWUuICBUaGUgVFhNQUMgdXNlcyB0aGlzIGZpZWxkIHRvCisgKiBlbmNhcHN1bGF0ZSB0aGUgTUFDIENvbnRyb2wgZnJhbWUgZm9yIHRyYW5zbWlzc2lvbiwgYW5kIHRoZSBSWE1BQworICogdXNlcyBpdCBmb3IgZGVjb2RpbmcgdmFsaWQgTUFDIENvbnRyb2wgZnJhbWVzIHJlY2VpdmVkIGZyb20gdGhlCisgKiBuZXR3b3JrLgorICoKKyAqIFJlY29tbWVuZGVkIHZhbHVlOiAweDg4MDgKKyAqLworCisvKiBNQUMgQWRkcmVzcyBSZWdpc3RlcnMuICBFYWNoIG9mIHRoZXNlIHJlZ2lzdGVycyBzcGVjaWZ5IHRoZQorICogZXRoZXJuZXQgTUFDIG9mIHRoZSBpbnRlcmZhY2UsIDE2LWJpdHMgYXQgYSB0aW1lLiAgUmVnaXN0ZXIKKyAqIDAgc3BlY2lmaWVzIGJpdHMgWzQ3OjMyXSwgcmVnaXN0ZXIgMSBiaXRzIFszMToxNl0sIGFuZCByZWdpc3RlcgorICogMiBiaXRzIFsxNTowXS4KKyAqCisgKiBSZWdpc3RlcnMgMyB0aHJvdWdoIGFuZCBpbmNsdWRpbmcgNSBzcGVjaWZ5IGFuIGFsdGVybmF0ZQorICogTUFDIGFkZHJlc3MgZm9yIHRoZSBpbnRlcmZhY2UuCisgKgorICogUmVnaXN0ZXJzIDYgdGhyb3VnaCBhbmQgaW5jbHVkaW5nIDggc3BlY2lmeSB0aGUgTUFDIENvbnRyb2wKKyAqIEFkZHJlc3MsIHdoaWNoIG11c3QgYmUgdGhlIHJlc2VydmVkIG11bHRpY2FzdCBhZGRyZXNzIGZvciBNQUMKKyAqIENvbnRyb2wgZnJhbWVzLgorICoKKyAqIEV4YW1wbGU6IFRvIHByb2dyYW0gcHJpbWFyeSBzdGF0aW9uIGFkZHJlc3MgYTpiOmM6ZDplOmYgaW50bworICoJICAgIHRoZSBjaGlwLgorICoJCU1BQ19BZGRyZXNzXzIgPSAoYSA8PCA4KSB8IGIKKyAqCQlNQUNfQWRkcmVzc18xID0gKGMgPDwgOCkgfCBkCisgKgkJTUFDX0FkZHJlc3NfMCA9IChlIDw8IDgpIHwgZgorICovCisKKy8qIEFkZHJlc3MgRmlsdGVyIFJlZ2lzdGVycy4gIFJlZ2lzdGVycyAwIHRocm91Z2ggMiBzcGVjaWZ5IGJpdAorICogZmllbGRzIFs0NzozMl0gdGhyb3VnaCBbMTU6MF0sIHJlc3BlY3RpdmVseSwgb2YgdGhlIGFkZHJlc3MKKyAqIGZpbHRlci4gIFRoZSBBZGRyZXNzIEZpbHRlciAyJjEgTWFzayBSZWdpc3RlciBkZW5vdGVzIHRoZSA4LWJpdAorICogbmliYmxlIG1hc2sgZm9yIEFkZHJlc3MgRmlsdGVyIFJlZ2lzdGVycyAyIGFuZCAxLiAgVGhlIEFkZHJlc3MKKyAqIEZpbHRlciAwIE1hc2sgUmVnaXN0ZXIgZGVub3RlcyB0aGUgMTYtYml0IG1hc2sgZm9yIHRoZSBBZGRyZXNzCisgKiBGaWx0ZXIgUmVnaXN0ZXIgMC4KKyAqLworCisvKiBIYXNoIFRhYmxlIFJlZ2lzdGVycy4gIFJlZ2lzdGVycyAwIHRocm91Z2ggMTUgc3BlY2lmeSBiaXQgZmllbGRzCisgKiBbMjU1OjI0MF0gdGhyb3VnaCBbMTU6MF0sIHJlc3BlY3RpdmVseSwgb2YgdGhlIGhhc2ggdGFibGUuCisgKi8KKworLyogU3RhdGlzdGljcyBSZWdpc3RlcnMuICBBbGwgb2YgdGhlc2UgcmVnaXN0ZXJzIGFyZSAxNi1iaXRzIGFuZAorICogdHJhY2sgb2NjdXJyZW5jZXMgb2YgYSBzcGVjaWZpYyBldmVudC4gIEdFTSBjYW4gYmUgY29uZmlndXJlZAorICogdG8gaW50ZXJydXB0IHRoZSBob3N0IGNwdSB3aGVuIGFueSBvZiB0aGVzZSBjb3VudGVycyBvdmVyZmxvdy4KKyAqIFRoZXkgc2hvdWxkIGFsbCBiZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIHRvIHplcm8gd2hlbiB0aGUgaW50ZXJmYWNlCisgKiBpcyBicm91Z2h0IHVwLgorICovCisKKy8qIFJhbmRvbSBOdW1iZXIgU2VlZCBSZWdpc3Rlci4gIFRoaXMgMTAtYml0IHZhbHVlIGlzIHVzZWQgYXMgdGhlCisgKiBSTkcgc2VlZCBpbnNpZGUgR0VNIGZvciB0aGUgQ1NNQS9DRCBiYWNrb2ZmIGFsZ29yaXRobS4gIEl0IGlzCisgKiByZWNvbW1lbmRlZCB0byBwcm9ncmFtIHRoaXMgcmVnaXN0ZXIgdG8gdGhlIDEwIExTQiBvZiB0aGUKKyAqIGludGVyZmFjZXMgTUFDIGFkZHJlc3MuCisgKi8KKworLyogUGF1c2UgVGltZXIsIHJlYWQtb25seS4gIFRoaXMgMTYtYml0IHRpbWVyIGlzIHVzZWQgdG8gdGltZSB0aGUgcGF1c2UKKyAqIGludGVydmFsIGFzIGluZGljYXRlZCBieSBhIHJlY2VpdmVkIHBhdXNlIGZsb3cgY29udHJvbCBmcmFtZS4KKyAqIEEgbm9uLXplcm8gdmFsdWUgaW4gdGhpcyB0aW1lciBpbmRpY2F0ZXMgdGhhdCB0aGUgTUFDIGlzIGN1cnJlbnRseSBpbgorICogdGhlIHBhdXNlZCBzdGF0ZS4KKyAqLworCisvKiBNSUYgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1JRl9CQkNMSwkweDYyMDBVTAkvKiBNSUYgQml0LUJhbmcgQ2xvY2sJCSovCisjZGVmaW5lIE1JRl9CQkRBVEEJMHg2MjA0VUwJLyogTUlGIEJpdC1CYW5kIERhdGEJCSovCisjZGVmaW5lIE1JRl9CQk9FTkFCCTB4NjIwOFVMCS8qIE1JRiBCaXQtQmFuZyBPdXRwdXQgRW5hYmxlCSovCisjZGVmaW5lIE1JRl9GUkFNRQkweDYyMENVTAkvKiBNSUYgRnJhbWUvT3V0cHV0IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1JRl9DRkcJCTB4NjIxMFVMCS8qIE1JRiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1JRl9NQVNLCTB4NjIxNFVMCS8qIE1JRiBNYXNrIFJlZ2lzdGVyCQkqLworI2RlZmluZSBNSUZfU1RBVFVTCTB4NjIxOFVMCS8qIE1JRiBTdGF0dXMgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1JRl9TTUFDSElORQkweDYyMUNVTAkvKiBNSUYgU3RhdGUgTWFjaGluZSBSZWdpc3RlcgkqLworCisvKiBNSUYgQml0LUJhbmcgQ2xvY2suICBUaGlzIDEtYml0IHJlZ2lzdGVyIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlCisgKiBNREMgY2xvY2sgd2F2ZWZvcm0gb24gdGhlIE1JSSBNYW5hZ2VtZW50IEludGVyZmFjZSB3aGVuIHRoZSBNSUYgaXMKKyAqIHByb2dyYW1tZWQgaW4gdGhlICJCaXQtQmFuZyIgbW9kZS4gIFdyaXRpbmcgYSAnMScgYWZ0ZXIgYSAnMCcgaW50bworICogdGhpcyByZWdpc3RlciB3aWxsIGNyZWF0ZSBhIHJpc2luZyBlZGdlIG9uIHRoZSBNREMsIHdoaWxlIHdyaXRpbmcKKyAqIGEgJzAnIGFmdGVyIGEgJzEnIHdpbGwgY3JlYXRlIGEgZmFsbGluZyBlZGdlLiAgRm9yIGV2ZXJ5IGJpdCB0aGF0CisgKiBpcyB0cmFuc2ZlcnJlZCBvbiB0aGUgbWFuYWdlbWVudCBpbnRlcmZhY2UsIGJvdGggZWRnZXMgaGF2ZSB0byBiZQorICogZ2VuZXJhdGVkLgorICovCisKKy8qIE1JRiBCaXQtQmFuZyBEYXRhLiAgVGhpcyAxLWJpdCByZWdpc3RlciBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZQorICogb3V0Z29pbmcgZGF0YSAoTURPKSBvbiB0aGUgTUlJIE1hbmFnZW1lbnQgSW50ZXJmYWNlIHdoZW4gdGhlIE1JRgorICogaXMgcHJvZ3JhbW1lZCBpbiB0aGUgIkJpdC1CYW5nIiBtb2RlLiAgVGhlIGRhYSB3aWxsIGJlIHN0ZWVyZWQgdG8gdGhlCisgKiBhcHByb3ByaWF0ZSBNRElPIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB0aGUgUEhZX1NlbGVjdCBiaXQgaW4gdGhlIE1JRgorICogQ29uZmlndXJhdGlvbiBSZWdpc3Rlci4KKyAqLworCisvKiBNSUYgQmlnLUJhbmQgT3V0cHV0IEVuYWJsZS4gIFRIaXMgMS1iaXQgcmVnaXN0ZXIgaXMgdXNlZCB0byBlbmFibGUKKyAqICgnMScpIG9yIGRpc2FibGUgKCcwJykgdGhlIEktZGlyZWN0aW9uYWwgZHJpdmVyIG9uIHRoZSBNSUkgd2hlbiB0aGUKKyAqIE1JRiBpcyBwcm9ncmFtbWVkIGluIHRoZSAiQml0LUJhbmciIG1vZGUuICBUaGUgTURJTyBzaG91bGQgYmUgZW5hYmxlZAorICogd2hlbiBkYXRhIGJpdHMgYXJlIHRyYW5zZmVycmVkIGZyb20gdGhlIE1JRiB0byB0aGUgdHJhbnNjZWl2ZXIsIGFuZCBpdAorICogc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlIGludGVyZmFjZSBpcyBpZGxlIG9yIHdoZW4gZGF0YSBiaXRzIGFyZQorICogdHJhbnNmZXJyZWQgZnJvbSB0aGUgdHJhbnNjZWl2ZXIgdG8gdGhlIE1JRiAoZGF0YSBwb3J0aW9uIG9mIGEgcmVhZAorICogaW5zdHJ1Y3Rpb24pLiAgT25seSBvbmUgTURJTyB3aWxsIGJlIGVuYWJsZWQgYXQgYSBnaXZlbiB0aW1lLCBkZXBlbmRpbmcKKyAqIG9uIHRoZSBzdGF0ZSBvZiB0aGUgUEhZX1NlbGVjdCBiaXQgaW4gdGhlIE1JRiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLgorICovCisKKy8qIE1JRiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLiAgVGhpcyAxNS1iaXQgcmVnaXN0ZXIgY29udHJvbHMgdGhlIG9wZXJhdGlvbgorICogb2YgdGhlIE1JRi4KKyAqLworI2RlZmluZSBNSUZfQ0ZHX1BTRUxFQ1QJMHgwMDAwMDAwMQkvKiBYY3ZyIHNsY3Q6IDA9bWRpbzAgMT1tZGlvMQkqLworI2RlZmluZSBNSUZfQ0ZHX1BPTEwJMHgwMDAwMDAwMgkvKiBFbmFibGUgcG9sbGluZyBtZWNoYW5pc20JKi8KKyNkZWZpbmUgTUlGX0NGR19CQk1PREUJMHgwMDAwMDAwNAkvKiAxPWJpdC1iYW5nIDA9ZnJhbWUgbW9kZQkqLworI2RlZmluZSBNSUZfQ0ZHX1BSQUREUgkweDAwMDAwMGY4CS8qIFhjdnIgcG9sbCByZWdpc3RlciBhZGRyZXNzCSovCisjZGVmaW5lIE1JRl9DRkdfTURJMAkweDAwMDAwMTAwCS8qIE1ESU9fMCBwcmVzZW50IG9yIHJlYWQtYml0CSovCisjZGVmaW5lIE1JRl9DRkdfTURJMQkweDAwMDAwMjAwCS8qIE1ESU9fMSBwcmVzZW50IG9yIHJlYWQtYml0CSovCisjZGVmaW5lIE1JRl9DRkdfUFBBRERSCTB4MDAwMDdjMDAJLyogWGN2ciBwb2xsIFBIWSBhZGRyZXNzCSovCisKKy8qIE1JRiBGcmFtZS9PdXRwdXQgUmVnaXN0ZXIuICBUaGlzIDMyLWJpdCByZWdpc3RlciBhbGxvd3MgdGhlIGhvc3QgdG8KKyAqIGNvbW11bmljYXRlIHdpdGggYSB0cmFuc2NlaXZlciBpbiBmcmFtZSBtb2RlIChhcyBvcHBvc2VkIHRvIGJpZy1iYW5nCisgKiBtb2RlKS4gIFdyaXRlcyBieSB0aGUgaG9zdCBzcGVjaWZ5IGFuIGluc3RydXRpb24uICBBZnRlciBiZWluZyBpc3N1ZWQKKyAqIHRoZSBob3N0IG11c3QgcG9sbCB0aGlzIHJlZ2lzdGVyIGZvciBjb21wbGV0aW9uLiAgQWxzbywgYWZ0ZXIKKyAqIGNvbXBsZXRpb24gdGhpcyByZWdpc3RlciBob2xkcyB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgdHJhbnNjZWl2ZXIKKyAqIGlmIGFwcGxpY2FibGUuCisgKi8KKyNkZWZpbmUgTUlGX0ZSQU1FX1NUCTB4YzAwMDAwMDAJLyogU1RhcnQgb2YgZnJhbWUJCSovCisjZGVmaW5lIE1JRl9GUkFNRV9PUAkweDMwMDAwMDAwCS8qIE9QY29kZQkJCSovCisjZGVmaW5lIE1JRl9GUkFNRV9QSFlBRAkweDBmODAwMDAwCS8qIFBIWSBBRGRyZXNzCQkJKi8KKyNkZWZpbmUgTUlGX0ZSQU1FX1JFR0FECTB4MDA3YzAwMDAJLyogUkVHaXN0ZXIgQURkcmVzcwkJKi8KKyNkZWZpbmUgTUlGX0ZSQU1FX1RBTVNCCTB4MDAwMjAwMDAJLyogVHVybiBBcm91bmQgTVNCCQkqLworI2RlZmluZSBNSUZfRlJBTUVfVEFMU0IJMHgwMDAxMDAwMAkvKiBUdXJuIEFyb3VuZCBMU0IJCSovCisjZGVmaW5lIE1JRl9GUkFNRV9EQVRBCTB4MDAwMGZmZmYJLyogSW5zdHJ1Y3Rpb24gUGF5bG9hZAkJKi8KKworLyogTUlGIFN0YXR1cyBSZWdpc3Rlci4gIFRoaXMgcmVnaXN0ZXIgcmVwb3J0cyBzdGF0dXMgd2hlbiB0aGUgTUlGIGlzCisgKiBvcGVyYXRpbmcgaW4gdGhlIHBvbGwgbW9kZS4gIFRoZSBwb2xsIHN0YXR1cyBmaWVsZCBpcyBhdXRvLWNsZWFyaW5nCisgKiBvbiByZWFkLgorICovCisjZGVmaW5lIE1JRl9TVEFUVVNfREFUQQkweGZmZmYwMDAwCS8qIExpdmUgaW1hZ2Ugb2YgWENWUiByZWcJKi8KKyNkZWZpbmUgTUlGX1NUQVRVU19TVEFUCTB4MDAwMGZmZmYJLyogV2hpY2ggYml0cyBoYXZlIGNoYW5nZWQJKi8KKworLyogTUlGIE1hc2sgUmVnaXN0ZXIuICBUaGlzIDE2LWJpdCByZWdpc3RlciBpcyB1c2VkIHdoZW4gaW4gcG9sbCBtb2RlCisgKiB0byBzYXkgd2hpY2ggYml0cyBvZiB0aGUgcG9sbGVkIHJlZ2lzdGVyIHdpbGwgY2F1c2UgYW4gaW50ZXJydXB0CisgKiB3aGVuIGNoYW5nZWQuCisgKi8KKworLyogUENTL1NlcmlhbGluayBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENTX01JSUNUUkwJMHg5MDAwVUwJLyogUENTIE1JSSBDb250cm9sIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBDU19NSUlTVEFUCTB4OTAwNFVMCS8qIFBDUyBNSUkgU3RhdHVzIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBDU19NSUlBRFYJMHg5MDA4VUwJLyogUENTIE1JSSBBZHZlcnRpc2VtZW50IFJlZwkqLworI2RlZmluZSBQQ1NfTUlJTFAJMHg5MDBDVUwJLyogUENTIE1JSSBMaW5rIFBhcnRuZXIgQWJpbGl0eQkqLworI2RlZmluZSBQQ1NfQ0ZHCQkweDkwMTBVTAkvKiBQQ1MgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkqLworI2RlZmluZSBQQ1NfU01BQ0hJTkUJMHg5MDE0VUwJLyogUENTIFN0YXRlIE1hY2hpbmUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUENTX0lTVEFUCTB4OTAxOFVMCS8qIFBDUyBJbnRlcnJ1cHQgU3RhdHVzIFJlZwkqLworI2RlZmluZSBQQ1NfRE1PREUJMHg5MDUwVUwJLyogRGF0YXBhdGggTW9kZSBSZWdpc3RlcgkqLworI2RlZmluZSBQQ1NfU0NUUkwJMHg5MDU0VUwJLyogU2VyaWFsaW5rIENvbnRyb2wgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUENTX1NPUwkJMHg5MDU4VUwJLyogU2hhcmVkIE91dHB1dCBTZWxlY3QgUmVnCSovCisjZGVmaW5lIFBDU19TU1RBVEUJMHg5MDVDVUwJLyogU2VyaWFsaW5rIFN0YXRlIFJlZ2lzdGVyCSovCisKKy8qIFBDRCBNSUkgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgUENTX01JSUNUUkxfU1BECTB4MDAwMDAwNDAJLyogUmVhZCBhcyBvbmUsIHdyaXRlcyBpZ25vcmVkCSovCisjZGVmaW5lIFBDU19NSUlDVFJMX0NUCTB4MDAwMDAwODAJLyogRm9yY2UgQ09MIHNpZ25hbCBhY3RpdmUJKi8KKyNkZWZpbmUgUENTX01JSUNUUkxfRE0JMHgwMDAwMDEwMAkvKiBEdXBsZXggbW9kZSwgZm9yY2VkIGxvdwkqLworI2RlZmluZSBQQ1NfTUlJQ1RSTF9SQU4JMHgwMDAwMDIwMAkvKiBSZXN0YXJ0IGF1dG8tbmVnLCBzZWxmIGNsZWFyCSovCisjZGVmaW5lIFBDU19NSUlDVFJMX0lTTwkweDAwMDAwNDAwCS8qIFJlYWQgYXMgemVybywgd3JpdGVzIGlnbm9yZWQJKi8KKyNkZWZpbmUgUENTX01JSUNUUkxfUEQJMHgwMDAwMDgwMAkvKiBSZWFkIGFzIHplcm8sIHdyaXRlcyBpZ25vcmVkCSovCisjZGVmaW5lIFBDU19NSUlDVFJMX0FORQkweDAwMDAxMDAwCS8qIEF1dG8tbmVnIGVuYWJsZQkJKi8KKyNkZWZpbmUgUENTX01JSUNUUkxfU1MJMHgwMDAwMjAwMAkvKiBSZWFkIGFzIHplcm8sIHdyaXRlcyBpZ25vcmVkCSovCisjZGVmaW5lIFBDU19NSUlDVFJMX1dCCTB4MDAwMDQwMDAJLyogV3JhcGJhY2ssIGxvb3BiYWNrIGF0IDEwLWJpdAorCQkJCQkgKiBpbnB1dCBzaWRlIG9mIFNlcmlhbGluaworCQkJCQkgKi8KKyNkZWZpbmUgUENTX01JSUNUUkxfUlNUCTB4MDAwMDgwMDAJLyogUmVzZXRzIFBDUywgc2VsZiBjbGVhcmluZwkqLworCisvKiBQQ1MgTUlJIFN0YXR1cyBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgUENTX01JSVNUQVRfRUMJMHgwMDAwMDAwMQkvKiBFeHQgQ2FwYWJpbGl0eTogUmVhZCBhcyB6ZXJvCSovCisjZGVmaW5lIFBDU19NSUlTVEFUX0pECTB4MDAwMDAwMDIJLyogSmFiYmVyIERldGVjdDogUmVhZCBhcyB6ZXJvCSovCisjZGVmaW5lIFBDU19NSUlTVEFUX0xTCTB4MDAwMDAwMDQJLyogTGluayBTdGF0dXM6IDE9dXAgMD1kb3duCSovCisjZGVmaW5lIFBDU19NSUlTVEFUX0FOQQkweDAwMDAwMDA4CS8qIEF1dG8tbmVnIEFiaWxpdHksIGFsd2F5cyAxCSovCisjZGVmaW5lIFBDU19NSUlTVEFUX1JGCTB4MDAwMDAwMTAJLyogUmVtb3RlIEZhdWx0CQkJKi8KKyNkZWZpbmUgUENTX01JSVNUQVRfQU5DCTB4MDAwMDAwMjAJLyogQXV0by1uZWcgY29tcGxldGUJCSovCisjZGVmaW5lIFBDU19NSUlTVEFUX0VTCTB4MDAwMDAxMDAJLyogRXh0ZW5kZWQgU3RhdHVzLCBhbHdheXMgMQkqLworCisvKiBQQ1MgTUlJIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIuICovCisjZGVmaW5lIFBDU19NSUlBRFZfRkQJMHgwMDAwMDAyMAkvKiBBZHZlcnRpc2UgRnVsbCBEdXBsZXgJKi8KKyNkZWZpbmUgUENTX01JSUFEVl9IRAkweDAwMDAwMDQwCS8qIEFkdmVydGlzZSBIYWxmIER1cGxleAkqLworI2RlZmluZSBQQ1NfTUlJQURWX1NQCTB4MDAwMDAwODAJLyogQWR2ZXJ0aXNlIFN5bW1ldHJpYyBQYXVzZQkqLworI2RlZmluZSBQQ1NfTUlJQURWX0FQCTB4MDAwMDAxMDAJLyogQWR2ZXJ0aXNlIEFzeW1tZXRyaWMgUGF1c2UJKi8KKyNkZWZpbmUgUENTX01JSUFEVl9SRgkweDAwMDAzMDAwCS8qIFJlbW90ZSBGYXVsdAkJCSovCisjZGVmaW5lIFBDU19NSUlBRFZfQUNLCTB4MDAwMDQwMDAJLyogUmVhZC1vbmx5CQkJKi8KKyNkZWZpbmUgUENTX01JSUFEVl9OUAkweDAwMDA4MDAwCS8qIE5leHQtcGFnZSwgZm9yY2VkIGxvdwkqLworCisvKiBQQ1MgTUlJIExpbmsgUGFydG5lciBBYmlsaXR5IFJlZ2lzdGVyLiAgIFRoaXMgcmVnaXN0ZXIgaXMgZXF1aXZhbGVudAorICogdG8gdGhlIExpbmsgUGFydG5ldCBBYmlsaXR5IFJlZ2lzdGVyIG9mIHRoZSBzdGFuZGFyZCBNSUkgcmVnaXN0ZXIgc2V0LgorICogSXQncyBsYXlvdXQgY29ycmVzcG9uZHMgdG8gdGhlIFBDUyBNSUkgQWR2ZXJ0aXNlbWVudCBSZWdpc3Rlci4KKyAqLworCisvKiBQQ1MgQ29uZmlndXJhdGlvbiBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgUENTX0NGR19FTkFCTEUJMHgwMDAwMDAwMQkvKiBNdXN0IGJlIHplcm8gd2hpbGUgY2hhbmdpbmcKKwkJCQkJICogUENTIE1JSSBhZHZlcnRpc2VtZW50IHJlZy4KKwkJCQkJICovCisjZGVmaW5lIFBDU19DRkdfU0RPCTB4MDAwMDAwMDIJLyogU2lnbmFsIGRldGVjdCBvdmVycmlkZQkqLworI2RlZmluZSBQQ1NfQ0ZHX1NETAkweDAwMDAwMDA0CS8qIFNpZ25hbCBkZXRlY3QgYWN0aXZlIGxvdwkqLworI2RlZmluZSBQQ1NfQ0ZHX0pTCTB4MDAwMDAwMTgJLyogSml0dGVyLXN0dWR5OgorCQkJCQkgKiAwID0gbm9ybWFsIG9wZXJhdGlvbgorCQkJCQkgKiAxID0gaGlnaC1mcmVxdWVuY3kgdGVzdCBwYXR0ZXJuCisJCQkJCSAqIDIgPSBsb3ctZnJlcXVlbmN5IHRlc3QgcGF0dGVybgorCQkJCQkgKiAzID0gcmVzZXJ2ZWQKKwkJCQkJICovCisjZGVmaW5lIFBDU19DRkdfVE8JMHgwMDAwMDAyMAkvKiAxMG1zIGF1dG8tbmVnIHRpbWVyIG92ZXJyaWRlCSovCisKKy8qIFBDUyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyLiAgVGhpcyByZWdpc3RlciBpcyBzZWxmLWNsZWFyaW5nCisgKiB3aGVuIHJlYWQuCisgKi8KKyNkZWZpbmUgUENTX0lTVEFUX0xTQwkweDAwMDAwMDA0CS8qIExpbmsgU3RhdHVzIENoYW5nZQkJKi8KKworLyogRGF0YXBhdGggTW9kZSBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgUENTX0RNT0RFX1NNCTB4MDAwMDAwMDEJLyogMSA9IHVzZSBpbnRlcm5hbCBTZXJpYWxpbmsJKi8KKyNkZWZpbmUgUENTX0RNT0RFX0VTTQkweDAwMDAwMDAyCS8qIEV4dGVybmFsIFNFUkRFUyBtb2RlCQkqLworI2RlZmluZSBQQ1NfRE1PREVfTUdNCTB4MDAwMDAwMDQJLyogTUlJL0dNSUkgbW9kZQkJKi8KKyNkZWZpbmUgUENTX0RNT0RFX0dNT0UJMHgwMDAwMDAwOAkvKiBHTUlJIE91dHB1dCBFbmFibGUJCSovCisKKy8qIFNlcmlhbGluayBDb250cm9sIFJlZ2lzdGVyLgorICoKKyAqIE5PVEU6IFdoZW4gaW4gU0VSREVTIG1vZGUsIHRoZSBsb29wYmFjayBiaXQgaGFzIGludmVyc2UgbG9naWMuCisgKi8KKyNkZWZpbmUgUENTX1NDVFJMX0xPT1AJMHgwMDAwMDAwMQkvKiBMb29wYmFjayBlbmFibGUJCSovCisjZGVmaW5lIFBDU19TQ1RSTF9FU0NECTB4MDAwMDAwMDIJLyogRW5hYmxlIHN5bmMgY2hhciBkZXRlY3Rpb24JKi8KKyNkZWZpbmUgUENTX1NDVFJMX0xPQ0sJMHgwMDAwMDAwNAkvKiBMb2NrIHRvIHJlZmVyZW5jZSBjbG9jawkqLworI2RlZmluZSBQQ1NfU0NUUkxfRU1QCTB4MDAwMDAwMTgJLyogT3V0cHV0IGRyaXZlciBlbXBoYXNpcwkqLworI2RlZmluZSBQQ1NfU0NUUkxfU1RFU1QJMHgwMDAwMDFjMAkvKiBTZWxmIHRlc3QgcGF0dGVybnMJCSovCisjZGVmaW5lIFBDU19TQ1RSTF9QRFdOCTB4MDAwMDAyMDAJLyogU29mdHdhcmUgcG93ZXItZG93bgkJKi8KKyNkZWZpbmUgUENTX1NDVFJMX1JYWgkweDAwMDAwYzAwCS8qIFBMTCBpbnB1dCB0byBTZXJpYWxpbmsJKi8KKyNkZWZpbmUgUENTX1NDVFJMX1JYUAkweDAwMDAzMDAwCS8qIFBMTCBpbnB1dCB0byBTZXJpYWxpbmsJKi8KKyNkZWZpbmUgUENTX1NDVFJMX1RYWgkweDAwMDBjMDAwCS8qIFBMTCBpbnB1dCB0byBTZXJpYWxpbmsJKi8KKyNkZWZpbmUgUENTX1NDVFJMX1RYUAkweDAwMDMwMDAwCS8qIFBMTCBpbnB1dCB0byBTZXJpYWxpbmsJKi8KKworLyogU2hhcmVkIE91dHB1dCBTZWxlY3QgUmVnaXN0ZXIuICBGb3IgdGVzdCBhbmQgZGVidWcsIGFsbG93cyBtdWx0aXBsZXhpbmcKKyAqIHRlc3Qgb3V0cHV0cyBpbnRvIHRoZSBQUk9NIGFkZHJlc3MgcGlucy4gIFNldCB0byB6ZXJvIGZvciBub3JtYWwKKyAqIG9wZXJhdGlvbi4KKyAqLworI2RlZmluZSBQQ1NfU09TX1BBRERSCTB4MDAwMDAwMDMJLyogUFJPTSBBZGRyZXNzCQkJKi8KKworLyogUFJPTSBJbWFnZSBTcGFjZSAqLworI2RlZmluZSBQUk9NX1NUQVJUCTB4MTAwMDAwVUwJLyogRXhwYW5zaW9uIFJPTSBydW4gdGltZSBhY2Nlc3MqLworI2RlZmluZSBQUk9NX1NJWkUJMHgwZmZmZmZVTAkvKiBTaXplIG9mIFJPTQkJCSovCisjZGVmaW5lIFBST01fRU5ECTB4MjAwMDAwVUwJLyogRW5kIG9mIFJPTQkJCSovCisKKy8qIE1JSSBkZWZpbml0aW9ucyBtaXNzaW5nIGZyb20gbWlpLmggKi8KKworI2RlZmluZSBCTUNSX1NQRDIJMHgwMDQwCQkvKiBHaWdhYml0IGVuYWJsZT8gKGJjbTU0MTEpCSovCisjZGVmaW5lIExQQV9QQVVTRQkweDA0MDAKKworLyogTW9yZSBQSFkgcmVnaXN0ZXJzIChzcGVjaWZpYyB0byBCcm9hZGNvbSBtb2RlbHMpICovCisKKy8qIE1JSSBCQ001MjAxIE1VTFRJUEhZIGludGVycnVwdCByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQkNNNTIwMV9JTlRFUlJVUFQJCQkweDFBCisjZGVmaW5lIE1JSV9CQ001MjAxX0lOVEVSUlVQVF9JTlRFTkFCTEUJCTB4NDAwMAorCisjZGVmaW5lIE1JSV9CQ001MjAxX0FVWE1PREUyCQkJMHgxQgorI2RlZmluZSBNSUlfQkNNNTIwMV9BVVhNT0RFMl9MT1dQT1dFUgkJMHgwMDA4CisKKyNkZWZpbmUgTUlJX0JDTTUyMDFfTVVMVElQSFkgICAgICAgICAgICAgICAgICAgIDB4MUUKKworLyogTUlJIEJDTTUyMDEgTVVMVElQSFkgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBNSUlfQkNNNTIwMV9NVUxUSVBIWV9TRVJJQUxNT0RFICAgICAgICAgMHgwMDAyCisjZGVmaW5lIE1JSV9CQ001MjAxX01VTFRJUEhZX1NVUEVSSVNPTEFURSAgICAgICAweDAwMDgKKworLyogTUlJIEJDTTU0MDAgMTAwMC1CQVNFVCBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CQ001NDAwX0dCX0NPTlRST0wJCQkweDA5CisjZGVmaW5lIE1JSV9CQ001NDAwX0dCX0NPTlRST0xfRlVMTERVUExFWENBUAkweDAyMDAKKworLyogTUlJIEJDTTU0MDAgQVVYQ09OVFJPTCByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQkNNNTQwMF9BVVhDT05UUk9MICAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBNSUlfQkNNNTQwMF9BVVhDT05UUk9MX1BXUjEwQkFTRVQgICAgICAgMHgwMDA0CisKKy8qIE1JSSBCQ001NDAwIEFVWFNUQVRVUyByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQkNNNTQwMF9BVVhTVEFUVVMgICAgICAgICAgICAgICAgICAgMHgxOQorI2RlZmluZSBNSUlfQkNNNTQwMF9BVVhTVEFUVVNfTElOS01PREVfTUFTSyAgICAgMHgwNzAwCisjZGVmaW5lIE1JSV9CQ001NDAwX0FVWFNUQVRVU19MSU5LTU9ERV9TSElGVCAgICA4ICAKKworLyogV2hlbiBpdCBjYW4sIEdFTSBpbnRlcm5hbGx5IGNhY2hlcyA0IGFsaWduZWQgVFggZGVzY3JpcHRvcnMKKyAqIGF0IGEgdGltZSwgc28gdGhhdCBpdCBjYW4gdXNlIGZ1bGwgY2FjaGVsaW5lIERNQSByZWFkcy4KKyAqCisgKiBOb3RlIHRoYXQgdW5saWtlIEhNRSwgdGhlcmUgaXMgbm8gb3duZXJzaGlwIGJpdCBpbiB0aGUgZGVzY3JpcHRvcgorICogY29udHJvbCB3b3JkLiAgVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBpcyBvYnRhaW5lZCB2aWEgdGhlIFRYLUtpY2sKKyAqIGFuZCBUWC1Db21wbGV0ZSByZWdpc3RlcnMuICBBcyBhIHJlc3VsdCwgR0VNIG5lZWQgbm90IHdyaXRlIGJhY2sKKyAqIHVwZGF0ZWQgdmFsdWVzIHRvIHRoZSBUWCBkZXNjcmlwdG9yIHJpbmcsIGl0IG9ubHkgcGVyZm9ybXMgcmVhZHMuCisgKgorICogU2luY2UgVFggZGVzY3JpcHRvcnMgYXJlIG5ldmVyIG1vZGlmaWVkIGJ5IEdFTSwgdGhlIGRyaXZlciBjYW4KKyAqIHVzZSB0aGUgYnVmZmVyIERNQSBhZGRyZXNzIGFzIGEgcGxhY2UgdG8ga2VlcCB0cmFjayBvZiBhbGxvY2F0ZWQKKyAqIERNQSBtYXBwaW5ncyBmb3IgYSB0cmFuc21pdHRlZCBwYWNrZXQuCisgKi8KK3N0cnVjdCBnZW1fdHhkIHsKKwl1NjQJY29udHJvbF93b3JkOworCXU2NAlidWZmZXI7Cit9OworCisjZGVmaW5lIFRYRENUUkxfQlVGU1oJMHgwMDAwMDAwMDAwMDA3ZmZmVUxMCS8qIEJ1ZmZlciBTaXplCQkqLworI2RlZmluZSBUWERDVFJMX0NTVEFSVAkweDAwMDAwMDAwMDAxZjgwMDBVTEwJLyogQ1NVTSBTdGFydCBPZmZzZXQJKi8KKyNkZWZpbmUgVFhEQ1RSTF9DT0ZGCTB4MDAwMDAwMDAxZmUwMDAwMFVMTAkvKiBDU1VNIFN0dWZmIE9mZnNldAkqLworI2RlZmluZSBUWERDVFJMX0NFTkFCCTB4MDAwMDAwMDAyMDAwMDAwMFVMTAkvKiBDU1VNIEVuYWJsZQkJKi8KKyNkZWZpbmUgVFhEQ1RSTF9FT0YJMHgwMDAwMDAwMDQwMDAwMDAwVUxMCS8qIEVuZCBvZiBGcmFtZQkJKi8KKyNkZWZpbmUgVFhEQ1RSTF9TT0YJMHgwMDAwMDAwMDgwMDAwMDAwVUxMCS8qIFN0YXJ0IG9mIEZyYW1lCSovCisjZGVmaW5lIFRYRENUUkxfSU5UTUUJMHgwMDAwMDAwMTAwMDAwMDAwVUxMCS8qICJJbnRlcnJ1cHQgTWUiCSovCisjZGVmaW5lIFRYRENUUkxfTk9DUkMJMHgwMDAwMDAwMjAwMDAwMDAwVUxMCS8qIE5vIENSQyBQcmVzZW50CSovCisKKy8qIEdFTSByZXF1aXJlcyB0aGF0IFJYIGRlc2NyaXB0b3JzIGFyZSBwcm92aWRlZCBmb3VyIGF0IGEgdGltZSwKKyAqIGFsaWduZWQuICBBbHNvLCB0aGUgUlggcmluZyBtYXkgbm90IHdyYXAgYXJvdW5kLiAgVGhpcyBtZWFucyB0aGF0CisgKiB0aGVyZSB3aWxsIGJlIGF0IGxlYXN0IDQgdW51c2VkIGRlc2NpcHRvciBlbnRyaWVzIGluIHRoZSBtaWRkbGUKKyAqIG9mIHRoZSBSWCByaW5nIGF0IGFsbCB0aW1lcy4KKyAqCisgKiBTaW1pbGFyIHRvIEhNRSwgR0VNIGFzc3VtZXMgdGhhdCBpdCBjYW4gd3JpdGUgZ2FyYmFnZSBieXRlcyBiZWZvcmUKKyAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBhbmQgcmlnaHQgYWZ0ZXIgdGhlIGVuZCBpbiBvcmRlciB0byBETUEKKyAqIHdob2xlIGNhY2hlbGluZXMuCisgKgorICogVW5saWtlIGZvciBUWCwgR0VNIGRvZXMgdXBkYXRlIHRoZSBzdGF0dXMgd29yZCBpbiB0aGUgUlggZGVzY3JpcHRvcnMKKyAqIHdoZW4gcGFja2V0cyBhcnJpdmUuICBUaGVyZWZvcmUgYW4gb3duZXJzaGlwIGJpdCBkb2VzIGV4aXN0IGluIHRoZQorICogUlggZGVzY3JpcHRvcnMuICBJdCBpcyBhZHZpc29yeSwgR0VNIGNsZWFycyBpdCBidXQgZG9lcyBub3QgY2hlY2sKKyAqIGl0IGluIGFueSB3YXkuICBTbyB3aGVuIGJ1ZmZlcnMgYXJlIHBvc3RlZCB0byB0aGUgUlggcmluZyAodmlhIHRoZQorICogUlggS2ljayByZWdpc3RlcikgYnkgdGhlIGRyaXZlciBpdCBtdXN0IG1ha2Ugc3VyZSB0aGUgYnVmZmVycyBhcmUKKyAqIHRydWx5IHJlYWR5IGFuZCB0aGF0IHRoZSBvd25lcnNoaXAgYml0cyBhcmUgc2V0IHByb3Blcmx5LgorICoKKyAqIEV2ZW4gdGhvdWdoIEdFTSBtb2RpZmllcyB0aGUgUlggZGVzY3JpcHRvcnMsIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUKKyAqIGJ1ZmZlciBETUEgYWRkcmVzcyBmaWVsZCB3aWxsIHN0YXkgdGhlIHNhbWUgd2hlbiBpdCBwZXJmb3JtcyB0aGVzZQorICogdXBkYXRlcy4gIFRoZXJlZm9yZSBpdCBjYW4gYmUgdXNlZCB0byBrZWVwIHRyYWNrIG9mIERNQSBtYXBwaW5ncworICogYnkgdGhlIGhvc3QgZHJpdmVyIGp1c3QgYXMgaW4gdGhlIFRYIGRlc2NyaXB0b3IgY2FzZSBhYm92ZS4KKyAqLworc3RydWN0IGdlbV9yeGQgeworCXU2NAlzdGF0dXNfd29yZDsKKwl1NjQJYnVmZmVyOworfTsKKworI2RlZmluZSBSWERDVFJMX1RDUENTVU0JMHgwMDAwMDAwMDAwMDBmZmZmVUxMCS8qIFRDUCBQc2V1ZG8tQ1NVTQkqLworI2RlZmluZSBSWERDVFJMX0JVRlNaCTB4MDAwMDAwMDA3ZmZmMDAwMFVMTAkvKiBCdWZmZXIgU2l6ZQkJKi8KKyNkZWZpbmUgUlhEQ1RSTF9PV04JMHgwMDAwMDAwMDgwMDAwMDAwVUxMCS8qIEdFTSBvd25zIHRoaXMgZW50cnkJKi8KKyNkZWZpbmUgUlhEQ1RSTF9IQVNIVkFMCTB4MGZmZmYwMDAwMDAwMDAwMFVMTAkvKiBIYXNoIFZhbHVlCQkqLworI2RlZmluZSBSWERDVFJMX0hQQVNTCTB4MTAwMDAwMDAwMDAwMDAwMFVMTAkvKiBQYXNzZWQgSGFzaCBGaWx0ZXIJKi8KKyNkZWZpbmUgUlhEQ1RSTF9BTFRNQUMJMHgyMDAwMDAwMDAwMDAwMDAwVUxMCS8qIE1hdGNoZWQgQUxUIE1BQwkqLworI2RlZmluZSBSWERDVFJMX0JBRAkweDQwMDAwMDAwMDAwMDAwMDBVTEwJLyogRnJhbWUgaGFzIGJhZCBDUkMJKi8KKworI2RlZmluZSBSWERDVFJMX0ZSRVNIKGdwKQlcCisJKCgoKFJYX0JVRl9BTExPQ19TSVpFKGdwKSAtIFJYX09GRlNFVCkgPDwgMTYpICYgUlhEQ1RSTF9CVUZTWikgfCBcCisJIFJYRENUUkxfT1dOKQorCisjZGVmaW5lIFRYX1JJTkdfU0laRSAxMjgKKyNkZWZpbmUgUlhfUklOR19TSVpFIDEyOAorCisjaWYgVFhfUklOR19TSVpFID09IDMyCisjZGVmaW5lIFRYRE1BX0NGR19CQVNFCVRYRE1BX0NGR19SSU5HU1pfMzIKKyNlbGlmIFRYX1JJTkdfU0laRSA9PSA2NAorI2RlZmluZSBUWERNQV9DRkdfQkFTRQlUWERNQV9DRkdfUklOR1NaXzY0CisjZWxpZiBUWF9SSU5HX1NJWkUgPT0gMTI4CisjZGVmaW5lIFRYRE1BX0NGR19CQVNFCVRYRE1BX0NGR19SSU5HU1pfMTI4CisjZWxpZiBUWF9SSU5HX1NJWkUgPT0gMjU2CisjZGVmaW5lIFRYRE1BX0NGR19CQVNFCVRYRE1BX0NGR19SSU5HU1pfMjU2CisjZWxpZiBUWF9SSU5HX1NJWkUgPT0gNTEyCisjZGVmaW5lIFRYRE1BX0NGR19CQVNFCVRYRE1BX0NGR19SSU5HU1pfNTEyCisjZWxpZiBUWF9SSU5HX1NJWkUgPT0gMTAyNAorI2RlZmluZSBUWERNQV9DRkdfQkFTRQlUWERNQV9DRkdfUklOR1NaXzFLCisjZWxpZiBUWF9SSU5HX1NJWkUgPT0gMjA0OAorI2RlZmluZSBUWERNQV9DRkdfQkFTRQlUWERNQV9DRkdfUklOR1NaXzJLCisjZWxpZiBUWF9SSU5HX1NJWkUgPT0gNDA5NgorI2RlZmluZSBUWERNQV9DRkdfQkFTRQlUWERNQV9DRkdfUklOR1NaXzRLCisjZWxpZiBUWF9SSU5HX1NJWkUgPT0gODE5MgorI2RlZmluZSBUWERNQV9DRkdfQkFTRQlUWERNQV9DRkdfUklOR1NaXzhLCisjZWxzZQorI2Vycm9yIFRYX1JJTkdfU0laRSB2YWx1ZSBpcyBpbGxlZ2FsLi4uCisjZW5kaWYKKworI2lmIFJYX1JJTkdfU0laRSA9PSAzMgorI2RlZmluZSBSWERNQV9DRkdfQkFTRQlSWERNQV9DRkdfUklOR1NaXzMyCisjZWxpZiBSWF9SSU5HX1NJWkUgPT0gNjQKKyNkZWZpbmUgUlhETUFfQ0ZHX0JBU0UJUlhETUFfQ0ZHX1JJTkdTWl82NAorI2VsaWYgUlhfUklOR19TSVpFID09IDEyOAorI2RlZmluZSBSWERNQV9DRkdfQkFTRQlSWERNQV9DRkdfUklOR1NaXzEyOAorI2VsaWYgUlhfUklOR19TSVpFID09IDI1NgorI2RlZmluZSBSWERNQV9DRkdfQkFTRQlSWERNQV9DRkdfUklOR1NaXzI1NgorI2VsaWYgUlhfUklOR19TSVpFID09IDUxMgorI2RlZmluZSBSWERNQV9DRkdfQkFTRQlSWERNQV9DRkdfUklOR1NaXzUxMgorI2VsaWYgUlhfUklOR19TSVpFID09IDEwMjQKKyNkZWZpbmUgUlhETUFfQ0ZHX0JBU0UJUlhETUFfQ0ZHX1JJTkdTWl8xSworI2VsaWYgUlhfUklOR19TSVpFID09IDIwNDgKKyNkZWZpbmUgUlhETUFfQ0ZHX0JBU0UJUlhETUFfQ0ZHX1JJTkdTWl8ySworI2VsaWYgUlhfUklOR19TSVpFID09IDQwOTYKKyNkZWZpbmUgUlhETUFfQ0ZHX0JBU0UJUlhETUFfQ0ZHX1JJTkdTWl80SworI2VsaWYgUlhfUklOR19TSVpFID09IDgxOTIKKyNkZWZpbmUgUlhETUFfQ0ZHX0JBU0UJUlhETUFfQ0ZHX1JJTkdTWl84SworI2Vsc2UKKyNlcnJvciBSWF9SSU5HX1NJWkUgaXMgaWxsZWdhbC4uLgorI2VuZGlmCisKKyNkZWZpbmUgTkVYVF9UWChOKQkoKChOKSArIDEpICYgKFRYX1JJTkdfU0laRSAtIDEpKQorI2RlZmluZSBORVhUX1JYKE4pCSgoKE4pICsgMSkgJiAoUlhfUklOR19TSVpFIC0gMSkpCisKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwoR1ApCQkJCQlcCisJKCgoR1ApLT50eF9vbGQgPD0gKEdQKS0+dHhfbmV3KSA/CQkJXAorCSAgKEdQKS0+dHhfb2xkICsgKFRYX1JJTkdfU0laRSAtIDEpIC0gKEdQKS0+dHhfbmV3IDoJXAorCSAgKEdQKS0+dHhfb2xkIC0gKEdQKS0+dHhfbmV3IC0gMSkKKworI2RlZmluZSBSWF9PRkZTRVQgICAgICAgICAgMgorI2RlZmluZSBSWF9CVUZfQUxMT0NfU0laRShncCkJKChncCktPnJ4X2J1Zl9zeiArIDI4ICsgUlhfT0ZGU0VUICsgNjQpCisKKyNkZWZpbmUgUlhfQ09QWV9USFJFU0hPTEQgIDI1NgorCisjaWYgVFhfUklOR19TSVpFIDwgMTI4CisjZGVmaW5lIElOSVRfQkxPQ0tfVFhfUklOR19TSVpFCQkxMjgKKyNlbHNlCisjZGVmaW5lIElOSVRfQkxPQ0tfVFhfUklOR19TSVpFCQlUWF9SSU5HX1NJWkUKKyNlbmRpZgorCisjaWYgUlhfUklOR19TSVpFIDwgMTI4CisjZGVmaW5lIElOSVRfQkxPQ0tfUlhfUklOR19TSVpFCQkxMjgKKyNlbHNlCisjZGVmaW5lIElOSVRfQkxPQ0tfUlhfUklOR19TSVpFCQlSWF9SSU5HX1NJWkUKKyNlbmRpZgorCitzdHJ1Y3QgZ2VtX2luaXRfYmxvY2sgeworCXN0cnVjdCBnZW1fdHhkCXR4ZFtJTklUX0JMT0NLX1RYX1JJTkdfU0laRV07CisJc3RydWN0IGdlbV9yeGQJcnhkW0lOSVRfQkxPQ0tfUlhfUklOR19TSVpFXTsKK307CisKK2VudW0gZ2VtX3BoeV90eXBlIHsKKwlwaHlfbWlpX21kaW8wLAorCXBoeV9taWlfbWRpbzEsCisJcGh5X3NlcmlhbGluaywKKwlwaHlfc2VyZGVzLAorfTsKKworZW51bSBsaW5rX3N0YXRlIHsKKwlsaW5rX2Rvd24gPSAwLAkvKiBObyBsaW5rLCB3aWxsIHJldHJ5ICovCisJbGlua19hbmVnLAkvKiBBdXRvbmVnIGluIHByb2dyZXNzICovCisJbGlua19mb3JjZV90cnksCS8qIFRyeSBGb3JjZWQgbGluayBzcGVlZCAqLworCWxpbmtfZm9yY2VfcmV0LAkvKiBGb3JjZWQgbW9kZSB3b3JrZWQsIHJldHJ5aW5nIGF1dG9uZWcgKi8KKwlsaW5rX2ZvcmNlX29rLAkvKiBTdGF5IGluIGZvcmNlZCBtb2RlICovCisJbGlua191cAkJLyogTGluayBpcyB1cCAqLworfTsKKworc3RydWN0IGdlbSB7CisJc3BpbmxvY2tfdAkJbG9jazsKKwlzcGlubG9ja190CQl0eF9sb2NrOworCXZvaWQgX19pb21lbQkJKnJlZ3M7CisJaW50CQkJcnhfbmV3LCByeF9vbGQ7CisJaW50CQkJdHhfbmV3LCB0eF9vbGQ7CisKKwl1bnNpZ25lZCBpbnQgaGFzX3dvbCA6IDE7CS8qIGNoaXAgc3VwcG9ydHMgd2FrZS1vbi1sYW4gKi8KKwl1bnNpZ25lZCBpbnQgYXNsZWVwIDogMTsJLyogY2hpcCBhc2xlZXAsIHByb3RlY3RlZCBieSBwbV9zZW0gKi8KKwl1bnNpZ25lZCBpbnQgYXNsZWVwX3dvbCA6IDE7CS8qIHdhcyBhc2xlZXAgd2l0aCBXT0wgZW5hYmxlZCAqLworCXVuc2lnbmVkIGludCBvcGVuZWQgOiAxOwkvKiBkcml2ZXIgb3BlbmVkLCBwcm90ZWN0ZWQgYnkgcG1fc2VtICovCisJdW5zaWduZWQgaW50IHJ1bm5pbmcgOiAxOwkvKiBjaGlwIHJ1bm5pbmcsIHByb3RlY3RlZCBieSBsb2NrICovCisJCisJLyogY2VsbCBlbmFibGUgY291bnQsIHByb3RlY3RlZCBieSBsb2NrICovCisJaW50CQkJY2VsbF9lbmFibGVkOyAgCisJCisJc3RydWN0IHNlbWFwaG9yZQlwbV9zZW07CisKKwl1MzIJCQltc2dfZW5hYmxlOworCXUzMgkJCXN0YXR1czsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKKworCWludAkJCXR4X2ZpZm9fc3o7CisJaW50CQkJcnhfZmlmb19zejsKKwlpbnQJCQlyeF9wYXVzZV9vZmY7CisJaW50CQkJcnhfcGF1c2Vfb247CisJaW50CQkJcnhfYnVmX3N6OworCXU2NAkJCXBhdXNlX2VudGVyZWQ7CisJdTE2CQkJcGF1c2VfbGFzdF90aW1lX3JlY3ZkOworCXUzMgkJCW1hY19yeF9jZmc7CisJdTMyCQkJc3dyc3RfYmFzZTsKKworCWludAkJCXdhbnRfYXV0b25lZzsKKwlpbnQJCQlsYXN0X2ZvcmNlZF9zcGVlZDsKKwllbnVtIGxpbmtfc3RhdGUJCWxzdGF0ZTsKKwlzdHJ1Y3QgdGltZXJfbGlzdAlsaW5rX3RpbWVyOworCWludAkJCXRpbWVyX3RpY2tzOworCWludAkJCXdha2Vfb25fbGFuOworCXN0cnVjdCB3b3JrX3N0cnVjdAlyZXNldF90YXNrOworCXZvbGF0aWxlIGludAkJcmVzZXRfdGFza19wZW5kaW5nOworCisJZW51bSBnZW1fcGh5X3R5cGUJcGh5X3R5cGU7CisJc3RydWN0IG1paV9waHkJCXBoeV9taWk7CisJaW50CQkJbWlpX3BoeV9hZGRyOworCQkKKwlzdHJ1Y3QgZ2VtX2luaXRfYmxvY2sJKmluaXRfYmxvY2s7CisJc3RydWN0IHNrX2J1ZmYJCSpyeF9za2JzW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHNrX2J1ZmYJCSp0eF9za2JzW1JYX1JJTkdfU0laRV07CisJZG1hX2FkZHJfdAkJZ2Jsb2NrX2R2bWE7CisKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJKm9mX25vZGU7CisjZW5kaWYKK307CisKKyNkZWZpbmUgZm91bmRfbWlpX3BoeShncCkgKChncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMCB8fCBncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMSkgXAorCQkJCSYmIGdwLT5waHlfbWlpLmRlZiAmJiBncC0+cGh5X21paS5kZWYtPm9wcykKKwkJCQorI2RlZmluZSBBTElHTkVEX1JYX1NLQl9BRERSKGFkZHIpIFwKKyAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpICsgKDY0VUwgLSAxVUwpKSAmIH4oNjRVTCAtIDFVTCkpIC0gKHVuc2lnbmVkIGxvbmcpKGFkZHIpKQorc3RhdGljIF9faW5saW5lX18gc3RydWN0IHNrX2J1ZmYgKmdlbV9hbGxvY19za2IoaW50IHNpemUsIGludCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihzaXplICsgNjQsIGdmcF9mbGFncyk7CisKKwlpZiAoc2tiKSB7CisJCWludCBvZmZzZXQgPSAoaW50KSBBTElHTkVEX1JYX1NLQl9BRERSKHNrYi0+ZGF0YSk7CisJCWlmIChvZmZzZXQpCisJCQlza2JfcmVzZXJ2ZShza2IsIG9mZnNldCk7CisJfQorCisJcmV0dXJuIHNrYjsKK30KKworI2VuZGlmIC8qIF9TVU5HRU1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtX3BoeS5jIGIvZHJpdmVycy9uZXQvc3VuZ2VtX3BoeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmY2E0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmMKQEAgLTAsMCArMSw4NzIgQEAKKy8qCisgKiBQSFkgZHJpdmVycyBmb3IgdGhlIHN1bmdlbSBldGhlcm5ldCBkcml2ZXIuCisgKiAKKyAqIFRoaXMgZmlsZSBjb3VsZCBiZSBzaGFyZWQgd2l0aCBvdGhlciBkcml2ZXJzLgorICogCisgKiAoYykgMjAwMiwgQmVuamFtaW4gSGVycmVuc2NtaWR0IChiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmcpCisgKgorICogVE9ETzoKKyAqICAtIEltcGxlbWVudCBXT0wKKyAqICAtIEFkZCBzdXBwb3J0IGZvciBQSFlzIHRoYXQgcHJvdmlkZSBhbiBJUlEgbGluZQorICogIC0gRXZlbnR1YWxseSBtb3ZlZCB0aGUgZW50aXJlIHBvbGxpbmcgc3RhdGUgbWFjaGluZSBpbgorICogICAgdGhlcmUgKG91dCBvZiB0aGUgZXRoIGRyaXZlciksIHNvIHRoYXQgaXQgY2FuIGVhc2lseSBiZQorICogICAgc2tpcHBlZCBvbiBQSFlzIHRoYXQgaW1wbGVtZW50IGl0IGluIGhhcmR3YXJlLgorICogIC0gT24gTFhUOTcxICYgQkNNNTIwMSwgQXBwbGUgdXNlcyBzb21lIGNoaXAgc3BlY2lmaWMgcmVncworICogICAgdG8gcmVhZCB0aGUgbGluayBzdGF0dXMuIEZpZ3VyZSBvdXQgd2h5IGFuZCBpZiBpdCBtYWtlcworICogICAgc2Vuc2UgdG8gZG8gdGhlIHNhbWUgKG1hZ2ljIGFuZWcgPykKKyAqICAtIEFwcGxlIGhhcyBzb21lIGFkZGl0aW9uYWwgcG93ZXIgbWFuYWdlbWVudCBjb2RlIGZvciBzb21lCisgKiAgICBCcm9hZGNvbSBQSFlzIHRoYXQgdGhleSAiaGlkZSIgZnJvbSB0aGUgT3BlblNvdXJjZSB2ZXJzaW9uCisgKiAgICBvZiBkYXJ3aW4sIHN0aWxsIG5lZWQgdG8gcmV2ZXJzZSBlbmdpbmVlciB0aGF0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgInN1bmdlbV9waHkuaCIKKworLyogTGluayBtb2RlcyBvZiB0aGUgQkNNNTQwMCBQSFkgKi8KK3N0YXRpYyBpbnQgcGh5X0JDTTU0MDBfbGlua190YWJsZVs4XVszXSA9IHsKKwl7IDAsIDAsIDAgfSwJLyogTm8gbGluayAqLworCXsgMCwgMCwgMCB9LAkvKiAxMEJUIEhhbGYgRHVwbGV4ICovCisJeyAxLCAwLCAwIH0sCS8qIDEwQlQgRnVsbCBEdXBsZXggKi8KKwl7IDAsIDEsIDAgfSwJLyogMTAwQlQgSGFsZiBEdXBsZXggKi8KKwl7IDAsIDEsIDAgfSwJLyogMTAwQlQgSGFsZiBEdXBsZXggKi8KKwl7IDEsIDEsIDAgfSwJLyogMTAwQlQgRnVsbCBEdXBsZXgqLworCXsgMSwgMCwgMSB9LAkvKiAxMDAwQlQgKi8KKwl7IDEsIDAsIDEgfSwJLyogMTAwMEJUICovCit9OworCitzdGF0aWMgaW5saW5lIGludCBfX3BoeV9yZWFkKHN0cnVjdCBtaWlfcGh5KiBwaHksIGludCBpZCwgaW50IHJlZykKK3sKKwlyZXR1cm4gcGh5LT5tZGlvX3JlYWQocGh5LT5kZXYsIGlkLCByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19waHlfd3JpdGUoc3RydWN0IG1paV9waHkqIHBoeSwgaW50IGlkLCBpbnQgcmVnLCBpbnQgdmFsKQoreworCXBoeS0+bWRpb193cml0ZShwaHktPmRldiwgaWQsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGh5X3JlYWQoc3RydWN0IG1paV9waHkqIHBoeSwgaW50IHJlZykKK3sKKwlyZXR1cm4gcGh5LT5tZGlvX3JlYWQocGh5LT5kZXYsIHBoeS0+bWlpX2lkLCByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGh5X3dyaXRlKHN0cnVjdCBtaWlfcGh5KiBwaHksIGludCByZWcsIGludCB2YWwpCit7CisJcGh5LT5tZGlvX3dyaXRlKHBoeS0+ZGV2LCBwaHktPm1paV9pZCwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW50IHJlc2V0X29uZV9taWlfcGh5KHN0cnVjdCBtaWlfcGh5KiBwaHksIGludCBwaHlfaWQpCit7CisJdTE2IHZhbDsKKwlpbnQgbGltaXQgPSAxMDAwMDsKKwkKKwl2YWwgPSBfX3BoeV9yZWFkKHBoeSwgcGh5X2lkLCBNSUlfQk1DUik7CisJdmFsICY9IH4oQk1DUl9JU09MQVRFIHwgQk1DUl9QRE9XTik7CisJdmFsIHw9IEJNQ1JfUkVTRVQ7CisJX19waHlfd3JpdGUocGh5LCBwaHlfaWQsIE1JSV9CTUNSLCB2YWwpOworCisJdWRlbGF5KDEwMCk7CisKKwl3aGlsZSAobGltaXQtLSkgeworCQl2YWwgPSBfX3BoeV9yZWFkKHBoeSwgcGh5X2lkLCBNSUlfQk1DUik7CisJCWlmICgodmFsICYgQk1DUl9SRVNFVCkgPT0gMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoKHZhbCAmIEJNQ1JfSVNPTEFURSkgJiYgbGltaXQgPiAwKQorCQlfX3BoeV93cml0ZShwaHksIHBoeV9pZCwgTUlJX0JNQ1IsIHZhbCAmIH5CTUNSX0lTT0xBVEUpOworCQorCXJldHVybiAobGltaXQgPD0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTIwMV9pbml0KHN0cnVjdCBtaWlfcGh5KiBwaHkpCit7CisJdTE2IGRhdGE7CisKKwlkYXRhID0gcGh5X3JlYWQocGh5LCBNSUlfQkNNNTIwMV9NVUxUSVBIWSk7CisJZGF0YSAmPSB+TUlJX0JDTTUyMDFfTVVMVElQSFlfU1VQRVJJU09MQVRFOworCXBoeV93cml0ZShwaHksIE1JSV9CQ001MjAxX01VTFRJUEhZLCBkYXRhKTsKKworCXBoeV93cml0ZShwaHksIE1JSV9CQ001MjAxX0lOVEVSUlVQVCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY201MjAxX3N1c3BlbmQoc3RydWN0IG1paV9waHkqIHBoeSkKK3sKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTIwMV9JTlRFUlJVUFQsIDApOworCXBoeV93cml0ZShwaHksIE1JSV9CQ001MjAxX01VTFRJUEhZLCBNSUlfQkNNNTIwMV9NVUxUSVBIWV9TVVBFUklTT0xBVEUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTIyMV9pbml0KHN0cnVjdCBtaWlfcGh5KiBwaHkpCit7CisJdTE2IGRhdGE7CisKKwlkYXRhID0gcGh5X3JlYWQocGh5LCBNSUlfQkNNNTIyMV9URVNUKTsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTIyMV9URVNULAorCQlkYXRhIHwgTUlJX0JDTTUyMjFfVEVTVF9FTkFCTEVfU0hBRE9XUyk7CisKKwlkYXRhID0gcGh5X3JlYWQocGh5LCBNSUlfQkNNNTIyMV9TSERPV19BVVhfU1RBVDIpOworCXBoeV93cml0ZShwaHksIE1JSV9CQ001MjIxX1NIRE9XX0FVWF9TVEFUMiwKKwkJZGF0YSB8IE1JSV9CQ001MjIxX1NIRE9XX0FVWF9TVEFUMl9BUEQpOworCisJZGF0YSA9IHBoeV9yZWFkKHBoeSwgTUlJX0JDTTUyMjFfU0hET1dfQVVYX01PREU0KTsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTIyMV9TSERPV19BVVhfTU9ERTQsCisJCWRhdGEgfCBNSUlfQkNNNTIyMV9TSERPV19BVVhfTU9ERTRfQ0xLTE9QV1IpOworCisJZGF0YSA9IHBoeV9yZWFkKHBoeSwgTUlJX0JDTTUyMjFfVEVTVCk7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTUyMjFfVEVTVCwKKwkJZGF0YSAmIH5NSUlfQkNNNTIyMV9URVNUX0VOQUJMRV9TSEFET1dTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTUyMjFfc3VzcGVuZChzdHJ1Y3QgbWlpX3BoeSogcGh5KQoreworCXUxNiBkYXRhOworCisJZGF0YSA9IHBoeV9yZWFkKHBoeSwgTUlJX0JDTTUyMjFfVEVTVCk7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTUyMjFfVEVTVCwKKwkJZGF0YSB8IE1JSV9CQ001MjIxX1RFU1RfRU5BQkxFX1NIQURPV1MpOworCisJZGF0YSA9IHBoeV9yZWFkKHBoeSwgTUlJX0JDTTUyMjFfU0hET1dfQVVYX01PREU0KTsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTIyMV9TSERPV19BVVhfTU9ERTQsCisJCSAgZGF0YSB8IE1JSV9CQ001MjIxX1NIRE9XX0FVWF9NT0RFNF9JRERRTU9ERSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY201NDAwX2luaXQoc3RydWN0IG1paV9waHkqIHBoeSkKK3sKKwl1MTYgZGF0YTsKKworCS8qIENvbmZpZ3VyZSBmb3IgZ2lnYWJpdCBmdWxsIGR1cGxleCAqLworCWRhdGEgPSBwaHlfcmVhZChwaHksIE1JSV9CQ001NDAwX0FVWENPTlRST0wpOworCWRhdGEgfD0gTUlJX0JDTTU0MDBfQVVYQ09OVFJPTF9QV1IxMEJBU0VUOworCXBoeV93cml0ZShwaHksIE1JSV9CQ001NDAwX0FVWENPTlRST0wsIGRhdGEpOworCQorCWRhdGEgPSBwaHlfcmVhZChwaHksIE1JSV9CQ001NDAwX0dCX0NPTlRST0wpOworCWRhdGEgfD0gTUlJX0JDTTU0MDBfR0JfQ09OVFJPTF9GVUxMRFVQTEVYQ0FQOworCXBoeV93cml0ZShwaHksIE1JSV9CQ001NDAwX0dCX0NPTlRST0wsIGRhdGEpOworCQorCXVkZWxheSgxMDApOworCisJLyogUmVzZXQgYW5kIGNvbmZpZ3VyZSBjYXNjYWRlZCAxMC8xMDAgUEhZICovCisJKHZvaWQpcmVzZXRfb25lX21paV9waHkocGh5LCAweDFmKTsKKwkKKwlkYXRhID0gX19waHlfcmVhZChwaHksIDB4MWYsIE1JSV9CQ001MjAxX01VTFRJUEhZKTsKKwlkYXRhIHw9IE1JSV9CQ001MjAxX01VTFRJUEhZX1NFUklBTE1PREU7CisJX19waHlfd3JpdGUocGh5LCAweDFmLCBNSUlfQkNNNTIwMV9NVUxUSVBIWSwgZGF0YSk7CisKKwlkYXRhID0gcGh5X3JlYWQocGh5LCBNSUlfQkNNNTQwMF9BVVhDT05UUk9MKTsKKwlkYXRhICY9IH5NSUlfQkNNNTQwMF9BVVhDT05UUk9MX1BXUjEwQkFTRVQ7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTU0MDBfQVVYQ09OVFJPTCwgZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY201NDAwX3N1c3BlbmQoc3RydWN0IG1paV9waHkqIHBoeSkKK3sKKyNpZiAwIC8qIENvbW1lbnRlZCBvdXQgaW4gRGFyd2luLi4uIHNvbWVvbmUgaGFzIHRob3NlIGRhd24gZG9jcyA/ICovCisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIEJNQ1JfUERPV04pOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTQwMV9pbml0KHN0cnVjdCBtaWlfcGh5KiBwaHkpCit7CisJdTE2IGRhdGE7CisJaW50IHJldjsKKworCXJldiA9IHBoeV9yZWFkKHBoeSwgTUlJX1BIWVNJRDIpICYgMHgwMDBmOworCWlmIChyZXYgPT0gMCB8fCByZXYgPT0gMykgeworCQkvKiBTb21lIHJldmlzaW9ucyBvZiA1NDAxIGFwcGVhciB0byBuZWVkIHRoaXMKKwkJICogaW5pdGlhbGlzYXRpb24gc2VxdWVuY2UgdG8gZGlzYWJsZSwgYWNjb3JkaW5nCisJCSAqIHRvIE9GLCAidGFwIHBvd2VyIG1hbmFnZW1lbnQiCisJCSAqIAorCQkgKiBXQVJOSU5HICEgT0YgYW5kIERhcndpbiBkb24ndCBhZ3JlZSBvbiB0aGUKKwkJICogcmVnaXN0ZXIgYWRkcmVzc2VzLiBPRiBzZWVtIHRvIGludGVycHJldCB0aGUKKwkJICogcmVnaXN0ZXIgbnVtYmVycyBiZWxvdyBhcyBkZWNpbWFsCisJCSAqCisJCSAqIE5vdGU6IFRoaXMgc2hvdWxkIChhbmQgZG9lcykgbWF0Y2ggdGczX2luaXRfNTQwMXBoeV9kc3AKKwkJICogICAgICAgaW4gdGhlIHRnMy5jIGRyaXZlci4gLURhdmVNCisJCSAqLworCQlwaHlfd3JpdGUocGh5LCAweDE4LCAweDBjMjApOworCQlwaHlfd3JpdGUocGh5LCAweDE3LCAweDAwMTIpOworCQlwaHlfd3JpdGUocGh5LCAweDE1LCAweDE4MDQpOworCQlwaHlfd3JpdGUocGh5LCAweDE3LCAweDAwMTMpOworCQlwaHlfd3JpdGUocGh5LCAweDE1LCAweDEyMDQpOworCQlwaHlfd3JpdGUocGh5LCAweDE3LCAweDgwMDYpOworCQlwaHlfd3JpdGUocGh5LCAweDE1LCAweDAxMzIpOworCQlwaHlfd3JpdGUocGh5LCAweDE3LCAweDgwMDYpOworCQlwaHlfd3JpdGUocGh5LCAweDE1LCAweDAyMzIpOworCQlwaHlfd3JpdGUocGh5LCAweDE3LCAweDIwMWYpOworCQlwaHlfd3JpdGUocGh5LCAweDE1LCAweDBhMjApOworCX0KKwkKKwkvKiBDb25maWd1cmUgZm9yIGdpZ2FiaXQgZnVsbCBkdXBsZXggKi8KKwlkYXRhID0gcGh5X3JlYWQocGh5LCBNSUlfQkNNNTQwMF9HQl9DT05UUk9MKTsKKwlkYXRhIHw9IE1JSV9CQ001NDAwX0dCX0NPTlRST0xfRlVMTERVUExFWENBUDsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTQwMF9HQl9DT05UUk9MLCBkYXRhKTsKKworCXVkZWxheSgxMCk7CisKKwkvKiBSZXNldCBhbmQgY29uZmlndXJlIGNhc2NhZGVkIDEwLzEwMCBQSFkgKi8KKwkodm9pZClyZXNldF9vbmVfbWlpX3BoeShwaHksIDB4MWYpOworCQorCWRhdGEgPSBfX3BoeV9yZWFkKHBoeSwgMHgxZiwgTUlJX0JDTTUyMDFfTVVMVElQSFkpOworCWRhdGEgfD0gTUlJX0JDTTUyMDFfTVVMVElQSFlfU0VSSUFMTU9ERTsKKwlfX3BoeV93cml0ZShwaHksIDB4MWYsIE1JSV9CQ001MjAxX01VTFRJUEhZLCBkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTU0MDFfc3VzcGVuZChzdHJ1Y3QgbWlpX3BoeSogcGh5KQoreworI2lmIDAgLyogQ29tbWVudGVkIG91dCBpbiBEYXJ3aW4uLi4gc29tZW9uZSBoYXMgdGhvc2UgZGF3biBkb2NzID8gKi8KKwlwaHlfd3JpdGUocGh5LCBNSUlfQk1DUiwgQk1DUl9QRE9XTik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY201NDExX2luaXQoc3RydWN0IG1paV9waHkqIHBoeSkKK3sKKwl1MTYgZGF0YTsKKworCS8qIEhlcmUncyBzb21lIG1vcmUgQXBwbGUgYmxhY2sgbWFnaWMgdG8gc2V0dXAKKwkgKiBzb21lIHZvbHRhZ2Ugc3R1ZmZzLgorCSAqLworCXBoeV93cml0ZShwaHksIDB4MWMsIDB4OGMyMyk7CisJcGh5X3dyaXRlKHBoeSwgMHgxYywgMHg4Y2EzKTsKKwlwaHlfd3JpdGUocGh5LCAweDFjLCAweDhjMjMpOworCisJLyogSGVyZSwgQXBwbGUgc2VlbXMgdG8gd2FudCB0byByZXNldCBpdCwgZG8KKwkgKiBpdCBhcyB3ZWxsCisJICovCisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCAweDEzNDApOworCisJZGF0YSA9IHBoeV9yZWFkKHBoeSwgTUlJX0JDTTU0MDBfR0JfQ09OVFJPTCk7CisJZGF0YSB8PSBNSUlfQkNNNTQwMF9HQl9DT05UUk9MX0ZVTExEVVBMRVhDQVA7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTU0MDBfR0JfQ09OVFJPTCwgZGF0YSk7CisKKwl1ZGVsYXkoMTApOworCisJLyogUmVzZXQgYW5kIGNvbmZpZ3VyZSBjYXNjYWRlZCAxMC8xMDAgUEhZICovCisJKHZvaWQpcmVzZXRfb25lX21paV9waHkocGh5LCAweDFmKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY201NDExX3N1c3BlbmQoc3RydWN0IG1paV9waHkqIHBoeSkKK3sKKwlwaHlfd3JpdGUocGh5LCBNSUlfQk1DUiwgQk1DUl9QRE9XTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY201NDIxX2luaXQoc3RydWN0IG1paV9waHkqIHBoeSkKK3sKKwl1MTYgZGF0YTsKKwlpbnQgcmV2OworCisJcmV2ID0gcGh5X3JlYWQocGh5LCBNSUlfUEhZU0lEMikgJiAweDAwMGY7CisJaWYgKHJldiA9PSAwKSB7CisJCS8qIFRoaXMgaXMgYm9ycm93ZWQgZnJvbSBNYWNPUworCQkgKi8KKwkJcGh5X3dyaXRlKHBoeSwgMHgxOCwgMHgxMDA3KTsKKwkJZGF0YSA9IHBoeV9yZWFkKHBoeSwgMHgxOCk7CisJCXBoeV93cml0ZShwaHksIDB4MTgsIGRhdGEgfCAweDA0MDApOworCQlwaHlfd3JpdGUocGh5LCAweDE4LCAweDAwMDcpOworCQlkYXRhID0gcGh5X3JlYWQocGh5LCAweDE4KTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxOCwgZGF0YSB8IDB4MDgwMCk7CisJCXBoeV93cml0ZShwaHksIDB4MTcsIDB4MDAwYSk7CisJCWRhdGEgPSBwaHlfcmVhZChwaHksIDB4MTUpOworCQlwaHlfd3JpdGUocGh5LCAweDE1LCBkYXRhIHwgMHgwMjAwKTsKKwl9CisjaWYgMAorCS8qIFRoaXMgaGFzIHRvIGJlIHZlcmlmaWVkIGJlZm9yZSBJIGVuYWJsZSBpdCAqLworCS8qIEVuYWJsZSBhdXRvbWF0aWMgbG93LXBvd2VyICovCisJcGh5X3dyaXRlKHBoeSwgMHgxYywgMHg5MDAyKTsKKwlwaHlfd3JpdGUocGh5LCAweDFjLCAweGE4MjEpOworCXBoeV93cml0ZShwaHksIDB4MWMsIDB4OTQxZCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY201NDIxazJfaW5pdChzdHJ1Y3QgbWlpX3BoeSogcGh5KQoreworCS8qIEluaXQgY29kZSBib3Jyb3dlZCBmcm9tIE9GICovCisJcGh5X3dyaXRlKHBoeSwgNCwgMHgwMWUxKTsKKwlwaHlfd3JpdGUocGh5LCA5LCAweDAzMDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTR4eF9zZXR1cF9hbmVnKHN0cnVjdCBtaWlfcGh5ICpwaHksIHUzMiBhZHZlcnRpc2UpCit7CisJdTE2IGN0bCwgYWR2OworCQorCXBoeS0+YXV0b25lZyA9IDE7CisJcGh5LT5zcGVlZCA9IFNQRUVEXzEwOworCXBoeS0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJcGh5LT5wYXVzZSA9IDA7CisJcGh5LT5hZHZlcnRpc2luZyA9IGFkdmVydGlzZTsKKworCS8qIFNldHVwIHN0YW5kYXJkIGFkdmVydGlzZSAqLworCWFkdiA9IHBoeV9yZWFkKHBoeSwgTUlJX0FEVkVSVElTRSk7CisJYWR2ICY9IH4oQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV8xMDBCQVNFNCk7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwSEFMRjsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTBGVUxMOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0FEVkVSVElTRSwgYWR2KTsKKworCS8qIFNldHVwIDEwMDBCVCBhZHZlcnRpc2UgKi8KKwlhZHYgPSBwaHlfcmVhZChwaHksIE1JSV8xMDAwQkFTRVRDT05UUk9MKTsKKwlhZHYgJj0gfihNSUlfMTAwMEJBU0VUQ09OVFJPTF9GVUxMRFVQTEVYQ0FQfE1JSV8xMDAwQkFTRVRDT05UUk9MX0hBTEZEVVBMRVhDQVApOworCWlmIChhZHZlcnRpc2UgJiBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYpCisJCWFkdiB8PSBNSUlfMTAwMEJBU0VUQ09OVFJPTF9IQUxGRFVQTEVYQ0FQOworCWlmIChhZHZlcnRpc2UgJiBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpCisJCWFkdiB8PSBNSUlfMTAwMEJBU0VUQ09OVFJPTF9GVUxMRFVQTEVYQ0FQOworCXBoeV93cml0ZShwaHksIE1JSV8xMDAwQkFTRVRDT05UUk9MLCBhZHYpOworCisJLyogU3RhcnQvUmVzdGFydCBhbmVnICovCisJY3RsID0gcGh5X3JlYWQocGh5LCBNSUlfQk1DUik7CisJY3RsIHw9IChCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpOworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBjdGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTR4eF9zZXR1cF9mb3JjZWQoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IHNwZWVkLCBpbnQgZmQpCit7CisJdTE2IGN0bDsKKwkKKwlwaHktPmF1dG9uZWcgPSAwOworCXBoeS0+c3BlZWQgPSBzcGVlZDsKKwlwaHktPmR1cGxleCA9IGZkOworCXBoeS0+cGF1c2UgPSAwOworCisJY3RsID0gcGh5X3JlYWQocGh5LCBNSUlfQk1DUik7CisJY3RsICY9IH4oQk1DUl9GVUxMRFBMWHxCTUNSX1NQRUVEMTAwfEJNQ1JfU1BEMnxCTUNSX0FORU5BQkxFKTsKKworCS8qIEZpcnN0IHJlc2V0IHRoZSBQSFkgKi8KKwlwaHlfd3JpdGUocGh5LCBNSUlfQk1DUiwgY3RsIHwgQk1DUl9SRVNFVCk7CisKKwkvKiBTZWxlY3Qgc3BlZWQgJiBkdXBsZXggKi8KKwlzd2l0Y2goc3BlZWQpIHsKKwljYXNlIFNQRUVEXzEwOgorCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMDoKKwkJY3RsIHw9IEJNQ1JfU1BFRUQxMDA7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwMDoKKwkJY3RsIHw9IEJNQ1JfU1BEMjsKKwl9CisJaWYgKGZkID09IERVUExFWF9GVUxMKQorCQljdGwgfD0gQk1DUl9GVUxMRFBMWDsKKworCS8vIFhYWCBTaG91bGQgd2Ugc2V0IHRoZSBzdW5nZW0gdG8gR0lJIG5vdyBvbiAxMDAwQlQgPworCQorCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBjdGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTR4eF9yZWFkX2xpbmsoc3RydWN0IG1paV9waHkgKnBoeSkKK3sKKwlpbnQgbGlua19tb2RlOwkKKwl1MTYgdmFsOworCQorCWlmIChwaHktPmF1dG9uZWcpIHsKKwkgICAgCXZhbCA9IHBoeV9yZWFkKHBoeSwgTUlJX0JDTTU0MDBfQVVYU1RBVFVTKTsKKwkJbGlua19tb2RlID0gKCh2YWwgJiBNSUlfQkNNNTQwMF9BVVhTVEFUVVNfTElOS01PREVfTUFTSykgPj4KKwkJCSAgICAgTUlJX0JDTTU0MDBfQVVYU1RBVFVTX0xJTktNT0RFX1NISUZUKTsKKwkJcGh5LT5kdXBsZXggPSBwaHlfQkNNNTQwMF9saW5rX3RhYmxlW2xpbmtfbW9kZV1bMF0gPyBEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOworCQlwaHktPnNwZWVkID0gcGh5X0JDTTU0MDBfbGlua190YWJsZVtsaW5rX21vZGVdWzJdID8KKwkJCQlTUEVFRF8xMDAwIDoKKwkJCQkocGh5X0JDTTU0MDBfbGlua190YWJsZVtsaW5rX21vZGVdWzFdID8gU1BFRURfMTAwIDogU1BFRURfMTApOworCQl2YWwgPSBwaHlfcmVhZChwaHksIE1JSV9MUEEpOworCQlwaHktPnBhdXNlID0gKCh2YWwgJiBMUEFfUEFVU0UpICE9IDApOworCX0KKwkvKiBPbiBub24tYW5lZywgd2UgYXNzdW1lIHdoYXQgd2UgcHV0IGluIEJNQ1IgaXMgdGhlIHNwZWVkLAorCSAqIHRob3VnaCBtYWdpYy1hbmVnIHNob3VsZG4ndCBwcmV2ZW50IHRoaXMgY2FzZSBmcm9tIG9jY3VycmluZworCSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFydmVsbF9zZXR1cF9hbmVnKHN0cnVjdCBtaWlfcGh5ICpwaHksIHUzMiBhZHZlcnRpc2UpCit7CisJdTE2IGN0bCwgYWR2OworCQorCXBoeS0+YXV0b25lZyA9IDE7CisJcGh5LT5zcGVlZCA9IFNQRUVEXzEwOworCXBoeS0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJcGh5LT5wYXVzZSA9IDA7CisJcGh5LT5hZHZlcnRpc2luZyA9IGFkdmVydGlzZTsKKworCS8qIFNldHVwIHN0YW5kYXJkIGFkdmVydGlzZSAqLworCWFkdiA9IHBoeV9yZWFkKHBoeSwgTUlJX0FEVkVSVElTRSk7CisJYWR2ICY9IH4oQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV8xMDBCQVNFNCk7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwSEFMRjsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTBGVUxMOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0FEVkVSVElTRSwgYWR2KTsKKworCS8qIFNldHVwIDEwMDBCVCBhZHZlcnRpc2UgJiBlbmFibGUgY3Jvc3NvdmVyIGRldGVjdAorCSAqIFhYWCBIb3cgZG8gd2UgYWR2ZXJ0aXNlIDEwMDBCVCA/IERhcndpbiBzb3VyY2UgaXMKKwkgKiBjb25mdXNpbmcgaGVyZSwgdGhleSByZWFkIGZyb20gc3BlY2lmaWMgY29udHJvbCBhbmQKKwkgKiB3cml0ZSB0byBjb250cm9sLi4uIFNvbWVvbmUgaGFzIHNwZWNzIGZvciB0aG9zZQorCSAqIGJlYXN0cyA/CisJICovCisJYWR2ID0gcGh5X3JlYWQocGh5LCBNSUlfTTEwMTFfUEhZX1NQRUNfQ09OVFJPTCk7CisJYWR2IHw9IE1JSV9NMTAxMV9QSFlfU1BFQ19DT05UUk9MX0FVVE9fTURJWDsKKwlhZHYgJj0gfihNSUlfMTAwMEJBU0VUQ09OVFJPTF9GVUxMRFVQTEVYQ0FQIHwKKwkJCU1JSV8xMDAwQkFTRVRDT05UUk9MX0hBTEZEVVBMRVhDQVApOworCWlmIChhZHZlcnRpc2UgJiBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYpCisJCWFkdiB8PSBNSUlfMTAwMEJBU0VUQ09OVFJPTF9IQUxGRFVQTEVYQ0FQOworCWlmIChhZHZlcnRpc2UgJiBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpCisJCWFkdiB8PSBNSUlfMTAwMEJBU0VUQ09OVFJPTF9GVUxMRFVQTEVYQ0FQOworCXBoeV93cml0ZShwaHksIE1JSV8xMDAwQkFTRVRDT05UUk9MLCBhZHYpOworCisJLyogU3RhcnQvUmVzdGFydCBhbmVnICovCisJY3RsID0gcGh5X3JlYWQocGh5LCBNSUlfQk1DUik7CisJY3RsIHw9IChCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpOworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBjdGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFydmVsbF9zZXR1cF9mb3JjZWQoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IHNwZWVkLCBpbnQgZmQpCit7CisJdTE2IGN0bCwgY3RsMjsKKwkKKwlwaHktPmF1dG9uZWcgPSAwOworCXBoeS0+c3BlZWQgPSBzcGVlZDsKKwlwaHktPmR1cGxleCA9IGZkOworCXBoeS0+cGF1c2UgPSAwOworCisJY3RsID0gcGh5X3JlYWQocGh5LCBNSUlfQk1DUik7CisJY3RsICY9IH4oQk1DUl9GVUxMRFBMWHxCTUNSX1NQRUVEMTAwfEJNQ1JfU1BEMnxCTUNSX0FORU5BQkxFKTsKKwljdGwgfD0gQk1DUl9SRVNFVDsKKworCS8qIFNlbGVjdCBzcGVlZCAmIGR1cGxleCAqLworCXN3aXRjaChzcGVlZCkgeworCWNhc2UgU1BFRURfMTA6CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwOgorCQljdGwgfD0gQk1DUl9TUEVFRDEwMDsKKwkJYnJlYWs7CisJLyogSSdtIG5vdCBzdXJlIGFib3V0IHRoZSBvbmUgYmVsb3csIGFnYWluLCBEYXJ3aW4gc291cmNlIGlzCisJICogcXVpdGUgY29uZnVzaW5nIGFuZCBJIGxhY2sgY2hpcCBzcGVjcworCSAqLworCWNhc2UgU1BFRURfMTAwMDoKKwkJY3RsIHw9IEJNQ1JfU1BEMjsKKwl9CisJaWYgKGZkID09IERVUExFWF9GVUxMKQorCQljdGwgfD0gQk1DUl9GVUxMRFBMWDsKKworCS8qIERpc2FibGUgY3Jvc3NvdmVyLiBBZ2FpbiwgdGhlIHdheSBBcHBsZSBkb2VzIGl0IGlzIHN0cmFuZ2UsCisJICogdGhvdWdoIEkgZG9uJ3QgYXNzdW1lIHRoZXkgYXJlIHdyb25nIDspCisJICovCisJY3RsMiA9IHBoeV9yZWFkKHBoeSwgTUlJX00xMDExX1BIWV9TUEVDX0NPTlRST0wpOworCWN0bDIgJj0gfihNSUlfTTEwMTFfUEhZX1NQRUNfQ09OVFJPTF9NQU5VQUxfTURJWCB8CisJCU1JSV9NMTAxMV9QSFlfU1BFQ19DT05UUk9MX0FVVE9fTURJWCB8CisJCU1JSV8xMDAwQkFTRVRDT05UUk9MX0ZVTExEVVBMRVhDQVAgfAorCQlNSUlfMTAwMEJBU0VUQ09OVFJPTF9IQUxGRFVQTEVYQ0FQKTsKKwlpZiAoc3BlZWQgPT0gU1BFRURfMTAwMCkKKwkJY3RsMiB8PSAoZmQgPT0gRFVQTEVYX0ZVTEwpID8KKwkJCU1JSV8xMDAwQkFTRVRDT05UUk9MX0ZVTExEVVBMRVhDQVAgOgorCQkJTUlJXzEwMDBCQVNFVENPTlRST0xfSEFMRkRVUExFWENBUDsKKwlwaHlfd3JpdGUocGh5LCBNSUlfMTAwMEJBU0VUQ09OVFJPTCwgY3RsMik7CisKKwkvLyBYWFggU2hvdWxkIHdlIHNldCB0aGUgc3VuZ2VtIHRvIEdJSSBub3cgb24gMTAwMEJUID8KKwkKKwlwaHlfd3JpdGUocGh5LCBNSUlfQk1DUiwgY3RsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hcnZlbGxfcmVhZF9saW5rKHN0cnVjdCBtaWlfcGh5ICpwaHkpCit7CisJdTE2IHN0YXR1czsKKworCWlmIChwaHktPmF1dG9uZWcpIHsKKwkJc3RhdHVzID0gcGh5X3JlYWQocGh5LCBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTKTsKKwkJaWYgKChzdGF0dXMgJiBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTX1JFU09MVkVEKSA9PSAwKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWlmIChzdGF0dXMgJiBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTXzEwMDApCisJCQlwaHktPnNwZWVkID0gU1BFRURfMTAwMDsKKwkJZWxzZSBpZiAoc3RhdHVzICYgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU18xMDApCisJCQlwaHktPnNwZWVkID0gU1BFRURfMTAwOworCQllbHNlCisJCQlwaHktPnNwZWVkID0gU1BFRURfMTA7CisJCWlmIChzdGF0dXMgJiBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTX0ZVTExEVVBMRVgpCisJCQlwaHktPmR1cGxleCA9IERVUExFWF9GVUxMOworCQllbHNlCisJCQlwaHktPmR1cGxleCA9IERVUExFWF9IQUxGOworCQlwaHktPnBhdXNlID0gMDsgLyogWFhYIENoZWNrIGFnYWluc3Qgc3BlYyAhICovCisJfQorCS8qIE9uIG5vbi1hbmVnLCB3ZSBhc3N1bWUgd2hhdCB3ZSBwdXQgaW4gQk1DUiBpcyB0aGUgc3BlZWQsCisJICogdGhvdWdoIG1hZ2ljLWFuZWcgc2hvdWxkbid0IHByZXZlbnQgdGhpcyBjYXNlIGZyb20gb2NjdXJyaW5nCisJICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW5taWlfc2V0dXBfYW5lZyhzdHJ1Y3QgbWlpX3BoeSAqcGh5LCB1MzIgYWR2ZXJ0aXNlKQoreworCXUxNiBjdGwsIGFkdjsKKwkKKwlwaHktPmF1dG9uZWcgPSAxOworCXBoeS0+c3BlZWQgPSBTUEVFRF8xMDsKKwlwaHktPmR1cGxleCA9IERVUExFWF9IQUxGOworCXBoeS0+cGF1c2UgPSAwOworCXBoeS0+YWR2ZXJ0aXNpbmcgPSBhZHZlcnRpc2U7CisKKwkvKiBTZXR1cCBzdGFuZGFyZCBhZHZlcnRpc2UgKi8KKwlhZHYgPSBwaHlfcmVhZChwaHksIE1JSV9BRFZFUlRJU0UpOworCWFkdiAmPSB+KEFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfMTAwQkFTRTQpOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKKwkJYWR2IHw9IEFEVkVSVElTRV8xMEhBTEY7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKKwkJYWR2IHw9IEFEVkVSVElTRV8xMDBGVUxMOworCXBoeV93cml0ZShwaHksIE1JSV9BRFZFUlRJU0UsIGFkdik7CisKKwkvKiBTdGFydC9SZXN0YXJ0IGFuZWcgKi8KKwljdGwgPSBwaHlfcmVhZChwaHksIE1JSV9CTUNSKTsKKwljdGwgfD0gKEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIGN0bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW5taWlfc2V0dXBfZm9yY2VkKHN0cnVjdCBtaWlfcGh5ICpwaHksIGludCBzcGVlZCwgaW50IGZkKQoreworCXUxNiBjdGw7CisJCisJcGh5LT5hdXRvbmVnID0gMDsKKwlwaHktPnNwZWVkID0gc3BlZWQ7CisJcGh5LT5kdXBsZXggPSBmZDsKKwlwaHktPnBhdXNlID0gMDsKKworCWN0bCA9IHBoeV9yZWFkKHBoeSwgTUlJX0JNQ1IpOworCWN0bCAmPSB+KEJNQ1JfRlVMTERQTFh8Qk1DUl9TUEVFRDEwMHxCTUNSX0FORU5BQkxFKTsKKworCS8qIEZpcnN0IHJlc2V0IHRoZSBQSFkgKi8KKwlwaHlfd3JpdGUocGh5LCBNSUlfQk1DUiwgY3RsIHwgQk1DUl9SRVNFVCk7CisKKwkvKiBTZWxlY3Qgc3BlZWQgJiBkdXBsZXggKi8KKwlzd2l0Y2goc3BlZWQpIHsKKwljYXNlIFNQRUVEXzEwOgorCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMDoKKwkJY3RsIHw9IEJNQ1JfU1BFRUQxMDA7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwMDoKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGZkID09IERVUExFWF9GVUxMKQorCQljdGwgfD0gQk1DUl9GVUxMRFBMWDsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQk1DUiwgY3RsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbm1paV9wb2xsX2xpbmsoc3RydWN0IG1paV9waHkgKnBoeSkKK3sKKwl1MTYgc3RhdHVzOworCQorCSh2b2lkKXBoeV9yZWFkKHBoeSwgTUlJX0JNU1IpOworCXN0YXR1cyA9IHBoeV9yZWFkKHBoeSwgTUlJX0JNU1IpOworCWlmICgoc3RhdHVzICYgQk1TUl9MU1RBVFVTKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAocGh5LT5hdXRvbmVnICYmICEoc3RhdHVzICYgQk1TUl9BTkVHQ09NUExFVEUpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBnZW5taWlfcmVhZF9saW5rKHN0cnVjdCBtaWlfcGh5ICpwaHkpCit7CisJdTE2IGxwYTsKKworCWlmIChwaHktPmF1dG9uZWcpIHsKKwkJbHBhID0gcGh5X3JlYWQocGh5LCBNSUlfTFBBKTsKKworCQlpZiAobHBhICYgKExQQV8xMEZVTEwgfCBMUEFfMTAwRlVMTCkpCisJCQlwaHktPmR1cGxleCA9IERVUExFWF9GVUxMOworCQllbHNlCisJCQlwaHktPmR1cGxleCA9IERVUExFWF9IQUxGOworCQlpZiAobHBhICYgKExQQV8xMDBGVUxMIHwgTFBBXzEwMEhBTEYpKQorCQkJcGh5LT5zcGVlZCA9IFNQRUVEXzEwMDsKKwkJZWxzZQorCQkJcGh5LT5zcGVlZCA9IFNQRUVEXzEwOworCQlwaHktPnBhdXNlID0gMDsKKwl9CisJLyogT24gbm9uLWFuZWcsIHdlIGFzc3VtZSB3aGF0IHdlIHB1dCBpbiBCTUNSIGlzIHRoZSBzcGVlZCwKKwkgKiB0aG91Z2ggbWFnaWMtYW5lZyBzaG91bGRuJ3QgcHJldmVudCB0aGlzIGNhc2UgZnJvbSBvY2N1cnJpbmcKKwkgKi8KKworCSByZXR1cm4gMDsKK30KKworCisjZGVmaW5lIE1JSV9CQVNJQ19GRUFUVVJFUwkoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfCBcCisJCQkJIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfCBcCisJCQkJIFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX01JSSkKKyNkZWZpbmUgTUlJX0dCSVRfRkVBVFVSRVMJKE1JSV9CQVNJQ19GRUFUVVJFUyB8IFwKKwkJCQkgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsKQorCisvKiBCcm9hZGNvbSBCQ00gNTIwMSAqLworc3RhdGljIHN0cnVjdCBtaWlfcGh5X29wcyBiY201MjAxX3BoeV9vcHMgPSB7CisJLmluaXQJCT0gYmNtNTIwMV9pbml0LAorCS5zdXNwZW5kCT0gYmNtNTIwMV9zdXNwZW5kLAorCS5zZXR1cF9hbmVnCT0gZ2VubWlpX3NldHVwX2FuZWcsCisJLnNldHVwX2ZvcmNlZAk9IGdlbm1paV9zZXR1cF9mb3JjZWQsCisJLnBvbGxfbGluawk9IGdlbm1paV9wb2xsX2xpbmssCisJLnJlYWRfbGluawk9IGdlbm1paV9yZWFkX2xpbmssCit9OworCitzdGF0aWMgc3RydWN0IG1paV9waHlfZGVmIGJjbTUyMDFfcGh5X2RlZiA9IHsKKwkucGh5X2lkCQk9IDB4MDA0MDYyMTAsCisJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKKwkubmFtZQkJPSAiQkNNNTIwMSIsCisJLmZlYXR1cmVzCT0gTUlJX0JBU0lDX0ZFQVRVUkVTLAorCS5tYWdpY19hbmVnCT0gMSwKKwkub3BzCQk9ICZiY201MjAxX3BoeV9vcHMKK307CisKKy8qIEJyb2FkY29tIEJDTSA1MjIxICovCitzdGF0aWMgc3RydWN0IG1paV9waHlfb3BzIGJjbTUyMjFfcGh5X29wcyA9IHsKKwkuc3VzcGVuZAk9IGJjbTUyMjFfc3VzcGVuZCwKKwkuaW5pdAkJPSBiY201MjIxX2luaXQsCisJLnNldHVwX2FuZWcJPSBnZW5taWlfc2V0dXBfYW5lZywKKwkuc2V0dXBfZm9yY2VkCT0gZ2VubWlpX3NldHVwX2ZvcmNlZCwKKwkucG9sbF9saW5rCT0gZ2VubWlpX3BvbGxfbGluaywKKwkucmVhZF9saW5rCT0gZ2VubWlpX3JlYWRfbGluaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9kZWYgYmNtNTIyMV9waHlfZGVmID0geworCS5waHlfaWQJCT0gMHgwMDQwNjFlMCwKKwkucGh5X2lkX21hc2sJPSAweGZmZmZmZmYwLAorCS5uYW1lCQk9ICJCQ001MjIxIiwKKwkuZmVhdHVyZXMJPSBNSUlfQkFTSUNfRkVBVFVSRVMsCisJLm1hZ2ljX2FuZWcJPSAxLAorCS5vcHMJCT0gJmJjbTUyMjFfcGh5X29wcworfTsKKworLyogQnJvYWRjb20gQkNNIDU0MDAgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9vcHMgYmNtNTQwMF9waHlfb3BzID0geworCS5pbml0CQk9IGJjbTU0MDBfaW5pdCwKKwkuc3VzcGVuZAk9IGJjbTU0MDBfc3VzcGVuZCwKKwkuc2V0dXBfYW5lZwk9IGJjbTU0eHhfc2V0dXBfYW5lZywKKwkuc2V0dXBfZm9yY2VkCT0gYmNtNTR4eF9zZXR1cF9mb3JjZWQsCisJLnBvbGxfbGluawk9IGdlbm1paV9wb2xsX2xpbmssCisJLnJlYWRfbGluawk9IGJjbTU0eHhfcmVhZF9saW5rLAorfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5X2RlZiBiY201NDAwX3BoeV9kZWYgPSB7CisJLnBoeV9pZAkJPSAweDAwMjA2MDQwLAorCS5waHlfaWRfbWFzawk9IDB4ZmZmZmZmZjAsCisJLm5hbWUJCT0gIkJDTTU0MDAiLAorCS5mZWF0dXJlcwk9IE1JSV9HQklUX0ZFQVRVUkVTLAorCS5tYWdpY19hbmVnCT0gMSwKKwkub3BzCQk9ICZiY201NDAwX3BoeV9vcHMKK307CisKKy8qIEJyb2FkY29tIEJDTSA1NDAxICovCitzdGF0aWMgc3RydWN0IG1paV9waHlfb3BzIGJjbTU0MDFfcGh5X29wcyA9IHsKKwkuaW5pdAkJPSBiY201NDAxX2luaXQsCisJLnN1c3BlbmQJPSBiY201NDAxX3N1c3BlbmQsCisJLnNldHVwX2FuZWcJPSBiY201NHh4X3NldHVwX2FuZWcsCisJLnNldHVwX2ZvcmNlZAk9IGJjbTU0eHhfc2V0dXBfZm9yY2VkLAorCS5wb2xsX2xpbmsJPSBnZW5taWlfcG9sbF9saW5rLAorCS5yZWFkX2xpbmsJPSBiY201NHh4X3JlYWRfbGluaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9kZWYgYmNtNTQwMV9waHlfZGVmID0geworCS5waHlfaWQJCT0gMHgwMDIwNjA1MCwKKwkucGh5X2lkX21hc2sJPSAweGZmZmZmZmYwLAorCS5uYW1lCQk9ICJCQ001NDAxIiwKKwkuZmVhdHVyZXMJPSBNSUlfR0JJVF9GRUFUVVJFUywKKwkubWFnaWNfYW5lZwk9IDEsCisJLm9wcwkJPSAmYmNtNTQwMV9waHlfb3BzCit9OworCisvKiBCcm9hZGNvbSBCQ00gNTQxMSAqLworc3RhdGljIHN0cnVjdCBtaWlfcGh5X29wcyBiY201NDExX3BoeV9vcHMgPSB7CisJLmluaXQJCT0gYmNtNTQxMV9pbml0LAorCS5zdXNwZW5kCT0gYmNtNTQxMV9zdXNwZW5kLAorCS5zZXR1cF9hbmVnCT0gYmNtNTR4eF9zZXR1cF9hbmVnLAorCS5zZXR1cF9mb3JjZWQJPSBiY201NHh4X3NldHVwX2ZvcmNlZCwKKwkucG9sbF9saW5rCT0gZ2VubWlpX3BvbGxfbGluaywKKwkucmVhZF9saW5rCT0gYmNtNTR4eF9yZWFkX2xpbmssCit9OworCitzdGF0aWMgc3RydWN0IG1paV9waHlfZGVmIGJjbTU0MTFfcGh5X2RlZiA9IHsKKwkucGh5X2lkCQk9IDB4MDAyMDYwNzAsCisJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKKwkubmFtZQkJPSAiQkNNNTQxMSIsCisJLmZlYXR1cmVzCT0gTUlJX0dCSVRfRkVBVFVSRVMsCisJLm1hZ2ljX2FuZWcJPSAxLAorCS5vcHMJCT0gJmJjbTU0MTFfcGh5X29wcworfTsKKworLyogQnJvYWRjb20gQkNNIDU0MjEgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9vcHMgYmNtNTQyMV9waHlfb3BzID0geworCS5pbml0CQk9IGJjbTU0MjFfaW5pdCwKKwkuc3VzcGVuZAk9IGJjbTU0MTFfc3VzcGVuZCwKKwkuc2V0dXBfYW5lZwk9IGJjbTU0eHhfc2V0dXBfYW5lZywKKwkuc2V0dXBfZm9yY2VkCT0gYmNtNTR4eF9zZXR1cF9mb3JjZWQsCisJLnBvbGxfbGluawk9IGdlbm1paV9wb2xsX2xpbmssCisJLnJlYWRfbGluawk9IGJjbTU0eHhfcmVhZF9saW5rLAorfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5X2RlZiBiY201NDIxX3BoeV9kZWYgPSB7CisJLnBoeV9pZAkJPSAweDAwMjA2MGUwLAorCS5waHlfaWRfbWFzawk9IDB4ZmZmZmZmZjAsCisJLm5hbWUJCT0gIkJDTTU0MjEiLAorCS5mZWF0dXJlcwk9IE1JSV9HQklUX0ZFQVRVUkVTLAorCS5tYWdpY19hbmVnCT0gMSwKKwkub3BzCQk9ICZiY201NDIxX3BoeV9vcHMKK307CisKKy8qIEJyb2FkY29tIEJDTSA1NDIxIGJ1aWx0LWluIEsyICovCitzdGF0aWMgc3RydWN0IG1paV9waHlfb3BzIGJjbTU0MjFrMl9waHlfb3BzID0geworCS5pbml0CQk9IGJjbTU0MjFrMl9pbml0LAorCS5zdXNwZW5kCT0gYmNtNTQxMV9zdXNwZW5kLAorCS5zZXR1cF9hbmVnCT0gYmNtNTR4eF9zZXR1cF9hbmVnLAorCS5zZXR1cF9mb3JjZWQJPSBiY201NHh4X3NldHVwX2ZvcmNlZCwKKwkucG9sbF9saW5rCT0gZ2VubWlpX3BvbGxfbGluaywKKwkucmVhZF9saW5rCT0gYmNtNTR4eF9yZWFkX2xpbmssCit9OworCitzdGF0aWMgc3RydWN0IG1paV9waHlfZGVmIGJjbTU0MjFrMl9waHlfZGVmID0geworCS5waHlfaWQJCT0gMHgwMDIwNjJlMCwKKwkucGh5X2lkX21hc2sJPSAweGZmZmZmZmYwLAorCS5uYW1lCQk9ICJCQ001NDIxLUsyIiwKKwkuZmVhdHVyZXMJPSBNSUlfR0JJVF9GRUFUVVJFUywKKwkubWFnaWNfYW5lZwk9IDEsCisJLm9wcwkJPSAmYmNtNTQyMWsyX3BoeV9vcHMKK307CisKKy8qIE1hcnZlbGwgODhFMTEwMSAoQXBwbGUgc2VlbSB0byBkZWFsIHdpdGggMiBkaWZmZXJlbnQgcmV2cywKKyAqIEkgbWFza2VkIG91dCB0aGUgOCBsYXN0IGJpdHMgdG8gZ2V0IGJvdGgsIGJ1dCBzb21lIHNwZWNzCisgKiB3b3VsZCBiZSB1c2VmdWwgaGVyZSkgLS1CZW5ILgorICovCitzdGF0aWMgc3RydWN0IG1paV9waHlfb3BzIG1hcnZlbGxfcGh5X29wcyA9IHsKKwkuc2V0dXBfYW5lZwk9IG1hcnZlbGxfc2V0dXBfYW5lZywKKwkuc2V0dXBfZm9yY2VkCT0gbWFydmVsbF9zZXR1cF9mb3JjZWQsCisJLnBvbGxfbGluawk9IGdlbm1paV9wb2xsX2xpbmssCisJLnJlYWRfbGluawk9IG1hcnZlbGxfcmVhZF9saW5rCit9OworCitzdGF0aWMgc3RydWN0IG1paV9waHlfZGVmIG1hcnZlbGxfcGh5X2RlZiA9IHsKKwkucGh5X2lkCQk9IDB4MDE0MTBjMDAsCisJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmYwMCwKKwkubmFtZQkJPSAiTWFydmVsbCA4OEUxMTAxIiwKKwkuZmVhdHVyZXMJPSBNSUlfR0JJVF9GRUFUVVJFUywKKwkubWFnaWNfYW5lZwk9IDEsCisJLm9wcwkJPSAmbWFydmVsbF9waHlfb3BzCit9OworCisvKiBHZW5lcmljIGltcGxlbWVudGF0aW9uIGZvciBtb3N0IDEwLzEwMCBQSFlzICovCitzdGF0aWMgc3RydWN0IG1paV9waHlfb3BzIGdlbmVyaWNfcGh5X29wcyA9IHsKKwkuc2V0dXBfYW5lZwk9IGdlbm1paV9zZXR1cF9hbmVnLAorCS5zZXR1cF9mb3JjZWQJPSBnZW5taWlfc2V0dXBfZm9yY2VkLAorCS5wb2xsX2xpbmsJPSBnZW5taWlfcG9sbF9saW5rLAorCS5yZWFkX2xpbmsJPSBnZW5taWlfcmVhZF9saW5rCit9OworCitzdGF0aWMgc3RydWN0IG1paV9waHlfZGVmIGdlbm1paV9waHlfZGVmID0geworCS5waHlfaWQJCT0gMHgwMDAwMDAwMCwKKwkucGh5X2lkX21hc2sJPSAweDAwMDAwMDAwLAorCS5uYW1lCQk9ICJHZW5lcmljIE1JSSIsCisJLmZlYXR1cmVzCT0gTUlJX0JBU0lDX0ZFQVRVUkVTLAorCS5tYWdpY19hbmVnCT0gMCwKKwkub3BzCQk9ICZnZW5lcmljX3BoeV9vcHMKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9kZWYqIG1paV9waHlfdGFibGVbXSA9IHsKKwkmYmNtNTIwMV9waHlfZGVmLAorCSZiY201MjIxX3BoeV9kZWYsCisJJmJjbTU0MDBfcGh5X2RlZiwKKwkmYmNtNTQwMV9waHlfZGVmLAorCSZiY201NDExX3BoeV9kZWYsCisJJmJjbTU0MjFfcGh5X2RlZiwKKwkmYmNtNTQyMWsyX3BoeV9kZWYsCisJJm1hcnZlbGxfcGh5X2RlZiwKKwkmZ2VubWlpX3BoeV9kZWYsCisJTlVMTAorfTsKKworaW50IG1paV9waHlfcHJvYmUoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IG1paV9pZCkKK3sKKwlpbnQgcmM7CisJdTMyIGlkOworCXN0cnVjdCBtaWlfcGh5X2RlZiogZGVmOworCWludCBpOworCisJLyogV2UgZG8gbm90IHJlc2V0IHRoZSBtaWlfcGh5IHN0cnVjdHVyZSBhcyB0aGUgZHJpdmVyCisJICogbWF5IHJlLXByb2JlIHRoZSBQSFkgcmVndWxhcnkKKwkgKi8KKwlwaHktPm1paV9pZCA9IG1paV9pZDsKKwkKKwkvKiBUYWtlIFBIWSBvdXQgb2YgaXNsb2F0ZSBtb2RlIGFuZCByZXNldCBpdC4gKi8KKwlyYyA9IHJlc2V0X29uZV9taWlfcGh5KHBoeSwgbWlpX2lkKTsKKwlpZiAocmMpCisJCWdvdG8gZmFpbDsKKworCS8qIFJlYWQgSUQgYW5kIGZpbmQgbWF0Y2hpbmcgZW50cnkgKi8JCisJaWQgPSAocGh5X3JlYWQocGh5LCBNSUlfUEhZU0lEMSkgPDwgMTYgfCBwaHlfcmVhZChwaHksIE1JSV9QSFlTSUQyKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlBIWSBJRDogJXgsIGFkZHI6ICV4XG4iLCBpZCwgbWlpX2lkKTsKKwlmb3IgKGk9MDsgKGRlZiA9IG1paV9waHlfdGFibGVbaV0pICE9IE5VTEw7IGkrKykKKwkJaWYgKChpZCAmIGRlZi0+cGh5X2lkX21hc2spID09IGRlZi0+cGh5X2lkKQorCQkJYnJlYWs7CisJLyogU2hvdWxkIG5ldmVyIGJlIE5VTEwgKHdlIGhhdmUgYSBnZW5lcmljIGVudHJ5KSwgYnV0Li4uICovCisJaWYgKGRlZiA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwlwaHktPmRlZiA9IGRlZjsKKwkKKwlyZXR1cm4gMDsKK2ZhaWw6CisJcGh5LT5zcGVlZCA9IDA7CisJcGh5LT5kdXBsZXggPSAwOworCXBoeS0+cGF1c2UgPSAwOworCXBoeS0+YWR2ZXJ0aXNpbmcgPSAwOworCXJldHVybiAtRU5PREVWOworfQorCitFWFBPUlRfU1lNQk9MKG1paV9waHlfcHJvYmUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmggYi9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIyY2I1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bmdlbV9waHkuaApAQCAtMCwwICsxLDExNyBAQAorI2lmbmRlZiBfX1NVTkdFTV9QSFlfSF9fCisjZGVmaW5lIF9fU1VOR0VNX1BIWV9IX18KKworc3RydWN0IG1paV9waHk7CisKKy8qIE9wZXJhdGlvbnMgc3VwcG9ydGVkIGJ5IGFueSBraW5kIG9mIFBIWSAqLworc3RydWN0IG1paV9waHlfb3BzCit7CisJaW50CQkoKmluaXQpKHN0cnVjdCBtaWlfcGh5ICpwaHkpOworCWludAkJKCpzdXNwZW5kKShzdHJ1Y3QgbWlpX3BoeSAqcGh5KTsKKwlpbnQJCSgqc2V0dXBfYW5lZykoc3RydWN0IG1paV9waHkgKnBoeSwgdTMyIGFkdmVydGlzZSk7CisJaW50CQkoKnNldHVwX2ZvcmNlZCkoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IHNwZWVkLCBpbnQgZmQpOworCWludAkJKCpwb2xsX2xpbmspKHN0cnVjdCBtaWlfcGh5ICpwaHkpOworCWludAkJKCpyZWFkX2xpbmspKHN0cnVjdCBtaWlfcGh5ICpwaHkpOworfTsKKworLyogU3RydWN0dXJlIHVzZWQgdG8gc3RhdGljYWxseSBkZWZpbmUgYW4gbWlpL2dpaSBiYXNlZCBQSFkgKi8KK3N0cnVjdCBtaWlfcGh5X2RlZgoreworCXUzMgkJCQlwaHlfaWQ7CQkvKiBDb25jYXRlbmF0ZWQgSUQxIDw8IDE2IHwgSUQyICovCisJdTMyCQkJCXBoeV9pZF9tYXNrOwkvKiBTaWduaWZpY2FudCBiaXRzICovCisJdTMyCQkJCWZlYXR1cmVzOwkvKiBFdGh0b29sIFNVUFBPUlRFRF8qIGRlZmluZXMgKi8KKwlpbnQJCQkJbWFnaWNfYW5lZzsJLyogQXV0b25lZyBkb2VzIGFsbCBzcGVlZCB0ZXN0IGZvciB1cyAqLworCWNvbnN0IGNoYXIqCQkJbmFtZTsKKwljb25zdCBzdHJ1Y3QgbWlpX3BoeV9vcHMqCW9wczsKK307CisKKy8qIEFuIGluc3RhbmNlIG9mIGEgUEhZLCBwYXJ0aWFsbHkgYm9ycm93ZWQgZnJvbSBtaWlfaWZfaW5mbyAqLworc3RydWN0IG1paV9waHkKK3sKKwlzdHJ1Y3QgbWlpX3BoeV9kZWYqCWRlZjsKKwlpbnQJCQlhZHZlcnRpc2luZzsKKwlpbnQJCQltaWlfaWQ7CisKKwkvKiAxOiBhdXRvbmVnIGVuYWJsZWQsIDA6IGRpc2FibGVkICovCisJaW50CQkJYXV0b25lZzsKKworCS8qIGZvcmNlZCBzcGVlZCAmIGR1cGxleCAobm8gYXV0b25lZykKKwkgKiBwYXJ0bmVyIHNwZWVkICYgZHVwbGV4ICYgcGF1c2UgKGF1dG9uZWcpCisJICovCisJaW50CQkJc3BlZWQ7CisJaW50CQkJZHVwbGV4OworCWludAkJCXBhdXNlOworCisJLyogUHJvdmlkZWQgYnkgaG9zdCBjaGlwICovCisJc3RydWN0IG5ldF9kZXZpY2UqCWRldjsKKwlpbnQgKCptZGlvX3JlYWQpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnKTsKKwl2b2lkICgqbWRpb193cml0ZSkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWcsIGludCB2YWwpOworfTsKKworLyogUGFzcyBpbiBhIHN0cnVjdCBtaWlfcGh5IHdpdGggZGV2LCBtZGlvX3JlYWQgYW5kIG1kaW9fd3JpdGUKKyAqIGZpbGxlZCwgdGhlIHJlbWFpbmluZyBmaWVsZHMgd2lsbCBiZSBmaWxsZWQgb24gcmV0dXJuCisgKi8KK2V4dGVybiBpbnQgbWlpX3BoeV9wcm9iZShzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgbWlpX2lkKTsKKworCisvKiBNSUkgZGVmaW5pdGlvbnMgbWlzc2luZyBmcm9tIG1paS5oICovCisKKyNkZWZpbmUgQk1DUl9TUEQyCTB4MDA0MAkJLyogR2lnYWJpdCBlbmFibGUgKGJjbTU0eHgpCSovCisjZGVmaW5lIExQQV9QQVVTRQkweDA0MDAKKworLyogTW9yZSBQSFkgcmVnaXN0ZXJzIChtb2RlbCBzcGVjaWZpYykgKi8KKworLyogTUlJIEJDTTUyMDEgTVVMVElQSFkgaW50ZXJydXB0IHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CQ001MjAxX0lOVEVSUlVQVAkJCTB4MUEKKyNkZWZpbmUgTUlJX0JDTTUyMDFfSU5URVJSVVBUX0lOVEVOQUJMRQkJMHg0MDAwCisKKyNkZWZpbmUgTUlJX0JDTTUyMDFfQVVYTU9ERTIJCQkweDFCCisjZGVmaW5lIE1JSV9CQ001MjAxX0FVWE1PREUyX0xPV1BPV0VSCQkweDAwMDgKKworI2RlZmluZSBNSUlfQkNNNTIwMV9NVUxUSVBIWSAgICAgICAgICAgICAgICAgICAgMHgxRQorCisvKiBNSUkgQkNNNTIwMSBNVUxUSVBIWSByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIE1JSV9CQ001MjAxX01VTFRJUEhZX1NFUklBTE1PREUgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTUlJX0JDTTUyMDFfTVVMVElQSFlfU1VQRVJJU09MQVRFICAgICAgIDB4MDAwOAorCisvKiBNSUkgQkNNNTIyMSBBZGRpdGlvbmFsIHJlZ2lzdGVycyAqLworI2RlZmluZSBNSUlfQkNNNTIyMV9URVNUCQkJMHgxZgorI2RlZmluZSBNSUlfQkNNNTIyMV9URVNUX0VOQUJMRV9TSEFET1dTCQkweDAwODAKKyNkZWZpbmUgTUlJX0JDTTUyMjFfU0hET1dfQVVYX1NUQVQyCQkweDFiCisjZGVmaW5lIE1JSV9CQ001MjIxX1NIRE9XX0FVWF9TVEFUMl9BUEQJCTB4MDAyMAorI2RlZmluZSBNSUlfQkNNNTIyMV9TSERPV19BVVhfTU9ERTQJCTB4MWEKKyNkZWZpbmUgTUlJX0JDTTUyMjFfU0hET1dfQVVYX01PREU0X0lERFFNT0RFCTB4MDAwMQorI2RlZmluZSBNSUlfQkNNNTIyMV9TSERPV19BVVhfTU9ERTRfQ0xLTE9QV1IJMHgwMDA0CisKKy8qIE1JSSBCQ001NDAwIDEwMDAtQkFTRVQgQ29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQkNNNTQwMF9HQl9DT05UUk9MCQkJMHgwOQorI2RlZmluZSBNSUlfQkNNNTQwMF9HQl9DT05UUk9MX0ZVTExEVVBMRVhDQVAJMHgwMjAwCisKKy8qIE1JSSBCQ001NDAwIEFVWENPTlRST0wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0JDTTU0MDBfQVVYQ09OVFJPTCAgICAgICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgTUlJX0JDTTU0MDBfQVVYQ09OVFJPTF9QV1IxMEJBU0VUICAgICAgIDB4MDAwNAorCisvKiBNSUkgQkNNNTQwMCBBVVhTVEFUVVMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0JDTTU0MDBfQVVYU1RBVFVTICAgICAgICAgICAgICAgICAgIDB4MTkKKyNkZWZpbmUgTUlJX0JDTTU0MDBfQVVYU1RBVFVTX0xJTktNT0RFX01BU0sgICAgIDB4MDcwMAorI2RlZmluZSBNSUlfQkNNNTQwMF9BVVhTVEFUVVNfTElOS01PREVfU0hJRlQgICAgOCAgCisKKy8qIDEwMDBCVCBjb250cm9sIChNYXJ2ZWxsICYgQkNNNTR4eCBhdCBsZWFzdCkgKi8KKyNkZWZpbmUgTUlJXzEwMDBCQVNFVENPTlRST0wJCQkweDA5CisjZGVmaW5lIE1JSV8xMDAwQkFTRVRDT05UUk9MX0ZVTExEVVBMRVhDQVAJMHgwMjAwCisjZGVmaW5lIE1JSV8xMDAwQkFTRVRDT05UUk9MX0hBTEZEVVBMRVhDQVAJMHgwMTAwCisKKy8qIE1hcnZlbGwgODhFMTAxMSBQSFkgY29udHJvbCAqLworI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfQ09OVFJPTAkJMHgxMAorI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfQ09OVFJPTF9NQU5VQUxfTURJWAkweDIwCisjZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19DT05UUk9MX0FVVE9fTURJWAkweDQwCisKKy8qIE1hcnZlbGwgODhFMTAxMSBQSFkgc3RhdHVzICovCisjZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVMJCTB4MTEKKyNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU18xMDAwCQkweDgwMDAKKyNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU18xMDAJCTB4NDAwMAorI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTX1NQRF9NQVNLCTB4YzAwMAorI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTX0ZVTExEVVBMRVgJMHgyMDAwCisjZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfUkVTT0xWRUQJMHgwODAwCisKKyNlbmRpZiAvKiBfX1NVTkdFTV9QSFlfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5obWUuYyBiL2RyaXZlcnMvbmV0L3N1bmhtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MzdiM2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW5obWUuYwpAQCAtMCwwICsxLDM0MjYgQEAKKy8qICRJZDogc3VuaG1lLmMsdiAxLjEyNCAyMDAyLzAxLzE1IDA2OjI1OjUxIGRhdmVtIEV4cCAkCisgKiBzdW5obWUuYzogU3BhcmMgSE1FL0JpZ01hYyAxMC8xMDBiYXNlVCBoYWxmL2Z1bGwgZHVwbGV4IGF1dG8gc3dpdGNoaW5nLAorICogICAgICAgICAgIGF1dG8gY2FycmllciBkZXRlY3RpbmcgZXRoZXJuZXQgZHJpdmVyLiAgQWxzbyBrbm93biBhcyB0aGUKKyAqICAgICAgICAgICAiSGFwcHkgTWVhbCBFdGhlcm5ldCIgZm91bmQgb24gU3VuU3dpZnQgU0JVUyBjYXJkcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDE5OTksIDIwMDIsIDIwMDMgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICoKKyAqIENoYW5nZXMgOgorICogMjAwMC8xMS8xMSBXaWxseSBUYXJyZWF1IDx3aWxseSBBVCBtZXRhLXgub3JnPgorICogICAtIHBvcnQgdG8gbm9uLXNwYXJjIGFyY2hpdGVjdHVyZXMuIFRlc3RlZCBvbmx5IG9uIHg4NiBhbmQKKyAqICAgICBvbmx5IGN1cnJlbnRseSB3b3JrcyB3aXRoIFFGRSBQQ0kgY2FyZHMuCisgKiAgIC0gYWJpbGl0eSB0byBzcGVjaWZ5IHRoZSBNQUMgYWRkcmVzcyBhdCBtb2R1bGUgbG9hZCB0aW1lIGJ5IHBhc3NpbmcgdGhpcworICogICAgIGFyZ3VtZW50IDogbWFjYWRkcj0weDAwLDB4MTAsMHgyMCwweDMwLDB4NDAsMHg1MAorICovCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSA9CisgICAgICAgICJzdW5obWUuYzp2Mi4wMiAyNC9BdWcvMjAwMyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pXG4iOworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaWZkZWYgX19zcGFyY19fCisjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9zYnVzLmg+CisjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CisjaWZuZGVmIF9fc3BhcmNfdjlfXworI2luY2x1ZGUgPGFzbS9pby11bml0Lmg+CisjZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2lmZGVmIENPTkZJR19QQ0kKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpZmRlZiBfX3NwYXJjX18KKyNpbmNsdWRlIDxhc20vcGJtLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAic3VuaG1lLmgiCisKKworI2RlZmluZSBEUlZfTkFNRSAic3VuaG1lIgorCitzdGF0aWMgaW50IG1hY2FkZHJbNl07CisKKy8qIGFjY2VwdCBNQUMgYWRkcmVzcyBvZiB0aGUgZm9ybSBtYWNhZGRyPTB4MDgsMHgwMCwweDIwLDB4MzAsMHg0MCwweDUwICovCittb2R1bGVfcGFyYW1fYXJyYXkobWFjYWRkciwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWFjYWRkciwgIkhhcHB5IE1lYWwgTUFDIGFkZHJlc3MgdG8gc2V0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3QgaGFwcHlfbWVhbCAqcm9vdF9oYXBweV9kZXY7CisKKyNpZmRlZiBDT05GSUdfU0JVUworc3RhdGljIHN0cnVjdCBxdWF0dHJvICpxZmVfc2J1c19saXN0OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgc3RydWN0IHF1YXR0cm8gKnFmZV9wY2lfbGlzdDsKKyNlbmRpZgorCisjdW5kZWYgSE1FREVCVUcKKyN1bmRlZiBTWERFQlVHCisjdW5kZWYgUlhERUJVRworI3VuZGVmIFRYREVCVUcKKyN1bmRlZiBUWExPR0dJTkcKKworI2lmZGVmIFRYTE9HR0lORworc3RydWN0IGhtZV90eF9sb2dlbnQgeworCXVuc2lnbmVkIGludCB0c3RhbXA7CisJaW50IHR4X25ldywgdHhfb2xkOworCXVuc2lnbmVkIGludCBhY3Rpb247CisjZGVmaW5lIFRYTE9HX0FDVElPTl9JUlEJMHgwMQorI2RlZmluZSBUWExPR19BQ1RJT05fVFhNSVQJMHgwMgorI2RlZmluZSBUWExPR19BQ1RJT05fVEJVU1kJMHgwNAorI2RlZmluZSBUWExPR19BQ1RJT05fTkJVRlMJMHgwOAorCXVuc2lnbmVkIGludCBzdGF0dXM7Cit9OworI2RlZmluZSBUWF9MT0dfTEVOCTEyOAorc3RhdGljIHN0cnVjdCBobWVfdHhfbG9nZW50IHR4X2xvZ1tUWF9MT0dfTEVOXTsKK3N0YXRpYyBpbnQgdHhsb2dfY3VyX2VudHJ5Oworc3RhdGljIF9faW5saW5lX18gdm9pZCB0eF9hZGRfbG9nKHN0cnVjdCBoYXBweV9tZWFsICpocCwgdW5zaWduZWQgaW50IGEsIHVuc2lnbmVkIGludCBzKQoreworCXN0cnVjdCBobWVfdHhfbG9nZW50ICp0bHA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNhdmVfYW5kX2NsaShmbGFncyk7CisJdGxwID0gJnR4X2xvZ1t0eGxvZ19jdXJfZW50cnldOworCXRscC0+dHN0YW1wID0gKHVuc2lnbmVkIGludClqaWZmaWVzOworCXRscC0+dHhfbmV3ID0gaHAtPnR4X25ldzsKKwl0bHAtPnR4X29sZCA9IGhwLT50eF9vbGQ7CisJdGxwLT5hY3Rpb24gPSBhOworCXRscC0+c3RhdHVzID0gczsKKwl0eGxvZ19jdXJfZW50cnkgPSAodHhsb2dfY3VyX2VudHJ5ICsgMSkgJiAoVFhfTE9HX0xFTiAtIDEpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCB0eF9kdW1wX2xvZyh2b2lkKQoreworCWludCBpLCB0aGlzOworCisJdGhpcyA9IHR4bG9nX2N1cl9lbnRyeTsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfTE9HX0xFTjsgaSsrKSB7CisJCXByaW50aygiVFhMT0dbJWRdOiBqWyUwOHhdIHR4W04oJWQpTyglZCldIGFjdGlvblslMDh4XSBzdGF0WyUwOHhdXG4iLCBpLAorCQkgICAgICAgdHhfbG9nW3RoaXNdLnRzdGFtcCwKKwkJICAgICAgIHR4X2xvZ1t0aGlzXS50eF9uZXcsIHR4X2xvZ1t0aGlzXS50eF9vbGQsCisJCSAgICAgICB0eF9sb2dbdGhpc10uYWN0aW9uLCB0eF9sb2dbdGhpc10uc3RhdHVzKTsKKwkJdGhpcyA9ICh0aGlzICsgMSkgJiAoVFhfTE9HX0xFTiAtIDEpOworCX0KK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgdHhfZHVtcF9yaW5nKHN0cnVjdCBoYXBweV9tZWFsICpocCkKK3sKKwlzdHJ1Y3QgaG1lYWxfaW5pdF9ibG9jayAqaGIgPSBocC0+aGFwcHlfYmxvY2s7CisJc3RydWN0IGhhcHB5X21lYWxfdHhkICp0cCA9ICZoYi0+aGFwcHlfbWVhbF90eGRbMF07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKz00KSB7CisJCXByaW50aygiVFhEWyVkLi4lZF06IFslMDh4OiUwOHhdIFslMDh4OiUwOHhdIFslMDh4OiUwOHhdIFslMDh4OiUwOHhdXG4iLAorCQkgICAgICAgaSwgaSArIDQsCisJCSAgICAgICBsZTMyX3RvX2NwdSh0cFtpXS50eF9mbGFncyksIGxlMzJfdG9fY3B1KHRwW2ldLnR4X2FkZHIpLAorCQkgICAgICAgbGUzMl90b19jcHUodHBbaSArIDFdLnR4X2ZsYWdzKSwgbGUzMl90b19jcHUodHBbaSArIDFdLnR4X2FkZHIpLAorCQkgICAgICAgbGUzMl90b19jcHUodHBbaSArIDJdLnR4X2ZsYWdzKSwgbGUzMl90b19jcHUodHBbaSArIDJdLnR4X2FkZHIpLAorCQkgICAgICAgbGUzMl90b19jcHUodHBbaSArIDNdLnR4X2ZsYWdzKSwgbGUzMl90b19jcHUodHBbaSArIDNdLnR4X2FkZHIpKTsKKwl9Cit9CisjZWxzZQorI2RlZmluZSB0eF9hZGRfbG9nKGhwLCBhLCBzKQkJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIHR4X2R1bXBfbG9nKCkJCQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgdHhfZHVtcF9yaW5nKGhwKQkJZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2lmZGVmIEhNRURFQlVHCisjZGVmaW5lIEhNRCh4KSAgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIEhNRCh4KQorI2VuZGlmCisKKy8qICNkZWZpbmUgQVVUT19TV0lUQ0hfREVCVUcgKi8KKworI2lmZGVmIEFVVE9fU1dJVENIX0RFQlVHCisjZGVmaW5lIEFTRCh4KSAgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIEFTRCh4KQorI2VuZGlmCisKKyNkZWZpbmUgREVGQVVMVF9JUEcwICAgICAgMTYgLyogRm9yIGxhbmNlLW1vZGUgb25seSAqLworI2RlZmluZSBERUZBVUxUX0lQRzEgICAgICAgOCAvKiBGb3IgYWxsIG1vZGVzICovCisjZGVmaW5lIERFRkFVTFRfSVBHMiAgICAgICA0IC8qIEZvciBhbGwgbW9kZXMgKi8KKyNkZWZpbmUgREVGQVVMVF9KQU1TSVpFICAgIDQgLyogVG9lIGphbSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKE1PRFVMRSkKKy8qIFRoaXMgaGFwcHlfcGNpX2lkcyBpcyBkZWNsYXJlZCBfX2luaXRkYXRhIGJlY2F1c2UgaXQgaXMgb25seSB1c2VkCisgICBhcyBhbiBhZHZpc29yeSB0byBkZXBtb2QuICBJZiB0aGlzIGlzIHBvcnRlZCB0byB0aGUgbmV3IFBDSSBpbnRlcmZhY2UKKyAgIHdoZXJlIGl0IGNvdWxkIGJlIHJlZmVyZW5jZWQgYXQgYW55IHRpbWUgZHVlIHRvIGhvdCBwbHVnZ2luZywKKyAgIHRoZSBfX2luaXRkYXRhIHJlZmVyZW5jZSBzaG91bGQgYmUgcmVtb3ZlZC4gKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGhhcHB5bWVhbF9wY2lfaWRzW10gPSB7CisJeworCSAgLnZlbmRvcgk9IFBDSV9WRU5ET1JfSURfU1VOLAorCSAgLmRldmljZQk9IFBDSV9ERVZJQ0VfSURfU1VOX0hBUFBZTUVBTCwKKwkgIC5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCSAgLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwl7IH0JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGhhcHB5bWVhbF9wY2lfaWRzKTsKKworI2VuZGlmCisKKy8qIE5PVEU6IEluIHRoZSBkZXNjcmlwdG9yIHdyaXRlcyBvbmUgX211c3RfIHdyaXRlIHRoZSBhZGRyZXNzCisgKgkgbWVtYmVyIF9maXJzdF8uICBUaGUgY2FyZCBtdXN0IG5vdCBiZSBhbGxvd2VkIHRvIHNlZQorICoJIHRoZSB1cGRhdGVkIGRlc2NyaXB0b3IgZmxhZ3MgdW50aWwgdGhlIGFkZHJlc3MgaXMKKyAqCSBjb3JyZWN0LiAgSSd2ZSBhZGRlZCBhIHdyaXRlIG1lbW9yeSBiYXJyaWVyIGJldHdlZW4KKyAqCSB0aGUgdHdvIHN0b3JlcyBzbyB0aGF0IEkgY2FuIHNsZWVwIHdlbGwgYXQgbmlnaHQuLi4gLURhdmVNCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NCVVMpICYmIGRlZmluZWQoQ09ORklHX1BDSSkKK3N0YXRpYyB2b2lkIHNidXNfaG1lX3dyaXRlMzIodm9pZCBfX2lvbWVtICpyZWcsIHUzMiB2YWwpCit7CisJc2J1c193cml0ZWwodmFsLCByZWcpOworfQorCitzdGF0aWMgdTMyIHNidXNfaG1lX3JlYWQzMih2b2lkIF9faW9tZW0gKnJlZykKK3sKKwlyZXR1cm4gc2J1c19yZWFkbChyZWcpOworfQorCitzdGF0aWMgdm9pZCBzYnVzX2htZV93cml0ZV9yeGQoc3RydWN0IGhhcHB5X21lYWxfcnhkICpyeGQsIHUzMiBmbGFncywgdTMyIGFkZHIpCit7CisJcnhkLT5yeF9hZGRyID0gYWRkcjsKKwl3bWIoKTsKKwlyeGQtPnJ4X2ZsYWdzID0gZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkIHNidXNfaG1lX3dyaXRlX3R4ZChzdHJ1Y3QgaGFwcHlfbWVhbF90eGQgKnR4ZCwgdTMyIGZsYWdzLCB1MzIgYWRkcikKK3sKKwl0eGQtPnR4X2FkZHIgPSBhZGRyOworCXdtYigpOworCXR4ZC0+dHhfZmxhZ3MgPSBmbGFnczsKK30KKworc3RhdGljIHUzMiBzYnVzX2htZV9yZWFkX2Rlc2MzMih1MzIgKnApCit7CisJcmV0dXJuICpwOworfQorCitzdGF0aWMgdm9pZCBwY2lfaG1lX3dyaXRlMzIodm9pZCBfX2lvbWVtICpyZWcsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgcmVnKTsKK30KKworc3RhdGljIHUzMiBwY2lfaG1lX3JlYWQzMih2b2lkIF9faW9tZW0gKnJlZykKK3sKKwlyZXR1cm4gcmVhZGwocmVnKTsKK30KKworc3RhdGljIHZvaWQgcGNpX2htZV93cml0ZV9yeGQoc3RydWN0IGhhcHB5X21lYWxfcnhkICpyeGQsIHUzMiBmbGFncywgdTMyIGFkZHIpCit7CisJcnhkLT5yeF9hZGRyID0gY3B1X3RvX2xlMzIoYWRkcik7CisJd21iKCk7CisJcnhkLT5yeF9mbGFncyA9IGNwdV90b19sZTMyKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcGNpX2htZV93cml0ZV90eGQoc3RydWN0IGhhcHB5X21lYWxfdHhkICp0eGQsIHUzMiBmbGFncywgdTMyIGFkZHIpCit7CisJdHhkLT50eF9hZGRyID0gY3B1X3RvX2xlMzIoYWRkcik7CisJd21iKCk7CisJdHhkLT50eF9mbGFncyA9IGNwdV90b19sZTMyKGZsYWdzKTsKK30KKworc3RhdGljIHUzMiBwY2lfaG1lX3JlYWRfZGVzYzMyKHUzMiAqcCkKK3sKKwlyZXR1cm4gY3B1X3RvX2xlMzJwKHApOworfQorCisjZGVmaW5lIGhtZV93cml0ZTMyKF9faHAsIF9fcmVnLCBfX3ZhbCkgXAorCSgoX19ocCktPndyaXRlMzIoKF9fcmVnKSwgKF9fdmFsKSkpCisjZGVmaW5lIGhtZV9yZWFkMzIoX19ocCwgX19yZWcpIFwKKwkoKF9faHApLT5yZWFkMzIoX19yZWcpKQorI2RlZmluZSBobWVfd3JpdGVfcnhkKF9faHAsIF9fcnhkLCBfX2ZsYWdzLCBfX2FkZHIpIFwKKwkoKF9faHApLT53cml0ZV9yeGQoKF9fcnhkKSwgKF9fZmxhZ3MpLCAoX19hZGRyKSkpCisjZGVmaW5lIGhtZV93cml0ZV90eGQoX19ocCwgX190eGQsIF9fZmxhZ3MsIF9fYWRkcikgXAorCSgoX19ocCktPndyaXRlX3R4ZCgoX190eGQpLCAoX19mbGFncyksIChfX2FkZHIpKSkKKyNkZWZpbmUgaG1lX3JlYWRfZGVzYzMyKF9faHAsIF9fcCkgXAorCSgoX19ocCktPnJlYWRfZGVzYzMyKF9fcCkpCisjZGVmaW5lIGhtZV9kbWFfbWFwKF9faHAsIF9fcHRyLCBfX3NpemUsIF9fZGlyKSBcCisJKChfX2hwKS0+ZG1hX21hcCgoX19ocCktPmhhcHB5X2RldiwgKF9fcHRyKSwgKF9fc2l6ZSksIChfX2RpcikpKQorI2RlZmluZSBobWVfZG1hX3VubWFwKF9faHAsIF9fYWRkciwgX19zaXplLCBfX2RpcikgXAorCSgoX19ocCktPmRtYV91bm1hcCgoX19ocCktPmhhcHB5X2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKSkKKyNkZWZpbmUgaG1lX2RtYV9zeW5jX2Zvcl9jcHUoX19ocCwgX19hZGRyLCBfX3NpemUsIF9fZGlyKSBcCisJKChfX2hwKS0+ZG1hX3N5bmNfZm9yX2NwdSgoX19ocCktPmhhcHB5X2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKSkKKyNkZWZpbmUgaG1lX2RtYV9zeW5jX2Zvcl9kZXZpY2UoX19ocCwgX19hZGRyLCBfX3NpemUsIF9fZGlyKSBcCisJKChfX2hwKS0+ZG1hX3N5bmNfZm9yX2RldmljZSgoX19ocCktPmhhcHB5X2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKSkKKyNlbHNlCisjaWZkZWYgQ09ORklHX1NCVVMKKy8qIFNCVVMgb25seSBjb21waWxhdGlvbiAqLworI2RlZmluZSBobWVfd3JpdGUzMihfX2hwLCBfX3JlZywgX192YWwpIFwKKwlzYnVzX3dyaXRlbCgoX192YWwpLCAoX19yZWcpKQorI2RlZmluZSBobWVfcmVhZDMyKF9faHAsIF9fcmVnKSBcCisJc2J1c19yZWFkbChfX3JlZykKKyNkZWZpbmUgaG1lX3dyaXRlX3J4ZChfX2hwLCBfX3J4ZCwgX19mbGFncywgX19hZGRyKSBcCitkbyB7CShfX3J4ZCktPnJ4X2FkZHIgPSAoX19hZGRyKTsgXAorCXdtYigpOyBcCisJKF9fcnhkKS0+cnhfZmxhZ3MgPSAoX19mbGFncyk7IFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgaG1lX3dyaXRlX3R4ZChfX2hwLCBfX3R4ZCwgX19mbGFncywgX19hZGRyKSBcCitkbyB7CShfX3R4ZCktPnR4X2FkZHIgPSAoX19hZGRyKTsgXAorCXdtYigpOyBcCisJKF9fdHhkKS0+dHhfZmxhZ3MgPSAoX19mbGFncyk7IFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgaG1lX3JlYWRfZGVzYzMyKF9faHAsIF9fcCkJKCooX19wKSkKKyNkZWZpbmUgaG1lX2RtYV9tYXAoX19ocCwgX19wdHIsIF9fc2l6ZSwgX19kaXIpIFwKKwlzYnVzX21hcF9zaW5nbGUoKF9faHApLT5oYXBweV9kZXYsIChfX3B0ciksIChfX3NpemUpLCAoX19kaXIpKQorI2RlZmluZSBobWVfZG1hX3VubWFwKF9faHAsIF9fYWRkciwgX19zaXplLCBfX2RpcikgXAorCXNidXNfdW5tYXBfc2luZ2xlKChfX2hwKS0+aGFwcHlfZGV2LCAoX19hZGRyKSwgKF9fc2l6ZSksIChfX2RpcikpCisjZGVmaW5lIGhtZV9kbWFfc3luY19mb3JfY3B1KF9faHAsIF9fYWRkciwgX19zaXplLCBfX2RpcikgXAorCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoKF9faHApLT5oYXBweV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkKKyNkZWZpbmUgaG1lX2RtYV9zeW5jX2Zvcl9kZXZpY2UoX19ocCwgX19hZGRyLCBfX3NpemUsIF9fZGlyKSBcCisJc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgoX19ocCktPmhhcHB5X2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKQorI2Vsc2UKKy8qIFBDSSBvbmx5IGNvbXBpbGF0aW9uICovCisjZGVmaW5lIGhtZV93cml0ZTMyKF9faHAsIF9fcmVnLCBfX3ZhbCkgXAorCXdyaXRlbCgoX192YWwpLCAoX19yZWcpKQorI2RlZmluZSBobWVfcmVhZDMyKF9faHAsIF9fcmVnKSBcCisJcmVhZGwoX19yZWcpCisjZGVmaW5lIGhtZV93cml0ZV9yeGQoX19ocCwgX19yeGQsIF9fZmxhZ3MsIF9fYWRkcikgXAorZG8gewkoX19yeGQpLT5yeF9hZGRyID0gY3B1X3RvX2xlMzIoX19hZGRyKTsgXAorCXdtYigpOyBcCisJKF9fcnhkKS0+cnhfZmxhZ3MgPSBjcHVfdG9fbGUzMihfX2ZsYWdzKTsgXAorfSB3aGlsZSgwKQorI2RlZmluZSBobWVfd3JpdGVfdHhkKF9faHAsIF9fdHhkLCBfX2ZsYWdzLCBfX2FkZHIpIFwKK2RvIHsJKF9fdHhkKS0+dHhfYWRkciA9IGNwdV90b19sZTMyKF9fYWRkcik7IFwKKwl3bWIoKTsgXAorCShfX3R4ZCktPnR4X2ZsYWdzID0gY3B1X3RvX2xlMzIoX19mbGFncyk7IFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgaG1lX3JlYWRfZGVzYzMyKF9faHAsIF9fcCkJY3B1X3RvX2xlMzJwKF9fcCkKKyNkZWZpbmUgaG1lX2RtYV9tYXAoX19ocCwgX19wdHIsIF9fc2l6ZSwgX19kaXIpIFwKKwlwY2lfbWFwX3NpbmdsZSgoX19ocCktPmhhcHB5X2RldiwgKF9fcHRyKSwgKF9fc2l6ZSksIChfX2RpcikpCisjZGVmaW5lIGhtZV9kbWFfdW5tYXAoX19ocCwgX19hZGRyLCBfX3NpemUsIF9fZGlyKSBcCisJcGNpX3VubWFwX3NpbmdsZSgoX19ocCktPmhhcHB5X2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKQorI2RlZmluZSBobWVfZG1hX3N5bmNfZm9yX2NwdShfX2hwLCBfX2FkZHIsIF9fc2l6ZSwgX19kaXIpIFwKKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoKF9faHApLT5oYXBweV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkKKyNkZWZpbmUgaG1lX2RtYV9zeW5jX2Zvcl9kZXZpY2UoX19ocCwgX19hZGRyLCBfX3NpemUsIF9fZGlyKSBcCisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKChfX2hwKS0+aGFwcHlfZGV2LCAoX19hZGRyKSwgKF9fc2l6ZSksIChfX2RpcikpCisjZW5kaWYKKyNlbmRpZgorCisKKyNpZmRlZiBTQlVTX0RNQV9CSURJUkVDVElPTkFMCisjCWRlZmluZSBETUFfQklESVJFQ1RJT05BTAlTQlVTX0RNQV9CSURJUkVDVElPTkFMCisjZWxzZQorIwlkZWZpbmUgRE1BX0JJRElSRUNUSU9OQUwJMAorI2VuZGlmCisKKyNpZmRlZiBTQlVTX0RNQV9GUk9NREVWSUNFCisjCWRlZmluZSBETUFfRlJPTURFVklDRQkJU0JVU19ETUFfRlJPTURFVklDRQorI2Vsc2UKKyMJZGVmaW5lIERNQV9UT0RFVklDRQkJMQorI2VuZGlmCisKKyNpZmRlZiBTQlVTX0RNQV9UT0RFVklDRQorIwlkZWZpbmUgRE1BX1RPREVWSUNFCQlTQlVTX0RNQV9UT0RFVklDRQorI2Vsc2UKKyMJZGVmaW5lIERNQV9GUk9NREVWSUNFCQkyCisjZW5kaWYKKworCisvKiBPaCB5ZXMsIHRoZSBNSUYgQml0QmFuZyBpcyBtaWdodHkgZnVuIHRvIHByb2dyYW0uICBCaXRCdWNrZXQgaXMgbW9yZSBsaWtlIGl0LiAqLworc3RhdGljIHZvaWQgQkJfUFVUX0JJVChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHZvaWQgX19pb21lbSAqdHJlZ3MsIGludCBiaXQpCit7CisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9CQkRBVEEsIGJpdCk7CisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9CQkNMT0NLLCAwKTsKKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0JCQ0xPQ0ssIDEpOworfQorCisjaWYgMAorc3RhdGljIHUzMiBCQl9HRVRfQklUKHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICp0cmVncywgaW50IGludGVybmFsKQoreworCXUzMiByZXQ7CisKKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0JCQ0xPQ0ssIDApOworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQkJDTE9DSywgMSk7CisJcmV0ID0gaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRyk7CisJaWYgKGludGVybmFsKQorCQlyZXQgJj0gVENWX0NGR19NRElPMDsKKwllbHNlCisJCXJldCAmPSBUQ1ZfQ0ZHX01ESU8xOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgdTMyIEJCX0dFVF9CSVQyKHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICp0cmVncywgaW50IGludGVybmFsKQoreworCXUzMiByZXR2YWw7CisKKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0JCQ0xPQ0ssIDApOworCXVkZWxheSgxKTsKKwlyZXR2YWwgPSBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHKTsKKwlpZiAoaW50ZXJuYWwpCisJCXJldHZhbCAmPSBUQ1ZfQ0ZHX01ESU8wOworCWVsc2UKKwkJcmV0dmFsICY9IFRDVl9DRkdfTURJTzE7CisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9CQkNMT0NLLCAxKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgVENWUl9GQUlMVVJFICAgICAgMHg4MDAwMDAwMCAgICAgLyogSW1wb3NzaWJsZSBNSUYgcmVhZCB2YWx1ZSAqLworCitzdGF0aWMgaW50IGhhcHB5X21lYWxfYmJfcmVhZChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsCisJCQkgICAgICB2b2lkIF9faW9tZW0gKnRyZWdzLCBpbnQgcmVnKQoreworCXUzMiB0bXA7CisJaW50IHJldHZhbCA9IDA7CisJaW50IGk7CisKKwlBU0QoKCJoYXBweV9tZWFsX2JiX3JlYWQ6IHJlZz0lZCAiLCByZWcpKTsKKworCS8qIEVuYWJsZSB0aGUgTUlGIEJpdEJhbmcgb3V0cHV0cy4gKi8KKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0JCT0VOQUIsIDEpOworCisJLyogRm9yY2UgQml0QmFuZyBpbnRvIHRoZSBpZGxlIHN0YXRlLiAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlCQl9QVVRfQklUKGhwLCB0cmVncywgMSk7CisKKwkvKiBHaXZlIGl0IHRoZSByZWFkIHNlcXVlbmNlLiAqLworCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAwKTsKKwlCQl9QVVRfQklUKGhwLCB0cmVncywgMSk7CisJQkJfUFVUX0JJVChocCwgdHJlZ3MsIDEpOworCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAwKTsKKworCS8qIEdpdmUgaXQgdGhlIFBIWSBhZGRyZXNzLiAqLworCXRtcCA9IGhwLT5wYWRkciAmIDB4ZmY7CisJZm9yIChpID0gNDsgaSA+PSAwOyBpLS0pCisJCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAoKHRtcCA+PiBpKSAmIDEpKTsKKworCS8qIFRlbGwgaXQgd2hhdCByZWdpc3RlciB3ZSB3YW50IHRvIHJlYWQuICovCisJdG1wID0gKHJlZyAmIDB4ZmYpOworCWZvciAoaSA9IDQ7IGkgPj0gMDsgaS0tKQorCQlCQl9QVVRfQklUKGhwLCB0cmVncywgKCh0bXAgPj4gaSkgJiAxKSk7CisKKwkvKiBDbG9zZSBkb3duIHRoZSBNSUYgQml0QmFuZyBvdXRwdXRzLiAqLworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQkJPRU5BQiwgMCk7CisKKwkvKiBOb3cgcmVhZCBpbiB0aGUgdmFsdWUuICovCisJKHZvaWQpIEJCX0dFVF9CSVQyKGhwLCB0cmVncywgKGhwLT50Y3ZyX3R5cGUgPT0gaW50ZXJuYWwpKTsKKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pCisJCXJldHZhbCB8PSBCQl9HRVRfQklUMihocCwgdHJlZ3MsIChocC0+dGN2cl90eXBlID09IGludGVybmFsKSk7CisJKHZvaWQpIEJCX0dFVF9CSVQyKGhwLCB0cmVncywgKGhwLT50Y3ZyX3R5cGUgPT0gaW50ZXJuYWwpKTsKKwkodm9pZCkgQkJfR0VUX0JJVDIoaHAsIHRyZWdzLCAoaHAtPnRjdnJfdHlwZSA9PSBpbnRlcm5hbCkpOworCSh2b2lkKSBCQl9HRVRfQklUMihocCwgdHJlZ3MsIChocC0+dGN2cl90eXBlID09IGludGVybmFsKSk7CisJQVNEKCgidmFsdWU9JXhcbiIsIHJldHZhbCkpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfYmJfd3JpdGUoc3RydWN0IGhhcHB5X21lYWwgKmhwLAorCQkJCXZvaWQgX19pb21lbSAqdHJlZ3MsIGludCByZWcsCisJCQkJdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJdTMyIHRtcDsKKwlpbnQgaTsKKworCUFTRCgoImhhcHB5X21lYWxfYmJfd3JpdGU6IHJlZz0lZCB2YWx1ZT0leFxuIiwgcmVnLCB2YWx1ZSkpOworCisJLyogRW5hYmxlIHRoZSBNSUYgQml0QmFuZyBvdXRwdXRzLiAqLworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQkJPRU5BQiwgMSk7CisKKwkvKiBGb3JjZSBCaXRCYW5nIGludG8gdGhlIGlkbGUgc3RhdGUuICovCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAxKTsKKworCS8qIEdpdmUgaXQgd3JpdGUgc2VxdWVuY2UuICovCisJQkJfUFVUX0JJVChocCwgdHJlZ3MsIDApOworCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAxKTsKKwlCQl9QVVRfQklUKGhwLCB0cmVncywgMCk7CisJQkJfUFVUX0JJVChocCwgdHJlZ3MsIDEpOworCisJLyogR2l2ZSBpdCB0aGUgUEhZIGFkZHJlc3MuICovCisJdG1wID0gKGhwLT5wYWRkciAmIDB4ZmYpOworCWZvciAoaSA9IDQ7IGkgPj0gMDsgaS0tKQorCQlCQl9QVVRfQklUKGhwLCB0cmVncywgKCh0bXAgPj4gaSkgJiAxKSk7CisKKwkvKiBUZWxsIGl0IHdoYXQgcmVnaXN0ZXIgd2Ugd2lsbCBiZSB3cml0aW5nLiAqLworCXRtcCA9IChyZWcgJiAweGZmKTsKKwlmb3IgKGkgPSA0OyBpID49IDA7IGktLSkKKwkJQkJfUFVUX0JJVChocCwgdHJlZ3MsICgodG1wID4+IGkpICYgMSkpOworCisJLyogVGVsbCBpdCB0byBiZWNvbWUgcmVhZHkgZm9yIHRoZSBiaXRzLiAqLworCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAxKTsKKwlCQl9QVVRfQklUKGhwLCB0cmVncywgMCk7CisKKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pCisJCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAoKHZhbHVlID4+IGkpICYgMSkpOworCisJLyogQ2xvc2UgZG93biB0aGUgTUlGIEJpdEJhbmcgb3V0cHV0cy4gKi8KKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0JCT0VOQUIsIDApOworfQorCisjZGVmaW5lIFRDVlJfUkVBRF9UUklFUyAgIDE2CisKK3N0YXRpYyBpbnQgaGFwcHlfbWVhbF90Y3ZyX3JlYWQoc3RydWN0IGhhcHB5X21lYWwgKmhwLAorCQkJCXZvaWQgX19pb21lbSAqdHJlZ3MsIGludCByZWcpCit7CisJaW50IHRyaWVzID0gVENWUl9SRUFEX1RSSUVTOworCWludCByZXR2YWw7CisKKwlBU0QoKCJoYXBweV9tZWFsX3RjdnJfcmVhZDogcmVnPTB4JTAyeCAiLCByZWcpKTsKKwlpZiAoaHAtPnRjdnJfdHlwZSA9PSBub25lKSB7CisJCUFTRCgoIm5vIHRyYW5zY2VpdmVyLCB2YWx1ZT1UQ1ZSX0ZBSUxVUkVcbiIpKTsKKwkJcmV0dXJuIFRDVlJfRkFJTFVSRTsKKwl9CisKKwlpZiAoIShocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19GRU5BQkxFKSkgeworCQlBU0QoKCJkb2luZyBiaXQgYmFuZ1xuIikpOworCQlyZXR1cm4gaGFwcHlfbWVhbF9iYl9yZWFkKGhwLCB0cmVncywgcmVnKTsKKwl9CisKKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0ZSQU1FLAorCQkgICAgKEZSQU1FX1JFQUQgfCAoaHAtPnBhZGRyIDw8IDIzKSB8ICgocmVnICYgMHhmZikgPDwgMTgpKSk7CisJd2hpbGUgKCEoaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0ZSQU1FKSAmIDB4MTAwMDApICYmIC0tdHJpZXMpCisJCXVkZWxheSgyMCk7CisJaWYgKCF0cmllcykgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5IG1lYWw6IEFpZWVlLCB0cmFuc2NlaXZlciBNSUYgcmVhZCBib2xpeGVkXG4iKTsKKwkJcmV0dXJuIFRDVlJfRkFJTFVSRTsKKwl9CisJcmV0dmFsID0gaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0ZSQU1FKSAmIDB4ZmZmZjsKKwlBU0QoKCJ2YWx1ZT0lMDR4XG4iLCByZXR2YWwpKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIFRDVlJfV1JJVEVfVFJJRVMgIDE2CisKK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfdGN2cl93cml0ZShzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsCisJCQkJICB2b2lkIF9faW9tZW0gKnRyZWdzLCBpbnQgcmVnLAorCQkJCSAgdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJaW50IHRyaWVzID0gVENWUl9XUklURV9UUklFUzsKKwkKKwlBU0QoKCJoYXBweV9tZWFsX3RjdnJfd3JpdGU6IHJlZz0weCUwMnggdmFsdWU9JTA0eFxuIiwgcmVnLCB2YWx1ZSkpOworCisJLyogV2VsY29tZSB0byBTdW4gTWljcm9zeXN0ZW1zLCBjYW4gSSB0YWtlIHlvdXIgb3JkZXIgcGxlYXNlPyAqLworCWlmICghKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX0ZFTkFCTEUpKSB7CisJCWhhcHB5X21lYWxfYmJfd3JpdGUoaHAsIHRyZWdzLCByZWcsIHZhbHVlKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdvdWxkIHlvdSBsaWtlIGZyaWVzIHdpdGggdGhhdD8gKi8KKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0ZSQU1FLAorCQkgICAgKEZSQU1FX1dSSVRFIHwgKGhwLT5wYWRkciA8PCAyMykgfAorCQkgICAgICgocmVnICYgMHhmZikgPDwgMTgpIHwgKHZhbHVlICYgMHhmZmZmKSkpOworCXdoaWxlICghKGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9GUkFNRSkgJiAweDEwMDAwKSAmJiAtLXRyaWVzKQorCQl1ZGVsYXkoMjApOworCisJLyogQW55dGhpbmcgZWxzZT8gKi8KKwlpZiAoIXRyaWVzKQorCQlwcmludGsoS0VSTl9FUlIgImhhcHB5IG1lYWw6IEFpZWVlLCB0cmFuc2NlaXZlciBNSUYgd3JpdGUgYm9saXhlZFxuIik7CisKKwkvKiBGaWZ0eS10d28gY2VudHMgaXMgeW91ciBjaGFuZ2UsIGhhdmUgYSBuaWNlIGRheS4gKi8KK30KKworLyogQXV0byBuZWdvdGlhdGlvbi4gIFRoZSBzY2hlbWUgaXMgdmVyeSBzaW1wbGUuICBXZSBoYXZlIGEgdGltZXIgcm91dGluZQorICogdGhhdCBrZWVwcyB3YXRjaGluZyB0aGUgYXV0byBuZWdvdGlhdGlvbiBwcm9jZXNzIGFzIGl0IHByb2dyZXNzZXMuCisgKiBUaGUgRFA4Mzg0MCBpcyBmaXJzdCB0b2xkIHRvIHN0YXJ0IGRvaW5nIGl0J3MgdGhpbmcsIHdlIHNldCB1cCB0aGUgdGltZQorICogYW5kIHBsYWNlIHRoZSB0aW1lciBzdGF0ZSBtYWNoaW5lIGluIGl0J3MgaW5pdGlhbCBzdGF0ZS4KKyAqCisgKiBIZXJlIHRoZSB0aW1lciBwZWVrcyBhdCB0aGUgRFA4Mzg0MCBzdGF0dXMgcmVnaXN0ZXJzIGF0IGVhY2ggY2xpY2sgdG8gc2VlCisgKiBpZiB0aGUgYXV0byBuZWdvdGlhdGlvbiBoYXMgY29tcGxldGVkLCB3ZSBhc3N1bWUgaGVyZSB0aGF0IHRoZSBEUDgzODQwIFBIWQorICogd2lsbCB0aW1lIG91dCBhdCBzb21lIHBvaW50IGFuZCBqdXN0IHRlbGwgdXMgd2hhdCAoZGlkbid0KSBoYXBwZW4uICBGb3IKKyAqIGNvbXBsZXRlIGNvdmVyYWdlIHdlIG9ubHkgYWxsb3cgc28gbWFueSBvZiB0aGUgdGlja3MgYXQgdGhpcyBsZXZlbCB0byBydW4sCisgKiB3aGVuIHRoaXMgaGFzIGV4cGlyZWQgd2UgcHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UgYW5kIHRyeSBhbm90aGVyIHN0cmF0ZWd5LgorICogVGhpcyAib3RoZXIiIHN0cmF0ZWd5IGlzIHRvIGZvcmNlIHRoZSBpbnRlcmZhY2UgaW50byB2YXJpb3VzIHNwZWVkL2R1cGxleAorICogY29uZmlndXJhdGlvbnMgYW5kIHdlIHN0b3Agd2hlbiB3ZSBzZWUgYSBsaW5rLXVwIGNvbmRpdGlvbiBiZWZvcmUgdGhlCisgKiBtYXhpbXVtIG51bWJlciBvZiAicGVlayIgdGlja3MgaGF2ZSBvY2N1cnJlZC4KKyAqCisgKiBPbmNlIGEgdmFsaWQgbGluayBzdGF0dXMgaGFzIGJlZW4gZGV0ZWN0ZWQgd2UgY29uZmlndXJlIHRoZSBCaWdNQUMgYW5kCisgKiB0aGUgcmVzdCBvZiB0aGUgSGFwcHkgTWVhbCB0byBzcGVhayB0aGUgbW9zdCBlZmZpY2llbnQgcHJvdG9jb2wgd2UgY291bGQKKyAqIGdldCBhIGNsZWFuIGxpbmsgZm9yLiAgVGhlIHByaW9yaXR5IGZvciBsaW5rIGNvbmZpZ3VyYXRpb25zLCBoaWdoZXN0IGZpcnN0CisgKiBpczoKKyAqICAgICAgICAgICAgICAgICAxMDAgQmFzZS1UIEZ1bGwgRHVwbGV4CisgKiAgICAgICAgICAgICAgICAgMTAwIEJhc2UtVCBIYWxmIER1cGxleAorICogICAgICAgICAgICAgICAgIDEwIEJhc2UtVCBGdWxsIER1cGxleAorICogICAgICAgICAgICAgICAgIDEwIEJhc2UtVCBIYWxmIER1cGxleAorICoKKyAqIFdlIHN0YXJ0IGEgbmV3IHRpbWVyIG5vdywgYWZ0ZXIgYSBzdWNjZXNzZnVsIGF1dG8gbmVnb3RpYXRpb24gc3RhdHVzIGhhcworICogYmVlbiBkZXRlY3RlZC4gIFRoaXMgdGltZXIganVzdCB3YWl0cyBmb3IgdGhlIGxpbmstdXAgYml0IHRvIGdldCBzZXQgaW4KKyAqIHRoZSBCTUNSIG9mIHRoZSBEUDgzODQwLiAgV2hlbiB0aGlzIG9jY3VycyB3ZSBwcmludCBhIGtlcm5lbCBsb2cgbWVzc2FnZQorICogZGVzY3JpYmluZyB0aGUgbGluayB0eXBlIGluIHVzZSBhbmQgdGhlIGZhY3QgdGhhdCBpdCBpcyB1cC4KKyAqCisgKiBJZiBhIGZhdGFsIGVycm9yIG9mIHNvbWUgc29ydCBpcyBzaWduYWxsZWQgYW5kIGRldGVjdGVkIGluIHRoZSBpbnRlcnJ1cHQKKyAqIHNlcnZpY2Ugcm91dGluZSwgYW5kIHRoZSBjaGlwIGlzIHJlc2V0LCBvciB0aGUgbGluayBpcyBpZmNvbmZpZydkIGRvd24KKyAqIGFuZCB0aGVuIGJhY2sgdXAsIHRoaXMgZW50aXJlIHByb2Nlc3MgcmVwZWF0cyBpdHNlbGYgYWxsIG92ZXIgYWdhaW4uCisgKi8KK3N0YXRpYyBpbnQgdHJ5X25leHRfcGVybXV0YXRpb24oc3RydWN0IGhhcHB5X21lYWwgKmhwLCB2b2lkIF9faW9tZW0gKnRyZWdzKQoreworCWhwLT5zd19ibWNyID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1DUik7CisKKwkvKiBEb3duZ3JhZGUgZnJvbSBmdWxsIHRvIGhhbGYgZHVwbGV4LiAgT25seSBwb3NzaWJsZQorCSAqIHZpYSBldGh0b29sLgorCSAqLworCWlmIChocC0+c3dfYm1jciAmIEJNQ1JfRlVMTERQTFgpIHsKKwkJaHAtPnN3X2JtY3IgJj0gfihCTUNSX0ZVTExEUExYKTsKKwkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgTUlJX0JNQ1IsIGhwLT5zd19ibWNyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRG93bmdyYWRlIGZyb20gMTAwIHRvIDEwLiAqLworCWlmIChocC0+c3dfYm1jciAmIEJNQ1JfU1BFRUQxMDApIHsKKwkJaHAtPnN3X2JtY3IgJj0gfihCTUNSX1NQRUVEMTAwKTsKKwkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgTUlJX0JNQ1IsIGhwLT5zd19ibWNyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogV2UndmUgdHJpZWQgZXZlcnl0aGluZy4gKi8KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfbGlua19tb2RlKHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICp0cmVncykKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBpcyB1cCB1c2luZyAiLCBocC0+ZGV2LT5uYW1lKTsKKwlpZiAoaHAtPnRjdnJfdHlwZSA9PSBleHRlcm5hbCkKKwkJcHJpbnRrKCJleHRlcm5hbCAiKTsKKwllbHNlCisJCXByaW50aygiaW50ZXJuYWwgIik7CisJcHJpbnRrKCJ0cmFuc2NlaXZlciBhdCAiKTsKKwlocC0+c3dfbHBhID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfTFBBKTsKKwlpZiAoaHAtPnN3X2xwYSAmIChMUEFfMTAwSEFMRiB8IExQQV8xMDBGVUxMKSkgeworCQlpZiAoaHAtPnN3X2xwYSAmIExQQV8xMDBGVUxMKQorCQkJcHJpbnRrKCIxMDBNYi9zLCBGdWxsIER1cGxleC5cbiIpOworCQllbHNlCisJCQlwcmludGsoIjEwME1iL3MsIEhhbGYgRHVwbGV4LlxuIik7CisJfSBlbHNlIHsKKwkJaWYgKGhwLT5zd19scGEgJiBMUEFfMTBGVUxMKQorCQkJcHJpbnRrKCIxME1iL3MsIEZ1bGwgRHVwbGV4LlxuIik7CisJCWVsc2UKKwkJCXByaW50aygiMTBNYi9zLCBIYWxmIER1cGxleC5cbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgZGlzcGxheV9mb3JjZWRfbGlua19tb2RlKHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICp0cmVncykKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBoYXMgYmVlbiBmb3JjZWQgdXAgdXNpbmcgIiwgaHAtPmRldi0+bmFtZSk7CisJaWYgKGhwLT50Y3ZyX3R5cGUgPT0gZXh0ZXJuYWwpCisJCXByaW50aygiZXh0ZXJuYWwgIik7CisJZWxzZQorCQlwcmludGsoImludGVybmFsICIpOworCXByaW50aygidHJhbnNjZWl2ZXIgYXQgIik7CisJaHAtPnN3X2JtY3IgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTUNSKTsKKwlpZiAoaHAtPnN3X2JtY3IgJiBCTUNSX1NQRUVEMTAwKQorCQlwcmludGsoIjEwME1iL3MsICIpOworCWVsc2UKKwkJcHJpbnRrKCIxME1iL3MsICIpOworCWlmIChocC0+c3dfYm1jciAmIEJNQ1JfRlVMTERQTFgpCisJCXByaW50aygiRnVsbCBEdXBsZXguXG4iKTsKKwllbHNlCisJCXByaW50aygiSGFsZiBEdXBsZXguXG4iKTsKK30KKworc3RhdGljIGludCBzZXRfaGFwcHlfbGlua19tb2RlcyhzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHZvaWQgX19pb21lbSAqdHJlZ3MpCit7CisJaW50IGZ1bGw7CisKKwkvKiBBbGwgd2UgY2FyZSBhYm91dCBpcyBtYWtpbmcgc3VyZSB0aGUgYmlnbWFjIHR4X2NmZyBoYXMgYQorCSAqIHByb3BlciBkdXBsZXggc2V0dGluZy4KKwkgKi8KKwlpZiAoaHAtPnRpbWVyX3N0YXRlID09IGFyYndhaXQpIHsKKwkJaHAtPnN3X2xwYSA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0xQQSk7CisJCWlmICghKGhwLT5zd19scGEgJiAoTFBBXzEwSEFMRiB8IExQQV8xMEZVTEwgfCBMUEFfMTAwSEFMRiB8IExQQV8xMDBGVUxMKSkpCisJCQlnb3RvIG5vX3Jlc3BvbnNlOworCQlpZiAoaHAtPnN3X2xwYSAmIExQQV8xMDBGVUxMKQorCQkJZnVsbCA9IDE7CisJCWVsc2UgaWYgKGhwLT5zd19scGEgJiBMUEFfMTAwSEFMRikKKwkJCWZ1bGwgPSAwOworCQllbHNlIGlmIChocC0+c3dfbHBhICYgTFBBXzEwRlVMTCkKKwkJCWZ1bGwgPSAxOworCQllbHNlCisJCQlmdWxsID0gMDsKKwl9IGVsc2UgeworCQkvKiBGb3JjaW5nIGEgbGluayBtb2RlLiAqLworCQlocC0+c3dfYm1jciA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNQ1IpOworCQlpZiAoaHAtPnN3X2JtY3IgJiBCTUNSX0ZVTExEUExYKQorCQkJZnVsbCA9IDE7CisJCWVsc2UKKwkJCWZ1bGwgPSAwOworCX0KKworCS8qIEJlZm9yZSBjaGFuZ2luZyBvdGhlciBiaXRzIGluIHRoZSB0eF9jZmcgcmVnaXN0ZXIsIGFuZCBpbgorCSAqIGdlbmVyYWwgYW55IG9mIG90aGVyIHRoZSBUWCBjb25maWcgcmVnaXN0ZXJzIHRvbywgeW91CisJICogbXVzdDoKKwkgKiAxKSBDbGVhciBFbmFibGUKKwkgKiAyKSBQb2xsIHdpdGggcmVhZHMgdW50aWwgdGhhdCBiaXQgcmVhZHMgYmFjayBhcyB6ZXJvCisJICogMykgTWFrZSBUWCBjb25maWd1cmF0aW9uIGNoYW5nZXMKKwkgKiA0KSBTZXQgRW5hYmxlIG9uY2UgbW9yZQorCSAqLworCWhtZV93cml0ZTMyKGhwLCBocC0+YmlnbWFjcmVncyArIEJNQUNfVFhDRkcsCisJCSAgICBobWVfcmVhZDMyKGhwLCBocC0+YmlnbWFjcmVncyArIEJNQUNfVFhDRkcpICYKKwkJICAgIH4oQklHTUFDX1RYQ0ZHX0VOQUJMRSkpOworCXdoaWxlIChobWVfcmVhZDMyKGhwLCBocC0+YmlnbWFjcmVncyArIEJNQUNfVFhDRkcpICYgQklHTUFDX1RYQ0ZHX0VOQUJMRSkKKwkJYmFycmllcigpOworCWlmIChmdWxsKSB7CisJCWhwLT5oYXBweV9mbGFncyB8PSBIRkxBR19GVUxMOworCQlobWVfd3JpdGUzMihocCwgaHAtPmJpZ21hY3JlZ3MgKyBCTUFDX1RYQ0ZHLAorCQkJICAgIGhtZV9yZWFkMzIoaHAsIGhwLT5iaWdtYWNyZWdzICsgQk1BQ19UWENGRykgfAorCQkJICAgIEJJR01BQ19UWENGR19GVUxMRFBMWCk7CisJfSBlbHNlIHsKKwkJaHAtPmhhcHB5X2ZsYWdzICY9IH4oSEZMQUdfRlVMTCk7CisJCWhtZV93cml0ZTMyKGhwLCBocC0+YmlnbWFjcmVncyArIEJNQUNfVFhDRkcsCisJCQkgICAgaG1lX3JlYWQzMihocCwgaHAtPmJpZ21hY3JlZ3MgKyBCTUFDX1RYQ0ZHKSAmCisJCQkgICAgfihCSUdNQUNfVFhDRkdfRlVMTERQTFgpKTsKKwl9CisJaG1lX3dyaXRlMzIoaHAsIGhwLT5iaWdtYWNyZWdzICsgQk1BQ19UWENGRywKKwkJICAgIGhtZV9yZWFkMzIoaHAsIGhwLT5iaWdtYWNyZWdzICsgQk1BQ19UWENGRykgfAorCQkgICAgQklHTUFDX1RYQ0ZHX0VOQUJMRSk7CisJcmV0dXJuIDA7Citub19yZXNwb25zZToKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoYXBweV9tZWFsX2luaXQoc3RydWN0IGhhcHB5X21lYWwgKmhwKTsKKworc3RhdGljIGludCBpc19sdWNlbnRfcGh5KHN0cnVjdCBoYXBweV9tZWFsICpocCkKK3sKKwl2b2lkIF9faW9tZW0gKnRyZWdzID0gaHAtPnRjdnJlZ3M7CisJdW5zaWduZWQgc2hvcnQgbXIyLCBtcjM7CisJaW50IHJldCA9IDA7CisKKwltcjIgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIDIpOworCW1yMyA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgMyk7CisJaWYgKChtcjIgJiAweGZmZmYpID09IDB4MDE4MCAmJgorCSAgICAoKG1yMyAmIDB4ZmZmZikgPj4gMTApID09IDB4MWQpCisJCXJldCA9IDE7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgPSAoc3RydWN0IGhhcHB5X21lYWwgKikgZGF0YTsKKwl2b2lkIF9faW9tZW0gKnRyZWdzID0gaHAtPnRjdnJlZ3M7CisJaW50IHJlc3RhcnRfdGltZXIgPSAwOworCisJc3Bpbl9sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCisJaHAtPnRpbWVyX3RpY2tzKys7CisJc3dpdGNoKGhwLT50aW1lcl9zdGF0ZSkgeworCWNhc2UgYXJid2FpdDoKKwkJLyogT25seSBhbGxvdyBmb3IgNSB0aWNrcywgdGhhdHMgMTAgc2Vjb25kcyBhbmQgbXVjaCB0b28KKwkJICogbG9uZyB0byB3YWl0IGZvciBhcmJpdHJhdGlvbiB0byBjb21wbGV0ZS4KKwkJICovCisJCWlmIChocC0+dGltZXJfdGlja3MgPj0gMTApIHsKKwkJCS8qIEVudGVyIGZvcmNlIG1vZGUuICovCisJZG9fZm9yY2VfbW9kZToKKwkJCWhwLT5zd19ibWNyID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1DUik7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBBdXRvLU5lZ290aWF0aW9uIHVuc3VjY2Vzc2Z1bCwgdHJ5aW5nIGZvcmNlIGxpbmsgbW9kZVxuIiwKKwkJCSAgICAgICBocC0+ZGV2LT5uYW1lKTsKKwkJCWhwLT5zd19ibWNyID0gQk1DUl9TUEVFRDEwMDsKKwkJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIE1JSV9CTUNSLCBocC0+c3dfYm1jcik7CisKKwkJCWlmICghaXNfbHVjZW50X3BoeShocCkpIHsKKwkJCQkvKiBPSywgc2VlbXMgd2UgbmVlZCBkbyBkaXNhYmxlIHRoZSB0cmFuc2NlaXZlciBmb3IgdGhlIGZpcnN0CisJCQkJICogdGljayB0byBtYWtlIHN1cmUgd2UgZ2V0IGFuIGFjY3VyYXRlIGxpbmsgc3RhdGUgYXQgdGhlCisJCQkJICogc2Vjb25kIHRpY2suCisJCQkJICovCisJCQkJaHAtPnN3X2NzY29uZmlnID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBEUDgzODQwX0NTQ09ORklHKTsKKwkJCQlocC0+c3dfY3Njb25maWcgJj0gfihDU0NPTkZJR19UQ1ZESVNBQik7CisJCQkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgRFA4Mzg0MF9DU0NPTkZJRywgaHAtPnN3X2NzY29uZmlnKTsKKwkJCX0KKwkJCWhwLT50aW1lcl9zdGF0ZSA9IGx0cnl3YWl0OworCQkJaHAtPnRpbWVyX3RpY2tzID0gMDsKKwkJCXJlc3RhcnRfdGltZXIgPSAxOworCQl9IGVsc2UgeworCQkJLyogQW55dGhpbmcgaW50ZXJlc3RpbmcgaGFwcGVuPyAqLworCQkJaHAtPnN3X2Jtc3IgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTVNSKTsKKwkJCWlmIChocC0+c3dfYm1zciAmIEJNU1JfQU5FR0NPTVBMRVRFKSB7CisJCQkJaW50IHJldDsKKworCQkJCS8qIEp1c3Qgd2hhdCB3ZSd2ZSBiZWVuIHdhaXRpbmcgZm9yLi4uICovCisJCQkJcmV0ID0gc2V0X2hhcHB5X2xpbmtfbW9kZXMoaHAsIHRyZWdzKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCS8qIE9vb3BzLCBzb21ldGhpbmcgYmFkIGhhcHBlbmVkLCBnbyB0byBmb3JjZQorCQkJCQkgKiBtb2RlLgorCQkJCQkgKgorCQkJCQkgKiBYWFggQnJva2VuIGh1YnMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCA4MDIuM3UKKwkJCQkJICogWFhYIGF1dG8tbmVnb3RpYXRpb24gbWFrZSB0aGlzIGhhcHBlbiBhcyB3ZWxsLgorCQkJCQkgKi8KKwkJCQkJZ290byBkb19mb3JjZV9tb2RlOworCQkJCX0KKworCQkJCS8qIFN1Y2Nlc3MsIGF0IGxlYXN0IHNvIGZhciwgYWR2YW5jZSBvdXIgc3RhdGUgZW5naW5lLiAqLworCQkJCWhwLT50aW1lcl9zdGF0ZSA9IGx1cHdhaXQ7CisJCQkJcmVzdGFydF90aW1lciA9IDE7CisJCQl9IGVsc2UgeworCQkJCXJlc3RhcnRfdGltZXIgPSAxOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBsdXB3YWl0OgorCQkvKiBBdXRvIG5lZ290aWF0aW9uIHdhcyBzdWNjZXNzZnVsIGFuZCB3ZSBhcmUgYXdhaXRpbmcgYQorCQkgKiBsaW5rIHVwIHN0YXR1cy4gIEkgaGF2ZSBkZWNpZGVkIHRvIGxldCB0aGlzIHRpbWVyIHJ1bgorCQkgKiBmb3JldmVyIHVudGlsIHNvbWUgc29ydCBvZiBlcnJvciBpcyBzaWduYWxsZWQsIHJlcG9ydGluZworCQkgKiBhIG1lc3NhZ2UgdG8gdGhlIHVzZXIgYXQgMTAgc2Vjb25kIGludGVydmFscy4KKwkJICovCisJCWhwLT5zd19ibXNyID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1TUik7CisJCWlmIChocC0+c3dfYm1zciAmIEJNU1JfTFNUQVRVUykgeworCQkJLyogV2hlZWUsIGl0J3MgdXAsIGRpc3BsYXkgdGhlIGxpbmsgbW9kZSBpbiB1c2UgYW5kIHB1dAorCQkJICogdGhlIHRpbWVyIHRvIHNsZWVwLgorCQkJICovCisJCQlkaXNwbGF5X2xpbmtfbW9kZShocCwgdHJlZ3MpOworCQkJaHAtPnRpbWVyX3N0YXRlID0gYXNsZWVwOworCQkJcmVzdGFydF90aW1lciA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAoaHAtPnRpbWVyX3RpY2tzID49IDEwKSB7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogQXV0byBuZWdvdGlhdGlvbiBzdWNjZXNzZnVsLCBsaW5rIHN0aWxsICIKKwkJCQkgICAgICAgIm5vdCBjb21wbGV0ZWx5IHVwLlxuIiwgaHAtPmRldi0+bmFtZSk7CisJCQkJaHAtPnRpbWVyX3RpY2tzID0gMDsKKwkJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzdGFydF90aW1lciA9IDE7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGx0cnl3YWl0OgorCQkvKiBNYWtpbmcgdGhlIHRpbWVvdXQgaGVyZSB0b28gbG9uZyBjYW4gbWFrZSBpdCB0YWtlCisJCSAqIGFubm95aW5nbHkgbG9uZyB0byBhdHRlbXB0IGFsbCBvZiB0aGUgbGluayBtb2RlCisJCSAqIHBlcm11dGF0aW9ucywgYnV0IHRoZW4gYWdhaW4gdGhpcyBpcyBlc3NlbnRpYWxseQorCQkgKiBlcnJvciByZWNvdmVyeSBjb2RlIGZvciB0aGUgbW9zdCBwYXJ0LgorCQkgKi8KKwkJaHAtPnN3X2Jtc3IgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTVNSKTsKKwkJaHAtPnN3X2NzY29uZmlnID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBEUDgzODQwX0NTQ09ORklHKTsKKwkJaWYgKGhwLT50aW1lcl90aWNrcyA9PSAxKSB7CisJCQlpZiAoIWlzX2x1Y2VudF9waHkoaHApKSB7CisJCQkJLyogUmUtZW5hYmxlIHRyYW5zY2VpdmVyLCB3ZSdsbCByZS1lbmFibGUgdGhlIHRyYW5zY2VpdmVyIG5leHQKKwkJCQkgKiB0aWNrLCB0aGVuIGNoZWNrIGxpbmsgc3RhdGUgb24gdGhlIGZvbGxvd2luZyB0aWNrLgorCQkJCSAqLworCQkJCWhwLT5zd19jc2NvbmZpZyB8PSBDU0NPTkZJR19UQ1ZESVNBQjsKKwkJCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLAorCQkJCQkJICAgICAgRFA4Mzg0MF9DU0NPTkZJRywgaHAtPnN3X2NzY29uZmlnKTsKKwkJCX0KKwkJCXJlc3RhcnRfdGltZXIgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGhwLT50aW1lcl90aWNrcyA9PSAyKSB7CisJCQlpZiAoIWlzX2x1Y2VudF9waHkoaHApKSB7CisJCQkJaHAtPnN3X2NzY29uZmlnICY9IH4oQ1NDT05GSUdfVENWRElTQUIpOworCQkJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsCisJCQkJCQkgICAgICBEUDgzODQwX0NTQ09ORklHLCBocC0+c3dfY3Njb25maWcpOworCQkJfQorCQkJcmVzdGFydF90aW1lciA9IDE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoaHAtPnN3X2Jtc3IgJiBCTVNSX0xTVEFUVVMpIHsKKwkJCS8qIEZvcmNlIG1vZGUgc2VsZWN0aW9uIHN1Y2Nlc3MuICovCisJCQlkaXNwbGF5X2ZvcmNlZF9saW5rX21vZGUoaHAsIHRyZWdzKTsKKwkJCXNldF9oYXBweV9saW5rX21vZGVzKGhwLCB0cmVncyk7IC8qIFhYWCBlcnJvcj8gdGhlbiB3aGF0PyAqLworCQkJaHAtPnRpbWVyX3N0YXRlID0gYXNsZWVwOworCQkJcmVzdGFydF90aW1lciA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAoaHAtPnRpbWVyX3RpY2tzID49IDQpIHsgLyogNiBzZWNvbmRzIG9yIHNvLi4uICovCisJCQkJaW50IHJldDsKKworCQkJCXJldCA9IHRyeV9uZXh0X3Blcm11dGF0aW9uKGhwLCB0cmVncyk7CisJCQkJaWYgKHJldCA9PSAtMSkgeworCQkJCQkvKiBBaWVlZSwgdHJpZWQgdGhlbSBhbGwsIHJlc2V0IHRoZQorCQkJCQkgKiBjaGlwIGFuZCB0cnkgYWxsIG92ZXIgYWdhaW4uCisJCQkJCSAqLworCisJCQkJCS8qIExldCB0aGUgdXNlciBrbm93Li4uICovCisJCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IExpbmsgZG93biwgY2FibGUgcHJvYmxlbT9cbiIsCisJCQkJCSAgICAgICBocC0+ZGV2LT5uYW1lKTsKKworCQkJCQlyZXQgPSBoYXBweV9tZWFsX2luaXQoaHApOworCQkJCQlpZiAocmV0KSB7CisJCQkJCQkvKiBobyBodW0uLi4gKi8KKwkJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yLCBjYW5ub3QgcmUtaW5pdCB0aGUgIgorCQkJCQkJICAgICAgICJIYXBweSBNZWFsLlxuIiwgaHAtPmRldi0+bmFtZSk7CisJCQkJCX0KKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWlmICghaXNfbHVjZW50X3BoeShocCkpIHsKKwkJCQkJaHAtPnN3X2NzY29uZmlnID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLAorCQkJCQkJCQkJICAgICAgIERQODM4NDBfQ1NDT05GSUcpOworCQkJCQlocC0+c3dfY3Njb25maWcgfD0gQ1NDT05GSUdfVENWRElTQUI7CisJCQkJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsCisJCQkJCQkJICAgICAgRFA4Mzg0MF9DU0NPTkZJRywgaHAtPnN3X2NzY29uZmlnKTsKKwkJCQl9CisJCQkJaHAtPnRpbWVyX3RpY2tzID0gMDsKKwkJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzdGFydF90aW1lciA9IDE7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGFzbGVlcDoKKwlkZWZhdWx0OgorCQkvKiBDYW4ndCBoYXBwZW5zLi4uLiAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBBaWVlZSwgbGluayB0aW1lciBpcyBhc2xlZXAgYnV0IHdlIGdvdCBvbmUgYW55d2F5cyFcbiIsCisJCSAgICAgICBocC0+ZGV2LT5uYW1lKTsKKwkJcmVzdGFydF90aW1lciA9IDA7CisJCWhwLT50aW1lcl90aWNrcyA9IDA7CisJCWhwLT50aW1lcl9zdGF0ZSA9IGFzbGVlcDsgLyogZm9vIG9uIHlvdSAqLworCQlicmVhazsKKwl9OworCisJaWYgKHJlc3RhcnRfdGltZXIpIHsKKwkJaHAtPmhhcHB5X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKCgxMiAqIEhaKS8xMCk7IC8qIDEuMiBzZWMuICovCisJCWFkZF90aW1lcigmaHAtPmhhcHB5X3RpbWVyKTsKKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKK30KKworI2RlZmluZSBUWF9SRVNFVF9UUklFUyAgICAgMzIKKyNkZWZpbmUgUlhfUkVTRVRfVFJJRVMgICAgIDMyCisKKy8qIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF90eF9yZXNldChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHZvaWQgX19pb21lbSAqYnJlZ3MpCit7CisJaW50IHRyaWVzID0gVFhfUkVTRVRfVFJJRVM7CisKKwlITUQoKCJoYXBweV9tZWFsX3R4X3Jlc2V0OiByZXNldCwgIikpOworCisJLyogV291bGQgeW91IGxpa2UgdG8gdHJ5IG91ciBTTUNDIERlbHV4PyAqLworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfVFhTV1JFU0VULCAwKTsKKwl3aGlsZSAoKGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19UWFNXUkVTRVQpICYgMSkgJiYgLS10cmllcykKKwkJdWRlbGF5KDIwKTsKKworCS8qIExldHR1Y2UsIHRvbWF0bywgYnVnZ3kgaGFyZHdhcmUgKG5vIGV4dHJhIGNoYXJnZSk/ICovCisJaWYgKCF0cmllcykKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweSBtZWFsOiBUcmFuc2NlaXZlciBCaWdNYWMgQVRUQUNLISIpOworCisJLyogVGFrZSBjYXJlLiAqLworCUhNRCgoImRvbmVcbiIpKTsKK30KKworLyogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX3J4X3Jlc2V0KHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICpicmVncykKK3sKKwlpbnQgdHJpZXMgPSBSWF9SRVNFVF9UUklFUzsKKworCUhNRCgoImhhcHB5X21lYWxfcnhfcmVzZXQ6IHJlc2V0LCAiKSk7CisKKwkvKiBXZSBoYXZlIGEgc3BlY2lhbCBvbiBHTlUvVmlraW5nIGhhcmR3YXJlIGJ1Z3MgdG9kYXkuICovCisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19SWFNXUkVTRVQsIDApOworCXdoaWxlICgoaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX1JYU1dSRVNFVCkgJiAxKSAmJiAtLXRyaWVzKQorCQl1ZGVsYXkoMjApOworCisJLyogV2lsbCB0aGF0IGJlIGFsbD8gKi8KKwlpZiAoIXRyaWVzKQorCQlwcmludGsoS0VSTl9FUlIgImhhcHB5IG1lYWw6IFJlY2VpdmVyIEJpZ01hYyBBVFRBQ0shIik7CisKKwkvKiBEb24ndCBmb3JnZXQgeW91ciB2aWtfMTEzNzEyNV93YS4gIEhhdmUgYSBuaWNlIGRheS4gKi8KKwlITUQoKCJkb25lXG4iKSk7Cit9CisKKyNkZWZpbmUgU1RPUF9UUklFUyAgICAgICAgIDE2CisKKy8qIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF9zdG9wKHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICpncmVncykKK3sKKwlpbnQgdHJpZXMgPSBTVE9QX1RSSUVTOworCisJSE1EKCgiaGFwcHlfbWVhbF9zdG9wOiByZXNldCwgIikpOworCisJLyogV2UncmUgY29uc29saWRhdGluZyBvdXIgU1RCIHByb2R1Y3RzLCBpdCdzIHlvdXIgbHVja3kgZGF5LiAqLworCWhtZV93cml0ZTMyKGhwLCBncmVncyArIEdSRUdfU1dSRVNFVCwgR1JFR19SRVNFVF9BTEwpOworCXdoaWxlIChobWVfcmVhZDMyKGhwLCBncmVncyArIEdSRUdfU1dSRVNFVCkgJiYgLS10cmllcykKKwkJdWRlbGF5KDIwKTsKKworCS8qIENvbWUgYmFjayBuZXh0IHdlZWsgd2hlbiB3ZSBhcmUgIlN1biBNaWNyb2VsZWN0cm9uaWNzIi4gKi8KKwlpZiAoIXRyaWVzKQorCQlwcmludGsoS0VSTl9FUlIgImhhcHB5IG1lYWw6IEZyeSBndXlzLiIpOworCisJLyogUmVtZW1iZXI6ICJEaWZmZXJlbnQgbmFtZSwgc2FtZSBvbGQgYnVnZ3kgYXMgc2hpdCBoYXJkd2FyZS4iICovCisJSE1EKCgiZG9uZVxuIikpOworfQorCisvKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfZ2V0X2NvdW50ZXJzKHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICpicmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmaHAtPm5ldF9zdGF0czsKKworCXN0YXRzLT5yeF9jcmNfZXJyb3JzICs9IGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19SQ1JDRUNUUik7CisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19SQ1JDRUNUUiwgMCk7CisKKwlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzICs9IGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19VTkFMRUNUUik7CisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19VTkFMRUNUUiwgMCk7CisKKwlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyArPSBobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfR0xFQ1RSKTsKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0dMRUNUUiwgMCk7CisKKwlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgKz0gaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX0VYQ1RSKTsKKworCXN0YXRzLT5jb2xsaXNpb25zICs9CisJCShobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfRVhDVFIpICsKKwkJIGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19MVENUUikpOworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfRVhDVFIsIDApOworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfTFRDVFIsIDApOworfQorCisvKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfcG9sbF9zdG9wKHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICp0cmVncykKK3sKKwlBU0QoKCJoYXBweV9tZWFsX3BvbGxfc3RvcDogIikpOworCisJLyogSWYgcG9sbGluZyBkaXNhYmxlZCBvciBub3QgcG9sbGluZyBhbHJlYWR5LCBub3RoaW5nIHRvIGRvLiAqLworCWlmICgoaHAtPmhhcHB5X2ZsYWdzICYgKEhGTEFHX1BPTExFTkFCTEUgfCBIRkxBR19QT0xMKSkgIT0KKwkgICAoSEZMQUdfUE9MTEVOQUJMRSB8IEhGTEFHX1BPTEwpKSB7CisJCUhNRCgoIm5vdCBwb2xsaW5nLCByZXR1cm5cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFNodXQgdXAgdGhlIE1JRi4gKi8KKwlBU0QoKCJ3ZXJlIHBvbGxpbmcsIG1pZiBpbnRzIG9mZiwgIikpOworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfSU1BU0ssIDB4ZmZmZik7CisKKwkvKiBUdXJuIG9mZiBwb2xsaW5nLiAqLworCUFTRCgoInBvbGxpbmcgb2ZmLCAiKSk7CisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9DRkcsCisJCSAgICBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHKSAmIH4oVENWX0NGR19QRU5BQkxFKSk7CisKKwkvKiBXZSBhcmUgbm8gbG9uZ2VyIHBvbGxpbmcuICovCisJaHAtPmhhcHB5X2ZsYWdzICY9IH4oSEZMQUdfUE9MTCk7CisKKwkvKiBMZXQgdGhlIGJpdHMgc2V0LiAqLworCXVkZWxheSgyMDApOworCUFTRCgoImRvbmVcbiIpKTsKK30KKworLyogT25seSBTdW4gY2FuIHRha2Ugc3VjaCBuaWNlIHBhcnRzIGFuZCBmdWNrIHVwIHRoZSBwcm9ncmFtbWluZyBpbnRlcmZhY2UKKyAqIGxpa2UgdGhpcy4gIEdvb2Qgam9iIGd1eXMuLi4KKyAqLworI2RlZmluZSBUQ1ZSX1JFU0VUX1RSSUVTICAgICAgIDE2IC8qIEl0IHNob3VsZCByZXNldCBxdWlja2x5ICAgICAgICAqLworI2RlZmluZSBUQ1ZSX1VOSVNPTEFURV9UUklFUyAgIDMyIC8qIERpcy1pc29sYXRpb24gY2FuIHRha2UgbG9uZ2VyLiAqLworCisvKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyBpbnQgaGFwcHlfbWVhbF90Y3ZyX3Jlc2V0KHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICp0cmVncykKK3sKKwl1MzIgdGNvbmZpZzsKKwlpbnQgcmVzdWx0LCB0cmllcyA9IFRDVlJfUkVTRVRfVFJJRVM7CisKKwl0Y29uZmlnID0gaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRyk7CisJQVNEKCgiaGFwcHlfbWVhbF90Y3ZyX3Jlc2V0OiB0Y2ZnPCUwOGx4PiAiLCB0Y29uZmlnKSk7CisJaWYgKGhwLT50Y3ZyX3R5cGUgPT0gZXh0ZXJuYWwpIHsKKwkJQVNEKCgiZXh0ZXJuYWw8IikpOworCQlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRywgdGNvbmZpZyAmIH4oVENWX0NGR19QU0VMRUNUKSk7CisJCWhwLT50Y3ZyX3R5cGUgPSBpbnRlcm5hbDsKKwkJaHAtPnBhZGRyID0gVENWX1BBRERSX0lUWDsKKwkJQVNEKCgiSVNPTEFURSwiKSk7CisJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIE1JSV9CTUNSLAorCQkJCSAgICAgIChCTUNSX0xPT1BCQUNLfEJNQ1JfUERPV058Qk1DUl9JU09MQVRFKSk7CisJCXJlc3VsdCA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNQ1IpOworCQlpZiAocmVzdWx0ID09IFRDVlJfRkFJTFVSRSkgeworCQkJQVNEKCgicGh5cmVhZF9mYWlsPlxuIikpOworCQkJcmV0dXJuIC0xOworCQl9CisJCUFTRCgoInBoeXJlYWRfb2ssUFNFTEVDVD4iKSk7CisJCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHLCB0Y29uZmlnIHwgVENWX0NGR19QU0VMRUNUKTsKKwkJaHAtPnRjdnJfdHlwZSA9IGV4dGVybmFsOworCQlocC0+cGFkZHIgPSBUQ1ZfUEFERFJfRVRYOworCX0gZWxzZSB7CisJCWlmICh0Y29uZmlnICYgVENWX0NGR19NRElPMSkgeworCQkJQVNEKCgiaW50ZXJuYWw8UFNFTEVDVCwiKSk7CisJCQlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRywgKHRjb25maWcgfCBUQ1ZfQ0ZHX1BTRUxFQ1QpKTsKKwkJCUFTRCgoIklTT0xBVEUsIikpOworCQkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgTUlJX0JNQ1IsCisJCQkJCSAgICAgIChCTUNSX0xPT1BCQUNLfEJNQ1JfUERPV058Qk1DUl9JU09MQVRFKSk7CisJCQlyZXN1bHQgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTUNSKTsKKwkJCWlmIChyZXN1bHQgPT0gVENWUl9GQUlMVVJFKSB7CisJCQkJQVNEKCgicGh5cmVhZF9mYWlsPlxuIikpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCUFTRCgoInBoeXJlYWRfb2ssflBTRUxFQ1Q+IikpOworCQkJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9DRkcsICh0Y29uZmlnICYgfihUQ1ZfQ0ZHX1BTRUxFQ1QpKSk7CisJCQlocC0+dGN2cl90eXBlID0gaW50ZXJuYWw7CisJCQlocC0+cGFkZHIgPSBUQ1ZfUEFERFJfSVRYOworCQl9CisJfQorCisJQVNEKCgiQk1DUl9SRVNFVCAiKSk7CisJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCisJd2hpbGUgKC0tdHJpZXMpIHsKKwkJcmVzdWx0ID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1DUik7CisJCWlmIChyZXN1bHQgPT0gVENWUl9GQUlMVVJFKQorCQkJcmV0dXJuIC0xOworCQlocC0+c3dfYm1jciA9IHJlc3VsdDsKKwkJaWYgKCEocmVzdWx0ICYgQk1DUl9SRVNFVCkpCisJCQlicmVhazsKKwkJdWRlbGF5KDIwKTsKKwl9CisJaWYgKCF0cmllcykgeworCQlBU0QoKCJCTUNSIFJFU0VUIEZBSUxFRCFcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlBU0QoKCJSRVNFVF9PS1xuIikpOworCisJLyogR2V0IGZyZXNoIGNvcGllcyBvZiB0aGUgUEhZIHJlZ2lzdGVycy4gKi8KKwlocC0+c3dfYm1zciAgICAgID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1TUik7CisJaHAtPnN3X3BoeXNpZDEgICA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX1BIWVNJRDEpOworCWhwLT5zd19waHlzaWQyICAgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9QSFlTSUQyKTsKKwlocC0+c3dfYWR2ZXJ0aXNlID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQURWRVJUSVNFKTsKKworCUFTRCgoIlVOSVNPTEFURSIpKTsKKwlocC0+c3dfYm1jciAmPSB+KEJNQ1JfSVNPTEFURSk7CisJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgTUlJX0JNQ1IsIGhwLT5zd19ibWNyKTsKKworCXRyaWVzID0gVENWUl9VTklTT0xBVEVfVFJJRVM7CisJd2hpbGUgKC0tdHJpZXMpIHsKKwkJcmVzdWx0ID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1DUik7CisJCWlmIChyZXN1bHQgPT0gVENWUl9GQUlMVVJFKQorCQkJcmV0dXJuIC0xOworCQlpZiAoIShyZXN1bHQgJiBCTUNSX0lTT0xBVEUpKQorCQkJYnJlYWs7CisJCXVkZWxheSgyMCk7CisJfQorCWlmICghdHJpZXMpIHsKKwkJQVNEKCgiIEZBSUxFRCFcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlBU0QoKCIgU1VDQ0VTUyBhbmQgQ1NDT05GSUdfREZCWVBBU1NcbiIpKTsKKwlpZiAoIWlzX2x1Y2VudF9waHkoaHApKSB7CisJCXJlc3VsdCA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywKKwkJCQkJICAgICAgRFA4Mzg0MF9DU0NPTkZJRyk7CisJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsCisJCQkJICAgICAgRFA4Mzg0MF9DU0NPTkZJRywgKHJlc3VsdCB8IENTQ09ORklHX0RGQllQQVNTKSk7CisJfQorCXJldHVybiAwOworfQorCisvKiBGaWd1cmUgb3V0IHdoZXRoZXIgd2UgaGF2ZSBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCB0cmFuc2NlaXZlci4KKyAqCisgKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQKKyAqLworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF90cmFuc2NlaXZlcl9jaGVjayhzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHZvaWQgX19pb21lbSAqdHJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyB0Y29uZmlnID0gaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRyk7CisKKwlBU0QoKCJoYXBweV9tZWFsX3RyYW5zY2VpdmVyX2NoZWNrOiB0Y2ZnPSUwOGx4ICIsIHRjb25maWcpKTsKKwlpZiAoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfUE9MTCkgeworCQkvKiBJZiB3ZSBhcmUgcG9sbGluZywgd2UgbXVzdCBzdG9wIHRvIGdldCB0aGUgdHJhbnNjZWl2ZXIgdHlwZS4gKi8KKwkJQVNEKCgiPHBvbGxpbmc+ICIpKTsKKwkJaWYgKGhwLT50Y3ZyX3R5cGUgPT0gaW50ZXJuYWwpIHsKKwkJCWlmICh0Y29uZmlnICYgVENWX0NGR19NRElPMSkgeworCQkJCUFTRCgoIjxpbnRlcm5hbD4gPHBvbGwgc3RvcD4gIikpOworCQkJCWhhcHB5X21lYWxfcG9sbF9zdG9wKGhwLCB0cmVncyk7CisJCQkJaHAtPnBhZGRyID0gVENWX1BBRERSX0VUWDsKKwkJCQlocC0+dGN2cl90eXBlID0gZXh0ZXJuYWw7CisJCQkJQVNEKCgiPGV4dGVybmFsPlxuIikpOworCQkJCXRjb25maWcgJj0gfihUQ1ZfQ0ZHX1BFTkFCTEUpOworCQkJCXRjb25maWcgfD0gVENWX0NGR19QU0VMRUNUOworCQkJCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHLCB0Y29uZmlnKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChocC0+dGN2cl90eXBlID09IGV4dGVybmFsKSB7CisJCQkJQVNEKCgiPGV4dGVybmFsPiAiKSk7CisJCQkJaWYgKCEoaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX1NUQVRVUykgPj4gMTYpKSB7CisJCQkJCUFTRCgoIjxwb2xsIHN0b3A+ICIpKTsKKwkJCQkJaGFwcHlfbWVhbF9wb2xsX3N0b3AoaHAsIHRyZWdzKTsKKwkJCQkJaHAtPnBhZGRyID0gVENWX1BBRERSX0lUWDsKKwkJCQkJaHAtPnRjdnJfdHlwZSA9IGludGVybmFsOworCQkJCQlBU0QoKCI8aW50ZXJuYWw+XG4iKSk7CisJCQkJCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHLAorCQkJCQkJICAgIGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9DRkcpICYKKwkJCQkJCSAgICB+KFRDVl9DRkdfUFNFTEVDVCkpOworCQkJCX0KKwkJCQlBU0QoKCJcbiIpKTsKKwkJCX0gZWxzZSB7CisJCQkJQVNEKCgiPG5vbmU+XG4iKSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQl1MzIgcmVyZWFkID0gaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRyk7CisKKwkJLyogRWxzZSB3ZSBjYW4ganVzdCB3b3JrIG9mZiBvZiB0aGUgTURJTyBiaXRzLiAqLworCQlBU0QoKCI8bm90IHBvbGxpbmc+ICIpKTsKKwkJaWYgKHJlcmVhZCAmIFRDVl9DRkdfTURJTzEpIHsKKwkJCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHLCB0Y29uZmlnIHwgVENWX0NGR19QU0VMRUNUKTsKKwkJCWhwLT5wYWRkciA9IFRDVl9QQUREUl9FVFg7CisJCQlocC0+dGN2cl90eXBlID0gZXh0ZXJuYWw7CisJCQlBU0QoKCI8ZXh0ZXJuYWw+XG4iKSk7CisJCX0gZWxzZSB7CisJCQlpZiAocmVyZWFkICYgVENWX0NGR19NRElPMCkgeworCQkJCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHLAorCQkJCQkgICAgdGNvbmZpZyAmIH4oVENWX0NGR19QU0VMRUNUKSk7CisJCQkJaHAtPnBhZGRyID0gVENWX1BBRERSX0lUWDsKKwkJCQlocC0+dGN2cl90eXBlID0gaW50ZXJuYWw7CisJCQkJQVNEKCgiPGludGVybmFsPlxuIikpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImhhcHB5IG1lYWw6IFRyYW5zY2VpdmVyIGFuZCBhIGNva2UgcGxlYXNlLiIpOworCQkJCWhwLT50Y3ZyX3R5cGUgPSBub25lOyAvKiBHcnJyLi4uICovCisJCQkJQVNEKCgiPG5vbmU+XG4iKSk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIFRoZSByZWNlaXZlIHJpbmcgYnVmZmVycyBhcmUgYSBiaXQgdHJpY2t5IHRvIGdldCByaWdodC4gIEhlcmUgZ29lcy4uLgorICoKKyAqIFRoZSBidWZmZXJzIHdlIGRtYSBpbnRvIG11c3QgYmUgNjQgYnl0ZSBhbGlnbmVkLiAgU28gd2UgdXNlIGEgc3BlY2lhbAorICogYWxsb2Nfc2tiKCkgcm91dGluZSBmb3IgdGhlIGhhcHB5IG1lYWwgdG8gYWxsb2NhdGUgNjQgYnl0ZXMgbW9yZSB0aGFuCisgKiB3ZSByZWFsbHkgbmVlZC4KKyAqCisgKiBXZSB1c2Ugc2tiX3Jlc2VydmUoKSB0byBhbGlnbiB0aGUgZGF0YSBibG9jayB3ZSBnZXQgaW4gdGhlIHNrYi4gIFdlCisgKiBhbHNvIHByb2dyYW0gdGhlIGV0eHJlZ3MtPmNmZyByZWdpc3RlciB0byB1c2UgYW4gb2Zmc2V0IG9mIDIuICBUaGlzCisgKiBpbXBlcmljYWwgY29uc3RhbnQgcGx1cyB0aGUgZXRoZXJuZXQgaGVhZGVyIHNpemUgd2lsbCBhbHdheXMgbGVhdmUKKyAqIHVzIHdpdGggYSBuaWNlbHkgYWxpZ25lZCBpcCBoZWFkZXIgb25jZSB3ZSBwYXNzIHRoaW5ncyB1cCB0byB0aGUKKyAqIHByb3RvY29sIGxheWVycy4KKyAqCisgKiBUaGUgbnVtYmVycyB3b3JrIG91dCB0bzoKKyAqCisgKiAgICAgICAgIE1heCBldGhlcm5ldCBmcmFtZSBzaXplICAgICAgICAgMTUxOAorICogICAgICAgICBFdGhlcm5ldCBoZWFkZXIgc2l6ZSAgICAgICAgICAgICAgMTQKKyAqICAgICAgICAgSGFwcHkgTWVhbCBiYXNlIG9mZnNldCAgICAgICAgICAgICAyCisgKgorICogU2F5IGEgc2tiIGRhdGEgYXJlYSBpcyBhdCAweGYwMDFiMDEwLCBhbmQgaXRzIHNpemUgYWxsb2NlZCBpcworICogKEVUSF9GUkFNRV9MRU4gKyA2NCArIDIpID0gKDE1MTQgKyA2NCArIDIpID0gMTU4MCBieXRlcy4KKyAqCisgKiBGaXJzdCBvdXIgYWxsb2Nfc2tiKCkgcm91dGluZSBhbGlnbnMgdGhlIGRhdGEgYmFzZSB0byBhIDY0IGJ5dGUKKyAqIGJvdW5kYXJ5LiAgV2Ugbm93IGhhdmUgMHhmMDAxYjA0MCBhcyBvdXIgc2tiIGRhdGEgYWRkcmVzcy4gIFdlCisgKiBwbHVnIHRoaXMgaW50byB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yIGFkZHJlc3MuCisgKgorICogTmV4dCwgd2Ugc2tiX3Jlc2VydmUoKSAyIGJ5dGVzIHRvIGFjY291bnQgZm9yIHRoZSBIYXBweSBNZWFsIG9mZnNldC4KKyAqIFNvIG5vdyB0aGUgZGF0YSB3ZSB3aWxsIGVuZCB1cCBsb29raW5nIGF0IHN0YXJ0cyBhdCAweGYwMDFiMDQyLiAgV2hlbgorICogdGhlIHBhY2tldCBhcnJpdmVzLCB3ZSB3aWxsIGNoZWNrIG91dCB0aGUgc2l6ZSByZWNlaXZlZCBhbmQgc3VidHJhY3QKKyAqIHRoaXMgZnJvbSB0aGUgc2tiLT5sZW5ndGguICBUaGVuIHdlIGp1c3QgcGFzcyB0aGUgcGFja2V0IHVwIHRvIHRoZQorICogcHJvdG9jb2xzIGFzIGlzLCBhbmQgYWxsb2NhdGUgYSBuZXcgc2tiIHRvIHJlcGxhY2UgdGhpcyBzbG90IHdlIGhhdmUKKyAqIGp1c3QgcmVjZWl2ZWQgZnJvbS4KKyAqCisgKiBUaGUgZXRoZXJuZXQgbGF5ZXIgd2lsbCBzdHJpcCB0aGUgZXRoZXIgaGVhZGVyIGZyb20gdGhlIGZyb250IG9mIHRoZQorICogc2tiIHdlIGp1c3Qgc2VudCB0byBpdCwgdGhpcyBsZWF2ZXMgdXMgd2l0aCB0aGUgaXAgaGVhZGVyIHNpdHRpbmcKKyAqIG5pY2VseSBhbGlnbmVkIGF0IDB4ZjAwMWIwNTAuICBBbHNvLCBmb3IgdGNwIGFuZCB1ZHAgcGFja2V0cyB0aGUKKyAqIEhhcHB5IE1lYWwgaGFzIGV2ZW4gY2hlY2tzdW1tZWQgdGhlIHRjcC91ZHAgZGF0YSBmb3IgdXMuICBUaGUgMTYKKyAqIGJpdCBjaGVja3N1bSBpcyBvYnRhaW5lZCBmcm9tIHRoZSBsb3cgYml0cyBvZiB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yCisgKiBmbGFncywgdGh1czoKKyAqCisgKiAJc2tiLT5jc3VtID0gcnhkLT5yeF9mbGFncyAmIDB4ZmZmZjsKKyAqIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0hXOworICoKKyAqIGJlZm9yZSBzZW5kaW5nIG9mZiB0aGUgc2tiIHRvIHRoZSBwcm90b2NvbHMsIGFuZCB3ZSBhcmUgZ29vZCBhcyBnb2xkLgorICovCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX2NsZWFuX3JpbmdzKHN0cnVjdCBoYXBweV9tZWFsICpocCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoaHAtPnJ4X3NrYnNbaV0gIT0gTlVMTCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGhwLT5yeF9za2JzW2ldOworCQkJc3RydWN0IGhhcHB5X21lYWxfcnhkICpyeGQ7CisJCQl1MzIgZG1hX2FkZHI7CisKKwkJCXJ4ZCA9ICZocC0+aGFwcHlfYmxvY2stPmhhcHB5X21lYWxfcnhkW2ldOworCQkJZG1hX2FkZHIgPSBobWVfcmVhZF9kZXNjMzIoaHAsICZyeGQtPnJ4X2FkZHIpOworCQkJaG1lX2RtYV91bm1hcChocCwgZG1hX2FkZHIsIFJYX0JVRl9BTExPQ19TSVpFLCBETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJaHAtPnJ4X3NrYnNbaV0gPSBOVUxMOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChocC0+dHhfc2tic1tpXSAhPSBOVUxMKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gaHAtPnR4X3NrYnNbaV07CisJCQlzdHJ1Y3QgaGFwcHlfbWVhbF90eGQgKnR4ZDsKKwkJCXUzMiBkbWFfYWRkcjsKKwkJCWludCBmcmFnOworCisJCQlocC0+dHhfc2tic1tpXSA9IE5VTEw7CisKKwkJCWZvciAoZnJhZyA9IDA7IGZyYWcgPD0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgZnJhZysrKSB7CisJCQkJdHhkID0gJmhwLT5oYXBweV9ibG9jay0+aGFwcHlfbWVhbF90eGRbaV07CisJCQkJZG1hX2FkZHIgPSBobWVfcmVhZF9kZXNjMzIoaHAsICZ0eGQtPnR4X2FkZHIpOworCQkJCWhtZV9kbWFfdW5tYXAoaHAsIGRtYV9hZGRyLAorCQkJCQkgICAgICAoaG1lX3JlYWRfZGVzYzMyKGhwLCAmdHhkLT50eF9mbGFncykKKwkJCQkJICAgICAgICYgVFhGTEFHX1NJWkUpLAorCQkJCQkgICAgICBETUFfVE9ERVZJQ0UpOworCisJCQkJaWYgKGZyYWcgIT0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykKKwkJCQkJaSsrOworCQkJfQorCisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQl9CisJfQorfQorCisvKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfaW5pdF9yaW5ncyhzdHJ1Y3QgaGFwcHlfbWVhbCAqaHApCit7CisJc3RydWN0IGhtZWFsX2luaXRfYmxvY2sgKmhiID0gaHAtPmhhcHB5X2Jsb2NrOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBocC0+ZGV2OworCWludCBpOworCisJSE1EKCgiaGFwcHlfbWVhbF9pbml0X3JpbmdzOiBjb3VudGVycyB0byB6ZXJvLCAiKSk7CisJaHAtPnJ4X25ldyA9IGhwLT5yeF9vbGQgPSBocC0+dHhfbmV3ID0gaHAtPnR4X29sZCA9IDA7CisKKwkvKiBGcmVlIGFueSBza2lwcHkgYnVmcyBsZWZ0IGFyb3VuZCBpbiB0aGUgcmluZ3MuICovCisJSE1EKCgiY2xlYW4sICIpKTsKKwloYXBweV9tZWFsX2NsZWFuX3JpbmdzKGhwKTsKKworCS8qIE5vdyBnZXQgbmV3IHNraXBweSBidWZzIGZvciB0aGUgcmVjZWl2ZSByaW5nLiAqLworCUhNRCgoImluaXQgcnhyaW5nLCAiKSk7CisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gaGFwcHlfbWVhbF9hbGxvY19za2IoUlhfQlVGX0FMTE9DX1NJWkUsIEdGUF9BVE9NSUMpOworCQlpZiAoIXNrYikgeworCQkJaG1lX3dyaXRlX3J4ZChocCwgJmhiLT5oYXBweV9tZWFsX3J4ZFtpXSwgMCwgMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlocC0+cnhfc2tic1tpXSA9IHNrYjsKKwkJc2tiLT5kZXYgPSBkZXY7CisKKwkJLyogQmVjYXVzZSB3ZSByZXNlcnZlIGFmdGVyd2FyZHMuICovCisJCXNrYl9wdXQoc2tiLCAoRVRIX0ZSQU1FX0xFTiArIFJYX09GRlNFVCkpOworCQlobWVfd3JpdGVfcnhkKGhwLCAmaGItPmhhcHB5X21lYWxfcnhkW2ldLAorCQkJICAgICAgKFJYRkxBR19PV04gfCAoKFJYX0JVRl9BTExPQ19TSVpFIC0gUlhfT0ZGU0VUKSA8PCAxNikpLAorCQkJICAgICAgaG1lX2RtYV9tYXAoaHAsIHNrYi0+ZGF0YSwgUlhfQlVGX0FMTE9DX1NJWkUsIERNQV9GUk9NREVWSUNFKSk7CisJCXNrYl9yZXNlcnZlKHNrYiwgUlhfT0ZGU0VUKTsKKwl9CisKKwlITUQoKCJpbml0IHR4cmluZywgIikpOworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKKwkJaG1lX3dyaXRlX3R4ZChocCwgJmhiLT5oYXBweV9tZWFsX3R4ZFtpXSwgMCwgMCk7CisKKwlITUQoKCJkb25lXG4iKSk7Cit9CisKKy8qIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF9iZWdpbl9hdXRvX25lZ290aWF0aW9uKHN0cnVjdCBoYXBweV9tZWFsICpocCwKKwkJCQkJICAgICAgdm9pZCBfX2lvbWVtICp0cmVncywKKwkJCQkJICAgICAgc3RydWN0IGV0aHRvb2xfY21kICplcCkKK3sKKwlpbnQgdGltZW91dDsKKworCS8qIFJlYWQgYWxsIG9mIHRoZSByZWdpc3RlcnMgd2UgYXJlIGludGVyZXN0ZWQgaW4gbm93LiAqLworCWhwLT5zd19ibXNyICAgICAgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTVNSKTsKKwlocC0+c3dfYm1jciAgICAgID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1DUik7CisJaHAtPnN3X3BoeXNpZDEgICA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX1BIWVNJRDEpOworCWhwLT5zd19waHlzaWQyICAgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9QSFlTSUQyKTsKKworCS8qIFhYWCBDaGVjayBCTVNSX0FORUdDQVBBQkxFLCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSB0aG91Z2guICovCisKKwlocC0+c3dfYWR2ZXJ0aXNlID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQURWRVJUSVNFKTsKKwlpZiAoZXAgPT0gTlVMTCB8fCBlcC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkvKiBBZHZlcnRpc2UgZXZlcnl0aGluZyB3ZSBjYW4gc3VwcG9ydC4gKi8KKwkJaWYgKGhwLT5zd19ibXNyICYgQk1TUl8xMEhBTEYpCisJCQlocC0+c3dfYWR2ZXJ0aXNlIHw9IChBRFZFUlRJU0VfMTBIQUxGKTsKKwkJZWxzZQorCQkJaHAtPnN3X2FkdmVydGlzZSAmPSB+KEFEVkVSVElTRV8xMEhBTEYpOworCisJCWlmIChocC0+c3dfYm1zciAmIEJNU1JfMTBGVUxMKQorCQkJaHAtPnN3X2FkdmVydGlzZSB8PSAoQURWRVJUSVNFXzEwRlVMTCk7CisJCWVsc2UKKwkJCWhwLT5zd19hZHZlcnRpc2UgJj0gfihBRFZFUlRJU0VfMTBGVUxMKTsKKwkJaWYgKGhwLT5zd19ibXNyICYgQk1TUl8xMDBIQUxGKQorCQkJaHAtPnN3X2FkdmVydGlzZSB8PSAoQURWRVJUSVNFXzEwMEhBTEYpOworCQllbHNlCisJCQlocC0+c3dfYWR2ZXJ0aXNlICY9IH4oQURWRVJUSVNFXzEwMEhBTEYpOworCQlpZiAoaHAtPnN3X2Jtc3IgJiBCTVNSXzEwMEZVTEwpCisJCQlocC0+c3dfYWR2ZXJ0aXNlIHw9IChBRFZFUlRJU0VfMTAwRlVMTCk7CisJCWVsc2UKKwkJCWhwLT5zd19hZHZlcnRpc2UgJj0gfihBRFZFUlRJU0VfMTAwRlVMTCk7CisJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIE1JSV9BRFZFUlRJU0UsIGhwLT5zd19hZHZlcnRpc2UpOworCisJCS8qIFhYWCBDdXJyZW50bHkgbm8gSGFwcHkgTWVhbCBjYXJkcyBJIGtub3cgb2ZmIHN1cHBvcnQgMTAwQmFzZVQ0LAorCQkgKiBYWFggYW5kIHRoaXMgaXMgYmVjYXVzZSB0aGUgRFA4Mzg0MCBkb2VzIG5vdCBzdXBwb3J0IGl0LCBjaGFuZ2VzCisJCSAqIFhYWCB3b3VsZCBuZWVkIHRvIGJlIG1hZGUgdG8gdGhlIHR4L3J4IGxvZ2ljIGluIHRoZSBkcml2ZXIgYXMgd2VsbAorCQkgKiBYWFggc28gSSBjb21wbGV0ZWx5IHNraXAgY2hlY2tpbmcgZm9yIGl0IGluIHRoZSBCTVNSIGZvciBub3cuCisJCSAqLworCisjaWZkZWYgQVVUT19TV0lUQ0hfREVCVUcKKwkJQVNEKCgiJXM6IEFkdmVydGlzaW5nIFsgIiwgaHAtPmRldi0+bmFtZSkpOworCQlpZiAoaHAtPnN3X2FkdmVydGlzZSAmIEFEVkVSVElTRV8xMEhBTEYpCisJCQlBU0QoKCIxMEggIikpOworCQlpZiAoaHAtPnN3X2FkdmVydGlzZSAmIEFEVkVSVElTRV8xMEZVTEwpCisJCQlBU0QoKCIxMEYgIikpOworCQlpZiAoaHAtPnN3X2FkdmVydGlzZSAmIEFEVkVSVElTRV8xMDBIQUxGKQorCQkJQVNEKCgiMTAwSCAiKSk7CisJCWlmIChocC0+c3dfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwMEZVTEwpCisJCQlBU0QoKCIxMDBGICIpKTsKKyNlbmRpZgorCisJCS8qIEVuYWJsZSBBdXRvLU5lZ290aWF0aW9uLCB0aGlzIGlzIHVzdWFsbHkgb24gYWxyZWFkeS4uLiAqLworCQlocC0+c3dfYm1jciB8PSBCTUNSX0FORU5BQkxFOworCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBNSUlfQk1DUiwgaHAtPnN3X2JtY3IpOworCisJCS8qIFJlc3RhcnQgaXQgdG8gbWFrZSBzdXJlIGl0IGlzIGdvaW5nLiAqLworCQlocC0+c3dfYm1jciB8PSBCTUNSX0FOUkVTVEFSVDsKKwkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgTUlJX0JNQ1IsIGhwLT5zd19ibWNyKTsKKworCQkvKiBCTUNSX0FOUkVTVEFSVCBzZWxmIGNsZWFycyB3aGVuIHRoZSBwcm9jZXNzIGhhcyBiZWd1bi4gKi8KKworCQl0aW1lb3V0ID0gNjQ7ICAvKiBNb3JlIHRoYW4gZW5vdWdoLiAqLworCQl3aGlsZSAoLS10aW1lb3V0KSB7CisJCQlocC0+c3dfYm1jciA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNQ1IpOworCQkJaWYgKCEoaHAtPnN3X2JtY3IgJiBCTUNSX0FOUkVTVEFSVCkpCisJCQkJYnJlYWs7IC8qIGdvdCBpdC4gKi8KKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJaWYgKCF0aW1lb3V0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBIYXBweSBNZWFsIHdvdWxkIG5vdCBzdGFydCBhdXRvIG5lZ290aWF0aW9uICIKKwkJCSAgICAgICAiQk1DUj0weCUwNHhcbiIsIGhwLT5kZXYtPm5hbWUsIGhwLT5zd19ibWNyKTsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFBlcmZvcm1pbmcgZm9yY2UgbGluayBkZXRlY3Rpb24uXG4iLAorCQkJICAgICAgIGhwLT5kZXYtPm5hbWUpOworCQkJZ290byBmb3JjZV9saW5rOworCQl9IGVsc2UgeworCQkJaHAtPnRpbWVyX3N0YXRlID0gYXJid2FpdDsKKwkJfQorCX0gZWxzZSB7Citmb3JjZV9saW5rOgorCQkvKiBGb3JjZSB0aGUgbGluayB1cCwgdHJ5aW5nIGZpcnN0IGEgcGFydGljdWxhciBtb2RlLgorCQkgKiBFaXRoZXIgd2UgYXJlIGhlcmUgYXQgdGhlIHJlcXVlc3Qgb2YgZXRodG9vbCBvcgorCQkgKiBiZWNhdXNlIHRoZSBIYXBweSBNZWFsIHdvdWxkIG5vdCBzdGFydCB0byBhdXRvbmVnLgorCQkgKi8KKworCQkvKiBEaXNhYmxlIGF1dG8tbmVnb3RpYXRpb24gaW4gQk1DUiwgZW5hYmxlIHRoZSBkdXBsZXggYW5kCisJCSAqIHNwZWVkIHNldHRpbmcsIGluaXQgdGhlIHRpbWVyIHN0YXRlIG1hY2hpbmUsIGFuZCBmaXJlIGl0IG9mZi4KKwkJICovCisJCWlmIChlcCA9PSBOVUxMIHx8IGVwLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCQlocC0+c3dfYm1jciA9IEJNQ1JfU1BFRUQxMDA7CisJCX0gZWxzZSB7CisJCQlpZiAoZXAtPnNwZWVkID09IFNQRUVEXzEwMCkKKwkJCQlocC0+c3dfYm1jciA9IEJNQ1JfU1BFRUQxMDA7CisJCQllbHNlCisJCQkJaHAtPnN3X2JtY3IgPSAwOworCQkJaWYgKGVwLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQkJaHAtPnN3X2JtY3IgfD0gQk1DUl9GVUxMRFBMWDsKKwkJfQorCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBNSUlfQk1DUiwgaHAtPnN3X2JtY3IpOworCisJCWlmICghaXNfbHVjZW50X3BoeShocCkpIHsKKwkJCS8qIE9LLCBzZWVtcyB3ZSBuZWVkIGRvIGRpc2FibGUgdGhlIHRyYW5zY2VpdmVyIGZvciB0aGUgZmlyc3QKKwkJCSAqIHRpY2sgdG8gbWFrZSBzdXJlIHdlIGdldCBhbiBhY2N1cmF0ZSBsaW5rIHN0YXRlIGF0IHRoZQorCQkJICogc2Vjb25kIHRpY2suCisJCQkgKi8KKwkJCWhwLT5zd19jc2NvbmZpZyA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywKKwkJCQkJCQkgICAgICAgRFA4Mzg0MF9DU0NPTkZJRyk7CisJCQlocC0+c3dfY3Njb25maWcgJj0gfihDU0NPTkZJR19UQ1ZESVNBQik7CisJCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBEUDgzODQwX0NTQ09ORklHLAorCQkJCQkgICAgICBocC0+c3dfY3Njb25maWcpOworCQl9CisJCWhwLT50aW1lcl9zdGF0ZSA9IGx0cnl3YWl0OworCX0KKworCWhwLT50aW1lcl90aWNrcyA9IDA7CisJaHAtPmhhcHB5X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKDEyICogSFopLzEwOyAgLyogMS4yIHNlYy4gKi8KKwlocC0+aGFwcHlfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBocDsKKwlocC0+aGFwcHlfdGltZXIuZnVuY3Rpb24gPSAmaGFwcHlfbWVhbF90aW1lcjsKKwlhZGRfdGltZXIoJmhwLT5oYXBweV90aW1lcik7Cit9CisKKy8qIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIGludCBoYXBweV9tZWFsX2luaXQoc3RydWN0IGhhcHB5X21lYWwgKmhwKQoreworCXZvaWQgX19pb21lbSAqZ3JlZ3MgICAgICAgID0gaHAtPmdyZWdzOworCXZvaWQgX19pb21lbSAqZXR4cmVncyAgICAgID0gaHAtPmV0eHJlZ3M7CisJdm9pZCBfX2lvbWVtICplcnhyZWdzICAgICAgPSBocC0+ZXJ4cmVnczsKKwl2b2lkIF9faW9tZW0gKmJyZWdzICAgICAgICA9IGhwLT5iaWdtYWNyZWdzOworCXZvaWQgX19pb21lbSAqdHJlZ3MgICAgICAgID0gaHAtPnRjdnJlZ3M7CisJdTMyIHJlZ3RtcCwgcnhjZmc7CisJdW5zaWduZWQgY2hhciAqZSA9ICZocC0+ZGV2LT5kZXZfYWRkclswXTsKKworCS8qIElmIGF1dG8tbmVnb3RpYXRpb24gdGltZXIgaXMgcnVubmluZywga2lsbCBpdC4gKi8KKwlkZWxfdGltZXIoJmhwLT5oYXBweV90aW1lcik7CisKKwlITUQoKCJoYXBweV9tZWFsX2luaXQ6IGhhcHB5X2ZsYWdzWyUwOHhdICIsCisJICAgICBocC0+aGFwcHlfZmxhZ3MpKTsKKwlpZiAoIShocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19JTklUKSkgeworCQlITUQoKCJzZXQgSEZMQUdfSU5JVCwgIikpOworCQlocC0+aGFwcHlfZmxhZ3MgfD0gSEZMQUdfSU5JVDsKKwkJaGFwcHlfbWVhbF9nZXRfY291bnRlcnMoaHAsIGJyZWdzKTsKKwl9CisKKwkvKiBTdG9wIHBvbGxpbmcuICovCisJSE1EKCgidG8gaGFwcHlfbWVhbF9wb2xsX3N0b3BcbiIpKTsKKwloYXBweV9tZWFsX3BvbGxfc3RvcChocCwgdHJlZ3MpOworCisJLyogU3RvcCB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIuICovCisJSE1EKCgiaGFwcHlfbWVhbF9pbml0OiB0byBoYXBweV9tZWFsX3N0b3BcbiIpKTsKKwloYXBweV9tZWFsX3N0b3AoaHAsIGdyZWdzKTsKKworCS8qIEFsbG9jIGFuZCByZXNldCB0aGUgdHgvcnggZGVzY3JpcHRvciBjaGFpbnMuICovCisJSE1EKCgiaGFwcHlfbWVhbF9pbml0OiB0byBoYXBweV9tZWFsX2luaXRfcmluZ3NcbiIpKTsKKwloYXBweV9tZWFsX2luaXRfcmluZ3MoaHApOworCisJLyogU2h1dCB1cCB0aGUgTUlGLiAqLworCUhNRCgoImhhcHB5X21lYWxfaW5pdDogRGlzYWJsZSBhbGwgTUlGIGlycXMgKG9sZFslMDh4XSksICIsCisJICAgICBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfSU1BU0spKSk7CisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9JTUFTSywgMHhmZmZmKTsKKworCS8qIFNlZSBpZiB3ZSBjYW4gZW5hYmxlIHRoZSBNSUYgZnJhbWUgb24gdGhpcyBjYXJkIHRvIHNwZWFrIHRvIHRoZSBEUDgzODQwLiAqLworCWlmIChocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19GRU5BQkxFKSB7CisJCUhNRCgoInVzZSBmcmFtZSBvbGRbJTA4eF0sICIsCisJCSAgICAgaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRykpKTsKKwkJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9DRkcsCisJCQkgICAgaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRykgJiB+KFRDVl9DRkdfQkVOQUJMRSkpOworCX0gZWxzZSB7CisJCUhNRCgoInVzZSBiaXRiYW5nIG9sZFslMDh4XSwgIiwKKwkJICAgICBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHKSkpOworCQlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRywKKwkJCSAgICBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHKSB8IFRDVl9DRkdfQkVOQUJMRSk7CisJfQorCisJLyogQ2hlY2sgdGhlIHN0YXRlIG9mIHRoZSB0cmFuc2NlaXZlci4gKi8KKwlITUQoKCJ0byBoYXBweV9tZWFsX3RyYW5zY2VpdmVyX2NoZWNrXG4iKSk7CisJaGFwcHlfbWVhbF90cmFuc2NlaXZlcl9jaGVjayhocCwgdHJlZ3MpOworCisJLyogUHV0IHRoZSBCaWcgTWFjIGludG8gYSBzYW5lIHN0YXRlLiAqLworCUhNRCgoImhhcHB5X21lYWxfaW5pdDogIikpOworCXN3aXRjaChocC0+dGN2cl90eXBlKSB7CisJY2FzZSBub25lOgorCQkvKiBDYW5ub3Qgb3BlcmF0ZSBpZiB3ZSBkb24ndCBrbm93IHRoZSB0cmFuc2NlaXZlciB0eXBlISAqLworCQlITUQoKCJBQUlFRUUgbm8gdHJhbnNjZWl2ZXIgdHlwZSwgRUFHQUlOIikpOworCQlyZXR1cm4gLUVBR0FJTjsKKworCWNhc2UgaW50ZXJuYWw6CisJCS8qIFVzaW5nIHRoZSBNSUkgYnVmZmVycy4gKi8KKwkJSE1EKCgiaW50ZXJuYWwsIHVzaW5nIE1JSSwgIikpOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1hJRkNGRywgMCk7CisJCWJyZWFrOworCisJY2FzZSBleHRlcm5hbDoKKwkJLyogTm90IHVzaW5nIHRoZSBNSUksIGRpc2FibGUgaXQuICovCisJCUhNRCgoImV4dGVybmFsLCBkaXNhYmxlIE1JSSwgIikpOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1hJRkNGRywgQklHTUFDX1hDRkdfTUlJRElTQUIpOworCQlicmVhazsKKwl9OworCisJaWYgKGhhcHB5X21lYWxfdGN2cl9yZXNldChocCwgdHJlZ3MpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qIFJlc2V0IHRoZSBIYXBweSBNZWFsIEJpZyBNYWMgdHJhbnNjZWl2ZXIgYW5kIHRoZSByZWNlaXZlci4gKi8KKwlITUQoKCJ0eC9yeCByZXNldCwgIikpOworCWhhcHB5X21lYWxfdHhfcmVzZXQoaHAsIGJyZWdzKTsKKwloYXBweV9tZWFsX3J4X3Jlc2V0KGhwLCBicmVncyk7CisKKwkvKiBTZXQgamFtIHNpemUgYW5kIGludGVyLXBhY2tldCBnYXBzIHRvIHJlYXNvbmFibGUgZGVmYXVsdHMuICovCisJSE1EKCgianNpemUvaXBnMS9pcGcyLCAiKSk7CisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19KU0laRSwgREVGQVVMVF9KQU1TSVpFKTsKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0lHQVAxLCBERUZBVUxUX0lQRzEpOworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSUdBUDIsIERFRkFVTFRfSVBHMik7CisKKwkvKiBMb2FkIHVwIHRoZSBNQUMgYWRkcmVzcyBhbmQgcmFuZG9tIHNlZWQuICovCisJSE1EKCgicnNlZWQvbWFjYWRkciwgIikpOworCisJLyogVGhlIGRvY3MgcmVjb21tZW5kIHRvIHVzZSB0aGUgMTBMU0Igb2Ygb3VyIE1BQyBoZXJlLiAqLworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfUlNFRUQsICgoZVs1XSB8IGVbNF08PDgpJjB4M2ZmKSk7CisKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX01BQ0FERFIyLCAoKGVbNF0gPDwgOCkgfCBlWzVdKSk7CisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19NQUNBRERSMSwgKChlWzJdIDw8IDgpIHwgZVszXSkpOworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfTUFDQUREUjAsICgoZVswXSA8PCA4KSB8IGVbMV0pKTsKKworCUhNRCgoImh0YWJsZSwgIikpOworCWlmICgoaHAtPmRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8CisJICAgIChocC0+ZGV2LT5tY19jb3VudCA+IDY0KSkgeworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTAsIDB4ZmZmZik7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMSwgMHhmZmZmKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUyLCAweGZmZmYpOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTMsIDB4ZmZmZik7CisJfSBlbHNlIGlmICgoaHAtPmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPT0gMCkgeworCQl1MTYgaGFzaF90YWJsZVs0XTsKKwkJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBocC0+ZGV2LT5tY19saXN0OworCQljaGFyICphZGRyczsKKwkJaW50IGk7CisJCXUzMiBjcmM7CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWhhc2hfdGFibGVbaV0gPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBocC0+ZGV2LT5tY19jb3VudDsgaSsrKSB7CisJCQlhZGRycyA9IGRtaS0+ZG1pX2FkZHI7CisJCQlkbWkgPSBkbWktPm5leHQ7CisKKwkJCWlmICghKCphZGRycyAmIDEpKQorCQkJCWNvbnRpbnVlOworCisJCQljcmMgPSBldGhlcl9jcmNfbGUoNiwgYWRkcnMpOworCQkJY3JjID4+PSAyNjsKKwkJCWhhc2hfdGFibGVbY3JjID4+IDRdIHw9IDEgPDwgKGNyYyAmIDB4Zik7CisJCX0KKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUwLCBoYXNoX3RhYmxlWzBdKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUxLCBoYXNoX3RhYmxlWzFdKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUyLCBoYXNoX3RhYmxlWzJdKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUzLCBoYXNoX3RhYmxlWzNdKTsKKwl9IGVsc2UgeworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTMsIDApOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTIsIDApOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTEsIDApOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTAsIDApOworCX0KKworCS8qIFNldCB0aGUgUlggYW5kIFRYIHJpbmcgcHRycy4gKi8KKwlITUQoKCJyaW5nIHB0cnMgcnhyWyUwOHhdIHR4clslMDh4XVxuIiwKKwkgICAgICgoX191MzIpaHAtPmhibG9ja19kdm1hICsgaGJsb2NrX29mZnNldChoYXBweV9tZWFsX3J4ZCwgMCkpLAorCSAgICAgKChfX3UzMilocC0+aGJsb2NrX2R2bWEgKyBoYmxvY2tfb2Zmc2V0KGhhcHB5X21lYWxfdHhkLCAwKSkpKTsKKwlobWVfd3JpdGUzMihocCwgZXJ4cmVncyArIEVSWF9SSU5HLAorCQkgICAgKChfX3UzMilocC0+aGJsb2NrX2R2bWEgKyBoYmxvY2tfb2Zmc2V0KGhhcHB5X21lYWxfcnhkLCAwKSkpOworCWhtZV93cml0ZTMyKGhwLCBldHhyZWdzICsgRVRYX1JJTkcsCisJCSAgICAoKF9fdTMyKWhwLT5oYmxvY2tfZHZtYSArIGhibG9ja19vZmZzZXQoaGFwcHlfbWVhbF90eGQsIDApKSk7CisKKwkvKiBQYXJpdHkgaXNzdWVzIGluIHRoZSBFUlggdW5pdCBvZiBzb21lIEhNRSByZXZpc2lvbnMgY2FuIGNhdXNlIHNvbWUKKwkgKiByZWdpc3RlcnMgdG8gbm90IGJlIHdyaXR0ZW4gdW5sZXNzIHRoZWlyIHBhcml0eSBpcyBldmVuLiAgRGV0ZWN0IHN1Y2gKKwkgKiBsb3N0IHdyaXRlcyBhbmQgc2ltcGx5IHJld3JpdGUgd2l0aCBhIGxvdyBiaXQgc2V0ICh3aGljaCB3aWxsIGJlIGlnbm9yZWQKKwkgKiBzaW5jZSB0aGUgcnhyaW5nIG5lZWRzIHRvIGJlIDJLIGFsaWduZWQpLgorCSAqLworCWlmIChobWVfcmVhZDMyKGhwLCBlcnhyZWdzICsgRVJYX1JJTkcpICE9CisJICAgICgoX191MzIpaHAtPmhibG9ja19kdm1hICsgaGJsb2NrX29mZnNldChoYXBweV9tZWFsX3J4ZCwgMCkpKQorCQlobWVfd3JpdGUzMihocCwgZXJ4cmVncyArIEVSWF9SSU5HLAorCQkJICAgICgoX191MzIpaHAtPmhibG9ja19kdm1hICsgaGJsb2NrX29mZnNldChoYXBweV9tZWFsX3J4ZCwgMCkpCisJCQkgICAgfCAweDQpOworCisJLyogU2V0IHRoZSBzdXBwb3J0ZWQgYnVyc3Qgc2l6ZXMuICovCisJSE1EKCgiaGFwcHlfbWVhbF9pbml0OiBvbGRbJTA4eF0gYnVyc3RzPCIsCisJICAgICBobWVfcmVhZDMyKGhwLCBncmVncyArIEdSRUdfQ0ZHKSkpOworCisjaWZuZGVmIF9fc3BhcmNfXworCS8qIEl0IGlzIGFsd2F5cyBQQ0kgYW5kIGNhbiBoYW5kbGUgNjRieXRlIGJ1cnN0cy4gKi8KKwlobWVfd3JpdGUzMihocCwgZ3JlZ3MgKyBHUkVHX0NGRywgR1JFR19DRkdfQlVSU1Q2NCk7CisjZWxzZQorCWlmICgoaHAtPmhhcHB5X2J1cnN0cyAmIERNQV9CVVJTVDY0KSAmJgorCSAgICAoKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX1BDSSkgIT0gMAorI2lmZGVmIENPTkZJR19TQlVTCisJICAgICB8fCBzYnVzX2Nhbl9idXJzdDY0KGhwLT5oYXBweV9kZXYpCisjZW5kaWYKKwkgICAgIHx8IDApKSB7CisJCXUzMiBnY2ZnID0gR1JFR19DRkdfQlVSU1Q2NDsKKworCQkvKiBJIGhhdmUgbm8gaWRlYSBpZiBJIHNob3VsZCBzZXQgdGhlIGV4dGVuZGVkCisJCSAqIHRyYW5zZmVyIG1vZGUgYml0IGZvciBDaGVlcmlvLCBzbyBmb3Igbm93IEkKKwkJICogZG8gbm90LiAgLURhdmVNCisJCSAqLworI2lmZGVmIENPTkZJR19TQlVTCisJCWlmICgoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfUENJKSA9PSAwICYmCisJCSAgICBzYnVzX2Nhbl9kbWFfNjRiaXQoaHAtPmhhcHB5X2RldikpIHsKKwkJCXNidXNfc2V0X3NidXM2NChocC0+aGFwcHlfZGV2LAorCQkJCQlocC0+aGFwcHlfYnVyc3RzKTsKKwkJCWdjZmcgfD0gR1JFR19DRkdfNjRCSVQ7CisJCX0KKyNlbmRpZgorCisJCUhNRCgoIjY0PiIpKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGdyZWdzICsgR1JFR19DRkcsIGdjZmcpOworCX0gZWxzZSBpZiAoaHAtPmhhcHB5X2J1cnN0cyAmIERNQV9CVVJTVDMyKSB7CisJCUhNRCgoIjMyPiIpKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGdyZWdzICsgR1JFR19DRkcsIEdSRUdfQ0ZHX0JVUlNUMzIpOworCX0gZWxzZSBpZiAoaHAtPmhhcHB5X2J1cnN0cyAmIERNQV9CVVJTVDE2KSB7CisJCUhNRCgoIjE2PiIpKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGdyZWdzICsgR1JFR19DRkcsIEdSRUdfQ0ZHX0JVUlNUMTYpOworCX0gZWxzZSB7CisJCUhNRCgoIlhYWD4iKSk7CisJCWhtZV93cml0ZTMyKGhwLCBncmVncyArIEdSRUdfQ0ZHLCAwKTsKKwl9CisjZW5kaWYgLyogX19zcGFyY19fICovCisKKwkvKiBUdXJuIG9mZiBpbnRlcnJ1cHRzIHdlIGRvIG5vdCB3YW50IHRvIGhlYXIuICovCisJSE1EKCgiLCBlbmFibGUgZ2xvYmFsIGludGVycnVwdHMsICIpKTsKKwlobWVfd3JpdGUzMihocCwgZ3JlZ3MgKyBHUkVHX0lNQVNLLAorCQkgICAgKEdSRUdfSU1BU0tfR09URlJBTUUgfCBHUkVHX0lNQVNLX1JDTlRFWFAgfAorCQkgICAgIEdSRUdfSU1BU0tfU0VOVEZSQU1FIHwgR1JFR19JTUFTS19UWFBFUlIpKTsKKworCS8qIFNldCB0aGUgdHJhbnNtaXQgcmluZyBidWZmZXIgc2l6ZS4gKi8KKwlITUQoKCJ0eCByc2l6ZT0lZCBvcmVnWyUwOHhdLCAiLCAoaW50KVRYX1JJTkdfU0laRSwKKwkgICAgIGhtZV9yZWFkMzIoaHAsIGV0eHJlZ3MgKyBFVFhfUlNJWkUpKSk7CisJaG1lX3dyaXRlMzIoaHAsIGV0eHJlZ3MgKyBFVFhfUlNJWkUsIChUWF9SSU5HX1NJWkUgPj4gRVRYX1JTSVpFX1NISUZUKSAtIDEpOworCisJLyogRW5hYmxlIHRyYW5zbWl0dGVyIERWTUEuICovCisJSE1EKCgidHggZG1hIGVuYWJsZSBvbGRbJTA4eF0sICIsCisJICAgICBobWVfcmVhZDMyKGhwLCBldHhyZWdzICsgRVRYX0NGRykpKTsKKwlobWVfd3JpdGUzMihocCwgZXR4cmVncyArIEVUWF9DRkcsCisJCSAgICBobWVfcmVhZDMyKGhwLCBldHhyZWdzICsgRVRYX0NGRykgfCBFVFhfQ0ZHX0RNQUVOQUJMRSk7CisKKwkvKiBUaGlzIGNoaXAgcmVhbGx5IHJvdHMsIGZvciB0aGUgcmVjZWl2ZXIgc29tZXRpbWVzIHdoZW4geW91CisJICogd3JpdGUgdG8gaXRzIGNvbnRyb2wgcmVnaXN0ZXJzIG5vdCBhbGwgdGhlIGJpdHMgZ2V0IHRoZXJlCisJICogcHJvcGVybHkuICBJIGNhbm5vdCB0aGluayBvZiBhIHNhbmUgd2F5IHRvIHByb3ZpZGUgY29tcGxldGUKKwkgKiBjb3ZlcmFnZSBmb3IgdGhpcyBoYXJkd2FyZSBidWcgeWV0LgorCSAqLworCUhNRCgoImVyeCByZWdzIGJ1ZyBvbGRbJTA4eF1cbiIsCisJICAgICBobWVfcmVhZDMyKGhwLCBlcnhyZWdzICsgRVJYX0NGRykpKTsKKwlobWVfd3JpdGUzMihocCwgZXJ4cmVncyArIEVSWF9DRkcsIEVSWF9DRkdfREVGQVVMVChSWF9PRkZTRVQpKTsKKwlyZWd0bXAgPSBobWVfcmVhZDMyKGhwLCBlcnhyZWdzICsgRVJYX0NGRyk7CisJaG1lX3dyaXRlMzIoaHAsIGVyeHJlZ3MgKyBFUlhfQ0ZHLCBFUlhfQ0ZHX0RFRkFVTFQoUlhfT0ZGU0VUKSk7CisJaWYgKGhtZV9yZWFkMzIoaHAsIGVyeHJlZ3MgKyBFUlhfQ0ZHKSAhPSBFUlhfQ0ZHX0RFRkFVTFQoUlhfT0ZGU0VUKSkgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5IG1lYWw6IEVpZWVlLCByeCBjb25maWcgcmVnaXN0ZXIgZ2V0cyBncmVhc3kgZnJpZXMuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweSBtZWFsOiBUcnlpbmcgdG8gc2V0ICUwOHgsIHJlcmVhZCBnaXZlcyAlMDh4XG4iLAorCQkgICAgICAgRVJYX0NGR19ERUZBVUxUKFJYX09GRlNFVCksIHJlZ3RtcCk7CisJCS8qIFhYWCBTaG91bGQgcmV0dXJuIGZhaWx1cmUgaGVyZS4uLiAqLworCX0KKworCS8qIEVuYWJsZSBCaWcgTWFjIGhhc2ggdGFibGUgZmlsdGVyLiAqLworCUhNRCgoImhhcHB5X21lYWxfaW5pdDogZW5hYmxlIGhhc2ggcnhfY2ZnX29sZFslMDh4XSwgIiwKKwkgICAgIGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19SWENGRykpKTsKKwlyeGNmZyA9IEJJR01BQ19SWENGR19IRU5BQkxFIHwgQklHTUFDX1JYQ0ZHX1JFSk1FOworCWlmIChocC0+ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQlyeGNmZyB8PSBCSUdNQUNfUlhDRkdfUE1JU0M7CisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19SWENGRywgcnhjZmcpOworCisJLyogTGV0IHRoZSBiaXRzIHNldHRsZSBpbiB0aGUgY2hpcC4gKi8KKwl1ZGVsYXkoMTApOworCisJLyogT2ssIGNvbmZpZ3VyZSB0aGUgQmlnIE1hYyB0cmFuc21pdHRlci4gKi8KKwlITUQoKCJCSUdNQUMgaW5pdCwgIikpOworCXJlZ3RtcCA9IDA7CisJaWYgKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX0ZVTEwpCisJCXJlZ3RtcCB8PSBCSUdNQUNfVFhDRkdfRlVMTERQTFg7CisKKwkvKiBEb24ndCB0dXJuIG9uIHRoZSAiZG9uJ3QgZ2l2ZSB1cCIgYml0IGZvciBub3cuICBJdCBjb3VsZCBjYXVzZSBobWUKKwkgKiB0byBkZWFkbG9jayB3aXRoIHRoZSBQSFkgaWYgYSBKYWJiZXIgb2NjdXJzLgorCSAqLworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfVFhDRkcsIHJlZ3RtcCAvKnwgQklHTUFDX1RYQ0ZHX0RHSVZFVVAqLyk7CisKKwkvKiBHaXZlIHVwIGFmdGVyIDE2IFRYIGF0dGVtcHRzLiAqLworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfQUxJTUlULCAxNik7CisKKwkvKiBFbmFibGUgdGhlIG91dHB1dCBkcml2ZXJzIG5vIG1hdHRlciB3aGF0LiAqLworCXJlZ3RtcCA9IEJJR01BQ19YQ0ZHX09ERU5BQkxFOworCisJLyogSWYgY2FyZCBjYW4gZG8gbGFuY2UgbW9kZSwgZW5hYmxlIGl0LiAqLworCWlmIChocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19MQU5DRSkKKwkJcmVndG1wIHw9IChERUZBVUxUX0lQRzAgPDwgNSkgfCBCSUdNQUNfWENGR19MQU5DRTsKKworCS8qIERpc2FibGUgdGhlIE1JSSBidWZmZXJzIGlmIHVzaW5nIGV4dGVybmFsIHRyYW5zY2VpdmVyLiAqLworCWlmIChocC0+dGN2cl90eXBlID09IGV4dGVybmFsKQorCQlyZWd0bXAgfD0gQklHTUFDX1hDRkdfTUlJRElTQUI7CisKKwlITUQoKCJYSUYgY29uZmlnIG9sZFslMDh4XSwgIiwKKwkgICAgIGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19YSUZDRkcpKSk7CisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19YSUZDRkcsIHJlZ3RtcCk7CisKKwkvKiBTdGFydCB0aGluZ3MgdXAuICovCisJSE1EKCgidHggb2xkWyUwOHhdIGFuZCByeCBbJTA4eF0gT04hXG4iLAorCSAgICAgaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX1RYQ0ZHKSwKKwkgICAgIGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19SWENGRykpKTsKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1RYQ0ZHLAorCQkgICAgaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX1RYQ0ZHKSB8IEJJR01BQ19UWENGR19FTkFCTEUpOworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfUlhDRkcsCisJCSAgICBobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfUlhDRkcpIHwgQklHTUFDX1JYQ0ZHX0VOQUJMRSk7CisKKwkvKiBHZXQgdGhlIGF1dG9uZWdvdGlhdGlvbiBzdGFydGVkLCBhbmQgdGhlIHdhdGNoIHRpbWVyIHRpY2tpbmcuICovCisJaGFwcHlfbWVhbF9iZWdpbl9hdXRvX25lZ290aWF0aW9uKGhwLCB0cmVncywgTlVMTCk7CisKKwkvKiBTdWNjZXNzLiAqLworCXJldHVybiAwOworfQorCisvKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfc2V0X2luaXRpYWxfYWR2ZXJ0aXNlbWVudChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHApCit7CisJdm9pZCBfX2lvbWVtICp0cmVncwk9IGhwLT50Y3ZyZWdzOworCXZvaWQgX19pb21lbSAqYnJlZ3MJPSBocC0+YmlnbWFjcmVnczsKKwl2b2lkIF9faW9tZW0gKmdyZWdzCT0gaHAtPmdyZWdzOworCisJaGFwcHlfbWVhbF9zdG9wKGhwLCBncmVncyk7CisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9JTUFTSywgMHhmZmZmKTsKKwlpZiAoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfRkVOQUJMRSkKKwkJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9DRkcsCisJCQkgICAgaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRykgJiB+KFRDVl9DRkdfQkVOQUJMRSkpOworCWVsc2UKKwkJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9DRkcsCisJCQkgICAgaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRykgfCBUQ1ZfQ0ZHX0JFTkFCTEUpOworCWhhcHB5X21lYWxfdHJhbnNjZWl2ZXJfY2hlY2soaHAsIHRyZWdzKTsKKwlzd2l0Y2goaHAtPnRjdnJfdHlwZSkgeworCWNhc2Ugbm9uZToKKwkJcmV0dXJuOworCWNhc2UgaW50ZXJuYWw6CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfWElGQ0ZHLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBleHRlcm5hbDoKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19YSUZDRkcsIEJJR01BQ19YQ0ZHX01JSURJU0FCKTsKKwkJYnJlYWs7CisJfTsKKwlpZiAoaGFwcHlfbWVhbF90Y3ZyX3Jlc2V0KGhwLCB0cmVncykpCisJCXJldHVybjsKKworCS8qIExhdGNoIFBIWSByZWdpc3RlcnMgYXMgb2Ygbm93LiAqLworCWhwLT5zd19ibXNyICAgICAgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTVNSKTsKKwlocC0+c3dfYWR2ZXJ0aXNlID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQURWRVJUSVNFKTsKKworCS8qIEFkdmVydGlzZSBldmVyeXRoaW5nIHdlIGNhbiBzdXBwb3J0LiAqLworCWlmIChocC0+c3dfYm1zciAmIEJNU1JfMTBIQUxGKQorCQlocC0+c3dfYWR2ZXJ0aXNlIHw9IChBRFZFUlRJU0VfMTBIQUxGKTsKKwllbHNlCisJCWhwLT5zd19hZHZlcnRpc2UgJj0gfihBRFZFUlRJU0VfMTBIQUxGKTsKKworCWlmIChocC0+c3dfYm1zciAmIEJNU1JfMTBGVUxMKQorCQlocC0+c3dfYWR2ZXJ0aXNlIHw9IChBRFZFUlRJU0VfMTBGVUxMKTsKKwllbHNlCisJCWhwLT5zd19hZHZlcnRpc2UgJj0gfihBRFZFUlRJU0VfMTBGVUxMKTsKKwlpZiAoaHAtPnN3X2Jtc3IgJiBCTVNSXzEwMEhBTEYpCisJCWhwLT5zd19hZHZlcnRpc2UgfD0gKEFEVkVSVElTRV8xMDBIQUxGKTsKKwllbHNlCisJCWhwLT5zd19hZHZlcnRpc2UgJj0gfihBRFZFUlRJU0VfMTAwSEFMRik7CisJaWYgKGhwLT5zd19ibXNyICYgQk1TUl8xMDBGVUxMKQorCQlocC0+c3dfYWR2ZXJ0aXNlIHw9IChBRFZFUlRJU0VfMTAwRlVMTCk7CisJZWxzZQorCQlocC0+c3dfYWR2ZXJ0aXNlICY9IH4oQURWRVJUSVNFXzEwMEZVTEwpOworCisJLyogVXBkYXRlIHRoZSBQSFkgYWR2ZXJ0aXNlbWVudCByZWdpc3Rlci4gKi8KKwloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBNSUlfQURWRVJUSVNFLCBocC0+c3dfYWR2ZXJ0aXNlKTsKK30KKworLyogT25jZSBzdGF0dXMgaXMgbGF0Y2hlZCAoYnkgaGFwcHlfbWVhbF9pbnRlcnJ1cHQpIGl0IGlzIGNsZWFyZWQgYnkKKyAqIHRoZSBoYXJkd2FyZSwgc28gd2UgY2Fubm90IHJlLXJlYWQgaXQgYW5kIGdldCBhIGNvcnJlY3QgdmFsdWUuCisgKgorICogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkCisgKi8KK3N0YXRpYyBpbnQgaGFwcHlfbWVhbF9pc19ub3Rfc29faGFwcHkoc3RydWN0IGhhcHB5X21lYWwgKmhwLCB1MzIgc3RhdHVzKQoreworCWludCByZXNldCA9IDA7CisJCisJLyogT25seSBwcmludCBtZXNzYWdlcyBmb3Igbm9uLWNvdW50ZXIgcmVsYXRlZCBpbnRlcnJ1cHRzLiAqLworCWlmIChzdGF0dXMgJiAoR1JFR19TVEFUX1NUU1RFUlIgfCBHUkVHX1NUQVRfVEZJRk9fVU5EIHwKKwkJICAgICAgR1JFR19TVEFUX01BWFBLVEVSUiB8IEdSRUdfU1RBVF9SWEVSUiB8CisJCSAgICAgIEdSRUdfU1RBVF9SWFBFUlIgfCBHUkVHX1NUQVRfUlhURVJSIHwgR1JFR19TVEFUX0VPUEVSUiB8CisJCSAgICAgIEdSRUdfU1RBVF9NSUZJUlEgfCBHUkVHX1NUQVRfVFhFQUNLIHwgR1JFR19TVEFUX1RYTEVSUiB8CisJCSAgICAgIEdSRUdfU1RBVF9UWFBFUlIgfCBHUkVHX1NUQVRfVFhURVJSIHwgR1JFR19TVEFUX1NMVkVSUiB8CisJCSAgICAgIEdSRUdfU1RBVF9TTFZQRVJSKSkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgaW50ZXJydXB0IGZvciBoYXBweSBtZWFsLCBzdGF0dXMgPSAlMDh4XG4iLAorCQkgICAgICAgaHAtPmRldi0+bmFtZSwgc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiBHUkVHX1NUQVRfUkZJRk9WRikgeworCQkvKiBSZWNlaXZlIEZJRk8gb3ZlcmZsb3cgaXMgaGFybWxlc3MgYW5kIHRoZSBoYXJkd2FyZSB3aWxsIHRha2UKKwkJICAgY2FyZSBvZiBpdCwganVzdCBzb21lIHBhY2tldHMgYXJlIGxvc3QuIFdobyBjYXJlcy4gKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBIYXBweSBNZWFsIHJlY2VpdmUgRklGTyBvdmVyZmxvdy5cbiIsIGhwLT5kZXYtPm5hbWUpOworCX0KKworCWlmIChzdGF0dXMgJiBHUkVHX1NUQVRfU1RTVEVSUikgeworCQkvKiBCaWdNQUMgU1FFIGxpbmsgdGVzdCBmYWlsZWQuICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhhcHB5IE1lYWwgQmlnTUFDIFNRRSB0ZXN0IGZhaWxlZC5cbiIsIGhwLT5kZXYtPm5hbWUpOworCQlyZXNldCA9IDE7CisJfQorCisJaWYgKHN0YXR1cyAmIEdSRUdfU1RBVF9URklGT19VTkQpIHsKKwkJLyogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biwgYWdhaW4gRE1BIGVycm9yIGxpa2VseS4gKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSGFwcHkgTWVhbCB0cmFuc21pdHRlciBGSUZPIHVuZGVycnVuLCBETUEgZXJyb3IuXG4iLAorCQkgICAgICAgaHAtPmRldi0+bmFtZSk7CisJCXJlc2V0ID0gMTsKKwl9CisKKwlpZiAoc3RhdHVzICYgR1JFR19TVEFUX01BWFBLVEVSUikgeworCQkvKiBEcml2ZXIgZXJyb3IsIHRyaWVkIHRvIHRyYW5zbWl0IHNvbWV0aGluZyBsYXJnZXIKKwkJICogdGhhbiBldGhlcm5ldCBtYXggbXR1LgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSGFwcHkgTWVhbCBNQVggUGFja2V0IHNpemUgZXJyb3IuXG4iLCBocC0+ZGV2LT5uYW1lKTsKKwkJcmVzZXQgPSAxOworCX0KKworCWlmIChzdGF0dXMgJiBHUkVHX1NUQVRfTk9SWEQpIHsKKwkJLyogVGhpcyBpcyBoYXJtbGVzcywgaXQganVzdCBtZWFucyB0aGUgc3lzdGVtIGlzCisJCSAqIHF1aXRlIGxvYWRlZCBhbmQgdGhlIGluY29taW5nIHBhY2tldCByYXRlIHdhcworCQkgKiBmYXN0ZXIgdGhhbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgY291bGQga2VlcCB1cAorCQkgKiB3aXRoLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhhcHB5IE1lYWwgb3V0IG9mIHJlY2VpdmUgIgorCQkgICAgICAgImRlc2NyaXB0b3JzLCBwYWNrZXQgZHJvcHBlZC5cbiIsCisJCSAgICAgICBocC0+ZGV2LT5uYW1lKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgKEdSRUdfU1RBVF9SWEVSUnxHUkVHX1NUQVRfUlhQRVJSfEdSRUdfU1RBVF9SWFRFUlIpKSB7CisJCS8qIEFsbCBzb3J0cyBvZiBETUEgcmVjZWl2ZSBlcnJvcnMuICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhhcHB5IE1lYWwgcnggRE1BIGVycm9ycyBbICIsIGhwLT5kZXYtPm5hbWUpOworCQlpZiAoc3RhdHVzICYgR1JFR19TVEFUX1JYRVJSKQorCQkJcHJpbnRrKCJHZW5lcmljRXJyb3IgIik7CisJCWlmIChzdGF0dXMgJiBHUkVHX1NUQVRfUlhQRVJSKQorCQkJcHJpbnRrKCJQYXJpdHlFcnJvciAiKTsKKwkJaWYgKHN0YXR1cyAmIEdSRUdfU1RBVF9SWFRFUlIpCisJCQlwcmludGsoIlJ4VGFnQm90Y2ggIik7CisJCXByaW50aygiXVxuIik7CisJCXJlc2V0ID0gMTsKKwl9CisKKwlpZiAoc3RhdHVzICYgR1JFR19TVEFUX0VPUEVSUikgeworCQkvKiBEcml2ZXIgYnVnLCBkaWRuJ3Qgc2V0IEVPUCBiaXQgaW4gdHggZGVzY3JpcHRvciBnaXZlbgorCQkgKiB0byB0aGUgaGFwcHkgbWVhbC4KKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVPUCBub3Qgc2V0IGluIGhhcHB5IG1lYWwgdHJhbnNtaXQgZGVzY3JpcHRvciFcbiIsCisJCSAgICAgICBocC0+ZGV2LT5uYW1lKTsKKwkJcmVzZXQgPSAxOworCX0KKworCWlmIChzdGF0dXMgJiBHUkVHX1NUQVRfTUlGSVJRKSB7CisJCS8qIE1JRiBzaWduYWxsZWQgYW4gaW50ZXJydXB0LCB3ZXJlIHdlIHBvbGxpbmcgaXQ/ICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhhcHB5IE1lYWwgTUlGIGludGVycnVwdC5cbiIsIGhwLT5kZXYtPm5hbWUpOworCX0KKworCWlmIChzdGF0dXMgJgorCSAgICAoR1JFR19TVEFUX1RYRUFDS3xHUkVHX1NUQVRfVFhMRVJSfEdSRUdfU1RBVF9UWFBFUlJ8R1JFR19TVEFUX1RYVEVSUikpIHsKKwkJLyogQWxsIHNvcnRzIG9mIHRyYW5zbWl0IERNQSBlcnJvcnMuICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhhcHB5IE1lYWwgdHggRE1BIGVycm9ycyBbICIsIGhwLT5kZXYtPm5hbWUpOworCQlpZiAoc3RhdHVzICYgR1JFR19TVEFUX1RYRUFDSykKKwkJCXByaW50aygiR2VuZXJpY0Vycm9yICIpOworCQlpZiAoc3RhdHVzICYgR1JFR19TVEFUX1RYTEVSUikKKwkJCXByaW50aygiTGF0ZUVycm9yICIpOworCQlpZiAoc3RhdHVzICYgR1JFR19TVEFUX1RYUEVSUikKKwkJCXByaW50aygiUGFyaXR5RXJybyAiKTsKKwkJaWYgKHN0YXR1cyAmIEdSRUdfU1RBVF9UWFRFUlIpCisJCQlwcmludGsoIlRhZ0JvdGNoICIpOworCQlwcmludGsoIl1cbiIpOworCQlyZXNldCA9IDE7CisJfQorCisJaWYgKHN0YXR1cyAmIChHUkVHX1NUQVRfU0xWRVJSfEdSRUdfU1RBVF9TTFZQRVJSKSkgeworCQkvKiBCdXMgb3IgcGFyaXR5IGVycm9yIHdoZW4gY3B1IGFjY2Vzc2VkIGhhcHB5IG1lYWwgcmVnaXN0ZXJzCisJCSAqIG9yIGl0J3MgaW50ZXJuYWwgRklGTydzLiAgU2hvdWxkIG5ldmVyIHNlZSB0aGlzLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSGFwcHkgTWVhbCByZWdpc3RlciBhY2Nlc3MgU0JVUyBzbGF2ZSAoJXMpIGVycm9yLlxuIiwKKwkJICAgICAgIGhwLT5kZXYtPm5hbWUsCisJCSAgICAgICAoc3RhdHVzICYgR1JFR19TVEFUX1NMVlBFUlIpID8gInBhcml0eSIgOiAiZ2VuZXJpYyIpOworCQlyZXNldCA9IDE7CisJfQorCisJaWYgKHJlc2V0KSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFJlc2V0dGluZy4uLlxuIiwgaHAtPmRldi0+bmFtZSk7CisJCWhhcHB5X21lYWxfaW5pdChocCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX21pZl9pbnRlcnJ1cHQoc3RydWN0IGhhcHB5X21lYWwgKmhwKQoreworCXZvaWQgX19pb21lbSAqdHJlZ3MgPSBocC0+dGN2cmVnczsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIHN0YXR1cyBjaGFuZ2UuXG4iLCBocC0+ZGV2LT5uYW1lKTsKKwlocC0+c3dfYm1jciA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNQ1IpOworCWhwLT5zd19scGEgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9MUEEpOworCisJLyogVXNlIHRoZSBmYXN0ZXN0IHRyYW5zbWlzc2lvbiBwcm90b2NvbCBwb3NzaWJsZS4gKi8KKwlpZiAoaHAtPnN3X2xwYSAmIExQQV8xMDBGVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTd2l0Y2hpbmcgdG8gMTAwTWJwcyBhdCBmdWxsIGR1cGxleC4iLCBocC0+ZGV2LT5uYW1lKTsKKwkJaHAtPnN3X2JtY3IgfD0gKEJNQ1JfRlVMTERQTFggfCBCTUNSX1NQRUVEMTAwKTsKKwl9IGVsc2UgaWYgKGhwLT5zd19scGEgJiBMUEFfMTAwSEFMRikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogU3dpdGNoaW5nIHRvIDEwME1CcHMgYXQgaGFsZiBkdXBsZXguIiwgaHAtPmRldi0+bmFtZSk7CisJCWhwLT5zd19ibWNyIHw9IEJNQ1JfU1BFRUQxMDA7CisJfSBlbHNlIGlmIChocC0+c3dfbHBhICYgTFBBXzEwRlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogU3dpdGNoaW5nIHRvIDEwTUJwcyBhdCBmdWxsIGR1cGxleC4iLCBocC0+ZGV2LT5uYW1lKTsKKwkJaHAtPnN3X2JtY3IgfD0gQk1DUl9GVUxMRFBMWDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogVXNpbmcgMTBNYnBzIGF0IGhhbGYgZHVwbGV4LiIsIGhwLT5kZXYtPm5hbWUpOworCX0KKwloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBNSUlfQk1DUiwgaHAtPnN3X2JtY3IpOworCisJLyogRmluYWxseSBzdG9wIHBvbGxpbmcgYW5kIHNodXQgdXAgdGhlIE1JRi4gKi8KKwloYXBweV9tZWFsX3BvbGxfc3RvcChocCwgdHJlZ3MpOworfQorCisjaWZkZWYgVFhERUJVRworI2RlZmluZSBUWEQoeCkgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIFRYRCh4KQorI2VuZGlmCisKKy8qIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF90eChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHApCit7CisJc3RydWN0IGhhcHB5X21lYWxfdHhkICp0eGJhc2UgPSAmaHAtPmhhcHB5X2Jsb2NrLT5oYXBweV9tZWFsX3R4ZFswXTsKKwlzdHJ1Y3QgaGFwcHlfbWVhbF90eGQgKnRoaXM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGhwLT5kZXY7CisJaW50IGVsZW07CisKKwllbGVtID0gaHAtPnR4X29sZDsKKwlUWEQoKCJUWDwiKSk7CisJd2hpbGUgKGVsZW0gIT0gaHAtPnR4X25ldykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQl1MzIgZmxhZ3MsIGRtYV9hZGRyLCBkbWFfbGVuOworCQlpbnQgZnJhZzsKKworCQlUWEQoKCJbJWRdIiwgZWxlbSkpOworCQl0aGlzID0gJnR4YmFzZVtlbGVtXTsKKwkJZmxhZ3MgPSBobWVfcmVhZF9kZXNjMzIoaHAsICZ0aGlzLT50eF9mbGFncyk7CisJCWlmIChmbGFncyAmIFRYRkxBR19PV04pCisJCQlicmVhazsKKwkJc2tiID0gaHAtPnR4X3NrYnNbZWxlbV07CisJCWlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSB7CisJCQlpbnQgbGFzdDsKKworCQkJbGFzdCA9IGVsZW0gKyBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCQkJbGFzdCAmPSAoVFhfUklOR19TSVpFIC0gMSk7CisJCQlmbGFncyA9IGhtZV9yZWFkX2Rlc2MzMihocCwgJnR4YmFzZVtsYXN0XS50eF9mbGFncyk7CisJCQlpZiAoZmxhZ3MgJiBUWEZMQUdfT1dOKQorCQkJCWJyZWFrOworCQl9CisJCWhwLT50eF9za2JzW2VsZW1dID0gTlVMTDsKKwkJaHAtPm5ldF9zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCQlmb3IgKGZyYWcgPSAwOyBmcmFnIDw9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGZyYWcrKykgeworCQkJZG1hX2FkZHIgPSBobWVfcmVhZF9kZXNjMzIoaHAsICZ0aGlzLT50eF9hZGRyKTsKKwkJCWRtYV9sZW4gPSBobWVfcmVhZF9kZXNjMzIoaHAsICZ0aGlzLT50eF9mbGFncyk7CisKKwkJCWRtYV9sZW4gJj0gVFhGTEFHX1NJWkU7CisJCQlobWVfZG1hX3VubWFwKGhwLCBkbWFfYWRkciwgZG1hX2xlbiwgRE1BX1RPREVWSUNFKTsKKworCQkJZWxlbSA9IE5FWFRfVFgoZWxlbSk7CisJCQl0aGlzID0gJnR4YmFzZVtlbGVtXTsKKwkJfQorCisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCWhwLT5uZXRfc3RhdHMudHhfcGFja2V0cysrOworCX0KKwlocC0+dHhfb2xkID0gZWxlbTsKKwlUWEQoKCI+IikpOworCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCSAgICBUWF9CVUZGU19BVkFJTChocCkgPiAoTUFYX1NLQl9GUkFHUyArIDEpKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKyNpZmRlZiBSWERFQlVHCisjZGVmaW5lIFJYRCh4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgUlhEKHgpCisjZW5kaWYKKworLyogT3JpZ2luYWxseSBJIHVzZWQgdG8gaGFuZGxlIHRoZSBhbGxvY2F0aW9uIGZhaWx1cmUgYnkganVzdCBnaXZpbmcgYmFjayBqdXN0CisgKiB0aGF0IG9uZSByaW5nIGJ1ZmZlciB0byB0aGUgaGFwcHkgbWVhbC4gIFByb2JsZW0gaXMgdGhhdCB1c3VhbGx5IHdoZW4gdGhhdAorICogY29uZGl0aW9uIGlzIHRyaWdnZXJlZCwgdGhlIGhhcHB5IG1lYWwgZXhwZWN0cyB5b3UgdG8gZG8gc29tZXRoaW5nIHJlYXNvbmFibGUKKyAqIHdpdGggYWxsIG9mIHRoZSBwYWNrZXRzIGl0IGhhcyBETUEnZCBpbi4gIFNvIG5vdyBJIGp1c3QgZHJvcCB0aGUgZW50aXJlCisgKiByaW5nIHdoZW4gd2UgY2Fubm90IGdldCBhIG5ldyBza2IgYW5kIGdpdmUgdGhlbSBhbGwgYmFjayB0byB0aGUgaGFwcHkgbWVhbCwKKyAqIG1heWJlIHRoaW5ncyB3aWxsIGJlICJoYXBwaWVyIiBub3cuCisgKgorICogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkCisgKi8KK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfcngoc3RydWN0IGhhcHB5X21lYWwgKmhwLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYXBweV9tZWFsX3J4ZCAqcnhiYXNlID0gJmhwLT5oYXBweV9ibG9jay0+aGFwcHlfbWVhbF9yeGRbMF07CisJc3RydWN0IGhhcHB5X21lYWxfcnhkICp0aGlzOworCWludCBlbGVtID0gaHAtPnJ4X25ldywgZHJvcHMgPSAwOworCXUzMiBmbGFnczsKKworCVJYRCgoIlJYPCIpKTsKKwl0aGlzID0gJnJ4YmFzZVtlbGVtXTsKKwl3aGlsZSAoISgoZmxhZ3MgPSBobWVfcmVhZF9kZXNjMzIoaHAsICZ0aGlzLT5yeF9mbGFncykpICYgUlhGTEFHX09XTikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJaW50IGxlbiA9IGZsYWdzID4+IDE2OworCQl1MTYgY3N1bSA9IGZsYWdzICYgUlhGTEFHX0NTVU07CisJCXUzMiBkbWFfYWRkciA9IGhtZV9yZWFkX2Rlc2MzMihocCwgJnRoaXMtPnJ4X2FkZHIpOworCisJCVJYRCgoIlslZCAiLCBlbGVtKSk7CisKKwkJLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KKwkJaWYgKChsZW4gPCBFVEhfWkxFTikgfHwgKGZsYWdzICYgUlhGTEFHX09WRVJGTE9XKSkgeworCQkJUlhEKCgiRVJSKCUwOHgpXSIsIGZsYWdzKSk7CisJCQlocC0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKGxlbiA8IEVUSF9aTEVOKQorCQkJCWhwLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKGxlbiAmIChSWEZMQUdfT1ZFUkZMT1cgPj4gMTYpKSB7CisJCQkJaHAtPm5ldF9zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJCWhwLT5uZXRfc3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCX0KKworCQkJLyogUmV0dXJuIGl0IHRvIHRoZSBIYXBweSBtZWFsLiAqLworCWRyb3BfaXQ6CisJCQlocC0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWhtZV93cml0ZV9yeGQoaHAsIHRoaXMsCisJCQkJICAgICAgKFJYRkxBR19PV058KChSWF9CVUZfQUxMT0NfU0laRS1SWF9PRkZTRVQpPDwxNikpLAorCQkJCSAgICAgIGRtYV9hZGRyKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCQlza2IgPSBocC0+cnhfc2tic1tlbGVtXTsKKwkJaWYgKGxlbiA+IFJYX0NPUFlfVEhSRVNIT0xEKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKKworCQkJLyogTm93IHJlZmlsbCB0aGUgZW50cnksIGlmIHdlIGNhbi4gKi8KKwkJCW5ld19za2IgPSBoYXBweV9tZWFsX2FsbG9jX3NrYihSWF9CVUZfQUxMT0NfU0laRSwgR0ZQX0FUT01JQyk7CisJCQlpZiAobmV3X3NrYiA9PSBOVUxMKSB7CisJCQkJZHJvcHMrKzsKKwkJCQlnb3RvIGRyb3BfaXQ7CisJCQl9CisJCQlobWVfZG1hX3VubWFwKGhwLCBkbWFfYWRkciwgUlhfQlVGX0FMTE9DX1NJWkUsIERNQV9GUk9NREVWSUNFKTsKKwkJCWhwLT5yeF9za2JzW2VsZW1dID0gbmV3X3NrYjsKKwkJCW5ld19za2ItPmRldiA9IGRldjsKKwkJCXNrYl9wdXQobmV3X3NrYiwgKEVUSF9GUkFNRV9MRU4gKyBSWF9PRkZTRVQpKTsKKwkJCWhtZV93cml0ZV9yeGQoaHAsIHRoaXMsCisJCQkJICAgICAgKFJYRkxBR19PV058KChSWF9CVUZfQUxMT0NfU0laRS1SWF9PRkZTRVQpPDwxNikpLAorCQkJCSAgICAgIGhtZV9kbWFfbWFwKGhwLCBuZXdfc2tiLT5kYXRhLCBSWF9CVUZfQUxMT0NfU0laRSwgRE1BX0ZST01ERVZJQ0UpKTsKKwkJCXNrYl9yZXNlcnZlKG5ld19za2IsIFJYX09GRlNFVCk7CisKKwkJCS8qIFRyaW0gdGhlIG9yaWdpbmFsIHNrYiBmb3IgdGhlIG5ldGlmLiAqLworCQkJc2tiX3RyaW0oc2tiLCBsZW4pOworCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKmNvcHlfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAyKTsKKworCQkJaWYgKGNvcHlfc2tiID09IE5VTEwpIHsKKwkJCQlkcm9wcysrOworCQkJCWdvdG8gZHJvcF9pdDsKKwkJCX0KKworCQkJY29weV9za2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlKGNvcHlfc2tiLCAyKTsKKwkJCXNrYl9wdXQoY29weV9za2IsIGxlbik7CisJCQlobWVfZG1hX3N5bmNfZm9yX2NwdShocCwgZG1hX2FkZHIsIGxlbiwgRE1BX0ZST01ERVZJQ0UpOworCQkJbWVtY3B5KGNvcHlfc2tiLT5kYXRhLCBza2ItPmRhdGEsIGxlbik7CisJCQlobWVfZG1hX3N5bmNfZm9yX2RldmljZShocCwgZG1hX2FkZHIsIGxlbiwgRE1BX0ZST01ERVZJQ0UpOworCisJCQkvKiBSZXVzZSBvcmlnaW5hbCByaW5nIGJ1ZmZlci4gKi8KKwkJCWhtZV93cml0ZV9yeGQoaHAsIHRoaXMsCisJCQkJICAgICAgKFJYRkxBR19PV058KChSWF9CVUZfQUxMT0NfU0laRS1SWF9PRkZTRVQpPDwxNikpLAorCQkJCSAgICAgIGRtYV9hZGRyKTsKKworCQkJc2tiID0gY29weV9za2I7CisJCX0KKworCQkvKiBUaGlzIGNhcmQgaXMgX2Z1Y2tpbmdfIGhvdC4uLiAqLworCQlza2ItPmNzdW0gPSBudG9ocyhjc3VtIF4gMHhmZmZmKTsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9IVzsKKworCQlSWEQoKCJsZW49JWQgY3N1bT0lNHhdIiwgbGVuLCBjc3VtKSk7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCW5ldGlmX3J4KHNrYik7CisKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJaHAtPm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7CisJCWhwLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCW5leHQ6CisJCWVsZW0gPSBORVhUX1JYKGVsZW0pOworCQl0aGlzID0gJnJ4YmFzZVtlbGVtXTsKKwl9CisJaHAtPnJ4X25ldyA9IGVsZW07CisJaWYgKGRyb3BzKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLCBocC0+ZGV2LT5uYW1lKTsKKwlSWEQoKCI+IikpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaGFwcHlfbWVhbF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgID0gZGV2LT5wcml2OworCXUzMiBoYXBweV9zdGF0dXMgICAgICAgPSBobWVfcmVhZDMyKGhwLCBocC0+Z3JlZ3MgKyBHUkVHX1NUQVQpOworCisJSE1EKCgiaGFwcHlfbWVhbF9pbnRlcnJ1cHQ6IHN0YXR1cz0lMDh4ICIsIGhhcHB5X3N0YXR1cykpOworCisJc3Bpbl9sb2NrKCZocC0+aGFwcHlfbG9jayk7CisKKwlpZiAoaGFwcHlfc3RhdHVzICYgR1JFR19TVEFUX0VSUk9SUykgeworCQlITUQoKCJFUlJPUlMgIikpOworCQlpZiAoaGFwcHlfbWVhbF9pc19ub3Rfc29faGFwcHkoaHAsIC8qIHVuLSAqLyBoYXBweV9zdGF0dXMpKQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKGhhcHB5X3N0YXR1cyAmIEdSRUdfU1RBVF9NSUZJUlEpIHsKKwkJSE1EKCgiTUlGSVJRICIpKTsKKwkJaGFwcHlfbWVhbF9taWZfaW50ZXJydXB0KGhwKTsKKwl9CisKKwlpZiAoaGFwcHlfc3RhdHVzICYgR1JFR19TVEFUX1RYQUxMKSB7CisJCUhNRCgoIlRYQUxMICIpKTsKKwkJaGFwcHlfbWVhbF90eChocCk7CisJfQorCisJaWYgKGhhcHB5X3N0YXR1cyAmIEdSRUdfU1RBVF9SWFRPSE9TVCkgeworCQlITUQoKCJSWFRPSE9TVCAiKSk7CisJCWhhcHB5X21lYWxfcngoaHAsIGRldik7CisJfQorCisJSE1EKCgiZG9uZVxuIikpOworb3V0OgorCXNwaW5fdW5sb2NrKCZocC0+aGFwcHlfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZmRlZiBDT05GSUdfU0JVUworc3RhdGljIGlycXJldHVybl90IHF1YXR0cm9fc2J1c19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqY29va2llLCBzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzKQoreworCXN0cnVjdCBxdWF0dHJvICpxcCA9IChzdHJ1Y3QgcXVhdHRybyAqKSBjb29raWU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBxcC0+aGFwcHlfbWVhbHNbaV07CisJCXN0cnVjdCBoYXBweV9tZWFsICpocCAgPSBkZXYtPnByaXY7CisJCXUzMiBoYXBweV9zdGF0dXMgICAgICAgPSBobWVfcmVhZDMyKGhwLCBocC0+Z3JlZ3MgKyBHUkVHX1NUQVQpOworCisJCUhNRCgoInF1YXR0cm9faW50ZXJydXB0OiBzdGF0dXM9JTA4eCAiLCBoYXBweV9zdGF0dXMpKTsKKworCQlpZiAoIShoYXBweV9zdGF0dXMgJiAoR1JFR19TVEFUX0VSUk9SUyB8CisJCQkJICAgICAgR1JFR19TVEFUX01JRklSUSB8CisJCQkJICAgICAgR1JFR19TVEFUX1RYQUxMIHwKKwkJCQkgICAgICBHUkVHX1NUQVRfUlhUT0hPU1QpKSkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9jaygmaHAtPmhhcHB5X2xvY2spOworCisJCWlmIChoYXBweV9zdGF0dXMgJiBHUkVHX1NUQVRfRVJST1JTKSB7CisJCQlITUQoKCJFUlJPUlMgIikpOworCQkJaWYgKGhhcHB5X21lYWxfaXNfbm90X3NvX2hhcHB5KGhwLCBoYXBweV9zdGF0dXMpKQorCQkJCWdvdG8gbmV4dDsKKwkJfQorCisJCWlmIChoYXBweV9zdGF0dXMgJiBHUkVHX1NUQVRfTUlGSVJRKSB7CisJCQlITUQoKCJNSUZJUlEgIikpOworCQkJaGFwcHlfbWVhbF9taWZfaW50ZXJydXB0KGhwKTsKKwkJfQorCisJCWlmIChoYXBweV9zdGF0dXMgJiBHUkVHX1NUQVRfVFhBTEwpIHsKKwkJCUhNRCgoIlRYQUxMICIpKTsKKwkJCWhhcHB5X21lYWxfdHgoaHApOworCQl9CisKKwkJaWYgKGhhcHB5X3N0YXR1cyAmIEdSRUdfU1RBVF9SWFRPSE9TVCkgeworCQkJSE1EKCgiUlhUT0hPU1QgIikpOworCQkJaGFwcHlfbWVhbF9yeChocCwgZGV2KTsKKwkJfQorCisJbmV4dDoKKwkJc3Bpbl91bmxvY2soJmhwLT5oYXBweV9sb2NrKTsKKwl9CisJSE1EKCgiZG9uZVxuIikpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaGFwcHlfbWVhbF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwID0gZGV2LT5wcml2OworCWludCByZXM7CisKKwlITUQoKCJoYXBweV9tZWFsX29wZW46ICIpKTsKKworCS8qIE9uIFNCVVMgUXVhdHRybyBRRkUgY2FyZHMsIGFsbCBobWUgaW50ZXJydXB0cyBhcmUgY29uY2VudHJhdGVkCisJICogaW50byBhIHNpbmdsZSBzb3VyY2Ugd2hpY2ggd2UgcmVnaXN0ZXIgaGFuZGxpbmcgYXQgcHJvYmUgdGltZS4KKwkgKi8KKwlpZiAoKGhwLT5oYXBweV9mbGFncyAmIChIRkxBR19RVUFUVFJPfEhGTEFHX1BDSSkpICE9IEhGTEFHX1FVQVRUUk8pIHsKKwkJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmaGFwcHlfbWVhbF9pbnRlcnJ1cHQsCisJCQkJU0FfU0hJUlEsIGRldi0+bmFtZSwgKHZvaWQgKilkZXYpKSB7CisJCQlITUQoKCJFQUdBSU5cbiIpKTsKKyNpZmRlZiBfX3NwYXJjX18KKwkJCXByaW50ayhLRVJOX0VSUiAiaGFwcHlfbWVhbChTQlVTKTogQ2FuJ3Qgb3JkZXIgaXJxICVzIHRvIGdvLlxuIiwKKwkJCSAgICAgICBfX2lycV9pdG9hKGRldi0+aXJxKSk7CisjZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSICJoYXBweV9tZWFsKFNCVVMpOiBDYW4ndCBvcmRlciBpcnEgJWQgdG8gZ28uXG4iLAorCQkJICAgICAgIGRldi0+aXJxKTsKKyNlbmRpZgorCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0KKworCUhNRCgoInRvIGhhcHB5X21lYWxfaW5pdFxuIikpOworCisJc3Bpbl9sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCXJlcyA9IGhhcHB5X21lYWxfaW5pdChocCk7CisJc3Bpbl91bmxvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisKKwlpZiAocmVzICYmICgoaHAtPmhhcHB5X2ZsYWdzICYgKEhGTEFHX1FVQVRUUk98SEZMQUdfUENJKSkgIT0gSEZMQUdfUVVBVFRSTykpCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgaGFwcHlfbWVhbF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IGRldi0+cHJpdjsKKworCXNwaW5fbG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKwloYXBweV9tZWFsX3N0b3AoaHAsIGhwLT5ncmVncyk7CisJaGFwcHlfbWVhbF9jbGVhbl9yaW5ncyhocCk7CisKKwkvKiBJZiBhdXRvLW5lZ290aWF0aW9uIHRpbWVyIGlzIHJ1bm5pbmcsIGtpbGwgaXQuICovCisJZGVsX3RpbWVyKCZocC0+aGFwcHlfdGltZXIpOworCisJc3Bpbl91bmxvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisKKwkvKiBPbiBRdWF0dHJvIFFGRSBjYXJkcywgYWxsIGhtZSBpbnRlcnJ1cHRzIGFyZSBjb25jZW50cmF0ZWQKKwkgKiBpbnRvIGEgc2luZ2xlIHNvdXJjZSB3aGljaCB3ZSByZWdpc3RlciBoYW5kbGluZyBhdCBwcm9iZQorCSAqIHRpbWUgYW5kIG5ldmVyIHVucmVnaXN0ZXIuCisJICovCisJaWYgKChocC0+aGFwcHlfZmxhZ3MgJiAoSEZMQUdfUVVBVFRST3xIRkxBR19QQ0kpKSAhPSBIRkxBR19RVUFUVFJPKQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgU1hERUJVRworI2RlZmluZSBTWEQoeCkgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIFNYRCh4KQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IGRldi0+cHJpdjsKKworCXByaW50ayAoS0VSTl9FUlIgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHJlc2V0dGluZ1xuIiwgZGV2LT5uYW1lKTsKKwl0eF9kdW1wX2xvZygpOworCXByaW50ayAoS0VSTl9FUlIgIiVzOiBIYXBweSBTdGF0dXMgJTA4eCBUWFslMDh4OiUwOHhdXG4iLCBkZXYtPm5hbWUsCisJCWhtZV9yZWFkMzIoaHAsIGhwLT5ncmVncyArIEdSRUdfU1RBVCksCisJCWhtZV9yZWFkMzIoaHAsIGhwLT5ldHhyZWdzICsgRVRYX0NGRyksCisJCWhtZV9yZWFkMzIoaHAsIGhwLT5iaWdtYWNyZWdzICsgQk1BQ19UWENGRykpOworCisJc3Bpbl9sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCWhhcHB5X21lYWxfaW5pdChocCk7CisJc3Bpbl91bmxvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQgaGFwcHlfbWVhbF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwID0gZGV2LT5wcml2OworIAlpbnQgZW50cnk7CisgCXUzMiB0eF9mbGFnczsKKworCXR4X2ZsYWdzID0gVFhGTEFHX09XTjsKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpIHsKKwkJdTMyIGNzdW1fc3RhcnRfb2ZmLCBjc3VtX3N0dWZmX29mZjsKKworCQljc3VtX3N0YXJ0X29mZiA9ICh1MzIpIChza2ItPmgucmF3IC0gc2tiLT5kYXRhKTsKKwkJY3N1bV9zdHVmZl9vZmYgPSAodTMyKSAoKHNrYi0+aC5yYXcgKyBza2ItPmNzdW0pIC0gc2tiLT5kYXRhKTsKKworCQl0eF9mbGFncyA9IChUWEZMQUdfT1dOIHwgVFhGTEFHX0NTRU5BQkxFIHwKKwkJCSAgICAoKGNzdW1fc3RhcnRfb2ZmIDw8IDE0KSAmIFRYRkxBR19DU0JVRkJFR0lOKSB8CisJCQkgICAgKChjc3VtX3N0dWZmX29mZiA8PCAyMCkgJiBUWEZMQUdfQ1NMT0NBVElPTikpOworCX0KKworCXNwaW5fbG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKworIAlpZiAoVFhfQlVGRlNfQVZBSUwoaHApIDw9IChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMSkpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcGluX3VubG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQlVHISBUeCBSaW5nIGZ1bGwgd2hlbiBxdWV1ZSBhd2FrZSFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwllbnRyeSA9IGhwLT50eF9uZXc7CisJU1hEKCgiU1g8bFslZF1lWyVkXT4iLCBsZW4sIGVudHJ5KSk7CisJaHAtPnR4X3NrYnNbZW50cnldID0gc2tiOworCisJaWYgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPT0gMCkgeworCQl1MzIgbWFwcGluZywgbGVuOworCisJCWxlbiA9IHNrYi0+bGVuOworCQltYXBwaW5nID0gaG1lX2RtYV9tYXAoaHAsIHNrYi0+ZGF0YSwgbGVuLCBETUFfVE9ERVZJQ0UpOworCQl0eF9mbGFncyB8PSAoVFhGTEFHX1NPUCB8IFRYRkxBR19FT1ApOworCQlobWVfd3JpdGVfdHhkKGhwLCAmaHAtPmhhcHB5X2Jsb2NrLT5oYXBweV9tZWFsX3R4ZFtlbnRyeV0sCisJCQkgICAgICAodHhfZmxhZ3MgfCAobGVuICYgVFhGTEFHX1NJWkUpKSwKKwkJCSAgICAgIG1hcHBpbmcpOworCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCX0gZWxzZSB7CisJCXUzMiBmaXJzdF9sZW4sIGZpcnN0X21hcHBpbmc7CisJCWludCBmcmFnLCBmaXJzdF9lbnRyeSA9IGVudHJ5OworCisJCS8qIFdlIG11c3QgZ2l2ZSB0aGlzIGluaXRpYWwgY2h1bmsgdG8gdGhlIGRldmljZSBsYXN0LgorCQkgKiBPdGhlcndpc2Ugd2UgY291bGQgcmFjZSB3aXRoIHRoZSBkZXZpY2UuCisJCSAqLworCQlmaXJzdF9sZW4gPSBza2JfaGVhZGxlbihza2IpOworCQlmaXJzdF9tYXBwaW5nID0gaG1lX2RtYV9tYXAoaHAsIHNrYi0+ZGF0YSwgZmlyc3RfbGVuLCBETUFfVE9ERVZJQ0UpOworCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCisJCWZvciAoZnJhZyA9IDA7IGZyYWcgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmcmFnKyspIHsKKwkJCXNrYl9mcmFnX3QgKnRoaXNfZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZyYWddOworCQkJdTMyIGxlbiwgbWFwcGluZywgdGhpc190eGZsYWdzOworCisJCQlsZW4gPSB0aGlzX2ZyYWctPnNpemU7CisJCQltYXBwaW5nID0gaG1lX2RtYV9tYXAoaHAsCisJCQkJCSAgICAgICgodm9pZCAqKSBwYWdlX2FkZHJlc3ModGhpc19mcmFnLT5wYWdlKSArCisJCQkJCSAgICAgICB0aGlzX2ZyYWctPnBhZ2Vfb2Zmc2V0KSwKKwkJCQkJICAgICAgbGVuLCBETUFfVE9ERVZJQ0UpOworCQkJdGhpc190eGZsYWdzID0gdHhfZmxhZ3M7CisJCQlpZiAoZnJhZyA9PSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzIC0gMSkKKwkJCQl0aGlzX3R4ZmxhZ3MgfD0gVFhGTEFHX0VPUDsKKwkJCWhtZV93cml0ZV90eGQoaHAsICZocC0+aGFwcHlfYmxvY2stPmhhcHB5X21lYWxfdHhkW2VudHJ5XSwKKwkJCQkgICAgICAodGhpc190eGZsYWdzIHwgKGxlbiAmIFRYRkxBR19TSVpFKSksCisJCQkJICAgICAgbWFwcGluZyk7CisJCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCQl9CisJCWhtZV93cml0ZV90eGQoaHAsICZocC0+aGFwcHlfYmxvY2stPmhhcHB5X21lYWxfdHhkW2ZpcnN0X2VudHJ5XSwKKwkJCSAgICAgICh0eF9mbGFncyB8IFRYRkxBR19TT1AgfCAoZmlyc3RfbGVuICYgVFhGTEFHX1NJWkUpKSwKKwkJCSAgICAgIGZpcnN0X21hcHBpbmcpOworCX0KKworCWhwLT50eF9uZXcgPSBlbnRyeTsKKworCWlmIChUWF9CVUZGU19BVkFJTChocCkgPD0gKE1BWF9TS0JfRlJBR1MgKyAxKSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogR2V0IGl0IGdvaW5nLiAqLworCWhtZV93cml0ZTMyKGhwLCBocC0+ZXR4cmVncyArIEVUWF9QRU5ESU5HLCBFVFhfVFBfRE1BV0FLRVVQKTsKKworCXNwaW5fdW5sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwl0eF9hZGRfbG9nKGhwLCBUWExPR19BQ1RJT05fVFhNSVQsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmhhcHB5X21lYWxfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwID0gZGV2LT5wcml2OworCisJc3Bpbl9sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCWhhcHB5X21lYWxfZ2V0X2NvdW50ZXJzKGhwLCBocC0+YmlnbWFjcmVncyk7CisJc3Bpbl91bmxvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisKKwlyZXR1cm4gJmhwLT5uZXRfc3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmJyZWdzID0gaHAtPmJpZ21hY3JlZ3M7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisJY2hhciAqYWRkcnM7CisJaW50IGk7CisJdTMyIGNyYzsKKworCXNwaW5fbG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwgKGRldi0+bWNfY291bnQgPiA2NCkpIHsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUwLCAweGZmZmYpOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTEsIDB4ZmZmZik7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMiwgMHhmZmZmKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUzLCAweGZmZmYpOworCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfUlhDRkcsCisJCQkgICAgaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX1JYQ0ZHKSB8IEJJR01BQ19SWENGR19QTUlTQyk7CisJfSBlbHNlIHsKKwkJdTE2IGhhc2hfdGFibGVbNF07CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWhhc2hfdGFibGVbaV0gPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJCWFkZHJzID0gZG1pLT5kbWlfYWRkcjsKKwkJCWRtaSA9IGRtaS0+bmV4dDsKKworCQkJaWYgKCEoKmFkZHJzICYgMSkpCisJCQkJY29udGludWU7CisKKwkJCWNyYyA9IGV0aGVyX2NyY19sZSg2LCBhZGRycyk7CisJCQljcmMgPj49IDI2OworCQkJaGFzaF90YWJsZVtjcmMgPj4gNF0gfD0gMSA8PCAoY3JjICYgMHhmKTsKKwkJfQorCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTAsIGhhc2hfdGFibGVbMF0pOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTEsIGhhc2hfdGFibGVbMV0pOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTIsIGhhc2hfdGFibGVbMl0pOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTMsIGhhc2hfdGFibGVbM10pOworCX0KKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworfQorCisvKiBFdGh0b29sIHN1cHBvcnQuLi4gKi8KK3N0YXRpYyBpbnQgaG1lX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgPSBkZXYtPnByaXY7CisKKwljbWQtPnN1cHBvcnRlZCA9CisJCShTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJIFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX01JSSk7CisKKwkvKiBYWFggaGFyZGNvZGVkIHN0dWZmIGZvciBub3cgKi8KKwljbWQtPnBvcnQgPSBQT1JUX1RQOyAvKiBYWFggbm8gTUlJIHN1cHBvcnQgKi8KKwljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsgLyogWFhYIG5vIGV4dGVybmFsIHhjdnIgc3VwcG9ydCAqLworCWNtZC0+cGh5X2FkZHJlc3MgPSAwOyAvKiBYWFggZml4ZWQgUEhZQUQgKi8KKworCS8qIFJlY29yZCBQSFkgc2V0dGluZ3MuICovCisJc3Bpbl9sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCWhwLT5zd19ibWNyID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIGhwLT50Y3ZyZWdzLCBNSUlfQk1DUik7CisJaHAtPnN3X2xwYSA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCBocC0+dGN2cmVncywgTUlJX0xQQSk7CisJc3Bpbl91bmxvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisKKwlpZiAoaHAtPnN3X2JtY3IgJiBCTUNSX0FORU5BQkxFKSB7CisJCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCQljbWQtPnNwZWVkID0KKwkJCShocC0+c3dfbHBhICYgKExQQV8xMDBIQUxGIHwgTFBBXzEwMEZVTEwpKSA/CisJCQlTUEVFRF8xMDAgOiBTUEVFRF8xMDsKKwkJaWYgKGNtZC0+c3BlZWQgPT0gU1BFRURfMTAwKQorCQkJY21kLT5kdXBsZXggPQorCQkJCShocC0+c3dfbHBhICYgKExQQV8xMDBGVUxMKSkgPworCQkJCURVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJCWVsc2UKKwkJCWNtZC0+ZHVwbGV4ID0KKwkJCQkoaHAtPnN3X2xwYSAmIChMUEFfMTBGVUxMKSkgPworCQkJCURVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJfSBlbHNlIHsKKwkJY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCQljbWQtPnNwZWVkID0KKwkJCShocC0+c3dfYm1jciAmIEJNQ1JfU1BFRUQxMDApID8KKwkJCVNQRUVEXzEwMCA6IFNQRUVEXzEwOworCQljbWQtPmR1cGxleCA9CisJCQkoaHAtPnN3X2JtY3IgJiBCTUNSX0ZVTExEUExYKSA/CisJCQlEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBobWVfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IGRldi0+cHJpdjsKKworCS8qIFZlcmlmeSB0aGUgc2V0dGluZ3Mgd2UgY2FyZSBhYm91dC4gKi8KKwlpZiAoY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRU5BQkxFICYmCisJICAgIGNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0RJU0FCTEUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFICYmCisJICAgICgoY21kLT5zcGVlZCAhPSBTUEVFRF8xMDAgJiYKKwkgICAgICBjbWQtPnNwZWVkICE9IFNQRUVEXzEwKSB8fAorCSAgICAgKGNtZC0+ZHVwbGV4ICE9IERVUExFWF9IQUxGICYmCisJICAgICAgY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBPaywgZG8gaXQgdG8gaXQuICovCisJc3Bpbl9sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCWRlbF90aW1lcigmaHAtPmhhcHB5X3RpbWVyKTsKKwloYXBweV9tZWFsX2JlZ2luX2F1dG9fbmVnb3RpYXRpb24oaHAsIGhwLT50Y3ZyZWdzLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhtZV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IGRldi0+cHJpdjsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsICJzdW5obWUiKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgIjIuMDIiKTsKKwlpZiAoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfUENJKSB7CisJCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaHAtPmhhcHB5X2RldjsKKwkJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShwZGV2KSk7CisJfQorI2lmZGVmIENPTkZJR19TQlVTCisJZWxzZSB7CisJCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGhwLT5oYXBweV9kZXY7CisJCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJTQlVTOiVkIiwKKwkJCXNkZXYtPnNsb3QpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdTMyIGhtZV9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IGRldi0+cHJpdjsKKworCXNwaW5fbG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKwlocC0+c3dfYm1jciA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCBocC0+dGN2cmVncywgTUlJX0JNQ1IpOworCXNwaW5fdW5sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCisJcmV0dXJuIChocC0+c3dfYm1zciAmIEJNU1JfTFNUQVRVUyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgaG1lX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MJCT0gaG1lX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IGhtZV9zZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCQk9IGhtZV9nZXRfZHJ2aW5mbywKKwkuZ2V0X2xpbmsJCT0gaG1lX2dldF9saW5rLAorfTsKKworc3RhdGljIGludCBobWVfdmVyc2lvbl9wcmludGVkOworCisjaWZkZWYgQ09ORklHX1NCVVMKK3ZvaWQgX19pbml0IHF1YXR0cm9fZ2V0X3JhbmdlcyhzdHJ1Y3QgcXVhdHRybyAqcXApCit7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gcXAtPnF1YXR0cm9fZGV2OworCWludCBlcnI7CisKKwllcnIgPSBwcm9tX2dldHByb3BlcnR5KHNkZXYtPnByb21fbm9kZSwKKwkJCSAgICAgICAicmFuZ2VzIiwKKwkJCSAgICAgICAoY2hhciAqKSZxcC0+cmFuZ2VzWzBdLAorCQkJICAgICAgIHNpemVvZihxcC0+cmFuZ2VzKSk7CisJaWYgKGVyciA9PSAwIHx8IGVyciA9PSAtMSkgeworCQlxcC0+bnJhbmdlcyA9IDA7CisJCXJldHVybjsKKwl9CisJcXAtPm5yYW5nZXMgPSAoZXJyIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcykpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcXVhdHRyb19hcHBseV9yYW5nZXMoc3RydWN0IHF1YXR0cm8gKnFwLCBzdHJ1Y3QgaGFwcHlfbWVhbCAqaHApCit7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gaHAtPmhhcHB5X2RldjsKKwlpbnQgcm5nOworCisJZm9yIChybmcgPSAwOyBybmcgPCBxcC0+bnJhbmdlczsgcm5nKyspIHsKKwkJc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzICpybmdwID0gJnFwLT5yYW5nZXNbcm5nXTsKKwkJaW50IHJlZzsKKworCQlmb3IgKHJlZyA9IDA7IHJlZyA8IDU7IHJlZysrKSB7CisJCQlpZiAoc2Rldi0+cmVnX2FkZHJzW3JlZ10ud2hpY2hfaW8gPT0KKwkJCSAgICBybmdwLT5vdF9jaGlsZF9zcGFjZSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAocmVnID09IDUpCisJCQljb250aW51ZTsKKworCQlzZGV2LT5yZWdfYWRkcnNbcmVnXS53aGljaF9pbyA9IHJuZ3AtPm90X3BhcmVudF9zcGFjZTsKKwkJc2Rldi0+cmVnX2FkZHJzW3JlZ10ucGh5c19hZGRyICs9IHJuZ3AtPm90X3BhcmVudF9iYXNlOworCX0KK30KKworLyogR2l2ZW4gYSBoYXBweSBtZWFsIHNidXMgZGV2aWNlLCBmaW5kIGl0J3MgcXVhdHRybyBwYXJlbnQuCisgKiBJZiBub25lIGV4aXN0LCBhbGxvY2F0ZSBhbmQgcmV0dXJuIGEgbmV3IG9uZS4KKyAqCisgKiBSZXR1cm4gTlVMTCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgc3RydWN0IHF1YXR0cm8gKiBfX2luaXQgcXVhdHRyb19zYnVzX2ZpbmQoc3RydWN0IHNidXNfZGV2ICpnb2FsX3NkZXYpCit7CisJc3RydWN0IHNidXNfYnVzICpzYnVzOworCXN0cnVjdCBzYnVzX2RldiAqc2RldjsKKwlzdHJ1Y3QgcXVhdHRybyAqcXA7CisJaW50IGk7CisKKwlpZiAocWZlX3NidXNfbGlzdCA9PSBOVUxMKQorCQlnb3RvIGZvdW5kOworCisJZm9yIChxcCA9IHFmZV9zYnVzX2xpc3Q7IHFwICE9IE5VTEw7IHFwID0gcXAtPm5leHQpIHsKKwkJZm9yIChpID0gMCwgc2RldiA9IHFwLT5xdWF0dHJvX2RldjsKKwkJICAgICAoc2RldiAhPSBOVUxMKSAmJiAoaSA8IDQpOworCQkgICAgIHNkZXYgPSBzZGV2LT5uZXh0LCBpKyspIHsKKwkJCWlmIChzZGV2ID09IGdvYWxfc2RldikKKwkJCQlyZXR1cm4gcXA7CisJCX0KKwl9CisJZm9yX2VhY2hfc2J1cyhzYnVzKSB7CisJCWZvcl9lYWNoX3NidXNkZXYoc2Rldiwgc2J1cykgeworCQkJaWYgKHNkZXYgPT0gZ29hbF9zZGV2KQorCQkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwkvKiBDYW5ub3QgZmluZCBxdWF0dHJvIHBhcmVudCwgZmFpbC4gKi8KKwlyZXR1cm4gTlVMTDsKKworZm91bmQ6CisJcXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcXVhdHRybyksIEdGUF9LRVJORUwpOworCWlmIChxcCAhPSBOVUxMKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQlxcC0+aGFwcHlfbWVhbHNbaV0gPSBOVUxMOworCisJCXFwLT5xdWF0dHJvX2RldiA9IGdvYWxfc2RldjsKKwkJcXAtPm5leHQgPSBxZmVfc2J1c19saXN0OworCQlxZmVfc2J1c19saXN0ID0gcXA7CisJCXF1YXR0cm9fZ2V0X3JhbmdlcyhxcCk7CisJfQorCXJldHVybiBxcDsKK30KKworLyogQWZ0ZXIgYWxsIHF1YXR0cm8gY2FyZHMgaGF2ZSBiZWVuIHByb2JlZCwgd2UgY2FsbCB0aGVzZSBmdW5jdGlvbnMKKyAqIHRvIHJlZ2lzdGVyIHRoZSBJUlEgaGFuZGxlcnMuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBxdWF0dHJvX3NidXNfcmVnaXN0ZXJfaXJxcyh2b2lkKQoreworCXN0cnVjdCBxdWF0dHJvICpxcDsKKworCWZvciAocXAgPSBxZmVfc2J1c19saXN0OyBxcCAhPSBOVUxMOyBxcCA9IHFwLT5uZXh0KSB7CisJCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHFwLT5xdWF0dHJvX2RldjsKKwkJaW50IGVycjsKKworCQllcnIgPSByZXF1ZXN0X2lycShzZGV2LT5pcnFzWzBdLAorCQkJCSAgcXVhdHRyb19zYnVzX2ludGVycnVwdCwKKwkJCQkgIFNBX1NISVJRLCAiUXVhdHRybyIsCisJCQkJICBxcCk7CisJCWlmIChlcnIgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJRdWF0dHJvOiBGYXRhbCBJUlEgcmVnaXN0ZXJ5IGVycm9yICVkLlxuIiwgZXJyKTsKKwkJCXBhbmljKCJRRkUgcmVxdWVzdCBpcnEiKTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfU0JVUyAqLworCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIHN0cnVjdCBxdWF0dHJvICogX19pbml0IHF1YXR0cm9fcGNpX2ZpbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKmJkZXYgPSBwZGV2LT5idXMtPnNlbGY7CisJc3RydWN0IHF1YXR0cm8gKnFwOworCisJaWYgKCFiZGV2KSByZXR1cm4gTlVMTDsKKwlmb3IgKHFwID0gcWZlX3BjaV9saXN0OyBxcCAhPSBOVUxMOyBxcCA9IHFwLT5uZXh0KSB7CisJCXN0cnVjdCBwY2lfZGV2ICpxcGRldiA9IHFwLT5xdWF0dHJvX2RldjsKKworCQlpZiAocXBkZXYgPT0gYmRldikKKwkJCXJldHVybiBxcDsKKwl9CisJcXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcXVhdHRybyksIEdGUF9LRVJORUwpOworCWlmIChxcCAhPSBOVUxMKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQlxcC0+aGFwcHlfbWVhbHNbaV0gPSBOVUxMOworCisJCXFwLT5xdWF0dHJvX2RldiA9IGJkZXY7CisJCXFwLT5uZXh0ID0gcWZlX3BjaV9saXN0OworCQlxZmVfcGNpX2xpc3QgPSBxcDsKKworCQkvKiBObyByYW5nZSB0cmlja3MgbmVjZXNzYXJ5IG9uIFBDSS4gKi8KKwkJcXAtPm5yYW5nZXMgPSAwOworCX0KKwlyZXR1cm4gcXA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisjaWZkZWYgQ09ORklHX1NCVVMKK3N0YXRpYyBpbnQgX19pbml0IGhhcHB5X21lYWxfc2J1c19pbml0KHN0cnVjdCBzYnVzX2RldiAqc2RldiwgaW50IGlzX3FmZSkKK3sKKwlzdHJ1Y3QgcXVhdHRybyAqcXAgPSBOVUxMOworCXN0cnVjdCBoYXBweV9tZWFsICpocDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpLCBxZmVfc2xvdCA9IC0xOworCWludCBlcnIgPSAtRU5PREVWOworCisJaWYgKGlzX3FmZSkgeworCQlxcCA9IHF1YXR0cm9fc2J1c19maW5kKHNkZXYpOworCQlpZiAocXAgPT0gTlVMTCkKKwkJCWdvdG8gZXJyX291dDsKKwkJZm9yIChxZmVfc2xvdCA9IDA7IHFmZV9zbG90IDwgNDsgcWZlX3Nsb3QrKykKKwkJCWlmIChxcC0+aGFwcHlfbWVhbHNbcWZlX3Nsb3RdID09IE5VTEwpCisJCQkJYnJlYWs7CisJCWlmIChxZmVfc2xvdCA9PSA0KQorCQkJZ290byBlcnJfb3V0OworCX0KKworCWVyciA9IC1FTk9NRU07CisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBoYXBweV9tZWFsKSk7CisJaWYgKCFkZXYpCisJCWdvdG8gZXJyX291dDsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoaG1lX3ZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwkvKiBJZiB1c2VyIGRpZCBub3Qgc3BlY2lmeSBhIE1BQyBhZGRyZXNzIHNwZWNpZmljYWxseSwgdXNlCisJICogdGhlIFF1YXR0cm8gbG9jYWwtbWFjLWFkZHJlc3MgcHJvcGVydHkuLi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWlmIChtYWNhZGRyW2ldICE9IDApCisJCQlicmVhazsKKwl9CisJaWYgKGkgPCA2KSB7IC8qIGEgbWFjIGFkZHJlc3Mgd2FzIGdpdmVuICovCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlkZXYtPmRldl9hZGRyW2ldID0gbWFjYWRkcltpXTsKKwkJbWFjYWRkcls1XSsrOworCX0gZWxzZSBpZiAocWZlX3Nsb3QgIT0gLTEgJiYKKwkJICAgcHJvbV9nZXRwcm9wbGVuKHNkZXYtPnByb21fbm9kZSwKKwkJCQkgICAibG9jYWwtbWFjLWFkZHJlc3MiKSA9PSA2KSB7CisJCXByb21fZ2V0cHJvcGVydHkoc2Rldi0+cHJvbV9ub2RlLCAibG9jYWwtbWFjLWFkZHJlc3MiLAorCQkJCSBkZXYtPmRldl9hZGRyLCA2KTsKKwl9IGVsc2UgeworCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgaWRwcm9tLT5pZF9ldGhhZGRyLCA2KTsKKwl9CisKKwlocCA9IGRldi0+cHJpdjsKKworCWhwLT5oYXBweV9kZXYgPSBzZGV2OworCisJc3Bpbl9sb2NrX2luaXQoJmhwLT5oYXBweV9sb2NrKTsKKworCWVyciA9IC1FTk9ERVY7CisJaWYgKHNkZXYtPm51bV9yZWdpc3RlcnMgIT0gNSkgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogRGV2aWNlIGRvZXMgbm90IGhhdmUgNSByZWdzLCBpdCBoYXMgJWQuXG4iLAorCQkgICAgICAgc2Rldi0+bnVtX3JlZ2lzdGVycyk7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsOiBXb3VsZCB5b3UgbGlrZSB0aGF0IGZvciBoZXJlIG9yIHRvIGdvP1xuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKwl9CisKKwlpZiAocXAgIT0gTlVMTCkgeworCQlocC0+cWZlX3BhcmVudCA9IHFwOworCQlocC0+cWZlX2VudCA9IHFmZV9zbG90OworCQlxcC0+aGFwcHlfbWVhbHNbcWZlX3Nsb3RdID0gZGV2OworCQlxdWF0dHJvX2FwcGx5X3JhbmdlcyhxcCwgaHApOworCX0KKworCWhwLT5ncmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sIDAsCisJCQkJIEdSRUdfUkVHX1NJWkUsICJITUUgR2xvYmFsIFJlZ3MiKTsKKwlpZiAoIWhwLT5ncmVncykgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogQ2Fubm90IG1hcCBIYXBweSBNZWFsIGdsb2JhbCByZWdpc3RlcnMuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCX0KKworCWhwLT5ldHhyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVsxXSwgMCwKKwkJCQkgICBFVFhfUkVHX1NJWkUsICJITUUgVFggUmVncyIpOworCWlmICghaHAtPmV0eHJlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IENhbm5vdCBtYXAgSGFwcHkgTWVhbCBNQUMgVHJhbnNtaXQgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCWhwLT5lcnhyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVsyXSwgMCwKKwkJCQkgICBFUlhfUkVHX1NJWkUsICJITUUgUlggUmVncyIpOworCWlmICghaHAtPmVyeHJlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IENhbm5vdCBtYXAgSGFwcHkgTWVhbCBNQUMgUmVjZWl2ZSByZWdpc3RlcnMuXG4iKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJaHAtPmJpZ21hY3JlZ3MgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzNdLCAwLAorCQkJCSAgICAgIEJNQUNfUkVHX1NJWkUsICJITUUgQklHTUFDIFJlZ3MiKTsKKwlpZiAoIWhwLT5iaWdtYWNyZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsOiBDYW5ub3QgbWFwIEhhcHB5IE1lYWwgQklHTUFDIHJlZ2lzdGVycy5cbiIpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwlocC0+dGN2cmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbNF0sIDAsCisJCQkJICAgVENWUl9SRUdfU0laRSwgIkhNRSBUcmFuY2VpdmVyIFJlZ3MiKTsKKwlpZiAoIWhwLT50Y3ZyZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsOiBDYW5ub3QgbWFwIEhhcHB5IE1lYWwgVHJhbmNlaXZlciByZWdpc3RlcnMuXG4iKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJaHAtPmhtX3JldmlzaW9uID0gcHJvbV9nZXRpbnRkZWZhdWx0KHNkZXYtPnByb21fbm9kZSwgImhtLXJldiIsIDB4ZmYpOworCWlmIChocC0+aG1fcmV2aXNpb24gPT0gMHhmZikKKwkJaHAtPmhtX3JldmlzaW9uID0gMHhhMDsKKworCS8qIE5vdyBlbmFibGUgdGhlIGZlYXR1cmUgZmxhZ3Mgd2UgY2FuLiAqLworCWlmIChocC0+aG1fcmV2aXNpb24gPT0gMHgyMCB8fCBocC0+aG1fcmV2aXNpb24gPT0gMHgyMSkKKwkJaHAtPmhhcHB5X2ZsYWdzID0gSEZMQUdfMjBfMjE7CisJZWxzZSBpZiAoaHAtPmhtX3JldmlzaW9uICE9IDB4YTApCisJCWhwLT5oYXBweV9mbGFncyA9IEhGTEFHX05PVF9BMDsKKworCWlmIChxcCAhPSBOVUxMKQorCQlocC0+aGFwcHlfZmxhZ3MgfD0gSEZMQUdfUVVBVFRSTzsKKworCS8qIEdldCB0aGUgc3VwcG9ydGVkIERWTUEgYnVyc3Qgc2l6ZXMgZnJvbSBvdXIgSGFwcHkgU0JVUy4gKi8KKwlocC0+aGFwcHlfYnVyc3RzID0gcHJvbV9nZXRpbnRkZWZhdWx0KHNkZXYtPmJ1cy0+cHJvbV9ub2RlLAorCQkJCQkgICAgICAiYnVyc3Qtc2l6ZXMiLCAweDAwKTsKKworCWhwLT5oYXBweV9ibG9jayA9IHNidXNfYWxsb2NfY29uc2lzdGVudChocC0+aGFwcHlfZGV2LAorCQkJCQkJUEFHRV9TSVpFLAorCQkJCQkJJmhwLT5oYmxvY2tfZHZtYSk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWhwLT5oYXBweV9ibG9jaykgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogQ2Fubm90IGFsbG9jYXRlIGRlc2NyaXB0b3JzLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCS8qIEZvcmNlIGNoZWNrIG9mIHRoZSBsaW5rIGZpcnN0IHRpbWUgd2UgYXJlIGJyb3VnaHQgdXAuICovCisJaHAtPmxpbmtjaGVjayA9IDA7CisKKwkvKiBGb3JjZSB0aW1lciBzdGF0ZSB0byAnYXNsZWVwJyB3aXRoIGNvdW50IG9mIHplcm8uICovCisJaHAtPnRpbWVyX3N0YXRlID0gYXNsZWVwOworCWhwLT50aW1lcl90aWNrcyA9IDA7CisKKwlpbml0X3RpbWVyKCZocC0+aGFwcHlfdGltZXIpOworCisJaHAtPmRldiA9IGRldjsKKwlkZXYtPm9wZW4gPSAmaGFwcHlfbWVhbF9vcGVuOworCWRldi0+c3RvcCA9ICZoYXBweV9tZWFsX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmhhcHB5X21lYWxfc3RhcnRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9ICZoYXBweV9tZWFsX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZoYXBweV9tZWFsX3NldF9tdWx0aWNhc3Q7CisJZGV2LT50eF90aW1lb3V0ID0gJmhhcHB5X21lYWxfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmhtZV9ldGh0b29sX29wczsKKworCS8qIEhhcHB5IE1lYWwgY2FuIGRvIGl0IGFsbC4uLiBleGNlcHQgVkxBTi4gKi8KKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0hXX0NTVU0gfCBORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRDsKKworCWRldi0+aXJxID0gc2Rldi0+aXJxc1swXTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NCVVMpICYmIGRlZmluZWQoQ09ORklHX1BDSSkKKwkvKiBIb29rIHVwIFBDSSByZWdpc3Rlci9kbWEgYWNjZXNzb3JzLiAqLworCWhwLT5yZWFkX2Rlc2MzMiA9IHNidXNfaG1lX3JlYWRfZGVzYzMyOworCWhwLT53cml0ZV90eGQgPSBzYnVzX2htZV93cml0ZV90eGQ7CisJaHAtPndyaXRlX3J4ZCA9IHNidXNfaG1lX3dyaXRlX3J4ZDsKKwlocC0+ZG1hX21hcCA9ICh1MzIgKCopKHZvaWQgKiwgdm9pZCAqLCBsb25nLCBpbnQpKXNidXNfbWFwX3NpbmdsZTsKKwlocC0+ZG1hX3VubWFwID0gKHZvaWQgKCopKHZvaWQgKiwgdTMyLCBsb25nLCBpbnQpKXNidXNfdW5tYXBfc2luZ2xlOworCWhwLT5kbWFfc3luY19mb3JfY3B1ID0gKHZvaWQgKCopKHZvaWQgKiwgdTMyLCBsb25nLCBpbnQpKQorCQlzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1OworCWhwLT5kbWFfc3luY19mb3JfZGV2aWNlID0gKHZvaWQgKCopKHZvaWQgKiwgdTMyLCBsb25nLCBpbnQpKQorCQlzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlOworCWhwLT5yZWFkMzIgPSBzYnVzX2htZV9yZWFkMzI7CisJaHAtPndyaXRlMzIgPSBzYnVzX2htZV93cml0ZTMyOworI2VuZGlmCisKKwkvKiBHcnJyLCBIYXBweSBNZWFsIGNvbWVzIHVwIGJ5IGRlZmF1bHQgbm90IGFkdmVydGlzaW5nCisJICogZnVsbCBkdXBsZXggMTAwYmFzZVQgY2FwYWJpbGl0aWVzLCBmaXggdGhpcy4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisJaGFwcHlfbWVhbF9zZXRfaW5pdGlhbF9hZHZlcnRpc2VtZW50KGhwKTsKKwlzcGluX3VubG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoaHAtPmRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IENhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfY29uc2lzdGVudDsKKwl9CisKKwlpZiAocWZlX3Nsb3QgIT0gLTEpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBRdWF0dHJvIEhNRSBzbG90ICVkIChTQlVTKSAxMC8xMDBiYXNlVCBFdGhlcm5ldCAiLAorCQkgICAgICAgZGV2LT5uYW1lLCBxZmVfc2xvdCk7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICIlczogSEFQUFkgTUVBTCAoU0JVUykgMTAvMTAwYmFzZVQgRXRoZXJuZXQgIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLAorCQkgICAgICAgZGV2LT5kZXZfYWRkcltpXSwgaSA9PSA1ID8gJyAnIDogJzonKTsKKwlwcmludGsoIlxuIik7CisKKwkvKiBXZSBhcmUgaG9tZSBmcmVlIGF0IHRoaXMgcG9pbnQsIGxpbmsgdXMgaW4gdG8gdGhlIGhhcHB5CisJICogZGV2aWNlIGxpc3QuCisJICovCisJaHAtPm5leHRfbW9kdWxlID0gcm9vdF9oYXBweV9kZXY7CisJcm9vdF9oYXBweV9kZXYgPSBocDsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfY29uc2lzdGVudDoKKwlzYnVzX2ZyZWVfY29uc2lzdGVudChocC0+aGFwcHlfZGV2LAorCQkJICAgICBQQUdFX1NJWkUsCisJCQkgICAgIGhwLT5oYXBweV9ibG9jaywKKwkJCSAgICAgaHAtPmhibG9ja19kdm1hKTsKKworZXJyX291dF9pb3VubWFwOgorCWlmIChocC0+Z3JlZ3MpCisJCXNidXNfaW91bm1hcChocC0+Z3JlZ3MsIEdSRUdfUkVHX1NJWkUpOworCWlmIChocC0+ZXR4cmVncykKKwkJc2J1c19pb3VubWFwKGhwLT5ldHhyZWdzLCBFVFhfUkVHX1NJWkUpOworCWlmIChocC0+ZXJ4cmVncykKKwkJc2J1c19pb3VubWFwKGhwLT5lcnhyZWdzLCBFUlhfUkVHX1NJWkUpOworCWlmIChocC0+YmlnbWFjcmVncykKKwkJc2J1c19pb3VubWFwKGhwLT5iaWdtYWNyZWdzLCBCTUFDX1JFR19TSVpFKTsKKwlpZiAoaHAtPnRjdnJlZ3MpCisJCXNidXNfaW91bm1hcChocC0+dGN2cmVncywgVENWUl9SRUdfU0laRSk7CisKK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKworZXJyX291dDoKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCisjaWZuZGVmIF9fc3BhcmNfXworc3RhdGljIGludCBpc19xdWF0dHJvX3Aoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKmJ1c2RldiA9IHBkZXYtPmJ1cy0+c2VsZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJaW50IG5faG1lczsKKworCWlmIChidXNkZXYgPT0gTlVMTCB8fAorCSAgICBidXNkZXYtPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0RFQyB8fAorCSAgICBidXNkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0RFQ18yMTE1MykKKwkJcmV0dXJuIDA7CisKKwluX2htZXMgPSAwOworCXRtcCA9IHBkZXYtPmJ1cy0+ZGV2aWNlcy5uZXh0OworCXdoaWxlICh0bXAgIT0gJnBkZXYtPmJ1cy0+ZGV2aWNlcykgeworCQlzdHJ1Y3QgcGNpX2RldiAqdGhpc19wZGV2ID0gcGNpX2Rldl9iKHRtcCk7CisKKwkJaWYgKHRoaXNfcGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU1VOICYmCisJCSAgICB0aGlzX3BkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NVTl9IQVBQWU1FQUwpCisJCQluX2htZXMrKzsKKworCQl0bXAgPSB0bXAtPm5leHQ7CisJfQorCisJaWYgKG5faG1lcyAhPSA0KQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKiBGZXRjaCBNQUMgYWRkcmVzcyBmcm9tIHZpdGFsIHByb2R1Y3QgZGF0YSBvZiBQQ0kgUk9NLiAqLworc3RhdGljIHZvaWQgZmluZF9ldGhfYWRkcl9pbl92cGQodm9pZCBfX2lvbWVtICpyb21fYmFzZSwgaW50IGxlbiwgaW50IGluZGV4LCB1bnNpZ25lZCBjaGFyICpkZXZfYWRkcikKK3sKKwlpbnQgdGhpc19vZmZzZXQ7CisKKwlmb3IgKHRoaXNfb2Zmc2V0ID0gMHgyMDsgdGhpc19vZmZzZXQgPCBsZW47IHRoaXNfb2Zmc2V0KyspIHsKKwkJdm9pZCBfX2lvbWVtICpwID0gcm9tX2Jhc2UgKyB0aGlzX29mZnNldDsKKworCQlpZiAocmVhZGIocCArIDApICE9IDB4OTAgfHwKKwkJICAgIHJlYWRiKHAgKyAxKSAhPSAweDAwIHx8CisJCSAgICByZWFkYihwICsgMikgIT0gMHgwOSB8fAorCQkgICAgcmVhZGIocCArIDMpICE9IDB4NGUgfHwKKwkJICAgIHJlYWRiKHAgKyA0KSAhPSAweDQxIHx8CisJCSAgICByZWFkYihwICsgNSkgIT0gMHgwNikKKwkJCWNvbnRpbnVlOworCisJCXRoaXNfb2Zmc2V0ICs9IDY7CisJCXAgKz0gNjsKKworCQlpZiAoaW5kZXggPT0gMCkgeworCQkJaW50IGk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQkJZGV2X2FkZHJbaV0gPSByZWFkYihwICsgaSk7CisJCQlicmVhazsKKwkJfQorCQlpbmRleC0tOworCX0KK30KKworc3RhdGljIHZvaWQgZ2V0X2htZV9tYWNfbm9uc3BhcmMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVuc2lnbmVkIGNoYXIgKmRldl9hZGRyKQoreworCXUzMiByb21fcmVnX29yaWc7CisJdm9pZCBfX2lvbWVtICpwOworCWludCBpbmRleDsKKworCWluZGV4ID0gMDsKKwlpZiAoaXNfcXVhdHRyb19wKHBkZXYpKQorCQlpbmRleCA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKTsKKworCWlmIChwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5wYXJlbnQgPT0gTlVMTCkgeworCQlpZiAocGNpX2Fzc2lnbl9yZXNvdXJjZShwZGV2LCBQQ0lfUk9NX1JFU09VUkNFKSA8IDApCisJCQlnb3RvIHVzZV9yYW5kb207CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywgJnJvbV9yZWdfb3JpZyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBwZGV2LT5yb21fYmFzZV9yZWcsCisJCQkgICAgICAgcm9tX3JlZ19vcmlnIHwgUENJX1JPTV9BRERSRVNTX0VOQUJMRSk7CisKKwlwID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgUENJX1JPTV9SRVNPVVJDRSksICg2NCAqIDEwMjQpKTsKKwlpZiAocCAhPSBOVUxMICYmIHJlYWRiKHApID09IDB4NTUgJiYgcmVhZGIocCArIDEpID09IDB4YWEpCisJCWZpbmRfZXRoX2FkZHJfaW5fdnBkKHAsICg2NCAqIDEwMjQpLCBpbmRleCwgZGV2X2FkZHIpOworCisJaWYgKHAgIT0gTlVMTCkKKwkJaW91bm1hcChwKTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgcGRldi0+cm9tX2Jhc2VfcmVnLCByb21fcmVnX29yaWcpOworCXJldHVybjsKKwordXNlX3JhbmRvbToKKwkvKiBTdW4gTUFDIHByZWZpeCB0aGVuIDMgcmFuZG9tIGJ5dGVzLiAqLworCWRldl9hZGRyWzBdID0gMHgwODsKKwlkZXZfYWRkclsxXSA9IDB4MDA7CisJZGV2X2FkZHJbMl0gPSAweDIwOworCWdldF9yYW5kb21fYnl0ZXMoJmRldl9hZGRyWzNdLCAzKTsKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogIShfX3NwYXJjX18pICovCisKK3N0YXRpYyBpbnQgX19pbml0IGhhcHB5X21lYWxfcGNpX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHF1YXR0cm8gKnFwID0gTlVMTDsKKyNpZmRlZiBfX3NwYXJjX18KKwlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwOworCWludCBub2RlOworI2VuZGlmCisJc3RydWN0IGhhcHB5X21lYWwgKmhwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdm9pZCBfX2lvbWVtICpocHJlZ19iYXNlOworCXVuc2lnbmVkIGxvbmcgaHByZWdfcmVzOworCWludCBpLCBxZmVfc2xvdCA9IC0xOworCWNoYXIgcHJvbV9uYW1lWzY0XTsKKwlpbnQgZXJyOworCisJLyogTm93IG1ha2Ugc3VyZSBwY2lfZGV2IGNvb2tpZSBpcyB0aGVyZS4gKi8KKyNpZmRlZiBfX3NwYXJjX18KKwlwY3AgPSBwZGV2LT5zeXNkYXRhOworCWlmIChwY3AgPT0gTlVMTCB8fCBwY3AtPnByb21fbm9kZSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbChQQ0kpOiBTb21lIFBDSSBkZXZpY2UgaW5mbyBtaXNzaW5nXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW5vZGUgPSBwY3AtPnByb21fbm9kZTsKKwkKKwlwcm9tX2dldHN0cmluZyhub2RlLCAibmFtZSIsIHByb21fbmFtZSwgc2l6ZW9mKHByb21fbmFtZSkpOworI2Vsc2UKKwlpZiAoaXNfcXVhdHRyb19wKHBkZXYpKQorCQlzdHJjcHkocHJvbV9uYW1lLCAiU1VOVyxxZmUiKTsKKwllbHNlCisJCXN0cmNweShwcm9tX25hbWUsICJTVU5XLGhtZSIpOworI2VuZGlmCisKKwllcnIgPSAtRU5PREVWOworCWlmICghc3RyY21wKHByb21fbmFtZSwgIlNVTlcscWZlIikgfHwgIXN0cmNtcChwcm9tX25hbWUsICJxZmUiKSkgeworCQlxcCA9IHF1YXR0cm9fcGNpX2ZpbmQocGRldik7CisJCWlmIChxcCA9PSBOVUxMKQorCQkJZ290byBlcnJfb3V0OworCQlmb3IgKHFmZV9zbG90ID0gMDsgcWZlX3Nsb3QgPCA0OyBxZmVfc2xvdCsrKQorCQkJaWYgKHFwLT5oYXBweV9tZWFsc1txZmVfc2xvdF0gPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJaWYgKHFmZV9zbG90ID09IDQpCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBoYXBweV9tZWFsKSk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWRldikKKwkJZ290byBlcnJfb3V0OworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJaWYgKGhtZV92ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisJZGV2LT5iYXNlX2FkZHIgPSAobG9uZykgcGRldjsKKworCWhwID0gKHN0cnVjdCBoYXBweV9tZWFsICopZGV2LT5wcml2OworCW1lbXNldChocCwgMCwgc2l6ZW9mKCpocCkpOworCisJaHAtPmhhcHB5X2RldiA9IHBkZXY7CisKKwlzcGluX2xvY2tfaW5pdCgmaHAtPmhhcHB5X2xvY2spOworCisJaWYgKHFwICE9IE5VTEwpIHsKKwkJaHAtPnFmZV9wYXJlbnQgPSBxcDsKKwkJaHAtPnFmZV9lbnQgPSBxZmVfc2xvdDsKKwkJcXAtPmhhcHB5X21lYWxzW3FmZV9zbG90XSA9IGRldjsKKwl9CQkKKworCWhwcmVnX3JlcyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwllcnIgPSAtRU5PREVWOworCWlmICgocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9JTykgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbChQQ0kpOiBDYW5ub3QgZmluZCBwcm9wZXIgUENJIGRldmljZSBiYXNlIGFkZHJlc3MuXG4iKTsKKwkJZ290byBlcnJfb3V0X2NsZWFyX3F1YXR0cm87CisJfQorCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKSkgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbChQQ0kpOiBDYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXMsICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfY2xlYXJfcXVhdHRybzsKKwl9CisKKwlpZiAoKGhwcmVnX2Jhc2UgPSBpb3JlbWFwKGhwcmVnX3JlcywgMHg4MDAwKSkgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbChQQ0kpOiBVbmFibGUgdG8gcmVtYXAgY2FyZCBtZW1vcnkuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaWYgKG1hY2FkZHJbaV0gIT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA8IDYpIHsgLyogYSBtYWMgYWRkcmVzcyB3YXMgZ2l2ZW4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCWRldi0+ZGV2X2FkZHJbaV0gPSBtYWNhZGRyW2ldOworCQltYWNhZGRyWzVdKys7CisJfSBlbHNlIHsKKyNpZmRlZiBfX3NwYXJjX18KKwkJaWYgKHFmZV9zbG90ICE9IC0xICYmCisJCSAgICBwcm9tX2dldHByb3BsZW4obm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIikgPT0gNikgeworCQkJcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAibG9jYWwtbWFjLWFkZHJlc3MiLAorCQkJCQkgZGV2LT5kZXZfYWRkciwgNik7CisJCX0gZWxzZSB7CisJCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgaWRwcm9tLT5pZF9ldGhhZGRyLCA2KTsKKwkJfQorI2Vsc2UKKwkJZ2V0X2htZV9tYWNfbm9uc3BhcmMocGRldiwgJmRldi0+ZGV2X2FkZHJbMF0pOworI2VuZGlmCisJfQorCQorCS8qIExheW91dCByZWdpc3RlcnMuICovCisJaHAtPmdyZWdzICAgICAgPSAoaHByZWdfYmFzZSArIDB4MDAwMFVMKTsKKwlocC0+ZXR4cmVncyAgICA9IChocHJlZ19iYXNlICsgMHgyMDAwVUwpOworCWhwLT5lcnhyZWdzICAgID0gKGhwcmVnX2Jhc2UgKyAweDQwMDBVTCk7CisJaHAtPmJpZ21hY3JlZ3MgPSAoaHByZWdfYmFzZSArIDB4NjAwMFVMKTsKKwlocC0+dGN2cmVncyAgICA9IChocHJlZ19iYXNlICsgMHg3MDAwVUwpOworCisjaWZkZWYgX19zcGFyY19fCisJaHAtPmhtX3JldmlzaW9uID0gcHJvbV9nZXRpbnRkZWZhdWx0KG5vZGUsICJobS1yZXYiLCAweGZmKTsKKwlpZiAoaHAtPmhtX3JldmlzaW9uID09IDB4ZmYpIHsKKwkJdW5zaWduZWQgY2hhciBwcmV2OworCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnByZXYpOworCQlocC0+aG1fcmV2aXNpb24gPSAweGMwIHwgKHByZXYgJiAweDBmKTsKKwl9CisjZWxzZQorCS8qIHdvcmtzIHdpdGggdGhpcyBvbiBub24tc3BhcmMgaG9zdHMgKi8KKwlocC0+aG1fcmV2aXNpb24gPSAweDIwOworI2VuZGlmCisKKwkvKiBOb3cgZW5hYmxlIHRoZSBmZWF0dXJlIGZsYWdzIHdlIGNhbi4gKi8KKwlpZiAoaHAtPmhtX3JldmlzaW9uID09IDB4MjAgfHwgaHAtPmhtX3JldmlzaW9uID09IDB4MjEpCisJCWhwLT5oYXBweV9mbGFncyA9IEhGTEFHXzIwXzIxOworCWVsc2UgaWYgKGhwLT5obV9yZXZpc2lvbiAhPSAweGEwICYmIGhwLT5obV9yZXZpc2lvbiAhPSAweGMwKQorCQlocC0+aGFwcHlfZmxhZ3MgPSBIRkxBR19OT1RfQTA7CisKKwlpZiAocXAgIT0gTlVMTCkKKwkJaHAtPmhhcHB5X2ZsYWdzIHw9IEhGTEFHX1FVQVRUUk87CisKKwkvKiBBbmQgb2YgY291cnNlLCBpbmRpY2F0ZSB0aGlzIGlzIFBDSS4gKi8KKwlocC0+aGFwcHlfZmxhZ3MgfD0gSEZMQUdfUENJOworCisjaWZkZWYgX19zcGFyY19fCisJLyogQXNzdW1lIFBDSSBoYXBweSBtZWFscyBjYW4gaGFuZGxlIGFsbCBidXJzdCBzaXplcy4gKi8KKwlocC0+aGFwcHlfYnVyc3RzID0gRE1BX0JVUlNUQklUUzsKKyNlbmRpZgorCisJaHAtPmhhcHB5X2Jsb2NrID0gKHN0cnVjdCBobWVhbF9pbml0X2Jsb2NrICopCisJCXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFBBR0VfU0laRSwgJmhwLT5oYmxvY2tfZHZtYSk7CisKKwllcnIgPSAtRU5PREVWOworCWlmICghaHAtPmhhcHB5X2Jsb2NrKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsKFBDSSk6IENhbm5vdCBnZXQgaG1lIGluaXQgYmxvY2suXG4iKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJaHAtPmxpbmtjaGVjayA9IDA7CisJaHAtPnRpbWVyX3N0YXRlID0gYXNsZWVwOworCWhwLT50aW1lcl90aWNrcyA9IDA7CisKKwlpbml0X3RpbWVyKCZocC0+aGFwcHlfdGltZXIpOworCisJaHAtPmRldiA9IGRldjsKKwlkZXYtPm9wZW4gPSAmaGFwcHlfbWVhbF9vcGVuOworCWRldi0+c3RvcCA9ICZoYXBweV9tZWFsX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmhhcHB5X21lYWxfc3RhcnRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9ICZoYXBweV9tZWFsX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZoYXBweV9tZWFsX3NldF9tdWx0aWNhc3Q7CisJZGV2LT50eF90aW1lb3V0ID0gJmhhcHB5X21lYWxfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmhtZV9ldGh0b29sX29wczsKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPmRtYSA9IDA7CisKKwkvKiBIYXBweSBNZWFsIGNhbiBkbyBpdCBhbGwuLi4gKi8KKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0hXX0NTVU07CisKKyNpZiBkZWZpbmVkKENPTkZJR19TQlVTKSAmJiBkZWZpbmVkKENPTkZJR19QQ0kpCisJLyogSG9vayB1cCBQQ0kgcmVnaXN0ZXIvZG1hIGFjY2Vzc29ycy4gKi8KKwlocC0+cmVhZF9kZXNjMzIgPSBwY2lfaG1lX3JlYWRfZGVzYzMyOworCWhwLT53cml0ZV90eGQgPSBwY2lfaG1lX3dyaXRlX3R4ZDsKKwlocC0+d3JpdGVfcnhkID0gcGNpX2htZV93cml0ZV9yeGQ7CisJaHAtPmRtYV9tYXAgPSAodTMyICgqKSh2b2lkICosIHZvaWQgKiwgbG9uZywgaW50KSlwY2lfbWFwX3NpbmdsZTsKKwlocC0+ZG1hX3VubWFwID0gKHZvaWQgKCopKHZvaWQgKiwgdTMyLCBsb25nLCBpbnQpKXBjaV91bm1hcF9zaW5nbGU7CisJaHAtPmRtYV9zeW5jX2Zvcl9jcHUgPSAodm9pZCAoKikodm9pZCAqLCB1MzIsIGxvbmcsIGludCkpCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdTsKKwlocC0+ZG1hX3N5bmNfZm9yX2RldmljZSA9ICh2b2lkICgqKSh2b2lkICosIHUzMiwgbG9uZywgaW50KSkKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlOworCWhwLT5yZWFkMzIgPSBwY2lfaG1lX3JlYWQzMjsKKwlocC0+d3JpdGUzMiA9IHBjaV9obWVfd3JpdGUzMjsKKyNlbmRpZgorCisJLyogR3JyciwgSGFwcHkgTWVhbCBjb21lcyB1cCBieSBkZWZhdWx0IG5vdCBhZHZlcnRpc2luZworCSAqIGZ1bGwgZHVwbGV4IDEwMGJhc2VUIGNhcGFiaWxpdGllcywgZml4IHRoaXMuCisJICovCisJc3Bpbl9sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCWhhcHB5X21lYWxfc2V0X2luaXRpYWxfYWR2ZXJ0aXNlbWVudChocCk7CisJc3Bpbl91bmxvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGhwLT5kZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsKFBDSSk6IENhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJaWYgKCFxZmVfc2xvdCkgeworCQlzdHJ1Y3QgcGNpX2RldiAqcXBkZXYgPSBxcC0+cXVhdHRyb19kZXY7CisKKwkJcHJvbV9uYW1lWzBdID0gMDsKKwkJaWYgKCFzdHJuY21wKGRldi0+bmFtZSwgImV0aCIsIDMpKSB7CisJCQlpbnQgaSA9IHNpbXBsZV9zdHJ0b3VsKGRldi0+bmFtZSArIDMsIE5VTEwsIDEwKTsKKwkJCXNwcmludGYocHJvbV9uYW1lLCAiLSVkIiwgaSArIDMpOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gIiVzJXM6IFF1YXR0cm8gSE1FIChQQ0kvQ2hlZXJJTykgMTAvMTAwYmFzZVQgRXRoZXJuZXQgIiwgZGV2LT5uYW1lLCBwcm9tX25hbWUpOworCQlpZiAocXBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0RFQyAmJgorCQkgICAgcXBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0RFQ18yMTE1MykKKwkJCXByaW50aygiREVDIDIxMTUzIFBDSSBCcmlkZ2VcbiIpOworCQllbHNlCisJCQlwcmludGsoInVua25vd24gYnJpZGdlICUwNHguJTA0eFxuIiwgCisJCQkJcXBkZXYtPnZlbmRvciwgcXBkZXYtPmRldmljZSk7CisJfQorCisJaWYgKHFmZV9zbG90ICE9IC0xKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogUXVhdHRybyBITUUgc2xvdCAlZCAoUENJL0NoZWVySU8pIDEwLzEwMGJhc2VUIEV0aGVybmV0ICIsCisJCSAgICAgICBkZXYtPm5hbWUsIHFmZV9zbG90KTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBIQVBQWSBNRUFMIChQQ0kvQ2hlZXJJTykgMTAvMTAwQmFzZVQgRXRoZXJuZXQgIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLCBkZXYtPmRldl9hZGRyW2ldLCBpID09IDUgPyAnICcgOiAnOicpOworCisJcHJpbnRrKCJcbiIpOworCisJLyogV2UgYXJlIGhvbWUgZnJlZSBhdCB0aGlzIHBvaW50LCBsaW5rIHVzIGluIHRvIHRoZSBoYXBweQorCSAqIGRldmljZSBsaXN0LgorCSAqLworCWhwLT5uZXh0X21vZHVsZSA9IHJvb3RfaGFwcHlfZGV2OworCXJvb3RfaGFwcHlfZGV2ID0gaHA7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9pb3VubWFwOgorCWlvdW5tYXAoaHAtPmdyZWdzKTsKKworZXJyX291dF9mcmVlX3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCitlcnJfb3V0X2NsZWFyX3F1YXR0cm86CisJaWYgKHFwICE9IE5VTEwpCisJCXFwLT5oYXBweV9tZWFsc1txZmVfc2xvdF0gPSBOVUxMOworCisJZnJlZV9uZXRkZXYoZGV2KTsKKworZXJyX291dDoKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU0JVUworc3RhdGljIGludCBfX2luaXQgaGFwcHlfbWVhbF9zYnVzX3Byb2JlKHZvaWQpCit7CisJc3RydWN0IHNidXNfYnVzICpzYnVzOworCXN0cnVjdCBzYnVzX2RldiAqc2RldjsKKwlpbnQgY2FyZHMgPSAwOworCWNoYXIgbW9kZWxbMTI4XTsKKworCWZvcl9lYWNoX3NidXMoc2J1cykgeworCQlmb3JfZWFjaF9zYnVzZGV2KHNkZXYsIHNidXMpIHsKKwkJCWNoYXIgKm5hbWUgPSBzZGV2LT5wcm9tX25hbWU7CisKKwkJCWlmICghc3RyY21wKG5hbWUsICJTVU5XLGhtZSIpKSB7CisJCQkJY2FyZHMrKzsKKwkJCQlwcm9tX2dldHN0cmluZyhzZGV2LT5wcm9tX25vZGUsICJtb2RlbCIsCisJCQkJCSAgICAgICBtb2RlbCwgc2l6ZW9mKG1vZGVsKSk7CisJCQkJaWYgKCFzdHJjbXAobW9kZWwsICJTVU5XLHNidXMtcWZlIikpCisJCQkJCWhhcHB5X21lYWxfc2J1c19pbml0KHNkZXYsIDEpOworCQkJCWVsc2UKKwkJCQkJaGFwcHlfbWVhbF9zYnVzX2luaXQoc2RldiwgMCk7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInFmZSIpIHx8CisJCQkJICAgIXN0cmNtcChuYW1lLCAiU1VOVyxxZmUiKSkgeworCQkJCWNhcmRzKys7CisJCQkJaGFwcHlfbWVhbF9zYnVzX2luaXQoc2RldiwgMSk7CisJCQl9CisJCX0KKwl9CisJaWYgKGNhcmRzICE9IDApCisJCXF1YXR0cm9fc2J1c19yZWdpc3Rlcl9pcnFzKCk7CisJcmV0dXJuIGNhcmRzOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW50IF9faW5pdCBoYXBweV9tZWFsX3BjaV9wcm9iZSh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwlpbnQgY2FyZHMgPSAwOworCisJd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU1VOLAorCQkJCSAgICAgICBQQ0lfREVWSUNFX0lEX1NVTl9IQVBQWU1FQUwsIHBkZXYpKSAhPSBOVUxMKSB7CisJCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJCWNvbnRpbnVlOworCQlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwkJY2FyZHMrKzsKKwkJaGFwcHlfbWVhbF9wY2lfaW5pdChwZGV2KTsKKwl9CisJcmV0dXJuIGNhcmRzOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGhhcHB5X21lYWxfcHJvYmUodm9pZCkKK3sKKwlzdGF0aWMgaW50IGNhbGxlZCA9IDA7CisJaW50IGNhcmRzOworCisJcm9vdF9oYXBweV9kZXYgPSBOVUxMOworCisJaWYgKGNhbGxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2FsbGVkKys7CisKKwljYXJkcyA9IDA7CisjaWZkZWYgQ09ORklHX1NCVVMKKwljYXJkcyArPSBoYXBweV9tZWFsX3NidXNfcHJvYmUoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0kKKwljYXJkcyArPSBoYXBweV9tZWFsX3BjaV9wcm9iZSgpOworI2VuZGlmCisJaWYgKCFjYXJkcykKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGhhcHB5X21lYWxfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU0JVUworCXN0cnVjdCBxdWF0dHJvICpsYXN0X3NlZW5fcWZlID0gTlVMTDsKKyNlbmRpZgorCisJd2hpbGUgKHJvb3RfaGFwcHlfZGV2KSB7CisJCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IHJvb3RfaGFwcHlfZGV2OworCQlzdHJ1Y3QgaGFwcHlfbWVhbCAqbmV4dCA9IHJvb3RfaGFwcHlfZGV2LT5uZXh0X21vZHVsZTsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGhwLT5kZXY7CisKKwkJLyogVW5yZWdpc3RlciBuZXRkZXYgYmVmb3JlIHVubWFwcGluZyByZWdpc3RlcnMgYXMgdGhpcworCQkgKiBjYWxsIGNhbiBlbmQgdXAgdHJ5aW5nIHRvIGFjY2VzcyB0aG9zZSByZWdpc3RlcnMuCisJCSAqLworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisjaWZkZWYgQ09ORklHX1NCVVMKKwkJaWYgKCEoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfUENJKSkgeworCQkJaWYgKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX1FVQVRUUk8pIHsKKwkJCQlpZiAoaHAtPnFmZV9wYXJlbnQgIT0gbGFzdF9zZWVuX3FmZSkgeworCQkJCQlmcmVlX2lycShkZXYtPmlycSwgaHAtPnFmZV9wYXJlbnQpOworCQkJCQlsYXN0X3NlZW5fcWZlID0gaHAtPnFmZV9wYXJlbnQ7CisJCQkJfQorCQkJfQorCisJCQlzYnVzX2lvdW5tYXAoaHAtPmdyZWdzLCBHUkVHX1JFR19TSVpFKTsKKwkJCXNidXNfaW91bm1hcChocC0+ZXR4cmVncywgRVRYX1JFR19TSVpFKTsKKwkJCXNidXNfaW91bm1hcChocC0+ZXJ4cmVncywgRVJYX1JFR19TSVpFKTsKKwkJCXNidXNfaW91bm1hcChocC0+YmlnbWFjcmVncywgQk1BQ19SRUdfU0laRSk7CisJCQlzYnVzX2lvdW5tYXAoaHAtPnRjdnJlZ3MsIFRDVlJfUkVHX1NJWkUpOworCQkJc2J1c19mcmVlX2NvbnNpc3RlbnQoaHAtPmhhcHB5X2RldiwKKwkJCQkJICAgICBQQUdFX1NJWkUsCisJCQkJCSAgICAgaHAtPmhhcHB5X2Jsb2NrLAorCQkJCQkgICAgIGhwLT5oYmxvY2tfZHZtYSk7CisJCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0kKKwkJaWYgKChocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19QQ0kpKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhwLT5oYXBweV9kZXYsCisJCQkJCSAgICBQQUdFX1NJWkUsCisJCQkJCSAgICBocC0+aGFwcHlfYmxvY2ssCisJCQkJCSAgICBocC0+aGJsb2NrX2R2bWEpOworCQkJaW91bm1hcChocC0+Z3JlZ3MpOworCQkJcGNpX3JlbGVhc2VfcmVnaW9ucyhocC0+aGFwcHlfZGV2KTsKKwkJfQorI2VuZGlmCisJCWZyZWVfbmV0ZGV2KGRldik7CisKKwkJcm9vdF9oYXBweV9kZXYgPSBuZXh0OworCX0KKworCS8qIE5vdyBjbGVhbnVwIHRoZSBxdWF0dHJvIGxpc3RzLiAqLworI2lmZGVmIENPTkZJR19TQlVTCisJd2hpbGUgKHFmZV9zYnVzX2xpc3QpIHsKKwkJc3RydWN0IHF1YXR0cm8gKnFmZSA9IHFmZV9zYnVzX2xpc3Q7CisJCXN0cnVjdCBxdWF0dHJvICpuZXh0ID0gcWZlLT5uZXh0OworCisJCWtmcmVlKHFmZSk7CisKKwkJcWZlX3NidXNfbGlzdCA9IG5leHQ7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BDSQorCXdoaWxlIChxZmVfcGNpX2xpc3QpIHsKKwkJc3RydWN0IHF1YXR0cm8gKnFmZSA9IHFmZV9wY2lfbGlzdDsKKwkJc3RydWN0IHF1YXR0cm8gKm5leHQgPSBxZmUtPm5leHQ7CisKKwkJa2ZyZWUocWZlKTsKKworCQlxZmVfcGNpX2xpc3QgPSBuZXh0OworCX0KKyNlbmRpZgorfQorCittb2R1bGVfaW5pdChoYXBweV9tZWFsX3Byb2JlKTsKK21vZHVsZV9leGl0KGhhcHB5X21lYWxfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuaG1lLmggYi9kcml2ZXJzL25ldC9zdW5obWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGU5Zjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3VuaG1lLmgKQEAgLTAsMCArMSw1MTUgQEAKKy8qICRJZDogc3VuaG1lLmgsdiAxLjMzIDIwMDEvMDgvMDMgMDY6MjM6MDQgZGF2ZW0gRXhwICQKKyAqIHN1bmhtZS5oOiBEZWZpbml0aW9ucyBmb3IgU3BhcmMgSE1FL0JpZ01hYyAxMC8xMDBiYXNlVCBldGhlcm5ldCBkcml2ZXIuCisgKiAgICAgICAgICAgQWxzbyBrbm93biBhcyB0aGUgIkhhcHB5IE1lYWwiLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKi8KKworI2lmbmRlZiBfU1VOSE1FX0gKKyNkZWZpbmUgX1NVTkhNRV9ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworLyogSGFwcHkgTWVhbCBnbG9iYWwgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBHUkVHX1NXUkVTRVQJMHgwMDBVTAkvKiBTb2Z0d2FyZSBSZXNldCAgKi8KKyNkZWZpbmUgR1JFR19DRkcJMHgwMDRVTAkvKiBDb25maWcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgR1JFR19TVEFUCTB4MTA4VUwJLyogU3RhdHVzICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0sJMHgxMGNVTAkvKiBJbnRlcnJ1cHQgTWFzayAgKi8KKyNkZWZpbmUgR1JFR19SRUdfU0laRQkweDExMFVMCisKKy8qIEdsb2JhbCByZXNldCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgR1JFR19SRVNFVF9FVFggICAgICAgICAweDAxCisjZGVmaW5lIEdSRUdfUkVTRVRfRVJYICAgICAgICAgMHgwMgorI2RlZmluZSBHUkVHX1JFU0VUX0FMTCAgICAgICAgIDB4MDMKKworLyogR2xvYmFsIGNvbmZpZyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgR1JFR19DRkdfQlVSU1RNU0sgICAgICAweDAzCisjZGVmaW5lIEdSRUdfQ0ZHX0JVUlNUMTYgICAgICAgMHgwMAorI2RlZmluZSBHUkVHX0NGR19CVVJTVDMyICAgICAgIDB4MDEKKyNkZWZpbmUgR1JFR19DRkdfQlVSU1Q2NCAgICAgICAweDAyCisjZGVmaW5lIEdSRUdfQ0ZHXzY0QklUICAgICAgICAgMHgwNAorI2RlZmluZSBHUkVHX0NGR19QQVJJVFkgICAgICAgIDB4MDgKKyNkZWZpbmUgR1JFR19DRkdfUkVTViAgICAgICAgICAweDEwCisKKy8qIEdsb2JhbCBzdGF0dXMgcmVnaXN0ZXIuICovCisjZGVmaW5lIEdSRUdfU1RBVF9HT1RGUkFNRSAgICAgMHgwMDAwMDAwMSAvKiBSZWNlaXZlZCBhIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9SQ05URVhQICAgICAgMHgwMDAwMDAwMiAvKiBSZWNlaXZlIGZyYW1lIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9BQ05URVhQICAgICAgMHgwMDAwMDAwNCAvKiBBbGlnbi1lcnJvciBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9DQ05URVhQICAgICAgMHgwMDAwMDAwOCAvKiBDUkMtZXJyb3IgY291bnRlciBleHBpcmVkICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9MQ05URVhQICAgICAgMHgwMDAwMDAxMCAvKiBMZW5ndGgtZXJyb3IgY291bnRlciBleHBpcmVkICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9SRklGT1ZGICAgICAgMHgwMDAwMDAyMCAvKiBSZWNlaXZlIEZJRk8gb3ZlcmZsb3cgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9DVkNOVEVYUCAgICAgMHgwMDAwMDA0MCAvKiBDb2RlLXZpb2xhdGlvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9TVFNURVJSICAgICAgMHgwMDAwMDA4MCAvKiBUZXN0IGVycm9yIGluIFhJRiBmb3IgU1FFICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9TRU5URlJBTUUgICAgMHgwMDAwMDEwMCAvKiBUcmFuc21pdHRlZCBhIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9URklGT19VTkQgICAgMHgwMDAwMDIwMCAvKiBUcmFuc21pdCBGSUZPIHVuZGVycnVuICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9NQVhQS1RFUlIgICAgMHgwMDAwMDQwMCAvKiBNYXgtcGFja2V0IHNpemUgZXJyb3IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9OQ05URVhQICAgICAgMHgwMDAwMDgwMCAvKiBOb3JtYWwtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9FQ05URVhQICAgICAgMHgwMDAwMTAwMCAvKiBFeGNlc3MtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9MQ0NOVEVYUCAgICAgMHgwMDAwMjAwMCAvKiBMYXRlLWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9GQ05URVhQICAgICAgMHgwMDAwNDAwMCAvKiBGaXJzdC1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9EVElNRVhQICAgICAgMHgwMDAwODAwMCAvKiBEZWZlci10aW1lciBleHBpcmVkICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9SWFRPSE9TVCAgICAgMHgwMDAxMDAwMCAvKiBNb3ZlZCBmcm9tIHJlY2VpdmUtRklGTyB0byBob3N0IG1lbW9yeSAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9OT1JYRCAgICAgICAgMHgwMDAyMDAwMCAvKiBObyBtb3JlIHJlY2VpdmUgZGVzY3JpcHRvcnMgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9SWEVSUiAgICAgICAgMHgwMDA0MDAwMCAvKiBFcnJvciBkdXJpbmcgcmVjZWl2ZSBkbWEgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9SWExBVEVSUiAgICAgMHgwMDA4MDAwMCAvKiBMYXRlIGVycm9yIGR1cmluZyByZWNlaXZlIGRtYSAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9SWFBFUlIgICAgICAgMHgwMDEwMDAwMCAvKiBQYXJpdHkgZXJyb3IgZHVyaW5nIHJlY2VpdmUgZG1hICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9SWFRFUlIgICAgICAgMHgwMDIwMDAwMCAvKiBUYWcgZXJyb3IgZHVyaW5nIHJlY2VpdmUgZG1hICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9FT1BFUlIgICAgICAgMHgwMDQwMDAwMCAvKiBUcmFuc21pdCBkZXNjcmlwdG9yIGRpZCBub3QgaGF2ZSBFT1Agc2V0ICovCisjZGVmaW5lIEdSRUdfU1RBVF9NSUZJUlEgICAgICAgMHgwMDgwMDAwMCAvKiBNSUYgaXMgc2lnbmFsaW5nIGFuIGludGVycnVwdCBjb25kaXRpb24gICovCisjZGVmaW5lIEdSRUdfU1RBVF9IT1NUVE9UWCAgICAgMHgwMTAwMDAwMCAvKiBNb3ZlZCBmcm9tIGhvc3QgbWVtb3J5IHRvIHRyYW5zbWl0LUZJRk8gICovCisjZGVmaW5lIEdSRUdfU1RBVF9UWEFMTCAgICAgICAgMHgwMjAwMDAwMCAvKiBUcmFuc21pdHRlZCBhbGwgcGFja2V0cyBpbiB0aGUgdHgtZmlmbyAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9UWEVBQ0sgICAgICAgMHgwNDAwMDAwMCAvKiBFcnJvciBkdXJpbmcgdHJhbnNtaXQgZG1hICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9UWExFUlIgICAgICAgMHgwODAwMDAwMCAvKiBMYXRlIGVycm9yIGR1cmluZyB0cmFuc21pdCBkbWEgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9UWFBFUlIgICAgICAgMHgxMDAwMDAwMCAvKiBQYXJpdHkgZXJyb3IgZHVyaW5nIHRyYW5zbWl0IGRtYSAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9UWFRFUlIgICAgICAgMHgyMDAwMDAwMCAvKiBUYWcgZXJyb3IgZHVyaW5nIHRyYW5zbWl0IGRtYSAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9TTFZFUlIgICAgICAgMHg0MDAwMDAwMCAvKiBQSU8gYWNjZXNzIGdvdCBhbiBlcnJvciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfU1RBVF9TTFZQRVJSICAgICAgMHg4MDAwMDAwMCAvKiBQSU8gYWNjZXNzIGdvdCBhIHBhcml0eSBlcnJvciAgICAgICAgICAgICovCisKKy8qIEFsbCBpbnRlcmVzdGluZyBlcnJvciBjb25kaXRpb25zLiAqLworI2RlZmluZSBHUkVHX1NUQVRfRVJST1JTICAgICAgIDB4ZmM3ZWZlZmMKKworLyogR2xvYmFsIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyLiAqLworI2RlZmluZSBHUkVHX0lNQVNLX0dPVEZSQU1FICAgIDB4MDAwMDAwMDEgLyogUmVjZWl2ZWQgYSBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1JDTlRFWFAgICAgIDB4MDAwMDAwMDIgLyogUmVjZWl2ZSBmcmFtZSBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX0FDTlRFWFAgICAgIDB4MDAwMDAwMDQgLyogQWxpZ24tZXJyb3IgY291bnRlciBleHBpcmVkICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX0NDTlRFWFAgICAgIDB4MDAwMDAwMDggLyogQ1JDLWVycm9yIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX0xDTlRFWFAgICAgIDB4MDAwMDAwMTAgLyogTGVuZ3RoLWVycm9yIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1JGSUZPVkYgICAgIDB4MDAwMDAwMjAgLyogUmVjZWl2ZSBGSUZPIG92ZXJmbG93ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX0NWQ05URVhQICAgIDB4MDAwMDAwNDAgLyogQ29kZS12aW9sYXRpb24gY291bnRlciBleHBpcmVkICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1NUU1RFUlIgICAgIDB4MDAwMDAwODAgLyogVGVzdCBlcnJvciBpbiBYSUYgZm9yIFNRRSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1NFTlRGUkFNRSAgIDB4MDAwMDAxMDAgLyogVHJhbnNtaXR0ZWQgYSBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1RGSUZPX1VORCAgIDB4MDAwMDAyMDAgLyogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX01BWFBLVEVSUiAgIDB4MDAwMDA0MDAgLyogTWF4LXBhY2tldCBzaXplIGVycm9yICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX05DTlRFWFAgICAgIDB4MDAwMDA4MDAgLyogTm9ybWFsLWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX0VDTlRFWFAgICAgIDB4MDAwMDEwMDAgLyogRXhjZXNzLWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX0xDQ05URVhQICAgIDB4MDAwMDIwMDAgLyogTGF0ZS1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX0ZDTlRFWFAgICAgIDB4MDAwMDQwMDAgLyogRmlyc3QtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX0RUSU1FWFAgICAgIDB4MDAwMDgwMDAgLyogRGVmZXItdGltZXIgZXhwaXJlZCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1JYVE9IT1NUICAgIDB4MDAwMTAwMDAgLyogTW92ZWQgZnJvbSByZWNlaXZlLUZJRk8gdG8gaG9zdCBtZW1vcnkgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX05PUlhEICAgICAgIDB4MDAwMjAwMDAgLyogTm8gbW9yZSByZWNlaXZlIGRlc2NyaXB0b3JzICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1JYRVJSICAgICAgIDB4MDAwNDAwMDAgLyogRXJyb3IgZHVyaW5nIHJlY2VpdmUgZG1hICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1JYTEFURVJSICAgIDB4MDAwODAwMDAgLyogTGF0ZSBlcnJvciBkdXJpbmcgcmVjZWl2ZSBkbWEgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1JYUEVSUiAgICAgIDB4MDAxMDAwMDAgLyogUGFyaXR5IGVycm9yIGR1cmluZyByZWNlaXZlIGRtYSAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1JYVEVSUiAgICAgIDB4MDAyMDAwMDAgLyogVGFnIGVycm9yIGR1cmluZyByZWNlaXZlIGRtYSAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX0VPUEVSUiAgICAgIDB4MDA0MDAwMDAgLyogVHJhbnNtaXQgZGVzY3JpcHRvciBkaWQgbm90IGhhdmUgRU9QIHNldCAqLworI2RlZmluZSBHUkVHX0lNQVNLX01JRklSUSAgICAgIDB4MDA4MDAwMDAgLyogTUlGIGlzIHNpZ25hbGluZyBhbiBpbnRlcnJ1cHQgY29uZGl0aW9uICAqLworI2RlZmluZSBHUkVHX0lNQVNLX0hPU1RUT1RYICAgIDB4MDEwMDAwMDAgLyogTW92ZWQgZnJvbSBob3N0IG1lbW9yeSB0byB0cmFuc21pdC1GSUZPICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1RYQUxMICAgICAgIDB4MDIwMDAwMDAgLyogVHJhbnNtaXR0ZWQgYWxsIHBhY2tldHMgaW4gdGhlIHR4LWZpZm8gICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1RYRUFDSyAgICAgIDB4MDQwMDAwMDAgLyogRXJyb3IgZHVyaW5nIHRyYW5zbWl0IGRtYSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1RYTEVSUiAgICAgIDB4MDgwMDAwMDAgLyogTGF0ZSBlcnJvciBkdXJpbmcgdHJhbnNtaXQgZG1hICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1RYUEVSUiAgICAgIDB4MTAwMDAwMDAgLyogUGFyaXR5IGVycm9yIGR1cmluZyB0cmFuc21pdCBkbWEgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1RYVEVSUiAgICAgIDB4MjAwMDAwMDAgLyogVGFnIGVycm9yIGR1cmluZyB0cmFuc21pdCBkbWEgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1NMVkVSUiAgICAgIDB4NDAwMDAwMDAgLyogUElPIGFjY2VzcyBnb3QgYW4gZXJyb3IgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHUkVHX0lNQVNLX1NMVlBFUlIgICAgIDB4ODAwMDAwMDAgLyogUElPIGFjY2VzcyBnb3QgYSBwYXJpdHkgZXJyb3IgICAgICAgICAgICAqLworCisvKiBIYXBweSBNZWFsIGV4dGVybmFsIHRyYW5zbWl0dGVyIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgRVRYX1BFTkRJTkcJMHgwMFVMCS8qIFRyYW5zbWl0IHBlbmRpbmcvd2FrZXVwIHJlZ2lzdGVyICovCisjZGVmaW5lIEVUWF9DRkcJCTB4MDRVTAkvKiBUcmFuc21pdCBjb25maWcgcmVnaXN0ZXIgICAgICAgICAqLworI2RlZmluZSBFVFhfUklORwkweDA4VUwJLyogVHJhbnNtaXQgcmluZyBwb2ludGVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRYX0JCQVNFCTB4MGNVTAkvKiBUcmFuc21pdCBidWZmZXIgYmFzZSAgICAgICAgICAgICAqLworI2RlZmluZSBFVFhfQkRJU1AJMHgxMFVMCS8qIFRyYW5zbWl0IGJ1ZmZlciBkaXNwbGFjZW1lbnQgICAgICovCisjZGVmaW5lIEVUWF9GSUZPV1BUUgkweDE0VUwJLyogRklGTyB3cml0ZSBwdHIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRYX0ZJRk9TV1BUUgkweDE4VUwJLyogRklGTyB3cml0ZSBwdHIgKHNoYWRvdyByZWdpc3RlcikgKi8KKyNkZWZpbmUgRVRYX0ZJRk9SUFRSCTB4MWNVTAkvKiBGSUZPIHJlYWQgcHRyICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFVFhfRklGT1NSUFRSCTB4MjBVTAkvKiBGSUZPIHJlYWQgcHRyIChzaGFkb3cgcmVnaXN0ZXIpICAqLworI2RlZmluZSBFVFhfRklGT1BDTlQJMHgyNFVMCS8qIEZJRk8gcGFja2V0IGNvdW50ZXIgICAgICAgICAgICAgICovCisjZGVmaW5lIEVUWF9TTUFDSElORQkweDI4VUwJLyogVHJhbnNtaXR0ZXIgc3RhdGUgbWFjaGluZSAgICAgICAgKi8KKyNkZWZpbmUgRVRYX1JTSVpFCTB4MmNVTAkvKiBSaW5nIGRlc2NyaXB0b3Igc2l6ZSAgICAgICAgICAgICAqLworI2RlZmluZSBFVFhfQlBUUgkweDMwVUwJLyogVHJhbnNtaXQgZGF0YSBidWZmZXIgcHRyICAgICAgICAgKi8KKyNkZWZpbmUgRVRYX1JFR19TSVpFCTB4MzRVTAorCisvKiBFVFggdHJhbnNtaXQgcGVuZGluZyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgRVRYX1RQX0RNQVdBS0VVUCAgICAgICAgIDB4MDAwMDAwMDEgLyogUmVzdGFydCB0cmFuc21pdCBkbWEgICAgICAgICAgICAgKi8KKworLyogRVRYIGNvbmZpZyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgRVRYX0NGR19ETUFFTkFCTEUgICAgICAgIDB4MDAwMDAwMDEgLyogRW5hYmxlIHRyYW5zbWl0IGRtYSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRYX0NGR19GSUZPVEhSRVNIICAgICAgIDB4MDAwMDAzZmUgLyogVHJhbnNtaXQgRklGTyB0aHJlc2hvbGQgICAgICAgICAgKi8KKyNkZWZpbmUgRVRYX0NGR19JUlFEQUZURVIgICAgICAgIDB4MDAwMDA0MDAgLyogSW50ZXJydXB0IGFmdGVyIFRYLUZJRk8gZHJhaW5lZCAgKi8KKyNkZWZpbmUgRVRYX0NGR19JUlFEQkVGT1JFICAgICAgIDB4MDAwMDAwMDAgLyogSW50ZXJydXB0IGJlZm9yZSBUWC1GSUZPIGRyYWluZWQgKi8KKworI2RlZmluZSBFVFhfUlNJWkVfU0hJRlQgICAgICAgICAgNAorCisvKiBIYXBweSBNZWFsIGV4dGVybmFsIHJlY2VpdmVyIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgRVJYX0NGRwkJMHgwMFVMCS8qIFJlY2VpdmVyIGNvbmZpZyByZWdpc3RlciAgICAgICAgICovCisjZGVmaW5lIEVSWF9SSU5HCTB4MDRVTAkvKiBSZWNlaXZlciByaW5nIHB0ciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFUlhfQlBUUgkweDA4VUwJLyogUmVjZWl2ZXIgYnVmZmVyIHB0ciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVJYX0ZJRk9XUFRSCTB4MGNVTAkvKiBGSUZPIHdyaXRlIHB0ciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFUlhfRklGT1NXUFRSCTB4MTBVTAkvKiBGSUZPIHdyaXRlIHB0ciAoc2hhZG93IHJlZ2lzdGVyKSAqLworI2RlZmluZSBFUlhfRklGT1JQVFIJMHgxNFVMCS8qIEZJRk8gcmVhZCBwdHIgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVSWF9GSUZPU1JQVFIJMHgxOFVMCS8qIEZJRk8gcmVhZCBwdHIgKHNoYWRvdyByZWdpc3RlcikgICovCisjZGVmaW5lIEVSWF9TTUFDSElORQkweDFjVUwJLyogUmVjZWl2ZXIgc3RhdGUgbWFjaGluZSAgICAgICAgICAgKi8KKyNkZWZpbmUgRVJYX1JFR19TSVpFCTB4MjBVTAorCisvKiBFUlggY29uZmlnIHJlZ2lzdGVyLiAqLworI2RlZmluZSBFUlhfQ0ZHX0RNQUVOQUJMRSAgICAweDAwMDAwMDAxIC8qIEVuYWJsZSByZWNlaXZlIERNQSAgICAgICAgKi8KKyNkZWZpbmUgRVJYX0NGR19SRVNWMSAgICAgICAgMHgwMDAwMDAwNiAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVSWF9DRkdfQllURU9GRlNFVCAgIDB4MDAwMDAwMzggLyogUmVjZWl2ZSBmaXJzdCBieXRlIG9mZnNldCAqLworI2RlZmluZSBFUlhfQ0ZHX1JFU1YyICAgICAgICAweDAwMDAwMWMwIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVJYX0NGR19TSVpFMzIgICAgICAgMHgwMDAwMDAwMCAvKiBSZWNlaXZlIHJpbmcgc2l6ZSA9PSAzMiAgICovCisjZGVmaW5lIEVSWF9DRkdfU0laRTY0ICAgICAgIDB4MDAwMDAyMDAgLyogUmVjZWl2ZSByaW5nIHNpemUgPT0gNjQgICAqLworI2RlZmluZSBFUlhfQ0ZHX1NJWkUxMjggICAgICAweDAwMDAwNDAwIC8qIFJlY2VpdmUgcmluZyBzaXplID09IDEyOCAgKi8KKyNkZWZpbmUgRVJYX0NGR19TSVpFMjU2ICAgICAgMHgwMDAwMDYwMCAvKiBSZWNlaXZlIHJpbmcgc2l6ZSA9PSAyNTYgICovCisjZGVmaW5lIEVSWF9DRkdfUkVTVjMgICAgICAgIDB4MDAwMGY4MDAgLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFUlhfQ0ZHX0NTVU1TVEFSVCAgICAweDAwN2YwMDAwIC8qIE9mZnNldCBvZiBjaGVja3N1bSBzdGFydCwKKwkJCQkJICogaW4gaGFsZndvcmRzLiAqLworCisvKiBJJ2QgbGlrZSBhIEJpZyBNYWMsIHNtYWxsIGZyaWVzLCBzbWFsbCBjb2tlLCBhbmQgU3BhcmNMaW51eCBwbGVhc2UuICovCisjZGVmaW5lIEJNQUNfWElGQ0ZHCTB4MDAwMFVMCS8qIFhJRiBjb25maWcgcmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KKwkvKiAweDQtLT4weDIwNCwgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQk1BQ19UWFNXUkVTRVQJMHgyMDhVTAkvKiBUcmFuc21pdHRlciBzb2Z0d2FyZSByZXNldCAgICAgICAgICovCisjZGVmaW5lIEJNQUNfVFhDRkcJMHgyMGNVTAkvKiBUcmFuc21pdHRlciBjb25maWcgcmVnaXN0ZXIgICAgICAgICovCisjZGVmaW5lIEJNQUNfSUdBUDEJMHgyMTBVTAkvKiBJbnRlci1wYWNrZXQgZ2FwIDEgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfSUdBUDIJMHgyMTRVTAkvKiBJbnRlci1wYWNrZXQgZ2FwIDIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfQUxJTUlUCTB4MjE4VUwJLyogVHJhbnNtaXQgYXR0ZW1wdCBsaW1pdCAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1NUSU1FCTB4MjFjVUwJLyogVHJhbnNtaXQgc2xvdCB0aW1lICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1BMRU4JMHgyMjBVTAkvKiBTaXplIG9mIHRyYW5zbWl0IHByZWFtYmxlICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUFBBVAkweDIyNFVMCS8qIFBhdHRlcm4gZm9yIHRyYW5zbWl0IHByZWFtYmxlICAgICAgKi8KKyNkZWZpbmUgQk1BQ19UWFNERUxJTQkweDIyOFVMCS8qIFRyYW5zbWl0IGRlbGltaXRlciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19KU0laRQkweDIyY1VMCS8qIEphbSBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19UWE1BWAkweDIzMFVMCS8qIFRyYW5zbWl0IG1heCBwa3Qgc2l6ZSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19UWE1JTgkweDIzNFVMCS8qIFRyYW5zbWl0IG1pbiBwa3Qgc2l6ZSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19QQVRURU1QVAkweDIzOFVMCS8qIENvdW50IG9mIHRyYW5zbWl0IHBlYWsgYXR0ZW1wdHMgICAgKi8KKyNkZWZpbmUgQk1BQ19EVENUUgkweDIzY1VMCS8qIFRyYW5zbWl0IGRlZmVyIHRpbWVyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19OQ0NUUgkweDI0MFVMCS8qIFRyYW5zbWl0IG5vcm1hbC1jb2xsaXNpb24gY291bnRlciAgKi8KKyNkZWZpbmUgQk1BQ19GQ0NUUgkweDI0NFVMCS8qIFRyYW5zbWl0IGZpcnN0LWNvbGxpc2lvbiBjb3VudGVyICAgKi8KKyNkZWZpbmUgQk1BQ19FWENUUgkweDI0OFVMCS8qIFRyYW5zbWl0IGV4Y2Vzcy1jb2xsaXNpb24gY291bnRlciAgKi8KKyNkZWZpbmUgQk1BQ19MVENUUgkweDI0Y1VMCS8qIFRyYW5zbWl0IGxhdGUtY29sbGlzaW9uIGNvdW50ZXIgICAgKi8KKyNkZWZpbmUgQk1BQ19SU0VFRAkweDI1MFVMCS8qIFRyYW5zbWl0IHJhbmRvbSBudW1iZXIgc2VlZCAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19UWFNNQUNISU5FCTB4MjU0VUwJLyogVHJhbnNtaXQgc3RhdGUgbWFjaGluZSAgICAgICAgICAgICAqLworCS8qIDB4MjU4LS0+MHgzMDQsIHJlc2VydmVkICovCisjZGVmaW5lIEJNQUNfUlhTV1JFU0VUCTB4MzA4VUwJLyogUmVjZWl2ZXIgc29mdHdhcmUgcmVzZXQgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1JYQ0ZHCTB4MzBjVUwJLyogUmVjZWl2ZXIgY29uZmlnIHJlZ2lzdGVyICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1JYTUFYCTB4MzEwVUwJLyogUmVjZWl2ZSBtYXggcGt0IHNpemUgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1JYTUlOCTB4MzE0VUwJLyogUmVjZWl2ZSBtaW4gcGt0IHNpemUgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX01BQ0FERFIyCTB4MzE4VUwJLyogRXRoZXIgYWRkcmVzcyByZWdpc3RlciAyICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX01BQ0FERFIxCTB4MzFjVUwJLyogRXRoZXIgYWRkcmVzcyByZWdpc3RlciAxICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX01BQ0FERFIwCTB4MzIwVUwJLyogRXRoZXIgYWRkcmVzcyByZWdpc3RlciAwICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0ZSQ1RSCTB4MzI0VUwJLyogUmVjZWl2ZSBmcmFtZSByZWNlaXZlIGNvdW50ZXIgICAgICAqLworI2RlZmluZSBCTUFDX0dMRUNUUgkweDMyOFVMCS8qIFJlY2VpdmUgZ2lhbnQtbGVuZ3RoIGVycm9yIGNvdW50ZXIgKi8KKyNkZWZpbmUgQk1BQ19VTkFMRUNUUgkweDMyY1VMCS8qIFJlY2VpdmUgdW5hbGlnbmVkIGVycm9yIGNvdW50ZXIgICAgKi8KKyNkZWZpbmUgQk1BQ19SQ1JDRUNUUgkweDMzMFVMCS8qIFJlY2VpdmUgQ1JDIGVycm9yIGNvdW50ZXIgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19SWFNNQUNISU5FCTB4MzM0VUwJLyogUmVjZWl2ZXIgc3RhdGUgbWFjaGluZSAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1JYQ1ZBTElECTB4MzM4VUwJLyogUmVjZWl2ZXIgY29kZSB2aW9sYXRpb24gICAgICAgICAgICAqLworCS8qIDB4MzNjLCByZXNlcnZlZCAqLworI2RlZmluZSBCTUFDX0hUQUJMRTMJMHgzNDBVTAkvKiBIYXNoIHRhYmxlIDMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfSFRBQkxFMgkweDM0NFVMCS8qIEhhc2ggdGFibGUgMiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19IVEFCTEUxCTB4MzQ4VUwJLyogSGFzaCB0YWJsZSAxICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0hUQUJMRTAJMHgzNGNVTAkvKiBIYXNoIHRhYmxlIDAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfQUZJTFRFUjIJMHgzNTBVTAkvKiBBZGRyZXNzIGZpbHRlciAyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfQUZJTFRFUjEJMHgzNTRVTAkvKiBBZGRyZXNzIGZpbHRlciAxICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfQUZJTFRFUjAJMHgzNThVTAkvKiBBZGRyZXNzIGZpbHRlciAwICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfQUZNQVNLCTB4MzVjVUwJLyogQWRkcmVzcyBmaWx0ZXIgbWFzayAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1JFR19TSVpFCTB4MzYwVUwKKworLyogQmlnTWFjIFhJRiBjb25maWcgcmVnaXN0ZXIuICovCisjZGVmaW5lIEJJR01BQ19YQ0ZHX09ERU5BQkxFICAweDAwMDAwMDAxIC8qIE91dHB1dCBkcml2ZXIgZW5hYmxlICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1hDRkdfWExCQUNLICAgIDB4MDAwMDAwMDIgLyogTG9vcGJhY2stbW9kZSBYSUYgZW5hYmxlICAgICAqLworI2RlZmluZSBCSUdNQUNfWENGR19NTEJBQ0sgICAgMHgwMDAwMDAwNCAvKiBMb29wYmFjay1tb2RlIE1JSSBlbmFibGUgICAgICovCisjZGVmaW5lIEJJR01BQ19YQ0ZHX01JSURJU0FCICAweDAwMDAwMDA4IC8qIE1JSSByZWNlaXZlIGJ1ZmZlciBkaXNhYmxlICAgKi8KKyNkZWZpbmUgQklHTUFDX1hDRkdfU1FFTkFCTEUgIDB4MDAwMDAwMTAgLyogU1FFIHRlc3QgZW5hYmxlICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfWENGR19TUUVUV0lOICAgMHgwMDAwMDNlMCAvKiBTUUUgdGltZSB3aW5kb3cgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19YQ0ZHX0xBTkNFICAgICAweDAwMDAwMDEwIC8qIExhbmNlIG1vZGUgZW5hYmxlICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1hDRkdfTElQRzAgICAgIDB4MDAwMDAzZTAgLyogTGFuY2UgbW9kZSBJUEcwICAgICAgICAgICAgICAqLworCisvKiBCaWdNYWMgdHJhbnNtaXQgY29uZmlnIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCSUdNQUNfVFhDRkdfRU5BQkxFICAgMHgwMDAwMDAwMSAvKiBFbmFibGUgdGhlIHRyYW5zbWl0dGVyICAgICAgICovCisjZGVmaW5lIEJJR01BQ19UWENGR19TTU9ERSAgICAweDAwMDAwMDIwIC8qIEVuYWJsZSBzbG93IHRyYW5zbWl0IG1vZGUgICAgKi8KKyNkZWZpbmUgQklHTUFDX1RYQ0ZHX0NJR04gICAgIDB4MDAwMDAwNDAgLyogSWdub3JlIHRyYW5zbWl0IGNvbGxpc2lvbnMgICAqLworI2RlZmluZSBCSUdNQUNfVFhDRkdfRkNTT0ZGICAgMHgwMDAwMDA4MCAvKiBEbyBub3QgZW1pdCBGQ1MgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19UWENGR19EQkFDS09GRiAweDAwMDAwMTAwIC8qIERpc2FibGUgYmFja29mZiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1RYQ0ZHX0ZVTExEUExYIDB4MDAwMDAyMDAgLyogRW5hYmxlIGZ1bGwtZHVwbGV4ICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfVFhDRkdfREdJVkVVUCAgMHgwMDAwMDQwMCAvKiBEb24ndCBnaXZlIHVwIG9uIHRyYW5zbWl0cyAgICovCisKKy8qIEJpZ01hYyByZWNlaXZlIGNvbmZpZyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX0VOQUJMRSAgIDB4MDAwMDAwMDEgLyogRW5hYmxlIHRoZSByZWNlaXZlciAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfUFNUUklQICAgMHgwMDAwMDAyMCAvKiBQYWQgYnl0ZSBzdHJpcCBlbmFibGUgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19QTUlTQyAgICAweDAwMDAwMDQwIC8qIEVuYWJsZSBwcm9taXNjb3VzIG1vZGUgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX0RFUlIgICAgIDB4MDAwMDAwODAgLyogRGlzYWJsZSBlcnJvciBjaGVja2luZyAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfRENSQ1MgICAgMHgwMDAwMDEwMCAvKiBEaXNhYmxlIENSQyBzdHJpcHBpbmcgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19SRUpNRSAgICAweDAwMDAwMjAwIC8qIFJlamVjdCBwYWNrZXRzIGFkZHJlc3NlZCB0byBtZSAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX1BHUlAgICAgIDB4MDAwMDA0MDAgLyogRW5hYmxlIHByb21pc2MgZ3JvdXAgbW9kZSAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfSEVOQUJMRSAgMHgwMDAwMDgwMCAvKiBFbmFibGUgdGhlIGhhc2ggZmlsdGVyICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19BRU5BQkxFICAweDAwMDAxMDAwIC8qIEVuYWJsZSB0aGUgYWRkcmVzcyBmaWx0ZXIgICAgICAgKi8KKworLyogVGhlc2UgYXJlIHRoZSAiTWFuYWdlbWVudCBJbnRlcmZhY2UiIChpZS4gTUlGKSByZWdpc3RlcnMgb2YgdGhlIHRyYW5zY2VpdmVyLiAqLworI2RlZmluZSBUQ1ZSX0JCQ0xPQ0sJMHgwMFVMCS8qIEJpdCBiYW5nIGNsb2NrIHJlZ2lzdGVyICAgICAgICAgICovCisjZGVmaW5lIFRDVlJfQkJEQVRBCTB4MDRVTAkvKiBCaXQgYmFuZyBkYXRhIHJlZ2lzdGVyICAgICAgICAgICAqLworI2RlZmluZSBUQ1ZSX0JCT0VOQUIJMHgwOFVMCS8qIEJpdCBiYW5nIG91dHB1dCBlbmFibGUgICAgICAgICAgICovCisjZGVmaW5lIFRDVlJfRlJBTUUJMHgwY1VMCS8qIEZyYW1lIGNvbnRyb2wvZGF0YSByZWdpc3RlciAgICAgICovCisjZGVmaW5lIFRDVlJfQ0ZHCTB4MTBVTAkvKiBNSUYgY29uZmlnIHJlZ2lzdGVyICAgICAgICAgICAgICAqLworI2RlZmluZSBUQ1ZSX0lNQVNLCTB4MTRVTAkvKiBNSUYgaW50ZXJydXB0IG1hc2sgICAgICAgICAgICAgICAqLworI2RlZmluZSBUQ1ZSX1NUQVRVUwkweDE4VUwJLyogTUlGIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENWUl9TTUFDSElORQkweDFjVUwJLyogTUlGIHN0YXRlIG1hY2hpbmUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENWUl9SRUdfU0laRQkweDIwVUwKKworLyogRnJhbWUgY29tbWFuZHMuICovCisjZGVmaW5lIEZSQU1FX1dSSVRFICAgICAgICAgICAweDUwMDIwMDAwCisjZGVmaW5lIEZSQU1FX1JFQUQgICAgICAgICAgICAweDYwMDIwMDAwCisKKy8qIFRyYW5zY2VpdmVyIGNvbmZpZyByZWdpc3RlciAqLworI2RlZmluZSBUQ1ZfQ0ZHX1BTRUxFQ1QgICAgICAgMHgwMDAwMDAwMSAvKiBTZWxlY3QgUEhZICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRDVl9DRkdfUEVOQUJMRSAgICAgICAweDAwMDAwMDAyIC8qIEVuYWJsZSBNSUYgcG9sbGluZyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENWX0NGR19CRU5BQkxFICAgICAgIDB4MDAwMDAwMDQgLyogRW5hYmxlIHRoZSAiYml0IGJhbmdlciIgb2ggYmFieSAqLworI2RlZmluZSBUQ1ZfQ0ZHX1BSRUdBRERSICAgICAgMHgwMDAwMDBmOCAvKiBBZGRyZXNzIG9mIHBvbGwgcmVnaXN0ZXIgICAgICAgICovCisjZGVmaW5lIFRDVl9DRkdfTURJTzAgICAgICAgICAweDAwMDAwMTAwIC8qIE1ESU8gemVybywgZGF0YS9hdHRhY2hlZCAgICAgICAgKi8KKyNkZWZpbmUgVENWX0NGR19NRElPMSAgICAgICAgIDB4MDAwMDAyMDAgLyogTURJTyBvbmUsICBkYXRhL2F0dGFjaGVkICAgICAgICAqLworI2RlZmluZSBUQ1ZfQ0ZHX1BEQUREUiAgICAgICAgMHgwMDAwN2MwMCAvKiBEZXZpY2UgUEhZIGFkZHJlc3MgcG9sbGluZyAgICAgICovCisKKy8qIEhlcmUgYXJlIHNvbWUgUEhZIGFkZHJlc3Nlcy4gKi8KKyNkZWZpbmUgVENWX1BBRERSX0VUWCAgICAgICAgIDAgICAgICAgICAgLyogSW50ZXJuYWwgdHJhbnNjZWl2ZXIgICAgICAgICAgICAqLworI2RlZmluZSBUQ1ZfUEFERFJfSVRYICAgICAgICAgMSAgICAgICAgICAvKiBFeHRlcm5hbCB0cmFuc2NlaXZlciAgICAgICAgICAgICovCisKKy8qIFRyYW5zY2VpdmVyIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBUQ1ZfU1RBVF9CQVNJQyAgICAgICAgMHhmZmZmMDAwMCAvKiBUaGUgImJhc2ljIiBwYXJ0ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRDVl9TVEFUX05PUk1BTCAgICAgICAweDAwMDBmZmZmIC8qIFRoZSAibm9uLWJhc2ljIiBwYXJ0ICAgICAgICAgICAgKi8KKworLyogSW5zaWRlIHRoZSBIYXBweSBNZWFsIHRyYW5zY2VpdmVyIGlzIHRoZSBwaHlzaWNhbCBsYXllciwgdGhleSB1c2UgYW4KKyAqIGltcGxlbWVudGF0aW9ucyBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciwgcGFydCBudW1iZXIgRFA4Mzg0MFZDRS4KKyAqIFlvdSBjYW4gcmV0cmlldmUgdGhlIGRhdGEgc2hlZXRzIGFuZCBwcm9ncmFtbWluZyBkb2NzIGZvciB0aGlzIGJlYXN0CisgKiBmcm9tIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tLworICoKKyAqIFRoZSBEUDgzODQwIGlzIGNhcGFibGUgb2YgYm90aCAxMCBhbmQgMTAwTWJwcyBldGhlcm5ldCwgaW4gYm90aAorICogaGFsZiBhbmQgZnVsbCBkdXBsZXggbW9kZS4gIEl0IGFsc28gc3VwcG9ydHMgYXV0byBuZWdvdGlhdGlvbi4KKyAqCisgKiBCdXQuLi4uIFRISVMgVEhJTkcgSVMgQSBQQUlOIElOIFRIRSBBU1MgVE8gUFJPR1JBTSEKKyAqIERlYnVnZ2luZyBlZXByb20gYnVybnQgY29kZSBpcyBtb3JlIGZ1biB0aGFuIHByb2dyYW1taW5nIHRoaXMgY2hpcCEKKyAqLworCisvKiBHZW5lcmljIE1JSSByZWdpc3RlcnMgZGVmaW5lZCBpbiBsaW51eC9taWkuaCwgdGhlc2UgYmVsb3cKKyAqIGFyZSBEUDgzODQwIHNwZWNpZmljLgorICovCisjZGVmaW5lIERQODM4NDBfQ1NDT05GSUcgICAgICAgIDB4MTcgICAgICAgIC8qIENTIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAqLworCisvKiBUaGUgQ2FycmllciBTZW5zZSBjb25maWcgcmVnaXN0ZXIuICovCisjZGVmaW5lIENTQ09ORklHX1JFU1YxICAgICAgICAgIDB4MDAwMSAgLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENTQ09ORklHX0xFRDQgICAgICAgICAgIDB4MDAwMiAgLyogUGluIGZvciBmdWxsLWRwbHggTEVENCAgICAgICovCisjZGVmaW5lIENTQ09ORklHX0xFRDEgICAgICAgICAgIDB4MDAwNCAgLyogUGluIGZvciBjb25uLXN0YXR1cyBMRUQxICAgICovCisjZGVmaW5lIENTQ09ORklHX1JFU1YyICAgICAgICAgIDB4MDAwOCAgLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENTQ09ORklHX1RDVkRJU0FCICAgICAgIDB4MDAxMCAgLyogVHVybnMgb2ZmIHRoZSB0cmFuc2NlaXZlciAgICovCisjZGVmaW5lIENTQ09ORklHX0RGQllQQVNTICAgICAgIDB4MDAyMCAgLyogQnlwYXNzIGRpc2Nvbm5lY3QgZnVuY3Rpb24gICovCisjZGVmaW5lIENTQ09ORklHX0dMRk9SQ0UgICAgICAgIDB4MDA0MCAgLyogR29vZCBsaW5rIGZvcmNlIGZvciAxMDBtYnBzICovCisjZGVmaW5lIENTQ09ORklHX0NMS1RSSVNUQVRFICAgIDB4MDA4MCAgLyogVHJpc3RhdGUgMjVtIGNsb2NrICAgICAgICAgICovCisjZGVmaW5lIENTQ09ORklHX1JFU1YzICAgICAgICAgIDB4MDcwMCAgLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENTQ09ORklHX0VOQ09ERSAgICAgICAgIDB4MDgwMCAgLyogMT1NTFQtMywgMD1iaW5hcnkgICAgICAgICAgICovCisjZGVmaW5lIENTQ09ORklHX1JFTkFCTEUgICAgICAgIDB4MTAwMCAgLyogUmVwZWF0ZXIgbW9kZSBlbmFibGUgICAgICAgICovCisjZGVmaW5lIENTQ09ORklHX1RDRElTQUJMRSAgICAgIDB4MjAwMCAgLyogRGlzYWJsZSB0aW1lb3V0IGNvdW50ZXIgICAgICovCisjZGVmaW5lIENTQ09ORklHX1JFU1Y0ICAgICAgICAgIDB4NDAwMCAgLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENTQ09ORklHX05ESVNBQkxFICAgICAgIDB4ODAwMCAgLyogRGlzYWJsZSBOUlpJICAgICAgICAgICAgICAgICovCisKKy8qIEhhcHB5IE1lYWwgZGVzY3JpcHRvciByaW5ncyBhbmQgc3VjaC4KKyAqIEFsbCBkZXNjcmlwdG9yIHJpbmdzIG11c3QgYmUgYWxpZ25lZCBvbiBhIDJLIGJvdW5kYXJ5LgorICogQWxsIHJlY2VpdmUgYnVmZmVycyBtdXN0IGJlIDY0IGJ5dGUgYWxpZ25lZC4KKyAqIEFsd2F5cyB3cml0ZSB0aGUgYWRkcmVzcyBmaXJzdCBiZWZvcmUgc2V0dGluZyB0aGUgb3duZXJzaGlwCisgKiBiaXRzIHRvIGF2b2lkIHJhY2VzIHdpdGggdGhlIGhhcmR3YXJlIHNjYW5uaW5nIHRoZSByaW5nLgorICovCitzdHJ1Y3QgaGFwcHlfbWVhbF9yeGQgeworCXUzMiByeF9mbGFnczsKKwl1MzIgcnhfYWRkcjsKK307CisKKyNkZWZpbmUgUlhGTEFHX09XTiAgICAgICAgIDB4ODAwMDAwMDAgLyogMSA9IGhhcmR3YXJlLCAwID0gc29mdHdhcmUgKi8KKyNkZWZpbmUgUlhGTEFHX09WRVJGTE9XICAgIDB4NDAwMDAwMDAgLyogMSA9IGJ1ZmZlciBvdmVyZmxvdyAgICAgICAgKi8KKyNkZWZpbmUgUlhGTEFHX1NJWkUgICAgICAgIDB4M2ZmZjAwMDAgLyogU2l6ZSBvZiB0aGUgYnVmZmVyICAgICAgICAgKi8KKyNkZWZpbmUgUlhGTEFHX0NTVU0gICAgICAgIDB4MDAwMGZmZmYgLyogSFcgY29tcHV0ZWQgY2hlY2tzdW0gICAgICAgKi8KKworc3RydWN0IGhhcHB5X21lYWxfdHhkIHsKKwl1MzIgdHhfZmxhZ3M7CisJdTMyIHR4X2FkZHI7Cit9OworCisjZGVmaW5lIFRYRkxBR19PV04gICAgICAgICAweDgwMDAwMDAwIC8qIDEgPSBoYXJkd2FyZSwgMCA9IHNvZnR3YXJlICovCisjZGVmaW5lIFRYRkxBR19TT1AgICAgICAgICAweDQwMDAwMDAwIC8qIDEgPSBzdGFydCBvZiBwYWNrZXQgICAgICAgICovCisjZGVmaW5lIFRYRkxBR19FT1AgICAgICAgICAweDIwMDAwMDAwIC8qIDEgPSBlbmQgb2YgcGFja2V0ICAgICAgICAgICovCisjZGVmaW5lIFRYRkxBR19DU0VOQUJMRSAgICAweDEwMDAwMDAwIC8qIDEgPSBlbmFibGUgaHctY2hlY2tzdW1zICAgICovCisjZGVmaW5lIFRYRkxBR19DU0xPQ0FUSU9OICAweDBmZjAwMDAwIC8qIFdoZXJlIHRvIHN0aWNrIHRoZSBjc3VtICAgICovCisjZGVmaW5lIFRYRkxBR19DU0JVRkJFR0lOICAweDAwMGZjMDAwIC8qIFdoZXJlIHRvIGJlZ2luIGNoZWNrc3VtICAgICovCisjZGVmaW5lIFRYRkxBR19TSVpFICAgICAgICAweDAwMDAzZmZmIC8qIFNpemUgb2YgdGhlIHBhY2tldCAgICAgICAgICovCisKKyNkZWZpbmUgVFhfUklOR19TSVpFICAgICAgIDMyICAgICAgICAgLyogTXVzdCBiZSA+MTYgYW5kIDwyNTUsIG11bHRpcGxlIG9mIDE2ICAqLworI2RlZmluZSBSWF9SSU5HX1NJWkUgICAgICAgMzIgICAgICAgICAvKiBzZWUgRVJYX0NGR19TSVpFKiBmb3IgcG9zc2libGUgdmFsdWVzICovCisKKyNpZiAoVFhfUklOR19TSVpFIDwgMTYgfHwgVFhfUklOR19TSVpFID4gMjU2IHx8IChUWF9SSU5HX1NJWkUgJSAxNikgIT0gMCkKKyNlcnJvciBUWF9SSU5HX1NJWkUgaG9sZHMgaWxsZWdhbCB2YWx1ZQorI2VuZGlmCisKKyNkZWZpbmUgVFhfUklOR19NQVhTSVpFICAgIDI1NgorI2RlZmluZSBSWF9SSU5HX01BWFNJWkUgICAgMjU2CisKKy8qIFdlIHVzZSBhIDE0IGJ5dGUgb2Zmc2V0IGZvciBjaGVja3N1bSBjb21wdXRhdGlvbi4gKi8KKyNpZiAoUlhfUklOR19TSVpFID09IDMyKQorI2RlZmluZSBFUlhfQ0ZHX0RFRkFVTFQob2ZmKSAoRVJYX0NGR19ETUFFTkFCTEV8KChvZmYpPDwzKXxFUlhfQ0ZHX1NJWkUzMnwoKDE0LzIpPDwxNikpCisjZWxzZQorI2lmIChSWF9SSU5HX1NJWkUgPT0gNjQpCisjZGVmaW5lIEVSWF9DRkdfREVGQVVMVChvZmYpIChFUlhfQ0ZHX0RNQUVOQUJMRXwoKG9mZik8PDMpfEVSWF9DRkdfU0laRTY0fCgoMTQvMik8PDE2KSkKKyNlbHNlCisjaWYgKFJYX1JJTkdfU0laRSA9PSAxMjgpCisjZGVmaW5lIEVSWF9DRkdfREVGQVVMVChvZmYpIChFUlhfQ0ZHX0RNQUVOQUJMRXwoKG9mZik8PDMpfEVSWF9DRkdfU0laRTEyOHwoKDE0LzIpPDwxNikpCisjZWxzZQorI2lmIChSWF9SSU5HX1NJWkUgPT0gMjU2KQorI2RlZmluZSBFUlhfQ0ZHX0RFRkFVTFQob2ZmKSAoRVJYX0NGR19ETUFFTkFCTEV8KChvZmYpPDwzKXxFUlhfQ0ZHX1NJWkUyNTZ8KCgxNC8yKTw8MTYpKQorI2Vsc2UKKyNlcnJvciBSWF9SSU5HX1NJWkUgaG9sZHMgaWxsZWdhbCB2YWx1ZQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgTkVYVF9SWChudW0pICAgICAgICgoKG51bSkgKyAxKSAmIChSWF9SSU5HX1NJWkUgLSAxKSkKKyNkZWZpbmUgTkVYVF9UWChudW0pICAgICAgICgoKG51bSkgKyAxKSAmIChUWF9SSU5HX1NJWkUgLSAxKSkKKyNkZWZpbmUgUFJFVl9SWChudW0pICAgICAgICgoKG51bSkgLSAxKSAmIChSWF9SSU5HX1NJWkUgLSAxKSkKKyNkZWZpbmUgUFJFVl9UWChudW0pICAgICAgICgoKG51bSkgLSAxKSAmIChUWF9SSU5HX1NJWkUgLSAxKSkKKworI2RlZmluZSBUWF9CVUZGU19BVkFJTChocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoKGhwKS0+dHhfb2xkIDw9IChocCktPnR4X25ldykgPyAgICAgICAgICAgICAgICAgICAgIFwKKwkgIChocCktPnR4X29sZCArIChUWF9SSU5HX1NJWkUgLSAxKSAtIChocCktPnR4X25ldyA6ICBcCisJCQkgICAgKGhwKS0+dHhfb2xkIC0gKGhwKS0+dHhfbmV3IC0gMSkKKworI2RlZmluZSBSWF9PRkZTRVQgICAgICAgICAgMgorI2RlZmluZSBSWF9CVUZfQUxMT0NfU0laRSAgKDE1NDYgKyBSWF9PRkZTRVQgKyA2NCkKKworI2RlZmluZSBSWF9DT1BZX1RIUkVTSE9MRCAgMjU2CisKK3N0cnVjdCBobWVhbF9pbml0X2Jsb2NrIHsKKwlzdHJ1Y3QgaGFwcHlfbWVhbF9yeGQgaGFwcHlfbWVhbF9yeGRbUlhfUklOR19NQVhTSVpFXTsKKwlzdHJ1Y3QgaGFwcHlfbWVhbF90eGQgaGFwcHlfbWVhbF90eGRbVFhfUklOR19NQVhTSVpFXTsKK307CisKKyNkZWZpbmUgaGJsb2NrX29mZnNldChtZW0sIGVsZW0pIFwKKygoX191MzIpKCh1bnNpZ25lZCBsb25nKSgmKCgoc3RydWN0IGhtZWFsX2luaXRfYmxvY2sgKikwKS0+bWVtW2VsZW1dKSkpKQorCisvKiBOb3cgc29mdHdhcmUgc3RhdGUgc3R1ZmYuICovCitlbnVtIGhhcHB5X3RyYW5zY2VpdmVyIHsKKwlleHRlcm5hbCA9IDAsCisJaW50ZXJuYWwgPSAxLAorCW5vbmUgICAgID0gMiwKK307CisKKy8qIFRpbWVyIHN0YXRlIGVuZ2luZS4gKi8KK2VudW0gaGFwcHlfdGltZXJfc3RhdGUgeworCWFyYndhaXQgID0gMCwgIC8qIFdhaXRpbmcgZm9yIGF1dG8gbmVnb3RpYXRpb24gdG8gY29tcGxldGUuICAgICAgICAgICovCisJbHVwd2FpdCAgPSAxLCAgLyogQXV0by1uZWcgY29tcGxldGUsIGF3YWl0aW5nIGxpbmstdXAgc3RhdHVzLiAgICAgICAgKi8KKwlsdHJ5d2FpdCA9IDIsICAvKiBGb3JjaW5nIHRyeSBvZiBhbGwgbW9kZXMsIGZyb20gZmFzdGVzdCB0byBzbG93ZXN0LiAqLworCWFzbGVlcCAgID0gMywgIC8qIFRpbWUgaW5hY3RpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9OworCitzdHJ1Y3QgcXVhdHRybzsKKworLyogSGFwcHkgaGFwcHksIGpveSBqb3khICovCitzdHJ1Y3QgaGFwcHlfbWVhbCB7CisJdm9pZCBfX2lvbWVtCSpncmVnczsJCQkvKiBIYXBweSBtZWFsIGdsb2JhbCByZWdpc3RlcnMgICAgICAgKi8KKwlzdHJ1Y3QgaG1lYWxfaW5pdF9ibG9jayAgKmhhcHB5X2Jsb2NrOwkvKiBSWCBhbmQgVFggZGVzY3JpcHRvcnMgKENQVSBhZGRyKSAgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NCVVMpICYmIGRlZmluZWQoQ09ORklHX1BDSSkKKwl1MzIgKCpyZWFkX2Rlc2MzMikodTMyICopOworCXZvaWQgKCp3cml0ZV90eGQpKHN0cnVjdCBoYXBweV9tZWFsX3R4ZCAqLCB1MzIsIHUzMik7CisJdm9pZCAoKndyaXRlX3J4ZCkoc3RydWN0IGhhcHB5X21lYWxfcnhkICosIHUzMiwgdTMyKTsKKwl1MzIgKCpkbWFfbWFwKSh2b2lkICosIHZvaWQgKiwgbG9uZywgaW50KTsKKwl2b2lkICgqZG1hX3VubWFwKSh2b2lkICosIHUzMiwgbG9uZywgaW50KTsKKwl2b2lkICgqZG1hX3N5bmNfZm9yX2NwdSkodm9pZCAqLCB1MzIsIGxvbmcsIGludCk7CisJdm9pZCAoKmRtYV9zeW5jX2Zvcl9kZXZpY2UpKHZvaWQgKiwgdTMyLCBsb25nLCBpbnQpOworI2VuZGlmCisKKwkvKiBUaGlzIGlzIGVpdGhlciBhIHNidXNfZGV2IG9yIGEgcGNpX2Rldi4gKi8KKwl2b2lkCQkJICAqaGFwcHlfZGV2OworCisJc3BpbmxvY2tfdAkJICBoYXBweV9sb2NrOworCisJc3RydWN0IHNrX2J1ZmYgICAgICAgICAgICpyeF9za2JzW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHNrX2J1ZmYgICAgICAgICAgICp0eF9za2JzW1RYX1JJTkdfU0laRV07CisKKwlpbnQgcnhfbmV3LCB0eF9uZXcsIHJ4X29sZCwgdHhfb2xkOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJICBuZXRfc3RhdHM7ICAgICAgLyogU3RhdGlzdGljYWwgY291bnRlcnMgICAgICAgICAgICAgICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TQlVTKSAmJiBkZWZpbmVkKENPTkZJR19QQ0kpCisJdTMyICgqcmVhZDMyKSh2b2lkIF9faW9tZW0gKik7CisJdm9pZCAoKndyaXRlMzIpKHZvaWQgX19pb21lbSAqLCB1MzIpOworI2VuZGlmCisKKwl2b2lkIF9faW9tZW0JKmV0eHJlZ3M7ICAgICAgICAvKiBFeHRlcm5hbCB0cmFuc21pdHRlciByZWdzICAgICAgICAqLworCXZvaWQgX19pb21lbQkqZXJ4cmVnczsgICAgICAgIC8qIEV4dGVybmFsIHJlY2VpdmVyIHJlZ3MgICAgICAgICAgICovCisJdm9pZCBfX2lvbWVtCSpiaWdtYWNyZWdzOyAgICAgLyogQklHTUFDIGNvcmUgcmVncwkJICAgICAqLworCXZvaWQgX19pb21lbQkqdGN2cmVnczsgICAgICAgIC8qIE1JRiB0cmFuc2NlaXZlciByZWdzICAgICAgICAgICAgICovCisKKwlkbWFfYWRkcl90ICAgICAgICAgICAgICAgIGhibG9ja19kdm1hOyAgICAvKiBEVk1BIHZpc2libGUgYWRkcmVzcyBoYXBweSBibG9jayAgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIGhhcHB5X2ZsYWdzOyAgICAvKiBEcml2ZXIgc3RhdGUgZmxhZ3MgICAgICAgICAgICAgICAgKi8KKwllbnVtIGhhcHB5X3RyYW5zY2VpdmVyICAgIHRjdnJfdHlwZTsgICAgICAvKiBLaW5kIG9mIHRyYW5zY2VpdmVyIGluIHVzZSAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIGhhcHB5X2J1cnN0czsgICAvKiBHZXQgeW91ciBtaW5kIG91dCBvZiB0aGUgZ3V0dGVyICAgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIHBhZGRyOyAgICAgICAgICAvKiBQSFkgYWRkcmVzcyBmb3IgdHJhbnNjZWl2ZXIgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgIGhtX3JldmlzaW9uOyAgICAvKiBIYXBweSBtZWFsIHJldmlzaW9uICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgIHN3X2JtY3I7ICAgICAgICAvKiBTVyBjb3B5IG9mIEJNQ1IgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgIHN3X2Jtc3I7ICAgICAgICAvKiBTVyBjb3B5IG9mIEJNU1IgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgIHN3X3BoeXNpZDE7ICAgICAvKiBTVyBjb3B5IG9mIFBIWVNJRDEgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgIHN3X3BoeXNpZDI7ICAgICAvKiBTVyBjb3B5IG9mIFBIWVNJRDIgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgIHN3X2FkdmVydGlzZTsgICAvKiBTVyBjb3B5IG9mIEFEVkVSVElTRSAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgIHN3X2xwYTsgICAgICAgICAvKiBTVyBjb3B5IG9mIExQQSAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgIHN3X2V4cGFuc2lvbjsgICAvKiBTVyBjb3B5IG9mIEVYUEFOU0lPTiAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgIHN3X2NzY29uZmlnOyAgICAvKiBTVyBjb3B5IG9mIENTQ09ORklHICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIGF1dG9fc3BlZWQ7ICAgICAvKiBBdXRvLW5lZ28gbGluayBzcGVlZCAgICAgICAgICAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICBmb3JjZWRfc3BlZWQ7ICAgLyogRm9yY2UgbW9kZSBsaW5rIHNwZWVkICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICBwb2xsX2RhdGE7ICAgICAgLyogTUlGIHBvbGwgZGF0YSAgICAgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICBwb2xsX2ZsYWc7ICAgICAgLyogTUlGIHBvbGwgZmxhZyAgICAgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICBsaW5rY2hlY2s7ICAgICAgLyogSGF2ZSB3ZSBjaGVja2VkIHRoZSBsaW5rIHlldD8gICAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICBsbmt1cDsgICAgICAgICAgLyogSXMgdGhlIGxpbmsgdXAgYXMgZmFyIGFzIHdlIGtub3c/ICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICBsbmtkb3duOyAgICAgICAgLyogVHJ5aW5nIHRvIGZvcmNlIHRoZSBsaW5rIGRvd24/ICAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICBsbmtjbnQ7ICAgICAgICAgLyogQ291bnRlciBmb3IgbGluay11cCBhdHRlbXB0cy4gICAgICovCisJc3RydWN0IHRpbWVyX2xpc3QgICAgICAgICBoYXBweV90aW1lcjsgICAgLyogVG8gd2F0Y2ggdGhlIGxpbmsgd2hlbiBjb21pbmcgdXAuICovCisJZW51bSBoYXBweV90aW1lcl9zdGF0ZSAgICB0aW1lcl9zdGF0ZTsgICAgLyogU3RhdGUgb2YgdGhlIGF1dG8tbmVnIHRpbWVyLiAgICAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgICB0aW1lcl90aWNrczsgICAgLyogTnVtYmVyIG9mIGNsaWNrcyBhdCBlYWNoIHN0YXRlLiAgICovCisKKwlzdHJ1Y3QgbmV0X2RldmljZQkgKmRldjsJCS8qIEJhY2twb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAqLworCXN0cnVjdCBxdWF0dHJvCQkgKnFmZV9wYXJlbnQ7CS8qIEZvciBRdWF0dHJvIGNhcmRzICAgICAgICAgICAgICAgICAqLworCWludAkJCSAgcWZlX2VudDsJLyogV2hpY2ggaW5zdGFuY2Ugb24gcXVhdHRybyAgICAgICAgICovCisJc3RydWN0IGhhcHB5X21lYWwgICAgICAgICAqbmV4dF9tb2R1bGU7Cit9OworCisvKiBIZXJlIGFyZSB0aGUgaGFwcHkgZmxhZ3MuICovCisjZGVmaW5lIEhGTEFHX1BPTEwgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAgIC8qIFdlIGFyZSBkb2luZyBNSUYgcG9sbGluZyAgICAgICAgICAqLworI2RlZmluZSBIRkxBR19GRU5BQkxFICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgICAvKiBUaGUgTUlJIGZyYW1lIGlzIGVuYWJsZWQgICAgICAgICAgKi8KKyNkZWZpbmUgSEZMQUdfTEFOQ0UgICAgICAgICAgICAgICAweDAwMDAwMDA0ICAgICAgLyogV2UgYXJlIHVzaW5nIGxhbmNlLW1vZGUgICAgICAgICAgICovCisjZGVmaW5lIEhGTEFHX1JYRU5BQkxFICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAgIC8qIFJlY2VpdmVyIGlzIGVuYWJsZWQgICAgICAgICAgICAgICAqLworI2RlZmluZSBIRkxBR19BVVRPICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAgICAgICAvKiBVc2luZyBhdXRvLW5lZ290aWF0aW9uLCAwID0gZm9yY2UgKi8KKyNkZWZpbmUgSEZMQUdfRlVMTCAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAgICAgLyogRnVsbCBkdXBsZXggZW5hYmxlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhGTEFHX01BQ0ZVTEwgICAgICAgICAgICAgMHgwMDAwMDA0MCAgICAgIC8qIFVzaW5nIGZ1bGwgZHVwbGV4IGluIHRoZSBNQUMgICAgICAqLworI2RlZmluZSBIRkxBR19QT0xMRU5BQkxFICAgICAgICAgIDB4MDAwMDAwODAgICAgICAvKiBBY3R1YWxseSB0cnkgTUlGIHBvbGxpbmcgICAgICAgICAgKi8KKyNkZWZpbmUgSEZMQUdfUlhDViAgICAgICAgICAgICAgICAweDAwMDAwMTAwICAgICAgLyogWFhYIFJYQ1YgRU5BQkxFICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhGTEFHX0lOSVQgICAgICAgICAgICAgICAgMHgwMDAwMDIwMCAgICAgIC8qIEluaXQgY2FsbGVkIGF0IGxlYXN0IG9uY2UgICAgICAgICAqLworI2RlZmluZSBIRkxBR19MSU5LVVAgICAgICAgICAgICAgIDB4MDAwMDA0MDAgICAgICAvKiAxID0gTGluayBpcyB1cCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEZMQUdfUENJICAgICAgICAgICAgICAgICAweDAwMDAwODAwICAgICAgLyogUENJIGJhc2VkIEhhcHB5IE1lYWwgICAgICAgICAgICAgICovCisjZGVmaW5lIEhGTEFHX1FVQVRUUk8JCSAgMHgwMDAwMTAwMCAgICAgIC8qIE9uIFFGRS9RdWF0dHJvIGNhcmQJICAgICAgICovCisKKyNkZWZpbmUgSEZMQUdfMjBfMjEgIChIRkxBR19QT0xMRU5BQkxFIHwgSEZMQUdfRkVOQUJMRSkKKyNkZWZpbmUgSEZMQUdfTk9UX0EwIChIRkxBR19QT0xMRU5BQkxFIHwgSEZMQUdfRkVOQUJMRSB8IEhGTEFHX0xBTkNFIHwgSEZMQUdfUlhDVikKKworLyogU3VwcG9ydCBmb3IgUUZFL1F1YXR0cm8gY2FyZHMuICovCitzdHJ1Y3QgcXVhdHRybyB7CisJc3RydWN0IG5ldF9kZXZpY2UJKmhhcHB5X21lYWxzWzRdOworCisJLyogVGhpcyBpcyBlaXRoZXIgYSBzYnVzX2RldiBvciBhIHBjaV9kZXYuICovCisJdm9pZAkJCSpxdWF0dHJvX2RldjsKKworCXN0cnVjdCBxdWF0dHJvCQkqbmV4dDsKKworCS8qIFBST00gcmFuZ2VzLCBpZiBhbnkuICovCisjaWZkZWYgQ09ORklHX1NCVVMKKwlzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgIHJhbmdlc1s4XTsKKyNlbmRpZgorCWludAkJCSAgbnJhbmdlczsKK307CisKKy8qIFdlIHVzZSB0aGlzIHRvIGFjcXVpcmUgcmVjZWl2ZSBza2IncyB0aGF0IHdlIGNhbiBETUEgZGlyZWN0bHkgaW50by4gKi8KKyNkZWZpbmUgQUxJR05FRF9SWF9TS0JfQUREUihhZGRyKSBcCisgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShhZGRyKSArICg2NFVMIC0gMVVMKSkgJiB+KDY0VUwgLSAxVUwpKSAtICh1bnNpZ25lZCBsb25nKShhZGRyKSkKKyNkZWZpbmUgaGFwcHlfbWVhbF9hbGxvY19za2IoX19sZW5ndGgsIF9fZ2ZwX2ZsYWdzKSBcCisoewlzdHJ1Y3Qgc2tfYnVmZiAqX19za2I7IFwKKwlfX3NrYiA9IGFsbG9jX3NrYigoX19sZW5ndGgpICsgNjQsIChfX2dmcF9mbGFncykpOyBcCisJaWYoX19za2IpIHsgXAorCQlpbnQgX19vZmZzZXQgPSAoaW50KSBBTElHTkVEX1JYX1NLQl9BRERSKF9fc2tiLT5kYXRhKTsgXAorCQlpZihfX29mZnNldCkgXAorCQkJc2tiX3Jlc2VydmUoX19za2IsIF9fb2Zmc2V0KTsgXAorCX0gXAorCV9fc2tiOyBcCit9KQorCisjZW5kaWYgLyogIShfU1VOSE1FX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5sYW5jZS5jIGIvZHJpdmVycy9uZXQvc3VubGFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmQ0NjRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3VubGFuY2UuYwpAQCAtMCwwICsxLDE2MTQgQEAKKy8qICRJZDogc3VubGFuY2UuYyx2IDEuMTEyIDIwMDIvMDEvMTUgMDY6NDg6NTUgZGF2ZW0gRXhwICQKKyAqIGxhbmNlLmM6IExpbnV4L1NwYXJjL0xhbmNlIGRyaXZlcgorICoKKyAqCVdyaXR0ZW4gMTk5NSwgMTk5NiBieSBNaWd1ZWwgZGUgSWNhemEKKyAqIFNvdXJjZXM6CisgKglUaGUgTGludXggIGRlcGNhIGRyaXZlcgorICoJVGhlIExpbnV4ICBsYW5jZSBkcml2ZXIuCisgKglUaGUgTGludXggIHNrZWxldG9uIGRyaXZlci4KKyAqCVRoZSBOZXRCU0QgU3BhcmMvTGFuY2UgZHJpdmVyLgorICoJVGhlbyBkZSBSYWFkdCAoZGVyYWFkdEBvcGVuYnNkLm9yZykKKyAqCU5DUjkyQzk5MCBMYW4gQ29udHJvbGxlciBtYW51YWwKKyAqCisgKiAxLjQ6CisgKglBZGRlZCBzdXBwb3J0IHRvIHJ1biB3aXRoIGEgbGVkbWEgb24gdGhlIFN1bjRtCisgKgorICogMS41OgorICoJQWRkZWQgbXVsdGlwbGUgY2FyZCBkZXRlY3Rpb24uCisgKgorICoJIDQvMTcvOTY6IEJ1cnN0IHNpemVzIGFuZCB0cGUgc2VsZWN0aW9uIG9uIHN1bjRtIGJ5IEVkZGllIEMuIERvc3QKKyAqCQkgIChlY2RAc2t5bmV0LmJlKQorICoKKyAqCSA1LzE1Lzk2OiBhdXRvIGNhcnJpZXIgZGV0ZWN0aW9uIG9uIHN1bjRtIGJ5IEVkZGllIEMuIERvc3QKKyAqCQkgIChlY2RAc2t5bmV0LmJlKQorICoKKyAqCSA1LzE3Lzk2OiBsZWJ1ZmZlciBvbiBzY3NpL2V0aGVyIGNhcmRzIG5vdyB3b3JrIERhdmlkIFMuIE1pbGxlcgorICoJCSAgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKgorICoJIDUvMjkvOTY6IG92ZXJyaWRlIG9wdGlvbiAndHBlLWxpbmstdGVzdD8nLCBpZiBpdCBpcyAnZmFsc2UnLCBhcworICoJCSAgdGhpcyBkaXNhYmxlcyBhdXRvIGNhcnJpZXIgZGV0ZWN0aW9uIG9uIHN1bjRtLiBFZGRpZSBDLiBEb3N0CisgKgkJICAoZWNkQHNreW5ldC5iZSkKKyAqCisgKiAxLjc6CisgKgkgNi8yNi85NjogQnVnIGZpeCBmb3IgbXVsdGlwbGUgbGVkbWFzLCBtaWd1ZWwuCisgKgorICogMS44OgorICoJCSAgU3RvbGUgbXVsdGljYXN0IGNvZGUgZnJvbSBkZXBjYS5jLCBmaXhlZCBsYW5jZV90eC4KKyAqCisgKiAxLjk6CisgKgkgOC8yMS85NjogRml4ZWQgdGhlIG11bHRpY2FzdCBjb2RlIChQZWRybyBSb3F1ZSkKKyAqCisgKgkgOC8yOC85NjogU2VuZCBmYWtlIHBhY2tldCBpbiBsYW5jZV9vcGVuKCkgaWYgYXV0b19zZWxlY3QgaXMgdHJ1ZSwKKyAqCQkgIHNvIHdlIGNhbiBkZXRlY3QgdGhlIGNhcnJpZXIgbG9zcyBjb25kaXRpb24gaW4gdGltZS4KKyAqCQkgIEVkZGllIEMuIERvc3QgKGVjZEBza3luZXQuYmUpCisgKgorICoJIDkvMTUvOTY6IEFsaWduIHJ4X2J1ZiBzbyB0aGF0IGV0aF9jb3B5X2FuZF9zdW0oKSB3b24ndCBjYXVzZSBhbgorICoJCSAgTU5BIHRyYXAgZHVyaW5nIGNoa3N1bV9wYXJ0aWFsX2NvcHkoKS4gKGVjZEBza3luZXQuYmUpCisgKgorICoJMTEvMTcvOTY6IEhhbmRsZSBMRV9DMF9NRVJSIGluIGxhbmNlX2ludGVycnVwdCgpLiAoZWNkQHNreW5ldC5iZSkKKyAqCisgKgkxMi8yMi85NjogRG9uJ3QgbG9vcCBmb3JldmVyIGluIGxhbmNlX3J4KCkgb24gaW5jb21wbGV0ZSBwYWNrZXRzLgorICoJCSAgVGhpcyB3YXMgdGhlIHN1bjRjIGtpbGxlci4gU2hpdCwgc3R1cGlkIGJ1Zy4KKyAqCQkgIChlY2RAc2t5bmV0LmJlKQorICoKKyAqIDEuMTA6CisgKgkgMS8yNi85NzogTW9kdWxhcml6ZSBkcml2ZXIuIChlY2RAc2t5bmV0LmJlKQorICoKKyAqIDEuMTE6CisgKgkxMi8yNy85NzogQWRkZWQgc3VuNGQgc3VwcG9ydC4gKGpqQHN1bnNpdGUubWZmLmN1bmkuY3opCisgKgorICogMS4xMjoKKyAqIAkgMTEvMy85OTogRml4ZWQgU01QIHJhY2UgaW4gbGFuY2Vfc3RhcnRfeG1pdCBmb3VuZCBieSBkYXZlbS4KKyAqIAkgICAgICAgICAgQW50b24gQmxhbmNoYXJkIChhbnRvbkBwcm9nc29jLnV0cy5lZHUuYXUpCisgKiAyLjAwOiAxMS85Lzk5OiBNYXNzaXZlIG92ZXJoYXVsIGFuZCBwb3J0IHRvIG5ldyBTQlVTIGRyaXZlciBpbnRlcmZhY2VzLgorICoJCSAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogMi4wMToKKyAqICAgICAgMTEvMDgvMDE6IFVzZSBsaWJyYXJ5IGNyYzMyIGZ1bmN0aW9ucyAoTWF0dF9Eb21zY2hAZGVsbC5jb20pCisgKgkJICAKKyAqLworCisjdW5kZWYgREVCVUdfRFJJVkVSCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSA9CisJInN1bmxhbmNlLmM6djIuMDIgMjQvQXVnLzAzIE1pZ3VlbCBkZSBJY2F6YSAobWlndWVsQG51Y2xlY3UudW5hbS5teClcbiI7CisKK3N0YXRpYyBjaGFyIGxhbmNlc3RyW10gPSAiTEFOQ0UiOworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4gLyogVXNlZCBmb3IgdGhlIHRlbXBvcmFsIGluZXQgZW50cmllcyBhbmQgcm91dGluZyAqLworI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgkvKiBVc2VkIGJ5IHRoZSBjaGVja3N1bSByb3V0aW5lcyAqLworI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KKyNpbmNsdWRlIDxhc20vc2J1cy5oPgorI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgorI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9hdXhpby5oPgkJLyogRm9yIHRwZS1saW5rLXRlc3Q/IHNldHRpbmcgKi8KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKy8qIERlZmluZTogMl40IFR4IGJ1ZmZlcnMgYW5kIDJeNCBSeCBidWZmZXJzICovCisjaWZuZGVmIExBTkNFX0xPR19UWF9CVUZGRVJTCisjZGVmaW5lIExBTkNFX0xPR19UWF9CVUZGRVJTIDQKKyNkZWZpbmUgTEFOQ0VfTE9HX1JYX0JVRkZFUlMgNAorI2VuZGlmCisKKyNkZWZpbmUgTEVfQ1NSMCAwCisjZGVmaW5lIExFX0NTUjEgMQorI2RlZmluZSBMRV9DU1IyIDIKKyNkZWZpbmUgTEVfQ1NSMyAzCisKKyNkZWZpbmUgTEVfTU9fUFJPTSAgICAgIDB4ODAwMCAgLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKworI2RlZmluZQlMRV9DMF9FUlIJMHg4MDAwCS8qIEVycm9yOiBzZXQgaWYgQkFCLCBTUUUsIE1JU1Mgb3IgTUUgaXMgc2V0ICovCisjZGVmaW5lCUxFX0MwX0JBQkwJMHg0MDAwCS8qIEJBQjogIEJhYmJsZTogdHggdGltZW91dC4gKi8KKyNkZWZpbmUJTEVfQzBfQ0VSUgkweDIwMDAJLyogU1FFOiAgU2lnbmFsIHF1YWxpdHkgZXJyb3IgKi8KKyNkZWZpbmUJTEVfQzBfTUlTUwkweDEwMDAJLyogTUlTUzogTWlzc2VkIGEgcGFja2V0ICovCisjZGVmaW5lCUxFX0MwX01FUlIJMHgwODAwCS8qIE1FOiAgIE1lbW9yeSBlcnJvciAqLworI2RlZmluZQlMRV9DMF9SSU5UCTB4MDQwMAkvKiBSZWNlaXZlZCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJTEVfQzBfVElOVAkweDAyMDAJLyogVHJhbnNtaXR0ZXIgSW50ZXJydXB0ICovCisjZGVmaW5lCUxFX0MwX0lET04JMHgwMTAwCS8qIElGSU46IEluaXQgZmluaXNoZWQuICovCisjZGVmaW5lCUxFX0MwX0lOVFIJMHgwMDgwCS8qIEludGVycnVwdCBvciBlcnJvciAqLworI2RlZmluZQlMRV9DMF9JTkVBCTB4MDA0MAkvKiBJbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lCUxFX0MwX1JYT04JMHgwMDIwCS8qIFJlY2VpdmVyIG9uICovCisjZGVmaW5lCUxFX0MwX1RYT04JMHgwMDEwCS8qIFRyYW5zbWl0dGVyIG9uICovCisjZGVmaW5lCUxFX0MwX1RETUQJMHgwMDA4CS8qIFRyYW5zbWl0dGVyIGRlbWFuZCAqLworI2RlZmluZQlMRV9DMF9TVE9QCTB4MDAwNAkvKiBTdG9wIHRoZSBjYXJkICovCisjZGVmaW5lCUxFX0MwX1NUUlQJMHgwMDAyCS8qIFN0YXJ0IHRoZSBjYXJkICovCisjZGVmaW5lCUxFX0MwX0lOSVQJMHgwMDAxCS8qIEluaXQgdGhlIGNhcmQgKi8KKworI2RlZmluZQlMRV9DM19CU1dQCTB4NCAgICAgLyogU1dBUCAqLworI2RlZmluZQlMRV9DM19BQ09OCTB4MgkvKiBBTEUgQ29udHJvbCAqLworI2RlZmluZQlMRV9DM19CQ09OCTB4MQkvKiBCeXRlIGNvbnRyb2wgKi8KKworLyogUmVjZWl2ZSBtZXNzYWdlIGRlc2NyaXB0b3IgMSAqLworI2RlZmluZSBMRV9SMV9PV04gICAgICAgMHg4MCAgICAvKiBXaG8gb3ducyB0aGUgZW50cnkgKi8KKyNkZWZpbmUgTEVfUjFfRVJSICAgICAgIDB4NDAgICAgLyogRXJyb3I6IGlmIEZSQSwgT0ZMLCBDUkMgb3IgQlVGIGlzIHNldCAqLworI2RlZmluZSBMRV9SMV9GUkEgICAgICAgMHgyMCAgICAvKiBGUkE6IEZyYW1lIGVycm9yICovCisjZGVmaW5lIExFX1IxX09GTCAgICAgICAweDEwICAgIC8qIE9GTDogRnJhbWUgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgTEVfUjFfQ1JDICAgICAgIDB4MDggICAgLyogQ1JDIGVycm9yICovCisjZGVmaW5lIExFX1IxX0JVRiAgICAgICAweDA0ICAgIC8qIEJVRjogQnVmZmVyIGVycm9yICovCisjZGVmaW5lIExFX1IxX1NPUCAgICAgICAweDAyICAgIC8qIFN0YXJ0IG9mIHBhY2tldCAqLworI2RlZmluZSBMRV9SMV9FT1AgICAgICAgMHgwMSAgICAvKiBFbmQgb2YgcGFja2V0ICovCisjZGVmaW5lIExFX1IxX1BPSyAgICAgICAweDAzICAgIC8qIFBhY2tldCBpcyBjb21wbGV0ZTogU09QICsgRU9QICovCisKKyNkZWZpbmUgTEVfVDFfT1dOICAgICAgIDB4ODAgICAgLyogTGFuY2Ugb3ducyB0aGUgcGFja2V0ICovCisjZGVmaW5lIExFX1QxX0VSUiAgICAgICAweDQwICAgIC8qIEVycm9yIHN1bW1hcnkgKi8KKyNkZWZpbmUgTEVfVDFfRU1PUkUgICAgIDB4MTAgICAgLyogRXJyb3I6IG1vcmUgdGhhbiBvbmUgcmV0cnkgbmVlZGVkICovCisjZGVmaW5lIExFX1QxX0VPTkUgICAgICAweDA4ICAgIC8qIEVycm9yOiBvbmUgcmV0cnkgbmVlZGVkICovCisjZGVmaW5lIExFX1QxX0VERUYgICAgICAweDA0ICAgIC8qIEVycm9yOiBkZWZlcnJlZCAqLworI2RlZmluZSBMRV9UMV9TT1AgICAgICAgMHgwMiAgICAvKiBTdGFydCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgTEVfVDFfRU9QICAgICAgIDB4MDEgICAgLyogRW5kIG9mIHBhY2tldCAqLworI2RlZmluZSBMRV9UMV9QT0sJMHgwMwkvKiBQYWNrZXQgaXMgY29tcGxldGU6IFNPUCArIEVPUCAqLworCisjZGVmaW5lIExFX1QzX0JVRiAgICAgICAweDgwMDAgIC8qIEJ1ZmZlciBlcnJvciAqLworI2RlZmluZSBMRV9UM19VRkwgICAgICAgMHg0MDAwICAvKiBFcnJvciB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgTEVfVDNfTENPTCAgICAgIDB4MTAwMCAgLyogRXJyb3IgbGF0ZSBjb2xsaXNpb24gKi8KKyNkZWZpbmUgTEVfVDNfQ0xPUyAgICAgIDB4MDgwMCAgLyogRXJyb3IgY2FycmllciBsb3NzICovCisjZGVmaW5lIExFX1QzX1JUWSAgICAgICAweDA0MDAgIC8qIEVycm9yIHJldHJ5ICovCisjZGVmaW5lIExFX1QzX1REUiAgICAgICAweDAzZmYgIC8qIFRpbWUgRG9tYWluIFJlZmxlY3RvbWV0cnkgY291bnRlciAqLworCisjZGVmaW5lIFRYX1JJTkdfU0laRQkJCSgxIDw8IChMQU5DRV9MT0dfVFhfQlVGRkVSUykpCisjZGVmaW5lIFRYX1JJTkdfTU9EX01BU0sJCShUWF9SSU5HX1NJWkUgLSAxKQorI2RlZmluZSBUWF9SSU5HX0xFTl9CSVRTCQkoKExBTkNFX0xPR19UWF9CVUZGRVJTKSA8PCAyOSkKKyNkZWZpbmUgVFhfTkVYVChfX3gpCQkJKCgoX194KSsxKSAmIFRYX1JJTkdfTU9EX01BU0spCisKKyNkZWZpbmUgUlhfUklOR19TSVpFCQkJKDEgPDwgKExBTkNFX0xPR19SWF9CVUZGRVJTKSkKKyNkZWZpbmUgUlhfUklOR19NT0RfTUFTSwkJKFJYX1JJTkdfU0laRSAtIDEpCisjZGVmaW5lIFJYX1JJTkdfTEVOX0JJVFMJCSgoTEFOQ0VfTE9HX1JYX0JVRkZFUlMpIDw8IDI5KQorI2RlZmluZSBSWF9ORVhUKF9feCkJCQkoKChfX3gpKzEpICYgUlhfUklOR19NT0RfTUFTSykKKworI2RlZmluZSBQS1RfQlVGX1NaCQkxNTQ0CisjZGVmaW5lIFJYX0JVRkZfU0laRSAgICAgICAgICAgIFBLVF9CVUZfU1oKKyNkZWZpbmUgVFhfQlVGRl9TSVpFICAgICAgICAgICAgUEtUX0JVRl9TWgorCitzdHJ1Y3QgbGFuY2VfcnhfZGVzYyB7CisJdTE2CXJtZDA7CQkvKiBsb3cgYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwl1OAlybWQxX2JpdHM7CS8qIGRlc2NyaXB0b3IgYml0cyAqLworCXU4CXJtZDFfaGFkcjsJLyogaGlnaCBhZGRyZXNzIG9mIHBhY2tldCAqLworCXMxNglsZW5ndGg7CQkvKiBUaGlzIGxlbmd0aCBpcyAycyBjb21wbGVtZW50IChuZWdhdGl2ZSkhCisJCQkJICogQnVmZmVyIGxlbmd0aAorCQkJCSAqLworCXUxNgltYmxlbmd0aDsJLyogVGhpcyBpcyB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCAqLworfTsKKworc3RydWN0IGxhbmNlX3R4X2Rlc2MgeworCXUxNgl0bWQwOwkJLyogbG93IGFkZHJlc3Mgb2YgcGFja2V0ICovCisJdTggCXRtZDFfYml0czsJLyogZGVzY3JpcHRvciBiaXRzICovCisJdTggCXRtZDFfaGFkcjsJLyogaGlnaCBhZGRyZXNzIG9mIHBhY2tldCAqLworCXMxNiAJbGVuZ3RoOwkJLyogTGVuZ3RoIGlzIDJzIGNvbXBsZW1lbnQgKG5lZ2F0aXZlKSEgKi8KKwl1MTYgCW1pc2M7Cit9OworCQkKKy8qIFRoZSBMQU5DRSBpbml0aWFsaXphdGlvbiBibG9jaywgZGVzY3JpYmVkIGluIGRhdGFib29rLiAqLworLyogT24gdGhlIFNwYXJjLCB0aGlzIGJsb2NrIHNob3VsZCBiZSBvbiBhIERNQSByZWdpb24gICAgICovCitzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayB7CisJdTE2CW1vZGU7CQkvKiBQcmUtc2V0IG1vZGUgKHJlZy4gMTUpICovCisJdTgJcGh5c19hZGRyWzZdOwkvKiBQaHlzaWNhbCBldGhlcm5ldCBhZGRyZXNzICovCisJdTMyCWZpbHRlclsyXTsJLyogTXVsdGljYXN0IGZpbHRlci4gKi8KKworCS8qIFJlY2VpdmUgYW5kIHRyYW5zbWl0IHJpbmcgYmFzZSwgYWxvbmcgd2l0aCBleHRyYSBiaXRzLiAqLworCXUxNglyeF9wdHI7CQkvKiByZWNlaXZlIGRlc2NyaXB0b3IgYWRkciAqLworCXUxNglyeF9sZW47CQkvKiByZWNlaXZlIGxlbiBhbmQgaGlnaCBhZGRyICovCisJdTE2CXR4X3B0cjsJCS8qIHRyYW5zbWl0IGRlc2NyaXB0b3IgYWRkciAqLworCXUxNgl0eF9sZW47CQkvKiB0cmFuc21pdCBsZW4gYW5kIGhpZ2ggYWRkciAqLworICAgIAorCS8qIFRoZSBUeCBhbmQgUnggcmluZyBlbnRyaWVzIG11c3QgYWxpZ25lZCBvbiA4LWJ5dGUgYm91bmRhcmllcy4gKi8KKwlzdHJ1Y3QgbGFuY2VfcnhfZGVzYyBicnhfcmluZ1tSWF9SSU5HX1NJWkVdOworCXN0cnVjdCBsYW5jZV90eF9kZXNjIGJ0eF9yaW5nW1RYX1JJTkdfU0laRV07CisgICAgCisJdTgJdHhfYnVmIFtUWF9SSU5HX1NJWkVdW1RYX0JVRkZfU0laRV07CisJdTgJcGFkWzJdOwkJLyogYWxpZ24gcnhfYnVmIGZvciBjb3B5X2FuZF9zdW0oKS4gKi8KKwl1OAlyeF9idWYgW1JYX1JJTkdfU0laRV1bUlhfQlVGRl9TSVpFXTsKK307CisKKyNkZWZpbmUgbGliZGVzY19vZmZzZXQocnQsIGVsZW0pIFwKKygoX191MzIpKCgodW5zaWduZWQgbG9uZykoJigoKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopMCktPnJ0W2VsZW1dKSkpKSkKKworI2RlZmluZSBsaWJidWZmX29mZnNldChydCwgZWxlbSkgXAorKChfX3UzMikoKCh1bnNpZ25lZCBsb25nKSgmKCgoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKikwKS0+cnRbZWxlbV1bMF0pKSkpKQorCitzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSB7CisJdm9pZCBfX2lvbWVtCSpscmVnczsJCS8qIExhbmNlIFJBUC9SRFAgcmVncy4JCSovCisJdm9pZCBfX2lvbWVtCSpkcmVnczsJCS8qIERNQSBjb250cm9sbGVyIHJlZ3MuCQkqLworCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIF9faW9tZW0gKmluaXRfYmxvY2tfaW9tZW07CisJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmluaXRfYmxvY2tfbWVtOworICAgIAorCXNwaW5sb2NrX3QJbG9jazsKKworCWludAkJcnhfbmV3LCB0eF9uZXc7CisJaW50CQlyeF9vbGQsIHR4X29sZDsKKyAgICAKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKwlzdHJ1Y3Qgc2J1c19kbWEgKmxlZG1hOwkvKiBJZiBzZXQgdGhpcyBwb2ludHMgdG8gbGVkbWEJKi8KKwljaGFyCQl0cGU7CQkvKiBjYWJsZS1zZWxlY3Rpb24gaXMgVFBFCSovCisJY2hhcgkJYXV0b19zZWxlY3Q7CS8qIGNhYmxlLXNlbGVjdGlvbiBieSBjYXJyaWVyCSovCisJY2hhcgkJYnVyc3Rfc2l6ZXM7CS8qIGxlZG1hIFNCdXMgYnVyc3Qgc2l6ZXMJKi8KKwljaGFyCQlwaW9fYnVmZmVyOwkvKiBpbml0IGJsb2NrIGluIFBJTyBzcGFjZT8JKi8KKworCXVuc2lnbmVkIHNob3J0CWJ1c21hc3Rlcl9yZWd2YWw7CisKKwl2b2lkICgqaW5pdF9yaW5nKShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKwl2b2lkICgqcngpKHN0cnVjdCBuZXRfZGV2aWNlICopOworCXZvaWQgKCp0eCkoc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKwljaGFyCSAgICAgICAJICAgICAgICpuYW1lOworCWRtYV9hZGRyX3QJCWluaXRfYmxvY2tfZHZtYTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICpkZXY7CQkgIC8qIEJhY2twb2ludGVyCSovCisJc3RydWN0IGxhbmNlX3ByaXZhdGUgICAqbmV4dF9tb2R1bGU7CisJc3RydWN0IHNidXNfZGV2CSAgICAgICAqc2RldjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICBtdWx0aWNhc3RfdGltZXI7Cit9OworCisjZGVmaW5lIFRYX0JVRkZTX0FWQUlMICgobHAtPnR4X29sZDw9bHAtPnR4X25ldyk/XAorCQkJbHAtPnR4X29sZCtUWF9SSU5HX01PRF9NQVNLLWxwLT50eF9uZXc6XAorCQkJbHAtPnR4X29sZCAtIGxwLT50eF9uZXctMSkKKworLyogTGFuY2UgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBSRFAJCTB4MDBVTAkJLyogcmVnaXN0ZXIgZGF0YSBwb3J0CQkqLworI2RlZmluZSBSQVAJCTB4MDJVTAkJLyogcmVnaXN0ZXIgYWRkcmVzcyBwb3J0CSovCisjZGVmaW5lIExBTkNFX1JFR19TSVpFCTB4MDRVTAorCisjZGVmaW5lIFNUT1BfTEFOQ0UoX19scCkgXAorZG8gewl2b2lkIF9faW9tZW0gKl9fYmFzZSA9IChfX2xwKS0+bHJlZ3M7IFwKKwlzYnVzX3dyaXRldyhMRV9DU1IwLAlfX2Jhc2UgKyBSQVApOyBcCisJc2J1c193cml0ZXcoTEVfQzBfU1RPUCwJX19iYXNlICsgUkRQKTsgXAorfSB3aGlsZSAoMCkKKworaW50IHNwYXJjX2xhbmNlX2RlYnVnID0gMjsKKworLyogVGhlIExhbmNlIHVzZXMgMjQgYml0IGFkZHJlc3NlcyAqLworLyogT24gdGhlIFN1bjRjIHRoZSBEVk1BIHdpbGwgcHJvdmlkZSB0aGUgcmVtYWluaW5nIGJ5dGVzIGZvciB1cyAqLworLyogT24gdGhlIFN1bjRtIHdlIGhhdmUgdG8gaW5zdHJ1Y3QgdGhlIGxlZG1hIHRvIHByb3ZpZGUgdGhlbSAgICAqLworLyogRXZlbiB3b3JzZSwgb24gc2NzaS9ldGhlciBTQlVTIGNhcmRzLCB0aGUgaW5pdCBibG9jayBhbmQgdGhlCisgKiB0cmFuc21pdC9yZWNlaXZlIGJ1ZmZlcnMgYXJlIGFkZHJlc3NlcyBhcyBvZmZzZXRzIGZyb20gYWJzb2x1dGUKKyAqIHplcm8gb24gdGhlIGxlYnVmZmVyIFBJTyBhcmVhLiAtRGF2ZU0KKyAqLworCisjZGVmaW5lIExBTkNFX0FERFIoeCkgKChsb25nKSh4KSAmIH4weGZmMDAwMDAwKQorCitzdGF0aWMgc3RydWN0IGxhbmNlX3ByaXZhdGUgKnJvb3RfbGFuY2VfZGV2OworCisvKiBMb2FkIHRoZSBDU1IgcmVnaXN0ZXJzICovCitzdGF0aWMgdm9pZCBsb2FkX2NzcnMoc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwKQoreworCXUzMiBsZXB0cjsKKworCWlmIChscC0+cGlvX2J1ZmZlcikKKwkJbGVwdHIgPSAwOworCWVsc2UKKwkJbGVwdHIgPSBMQU5DRV9BRERSKGxwLT5pbml0X2Jsb2NrX2R2bWEpOworCisJc2J1c193cml0ZXcoTEVfQ1NSMSwJCSAgbHAtPmxyZWdzICsgUkFQKTsKKwlzYnVzX3dyaXRldyhsZXB0ciAmIDB4ZmZmZiwJICBscC0+bHJlZ3MgKyBSRFApOworCXNidXNfd3JpdGV3KExFX0NTUjIsCQkgIGxwLT5scmVncyArIFJBUCk7CisJc2J1c193cml0ZXcobGVwdHIgPj4gMTYsCSAgbHAtPmxyZWdzICsgUkRQKTsKKwlzYnVzX3dyaXRldyhMRV9DU1IzLAkJICBscC0+bHJlZ3MgKyBSQVApOworCXNidXNfd3JpdGV3KGxwLT5idXNtYXN0ZXJfcmVndmFsLCBscC0+bHJlZ3MgKyBSRFApOworCisJLyogUG9pbnQgYmFjayB0byBjc3IwICovCisJc2J1c193cml0ZXcoTEVfQ1NSMCwgbHAtPmxyZWdzICsgUkFQKTsKK30KKworLyogU2V0dXAgdGhlIExhbmNlIFJ4IGFuZCBUeCByaW5ncyAqLworc3RhdGljIHZvaWQgbGFuY2VfaW5pdF9yaW5nX2R2bWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrX21lbTsKKwlkbWFfYWRkcl90IGFpYiA9IGxwLT5pbml0X2Jsb2NrX2R2bWE7CisJX191MzIgbGVwdHI7CisJaW50IGk7CisgICAgCisJLyogTG9jayBvdXQgb3RoZXIgcHJvY2Vzc2VzIHdoaWxlIHNldHRpbmcgdXAgaGFyZHdhcmUgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbHAtPnJ4X25ldyA9IGxwLT50eF9uZXcgPSAwOworCWxwLT5yeF9vbGQgPSBscC0+dHhfb2xkID0gMDsKKworCS8qIENvcHkgdGhlIGV0aGVybmV0IGFkZHJlc3MgdG8gdGhlIGxhbmNlIGluaXQgYmxvY2sKKwkgKiBOb3RlIHRoYXQgb24gdGhlIHNwYXJjIHlvdSBuZWVkIHRvIHN3YXAgdGhlIGV0aGVybmV0IGFkZHJlc3MuCisJICovCisJaWItPnBoeXNfYWRkciBbMF0gPSBkZXYtPmRldl9hZGRyIFsxXTsKKwlpYi0+cGh5c19hZGRyIFsxXSA9IGRldi0+ZGV2X2FkZHIgWzBdOworCWliLT5waHlzX2FkZHIgWzJdID0gZGV2LT5kZXZfYWRkciBbM107CisJaWItPnBoeXNfYWRkciBbM10gPSBkZXYtPmRldl9hZGRyIFsyXTsKKwlpYi0+cGh5c19hZGRyIFs0XSA9IGRldi0+ZGV2X2FkZHIgWzVdOworCWliLT5waHlzX2FkZHIgWzVdID0gZGV2LT5kZXZfYWRkciBbNF07CisKKwkvKiBTZXR1cCB0aGUgVHggcmluZyBlbnRyaWVzICovCisJZm9yIChpID0gMDsgaSA8PSBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlsZXB0ciA9IExBTkNFX0FERFIoYWliICsgbGliYnVmZl9vZmZzZXQodHhfYnVmLCBpKSk7CisJCWliLT5idHhfcmluZyBbaV0udG1kMCAgICAgID0gbGVwdHI7CisJCWliLT5idHhfcmluZyBbaV0udG1kMV9oYWRyID0gbGVwdHIgPj4gMTY7CisJCWliLT5idHhfcmluZyBbaV0udG1kMV9iaXRzID0gMDsKKwkJaWItPmJ0eF9yaW5nIFtpXS5sZW5ndGggICAgPSAweGYwMDA7IC8qIFRoZSBvbmVzIHJlcXVpcmVkIGJ5IHRtZDIgKi8KKwkJaWItPmJ0eF9yaW5nIFtpXS5taXNjICAgICAgPSAwOworCX0KKworCS8qIFNldHVwIHRoZSBSeCByaW5nIGVudHJpZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJbGVwdHIgPSBMQU5DRV9BRERSKGFpYiArIGxpYmJ1ZmZfb2Zmc2V0KHJ4X2J1ZiwgaSkpOworCisJCWliLT5icnhfcmluZyBbaV0ucm1kMCAgICAgID0gbGVwdHI7CisJCWliLT5icnhfcmluZyBbaV0ucm1kMV9oYWRyID0gbGVwdHIgPj4gMTY7CisJCWliLT5icnhfcmluZyBbaV0ucm1kMV9iaXRzID0gTEVfUjFfT1dOOworCQlpYi0+YnJ4X3JpbmcgW2ldLmxlbmd0aCAgICA9IC1SWF9CVUZGX1NJWkUgfCAweGYwMDA7CisJCWliLT5icnhfcmluZyBbaV0ubWJsZW5ndGggID0gMDsKKwl9CisKKwkvKiBTZXR1cCB0aGUgaW5pdGlhbGl6YXRpb24gYmxvY2sgKi8KKyAgICAKKwkvKiBTZXR1cCByeCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKwlsZXB0ciA9IExBTkNFX0FERFIoYWliICsgbGliZGVzY19vZmZzZXQoYnJ4X3JpbmcsIDApKTsKKwlpYi0+cnhfbGVuID0gKExBTkNFX0xPR19SWF9CVUZGRVJTIDw8IDEzKSB8IChsZXB0ciA+PiAxNik7CisJaWItPnJ4X3B0ciA9IGxlcHRyOworICAgIAorCS8qIFNldHVwIHR4IGRlc2NyaXB0b3IgcG9pbnRlciAqLworCWxlcHRyID0gTEFOQ0VfQUREUihhaWIgKyBsaWJkZXNjX29mZnNldChidHhfcmluZywgMCkpOworCWliLT50eF9sZW4gPSAoTEFOQ0VfTE9HX1RYX0JVRkZFUlMgPDwgMTMpIHwgKGxlcHRyID4+IDE2KTsKKwlpYi0+dHhfcHRyID0gbGVwdHI7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX2luaXRfcmluZ19waW8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIF9faW9tZW0gKmliID0gbHAtPmluaXRfYmxvY2tfaW9tZW07CisJdTMyIGxlcHRyOworCWludCBpOworICAgIAorCS8qIExvY2sgb3V0IG90aGVyIHByb2Nlc3NlcyB3aGlsZSBzZXR0aW5nIHVwIGhhcmR3YXJlICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWxwLT5yeF9uZXcgPSBscC0+dHhfbmV3ID0gMDsKKwlscC0+cnhfb2xkID0gbHAtPnR4X29sZCA9IDA7CisKKwkvKiBDb3B5IHRoZSBldGhlcm5ldCBhZGRyZXNzIHRvIHRoZSBsYW5jZSBpbml0IGJsb2NrCisJICogTm90ZSB0aGF0IG9uIHRoZSBzcGFyYyB5b3UgbmVlZCB0byBzd2FwIHRoZSBldGhlcm5ldCBhZGRyZXNzLgorCSAqLworCXNidXNfd3JpdGViKGRldi0+ZGV2X2FkZHJbMV0sICZpYi0+cGh5c19hZGRyWzBdKTsKKwlzYnVzX3dyaXRlYihkZXYtPmRldl9hZGRyWzBdLCAmaWItPnBoeXNfYWRkclsxXSk7CisJc2J1c193cml0ZWIoZGV2LT5kZXZfYWRkclszXSwgJmliLT5waHlzX2FkZHJbMl0pOworCXNidXNfd3JpdGViKGRldi0+ZGV2X2FkZHJbMl0sICZpYi0+cGh5c19hZGRyWzNdKTsKKwlzYnVzX3dyaXRlYihkZXYtPmRldl9hZGRyWzVdLCAmaWItPnBoeXNfYWRkcls0XSk7CisJc2J1c193cml0ZWIoZGV2LT5kZXZfYWRkcls0XSwgJmliLT5waHlzX2FkZHJbNV0pOworCisJLyogU2V0dXAgdGhlIFR4IHJpbmcgZW50cmllcyAqLworCWZvciAoaSA9IDA7IGkgPD0gVFhfUklOR19TSVpFOyBpKyspIHsKKwkJbGVwdHIgPSBsaWJidWZmX29mZnNldCh0eF9idWYsIGkpOworCQlzYnVzX3dyaXRldyhsZXB0ciwJJmliLT5idHhfcmluZyBbaV0udG1kMCk7CisJCXNidXNfd3JpdGViKGxlcHRyID4+IDE2LCZpYi0+YnR4X3JpbmcgW2ldLnRtZDFfaGFkcik7CisJCXNidXNfd3JpdGViKDAsCQkmaWItPmJ0eF9yaW5nIFtpXS50bWQxX2JpdHMpOworCisJCS8qIFRoZSBvbmVzIHJlcXVpcmVkIGJ5IHRtZDIgKi8KKwkJc2J1c193cml0ZXcoMHhmMDAwLAkmaWItPmJ0eF9yaW5nIFtpXS5sZW5ndGgpOworCQlzYnVzX3dyaXRldygwLAkJJmliLT5idHhfcmluZyBbaV0ubWlzYyk7CisJfQorCisJLyogU2V0dXAgdGhlIFJ4IHJpbmcgZW50cmllcyAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlsZXB0ciA9IGxpYmJ1ZmZfb2Zmc2V0KHJ4X2J1ZiwgaSk7CisKKwkJc2J1c193cml0ZXcobGVwdHIsCSZpYi0+YnJ4X3JpbmcgW2ldLnJtZDApOworCQlzYnVzX3dyaXRlYihsZXB0ciA+PiAxNiwmaWItPmJyeF9yaW5nIFtpXS5ybWQxX2hhZHIpOworCQlzYnVzX3dyaXRlYihMRV9SMV9PV04sCSZpYi0+YnJ4X3JpbmcgW2ldLnJtZDFfYml0cyk7CisJCXNidXNfd3JpdGV3KC1SWF9CVUZGX1NJWkV8MHhmMDAwLAorCQkJICAgICZpYi0+YnJ4X3JpbmcgW2ldLmxlbmd0aCk7CisJCXNidXNfd3JpdGV3KDAsCQkmaWItPmJyeF9yaW5nIFtpXS5tYmxlbmd0aCk7CisJfQorCisJLyogU2V0dXAgdGhlIGluaXRpYWxpemF0aW9uIGJsb2NrICovCisgICAgCisJLyogU2V0dXAgcnggZGVzY3JpcHRvciBwb2ludGVyICovCisJbGVwdHIgPSBsaWJkZXNjX29mZnNldChicnhfcmluZywgMCk7CisJc2J1c193cml0ZXcoKExBTkNFX0xPR19SWF9CVUZGRVJTIDw8IDEzKSB8IChsZXB0ciA+PiAxNiksCisJCSAgICAmaWItPnJ4X2xlbik7CisJc2J1c193cml0ZXcobGVwdHIsICZpYi0+cnhfcHRyKTsKKyAgICAKKwkvKiBTZXR1cCB0eCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKwlsZXB0ciA9IGxpYmRlc2Nfb2Zmc2V0KGJ0eF9yaW5nLCAwKTsKKwlzYnVzX3dyaXRldygoTEFOQ0VfTE9HX1RYX0JVRkZFUlMgPDwgMTMpIHwgKGxlcHRyID4+IDE2KSwKKwkJICAgICZpYi0+dHhfbGVuKTsKKwlzYnVzX3dyaXRldyhsZXB0ciwgJmliLT50eF9wdHIpOworfQorCitzdGF0aWMgdm9pZCBpbml0X3Jlc3RhcnRfbGVkbWEoc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwKQoreworCXUzMiBjc3IgPSBzYnVzX3JlYWRsKGxwLT5kcmVncyArIERNQV9DU1IpOworCisJaWYgKCEoY3NyICYgRE1BX0hORExfRVJST1IpKSB7CisJCS8qIEUtQ2FjaGUgZHJhaW5pbmcgKi8KKwkJd2hpbGUgKHNidXNfcmVhZGwobHAtPmRyZWdzICsgRE1BX0NTUikgJiBETUFfRklGT19JU0RSQUlOKQorCQkJYmFycmllcigpOworCX0KKworCWNzciA9IHNidXNfcmVhZGwobHAtPmRyZWdzICsgRE1BX0NTUik7CisJY3NyICY9IH5ETUFfRV9CVVJTVFM7CisJaWYgKGxwLT5idXJzdF9zaXplcyAmIERNQV9CVVJTVDMyKQorCQljc3IgfD0gRE1BX0VfQlVSU1QzMjsKKwllbHNlCisJCWNzciB8PSBETUFfRV9CVVJTVDE2OworCisJY3NyIHw9IChETUFfRFNCTF9SRF9EUk4gfCBETUFfRFNCTF9XUl9JTlYgfCBETUFfRklGT19JTlYpOworCisJaWYgKGxwLT50cGUpCisJCWNzciB8PSBETUFfRU5fRU5FVEFVSTsKKwllbHNlCisJCWNzciAmPSB+RE1BX0VOX0VORVRBVUk7CisJdWRlbGF5KDIwKTsKKwlzYnVzX3dyaXRlbChjc3IsIGxwLT5kcmVncyArIERNQV9DU1IpOworCXVkZWxheSgyMDApOworfQorCitzdGF0aWMgaW50IGluaXRfcmVzdGFydF9sYW5jZShzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApCit7CisJdTE2IHJlZ3ZhbCA9IDA7CisJaW50IGk7CisKKwlpZiAobHAtPmRyZWdzKQorCQlpbml0X3Jlc3RhcnRfbGVkbWEobHApOworCisJc2J1c193cml0ZXcoTEVfQ1NSMCwJbHAtPmxyZWdzICsgUkFQKTsKKwlzYnVzX3dyaXRldyhMRV9DMF9JTklULAlscC0+bHJlZ3MgKyBSRFApOworCisJLyogV2FpdCBmb3IgdGhlIGxhbmNlIHRvIGNvbXBsZXRlIGluaXRpYWxpemF0aW9uICovCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCXJlZ3ZhbCA9IHNidXNfcmVhZHcobHAtPmxyZWdzICsgUkRQKTsKKworCQlpZiAocmVndmFsICYgKExFX0MwX0VSUiB8IExFX0MwX0lET04pKQorCQkJYnJlYWs7CisJCWJhcnJpZXIoKTsKKwl9CisJaWYgKGkgPT0gMTAwIHx8IChyZWd2YWwgJiBMRV9DMF9FUlIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTEFOQ0UgdW5vcGVuZWQgYWZ0ZXIgJWQgdGlja3MsIGNzcjA9JTQuNHguXG4iLAorCQkgICAgICAgaSwgcmVndmFsKTsKKwkJaWYgKGxwLT5kcmVncykKKwkJCXByaW50aygiZGNzcj0lOC44eFxuIiwgc2J1c19yZWFkbChscC0+ZHJlZ3MgKyBETUFfQ1NSKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBDbGVhciBJRE9OIGJ5IHdyaXRpbmcgYSAiMSIsIGVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBzdGFydCBsYW5jZSAqLworCXNidXNfd3JpdGV3KExFX0MwX0lET04sCQkJbHAtPmxyZWdzICsgUkRQKTsKKwlzYnVzX3dyaXRldyhMRV9DMF9JTkVBIHwgTEVfQzBfU1RSVCwJbHAtPmxyZWdzICsgUkRQKTsKKworCWlmIChscC0+ZHJlZ3MpIHsKKwkJdTMyIGNzciA9IHNidXNfcmVhZGwobHAtPmRyZWdzICsgRE1BX0NTUik7CisKKwkJY3NyIHw9IERNQV9JTlRfRU5BQjsKKwkJc2J1c193cml0ZWwoY3NyLCBscC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGFuY2VfcnhfZHZtYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2tfbWVtOworCXN0cnVjdCBsYW5jZV9yeF9kZXNjICpyZDsKKwl1OCBiaXRzOworCWludCBsZW4sIGVudHJ5ID0gbHAtPnJ4X25ldzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJZm9yIChyZCA9ICZpYi0+YnJ4X3JpbmcgW2VudHJ5XTsKKwkgICAgICEoKGJpdHMgPSByZC0+cm1kMV9iaXRzKSAmIExFX1IxX09XTik7CisJICAgICByZCA9ICZpYi0+YnJ4X3JpbmcgW2VudHJ5XSkgeworCisJCS8qIFdlIGdvdCBhbiBpbmNvbXBsZXRlIGZyYW1lPyAqLworCQlpZiAoKGJpdHMgJiBMRV9SMV9QT0spICE9IExFX1IxX1BPSykgeworCQkJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCX0gZWxzZSBpZiAoYml0cyAmIExFX1IxX0VSUikgeworCQkJLyogQ291bnQgb25seSB0aGUgZW5kIGZyYW1lIGFzIGEgcnggZXJyb3IsCisJCQkgKiBub3QgdGhlIGJlZ2lubmluZworCQkJICovCisJCQlpZiAoYml0cyAmIExFX1IxX0JVRikgbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQlpZiAoYml0cyAmIExFX1IxX0NSQykgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfT0ZMKSBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfRlJBKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoYml0cyAmIExFX1IxX0VPUCkgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJbGVuID0gKHJkLT5tYmxlbmd0aCAmIDB4ZmZmKSAtIDQ7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOworCisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJcmQtPm1ibGVuZ3RoID0gMDsKKwkJCQlyZC0+cm1kMV9iaXRzID0gTEVfUjFfT1dOOworCQkJCWxwLT5yeF9uZXcgPSBSWF9ORVhUKGVudHJ5KTsKKwkJCQlyZXR1cm47CisJCQl9CisJICAgIAorCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkJLyogMTYgYnl0ZSBhbGlnbiAqLworCQkJc2tiX3B1dChza2IsIGxlbik7CQkvKiBtYWtlIHJvb20gKi8KKwkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLAorCQkJCQkgKHVuc2lnbmVkIGNoYXIgKikmKGliLT5yeF9idWYgW2VudHJ5XVswXSksCisJCQkJCSBsZW4sIDApOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJfQorCisJCS8qIFJldHVybiB0aGUgcGFja2V0IHRvIHRoZSBwb29sICovCisJCXJkLT5tYmxlbmd0aCA9IDA7CisJCXJkLT5ybWQxX2JpdHMgPSBMRV9SMV9PV047CisJCWVudHJ5ID0gUlhfTkVYVChlbnRyeSk7CisJfQorCisJbHAtPnJ4X25ldyA9IGVudHJ5OworfQorCitzdGF0aWMgdm9pZCBsYW5jZV90eF9kdm1hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9ja19tZW07CisJaW50IGksIGo7CisKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKworCWogPSBscC0+dHhfb2xkOworCWZvciAoaSA9IGo7IGkgIT0gbHAtPnR4X25ldzsgaSA9IGopIHsKKwkJc3RydWN0IGxhbmNlX3R4X2Rlc2MgKnRkID0gJmliLT5idHhfcmluZyBbaV07CisJCXU4IGJpdHMgPSB0ZC0+dG1kMV9iaXRzOworCisJCS8qIElmIHdlIGhpdCBhIHBhY2tldCBub3Qgb3duZWQgYnkgdXMsIHN0b3AgKi8KKwkJaWYgKGJpdHMgJiBMRV9UMV9PV04pCisJCQlicmVhazsKKwkJCisJCWlmIChiaXRzICYgTEVfVDFfRVJSKSB7CisJCQl1MTYgc3RhdHVzID0gdGQtPm1pc2M7CisJICAgIAorCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIExFX1QzX1JUWSkgIGxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIExFX1QzX0xDT0wpIGxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisKKwkJCWlmIChzdGF0dXMgJiBMRV9UM19DTE9TKSB7CisJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJaWYgKGxwLT5hdXRvX3NlbGVjdCkgeworCQkJCQlscC0+dHBlID0gMSAtIGxwLT50cGU7CisJCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IENhcnJpZXIgTG9zdCwgdHJ5aW5nICVzXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lLCBscC0+dHBlPyJUUEUiOiJBVUkiKTsKKwkJCQkJU1RPUF9MQU5DRShscCk7CisJCQkJCWxwLT5pbml0X3JpbmcoZGV2KTsKKwkJCQkJbG9hZF9jc3JzKGxwKTsKKwkJCQkJaW5pdF9yZXN0YXJ0X2xhbmNlKGxwKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCisJCQkvKiBCdWZmZXIgZXJyb3JzIGFuZCB1bmRlcmZsb3dzIHR1cm4gb2ZmIHRoZQorCQkJICogdHJhbnNtaXR0ZXIsIHJlc3RhcnQgdGhlIGFkYXB0ZXIuCisJCQkgKi8KKwkJCWlmIChzdGF0dXMgJiAoTEVfVDNfQlVGfExFX1QzX1VGTCkpIHsKKwkJCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFR4OiBFUlJfQlVGfEVSUl9VRkwsIHJlc3RhcnRpbmdcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJU1RPUF9MQU5DRShscCk7CisJCQkJbHAtPmluaXRfcmluZyhkZXYpOworCQkJCWxvYWRfY3NycyhscCk7CisJCQkJaW5pdF9yZXN0YXJ0X2xhbmNlKGxwKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfSBlbHNlIGlmICgoYml0cyAmIExFX1QxX1BPSykgPT0gTEVfVDFfUE9LKSB7CisJCQkvKgorCQkJICogU28gd2UgZG9uJ3QgY291bnQgdGhlIHBhY2tldCBtb3JlIHRoYW4gb25jZS4KKwkJCSAqLworCQkJdGQtPnRtZDFfYml0cyA9IGJpdHMgJiB+KExFX1QxX1BPSyk7CisKKwkJCS8qIE9uZSBjb2xsaXNpb24gYmVmb3JlIHBhY2tldCB3YXMgc2VudC4gKi8KKwkJCWlmIChiaXRzICYgTEVfVDFfRU9ORSkKKwkJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOworCisJCQkvKiBNb3JlIHRoYW4gb25lIGNvbGxpc2lvbiwgYmUgb3B0aW1pc3RpYy4gKi8KKwkJCWlmIChiaXRzICYgTEVfVDFfRU1PUkUpCisJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gMjsKKworCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCQorCQlqID0gVFhfTkVYVChqKTsKKwl9CisJbHAtPnR4X29sZCA9IGo7CitvdXQ6CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCSAgICBUWF9CVUZGU19BVkFJTCA+IDApCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3Bpb2NvcHlfdG9fc2tiKHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgX19pb21lbSAqcGlvYnVmLCBpbnQgbGVuKQoreworCXUxNiAqcDE2ID0gKHUxNiAqKSBza2ItPmRhdGE7CisJdTMyICpwMzI7CisJdTggKnA4OworCXZvaWQgX19pb21lbSAqcGJ1ZiA9IHBpb2J1ZjsKKworCS8qIFdlIGtub3cgaGVyZSB0aGF0IGJvdGggc3JjIGFuZCBkZXN0IGFyZSBvbiBhIDE2Yml0IGJvdW5kYXJ5LiAqLworCSpwMTYrKyA9IHNidXNfcmVhZHcocGJ1Zik7CisJcDMyID0gKHUzMiAqKSBwMTY7CisJcGJ1ZiArPSAyOworCWxlbiAtPSAyOworCisJd2hpbGUgKGxlbiA+PSA0KSB7CisJCSpwMzIrKyA9IHNidXNfcmVhZGwocGJ1Zik7CisJCXBidWYgKz0gNDsKKwkJbGVuIC09IDQ7CisJfQorCXA4ID0gKHU4ICopIHAzMjsKKwlpZiAobGVuID49IDIpIHsKKwkJcDE2ID0gKHUxNiAqKSBwMzI7CisJCSpwMTYrKyA9IHNidXNfcmVhZHcocGJ1Zik7CisJCXBidWYgKz0gMjsKKwkJbGVuIC09IDI7CisJCXA4ID0gKHU4ICopIHAxNjsKKwl9CisJaWYgKGxlbiA+PSAxKQorCQkqcDggPSBzYnVzX3JlYWRiKHBidWYpOworfQorCitzdGF0aWMgdm9pZCBsYW5jZV9yeF9waW8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIF9faW9tZW0gKmliID0gbHAtPmluaXRfYmxvY2tfaW9tZW07CisJc3RydWN0IGxhbmNlX3J4X2Rlc2MgX19pb21lbSAqcmQ7CisJdW5zaWduZWQgY2hhciBiaXRzOworCWludCBsZW4sIGVudHJ5OworCXN0cnVjdCBza19idWZmICpza2I7CisKKwllbnRyeSA9IGxwLT5yeF9uZXc7CisJZm9yIChyZCA9ICZpYi0+YnJ4X3JpbmcgW2VudHJ5XTsKKwkgICAgICEoKGJpdHMgPSBzYnVzX3JlYWRiKCZyZC0+cm1kMV9iaXRzKSkgJiBMRV9SMV9PV04pOworCSAgICAgcmQgPSAmaWItPmJyeF9yaW5nIFtlbnRyeV0pIHsKKworCQkvKiBXZSBnb3QgYW4gaW5jb21wbGV0ZSBmcmFtZT8gKi8KKwkJaWYgKChiaXRzICYgTEVfUjFfUE9LKSAhPSBMRV9SMV9QT0spIHsKKwkJCWxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQl9IGVsc2UgaWYgKGJpdHMgJiBMRV9SMV9FUlIpIHsKKwkJCS8qIENvdW50IG9ubHkgdGhlIGVuZCBmcmFtZSBhcyBhIHJ4IGVycm9yLAorCQkJICogbm90IHRoZSBiZWdpbm5pbmcKKwkJCSAqLworCQkJaWYgKGJpdHMgJiBMRV9SMV9CVUYpIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9DUkMpIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoYml0cyAmIExFX1IxX09GTCkgbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAoYml0cyAmIExFX1IxX0ZSQSkgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9FT1ApIGxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCWxlbiA9IChzYnVzX3JlYWR3KCZyZC0+bWJsZW5ndGgpICYgMHhmZmYpIC0gNDsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMik7CisKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlzYnVzX3dyaXRldygwLCAmcmQtPm1ibGVuZ3RoKTsKKwkJCQlzYnVzX3dyaXRlYihMRV9SMV9PV04sICZyZC0+cm1kMV9iaXRzKTsKKwkJCQlscC0+cnhfbmV3ID0gUlhfTkVYVChlbnRyeSk7CisJCQkJcmV0dXJuOworCQkJfQorCSAgICAKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CQkvKiAxNiBieXRlIGFsaWduICovCisJCQlza2JfcHV0KHNrYiwgbGVuKTsJCS8qIG1ha2Ugcm9vbSAqLworCQkJbGFuY2VfcGlvY29weV90b19za2Ioc2tiLCAmKGliLT5yeF9idWZbZW50cnldWzBdKSwgbGVuKTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCX0KKworCQkvKiBSZXR1cm4gdGhlIHBhY2tldCB0byB0aGUgcG9vbCAqLworCQlzYnVzX3dyaXRldygwLCAmcmQtPm1ibGVuZ3RoKTsKKwkJc2J1c193cml0ZWIoTEVfUjFfT1dOLCAmcmQtPnJtZDFfYml0cyk7CisJCWVudHJ5ID0gUlhfTkVYVChlbnRyeSk7CisJfQorCisJbHAtPnJ4X25ldyA9IGVudHJ5OworfQorCitzdGF0aWMgdm9pZCBsYW5jZV90eF9waW8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIF9faW9tZW0gKmliID0gbHAtPmluaXRfYmxvY2tfaW9tZW07CisJaW50IGksIGo7CisKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKworCWogPSBscC0+dHhfb2xkOworCWZvciAoaSA9IGo7IGkgIT0gbHAtPnR4X25ldzsgaSA9IGopIHsKKwkJc3RydWN0IGxhbmNlX3R4X2Rlc2MgX19pb21lbSAqdGQgPSAmaWItPmJ0eF9yaW5nIFtpXTsKKwkJdTggYml0cyA9IHNidXNfcmVhZGIoJnRkLT50bWQxX2JpdHMpOworCisJCS8qIElmIHdlIGhpdCBhIHBhY2tldCBub3Qgb3duZWQgYnkgdXMsIHN0b3AgKi8KKwkJaWYgKGJpdHMgJiBMRV9UMV9PV04pCisJCQlicmVhazsKKwkJCisJCWlmIChiaXRzICYgTEVfVDFfRVJSKSB7CisJCQl1MTYgc3RhdHVzID0gc2J1c19yZWFkdygmdGQtPm1pc2MpOworCSAgICAKKwkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBMRV9UM19SVFkpICBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBMRV9UM19MQ09MKSBscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCisJCQlpZiAoc3RhdHVzICYgTEVfVDNfQ0xPUykgeworCQkJCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCWlmIChscC0+YXV0b19zZWxlY3QpIHsKKwkJCQkJbHAtPnRwZSA9IDEgLSBscC0+dHBlOworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBDYXJyaWVyIExvc3QsIHRyeWluZyAlc1xuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSwgbHAtPnRwZT8iVFBFIjoiQVVJIik7CisJCQkJCVNUT1BfTEFOQ0UobHApOworCQkJCQlscC0+aW5pdF9yaW5nKGRldik7CisJCQkJCWxvYWRfY3NycyhscCk7CisJCQkJCWluaXRfcmVzdGFydF9sYW5jZShscCk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKworCQkJLyogQnVmZmVyIGVycm9ycyBhbmQgdW5kZXJmbG93cyB0dXJuIG9mZiB0aGUKKwkJCSAqIHRyYW5zbWl0dGVyLCByZXN0YXJ0IHRoZSBhZGFwdGVyLgorCQkJICovCisJCQlpZiAoc3RhdHVzICYgKExFX1QzX0JVRnxMRV9UM19VRkwpKSB7CisJCQkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUeDogRVJSX0JVRnxFUlJfVUZMLCByZXN0YXJ0aW5nXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCVNUT1BfTEFOQ0UobHApOworCQkJCWxwLT5pbml0X3JpbmcoZGV2KTsKKwkJCQlsb2FkX2NzcnMobHApOworCQkJCWluaXRfcmVzdGFydF9sYW5jZShscCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSBpZiAoKGJpdHMgJiBMRV9UMV9QT0spID09IExFX1QxX1BPSykgeworCQkJLyoKKwkJCSAqIFNvIHdlIGRvbid0IGNvdW50IHRoZSBwYWNrZXQgbW9yZSB0aGFuIG9uY2UuCisJCQkgKi8KKwkJCXNidXNfd3JpdGViKGJpdHMgJiB+KExFX1QxX1BPSyksICZ0ZC0+dG1kMV9iaXRzKTsKKworCQkJLyogT25lIGNvbGxpc2lvbiBiZWZvcmUgcGFja2V0IHdhcyBzZW50LiAqLworCQkJaWYgKGJpdHMgJiBMRV9UMV9FT05FKQorCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisKKwkJCS8qIE1vcmUgdGhhbiBvbmUgY29sbGlzaW9uLCBiZSBvcHRpbWlzdGljLiAqLworCQkJaWYgKGJpdHMgJiBMRV9UMV9FTU9SRSkKKwkJCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSAyOworCisJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQl9CisJCisJCWogPSBUWF9ORVhUKGopOworCX0KKwlscC0+dHhfb2xkID0gajsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkgICAgVFhfQlVGRlNfQVZBSUwgPiAwKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CitvdXQ6CisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGxhbmNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgY3NyMDsKKyAgICAKKwlzYnVzX3dyaXRldyhMRV9DU1IwLCBscC0+bHJlZ3MgKyBSQVApOworCWNzcjAgPSBzYnVzX3JlYWR3KGxwLT5scmVncyArIFJEUCk7CisKKwkvKiBBY2tub3dsZWRnZSBhbGwgdGhlIGludGVycnVwdCBzb3VyY2VzIEFTQVAgKi8KKwlzYnVzX3dyaXRldyhjc3IwICYgKExFX0MwX0lOVFIgfCBMRV9DMF9USU5UIHwgTEVfQzBfUklOVCksCisJCSAgICBscC0+bHJlZ3MgKyBSRFApOworICAgIAorCWlmICgoY3NyMCAmIExFX0MwX0VSUikgIT0gMCkgeworCQkvKiBDbGVhciB0aGUgZXJyb3IgY29uZGl0aW9uICovCisJCXNidXNfd3JpdGV3KChMRV9DMF9CQUJMIHwgTEVfQzBfRVJSIHwgTEVfQzBfTUlTUyB8CisJCQkgICAgIExFX0MwX0NFUlIgfCBMRV9DMF9NRVJSKSwKKwkJCSAgICBscC0+bHJlZ3MgKyBSRFApOworCX0KKyAgICAKKwlpZiAoY3NyMCAmIExFX0MwX1JJTlQpCisJCWxwLT5yeChkZXYpOworICAgIAorCWlmIChjc3IwICYgTEVfQzBfVElOVCkKKwkJbHAtPnR4KGRldik7CisgICAgCisJaWYgKGNzcjAgJiBMRV9DMF9CQUJMKQorCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwlpZiAoY3NyMCAmIExFX0MwX01JU1MpCisJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKworCWlmIChjc3IwICYgTEVfQzBfTUVSUikgeworCQlpZiAobHAtPmRyZWdzKSB7CisJCQl1MzIgYWRkciA9IHNidXNfcmVhZGwobHAtPmRyZWdzICsgRE1BX0FERFIpOworCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBNZW1vcnkgZXJyb3IsIHN0YXR1cyAlMDR4LCBhZGRyICUwNnhcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBjc3IwLCBhZGRyICYgMHhmZmZmZmYpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTWVtb3J5IGVycm9yLCBzdGF0dXMgJTA0eFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGNzcjApOworCQl9CisKKwkJc2J1c193cml0ZXcoTEVfQzBfU1RPUCwgbHAtPmxyZWdzICsgUkRQKTsKKworCQlpZiAobHAtPmRyZWdzKSB7CisJCQl1MzIgZG1hX2NzciA9IHNidXNfcmVhZGwobHAtPmRyZWdzICsgRE1BX0NTUik7CisKKwkJCWRtYV9jc3IgfD0gRE1BX0ZJRk9fSU5WOworCQkJc2J1c193cml0ZWwoZG1hX2NzciwgbHAtPmRyZWdzICsgRE1BX0NTUik7CisJCX0KKworCQlscC0+aW5pdF9yaW5nKGRldik7CisJCWxvYWRfY3NycyhscCk7CisJCWluaXRfcmVzdGFydF9sYW5jZShscCk7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwlzYnVzX3dyaXRldyhMRV9DMF9JTkVBLCBscC0+bHJlZ3MgKyBSRFApOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBCdWlsZCBhIGZha2UgbmV0d29yayBwYWNrZXQgYW5kIHNlbmQgaXQgdG8gb3Vyc2VsdmVzLiAqLworc3RhdGljIHZvaWQgYnVpbGRfZmFrZV9wYWNrZXQoc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBscC0+ZGV2OworCWludCBpLCBlbnRyeTsKKworCWVudHJ5ID0gbHAtPnR4X25ldyAmIFRYX1JJTkdfTU9EX01BU0s7CisJaWYgKGxwLT5waW9fYnVmZmVyKSB7CisJCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIF9faW9tZW0gKmliID0gbHAtPmluaXRfYmxvY2tfaW9tZW07CisJCXUxNiBfX2lvbWVtICpwYWNrZXQgPSAodTE2IF9faW9tZW0gKikgJihpYi0+dHhfYnVmW2VudHJ5XVswXSk7CisJCXN0cnVjdCBldGhoZHIgX19pb21lbSAqZXRoID0gKHN0cnVjdCBldGhoZHIgX19pb21lbSAqKSBwYWNrZXQ7CisJCWZvciAoaSA9IDA7IGkgPCAoRVRIX1pMRU4gLyBzaXplb2YodTE2KSk7IGkrKykKKwkJCXNidXNfd3JpdGV3KDAsICZwYWNrZXRbaV0pOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQlzYnVzX3dyaXRlYihkZXYtPmRldl9hZGRyW2ldLCAmZXRoLT5oX2Rlc3RbaV0pOworCQkJc2J1c193cml0ZWIoZGV2LT5kZXZfYWRkcltpXSwgJmV0aC0+aF9zb3VyY2VbaV0pOworCQl9CisJCXNidXNfd3JpdGV3KCgtRVRIX1pMRU4pIHwgMHhmMDAwLCAmaWItPmJ0eF9yaW5nW2VudHJ5XS5sZW5ndGgpOworCQlzYnVzX3dyaXRldygwLCAmaWItPmJ0eF9yaW5nW2VudHJ5XS5taXNjKTsKKwkJc2J1c193cml0ZWIoTEVfVDFfUE9LfExFX1QxX09XTiwgJmliLT5idHhfcmluZ1tlbnRyeV0udG1kMV9iaXRzKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9ja19tZW07CisJCXUxNiAqcGFja2V0ID0gKHUxNiAqKSAmKGliLT50eF9idWZbZW50cnldWzBdKTsKKwkJc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKikgcGFja2V0OworCQltZW1zZXQocGFja2V0LCAwLCBFVEhfWkxFTik7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCWV0aC0+aF9kZXN0W2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKwkJCWV0aC0+aF9zb3VyY2VbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworCQl9CisJCWliLT5idHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gKC1FVEhfWkxFTikgfCAweGYwMDA7CisJCWliLT5idHhfcmluZ1tlbnRyeV0ubWlzYyA9IDA7CisJCWliLT5idHhfcmluZ1tlbnRyeV0udG1kMV9iaXRzID0gKExFX1QxX1BPS3xMRV9UMV9PV04pOworCX0KKwlscC0+dHhfbmV3ID0gVFhfTkVYVChlbnRyeSk7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICpsYXN0X2RldjsKKworc3RhdGljIGludCBsYW5jZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWxhc3RfZGV2ID0gZGV2OworCisJU1RPUF9MQU5DRShscCk7CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZsYW5jZV9pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJbGFuY2VzdHIsICh2b2lkICopIGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJMYW5jZTogQ2FuJ3QgZ2V0IGlycSAlc1xuIiwgX19pcnFfaXRvYShkZXYtPmlycSkpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBPbiB0aGUgNG0sIHNldHVwIHRoZSBsZWRtYSB0byBwcm92aWRlIHRoZSB1cHBlciBiaXRzIGZvciBidWZmZXJzICovCisJaWYgKGxwLT5kcmVncykgeworCQl1MzIgcmVndmFsID0gbHAtPmluaXRfYmxvY2tfZHZtYSAmIDB4ZmYwMDAwMDA7CisKKwkJc2J1c193cml0ZWwocmVndmFsLCBscC0+ZHJlZ3MgKyBETUFfVEVTVCk7CisJfQorCisJLyogU2V0IG1vZGUgYW5kIGNsZWFyIG11bHRpY2FzdCBmaWx0ZXIgb25seSBhdCBkZXZpY2Ugb3BlbiwKKwkgKiBzbyB0aGF0IGxhbmNlX2luaXRfcmluZygpIGNhbGxlZCBhdCBhbnkgZXJyb3Igd2lsbCBub3QKKwkgKiBmb3JnZXQgbXVsdGljYXN0IGZpbHRlcnMuCisJICoKKwkgKiBCVFcgaXQgaXMgY29tbW9uIGJ1ZyBpbiBhbGwgbGFuY2UgZHJpdmVycyEgLS1BTksKKwkgKi8KKwlpZiAobHAtPnBpb19idWZmZXIpIHsKKwkJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgX19pb21lbSAqaWIgPSBscC0+aW5pdF9ibG9ja19pb21lbTsKKwkJc2J1c193cml0ZXcoMCwgJmliLT5tb2RlKTsKKwkJc2J1c193cml0ZWwoMCwgJmliLT5maWx0ZXJbMF0pOworCQlzYnVzX3dyaXRlbCgwLCAmaWItPmZpbHRlclsxXSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2tfbWVtOworCQlpYi0+bW9kZSA9IDA7CisJCWliLT5maWx0ZXIgWzBdID0gMDsKKwkJaWItPmZpbHRlciBbMV0gPSAwOworCX0KKworCWxwLT5pbml0X3JpbmcoZGV2KTsKKwlsb2FkX2NzcnMobHApOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXN0YXR1cyA9IGluaXRfcmVzdGFydF9sYW5jZShscCk7CisJaWYgKCFzdGF0dXMgJiYgbHAtPmF1dG9fc2VsZWN0KSB7CisJCWJ1aWxkX2Zha2VfcGFja2V0KGxwKTsKKwkJc2J1c193cml0ZXcoTEVfQzBfSU5FQSB8IExFX0MwX1RETUQsIGxwLT5scmVncyArIFJEUCk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBsYW5jZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJZGVsX3RpbWVyX3N5bmMoJmxwLT5tdWx0aWNhc3RfdGltZXIpOworCisJU1RPUF9MQU5DRShscCk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgKHZvaWQgKikgZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYW5jZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHN0YXR1czsKKyAgICAKKwlTVE9QX0xBTkNFKGxwKTsKKworCS8qIE9uIHRoZSA0bSwgcmVzZXQgdGhlIGRtYSB0b28gKi8KKwlpZiAobHAtPmRyZWdzKSB7CisJCXUzMiBjc3IsIGFkZHI7CisKKwkJcHJpbnRrKEtFUk5fRVJSICJyZXNldHRpbmcgbGVkbWFcbiIpOworCQljc3IgPSBzYnVzX3JlYWRsKGxwLT5kcmVncyArIERNQV9DU1IpOworCQlzYnVzX3dyaXRlbChjc3IgfCBETUFfUlNUX0VORVQsIGxwLT5kcmVncyArIERNQV9DU1IpOworCQl1ZGVsYXkoMjAwKTsKKwkJc2J1c193cml0ZWwoY3NyICYgfkRNQV9SU1RfRU5FVCwgbHAtPmRyZWdzICsgRE1BX0NTUik7CisKKwkJYWRkciA9IGxwLT5pbml0X2Jsb2NrX2R2bWEgJiAweGZmMDAwMDAwOworCQlzYnVzX3dyaXRlbChhZGRyLCBscC0+ZHJlZ3MgKyBETUFfVEVTVCk7CisJfQorCWxwLT5pbml0X3JpbmcoZGV2KTsKKwlsb2FkX2NzcnMobHApOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXN0YXR1cyA9IGluaXRfcmVzdGFydF9sYW5jZShscCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgbGFuY2VfcGlvY29weV9mcm9tX3NrYih2b2lkIF9faW9tZW0gKmRlc3QsIHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IGxlbikKK3sKKwl2b2lkIF9faW9tZW0gKnBpb2J1ZiA9IGRlc3Q7CisJdTMyICpwMzI7CisJdTE2ICpwMTY7CisJdTggKnA4OworCisJc3dpdGNoICgodW5zaWduZWQgbG9uZylzcmMgJiAweDMpIHsKKwljYXNlIDA6CisJCXAzMiA9ICh1MzIgKikgc3JjOworCQl3aGlsZSAobGVuID49IDQpIHsKKwkJCXNidXNfd3JpdGVsKCpwMzIsIHBpb2J1Zik7CisJCQlwMzIrKzsKKwkJCXBpb2J1ZiArPSA0OworCQkJbGVuIC09IDQ7CisJCX0KKwkJc3JjID0gKGNoYXIgKikgcDMyOworCQlicmVhazsKKwljYXNlIDE6CisJY2FzZSAzOgorCQlwOCA9ICh1OCAqKSBzcmM7CisJCXdoaWxlIChsZW4gPj0gNCkgeworCQkJdTMyIHZhbDsKKworCQkJdmFsICA9IHA4WzBdIDw8IDI0OworCQkJdmFsIHw9IHA4WzFdIDw8IDE2OworCQkJdmFsIHw9IHA4WzJdIDw8IDg7CisJCQl2YWwgfD0gcDhbM107CisJCQlzYnVzX3dyaXRlbCh2YWwsIHBpb2J1Zik7CisJCQlwOCArPSA0OworCQkJcGlvYnVmICs9IDQ7CisJCQlsZW4gLT0gNDsKKwkJfQorCQlzcmMgPSAoY2hhciAqKSBwODsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwMTYgPSAodTE2ICopIHNyYzsKKwkJd2hpbGUgKGxlbiA+PSA0KSB7CisJCQl1MzIgdmFsID0gcDE2WzBdPDwxNiB8IHAxNlsxXTsKKwkJCXNidXNfd3JpdGVsKHZhbCwgcGlvYnVmKTsKKwkJCXAxNiArPSAyOworCQkJcGlvYnVmICs9IDQ7CisJCQlsZW4gLT0gNDsKKwkJfQorCQlzcmMgPSAoY2hhciAqKSBwMTY7CisJCWJyZWFrOworCX07CisJaWYgKGxlbiA+PSAyKSB7CisJCXUxNiB2YWwgPSBzcmNbMF0gPDwgOCB8IHNyY1sxXTsKKwkJc2J1c193cml0ZXcodmFsLCBwaW9idWYpOworCQlzcmMgKz0gMjsKKwkJcGlvYnVmICs9IDI7CisJCWxlbiAtPSAyOworCX0KKwlpZiAobGVuID49IDEpCisJCXNidXNfd3JpdGViKHNyY1swXSwgcGlvYnVmKTsKK30KKworc3RhdGljIHZvaWQgbGFuY2VfcGlvemVybyh2b2lkIF9faW9tZW0gKmRlc3QsIGludCBsZW4pCit7CisJdm9pZCBfX2lvbWVtICpwaW9idWYgPSBkZXN0OworCisJaWYgKCh1bnNpZ25lZCBsb25nKXBpb2J1ZiAmIDEpIHsKKwkJc2J1c193cml0ZWIoMCwgcGlvYnVmKTsKKwkJcGlvYnVmICs9IDE7CisJCWxlbiAtPSAxOworCQlpZiAobGVuID09IDApCisJCQlyZXR1cm47CisJfQorCWlmIChsZW4gPT0gMSkgeworCQlzYnVzX3dyaXRlYigwLCBwaW9idWYpOworCQlyZXR1cm47CisJfQorCWlmICgodW5zaWduZWQgbG9uZylwaW9idWYgJiAyKSB7CisJCXNidXNfd3JpdGV3KDAsIHBpb2J1Zik7CisJCXBpb2J1ZiArPSAyOworCQlsZW4gLT0gMjsKKwkJaWYgKGxlbiA9PSAwKQorCQkJcmV0dXJuOworCX0KKwl3aGlsZSAobGVuID49IDQpIHsKKwkJc2J1c193cml0ZWwoMCwgcGlvYnVmKTsKKwkJcGlvYnVmICs9IDQ7CisJCWxlbiAtPSA0OworCX0KKwlpZiAobGVuID49IDIpIHsKKwkJc2J1c193cml0ZXcoMCwgcGlvYnVmKTsKKwkJcGlvYnVmICs9IDI7CisJCWxlbiAtPSAyOworCX0KKwlpZiAobGVuID49IDEpCisJCXNidXNfd3JpdGViKDAsIHBpb2J1Zik7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcHJpbnRrKEtFUk5fRVJSICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTA0eCwgcmVzZXRcbiIsCisJICAgICAgIGRldi0+bmFtZSwgc2J1c19yZWFkdyhscC0+bHJlZ3MgKyBSRFApKTsKKwlsYW5jZV9yZXNldChkZXYpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBsYW5jZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnksIHNrYmxlbiwgbGVuOworCisJc2tibGVuID0gc2tiLT5sZW47CisKKwlsZW4gPSAoc2tibGVuIDw9IEVUSF9aTEVOKSA/IEVUSF9aTEVOIDogc2tibGVuOworCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCisJbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKworCWVudHJ5ID0gbHAtPnR4X25ldyAmIFRYX1JJTkdfTU9EX01BU0s7CisJaWYgKGxwLT5waW9fYnVmZmVyKSB7CisJCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIF9faW9tZW0gKmliID0gbHAtPmluaXRfYmxvY2tfaW9tZW07CisJCXNidXNfd3JpdGV3KCgtbGVuKSB8IDB4ZjAwMCwgJmliLT5idHhfcmluZ1tlbnRyeV0ubGVuZ3RoKTsKKwkJc2J1c193cml0ZXcoMCwgJmliLT5idHhfcmluZ1tlbnRyeV0ubWlzYyk7CisJCWxhbmNlX3Bpb2NvcHlfZnJvbV9za2IoJmliLT50eF9idWZbZW50cnldWzBdLCBza2ItPmRhdGEsIHNrYmxlbik7CisJCWlmIChsZW4gIT0gc2tibGVuKQorCQkJbGFuY2VfcGlvemVybygmaWItPnR4X2J1ZltlbnRyeV1bc2tibGVuXSwgbGVuIC0gc2tibGVuKTsKKwkJc2J1c193cml0ZWIoTEVfVDFfUE9LIHwgTEVfVDFfT1dOLCAmaWItPmJ0eF9yaW5nW2VudHJ5XS50bWQxX2JpdHMpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrX21lbTsKKwkJaWItPmJ0eF9yaW5nIFtlbnRyeV0ubGVuZ3RoID0gKC1sZW4pIHwgMHhmMDAwOworCQlpYi0+YnR4X3JpbmcgW2VudHJ5XS5taXNjID0gMDsKKwkJbWVtY3B5KChjaGFyICopJmliLT50eF9idWYgW2VudHJ5XVswXSwgc2tiLT5kYXRhLCBza2JsZW4pOworCQlpZiAobGVuICE9IHNrYmxlbikKKwkJCW1lbXNldCgoY2hhciAqKSAmaWItPnR4X2J1ZiBbZW50cnldW3NrYmxlbl0sIDAsIGxlbiAtIHNrYmxlbik7CisJCWliLT5idHhfcmluZyBbZW50cnldLnRtZDFfYml0cyA9IChMRV9UMV9QT0sgfCBMRV9UMV9PV04pOworCX0KKworCWxwLT50eF9uZXcgPSBUWF9ORVhUKGVudHJ5KTsKKworCWlmIChUWF9CVUZGU19BVkFJTCA8PSAwKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBLaWNrIHRoZSBsYW5jZTogdHJhbnNtaXQgbm93ICovCisJc2J1c193cml0ZXcoTEVfQzBfSU5FQSB8IExFX0MwX1RETUQsIGxwLT5scmVncyArIFJEUCk7CisKKwkvKiBSZWFkIGJhY2sgQ1NSIHRvIGludmFsaWRhdGUgdGhlIEUtQ2FjaGUuCisJICogVGhpcyBpcyBuZWVkZWQsIGJlY2F1c2UgRE1BX0RTQkxfV1JfSU5WIGlzIHNldC4KKwkgKi8KKwlpZiAobHAtPmRyZWdzKQorCQlzYnVzX3JlYWR3KGxwLT5scmVncyArIFJEUCk7CisKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKyAgICAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsYW5jZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qIHRha2VuIGZyb20gdGhlIGRlcGNhIGRyaXZlciAqLworc3RhdGljIHZvaWQgbGFuY2VfbG9hZF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCWNoYXIgKmFkZHJzOworCWludCBpOworCXUzMiBjcmM7CisJdTMyIHZhbDsKKwkKKwkvKiBzZXQgYWxsIG11bHRpY2FzdCBiaXRzICovCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCisJCXZhbCA9IH4wOworCWVsc2UKKwkJdmFsID0gMDsKKworCWlmIChscC0+cGlvX2J1ZmZlcikgeworCQlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayBfX2lvbWVtICppYiA9IGxwLT5pbml0X2Jsb2NrX2lvbWVtOworCQlzYnVzX3dyaXRlbCh2YWwsICZpYi0+ZmlsdGVyWzBdKTsKKwkJc2J1c193cml0ZWwodmFsLCAmaWItPmZpbHRlclsxXSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2tfbWVtOworCQlpYi0+ZmlsdGVyIFswXSA9IHZhbDsKKwkJaWItPmZpbHRlciBbMV0gPSB2YWw7CisJfQorCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCisJCXJldHVybjsKKwkKKwkvKiBBZGQgYWRkcmVzc2VzICovCisJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgeworCQlhZGRycyA9IGRtaS0+ZG1pX2FkZHI7CisJCWRtaSAgID0gZG1pLT5uZXh0OworCisJCS8qIG11bHRpY2FzdCBhZGRyZXNzPyAqLworCQlpZiAoISgqYWRkcnMgJiAxKSkKKwkJCWNvbnRpbnVlOworCQljcmMgPSBldGhlcl9jcmNfbGUoNiwgYWRkcnMpOworCQljcmMgPSBjcmMgPj4gMjY7CisJCWlmIChscC0+cGlvX2J1ZmZlcikgeworCQkJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgX19pb21lbSAqaWIgPSBscC0+aW5pdF9ibG9ja19pb21lbTsKKwkJCXUxNiBfX2lvbWVtICptY2FzdF90YWJsZSA9ICh1MTYgX19pb21lbSAqKSAmaWItPmZpbHRlcjsKKwkJCXUxNiB0bXAgPSBzYnVzX3JlYWR3KCZtY2FzdF90YWJsZVtjcmM+PjRdKTsKKwkJCXRtcCB8PSAxIDw8IChjcmMgJiAweGYpOworCQkJc2J1c193cml0ZXcodG1wLCAmbWNhc3RfdGFibGVbY3JjPj40XSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9ja19tZW07CisJCQl1MTYgKm1jYXN0X3RhYmxlID0gKHUxNiAqKSAmaWItPmZpbHRlcjsKKwkJCW1jYXN0X3RhYmxlIFtjcmMgPj4gNF0gfD0gMSA8PCAoY3JjICYgMHhmKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgbGFuY2Vfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliX21lbSA9IGxwLT5pbml0X2Jsb2NrX21lbTsKKwlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayBfX2lvbWVtICppYl9pb21lbSA9IGxwLT5pbml0X2Jsb2NrX2lvbWVtOworCXUxNiBtb2RlOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybjsKKworCWlmIChscC0+dHhfb2xkICE9IGxwLT50eF9uZXcpIHsKKwkJbW9kX3RpbWVyKCZscC0+bXVsdGljYXN0X3RpbWVyLCBqaWZmaWVzICsgNCk7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJcmV0dXJuOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCVNUT1BfTEFOQ0UobHApOworCWxwLT5pbml0X3JpbmcoZGV2KTsKKworCWlmIChscC0+cGlvX2J1ZmZlcikKKwkJbW9kZSA9IHNidXNfcmVhZHcoJmliX2lvbWVtLT5tb2RlKTsKKwllbHNlCisJCW1vZGUgPSBpYl9tZW0tPm1vZGU7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQltb2RlIHw9IExFX01PX1BST007CisJCWlmIChscC0+cGlvX2J1ZmZlcikKKwkJCXNidXNfd3JpdGV3KG1vZGUsICZpYl9pb21lbS0+bW9kZSk7CisJCWVsc2UKKwkJCWliX21lbS0+bW9kZSA9IG1vZGU7CisJfSBlbHNlIHsKKwkJbW9kZSAmPSB+TEVfTU9fUFJPTTsKKwkJaWYgKGxwLT5waW9fYnVmZmVyKQorCQkJc2J1c193cml0ZXcobW9kZSwgJmliX2lvbWVtLT5tb2RlKTsKKwkJZWxzZQorCQkJaWJfbWVtLT5tb2RlID0gbW9kZTsKKwkJbGFuY2VfbG9hZF9tdWx0aWNhc3QoZGV2KTsKKwl9CisJbG9hZF9jc3JzKGxwKTsKKwlpbml0X3Jlc3RhcnRfbGFuY2UobHApOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgbGFuY2Vfc2V0X211bHRpY2FzdF9yZXRyeSh1bnNpZ25lZCBsb25nIF9vcGFxdWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBfb3BhcXVlOworCisJbGFuY2Vfc2V0X211bHRpY2FzdChkZXYpOworfQorCitzdGF0aWMgdm9pZCBsYW5jZV9mcmVlX2h3cmVzb3VyY2VzKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCkKK3sKKwlpZiAobHAtPmxyZWdzKQorCQlzYnVzX2lvdW5tYXAobHAtPmxyZWdzLCBMQU5DRV9SRUdfU0laRSk7CisJaWYgKGxwLT5pbml0X2Jsb2NrX2lvbWVtKSB7CisJCXNidXNfaW91bm1hcChscC0+aW5pdF9ibG9ja19pb21lbSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrKSk7CisJfSBlbHNlIGlmIChscC0+aW5pdF9ibG9ja19tZW0pIHsKKwkJc2J1c19mcmVlX2NvbnNpc3RlbnQobHAtPnNkZXYsCisJCQkJICAgICBzaXplb2Yoc3RydWN0IGxhbmNlX2luaXRfYmxvY2spLAorCQkJCSAgICAgbHAtPmluaXRfYmxvY2tfbWVtLAorCQkJCSAgICAgbHAtPmluaXRfYmxvY2tfZHZtYSk7CisJfQorfQorCisvKiBFdGh0b29sIHN1cHBvcnQuLi4gKi8KK3N0YXRpYyB2b2lkIHNwYXJjX2xhbmNlX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsICJzdW5sYW5jZSIpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCAiMi4wMiIpOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJTQlVTOiVkIiwKKwkJbHAtPnNkZXYtPnNsb3QpOworfQorCitzdGF0aWMgdTMyIHNwYXJjX2xhbmNlX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogV2UgcmVhbGx5IGRvIG5vdCBrZWVwIHRyYWNrIG9mIHRoaXMsIGJ1dCB0aGlzCisJICogaXMgYmV0dGVyIHRoYW4gbm90IHJlcG9ydGluZyBhbnl0aGluZyBhdCBhbGwuCisJICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgc3BhcmNfbGFuY2VfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IHNwYXJjX2xhbmNlX2dldF9kcnZpbmZvLAorCS5nZXRfbGluawkJPSBzcGFyY19sYW5jZV9nZXRfbGluaywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNwYXJjX2xhbmNlX2luaXQoc3RydWN0IHNidXNfZGV2ICpzZGV2LAorCQkJCSAgIHN0cnVjdCBzYnVzX2RtYSAqbGVkbWEsCisJCQkJICAgc3RydWN0IHNidXNfZGV2ICpsZWJ1ZmZlcikKK3sKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwOworCWludCAgICBpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBsYW5jZV9wcml2YXRlKSArIDgpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwltZW1zZXQobHAsIDAsIHNpemVvZigqbHApKTsKKworCWlmIChzcGFyY19sYW5jZV9kZWJ1ZyAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsgKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisKKwkvKiBDb3B5IHRoZSBJRFBST00gZXRoZXJuZXQgYWRkcmVzcyB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgbGF0ZXIgd2UKKwkgKiB3aWxsIGNvcHkgdGhlIGFkZHJlc3MgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUgdG8gdGhlIGxhbmNlCisJICogaW5pdGlhbGl6YXRpb24gYmxvY2suCisJICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGlkcHJvbS0+aWRfZXRoYWRkcltpXTsKKworCS8qIEdldCB0aGUgSU8gcmVnaW9uICovCisJbHAtPmxyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVswXSwgMCwKKwkJCQkgTEFOQ0VfUkVHX1NJWkUsIGxhbmNlc3RyKTsKKwlpZiAoIWxwLT5scmVncykgeworCQlwcmludGsoS0VSTl9FUlIgIlN1bkxhbmNlOiBDYW5ub3QgbWFwIHJlZ2lzdGVycy5cbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJbHAtPnNkZXYgPSBzZGV2OworCWlmIChsZWJ1ZmZlcikgeworCQkvKiBzYW5pdHkgY2hlY2sgKi8KKwkJaWYgKGxlYnVmZmVyLT5yZXNvdXJjZVswXS5zdGFydCAmIDcpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU3VuTGFuY2U6IEVSUk9SOiBSeCBhbmQgVHggcmluZ3Mgbm90IG9uIGV2ZW4gYm91bmRhcnkuXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlscC0+aW5pdF9ibG9ja19pb21lbSA9CisJCQlzYnVzX2lvcmVtYXAoJmxlYnVmZmVyLT5yZXNvdXJjZVswXSwgMCwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayksICJsZWJ1ZmZlciIpOworCQlpZiAoIWxwLT5pbml0X2Jsb2NrX2lvbWVtKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlN1bkxhbmNlOiBDYW5ub3QgbWFwIFBJTyBidWZmZXIuXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlscC0+aW5pdF9ibG9ja19kdm1hID0gMDsKKwkJbHAtPnBpb19idWZmZXIgPSAxOworCQlscC0+aW5pdF9yaW5nID0gbGFuY2VfaW5pdF9yaW5nX3BpbzsKKwkJbHAtPnJ4ID0gbGFuY2VfcnhfcGlvOworCQlscC0+dHggPSBsYW5jZV90eF9waW87CisJfSBlbHNlIHsKKwkJbHAtPmluaXRfYmxvY2tfbWVtID0KKwkJCXNidXNfYWxsb2NfY29uc2lzdGVudChzZGV2LCBzaXplb2Yoc3RydWN0IGxhbmNlX2luaXRfYmxvY2spLAorCQkJCQkgICAgICAmbHAtPmluaXRfYmxvY2tfZHZtYSk7CisJCWlmICghbHAtPmluaXRfYmxvY2tfbWVtIHx8IGxwLT5pbml0X2Jsb2NrX2R2bWEgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJTdW5MYW5jZTogQ2Fubm90IGFsbG9jYXRlIGNvbnNpc3RlbnQgRE1BIG1lbW9yeS5cbiIpOworCQkJZ290byBmYWlsOworCQl9CisJCWxwLT5waW9fYnVmZmVyID0gMDsKKwkJbHAtPmluaXRfcmluZyA9IGxhbmNlX2luaXRfcmluZ19kdm1hOworCQlscC0+cnggPSBsYW5jZV9yeF9kdm1hOworCQlscC0+dHggPSBsYW5jZV90eF9kdm1hOworCX0KKwlscC0+YnVzbWFzdGVyX3JlZ3ZhbCA9IHByb21fZ2V0aW50ZGVmYXVsdChzZGV2LT5wcm9tX25vZGUsCisJCQkJCQkgICJidXNtYXN0ZXItcmVndmFsIiwKKwkJCQkJCSAgKExFX0MzX0JTV1AgfCBMRV9DM19BQ09OIHwKKwkJCQkJCSAgIExFX0MzX0JDT04pKTsKKworCWxwLT5uYW1lID0gbGFuY2VzdHI7CisJbHAtPmxlZG1hID0gbGVkbWE7CisKKwlscC0+YnVyc3Rfc2l6ZXMgPSAwOworCWlmIChscC0+bGVkbWEpIHsKKwkJY2hhciBwcm9wWzZdOworCQl1bnNpZ25lZCBpbnQgc2JtYXNrOworCQl1MzIgY3NyOworCisJCS8qIEZpbmQgYnVyc3Qtc2l6ZSBwcm9wZXJ0eSBmb3IgbGVkbWEgKi8KKwkJbHAtPmJ1cnN0X3NpemVzID0gcHJvbV9nZXRpbnRkZWZhdWx0KGxlZG1hLT5zZGV2LT5wcm9tX25vZGUsCisJCQkJCQkgICAgICJidXJzdC1zaXplcyIsIDApOworCisJCS8qIGxlZG1hIG1heSBiZSBjYXBhYmxlIG9mIGZhc3QgYnVyc3RzLCBidXQgc2J1cyBtYXkgbm90LiAqLworCQlzYm1hc2sgPSBwcm9tX2dldGludGRlZmF1bHQobGVkbWEtPnNkZXYtPmJ1cy0+cHJvbV9ub2RlLAorCQkJCQkgICAgImJ1cnN0LXNpemVzIiwgRE1BX0JVUlNUQklUUyk7CisJCWxwLT5idXJzdF9zaXplcyAmPSBzYm1hc2s7CisKKwkJLyogR2V0IHRoZSBjYWJsZS1zZWxlY3Rpb24gcHJvcGVydHkgKi8KKwkJbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisJCXByb21fZ2V0c3RyaW5nKGxlZG1hLT5zZGV2LT5wcm9tX25vZGUsICJjYWJsZS1zZWxlY3Rpb24iLAorCQkJICAgICAgIHByb3AsIHNpemVvZihwcm9wKSk7CisJCWlmIChwcm9wWzBdID09IDApIHsKKwkJCWludCB0b3BuZCwgbmQ7CisKKwkJCXByaW50ayhLRVJOX0lORk8gIlN1bkxhbmNlOiB1c2luZyBhdXRvLWNhcnJpZXItZGV0ZWN0aW9uLlxuIik7CisKKwkJCS8qIElzIHRoaXMgZm91bmQgYXQgL29wdGlvbnMgLmF0dHJpYnV0ZXMgaW4gYWxsCisJCQkgKiBQcm9tIHZlcnNpb25zPyBYWFgKKwkJCSAqLworCQkJdG9wbmQgPSBwcm9tX2dldGNoaWxkKHByb21fcm9vdF9ub2RlKTsKKworCQkJbmQgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKHRvcG5kLCAib3B0aW9ucyIpOworCQkJaWYgKCFuZCkKKwkJCQlnb3RvIG5vX2xpbmtfdGVzdDsKKworCQkJaWYgKCFwcm9tX25vZGVfaGFzX3Byb3BlcnR5KG5kLCAidHBlLWxpbmstdGVzdD8iKSkKKwkJCQlnb3RvIG5vX2xpbmtfdGVzdDsKKworCQkJbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisJCQlwcm9tX2dldHN0cmluZyhuZCwgInRwZS1saW5rLXRlc3Q/IiwgcHJvcCwKKwkJCQkgICAgICAgc2l6ZW9mKHByb3ApKTsKKworCQkJaWYgKHN0cmNtcChwcm9wLCAidHJ1ZSIpKSB7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJTdW5MYW5jZTogd2FybmluZzogb3ZlcnJpZGluZyBvcHRpb24gIgorCQkJCSAgICAgICAiJ3RwZS1saW5rLXRlc3Q/J1xuIik7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJTdW5MYW5jZTogd2FybmluZzogbWFpbCBhbnkgcHJvYmxlbXMgIgorCQkJCSAgICAgICAidG8gZWNkQHNreW5ldC5iZVxuIik7CisJCQkJYXV4aW9fc2V0X2x0ZShBVVhJT19MVEVfT04pOworCQkJfQorbm9fbGlua190ZXN0OgorCQkJbHAtPmF1dG9fc2VsZWN0ID0gMTsKKwkJCWxwLT50cGUgPSAwOworCQl9IGVsc2UgaWYgKCFzdHJjbXAocHJvcCwgImF1aSIpKSB7CisJCQlscC0+YXV0b19zZWxlY3QgPSAwOworCQkJbHAtPnRwZSA9IDA7CisJCX0gZWxzZSB7CisJCQlscC0+YXV0b19zZWxlY3QgPSAwOworCQkJbHAtPnRwZSA9IDE7CisJCX0KKworCQlscC0+ZHJlZ3MgPSBsZWRtYS0+cmVnczsKKworCQkvKiBSZXNldCBsZWRtYSAqLworCQljc3IgPSBzYnVzX3JlYWRsKGxwLT5kcmVncyArIERNQV9DU1IpOworCQlzYnVzX3dyaXRlbChjc3IgfCBETUFfUlNUX0VORVQsIGxwLT5kcmVncyArIERNQV9DU1IpOworCQl1ZGVsYXkoMjAwKTsKKwkJc2J1c193cml0ZWwoY3NyICYgfkRNQV9SU1RfRU5FVCwgbHAtPmRyZWdzICsgRE1BX0NTUik7CisJfSBlbHNlCisJCWxwLT5kcmVncyA9IE5VTEw7CisKKwlscC0+ZGV2ID0gZGV2OworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlkZXYtPm9wZW4gPSAmbGFuY2Vfb3BlbjsKKwlkZXYtPnN0b3AgPSAmbGFuY2VfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmbGFuY2Vfc3RhcnRfeG1pdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmbGFuY2VfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKKwlkZXYtPmdldF9zdGF0cyA9ICZsYW5jZV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmbGFuY2Vfc2V0X211bHRpY2FzdDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnNwYXJjX2xhbmNlX2V0aHRvb2xfb3BzOworCisJZGV2LT5pcnEgPSBzZGV2LT5pcnFzWzBdOworCisJZGV2LT5kbWEgPSAwOworCisJLyogV2UgY2Fubm90IHNsZWVwIGlmIHRoZSBjaGlwIGlzIGJ1c3kgZHVyaW5nIGEKKwkgKiBtdWx0aWNhc3QgbGlzdCB1cGRhdGUgZXZlbnQsIGJlY2F1c2Ugc3VjaCBldmVudHMKKwkgKiBjYW4gb2NjdXIgZnJvbSBpbnRlcnJ1cHRzIChleC4gSVB2NikuICBTbyB3ZQorCSAqIHVzZSBhIHRpbWVyIHRvIHRyeSBhZ2FpbiBsYXRlciB3aGVuIG5lY2Vzc2FyeS4gLURhdmVNCisJICovCisJaW5pdF90aW1lcigmbHAtPm11bHRpY2FzdF90aW1lcik7CisJbHAtPm11bHRpY2FzdF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwlscC0+bXVsdGljYXN0X3RpbWVyLmZ1bmN0aW9uID0gJmxhbmNlX3NldF9tdWx0aWNhc3RfcmV0cnk7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTdW5MYW5jZTogQ2Fubm90IHJlZ2lzdGVyIGRldmljZS5cbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJbHAtPm5leHRfbW9kdWxlID0gcm9vdF9sYW5jZV9kZXY7CisJcm9vdF9sYW5jZV9kZXYgPSBscDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBMQU5DRSAiLCBkZXYtPm5hbWUpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVjIiwgZGV2LT5kZXZfYWRkcltpXSwKKwkJICAgICAgIGkgPT0gNSA/ICcgJzogJzonKTsKKwlwcmludGsoIlxuIik7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlsYW5jZV9mcmVlX2h3cmVzb3VyY2VzKGxwKTsKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiAtRU5PREVWOworfQorCisvKiBPbiA0bSwgZmluZCB0aGUgYXNzb2NpYXRlZCBkbWEgZm9yIHRoZSBsYW5jZSBjaGlwICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzYnVzX2RtYSAqZmluZF9sZWRtYShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCit7CisJc3RydWN0IHNidXNfZG1hICpwOworCisJZm9yX2VhY2hfZHZtYShwKSB7CisJCWlmIChwLT5zZGV2ID09IHNkZXYpCisJCQlyZXR1cm4gcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKyNpZmRlZiBDT05GSUdfU1VONAorCisjaW5jbHVkZSA8YXNtL3N1bjRwYWRkci5oPgorI2luY2x1ZGUgPGFzbS9tYWNoaW5lcy5oPgorCisvKiBGaW5kIGFsbCB0aGUgbGFuY2UgY2FyZHMgb24gdGhlIHN5c3RlbSBhbmQgaW5pdGlhbGl6ZSB0aGVtICovCitzdGF0aWMgaW50IF9faW5pdCBzcGFyY19sYW5jZV9wcm9iZSh2b2lkKQoreworCXN0YXRpYyBzdHJ1Y3Qgc2J1c19kZXYgc2RldjsKKwlzdGF0aWMgaW50IGNhbGxlZDsKKworCXJvb3RfbGFuY2VfZGV2ID0gTlVMTDsKKworCWlmIChjYWxsZWQpCisJCXJldHVybiAtRU5PREVWOworCWNhbGxlZCsrOworCisJaWYgKChpZHByb20tPmlkX21hY2h0eXBlID09IChTTV9TVU40fFNNXzRfMzMwKSkgfHwKKwkgICAgKGlkcHJvbS0+aWRfbWFjaHR5cGUgPT0gKFNNX1NVTjR8U01fNF80NzApKSkgeworCQltZW1zZXQoJnNkZXYsIDAsIHNpemVvZihzZGV2KSk7CisJCXNkZXYucmVnX2FkZHJzWzBdLnBoeXNfYWRkciA9IHN1bjRfZXRoX3BoeXNhZGRyOworCQlzZGV2LmlycXNbMF0gPSA2OworCQlyZXR1cm4gc3BhcmNfbGFuY2VfaW5pdCgmc2RldiwgTlVMTCwgTlVMTCk7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCisjZWxzZSAvKiAhQ09ORklHX1NVTjQgKi8KKworLyogRmluZCBhbGwgdGhlIGxhbmNlIGNhcmRzIG9uIHRoZSBzeXN0ZW0gYW5kIGluaXRpYWxpemUgdGhlbSAqLworc3RhdGljIGludCBfX2luaXQgc3BhcmNfbGFuY2VfcHJvYmUodm9pZCkKK3sKKwlzdHJ1Y3Qgc2J1c19idXMgKmJ1czsKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBOVUxMOworCXN0cnVjdCBzYnVzX2RtYSAqbGVkbWEgPSBOVUxMOworCXN0YXRpYyBpbnQgY2FsbGVkOworCWludCBjYXJkcyA9IDAsIHY7CisKKwlyb290X2xhbmNlX2RldiA9IE5VTEw7CisKKwlpZiAoY2FsbGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljYWxsZWQrKzsKKworCWZvcl9lYWNoX3NidXMgKGJ1cykgeworCQlmb3JfZWFjaF9zYnVzZGV2IChzZGV2LCBidXMpIHsKKwkJCWlmIChzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAibGUiKSA9PSAwKSB7CisJCQkJY2FyZHMrKzsKKwkJCQlpZiAoKHYgPSBzcGFyY19sYW5jZV9pbml0KHNkZXYsIE5VTEwsIE5VTEwpKSkKKwkJCQkJcmV0dXJuIHY7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoc3RyY21wKHNkZXYtPnByb21fbmFtZSwgImxlZG1hIikgPT0gMCkgeworCQkJCWNhcmRzKys7CisJCQkJbGVkbWEgPSBmaW5kX2xlZG1hKHNkZXYpOworCQkJCWlmICgodiA9IHNwYXJjX2xhbmNlX2luaXQoc2Rldi0+Y2hpbGQsCisJCQkJCQkJICBsZWRtYSwgTlVMTCkpKQorCQkJCQlyZXR1cm4gdjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAibGVidWZmZXIiKSA9PSAwKXsKKwkJCQljYXJkcysrOworCQkJCWlmICgodiA9IHNwYXJjX2xhbmNlX2luaXQoc2Rldi0+Y2hpbGQsCisJCQkJCQkJICBOVUxMLCBzZGV2KSkpCisJCQkJCXJldHVybiB2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IC8qIGZvciBlYWNoIHNidXNkZXYgKi8KKwl9IC8qIGZvciBlYWNoIHNidXMgKi8KKwlpZiAoIWNhcmRzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiAhQ09ORklHX1NVTjQgKi8KKworc3RhdGljIHZvaWQgX19leGl0IHNwYXJjX2xhbmNlX2NsZWFudXAodm9pZCkKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHA7CisKKwl3aGlsZSAocm9vdF9sYW5jZV9kZXYpIHsKKwkJbHAgPSByb290X2xhbmNlX2Rldi0+bmV4dF9tb2R1bGU7CisKKwkJdW5yZWdpc3Rlcl9uZXRkZXYocm9vdF9sYW5jZV9kZXYtPmRldik7CisJCWxhbmNlX2ZyZWVfaHdyZXNvdXJjZXMocm9vdF9sYW5jZV9kZXYpOworCQlmcmVlX25ldGRldihyb290X2xhbmNlX2Rldi0+ZGV2KTsKKwkJcm9vdF9sYW5jZV9kZXYgPSBscDsKKwl9Cit9CisKK21vZHVsZV9pbml0KHNwYXJjX2xhbmNlX3Byb2JlKTsKK21vZHVsZV9leGl0KHNwYXJjX2xhbmNlX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VucWUuYyBiL2RyaXZlcnMvbmV0L3N1bnFlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlZjFiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bnFlLmMKQEAgLTAsMCArMSwxMDQzIEBACisvKiAkSWQ6IHN1bnFlLmMsdiAxLjU1IDIwMDIvMDEvMTUgMDY6NDg6NTUgZGF2ZW0gRXhwICQKKyAqIHN1bnFlLmM6IFNwYXJjIFF1YWRFdGhlcm5ldCAxMGJhc2VUIFNCVVMgY2FyZCBkcml2ZXIuCisgKiAgICAgICAgICBPbmNlIGFnYWluIEkgYW0gb3V0IHRvIHByb3ZlIHRoYXQgZXZlcnkgZXRoZXJuZXQKKyAqICAgICAgICAgIGNvbnRyb2xsZXIgb3V0IHRoZXJlIGNhbiBiZSBtb3N0IGVmZmljaWVudGx5IHByb2dyYW1tZWQKKyAqICAgICAgICAgIGlmIHlvdSBtYWtlIGl0IGxvb2sgbGlrZSBhIExBTkNFLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSwgMjAwMyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKi8KKworc3RhdGljIGNoYXIgdmVyc2lvbltdID0KKyAgICAgICAgInN1bnFlLmM6djMuMCA4LzI0LzAzIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSlcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9zYnVzLmg+CisjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlICJzdW5xZS5oIgorCitzdGF0aWMgc3RydWN0IHN1bnFlYyAqcm9vdF9xZWNfZGV2OworCitzdGF0aWMgdm9pZCBxZV9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjZGVmaW5lIFFFQ19SRVNFVF9UUklFUyAyMDAKKworc3RhdGljIGlubGluZSBpbnQgcWVjX2dsb2JhbF9yZXNldCh2b2lkIF9faW9tZW0gKmdyZWdzKQoreworCWludCB0cmllcyA9IFFFQ19SRVNFVF9UUklFUzsKKworCXNidXNfd3JpdGVsKEdMT0JfQ1RSTF9SRVNFVCwgZ3JlZ3MgKyBHTE9CX0NUUkwpOworCXdoaWxlICgtLXRyaWVzKSB7CisJCXUzMiB0bXAgPSBzYnVzX3JlYWRsKGdyZWdzICsgR0xPQl9DVFJMKTsKKwkJaWYgKHRtcCAmIEdMT0JfQ1RSTF9SRVNFVCkgeworCQkJdWRlbGF5KDIwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKwlpZiAodHJpZXMpCisJCXJldHVybiAwOworCXByaW50ayhLRVJOX0VSUiAiUXVhZEV0aGVyOiBBSUVFRSBjYW5ub3QgcmVzZXQgdGhlIFFFQyFcbiIpOworCXJldHVybiAtMTsKK30KKworI2RlZmluZSBNQUNFX1JFU0VUX1JFVFJJRVMgMjAwCisjZGVmaW5lIFFFX1JFU0VUX1JFVFJJRVMgICAyMDAKKworc3RhdGljIGlubGluZSBpbnQgcWVfc3RvcChzdHJ1Y3Qgc3VucWUgKnFlcCkKK3sKKwl2b2lkIF9faW9tZW0gKmNyZWdzID0gcWVwLT5xY3JlZ3M7CisJdm9pZCBfX2lvbWVtICptcmVncyA9IHFlcC0+bXJlZ3M7CisJaW50IHRyaWVzOworCisJLyogUmVzZXQgdGhlIE1BQ0UsIHRoZW4gdGhlIFFFQyBjaGFubmVsLiAqLworCXNidXNfd3JpdGViKE1SRUdTX0JDT05GSUdfUkVTRVQsIG1yZWdzICsgTVJFR1NfQkNPTkZJRyk7CisJdHJpZXMgPSBNQUNFX1JFU0VUX1JFVFJJRVM7CisJd2hpbGUgKC0tdHJpZXMpIHsKKwkJdTggdG1wID0gc2J1c19yZWFkYihtcmVncyArIE1SRUdTX0JDT05GSUcpOworCQlpZiAodG1wICYgTVJFR1NfQkNPTkZJR19SRVNFVCkgeworCQkJdWRlbGF5KDIwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKwlpZiAoIXRyaWVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUXVhZEV0aGVyOiBBSUVFRSBjYW5ub3QgcmVzZXQgdGhlIE1BQ0UhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNidXNfd3JpdGVsKENSRUdfQ1RSTF9SRVNFVCwgY3JlZ3MgKyBDUkVHX0NUUkwpOworCXRyaWVzID0gUUVfUkVTRVRfUkVUUklFUzsKKwl3aGlsZSAoLS10cmllcykgeworCQl1MzIgdG1wID0gc2J1c19yZWFkbChjcmVncyArIENSRUdfQ1RSTCk7CisJCWlmICh0bXAgJiBDUkVHX0NUUkxfUkVTRVQpIHsKKwkJCXVkZWxheSgyMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlicmVhazsKKwl9CisJaWYgKCF0cmllcykgeworCQlwcmludGsoS0VSTl9FUlIgIlF1YWRFdGhlcjogQ2Fubm90IHJlc2V0IFFFIGNoYW5uZWwhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWVfaW5pdF9yaW5ncyhzdHJ1Y3Qgc3VucWUgKnFlcCkKK3sKKwlzdHJ1Y3QgcWVfaW5pdF9ibG9jayAqcWIgPSBxZXAtPnFlX2Jsb2NrOworCXN0cnVjdCBzdW5xZV9idWZmZXJzICpxYnVmcyA9IHFlcC0+YnVmZmVyczsKKwlfX3UzMiBxYnVmc19kdm1hID0gcWVwLT5idWZmZXJzX2R2bWE7CisJaW50IGk7CisKKwlxZXAtPnJ4X25ldyA9IHFlcC0+cnhfb2xkID0gcWVwLT50eF9uZXcgPSBxZXAtPnR4X29sZCA9IDA7CisJbWVtc2V0KHFiLCAwLCBzaXplb2Yoc3RydWN0IHFlX2luaXRfYmxvY2spKTsKKwltZW1zZXQocWJ1ZnMsIDAsIHNpemVvZihzdHJ1Y3Qgc3VucWVfYnVmZmVycykpOworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlxYi0+cWVfcnhkW2ldLnJ4X2FkZHIgPSBxYnVmc19kdm1hICsgcWVidWZfb2Zmc2V0KHJ4X2J1ZiwgaSk7CisJCXFiLT5xZV9yeGRbaV0ucnhfZmxhZ3MgPQorCQkJKFJYRF9PV04gfCAoKFJYRF9QS1RfU1opICYgUlhEX0xFTkdUSCkpOworCX0KK30KKworc3RhdGljIGludCBxZV9pbml0KHN0cnVjdCBzdW5xZSAqcWVwLCBpbnQgZnJvbV9pcnEpCit7CisJc3RydWN0IHN1bnFlYyAqcWVjcCA9IHFlcC0+cGFyZW50OworCXZvaWQgX19pb21lbSAqY3JlZ3MgPSBxZXAtPnFjcmVnczsKKwl2b2lkIF9faW9tZW0gKm1yZWdzID0gcWVwLT5tcmVnczsKKwl2b2lkIF9faW9tZW0gKmdyZWdzID0gcWVjcC0+Z3JlZ3M7CisJdW5zaWduZWQgY2hhciAqZSA9ICZxZXAtPmRldi0+ZGV2X2FkZHJbMF07CisJdTMyIHRtcDsKKwlpbnQgaTsKKworCS8qIFNodXQgaXQgdXAuICovCisJaWYgKHFlX3N0b3AocWVwKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBTZXR1cCBpbml0aWFsIHJ4L3R4IGluaXQgYmxvY2sgcG9pbnRlcnMuICovCisJc2J1c193cml0ZWwocWVwLT5xYmxvY2tfZHZtYSArIHFpYl9vZmZzZXQocWVfcnhkLCAwKSwgY3JlZ3MgKyBDUkVHX1JYRFMpOworCXNidXNfd3JpdGVsKHFlcC0+cWJsb2NrX2R2bWEgKyBxaWJfb2Zmc2V0KHFlX3R4ZCwgMCksIGNyZWdzICsgQ1JFR19UWERTKTsKKworCS8qIEVuYWJsZS9tYXNrIHRoZSB2YXJpb3VzIGlycSdzLiAqLworCXNidXNfd3JpdGVsKDAsIGNyZWdzICsgQ1JFR19SSU1BU0spOworCXNidXNfd3JpdGVsKDEsIGNyZWdzICsgQ1JFR19USU1BU0spOworCisJc2J1c193cml0ZWwoMCwgY3JlZ3MgKyBDUkVHX1FNQVNLKTsKKwlzYnVzX3dyaXRlbChDUkVHX01NQVNLX1JYQ09MTCwgY3JlZ3MgKyBDUkVHX01NQVNLKTsKKworCS8qIFNldHVwIHRoZSBGSUZPIHBvaW50ZXJzIGludG8gUUVDIGxvY2FsIG1lbW9yeS4gKi8KKwl0bXAgPSBxZXAtPmNoYW5uZWwgKiBzYnVzX3JlYWRsKGdyZWdzICsgR0xPQl9NU0laRSk7CisJc2J1c193cml0ZWwodG1wLCBjcmVncyArIENSRUdfUlhSQlVGUFRSKTsKKwlzYnVzX3dyaXRlbCh0bXAsIGNyZWdzICsgQ1JFR19SWFdCVUZQVFIpOworCisJdG1wID0gc2J1c19yZWFkbChjcmVncyArIENSRUdfUlhSQlVGUFRSKSArCisJCXNidXNfcmVhZGwoZ3JlZ3MgKyBHTE9CX1JTSVpFKTsKKwlzYnVzX3dyaXRlbCh0bXAsIGNyZWdzICsgQ1JFR19UWFJCVUZQVFIpOworCXNidXNfd3JpdGVsKHRtcCwgY3JlZ3MgKyBDUkVHX1RYV0JVRlBUUik7CisKKwkvKiBDbGVhciB0aGUgY2hhbm5lbCBjb2xsaXNpb24gY291bnRlci4gKi8KKwlzYnVzX3dyaXRlbCgwLCBjcmVncyArIENSRUdfQ0NOVCk7CisKKwkvKiBGb3IgMTBiYXNlVCwgaW50ZXIgZnJhbWUgc3BhY2Ugbm9yIHRocm90dGxlIHNlZW1zIHRvIGJlIG5lY2Vzc2FyeS4gKi8KKwlzYnVzX3dyaXRlbCgwLCBjcmVncyArIENSRUdfUElQRyk7CisKKwkvKiBOb3cgZG9yayB3aXRoIHRoZSBBTUQgTUFDRS4gKi8KKwlzYnVzX3dyaXRlYihNUkVHU19QSFlDT05GSUdfQVVUTywgbXJlZ3MgKyBNUkVHU19QSFlDT05GSUcpOworCXNidXNfd3JpdGViKE1SRUdTX1RYRkNOVExfQVVUT1BBRCwgbXJlZ3MgKyBNUkVHU19UWEZDTlRMKTsKKwlzYnVzX3dyaXRlYigwLCBtcmVncyArIE1SRUdTX1JYRkNOVEwpOworCisJLyogVGhlIFFFQyBkbWEncyB0aGUgcngnZCBwYWNrZXRzIGZyb20gbG9jYWwgbWVtb3J5IG91dCB0byBtYWluIG1lbW9yeSwKKwkgKiBhbmQgdGhlcmVmb3JlIGl0IGludGVycnVwdHMgd2hlbiB0aGUgcGFja2V0IHJlY2VwdGlvbiBpcyAiY29tcGxldGUiLgorCSAqIFNvIGRvbid0IGxpc3RlbiBmb3IgdGhlIE1BQ0UgdGFsa2luZyBhYm91dCBpdC4KKwkgKi8KKwlzYnVzX3dyaXRlYihNUkVHU19JTUFTS19DT0xMIHwgTVJFR1NfSU1BU0tfUlhJUlEsIG1yZWdzICsgTVJFR1NfSU1BU0spOworCXNidXNfd3JpdGViKE1SRUdTX0JDT05GSUdfQlNXQVAgfCBNUkVHU19CQ09ORklHXzY0VFMsIG1yZWdzICsgTVJFR1NfQkNPTkZJRyk7CisJc2J1c193cml0ZWIoKE1SRUdTX0ZDT05GSUdfVFhGMTYgfCBNUkVHU19GQ09ORklHX1JYRjMyIHwKKwkJICAgICBNUkVHU19GQ09ORklHX1JGV1UgfCBNUkVHU19GQ09ORklHX1RGV1UpLAorCQkgICAgbXJlZ3MgKyBNUkVHU19GQ09ORklHKTsKKworCS8qIE9ubHkgdXNhYmxlIGludGVyZmFjZSBvbiBRdWFkRXRoZXIgaXMgdHdpc3RlZCBwYWlyLiAqLworCXNidXNfd3JpdGViKE1SRUdTX1BMU0NPTkZJR19UUCwgbXJlZ3MgKyBNUkVHU19QTFNDT05GSUcpOworCisJLyogVGVsbCBNQUNFIHdlIGFyZSBjaGFuZ2luZyB0aGUgZXRoZXIgYWRkcmVzcy4gKi8KKwlzYnVzX3dyaXRlYihNUkVHU19JQUNPTkZJR19BQ0hOR0UgfCBNUkVHU19JQUNPTkZJR19QQVJFU0VULAorCQkgICAgbXJlZ3MgKyBNUkVHU19JQUNPTkZJRyk7CisJd2hpbGUgKChzYnVzX3JlYWRiKG1yZWdzICsgTVJFR1NfSUFDT05GSUcpICYgTVJFR1NfSUFDT05GSUdfQUNITkdFKSAhPSAwKQorCQliYXJyaWVyKCk7CisJc2J1c193cml0ZWIoZVswXSwgbXJlZ3MgKyBNUkVHU19FVEhBRERSKTsKKwlzYnVzX3dyaXRlYihlWzFdLCBtcmVncyArIE1SRUdTX0VUSEFERFIpOworCXNidXNfd3JpdGViKGVbMl0sIG1yZWdzICsgTVJFR1NfRVRIQUREUik7CisJc2J1c193cml0ZWIoZVszXSwgbXJlZ3MgKyBNUkVHU19FVEhBRERSKTsKKwlzYnVzX3dyaXRlYihlWzRdLCBtcmVncyArIE1SRUdTX0VUSEFERFIpOworCXNidXNfd3JpdGViKGVbNV0sIG1yZWdzICsgTVJFR1NfRVRIQUREUik7CisKKwkvKiBDbGVhciBvdXQgdGhlIGFkZHJlc3MgZmlsdGVyLiAqLworCXNidXNfd3JpdGViKE1SRUdTX0lBQ09ORklHX0FDSE5HRSB8IE1SRUdTX0lBQ09ORklHX0xBUkVTRVQsCisJCSAgICBtcmVncyArIE1SRUdTX0lBQ09ORklHKTsKKwl3aGlsZSAoKHNidXNfcmVhZGIobXJlZ3MgKyBNUkVHU19JQUNPTkZJRykgJiBNUkVHU19JQUNPTkZJR19BQ0hOR0UpICE9IDApCisJCWJhcnJpZXIoKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlzYnVzX3dyaXRlYigwLCBtcmVncyArIE1SRUdTX0ZJTFRFUik7CisKKwkvKiBBZGRyZXNzIGNoYW5nZXMgYXJlIG5vdyBjb21wbGV0ZS4gKi8KKwlzYnVzX3dyaXRlYigwLCBtcmVncyArIE1SRUdTX0lBQ09ORklHKTsKKworCXFlX2luaXRfcmluZ3MocWVwKTsKKworCS8qIFdhaXQgYSBsaXR0bGUgYml0IGZvciB0aGUgbGluayB0byBjb21lIHVwLi4uICovCisJbWRlbGF5KDUpOworCWlmICghKHNidXNfcmVhZGIobXJlZ3MgKyBNUkVHU19QSFlDT05GSUcpICYgTVJFR1NfUEhZQ09ORklHX0xURVNURElTKSkgeworCQlpbnQgdHJpZXMgPSA1MDsKKworCQl3aGlsZSAodHJpZXMtLSkgeworCQkJdTggdG1wOworCisJCQltZGVsYXkoNSk7CisJCQliYXJyaWVyKCk7CisJCQl0bXAgPSBzYnVzX3JlYWRiKG1yZWdzICsgTVJFR1NfUEhZQ09ORklHKTsKKwkJCWlmICgodG1wICYgTVJFR1NfUEhZQ09ORklHX0xTVEFUKSAhPSAwKQorCQkJCWJyZWFrOworCQl9CisJCWlmICh0cmllcyA9PSAwKQorCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogV2FybmluZywgbGluayBzdGF0ZSBpcyBkb3duLlxuIiwgcWVwLT5kZXYtPm5hbWUpOworCX0KKworCS8qIE1pc3NlZCBwYWNrZXQgY291bnRlciBpcyBjbGVhcmVkIG9uIGEgcmVhZC4gKi8KKwlzYnVzX3JlYWRiKG1yZWdzICsgTVJFR1NfTVBDTlQpOworCisJLyogUmVsb2FkIG11bHRpY2FzdCBpbmZvcm1hdGlvbiwgdGhpcyB3aWxsIGVuYWJsZSB0aGUgcmVjZWl2ZXIKKwkgKiBhbmQgdHJhbnNtaXR0ZXIuCisJICovCisJcWVfc2V0X211bHRpY2FzdChxZXAtPmRldik7CisKKwkvKiBRRUMgc2hvdWxkIG5vdyBzdGFydCB0byBzaG93IGludGVycnVwdHMuICovCisJcmV0dXJuIDA7Cit9CisKKy8qIEdycnIsIGNlcnRhaW4gZXJyb3IgY29uZGl0aW9ucyBjb21wbGV0ZWx5IGxvY2sgdXAgdGhlIEFNRCBNQUNFLAorICogc28gd2hlbiB3ZSBnZXQgdGhlc2Ugd2UgX211c3RfIHJlc2V0IHRoZSBjaGlwLgorICovCitzdGF0aWMgaW50IHFlX2lzX2JvbGl4ZWQoc3RydWN0IHN1bnFlICpxZXAsIHUzMiBxZV9zdGF0dXMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHFlcC0+ZGV2OworCWludCBtYWNlX2h3YnVnX3dvcmthcm91bmQgPSAwOworCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9FREVGRVIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXhjZXNzaXZlIHRyYW5zbWl0IGRlZmVycy5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Vycm9ycysrOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfQ0xPU1MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FycmllciBsb3N0LCBsaW5rIGRvd24/XG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwkJcWVwLT5uZXRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX0VSRVRSSUVTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEV4Y2Vzc2l2ZSB0cmFuc21pdCByZXRyaWVzIChtb3JlIHRoYW4gMTYpLlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CisJCW1hY2VfaHdidWdfd29ya2Fyb3VuZCA9IDE7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9MQ09MTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBMYXRlIHRyYW5zbWl0IGNvbGxpc2lvbi5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Vycm9ycysrOworCQlxZXAtPm5ldF9zdGF0cy5jb2xsaXNpb25zKys7CisJCW1hY2VfaHdidWdfd29ya2Fyb3VuZCA9IDE7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9GVUZMT1cpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVHJhbnNtaXQgZmlmbyB1bmRlcmZsb3csIGRyaXZlciBidWcuXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwkJbWFjZV9od2J1Z193b3JrYXJvdW5kID0gMTsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX0pFUlJPUikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBKYWJiZXIgZXJyb3IuXG4iLCBkZXYtPm5hbWUpOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfQkVSUk9SKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEJhYmJsZSBlcnJvci5cbiIsIGRldi0+bmFtZSk7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9DQ09GTE9XKSB7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Vycm9ycyArPSAyNTY7CisJCXFlcC0+bmV0X3N0YXRzLmNvbGxpc2lvbnMgKz0gMjU2OworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfVFhERVJST1IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVHJhbnNtaXQgZGVzY3JpcHRvciBpcyBib2d1cywgZHJpdmVyIGJ1Zy5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Vycm9ycysrOworCQlxZXAtPm5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQltYWNlX2h3YnVnX3dvcmthcm91bmQgPSAxOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfVFhMRVJSKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRyYW5zbWl0IGxhdGUgZXJyb3IuXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwkJbWFjZV9od2J1Z193b3JrYXJvdW5kID0gMTsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1RYUEVSUikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUcmFuc21pdCBETUEgcGFyaXR5IGVycm9yLlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCW1hY2VfaHdidWdfd29ya2Fyb3VuZCA9IDE7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9UWFNFUlIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVHJhbnNtaXQgRE1BIHNidXMgZXJyb3IgYWNrLlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCW1hY2VfaHdidWdfd29ya2Fyb3VuZCA9IDE7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9SQ0NPRkxPVykgeworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMgKz0gMjU2OworCQlxZXAtPm5ldF9zdGF0cy5jb2xsaXNpb25zICs9IDI1NjsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1JVT0ZMT1cpIHsKKwkJcWVwLT5uZXRfc3RhdHMucnhfZXJyb3JzICs9IDI1NjsKKwkJcWVwLT5uZXRfc3RhdHMucnhfb3Zlcl9lcnJvcnMgKz0gMjU2OworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfTUNPRkxPVykgeworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMgKz0gMjU2OworCQlxZXAtPm5ldF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IDI1NjsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1JYRk9GTE9XKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlY2VpdmUgZmlmbyBvdmVyZmxvdy5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCQlxZXAtPm5ldF9zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfUkxDT0xMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IExhdGUgcmVjZWl2ZSBjb2xsaXNpb24uXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJcWVwLT5uZXRfc3RhdHMuY29sbGlzaW9ucysrOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfRkNPRkxPVykgeworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMgKz0gMjU2OworCQlxZXAtPm5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gMjU2OworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfQ0VDT0ZMT1cpIHsKKwkJcWVwLT5uZXRfc3RhdHMucnhfZXJyb3JzICs9IDI1NjsKKwkJcWVwLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycyArPSAyNTY7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9SWERST1ApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVjZWl2ZSBwYWNrZXQgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCQlxZXAtPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1JYU01BTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVjZWl2ZSBidWZmZXIgdG9vIHNtYWxsLCBkcml2ZXIgYnVnLlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1JYTEVSUikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZWNlaXZlIGxhdGUgZXJyb3IuXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJbWFjZV9od2J1Z193b3JrYXJvdW5kID0gMTsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1JYUEVSUikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZWNlaXZlIERNQSBwYXJpdHkgZXJyb3IuXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJcWVwLT5uZXRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworCQltYWNlX2h3YnVnX3dvcmthcm91bmQgPSAxOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfUlhTRVJSKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlY2VpdmUgRE1BIHNidXMgZXJyb3IgYWNrLlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJbWFjZV9od2J1Z193b3JrYXJvdW5kID0gMTsKKwl9CisKKwlpZiAobWFjZV9od2J1Z193b3JrYXJvdW5kKQorCQlxZV9pbml0KHFlcCwgMSk7CisJcmV0dXJuIG1hY2VfaHdidWdfd29ya2Fyb3VuZDsKK30KKworLyogUGVyLVFFIHJlY2VpdmUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4gIEp1c3QgbGlrZSBvbiB0aGUgaGFwcHkgbWVhbAorICogd2UgcmVjZWl2ZSBkaXJlY3RseSBpbnRvIHNrYidzIHdpdGggYSBzbWFsbCBwYWNrZXQgY29weSB3YXRlciBtYXJrLgorICovCitzdGF0aWMgdm9pZCBxZV9yeChzdHJ1Y3Qgc3VucWUgKnFlcCkKK3sKKwlzdHJ1Y3QgcWVfcnhkICpyeGJhc2UgPSAmcWVwLT5xZV9ibG9jay0+cWVfcnhkWzBdOworCXN0cnVjdCBxZV9yeGQgKnRoaXM7CisJc3RydWN0IHN1bnFlX2J1ZmZlcnMgKnFidWZzID0gcWVwLT5idWZmZXJzOworCV9fdTMyIHFidWZzX2R2bWEgPSBxZXAtPmJ1ZmZlcnNfZHZtYTsKKwlpbnQgZWxlbSA9IHFlcC0+cnhfbmV3LCBkcm9wcyA9IDA7CisJdTMyIGZsYWdzOworCisJdGhpcyA9ICZyeGJhc2VbZWxlbV07CisJd2hpbGUgKCEoKGZsYWdzID0gdGhpcy0+cnhfZmxhZ3MpICYgUlhEX09XTikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdW5zaWduZWQgY2hhciAqdGhpc19xYnVmID0KKwkJCSZxYnVmcy0+cnhfYnVmW2VsZW0gJiAoUlhfUklOR19TSVpFIC0gMSldWzBdOworCQlfX3UzMiB0aGlzX3FidWZfZHZtYSA9IHFidWZzX2R2bWEgKworCQkJcWVidWZfb2Zmc2V0KHJ4X2J1ZiwgKGVsZW0gJiAoUlhfUklOR19TSVpFIC0gMSkpKTsKKwkJc3RydWN0IHFlX3J4ZCAqZW5kX3J4ZCA9CisJCQkmcnhiYXNlWyhlbGVtK1JYX1JJTkdfU0laRSkmKFJYX1JJTkdfTUFYU0laRS0xKV07CisJCWludCBsZW4gPSAoZmxhZ3MgJiBSWERfTEVOR1RIKSAtIDQ7ICAvKiBRRSBhZGRzIGV0aGVyIEZDUyBzaXplIHRvIGxlbiAqLworCisJCS8qIENoZWNrIGZvciBlcnJvcnMuICovCisJCWlmIChsZW4gPCBFVEhfWkxFTikgeworCQkJcWVwLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7CisJCQlxZXAtPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlxZXAtPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCX0gZWxzZSB7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJZHJvcHMrKzsKKwkJCQlxZXAtPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCQl9IGVsc2UgeworCQkJCXNrYi0+ZGV2ID0gcWVwLT5kZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJCQlza2JfcHV0KHNrYiwgbGVuKTsKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgKHVuc2lnbmVkIGNoYXIgKikgdGhpc19xYnVmLAorCQkJCQkJIGxlbiwgMCk7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcWVwLT5kZXYpOworCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJcWVwLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCXFlcC0+bmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlxZXAtPm5ldF9zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQl9CisJCX0KKwkJZW5kX3J4ZC0+cnhfYWRkciA9IHRoaXNfcWJ1Zl9kdm1hOworCQllbmRfcnhkLT5yeF9mbGFncyA9IChSWERfT1dOIHwgKChSWERfUEtUX1NaKSAmIFJYRF9MRU5HVEgpKTsKKwkJCisJCWVsZW0gPSBORVhUX1JYKGVsZW0pOworCQl0aGlzID0gJnJ4YmFzZVtlbGVtXTsKKwl9CisJcWVwLT5yeF9uZXcgPSBlbGVtOworCWlmIChkcm9wcykKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLCBxZXAtPmRldi0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHFlX3R4X3JlY2xhaW0oc3RydWN0IHN1bnFlICpxZXApOworCisvKiBJbnRlcnJ1cHRzIGZvciBhbGwgUUUncyBnZXQgZmlsdGVyZWQgb3V0IHZpYSB0aGUgUUVDIG1hc3RlciBjb250cm9sbGVyLAorICogc28gd2UganVzdCBydW4gdGhyb3VnaCBlYWNoIHFlIGFuZCBjaGVjayB0byBzZWUgd2hvIGlzIHNpZ25hbGluZworICogYW5kIHRodXMgbmVlZHMgdG8gYmUgc2VydmljZWQuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBxZWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHN1bnFlYyAqcWVjcCA9IChzdHJ1Y3Qgc3VucWVjICopIGRldl9pZDsKKwl1MzIgcWVjX3N0YXR1czsKKwlpbnQgY2hhbm5lbCA9IDA7CisKKwkvKiBMYXRjaCB0aGUgc3RhdHVzIG5vdy4gKi8KKwlxZWNfc3RhdHVzID0gc2J1c19yZWFkbChxZWNwLT5ncmVncyArIEdMT0JfU1RBVCk7CisJd2hpbGUgKGNoYW5uZWwgPCA0KSB7CisJCWlmIChxZWNfc3RhdHVzICYgMHhmKSB7CisJCQlzdHJ1Y3Qgc3VucWUgKnFlcCA9IHFlY3AtPnFlc1tjaGFubmVsXTsKKwkJCXUzMiBxZV9zdGF0dXM7CisKKwkJCXFlX3N0YXR1cyA9IHNidXNfcmVhZGwocWVwLT5xY3JlZ3MgKyBDUkVHX1NUQVQpOworCQkJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9FUlJPUlMpIHsKKwkJCQlpZiAocWVfaXNfYm9saXhlZChxZXAsIHFlX3N0YXR1cykpCisJCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfUlhJUlEpCisJCQkJcWVfcngocWVwKTsKKwkJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHFlcC0+ZGV2KSAmJgorCQkJICAgIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfVFhJUlEpKSB7CisJCQkJc3Bpbl9sb2NrKCZxZXAtPmxvY2spOworCQkJCXFlX3R4X3JlY2xhaW0ocWVwKTsKKwkJCQlpZiAoVFhfQlVGRlNfQVZBSUwocWVwKSA+IDApIHsKKwkJCQkJLyogV2FrZSBuZXQgcXVldWUgYW5kIHJldHVybiB0bworCQkJCQkgKiBsYXp5IHR4IHJlY2xhaW0uCisJCQkJCSAqLworCQkJCQluZXRpZl93YWtlX3F1ZXVlKHFlcC0+ZGV2KTsKKwkJCQkJc2J1c193cml0ZWwoMSwgcWVwLT5xY3JlZ3MgKyBDUkVHX1RJTUFTSyk7CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrKCZxZXAtPmxvY2spOworCQkJfQorCW5leHQ6CisJCQk7CisJCX0KKwkJcWVjX3N0YXR1cyA+Pj0gNDsKKwkJY2hhbm5lbCsrOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBxZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN1bnFlICpxZXAgPSAoc3RydWN0IHN1bnFlICopIGRldi0+cHJpdjsKKworCXFlcC0+bWNvbmZpZyA9IChNUkVHU19NQ09ORklHX1RYRU5BQiB8CisJCQlNUkVHU19NQ09ORklHX1JYRU5BQiB8CisJCQlNUkVHU19NQ09ORklHX01CQUVOQUIpOworCXJldHVybiBxZV9pbml0KHFlcCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgcWVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3VucWUgKnFlcCA9IChzdHJ1Y3Qgc3VucWUgKikgZGV2LT5wcml2OworCisJcWVfc3RvcChxZXApOworCXJldHVybiAwOworfQorCisvKiBSZWNsYWltIFRYJ2QgZnJhbWVzIGZyb20gdGhlIHJpbmcuICBUaGlzIG11c3QgYWx3YXlzIHJ1biB1bmRlcgorICogdGhlIElSUSBwcm90ZWN0ZWQgcWVwLT5sb2NrLgorICovCitzdGF0aWMgdm9pZCBxZV90eF9yZWNsYWltKHN0cnVjdCBzdW5xZSAqcWVwKQoreworCXN0cnVjdCBxZV90eGQgKnR4YmFzZSA9ICZxZXAtPnFlX2Jsb2NrLT5xZV90eGRbMF07CisJaW50IGVsZW0gPSBxZXAtPnR4X29sZDsKKworCXdoaWxlIChlbGVtICE9IHFlcC0+dHhfbmV3KSB7CisJCXUzMiBmbGFncyA9IHR4YmFzZVtlbGVtXS50eF9mbGFnczsKKworCQlpZiAoZmxhZ3MgJiBUWERfT1dOKQorCQkJYnJlYWs7CisJCWVsZW0gPSBORVhUX1RYKGVsZW0pOworCX0KKwlxZXAtPnR4X29sZCA9IGVsZW07Cit9CisKK3N0YXRpYyB2b2lkIHFlX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3VucWUgKnFlcCA9IChzdHJ1Y3Qgc3VucWUgKikgZGV2LT5wcml2OworCWludCB0eF9mdWxsOworCisJc3Bpbl9sb2NrX2lycSgmcWVwLT5sb2NrKTsKKworCS8qIFRyeSB0byByZWNsYWltLCBpZiB0aGF0IGZyZWVzIHVwIHNvbWUgdHgKKwkgKiBlbnRyaWVzLCB3ZSdyZSBmaW5lLgorCSAqLworCXFlX3R4X3JlY2xhaW0ocWVwKTsKKwl0eF9mdWxsID0gVFhfQlVGRlNfQVZBSUwocWVwKSA8PSAwOworCisJc3Bpbl91bmxvY2tfaXJxKCZxZXAtPmxvY2spOworCisJaWYgKCEgdHhfZnVsbCkKKwkJZ290byBvdXQ7CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHJlc2V0dGluZ1xuIiwgZGV2LT5uYW1lKTsKKwlxZV9pbml0KHFlcCwgMSk7CisKK291dDoKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qIEdldCBhIHBhY2tldCBxdWV1ZWQgdG8gZ28gb250byB0aGUgd2lyZS4gKi8KK3N0YXRpYyBpbnQgcWVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdW5xZSAqcWVwID0gKHN0cnVjdCBzdW5xZSAqKSBkZXYtPnByaXY7CisJc3RydWN0IHN1bnFlX2J1ZmZlcnMgKnFidWZzID0gcWVwLT5idWZmZXJzOworCV9fdTMyIHR4YnVmX2R2bWEsIHFidWZzX2R2bWEgPSBxZXAtPmJ1ZmZlcnNfZHZtYTsKKwl1bnNpZ25lZCBjaGFyICp0eGJ1ZjsKKwlpbnQgbGVuLCBlbnRyeTsKKworCXNwaW5fbG9ja19pcnEoJnFlcC0+bG9jayk7CisKKwlxZV90eF9yZWNsYWltKHFlcCk7CisKKwlsZW4gPSBza2ItPmxlbjsKKwllbnRyeSA9IHFlcC0+dHhfbmV3OworCisJdHhidWYgPSAmcWJ1ZnMtPnR4X2J1ZltlbnRyeSAmIChUWF9SSU5HX1NJWkUgLSAxKV1bMF07CisJdHhidWZfZHZtYSA9IHFidWZzX2R2bWEgKworCQlxZWJ1Zl9vZmZzZXQodHhfYnVmLCAoZW50cnkgJiAoVFhfUklOR19TSVpFIC0gMSkpKTsKKworCS8qIEF2b2lkIGEgcmFjZS4uLiAqLworCXFlcC0+cWVfYmxvY2stPnFlX3R4ZFtlbnRyeV0udHhfZmxhZ3MgPSBUWERfVVBEQVRFOworCisJbWVtY3B5KHR4YnVmLCBza2ItPmRhdGEsIGxlbik7CisKKwlxZXAtPnFlX2Jsb2NrLT5xZV90eGRbZW50cnldLnR4X2FkZHIgPSB0eGJ1Zl9kdm1hOworCXFlcC0+cWVfYmxvY2stPnFlX3R4ZFtlbnRyeV0udHhfZmxhZ3MgPQorCQkoVFhEX09XTiB8IFRYRF9TT1AgfCBUWERfRU9QIHwgKGxlbiAmIFRYRF9MRU5HVEgpKTsKKwlxZXAtPnR4X25ldyA9IE5FWFRfVFgoZW50cnkpOworCisJLyogR2V0IGl0IGdvaW5nLiAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNidXNfd3JpdGVsKENSRUdfQ1RSTF9UV0FLRVVQLCBxZXAtPnFjcmVncyArIENSRUdfQ1RSTCk7CisKKwlxZXAtPm5ldF9zdGF0cy50eF9wYWNrZXRzKys7CisJcWVwLT5uZXRfc3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCisJaWYgKFRYX0JVRkZTX0FWQUlMKHFlcCkgPD0gMCkgeworCQkvKiBIYWx0IHRoZSBuZXQgcXVldWUgYW5kIGVuYWJsZSB0eCBpbnRlcnJ1cHRzLgorCQkgKiBXaGVuIHRoZSB0eCBxdWV1ZSBlbXB0aWVzIHRoZSB0eCBpcnEgaGFuZGxlcgorCQkgKiB3aWxsIHdha2UgdXAgdGhlIHF1ZXVlIGFuZCByZXR1cm4gdXMgYmFjayB0bworCQkgKiB0aGUgbGF6eSB0eCByZWNsYWltIHNjaGVtZS4KKwkJICovCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc2J1c193cml0ZWwoMCwgcWVwLT5xY3JlZ3MgKyBDUkVHX1RJTUFTSyk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcWVwLT5sb2NrKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnFlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdW5xZSAqcWVwID0gKHN0cnVjdCBzdW5xZSAqKSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJnFlcC0+bmV0X3N0YXRzOworfQorCitzdGF0aWMgdm9pZCBxZV9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN1bnFlICpxZXAgPSAoc3RydWN0IHN1bnFlICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwl1OCBuZXdfbWNvbmZpZyA9IHFlcC0+bWNvbmZpZzsKKwljaGFyICphZGRyczsKKwlpbnQgaTsKKwl1MzIgY3JjOworCisJLyogTG9jayBvdXQgb3RoZXJzLiAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwgKGRldi0+bWNfY291bnQgPiA2NCkpIHsKKwkJc2J1c193cml0ZWIoTVJFR1NfSUFDT05GSUdfQUNITkdFIHwgTVJFR1NfSUFDT05GSUdfTEFSRVNFVCwKKwkJCSAgICBxZXAtPm1yZWdzICsgTVJFR1NfSUFDT05GSUcpOworCQl3aGlsZSAoKHNidXNfcmVhZGIocWVwLT5tcmVncyArIE1SRUdTX0lBQ09ORklHKSAmIE1SRUdTX0lBQ09ORklHX0FDSE5HRSkgIT0gMCkKKwkJCWJhcnJpZXIoKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCXNidXNfd3JpdGViKDB4ZmYsIHFlcC0+bXJlZ3MgKyBNUkVHU19GSUxURVIpOworCQlzYnVzX3dyaXRlYigwLCBxZXAtPm1yZWdzICsgTVJFR1NfSUFDT05GSUcpOworCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCW5ld19tY29uZmlnIHw9IE1SRUdTX01DT05GSUdfUFJPTUlTQzsKKwl9IGVsc2UgeworCQl1MTYgaGFzaF90YWJsZVs0XTsKKwkJdTggKmhieXRlcyA9ICh1bnNpZ25lZCBjaGFyICopICZoYXNoX3RhYmxlWzBdOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQloYXNoX3RhYmxlW2ldID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrKSB7CisJCQlhZGRycyA9IGRtaS0+ZG1pX2FkZHI7CisJCQlkbWkgPSBkbWktPm5leHQ7CisKKwkJCWlmICghKCphZGRycyAmIDEpKQorCQkJCWNvbnRpbnVlOworCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwkJCWNyYyA+Pj0gMjY7CisJCQloYXNoX3RhYmxlW2NyYyA+PiA0XSB8PSAxIDw8IChjcmMgJiAweGYpOworCQl9CisJCS8qIFByb2dyYW0gdGhlIHFlIHdpdGggdGhlIG5ldyBmaWx0ZXIgdmFsdWUuICovCisJCXNidXNfd3JpdGViKE1SRUdTX0lBQ09ORklHX0FDSE5HRSB8IE1SRUdTX0lBQ09ORklHX0xBUkVTRVQsCisJCQkgICAgcWVwLT5tcmVncyArIE1SRUdTX0lBQ09ORklHKTsKKwkJd2hpbGUgKChzYnVzX3JlYWRiKHFlcC0+bXJlZ3MgKyBNUkVHU19JQUNPTkZJRykgJiBNUkVHU19JQUNPTkZJR19BQ0hOR0UpICE9IDApCisJCQliYXJyaWVyKCk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXU4IHRtcCA9ICpoYnl0ZXMrKzsKKwkJCXNidXNfd3JpdGViKHRtcCwgcWVwLT5tcmVncyArIE1SRUdTX0ZJTFRFUik7CisJCX0KKwkJc2J1c193cml0ZWIoMCwgcWVwLT5tcmVncyArIE1SRUdTX0lBQ09ORklHKTsKKwl9CisKKwkvKiBBbnkgY2hhbmdlIG9mIHRoZSBsb2dpY2FsIGFkZHJlc3MgZmlsdGVyLCB0aGUgcGh5c2ljYWwgYWRkcmVzcywKKwkgKiBvciBlbmFibGluZy9kaXNhYmxpbmcgcHJvbWlzY3VvdXMgbW9kZSBjYXVzZXMgdGhlIE1BQ0UgdG8gZGlzYWJsZQorCSAqIHRoZSByZWNlaXZlci4gIFNvIHdlIG11c3QgcmUtZW5hYmxlIHRoZW0gaGVyZSBvciBlbHNlIHRoZSBNQUNFCisJICogcmVmdXNlcyB0byBsaXN0ZW4gdG8gYW55dGhpbmcgb24gdGhlIG5ldHdvcmsuICBTaGVlc2gsIHRvb2sKKwkgKiBtZSBhIGRheSBvciB0d28gdG8gZmluZCB0aGlzIGJ1Zy4KKwkgKi8KKwlxZXAtPm1jb25maWcgPSBuZXdfbWNvbmZpZzsKKwlzYnVzX3dyaXRlYihxZXAtPm1jb25maWcsIHFlcC0+bXJlZ3MgKyBNUkVHU19NQ09ORklHKTsKKworCS8qIExldCB1cyBnZXQgZ29pbmcgYWdhaW4uICovCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKiBFdGh0b29sIHN1cHBvcnQuLi4gKi8KK3N0YXRpYyB2b2lkIHFlX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IHN1bnFlICpxZXAgPSBkZXYtPnByaXY7CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAic3VucWUiKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgIjMuMCIpOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJTQlVTOiVkIiwKKwkJcWVwLT5xZV9zZGV2LT5zbG90KTsKK30KKworc3RhdGljIHUzMiBxZV9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdW5xZSAqcWVwID0gZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqbXJlZ3MgPSBxZXAtPm1yZWdzOworCXU4IHBoeWNvbmZpZzsKKworCXNwaW5fbG9ja19pcnEoJnFlcC0+bG9jayk7CisJcGh5Y29uZmlnID0gc2J1c19yZWFkYihtcmVncyArIE1SRUdTX1BIWUNPTkZJRyk7CisJc3Bpbl91bmxvY2tfaXJxKCZxZXAtPmxvY2spOworCisJcmV0dXJuIChwaHljb25maWcgJiBNUkVHU19QSFlDT05GSUdfTFNUQVQpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHFlX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBxZV9nZXRfZHJ2aW5mbywKKwkuZ2V0X2xpbmsJCT0gcWVfZ2V0X2xpbmssCit9OworCisvKiBUaGlzIGlzIG9ubHkgY2FsbGVkIG9uY2UgYXQgYm9vdCB0aW1lIGZvciBlYWNoIGNhcmQgcHJvYmVkLiAqLworc3RhdGljIGlubGluZSB2b2lkIHFlY19pbml0X29uY2Uoc3RydWN0IHN1bnFlYyAqcWVjcCwgc3RydWN0IHNidXNfZGV2ICpxc2RldikKK3sKKwl1OCBic2l6ZXMgPSBxZWNwLT5xZWNfYnVyc3RzOworCisJaWYgKHNidXNfY2FuX2J1cnN0NjQocXNkZXYpICYmIChic2l6ZXMgJiBETUFfQlVSU1Q2NCkpIHsKKwkJc2J1c193cml0ZWwoR0xPQl9DVFJMX0I2NCwgcWVjcC0+Z3JlZ3MgKyBHTE9CX0NUUkwpOworCX0gZWxzZSBpZiAoYnNpemVzICYgRE1BX0JVUlNUMzIpIHsKKwkJc2J1c193cml0ZWwoR0xPQl9DVFJMX0IzMiwgcWVjcC0+Z3JlZ3MgKyBHTE9CX0NUUkwpOworCX0gZWxzZSB7CisJCXNidXNfd3JpdGVsKEdMT0JfQ1RSTF9CMTYsIHFlY3AtPmdyZWdzICsgR0xPQl9DVFJMKTsKKwl9CisKKwkvKiBQYWNrZXRzaXplIG9ubHkgdXNlZCBpbiAxMDBiYXNlVCBCaWdNQUMgY29uZmlndXJhdGlvbnMsCisJICogc2V0IGl0IHRvIHplcm8ganVzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLgorCSAqLworCXNidXNfd3JpdGVsKEdMT0JfUFNJWkVfMjA0OCwgcWVjcC0+Z3JlZ3MgKyBHTE9CX1BTSVpFKTsKKworCS8qIFNldCB0aGUgbG9jYWwgbWVtc2l6ZSByZWdpc3RlciwgZGl2aWRlZCB1cCB0byBvbmUgcGllY2UgcGVyIFFFIGNoYW5uZWwuICovCisJc2J1c193cml0ZWwoKHFzZGV2LT5yZWdfYWRkcnNbMV0ucmVnX3NpemUgPj4gMiksCisJCSAgICBxZWNwLT5ncmVncyArIEdMT0JfTVNJWkUpOworCisJLyogRGl2aWRlIHVwIHRoZSBsb2NhbCBRRUMgbWVtb3J5IGFtb25nc3QgdGhlIDQgUUUgcmVjZWl2ZXIgYW5kCisJICogdHJhbnNtaXR0ZXIgRklGT3MuICBCYXNpY2FsbHkgaXQgaXMgKHRvdGFsIC8gMiAvIG51bV9jaGFubmVscykuCisJICovCisJc2J1c193cml0ZWwoKHFzZGV2LT5yZWdfYWRkcnNbMV0ucmVnX3NpemUgPj4gMikgPj4gMSwKKwkJICAgIHFlY3AtPmdyZWdzICsgR0xPQl9UU0laRSk7CisJc2J1c193cml0ZWwoKHFzZGV2LT5yZWdfYWRkcnNbMV0ucmVnX3NpemUgPj4gMikgPj4gMSwKKwkJICAgIHFlY3AtPmdyZWdzICsgR0xPQl9SU0laRSk7Cit9CisKKy8qIEZvdXIgUUUncyBwZXIgUUVDIGNhcmQuICovCitzdGF0aWMgaW50IF9faW5pdCBxZWNfZXRoZXJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCit7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcWVfZGV2c1s0XTsKKwlzdHJ1Y3Qgc3VucWUgKnFlcHNbNF07CisJc3RydWN0IHNidXNfZGV2ICpxZXNkZXZzWzRdOworCXN0cnVjdCBzYnVzX2RldiAqY2hpbGQ7CisJc3RydWN0IHN1bnFlYyAqcWVjcCA9IE5VTEw7CisJdTggYnNpemVzLCBic2l6ZXNfbW9yZTsKKwlpbnQgaSwgaiwgcmVzID0gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJcWVfZGV2c1tpXSA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgc3VucWUpKTsKKwkJaWYgKCFxZV9kZXZzW2ldKQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXFlcHNbaV0gPSAoc3RydWN0IHN1bnFlICopIHFlX2RldnNbaV0tPnByaXY7CisJCWZvciAoaiA9IDA7IGogPCA2OyBqKyspCisJCQlxZV9kZXZzW2ldLT5kZXZfYWRkcltqXSA9IGlkcHJvbS0+aWRfZXRoYWRkcltqXTsKKwkJcWVwc1tpXS0+Y2hhbm5lbCA9IGk7CisJCXNwaW5fbG9ja19pbml0KCZxZXBzW2ldLT5sb2NrKTsKKwl9CisKKwlxZWNwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHN1bnFlYyksIEdGUF9LRVJORUwpOworCWlmIChxZWNwID09IE5VTEwpCisJCWdvdG8gb3V0MTsKKwlxZWNwLT5xZWNfc2RldiA9IHNkZXY7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXFlY3AtPnFlc1tpXSA9IHFlcHNbaV07CisJCXFlcHNbaV0tPmRldiA9IHFlX2RldnNbaV07CisJCXFlcHNbaV0tPnBhcmVudCA9IHFlY3A7CisJfQorCisJcmVzID0gLUVOT0RFVjsKKworCWZvciAoaSA9IDAsIGNoaWxkID0gc2Rldi0+Y2hpbGQ7IGkgPCA0OyBpKyssIGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJLyogTGluayBpbiBjaGFubmVsICovCisJCWogPSBwcm9tX2dldGludGRlZmF1bHQoY2hpbGQtPnByb21fbm9kZSwgImNoYW5uZWwjIiwgLTEpOworCQlpZiAoaiA9PSAtMSkKKwkJCWdvdG8gb3V0MjsKKwkJcWVzZGV2c1tqXSA9IGNoaWxkOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXFlcHNbaV0tPnFlX3NkZXYgPSBxZXNkZXZzW2ldOworCisJLyogTm93IG1hcCBpbiB0aGUgcmVnaXN0ZXJzLCBRRUMgZ2xvYmFscyBmaXJzdC4gKi8KKwlxZWNwLT5ncmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sIDAsCisJCQkJICAgR0xPQl9SRUdfU0laRSwgIlFFQyBHbG9iYWwgUmVnaXN0ZXJzIik7CisJaWYgKCFxZWNwLT5ncmVncykgeworCQlwcmludGsoS0VSTl9FUlIgIlF1YWRFdGhlcjogQ2Fubm90IG1hcCBRRUMgZ2xvYmFsIHJlZ2lzdGVycy5cbiIpOworCQlnb3RvIG91dDI7CisJfQorCisJLyogTWFrZSBzdXJlIHRoZSBRRUMgaXMgaW4gTUFDRSBtb2RlLiAqLworCWlmICgoc2J1c19yZWFkbChxZWNwLT5ncmVncyArIEdMT0JfQ1RSTCkgJiAweGYwMDAwMDAwKSAhPSBHTE9CX0NUUkxfTU1PREUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJRdWFkRXRoZXI6IEFJRUVFLCBRRUMgaXMgbm90IGluIE1BQ0UgbW9kZSFcbiIpOworCQlnb3RvIG91dDM7CisJfQorCisJLyogUmVzZXQgdGhlIFFFQy4gKi8KKwlpZiAocWVjX2dsb2JhbF9yZXNldChxZWNwLT5ncmVncykpCisJCWdvdG8gb3V0MzsKKworCS8qIEZpbmQgYW5kIHNldCB0aGUgYnVyc3Qgc2l6ZXMgZm9yIHRoZSBRRUMsIHNpbmNlIGl0IGRvZXMKKwkgKiB0aGUgYWN0dWFsIGRtYSBmb3IgYWxsIDQgY2hhbm5lbHMuCisJICovCisJYnNpemVzID0gcHJvbV9nZXRpbnRkZWZhdWx0KHNkZXYtPnByb21fbm9kZSwgImJ1cnN0LXNpemVzIiwgMHhmZik7CisJYnNpemVzICY9IDB4ZmY7CisJYnNpemVzX21vcmUgPSBwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+YnVzLT5wcm9tX25vZGUsICJidXJzdC1zaXplcyIsIDB4ZmYpOworCisJaWYgKGJzaXplc19tb3JlICE9IDB4ZmYpCisJCWJzaXplcyAmPSBic2l6ZXNfbW9yZTsKKwlpZiAoYnNpemVzID09IDB4ZmYgfHwgKGJzaXplcyAmIERNQV9CVVJTVDE2KSA9PSAwIHx8CisJICAgKGJzaXplcyAmIERNQV9CVVJTVDMyKT09MCkKKwkJYnNpemVzID0gKERNQV9CVVJTVDMyIC0gMSk7CisKKwlxZWNwLT5xZWNfYnVyc3RzID0gYnNpemVzOworCisJLyogUGVyZm9ybSBvbmUgdGltZSBRRUMgaW5pdGlhbGl6YXRpb24sIHdlIG5ldmVyIHRvdWNoIHRoZSBRRUMKKwkgKiBnbG9iYWxzIGFnYWluIGFmdGVyIHRoaXMuCisJICovCisJcWVjX2luaXRfb25jZShxZWNwLCBzZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJc3RydWN0IHN1bnFlICpxZSA9IHFlcHNbaV07CisJCS8qIE1hcCBpbiBRRUMgcGVyLWNoYW5uZWwgY29udHJvbCByZWdpc3RlcnMuICovCisJCXFlLT5xY3JlZ3MgPSBzYnVzX2lvcmVtYXAoJnFlLT5xZV9zZGV2LT5yZXNvdXJjZVswXSwgMCwKKwkJCQkgICAgICAgQ1JFR19SRUdfU0laRSwgIlFFQyBDaGFubmVsIFJlZ2lzdGVycyIpOworCQlpZiAoIXFlLT5xY3JlZ3MpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUXVhZEV0aGVyOiBDYW5ub3QgbWFwIFFFICVkJ3MgY2hhbm5lbCByZWdpc3RlcnMuXG4iLCBpKTsKKwkJCWdvdG8gb3V0NDsKKwkJfQorCisJCS8qIE1hcCBpbiBwZXItY2hhbm5lbCBBTUQgTUFDRSByZWdpc3RlcnMuICovCisJCXFlLT5tcmVncyA9IHNidXNfaW9yZW1hcCgmcWUtPnFlX3NkZXYtPnJlc291cmNlWzFdLCAwLAorCQkJCSAgICAgIE1SRUdTX1JFR19TSVpFLCAiUUUgTUFDRSBSZWdpc3RlcnMiKTsKKwkJaWYgKCFxZS0+bXJlZ3MpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUXVhZEV0aGVyOiBDYW5ub3QgbWFwIFFFICVkJ3MgTUFDRSByZWdpc3RlcnMuXG4iLCBpKTsKKwkJCWdvdG8gb3V0NDsKKwkJfQorCisJCXFlLT5xZV9ibG9jayA9IHNidXNfYWxsb2NfY29uc2lzdGVudChxZS0+cWVfc2RldiwKKwkJCQkJCSAgUEFHRV9TSVpFLAorCQkJCQkJICAmcWUtPnFibG9ja19kdm1hKTsKKwkJcWUtPmJ1ZmZlcnMgPSBzYnVzX2FsbG9jX2NvbnNpc3RlbnQocWUtPnFlX3NkZXYsCisJCQkJCQkgc2l6ZW9mKHN0cnVjdCBzdW5xZV9idWZmZXJzKSwKKwkJCQkJCSAmcWUtPmJ1ZmZlcnNfZHZtYSk7CisJCWlmIChxZS0+cWVfYmxvY2sgPT0gTlVMTCB8fCBxZS0+cWJsb2NrX2R2bWEgPT0gMCB8fAorCQkgICAgcWUtPmJ1ZmZlcnMgPT0gTlVMTCB8fCBxZS0+YnVmZmVyc19kdm1hID09IDApIHsKKwkJCWdvdG8gb3V0NDsKKwkJfQorCisJCS8qIFN0b3AgdGhpcyBRRS4gKi8KKwkJcWVfc3RvcChxZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlTRVRfTU9EVUxFX09XTkVSKHFlX2RldnNbaV0pOworCQlxZV9kZXZzW2ldLT5vcGVuID0gcWVfb3BlbjsKKwkJcWVfZGV2c1tpXS0+c3RvcCA9IHFlX2Nsb3NlOworCQlxZV9kZXZzW2ldLT5oYXJkX3N0YXJ0X3htaXQgPSBxZV9zdGFydF94bWl0OworCQlxZV9kZXZzW2ldLT5nZXRfc3RhdHMgPSBxZV9nZXRfc3RhdHM7CisJCXFlX2RldnNbaV0tPnNldF9tdWx0aWNhc3RfbGlzdCA9IHFlX3NldF9tdWx0aWNhc3Q7CisJCXFlX2RldnNbaV0tPnR4X3RpbWVvdXQgPSBxZV90eF90aW1lb3V0OworCQlxZV9kZXZzW2ldLT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CisJCXFlX2RldnNbaV0tPmlycSA9IHNkZXYtPmlycXNbMF07CisJCXFlX2RldnNbaV0tPmRtYSA9IDA7CisJCXFlX2RldnNbaV0tPmV0aHRvb2xfb3BzID0gJnFlX2V0aHRvb2xfb3BzOworCX0KKworCS8qIFFFQyByZWNlaXZlcyBpbnRlcnJ1cHRzIGZyb20gZWFjaCBRRSwgdGhlbiBpdCBzZW5kcyB0aGUgYWN0dWFsCisJICogSVJRIHRvIHRoZSBjcHUgaXRzZWxmLiAgU2luY2UgUUVDIGlzIHRoZSBzaW5nbGUgcG9pbnQgb2YKKwkgKiBpbnRlcnJ1cHQgZm9yIGFsbCBRRSBjaGFubmVscyB3ZSByZWdpc3RlciB0aGUgSVJRIGhhbmRsZXIKKwkgKiBmb3IgaXQgbm93LgorCSAqLworCWlmIChyZXF1ZXN0X2lycShzZGV2LT5pcnFzWzBdLCAmcWVjX2ludGVycnVwdCwKKwkJCVNBX1NISVJRLCAiUXVhZEV0aGVyIiwgKHZvaWQgKikgcWVjcCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJRdWFkRXRoZXI6IENhbid0IHJlZ2lzdGVyIFFFQyBtYXN0ZXIgaXJxIGhhbmRsZXIuXG4iKTsKKwkJcmVzID0gLUVBR0FJTjsKKwkJZ290byBvdXQ0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKHJlZ2lzdGVyX25ldGRldihxZV9kZXZzW2ldKSAhPSAwKQorCQkJZ290byBvdXQ1OworCX0KKworCS8qIFJlcG9ydCB0aGUgUUUgY2hhbm5lbHMuICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogUXVhZEV0aGVybmV0IGNoYW5uZWxbJWRdICIsIHFlX2RldnNbaV0tPm5hbWUsIGkpOworCQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorCQkJcHJpbnRrICgiJTIuMnglYyIsCisJCQkJcWVfZGV2c1tpXS0+ZGV2X2FkZHJbal0sCisJCQkJaiA9PSA1ID8gJyAnOiAnOicpOworCQlwcmludGsoIlxuIik7CisJfQorCisJLyogV2UgYXJlIGhvbWUgZnJlZSBhdCB0aGlzIHBvaW50LCBsaW5rIHRoZSBxZSdzIGludG8KKwkgKiB0aGUgbWFzdGVyIGxpc3QgZm9yIGxhdGVyIGRyaXZlciBleGl0LgorCSAqLworCXFlY3AtPm5leHRfbW9kdWxlID0gcm9vdF9xZWNfZGV2OworCXJvb3RfcWVjX2RldiA9IHFlY3A7CisKKwlyZXR1cm4gMDsKKworb3V0NToKKwl3aGlsZSAoaS0tKQorCQl1bnJlZ2lzdGVyX25ldGRldihxZV9kZXZzW2ldKTsKKwlmcmVlX2lycShzZGV2LT5pcnFzWzBdLCAodm9pZCAqKXFlY3ApOworb3V0NDoKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXN0cnVjdCBzdW5xZSAqcWUgPSAoc3RydWN0IHN1bnFlICopcWVfZGV2c1tpXS0+cHJpdjsKKworCQlpZiAocWUtPnFjcmVncykKKwkJCXNidXNfaW91bm1hcChxZS0+cWNyZWdzLCBDUkVHX1JFR19TSVpFKTsKKwkJaWYgKHFlLT5tcmVncykKKwkJCXNidXNfaW91bm1hcChxZS0+bXJlZ3MsIE1SRUdTX1JFR19TSVpFKTsKKwkJaWYgKHFlLT5xZV9ibG9jaykKKwkJCXNidXNfZnJlZV9jb25zaXN0ZW50KHFlLT5xZV9zZGV2LAorCQkJCQkgICAgIFBBR0VfU0laRSwKKwkJCQkJICAgICBxZS0+cWVfYmxvY2ssCisJCQkJCSAgICAgcWUtPnFibG9ja19kdm1hKTsKKwkJaWYgKHFlLT5idWZmZXJzKQorCQkJc2J1c19mcmVlX2NvbnNpc3RlbnQocWUtPnFlX3NkZXYsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzdW5xZV9idWZmZXJzKSwKKwkJCQkJICAgICBxZS0+YnVmZmVycywKKwkJCQkJICAgICBxZS0+YnVmZmVyc19kdm1hKTsKKwl9CitvdXQzOgorCXNidXNfaW91bm1hcChxZWNwLT5ncmVncywgR0xPQl9SRUdfU0laRSk7CitvdXQyOgorCWtmcmVlKHFlY3ApOworb3V0MToKKwlpID0gNDsKK291dDoKKwl3aGlsZSAoaS0tKQorCQlmcmVlX25ldGRldihxZV9kZXZzW2ldKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IF9faW5pdCBxZWNfbWF0Y2goc3RydWN0IHNidXNfZGV2ICpzZGV2KQoreworCXN0cnVjdCBzYnVzX2RldiAqc2libGluZzsKKwlpbnQgaTsKKworCWlmIChzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAicWVjIikgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBRRUMgY2FuIGJlIHBhcmVudCBvZiBlaXRoZXIgUXVhZEV0aGVybmV0IG9yIEJpZ01BQworCSAqIGNoaWxkcmVuLiAgRG8gbm90IGNvbmZ1c2UgdGhpcyB3aXRoIHFmZS9TVU5XLHFmZQorCSAqIHdoaWNoIGlzIGEgcXVhZC1oYXBweW1lYWwgY2FyZCBhbmQgaGFuZGxlZCBieQorCSAqIGEgZGlmZmVyZW50IGRyaXZlci4KKwkgKi8KKwlzaWJsaW5nID0gc2Rldi0+Y2hpbGQ7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAoc2libGluZyA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWlmIChzdHJjbXAoc2libGluZy0+cHJvbV9uYW1lLCAicWUiKSAhPSAwKQorCQkJcmV0dXJuIDA7CisJCXNpYmxpbmcgPSBzaWJsaW5nLT5uZXh0OworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgcWVjX3Byb2JlKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHNidXNfYnVzICpidXM7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gTlVMTDsKKwlzdGF0aWMgaW50IGNhbGxlZDsKKwlpbnQgY2FyZHMgPSAwLCB2OworCisJcm9vdF9xZWNfZGV2ID0gTlVMTDsKKworCWlmIChjYWxsZWQpCisJCXJldHVybiAtRU5PREVWOworCWNhbGxlZCsrOworCisJZm9yX2VhY2hfc2J1cyhidXMpIHsKKwkJZm9yX2VhY2hfc2J1c2RldihzZGV2LCBidXMpIHsKKwkJCWlmIChjYXJkcykKKwkJCQlkZXYgPSBOVUxMOworCisJCQlpZiAocWVjX21hdGNoKHNkZXYpKSB7CisJCQkJY2FyZHMrKzsKKwkJCQlpZiAoKHYgPSBxZWNfZXRoZXJfaW5pdChkZXYsIHNkZXYpKSkKKwkJCQkJcmV0dXJuIHY7CisJCQl9CisJCX0KKwl9CisJaWYgKCFjYXJkcykKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBxZWNfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBzdW5xZWMgKm5leHRfcWVjOworCWludCBpOworCisJd2hpbGUgKHJvb3RfcWVjX2RldikgeworCQluZXh0X3FlYyA9IHJvb3RfcWVjX2Rldi0+bmV4dF9tb2R1bGU7CisKKwkJLyogUmVsZWFzZSBhbGwgZm91ciBRRSBjaGFubmVscywgdGhlbiB0aGUgUUVDIGl0c2VsZi4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYocm9vdF9xZWNfZGV2LT5xZXNbaV0tPmRldik7CisJCQlzYnVzX2lvdW5tYXAocm9vdF9xZWNfZGV2LT5xZXNbaV0tPnFjcmVncywgQ1JFR19SRUdfU0laRSk7CisJCQlzYnVzX2lvdW5tYXAocm9vdF9xZWNfZGV2LT5xZXNbaV0tPm1yZWdzLCBNUkVHU19SRUdfU0laRSk7CisJCQlzYnVzX2ZyZWVfY29uc2lzdGVudChyb290X3FlY19kZXYtPnFlc1tpXS0+cWVfc2RldiwKKwkJCQkJICAgICBQQUdFX1NJWkUsCisJCQkJCSAgICAgcm9vdF9xZWNfZGV2LT5xZXNbaV0tPnFlX2Jsb2NrLAorCQkJCQkgICAgIHJvb3RfcWVjX2Rldi0+cWVzW2ldLT5xYmxvY2tfZHZtYSk7CisJCQlzYnVzX2ZyZWVfY29uc2lzdGVudChyb290X3FlY19kZXYtPnFlc1tpXS0+cWVfc2RldiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IHN1bnFlX2J1ZmZlcnMpLAorCQkJCQkgICAgIHJvb3RfcWVjX2Rldi0+cWVzW2ldLT5idWZmZXJzLAorCQkJCQkgICAgIHJvb3RfcWVjX2Rldi0+cWVzW2ldLT5idWZmZXJzX2R2bWEpOworCQkJZnJlZV9uZXRkZXYocm9vdF9xZWNfZGV2LT5xZXNbaV0tPmRldik7CisJCX0KKwkJZnJlZV9pcnEocm9vdF9xZWNfZGV2LT5xZWNfc2Rldi0+aXJxc1swXSwgKHZvaWQgKilyb290X3FlY19kZXYpOworCQlzYnVzX2lvdW5tYXAocm9vdF9xZWNfZGV2LT5ncmVncywgR0xPQl9SRUdfU0laRSk7CisJCWtmcmVlKHJvb3RfcWVjX2Rldik7CisJCXJvb3RfcWVjX2RldiA9IG5leHRfcWVjOworCX0KK30KKworbW9kdWxlX2luaXQocWVjX3Byb2JlKTsKK21vZHVsZV9leGl0KHFlY19jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bnFlLmggYi9kcml2ZXJzL25ldC9zdW5xZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMzRmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW5xZS5oCkBAIC0wLDAgKzEsMzUxIEBACisvKiAkSWQ6IHN1bnFlLmgsdiAxLjEzIDIwMDAvMDIvMDkgMTE6MTU6NDIgZGF2ZW0gRXhwICQKKyAqIHN1bnFlLmg6IERlZmluaXRpb25zIGZvciB0aGUgU3VuIFF1YWRFdGhlcm5ldCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqLworCisjaWZuZGVmIF9TVU5RRV9ICisjZGVmaW5lIF9TVU5RRV9ICisKKy8qIFFFQyBnbG9iYWwgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBHTE9CX0NUUkwJMHgwMFVMCQkvKiBDb250cm9sCQkJKi8KKyNkZWZpbmUgR0xPQl9TVEFUCTB4MDRVTAkJLyogU3RhdHVzCQkJKi8KKyNkZWZpbmUgR0xPQl9QU0laRQkweDA4VUwJCS8qIFBhY2tldCBTaXplCQkJKi8KKyNkZWZpbmUgR0xPQl9NU0laRQkweDBjVUwJCS8qIExvY2FsLW1lbW9yeSBTaXplCQkqLworI2RlZmluZSBHTE9CX1JTSVpFCTB4MTBVTAkJLyogUmVjZWl2ZSBwYXJ0aXRpb24gc2l6ZQkqLworI2RlZmluZSBHTE9CX1RTSVpFCTB4MTRVTAkJLyogVHJhbnNtaXQgcGFydGl0aW9uIHNpemUJKi8KKyNkZWZpbmUgR0xPQl9SRUdfU0laRQkweDE4VUwKKworI2RlZmluZSBHTE9CX0NUUkxfTU1PREUgICAgICAgMHg0MDAwMDAwMCAvKiBNQUNFIHFlYyBtb2RlICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX0JNT0RFICAgICAgIDB4MTAwMDAwMDAgLyogQmlnTUFDIHFlYyBtb2RlICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfQ1RSTF9FUEFSICAgICAgICAweDAwMDAwMDIwIC8qIEVuYWJsZSBwYXJpdHkgICAgICAgICAgICAqLworI2RlZmluZSBHTE9CX0NUUkxfQUNOVFJMICAgICAgMHgwMDAwMDAxOCAvKiBTQlVTIGFyYml0cmF0aW9uIGNvbnRyb2wgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX0I2NCAgICAgICAgIDB4MDAwMDAwMDQgLyogNjQgYnl0ZSBkdm1hIGJ1cnN0cyAgICAgICovCisjZGVmaW5lIEdMT0JfQ1RSTF9CMzIgICAgICAgICAweDAwMDAwMDAyIC8qIDMyIGJ5dGUgZHZtYSBidXJzdHMgICAgICAqLworI2RlZmluZSBHTE9CX0NUUkxfQjE2ICAgICAgICAgMHgwMDAwMDAwMCAvKiAxNiBieXRlIGR2bWEgYnVyc3RzICAgICAgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX1JFU0VUICAgICAgIDB4MDAwMDAwMDEgLyogUmVzZXQgdGhlIFFFQyAgICAgICAgICAgICovCisKKyNkZWZpbmUgR0xPQl9TVEFUX1RYICAgICAgICAgIDB4MDAwMDAwMDggLyogQmlnTUFDIFRyYW5zbWl0IElSUSAgICAgICovCisjZGVmaW5lIEdMT0JfU1RBVF9SWCAgICAgICAgICAweDAwMDAwMDA0IC8qIEJpZ01BQyBSZWNlaXZlIElSUSAgICAgICAqLworI2RlZmluZSBHTE9CX1NUQVRfQk0gICAgICAgICAgMHgwMDAwMDAwMiAvKiBCaWdNQUMgR2xvYmFsIElSUSAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9TVEFUX0VSICAgICAgICAgIDB4MDAwMDAwMDEgLyogQmlnTUFDIEVycm9yIElSUSAgICAgICAgICovCisKKyNkZWZpbmUgR0xPQl9QU0laRV8yMDQ4ICAgICAgIDB4MDAgICAgICAgLyogMmsgcGFja2V0IHNpemUgICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfUFNJWkVfNDA5NiAgICAgICAweDAxICAgICAgIC8qIDRrIHBhY2tldCBzaXplICAgICAgICAgICAqLworI2RlZmluZSBHTE9CX1BTSVpFXzYxNDQgICAgICAgMHgxMCAgICAgICAvKiA2ayBwYWNrZXQgc2l6ZSAgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9QU0laRV84MTkyICAgICAgIDB4MTEgICAgICAgLyogOGsgcGFja2V0IHNpemUgICAgICAgICAgICovCisKKy8qIEluIE1BQ0UgbW9kZSwgdGhlcmUgYXJlIGZvdXIgcWUgY2hhbm5lbHMuICBFYWNoIGNoYW5uZWwgaGFzIGl0J3Mgb3duCisgKiBzdGF0dXMgYml0cyBpbiB0aGUgUUVDIHN0YXR1cyByZWdpc3Rlci4gIFRoaXMgbWFjcm8gcGlja3Mgb3V0IHRoZQorICogb25lcyB5b3Ugd2FudC4KKyAqLworI2RlZmluZSBHTE9CX1NUQVRfUEVSX1FFKHN0YXR1cywgY2hhbm5lbCkgKCgoc3RhdHVzKSA+PiAoKGNoYW5uZWwpICogNCkpICYgMHhmKQorCisvKiBUaGUgZm9sbG93aW5nIHJlZ2lzdGVycyBhcmUgZm9yIHBlci1xZSBjaGFubmVsIGluZm9ybWF0aW9uL3N0YXR1cy4gKi8KKyNkZWZpbmUgQ1JFR19DVFJMCTB4MDBVTAkvKiBDb250cm9sICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVAkweDA0VUwJLyogU3RhdHVzICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1JYRFMJMHgwOFVMCS8qIFJYIGRlc2NyaXB0b3IgcmluZyBwdHIgICAgKi8KKyNkZWZpbmUgQ1JFR19UWERTCTB4MGNVTAkvKiBUWCBkZXNjcmlwdG9yIHJpbmcgcHRyICAgICovCisjZGVmaW5lIENSRUdfUklNQVNLCTB4MTBVTAkvKiBSWCBJbnRlcnJ1cHQgTWFzayAgICAgICAgICovCisjZGVmaW5lIENSRUdfVElNQVNLCTB4MTRVTAkvKiBUWCBJbnRlcnJ1cHQgTWFzayAgICAgICAgICovCisjZGVmaW5lIENSRUdfUU1BU0sJMHgxOFVMCS8qIFFFQyBFcnJvciBJbnRlcnJ1cHQgTWFzayAgKi8KKyNkZWZpbmUgQ1JFR19NTUFTSwkweDFjVUwJLyogTUFDRSBFcnJvciBJbnRlcnJ1cHQgTWFzayAqLworI2RlZmluZSBDUkVHX1JYV0JVRlBUUgkweDIwVUwJLyogTG9jYWwgbWVtb3J5IHJ4IHdyaXRlIHB0ciAqLworI2RlZmluZSBDUkVHX1JYUkJVRlBUUgkweDI0VUwJLyogTG9jYWwgbWVtb3J5IHJ4IHJlYWQgcHRyICAqLworI2RlZmluZSBDUkVHX1RYV0JVRlBUUgkweDI4VUwJLyogTG9jYWwgbWVtb3J5IHR4IHdyaXRlIHB0ciAqLworI2RlZmluZSBDUkVHX1RYUkJVRlBUUgkweDJjVUwJLyogTG9jYWwgbWVtb3J5IHR4IHJlYWQgcHRyICAqLworI2RlZmluZSBDUkVHX0NDTlQJMHgzMFVMCS8qIENvbGxpc2lvbiBDb3VudGVyICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19QSVBHCTB4MzRVTAkvKiBJbnRlci1GcmFtZSBHYXAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUkVHX1NJWkUJMHgzOFVMCisKKyNkZWZpbmUgQ1JFR19DVFJMX1JYT0ZGICAgICAgIDB4MDAwMDAwMDQgIC8qIERpc2FibGUgdGhpcyBxZSdzIHJlY2VpdmVyKi8KKyNkZWZpbmUgQ1JFR19DVFJMX1JFU0VUICAgICAgIDB4MDAwMDAwMDIgIC8qIFJlc2V0IHRoaXMgcWUgY2hhbm5lbCAgICAgKi8KKyNkZWZpbmUgQ1JFR19DVFJMX1RXQUtFVVAgICAgIDB4MDAwMDAwMDEgIC8qIFRyYW5zbWl0dGVyIFdha2V1cCwgJ2dvJy4gKi8KKworI2RlZmluZSBDUkVHX1NUQVRfRURFRkVSICAgICAgMHgxMDAwMDAwMCAgLyogRXhjZXNzaXZlIERlZmVycyAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfQ0xPU1MgICAgICAgMHgwODAwMDAwMCAgLyogQ2FycmllciBMb3NzICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfRVJFVFJJRVMgICAgMHgwNDAwMDAwMCAgLyogTW9yZSB0aGFuIDE2IHJldHJpZXMgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfTENPTEwgICAgICAgMHgwMjAwMDAwMCAgLyogTGF0ZSBUWCBDb2xsaXNpb24gICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfRlVGTE9XICAgICAgMHgwMTAwMDAwMCAgLyogRklGTyBVbmRlcmZsb3cgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfSkVSUk9SICAgICAgMHgwMDgwMDAwMCAgLyogSmFiYmVyIEVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfQkVSUk9SICAgICAgMHgwMDQwMDAwMCAgLyogQmFiYmxlIEVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhJUlEgICAgICAgMHgwMDIwMDAwMCAgLyogVHJhbnNtaXQgSW50ZXJydXB0ICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfQ0NPRkxPVyAgICAgMHgwMDEwMDAwMCAgLyogVFggQ29sbC1jb3VudGVyIE92ZXJmbG93ICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhERVJST1IgICAgMHgwMDA4MDAwMCAgLyogVFggRGVzY3JpcHRvciBpcyBib2d1cyAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhMRVJSICAgICAgMHgwMDA0MDAwMCAgLyogTGF0ZSBUcmFuc21pdCBFcnJvciAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhQRVJSICAgICAgMHgwMDAyMDAwMCAgLyogVHJhbnNtaXQgUGFyaXR5IEVycm9yICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhTRVJSICAgICAgMHgwMDAxMDAwMCAgLyogVHJhbnNtaXQgU0JVUyBlcnJvciBhY2sgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUkNDT0ZMT1cgICAgMHgwMDAwMTAwMCAgLyogUlggQ29sbC1jb3VudGVyIE92ZXJmbG93ICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlVPRkxPVyAgICAgMHgwMDAwMDgwMCAgLyogUnVudCBDb3VudGVyIE92ZXJmbG93ICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfTUNPRkxPVyAgICAgMHgwMDAwMDQwMCAgLyogTWlzc2VkIENvdW50ZXIgT3ZlcmZsb3cgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhGT0ZMT1cgICAgMHgwMDAwMDIwMCAgLyogUlggRklGTyBPdmVyZmxvdyAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUkxDT0xMICAgICAgMHgwMDAwMDEwMCAgLyogUlggTGF0ZSBDb2xsaXNpb24gICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfRkNPRkxPVyAgICAgMHgwMDAwMDA4MCAgLyogRnJhbWUgQ291bnRlciBPdmVyZmxvdyAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfQ0VDT0ZMT1cgICAgMHgwMDAwMDA0MCAgLyogQ1JDIEVycm9yLWNvdW50ZXIgT3ZlcmZsb3cqLworI2RlZmluZSBDUkVHX1NUQVRfUlhJUlEgICAgICAgMHgwMDAwMDAyMCAgLyogUmVjZWl2ZSBJbnRlcnJ1cHQgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhEUk9QICAgICAgMHgwMDAwMDAxMCAgLyogRHJvcHBlZCBhIFJYJ2QgcGFja2V0ICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhTTUFMTCAgICAgMHgwMDAwMDAwOCAgLyogUmVjZWl2ZSBidWZmZXIgdG9vIHNtYWxsICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhMRVJSICAgICAgMHgwMDAwMDAwNCAgLyogUmVjZWl2ZSBMYXRlIEVycm9yICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhQRVJSICAgICAgMHgwMDAwMDAwMiAgLyogUmVjZWl2ZSBQYXJpdHkgRXJyb3IgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhTRVJSICAgICAgMHgwMDAwMDAwMSAgLyogUmVjZWl2ZSBTQlVTIEVycm9yIEFDSyAgICAqLworCisjZGVmaW5lIENSRUdfU1RBVF9FUlJPUlMgICAgICAoQ1JFR19TVEFUX0VERUZFUnxDUkVHX1NUQVRfQ0xPU1N8Q1JFR19TVEFUX0VSRVRSSUVTfCAgICAgXAorCQkJICAgICAgIENSRUdfU1RBVF9MQ09MTHxDUkVHX1NUQVRfRlVGTE9XfENSRUdfU1RBVF9KRVJST1J8ICAgICAgIFwKKwkJCSAgICAgICBDUkVHX1NUQVRfQkVSUk9SfENSRUdfU1RBVF9DQ09GTE9XfENSRUdfU1RBVF9UWERFUlJPUnwgICBcCisJCQkgICAgICAgQ1JFR19TVEFUX1RYTEVSUnxDUkVHX1NUQVRfVFhQRVJSfENSRUdfU1RBVF9UWFNFUlJ8ICAgICAgXAorCQkJICAgICAgIENSRUdfU1RBVF9SQ0NPRkxPV3xDUkVHX1NUQVRfUlVPRkxPV3xDUkVHX1NUQVRfTUNPRkxPV3wgXAorCQkJICAgICAgIENSRUdfU1RBVF9SWEZPRkxPV3xDUkVHX1NUQVRfUkxDT0xMfENSRUdfU1RBVF9GQ09GTE9XfCAgIFwKKwkJCSAgICAgICBDUkVHX1NUQVRfQ0VDT0ZMT1d8Q1JFR19TVEFUX1JYRFJPUHxDUkVHX1NUQVRfUlhTTUFMTHwgICBcCisJCQkgICAgICAgQ1JFR19TVEFUX1JYTEVSUnxDUkVHX1NUQVRfUlhQRVJSfENSRUdfU1RBVF9SWFNFUlIpCisKKyNkZWZpbmUgQ1JFR19RTUFTS19DT0ZMT1cgICAgIDB4MDAxMDAwMDAgIC8qIENvbGxDbnRyIG92ZXJmbG93ICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19UWERFUlJPUiAgIDB4MDAwODAwMDAgIC8qIFRYRCBlcnJvciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19UWExFUlIgICAgIDB4MDAwNDAwMDAgIC8qIFRYIGxhdGUgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19UWFBFUlIgICAgIDB4MDAwMjAwMDAgIC8qIFRYIHBhcml0eSBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19UWFNFUlIgICAgIDB4MDAwMTAwMDAgIC8qIFRYIHNidXMgZXJyb3IgYWNrICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWERST1AgICAgIDB4MDAwMDAwMTAgIC8qIFJYIGRyb3AgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWEJFUlJPUiAgIDB4MDAwMDAwMDggIC8qIFJYIGJ1ZmZlciBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWExFRVJSICAgIDB4MDAwMDAwMDQgIC8qIFJYIGxhdGUgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWFBFUlIgICAgIDB4MDAwMDAwMDIgIC8qIFJYIHBhcml0eSBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWFNFUlIgICAgIDB4MDAwMDAwMDEgIC8qIFJYIHNidXMgZXJyb3IgYWNrICAgICAgICAgKi8KKworI2RlZmluZSBDUkVHX01NQVNLX0VERUZFUiAgICAgMHgxMDAwMDAwMCAgLyogRXhjZXNzIGRlZmVyICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX0NMT1NTICAgICAgMHgwODAwMDAwMCAgLyogQ2FycmllciBsb3NzICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX0VSRVRSWSAgICAgMHgwNDAwMDAwMCAgLyogRXhjZXNzIHJldHJ5ICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX0xDT0xMICAgICAgMHgwMjAwMDAwMCAgLyogTGF0ZSBjb2xsaXNpb24gZXJyb3IgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX1VGTE9XICAgICAgMHgwMTAwMDAwMCAgLyogVW5kZXJmbG93ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX0pBQkJFUiAgICAgMHgwMDgwMDAwMCAgLyogSmFiYmVyIGVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX0JBQkJMRSAgICAgMHgwMDQwMDAwMCAgLyogQmFiYmxlIGVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX09GTE9XICAgICAgMHgwMDAwMDgwMCAgLyogT3ZlcmZsb3cgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX1JYQ09MTCAgICAgMHgwMDAwMDQwMCAgLyogUlggQ29sbC1DbnRyIG92ZXJmbG93ICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX1JQS1QgICAgICAgMHgwMDAwMDIwMCAgLyogUnVudCBwa3Qgb3ZlcmZsb3cgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX01QS1QgICAgICAgMHgwMDAwMDEwMCAgLyogTWlzc2VkIHBrdCBvdmVyZmxvdyAgICAgICAqLworCisjZGVmaW5lIENSRUdfUElQR19URU5BQiAgICAgICAweDAwMDAwMDIwICAvKiBFbmFibGUgVGhyb3R0bGUgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUElQR19NTU9ERSAgICAgICAweDAwMDAwMDEwICAvKiBNYW51YWwgTW9kZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUElQR19XTUFTSyAgICAgICAweDAwMDAwMDBmICAvKiBTQlVTIFdhaXQgTWFzayAgICAgICAgICAgICovCisKKy8qIFBlci1jaGFubmVsIEFNRCA3OUM5NDAgTUFDRSByZWdpc3RlcnMuICovCisjZGVmaW5lIE1SRUdTX1JYRklGTwkweDAwVUwJLyogUmVjZWl2ZSBGSUZPICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1RYRklGTwkweDAxVUwJLyogVHJhbnNtaXQgRklGTyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1RYRkNOVEwJMHgwMlVMCS8qIFRyYW5zbWl0IEZyYW1lIENvbnRyb2wgICAgICAgICAqLworI2RlZmluZSBNUkVHU19UWEZTVEFUCTB4MDNVTAkvKiBUcmFuc21pdCBGcmFtZSBTdGF0dXMgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhSQ05UCTB4MDRVTAkvKiBUcmFuc21pdCBSZXRyeSBDb3VudCAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUlhGQ05UTAkweDA1VUwJLyogUmVjZWl2ZSBGcmFtZSBDb250cm9sICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1JYRlNUQVQJMHgwNlVMCS8qIFJlY2VpdmUgRnJhbWUgU3RhdHVzICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19GRkNOVAkweDA3VUwJLyogRklGTyBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0lSRUcJMHgwOFVMCS8qIEludGVycnVwdCBSZWdpc3RlciAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19JTUFTSwkweDA5VUwJLyogSW50ZXJydXB0IE1hc2sgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BPTEwJMHgwYVVMCS8qIFBPTEwgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19CQ09ORklHCTB4MGJVTAkvKiBCSVUgQ29uZmlnICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfRkNPTkZJRwkweDBjVUwJLyogRklGTyBDb25maWcgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX01DT05GSUcJMHgwZFVMCS8qIE1BQyBDb25maWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19QTFNDT05GSUcJMHgwZVVMCS8qIFBMUyBDb25maWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19QSFlDT05GSUcJMHgwZlVMCS8qIFBIWSBDb25maWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19DSElQSUQxCTB4MTBVTAkvKiBDaGlwLUlELCBsb3cgYml0cyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfQ0hJUElEMgkweDExVUwJLyogQ2hpcC1JRCwgaGlnaCBiaXRzICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0lBQ09ORklHCTB4MTJVTAkvKiBJbnRlcm5hbCBBZGRyZXNzIENvbmZpZyAgICAgICAgKi8KKwkvKiAweDEzVUwsIHJlc2VydmVkICovCisjZGVmaW5lIE1SRUdTX0ZJTFRFUgkweDE0VUwJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0VUSEFERFIJMHgxNVVMCS8qIE91ciBFdGhlcm5ldCBBZGRyZXNzICAgICAgICAgICAqLworCS8qIDB4MTZVTCwgcmVzZXJ2ZWQgKi8KKwkvKiAweDE3VUwsIHJlc2VydmVkICovCisjZGVmaW5lIE1SRUdTX01QQ05UCTB4MThVTAkvKiBNaXNzZWQgUGFja2V0IENvdW50ICAgICAgICAgICAgKi8KKwkvKiAweDE5VUwsIHJlc2VydmVkICovCisjZGVmaW5lIE1SRUdTX1JQQ05UCTB4MWFVTAkvKiBSdW50IFBhY2tldCBDb3VudCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUkNDTlQJMHgxYlVMCS8qIFJYIENvbGxpc2lvbiBDb3VudCAgICAgICAgICAgICAqLworCS8qIDB4MWNVTCwgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTVJFR1NfVVRFU1QJMHgxZFVMCS8qIFVzZXIgVGVzdCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19SVEVTVDEJMHgxZVVMCS8qIFJlc2VydmVkIFRlc3QgMSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19SVEVTVDIJMHgxZlVMCS8qIFJlc2VydmVkIFRlc3QgMiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19SRUdfU0laRQkweDIwVUwKKworI2RlZmluZSBNUkVHU19UWEZDTlRMX0RSRVRSWSAgICAgICAgMHg4MCAvKiBSZXRyeSBkaXNhYmxlICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhGQ05UTF9ERkNTICAgICAgICAgIDB4MDggLyogRGlzYWJsZSBUWCBGQ1MgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1RYRkNOVExfQVVUT1BBRCAgICAgICAweDAxIC8qIFRYIGF1dG8gcGFkICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX1RYRlNUQVRfVkFMSUQgICAgICAgICAweDgwIC8qIFRYIHZhbGlkICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19UWEZTVEFUX1VOREVSRkxPVyAgICAgMHg0MCAvKiBUWCB1bmRlcmZsb3cgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhGU1RBVF9MQ09MTCAgICAgICAgIDB4MjAgLyogVFggbGF0ZSBjb2xsaXNpb24gICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1RYRlNUQVRfTVJFVFJZICAgICAgICAweDEwIC8qIFRYID4gMSByZXRyaWVzICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19UWEZTVEFUX09SRVRSWSAgICAgICAgMHgwOCAvKiBUWCAxIHJldHJ5ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhGU1RBVF9QREVGRVIgICAgICAgIDB4MDQgLyogVFggcGt0IGRlZmVycmVkICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1RYRlNUQVRfQ0xPU1MgICAgICAgICAweDAyIC8qIFRYIGNhcnJpZXIgbG9zdCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19UWEZTVEFUX1JFUlJPUiAgICAgICAgMHgwMSAvKiBUWCByZXRyeSBlcnJvciAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBNUkVHU19UWFJDTlRfRURFRkVSICAgICAgICAgMHg4MCAvKiBUWCBFeGNlc3MgZGVmZXJzICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhSQ05UX0NNQVNLICAgICAgICAgIDB4MGYgLyogVFggcmV0cnkgY291bnQgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfUlhGQ05UTF9MT1dMQVQgICAgICAgIDB4MDggLyogUlggbG93IGxhdGVuY3kgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1JYRkNOVExfQVJFSkVDVCAgICAgICAweDA0IC8qIFJYIGFkZHIgbWF0Y2ggcmVqICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19SWEZDTlRMX0FVVE9TVFJJUCAgICAgMHgwMSAvKiBSWCBhdXRvIHN0cmlwICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBNUkVHU19SWEZTVEFUX09WRVJGTE9XICAgICAgMHg4MCAvKiBSWCBvdmVyZmxvdyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUlhGU1RBVF9MQ09MTCAgICAgICAgIDB4NDAgLyogUlggbGF0ZSBjb2xsaXNpb24gICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1JYRlNUQVRfRkVSUk9SICAgICAgICAweDIwIC8qIFJYIGZyYW1pbmcgZXJyb3IgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19SWEZTVEFUX0ZDU0VSUk9SICAgICAgMHgxMCAvKiBSWCBGQ1MgZXJyb3IgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUlhGU1RBVF9SQkNOVCAgICAgICAgIDB4MGYgLyogUlggbXNnIGJ5dGUgY291bnQgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfRkZDTlRfUlggICAgICAgICAgICAgIDB4ZjAgLyogUlggRklGTyBmcmFtZSBjbnQgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0ZGQ05UX1RYICAgICAgICAgICAgICAweDBmIC8qIFRYIEZJRk8gZnJhbWUgY250ICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX0lSRUdfSkFCQkVSICAgICAgICAgICAweDgwIC8qIElSUSBKYWJiZXIgZXJyb3IgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19JUkVHX0JBQkJMRSAgICAgICAgICAgMHg0MCAvKiBJUlEgQmFiYmxlIGVycm9yICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfSVJFR19DT0xMICAgICAgICAgICAgIDB4MjAgLyogSVJRIENvbGxpc2lvbiBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0lSRUdfUkNDTyAgICAgICAgICAgICAweDEwIC8qIElSUSBDb2xsaXNpb24gY250IG92ZXJmbG93ICAgICAqLworI2RlZmluZSBNUkVHU19JUkVHX1JQS1RDTyAgICAgICAgICAgMHgwOCAvKiBJUlEgUnVudCBwYWNrZXQgY291bnQgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgTVJFR1NfSVJFR19NUEtUQ08gICAgICAgICAgIDB4MDQgLyogSVJRIG1pc3NlZCBwYWNrZXQgY250IG92ZXJmbG93ICovCisjZGVmaW5lIE1SRUdTX0lSRUdfUlhJUlEgICAgICAgICAgICAweDAyIC8qIElSUSBSWCdkIGEgcGFja2V0ICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19JUkVHX1RYSVJRICAgICAgICAgICAgMHgwMSAvKiBJUlEgVFgnZCBhIHBhY2tldCAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBNUkVHU19JTUFTS19CQUJCTEUgICAgICAgICAgMHg0MCAvKiBJTUFTSyBCYWJibGUgZXJyb3JzICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfSU1BU0tfQ09MTCAgICAgICAgICAgIDB4MjAgLyogSU1BU0sgQ29sbGlzaW9uIGVycm9ycyAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0lNQVNLX01QS1RDTyAgICAgICAgICAweDA0IC8qIElNQVNLIE1pc3NlZCBwa3QgY250IG92ZXJmbG93ICAqLworI2RlZmluZSBNUkVHU19JTUFTS19SWElSUSAgICAgICAgICAgMHgwMiAvKiBJTUFTSyBSWCBpbnRlcnJ1cHRzICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfSU1BU0tfVFhJUlEgICAgICAgICAgIDB4MDEgLyogSU1BU0sgVFggaW50ZXJydXB0cyAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfUE9MTF9UWFZBTElEICAgICAgICAgIDB4ODAgLyogVFggaXMgdmFsaWQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BPTExfVERUUiAgICAgICAgICAgICAweDQwIC8qIFRYIGRhdGEgdHJhbnNmZXIgcmVxdWVzdCAgICAgICAqLworI2RlZmluZSBNUkVHU19QT0xMX1JEVFIgICAgICAgICAgICAgMHgyMCAvKiBSWCBkYXRhIHRyYW5zZmVyIHJlcXVlc3QgICAgICAgKi8KKworI2RlZmluZSBNUkVHU19CQ09ORklHX0JTV0FQICAgICAgICAgMHg0MCAvKiBCeXRlIFN3YXAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfQkNPTkZJR180VFMgICAgICAgICAgIDB4MDAgLyogNGJ5dGUgdHJhbnNtaXQgc3RhcnQgcG9pbnQgICAgICovCisjZGVmaW5lIE1SRUdTX0JDT05GSUdfMTZUUyAgICAgICAgICAweDEwIC8qIDE2Ynl0ZSB0cmFuc21pdCBzdGFydCBwb2ludCAgICAqLworI2RlZmluZSBNUkVHU19CQ09ORklHXzY0VFMgICAgICAgICAgMHgyMCAvKiA2NGJ5dGUgdHJhbnNtaXQgc3RhcnQgcG9pbnQgICAgKi8KKyNkZWZpbmUgTVJFR1NfQkNPTkZJR18xMTJUUyAgICAgICAgIDB4MzAgLyogMTEyYnl0ZSB0cmFuc21pdCBzdGFydCBwb2ludCAgICovCisjZGVmaW5lIE1SRUdTX0JDT05GSUdfUkVTRVQgICAgICAgICAweDAxIC8qIFNXLVJlc2V0IHRoZSBNQUNFICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX0ZDT05GSUdfVFhGOCAgICAgICAgICAweDAwIC8qIFRYIGZpZm8gOCB3cml0ZSBjeWNsZXMgICAgICAgICAqLworI2RlZmluZSBNUkVHU19GQ09ORklHX1RYRjMyICAgICAgICAgMHg4MCAvKiBUWCBmaWZvIDMyIHdyaXRlIGN5Y2xlcyAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfRkNPTkZJR19UWEYxNiAgICAgICAgIDB4NDAgLyogVFggZmlmbyAxNiB3cml0ZSBjeWNsZXMgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0ZDT05GSUdfUlhGNjQgICAgICAgICAweDIwIC8qIFJYIGZpZm8gNjQgd3JpdGUgY3ljbGVzICAgICAgICAqLworI2RlZmluZSBNUkVHU19GQ09ORklHX1JYRjMyICAgICAgICAgMHgxMCAvKiBSWCBmaWZvIDMyIHdyaXRlIGN5Y2xlcyAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfRkNPTkZJR19SWEYxNiAgICAgICAgIDB4MDAgLyogUlggZmlmbyAxNiB3cml0ZSBjeWNsZXMgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0ZDT05GSUdfVEZXVSAgICAgICAgICAweDA4IC8qIFRYIGZpZm8gd2F0ZXJtYXJrIHVwZGF0ZSAgICAgICAqLworI2RlZmluZSBNUkVHU19GQ09ORklHX1JGV1UgICAgICAgICAgMHgwNCAvKiBSWCBmaWZvIHdhdGVybWFyayB1cGRhdGUgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfRkNPTkZJR19UQkVOQUIgICAgICAgIDB4MDIgLyogVFggYnVyc3QgZW5hYmxlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0ZDT05GSUdfUkJFTkFCICAgICAgICAweDAxIC8qIFJYIGJ1cnN0IGVuYWJsZSAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX01DT05GSUdfUFJPTUlTQyAgICAgICAweDgwIC8qIFByb21pc2N1b3VzIG1vZGUgZW5hYmxlICAgICAgICAqLworI2RlZmluZSBNUkVHU19NQ09ORklHX1RQRERJU0FCICAgICAgMHg0MCAvKiBUWCAycGFydCBkZWZlcnJhbCBlbmFibGUgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfTUNPTkZJR19NQkFFTkFCICAgICAgIDB4MjAgLyogTW9kaWZpZWQgYmFja29mZiBlbmFibGUgICAgICAgICovCisjZGVmaW5lIE1SRUdTX01DT05GSUdfUlBBRElTQUIgICAgICAweDA4IC8qIFJYIHBoeXNpY2FsIGFkZHIgZGlzYWJsZSAgICAgICAqLworI2RlZmluZSBNUkVHU19NQ09ORklHX1JCRElTQUIgICAgICAgMHgwNCAvKiBSWCBicm9hZGNhc3QgZGlzYWJsZSAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfTUNPTkZJR19UWEVOQUIgICAgICAgIDB4MDIgLyogRW5hYmxlIHRyYW5zbWl0dGVyICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX01DT05GSUdfUlhFTkFCICAgICAgICAweDAxIC8qIEVuYWJsZSByZWNlaXZlciAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX1BMU0NPTkZJR19UWE1TICAgICAgICAweDA4IC8qIFRYIG1vZGUgc2VsZWN0ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19QTFNDT05GSUdfR1BTSSAgICAgICAgMHgwNiAvKiBVc2UgR1BTSSBjb25uZWN0b3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUExTQ09ORklHX0RBSSAgICAgICAgIDB4MDQgLyogVXNlIERBSSBjb25uZWN0b3IgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BMU0NPTkZJR19UUCAgICAgICAgICAweDAyIC8qIFVzZSBUd2lzdGVkUGFpciBjb25uZWN0b3IgICAgICAqLworI2RlZmluZSBNUkVHU19QTFNDT05GSUdfQVVJICAgICAgICAgMHgwMCAvKiBVc2UgQVVJIGNvbm5lY3RvciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUExTQ09ORklHX0lPRU5BQiAgICAgIDB4MDEgLyogUExTIEkvTyBlbmFibGUgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfUEhZQ09ORklHX0xTVEFUICAgICAgIDB4ODAgLyogTGluayBzdGF0dXMgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BIWUNPTkZJR19MVEVTVERJUyAgICAweDQwIC8qIERpc2FibGUgbGluayB0ZXN0IGxvZ2ljICAgICAgICAqLworI2RlZmluZSBNUkVHU19QSFlDT05GSUdfUlhQT0xBUklUWSAgMHgyMCAvKiBSWCBwb2xhcml0eSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUEhZQ09ORklHX0FQQ0RJU0FCICAgIDB4MTAgLyogQXV0b1BvbGFyaXR5Q29ycmVjdCBkaXNhYiAgICAgICovCisjZGVmaW5lIE1SRUdTX1BIWUNPTkZJR19MVEVOQUIgICAgICAweDA4IC8qIFNlbGVjdCBsb3cgdGhyZXNob2xkICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19QSFlDT05GSUdfQVVUTyAgICAgICAgMHgwNCAvKiBDb25uZWN0b3IgcG9ydCBhdXRvLXNlbCAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUEhZQ09ORklHX1JXVSAgICAgICAgIDB4MDIgLyogUmVtb3RlIFdha2VVcCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BIWUNPTkZJR19BVyAgICAgICAgICAweDAxIC8qIEF1dG8gV2FrZXVwICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX0lBQ09ORklHX0FDSE5HRSAgICAgICAweDgwIC8qIERvIGFkZHJlc3MgY2hhbmdlICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19JQUNPTkZJR19QQVJFU0VUICAgICAgMHgwNCAvKiBQaHlzaWNhbCBhZGRyZXNzIHJlc2V0ICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfSUFDT05GSUdfTEFSRVNFVCAgICAgIDB4MDIgLyogTG9naWNhbCBhZGRyZXNzIHJlc2V0ICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfVVRFU1RfUlRSRU5BQiAgICAgICAgIDB4ODAgLyogRW5hYmxlIHJlc3YgdGVzdCByZWdpc3RlciAgICAgICovCisjZGVmaW5lIE1SRUdTX1VURVNUX1JUUkRJU0FCICAgICAgICAweDQwIC8qIERpc2FiIHJlc3YgdGVzdCByZWdpc3RlciAgICAgICAqLworI2RlZmluZSBNUkVHU19VVEVTVF9SUEFDQ0VQVCAgICAgICAgMHgyMCAvKiBBY2NlcHQgcnVudCBwYWNrZXRzICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVVRFU1RfRkNPTEwgICAgICAgICAgIDB4MTAgLyogRm9yY2UgY29sbGlzaW9uIHN0YXR1cyAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1VURVNUX0ZDU0VOQUIgICAgICAgICAweDA4IC8qIEVuYWJsZSBGQ1Mgb24gUlggICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19VVEVTVF9JTlRMT09QTSAgICAgICAgMHgwNiAvKiBJbnRlcm4gbHBiYWNrIHcvTUVOREVDICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVVRFU1RfSU5UTE9PUCAgICAgICAgIDB4MDQgLyogSW50ZXJuIGxwYmFjayAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1VURVNUX0VYVExPT1AgICAgICAgICAweDAyIC8qIEV4dGVybiBscGJhY2sgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19VVEVTVF9OT0xPT1AgICAgICAgICAgMHgwMCAvKiBObyBsb29wYmFjayAgICAgICAgICAgICAgICAgICAgKi8KKworc3RydWN0IHFlX3J4ZCB7CisJdTMyIHJ4X2ZsYWdzOworCXUzMiByeF9hZGRyOworfTsKKworI2RlZmluZSBSWERfT1dOICAgICAgMHg4MDAwMDAwMCAvKiBPd25lcnNoaXAuICAgICAgKi8KKyNkZWZpbmUgUlhEX1VQREFURSAgIDB4MTAwMDAwMDAgLyogQmVpbmcgVXBkYXRlZD8gICovCisjZGVmaW5lIFJYRF9MRU5HVEggICAweDAwMDAwN2ZmIC8qIFBhY2tldCBMZW5ndGguICAqLworCitzdHJ1Y3QgcWVfdHhkIHsKKwl1MzIgdHhfZmxhZ3M7CisJdTMyIHR4X2FkZHI7Cit9OworCisjZGVmaW5lIFRYRF9PV04gICAgICAweDgwMDAwMDAwIC8qIE93bmVyc2hpcC4gICAgICAqLworI2RlZmluZSBUWERfU09QICAgICAgMHg0MDAwMDAwMCAvKiBTdGFydCBPZiBQYWNrZXQgKi8KKyNkZWZpbmUgVFhEX0VPUCAgICAgIDB4MjAwMDAwMDAgLyogRW5kIE9mIFBhY2tldCAgICovCisjZGVmaW5lIFRYRF9VUERBVEUgICAweDEwMDAwMDAwIC8qIEJlaW5nIFVwZGF0ZWQ/ICAqLworI2RlZmluZSBUWERfTEVOR1RIICAgMHgwMDAwMDdmZiAvKiBQYWNrZXQgTGVuZ3RoLiAgKi8KKworI2RlZmluZSBUWF9SSU5HX01BWFNJWkUgICAyNTYKKyNkZWZpbmUgUlhfUklOR19NQVhTSVpFICAgMjU2CisKKyNkZWZpbmUgVFhfUklOR19TSVpFICAgICAgMTYKKyNkZWZpbmUgUlhfUklOR19TSVpFICAgICAgMTYKKworI2RlZmluZSBORVhUX1JYKG51bSkgICAgICAgKCgobnVtKSArIDEpICYgKFJYX1JJTkdfTUFYU0laRSAtIDEpKQorI2RlZmluZSBORVhUX1RYKG51bSkgICAgICAgKCgobnVtKSArIDEpICYgKFRYX1JJTkdfTUFYU0laRSAtIDEpKQorI2RlZmluZSBQUkVWX1JYKG51bSkgICAgICAgKCgobnVtKSAtIDEpICYgKFJYX1JJTkdfTUFYU0laRSAtIDEpKQorI2RlZmluZSBQUkVWX1RYKG51bSkgICAgICAgKCgobnVtKSAtIDEpICYgKFRYX1JJTkdfTUFYU0laRSAtIDEpKQorCisjZGVmaW5lIFRYX0JVRkZTX0FWQUlMKHFwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCgocXApLT50eF9vbGQgPD0gKHFwKS0+dHhfbmV3KSA/ICAgICAgICAgICAgICAgICAgICAgXAorCSAgKHFwKS0+dHhfb2xkICsgKFRYX1JJTkdfU0laRSAtIDEpIC0gKHFwKS0+dHhfbmV3IDogIFwKKwkJCSAgICAocXApLT50eF9vbGQgLSAocXApLT50eF9uZXcgLSAxKQorCitzdHJ1Y3QgcWVfaW5pdF9ibG9jayB7CisJc3RydWN0IHFlX3J4ZCBxZV9yeGRbUlhfUklOR19NQVhTSVpFXTsKKwlzdHJ1Y3QgcWVfdHhkIHFlX3R4ZFtUWF9SSU5HX01BWFNJWkVdOworfTsKKworI2RlZmluZSBxaWJfb2Zmc2V0KG1lbSwgZWxlbSkgXAorKChfX3UzMikoKHVuc2lnbmVkIGxvbmcpKCYoKChzdHJ1Y3QgcWVfaW5pdF9ibG9jayAqKTApLT5tZW1bZWxlbV0pKSkpCisKK3N0cnVjdCBzdW5xZTsKKworc3RydWN0IHN1bnFlYyB7CisJdm9pZCBfX2lvbWVtCQkqZ3JlZ3M7CQkvKiBRRUMgR2xvYmFsIFJlZ2lzdGVycyAgICAgICAgICovCisJc3RydWN0IHN1bnFlCQkqcWVzWzRdOwkvKiBFYWNoIGNoaWxkIE1BQ0UgICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgcWVjX2J1cnN0czsJLyogU3VwcG9ydCBidXJzdCBzaXplcyAgICAgICAgICAqLworCXN0cnVjdCBzYnVzX2RldgkJKnFlY19zZGV2OwkvKiBRRUMncyBTQlVTIGRldmljZSAgICAgICAgICAgICovCisJc3RydWN0IHN1bnFlYwkJKm5leHRfbW9kdWxlOwkvKiBMaXN0IG9mIGFsbCBRRUNzIGluIHN5c3RlbSAgICovCit9OworCisjZGVmaW5lIFBLVF9CVUZfU1oJMTY2NAorI2RlZmluZSBSWERfUEtUX1NaCTE2NjQKKworc3RydWN0IHN1bnFlX2J1ZmZlcnMgeworCXU4CXR4X2J1ZltUWF9SSU5HX1NJWkVdW1BLVF9CVUZfU1pdOworCXU4CV9fcGFkWzJdOworCXU4CXJ4X2J1ZltSWF9SSU5HX1NJWkVdW1BLVF9CVUZfU1pdOworfTsKKworI2RlZmluZSBxZWJ1Zl9vZmZzZXQobWVtLCBlbGVtKSBcCisoKF9fdTMyKSgodW5zaWduZWQgbG9uZykoJigoKHN0cnVjdCBzdW5xZV9idWZmZXJzICopMCktPm1lbVtlbGVtXVswXSkpKSkKKworc3RydWN0IHN1bnFlIHsKKwl2b2lkIF9faW9tZW0JCQkqcWNyZWdzOwkJLyogUUVDIHBlci1jaGFubmVsIFJlZ2lzdGVycyAgICovCisJdm9pZCBfX2lvbWVtCQkJKm1yZWdzOwkJLyogUGVyLWNoYW5uZWwgTUFDRSBSZWdpc3RlcnMgICovCisJc3RydWN0IHFlX2luaXRfYmxvY2sgICAgICAJKnFlX2Jsb2NrOwkvKiBSWCBhbmQgVFggZGVzY3JpcHRvcnMgICAgICAgKi8KKwlfX3UzMiAgICAgICAgICAgICAgICAgICAgICAJcWJsb2NrX2R2bWE7CS8qIFJYIGFuZCBUWCBkZXNjcmlwdG9ycyAgICAgICAqLworCXNwaW5sb2NrX3QJCQlsb2NrOwkJLyogUHJvdGVjdHMgdHhmdWxsIHN0YXRlICAgICAgICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgCXJ4X25ldywgcnhfb2xkOwkvKiBSWCByaW5nIGV4dGVudHMJICAgICAgICovCisJaW50CQkJICAgCXR4X25ldywgdHhfb2xkOwkvKiBUWCByaW5nIGV4dGVudHMJICAgICAgICovCisJc3RydWN0IHN1bnFlX2J1ZmZlcnMJCSpidWZmZXJzOwkvKiBDUFUgdmlzaWJsZSBhZGRyZXNzLiAgICAgICAgKi8KKwlfX3UzMgkJCQlidWZmZXJzX2R2bWE7CS8qIERWTUEgdmlzaWJsZSBhZGRyZXNzLiAgICAgICAqLworCXN0cnVjdCBzdW5xZWMJCQkqcGFyZW50OworCXU4CQkJCW1jb25maWc7CS8qIEJhc2UgTUFDRSBtY29uZmlnIHZhbHVlICAgICAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCQluZXRfc3RhdHM7CS8qIFN0YXRpc3RpY2FsIGNvdW50ZXJzICAgICAgICAqLworCXN0cnVjdCBzYnVzX2RldgkJCSpxZV9zZGV2OwkvKiBRRSdzIFNCVVMgZGV2aWNlIHN0cnVjdCAgICAgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZQkJKmRldjsJCS8qIFFFJ3MgbmV0ZGV2aWNlIHN0cnVjdCAgICAgICAqLworCWludAkJCQljaGFubmVsOwkvKiBXaG8gYW0gST8gICAgICAgICAgICAgICAgICAgKi8KK307CisKKyNlbmRpZiAvKiAhKF9TVU5RRV9IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGMzNTgxNS5jIGIvZHJpdmVycy9uZXQvdGMzNTgxNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZWM5ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90YzM1ODE1LmMKQEAgLTAsMCArMSwxNzQ1IEBACisvKiB0YzM1ODE1LmM6IEEgVE9TSElCQSBUQzM1ODE1Q0YgUENJIDEwLzEwME1icHMgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAKKyAqICAgICAgICAgICAgICAgIGFoZW5uZXNzeUBtdmlzdGEuY29tCisgKgorICogQmFzZWQgb24gc2tlbHRvbi5jIGJ5IERvbmFsZCBCZWNrZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBUb3NoaWJhIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbiA9CisJInRjMzU4MTUuYzp2MC4wMCAyNi8wNy8yMDAwIGJ5IFRvc2hpYmEgQ29ycG9yYXRpb25cbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qCisgKiBUaGUgbmFtZSBvZiB0aGUgY2FyZC4gSXMgdXNlZCBmb3IgbWVzc2FnZXMgYW5kIGluIHRoZSByZXF1ZXN0cyBmb3IKKyAqIGlvIHJlZ2lvbnMsIGlycXMgYW5kIGRtYSBjaGFubmVscworICovCitzdGF0aWMgY29uc3QgY2hhciogY2FyZG5hbWUgPSAiVEMzNTgxNUNGIjsKKyNkZWZpbmUgVEMzNTgxNV9QUk9DX0VOVFJZICJuZXQvdGMzNTgxNSIKKworI2RlZmluZSBUQzM1ODE1X01PRFVMRV9OQU1FICJUQzM1ODE1Q0YiCisjZGVmaW5lIFRYX1RJTUVPVVQgKDQqSFopCisKKy8qIEZpcnN0LCBhIGZldyBkZWZpbml0aW9ucyB0aGF0IHRoZSBicmF2ZSBtaWdodCBjaGFuZ2UuICovCisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLworI2lmbmRlZiBUQzM1ODE1X0RFQlVHCisjZGVmaW5lIFRDMzU4MTVfREVCVUcgMQorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IHRjMzU4MTVfZGVidWcgPSBUQzM1ODE1X0RFQlVHOworCisjZGVmaW5lIEdBVEhFUl9UWElOVAkvKiBPbi1EZW1hbmQgVHggSW50ZXJydXB0ICovCisKKyNkZWZpbmUgdnRvbm9jYWNoZShwKQlLU0VHMUFERFIodmlydF90b19waHlzKHApKQorCisvKgorICogUmVnaXN0ZXJzCisgKi8KK3N0cnVjdCB0YzM1ODE1X3JlZ3MgeworCXZvbGF0aWxlIF9fdTMyIERNQV9DdGw7CQkvKiAweDAwICovCisJdm9sYXRpbGUgX191MzIgVHhGcm1QdHI7CisJdm9sYXRpbGUgX191MzIgVHhUaHJzaDsKKwl2b2xhdGlsZSBfX3UzMiBUeFBvbGxDdHI7CisJdm9sYXRpbGUgX191MzIgQkxGcm1QdHI7CisJdm9sYXRpbGUgX191MzIgUnhGcmFnU2l6ZTsKKwl2b2xhdGlsZSBfX3UzMiBJbnRfRW47CisJdm9sYXRpbGUgX191MzIgRkRBX0JhczsKKwl2b2xhdGlsZSBfX3UzMiBGREFfTGltOwkJLyogMHgyMCAqLworCXZvbGF0aWxlIF9fdTMyIEludF9TcmM7CisJdm9sYXRpbGUgX191MzIgdW51c2VkMFsyXTsKKwl2b2xhdGlsZSBfX3UzMiBQYXVzZUNudDsKKwl2b2xhdGlsZSBfX3UzMiBSZW1QYXVDbnQ7CisJdm9sYXRpbGUgX191MzIgVHhDdGxGcm1TdGF0OworCXZvbGF0aWxlIF9fdTMyIHVudXNlZDE7CisJdm9sYXRpbGUgX191MzIgTUFDX0N0bDsJCS8qIDB4NDAgKi8KKwl2b2xhdGlsZSBfX3UzMiBDQU1fQ3RsOworCXZvbGF0aWxlIF9fdTMyIFR4X0N0bDsKKwl2b2xhdGlsZSBfX3UzMiBUeF9TdGF0OworCXZvbGF0aWxlIF9fdTMyIFJ4X0N0bDsKKwl2b2xhdGlsZSBfX3UzMiBSeF9TdGF0OworCXZvbGF0aWxlIF9fdTMyIE1EX0RhdGE7CisJdm9sYXRpbGUgX191MzIgTURfQ0E7CisJdm9sYXRpbGUgX191MzIgQ0FNX0FkcjsJCS8qIDB4NjAgKi8KKwl2b2xhdGlsZSBfX3UzMiBDQU1fRGF0YTsKKwl2b2xhdGlsZSBfX3UzMiBDQU1fRW5hOworCXZvbGF0aWxlIF9fdTMyIFBST01fQ3RsOworCXZvbGF0aWxlIF9fdTMyIFBST01fRGF0YTsKKwl2b2xhdGlsZSBfX3UzMiBBbGduX0NudDsKKwl2b2xhdGlsZSBfX3UzMiBDUkNfQ250OworCXZvbGF0aWxlIF9fdTMyIE1pc3NfQ250OworfTsKKworLyoKKyAqIEJpdCBhc3NpZ25tZW50cworICovCisvKiBETUFfQ3RsIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIERNQV9JbnRNYXNrICAgICAgICAgICAgMHgwMDA0MDAwMCAvKiAxOkludGVydXB0IG1hc2sgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERNQV9TV0ludFJlcSAgICAgICAgICAgMHgwMDAyMDAwMCAvKiAxOlNvZnR3YXJlIEludGVycnVwdCByZXF1ZXN0ICAgICovCisjZGVmaW5lIERNQV9UeFdha2VVcCAgICAgICAgICAgMHgwMDAxMDAwMCAvKiAxOlRyYW5zbWl0IFdha2UgVXAgICAgICAgICAgICAgICovCisjZGVmaW5lIERNQV9SeEJpZ0UgICAgICAgICAgICAgMHgwMDAwODAwMCAvKiAxOlJlY2VpdmUgQmlnIEVuZGlhbiAgICAgICAgICAgICovCisjZGVmaW5lIERNQV9UeEJpZ0UgICAgICAgICAgICAgMHgwMDAwNDAwMCAvKiAxOlRyYW5zbWl0IEJpZyBFbmRpYW4gICAgICAgICAgICovCisjZGVmaW5lIERNQV9UZXN0TW9kZSAgICAgICAgICAgMHgwMDAwMjAwMCAvKiAxOlRlc3QgTW9kZSAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERNQV9Qb3dyTWdtbnQgICAgICAgICAgMHgwMDAwMTAwMCAvKiAxOlBvd2VyIE1hbmFnZW1lbnQgICAgICAgICAgICAgICovCisjZGVmaW5lIERNQV9EbUJ1cnN0X01hc2sgICAgICAgMHgwMDAwMDFmYyAvKiBETUEgQnVyc3Qgc2l6ZSAgICAgICAgICAgICAgICAgICovCisKKy8qIFJ4RnJhZ1NpemUgYml0IGFzaWduIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUnhGcmFnX0VuUGFjayAgICAgICAgICAweDAwMDA4MDAwIC8qIDE6RW5hYmxlIFBhY2tpbmcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhGcmFnX01pbkZyYWdNYXNrICAgICAweDAwMDAwZmZjIC8qIE1pbmltdW0gRnJhZ21lbnQgICAgICAgICAgICAgICAgKi8KKworLyogTUFDX0N0bCBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBNQUNfTGluazEwICAgICAgICAgICAgIDB4MDAwMDgwMDAgLyogMTpMaW5rIFN0YXR1cyAxME1iaXRzICAgICAgICAgICAqLworI2RlZmluZSBNQUNfRW5NaXNzUm9sbCAgICAgICAgIDB4MDAwMDIwMDAgLyogMTpFbmFibGUgTWlzc2VkIFJvbGwgICAgICAgICAgICAqLworI2RlZmluZSBNQUNfTWlzc1JvbGwgICAgICAgICAgIDB4MDAwMDA0MDAgLyogMTpNaXNzZWQgUm9sbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQUNfTG9vcDEwICAgICAgICAgICAgIDB4MDAwMDAwODAgLyogMTpMb29wIDEwIE1icHMgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQUNfQ29ubl9BdXRvICAgICAgICAgIDB4MDAwMDAwMDAgLyowMDpDb25uZWN0aW9uIG1vZGUgKEF1dG9tYXRpYykgICAqLworI2RlZmluZSBNQUNfQ29ubl8xME0gICAgICAgICAgIDB4MDAwMDAwMjAgLyowMTogICAgICAgICAgICAgICAgKDEwTWJwcyBlbmRlYykqLworI2RlZmluZSBNQUNfQ29ubl9NbGwgICAgICAgICAgIDB4MDAwMDAwNDAgLyoxMDogICAgICAgICAgICAgICAgKE1sbCBjbG9jaykgICAqLworI2RlZmluZSBNQUNfTWFjTG9vcCAgICAgICAgICAgIDB4MDAwMDAwMTAgLyogMTpNQUMgTG9vcGJhY2sgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQUNfRnVsbER1cCAgICAgICAgICAgIDB4MDAwMDAwMDggLyogMTpGdWxsIER1cGxleCAwOkhhbGYgRHVwbGV4ICAgICAqLworI2RlZmluZSBNQUNfUmVzZXQgICAgICAgICAgICAgIDB4MDAwMDAwMDQgLyogMTpTb2Z0d2FyZSBSZXNldCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQUNfSGFsdEltbSAgICAgICAgICAgIDB4MDAwMDAwMDIgLyogMTpIYWx0IEltbWVkaWF0ZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQUNfSGFsdFJlcSAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogMTpIYWx0IHJlcXVlc3QgICAgICAgICAgICAgICAgICAqLworCisvKiBQUk9NX0N0bCBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFBST01fQnVzeSAgICAgICAgICAgICAgMHgwMDAwODAwMCAvKiAxOkJ1c3kgKFN0YXJ0IE9wZXJhdGlvbikgICAgICAgICovCisjZGVmaW5lIFBST01fUmVhZCAgICAgICAgICAgICAgMHgwMDAwNDAwMCAvKjEwOlJlYWQgb3BlcmF0aW9uICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBST01fV3JpdGUgICAgICAgICAgICAgMHgwMDAwMjAwMCAvKjAxOldyaXRlIG9wZXJhdGlvbiAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBST01fRXJhc2UgICAgICAgICAgICAgMHgwMDAwNjAwMCAvKjExOkVyYXNlIG9wZXJhdGlvbiAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjAwOkVuYWJsZSBvciBEaXNhYmxlIFdyaXR0aW5nLCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIGFzIHNwZWNpZmllZCBpbiBQUk9NX0FkZHIuICovCisjZGVmaW5lIFBST01fQWRkcl9FbmEgICAgICAgICAgMHgwMDAwMDAzMCAvKjExeHh4eDpQUk9NIFdyaXRlIGVuYWJsZSAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjAweHh4eDogICAgICAgICAgIGRpc2FibGUgICAgICAgICovCisKKy8qIENBTV9DdGwgYml0IGFzaWduIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgQ0FNX0NvbXBFbiAgICAgICAgICAgICAweDAwMDAwMDEwIC8qIDE6Q0FNIENvbXBhcmUgRW5hYmxlICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FNX05lZ0NBTSAgICAgICAgICAgICAweDAwMDAwMDA4IC8qIDE6UmVqZWN0IHBhY2tldHMgQ0FNIHJlY29nbml6ZXMsKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICBhY2NlcHQgb3RoZXIgKi8KKyNkZWZpbmUgQ0FNX0Jyb2FkQWNjICAgICAgICAgICAweDAwMDAwMDA0IC8qIDE6QnJvYWRjYXN0IGFzc2VwdCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FNX0dyb3VwQWNjICAgICAgICAgICAweDAwMDAwMDAyIC8qIDE6TXVsdGljYXN0IGFzc2VwdCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FNX1N0YXRpb25BY2MgICAgICAgICAweDAwMDAwMDAxIC8qIDE6dW5pY2FzdCBhY2NlcHQgICAgICAgICAgICAgICAgKi8KKworLyogQ0FNX0VuYSBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBDQU1fRU5UUllfTUFYICAgICAgICAgICAgICAgICAgMjEgICAvKiBDQU0gRGF0YSBlbnRyeSBtYXggY291bnQgICAgICAqLworI2RlZmluZSBDQU1fRW5hX01hc2sgKCgxPDxDQU1fRU5UUllfTUFYKS0xKSAvKiBDQU0gRW5hYmxlIGJpdHMgKE1heCAyMWJpdHMpICAqLworI2RlZmluZSBDQU1fRW5hX0JpdChpbmRleCkgICAgICAgICAoMTw8KGluZGV4KSkKKyNkZWZpbmUgQ0FNX0VOVFJZX0RFU1RJTkFUSU9OCTAKKyNkZWZpbmUgQ0FNX0VOVFJZX1NPVVJDRQkxCisjZGVmaW5lIENBTV9FTlRSWV9NQUNDVEwJMjAKKworLyogVHhfQ3RsIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBUeF9FbiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogMTpUcmFuc21pdCBlbmFibGUgICAgICAgICAgICAgICAqLworI2RlZmluZSBUeF9UeEhhbHQgICAgICAgICAgICAgIDB4MDAwMDAwMDIgLyogMTpUcmFuc21pdCBIYWx0IFJlcXVlc3QgICAgICAgICAqLworI2RlZmluZSBUeF9Ob1BhZCAgICAgICAgICAgICAgIDB4MDAwMDAwMDQgLyogMTpTdXBwcmVzcyBQYWRkaW5nICAgICAgICAgICAgICAqLworI2RlZmluZSBUeF9Ob0NSQyAgICAgICAgICAgICAgIDB4MDAwMDAwMDggLyogMTpTdXBwcmVzcyBQYWRkaW5nICAgICAgICAgICAgICAqLworI2RlZmluZSBUeF9GQmFjayAgICAgICAgICAgICAgIDB4MDAwMDAwMTAgLyogMTpGYXN0IEJhY2stb2ZmICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUeF9FblVuZGVyICAgICAgICAgICAgIDB4MDAwMDAxMDAgLyogMTpFbmFibGUgVW5kZXJydW4gICAgICAgICAgICAgICAqLworI2RlZmluZSBUeF9FbkV4RGVmZXIgICAgICAgICAgIDB4MDAwMDAyMDAgLyogMTpFbmFibGUgRXhjZXNzaXZlIERlZmVycmFsICAgICAqLworI2RlZmluZSBUeF9FbkxDYXJyICAgICAgICAgICAgIDB4MDAwMDA0MDAgLyogMTpFbmFibGUgTG9zdCBDYXJyaWVyICAgICAgICAgICAqLworI2RlZmluZSBUeF9FbkV4Q29sbCAgICAgICAgICAgIDB4MDAwMDA4MDAgLyogMTpFbmFibGUgRXhjZXNzaXZlIENvbGxpc2lvbiAgICAqLworI2RlZmluZSBUeF9FbkxhdGVDb2xsICAgICAgICAgIDB4MDAwMDEwMDAgLyogMTpFbmFibGUgTGF0ZSBDb2xsaXNpb24gICAgICAgICAqLworI2RlZmluZSBUeF9FblR4UGFyICAgICAgICAgICAgIDB4MDAwMDIwMDAgLyogMTpFbmFibGUgVHJhbnNtaXQgUGFyaXR5ICAgICAgICAqLworI2RlZmluZSBUeF9FbkNvbXAgICAgICAgICAgICAgIDB4MDAwMDQwMDAgLyogMTpFbmFibGUgQ29tcGxldGlvbiAgICAgICAgICAgICAqLworCisvKiBUeF9TdGF0IGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFR4X1R4Q29sbF9NQVNLICAgICAgICAgMHgwMDAwMDAwRiAvKiBUeCBDb2xsaXNpb24gQ291bnQgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0V4Q29sbCAgICAgICAgICAgICAgMHgwMDAwMDAxMCAvKiBFeGNlc3NpdmUgQ29sbGlzaW9uICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X1RYRGVmZXIgICAgICAgICAgICAgMHgwMDAwMDAyMCAvKiBUcmFuc21pdCBEZWZlcmVkICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X1BhdXNlZCAgICAgICAgICAgICAgMHgwMDAwMDA0MCAvKiBUcmFuc21pdCBQYXVzZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0ludFR4ICAgICAgICAgICAgICAgMHgwMDAwMDA4MCAvKiBJbnRlcnJ1cHQgb24gVHggICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X1VuZGVyICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAvKiBVbmRlcnJ1biAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0RlZmVyICAgICAgICAgICAgICAgMHgwMDAwMDIwMCAvKiBEZWZlcnJhbCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X05DYXJyICAgICAgICAgICAgICAgMHgwMDAwMDQwMCAvKiBObyBDYXJyaWVyICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4XzEwU3RhdCAgICAgICAgICAgICAgMHgwMDAwMDgwMCAvKiAxME1icHMgU3RhdHVzICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0xhdGVDb2xsICAgICAgICAgICAgMHgwMDAwMTAwMCAvKiBMYXRlIENvbGxpc2lvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X1R4UGFyICAgICAgICAgICAgICAgMHgwMDAwMjAwMCAvKiBUeCBQYXJpdHkgRXJyb3IgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0NvbXAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMCAvKiBDb21wbGV0aW9uICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0hhbHRlZCAgICAgICAgICAgICAgMHgwMDAwODAwMCAvKiBUeCBIYWx0ZWQgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X1NRRXJyICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAvKiBTaWduYWwgUXVhbGl0eSBFcnJvcihTUUUpICAgICAgICovCisKKy8qIFJ4X0N0bCBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUnhfRW5Hb29kICAgICAgICAgICAgICAweDAwMDA0MDAwIC8qIDE6RW5hYmxlIEdvb2QgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfRW5SeFBhciAgICAgICAgICAgICAweDAwMDAyMDAwIC8qIDE6RW5hYmxlIFJlY2VpdmUgUGFyaXR5ICAgICAgICAgKi8KKyNkZWZpbmUgUnhfRW5Mb25nRXJyICAgICAgICAgICAweDAwMDAwODAwIC8qIDE6RW5hYmxlIExvbmcgRXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfRW5PdmVyICAgICAgICAgICAgICAweDAwMDAwNDAwIC8qIDE6RW5hYmxlIE92ZXJGbG93ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfRW5DUkNFcnIgICAgICAgICAgICAweDAwMDAwMjAwIC8qIDE6RW5hYmxlIENSQyBFcnJvciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfRW5BbGlnbiAgICAgICAgICAgICAweDAwMDAwMTAwIC8qIDE6RW5hYmxlIEFsaWdubWVudCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfSWdub3JlQ1JDICAgICAgICAgICAweDAwMDAwMDQwIC8qIDE6SWdub3JlIENSQyBWYWx1ZSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfU3RyaXBDUkMgICAgICAgICAgICAweDAwMDAwMDEwIC8qIDE6U3RyaXAgQ1JDIFZhbHVlICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfU2hvcnRFbiAgICAgICAgICAgICAweDAwMDAwMDA4IC8qIDE6U2hvcnQgRW5hYmxlICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfTG9uZ0VuICAgICAgICAgICAgICAweDAwMDAwMDA0IC8qIDE6TG9uZyBFbmFibGUgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfUnhIYWx0ICAgICAgICAgICAgICAweDAwMDAwMDAyIC8qIDE6UmVjZWl2ZSBIYWx0IFJlcXVlc3QgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfUnhFbiAgICAgICAgICAgICAgICAweDAwMDAwMDAxIC8qIDE6UmVjZWl2ZSBJbnRycnVwdCBFbmFibGUgICAgICAgKi8KKworLyogUnhfU3RhdCBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSeF9IYWx0ZWQgICAgICAgICAgICAgIDB4MDAwMDgwMDAgLyogUnggSGFsdGVkICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9Hb29kICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAgLyogUnggR29vZCAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9SeFBhciAgICAgICAgICAgICAgIDB4MDAwMDIwMDAgLyogUnggUGFyaXR5IEVycm9yICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAwMDEwMDAgICAgbm90IHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9Mb25nRXJyICAgICAgICAgICAgIDB4MDAwMDA4MDAgLyogUnggTG9uZyBFcnJvciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9PdmVyICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAgLyogUnggT3ZlcmZsb3cgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9DUkNFcnIgICAgICAgICAgICAgIDB4MDAwMDAyMDAgLyogUnggQ1JDIEVycm9yICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9BbGlnbiAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgLyogUnggQWxpZ25tZW50IEVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF8xMFN0YXQgICAgICAgICAgICAgIDB4MDAwMDAwODAgLyogUnggMTBNYnBzIFN0YXR1cyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9JbnRSeCAgICAgICAgICAgICAgIDB4MDAwMDAwNDAgLyogUnggSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9DdGxSZWNkICAgICAgICAgICAgIDB4MDAwMDAwMjAgLyogUnggQ29udHJvbCBSZWNlaXZlICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJ4X1N0YXRfTWFzayAgICAgICAgICAgMHgwMDAwRUZDMCAvKiBSeCBBbGwgU3RhdHVzIE1hc2sgICAgICAgICAgICAgICovCisKKy8qIEludF9FbiBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgSW50X05SQWJ0RW4gICAgICAgICAgICAweDAwMDAwODAwIC8qIDE6Tm9uLXJlY292ZXJhYmxlIEFib3J0IEVuYWJsZSAgKi8KKyNkZWZpbmUgSW50X1R4Q3RsQ21wRW4gICAgICAgICAweDAwMDAwNDAwIC8qIDE6VHJhbnNtaXQgQ29udHJvbCBDb21wbGV0ZSBFbmFibGUgKi8KKyNkZWZpbmUgSW50X0RtUGFyRXJyRW4gICAgICAgICAweDAwMDAwMjAwIC8qIDE6RE1BIFBhcml0eSBFcnJvciBFbmFibGUgICAgICAgKi8KKyNkZWZpbmUgSW50X0RQYXJERW4gICAgICAgICAgICAweDAwMDAwMTAwIC8qIDE6RGF0YSBQYXJpdHkgRXJyb3IgRW5hYmxlICAgICAgKi8KKyNkZWZpbmUgSW50X0Vhck5vdEVuICAgICAgICAgICAweDAwMDAwMDgwIC8qIDE6RWFybHkgTm90aWZ5IEVuYWJsZSAgICAgICAgICAgKi8KKyNkZWZpbmUgSW50X0RQYXJFcnJFbiAgICAgICAgICAweDAwMDAwMDQwIC8qIDE6RGV0ZWN0ZWQgUGFyaXR5IEVycm9yIEVuYWJsZSAgKi8KKyNkZWZpbmUgSW50X1NTeXNFcnJFbiAgICAgICAgICAweDAwMDAwMDIwIC8qIDE6U2lnbmFsbGVkIFN5c3RlbSBFcnJvciBFbmFibGUgKi8KKyNkZWZpbmUgSW50X1JNYXNBYnRFbiAgICAgICAgICAweDAwMDAwMDEwIC8qIDE6UmVjZWl2ZWQgTWFzdGVyIEFib3J0IEVuYWJsZSAgKi8KKyNkZWZpbmUgSW50X1JUYXJnQWJ0RW4gICAgICAgICAweDAwMDAwMDA4IC8qIDE6UmVjZWl2ZWQgVGFyZ2V0IEFib3J0IEVuYWJsZSAgKi8KKyNkZWZpbmUgSW50X1NUYXJnQWJ0RW4gICAgICAgICAweDAwMDAwMDA0IC8qIDE6U2lnbmFsbGVkIFRhcmdldCBBYm9ydCBFbmFibGUgKi8KKyNkZWZpbmUgSW50X0JMRXhFbiAgICAgICAgICAgICAweDAwMDAwMDAyIC8qIDE6QnVmZmVyIExpc3QgRXhoYXVzdGVkIEVuYWJsZSAgKi8KKyNkZWZpbmUgSW50X0ZEQUV4RW4gICAgICAgICAgICAweDAwMDAwMDAxIC8qIDE6RnJlZSBEZXNjcmlwdG9yIEFyZWEgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgRXhoYXVzdGVkIEVuYWJsZSAgKi8KKworLyogSW50X1NyYyBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBJbnRfTlJhYnQgICAgICAgICAgICAgIDB4MDAwMDQwMDAgLyogMTpOb24gUmVjb3ZlcmFibGUgZXJyb3IgICAgICAgICAqLworI2RlZmluZSBJbnRfRG1QYXJFcnJTdGF0ICAgICAgIDB4MDAwMDIwMDAgLyogMTpETUEgUGFyaXR5IEVycm9yICYgQ2xlYXIgICAgICAqLworI2RlZmluZSBJbnRfQkxFeCAgICAgICAgICAgICAgIDB4MDAwMDEwMDAgLyogMTpCdWZmZXIgTGlzdCBFbXB0eSAmIENsZWFyICAgICAqLworI2RlZmluZSBJbnRfRkRBRXggICAgICAgICAgICAgIDB4MDAwMDA4MDAgLyogMTpGREEgRW1wdHkgJiBDbGVhciAgICAgICAgICAgICAqLworI2RlZmluZSBJbnRfSW50TlJBYnQgICAgICAgICAgIDB4MDAwMDA0MDAgLyogMTpOb24gUmVjb3ZlcmFibGUgQWJvcnQgICAgICAgICAqLworI2RlZmluZQlJbnRfSW50Q21wICAgICAgICAgICAgIDB4MDAwMDAyMDAgLyogMTpNQUMgY29udHJvbCBwYWNrZXQgY29tcGxldGUgICAqLworI2RlZmluZSBJbnRfSW50RXhCRCAgICAgICAgICAgIDB4MDAwMDAxMDAgLyogMTpJbnRlcnJ1cHQgRXh0cmEgQkQgJiBDbGVhciAgICAqLworI2RlZmluZSBJbnRfRG1QYXJFcnIgICAgICAgICAgIDB4MDAwMDAwODAgLyogMTpETUEgUGFyaXR5IEVycm9yICYgQ2xlYXIgICAgICAqLworI2RlZmluZSBJbnRfSW50RWFyTm90ICAgICAgICAgIDB4MDAwMDAwNDAgLyogMTpSZWNlaXZlIERhdGEgd3JpdGUgJiBDbGVhciAgICAqLworI2RlZmluZSBJbnRfU1dJbnQgICAgICAgICAgICAgIDB4MDAwMDAwMjAgLyogMTpTb2Z0d2FyZSByZXF1ZXN0ICYgQ2xlYXIgICAgICAqLworI2RlZmluZSBJbnRfSW50QkxFeCAgICAgICAgICAgIDB4MDAwMDAwMTAgLyogMTpCdWZmZXIgTGlzdCBFbXB0eSAmIENsZWFyICAgICAqLworI2RlZmluZSBJbnRfSW50RkRBRXggICAgICAgICAgIDB4MDAwMDAwMDggLyogMTpGREEgRW1wdHkgJiBDbGVhciAgICAgICAgICAgICAqLworI2RlZmluZSBJbnRfSW50UENJICAgICAgICAgICAgIDB4MDAwMDAwMDQgLyogMTpQQ0kgY29udHJvbGxlciAmIENsZWFyICAgICAgICAqLworI2RlZmluZSBJbnRfSW50TWFjUnggICAgICAgICAgIDB4MDAwMDAwMDIgLyogMTpSeCBjb250cm9sbGVyICYgQ2xlYXIgICAgICAgICAqLworI2RlZmluZSBJbnRfSW50TWFjVHggICAgICAgICAgIDB4MDAwMDAwMDEgLyogMTpUeCBjb250cm9sbGVyICYgQ2xlYXIgICAgICAgICAqLworCisvKiBNRF9DQSBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIE1EX0NBX1ByZVN1cCAgICAgICAgICAgMHgwMDAwMTAwMCAvKiAxOlByZWFtYmxlIFN1cHJlc3MgICAgICAgICAgICAgICovCisjZGVmaW5lIE1EX0NBX0J1c3kgICAgICAgICAgICAgMHgwMDAwMDgwMCAvKiAxOkJ1c3kgKFN0YXJ0IE9wZXJhdGlvbikgICAgICAgICovCisjZGVmaW5lIE1EX0NBX1dyICAgICAgICAgICAgICAgMHgwMDAwMDQwMCAvKiAxOldyaXRlIDA6UmVhZCAgICAgICAgICAgICAgICAgICovCisKKworLyogTUlJIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgTUlJX0NPTlRST0wgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIE1JSV9TVEFUVVMgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNSUlfUEhZX0lEMCAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTUlJX1BIWV9JRDEgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIE1JSV9BTkFSICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBNSUlfQU5MUEFSICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgTUlJX0FORVIgICAgICAgICAgICAgICAgMHgwMDA2CisvKiBNSUkgQ29udHJvbCByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIE1JSUNOVExfRkRYICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBNSUlDTlRMX1JTVF9BVVRPICAgICAgICAweDAyMDAKKyNkZWZpbmUgTUlJQ05UTF9JU09MQVRFICAgICAgICAgMHgwNDAwCisjZGVmaW5lIE1JSUNOVExfUFdSRFdOICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBNSUlDTlRMX0FVVE8gICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgTUlJQ05UTF9TUEVFRCAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIE1JSUNOVExfTFBCSyAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBNSUlDTlRMX1JFU0VUICAgICAgICAgICAweDgwMDAKKy8qIE1JSSBTdGF0dXMgcmVnaXN0ZXIgYml0IHNpZ25pZmljYW5jZS4gKi8KKyNkZWZpbmUgTUlJU1RBVF9FWFQgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1JSVNUQVRfSkFCICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNSUlTVEFUX0xJTksgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgTUlJU1RBVF9DQU5fQVVUTyAgICAgICAgMHgwMDA4CisjZGVmaW5lIE1JSVNUQVRfRkFVTFQgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBNSUlTVEFUX0FVVE9fRE9ORSAgICAgICAweDAwMjAKKyNkZWZpbmUgTUlJU1RBVF9DQU5fVCAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIE1JSVNUQVRfQ0FOX1RfRkRYICAgICAgIDB4MTAwMAorI2RlZmluZSBNSUlTVEFUX0NBTl9UWCAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgTUlJU1RBVF9DQU5fVFhfRkRYICAgICAgMHg0MDAwCisjZGVmaW5lIE1JSVNUQVRfQ0FOX1Q0ICAgICAgICAgIDB4ODAwMAorLyogTUlJIEF1dG8tTmVnb3RpYXRpb24gRXhwYW5zaW9uL1JlbW90ZUVuZCBSZWdpc3RlciBCaXRzICovCisjZGVmaW5lIE1JSV9BTl9UWF9GRFggICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBNSUlfQU5fVFhfSERYICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgTUlJX0FOXzEwX0ZEWCAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIE1JSV9BTl8xMF9IRFggICAgICAgICAgIDB4MDAyMAorCisKKy8qCisgKiBEZXNjcmlwdG9ycworICovCisKKy8qIEZyYW1lIGRlc2NyaXB0ZXIgKi8KK3N0cnVjdCBGRGVzYyB7CisJdm9sYXRpbGUgX191MzIgRkROZXh0OworCXZvbGF0aWxlIF9fdTMyIEZEU3lzdGVtOworCXZvbGF0aWxlIF9fdTMyIEZEU3RhdDsKKwl2b2xhdGlsZSBfX3UzMiBGREN0bDsKK307CisKKy8qIEJ1ZmZlciBkZXNjcmlwdGVyICovCitzdHJ1Y3QgQkRlc2MgeworCXZvbGF0aWxlIF9fdTMyIEJ1ZmZEYXRhOworCXZvbGF0aWxlIF9fdTMyIEJEQ3RsOworfTsKKworI2RlZmluZSBGRF9BTElHTgkxNgorCisvKiBGcmFtZSBEZXNjcmlwdGVyIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEZEX0ZETGVuZ3RoX01BU0sgICAgICAgMHgwMDAwRkZGRiAvKiBMZW5ndGggTUFTSyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEX0JEQ250X01BU0sgICAgICAgICAgMHgwMDFGMDAwMCAvKiBCRCBjb3VudCBNQVNLIGluIEZEICAgICAgICAgICAgICovCisjZGVmaW5lIEZEX0ZybU9wdF9NQVNLICAgICAgICAgMHg3QzAwMDAwMCAvKiBGcmFtZSBvcHRpb24gTUFTSyAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEX0ZybU9wdF9CaWdFbmRpYW4gICAgMHg0MDAwMDAwMCAvKiBUeC9SeCAqLworI2RlZmluZSBGRF9Gcm1PcHRfSW50VHggICAgICAgIDB4MjAwMDAwMDAgLyogVHggb25seSAqLworI2RlZmluZSBGRF9Gcm1PcHRfTm9DUkMgICAgICAgIDB4MTAwMDAwMDAgLyogVHggb25seSAqLworI2RlZmluZSBGRF9Gcm1PcHRfTm9QYWRkaW5nICAgIDB4MDgwMDAwMDAgLyogVHggb25seSAqLworI2RlZmluZSBGRF9Gcm1PcHRfUGFja2luZyAgICAgIDB4MDQwMDAwMDAgLyogUnggb25seSAqLworI2RlZmluZSBGRF9Db3duc0ZEICAgICAgICAgICAgIDB4ODAwMDAwMDAgLyogRkQgQ29udHJvbGxlciBvd25lciBiaXQgICAgICAgICAqLworI2RlZmluZSBGRF9OZXh0X0VPTCAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogRkQgRU9MIGluZGljYXRvciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRF9CRENudF9TSElGVCAgICAgICAgIDE2CisKKy8qIEJ1ZmZlciBEZXNjcmlwdGVyIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgQkRfQnVmZkxlbmd0aF9NQVNLICAgICAweDAwMDBGRkZGIC8qIFJlY2lldmUgRGF0YSBTaXplICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQkRfUnhCRElEX01BU0sgICAgICAgICAweDAwRkYwMDAwIC8qIEJEIElEIE51bWJlciBNQVNLICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQkRfUnhCRFNlcU5fTUFTSyAgICAgICAweDdGMDAwMDAwIC8qIFJ4IEJEIFNlcXVlbmNlIE51bWJlciAgICAgICAgICAgKi8KKyNkZWZpbmUgQkRfQ293bnNCRCAgICAgICAgICAgICAweDgwMDAwMDAwIC8qIEJEIENvbnRyb2xsZXIgb3duZXIgYml0ICAgICAgICAgKi8KKyNkZWZpbmUgQkRfUnhCRElEX1NISUZUICAgICAgICAxNgorI2RlZmluZSBCRF9SeEJEU2VxTl9TSElGVCAgICAgIDI0CisKKworLyogU29tZSB1c2VmdWwgY29uc3RhbnRzLiAqLworI3VuZGVmIE5PX0NIRUNLX0NBUlJJRVIJLyogRG9lcyBub3QgY2hlY2sgTm8tQ2FycmllciB3aXRoIFRQICovCisKKyNpZmRlZiBOT19DSEVDS19DQVJSSUVSCisjZGVmaW5lIFRYX0NUTF9DTUQJKFR4X0VuQ29tcCB8IFR4X0VuVHhQYXIgfCBUeF9FbkxhdGVDb2xsIHwgXAorCVR4X0VuRXhDb2xsIHwgVHhfRW5MQ2FyciB8IFR4X0VuRXhEZWZlciB8IFR4X0VuVW5kZXIgfCBcCisJVHhfRW4pCS8qIG1heWJlICAweDdkMDEgKi8KKyNlbHNlCisjZGVmaW5lIFRYX0NUTF9DTUQJKFR4X0VuQ29tcCB8IFR4X0VuVHhQYXIgfCBUeF9FbkxhdGVDb2xsIHwgXAorCVR4X0VuRXhDb2xsIHwgVHhfRW5FeERlZmVyIHwgVHhfRW5VbmRlciB8IFwKKwlUeF9FbikJLyogbWF5YmUgIDB4N2YwMSAqLworI2VuZGlmCisjZGVmaW5lIFJYX0NUTF9DTUQJKFJ4X0VuR29vZCB8IFJ4X0VuUnhQYXIgfCBSeF9FbkxvbmdFcnIgfCBSeF9Fbk92ZXIgXAorCXwgUnhfRW5DUkNFcnIgfCBSeF9FbkFsaWduIHwgUnhfUnhFbikJLyogbWF5YmUgMHg2ZjAxICovCisKKyNkZWZpbmUgSU5UX0VOX0NNRCAgKEludF9OUkFidEVuIHwgXAorCSBJbnRfRFBhckRFbiB8IEludF9EUGFyRXJyRW4gfCBcCisJSW50X1NTeXNFcnJFbiAgfCBJbnRfUk1hc0FidEVuIHwgSW50X1JUYXJnQWJ0RW4gfCBcCisJSW50X1NUYXJnQWJ0RW4gfCBcCisJSW50X0JMRXhFbiAgfCBJbnRfRkRBRXhFbikgLyogbWF5YmUgMHhiN2YqLworCisvKiBUdW5pbmcgcGFyYW1ldGVycyAqLworI2RlZmluZSBETUFfQlVSU1RfU0laRQkzMgorI2RlZmluZSBUWF9USFJFU0hPTEQJMTAyNAorCisjZGVmaW5lIEZEX1BBR0VfTlVNIDIKKyNkZWZpbmUgRkRfUEFHRV9PUkRFUiAxCisvKiAxNiArIFJYX0JVRl9QQUdFUyAqIDggKyBSWF9GRF9OVU0gKiAxNiArIFRYX0ZEX05VTSAqIDMyIDw9IFBBR0VfU0laRSoyICovCisjZGVmaW5lIFJYX0JVRl9QQUdFUwk4CS8qID49IDIgKi8KKyNkZWZpbmUgUlhfRkRfTlVNCTI1MAkvKiA+PSAzMiAqLworI2RlZmluZSBUWF9GRF9OVU0JMTI4CisKK3N0cnVjdCBUeEZEIHsKKwlzdHJ1Y3QgRkRlc2MgZmQ7CisJc3RydWN0IEJEZXNjIGJkOworCXN0cnVjdCBCRGVzYyB1bnVzZWQ7Cit9OworCitzdHJ1Y3QgUnhGRCB7CisJc3RydWN0IEZEZXNjIGZkOworCXN0cnVjdCBCRGVzYyBiZFswXTsJLyogdmFyaWFibGUgbGVuZ3RoICovCit9OworCitzdHJ1Y3QgRnJGRCB7CisJc3RydWN0IEZEZXNjIGZkOworCXN0cnVjdCBCRGVzYyBiZFtSWF9CVUZfUEFHRVNdOworfTsKKworCitleHRlcm4gdW5zaWduZWQgbG9uZyB0Y19yZWFkbCh2b2xhdGlsZSBfX3UzMiAqYWRkcik7CitleHRlcm4gdm9pZCB0Y193cml0ZWwodW5zaWduZWQgbG9uZyBkYXRhLCB2b2xhdGlsZSBfX3UzMiAqYWRkcik7CisKK2RtYV9hZGRyX3QgcHJpdl9kbWFfaGFuZGxlOworCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3N0cnVjdCB0YzM1ODE1X2xvY2FsIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dF9tb2R1bGU7CisKKwkvKiBzdGF0aXN0aWNzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHsKKwkJaW50IG1heF90eF9xbGVuOworCQlpbnQgdHhfaW50czsKKwkJaW50IHJ4X2ludHM7CisJfSBsc3RhdHM7CisKKwlpbnQgdGJ1c3k7CisJaW50IG9wdGlvbjsKKyNkZWZpbmUgVEMzNTgxNV9PUFRfQVVUTwkweDAwCisjZGVmaW5lIFRDMzU4MTVfT1BUXzEwTQkweDAxCisjZGVmaW5lIFRDMzU4MTVfT1BUXzEwME0JMHgwMgorI2RlZmluZSBUQzM1ODE1X09QVF9GVUxMRFVQCTB4MDQKKwlpbnQgbGlua3NwZWVkOwkvKiAxMCBvciAxMDAgKi8KKwlpbnQgZnVsbGR1cGxleDsKKworCS8qCisJICogVHJhbnNtaXR0aW5nOiBCYXRjaCBNb2RlLgorCSAqCTEgQkQgaW4gMSBUeEZELgorCSAqIFJlY2VpdmluZzogUGFja2luZyBNb2RlLgorCSAqCTEgY2lyY3VsYXIgRkQgZm9yIEZyZWUgQnVmZmVyIExpc3QuCisJICoJUlhfQlVHX1BBR0VTIEJEIGluIEZyZWUgQnVmZmVyIEZELgorCSAqCU9uZSBGcmVlIEJ1ZmZlciBCRCBoYXMgUEFHRV9TSVpFIGRhdGEgYnVmZmVyLgorCSAqLworICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlkbWFfYWRkcl90IGZkX2J1Zl9kbWFfaGFuZGxlOworCXZvaWQgKiBmZF9idWY7CS8qIGZvciBUeEZELCBUeEZELCBGckZEICovCisJc3RydWN0IFR4RkQgKnRmZF9iYXNlOworCWludCB0ZmRfc3RhcnQ7CisJaW50IHRmZF9lbmQ7CisJc3RydWN0IFJ4RkQgKnJmZF9iYXNlOworCXN0cnVjdCBSeEZEICpyZmRfbGltaXQ7CisJc3RydWN0IFJ4RkQgKnJmZF9jdXI7CisJc3RydWN0IEZyRkQgKmZibF9wdHI7CisJdW5zaWduZWQgY2hhciBmYmxfY3VyaWQ7CisJZG1hX2FkZHJfdCBkYXRhX2J1Zl9kbWFfaGFuZGxlW1JYX0JVRl9QQUdFU107CisJdm9pZCAqIGRhdGFfYnVmW1JYX0JVRl9QQUdFU107CQkvKiBwYWNraW5nICovCisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0YzM1ODE1X3Byb2JlMShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgaW50IGJhc2VfYWRkciwgdW5zaWduZWQgaW50IGlycSk7CisKK3N0YXRpYyBpbnQJdGMzNTgxNV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAl0YzM1ODE1X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgIHRjMzU4MTVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCB0YzM1ODE1X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkCXRjMzU4MTVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAl0YzM1ODE1X3R4ZG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJdGMzNTgxNV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QJbmV0X2RldmljZV9zdGF0cyAqdGMzNTgxNV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAl0YzM1ODE1X3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgCXRjMzU4MTVfY2hpcF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0YzM1ODE1X2NoaXBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0YzM1ODE1X3BoeV9jaGlwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEEgbGlzdCBvZiBhbGwgaW5zdGFsbGVkIHRjMzU4MTUgZGV2aWNlcy4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcm9vdF90YzM1ODE1X2RldiA9IE5VTEw7CisKKy8qCisgKiBQQ0kgZGV2aWNlIGlkZW50aWZpZXJzIGZvciAibmV3IHN0eWxlIiBMaW51eCBQQ0kgRGV2aWNlIERyaXZlcnMKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRjMzU4MTVfcGNpX3RibFtdID0geworICAgIHsgUENJX1ZFTkRPUl9JRF9UT1NISUJBXzIsIFBDSV9ERVZJQ0VfSURfVE9TSElCQV9UQzM1ODE1Q0YsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKyAgICB7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgdGMzNTgxNV9wY2lfdGJsKTsKKworaW50Cit0YzM1ODE1X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCBlcnIgPSAwOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBwY2lfbWVtYWRkcjsKKwl1bnNpZ25lZCBpbnQgcGNpX2lycV9saW5lOworCisJcHJpbnRrKEtFUk5fSU5GTyAidGMzNTgxNV9wcm9iZTogZm91bmQgZGV2aWNlICUjMDh4LiUjMDh4XG4iLCBlbnQtPnZlbmRvciwgZW50LT5kZXZpY2UpOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworICAgICAgICBwY2lfbWVtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMSk7CisKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiICAgIHBjaV9tZW1hZGRyPSUjMDhseCAgcmVzb3VyY2VfZmxhZ3M9JSMwOGx4XG4iLCBwY2lfbWVtYWRkciwgcGNpX3Jlc291cmNlX2ZsYWdzIChwZGV2LCAwKSk7CisKKwlpZiAoIXBjaV9tZW1hZGRyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5vIFBDSSBNRU0gcmVzb3VyY2VzLCBhYm9ydGluZ1xuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisJcGNpX2lycV9saW5lID0gcGRldi0+aXJxOworCS8qIGlycSBkaXNhYmxlZC4gKi8KKwlpZiAocGNpX2lycV9saW5lID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibm8gUENJIGlycSwgYWJvcnRpbmdcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcmV0ID0gIHRjMzU4MTVfcHJvYmUxKHBkZXYsIHBjaV9tZW1hZGRyLCBwY2lfaXJxX2xpbmUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dDsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRjMzU4MTVfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBpbnQgYmFzZV9hZGRyLCB1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQgPSAwOworCWludCBpLCByZXQ7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwOworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkvKiBBbGxvY2F0ZSBhIG5ldyAnZGV2JyBpZiBuZWVkZWQuICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCB0YzM1ODE1X2xvY2FsKSk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogYWxsb2NfZXRoZXJkZXYgYWxsb2NzIGFuZCB6ZXJvcyBkZXYtPnByaXYKKwkgKi8KKwlscCA9IGRldi0+cHJpdjsKKworCWlmICh0YzM1ODE1X2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIiwgdmVyc2lvbik7CisKKwkvKiBGaWxsIGluIHRoZSAnZGV2JyBmaWVsZHMuICovCisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKGJhc2VfYWRkciwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgdGMzNTgxNV9yZWdzKSk7CisJaWYgKCFkZXYtPmJhc2VfYWRkcikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCXRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOworCisJdGMzNTgxNV9jaGlwX3Jlc2V0KGRldik7CisKKwkvKiBSZXRyaWV2ZSBhbmQgcHJpbnQgdGhlIGV0aGVybmV0IGFkZHJlc3MuICovCisJd2hpbGUgKHRjX3JlYWRsKCZ0ci0+UFJPTV9DdGwpICYgUFJPTV9CdXN5KQorCQk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkgKz0gMikgeworCQl1bnNpZ25lZCBzaG9ydCBkYXRhOworCQl0Y193cml0ZWwoUFJPTV9CdXN5IHwgUFJPTV9SZWFkIHwgKGkgLyAyICsgMiksICZ0ci0+UFJPTV9DdGwpOworCQl3aGlsZSAodGNfcmVhZGwoJnRyLT5QUk9NX0N0bCkgJiBQUk9NX0J1c3kpCisJCQk7CisJCWRhdGEgPSB0Y19yZWFkbCgmdHItPlBST01fRGF0YSk7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSBkYXRhICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkcltpKzFdID0gZGF0YSA+PiA4OworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJbHAtPnBkZXYgPSBwZGV2OworCWxwLT5uZXh0X21vZHVsZSA9IHJvb3RfdGMzNTgxNV9kZXY7CisJcm9vdF90YzM1ODE1X2RldiA9IGRldjsKKworCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisKKwlpZiAoZGV2LT5tZW1fc3RhcnQgPiAwKSB7CisJCWxwLT5vcHRpb24gPSBkZXYtPm1lbV9zdGFydDsKKwkJaWYgKChscC0+b3B0aW9uICYgVEMzNTgxNV9PUFRfMTBNKSAmJgorCQkgICAgKGxwLT5vcHRpb24gJiBUQzM1ODE1X09QVF8xMDBNKSkgeworCQkJLyogaWYgYm90aCBzcGVlZCBzcGVmaWNpZWQsIGF1dG8gc2VsZWN0LiAqLworCQkJbHAtPm9wdGlvbiAmPSB+KFRDMzU4MTVfT1BUXzEwTSB8IFRDMzU4MTVfT1BUXzEwME0pOworCQl9CisJfQorCS8vWFhYIGZpeG1lCisgICAgICAgIGxwLT5vcHRpb24gfD0gVEMzNTgxNV9PUFRfMTBNOworCisJLyogZG8gYXV0byBuZWdvdGlhdGlvbiAqLworCXRjMzU4MTVfcGh5X2NoaXBfaW5pdChkZXYpOworCisJZGV2LT5vcGVuCQk9IHRjMzU4MTVfb3BlbjsKKwlkZXYtPnN0b3AJCT0gdGMzNTgxNV9jbG9zZTsKKwlkZXYtPnR4X3RpbWVvdXQgICAgICAgICA9IHRjMzU4MTVfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvICAgICA9IFRYX1RJTUVPVVQ7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSB0YzM1ODE1X3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzCQk9IHRjMzU4MTVfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gdGMzNTgxNV9zZXRfbXVsdGljYXN0X2xpc3Q7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBmb3VuZCBhdCAlI3gsIGlycSAlZCwgTUFDIiwKKwkgICAgICAgZGV2LT5uYW1lLCBjYXJkbmFtZSwgYmFzZV9hZGRyLCBpcnEpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCJcbiIpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rc3BlZWQgJWRNYnBzLCAlcyBEdXBsZXhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgbHAtPmxpbmtzcGVlZCwgbHAtPmZ1bGxkdXBsZXggPyAiRnVsbCIgOiAiSGFsZiIpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaW91bm1hcDoKKwlpb3VubWFwKCh2b2lkICopIGRldi0+YmFzZV9hZGRyKTsKK2Vycl9vdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQKK3RjMzU4MTVfaW5pdF9xdWV1ZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmZF9hZGRyOworCisJaWYgKCFscC0+ZmRfYnVmKSB7CisJCWlmIChzaXplb2Yoc3RydWN0IEZEZXNjKSArCisJCSAgICBzaXplb2Yoc3RydWN0IEJEZXNjKSAqIFJYX0JVRl9QQUdFUyArCisJCSAgICBzaXplb2Yoc3RydWN0IEZEZXNjKSAqIFJYX0ZEX05VTSArCisJCSAgICBzaXplb2Yoc3RydWN0IFR4RkQpICogVFhfRkRfTlVNID4gUEFHRV9TSVpFICogRkRfUEFHRV9OVU0pIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnZhbGlkIFF1ZXVlIFNpemUuXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlpZiAoKGxwLT5mZF9idWYgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgRkRfUEFHRV9PUkRFUikpID09IDApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX0JVRl9QQUdFUzsgaSsrKSB7CisJCQlpZiAoKGxwLT5kYXRhX2J1ZltpXSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpKSA9PSAwKSB7CisJCQkJd2hpbGUgKC0taSA+PSAwKSB7CisJCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylscC0+ZGF0YV9idWZbaV0pOworCQkJCQlscC0+ZGF0YV9idWZbaV0gPSAwOworCQkJCX0KKwkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpbHAtPmZkX2J1Zik7CisJCQkJbHAtPmZkX2J1ZiA9IDA7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisjaWZkZWYgX19taXBzX18KKwkJCWRtYV9jYWNoZV93YmFja19pbnYoKHVuc2lnbmVkIGxvbmcpbHAtPmRhdGFfYnVmW2ldLCBQQUdFX1NJWkUgKiBGRF9QQUdFX05VTSk7CisjZW5kaWYKKwkJfQorI2lmZGVmIF9fbWlwc19fCisJCWRtYV9jYWNoZV93YmFja19pbnYoKHVuc2lnbmVkIGxvbmcpbHAtPmZkX2J1ZiwgUEFHRV9TSVpFICogRkRfUEFHRV9OVU0pOworI2VuZGlmCisJfSBlbHNlIHsKKwkJY2xlYXJfcGFnZShscC0+ZmRfYnVmKTsKKyNpZmRlZiBfX21pcHNfXworCQlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKWxwLT5mZF9idWYsIFBBR0VfU0laRSAqIEZEX1BBR0VfTlVNKTsKKyNlbmRpZgorCX0KKyNpZmRlZiBfX21pcHNfXworCWZkX2FkZHIgPSAodW5zaWduZWQgbG9uZyl2dG9ub2NhY2hlKGxwLT5mZF9idWYpOyAgCisjZWxzZQorCWZkX2FkZHIgPSAodW5zaWduZWQgbG9uZylscC0+ZmRfYnVmOworI2VuZGlmCisKKwkvKiBGcmVlIERlc2NyaXB0b3JzIChmb3IgUmVjZWl2ZSkgKi8KKwlscC0+cmZkX2Jhc2UgPSAoc3RydWN0IFJ4RkQgKilmZF9hZGRyOworCWZkX2FkZHIgKz0gc2l6ZW9mKHN0cnVjdCBSeEZEKSAqIFJYX0ZEX05VTTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfRkRfTlVNOyBpKyspIHsKKwkJbHAtPnJmZF9iYXNlW2ldLmZkLkZEQ3RsID0gY3B1X3RvX2xlMzIoRkRfQ293bnNGRCk7CisJfQorCWxwLT5yZmRfY3VyID0gbHAtPnJmZF9iYXNlOworCWxwLT5yZmRfbGltaXQgPSAoc3RydWN0IFJ4RkQgKikoZmRfYWRkciAtCisJCQkJCXNpemVvZihzdHJ1Y3QgRkRlc2MpIC0KKwkJCQkJc2l6ZW9mKHN0cnVjdCBCRGVzYykgKiAzMCk7CisKKwkvKiBUcmFuc21pdCBEZXNjcmlwdG9ycyAqLworCWxwLT50ZmRfYmFzZSA9IChzdHJ1Y3QgVHhGRCAqKWZkX2FkZHI7CisJZmRfYWRkciArPSBzaXplb2Yoc3RydWN0IFR4RkQpICogVFhfRkRfTlVNOworCWZvciAoaSA9IDA7IGkgPCBUWF9GRF9OVU07IGkrKykgeworCQlscC0+dGZkX2Jhc2VbaV0uZmQuRkROZXh0ID0gY3B1X3RvX2xlMzIodmlydF90b19idXMoJmxwLT50ZmRfYmFzZVtpKzFdKSk7CisJCWxwLT50ZmRfYmFzZVtpXS5mZC5GRFN5c3RlbSA9IGNwdV90b19sZTMyKDApOworCQlscC0+dGZkX2Jhc2VbaV0uZmQuRkRDdGwgPSBjcHVfdG9fbGUzMigwKTsKKwl9CisJbHAtPnRmZF9iYXNlW1RYX0ZEX05VTS0xXS5mZC5GRE5leHQgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cygmbHAtPnRmZF9iYXNlWzBdKSk7CisJbHAtPnRmZF9zdGFydCA9IDA7CisJbHAtPnRmZF9lbmQgPSAwOworCisJLyogQnVmZmVyIExpc3QgKGZvciBSZWNlaXZlKSAqLworCWxwLT5mYmxfcHRyID0gKHN0cnVjdCBGckZEICopZmRfYWRkcjsKKwlscC0+ZmJsX3B0ci0+ZmQuRkROZXh0ID0gY3B1X3RvX2xlMzIodmlydF90b19idXMobHAtPmZibF9wdHIpKTsKKwlscC0+ZmJsX3B0ci0+ZmQuRkRDdGwgPSBjcHVfdG9fbGUzMihSWF9CVUZfUEFHRVMgfCBGRF9Db3duc0ZEKTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfQlVGX1BBR0VTOyBpKyspIHsKKwkJbHAtPmZibF9wdHItPmJkW2ldLkJ1ZmZEYXRhID0gY3B1X3RvX2xlMzIodmlydF90b19idXMobHAtPmRhdGFfYnVmW2ldKSk7CisJCS8qIEJESUQgaXMgaW5kZXggb2YgRnJGRC5iZFtdICovCisJCWxwLT5mYmxfcHRyLT5iZFtpXS5CREN0bCA9CisJCQljcHVfdG9fbGUzMihCRF9Db3duc0JEIHwgKGkgPDwgQkRfUnhCRElEX1NISUZUKSB8IFBBR0VfU0laRSk7CisJfQorCWxwLT5mYmxfY3VyaWQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit0YzM1ODE1X2NsZWFyX3F1ZXVlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUWF9GRF9OVU07IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopCisJCQlsZTMyX3RvX2NwdShscC0+dGZkX2Jhc2VbaV0uZmQuRkRTeXN0ZW0pOworCQlpZiAoc2tiKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJbHAtPnRmZF9iYXNlW2ldLmZkLkZEU3lzdGVtID0gY3B1X3RvX2xlMzIoMCk7CisJfQorCisJdGMzNTgxNV9pbml0X3F1ZXVlcyhkZXYpOworfQorCitzdGF0aWMgdm9pZAordGMzNTgxNV9mcmVlX3F1ZXVlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCWlmIChscC0+dGZkX2Jhc2UpIHsKKwkJZm9yIChpID0gMDsgaSA8IFRYX0ZEX05VTTsgaSsrKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopCisJCQkJbGUzMl90b19jcHUobHAtPnRmZF9iYXNlW2ldLmZkLkZEU3lzdGVtKTsKKwkJCWlmIChza2IpCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCWxwLT50ZmRfYmFzZVtpXS5mZC5GRFN5c3RlbSA9IGNwdV90b19sZTMyKDApOworCQl9CisJfQorCisJbHAtPnJmZF9iYXNlID0gTlVMTDsKKwlscC0+cmZkX2Jhc2UgPSBOVUxMOworCWxwLT5yZmRfbGltaXQgPSBOVUxMOworCWxwLT5yZmRfY3VyID0gTlVMTDsKKwlscC0+ZmJsX3B0ciA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfQlVGX1BBR0VTOyBpKyspIHsKKwkJaWYgKGxwLT5kYXRhX2J1ZltpXSkKKwkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylscC0+ZGF0YV9idWZbaV0pOworCQlscC0+ZGF0YV9idWZbaV0gPSAwOworCX0KKwlpZiAobHAtPmZkX2J1ZikKKwkJX19mcmVlX3BhZ2VzKGxwLT5mZF9idWYsIEZEX1BBR0VfT1JERVIpOworCWxwLT5mZF9idWYgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZHVtcF90eGZkKHN0cnVjdCBUeEZEICpmZCkKK3sKKwlwcmludGsoIlR4RkQoJXApOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCBmZCwKKwkgICAgICAgbGUzMl90b19jcHUoZmQtPmZkLkZETmV4dCksCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GRFN5c3RlbSksCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GRFN0YXQpLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+ZmQuRkRDdGwpKTsKKwlwcmludGsoIkJEOiAiKTsKKwlwcmludGsoIiAlMDh4ICUwOHgiLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+YmQuQnVmZkRhdGEpLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+YmQuQkRDdGwpKTsKKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyBpbnQKK2R1bXBfcnhmZChzdHJ1Y3QgUnhGRCAqZmQpCit7CisJaW50IGksIGJkX2NvdW50ID0gKGxlMzJfdG9fY3B1KGZkLT5mZC5GREN0bCkgJiBGRF9CRENudF9NQVNLKSA+PiBGRF9CRENudF9TSElGVDsKKwlpZiAoYmRfY291bnQgPiA4KQorCQliZF9jb3VudCA9IDg7CisJcHJpbnRrKCJSeEZEKCVwKTogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwgZmQsCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GRE5leHQpLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+ZmQuRkRTeXN0ZW0pLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+ZmQuRkRTdGF0KSwKKwkgICAgICAgbGUzMl90b19jcHUoZmQtPmZkLkZEQ3RsKSk7CisJaWYgKGxlMzJfdG9fY3B1KGZkLT5mZC5GREN0bCkgJiBGRF9Db3duc0ZEKQorCSAgICByZXR1cm4gMDsKKwlwcmludGsoIkJEOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgYmRfY291bnQ7IGkrKykKKwkJcHJpbnRrKCIgJTA4eCAlMDh4IiwKKwkJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5iZFtpXS5CdWZmRGF0YSksCisJCSAgICAgICBsZTMyX3RvX2NwdShmZC0+YmRbaV0uQkRDdGwpKTsKKwlwcmludGsoIlxuIik7CisJcmV0dXJuIGJkX2NvdW50OworfQorCitzdGF0aWMgdm9pZAorZHVtcF9mcmZkKHN0cnVjdCBGckZEICpmZCkKK3sKKwlpbnQgaTsKKwlwcmludGsoIkZyRkQoJXApOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCBmZCwKKwkgICAgICAgbGUzMl90b19jcHUoZmQtPmZkLkZETmV4dCksCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GRFN5c3RlbSksCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GRFN0YXQpLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+ZmQuRkRDdGwpKTsKKwlwcmludGsoIkJEOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfQlVGX1BBR0VTOyBpKyspCisJCXByaW50aygiICUwOHggJTA4eCIsCisJCSAgICAgICBsZTMyX3RvX2NwdShmZC0+YmRbaV0uQnVmZkRhdGEpLAorCQkgICAgICAgbGUzMl90b19jcHUoZmQtPmJkW2ldLkJEQ3RsKSk7CisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMgdm9pZAorcGFuaWNfcXVldWVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBpOworCisJcHJpbnRrKCJUeEZEIGJhc2UgJXAsIHN0YXJ0ICVkLCBlbmQgJWRcbiIsCisJICAgICAgIGxwLT50ZmRfYmFzZSwgbHAtPnRmZF9zdGFydCwgbHAtPnRmZF9lbmQpOworCXByaW50aygiUnhGRCBiYXNlICVwIGxpbWl0ICVwIGN1ciAlcFxuIiwKKwkgICAgICAgbHAtPnJmZF9iYXNlLCBscC0+cmZkX2xpbWl0LCBscC0+cmZkX2N1cik7CisJcHJpbnRrKCJGckZEICVwXG4iLCBscC0+ZmJsX3B0cik7CisJZm9yIChpID0gMDsgaSA8IFRYX0ZEX05VTTsgaSsrKQorCQlkdW1wX3R4ZmQoJmxwLT50ZmRfYmFzZVtpXSk7CisJZm9yIChpID0gMDsgaSA8IFJYX0ZEX05VTTsgaSsrKSB7CisJCWludCBiZF9jb3VudCA9IGR1bXBfcnhmZCgmbHAtPnJmZF9iYXNlW2ldKTsKKwkJaSArPSAoYmRfY291bnQgKyAxKSAvIDI7CS8qIHNraXAgQkRzICovCisJfQorCWR1bXBfZnJmZChscC0+ZmJsX3B0cik7CisJcGFuaWMoIiVzOiBJbGxlZ2FsIHF1ZXVlIHN0YXRlLiIsIGRldi0+bmFtZSk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBwcmludF9idWYoY2hhciAqYWRkLCBpbnQgbGVuZ3RoKQoreworCWludCBpOworCWludCBsZW4gPSBsZW5ndGg7CisKKwlwcmludGsoInByaW50X2J1ZiglMDh4KSgleClcbiIsICh1bnNpZ25lZCBpbnQpIGFkZCxsZW5ndGgpOworCisJaWYgKGxlbiA+IDEwMCkKKwkJbGVuID0gMTAwOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlwcmludGsoIiAlMi4yWCIsICh1bnNpZ25lZCBjaGFyKSBhZGRbaV0pOworCQlpZiAoIShpICUgMTYpKQorCQkJcHJpbnRrKCJcbiIpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgcHJpbnRfZXRoKGNoYXIgKmFkZCkKK3sKKwlpbnQgaTsKKworCXByaW50aygicHJpbnRfZXRoKCUwOHgpXG4iLCAodW5zaWduZWQgaW50KSBhZGQpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUyLjJYIiwgKHVuc2lnbmVkIGNoYXIpIGFkZFtpICsgNl0pOworCXByaW50aygiID0+Iik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMlgiLCAodW5zaWduZWQgY2hhcikgYWRkW2ldKTsKKwlwcmludGsoIiA6ICUyLjJYJTIuMlhcbiIsICh1bnNpZ25lZCBjaGFyKSBhZGRbMTJdLCAodW5zaWduZWQgY2hhcikgYWRkWzEzXSk7Cit9CisKKy8qCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICogc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCitzdGF0aWMgaW50Cit0YzM1ODE1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJLyoKKwkgKiBUaGlzIGlzIHVzZWQgaWYgdGhlIGludGVycnVwdCBsaW5lIGNhbiB0dXJuZWQgb2ZmIChzaGFyZWQpLgorCSAqIFNlZSAzYzUwMy5jIGZvciBhbiBleGFtcGxlIG9mIHNlbGVjdGluZyB0aGUgSVJRIGF0IGNvbmZpZy10aW1lLgorCSAqLworCisJaWYgKGRldi0+aXJxID09IDAgIHx8CisJICAgIHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmdGMzNTgxNV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBjYXJkbmFtZSwgZGV2KSkgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwl0YzM1ODE1X2NoaXBfcmVzZXQoZGV2KTsKKworCWlmICh0YzM1ODE1X2luaXRfcXVldWVzKGRldikgIT0gMCkgeworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogUmVzZXQgdGhlIGhhcmR3YXJlIGhlcmUuIERvbid0IGZvcmdldCB0byBzZXQgdGhlIHN0YXRpb24gYWRkcmVzcy4gKi8KKwl0YzM1ODE1X2NoaXBfaW5pdChkZXYpOworCisJbHAtPnRidXN5ID0gMDsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRjMzU4MTVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciA9IChzdHJ1Y3QgdGMzNTgxNV9yZWdzICopZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlI2x4XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHRjX3JlYWRsKCZ0ci0+VHhfU3RhdCkpOworCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLiAqLworCXRjMzU4MTVfY2hpcF9yZXNldChkZXYpOworCXRjMzU4MTVfY2xlYXJfcXVldWVzKGRldik7CisJdGMzNTgxNV9jaGlwX2luaXQoZGV2KTsKKwlscC0+dGJ1c3k9MDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCB0YzM1ODE1X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MgKilkZXYtPmJhc2VfYWRkcjsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJLyoKKwkJICogSWYgd2UgZ2V0IGhlcmUsIHNvbWUgaGlnaGVyIGxldmVsIGhhcyBkZWNpZGVkIHdlIGFyZSBicm9rZW4uCisJCSAqIFRoZXJlIHNob3VsZCByZWFsbHkgYmUgYSAia2ljayBtZSIgZnVuY3Rpb24gY2FsbCBpbnN0ZWFkLgorCQkgKi8KKwkJaW50IHRpY2tzc29mYXIgPSBqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydDsKKwkJaWYgKHRpY2tzc29mYXIgPCA1KQorCQkJcmV0dXJuIDE7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlI2x4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCB0Y19yZWFkbCgmdHItPlR4X1N0YXQpKTsKKwkJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuICovCisJCXRjMzU4MTVfY2hpcF9yZXNldChkZXYpOworCQl0YzM1ODE1X2NsZWFyX3F1ZXVlcyhkZXYpOworCQl0YzM1ODE1X2NoaXBfaW5pdChkZXYpOworCQlscC0+dGJ1c3k9MDsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwkvKgorCSAqIEJsb2NrIGEgdGltZXItYmFzZWQgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4gVGhpcyBjb3VsZCBiZXR0ZXIgYmUKKwkgKiBkb25lIHdpdGggYXRvbWljX3N3YXAoMSwgbHAtPnRidXN5KSwgYnV0IHNldF9iaXQoKSB3b3JrcyBhcyB3ZWxsLgorCSAqLworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkKikmbHAtPnRidXN5KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdHRlciBhY2Nlc3MgY29uZmxpY3QuXG4iLCBkZXYtPm5hbWUpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0gZWxzZSB7CisJCXNob3J0IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCQl1bnNpZ25lZCBjaGFyICpidWYgPSBza2ItPmRhdGE7CisJCXN0cnVjdCBUeEZEICp0eGZkID0gJmxwLT50ZmRfYmFzZVtscC0+dGZkX3N0YXJ0XTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJbHAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisKKyNpZmRlZiBfX21pcHNfXworCQlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKWJ1ZiwgbGVuZ3RoKTsKKyNlbmRpZgorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJCS8qIGZhaWxzYWZlLi4uICovCisJCWlmIChscC0+dGZkX3N0YXJ0ICE9IGxwLT50ZmRfZW5kKQorCQkJdGMzNTgxNV90eGRvbmUoZGV2KTsKKworCisJCXR4ZmQtPmJkLkJ1ZmZEYXRhID0gY3B1X3RvX2xlMzIodmlydF90b19idXMoYnVmKSk7CisKKwkJdHhmZC0+YmQuQkRDdGwgPSBjcHVfdG9fbGUzMihsZW5ndGgpOworCQl0eGZkLT5mZC5GRFN5c3RlbSA9IGNwdV90b19sZTMyKChfX3UzMilza2IpOworCQl0eGZkLT5mZC5GREN0bCA9IGNwdV90b19sZTMyKEZEX0Nvd25zRkQgfCAoMSA8PCBGRF9CRENudF9TSElGVCkpOworCisJCWlmIChscC0+dGZkX3N0YXJ0ID09IGxwLT50ZmRfZW5kKSB7CisJCQkvKiBTdGFydCBETUEgVHJhbnNtaXR0ZXIuICovCisJCQl0eGZkLT5mZC5GRE5leHQgfD0gY3B1X3RvX2xlMzIoRkRfTmV4dF9FT0wpOworI2lmZGVmIEdBVEhFUl9UWElOVAorCQkJdHhmZC0+ZmQuRkRDdGwgfD0gY3B1X3RvX2xlMzIoRkRfRnJtT3B0X0ludFR4KTsKKyNlbmRpZgorCQkJaWYgKHRjMzU4MTVfZGVidWcgPiAyKSB7CisJCQkJcHJpbnRrKCIlczogc3RhcnRpbmcgVHhGRC5cbiIsIGRldi0+bmFtZSk7CisJCQkJZHVtcF90eGZkKHR4ZmQpOworCQkJCWlmICh0YzM1ODE1X2RlYnVnID4gMykKKwkJCQkJcHJpbnRfZXRoKGJ1Zik7CisJCQl9CisJCQl0Y193cml0ZWwodmlydF90b19idXModHhmZCksICZ0ci0+VHhGcm1QdHIpOworCQl9IGVsc2UgeworCQkJdHhmZC0+ZmQuRkROZXh0ICY9IGNwdV90b19sZTMyKH5GRF9OZXh0X0VPTCk7CisJCQlpZiAodGMzNTgxNV9kZWJ1ZyA+IDIpIHsKKwkJCQlwcmludGsoIiVzOiBxdWV1ZWluZyBUeEZELlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlkdW1wX3R4ZmQodHhmZCk7CisJCQkJaWYgKHRjMzU4MTVfZGVidWcgPiAzKQorCQkJCQlwcmludF9ldGgoYnVmKTsKKwkJCX0KKwkJfQorCQlscC0+dGZkX3N0YXJ0ID0gKGxwLT50ZmRfc3RhcnQgKyAxKSAlIFRYX0ZEX05VTTsKKworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCQlpZiAoKGxwLT50ZmRfc3RhcnQgKyAxKSAlIFRYX0ZEX05VTSAhPSBscC0+dGZkX2VuZCkgeworCQkJLyogd2UgY2FuIHNlbmQgYW5vdGhlciBwYWNrZXQgKi8KKwkJCWxwLT50YnVzeSA9IDA7CisJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQl9IGVsc2UgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJaWYgKHRjMzU4MTVfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUeEZEIEV4aGF1c3RlZC5cbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBGQVRBTF9FUlJPUl9JTlQgXAorCShJbnRfSW50UENJIHwgSW50X0RtUGFyRXJyIHwgSW50X0ludE5SQWJ0KQorc3RhdGljIHZvaWQgdGMzNTgxNV9mYXRhbF9lcnJvcl9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXR1cykKK3sKKwlzdGF0aWMgaW50IGNvdW50OworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGYXRhbCBFcnJvciBJbnR0ZXJydXB0ICglI3gpOiIsCisJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiBJbnRfSW50UENJKQorCQlwcmludGsoIiBJbnRQQ0kiKTsKKwlpZiAoc3RhdHVzICYgSW50X0RtUGFyRXJyKQorCQlwcmludGsoIiBEbVBhckVyciIpOworCWlmIChzdGF0dXMgJiBJbnRfSW50TlJBYnQpCisJCXByaW50aygiIEludE5SQWJ0Iik7CisJcHJpbnRrKCJcbiIpOworCWlmIChjb3VudCsrID4gMTAwKQorCQlwYW5pYygiJXM6IFRvbyBtYW55IGZhdGFsIGVycm9ycy4iLCBkZXYtPm5hbWUpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXNldHRpbmcgJXMuLi5cbiIsIGRldi0+bmFtZSwgY2FyZG5hbWUpOworCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLiAqLworCXRjMzU4MTVfY2hpcF9yZXNldChkZXYpOworCXRjMzU4MTVfY2xlYXJfcXVldWVzKGRldik7CisJdGMzNTgxNV9jaGlwX2luaXQoZGV2KTsKK30KKworLyoKKyAqIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisgKiAgIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIGlycXJldHVybl90IHRjMzU4MTVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IHRjMzU4MTVfcmVncyAqdHI7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwOworCWludCBzdGF0dXMsIGJvZ3VzY291bnQgPSAwOworCWludCBoYW5kbGVkID0gMDsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGNhcmRuYW1lLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJdHIgPSAoc3RydWN0IHRjMzU4MTVfcmVncyopZGV2LT5iYXNlX2FkZHI7CisJbHAgPSBkZXYtPnByaXY7CisKKwlkbyB7CisJCXN0YXR1cyA9IHRjX3JlYWRsKCZ0ci0+SW50X1NyYyk7CisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCWJyZWFrOworCQloYW5kbGVkID0gMTsKKwkJdGNfd3JpdGVsKHN0YXR1cywgJnRyLT5JbnRfU3JjKTsJLyogd3JpdGUgdG8gY2xlYXIgKi8KKworCQkvKiBGYXRhbCBlcnJvcnMuLi4gKi8KKwkJaWYgKHN0YXR1cyAmIEZBVEFMX0VSUk9SX0lOVCkgeworCQkJdGMzNTgxNV9mYXRhbF9lcnJvcl9pbnRlcnJ1cHQoZGV2LCBzdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwkJLyogcmVjb3ZlcmFibGUgZXJyb3JzICovCisJCWlmIChzdGF0dXMgJiBJbnRfSW50RkRBRXgpIHsKKwkJCS8qIGRpc2FibGUgRkRBRXggaW50LiAodW50aWwgd2UgbWFrZSByb29tcy4uLikgKi8KKwkJCXRjX3dyaXRlbCh0Y19yZWFkbCgmdHItPkludF9FbikgJiB+SW50X0ZEQUV4RW4sICZ0ci0+SW50X0VuKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IEZyZWUgRGVzY3JpcHRvciBBcmVhIEV4aGF1c3RlZCAoJSN4KS5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJfQorCQlpZiAoc3RhdHVzICYgSW50X0ludEJMRXgpIHsKKwkJCS8qIGRpc2FibGUgQkxFeCBpbnQuICh1bnRpbCB3ZSBtYWtlIHJvb21zLi4uKSAqLworCQkJdGNfd3JpdGVsKHRjX3JlYWRsKCZ0ci0+SW50X0VuKSAmIH5JbnRfQkxFeEVuLCAmdHItPkludF9Fbik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBCdWZmZXIgTGlzdCBFeGhhdXN0ZWQgKCUjeCkuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCX0KKwkJaWYgKHN0YXR1cyAmIEludF9JbnRFeEJEKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBFeGNlc3NpdmUgQnVmZmVyIERlc2NyaXB0aW9ycyAoJSN4KS5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJfQorCQkvKiBub3JtYWwgbm90aWZpY2F0aW9uICovCisJCWlmIChzdGF0dXMgJiBJbnRfSW50TWFjUngpIHsKKwkJCS8qIEdvdCBhIHBhY2tldChzKS4gKi8KKwkJCWxwLT5sc3RhdHMucnhfaW50cysrOworCQkJdGMzNTgxNV9yeChkZXYpOworCQl9CisJCWlmIChzdGF0dXMgJiBJbnRfSW50TWFjVHgpIHsKKwkJCWxwLT5sc3RhdHMudHhfaW50cysrOworCQkJdGMzNTgxNV90eGRvbmUoZGV2KTsKKwkJfQorCX0gd2hpbGUgKCsrYm9ndXNjb3VudCA8IDIwKSA7CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuICovCitzdGF0aWMgdm9pZAordGMzNTgxNV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciA9IChzdHJ1Y3QgdGMzNTgxNV9yZWdzKilkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgZmRjdGw7CisJaW50IGk7CisJaW50IGJ1Zl9mcmVlX2NvdW50ID0gMDsKKwlpbnQgZmRfZnJlZV9jb3VudCA9IDA7CisKKwl3aGlsZSAoISgoZmRjdGwgPSBsZTMyX3RvX2NwdShscC0+cmZkX2N1ci0+ZmQuRkRDdGwpKSAmIEZEX0Nvd25zRkQpKSB7CisJCWludCBzdGF0dXMgPSBsZTMyX3RvX2NwdShscC0+cmZkX2N1ci0+ZmQuRkRTdGF0KTsKKwkJaW50IHBrdF9sZW4gPSBmZGN0bCAmIEZEX0ZETGVuZ3RoX01BU0s7CisJCXN0cnVjdCBSeEZEICpuZXh0X3JmZDsKKwkJaW50IGJkX2NvdW50ID0gKGZkY3RsICYgRkRfQkRDbnRfTUFTSykgPj4gRkRfQkRDbnRfU0hJRlQ7CisKKwkJaWYgKHRjMzU4MTVfZGVidWcgPiAyKQorCQkJZHVtcF9yeGZkKGxwLT5yZmRfY3VyKTsKKwkJaWYgKHN0YXR1cyAmIFJ4X0dvb2QpIHsKKwkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJCQlpbnQgY3VyX2JkLCBvZmZzZXQ7CisKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQkJCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKTsgLyogKzI6IGZvciByZXNlcnZlICovCisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsgICAvKiAxNiBiaXQgYWxpZ25tZW50ICovCisJCQlza2ItPmRldiA9IGRldjsKKworCQkJZGF0YSA9IHNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKworCQkJLyogY29weSBmcm9tIHJlY2VpdmUgYnVmZmVyICovCisJCQljdXJfYmQgPSAwOworCQkJb2Zmc2V0ID0gMDsKKwkJCXdoaWxlIChvZmZzZXQgPCBwa3RfbGVuICYmIGN1cl9iZCA8IGJkX2NvdW50KSB7CisJCQkJaW50IGxlbiA9IGxlMzJfdG9fY3B1KGxwLT5yZmRfY3VyLT5iZFtjdXJfYmRdLkJEQ3RsKSAmCisJCQkJCUJEX0J1ZmZMZW5ndGhfTUFTSzsKKwkJCQl2b2lkICpyeGJ1ZiA9CisJCQkJCWJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGxwLT5yZmRfY3VyLT5iZFtjdXJfYmRdLkJ1ZmZEYXRhKSk7CisjaWZkZWYgX19taXBzX18KKwkJCQlkbWFfY2FjaGVfaW52KCh1bnNpZ25lZCBsb25nKXJ4YnVmLCBsZW4pOworI2VuZGlmCisJCQkJbWVtY3B5KGRhdGEgKyBvZmZzZXQsIHJ4YnVmLCBsZW4pOworCQkJCW9mZnNldCArPSBsZW47CisJCQkJY3VyX2JkKys7CisJCQl9CisjaWYgMAorCQkJcHJpbnRfYnVmKGRhdGEscGt0X2xlbik7CisjZW5kaWYKKwkJCWlmICh0YzM1ODE1X2RlYnVnID4gMykKKwkJCQlwcmludF9ldGgoZGF0YSk7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCX0gZWxzZSB7CisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkvKiBXT1JLQVJPVU5EOiBMb25nRXJyIGFuZCBDUkNFcnIgbWVhbnMgT3ZlcmZsb3cuICovCisJCQlpZiAoKHN0YXR1cyAmIFJ4X0xvbmdFcnIpICYmIChzdGF0dXMgJiBSeF9DUkNFcnIpKSB7CisJCQkJc3RhdHVzICY9IH4oUnhfTG9uZ0VycnxSeF9DUkNFcnIpOworCQkJCXN0YXR1cyB8PSBSeF9PdmVyOworCQkJfQorCQkJaWYgKHN0YXR1cyAmIFJ4X0xvbmdFcnIpIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUnhfT3ZlcikgbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUnhfQ1JDRXJyKSBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFJ4X0FsaWduKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCX0KKworCQlpZiAoYmRfY291bnQgPiAwKSB7CisJCQkvKiBwdXQgRnJlZSBCdWZmZXIgYmFjayB0byBjb250cm9sbGVyICovCisJCQlpbnQgYmRjdGwgPSBsZTMyX3RvX2NwdShscC0+cmZkX2N1ci0+YmRbYmRfY291bnQgLSAxXS5CREN0bCk7CisJCQl1bnNpZ25lZCBjaGFyIGlkID0KKwkJCQkoYmRjdGwgJiBCRF9SeEJESURfTUFTSykgPj4gQkRfUnhCRElEX1NISUZUOworCQkJaWYgKGlkID49IFJYX0JVRl9QQUdFUykgeworCQkJCXByaW50aygiJXM6IGludmFsaWQgQkRJRC5cbiIsIGRldi0+bmFtZSk7CisJCQkJcGFuaWNfcXVldWVzKGRldik7CisJCQl9CisJCQkvKiBmcmVlIG9sZCBidWZmZXJzICovCisJCQl3aGlsZSAobHAtPmZibF9jdXJpZCAhPSBpZCkgeworCQkJCWJkY3RsID0gbGUzMl90b19jcHUobHAtPmZibF9wdHItPmJkW2xwLT5mYmxfY3VyaWRdLkJEQ3RsKTsKKwkJCQlpZiAoYmRjdGwgJiBCRF9Db3duc0JEKSB7CisJCQkJCXByaW50aygiJXM6IEZyZWVpbmcgaW52YWxpZCBCRC5cbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCQlwYW5pY19xdWV1ZXMoZGV2KTsKKwkJCQl9CisJCQkJLyogcGFzcyBCRCB0byBjb250cm9sZXIgKi8KKwkJCQkvKiBOb3RlOiBCRExlbmd0aCB3YXMgbW9kaWZpZWQgYnkgY2hpcC4gKi8KKwkJCQlscC0+ZmJsX3B0ci0+YmRbbHAtPmZibF9jdXJpZF0uQkRDdGwgPQorCQkJCQljcHVfdG9fbGUzMihCRF9Db3duc0JEIHwKKwkJCQkJCSAgICAobHAtPmZibF9jdXJpZCA8PCBCRF9SeEJESURfU0hJRlQpIHwKKwkJCQkJCSAgICBQQUdFX1NJWkUpOworCQkJCWxwLT5mYmxfY3VyaWQgPQorCQkJCQkobHAtPmZibF9jdXJpZCArIDEpICUgUlhfQlVGX1BBR0VTOworCQkJCWlmICh0YzM1ODE1X2RlYnVnID4gMikgeworCQkJCQlwcmludGsoIiVzOiBFbnRlcmluZyBuZXcgRkJEICVkXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lLCBscC0+ZmJsX2N1cmlkKTsKKwkJCQkJZHVtcF9mcmZkKGxwLT5mYmxfcHRyKTsKKwkJCQl9CisJCQkJYnVmX2ZyZWVfY291bnQrKzsKKwkJCX0KKwkJfQorCisJCS8qIHB1dCBSeEZEIGJhY2sgdG8gY29udHJvbGxlciAqLworCQluZXh0X3JmZCA9IGJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGxwLT5yZmRfY3VyLT5mZC5GRE5leHQpKTsKKyNpZmRlZiBfX21pcHNfXworCQluZXh0X3JmZCA9IChzdHJ1Y3QgUnhGRCAqKXZ0b25vY2FjaGUobmV4dF9yZmQpOworI2VuZGlmCisJCWlmIChuZXh0X3JmZCA8IGxwLT5yZmRfYmFzZSB8fCBuZXh0X3JmZCA+IGxwLT5yZmRfbGltaXQpIHsKKwkJCXByaW50aygiJXM6IFJ4RkQgRkROZXh0IGludmFsaWQuXG4iLCBkZXYtPm5hbWUpOworCQkJcGFuaWNfcXVldWVzKGRldik7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IChiZF9jb3VudCArIDEpIC8gMiArIDE7IGkrKykgeworCQkJLyogcGFzcyBGRCB0byBjb250cm9sZXIgKi8KKwkJCWxwLT5yZmRfY3VyLT5mZC5GRE5leHQgPSBjcHVfdG9fbGUzMigweGRlYWRkZWFkKTsJLyogZm9yIGRlYnVnICovCisJCQlscC0+cmZkX2N1ci0+ZmQuRkRDdGwgPSBjcHVfdG9fbGUzMihGRF9Db3duc0ZEKTsKKwkJCWxwLT5yZmRfY3VyKys7CisJCQlmZF9mcmVlX2NvdW50Kys7CisJCX0KKworCQlscC0+cmZkX2N1ciA9IG5leHRfcmZkOworCX0KKworCS8qIHJlLWVuYWJsZSBCTC9GREEgRXhoYXVzdCBpbnRlcnJ1cHRzLiAqLworCWlmIChmZF9mcmVlX2NvdW50KSB7CisJCXRjX3dyaXRlbCh0Y19yZWFkbCgmdHItPkludF9FbikgfCBJbnRfRkRBRXhFbiwgJnRyLT5JbnRfRW4pOworCQlpZiAoYnVmX2ZyZWVfY291bnQpCisJCQl0Y193cml0ZWwodGNfcmVhZGwoJnRyLT5JbnRfRW4pIHwgSW50X0JMRXhFbiwgJnRyLT5JbnRfRW4pOworCX0KK30KKworI2lmZGVmIE5PX0NIRUNLX0NBUlJJRVIKKyNkZWZpbmUgVFhfU1RBX0VSUgkoVHhfRXhDb2xsfFR4X1VuZGVyfFR4X0RlZmVyfFR4X0xhdGVDb2xsfFR4X1R4UGFyfFR4X1NRRXJyKQorI2Vsc2UKKyNkZWZpbmUgVFhfU1RBX0VSUgkoVHhfRXhDb2xsfFR4X1VuZGVyfFR4X0RlZmVyfFR4X05DYXJyfFR4X0xhdGVDb2xsfFR4X1R4UGFyfFR4X1NRRXJyKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCit0YzM1ODE1X2NoZWNrX3R4X3N0YXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJY29uc3QgY2hhciAqbXNnID0gTlVMTDsKKworCS8qIGNvdW50IGNvbGxpc2lvbnMgKi8KKwlpZiAoc3RhdHVzICYgVHhfRXhDb2xsKQorCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSAxNjsKKwlpZiAoc3RhdHVzICYgVHhfVHhDb2xsX01BU0spCisJCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IHN0YXR1cyAmIFR4X1R4Q29sbF9NQVNLOworCisJLyogV09SS0FST1VORDogaWdub3JlIExvc3RDclMgaW4gZnVsbCBkdXBsZXggb3BlcmF0aW9uICovCisJaWYgKGxwLT5mdWxsZHVwbGV4KQorCQlzdGF0dXMgJj0gflR4X05DYXJyOworCisJaWYgKCEoc3RhdHVzICYgVFhfU1RBX0VSUikpIHsKKwkJLyogbm8gZXJyb3IuICovCisJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXJldHVybjsKKwl9CisKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFR4X0V4Q29sbCkgeworCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJbXNnID0gIkV4Y2Vzc2l2ZSBDb2xsaXNpb24uIjsKKwl9CisJaWYgKHN0YXR1cyAmIFR4X1VuZGVyKSB7CisJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQltc2cgPSAiVHggRklGTyBVbmRlcnJ1bi4iOworCX0KKwlpZiAoc3RhdHVzICYgVHhfRGVmZXIpIHsKKwkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCW1zZyA9ICJFeGNlc3NpdmUgRGVmZXJyYWwuIjsKKwl9CisjaWZuZGVmIE5PX0NIRUNLX0NBUlJJRVIKKwlpZiAoc3RhdHVzICYgVHhfTkNhcnIpIHsKKwkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCW1zZyA9ICJMb3N0IENhcnJpZXIgU2Vuc2UuIjsKKwl9CisjZW5kaWYKKwlpZiAoc3RhdHVzICYgVHhfTGF0ZUNvbGwpIHsKKwkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCW1zZyA9ICJMYXRlIENvbGxpc2lvbi4iOworCX0KKwlpZiAoc3RhdHVzICYgVHhfVHhQYXIpIHsKKwkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCW1zZyA9ICJUcmFuc21pdCBQYXJpdHkgRXJyb3IuIjsKKwl9CisJaWYgKHN0YXR1cyAmIFR4X1NRRXJyKSB7CisJCWxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCW1zZyA9ICJTaWduYWwgUXVhbGl0eSBFcnJvci4iOworCX0KKwlpZiAobXNnKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXMgKCUjeClcbiIsIGRldi0+bmFtZSwgbXNnLCBzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZAordGMzNTgxNV90eGRvbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHRjMzU4MTVfcmVncyAqdHIgPSAoc3RydWN0IHRjMzU4MTVfcmVncyopZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IFR4RkQgKnR4ZmQ7CisJdW5zaWduZWQgaW50IGZkY3RsOworCWludCBudW1fZG9uZSA9IDA7CisKKwl0eGZkID0gJmxwLT50ZmRfYmFzZVtscC0+dGZkX2VuZF07CisJd2hpbGUgKGxwLT50ZmRfc3RhcnQgIT0gbHAtPnRmZF9lbmQgJiYKKwkgICAgICAgISgoZmRjdGwgPSBsZTMyX3RvX2NwdSh0eGZkLT5mZC5GREN0bCkpICYgRkRfQ293bnNGRCkpIHsKKwkJaW50IHN0YXR1cyA9IGxlMzJfdG9fY3B1KHR4ZmQtPmZkLkZEU3RhdCk7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXVuc2lnbmVkIGxvbmcgZmRuZXh0ID0gbGUzMl90b19jcHUodHhmZC0+ZmQuRkROZXh0KTsKKworCQlpZiAodGMzNTgxNV9kZWJ1ZyA+IDIpIHsKKwkJCXByaW50aygiJXM6IGNvbXBsZXRlIFR4RkQuXG4iLCBkZXYtPm5hbWUpOworCQkJZHVtcF90eGZkKHR4ZmQpOworCQl9CisJCXRjMzU4MTVfY2hlY2tfdHhfc3RhdChkZXYsIHN0YXR1cyk7CisKKwkJc2tiID0gKHN0cnVjdCBza19idWZmICopbGUzMl90b19jcHUodHhmZC0+ZmQuRkRTeXN0ZW0pOworCQlpZiAoc2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQl9CisJCXR4ZmQtPmZkLkZEU3lzdGVtID0gY3B1X3RvX2xlMzIoMCk7CisKKwkJbnVtX2RvbmUrKzsKKwkJbHAtPnRmZF9lbmQgPSAobHAtPnRmZF9lbmQgKyAxKSAlIFRYX0ZEX05VTTsKKwkJdHhmZCA9ICZscC0+dGZkX2Jhc2VbbHAtPnRmZF9lbmRdOworCQlpZiAoKGZkbmV4dCAmIH5GRF9OZXh0X0VPTCkgIT0gdmlydF90b19idXModHhmZCkpIHsKKwkJCXByaW50aygiJXM6IFR4RkQgRkROZXh0IGludmFsaWQuXG4iLCBkZXYtPm5hbWUpOworCQkJcGFuaWNfcXVldWVzKGRldik7CisJCX0KKwkJaWYgKGZkbmV4dCAmIEZEX05leHRfRU9MKSB7CisJCQkvKiBETUEgVHJhbnNtaXR0ZXIgaGFzIGJlZW4gc3RvcHBpbmcuLi4gKi8KKwkJCWlmIChscC0+dGZkX2VuZCAhPSBscC0+dGZkX3N0YXJ0KSB7CisJCQkJaW50IGhlYWQgPSAobHAtPnRmZF9zdGFydCArIFRYX0ZEX05VTSAtIDEpICUgVFhfRkRfTlVNOworCQkJCXN0cnVjdCBUeEZEKiB0eGhlYWQgPSAmbHAtPnRmZF9iYXNlW2hlYWRdOworCQkJCWludCBxbGVuID0gKGxwLT50ZmRfc3RhcnQgKyBUWF9GRF9OVU0KKwkJCQkJICAgIC0gbHAtPnRmZF9lbmQpICUgVFhfRkRfTlVNOworCisJCQkJaWYgKCEobGUzMl90b19jcHUodHhmZC0+ZmQuRkRDdGwpICYgRkRfQ293bnNGRCkpIHsKKwkJCQkJcHJpbnRrKCIlczogVHhGRCBGREN0bCBpbnZhbGlkLlxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJcGFuaWNfcXVldWVzKGRldik7CisJCQkJfQorCQkJCS8qIGxvZyBtYXggcXVldWUgbGVuZ3RoICovCisJCQkJaWYgKGxwLT5sc3RhdHMubWF4X3R4X3FsZW4gPCBxbGVuKQorCQkJCQlscC0+bHN0YXRzLm1heF90eF9xbGVuID0gcWxlbjsKKworCisJCQkJLyogc3RhcnQgRE1BIFRyYW5zbWl0dGVyIGFnYWluICovCisJCQkJdHhoZWFkLT5mZC5GRE5leHQgfD0gY3B1X3RvX2xlMzIoRkRfTmV4dF9FT0wpOworI2lmZGVmIEdBVEhFUl9UWElOVAorCQkJCXR4aGVhZC0+ZmQuRkRDdGwgfD0gY3B1X3RvX2xlMzIoRkRfRnJtT3B0X0ludFR4KTsKKyNlbmRpZgorCQkJCWlmICh0YzM1ODE1X2RlYnVnID4gMikgeworCQkJCQlwcmludGsoIiVzOiBzdGFydCBUeEZEIG9uIHF1ZXVlLlxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJCWR1bXBfdHhmZCh0eGZkKTsKKwkJCQl9CisJCQkJdGNfd3JpdGVsKHZpcnRfdG9fYnVzKHR4ZmQpLCAmdHItPlR4RnJtUHRyKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG51bV9kb25lID4gMCAmJiBscC0+dGJ1c3kpIHsKKwkJbHAtPnRidXN5ID0gMDsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwl9Cit9CisKKy8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gdGMzNTgxNV9vcGVuKCkuICovCitzdGF0aWMgaW50Cit0YzM1ODE1X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCisJbHAtPnRidXN5ID0gMTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnggaGVyZS4gKi8KKworCXRjMzU4MTVfY2hpcF9yZXNldChkZXYpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJdGMzNTgxNV9mcmVlX3F1ZXVlcyhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4KKyAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IgY2xvc2VkLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnRjMzU4MTVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCQkvKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3MgZnJvbSB0aGUgZGV2aWNlIHJlZ2lzdGVycy4gKi8KKwkJbHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSB0Y19yZWFkbCgmdHItPk1pc3NfQ250KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgdGMzNTgxNV9zZXRfY2FtX2VudHJ5KHN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyLCBpbnQgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJaW50IGNhbV9pbmRleCA9IGluZGV4ICogNjsKKwl1bnNpZ25lZCBsb25nIGNhbV9kYXRhOworCXVuc2lnbmVkIGxvbmcgc2F2ZWRfYWRkcjsKKwlzYXZlZF9hZGRyID0gdGNfcmVhZGwoJnRyLT5DQU1fQWRyKTsKKworCWlmICh0YzM1ODE1X2RlYnVnID4gMSkgeworCQlpbnQgaTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDQU0gJWQ6IiwgY2FyZG5hbWUsIGluZGV4KTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXByaW50aygiICUwMngiLCBhZGRyW2ldKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKwlpZiAoaW5kZXggJiAxKSB7CisJCS8qIHJlYWQgbW9kaWZ5IHdyaXRlICovCisJCXRjX3dyaXRlbChjYW1faW5kZXggLSAyLCAmdHItPkNBTV9BZHIpOworCQljYW1fZGF0YSA9IHRjX3JlYWRsKCZ0ci0+Q0FNX0RhdGEpICYgMHhmZmZmMDAwMDsKKwkJY2FtX2RhdGEgfD0gYWRkclswXSA8PCA4IHwgYWRkclsxXTsKKwkJdGNfd3JpdGVsKGNhbV9kYXRhLCAmdHItPkNBTV9EYXRhKTsKKwkJLyogd3JpdGUgd2hvbGUgd29yZCAqLworCQl0Y193cml0ZWwoY2FtX2luZGV4ICsgMiwgJnRyLT5DQU1fQWRyKTsKKwkJY2FtX2RhdGEgPSAoYWRkclsyXSA8PCAyNCkgfCAoYWRkclszXSA8PCAxNikgfCAoYWRkcls0XSA8PCA4KSB8IGFkZHJbNV07CisJCXRjX3dyaXRlbChjYW1fZGF0YSwgJnRyLT5DQU1fRGF0YSk7CisJfSBlbHNlIHsKKwkJLyogd3JpdGUgd2hvbGUgd29yZCAqLworCQl0Y193cml0ZWwoY2FtX2luZGV4LCAmdHItPkNBTV9BZHIpOworCQljYW1fZGF0YSA9IChhZGRyWzBdIDw8IDI0KSB8IChhZGRyWzFdIDw8IDE2KSB8IChhZGRyWzJdIDw8IDgpIHwgYWRkclszXTsKKwkJdGNfd3JpdGVsKGNhbV9kYXRhLCAmdHItPkNBTV9EYXRhKTsKKwkJLyogcmVhZCBtb2RpZnkgd3JpdGUgKi8KKwkJdGNfd3JpdGVsKGNhbV9pbmRleCArIDQsICZ0ci0+Q0FNX0Fkcik7CisJCWNhbV9kYXRhID0gdGNfcmVhZGwoJnRyLT5DQU1fRGF0YSkgJiAweDAwMDBmZmZmOworCQljYW1fZGF0YSB8PSBhZGRyWzRdIDw8IDI0IHwgKGFkZHJbNV0gPDwgMTYpOworCQl0Y193cml0ZWwoY2FtX2RhdGEsICZ0ci0+Q0FNX0RhdGEpOworCX0KKworCWlmICh0YzM1ODE1X2RlYnVnID4gMikgeworCQlpbnQgaTsKKwkJZm9yIChpID0gY2FtX2luZGV4IC8gNDsgaSA8IGNhbV9pbmRleCAvIDQgKyAyOyBpKyspIHsKKwkJCXRjX3dyaXRlbChpICogNCwgJnRyLT5DQU1fQWRyKTsKKwkJCXByaW50aygiQ0FNIDB4JXg6ICUwOGx4IiwKKwkJCSAgICAgICBpICogNCwgdGNfcmVhZGwoJnRyLT5DQU1fRGF0YSkpOworCQl9CisJfQorCXRjX3dyaXRlbChzYXZlZF9hZGRyLCAmdHItPkNBTV9BZHIpOworfQorCisKKy8qCisgKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgKiBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAqIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLAorICoJCQlhbmQgZG8gYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCitzdGF0aWMgdm9pZAordGMzNTgxNV9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciA9IChzdHJ1Y3QgdGMzNTgxNV9yZWdzKilkZXYtPmJhc2VfYWRkcjsKKworCWlmIChkZXYtPmZsYWdzJklGRl9QUk9NSVNDKQorCXsKKwkJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJdGNfd3JpdGVsKENBTV9Db21wRW4gfCBDQU1fQnJvYWRBY2MgfCBDQU1fR3JvdXBBY2MgfCBDQU1fU3RhdGlvbkFjYywgJnRyLT5DQU1fQ3RsKTsKKwl9CisJZWxzZSBpZigoZGV2LT5mbGFncyZJRkZfQUxMTVVMVEkpIHx8IGRldi0+bWNfY291bnQgPiBDQU1fRU5UUllfTUFYIC0gMykKKwl7CisJCS8qIENBTSAwLCAxLCAyMCBhcmUgcmVzZXJ2ZWQuICovCisJCS8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSwgdXNlIG5vcm1hbCBtb2RlLiAqLworCQl0Y193cml0ZWwoQ0FNX0NvbXBFbiB8IENBTV9Ccm9hZEFjYyB8IENBTV9Hcm91cEFjYywgJnRyLT5DQU1fQ3RsKTsKKwl9CisJZWxzZSBpZihkZXYtPm1jX2NvdW50KQorCXsKKwkJc3RydWN0IGRldl9tY19saXN0KiBjdXJfYWRkciA9IGRldi0+bWNfbGlzdDsKKwkJaW50IGk7CisJCWludCBlbmFfYml0cyA9IENBTV9FbmFfQml0KENBTV9FTlRSWV9TT1VSQ0UpOworCisJCXRjX3dyaXRlbCgwLCAmdHItPkNBTV9DdGwpOworCQkvKiBXYWxrIHRoZSBhZGRyZXNzIGxpc3QsIGFuZCBsb2FkIHRoZSBmaWx0ZXIgKi8KKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKywgY3VyX2FkZHIgPSBjdXJfYWRkci0+bmV4dCkgeworCQkJaWYgKCFjdXJfYWRkcikKKwkJCQlicmVhazsKKwkJCS8qIGVudHJ5IDAsMSBpcyByZXNlcnZlZC4gKi8KKwkJCXRjMzU4MTVfc2V0X2NhbV9lbnRyeSh0ciwgaSArIDIsIGN1cl9hZGRyLT5kbWlfYWRkcik7CisJCQllbmFfYml0cyB8PSBDQU1fRW5hX0JpdChpICsgMik7CisJCX0KKwkJdGNfd3JpdGVsKGVuYV9iaXRzLCAmdHItPkNBTV9FbmEpOworCQl0Y193cml0ZWwoQ0FNX0NvbXBFbiB8IENBTV9Ccm9hZEFjYywgJnRyLT5DQU1fQ3RsKTsKKwl9CisJZWxzZSB7CisJCXRjX3dyaXRlbChDQU1fRW5hX0JpdChDQU1fRU5UUllfU09VUkNFKSwgJnRyLT5DQU1fRW5hKTsKKwkJdGNfd3JpdGVsKENBTV9Db21wRW4gfCBDQU1fQnJvYWRBY2MsICZ0ci0+Q0FNX0N0bCk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0Y19waHlfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciwgaW50IHBoeSwgaW50IHBoeV9yZWcpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJdGNfd3JpdGVsKE1EX0NBX0J1c3kgfCAocGh5IDw8IDUpIHwgcGh5X3JlZywgJnRyLT5NRF9DQSk7CisJd2hpbGUgKHRjX3JlYWRsKCZ0ci0+TURfQ0EpICYgTURfQ0FfQnVzeSkKKwkJOworCWRhdGEgPSB0Y19yZWFkbCgmdHItPk1EX0RhdGEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIHRjX3BoeV93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGQsIHN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyLCBpbnQgcGh5LCBpbnQgcGh5X3JlZykKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJdGNfd3JpdGVsKGQsICZ0ci0+TURfRGF0YSk7CisJdGNfd3JpdGVsKE1EX0NBX0J1c3kgfCBNRF9DQV9XciB8IChwaHkgPDwgNSkgfCBwaHlfcmVnLCAmdHItPk1EX0NBKTsKKwl3aGlsZSAodGNfcmVhZGwoJnRyLT5NRF9DQSkgJiBNRF9DQV9CdXN5KQorCQk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdGMzNTgxNV9waHlfY2hpcF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOworCXN0YXRpYyBpbnQgZmlyc3QgPSAxOworCXVuc2lnbmVkIHNob3J0IGN0bDsKKworCWlmIChmaXJzdCkgeworCQl1bnNpZ25lZCBzaG9ydCBpZDAsIGlkMTsKKwkJaW50IGNvdW50OworCQlmaXJzdCA9IDA7CisKKwkJLyogZmlyc3QgZGF0YSB3cml0dGVuIHRvIHRoZSBQSFkgd2lsbCBiZSBhbiBJRCBudW1iZXIgKi8KKwkJdGNfcGh5X3dyaXRlKGRldiwgMCwgdHIsIDAsIE1JSV9DT05UUk9MKTsJLyogSUQ6MCAqLworI2lmIDAKKwkJdGNfcGh5X3dyaXRlKGRldiwgTUlJQ05UTF9SRVNFVCwgdHIsIDAsIE1JSV9DT05UUk9MKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlc2V0dGluZyBQSFkuLi4iLCBkZXYtPm5hbWUpOworCQl3aGlsZSAodGNfcGh5X3JlYWQoZGV2LCB0ciwgMCwgTUlJX0NPTlRST0wpICYgTUlJQ05UTF9SRVNFVCkKKwkJCTsKKwkJcHJpbnRrKCJcbiIpOworCQl0Y19waHlfd3JpdGUoZGV2LCBNSUlDTlRMX0FVVE98TUlJQ05UTF9TUEVFRHxNSUlDTlRMX0ZEWCwgdHIsIDAsCisJCQkgICAgIE1JSV9DT05UUk9MKTsKKyNlbmRpZgorCQlpZDAgPSB0Y19waHlfcmVhZChkZXYsIHRyLCAwLCBNSUlfUEhZX0lEMCk7CisJCWlkMSA9IHRjX3BoeV9yZWFkKGRldiwgdHIsIDAsIE1JSV9QSFlfSUQxKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBQSFkgSUQgJTA0eCAlMDR4XG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICBpZDAsIGlkMSk7CisJCWlmIChscC0+b3B0aW9uICYgVEMzNTgxNV9PUFRfMTBNKSB7CisJCQlscC0+bGlua3NwZWVkID0gMTA7CisJCQlscC0+ZnVsbGR1cGxleCA9IChscC0+b3B0aW9uICYgVEMzNTgxNV9PUFRfRlVMTERVUCkgIT0gMDsKKwkJfSBlbHNlIGlmIChscC0+b3B0aW9uICYgVEMzNTgxNV9PUFRfMTAwTSkgeworCQkJbHAtPmxpbmtzcGVlZCA9IDEwMDsKKwkJCWxwLT5mdWxsZHVwbGV4ID0gKGxwLT5vcHRpb24gJiBUQzM1ODE1X09QVF9GVUxMRFVQKSAhPSAwOworCQl9IGVsc2UgeworCQkJLyogYXV0byBuZWdvdGlhdGlvbiAqLworCQkJdW5zaWduZWQgbG9uZyBuZWdfcmVzdWx0OworCQkJdGNfcGh5X3dyaXRlKGRldiwgTUlJQ05UTF9BVVRPIHwgTUlJQ05UTF9SU1RfQVVUTywgdHIsIDAsIE1JSV9DT05UUk9MKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvIE5lZ290aWF0aW9uLi4uIiwgZGV2LT5uYW1lKTsKKwkJCWNvdW50ID0gMDsKKwkJCXdoaWxlICghKHRjX3BoeV9yZWFkKGRldiwgdHIsIDAsIE1JSV9TVEFUVVMpICYgTUlJU1RBVF9BVVRPX0RPTkUpKSB7CisJCQkJaWYgKGNvdW50KysgPiA1MDAwKSB7CisJCQkJCXByaW50aygiIGZhaWxlZC4gQXNzdW1lIDEwTWJwc1xuIik7CisJCQkJCWxwLT5saW5rc3BlZWQgPSAxMDsKKwkJCQkJbHAtPmZ1bGxkdXBsZXggPSAwOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCQkJCWlmIChjb3VudCAlIDUxMiA9PSAwKQorCQkJCQlwcmludGsoIi4iKTsKKwkJCQltZGVsYXkoMSk7CisJCQl9CisJCQlwcmludGsoIiBkb25lLlxuIik7CisJCQluZWdfcmVzdWx0ID0gdGNfcGh5X3JlYWQoZGV2LCB0ciwgMCwgTUlJX0FOTFBBUik7CisJCQlpZiAobmVnX3Jlc3VsdCAmIChNSUlfQU5fVFhfRkRYIHwgTUlJX0FOX1RYX0hEWCkpCisJCQkJbHAtPmxpbmtzcGVlZCA9IDEwMDsKKwkJCWVsc2UKKwkJCQlscC0+bGlua3NwZWVkID0gMTA7CisJCQlpZiAobmVnX3Jlc3VsdCAmIChNSUlfQU5fVFhfRkRYIHwgTUlJX0FOXzEwX0ZEWCkpCisJCQkJbHAtPmZ1bGxkdXBsZXggPSAxOworCQkJZWxzZQorCQkJCWxwLT5mdWxsZHVwbGV4ID0gMDsKKwkJZG9uZToKKwkJCTsKKwkJfQorCX0KKworCWN0bCA9IDA7CisJaWYgKGxwLT5saW5rc3BlZWQgPT0gMTAwKQorCQljdGwgfD0gTUlJQ05UTF9TUEVFRDsKKwlpZiAobHAtPmZ1bGxkdXBsZXgpCisJCWN0bCB8PSBNSUlDTlRMX0ZEWDsKKwl0Y19waHlfd3JpdGUoZGV2LCBjdGwsIHRyLCAwLCBNSUlfQ09OVFJPTCk7CisKKwlpZiAobHAtPmZ1bGxkdXBsZXgpIHsKKwkJdGNfd3JpdGVsKHRjX3JlYWRsKCZ0ci0+TUFDX0N0bCkgfCBNQUNfRnVsbER1cCwgJnRyLT5NQUNfQ3RsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRjMzU4MTVfY2hpcF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOworCisJLyogcmVzZXQgdGhlIGNvbnRyb2xsZXIgKi8KKwl0Y193cml0ZWwoTUFDX1Jlc2V0LCAmdHItPk1BQ19DdGwpOworCXdoaWxlICh0Y19yZWFkbCgmdHItPk1BQ19DdGwpICYgTUFDX1Jlc2V0KQorCQk7CisKKwl0Y193cml0ZWwoMCwgJnRyLT5NQUNfQ3RsKTsKKworCS8qIGluaXRpYWxpemUgcmVnaXN0ZXJzIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwl0Y193cml0ZWwoMCwgJnRyLT5ETUFfQ3RsKTsKKwl0Y193cml0ZWwoMCwgJnRyLT5UeFRocnNoKTsKKwl0Y193cml0ZWwoMCwgJnRyLT5UeFBvbGxDdHIpOworCXRjX3dyaXRlbCgwLCAmdHItPlJ4RnJhZ1NpemUpOworCXRjX3dyaXRlbCgwLCAmdHItPkludF9Fbik7CisJdGNfd3JpdGVsKDAsICZ0ci0+RkRBX0Jhcyk7CisJdGNfd3JpdGVsKDAsICZ0ci0+RkRBX0xpbSk7CisJdGNfd3JpdGVsKDB4ZmZmZmZmZmYsICZ0ci0+SW50X1NyYyk7CS8qIFdyaXRlIDEgdG8gY2xlYXIgKi8KKwl0Y193cml0ZWwoMCwgJnRyLT5DQU1fQ3RsKTsKKwl0Y193cml0ZWwoMCwgJnRyLT5UeF9DdGwpOworCXRjX3dyaXRlbCgwLCAmdHItPlJ4X0N0bCk7CisJdGNfd3JpdGVsKDAsICZ0ci0+Q0FNX0VuYSk7CisJKHZvaWQpdGNfcmVhZGwoJnRyLT5NaXNzX0NudCk7CS8qIFJlYWQgdG8gY2xlYXIgKi8KKworfQorCitzdGF0aWMgdm9pZCB0YzM1ODE1X2NoaXBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciA9IChzdHJ1Y3QgdGMzNTgxNV9yZWdzKilkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdHhjdGwgPSBUWF9DVExfQ01EOworCisJdGMzNTgxNV9waHlfY2hpcF9pbml0KGRldik7CisKKwkvKiBsb2FkIHN0YXRpb24gYWRkcmVzcyB0byBDQU0gKi8KKwl0YzM1ODE1X3NldF9jYW1fZW50cnkodHIsIENBTV9FTlRSWV9TT1VSQ0UsIGRldi0+ZGV2X2FkZHIpOworCisJLyogRW5hYmxlIENBTSAoYnJvYWRjYXN0IGFuZCB1bmljYXN0KSAqLworCXRjX3dyaXRlbChDQU1fRW5hX0JpdChDQU1fRU5UUllfU09VUkNFKSwgJnRyLT5DQU1fRW5hKTsKKwl0Y193cml0ZWwoQ0FNX0NvbXBFbiB8IENBTV9Ccm9hZEFjYywgJnRyLT5DQU1fQ3RsKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJdGNfd3JpdGVsKERNQV9CVVJTVF9TSVpFLCAmdHItPkRNQV9DdGwpOworCisJdGNfd3JpdGVsKFJ4RnJhZ19FblBhY2sgfCBFVEhfWkxFTiwgJnRyLT5SeEZyYWdTaXplKTsJLyogUGFja2luZyAqLworCXRjX3dyaXRlbCgwLCAmdHItPlR4UG9sbEN0cik7CS8qIEJhdGNoIG1vZGUgKi8KKwl0Y193cml0ZWwoVFhfVEhSRVNIT0xELCAmdHItPlR4VGhyc2gpOworCXRjX3dyaXRlbChJTlRfRU5fQ01ELCAmdHItPkludF9Fbik7CisKKwkvKiBzZXQgcXVldWVzICovCisJdGNfd3JpdGVsKHZpcnRfdG9fYnVzKGxwLT5yZmRfYmFzZSksICZ0ci0+RkRBX0Jhcyk7CisJdGNfd3JpdGVsKCh1bnNpZ25lZCBsb25nKWxwLT5yZmRfbGltaXQgLSAodW5zaWduZWQgbG9uZylscC0+cmZkX2Jhc2UsCisJCSAgJnRyLT5GREFfTGltKTsKKwkvKgorCSAqIEFjdGl2YXRpb24gbWV0aG9kOgorCSAqIEZpcnN0LCBlbmFibGUgZWh0IE1BQyBUcmFuc21pdHRlciBhbmQgdGhlIERNQSBSZWNlaXZlIGNpcmN1aXRzLgorCSAqIFRoZW4gZW5hYmxlIHRoZSBETUEgVHJhbnNtaXR0ZXIgYW5kIHRoZSBNQUMgUmVjZWl2ZSBjaXJjdWl0cy4KKwkgKi8KKwl0Y193cml0ZWwodmlydF90b19idXMobHAtPmZibF9wdHIpLCAmdHItPkJMRnJtUHRyKTsJLyogc3RhcnQgRE1BIHJlY2VpdmVyICovCisJdGNfd3JpdGVsKFJYX0NUTF9DTUQsICZ0ci0+UnhfQ3RsKTsJLyogc3RhcnQgTUFDIHJlY2VpdmVyICovCisJLyogc3RhcnQgTUFDIHRyYW5zbWl0dGVyICovCisJLyogV09SS0FST1VORDogaWdub3JlIExvc3RDclMgaW4gZnVsbCBkdXBsZXggb3BlcmF0aW9uICovCisJaWYgKGxwLT5mdWxsZHVwbGV4KQorCQl0eGN0bCA9IFRYX0NUTF9DTUQgJiB+VHhfRW5MQ2FycjsKKyNpZmRlZiBHQVRIRVJfVFhJTlQKKwl0eGN0bCAmPSB+VHhfRW5Db21wOwkvKiBkaXNhYmxlIGdsb2JhbCB0eCBjb21wbGV0aW9uIGludC4gKi8KKyNlbmRpZgorCXRjX3dyaXRlbCh0eGN0bCwgJnRyLT5UeF9DdGwpOworI2lmIDAJLyogTm8gbmVlZCB0byBwb2xsaW5nICovCisJdGNfd3JpdGVsKHZpcnRfdG9fYnVzKGxwLT50ZmRfYmFzZSksICZ0ci0+VHhGcm1QdHIpOwkvKiBzdGFydCBETUEgdHJhbnNtaXR0ZXIgKi8KKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIFhYWCAqLwordm9pZAordGMzNTgxNV9raWxsYWxsKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWZvciAoZGV2ID0gcm9vdF90YzM1ODE1X2RldjsgZGV2OyBkZXYgPSAoKHN0cnVjdCB0YzM1ODE1X2xvY2FsICopZGV2LT5wcml2KS0+bmV4dF9tb2R1bGUpIHsKKwkJaWYgKGRldi0+ZmxhZ3MmSUZGX1VQKXsKKwkJCWRldi0+c3RvcChkZXYpOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdGMzNTgxNV9kcml2ZXIgPSB7CisJLm5hbWUgPSBUQzM1ODE1X01PRFVMRV9OQU1FLAorCS5wcm9iZSA9IHRjMzU4MTVfcHJvYmUsCisJLnJlbW92ZSA9IE5VTEwsCisJLmlkX3RhYmxlID0gdGMzNTgxNV9wY2lfdGJsLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGMzNTgxNV9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnRjMzU4MTVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRjMzU4MTVfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dF9kZXY7CisKKwl3aGlsZSAocm9vdF90YzM1ODE1X2RldikgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcm9vdF90YzM1ODE1X2RldjsKKwkJbmV4dF9kZXYgPSAoKHN0cnVjdCB0YzM1ODE1X2xvY2FsICopZGV2LT5wcml2KS0+bmV4dF9tb2R1bGU7CisJCWlvdW5tYXAoKHZvaWQgKikoZGV2LT5iYXNlX2FkZHIpKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcm9vdF90YzM1ODE1X2RldiA9IG5leHRfZGV2OworCX0KK30KK21vZHVsZV9pbml0KHRjMzU4MTVfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQodGMzNTgxNV9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZzMuYyBiL2RyaXZlcnMvbmV0L3RnMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZGU4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90ZzMuYwpAQCAtMCwwICsxLDkwODMgQEAKKy8qCisgKiB0ZzMuYzogQnJvYWRjb20gVGlnb24zIGV0aGVybmV0IGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzIEplZmYgR2FyemlrIChqZ2FyemlrQHBvYm94LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNCBTdW4gTWljcm9zeXN0ZW1zIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBGaXJtd2FyZSBpczoKKyAqIAlDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIENPTkZJR19TUEFSQzY0CisjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9wYm0uaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisjZGVmaW5lIFRHM19WTEFOX1RBR19VU0VEIDEKKyNlbHNlCisjZGVmaW5lIFRHM19WTEFOX1RBR19VU0VEIDAKKyNlbmRpZgorCisjaWZkZWYgTkVUSUZfRl9UU08KKyNkZWZpbmUgVEczX1RTT19TVVBQT1JUCTEKKyNlbHNlCisjZGVmaW5lIFRHM19UU09fU1VQUE9SVAkwCisjZW5kaWYKKworI2luY2x1ZGUgInRnMy5oIgorCisjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJInRnMyIKKyNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMy4yNSIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJNYXJjaCAyNCwgMjAwNSIKKworI2RlZmluZSBURzNfREVGX01BQ19NT0RFCTAKKyNkZWZpbmUgVEczX0RFRl9SWF9NT0RFCQkwCisjZGVmaW5lIFRHM19ERUZfVFhfTU9ERQkJMAorI2RlZmluZSBURzNfREVGX01TR19FTkFCTEUJICBcCisJKE5FVElGX01TR19EUlYJCXwgXAorCSBORVRJRl9NU0dfUFJPQkUJfCBcCisJIE5FVElGX01TR19MSU5LCQl8IFwKKwkgTkVUSUZfTVNHX1RJTUVSCXwgXAorCSBORVRJRl9NU0dfSUZET1dOCXwgXAorCSBORVRJRl9NU0dfSUZVUAkJfCBcCisJIE5FVElGX01TR19SWF9FUlIJfCBcCisJIE5FVElGX01TR19UWF9FUlIpCisKKy8qIGxlbmd0aCBvZiB0aW1lIGJlZm9yZSB3ZSBkZWNpZGUgdGhlIGhhcmR3YXJlIGlzIGJvcmtlZCwKKyAqIGFuZCBkZXYtPnR4X3RpbWVvdXQoKSBzaG91bGQgYmUgY2FsbGVkIHRvIGZpeCB0aGUgcHJvYmxlbQorICovCisjZGVmaW5lIFRHM19UWF9USU1FT1VUCQkJKDUgKiBIWikKKworLyogaGFyZHdhcmUgbWluaW11bSBhbmQgbWF4aW11bSBmb3IgYSBzaW5nbGUgZnJhbWUncyBkYXRhIHBheWxvYWQgKi8KKyNkZWZpbmUgVEczX01JTl9NVFUJCQk2MAorI2RlZmluZSBURzNfTUFYX01UVSh0cCkJXAorCSgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDUgJiYgXAorCSAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3NTApID8gOTAwMCA6IDE1MDApCisKKy8qIFRoZXNlIG51bWJlcnMgc2VlbSB0byBiZSBoYXJkIGNvZGVkIGluIHRoZSBOSUMgZmlybXdhcmUgc29tZWhvdy4KKyAqIFlvdSBjYW4ndCBjaGFuZ2UgdGhlIHJpbmcgc2l6ZXMsIGJ1dCB5b3UgY2FuIGNoYW5nZSB3aGVyZSB5b3UgcGxhY2UKKyAqIHRoZW0gaW4gdGhlIE5JQyBvbmJvYXJkIG1lbW9yeS4KKyAqLworI2RlZmluZSBURzNfUlhfUklOR19TSVpFCQk1MTIKKyNkZWZpbmUgVEczX0RFRl9SWF9SSU5HX1BFTkRJTkcJCTIwMAorI2RlZmluZSBURzNfUlhfSlVNQk9fUklOR19TSVpFCQkyNTYKKyNkZWZpbmUgVEczX0RFRl9SWF9KVU1CT19SSU5HX1BFTkRJTkcJMTAwCisKKy8qIERvIG5vdCBwbGFjZSB0aGlzIG4tcmluZyBlbnRyaWVzIHZhbHVlIGludG8gdGhlIHRwIHN0cnVjdCBpdHNlbGYsCisgKiB3ZSByZWFsbHkgd2FudCB0byBleHBvc2UgdGhlc2UgY29uc3RhbnRzIHRvIEdDQyBzbyB0aGF0IG1vZHVsbyBldAorICogYWwuICBvcGVyYXRpb25zIGFyZSBkb25lIHdpdGggc2hpZnRzIGFuZCBtYXNrcyBpbnN0ZWFkIG9mIHdpdGgKKyAqIGh3IG11bHRpcGx5L21vZHVsbyBpbnN0cnVjdGlvbnMuICBBbm90aGVyIHNvbHV0aW9uIHdvdWxkIGJlIHRvCisgKiByZXBsYWNlIHRoaW5ncyBsaWtlICclIGZvbycgd2l0aCAnJiAoZm9vIC0gMSknLgorICovCisjZGVmaW5lIFRHM19SWF9SQ0JfUklOR19TSVpFKHRwKQlcCisJKCh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykgPyAgNTEyIDogMTAyNCkKKworI2RlZmluZSBURzNfVFhfUklOR19TSVpFCQk1MTIKKyNkZWZpbmUgVEczX0RFRl9UWF9SSU5HX1BFTkRJTkcJCShURzNfVFhfUklOR19TSVpFIC0gMSkKKworI2RlZmluZSBURzNfUlhfUklOR19CWVRFUwkoc2l6ZW9mKHN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MpICogXAorCQkJCSBURzNfUlhfUklOR19TSVpFKQorI2RlZmluZSBURzNfUlhfSlVNQk9fUklOR19CWVRFUwkoc2l6ZW9mKHN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MpICogXAorCQkJICAgICAgICAgVEczX1JYX0pVTUJPX1JJTkdfU0laRSkKKyNkZWZpbmUgVEczX1JYX1JDQl9SSU5HX0JZVEVTKHRwKSAoc2l6ZW9mKHN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MpICogXAorCQkJICAgICAgICAgICBURzNfUlhfUkNCX1JJTkdfU0laRSh0cCkpCisjZGVmaW5lIFRHM19UWF9SSU5HX0JZVEVTCShzaXplb2Yoc3RydWN0IHRnM190eF9idWZmZXJfZGVzYykgKiBcCisJCQkJIFRHM19UWF9SSU5HX1NJWkUpCisjZGVmaW5lIFRYX1JJTkdfR0FQKFRQKQlcCisJKFRHM19UWF9SSU5HX1NJWkUgLSAoVFApLT50eF9wZW5kaW5nKQorI2RlZmluZSBUWF9CVUZGU19BVkFJTChUUCkJCQkJCQlcCisJKCgoVFApLT50eF9jb25zIDw9IChUUCktPnR4X3Byb2QpID8JCQkJXAorCSAgKFRQKS0+dHhfY29ucyArIChUUCktPnR4X3BlbmRpbmcgLSAoVFApLT50eF9wcm9kIDoJCVwKKwkgIChUUCktPnR4X2NvbnMgLSAoVFApLT50eF9wcm9kIC0gVFhfUklOR19HQVAoVFApKQorI2RlZmluZSBORVhUX1RYKE4pCQkoKChOKSArIDEpICYgKFRHM19UWF9SSU5HX1NJWkUgLSAxKSkKKworI2RlZmluZSBSWF9QS1RfQlVGX1NaCQkoMTUzNiArIHRwLT5yeF9vZmZzZXQgKyA2NCkKKyNkZWZpbmUgUlhfSlVNQk9fUEtUX0JVRl9TWgkoOTA0NiArIHRwLT5yeF9vZmZzZXQgKyA2NCkKKworLyogbWluaW11bSBudW1iZXIgb2YgZnJlZSBUWCBkZXNjcmlwdG9ycyByZXF1aXJlZCB0byB3YWtlIHVwIFRYIHByb2Nlc3MgKi8KKyNkZWZpbmUgVEczX1RYX1dBS0VVUF9USFJFU0gJCShURzNfVFhfUklOR19TSVpFIC8gNCkKKworLyogbnVtYmVyIG9mIEVUSFRPT0xfR1NUQVRTIHU2NCdzICovCisjZGVmaW5lIFRHM19OVU1fU1RBVFMJCShzaXplb2Yoc3RydWN0IHRnM19ldGh0b29sX3N0YXRzKS9zaXplb2YodTY0KSkKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCURSVl9NT0RVTEVfTkFNRSAiLmM6diIgRFJWX01PRFVMRV9WRVJTSU9OICIgKCIgRFJWX01PRFVMRV9SRUxEQVRFICIpXG4iOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pIGFuZCBKZWZmIEdhcnppayAoamdhcnppa0Bwb2JveC5jb20pIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJyb2FkY29tIFRpZ29uMyBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9NT0RVTEVfVkVSU0lPTik7CisKK3N0YXRpYyBpbnQgdGczX2RlYnVnID0gLTE7CS8qIC0xID09IHVzZSBURzNfREVGX01TR19FTkFCTEUgYXMgdmFsdWUgKi8KK21vZHVsZV9wYXJhbSh0ZzNfZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRnM19kZWJ1ZywgIlRpZ29uMyBiaXRtYXBwZWQgZGVidWdnaW5nIG1lc3NhZ2UgZW5hYmxlIHZhbHVlIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0ZzNfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwNCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMkZFLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA1LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA1XzIsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDVNLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA1TV8yLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAyWCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwM1gsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDRTLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAyQTMsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDNBMywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc4MiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc4OCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc4OSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTkwMSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTkwMV8yLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA0U18yLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA1RiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcyMCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcyMSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1ME0sCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTFNLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUxRiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1M00sCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTNGLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzgxLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIFBDSV9ERVZJQ0VfSURfU1lTS09OTkVDVF85RFhYLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIFBDSV9ERVZJQ0VfSURfU1lTS09OTkVDVF85TVhYLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMVElNQSwgUENJX0RFVklDRV9JRF9BTFRJTUFfQUMxMDAwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMVElNQSwgUENJX0RFVklDRV9JRF9BTFRJTUFfQUMxMDAxLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMVElNQSwgUENJX0RFVklDRV9JRF9BTFRJTUFfQUMxMDAzLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMVElNQSwgUENJX0RFVklDRV9JRF9BTFRJTUFfQUM5MTAwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FQUExFLCBQQ0lfREVWSUNFX0lEX0FQUExFX1RJR09OMywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRnM19wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciBzdHJpbmdbRVRIX0dTVFJJTkdfTEVOXTsKK30gZXRodG9vbF9zdGF0c19rZXlzW1RHM19OVU1fU1RBVFNdID0geworCXsgInJ4X29jdGV0cyIgfSwKKwl7ICJyeF9mcmFnbWVudHMiIH0sCisJeyAicnhfdWNhc3RfcGFja2V0cyIgfSwKKwl7ICJyeF9tY2FzdF9wYWNrZXRzIiB9LAorCXsgInJ4X2JjYXN0X3BhY2tldHMiIH0sCisJeyAicnhfZmNzX2Vycm9ycyIgfSwKKwl7ICJyeF9hbGlnbl9lcnJvcnMiIH0sCisJeyAicnhfeG9uX3BhdXNlX3JjdmQiIH0sCisJeyAicnhfeG9mZl9wYXVzZV9yY3ZkIiB9LAorCXsgInJ4X21hY19jdHJsX3JjdmQiIH0sCisJeyAicnhfeG9mZl9lbnRlcmVkIiB9LAorCXsgInJ4X2ZyYW1lX3Rvb19sb25nX2Vycm9ycyIgfSwKKwl7ICJyeF9qYWJiZXJzIiB9LAorCXsgInJ4X3VuZGVyc2l6ZV9wYWNrZXRzIiB9LAorCXsgInJ4X2luX2xlbmd0aF9lcnJvcnMiIH0sCisJeyAicnhfb3V0X2xlbmd0aF9lcnJvcnMiIH0sCisJeyAicnhfNjRfb3JfbGVzc19vY3RldF9wYWNrZXRzIiB9LAorCXsgInJ4XzY1X3RvXzEyN19vY3RldF9wYWNrZXRzIiB9LAorCXsgInJ4XzEyOF90b18yNTVfb2N0ZXRfcGFja2V0cyIgfSwKKwl7ICJyeF8yNTZfdG9fNTExX29jdGV0X3BhY2tldHMiIH0sCisJeyAicnhfNTEyX3RvXzEwMjNfb2N0ZXRfcGFja2V0cyIgfSwKKwl7ICJyeF8xMDI0X3RvXzE1MjJfb2N0ZXRfcGFja2V0cyIgfSwKKwl7ICJyeF8xNTIzX3RvXzIwNDdfb2N0ZXRfcGFja2V0cyIgfSwKKwl7ICJyeF8yMDQ4X3RvXzQwOTVfb2N0ZXRfcGFja2V0cyIgfSwKKwl7ICJyeF80MDk2X3RvXzgxOTFfb2N0ZXRfcGFja2V0cyIgfSwKKwl7ICJyeF84MTkyX3RvXzkwMjJfb2N0ZXRfcGFja2V0cyIgfSwKKworCXsgInR4X29jdGV0cyIgfSwKKwl7ICJ0eF9jb2xsaXNpb25zIiB9LAorCisJeyAidHhfeG9uX3NlbnQiIH0sCisJeyAidHhfeG9mZl9zZW50IiB9LAorCXsgInR4X2Zsb3dfY29udHJvbCIgfSwKKwl7ICJ0eF9tYWNfZXJyb3JzIiB9LAorCXsgInR4X3NpbmdsZV9jb2xsaXNpb25zIiB9LAorCXsgInR4X211bHRfY29sbGlzaW9ucyIgfSwKKwl7ICJ0eF9kZWZlcnJlZCIgfSwKKwl7ICJ0eF9leGNlc3NpdmVfY29sbGlzaW9ucyIgfSwKKwl7ICJ0eF9sYXRlX2NvbGxpc2lvbnMiIH0sCisJeyAidHhfY29sbGlkZV8ydGltZXMiIH0sCisJeyAidHhfY29sbGlkZV8zdGltZXMiIH0sCisJeyAidHhfY29sbGlkZV80dGltZXMiIH0sCisJeyAidHhfY29sbGlkZV81dGltZXMiIH0sCisJeyAidHhfY29sbGlkZV82dGltZXMiIH0sCisJeyAidHhfY29sbGlkZV83dGltZXMiIH0sCisJeyAidHhfY29sbGlkZV84dGltZXMiIH0sCisJeyAidHhfY29sbGlkZV85dGltZXMiIH0sCisJeyAidHhfY29sbGlkZV8xMHRpbWVzIiB9LAorCXsgInR4X2NvbGxpZGVfMTF0aW1lcyIgfSwKKwl7ICJ0eF9jb2xsaWRlXzEydGltZXMiIH0sCisJeyAidHhfY29sbGlkZV8xM3RpbWVzIiB9LAorCXsgInR4X2NvbGxpZGVfMTR0aW1lcyIgfSwKKwl7ICJ0eF9jb2xsaWRlXzE1dGltZXMiIH0sCisJeyAidHhfdWNhc3RfcGFja2V0cyIgfSwKKwl7ICJ0eF9tY2FzdF9wYWNrZXRzIiB9LAorCXsgInR4X2JjYXN0X3BhY2tldHMiIH0sCisJeyAidHhfY2Fycmllcl9zZW5zZV9lcnJvcnMiIH0sCisJeyAidHhfZGlzY2FyZHMiIH0sCisJeyAidHhfZXJyb3JzIiB9LAorCisJeyAiZG1hX3dyaXRlcV9mdWxsIiB9LAorCXsgImRtYV93cml0ZV9wcmlvcV9mdWxsIiB9LAorCXsgInJ4YmRzX2VtcHR5IiB9LAorCXsgInJ4X2Rpc2NhcmRzIiB9LAorCXsgInJ4X2Vycm9ycyIgfSwKKwl7ICJyeF90aHJlc2hvbGRfaGl0IiB9LAorCisJeyAiZG1hX3JlYWRxX2Z1bGwiIH0sCisJeyAiZG1hX3JlYWRfcHJpb3FfZnVsbCIgfSwKKwl7ICJ0eF9jb21wX3F1ZXVlX2Z1bGwiIH0sCisKKwl7ICJyaW5nX3NldF9zZW5kX3Byb2RfaW5kZXgiIH0sCisJeyAicmluZ19zdGF0dXNfdXBkYXRlIiB9LAorCXsgIm5pY19pcnFzIiB9LAorCXsgIm5pY19hdm9pZGVkX2lycXMiIH0sCisJeyAibmljX3R4X3RocmVzaG9sZF9oaXQiIH0KK307CisKK3N0YXRpYyB2b2lkIHRnM193cml0ZV9pbmRpcmVjdF9yZWczMihzdHJ1Y3QgdGczICp0cCwgdTMyIG9mZiwgdTMyIHZhbCkKK3sKKwlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX1RBUkdFVF9IV0JVRykgIT0gMCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+aW5kaXJlY3RfbG9jaywgZmxhZ3MpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUkVHX0JBU0VfQUREUiwgb2ZmKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1JFR19EQVRBLCB2YWwpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+aW5kaXJlY3RfbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCXdyaXRlbCh2YWwsIHRwLT5yZWdzICsgb2ZmKTsKKwkJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfNTcwMV9SRUdfV1JJVEVfQlVHKSAhPSAwKQorCQkJcmVhZGwodHAtPnJlZ3MgKyBvZmYpOworCX0KK30KKworc3RhdGljIHZvaWQgX3R3MzJfZmx1c2goc3RydWN0IHRnMyAqdHAsIHUzMiBvZmYsIHUzMiB2YWwpCit7CisJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9UQVJHRVRfSFdCVUcpICE9IDApIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmluZGlyZWN0X2xvY2ssIGZsYWdzKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1JFR19CQVNFX0FERFIsIG9mZik7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9SRUdfREFUQSwgdmFsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmluZGlyZWN0X2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQl2b2lkIF9faW9tZW0gKmRlc3QgPSB0cC0+cmVncyArIG9mZjsKKwkJd3JpdGVsKHZhbCwgZGVzdCk7CisJCXJlYWRsKGRlc3QpOyAgICAvKiBhbHdheXMgZmx1c2ggUENJIHdyaXRlICovCisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX3R3MzJfcnhfbWJveChzdHJ1Y3QgdGczICp0cCwgdTMyIG9mZiwgdTMyIHZhbCkKK3sKKwl2b2lkIF9faW9tZW0gKm1ib3ggPSB0cC0+cmVncyArIG9mZjsKKwl3cml0ZWwodmFsLCBtYm94KTsKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX01CT1hfV1JJVEVfUkVPUkRFUikKKwkJcmVhZGwobWJveCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfdHczMl90eF9tYm94KHN0cnVjdCB0ZzMgKnRwLCB1MzIgb2ZmLCB1MzIgdmFsKQoreworCXZvaWQgX19pb21lbSAqbWJveCA9IHRwLT5yZWdzICsgb2ZmOworCXdyaXRlbCh2YWwsIG1ib3gpOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVFhEX01CT1hfSFdCVUcpCisJCXdyaXRlbCh2YWwsIG1ib3gpOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTUJPWF9XUklURV9SRU9SREVSKQorCQlyZWFkbChtYm94KTsKK30KKworI2RlZmluZSB0dzMyX21haWxib3gocmVnLCB2YWwpICB3cml0ZWwoKCh2YWwpICYgMHhmZmZmZmZmZiksIHRwLT5yZWdzICsgKHJlZykpCisjZGVmaW5lIHR3MzJfcnhfbWJveChyZWcsIHZhbCkgIF90dzMyX3J4X21ib3godHAsIHJlZywgdmFsKQorI2RlZmluZSB0dzMyX3R4X21ib3gocmVnLCB2YWwpICBfdHczMl90eF9tYm94KHRwLCByZWcsIHZhbCkKKworI2RlZmluZSB0dzMyKHJlZyx2YWwpCQl0ZzNfd3JpdGVfaW5kaXJlY3RfcmVnMzIodHAsKHJlZyksKHZhbCkpCisjZGVmaW5lIHR3MzJfZihyZWcsdmFsKQkJX3R3MzJfZmx1c2godHAsKHJlZyksKHZhbCkpCisjZGVmaW5lIHR3MTYocmVnLHZhbCkJCXdyaXRldygoKHZhbCkgJiAweGZmZmYpLCB0cC0+cmVncyArIChyZWcpKQorI2RlZmluZSB0dzgocmVnLHZhbCkJCXdyaXRlYigoKHZhbCkgJiAweGZmKSwgdHAtPnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgdHIzMihyZWcpCQlyZWFkbCh0cC0+cmVncyArIChyZWcpKQorI2RlZmluZSB0cjE2KHJlZykJCXJlYWR3KHRwLT5yZWdzICsgKHJlZykpCisjZGVmaW5lIHRyOChyZWcpCQlyZWFkYih0cC0+cmVncyArIChyZWcpKQorCitzdGF0aWMgdm9pZCB0ZzNfd3JpdGVfbWVtKHN0cnVjdCB0ZzMgKnRwLCB1MzIgb2ZmLCB1MzIgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmluZGlyZWN0X2xvY2ssIGZsYWdzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIG9mZik7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01FTV9XSU5fREFUQSwgdmFsKTsKKworCS8qIEFsd2F5cyBsZWF2ZSB0aGlzIGFzIHplcm8uICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01FTV9XSU5fQkFTRV9BRERSLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+aW5kaXJlY3RfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB0ZzNfcmVhZF9tZW0oc3RydWN0IHRnMyAqdHAsIHUzMiBvZmYsIHUzMiAqdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmluZGlyZWN0X2xvY2ssIGZsYWdzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIG9mZik7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUVNX1dJTl9EQVRBLCB2YWwpOworCisJLyogQWx3YXlzIGxlYXZlIHRoaXMgYXMgemVyby4gKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5pbmRpcmVjdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19kaXNhYmxlX2ludHMoc3RydWN0IHRnMyAqdHApCit7CisJdHczMihURzNQQ0lfTUlTQ19IT1NUX0NUUkwsCisJICAgICAodHAtPm1pc2NfaG9zdF9jdHJsIHwgTUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UKSk7CisJdHczMl9tYWlsYm94KE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgMHgwMDAwMDAwMSk7CisJdHIzMihNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1cpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGczX2NvbmRfaW50KHN0cnVjdCB0ZzMgKnRwKQoreworCWlmICh0cC0+aHdfc3RhdHVzLT5zdGF0dXMgJiBTRF9TVEFUVVNfVVBEQVRFRCkKKwkJdHczMihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsIHwgR1JDX0xDTENUUkxfU0VUSU5UKTsKK30KKworc3RhdGljIHZvaWQgdGczX2VuYWJsZV9pbnRzKHN0cnVjdCB0ZzMgKnRwKQoreworCXR3MzIoVEczUENJX01JU0NfSE9TVF9DVFJMLAorCSAgICAgKHRwLT5taXNjX2hvc3RfY3RybCAmIH5NSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpKTsKKwl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLCAweDAwMDAwMDAwKTsKKwl0cjMyKE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVyk7CisKKwl0ZzNfY29uZF9pbnQodHApOworfQorCisvKiB0ZzNfcmVzdGFydF9pbnRzCisgKiAgc2ltaWxhciB0byB0ZzNfZW5hYmxlX2ludHMsIGJ1dCBpdCBjYW4gcmV0dXJuIHdpdGhvdXQgZmx1c2hpbmcgdGhlCisgKiAgUElPIHdyaXRlIHdoaWNoIHJlZW5hYmxlcyBpbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyB2b2lkIHRnM19yZXN0YXJ0X2ludHMoc3RydWN0IHRnMyAqdHApCit7CisJdHczMihURzNQQ0lfTUlTQ19IT1NUX0NUUkwsCisJCSh0cC0+bWlzY19ob3N0X2N0cmwgJiB+TUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UKSk7CisJdHczMl9tYWlsYm94KE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgMHgwMDAwMDAwMCk7CisJbW1pb3diKCk7CisKKwl0ZzNfY29uZF9pbnQodHApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGczX25ldGlmX3N0b3Aoc3RydWN0IHRnMyAqdHApCit7CisJbmV0aWZfcG9sbF9kaXNhYmxlKHRwLT5kZXYpOworCW5ldGlmX3R4X2Rpc2FibGUodHAtPmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZzNfbmV0aWZfc3RhcnQoc3RydWN0IHRnMyAqdHApCit7CisJbmV0aWZfd2FrZV9xdWV1ZSh0cC0+ZGV2KTsKKwkvKiBOT1RFOiB1bmNvbmRpdGlvbmFsIG5ldGlmX3dha2VfcXVldWUgaXMgb25seSBhcHByb3ByaWF0ZQorCSAqIHNvIGxvbmcgYXMgYWxsIGNhbGxlcnMgYXJlIGFzc3VyZWQgdG8gaGF2ZSBmcmVlIHR4IHNsb3RzCisJICogKHN1Y2ggYXMgYWZ0ZXIgdGczX2luaXRfaHcpCisJICovCisJbmV0aWZfcG9sbF9lbmFibGUodHAtPmRldik7CisJdGczX2NvbmRfaW50KHRwKTsKK30KKworc3RhdGljIHZvaWQgdGczX3N3aXRjaF9jbG9ja3Moc3RydWN0IHRnMyAqdHApCit7CisJdTMyIGNsb2NrX2N0cmwgPSB0cjMyKFRHM1BDSV9DTE9DS19DVFJMKTsKKwl1MzIgb3JpZ19jbG9ja19jdHJsOworCisJb3JpZ19jbG9ja19jdHJsID0gY2xvY2tfY3RybDsKKwljbG9ja19jdHJsICY9IChDTE9DS19DVFJMX0ZPUkNFX0NMS1JVTiB8CisJCSAgICAgICBDTE9DS19DVFJMX0NMS1JVTl9PRU5BQkxFIHwKKwkJICAgICAgIDB4MWYpOworCXRwLT5wY2lfY2xvY2tfY3RybCA9IGNsb2NrX2N0cmw7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpIHsKKwkJaWYgKG9yaWdfY2xvY2tfY3RybCAmIENMT0NLX0NUUkxfNjI1X0NPUkUpIHsKKwkJCXR3MzJfZihURzNQQ0lfQ0xPQ0tfQ1RSTCwKKwkJCSAgICAgICBjbG9ja19jdHJsIHwgQ0xPQ0tfQ1RSTF82MjVfQ09SRSk7CisJCQl1ZGVsYXkoNDApOworCQl9CisJfSBlbHNlIGlmICgob3JpZ19jbG9ja19jdHJsICYgQ0xPQ0tfQ1RSTF80NE1IWl9DT1JFKSAhPSAwKSB7CisJCXR3MzJfZihURzNQQ0lfQ0xPQ0tfQ1RSTCwKKwkJICAgICBjbG9ja19jdHJsIHwKKwkJICAgICAoQ0xPQ0tfQ1RSTF80NE1IWl9DT1JFIHwgQ0xPQ0tfQ1RSTF9BTFRDTEspKTsKKwkJdWRlbGF5KDQwKTsKKwkJdHczMl9mKFRHM1BDSV9DTE9DS19DVFJMLAorCQkgICAgIGNsb2NrX2N0cmwgfCAoQ0xPQ0tfQ1RSTF9BTFRDTEspKTsKKwkJdWRlbGF5KDQwKTsKKwl9CisJdHczMl9mKFRHM1BDSV9DTE9DS19DVFJMLCBjbG9ja19jdHJsKTsKKwl1ZGVsYXkoNDApOworfQorCisjZGVmaW5lIFBIWV9CVVNZX0xPT1BTCTUwMDAKKworc3RhdGljIGludCB0ZzNfcmVhZHBoeShzdHJ1Y3QgdGczICp0cCwgaW50IHJlZywgdTMyICp2YWwpCit7CisJdTMyIGZyYW1lX3ZhbDsKKwl1bnNpZ25lZCBpbnQgbG9vcHM7CisJaW50IHJldDsKKworCWlmICgodHAtPm1pX21vZGUgJiBNQUNfTUlfTU9ERV9BVVRPX1BPTEwpICE9IDApIHsKKwkJdHczMl9mKE1BQ19NSV9NT0RFLAorCQkgICAgICh0cC0+bWlfbW9kZSAmIH5NQUNfTUlfTU9ERV9BVVRPX1BPTEwpKTsKKwkJdWRlbGF5KDgwKTsKKwl9CisKKwkqdmFsID0gMHgwOworCisJZnJhbWVfdmFsICA9ICgoUEhZX0FERFIgPDwgTUlfQ09NX1BIWV9BRERSX1NISUZUKSAmCisJCSAgICAgIE1JX0NPTV9QSFlfQUREUl9NQVNLKTsKKwlmcmFtZV92YWwgfD0gKChyZWcgPDwgTUlfQ09NX1JFR19BRERSX1NISUZUKSAmCisJCSAgICAgIE1JX0NPTV9SRUdfQUREUl9NQVNLKTsKKwlmcmFtZV92YWwgfD0gKE1JX0NPTV9DTURfUkVBRCB8IE1JX0NPTV9TVEFSVCk7CisJCisJdHczMl9mKE1BQ19NSV9DT00sIGZyYW1lX3ZhbCk7CisKKwlsb29wcyA9IFBIWV9CVVNZX0xPT1BTOworCXdoaWxlIChsb29wcyAhPSAwKSB7CisJCXVkZWxheSgxMCk7CisJCWZyYW1lX3ZhbCA9IHRyMzIoTUFDX01JX0NPTSk7CisKKwkJaWYgKChmcmFtZV92YWwgJiBNSV9DT01fQlVTWSkgPT0gMCkgeworCQkJdWRlbGF5KDUpOworCQkJZnJhbWVfdmFsID0gdHIzMihNQUNfTUlfQ09NKTsKKwkJCWJyZWFrOworCQl9CisJCWxvb3BzIC09IDE7CisJfQorCisJcmV0ID0gLUVCVVNZOworCWlmIChsb29wcyAhPSAwKSB7CisJCSp2YWwgPSBmcmFtZV92YWwgJiBNSV9DT01fREFUQV9NQVNLOworCQlyZXQgPSAwOworCX0KKworCWlmICgodHAtPm1pX21vZGUgJiBNQUNfTUlfTU9ERV9BVVRPX1BPTEwpICE9IDApIHsKKwkJdHczMl9mKE1BQ19NSV9NT0RFLCB0cC0+bWlfbW9kZSk7CisJCXVkZWxheSg4MCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZzNfd3JpdGVwaHkoc3RydWN0IHRnMyAqdHAsIGludCByZWcsIHUzMiB2YWwpCit7CisJdTMyIGZyYW1lX3ZhbDsKKwl1bnNpZ25lZCBpbnQgbG9vcHM7CisJaW50IHJldDsKKworCWlmICgodHAtPm1pX21vZGUgJiBNQUNfTUlfTU9ERV9BVVRPX1BPTEwpICE9IDApIHsKKwkJdHczMl9mKE1BQ19NSV9NT0RFLAorCQkgICAgICh0cC0+bWlfbW9kZSAmIH5NQUNfTUlfTU9ERV9BVVRPX1BPTEwpKTsKKwkJdWRlbGF5KDgwKTsKKwl9CisKKwlmcmFtZV92YWwgID0gKChQSFlfQUREUiA8PCBNSV9DT01fUEhZX0FERFJfU0hJRlQpICYKKwkJICAgICAgTUlfQ09NX1BIWV9BRERSX01BU0spOworCWZyYW1lX3ZhbCB8PSAoKHJlZyA8PCBNSV9DT01fUkVHX0FERFJfU0hJRlQpICYKKwkJICAgICAgTUlfQ09NX1JFR19BRERSX01BU0spOworCWZyYW1lX3ZhbCB8PSAodmFsICYgTUlfQ09NX0RBVEFfTUFTSyk7CisJZnJhbWVfdmFsIHw9IChNSV9DT01fQ01EX1dSSVRFIHwgTUlfQ09NX1NUQVJUKTsKKwkKKwl0dzMyX2YoTUFDX01JX0NPTSwgZnJhbWVfdmFsKTsKKworCWxvb3BzID0gUEhZX0JVU1lfTE9PUFM7CisJd2hpbGUgKGxvb3BzICE9IDApIHsKKwkJdWRlbGF5KDEwKTsKKwkJZnJhbWVfdmFsID0gdHIzMihNQUNfTUlfQ09NKTsKKwkJaWYgKChmcmFtZV92YWwgJiBNSV9DT01fQlVTWSkgPT0gMCkgeworCQkJdWRlbGF5KDUpOworCQkJZnJhbWVfdmFsID0gdHIzMihNQUNfTUlfQ09NKTsKKwkJCWJyZWFrOworCQl9CisJCWxvb3BzIC09IDE7CisJfQorCisJcmV0ID0gLUVCVVNZOworCWlmIChsb29wcyAhPSAwKQorCQlyZXQgPSAwOworCisJaWYgKCh0cC0+bWlfbW9kZSAmIE1BQ19NSV9NT0RFX0FVVE9fUE9MTCkgIT0gMCkgeworCQl0dzMyX2YoTUFDX01JX01PREUsIHRwLT5taV9tb2RlKTsKKwkJdWRlbGF5KDgwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0ZzNfcGh5X3NldF93aXJlc3BlZWQoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIHZhbDsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX05PX0VUSF9XSVJFX1NQRUVEKQorCQlyZXR1cm47CisKKwlpZiAoIXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHg3MDA3KSAmJgorCSAgICAhdGczX3JlYWRwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsICZ2YWwpKQorCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsCisJCQkgICAgICh2YWwgfCAoMSA8PCAxNSkgfCAoMSA8PCA0KSkpOworfQorCitzdGF0aWMgaW50IHRnM19ibWNyX3Jlc2V0KHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiBwaHlfY29udHJvbDsKKwlpbnQgbGltaXQsIGVycjsKKworCS8qIE9LLCByZXNldCBpdCwgYW5kIHBvbGwgdGhlIEJNQ1JfUkVTRVQgYml0IHVudGlsIGl0CisJICogY2xlYXJzIG9yIHdlIHRpbWUgb3V0LgorCSAqLworCXBoeV9jb250cm9sID0gQk1DUl9SRVNFVDsKKwllcnIgPSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCBwaHlfY29udHJvbCk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJbGltaXQgPSA1MDAwOworCXdoaWxlIChsaW1pdC0tKSB7CisJCWVyciA9IHRnM19yZWFkcGh5KHRwLCBNSUlfQk1DUiwgJnBoeV9jb250cm9sKTsKKwkJaWYgKGVyciAhPSAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAoKHBoeV9jb250cm9sICYgQk1DUl9SRVNFVCkgPT0gMCkgeworCQkJdWRlbGF5KDQwKTsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMCk7CisJfQorCWlmIChsaW1pdCA8PSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX3dhaXRfbWFjcm9fZG9uZShzdHJ1Y3QgdGczICp0cCkKK3sKKwlpbnQgbGltaXQgPSAxMDA7CisKKwl3aGlsZSAobGltaXQtLSkgeworCQl1MzIgdG1wMzI7CisKKwkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgMHgxNiwgJnRtcDMyKSkgeworCQkJaWYgKCh0bXAzMiAmIDB4MTAwMCkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAobGltaXQgPD0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRnM19waHlfd3JpdGVfYW5kX2NoZWNrX3Rlc3RwYXQoc3RydWN0IHRnMyAqdHAsIGludCAqcmVzZXRwKQoreworCXN0YXRpYyBjb25zdCB1MzIgdGVzdF9wYXRbNF1bNl0gPSB7CisJeyAweDAwMDA1NTU1LCAweDAwMDAwMDA1LCAweDAwMDAyYWFhLCAweDAwMDAwMDBhLCAweDAwMDAzNDU2LCAweDAwMDAwMDAzIH0sCisJeyAweDAwMDAyYWFhLCAweDAwMDAwMDBhLCAweDAwMDAzMzMzLCAweDAwMDAwMDAzLCAweDAwMDA3ODlhLCAweDAwMDAwMDA1IH0sCisJeyAweDAwMDA1YTVhLCAweDAwMDAwMDA1LCAweDAwMDAyYTZhLCAweDAwMDAwMDBhLCAweDAwMDAxYmNkLCAweDAwMDAwMDAzIH0sCisJeyAweDAwMDAyYTVhLCAweDAwMDAwMDBhLCAweDAwMDAzM2MzLCAweDAwMDAwMDAzLCAweDAwMDAyZWYxLCAweDAwMDAwMDA1IH0KKwl9OworCWludCBjaGFuOworCisJZm9yIChjaGFuID0gMDsgY2hhbiA8IDQ7IGNoYW4rKykgeworCQlpbnQgaTsKKworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsCisJCQkgICAgIChjaGFuICogMHgyMDAwKSB8IDB4MDIwMCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMDAyKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULAorCQkJCSAgICAgdGVzdF9wYXRbY2hhbl1baV0pOworCisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMjAyKTsKKwkJaWYgKHRnM193YWl0X21hY3JvX2RvbmUodHApKSB7CisJCQkqcmVzZXRwID0gMTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsCisJCQkgICAgIChjaGFuICogMHgyMDAwKSB8IDB4MDIwMCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMDgyKTsKKwkJaWYgKHRnM193YWl0X21hY3JvX2RvbmUodHApKSB7CisJCQkqcmVzZXRwID0gMTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4MDgwMik7CisJCWlmICh0ZzNfd2FpdF9tYWNyb19kb25lKHRwKSkgeworCQkJKnJlc2V0cCA9IDE7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkgKz0gMikgeworCQkJdTMyIGxvdywgaGlnaDsKKworCQkJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAmbG93KSB8fAorCQkJICAgIHRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAmaGlnaCkgfHwKKwkJCSAgICB0ZzNfd2FpdF9tYWNyb19kb25lKHRwKSkgeworCQkJCSpyZXNldHAgPSAxOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCQlsb3cgJj0gMHg3ZmZmOworCQkJaGlnaCAmPSAweDAwMGY7CisJCQlpZiAobG93ICE9IHRlc3RfcGF0W2NoYW5dW2ldIHx8CisJCQkgICAgaGlnaCAhPSB0ZXN0X3BhdFtjaGFuXVtpKzFdKSB7CisJCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDAwMGIpOworCQkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHg0MDAxKTsKKwkJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4NDAwNSk7CisKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX3BoeV9yZXNldF9jaGFucGF0KHN0cnVjdCB0ZzMgKnRwKQoreworCWludCBjaGFuOworCisJZm9yIChjaGFuID0gMDsgY2hhbiA8IDQ7IGNoYW4rKykgeworCQlpbnQgaTsKKworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsCisJCQkgICAgIChjaGFuICogMHgyMDAwKSB8IDB4MDIwMCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMDAyKTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgwMDApOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4MDIwMik7CisJCWlmICh0ZzNfd2FpdF9tYWNyb19kb25lKHRwKSkKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX3BoeV9yZXNldF81NzAzXzRfNShzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgcmVnMzIsIHBoeTlfb3JpZzsKKwlpbnQgcmV0cmllcywgZG9fcGh5X3Jlc2V0LCBlcnI7CisKKwlyZXRyaWVzID0gMTA7CisJZG9fcGh5X3Jlc2V0ID0gMTsKKwlkbyB7CisJCWlmIChkb19waHlfcmVzZXQpIHsKKwkJCWVyciA9IHRnM19ibWNyX3Jlc2V0KHRwKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJCWRvX3BoeV9yZXNldCA9IDA7CisJCX0KKworCQkvKiBEaXNhYmxlIHRyYW5zbWl0dGVyIGFuZCBpbnRlcnJ1cHQuICAqLworCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9URzNfRVhUX0NUUkwsICZyZWczMikpCisJCQljb250aW51ZTsKKworCQlyZWczMiB8PSAweDMwMDA7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgcmVnMzIpOworCisJCS8qIFNldCBmdWxsLWR1cGxleCwgMTAwMCBtYnBzLiAgKi8KKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQk1DUiwKKwkJCSAgICAgQk1DUl9GVUxMRFBMWCB8IFRHM19CTUNSX1NQRUVEMTAwMCk7CisKKwkJLyogU2V0IHRvIG1hc3RlciBtb2RlLiAgKi8KKwkJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0NUUkwsICZwaHk5X29yaWcpKQorCQkJY29udGludWU7CisKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0NUUkwsCisJCQkgICAgIChNSUlfVEczX0NUUkxfQVNfTUFTVEVSIHwKKwkJCSAgICAgIE1JSV9URzNfQ1RSTF9FTkFCTEVfQVNfTUFTVEVSKSk7CisKKwkJLyogRW5hYmxlIFNNX0RTUF9DTE9DSyBhbmQgNmRCLiAgKi8KKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDBjMDApOworCisJCS8qIEJsb2NrIHRoZSBQSFkgY29udHJvbCBhY2Nlc3MuICAqLworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4ODAwNSk7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgwODAwKTsKKworCQllcnIgPSB0ZzNfcGh5X3dyaXRlX2FuZF9jaGVja190ZXN0cGF0KHRwLCAmZG9fcGh5X3Jlc2V0KTsKKwkJaWYgKCFlcnIpCisJCQlicmVhazsKKwl9IHdoaWxlICgtLXJldHJpZXMpOworCisJZXJyID0gdGczX3BoeV9yZXNldF9jaGFucGF0KHRwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDgwMDUpOworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgwMDAwKTsKKworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHg4MjAwKTsKKwl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4MDAwMCk7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpIHsKKwkJLyogU2V0IEV4dGVuZGVkIHBhY2tldCBsZW5ndGggYml0IGZvciBqdW1ibyBmcmFtZXMgKi8KKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDQ0MDApOworCX0KKwllbHNlIHsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDA0MDApOworCX0KKworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCBwaHk5X29yaWcpOworCisJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgJnJlZzMyKSkgeworCQlyZWczMiAmPSB+MHgzMDAwOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRVhUX0NUUkwsIHJlZzMyKTsKKwl9IGVsc2UgaWYgKCFlcnIpCisJCWVyciA9IC1FQlVTWTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIFRoaXMgd2lsbCByZXNldCB0aGUgdGlnb24zIFBIWSBpZiB0aGVyZSBpcyBubyB2YWxpZAorICogbGluayB1bmxlc3MgdGhlIEZPUkNFIGFyZ3VtZW50IGlzIG5vbi16ZXJvLgorICovCitzdGF0aWMgaW50IHRnM19waHlfcmVzZXQoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIHBoeV9zdGF0dXM7CisJaW50IGVycjsKKworCWVyciAgPSB0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZwaHlfc3RhdHVzKTsKKwllcnIgfD0gdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmcGh5X3N0YXR1cyk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzIHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0IHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSB7CisJCWVyciA9IHRnM19waHlfcmVzZXRfNTcwM180XzUodHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gdGczX2JtY3JfcmVzZXQodHApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKK291dDoKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfQURDX0JVRykgeworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4MGMwMCk7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHgyMDFmKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDJhYWEpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4MDAwYSk7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgwMzIzKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDA0MDApOworCX0KKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfNTcwNF9BMF9CVUcpIHsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDFjLCAweDhkNjgpOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWMsIDB4OGQ2OCk7CisJfQorCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9CRVJfQlVHKSB7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHgwYzAwKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDAwMGEpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MzEwYik7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHgyMDFmKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDk1MDYpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4NDAxZik7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgxNGUyKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDA0MDApOworCX0KKwkvKiBTZXQgRXh0ZW5kZWQgcGFja2V0IGxlbmd0aCBiaXQgKGJpdCAxNCkgb24gYWxsIGNoaXBzIHRoYXQgKi8KKwkvKiBzdXBwb3J0IGp1bWJvIGZyYW1lcyAqLworCWlmICgodHAtPnBoeV9pZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfSURfQkNNNTQwMSkgeworCQkvKiBDYW5ub3QgZG8gcmVhZC1tb2RpZnktd3JpdGUgb24gNTQwMSAqLworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4NGMyMCk7CisJfSBlbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSAmJgorCQkgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTc1MCkgeworCQl1MzIgcGh5X3JlZzsKKworCQkvKiBTZXQgYml0IDE0IHdpdGggcmVhZC1tb2RpZnktd3JpdGUgdG8gcHJlc2VydmUgb3RoZXIgYml0cyAqLworCQlpZiAoIXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHgwMDA3KSAmJgorCQkgICAgIXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAmcGh5X3JlZykpCisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIHBoeV9yZWcgfCAweDQwMDApOworCX0KKworCS8qIFNldCBwaHkgcmVnaXN0ZXIgMHgxMCBiaXQgMCB0byBoaWdoIGZpZm8gZWxhc3RpY2l0eSB0byBzdXBwb3J0CisJICoganVtYm8gZnJhbWVzIHRyYW5zbWlzc2lvbi4KKwkgKi8KKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDUgJiYKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3NTApIHsKKwkJdTMyIHBoeV9yZWc7CisKKwkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgJnBoeV9yZWcpKQorCQkgICAgdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLAorCQkJCSBwaHlfcmVnIHwgTUlJX1RHM19FWFRfQ1RSTF9GSUZPX0VMQVNUSUMpOworCX0KKworCXRnM19waHlfc2V0X3dpcmVzcGVlZCh0cCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19mcm9iX2F1eF9wb3dlcihzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgdGczICp0cF9wZWVyID0gdHA7CisKKwlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FRVBST01fV1JJVEVfUFJPVCkgIT0gMCkKKwkJcmV0dXJuOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KSB7CisJCXRwX3BlZXIgPSBwY2lfZ2V0X2RydmRhdGEodHAtPnBkZXZfcGVlcik7CisJCWlmICghdHBfcGVlcikKKwkJCUJVRygpOworCX0KKworCisJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfV09MX0VOQUJMRSkgIT0gMCB8fAorCSAgICAodHBfcGVlci0+dGczX2ZsYWdzICYgVEczX0ZMQUdfV09MX0VOQUJMRSkgIT0gMCkgeworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDAgfHwKKwkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAxKSB7CisJCQl0dzMyX2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8CisJCQkgICAgIChHUkNfTENMQ1RSTF9HUElPX09FMCB8CisJCQkgICAgICBHUkNfTENMQ1RSTF9HUElPX09FMSB8CisJCQkgICAgICBHUkNfTENMQ1RSTF9HUElPX09FMiB8CisJCQkgICAgICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDAgfAorCQkJICAgICAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQxKSk7CisJCQl1ZGVsYXkoMTAwKTsKKwkJfSBlbHNlIHsKKwkJCXUzMiBub19ncGlvMjsKKwkJCXUzMiBncmNfbG9jYWxfY3RybDsKKworCQkJaWYgKHRwX3BlZXIgIT0gdHAgJiYKKwkJCSAgICAodHBfcGVlci0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSU5JVF9DT01QTEVURSkgIT0gMCkKKwkJCQlyZXR1cm47CisKKwkJCS8qIE9uIDU3NTMgYW5kIHZhcmlhbnRzLCBHUElPMiBjYW5ub3QgYmUgdXNlZC4gKi8KKwkJCW5vX2dwaW8yID0gdHAtPm5pY19zcmFtX2RhdGFfY2ZnICYKKwkJCQkgICAgTklDX1NSQU1fREFUQV9DRkdfTk9fR1BJTzI7CisKKwkJCWdyY19sb2NhbF9jdHJsID0gR1JDX0xDTENUUkxfR1BJT19PRTAgfAorCQkJCQkgR1JDX0xDTENUUkxfR1BJT19PRTEgfAorCQkJCQkgR1JDX0xDTENUUkxfR1BJT19PRTIgfAorCQkJCQkgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQxIHwKKwkJCQkJIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMjsKKwkJCWlmIChub19ncGlvMikgeworCQkJCWdyY19sb2NhbF9jdHJsICY9IH4oR1JDX0xDTENUUkxfR1BJT19PRTIgfAorCQkJCQkJICAgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMik7CisJCQl9CisJCQl0dzMyX2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8CisJCQkJCQlncmNfbG9jYWxfY3RybCk7CisJCQl1ZGVsYXkoMTAwKTsKKworCQkJZ3JjX2xvY2FsX2N0cmwgfD0gR1JDX0xDTENUUkxfR1BJT19PVVRQVVQwOworCisJCQl0dzMyX2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8CisJCQkJCQlncmNfbG9jYWxfY3RybCk7CisJCQl1ZGVsYXkoMTAwKTsKKworCQkJaWYgKCFub19ncGlvMikgeworCQkJCWdyY19sb2NhbF9jdHJsICY9IH5HUkNfTENMQ1RSTF9HUElPX09VVFBVVDI7CisJCQkJdHczMl9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwgfAorCQkJCSAgICAgICBncmNfbG9jYWxfY3RybCk7CisJCQkJdWRlbGF5KDEwMCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDAgJiYKKwkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAxKSB7CisJCQlpZiAodHBfcGVlciAhPSB0cCAmJgorCQkJICAgICh0cF9wZWVyLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKSAhPSAwKQorCQkJCXJldHVybjsKKworCQkJdHczMl9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwgfAorCQkJICAgICAoR1JDX0xDTENUUkxfR1BJT19PRTEgfAorCQkJICAgICAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQxKSk7CisJCQl1ZGVsYXkoMTAwKTsKKworCQkJdHczMl9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwgfAorCQkJICAgICAoR1JDX0xDTENUUkxfR1BJT19PRTEpKTsKKwkJCXVkZWxheSgxMDApOworCisJCQl0dzMyX2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8CisJCQkgICAgIChHUkNfTENMQ1RSTF9HUElPX09FMSB8CisJCQkgICAgICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDEpKTsKKwkJCXVkZWxheSgxMDApOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHRnM19zZXR1cF9waHkoc3RydWN0IHRnMyAqLCBpbnQpOworCisjZGVmaW5lIFJFU0VUX0tJTkRfU0hVVERPV04JMAorI2RlZmluZSBSRVNFVF9LSU5EX0lOSVQJCTEKKyNkZWZpbmUgUkVTRVRfS0lORF9TVVNQRU5ECTIKKworc3RhdGljIHZvaWQgdGczX3dyaXRlX3NpZ19wb3N0X3Jlc2V0KHN0cnVjdCB0ZzMgKiwgaW50KTsKK3N0YXRpYyBpbnQgdGczX2hhbHRfY3B1KHN0cnVjdCB0ZzMgKiwgdTMyKTsKKworc3RhdGljIGludCB0ZzNfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCB0ZzMgKnRwLCBpbnQgc3RhdGUpCit7CisJdTMyIG1pc2NfaG9zdF9jdHJsOworCXUxNiBwb3dlcl9jb250cm9sLCBwb3dlcl9jYXBzOworCWludCBwbSA9IHRwLT5wbV9jYXA7CisKKwkvKiBNYWtlIHN1cmUgcmVnaXN0ZXIgYWNjZXNzZXMgKGluZGlyZWN0IG9yIG90aGVyd2lzZSkKKwkgKiB3aWxsIGZ1bmN0aW9uIGNvcnJlY3RseS4KKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LAorCQkJICAgICAgIFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwKKwkJCSAgICAgICB0cC0+bWlzY19ob3N0X2N0cmwpOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQodHAtPnBkZXYsCisJCQkgICAgIHBtICsgUENJX1BNX0NUUkwsCisJCQkgICAgICZwb3dlcl9jb250cm9sKTsKKwlwb3dlcl9jb250cm9sIHw9IFBDSV9QTV9DVFJMX1BNRV9TVEFUVVM7CisJcG93ZXJfY29udHJvbCAmPSB+KFBDSV9QTV9DVFJMX1NUQVRFX01BU0spOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIDA6CisJCXBvd2VyX2NvbnRyb2wgfD0gMDsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRwLT5wZGV2LAorCQkJCSAgICAgIHBtICsgUENJX1BNX0NUUkwsCisJCQkJICAgICAgcG93ZXJfY29udHJvbCk7CisJCXR3MzJfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsKTsKKwkJdWRlbGF5KDEwMCk7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIDE6CisJCXBvd2VyX2NvbnRyb2wgfD0gMTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCXBvd2VyX2NvbnRyb2wgfD0gMjsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCXBvd2VyX2NvbnRyb2wgfD0gMzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiJXM6IEludmFsaWQgcG93ZXIgc3RhdGUgKCVkKSAiCisJCSAgICAgICAicmVxdWVzdGVkLlxuIiwKKwkJICAgICAgIHRwLT5kZXYtPm5hbWUsIHN0YXRlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKKworCXBvd2VyX2NvbnRyb2wgfD0gUENJX1BNX0NUUkxfUE1FX0VOQUJMRTsKKworCW1pc2NfaG9zdF9jdHJsID0gdHIzMihURzNQQ0lfTUlTQ19IT1NUX0NUUkwpOworCXR3MzIoVEczUENJX01JU0NfSE9TVF9DVFJMLAorCSAgICAgbWlzY19ob3N0X2N0cmwgfCBNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpOworCisJaWYgKHRwLT5saW5rX2NvbmZpZy5waHlfaXNfbG93X3Bvd2VyID09IDApIHsKKwkJdHAtPmxpbmtfY29uZmlnLnBoeV9pc19sb3dfcG93ZXIgPSAxOworCQl0cC0+bGlua19jb25maWcub3JpZ19zcGVlZCA9IHRwLT5saW5rX2NvbmZpZy5zcGVlZDsKKwkJdHAtPmxpbmtfY29uZmlnLm9yaWdfZHVwbGV4ID0gdHAtPmxpbmtfY29uZmlnLmR1cGxleDsKKwkJdHAtPmxpbmtfY29uZmlnLm9yaWdfYXV0b25lZyA9IHRwLT5saW5rX2NvbmZpZy5hdXRvbmVnOworCX0KKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykpIHsKKwkJdHAtPmxpbmtfY29uZmlnLnNwZWVkID0gU1BFRURfMTA7CisJCXRwLT5saW5rX2NvbmZpZy5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJdHAtPmxpbmtfY29uZmlnLmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwkJdGczX3NldHVwX3BoeSh0cCwgMCk7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX3dvcmQodHAtPnBkZXYsIHBtICsgUENJX1BNX1BNQywgJnBvd2VyX2NhcHMpOworCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19XT0xfRU5BQkxFKSB7CisJCXUzMiBtYWNfbW9kZTsKKworCQlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpKSB7CisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4NWEpOworCQkJdWRlbGF5KDQwKTsKKworCQkJbWFjX21vZGUgPSBNQUNfTU9ERV9QT1JUX01PREVfTUlJOworCisJCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDAgfHwKKwkJCSAgICAhKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19XT0xfU1BFRURfMTAwTUIpKQorCQkJCW1hY19tb2RlIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisJCX0gZWxzZSB7CisJCQltYWNfbW9kZSA9IE1BQ19NT0RFX1BPUlRfTU9ERV9UQkk7CisJCX0KKworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3NTApCisJCQl0dzMyKE1BQ19MRURfQ1RSTCwgdHAtPmxlZF9jdHJsKTsKKworCQlpZiAoKChwb3dlcl9jYXBzICYgUENJX1BNX0NBUF9QTUVfRDNjb2xkKSAmJgorCQkgICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfV09MX0VOQUJMRSkpKQorCQkJbWFjX21vZGUgfD0gTUFDX01PREVfTUFHSUNfUEtUX0VOQUJMRTsKKworCQl0dzMyX2YoTUFDX01PREUsIG1hY19tb2RlKTsKKwkJdWRlbGF5KDEwMCk7CisKKwkJdHczMl9mKE1BQ19SWF9NT0RFLCBSWF9NT0RFX0VOQUJMRSk7CisJCXVkZWxheSgxMCk7CisJfQorCisJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1dPTF9TUEVFRF8xMDBNQikgJiYKKwkgICAgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwIHx8CisJICAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMSkpIHsKKwkJdTMyIGJhc2VfdmFsOworCisJCWJhc2VfdmFsID0gdHAtPnBjaV9jbG9ja19jdHJsOworCQliYXNlX3ZhbCB8PSAoQ0xPQ0tfQ1RSTF9SWENMS19ESVNBQkxFIHwKKwkJCSAgICAgQ0xPQ0tfQ1RSTF9UWENMS19ESVNBQkxFKTsKKworCQl0dzMyX2YoVEczUENJX0NMT0NLX0NUUkwsIGJhc2VfdmFsIHwKKwkJICAgICBDTE9DS19DVFJMX0FMVENMSyB8CisJCSAgICAgQ0xPQ0tfQ1RSTF9QV1JET1dOX1BMTDEzMyk7CisJCXVkZWxheSg0MCk7CisJfSBlbHNlIGlmICghKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gNTc1MCkgJiYKKwkJICAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpKSkgeworCQl1MzIgbmV3Yml0czEsIG5ld2JpdHMyOworCisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAorCQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpIHsKKwkJCW5ld2JpdHMxID0gKENMT0NLX0NUUkxfUlhDTEtfRElTQUJMRSB8CisJCQkJICAgIENMT0NLX0NUUkxfVFhDTEtfRElTQUJMRSB8CisJCQkJICAgIENMT0NLX0NUUkxfQUxUQ0xLKTsKKwkJCW5ld2JpdHMyID0gbmV3Yml0czEgfCBDTE9DS19DVFJMXzQ0TUhaX0NPUkU7CisJCX0gZWxzZSBpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpIHsKKwkJCW5ld2JpdHMxID0gQ0xPQ0tfQ1RSTF82MjVfQ09SRTsKKwkJCW5ld2JpdHMyID0gbmV3Yml0czEgfCBDTE9DS19DVFJMX0FMVENMSzsKKwkJfSBlbHNlIHsKKwkJCW5ld2JpdHMxID0gQ0xPQ0tfQ1RSTF9BTFRDTEs7CisJCQluZXdiaXRzMiA9IG5ld2JpdHMxIHwgQ0xPQ0tfQ1RSTF80NE1IWl9DT1JFOworCQl9CisKKwkJdHczMl9mKFRHM1BDSV9DTE9DS19DVFJMLCB0cC0+cGNpX2Nsb2NrX2N0cmwgfCBuZXdiaXRzMSk7CisJCXVkZWxheSg0MCk7CisKKwkJdHczMl9mKFRHM1BDSV9DTE9DS19DVFJMLCB0cC0+cGNpX2Nsb2NrX2N0cmwgfCBuZXdiaXRzMik7CisJCXVkZWxheSg0MCk7CisKKwkJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CisJCQl1MzIgbmV3Yml0czM7CisKKwkJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAorCQkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAxKSB7CisJCQkJbmV3Yml0czMgPSAoQ0xPQ0tfQ1RSTF9SWENMS19ESVNBQkxFIHwKKwkJCQkJICAgIENMT0NLX0NUUkxfVFhDTEtfRElTQUJMRSB8CisJCQkJCSAgICBDTE9DS19DVFJMXzQ0TUhaX0NPUkUpOworCQkJfSBlbHNlIHsKKwkJCQluZXdiaXRzMyA9IENMT0NLX0NUUkxfNDRNSFpfQ09SRTsKKwkJCX0KKworCQkJdHczMl9mKFRHM1BDSV9DTE9DS19DVFJMLAorCQkJCQkgdHAtPnBjaV9jbG9ja19jdHJsIHwgbmV3Yml0czMpOworCQkJdWRlbGF5KDQwKTsKKwkJfQorCX0KKworCXRnM19mcm9iX2F1eF9wb3dlcih0cCk7CisKKwkvKiBXb3JrYXJvdW5kIGZvciB1bnN0YWJsZSBQTEwgY2xvY2sgKi8KKwlpZiAoKEdFVF9DSElQX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBDSElQUkVWXzU3NTBfQVgpIHx8CisJICAgIChHRVRfQ0hJUF9SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQ0hJUFJFVl81NzUwX0JYKSkgeworCQl1MzIgdmFsID0gdHIzMigweDdkMDApOworCisJCXZhbCAmPSB+KCgxIDw8IDE2KSB8ICgxIDw8IDQpIHwgKDEgPDwgMikgfCAoMSA8PCAxKSB8IDEpOworCQl0dzMyKDB4N2QwMCwgdmFsKTsKKwkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpKQorCQkJdGczX2hhbHRfY3B1KHRwLCBSWF9DUFVfQkFTRSk7CisJfQorCisJLyogRmluYWxseSwgc2V0IHRoZSBuZXcgcG93ZXIgc3RhdGUuICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBwbSArIFBDSV9QTV9DVFJMLCBwb3dlcl9jb250cm9sKTsKKworCXRnM193cml0ZV9zaWdfcG9zdF9yZXNldCh0cCwgUkVTRVRfS0lORF9TSFVURE9XTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGczX2xpbmtfcmVwb3J0KHN0cnVjdCB0ZzMgKnRwKQoreworCWlmICghbmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IExpbmsgaXMgZG93bi5cbiIsIHRwLT5kZXYtPm5hbWUpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogTGluayBpcyB1cCBhdCAlZCBNYnBzLCAlcyBkdXBsZXguXG4iLAorCQkgICAgICAgdHAtPmRldi0+bmFtZSwKKwkJICAgICAgICh0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMDAgPworCQkJMTAwMCA6CisJCQkodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9PSBTUEVFRF8xMDAgPworCQkJIDEwMCA6IDEwKSksCisJCSAgICAgICAodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwgPworCQkJImZ1bGwiIDogImhhbGYiKSk7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBGbG93IGNvbnRyb2wgaXMgJXMgZm9yIFRYIGFuZCAiCisJCSAgICAgICAiJXMgZm9yIFJYLlxuIiwKKwkJICAgICAgIHRwLT5kZXYtPm5hbWUsCisJCSAgICAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1RYX1BBVVNFKSA/ICJvbiIgOiAib2ZmIiwKKwkJICAgICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUlhfUEFVU0UpID8gIm9uIiA6ICJvZmYiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRnM19zZXR1cF9mbG93X2NvbnRyb2woc3RydWN0IHRnMyAqdHAsIHUzMiBsb2NhbF9hZHYsIHUzMiByZW1vdGVfYWR2KQoreworCXUzMiBuZXdfdGczX2ZsYWdzID0gMDsKKwl1MzIgb2xkX3J4X21vZGUgPSB0cC0+cnhfbW9kZTsKKwl1MzIgb2xkX3R4X21vZGUgPSB0cC0+dHhfbW9kZTsKKworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUEFVU0VfQVVUT05FRykgeworCQlpZiAobG9jYWxfYWR2ICYgQURWRVJUSVNFX1BBVVNFX0NBUCkgeworCQkJaWYgKGxvY2FsX2FkdiAmIEFEVkVSVElTRV9QQVVTRV9BU1lNKSB7CisJCQkJaWYgKHJlbW90ZV9hZHYgJiBMUEFfUEFVU0VfQ0FQKQorCQkJCQluZXdfdGczX2ZsYWdzIHw9CisJCQkJCQkoVEczX0ZMQUdfUlhfUEFVU0UgfAorCQkJCQkgCVRHM19GTEFHX1RYX1BBVVNFKTsKKwkJCQllbHNlIGlmIChyZW1vdGVfYWR2ICYgTFBBX1BBVVNFX0FTWU0pCisJCQkJCW5ld190ZzNfZmxhZ3MgfD0KKwkJCQkJCShURzNfRkxBR19SWF9QQVVTRSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChyZW1vdGVfYWR2ICYgTFBBX1BBVVNFX0NBUCkKKwkJCQkJbmV3X3RnM19mbGFncyB8PQorCQkJCQkJKFRHM19GTEFHX1JYX1BBVVNFIHwKKwkJCQkJIAlURzNfRkxBR19UWF9QQVVTRSk7CisJCQl9CisJCX0gZWxzZSBpZiAobG9jYWxfYWR2ICYgQURWRVJUSVNFX1BBVVNFX0FTWU0pIHsKKwkJCWlmICgocmVtb3RlX2FkdiAmIExQQV9QQVVTRV9DQVApICYmCisJCSAgICAJKHJlbW90ZV9hZHYgJiBMUEFfUEFVU0VfQVNZTSkpCisJCQkJbmV3X3RnM19mbGFncyB8PSBURzNfRkxBR19UWF9QQVVTRTsKKwkJfQorCisJCXRwLT50ZzNfZmxhZ3MgJj0gfihURzNfRkxBR19SWF9QQVVTRSB8IFRHM19GTEFHX1RYX1BBVVNFKTsKKwkJdHAtPnRnM19mbGFncyB8PSBuZXdfdGczX2ZsYWdzOworCX0gZWxzZSB7CisJCW5ld190ZzNfZmxhZ3MgPSB0cC0+dGczX2ZsYWdzOworCX0KKworCWlmIChuZXdfdGczX2ZsYWdzICYgVEczX0ZMQUdfUlhfUEFVU0UpCisJCXRwLT5yeF9tb2RlIHw9IFJYX01PREVfRkxPV19DVFJMX0VOQUJMRTsKKwllbHNlCisJCXRwLT5yeF9tb2RlICY9IH5SWF9NT0RFX0ZMT1dfQ1RSTF9FTkFCTEU7CisKKwlpZiAob2xkX3J4X21vZGUgIT0gdHAtPnJ4X21vZGUpIHsKKwkJdHczMl9mKE1BQ19SWF9NT0RFLCB0cC0+cnhfbW9kZSk7CisJfQorCQorCWlmIChuZXdfdGczX2ZsYWdzICYgVEczX0ZMQUdfVFhfUEFVU0UpCisJCXRwLT50eF9tb2RlIHw9IFRYX01PREVfRkxPV19DVFJMX0VOQUJMRTsKKwllbHNlCisJCXRwLT50eF9tb2RlICY9IH5UWF9NT0RFX0ZMT1dfQ1RSTF9FTkFCTEU7CisKKwlpZiAob2xkX3R4X21vZGUgIT0gdHAtPnR4X21vZGUpIHsKKwkJdHczMl9mKE1BQ19UWF9NT0RFLCB0cC0+dHhfbW9kZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0ZzNfYXV4X3N0YXRfdG9fc3BlZWRfZHVwbGV4KHN0cnVjdCB0ZzMgKnRwLCB1MzIgdmFsLCB1MTYgKnNwZWVkLCB1OCAqZHVwbGV4KQoreworCXN3aXRjaCAodmFsICYgTUlJX1RHM19BVVhfU1RBVF9TUERNQVNLKSB7CisJY2FzZSBNSUlfVEczX0FVWF9TVEFUXzEwSEFMRjoKKwkJKnNwZWVkID0gU1BFRURfMTA7CisJCSpkdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJYnJlYWs7CisKKwljYXNlIE1JSV9URzNfQVVYX1NUQVRfMTBGVUxMOgorCQkqc3BlZWQgPSBTUEVFRF8xMDsKKwkJKmR1cGxleCA9IERVUExFWF9GVUxMOworCQlicmVhazsKKworCWNhc2UgTUlJX1RHM19BVVhfU1RBVF8xMDBIQUxGOgorCQkqc3BlZWQgPSBTUEVFRF8xMDA7CisJCSpkdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJYnJlYWs7CisKKwljYXNlIE1JSV9URzNfQVVYX1NUQVRfMTAwRlVMTDoKKwkJKnNwZWVkID0gU1BFRURfMTAwOworCQkqZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWJyZWFrOworCisJY2FzZSBNSUlfVEczX0FVWF9TVEFUXzEwMDBIQUxGOgorCQkqc3BlZWQgPSBTUEVFRF8xMDAwOworCQkqZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCWJyZWFrOworCisJY2FzZSBNSUlfVEczX0FVWF9TVEFUXzEwMDBGVUxMOgorCQkqc3BlZWQgPSBTUEVFRF8xMDAwOworCQkqZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJKnNwZWVkID0gU1BFRURfSU5WQUxJRDsKKwkJKmR1cGxleCA9IERVUExFWF9JTlZBTElEOworCQlicmVhazsKKwl9OworfQorCitzdGF0aWMgdm9pZCB0ZzNfcGh5X2NvcHBlcl9iZWdpbihzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgbmV3X2FkdjsKKwlpbnQgaTsKKworCWlmICh0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlcikgeworCQkvKiBFbnRlcmluZyBsb3cgcG93ZXIgbW9kZS4gIERpc2FibGUgZ2lnYWJpdCBhbmQKKwkJICogMTAwYmFzZVQgYWR2ZXJ0aXNlbWVudHMuCisJCSAqLworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQ1RSTCwgMCk7CisKKwkJbmV3X2FkdiA9IChBRFZFUlRJU0VfMTBIQUxGIHwgQURWRVJUSVNFXzEwRlVMTCB8CisJCQkgICBBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9QQVVTRV9DQVApOworCQlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1dPTF9TUEVFRF8xMDBNQikKKwkJCW5ld19hZHYgfD0gKEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwMEZVTEwpOworCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX0FEVkVSVElTRSwgbmV3X2Fkdik7CisJfSBlbHNlIGlmICh0cC0+bGlua19jb25maWcuc3BlZWQgPT0gU1BFRURfSU5WQUxJRCkgeworCQl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgPQorCQkJKEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAorCQkJIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8CisJCQkgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJIEFEVkVSVElTRURfQXV0b25lZyB8IEFEVkVSVElTRURfTUlJKTsKKworCQlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKQorCQkJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICY9CisJCQkJfihBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCQkgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpOworCisJCW5ld19hZHYgPSAoQURWRVJUSVNFX0NTTUEgfCBBRFZFUlRJU0VfUEFVU0VfQ0FQKTsKKwkJaWYgKHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQorCQkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCisJCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMEZVTEw7CisJCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOworCQlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQorCQkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBuZXdfYWR2KTsKKworCQlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYKKwkJICAgIChBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkpIHsKKwkJCW5ld19hZHYgPSAwOworCQkJaWYgKHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYpCisJCQkJbmV3X2FkdiB8PSBNSUlfVEczX0NUUkxfQURWXzEwMDBfSEFMRjsKKwkJCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQorCQkJCW5ld19hZHYgfD0gTUlJX1RHM19DVFJMX0FEVl8xMDAwX0ZVTEw7CisJCQlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpICYmCisJCQkgICAgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0EwIHx8CisJCQkgICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IwKSkKKwkJCQluZXdfYWR2IHw9IChNSUlfVEczX0NUUkxfQVNfTUFTVEVSIHwKKwkJCQkJICAgIE1JSV9URzNfQ1RSTF9FTkFCTEVfQVNfTUFTVEVSKTsKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCBuZXdfYWR2KTsKKwkJfSBlbHNlIHsKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCAwKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEFza2luZyBmb3IgYSBzcGVjaWZpYyBsaW5rIG1vZGUuICovCisJCWlmICh0cC0+bGlua19jb25maWcuc3BlZWQgPT0gU1BFRURfMTAwMCkgeworCQkJbmV3X2FkdiA9IEFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX1BBVVNFX0NBUDsKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX0FEVkVSVElTRSwgbmV3X2Fkdik7CisKKwkJCWlmICh0cC0+bGlua19jb25maWcuZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJCW5ld19hZHYgPSBNSUlfVEczX0NUUkxfQURWXzEwMDBfRlVMTDsKKwkJCWVsc2UKKwkJCQluZXdfYWR2ID0gTUlJX1RHM19DVFJMX0FEVl8xMDAwX0hBTEY7CisJCQlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQTAgfHwKKwkJCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9CMCkKKwkJCQluZXdfYWR2IHw9IChNSUlfVEczX0NUUkxfQVNfTUFTVEVSIHwKKwkJCQkJICAgIE1JSV9URzNfQ1RSTF9FTkFCTEVfQVNfTUFTVEVSKTsKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCBuZXdfYWR2KTsKKwkJfSBlbHNlIHsKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCAwKTsKKworCQkJbmV3X2FkdiA9IEFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX1BBVVNFX0NBUDsKKwkJCWlmICh0cC0+bGlua19jb25maWcuc3BlZWQgPT0gU1BFRURfMTAwKSB7CisJCQkJaWYgKHRwLT5saW5rX2NvbmZpZy5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQkJCW5ld19hZHYgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJCQkJZWxzZQorCQkJCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodHAtPmxpbmtfY29uZmlnLmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCQkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTBGVUxMOworCQkJCWVsc2UKKwkJCQkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQkJfQorCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBuZXdfYWR2KTsKKwkJfQorCX0KKworCWlmICh0cC0+bGlua19jb25maWcuYXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUgJiYKKwkgICAgdHAtPmxpbmtfY29uZmlnLnNwZWVkICE9IFNQRUVEX0lOVkFMSUQpIHsKKwkJdTMyIGJtY3IsIG9yaWdfYm1jcjsKKworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID0gdHAtPmxpbmtfY29uZmlnLnNwZWVkOworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9IHRwLT5saW5rX2NvbmZpZy5kdXBsZXg7CisKKwkJYm1jciA9IDA7CisJCXN3aXRjaCAodHAtPmxpbmtfY29uZmlnLnNwZWVkKSB7CisJCWRlZmF1bHQ6CisJCWNhc2UgU1BFRURfMTA6CisJCQlicmVhazsKKworCQljYXNlIFNQRUVEXzEwMDoKKwkJCWJtY3IgfD0gQk1DUl9TUEVFRDEwMDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFRURfMTAwMDoKKwkJCWJtY3IgfD0gVEczX0JNQ1JfU1BFRUQxMDAwOworCQkJYnJlYWs7CisJCX07CisKKwkJaWYgKHRwLT5saW5rX2NvbmZpZy5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQlibWNyIHw9IEJNQ1JfRlVMTERQTFg7CisKKwkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNQ1IsICZvcmlnX2JtY3IpICYmCisJCSAgICAoYm1jciAhPSBvcmlnX2JtY3IpKSB7CisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCBCTUNSX0xPT1BCQUNLKTsKKwkJCWZvciAoaSA9IDA7IGkgPCAxNTAwOyBpKyspIHsKKwkJCQl1MzIgdG1wOworCisJCQkJdWRlbGF5KDEwKTsKKwkJCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmdG1wKSB8fAorCQkJCSAgICB0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZ0bXApKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoISh0bXAgJiBCTVNSX0xTVEFUVVMpKSB7CisJCQkJCXVkZWxheSg0MCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX0JNQ1IsIGJtY3IpOworCQkJdWRlbGF5KDQwKTsKKwkJfQorCX0gZWxzZSB7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX0JNQ1IsCisJCQkgICAgIEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJfQorfQorCitzdGF0aWMgaW50IHRnM19pbml0XzU0MDFwaHlfZHNwKHN0cnVjdCB0ZzMgKnRwKQoreworCWludCBlcnI7CisKKwkvKiBUdXJuIG9mZiB0YXAgcG93ZXIgbWFuYWdlbWVudC4gKi8KKwkvKiBTZXQgRXh0ZW5kZWQgcGFja2V0IGxlbmd0aCBiaXQgKi8KKwllcnIgID0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDRjMjApOworCisJZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHgwMDEyKTsKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDE4MDQpOworCisJZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHgwMDEzKTsKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDEyMDQpOworCisJZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHg4MDA2KTsKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDAxMzIpOworCisJZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHg4MDA2KTsKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDAyMzIpOworCisJZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHgyMDFmKTsKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDBhMjApOworCisJdWRlbGF5KDQwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdGczX2NvcHBlcl9pc19hZHZlcnRpc2luZ19hbGwoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIGFkdl9yZWcsIGFsbF9tYXNrOworCisJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfQURWRVJUSVNFLCAmYWR2X3JlZykpCisJCXJldHVybiAwOworCisJYWxsX21hc2sgPSAoQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV8xMEZVTEwgfAorCQkgICAgQURWRVJUSVNFXzEwMEhBTEYgfCBBRFZFUlRJU0VfMTAwRlVMTCk7CisJaWYgKChhZHZfcmVnICYgYWxsX21hc2spICE9IGFsbF9tYXNrKQorCQlyZXR1cm4gMDsKKwlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpKSB7CisJCXUzMiB0ZzNfY3RybDsKKworCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9URzNfQ1RSTCwgJnRnM19jdHJsKSkKKwkJCXJldHVybiAwOworCisJCWFsbF9tYXNrID0gKE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9IQUxGIHwKKwkJCSAgICBNSUlfVEczX0NUUkxfQURWXzEwMDBfRlVMTCk7CisJCWlmICgodGczX2N0cmwgJiBhbGxfbWFzaykgIT0gYWxsX21hc2spCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdGczX3NldHVwX2NvcHBlcl9waHkoc3RydWN0IHRnMyAqdHAsIGludCBmb3JjZV9yZXNldCkKK3sKKwlpbnQgY3VycmVudF9saW5rX3VwOworCXUzMiBibXNyLCBkdW1teTsKKwl1MTYgY3VycmVudF9zcGVlZDsKKwl1OCBjdXJyZW50X2R1cGxleDsKKwlpbnQgaSwgZXJyOworCisJdHczMihNQUNfRVZFTlQsIDApOworCisJdHczMl9mKE1BQ19TVEFUVVMsCisJICAgICAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCSAgICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQgfAorCSAgICAgIE1BQ19TVEFUVVNfTUlfQ09NUExFVElPTiB8CisJICAgICAgTUFDX1NUQVRVU19MTktTVEFURV9DSEFOR0VEKSk7CisJdWRlbGF5KDQwKTsKKworCXRwLT5taV9tb2RlID0gTUFDX01JX01PREVfQkFTRTsKKwl0dzMyX2YoTUFDX01JX01PREUsIHRwLT5taV9tb2RlKTsKKwl1ZGVsYXkoODApOworCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDAyKTsKKworCS8qIFNvbWUgdGhpcmQtcGFydHkgUEhZcyBuZWVkIHRvIGJlIHJlc2V0IG9uIGxpbmsgZ29pbmcKKwkgKiBkb3duLgorCSAqLworCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMgfHwKKwkgICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0IHx8CisJICAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkgJiYKKwkgICAgbmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSkgeworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKTsKKwkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKSAmJgorCQkgICAgIShibXNyICYgQk1TUl9MU1RBVFVTKSkKKwkJCWZvcmNlX3Jlc2V0ID0gMTsKKwl9CisJaWYgKGZvcmNlX3Jlc2V0KQorCQl0ZzNfcGh5X3Jlc2V0KHRwKTsKKworCWlmICgodHAtPnBoeV9pZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfSURfQkNNNTQwMSkgeworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKTsKKwkJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpIHx8CisJCSAgICAhKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKSkKKwkJCWJtc3IgPSAwOworCisJCWlmICghKGJtc3IgJiBCTVNSX0xTVEFUVVMpKSB7CisJCQllcnIgPSB0ZzNfaW5pdF81NDAxcGh5X2RzcCh0cCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisKKwkJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCQkJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQkJCXVkZWxheSgxMCk7CisJCQkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKSAmJgorCQkJCSAgICAoYm1zciAmIEJNU1JfTFNUQVRVUykpIHsKKwkJCQkJdWRlbGF5KDQwKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKHRwLT5waHlfaWQgJiBQSFlfSURfUkVWX01BU0spID09IFBIWV9SRVZfQkNNNTQwMV9CMCAmJgorCQkJICAgICEoYm1zciAmIEJNU1JfTFNUQVRVUykgJiYKKwkJCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMDApIHsKKwkJCQllcnIgPSB0ZzNfcGh5X3Jlc2V0KHRwKTsKKwkJCQlpZiAoIWVycikKKwkJCQkJZXJyID0gdGczX2luaXRfNTQwMXBoeV9kc3AodHApOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0EwIHx8CisJCSAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IwKSB7CisJCS8qIDU3MDEge0EwLEIwfSBDUkMgYnVnIHdvcmthcm91bmQgKi8KKwkJdGczX3dyaXRlcGh5KHRwLCAweDE1LCAweDBhNzUpOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWMsIDB4OGM2OCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxYywgMHg4ZDY4KTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDFjLCAweDhjNjgpOworCX0KKworCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cy4uLiAqLworCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0lTVEFULCAmZHVtbXkpOworCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0lTVEFULCAmZHVtbXkpOworCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19VU0VfTUlfSU5URVJSVVBUKQorCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfSU1BU0ssIH5NSUlfVEczX0lOVF9MSU5LQ0hHKTsKKwllbHNlCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19JTUFTSywgfjApOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwIHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAxKSB7CisJCWlmICh0cC0+bGVkX2N0cmwgPT0gTEVEX0NUUkxfTU9ERV9QSFlfMSkKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwKKwkJCQkgICAgIE1JSV9URzNfRVhUX0NUUkxfTE5LM19MRURfTU9ERSk7CisJCWVsc2UKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgMCk7CisJfQorCisJY3VycmVudF9saW5rX3VwID0gMDsKKwljdXJyZW50X3NwZWVkID0gU1BFRURfSU5WQUxJRDsKKwljdXJyZW50X2R1cGxleCA9IERVUExFWF9JTlZBTElEOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfQ0FQQUNJVElWRV9DT1VQTElORykgeworCQl1MzIgdmFsOworCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHg0MDA3KTsKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsICZ2YWwpOworCQlpZiAoISh2YWwgJiAoMSA8PCAxMCkpKSB7CisJCQl2YWwgfD0gKDEgPDwgMTApOworCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCB2YWwpOworCQkJZ290byByZWxpbms7CisJCX0KKwl9CisKKwlibXNyID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcik7CisJCWlmICghdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcikgJiYKKwkJICAgIChibXNyICYgQk1TUl9MU1RBVFVTKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoNDApOworCX0KKworCWlmIChibXNyICYgQk1TUl9MU1RBVFVTKSB7CisJCXUzMiBhdXhfc3RhdCwgYm1jcjsKKworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19BVVhfU1RBVCwgJmF1eF9zdGF0KTsKKwkJZm9yIChpID0gMDsgaSA8IDIwMDA7IGkrKykgeworCQkJdWRlbGF5KDEwKTsKKwkJCWlmICghdGczX3JlYWRwaHkodHAsIE1JSV9URzNfQVVYX1NUQVQsICZhdXhfc3RhdCkgJiYKKwkJCSAgICBhdXhfc3RhdCkKKwkJCQlicmVhazsKKwkJfQorCisJCXRnM19hdXhfc3RhdF90b19zcGVlZF9kdXBsZXgodHAsIGF1eF9zdGF0LAorCQkJCQkgICAgICZjdXJyZW50X3NwZWVkLAorCQkJCQkgICAgICZjdXJyZW50X2R1cGxleCk7CisKKwkJYm1jciA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgeworCQkJdGczX3JlYWRwaHkodHAsIE1JSV9CTUNSLCAmYm1jcik7CisJCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9CTUNSLCAmYm1jcikpCisJCQkJY29udGludWU7CisJCQlpZiAoYm1jciAmJiBibWNyICE9IDB4N2ZmZikKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxMCk7CisJCX0KKworCQlpZiAodHAtPmxpbmtfY29uZmlnLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJCWlmIChibWNyICYgQk1DUl9BTkVOQUJMRSkgeworCQkJCWN1cnJlbnRfbGlua191cCA9IDE7CisKKwkJCQkvKiBGb3JjZSBhdXRvbmVnIHJlc3RhcnQgaWYgd2UgYXJlIGV4aXRpbmcKKwkJCQkgKiBsb3cgcG93ZXIgbW9kZS4KKwkJCQkgKi8KKwkJCQlpZiAoIXRnM19jb3BwZXJfaXNfYWR2ZXJ0aXNpbmdfYWxsKHRwKSkKKwkJCQkJY3VycmVudF9saW5rX3VwID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJY3VycmVudF9saW5rX3VwID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghKGJtY3IgJiBCTUNSX0FORU5BQkxFKSAmJgorCQkJICAgIHRwLT5saW5rX2NvbmZpZy5zcGVlZCA9PSBjdXJyZW50X3NwZWVkICYmCisJCQkgICAgdHAtPmxpbmtfY29uZmlnLmR1cGxleCA9PSBjdXJyZW50X2R1cGxleCkgeworCQkJCWN1cnJlbnRfbGlua191cCA9IDE7CisJCQl9IGVsc2UgeworCQkJCWN1cnJlbnRfbGlua191cCA9IDA7CisJCQl9CisJCX0KKworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID0gY3VycmVudF9zcGVlZDsKKwkJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPSBjdXJyZW50X2R1cGxleDsKKwl9CisKKwlpZiAoY3VycmVudF9saW5rX3VwID09IDEgJiYKKwkgICAgKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4ID09IERVUExFWF9GVUxMKSAmJgorCSAgICAodHAtPmxpbmtfY29uZmlnLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpKSB7CisJCXUzMiBsb2NhbF9hZHYsIHJlbW90ZV9hZHY7CisKKwkJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfQURWRVJUSVNFLCAmbG9jYWxfYWR2KSkKKwkJCWxvY2FsX2FkdiA9IDA7CisJCWxvY2FsX2FkdiAmPSAoQURWRVJUSVNFX1BBVVNFX0NBUCB8IEFEVkVSVElTRV9QQVVTRV9BU1lNKTsKKworCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9MUEEsICZyZW1vdGVfYWR2KSkKKwkJCXJlbW90ZV9hZHYgPSAwOworCisJCXJlbW90ZV9hZHYgJj0gKExQQV9QQVVTRV9DQVAgfCBMUEFfUEFVU0VfQVNZTSk7CisKKwkJLyogSWYgd2UgYXJlIG5vdCBhZHZlcnRpc2luZyBmdWxsIHBhdXNlIGNhcGFiaWxpdHksCisJCSAqIHNvbWV0aGluZyBpcyB3cm9uZy4gIEJyaW5nIHRoZSBsaW5rIGRvd24gYW5kIHJlY29uZmlndXJlLgorCQkgKi8KKwkJaWYgKGxvY2FsX2FkdiAhPSBBRFZFUlRJU0VfUEFVU0VfQ0FQKSB7CisJCQljdXJyZW50X2xpbmtfdXAgPSAwOworCQl9IGVsc2UgeworCQkJdGczX3NldHVwX2Zsb3dfY29udHJvbCh0cCwgbG9jYWxfYWR2LCByZW1vdGVfYWR2KTsKKwkJfQorCX0KK3JlbGluazoKKwlpZiAoY3VycmVudF9saW5rX3VwID09IDApIHsKKwkJdTMyIHRtcDsKKworCQl0ZzNfcGh5X2NvcHBlcl9iZWdpbih0cCk7CisKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmdG1wKTsKKwkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZ0bXApICYmCisJCSAgICAodG1wICYgQk1TUl9MU1RBVFVTKSkKKwkJCWN1cnJlbnRfbGlua191cCA9IDE7CisJfQorCisJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9QT1JUX01PREVfTUFTSzsKKwlpZiAoY3VycmVudF9saW5rX3VwID09IDEpIHsKKwkJaWYgKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwIHx8CisJCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwKQorCQkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9NSUk7CisJCWVsc2UKKwkJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKKwl9IGVsc2UKKwkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJOworCisJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9IQUxGX0RVUExFWDsKKwlpZiAodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9IQUxGX0RVUExFWDsKKworCXRwLT5tYWNfbW9kZSAmPSB+TUFDX01PREVfTElOS19QT0xBUklUWTsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDApIHsKKwkJaWYgKCh0cC0+bGVkX2N0cmwgPT0gTEVEX0NUUkxfTU9ERV9QSFlfMikgfHwKKwkJICAgIChjdXJyZW50X2xpbmtfdXAgPT0gMSAmJgorCQkgICAgIHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTApKQorCQkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisJfSBlbHNlIHsKKwkJaWYgKGN1cnJlbnRfbGlua191cCA9PSAxKQorCQkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisJfQorCisJLyogPz8/IFdpdGhvdXQgdGhpcyBzZXR0aW5nIE5ldGdlYXIgR0EzMDJUIFBIWSBkb2VzIG5vdAorCSAqID8/PyBzZW5kL3JlY2VpdmUgcGFja2V0cy4uLgorCSAqLworCWlmICgodHAtPnBoeV9pZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfSURfQkNNNTQxMSAmJgorCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMF9BTFRJTUEpIHsKKwkJdHAtPm1pX21vZGUgfD0gTUFDX01JX01PREVfQVVUT19QT0xMOworCQl0dzMyX2YoTUFDX01JX01PREUsIHRwLT5taV9tb2RlKTsKKwkJdWRlbGF5KDgwKTsKKwl9CisKKwl0dzMyX2YoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisJdWRlbGF5KDQwKTsKKworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHKSB7CisJCS8qIFBvbGxlZCB2aWEgdGltZXIuICovCisJCXR3MzJfZihNQUNfRVZFTlQsIDApOworCX0gZWxzZSB7CisJCXR3MzJfZihNQUNfRVZFTlQsIE1BQ19FVkVOVF9MTktTVEFURV9DSEFOR0VEKTsKKwl9CisJdWRlbGF5KDQwKTsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCAmJgorCSAgICBjdXJyZW50X2xpbmtfdXAgPT0gMSAmJgorCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMDAgJiYKKwkgICAgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSB8fAorCSAgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lfSElHSF9TUEVFRCkpKSB7CisJCXVkZWxheSgxMjApOworCQl0dzMyX2YoTUFDX1NUQVRVUywKKwkJICAgICAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkgICAgICBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSk7CisJCXVkZWxheSg0MCk7CisJCXRnM193cml0ZV9tZW0odHAsCisJCQkgICAgICBOSUNfU1JBTV9GSVJNV0FSRV9NQk9YLAorCQkJICAgICAgTklDX1NSQU1fRklSTVdBUkVfTUJPWF9NQUdJQzIpOworCX0KKworCWlmIChjdXJyZW50X2xpbmtfdXAgIT0gbmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSkgeworCQlpZiAoY3VycmVudF9saW5rX3VwKQorCQkJbmV0aWZfY2Fycmllcl9vbih0cC0+ZGV2KTsKKwkJZWxzZQorCQkJbmV0aWZfY2Fycmllcl9vZmYodHAtPmRldik7CisJCXRnM19saW5rX3JlcG9ydCh0cCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB0ZzNfZmliZXJfYW5lZ2luZm8geworCWludCBzdGF0ZTsKKyNkZWZpbmUgQU5FR19TVEFURV9VTktOT1dOCQkwCisjZGVmaW5lIEFORUdfU1RBVEVfQU5fRU5BQkxFCQkxCisjZGVmaW5lIEFORUdfU1RBVEVfUkVTVEFSVF9JTklUCQkyCisjZGVmaW5lIEFORUdfU1RBVEVfUkVTVEFSVAkJMworI2RlZmluZSBBTkVHX1NUQVRFX0RJU0FCTEVfTElOS19PSwk0CisjZGVmaW5lIEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1RfSU5JVAk1CisjZGVmaW5lIEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1QJNgorI2RlZmluZSBBTkVHX1NUQVRFX0FDS19ERVRFQ1RfSU5JVAk3CisjZGVmaW5lIEFORUdfU1RBVEVfQUNLX0RFVEVDVAkJOAorI2RlZmluZSBBTkVHX1NUQVRFX0NPTVBMRVRFX0FDS19JTklUCTkKKyNkZWZpbmUgQU5FR19TVEFURV9DT01QTEVURV9BQ0sJCTEwCisjZGVmaW5lIEFORUdfU1RBVEVfSURMRV9ERVRFQ1RfSU5JVAkxMQorI2RlZmluZSBBTkVHX1NUQVRFX0lETEVfREVURUNUCQkxMgorI2RlZmluZSBBTkVHX1NUQVRFX0xJTktfT0sJCTEzCisjZGVmaW5lIEFORUdfU1RBVEVfTkVYVF9QQUdFX1dBSVRfSU5JVAkxNAorI2RlZmluZSBBTkVHX1NUQVRFX05FWFRfUEFHRV9XQUlUCTE1CisKKwl1MzIgZmxhZ3M7CisjZGVmaW5lIE1SX0FOX0VOQUJMRQkJMHgwMDAwMDAwMQorI2RlZmluZSBNUl9SRVNUQVJUX0FOCQkweDAwMDAwMDAyCisjZGVmaW5lIE1SX0FOX0NPTVBMRVRFCQkweDAwMDAwMDA0CisjZGVmaW5lIE1SX1BBR0VfUlgJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTVJfTlBfTE9BREVECQkweDAwMDAwMDEwCisjZGVmaW5lIE1SX1RPR0dMRV9UWAkJMHgwMDAwMDAyMAorI2RlZmluZSBNUl9MUF9BRFZfRlVMTF9EVVBMRVgJMHgwMDAwMDA0MAorI2RlZmluZSBNUl9MUF9BRFZfSEFMRl9EVVBMRVgJMHgwMDAwMDA4MAorI2RlZmluZSBNUl9MUF9BRFZfU1lNX1BBVVNFCTB4MDAwMDAxMDAKKyNkZWZpbmUgTVJfTFBfQURWX0FTWU1fUEFVU0UJMHgwMDAwMDIwMAorI2RlZmluZSBNUl9MUF9BRFZfUkVNT1RFX0ZBVUxUMQkweDAwMDAwNDAwCisjZGVmaW5lIE1SX0xQX0FEVl9SRU1PVEVfRkFVTFQyCTB4MDAwMDA4MDAKKyNkZWZpbmUgTVJfTFBfQURWX05FWFRfUEFHRQkweDAwMDAxMDAwCisjZGVmaW5lIE1SX1RPR0dMRV9SWAkJMHgwMDAwMjAwMAorI2RlZmluZSBNUl9OUF9SWAkJMHgwMDAwNDAwMAorCisjZGVmaW5lIE1SX0xJTktfT0sJCTB4ODAwMDAwMDAKKworCXVuc2lnbmVkIGxvbmcgbGlua190aW1lLCBjdXJfdGltZTsKKworCXUzMiBhYmlsaXR5X21hdGNoX2NmZzsKKwlpbnQgYWJpbGl0eV9tYXRjaF9jb3VudDsKKworCWNoYXIgYWJpbGl0eV9tYXRjaCwgaWRsZV9tYXRjaCwgYWNrX21hdGNoOworCisJdTMyIHR4Y29uZmlnLCByeGNvbmZpZzsKKyNkZWZpbmUgQU5FR19DRkdfTlAJCTB4MDAwMDAwODAKKyNkZWZpbmUgQU5FR19DRkdfQUNLCQkweDAwMDAwMDQwCisjZGVmaW5lIEFORUdfQ0ZHX1JGMgkJMHgwMDAwMDAyMAorI2RlZmluZSBBTkVHX0NGR19SRjEJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQU5FR19DRkdfUFMyCQkweDAwMDAwMDAxCisjZGVmaW5lIEFORUdfQ0ZHX1BTMQkJMHgwMDAwODAwMAorI2RlZmluZSBBTkVHX0NGR19IRAkJMHgwMDAwNDAwMAorI2RlZmluZSBBTkVHX0NGR19GRAkJMHgwMDAwMjAwMAorI2RlZmluZSBBTkVHX0NGR19JTlZBTAkJMHgwMDAwMWYwNgorCit9OworI2RlZmluZSBBTkVHX09LCQkwCisjZGVmaW5lIEFORUdfRE9ORQkxCisjZGVmaW5lIEFORUdfVElNRVJfRU5BQgkyCisjZGVmaW5lIEFORUdfRkFJTEVECS0xCisKKyNkZWZpbmUgQU5FR19TVEFURV9TRVRUTEVfVElNRQkxMDAwMAorCitzdGF0aWMgaW50IHRnM19maWJlcl9hbmVnX3NtYWNoaW5lKHN0cnVjdCB0ZzMgKnRwLAorCQkJCSAgIHN0cnVjdCB0ZzNfZmliZXJfYW5lZ2luZm8gKmFwKQoreworCXVuc2lnbmVkIGxvbmcgZGVsdGE7CisJdTMyIHJ4X2NmZ19yZWc7CisJaW50IHJldDsKKworCWlmIChhcC0+c3RhdGUgPT0gQU5FR19TVEFURV9VTktOT1dOKSB7CisJCWFwLT5yeGNvbmZpZyA9IDA7CisJCWFwLT5saW5rX3RpbWUgPSAwOworCQlhcC0+Y3VyX3RpbWUgPSAwOworCQlhcC0+YWJpbGl0eV9tYXRjaF9jZmcgPSAwOworCQlhcC0+YWJpbGl0eV9tYXRjaF9jb3VudCA9IDA7CisJCWFwLT5hYmlsaXR5X21hdGNoID0gMDsKKwkJYXAtPmlkbGVfbWF0Y2ggPSAwOworCQlhcC0+YWNrX21hdGNoID0gMDsKKwl9CisJYXAtPmN1cl90aW1lKys7CisKKwlpZiAodHIzMihNQUNfU1RBVFVTKSAmIE1BQ19TVEFUVVNfUkNWRF9DRkcpIHsKKwkJcnhfY2ZnX3JlZyA9IHRyMzIoTUFDX1JYX0FVVE9fTkVHKTsKKworCQlpZiAocnhfY2ZnX3JlZyAhPSBhcC0+YWJpbGl0eV9tYXRjaF9jZmcpIHsKKwkJCWFwLT5hYmlsaXR5X21hdGNoX2NmZyA9IHJ4X2NmZ19yZWc7CisJCQlhcC0+YWJpbGl0eV9tYXRjaCA9IDA7CisJCQlhcC0+YWJpbGl0eV9tYXRjaF9jb3VudCA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAoKythcC0+YWJpbGl0eV9tYXRjaF9jb3VudCA+IDEpIHsKKwkJCQlhcC0+YWJpbGl0eV9tYXRjaCA9IDE7CisJCQkJYXAtPmFiaWxpdHlfbWF0Y2hfY2ZnID0gcnhfY2ZnX3JlZzsKKwkJCX0KKwkJfQorCQlpZiAocnhfY2ZnX3JlZyAmIEFORUdfQ0ZHX0FDSykKKwkJCWFwLT5hY2tfbWF0Y2ggPSAxOworCQllbHNlCisJCQlhcC0+YWNrX21hdGNoID0gMDsKKworCQlhcC0+aWRsZV9tYXRjaCA9IDA7CisJfSBlbHNlIHsKKwkJYXAtPmlkbGVfbWF0Y2ggPSAxOworCQlhcC0+YWJpbGl0eV9tYXRjaF9jZmcgPSAwOworCQlhcC0+YWJpbGl0eV9tYXRjaF9jb3VudCA9IDA7CisJCWFwLT5hYmlsaXR5X21hdGNoID0gMDsKKwkJYXAtPmFja19tYXRjaCA9IDA7CisKKwkJcnhfY2ZnX3JlZyA9IDA7CisJfQorCisJYXAtPnJ4Y29uZmlnID0gcnhfY2ZnX3JlZzsKKwlyZXQgPSBBTkVHX09LOworCisJc3dpdGNoKGFwLT5zdGF0ZSkgeworCWNhc2UgQU5FR19TVEFURV9VTktOT1dOOgorCQlpZiAoYXAtPmZsYWdzICYgKE1SX0FOX0VOQUJMRSB8IE1SX1JFU1RBUlRfQU4pKQorCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BTl9FTkFCTEU7CisKKwkJLyogZmFsbHRocnUgKi8KKwljYXNlIEFORUdfU1RBVEVfQU5fRU5BQkxFOgorCQlhcC0+ZmxhZ3MgJj0gfihNUl9BTl9DT01QTEVURSB8IE1SX1BBR0VfUlgpOworCQlpZiAoYXAtPmZsYWdzICYgTVJfQU5fRU5BQkxFKSB7CisJCQlhcC0+bGlua190aW1lID0gMDsKKwkJCWFwLT5jdXJfdGltZSA9IDA7CisJCQlhcC0+YWJpbGl0eV9tYXRjaF9jZmcgPSAwOworCQkJYXAtPmFiaWxpdHlfbWF0Y2hfY291bnQgPSAwOworCQkJYXAtPmFiaWxpdHlfbWF0Y2ggPSAwOworCQkJYXAtPmlkbGVfbWF0Y2ggPSAwOworCQkJYXAtPmFja19tYXRjaCA9IDA7CisKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfUkVTVEFSVF9JTklUOworCQl9IGVsc2UgeworCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9ESVNBQkxFX0xJTktfT0s7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfUkVTVEFSVF9JTklUOgorCQlhcC0+bGlua190aW1lID0gYXAtPmN1cl90aW1lOworCQlhcC0+ZmxhZ3MgJj0gfihNUl9OUF9MT0FERUQpOworCQlhcC0+dHhjb25maWcgPSAwOworCQl0dzMyKE1BQ19UWF9BVVRPX05FRywgMCk7CisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwkJdWRlbGF5KDQwKTsKKworCQlyZXQgPSBBTkVHX1RJTUVSX0VOQUI7CisJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfUkVTVEFSVDsKKworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgQU5FR19TVEFURV9SRVNUQVJUOgorCQlkZWx0YSA9IGFwLT5jdXJfdGltZSAtIGFwLT5saW5rX3RpbWU7CisJCWlmIChkZWx0YSA+IEFORUdfU1RBVEVfU0VUVExFX1RJTUUpIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1RfSU5JVDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IEFORUdfVElNRVJfRU5BQjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9ESVNBQkxFX0xJTktfT0s6CisJCXJldCA9IEFORUdfRE9ORTsKKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1RfSU5JVDoKKwkJYXAtPmZsYWdzICY9IH4oTVJfVE9HR0xFX1RYKTsKKwkJYXAtPnR4Y29uZmlnID0gKEFORUdfQ0ZHX0ZEIHwgQU5FR19DRkdfUFMxKTsKKwkJdHczMihNQUNfVFhfQVVUT19ORUcsIGFwLT50eGNvbmZpZyk7CisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwkJdWRlbGF5KDQwKTsKKworCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FCSUxJVFlfREVURUNUOworCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9BQklMSVRZX0RFVEVDVDoKKwkJaWYgKGFwLT5hYmlsaXR5X21hdGNoICE9IDAgJiYgYXAtPnJ4Y29uZmlnICE9IDApIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQUNLX0RFVEVDVF9JTklUOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0FDS19ERVRFQ1RfSU5JVDoKKwkJYXAtPnR4Y29uZmlnIHw9IEFORUdfQ0ZHX0FDSzsKKwkJdHczMihNQUNfVFhfQVVUT19ORUcsIGFwLT50eGNvbmZpZyk7CisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwkJdWRlbGF5KDQwKTsKKworCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FDS19ERVRFQ1Q7CisKKwkJLyogZmFsbHRocnUgKi8KKwljYXNlIEFORUdfU1RBVEVfQUNLX0RFVEVDVDoKKwkJaWYgKGFwLT5hY2tfbWF0Y2ggIT0gMCkgeworCQkJaWYgKChhcC0+cnhjb25maWcgJiB+QU5FR19DRkdfQUNLKSA9PQorCQkJICAgIChhcC0+YWJpbGl0eV9tYXRjaF9jZmcgJiB+QU5FR19DRkdfQUNLKSkgeworCQkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQ09NUExFVEVfQUNLX0lOSVQ7CisJCQl9IGVsc2UgeworCQkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQU5fRU5BQkxFOworCQkJfQorCQl9IGVsc2UgaWYgKGFwLT5hYmlsaXR5X21hdGNoICE9IDAgJiYKKwkJCSAgIGFwLT5yeGNvbmZpZyA9PSAwKSB7CisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FOX0VOQUJMRTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9DT01QTEVURV9BQ0tfSU5JVDoKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX0lOVkFMKSB7CisJCQlyZXQgPSBBTkVHX0ZBSUxFRDsKKwkJCWJyZWFrOworCQl9CisJCWFwLT5mbGFncyAmPSB+KE1SX0xQX0FEVl9GVUxMX0RVUExFWCB8CisJCQkgICAgICAgTVJfTFBfQURWX0hBTEZfRFVQTEVYIHwKKwkJCSAgICAgICBNUl9MUF9BRFZfU1lNX1BBVVNFIHwKKwkJCSAgICAgICBNUl9MUF9BRFZfQVNZTV9QQVVTRSB8CisJCQkgICAgICAgTVJfTFBfQURWX1JFTU9URV9GQVVMVDEgfAorCQkJICAgICAgIE1SX0xQX0FEVl9SRU1PVEVfRkFVTFQyIHwKKwkJCSAgICAgICBNUl9MUF9BRFZfTkVYVF9QQUdFIHwKKwkJCSAgICAgICBNUl9UT0dHTEVfUlggfAorCQkJICAgICAgIE1SX05QX1JYKTsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX0ZEKQorCQkJYXAtPmZsYWdzIHw9IE1SX0xQX0FEVl9GVUxMX0RVUExFWDsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX0hEKQorCQkJYXAtPmZsYWdzIHw9IE1SX0xQX0FEVl9IQUxGX0RVUExFWDsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX1BTMSkKKwkJCWFwLT5mbGFncyB8PSBNUl9MUF9BRFZfU1lNX1BBVVNFOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfUFMyKQorCQkJYXAtPmZsYWdzIHw9IE1SX0xQX0FEVl9BU1lNX1BBVVNFOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfUkYxKQorCQkJYXAtPmZsYWdzIHw9IE1SX0xQX0FEVl9SRU1PVEVfRkFVTFQxOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfUkYyKQorCQkJYXAtPmZsYWdzIHw9IE1SX0xQX0FEVl9SRU1PVEVfRkFVTFQyOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfTlApCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTFBfQURWX05FWFRfUEFHRTsKKworCQlhcC0+bGlua190aW1lID0gYXAtPmN1cl90aW1lOworCisJCWFwLT5mbGFncyBePSAoTVJfVE9HR0xFX1RYKTsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIDB4MDAwOCkKKwkJCWFwLT5mbGFncyB8PSBNUl9UT0dHTEVfUlg7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19OUCkKKwkJCWFwLT5mbGFncyB8PSBNUl9OUF9SWDsKKwkJYXAtPmZsYWdzIHw9IE1SX1BBR0VfUlg7CisKKwkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9DT01QTEVURV9BQ0s7CisJCXJldCA9IEFORUdfVElNRVJfRU5BQjsKKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfQ09NUExFVEVfQUNLOgorCQlpZiAoYXAtPmFiaWxpdHlfbWF0Y2ggIT0gMCAmJgorCQkgICAgYXAtPnJ4Y29uZmlnID09IDApIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQU5fRU5BQkxFOworCQkJYnJlYWs7CisJCX0KKwkJZGVsdGEgPSBhcC0+Y3VyX3RpbWUgLSBhcC0+bGlua190aW1lOworCQlpZiAoZGVsdGEgPiBBTkVHX1NUQVRFX1NFVFRMRV9USU1FKSB7CisJCQlpZiAoIShhcC0+ZmxhZ3MgJiAoTVJfTFBfQURWX05FWFRfUEFHRSkpKSB7CisJCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9JRExFX0RFVEVDVF9JTklUOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKGFwLT50eGNvbmZpZyAmIEFORUdfQ0ZHX05QKSA9PSAwICYmCisJCQkJICAgICEoYXAtPmZsYWdzICYgTVJfTlBfUlgpKSB7CisJCQkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfSURMRV9ERVRFQ1RfSU5JVDsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXQgPSBBTkVHX0ZBSUxFRDsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfSURMRV9ERVRFQ1RfSU5JVDoKKwkJYXAtPmxpbmtfdGltZSA9IGFwLT5jdXJfdGltZTsKKwkJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwkJdWRlbGF5KDQwKTsKKworCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0lETEVfREVURUNUOworCQlyZXQgPSBBTkVHX1RJTUVSX0VOQUI7CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0lETEVfREVURUNUOgorCQlpZiAoYXAtPmFiaWxpdHlfbWF0Y2ggIT0gMCAmJgorCQkgICAgYXAtPnJ4Y29uZmlnID09IDApIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQU5fRU5BQkxFOworCQkJYnJlYWs7CisJCX0KKwkJZGVsdGEgPSBhcC0+Y3VyX3RpbWUgLSBhcC0+bGlua190aW1lOworCQlpZiAoZGVsdGEgPiBBTkVHX1NUQVRFX1NFVFRMRV9USU1FKSB7CisJCQkvKiBYWFggYW5vdGhlciBnZW0gZnJvbSB0aGUgQnJvYWRjb20gZHJpdmVyIDooICovCisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0xJTktfT0s7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfTElOS19PSzoKKwkJYXAtPmZsYWdzIHw9IChNUl9BTl9DT01QTEVURSB8IE1SX0xJTktfT0spOworCQlyZXQgPSBBTkVHX0RPTkU7CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX05FWFRfUEFHRV9XQUlUX0lOSVQ6CisJCS8qID8/PyB1bmltcGxlbWVudGVkICovCisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX05FWFRfUEFHRV9XQUlUOgorCQkvKiA/Pz8gdW5pbXBsZW1lbnRlZCAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IEFORUdfRkFJTEVEOworCQlicmVhazsKKwl9OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmaWJlcl9hdXRvbmVnKHN0cnVjdCB0ZzMgKnRwLCB1MzIgKmZsYWdzKQoreworCWludCByZXMgPSAwOworCXN0cnVjdCB0ZzNfZmliZXJfYW5lZ2luZm8gYW5pbmZvOworCWludCBzdGF0dXMgPSBBTkVHX0ZBSUxFRDsKKwl1bnNpZ25lZCBpbnQgdGljazsKKwl1MzIgdG1wOworCisJdHczMl9mKE1BQ19UWF9BVVRPX05FRywgMCk7CisKKwl0bXAgPSB0cC0+bWFjX21vZGUgJiB+TUFDX01PREVfUE9SVF9NT0RFX01BU0s7CisJdHczMl9mKE1BQ19NT0RFLCB0bXAgfCBNQUNfTU9ERV9QT1JUX01PREVfR01JSSk7CisJdWRlbGF5KDQwKTsKKworCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlIHwgTUFDX01PREVfU0VORF9DT05GSUdTKTsKKwl1ZGVsYXkoNDApOworCisJbWVtc2V0KCZhbmluZm8sIDAsIHNpemVvZihhbmluZm8pKTsKKwlhbmluZm8uZmxhZ3MgfD0gTVJfQU5fRU5BQkxFOworCWFuaW5mby5zdGF0ZSA9IEFORUdfU1RBVEVfVU5LTk9XTjsKKwlhbmluZm8uY3VyX3RpbWUgPSAwOworCXRpY2sgPSAwOworCXdoaWxlICgrK3RpY2sgPCAxOTUwMDApIHsKKwkJc3RhdHVzID0gdGczX2ZpYmVyX2FuZWdfc21hY2hpbmUodHAsICZhbmluZm8pOworCQlpZiAoc3RhdHVzID09IEFORUdfRE9ORSB8fCBzdGF0dXMgPT0gQU5FR19GQUlMRUQpCisJCQlicmVhazsKKworCQl1ZGVsYXkoMSk7CisJfQorCisJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCXVkZWxheSg0MCk7CisKKwkqZmxhZ3MgPSBhbmluZm8uZmxhZ3M7CisKKwlpZiAoc3RhdHVzID09IEFORUdfRE9ORSAmJgorCSAgICAoYW5pbmZvLmZsYWdzICYgKE1SX0FOX0NPTVBMRVRFIHwgTVJfTElOS19PSyB8CisJCQkgICAgIE1SX0xQX0FEVl9GVUxMX0RVUExFWCkpKQorCQlyZXMgPSAxOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgdGczX2luaXRfYmNtODAwMihzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgbWFjX3N0YXR1cyA9IHRyMzIoTUFDX1NUQVRVUyk7CisJaW50IGk7CisKKwkvKiBSZXNldCB3aGVuIGluaXR0aW5nIGZpcnN0IHRpbWUgb3Igd2UgaGF2ZSBhIGxpbmsuICovCisJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSU5JVF9DT01QTEVURSkgJiYKKwkgICAgIShtYWNfc3RhdHVzICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSkKKwkJcmV0dXJuOworCisJLyogU2V0IFBMTCBsb2NrIHJhbmdlLiAqLworCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHg4MDA3KTsKKworCS8qIFNXIHJlc2V0ICovCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisKKwkvKiBXYWl0IGZvciByZXNldCB0byBjb21wbGV0ZS4gKi8KKwkvKiBYWFggc2NoZWR1bGVfdGltZW91dCgpIC4uLiAqLworCWZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykKKwkJdWRlbGF5KDEwKTsKKworCS8qIENvbmZpZyBtb2RlOyBzZWxlY3QgUE1BL0NoIDEgcmVncy4gKi8KKwl0ZzNfd3JpdGVwaHkodHAsIDB4MTAsIDB4ODQxMSk7CisKKwkvKiBFbmFibGUgYXV0by1sb2NrIGFuZCBjb21kZXQsIHNlbGVjdCB0eGNsayBmb3IgdHguICovCisJdGczX3dyaXRlcGh5KHRwLCAweDExLCAweDBhMTApOworCisJdGczX3dyaXRlcGh5KHRwLCAweDE4LCAweDAwYTApOworCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHg0MWZmKTsKKworCS8qIEFzc2VydCBhbmQgZGVhc3NlcnQgUE9SLiAqLworCXRnM193cml0ZXBoeSh0cCwgMHgxMywgMHgwNDAwKTsKKwl1ZGVsYXkoNDApOworCXRnM193cml0ZXBoeSh0cCwgMHgxMywgMHgwMDAwKTsKKworCXRnM193cml0ZXBoeSh0cCwgMHgxMSwgMHgwYTUwKTsKKwl1ZGVsYXkoNDApOworCXRnM193cml0ZXBoeSh0cCwgMHgxMSwgMHgwYTEwKTsKKworCS8qIFdhaXQgZm9yIHNpZ25hbCB0byBzdGFiaWxpemUgKi8KKwkvKiBYWFggc2NoZWR1bGVfdGltZW91dCgpIC4uLiAqLworCWZvciAoaSA9IDA7IGkgPCAxNTAwMDsgaSsrKQorCQl1ZGVsYXkoMTApOworCisJLyogRGVzZWxlY3QgdGhlIGNoYW5uZWwgcmVnaXN0ZXIgc28gd2UgY2FuIHJlYWQgdGhlIFBIWUlECisJICogbGF0ZXIuCisJICovCisJdGczX3dyaXRlcGh5KHRwLCAweDEwLCAweDgwMTEpOworfQorCitzdGF0aWMgaW50IHRnM19zZXR1cF9maWJlcl9od19hdXRvbmVnKHN0cnVjdCB0ZzMgKnRwLCB1MzIgbWFjX3N0YXR1cykKK3sKKwl1MzIgc2dfZGlnX2N0cmwsIHNnX2RpZ19zdGF0dXM7CisJdTMyIHNlcmRlc19jZmcsIGV4cGVjdGVkX3NnX2RpZ19jdHJsOworCWludCB3b3JrYXJvdW5kLCBwb3J0X2E7CisJaW50IGN1cnJlbnRfbGlua191cDsKKworCXNlcmRlc19jZmcgPSAwOworCWV4cGVjdGVkX3NnX2RpZ19jdHJsID0gMDsKKwl3b3JrYXJvdW5kID0gMDsKKwlwb3J0X2EgPSAxOworCWN1cnJlbnRfbGlua191cCA9IDA7CisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MDRfQTAgJiYKKwkgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MDRfQTEpIHsKKwkJd29ya2Fyb3VuZCA9IDE7CisJCWlmICh0cjMyKFRHM1BDSV9EVUFMX01BQ19DVFJMKSAmIERVQUxfTUFDX0NUUkxfSUQpCisJCQlwb3J0X2EgPSAwOworCisJCS8qIHByZXNlcnZlIGJpdHMgMC0xMSwxMywxNCBmb3Igc2lnbmFsIHByZS1lbXBoYXNpcyAqLworCQkvKiBwcmVzZXJ2ZSBiaXRzIDIwLTIzIGZvciB2b2x0YWdlIHJlZ3VsYXRvciAqLworCQlzZXJkZXNfY2ZnID0gdHIzMihNQUNfU0VSREVTX0NGRykgJiAweDAwZjA2ZmZmOworCX0KKworCXNnX2RpZ19jdHJsID0gdHIzMihTR19ESUdfQ1RSTCk7CisKKwlpZiAodHAtPmxpbmtfY29uZmlnLmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUpIHsKKwkJaWYgKHNnX2RpZ19jdHJsICYgKDEgPDwgMzEpKSB7CisJCQlpZiAod29ya2Fyb3VuZCkgeworCQkJCXUzMiB2YWwgPSBzZXJkZXNfY2ZnOworCisJCQkJaWYgKHBvcnRfYSkKKwkJCQkJdmFsIHw9IDB4YzAxMDAwMDsKKwkJCQllbHNlCisJCQkJCXZhbCB8PSAweDQwMTAwMDA7CisJCQkJdHczMl9mKE1BQ19TRVJERVNfQ0ZHLCB2YWwpOworCQkJfQorCQkJdHczMl9mKFNHX0RJR19DVFJMLCAweDAxMzg4NDAwKTsKKwkJfQorCQlpZiAobWFjX3N0YXR1cyAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkgeworCQkJdGczX3NldHVwX2Zsb3dfY29udHJvbCh0cCwgMCwgMCk7CisJCQljdXJyZW50X2xpbmtfdXAgPSAxOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCS8qIFdhbnQgYXV0by1uZWdvdGlhdGlvbi4gICovCisJZXhwZWN0ZWRfc2dfZGlnX2N0cmwgPSAweDgxMzg4NDAwOworCisJLyogUGF1c2UgY2FwYWJpbGl0eSAqLworCWV4cGVjdGVkX3NnX2RpZ19jdHJsIHw9ICgxIDw8IDExKTsKKworCS8qIEFzeW1ldHRyaWMgcGF1c2UgKi8KKwlleHBlY3RlZF9zZ19kaWdfY3RybCB8PSAoMSA8PCAxMik7CisKKwlpZiAoc2dfZGlnX2N0cmwgIT0gZXhwZWN0ZWRfc2dfZGlnX2N0cmwpIHsKKwkJaWYgKHdvcmthcm91bmQpCisJCQl0dzMyX2YoTUFDX1NFUkRFU19DRkcsIHNlcmRlc19jZmcgfCAweGMwMTEwMDApOworCQl0dzMyX2YoU0dfRElHX0NUUkwsIGV4cGVjdGVkX3NnX2RpZ19jdHJsIHwgKDEgPDwgMzApKTsKKwkJdWRlbGF5KDUpOworCQl0dzMyX2YoU0dfRElHX0NUUkwsIGV4cGVjdGVkX3NnX2RpZ19jdHJsKTsKKworCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QSFlfSlVTVF9JTklUVEVEOworCX0gZWxzZSBpZiAobWFjX3N0YXR1cyAmIChNQUNfU1RBVFVTX1BDU19TWU5DRUQgfAorCQkJCSBNQUNfU1RBVFVTX1NJR05BTF9ERVQpKSB7CisJCWludCBpOworCisJCS8qIEdpdmVyIHRpbWUgdG8gbmVnb3RpYXRlICh+MjAwbXMpICovCisJCWZvciAoaSA9IDA7IGkgPCA0MDAwMDsgaSsrKSB7CisJCQlzZ19kaWdfc3RhdHVzID0gdHIzMihTR19ESUdfU1RBVFVTKTsKKwkJCWlmIChzZ19kaWdfc3RhdHVzICYgKDB4MykpCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoNSk7CisJCX0KKwkJbWFjX3N0YXR1cyA9IHRyMzIoTUFDX1NUQVRVUyk7CisKKwkJaWYgKChzZ19kaWdfc3RhdHVzICYgKDEgPDwgMSkpICYmCisJCSAgICAobWFjX3N0YXR1cyAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkpIHsKKwkJCXUzMiBsb2NhbF9hZHYsIHJlbW90ZV9hZHY7CisKKwkJCWxvY2FsX2FkdiA9IEFEVkVSVElTRV9QQVVTRV9DQVA7CisJCQlyZW1vdGVfYWR2ID0gMDsKKwkJCWlmIChzZ19kaWdfc3RhdHVzICYgKDEgPDwgMTkpKQorCQkJCXJlbW90ZV9hZHYgfD0gTFBBX1BBVVNFX0NBUDsKKwkJCWlmIChzZ19kaWdfc3RhdHVzICYgKDEgPDwgMjApKQorCQkJCXJlbW90ZV9hZHYgfD0gTFBBX1BBVVNFX0FTWU07CisKKwkJCXRnM19zZXR1cF9mbG93X2NvbnRyb2wodHAsIGxvY2FsX2FkdiwgcmVtb3RlX2Fkdik7CisJCQljdXJyZW50X2xpbmtfdXAgPSAxOworCQkJdHAtPnRnM19mbGFnczIgJj0gflRHM19GTEcyX1BIWV9KVVNUX0lOSVRURUQ7CisJCX0gZWxzZSBpZiAoIShzZ19kaWdfc3RhdHVzICYgKDEgPDwgMSkpKSB7CisJCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfSlVTVF9JTklUVEVEKQorCQkJCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9QSFlfSlVTVF9JTklUVEVEOworCQkJZWxzZSB7CisJCQkJaWYgKHdvcmthcm91bmQpIHsKKwkJCQkJdTMyIHZhbCA9IHNlcmRlc19jZmc7CisKKwkJCQkJaWYgKHBvcnRfYSkKKwkJCQkJCXZhbCB8PSAweGMwMTAwMDA7CisJCQkJCWVsc2UKKwkJCQkJCXZhbCB8PSAweDQwMTAwMDA7CisKKwkJCQkJdHczMl9mKE1BQ19TRVJERVNfQ0ZHLCB2YWwpOworCQkJCX0KKworCQkJCXR3MzJfZihTR19ESUdfQ1RSTCwgMHgwMTM4ODQwMCk7CisJCQkJdWRlbGF5KDQwKTsKKworCQkJCS8qIExpbmsgcGFyYWxsZWwgZGV0ZWN0aW9uIC0gbGluayBpcyB1cCAqLworCQkJCS8qIG9ubHkgaWYgd2UgaGF2ZSBQQ1NfU1lOQyBhbmQgbm90ICovCisJCQkJLyogcmVjZWl2aW5nIGNvbmZpZyBjb2RlIHdvcmRzICovCisJCQkJbWFjX3N0YXR1cyA9IHRyMzIoTUFDX1NUQVRVUyk7CisJCQkJaWYgKChtYWNfc3RhdHVzICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSAmJgorCQkJCSAgICAhKG1hY19zdGF0dXMgJiBNQUNfU1RBVFVTX1JDVkRfQ0ZHKSkgeworCQkJCQl0ZzNfc2V0dXBfZmxvd19jb250cm9sKHRwLCAwLCAwKTsKKwkJCQkJY3VycmVudF9saW5rX3VwID0gMTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK291dDoKKwlyZXR1cm4gY3VycmVudF9saW5rX3VwOworfQorCitzdGF0aWMgaW50IHRnM19zZXR1cF9maWJlcl9ieV9oYW5kKHN0cnVjdCB0ZzMgKnRwLCB1MzIgbWFjX3N0YXR1cykKK3sKKwlpbnQgY3VycmVudF9saW5rX3VwID0gMDsKKworIAlpZiAoIShtYWNfc3RhdHVzICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSkgeworCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19HT1RfU0VSREVTX0ZMT1dDVEw7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh0cC0+bGlua19jb25maWcuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQl1MzIgZmxhZ3M7CisJCWludCBpOworICAKKwkJaWYgKGZpYmVyX2F1dG9uZWcodHAsICZmbGFncykpIHsKKwkJCXUzMiBsb2NhbF9hZHYsIHJlbW90ZV9hZHY7CisKKwkJCWxvY2FsX2FkdiA9IEFEVkVSVElTRV9QQVVTRV9DQVA7CisJCQlyZW1vdGVfYWR2ID0gMDsKKwkJCWlmIChmbGFncyAmIE1SX0xQX0FEVl9TWU1fUEFVU0UpCisJCQkJcmVtb3RlX2FkdiB8PSBMUEFfUEFVU0VfQ0FQOworCQkJaWYgKGZsYWdzICYgTVJfTFBfQURWX0FTWU1fUEFVU0UpCisJCQkJcmVtb3RlX2FkdiB8PSBMUEFfUEFVU0VfQVNZTTsKKworCQkJdGczX3NldHVwX2Zsb3dfY29udHJvbCh0cCwgbG9jYWxfYWR2LCByZW1vdGVfYWR2KTsKKworCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19HT1RfU0VSREVTX0ZMT1dDVEw7CisJCQljdXJyZW50X2xpbmtfdXAgPSAxOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKSB7CisJCQl1ZGVsYXkoMjApOworCQkJdHczMl9mKE1BQ19TVEFUVVMsCisJCQkgICAgICAgKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKwkJCQlNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSk7CisJCQl1ZGVsYXkoNDApOworCQkJaWYgKCh0cjMyKE1BQ19TVEFUVVMpICYKKwkJCSAgICAgKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKwkJCSAgICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJbWFjX3N0YXR1cyA9IHRyMzIoTUFDX1NUQVRVUyk7CisJCWlmIChjdXJyZW50X2xpbmtfdXAgPT0gMCAmJgorCQkgICAgKG1hY19zdGF0dXMgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpICYmCisJCSAgICAhKG1hY19zdGF0dXMgJiBNQUNfU1RBVFVTX1JDVkRfQ0ZHKSkKKwkJCWN1cnJlbnRfbGlua191cCA9IDE7CisJfSBlbHNlIHsKKwkJLyogRm9yY2luZyAxMDAwRkQgbGluayB1cC4gKi8KKwkJY3VycmVudF9saW5rX3VwID0gMTsKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19HT1RfU0VSREVTX0ZMT1dDVEw7CisKKwkJdHczMl9mKE1BQ19NT0RFLCAodHAtPm1hY19tb2RlIHwgTUFDX01PREVfU0VORF9DT05GSUdTKSk7CisJCXVkZWxheSg0MCk7CisJfQorCitvdXQ6CisJcmV0dXJuIGN1cnJlbnRfbGlua191cDsKK30KKworc3RhdGljIGludCB0ZzNfc2V0dXBfZmliZXJfcGh5KHN0cnVjdCB0ZzMgKnRwLCBpbnQgZm9yY2VfcmVzZXQpCit7CisJdTMyIG9yaWdfcGF1c2VfY2ZnOworCXUxNiBvcmlnX2FjdGl2ZV9zcGVlZDsKKwl1OCBvcmlnX2FjdGl2ZV9kdXBsZXg7CisJdTMyIG1hY19zdGF0dXM7CisJaW50IGN1cnJlbnRfbGlua191cDsKKwlpbnQgaTsKKworCW9yaWdfcGF1c2VfY2ZnID0KKwkJKHRwLT50ZzNfZmxhZ3MgJiAoVEczX0ZMQUdfUlhfUEFVU0UgfAorCQkJCSAgVEczX0ZMQUdfVFhfUEFVU0UpKTsKKwlvcmlnX2FjdGl2ZV9zcGVlZCA9IHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQ7CisJb3JpZ19hY3RpdmVfZHVwbGV4ID0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXg7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX0FVVE9ORUcpICYmCisJICAgIG5ldGlmX2NhcnJpZXJfb2sodHAtPmRldikgJiYKKwkgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKSkgeworCQltYWNfc3RhdHVzID0gdHIzMihNQUNfU1RBVFVTKTsKKwkJbWFjX3N0YXR1cyAmPSAoTUFDX1NUQVRVU19QQ1NfU1lOQ0VEIHwKKwkJCSAgICAgICBNQUNfU1RBVFVTX1NJR05BTF9ERVQgfAorCQkJICAgICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQgfAorCQkJICAgICAgIE1BQ19TVEFUVVNfUkNWRF9DRkcpOworCQlpZiAobWFjX3N0YXR1cyA9PSAoTUFDX1NUQVRVU19QQ1NfU1lOQ0VEIHwKKwkJCQkgICBNQUNfU1RBVFVTX1NJR05BTF9ERVQpKSB7CisJCQl0dzMyX2YoTUFDX1NUQVRVUywgKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKwkJCQkJICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJdHczMl9mKE1BQ19UWF9BVVRPX05FRywgMCk7CisKKwl0cC0+bWFjX21vZGUgJj0gfihNQUNfTU9ERV9QT1JUX01PREVfTUFTSyB8IE1BQ19NT0RFX0hBTEZfRFVQTEVYKTsKKwl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfUE9SVF9NT0RFX1RCSTsKKwl0dzMyX2YoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisJdWRlbGF5KDQwKTsKKworCWlmICh0cC0+cGh5X2lkID09IFBIWV9JRF9CQ004MDAyKQorCQl0ZzNfaW5pdF9iY204MDAyKHRwKTsKKworCS8qIEVuYWJsZSBsaW5rIGNoYW5nZSBldmVudCBldmVuIHdoZW4gc2VyZGVzIHBvbGxpbmcuICAqLworCXR3MzJfZihNQUNfRVZFTlQsIE1BQ19FVkVOVF9MTktTVEFURV9DSEFOR0VEKTsKKwl1ZGVsYXkoNDApOworCisJY3VycmVudF9saW5rX3VwID0gMDsKKwltYWNfc3RhdHVzID0gdHIzMihNQUNfU1RBVFVTKTsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX0FVVE9ORUcpCisJCWN1cnJlbnRfbGlua191cCA9IHRnM19zZXR1cF9maWJlcl9od19hdXRvbmVnKHRwLCBtYWNfc3RhdHVzKTsKKwllbHNlCisJCWN1cnJlbnRfbGlua191cCA9IHRnM19zZXR1cF9maWJlcl9ieV9oYW5kKHRwLCBtYWNfc3RhdHVzKTsKKworCXRwLT5tYWNfbW9kZSAmPSB+TUFDX01PREVfTElOS19QT0xBUklUWTsKKwl0dzMyX2YoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisJdWRlbGF5KDQwKTsKKworCXRwLT5od19zdGF0dXMtPnN0YXR1cyA9CisJCShTRF9TVEFUVVNfVVBEQVRFRCB8CisJCSAodHAtPmh3X3N0YXR1cy0+c3RhdHVzICYgflNEX1NUQVRVU19MSU5LX0NIRykpOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCXR3MzJfZihNQUNfU1RBVFVTLCAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkJCSAgICBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSk7CisJCXVkZWxheSg1KTsKKwkJaWYgKCh0cjMyKE1BQ19TVEFUVVMpICYgKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKwkJCQkJIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJbWFjX3N0YXR1cyA9IHRyMzIoTUFDX1NUQVRVUyk7CisJaWYgKChtYWNfc3RhdHVzICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSA9PSAwKSB7CisJCWN1cnJlbnRfbGlua191cCA9IDA7CisJCWlmICh0cC0+bGlua19jb25maWcuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkJdHczMl9mKE1BQ19NT0RFLCAodHAtPm1hY19tb2RlIHwKKwkJCQkJICBNQUNfTU9ERV9TRU5EX0NPTkZJR1MpKTsKKwkJCXVkZWxheSgxKTsKKwkJCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwkJfQorCX0KKworCWlmIChjdXJyZW50X2xpbmtfdXAgPT0gMSkgeworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID0gU1BFRURfMTAwMDsKKwkJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJdHczMihNQUNfTEVEX0NUUkwsICh0cC0+bGVkX2N0cmwgfAorCQkJCSAgICBMRURfQ1RSTF9MTktMRURfT1ZFUlJJREUgfAorCQkJCSAgICBMRURfQ1RSTF8xMDAwTUJQU19PTikpOworCX0gZWxzZSB7CisJCXRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPSBTUEVFRF9JTlZBTElEOworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9IERVUExFWF9JTlZBTElEOworCQl0dzMyKE1BQ19MRURfQ1RSTCwgKHRwLT5sZWRfY3RybCB8CisJCQkJICAgIExFRF9DVFJMX0xOS0xFRF9PVkVSUklERSB8CisJCQkJICAgIExFRF9DVFJMX1RSQUZGSUNfT1ZFUlJJREUpKTsKKwl9CisKKwlpZiAoY3VycmVudF9saW5rX3VwICE9IG5ldGlmX2NhcnJpZXJfb2sodHAtPmRldikpIHsKKwkJaWYgKGN1cnJlbnRfbGlua191cCkKKwkJCW5ldGlmX2NhcnJpZXJfb24odHAtPmRldik7CisJCWVsc2UKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKHRwLT5kZXYpOworCQl0ZzNfbGlua19yZXBvcnQodHApOworCX0gZWxzZSB7CisJCXUzMiBub3dfcGF1c2VfY2ZnID0KKwkJCXRwLT50ZzNfZmxhZ3MgJiAoVEczX0ZMQUdfUlhfUEFVU0UgfAorCQkJCQkgVEczX0ZMQUdfVFhfUEFVU0UpOworCQlpZiAob3JpZ19wYXVzZV9jZmcgIT0gbm93X3BhdXNlX2NmZyB8fAorCQkgICAgb3JpZ19hY3RpdmVfc3BlZWQgIT0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCB8fAorCQkgICAgb3JpZ19hY3RpdmVfZHVwbGV4ICE9IHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4KQorCQkJdGczX2xpbmtfcmVwb3J0KHRwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfc2V0dXBfcGh5KHN0cnVjdCB0ZzMgKnRwLCBpbnQgZm9yY2VfcmVzZXQpCit7CisJaW50IGVycjsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpIHsKKwkJZXJyID0gdGczX3NldHVwX2ZpYmVyX3BoeSh0cCwgZm9yY2VfcmVzZXQpOworCX0gZWxzZSB7CisJCWVyciA9IHRnM19zZXR1cF9jb3BwZXJfcGh5KHRwLCBmb3JjZV9yZXNldCk7CisJfQorCisJaWYgKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwMCAmJgorCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJdHczMihNQUNfVFhfTEVOR1RIUywKKwkJICAgICAoKDIgPDwgVFhfTEVOR1RIU19JUEdfQ1JTX1NISUZUKSB8CisJCSAgICAgICg2IDw8IFRYX0xFTkdUSFNfSVBHX1NISUZUKSB8CisJCSAgICAgICgweGZmIDw8IFRYX0xFTkdUSFNfU0xPVF9USU1FX1NISUZUKSkpOworCWVsc2UKKwkJdHczMihNQUNfVFhfTEVOR1RIUywKKwkJICAgICAoKDIgPDwgVFhfTEVOR1RIU19JUEdfQ1JTX1NISUZUKSB8CisJCSAgICAgICg2IDw8IFRYX0xFTkdUSFNfSVBHX1NISUZUKSB8CisJCSAgICAgICgzMiA8PCBUWF9MRU5HVEhTX1NMT1RfVElNRV9TSElGVCkpKTsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSkgeworCQlpZiAobmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSkgeworCQkJdHczMihIT1NUQ0NfU1RBVF9DT0FMX1RJQ0tTLAorCQkJICAgICBERUZBVUxUX1NUQVRfQ09BTF9USUNLUyk7CisJCX0gZWxzZSB7CisJCQl0dzMyKEhPU1RDQ19TVEFUX0NPQUxfVElDS1MsIDApOworCQl9CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogVGlnb24zIG5ldmVyIHJlcG9ydHMgcGFydGlhbCBwYWNrZXQgc2VuZHMuICBTbyB3ZSBkbyBub3QKKyAqIG5lZWQgc3BlY2lhbCBsb2dpYyB0byBoYW5kbGUgU0tCcyB0aGF0IGhhdmUgbm90IGhhZCBhbGwKKyAqIG9mIHRoZWlyIGZyYWdzIHNlbnQgeWV0LCBsaWtlIFN1bkdFTSBkb2VzLgorICovCitzdGF0aWMgdm9pZCB0ZzNfdHgoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIGh3X2lkeCA9IHRwLT5od19zdGF0dXMtPmlkeFswXS50eF9jb25zdW1lcjsKKwl1MzIgc3dfaWR4ID0gdHAtPnR4X2NvbnM7CisKKwl3aGlsZSAoc3dfaWR4ICE9IGh3X2lkeCkgeworCQlzdHJ1Y3QgdHhfcmluZ19pbmZvICpyaSA9ICZ0cC0+dHhfYnVmZmVyc1tzd19pZHhdOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcmktPnNrYjsKKwkJaW50IGk7CisKKwkJaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMKSkKKwkJCUJVRygpOworCisJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsCisJCQkJIHBjaV91bm1hcF9hZGRyKHJpLCBtYXBwaW5nKSwKKwkJCQkgc2tiX2hlYWRsZW4oc2tiKSwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJcmktPnNrYiA9IE5VTEw7CisKKwkJc3dfaWR4ID0gTkVYVF9UWChzd19pZHgpOworCisJCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJCWlmICh1bmxpa2VseShzd19pZHggPT0gaHdfaWR4KSkKKwkJCQlCVUcoKTsKKworCQkJcmkgPSAmdHAtPnR4X2J1ZmZlcnNbc3dfaWR4XTsKKwkJCWlmICh1bmxpa2VseShyaS0+c2tiICE9IE5VTEwpKQorCQkJCUJVRygpOworCisJCQlwY2lfdW5tYXBfcGFnZSh0cC0+cGRldiwKKwkJCQkgICAgICAgcGNpX3VubWFwX2FkZHIocmksIG1hcHBpbmcpLAorCQkJCSAgICAgICBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUsCisJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCQlzd19pZHggPSBORVhUX1RYKHN3X2lkeCk7CisJCX0KKworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCX0KKworCXRwLT50eF9jb25zID0gc3dfaWR4OworCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQodHAtPmRldikgJiYKKwkgICAgKFRYX0JVRkZTX0FWQUlMKHRwKSA+IFRHM19UWF9XQUtFVVBfVEhSRVNIKSkKKwkJbmV0aWZfd2FrZV9xdWV1ZSh0cC0+ZGV2KTsKK30KKworLyogUmV0dXJucyBzaXplIG9mIHNrYiBhbGxvY2F0ZWQgb3IgPCAwIG9uIGVycm9yLgorICoKKyAqIFdlIG9ubHkgbmVlZCB0byBmaWxsIGluIHRoZSBhZGRyZXNzIGJlY2F1c2UgdGhlIG90aGVyIG1lbWJlcnMKKyAqIG9mIHRoZSBSWCBkZXNjcmlwdG9yIGFyZSBpbnZhcmlhbnQsIHNlZSB0ZzNfaW5pdF9yaW5ncy4KKyAqCisgKiBOb3RlIHRoZSBwdXJwb3NlZnVsIGFzc3ltZXRyeSBvZiBjcHUgdnMuIGNoaXAgYWNjZXNzZXMuICBGb3IKKyAqIHBvc3RpbmcgYnVmZmVycyB3ZSBvbmx5IGRpcnR5IHRoZSBmaXJzdCBjYWNoZSBsaW5lIG9mIHRoZSBSWAorICogZGVzY3JpcHRvciAoY29udGFpbmluZyB0aGUgYWRkcmVzcykuICBXaGVyZWFzIGZvciB0aGUgUlggc3RhdHVzCisgKiBidWZmZXJzIHRoZSBjcHUgb25seSByZWFkcyB0aGUgbGFzdCBjYWNoZWxpbmUgb2YgdGhlIFJYIGRlc2NyaXB0b3IKKyAqICh0byBmZXRjaCB0aGUgZXJyb3IgZmxhZ3MsIHZsYW4gdGFnLCBjaGVja3N1bSwgYW5kIG9wYXF1ZSBjb29raWUpLgorICovCitzdGF0aWMgaW50IHRnM19hbGxvY19yeF9za2Ioc3RydWN0IHRnMyAqdHAsIHUzMiBvcGFxdWVfa2V5LAorCQkJICAgIGludCBzcmNfaWR4LCB1MzIgZGVzdF9pZHhfdW5tYXNrZWQpCit7CisJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgcmluZ19pbmZvICptYXAsICpzcmNfbWFwOworCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworCWludCBza2Jfc2l6ZSwgZGVzdF9pZHg7CisKKwlzcmNfbWFwID0gTlVMTDsKKwlzd2l0Y2ggKG9wYXF1ZV9rZXkpIHsKKwljYXNlIFJYRF9PUEFRVUVfUklOR19TVEQ6CisJCWRlc3RfaWR4ID0gZGVzdF9pZHhfdW5tYXNrZWQgJSBURzNfUlhfUklOR19TSVpFOworCQlkZXNjID0gJnRwLT5yeF9zdGRbZGVzdF9pZHhdOworCQltYXAgPSAmdHAtPnJ4X3N0ZF9idWZmZXJzW2Rlc3RfaWR4XTsKKwkJaWYgKHNyY19pZHggPj0gMCkKKwkJCXNyY19tYXAgPSAmdHAtPnJ4X3N0ZF9idWZmZXJzW3NyY19pZHhdOworCQlza2Jfc2l6ZSA9IFJYX1BLVF9CVUZfU1o7CisJCWJyZWFrOworCisJY2FzZSBSWERfT1BBUVVFX1JJTkdfSlVNQk86CisJCWRlc3RfaWR4ID0gZGVzdF9pZHhfdW5tYXNrZWQgJSBURzNfUlhfSlVNQk9fUklOR19TSVpFOworCQlkZXNjID0gJnRwLT5yeF9qdW1ib1tkZXN0X2lkeF07CisJCW1hcCA9ICZ0cC0+cnhfanVtYm9fYnVmZmVyc1tkZXN0X2lkeF07CisJCWlmIChzcmNfaWR4ID49IDApCisJCQlzcmNfbWFwID0gJnRwLT5yeF9qdW1ib19idWZmZXJzW3NyY19pZHhdOworCQlza2Jfc2l6ZSA9IFJYX0pVTUJPX1BLVF9CVUZfU1o7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKKworCS8qIERvIG5vdCBvdmVyd3JpdGUgYW55IG9mIHRoZSBtYXAgb3IgcnAgaW5mb3JtYXRpb24KKwkgKiB1bnRpbCB3ZSBhcmUgc3VyZSB3ZSBjYW4gY29tbWl0IHRvIGEgbmV3IGJ1ZmZlci4KKwkgKgorCSAqIENhbGxlcnMgZGVwZW5kIHVwb24gdGhpcyBiZWhhdmlvciBhbmQgYXNzdW1lIHRoYXQKKwkgKiB3ZSBsZWF2ZSBldmVyeXRoaW5nIHVuY2hhbmdlZCBpZiB3ZSBmYWlsLgorCSAqLworCXNrYiA9IGRldl9hbGxvY19za2Ioc2tiX3NpemUpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2ItPmRldiA9IHRwLT5kZXY7CisJc2tiX3Jlc2VydmUoc2tiLCB0cC0+cnhfb2Zmc2V0KTsKKworCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgc2tiLT5kYXRhLAorCQkJCSBza2Jfc2l6ZSAtIHRwLT5yeF9vZmZzZXQsCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwltYXAtPnNrYiA9IHNrYjsKKwlwY2lfdW5tYXBfYWRkcl9zZXQobWFwLCBtYXBwaW5nLCBtYXBwaW5nKTsKKworCWlmIChzcmNfbWFwICE9IE5VTEwpCisJCXNyY19tYXAtPnNrYiA9IE5VTEw7CisKKwlkZXNjLT5hZGRyX2hpID0gKCh1NjQpbWFwcGluZyA+PiAzMik7CisJZGVzYy0+YWRkcl9sbyA9ICgodTY0KW1hcHBpbmcgJiAweGZmZmZmZmZmKTsKKworCXJldHVybiBza2Jfc2l6ZTsKK30KKworLyogV2Ugb25seSBuZWVkIHRvIG1vdmUgb3ZlciBpbiB0aGUgYWRkcmVzcyBiZWNhdXNlIHRoZSBvdGhlcgorICogbWVtYmVycyBvZiB0aGUgUlggZGVzY3JpcHRvciBhcmUgaW52YXJpYW50LiAgU2VlIG5vdGVzIGFib3ZlCisgKiB0ZzNfYWxsb2Nfcnhfc2tiIGZvciBmdWxsIGRldGFpbHMuCisgKi8KK3N0YXRpYyB2b2lkIHRnM19yZWN5Y2xlX3J4KHN0cnVjdCB0ZzMgKnRwLCB1MzIgb3BhcXVlX2tleSwKKwkJCSAgIGludCBzcmNfaWR4LCB1MzIgZGVzdF9pZHhfdW5tYXNrZWQpCit7CisJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyAqc3JjX2Rlc2MsICpkZXN0X2Rlc2M7CisJc3RydWN0IHJpbmdfaW5mbyAqc3JjX21hcCwgKmRlc3RfbWFwOworCWludCBkZXN0X2lkeDsKKworCXN3aXRjaCAob3BhcXVlX2tleSkgeworCWNhc2UgUlhEX09QQVFVRV9SSU5HX1NURDoKKwkJZGVzdF9pZHggPSBkZXN0X2lkeF91bm1hc2tlZCAlIFRHM19SWF9SSU5HX1NJWkU7CisJCWRlc3RfZGVzYyA9ICZ0cC0+cnhfc3RkW2Rlc3RfaWR4XTsKKwkJZGVzdF9tYXAgPSAmdHAtPnJ4X3N0ZF9idWZmZXJzW2Rlc3RfaWR4XTsKKwkJc3JjX2Rlc2MgPSAmdHAtPnJ4X3N0ZFtzcmNfaWR4XTsKKwkJc3JjX21hcCA9ICZ0cC0+cnhfc3RkX2J1ZmZlcnNbc3JjX2lkeF07CisJCWJyZWFrOworCisJY2FzZSBSWERfT1BBUVVFX1JJTkdfSlVNQk86CisJCWRlc3RfaWR4ID0gZGVzdF9pZHhfdW5tYXNrZWQgJSBURzNfUlhfSlVNQk9fUklOR19TSVpFOworCQlkZXN0X2Rlc2MgPSAmdHAtPnJ4X2p1bWJvW2Rlc3RfaWR4XTsKKwkJZGVzdF9tYXAgPSAmdHAtPnJ4X2p1bWJvX2J1ZmZlcnNbZGVzdF9pZHhdOworCQlzcmNfZGVzYyA9ICZ0cC0+cnhfanVtYm9bc3JjX2lkeF07CisJCXNyY19tYXAgPSAmdHAtPnJ4X2p1bWJvX2J1ZmZlcnNbc3JjX2lkeF07CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX07CisKKwlkZXN0X21hcC0+c2tiID0gc3JjX21hcC0+c2tiOworCXBjaV91bm1hcF9hZGRyX3NldChkZXN0X21hcCwgbWFwcGluZywKKwkJCSAgIHBjaV91bm1hcF9hZGRyKHNyY19tYXAsIG1hcHBpbmcpKTsKKwlkZXN0X2Rlc2MtPmFkZHJfaGkgPSBzcmNfZGVzYy0+YWRkcl9oaTsKKwlkZXN0X2Rlc2MtPmFkZHJfbG8gPSBzcmNfZGVzYy0+YWRkcl9sbzsKKworCXNyY19tYXAtPnNrYiA9IE5VTEw7Cit9CisKKyNpZiBURzNfVkxBTl9UQUdfVVNFRAorc3RhdGljIGludCB0ZzNfdmxhbl9yeChzdHJ1Y3QgdGczICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHZsYW5fdGFnKQoreworCXJldHVybiB2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCB0cC0+dmxncnAsIHZsYW5fdGFnKTsKK30KKyNlbmRpZgorCisvKiBUaGUgUlggcmluZyBzY2hlbWUgaXMgY29tcG9zZWQgb2YgbXVsdGlwbGUgcmluZ3Mgd2hpY2ggcG9zdCBmcmVzaAorICogYnVmZmVycyB0byB0aGUgY2hpcCwgYW5kIG9uZSBzcGVjaWFsIHJpbmcgdGhlIGNoaXAgdXNlcyB0byByZXBvcnQKKyAqIHN0YXR1cyBiYWNrIHRvIHRoZSBob3N0LgorICoKKyAqIFRoZSBzcGVjaWFsIHJpbmcgcmVwb3J0cyB0aGUgc3RhdHVzIG9mIHJlY2VpdmVkIHBhY2tldHMgdG8gdGhlCisgKiBob3N0LiAgVGhlIGNoaXAgZG9lcyBub3Qgd3JpdGUgaW50byB0aGUgb3JpZ2luYWwgZGVzY3JpcHRvciB0aGUKKyAqIFJYIGJ1ZmZlciB3YXMgb2J0YWluZWQgZnJvbS4gIFRoZSBjaGlwIHNpbXBseSB0YWtlcyB0aGUgb3JpZ2luYWwKKyAqIGRlc2NyaXB0b3IgYXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QsIHVwZGF0ZXMgdGhlIHN0YXR1cyBhbmQgbGVuZ3RoCisgKiBmaWVsZCwgdGhlbiB3cml0ZXMgdGhpcyBpbnRvIHRoZSBuZXh0IHN0YXR1cyByaW5nIGVudHJ5LgorICoKKyAqIEVhY2ggcmluZyB0aGUgaG9zdCB1c2VzIHRvIHBvc3QgYnVmZmVycyB0byB0aGUgY2hpcCBpcyBkZXNjcmliZWQKKyAqIGJ5IGEgVEczX0JESU5GTyBlbnRyeSBpbiB0aGUgY2hpcHMgU1JBTSBhcmVhLiAgV2hlbiBhIHBhY2tldCBhcnJpdmVzLAorICogaXQgaXMgZmlyc3QgcGxhY2VkIGludG8gdGhlIG9uLWNoaXAgcmFtLiAgV2hlbiB0aGUgcGFja2V0J3MgbGVuZ3RoCisgKiBpcyBrbm93biwgaXQgd2Fsa3MgZG93biB0aGUgVEczX0JESU5GTyBlbnRyaWVzIHRvIHNlbGVjdCB0aGUgcmluZy4KKyAqIEVhY2ggVEczX0JESU5GTyBzcGVjaWZpZXMgYSBNQVhMRU4gZmllbGQgYW5kIHRoZSBmaXJzdCBURzNfQkRJTkZPCisgKiB3aGljaCBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBuZXcgcGFja2V0J3MgbGVuZ3RoIGlzIGNob3Nlbi4KKyAqCisgKiBUaGUgInNlcGFyYXRlIHJpbmcgZm9yIHJ4IHN0YXR1cyIgc2NoZW1lIG1heSBzb3VuZCBxdWVlciwgYnV0IGl0IG1ha2VzCisgKiBzZW5zZSBmcm9tIGEgY2FjaGUgY29oZXJlbmN5IHBlcnNwZWN0aXZlLiAgSWYgb25seSB0aGUgaG9zdCB3cml0ZXMKKyAqIHRvIHRoZSBidWZmZXIgcG9zdCByaW5ncywgYW5kIG9ubHkgdGhlIGNoaXAgd3JpdGVzIHRvIHRoZSByeCBzdGF0dXMKKyAqIHJpbmdzLCB0aGVuIGNhY2hlIGxpbmVzIG5ldmVyIG1vdmUgYmV5b25kIHNoYXJlZC1tb2RpZmllZCBzdGF0ZS4KKyAqIElmIGJvdGggdGhlIGhvc3QgYW5kIGNoaXAgd2VyZSB0byB3cml0ZSBpbnRvIHRoZSBzYW1lIHJpbmcsIGNhY2hlIGxpbmUKKyAqIGV2aWN0aW9uIGNvdWxkIG9jY3VyIHNpbmNlIGJvdGggZW50aXRpZXMgd2FudCBpdCBpbiBhbiBleGNsdXNpdmUgc3RhdGUuCisgKi8KK3N0YXRpYyBpbnQgdGczX3J4KHN0cnVjdCB0ZzMgKnRwLCBpbnQgYnVkZ2V0KQoreworCXUzMiB3b3JrX21hc2s7CisJdTMyIHJ4X3JjYl9wdHIgPSB0cC0+cnhfcmNiX3B0cjsKKwl1MTYgaHdfaWR4LCBzd19pZHg7CisJaW50IHJlY2VpdmVkOworCisJaHdfaWR4ID0gdHAtPmh3X3N0YXR1cy0+aWR4WzBdLnJ4X3Byb2R1Y2VyOworCS8qCisJICogV2UgbmVlZCB0byBvcmRlciB0aGUgcmVhZCBvZiBod19pZHggYW5kIHRoZSByZWFkIG9mCisJICogdGhlIG9wYXF1ZSBjb29raWUuCisJICovCisJcm1iKCk7CisJc3dfaWR4ID0gcnhfcmNiX3B0ciAlIFRHM19SWF9SQ0JfUklOR19TSVpFKHRwKTsKKwl3b3JrX21hc2sgPSAwOworCXJlY2VpdmVkID0gMDsKKwl3aGlsZSAoc3dfaWR4ICE9IGh3X2lkeCAmJiBidWRnZXQgPiAwKSB7CisJCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MgKmRlc2MgPSAmdHAtPnJ4X3JjYltzd19pZHhdOworCQl1bnNpZ25lZCBpbnQgbGVuOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlkbWFfYWRkcl90IGRtYV9hZGRyOworCQl1MzIgb3BhcXVlX2tleSwgZGVzY19pZHgsICpwb3N0X3B0cjsKKworCQlkZXNjX2lkeCA9IGRlc2MtPm9wYXF1ZSAmIFJYRF9PUEFRVUVfSU5ERVhfTUFTSzsKKwkJb3BhcXVlX2tleSA9IGRlc2MtPm9wYXF1ZSAmIFJYRF9PUEFRVUVfUklOR19NQVNLOworCQlpZiAob3BhcXVlX2tleSA9PSBSWERfT1BBUVVFX1JJTkdfU1REKSB7CisJCQlkbWFfYWRkciA9IHBjaV91bm1hcF9hZGRyKCZ0cC0+cnhfc3RkX2J1ZmZlcnNbZGVzY19pZHhdLAorCQkJCQkJICBtYXBwaW5nKTsKKwkJCXNrYiA9IHRwLT5yeF9zdGRfYnVmZmVyc1tkZXNjX2lkeF0uc2tiOworCQkJcG9zdF9wdHIgPSAmdHAtPnJ4X3N0ZF9wdHI7CisJCX0gZWxzZSBpZiAob3BhcXVlX2tleSA9PSBSWERfT1BBUVVFX1JJTkdfSlVNQk8pIHsKKwkJCWRtYV9hZGRyID0gcGNpX3VubWFwX2FkZHIoJnRwLT5yeF9qdW1ib19idWZmZXJzW2Rlc2NfaWR4XSwKKwkJCQkJCSAgbWFwcGluZyk7CisJCQlza2IgPSB0cC0+cnhfanVtYm9fYnVmZmVyc1tkZXNjX2lkeF0uc2tiOworCQkJcG9zdF9wdHIgPSAmdHAtPnJ4X2p1bWJvX3B0cjsKKwkJfQorCQllbHNlIHsKKwkJCWdvdG8gbmV4dF9wa3Rfbm9wb3N0OworCQl9CisKKwkJd29ya19tYXNrIHw9IG9wYXF1ZV9rZXk7CisKKwkJaWYgKChkZXNjLT5lcnJfdmxhbiAmIFJYRF9FUlJfTUFTSykgIT0gMCAmJgorCQkgICAgKGRlc2MtPmVycl92bGFuICE9IFJYRF9FUlJfT0REX05JQkJMRV9SQ1ZEX01JSSkpIHsKKwkJZHJvcF9pdDoKKwkJCXRnM19yZWN5Y2xlX3J4KHRwLCBvcGFxdWVfa2V5LAorCQkJCSAgICAgICBkZXNjX2lkeCwgKnBvc3RfcHRyKTsKKwkJZHJvcF9pdF9ub19yZWN5Y2xlOgorCQkJLyogT3RoZXIgc3RhdGlzdGljcyBrZXB0IHRyYWNrIG9mIGJ5IGNhcmQuICovCisJCQl0cC0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gbmV4dF9wa3Q7CisJCX0KKworCQlsZW4gPSAoKGRlc2MtPmlkeF9sZW4gJiBSWERfTEVOX01BU0spID4+IFJYRF9MRU5fU0hJRlQpIC0gNDsgLyogb21pdCBjcmMgKi8KKworCQlpZiAobGVuID4gUlhfQ09QWV9USFJFU0hPTEQgCisJCQkmJiB0cC0+cnhfb2Zmc2V0ID09IDIKKwkJCS8qIHJ4X29mZnNldCAhPSAyIGlmZiB0aGlzIGlzIGEgNTcwMSBjYXJkIHJ1bm5pbmcKKwkJCSAqIGluIFBDSS1YIG1vZGUgW3NlZSB0ZzNfZ2V0X2ludmFyaWFudHMoKV0gKi8KKwkJKSB7CisJCQlpbnQgc2tiX3NpemU7CisKKwkJCXNrYl9zaXplID0gdGczX2FsbG9jX3J4X3NrYih0cCwgb3BhcXVlX2tleSwKKwkJCQkJCSAgICBkZXNjX2lkeCwgKnBvc3RfcHRyKTsKKwkJCWlmIChza2Jfc2l6ZSA8IDApCisJCQkJZ290byBkcm9wX2l0OworCisJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCBkbWFfYWRkciwKKwkJCQkJIHNrYl9zaXplIC0gdHAtPnJ4X29mZnNldCwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCXNrYl9wdXQoc2tiLCBsZW4pOworCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKmNvcHlfc2tiOworCisJCQl0ZzNfcmVjeWNsZV9yeCh0cCwgb3BhcXVlX2tleSwKKwkJCQkgICAgICAgZGVzY19pZHgsICpwb3N0X3B0cik7CisKKwkJCWNvcHlfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAyKTsKKwkJCWlmIChjb3B5X3NrYiA9PSBOVUxMKQorCQkJCWdvdG8gZHJvcF9pdF9ub19yZWN5Y2xlOworCisJCQljb3B5X3NrYi0+ZGV2ID0gdHAtPmRldjsKKwkJCXNrYl9yZXNlcnZlKGNvcHlfc2tiLCAyKTsKKwkJCXNrYl9wdXQoY29weV9za2IsIGxlbik7CisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodHAtPnBkZXYsIGRtYV9hZGRyLCBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQltZW1jcHkoY29weV9za2ItPmRhdGEsIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh0cC0+cGRldiwgZG1hX2FkZHIsIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJLyogV2UnbGwgcmV1c2UgdGhlIG9yaWdpbmFsIHJpbmcgYnVmZmVyLiAqLworCQkJc2tiID0gY29weV9za2I7CisJCX0KKworCQlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19SWF9DSEVDS1NVTVMpICYmCisJCSAgICAoZGVzYy0+dHlwZV9mbGFncyAmIFJYRF9GTEFHX1RDUFVEUF9DU1VNKSAmJgorCQkgICAgKCgoZGVzYy0+aXBfdGNwX2NzdW0gJiBSWERfVENQQ1NVTV9NQVNLKQorCQkgICAgICA+PiBSWERfVENQQ1NVTV9TSElGVCkgPT0gMHhmZmZmKSkKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCWVsc2UKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB0cC0+ZGV2KTsKKyNpZiBURzNfVkxBTl9UQUdfVVNFRAorCQlpZiAodHAtPnZsZ3JwICE9IE5VTEwgJiYKKwkJICAgIGRlc2MtPnR5cGVfZmxhZ3MgJiBSWERfRkxBR19WTEFOKSB7CisJCQl0ZzNfdmxhbl9yeCh0cCwgc2tiLAorCQkJCSAgICBkZXNjLT5lcnJfdmxhbiAmIFJYRF9WTEFOX01BU0spOworCQl9IGVsc2UKKyNlbmRpZgorCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKworCQl0cC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJcmVjZWl2ZWQrKzsKKwkJYnVkZ2V0LS07CisKK25leHRfcGt0OgorCQkoKnBvc3RfcHRyKSsrOworbmV4dF9wa3Rfbm9wb3N0OgorCQlyeF9yY2JfcHRyKys7CisJCXN3X2lkeCA9IHJ4X3JjYl9wdHIgJSBURzNfUlhfUkNCX1JJTkdfU0laRSh0cCk7CisJfQorCisJLyogQUNLIHRoZSBzdGF0dXMgcmluZy4gKi8KKwl0cC0+cnhfcmNiX3B0ciA9IHJ4X3JjYl9wdHI7CisJdHczMl9yeF9tYm94KE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkgICAgIChyeF9yY2JfcHRyICUgVEczX1JYX1JDQl9SSU5HX1NJWkUodHApKSk7CisKKwkvKiBSZWZpbGwgUlggcmluZyhzKS4gKi8KKwlpZiAod29ya19tYXNrICYgUlhEX09QQVFVRV9SSU5HX1NURCkgeworCQlzd19pZHggPSB0cC0+cnhfc3RkX3B0ciAlIFRHM19SWF9SSU5HX1NJWkU7CisJCXR3MzJfcnhfbWJveChNQUlMQk9YX1JDVl9TVERfUFJPRF9JRFggKyBURzNfNjRCSVRfUkVHX0xPVywKKwkJCSAgICAgc3dfaWR4KTsKKwl9CisJaWYgKHdvcmtfbWFzayAmIFJYRF9PUEFRVUVfUklOR19KVU1CTykgeworCQlzd19pZHggPSB0cC0+cnhfanVtYm9fcHRyICUgVEczX1JYX0pVTUJPX1JJTkdfU0laRTsKKwkJdHczMl9yeF9tYm94KE1BSUxCT1hfUkNWX0pVTUJPX1BST0RfSURYICsgVEczXzY0QklUX1JFR19MT1csCisJCQkgICAgIHN3X2lkeCk7CisJfQorCW1taW93YigpOworCisJcmV0dXJuIHJlY2VpdmVkOworfQorCitzdGF0aWMgaW50IHRnM19wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgdGczX2h3X3N0YXR1cyAqc2JsayA9IHRwLT5od19zdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZG9uZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJLyogaGFuZGxlIGxpbmsgY2hhbmdlIGFuZCBvdGhlciBwaHkgZXZlbnRzICovCisJaWYgKCEodHAtPnRnM19mbGFncyAmCisJICAgICAgKFRHM19GTEFHX1VTRV9MSU5LQ0hHX1JFRyB8CisJICAgICAgIFRHM19GTEFHX1BPTExfU0VSREVTKSkpIHsKKwkJaWYgKHNibGstPnN0YXR1cyAmIFNEX1NUQVRVU19MSU5LX0NIRykgeworCQkJc2Jsay0+c3RhdHVzID0gU0RfU1RBVFVTX1VQREFURUQgfAorCQkJCShzYmxrLT5zdGF0dXMgJiB+U0RfU1RBVFVTX0xJTktfQ0hHKTsKKwkJCXRnM19zZXR1cF9waHkodHAsIDApOworCQl9CisJfQorCisJLyogcnVuIFRYIGNvbXBsZXRpb24gdGhyZWFkICovCisJaWYgKHNibGstPmlkeFswXS50eF9jb25zdW1lciAhPSB0cC0+dHhfY29ucykgeworCQlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwkJdGczX3R4KHRwKTsKKwkJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJLyogcnVuIFJYIHRocmVhZCwgd2l0aGluIHRoZSBib3VuZHMgc2V0IGJ5IE5BUEkuCisJICogQWxsIFJYICJsb2NraW5nIiBpcyBkb25lIGJ5IGVuc3VyaW5nIG91dHNpZGUKKwkgKiBjb2RlIHN5bmNocm9uaXplcyB3aXRoIGRldi0+cG9sbCgpCisJICovCisJZG9uZSA9IDE7CisJaWYgKHNibGstPmlkeFswXS5yeF9wcm9kdWNlciAhPSB0cC0+cnhfcmNiX3B0cikgeworCQlpbnQgb3JpZ19idWRnZXQgPSAqYnVkZ2V0OworCQlpbnQgd29ya19kb25lOworCisJCWlmIChvcmlnX2J1ZGdldCA+IG5ldGRldi0+cXVvdGEpCisJCQlvcmlnX2J1ZGdldCA9IG5ldGRldi0+cXVvdGE7CisKKwkJd29ya19kb25lID0gdGczX3J4KHRwLCBvcmlnX2J1ZGdldCk7CisKKwkJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CisJCW5ldGRldi0+cXVvdGEgLT0gd29ya19kb25lOworCisJCWlmICh3b3JrX2RvbmUgPj0gb3JpZ19idWRnZXQpCisJCQlkb25lID0gMDsKKwl9CisKKwkvKiBpZiBubyBtb3JlIHdvcmssIHRlbGwgbmV0IHN0YWNrIGFuZCBOSUMgd2UncmUgZG9uZSAqLworCWlmIChkb25lKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCQlfX25ldGlmX3J4X2NvbXBsZXRlKG5ldGRldik7CisJCXRnM19yZXN0YXJ0X2ludHModHApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiAoZG9uZSA/IDAgOiAxKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdGczX2hhc193b3JrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCB0ZzNfaHdfc3RhdHVzICpzYmxrID0gdHAtPmh3X3N0YXR1czsKKwl1bnNpZ25lZCBpbnQgd29ya19leGlzdHMgPSAwOworCisJLyogY2hlY2sgZm9yIHBoeSBldmVudHMgKi8KKwlpZiAoISh0cC0+dGczX2ZsYWdzICYKKwkgICAgICAoVEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHIHwKKwkgICAgICAgVEczX0ZMQUdfUE9MTF9TRVJERVMpKSkgeworCQlpZiAoc2Jsay0+c3RhdHVzICYgU0RfU1RBVFVTX0xJTktfQ0hHKQorCQkJd29ya19leGlzdHMgPSAxOworCX0KKwkvKiBjaGVjayBmb3IgUlgvVFggd29yayB0byBkbyAqLworCWlmIChzYmxrLT5pZHhbMF0udHhfY29uc3VtZXIgIT0gdHAtPnR4X2NvbnMgfHwKKwkgICAgc2Jsay0+aWR4WzBdLnJ4X3Byb2R1Y2VyICE9IHRwLT5yeF9yY2JfcHRyKQorCQl3b3JrX2V4aXN0cyA9IDE7CisKKwlyZXR1cm4gd29ya19leGlzdHM7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0ZzNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHRnM19od19zdGF0dXMgKnNibGsgPSB0cC0+aHdfc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBJbiBJTlR4IG1vZGUsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgaW50ZXJydXB0IHRvIGFycml2ZSBhdAorCSAqIHRoZSBDUFUgYmVmb3JlIHRoZSBzdGF0dXMgYmxvY2sgcG9zdGVkIHByaW9yIHRvIHRoZSBpbnRlcnJ1cHQuCisJICogUmVhZGluZyB0aGUgUENJIFN0YXRlIHJlZ2lzdGVyIHdpbGwgY29uZmlybSB3aGV0aGVyIHRoZQorCSAqIGludGVycnVwdCBpcyBvdXJzIGFuZCB3aWxsIGZsdXNoIHRoZSBzdGF0dXMgYmxvY2suCisJICovCisJaWYgKChzYmxrLT5zdGF0dXMgJiBTRF9TVEFUVVNfVVBEQVRFRCkgfHwKKwkgICAgISh0cjMyKFRHM1BDSV9QQ0lTVEFURSkgJiBQQ0lTVEFURV9JTlRfTk9UX0FDVElWRSkpIHsKKwkJLyoKKwkJICogd3JpdGluZyBhbnkgdmFsdWUgdG8gaW50ci1tYm94LTAgY2xlYXJzIFBDSSBJTlRBIyBhbmQKKwkJICogY2hpcC1pbnRlcm5hbCBpbnRlcnJ1cHQgcGVuZGluZyBldmVudHMuCisJCSAqIHdyaXRpbmcgbm9uLXplcm8gdG8gaW50ci1tYm94LTAgYWRkaXRpb25hbCB0ZWxscyB0aGUKKwkJICogTklDIHRvIHN0b3Agc2VuZGluZyB1cyBpcnFzLCBlbmdhZ2luZyAiaW4taW50ci1oYW5kbGVyIgorCQkgKiBldmVudCBjb2FsZXNjaW5nLgorCQkgKi8KKwkJdHczMl9tYWlsYm94KE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywKKwkJCSAgICAgMHgwMDAwMDAwMSk7CisJCS8qCisJCSAqIEZsdXNoIFBDSSB3cml0ZS4gIFRoaXMgYWxzbyBndWFyYW50ZWVzIHRoYXQgb3VyCisJCSAqIHN0YXR1cyBibG9jayBoYXMgYmVlbiBmbHVzaGVkIHRvIGhvc3QgbWVtb3J5LgorCQkgKi8KKwkJdHIzMihNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1cpOworCQlzYmxrLT5zdGF0dXMgJj0gflNEX1NUQVRVU19VUERBVEVEOworCisJCWlmIChsaWtlbHkodGczX2hhc193b3JrKGRldiwgdHApKSkKKwkJCW5ldGlmX3J4X3NjaGVkdWxlKGRldik7CQkvKiBzY2hlZHVsZSBOQVBJIHBvbGwgKi8KKwkJZWxzZSB7CisJCQkvKiBubyB3b3JrLCBzaGFyZWQgaW50ZXJydXB0IHBlcmhhcHM/ICByZS1lbmFibGUKKwkJCSAqIGludGVycnVwdHMsIGFuZCBmbHVzaCB0aGF0IFBDSSB3cml0ZQorCQkJICovCisJCQl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkJICAgICAJMHgwMDAwMDAwMCk7CisJCQl0cjMyKE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVyk7CisJCX0KKwl9IGVsc2UgewkvKiBzaGFyZWQgaW50ZXJydXB0ICovCisJCWhhbmRsZWQgPSAwOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIGludCB0ZzNfaW5pdF9odyhzdHJ1Y3QgdGczICopOworc3RhdGljIGludCB0ZzNfaGFsdChzdHJ1Y3QgdGczICopOworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIHRnM19wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl0ZzNfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHRnM19yZXNldF90YXNrKHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCB0ZzMgKnRwID0gX2RhdGE7CisJdW5zaWduZWQgaW50IHJlc3RhcnRfdGltZXI7CisKKwl0ZzNfbmV0aWZfc3RvcCh0cCk7CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisKKwlyZXN0YXJ0X3RpbWVyID0gdHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9SRVNUQVJUX1RJTUVSOworCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9SRVNUQVJUX1RJTUVSOworCisJdGczX2hhbHQodHApOworCXRnM19pbml0X2h3KHRwKTsKKworCXRnM19uZXRpZl9zdGFydCh0cCk7CisKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJaWYgKHJlc3RhcnRfdGltZXIpCisJCW1vZF90aW1lcigmdHAtPnRpbWVyLCBqaWZmaWVzICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgcmVzZXR0aW5nXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworCisJc2NoZWR1bGVfd29yaygmdHAtPnJlc2V0X3Rhc2spOworfQorCitzdGF0aWMgdm9pZCB0ZzNfc2V0X3R4ZChzdHJ1Y3QgdGczICosIGludCwgZG1hX2FkZHJfdCwgaW50LCB1MzIsIHUzMik7CisKK3N0YXRpYyBpbnQgdGlnb24zXzRnYl9od2J1Z193b3JrYXJvdW5kKHN0cnVjdCB0ZzMgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgICB1MzIgZ3VpbHR5X2VudHJ5LCBpbnQgZ3VpbHR5X2xlbiwKKwkJCQkgICAgICAgdTMyIGxhc3RfcGx1c19vbmUsIHUzMiAqc3RhcnQsIHUzMiBtc3MpCit7CisJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworCWRtYV9hZGRyX3QgbmV3X2FkZHI7CisJdTMyIGVudHJ5ID0gKnN0YXJ0OworCWludCBpOworCisJaWYgKCFuZXdfc2tiKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIE5ldyBTS0IgaXMgZ3VhcmFudGVlZCB0byBiZSBsaW5lYXIuICovCisJZW50cnkgPSAqc3RhcnQ7CisJbmV3X2FkZHIgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgbmV3X3NrYi0+ZGF0YSwgbmV3X3NrYi0+bGVuLAorCQkJCSAgUENJX0RNQV9UT0RFVklDRSk7CisJdGczX3NldF90eGQodHAsIGVudHJ5LCBuZXdfYWRkciwgbmV3X3NrYi0+bGVuLAorCQkgICAgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSA/CisJCSAgICBUWERfRkxBR19UQ1BVRFBfQ1NVTSA6IDAsIDEgfCAobXNzIDw8IDEpKTsKKwkqc3RhcnQgPSBORVhUX1RYKGVudHJ5KTsKKworCS8qIE5vdyBjbGVhbiB1cCB0aGUgc3cgcmluZyBlbnRyaWVzLiAqLworCWkgPSAwOworCXdoaWxlIChlbnRyeSAhPSBsYXN0X3BsdXNfb25lKSB7CisJCWludCBsZW47CisKKwkJaWYgKGkgPT0gMCkKKwkJCWxlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisJCWVsc2UKKwkJCWxlbiA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaS0xXS5zaXplOworCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LAorCQkJCSBwY2lfdW5tYXBfYWRkcigmdHAtPnR4X2J1ZmZlcnNbZW50cnldLCBtYXBwaW5nKSwKKwkJCQkgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJaWYgKGkgPT0gMCkgeworCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9IG5ld19za2I7CisJCQlwY2lfdW5tYXBfYWRkcl9zZXQoJnRwLT50eF9idWZmZXJzW2VudHJ5XSwgbWFwcGluZywgbmV3X2FkZHIpOworCQl9IGVsc2UgeworCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9IE5VTEw7CisJCX0KKwkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKwkJaSsrOworCX0KKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZzNfc2V0X3R4ZChzdHJ1Y3QgdGczICp0cCwgaW50IGVudHJ5LAorCQkJZG1hX2FkZHJfdCBtYXBwaW5nLCBpbnQgbGVuLCB1MzIgZmxhZ3MsCisJCQl1MzIgbXNzX2FuZF9pc19lbmQpCit7CisJc3RydWN0IHRnM190eF9idWZmZXJfZGVzYyAqdHhkID0gJnRwLT50eF9yaW5nW2VudHJ5XTsKKwlpbnQgaXNfZW5kID0gKG1zc19hbmRfaXNfZW5kICYgMHgxKTsKKwl1MzIgbXNzID0gKG1zc19hbmRfaXNfZW5kID4+IDEpOworCXUzMiB2bGFuX3RhZyA9IDA7CisKKwlpZiAoaXNfZW5kKQorCQlmbGFncyB8PSBUWERfRkxBR19FTkQ7CisJaWYgKGZsYWdzICYgVFhEX0ZMQUdfVkxBTikgeworCQl2bGFuX3RhZyA9IGZsYWdzID4+IDE2OworCQlmbGFncyAmPSAweGZmZmY7CisJfQorCXZsYW5fdGFnIHw9IChtc3MgPDwgVFhEX01TU19TSElGVCk7CisKKwl0eGQtPmFkZHJfaGkgPSAoKHU2NCkgbWFwcGluZyA+PiAzMik7CisJdHhkLT5hZGRyX2xvID0gKCh1NjQpIG1hcHBpbmcgJiAweGZmZmZmZmZmKTsKKwl0eGQtPmxlbl9mbGFncyA9IChsZW4gPDwgVFhEX0xFTl9TSElGVCkgfCBmbGFnczsKKwl0eGQtPnZsYW5fdGFnID0gdmxhbl90YWcgPDwgVFhEX1ZMQU5fVEFHX1NISUZUOworfQorCitzdGF0aWMgaW5saW5lIGludCB0ZzNfNGdfb3ZlcmZsb3dfdGVzdChkbWFfYWRkcl90IG1hcHBpbmcsIGludCBsZW4pCit7CisJdTMyIGJhc2UgPSAodTMyKSBtYXBwaW5nICYgMHhmZmZmZmZmZjsKKworCXJldHVybiAoKGJhc2UgPiAweGZmZmZkY2MwKSAmJgorCQkoYmFzZSArIGxlbiArIDggPCBiYXNlKSk7Cit9CisKK3N0YXRpYyBpbnQgdGczX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworCXVuc2lnbmVkIGludCBpOworCXUzMiBsZW4sIGVudHJ5LCBiYXNlX2ZsYWdzLCBtc3M7CisJaW50IHdvdWxkX2hpdF9od2J1ZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKworCS8qIE5vIEJIIGRpc2FibGluZyBmb3IgdHhfbG9jayBoZXJlLiAgV2UgYXJlIHJ1bm5pbmcgaW4gQkggZGlzYWJsZWQKKwkgKiBjb250ZXh0IGFuZCBUWCByZWNsYWltIHJ1bnMgdmlhIHRwLT5wb2xsIGluc2lkZSBvZiBhIHNvZnR3YXJlCisJICogaW50ZXJydXB0LiAgUmVqb2ljZSEKKwkgKgorCSAqIEFjdHVhbGx5LCB0aGluZ3MgYXJlIG5vdCBzbyBzaW1wbGUuICBJZiB3ZSBhcmUgdG8gdGFrZSBhIGh3CisJICogSVJRIGhlcmUsIHdlIGNhbiBkZWFkbG9jaywgY29uc2lkZXI6CisJICoKKwkgKiAgICAgICBDUFUxCQlDUFUyCisJICogICB0ZzNfc3RhcnRfeG1pdAorCSAqICAgdGFrZSB0cC0+dHhfbG9jaworCSAqCQkJdGczX3RpbWVyCisJICoJCQl0YWtlIHRwLT5sb2NrCisJICogICB0ZzNfaW50ZXJydXB0CisJICogICBzcGluIG9uIHRwLT5sb2NrCisJICoJCQlzcGluIG9uIHRwLT50eF9sb2NrCisJICoKKwkgKiBTbyB3ZSByZWFsbHkgZG8gbmVlZCB0byBkaXNhYmxlIGludGVycnVwdHMgd2hlbiB0YWtpbmcKKwkgKiB0eF9sb2NrIGhlcmUuCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmICghc3Bpbl90cnlsb2NrKCZ0cC0+dHhfbG9jaykpIHsgCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9MT0NLRUQ7IAorCX0gCisKKwkvKiBUaGlzIGlzIGEgaGFyZCBlcnJvciwgbG9nIGl0LiAqLworCWlmICh1bmxpa2VseShUWF9CVUZGU19BVkFJTCh0cCkgPD0gKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxKSkpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+dHhfbG9jaywgZmxhZ3MpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQlVHISBUeCBSaW5nIGZ1bGwgd2hlbiBxdWV1ZSBhd2FrZSFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJfQorCisJZW50cnkgPSB0cC0+dHhfcHJvZDsKKwliYXNlX2ZsYWdzID0gMDsKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCisJCWJhc2VfZmxhZ3MgfD0gVFhEX0ZMQUdfVENQVURQX0NTVU07CisjaWYgVEczX1RTT19TVVBQT1JUICE9IDAKKwltc3MgPSAwOworCWlmIChza2ItPmxlbiA+ICh0cC0+ZGV2LT5tdHUgKyBFVEhfSExFTikgJiYKKwkgICAgKG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUpICE9IDApIHsKKwkJaW50IHRjcF9vcHRfbGVuLCBpcF90Y3BfbGVuOworCisJCWlmIChza2JfaGVhZGVyX2Nsb25lZChza2IpICYmCisJCSAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpIHsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCXRjcF9vcHRfbGVuID0gKChza2ItPmgudGgtPmRvZmYgLSA1KSAqIDQpOworCQlpcF90Y3BfbGVuID0gKHNrYi0+bmguaXBoLT5paGwgKiA0KSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKworCQliYXNlX2ZsYWdzIHw9IChUWERfRkxBR19DUFVfUFJFX0RNQSB8CisJCQkgICAgICAgVFhEX0ZMQUdfQ1BVX1BPU1RfRE1BKTsKKworCQlza2ItPm5oLmlwaC0+Y2hlY2sgPSAwOworCQlza2ItPm5oLmlwaC0+dG90X2xlbiA9IG50b2hzKG1zcyArIGlwX3RjcF9sZW4gKyB0Y3Bfb3B0X2xlbik7CisJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX1RTTykgeworCQkJc2tiLT5oLnRoLT5jaGVjayA9IDA7CisJCQliYXNlX2ZsYWdzICY9IH5UWERfRkxBR19UQ1BVRFBfQ1NVTTsKKwkJfQorCQllbHNlIHsKKwkJCXNrYi0+aC50aC0+Y2hlY2sgPQorCQkJCX5jc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsCisJCQkJCQkgICBza2ItPm5oLmlwaC0+ZGFkZHIsCisJCQkJCQkgICAwLCBJUFBST1RPX1RDUCwgMCk7CisJCX0KKworCQlpZiAoKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSFdfVFNPKSB8fAorCQkgICAgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSkgeworCQkJaWYgKHRjcF9vcHRfbGVuIHx8IHNrYi0+bmguaXBoLT5paGwgPiA1KSB7CisJCQkJaW50IHRzZmxhZ3M7CisKKwkJCQl0c2ZsYWdzID0gKChza2ItPm5oLmlwaC0+aWhsIC0gNSkgKworCQkJCQkgICAodGNwX29wdF9sZW4gPj4gMikpOworCQkJCW1zcyB8PSAodHNmbGFncyA8PCAxMSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAodGNwX29wdF9sZW4gfHwgc2tiLT5uaC5pcGgtPmlobCA+IDUpIHsKKwkJCQlpbnQgdHNmbGFnczsKKworCQkJCXRzZmxhZ3MgPSAoKHNrYi0+bmguaXBoLT5paGwgLSA1KSArCisJCQkJCSAgICh0Y3Bfb3B0X2xlbiA+PiAyKSk7CisJCQkJYmFzZV9mbGFncyB8PSB0c2ZsYWdzIDw8IDEyOworCQkJfQorCQl9CisJfQorI2Vsc2UKKwltc3MgPSAwOworI2VuZGlmCisjaWYgVEczX1ZMQU5fVEFHX1VTRUQKKwlpZiAodHAtPnZsZ3JwICE9IE5VTEwgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpKQorCQliYXNlX2ZsYWdzIHw9IChUWERfRkxBR19WTEFOIHwKKwkJCSAgICAgICAodmxhbl90eF90YWdfZ2V0KHNrYikgPDwgMTYpKTsKKyNlbmRpZgorCisJLyogUXVldWUgc2tiIGRhdGEsIGEuay5hLiB0aGUgbWFpbiBza2IgZnJhZ21lbnQuICovCisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiID0gc2tiOworCXBjaV91bm1hcF9hZGRyX3NldCgmdHAtPnR4X2J1ZmZlcnNbZW50cnldLCBtYXBwaW5nLCBtYXBwaW5nKTsKKworCXdvdWxkX2hpdF9od2J1ZyA9IDA7CisKKwlpZiAodGczXzRnX292ZXJmbG93X3Rlc3QobWFwcGluZywgbGVuKSkKKwkJd291bGRfaGl0X2h3YnVnID0gZW50cnkgKyAxOworCisJdGczX3NldF90eGQodHAsIGVudHJ5LCBtYXBwaW5nLCBsZW4sIGJhc2VfZmxhZ3MsCisJCSAgICAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9PSAwKSB8IChtc3MgPDwgMSkpOworCisJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKworCS8qIE5vdyBsb29wIHRocm91Z2ggYWRkaXRpb25hbCBkYXRhIGZyYWdtZW50cywgYW5kIHF1ZXVlIHRoZW0uICovCisJaWYgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPiAwKSB7CisJCXVuc2lnbmVkIGludCBpLCBsYXN0OworCisJCWxhc3QgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzIC0gMTsKKwkJZm9yIChpID0gMDsgaSA8PSBsYXN0OyBpKyspIHsKKwkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKworCQkJbGVuID0gZnJhZy0+c2l6ZTsKKwkJCW1hcHBpbmcgPSBwY2lfbWFwX3BhZ2UodHAtPnBkZXYsCisJCQkJCSAgICAgICBmcmFnLT5wYWdlLAorCQkJCQkgICAgICAgZnJhZy0+cGFnZV9vZmZzZXQsCisJCQkJCSAgICAgICBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiID0gTlVMTDsKKwkJCXBjaV91bm1hcF9hZGRyX3NldCgmdHAtPnR4X2J1ZmZlcnNbZW50cnldLCBtYXBwaW5nLCBtYXBwaW5nKTsKKworCQkJaWYgKHRnM180Z19vdmVyZmxvd190ZXN0KG1hcHBpbmcsIGxlbikpIHsKKwkJCQkvKiBPbmx5IG9uZSBzaG91bGQgbWF0Y2guICovCisJCQkJaWYgKHdvdWxkX2hpdF9od2J1ZykKKwkJCQkJQlVHKCk7CisJCQkJd291bGRfaGl0X2h3YnVnID0gZW50cnkgKyAxOworCQkJfQorCisJCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU08pCisJCQkJdGczX3NldF90eGQodHAsIGVudHJ5LCBtYXBwaW5nLCBsZW4sCisJCQkJCSAgICBiYXNlX2ZsYWdzLCAoaSA9PSBsYXN0KXwobXNzIDw8IDEpKTsKKwkJCWVsc2UKKwkJCQl0ZzNfc2V0X3R4ZCh0cCwgZW50cnksIG1hcHBpbmcsIGxlbiwKKwkJCQkJICAgIGJhc2VfZmxhZ3MsIChpID09IGxhc3QpKTsKKworCQkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKwkJfQorCX0KKworCWlmICh3b3VsZF9oaXRfaHdidWcpIHsKKwkJdTMyIGxhc3RfcGx1c19vbmUgPSBlbnRyeTsKKwkJdTMyIHN0YXJ0OworCQl1bnNpZ25lZCBpbnQgbGVuID0gMDsKKworCQl3b3VsZF9oaXRfaHdidWcgLT0gMTsKKwkJZW50cnkgPSBlbnRyeSAtIDEgLSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCQllbnRyeSAmPSAoVEczX1RYX1JJTkdfU0laRSAtIDEpOworCQlzdGFydCA9IGVudHJ5OworCQlpID0gMDsKKwkJd2hpbGUgKGVudHJ5ICE9IGxhc3RfcGx1c19vbmUpIHsKKwkJCWlmIChpID09IDApCisJCQkJbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKwkJCWVsc2UKKwkJCQlsZW4gPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ktMV0uc2l6ZTsKKworCQkJaWYgKGVudHJ5ID09IHdvdWxkX2hpdF9od2J1ZykKKwkJCQlicmVhazsKKworCQkJaSsrOworCQkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKworCQl9CisKKwkJLyogSWYgdGhlIHdvcmthcm91bmQgZmFpbHMgZHVlIHRvIG1lbW9yeS9tYXBwaW5nCisJCSAqIGZhaWx1cmUsIHNpbGVudGx5IGRyb3AgdGhpcyBwYWNrZXQuCisJCSAqLworCQlpZiAodGlnb24zXzRnYl9od2J1Z193b3JrYXJvdW5kKHRwLCBza2IsCisJCQkJCQllbnRyeSwgbGVuLAorCQkJCQkJbGFzdF9wbHVzX29uZSwKKwkJCQkJCSZzdGFydCwgbXNzKSkKKwkJCWdvdG8gb3V0X3VubG9jazsKKworCQllbnRyeSA9IHN0YXJ0OworCX0KKworCS8qIFBhY2tldHMgYXJlIHJlYWR5LCB1cGRhdGUgVHggcHJvZHVjZXIgaWR4IGxvY2FsIGFuZCBvbiBjYXJkLiAqLworCXR3MzJfdHhfbWJveCgoTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzAgKyBURzNfNjRCSVRfUkVHX0xPVyksIGVudHJ5KTsKKworCXRwLT50eF9wcm9kID0gZW50cnk7CisJaWYgKFRYX0JVRkZTX0FWQUlMKHRwKSA8PSAoTUFYX1NLQl9GUkFHUyArIDEpKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKK291dF91bmxvY2s6CisgICAgCW1taW93YigpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT50eF9sb2NrLCBmbGFncyk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZzNfc2V0X210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgdGczICp0cCwKKwkJCSAgICAgICBpbnQgbmV3X210dSkKK3sKKwlkZXYtPm10dSA9IG5ld19tdHU7CisKKwlpZiAobmV3X210dSA+IEVUSF9EQVRBX0xFTikKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19KVU1CT19FTkFCTEU7CisJZWxzZQorCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19KVU1CT19FTkFCTEU7Cit9CisKK3N0YXRpYyBpbnQgdGczX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ld19tdHUgPCBURzNfTUlOX01UVSB8fCBuZXdfbXR1ID4gVEczX01BWF9NVFUodHApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCS8qIFdlJ2xsIGp1c3QgY2F0Y2ggaXQgbGF0ZXIgd2hlbiB0aGUKKwkJICogZGV2aWNlIGlzIHVwJ2QuCisJCSAqLworCQl0ZzNfc2V0X210dShkZXYsIHRwLCBuZXdfbXR1KTsKKwkJcmV0dXJuIDA7CisJfQorCisJdGczX25ldGlmX3N0b3AodHApOworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKworCXRnM19oYWx0KHRwKTsKKworCXRnM19zZXRfbXR1KGRldiwgdHAsIG5ld19tdHUpOworCisJdGczX2luaXRfaHcodHApOworCisJdGczX25ldGlmX3N0YXJ0KHRwKTsKKworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRnJlZSB1cCBwZW5kaW5nIHBhY2tldHMgaW4gYWxsIHJ4L3R4IHJpbmdzLgorICoKKyAqIFRoZSBjaGlwIGhhcyBiZWVuIHNodXQgZG93biBhbmQgdGhlIGRyaXZlciBkZXRhY2hlZCBmcm9tCisgKiB0aGUgbmV0d29ya2luZywgc28gbm8gaW50ZXJydXB0cyBvciBuZXcgdHggcGFja2V0cyB3aWxsCisgKiBlbmQgdXAgaW4gdGhlIGRyaXZlci4gIHRwLT57dHgsfWxvY2sgaXMgbm90IGhlbGQgYW5kIHdlIGFyZSBub3QKKyAqIGluIGFuIGludGVycnVwdCBjb250ZXh0IGFuZCB0aHVzIG1heSBzbGVlcC4KKyAqLworc3RhdGljIHZvaWQgdGczX2ZyZWVfcmluZ3Moc3RydWN0IHRnMyAqdHApCit7CisJc3RydWN0IHJpbmdfaW5mbyAqcnhwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFRHM19SWF9SSU5HX1NJWkU7IGkrKykgeworCQlyeHAgPSAmdHAtPnJ4X3N0ZF9idWZmZXJzW2ldOworCisJCWlmIChyeHAtPnNrYiA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsCisJCQkJIHBjaV91bm1hcF9hZGRyKHJ4cCwgbWFwcGluZyksCisJCQkJIFJYX1BLVF9CVUZfU1ogLSB0cC0+cnhfb2Zmc2V0LAorCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiX2FueShyeHAtPnNrYik7CisJCXJ4cC0+c2tiID0gTlVMTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVEczX1JYX0pVTUJPX1JJTkdfU0laRTsgaSsrKSB7CisJCXJ4cCA9ICZ0cC0+cnhfanVtYm9fYnVmZmVyc1tpXTsKKworCQlpZiAocnhwLT5za2IgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LAorCQkJCSBwY2lfdW5tYXBfYWRkcihyeHAsIG1hcHBpbmcpLAorCQkJCSBSWF9KVU1CT19QS1RfQlVGX1NaIC0gdHAtPnJ4X29mZnNldCwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkocnhwLT5za2IpOworCQlyeHAtPnNrYiA9IE5VTEw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRHM19UWF9SSU5HX1NJWkU7ICkgeworCQlzdHJ1Y3QgdHhfcmluZ19pbmZvICp0eHA7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWludCBqOworCisJCXR4cCA9ICZ0cC0+dHhfYnVmZmVyc1tpXTsKKwkJc2tiID0gdHhwLT5za2I7CisKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlpKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsCisJCQkJIHBjaV91bm1hcF9hZGRyKHR4cCwgbWFwcGluZyksCisJCQkJIHNrYl9oZWFkbGVuKHNrYiksCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl0eHAtPnNrYiA9IE5VTEw7CisKKwkJaSsrOworCisJCWZvciAoaiA9IDA7IGogPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBqKyspIHsKKwkJCXR4cCA9ICZ0cC0+dHhfYnVmZmVyc1tpICYgKFRHM19UWF9SSU5HX1NJWkUgLSAxKV07CisJCQlwY2lfdW5tYXBfcGFnZSh0cC0+cGRldiwKKwkJCQkgICAgICAgcGNpX3VubWFwX2FkZHIodHhwLCBtYXBwaW5nKSwKKwkJCQkgICAgICAgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tqXS5zaXplLAorCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWkrKzsKKwkJfQorCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfQorfQorCisvKiBJbml0aWFsaXplIHR4L3J4IHJpbmdzIGZvciBwYWNrZXQgcHJvY2Vzc2luZy4KKyAqCisgKiBUaGUgY2hpcCBoYXMgYmVlbiBzaHV0IGRvd24gYW5kIHRoZSBkcml2ZXIgZGV0YWNoZWQgZnJvbQorICogdGhlIG5ldHdvcmtpbmcsIHNvIG5vIGludGVycnVwdHMgb3IgbmV3IHR4IHBhY2tldHMgd2lsbAorICogZW5kIHVwIGluIHRoZSBkcml2ZXIuICB0cC0+e3R4LH1sb2NrIGFyZSBoZWxkIGFuZCB0aHVzCisgKiB3ZSBtYXkgbm90IHNsZWVwLgorICovCitzdGF0aWMgdm9pZCB0ZzNfaW5pdF9yaW5ncyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgaTsKKworCS8qIEZyZWUgdXAgYWxsIHRoZSBTS0JzLiAqLworCXRnM19mcmVlX3JpbmdzKHRwKTsKKworCS8qIFplcm8gb3V0IGFsbCBkZXNjcmlwdG9ycy4gKi8KKwltZW1zZXQodHAtPnJ4X3N0ZCwgMCwgVEczX1JYX1JJTkdfQllURVMpOworCW1lbXNldCh0cC0+cnhfanVtYm8sIDAsIFRHM19SWF9KVU1CT19SSU5HX0JZVEVTKTsKKwltZW1zZXQodHAtPnJ4X3JjYiwgMCwgVEczX1JYX1JDQl9SSU5HX0JZVEVTKHRwKSk7CisJbWVtc2V0KHRwLT50eF9yaW5nLCAwLCBURzNfVFhfUklOR19CWVRFUyk7CisKKwkvKiBJbml0aWFsaXplIGludmFyaWFudHMgb2YgdGhlIHJpbmdzLCB3ZSBvbmx5IHNldCB0aGlzCisJICogc3R1ZmYgb25jZS4gIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgY2FyZCBkb2VzIG5vdAorCSAqIHdyaXRlIGludG8gdGhlIHJ4IGJ1ZmZlciBwb3N0aW5nIHJpbmdzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBURzNfUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyAqcnhkOworCisJCXJ4ZCA9ICZ0cC0+cnhfc3RkW2ldOworCQlyeGQtPmlkeF9sZW4gPSAoUlhfUEtUX0JVRl9TWiAtIHRwLT5yeF9vZmZzZXQgLSA2NCkKKwkJCTw8IFJYRF9MRU5fU0hJRlQ7CisJCXJ4ZC0+dHlwZV9mbGFncyA9IChSWERfRkxBR19FTkQgPDwgUlhEX0ZMQUdTX1NISUZUKTsKKwkJcnhkLT5vcGFxdWUgPSAoUlhEX09QQVFVRV9SSU5HX1NURCB8CisJCQkgICAgICAgKGkgPDwgUlhEX09QQVFVRV9JTkRFWF9TSElGVCkpOworCX0KKworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSlVNQk9fRU5BQkxFKSB7CisJCWZvciAoaSA9IDA7IGkgPCBURzNfUlhfSlVNQk9fUklOR19TSVpFOyBpKyspIHsKKwkJCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MgKnJ4ZDsKKworCQkJcnhkID0gJnRwLT5yeF9qdW1ib1tpXTsKKwkJCXJ4ZC0+aWR4X2xlbiA9IChSWF9KVU1CT19QS1RfQlVGX1NaIC0gdHAtPnJ4X29mZnNldCAtIDY0KQorCQkJCTw8IFJYRF9MRU5fU0hJRlQ7CisJCQlyeGQtPnR5cGVfZmxhZ3MgPSAoUlhEX0ZMQUdfRU5EIDw8IFJYRF9GTEFHU19TSElGVCkgfAorCQkJCVJYRF9GTEFHX0pVTUJPOworCQkJcnhkLT5vcGFxdWUgPSAoUlhEX09QQVFVRV9SSU5HX0pVTUJPIHwKKwkJCSAgICAgICAoaSA8PCBSWERfT1BBUVVFX0lOREVYX1NISUZUKSk7CisJCX0KKwl9CisKKwkvKiBOb3cgYWxsb2NhdGUgZnJlc2ggU0tCcyBmb3IgZWFjaCByeCByaW5nLiAqLworCWZvciAoaSA9IDA7IGkgPCB0cC0+cnhfcGVuZGluZzsgaSsrKSB7CisJCWlmICh0ZzNfYWxsb2Nfcnhfc2tiKHRwLCBSWERfT1BBUVVFX1JJTkdfU1RELAorCQkJCSAgICAgLTEsIGkpIDwgMCkKKwkJCWJyZWFrOworCX0KKworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSlVNQk9fRU5BQkxFKSB7CisJCWZvciAoaSA9IDA7IGkgPCB0cC0+cnhfanVtYm9fcGVuZGluZzsgaSsrKSB7CisJCQlpZiAodGczX2FsbG9jX3J4X3NrYih0cCwgUlhEX09QQVFVRV9SSU5HX0pVTUJPLAorCQkJCQkgICAgIC0xLCBpKSA8IDApCisJCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qCisgKiBNdXN0IG5vdCBiZSBpbnZva2VkIHdpdGggaW50ZXJydXB0IHNvdXJjZXMgZGlzYWJsZWQgYW5kCisgKiB0aGUgaGFyZHdhcmUgc2h1dGRvd24gZG93bi4KKyAqLworc3RhdGljIHZvaWQgdGczX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3QgdGczICp0cCkKK3sKKwlpZiAodHAtPnJ4X3N0ZF9idWZmZXJzKSB7CisJCWtmcmVlKHRwLT5yeF9zdGRfYnVmZmVycyk7CisJCXRwLT5yeF9zdGRfYnVmZmVycyA9IE5VTEw7CisJfQorCWlmICh0cC0+cnhfc3RkKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQodHAtPnBkZXYsIFRHM19SWF9SSU5HX0JZVEVTLAorCQkJCSAgICB0cC0+cnhfc3RkLCB0cC0+cnhfc3RkX21hcHBpbmcpOworCQl0cC0+cnhfc3RkID0gTlVMTDsKKwl9CisJaWYgKHRwLT5yeF9qdW1ibykgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHRwLT5wZGV2LCBURzNfUlhfSlVNQk9fUklOR19CWVRFUywKKwkJCQkgICAgdHAtPnJ4X2p1bWJvLCB0cC0+cnhfanVtYm9fbWFwcGluZyk7CisJCXRwLT5yeF9qdW1ibyA9IE5VTEw7CisJfQorCWlmICh0cC0+cnhfcmNiKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQodHAtPnBkZXYsIFRHM19SWF9SQ0JfUklOR19CWVRFUyh0cCksCisJCQkJICAgIHRwLT5yeF9yY2IsIHRwLT5yeF9yY2JfbWFwcGluZyk7CisJCXRwLT5yeF9yY2IgPSBOVUxMOworCX0KKwlpZiAodHAtPnR4X3JpbmcpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGRldiwgVEczX1RYX1JJTkdfQllURVMsCisJCQl0cC0+dHhfcmluZywgdHAtPnR4X2Rlc2NfbWFwcGluZyk7CisJCXRwLT50eF9yaW5nID0gTlVMTDsKKwl9CisJaWYgKHRwLT5od19zdGF0dXMpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGRldiwgVEczX0hXX1NUQVRVU19TSVpFLAorCQkJCSAgICB0cC0+aHdfc3RhdHVzLCB0cC0+c3RhdHVzX21hcHBpbmcpOworCQl0cC0+aHdfc3RhdHVzID0gTlVMTDsKKwl9CisJaWYgKHRwLT5od19zdGF0cykgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHRwLT5wZGV2LCBzaXplb2Yoc3RydWN0IHRnM19od19zdGF0cyksCisJCQkJICAgIHRwLT5od19zdGF0cywgdHAtPnN0YXRzX21hcHBpbmcpOworCQl0cC0+aHdfc3RhdHMgPSBOVUxMOworCX0KK30KKworLyoKKyAqIE11c3Qgbm90IGJlIGludm9rZWQgd2l0aCBpbnRlcnJ1cHQgc291cmNlcyBkaXNhYmxlZCBhbmQKKyAqIHRoZSBoYXJkd2FyZSBzaHV0ZG93biBkb3duLiAgQ2FuIHNsZWVwLgorICovCitzdGF0aWMgaW50IHRnM19hbGxvY19jb25zaXN0ZW50KHN0cnVjdCB0ZzMgKnRwKQoreworCXRwLT5yeF9zdGRfYnVmZmVycyA9IGttYWxsb2MoKHNpemVvZihzdHJ1Y3QgcmluZ19pbmZvKSAqCisJCQkJICAgICAgKFRHM19SWF9SSU5HX1NJWkUgKworCQkJCSAgICAgICBURzNfUlhfSlVNQk9fUklOR19TSVpFKSkgKworCQkJCSAgICAgKHNpemVvZihzdHJ1Y3QgdHhfcmluZ19pbmZvKSAqCisJCQkJICAgICAgVEczX1RYX1JJTkdfU0laRSksCisJCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXRwLT5yeF9zdGRfYnVmZmVycykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQodHAtPnJ4X3N0ZF9idWZmZXJzLCAwLAorCSAgICAgICAoc2l6ZW9mKHN0cnVjdCByaW5nX2luZm8pICoKKwkJKFRHM19SWF9SSU5HX1NJWkUgKworCQkgVEczX1JYX0pVTUJPX1JJTkdfU0laRSkpICsKKwkgICAgICAgKHNpemVvZihzdHJ1Y3QgdHhfcmluZ19pbmZvKSAqCisJCVRHM19UWF9SSU5HX1NJWkUpKTsKKworCXRwLT5yeF9qdW1ib19idWZmZXJzID0gJnRwLT5yeF9zdGRfYnVmZmVyc1tURzNfUlhfUklOR19TSVpFXTsKKwl0cC0+dHhfYnVmZmVycyA9IChzdHJ1Y3QgdHhfcmluZ19pbmZvICopCisJCSZ0cC0+cnhfanVtYm9fYnVmZmVyc1tURzNfUlhfSlVNQk9fUklOR19TSVpFXTsKKworCXRwLT5yeF9zdGQgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh0cC0+cGRldiwgVEczX1JYX1JJTkdfQllURVMsCisJCQkJCSAgJnRwLT5yeF9zdGRfbWFwcGluZyk7CisJaWYgKCF0cC0+cnhfc3RkKQorCQlnb3RvIGVycl9vdXQ7CisKKwl0cC0+cnhfanVtYm8gPSBwY2lfYWxsb2NfY29uc2lzdGVudCh0cC0+cGRldiwgVEczX1JYX0pVTUJPX1JJTkdfQllURVMsCisJCQkJCSAgICAmdHAtPnJ4X2p1bWJvX21hcHBpbmcpOworCisJaWYgKCF0cC0+cnhfanVtYm8pCisJCWdvdG8gZXJyX291dDsKKworCXRwLT5yeF9yY2IgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh0cC0+cGRldiwgVEczX1JYX1JDQl9SSU5HX0JZVEVTKHRwKSwKKwkJCQkJICAmdHAtPnJ4X3JjYl9tYXBwaW5nKTsKKwlpZiAoIXRwLT5yeF9yY2IpCisJCWdvdG8gZXJyX291dDsKKworCXRwLT50eF9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodHAtPnBkZXYsIFRHM19UWF9SSU5HX0JZVEVTLAorCQkJCQkgICAmdHAtPnR4X2Rlc2NfbWFwcGluZyk7CisJaWYgKCF0cC0+dHhfcmluZykKKwkJZ290byBlcnJfb3V0OworCisJdHAtPmh3X3N0YXR1cyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHRwLT5wZGV2LAorCQkJCQkgICAgIFRHM19IV19TVEFUVVNfU0laRSwKKwkJCQkJICAgICAmdHAtPnN0YXR1c19tYXBwaW5nKTsKKwlpZiAoIXRwLT5od19zdGF0dXMpCisJCWdvdG8gZXJyX291dDsKKworCXRwLT5od19zdGF0cyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHRwLT5wZGV2LAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCB0ZzNfaHdfc3RhdHMpLAorCQkJCQkgICAgJnRwLT5zdGF0c19tYXBwaW5nKTsKKwlpZiAoIXRwLT5od19zdGF0cykKKwkJZ290byBlcnJfb3V0OworCisJbWVtc2V0KHRwLT5od19zdGF0dXMsIDAsIFRHM19IV19TVEFUVVNfU0laRSk7CisJbWVtc2V0KHRwLT5od19zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCB0ZzNfaHdfc3RhdHMpKTsKKworCXJldHVybiAwOworCitlcnJfb3V0OgorCXRnM19mcmVlX2NvbnNpc3RlbnQodHApOworCXJldHVybiAtRU5PTUVNOworfQorCisjZGVmaW5lIE1BWF9XQUlUX0NOVCAxMDAwCisKKy8qIFRvIHN0b3AgYSBibG9jaywgY2xlYXIgdGhlIGVuYWJsZSBiaXQgYW5kIHBvbGwgdGlsbCBpdAorICogY2xlYXJzLiAgdHAtPmxvY2sgaXMgaGVsZC4KKyAqLworc3RhdGljIGludCB0ZzNfc3RvcF9ibG9jayhzdHJ1Y3QgdGczICp0cCwgdW5zaWduZWQgbG9uZyBvZnMsIHUzMiBlbmFibGVfYml0KQoreworCXVuc2lnbmVkIGludCBpOworCXUzMiB2YWw7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpIHsKKwkJc3dpdGNoIChvZnMpIHsKKwkJY2FzZSBSQ1ZMU0NfTU9ERToKKwkJY2FzZSBETUFDX01PREU6CisJCWNhc2UgTUJGUkVFX01PREU6CisJCWNhc2UgQlVGTUdSX01PREU6CisJCWNhc2UgTUVNQVJCX01PREU6CisJCQkvKiBXZSBjYW4ndCBlbmFibGUvZGlzYWJsZSB0aGVzZSBiaXRzIG9mIHRoZQorCQkJICogNTcwNS81NzUwLCBqdXN0IHNheSBzdWNjZXNzLgorCQkJICovCisJCQlyZXR1cm4gMDsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX07CisJfQorCisJdmFsID0gdHIzMihvZnMpOworCXZhbCAmPSB+ZW5hYmxlX2JpdDsKKwl0dzMyX2Yob2ZzLCB2YWwpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9XQUlUX0NOVDsgaSsrKSB7CisJCXVkZWxheSgxMDApOworCQl2YWwgPSB0cjMyKG9mcyk7CisJCWlmICgodmFsICYgZW5hYmxlX2JpdCkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IE1BWF9XQUlUX0NOVCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0ZzNfc3RvcF9ibG9jayB0aW1lZCBvdXQsICIKKwkJICAgICAgICJvZnM9JWx4IGVuYWJsZV9iaXQ9JXhcbiIsCisJCSAgICAgICBvZnMsIGVuYWJsZV9iaXQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyBpbnQgdGczX2Fib3J0X2h3KHN0cnVjdCB0ZzMgKnRwKQoreworCWludCBpLCBlcnI7CisKKwl0ZzNfZGlzYWJsZV9pbnRzKHRwKTsKKworCXRwLT5yeF9tb2RlICY9IH5SWF9NT0RFX0VOQUJMRTsKKwl0dzMyX2YoTUFDX1JYX01PREUsIHRwLT5yeF9tb2RlKTsKKwl1ZGVsYXkoMTApOworCisJZXJyICA9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZCRElfTU9ERSwgUkNWQkRJX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFJDVkxQQ19NT0RFLCBSQ1ZMUENfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgUkNWTFNDX01PREUsIFJDVkxTQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZEQkRJX01PREUsIFJDVkRCRElfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgUkNWRENDX01PREUsIFJDVkRDQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZDQ19NT0RFLCBSQ1ZDQ19NT0RFX0VOQUJMRSk7CisKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFNOREJEU19NT0RFLCBTTkRCRFNfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgU05EQkRJX01PREUsIFNOREJESV9NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBTTkREQVRBSV9NT0RFLCBTTkREQVRBSV9NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBSRE1BQ19NT0RFLCBSRE1BQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBTTkREQVRBQ19NT0RFLCBTTkREQVRBQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBETUFDX01PREUsIERNQUNfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgU05EQkRDX01PREUsIFNOREJEQ19NT0RFX0VOQUJMRSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwl0cC0+bWFjX21vZGUgJj0gfk1BQ19NT0RFX1RERV9FTkFCTEU7CisJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCXVkZWxheSg0MCk7CisKKwl0cC0+dHhfbW9kZSAmPSB+VFhfTU9ERV9FTkFCTEU7CisJdHczMl9mKE1BQ19UWF9NT0RFLCB0cC0+dHhfbW9kZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1dBSVRfQ05UOyBpKyspIHsKKwkJdWRlbGF5KDEwMCk7CisJCWlmICghKHRyMzIoTUFDX1RYX01PREUpICYgVFhfTU9ERV9FTkFCTEUpKQorCQkJYnJlYWs7CisJfQorCWlmIChpID49IE1BWF9XQUlUX0NOVCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0ZzNfYWJvcnRfaHcgdGltZWQgb3V0IGZvciAlcywgIgorCQkgICAgICAgIlRYX01PREVfRU5BQkxFIHdpbGwgbm90IGNsZWFyIE1BQ19UWF9NT0RFPSUwOHhcbiIsCisJCSAgICAgICB0cC0+ZGV2LT5uYW1lLCB0cjMyKE1BQ19UWF9NT0RFKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWVyciAgPSB0ZzNfc3RvcF9ibG9jayh0cCwgSE9TVENDX01PREUsIEhPU1RDQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBXRE1BQ19NT0RFLCBXRE1BQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBNQkZSRUVfTU9ERSwgTUJGUkVFX01PREVfRU5BQkxFKTsKKworCXR3MzIoRlRRX1JFU0VULCAweGZmZmZmZmZmKTsKKwl0dzMyKEZUUV9SRVNFVCwgMHgwMDAwMDAwMCk7CisKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIEJVRk1HUl9NT0RFLCBCVUZNR1JfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgTUVNQVJCX01PREUsIE1FTUFSQl9NT0RFX0VOQUJMRSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlpZiAodHAtPmh3X3N0YXR1cykKKwkJbWVtc2V0KHRwLT5od19zdGF0dXMsIDAsIFRHM19IV19TVEFUVVNfU0laRSk7CisJaWYgKHRwLT5od19zdGF0cykKKwkJbWVtc2V0KHRwLT5od19zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCB0ZzNfaHdfc3RhdHMpKTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qIHRwLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgaW50IHRnM19udnJhbV9sb2NrKHN0cnVjdCB0ZzMgKnRwKQoreworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTlZSQU0pIHsKKwkJaW50IGk7CisKKwkJdHczMihOVlJBTV9TV0FSQiwgU1dBUkJfUkVRX1NFVDEpOworCQlmb3IgKGkgPSAwOyBpIDwgODAwMDsgaSsrKSB7CisJCQlpZiAodHIzMihOVlJBTV9TV0FSQikgJiBTV0FSQl9HTlQxKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDIwKTsKKwkJfQorCQlpZiAoaSA9PSA4MDAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIHZvaWQgdGczX252cmFtX3VubG9jayhzdHJ1Y3QgdGczICp0cCkKK3sKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX05WUkFNKQorCQl0dzMyX2YoTlZSQU1fU1dBUkIsIFNXQVJCX1JFUV9DTFIxKTsKK30KKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyB2b2lkIHRnM193cml0ZV9zaWdfcHJlX3Jlc2V0KHN0cnVjdCB0ZzMgKnRwLCBpbnQga2luZCkKK3sKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1NVTl81NzBYKSkKKwkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRklSTVdBUkVfTUJPWCwKKwkJCSAgICAgIE5JQ19TUkFNX0ZJUk1XQVJFX01CT1hfTUFHSUMxKTsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0FTRl9ORVdfSEFORFNIQUtFKSB7CisJCXN3aXRjaCAoa2luZCkgeworCQljYXNlIFJFU0VUX0tJTkRfSU5JVDoKKwkJCXRnM193cml0ZV9tZW0odHAsIE5JQ19TUkFNX0ZXX0RSVl9TVEFURV9NQk9YLAorCQkJCSAgICAgIERSVl9TVEFURV9TVEFSVCk7CisJCQlicmVhazsKKworCQljYXNlIFJFU0VUX0tJTkRfU0hVVERPV046CisJCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GV19EUlZfU1RBVEVfTUJPWCwKKwkJCQkgICAgICBEUlZfU1RBVEVfVU5MT0FEKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVTRVRfS0lORF9TVVNQRU5EOgorCQkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfRFJWX1NUQVRFX01CT1gsCisJCQkJICAgICAgRFJWX1NUQVRFX1NVU1BFTkQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9OworCX0KK30KKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyB2b2lkIHRnM193cml0ZV9zaWdfcG9zdF9yZXNldChzdHJ1Y3QgdGczICp0cCwgaW50IGtpbmQpCit7CisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfQVNGX05FV19IQU5EU0hBS0UpIHsKKwkJc3dpdGNoIChraW5kKSB7CisJCWNhc2UgUkVTRVRfS0lORF9JTklUOgorCQkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfRFJWX1NUQVRFX01CT1gsCisJCQkJICAgICAgRFJWX1NUQVRFX1NUQVJUX0RPTkUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVNFVF9LSU5EX1NIVVRET1dOOgorCQkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfRFJWX1NUQVRFX01CT1gsCisJCQkJICAgICAgRFJWX1NUQVRFX1VOTE9BRF9ET05FKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfTsKKwl9Cit9CisKKy8qIHRwLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgdm9pZCB0ZzNfd3JpdGVfc2lnX2xlZ2FjeShzdHJ1Y3QgdGczICp0cCwgaW50IGtpbmQpCit7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKSB7CisJCXN3aXRjaCAoa2luZCkgeworCQljYXNlIFJFU0VUX0tJTkRfSU5JVDoKKwkJCXRnM193cml0ZV9tZW0odHAsIE5JQ19TUkFNX0ZXX0RSVl9TVEFURV9NQk9YLAorCQkJCSAgICAgIERSVl9TVEFURV9TVEFSVCk7CisJCQlicmVhazsKKworCQljYXNlIFJFU0VUX0tJTkRfU0hVVERPV046CisJCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GV19EUlZfU1RBVEVfTUJPWCwKKwkJCQkgICAgICBEUlZfU1RBVEVfVU5MT0FEKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVTRVRfS0lORF9TVVNQRU5EOgorCQkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfRFJWX1NUQVRFX01CT1gsCisJCQkJICAgICAgRFJWX1NUQVRFX1NVU1BFTkQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9OworCX0KK30KKworc3RhdGljIHZvaWQgdGczX3N0b3BfZncoc3RydWN0IHRnMyAqKTsKKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyBpbnQgdGczX2NoaXBfcmVzZXQoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIHZhbDsKKwl1MzIgZmxhZ3Nfc2F2ZTsKKwlpbnQgaTsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfU1VOXzU3MFgpKQorCQl0ZzNfbnZyYW1fbG9jayh0cCk7CisKKwkvKgorCSAqIFdlIG11c3QgYXZvaWQgdGhlIHJlYWRsKCkgdGhhdCBub3JtYWxseSB0YWtlcyBwbGFjZS4KKwkgKiBJdCBsb2NrcyBtYWNoaW5lcywgY2F1c2VzIG1hY2hpbmUgY2hlY2tzLCBhbmQgb3RoZXIKKwkgKiBmdW4gdGhpbmdzLiAgU28sIHRlbXBvcmFyaWx5IGRpc2FibGUgdGhlIDU3MDEKKwkgKiBoYXJkd2FyZSB3b3JrYXJvdW5kLCB3aGlsZSB3ZSBkbyB0aGUgcmVzZXQuCisJICovCisJZmxhZ3Nfc2F2ZSA9IHRwLT50ZzNfZmxhZ3M7CisJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfNTcwMV9SRUdfV1JJVEVfQlVHOworCisJLyogZG8gdGhlIHJlc2V0ICovCisJdmFsID0gR1JDX01JU0NfQ0ZHX0NPUkVDTEtfUkVTRVQ7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykgeworCQlpZiAodHIzMigweDdlMmMpID09IDB4NjApIHsKKwkJCXR3MzIoMHg3ZTJjLCAweDIwKTsKKwkJfQorCQlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3NTBfQTApIHsKKwkJCXR3MzIoR1JDX01JU0NfQ0ZHLCAoMSA8PCAyOSkpOworCQkJdmFsIHw9ICgxIDw8IDI5KTsKKwkJfQorCX0KKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykKKwkJdmFsIHw9IEdSQ19NSVNDX0NGR19LRUVQX0dQSFlfUE9XRVI7CisJdHczMihHUkNfTUlTQ19DRkcsIHZhbCk7CisKKwkvKiByZXN0b3JlIDU3MDEgaGFyZHdhcmUgYnVnIHdvcmthcm91bmQgZmxhZyAqLworCXRwLT50ZzNfZmxhZ3MgPSBmbGFnc19zYXZlOworCisJLyogVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSB0byBkZWxheSBiZWZvcmUgdGhlIFBDSSByZWFkIGJhY2suCisJICogU29tZSA1NzVYIGNoaXBzIGV2ZW4gd2lsbCBub3QgcmVzcG9uZCB0byBhIFBDSSBjZmcgYWNjZXNzCisJICogd2hlbiB0aGUgcmVzZXQgY29tbWFuZCBpcyBnaXZlbiB0byB0aGUgY2hpcC4KKwkgKgorCSAqIEhvdyBkbyB0aGVzZSBoYXJkd2FyZSBkZXNpZ25lcnMgZXhwZWN0IHRoaW5ncyB0byB3b3JrCisJICogcHJvcGVybHkgaWYgdGhlIFBDSSB3cml0ZSBpcyBwb3N0ZWQgZm9yIGEgbG9uZyBwZXJpb2QKKwkgKiBvZiB0aW1lPyAgSXQgaXMgYWx3YXlzIG5lY2Vzc2FyeSB0byBoYXZlIHNvbWUgbWV0aG9kIGJ5CisJICogd2hpY2ggYSByZWdpc3RlciByZWFkIGJhY2sgY2FuIG9jY3VyIHRvIHB1c2ggdGhlIHdyaXRlCisJICogb3V0IHdoaWNoIGRvZXMgdGhlIHJlc2V0LgorCSAqCisJICogRm9yIG1vc3QgdGczIHZhcmlhbnRzIHRoZSB0cmljayBiZWxvdyB3YXMgd29ya2luZy4KKwkgKiBIbyBodW0uLi4KKwkgKi8KKwl1ZGVsYXkoMTIwKTsKKworCS8qIEZsdXNoIFBDSSBwb3N0ZWQgd3JpdGVzLiAgVGhlIG5vcm1hbCBNTUlPIHJlZ2lzdGVycworCSAqIGFyZSBpbmFjY2Vzc2libGUgYXQgdGhpcyB0aW1lIHNvIHRoaXMgaXMgdGhlIG9ubHkKKwkgKiB3YXkgdG8gbWFrZSB0aGlzIHJlbGlhYmx5IChhY3R1YWxseSwgdGhpcyBpcyBubyBsb25nZXIKKwkgKiB0aGUgY2FzZSwgc2VlIGFib3ZlKS4gIEkgdHJpZWQgdG8gdXNlIGluZGlyZWN0CisJICogcmVnaXN0ZXIgcmVhZC93cml0ZSBidXQgdGhpcyB1cHNldCBzb21lIDU3MDEgdmFyaWFudHMuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBQQ0lfQ09NTUFORCwgJnZhbCk7CisKKwl1ZGVsYXkoMTIwKTsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSB7CisJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTc1MF9BMCkgeworCQkJaW50IGk7CisJCQl1MzIgY2ZnX3ZhbDsKKworCQkJLyogV2FpdCBmb3IgbGluayB0cmFpbmluZyB0byBjb21wbGV0ZS4gICovCisJCQlmb3IgKGkgPSAwOyBpIDwgNTAwMDsgaSsrKQorCQkJCXVkZWxheSgxMDApOworCisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIDB4YzQsICZjZmdfdmFsKTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIDB4YzQsCisJCQkJCSAgICAgICBjZmdfdmFsIHwgKDEgPDwgMTUpKTsKKwkJfQorCQkvKiBTZXQgUENJRSBtYXggcGF5bG9hZCBzaXplIGFuZCBjbGVhciBlcnJvciBzdGF0dXMuICAqLworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCAweGQ4LCAweGY1MDAwKTsKKwl9CisKKwkvKiBSZS1lbmFibGUgaW5kaXJlY3QgcmVnaXN0ZXIgYWNjZXNzZXMuICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01JU0NfSE9TVF9DVFJMLAorCQkJICAgICAgIHRwLT5taXNjX2hvc3RfY3RybCk7CisKKwkvKiBTZXQgTUFYIFBDSSByZXRyeSB0byB6ZXJvLiAqLworCXZhbCA9IChQQ0lTVEFURV9ST01fRU5BQkxFIHwgUENJU1RBVEVfUk9NX1JFVFJZX0VOQUJMRSk7CisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA0X0EwICYmCisJICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSkKKwkJdmFsIHw9IFBDSVNUQVRFX1JFVFJZX1NBTUVfRE1BOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9QQ0lTVEFURSwgdmFsKTsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHRwLT5wZGV2KTsKKworCS8qIE1ha2Ugc3VyZSBQQ0ktWCByZWxheGVkIG9yZGVyaW5nIGJpdCBpcyBjbGVhci4gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9YX0NBUFMsICZ2YWwpOworCXZhbCAmPSB+UENJWF9DQVBTX1JFTEFYRURfT1JERVJJTkc7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1hfQ0FQUywgdmFsKTsKKworCXR3MzIoTUVNQVJCX01PREUsIE1FTUFSQl9NT0RFX0VOQUJMRSk7CisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3NTBfQTMpIHsKKwkJdGczX3N0b3BfZncodHApOworCQl0dzMyKDB4NTAwMCwgMHg0MDApOworCX0KKworCXR3MzIoR1JDX01PREUsIHRwLT5ncmNfbW9kZSk7CisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDVfQTApIHsKKwkJdTMyIHZhbCA9IHRyMzIoMHhjNCk7CisKKwkJdHczMigweGM0LCB2YWwgfCAoMSA8PCAxNSkpOworCX0KKworCWlmICgodHAtPm5pY19zcmFtX2RhdGFfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfTUlOSV9QQ0kpICE9IDAgJiYKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpIHsKKwkJdHAtPnBjaV9jbG9ja19jdHJsIHw9IENMT0NLX0NUUkxfQ0xLUlVOX09FTkFCTEU7CisJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNV9BMCkKKwkJCXRwLT5wY2lfY2xvY2tfY3RybCB8PSBDTE9DS19DVFJMX0ZPUkNFX0NMS1JVTjsKKwkJdHczMihURzNQQ0lfQ0xPQ0tfQ1RSTCwgdHAtPnBjaV9jbG9ja19jdHJsKTsKKwl9CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSB7CisJCXRwLT5tYWNfbW9kZSA9IE1BQ19NT0RFX1BPUlRfTU9ERV9UQkk7CisJCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwl9IGVsc2UKKwkJdHczMl9mKE1BQ19NT0RFLCAwKTsKKwl1ZGVsYXkoNDApOworCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9TVU5fNTcwWCkpIHsKKwkJLyogV2FpdCBmb3IgZmlybXdhcmUgaW5pdGlhbGl6YXRpb24gdG8gY29tcGxldGUuICovCisJCWZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgeworCQkJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9GSVJNV0FSRV9NQk9YLCAmdmFsKTsKKwkJCWlmICh2YWwgPT0gfk5JQ19TUkFNX0ZJUk1XQVJFX01CT1hfTUFHSUMxKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEwKTsKKwkJfQorCQlpZiAoaSA+PSAxMDAwMDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggInRnM19yZXNldF9odyB0aW1lZCBvdXQgZm9yICVzLCAiCisJCQkgICAgICAgImZpcm13YXJlIHdpbGwgbm90IHJlc3RhcnQgbWFnaWM9JTA4eFxuIiwKKwkJCSAgICAgICB0cC0+ZGV2LT5uYW1lLCB2YWwpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlpZiAoKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpICYmCisJICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzUwX0EwKSB7CisJCXUzMiB2YWwgPSB0cjMyKDB4N2MwMCk7CisKKwkJdHczMigweDdjMDAsIHZhbCB8ICgxIDw8IDI1KSk7CisJfQorCisJLyogUmVwcm9iZSBBU0YgZW5hYmxlIHN0YXRlLiAgKi8KKwl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19FTkFCTEVfQVNGOworCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9BU0ZfTkVXX0hBTkRTSEFLRTsKKwl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX0RBVEFfU0lHLCAmdmFsKTsKKwlpZiAodmFsID09IE5JQ19TUkFNX0RBVEFfU0lHX01BR0lDKSB7CisJCXUzMiBuaWNfY2ZnOworCisJCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fREFUQV9DRkcsICZuaWNfY2ZnKTsKKwkJaWYgKG5pY19jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19BU0ZfRU5BQkxFKSB7CisJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0VOQUJMRV9BU0Y7CisJCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApCisJCQkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfQVNGX05FV19IQU5EU0hBS0U7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyB2b2lkIHRnM19zdG9wX2Z3KHN0cnVjdCB0ZzMgKnRwKQoreworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikgeworCQl1MzIgdmFsOworCQlpbnQgaTsKKworCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GV19DTURfTUJPWCwgRldDTURfTklDRFJWX1BBVVNFX0ZXKTsKKwkJdmFsID0gdHIzMihHUkNfUlhfQ1BVX0VWRU5UKTsKKwkJdmFsIHw9ICgxIDw8IDE0KTsKKwkJdHczMihHUkNfUlhfQ1BVX0VWRU5ULCB2YWwpOworCisJCS8qIFdhaXQgZm9yIFJYIGNwdSB0byBBQ0sgdGhlIGV2ZW50LiAgKi8KKwkJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCQlpZiAoISh0cjMyKEdSQ19SWF9DUFVfRVZFTlQpICYgKDEgPDwgMTQpKSkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxKTsKKwkJfQorCX0KK30KKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyBpbnQgdGczX2hhbHQoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGVycjsKKworCXRnM19zdG9wX2Z3KHRwKTsKKworCXRnM193cml0ZV9zaWdfcHJlX3Jlc2V0KHRwLCBSRVNFVF9LSU5EX1NIVVRET1dOKTsKKworCXRnM19hYm9ydF9odyh0cCk7CisJZXJyID0gdGczX2NoaXBfcmVzZXQodHApOworCisJdGczX3dyaXRlX3NpZ19sZWdhY3kodHAsIFJFU0VUX0tJTkRfU0hVVERPV04pOworCXRnM193cml0ZV9zaWdfcG9zdF9yZXNldCh0cCwgUkVTRVRfS0lORF9TSFVURE9XTik7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVEczX0ZXX1JFTEVBU0VfTUFKT1IJMHgwCisjZGVmaW5lIFRHM19GV19SRUxBU0VfTUlOT1IJMHgwCisjZGVmaW5lIFRHM19GV19SRUxFQVNFX0ZJWAkweDAKKyNkZWZpbmUgVEczX0ZXX1NUQVJUX0FERFIJMHgwODAwMDAwMAorI2RlZmluZSBURzNfRldfVEVYVF9BRERSCTB4MDgwMDAwMDAKKyNkZWZpbmUgVEczX0ZXX1RFWFRfTEVOCQkweDljMAorI2RlZmluZSBURzNfRldfUk9EQVRBX0FERFIJMHgwODAwMDljMAorI2RlZmluZSBURzNfRldfUk9EQVRBX0xFTgkweDYwCisjZGVmaW5lIFRHM19GV19EQVRBX0FERFIJMHgwODAwMGE0MAorI2RlZmluZSBURzNfRldfREFUQV9MRU4JCTB4MjAKKyNkZWZpbmUgVEczX0ZXX1NCU1NfQUREUgkweDA4MDAwYTYwCisjZGVmaW5lIFRHM19GV19TQlNTX0xFTgkJMHhjCisjZGVmaW5lIFRHM19GV19CU1NfQUREUgkJMHgwODAwMGE3MAorI2RlZmluZSBURzNfRldfQlNTX0xFTgkJMHgxMAorCitzdGF0aWMgdTMyIHRnM0Z3VGV4dFsoVEczX0ZXX1RFWFRfTEVOIC8gc2l6ZW9mKHUzMikpICsgMV0gPSB7CisJMHgwMDAwMDAwMCwgMHgxMDAwMDAwMywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwZCwgMHgzYzFkMDgwMCwKKwkweDM3YmQzZmZjLCAweDAzYTBmMDIxLCAweDNjMTAwODAwLCAweDI2MTAwMDAwLCAweDBlMDAwMDE4LCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMGQsIDB4M2MxZDA4MDAsIDB4MzdiZDNmZmMsIDB4MDNhMGYwMjEsIDB4M2MxMDA4MDAsIDB4MjYxMDAwMzQsCisJMHgwZTAwMDIxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDI3YmRmZmUwLCAweDNjMWNjMDAwLCAweGFmYmYwMDE4LCAweGFmODA2ODBjLCAweDBlMDAwMDRjLCAweDI0MWIyMTA1LAorCTB4OTc4NTAwMDAsIDB4OTc4NzAwMDIsIDB4OTc4MjAwMmMsIDB4OTc4MzAwMmUsIDB4M2MwNDA4MDAsIDB4MjQ4NDA5YzAsCisJMHhhZmEwMDAxNCwgMHgwMDAyMTQwMCwgMHgwMDYyMTgyNSwgMHgwMDA1MmMwMCwgMHhhZmEzMDAxMCwgMHg4Zjg2MDAxMCwKKwkweDAwZTUyODI1LCAweDBlMDAwMDYwLCAweDI0MDcwMTAyLCAweDNjMDJhYzAwLCAweDM0NDIwMTAwLCAweDNjMDNhYzAxLAorCTB4MzQ2MzAxMDAsIDB4YWY4MjA0OTAsIDB4M2MwMmZmZmYsIDB4YWY4MjA0OTQsIDB4YWY4MzA0OTgsIDB4YWY4MjA0OWMsCisJMHgyNDAyMDAwMSwgMHhhZjgyNWNlMCwgMHgwZTAwMDAzZiwgMHhhZjgyNWQwMCwgMHgwZTAwMDE0MCwgMHgwMDAwMDAwMCwKKwkweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDI0MDJmZmZmLCAweGFmODI1NDA0LCAweDhmODM1NDAwLAorCTB4MzQ2MzA0MDAsIDB4YWY4MzU0MDAsIDB4YWY4MjU0MDQsIDB4M2MwMjA4MDAsIDB4MjQ0MjAwMzQsIDB4YWY4MjU0MWMsCisJMHgwM2UwMDAwOCwgMHhhZjgwNTQwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwgMHgzNDQyMzAwMCwKKwkweDNjMDMwODAwLCAweDM0NjMzMDAwLCAweDNjMDQwODAwLCAweDM0ODQzN2ZmLCAweDNjMDEwODAwLCAweGFjMjIwYTY0LAorCTB4MjQwMjAwNDAsIDB4M2MwMTA4MDAsIDB4YWMyMjBhNjgsIDB4M2MwMTA4MDAsIDB4YWMyMDBhNjAsIDB4YWM2MDAwMDAsCisJMHgyNDYzMDAwNCwgMHgwMDgzMTAyYiwgMHg1MDQwZmZmZCwgMHhhYzYwMDAwMCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwKKwkweDAwODA0ODIxLCAweDhmYWEwMDEwLCAweDNjMDIwODAwLCAweDhjNDIwYTYwLCAweDNjMDQwODAwLCAweDhjODQwYTY4LAorCTB4OGZhYjAwMTQsIDB4MjQ0MzAwMDEsIDB4MDA0NDEwMmIsIDB4M2MwMTA4MDAsIDB4YWMyMzBhNjAsIDB4MTQ0MDAwMDMsCisJMHgwMDAwNDAyMSwgMHgzYzAxMDgwMCwgMHhhYzIwMGE2MCwgMHgzYzAyMDgwMCwgMHg4YzQyMGE2MCwgMHgzYzAzMDgwMCwKKwkweDhjNjMwYTY0LCAweDkxMjQwMDAwLCAweDAwMDIxMTQwLCAweDAwNDMxMDIxLCAweDAwNDgxMDIxLCAweDI1MDgwMDAxLAorCTB4YTA0NDAwMDAsIDB4MjkwMjAwMDgsIDB4MTQ0MGZmZjQsIDB4MjUyOTAwMDEsIDB4M2MwMjA4MDAsIDB4OGM0MjBhNjAsCisJMHgzYzAzMDgwMCwgMHg4YzYzMGE2NCwgMHg4Zjg0NjgwYywgMHgwMDAyMTE0MCwgMHgwMDQzMTAyMSwgMHhhYzQ0MDAwOCwKKwkweGFjNDUwMDBjLCAweGFjNDYwMDEwLCAweGFjNDcwMDE0LCAweGFjNGEwMDE4LCAweDAzZTAwMDA4LCAweGFjNGIwMDFjLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLAorCTB4MDIwMDAwMDgsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4M2MwYTAwMDEsIDB4MGEwMDAxZTMsIDB4M2MwYTAwMDIsCisJMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwKKwkweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLAorCTB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsCisJMHgwYTAwMDFlMywgMHgzYzBhMDAwNywgMHgwYTAwMDFlMywgMHgzYzBhMDAwOCwgMHgwYTAwMDFlMywgMHgzYzBhMDAwOSwKKwkweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDNjMGEwMDBiLAorCTB4MGEwMDAxZTMsIDB4M2MwYTAwMGMsIDB4MGEwMDAxZTMsIDB4M2MwYTAwMGQsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsCisJMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgzYzBhMDAwZSwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwKKwkweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLAorCTB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsCisJMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgzYzBhMDAxMywgMHgwYTAwMDFlMywgMHgzYzBhMDAxNCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkweDI3YmRmZmUwLCAweDAwMDAxODIxLCAweDAwMDAxMDIxLCAweGFmYmYwMDE4LCAweGFmYjEwMDE0LCAweGFmYjAwMDEwLAorCTB4M2MwMTA4MDAsIDB4MDAyMjA4MjEsIDB4YWMyMDBhNzAsIDB4M2MwMTA4MDAsIDB4MDAyMjA4MjEsIDB4YWMyMDBhNzQsCisJMHgzYzAxMDgwMCwgMHgwMDIyMDgyMSwgMHhhYzIwMGE3OCwgMHgyNDYzMDAwMSwgMHgxODYwZmZmNSwgMHgyNDQyMDAwYywKKwkweDI0MTEwMDAxLCAweDhmOTA2ODEwLCAweDMyMDIwMDA0LCAweDE0NDAwMDA1LCAweDI0MDQwMDAxLCAweDNjMDIwODAwLAorCTB4OGM0MjBhNzgsIDB4MTg0MDAwMDMsIDB4MDAwMDIwMjEsIDB4MGUwMDAxODIsIDB4MDAwMDAwMDAsIDB4MzIwMjAwMDEsCisJMHgxMDQwMDAwMywgMHgwMDAwMDAwMCwgMHgwZTAwMDE2OSwgMHgwMDAwMDAwMCwgMHgwYTAwMDE1MywgMHhhZjkxNTAyOCwKKwkweDhmYmYwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDNjMDUwODAwLAorCTB4OGNhNTBhNzAsIDB4M2MwNjA4MDAsIDB4OGNjNjBhODAsIDB4M2MwNzA4MDAsIDB4OGNlNzBhNzgsIDB4MjdiZGZmZTAsCisJMHgzYzA0MDgwMCwgMHgyNDg0MDlkMCwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDA2MCwgMHhhZmEwMDAxNCwKKwkweDBlMDAwMTdiLCAweDAwMDAyMDIxLCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDI0MDIwMDAxLAorCTB4OGY4MzY4MTAsIDB4MDA4MjEwMDQsIDB4MDAwMjEwMjcsIDB4MDA2MjE4MjQsIDB4MDNlMDAwMDgsIDB4YWY4MzY4MTAsCisJMHgyN2JkZmZkOCwgMHhhZmJmMDAyNCwgMHgxMDgwMDAyZSwgMHhhZmIwMDAyMCwgMHg4ZjgyNWNlYywgMHhhZmEyMDAxOCwKKwkweDhmODI1Y2VjLCAweDNjMTAwODAwLCAweDI2MTAwYTc4LCAweGFmYTIwMDFjLCAweDM0MDI4MDAwLCAweGFmODI1Y2VjLAorCTB4OGUwMjAwMDAsIDB4MTg0MDAwMTYsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsIDB4OTQ0MjBhNzQsIDB4OGZhMzAwMWMsCisJMHgwMDAyMjFjMCwgMHhhYzgzMDAwNCwgMHg4ZmEyMDAxYywgMHgzYzAxMDgwMCwgMHgwZTAwMDIwMSwgMHhhYzIyMGE3NCwKKwkweDEwNDAwMDA1LCAweDAwMDAwMDAwLCAweDhlMDIwMDAwLCAweDI0NDIwMDAxLCAweDBhMDAwMWRmLCAweGFlMDIwMDAwLAorCTB4M2MwMjA4MDAsIDB4OGM0MjBhNzAsIDB4MDAwMjFjMDIsIDB4MDAwMzIxYzAsIDB4MGEwMDAxYzUsIDB4YWZhMjAwMWMsCisJMHgwZTAwMDIwMSwgMHgwMDAwMDAwMCwgMHgxMDQwMDAxZiwgMHgwMDAwMDAwMCwgMHg4ZTAyMDAwMCwgMHg4ZmEzMDAxYywKKwkweDI0NDIwMDAxLCAweDNjMDEwODAwLCAweGFjMjMwYTcwLCAweDNjMDEwODAwLCAweGFjMjMwYTc0LCAweDBhMDAwMWRmLAorCTB4YWUwMjAwMDAsIDB4M2MxMDA4MDAsIDB4MjYxMDBhNzgsIDB4OGUwMjAwMDAsIDB4MTg0MDAwMjgsIDB4MDAwMDAwMDAsCisJMHgwZTAwMDIwMSwgMHgwMDAwMDAwMCwgMHgxNDQwMDAyNCwgMHgwMDAwMDAwMCwgMHg4ZTAyMDAwMCwgMHgzYzAzMDgwMCwKKwkweDhjNjMwYTcwLCAweDI0NDJmZmZmLCAweGFmYTMwMDFjLCAweDE4NDAwMDA2LCAweGFlMDIwMDAwLCAweDAwMDMxNDAyLAorCTB4MDAwMjIxYzAsIDB4OGM4MjAwMDQsIDB4M2MwMTA4MDAsIDB4YWMyMjBhNzAsIDB4OTdhMjAwMWUsIDB4MjQ0MmZmMDAsCisJMHgyYzQyMDMwMCwgMHgxNDQwMDAwYiwgMHgyNDAyNDAwMCwgMHgzYzA0MDgwMCwgMHgyNDg0MDlkYywgMHhhZmEwMDAxMCwKKwkweGFmYTAwMDE0LCAweDhmYTYwMDFjLCAweDI0MDUwMDA4LCAweDBlMDAwMDYwLCAweDAwMDAzODIxLCAweDBhMDAwMWRmLAorCTB4MDAwMDAwMDAsIDB4YWY4MjVjZjgsIDB4M2MwMjA4MDAsIDB4OGM0MjBhNDAsIDB4OGZhMzAwMWMsIDB4MjQ0MjAwMDEsCisJMHhhZjgzNWNmOCwgMHgzYzAxMDgwMCwgMHhhYzIyMGE0MCwgMHg4ZmJmMDAyNCwgMHg4ZmIwMDAyMCwgMHgwM2UwMDAwOCwKKwkweDI3YmQwMDI4LCAweDI3YmRmZmUwLCAweDNjMDQwODAwLCAweDI0ODQwOWU4LCAweDAwMDAyODIxLCAweDAwMDAzMDIxLAorCTB4MDAwMDM4MjEsIDB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsIDB4MGUwMDAwNjAsIDB4YWZhMDAwMTQsIDB4OGZiZjAwMTgsCisJMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwgMHg4ZjgyNjgwYywgMHg4Zjg1NjgwYywgMHgwMDAyMTgyNywgMHgwMDAzMTgyYiwKKwkweDAwMDMxODIzLCAweDAwNDMxMDI0LCAweDAwNDQxMDIxLCAweDAwYTIyODJiLCAweDEwYTAwMDA2LCAweDAwMDAwMDAwLAorCTB4MDA0MDE4MjEsIDB4OGY4MjY4MGMsIDB4MDA0MzEwMmIsIDB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsIDB4MDNlMDAwMDgsCisJMHgwMDAwMDAwMCwgMHgzYzA0MDgwMCwgMHg4Yzg0MDAwMCwgMHgzYzAzMDgwMCwgMHg4YzYzMGE0MCwgMHgwMDY0MTAyYiwKKwkweDU0NDAwMDAyLCAweDAwODMxMDIzLCAweDAwNjQxMDIzLCAweDJjNDIwMDA4LCAweDAzZTAwMDA4LCAweDM4NDIwMDAxLAorCTB4MjdiZGZmZTAsIDB4MDA4MDI4MjEsIDB4M2MwNDA4MDAsIDB4MjQ4NDBhMDAsIDB4MDAwMDMwMjEsIDB4MDAwMDM4MjEsCisJMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDA2MCwgMHhhZmEwMDAxNCwgMHgwYTAwMDIxNiwgMHgwMDAwMDAwMCwKKwkweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDAwMDAwMDAwLCAweDI3YmRmZmUwLCAweDNjMWNjMDAwLAorCTB4YWZiZjAwMTgsIDB4MGUwMDAwNGMsIDB4YWY4MDY4MGMsIDB4M2MwNDA4MDAsIDB4MjQ4NDBhMTAsIDB4MDM4MDI4MjEsCisJMHgwMDAwMzAyMSwgMHgwMDAwMzgyMSwgMHhhZmEwMDAxMCwgMHgwZTAwMDA2MCwgMHhhZmEwMDAxNCwgMHgyNDAyZmZmZiwKKwkweGFmODI1NDA0LCAweDNjMDIwMGFhLCAweDBlMDAwMjM0LCAweGFmODI1NDM0LCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LAorCTB4MjdiZDAwMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTgsIDB4YWZiMDAwMTAsCisJMHgyNDEwMDAwMSwgMHhhZmJmMDAxNCwgMHgzYzAxYzAwMywgMHhhYzIwMDAwMCwgMHg4ZjgyNjgxMCwgMHgzMDQyMjAwMCwKKwkweDEwNDAwMDAzLCAweDAwMDAwMDAwLCAweDBlMDAwMjQ2LCAweDAwMDAwMDAwLCAweDBhMDAwMjNhLCAweGFmOTA1NDI4LAorCTB4OGZiZjAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4MjdiZGZmZjgsIDB4OGY4NDVkMGMsCisJMHgzYzAyMDBmZiwgMHgzYzAzMDgwMCwgMHg4YzYzMGE1MCwgMHgzNDQyZmZmOCwgMHgwMDgyMTAyNCwgMHgxMDQzMDAxZSwKKwkweDNjMDUwMGZmLCAweDM0YTVmZmY4LCAweDNjMDZjMDAzLCAweDNjMDc0MDAwLCAweDAwODUxODI0LCAweDhjNjIwMDEwLAorCTB4M2MwMTA4MDAsIDB4YWMyMzBhNTAsIDB4MzA0MjAwMDgsIDB4MTA0MDAwMDUsIDB4MDA4NzEwMjUsIDB4OGNjMjAwMDAsCisJMHgyNDQyMDAwMSwgMHhhY2MyMDAwMCwgMHgwMDg3MTAyNSwgMHhhZjgyNWQwYywgMHg4ZmEyMDAwMCwgMHgyNDQyMDAwMSwKKwkweGFmYTIwMDAwLCAweDhmYTIwMDAwLCAweDhmYTIwMDAwLCAweDI0NDIwMDAxLCAweGFmYTIwMDAwLCAweDhmYTIwMDAwLAorCTB4OGY4NDVkMGMsIDB4M2MwMzA4MDAsIDB4OGM2MzBhNTAsIDB4MDA4NTEwMjQsIDB4MTQ0M2ZmZTgsIDB4MDA4NTE4MjQsCisJMHgyN2JkMDAwOCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMAorfTsKKworc3RhdGljIHUzMiB0ZzNGd1JvZGF0YVsoVEczX0ZXX1JPREFUQV9MRU4gLyBzaXplb2YodTMyKSkgKyAxXSA9IHsKKwkweDM1MzczMDMxLCAweDcyNmM3MzQxLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDUzNzc0NTc2LCAweDY1NmU3NDMwLAorCTB4MDAwMDAwMDAsIDB4NzI2YzcwNDUsIDB4NzY2NTZlNzQsIDB4MzEwMDAwMDAsIDB4NTU2ZTZiNmUsIDB4NDU3NjZlNzQsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg2NjYxNzQ2MSwgMHg2YzQ1NzI3MiwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDRkNjE2OTZlLCAweDQzNzA3NTQyLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAKK307CisKKyNpZiAwIC8qIEFsbCB6ZXJvcywgZG9uJ3QgZWF0IHVwIHNwYWNlIHdpdGggaXQuICovCit1MzIgdGczRndEYXRhWyhURzNfRldfREFUQV9MRU4gLyBzaXplb2YodTMyKSkgKyAxXSA9IHsKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAKK307CisjZW5kaWYKKworI2RlZmluZSBSWF9DUFVfU0NSQVRDSF9CQVNFCTB4MzAwMDAKKyNkZWZpbmUgUlhfQ1BVX1NDUkFUQ0hfU0laRQkweDA0MDAwCisjZGVmaW5lIFRYX0NQVV9TQ1JBVENIX0JBU0UJMHgzNDAwMAorI2RlZmluZSBUWF9DUFVfU0NSQVRDSF9TSVpFCTB4MDQwMDAKKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyBpbnQgdGczX2hhbHRfY3B1KHN0cnVjdCB0ZzMgKnRwLCB1MzIgb2Zmc2V0KQoreworCWludCBpOworCisJaWYgKG9mZnNldCA9PSBUWF9DUFVfQkFTRSAmJgorCSAgICAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKQorCQlCVUcoKTsKKworCWlmIChvZmZzZXQgPT0gUlhfQ1BVX0JBU0UpIHsKKwkJZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKKwkJCXR3MzIob2Zmc2V0ICsgQ1BVX1NUQVRFLCAweGZmZmZmZmZmKTsKKwkJCXR3MzIob2Zmc2V0ICsgQ1BVX01PREUsICBDUFVfTU9ERV9IQUxUKTsKKwkJCWlmICh0cjMyKG9mZnNldCArIENQVV9NT0RFKSAmIENQVV9NT0RFX0hBTFQpCisJCQkJYnJlYWs7CisJCX0KKworCQl0dzMyKG9mZnNldCArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJCXR3MzJfZihvZmZzZXQgKyBDUFVfTU9ERSwgIENQVV9NT0RFX0hBTFQpOworCQl1ZGVsYXkoMTApOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisJCQl0dzMyKG9mZnNldCArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJCQl0dzMyKG9mZnNldCArIENQVV9NT0RFLCAgQ1BVX01PREVfSEFMVCk7CisJCQlpZiAodHIzMihvZmZzZXQgKyBDUFVfTU9ERSkgJiBDUFVfTU9ERV9IQUxUKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPj0gMTAwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidGczX3Jlc2V0X2NwdSB0aW1lZCBvdXQgZm9yICVzLCAiCisJCSAgICAgICAiYW5kICVzIENQVVxuIiwKKwkJICAgICAgIHRwLT5kZXYtPm5hbWUsCisJCSAgICAgICAob2Zmc2V0ID09IFJYX0NQVV9CQVNFID8gIlJYIiA6ICJUWCIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZndfaW5mbyB7CisJdW5zaWduZWQgaW50IHRleHRfYmFzZTsKKwl1bnNpZ25lZCBpbnQgdGV4dF9sZW47CisJdTMyICp0ZXh0X2RhdGE7CisJdW5zaWduZWQgaW50IHJvZGF0YV9iYXNlOworCXVuc2lnbmVkIGludCByb2RhdGFfbGVuOworCXUzMiAqcm9kYXRhX2RhdGE7CisJdW5zaWduZWQgaW50IGRhdGFfYmFzZTsKKwl1bnNpZ25lZCBpbnQgZGF0YV9sZW47CisJdTMyICpkYXRhX2RhdGE7Cit9OworCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIGludCB0ZzNfbG9hZF9maXJtd2FyZV9jcHUoc3RydWN0IHRnMyAqdHAsIHUzMiBjcHVfYmFzZSwgdTMyIGNwdV9zY3JhdGNoX2Jhc2UsCisJCQkJIGludCBjcHVfc2NyYXRjaF9zaXplLCBzdHJ1Y3QgZndfaW5mbyAqaW5mbykKK3sKKwlpbnQgZXJyLCBpOworCXUzMiBvcmlnX3RnM19mbGFncyA9IHRwLT50ZzNfZmxhZ3M7CisJdm9pZCAoKndyaXRlX29wKShzdHJ1Y3QgdGczICosIHUzMiwgdTMyKTsKKworCWlmIChjcHVfYmFzZSA9PSBUWF9DUFVfQkFTRSAmJgorCSAgICAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInRnM19sb2FkX2Zpcm13YXJlX2NwdTogVHJ5aW5nIHRvIGxvYWQgIgorCQkgICAgICAgIlRYIGNwdSBmaXJtd2FyZSBvbiAlcyB3aGljaCBpcyA1NzA1LlxuIiwKKwkJICAgICAgIHRwLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpCisJCXdyaXRlX29wID0gdGczX3dyaXRlX21lbTsKKwllbHNlCisJCXdyaXRlX29wID0gdGczX3dyaXRlX2luZGlyZWN0X3JlZzMyOworCisJLyogRm9yY2UgdXNlIG9mIFBDSSBjb25maWcgc3BhY2UgZm9yIGluZGlyZWN0IHJlZ2lzdGVyCisJICogd3JpdGUgY2FsbHMuCisJICovCisJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19QQ0lYX1RBUkdFVF9IV0JVRzsKKworCWVyciA9IHRnM19oYWx0X2NwdSh0cCwgY3B1X2Jhc2UpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZm9yIChpID0gMDsgaSA8IGNwdV9zY3JhdGNoX3NpemU7IGkgKz0gc2l6ZW9mKHUzMikpCisJCXdyaXRlX29wKHRwLCBjcHVfc2NyYXRjaF9iYXNlICsgaSwgMCk7CisJdHczMihjcHVfYmFzZSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJdHczMihjcHVfYmFzZSArIENQVV9NT0RFLCB0cjMyKGNwdV9iYXNlK0NQVV9NT0RFKXxDUFVfTU9ERV9IQUxUKTsKKwlmb3IgKGkgPSAwOyBpIDwgKGluZm8tPnRleHRfbGVuIC8gc2l6ZW9mKHUzMikpOyBpKyspCisJCXdyaXRlX29wKHRwLCAoY3B1X3NjcmF0Y2hfYmFzZSArCisJCQkgICAgICAoaW5mby0+dGV4dF9iYXNlICYgMHhmZmZmKSArCisJCQkgICAgICAoaSAqIHNpemVvZih1MzIpKSksCisJCQkgKGluZm8tPnRleHRfZGF0YSA/CisJCQkgIGluZm8tPnRleHRfZGF0YVtpXSA6IDApKTsKKwlmb3IgKGkgPSAwOyBpIDwgKGluZm8tPnJvZGF0YV9sZW4gLyBzaXplb2YodTMyKSk7IGkrKykKKwkJd3JpdGVfb3AodHAsIChjcHVfc2NyYXRjaF9iYXNlICsKKwkJCSAgICAgIChpbmZvLT5yb2RhdGFfYmFzZSAmIDB4ZmZmZikgKworCQkJICAgICAgKGkgKiBzaXplb2YodTMyKSkpLAorCQkJIChpbmZvLT5yb2RhdGFfZGF0YSA/CisJCQkgIGluZm8tPnJvZGF0YV9kYXRhW2ldIDogMCkpOworCWZvciAoaSA9IDA7IGkgPCAoaW5mby0+ZGF0YV9sZW4gLyBzaXplb2YodTMyKSk7IGkrKykKKwkJd3JpdGVfb3AodHAsIChjcHVfc2NyYXRjaF9iYXNlICsKKwkJCSAgICAgIChpbmZvLT5kYXRhX2Jhc2UgJiAweGZmZmYpICsKKwkJCSAgICAgIChpICogc2l6ZW9mKHUzMikpKSwKKwkJCSAoaW5mby0+ZGF0YV9kYXRhID8KKwkJCSAgaW5mby0+ZGF0YV9kYXRhW2ldIDogMCkpOworCisJZXJyID0gMDsKKworb3V0OgorCXRwLT50ZzNfZmxhZ3MgPSBvcmlnX3RnM19mbGFnczsKKwlyZXR1cm4gZXJyOworfQorCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIGludCB0ZzNfbG9hZF81NzAxX2EwX2Zpcm13YXJlX2ZpeChzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgZndfaW5mbyBpbmZvOworCWludCBlcnIsIGk7CisKKwlpbmZvLnRleHRfYmFzZSA9IFRHM19GV19URVhUX0FERFI7CisJaW5mby50ZXh0X2xlbiA9IFRHM19GV19URVhUX0xFTjsKKwlpbmZvLnRleHRfZGF0YSA9ICZ0ZzNGd1RleHRbMF07CisJaW5mby5yb2RhdGFfYmFzZSA9IFRHM19GV19ST0RBVEFfQUREUjsKKwlpbmZvLnJvZGF0YV9sZW4gPSBURzNfRldfUk9EQVRBX0xFTjsKKwlpbmZvLnJvZGF0YV9kYXRhID0gJnRnM0Z3Um9kYXRhWzBdOworCWluZm8uZGF0YV9iYXNlID0gVEczX0ZXX0RBVEFfQUREUjsKKwlpbmZvLmRhdGFfbGVuID0gVEczX0ZXX0RBVEFfTEVOOworCWluZm8uZGF0YV9kYXRhID0gTlVMTDsKKworCWVyciA9IHRnM19sb2FkX2Zpcm13YXJlX2NwdSh0cCwgUlhfQ1BVX0JBU0UsCisJCQkJICAgIFJYX0NQVV9TQ1JBVENIX0JBU0UsIFJYX0NQVV9TQ1JBVENIX1NJWkUsCisJCQkJICAgICZpbmZvKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gdGczX2xvYWRfZmlybXdhcmVfY3B1KHRwLCBUWF9DUFVfQkFTRSwKKwkJCQkgICAgVFhfQ1BVX1NDUkFUQ0hfQkFTRSwgVFhfQ1BVX1NDUkFUQ0hfU0laRSwKKwkJCQkgICAgJmluZm8pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBOb3cgc3RhcnR1cCBvbmx5IHRoZSBSWCBjcHUuICovCisJdHczMihSWF9DUFVfQkFTRSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJdHczMl9mKFJYX0NQVV9CQVNFICsgQ1BVX1BDLCAgICBURzNfRldfVEVYVF9BRERSKTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJaWYgKHRyMzIoUlhfQ1BVX0JBU0UgKyBDUFVfUEMpID09IFRHM19GV19URVhUX0FERFIpCisJCQlicmVhazsKKwkJdHczMihSWF9DUFVfQkFTRSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJCXR3MzIoUlhfQ1BVX0JBU0UgKyBDUFVfTU9ERSwgIENQVV9NT0RFX0hBTFQpOworCQl0dzMyX2YoUlhfQ1BVX0JBU0UgKyBDUFVfUEMsICAgIFRHM19GV19URVhUX0FERFIpOworCQl1ZGVsYXkoMTAwMCk7CisJfQorCWlmIChpID49IDUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidGczX2xvYWRfZmlybXdhcmUgZmFpbHMgZm9yICVzICIKKwkJICAgICAgICJ0byBzZXQgUlggQ1BVIFBDLCBpcyAlMDh4IHNob3VsZCBiZSAlMDh4XG4iLAorCQkgICAgICAgdHAtPmRldi0+bmFtZSwgdHIzMihSWF9DUFVfQkFTRSArIENQVV9QQyksCisJCSAgICAgICBURzNfRldfVEVYVF9BRERSKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXR3MzIoUlhfQ1BVX0JBU0UgKyBDUFVfU1RBVEUsIDB4ZmZmZmZmZmYpOworCXR3MzJfZihSWF9DUFVfQkFTRSArIENQVV9NT0RFLCAgMHgwMDAwMDAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIFRHM19UU09fU1VQUE9SVCAhPSAwCisKKyNkZWZpbmUgVEczX1RTT19GV19SRUxFQVNFX01BSk9SCTB4MQorI2RlZmluZSBURzNfVFNPX0ZXX1JFTEFTRV9NSU5PUgkJMHg2CisjZGVmaW5lIFRHM19UU09fRldfUkVMRUFTRV9GSVgJCTB4MAorI2RlZmluZSBURzNfVFNPX0ZXX1NUQVJUX0FERFIJCTB4MDgwMDAwMDAKKyNkZWZpbmUgVEczX1RTT19GV19URVhUX0FERFIJCTB4MDgwMDAwMDAKKyNkZWZpbmUgVEczX1RTT19GV19URVhUX0xFTgkJMHgxYWEwCisjZGVmaW5lIFRHM19UU09fRldfUk9EQVRBX0FERFIJCTB4MDgwMDFhYTAKKyNkZWZpbmUgVEczX1RTT19GV19ST0RBVEFfTEVOCQkweDYwCisjZGVmaW5lIFRHM19UU09fRldfREFUQV9BRERSCQkweDA4MDAxYjIwCisjZGVmaW5lIFRHM19UU09fRldfREFUQV9MRU4JCTB4MzAKKyNkZWZpbmUgVEczX1RTT19GV19TQlNTX0FERFIJCTB4MDgwMDFiNTAKKyNkZWZpbmUgVEczX1RTT19GV19TQlNTX0xFTgkJMHgyYworI2RlZmluZSBURzNfVFNPX0ZXX0JTU19BRERSCQkweDA4MDAxYjgwCisjZGVmaW5lIFRHM19UU09fRldfQlNTX0xFTgkJMHg4OTQKKworc3RhdGljIHUzMiB0ZzNUc29Gd1RleHRbKFRHM19UU09fRldfVEVYVF9MRU4gLyA0KSArIDFdID0geworCTB4MGUwMDAwMDMsIDB4MDAwMDAwMDAsIDB4MDgwMDFiMjQsIDB4MDAwMDAwMDAsIDB4MTAwMDAwMDMsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwZCwgMHgwMDAwMDAwZCwgMHgzYzFkMDgwMCwgMHgzN2JkNDAwMCwgMHgwM2EwZjAyMSwgMHgzYzEwMDgwMCwKKwkweDI2MTAwMDAwLCAweDBlMDAwMDEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDI3YmRmZmUwLCAweDNjMDRmZWZlLAorCTB4YWZiZjAwMTgsIDB4MGUwMDA1ZDgsIDB4MzQ4NDAwMDIsIDB4MGUwMDA2NjgsIDB4MDAwMDAwMDAsIDB4M2MwMzA4MDAsCisJMHg5MDYzMWI2OCwgMHgyNDAyMDAwMiwgMHgzYzA0MDgwMCwgMHgyNDg0MWFhYywgMHgxNDYyMDAwMywgMHgyNDA1MDAwMSwKKwkweDNjMDQwODAwLCAweDI0ODQxYWEwLCAweDI0MDYwMDA2LCAweDAwMDAzODIxLCAweGFmYTAwMDEwLCAweDBlMDAwNjdjLAorCTB4YWZhMDAwMTQsIDB4OGY2MjVjNTAsIDB4MzQ0MjAwMDEsIDB4YWY2MjVjNTAsIDB4OGY2MjVjOTAsIDB4MzQ0MjAwMDEsCisJMHhhZjYyNWM5MCwgMHgyNDAyZmZmZiwgMHgwZTAwMDAzNCwgMHhhZjYyNTQwNCwgMHg4ZmJmMDAxOCwgMHgwM2UwMDAwOCwKKwkweDI3YmQwMDIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI3YmRmZmUwLCAweGFmYmYwMDFjLAorCTB4YWZiMjAwMTgsIDB4YWZiMTAwMTQsIDB4MGUwMDAwNWIsIDB4YWZiMDAwMTAsIDB4MjQxMjAwMDIsIDB4MjQxMTAwMDEsCisJMHg4ZjcwNjgyMCwgMHgzMjAyMDEwMCwgMHgxMDQwMDAwMywgMHgwMDAwMDAwMCwgMHgwZTAwMDBiYiwgMHgwMDAwMDAwMCwKKwkweDhmNzA2ODIwLCAweDMyMDIyMDAwLCAweDEwNDAwMDA0LCAweDMyMDIwMDAxLCAweDBlMDAwMWYwLCAweDI0MDQwMDAxLAorCTB4MzIwMjAwMDEsIDB4MTA0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGUwMDAwYTMsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsCisJMHg5MDQyMWI5OCwgMHgxNDUyMDAwMywgMHgwMDAwMDAwMCwgMHgwZTAwMDRjMCwgMHgwMDAwMDAwMCwgMHgwYTAwMDAzYywKKwkweGFmNzE1MDI4LCAweDhmYmYwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LAorCTB4MjdiZDAwMjAsIDB4MjdiZGZmZTAsIDB4M2MwNDA4MDAsIDB4MjQ4NDFhYzAsIDB4MDAwMDI4MjEsIDB4MDAwMDMwMjEsCisJMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDY3YywgMHhhZmEwMDAxNCwgMHgzYzA0MDgwMCwKKwkweDI0ODQyM2Q4LCAweGE0ODAwMDAwLCAweDNjMDEwODAwLCAweGEwMjAxYjk4LCAweDNjMDEwODAwLCAweGFjMjAxYjljLAorCTB4M2MwMTA4MDAsIDB4YWMyMDFiYTAsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYTQsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYWMsCisJMHgzYzAxMDgwMCwgMHhhYzIwMWJiOCwgMHgzYzAxMDgwMCwgMHhhYzIwMWJiYywgMHg4ZjYyNDQzNCwgMHgzYzAxMDgwMCwKKwkweGFjMjIxYjg4LCAweDhmNjI0NDM4LCAweDNjMDEwODAwLCAweGFjMjIxYjhjLCAweDhmNjI0NDEwLCAweGFjODBmN2E4LAorCTB4M2MwMTA4MDAsIDB4YWMyMDFiODQsIDB4M2MwMTA4MDAsIDB4YWMyMDIzZTAsIDB4M2MwMTA4MDAsIDB4YWMyMDIzYzgsCisJMHgzYzAxMDgwMCwgMHhhYzIwMjNjYywgMHgzYzAxMDgwMCwgMHhhYzIwMjQwMCwgMHgzYzAxMDgwMCwgMHhhYzIyMWI5MCwKKwkweDhmNjIwMDY4LCAweDI0MDMwMDA3LCAweDAwMDIxNzAyLCAweDEwNDMwMDA1LCAweDAwMDAwMDAwLCAweDhmNjIwMDY4LAorCTB4MDAwMjE3MDIsIDB4MTQ0MDAwMDQsIDB4MjQwMjAwMDEsIDB4M2MwMTA4MDAsIDB4MGEwMDAwOTcsIDB4YWMyMDI0MGMsCisJMHhhYzgyMDAzNCwgMHgzYzA0MDgwMCwgMHgyNDg0MWFjYywgMHgzYzA1MDgwMCwgMHg4Y2E1MjQwYywgMHgwMDAwMzAyMSwKKwkweDAwMDAzODIxLCAweGFmYTAwMDEwLCAweDBlMDAwNjdjLCAweGFmYTAwMDE0LCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LAorCTB4MjdiZDAwMjAsIDB4MjdiZGZmZTAsIDB4M2MwNDA4MDAsIDB4MjQ4NDFhZDgsIDB4MDAwMDI4MjEsIDB4MDAwMDMwMjEsCisJMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDY3YywgMHhhZmEwMDAxNCwgMHgwZTAwMDA1YiwKKwkweDAwMDAwMDAwLCAweDBlMDAwMGI0LCAweDAwMDAyMDIxLCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLAorCTB4MjQwMjAwMDEsIDB4OGY2MzY4MjAsIDB4MDA4MjEwMDQsIDB4MDAwMjEwMjcsIDB4MDA2MjE4MjQsIDB4MDNlMDAwMDgsCisJMHhhZjYzNjgyMCwgMHgyN2JkZmZkMCwgMHhhZmJmMDAyYywgMHhhZmI2MDAyOCwgMHhhZmI1MDAyNCwgMHhhZmI0MDAyMCwKKwkweGFmYjMwMDFjLCAweGFmYjIwMDE4LCAweGFmYjEwMDE0LCAweGFmYjAwMDEwLCAweDhmNjc1YzVjLCAweDNjMDMwODAwLAorCTB4MjQ2MzFiYmMsIDB4OGM2MjAwMDAsIDB4MTQ0NzAwMDUsIDB4M2MwMjAwZmYsIDB4M2MwMjA4MDAsIDB4OTA0MjFiOTgsCisJMHgxNDQwMDExOSwgMHgzYzAyMDBmZiwgMHgzNDQyZmZmOCwgMHgwMGUyODgyNCwgMHhhYzY3MDAwMCwgMHgwMDExMTkwMiwKKwkweDMwNjMwMGZmLCAweDMwZTIwMDAzLCAweDAwMDIxMWMwLCAweDAwNjIyODI1LCAweDAwYTA0MDIxLCAweDAwMDcxNjAyLAorCTB4M2MwMzA4MDAsIDB4OTA2MzFiOTgsIDB4MzA0NDAwMGYsIDB4MTQ2MDAwMzYsIDB4MDA4MDQ4MjEsIDB4MjQwMjAwMDEsCisJMHgzYzAxMDgwMCwgMHhhMDIyMWI5OCwgMHgwMDA1MTEwMCwgMHgwMDgyMTAyNSwgMHgzYzAxMDgwMCwgMHhhYzIwMWI5YywKKwkweDNjMDEwODAwLCAweGFjMjAxYmEwLCAweDNjMDEwODAwLCAweGFjMjAxYmE0LCAweDNjMDEwODAwLCAweGFjMjAxYmFjLAorCTB4M2MwMTA4MDAsIDB4YWMyMDFiYjgsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYjAsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYjQsCisJMHgzYzAxMDgwMCwgMHhhNDIyMjNkOCwgMHg5NjIyMDAwYywgMHgzMDQzN2ZmZiwgMHgzYzAxMDgwMCwgMHhhNDIyMjQxMCwKKwkweDMwNDI4MDAwLCAweDNjMDEwODAwLCAweGE0MjMxYmM2LCAweDEwNDAwMDA1LCAweDI0MDIwMDAxLCAweDNjMDEwODAwLAorCTB4YWMyMjIzZjQsIDB4MGEwMDAxMDIsIDB4MjQwNjAwM2UsIDB4MjQwNjAwMzYsIDB4M2MwMTA4MDAsIDB4YWMyMDIzZjQsCisJMHg5NjIyMDAwYSwgMHgzYzAzMDgwMCwgMHg5NDYzMWJjNiwgMHgzYzAxMDgwMCwgMHhhYzIwMjNmMCwgMHgzYzAxMDgwMCwKKwkweGFjMjAyM2Y4LCAweDAwMDIxMzAyLCAweDAwMDIxMDgwLCAweDAwYzIxMDIxLCAweDAwNjIxODIxLCAweDNjMDEwODAwLAorCTB4YTQyMjIzZDAsIDB4M2MwMTA4MDAsIDB4MGEwMDAxMTUsIDB4YTQyMzFiOTYsIDB4OTYyMjAwMGMsIDB4M2MwMTA4MDAsCisJMHhhNDIyMjNlYywgMHgzYzA0MDgwMCwgMHgyNDg0MWI5YywgMHg4YzgyMDAwMCwgMHgwMDAyMTEwMCwgMHgzYzAxMDgwMCwKKwkweDAwMjIwODIxLCAweGFjMzExYmM4LCAweDhjODIwMDAwLCAweDAwMDIxMTAwLCAweDNjMDEwODAwLCAweDAwMjIwODIxLAorCTB4YWMyNzFiY2MsIDB4OGM4MjAwMDAsIDB4MjUwMzAwMDEsIDB4MzA2NjAxZmYsIDB4MDAwMjExMDAsIDB4M2MwMTA4MDAsCisJMHgwMDIyMDgyMSwgMHhhYzI2MWJkMCwgMHg4YzgyMDAwMCwgMHgwMDAyMTEwMCwgMHgzYzAxMDgwMCwgMHgwMDIyMDgyMSwKKwkweGFjMjkxYmQ0LCAweDk2MjMwMDA4LCAweDNjMDIwODAwLCAweDhjNDIxYmFjLCAweDAwNDMyODIxLCAweDNjMDEwODAwLAorCTB4YWMyNTFiYWMsIDB4OTYyMjAwMGEsIDB4MzA0MjAwMDQsIDB4MTQ0MDAwMTgsIDB4MDAwNjExMDAsIDB4OGY2MzBjMTQsCisJMHgzMDYzMDAwZiwgMHgyYzYyMDAwMiwgMHgxNDQwMDAwYiwgMHgzYzAyYzAwMCwgMHg4ZjYzMGMxNCwgMHgzYzAyMDgwMCwKKwkweDhjNDIxYjQwLCAweDMwNjMwMDBmLCAweDI0NDIwMDAxLCAweDNjMDEwODAwLCAweGFjMjIxYjQwLCAweDJjNjIwMDAyLAorCTB4MTA0MGZmZjcsIDB4M2MwMmMwMDAsIDB4MDBlMjE4MjUsIDB4YWY2MzVjNWMsIDB4OGY2MjVjNTAsIDB4MzA0MjAwMDIsCisJMHgxMDQwMDAxNCwgMHgwMDAwMDAwMCwgMHgwYTAwMDE0NywgMHgwMDAwMDAwMCwgMHgzYzAzMDgwMCwgMHg4YzYzMWI4MCwKKwkweDNjMDQwODAwLCAweDk0ODQxYjk0LCAweDAxMjIxMDI1LCAweDNjMDEwODAwLCAweGE0MjIyM2RhLCAweDI0MDIwMDAxLAorCTB4M2MwMTA4MDAsIDB4YWMyMjFiYjgsIDB4MjQ2MzAwMDEsIDB4MDA4NTIwMmEsIDB4M2MwMTA4MDAsIDB4MTA4MDAwMDMsCisJMHhhYzIzMWI4MCwgMHgzYzAxMDgwMCwgMHhhNDI1MWI5NCwgMHgzYzA2MDgwMCwgMHgyNGM2MWI5YywgMHg4Y2MyMDAwMCwKKwkweDI0NDIwMDAxLCAweGFjYzIwMDAwLCAweDI4NDIwMDgwLCAweDE0NDAwMDA1LCAweDAwMDAwMDAwLCAweDBlMDAwNjU2LAorCTB4MjQwNDAwMDIsIDB4MGEwMDAxZTYsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsIDB4OGM0MjFiYjgsIDB4MTA0MDAwNzgsCisJMHgyNDAyMDAwMSwgMHgzYzA1MDgwMCwgMHg5MGE1MWI5OCwgMHgxNGEyMDA3MiwgMHgwMDAwMDAwMCwgMHgzYzE1MDgwMCwKKwkweDk2YjUxYjk2LCAweDNjMDQwODAwLCAweDhjODQxYmFjLCAweDMyYTNmZmZmLCAweDAwODMxMDJhLCAweDE0NDAwMDZjLAorCTB4MDAwMDAwMDAsIDB4MTQ4MzAwMDMsIDB4MDAwMDAwMDAsIDB4M2MwMTA4MDAsIDB4YWMyNTIzZjAsIDB4MTA2MDAwNWMsCisJMHgwMDAwOTAyMSwgMHgyNGQ2MDAwNCwgMHgwMDYwYTAyMSwgMHgyNGQzMDAxNCwgMHg4ZWMyMDAwMCwgMHgwMDAyODEwMCwKKwkweDNjMTEwODAwLCAweDAyMzA4ODIxLCAweDBlMDAwNjI1LCAweDhlMzExYmM4LCAweDAwNDAyODIxLCAweDEwYTAwMDU0LAorCTB4MDAwMDAwMDAsIDB4OTYyODAwMGEsIDB4MzEwMjAwNDAsIDB4MTA0MDAwMDUsIDB4MjQwNzE4MGMsIDB4OGUyMjAwMGMsCisJMHgyNDA3MTg4YywgMHgwMDAyMTQwMCwgMHhhY2EyMDAxOCwgMHgzYzAzMDgwMCwgMHgwMDcwMTgyMSwgMHg4YzYzMWJkMCwKKwkweDNjMDIwODAwLCAweDAwNTAxMDIxLCAweDhjNDIxYmQ0LCAweDAwMDMxZDAwLCAweDAwMDIxNDAwLCAweDAwNjIxODI1LAorCTB4YWNhMzAwMTQsIDB4OGVjMzAwMDQsIDB4OTYyMjAwMDgsIDB4MDA0MzIwMjMsIDB4MzI0MmZmZmYsIDB4MzA4M2ZmZmYsCisJMHgwMDQzMTAyMSwgMHgwMjgyMTAyYSwgMHgxNDQwMDAwMiwgMHgwMmIyMzAyMywgMHgwMDgwMzAyMSwgMHg4ZTYyMDAwMCwKKwkweDMwYzRmZmZmLCAweDAwNDQxMDIxLCAweGFlNjIwMDAwLCAweDhlMjIwMDAwLCAweGFjYTIwMDAwLCAweDhlMjIwMDA0LAorCTB4OGU2M2ZmZjQsIDB4MDA0MzEwMjEsIDB4YWNhMjAwMDQsIDB4YTRhNjAwMGUsIDB4OGU2MmZmZjQsIDB4MDA0NDEwMjEsCisJMHhhZTYyZmZmNCwgMHg5NjIzMDAwOCwgMHgwMDQzMTAyYSwgMHgxNDQwMDAwNSwgMHgwMjQ2OTAyMSwgMHg4ZTYyZmZmMCwKKwkweGFlNjBmZmY0LCAweDI0NDIwMDAxLCAweGFlNjJmZmYwLCAweGFjYTAwMDA4LCAweDMyNDJmZmZmLCAweDE0NTQwMDA4LAorCTB4MjQwMjAzMDUsIDB4MzEwMjAwODAsIDB4NTQ0MDAwMDEsIDB4MzRlNzAwMTAsIDB4MjQwMjA5MDUsIDB4YTRhMjAwMGMsCisJMHgwYTAwMDFjYiwgMHgzNGU3MDAyMCwgMHhhNGEyMDAwYywgMHgzYzAyMDgwMCwgMHg4YzQyMjNmMCwgMHgxMDQwMDAwMywKKwkweDNjMDI0YjY1LCAweDBhMDAwMWQzLCAweDM0NDI3NjU0LCAweDNjMDJiNDlhLCAweDM0NDI4OWFiLCAweGFjYTIwMDFjLAorCTB4MzBlMmZmZmYsIDB4YWNhMjAwMTAsIDB4MGUwMDA1YTIsIDB4MDBhMDIwMjEsIDB4MzI0MmZmZmYsIDB4MDA1NDEwMmIsCisJMHgxNDQwZmZhOSwgMHgwMDAwMDAwMCwgMHgyNDAyMDAwMiwgMHgzYzAxMDgwMCwgMHgwYTAwMDFlNiwgMHhhMDIyMWI5OCwKKwkweDhlYzIwODNjLCAweDI0NDIwMDAxLCAweDBhMDAwMWU2LCAweGFlYzIwODNjLCAweDBlMDAwNGMwLCAweDAwMDAwMDAwLAorCTB4OGZiZjAwMmMsIDB4OGZiNjAwMjgsIDB4OGZiNTAwMjQsIDB4OGZiNDAwMjAsIDB4OGZiMzAwMWMsIDB4OGZiMjAwMTgsCisJMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAzMCwgMHgyN2JkZmZkMCwgMHhhZmJmMDAyOCwKKwkweGFmYjMwMDI0LCAweGFmYjIwMDIwLCAweGFmYjEwMDFjLCAweGFmYjAwMDE4LCAweDhmNzI1YzljLCAweDNjMDIwMGZmLAorCTB4MzQ0MmZmZjgsIDB4M2MwNzA4MDAsIDB4MjRlNzFiYjQsIDB4MDI0Mjg4MjQsIDB4OTYyMzAwMGUsIDB4OGNlMjAwMDAsCisJMHgwMDQzMTAyMSwgMHhhY2UyMDAwMCwgMHg4ZTIyMDAxMCwgMHgzMDQyMDAyMCwgMHgxNDQwMDAxMSwgMHgwMDgwOTgyMSwKKwkweDBlMDAwNjNiLCAweDAyMjAyMDIxLCAweDNjMDJjMDAwLCAweDAyNDIxODI1LCAweGFmNjM1YzljLCAweDhmNjI1YzkwLAorCTB4MzA0MjAwMDIsIDB4MTA0MDAxMWUsIDB4MDAwMDAwMDAsIDB4YWY2MzVjOWMsIDB4OGY2MjVjOTAsIDB4MzA0MjAwMDIsCisJMHgxMDQwMDExOSwgMHgwMDAwMDAwMCwgMHgwYTAwMDIwZCwgMHgwMDAwMDAwMCwgMHg4ZTI0MDAwOCwgMHg4ZTIzMDAxNCwKKwkweDAwMDQxNDAyLCAweDAwMDIzMWMwLCAweDAwMDMxNTAyLCAweDMwNDIwMWZmLCAweDI0NDJmZmZmLCAweDMwNDIwMDdmLAorCTB4MDAwMzE5NDIsIDB4MzA2Mzc4MDAsIDB4MDAwMjExMDAsIDB4MjQ0MjQwMDAsIDB4MDA2MjQ4MjEsIDB4OTUyMjAwMGEsCisJMHgzMDg0ZmZmZiwgMHgzMDQyMDAwOCwgMHgxMDQwMDBiMCwgMHgwMDA0MjljMCwgMHgzYzAyMDgwMCwgMHg4YzQyMjQwMCwKKwkweDE0NDAwMDI0LCAweDI0YzUwMDA4LCAweDk0YzIwMDE0LCAweDNjMDEwODAwLCAweGE0MjIyM2QwLCAweDhjYzQwMDEwLAorCTB4MDAwNDE0MDIsIDB4M2MwMTA4MDAsIDB4YTQyMjIzZDIsIDB4M2MwMTA4MDAsIDB4YTQyNDIzZDQsIDB4OTRjMjAwMGUsCisJMHgzMDgzZmZmZiwgMHgwMDQzMTAyMywgMHgzYzAxMDgwMCwgMHhhYzIyMjQwOCwgMHg5NGMyMDAxYSwgMHgzYzAxMDgwMCwKKwkweGFjMjYyNDAwLCAweDNjMDEwODAwLCAweGFjMzIyNDA0LCAweDNjMDEwODAwLCAweGFjMjIyM2ZjLCAweDNjMDJjMDAwLAorCTB4MDI0MjE4MjUsIDB4YWY2MzVjOWMsIDB4OGY2MjVjOTAsIDB4MzA0MjAwMDIsIDB4MTA0MDAwZTUsIDB4MDAwMDAwMDAsCisJMHhhZjYzNWM5YywgMHg4ZjYyNWM5MCwgMHgzMDQyMDAwMiwgMHgxMDQwMDBlMCwgMHgwMDAwMDAwMCwgMHgwYTAwMDI0NiwKKwkweDAwMDAwMDAwLCAweDk0YzIwMDBlLCAweDNjMDMwODAwLCAweDk0NjMyM2Q0LCAweDAwNDM0MDIzLCAweDMxMDNmZmZmLAorCTB4MmM2MjAwMDgsIDB4MTA0MDAwMWMsIDB4MDAwMDAwMDAsIDB4OTRjMjAwMTQsIDB4MjQ0MjAwMjgsIDB4MDBhMjI4MjEsCisJMHgwMDAzMTA0MiwgMHgxODQwMDAwYiwgMHgwMDAwMjAyMSwgMHgyNGU2MDg0OCwgMHgwMDQwMzgyMSwgMHg5NGEzMDAwMCwKKwkweDhjYzIwMDAwLCAweDI0ODQwMDAxLCAweDAwNDMxMDIxLCAweGFjYzIwMDAwLCAweDAwODcxMDJhLCAweDE0NDBmZmY5LAorCTB4MjRhNTAwMDIsIDB4MzEwMjAwMDEsIDB4MTA0MDAwMWYsIDB4M2MwMjQwMDAsIDB4M2MwNDA4MDAsIDB4MjQ4NDIzZmMsCisJMHhhMGEwMDAwMSwgMHg5NGEzMDAwMCwgMHg4YzgyMDAwMCwgMHgwMDQzMTAyMSwgMHgwYTAwMDI4NSwgMHhhYzgyMDAwMCwKKwkweDhmNjI2ODAwLCAweDNjMDMwMDEwLCAweDAwNDMxMDI0LCAweDEwNDAwMDA5LCAweDAwMDAwMDAwLCAweDk0YzIwMDFhLAorCTB4M2MwMzA4MDAsIDB4OGM2MzIzZmMsIDB4MDA0MzEwMjEsIDB4M2MwMTA4MDAsIDB4YWMyMjIzZmMsIDB4MGEwMDAyODYsCisJMHgzYzAyNDAwMCwgMHg5NGMyMDAxYSwgMHg5NGM0MDAxYywgMHgzYzAzMDgwMCwgMHg4YzYzMjNmYywgMHgwMDQ0MTAyMywKKwkweDAwNjIxODIxLCAweDNjMDEwODAwLCAweGFjMjMyM2ZjLCAweDNjMDI0MDAwLCAweDAyNDIxODI1LCAweGFmNjM1YzljLAorCTB4OGY2MjVjOTAsIDB4MzA0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MDAwMDAwMDAsIDB4OTUyMjAwMGEsIDB4MzA0MjAwMTAsCisJMHgxMDQwMDA5YiwgMHgwMDAwMDAwMCwgMHgzYzAzMDgwMCwgMHg5NDYzMjNkNCwgMHgzYzA3MDgwMCwgMHgyNGU3MjQwMCwKKwkweDhjZTQwMDAwLCAweDhmNjI2ODAwLCAweDI0NjMwMDMwLCAweDAwODMyODIxLCAweDNjMDMwMDEwLCAweDAwNDMxMDI0LAorCTB4MTQ0MDAwMGEsIDB4MDAwMDAwMDAsIDB4OTRhMjAwMDQsIDB4M2MwNDA4MDAsIDB4OGM4NDI0MDgsIDB4M2MwMzA4MDAsCisJMHg4YzYzMjNmYywgMHgwMDQ0MTAyMywgMHgwMDYyMTgyMSwgMHgzYzAxMDgwMCwgMHhhYzIzMjNmYywgMHgzYzA0MDgwMCwKKwkweDhjODQyM2ZjLCAweDAwMDQxYzAyLCAweDMwODJmZmZmLCAweDAwNjIyMDIxLCAweDAwMDQxNDAyLCAweDAwODIyMDIxLAorCTB4MDAwNDEwMjcsIDB4YTRhMjAwMDYsIDB4M2MwMzA4MDAsIDB4OGM2MzI0MDQsIDB4M2MwMjAwZmYsIDB4MzQ0MmZmZjgsCisJMHgwMDYyODgyNCwgMHg5NjIyMDAwOCwgMHgyNDA1MDAwMSwgMHgyNDAzNDAwMCwgMHgwMDAyMzFjMCwgMHgwMDgwMTAyMSwKKwkweGE0YzIwMDFhLCAweGE0YzAwMDFjLCAweGFjZTAwMDAwLCAweDNjMDEwODAwLCAweGFjMjUxYjYwLCAweGFmNjM1Y2I4LAorCTB4OGY2MjVjYjAsIDB4MzA0MjAwMDIsIDB4MTA0MDAwMDMsIDB4MDAwMDAwMDAsIDB4M2MwMTA4MDAsIDB4YWMyMDFiNjAsCisJMHg4ZTIyMDAwOCwgMHhhZjYyNWNiOCwgMHg4ZjYyNWNiMCwgMHgzMDQyMDAwMiwgMHgxMDQwMDAwMywgMHgwMDAwMDAwMCwKKwkweDNjMDEwODAwLCAweGFjMjAxYjYwLCAweDNjMDIwODAwLCAweDhjNDIxYjYwLCAweDEwNDBmZmVjLCAweDAwMDAwMDAwLAorCTB4M2MwNDA4MDAsIDB4MGUwMDA2M2IsIDB4OGM4NDI0MDQsIDB4MGEwMDAzMmEsIDB4MDAwMDAwMDAsIDB4M2MwMzA4MDAsCisJMHg5MDYzMWI5OCwgMHgyNDAyMDAwMiwgMHgxNDYyMDAwMywgMHgzYzAzNGI2NSwgMHgwYTAwMDJlMSwgMHgwMDAwODAyMSwKKwkweDhlMjIwMDFjLCAweDM0NjM3NjU0LCAweDEwNDMwMDAyLCAweDI0MTAwMDAyLCAweDI0MTAwMDAxLCAweDAwYzAyMDIxLAorCTB4MGUwMDAzNTAsIDB4MDIwMDMwMjEsIDB4MjQwMjAwMDMsIDB4M2MwMTA4MDAsIDB4YTAyMjFiOTgsIDB4MjQwMjAwMDIsCisJMHgxMjAyMDAwYSwgMHgyNDAyMDAwMSwgMHgzYzAzMDgwMCwgMHg4YzYzMjNmMCwgMHgxMDYyMDAwNiwgMHgwMDAwMDAwMCwKKwkweDNjMDIwODAwLCAweDk0NDIyM2Q4LCAweDAwMDIxNDAwLCAweDBhMDAwMzFmLCAweGFlMjIwMDE0LCAweDNjMDQwODAwLAorCTB4MjQ4NDIzZGEsIDB4OTQ4MjAwMDAsIDB4MDAwMjE0MDAsIDB4YWUyMjAwMTQsIDB4M2MwMjA4MDAsIDB4OGM0MjFiYmMsCisJMHgzYzAzYzAwMCwgMHgzYzAxMDgwMCwgMHhhMDIwMWI5OCwgMHgwMDQzMTAyNSwgMHhhZjYyNWM1YywgMHg4ZjYyNWM1MCwKKwkweDMwNDIwMDAyLCAweDEwNDAwMDA5LCAweDAwMDAwMDAwLCAweDI0ODRmN2UyLCAweDhjODIwMDAwLCAweDAwNDMxMDI1LAorCTB4YWY2MjVjNWMsIDB4OGY2MjVjNTAsIDB4MzA0MjAwMDIsIDB4MTQ0MGZmZmEsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsCisJMHgyNDQyMWI4NCwgMHg4YzQzMDAwMCwgMHgyNDYzMDAwMSwgMHhhYzQzMDAwMCwgMHg4ZjYzMGMxNCwgMHgzMDYzMDAwZiwKKwkweDJjNjIwMDAyLCAweDE0NDAwMDBjLCAweDNjMDI0MDAwLCAweDhmNjMwYzE0LCAweDNjMDIwODAwLCAweDhjNDIxYjQwLAorCTB4MzA2MzAwMGYsIDB4MjQ0MjAwMDEsIDB4M2MwMTA4MDAsIDB4YWMyMjFiNDAsIDB4MmM2MjAwMDIsIDB4MTA0MGZmZjcsCisJMHgwMDAwMDAwMCwgMHgzYzAyNDAwMCwgMHgwMjQyMTgyNSwgMHhhZjYzNWM5YywgMHg4ZjYyNWM5MCwgMHgzMDQyMDAwMiwKKwkweDE0NDBmZmZjLCAweDAwMDAwMDAwLCAweDEyNjAwMDAzLCAweDAwMDAwMDAwLCAweDBlMDAwNGMwLCAweDAwMDAwMDAwLAorCTB4OGZiZjAwMjgsIDB4OGZiMzAwMjQsIDB4OGZiMjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIDB4MDNlMDAwMDgsCisJMHgyN2JkMDAzMCwgMHg4ZjYzNDQ1MCwgMHgzYzA0MDgwMCwgMHgyNDg0MWI4OCwgMHg4YzgyMDAwMCwgMHgwMDAzMWMwMiwKKwkweDAwNDMxMDJiLCAweDE0NDAwMDA3LCAweDNjMDM4MDAwLCAweDhjODQwMDA0LCAweDhmNjI0NDUwLCAweDAwMDIxYzAyLAorCTB4MDA4MzEwMmIsIDB4MTA0MGZmZmMsIDB4M2MwMzgwMDAsIDB4YWY2MzQ0NDQsIDB4OGY2MjQ0NDQsIDB4MDA0MzEwMjQsCisJMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg4ZjYyNDQ0OCwgMHgwM2UwMDAwOCwgMHgzMDQyZmZmZiwgMHgzYzAyNDAwMCwKKwkweDAwODIyMDI1LCAweGFmNjQ1YzM4LCAweDhmNjI1YzMwLCAweDMwNDIwMDAyLCAweDE0NDBmZmZjLCAweDAwMDAwMDAwLAorCTB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4MDA4MDU4MjEsIDB4MTRjMDAwMTEsIDB4MjU2ZTAwMDgsCisJMHgzYzAyMDgwMCwgMHg4YzQyMjNmNCwgMHgxMDQwMDAwNywgMHgyNDAyMDAxNiwgMHgzYzAxMDgwMCwgMHhhNDIyMjNkMiwKKwkweDI0MDIwMDJhLCAweDNjMDEwODAwLCAweDBhMDAwMzY0LCAweGE0MjIyM2Q0LCAweDhkNjcwMDEwLCAweDAwMDcxNDAyLAorCTB4M2MwMTA4MDAsIDB4YTQyMjIzZDIsIDB4M2MwMTA4MDAsIDB4YTQyNzIzZDQsIDB4M2MwNDA4MDAsIDB4OTQ4NDIzZDQsCisJMHgzYzAzMDgwMCwgMHg5NDYzMjNkMiwgMHg5NWNmMDAwNiwgMHgzYzAyMDgwMCwgMHg5NDQyMjNkMCwgMHgwMDgzMjAyMywKKwkweDAxZTJjMDIzLCAweDMwNjVmZmZmLCAweDI0YTIwMDI4LCAweDAxYzI0ODIxLCAweDMwODJmZmZmLCAweDE0YzAwMDFhLAorCTB4MDEyMjYwMjEsIDB4OTU4MjAwMGMsIDB4MzA0MjAwM2YsIDB4M2MwMTA4MDAsIDB4YTQyMjIzZDYsIDB4OTU4MjAwMDQsCisJMHg5NTgzMDAwNiwgMHgzYzAxMDgwMCwgMHhhYzIwMjNlNCwgMHgzYzAxMDgwMCwgMHhhYzIwMjNlOCwgMHgwMDAyMTQwMCwKKwkweDAwNDMxMDI1LCAweDNjMDEwODAwLCAweGFjMjIxYmMwLCAweDk1MjIwMDA0LCAweDNjMDEwODAwLCAweGE0MjIxYmM0LAorCTB4OTUyMzAwMDIsIDB4MDFlNTEwMjMsIDB4MDA0MzEwMmEsIDB4MTA0MDAwMTAsIDB4MjQwMjAwMDEsIDB4M2MwMTA4MDAsCisJMHgwYTAwMDM5OCwgMHhhYzIyMjNmOCwgMHgzYzAzMDgwMCwgMHg4YzYzMjNlOCwgMHgzYzAyMDgwMCwgMHg5NDQyMWJjNCwKKwkweDAwNDMxMDIxLCAweGE1MjIwMDA0LCAweDNjMDIwODAwLCAweDk0NDIxYmMwLCAweGE1ODIwMDA0LCAweDNjMDIwODAwLAorCTB4OGM0MjFiYzAsIDB4YTU4MjAwMDYsIDB4M2MwMjA4MDAsIDB4OGM0MjIzZjAsIDB4M2MwZDA4MDAsIDB4OGRhZDIzZTQsCisJMHgzYzBhMDgwMCwgMHgxNDQwMDBlNSwgMHg4ZDRhMjNlOCwgMHgzYzAyMDgwMCwgMHg5NDQyMWJjNCwgMHgwMDRhMTgyMSwKKwkweDMwNjNmZmZmLCAweDAwNjIxODJiLCAweDI0MDIwMDAyLCAweDEwYzIwMDBkLCAweDAxNDM1MDIzLCAweDNjMDIwODAwLAorCTB4OTQ0MjIzZDYsIDB4MzA0MjAwMDksIDB4MTA0MDAwMDgsIDB4MDAwMDAwMDAsIDB4OTU4MjAwMGMsIDB4MzA0MmZmZjYsCisJMHhhNTgyMDAwYywgMHgzYzAyMDgwMCwgMHg5NDQyMjNkNiwgMHgzMDQyMDAwOSwgMHgwMWEyNjgyMywgMHgzYzAyMDgwMCwKKwkweDhjNDIyM2Y4LCAweDEwNDAwMDRhLCAweDAxMjAzODIxLCAweDNjMDIwODAwLCAweDk0NDIyM2QyLCAweDAwMDA0MDIxLAorCTB4YTUyMDAwMGEsIDB4MDFlMjEwMjMsIDB4YTUyMjAwMDIsIDB4MzA4MmZmZmYsIDB4MDAwMjEwNDIsIDB4MTg0MDAwMDgsCisJMHgwMDAwMzAyMSwgMHgwMDQwMTgyMSwgMHg5NGUyMDAwMCwgMHgyNTA4MDAwMSwgMHgwMGMyMzAyMSwgMHgwMTAzMTAyYSwKKwkweDE0NDBmZmZiLCAweDI0ZTcwMDAyLCAweDAwMDYxYzAyLCAweDMwYzJmZmZmLCAweDAwNjIzMDIxLCAweDAwMDYxNDAyLAorCTB4MDBjMjMwMjEsIDB4MDBjMDI4MjEsIDB4MDAwNjEwMjcsIDB4YTUyMjAwMGEsIDB4MDAwMDMwMjEsIDB4MjUyNzAwMGMsCisJMHgwMDAwNDAyMSwgMHg5NGUyMDAwMCwgMHgyNTA4MDAwMSwgMHgwMGMyMzAyMSwgMHgyZDAyMDAwNCwgMHgxNDQwZmZmYiwKKwkweDI0ZTcwMDAyLCAweDk1MjIwMDAyLCAweDAwMDA0MDIxLCAweDkxMjMwMDA5LCAweDAwNDQyMDIzLCAweDAxODAzODIxLAorCTB4MzA4MmZmZmYsIDB4YTRlMDAwMTAsIDB4MDA2MjE4MjEsIDB4MDAwMjEwNDIsIDB4MTg0MDAwMTAsIDB4MDBjMzMwMjEsCisJMHgwMDQwNDgyMSwgMHg5NGUyMDAwMCwgMHgyNGU3MDAwMiwgMHgwMGMyMzAyMSwgMHgzMGUyMDA3ZiwgMHgxNDQwMDAwNiwKKwkweDI1MDgwMDAxLCAweDhkNjMwMDAwLCAweDNjMDIwMDdmLCAweDM0NDJmZjgwLCAweDAwNjI1ODI0LCAweDI1NjcwMDA4LAorCTB4MDEwOTEwMmEsIDB4MTQ0MGZmZjMsIDB4MDAwMDAwMDAsIDB4MzA4MjAwMDEsIDB4MTA0MDAwMDUsIDB4MDAwNjFjMDIsCisJMHhhMGUwMDAwMSwgMHg5NGUyMDAwMCwgMHgwMGMyMzAyMSwgMHgwMDA2MWMwMiwgMHgzMGMyZmZmZiwgMHgwMDYyMzAyMSwKKwkweDAwMDYxNDAyLCAweDAwYzIzMDIxLCAweDBhMDAwNDdkLCAweDMwYzZmZmZmLCAweDI0MDIwMDAyLCAweDE0YzIwMDgxLAorCTB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsIDB4OGM0MjI0MGMsIDB4MTQ0MDAwMDcsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsCisJMHg5NDQyMjNkMiwgMHg5NTIzMDAwMiwgMHgwMWUyMTAyMywgMHgxMDYyMDA3NywgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwKKwkweDk0NDIyM2QyLCAweDAxZTIxMDIzLCAweGE1MjIwMDAyLCAweDNjMDIwODAwLCAweDhjNDIyNDBjLCAweDEwNDAwMDFhLAorCTB4MzFlM2ZmZmYsIDB4OGRjNzAwMTAsIDB4M2MwMjA4MDAsIDB4OTQ0MjFiOTYsIDB4MDBlMDQwMjEsIDB4MDAwNzJjMDIsCisJMHgwMGFhMjAyMSwgMHgwMDQzMTAyMywgMHgwMDgyMzgyMywgMHgwMDA3MjQwMiwgMHgzMGUyZmZmZiwgMHgwMDgyMzgyMSwKKwkweDAwMDcxMDI3LCAweGE1MjIwMDBhLCAweDMxMDJmZmZmLCAweDNjMDQwODAwLCAweDk0ODQyM2Q0LCAweDAwNDUzMDIzLAorCTB4MDBlMDI4MjEsIDB4MDA2NDE4MjMsIDB4MDA2ZDE4MjEsIDB4MDBjMzMwMjEsIDB4MDAwNjFjMDIsIDB4MzBjMmZmZmYsCisJMHgwYTAwMDQ3ZCwgMHgwMDYyMzAyMSwgMHgwMTIwMzgyMSwgMHgwMDAwNDAyMSwgMHgzMDgyZmZmZiwgMHgwMDAyMTA0MiwKKwkweDE4NDAwMDA4LCAweDAwMDAzMDIxLCAweDAwNDAxODIxLCAweDk0ZTIwMDAwLCAweDI1MDgwMDAxLCAweDAwYzIzMDIxLAorCTB4MDEwMzEwMmEsIDB4MTQ0MGZmZmIsIDB4MjRlNzAwMDIsIDB4MDAwNjFjMDIsIDB4MzBjMmZmZmYsIDB4MDA2MjMwMjEsCisJMHgwMDA2MTQwMiwgMHgwMGMyMzAyMSwgMHgwMGMwMjgyMSwgMHgwMDA2MTAyNywgMHhhNTIyMDAwYSwgMHgwMDAwMzAyMSwKKwkweDI1MjcwMDBjLCAweDAwMDA0MDIxLCAweDk0ZTIwMDAwLCAweDI1MDgwMDAxLCAweDAwYzIzMDIxLCAweDJkMDIwMDA0LAorCTB4MTQ0MGZmZmIsIDB4MjRlNzAwMDIsIDB4OTUyMjAwMDIsIDB4MDAwMDQwMjEsIDB4OTEyMzAwMDksIDB4MDA0NDIwMjMsCisJMHgwMTgwMzgyMSwgMHgzMDgyZmZmZiwgMHhhNGUwMDAxMCwgMHgzYzA0MDgwMCwgMHg5NDg0MjNkNCwgMHgwMDYyMTgyMSwKKwkweDAwYzMzMDIxLCAweDAwMDYxYzAyLCAweDMwYzJmZmZmLCAweDAwNjIzMDIxLCAweDAwMDYxYzAyLCAweDNjMDIwODAwLAorCTB4OTQ0MjIzZDAsIDB4MDBjMzQ4MjEsIDB4MDA0NDEwMjMsIDB4MDAwMjFmYzIsIDB4MDA0MzEwMjEsIDB4MDAwMjEwNDMsCisJMHgxODQwMDAxMCwgMHgwMDAwMzAyMSwgMHgwMDQwMjAyMSwgMHg5NGUyMDAwMCwgMHgyNGU3MDAwMiwgMHgwMGMyMzAyMSwKKwkweDMwZTIwMDdmLCAweDE0NDAwMDA2LCAweDI1MDgwMDAxLCAweDhkNjMwMDAwLCAweDNjMDIwMDdmLCAweDM0NDJmZjgwLAorCTB4MDA2MjU4MjQsIDB4MjU2NzAwMDgsIDB4MDEwNDEwMmEsIDB4MTQ0MGZmZjMsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsCisJMHg5NDQyMjNlYywgMHgwMGMyMzAyMSwgMHgzMTIyZmZmZiwgMHgwMGMyMzAyMSwgMHgwMDA2MWMwMiwgMHgzMGMyZmZmZiwKKwkweDAwNjIzMDIxLCAweDAwMDYxNDAyLCAweDAwYzIzMDIxLCAweDAwYzA0MDIxLCAweDAwMDYxMDI3LCAweGE1ODIwMDEwLAorCTB4YWRjMDAwMTQsIDB4MGEwMDA0OWQsIDB4YWRjMDAwMDAsIDB4OGRjNzAwMTAsIDB4MDBlMDQwMjEsIDB4MTE0MDAwMDcsCisJMHgwMDA3MmMwMiwgMHgwMGFhMzAyMSwgMHgwMDA2MTQwMiwgMHgzMGMzZmZmZiwgMHgwMDQzMzAyMSwgMHgwMDA2MTQwMiwKKwkweDAwYzIyODIxLCAweDAwMDUxMDI3LCAweGE1MjIwMDBhLCAweDNjMDMwODAwLCAweDk0NjMyM2Q0LCAweDMxMDJmZmZmLAorCTB4MDFlMjEwMjEsIDB4MDA0MzMwMjMsIDB4MDBjZDMwMjEsIDB4MDAwNjFjMDIsIDB4MzBjMmZmZmYsIDB4MDA2MjMwMjEsCisJMHgwMDA2MTQwMiwgMHgwMGMyMzAyMSwgMHgwMGMwNDAyMSwgMHgwMDA2MTAyNywgMHhhNTgyMDAxMCwgMHgzMTAyZmZmZiwKKwkweDAwMDUxYzAwLCAweDAwNDMxMDI1LCAweGFkYzIwMDEwLCAweDNjMDIwODAwLCAweDhjNDIyM2Y0LCAweDEwNDAwMDA1LAorCTB4MmRlMjA1ZWIsIDB4MTQ0MDAwMDIsIDB4MjVlMmZmZjIsIDB4MzQwMjg4NzAsIDB4YTVjMjAwMzQsIDB4M2MwMzA4MDAsCisJMHgyNDYzMjNlOCwgMHg4YzYyMDAwMCwgMHgyNDQyMDAwMSwgMHhhYzYyMDAwMCwgMHgzYzA0MDgwMCwgMHg4Yzg0MjNlNCwKKwkweDNjMDIwODAwLCAweDhjNDIxYmMwLCAweDMzMDNmZmZmLCAweDAwODMyMDIxLCAweDAwNDMxODIxLCAweDAwNjIxMDJiLAorCTB4M2MwMTA4MDAsIDB4YWMyNDIzZTQsIDB4MTA0MDAwMDMsIDB4MjQ4MmZmZmYsIDB4M2MwMTA4MDAsIDB4YWMyMjIzZTQsCisJMHgzYzAxMDgwMCwgMHhhYzIzMWJjMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyN2JkZmZiOCwgMHgzYzA1MDgwMCwKKwkweDI0YTUxYjk2LCAweGFmYmYwMDQ0LCAweGFmYmUwMDQwLCAweGFmYjcwMDNjLCAweGFmYjYwMDM4LCAweGFmYjUwMDM0LAorCTB4YWZiNDAwMzAsIDB4YWZiMzAwMmMsIDB4YWZiMjAwMjgsIDB4YWZiMTAwMjQsIDB4YWZiMDAwMjAsIDB4OTRhOTAwMDAsCisJMHgzYzAyMDgwMCwgMHg5NDQyMjNkMCwgMHgzYzAzMDgwMCwgMHg4YzYzMWJiMCwgMHgzYzA0MDgwMCwgMHg4Yzg0MWJhYywKKwkweDAxMjIxMDIzLCAweDAwNjQxODJhLCAweGE3YTkwMDFlLCAweDEwNjAwMGJlLCAweGE3YTIwMDE2LCAweDI0YmUwMDIyLAorCTB4OTdiNjAwMWUsIDB4MjRiMzAwMWEsIDB4MjRiNzAwMTYsIDB4OGZjMjAwMDAsIDB4MTQ0MDAwMDgsIDB4MDAwMDAwMDAsCisJMHg4ZmMyZmZmOCwgMHg5N2EzMDAxNiwgMHg4ZmM0ZmZmNCwgMHgwMDQzMTAyMSwgMHgwMDgyMjAyYSwgMHgxNDgwMDBiMCwKKwkweDAwMDAwMDAwLCAweDk3ZDUwODE4LCAweDMyYTJmZmZmLCAweDEwNDAwMGEzLCAweDAwMDA5MDIxLCAweDAwNDBhMDIxLAorCTB4MDAwMDg4MjEsIDB4MGUwMDA2MjUsIDB4MDAwMDAwMDAsIDB4MDA0MDMwMjEsIDB4MTRjMDAwMDcsIDB4MDAwMDAwMDAsCisJMHgzYzAyMDgwMCwgMHg4YzQyMjNkYywgMHgyNDQyMDAwMSwgMHgzYzAxMDgwMCwgMHgwYTAwMDU5NiwgMHhhYzIyMjNkYywKKwkweDNjMTAwODAwLCAweDAyMTE4MDIxLCAweDhlMTAxYmM4LCAweDk2MDgwMDBhLCAweDMxMDIwMDQwLCAweDEwNDAwMDA1LAorCTB4MjQwNzE4MGMsIDB4OGUwMjAwMGMsIDB4MjQwNzE4OGMsIDB4MDAwMjE0MDAsIDB4YWNjMjAwMTgsIDB4MzEwMjAwODAsCisJMHg1NDQwMDAwMSwgMHgzNGU3MDAxMCwgMHgzYzAyMDgwMCwgMHgwMDUxMTAyMSwgMHg4YzQyMWJkMCwgMHgzYzAzMDgwMCwKKwkweDAwNzExODIxLCAweDhjNjMxYmQ0LCAweDAwMDIxNTAwLCAweDAwMDMxYzAwLCAweDAwNDMxMDI1LCAweGFjYzIwMDE0LAorCTB4OTYwNDAwMDgsIDB4MzI0MmZmZmYsIDB4MDA4MjEwMjEsIDB4MDI4MjEwMmEsIDB4MTQ0MDAwMDIsIDB4MDJiMjI4MjMsCisJMHgwMDgwMjgyMSwgMHg4ZTAyMDAwMCwgMHgwMjQ1OTAyMSwgMHhhY2MyMDAwMCwgMHg4ZTAyMDAwNCwgMHgwMGMwMjAyMSwKKwkweDI2MzEwMDEwLCAweGFjODIwMDA0LCAweDMwZTJmZmZmLCAweGFjODAwMDA4LCAweGE0ODUwMDBlLCAweGFjODIwMDEwLAorCTB4MjQwMjAzMDUsIDB4MGUwMDA1YTIsIDB4YTQ4MjAwMGMsIDB4MzI0MmZmZmYsIDB4MDA1NDEwMmIsIDB4MTQ0MGZmYzUsCisJMHgzMjQyZmZmZiwgMHgwYTAwMDU4ZSwgMHgwMDAwMDAwMCwgMHg4ZTYyMDAwMCwgMHg4ZTYzZmZmYywgMHgwMDQzMTAyYSwKKwkweDEwNDAwMDY3LCAweDAwMDAwMDAwLCAweDhlNjJmZmYwLCAweDAwMDI4OTAwLCAweDNjMTAwODAwLCAweDAyMTE4MDIxLAorCTB4MGUwMDA2MjUsIDB4OGUxMDFiYzgsIDB4MDA0MDMwMjEsIDB4MTRjMDAwMDUsIDB4MDAwMDAwMDAsIDB4OGU2MjA4MmMsCisJMHgyNDQyMDAwMSwgMHgwYTAwMDU5NiwgMHhhZTYyMDgyYywgMHg5NjA4MDAwYSwgMHgzMTAyMDA0MCwgMHgxMDQwMDAwNSwKKwkweDI0MDcxODBjLCAweDhlMDIwMDBjLCAweDI0MDcxODhjLCAweDAwMDIxNDAwLCAweGFjYzIwMDE4LCAweDNjMDIwODAwLAorCTB4MDA1MTEwMjEsIDB4OGM0MjFiZDAsIDB4M2MwMzA4MDAsIDB4MDA3MTE4MjEsIDB4OGM2MzFiZDQsIDB4MDAwMjE1MDAsCisJMHgwMDAzMWMwMCwgMHgwMDQzMTAyNSwgMHhhY2MyMDAxNCwgMHg4ZTYzZmZmNCwgMHg5NjAyMDAwOCwgMHgwMDQzMjAyMywKKwkweDMyNDJmZmZmLCAweDMwODNmZmZmLCAweDAwNDMxMDIxLCAweDAyYzIxMDJhLCAweDEwNDAwMDAzLCAweDAwODAyODIxLAorCTB4OTdhOTAwMWUsIDB4MDEzMjI4MjMsIDB4OGU2MjAwMDAsIDB4MzBhNGZmZmYsIDB4MDA0NDEwMjEsIDB4YWU2MjAwMDAsCisJMHhhNGM1MDAwZSwgMHg4ZTAyMDAwMCwgMHhhY2MyMDAwMCwgMHg4ZTAyMDAwNCwgMHg4ZTYzZmZmNCwgMHgwMDQzMTAyMSwKKwkweGFjYzIwMDA0LCAweDhlNjNmZmY0LCAweDk2MDIwMDA4LCAweDAwNjQxODIxLCAweDAwNjIxMDJhLCAweDE0NDAwMDA2LAorCTB4MDI0NTkwMjEsIDB4OGU2MmZmZjAsIDB4YWU2MGZmZjQsIDB4MjQ0MjAwMDEsIDB4MGEwMDA1NzEsIDB4YWU2MmZmZjAsCisJMHhhZTYzZmZmNCwgMHhhY2MwMDAwOCwgMHgzMjQyZmZmZiwgMHgxMDU2MDAwMywgMHgzMTAyMDAwNCwgMHgxMDQwMDAwNiwKKwkweDI0MDIwMzA1LCAweDMxMDIwMDgwLCAweDU0NDAwMDAxLCAweDM0ZTcwMDEwLCAweDM0ZTcwMDIwLCAweDI0MDIwOTA1LAorCTB4YTRjMjAwMGMsIDB4OGVlMzAwMDAsIDB4OGVlMjAwMDQsIDB4MTQ2MjAwMDcsIDB4M2MwMmI0OWEsIDB4OGVlMjA4NjAsCisJMHg1NDQwMDAwMSwgMHgzNGU3MDQwMCwgMHgzYzAyNGI2NSwgMHgwYTAwMDU4OCwgMHgzNDQyNzY1NCwgMHgzNDQyODlhYiwKKwkweGFjYzIwMDFjLCAweDMwZTJmZmZmLCAweGFjYzIwMDEwLCAweDBlMDAwNWEyLCAweDAwYzAyMDIxLCAweDMyNDJmZmZmLAorCTB4MDA1NjEwMmIsIDB4MTQ0MGZmOWIsIDB4MDAwMDAwMDAsIDB4OGU2MjAwMDAsIDB4OGU2M2ZmZmMsIDB4MDA0MzEwMmEsCisJMHgxNDQwZmY0OCwgMHgwMDAwMDAwMCwgMHg4ZmJmMDA0NCwgMHg4ZmJlMDA0MCwgMHg4ZmI3MDAzYywgMHg4ZmI2MDAzOCwKKwkweDhmYjUwMDM0LCAweDhmYjQwMDMwLCAweDhmYjMwMDJjLCAweDhmYjIwMDI4LCAweDhmYjEwMDI0LCAweDhmYjAwMDIwLAorCTB4MDNlMDAwMDgsIDB4MjdiZDAwNDgsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTQsIDB4YWZiMDAwMTAsIDB4OGY2MjQ0NTAsCisJMHg4ZjYzNDQxMCwgMHgwYTAwMDViMSwgMHgwMDgwODAyMSwgMHg4ZjYyNjgyMCwgMHgzMDQyMjAwMCwgMHgxMDQwMDAwMywKKwkweDAwMDAwMDAwLCAweDBlMDAwMWYwLCAweDAwMDAyMDIxLCAweDhmNjI0NDUwLCAweDhmNjM0NDEwLCAweDMwNDJmZmZmLAorCTB4MDA0MzEwMmIsIDB4MTQ0MGZmZjUsIDB4MDAwMDAwMDAsIDB4OGY2MzBjMTQsIDB4MzA2MzAwMGYsIDB4MmM2MjAwMDIsCisJMHgxNDQwMDAwYiwgMHgwMDAwMDAwMCwgMHg4ZjYzMGMxNCwgMHgzYzAyMDgwMCwgMHg4YzQyMWI0MCwgMHgzMDYzMDAwZiwKKwkweDI0NDIwMDAxLCAweDNjMDEwODAwLCAweGFjMjIxYjQwLCAweDJjNjIwMDAyLCAweDEwNDBmZmY3LCAweDAwMDAwMDAwLAorCTB4YWY3MDVjMTgsIDB4OGY2MjVjMTAsIDB4MzA0MjAwMDIsIDB4MTA0MDAwMDksIDB4MDAwMDAwMDAsIDB4OGY2MjY4MjAsCisJMHgzMDQyMjAwMCwgMHgxMDQwZmZmOCwgMHgwMDAwMDAwMCwgMHgwZTAwMDFmMCwgMHgwMDAwMjAyMSwgMHgwYTAwMDVjNCwKKwkweDAwMDAwMDAwLCAweDhmYmYwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTgsIDB4M2MxYmMwMDAsIDB4YWZiZjAwMTQsIDB4YWZiMDAwMTAsCisJMHhhZjYwNjgwYywgMHg4ZjYyNjgwNCwgMHgzNDQyMDA4MiwgMHhhZjYyNjgwNCwgMHg4ZjYzNDAwMCwgMHgyNDAyMGI1MCwKKwkweDNjMDEwODAwLCAweGFjMjIxYjU0LCAweDI0MDIwYjc4LCAweDNjMDEwODAwLCAweGFjMjIxYjY0LCAweDM0NjMwMDAyLAorCTB4YWY2MzQwMDAsIDB4MGUwMDA2MDUsIDB4MDA4MDgwMjEsIDB4M2MwMTA4MDAsIDB4YTAyMjFiNjgsIDB4MzA0MjAwZmYsCisJMHgyNDAzMDAwMiwgMHgxNDQzMDAwNSwgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwgMHg4YzQyMWI1NCwgMHgwYTAwMDVmOCwKKwkweGFjNTAwMGMwLCAweDNjMDIwODAwLCAweDhjNDIxYjU0LCAweGFjNTAwMGJjLCAweDhmNjI0NDM0LCAweDhmNjM0NDM4LAorCTB4OGY2NDQ0MTAsIDB4M2MwMTA4MDAsIDB4YWMyMjFiNWMsIDB4M2MwMTA4MDAsIDB4YWMyMzFiNmMsIDB4M2MwMTA4MDAsCisJMHhhYzI0MWI1OCwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwgMHgzYzA0MDgwMCwKKwkweDhjODcwMDAwLCAweDNjMDNhYTU1LCAweDM0NjNhYTU1LCAweDNjMDZjMDAzLCAweGFjODMwMDAwLCAweDhjYzIwMDAwLAorCTB4MTQ0MzAwMDcsIDB4MjQwNTAwMDIsIDB4M2MwMzU1YWEsIDB4MzQ2MzU1YWEsIDB4YWM4MzAwMDAsIDB4OGNjMjAwMDAsCisJMHg1MDQzMDAwMSwgMHgyNDA1MDAwMSwgMHgzYzAyMDgwMCwgMHhhYzQ3MDAwMCwgMHgwM2UwMDAwOCwgMHgwMGEwMTAyMSwKKwkweDI3YmRmZmY4LCAweDE4ODAwMDA5LCAweDAwMDAyODIxLCAweDhmNjM2ODBjLCAweDhmNjI2ODBjLCAweDEwNDNmZmZlLAorCTB4MDAwMDAwMDAsIDB4MjRhNTAwMDEsIDB4MDBhNDEwMmEsIDB4MTQ0MGZmZjksIDB4MDAwMDAwMDAsIDB4MDNlMDAwMDgsCisJMHgyN2JkMDAwOCwgMHg4ZjYzNDQ1MCwgMHgzYzAyMDgwMCwgMHg4YzQyMWI1YywgMHgwMDAzMWMwMiwgMHgwMDQzMTAyYiwKKwkweDE0NDAwMDA4LCAweDNjMDM4MDAwLCAweDNjMDQwODAwLCAweDhjODQxYjZjLCAweDhmNjI0NDUwLCAweDAwMDIxYzAyLAorCTB4MDA4MzEwMmIsIDB4MTA0MGZmZmMsIDB4M2MwMzgwMDAsIDB4YWY2MzQ0NDQsIDB4OGY2MjQ0NDQsIDB4MDA0MzEwMjQsCisJMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg4ZjYyNDQ0OCwgMHgwM2UwMDAwOCwgMHgzMDQyZmZmZiwgMHgzMDgyZmZmZiwKKwkweDI0NDJlMDAwLCAweDJjNDIyMDAxLCAweDE0NDAwMDAzLCAweDNjMDI0MDAwLCAweDBhMDAwNjQ4LCAweDI0MDJmZmZmLAorCTB4MDA4MjIwMjUsIDB4YWY2NDVjMzgsIDB4OGY2MjVjMzAsIDB4MzA0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MDAwMDEwMjEsCisJMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHg4ZjYyNDQ1MCwgMHgzYzAzMDgwMCwgMHg4YzYzMWI1OCwgMHgwYTAwMDY1MSwKKwkweDMwNDJmZmZmLCAweDhmNjI0NDUwLCAweDMwNDJmZmZmLCAweDAwNDMxMDJiLCAweDE0NDBmZmZjLCAweDAwMDAwMDAwLAorCTB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4MDA4MDI4MjEsIDB4M2MwNDA4MDAsIDB4MjQ4NDFhZjAsCisJMHgwMDAwMzAyMSwgMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDY3YywgMHhhZmEwMDAxNCwKKwkweDBhMDAwNjYwLCAweDAwMDAwMDAwLCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsIDB4MzQ0MjMwMDAsIDB4M2MwMzA4MDAsIDB4MzQ2MzMwMDAsCisJMHgzYzA0MDgwMCwgMHgzNDg0MzdmZiwgMHgzYzAxMDgwMCwgMHhhYzIyMWI3NCwgMHgyNDAyMDA0MCwgMHgzYzAxMDgwMCwKKwkweGFjMjIxYjc4LCAweDNjMDEwODAwLCAweGFjMjAxYjcwLCAweGFjNjAwMDAwLCAweDI0NjMwMDA0LCAweDAwODMxMDJiLAorCTB4NTA0MGZmZmQsIDB4YWM2MDAwMDAsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4MDA4MDQ4MjEsIDB4OGZhYTAwMTAsCisJMHgzYzAyMDgwMCwgMHg4YzQyMWI3MCwgMHgzYzA0MDgwMCwgMHg4Yzg0MWI3OCwgMHg4ZmFiMDAxNCwgMHgyNDQzMDAwMSwKKwkweDAwNDQxMDJiLCAweDNjMDEwODAwLCAweGFjMjMxYjcwLCAweDE0NDAwMDAzLCAweDAwMDA0MDIxLCAweDNjMDEwODAwLAorCTB4YWMyMDFiNzAsIDB4M2MwMjA4MDAsIDB4OGM0MjFiNzAsIDB4M2MwMzA4MDAsIDB4OGM2MzFiNzQsIDB4OTEyNDAwMDAsCisJMHgwMDAyMTE0MCwgMHgwMDQzMTAyMSwgMHgwMDQ4MTAyMSwgMHgyNTA4MDAwMSwgMHhhMDQ0MDAwMCwgMHgyOTAyMDAwOCwKKwkweDE0NDBmZmY0LCAweDI1MjkwMDAxLCAweDNjMDIwODAwLCAweDhjNDIxYjcwLCAweDNjMDMwODAwLCAweDhjNjMxYjc0LAorCTB4OGY2NDY4MGMsIDB4MDAwMjExNDAsIDB4MDA0MzEwMjEsIDB4YWM0NDAwMDgsIDB4YWM0NTAwMGMsIDB4YWM0NjAwMTAsCisJMHhhYzQ3MDAxNCwgMHhhYzRhMDAxOCwgMHgwM2UwMDAwOCwgMHhhYzRiMDAxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKK307CisKK3N0YXRpYyB1MzIgdGczVHNvRndSb2RhdGFbXSA9IHsKKwkweDRkNjE2OTZlLCAweDQzNzA3NTQyLCAweDAwMDAwMDAwLCAweDRkNjE2OTZlLCAweDQzNzA3NTQxLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NzM3NDZiNmYsIDB4NjY2NjZjNjQsIDB4NDk2ZTAwMDAsIDB4NzM3NDZiNmYsCisJMHg2NjY2MmEyYSwgMHgwMDAwMDAwMCwgMHg1Mzc3NDU3NiwgMHg2NTZlNzQzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDY2NjE3NDYxLCAweDZjNDU3MjcyLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCit9OworCitzdGF0aWMgdTMyIHRnM1Rzb0Z3RGF0YVtdID0geworCTB4MDAwMDAwMDAsIDB4NzM3NDZiNmYsIDB4NjY2NjZjNjQsIDB4NWY3NjMxMmUsIDB4MzYyZTMwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorfTsKKworLyogNTcwNSBuZWVkcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgVFNPIGZpcm13YXJlLiAgKi8KKyNkZWZpbmUgVEczX1RTTzVfRldfUkVMRUFTRV9NQUpPUgkweDEKKyNkZWZpbmUgVEczX1RTTzVfRldfUkVMQVNFX01JTk9SCTB4MgorI2RlZmluZSBURzNfVFNPNV9GV19SRUxFQVNFX0ZJWAkJMHgwCisjZGVmaW5lIFRHM19UU081X0ZXX1NUQVJUX0FERFIJCTB4MDAwMTAwMDAKKyNkZWZpbmUgVEczX1RTTzVfRldfVEVYVF9BRERSCQkweDAwMDEwMDAwCisjZGVmaW5lIFRHM19UU081X0ZXX1RFWFRfTEVOCQkweGU5MAorI2RlZmluZSBURzNfVFNPNV9GV19ST0RBVEFfQUREUgkJMHgwMDAxMGU5MAorI2RlZmluZSBURzNfVFNPNV9GV19ST0RBVEFfTEVOCQkweDUwCisjZGVmaW5lIFRHM19UU081X0ZXX0RBVEFfQUREUgkJMHgwMDAxMGYwMAorI2RlZmluZSBURzNfVFNPNV9GV19EQVRBX0xFTgkJMHgyMAorI2RlZmluZSBURzNfVFNPNV9GV19TQlNTX0FERFIJCTB4MDAwMTBmMjAKKyNkZWZpbmUgVEczX1RTTzVfRldfU0JTU19MRU4JCTB4MjgKKyNkZWZpbmUgVEczX1RTTzVfRldfQlNTX0FERFIJCTB4MDAwMTBmNTAKKyNkZWZpbmUgVEczX1RTTzVfRldfQlNTX0xFTgkJMHg4OAorCitzdGF0aWMgdTMyIHRnM1RzbzVGd1RleHRbKFRHM19UU081X0ZXX1RFWFRfTEVOIC8gNCkgKyAxXSA9IHsKKwkweDBjMDA0MDAzLCAweDAwMDAwMDAwLCAweDAwMDEwZjA0LCAweDAwMDAwMDAwLCAweDEwMDAwMDAzLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMGQsIDB4MDAwMDAwMGQsIDB4M2MxZDAwMDEsIDB4MzdiZGUwMDAsIDB4MDNhMGYwMjEsIDB4M2MxMDAwMDEsCisJMHgyNjEwMDAwMCwgMHgwYzAwNDAxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgyN2JkZmZlMCwgMHgzYzA0ZmVmZSwKKwkweGFmYmYwMDE4LCAweDBjMDA0MmU4LCAweDM0ODQwMDAyLCAweDBjMDA0MzY0LCAweDAwMDAwMDAwLCAweDNjMDMwMDAxLAorCTB4OTA2MzBmMzQsIDB4MjQwMjAwMDIsIDB4M2MwNDAwMDEsIDB4MjQ4NDBlOWMsIDB4MTQ2MjAwMDMsIDB4MjQwNTAwMDEsCisJMHgzYzA0MDAwMSwgMHgyNDg0MGU5MCwgMHgyNDA2MDAwMiwgMHgwMDAwMzgyMSwgMHhhZmEwMDAxMCwgMHgwYzAwNDM3OCwKKwkweGFmYTAwMDE0LCAweDBjMDA0MDJjLCAweDAwMDAwMDAwLCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMWMsIDB4YWZiMjAwMTgsIDB4YWZiMTAwMTQsCisJMHgwYzAwNDJkNCwgMHhhZmIwMDAxMCwgMHgzYzEyODAwMCwgMHgyNDExMDAwMSwgMHg4ZjcwNjgxMCwgMHgzMjAyMDQwMCwKKwkweDEwNDAwMDA3LCAweDAwMDAwMDAwLCAweDhmNjQxMDA4LCAweDAwOTIxMDI0LCAweDE0NDAwMDAzLCAweDAwMDAwMDAwLAorCTB4MGMwMDQwNjQsIDB4MDAwMDAwMDAsIDB4M2MwMjAwMDEsIDB4OTA0MjBmNTYsIDB4MTA1MTAwMDMsIDB4MzIwMjAyMDAsCisJMHgxMDQwZmZmMSwgMHgwMDAwMDAwMCwgMHgwYzAwNDFiNCwgMHgwMDAwMDAwMCwgMHgwODAwNDAzNCwgMHgwMDAwMDAwMCwKKwkweDhmYmYwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLAorCTB4MjdiZGZmZTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDBlYjAsIDB4MDAwMDI4MjEsIDB4MDAwMDMwMjEsIDB4MDAwMDM4MjEsCisJMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwYzAwNDM3OCwgMHhhZmEwMDAxNCwgMHgwMDAwZDAyMSwgMHgyNDAyMDEzMCwKKwkweGFmNjI1MDAwLCAweDNjMDEwMDAxLCAweGE0MjAwZjUwLCAweDNjMDEwMDAxLCAweGEwMjAwZjU3LCAweDhmYmYwMDE4LAorCTB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2MwMzAwMDEsIDB4MjQ2MzBmNjAsCisJMHg5MDYyMDAwMCwgMHgyN2JkZmZmMCwgMHgxNDQwMDAwMywgMHgwMDgwYzAyMSwgMHgwODAwNDA3MywgMHgwMDAwNDgyMSwKKwkweDNjMDIyMDAwLCAweDAzMDIxMDI0LCAweDEwNDAwMDAzLCAweDI0MDkwMDAyLCAweDA4MDA0MDczLCAweGEwNjAwMDAwLAorCTB4MjQwOTAwMDEsIDB4MDAxODEwNDAsIDB4MzA0MzFmODAsIDB4MzQ2ZjgwMDgsIDB4MTUyMDAwNGIsIDB4MjVlYjAwMjgsCisJMHgzYzA0MDAwMSwgMHgwMDgzMjAyMSwgMHg4Yzg0ODAxMCwgMHgzYzA1MDAwMSwgMHgyNGE1MGY3YSwgMHgwMDA0MTQwMiwKKwkweGEwYTIwMDAwLCAweDNjMDEwMDAxLCAweGEwMjQwZjdiLCAweDNjMDIwMDAxLCAweDAwNDMxMDIxLCAweDk0NDI4MDE0LAorCTB4M2MwMTAwMDEsIDB4YTAyMjBmN2MsIDB4M2MwYzAwMDEsIDB4MDE4MzYwMjEsIDB4OGQ4YzgwMTgsIDB4MzA0MjAwZmYsCisJMHgyNDQyMDAwOCwgMHgwMDAyMjBjMywgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhMDIyMGY2MCwgMHgwMTI0MTAyYiwKKwkweDEwNDAwMDBjLCAweDAwMDAzODIxLCAweDI0YTYwMDBlLCAweDAxNjAyODIxLCAweDhjYTIwMDAwLCAweDhjYTMwMDA0LAorCTB4MjRhNTAwMDgsIDB4MjRlNzAwMDEsIDB4YWNjMjAwMDAsIDB4YWNjMzAwMDQsIDB4MDBlNDEwMmIsIDB4MTQ0MGZmZjgsCisJMHgyNGM2MDAwOCwgMHgwMDAwMzgyMSwgMHgzYzA4MDAwMSwgMHgyNTA4MGY3YiwgMHg5MTA2MDAwMCwgMHgzYzAyMDAwMSwKKwkweDkwNDIwZjdjLCAweDI1MDMwMDBkLCAweDAwYzMyODIxLCAweDAwNDYxMDIzLCAweDAwMDIxZmMyLCAweDAwNDMxMDIxLAorCTB4MDAwMjEwNDMsIDB4MTg0MDAwMGMsIDB4MDAwMDIwMjEsIDB4OTEwMjAwMDEsIDB4MDA0NjEwMjMsIDB4MDAwMjFmYzIsCisJMHgwMDQzMTAyMSwgMHgwMDAyMTg0MywgMHg5NGEyMDAwMCwgMHgyNGU3MDAwMSwgMHgwMDgyMjAyMSwgMHgwMGUzMTAyYSwKKwkweDE0NDBmZmZiLCAweDI0YTUwMDAyLCAweDAwMDQxYzAyLCAweDMwODJmZmZmLCAweDAwNjIyMDIxLCAweDAwMDQxNDAyLAorCTB4MDA4MjIwMjEsIDB4M2MwMmZmZmYsIDB4MDE4MjEwMjQsIDB4MzA4M2ZmZmYsIDB4MDA0MzEwMjUsIDB4M2MwMTAwMDEsCisJMHgwODAwNDBmYSwgMHhhYzIyMGY4MCwgMHgzYzA1MDAwMSwgMHgyNGE1MGY3YywgMHg5MGEyMDAwMCwgMHgzYzBjMDAwMSwKKwkweDAxODM2MDIxLCAweDhkOGM4MDE4LCAweDAwMDIyMGMyLCAweDEwODAwMDBlLCAweDAwMDAzODIxLCAweDAxNjAzMDIxLAorCTB4MjRhNTAwMGMsIDB4OGNhMjAwMDAsIDB4OGNhMzAwMDQsIDB4MjRhNTAwMDgsIDB4MjRlNzAwMDEsIDB4YWNjMjAwMDAsCisJMHhhY2MzMDAwNCwgMHgwMGU0MTAyYiwgMHgxNDQwZmZmOCwgMHgyNGM2MDAwOCwgMHgzYzA1MDAwMSwgMHgyNGE1MGY3YywKKwkweDkwYTIwMDAwLCAweDMwNDMwMDA3LCAweDI0MDIwMDA0LCAweDEwNjIwMDExLCAweDI4NjIwMDA1LCAweDEwNDAwMDA1LAorCTB4MjQwMjAwMDIsIDB4MTA2MjAwMDgsIDB4MDAwNzEwYzAsIDB4MDgwMDQwZmEsIDB4MDAwMDAwMDAsIDB4MjQwMjAwMDYsCisJMHgxMDYyMDAwZSwgMHgwMDA3MTBjMCwgMHgwODAwNDBmYSwgMHgwMDAwMDAwMCwgMHgwMGEyMTgyMSwgMHg5NDYzMDAwYywKKwkweDAwNGIxMDIxLCAweDA4MDA0MGZhLCAweGE0NDMwMDAwLCAweDAwMDcxMGMwLCAweDAwYTIxODIxLCAweDhjNjMwMDBjLAorCTB4MDA0YjEwMjEsIDB4MDgwMDQwZmEsIDB4YWM0MzAwMDAsIDB4MDBhMjE4MjEsIDB4OGM2MzAwMGMsIDB4MDA0YjIwMjEsCisJMHgwMGEyMTAyMSwgMHhhYzgzMDAwMCwgMHg5NDQyMDAxMCwgMHhhNDgyMDAwNCwgMHg5NWU3MDAwNiwgMHgzYzAyMDAwMSwKKwkweDkwNDIwZjdjLCAweDNjMDMwMDAxLCAweDkwNjMwZjdhLCAweDAwZTJjODIzLCAweDNjMDIwMDAxLCAweDkwNDIwZjdiLAorCTB4MjQ2MzAwMjgsIDB4MDFlMzQwMjEsIDB4MjQ0MjAwMjgsIDB4MTUyMDAwMTIsIDB4MDFlMjMwMjEsIDB4OTRjMjAwMGMsCisJMHgzYzAxMDAwMSwgMHhhNDIyMGY3OCwgMHg5NGMyMDAwNCwgMHg5NGMzMDAwNiwgMHgzYzAxMDAwMSwgMHhhNDIwMGY3NiwKKwkweDNjMDEwMDAxLCAweGE0MjAwZjcyLCAweDAwMDIxNDAwLCAweDAwNDMxMDI1LCAweDNjMDEwMDAxLCAweGFjMjIwZjZjLAorCTB4OTUwMjAwMDQsIDB4M2MwMTAwMDEsIDB4MDgwMDQxMjQsIDB4YTQyMjBmNzAsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNzAsCisJMHgzYzAzMDAwMSwgMHg5NDYzMGY3MiwgMHgwMDQzMTAyMSwgMHhhNTAyMDAwNCwgMHgzYzAyMDAwMSwgMHg5NDQyMGY2YywKKwkweGE0YzIwMDA0LCAweDNjMDIwMDAxLCAweDhjNDIwZjZjLCAweGE0YzIwMDA2LCAweDNjMDQwMDAxLCAweDk0ODQwZjcyLAorCTB4M2MwMjAwMDEsIDB4OTQ0MjBmNzAsIDB4M2MwYTAwMDEsIDB4OTU0YTBmNzYsIDB4MDA0NDE4MjEsIDB4MzA2M2ZmZmYsCisJMHgwMDYyMTgyYSwgMHgyNDAyMDAwMiwgMHgxMTIyMDAwYiwgMHgwMDgzMjAyMywgMHgzYzAzMDAwMSwgMHg5NDYzMGY3OCwKKwkweDMwNjIwMDA5LCAweDEwNDAwMDA2LCAweDMwNjJmZmY2LCAweGE0YzIwMDBjLCAweDNjMDIwMDAxLCAweDk0NDIwZjc4LAorCTB4MzA0MjAwMDksIDB4MDE0MjUwMjMsIDB4MjQwMjAwMDEsIDB4MTEyMjAwMWIsIDB4MjkyMjAwMDIsIDB4NTA0MDAwMDUsCisJMHgyNDAyMDAwMiwgMHgxMTIwMDAwNywgMHgzMWEyZmZmZiwgMHgwODAwNDE5NywgMHgwMDAwMDAwMCwgMHgxMTIyMDAxZCwKKwkweDI0MDIwMDE2LCAweDA4MDA0MTk3LCAweDMxYTJmZmZmLCAweDNjMGUwMDAxLCAweDk1Y2UwZjgwLCAweDEwODAwMDA1LAorCTB4MDE4MDY4MjEsIDB4MDFjNDIwMjEsIDB4MDAwNDFjMDIsIDB4MzA4MmZmZmYsIDB4MDA2MjcwMjEsIDB4MDAwZTEwMjcsCisJMHhhNTAyMDAwYSwgMHgzYzAzMDAwMSwgMHg5MDYzMGY3YiwgMHgzMWEyZmZmZiwgMHgwMGUyMTAyMSwgMHgwODAwNDE4ZCwKKwkweDAwNDMyMDIzLCAweDNjMDIwMDAxLCAweDk0NDIwZjgwLCAweDAwNDQyMDIxLCAweDAwMDQxYzAyLCAweDMwODJmZmZmLAorCTB4MDA2MjIwMjEsIDB4MDA4MDcwMjEsIDB4MDAwNDEwMjcsIDB4MDgwMDQxODUsIDB4YTUwMjAwMGEsIDB4M2MwNTAwMDEsCisJMHgyNGE1MGY3YSwgMHg5MGEzMDAwMCwgMHgxNDYyMDAwMiwgMHgyNGUyZmZmMiwgMHhhNWUyMDAzNCwgMHg5MGEyMDAwMCwKKwkweDAwZTIxMDIzLCAweGE1MDIwMDAyLCAweDNjMDMwMDAxLCAweDk0NjMwZjgwLCAweDNjMDIwMDAxLCAweDk0NDIwZjVhLAorCTB4MzBlNWZmZmYsIDB4MDA2NDE4MjEsIDB4MDA0NTEwMjMsIDB4MDA2MjIwMjMsIDB4MDAwNDFjMDIsIDB4MzA4MmZmZmYsCisJMHgwMDYyMjAyMSwgMHgwMDA0MTAyNywgMHhhNTAyMDAwYSwgMHgzYzAzMDAwMSwgMHg5MDYzMGY3YywgMHgyNDYyMDAwMSwKKwkweDE0YTIwMDA1LCAweDAwODA3MDIxLCAweDAxNjMxMDIxLCAweDkwNDIwMDAwLCAweDA4MDA0MTg1LCAweDAwMDI2MjAwLAorCTB4MjQ2MjAwMDIsIDB4MTRhMjAwMDMsIDB4MzA2MjAwZmUsIDB4MDA0YjEwMjEsIDB4OTQ0YzAwMDAsIDB4M2MwMjAwMDEsCisJMHg5NDQyMGY4MiwgMHgzMTgzZmZmZiwgMHgzYzA0MDAwMSwgMHg5MDg0MGY3YiwgMHgwMDQzMTAyMSwgMHgwMGUyMTAyMSwKKwkweDAwNDQyMDIzLCAweDAwOGEyMDIxLCAweDAwMDQxYzAyLCAweDMwODJmZmZmLCAweDAwNjIyMDIxLCAweDAwMDQxNDAyLAorCTB4MDA4MjIwMjEsIDB4MDA4MDY4MjEsIDB4MDAwNDEwMjcsIDB4YTRjMjAwMTAsIDB4MzFhMmZmZmYsIDB4MDAwZTFjMDAsCisJMHgwMDQzMTAyNSwgMHgzYzA0MDAwMSwgMHgyNDg0MGY3MiwgMHhhZGUyMDAxMCwgMHg5NDgyMDAwMCwgMHgzYzA1MDAwMSwKKwkweDk0YTUwZjc2LCAweDNjMDMwMDAxLCAweDhjNjMwZjZjLCAweDI0NDIwMDAxLCAweDAwYjkyODIxLCAweGE0ODIwMDAwLAorCTB4MzMyMmZmZmYsIDB4MDA2MjIwMjEsIDB4MDA4MzE4MmIsIDB4M2MwMTAwMDEsIDB4YTQyNTBmNzYsIDB4MTA2MDAwMDMsCisJMHgyNGEyZmZmZiwgMHgzYzAxMDAwMSwgMHhhNDIyMGY3NiwgMHgzYzAyNDAwMCwgMHgwMzAyMTAyNSwgMHgzYzAxMDAwMSwKKwkweGFjMjQwZjZjLCAweGFmNjIxMDA4LCAweDAzZTAwMDA4LCAweDI3YmQwMDEwLCAweDNjMDMwMDAxLCAweDkwNjMwZjU2LAorCTB4MjdiZGZmZTgsIDB4MjQwMjAwMDEsIDB4YWZiZjAwMTQsIDB4MTA2MjAwMjYsIDB4YWZiMDAwMTAsIDB4OGY2MjBjZjQsCisJMHgyNDQyZmZmZiwgMHgzMDQyMDA3ZiwgMHgwMDAyMTEwMCwgMHg4YzQzNDAwMCwgMHgzYzAxMDAwMSwgMHhhYzIzMGY2NCwKKwkweDhjNDM0MDA4LCAweDI0NDQ0MDAwLCAweDhjNWM0MDA0LCAweDMwNjIwMDQwLCAweDE0NDAwMDAyLCAweDI0MDIwMDg4LAorCTB4MjQwMjAwMDgsIDB4M2MwMTAwMDEsIDB4YTQyMjBmNjgsIDB4MzA2MjAwMDQsIDB4MTA0MDAwMDUsIDB4MjQwMjAwMDEsCisJMHgzYzAxMDAwMSwgMHhhMDIyMGY1NywgMHgwODAwNDFkNSwgMHgwMDAzMTQwMiwgMHgzYzAxMDAwMSwgMHhhMDIwMGY1NywKKwkweDAwMDMxNDAyLCAweDNjMDEwMDAxLCAweGE0MjIwZjU0LCAweDk0ODMwMDBjLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLAorCTB4YTQyMDBmNTAsIDB4M2MwMTAwMDEsIDB4YTAyMjBmNTYsIDB4M2MwMTAwMDEsIDB4YTQyMzBmNjIsIDB4MjQwMjAwMDEsCisJMHgxMzQyMDAxZSwgMHgwMDAwMDAwMCwgMHgxMzQwMDAwNSwgMHgyNDAyMDAwMywgMHgxMzQyMDA2NywgMHgwMDAwMDAwMCwKKwkweDA4MDA0MmNmLCAweDAwMDAwMDAwLCAweDNjMDIwMDAxLCAweDk0NDIwZjYyLCAweDI0MWEwMDAxLCAweDNjMDEwMDAxLAorCTB4YTQyMDBmNWUsIDB4M2MwMTAwMDEsIDB4YTQyMDBmNTIsIDB4MzA0NDA3ZmYsIDB4MDAwMjFiYzIsIDB4MDAwMzE4MjMsCisJMHgzMDYzMDAzZSwgMHgzNDYzMDAzNiwgMHgwMDAyMTI0MiwgMHgzMDQyMDAzYywgMHgwMDYyMTgyMSwgMHgzYzAxMDAwMSwKKwkweGE0MjQwZjU4LCAweDAwODMyMDIxLCAweDI0NjMwMDMwLCAweDNjMDEwMDAxLCAweGE0MjQwZjVhLCAweDNjMDEwMDAxLAorCTB4YTQyMzBmNWMsIDB4M2MwNjAwMDEsIDB4MjRjNjBmNTIsIDB4OTRjNTAwMDAsIDB4OTRjMzAwMDIsIDB4M2MwNDAwMDEsCisJMHg5NDg0MGY1YSwgMHgwMDY1MTAyMSwgMHgwMDQ0MTAyYSwgMHgxMDQwMDAxMywgMHgzYzEwODAwMCwgMHgwMGEzMTAyMSwKKwkweGE0YzIwMDAwLCAweDNjMDJhMDAwLCAweGFmNjIwY2Y0LCAweDNjMDEwMDAxLCAweGEwMjAwZjU2LCAweDhmNjQxMDA4LAorCTB4MDA5MDEwMjQsIDB4MTQ0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGMwMDQwNjQsIDB4MDAwMDAwMDAsIDB4OGY2MjBjZjQsCisJMHgwMDUwMTAyNCwgMHgxMDQwMDBiNywgMHgwMDAwMDAwMCwgMHgwODAwNDIwZiwgMHgwMDAwMDAwMCwgMHgzYzAzMDAwMSwKKwkweDk0NjMwZjUwLCAweDAwODUxMDIzLCAweGE0YzQwMDAwLCAweDAwNjIxODIxLCAweDMwNDJmZmZmLCAweDNjMDEwMDAxLAorCTB4YTQyMzBmNTAsIDB4YWY2MjBjZTgsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNjgsIDB4MzQ0MjAwMjQsIDB4YWY2MjBjZWMsCisJMHg5NGMzMDAwMiwgMHgzYzAyMDAwMSwgMHg5NDQyMGY1MCwgMHgxNDYyMDAxMiwgMHgzYzAyODAwMCwgMHgzYzEwODAwMCwKKwkweDNjMDJhMDAwLCAweGFmNjIwY2Y0LCAweDNjMDEwMDAxLCAweGEwMjAwZjU2LCAweDhmNjQxMDA4LCAweDAwOTAxMDI0LAorCTB4MTQ0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGMwMDQwNjQsIDB4MDAwMDAwMDAsIDB4OGY2MjBjZjQsIDB4MDA1MDEwMjQsCisJMHgxNDQwZmZmNywgMHgwMDAwMDAwMCwgMHgwODAwNDJjZiwgMHgyNDFhMDAwMywgMHhhZjYyMGNmNCwgMHgzYzEwODAwMCwKKwkweDhmNjQxMDA4LCAweDAwOTAxMDI0LCAweDE0NDAwMDAzLCAweDAwMDAwMDAwLCAweDBjMDA0MDY0LCAweDAwMDAwMDAwLAorCTB4OGY2MjBjZjQsIDB4MDA1MDEwMjQsIDB4MTQ0MGZmZjcsIDB4MDAwMDAwMDAsIDB4MDgwMDQyY2YsIDB4MjQxYTAwMDMsCisJMHgzYzA3MDAwMSwgMHgyNGU3MGY1MCwgMHg5NGUyMDAwMCwgMHgwMzgyMTAyMSwgMHhhZjYyMGNlMCwgMHgzYzAyMDAwMSwKKwkweDhjNDIwZjY0LCAweGFmNjIwY2U0LCAweDNjMDUwMDAxLCAweDk0YTUwZjU0LCAweDk0ZTMwMDAwLCAweDNjMDQwMDAxLAorCTB4OTQ4NDBmNTgsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNWUsIDB4MDBhMzI4MjMsIDB4MDA4MjIwMjMsIDB4MzBhNmZmZmYsCisJMHgzMDgzZmZmZiwgMHgwMGMzMTAyYiwgMHgxNDQwMDA0MywgMHgwMDAwMDAwMCwgMHgzYzAyMDAwMSwgMHg5NDQyMGY1YywKKwkweDAwMDIxNDAwLCAweDAwNjIxMDI1LCAweGFmNjIwY2U4LCAweDk0ZTIwMDAwLCAweDNjMDMwMDAxLCAweDk0NjMwZjU0LAorCTB4MDA0NDEwMjEsIDB4YTRlMjAwMDAsIDB4MzA0MmZmZmYsIDB4MTQ0MzAwMjEsIDB4M2MwMjAwMDgsIDB4M2MwMjAwMDEsCisJMHg5MDQyMGY1NywgMHgxMDQwMDAwNiwgMHgzYzAzMDAwYywgMHgzYzAyMDAwMSwgMHg5NDQyMGY2OCwgMHgzNDYzMDYyNCwKKwkweDA4MDA0MjdjLCAweDAwMDBkMDIxLCAweDNjMDIwMDAxLCAweDk0NDIwZjY4LCAweDNjMDMwMDA4LCAweDM0NjMwNjI0LAorCTB4MDA0MzEwMjUsIDB4YWY2MjBjZWMsIDB4M2MxMDgwMDAsIDB4M2MwMmEwMDAsIDB4YWY2MjBjZjQsIDB4M2MwMTAwMDEsCisJMHhhMDIwMGY1NiwgMHg4ZjY0MTAwOCwgMHgwMDkwMTAyNCwgMHgxNDQwMDAwMywgMHgwMDAwMDAwMCwgMHgwYzAwNDA2NCwKKwkweDAwMDAwMDAwLCAweDhmNjIwY2Y0LCAweDAwNTAxMDI0LCAweDEwNDAwMDE1LCAweDAwMDAwMDAwLCAweDA4MDA0MjgzLAorCTB4MDAwMDAwMDAsIDB4M2MwMzAwMDEsIDB4OTQ2MzBmNjgsIDB4MzQ0MjA2MjQsIDB4M2MxMDgwMDAsIDB4MDA2MjE4MjUsCisJMHgzYzAyODAwMCwgMHhhZjYzMGNlYywgMHhhZjYyMGNmNCwgMHg4ZjY0MTAwOCwgMHgwMDkwMTAyNCwgMHgxNDQwMDAwMywKKwkweDAwMDAwMDAwLCAweDBjMDA0MDY0LCAweDAwMDAwMDAwLCAweDhmNjIwY2Y0LCAweDAwNTAxMDI0LCAweDE0NDBmZmY3LAorCTB4MDAwMDAwMDAsIDB4M2MwMTAwMDEsIDB4MDgwMDQyY2YsIDB4YTQyMDBmNWUsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNWMsCisJMHgwMDAyMTQwMCwgMHgwMGMyMTAyNSwgMHhhZjYyMGNlOCwgMHgzYzAyMDAwMSwgMHg5MDQyMGY1NywgMHgxMDQwMDAwOSwKKwkweDNjMDMwMDBjLCAweDNjMDIwMDAxLCAweDk0NDIwZjY4LCAweDM0NjMwNjI0LCAweDAwMDBkMDIxLCAweDAwNDMxMDI1LAorCTB4YWY2MjBjZWMsIDB4MDgwMDQyYzEsIDB4M2MxMDgwMDAsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNjgsIDB4M2MwMzAwMDgsCisJMHgzNDYzMDYwNCwgMHgwMDQzMTAyNSwgMHhhZjYyMGNlYywgMHgzYzAyMDAwMSwgMHg5NDQyMGY1ZSwgMHgwMDQ1MTAyMSwKKwkweDNjMDEwMDAxLCAweGE0MjIwZjVlLCAweDNjMTA4MDAwLCAweDNjMDJhMDAwLCAweGFmNjIwY2Y0LCAweDNjMDEwMDAxLAorCTB4YTAyMDBmNTYsIDB4OGY2NDEwMDgsIDB4MDA5MDEwMjQsIDB4MTQ0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGMwMDQwNjQsCisJMHgwMDAwMDAwMCwgMHg4ZjYyMGNmNCwgMHgwMDUwMTAyNCwgMHgxNDQwZmZmNywgMHgwMDAwMDAwMCwgMHg4ZmJmMDAxNCwKKwkweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDAwMDAwMDAwLCAweDI3YmRmZmUwLCAweDNjMDQwMDAxLAorCTB4MjQ4NDBlYzAsIDB4MDAwMDI4MjEsIDB4MDAwMDMwMjEsIDB4MDAwMDM4MjEsIDB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsCisJMHgwYzAwNDM3OCwgMHhhZmEwMDAxNCwgMHgwMDAwZDAyMSwgMHgyNDAyMDEzMCwgMHhhZjYyNTAwMCwgMHgzYzAxMDAwMSwKKwkweGE0MjAwZjUwLCAweDNjMDEwMDAxLCAweGEwMjAwZjU3LCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLAorCTB4MjdiZGZmZTgsIDB4M2MxYmMwMDAsIDB4YWZiZjAwMTQsIDB4YWZiMDAwMTAsIDB4YWY2MDY4MGMsIDB4OGY2MjY4MDQsCisJMHgzNDQyMDA4MiwgMHhhZjYyNjgwNCwgMHg4ZjYzNDAwMCwgMHgyNDAyMGI1MCwgMHgzYzAxMDAwMSwgMHhhYzIyMGYyMCwKKwkweDI0MDIwYjc4LCAweDNjMDEwMDAxLCAweGFjMjIwZjMwLCAweDM0NjMwMDAyLCAweGFmNjM0MDAwLCAweDBjMDA0MzE1LAorCTB4MDA4MDgwMjEsIDB4M2MwMTAwMDEsIDB4YTAyMjBmMzQsIDB4MzA0MjAwZmYsIDB4MjQwMzAwMDIsIDB4MTQ0MzAwMDUsCisJMHgwMDAwMDAwMCwgMHgzYzAyMDAwMSwgMHg4YzQyMGYyMCwgMHgwODAwNDMwOCwgMHhhYzUwMDBjMCwgMHgzYzAyMDAwMSwKKwkweDhjNDIwZjIwLCAweGFjNTAwMGJjLCAweDhmNjI0NDM0LCAweDhmNjM0NDM4LCAweDhmNjQ0NDEwLCAweDNjMDEwMDAxLAorCTB4YWMyMjBmMjgsIDB4M2MwMTAwMDEsIDB4YWMyMzBmMzgsIDB4M2MwMTAwMDEsIDB4YWMyNDBmMjQsIDB4OGZiZjAwMTQsCisJMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwgMHgwM2UwMDAwOCwgMHgyNDAyMDAwMSwgMHgyN2JkZmZmOCwKKwkweDE4ODAwMDA5LCAweDAwMDAyODIxLCAweDhmNjM2ODBjLCAweDhmNjI2ODBjLCAweDEwNDNmZmZlLCAweDAwMDAwMDAwLAorCTB4MjRhNTAwMDEsIDB4MDBhNDEwMmEsIDB4MTQ0MGZmZjksIDB4MDAwMDAwMDAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMDgsCisJMHg4ZjYzNDQ1MCwgMHgzYzAyMDAwMSwgMHg4YzQyMGYyOCwgMHgwMDAzMWMwMiwgMHgwMDQzMTAyYiwgMHgxNDQwMDAwOCwKKwkweDNjMDM4MDAwLCAweDNjMDQwMDAxLCAweDhjODQwZjM4LCAweDhmNjI0NDUwLCAweDAwMDIxYzAyLCAweDAwODMxMDJiLAorCTB4MTA0MGZmZmMsIDB4M2MwMzgwMDAsIDB4YWY2MzQ0NDQsIDB4OGY2MjQ0NDQsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsCisJMHgwMDAwMDAwMCwgMHg4ZjYyNDQ0OCwgMHgwM2UwMDAwOCwgMHgzMDQyZmZmZiwgMHgzMDgyZmZmZiwgMHgyNDQyZTAwMCwKKwkweDJjNDIyMDAxLCAweDE0NDAwMDAzLCAweDNjMDI0MDAwLCAweDA4MDA0MzQ3LCAweDI0MDJmZmZmLCAweDAwODIyMDI1LAorCTB4YWY2NDVjMzgsIDB4OGY2MjVjMzAsIDB4MzA0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MDAwMDEwMjEsIDB4MDNlMDAwMDgsCisJMHgwMDAwMDAwMCwgMHg4ZjYyNDQ1MCwgMHgzYzAzMDAwMSwgMHg4YzYzMGYyNCwgMHgwODAwNDM1MCwgMHgzMDQyZmZmZiwKKwkweDhmNjI0NDUwLCAweDMwNDJmZmZmLCAweDAwNDMxMDJiLCAweDE0NDBmZmZjLCAweDAwMDAwMDAwLCAweDAzZTAwMDA4LAorCTB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4MDA4MDI4MjEsIDB4M2MwNDAwMDEsIDB4MjQ4NDBlZDAsIDB4MDAwMDMwMjEsCisJMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwYzAwNDM3OCwgMHhhZmEwMDAxNCwgMHgwODAwNDM1ZiwKKwkweDAwMDAwMDAwLCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDNjMDIwMDAxLCAweDM0NDJkNjAwLAorCTB4M2MwMzAwMDEsIDB4MzQ2M2Q2MDAsIDB4M2MwNDAwMDEsIDB4MzQ4NGRkZmYsIDB4M2MwMTAwMDEsIDB4YWMyMjBmNDAsCisJMHgyNDAyMDA0MCwgMHgzYzAxMDAwMSwgMHhhYzIyMGY0NCwgMHgzYzAxMDAwMSwgMHhhYzIwMGYzYywgMHhhYzYwMDAwMCwKKwkweDI0NjMwMDA0LCAweDAwODMxMDJiLCAweDUwNDBmZmZkLCAweGFjNjAwMDAwLCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLAorCTB4MDA4MDQ4MjEsIDB4OGZhYTAwMTAsIDB4M2MwMjAwMDEsIDB4OGM0MjBmM2MsIDB4M2MwNDAwMDEsIDB4OGM4NDBmNDQsCisJMHg4ZmFiMDAxNCwgMHgyNDQzMDAwMSwgMHgwMDQ0MTAyYiwgMHgzYzAxMDAwMSwgMHhhYzIzMGYzYywgMHgxNDQwMDAwMywKKwkweDAwMDA0MDIxLCAweDNjMDEwMDAxLCAweGFjMjAwZjNjLCAweDNjMDIwMDAxLCAweDhjNDIwZjNjLCAweDNjMDMwMDAxLAorCTB4OGM2MzBmNDAsIDB4OTEyNDAwMDAsIDB4MDAwMjExNDAsIDB4MDA0MzEwMjEsIDB4MDA0ODEwMjEsIDB4MjUwODAwMDEsCisJMHhhMDQ0MDAwMCwgMHgyOTAyMDAwOCwgMHgxNDQwZmZmNCwgMHgyNTI5MDAwMSwgMHgzYzAyMDAwMSwgMHg4YzQyMGYzYywKKwkweDNjMDMwMDAxLCAweDhjNjMwZjQwLCAweDhmNjQ2ODBjLCAweDAwMDIxMTQwLCAweDAwNDMxMDIxLCAweGFjNDQwMDA4LAorCTB4YWM0NTAwMGMsIDB4YWM0NjAwMTAsIDB4YWM0NzAwMTQsIDB4YWM0YTAwMTgsIDB4MDNlMDAwMDgsIDB4YWM0YjAwMWMsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKK307CisKK3N0YXRpYyB1MzIgdGczVHNvNUZ3Um9kYXRhWyhURzNfVFNPNV9GV19ST0RBVEFfTEVOIC8gNCkgKyAxXSA9IHsKKwkweDRkNjE2OTZlLCAweDQzNzA3NTQyLCAweDAwMDAwMDAwLCAweDRkNjE2OTZlLCAweDQzNzA3NTQxLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NzM3NDZiNmYsIDB4NjY2NjZjNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHg3Mzc0NmI2ZiwgMHg2NjY2NmM2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg2NjYxNzQ2MSwgMHg2YzQ1NzI3MiwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorfTsKKworc3RhdGljIHUzMiB0ZzNUc281RndEYXRhWyhURzNfVFNPNV9GV19EQVRBX0xFTiAvIDQpICsgMV0gPSB7CisJMHgwMDAwMDAwMCwgMHg3Mzc0NmI2ZiwgMHg2NjY2NmM2NCwgMHg1Zjc2MzEyZSwgMHgzMjJlMzAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorfTsKKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyBpbnQgdGczX2xvYWRfdHNvX2Zpcm13YXJlKHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCBmd19pbmZvIGluZm87CisJdW5zaWduZWQgbG9uZyBjcHVfYmFzZSwgY3B1X3NjcmF0Y2hfYmFzZSwgY3B1X3NjcmF0Y2hfc2l6ZTsKKwlpbnQgZXJyLCBpOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSFdfVFNPKQorCQlyZXR1cm4gMDsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkgeworCQlpbmZvLnRleHRfYmFzZSA9IFRHM19UU081X0ZXX1RFWFRfQUREUjsKKwkJaW5mby50ZXh0X2xlbiA9IFRHM19UU081X0ZXX1RFWFRfTEVOOworCQlpbmZvLnRleHRfZGF0YSA9ICZ0ZzNUc281RndUZXh0WzBdOworCQlpbmZvLnJvZGF0YV9iYXNlID0gVEczX1RTTzVfRldfUk9EQVRBX0FERFI7CisJCWluZm8ucm9kYXRhX2xlbiA9IFRHM19UU081X0ZXX1JPREFUQV9MRU47CisJCWluZm8ucm9kYXRhX2RhdGEgPSAmdGczVHNvNUZ3Um9kYXRhWzBdOworCQlpbmZvLmRhdGFfYmFzZSA9IFRHM19UU081X0ZXX0RBVEFfQUREUjsKKwkJaW5mby5kYXRhX2xlbiA9IFRHM19UU081X0ZXX0RBVEFfTEVOOworCQlpbmZvLmRhdGFfZGF0YSA9ICZ0ZzNUc281RndEYXRhWzBdOworCQljcHVfYmFzZSA9IFJYX0NQVV9CQVNFOworCQljcHVfc2NyYXRjaF9iYXNlID0gTklDX1NSQU1fTUJVRl9QT09MX0JBU0U1NzA1OworCQljcHVfc2NyYXRjaF9zaXplID0gKGluZm8udGV4dF9sZW4gKworCQkJCSAgICBpbmZvLnJvZGF0YV9sZW4gKworCQkJCSAgICBpbmZvLmRhdGFfbGVuICsKKwkJCQkgICAgVEczX1RTTzVfRldfU0JTU19MRU4gKworCQkJCSAgICBURzNfVFNPNV9GV19CU1NfTEVOKTsKKwl9IGVsc2UgeworCQlpbmZvLnRleHRfYmFzZSA9IFRHM19UU09fRldfVEVYVF9BRERSOworCQlpbmZvLnRleHRfbGVuID0gVEczX1RTT19GV19URVhUX0xFTjsKKwkJaW5mby50ZXh0X2RhdGEgPSAmdGczVHNvRndUZXh0WzBdOworCQlpbmZvLnJvZGF0YV9iYXNlID0gVEczX1RTT19GV19ST0RBVEFfQUREUjsKKwkJaW5mby5yb2RhdGFfbGVuID0gVEczX1RTT19GV19ST0RBVEFfTEVOOworCQlpbmZvLnJvZGF0YV9kYXRhID0gJnRnM1Rzb0Z3Um9kYXRhWzBdOworCQlpbmZvLmRhdGFfYmFzZSA9IFRHM19UU09fRldfREFUQV9BRERSOworCQlpbmZvLmRhdGFfbGVuID0gVEczX1RTT19GV19EQVRBX0xFTjsKKwkJaW5mby5kYXRhX2RhdGEgPSAmdGczVHNvRndEYXRhWzBdOworCQljcHVfYmFzZSA9IFRYX0NQVV9CQVNFOworCQljcHVfc2NyYXRjaF9iYXNlID0gVFhfQ1BVX1NDUkFUQ0hfQkFTRTsKKwkJY3B1X3NjcmF0Y2hfc2l6ZSA9IFRYX0NQVV9TQ1JBVENIX1NJWkU7CisJfQorCisJZXJyID0gdGczX2xvYWRfZmlybXdhcmVfY3B1KHRwLCBjcHVfYmFzZSwKKwkJCQkgICAgY3B1X3NjcmF0Y2hfYmFzZSwgY3B1X3NjcmF0Y2hfc2l6ZSwKKwkJCQkgICAgJmluZm8pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBOb3cgc3RhcnR1cCB0aGUgY3B1LiAqLworCXR3MzIoY3B1X2Jhc2UgKyBDUFVfU1RBVEUsIDB4ZmZmZmZmZmYpOworCXR3MzJfZihjcHVfYmFzZSArIENQVV9QQywgICAgaW5mby50ZXh0X2Jhc2UpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlpZiAodHIzMihjcHVfYmFzZSArIENQVV9QQykgPT0gaW5mby50ZXh0X2Jhc2UpCisJCQlicmVhazsKKwkJdHczMihjcHVfYmFzZSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJCXR3MzIoY3B1X2Jhc2UgKyBDUFVfTU9ERSwgIENQVV9NT0RFX0hBTFQpOworCQl0dzMyX2YoY3B1X2Jhc2UgKyBDUFVfUEMsICAgIGluZm8udGV4dF9iYXNlKTsKKwkJdWRlbGF5KDEwMDApOworCX0KKwlpZiAoaSA+PSA1KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInRnM19sb2FkX3Rzb19maXJtd2FyZSBmYWlscyBmb3IgJXMgIgorCQkgICAgICAgInRvIHNldCBDUFUgUEMsIGlzICUwOHggc2hvdWxkIGJlICUwOHhcbiIsCisJCSAgICAgICB0cC0+ZGV2LT5uYW1lLCB0cjMyKGNwdV9iYXNlICsgQ1BVX1BDKSwKKwkJICAgICAgIGluZm8udGV4dF9iYXNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXR3MzIoY3B1X2Jhc2UgKyBDUFVfU1RBVEUsIDB4ZmZmZmZmZmYpOworCXR3MzJfZihjcHVfYmFzZSArIENQVV9NT0RFLCAgMHgwMDAwMDAwMCk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBURzNfVFNPX1NVUFBPUlQgIT0gMCAqLworCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIHZvaWQgX190ZzNfc2V0X21hY19hZGRyKHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiBhZGRyX2hpZ2gsIGFkZHJfbG93OworCWludCBpOworCisJYWRkcl9oaWdoID0gKCh0cC0+ZGV2LT5kZXZfYWRkclswXSA8PCA4KSB8CisJCSAgICAgdHAtPmRldi0+ZGV2X2FkZHJbMV0pOworCWFkZHJfbG93ID0gKCh0cC0+ZGV2LT5kZXZfYWRkclsyXSA8PCAyNCkgfAorCQkgICAgKHRwLT5kZXYtPmRldl9hZGRyWzNdIDw8IDE2KSB8CisJCSAgICAodHAtPmRldi0+ZGV2X2FkZHJbNF0gPDwgIDgpIHwKKwkJICAgICh0cC0+ZGV2LT5kZXZfYWRkcls1XSA8PCAgMCkpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJdHczMihNQUNfQUREUl8wX0hJR0ggKyAoaSAqIDgpLCBhZGRyX2hpZ2gpOworCQl0dzMyKE1BQ19BRERSXzBfTE9XICsgKGkgKiA4KSwgYWRkcl9sb3cpOworCX0KKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMyB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCQkJdHczMihNQUNfRVhUQUREUl8wX0hJR0ggKyAoaSAqIDgpLCBhZGRyX2hpZ2gpOworCQkJdHczMihNQUNfRVhUQUREUl8wX0xPVyArIChpICogOCksIGFkZHJfbG93KTsKKwkJfQorCX0KKworCWFkZHJfaGlnaCA9ICh0cC0+ZGV2LT5kZXZfYWRkclswXSArCisJCSAgICAgdHAtPmRldi0+ZGV2X2FkZHJbMV0gKworCQkgICAgIHRwLT5kZXYtPmRldl9hZGRyWzJdICsKKwkJICAgICB0cC0+ZGV2LT5kZXZfYWRkclszXSArCisJCSAgICAgdHAtPmRldi0+ZGV2X2FkZHJbNF0gKworCQkgICAgIHRwLT5kZXYtPmRldl9hZGRyWzVdKSAmCisJCVRYX0JBQ0tPRkZfU0VFRF9NQVNLOworCXR3MzIoTUFDX1RYX0JBQ0tPRkZfU0VFRCwgYWRkcl9oaWdoKTsKK30KKworc3RhdGljIGludCB0ZzNfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJX190ZzNfc2V0X21hY19hZGRyKHRwKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIHZvaWQgdGczX3NldF9iZGluZm8oc3RydWN0IHRnMyAqdHAsIHUzMiBiZGluZm9fYWRkciwKKwkJCSAgIGRtYV9hZGRyX3QgbWFwcGluZywgdTMyIG1heGxlbl9mbGFncywKKwkJCSAgIHUzMiBuaWNfYWRkcikKK3sKKwl0ZzNfd3JpdGVfbWVtKHRwLAorCQkgICAgICAoYmRpbmZvX2FkZHIgKyBURzNfQkRJTkZPX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfSElHSCksCisJCSAgICAgICgodTY0KSBtYXBwaW5nID4+IDMyKSk7CisJdGczX3dyaXRlX21lbSh0cCwKKwkJICAgICAgKGJkaW5mb19hZGRyICsgVEczX0JESU5GT19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVyksCisJCSAgICAgICgodTY0KSBtYXBwaW5nICYgMHhmZmZmZmZmZikpOworCXRnM193cml0ZV9tZW0odHAsCisJCSAgICAgIChiZGluZm9fYWRkciArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTKSwKKwkJICAgICAgIG1heGxlbl9mbGFncyk7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpCisJCXRnM193cml0ZV9tZW0odHAsCisJCQkgICAgICAoYmRpbmZvX2FkZHIgKyBURzNfQkRJTkZPX05JQ19BRERSKSwKKwkJCSAgICAgIG5pY19hZGRyKTsKK30KKworc3RhdGljIHZvaWQgX190ZzNfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKy8qIHRwLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgaW50IHRnM19yZXNldF9odyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgdmFsLCByZG1hY19tb2RlOworCWludCBpLCBlcnIsIGxpbWl0OworCisJdGczX2Rpc2FibGVfaW50cyh0cCk7CisKKwl0ZzNfc3RvcF9mdyh0cCk7CisKKwl0ZzNfd3JpdGVfc2lnX3ByZV9yZXNldCh0cCwgUkVTRVRfS0lORF9JTklUKTsKKworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSU5JVF9DT01QTEVURSkgeworCQllcnIgPSB0ZzNfYWJvcnRfaHcodHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSB0ZzNfY2hpcF9yZXNldCh0cCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXRnM193cml0ZV9zaWdfbGVnYWN5KHRwLCBSRVNFVF9LSU5EX0lOSVQpOworCisJLyogVGhpcyB3b3JrcyBhcm91bmQgYW4gaXNzdWUgd2l0aCBBdGhsb24gY2hpcHNldHMgb24KKwkgKiBCMyB0aWdvbjMgc2lsaWNvbi4gIFRoaXMgYml0IGhhcyBubyBlZmZlY3Qgb24gYW55CisJICogb3RoZXIgcmV2aXNpb24uICBCdXQgZG8gbm90IHNldCB0aGlzIG9uIFBDSSBFeHByZXNzCisJICogY2hpcHMuCisJICovCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykpCisJCXRwLT5wY2lfY2xvY2tfY3RybCB8PSBDTE9DS19DVFJMX0RFTEFZX1BDSV9HUkFOVDsKKwl0dzMyX2YoVEczUENJX0NMT0NLX0NUUkwsIHRwLT5wY2lfY2xvY2tfY3RybCk7CisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDRfQTAgJiYKKwkgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpKSB7CisJCXZhbCA9IHRyMzIoVEczUENJX1BDSVNUQVRFKTsKKwkJdmFsIHw9IFBDSVNUQVRFX1JFVFJZX1NBTUVfRE1BOworCQl0dzMyKFRHM1BDSV9QQ0lTVEFURSwgdmFsKTsKKwl9CisKKwlpZiAoR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IENISVBSRVZfNTcwNF9CWCkgeworCQkvKiBFbmFibGUgc29tZSBodyBmaXhlcy4gICovCisJCXZhbCA9IHRyMzIoVEczUENJX01TSV9EQVRBKTsKKwkJdmFsIHw9ICgxIDw8IDI2KSB8ICgxIDw8IDI4KSB8ICgxIDw8IDI5KTsKKwkJdHczMihURzNQQ0lfTVNJX0RBVEEsIHZhbCk7CisJfQorCisJLyogRGVzY3JpcHRvciByaW5nIGluaXQgbWF5IG1ha2UgYWNjZXNzZXMgdG8gdGhlCisJICogTklDIFNSQU0gYXJlYSB0byBzZXR1cCB0aGUgVFggZGVzY3JpcHRvcnMsIHNvIHdlCisJICogY2FuIG9ubHkgZG8gdGhpcyBhZnRlciB0aGUgaGFyZHdhcmUgaGFzIGJlZW4KKwkgKiBzdWNjZXNzZnVsbHkgcmVzZXQuCisJICovCisJdGczX2luaXRfcmluZ3ModHApOworCisJLyogVGhpcyB2YWx1ZSBpcyBkZXRlcm1pbmVkIGR1cmluZyB0aGUgcHJvYmUgdGltZSBETUEKKwkgKiBlbmdpbmUgdGVzdCwgdGczX3Rlc3RfZG1hLgorCSAqLworCXR3MzIoVEczUENJX0RNQV9SV19DVFJMLCB0cC0+ZG1hX3J3Y3RybCk7CisKKwl0cC0+Z3JjX21vZGUgJj0gfihHUkNfTU9ERV9IT1NUX1NFTkRCRFMgfAorCQkJICBHUkNfTU9ERV80WF9OSUNfU0VORF9SSU5HUyB8CisJCQkgIEdSQ19NT0RFX05PX1RYX1BIRFJfQ1NVTSB8CisJCQkgIEdSQ19NT0RFX05PX1JYX1BIRFJfQ1NVTSk7CisJdHAtPmdyY19tb2RlIHw9IEdSQ19NT0RFX0hPU1RfU0VOREJEUzsKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX05PX1RYX1BTRVVET19DU1VNKQorCQl0cC0+Z3JjX21vZGUgfD0gR1JDX01PREVfTk9fVFhfUEhEUl9DU1VNOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTk9fUlhfUFNFVURPX0NTVU0pCisJCXRwLT5ncmNfbW9kZSB8PSBHUkNfTU9ERV9OT19SWF9QSERSX0NTVU07CisKKwl0dzMyKEdSQ19NT0RFLAorCSAgICAgdHAtPmdyY19tb2RlIHwKKwkgICAgIChHUkNfTU9ERV9JUlFfT05fTUFDX0FUVE4gfCBHUkNfTU9ERV9IT1NUX1NUQUNLVVApKTsKKworCS8qIFNldHVwIHRoZSB0aW1lciBwcmVzY2FsYXIgcmVnaXN0ZXIuICBDbG9jayBpcyBhbHdheXMgNjZNaHouICovCisJdmFsID0gdHIzMihHUkNfTUlTQ19DRkcpOworCXZhbCAmPSB+MHhmZjsKKwl2YWwgfD0gKDY1IDw8IEdSQ19NSVNDX0NGR19QUkVTQ0FMQVJfU0hJRlQpOworCXR3MzIoR1JDX01JU0NfQ0ZHLCB2YWwpOworCisJLyogSW5pdGlhbGl6ZSBNQlVGL0RFU0MgcG9vbC4gKi8KKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApIHsKKwkJLyogRG8gbm90aGluZy4gICovCisJfSBlbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSkgeworCQl0dzMyKEJVRk1HUl9NQl9QT09MX0FERFIsIE5JQ19TUkFNX01CVUZfUE9PTF9CQVNFKTsKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KQorCQkJdHczMihCVUZNR1JfTUJfUE9PTF9TSVpFLCBOSUNfU1JBTV9NQlVGX1BPT0xfU0laRTY0KTsKKwkJZWxzZQorCQkJdHczMihCVUZNR1JfTUJfUE9PTF9TSVpFLCBOSUNfU1JBTV9NQlVGX1BPT0xfU0laRTk2KTsKKwkJdHczMihCVUZNR1JfRE1BX0RFU0NfUE9PTF9BRERSLCBOSUNfU1JBTV9ETUFfREVTQ19QT09MX0JBU0UpOworCQl0dzMyKEJVRk1HUl9ETUFfREVTQ19QT09MX1NJWkUsIE5JQ19TUkFNX0RNQV9ERVNDX1BPT0xfU0laRSk7CisJfQorI2lmIFRHM19UU09fU1VQUE9SVCAhPSAwCisJZWxzZSBpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9UU09fQ0FQQUJMRSkgeworCQlpbnQgZndfbGVuOworCisJCWZ3X2xlbiA9IChURzNfVFNPNV9GV19URVhUX0xFTiArCisJCQkgIFRHM19UU081X0ZXX1JPREFUQV9MRU4gKworCQkJICBURzNfVFNPNV9GV19EQVRBX0xFTiArCisJCQkgIFRHM19UU081X0ZXX1NCU1NfTEVOICsKKwkJCSAgVEczX1RTTzVfRldfQlNTX0xFTik7CisJCWZ3X2xlbiA9IChmd19sZW4gKyAoMHg4MCAtIDEpKSAmIH4oMHg4MCAtIDEpOworCQl0dzMyKEJVRk1HUl9NQl9QT09MX0FERFIsCisJCSAgICAgTklDX1NSQU1fTUJVRl9QT09MX0JBU0U1NzA1ICsgZndfbGVuKTsKKwkJdHczMihCVUZNR1JfTUJfUE9PTF9TSVpFLAorCQkgICAgIE5JQ19TUkFNX01CVUZfUE9PTF9TSVpFNTcwNSAtIGZ3X2xlbiAtIDB4YTAwKTsKKwl9CisjZW5kaWYKKworCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19KVU1CT19FTkFCTEUpKSB7CisJCXR3MzIoQlVGTUdSX01CX1JETUFfTE9XX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfcmVhZF9kbWFfbG93X3dhdGVyKTsKKwkJdHczMihCVUZNR1JfTUJfTUFDUlhfTE9XX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfbWFjX3J4X2xvd193YXRlcik7CisJCXR3MzIoQlVGTUdSX01CX0hJR0hfV0FURVIsCisJCSAgICAgdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9oaWdoX3dhdGVyKTsKKwl9IGVsc2UgeworCQl0dzMyKEJVRk1HUl9NQl9SRE1BX0xPV19XQVRFUiwKKwkJICAgICB0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX3JlYWRfZG1hX2xvd193YXRlcl9qdW1ibyk7CisJCXR3MzIoQlVGTUdSX01CX01BQ1JYX0xPV19XQVRFUiwKKwkJICAgICB0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX21hY19yeF9sb3dfd2F0ZXJfanVtYm8pOworCQl0dzMyKEJVRk1HUl9NQl9ISUdIX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfaGlnaF93YXRlcl9qdW1ibyk7CisJfQorCXR3MzIoQlVGTUdSX0RNQV9MT1dfV0FURVIsCisJICAgICB0cC0+YnVmbWdyX2NvbmZpZy5kbWFfbG93X3dhdGVyKTsKKwl0dzMyKEJVRk1HUl9ETUFfSElHSF9XQVRFUiwKKwkgICAgIHRwLT5idWZtZ3JfY29uZmlnLmRtYV9oaWdoX3dhdGVyKTsKKworCXR3MzIoQlVGTUdSX01PREUsIEJVRk1HUl9NT0RFX0VOQUJMRSB8IEJVRk1HUl9NT0RFX0FUVE5fRU5BQkxFKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7CisJCWlmICh0cjMyKEJVRk1HUl9NT0RFKSAmIEJVRk1HUl9NT0RFX0VOQUJMRSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoaSA+PSAyMDAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInRnM19yZXNldF9odyBjYW5ub3QgZW5hYmxlIEJVRk1HUiBmb3IgJXMuXG4iLAorCQkgICAgICAgdHAtPmRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFNldHVwIHJlcGxlbmlzaCB0aHJlc2hvbGQuICovCisJdHczMihSQ1ZCRElfU1REX1RIUkVTSCwgdHAtPnJ4X3BlbmRpbmcgLyA4KTsKKworCS8qIEluaXRpYWxpemUgVEczX0JESU5GTydzIGF0OgorCSAqICBSQ1ZEQkRJX1NURF9CRDoJc3RhbmRhcmQgZXRoIHNpemUgcnggcmluZworCSAqICBSQ1ZEQkRJX0pVTUJPX0JEOglqdW1ibyBmcmFtZSByeCByaW5nCisJICogIFJDVkRCRElfTUlOSV9CRDoJc21hbGwgZnJhbWUgcnggcmluZyAoPz8/IGRvZXMgbm90IHdvcmspCisJICoKKwkgKiBsaWtlIHNvOgorCSAqICBURzNfQkRJTkZPX0hPU1RfQUREUjoJaGlnaC9sb3cgcGFydHMgb2YgRE1BIGFkZHJlc3Mgb2YgcmluZworCSAqICBURzNfQkRJTkZPX01BWExFTl9GTEFHUzoJKHJ4IG1heCBidWZmZXIgc2l6ZSA8PCAxNikgfAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmluZyBhdHRyaWJ1dGUgZmxhZ3MKKwkgKiAgVEczX0JESU5GT19OSUNfQUREUjoJbG9jYXRpb24gb2YgZGVzY3JpcHRvcnMgaW4gbmljIFNSQU0KKwkgKgorCSAqIFN0YW5kYXJkIHJlY2VpdmUgcmluZyBAIE5JQ19TUkFNX1JYX0JVRkZFUl9ERVNDLCA1MTIgZW50cmllcy4KKwkgKiBKdW1ibyByZWNlaXZlIHJpbmcgQCBOSUNfU1JBTV9SWF9KVU1CT19CVUZGRVJfREVTQywgMjU2IGVudHJpZXMuCisJICoKKwkgKiBUaGUgc2l6ZSBvZiBlYWNoIHJpbmcgaXMgZml4ZWQgaW4gdGhlIGZpcm13YXJlLCBidXQgdGhlIGxvY2F0aW9uIGlzCisJICogY29uZmlndXJhYmxlLgorCSAqLworCXR3MzIoUkNWREJESV9TVERfQkQgKyBURzNfQkRJTkZPX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfSElHSCwKKwkgICAgICgodTY0KSB0cC0+cnhfc3RkX21hcHBpbmcgPj4gMzIpKTsKKwl0dzMyKFJDVkRCRElfU1REX0JEICsgVEczX0JESU5GT19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVywKKwkgICAgICgodTY0KSB0cC0+cnhfc3RkX21hcHBpbmcgJiAweGZmZmZmZmZmKSk7CisJdHczMihSQ1ZEQkRJX1NURF9CRCArIFRHM19CRElORk9fTklDX0FERFIsCisJICAgICBOSUNfU1JBTV9SWF9CVUZGRVJfREVTQyk7CisKKwkvKiBEb24ndCBldmVuIHRyeSB0byBwcm9ncmFtIHRoZSBKVU1CTy9NSU5JIGJ1ZmZlciBkZXNjcmlwdG9yCisJICogY29uZmlncyBvbiA1NzA1LgorCSAqLworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykgeworCQl0dzMyKFJDVkRCRElfU1REX0JEICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MsCisJCSAgICAgUlhfU1REX01BWF9TSVpFXzU3MDUgPDwgQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVCk7CisJfSBlbHNlIHsKKwkJdHczMihSQ1ZEQkRJX1NURF9CRCArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTLAorCQkgICAgIFJYX1NURF9NQVhfU0laRSA8PCBCRElORk9fRkxBR1NfTUFYTEVOX1NISUZUKTsKKworCQl0dzMyKFJDVkRCRElfTUlOSV9CRCArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTLAorCQkgICAgIEJESU5GT19GTEFHU19ESVNBQkxFRCk7CisKKwkJLyogU2V0dXAgcmVwbGVuaXNoIHRocmVzaG9sZC4gKi8KKwkJdHczMihSQ1ZCRElfSlVNQk9fVEhSRVNILCB0cC0+cnhfanVtYm9fcGVuZGluZyAvIDgpOworCisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSlVNQk9fRU5BQkxFKSB7CisJCQl0dzMyKFJDVkRCRElfSlVNQk9fQkQgKyBURzNfQkRJTkZPX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfSElHSCwKKwkJCSAgICAgKCh1NjQpIHRwLT5yeF9qdW1ib19tYXBwaW5nID4+IDMyKSk7CisJCQl0dzMyKFJDVkRCRElfSlVNQk9fQkQgKyBURzNfQkRJTkZPX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfTE9XLAorCQkJICAgICAoKHU2NCkgdHAtPnJ4X2p1bWJvX21hcHBpbmcgJiAweGZmZmZmZmZmKSk7CisJCQl0dzMyKFJDVkRCRElfSlVNQk9fQkQgKyBURzNfQkRJTkZPX01BWExFTl9GTEFHUywKKwkJCSAgICAgUlhfSlVNQk9fTUFYX1NJWkUgPDwgQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVCk7CisJCQl0dzMyKFJDVkRCRElfSlVNQk9fQkQgKyBURzNfQkRJTkZPX05JQ19BRERSLAorCQkJICAgICBOSUNfU1JBTV9SWF9KVU1CT19CVUZGRVJfREVTQyk7CisJCX0gZWxzZSB7CisJCQl0dzMyKFJDVkRCRElfSlVNQk9fQkQgKyBURzNfQkRJTkZPX01BWExFTl9GTEFHUywKKwkJCSAgICAgQkRJTkZPX0ZMQUdTX0RJU0FCTEVEKTsKKwkJfQorCisJfQorCisJLyogVGhlcmUgaXMgb25seSBvbmUgc2VuZCByaW5nIG9uIDU3MDUvNTc1MCwgbm8gbmVlZCB0byBleHBsaWNpdGx5CisJICogZGlzYWJsZSB0aGUgb3RoZXJzLgorCSAqLworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSkgeworCQkvKiBDbGVhciBvdXQgc2VuZCBSQ0IgcmluZyBpbiBTUkFNLiAqLworCQlmb3IgKGkgPSBOSUNfU1JBTV9TRU5EX1JDQjsgaSA8IE5JQ19TUkFNX1JDVl9SRVRfUkNCOyBpICs9IFRHM19CRElORk9fU0laRSkKKwkJCXRnM193cml0ZV9tZW0odHAsIGkgKyBURzNfQkRJTkZPX01BWExFTl9GTEFHUywKKwkJCQkgICAgICBCRElORk9fRkxBR1NfRElTQUJMRUQpOworCX0KKworCXRwLT50eF9wcm9kID0gMDsKKwl0cC0+dHhfY29ucyA9IDA7CisJdHczMl9tYWlsYm94KE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1csIDApOworCXR3MzJfdHhfbWJveChNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1csIDApOworCisJdGczX3NldF9iZGluZm8odHAsIE5JQ19TUkFNX1NFTkRfUkNCLAorCQkgICAgICAgdHAtPnR4X2Rlc2NfbWFwcGluZywKKwkJICAgICAgIChURzNfVFhfUklOR19TSVpFIDw8CisJCQlCRElORk9fRkxBR1NfTUFYTEVOX1NISUZUKSwKKwkJICAgICAgIE5JQ19TUkFNX1RYX0JVRkZFUl9ERVNDKTsKKworCS8qIFRoZXJlIGlzIG9ubHkgb25lIHJlY2VpdmUgcmV0dXJuIHJpbmcgb24gNTcwNS81NzUwLCBubyBuZWVkCisJICogdG8gZXhwbGljaXRseSBkaXNhYmxlIHRoZSBvdGhlcnMuCisJICovCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CisJCWZvciAoaSA9IE5JQ19TUkFNX1JDVl9SRVRfUkNCOyBpIDwgTklDX1NSQU1fU1RBVFNfQkxLOworCQkgICAgIGkgKz0gVEczX0JESU5GT19TSVpFKSB7CisJCQl0ZzNfd3JpdGVfbWVtKHRwLCBpICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MsCisJCQkJICAgICAgQkRJTkZPX0ZMQUdTX0RJU0FCTEVEKTsKKwkJfQorCX0KKworCXRwLT5yeF9yY2JfcHRyID0gMDsKKwl0dzMyX3J4X21ib3goTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1csIDApOworCisJdGczX3NldF9iZGluZm8odHAsIE5JQ19TUkFNX1JDVl9SRVRfUkNCLAorCQkgICAgICAgdHAtPnJ4X3JjYl9tYXBwaW5nLAorCQkgICAgICAgKFRHM19SWF9SQ0JfUklOR19TSVpFKHRwKSA8PAorCQkJQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVCksCisJCSAgICAgICAwKTsKKworCXRwLT5yeF9zdGRfcHRyID0gdHAtPnJ4X3BlbmRpbmc7CisJdHczMl9yeF9tYm94KE1BSUxCT1hfUkNWX1NURF9QUk9EX0lEWCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkgICAgIHRwLT5yeF9zdGRfcHRyKTsKKworCXRwLT5yeF9qdW1ib19wdHIgPSAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0pVTUJPX0VOQUJMRSkgPworCQkJCQkJdHAtPnJ4X2p1bWJvX3BlbmRpbmcgOiAwOworCXR3MzJfcnhfbWJveChNQUlMQk9YX1JDVl9KVU1CT19QUk9EX0lEWCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkgICAgIHRwLT5yeF9qdW1ib19wdHIpOworCisJLyogSW5pdGlhbGl6ZSBNQUMgYWRkcmVzcyBhbmQgYmFja29mZiBzZWVkLiAqLworCV9fdGczX3NldF9tYWNfYWRkcih0cCk7CisKKwkvKiBNVFUgKyBldGhlcm5ldCBoZWFkZXIgKyBGQ1MgKyBvcHRpb25hbCBWTEFOIHRhZyAqLworCXR3MzIoTUFDX1JYX01UVV9TSVpFLCB0cC0+ZGV2LT5tdHUgKyBFVEhfSExFTiArIDgpOworCisJLyogVGhlIHNsb3QgdGltZSBpcyBjaGFuZ2VkIGJ5IHRnM19zZXR1cF9waHkgaWYgd2UKKwkgKiBydW4gYXQgZ2lnYWJpdCB3aXRoIGhhbGYgZHVwbGV4LgorCSAqLworCXR3MzIoTUFDX1RYX0xFTkdUSFMsCisJICAgICAoMiA8PCBUWF9MRU5HVEhTX0lQR19DUlNfU0hJRlQpIHwKKwkgICAgICg2IDw8IFRYX0xFTkdUSFNfSVBHX1NISUZUKSB8CisJICAgICAoMzIgPDwgVFhfTEVOR1RIU19TTE9UX1RJTUVfU0hJRlQpKTsKKworCS8qIFJlY2VpdmUgcnVsZXMuICovCisJdHczMihNQUNfUkNWX1JVTEVfQ0ZHLCBSQ1ZfUlVMRV9DRkdfREVGQVVMVF9DTEFTUyk7CisJdHczMihSQ1ZMUENfQ09ORklHLCAweDAxODEpOworCisJLyogQ2FsY3VsYXRlIFJETUFDX01PREUgc2V0dGluZyBlYXJseSwgd2UgbmVlZCBpdCB0byBkZXRlcm1pbmUKKwkgKiB0aGUgUkNWTFBDX1NUQVRFX0VOQUJMRSBtYXNrLgorCSAqLworCXJkbWFjX21vZGUgPSAoUkRNQUNfTU9ERV9FTkFCTEUgfCBSRE1BQ19NT0RFX1RHVEFCT1JUX0VOQUIgfAorCQkgICAgICBSRE1BQ19NT0RFX01TVEFCT1JUX0VOQUIgfCBSRE1BQ19NT0RFX1BBUklUWUVSUl9FTkFCIHwKKwkJICAgICAgUkRNQUNfTU9ERV9BRERST0ZMT1dfRU5BQiB8IFJETUFDX01PREVfRklGT09GTE9XX0VOQUIgfAorCQkgICAgICBSRE1BQ19NT0RFX0ZJRk9VUlVOX0VOQUIgfCBSRE1BQ19NT0RFX0ZJRk9PUkVBRF9FTkFCIHwKKwkJICAgICAgUkRNQUNfTU9ERV9MTkdSRUFEX0VOQUIpOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfU1BMSVRfTU9ERSkKKwkJcmRtYWNfbW9kZSB8PSBSRE1BQ19NT0RFX1NQTElUX0VOQUJMRTsKKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1ICYmCisJICAgICB0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTcwNV9BMCkgfHwKKwkgICAgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKSkgeworCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9UU09fQ0FQQUJMRSAmJgorCQkgICAgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA1X0ExIHx8CisJCSAgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDVfQTIpKSB7CisJCQlyZG1hY19tb2RlIHw9IFJETUFDX01PREVfRklGT19TSVpFXzEyODsKKwkJfSBlbHNlIGlmICghKHRyMzIoVEczUENJX1BDSVNUQVRFKSAmIFBDSVNUQVRFX0JVU19TUEVFRF9ISUdIKSAmJgorCQkJICAgISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0lTXzU3ODgpKSB7CisJCQlyZG1hY19tb2RlIHw9IFJETUFDX01PREVfRklGT19MT05HX0JVUlNUOworCQl9CisJfQorCisjaWYgVEczX1RTT19TVVBQT1JUICE9IDAKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU08pCisJCXJkbWFjX21vZGUgfD0gKDEgPDwgMjcpOworI2VuZGlmCisKKwkvKiBSZWNlaXZlL3NlbmQgc3RhdGlzdGljcy4gKi8KKwlpZiAoKHJkbWFjX21vZGUgJiBSRE1BQ19NT0RFX0ZJRk9fU0laRV8xMjgpICYmCisJICAgICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1RTT19DQVBBQkxFKSkgeworCQl2YWwgPSB0cjMyKFJDVkxQQ19TVEFUU19FTkFCTEUpOworCQl2YWwgJj0gflJDVkxQQ19TVEFUU0VOQUJfTE5HQlJTVF9SRklYOworCQl0dzMyKFJDVkxQQ19TVEFUU19FTkFCTEUsIHZhbCk7CisJfSBlbHNlIHsKKwkJdHczMihSQ1ZMUENfU1RBVFNfRU5BQkxFLCAweGZmZmZmZik7CisJfQorCXR3MzIoUkNWTFBDX1NUQVRTQ1RSTCwgUkNWTFBDX1NUQVRTQ1RSTF9FTkFCTEUpOworCXR3MzIoU05EREFUQUlfU1RBVFNFTkFCLCAweGZmZmZmZik7CisJdHczMihTTkREQVRBSV9TVEFUU0NUUkwsCisJICAgICAoU05EREFUQUlfU0NUUkxfRU5BQkxFIHwKKwkgICAgICBTTkREQVRBSV9TQ1RSTF9GQVNUVVBEKSk7CisKKwkvKiBTZXR1cCBob3N0IGNvYWxlc2NpbmcgZW5naW5lLiAqLworCXR3MzIoSE9TVENDX01PREUsIDApOworCWZvciAoaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKwkJaWYgKCEodHIzMihIT1NUQ0NfTU9ERSkgJiBIT1NUQ0NfTU9ERV9FTkFCTEUpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCisJdHczMihIT1NUQ0NfUlhDT0xfVElDS1MsIDApOworCXR3MzIoSE9TVENDX1RYQ09MX1RJQ0tTLCBMT1dfVFhDT0xfVElDS1MpOworCXR3MzIoSE9TVENDX1JYTUFYX0ZSQU1FUywgMSk7CisJdHczMihIT1NUQ0NfVFhNQVhfRlJBTUVTLCBMT1dfUlhNQVhfRlJBTUVTKTsKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpIHsKKwkJdHczMihIT1NUQ0NfUlhDT0FMX1RJQ0tfSU5ULCAwKTsKKwkJdHczMihIT1NUQ0NfVFhDT0FMX1RJQ0tfSU5ULCAwKTsKKwl9CisJdHczMihIT1NUQ0NfUlhDT0FMX01BWEZfSU5ULCAxKTsKKwl0dzMyKEhPU1RDQ19UWENPQUxfTUFYRl9JTlQsIDApOworCisJLyogc2V0IHN0YXR1cyBibG9jayBETUEgYWRkcmVzcyAqLworCXR3MzIoSE9TVENDX1NUQVRVU19CTEtfSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19ISUdILAorCSAgICAgKCh1NjQpIHRwLT5zdGF0dXNfbWFwcGluZyA+PiAzMikpOworCXR3MzIoSE9TVENDX1NUQVRVU19CTEtfSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19MT1csCisJICAgICAoKHU2NCkgdHAtPnN0YXR1c19tYXBwaW5nICYgMHhmZmZmZmZmZikpOworCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CisJCS8qIFN0YXR1cy9zdGF0aXN0aWNzIGJsb2NrIGFkZHJlc3MuICBTZWUgdGczX3RpbWVyLAorCQkgKiB0aGUgdGczX3BlcmlvZGljX2ZldGNoX3N0YXRzIGNhbGwgdGhlcmUsIGFuZAorCQkgKiB0ZzNfZ2V0X3N0YXRzIHRvIHNlZSBob3cgdGhpcyB3b3JrcyBmb3IgNTcwNS81NzUwIGNoaXBzLgorCQkgKi8KKwkJdHczMihIT1NUQ0NfU1RBVF9DT0FMX1RJQ0tTLAorCQkgICAgIERFRkFVTFRfU1RBVF9DT0FMX1RJQ0tTKTsKKwkJdHczMihIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfSElHSCwKKwkJICAgICAoKHU2NCkgdHAtPnN0YXRzX21hcHBpbmcgPj4gMzIpKTsKKwkJdHczMihIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfTE9XLAorCQkgICAgICgodTY0KSB0cC0+c3RhdHNfbWFwcGluZyAmIDB4ZmZmZmZmZmYpKTsKKwkJdHczMihIT1NUQ0NfU1RBVFNfQkxLX05JQ19BRERSLCBOSUNfU1JBTV9TVEFUU19CTEspOworCQl0dzMyKEhPU1RDQ19TVEFUVVNfQkxLX05JQ19BRERSLCBOSUNfU1JBTV9TVEFUVVNfQkxLKTsKKwl9CisKKwl0dzMyKEhPU1RDQ19NT0RFLCBIT1NUQ0NfTU9ERV9FTkFCTEUgfCB0cC0+Y29hbGVzY2VfbW9kZSk7CisKKwl0dzMyKFJDVkNDX01PREUsIFJDVkNDX01PREVfRU5BQkxFIHwgUkNWQ0NfTU9ERV9BVFROX0VOQUJMRSk7CisJdHczMihSQ1ZMUENfTU9ERSwgUkNWTFBDX01PREVfRU5BQkxFKTsKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpCisJCXR3MzIoUkNWTFNDX01PREUsIFJDVkxTQ19NT0RFX0VOQUJMRSB8IFJDVkxTQ19NT0RFX0FUVE5fRU5BQkxFKTsKKworCS8qIENsZWFyIHN0YXRpc3RpY3Mvc3RhdHVzIGJsb2NrIGluIGNoaXAsIGFuZCBzdGF0dXMgYmxvY2sgaW4gcmFtLiAqLworCWZvciAoaSA9IE5JQ19TUkFNX1NUQVRTX0JMSzsKKwkgICAgIGkgPCBOSUNfU1JBTV9TVEFUVVNfQkxLICsgVEczX0hXX1NUQVRVU19TSVpFOworCSAgICAgaSArPSBzaXplb2YodTMyKSkgeworCQl0ZzNfd3JpdGVfbWVtKHRwLCBpLCAwKTsKKwkJdWRlbGF5KDQwKTsKKwl9CisJbWVtc2V0KHRwLT5od19zdGF0dXMsIDAsIFRHM19IV19TVEFUVVNfU0laRSk7CisKKwl0cC0+bWFjX21vZGUgPSBNQUNfTU9ERV9UWFNUQVRfRU5BQkxFIHwgTUFDX01PREVfUlhTVEFUX0VOQUJMRSB8CisJCU1BQ19NT0RFX1RERV9FTkFCTEUgfCBNQUNfTU9ERV9SREVfRU5BQkxFIHwgTUFDX01PREVfRkhERV9FTkFCTEU7CisJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUgfCBNQUNfTU9ERV9SWFNUQVRfQ0xFQVIgfCBNQUNfTU9ERV9UWFNUQVRfQ0xFQVIpOworCXVkZWxheSg0MCk7CisKKwl0cC0+Z3JjX2xvY2FsX2N0cmwgPSBHUkNfTENMQ1RSTF9JTlRfT05fQVRUTiB8IEdSQ19MQ0xDVFJMX0FVVE9fU0VFUFJPTTsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDApCisJCXRwLT5ncmNfbG9jYWxfY3RybCB8PSAoR1JDX0xDTENUUkxfR1BJT19PRTEgfAorCQkJCSAgICAgICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDEpOworCXR3MzJfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsKTsKKwl1ZGVsYXkoMTAwKTsKKworCXR3MzJfbWFpbGJveChNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1csIDApOworCXRyMzIoTUFJTEJPWF9JTlRFUlJVUFRfMCk7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpIHsKKwkJdHczMl9mKERNQUNfTU9ERSwgRE1BQ19NT0RFX0VOQUJMRSk7CisJCXVkZWxheSg0MCk7CisJfQorCisJdmFsID0gKFdETUFDX01PREVfRU5BQkxFIHwgV0RNQUNfTU9ERV9UR1RBQk9SVF9FTkFCIHwKKwkgICAgICAgV0RNQUNfTU9ERV9NU1RBQk9SVF9FTkFCIHwgV0RNQUNfTU9ERV9QQVJJVFlFUlJfRU5BQiB8CisJICAgICAgIFdETUFDX01PREVfQUREUk9GTE9XX0VOQUIgfCBXRE1BQ19NT0RFX0ZJRk9PRkxPV19FTkFCIHwKKwkgICAgICAgV0RNQUNfTU9ERV9GSUZPVVJVTl9FTkFCIHwgV0RNQUNfTU9ERV9GSUZPT1JFQURfRU5BQiB8CisJICAgICAgIFdETUFDX01PREVfTE5HUkVBRF9FTkFCKTsKKworCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUgJiYKKwkgICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzA1X0EwKSB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkgeworCQlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxHMl9UU09fQ0FQQUJMRSkgJiYKKwkJICAgICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNV9BMSB8fAorCQkgICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA1X0EyKSkgeworCQkJLyogbm90aGluZyAqLworCQl9IGVsc2UgaWYgKCEodHIzMihURzNQQ0lfUENJU1RBVEUpICYgUENJU1RBVEVfQlVTX1NQRUVEX0hJR0gpICYmCisJCQkgICAhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSVNfNTc4OCkgJiYKKwkJCSAgICEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykpIHsKKwkJCXZhbCB8PSBXRE1BQ19NT0RFX1JYX0FDQ0VMOworCQl9CisJfQorCisJdHczMl9mKFdETUFDX01PREUsIHZhbCk7CisJdWRlbGF5KDQwKTsKKworCWlmICgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkgIT0gMCkgeworCQl2YWwgPSB0cjMyKFRHM1BDSV9YX0NBUFMpOworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMpIHsKKwkJCXZhbCAmPSB+UENJWF9DQVBTX0JVUlNUX01BU0s7CisJCQl2YWwgfD0gKFBDSVhfQ0FQU19NQVhfQlVSU1RfQ1BJT0IgPDwgUENJWF9DQVBTX0JVUlNUX1NISUZUKTsKKwkJfSBlbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkgeworCQkJdmFsICY9IH4oUENJWF9DQVBTX1NQTElUX01BU0sgfCBQQ0lYX0NBUFNfQlVSU1RfTUFTSyk7CisJCQl2YWwgfD0gKFBDSVhfQ0FQU19NQVhfQlVSU1RfQ1BJT0IgPDwgUENJWF9DQVBTX0JVUlNUX1NISUZUKTsKKwkJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfU1BMSVRfTU9ERSkKKwkJCQl2YWwgfD0gKHRwLT5zcGxpdF9tb2RlX21heF9yZXFzIDw8CisJCQkJCVBDSVhfQ0FQU19TUExJVF9TSElGVCk7CisJCX0KKwkJdHczMihURzNQQ0lfWF9DQVBTLCB2YWwpOworCX0KKworCXR3MzJfZihSRE1BQ19NT0RFLCByZG1hY19tb2RlKTsKKwl1ZGVsYXkoNDApOworCisJdHczMihSQ1ZEQ0NfTU9ERSwgUkNWRENDX01PREVfRU5BQkxFIHwgUkNWRENDX01PREVfQVRUTl9FTkFCTEUpOworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSkKKwkJdHczMihNQkZSRUVfTU9ERSwgTUJGUkVFX01PREVfRU5BQkxFKTsKKwl0dzMyKFNORERBVEFDX01PREUsIFNORERBVEFDX01PREVfRU5BQkxFKTsKKwl0dzMyKFNOREJEQ19NT0RFLCBTTkRCRENfTU9ERV9FTkFCTEUgfCBTTkRCRENfTU9ERV9BVFROX0VOQUJMRSk7CisJdHczMihSQ1ZCRElfTU9ERSwgUkNWQkRJX01PREVfRU5BQkxFIHwgUkNWQkRJX01PREVfUkNCX0FUVE5fRU5BQik7CisJdHczMihSQ1ZEQkRJX01PREUsIFJDVkRCRElfTU9ERV9FTkFCTEUgfCBSQ1ZEQkRJX01PREVfSU5WX1JJTkdfU1opOworCXR3MzIoU05EREFUQUlfTU9ERSwgU05EREFUQUlfTU9ERV9FTkFCTEUpOworI2lmIFRHM19UU09fU1VQUE9SVCAhPSAwCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSFdfVFNPKQorCQl0dzMyKFNORERBVEFJX01PREUsIFNORERBVEFJX01PREVfRU5BQkxFIHwgMHg4KTsKKyNlbmRpZgorCXR3MzIoU05EQkRJX01PREUsIFNOREJESV9NT0RFX0VOQUJMRSB8IFNOREJESV9NT0RFX0FUVE5fRU5BQkxFKTsKKwl0dzMyKFNOREJEU19NT0RFLCBTTkRCRFNfTU9ERV9FTkFCTEUgfCBTTkRCRFNfTU9ERV9BVFROX0VOQUJMRSk7CisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQTApIHsKKwkJZXJyID0gdGczX2xvYWRfNTcwMV9hMF9maXJtd2FyZV9maXgodHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKyNpZiBURzNfVFNPX1NVUFBPUlQgIT0gMAorCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1RTT19DQVBBQkxFKSB7CisJCWVyciA9IHRnM19sb2FkX3Rzb19maXJtd2FyZSh0cCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKyNlbmRpZgorCisJdHAtPnR4X21vZGUgPSBUWF9NT0RFX0VOQUJMRTsKKwl0dzMyX2YoTUFDX1RYX01PREUsIHRwLT50eF9tb2RlKTsKKwl1ZGVsYXkoMTAwKTsKKworCXRwLT5yeF9tb2RlID0gUlhfTU9ERV9FTkFCTEU7CisJdHczMl9mKE1BQ19SWF9NT0RFLCB0cC0+cnhfbW9kZSk7CisJdWRlbGF5KDEwKTsKKworCWlmICh0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlcikgeworCQl0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlciA9IDA7CisJCXRwLT5saW5rX2NvbmZpZy5zcGVlZCA9IHRwLT5saW5rX2NvbmZpZy5vcmlnX3NwZWVkOworCQl0cC0+bGlua19jb25maWcuZHVwbGV4ID0gdHAtPmxpbmtfY29uZmlnLm9yaWdfZHVwbGV4OworCQl0cC0+bGlua19jb25maWcuYXV0b25lZyA9IHRwLT5saW5rX2NvbmZpZy5vcmlnX2F1dG9uZWc7CisJfQorCisJdHAtPm1pX21vZGUgPSBNQUNfTUlfTU9ERV9CQVNFOworCXR3MzJfZihNQUNfTUlfTU9ERSwgdHAtPm1pX21vZGUpOworCXVkZWxheSg4MCk7CisKKwl0dzMyKE1BQ19MRURfQ1RSTCwgdHAtPmxlZF9jdHJsKTsKKworCXR3MzIoTUFDX01JX1NUQVQsIE1BQ19NSV9TVEFUX0xOS1NUQVRfQVRUTl9FTkFCKTsKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSB7CisJCXR3MzJfZihNQUNfUlhfTU9ERSwgUlhfTU9ERV9SRVNFVCk7CisJCXVkZWxheSgxMCk7CisJfQorCXR3MzJfZihNQUNfUlhfTU9ERSwgdHAtPnJ4X21vZGUpOworCXVkZWxheSgxMCk7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSB7CisJCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpICYmCisJCQkhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfU0VSREVTX1BSRUVNUEhBU0lTKSkgeworCQkJLyogU2V0IGRyaXZlIHRyYW5zbWlzc2lvbiBsZXZlbCB0byAxLjJWICAqLworCQkJLyogb25seSBpZiB0aGUgc2lnbmFsIHByZS1lbXBoYXNpcyBiaXQgaXMgbm90IHNldCAgKi8KKwkJCXZhbCA9IHRyMzIoTUFDX1NFUkRFU19DRkcpOworCQkJdmFsICY9IDB4ZmZmZmYwMDA7CisJCQl2YWwgfD0gMHg4ODA7CisJCQl0dzMyKE1BQ19TRVJERVNfQ0ZHLCB2YWwpOworCQl9CisJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwM19BMSkKKwkJCXR3MzIoTUFDX1NFUkRFU19DRkcsIDB4NjE2MDAwKTsKKwl9CisKKwkvKiBQcmV2ZW50IGNoaXAgZnJvbSBkcm9wcGluZyBmcmFtZXMgd2hlbiBmbG93IGNvbnRyb2wKKwkgKiBpcyBlbmFibGVkLgorCSAqLworCXR3MzJfZihNQUNfTE9XX1dNQVJLX01BWF9SWF9GUkFNRSwgMik7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQgJiYKKwkgICAgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykpIHsKKwkJLyogVXNlIGhhcmR3YXJlIGxpbmsgYXV0by1uZWdvdGlhdGlvbiAqLworCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9IV19BVVRPTkVHOworCX0KKworCWVyciA9IHRnM19zZXR1cF9waHkodHAsIDEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpKSB7CisJCXUzMiB0bXA7CisKKwkJLyogQ2xlYXIgQ1JDIHN0YXRzLiAqLworCQlpZiAoIXRnM19yZWFkcGh5KHRwLCAweDFlLCAmdG1wKSkgeworCQkJdGczX3dyaXRlcGh5KHRwLCAweDFlLCB0bXAgfCAweDgwMDApOworCQkJdGczX3JlYWRwaHkodHAsIDB4MTQsICZ0bXApOworCQl9CisJfQorCisJX190ZzNfc2V0X3J4X21vZGUodHAtPmRldik7CisKKwkvKiBJbml0aWFsaXplIHJlY2VpdmUgcnVsZXMuICovCisJdHczMihNQUNfUkNWX1JVTEVfMCwgIDB4YzIwMDAwMDAgJiBSQ1ZfUlVMRV9ESVNBQkxFX01BU0spOworCXR3MzIoTUFDX1JDVl9WQUxVRV8wLCAweGZmZmZmZmZmICYgUkNWX1JVTEVfRElTQUJMRV9NQVNLKTsKKwl0dzMyKE1BQ19SQ1ZfUlVMRV8xLCAgMHg4NjAwMDAwNCAmIFJDVl9SVUxFX0RJU0FCTEVfTUFTSyk7CisJdHczMihNQUNfUkNWX1ZBTFVFXzEsIDB4ZmZmZmZmZmYgJiBSQ1ZfUlVMRV9ESVNBQkxFX01BU0spOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKQorCQlsaW1pdCA9IDg7CisJZWxzZQorCQlsaW1pdCA9IDE2OworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikKKwkJbGltaXQgLT0gNDsKKwlzd2l0Y2ggKGxpbWl0KSB7CisJY2FzZSAxNjoKKwkJdHczMihNQUNfUkNWX1JVTEVfMTUsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzE1LCAgMCk7CisJY2FzZSAxNToKKwkJdHczMihNQUNfUkNWX1JVTEVfMTQsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzE0LCAgMCk7CisJY2FzZSAxNDoKKwkJdHczMihNQUNfUkNWX1JVTEVfMTMsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzEzLCAgMCk7CisJY2FzZSAxMzoKKwkJdHczMihNQUNfUkNWX1JVTEVfMTIsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzEyLCAgMCk7CisJY2FzZSAxMjoKKwkJdHczMihNQUNfUkNWX1JVTEVfMTEsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzExLCAgMCk7CisJY2FzZSAxMToKKwkJdHczMihNQUNfUkNWX1JVTEVfMTAsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzEwLCAgMCk7CisJY2FzZSAxMDoKKwkJdHczMihNQUNfUkNWX1JVTEVfOSwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfOSwgIDApOworCWNhc2UgOToKKwkJdHczMihNQUNfUkNWX1JVTEVfOCwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfOCwgIDApOworCWNhc2UgODoKKwkJdHczMihNQUNfUkNWX1JVTEVfNywgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfNywgIDApOworCWNhc2UgNzoKKwkJdHczMihNQUNfUkNWX1JVTEVfNiwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfNiwgIDApOworCWNhc2UgNjoKKwkJdHczMihNQUNfUkNWX1JVTEVfNSwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfNSwgIDApOworCWNhc2UgNToKKwkJdHczMihNQUNfUkNWX1JVTEVfNCwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfNCwgIDApOworCWNhc2UgNDoKKwkJLyogdHczMihNQUNfUkNWX1JVTEVfMywgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMywgIDApOyAqLworCWNhc2UgMzoKKwkJLyogdHczMihNQUNfUkNWX1JVTEVfMiwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMiwgIDApOyAqLworCWNhc2UgMjoKKwljYXNlIDE6CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9OworCisJdGczX3dyaXRlX3NpZ19wb3N0X3Jlc2V0KHRwLCBSRVNFVF9LSU5EX0lOSVQpOworCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKQorCQl0ZzNfZW5hYmxlX2ludHModHApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCBhdCBkZXZpY2Ugb3BlbiB0aW1lIHRvIGdldCB0aGUgY2hpcCByZWFkeSBmb3IKKyAqIHBhY2tldCBwcm9jZXNzaW5nLiAgSW52b2tlZCB3aXRoIHRwLT5sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgdGczX2luaXRfaHcoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGVycjsKKworCS8qIEZvcmNlIHRoZSBjaGlwIGludG8gRDAuICovCisJZXJyID0gdGczX3NldF9wb3dlcl9zdGF0ZSh0cCwgMCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwl0ZzNfc3dpdGNoX2Nsb2Nrcyh0cCk7CisKKwl0dzMyKFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUiwgMCk7CisKKwllcnIgPSB0ZzNfcmVzZXRfaHcodHApOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworI2RlZmluZSBURzNfU1RBVF9BREQzMihQU1RBVCwgUkVHKSBcCitkbyB7CXUzMiBfX3ZhbCA9IHRyMzIoUkVHKTsgXAorCShQU1RBVCktPmxvdyArPSBfX3ZhbDsgXAorCWlmICgoUFNUQVQpLT5sb3cgPCBfX3ZhbCkgXAorCQkoUFNUQVQpLT5oaWdoICs9IDE7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIHRnM19wZXJpb2RpY19mZXRjaF9zdGF0cyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgdGczX2h3X3N0YXRzICpzcCA9IHRwLT5od19zdGF0czsKKworCWlmICghbmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSkKKwkJcmV0dXJuOworCisJVEczX1NUQVRfQUREMzIoJnNwLT50eF9vY3RldHMsIE1BQ19UWF9TVEFUU19PQ1RFVFMpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfY29sbGlzaW9ucywgTUFDX1RYX1NUQVRTX0NPTExJU0lPTlMpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfeG9uX3NlbnQsIE1BQ19UWF9TVEFUU19YT05fU0VOVCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF94b2ZmX3NlbnQsIE1BQ19UWF9TVEFUU19YT0ZGX1NFTlQpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfbWFjX2Vycm9ycywgTUFDX1RYX1NUQVRTX01BQ19FUlJPUlMpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfc2luZ2xlX2NvbGxpc2lvbnMsIE1BQ19UWF9TVEFUU19TSU5HTEVfQ09MTElTSU9OUyk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF9tdWx0X2NvbGxpc2lvbnMsIE1BQ19UWF9TVEFUU19NVUxUX0NPTExJU0lPTlMpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfZGVmZXJyZWQsIE1BQ19UWF9TVEFUU19ERUZFUlJFRCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF9leGNlc3NpdmVfY29sbGlzaW9ucywgTUFDX1RYX1NUQVRTX0VYQ0VTU0lWRV9DT0wpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfbGF0ZV9jb2xsaXNpb25zLCBNQUNfVFhfU1RBVFNfTEFURV9DT0wpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfdWNhc3RfcGFja2V0cywgTUFDX1RYX1NUQVRTX1VDQVNUKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnR4X21jYXN0X3BhY2tldHMsIE1BQ19UWF9TVEFUU19NQ0FTVCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF9iY2FzdF9wYWNrZXRzLCBNQUNfVFhfU1RBVFNfQkNBU1QpOworCisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF9vY3RldHMsIE1BQ19SWF9TVEFUU19PQ1RFVFMpOworCVRHM19TVEFUX0FERDMyKCZzcC0+cnhfZnJhZ21lbnRzLCBNQUNfUlhfU1RBVFNfRlJBR01FTlRTKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnJ4X3VjYXN0X3BhY2tldHMsIE1BQ19SWF9TVEFUU19VQ0FTVCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF9tY2FzdF9wYWNrZXRzLCBNQUNfUlhfU1RBVFNfTUNBU1QpOworCVRHM19TVEFUX0FERDMyKCZzcC0+cnhfYmNhc3RfcGFja2V0cywgTUFDX1JYX1NUQVRTX0JDQVNUKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnJ4X2Zjc19lcnJvcnMsIE1BQ19SWF9TVEFUU19GQ1NfRVJST1JTKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnJ4X2FsaWduX2Vycm9ycywgTUFDX1JYX1NUQVRTX0FMSUdOX0VSUk9SUyk7CisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF94b25fcGF1c2VfcmN2ZCwgTUFDX1JYX1NUQVRTX1hPTl9QQVVTRV9SRUNWRCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF94b2ZmX3BhdXNlX3JjdmQsIE1BQ19SWF9TVEFUU19YT0ZGX1BBVVNFX1JFQ1ZEKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnJ4X21hY19jdHJsX3JjdmQsIE1BQ19SWF9TVEFUU19NQUNfQ1RSTF9SRUNWRCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF94b2ZmX2VudGVyZWQsIE1BQ19SWF9TVEFUU19YT0ZGX0VOVEVSRUQpOworCVRHM19TVEFUX0FERDMyKCZzcC0+cnhfZnJhbWVfdG9vX2xvbmdfZXJyb3JzLCBNQUNfUlhfU1RBVFNfRlJBTUVfVE9PX0xPTkcpOworCVRHM19TVEFUX0FERDMyKCZzcC0+cnhfamFiYmVycywgTUFDX1JYX1NUQVRTX0pBQkJFUlMpOworCVRHM19TVEFUX0FERDMyKCZzcC0+cnhfdW5kZXJzaXplX3BhY2tldHMsIE1BQ19SWF9TVEFUU19VTkRFUlNJWkUpOworfQorCitzdGF0aWMgdm9pZCB0ZzNfdGltZXIodW5zaWduZWQgbG9uZyBfX29wYXF1ZSkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IChzdHJ1Y3QgdGczICopIF9fb3BhcXVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKworCS8qIEFsbCBvZiB0aGlzIGdhcmJhZ2UgaXMgYmVjYXVzZSB3aGVuIHVzaW5nIG5vbi10YWdnZWQKKwkgKiBJUlEgc3RhdHVzIHRoZSBtYWlsYm94L3N0YXR1c19ibG9jayBwcm90b2NvbCB0aGUgY2hpcAorCSAqIHVzZXMgd2l0aCB0aGUgY3B1IGlzIHJhY2UgcHJvbmUuCisJICovCisJaWYgKHRwLT5od19zdGF0dXMtPnN0YXR1cyAmIFNEX1NUQVRVU19VUERBVEVEKSB7CisJCXR3MzIoR1JDX0xPQ0FMX0NUUkwsCisJCSAgICAgdHAtPmdyY19sb2NhbF9jdHJsIHwgR1JDX0xDTENUUkxfU0VUSU5UKTsKKwl9IGVsc2UgeworCQl0dzMyKEhPU1RDQ19NT0RFLCB0cC0+Y29hbGVzY2VfbW9kZSB8CisJCSAgICAgKEhPU1RDQ19NT0RFX0VOQUJMRSB8IEhPU1RDQ19NT0RFX05PVykpOworCX0KKworCWlmICghKHRyMzIoV0RNQUNfTU9ERSkgJiBXRE1BQ19NT0RFX0VOQUJMRSkpIHsKKwkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfUkVTVEFSVF9USU1FUjsKKwkJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwkJc2NoZWR1bGVfd29yaygmdHAtPnJlc2V0X3Rhc2spOworCQlyZXR1cm47CisJfQorCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKQorCQl0ZzNfcGVyaW9kaWNfZmV0Y2hfc3RhdHModHApOworCisJLyogVGhpcyBwYXJ0IG9ubHkgcnVucyBvbmNlIHBlciBzZWNvbmQuICovCisJaWYgKCEtLXRwLT50aW1lcl9jb3VudGVyKSB7CisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHKSB7CisJCQl1MzIgbWFjX3N0YXQ7CisJCQlpbnQgcGh5X2V2ZW50OworCisJCQltYWNfc3RhdCA9IHRyMzIoTUFDX1NUQVRVUyk7CisKKwkJCXBoeV9ldmVudCA9IDA7CisJCQlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1VTRV9NSV9JTlRFUlJVUFQpIHsKKwkJCQlpZiAobWFjX3N0YXQgJiBNQUNfU1RBVFVTX01JX0lOVEVSUlVQVCkKKwkJCQkJcGh5X2V2ZW50ID0gMTsKKwkJCX0gZWxzZSBpZiAobWFjX3N0YXQgJiBNQUNfU1RBVFVTX0xOS1NUQVRFX0NIQU5HRUQpCisJCQkJcGh5X2V2ZW50ID0gMTsKKworCQkJaWYgKHBoeV9ldmVudCkKKwkJCQl0ZzNfc2V0dXBfcGh5KHRwLCAwKTsKKwkJfSBlbHNlIGlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUE9MTF9TRVJERVMpIHsKKwkJCXUzMiBtYWNfc3RhdCA9IHRyMzIoTUFDX1NUQVRVUyk7CisJCQlpbnQgbmVlZF9zZXR1cCA9IDA7CisKKwkJCWlmIChuZXRpZl9jYXJyaWVyX29rKHRwLT5kZXYpICYmCisJCQkgICAgKG1hY19zdGF0ICYgTUFDX1NUQVRVU19MTktTVEFURV9DSEFOR0VEKSkgeworCQkJCW5lZWRfc2V0dXAgPSAxOworCQkJfQorCQkJaWYgKCEgbmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSAmJgorCQkJICAgIChtYWNfc3RhdCAmIChNQUNfU1RBVFVTX1BDU19TWU5DRUQgfAorCQkJCQkgTUFDX1NUQVRVU19TSUdOQUxfREVUKSkpIHsKKwkJCQluZWVkX3NldHVwID0gMTsKKwkJCX0KKwkJCWlmIChuZWVkX3NldHVwKSB7CisJCQkJdHczMl9mKE1BQ19NT0RFLAorCQkJCSAgICAgKHRwLT5tYWNfbW9kZSAmCisJCQkJICAgICAgfk1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLKSk7CisJCQkJdWRlbGF5KDQwKTsKKwkJCQl0dzMyX2YoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisJCQkJdWRlbGF5KDQwKTsKKwkJCQl0ZzNfc2V0dXBfcGh5KHRwLCAwKTsKKwkJCX0KKwkJfQorCisJCXRwLT50aW1lcl9jb3VudGVyID0gdHAtPnRpbWVyX211bHRpcGxpZXI7CisJfQorCisJLyogSGVhcnRiZWF0IGlzIG9ubHkgc2VudCBvbmNlIGV2ZXJ5IDEyMCBzZWNvbmRzLiAgKi8KKwlpZiAoIS0tdHAtPmFzZl9jb3VudGVyKSB7CisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikgeworCQkJdTMyIHZhbDsKKworCQkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfQ01EX01CT1gsIEZXQ01EX05JQ0RSVl9BTElWRSk7CisJCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GV19DTURfTEVOX01CT1gsIDQpOworCQkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfQ01EX0RBVEFfTUJPWCwgMyk7CisJCQl2YWwgPSB0cjMyKEdSQ19SWF9DUFVfRVZFTlQpOworCQkJdmFsIHw9ICgxIDw8IDE0KTsKKwkJCXR3MzIoR1JDX1JYX0NQVV9FVkVOVCwgdmFsKTsKKwkJfQorCQl0cC0+YXNmX2NvdW50ZXIgPSB0cC0+YXNmX211bHRpcGxpZXI7CisJfQorCisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJdHAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgdHAtPnRpbWVyX29mZnNldDsKKwlhZGRfdGltZXIoJnRwLT50aW1lcik7Cit9CisKK3N0YXRpYyBpbnQgdGczX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKworCXRnM19kaXNhYmxlX2ludHModHApOworCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX0lOSVRfQ09NUExFVEU7CisKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJLyogVGhlIHBsYWNlbWVudCBvZiB0aGlzIGNhbGwgaXMgdGllZAorCSAqIHRvIHRoZSBzZXR1cCBhbmQgdXNlIG9mIEhvc3QgVFggZGVzY3JpcHRvcnMuCisJICovCisJZXJyID0gdGczX2FsbG9jX2NvbnNpc3RlbnQodHApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgdGczX2ludGVycnVwdCwKKwkJCSAgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKworCWlmIChlcnIpIHsKKwkJdGczX2ZyZWVfY29uc2lzdGVudCh0cCk7CisJCXJldHVybiBlcnI7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCisJZXJyID0gdGczX2luaXRfaHcodHApOworCWlmIChlcnIpIHsKKwkJdGczX2hhbHQodHApOworCQl0ZzNfZnJlZV9yaW5ncyh0cCk7CisJfSBlbHNlIHsKKwkJdHAtPnRpbWVyX29mZnNldCA9IEhaIC8gMTA7CisJCXRwLT50aW1lcl9jb3VudGVyID0gdHAtPnRpbWVyX211bHRpcGxpZXIgPSAxMDsKKwkJdHAtPmFzZl9jb3VudGVyID0gdHAtPmFzZl9tdWx0aXBsaWVyID0gKDEwICogMTIwKTsKKworCQlpbml0X3RpbWVyKCZ0cC0+dGltZXIpOworCQl0cC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0cC0+dGltZXJfb2Zmc2V0OworCQl0cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0cDsKKwkJdHAtPnRpbWVyLmZ1bmN0aW9uID0gdGczX3RpbWVyOworCQlhZGRfdGltZXIoJnRwLT50aW1lcik7CisKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19JTklUX0NPTVBMRVRFOworCX0KKworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwlpZiAoZXJyKSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQl0ZzNfZnJlZV9jb25zaXN0ZW50KHRwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisKKwl0ZzNfZW5hYmxlX2ludHModHApOworCisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKKy8qc3RhdGljKi8gdm9pZCB0ZzNfZHVtcF9zdGF0ZShzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgdmFsMzIsIHZhbDMyXzIsIHZhbDMyXzMsIHZhbDMyXzQsIHZhbDMyXzU7CisJdTE2IHZhbDE2OworCWludCBpOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQodHAtPnBkZXYsIFBDSV9TVEFUVVMsICZ2YWwxNik7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUENJU1RBVEUsICZ2YWwzMik7CisJcHJpbnRrKCJERUJVRzogUENJIHN0YXR1cyBbJTA0eF0gVEczUENJIHN0YXRlWyUwOHhdXG4iLAorCSAgICAgICB2YWwxNiwgdmFsMzIpOworCisJLyogTUFDIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogTUFDX01PREVbJTA4eF0gTUFDX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihNQUNfTU9ERSksIHRyMzIoTUFDX1NUQVRVUykpOworCXByaW50aygiICAgICAgIE1BQ19FVkVOVFslMDh4XSBNQUNfTEVEX0NUUkxbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoTUFDX0VWRU5UKSwgdHIzMihNQUNfTEVEX0NUUkwpKTsKKwlwcmludGsoIkRFQlVHOiBNQUNfVFhfTU9ERVslMDh4XSBNQUNfVFhfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKE1BQ19UWF9NT0RFKSwgdHIzMihNQUNfVFhfU1RBVFVTKSk7CisJcHJpbnRrKCIgICAgICAgTUFDX1JYX01PREVbJTA4eF0gTUFDX1JYX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihNQUNfUlhfTU9ERSksIHRyMzIoTUFDX1JYX1NUQVRVUykpOworCisJLyogU2VuZCBkYXRhIGluaXRpYXRvciBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogU05EREFUQUlfTU9ERVslMDh4XSBTTkREQVRBSV9TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoU05EREFUQUlfTU9ERSksIHRyMzIoU05EREFUQUlfU1RBVFVTKSk7CisJcHJpbnRrKCIgICAgICAgU05EREFUQUlfU1RBVFNDVFJMWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKFNORERBVEFJX1NUQVRTQ1RSTCkpOworCisJLyogU2VuZCBkYXRhIGNvbXBsZXRpb24gY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IFNORERBVEFDX01PREVbJTA4eF1cbiIsIHRyMzIoU05EREFUQUNfTU9ERSkpOworCisJLyogU2VuZCBCRCByaW5nIHNlbGVjdG9yIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogU05EQkRTX01PREVbJTA4eF0gU05EQkRTX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihTTkRCRFNfTU9ERSksIHRyMzIoU05EQkRTX1NUQVRVUykpOworCisJLyogU2VuZCBCRCBpbml0aWF0b3IgY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IFNOREJESV9NT0RFWyUwOHhdIFNOREJESV9TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoU05EQkRJX01PREUpLCB0cjMyKFNOREJESV9TVEFUVVMpKTsKKworCS8qIFNlbmQgQkQgY29tcGxldGlvbiBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogU05EQkRDX01PREVbJTA4eF1cbiIsIHRyMzIoU05EQkRDX01PREUpKTsKKworCS8qIFJlY2VpdmUgbGlzdCBwbGFjZW1lbnQgY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IFJDVkxQQ19NT0RFWyUwOHhdIFJDVkxQQ19TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoUkNWTFBDX01PREUpLCB0cjMyKFJDVkxQQ19TVEFUVVMpKTsKKwlwcmludGsoIiAgICAgICBSQ1ZMUENfU1RBVFNDVFJMWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKFJDVkxQQ19TVEFUU0NUUkwpKTsKKworCS8qIFJlY2VpdmUgZGF0YSBhbmQgcmVjZWl2ZSBCRCBpbml0aWF0b3IgY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IFJDVkRCRElfTU9ERVslMDh4XSBSQ1ZEQkRJX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX01PREUpLCB0cjMyKFJDVkRCRElfU1RBVFVTKSk7CisKKwkvKiBSZWNlaXZlIGRhdGEgY29tcGxldGlvbiBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogUkNWRENDX01PREVbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoUkNWRENDX01PREUpKTsKKworCS8qIFJlY2VpdmUgQkQgaW5pdGlhdG9yIGNvbnRyb2wgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBSQ1ZCRElfTU9ERVslMDh4XSBSQ1ZCRElfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKFJDVkJESV9NT0RFKSwgdHIzMihSQ1ZCRElfU1RBVFVTKSk7CisKKwkvKiBSZWNlaXZlIEJEIGNvbXBsZXRpb24gY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IFJDVkNDX01PREVbJTA4eF0gUkNWQ0NfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKFJDVkNDX01PREUpLCB0cjMyKFJDVkNDX1NUQVRVUykpOworCisJLyogUmVjZWl2ZSBsaXN0IHNlbGVjdG9yIGNvbnRyb2wgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBSQ1ZMU0NfTU9ERVslMDh4XSBSQ1ZMU0NfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKFJDVkxTQ19NT0RFKSwgdHIzMihSQ1ZMU0NfU1RBVFVTKSk7CisKKwkvKiBNYnVmIGNsdXN0ZXIgZnJlZSBibG9jayAqLworCXByaW50aygiREVCVUc6IE1CRlJFRV9NT0RFWyUwOHhdIE1CRlJFRV9TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoTUJGUkVFX01PREUpLCB0cjMyKE1CRlJFRV9TVEFUVVMpKTsKKworCS8qIEhvc3QgY29hbGVzY2luZyBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogSE9TVENDX01PREVbJTA4eF0gSE9TVENDX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihIT1NUQ0NfTU9ERSksIHRyMzIoSE9TVENDX1NUQVRVUykpOworCXByaW50aygiREVCVUc6IEhPU1RDQ19TVEFUU19CTEtfSE9TVF9BRERSWyUwOHglMDh4XVxuIiwKKwkgICAgICAgdHIzMihIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfSElHSCksCisJICAgICAgIHRyMzIoSE9TVENDX1NUQVRTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVykpOworCXByaW50aygiREVCVUc6IEhPU1RDQ19TVEFUVVNfQkxLX0hPU1RfQUREUlslMDh4JTA4eF1cbiIsCisJICAgICAgIHRyMzIoSE9TVENDX1NUQVRVU19CTEtfSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19ISUdIKSwKKwkgICAgICAgdHIzMihIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVykpOworCXByaW50aygiREVCVUc6IEhPU1RDQ19TVEFUU19CTEtfTklDX0FERFJbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoSE9TVENDX1NUQVRTX0JMS19OSUNfQUREUikpOworCXByaW50aygiREVCVUc6IEhPU1RDQ19TVEFUVVNfQkxLX05JQ19BRERSWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKEhPU1RDQ19TVEFUVVNfQkxLX05JQ19BRERSKSk7CisKKwkvKiBNZW1vcnkgYXJiaXRlciBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogTUVNQVJCX01PREVbJTA4eF0gTUVNQVJCX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihNRU1BUkJfTU9ERSksIHRyMzIoTUVNQVJCX1NUQVRVUykpOworCisJLyogQnVmZmVyIG1hbmFnZXIgY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IEJVRk1HUl9NT0RFWyUwOHhdIEJVRk1HUl9TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoQlVGTUdSX01PREUpLCB0cjMyKEJVRk1HUl9TVEFUVVMpKTsKKwlwcmludGsoIkRFQlVHOiBCVUZNR1JfTUJfUE9PTF9BRERSWyUwOHhdIEJVRk1HUl9NQl9QT09MX1NJWkVbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoQlVGTUdSX01CX1BPT0xfQUREUiksIHRyMzIoQlVGTUdSX01CX1BPT0xfU0laRSkpOworCXByaW50aygiREVCVUc6IEJVRk1HUl9ETUFfREVTQ19QT09MX0FERFJbJTA4eF0gIgorCSAgICAgICAiQlVGTUdSX0RNQV9ERVNDX1BPT0xfU0laRVslMDh4XVxuIiwKKwkgICAgICAgdHIzMihCVUZNR1JfRE1BX0RFU0NfUE9PTF9BRERSKSwKKwkgICAgICAgdHIzMihCVUZNR1JfRE1BX0RFU0NfUE9PTF9TSVpFKSk7CisKKwkvKiBSZWFkIERNQSBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogUkRNQUNfTU9ERVslMDh4XSBSRE1BQ19TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoUkRNQUNfTU9ERSksIHRyMzIoUkRNQUNfU1RBVFVTKSk7CisKKwkvKiBXcml0ZSBETUEgY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IFdETUFDX01PREVbJTA4eF0gV0RNQUNfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKFdETUFDX01PREUpLCB0cjMyKFdETUFDX1NUQVRVUykpOworCisJLyogRE1BIGNvbXBsZXRpb24gYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBETUFDX01PREVbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoRE1BQ19NT0RFKSk7CisKKwkvKiBHUkMgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBHUkNfTU9ERVslMDh4XSBHUkNfTUlTQ19DRkdbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoR1JDX01PREUpLCB0cjMyKEdSQ19NSVNDX0NGRykpOworCXByaW50aygiREVCVUc6IEdSQ19MT0NBTF9DVFJMWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKEdSQ19MT0NBTF9DVFJMKSk7CisKKwkvKiBURzNfQkRJTkZPcyAqLworCXByaW50aygiREVCVUc6IFJDVkRCRElfSlVNQk9fQkRbJTA4eCUwOHg6JTA4eDolMDh4XVxuIiwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX0pVTUJPX0JEICsgMHgwKSwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX0pVTUJPX0JEICsgMHg0KSwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX0pVTUJPX0JEICsgMHg4KSwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX0pVTUJPX0JEICsgMHhjKSk7CisJcHJpbnRrKCJERUJVRzogUkNWREJESV9TVERfQkRbJTA4eCUwOHg6JTA4eDolMDh4XVxuIiwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX1NURF9CRCArIDB4MCksCisJICAgICAgIHRyMzIoUkNWREJESV9TVERfQkQgKyAweDQpLAorCSAgICAgICB0cjMyKFJDVkRCRElfU1REX0JEICsgMHg4KSwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX1NURF9CRCArIDB4YykpOworCXByaW50aygiREVCVUc6IFJDVkRCRElfTUlOSV9CRFslMDh4JTA4eDolMDh4OiUwOHhdXG4iLAorCSAgICAgICB0cjMyKFJDVkRCRElfTUlOSV9CRCArIDB4MCksCisJICAgICAgIHRyMzIoUkNWREJESV9NSU5JX0JEICsgMHg0KSwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX01JTklfQkQgKyAweDgpLAorCSAgICAgICB0cjMyKFJDVkRCRElfTUlOSV9CRCArIDB4YykpOworCisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9TRU5EX1JDQiArIDB4MCwgJnZhbDMyKTsKKwl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX1NFTkRfUkNCICsgMHg0LCAmdmFsMzJfMik7CisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9TRU5EX1JDQiArIDB4OCwgJnZhbDMyXzMpOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fU0VORF9SQ0IgKyAweGMsICZ2YWwzMl80KTsKKwlwcmludGsoIkRFQlVHOiBTUkFNX1NFTkRfUkNCXzBbJTA4eCUwOHg6JTA4eDolMDh4XVxuIiwKKwkgICAgICAgdmFsMzIsIHZhbDMyXzIsIHZhbDMyXzMsIHZhbDMyXzQpOworCisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9SQ1ZfUkVUX1JDQiArIDB4MCwgJnZhbDMyKTsKKwl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX1JDVl9SRVRfUkNCICsgMHg0LCAmdmFsMzJfMik7CisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9SQ1ZfUkVUX1JDQiArIDB4OCwgJnZhbDMyXzMpOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fUkNWX1JFVF9SQ0IgKyAweGMsICZ2YWwzMl80KTsKKwlwcmludGsoIkRFQlVHOiBTUkFNX1JDVl9SRVRfUkNCXzBbJTA4eCUwOHg6JTA4eDolMDh4XVxuIiwKKwkgICAgICAgdmFsMzIsIHZhbDMyXzIsIHZhbDMyXzMsIHZhbDMyXzQpOworCisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9TVEFUVVNfQkxLICsgMHgwLCAmdmFsMzIpOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fU1RBVFVTX0JMSyArIDB4NCwgJnZhbDMyXzIpOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fU1RBVFVTX0JMSyArIDB4OCwgJnZhbDMyXzMpOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fU1RBVFVTX0JMSyArIDB4YywgJnZhbDMyXzQpOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fU1RBVFVTX0JMSyArIDB4MTAsICZ2YWwzMl81KTsKKwlwcmludGsoIkRFQlVHOiBTUkFNX1NUQVRVU19CTEtbJTA4eDolMDh4OiUwOHg6JTA4eDolMDh4XVxuIiwKKwkgICAgICAgdmFsMzIsIHZhbDMyXzIsIHZhbDMyXzMsIHZhbDMyXzQsIHZhbDMyXzUpOworCisJLyogU1cgc3RhdHVzIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogSG9zdCBzdGF0dXMgYmxvY2sgWyUwOHg6JTA4eDooJTA0eDolMDR4OiUwNHgpOiglMDR4OiUwNHgpXVxuIiwKKwkgICAgICAgdHAtPmh3X3N0YXR1cy0+c3RhdHVzLAorCSAgICAgICB0cC0+aHdfc3RhdHVzLT5zdGF0dXNfdGFnLAorCSAgICAgICB0cC0+aHdfc3RhdHVzLT5yeF9qdW1ib19jb25zdW1lciwKKwkgICAgICAgdHAtPmh3X3N0YXR1cy0+cnhfY29uc3VtZXIsCisJICAgICAgIHRwLT5od19zdGF0dXMtPnJ4X21pbmlfY29uc3VtZXIsCisJICAgICAgIHRwLT5od19zdGF0dXMtPmlkeFswXS5yeF9wcm9kdWNlciwKKwkgICAgICAgdHAtPmh3X3N0YXR1cy0+aWR4WzBdLnR4X2NvbnN1bWVyKTsKKworCS8qIFNXIHN0YXRpc3RpY3MgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBIb3N0IHN0YXRpc3RpY3MgYmxvY2sgWyUwOHg6JTA4eDolMDh4OiUwOHhdXG4iLAorCSAgICAgICAoKHUzMiAqKXRwLT5od19zdGF0cylbMF0sCisJICAgICAgICgodTMyICopdHAtPmh3X3N0YXRzKVsxXSwKKwkgICAgICAgKCh1MzIgKil0cC0+aHdfc3RhdHMpWzJdLAorCSAgICAgICAoKHUzMiAqKXRwLT5od19zdGF0cylbM10pOworCisJLyogTWFpbGJveGVzICovCisJcHJpbnRrKCJERUJVRzogU05ESE9TVF9QUk9EWyUwOHglMDh4XSBTTkROSUNfUFJPRFslMDh4JTA4eF1cbiIsCisJICAgICAgIHRyMzIoTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzAgKyAweDApLAorCSAgICAgICB0cjMyKE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8wICsgMHg0KSwKKwkgICAgICAgdHIzMihNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8wICsgMHgwKSwKKwkgICAgICAgdHIzMihNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8wICsgMHg0KSk7CisKKwkvKiBOSUMgc2lkZSBzZW5kIGRlc2NyaXB0b3JzLiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyB0eGQ7CisKKwkJdHhkID0gdHAtPnJlZ3MgKyBOSUNfU1JBTV9XSU5fQkFTRSArIE5JQ19TUkFNX1RYX0JVRkZFUl9ERVNDCisJCQkrIChpICogc2l6ZW9mKHN0cnVjdCB0ZzNfdHhfYnVmZmVyX2Rlc2MpKTsKKwkJcHJpbnRrKCJERUJVRzogTklDIFRYRCglZClbJTA4eDolMDh4OiUwOHg6JTA4eF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgcmVhZGwodHhkICsgMHgwKSwgcmVhZGwodHhkICsgMHg0KSwKKwkJICAgICAgIHJlYWRsKHR4ZCArIDB4OCksIHJlYWRsKHR4ZCArIDB4YykpOworCX0KKworCS8qIE5JQyBzaWRlIFJYIGRlc2NyaXB0b3JzLiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyByeGQ7CisKKwkJcnhkID0gdHAtPnJlZ3MgKyBOSUNfU1JBTV9XSU5fQkFTRSArIE5JQ19TUkFNX1JYX0JVRkZFUl9ERVNDCisJCQkrIChpICogc2l6ZW9mKHN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MpKTsKKwkJcHJpbnRrKCJERUJVRzogTklDIFJYRF9TVEQoJWQpWzBdWyUwOHg6JTA4eDolMDh4OiUwOHhdXG4iLAorCQkgICAgICAgaSwKKwkJICAgICAgIHJlYWRsKHJ4ZCArIDB4MCksIHJlYWRsKHJ4ZCArIDB4NCksCisJCSAgICAgICByZWFkbChyeGQgKyAweDgpLCByZWFkbChyeGQgKyAweGMpKTsKKwkJcnhkICs9ICg0ICogc2l6ZW9mKHUzMikpOworCQlwcmludGsoIkRFQlVHOiBOSUMgUlhEX1NURCglZClbMV1bJTA4eDolMDh4OiUwOHg6JTA4eF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgcmVhZGwocnhkICsgMHgwKSwgcmVhZGwocnhkICsgMHg0KSwKKwkJICAgICAgIHJlYWRsKHJ4ZCArIDB4OCksIHJlYWRsKHJ4ZCArIDB4YykpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyByeGQ7CisKKwkJcnhkID0gdHAtPnJlZ3MgKyBOSUNfU1JBTV9XSU5fQkFTRSArIE5JQ19TUkFNX1JYX0pVTUJPX0JVRkZFUl9ERVNDCisJCQkrIChpICogc2l6ZW9mKHN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MpKTsKKwkJcHJpbnRrKCJERUJVRzogTklDIFJYRF9KVU1CTyglZClbMF1bJTA4eDolMDh4OiUwOHg6JTA4eF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgcmVhZGwocnhkICsgMHgwKSwgcmVhZGwocnhkICsgMHg0KSwKKwkJICAgICAgIHJlYWRsKHJ4ZCArIDB4OCksIHJlYWRsKHJ4ZCArIDB4YykpOworCQlyeGQgKz0gKDQgKiBzaXplb2YodTMyKSk7CisJCXByaW50aygiREVCVUc6IE5JQyBSWERfSlVNQk8oJWQpWzFdWyUwOHg6JTA4eDolMDh4OiUwOHhdXG4iLAorCQkgICAgICAgaSwKKwkJICAgICAgIHJlYWRsKHJ4ZCArIDB4MCksIHJlYWRsKHJ4ZCArIDB4NCksCisJCSAgICAgICByZWFkbChyeGQgKyAweDgpLCByZWFkbChyeGQgKyAweGMpKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp0ZzNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHN0cnVjdCB0ZzNfZXRodG9vbF9zdGF0cyAqdGczX2dldF9lc3RhdHMoc3RydWN0IHRnMyAqKTsKKworc3RhdGljIGludCB0ZzNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlkZWxfdGltZXJfc3luYygmdHAtPnRpbWVyKTsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKyNpZiAwCisJdGczX2R1bXBfc3RhdGUodHApOworI2VuZGlmCisKKwl0ZzNfZGlzYWJsZV9pbnRzKHRwKTsKKworCXRnM19oYWx0KHRwKTsKKwl0ZzNfZnJlZV9yaW5ncyh0cCk7CisJdHAtPnRnM19mbGFncyAmPQorCQl+KFRHM19GTEFHX0lOSVRfQ09NUExFVEUgfAorCQkgIFRHM19GTEFHX0dPVF9TRVJERVNfRkxPV0NUTCk7CisJbmV0aWZfY2Fycmllcl9vZmYodHAtPmRldik7CisKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwltZW1jcHkoJnRwLT5uZXRfc3RhdHNfcHJldiwgdGczX2dldF9zdGF0cyh0cC0+ZGV2KSwKKwkgICAgICAgc2l6ZW9mKHRwLT5uZXRfc3RhdHNfcHJldikpOworCW1lbWNweSgmdHAtPmVzdGF0c19wcmV2LCB0ZzNfZ2V0X2VzdGF0cyh0cCksCisJICAgICAgIHNpemVvZih0cC0+ZXN0YXRzX3ByZXYpKTsKKworCXRnM19mcmVlX2NvbnNpc3RlbnQodHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfc3RhdDY0KHRnM19zdGF0NjRfdCAqdmFsKQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworCisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIpCisJcmV0ID0gdmFsLT5sb3c7CisjZWxzZQorCXJldCA9ICgodTY0KXZhbC0+aGlnaCA8PCAzMikgfCAoKHU2NCl2YWwtPmxvdyk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWxjX2NyY19lcnJvcnMoc3RydWN0IHRnMyAqdHApCit7CisJc3RydWN0IHRnM19od19zdGF0cyAqaHdfc3RhdHMgPSB0cC0+aHdfc3RhdHM7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpICYmCisJICAgIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAorCSAgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXUzMiB2YWw7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisJCWlmICghdGczX3JlYWRwaHkodHAsIDB4MWUsICZ2YWwpKSB7CisJCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWUsIHZhbCB8IDB4ODAwMCk7CisJCQl0ZzNfcmVhZHBoeSh0cCwgMHgxNCwgJnZhbCk7CisJCX0gZWxzZQorCQkJdmFsID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKworCQl0cC0+cGh5X2NyY19lcnJvcnMgKz0gdmFsOworCisJCXJldHVybiB0cC0+cGh5X2NyY19lcnJvcnM7CisJfQorCisJcmV0dXJuIGdldF9zdGF0NjQoJmh3X3N0YXRzLT5yeF9mY3NfZXJyb3JzKTsKK30KKworI2RlZmluZSBFU1RBVF9BREQobWVtYmVyKSBcCisJZXN0YXRzLT5tZW1iZXIgPQlvbGRfZXN0YXRzLT5tZW1iZXIgKyBcCisJCQkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPm1lbWJlcikKKworc3RhdGljIHN0cnVjdCB0ZzNfZXRodG9vbF9zdGF0cyAqdGczX2dldF9lc3RhdHMoc3RydWN0IHRnMyAqdHApCit7CisJc3RydWN0IHRnM19ldGh0b29sX3N0YXRzICplc3RhdHMgPSAmdHAtPmVzdGF0czsKKwlzdHJ1Y3QgdGczX2V0aHRvb2xfc3RhdHMgKm9sZF9lc3RhdHMgPSAmdHAtPmVzdGF0c19wcmV2OworCXN0cnVjdCB0ZzNfaHdfc3RhdHMgKmh3X3N0YXRzID0gdHAtPmh3X3N0YXRzOworCisJaWYgKCFod19zdGF0cykKKwkJcmV0dXJuIG9sZF9lc3RhdHM7CisKKwlFU1RBVF9BREQocnhfb2N0ZXRzKTsKKwlFU1RBVF9BREQocnhfZnJhZ21lbnRzKTsKKwlFU1RBVF9BREQocnhfdWNhc3RfcGFja2V0cyk7CisJRVNUQVRfQUREKHJ4X21jYXN0X3BhY2tldHMpOworCUVTVEFUX0FERChyeF9iY2FzdF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfZmNzX2Vycm9ycyk7CisJRVNUQVRfQUREKHJ4X2FsaWduX2Vycm9ycyk7CisJRVNUQVRfQUREKHJ4X3hvbl9wYXVzZV9yY3ZkKTsKKwlFU1RBVF9BREQocnhfeG9mZl9wYXVzZV9yY3ZkKTsKKwlFU1RBVF9BREQocnhfbWFjX2N0cmxfcmN2ZCk7CisJRVNUQVRfQUREKHJ4X3hvZmZfZW50ZXJlZCk7CisJRVNUQVRfQUREKHJ4X2ZyYW1lX3Rvb19sb25nX2Vycm9ycyk7CisJRVNUQVRfQUREKHJ4X2phYmJlcnMpOworCUVTVEFUX0FERChyeF91bmRlcnNpemVfcGFja2V0cyk7CisJRVNUQVRfQUREKHJ4X2luX2xlbmd0aF9lcnJvcnMpOworCUVTVEFUX0FERChyeF9vdXRfbGVuZ3RoX2Vycm9ycyk7CisJRVNUQVRfQUREKHJ4XzY0X29yX2xlc3Nfb2N0ZXRfcGFja2V0cyk7CisJRVNUQVRfQUREKHJ4XzY1X3RvXzEyN19vY3RldF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfMTI4X3RvXzI1NV9vY3RldF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfMjU2X3RvXzUxMV9vY3RldF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfNTEyX3RvXzEwMjNfb2N0ZXRfcGFja2V0cyk7CisJRVNUQVRfQUREKHJ4XzEwMjRfdG9fMTUyMl9vY3RldF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfMTUyM190b18yMDQ3X29jdGV0X3BhY2tldHMpOworCUVTVEFUX0FERChyeF8yMDQ4X3RvXzQwOTVfb2N0ZXRfcGFja2V0cyk7CisJRVNUQVRfQUREKHJ4XzQwOTZfdG9fODE5MV9vY3RldF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfODE5Ml90b185MDIyX29jdGV0X3BhY2tldHMpOworCisJRVNUQVRfQUREKHR4X29jdGV0cyk7CisJRVNUQVRfQUREKHR4X2NvbGxpc2lvbnMpOworCUVTVEFUX0FERCh0eF94b25fc2VudCk7CisJRVNUQVRfQUREKHR4X3hvZmZfc2VudCk7CisJRVNUQVRfQUREKHR4X2Zsb3dfY29udHJvbCk7CisJRVNUQVRfQUREKHR4X21hY19lcnJvcnMpOworCUVTVEFUX0FERCh0eF9zaW5nbGVfY29sbGlzaW9ucyk7CisJRVNUQVRfQUREKHR4X211bHRfY29sbGlzaW9ucyk7CisJRVNUQVRfQUREKHR4X2RlZmVycmVkKTsKKwlFU1RBVF9BREQodHhfZXhjZXNzaXZlX2NvbGxpc2lvbnMpOworCUVTVEFUX0FERCh0eF9sYXRlX2NvbGxpc2lvbnMpOworCUVTVEFUX0FERCh0eF9jb2xsaWRlXzJ0aW1lcyk7CisJRVNUQVRfQUREKHR4X2NvbGxpZGVfM3RpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV80dGltZXMpOworCUVTVEFUX0FERCh0eF9jb2xsaWRlXzV0aW1lcyk7CisJRVNUQVRfQUREKHR4X2NvbGxpZGVfNnRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV83dGltZXMpOworCUVTVEFUX0FERCh0eF9jb2xsaWRlXzh0aW1lcyk7CisJRVNUQVRfQUREKHR4X2NvbGxpZGVfOXRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV8xMHRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV8xMXRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV8xMnRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV8xM3RpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV8xNHRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV8xNXRpbWVzKTsKKwlFU1RBVF9BREQodHhfdWNhc3RfcGFja2V0cyk7CisJRVNUQVRfQUREKHR4X21jYXN0X3BhY2tldHMpOworCUVTVEFUX0FERCh0eF9iY2FzdF9wYWNrZXRzKTsKKwlFU1RBVF9BREQodHhfY2Fycmllcl9zZW5zZV9lcnJvcnMpOworCUVTVEFUX0FERCh0eF9kaXNjYXJkcyk7CisJRVNUQVRfQUREKHR4X2Vycm9ycyk7CisKKwlFU1RBVF9BREQoZG1hX3dyaXRlcV9mdWxsKTsKKwlFU1RBVF9BREQoZG1hX3dyaXRlX3ByaW9xX2Z1bGwpOworCUVTVEFUX0FERChyeGJkc19lbXB0eSk7CisJRVNUQVRfQUREKHJ4X2Rpc2NhcmRzKTsKKwlFU1RBVF9BREQocnhfZXJyb3JzKTsKKwlFU1RBVF9BREQocnhfdGhyZXNob2xkX2hpdCk7CisKKwlFU1RBVF9BREQoZG1hX3JlYWRxX2Z1bGwpOworCUVTVEFUX0FERChkbWFfcmVhZF9wcmlvcV9mdWxsKTsKKwlFU1RBVF9BREQodHhfY29tcF9xdWV1ZV9mdWxsKTsKKworCUVTVEFUX0FERChyaW5nX3NldF9zZW5kX3Byb2RfaW5kZXgpOworCUVTVEFUX0FERChyaW5nX3N0YXR1c191cGRhdGUpOworCUVTVEFUX0FERChuaWNfaXJxcyk7CisJRVNUQVRfQUREKG5pY19hdm9pZGVkX2lycXMpOworCUVTVEFUX0FERChuaWNfdHhfdGhyZXNob2xkX2hpdCk7CisKKwlyZXR1cm4gZXN0YXRzOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnRnM19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnRwLT5uZXRfc3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm9sZF9zdGF0cyA9ICZ0cC0+bmV0X3N0YXRzX3ByZXY7CisJc3RydWN0IHRnM19od19zdGF0cyAqaHdfc3RhdHMgPSB0cC0+aHdfc3RhdHM7CisKKwlpZiAoIWh3X3N0YXRzKQorCQlyZXR1cm4gb2xkX3N0YXRzOworCisJc3RhdHMtPnJ4X3BhY2tldHMgPSBvbGRfc3RhdHMtPnJ4X3BhY2tldHMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+cnhfdWNhc3RfcGFja2V0cykgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+cnhfbWNhc3RfcGFja2V0cykgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+cnhfYmNhc3RfcGFja2V0cyk7CisJCQorCXN0YXRzLT50eF9wYWNrZXRzID0gb2xkX3N0YXRzLT50eF9wYWNrZXRzICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnR4X3VjYXN0X3BhY2tldHMpICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnR4X21jYXN0X3BhY2tldHMpICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnR4X2JjYXN0X3BhY2tldHMpOworCisJc3RhdHMtPnJ4X2J5dGVzID0gb2xkX3N0YXRzLT5yeF9ieXRlcyArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT5yeF9vY3RldHMpOworCXN0YXRzLT50eF9ieXRlcyA9IG9sZF9zdGF0cy0+dHhfYnl0ZXMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+dHhfb2N0ZXRzKTsKKworCXN0YXRzLT5yeF9lcnJvcnMgPSBvbGRfc3RhdHMtPnJ4X2Vycm9ycyArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT5yeF9lcnJvcnMpICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnJ4X2Rpc2NhcmRzKTsKKwlzdGF0cy0+dHhfZXJyb3JzID0gb2xkX3N0YXRzLT50eF9lcnJvcnMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+dHhfZXJyb3JzKSArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT50eF9tYWNfZXJyb3JzKSArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT50eF9jYXJyaWVyX3NlbnNlX2Vycm9ycykgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+dHhfZGlzY2FyZHMpOworCisJc3RhdHMtPm11bHRpY2FzdCA9IG9sZF9zdGF0cy0+bXVsdGljYXN0ICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnJ4X21jYXN0X3BhY2tldHMpOworCXN0YXRzLT5jb2xsaXNpb25zID0gb2xkX3N0YXRzLT5jb2xsaXNpb25zICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnR4X2NvbGxpc2lvbnMpOworCisJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgPSBvbGRfc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+cnhfZnJhbWVfdG9vX2xvbmdfZXJyb3JzKSArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT5yeF91bmRlcnNpemVfcGFja2V0cyk7CisKKwlzdGF0cy0+cnhfb3Zlcl9lcnJvcnMgPSBvbGRfc3RhdHMtPnJ4X292ZXJfZXJyb3JzICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnJ4YmRzX2VtcHR5KTsKKwlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzID0gb2xkX3N0YXRzLT5yeF9mcmFtZV9lcnJvcnMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+cnhfYWxpZ25fZXJyb3JzKTsKKwlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgPSBvbGRfc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnR4X2Rpc2NhcmRzKTsKKwlzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMgPSBvbGRfc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnR4X2NhcnJpZXJfc2Vuc2VfZXJyb3JzKTsKKworCXN0YXRzLT5yeF9jcmNfZXJyb3JzID0gb2xkX3N0YXRzLT5yeF9jcmNfZXJyb3JzICsKKwkJY2FsY19jcmNfZXJyb3JzKHRwKTsKKworCXJldHVybiBzdGF0czsKK30KKworc3RhdGljIGlubGluZSB1MzIgY2FsY19jcmModW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXUzMiByZWc7CisJdTMyIHRtcDsKKwlpbnQgaiwgazsKKworCXJlZyA9IDB4ZmZmZmZmZmY7CisKKwlmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKwkJcmVnIF49IGJ1ZltqXTsKKworCQlmb3IgKGsgPSAwOyBrIDwgODsgaysrKSB7CisJCQl0bXAgPSByZWcgJiAweDAxOworCisJCQlyZWcgPj49IDE7CisKKwkJCWlmICh0bXApIHsKKwkJCQlyZWcgXj0gMHhlZGI4ODMyMDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB+cmVnOworfQorCitzdGF0aWMgdm9pZCB0ZzNfc2V0X211bHRpKHN0cnVjdCB0ZzMgKnRwLCB1bnNpZ25lZCBpbnQgYWNjZXB0X2FsbCkKK3sKKwkvKiBhY2NlcHQgb3IgcmVqZWN0IGFsbCBtdWx0aWNhc3QgZnJhbWVzICovCisJdHczMihNQUNfSEFTSF9SRUdfMCwgYWNjZXB0X2FsbCA/IDB4ZmZmZmZmZmYgOiAwKTsKKwl0dzMyKE1BQ19IQVNIX1JFR18xLCBhY2NlcHRfYWxsID8gMHhmZmZmZmZmZiA6IDApOworCXR3MzIoTUFDX0hBU0hfUkVHXzIsIGFjY2VwdF9hbGwgPyAweGZmZmZmZmZmIDogMCk7CisJdHczMihNQUNfSEFTSF9SRUdfMywgYWNjZXB0X2FsbCA/IDB4ZmZmZmZmZmYgOiAwKTsKK30KKworc3RhdGljIHZvaWQgX190ZzNfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHJ4X21vZGU7CisKKwlyeF9tb2RlID0gdHAtPnJ4X21vZGUgJiB+KFJYX01PREVfUFJPTUlTQyB8CisJCQkJICBSWF9NT0RFX0tFRVBfVkxBTl9UQUcpOworCisJLyogV2hlbiBBU0YgaXMgaW4gdXNlLCB3ZSBhbHdheXMga2VlcCB0aGUgUlhfTU9ERV9LRUVQX1ZMQU5fVEFHCisJICogZmxhZyBjbGVhci4KKwkgKi8KKyNpZiBURzNfVkxBTl9UQUdfVVNFRAorCWlmICghdHAtPnZsZ3JwICYmCisJICAgICEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpKQorCQlyeF9tb2RlIHw9IFJYX01PREVfS0VFUF9WTEFOX1RBRzsKKyNlbHNlCisJLyogQnkgZGVmaW5pdGlvbiwgVkxBTiBpcyBkaXNhYmxlZCBhbHdheXMgaW4gdGhpcworCSAqIGNhc2UuCisJICovCisJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpKQorCQlyeF9tb2RlIHw9IFJYX01PREVfS0VFUF9WTEFOX1RBRzsKKyNlbmRpZgorCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkvKiBQcm9taXNjdW91cyBtb2RlLiAqLworCQlyeF9tb2RlIHw9IFJYX01PREVfUFJPTUlTQzsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJLyogQWNjZXB0IGFsbCBtdWx0aWNhc3QuICovCisJCXRnM19zZXRfbXVsdGkgKHRwLCAxKTsKKwl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPCAxKSB7CisJCS8qIFJlamVjdCBhbGwgbXVsdGljYXN0LiAqLworCQl0ZzNfc2V0X211bHRpICh0cCwgMCk7CisJfSBlbHNlIHsKKwkJLyogQWNjZXB0IG9uZSBvciBtb3JlIG11bHRpY2FzdChzKS4gKi8KKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCXVuc2lnbmVkIGludCBpOworCQl1MzIgbWNfZmlsdGVyWzRdID0geyAwLCB9OworCQl1MzIgcmVnaWR4OworCQl1MzIgYml0OworCQl1MzIgY3JjOworCisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkgICAgIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisKKwkJCWNyYyA9IGNhbGNfY3JjIChtY2xpc3QtPmRtaV9hZGRyLCBFVEhfQUxFTik7CisJCQliaXQgPSB+Y3JjICYgMHg3ZjsKKwkJCXJlZ2lkeCA9IChiaXQgJiAweDYwKSA+PiA1OworCQkJYml0ICY9IDB4MWY7CisJCQltY19maWx0ZXJbcmVnaWR4XSB8PSAoMSA8PCBiaXQpOworCQl9CisKKwkJdHczMihNQUNfSEFTSF9SRUdfMCwgbWNfZmlsdGVyWzBdKTsKKwkJdHczMihNQUNfSEFTSF9SRUdfMSwgbWNfZmlsdGVyWzFdKTsKKwkJdHczMihNQUNfSEFTSF9SRUdfMiwgbWNfZmlsdGVyWzJdKTsKKwkJdHczMihNQUNfSEFTSF9SRUdfMywgbWNfZmlsdGVyWzNdKTsKKwl9CisKKwlpZiAocnhfbW9kZSAhPSB0cC0+cnhfbW9kZSkgeworCQl0cC0+cnhfbW9kZSA9IHJ4X21vZGU7CisJCXR3MzJfZihNQUNfUlhfTU9ERSwgcnhfbW9kZSk7CisJCXVkZWxheSgxMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0ZzNfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisJX190ZzNfc2V0X3J4X21vZGUoZGV2KTsKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworfQorCisjZGVmaW5lIFRHM19SRUdEVU1QX0xFTgkJKDMyICogMTAyNCkKKworc3RhdGljIGludCB0ZzNfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIFRHM19SRUdEVU1QX0xFTjsKK30KKworc3RhdGljIHZvaWQgdGczX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKl9wKQoreworCXUzMiAqcCA9IF9wOworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1OCAqb3JpZ19wID0gX3A7CisJaW50IGk7CisKKwlyZWdzLT52ZXJzaW9uID0gMDsKKworCW1lbXNldChwLCAwLCBURzNfUkVHRFVNUF9MRU4pOworCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCisjZGVmaW5lIF9fR0VUX1JFRzMyKHJlZykJKCoocCkrKyA9IHRyMzIocmVnKSkKKyNkZWZpbmUgR0VUX1JFRzMyX0xPT1AoYmFzZSxsZW4pCQlcCitkbyB7CXAgPSAodTMyICopKG9yaWdfcCArIChiYXNlKSk7CQlcCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KQkJXAorCQlfX0dFVF9SRUczMigoYmFzZSkgKyBpKTsJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgR0VUX1JFRzMyXzEocmVnKQkJCVwKK2RvIHsJcCA9ICh1MzIgKikob3JpZ19wICsgKHJlZykpOwkJXAorCV9fR0VUX1JFRzMyKChyZWcpKTsJCQlcCit9IHdoaWxlICgwKQorCisJR0VUX1JFRzMyX0xPT1AoVEczUENJX1ZFTkRPUiwgMHhiMCk7CisJR0VUX1JFRzMyX0xPT1AoTUFJTEJPWF9JTlRFUlJVUFRfMCwgMHgyMDApOworCUdFVF9SRUczMl9MT09QKE1BQ19NT0RFLCAweDRmMCk7CisJR0VUX1JFRzMyX0xPT1AoU05EREFUQUlfTU9ERSwgMHhlMCk7CisJR0VUX1JFRzMyXzEoU05EREFUQUNfTU9ERSk7CisJR0VUX1JFRzMyX0xPT1AoU05EQkRTX01PREUsIDB4ODApOworCUdFVF9SRUczMl9MT09QKFNOREJESV9NT0RFLCAweDQ4KTsKKwlHRVRfUkVHMzJfMShTTkRCRENfTU9ERSk7CisJR0VUX1JFRzMyX0xPT1AoUkNWTFBDX01PREUsIDB4MjApOworCUdFVF9SRUczMl9MT09QKFJDVkxQQ19TRUxMU1RfQkFTRSwgMHgxNWMpOworCUdFVF9SRUczMl9MT09QKFJDVkRCRElfTU9ERSwgMHgwYyk7CisJR0VUX1JFRzMyX0xPT1AoUkNWREJESV9KVU1CT19CRCwgMHgzYyk7CisJR0VUX1JFRzMyX0xPT1AoUkNWREJESV9CRF9QUk9EX0lEWF8wLCAweDQ0KTsKKwlHRVRfUkVHMzJfMShSQ1ZEQ0NfTU9ERSk7CisJR0VUX1JFRzMyX0xPT1AoUkNWQkRJX01PREUsIDB4MjApOworCUdFVF9SRUczMl9MT09QKFJDVkNDX01PREUsIDB4MTQpOworCUdFVF9SRUczMl9MT09QKFJDVkxTQ19NT0RFLCAweDA4KTsKKwlHRVRfUkVHMzJfMShNQkZSRUVfTU9ERSk7CisJR0VUX1JFRzMyX0xPT1AoSE9TVENDX01PREUsIDB4MTAwKTsKKwlHRVRfUkVHMzJfTE9PUChNRU1BUkJfTU9ERSwgMHgxMCk7CisJR0VUX1JFRzMyX0xPT1AoQlVGTUdSX01PREUsIDB4NTgpOworCUdFVF9SRUczMl9MT09QKFJETUFDX01PREUsIDB4MDgpOworCUdFVF9SRUczMl9MT09QKFdETUFDX01PREUsIDB4MDgpOworCUdFVF9SRUczMl9MT09QKFJYX0NQVV9CQVNFLCAweDI4MCk7CisJR0VUX1JFRzMyX0xPT1AoVFhfQ1BVX0JBU0UsIDB4MjgwKTsKKwlHRVRfUkVHMzJfTE9PUChHUkNNQk9YX0lOVEVSUlVQVF8wLCAweDExMCk7CisJR0VUX1JFRzMyX0xPT1AoRlRRX1JFU0VULCAweDEyMCk7CisJR0VUX1JFRzMyX0xPT1AoTVNHSU5UX01PREUsIDB4MGMpOworCUdFVF9SRUczMl8xKERNQUNfTU9ERSk7CisJR0VUX1JFRzMyX0xPT1AoR1JDX01PREUsIDB4NGMpOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTlZSQU0pCisJCUdFVF9SRUczMl9MT09QKE5WUkFNX0NNRCwgMHgyNCk7CisKKyN1bmRlZiBfX0dFVF9SRUczMgorI3VuZGVmIEdFVF9SRUczMl9MT09QCisjdW5kZWYgR0VUX1JFRzMyXzEKKworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgdGczX2dldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuIHRwLT5udnJhbV9zaXplOworfQorCitzdGF0aWMgaW50IHRnM19udnJhbV9yZWFkKHN0cnVjdCB0ZzMgKnRwLCB1MzIgb2Zmc2V0LCB1MzIgKnZhbCk7CisKK3N0YXRpYyBpbnQgdGczX2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCXU4ICAqcGQ7CisJdTMyIGksIG9mZnNldCwgbGVuLCB2YWwsIGJfb2Zmc2V0LCBiX2NvdW50OworCisJb2Zmc2V0ID0gZWVwcm9tLT5vZmZzZXQ7CisJbGVuID0gZWVwcm9tLT5sZW47CisJZWVwcm9tLT5sZW4gPSAwOworCisJZWVwcm9tLT5tYWdpYyA9IFRHM19FRVBST01fTUFHSUM7CisKKwlpZiAob2Zmc2V0ICYgMykgeworCQkvKiBhZGp1c3RtZW50cyB0byBzdGFydCBvbiByZXF1aXJlZCA0IGJ5dGUgYm91bmRhcnkgKi8KKwkJYl9vZmZzZXQgPSBvZmZzZXQgJiAzOworCQliX2NvdW50ID0gNCAtIGJfb2Zmc2V0OworCQlpZiAoYl9jb3VudCA+IGxlbikgeworCQkJLyogaS5lLiBvZmZzZXQ9MSBsZW49MiAqLworCQkJYl9jb3VudCA9IGxlbjsKKwkJfQorCQlyZXQgPSB0ZzNfbnZyYW1fcmVhZCh0cCwgb2Zmc2V0LWJfb2Zmc2V0LCAmdmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXZhbCA9IGNwdV90b19sZTMyKHZhbCk7CisJCW1lbWNweShkYXRhLCAoKGNoYXIqKSZ2YWwpICsgYl9vZmZzZXQsIGJfY291bnQpOworCQlsZW4gLT0gYl9jb3VudDsKKwkJb2Zmc2V0ICs9IGJfY291bnQ7CisJICAgICAgICBlZXByb20tPmxlbiArPSBiX2NvdW50OworCX0KKworCS8qIHJlYWQgYnl0ZXMgdXB0byB0aGUgbGFzdCA0IGJ5dGUgYm91bmRhcnkgKi8KKwlwZCA9ICZkYXRhW2VlcHJvbS0+bGVuXTsKKwlmb3IgKGkgPSAwOyBpIDwgKGxlbiAtIChsZW4gJiAzKSk7IGkgKz0gNCkgeworCQlyZXQgPSB0ZzNfbnZyYW1fcmVhZCh0cCwgb2Zmc2V0ICsgaSwgJnZhbCk7CisJCWlmIChyZXQpIHsKKwkJCWVlcHJvbS0+bGVuICs9IGk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXZhbCA9IGNwdV90b19sZTMyKHZhbCk7CisJCW1lbWNweShwZCArIGksICZ2YWwsIDQpOworCX0KKwllZXByb20tPmxlbiArPSBpOworCisJaWYgKGxlbiAmIDMpIHsKKwkJLyogcmVhZCBsYXN0IGJ5dGVzIG5vdCBlbmRpbmcgb24gNCBieXRlIGJvdW5kYXJ5ICovCisJCXBkID0gJmRhdGFbZWVwcm9tLT5sZW5dOworCQliX2NvdW50ID0gbGVuICYgMzsKKwkJYl9vZmZzZXQgPSBvZmZzZXQgKyBsZW4gLSBiX2NvdW50OworCQlyZXQgPSB0ZzNfbnZyYW1fcmVhZCh0cCwgYl9vZmZzZXQsICZ2YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJdmFsID0gY3B1X3RvX2xlMzIodmFsKTsKKwkJbWVtY3B5KHBkLCAoKGNoYXIqKSZ2YWwpLCBiX2NvdW50KTsKKwkJZWVwcm9tLT5sZW4gKz0gYl9jb3VudDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX252cmFtX3dyaXRlX2Jsb2NrKHN0cnVjdCB0ZzMgKnRwLCB1MzIgb2Zmc2V0LCB1MzIgbGVuLCB1OCAqYnVmKTsgCisKK3N0YXRpYyBpbnQgdGczX3NldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCXUzMiBvZmZzZXQsIGxlbiwgYl9vZmZzZXQsIG9kZF9sZW4sIHN0YXJ0LCBlbmQ7CisJdTggKmJ1ZjsKKworCWlmIChlZXByb20tPm1hZ2ljICE9IFRHM19FRVBST01fTUFHSUMpCisJCXJldHVybiAtRUlOVkFMOworCisJb2Zmc2V0ID0gZWVwcm9tLT5vZmZzZXQ7CisJbGVuID0gZWVwcm9tLT5sZW47CisKKwlpZiAoKGJfb2Zmc2V0ID0gKG9mZnNldCAmIDMpKSkgeworCQkvKiBhZGp1c3RtZW50cyB0byBzdGFydCBvbiByZXF1aXJlZCA0IGJ5dGUgYm91bmRhcnkgKi8KKwkJcmV0ID0gdGczX252cmFtX3JlYWQodHAsIG9mZnNldC1iX29mZnNldCwgJnN0YXJ0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXN0YXJ0ID0gY3B1X3RvX2xlMzIoc3RhcnQpOworCQlsZW4gKz0gYl9vZmZzZXQ7CisJCW9mZnNldCAmPSB+MzsKKwl9CisKKwlvZGRfbGVuID0gMDsKKwlpZiAoKGxlbiAmIDMpICYmICgobGVuID4gNCkgfHwgKGJfb2Zmc2V0ID09IDApKSkgeworCQkvKiBhZGp1c3RtZW50cyB0byBlbmQgb24gcmVxdWlyZWQgNCBieXRlIGJvdW5kYXJ5ICovCisJCW9kZF9sZW4gPSAxOworCQlsZW4gPSAobGVuICsgMykgJiB+MzsKKwkJcmV0ID0gdGczX252cmFtX3JlYWQodHAsIG9mZnNldCtsZW4tNCwgJmVuZCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQllbmQgPSBjcHVfdG9fbGUzMihlbmQpOworCX0KKworCWJ1ZiA9IGRhdGE7CisJaWYgKGJfb2Zmc2V0IHx8IG9kZF9sZW4pIHsKKwkJYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCQlpZiAoYnVmID09IDApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKGJfb2Zmc2V0KQorCQkJbWVtY3B5KGJ1ZiwgJnN0YXJ0LCA0KTsKKwkJaWYgKG9kZF9sZW4pCisJCQltZW1jcHkoYnVmK2xlbi00LCAmZW5kLCA0KTsKKwkJbWVtY3B5KGJ1ZiArIGJfb2Zmc2V0LCBkYXRhLCBlZXByb20tPmxlbik7CisJfQorCisJcmV0ID0gdGczX252cmFtX3dyaXRlX2Jsb2NrKHRwLCBvZmZzZXQsIGxlbiwgYnVmKTsKKworCWlmIChidWYgIT0gZGF0YSkKKwkJa2ZyZWUoYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGczX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKyAgCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisJY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEX0F1dG9uZWcpOworCisJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKSkKKwkJY21kLT5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8CisJCQkJICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsKTsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykpCisJCWNtZC0+c3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8CisJCQkJICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCQkJICBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJCQkgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCSAgU1VQUE9SVEVEX01JSSk7CisJZWxzZQorCQljbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfRklCUkU7CisgIAorCWNtZC0+YWR2ZXJ0aXNpbmcgPSB0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmc7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQljbWQtPnNwZWVkID0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZDsKKwkJY21kLT5kdXBsZXggPSB0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleDsKKwl9CisJY21kLT5wb3J0ID0gMDsKKwljbWQtPnBoeV9hZGRyZXNzID0gUEhZX0FERFI7CisJY21kLT50cmFuc2NlaXZlciA9IDA7CisJY21kLT5hdXRvbmVnID0gdHAtPmxpbmtfY29uZmlnLmF1dG9uZWc7CisJY21kLT5tYXh0eHBrdCA9IDA7CisJY21kLT5tYXhyeHBrdCA9IDA7CisJcmV0dXJuIDA7Cit9CisgIAorc3RhdGljIGludCB0ZzNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykgeworCQkvKiBUaGVzZSBhcmUgdGhlIG9ubHkgdmFsaWQgYWR2ZXJ0aXNlbWVudCBiaXRzIGFsbG93ZWQuICAqLworCQlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFICYmCisJCSAgICAoY21kLT5hZHZlcnRpc2luZyAmIH4oQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8CisJCQkJCSAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkJCSAgQURWRVJUSVNFRF9BdXRvbmVnIHwKKwkJCQkJICBBRFZFUlRJU0VEX0ZJQlJFKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisKKwl0cC0+bGlua19jb25maWcuYXV0b25lZyA9IGNtZC0+YXV0b25lZzsKKwlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyA9IGNtZC0+YWR2ZXJ0aXNpbmc7CisJCXRwLT5saW5rX2NvbmZpZy5zcGVlZCA9IFNQRUVEX0lOVkFMSUQ7CisJCXRwLT5saW5rX2NvbmZpZy5kdXBsZXggPSBEVVBMRVhfSU5WQUxJRDsKKwl9IGVsc2UgeworCQl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgPSAwOworCQl0cC0+bGlua19jb25maWcuc3BlZWQgPSBjbWQtPnNwZWVkOworCQl0cC0+bGlua19jb25maWcuZHVwbGV4ID0gY21kLT5kdXBsZXg7CisgIAl9CisgIAorCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXRnM19zZXR1cF9waHkodHAsIDEpOworCisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKyAgCisJcmV0dXJuIDA7Cit9CisgIAorc3RhdGljIHZvaWQgdGczX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTU9EVUxFX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfTU9EVUxFX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUodHAtPnBkZXYpKTsKK30KKyAgCitzdGF0aWMgdm9pZCB0ZzNfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAKKwl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfTUFHSUM7CisJd29sLT53b2xvcHRzID0gMDsKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1dPTF9FTkFCTEUpCisJCXdvbC0+d29sb3B0cyA9IFdBS0VfTUFHSUM7CisJbWVtc2V0KCZ3b2wtPnNvcGFzcywgMCwgc2l6ZW9mKHdvbC0+c29wYXNzKSk7Cit9CisgIAorc3RhdGljIGludCB0ZzNfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAKKwlpZiAod29sLT53b2xvcHRzICYgfldBS0VfTUFHSUMpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgod29sLT53b2xvcHRzICYgV0FLRV9NQUdJQykgJiYKKwkgICAgdHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTICYmCisJICAgICEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1NFUkRFU19XT0xfQ0FQKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisgIAorCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlpZiAod29sLT53b2xvcHRzICYgV0FLRV9NQUdJQykKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19XT0xfRU5BQkxFOworCWVsc2UKKwkJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfV09MX0VOQUJMRTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKyAgCisJcmV0dXJuIDA7Cit9CisgIAorc3RhdGljIHUzMiB0ZzNfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiB0cC0+bXNnX2VuYWJsZTsKK30KKyAgCitzdGF0aWMgdm9pZCB0ZzNfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdHAtPm1zZ19lbmFibGUgPSB2YWx1ZTsKK30KKyAgCisjaWYgVEczX1RTT19TVVBQT1JUICE9IDAKK3N0YXRpYyBpbnQgdGczX3NldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVFNPX0NBUEFCTEUpKSB7CisJCWlmICh2YWx1ZSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGV0aHRvb2xfb3Bfc2V0X3RzbyhkZXYsIHZhbHVlKTsKK30KKyNlbmRpZgorICAKK3N0YXRpYyBpbnQgdGczX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIGJtY3I7CisJaW50IHI7CisgIAorCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlyID0gLUVJTlZBTDsKKwl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNQ1IsICZibWNyKTsKKwlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfQk1DUiwgJmJtY3IpICYmCisJICAgIChibWNyICYgQk1DUl9BTkVOQUJMRSkpIHsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQk1DUiwgYm1jciB8IEJNQ1JfQU5SRVNUQVJUKTsKKwkJciA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworICAKKwlyZXR1cm4gcjsKK30KKyAgCitzdGF0aWMgdm9pZCB0ZzNfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKmVyaW5nKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisJZXJpbmctPnJ4X21heF9wZW5kaW5nID0gVEczX1JYX1JJTkdfU0laRSAtIDE7CisJZXJpbmctPnJ4X21pbmlfbWF4X3BlbmRpbmcgPSAwOworCWVyaW5nLT5yeF9qdW1ib19tYXhfcGVuZGluZyA9IFRHM19SWF9KVU1CT19SSU5HX1NJWkUgLSAxOworCisJZXJpbmctPnJ4X3BlbmRpbmcgPSB0cC0+cnhfcGVuZGluZzsKKwllcmluZy0+cnhfbWluaV9wZW5kaW5nID0gMDsKKwllcmluZy0+cnhfanVtYm9fcGVuZGluZyA9IHRwLT5yeF9qdW1ib19wZW5kaW5nOworCWVyaW5nLT50eF9wZW5kaW5nID0gdHAtPnR4X3BlbmRpbmc7Cit9CisgIAorc3RhdGljIGludCB0ZzNfc2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKmVyaW5nKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisJaWYgKChlcmluZy0+cnhfcGVuZGluZyA+IFRHM19SWF9SSU5HX1NJWkUgLSAxKSB8fAorCSAgICAoZXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPiBURzNfUlhfSlVNQk9fUklOR19TSVpFIC0gMSkgfHwKKwkgICAgKGVyaW5nLT50eF9wZW5kaW5nID4gVEczX1RYX1JJTkdfU0laRSAtIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKyAgCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJdGczX25ldGlmX3N0b3AodHApOworCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworICAKKwl0cC0+cnhfcGVuZGluZyA9IGVyaW5nLT5yeF9wZW5kaW5nOworCisJaWYgKCh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX01BWF9SWFBFTkRfNjQpICYmCisJICAgIHRwLT5yeF9wZW5kaW5nID4gNjMpCisJCXRwLT5yeF9wZW5kaW5nID0gNjM7CisJdHAtPnJ4X2p1bWJvX3BlbmRpbmcgPSBlcmluZy0+cnhfanVtYm9fcGVuZGluZzsKKwl0cC0+dHhfcGVuZGluZyA9IGVyaW5nLT50eF9wZW5kaW5nOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQl0ZzNfaGFsdCh0cCk7CisJCXRnM19pbml0X2h3KHRwKTsKKwkJdGczX25ldGlmX3N0YXJ0KHRwKTsKKwl9CisKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworICAKKwlyZXR1cm4gMDsKK30KKyAgCitzdGF0aWMgdm9pZCB0ZzNfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXBhdXNlKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisJZXBhdXNlLT5hdXRvbmVnID0gKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQVVTRV9BVVRPTkVHKSAhPSAwOworCWVwYXVzZS0+cnhfcGF1c2UgPSAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1JYX1BBVVNFKSAhPSAwOworCWVwYXVzZS0+dHhfcGF1c2UgPSAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1RYX1BBVVNFKSAhPSAwOworfQorICAKK3N0YXRpYyBpbnQgdGczX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwYXVzZSkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgIAorCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXRnM19uZXRpZl9zdG9wKHRwKTsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwlpZiAoZXBhdXNlLT5hdXRvbmVnKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BBVVNFX0FVVE9ORUc7CisJZWxzZQorCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19QQVVTRV9BVVRPTkVHOworCWlmIChlcGF1c2UtPnJ4X3BhdXNlKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1JYX1BBVVNFOworCWVsc2UKKwkJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfUlhfUEFVU0U7CisJaWYgKGVwYXVzZS0+dHhfcGF1c2UpCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfVFhfUEFVU0U7CisJZWxzZQorCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19UWF9QQVVTRTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJdGczX2hhbHQodHApOworCQl0ZzNfaW5pdF9odyh0cCk7CisJCXRnM19uZXRpZl9zdGFydCh0cCk7CisJfQorCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisgIAorCXJldHVybiAwOworfQorICAKK3N0YXRpYyB1MzIgdGczX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1JYX0NIRUNLU1VNUykgIT0gMDsKK30KKyAgCitzdGF0aWMgaW50IHRnM19zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgIAorCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfQlJPS0VOX0NIRUNLU1VNUykgeworCQlpZiAoZGF0YSAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgIAkJcmV0dXJuIDA7CisgIAl9CisgIAorCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlpZiAoZGF0YSkKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19SWF9DSEVDS1NVTVM7CisJZWxzZQorCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19SWF9DSEVDS1NVTVM7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisgIAorCXJldHVybiAwOworfQorICAKK3N0YXRpYyBpbnQgdGczX3NldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19CUk9LRU5fQ0hFQ0tTVU1TKSB7CisJCWlmIChkYXRhICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgCQlyZXR1cm4gMDsKKyAgCX0KKyAgCisJaWYgKGRhdGEpCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNOworCWVsc2UKKwkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9JUF9DU1VNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX2dldF9zdGF0c19jb3VudCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gVEczX05VTV9TVEFUUzsKK30KKworc3RhdGljIHZvaWQgdGczX2dldF9zdHJpbmdzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqYnVmKQoreworCXN3aXRjaCAoc3RyaW5nc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCW1lbWNweShidWYsICZldGh0b29sX3N0YXRzX2tleXMsIHNpemVvZihldGh0b29sX3N0YXRzX2tleXMpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsJLyogd2UgbmVlZCBhIFdBUk4oKSAqLworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRnM19nZXRfZXRodG9vbF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqZXN0YXRzLCB1NjQgKnRtcF9zdGF0cykKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJbWVtY3B5KHRtcF9zdGF0cywgdGczX2dldF9lc3RhdHModHApLCBzaXplb2YodHAtPmVzdGF0cykpOworfQorCitzdGF0aWMgaW50IHRnM19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkoaWZyKTsKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCQlkYXRhLT5waHlfaWQgPSBQSFlfQUREUjsKKworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgU0lPQ0dNSUlSRUc6IHsKKwkJdTMyIG1paV9yZWd2YWw7CisKKwkJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykKKwkJCWJyZWFrOwkJCS8qIFdlIGhhdmUgbm8gUEhZICovCisKKwkJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCQllcnIgPSB0ZzNfcmVhZHBoeSh0cCwgZGF0YS0+cmVnX251bSAmIDB4MWYsICZtaWlfcmVndmFsKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwkJZGF0YS0+dmFsX291dCA9IG1paV9yZWd2YWw7CisKKwkJcmV0dXJuIGVycjsKKwl9CisKKwljYXNlIFNJT0NTTUlJUkVHOgorCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKQorCQkJYnJlYWs7CQkJLyogV2UgaGF2ZSBubyBQSFkgKi8KKworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwkJZXJyID0gdGczX3dyaXRlcGh5KHRwLCBkYXRhLT5yZWdfbnVtICYgMHgxZiwgZGF0YS0+dmFsX2luKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwkJcmV0dXJuIGVycjsKKworCWRlZmF1bHQ6CisJCS8qIGRvIG5vdGhpbmcgKi8KKwkJYnJlYWs7CisJfQorCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworI2lmIFRHM19WTEFOX1RBR19VU0VECitzdGF0aWMgdm9pZCB0ZzNfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKworCXRwLT52bGdycCA9IGdycDsKKworCS8qIFVwZGF0ZSBSWF9NT0RFX0tFRVBfVkxBTl9UQUcgYml0IGluIFJYX01PREUgcmVnaXN0ZXIuICovCisJX190ZzNfc2V0X3J4X21vZGUoZGV2KTsKKworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM192bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisJaWYgKHRwLT52bGdycCkKKwkJdHAtPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSA9IE5VTEw7CisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHRnM19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzCQk9IHRnM19nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSB0ZzNfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwkJPSB0ZzNfZ2V0X2RydmluZm8sCisJLmdldF9yZWdzX2xlbgkJPSB0ZzNfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfcmVncwkJPSB0ZzNfZ2V0X3JlZ3MsCisJLmdldF93b2wJCT0gdGczX2dldF93b2wsCisJLnNldF93b2wJCT0gdGczX3NldF93b2wsCisJLmdldF9tc2dsZXZlbAkJPSB0ZzNfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gdGczX3NldF9tc2dsZXZlbCwKKwkubndheV9yZXNldAkJPSB0ZzNfbndheV9yZXNldCwKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X2VlcHJvbV9sZW4JCT0gdGczX2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tCQk9IHRnM19nZXRfZWVwcm9tLAorCS5zZXRfZWVwcm9tCQk9IHRnM19zZXRfZWVwcm9tLAorCS5nZXRfcmluZ3BhcmFtCQk9IHRnM19nZXRfcmluZ3BhcmFtLAorCS5zZXRfcmluZ3BhcmFtCQk9IHRnM19zZXRfcmluZ3BhcmFtLAorCS5nZXRfcGF1c2VwYXJhbQkJPSB0ZzNfZ2V0X3BhdXNlcGFyYW0sCisJLnNldF9wYXVzZXBhcmFtCQk9IHRnM19zZXRfcGF1c2VwYXJhbSwKKwkuZ2V0X3J4X2NzdW0JCT0gdGczX2dldF9yeF9jc3VtLAorCS5zZXRfcnhfY3N1bQkJPSB0ZzNfc2V0X3J4X2NzdW0sCisJLmdldF90eF9jc3VtCQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisJLnNldF90eF9jc3VtCQk9IHRnM19zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKKyNpZiBURzNfVFNPX1NVUFBPUlQgIT0gMAorCS5nZXRfdHNvCQk9IGV0aHRvb2xfb3BfZ2V0X3RzbywKKwkuc2V0X3RzbwkJPSB0ZzNfc2V0X3RzbywKKyNlbmRpZgorCS5nZXRfc3RyaW5ncwkJPSB0ZzNfZ2V0X3N0cmluZ3MsCisJLmdldF9zdGF0c19jb3VudAk9IHRnM19nZXRfc3RhdHNfY291bnQsCisJLmdldF9ldGh0b29sX3N0YXRzCT0gdGczX2dldF9ldGh0b29sX3N0YXRzLAorfTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0IHRnM19nZXRfZWVwcm9tX3NpemUoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIGN1cnNpemUsIHZhbDsKKworCXRwLT5udnJhbV9zaXplID0gRUVQUk9NX0NISVBfU0laRTsKKworCWlmICh0ZzNfbnZyYW1fcmVhZCh0cCwgMCwgJnZhbCkgIT0gMCkKKwkJcmV0dXJuOworCisJaWYgKHN3YWIzMih2YWwpICE9IFRHM19FRVBST01fTUFHSUMpCisJCXJldHVybjsKKworCS8qCisJICogU2l6ZSB0aGUgY2hpcCBieSByZWFkaW5nIG9mZnNldHMgYXQgaW5jcmVhc2luZyBwb3dlcnMgb2YgdHdvLgorCSAqIFdoZW4gd2UgZW5jb3VudGVyIG91ciB2YWxpZGF0aW9uIHNpZ25hdHVyZSwgd2Uga25vdyB0aGUgYWRkcmVzc2luZworCSAqIGhhcyB3cmFwcGVkIGFyb3VuZCwgYW5kIHRodXMgaGF2ZSBvdXIgY2hpcCBzaXplLgorCSAqLworCWN1cnNpemUgPSAweDgwMDsKKworCXdoaWxlIChjdXJzaXplIDwgdHAtPm52cmFtX3NpemUpIHsKKwkJaWYgKHRnM19udnJhbV9yZWFkKHRwLCBjdXJzaXplLCAmdmFsKSAhPSAwKQorCQkJcmV0dXJuOworCisJCWlmIChzd2FiMzIodmFsKSA9PSBURzNfRUVQUk9NX01BR0lDKQorCQkJYnJlYWs7CisKKwkJY3Vyc2l6ZSA8PD0gMTsKKwl9CisKKwl0cC0+bnZyYW1fc2l6ZSA9IGN1cnNpemU7Cit9CisJCQorc3RhdGljIHZvaWQgX19kZXZpbml0IHRnM19nZXRfbnZyYW1fc2l6ZShzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgdmFsOworCisJaWYgKHRnM19udnJhbV9yZWFkKHRwLCAweGYwLCAmdmFsKSA9PSAwKSB7CisJCWlmICh2YWwgIT0gMCkgeworCQkJdHAtPm52cmFtX3NpemUgPSAodmFsID4+IDE2KSAqIDEwMjQ7CisJCQlyZXR1cm47CisJCX0KKwl9CisJdHAtPm52cmFtX3NpemUgPSAweDIwMDAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdGczX2dldF9udnJhbV9pbmZvKHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiBudmNmZzE7CisKKwludmNmZzEgPSB0cjMyKE5WUkFNX0NGRzEpOworCWlmIChudmNmZzEgJiBOVlJBTV9DRkcxX0ZMQVNISUZfRU5BQikgeworCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9GTEFTSDsKKwl9CisJZWxzZSB7CisJCW52Y2ZnMSAmPSB+TlZSQU1fQ0ZHMV9DT01QQVRfQllQQVNTOworCQl0dzMyKE5WUkFNX0NGRzEsIG52Y2ZnMSk7CisJfQorCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKSB7CisJCXN3aXRjaCAobnZjZmcxICYgTlZSQU1fQ0ZHMV9WRU5ET1JfTUFTSykgeworCQkJY2FzZSBGTEFTSF9WRU5ET1JfQVRNRUxfRkxBU0hfQlVGRkVSRUQ6CisJCQkJdHAtPm52cmFtX2plZGVjbnVtID0gSkVERUNfQVRNRUw7CisJCQkJdHAtPm52cmFtX3BhZ2VzaXplID0gQVRNRUxfQVQ0NURCMFgxQl9QQUdFX1NJWkU7CisJCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19OVlJBTV9CVUZGRVJFRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkxBU0hfVkVORE9SX0FUTUVMX0ZMQVNIX1VOQlVGRkVSRUQ6CisJCQkJdHAtPm52cmFtX2plZGVjbnVtID0gSkVERUNfQVRNRUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgCXRwLT5udnJhbV9wYWdlc2l6ZSA9IEFUTUVMX0FUMjVGNTEyX1BBR0VfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkxBU0hfVkVORE9SX0FUTUVMX0VFUFJPTToKKwkJCQl0cC0+bnZyYW1famVkZWNudW0gPSBKRURFQ19BVE1FTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAJdHAtPm52cmFtX3BhZ2VzaXplID0gQVRNRUxfQVQyNEM1MTJfQ0hJUF9TSVpFOworCQkJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfTlZSQU1fQlVGRkVSRUQ7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX1ZFTkRPUl9TVDoKKwkJCQl0cC0+bnZyYW1famVkZWNudW0gPSBKRURFQ19TVDsKKwkJCQl0cC0+bnZyYW1fcGFnZXNpemUgPSBTVF9NNDVQRVgwX1BBR0VfU0laRTsKKwkJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX05WUkFNX0JVRkZFUkVEOworCQkJCWJyZWFrOworCQkJY2FzZSBGTEFTSF9WRU5ET1JfU0FJRlVOOgorCQkJCXRwLT5udnJhbV9qZWRlY251bSA9IEpFREVDX1NBSUZVTjsKKwkJCQl0cC0+bnZyYW1fcGFnZXNpemUgPSBTQUlGVU5fU0EyNUYwWFhfUEFHRV9TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBGTEFTSF9WRU5ET1JfU1NUX1NNQUxMOgorCQkJY2FzZSBGTEFTSF9WRU5ET1JfU1NUX0xBUkdFOgorCQkJCXRwLT5udnJhbV9qZWRlY251bSA9IEpFREVDX1NTVDsKKwkJCQl0cC0+bnZyYW1fcGFnZXNpemUgPSBTU1RfMjVWRjBYMF9QQUdFX1NJWkU7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZSB7CisJCXRwLT5udnJhbV9qZWRlY251bSA9IEpFREVDX0FUTUVMOworCQl0cC0+bnZyYW1fcGFnZXNpemUgPSBBVE1FTF9BVDQ1REIwWDFCX1BBR0VfU0laRTsKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19OVlJBTV9CVUZGRVJFRDsKKwl9Cit9CisKKy8qIENoaXBzIG90aGVyIHRoYW4gNTcwMC81NzAxIHVzZSB0aGUgTlZSQU0gZm9yIGZldGNoaW5nIGluZm8uICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdGczX252cmFtX2luaXQoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGo7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9TVU5fNTcwWCkKKwkJcmV0dXJuOworCisJdHczMl9mKEdSQ19FRVBST01fQUREUiwKKwkgICAgIChFRVBST01fQUREUl9GU01fUkVTRVQgfAorCSAgICAgIChFRVBST01fREVGQVVMVF9DTE9DS19QRVJJT0QgPDwKKwkgICAgICAgRUVQUk9NX0FERFJfQ0xLUEVSRF9TSElGVCkpKTsKKworCS8qIFhYWCBzY2hlZHVsZV90aW1lb3V0KCkgLi4uICovCisJZm9yIChqID0gMDsgaiA8IDEwMDsgaisrKQorCQl1ZGVsYXkoMTApOworCisJLyogRW5hYmxlIHNlZXByb20gYWNjZXNzZXMuICovCisJdHczMl9mKEdSQ19MT0NBTF9DVFJMLAorCSAgICAgdHIzMihHUkNfTE9DQUxfQ1RSTCkgfCBHUkNfTENMQ1RSTF9BVVRPX1NFRVBST00pOworCXVkZWxheSgxMDApOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAwICYmCisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAxKSB7CisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfTlZSQU07CisKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKSB7CisJCQl1MzIgbnZhY2Nlc3MgPSB0cjMyKE5WUkFNX0FDQ0VTUyk7CisKKwkJCXR3MzIoTlZSQU1fQUNDRVNTLCBudmFjY2VzcyB8IEFDQ0VTU19FTkFCTEUpOworCQl9CisKKwkJdGczX2dldF9udnJhbV9pbmZvKHRwKTsKKwkJdGczX2dldF9udnJhbV9zaXplKHRwKTsKKworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApIHsKKwkJCXUzMiBudmFjY2VzcyA9IHRyMzIoTlZSQU1fQUNDRVNTKTsKKworCQkJdHczMihOVlJBTV9BQ0NFU1MsIG52YWNjZXNzICYgfkFDQ0VTU19FTkFCTEUpOworCQl9CisKKwl9IGVsc2UgeworCQl0cC0+dGczX2ZsYWdzICY9IH4oVEczX0ZMQUdfTlZSQU0gfCBURzNfRkxBR19OVlJBTV9CVUZGRVJFRCk7CisKKwkJdGczX2dldF9lZXByb21fc2l6ZSh0cCk7CisJfQorfQorCitzdGF0aWMgaW50IHRnM19udnJhbV9yZWFkX3VzaW5nX2VlcHJvbShzdHJ1Y3QgdGczICp0cCwKKwkJCQkJdTMyIG9mZnNldCwgdTMyICp2YWwpCit7CisJdTMyIHRtcDsKKwlpbnQgaTsKKworCWlmIChvZmZzZXQgPiBFRVBST01fQUREUl9BRERSX01BU0sgfHwKKwkgICAgKG9mZnNldCAlIDQpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdG1wID0gdHIzMihHUkNfRUVQUk9NX0FERFIpICYgfihFRVBST01fQUREUl9BRERSX01BU0sgfAorCQkJCQlFRVBST01fQUREUl9ERVZJRF9NQVNLIHwKKwkJCQkJRUVQUk9NX0FERFJfUkVBRCk7CisJdHczMihHUkNfRUVQUk9NX0FERFIsCisJICAgICB0bXAgfAorCSAgICAgKDAgPDwgRUVQUk9NX0FERFJfREVWSURfU0hJRlQpIHwKKwkgICAgICgob2Zmc2V0IDw8IEVFUFJPTV9BRERSX0FERFJfU0hJRlQpICYKKwkgICAgICBFRVBST01fQUREUl9BRERSX01BU0spIHwKKwkgICAgIEVFUFJPTV9BRERSX1JFQUQgfCBFRVBST01fQUREUl9TVEFSVCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworCQl0bXAgPSB0cjMyKEdSQ19FRVBST01fQUREUik7CisKKwkJaWYgKHRtcCAmIEVFUFJPTV9BRERSX0NPTVBMRVRFKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KKwlpZiAoISh0bXAgJiBFRVBST01fQUREUl9DT01QTEVURSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkqdmFsID0gdHIzMihHUkNfRUVQUk9NX0RBVEEpOworCXJldHVybiAwOworfQorCisjZGVmaW5lIE5WUkFNX0NNRF9USU1FT1VUIDEwMDAwCisKK3N0YXRpYyBpbnQgdGczX252cmFtX2V4ZWNfY21kKHN0cnVjdCB0ZzMgKnRwLCB1MzIgbnZyYW1fY21kKQoreworCWludCBpOworCisJdHczMihOVlJBTV9DTUQsIG52cmFtX2NtZCk7CisJZm9yIChpID0gMDsgaSA8IE5WUkFNX0NNRF9USU1FT1VUOyBpKyspIHsKKwkJdWRlbGF5KDEwKTsKKwkJaWYgKHRyMzIoTlZSQU1fQ01EKSAmIE5WUkFNX0NNRF9ET05FKSB7CisJCQl1ZGVsYXkoMTApOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gTlZSQU1fQ01EX1RJTUVPVVQpIHsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX252cmFtX3JlYWQoc3RydWN0IHRnMyAqdHAsIHUzMiBvZmZzZXQsIHUzMiAqdmFsKQoreworCWludCByZXQ7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9TVU5fNTcwWCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJBdHRlbXB0IHRvIGRvIG52cmFtX3JlYWQgb24gU3VuIDU3MFhcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTlZSQU0pKQorCQlyZXR1cm4gdGczX252cmFtX3JlYWRfdXNpbmdfZWVwcm9tKHRwLCBvZmZzZXQsIHZhbCk7CisKKwlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OVlJBTV9CVUZGRVJFRCkgJiYKKwkJKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfRkxBU0gpICYmCisJCSh0cC0+bnZyYW1famVkZWNudW0gPT0gSkVERUNfQVRNRUwpKSB7CisKKwkJb2Zmc2V0ID0gKChvZmZzZXQgLyB0cC0+bnZyYW1fcGFnZXNpemUpIDw8CisJCQkgIEFUTUVMX0FUNDVEQjBYMUJfUEFHRV9QT1MpICsKKwkJCShvZmZzZXQgJSB0cC0+bnZyYW1fcGFnZXNpemUpOworCX0KKworCWlmIChvZmZzZXQgPiBOVlJBTV9BRERSX01TSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0ZzNfbnZyYW1fbG9jayh0cCk7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApIHsKKwkJdTMyIG52YWNjZXNzID0gdHIzMihOVlJBTV9BQ0NFU1MpOworCisJCXR3MzJfZihOVlJBTV9BQ0NFU1MsIG52YWNjZXNzIHwgQUNDRVNTX0VOQUJMRSk7CisJfQorCisJdHczMihOVlJBTV9BRERSLCBvZmZzZXQpOworCXJldCA9IHRnM19udnJhbV9leGVjX2NtZCh0cCwgTlZSQU1fQ01EX1JEIHwgTlZSQU1fQ01EX0dPIHwKKwkJTlZSQU1fQ01EX0ZJUlNUIHwgTlZSQU1fQ01EX0xBU1QgfCBOVlJBTV9DTURfRE9ORSk7CisKKwlpZiAocmV0ID09IDApCisJCSp2YWwgPSBzd2FiMzIodHIzMihOVlJBTV9SRERBVEEpKTsKKworCXRnM19udnJhbV91bmxvY2sodHApOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKSB7CisJCXUzMiBudmFjY2VzcyA9IHRyMzIoTlZSQU1fQUNDRVNTKTsKKworCQl0dzMyX2YoTlZSQU1fQUNDRVNTLCBudmFjY2VzcyAmIH5BQ0NFU1NfRU5BQkxFKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRnM19udnJhbV93cml0ZV9ibG9ja191c2luZ19lZXByb20oc3RydWN0IHRnMyAqdHAsCisJCQkJICAgIHUzMiBvZmZzZXQsIHUzMiBsZW4sIHU4ICpidWYpCit7CisJaW50IGksIGosIHJjID0gMDsKKwl1MzIgdmFsOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7CisJCXUzMiBhZGRyLCBkYXRhOworCisJCWFkZHIgPSBvZmZzZXQgKyBpOworCisJCW1lbWNweSgmZGF0YSwgYnVmICsgaSwgNCk7CisKKwkJdHczMihHUkNfRUVQUk9NX0RBVEEsIGNwdV90b19sZTMyKGRhdGEpKTsKKworCQl2YWwgPSB0cjMyKEdSQ19FRVBST01fQUREUik7CisJCXR3MzIoR1JDX0VFUFJPTV9BRERSLCB2YWwgfCBFRVBST01fQUREUl9DT01QTEVURSk7CisKKwkJdmFsICY9IH4oRUVQUk9NX0FERFJfQUREUl9NQVNLIHwgRUVQUk9NX0FERFJfREVWSURfTUFTSyB8CisJCQlFRVBST01fQUREUl9SRUFEKTsKKwkJdHczMihHUkNfRUVQUk9NX0FERFIsIHZhbCB8CisJCQkoMCA8PCBFRVBST01fQUREUl9ERVZJRF9TSElGVCkgfAorCQkJKGFkZHIgJiBFRVBST01fQUREUl9BRERSX01BU0spIHwKKwkJCUVFUFJPTV9BRERSX1NUQVJUIHwKKwkJCUVFUFJPTV9BRERSX1dSSVRFKTsKKwkJCisJCWZvciAoaiA9IDA7IGogPCAxMDAwMDsgaisrKSB7CisJCQl2YWwgPSB0cjMyKEdSQ19FRVBST01fQUREUik7CisKKwkJCWlmICh2YWwgJiBFRVBST01fQUREUl9DT01QTEVURSkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxMDApOworCQl9CisJCWlmICghKHZhbCAmIEVFUFJPTV9BRERSX0NPTVBMRVRFKSkgeworCQkJcmMgPSAtRUJVU1k7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworLyogb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGR3b3JkIGFsaWduZWQgKi8KK3N0YXRpYyBpbnQgdGczX252cmFtX3dyaXRlX2Jsb2NrX3VuYnVmZmVyZWQoc3RydWN0IHRnMyAqdHAsIHUzMiBvZmZzZXQsIHUzMiBsZW4sCisJCXU4ICpidWYpCit7CisJaW50IHJldCA9IDA7CisJdTMyIHBhZ2VzaXplID0gdHAtPm52cmFtX3BhZ2VzaXplOworCXUzMiBwYWdlbWFzayA9IHBhZ2VzaXplIC0gMTsKKwl1MzIgbnZyYW1fY21kOworCXU4ICp0bXA7CisKKwl0bXAgPSBrbWFsbG9jKHBhZ2VzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAodG1wID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJd2hpbGUgKGxlbikgeworCQlpbnQgajsKKwkJdTMyIHBoeV9hZGRyLCBwYWdlX29mZiwgc2l6ZSwgbnZhY2Nlc3M7CisKKwkJcGh5X2FkZHIgPSBvZmZzZXQgJiB+cGFnZW1hc2s7CisJCisJCWZvciAoaiA9IDA7IGogPCBwYWdlc2l6ZTsgaiArPSA0KSB7CisJCQlpZiAoKHJldCA9IHRnM19udnJhbV9yZWFkKHRwLCBwaHlfYWRkciArIGosCisJCQkJCQkodTMyICopICh0bXAgKyBqKSkpKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCSAgICAgICAgcGFnZV9vZmYgPSBvZmZzZXQgJiBwYWdlbWFzazsKKwkJc2l6ZSA9IHBhZ2VzaXplOworCQlpZiAobGVuIDwgc2l6ZSkKKwkJCXNpemUgPSBsZW47CisKKwkJbGVuIC09IHNpemU7CisKKwkJbWVtY3B5KHRtcCArIHBhZ2Vfb2ZmLCBidWYsIHNpemUpOworCisJCW9mZnNldCA9IG9mZnNldCArIChwYWdlc2l6ZSAtIHBhZ2Vfb2ZmKTsKKworCQludmFjY2VzcyA9IHRyMzIoTlZSQU1fQUNDRVNTKTsKKwkJdHczMl9mKE5WUkFNX0FDQ0VTUywgbnZhY2Nlc3MgfCBBQ0NFU1NfRU5BQkxFKTsKKworCQkvKgorCQkgKiBCZWZvcmUgd2UgY2FuIGVyYXNlIHRoZSBmbGFzaCBwYWdlLCB3ZSBuZWVkCisJCSAqIHRvIGlzc3VlIGEgc3BlY2lhbCAid3JpdGUgZW5hYmxlIiBjb21tYW5kLgorCQkgKi8KKwkJbnZyYW1fY21kID0gTlZSQU1fQ01EX1dSRU4gfCBOVlJBTV9DTURfR08gfCBOVlJBTV9DTURfRE9ORTsKKworCQlpZiAodGczX252cmFtX2V4ZWNfY21kKHRwLCBudnJhbV9jbWQpKQorCQkJYnJlYWs7CisKKwkJLyogRXJhc2UgdGhlIHRhcmdldCBwYWdlICovCisJCXR3MzIoTlZSQU1fQUREUiwgcGh5X2FkZHIpOworCisJCW52cmFtX2NtZCA9IE5WUkFNX0NNRF9HTyB8IE5WUkFNX0NNRF9ET05FIHwgTlZSQU1fQ01EX1dSIHwKKwkJCU5WUkFNX0NNRF9GSVJTVCB8IE5WUkFNX0NNRF9MQVNUIHwgTlZSQU1fQ01EX0VSQVNFOworCisJICAgICAgICBpZiAodGczX252cmFtX2V4ZWNfY21kKHRwLCBudnJhbV9jbWQpKQorCQkJYnJlYWs7CisKKwkJLyogSXNzdWUgYW5vdGhlciB3cml0ZSBlbmFibGUgdG8gc3RhcnQgdGhlIHdyaXRlLiAqLworCQludnJhbV9jbWQgPSBOVlJBTV9DTURfV1JFTiB8IE5WUkFNX0NNRF9HTyB8IE5WUkFNX0NNRF9ET05FOworCisJCWlmICh0ZzNfbnZyYW1fZXhlY19jbWQodHAsIG52cmFtX2NtZCkpCisJCQlicmVhazsKKworCQlmb3IgKGogPSAwOyBqIDwgcGFnZXNpemU7IGogKz0gNCkgeworCQkJdTMyIGRhdGE7CisKKwkgICAgCQlkYXRhID0gKigodTMyICopICh0bXAgKyBqKSk7CisJCQl0dzMyKE5WUkFNX1dSREFUQSwgY3B1X3RvX2JlMzIoZGF0YSkpOworCisJCQl0dzMyKE5WUkFNX0FERFIsIHBoeV9hZGRyICsgaik7CisKKwkJCW52cmFtX2NtZCA9IE5WUkFNX0NNRF9HTyB8IE5WUkFNX0NNRF9ET05FIHwKKwkJCQlOVlJBTV9DTURfV1I7CisKKwkJCWlmIChqID09IDApCisJCQkJbnZyYW1fY21kIHw9IE5WUkFNX0NNRF9GSVJTVDsKKwkJCWVsc2UgaWYgKGogPT0gKHBhZ2VzaXplIC0gNCkpCisJCQkJbnZyYW1fY21kIHw9IE5WUkFNX0NNRF9MQVNUOworCisJCQlpZiAoKHJldCA9IHRnM19udnJhbV9leGVjX2NtZCh0cCwgbnZyYW1fY21kKSkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKworCW52cmFtX2NtZCA9IE5WUkFNX0NNRF9XUkRJIHwgTlZSQU1fQ01EX0dPIHwgTlZSQU1fQ01EX0RPTkU7CisJdGczX252cmFtX2V4ZWNfY21kKHRwLCBudnJhbV9jbWQpOworCisJa2ZyZWUodG1wKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkd29yZCBhbGlnbmVkICovCitzdGF0aWMgaW50IHRnM19udnJhbV93cml0ZV9ibG9ja19idWZmZXJlZChzdHJ1Y3QgdGczICp0cCwgdTMyIG9mZnNldCwgdTMyIGxlbiwKKwkJdTggKmJ1ZikKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCwgb2Zmc2V0ICs9IDQpIHsKKwkJdTMyIGRhdGEsIHBhZ2Vfb2ZmLCBwaHlfYWRkciwgbnZyYW1fY21kOworCisJCW1lbWNweSgmZGF0YSwgYnVmICsgaSwgNCk7CisJCXR3MzIoTlZSQU1fV1JEQVRBLCBjcHVfdG9fYmUzMihkYXRhKSk7CisKKwkgICAgICAgIHBhZ2Vfb2ZmID0gb2Zmc2V0ICUgdHAtPm52cmFtX3BhZ2VzaXplOworCisJCWlmICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9GTEFTSCkgJiYKKwkJCSh0cC0+bnZyYW1famVkZWNudW0gPT0gSkVERUNfQVRNRUwpKSB7CisKKwkJCXBoeV9hZGRyID0gKChvZmZzZXQgLyB0cC0+bnZyYW1fcGFnZXNpemUpIDw8CisJCQkJICAgIEFUTUVMX0FUNDVEQjBYMUJfUEFHRV9QT1MpICsgcGFnZV9vZmY7CisJCX0KKwkJZWxzZSB7CisJCQlwaHlfYWRkciA9IG9mZnNldDsKKwkJfQorCisJCXR3MzIoTlZSQU1fQUREUiwgcGh5X2FkZHIpOworCisJCW52cmFtX2NtZCA9IE5WUkFNX0NNRF9HTyB8IE5WUkFNX0NNRF9ET05FIHwgTlZSQU1fQ01EX1dSOworCisJICAgICAgICBpZiAoKHBhZ2Vfb2ZmID09IDApIHx8IChpID09IDApKQorCQkJbnZyYW1fY21kIHw9IE5WUkFNX0NNRF9GSVJTVDsKKwkJZWxzZSBpZiAocGFnZV9vZmYgPT0gKHRwLT5udnJhbV9wYWdlc2l6ZSAtIDQpKQorCQkJbnZyYW1fY21kIHw9IE5WUkFNX0NNRF9MQVNUOworCisJCWlmIChpID09IChsZW4gLSA0KSkKKwkJCW52cmFtX2NtZCB8PSBOVlJBTV9DTURfTEFTVDsKKworCQlpZiAoKHRwLT5udnJhbV9qZWRlY251bSA9PSBKRURFQ19TVCkgJiYKKwkJCShudnJhbV9jbWQgJiBOVlJBTV9DTURfRklSU1QpKSB7CisKKwkJCWlmICgocmV0ID0gdGczX252cmFtX2V4ZWNfY21kKHRwLAorCQkJCU5WUkFNX0NNRF9XUkVOIHwgTlZSQU1fQ01EX0dPIHwKKwkJCQlOVlJBTV9DTURfRE9ORSkpKQorCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9GTEFTSCkpIHsKKwkJCS8qIFdlIGFsd2F5cyBkbyBjb21wbGV0ZSB3b3JkIHdyaXRlcyB0byBlZXByb20uICovCisJCQludnJhbV9jbWQgfD0gKE5WUkFNX0NNRF9GSVJTVCB8IE5WUkFNX0NNRF9MQVNUKTsKKwkJfQorCisJCWlmICgocmV0ID0gdGczX252cmFtX2V4ZWNfY21kKHRwLCBudnJhbV9jbWQpKSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZHdvcmQgYWxpZ25lZCAqLworc3RhdGljIGludCB0ZzNfbnZyYW1fd3JpdGVfYmxvY2soc3RydWN0IHRnMyAqdHAsIHUzMiBvZmZzZXQsIHUzMiBsZW4sIHU4ICpidWYpCit7CisJaW50IHJldDsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1NVTl81NzBYKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkF0dGVtcHQgdG8gZG8gbnZyYW1fd3JpdGUgb24gU3VuIDU3MFhcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VFUFJPTV9XUklURV9QUk9UKSB7CisJCXR3MzJfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsIHwKKwkJICAgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT0UxKTsKKwkJdWRlbGF5KDQwKTsKKwl9CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTlZSQU0pKSB7CisJCXJldCA9IHRnM19udnJhbV93cml0ZV9ibG9ja191c2luZ19lZXByb20odHAsIG9mZnNldCwgbGVuLCBidWYpOworCX0KKwllbHNlIHsKKwkJdTMyIGdyY19tb2RlOworCisJCXRnM19udnJhbV9sb2NrKHRwKTsKKworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApIHsKKwkJCXUzMiBudmFjY2VzcyA9IHRyMzIoTlZSQU1fQUNDRVNTKTsKKworCQkJdHczMihOVlJBTV9BQ0NFU1MsIG52YWNjZXNzIHwgQUNDRVNTX0VOQUJMRSk7CisKKwkJCXR3MzIoTlZSQU1fV1JJVEUxLCAweDQwNik7CisJCX0KKworCQlncmNfbW9kZSA9IHRyMzIoR1JDX01PREUpOworCQl0dzMyKEdSQ19NT0RFLCBncmNfbW9kZSB8IEdSQ19NT0RFX05WUkFNX1dSX0VOQUJMRSk7CisKKwkJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTlZSQU1fQlVGRkVSRUQpIHx8CisJCQkhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfRkxBU0gpKSB7CisKKwkJCXJldCA9IHRnM19udnJhbV93cml0ZV9ibG9ja19idWZmZXJlZCh0cCwgb2Zmc2V0LCBsZW4sCisJCQkJYnVmKTsKKwkJfQorCQllbHNlIHsKKwkJCXJldCA9IHRnM19udnJhbV93cml0ZV9ibG9ja191bmJ1ZmZlcmVkKHRwLCBvZmZzZXQsIGxlbiwKKwkJCQlidWYpOworCQl9CisKKwkJZ3JjX21vZGUgPSB0cjMyKEdSQ19NT0RFKTsKKwkJdHczMihHUkNfTU9ERSwgZ3JjX21vZGUgJiB+R1JDX01PREVfTlZSQU1fV1JfRU5BQkxFKTsKKworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApIHsKKwkJCXUzMiBudmFjY2VzcyA9IHRyMzIoTlZSQU1fQUNDRVNTKTsKKworCQkJdHczMihOVlJBTV9BQ0NFU1MsIG52YWNjZXNzICYgfkFDQ0VTU19FTkFCTEUpOworCQl9CisJCXRnM19udnJhbV91bmxvY2sodHApOworCX0KKworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRUVQUk9NX1dSSVRFX1BST1QpIHsKKwkJdHczMl9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwgfAorCQkgICAgICAgR1JDX0xDTENUUkxfR1BJT19PRTEgfCBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDEpOworCQl1ZGVsYXkoNDApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBzdWJzeXNfdGJsX2VudCB7CisJdTE2IHN1YnN5c192ZW5kb3IsIHN1YnN5c19kZXZpZDsKKwl1MzIgcGh5X2lkOworfTsKKworc3RhdGljIHN0cnVjdCBzdWJzeXNfdGJsX2VudCBzdWJzeXNfaWRfdG9fcGh5X2lkW10gPSB7CisJLyogQnJvYWRjb20gYm9hcmRzLiAqLworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHgxNjQ0LCBQSFlfSURfQkNNNTQwMSB9LCAvKiBCQ005NTcwMEE2ICovCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDAwMDEsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJDTTk1NzAxQTUgKi8KKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4MDAwMiwgUEhZX0lEX0JDTTgwMDIgfSwgLyogQkNNOTU3MDBUNiAqLworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHgwMDAzLCAwIH0sCQkgICAgLyogQkNNOTU3MDBBOSAqLworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHgwMDA1LCBQSFlfSURfQkNNNTcwMSB9LCAvKiBCQ005NTcwMVQxICovCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDAwMDYsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJDTTk1NzAxVDggKi8KKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4MDAwNywgMCB9LAkJICAgIC8qIEJDTTk1NzAxQTcgKi8KKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4MDAwOCwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkNNOTU3MDFBMTAgKi8KKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4ODAwOCwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkNNOTU3MDFBMTIgKi8KKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4MDAwOSwgUEhZX0lEX0JDTTU3MDMgfSwgLyogQkNNOTU3MDNBeDEgKi8KKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4ODAwOSwgUEhZX0lEX0JDTTU3MDMgfSwgLyogQkNNOTU3MDNBeDIgKi8KKworCS8qIDNjb20gYm9hcmRzLiAqLworCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDAsIFBIWV9JRF9CQ001NDAxIH0sIC8qIDNDOTk2VCAqLworCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDYsIFBIWV9JRF9CQ001NzAxIH0sIC8qIDNDOTk2QlQgKi8KKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgMHgxMDA0LCAwIH0sCQkvKiAzQzk5NlNYICovCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4MTAwNywgUEhZX0lEX0JDTTU3MDEgfSwgLyogM0MxMDAwVCAqLworCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDgsIFBIWV9JRF9CQ001NzAxIH0sIC8qIDNDOTQwQlIwMSAqLworCisJLyogREVMTCBib2FyZHMuICovCisJeyBQQ0lfVkVORE9SX0lEX0RFTEwsIDB4MDBkMSwgUEhZX0lEX0JDTTU0MDEgfSwgLyogVklQRVIgKi8KKwl7IFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMTA2LCBQSFlfSURfQkNNNTQwMSB9LCAvKiBKQUdVQVIgKi8KKwl7IFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMTA5LCBQSFlfSURfQkNNNTQxMSB9LCAvKiBNRVJMT1QgKi8KKwl7IFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMTBhLCBQSFlfSURfQkNNNTQxMSB9LCAvKiBTTElNX01FUkxPVCAqLworCisJLyogQ29tcGFxIGJvYXJkcy4gKi8KKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCAweDAwN2MsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJBTlNIRUUgKi8KKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCAweDAwOWEsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJBTlNIRUVfMiAqLworCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIDB4MDA3ZCwgMCB9LAkJICAvKiBDSEFOR0VMSU5HICovCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgMHgwMDg1LCBQSFlfSURfQkNNNTcwMSB9LCAvKiBOQzc3ODAgKi8KKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCAweDAwOTksIFBIWV9JRF9CQ001NzAxIH0sIC8qIE5DNzc4MF8yICovCisKKwkvKiBJQk0gYm9hcmRzLiAqLworCXsgUENJX1ZFTkRPUl9JRF9JQk0sIDB4MDI4MSwgMCB9IC8qIElCTT8/PyAqLworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3Vic3lzX3RibF9lbnQgKmxvb2t1cF9ieV9zdWJzeXMoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdWJzeXNfaWRfdG9fcGh5X2lkKTsgaSsrKSB7CisJCWlmICgoc3Vic3lzX2lkX3RvX3BoeV9pZFtpXS5zdWJzeXNfdmVuZG9yID09CisJCSAgICAgdHAtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IpICYmCisJCSAgICAoc3Vic3lzX2lkX3RvX3BoeV9pZFtpXS5zdWJzeXNfZGV2aWQgPT0KKwkJICAgICB0cC0+cGRldi0+c3Vic3lzdGVtX2RldmljZSkpCisJCQlyZXR1cm4gJnN1YnN5c19pZF90b19waHlfaWRbaV07CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0ZzNfcGh5X3Byb2JlKHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiBlZXByb21fcGh5X2lkLCBod19waHlfaWRfMSwgaHdfcGh5X2lkXzI7CisJdTMyIGh3X3BoeV9pZCwgaHdfcGh5X2lkX21hc2tlZDsKKwl1MzIgdmFsOworCWludCBlZXByb21fc2lnbmF0dXJlX2ZvdW5kLCBlZXByb21fcGh5X3NlcmRlcywgZXJyOworCisJdHAtPnBoeV9pZCA9IFBIWV9JRF9JTlZBTElEOworCWVlcHJvbV9waHlfaWQgPSBQSFlfSURfSU5WQUxJRDsKKwllZXByb21fcGh5X3NlcmRlcyA9IDA7CisJZWVwcm9tX3NpZ25hdHVyZV9mb3VuZCA9IDA7CisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9EQVRBX1NJRywgJnZhbCk7CisJaWYgKHZhbCA9PSBOSUNfU1JBTV9EQVRBX1NJR19NQUdJQykgeworCQl1MzIgbmljX2NmZywgbGVkX2NmZzsKKwkJdTMyIG5pY19waHlfaWQsIHZlciwgY2ZnMiA9IDA7CisKKwkJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9EQVRBX0NGRywgJm5pY19jZmcpOworCQl0cC0+bmljX3NyYW1fZGF0YV9jZmcgPSBuaWNfY2ZnOworCisJCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fREFUQV9WRVIsICZ2ZXIpOworCQl2ZXIgPj49IE5JQ19TUkFNX0RBVEFfVkVSX1NISUZUOworCQlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAwKSAmJgorCQkgICAgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAxKSAmJgorCQkgICAgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAzKSAmJgorCQkgICAgKHZlciA+IDApICYmICh2ZXIgPCAweDEwMCkpCisJCQl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX0RBVEFfQ0ZHXzIsICZjZmcyKTsKKworCQllZXByb21fc2lnbmF0dXJlX2ZvdW5kID0gMTsKKworCQlpZiAoKG5pY19jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9NQVNLKSA9PQorCQkgICAgTklDX1NSQU1fREFUQV9DRkdfUEhZX1RZUEVfRklCRVIpCisJCQllZXByb21fcGh5X3NlcmRlcyA9IDE7CisKKwkJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9EQVRBX1BIWV9JRCwgJm5pY19waHlfaWQpOworCQlpZiAobmljX3BoeV9pZCAhPSAwKSB7CisJCQl1MzIgaWQxID0gbmljX3BoeV9pZCAmIE5JQ19TUkFNX0RBVEFfUEhZX0lEMV9NQVNLOworCQkJdTMyIGlkMiA9IG5pY19waHlfaWQgJiBOSUNfU1JBTV9EQVRBX1BIWV9JRDJfTUFTSzsKKworCQkJZWVwcm9tX3BoeV9pZCAgPSAoaWQxID4+IDE2KSA8PCAxMDsKKwkJCWVlcHJvbV9waHlfaWQgfD0gKGlkMiAmIDB4ZmMwMCkgPDwgMTY7CisJCQllZXByb21fcGh5X2lkIHw9IChpZDIgJiAweDAzZmYpIDw8ICAwOworCQl9IGVsc2UKKwkJCWVlcHJvbV9waHlfaWQgPSAwOworCisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkgeworCQkJbGVkX2NmZyA9IGNmZzIgJiAoTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfTUFTSyB8CisJCQkJICAgIFNIQVNUQV9FWFRfTEVEX01PREVfTUFTSyk7CisJCX0gZWxzZQorCQkJbGVkX2NmZyA9IG5pY19jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19MRURfTU9ERV9NQVNLOworCisJCXN3aXRjaCAobGVkX2NmZykgeworCQlkZWZhdWx0OgorCQljYXNlIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9NT0RFX1BIWV8xOgorCQkJdHAtPmxlZF9jdHJsID0gTEVEX0NUUkxfTU9ERV9QSFlfMTsKKwkJCWJyZWFrOworCisJCWNhc2UgTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfUEhZXzI6CisJCQl0cC0+bGVkX2N0cmwgPSBMRURfQ1RSTF9NT0RFX1BIWV8yOworCQkJYnJlYWs7CisKKwkJY2FzZSBOSUNfU1JBTV9EQVRBX0NGR19MRURfTU9ERV9NQUM6CisJCQl0cC0+bGVkX2N0cmwgPSBMRURfQ1RSTF9NT0RFX01BQzsKKwkJCWJyZWFrOworCisJCWNhc2UgU0hBU1RBX0VYVF9MRURfU0hBUkVEOgorCQkJdHAtPmxlZF9jdHJsID0gTEVEX0NUUkxfTU9ERV9TSEFSRUQ7CisJCQlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3NTBfQTAgJiYKKwkJCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTc1MF9BMSkKKwkJCQl0cC0+bGVkX2N0cmwgfD0gKExFRF9DVFJMX01PREVfUEhZXzEgfAorCQkJCQkJIExFRF9DVFJMX01PREVfUEhZXzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTSEFTVEFfRVhUX0xFRF9NQUM6CisJCQl0cC0+bGVkX2N0cmwgPSBMRURfQ1RSTF9NT0RFX1NIQVNUQV9NQUM7CisJCQlicmVhazsKKworCQljYXNlIFNIQVNUQV9FWFRfTEVEX0NPTUJPOgorCQkJdHAtPmxlZF9jdHJsID0gTEVEX0NUUkxfTU9ERV9DT01CTzsKKwkJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTc1MF9BMCkKKwkJCQl0cC0+bGVkX2N0cmwgfD0gKExFRF9DVFJMX01PREVfUEhZXzEgfAorCQkJCQkJIExFRF9DVFJMX01PREVfUEhZXzIpOworCQkJYnJlYWs7CisKKwkJfTsKKworCQlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwIHx8CisJCSAgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpICYmCisJCSAgICB0cC0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0RFTEwpCisJCQl0cC0+bGVkX2N0cmwgPSBMRURfQ1RSTF9NT0RFX1BIWV8yOworCisJCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDApICYmCisJCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDEpICYmCisJCSAgICAobmljX2NmZyAmIE5JQ19TUkFNX0RBVEFfQ0ZHX0VFUFJPTV9XUCkpCisJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0VFUFJPTV9XUklURV9QUk9UOworCisJCWlmIChuaWNfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfQVNGX0VOQUJMRSkgeworCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19FTkFCTEVfQVNGOworCQkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKQorCQkJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX0FTRl9ORVdfSEFORFNIQUtFOworCQl9CisJCWlmIChuaWNfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfRklCRVJfV09MKQorCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19TRVJERVNfV09MX0NBUDsKKworCQlpZiAoY2ZnMiAmICgxIDw8IDE3KSkKKwkJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX0NBUEFDSVRJVkVfQ09VUExJTkc7CisKKwkJLyogc2VyZGVzIHNpZ25hbCBwcmUtZW1waGFzaXMgaW4gcmVnaXN0ZXIgMHg1OTAgc2V0IGJ5ICovCisJCS8qIGJvb3Rjb2RlIGlmIGJpdCAxOCBpcyBzZXQgKi8KKwkJaWYgKGNmZzIgJiAoMSA8PCAxOCkpCisJCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9TRVJERVNfUFJFRU1QSEFTSVM7CisJfQorCisJLyogUmVhZGluZyB0aGUgUEhZIElEIHJlZ2lzdGVyIGNhbiBjb25mbGljdCB3aXRoIEFTRgorCSAqIGZpcndtYXJlIGFjY2VzcyB0byB0aGUgUEhZIGhhcmR3YXJlLgorCSAqLworCWVyciA9IDA7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKSB7CisJCWh3X3BoeV9pZCA9IGh3X3BoeV9pZF9tYXNrZWQgPSBQSFlfSURfSU5WQUxJRDsKKwl9IGVsc2UgeworCQkvKiBOb3cgcmVhZCB0aGUgcGh5c2ljYWwgUEhZX0lEIGZyb20gdGhlIGNoaXAgYW5kIHZlcmlmeQorCQkgKiB0aGF0IGl0IGlzIHNhbmUuICBJZiBpdCBkb2Vzbid0IGxvb2sgZ29vZCwgd2UgZmFsbCBiYWNrCisJCSAqIHRvIGVpdGhlciB0aGUgaGFyZC1jb2RlZCB0YWJsZSBiYXNlZCBQSFlfSUQgYW5kIGZhaWxpbmcKKwkJICogdGhhdCB0aGUgdmFsdWUgZm91bmQgaW4gdGhlIGVlcHJvbSBhcmVhLgorCQkgKi8KKwkJZXJyIHw9IHRnM19yZWFkcGh5KHRwLCBNSUlfUEhZU0lEMSwgJmh3X3BoeV9pZF8xKTsKKwkJZXJyIHw9IHRnM19yZWFkcGh5KHRwLCBNSUlfUEhZU0lEMiwgJmh3X3BoeV9pZF8yKTsKKworCQlod19waHlfaWQgID0gKGh3X3BoeV9pZF8xICYgMHhmZmZmKSA8PCAxMDsKKwkJaHdfcGh5X2lkIHw9IChod19waHlfaWRfMiAmIDB4ZmMwMCkgPDwgMTY7CisJCWh3X3BoeV9pZCB8PSAoaHdfcGh5X2lkXzIgJiAweDAzZmYpIDw8ICAwOworCisJCWh3X3BoeV9pZF9tYXNrZWQgPSBod19waHlfaWQgJiBQSFlfSURfTUFTSzsKKwl9CisKKwlpZiAoIWVyciAmJiBLTk9XTl9QSFlfSUQoaHdfcGh5X2lkX21hc2tlZCkpIHsKKwkJdHAtPnBoeV9pZCA9IGh3X3BoeV9pZDsKKwkJaWYgKGh3X3BoeV9pZF9tYXNrZWQgPT0gUEhZX0lEX0JDTTgwMDIpCisJCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QSFlfU0VSREVTOworCX0gZWxzZSB7CisJCWlmIChlZXByb21fc2lnbmF0dXJlX2ZvdW5kKSB7CisJCQl0cC0+cGh5X2lkID0gZWVwcm9tX3BoeV9pZDsKKwkJCWlmIChlZXByb21fcGh5X3NlcmRlcykKKwkJCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QSFlfU0VSREVTOworCQl9IGVsc2UgeworCQkJc3RydWN0IHN1YnN5c190YmxfZW50ICpwOworCisJCQkvKiBObyBlZXByb20gc2lnbmF0dXJlPyAgVHJ5IHRoZSBoYXJkY29kZWQKKwkJCSAqIHN1YnN5cyBkZXZpY2UgdGFibGUuCisJCQkgKi8KKwkJCXAgPSBsb29rdXBfYnlfc3Vic3lzKHRwKTsKKwkJCWlmICghcCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKworCQkJdHAtPnBoeV9pZCA9IHAtPnBoeV9pZDsKKwkJCWlmICghdHAtPnBoeV9pZCB8fAorCQkJICAgIHRwLT5waHlfaWQgPT0gUEhZX0lEX0JDTTgwMDIpCisJCQkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfUEhZX1NFUkRFUzsKKwkJfQorCX0KKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykgJiYKKwkgICAgISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikpIHsKKwkJdTMyIGJtc3IsIGFkdl9yZWcsIHRnM19jdHJsOworCisJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpICYmCisJCSAgICAoYm1zciAmIEJNU1JfTFNUQVRVUykpCisJCQlnb3RvIHNraXBfcGh5X3Jlc2V0OworCQkgICAgCisJCWVyciA9IHRnM19waHlfcmVzZXQodHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlhZHZfcmVnID0gKEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMIHwKKwkJCSAgIEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwMEZVTEwgfAorCQkJICAgQURWRVJUSVNFX0NTTUEgfCBBRFZFUlRJU0VfUEFVU0VfQ0FQKTsKKwkJdGczX2N0cmwgPSAwOworCQlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpKSB7CisJCQl0ZzNfY3RybCA9IChNSUlfVEczX0NUUkxfQURWXzEwMDBfSEFMRiB8CisJCQkJICAgIE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9GVUxMKTsKKwkJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9BMCB8fAorCQkJICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IwKQorCQkJCXRnM19jdHJsIHw9IChNSUlfVEczX0NUUkxfQVNfTUFTVEVSIHwKKwkJCQkJICAgICBNSUlfVEczX0NUUkxfRU5BQkxFX0FTX01BU1RFUik7CisJCX0KKworCQlpZiAoIXRnM19jb3BwZXJfaXNfYWR2ZXJ0aXNpbmdfYWxsKHRwKSkgeworCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBhZHZfcmVnKTsKKworCQkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKSkKKwkJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQ1RSTCwgdGczX2N0cmwpOworCisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLAorCQkJCSAgICAgQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKwkJfQorCQl0ZzNfcGh5X3NldF93aXJlc3BlZWQodHApOworCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX0FEVkVSVElTRSwgYWR2X3JlZyk7CisJCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkpCisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQ1RSTCwgdGczX2N0cmwpOworCX0KKworc2tpcF9waHlfcmVzZXQ6CisJaWYgKCh0cC0+cGh5X2lkICYgUEhZX0lEX01BU0spID09IFBIWV9JRF9CQ001NDAxKSB7CisJCWVyciA9IHRnM19pbml0XzU0MDFwaHlfZHNwKHRwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKCFlcnIgJiYgKCh0cC0+cGh5X2lkICYgUEhZX0lEX01BU0spID09IFBIWV9JRF9CQ001NDAxKSkgeworCQllcnIgPSB0ZzNfaW5pdF81NDAxcGh5X2RzcCh0cCk7CisJfQorCisJaWYgKCFlZXByb21fc2lnbmF0dXJlX2ZvdW5kKQorCQl0cC0+bGVkX2N0cmwgPSBMRURfQ1RSTF9NT0RFX1BIWV8xOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykKKwkJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nID0KKwkJCShBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCSBBRFZFUlRJU0VEX0F1dG9uZWcgfAorCQkJIEFEVkVSVElTRURfRklCUkUpOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpCisJCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmPQorCQkJfihBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCSAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdGczX3JlYWRfcGFydG5vKHN0cnVjdCB0ZzMgKnRwKQoreworCXVuc2lnbmVkIGNoYXIgdnBkX2RhdGFbMjU2XTsKKwlpbnQgaTsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1NVTl81NzBYKSB7CisJCS8qIFN1biBkZWNpZGVkIG5vdCB0byBwdXQgdGhlIG5lY2Vzc2FyeSBiaXRzIGluIHRoZQorCQkgKiBOVlJBTSBvZiB0aGVpciBvbmJvYXJkIHRnMyBwYXJ0cyA6KAorCQkgKi8KKwkJc3RyY3B5KHRwLT5ib2FyZF9wYXJ0X251bWJlciwgIlN1biA1NzBYIik7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpICs9IDQpIHsKKwkJdTMyIHRtcDsKKworCQlpZiAodGczX252cmFtX3JlYWQodHAsIDB4MTAwICsgaSwgJnRtcCkpCisJCQlnb3RvIG91dF9ub3RfZm91bmQ7CisKKwkJdnBkX2RhdGFbaSArIDBdID0gKCh0bXAgPj4gIDApICYgMHhmZik7CisJCXZwZF9kYXRhW2kgKyAxXSA9ICgodG1wID4+ICA4KSAmIDB4ZmYpOworCQl2cGRfZGF0YVtpICsgMl0gPSAoKHRtcCA+PiAxNikgJiAweGZmKTsKKwkJdnBkX2RhdGFbaSArIDNdID0gKCh0bXAgPj4gMjQpICYgMHhmZik7CisJfQorCisJLyogTm93IHBhcnNlIGFuZCBmaW5kIHRoZSBwYXJ0IG51bWJlci4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyApIHsKKwkJdW5zaWduZWQgY2hhciB2YWwgPSB2cGRfZGF0YVtpXTsKKwkJaW50IGJsb2NrX2VuZDsKKworCQlpZiAodmFsID09IDB4ODIgfHwgdmFsID09IDB4OTEpIHsKKwkJCWkgPSAoaSArIDMgKworCQkJICAgICAodnBkX2RhdGFbaSArIDFdICsKKwkJCSAgICAgICh2cGRfZGF0YVtpICsgMl0gPDwgOCkpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZhbCAhPSAweDkwKQorCQkJZ290byBvdXRfbm90X2ZvdW5kOworCisJCWJsb2NrX2VuZCA9IChpICsgMyArCisJCQkgICAgICh2cGRfZGF0YVtpICsgMV0gKworCQkJICAgICAgKHZwZF9kYXRhW2kgKyAyXSA8PCA4KSkpOworCQlpICs9IDM7CisJCXdoaWxlIChpIDwgYmxvY2tfZW5kKSB7CisJCQlpZiAodnBkX2RhdGFbaSArIDBdID09ICdQJyAmJgorCQkJICAgIHZwZF9kYXRhW2kgKyAxXSA9PSAnTicpIHsKKwkJCQlpbnQgcGFydG5vX2xlbiA9IHZwZF9kYXRhW2kgKyAyXTsKKworCQkJCWlmIChwYXJ0bm9fbGVuID4gMjQpCisJCQkJCWdvdG8gb3V0X25vdF9mb3VuZDsKKworCQkJCW1lbWNweSh0cC0+Ym9hcmRfcGFydF9udW1iZXIsCisJCQkJICAgICAgICZ2cGRfZGF0YVtpICsgM10sCisJCQkJICAgICAgIHBhcnRub19sZW4pOworCisJCQkJLyogU3VjY2Vzcy4gKi8KKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQkvKiBQYXJ0IG51bWJlciBub3QgZm91bmQuICovCisJCWdvdG8gb3V0X25vdF9mb3VuZDsKKwl9CisKK291dF9ub3RfZm91bmQ6CisJc3RyY3B5KHRwLT5ib2FyZF9wYXJ0X251bWJlciwgIm5vbmUiKTsKK30KKworI2lmZGVmIENPTkZJR19TUEFSQzY0CitzdGF0aWMgaW50IF9fZGV2aW5pdCB0ZzNfaXNfc3VuXzU3MFgoc3RydWN0IHRnMyAqdHApCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGRldjsKKwlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwID0gcGRldi0+c3lzZGF0YTsKKworCWlmIChwY3AgIT0gTlVMTCkgeworCQlpbnQgbm9kZSA9IHBjcC0+cHJvbV9ub2RlOworCQl1MzIgdmVuaWQ7CisJCWludCBlcnI7CisKKwkJZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAic3Vic3lzdGVtLXZlbmRvci1pZCIsCisJCQkJICAgICAgIChjaGFyICopICZ2ZW5pZCwgc2l6ZW9mKHZlbmlkKSk7CisJCWlmIChlcnIgPT0gMCB8fCBlcnIgPT0gLTEpCisJCQlyZXR1cm4gMDsKKwkJaWYgKHZlbmlkID09IFBDSV9WRU5ET1JfSURfU1VOKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRnM19nZXRfaW52YXJpYW50cyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgd3JpdGVfcmVvcmRlcl9jaGlwc2V0c1tdID0geworCQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQV84KSB9LAorCQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl84KSB9LAorCQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV8xMSkgfSwKKwkJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCSAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfNikgfSwKKwkJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELAorCQkgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9BTURfRkVfR0FURV83MDBDKSB9LAorCQl7IH0sCisJfTsKKwl1MzIgbWlzY19jdHJsX3JlZzsKKwl1MzIgY2FjaGVsaW5lX3N6X3JlZzsKKwl1MzIgcGNpX3N0YXRlX3JlZywgZ3JjX21pc2NfY2ZnOworCXUzMiB2YWw7CisJdTE2IHBjaV9jbWQ7CisJaW50IGVycjsKKworI2lmZGVmIENPTkZJR19TUEFSQzY0CisJaWYgKHRnM19pc19zdW5fNTcwWCh0cCkpCisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1NVTl81NzBYOworI2VuZGlmCisKKwkvKiBJZiB3ZSBoYXZlIGFuIEFNRCA3NjIgb3IgSW50ZWwgSUNIL0lDSDAvSUNIMiBjaGlwc2V0LCB3cml0ZQorCSAqIHJlb3JkZXJpbmcgdG8gdGhlIG1haWxib3ggcmVnaXN0ZXJzIGRvbmUgYnkgdGhlIGhvc3QKKwkgKiBjb250cm9sbGVyIGNhbiBjYXVzZSBtYWpvciB0cm91Ymxlcy4gIFdlIHJlYWQgYmFjayBmcm9tCisJICogZXZlcnkgbWFpbGJveCByZWdpc3RlciB3cml0ZSB0byBmb3JjZSB0aGUgd3JpdGVzIHRvIGJlCisJICogcG9zdGVkIHRvIHRoZSBjaGlwIGluIG9yZGVyLgorCSAqLworCWlmIChwY2lfZGV2X3ByZXNlbnQod3JpdGVfcmVvcmRlcl9jaGlwc2V0cykpCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfTUJPWF9XUklURV9SRU9SREVSOworCisJLyogRm9yY2UgbWVtb3J5IHdyaXRlIGludmFsaWRhdGUgb2ZmLiAgSWYgd2UgbGVhdmUgaXQgb24sCisJICogdGhlbiBvbiA1NzAwX0JYIGNoaXBzIHdlIGhhdmUgdG8gZW5hYmxlIGEgd29ya2Fyb3VuZC4KKwkgKiBUaGUgd29ya2Fyb3VuZCBpcyB0byBzZXQgdGhlIFRHM1BDSV9ETUFfUldfQ1RSTCBib3VuZGFyeQorCSAqIHRvIG1hdGNoIHRoZSBjYWNoZWxpbmUgc2l6ZS4gIFRoZSBCcm9hZGNvbSBkcml2ZXIgaGF2ZSB0aGlzCisJICogd29ya2Fyb3VuZCBidXQgdHVybnMgTVdJIG9mZiBhbGwgdGhlIHRpbWVzIHNvIG5ldmVyIHVzZXMKKwkgKiBpdC4gIFRoaXMgc2VlbXMgdG8gc3VnZ2VzdCB0aGF0IHRoZSB3b3JrYXJvdW5kIGlzIGluc3VmZmljaWVudC4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZCh0cC0+cGRldiwgUENJX0NPTU1BTkQsICZwY2lfY21kKTsKKwlwY2lfY21kICY9IH5QQ0lfQ09NTUFORF9JTlZBTElEQVRFOworCXBjaV93cml0ZV9jb25maWdfd29yZCh0cC0+cGRldiwgUENJX0NPTU1BTkQsIHBjaV9jbWQpOworCisJLyogSXQgaXMgYWJzb2x1dGVseSBjcml0aWNhbCB0aGF0IFRHM1BDSV9NSVNDX0hPU1RfQ1RSTAorCSAqIGhhcyB0aGUgcmVnaXN0ZXIgaW5kaXJlY3Qgd3JpdGUgZW5hYmxlIGJpdCBzZXQgYmVmb3JlCisJICogd2UgdHJ5IHRvIGFjY2VzcyBhbnkgb2YgdGhlIE1NSU8gcmVnaXN0ZXJzLiAgSXQgaXMgYWxzbworCSAqIGNyaXRpY2FsIHRoYXQgdGhlIFBDSS1YIGh3IHdvcmthcm91bmQgc2l0dWF0aW9uIGlzIGRlY2lkZWQKKwkgKiBiZWZvcmUgdGhhdCBhcyB3ZWxsLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01JU0NfSE9TVF9DVFJMLAorCQkJICAgICAgJm1pc2NfY3RybF9yZWcpOworCisJdHAtPnBjaV9jaGlwX3Jldl9pZCA9IChtaXNjX2N0cmxfcmVnID4+CisJCQkgICAgICAgTUlTQ19IT1NUX0NUUkxfQ0hJUFJFVl9TSElGVCk7CisKKwkvKiBJbml0aWFsaXplIG1pc2MgaG9zdCBjb250cm9sIGluIFBDSSBibG9jay4gKi8KKwl0cC0+bWlzY19ob3N0X2N0cmwgfD0gKG1pc2NfY3RybF9yZWcgJgorCQkJICAgICAgIE1JU0NfSE9TVF9DVFJMX0NISVBSRVYpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwKKwkJCSAgICAgICB0cC0+bWlzY19ob3N0X2N0cmwpOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfQ0FDSEVMSU5FU1osCisJCQkgICAgICAmY2FjaGVsaW5lX3N6X3JlZyk7CisKKwl0cC0+cGNpX2NhY2hlbGluZV9zeiA9IChjYWNoZWxpbmVfc3pfcmVnID4+ICAwKSAmIDB4ZmY7CisJdHAtPnBjaV9sYXRfdGltZXIgICAgPSAoY2FjaGVsaW5lX3N6X3JlZyA+PiAgOCkgJiAweGZmOworCXRwLT5wY2lfaGRyX3R5cGUgICAgID0gKGNhY2hlbGluZV9zel9yZWcgPj4gMTYpICYgMHhmZjsKKwl0cC0+cGNpX2Jpc3QgICAgICAgICA9IChjYWNoZWxpbmVfc3pfcmVnID4+IDI0KSAmIDB4ZmY7CisKKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSB8fAorCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApKQorCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl81NzA1X1BMVVM7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApCisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX0hXX1RTTzsKKworCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KHRwLT5wZGV2LCBQQ0lfQ0FQX0lEX0VYUCkgIT0gMCkKKwkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfUENJX0VYUFJFU1M7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMgJiYKKwkgICAgdHAtPnBjaV9sYXRfdGltZXIgPCA2NCkgeworCQl0cC0+cGNpX2xhdF90aW1lciA9IDY0OworCisJCWNhY2hlbGluZV9zel9yZWcgID0gKCh0cC0+cGNpX2NhY2hlbGluZV9zeiAmIDB4ZmYpIDw8ICAwKTsKKwkJY2FjaGVsaW5lX3N6X3JlZyB8PSAoKHRwLT5wY2lfbGF0X3RpbWVyICAgICYgMHhmZikgPDwgIDgpOworCQljYWNoZWxpbmVfc3pfcmVnIHw9ICgodHAtPnBjaV9oZHJfdHlwZSAgICAgJiAweGZmKSA8PCAxNik7CisJCWNhY2hlbGluZV9zel9yZWcgfD0gKCh0cC0+cGNpX2Jpc3QgICAgICAgICAmIDB4ZmYpIDw8IDI0KTsKKworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfQ0FDSEVMSU5FU1osCisJCQkJICAgICAgIGNhY2hlbGluZV9zel9yZWcpOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1BDSVNUQVRFLAorCQkJICAgICAgJnBjaV9zdGF0ZV9yZWcpOworCisJaWYgKChwY2lfc3RhdGVfcmVnICYgUENJU1RBVEVfQ09OVl9QQ0lfTU9ERSkgPT0gMCkgeworCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BDSVhfTU9ERTsKKworCQkvKiBJZiB0aGlzIGlzIGEgNTcwMCBCWCBjaGlwc2V0LCBhbmQgd2UgYXJlIGluIFBDSS1YCisJCSAqIG1vZGUsIGVuYWJsZSByZWdpc3RlciB3cml0ZSB3b3JrYXJvdW5kLgorCQkgKgorCQkgKiBUaGUgd29ya2Fyb3VuZCBpcyB0byB1c2UgaW5kaXJlY3QgcmVnaXN0ZXIgYWNjZXNzZXMKKwkJICogZm9yIGFsbCBjaGlwIHdyaXRlcyBub3QgdG8gbWFpbGJveCByZWdpc3RlcnMuCisJCSAqLworCQlpZiAoR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IENISVBSRVZfNTcwMF9CWCkgeworCQkJdTMyIHBtX3JlZzsKKwkJCXUxNiBwY2lfY21kOworCisJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BDSVhfVEFSR0VUX0hXQlVHOworCisJCQkvKiBUaGUgY2hpcCBjYW4gaGF2ZSBpdCdzIHBvd2VyIG1hbmFnZW1lbnQgUENJIGNvbmZpZworCQkJICogc3BhY2UgcmVnaXN0ZXJzIGNsb2JiZXJlZCBkdWUgdG8gdGhpcyBidWcuCisJCQkgKiBTbyBleHBsaWNpdGx5IGZvcmNlIHRoZSBjaGlwIGludG8gRDAgaGVyZS4KKwkJCSAqLworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUE1fQ1RSTF9TVEFULAorCQkJCQkgICAgICAmcG1fcmVnKTsKKwkJCXBtX3JlZyAmPSB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKKwkJCXBtX3JlZyB8PSBQQ0lfUE1fQ1RSTF9QTUVfRU5BQkxFIHwgMCAvKiBEMCAqLzsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9QTV9DVFJMX1NUQVQsCisJCQkJCSAgICAgICBwbV9yZWcpOworCisJCQkvKiBBbHNvLCBmb3JjZSBTRVJSIy9QRVJSIyBpbiBQQ0kgY29tbWFuZC4gKi8KKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jbWQpOworCQkJcGNpX2NtZCB8PSBQQ0lfQ09NTUFORF9QQVJJVFkgfCBQQ0lfQ09NTUFORF9TRVJSOworCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NtZCk7CisJCX0KKwl9CisKKwkvKiBCYWNrIHRvIGJhY2sgcmVnaXN0ZXIgd3JpdGVzIGNhbiBjYXVzZSBwcm9ibGVtcyBvbiB0aGlzIGNoaXAsCisJICogdGhlIHdvcmthcm91bmQgaXMgdG8gcmVhZCBiYWNrIGFsbCByZWcgd3JpdGVzIGV4Y2VwdCB0aG9zZSB0bworCSAqIG1haWxib3ggcmVncy4gIFNlZSB0ZzNfd3JpdGVfaW5kaXJlY3RfcmVnMzIoKS4KKwkgKgorCSAqIFBDSSBFeHByZXNzIDU3NTBfQTAgcmV2IGNoaXBzIG5lZWQgdGhpcyB3b3JrYXJvdW5kIHRvby4KKwkgKi8KKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEgfHwKKwkgICAgKCh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSAmJgorCSAgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3NTBfQTApKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHXzU3MDFfUkVHX1dSSVRFX0JVRzsKKworCWlmICgocGNpX3N0YXRlX3JlZyAmIFBDSVNUQVRFX0JVU19TUEVFRF9ISUdIKSAhPSAwKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BDSV9ISUdIX1NQRUVEOworCWlmICgocGNpX3N0YXRlX3JlZyAmIFBDSVNUQVRFX0JVU18zMkJJVCkgIT0gMCkKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19QQ0lfMzJCSVQ7CisKKwkvKiBDaGlwLXNwZWNpZmljIGZpeHVwIGZyb20gQnJvYWRjb20gZHJpdmVyICovCisJaWYgKCh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNF9BMCkgJiYKKwkgICAgKCEocGNpX3N0YXRlX3JlZyAmIFBDSVNUQVRFX1JFVFJZX1NBTUVfRE1BKSkpIHsKKwkJcGNpX3N0YXRlX3JlZyB8PSBQQ0lTVEFURV9SRVRSWV9TQU1FX0RNQTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1BDSVNUQVRFLCBwY2lfc3RhdGVfcmVnKTsKKwl9CisKKwkvKiBGb3JjZSB0aGUgY2hpcCBpbnRvIEQwLiAqLworCWVyciA9IHRnM19zZXRfcG93ZXJfc3RhdGUodHAsIDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiKCVzKSB0cmFuc2l0aW9uIHRvIEQwIGZhaWxlZFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHRwLT5wZGV2KSk7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogNTcwMCBCMCBjaGlwcyBkbyBub3Qgc3VwcG9ydCBjaGVja3N1bW1pbmcgY29ycmVjdGx5IGR1ZQorCSAqIHRvIGhhcmR3YXJlIGJ1Z3MuCisJICovCisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAwX0IwKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0JST0tFTl9DSEVDS1NVTVM7CisKKwkvKiBQc2V1ZG8taGVhZGVyIGNoZWNrc3VtIGlzIGRvbmUgYnkgaGFyZHdhcmUgbG9naWMgYW5kIG5vdAorCSAqIHRoZSBvZmZsb2FkIHByb2Nlc3NlcnMsIHNvIG1ha2UgdGhlIGNoaXAgZG8gdGhlIHBzZXVkby0KKwkgKiBoZWFkZXIgY2hlY2tzdW1zIG9uIHJlY2VpdmUuICBGb3IgdHJhbnNtaXQgaXQgaXMgbW9yZQorCSAqIGNvbnZlbmllbnQgdG8gZG8gdGhlIHBzZXVkby1oZWFkZXIgY2hlY2tzdW0gaW4gc29mdHdhcmUKKwkgKiBhcyBMaW51eCBkb2VzIHRoYXQgb24gdHJhbnNtaXQgZm9yIHVzIGluIGFsbCBjYXNlcy4KKwkgKi8KKwl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX05PX1RYX1BTRVVET19DU1VNOworCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX05PX1JYX1BTRVVET19DU1VNOworCisJLyogRGVyaXZlIGluaXRpYWwganVtYm8gbW9kZSBmcm9tIE1UVSBhc3NpZ25lZCBpbgorCSAqIGV0aGVyX3NldHVwKCkgdmlhIHRoZSBhbGxvY19ldGhlcmRldigpIGNhbGwKKwkgKi8KKwlpZiAodHAtPmRldi0+bXR1ID4gRVRIX0RBVEFfTEVOKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0pVTUJPX0VOQUJMRTsKKworCS8qIERldGVybWluZSBXYWtlT25MYW4gc3BlZWQgdG8gdXNlLiAqLworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAorCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9BMCB8fAorCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9CMCB8fAorCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9CMikgeworCQl0cC0+dGczX2ZsYWdzICY9IH4oVEczX0ZMQUdfV09MX1NQRUVEXzEwME1CKTsKKwl9IGVsc2UgeworCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1dPTF9TUEVFRF8xMDBNQjsKKwl9CisKKwkvKiBBIGZldyBib2FyZHMgZG9uJ3Qgd2FudCBFdGhlcm5ldEBXaXJlU3BlZWQgcGh5IGZlYXR1cmUgKi8KKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwKSB8fAorCSAgICAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSAmJgorCSAgICAgKHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzA1X0EwKSAmJgorCSAgICAgKHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzA1X0ExKSkpCisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX05PX0VUSF9XSVJFX1NQRUVEOworCisJaWYgKEdFVF9DSElQX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBDSElQUkVWXzU3MDNfQVggfHwKKwkgICAgR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IENISVBSRVZfNTcwNF9BWCkKKwkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfUEhZX0FEQ19CVUc7CisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA0X0EwKQorCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QSFlfNTcwNF9BMF9CVUc7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApCisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1BIWV9CRVJfQlVHOworCisJLyogT25seSA1NzAxIGFuZCBsYXRlciBzdXBwb3J0IHRhZ2dlZCBpcnEgc3RhdHVzIG1vZGUuCisJICogQWxzbywgNTc4OCBjaGlwcyBjYW5ub3QgdXNlIHRhZ2dlZCBpcnEgc3RhdHVzLgorCSAqCisJICogSG93ZXZlciwgc2luY2Ugd2UgYXJlIHVzaW5nIE5BUEkgYXZvaWQgdGFnZ2VkIGlycSBzdGF0dXMKKwkgKiBiZWNhdXNlIHRoZSBpbnRlcnJ1cHQgY29uZGl0aW9uIGlzIG1vcmUgZGlmZmljdWx0IHRvCisJICogZnVsbHkgY2xlYXIgaW4gdGhhdCBtb2RlLgorCSAqLworCXRwLT5jb2FsZXNjZV9tb2RlID0gMDsKKworCWlmIChHRVRfQ0hJUF9SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQ0hJUFJFVl81NzAwX0FYICYmCisJICAgIEdFVF9DSElQX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBDSElQUkVWXzU3MDBfQlgpCisJCXRwLT5jb2FsZXNjZV9tb2RlIHw9IEhPU1RDQ19NT0RFXzMyQllURTsKKworCS8qIEluaXRpYWxpemUgTUFDIE1JIG1vZGUsIHBvbGxpbmcgZGlzYWJsZWQuICovCisJdHczMl9mKE1BQ19NSV9NT0RFLCB0cC0+bWlfbW9kZSk7CisJdWRlbGF5KDgwKTsKKworCS8qIEluaXRpYWxpemUgZGF0YS9kZXNjcmlwdG9yIGJ5dGUvd29yZCBzd2FwcGluZy4gKi8KKwl2YWwgPSB0cjMyKEdSQ19NT0RFKTsKKwl2YWwgJj0gR1JDX01PREVfSE9TVF9TVEFDS1VQOworCXR3MzIoR1JDX01PREUsIHZhbCB8IHRwLT5ncmNfbW9kZSk7CisKKwl0ZzNfc3dpdGNoX2Nsb2Nrcyh0cCk7CisKKwkvKiBDbGVhciB0aGlzIG91dCBmb3Igc2FuaXR5LiAqLworCXR3MzIoVEczUENJX01FTV9XSU5fQkFTRV9BRERSLCAwKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1BDSVNUQVRFLAorCQkJICAgICAgJnBjaV9zdGF0ZV9yZWcpOworCWlmICgocGNpX3N0YXRlX3JlZyAmIFBDSVNUQVRFX0NPTlZfUENJX01PREUpID09IDAgJiYKKwkgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX1RBUkdFVF9IV0JVRykgPT0gMCkgeworCQl1MzIgY2hpcHJldmlkID0gR0VUX0NISVBfUkVWX0lEKHRwLT5taXNjX2hvc3RfY3RybCk7CisKKwkJaWYgKGNoaXByZXZpZCA9PSBDSElQUkVWX0lEXzU3MDFfQTAgfHwKKwkJICAgIGNoaXByZXZpZCA9PSBDSElQUkVWX0lEXzU3MDFfQjAgfHwKKwkJICAgIGNoaXByZXZpZCA9PSBDSElQUkVWX0lEXzU3MDFfQjIgfHwKKwkJICAgIGNoaXByZXZpZCA9PSBDSElQUkVWX0lEXzU3MDFfQjUpIHsKKwkJCXZvaWQgX19pb21lbSAqc3JhbV9iYXNlOworCisJCQkvKiBXcml0ZSBzb21lIGR1bW15IHdvcmRzIGludG8gdGhlIFNSQU0gc3RhdHVzIGJsb2NrCisJCQkgKiBhcmVhLCBzZWUgaWYgaXQgcmVhZHMgYmFjayBjb3JyZWN0bHkuICBJZiB0aGUgcmV0dXJuCisJCQkgKiB2YWx1ZSBpcyBiYWQsIGZvcmNlIGVuYWJsZSB0aGUgUENJWCB3b3JrYXJvdW5kLgorCQkJICovCisJCQlzcmFtX2Jhc2UgPSB0cC0+cmVncyArIE5JQ19TUkFNX1dJTl9CQVNFICsgTklDX1NSQU1fU1RBVFNfQkxLOworCisJCQl3cml0ZWwoMHgwMDAwMDAwMCwgc3JhbV9iYXNlKTsKKwkJCXdyaXRlbCgweDAwMDAwMDAwLCBzcmFtX2Jhc2UgKyA0KTsKKwkJCXdyaXRlbCgweGZmZmZmZmZmLCBzcmFtX2Jhc2UgKyA0KTsKKwkJCWlmIChyZWFkbChzcmFtX2Jhc2UpICE9IDB4MDAwMDAwMDApCisJCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19QQ0lYX1RBUkdFVF9IV0JVRzsKKwkJfQorCX0KKworCXVkZWxheSg1MCk7CisJdGczX252cmFtX2luaXQodHApOworCisJZ3JjX21pc2NfY2ZnID0gdHIzMihHUkNfTUlTQ19DRkcpOworCWdyY19taXNjX2NmZyAmPSBHUkNfTUlTQ19DRkdfQk9BUkRfSURfTUFTSzsKKworCS8qIEJyb2FkY29tJ3MgZHJpdmVyIHNheXMgdGhhdCBDSU9CRSBtdWx0aXNwbGl0IGhhcyBhIGJ1ZyAqLworI2lmIDAKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQgJiYKKwkgICAgZ3JjX21pc2NfY2ZnID09IEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzA0Q0lPQkUpIHsKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19TUExJVF9NT0RFOworCQl0cC0+c3BsaXRfbW9kZV9tYXhfcmVxcyA9IFNQTElUX01PREVfNTcwNF9NQVhfUkVROworCX0KKyNlbmRpZgorCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSAmJgorCSAgICAoZ3JjX21pc2NfY2ZnID09IEdSQ19NSVNDX0NGR19CT0FSRF9JRF81Nzg4IHx8CisJICAgICBncmNfbWlzY19jZmcgPT0gR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3ODhNKSkKKwkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfSVNfNTc4ODsKKworCS8qIHRoZXNlIGFyZSBsaW1pdGVkIHRvIDEwLzEwMCBvbmx5ICovCisJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMyAmJgorCSAgICAgKGdyY19taXNjX2NmZyA9PSAweDgwMDAgfHwgZ3JjX21pc2NfY2ZnID09IDB4NDAwMCkpIHx8CisJICAgIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSAmJgorCSAgICAgdHAtPnBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0JST0FEQ09NICYmCisJICAgICAodHAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJR09OM181OTAxIHx8CisJICAgICAgdHAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJR09OM181OTAxXzIgfHwKKwkgICAgICB0cC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDVGKSkgfHwKKwkgICAgKHRwLT5wZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9CUk9BRENPTSAmJgorCSAgICAgKHRwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MUYgfHwKKwkgICAgICB0cC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTNGKSkpCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfMTBfMTAwX09OTFk7CisKKwllcnIgPSB0ZzNfcGh5X3Byb2JlKHRwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiglcykgcGh5IHByb2JlIGZhaWxlZCwgZXJyICVkXG4iLAorCQkgICAgICAgcGNpX25hbWUodHAtPnBkZXYpLCBlcnIpOworCQkvKiAuLi4gYnV0IGRvIG5vdCByZXR1cm4gaW1tZWRpYXRlbHkgLi4uICovCisJfQorCisJdGczX3JlYWRfcGFydG5vKHRwKTsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpIHsKKwkJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfVVNFX01JX0lOVEVSUlVQVDsKKwl9IGVsc2UgeworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDApCisJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1VTRV9NSV9JTlRFUlJVUFQ7CisJCWVsc2UKKwkJCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX1VTRV9NSV9JTlRFUlJVUFQ7CisJfQorCisJLyogNTcwMCB7QVgsQlh9IGNoaXBzIGhhdmUgYSBicm9rZW4gc3RhdHVzIGJsb2NrIGxpbmsKKwkgKiBjaGFuZ2UgYml0IGltcGxlbWVudGF0aW9uLCBzbyB3ZSBtdXN0IHVzZSB0aGUKKwkgKiBzdGF0dXMgcmVnaXN0ZXIgaW4gdGhvc2UgY2FzZXMuCisJICovCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1VTRV9MSU5LQ0hHX1JFRzsKKwllbHNlCisJCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX1VTRV9MSU5LQ0hHX1JFRzsKKworCS8qIFRoZSBsZWRfY3RybCBpcyBzZXQgZHVyaW5nIHRnM19waHlfcHJvYmUsIGhlcmUgd2UgbWlnaHQKKwkgKiBoYXZlIHRvIGZvcmNlIHRoZSBsaW5rIHN0YXR1cyBwb2xsaW5nIG1lY2hhbmlzbSBiYXNlZAorCSAqIHVwb24gc3Vic3lzdGVtIElEcy4KKwkgKi8KKwlpZiAodHAtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9ERUxMICYmCisJICAgICEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSkgeworCQl0cC0+dGczX2ZsYWdzIHw9IChURzNfRkxBR19VU0VfTUlfSU5URVJSVVBUIHwKKwkJCQkgIFRHM19GTEFHX1VTRV9MSU5LQ0hHX1JFRyk7CisJfQorCisJLyogRm9yIGFsbCBTRVJERVMgd2UgcG9sbCB0aGUgTUFDIHN0YXR1cyByZWdpc3Rlci4gKi8KKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BPTExfU0VSREVTOworCWVsc2UKKwkJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfUE9MTF9TRVJERVM7CisKKwkvKiA1NzAwIEJYIGNoaXBzIG5lZWQgdG8gaGF2ZSB0aGVpciBUWCBwcm9kdWNlciBpbmRleCBtYWlsYm94ZXMKKwkgKiB3cml0dGVuIHR3aWNlIHRvIHdvcmthcm91bmQgYSBidWcuCisJICovCisJaWYgKEdFVF9DSElQX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBDSElQUkVWXzU3MDBfQlgpCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfVFhEX01CT1hfSFdCVUc7CisJZWxzZQorCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19UWERfTUJPWF9IV0JVRzsKKworCS8qIEl0IHNlZW1zIGFsbCBjaGlwcyBjYW4gZ2V0IGNvbmZ1c2VkIGlmIFRYIGJ1ZmZlcnMKKwkgKiBzdHJhZGRsZSB0aGUgNEdCIGFkZHJlc3MgYm91bmRhcnkgaW4gc29tZSBjYXNlcy4KKwkgKi8KKwl0cC0+ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB0ZzNfc3RhcnRfeG1pdDsKKworCXRwLT5yeF9vZmZzZXQgPSAyOworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMSAmJgorCSAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkgIT0gMCkKKwkJdHAtPnJ4X29mZnNldCA9IDA7CisKKwkvKiBCeSBkZWZhdWx0LCBkaXNhYmxlIHdha2Utb24tbGFuLiAgVXNlciBjYW4gY2hhbmdlIHRoaXMKKwkgKiB1c2luZyBFVEhUT09MX1NXT0wuCisJICovCisJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfV09MX0VOQUJMRTsKKworCXJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBDT05GSUdfU1BBUkM2NAorc3RhdGljIGludCBfX2RldmluaXQgdGczX2dldF9tYWNhZGRyX3NwYXJjKHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0cC0+ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdHAtPnBkZXY7CisJc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7CisKKwlpZiAocGNwICE9IE5VTEwpIHsKKwkJaW50IG5vZGUgPSBwY3AtPnByb21fbm9kZTsKKworCQlpZiAocHJvbV9nZXRwcm9wbGVuKG5vZGUsICJsb2NhbC1tYWMtYWRkcmVzcyIpID09IDYpIHsKKwkJCXByb21fZ2V0cHJvcGVydHkobm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIiwKKwkJCQkJIGRldi0+ZGV2X2FkZHIsIDYpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRnM19nZXRfZGVmYXVsdF9tYWNhZGRyX3NwYXJjKHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0cC0+ZGV2OworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGlkcHJvbS0+aWRfZXRoYWRkciwgNik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgdGczX2dldF9kZXZpY2VfYWRkcmVzcyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdHAtPmRldjsKKwl1MzIgaGksIGxvLCBtYWNfb2Zmc2V0OworCisjaWZkZWYgQ09ORklHX1NQQVJDNjQKKwlpZiAoIXRnM19nZXRfbWFjYWRkcl9zcGFyYyh0cCkpCisJCXJldHVybiAwOworI2VuZGlmCisKKwltYWNfb2Zmc2V0ID0gMHg3YzsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQgJiYKKwkgICAgISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMRzJfU1VOXzU3MFgpKSB7CisJCWlmICh0cjMyKFRHM1BDSV9EVUFMX01BQ19DVFJMKSAmIERVQUxfTUFDX0NUUkxfSUQpCisJCQltYWNfb2Zmc2V0ID0gMHhjYzsKKwkJaWYgKHRnM19udnJhbV9sb2NrKHRwKSkKKwkJCXR3MzJfZihOVlJBTV9DTUQsIE5WUkFNX0NNRF9SRVNFVCk7CisJCWVsc2UKKwkJCXRnM19udnJhbV91bmxvY2sodHApOworCX0KKworCS8qIEZpcnN0IHRyeSB0byBnZXQgaXQgZnJvbSBNQUMgYWRkcmVzcyBtYWlsYm94LiAqLworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fTUFDX0FERFJfSElHSF9NQk9YLCAmaGkpOworCWlmICgoaGkgPj4gMTYpID09IDB4NDg0YikgeworCQlkZXYtPmRldl9hZGRyWzBdID0gKGhpID4+ICA4KSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbMV0gPSAoaGkgPj4gIDApICYgMHhmZjsKKworCQl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX01BQ19BRERSX0xPV19NQk9YLCAmbG8pOworCQlkZXYtPmRldl9hZGRyWzJdID0gKGxvID4+IDI0KSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbM10gPSAobG8gPj4gMTYpICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkcls0XSA9IChsbyA+PiAgOCkgJiAweGZmOworCQlkZXYtPmRldl9hZGRyWzVdID0gKGxvID4+ICAwKSAmIDB4ZmY7CisJfQorCS8qIE5leHQsIHRyeSBOVlJBTS4gKi8KKwllbHNlIGlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxHMl9TVU5fNTcwWCkgJiYKKwkJICF0ZzNfbnZyYW1fcmVhZCh0cCwgbWFjX29mZnNldCArIDAsICZoaSkgJiYKKwkJICF0ZzNfbnZyYW1fcmVhZCh0cCwgbWFjX29mZnNldCArIDQsICZsbykpIHsKKwkJZGV2LT5kZXZfYWRkclswXSA9ICgoaGkgPj4gMTYpICYgMHhmZik7CisJCWRldi0+ZGV2X2FkZHJbMV0gPSAoKGhpID4+IDI0KSAmIDB4ZmYpOworCQlkZXYtPmRldl9hZGRyWzJdID0gKChsbyA+PiAgMCkgJiAweGZmKTsKKwkJZGV2LT5kZXZfYWRkclszXSA9ICgobG8gPj4gIDgpICYgMHhmZik7CisJCWRldi0+ZGV2X2FkZHJbNF0gPSAoKGxvID4+IDE2KSAmIDB4ZmYpOworCQlkZXYtPmRldl9hZGRyWzVdID0gKChsbyA+PiAyNCkgJiAweGZmKTsKKwl9CisJLyogRmluYWxseSBqdXN0IGZldGNoIGl0IG91dCBvZiB0aGUgTUFDIGNvbnRyb2wgcmVncy4gKi8KKwllbHNlIHsKKwkJaGkgPSB0cjMyKE1BQ19BRERSXzBfSElHSCk7CisJCWxvID0gdHIzMihNQUNfQUREUl8wX0xPVyk7CisKKwkJZGV2LT5kZXZfYWRkcls1XSA9IGxvICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkcls0XSA9IChsbyA+PiA4KSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbM10gPSAobG8gPj4gMTYpICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkclsyXSA9IChsbyA+PiAyNCkgJiAweGZmOworCQlkZXYtPmRldl9hZGRyWzFdID0gaGkgJiAweGZmOworCQlkZXYtPmRldl9hZGRyWzBdID0gKGhpID4+IDgpICYgMHhmZjsKKwl9CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoJmRldi0+ZGV2X2FkZHJbMF0pKSB7CisjaWZkZWYgQ09ORklHX1NQQVJDNjQKKwkJaWYgKCF0ZzNfZ2V0X2RlZmF1bHRfbWFjYWRkcl9zcGFyYyh0cCkpCisJCQlyZXR1cm4gMDsKKyNlbmRpZgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRnM19kb190ZXN0X2RtYShzdHJ1Y3QgdGczICp0cCwgdTMyICpidWYsIGRtYV9hZGRyX3QgYnVmX2RtYSwgaW50IHNpemUsIGludCB0b19kZXZpY2UpCit7CisJc3RydWN0IHRnM19pbnRlcm5hbF9idWZmZXJfZGVzYyB0ZXN0X2Rlc2M7CisJdTMyIHNyYW1fZG1hX2Rlc2NzOworCWludCBpLCByZXQ7CisKKwlzcmFtX2RtYV9kZXNjcyA9IE5JQ19TUkFNX0RNQV9ERVNDX1BPT0xfQkFTRTsKKworCXR3MzIoRlRRX1JDVkJEX0NPTVBfRklGT19FTlFERVEsIDApOworCXR3MzIoRlRRX1JDVkRBVEFfQ09NUF9GSUZPX0VOUURFUSwgMCk7CisJdHczMihSRE1BQ19TVEFUVVMsIDApOworCXR3MzIoV0RNQUNfU1RBVFVTLCAwKTsKKworCXR3MzIoQlVGTUdSX01PREUsIDApOworCXR3MzIoRlRRX1JFU0VULCAwKTsKKworCXRlc3RfZGVzYy5hZGRyX2hpID0gKCh1NjQpIGJ1Zl9kbWEpID4+IDMyOworCXRlc3RfZGVzYy5hZGRyX2xvID0gYnVmX2RtYSAmIDB4ZmZmZmZmZmY7CisJdGVzdF9kZXNjLm5pY19tYnVmID0gMHgwMDAwMjEwMDsKKwl0ZXN0X2Rlc2MubGVuID0gc2l6ZTsKKworCS8qCisJICogSFAgWlgxIHdhcyBzZWVpbmcgdGVzdCBmYWlsdXJlcyBmb3IgNTcwMSBjYXJkcyBydW5uaW5nIGF0IDMzTWh6CisJICogdGhlICpzZWNvbmQqIHRpbWUgdGhlIHRnMyBkcml2ZXIgd2FzIGdldHRpbmcgbG9hZGVkIGFmdGVyIGFuCisJICogaW5pdGlhbCBzY2FuLgorCSAqCisJICogQnJvYWRjb20gdGVsbHMgbWU6CisJICogICAuLi50aGUgRE1BIGVuZ2luZSBpcyBjb25uZWN0ZWQgdG8gdGhlIEdSQyBibG9jayBhbmQgYSBETUEKKwkgKiAgIHJlc2V0IG1heSBhZmZlY3QgdGhlIEdSQyBibG9jayBpbiBzb21lIHVucHJlZGljdGFibGUgd2F5Li4uCisJICogICBUaGUgYmVoYXZpb3Igb2YgcmVzZXRzIHRvIGluZGl2aWR1YWwgYmxvY2tzIGhhcyBub3QgYmVlbiB0ZXN0ZWQuCisJICoKKwkgKiBCcm9hZGNvbSBub3RlZCB0aGUgR1JDIHJlc2V0IHdpbGwgYWxzbyByZXNldCBhbGwgc3ViLWNvbXBvbmVudHMuCisJICovCisJaWYgKHRvX2RldmljZSkgeworCQl0ZXN0X2Rlc2MuY3FpZF9zcWlkID0gKDEzIDw8IDgpIHwgMjsKKworCQl0dzMyX2YoUkRNQUNfTU9ERSwgUkRNQUNfTU9ERV9FTkFCTEUpOworCQl1ZGVsYXkoNDApOworCX0gZWxzZSB7CisJCXRlc3RfZGVzYy5jcWlkX3NxaWQgPSAoMTYgPDwgOCkgfCA3OworCisJCXR3MzJfZihXRE1BQ19NT0RFLCBXRE1BQ19NT0RFX0VOQUJMRSk7CisJCXVkZWxheSg0MCk7CisJfQorCXRlc3RfZGVzYy5mbGFncyA9IDB4MDAwMDAwMDU7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZih0ZXN0X2Rlc2MpIC8gc2l6ZW9mKHUzMikpOyBpKyspIHsKKwkJdTMyIHZhbDsKKworCQl2YWwgPSAqKCgodTMyICopJnRlc3RfZGVzYykgKyBpKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01FTV9XSU5fQkFTRV9BRERSLAorCQkJCSAgICAgICBzcmFtX2RtYV9kZXNjcyArIChpICogc2l6ZW9mKHUzMikpKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01FTV9XSU5fREFUQSwgdmFsKTsKKwl9CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01FTV9XSU5fQkFTRV9BRERSLCAwKTsKKworCWlmICh0b19kZXZpY2UpIHsKKwkJdHczMihGVFFfRE1BX0hJR0hfUkVBRF9GSUZPX0VOUURFUSwgc3JhbV9kbWFfZGVzY3MpOworCX0gZWxzZSB7CisJCXR3MzIoRlRRX0RNQV9ISUdIX1dSSVRFX0ZJRk9fRU5RREVRLCBzcmFtX2RtYV9kZXNjcyk7CisJfQorCisJcmV0ID0gLUVOT0RFVjsKKwlmb3IgKGkgPSAwOyBpIDwgNDA7IGkrKykgeworCQl1MzIgdmFsOworCisJCWlmICh0b19kZXZpY2UpCisJCQl2YWwgPSB0cjMyKEZUUV9SQ1ZCRF9DT01QX0ZJRk9fRU5RREVRKTsKKwkJZWxzZQorCQkJdmFsID0gdHIzMihGVFFfUkNWREFUQV9DT01QX0ZJRk9fRU5RREVRKTsKKwkJaWYgKCh2YWwgJiAweGZmZmYpID09IHNyYW1fZG1hX2Rlc2NzKSB7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQl1ZGVsYXkoMTAwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFRFU1RfQlVGRkVSX1NJWkUJMHg0MDAKKworc3RhdGljIGludCBfX2RldmluaXQgdGczX3Rlc3RfZG1hKHN0cnVjdCB0ZzMgKnRwKQoreworCWRtYV9hZGRyX3QgYnVmX2RtYTsKKwl1MzIgKmJ1ZjsKKwlpbnQgcmV0OworCisJYnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodHAtPnBkZXYsIFRFU1RfQlVGRkVSX1NJWkUsICZidWZfZG1hKTsKKwlpZiAoIWJ1ZikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9ub2ZyZWU7CisJfQorCisJdHAtPmRtYV9yd2N0cmwgPSAoKDB4NyA8PCBETUFfUldDVFJMX1BDSV9XUklURV9DTURfU0hJRlQpIHwKKwkJCSAgKDB4NiA8PCBETUFfUldDVFJMX1BDSV9SRUFEX0NNRF9TSElGVCkpOworCisjaWZuZGVmIENPTkZJR19YODYKKwl7CisJCXU4IGJ5dGU7CisJCWludCBjYWNoZWxpbmVfc2l6ZTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUodHAtPnBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsICZieXRlKTsKKworCQlpZiAoYnl0ZSA9PSAwKQorCQkJY2FjaGVsaW5lX3NpemUgPSAxMDI0OworCQllbHNlCisJCQljYWNoZWxpbmVfc2l6ZSA9IChpbnQpIGJ5dGUgKiA0OworCisJCXN3aXRjaCAoY2FjaGVsaW5lX3NpemUpIHsKKwkJY2FzZSAxNjoKKwkJY2FzZSAzMjoKKwkJY2FzZSA2NDoKKwkJY2FzZSAxMjg6CisJCQlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpICYmCisJCQkgICAgISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSkgeworCQkJCXRwLT5kbWFfcndjdHJsIHw9CisJCQkJCURNQV9SV0NUUkxfV1JJVEVfQk5EUllfMzg0X1BDSVg7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpIHsKKwkJCQl0cC0+ZG1hX3J3Y3RybCAmPQorCQkJCQl+KERNQV9SV0NUUkxfUENJX1dSSVRFX0NNRCk7CisJCQkJdHAtPmRtYV9yd2N0cmwgfD0KKwkJCQkJRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8xMjhfUENJRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGZhbGx0aHJvdWdoICovCisJCWNhc2UgMjU2OgorCQkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkgJiYKKwkJCSAgICAhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpKQorCQkJCXRwLT5kbWFfcndjdHJsIHw9CisJCQkJCURNQV9SV0NUUkxfV1JJVEVfQk5EUllfMjU2OworCQkJZWxzZSBpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSkKKwkJCQl0cC0+ZG1hX3J3Y3RybCB8PQorCQkJCQlETUFfUldDVFJMX1dSSVRFX0JORFJZXzI1Nl9QQ0lYOworCQl9OworCX0KKyNlbmRpZgorCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpIHsKKwkJLyogRE1BIHJlYWQgd2F0ZXJtYXJrIG5vdCB1c2VkIG9uIFBDSUUgKi8KKwkJdHAtPmRtYV9yd2N0cmwgfD0gMHgwMDE4MDAwMDsKKwl9IGVsc2UgaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkpIHsKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1IHx8CisJCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkKKwkJCXRwLT5kbWFfcndjdHJsIHw9IDB4MDAzZjAwMDA7CisJCWVsc2UKKwkJCXRwLT5kbWFfcndjdHJsIHw9IDB4MDAzZjAwMGY7CisJfSBlbHNlIHsKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzIHx8CisJCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkgeworCQkJdTMyIGNjdmFsID0gKHRyMzIoVEczUENJX0NMT0NLX0NUUkwpICYgMHgxZik7CisKKwkJCWlmIChjY3ZhbCA9PSAweDYgfHwgY2N2YWwgPT0gMHg3KQorCQkJCXRwLT5kbWFfcndjdHJsIHw9IERNQV9SV0NUUkxfT05FX0RNQTsKKworCQkJLyogU2V0IGJpdCAyMyB0byByZW5hYmxlIFBDSVggaHcgYnVnIGZpeCAqLworCQkJdHAtPmRtYV9yd2N0cmwgfD0gMHgwMDlmMDAwMDsKKwkJfSBlbHNlIHsKKwkJCXRwLT5kbWFfcndjdHJsIHw9IDB4MDAxYjAwMGY7CisJCX0KKwl9CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpCisJCXRwLT5kbWFfcndjdHJsICY9IDB4ZmZmZmZmZjA7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDAgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpIHsKKwkJLyogUmVtb3ZlIHRoaXMgaWYgaXQgY2F1c2VzIHByb2JsZW1zIGZvciBzb21lIGJvYXJkcy4gKi8KKwkJdHAtPmRtYV9yd2N0cmwgfD0gRE1BX1JXQ1RSTF9VU0VfTUVNX1JFQURfTVVMVDsKKworCQkvKiBPbiA1NzAwLzU3MDEgY2hpcHMsIHdlIG5lZWQgdG8gc2V0IHRoaXMgYml0LgorCQkgKiBPdGhlcndpc2UgdGhlIGNoaXAgd2lsbCBpc3N1ZSBjYWNoZWxpbmUgdHJhbnNhY3Rpb25zCisJCSAqIHRvIHN0cmVhbWFibGUgRE1BIG1lbW9yeSB3aXRoIG5vdCBhbGwgdGhlIGJ5dGUKKwkJICogZW5hYmxlcyB0dXJuZWQgb24uICBUaGlzIGlzIGFuIGVycm9yIG9uIHNldmVyYWwKKwkJICogUklTQyBQQ0kgY29udHJvbGxlcnMsIGluIHBhcnRpY3VsYXIgc3BhcmM2NC4KKwkJICoKKwkJICogT24gNTcwMy81NzA0IGNoaXBzLCB0aGlzIGJpdCBoYXMgYmVlbiByZWFzc2lnbmVkCisJCSAqIGEgZGlmZmVyZW50IG1lYW5pbmcuICBJbiBwYXJ0aWN1bGFyLCBpdCBpcyB1c2VkCisJCSAqIG9uIHRob3NlIGNoaXBzIHRvIGVuYWJsZSBhIFBDSS1YIHdvcmthcm91bmQuCisJCSAqLworCQl0cC0+ZG1hX3J3Y3RybCB8PSBETUFfUldDVFJMX0FTU0VSVF9BTExfQkU7CisJfQorCisJdHczMihURzNQQ0lfRE1BX1JXX0NUUkwsIHRwLT5kbWFfcndjdHJsKTsKKworI2lmIDAKKwkvKiBVbm5lZWRlZCwgYWxyZWFkeSBkb25lIGJ5IHRnM19nZXRfaW52YXJpYW50cy4gICovCisJdGczX3N3aXRjaF9jbG9ja3ModHApOworI2VuZGlmCisKKwlyZXQgPSAwOworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMCAmJgorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMSkKKwkJZ290byBvdXQ7CisKKwl3aGlsZSAoMSkgeworCQl1MzIgKnAgPSBidWYsIGk7CisKKwkJZm9yIChpID0gMDsgaSA8IFRFU1RfQlVGRkVSX1NJWkUgLyBzaXplb2YodTMyKTsgaSsrKQorCQkJcFtpXSA9IGk7CisKKwkJLyogU2VuZCB0aGUgYnVmZmVyIHRvIHRoZSBjaGlwLiAqLworCQlyZXQgPSB0ZzNfZG9fdGVzdF9kbWEodHAsIGJ1ZiwgYnVmX2RtYSwgVEVTVF9CVUZGRVJfU0laRSwgMSk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidGczX3Rlc3RfZG1hKCkgV3JpdGUgdGhlIGJ1ZmZlciBmYWlsZWQgJWRcbiIsIHJldCk7CisJCQlicmVhazsKKwkJfQorCisjaWYgMAorCQkvKiB2YWxpZGF0ZSBkYXRhIHJlYWNoZWQgY2FyZCBSQU0gY29ycmVjdGx5LiAqLworCQlmb3IgKGkgPSAwOyBpIDwgVEVTVF9CVUZGRVJfU0laRSAvIHNpemVvZih1MzIpOyBpKyspIHsKKwkJCXUzMiB2YWw7CisJCQl0ZzNfcmVhZF9tZW0odHAsIDB4MjEwMCArIChpKjQpLCAmdmFsKTsKKwkJCWlmIChsZTMyX3RvX2NwdSh2YWwpICE9IHBbaV0pIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiAgdGczX3Rlc3RfZG1hKCkgIENhcmQgYnVmZmVyIGNvcnJ1cHRlZCBvbiB3cml0ZSEgKCVkICE9ICVkKVxuIiwgdmFsLCBpKTsKKwkJCQkvKiByZXQgPSAtRU5PREVWIGhlcmU/ICovCisJCQl9CisJCQlwW2ldID0gMDsKKwkJfQorI2VuZGlmCisJCS8qIE5vdyByZWFkIGl0IGJhY2suICovCisJCXJldCA9IHRnM19kb190ZXN0X2RtYSh0cCwgYnVmLCBidWZfZG1hLCBURVNUX0JVRkZFUl9TSVpFLCAwKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ0ZzNfdGVzdF9kbWEoKSBSZWFkIHRoZSBidWZmZXIgZmFpbGVkICVkXG4iLCByZXQpOworCisJCQlicmVhazsKKwkJfQorCisJCS8qIFZlcmlmeSBpdC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IFRFU1RfQlVGRkVSX1NJWkUgLyBzaXplb2YodTMyKTsgaSsrKSB7CisJCQlpZiAocFtpXSA9PSBpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoKHRwLT5kbWFfcndjdHJsICYgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV9NQVNLKSA9PQorCQkJICAgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfRElTQUIpIHsKKwkJCQl0cC0+ZG1hX3J3Y3RybCB8PSBETUFfUldDVFJMX1dSSVRFX0JORFJZXzE2OworCQkJCXR3MzIoVEczUENJX0RNQV9SV19DVFJMLCB0cC0+ZG1hX3J3Y3RybCk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX0VSUiAidGczX3Rlc3RfZG1hKCkgYnVmZmVyIGNvcnJ1cHRlZCBvbiByZWFkIGJhY2shICglZCAhPSAlZClcbiIsIHBbaV0sIGkpOworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQlpZiAoaSA9PSAoVEVTVF9CVUZGRVJfU0laRSAvIHNpemVvZih1MzIpKSkgeworCQkJLyogU3VjY2Vzcy4gKi8KKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworb3V0OgorCXBjaV9mcmVlX2NvbnNpc3RlbnQodHAtPnBkZXYsIFRFU1RfQlVGRkVSX1NJWkUsIGJ1ZiwgYnVmX2RtYSk7CitvdXRfbm9mcmVlOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0ZzNfaW5pdF9saW5rX2NvbmZpZyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgPQorCQkoQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8CisJCSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAorCQkgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAorCQkgQURWRVJUSVNFRF9BdXRvbmVnIHwgQURWRVJUSVNFRF9NSUkpOworCXRwLT5saW5rX2NvbmZpZy5zcGVlZCA9IFNQRUVEX0lOVkFMSUQ7CisJdHAtPmxpbmtfY29uZmlnLmR1cGxleCA9IERVUExFWF9JTlZBTElEOworCXRwLT5saW5rX2NvbmZpZy5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJbmV0aWZfY2Fycmllcl9vZmYodHAtPmRldik7CisJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9IFNQRUVEX0lOVkFMSUQ7CisJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPSBEVVBMRVhfSU5WQUxJRDsKKwl0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlciA9IDA7CisJdHAtPmxpbmtfY29uZmlnLm9yaWdfc3BlZWQgPSBTUEVFRF9JTlZBTElEOworCXRwLT5saW5rX2NvbmZpZy5vcmlnX2R1cGxleCA9IERVUExFWF9JTlZBTElEOworCXRwLT5saW5rX2NvbmZpZy5vcmlnX2F1dG9uZWcgPSBBVVRPTkVHX0lOVkFMSUQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0ZzNfaW5pdF9idWZtZ3JfY29uZmlnKHN0cnVjdCB0ZzMgKnRwKQoreworCXRwLT5idWZtZ3JfY29uZmlnLm1idWZfcmVhZF9kbWFfbG93X3dhdGVyID0KKwkJREVGQVVMVF9NQl9SRE1BX0xPV19XQVRFUjsKKwl0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX21hY19yeF9sb3dfd2F0ZXIgPQorCQlERUZBVUxUX01CX01BQ1JYX0xPV19XQVRFUjsKKwl0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX2hpZ2hfd2F0ZXIgPQorCQlERUZBVUxUX01CX0hJR0hfV0FURVI7CisKKwl0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX3JlYWRfZG1hX2xvd193YXRlcl9qdW1ibyA9CisJCURFRkFVTFRfTUJfUkRNQV9MT1dfV0FURVJfSlVNQk87CisJdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9tYWNfcnhfbG93X3dhdGVyX2p1bWJvID0KKwkJREVGQVVMVF9NQl9NQUNSWF9MT1dfV0FURVJfSlVNQk87CisJdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9oaWdoX3dhdGVyX2p1bWJvID0KKwkJREVGQVVMVF9NQl9ISUdIX1dBVEVSX0pVTUJPOworCisJdHAtPmJ1Zm1ncl9jb25maWcuZG1hX2xvd193YXRlciA9IERFRkFVTFRfRE1BX0xPV19XQVRFUjsKKwl0cC0+YnVmbWdyX2NvbmZpZy5kbWFfaGlnaF93YXRlciA9IERFRkFVTFRfRE1BX0hJR0hfV0FURVI7Cit9CisKK3N0YXRpYyBjaGFyICogX19kZXZpbml0IHRnM19waHlfc3RyaW5nKHN0cnVjdCB0ZzMgKnRwKQoreworCXN3aXRjaCAodHAtPnBoeV9pZCAmIFBIWV9JRF9NQVNLKSB7CisJY2FzZSBQSFlfSURfQkNNNTQwMDoJcmV0dXJuICI1NDAwIjsKKwljYXNlIFBIWV9JRF9CQ001NDAxOglyZXR1cm4gIjU0MDEiOworCWNhc2UgUEhZX0lEX0JDTTU0MTE6CXJldHVybiAiNTQxMSI7CisJY2FzZSBQSFlfSURfQkNNNTcwMToJcmV0dXJuICI1NzAxIjsKKwljYXNlIFBIWV9JRF9CQ001NzAzOglyZXR1cm4gIjU3MDMiOworCWNhc2UgUEhZX0lEX0JDTTU3MDQ6CXJldHVybiAiNTcwNCI7CisJY2FzZSBQSFlfSURfQkNNNTcwNToJcmV0dXJuICI1NzA1IjsKKwljYXNlIFBIWV9JRF9CQ001NzUwOglyZXR1cm4gIjU3NTAiOworCWNhc2UgUEhZX0lEX0JDTTgwMDI6CXJldHVybiAiODAwMi9zZXJkZXMiOworCWNhc2UgMDoJCQlyZXR1cm4gInNlcmRlcyI7CisJZGVmYXVsdDoJCXJldHVybiAidW5rbm93biI7CisJfTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICogX19kZXZpbml0IHRnM19maW5kXzU3MDRfcGVlcihzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGVlcjsKKwl1bnNpZ25lZCBpbnQgZnVuYywgZGV2bnIgPSB0cC0+cGRldi0+ZGV2Zm4gJiB+NzsKKworCWZvciAoZnVuYyA9IDA7IGZ1bmMgPCA4OyBmdW5jKyspIHsKKwkJcGVlciA9IHBjaV9nZXRfc2xvdCh0cC0+cGRldi0+YnVzLCBkZXZuciB8IGZ1bmMpOworCQlpZiAocGVlciAmJiBwZWVyICE9IHRwLT5wZGV2KQorCQkJYnJlYWs7CisJCXBjaV9kZXZfcHV0KHBlZXIpOworCX0KKwlpZiAoIXBlZXIgfHwgcGVlciA9PSB0cC0+cGRldikKKwkJQlVHKCk7CisKKwkvKgorCSAqIFdlIGRvbid0IG5lZWQgdG8ga2VlcCB0aGUgcmVmY291bnQgZWxldmF0ZWQ7IHRoZXJlJ3Mgbm8gd2F5CisJICogdG8gcmVtb3ZlIG9uZSBoYWxmIG9mIHRoaXMgZGV2aWNlIHdpdGhvdXQgcmVtb3ZpbmcgdGhlIG90aGVyCisJICovCisJcGNpX2Rldl9wdXQocGVlcik7CisKKwlyZXR1cm4gcGVlcjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdGczX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdGF0aWMgaW50IHRnM192ZXJzaW9uX3ByaW50ZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgdGczcmVnX2Jhc2UsIHRnM3JlZ19sZW47CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgdGczICp0cDsKKwlpbnQgaSwgZXJyLCBwY2lfdXNpbmdfZGFjLCBwbV9jYXA7CisKKwlpZiAodGczX3ZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBlbmFibGUgUENJIGRldmljZSwgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBmaW5kIHByb3BlciBQQ0kgZGV2aWNlICIKKwkJICAgICAgICJiYXNlIGFkZHJlc3MsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlX3BkZXY7CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTU9EVUxFX05BTUUpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGRldjsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qIEZpbmQgcG93ZXItbWFuYWdlbWVudCBjYXBhYmlsaXR5LiAqLworCXBtX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QTSk7CisJaWYgKHBtX2NhcCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBmaW5kIFBvd2VyTWFuYWdlbWVudCBjYXBhYmlsaXR5LCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCX0KKworCS8qIENvbmZpZ3VyZSBETUEgYXR0cmlidXRlcy4gKi8KKwllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCk7CisJaWYgKCFlcnIpIHsKKwkJcGNpX3VzaW5nX2RhYyA9IDE7CisJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpOworCQlpZiAoZXJyIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIG9idGFpbiA2NCBiaXQgRE1BICIKKwkJCSAgICAgICAiZm9yIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnNcbiIpOworCQkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCQl9CisJfSBlbHNlIHsKKwkJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmVUxMKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCAiCisJCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJCX0KKwkJcGNpX3VzaW5nX2RhYyA9IDA7CisJfQorCisJdGczcmVnX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJdGczcmVnX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKnRwKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRXRoZXJkZXYgYWxsb2MgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlpZiAocGNpX3VzaW5nX2RhYykKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xMVFg7CisjaWYgVEczX1ZMQU5fVEFHX1VTRUQKKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWDsKKwlkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSB0ZzNfdmxhbl9yeF9yZWdpc3RlcjsKKwlkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSB0ZzNfdmxhbl9yeF9raWxsX3ZpZDsKKyNlbmRpZgorCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXRwLT5wZGV2ID0gcGRldjsKKwl0cC0+ZGV2ID0gZGV2OworCXRwLT5wbV9jYXAgPSBwbV9jYXA7CisJdHAtPm1hY19tb2RlID0gVEczX0RFRl9NQUNfTU9ERTsKKwl0cC0+cnhfbW9kZSA9IFRHM19ERUZfUlhfTU9ERTsKKwl0cC0+dHhfbW9kZSA9IFRHM19ERUZfVFhfTU9ERTsKKwl0cC0+bWlfbW9kZSA9IE1BQ19NSV9NT0RFX0JBU0U7CisJaWYgKHRnM19kZWJ1ZyA+IDApCisJCXRwLT5tc2dfZW5hYmxlID0gdGczX2RlYnVnOworCWVsc2UKKwkJdHAtPm1zZ19lbmFibGUgPSBURzNfREVGX01TR19FTkFCTEU7CisKKwkvKiBUaGUgd29yZC9ieXRlIHN3YXAgY29udHJvbHMgaGVyZSBjb250cm9sIHJlZ2lzdGVyIGFjY2VzcyBieXRlCisJICogc3dhcHBpbmcuICBETUEgZGF0YSBieXRlIHN3YXBwaW5nIGlzIGNvbnRyb2xsZWQgaW4gdGhlIEdSQ19NT0RFCisJICogc2V0dGluZyBiZWxvdy4KKwkgKi8KKwl0cC0+bWlzY19ob3N0X2N0cmwgPQorCQlNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQgfAorCQlNSVNDX0hPU1RfQ1RSTF9XT1JEX1NXQVAgfAorCQlNSVNDX0hPU1RfQ1RSTF9JTkRJUl9BQ0NFU1MgfAorCQlNSVNDX0hPU1RfQ1RSTF9QQ0lTVEFURV9SVzsKKworCS8qIFRoZSBOT05GUk0gKG5vbi1mcmFtZSkgYnl0ZS93b3JkIHN3YXAgY29udHJvbHMgdGFrZSBlZmZlY3QKKwkgKiBvbiBkZXNjcmlwdG9yIGVudHJpZXMsIGFueXRoaW5nIHdoaWNoIGlzbid0IHBhY2tldCBkYXRhLgorCSAqCisJICogVGhlIFN0cm9uZ0FSTSBjaGlwcyBvbiB0aGUgYm9hcmQgKG9uZSBmb3IgdHgsIG9uZSBmb3IgcngpCisJICogYXJlIHJ1bm5pbmcgaW4gYmlnLWVuZGlhbiBtb2RlLgorCSAqLworCXRwLT5ncmNfbW9kZSA9IChHUkNfTU9ERV9XU1dBUF9EQVRBIHwgR1JDX01PREVfQlNXQVBfREFUQSB8CisJCQlHUkNfTU9ERV9XU1dBUF9OT05GUk1fREFUQSk7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJdHAtPmdyY19tb2RlIHw9IEdSQ19NT0RFX0JTV0FQX05PTkZSTV9EQVRBOworI2VuZGlmCisJc3Bpbl9sb2NrX2luaXQoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmdHAtPnR4X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZ0cC0+aW5kaXJlY3RfbG9jayk7CisJSU5JVF9XT1JLKCZ0cC0+cmVzZXRfdGFzaywgdGczX3Jlc2V0X3Rhc2ssIHRwKTsKKworCXRwLT5yZWdzID0gaW9yZW1hcF9ub2NhY2hlKHRnM3JlZ19iYXNlLCB0ZzNyZWdfbGVuKTsKKwlpZiAodHAtPnJlZ3MgPT0gMFVMKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVycywgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwl9CisKKwl0ZzNfaW5pdF9saW5rX2NvbmZpZyh0cCk7CisKKwl0ZzNfaW5pdF9idWZtZ3JfY29uZmlnKHRwKTsKKworCXRwLT5yeF9wZW5kaW5nID0gVEczX0RFRl9SWF9SSU5HX1BFTkRJTkc7CisJdHAtPnJ4X2p1bWJvX3BlbmRpbmcgPSBURzNfREVGX1JYX0pVTUJPX1JJTkdfUEVORElORzsKKwl0cC0+dHhfcGVuZGluZyA9IFRHM19ERUZfVFhfUklOR19QRU5ESU5HOworCisJZGV2LT5vcGVuID0gdGczX29wZW47CisJZGV2LT5zdG9wID0gdGczX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gdGczX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHRnM19zZXRfcnhfbW9kZTsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IHRnM19zZXRfbWFjX2FkZHI7CisJZGV2LT5kb19pb2N0bCA9IHRnM19pb2N0bDsKKwlkZXYtPnR4X3RpbWVvdXQgPSB0ZzNfdHhfdGltZW91dDsKKwlkZXYtPnBvbGwgPSB0ZzNfcG9sbDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnRnM19ldGh0b29sX29wczsKKwlkZXYtPndlaWdodCA9IDY0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBURzNfVFhfVElNRU9VVDsKKwlkZXYtPmNoYW5nZV9tdHUgPSB0ZzNfY2hhbmdlX210dTsKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gdGczX3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgorCisJZXJyID0gdGczX2dldF9pbnZhcmlhbnRzKHRwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlByb2JsZW0gZmV0Y2hpbmcgaW52YXJpYW50cyBvZiBjaGlwLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSB7CisJCXRwLT5idWZtZ3JfY29uZmlnLm1idWZfcmVhZF9kbWFfbG93X3dhdGVyID0KKwkJCURFRkFVTFRfTUJfUkRNQV9MT1dfV0FURVJfNTcwNTsKKwkJdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9tYWNfcnhfbG93X3dhdGVyID0KKwkJCURFRkFVTFRfTUJfTUFDUlhfTE9XX1dBVEVSXzU3MDU7CisJCXRwLT5idWZtZ3JfY29uZmlnLm1idWZfaGlnaF93YXRlciA9CisJCQlERUZBVUxUX01CX0hJR0hfV0FURVJfNTcwNTsKKwl9CisKKyNpZiBURzNfVFNPX1NVUFBPUlQgIT0gMAorCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX1RTTykgeworCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9UU09fQ0FQQUJMRTsKKwl9CisJZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDAgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEgfHwKKwkgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDVfQTAgfHwKKwkgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKSAhPSAwKSB7CisJCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9UU09fQ0FQQUJMRTsKKwl9IGVsc2UgeworCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9UU09fQ0FQQUJMRTsKKwl9CisKKwkvKiBUU08gaXMgb2ZmIGJ5IGRlZmF1bHQsIHVzZXIgY2FuIGVuYWJsZSB1c2luZyBldGh0b29sLiAgKi8KKyNpZiAwCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVFNPX0NBUEFCTEUpCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CisjZW5kaWYKKworI2VuZGlmCisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDVfQTEgJiYKKwkgICAgISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1RTT19DQVBBQkxFKSAmJgorCSAgICAhKHRyMzIoVEczUENJX1BDSVNUQVRFKSAmIFBDSVNUQVRFX0JVU19TUEVFRF9ISUdIKSkgeworCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9NQVhfUlhQRU5EXzY0OworCQl0cC0+cnhfcGVuZGluZyA9IDYzOworCX0KKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkKKwkJdHAtPnBkZXZfcGVlciA9IHRnM19maW5kXzU3MDRfcGVlcih0cCk7CisKKwllcnIgPSB0ZzNfZ2V0X2RldmljZV9hZGRyZXNzKHRwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkIG5vdCBvYnRhaW4gdmFsaWQgZXRoZXJuZXQgYWRkcmVzcywgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCS8qCisJICogUmVzZXQgY2hpcCBpbiBjYXNlIFVOREkgb3IgRUZJIGRyaXZlciBkaWQgbm90IHNodXRkb3duCisJICogRE1BIHNlbGYgdGVzdCB3aWxsIGVuYWJsZSBXRE1BQyBhbmQgd2UnbGwgc2VlIChzcHVyaW91cykKKwkgKiBwZW5kaW5nIERNQSBvbiB0aGUgUENJIGJ1cyBhdCB0aGF0IHBvaW50LgorCSAqLworCWlmICgodHIzMihIT1NUQ0NfTU9ERSkgJiBIT1NUQ0NfTU9ERV9FTkFCTEUpIHx8CisJICAgICh0cjMyKFdETUFDX01PREUpICYgV0RNQUNfTU9ERV9FTkFCTEUpKSB7CisJCXBjaV9zYXZlX3N0YXRlKHRwLT5wZGV2KTsKKwkJdHczMihNRU1BUkJfTU9ERSwgTUVNQVJCX01PREVfRU5BQkxFKTsKKwkJdGczX2hhbHQodHApOworCX0KKworCWVyciA9IHRnM190ZXN0X2RtYSh0cCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJETUEgZW5naW5lIHRlc3QgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwkvKiBUaWdvbjMgY2FuIGRvIGlwdjQgb25seS4uLiBhbmQgc29tZSBjaGlwcyBoYXZlIGJ1Z2d5CisJICogY2hlY2tzdW1taW5nLgorCSAqLworCWlmICgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0JST0tFTl9DSEVDS1NVTVMpID09IDApIHsKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNOworCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1JYX0NIRUNLU1VNUzsKKwl9IGVsc2UKKwkJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfUlhfQ0hFQ0tTVU1TOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSVNfNTc4OCkKKwkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9ISUdIRE1BOworCisJLyogZmxvdyBjb250cm9sIGF1dG9uZWdvdGlhdGlvbiBpcyBkZWZhdWx0IGJlaGF2aW9yICovCisJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19QQVVTRV9BVVRPTkVHOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJLyogTm93IHRoYXQgd2UgaGF2ZSBmdWxseSBzZXR1cCB0aGUgY2hpcCwgc2F2ZSBhd2F5IGEgc25hcHNob3QKKwkgKiBvZiB0aGUgUENJIGNvbmZpZyBzcGFjZS4gIFdlIG5lZWQgdG8gcmVzdG9yZSB0aGlzIGFmdGVyCisJICogR1JDX01JU0NfQ0ZHIGNvcmUgY2xvY2sgcmVzZXRzIGFuZCBzb21lIHJlc3VtZSBldmVudHMuCisJICovCisJcGNpX3NhdmVfc3RhdGUodHAtPnBkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRpZ29uMyBbcGFydG5vKCVzKSByZXYgJTA0eCBQSFkoJXMpXSAoUENJJXM6JXM6JXMpICVzQmFzZVQgRXRoZXJuZXQgIiwKKwkgICAgICAgZGV2LT5uYW1lLAorCSAgICAgICB0cC0+Ym9hcmRfcGFydF9udW1iZXIsCisJICAgICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQsCisJICAgICAgIHRnM19waHlfc3RyaW5nKHRwKSwKKwkgICAgICAgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSA/ICJYIiA6ICIiKSwKKwkgICAgICAgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJX0hJR0hfU1BFRUQpID8KKwkJKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSA/ICIxMzNNSHoiIDogIjY2TUh6IikgOgorCQkoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpID8gIjEwME1IeiIgOiAiMzNNSHoiKSksCisJICAgICAgICgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSV8zMkJJVCkgPyAiMzItYml0IiA6ICI2NC1iaXQiKSwKKwkgICAgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkgPyAiMTAvMTAwIiA6ICIxMC8xMDAvMTAwMCIpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVjIiwgZGV2LT5kZXZfYWRkcltpXSwKKwkJICAgICAgIGkgPT0gNSA/ICdcbicgOiAnOicpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJYY3N1bXNbJWRdIExpbmtDaGdSRUdbJWRdICIKKwkgICAgICAgIk1JaXJxWyVkXSBBU0ZbJWRdIFNwbGl0WyVkXSBXaXJlU3BlZWRbJWRdICIKKwkgICAgICAgIlRTT2NhcFslZF0gXG4iLAorCSAgICAgICBkZXYtPm5hbWUsCisJICAgICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUlhfQ0hFQ0tTVU1TKSAhPSAwLAorCSAgICAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1VTRV9MSU5LQ0hHX1JFRykgIT0gMCwKKwkgICAgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19VU0VfTUlfSU5URVJSVVBUKSAhPSAwLAorCSAgICAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpICE9IDAsCisJICAgICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfU1BMSVRfTU9ERSkgIT0gMCwKKwkgICAgICAgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfTk9fRVRIX1dJUkVfU1BFRUQpID09IDAsCisJICAgICAgICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1RTT19DQVBBQkxFKSAhPSAwKTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2lvdW5tYXA6CisJaW91bm1hcCh0cC0+cmVncyk7CisKK2Vycl9vdXRfZnJlZV9kZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKworZXJyX291dF9mcmVlX3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCitlcnJfb3V0X2Rpc2FibGVfcGRldjoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB0ZzNfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldikgeworCQlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJaW91bm1hcCh0cC0+cmVncyk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCX0KK30KKworc3RhdGljIGludCB0ZzNfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwl0ZzNfbmV0aWZfc3RvcCh0cCk7CisKKwlkZWxfdGltZXJfc3luYygmdHAtPnRpbWVyKTsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwl0ZzNfZGlzYWJsZV9pbnRzKHRwKTsKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCXRnM19oYWx0KHRwKTsKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJZXJyID0gdGczX3NldF9wb3dlcl9zdGF0ZSh0cCwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCWlmIChlcnIpIHsKKwkJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCQlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKworCQl0ZzNfaW5pdF9odyh0cCk7CisKKwkJdHAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgdHAtPnRpbWVyX29mZnNldDsKKwkJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworCisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkJdGczX25ldGlmX3N0YXJ0KHRwKTsKKworCQlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHRnM19yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHRwLT5wZGV2KTsKKworCWVyciA9IHRnM19zZXRfcG93ZXJfc3RhdGUodHAsIDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisKKwl0ZzNfaW5pdF9odyh0cCk7CisKKwl0cC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0cC0+dGltZXJfb2Zmc2V0OworCWFkZF90aW1lcigmdHAtPnRpbWVyKTsKKworCXRnM19lbmFibGVfaW50cyh0cCk7CisKKwl0ZzNfbmV0aWZfc3RhcnQodHApOworCisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdGczX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTU9EVUxFX05BTUUsCisJLmlkX3RhYmxlCT0gdGczX3BjaV90YmwsCisJLnByb2JlCQk9IHRnM19pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHRnM19yZW1vdmVfb25lKSwKKwkuc3VzcGVuZAk9IHRnM19zdXNwZW5kLAorCS5yZXN1bWUJCT0gdGczX3Jlc3VtZQorfTsKKworc3RhdGljIGludCBfX2luaXQgdGczX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ0ZzNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRnM19jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0ZzNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodGczX2luaXQpOworbW9kdWxlX2V4aXQodGczX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmggYi9kcml2ZXJzL25ldC90ZzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDg4ODdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdGczLmgKQEAgLTAsMCArMSwyMjA2IEBACisvKiAkSWQ6IHRnMy5oLHYgMS4zNy4yLjMyIDIwMDIvMDMvMTEgMTI6MTg6MTggZGF2ZW0gRXhwICQKKyAqIHRnMy5oOiBEZWZpbml0aW9ucyBmb3IgQnJvYWRjb20gVGlnb24zIGV0aGVybmV0IGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAxIEplZmYgR2FyemlrIChqZ2FyemlrQHBvYm94LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNCBTdW4gTWljcm9zeXN0ZW1zIEluYy4KKyAqLworCisjaWZuZGVmIF9UM19ICisjZGVmaW5lIF9UM19ICisKKyNkZWZpbmUgVEczXzY0QklUX1JFR19ISUdICQkweDAwVUwKKyNkZWZpbmUgVEczXzY0QklUX1JFR19MT1cJCTB4MDRVTAorCisvKiBEZXNjcmlwdG9yIGJsb2NrIGluZm8uICovCisjZGVmaW5lIFRHM19CRElORk9fSE9TVF9BRERSCQkweDBVTCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgVEczX0JESU5GT19NQVhMRU5fRkxBR1MJCTB4OFVMIC8qIDMyLWJpdCAqLworI2RlZmluZSAgQkRJTkZPX0ZMQUdTX1VTRV9FWFRfUkVDVgkgMHgwMDAwMDAwMSAvKiBleHQgcnhfYnVmZmVyX2Rlc2MgKi8KKyNkZWZpbmUgIEJESU5GT19GTEFHU19ESVNBQkxFRAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIEJESU5GT19GTEFHU19NQVhMRU5fTUFTSwkgMHhmZmZmMDAwMAorI2RlZmluZSAgQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVAkgMTYKKyNkZWZpbmUgVEczX0JESU5GT19OSUNfQUREUgkJMHhjVUwgLyogMzItYml0ICovCisjZGVmaW5lIFRHM19CRElORk9fU0laRQkJCTB4MTBVTAorCisjZGVmaW5lIFJYX0NPUFlfVEhSRVNIT0xEICAJCTI1NgorCisjZGVmaW5lIFJYX1NURF9NQVhfU0laRQkJCTE1MzYKKyNkZWZpbmUgUlhfU1REX01BWF9TSVpFXzU3MDUJCTUxMgorI2RlZmluZSBSWF9KVU1CT19NQVhfU0laRQkJMHhkZWFkYmVlZiAvKiBYWFggKi8KKworLyogRmlyc3QgMjU2IGJ5dGVzIGFyZSBhIG1pcnJvciBvZiBQQ0kgY29uZmlnIHNwYWNlLiAqLworI2RlZmluZSBURzNQQ0lfVkVORE9SCQkJMHgwMDAwMDAwMAorI2RlZmluZSAgVEczUENJX1ZFTkRPUl9CUk9BRENPTQkJIDB4MTRlNAorI2RlZmluZSBURzNQQ0lfREVWSUNFCQkJMHgwMDAwMDAwMgorI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfMQkJIDB4MTY0NCAvKiBCQ001NzAwICovCisjZGVmaW5lICBURzNQQ0lfREVWSUNFX1RJR09OM18yCQkgMHgxNjQ1IC8qIEJDTTU3MDEgKi8KKyNkZWZpbmUgIFRHM1BDSV9ERVZJQ0VfVElHT04zXzMJCSAweDE2NDYgLyogQkNNNTcwMiAqLworI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfNAkJIDB4MTY0NyAvKiBCQ001NzAzICovCisjZGVmaW5lIFRHM1BDSV9DT01NQU5ECQkJMHgwMDAwMDAwNAorI2RlZmluZSBURzNQQ0lfU1RBVFVTCQkJMHgwMDAwMDAwNgorI2RlZmluZSBURzNQQ0lfQ0NSRVZJRAkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVEczUENJX0NBQ0hFTElORVNaCQkweDAwMDAwMDBjCisjZGVmaW5lIFRHM1BDSV9MQVRUSU1FUgkJCTB4MDAwMDAwMGQKKyNkZWZpbmUgVEczUENJX0hFQURFUlRZUEUJCTB4MDAwMDAwMGUKKyNkZWZpbmUgVEczUENJX0JJU1QJCQkweDAwMDAwMDBmCisjZGVmaW5lIFRHM1BDSV9CQVNFMF9MT1cJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVEczUENJX0JBU0UwX0hJR0gJCTB4MDAwMDAwMTQKKy8qIDB4MTggLS0+IDB4MmMgdW51c2VkICovCisjZGVmaW5lIFRHM1BDSV9TVUJTWVNWRU5JRAkJMHgwMDAwMDAyYworI2RlZmluZSBURzNQQ0lfU1VCU1lTSUQJCQkweDAwMDAwMDJlCisjZGVmaW5lIFRHM1BDSV9ST01BRERSCQkJMHgwMDAwMDAzMAorI2RlZmluZSBURzNQQ0lfQ0FQTElTVAkJCTB4MDAwMDAwMzQKKy8qIDB4MzUgLS0+IDB4M2MgdW51c2VkICovCisjZGVmaW5lIFRHM1BDSV9JUlFfTElORQkJCTB4MDAwMDAwM2MKKyNkZWZpbmUgVEczUENJX0lSUV9QSU4JCQkweDAwMDAwMDNkCisjZGVmaW5lIFRHM1BDSV9NSU5fR05UCQkJMHgwMDAwMDAzZQorI2RlZmluZSBURzNQQ0lfTUFYX0xBVAkJCTB4MDAwMDAwM2YKKyNkZWZpbmUgVEczUENJX1hfQ0FQUwkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgIFBDSVhfQ0FQU19SRUxBWEVEX09SREVSSU5HCSAweDAwMDIwMDAwCisjZGVmaW5lICBQQ0lYX0NBUFNfU1BMSVRfTUFTSwkJIDB4MDA3MDAwMDAKKyNkZWZpbmUgIFBDSVhfQ0FQU19TUExJVF9TSElGVAkJIDIwCisjZGVmaW5lICBQQ0lYX0NBUFNfQlVSU1RfTUFTSwkJIDB4MDAwYzAwMDAKKyNkZWZpbmUgIFBDSVhfQ0FQU19CVVJTVF9TSElGVAkJIDE4CisjZGVmaW5lICBQQ0lYX0NBUFNfTUFYX0JVUlNUX0NQSU9CCSAyCisjZGVmaW5lIFRHM1BDSV9QTV9DQVBfUFRSCQkweDAwMDAwMDQxCisjZGVmaW5lIFRHM1BDSV9YX0NPTU1BTkQJCTB4MDAwMDAwNDIKKyNkZWZpbmUgVEczUENJX1hfU1RBVFVTCQkJMHgwMDAwMDA0NAorI2RlZmluZSBURzNQQ0lfUE1fQ0FQX0lECQkweDAwMDAwMDQ4CisjZGVmaW5lIFRHM1BDSV9WUERfQ0FQX1BUUgkJMHgwMDAwMDA0OQorI2RlZmluZSBURzNQQ0lfUE1fQ0FQUwkJCTB4MDAwMDAwNGEKKyNkZWZpbmUgVEczUENJX1BNX0NUUkxfU1RBVAkJMHgwMDAwMDA0YworI2RlZmluZSBURzNQQ0lfQlJfU1VQUF9FWFQJCTB4MDAwMDAwNGUKKyNkZWZpbmUgVEczUENJX1BNX0RBVEEJCQkweDAwMDAwMDRmCisjZGVmaW5lIFRHM1BDSV9WUERfQ0FQX0lECQkweDAwMDAwMDUwCisjZGVmaW5lIFRHM1BDSV9NU0lfQ0FQX1BUUgkJMHgwMDAwMDA1MQorI2RlZmluZSBURzNQQ0lfVlBEX0FERFJfRkxBRwkJMHgwMDAwMDA1MgorI2RlZmluZSAgVlBEX0FERFJfRkxBR19XUklURQkJMHgwMDAwODAwMAorI2RlZmluZSBURzNQQ0lfVlBEX0RBVEEJCQkweDAwMDAwMDU0CisjZGVmaW5lIFRHM1BDSV9NU0lfQ0FQX0lECQkweDAwMDAwMDU4CisjZGVmaW5lIFRHM1BDSV9OWFRfQ0FQX1BUUgkJMHgwMDAwMDA1OQorI2RlZmluZSBURzNQQ0lfTVNJX0NUUkwJCQkweDAwMDAwMDVhCisjZGVmaW5lIFRHM1BDSV9NU0lfQUREUl9MT1cJCTB4MDAwMDAwNWMKKyNkZWZpbmUgVEczUENJX01TSV9BRERSX0hJR0gJCTB4MDAwMDAwNjAKKyNkZWZpbmUgVEczUENJX01TSV9EQVRBCQkJMHgwMDAwMDA2NAorLyogMHg2NiAtLT4gMHg2OCB1bnVzZWQgKi8KKyNkZWZpbmUgVEczUENJX01JU0NfSE9TVF9DVFJMCQkweDAwMDAwMDY4CisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9DTEVBUl9JTlQJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVAkgMHgwMDAwMDAwMgorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfQllURV9TV0FQCSAweDAwMDAwMDA0CisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9XT1JEX1NXQVAJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX1BDSVNUQVRFX1JXCSAweDAwMDAwMDEwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9DTEtSRUdfUlcJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX1JFR1dPUkRfU1dBUAkgMHgwMDAwMDA0MAorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfSU5ESVJfQUNDRVNTCSAweDAwMDAwMDgwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9JUlFfTUFTS19NT0RFCSAweDAwMDAwMTAwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9UQUdHRURfU1RBVFVTCSAweDAwMDAwMjAwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWCQkgMHhmZmZmMDAwMAorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfQ0hJUFJFVl9TSElGVAkgMTYKKyNkZWZpbmUgIEdFVF9DSElQX1JFVl9JRChNSVNDX0hPU1RfQ1RSTCkgXAorCSAoKChNSVNDX0hPU1RfQ1RSTCkgJiBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWKSA+PiBcCisJICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWX1NISUZUKQorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAwX0EwCQkgMHg3MDAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDBfQTEJCSAweDcwMDEKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9CMAkJIDB4NzEwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAwX0IxCQkgMHg3MTAxCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDBfQjMJCSAweDcxMDIKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9BTFRJTUEJCSAweDcxMDQKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9DMAkJIDB4NzIwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAxX0EwCQkgMHgwMDAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDFfQjAJCSAweDAxMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMV9CMgkJIDB4MDEwMgorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAxX0I1CQkgMHgwMTA1CisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDNfQTAJCSAweDEwMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwM19BMQkJIDB4MTAwMQorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAzX0EyCQkgMHgxMDAyCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDNfQTMJCSAweDEwMDMKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwNF9BMAkJIDB4MjAwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA0X0ExCQkgMHgyMDAxCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDRfQTIJCSAweDIwMDIKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwNF9BMwkJIDB4MjAwMworI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA1X0EwCQkgMHgzMDAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDVfQTEJCSAweDMwMDEKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwNV9BMgkJIDB4MzAwMgorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA1X0EzCQkgMHgzMDAzCisjZGVmaW5lICBDSElQUkVWX0lEXzU3NTBfQTAJCSAweDQwMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTc1MF9BMQkJIDB4NDAwMQorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzUwX0EzCQkgMHg0MDAzCisjZGVmaW5lICBHRVRfQVNJQ19SRVYoQ0hJUF9SRVZfSUQpCSgoQ0hJUF9SRVZfSUQpID4+IDEyKQorI2RlZmluZSAgIEFTSUNfUkVWXzU3MDAJCQkgMHgwNworI2RlZmluZSAgIEFTSUNfUkVWXzU3MDEJCQkgMHgwMAorI2RlZmluZSAgIEFTSUNfUkVWXzU3MDMJCQkgMHgwMQorI2RlZmluZSAgIEFTSUNfUkVWXzU3MDQJCQkgMHgwMgorI2RlZmluZSAgIEFTSUNfUkVWXzU3MDUJCQkgMHgwMworI2RlZmluZSAgIEFTSUNfUkVWXzU3NTAJCQkgMHgwNAorI2RlZmluZSAgR0VUX0NISVBfUkVWKENISVBfUkVWX0lEKQkoKENISVBfUkVWX0lEKSA+PiA4KQorI2RlZmluZSAgIENISVBSRVZfNTcwMF9BWAkJIDB4NzAKKyNkZWZpbmUgICBDSElQUkVWXzU3MDBfQlgJCSAweDcxCisjZGVmaW5lICAgQ0hJUFJFVl81NzAwX0NYCQkgMHg3MgorI2RlZmluZSAgIENISVBSRVZfNTcwMV9BWAkJIDB4MDAKKyNkZWZpbmUgICBDSElQUkVWXzU3MDNfQVgJCSAweDEwCisjZGVmaW5lICAgQ0hJUFJFVl81NzA0X0FYCQkgMHgyMAorI2RlZmluZSAgIENISVBSRVZfNTcwNF9CWAkJIDB4MjEKKyNkZWZpbmUgICBDSElQUkVWXzU3NTBfQVgJCSAweDQwCisjZGVmaW5lICAgQ0hJUFJFVl81NzUwX0JYCQkgMHg0MQorI2RlZmluZSAgR0VUX01FVEFMX1JFVihDSElQX1JFVl9JRCkJKChDSElQX1JFVl9JRCkgJiAweGZmKQorI2RlZmluZSAgIE1FVEFMX1JFVl9BMAkJCSAweDAwCisjZGVmaW5lICAgTUVUQUxfUkVWX0ExCQkJIDB4MDEKKyNkZWZpbmUgICBNRVRBTF9SRVZfQjAJCQkgMHgwMAorI2RlZmluZSAgIE1FVEFMX1JFVl9CMQkJCSAweDAxCisjZGVmaW5lICAgTUVUQUxfUkVWX0IyCQkJIDB4MDIKKyNkZWZpbmUgVEczUENJX0RNQV9SV19DVFJMCQkweDAwMDAwMDZjCisjZGVmaW5lICBETUFfUldDVFJMX01JTl9ETUEJCSAweDAwMDAwMGZmCisjZGVmaW5lICBETUFfUldDVFJMX01JTl9ETUFfU0hJRlQJIDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV9NQVNLCSAweDAwMDAwNzAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfRElTQUIJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8xNgkgMHgwMDAwMDEwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzEyOF9QQ0lYCSAweDAwMDAwMTAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfMzIJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8yNTZfUENJWAkgMHgwMDAwMDIwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzY0CSAweDAwMDAwMzAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfMzg0X1BDSVgJIDB4MDAwMDAzMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8xMjgJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8yNTYJIDB4MDAwMDA1MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV81MTIJIDB4MDAwMDA2MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8xMDI0CSAweDAwMDAwNzAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZX01BU0sJIDB4MDAwMDM4MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfRElTQUIJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTYJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTI4X1BDSVggMHgwMDAwMDgwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8zMgkgMHgwMDAwMTAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8yNTZfUENJWCAweDAwMDAxMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzY0CSAweDAwMDAxODAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzM4NF9QQ0lYIDB4MDAwMDE4MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTI4CSAweDAwMDAyMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzI1NgkgMHgwMDAwMjgwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV81MTIJIDB4MDAwMDMwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTAyNAkgMHgwMDAwMzgwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9PTkVfRE1BCQkgMHgwMDAwNDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX1dBVEVSCQkgMHgwMDA3MDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX1dBVEVSX1NISUZUCSAxNgorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9XQVRFUgkJIDB4MDAzODAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfV0FURVJfU0hJRlQJIDE5CisjZGVmaW5lICBETUFfUldDVFJMX1VTRV9NRU1fUkVBRF9NVUxUCSAweDAwNDAwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX0FTU0VSVF9BTExfQkUJIDB4MDA4MDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUENJX1JFQURfQ01ECSAweDBmMDAwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1BDSV9SRUFEX0NNRF9TSElGVAkgMjQKKyNkZWZpbmUgIERNQV9SV0NUUkxfUENJX1dSSVRFX0NNRAkgMHhmMDAwMDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9QQ0lfV1JJVEVfQ01EX1NISUZUCSAyOAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV82NF9QQ0lFCSAweDEwMDAwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzEyOF9QQ0lFIDB4MzAwMDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfRElTQUJfUENJRSAweDcwMDAwMDAwCisjZGVmaW5lIFRHM1BDSV9QQ0lTVEFURQkJCTB4MDAwMDAwNzAKKyNkZWZpbmUgIFBDSVNUQVRFX0ZPUkNFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUENJU1RBVEVfSU5UX05PVF9BQ1RJVkUJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFBDSVNUQVRFX0NPTlZfUENJX01PREUJCSAweDAwMDAwMDA0CisjZGVmaW5lICBQQ0lTVEFURV9CVVNfU1BFRURfSElHSAkgMHgwMDAwMDAwOAorI2RlZmluZSAgUENJU1RBVEVfQlVTXzMyQklUCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgUENJU1RBVEVfUk9NX0VOQUJMRQkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFBDSVNUQVRFX1JPTV9SRVRSWV9FTkFCTEUJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFBDSVNUQVRFX0ZMQVRfVklFVwkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFBDSVNUQVRFX1JFVFJZX1NBTUVfRE1BCSAweDAwMDAyMDAwCisjZGVmaW5lIFRHM1BDSV9DTE9DS19DVFJMCQkweDAwMDAwMDc0CisjZGVmaW5lICBDTE9DS19DVFJMX0NPUkVDTEtfRElTQUJMRQkgMHgwMDAwMDIwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF9SWENMS19ESVNBQkxFCSAweDAwMDAwNDAwCisjZGVmaW5lICBDTE9DS19DVFJMX1RYQ0xLX0RJU0FCTEUJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfQUxUQ0xLCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF9QV1JET1dOX1BMTDEzMwkgMHgwMDAwODAwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF80NE1IWl9DT1JFCQkgMHgwMDA0MDAwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF82MjVfQ09SRQkJIDB4MDAxMDAwMDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfRk9SQ0VfQ0xLUlVOCSAweDAwMjAwMDAwCisjZGVmaW5lICBDTE9DS19DVFJMX0NMS1JVTl9PRU5BQkxFCSAweDAwNDAwMDAwCisjZGVmaW5lICBDTE9DS19DVFJMX0RFTEFZX1BDSV9HUkFOVAkgMHg4MDAwMDAwMAorI2RlZmluZSBURzNQQ0lfUkVHX0JBU0VfQUREUgkJMHgwMDAwMDA3OAorI2RlZmluZSBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIJMHgwMDAwMDA3YworI2RlZmluZSBURzNQQ0lfUkVHX0RBVEEJCQkweDAwMDAwMDgwCisjZGVmaW5lIFRHM1BDSV9NRU1fV0lOX0RBVEEJCTB4MDAwMDAwODQKKyNkZWZpbmUgVEczUENJX01PREVfQ1RSTAkJMHgwMDAwMDA4OAorI2RlZmluZSBURzNQQ0lfTUlTQ19DRkcJCQkweDAwMDAwMDhjCisjZGVmaW5lIFRHM1BDSV9NSVNDX0xPQ0FMX0NUUkwJCTB4MDAwMDAwOTAKKy8qIDB4OTQgLS0+IDB4OTggdW51c2VkICovCisjZGVmaW5lIFRHM1BDSV9TVERfUklOR19QUk9EX0lEWAkweDAwMDAwMDk4IC8qIDY0LWJpdCAqLworI2RlZmluZSBURzNQQ0lfUkNWX1JFVF9SSU5HX0NPTl9JRFgJMHgwMDAwMDBhMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgVEczUENJX1NORF9QUk9EX0lEWAkJMHgwMDAwMDBhOCAvKiA2NC1iaXQgKi8KKy8qIDB4YjAgLS0+IDB4YjggdW51c2VkICovCisjZGVmaW5lIFRHM1BDSV9EVUFMX01BQ19DVFJMCQkweDAwMDAwMGI4CisjZGVmaW5lICBEVUFMX01BQ19DVFJMX0NIX01BU0sJCSAweDAwMDAwMDAzCisjZGVmaW5lICBEVUFMX01BQ19DVFJMX0lECQkgMHgwMDAwMDAwNAorLyogMHhiYyAtLT4gMHgxMDAgdW51c2VkICovCisKKy8qIDB4MTAwIC0tPiAweDIwMCB1bnVzZWQgKi8KKworLyogTWFpbGJveCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUFJTEJPWF9JTlRFUlJVUFRfMAkJMHgwMDAwMDIwMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9JTlRFUlJVUFRfMQkJMHgwMDAwMDIwOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9JTlRFUlJVUFRfMgkJMHgwMDAwMDIxMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9JTlRFUlJVUFRfMwkJMHgwMDAwMDIxOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzAJCTB4MDAwMDAyMjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF8xCQkweDAwMDAwMjI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfMgkJMHgwMDAwMDIzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzMJCTB4MDAwMDAyMzggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF80CQkweDAwMDAwMjQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfNQkJMHgwMDAwMDI0OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzYJCTB4MDAwMDAyNTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF83CQkweDAwMDAwMjU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JFTE9BRF9TVEFUCQkweDAwMDAwMjYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVl9TVERfUFJPRF9JRFgJMHgwMDAwMDI2OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZfSlVNQk9fUFJPRF9JRFgJMHgwMDAwMDI3MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZfTUlOSV9QUk9EX0lEWAkweDAwMDAwMjc4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzAJMHgwMDAwMDI4MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xCTB4MDAwMDAyODggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMgkweDAwMDAwMjkwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzMJMHgwMDAwMDI5OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF80CTB4MDAwMDAyYTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfNQkweDAwMDAwMmE4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzYJMHgwMDAwMDJiMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF83CTB4MDAwMDAyYjggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfOAkweDAwMDAwMmMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzkJMHgwMDAwMDJjOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xMAkweDAwMDAwMmQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzExCTB4MDAwMDAyZDggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMTIJMHgwMDAwMDJlMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xMwkweDAwMDAwMmU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzE0CTB4MDAwMDAyZjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMTUJMHgwMDAwMDJmOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzAJMHgwMDAwMDMwMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzEJMHgwMDAwMDMwOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzIJMHgwMDAwMDMxMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzMJMHgwMDAwMDMxOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzQJMHgwMDAwMDMyMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzUJMHgwMDAwMDMyOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzYJMHgwMDAwMDMzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzcJMHgwMDAwMDMzOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzgJMHgwMDAwMDM0MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzkJMHgwMDAwMDM0OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzEwCTB4MDAwMDAzNTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8xMQkweDAwMDAwMzU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMTIJMHgwMDAwMDM2MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzEzCTB4MDAwMDAzNjggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8xNAkweDAwMDAwMzcwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMTUJMHgwMDAwMDM3OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMAkweDAwMDAwMzgwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xCTB4MDAwMDAzODggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzIJMHgwMDAwMDM5MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMwkweDAwMDAwMzk4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF80CTB4MDAwMDAzYTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzUJMHgwMDAwMDNhOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfNgkweDAwMDAwM2IwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF83CTB4MDAwMDAzYjggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzgJMHgwMDAwMDNjMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfOQkweDAwMDAwM2M4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xMAkweDAwMDAwM2QwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xMQkweDAwMDAwM2Q4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xMgkweDAwMDAwM2UwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xMwkweDAwMDAwM2U4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xNAkweDAwMDAwM2YwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xNQkweDAwMDAwM2Y4IC8qIDY0LWJpdCAqLworCisvKiBNQUMgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUFDX01PREUJCQkweDAwMDAwNDAwCisjZGVmaW5lICBNQUNfTU9ERV9SRVNFVAkJCSAweDAwMDAwMDAxCisjZGVmaW5lICBNQUNfTU9ERV9IQUxGX0RVUExFWAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIE1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLCSAweDAwMDAwMDBjCisjZGVmaW5lICBNQUNfTU9ERV9QT1JUX01PREVfVEJJCQkgMHgwMDAwMDAwYworI2RlZmluZSAgTUFDX01PREVfUE9SVF9NT0RFX0dNSUkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIE1BQ19NT0RFX1BPUlRfTU9ERV9NSUkJCSAweDAwMDAwMDA0CisjZGVmaW5lICBNQUNfTU9ERV9QT1JUX01PREVfTk9ORQkgMHgwMDAwMDAwMAorI2RlZmluZSAgTUFDX01PREVfUE9SVF9JTlRfTFBCQUNLCSAweDAwMDAwMDEwCisjZGVmaW5lICBNQUNfTU9ERV9UQUdHRURfTUFDX0NUUkwJIDB4MDAwMDAwODAKKyNkZWZpbmUgIE1BQ19NT0RFX1RYX0JVUlNUSU5HCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgTUFDX01PREVfTUFYX0RFRkVSCQkgMHgwMDAwMDIwMAorI2RlZmluZSAgTUFDX01PREVfTElOS19QT0xBUklUWQkJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIE1BQ19NT0RFX1JYU1RBVF9FTkFCTEUJCSAweDAwMDAwODAwCisjZGVmaW5lICBNQUNfTU9ERV9SWFNUQVRfQ0xFQVIJCSAweDAwMDAxMDAwCisjZGVmaW5lICBNQUNfTU9ERV9SWFNUQVRfRkxVU0gJCSAweDAwMDAyMDAwCisjZGVmaW5lICBNQUNfTU9ERV9UWFNUQVRfRU5BQkxFCQkgMHgwMDAwNDAwMAorI2RlZmluZSAgTUFDX01PREVfVFhTVEFUX0NMRUFSCQkgMHgwMDAwODAwMAorI2RlZmluZSAgTUFDX01PREVfVFhTVEFUX0ZMVVNICQkgMHgwMDAxMDAwMAorI2RlZmluZSAgTUFDX01PREVfU0VORF9DT05GSUdTCQkgMHgwMDAyMDAwMAorI2RlZmluZSAgTUFDX01PREVfTUFHSUNfUEtUX0VOQUJMRQkgMHgwMDA0MDAwMAorI2RlZmluZSAgTUFDX01PREVfQUNQSV9FTkFCTEUJCSAweDAwMDgwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9NSVBfRU5BQkxFCQkgMHgwMDEwMDAwMAorI2RlZmluZSAgTUFDX01PREVfVERFX0VOQUJMRQkJIDB4MDAyMDAwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX1JERV9FTkFCTEUJCSAweDAwNDAwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9GSERFX0VOQUJMRQkJIDB4MDA4MDAwMDAKKyNkZWZpbmUgTUFDX1NUQVRVUwkJCTB4MDAwMDA0MDQKKyNkZWZpbmUgIE1BQ19TVEFUVVNfUENTX1NZTkNFRAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1BQ19TVEFUVVNfU0lHTkFMX0RFVAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIE1BQ19TVEFUVVNfUkNWRF9DRkcJCSAweDAwMDAwMDA0CisjZGVmaW5lICBNQUNfU1RBVFVTX0NGR19DSEFOR0VECQkgMHgwMDAwMDAwOAorI2RlZmluZSAgTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfUE9SVF9ERUNfRVJSCSAweDAwMDAwNDAwCisjZGVmaW5lICBNQUNfU1RBVFVTX0xOS1NUQVRFX0NIQU5HRUQJIDB4MDAwMDEwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfTUlfQ09NUExFVElPTgkgMHgwMDQwMDAwMAorI2RlZmluZSAgTUFDX1NUQVRVU19NSV9JTlRFUlJVUFQJIDB4MDA4MDAwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfQVBfRVJST1IJCSAweDAxMDAwMDAwCisjZGVmaW5lICBNQUNfU1RBVFVTX09ESV9FUlJPUgkJIDB4MDIwMDAwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfUlhTVEFUX09WRVJSVU4JIDB4MDQwMDAwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfVFhTVEFUX09WRVJSVU4JIDB4MDgwMDAwMDAKKyNkZWZpbmUgTUFDX0VWRU5UCQkJMHgwMDAwMDQwOAorI2RlZmluZSAgTUFDX0VWRU5UX1BPUlRfREVDT0RFX0VSUgkgMHgwMDAwMDQwMAorI2RlZmluZSAgTUFDX0VWRU5UX0xOS1NUQVRFX0NIQU5HRUQJIDB4MDAwMDEwMDAKKyNkZWZpbmUgIE1BQ19FVkVOVF9NSV9DT01QTEVUSU9OCSAweDAwNDAwMDAwCisjZGVmaW5lICBNQUNfRVZFTlRfTUlfSU5URVJSVVBUCQkgMHgwMDgwMDAwMAorI2RlZmluZSAgTUFDX0VWRU5UX0FQX0VSUk9SCQkgMHgwMTAwMDAwMAorI2RlZmluZSAgTUFDX0VWRU5UX09ESV9FUlJPUgkJIDB4MDIwMDAwMDAKKyNkZWZpbmUgIE1BQ19FVkVOVF9SWFNUQVRfT1ZFUlJVTgkgMHgwNDAwMDAwMAorI2RlZmluZSAgTUFDX0VWRU5UX1RYU1RBVF9PVkVSUlVOCSAweDA4MDAwMDAwCisjZGVmaW5lIE1BQ19MRURfQ1RSTAkJCTB4MDAwMDA0MGMKKyNkZWZpbmUgIExFRF9DVFJMX0xOS0xFRF9PVkVSUklERQkgMHgwMDAwMDAwMQorI2RlZmluZSAgTEVEX0NUUkxfMTAwME1CUFNfT04JCSAweDAwMDAwMDAyCisjZGVmaW5lICBMRURfQ1RSTF8xMDBNQlBTX09OCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgTEVEX0NUUkxfMTBNQlBTX09OCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgTEVEX0NUUkxfVFJBRkZJQ19PVkVSUklERQkgMHgwMDAwMDAxMAorI2RlZmluZSAgTEVEX0NUUkxfVFJBRkZJQ19CTElOSwkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIExFRF9DVFJMX1RSQUZGSUNfTEVECQkgMHgwMDAwMDA0MAorI2RlZmluZSAgTEVEX0NUUkxfMTAwME1CUFNfU1RBVFVTCSAweDAwMDAwMDgwCisjZGVmaW5lICBMRURfQ1RSTF8xMDBNQlBTX1NUQVRVUwkgMHgwMDAwMDEwMAorI2RlZmluZSAgTEVEX0NUUkxfMTBNQlBTX1NUQVRVUwkJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIExFRF9DVFJMX1RSQUZGSUNfU1RBVFVTCSAweDAwMDAwNDAwCisjZGVmaW5lICBMRURfQ1RSTF9NT0RFX01BQwkJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIExFRF9DVFJMX01PREVfUEhZXzEJCSAweDAwMDAwODAwCisjZGVmaW5lICBMRURfQ1RSTF9NT0RFX1BIWV8yCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgTEVEX0NUUkxfTU9ERV9TSEFTVEFfTUFDCSAweDAwMDAyMDAwCisjZGVmaW5lICBMRURfQ1RSTF9NT0RFX1NIQVJFRAkJIDB4MDAwMDQwMDAKKyNkZWZpbmUgIExFRF9DVFJMX01PREVfQ09NQk8JCSAweDAwMDA4MDAwCisjZGVmaW5lICBMRURfQ1RSTF9CTElOS19SQVRFX01BU0sJIDB4N2ZmODAwMDAKKyNkZWZpbmUgIExFRF9DVFJMX0JMSU5LX1JBVEVfU0hJRlQJIDE5CisjZGVmaW5lICBMRURfQ1RSTF9CTElOS19QRVJfT1ZFUlJJREUJIDB4MDAwODAwMDAKKyNkZWZpbmUgIExFRF9DVFJMX0JMSU5LX1JBVEVfT1ZFUlJJREUJIDB4ODAwMDAwMDAKKyNkZWZpbmUgTUFDX0FERFJfMF9ISUdICQkJMHgwMDAwMDQxMCAvKiB1cHBlciAyIGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzBfTE9XCQkJMHgwMDAwMDQxNCAvKiBsb3dlciA0IGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzFfSElHSAkJCTB4MDAwMDA0MTggLyogdXBwZXIgMiBieXRlcyAqLworI2RlZmluZSBNQUNfQUREUl8xX0xPVwkJCTB4MDAwMDA0MWMgLyogbG93ZXIgNCBieXRlcyAqLworI2RlZmluZSBNQUNfQUREUl8yX0hJR0gJCQkweDAwMDAwNDIwIC8qIHVwcGVyIDIgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FERFJfMl9MT1cJCQkweDAwMDAwNDI0IC8qIGxvd2VyIDQgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FERFJfM19ISUdICQkJMHgwMDAwMDQyOCAvKiB1cHBlciAyIGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzNfTE9XCQkJMHgwMDAwMDQyYyAvKiBsb3dlciA0IGJ5dGVzICovCisjZGVmaW5lIE1BQ19BQ1BJX01CVUZfUFRSCQkweDAwMDAwNDMwCisjZGVmaW5lIE1BQ19BQ1BJX0xFTl9PRkZTRVQJCTB4MDAwMDA0MzQKKyNkZWZpbmUgIEFDUElfTEVOT0ZGX0xFTl9NQVNLCQkgMHgwMDAwZmZmZgorI2RlZmluZSAgQUNQSV9MRU5PRkZfTEVOX1NISUZUCQkgMAorI2RlZmluZSAgQUNQSV9MRU5PRkZfT0ZGX01BU0sJCSAweDBmZmYwMDAwCisjZGVmaW5lICBBQ1BJX0xFTk9GRl9PRkZfU0hJRlQJCSAxNgorI2RlZmluZSBNQUNfVFhfQkFDS09GRl9TRUVECQkweDAwMDAwNDM4CisjZGVmaW5lICBUWF9CQUNLT0ZGX1NFRURfTUFTSwkJIDB4MDAwMDAzZmYKKyNkZWZpbmUgTUFDX1JYX01UVV9TSVpFCQkJMHgwMDAwMDQzYworI2RlZmluZSAgUlhfTVRVX1NJWkVfTUFTSwkJIDB4MDAwMGZmZmYKKyNkZWZpbmUgTUFDX1BDU19URVNUCQkJMHgwMDAwMDQ0MAorI2RlZmluZSAgUENTX1RFU1RfUEFUVEVSTl9NQVNLCQkgMHgwMDBmZmZmZgorI2RlZmluZSAgUENTX1RFU1RfUEFUVEVSTl9TSElGVAkJIDAKKyNkZWZpbmUgIFBDU19URVNUX0VOQUJMRQkJIDB4MDAxMDAwMDAKKyNkZWZpbmUgTUFDX1RYX0FVVE9fTkVHCQkJMHgwMDAwMDQ0NAorI2RlZmluZSAgVFhfQVVUT19ORUdfTUFTSwkJIDB4MDAwMGZmZmYKKyNkZWZpbmUgIFRYX0FVVE9fTkVHX1NISUZUCQkgMAorI2RlZmluZSBNQUNfUlhfQVVUT19ORUcJCQkweDAwMDAwNDQ4CisjZGVmaW5lICBSWF9BVVRPX05FR19NQVNLCQkgMHgwMDAwZmZmZgorI2RlZmluZSAgUlhfQVVUT19ORUdfU0hJRlQJCSAwCisjZGVmaW5lIE1BQ19NSV9DT00JCQkweDAwMDAwNDRjCisjZGVmaW5lICBNSV9DT01fQ01EX01BU0sJCSAweDBjMDAwMDAwCisjZGVmaW5lICBNSV9DT01fQ01EX1dSSVRFCQkgMHgwNDAwMDAwMAorI2RlZmluZSAgTUlfQ09NX0NNRF9SRUFECQkgMHgwODAwMDAwMAorI2RlZmluZSAgTUlfQ09NX1JFQURfRkFJTEVECQkgMHgxMDAwMDAwMAorI2RlZmluZSAgTUlfQ09NX1NUQVJUCQkJIDB4MjAwMDAwMDAKKyNkZWZpbmUgIE1JX0NPTV9CVVNZCQkJIDB4MjAwMDAwMDAKKyNkZWZpbmUgIE1JX0NPTV9QSFlfQUREUl9NQVNLCQkgMHgwM2UwMDAwMAorI2RlZmluZSAgTUlfQ09NX1BIWV9BRERSX1NISUZUCQkgMjEKKyNkZWZpbmUgIE1JX0NPTV9SRUdfQUREUl9NQVNLCQkgMHgwMDFmMDAwMAorI2RlZmluZSAgTUlfQ09NX1JFR19BRERSX1NISUZUCQkgMTYKKyNkZWZpbmUgIE1JX0NPTV9EQVRBX01BU0sJCSAweDAwMDBmZmZmCisjZGVmaW5lIE1BQ19NSV9TVEFUCQkJMHgwMDAwMDQ1MAorI2RlZmluZSAgTUFDX01JX1NUQVRfTE5LU1RBVF9BVFROX0VOQUIJIDB4MDAwMDAwMDEKKyNkZWZpbmUgTUFDX01JX01PREUJCQkweDAwMDAwNDU0CisjZGVmaW5lICBNQUNfTUlfTU9ERV9DTEtfMTBNSFoJCSAweDAwMDAwMDAxCisjZGVmaW5lICBNQUNfTUlfTU9ERV9TSE9SVF9QUkVBTUJMRQkgMHgwMDAwMDAwMgorI2RlZmluZSAgTUFDX01JX01PREVfQVVUT19QT0xMCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgTUFDX01JX01PREVfQ09SRV9DTEtfNjJNSFoJIDB4MDAwMDgwMDAKKyNkZWZpbmUgIE1BQ19NSV9NT0RFX0JBU0UJCSAweDAwMGMwMDAwIC8qIFhYWCBtYWdpYyB2YWx1ZXMgWFhYICovCisjZGVmaW5lIE1BQ19BVVRPX1BPTExfU1RBVFVTCQkweDAwMDAwNDU4CisjZGVmaW5lICBNQUNfQVVUT19QT0xMX0VSUk9SCQkgMHgwMDAwMDAwMQorI2RlZmluZSBNQUNfVFhfTU9ERQkJCTB4MDAwMDA0NWMKKyNkZWZpbmUgIFRYX01PREVfUkVTRVQJCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgVFhfTU9ERV9FTkFCTEUJCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgVFhfTU9ERV9GTE9XX0NUUkxfRU5BQkxFCSAweDAwMDAwMDEwCisjZGVmaW5lICBUWF9NT0RFX0JJR19CQ0tPRkZfRU5BQkxFCSAweDAwMDAwMDIwCisjZGVmaW5lICBUWF9NT0RFX0xPTkdfUEFVU0VfRU5BQkxFCSAweDAwMDAwMDQwCisjZGVmaW5lIE1BQ19UWF9TVEFUVVMJCQkweDAwMDAwNDYwCisjZGVmaW5lICBUWF9TVEFUVVNfWE9GRkVECQkgMHgwMDAwMDAwMQorI2RlZmluZSAgVFhfU1RBVFVTX1NFTlRfWE9GRgkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFRYX1NUQVRVU19TRU5UX1hPTgkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFRYX1NUQVRVU19MSU5LX1VQCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgVFhfU1RBVFVTX09ESV9VTkRFUlJVTgkJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFRYX1NUQVRVU19PRElfT1ZFUlJVTgkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgTUFDX1RYX0xFTkdUSFMJCQkweDAwMDAwNDY0CisjZGVmaW5lICBUWF9MRU5HVEhTX1NMT1RfVElNRV9NQVNLCSAweDAwMDAwMGZmCisjZGVmaW5lICBUWF9MRU5HVEhTX1NMT1RfVElNRV9TSElGVAkgMAorI2RlZmluZSAgVFhfTEVOR1RIU19JUEdfTUFTSwkJIDB4MDAwMDBmMDAKKyNkZWZpbmUgIFRYX0xFTkdUSFNfSVBHX1NISUZUCQkgOAorI2RlZmluZSAgVFhfTEVOR1RIU19JUEdfQ1JTX01BU0sJIDB4MDAwMDMwMDAKKyNkZWZpbmUgIFRYX0xFTkdUSFNfSVBHX0NSU19TSElGVAkgMTIKKyNkZWZpbmUgTUFDX1JYX01PREUJCQkweDAwMDAwNDY4CisjZGVmaW5lICBSWF9NT0RFX1JFU0VUCQkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJYX01PREVfRU5BQkxFCQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJYX01PREVfRkxPV19DVFJMX0VOQUJMRQkgMHgwMDAwMDAwNAorI2RlZmluZSAgUlhfTU9ERV9LRUVQX01BQ19DVFJMCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgUlhfTU9ERV9LRUVQX1BBVVNFCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgUlhfTU9ERV9BQ0NFUFRfT1ZFUlNJWkVECSAweDAwMDAwMDIwCisjZGVmaW5lICBSWF9NT0RFX0FDQ0VQVF9SVU5UUwkJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFJYX01PREVfTEVOX0NIRUNLCQkgMHgwMDAwMDA4MAorI2RlZmluZSAgUlhfTU9ERV9QUk9NSVNDCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgUlhfTU9ERV9OT19DUkNfQ0hFQ0sJCSAweDAwMDAwMjAwCisjZGVmaW5lICBSWF9NT0RFX0tFRVBfVkxBTl9UQUcJCSAweDAwMDAwNDAwCisjZGVmaW5lIE1BQ19SWF9TVEFUVVMJCQkweDAwMDAwNDZjCisjZGVmaW5lICBSWF9TVEFUVVNfUkVNT1RFX1RYX1hPRkZFRAkgMHgwMDAwMDAwMQorI2RlZmluZSAgUlhfU1RBVFVTX1hPRkZfUkNWRAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJYX1NUQVRVU19YT05fUkNWRAkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgTUFDX0hBU0hfUkVHXzAJCQkweDAwMDAwNDcwCisjZGVmaW5lIE1BQ19IQVNIX1JFR18xCQkJMHgwMDAwMDQ3NAorI2RlZmluZSBNQUNfSEFTSF9SRUdfMgkJCTB4MDAwMDA0NzgKKyNkZWZpbmUgTUFDX0hBU0hfUkVHXzMJCQkweDAwMDAwNDdjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8wCQkJMHgwMDAwMDQ4MAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzAJCQkweDAwMDAwNDg0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xCQkJMHgwMDAwMDQ4OAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzEJCQkweDAwMDAwNDhjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8yCQkJMHgwMDAwMDQ5MAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzIJCQkweDAwMDAwNDk0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8zCQkJMHgwMDAwMDQ5OAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzMJCQkweDAwMDAwNDljCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV80CQkJMHgwMDAwMDRhMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzQJCQkweDAwMDAwNGE0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV81CQkJMHgwMDAwMDRhOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzUJCQkweDAwMDAwNGFjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV82CQkJMHgwMDAwMDRiMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzYJCQkweDAwMDAwNGI0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV83CQkJMHgwMDAwMDRiOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzcJCQkweDAwMDAwNGJjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV84CQkJMHgwMDAwMDRjMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzgJCQkweDAwMDAwNGM0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV85CQkJMHgwMDAwMDRjOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzkJCQkweDAwMDAwNGNjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xMAkJCTB4MDAwMDA0ZDAKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8xMAkJMHgwMDAwMDRkNAorI2RlZmluZSBNQUNfUkNWX1JVTEVfMTEJCQkweDAwMDAwNGQ4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMTEJCTB4MDAwMDA0ZGMKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzEyCQkJMHgwMDAwMDRlMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzEyCQkweDAwMDAwNGU0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xMwkJCTB4MDAwMDA0ZTgKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8xMwkJMHgwMDAwMDRlYworI2RlZmluZSBNQUNfUkNWX1JVTEVfMTQJCQkweDAwMDAwNGYwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMTQJCTB4MDAwMDA0ZjQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzE1CQkJMHgwMDAwMDRmOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzE1CQkweDAwMDAwNGZjCisjZGVmaW5lICBSQ1ZfUlVMRV9ESVNBQkxFX01BU0sJCSAweDdmZmZmZmZmCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV9DRkcJCTB4MDAwMDA1MDAKKyNkZWZpbmUgIFJDVl9SVUxFX0NGR19ERUZBVUxUX0NMQVNTCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUFDX0xPV19XTUFSS19NQVhfUlhfRlJBTUUJMHgwMDAwMDUwNAorLyogMHg1MDggLS0+IDB4NTIwIHVudXNlZCAqLworI2RlZmluZSBNQUNfSEFTSFJFR1VfMAkJCTB4MDAwMDA1MjAKKyNkZWZpbmUgTUFDX0hBU0hSRUdVXzEJCQkweDAwMDAwNTI0CisjZGVmaW5lIE1BQ19IQVNIUkVHVV8yCQkJMHgwMDAwMDUyOAorI2RlZmluZSBNQUNfSEFTSFJFR1VfMwkJCTB4MDAwMDA1MmMKKyNkZWZpbmUgTUFDX0VYVEFERFJfMF9ISUdICQkweDAwMDAwNTMwCisjZGVmaW5lIE1BQ19FWFRBRERSXzBfTE9XCQkweDAwMDAwNTM0CisjZGVmaW5lIE1BQ19FWFRBRERSXzFfSElHSAkJMHgwMDAwMDUzOAorI2RlZmluZSBNQUNfRVhUQUREUl8xX0xPVwkJMHgwMDAwMDUzYworI2RlZmluZSBNQUNfRVhUQUREUl8yX0hJR0gJCTB4MDAwMDA1NDAKKyNkZWZpbmUgTUFDX0VYVEFERFJfMl9MT1cJCTB4MDAwMDA1NDQKKyNkZWZpbmUgTUFDX0VYVEFERFJfM19ISUdICQkweDAwMDAwNTQ4CisjZGVmaW5lIE1BQ19FWFRBRERSXzNfTE9XCQkweDAwMDAwNTRjCisjZGVmaW5lIE1BQ19FWFRBRERSXzRfSElHSAkJMHgwMDAwMDU1MAorI2RlZmluZSBNQUNfRVhUQUREUl80X0xPVwkJMHgwMDAwMDU1NAorI2RlZmluZSBNQUNfRVhUQUREUl81X0hJR0gJCTB4MDAwMDA1NTgKKyNkZWZpbmUgTUFDX0VYVEFERFJfNV9MT1cJCTB4MDAwMDA1NWMKKyNkZWZpbmUgTUFDX0VYVEFERFJfNl9ISUdICQkweDAwMDAwNTYwCisjZGVmaW5lIE1BQ19FWFRBRERSXzZfTE9XCQkweDAwMDAwNTY0CisjZGVmaW5lIE1BQ19FWFRBRERSXzdfSElHSAkJMHgwMDAwMDU2OAorI2RlZmluZSBNQUNfRVhUQUREUl83X0xPVwkJMHgwMDAwMDU2YworI2RlZmluZSBNQUNfRVhUQUREUl84X0hJR0gJCTB4MDAwMDA1NzAKKyNkZWZpbmUgTUFDX0VYVEFERFJfOF9MT1cJCTB4MDAwMDA1NzQKKyNkZWZpbmUgTUFDX0VYVEFERFJfOV9ISUdICQkweDAwMDAwNTc4CisjZGVmaW5lIE1BQ19FWFRBRERSXzlfTE9XCQkweDAwMDAwNTdjCisjZGVmaW5lIE1BQ19FWFRBRERSXzEwX0hJR0gJCTB4MDAwMDA1ODAKKyNkZWZpbmUgTUFDX0VYVEFERFJfMTBfTE9XCQkweDAwMDAwNTg0CisjZGVmaW5lIE1BQ19FWFRBRERSXzExX0hJR0gJCTB4MDAwMDA1ODgKKyNkZWZpbmUgTUFDX0VYVEFERFJfMTFfTE9XCQkweDAwMDAwNThjCisjZGVmaW5lIE1BQ19TRVJERVNfQ0ZHCQkJMHgwMDAwMDU5MAorI2RlZmluZSAgTUFDX1NFUkRFU19DRkdfRURHRV9TRUxFQ1QJIDB4MDAwMDEwMDAKKyNkZWZpbmUgTUFDX1NFUkRFU19TVEFUCQkJMHgwMDAwMDU5NAorLyogMHg1OTggLS0+IDB4NWIwIHVudXNlZCAqLworI2RlZmluZSBTR19ESUdfQ1RSTAkJCTB4MDAwMDA1YjAKKyNkZWZpbmUgIFNHX0RJR19VU0lOR19IV19BVVRPTkVHCSAweDgwMDAwMDAwCisjZGVmaW5lICBTR19ESUdfU09GVF9SRVNFVAkJIDB4NDAwMDAwMDAKKyNkZWZpbmUgIFNHX0RJR19ESVNBQkxFX0xJTktSRFkJCSAweDIwMDAwMDAwCisjZGVmaW5lICBTR19ESUdfQ1JDMTZfQ0xFQVJfTgkJIDB4MDEwMDAwMDAKKyNkZWZpbmUgIFNHX0RJR19FTjEwQgkJCSAweDAwODAwMDAwCisjZGVmaW5lICBTR19ESUdfQ0xFQVJfU1RBVFVTCQkgMHgwMDQwMDAwMAorI2RlZmluZSAgU0dfRElHX0xPQ0FMX0RVUExFWF9TVEFUVVMJIDB4MDAyMDAwMDAKKyNkZWZpbmUgIFNHX0RJR19MT0NBTF9MSU5LX1NUQVRVUwkgMHgwMDEwMDAwMAorI2RlZmluZSAgU0dfRElHX1NQRUVEX1NUQVRVU19NQVNLCSAweDAwMGMwMDAwCisjZGVmaW5lICBTR19ESUdfU1BFRURfU1RBVFVTX1NISUZUCSAxOAorI2RlZmluZSAgU0dfRElHX0pVTUJPX1BBQ0tFVF9ESVNBQkxFCSAweDAwMDIwMDAwCisjZGVmaW5lICBTR19ESUdfUkVTVEFSVF9BVVRPTkVHCQkgMHgwMDAxMDAwMAorI2RlZmluZSAgU0dfRElHX0ZJQkVSX01PREUJCSAweDAwMDA4MDAwCisjZGVmaW5lICBTR19ESUdfUkVNT1RFX0ZBVUxUX01BU0sJIDB4MDAwMDYwMDAKKyNkZWZpbmUgIFNHX0RJR19QQVVTRV9NQVNLCQkgMHgwMDAwMTgwMAorI2RlZmluZSAgU0dfRElHX0dCSUNfRU5BQkxFCQkgMHgwMDAwMDQwMAorI2RlZmluZSAgU0dfRElHX0NIRUNLX0VORF9FTkFCTEUJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIFNHX0RJR19TR01JSV9BVVRPTkVHX1RJTUVSCSAweDAwMDAwMTAwCisjZGVmaW5lICBTR19ESUdfQ0xPQ0tfUEhBU0VfU0VMRUNUCSAweDAwMDAwMDgwCisjZGVmaW5lICBTR19ESUdfR01JSV9JTlBVVF9TRUxFQ1QJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFNHX0RJR19NUkFEVl9DUkMxNl9TRUxFQ1QJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFNHX0RJR19DT01NQV9ERVRFQ1RfRU5BQkxFCSAweDAwMDAwMDEwCisjZGVmaW5lICBTR19ESUdfQVVUT05FR19USU1FUl9SRURVQ0UJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFNHX0RJR19BVVRPTkVHX0xPV19FTkFCTEUJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFNHX0RJR19SRU1PVEVfTE9PUEJBQ0sJCSAweDAwMDAwMDAyCisjZGVmaW5lICBTR19ESUdfTE9PUEJBQ0sJCSAweDAwMDAwMDAxCisjZGVmaW5lIFNHX0RJR19TVEFUVVMJCQkweDAwMDAwNWI0CisjZGVmaW5lICBTR19ESUdfQ1JDMTZfQlVTX01BU0sJCSAweGZmZmYwMDAwCisjZGVmaW5lICBTR19ESUdfUEFSVE5FUl9GQVVMVF9NQVNLCSAweDAwNjAwMDAwIC8qIElmICFNUkFEVl9DUkMxNl9TRUxFQ1QgKi8KKyNkZWZpbmUgIFNHX0RJR19QQVJUTkVSX0FTWU1fUEFVU0UJIDB4MDAxMDAwMDAgLyogSWYgIU1SQURWX0NSQzE2X1NFTEVDVCAqLworI2RlZmluZSAgU0dfRElHX1BBUlRORVJfUEFVU0VfQ0FQQUJMRQkgMHgwMDA4MDAwMCAvKiBJZiAhTVJBRFZfQ1JDMTZfU0VMRUNUICovCisjZGVmaW5lICBTR19ESUdfUEFSVE5FUl9IQUxGX0RVUExFWAkgMHgwMDA0MDAwMCAvKiBJZiAhTVJBRFZfQ1JDMTZfU0VMRUNUICovCisjZGVmaW5lICBTR19ESUdfUEFSVE5FUl9GVUxMX0RVUExFWAkgMHgwMDAyMDAwMCAvKiBJZiAhTVJBRFZfQ1JDMTZfU0VMRUNUICovCisjZGVmaW5lICBTR19ESUdfUEFSVE5FUl9ORVhUX1BBR0UJIDB4MDAwMTAwMDAgLyogSWYgIU1SQURWX0NSQzE2X1NFTEVDVCAqLworI2RlZmluZSAgU0dfRElHX0FVVE9ORUdfU1RBVEVfTUFTSwkgMHgwMDAwMGZmMAorI2RlZmluZSAgU0dfRElHX0NPTU1BX0RFVEVDVE9SCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgU0dfRElHX01BQ19BQ0tfU1RBVFVTCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgU0dfRElHX0FVVE9ORUdfQ09NUExFVEUJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFNHX0RJR19BVVRPTkVHX0VSUk9SCQkgMHgwMDAwMDAwMQorLyogMHg1YjggLS0+IDB4NjAwIHVudXNlZCAqLworI2RlZmluZSBNQUNfVFhfTUFDX1NUQVRFX0JBU0UJCTB4MDAwMDA2MDAgLyogMTYgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX1JYX01BQ19TVEFURV9CQVNFCQkweDAwMDAwNjEwIC8qIDIwIGJ5dGVzICovCisvKiAweDYyNCAtLT4gMHg4MDAgdW51c2VkICovCisjZGVmaW5lIE1BQ19UWF9TVEFUU19PQ1RFVFMJCTB4MDAwMDA4MDAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1YxCQkweDAwMDAwODA0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19DT0xMSVNJT05TCQkweDAwMDAwODA4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19YT05fU0VOVAkJMHgwMDAwMDgwYworI2RlZmluZSBNQUNfVFhfU1RBVFNfWE9GRl9TRU5UCQkweDAwMDAwODEwCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWMgkJMHgwMDAwMDgxNAorI2RlZmluZSBNQUNfVFhfU1RBVFNfTUFDX0VSUk9SUwkJMHgwMDAwMDgxOAorI2RlZmluZSBNQUNfVFhfU1RBVFNfU0lOR0xFX0NPTExJU0lPTlMJMHgwMDAwMDgxYworI2RlZmluZSBNQUNfVFhfU1RBVFNfTVVMVF9DT0xMSVNJT05TCTB4MDAwMDA4MjAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX0RFRkVSUkVECQkweDAwMDAwODI0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWMwkJMHgwMDAwMDgyOAorI2RlZmluZSBNQUNfVFhfU1RBVFNfRVhDRVNTSVZFX0NPTAkweDAwMDAwODJjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19MQVRFX0NPTAkJMHgwMDAwMDgzMAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMQkJMHgwMDAwMDgzNAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMgkJMHgwMDAwMDgzOAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMwkJMHgwMDAwMDgzYworI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfNAkJMHgwMDAwMDg0MAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfNQkJMHgwMDAwMDg0NAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfNgkJMHgwMDAwMDg0OAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfNwkJMHgwMDAwMDg0YworI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfOAkJMHgwMDAwMDg1MAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfOQkJMHgwMDAwMDg1NAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMTAJCTB4MDAwMDA4NTgKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzExCQkweDAwMDAwODVjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8xMgkJMHgwMDAwMDg2MAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMTMJCTB4MDAwMDA4NjQKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzE0CQkweDAwMDAwODY4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19VQ0FTVAkJMHgwMDAwMDg2YworI2RlZmluZSBNQUNfVFhfU1RBVFNfTUNBU1QJCTB4MDAwMDA4NzAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX0JDQVNUCQkweDAwMDAwODc0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNV8xCQkweDAwMDAwODc4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNV8yCQkweDAwMDAwODdjCisjZGVmaW5lIE1BQ19SWF9TVEFUU19PQ1RFVFMJCTB4MDAwMDA4ODAKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX1JFU1YxCQkweDAwMDAwODg0CisjZGVmaW5lIE1BQ19SWF9TVEFUU19GUkFHTUVOVFMJCTB4MDAwMDA4ODgKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX1VDQVNUCQkweDAwMDAwODhjCisjZGVmaW5lIE1BQ19SWF9TVEFUU19NQ0FTVAkJMHgwMDAwMDg5MAorI2RlZmluZSBNQUNfUlhfU1RBVFNfQkNBU1QJCTB4MDAwMDA4OTQKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX0ZDU19FUlJPUlMJCTB4MDAwMDA4OTgKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX0FMSUdOX0VSUk9SUwkweDAwMDAwODljCisjZGVmaW5lIE1BQ19SWF9TVEFUU19YT05fUEFVU0VfUkVDVkQJMHgwMDAwMDhhMAorI2RlZmluZSBNQUNfUlhfU1RBVFNfWE9GRl9QQVVTRV9SRUNWRAkweDAwMDAwOGE0CisjZGVmaW5lIE1BQ19SWF9TVEFUU19NQUNfQ1RSTF9SRUNWRAkweDAwMDAwOGE4CisjZGVmaW5lIE1BQ19SWF9TVEFUU19YT0ZGX0VOVEVSRUQJMHgwMDAwMDhhYworI2RlZmluZSBNQUNfUlhfU1RBVFNfRlJBTUVfVE9PX0xPTkcJMHgwMDAwMDhiMAorI2RlZmluZSBNQUNfUlhfU1RBVFNfSkFCQkVSUwkJMHgwMDAwMDhiNAorI2RlZmluZSBNQUNfUlhfU1RBVFNfVU5ERVJTSVpFCQkweDAwMDAwOGI4CisvKiAweDhiYyAtLT4gMHhjMDAgdW51c2VkICovCisKKy8qIFNlbmQgZGF0YSBpbml0aWF0b3IgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU05EREFUQUlfTU9ERQkJCTB4MDAwMDBjMDAKKyNkZWZpbmUgIFNORERBVEFJX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBTTkREQVRBSV9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFNORERBVEFJX01PREVfU1RBVF9PRkxPV19FTkFCCSAweDAwMDAwMDA0CisjZGVmaW5lIFNORERBVEFJX1NUQVRVUwkJCTB4MDAwMDBjMDQKKyNkZWZpbmUgIFNORERBVEFJX1NUQVRVU19TVEFUX09GTE9XCSAweDAwMDAwMDA0CisjZGVmaW5lIFNORERBVEFJX1NUQVRTQ1RSTAkJMHgwMDAwMGMwOAorI2RlZmluZSAgU05EREFUQUlfU0NUUkxfRU5BQkxFCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgU05EREFUQUlfU0NUUkxfRkFTVFVQRAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFNORERBVEFJX1NDVFJMX0NMRUFSCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgU05EREFUQUlfU0NUUkxfRkxVU0gJCSAweDAwMDAwMDA4CisjZGVmaW5lICBTTkREQVRBSV9TQ1RSTF9GT1JDRV9aRVJPCSAweDAwMDAwMDEwCisjZGVmaW5lIFNORERBVEFJX1NUQVRTRU5BQgkJMHgwMDAwMGMwYworI2RlZmluZSBTTkREQVRBSV9TVEFUU0lOQ01BU0sJCTB4MDAwMDBjMTAKKy8qIDB4YzE0IC0tPiAweGM4MCB1bnVzZWQgKi8KKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8wCQkweDAwMDAwYzgwCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMQkJMHgwMDAwMGM4NAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzIJCTB4MDAwMDBjODgKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8zCQkweDAwMDAwYzhjCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfNAkJMHgwMDAwMGM5MAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzUJCTB4MDAwMDBjOTQKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF82CQkweDAwMDAwYzk4CisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfNwkJMHgwMDAwMGM5YworI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzgJCTB4MDAwMDBjYTAKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF85CQkweDAwMDAwY2E0CisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMTAJCTB4MDAwMDBjYTgKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8xMQkJMHgwMDAwMGNhYworI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzEyCQkweDAwMDAwY2IwCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMTMJCTB4MDAwMDBjYjQKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8xNAkJMHgwMDAwMGNiOAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzE1CQkweDAwMDAwY2JjCisjZGVmaW5lIFNORERBVEFJX0RNQV9SRFFfRlVMTF9DTlQJMHgwMDAwMGNjMAorI2RlZmluZSBTTkREQVRBSV9ETUFfUFJJT19SRFFfRlVMTF9DTlQJMHgwMDAwMGNjNAorI2RlZmluZSBTTkREQVRBSV9TRENRX0ZVTExfQ05UCQkweDAwMDAwY2M4CisjZGVmaW5lIFNORERBVEFJX05JQ1JOR19TU05EX1BJRFhfQ05UCTB4MDAwMDBjY2MKKyNkZWZpbmUgU05EREFUQUlfU1RBVFNfVVBEQVRFRF9DTlQJMHgwMDAwMGNkMAorI2RlZmluZSBTTkREQVRBSV9JTlRFUlJVUFRTX0NOVAkJMHgwMDAwMGNkNAorI2RlZmluZSBTTkREQVRBSV9BVk9JRF9JTlRFUlJVUFRTX0NOVAkweDAwMDAwY2Q4CisjZGVmaW5lIFNORERBVEFJX1NORF9USFJFU0hfSElUX0NOVAkweDAwMDAwY2RjCisvKiAweGNlMCAtLT4gMHgxMDAwIHVudXNlZCAqLworCisvKiBTZW5kIGRhdGEgY29tcGxldGlvbiBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBTTkREQVRBQ19NT0RFCQkJMHgwMDAwMTAwMAorI2RlZmluZSAgU05EREFUQUNfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFNORERBVEFDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorLyogMHgxMDA0IC0tPiAweDE0MDAgdW51c2VkICovCisKKy8qIFNlbmQgQkQgcmluZyBzZWxlY3RvciAqLworI2RlZmluZSBTTkRCRFNfTU9ERQkJCTB4MDAwMDE0MDAKKyNkZWZpbmUgIFNOREJEU19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgU05EQkRTX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgU05EQkRTX01PREVfQVRUTl9FTkFCTEUJIDB4MDAwMDAwMDQKKyNkZWZpbmUgU05EQkRTX1NUQVRVUwkJCTB4MDAwMDE0MDQKKyNkZWZpbmUgIFNOREJEU19TVEFUVVNfRVJST1JfQVRUTgkgMHgwMDAwMDAwNAorI2RlZmluZSBTTkRCRFNfSFdESUFHCQkJMHgwMDAwMTQwOAorLyogMHgxNDBjIC0tPiAweDE0NDAgKi8KKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzAJCTB4MDAwMDE0NDAKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzEJCTB4MDAwMDE0NDQKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzIJCTB4MDAwMDE0NDgKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzMJCTB4MDAwMDE0NGMKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzQJCTB4MDAwMDE0NTAKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzUJCTB4MDAwMDE0NTQKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzYJCTB4MDAwMDE0NTgKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzcJCTB4MDAwMDE0NWMKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzgJCTB4MDAwMDE0NjAKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzkJCTB4MDAwMDE0NjQKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzEwCQkweDAwMDAxNDY4CisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8xMQkJMHgwMDAwMTQ2YworI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMTIJCTB4MDAwMDE0NzAKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzEzCQkweDAwMDAxNDc0CisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8xNAkJMHgwMDAwMTQ3OAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMTUJCTB4MDAwMDE0N2MKKy8qIDB4MTQ4MCAtLT4gMHgxODAwIHVudXNlZCAqLworCisvKiBTZW5kIEJEIGluaXRpYXRvciBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBTTkRCRElfTU9ERQkJCTB4MDAwMDE4MDAKKyNkZWZpbmUgIFNOREJESV9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgU05EQkRJX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgU05EQkRJX01PREVfQVRUTl9FTkFCTEUJIDB4MDAwMDAwMDQKKyNkZWZpbmUgU05EQkRJX1NUQVRVUwkJCTB4MDAwMDE4MDQKKyNkZWZpbmUgIFNOREJESV9TVEFUVVNfRVJST1JfQVRUTgkgMHgwMDAwMDAwNAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMAkJMHgwMDAwMTgwOAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMQkJMHgwMDAwMTgwYworI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMgkJMHgwMDAwMTgxMAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMwkJMHgwMDAwMTgxNAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfNAkJMHgwMDAwMTgxOAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfNQkJMHgwMDAwMTgxYworI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfNgkJMHgwMDAwMTgyMAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfNwkJMHgwMDAwMTgyNAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfOAkJMHgwMDAwMTgyOAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfOQkJMHgwMDAwMTgyYworI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMTAJCTB4MDAwMDE4MzAKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzExCQkweDAwMDAxODM0CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8xMgkJMHgwMDAwMTgzOAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMTMJCTB4MDAwMDE4M2MKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzE0CQkweDAwMDAxODQwCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8xNQkJMHgwMDAwMTg0NAorLyogMHgxODQ4IC0tPiAweDFjMDAgdW51c2VkICovCisKKy8qIFNlbmQgQkQgY29tcGxldGlvbiBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBTTkRCRENfTU9ERQkJCTB4MDAwMDFjMDAKKyNkZWZpbmUgU05EQkRDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lIFNOREJEQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgU05EQkRDX01PREVfQVRUTl9FTkFCTEUJCSAweDAwMDAwMDA0CisvKiAweDFjMDQgLS0+IDB4MjAwMCB1bnVzZWQgKi8KKworLyogUmVjZWl2ZSBsaXN0IHBsYWNlbWVudCBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBSQ1ZMUENfTU9ERQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgIFJDVkxQQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWTFBDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWTFBDX01PREVfQ0xBU1MwX0FUVE5fRU5BQgkgMHgwMDAwMDAwNAorI2RlZmluZSAgUkNWTFBDX01PREVfTUFQT09SX0FBVFROX0VOQUIJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJDVkxQQ19NT0RFX1NUQVRfT0ZMT1dfRU5BQgkgMHgwMDAwMDAxMAorI2RlZmluZSBSQ1ZMUENfU1RBVFVTCQkJMHgwMDAwMjAwNAorI2RlZmluZSAgUkNWTFBDX1NUQVRVU19DTEFTUzAJCSAweDAwMDAwMDA0CisjZGVmaW5lICBSQ1ZMUENfU1RBVFVTX01BUE9PUgkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJDVkxQQ19TVEFUVVNfU1RBVF9PRkxPVwkgMHgwMDAwMDAxMAorI2RlZmluZSBSQ1ZMUENfTE9DSwkJCTB4MDAwMDIwMDgKKyNkZWZpbmUgIFJDVkxQQ19MT0NLX1JFUV9NQVNLCQkgMHgwMDAwZmZmZgorI2RlZmluZSAgUkNWTFBDX0xPQ0tfUkVRX1NISUZUCQkgMAorI2RlZmluZSAgUkNWTFBDX0xPQ0tfR1JBTlRfTUFTSwkJIDB4ZmZmZjAwMDAKKyNkZWZpbmUgIFJDVkxQQ19MT0NLX0dSQU5UX1NISUZUCSAxNgorI2RlZmluZSBSQ1ZMUENfTk9OX0VNUFRZX0JJVFMJCTB4MDAwMDIwMGMKKyNkZWZpbmUgIFJDVkxQQ19OT05fRU1QVFlfQklUU19NQVNLCSAweDAwMDBmZmZmCisjZGVmaW5lIFJDVkxQQ19DT05GSUcJCQkweDAwMDAyMDEwCisjZGVmaW5lIFJDVkxQQ19TVEFUU0NUUkwJCTB4MDAwMDIwMTQKKyNkZWZpbmUgIFJDVkxQQ19TVEFUU0NUUkxfRU5BQkxFCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZMUENfU1RBVFNDVFJMX0ZBU1RVUEQJIDB4MDAwMDAwMDIKKyNkZWZpbmUgUkNWTFBDX1NUQVRTX0VOQUJMRQkJMHgwMDAwMjAxOAorI2RlZmluZSAgUkNWTFBDX1NUQVRTRU5BQl9MTkdCUlNUX1JGSVgJIDB4MDA0MDAwMDAKKyNkZWZpbmUgUkNWTFBDX1NUQVRTX0lOQ01BU0sJCTB4MDAwMDIwMWMKKy8qIDB4MjAyMCAtLT4gMHgyMTAwIHVudXNlZCAqLworI2RlZmluZSBSQ1ZMUENfU0VMTFNUX0JBU0UJCTB4MDAwMDIxMDAgLyogMTYgMTYtYnl0ZSBlbnRyaWVzICovCisjZGVmaW5lICBTRUxMU1RfVEFJTAkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgIFNFTExTVF9DT05UCQkJMHgwMDAwMDAwOAorI2RlZmluZSAgU0VMTFNUX1VOVVNFRAkJCTB4MDAwMDAwMGMKKyNkZWZpbmUgUkNWTFBDX0NPU19DTlRMX0JBU0UJCTB4MDAwMDIyMDAgLyogMTYgNC1ieXRlIGVudHJpZXMgKi8KKyNkZWZpbmUgUkNWTFBDX0RST1BfRklMVEVSX0NOVAkJMHgwMDAwMjI0MAorI2RlZmluZSBSQ1ZMUENfRE1BX1dRX0ZVTExfQ05UCQkweDAwMDAyMjQ0CisjZGVmaW5lIFJDVkxQQ19ETUFfSElQUklPX1dRX0ZVTExfQ05UCTB4MDAwMDIyNDgKKyNkZWZpbmUgUkNWTFBDX05PX1JDVl9CRF9DTlQJCTB4MDAwMDIyNGMKKyNkZWZpbmUgUkNWTFBDX0lOX0RJU0NBUkRTX0NOVAkJMHgwMDAwMjI1MAorI2RlZmluZSBSQ1ZMUENfSU5fRVJST1JTX0NOVAkJMHgwMDAwMjI1NAorI2RlZmluZSBSQ1ZMUENfUkNWX1RIUkVTSF9ISVRfQ05UCTB4MDAwMDIyNTgKKy8qIDB4MjI1YyAtLT4gMHgyNDAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIERhdGEgYW5kIFJlY2VpdmUgQkQgSW5pdGlhdG9yIENvbnRyb2wgKi8KKyNkZWZpbmUgUkNWREJESV9NT0RFCQkJMHgwMDAwMjQwMAorI2RlZmluZSAgUkNWREJESV9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWREJESV9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJDVkRCRElfTU9ERV9KVU1CT0JEX05FRURFRAkgMHgwMDAwMDAwNAorI2RlZmluZSAgUkNWREJESV9NT0RFX0ZSTV9UT09fQklHCSAweDAwMDAwMDA4CisjZGVmaW5lICBSQ1ZEQkRJX01PREVfSU5WX1JJTkdfU1oJIDB4MDAwMDAwMTAKKyNkZWZpbmUgUkNWREJESV9TVEFUVVMJCQkweDAwMDAyNDA0CisjZGVmaW5lICBSQ1ZEQkRJX1NUQVRVU19KVU1CT0JEX05FRURFRAkgMHgwMDAwMDAwNAorI2RlZmluZSAgUkNWREJESV9TVEFUVVNfRlJNX1RPT19CSUcJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJDVkRCRElfU1RBVFVTX0lOVl9SSU5HX1NaCSAweDAwMDAwMDEwCisjZGVmaW5lIFJDVkRCRElfU1BMSVRfRlJBTUVfTUlOU1oJMHgwMDAwMjQwOAorLyogMHgyNDBjIC0tPiAweDI0NDAgdW51c2VkICovCisjZGVmaW5lIFJDVkRCRElfSlVNQk9fQkQJCTB4MDAwMDI0NDAgLyogVEczX0JESU5GT18uLi4gKi8KKyNkZWZpbmUgUkNWREJESV9TVERfQkQJCQkweDAwMDAyNDUwIC8qIFRHM19CRElORk9fLi4uICovCisjZGVmaW5lIFJDVkRCRElfTUlOSV9CRAkJCTB4MDAwMDI0NjAgLyogVEczX0JESU5GT18uLi4gKi8KKyNkZWZpbmUgUkNWREJESV9KVU1CT19DT05fSURYCQkweDAwMDAyNDcwCisjZGVmaW5lIFJDVkRCRElfU1REX0NPTl9JRFgJCTB4MDAwMDI0NzQKKyNkZWZpbmUgUkNWREJESV9NSU5JX0NPTl9JRFgJCTB4MDAwMDI0NzgKKy8qIDB4MjQ3YyAtLT4gMHgyNDgwIHVudXNlZCAqLworI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzAJCTB4MDAwMDI0ODAKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xCQkweDAwMDAyNDg0CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMgkJMHgwMDAwMjQ4OAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzMJCTB4MDAwMDI0OGMKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF80CQkweDAwMDAyNDkwCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfNQkJMHgwMDAwMjQ5NAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzYJCTB4MDAwMDI0OTgKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF83CQkweDAwMDAyNDljCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfOAkJMHgwMDAwMjRhMAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzkJCTB4MDAwMDI0YTQKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xMAkJMHgwMDAwMjRhOAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzExCQkweDAwMDAyNGFjCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMTIJCTB4MDAwMDI0YjAKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xMwkJMHgwMDAwMjRiNAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzE0CQkweDAwMDAyNGI4CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMTUJCTB4MDAwMDI0YmMKKyNkZWZpbmUgUkNWREJESV9IV0RJQUcJCQkweDAwMDAyNGMwCisvKiAweDI0YzQgLS0+IDB4MjgwMCB1bnVzZWQgKi8KKworLyogUmVjZWl2ZSBEYXRhIENvbXBsZXRpb24gQ29udHJvbCAqLworI2RlZmluZSBSQ1ZEQ0NfTU9ERQkJCTB4MDAwMDI4MDAKKyNkZWZpbmUgIFJDVkRDQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWRENDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWRENDX01PREVfQVRUTl9FTkFCTEUJIDB4MDAwMDAwMDQKKy8qIDB4MjgwNCAtLT4gMHgyYzAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIEJEIEluaXRpYXRvciBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBSQ1ZCRElfTU9ERQkJCTB4MDAwMDJjMDAKKyNkZWZpbmUgIFJDVkJESV9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWQkRJX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWQkRJX01PREVfUkNCX0FUVE5fRU5BQgkgMHgwMDAwMDAwNAorI2RlZmluZSBSQ1ZCRElfU1RBVFVTCQkJMHgwMDAwMmMwNAorI2RlZmluZSAgUkNWQkRJX1NUQVRVU19SQ0JfQVRUTgkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgUkNWQkRJX0pVTUJPX1BST0RfSURYCQkweDAwMDAyYzA4CisjZGVmaW5lIFJDVkJESV9TVERfUFJPRF9JRFgJCTB4MDAwMDJjMGMKKyNkZWZpbmUgUkNWQkRJX01JTklfUFJPRF9JRFgJCTB4MDAwMDJjMTAKKyNkZWZpbmUgUkNWQkRJX01JTklfVEhSRVNICQkweDAwMDAyYzE0CisjZGVmaW5lIFJDVkJESV9TVERfVEhSRVNICQkweDAwMDAyYzE4CisjZGVmaW5lIFJDVkJESV9KVU1CT19USFJFU0gJCTB4MDAwMDJjMWMKKy8qIDB4MmMyMCAtLT4gMHgzMDAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIEJEIENvbXBsZXRpb24gQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkNWQ0NfTU9ERQkJCTB4MDAwMDMwMDAKKyNkZWZpbmUgIFJDVkNDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZDQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJDVkNDX01PREVfQVRUTl9FTkFCTEUJCSAweDAwMDAwMDA0CisjZGVmaW5lIFJDVkNDX1NUQVRVUwkJCTB4MDAwMDMwMDQKKyNkZWZpbmUgIFJDVkNDX1NUQVRVU19FUlJPUl9BVFROCSAweDAwMDAwMDA0CisjZGVmaW5lIFJDVkNDX0pVTVBfUFJPRF9JRFgJCTB4MDAwMDMwMDgKKyNkZWZpbmUgUkNWQ0NfU1REX1BST0RfSURYCQkweDAwMDAzMDBjCisjZGVmaW5lIFJDVkNDX01JTklfUFJPRF9JRFgJCTB4MDAwMDMwMTAKKy8qIDB4MzAxNCAtLT4gMHgzNDAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIGxpc3Qgc2VsZWN0b3IgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkNWTFNDX01PREUJCQkweDAwMDAzNDAwCisjZGVmaW5lICBSQ1ZMU0NfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJDVkxTQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJDVkxTQ19NT0RFX0FUVE5fRU5BQkxFCSAweDAwMDAwMDA0CisjZGVmaW5lIFJDVkxTQ19TVEFUVVMJCQkweDAwMDAzNDA0CisjZGVmaW5lICBSQ1ZMU0NfU1RBVFVTX0VSUk9SX0FUVE4JIDB4MDAwMDAwMDQKKy8qIDB4MzQwOCAtLT4gMHgzODAwIHVudXNlZCAqLworCisvKiBNYnVmIGNsdXN0ZXIgZnJlZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUJGUkVFX01PREUJCQkweDAwMDAzODAwCisjZGVmaW5lICBNQkZSRUVfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1CRlJFRV9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgTUJGUkVFX1NUQVRVUwkJCTB4MDAwMDM4MDQKKy8qIDB4MzgwOCAtLT4gMHgzYzAwIHVudXNlZCAqLworCisvKiBIb3N0IGNvYWxlc2NpbmcgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSE9TVENDX01PREUJCQkweDAwMDAzYzAwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX0FUVE4JCSAweDAwMDAwMDA0CisjZGVmaW5lICBIT1NUQ0NfTU9ERV9OT1cJCSAweDAwMDAwMDA4CisjZGVmaW5lICBIT1NUQ0NfTU9ERV9GVUxMX1NUQVRVUwkgMHgwMDAwMDAwMAorI2RlZmluZSAgSE9TVENDX01PREVfNjRCWVRFCQkgMHgwMDAwMDA4MAorI2RlZmluZSAgSE9TVENDX01PREVfMzJCWVRFCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgSE9TVENDX01PREVfQ0xSVElDS19SWEJECSAweDAwMDAwMjAwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV9DTFJUSUNLX1RYQkQJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX05PSU5UX09OX05PVwkgMHgwMDAwMDgwMAorI2RlZmluZSAgSE9TVENDX01PREVfTk9JTlRfT05fRk9SQ0UJIDB4MDAwMDEwMDAKKyNkZWZpbmUgSE9TVENDX1NUQVRVUwkJCTB4MDAwMDNjMDQKKyNkZWZpbmUgIEhPU1RDQ19TVEFUVVNfRVJST1JfQVRUTgkgMHgwMDAwMDAwNAorI2RlZmluZSBIT1NUQ0NfUlhDT0xfVElDS1MJCTB4MDAwMDNjMDgKKyNkZWZpbmUgIExPV19SWENPTF9USUNLUwkJIDB4MDAwMDAwMzIKKyNkZWZpbmUgIERFRkFVTFRfUlhDT0xfVElDS1MJCSAweDAwMDAwMDQ4CisjZGVmaW5lICBISUdIX1JYQ09MX1RJQ0tTCQkgMHgwMDAwMDA5NgorI2RlZmluZSBIT1NUQ0NfVFhDT0xfVElDS1MJCTB4MDAwMDNjMGMKKyNkZWZpbmUgIExPV19UWENPTF9USUNLUwkJIDB4MDAwMDAwOTYKKyNkZWZpbmUgIERFRkFVTFRfVFhDT0xfVElDS1MJCSAweDAwMDAwMTJjCisjZGVmaW5lICBISUdIX1RYQ09MX1RJQ0tTCQkgMHgwMDAwMDE0NQorI2RlZmluZSBIT1NUQ0NfUlhNQVhfRlJBTUVTCQkweDAwMDAzYzEwCisjZGVmaW5lICBMT1dfUlhNQVhfRlJBTUVTCQkgMHgwMDAwMDAwNQorI2RlZmluZSAgREVGQVVMVF9SWE1BWF9GUkFNRVMJCSAweDAwMDAwMDA4CisjZGVmaW5lICBISUdIX1JYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMTIKKyNkZWZpbmUgSE9TVENDX1RYTUFYX0ZSQU1FUwkJMHgwMDAwM2MxNAorI2RlZmluZSAgTE9XX1RYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMzUKKyNkZWZpbmUgIERFRkFVTFRfVFhNQVhfRlJBTUVTCQkgMHgwMDAwMDA0YgorI2RlZmluZSAgSElHSF9UWE1BWF9GUkFNRVMJCSAweDAwMDAwMDUyCisjZGVmaW5lIEhPU1RDQ19SWENPQUxfVElDS19JTlQJCTB4MDAwMDNjMTgKKyNkZWZpbmUgIERFRkFVTFRfUlhDT0FMX1RJQ0tfSU5UCSAweDAwMDAwMDE5CisjZGVmaW5lIEhPU1RDQ19UWENPQUxfVElDS19JTlQJCTB4MDAwMDNjMWMKKyNkZWZpbmUgIERFRkFVTFRfVFhDT0FMX1RJQ0tfSU5UCSAweDAwMDAwMDE5CisjZGVmaW5lIEhPU1RDQ19SWENPQUxfTUFYRl9JTlQJCTB4MDAwMDNjMjAKKyNkZWZpbmUgIERFRkFVTFRfUlhDT0FMX01BWEZfSU5UCSAweDAwMDAwMDA1CisjZGVmaW5lIEhPU1RDQ19UWENPQUxfTUFYRl9JTlQJCTB4MDAwMDNjMjQKKyNkZWZpbmUgIERFRkFVTFRfVFhDT0FMX01BWEZfSU5UCSAweDAwMDAwMDA1CisjZGVmaW5lIEhPU1RDQ19TVEFUX0NPQUxfVElDS1MJCTB4MDAwMDNjMjgKKyNkZWZpbmUgIERFRkFVTFRfU1RBVF9DT0FMX1RJQ0tTCSAweDAwMGY0MjQwCisvKiAweDNjMmMgLS0+IDB4M2MzMCB1bnVzZWQgKi8KKyNkZWZpbmUgSE9TVENDX1NUQVRTX0JMS19IT1NUX0FERFIJMHgwMDAwM2MzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgSE9TVENDX1NUQVRVU19CTEtfSE9TVF9BRERSCTB4MDAwMDNjMzggLyogNjQtYml0ICovCisjZGVmaW5lIEhPU1RDQ19TVEFUU19CTEtfTklDX0FERFIJMHgwMDAwM2M0MAorI2RlZmluZSBIT1NUQ0NfU1RBVFVTX0JMS19OSUNfQUREUgkweDAwMDAzYzQ0CisjZGVmaW5lIEhPU1RDQ19GTE9XX0FUVE4JCTB4MDAwMDNjNDgKKy8qIDB4M2M0YyAtLT4gMHgzYzUwIHVudXNlZCAqLworI2RlZmluZSBIT1NUQ0NfSlVNQk9fQ09OX0lEWAkJMHgwMDAwM2M1MAorI2RlZmluZSBIT1NUQ0NfU1REX0NPTl9JRFgJCTB4MDAwMDNjNTQKKyNkZWZpbmUgSE9TVENDX01JTklfQ09OX0lEWAkJMHgwMDAwM2M1OAorLyogMHgzYzVjIC0tPiAweDNjODAgdW51c2VkICovCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMAkJMHgwMDAwM2M4MAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzEJCTB4MDAwMDNjODQKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8yCQkweDAwMDAzYzg4CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMwkJMHgwMDAwM2M4YworI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzQJCTB4MDAwMDNjOTAKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF81CQkweDAwMDAzYzk0CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfNgkJMHgwMDAwM2M5OAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzcJCTB4MDAwMDNjOWMKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF84CQkweDAwMDAzY2EwCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfOQkJMHgwMDAwM2NhNAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzEwCQkweDAwMDAzY2E4CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMTEJCTB4MDAwMDNjYWMKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8xMgkJMHgwMDAwM2NiMAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzEzCQkweDAwMDAzY2I0CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMTQJCTB4MDAwMDNjYjgKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8xNQkJMHgwMDAwM2NiYworI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMAkJMHgwMDAwM2NjMAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMQkJMHgwMDAwM2NjNAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMgkJMHgwMDAwM2NjOAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMwkJMHgwMDAwM2NjYworI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfNAkJMHgwMDAwM2NkMAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfNQkJMHgwMDAwM2NkNAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfNgkJMHgwMDAwM2NkOAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfNwkJMHgwMDAwM2NkYworI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfOAkJMHgwMDAwM2NlMAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfOQkJMHgwMDAwM2NlNAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMTAJCTB4MDAwMDNjZTgKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzExCQkweDAwMDAzY2VjCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8xMgkJMHgwMDAwM2NmMAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMTMJCTB4MDAwMDNjZjQKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzE0CQkweDAwMDAzY2Y4CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8xNQkJMHgwMDAwM2NmYworLyogMHgzZDAwIC0tPiAweDQwMDAgdW51c2VkICovCisKKy8qIE1lbW9yeSBhcmJpdGVyIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1FTUFSQl9NT0RFCQkJMHgwMDAwNDAwMAorI2RlZmluZSAgTUVNQVJCX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBNRU1BUkJfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lIE1FTUFSQl9TVEFUVVMJCQkweDAwMDA0MDA0CisjZGVmaW5lIE1FTUFSQl9UUkFQX0FERFJfTE9XCQkweDAwMDA0MDA4CisjZGVmaW5lIE1FTUFSQl9UUkFQX0FERFJfSElHSAkJMHgwMDAwNDAwYworLyogMHg0MDEwIC0tPiAweDQ0MDAgdW51c2VkICovCisKKy8qIEJ1ZmZlciBtYW5hZ2VyIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIEJVRk1HUl9NT0RFCQkJMHgwMDAwNDQwMAorI2RlZmluZSAgQlVGTUdSX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBCVUZNR1JfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBCVUZNR1JfTU9ERV9BVFROX0VOQUJMRQkgMHgwMDAwMDAwNAorI2RlZmluZSAgQlVGTUdSX01PREVfQk1fVEVTVAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIEJVRk1HUl9NT0RFX01CTE9XX0FUVE5fRU5BQgkgMHgwMDAwMDAxMAorI2RlZmluZSBCVUZNR1JfU1RBVFVTCQkJMHgwMDAwNDQwNAorI2RlZmluZSAgQlVGTUdSX1NUQVRVU19FUlJPUgkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIEJVRk1HUl9TVEFUVVNfTUJMT1cJCSAweDAwMDAwMDEwCisjZGVmaW5lIEJVRk1HUl9NQl9QT09MX0FERFIJCTB4MDAwMDQ0MDgKKyNkZWZpbmUgQlVGTUdSX01CX1BPT0xfU0laRQkJMHgwMDAwNDQwYworI2RlZmluZSBCVUZNR1JfTUJfUkRNQV9MT1dfV0FURVIJMHgwMDAwNDQxMAorI2RlZmluZSAgREVGQVVMVF9NQl9SRE1BX0xPV19XQVRFUgkgMHgwMDAwMDA1MAorI2RlZmluZSAgREVGQVVMVF9NQl9SRE1BX0xPV19XQVRFUl81NzA1CSAweDAwMDAwMDAwCisjZGVmaW5lICBERUZBVUxUX01CX1JETUFfTE9XX1dBVEVSX0pVTUJPIDB4MDAwMDAxMzAKKyNkZWZpbmUgQlVGTUdSX01CX01BQ1JYX0xPV19XQVRFUgkweDAwMDA0NDE0CisjZGVmaW5lICBERUZBVUxUX01CX01BQ1JYX0xPV19XQVRFUgkgIDB4MDAwMDAwMjAKKyNkZWZpbmUgIERFRkFVTFRfTUJfTUFDUlhfTE9XX1dBVEVSXzU3MDUgIDB4MDAwMDAwMTAKKyNkZWZpbmUgIERFRkFVTFRfTUJfTUFDUlhfTE9XX1dBVEVSX0pVTUJPIDB4MDAwMDAwOTgKKyNkZWZpbmUgQlVGTUdSX01CX0hJR0hfV0FURVIJCTB4MDAwMDQ0MTgKKyNkZWZpbmUgIERFRkFVTFRfTUJfSElHSF9XQVRFUgkJIDB4MDAwMDAwNjAKKyNkZWZpbmUgIERFRkFVTFRfTUJfSElHSF9XQVRFUl81NzA1CSAweDAwMDAwMDYwCisjZGVmaW5lICBERUZBVUxUX01CX0hJR0hfV0FURVJfSlVNQk8JIDB4MDAwMDAxN2MKKyNkZWZpbmUgQlVGTUdSX1JYX01CX0FMTE9DX1JFUQkJMHgwMDAwNDQxYworI2RlZmluZSAgQlVGTUdSX01CX0FMTE9DX0JJVAkJIDB4MTAwMDAwMDAKKyNkZWZpbmUgQlVGTUdSX1JYX01CX0FMTE9DX1JFU1AJCTB4MDAwMDQ0MjAKKyNkZWZpbmUgQlVGTUdSX1RYX01CX0FMTE9DX1JFUQkJMHgwMDAwNDQyNAorI2RlZmluZSBCVUZNR1JfVFhfTUJfQUxMT0NfUkVTUAkJMHgwMDAwNDQyOAorI2RlZmluZSBCVUZNR1JfRE1BX0RFU0NfUE9PTF9BRERSCTB4MDAwMDQ0MmMKKyNkZWZpbmUgQlVGTUdSX0RNQV9ERVNDX1BPT0xfU0laRQkweDAwMDA0NDMwCisjZGVmaW5lIEJVRk1HUl9ETUFfTE9XX1dBVEVSCQkweDAwMDA0NDM0CisjZGVmaW5lICBERUZBVUxUX0RNQV9MT1dfV0FURVIJCSAweDAwMDAwMDA1CisjZGVmaW5lIEJVRk1HUl9ETUFfSElHSF9XQVRFUgkJMHgwMDAwNDQzOAorI2RlZmluZSAgREVGQVVMVF9ETUFfSElHSF9XQVRFUgkJIDB4MDAwMDAwMGEKKyNkZWZpbmUgQlVGTUdSX1JYX0RNQV9BTExPQ19SRVEJCTB4MDAwMDQ0M2MKKyNkZWZpbmUgQlVGTUdSX1JYX0RNQV9BTExPQ19SRVNQCTB4MDAwMDQ0NDAKKyNkZWZpbmUgQlVGTUdSX1RYX0RNQV9BTExPQ19SRVEJCTB4MDAwMDQ0NDQKKyNkZWZpbmUgQlVGTUdSX1RYX0RNQV9BTExPQ19SRVNQCTB4MDAwMDQ0NDgKKyNkZWZpbmUgQlVGTUdSX0hXRElBR18wCQkJMHgwMDAwNDQ0YworI2RlZmluZSBCVUZNR1JfSFdESUFHXzEJCQkweDAwMDA0NDUwCisjZGVmaW5lIEJVRk1HUl9IV0RJQUdfMgkJCTB4MDAwMDQ0NTQKKy8qIDB4NDQ1OCAtLT4gMHg0ODAwIHVudXNlZCAqLworCisvKiBSZWFkIERNQSBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBSRE1BQ19NT0RFCQkJMHgwMDAwNDgwMAorI2RlZmluZSAgUkRNQUNfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJETUFDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkRNQUNfTU9ERV9UR1RBQk9SVF9FTkFCCSAweDAwMDAwMDA0CisjZGVmaW5lICBSRE1BQ19NT0RFX01TVEFCT1JUX0VOQUIJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJETUFDX01PREVfUEFSSVRZRVJSX0VOQUIJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFJETUFDX01PREVfQUREUk9GTE9XX0VOQUIJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFJETUFDX01PREVfRklGT09GTE9XX0VOQUIJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFJETUFDX01PREVfRklGT1VSVU5fRU5BQgkgMHgwMDAwMDA4MAorI2RlZmluZSAgUkRNQUNfTU9ERV9GSUZPT1JFQURfRU5BQgkgMHgwMDAwMDEwMAorI2RlZmluZSAgUkRNQUNfTU9ERV9MTkdSRUFEX0VOQUIJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIFJETUFDX01PREVfU1BMSVRfRU5BQkxFCSAweDAwMDAwODAwCisjZGVmaW5lICBSRE1BQ19NT0RFX1NQTElUX1JFU0VUCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgUkRNQUNfTU9ERV9GSUZPX1NJWkVfMTI4CSAweDAwMDIwMDAwCisjZGVmaW5lICBSRE1BQ19NT0RFX0ZJRk9fTE9OR19CVVJTVAkgMHgwMDAzMDAwMAorI2RlZmluZSBSRE1BQ19TVEFUVVMJCQkweDAwMDA0ODA0CisjZGVmaW5lICBSRE1BQ19TVEFUVVNfVEdUQUJPUlQJCSAweDAwMDAwMDA0CisjZGVmaW5lICBSRE1BQ19TVEFUVVNfTVNUQUJPUlQJCSAweDAwMDAwMDA4CisjZGVmaW5lICBSRE1BQ19TVEFUVVNfUEFSSVRZRVJSCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgUkRNQUNfU1RBVFVTX0FERFJPRkxPVwkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19GSUZPT0ZMT1cJCSAweDAwMDAwMDQwCisjZGVmaW5lICBSRE1BQ19TVEFUVVNfRklGT1VSVU4JCSAweDAwMDAwMDgwCisjZGVmaW5lICBSRE1BQ19TVEFUVVNfRklGT09SRUFECQkgMHgwMDAwMDEwMAorI2RlZmluZSAgUkRNQUNfU1RBVFVTX0xOR1JFQUQJCSAweDAwMDAwMjAwCisvKiAweDQ4MDggLS0+IDB4NGMwMCB1bnVzZWQgKi8KKworLyogV3JpdGUgRE1BIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFdETUFDX01PREUJCQkweDAwMDA0YzAwCisjZGVmaW5lICBXRE1BQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgV0RNQUNfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBXRE1BQ19NT0RFX1RHVEFCT1JUX0VOQUIJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFdETUFDX01PREVfTVNUQUJPUlRfRU5BQgkgMHgwMDAwMDAwOAorI2RlZmluZSAgV0RNQUNfTU9ERV9QQVJJVFlFUlJfRU5BQgkgMHgwMDAwMDAxMAorI2RlZmluZSAgV0RNQUNfTU9ERV9BRERST0ZMT1dfRU5BQgkgMHgwMDAwMDAyMAorI2RlZmluZSAgV0RNQUNfTU9ERV9GSUZPT0ZMT1dfRU5BQgkgMHgwMDAwMDA0MAorI2RlZmluZSAgV0RNQUNfTU9ERV9GSUZPVVJVTl9FTkFCCSAweDAwMDAwMDgwCisjZGVmaW5lICBXRE1BQ19NT0RFX0ZJRk9PUkVBRF9FTkFCCSAweDAwMDAwMTAwCisjZGVmaW5lICBXRE1BQ19NT0RFX0xOR1JFQURfRU5BQgkgMHgwMDAwMDIwMAorI2RlZmluZSAgV0RNQUNfTU9ERV9SWF9BQ0NFTAkgCSAweDAwMDAwNDAwCisjZGVmaW5lIFdETUFDX1NUQVRVUwkJCTB4MDAwMDRjMDQKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19UR1RBQk9SVAkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19NU1RBQk9SVAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19QQVJJVFlFUlIJCSAweDAwMDAwMDEwCisjZGVmaW5lICBXRE1BQ19TVEFUVVNfQUREUk9GTE9XCQkgMHgwMDAwMDAyMAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX0ZJRk9PRkxPVwkJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19GSUZPVVJVTgkJIDB4MDAwMDAwODAKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19GSUZPT1JFQUQJCSAweDAwMDAwMTAwCisjZGVmaW5lICBXRE1BQ19TVEFUVVNfTE5HUkVBRAkJIDB4MDAwMDAyMDAKKy8qIDB4NGMwOCAtLT4gMHg1MDAwIHVudXNlZCAqLworCisvKiBQZXItY3B1IHJlZ2lzdGVyIG9mZnNldHMgKGFybTkpICovCisjZGVmaW5lIENQVV9NT0RFCQkJMHgwMDAwMDAwMAorI2RlZmluZSAgQ1BVX01PREVfUkVTRVQJCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgQ1BVX01PREVfSEFMVAkJCSAweDAwMDAwNDAwCisjZGVmaW5lIENQVV9TVEFURQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ1BVX0VWVE1BU0sJCQkweDAwMDAwMDA4CisvKiAweGMgLS0+IDB4MWMgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQ1BVX1BDCQkJCTB4MDAwMDAwMWMKKyNkZWZpbmUgQ1BVX0lOU04JCQkweDAwMDAwMDIwCisjZGVmaW5lIENQVV9TUEFEX1VGTE9XCQkJMHgwMDAwMDAyNAorI2RlZmluZSBDUFVfV0RPR19DTEVBUgkJCTB4MDAwMDAwMjgKKyNkZWZpbmUgQ1BVX1dET0dfVkVDVE9SCQkJMHgwMDAwMDAyYworI2RlZmluZSBDUFVfV0RPR19QQwkJCTB4MDAwMDAwMzAKKyNkZWZpbmUgQ1BVX0hXX0JQCQkJMHgwMDAwMDAzNAorLyogMHgzOCAtLT4gMHg0NCB1bnVzZWQgKi8KKyNkZWZpbmUgQ1BVX1dET0dfU0FWRURfU1RBVEUJCTB4MDAwMDAwNDQKKyNkZWZpbmUgQ1BVX0xBU1RfQlJBTkNIX0FERFIJCTB4MDAwMDAwNDgKKyNkZWZpbmUgQ1BVX1NQQURfVUZMT1dfU0VUCQkweDAwMDAwMDRjCisvKiAweDUwIC0tPiAweDIwMCB1bnVzZWQgKi8KKyNkZWZpbmUgQ1BVX1IwCQkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgQ1BVX1IxCQkJCTB4MDAwMDAyMDQKKyNkZWZpbmUgQ1BVX1IyCQkJCTB4MDAwMDAyMDgKKyNkZWZpbmUgQ1BVX1IzCQkJCTB4MDAwMDAyMGMKKyNkZWZpbmUgQ1BVX1I0CQkJCTB4MDAwMDAyMTAKKyNkZWZpbmUgQ1BVX1I1CQkJCTB4MDAwMDAyMTQKKyNkZWZpbmUgQ1BVX1I2CQkJCTB4MDAwMDAyMTgKKyNkZWZpbmUgQ1BVX1I3CQkJCTB4MDAwMDAyMWMKKyNkZWZpbmUgQ1BVX1I4CQkJCTB4MDAwMDAyMjAKKyNkZWZpbmUgQ1BVX1I5CQkJCTB4MDAwMDAyMjQKKyNkZWZpbmUgQ1BVX1IxMAkJCQkweDAwMDAwMjI4CisjZGVmaW5lIENQVV9SMTEJCQkJMHgwMDAwMDIyYworI2RlZmluZSBDUFVfUjEyCQkJCTB4MDAwMDAyMzAKKyNkZWZpbmUgQ1BVX1IxMwkJCQkweDAwMDAwMjM0CisjZGVmaW5lIENQVV9SMTQJCQkJMHgwMDAwMDIzOAorI2RlZmluZSBDUFVfUjE1CQkJCTB4MDAwMDAyM2MKKyNkZWZpbmUgQ1BVX1IxNgkJCQkweDAwMDAwMjQwCisjZGVmaW5lIENQVV9SMTcJCQkJMHgwMDAwMDI0NAorI2RlZmluZSBDUFVfUjE4CQkJCTB4MDAwMDAyNDgKKyNkZWZpbmUgQ1BVX1IxOQkJCQkweDAwMDAwMjRjCisjZGVmaW5lIENQVV9SMjAJCQkJMHgwMDAwMDI1MAorI2RlZmluZSBDUFVfUjIxCQkJCTB4MDAwMDAyNTQKKyNkZWZpbmUgQ1BVX1IyMgkJCQkweDAwMDAwMjU4CisjZGVmaW5lIENQVV9SMjMJCQkJMHgwMDAwMDI1YworI2RlZmluZSBDUFVfUjI0CQkJCTB4MDAwMDAyNjAKKyNkZWZpbmUgQ1BVX1IyNQkJCQkweDAwMDAwMjY0CisjZGVmaW5lIENQVV9SMjYJCQkJMHgwMDAwMDI2OAorI2RlZmluZSBDUFVfUjI3CQkJCTB4MDAwMDAyNmMKKyNkZWZpbmUgQ1BVX1IyOAkJCQkweDAwMDAwMjcwCisjZGVmaW5lIENQVV9SMjkJCQkJMHgwMDAwMDI3NAorI2RlZmluZSBDUFVfUjMwCQkJCTB4MDAwMDAyNzgKKyNkZWZpbmUgQ1BVX1IzMQkJCQkweDAwMDAwMjdjCisvKiAweDI4MCAtLT4gMHg0MDAgdW51c2VkICovCisKKyNkZWZpbmUgUlhfQ1BVX0JBU0UJCQkweDAwMDA1MDAwCisjZGVmaW5lIFRYX0NQVV9CQVNFCQkJMHgwMDAwNTQwMAorCisvKiBNYWlsYm94ZXMgKi8KKyNkZWZpbmUgR1JDTUJPWF9JTlRFUlJVUFRfMAkJMHgwMDAwNTgwMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9JTlRFUlJVUFRfMQkJMHgwMDAwNTgwOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9JTlRFUlJVUFRfMgkJMHgwMDAwNTgxMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9JTlRFUlJVUFRfMwkJMHgwMDAwNTgxOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzAJCTB4MDAwMDU4MjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF8xCQkweDAwMDA1ODI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfMgkJMHgwMDAwNTgzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzMJCTB4MDAwMDU4MzggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF80CQkweDAwMDA1ODQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfNQkJMHgwMDAwNTg0OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzYJCTB4MDAwMDU4NTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF83CQkweDAwMDA1ODU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JFTE9BRF9TVEFUCQkweDAwMDA1ODYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlNURF9QUk9EX0lEWAkJMHgwMDAwNTg2OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZKVU1CT19QUk9EX0lEWAkweDAwMDA1ODcwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVk1JTklfUFJPRF9JRFgJMHgwMDAwNTg3OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8wCTB4MDAwMDU4ODAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMQkweDAwMDA1ODg4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzIJMHgwMDAwNTg5MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8zCTB4MDAwMDU4OTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfNAkweDAwMDA1OGEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzUJMHgwMDAwNThhOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF82CTB4MDAwMDU4YjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfNwkweDAwMDA1OGI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzgJMHgwMDAwNThjMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF85CTB4MDAwMDU4YzggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMTAJMHgwMDAwNThkMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8xMQkweDAwMDA1OGQ4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzEyCTB4MDAwMDU4ZTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMTMJMHgwMDAwNThlOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8xNAkweDAwMDA1OGYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzE1CTB4MDAwMDU4ZjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8wCTB4MDAwMDU5MDAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xCTB4MDAwMDU5MDggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8yCTB4MDAwMDU5MTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8zCTB4MDAwMDU5MTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF80CTB4MDAwMDU5MjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF81CTB4MDAwMDU5MjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF82CTB4MDAwMDU5MzAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF83CTB4MDAwMDU5MzggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF84CTB4MDAwMDU5NDAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF85CTB4MDAwMDU5NDggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xMAkweDAwMDA1OTUwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMTEJMHgwMDAwNTk1OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzEyCTB4MDAwMDU5NjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xMwkweDAwMDA1OTY4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMTQJMHgwMDAwNTk3MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzE1CTB4MDAwMDU5NzggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzAJMHgwMDAwNTk4MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMQkweDAwMDA1OTg4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8yCTB4MDAwMDU5OTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzMJMHgwMDAwNTk5OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfNAkweDAwMDA1OWEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF81CTB4MDAwMDU5YTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzYJMHgwMDAwNTliMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfNwkweDAwMDA1OWI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF84CTB4MDAwMDU5YzAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzkJMHgwMDAwNTljOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTAJMHgwMDAwNTlkMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTEJMHgwMDAwNTlkOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTIJMHgwMDAwNTllMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTMJMHgwMDAwNTllOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTQJMHgwMDAwNTlmMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTUJMHgwMDAwNTlmOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9ISUdIX1BSSU9fRVZfVkVDVE9SCTB4MDAwMDVhMDAKKyNkZWZpbmUgR1JDTUJPWF9ISUdIX1BSSU9fRVZfTUFTSwkweDAwMDA1YTA0CisjZGVmaW5lIEdSQ01CT1hfTE9XX1BSSU9fRVZfVkVDCQkweDAwMDA1YTA4CisjZGVmaW5lIEdSQ01CT1hfTE9XX1BSSU9fRVZfTUFTSwkweDAwMDA1YTBjCisvKiAweDVhMTAgLS0+IDB4NWMwMCAqLworCisvKiBGbG93IFRocm91Z2ggcXVldWVzICovCisjZGVmaW5lIEZUUV9SRVNFVAkJCTB4MDAwMDVjMDAKKy8qIDB4NWMwNCAtLT4gMHg1YzEwIHVudXNlZCAqLworI2RlZmluZSBGVFFfRE1BX05PUk1fUkVBRF9DVEwJCTB4MDAwMDVjMTAKKyNkZWZpbmUgRlRRX0RNQV9OT1JNX1JFQURfRlVMTF9DTlQJMHgwMDAwNWMxNAorI2RlZmluZSBGVFFfRE1BX05PUk1fUkVBRF9GSUZPX0VOUURFUQkweDAwMDA1YzE4CisjZGVmaW5lIEZUUV9ETUFfTk9STV9SRUFEX1dSSVRFX1BFRUsJMHgwMDAwNWMxYworI2RlZmluZSBGVFFfRE1BX0hJR0hfUkVBRF9DVEwJCTB4MDAwMDVjMjAKKyNkZWZpbmUgRlRRX0RNQV9ISUdIX1JFQURfRlVMTF9DTlQJMHgwMDAwNWMyNAorI2RlZmluZSBGVFFfRE1BX0hJR0hfUkVBRF9GSUZPX0VOUURFUQkweDAwMDA1YzI4CisjZGVmaW5lIEZUUV9ETUFfSElHSF9SRUFEX1dSSVRFX1BFRUsJMHgwMDAwNWMyYworI2RlZmluZSBGVFFfRE1BX0NPTVBfRElTQ19DVEwJCTB4MDAwMDVjMzAKKyNkZWZpbmUgRlRRX0RNQV9DT01QX0RJU0NfRlVMTF9DTlQJMHgwMDAwNWMzNAorI2RlZmluZSBGVFFfRE1BX0NPTVBfRElTQ19GSUZPX0VOUURFUQkweDAwMDA1YzM4CisjZGVmaW5lIEZUUV9ETUFfQ09NUF9ESVNDX1dSSVRFX1BFRUsJMHgwMDAwNWMzYworI2RlZmluZSBGVFFfU0VORF9CRF9DT01QX0NUTAkJMHgwMDAwNWM0MAorI2RlZmluZSBGVFFfU0VORF9CRF9DT01QX0ZVTExfQ05UCTB4MDAwMDVjNDQKKyNkZWZpbmUgRlRRX1NFTkRfQkRfQ09NUF9GSUZPX0VOUURFUQkweDAwMDA1YzQ4CisjZGVmaW5lIEZUUV9TRU5EX0JEX0NPTVBfV1JJVEVfUEVFSwkweDAwMDA1YzRjCisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfSU5JVF9DVEwJCTB4MDAwMDVjNTAKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9JTklUX0ZVTExfQ05UCTB4MDAwMDVjNTQKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9JTklUX0ZJRk9fRU5RREVRCTB4MDAwMDVjNTgKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9JTklUX1dSSVRFX1BFRUsJMHgwMDAwNWM1YworI2RlZmluZSBGVFFfRE1BX05PUk1fV1JJVEVfQ1RMCQkweDAwMDA1YzYwCisjZGVmaW5lIEZUUV9ETUFfTk9STV9XUklURV9GVUxMX0NOVAkweDAwMDA1YzY0CisjZGVmaW5lIEZUUV9ETUFfTk9STV9XUklURV9GSUZPX0VOUURFUQkweDAwMDA1YzY4CisjZGVmaW5lIEZUUV9ETUFfTk9STV9XUklURV9XUklURV9QRUVLCTB4MDAwMDVjNmMKKyNkZWZpbmUgRlRRX0RNQV9ISUdIX1dSSVRFX0NUTAkJMHgwMDAwNWM3MAorI2RlZmluZSBGVFFfRE1BX0hJR0hfV1JJVEVfRlVMTF9DTlQJMHgwMDAwNWM3NAorI2RlZmluZSBGVFFfRE1BX0hJR0hfV1JJVEVfRklGT19FTlFERVEJMHgwMDAwNWM3OAorI2RlZmluZSBGVFFfRE1BX0hJR0hfV1JJVEVfV1JJVEVfUEVFSwkweDAwMDA1YzdjCisjZGVmaW5lIEZUUV9TV1RZUEUxX0NUTAkJCTB4MDAwMDVjODAKKyNkZWZpbmUgRlRRX1NXVFlQRTFfRlVMTF9DTlQJCTB4MDAwMDVjODQKKyNkZWZpbmUgRlRRX1NXVFlQRTFfRklGT19FTlFERVEJCTB4MDAwMDVjODgKKyNkZWZpbmUgRlRRX1NXVFlQRTFfV1JJVEVfUEVFSwkJMHgwMDAwNWM4YworI2RlZmluZSBGVFFfU0VORF9EQVRBX0NPTVBfQ1RMCQkweDAwMDA1YzkwCisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfQ09NUF9GVUxMX0NOVAkweDAwMDA1Yzk0CisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfQ09NUF9GSUZPX0VOUURFUQkweDAwMDA1Yzk4CisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfQ09NUF9XUklURV9QRUVLCTB4MDAwMDVjOWMKKyNkZWZpbmUgRlRRX0hPU1RfQ09BTF9DVEwJCTB4MDAwMDVjYTAKKyNkZWZpbmUgRlRRX0hPU1RfQ09BTF9GVUxMX0NOVAkJMHgwMDAwNWNhNAorI2RlZmluZSBGVFFfSE9TVF9DT0FMX0ZJRk9fRU5RREVRCTB4MDAwMDVjYTgKKyNkZWZpbmUgRlRRX0hPU1RfQ09BTF9XUklURV9QRUVLCTB4MDAwMDVjYWMKKyNkZWZpbmUgRlRRX01BQ19UWF9DVEwJCQkweDAwMDA1Y2IwCisjZGVmaW5lIEZUUV9NQUNfVFhfRlVMTF9DTlQJCTB4MDAwMDVjYjQKKyNkZWZpbmUgRlRRX01BQ19UWF9GSUZPX0VOUURFUQkJMHgwMDAwNWNiOAorI2RlZmluZSBGVFFfTUFDX1RYX1dSSVRFX1BFRUsJCTB4MDAwMDVjYmMKKyNkZWZpbmUgRlRRX01CX0ZSRUVfQ1RMCQkJMHgwMDAwNWNjMAorI2RlZmluZSBGVFFfTUJfRlJFRV9GVUxMX0NOVAkJMHgwMDAwNWNjNAorI2RlZmluZSBGVFFfTUJfRlJFRV9GSUZPX0VOUURFUQkJMHgwMDAwNWNjOAorI2RlZmluZSBGVFFfTUJfRlJFRV9XUklURV9QRUVLCQkweDAwMDA1Y2NjCisjZGVmaW5lIEZUUV9SQ1ZCRF9DT01QX0NUTAkJMHgwMDAwNWNkMAorI2RlZmluZSBGVFFfUkNWQkRfQ09NUF9GVUxMX0NOVAkJMHgwMDAwNWNkNAorI2RlZmluZSBGVFFfUkNWQkRfQ09NUF9GSUZPX0VOUURFUQkweDAwMDA1Y2Q4CisjZGVmaW5lIEZUUV9SQ1ZCRF9DT01QX1dSSVRFX1BFRUsJMHgwMDAwNWNkYworI2RlZmluZSBGVFFfUkNWTFNUX1BMTVRfQ1RMCQkweDAwMDA1Y2UwCisjZGVmaW5lIEZUUV9SQ1ZMU1RfUExNVF9GVUxMX0NOVAkweDAwMDA1Y2U0CisjZGVmaW5lIEZUUV9SQ1ZMU1RfUExNVF9GSUZPX0VOUURFUQkweDAwMDA1Y2U4CisjZGVmaW5lIEZUUV9SQ1ZMU1RfUExNVF9XUklURV9QRUVLCTB4MDAwMDVjZWMKKyNkZWZpbmUgRlRRX1JDVkRBVEFfSU5JX0NUTAkJMHgwMDAwNWNmMAorI2RlZmluZSBGVFFfUkNWREFUQV9JTklfRlVMTF9DTlQJMHgwMDAwNWNmNAorI2RlZmluZSBGVFFfUkNWREFUQV9JTklfRklGT19FTlFERVEJMHgwMDAwNWNmOAorI2RlZmluZSBGVFFfUkNWREFUQV9JTklfV1JJVEVfUEVFSwkweDAwMDA1Y2ZjCisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0NPTVBfQ1RMCQkweDAwMDA1ZDAwCisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0NPTVBfRlVMTF9DTlQJMHgwMDAwNWQwNAorI2RlZmluZSBGVFFfUkNWREFUQV9DT01QX0ZJRk9fRU5RREVRCTB4MDAwMDVkMDgKKyNkZWZpbmUgRlRRX1JDVkRBVEFfQ09NUF9XUklURV9QRUVLCTB4MDAwMDVkMGMKKyNkZWZpbmUgRlRRX1NXVFlQRTJfQ1RMCQkJMHgwMDAwNWQxMAorI2RlZmluZSBGVFFfU1dUWVBFMl9GVUxMX0NOVAkJMHgwMDAwNWQxNAorI2RlZmluZSBGVFFfU1dUWVBFMl9GSUZPX0VOUURFUQkJMHgwMDAwNWQxOAorI2RlZmluZSBGVFFfU1dUWVBFMl9XUklURV9QRUVLCQkweDAwMDA1ZDFjCisvKiAweDVkMjAgLS0+IDB4NjAwMCB1bnVzZWQgKi8KKworLyogTWVzc2FnZSBzaWduYWxlZCBpbnRlcnJ1cHQgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1TR0lOVF9NT0RFCQkJMHgwMDAwNjAwMAorI2RlZmluZSAgTVNHSU5UX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBNU0dJTlRfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lIE1TR0lOVF9TVEFUVVMJCQkweDAwMDA2MDA0CisjZGVmaW5lIE1TR0lOVF9GSUZPCQkJMHgwMDAwNjAwOAorLyogMHg2MDBjIC0tPiAweDY0MDAgdW51c2VkICovCisKKy8qIERNQSBjb21wbGV0aW9uIHJlZ2lzdGVycyAqLworI2RlZmluZSBETUFDX01PREUJCQkweDAwMDA2NDAwCisjZGVmaW5lICBETUFDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBETUFDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorLyogMHg2NDA0IC0tPiAweDY4MDAgdW51c2VkICovCisKKy8qIEdSQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgR1JDX01PREUJCQkweDAwMDA2ODAwCisjZGVmaW5lICBHUkNfTU9ERV9VUERfT05fQ09BTAkJMHgwMDAwMDAwMQorI2RlZmluZSAgR1JDX01PREVfQlNXQVBfTk9ORlJNX0RBVEEJMHgwMDAwMDAwMgorI2RlZmluZSAgR1JDX01PREVfV1NXQVBfTk9ORlJNX0RBVEEJMHgwMDAwMDAwNAorI2RlZmluZSAgR1JDX01PREVfQlNXQVBfREFUQQkJMHgwMDAwMDAxMAorI2RlZmluZSAgR1JDX01PREVfV1NXQVBfREFUQQkJMHgwMDAwMDAyMAorI2RlZmluZSAgR1JDX01PREVfU1BMSVRIRFIJCTB4MDAwMDAxMDAKKyNkZWZpbmUgIEdSQ19NT0RFX05PRlJNX0NSQUNLSU5HCTB4MDAwMDAyMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0lOQ0xfQ1JDCQkweDAwMDAwNDAwCisjZGVmaW5lICBHUkNfTU9ERV9BTExPV19CQURfRlJNUwkweDAwMDAwODAwCisjZGVmaW5lICBHUkNfTU9ERV9OT0lSUV9PTl9TRU5EUwkweDAwMDAyMDAwCisjZGVmaW5lICBHUkNfTU9ERV9OT0lSUV9PTl9SQ1YJCTB4MDAwMDQwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0ZPUkNFX1BDSTMyQklUCTB4MDAwMDgwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0hPU1RfU1RBQ0tVUAkJMHgwMDAxMDAwMAorI2RlZmluZSAgR1JDX01PREVfSE9TVF9TRU5EQkRTCQkweDAwMDIwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9OT19UWF9QSERSX0NTVU0JMHgwMDEwMDAwMAorI2RlZmluZSAgR1JDX01PREVfTlZSQU1fV1JfRU5BQkxFCTB4MDAyMDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX05PX1JYX1BIRFJfQ1NVTQkweDAwODAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9JUlFfT05fVFhfQ1BVX0FUVE4JMHgwMTAwMDAwMAorI2RlZmluZSAgR1JDX01PREVfSVJRX09OX1JYX0NQVV9BVFROCTB4MDIwMDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0lSUV9PTl9NQUNfQVRUTgkweDA0MDAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9JUlFfT05fRE1BX0FUVE4JMHgwODAwMDAwMAorI2RlZmluZSAgR1JDX01PREVfSVJRX09OX0ZMT1dfQVRUTgkweDEwMDAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV80WF9OSUNfU0VORF9SSU5HUwkweDIwMDAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9NQ0FTVF9GUk1fRU5BQkxFCTB4NDAwMDAwMDAKKyNkZWZpbmUgR1JDX01JU0NfQ0ZHCQkJMHgwMDAwNjgwNAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0NPUkVDTEtfUkVTRVQJMHgwMDAwMDAwMQorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX1BSRVNDQUxBUl9NQVNLCTB4MDAwMDAwZmUKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19QUkVTQ0FMQVJfU0hJRlQJMQorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEX01BU0sJMHgwMDAxZTAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDAJMHgwMDAxZTAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDEJMHgwMDAwMDAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDJGRQkweDAwMDA0MDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwMwkweDAwMDAwMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwM1MJMHgwMDAwMjAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDQJMHgwMDAwMDAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDRDSU9CRSAweDAwMDA0MDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwNF9BMgkweDAwMDA4MDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTc4OAkweDAwMDEwMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTc4OE0JMHgwMDAxODAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEX0FDOTEwMDJBMSAweDAwMDE4MDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfS0VFUF9HUEhZX1BPV0VSCTB4MDQwMDAwMDAKKyNkZWZpbmUgR1JDX0xPQ0FMX0NUUkwJCQkweDAwMDA2ODA4CisjZGVmaW5lICBHUkNfTENMQ1RSTF9JTlRfQUNUSVZFCQkweDAwMDAwMDAxCisjZGVmaW5lICBHUkNfTENMQ1RSTF9DTEVBUklOVAkJMHgwMDAwMDAwMgorI2RlZmluZSAgR1JDX0xDTENUUkxfU0VUSU5UCQkweDAwMDAwMDA0CisjZGVmaW5lICBHUkNfTENMQ1RSTF9JTlRfT05fQVRUTgkweDAwMDAwMDA4CisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX0lOUFVUMAkweDAwMDAwMTAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX0lOUFVUMQkweDAwMDAwMjAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX0lOUFVUMgkweDAwMDAwNDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX09FMAkJMHgwMDAwMDgwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19PRTEJCTB4MDAwMDEwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fT0UyCQkweDAwMDAyMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDAJMHgwMDAwNDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQxCTB4MDAwMDgwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMgkweDAwMDEwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9FWFRNRU1fRU5BQkxFCTB4MDAwMjAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaX01BU0sJCTB4MDAxYzAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzI1NksJCTB4MDAwMDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzUxMksJCTB4MDAwNDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzFNCQkweDAwMDgwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9NRU1TWl8yTQkJMHgwMDBjMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfNE0JCTB4MDAxMDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzhNCQkweDAwMTQwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9NRU1TWl8xNk0JCTB4MDAxODAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0JBTktfU0VMRUNUCTB4MDAyMDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX1NTUkFNX1RZUEUJCTB4MDA0MDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0FVVE9fU0VFUFJPTQkweDAxMDAwMDAwCisjZGVmaW5lIEdSQ19USU1FUgkJCTB4MDAwMDY4MGMKKyNkZWZpbmUgR1JDX1JYX0NQVV9FVkVOVAkJMHgwMDAwNjgxMAorI2RlZmluZSBHUkNfUlhfVElNRVJfUkVGCQkweDAwMDA2ODE0CisjZGVmaW5lIEdSQ19SWF9DUFVfU0VNCQkJMHgwMDAwNjgxOAorI2RlZmluZSBHUkNfUkVNT1RFX1JYX0NQVV9BVFROCQkweDAwMDA2ODFjCisjZGVmaW5lIEdSQ19UWF9DUFVfRVZFTlQJCTB4MDAwMDY4MjAKKyNkZWZpbmUgR1JDX1RYX1RJTUVSX1JFRgkJMHgwMDAwNjgyNAorI2RlZmluZSBHUkNfVFhfQ1BVX1NFTQkJCTB4MDAwMDY4MjgKKyNkZWZpbmUgR1JDX1JFTU9URV9UWF9DUFVfQVRUTgkJMHgwMDAwNjgyYworI2RlZmluZSBHUkNfTUVNX1BPV0VSX1VQCQkweDAwMDA2ODMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNfRUVQUk9NX0FERFIJCQkweDAwMDA2ODM4CisjZGVmaW5lICBFRVBST01fQUREUl9XUklURQkJMHgwMDAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfUkVBRAkJMHg4MDAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfQ09NUExFVEUJCTB4NDAwMDAwMDAKKyNkZWZpbmUgIEVFUFJPTV9BRERSX0ZTTV9SRVNFVAkJMHgyMDAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfREVWSURfTUFTSwkJMHgxYzAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfREVWSURfU0hJRlQJMjYKKyNkZWZpbmUgIEVFUFJPTV9BRERSX1NUQVJUCQkweDAyMDAwMDAwCisjZGVmaW5lICBFRVBST01fQUREUl9DTEtQRVJEX1NISUZUCTE2CisjZGVmaW5lICBFRVBST01fQUREUl9BRERSX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgIEVFUFJPTV9BRERSX0FERFJfU0hJRlQJCTAKKyNkZWZpbmUgIEVFUFJPTV9ERUZBVUxUX0NMT0NLX1BFUklPRAkweDYwCisjZGVmaW5lICBFRVBST01fQ0hJUF9TSVpFCQkoNjQgKiAxMDI0KQorI2RlZmluZSBHUkNfRUVQUk9NX0RBVEEJCQkweDAwMDA2ODNjCisjZGVmaW5lIEdSQ19FRVBST01fQ1RSTAkJCTB4MDAwMDY4NDAKKyNkZWZpbmUgR1JDX01ESV9DVFJMCQkJMHgwMDAwNjg0NAorI2RlZmluZSBHUkNfU0VFUFJPTV9ERUxBWQkJMHgwMDAwNjg0OAorLyogMHg2ODRjIC0tPiAweDZjMDAgdW51c2VkICovCisKKy8qIDB4NmMwMCAtLT4gMHg3MDAwIHVudXNlZCAqLworCisvKiBOVlJBTSBDb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVlJBTV9DTUQJCQkweDAwMDA3MDAwCisjZGVmaW5lICBOVlJBTV9DTURfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBOVlJBTV9DTURfRE9ORQkJCSAweDAwMDAwMDA4CisjZGVmaW5lICBOVlJBTV9DTURfR08JCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgTlZSQU1fQ01EX1dSCQkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIE5WUkFNX0NNRF9SRAkJCSAweDAwMDAwMDAwCisjZGVmaW5lICBOVlJBTV9DTURfRVJBU0UJCSAweDAwMDAwMDQwCisjZGVmaW5lICBOVlJBTV9DTURfRklSU1QJCSAweDAwMDAwMDgwCisjZGVmaW5lICBOVlJBTV9DTURfTEFTVAkJCSAweDAwMDAwMTAwCisjZGVmaW5lICBOVlJBTV9DTURfV1JFTgkJCSAweDAwMDEwMDAwCisjZGVmaW5lICBOVlJBTV9DTURfV1JESQkJCSAweDAwMDIwMDAwCisjZGVmaW5lIE5WUkFNX1NUQVQJCQkweDAwMDA3MDA0CisjZGVmaW5lIE5WUkFNX1dSREFUQQkJCTB4MDAwMDcwMDgKKyNkZWZpbmUgTlZSQU1fQUREUgkJCTB4MDAwMDcwMGMKKyNkZWZpbmUgIE5WUkFNX0FERFJfTVNLCQkJMHgwMGZmZmZmZgorI2RlZmluZSBOVlJBTV9SRERBVEEJCQkweDAwMDA3MDEwCisjZGVmaW5lIE5WUkFNX0NGRzEJCQkweDAwMDA3MDE0CisjZGVmaW5lICBOVlJBTV9DRkcxX0ZMQVNISUZfRU5BQgkgMHgwMDAwMDAwMQorI2RlZmluZSAgTlZSQU1fQ0ZHMV9CVUZGRVJFRF9NT0RFCSAweDAwMDAwMDAyCisjZGVmaW5lICBOVlJBTV9DRkcxX1BBU1NfVEhSVQkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIE5WUkFNX0NGRzFfU1RBVFVTX0JJVFMJCSAweDAwMDAwMDcwCisjZGVmaW5lICBOVlJBTV9DRkcxX0JJVF9CQU5HCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgTlZSQU1fQ0ZHMV9GTEFTSF9TSVpFCQkgMHgwMjAwMDAwMAorI2RlZmluZSAgTlZSQU1fQ0ZHMV9DT01QQVRfQllQQVNTCSAweDgwMDAwMDAwCisjZGVmaW5lICBOVlJBTV9DRkcxX1ZFTkRPUl9NQVNLCQkgMHgwMzAwMDAwMworI2RlZmluZSAgRkxBU0hfVkVORE9SX0FUTUVMX0VFUFJPTQkgMHgwMjAwMDAwMAorI2RlZmluZSAgRkxBU0hfVkVORE9SX0FUTUVMX0ZMQVNIX0JVRkZFUkVECSAweDAyMDAwMDAzCisjZGVmaW5lICBGTEFTSF9WRU5ET1JfQVRNRUxfRkxBU0hfVU5CVUZGRVJFRAkgMHgwMDAwMDAwMworI2RlZmluZSAgRkxBU0hfVkVORE9SX1NUCQkJIDB4MDMwMDAwMDEKKyNkZWZpbmUgIEZMQVNIX1ZFTkRPUl9TQUlGVU4JCSAweDAxMDAwMDAzCisjZGVmaW5lICBGTEFTSF9WRU5ET1JfU1NUX1NNQUxMCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgRkxBU0hfVkVORE9SX1NTVF9MQVJHRQkJIDB4MDIwMDAwMDEKKyNkZWZpbmUgTlZSQU1fQ0ZHMgkJCTB4MDAwMDcwMTgKKyNkZWZpbmUgTlZSQU1fQ0ZHMwkJCTB4MDAwMDcwMWMKKyNkZWZpbmUgTlZSQU1fU1dBUkIJCQkweDAwMDA3MDIwCisjZGVmaW5lICBTV0FSQl9SRVFfU0VUMAkJCSAweDAwMDAwMDAxCisjZGVmaW5lICBTV0FSQl9SRVFfU0VUMQkJCSAweDAwMDAwMDAyCisjZGVmaW5lICBTV0FSQl9SRVFfU0VUMgkJCSAweDAwMDAwMDA0CisjZGVmaW5lICBTV0FSQl9SRVFfU0VUMwkJCSAweDAwMDAwMDA4CisjZGVmaW5lICBTV0FSQl9SRVFfQ0xSMAkJCSAweDAwMDAwMDEwCisjZGVmaW5lICBTV0FSQl9SRVFfQ0xSMQkJCSAweDAwMDAwMDIwCisjZGVmaW5lICBTV0FSQl9SRVFfQ0xSMgkJCSAweDAwMDAwMDQwCisjZGVmaW5lICBTV0FSQl9SRVFfQ0xSMwkJCSAweDAwMDAwMDgwCisjZGVmaW5lICBTV0FSQl9HTlQwCQkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFNXQVJCX0dOVDEJCQkgMHgwMDAwMDIwMAorI2RlZmluZSAgU1dBUkJfR05UMgkJCSAweDAwMDAwNDAwCisjZGVmaW5lICBTV0FSQl9HTlQzCQkJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIFNXQVJCX1JFUTAJCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgU1dBUkJfUkVRMQkJCSAweDAwMDAyMDAwCisjZGVmaW5lICBTV0FSQl9SRVEyCQkJIDB4MDAwMDQwMDAKKyNkZWZpbmUgIFNXQVJCX1JFUTMJCQkgMHgwMDAwODAwMAorI2RlZmluZSBOVlJBTV9BQ0NFU1MJCQkweDAwMDA3MDI0CisjZGVmaW5lICBBQ0NFU1NfRU5BQkxFCQkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIEFDQ0VTU19XUl9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lIE5WUkFNX1dSSVRFMQkJCTB4MDAwMDcwMjgKKy8qIDB4NzAyYyAtLT4gMHg3NDAwIHVudXNlZCAqLworCisvKiAweDc0MDAgLS0+IDB4ODAwMCB1bnVzZWQgKi8KKworI2RlZmluZSBURzNfRUVQUk9NX01BR0lDCQkweDY2OTk1NWFhCisKKy8qIDMySyBXaW5kb3cgaW50byBOSUMgaW50ZXJuYWwgbWVtb3J5ICovCisjZGVmaW5lIE5JQ19TUkFNX1dJTl9CQVNFCQkweDAwMDA4MDAwCisKKy8qIE9mZnNldHMgaW50byBmaXJzdCAzMmsgb2YgTklDIGludGVybmFsIG1lbW9yeS4gKi8KKyNkZWZpbmUgTklDX1NSQU1fUEFHRV9aRVJPCQkweDAwMDAwMDAwCisjZGVmaW5lIE5JQ19TUkFNX1NFTkRfUkNCCQkweDAwMDAwMTAwIC8qIDE2ICogVEczX0JESU5GT18uLi4gKi8KKyNkZWZpbmUgTklDX1NSQU1fUkNWX1JFVF9SQ0IJCTB4MDAwMDAyMDAgLyogMTYgKiBURzNfQkRJTkZPXy4uLiAqLworI2RlZmluZSBOSUNfU1JBTV9TVEFUU19CTEsJCTB4MDAwMDAzMDAKKyNkZWZpbmUgTklDX1NSQU1fU1RBVFVTX0JMSwkJMHgwMDAwMGIwMAorCisjZGVmaW5lIE5JQ19TUkFNX0ZJUk1XQVJFX01CT1gJCTB4MDAwMDBiNTAKKyNkZWZpbmUgIE5JQ19TUkFNX0ZJUk1XQVJFX01CT1hfTUFHSUMxCSAweDRCNjU3NjU0CisjZGVmaW5lICBOSUNfU1JBTV9GSVJNV0FSRV9NQk9YX01BR0lDMgkgMHg0ODYxNzY0YiAvKiAhZG1hIG9uIGxpbmtjaGcgKi8KKworI2RlZmluZSBOSUNfU1JBTV9EQVRBX1NJRwkJMHgwMDAwMGI1NAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9TSUdfTUFHSUMJIDB4NGI2NTc2NTQgLyogYXNjaWkgZm9yICdLZXZUJyAqLworCisjZGVmaW5lIE5JQ19TUkFNX0RBVEFfQ0ZHCQkJMHgwMDAwMGI1OAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfTUFTSwkgMHgwMDAwMDAwYworI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfTUFDCQkgMHgwMDAwMDAwMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfUEhZXzEJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9NT0RFX1BIWV8yCSAweDAwMDAwMDA4CisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9NQVNLCSAweDAwMDAwMDMwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9VTktOT1dOCSAweDAwMDAwMDAwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9DT1BQRVIJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX1BIWV9UWVBFX0ZJQkVSCSAweDAwMDAwMDIwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19XT0xfRU5BQkxFCQkgMHgwMDAwMDA0MAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfQVNGX0VOQUJMRQkJIDB4MDAwMDAwODAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX0VFUFJPTV9XUAkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX01JTklfUENJCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfRklCRVJfV09MCQkgMHgwMDAwNDAwMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTk9fR1BJTzIJCSAweDAwMTAwMDAwCisKKyNkZWZpbmUgTklDX1NSQU1fREFUQV9WRVIJCQkweDAwMDAwYjVjCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX1ZFUl9TSElGVAkJIDE2CisKKyNkZWZpbmUgTklDX1NSQU1fREFUQV9QSFlfSUQJCTB4MDAwMDBiNzQKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfUEhZX0lEMV9NQVNLCSAweGZmZmYwMDAwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX1BIWV9JRDJfTUFTSwkgMHgwMDAwZmZmZgorCisjZGVmaW5lIE5JQ19TUkFNX0ZXX0NNRF9NQk9YCQkweDAwMDAwYjc4CisjZGVmaW5lICBGV0NNRF9OSUNEUlZfQUxJVkUJCSAweDAwMDAwMDAxCisjZGVmaW5lICBGV0NNRF9OSUNEUlZfUEFVU0VfRlcJCSAweDAwMDAwMDAyCisjZGVmaW5lICBGV0NNRF9OSUNEUlZfSVBWNEFERFJfQ0hHCSAweDAwMDAwMDAzCisjZGVmaW5lICBGV0NNRF9OSUNEUlZfSVBWNkFERFJfQ0hHCSAweDAwMDAwMDA0CisjZGVmaW5lICBGV0NNRF9OSUNEUlZfRklYX0RNQVIJCSAweDAwMDAwMDA1CisjZGVmaW5lICBGV0NNRF9OSUNEUlZfRklYX0RNQVcJCSAweDAwMDAwMDA2CisjZGVmaW5lIE5JQ19TUkFNX0ZXX0NNRF9MRU5fTUJPWAkweDAwMDAwYjdjCisjZGVmaW5lIE5JQ19TUkFNX0ZXX0NNRF9EQVRBX01CT1gJMHgwMDAwMGI4MAorI2RlZmluZSBOSUNfU1JBTV9GV19BU0ZfU1RBVFVTX01CT1gJMHgwMDAwMGMwMAorI2RlZmluZSBOSUNfU1JBTV9GV19EUlZfU1RBVEVfTUJPWAkweDAwMDAwYzA0CisjZGVmaW5lICBEUlZfU1RBVEVfU1RBUlQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBEUlZfU1RBVEVfU1RBUlRfRE9ORQkJIDB4ODAwMDAwMDEKKyNkZWZpbmUgIERSVl9TVEFURV9VTkxPQUQJCSAweDAwMDAwMDAyCisjZGVmaW5lICBEUlZfU1RBVEVfVU5MT0FEX0RPTkUJCSAweDgwMDAwMDAyCisjZGVmaW5lICBEUlZfU1RBVEVfV09MCQkJIDB4MDAwMDAwMDMKKyNkZWZpbmUgIERSVl9TVEFURV9TVVNQRU5ECQkgMHgwMDAwMDAwNAorCisjZGVmaW5lIE5JQ19TUkFNX0ZXX1JFU0VUX1RZUEVfTUJPWAkweDAwMDAwYzA4CisKKyNkZWZpbmUgTklDX1NSQU1fTUFDX0FERFJfSElHSF9NQk9YCTB4MDAwMDBjMTQKKyNkZWZpbmUgTklDX1NSQU1fTUFDX0FERFJfTE9XX01CT1gJMHgwMDAwMGMxOAorCisjZGVmaW5lIE5JQ19TUkFNX0RBVEFfQ0ZHXzIJCTB4MDAwMDBkMzgKKworI2RlZmluZSAgU0hBU1RBX0VYVF9MRURfTU9ERV9NQVNLCSAweDAwMDE4MDAwCisjZGVmaW5lICBTSEFTVEFfRVhUX0xFRF9MRUdBQ1kJCSAweDAwMDAwMDAwCisjZGVmaW5lICBTSEFTVEFfRVhUX0xFRF9TSEFSRUQJCSAweDAwMDA4MDAwCisjZGVmaW5lICBTSEFTVEFfRVhUX0xFRF9NQUMJCSAweDAwMDEwMDAwCisjZGVmaW5lICBTSEFTVEFfRVhUX0xFRF9DT01CTwkJIDB4MDAwMTgwMDAKKworI2RlZmluZSBOSUNfU1JBTV9SWF9NSU5JX0JVRkZFUl9ERVNDCTB4MDAwMDEwMDAKKworI2RlZmluZSBOSUNfU1JBTV9ETUFfREVTQ19QT09MX0JBU0UJMHgwMDAwMjAwMAorI2RlZmluZSAgTklDX1NSQU1fRE1BX0RFU0NfUE9PTF9TSVpFCSAweDAwMDAyMDAwCisjZGVmaW5lIE5JQ19TUkFNX1RYX0JVRkZFUl9ERVNDCQkweDAwMDA0MDAwIC8qIDUxMiBlbnRyaWVzICovCisjZGVmaW5lIE5JQ19TUkFNX1JYX0JVRkZFUl9ERVNDCQkweDAwMDA2MDAwIC8qIDI1NiBlbnRyaWVzICovCisjZGVmaW5lIE5JQ19TUkFNX1JYX0pVTUJPX0JVRkZFUl9ERVNDCTB4MDAwMDcwMDAgLyogMjU2IGVudHJpZXMgKi8KKyNkZWZpbmUgTklDX1NSQU1fTUJVRl9QT09MX0JBU0UJCTB4MDAwMDgwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX01CVUZfUE9PTF9TSVpFOTYJIDB4MDAwMTgwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX01CVUZfUE9PTF9TSVpFNjQJIDB4MDAwMTAwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX01CVUZfUE9PTF9CQVNFNTcwNQkweDAwMDEwMDAwCisjZGVmaW5lICBOSUNfU1JBTV9NQlVGX1BPT0xfU0laRTU3MDUJMHgwMDAwZTAwMAorCisvKiBDdXJyZW50bHkgdGhpcyBpcyBmaXhlZC4gKi8KKyNkZWZpbmUgUEhZX0FERFIJCTB4MDEKKworLyogVGlnb24zIHNwZWNpZmljIFBIWSBNSUkgcmVnaXN0ZXJzLiAqLworI2RlZmluZSAgVEczX0JNQ1JfU1BFRUQxMDAwCQkweDAwNDAKKworI2RlZmluZSBNSUlfVEczX0NUUkwJCQkweDA5IC8qIDEwMDAtYmFzZVQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSAgTUlJX1RHM19DVFJMX0FEVl8xMDAwX0hBTEYJMHgwMTAwCisjZGVmaW5lICBNSUlfVEczX0NUUkxfQURWXzEwMDBfRlVMTAkweDAyMDAKKyNkZWZpbmUgIE1JSV9URzNfQ1RSTF9BU19NQVNURVIJCTB4MDgwMAorI2RlZmluZSAgTUlJX1RHM19DVFJMX0VOQUJMRV9BU19NQVNURVIJMHgxMDAwCisKKyNkZWZpbmUgTUlJX1RHM19FWFRfQ1RSTAkJMHgxMCAvKiBFeHRlbmRlZCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lICBNSUlfVEczX0VYVF9DVFJMX0ZJRk9fRUxBU1RJQwkweDAwMDEKKyNkZWZpbmUgIE1JSV9URzNfRVhUX0NUUkxfTE5LM19MRURfTU9ERQkweDAwMDIKKyNkZWZpbmUgIE1JSV9URzNfRVhUX0NUUkxfVEJJCQkweDgwMDAKKworI2RlZmluZSBNSUlfVEczX0VYVF9TVEFUCQkweDExIC8qIEV4dGVuZGVkIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSAgTUlJX1RHM19FWFRfU1RBVF9MUEFTUwkJMHgwMTAwCisKKyNkZWZpbmUgTUlJX1RHM19EU1BfUldfUE9SVAkJMHgxNSAvKiBEU1AgY29lZmZpY2llbnQgcmVhZC93cml0ZSBwb3J0ICovCisKKyNkZWZpbmUgTUlJX1RHM19EU1BfQUREUkVTUwkJMHgxNyAvKiBEU1AgYWRkcmVzcyByZWdpc3RlciAqLworCisjZGVmaW5lIE1JSV9URzNfQVVYX0NUUkwJCTB4MTggLyogYXV4aWxsaWFyeSBjb250cm9sIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVAkJMHgxOSAvKiBhdXhpbGxpYXJ5IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUX0xQQVNTCQkweDAwMDQKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF9TUERNQVNLCTB4MDcwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwSEFMRgkJMHgwMTAwCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfMTBGVUxMCQkweDAyMDAKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF8xMDBIQUxGCTB4MDMwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwMF80CQkweDA0MDAKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF8xMDBGVUxMCTB4MDUwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwMDBIQUxGCTB4MDYwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwMDBGVUxMCTB4MDcwMAorCisjZGVmaW5lIE1JSV9URzNfSVNUQVQJCQkweDFhIC8qIElSUSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX1RHM19JTUFTSwkJCTB4MWIgLyogSVJRIG1hc2sgcmVnaXN0ZXIgKi8KKworLyogSVNUQVQvSU1BU0sgZXZlbnQgYml0cyAqLworI2RlZmluZSBNSUlfVEczX0lOVF9MSU5LQ0hHCQkweDAwMDIKKyNkZWZpbmUgTUlJX1RHM19JTlRfU1BFRURDSEcJCTB4MDAwNAorI2RlZmluZSBNSUlfVEczX0lOVF9EVVBMRVhDSEcJCTB4MDAwOAorI2RlZmluZSBNSUlfVEczX0lOVF9BTkVHX1BBR0VfUlgJMHgwNDAwCisKKy8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBtYW5hZ2UgdGhlIFRYIGRlc2NyaXB0b3JzIG9uIHRoZSB0aWdvbjMuCisgKiBFaXRoZXIgdGhlIGRlc2NyaXB0b3JzIGFyZSBpbiBob3N0IERNQSdhYmxlIG1lbW9yeSwgb3IgdGhleQorICogZXhpc3Qgb25seSBpbiB0aGUgY2FyZHMgb24tY2hpcCBTUkFNLiAgQWxsIDE2IHNlbmQgYmRzIGFyZSB1bmRlcgorICogdGhlIHNhbWUgbW9kZSwgdGhleSBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgaW5kaXZpZHVhbGx5LgorICoKKyAqIFRoaXMgZHJpdmVyIGFsd2F5cyB1c2VzIGhvc3QgbWVtb3J5IFRYIGRlc2NyaXB0b3JzLgorICoKKyAqIFRvIHVzZSBob3N0IG1lbW9yeSBUWCBkZXNjcmlwdG9yczoKKyAqCTEpIFNldCBHUkNfTU9ERV9IT1NUX1NFTkRCRFMgaW4gR1JDX01PREUgcmVnaXN0ZXIuCisgKgkgICBNYWtlIHN1cmUgR1JDX01PREVfNFhfTklDX1NFTkRfUklOR1MgaXMgY2xlYXIuCisgKgkyKSBBbGxvY2F0ZSBETUEnYWJsZSBtZW1vcnkuCisgKgkzKSBJbiBOSUNfU1JBTV9TRU5EX1JDQiAob2YgZGVzaXJlZCBpbmRleCkgb2Ygb24tY2hpcCBTUkFNOgorICoJICAgYSkgU2V0IFRHM19CRElORk9fSE9TVF9BRERSIHRvIERNQSBhZGRyZXNzIG9mIG1lbW9yeQorICoJICAgICAgb2J0YWluZWQgaW4gc3RlcCAyCisgKgkgICBiKSBTZXQgVEczX0JESU5GT19OSUNfQUREUiB0byBOSUNfU1JBTV9UWF9CVUZGRVJfREVTQy4KKyAqCSAgIGMpIFNldCBsZW4gZmllbGQgb2YgVEczX0JESU5GT19NQVhMRU5fRkxBR1MgdG8gbnVtYmVyCisgKiAgICAgICAgICAgIG9mIFRYIGRlc2NyaXB0b3JzLiAgTGVhdmUgZmxhZ3MgZmllbGQgY2xlYXIuCisgKgk0KSBBY2Nlc3MgVFggZGVzY3JpcHRvcnMgdmlhIGhvc3QgbWVtb3J5LiAgVGhlIGNoaXAKKyAqCSAgIHdpbGwgcmVmZXRjaCBpbnRvIGxvY2FsIFNSQU0gYXMgbmVlZGVkIHdoZW4gcHJvZHVjZXIKKyAqCSAgIGluZGV4IG1haWxib3hlcyBhcmUgdXBkYXRlZC4KKyAqCisgKiBUbyB1c2Ugb24tY2hpcCBUWCBkZXNjcmlwdG9yczoKKyAqCTEpIFNldCBHUkNfTU9ERV80WF9OSUNfU0VORF9SSU5HUyBpbiBHUkNfTU9ERSByZWdpc3Rlci4KKyAqCSAgIE1ha2Ugc3VyZSBHUkNfTU9ERV9IT1NUX1NFTkRCRFMgaXMgY2xlYXIuCisgKgkyKSBJbiBOSUNfU1JBTV9TRU5EX1JDQiAob2YgZGVzaXJlZCBpbmRleCkgb2Ygb24tY2hpcCBTUkFNOgorICoJICAgYSkgU2V0IFRHM19CRElORk9fSE9TVF9BRERSIHRvIHplcm8uCisgKgkgICBiKSBTZXQgVEczX0JESU5GT19OSUNfQUREUiB0byBOSUNfU1JBTV9UWF9CVUZGRVJfREVTQworICoJICAgYykgVEczX0JESU5GT19NQVhMRU5fRkxBR1MgaXMgZG9uJ3QgY2FyZS4KKyAqCTMpIEFjY2VzcyBUWCBkZXNjcmlwdG9ycyBkaXJlY3RseSBpbiBvbi1jaGlwIFNSQU0KKyAqCSAgIHVzaW5nIG5vcm1hbCB7cmVhZCx3cml0ZX1sKCkuICAoYW5kIG5vdCB1c2luZworICogICAgICAgICBwb2ludGVyIGRlcmVmZXJlbmNpbmcgb2YgaW9yZW1hcCgpJ2QgbWVtb3J5IGxpa2UKKyAqCSAgIHRoZSBicm9rZW4gQnJvYWRjb20gZHJpdmVyIGRvZXMpCisgKgorICogTm90ZSB0aGF0IEJESU5GT19GTEFHU19ESVNBQkxFRCBzaG91bGQgYmUgc2V0IGluIHRoZSBmbGFncyBmaWVsZCBvZgorICogVEczX0JESU5GT19NQVhMRU5fRkxBR1Mgb2YgYWxsIHVudXNlZCBTRU5EX1JDQiBpbmRpY2VzLgorICovCitzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjIHsKKwl1MzIJCQkJYWRkcl9oaTsKKwl1MzIJCQkJYWRkcl9sbzsKKworCXUzMgkJCQlsZW5fZmxhZ3M7CisjZGVmaW5lIFRYRF9GTEFHX1RDUFVEUF9DU1VNCQkweDAwMDEKKyNkZWZpbmUgVFhEX0ZMQUdfSVBfQ1NVTQkJMHgwMDAyCisjZGVmaW5lIFRYRF9GTEFHX0VORAkJCTB4MDAwNAorI2RlZmluZSBUWERfRkxBR19JUF9GUkFHCQkweDAwMDgKKyNkZWZpbmUgVFhEX0ZMQUdfSVBfRlJBR19FTkQJCTB4MDAxMAorI2RlZmluZSBUWERfRkxBR19WTEFOCQkJMHgwMDQwCisjZGVmaW5lIFRYRF9GTEFHX0NPQUxfTk9XCQkweDAwODAKKyNkZWZpbmUgVFhEX0ZMQUdfQ1BVX1BSRV9ETUEJCTB4MDEwMAorI2RlZmluZSBUWERfRkxBR19DUFVfUE9TVF9ETUEJCTB4MDIwMAorI2RlZmluZSBUWERfRkxBR19BRERfU1JDX0FERFIJCTB4MTAwMAorI2RlZmluZSBUWERfRkxBR19DSE9PU0VfU1JDX0FERFIJMHg2MDAwCisjZGVmaW5lIFRYRF9GTEFHX05PX0NSQwkJCTB4ODAwMAorI2RlZmluZSBUWERfTEVOX1NISUZUCQkJMTYKKworCXUzMgkJCQl2bGFuX3RhZzsKKyNkZWZpbmUgVFhEX1ZMQU5fVEFHX1NISUZUCQkwCisjZGVmaW5lIFRYRF9NU1NfU0hJRlQJCQkxNgorfTsKKworI2RlZmluZSBUWERfQUREUgkJCTB4MDBVTCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgVFhEX0xFTl9GTEFHUwkJCTB4MDhVTCAvKiAzMi1iaXQgKHVwcGVyIDE2LWJpdHMgYXJlIGxlbikgKi8KKyNkZWZpbmUgVFhEX1ZMQU5fVEFHCQkJMHgwY1VMIC8qIDMyLWJpdCAodXBwZXIgMTYtYml0cyBhcmUgdGFnKSAqLworI2RlZmluZSBUWERfU0laRQkJCTB4MTBVTAorCitzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjIHsKKwl1MzIJCQkJYWRkcl9oaTsKKwl1MzIJCQkJYWRkcl9sbzsKKworCXUzMgkJCQlpZHhfbGVuOworI2RlZmluZSBSWERfSURYX01BU0sJMHhmZmZmMDAwMAorI2RlZmluZSBSWERfSURYX1NISUZUCTE2CisjZGVmaW5lIFJYRF9MRU5fTUFTSwkweDAwMDBmZmZmCisjZGVmaW5lIFJYRF9MRU5fU0hJRlQJMAorCisJdTMyCQkJCXR5cGVfZmxhZ3M7CisjZGVmaW5lIFJYRF9UWVBFX1NISUZUCTE2CisjZGVmaW5lIFJYRF9GTEFHU19TSElGVAkwCisKKyNkZWZpbmUgUlhEX0ZMQUdfRU5ECQkJMHgwMDA0CisjZGVmaW5lIFJYRF9GTEFHX01JTkkJCQkweDA4MDAKKyNkZWZpbmUgUlhEX0ZMQUdfSlVNQk8JCQkweDAwMjAKKyNkZWZpbmUgUlhEX0ZMQUdfVkxBTgkJCTB4MDA0MAorI2RlZmluZSBSWERfRkxBR19FUlJPUgkJCTB4MDQwMAorI2RlZmluZSBSWERfRkxBR19JUF9DU1VNCQkweDEwMDAKKyNkZWZpbmUgUlhEX0ZMQUdfVENQVURQX0NTVU0JCTB4MjAwMAorI2RlZmluZSBSWERfRkxBR19JU19UQ1AJCQkweDQwMDAKKworCXUzMgkJCQlpcF90Y3BfY3N1bTsKKyNkZWZpbmUgUlhEX0lQQ1NVTV9NQVNLCQkweGZmZmYwMDAwCisjZGVmaW5lIFJYRF9JUENTVU1fU0hJRlQJMTYKKyNkZWZpbmUgUlhEX1RDUENTVU1fTUFTSwkweDAwMDBmZmZmCisjZGVmaW5lIFJYRF9UQ1BDU1VNX1NISUZUCTAKKworCXUzMgkJCQllcnJfdmxhbjsKKworI2RlZmluZSBSWERfVkxBTl9NQVNLCQkJMHgwMDAwZmZmZgorCisjZGVmaW5lIFJYRF9FUlJfQkFEX0NSQwkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgUlhEX0VSUl9DT0xMSVNJT04JCTB4MDAwMjAwMDAKKyNkZWZpbmUgUlhEX0VSUl9MSU5LX0xPU1QJCTB4MDAwNDAwMDAKKyNkZWZpbmUgUlhEX0VSUl9QSFlfREVDT0RFCQkweDAwMDgwMDAwCisjZGVmaW5lIFJYRF9FUlJfT0REX05JQkJMRV9SQ1ZEX01JSQkweDAwMTAwMDAwCisjZGVmaW5lIFJYRF9FUlJfTUFDX0FCUlQJCTB4MDAyMDAwMDAKKyNkZWZpbmUgUlhEX0VSUl9UT09fU01BTEwJCTB4MDA0MDAwMDAKKyNkZWZpbmUgUlhEX0VSUl9OT19SRVNPVVJDRVMJCTB4MDA4MDAwMDAKKyNkZWZpbmUgUlhEX0VSUl9IVUdFX0ZSQU1FCQkweDAxMDAwMDAwCisjZGVmaW5lIFJYRF9FUlJfTUFTSwkJCTB4ZmZmZjAwMDAKKworCXUzMgkJCQlyZXNlcnZlZDsKKwl1MzIJCQkJb3BhcXVlOworI2RlZmluZSBSWERfT1BBUVVFX0lOREVYX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgUlhEX09QQVFVRV9JTkRFWF9TSElGVAkJMAorI2RlZmluZSBSWERfT1BBUVVFX1JJTkdfU1RECQkweDAwMDEwMDAwCisjZGVmaW5lIFJYRF9PUEFRVUVfUklOR19KVU1CTwkJMHgwMDAyMDAwMAorI2RlZmluZSBSWERfT1BBUVVFX1JJTkdfTUlOSQkJMHgwMDA0MDAwMAorI2RlZmluZSBSWERfT1BBUVVFX1JJTkdfTUFTSwkJMHgwMDA3MDAwMAorfTsKKworc3RydWN0IHRnM19leHRfcnhfYnVmZmVyX2Rlc2MgeworCXN0cnVjdCB7CisJCXUzMgkJCWFkZHJfaGk7CisJCXUzMgkJCWFkZHJfbG87CisJfQkJCQlhZGRybGlzdFszXTsKKwl1MzIJCQkJbGVuMl9sZW4xOworCXUzMgkJCQlyZXN2X2xlbjM7CisJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYwlzdGQ7Cit9OworCisvKiBXZSBvbmx5IHVzZSB0aGlzIHdoZW4gdGVzdGluZyBvdXQgdGhlIERNQSBlbmdpbmUKKyAqIGF0IHByb2JlIHRpbWUuICBUaGlzIGlzIHRoZSBpbnRlcm5hbCBmb3JtYXQgb2YgYnVmZmVyCisgKiBkZXNjcmlwdG9ycyB1c2VkIGJ5IHRoZSBjaGlwIGF0IE5JQ19TUkFNX0RNQV9ERVNDUy4KKyAqLworc3RydWN0IHRnM19pbnRlcm5hbF9idWZmZXJfZGVzYyB7CisJdTMyCQkJCWFkZHJfaGk7CisJdTMyCQkJCWFkZHJfbG87CisJdTMyCQkJCW5pY19tYnVmOworCS8qIFhYWCBGSVggVEhJUyAqLworI2lmZGVmIF9fQklHX0VORElBTgorCXUxNgkJCQljcWlkX3NxaWQ7CisJdTE2CQkJCWxlbjsKKyNlbHNlCisJdTE2CQkJCWxlbjsKKwl1MTYJCQkJY3FpZF9zcWlkOworI2VuZGlmCisJdTMyCQkJCWZsYWdzOworCXUzMgkJCQlfX2Nvb2tpZTE7CisJdTMyCQkJCV9fY29va2llMjsKKwl1MzIJCQkJX19jb29raWUzOworfTsKKworI2RlZmluZSBURzNfSFdfU1RBVFVTX1NJWkUJCTB4NTAKK3N0cnVjdCB0ZzNfaHdfc3RhdHVzIHsKKwl1MzIJCQkJc3RhdHVzOworI2RlZmluZSBTRF9TVEFUVVNfVVBEQVRFRAkJMHgwMDAwMDAwMQorI2RlZmluZSBTRF9TVEFUVVNfTElOS19DSEcJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU0RfU1RBVFVTX0VSUk9SCQkJMHgwMDAwMDAwNAorCisJdTMyCQkJCXN0YXR1c190YWc7CisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl1MTYJCQkJcnhfY29uc3VtZXI7CisJdTE2CQkJCXJ4X2p1bWJvX2NvbnN1bWVyOworI2Vsc2UKKwl1MTYJCQkJcnhfanVtYm9fY29uc3VtZXI7CisJdTE2CQkJCXJ4X2NvbnN1bWVyOworI2VuZGlmCisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl1MTYJCQkJcmVzZXJ2ZWQ7CisJdTE2CQkJCXJ4X21pbmlfY29uc3VtZXI7CisjZWxzZQorCXUxNgkJCQlyeF9taW5pX2NvbnN1bWVyOworCXUxNgkJCQlyZXNlcnZlZDsKKyNlbmRpZgorCXN0cnVjdCB7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCXUxNgkJCXR4X2NvbnN1bWVyOworCQl1MTYJCQlyeF9wcm9kdWNlcjsKKyNlbHNlCisJCXUxNgkJCXJ4X3Byb2R1Y2VyOworCQl1MTYJCQl0eF9jb25zdW1lcjsKKyNlbmRpZgorCX0JCQkJaWR4WzE2XTsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgaGlnaCwgbG93OworfSB0ZzNfc3RhdDY0X3Q7CisKK3N0cnVjdCB0ZzNfaHdfc3RhdHMgeworCXU4CQkJCV9fcmVzZXJ2ZWQwWzB4NDAwLTB4MzAwXTsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBSZWNlaXZlIE1BQy4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlyeF9vY3RldHM7CisJdTY0CQkJCV9fcmVzZXJ2ZWQxOworCXRnM19zdGF0NjRfdAkJCXJ4X2ZyYWdtZW50czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF91Y2FzdF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4X21jYXN0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfYmNhc3RfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9mY3NfZXJyb3JzOworCXRnM19zdGF0NjRfdAkJCXJ4X2FsaWduX2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF94b25fcGF1c2VfcmN2ZDsKKwl0ZzNfc3RhdDY0X3QJCQlyeF94b2ZmX3BhdXNlX3JjdmQ7CisJdGczX3N0YXQ2NF90CQkJcnhfbWFjX2N0cmxfcmN2ZDsKKwl0ZzNfc3RhdDY0X3QJCQlyeF94b2ZmX2VudGVyZWQ7CisJdGczX3N0YXQ2NF90CQkJcnhfZnJhbWVfdG9vX2xvbmdfZXJyb3JzOworCXRnM19zdGF0NjRfdAkJCXJ4X2phYmJlcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfdW5kZXJzaXplX3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfaW5fbGVuZ3RoX2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9vdXRfbGVuZ3RoX2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF82NF9vcl9sZXNzX29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfNjVfdG9fMTI3X29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfMTI4X3RvXzI1NV9vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzI1Nl90b181MTFfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF81MTJfdG9fMTAyM19vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzEwMjRfdG9fMTUyMl9vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzE1MjNfdG9fMjA0N19vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzIwNDhfdG9fNDA5NV9vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzQwOTZfdG9fODE5MV9vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzgxOTJfdG9fOTAyMl9vY3RldF9wYWNrZXRzOworCisJdTY0CQkJCV9fdW51c2VkMFszN107CisKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgVHJhbnNtaXQgTUFDLiAqLworCXRnM19zdGF0NjRfdAkJCXR4X29jdGV0czsKKwl1NjQJCQkJX19yZXNlcnZlZDI7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlzaW9uczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF94b25fc2VudDsKKwl0ZzNfc3RhdDY0X3QJCQl0eF94b2ZmX3NlbnQ7CisJdGczX3N0YXQ2NF90CQkJdHhfZmxvd19jb250cm9sOworCXRnM19zdGF0NjRfdAkJCXR4X21hY19lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJdHhfc2luZ2xlX2NvbGxpc2lvbnM7CisJdGczX3N0YXQ2NF90CQkJdHhfbXVsdF9jb2xsaXNpb25zOworCXRnM19zdGF0NjRfdAkJCXR4X2RlZmVycmVkOworCXU2NAkJCQlfX3Jlc2VydmVkMzsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9leGNlc3NpdmVfY29sbGlzaW9uczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9sYXRlX2NvbGxpc2lvbnM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8ydGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8zdGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV80dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV81dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV82dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV83dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV84dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV85dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8xMHRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfMTF0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzEydGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8xM3RpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfMTR0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzE1dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfdWNhc3RfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9tY2FzdF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXR4X2JjYXN0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJdHhfY2Fycmllcl9zZW5zZV9lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJdHhfZGlzY2FyZHM7CisJdGczX3N0YXQ2NF90CQkJdHhfZXJyb3JzOworCisJdTY0CQkJCV9fdW51c2VkMVszMV07CisKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgUmVjZWl2ZSBMaXN0IFBsYWNlbWVudC4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlDT1NfcnhfcGFja2V0c1sxNl07CisJdGczX3N0YXQ2NF90CQkJQ09TX3J4X2ZpbHRlcl9kcm9wcGVkOworCXRnM19zdGF0NjRfdAkJCWRtYV93cml0ZXFfZnVsbDsKKwl0ZzNfc3RhdDY0X3QJCQlkbWFfd3JpdGVfcHJpb3FfZnVsbDsKKwl0ZzNfc3RhdDY0X3QJCQlyeGJkc19lbXB0eTsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9kaXNjYXJkczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfdGhyZXNob2xkX2hpdDsKKworCXU2NAkJCQlfX3VudXNlZDJbOV07CisKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgU2VuZCBEYXRhIEluaXRpYXRvci4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlDT1Nfb3V0X3BhY2tldHNbMTZdOworCXRnM19zdGF0NjRfdAkJCWRtYV9yZWFkcV9mdWxsOworCXRnM19zdGF0NjRfdAkJCWRtYV9yZWFkX3ByaW9xX2Z1bGw7CisJdGczX3N0YXQ2NF90CQkJdHhfY29tcF9xdWV1ZV9mdWxsOworCisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IEhvc3QgQ29hbGVzY2luZy4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlyaW5nX3NldF9zZW5kX3Byb2RfaW5kZXg7CisJdGczX3N0YXQ2NF90CQkJcmluZ19zdGF0dXNfdXBkYXRlOworCXRnM19zdGF0NjRfdAkJCW5pY19pcnFzOworCXRnM19zdGF0NjRfdAkJCW5pY19hdm9pZGVkX2lycXM7CisJdGczX3N0YXQ2NF90CQkJbmljX3R4X3RocmVzaG9sZF9oaXQ7CisKKwl1OAkJCQlfX3Jlc2VydmVkNFsweGIwMC0weDljMF07Cit9OworCisvKiAnbWFwcGluZycgaXMgc3VwZXJmbHVvdXMgYXMgdGhlIGNoaXAgZG9lcyBub3Qgd3JpdGUgaW50bworICogdGhlIHR4L3J4IHBvc3QgcmluZ3Mgc28gd2UgY291bGQganVzdCBmZXRjaCBpdCBmcm9tIHRoZXJlLgorICogQnV0IHRoZSBjYWNoZSBiZWhhdmlvciBpcyBiZXR0ZXIgaG93IHdlIGFyZSBkb2luZyBpdCBub3cuCisgKi8KK3N0cnVjdCByaW5nX2luZm8geworCXN0cnVjdCBza19idWZmCQkJKnNrYjsKKwlERUNMQVJFX1BDSV9VTk1BUF9BRERSKG1hcHBpbmcpCit9OworCitzdHJ1Y3QgdHhfcmluZ19pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkJCSpza2I7CisJREVDTEFSRV9QQ0lfVU5NQVBfQUREUihtYXBwaW5nKQorCXUzMgkJCQlwcmV2X3ZsYW5fdGFnOworfTsKKworc3RydWN0IHRnM19jb25maWdfaW5mbyB7CisJdTMyCQkJCWZsYWdzOworfTsKKworc3RydWN0IHRnM19saW5rX2NvbmZpZyB7CisJLyogRGVzY3JpYmVzIHdoYXQgd2UncmUgdHJ5aW5nIHRvIGdldC4gKi8KKwl1MzIJCQkJYWR2ZXJ0aXNpbmc7CisJdTE2CQkJCXNwZWVkOworCXU4CQkJCWR1cGxleDsKKwl1OAkJCQlhdXRvbmVnOworCisJLyogRGVzY3JpYmVzIHdoYXQgd2UgYWN0dWFsbHkgaGF2ZS4gKi8KKwl1MTYJCQkJYWN0aXZlX3NwZWVkOworCXU4CQkJCWFjdGl2ZV9kdXBsZXg7CisjZGVmaW5lIFNQRUVEX0lOVkFMSUQJCTB4ZmZmZgorI2RlZmluZSBEVVBMRVhfSU5WQUxJRAkJMHhmZgorI2RlZmluZSBBVVRPTkVHX0lOVkFMSUQJCTB4ZmYKKworCS8qIFdoZW4gd2UgZ28gaW4gYW5kIG91dCBvZiBsb3cgcG93ZXIgbW9kZSB3ZSBuZWVkCisJICogdG8gc3dhcCB3aXRoIHRoaXMgc3RhdGUuCisJICovCisJaW50CQkJCXBoeV9pc19sb3dfcG93ZXI7CisJdTE2CQkJCW9yaWdfc3BlZWQ7CisJdTgJCQkJb3JpZ19kdXBsZXg7CisJdTgJCQkJb3JpZ19hdXRvbmVnOworfTsKKworc3RydWN0IHRnM19idWZtZ3JfY29uZmlnIHsKKwl1MzIJCW1idWZfcmVhZF9kbWFfbG93X3dhdGVyOworCXUzMgkJbWJ1Zl9tYWNfcnhfbG93X3dhdGVyOworCXUzMgkJbWJ1Zl9oaWdoX3dhdGVyOworCisJdTMyCQltYnVmX3JlYWRfZG1hX2xvd193YXRlcl9qdW1ibzsKKwl1MzIJCW1idWZfbWFjX3J4X2xvd193YXRlcl9qdW1ibzsKKwl1MzIJCW1idWZfaGlnaF93YXRlcl9qdW1ibzsKKworCXUzMgkJZG1hX2xvd193YXRlcjsKKwl1MzIJCWRtYV9oaWdoX3dhdGVyOworfTsKKworc3RydWN0IHRnM19ldGh0b29sX3N0YXRzIHsKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgUmVjZWl2ZSBNQUMuICovCisJdTY0IAkgICAgCXJ4X29jdGV0czsKKwl1NjQJCXJ4X2ZyYWdtZW50czsKKwl1NjQJCXJ4X3VjYXN0X3BhY2tldHM7CisJdTY0CQlyeF9tY2FzdF9wYWNrZXRzOworCXU2NAkJcnhfYmNhc3RfcGFja2V0czsKKwl1NjQJCXJ4X2Zjc19lcnJvcnM7CisJdTY0CQlyeF9hbGlnbl9lcnJvcnM7CisJdTY0CQlyeF94b25fcGF1c2VfcmN2ZDsKKwl1NjQJCXJ4X3hvZmZfcGF1c2VfcmN2ZDsKKwl1NjQJCXJ4X21hY19jdHJsX3JjdmQ7CisJdTY0CQlyeF94b2ZmX2VudGVyZWQ7CisJdTY0CQlyeF9mcmFtZV90b29fbG9uZ19lcnJvcnM7CisJdTY0CQlyeF9qYWJiZXJzOworCXU2NAkJcnhfdW5kZXJzaXplX3BhY2tldHM7CisJdTY0CQlyeF9pbl9sZW5ndGhfZXJyb3JzOworCXU2NAkJcnhfb3V0X2xlbmd0aF9lcnJvcnM7CisJdTY0CQlyeF82NF9vcl9sZXNzX29jdGV0X3BhY2tldHM7CisJdTY0CQlyeF82NV90b18xMjdfb2N0ZXRfcGFja2V0czsKKwl1NjQJCXJ4XzEyOF90b18yNTVfb2N0ZXRfcGFja2V0czsKKwl1NjQJCXJ4XzI1Nl90b181MTFfb2N0ZXRfcGFja2V0czsKKwl1NjQJCXJ4XzUxMl90b18xMDIzX29jdGV0X3BhY2tldHM7CisJdTY0CQlyeF8xMDI0X3RvXzE1MjJfb2N0ZXRfcGFja2V0czsKKwl1NjQJCXJ4XzE1MjNfdG9fMjA0N19vY3RldF9wYWNrZXRzOworCXU2NAkJcnhfMjA0OF90b180MDk1X29jdGV0X3BhY2tldHM7CisJdTY0CQlyeF80MDk2X3RvXzgxOTFfb2N0ZXRfcGFja2V0czsKKwl1NjQJCXJ4XzgxOTJfdG9fOTAyMl9vY3RldF9wYWNrZXRzOworCisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IFRyYW5zbWl0IE1BQy4gKi8KKwl1NjQJCXR4X29jdGV0czsKKwl1NjQJCXR4X2NvbGxpc2lvbnM7CisJdTY0CQl0eF94b25fc2VudDsKKwl1NjQJCXR4X3hvZmZfc2VudDsKKwl1NjQJCXR4X2Zsb3dfY29udHJvbDsKKwl1NjQJCXR4X21hY19lcnJvcnM7CisJdTY0CQl0eF9zaW5nbGVfY29sbGlzaW9uczsKKwl1NjQJCXR4X211bHRfY29sbGlzaW9uczsKKwl1NjQJCXR4X2RlZmVycmVkOworCXU2NAkJdHhfZXhjZXNzaXZlX2NvbGxpc2lvbnM7CisJdTY0CQl0eF9sYXRlX2NvbGxpc2lvbnM7CisJdTY0CQl0eF9jb2xsaWRlXzJ0aW1lczsKKwl1NjQJCXR4X2NvbGxpZGVfM3RpbWVzOworCXU2NAkJdHhfY29sbGlkZV80dGltZXM7CisJdTY0CQl0eF9jb2xsaWRlXzV0aW1lczsKKwl1NjQJCXR4X2NvbGxpZGVfNnRpbWVzOworCXU2NAkJdHhfY29sbGlkZV83dGltZXM7CisJdTY0CQl0eF9jb2xsaWRlXzh0aW1lczsKKwl1NjQJCXR4X2NvbGxpZGVfOXRpbWVzOworCXU2NAkJdHhfY29sbGlkZV8xMHRpbWVzOworCXU2NAkJdHhfY29sbGlkZV8xMXRpbWVzOworCXU2NAkJdHhfY29sbGlkZV8xMnRpbWVzOworCXU2NAkJdHhfY29sbGlkZV8xM3RpbWVzOworCXU2NAkJdHhfY29sbGlkZV8xNHRpbWVzOworCXU2NAkJdHhfY29sbGlkZV8xNXRpbWVzOworCXU2NAkJdHhfdWNhc3RfcGFja2V0czsKKwl1NjQJCXR4X21jYXN0X3BhY2tldHM7CisJdTY0CQl0eF9iY2FzdF9wYWNrZXRzOworCXU2NAkJdHhfY2Fycmllcl9zZW5zZV9lcnJvcnM7CisJdTY0CQl0eF9kaXNjYXJkczsKKwl1NjQJCXR4X2Vycm9yczsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBSZWNlaXZlIExpc3QgUGxhY2VtZW50LiAqLworCXU2NAkJZG1hX3dyaXRlcV9mdWxsOworCXU2NAkJZG1hX3dyaXRlX3ByaW9xX2Z1bGw7CisJdTY0CQlyeGJkc19lbXB0eTsKKwl1NjQJCXJ4X2Rpc2NhcmRzOworCXU2NAkJcnhfZXJyb3JzOworCXU2NAkJcnhfdGhyZXNob2xkX2hpdDsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBTZW5kIERhdGEgSW5pdGlhdG9yLiAqLworCXU2NAkJZG1hX3JlYWRxX2Z1bGw7CisJdTY0CQlkbWFfcmVhZF9wcmlvcV9mdWxsOworCXU2NAkJdHhfY29tcF9xdWV1ZV9mdWxsOworCisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IEhvc3QgQ29hbGVzY2luZy4gKi8KKwl1NjQJCXJpbmdfc2V0X3NlbmRfcHJvZF9pbmRleDsKKwl1NjQJCXJpbmdfc3RhdHVzX3VwZGF0ZTsKKwl1NjQJCW5pY19pcnFzOworCXU2NAkJbmljX2F2b2lkZWRfaXJxczsKKwl1NjQJCW5pY190eF90aHJlc2hvbGRfaGl0OworfTsKKworc3RydWN0IHRnMyB7CisJLyogYmVnaW4gImdlbmVyYWwsIGZyZXF1ZW50bHktdXNlZCBtZW1iZXJzIiBjYWNoZWxpbmUgc2VjdGlvbiAqLworCisJLyogU01QIGxvY2tpbmcgc3RyYXRlZ3k6CisJICoKKwkgKiBsb2NrOiBIZWxkIGR1cmluZyBhbGwgb3BlcmF0aW9ucyBleGNlcHQgVFggcGFja2V0CisJICogICAgICAgcHJvY2Vzc2luZy4KKwkgKgorCSAqIHR4X2xvY2s6IEhlbGQgZHVyaW5nIHRnM19zdGFydF94bWl0eyxfNGdidWd9IGFuZCB0ZzNfdHgKKwkgKgorCSAqIElmIHlvdSB3YW50IHRvIHNodXQgdXAgYWxsIGFzeW5jaHJvbm91cyBwcm9jZXNzaW5nIHlvdSBtdXN0CisJICogYWNxdWlyZSBib3RoIGxvY2tzLCAnbG9jaycgdGFrZW4gYmVmb3JlICd0eF9sb2NrJy4gIElSUXMgbXVzdAorCSAqIGJlIGRpc2FibGVkIHRvIHRha2UgJ2xvY2snIGJ1dCBvbmx5IHNvZnRpcnEgZGlzYWJsaW5nIGlzCisJICogbmVjZXNzYXJ5IGZvciBhY3F1aXNpdGlvbiBvZiAndHhfbG9jaycuCisJICovCisJc3BpbmxvY2tfdAkJCWxvY2s7CisJc3BpbmxvY2tfdAkJCWluZGlyZWN0X2xvY2s7CisKKwl2b2lkIF9faW9tZW0JCQkqcmVnczsKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKmRldjsKKwlzdHJ1Y3QgcGNpX2RldgkJCSpwZGV2OworCisJc3RydWN0IHRnM19od19zdGF0dXMJCSpod19zdGF0dXM7CisJZG1hX2FkZHJfdAkJCXN0YXR1c19tYXBwaW5nOworCisJdTMyCQkJCW1zZ19lbmFibGU7CisKKwkvKiBiZWdpbiAidHggdGhyZWFkIiBjYWNoZWxpbmUgc2VjdGlvbiAqLworCXUzMgkJCQl0eF9wcm9kOworCXUzMgkJCQl0eF9jb25zOworCXUzMgkJCQl0eF9wZW5kaW5nOworCisJc3BpbmxvY2tfdAkJCXR4X2xvY2s7CisKKwlzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjCSp0eF9yaW5nOworCXN0cnVjdCB0eF9yaW5nX2luZm8JCSp0eF9idWZmZXJzOworCWRtYV9hZGRyX3QJCQl0eF9kZXNjX21hcHBpbmc7CisKKwkvKiBiZWdpbiAicnggdGhyZWFkIiBjYWNoZWxpbmUgc2VjdGlvbiAqLworCXUzMgkJCQlyeF9yY2JfcHRyOworCXUzMgkJCQlyeF9zdGRfcHRyOworCXUzMgkJCQlyeF9qdW1ib19wdHI7CisJdTMyCQkJCXJ4X3BlbmRpbmc7CisJdTMyCQkJCXJ4X2p1bWJvX3BlbmRpbmc7CisjaWYgVEczX1ZMQU5fVEFHX1VTRUQKKwlzdHJ1Y3Qgdmxhbl9ncm91cAkJKnZsZ3JwOworI2VuZGlmCisKKwlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjCSpyeF9zdGQ7CisJc3RydWN0IHJpbmdfaW5mbwkJKnJ4X3N0ZF9idWZmZXJzOworCWRtYV9hZGRyX3QJCQlyeF9zdGRfbWFwcGluZzsKKworCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MJKnJ4X2p1bWJvOworCXN0cnVjdCByaW5nX2luZm8JCSpyeF9qdW1ib19idWZmZXJzOworCWRtYV9hZGRyX3QJCQlyeF9qdW1ib19tYXBwaW5nOworCisJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYwkqcnhfcmNiOworCWRtYV9hZGRyX3QJCQlyeF9yY2JfbWFwcGluZzsKKworCS8qIGJlZ2luICJldmVyeXRoaW5nIGVsc2UiIGNhY2hlbGluZShzKSBzZWN0aW9uICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJCW5ldF9zdGF0czsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwkJbmV0X3N0YXRzX3ByZXY7CisJc3RydWN0IHRnM19ldGh0b29sX3N0YXRzCWVzdGF0czsKKwlzdHJ1Y3QgdGczX2V0aHRvb2xfc3RhdHMJZXN0YXRzX3ByZXY7CisKKwl1bnNpZ25lZCBsb25nCQkJcGh5X2NyY19lcnJvcnM7CisKKwl1MzIJCQkJcnhfb2Zmc2V0OworCXUzMgkJCQl0ZzNfZmxhZ3M7CisjZGVmaW5lIFRHM19GTEFHX1RYRF9NQk9YX0hXQlVHCQkweDAwMDAwMDAyCisjZGVmaW5lIFRHM19GTEFHX1JYX0NIRUNLU1VNUwkJMHgwMDAwMDAwNAorI2RlZmluZSBURzNfRkxBR19VU0VfTElOS0NIR19SRUcJMHgwMDAwMDAwOAorI2RlZmluZSBURzNfRkxBR19VU0VfTUlfSU5URVJSVVBUCTB4MDAwMDAwMTAKKyNkZWZpbmUgVEczX0ZMQUdfRU5BQkxFX0FTRgkJMHgwMDAwMDAyMAorI2RlZmluZSBURzNfRkxBR181NzAxX1JFR19XUklURV9CVUcJMHgwMDAwMDA0MAorI2RlZmluZSBURzNfRkxBR19QT0xMX1NFUkRFUwkJMHgwMDAwMDA4MAorI2lmIGRlZmluZWQoQ09ORklHX1g4NikKKyNkZWZpbmUgVEczX0ZMQUdfTUJPWF9XUklURV9SRU9SREVSCTB4MDAwMDAxMDAKKyNlbHNlCisjZGVmaW5lIFRHM19GTEFHX01CT1hfV1JJVEVfUkVPUkRFUgkwCS8qIGRpc2FibGVzIGNvZGUgdG9vICovCisjZW5kaWYKKyNkZWZpbmUgVEczX0ZMQUdfUENJWF9UQVJHRVRfSFdCVUcJMHgwMDAwMDIwMAorI2RlZmluZSBURzNfRkxBR19XT0xfU1BFRURfMTAwTUIJMHgwMDAwMDQwMAorI2RlZmluZSBURzNfRkxBR19XT0xfRU5BQkxFCQkweDAwMDAwODAwCisjZGVmaW5lIFRHM19GTEFHX0VFUFJPTV9XUklURV9QUk9UCTB4MDAwMDEwMDAKKyNkZWZpbmUgVEczX0ZMQUdfTlZSQU0JCQkweDAwMDAyMDAwCisjZGVmaW5lIFRHM19GTEFHX05WUkFNX0JVRkZFUkVECQkweDAwMDA0MDAwCisjZGVmaW5lIFRHM19GTEFHX1JYX1BBVVNFCQkweDAwMDA4MDAwCisjZGVmaW5lIFRHM19GTEFHX1RYX1BBVVNFCQkweDAwMDEwMDAwCisjZGVmaW5lIFRHM19GTEFHX1BDSVhfTU9ERQkJMHgwMDAyMDAwMAorI2RlZmluZSBURzNfRkxBR19QQ0lfSElHSF9TUEVFRAkJMHgwMDA0MDAwMAorI2RlZmluZSBURzNfRkxBR19QQ0lfMzJCSVQJCTB4MDAwODAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfTk9fVFhfUFNFVURPX0NTVU0JMHgwMDEwMDAwMAorI2RlZmluZSBURzNfRkxBR19OT19SWF9QU0VVRE9fQ1NVTQkweDAwMjAwMDAwCisjZGVmaW5lIFRHM19GTEFHX1NFUkRFU19XT0xfQ0FQCQkweDAwNDAwMDAwCisjZGVmaW5lIFRHM19GTEFHX0pVTUJPX0VOQUJMRQkJMHgwMDgwMDAwMAorI2RlZmluZSBURzNfRkxBR18xMF8xMDBfT05MWQkJMHgwMTAwMDAwMAorI2RlZmluZSBURzNfRkxBR19QQVVTRV9BVVRPTkVHCQkweDAyMDAwMDAwCisjZGVmaW5lIFRHM19GTEFHX0JST0tFTl9DSEVDS1NVTVMJMHgxMDAwMDAwMAorI2RlZmluZSBURzNfRkxBR19HT1RfU0VSREVTX0ZMT1dDVEwJMHgyMDAwMDAwMAorI2RlZmluZSBURzNfRkxBR19TUExJVF9NT0RFCQkweDQwMDAwMDAwCisjZGVmaW5lIFRHM19GTEFHX0lOSVRfQ09NUExFVEUJCTB4ODAwMDAwMDAKKwl1MzIJCQkJdGczX2ZsYWdzMjsKKyNkZWZpbmUgVEczX0ZMRzJfUkVTVEFSVF9USU1FUgkJMHgwMDAwMDAwMQorI2RlZmluZSBURzNfRkxHMl9TVU5fNTcwWAkJMHgwMDAwMDAwMgorI2RlZmluZSBURzNfRkxHMl9OT19FVEhfV0lSRV9TUEVFRAkweDAwMDAwMDA0CisjZGVmaW5lIFRHM19GTEcyX0lTXzU3ODgJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVEczX0ZMRzJfTUFYX1JYUEVORF82NAkJMHgwMDAwMDAxMAorI2RlZmluZSBURzNfRkxHMl9UU09fQ0FQQUJMRQkJMHgwMDAwMDAyMAorI2RlZmluZSBURzNfRkxHMl9QSFlfQURDX0JVRwkJMHgwMDAwMDA0MAorI2RlZmluZSBURzNfRkxHMl9QSFlfNTcwNF9BMF9CVUcJMHgwMDAwMDA4MAorI2RlZmluZSBURzNfRkxHMl9QSFlfQkVSX0JVRwkJMHgwMDAwMDEwMAorI2RlZmluZSBURzNfRkxHMl9QQ0lfRVhQUkVTUwkJMHgwMDAwMDIwMAorI2RlZmluZSBURzNfRkxHMl9BU0ZfTkVXX0hBTkRTSEFLRQkweDAwMDAwNDAwCisjZGVmaW5lIFRHM19GTEcyX0hXX0FVVE9ORUcJCTB4MDAwMDA4MDAKKyNkZWZpbmUgVEczX0ZMRzJfUEhZX0pVU1RfSU5JVFRFRAkweDAwMDAxMDAwCisjZGVmaW5lIFRHM19GTEcyX1BIWV9TRVJERVMJCTB4MDAwMDIwMDAKKyNkZWZpbmUgVEczX0ZMRzJfQ0FQQUNJVElWRV9DT1VQTElORwkweDAwMDA0MDAwCisjZGVmaW5lIFRHM19GTEcyX0ZMQVNICQkJMHgwMDAwODAwMAorI2RlZmluZSBURzNfRkxHMl9IV19UU08JCQkweDAwMDEwMDAwCisjZGVmaW5lIFRHM19GTEcyX1NFUkRFU19QUkVFTVBIQVNJUwkweDAwMDIwMDAwCisjZGVmaW5lIFRHM19GTEcyXzU3MDVfUExVUwkJMHgwMDA0MDAwMAorCisJdTMyCQkJCXNwbGl0X21vZGVfbWF4X3JlcXM7CisjZGVmaW5lIFNQTElUX01PREVfNTcwNF9NQVhfUkVRCQkzCisKKwlzdHJ1Y3QgdGltZXJfbGlzdAkJdGltZXI7CisJdTE2CQkJCXRpbWVyX2NvdW50ZXI7CisJdTE2CQkJCXRpbWVyX211bHRpcGxpZXI7CisJdTMyCQkJCXRpbWVyX29mZnNldDsKKwl1MTYJCQkJYXNmX2NvdW50ZXI7CisJdTE2CQkJCWFzZl9tdWx0aXBsaWVyOworCisJc3RydWN0IHRnM19saW5rX2NvbmZpZwkJbGlua19jb25maWc7CisJc3RydWN0IHRnM19idWZtZ3JfY29uZmlnCWJ1Zm1ncl9jb25maWc7CisKKwkvKiBjYWNoZSBoL3cgdmFsdWVzLCBvZnRlbiBwYXNzZWQgc3RyYWlnaHQgdG8gaC93ICovCisJdTMyCQkJCXJ4X21vZGU7CisJdTMyCQkJCXR4X21vZGU7CisJdTMyCQkJCW1hY19tb2RlOworCXUzMgkJCQltaV9tb2RlOworCXUzMgkJCQltaXNjX2hvc3RfY3RybDsKKwl1MzIJCQkJZ3JjX21vZGU7CisJdTMyCQkJCWdyY19sb2NhbF9jdHJsOworCXUzMgkJCQlkbWFfcndjdHJsOworCXUzMgkJCQljb2FsZXNjZV9tb2RlOworCisJLyogUENJIGJsb2NrICovCisJdTE2CQkJCXBjaV9jaGlwX3Jldl9pZDsKKwl1OAkJCQlwY2lfY2FjaGVsaW5lX3N6OworCXU4CQkJCXBjaV9sYXRfdGltZXI7CisJdTgJCQkJcGNpX2hkcl90eXBlOworCXU4CQkJCXBjaV9iaXN0OworCisJaW50CQkJCXBtX2NhcDsKKworCS8qIFBIWSBpbmZvICovCisJdTMyCQkJCXBoeV9pZDsKKyNkZWZpbmUgUEhZX0lEX01BU0sJCQkweGZmZmZmZmYwCisjZGVmaW5lIFBIWV9JRF9CQ001NDAwCQkJMHg2MDAwODA0MAorI2RlZmluZSBQSFlfSURfQkNNNTQwMQkJCTB4NjAwMDgwNTAKKyNkZWZpbmUgUEhZX0lEX0JDTTU0MTEJCQkweDYwMDA4MDcwCisjZGVmaW5lIFBIWV9JRF9CQ001NzAxCQkJMHg2MDAwODExMAorI2RlZmluZSBQSFlfSURfQkNNNTcwMwkJCTB4NjAwMDgxNjAKKyNkZWZpbmUgUEhZX0lEX0JDTTU3MDQJCQkweDYwMDA4MTkwCisjZGVmaW5lIFBIWV9JRF9CQ001NzA1CQkJMHg2MDAwODFhMAorI2RlZmluZSBQSFlfSURfQkNNNTc1MAkJCTB4NjAwMDgxODAKKyNkZWZpbmUgUEhZX0lEX0JDTTgwMDIJCQkweDYwMDEwMTQwCisjZGVmaW5lIFBIWV9JRF9JTlZBTElECQkJMHhmZmZmZmZmZgorI2RlZmluZSBQSFlfSURfUkVWX01BU0sJCQkweDAwMDAwMDBmCisjZGVmaW5lIFBIWV9SRVZfQkNNNTQwMV9CMAkJMHgxCisjZGVmaW5lIFBIWV9SRVZfQkNNNTQwMV9CMgkJMHgzCisjZGVmaW5lIFBIWV9SRVZfQkNNNTQwMV9DMAkJMHg2CisjZGVmaW5lIFBIWV9SRVZfQkNNNTQxMV9YMAkJMHgxIC8qIEZvdW5kIG9uIE5ldGdlYXIgR0EzMDJUICovCisKKwl1MzIJCQkJbGVkX2N0cmw7CisKKwljaGFyCQkJCWJvYXJkX3BhcnRfbnVtYmVyWzI0XTsKKwl1MzIJCQkJbmljX3NyYW1fZGF0YV9jZmc7CisJdTMyCQkJCXBjaV9jbG9ja19jdHJsOworCXN0cnVjdCBwY2lfZGV2CQkJKnBkZXZfcGVlcjsKKworCS8qIFRoaXMgbWFjcm8gYXNzdW1lcyB0aGUgcGFzc2VkIFBIWSBJRCBpcyBhbHJlYWR5IG1hc2tlZAorCSAqIHdpdGggUEhZX0lEX01BU0suCisJICovCisjZGVmaW5lIEtOT1dOX1BIWV9JRChYKQkJXAorCSgoWCkgPT0gUEhZX0lEX0JDTTU0MDAgfHwgKFgpID09IFBIWV9JRF9CQ001NDAxIHx8IFwKKwkgKFgpID09IFBIWV9JRF9CQ001NDExIHx8IChYKSA9PSBQSFlfSURfQkNNNTcwMSB8fCBcCisJIChYKSA9PSBQSFlfSURfQkNNNTcwMyB8fCAoWCkgPT0gUEhZX0lEX0JDTTU3MDQgfHwgXAorCSAoWCkgPT0gUEhZX0lEX0JDTTU3MDUgfHwgKFgpID09IFBIWV9JRF9CQ001NzUwIHx8IFwKKwkgKFgpID09IFBIWV9JRF9CQ004MDAyKQorCisJc3RydWN0IHRnM19od19zdGF0cwkJKmh3X3N0YXRzOworCWRtYV9hZGRyX3QJCQlzdGF0c19tYXBwaW5nOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJcmVzZXRfdGFzazsKKworCXUzMgkJCQludnJhbV9zaXplOworCXUzMgkJCQludnJhbV9wYWdlc2l6ZTsKKwl1MzIJCQkJbnZyYW1famVkZWNudW07CisKKyNkZWZpbmUgSkVERUNfQVRNRUwJCQkweDFmCisjZGVmaW5lIEpFREVDX1NUCQkJMHgyMAorI2RlZmluZSBKRURFQ19TQUlGVU4JCQkweDRmCisjZGVmaW5lIEpFREVDX1NTVAkJCTB4YmYKKworI2RlZmluZSBBVE1FTF9BVDI0QzY0X0NISVBfU0laRQkJKDY0ICogMTAyNCkKKyNkZWZpbmUgQVRNRUxfQVQyNEM2NF9QQUdFX1NJWkUJCSgzMikKKworI2RlZmluZSBBVE1FTF9BVDI0QzUxMl9DSElQX1NJWkUJKDUxMiAqIDEwMjQpCisjZGVmaW5lIEFUTUVMX0FUMjRDNTEyX1BBR0VfU0laRQkoMTI4KQorCisjZGVmaW5lIEFUTUVMX0FUNDVEQjBYMUJfUEFHRV9QT1MJOQorI2RlZmluZSBBVE1FTF9BVDQ1REIwWDFCX1BBR0VfU0laRQkyNjQKKworI2RlZmluZSBBVE1FTF9BVDI1RjUxMl9QQUdFX1NJWkUJMjU2CisKKyNkZWZpbmUgU1RfTTQ1UEVYMF9QQUdFX1NJWkUJCTI1NgorCisjZGVmaW5lIFNBSUZVTl9TQTI1RjBYWF9QQUdFX1NJWkUJMjU2CisKKyNkZWZpbmUgU1NUXzI1VkYwWDBfUEFHRV9TSVpFCQk0MDk4CisKKworfTsKKworI2VuZGlmIC8qICEoX1QzX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90bGFuLmMgYi9kcml2ZXJzL25ldC90bGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmZmE2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3RsYW4uYwpAQCAtMCwwICsxLDMzMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIExpbnV4IFRodW5kZXJMQU4gRHJpdmVyCisgKgorICogIHRsYW4uYworICogIGJ5IEphbWVzIEJhbmtzCisgKgorICogIChDKSAxOTk3LTE5OTggQ2FsZGVyYSwgSW5jLgorICogIChDKSAxOTk4IEphbWVzIEJhbmtzCisgKiAgKEMpIDE5OTktMjAwMSBUb3JiZW4gTWF0aGlhc2VuCisgKiAgKEMpIDIwMDIgU2FtdWVsIENoZXNzbWFuCisgKgorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqKiBUaGlzIGZpbGUgaXMgYmVzdCB2aWV3ZWQvZWRpdGVkIHdpdGggY29sdW1ucz49MTMyLgorICoKKyAqKiBVc2VmdWwgKGlmIG5vdCByZXF1aXJlZCkgcmVhZGluZzoKKyAqCisgKgkJVGV4YXMgSW5zdHJ1bWVudHMsIFRodW5kZXJMQU4gUHJvZ3JhbW1lcidzIEd1aWRlLAorICoJCQlUSSBMaXRlcmF0dXJlIE51bWJlciBTUFdVMDEzQQorICoJCQlhdmFpbGFibGUgaW4gUERGIGZvcm1hdCBmcm9tIHd3dy50aS5jb20KKyAqCQlMZXZlbCBPbmUsIExYVDkwMSBhbmQgTFhUOTcwIERhdGEgU2hlZXRzCisgKgkJCWF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IGZyb20gd3d3LmxldmVsMS5jb20KKyAqCQlOYXRpb25hbCBTZW1pY29uZHVjdG9yLCBEUDgzODQwQSBEYXRhIFNoZWV0CisgKgkJCWF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IGZyb20gd3d3Lm5hdGlvbmFsLmNvbQorICoJCU1pY3JvY2hpcCBUZWNobm9sb2d5LCAyNEMwMUEvMDJBLzA0QSBEYXRhIFNoZWV0CisgKgkJCWF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IGZyb20gd3d3Lm1pY3JvY2hpcC5jb20KKyAqCisgKiBDaGFuZ2UgSGlzdG9yeQorICoKKyAqCVRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHNjby5jb20+OglUTGFuX1BjaVByb2JlKCkgbm93IHVzZXMKKyAqCQkJCQkJbmV3IFBDSSBCSU9TIGludGVyZmFjZS4KKyAqCUFsYW4gQ294CTxhbGFuQHJlZGhhdC5jb20+OglGaXhlZCB0aGUgb3V0IG9mIG1lbW9yeQorICoJCQkJCQloYW5kbGluZy4KKyAqICAgICAgCisgKglUb3JiZW4gTWF0aGlhc2VuIDx0b3JiZW4ubWF0aGlhc2VuQGNvbXBhcS5jb20+IE5ldyBNYWludGFpbmVyIQorICoKKyAqCXYxLjEgRGVjIDIwLCAxOTk5ICAgIC0gUmVtb3ZlZCBsaW51eCB2ZXJzaW9uIGNoZWNraW5nCisgKgkJCSAgICAgICBQYXRjaCBmcm9tIFRpZ3JhbiBBaXZhemlhbi4gCisgKgkJCSAgICAgLSB2MS4xIGluY2x1ZGVzIEFsYW4ncyBTTVAgdXBkYXRlcy4KKyAqCQkJICAgICAtIFdlIHN0aWxsIGhhdmUgcHJvYmxlbXMgb24gU01QIHRob3VnaCwKKyAqCQkJICAgICAgIGJ1dCBJJ20gbG9va2luZyBpbnRvIHRoYXQuIAorICoJCQkKKyAqCXYxLjIgSmFuIDAyLCAyMDAwICAgIC0gSG9wZWZ1bGx5IGZpeGVkIHRoZSBTTVAgZGVhZGxvY2suCisgKgkJCSAgICAgLSBSZW1vdmVkIGRlcGVuZGVuY3kgb2YgSFogYmVpbmcgMTAwLgorICoJCQkgICAgIC0gV2Ugbm93IGFsbG93IGhpZ2hlciBwcmlvcml0eSB0aW1lcnMgdG8gCisgKgkJCSAgICAgICBvdmVyd3JpdGUgdGltZXJzIGxpa2UgVExBTl9USU1FUl9BQ1RJVklUWQorICoJCQkgICAgICAgUGF0Y2ggZnJvbSBKb2huIENhZ2xlIDxqb2huLmNhZ2xlQGNvbXBhcS5jb20+LgorICoJCQkgICAgIC0gRml4ZWQgYSBmZXcgY29tcGlsZXIgd2FybmluZ3MuCisgKgorICoJdjEuMyBGZWIgMDQsIDIwMDAgICAgLSBGaXhlZCB0aGUgcmVtYWluaW5nIEhaIGlzc3Vlcy4KKyAqCQkJICAgICAtIFJlbW92ZWQgY2FsbCB0byBwY2lfcHJlc2VudCgpLiAKKyAqCQkJICAgICAtIFJlbW92ZWQgU0FfSU5URVJSVVBUIGZsYWcgZnJvbSBpcnEgaGFuZGxlci4KKyAqCQkJICAgICAtIEFkZGVkIF9faW5pdCBhbmQgX19pbml0ZGF0YSB0byByZWR1Y2UgcmVzaXNkZW50IAorICoJCQkgICAgICAgY29kZSBzaXplLgorICoJCQkgICAgIC0gRHJpdmVyIG5vdyB1c2VzIG1vZHVsZV9pbml0L21vZHVsZV9leGl0LgorICoJCQkgICAgIC0gUmV3cm90ZSBpbml0X21vZHVsZSBhbmQgdGxhbl9wcm9iZSB0bworICoJCQkgICAgICAgc2hhcmUgYSBsb3QgbW9yZSBjb2RlLiBXZSBub3cgdXNlIHRsYW5fcHJvYmUKKyAqCQkJICAgICAgIHdpdGggYnVpbHRpbiBhbmQgbW9kdWxlIGRyaXZlci4KKyAqCQkJICAgICAtIERyaXZlciBwb3J0ZWQgdG8gbmV3IG5ldCBBUEkuIAorICoJCQkgICAgIC0gdGxhbi50eHQgaGFzIGJlZW4gcmV3b3JrZWQgdG8gcmVmbGVjdCBjdXJyZW50IAorICoJCQkgICAgICAgZHJpdmVyIChhbG1vc3QpCisgKgkJCSAgICAgLSBPdGhlciBtaW5vciBzdHVmZgorICoKKyAqCXYxLjQgRmViIDEwLCAyMDAwICAgIC0gVXBkYXRlZCB3aXRoIG1vcmUgY2hhbmdlcyByZXF1aXJlZCBhZnRlciBEYXZlJ3MKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yayBjbGVhbnVwIGluIDIuMy40M3ByZTcgKFRpZ3JhbiAmIG15c2VsZikKKyAqCSAgICAgICAgICAgICAgICAgICAgIC0gTWlub3Igc3R1ZmYuCisgKgorICoJdjEuNSBNYXJjaCAyMiwgMjAwMCAgLSBGaXhlZCBhbm90aGVyIHRpbWVyIGJ1ZyB0aGF0IHdvdWxkIGhhbmcgdGhlIGRyaXZlcgorICoJCQkgICAgICAgaWYgbm8gY2FibGUvbGluayB3ZXJlIHByZXNlbnQuCisgKgkJCSAgICAgLSBDb3NtZXRpYyBjaGFuZ2VzLgorICoJCQkgICAgIC0gVE9ETzogUG9ydCBjb21wbGV0ZWx5IHRvIG5ldyBQQ0kvRE1BIEFQSQorICoJCQkgICAgIAkgICAgIEF1dG8tTmVnIGZhbGxiYWNrLgorICoKKyAqIAl2MS42IEFwcmlsIDA0LCAyMDAwICAtIEZpeGVkIGRyaXZlciBzdXBwb3J0IGZvciBrZXJuZWwtcGFyYW1ldGVycy4gSGF2ZW4ndAorICogCQkJICAgICAgIHRlc3RlZCBpdCB0aG91Z2gsIGFzIHRoZSBrZXJuZWwgc3VwcG9ydCBpcyBjdXJyZW50bHkgCisgKiAJCQkgICAgICAgYnJva2VuICgyLjMuOTlwNHAzKS4KKyAqIAkJCSAgICAgLSBVcGRhdGVkIHRsYW4udHh0IGFjY29yZGluZ2x5LgorICogCQkJICAgICAtIEFkanVzdGVkIG1pbmltdW0vbWF4aW11bSBmcmFtZSBsZW5ndGguCisgKiAJCQkgICAgIC0gVGhlcmUgaXMgbm93IGEgVExBTiB3ZWJzaXRlIHVwIGF0IAorICogCQkJICAgICAgIGh0dHA6Ly90bGFuLmtlcm5lbC5kaworICoKKyAqIAl2MS43IEFwcmlsIDA3LCAyMDAwICAtIFN0YXJ0ZWQgdG8gaW1wbGVtZW50IGN1c3RvbSBpb2N0bHMuIERyaXZlciBub3cKKyAqIAkJCSAgICAgICByZXBvcnRzIFBIWSBpbmZvcm1hdGlvbiB3aGVuIHVzZWQgd2l0aCBEb25hbGQKKyAqIAkJCSAgICAgICBCZWNrZXJzIHVzZXJzcGFjZSBNSUkgZGlhZ25vc3RpY3MgdXRpbGl0eS4KKyAqCisgKiAJdjEuOCBBcHJpbCAyMywgMjAwMCAgLSBGaXhlZCBzdXBwb3J0IGZvciBmb3JjZWQgc3BlZWQvZHVwbGV4IHNldHRpbmdzLgorICogCQkJICAgICAtIEFkZGVkIGxpbmsgaW5mb3JtYXRpb24gdG8gQXV0by1OZWcgYW5kIGZvcmNlZAorICogCQkJICAgICAgIG1vZGVzLiBXaGVuIE5JQyBvcGVyYXRlcyB3aXRoIGF1dG8tbmVnIHRoZSBkcml2ZXIKKyAqIAkJCSAgICAgICB3aWxsIHJlcG9ydCBMaW5rIHNwZWVkICYgZHVwbGV4IG1vZGVzIGFzIHdlbGwgYXMKKyAqIAkJCSAgICAgICBsaW5rIHBhcnRuZXIgYWJpbGl0aWVzLiBXaGVuIGZvcmNlZCBsaW5rIGlzIHVzZWQsCisgKiAJCQkgICAgICAgdGhlIGRyaXZlciB3aWxsIHJlcG9ydCBzdGF0dXMgb2YgdGhlIGVzdGFibGlzaGVkCisgKiAJCQkgICAgICAgbGluay4KKyAqIAkJCSAgICAgICBQbGVhc2UgcmVhZCB0bGFuLnR4dCBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gCisgKiAJCQkgICAgIC0gUmVtb3ZlZCBjYWxsIHRvIGNoZWNrX3JlZ2lvbigpLCBhbmQgdXNlZCAKKyAqIAkJCSAgICAgICByZXR1cm4gdmFsdWUgb2YgcmVxdWVzdF9yZWdpb24oKSBpbnN0ZWFkLgorICoJCisgKgl2MS44YSBNYXkgMjgsIDIwMDAgICAtIE1pbm9yIHVwZGF0ZXMuCisgKgorICoJdjEuOSBKdWx5IDI1LCAyMDAwICAgLSBGaXhlZCBhIGZldyByZW1haW5pbmcgRnVsbC1EdXBsZXggaXNzdWVzLgorICoJICAgICAgICAgICAgICAgICAgICAgLSBVcGRhdGVkIHdpdGggdGltZXIgZml4ZXMgZnJvbSBBbmRyZXcgTW9ydG9uLgorICoJICAgICAgICAgICAgICAgICAgICAgLSBGaXhlZCBtb2R1bGUgcmFjZSBpbiBUTGFuX09wZW4uCisgKgkgICAgICAgICAgICAgICAgICAgICAtIEFkZGVkIHJvdXRpbmUgdG8gbW9uaXRvciBQSFkgc3RhdHVzLgorICoJICAgICAgICAgICAgICAgICAgICAgLSBBZGRlZCBhY3Rpdml0eSBsZWQgc3VwcG9ydCBmb3IgUHJvbGlhbnQgZGV2aWNlcy4KKyAqCisgKgl2MS4xMCBBdWcgMzAsIDIwMDAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIEVJU0EgYmFzZWQgdGxhbiBjb250cm9sbGVycyAKKyAqCQkJICAgICAgIGxpa2UgdGhlIENvbXBhcSBOZXRGbGV4My9FLiAKKyAqCQkJICAgICAtIFJld3JvdGUgdGxhbl9wcm9iZSB0byBiZXR0ZXIgaGFuZGxlIG11bHRpcGxlCisgKgkJCSAgICAgICBidXMgcHJvYmVzLiBQcm9iaW5nIGFuZCBkZXZpY2Ugc2V0dXAgaXMgbm93CisgKgkJCSAgICAgICBkb25lIHRocm91Z2ggVExhbl9Qcm9iZSBhbmQgVExhbl9pbml0X29uZS4gQWN0dWFsCisgKgkJCSAgICAgICBoYXJkd2FyZSBwcm9iZSBpcyBkb25lIHdpdGgga2VybmVsIEFQSSBhbmQgCisgKgkJCSAgICAgICBUTGFuX0Vpc2FQcm9iZS4KKyAqCQkJICAgICAtIEFkanVzdGVkIGRlYnVnIGluZm9ybWF0aW9uIGZvciBwcm9iaW5nLgorICoJCQkgICAgIC0gRml4ZWQgYnVnIHRoYXQgd291bGQgY2F1c2UgZ2VuZXJhbCBkZWJ1ZyBpbmZvcm1hdGlvbiAKKyAqCQkJICAgICAgIHRvIGJlIHByaW50ZWQgYWZ0ZXIgZHJpdmVyIHJlbW92YWwuIAorICoJCQkgICAgIC0gQWRkZWQgdHJhbnNtaXQgdGltZW91dCBoYW5kbGluZy4KKyAqCQkJICAgICAtIEZpeGVkIE9PTSByZXR1cm4gdmFsdWVzIGluIHRsYW5fcHJvYmUuIAorICoJCQkgICAgIC0gRml4ZWQgcG9zc2libGUgbWVtIGxlYWsgaW4gdGxhbl9leGl0IAorICoJCQkgICAgICAgKG5vdyB0bGFuX3JlbW92ZV9vbmUpLgorICoJCQkgICAgIC0gRml4ZWQgdGltZXIgYnVnIGluIFRMYW5fcGh5TW9uaXRvci4KKyAqCQkJICAgICAtIFRoaXMgZHJpdmVyIHZlcnNpb24gaXMgYWxwaGEgcXVhbGl0eSwgcGxlYXNlCisgKgkJCSAgICAgICBzZW5kIG1lIGFueSBidWcgaXNzdWVzIHlvdSBtYXkgZW5jb3VudGVyLgorICoKKyAqCXYxLjExIEF1ZyAzMSwgMjAwMCAgIC0gRG8gbm90IHRyeSB0byByZWdpc3RlciBpcnEgMCBpZiBubyBpcnEgbGluZSB3YXMgCisgKgkJCSAgICAgICBzZXQgZm9yIEVJU0EgY2FyZHMuCisgKgkJCSAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBOZXRGbGV4My9FIHdpdGggbmliYmxlLXJhdGUKKyAqCQkJICAgICAgIDEwQmFzZS1UIFBIWS4gVGhpcyBpcyB1bnRlc3RldCBhcyBJIGhhdmVuJ3QgZ290CisgKgkJCSAgICAgICBvbmUgb2YgdGhlc2UgY2FyZHMuCisgKgkJCSAgICAgLSBGaXhlZCB0aW1lciBiZWluZyBhZGRlZCB0d2ljZS4KKyAqCQkJICAgICAtIERpc2FibGVkIFBoeU1vbml0b3JpbmcgYnkgZGVmYXVsdCBhcyB0aGlzIGlzCisgKgkJCSAgICAgICB3b3JrIGluIHByb2dyZXNzLiBEZWZpbmUgTU9OSVRPUiB0byBlbmFibGUgaXQuCisgKgkJCSAgICAgLSBOb3cgd2UgZG9uJ3QgZGlzcGxheSBsaW5rIGluZm8gd2l0aCBQSFlzIHRoYXQKKyAqCQkJICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCBpdCAobGV2ZWwxKS4KKyAqCQkJICAgICAtIEluY3Jlc2VkIHR4X3RpbWVvdXQgYmVhY3VzZSBvZiBhdXRvLW5lZy4KKyAqCQkJICAgICAtIEFkanVzdGVkIHRpbWVycyBmb3IgZm9yY2VkIHNwZWVkcy4KKyAqCisgKgl2MS4xMiBPY3QgMTIsIDIwMDAgICAtIE1pbm9yIGZpeGVzIChtZW1sZWFrLCBpbml0LCBldGMuKQorICoKKyAqIAl2MS4xMyBOb3YgMjgsIDIwMDAgICAtIFN0b3AgZmxvb2RpbmcgY29uc29sZSB3aXRoIGF1dG8tbmVnIGlzc3VlcworICogCQkJICAgICAgIHdoZW4gbGluayBjYW4ndCBiZSBlc3RhYmxpc2hlZC4KKyAqCQkJICAgICAtIEFkZGVkIHRoZSBiYnVmIG9wdGlvbiBhcyBhIGtlcm5lbCBwYXJhbWV0ZXIuCisgKgkJCSAgICAgLSBGaXhlZCBpb2FkZHIgcHJvYmUgYnVnLgorICoJCQkgICAgIC0gRml4ZWQgc3R1cGlkIGRlYWRsb2NrIHdpdGggTUlJIGludGVycnVwdHMuCisgKgkJCSAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBzcGVlZC9kdXBsZXggc2VsZWN0aW9uIHdpdGggCisgKgkJCSAgICAgICBtdWx0aXBsZSBuaWNzLgorICoJCQkgICAgIC0gQWRkZWQgcGFydGx5IGZpeCBmb3IgVFggQ2hhbm5lbCBsb2NrdXAgd2l0aAorICoJCQkgICAgICAgVExBTiB2MS4wIHNpbGljb24uIFRoaXMgbmVlZHMgdG8gYmUgaW52ZXN0aWdhdGVkCisgKgkJCSAgICAgICBmdXJ0aGVyLgorICoKKyAqIAl2MS4xNCBEZWMgMTYsIDIwMDAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIHNlcnZpY2luZyBtdWx0aXBsZSBmcmFtZXMgcGVyLgorICogCQkJICAgICAgIGludGVycnVwdC4gVGhhbmtzIGdvZXMgdG8KKyAqIAkJCSAgICAgICBBZGFtIEtleXMgPGFkYW1AdGkuY29tPgorICogCQkJICAgICAgIERlbmlzIEJlYXVkb2luIDxkYmVhdWRvaW5AdGkuY29tPgorICogCQkJICAgICAgIGZvciBwcm92aWRpbmcgdGhlIHBhdGNoLgorICogCQkJICAgICAtIEZpeGVkIGF1dG8tbmVnIG91dHB1dCB3aGVuIHVzaW5nIG11bHRpcGxlCisgKiAJCQkgICAgICAgYWRhcHRlcnMuCisgKiAJCQkgICAgIC0gQ29udmVydGVkIHRvIHVzZSBuZXcgdGFza3EgaW50ZXJmYWNlLgorICoKKyAqIAl2MS4xNGEgSmFuIDYsIDIwMDEgICAtIE1pbm9yIGFkanVzdG1lbnRzIChzcGlubG9ja3MsIGV0Yy4pCisgKgorICoJU2FtdWVsIENoZXNzbWFuIDxjaGVzc21hbkB0dXgub3JnPiBOZXcgTWFpbnRhaW5lciEKKyAqCisgKgl2MS4xNSBBcHIgNCwgMjAwMiAgICAtIENvcnJlY3Qgb3BlcmF0aW9uIHdoZW4gYXVpPTEgdG8gYmUKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgMTBUIGhhbGYgZHVwbGV4IG5vIGxvb3BiYWNrCisgKgkgICAgICAgICAgICAgICAgICAgICAgIFRoYW5rcyB0byBHdW5uYXIgRWlrbWFuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9laXNhLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisKKyNpbmNsdWRlICJ0bGFuLmgiCisKK3R5cGVkZWYgdTMyIChUTGFuSW50VmVjdG9yRnVuYykoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOworCisKKy8qIEZvciByZW1vdmluZyBFSVNBIGRldmljZXMgKi8KK3N0YXRpYwlzdHJ1Y3QgbmV0X2RldmljZQkqVExhbl9FaXNhX0RldmljZXM7CisKK3N0YXRpYwlpbnQJCVRMYW5EZXZpY2VzSW5zdGFsbGVkOworCisvKiBTZXQgc3BlZWQsIGR1cGxleCBhbmQgYXVpIHNldHRpbmdzICovCitzdGF0aWMgIGludCBhdWlbTUFYX1RMQU5fQk9BUkRTXTsKK3N0YXRpYyAgaW50IGR1cGxleFtNQVhfVExBTl9CT0FSRFNdOworc3RhdGljICBpbnQgc3BlZWRbTUFYX1RMQU5fQk9BUkRTXTsKK3N0YXRpYyAgaW50IGJvYXJkc19mb3VuZDsKKworTU9EVUxFX0FVVEhPUigiTWFpbnRhaW5lcjogU2FtdWVsIENoZXNzbWFuIDxjaGVzc21hbkB0dXgub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFRJIFRodW5kZXJMQU4gYmFzZWQgZXRoZXJuZXQgUENJIGFkYXB0ZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworLyogRGVmaW5lIHRoaXMgdG8gZW5hYmxlIExpbmsgYmVhdCBtb25pdG9yaW5nICovCisjdW5kZWYgTU9OSVRPUgorCisvKiBUdXJuIG9uIGRlYnVnZ2luZy4gU2VlIERvY3VtZW50YXRpb24vbmV0d29ya2luZy90bGFuLnR4dCBmb3IgZGV0YWlscyAqLworc3RhdGljICBpbnQJCWRlYnVnOworCitzdGF0aWMJaW50CQliYnVmOworc3RhdGljCXU4CQkqVExhblBhZEJ1ZmZlcjsKK3N0YXRpYyAgZG1hX2FkZHJfdAlUTGFuUGFkQnVmZmVyRE1BOworc3RhdGljCWNoYXIJCVRMYW5TaWduYXR1cmVbXSA9ICJUTEFOIjsKK3N0YXRpYyAgY29uc3QgY2hhciB0bGFuX2Jhbm5lcltdID0gIlRodW5kZXJMQU4gZHJpdmVyIHYxLjE1XG4iOworc3RhdGljICBpbnQgdGxhbl9oYXZlX3BjaTsKK3N0YXRpYyAgaW50IHRsYW5faGF2ZV9laXNhOworCitzdGF0aWMgY29uc3QgY2hhciAqbWVkaWFbXSA9IHsKKwkiMTBCYXNlVC1IRCAiLCAiMTBCYXNlVC1GRCAiLCIxMDBiYXNlVHgtSEQgIiwgCisJIjEwMGJhc2VUeC1GRCIsICIxMDBiYXNlVDQiLCBOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGJvYXJkIHsKKwljb25zdCBjaGFyCSpkZXZpY2VMYWJlbDsKKwl1MzIJICAgCWZsYWdzOworCXUxNgkgICAJYWRkck9mczsKK30gYm9hcmRfaW5mb1tdID0geworCXsgIkNvbXBhcSBOZXRlbGxpZ2VudCAxMCBUIFBDSSBVVFAiLCBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVELCAweDgzIH0sCisJeyAiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBQQ0kgVVRQIiwgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4MyB9LAorCXsgIkNvbXBhcSBJbnRlZ3JhdGVkIE5ldEZsZXgtMy9QIiwgVExBTl9BREFQVEVSX05PTkUsIDB4ODMgfSwKKwl7ICJDb21wYXEgTmV0RmxleC0zL1AiLCBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSB8IFRMQU5fQURBUFRFUl9CSVRfUkFURV9QSFksIDB4ODMgfSwKKwl7ICJDb21wYXEgTmV0RmxleC0zL1AiLCBUTEFOX0FEQVBURVJfTk9ORSwgMHg4MyB9LAorCXsgIkNvbXBhcSBOZXRlbGxpZ2VudCBJbnRlZ3JhdGVkIDEwLzEwMCBUWCBVVFAiLCBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVELCAweDgzIH0sCisJeyAiQ29tcGFxIE5ldGVsbGlnZW50IER1YWwgMTAvMTAwIFRYIFBDSSBVVFAiLCBUTEFOX0FEQVBURVJfTk9ORSwgMHg4MyB9LAorCXsgIkNvbXBhcSBOZXRlbGxpZ2VudCAxMC8xMDAgVFggRW1iZWRkZWQgVVRQIiwgVExBTl9BREFQVEVSX05PTkUsIDB4ODMgfSwKKwl7ICJPbGljb20gT0MtMjE4My8yMTg1IiwgVExBTl9BREFQVEVSX1VTRV9JTlRFUk5fMTAsIDB4ODMgfSwKKwl7ICJPbGljb20gT0MtMjMyNSIsIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZLCAweEY4IH0sCisJeyAiT2xpY29tIE9DLTIzMjYiLCBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMCwgMHhGOCB9LAorCXsgIkNvbXBhcSBOZXRlbGxpZ2VudCAxMC8xMDAgVFggVVRQIiwgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4MyB9LAorCXsgIkNvbXBhcSBOZXRlbGxpZ2VudCAxMCBULzIgUENJIFVUUC9Db2F4IiwgVExBTl9BREFQVEVSX05PTkUsIDB4ODMgfSwKKwl7ICJDb21wYXEgTmV0RmxleC0zL0UiLCBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVEIHwgCS8qIEVJU0EgY2FyZCAqLworCSAgICAgICAgICAgICAgICAgICAgICAgIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZIHwgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWSwgMHg4MyB9LAkKKwl7ICJDb21wYXEgTmV0RmxleC0zL0UiLCBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVELCAweDgzIH0sIC8qIEVJU0EgY2FyZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRsYW5fcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEVMMTAsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRFTDEwMCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMSB9LAorCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEZMRVgzSSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMiB9LAorCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX1RIVU5ERVIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDMgfSwKKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRGTEVYM0IsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDQgfSwKKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRFTDEwMFBJLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA1IH0sCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURUwxMDBELAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA2IH0sCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURUwxMDBJLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA3IH0sCisJeyBQQ0lfVkVORE9SX0lEX09MSUNPTSwgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMTgzLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA4IH0sCisJeyBQQ0lfVkVORE9SX0lEX09MSUNPTSwgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI1LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA5IH0sCisJeyBQQ0lfVkVORE9SX0lEX09MSUNPTSwgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI2LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfTkVURUxMSUdFTlRfMTBfMTAwX1dTXzUxMDAsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDExIH0sCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9ORVRFTExJR0VOVF8xMF9UMiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTIgfSwKKwl7IDAsfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0bGFuX3BjaV90YmwpOwkJCisKK3N0YXRpYyB2b2lkCVRMYW5fRWlzYVByb2JlKCB2b2lkICk7CitzdGF0aWMgdm9pZAlUTGFuX0Vpc2FfQ2xlYW51cCggdm9pZCApOworc3RhdGljIGludCAgICAgIFRMYW5fSW5pdCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludAlUTGFuX09wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3N0YXRpYyBpbnQJVExhbl9TdGFydFR4KCBzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBUTGFuX0hhbmRsZUludGVycnVwdCggaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIGludAlUTGFuX0Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBzdHJ1Y3QJbmV0X2RldmljZV9zdGF0cyAqVExhbl9HZXRTdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZAlUTGFuX1NldE11bHRpY2FzdExpc3QoIHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludAlUTGFuX2lvY3RsKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgICAgICBUTGFuX3Byb2JlMSggc3RydWN0IHBjaV9kZXYgKnBkZXYsIGxvbmcgaW9hZGRyLCBpbnQgaXJxLCBpbnQgcmV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkCVRMYW5fdHhfdGltZW91dCggc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IAl0bGFuX2luaXRfb25lKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CisKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVJbnZhbGlkKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVUeEVPRiggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7CitzdGF0aWMgdTMyCVRMYW5fSGFuZGxlU3RhdE92ZXJmbG93KCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVSeEVPRiggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7CitzdGF0aWMgdTMyCVRMYW5fSGFuZGxlRHVtbXkoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOworc3RhdGljIHUzMglUTGFuX0hhbmRsZVR4RU9DKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVTdGF0dXNDaGVjayggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7CitzdGF0aWMgdTMyCVRMYW5fSGFuZGxlUnhFT0MoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOworCitzdGF0aWMgdm9pZAlUTGFuX1RpbWVyKCB1bnNpZ25lZCBsb25nICk7CisKK3N0YXRpYyB2b2lkCVRMYW5fUmVzZXRMaXN0cyggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9GcmVlTGlzdHMoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkCVRMYW5fUHJpbnREaW8oIHUxNiApOworc3RhdGljIHZvaWQJVExhbl9QcmludExpc3QoIFRMYW5MaXN0ICosIGNoYXIgKiwgaW50ICk7CitzdGF0aWMgdm9pZAlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQgKTsKK3N0YXRpYyB2b2lkCVRMYW5fUmVzZXRBZGFwdGVyKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZAlUTGFuX0ZpbmlzaFJlc2V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZAlUTGFuX1NldE1hYyggc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50IGFyZWcsIGNoYXIgKm1hYyApOworCitzdGF0aWMgdm9pZAlUTGFuX1BoeVByaW50KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZAlUTGFuX1BoeURldGVjdCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9QaHlQb3dlckRvd24oIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkCVRMYW5fUGh5UG93ZXJVcCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9QaHlSZXNldCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9QaHlTdGFydExpbmsoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkCVRMYW5fUGh5RmluaXNoQXV0b05lZyggc3RydWN0IG5ldF9kZXZpY2UgKiApOworI2lmZGVmIE1PTklUT1IKK3N0YXRpYyB2b2lkICAgICBUTGFuX1BoeU1vbml0b3IoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKKyNlbmRpZgorCisvKgorc3RhdGljIGludAlUTGFuX1BoeU5vcCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludAlUTGFuX1BoeUludGVybmFsQ2hlY2soIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQJVExhbl9QaHlJbnRlcm5hbFNlcnZpY2UoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQJVExhbl9QaHlEcDgzODQwYUNoZWNrKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CisqLworCitzdGF0aWMgaW50CVRMYW5fTWlpUmVhZFJlZyggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2LCB1MTYsIHUxNiAqICk7CitzdGF0aWMgdm9pZAlUTGFuX01paVNlbmREYXRhKCB1MTYsIHUzMiwgdW5zaWduZWQgKTsKK3N0YXRpYyB2b2lkCVRMYW5fTWlpU3luYyggdTE2ICk7CitzdGF0aWMgdm9pZAlUTGFuX01paVdyaXRlUmVnKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYsIHUxNiwgdTE2ICk7CisKK3N0YXRpYyB2b2lkCVRMYW5fRWVTZW5kU3RhcnQoIHUxNiApOworc3RhdGljIGludAlUTGFuX0VlU2VuZEJ5dGUoIHUxNiwgdTgsIGludCApOworc3RhdGljIHZvaWQJVExhbl9FZVJlY2VpdmVCeXRlKCB1MTYsIHU4ICosIGludCApOworc3RhdGljIGludAlUTGFuX0VlUmVhZEJ5dGUoIHN0cnVjdCBuZXRfZGV2aWNlICosIHU4LCB1OCAqICk7CisKKworc3RhdGljIHZvaWQgCitUTGFuX1N0b3JlU0tCKCBzdHJ1Y3QgdGxhbl9saXN0X3RhZyAqdGFnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKXNrYjsKKwl0YWctPmJ1ZmZlcls5XS5hZGRyZXNzID0gKHUzMilhZGRyOworCWFkZHIgPj49IDMxOwkvKiA+Pj0gMzIgaXMgdW5kZWZpbmVkIGZvciAzMmJpdCBhcmNoLCBzdHVwaWQgQyAqLworCWFkZHIgPj49IDE7CisJdGFnLT5idWZmZXJbOF0uYWRkcmVzcyA9ICh1MzIpYWRkcjsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICoKK1RMYW5fR2V0U0tCKCBzdHJ1Y3QgdGxhbl9saXN0X3RhZyAqdGFnKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9IHRhZy0+YnVmZmVyWzhdLmFkZHJlc3M7CisJYWRkciA8PD0gMzE7CisJYWRkciA8PD0gMTsKKwlhZGRyIHw9IHRhZy0+YnVmZmVyWzldLmFkZHJlc3M7CisJcmV0dXJuIChzdHJ1Y3Qgc2tfYnVmZiAqKSBhZGRyOworfQorCisKK3N0YXRpYyBUTGFuSW50VmVjdG9yRnVuYyAqVExhbkludFZlY3RvcltUTEFOX0lOVF9OVU1CRVJfT0ZfSU5UU10gPSB7CisJVExhbl9IYW5kbGVJbnZhbGlkLAorCVRMYW5fSGFuZGxlVHhFT0YsCisJVExhbl9IYW5kbGVTdGF0T3ZlcmZsb3csCisJVExhbl9IYW5kbGVSeEVPRiwKKwlUTGFuX0hhbmRsZUR1bW15LAorCVRMYW5fSGFuZGxlVHhFT0MsCisJVExhbl9IYW5kbGVTdGF0dXNDaGVjaywKKwlUTGFuX0hhbmRsZVJ4RU9DCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQKK1RMYW5fU2V0VGltZXIoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB0aWNrcywgdTMyIHR5cGUgKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJCisJaWYgKCFpbl9pcnEoKSkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIHByaXYtPnRpbWVyLmZ1bmN0aW9uICE9IE5VTEwgJiYKKwkJcHJpdi0+dGltZXJUeXBlICE9IFRMQU5fVElNRVJfQUNUSVZJVFkgKSB7IAorCQlpZiAoIWluX2lycSgpKQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJlRMYW5fVGltZXI7CisJaWYgKCFpbl9pcnEoKSkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJcHJpdi0+dGltZXJTZXRBdCA9IGppZmZpZXM7CisJcHJpdi0+dGltZXJUeXBlID0gdHlwZTsKKwltb2RfdGltZXIoJnByaXYtPnRpbWVyLCBqaWZmaWVzICsgdGlja3MpOworCQorfSAvKiBUTGFuX1NldFRpbWVyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCVRodW5kZXJMQU4gRHJpdmVyIFByaW1hcnkgRnVuY3Rpb25zCisKKwlUaGVzZSBmdW5jdGlvbnMgYXJlIG1vcmUgb3IgbGVzcyBjb21tb24gdG8gYWxsIExpbnV4IG5ldHdvcmsgZHJpdmVycy4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCXRsYW5fcmVtb3ZlX29uZQorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlOb25lCisJICoKKwkgKglHb2VzIHRocm91Z2ggdGhlIFRMYW5EZXZpY2VzIGxpc3QgYW5kIGZyZWVzIHRoZSBkZXZpY2UKKwkgKglzdHJ1Y3RzIGFuZCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGVhY2ggZGV2aWNlIChsaXN0cworCSAqCWFuZCBidWZmZXJzKS4gIEl0IGFsc28gdXJlc2VydmVzIHRoZSBJTyBwb3J0IHJlZ2lvbnMKKwkgKglhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXZpY2UuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHRsYW5fcmVtb3ZlX29uZSggc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSggcGRldiApOworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJCisJdW5yZWdpc3Rlcl9uZXRkZXYoIGRldiApOworCisJaWYgKCBwcml2LT5kbWFTdG9yYWdlICkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYtPnBjaURldiwgcHJpdi0+ZG1hU2l6ZSwgcHJpdi0+ZG1hU3RvcmFnZSwgcHJpdi0+ZG1hU3RvcmFnZURNQSApOworCX0KKworI2lmZGVmIENPTkZJR19QQ0kKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworI2VuZGlmCisJCisJZnJlZV9uZXRkZXYoIGRldiApOworCQkKKwlwY2lfc2V0X2RydmRhdGEoIHBkZXYsIE5VTEwgKTsKK30gCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB0bGFuX2RyaXZlciA9IHsKKwkubmFtZQkJPSAidGxhbiIsCisJLmlkX3RhYmxlCT0gdGxhbl9wY2lfdGJsLAorCS5wcm9iZQkJPSB0bGFuX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodGxhbl9yZW1vdmVfb25lKSwJCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0bGFuX3Byb2JlKHZvaWQpCit7CisJc3RhdGljIGludAlwYWRfYWxsb2NhdGVkOworCQorCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdGxhbl9iYW5uZXIpOworCQorCVRMYW5QYWRCdWZmZXIgPSAodTggKikgcGNpX2FsbG9jX2NvbnNpc3RlbnQoTlVMTCwgVExBTl9NSU5fRlJBTUVfU0laRSwgJlRMYW5QYWRCdWZmZXJETUEpOworCisJaWYgKFRMYW5QYWRCdWZmZXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBhZCBidWZmZXIuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KFRMYW5QYWRCdWZmZXIsIDAsIFRMQU5fTUlOX0ZSQU1FX1NJWkUpOworCXBhZF9hbGxvY2F0ZWQgPSAxOworCisJVExBTl9EQkcoVExBTl9ERUJVR19QUk9CRSwgIlN0YXJ0aW5nIFBDSSBQcm9iZS4uLi5cbiIpOworCQorCS8qIFVzZSBuZXcgc3R5bGUgUENJIHByb2JpbmcuIE5vdyB0aGUga2VybmVsIHdpbGwKKwkgICBkbyBtb3N0IG9mIHRoaXMgZm9yIHVzICovCisJcGNpX3JlZ2lzdGVyX2RyaXZlcigmdGxhbl9kcml2ZXIpOworCisJVExBTl9EQkcoVExBTl9ERUJVR19QUk9CRSwgIlN0YXJ0aW5nIEVJU0EgUHJvYmUuLi4uXG4iKTsKKwlUTGFuX0Vpc2FQcm9iZSgpOworCQkKKwlwcmludGsoS0VSTl9JTkZPICJUTEFOOiAlZCBkZXZpY2UlcyBpbnN0YWxsZWQsIFBDSTogJWQgIEVJU0E6ICVkXG4iLCAKKwkJIFRMYW5EZXZpY2VzSW5zdGFsbGVkLCBUTGFuRGV2aWNlc0luc3RhbGxlZCA9PSAxID8gIiIgOiAicyIsCisJCSB0bGFuX2hhdmVfcGNpLCB0bGFuX2hhdmVfZWlzYSk7CisKKwlpZiAoVExhbkRldmljZXNJbnN0YWxsZWQgPT0gMCkgeworCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnRsYW5fZHJpdmVyKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChOVUxMLCBUTEFOX01JTl9GUkFNRV9TSVpFLCBUTGFuUGFkQnVmZmVyLCBUTGFuUGFkQnVmZmVyRE1BKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0bGFuX2luaXRfb25lKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gVExhbl9wcm9iZTEoIHBkZXYsIC0xLCAtMSwgMCwgZW50KTsKK30KKworCisvKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCXRsYW5fcHJvYmUxCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb24gZXJyb3IKKwkgKglQYXJtczogCisJICoJCW5vbmUKKwkgKgorCSAqCVRoZSBuYW1lIGlzIGxvd2VyIGNhc2UgdG8gZml0IGluIHdpdGggYWxsIHRoZSByZXN0IG9mCisJICoJdGhlIG5ldGNhcmRfcHJvYmUgbmFtZXMuICBUaGlzIGZ1bmN0aW9uIGxvb2tzIGZvciAKKwkgKglhbm90aGVyIFRMYW4gYmFzZWQgYWRhcHRlciwgc2V0dGluZyBpdCB1cCB3aXRoIHRoZQorCSAqCWFsbG9jYXRlZCBkZXZpY2Ugc3RydWN0IGlmIG9uZSBpcyBmb3VuZC4KKwkgKgl0bGFuX3Byb2JlIGhhcyBiZWVuIHBvcnRlZCB0byB0aGUgbmV3IG5ldCBBUEkgYW5kCisJICoJbm93IGFsbG9jYXRlcyBpdHMgb3duIGRldmljZSBzdHJ1Y3R1cmUuIFRoaXMgZnVuY3Rpb24KKwkgKglpcyBhbHNvIHVzZWQgYnkgbW9kdWxlcy4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfX2RldmluaXQgVExhbl9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIAorCQkJCWxvbmcgaW9hZGRyLCBpbnQgaXJxLCBpbnQgcmV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50ICkKK3sKKworCXN0cnVjdCBuZXRfZGV2aWNlICAqZGV2OworCVRMYW5Qcml2YXRlSW5mbyAgICAqcHJpdjsKKwl1OAkJICAgcGNpX3JldjsKKwl1MTYJCSAgIGRldmljZV9pZDsKKwlpbnQJCSAgIHJlZywgcmMgPSAtRU5PREVWOworCisJaWYgKHBkZXYpIHsKKwkJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBUTGFuU2lnbmF0dXJlKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCByZXNlcnZlIElPIHJlZ2lvbnNcbiIpOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKFRMYW5Qcml2YXRlSW5mbykpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZS5cbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKwkKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaXYtPnBjaURldiA9IHBkZXY7CisJCisJLyogSXMgdGhpcyBhIFBDSSBkZXZpY2U/ICovCisJaWYgKHBkZXYpIHsKKwkJdTMyIAkJICAgcGNpX2lvX2Jhc2UgPSAwOworCisJCXByaXYtPmFkYXB0ZXIgPSAmYm9hcmRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXTsKKworCQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhGRkZGRkZGRik7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJUTEFOOiBObyBzdWl0YWJsZSBQQ0kgbWFwcGluZyBhdmFpbGFibGUuXG4iKTsKKwkJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwkJfQorCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlICggcGRldiwgUENJX1JFVklTSU9OX0lELCAmcGNpX3Jldik7CisKKwkJZm9yICggcmVnPSAwOyByZWcgPD0gNTsgcmVnICsrICkgeworCQkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCByZWcpICYgSU9SRVNPVVJDRV9JTykgeworCQkJCXBjaV9pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIHJlZyk7CisJCQkJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIklPIG1hcHBpbmcgaXMgYXZhaWxhYmxlIGF0ICV4LlxuIiwKKwkJCQkJCXBjaV9pb19iYXNlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIXBjaV9pb19iYXNlKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IE5vIElPIG1hcHBpbmdzIGF2YWlsYWJsZVxuIik7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CisJCX0KKwkJCisJCWRldi0+YmFzZV9hZGRyID0gcGNpX2lvX2Jhc2U7CisJCWRldi0+aXJxID0gcGRldi0+aXJxOworCQlwcml2LT5hZGFwdGVyUmV2ID0gcGNpX3JldjsgCisJCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCX0gZWxzZQl7ICAgICAvKiBFSVNBIGNhcmQgKi8KKwkJLyogVGhpcyBpcyBhIGhhY2suIFdlIG5lZWQgdG8ga25vdyB3aGljaCBib2FyZCBzdHJ1Y3R1cmUKKwkJICogaXMgc3VpdGVkIGZvciB0aGlzIGFkYXB0ZXIgKi8KKwkJZGV2aWNlX2lkID0gaW53KGlvYWRkciArIEVJU0FfSUQyKTsKKwkJcHJpdi0+aXNfZWlzYSA9IDE7CisJCWlmIChkZXZpY2VfaWQgPT0gMHgyMEYxKSB7CisJCQlwcml2LT5hZGFwdGVyID0gJmJvYXJkX2luZm9bMTNdOyAJLyogTmV0RmxleC0zL0UgKi8KKwkJCXByaXYtPmFkYXB0ZXJSZXYgPSAyMzsJCQkvKiBUTEFOIDIuMyAqLworCQl9IGVsc2UgeworCQkJcHJpdi0+YWRhcHRlciA9ICZib2FyZF9pbmZvWzE0XTsKKwkJCXByaXYtPmFkYXB0ZXJSZXYgPSAxMDsJCQkvKiBUTEFOIDEuMCAqLworCQl9CisJCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCQlkZXYtPmlycSA9IGlycTsKKwl9CisKKwkvKiBLZXJuZWwgcGFyYW1ldGVycyAqLworCWlmIChkZXYtPm1lbV9zdGFydCkgeworCQlwcml2LT5hdWkgICAgPSBkZXYtPm1lbV9zdGFydCAmIDB4MDE7CisJCXByaXYtPmR1cGxleCA9ICgoZGV2LT5tZW1fc3RhcnQgJiAweDA2KSA9PSAweDA2KSA/IDAgOiAoZGV2LT5tZW1fc3RhcnQgJiAweDA2KSA+PiAxOworCQlwcml2LT5zcGVlZCAgPSAoKGRldi0+bWVtX3N0YXJ0ICYgMHgxOCkgPT0gMHgxOCkgPyAwIDogKGRldi0+bWVtX3N0YXJ0ICYgMHgxOCkgPj4gMzsKKwkKKwkJaWYgKHByaXYtPnNwZWVkID09IDB4MSkgeworCQkJcHJpdi0+c3BlZWQgPSBUTEFOX1NQRUVEXzEwOworCQl9IGVsc2UgaWYgKHByaXYtPnNwZWVkID09IDB4MikgeworCQkJcHJpdi0+c3BlZWQgPSBUTEFOX1NQRUVEXzEwMDsKKwkJfQorCQlkZWJ1ZyA9IHByaXYtPmRlYnVnID0gZGV2LT5tZW1fZW5kOworCX0gZWxzZSB7CisJCXByaXYtPmF1aSAgICA9IGF1aVtib2FyZHNfZm91bmRdOworCQlwcml2LT5zcGVlZCAgPSBzcGVlZFtib2FyZHNfZm91bmRdOworCQlwcml2LT5kdXBsZXggPSBkdXBsZXhbYm9hcmRzX2ZvdW5kXTsKKwkJcHJpdi0+ZGVidWcgPSBkZWJ1ZzsKKwl9CisJCisJLyogVGhpcyB3aWxsIGJlIHVzZWQgd2hlbiB3ZSBnZXQgYW4gYWRhcHRlciBlcnJvciBmcm9tCisJICogd2l0aGluIG91ciBpcnEgaGFuZGxlciAqLworCUlOSVRfV09SSygmcHJpdi0+dGxhbl90cXVldWUsICh2b2lkICopKHZvaWQqKVRMYW5fdHhfdGltZW91dCwgZGV2KTsKKworCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKwkKKwlyYyA9IFRMYW5fSW5pdChkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCBzZXQgdXAgZGV2aWNlLlxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwl9CisKKwlyYyA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UuXG4iKTsKKwkJZ290byBlcnJfb3V0X3VuaW5pdDsKKwl9CisKKwkKKwlUTGFuRGV2aWNlc0luc3RhbGxlZCsrOworCWJvYXJkc19mb3VuZCsrOworCQorCS8qIHBkZXYgaXMgTlVMTCBpZiB0aGlzIGlzIGFuIEVJU0EgZGV2aWNlICovCisJaWYgKHBkZXYpCisJCXRsYW5faGF2ZV9wY2krKzsKKwllbHNlIHsKKwkJcHJpdi0+bmV4dERldmljZSA9IFRMYW5fRWlzYV9EZXZpY2VzOworCQlUTGFuX0Vpc2FfRGV2aWNlcyA9IGRldjsKKwkJdGxhbl9oYXZlX2Vpc2ErKzsKKwl9CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogJXMgaXJxPSUyZCwgaW89JTA0eCwgJXMsIFJldi4gJWRcbiIsCisJCQlkZXYtPm5hbWUsCisJCQkoaW50KSBkZXYtPmlycSwKKwkJCShpbnQpIGRldi0+YmFzZV9hZGRyLAorCQkJcHJpdi0+YWRhcHRlci0+ZGV2aWNlTGFiZWwsCisJCQlwcml2LT5hZGFwdGVyUmV2KTsKKwlyZXR1cm4gMDsKKworZXJyX291dF91bmluaXQ6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2LT5wY2lEZXYsIHByaXYtPmRtYVNpemUsIHByaXYtPmRtYVN0b3JhZ2UsCisJCQkgICAgcHJpdi0+ZG1hU3RvcmFnZURNQSApOworZXJyX291dF9mcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworZXJyX291dF9yZWdpb25zOgorI2lmZGVmIENPTkZJR19QQ0kKKwlpZiAocGRldikKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKyNlbmRpZgorZXJyX291dDoKKwlpZiAocGRldikKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgdm9pZCBUTGFuX0Vpc2FfQ2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJVExhblByaXZhdGVJbmZvICpwcml2OworCQorCXdoaWxlKCB0bGFuX2hhdmVfZWlzYSApIHsKKwkJZGV2ID0gVExhbl9FaXNhX0RldmljZXM7CisJCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQlpZiAocHJpdi0+ZG1hU3RvcmFnZSkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2LT5wY2lEZXYsIHByaXYtPmRtYVNpemUsIHByaXYtPmRtYVN0b3JhZ2UsIHByaXYtPmRtYVN0b3JhZ2VETUEgKTsKKwkJfQorCQlyZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDB4MTApOworCQl1bnJlZ2lzdGVyX25ldGRldiggZGV2ICk7CisJCVRMYW5fRWlzYV9EZXZpY2VzID0gcHJpdi0+bmV4dERldmljZTsKKwkJZnJlZV9uZXRkZXYoIGRldiApOworCQl0bGFuX2hhdmVfZWlzYS0tOworCX0KK30KKwkKKwkJCitzdGF0aWMgdm9pZCBfX2V4aXQgdGxhbl9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0bGFuX2RyaXZlcik7CisKKwlpZiAodGxhbl9oYXZlX2Vpc2EpCisJCVRMYW5fRWlzYV9DbGVhbnVwKCk7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KE5VTEwsIFRMQU5fTUlOX0ZSQU1FX1NJWkUsIFRMYW5QYWRCdWZmZXIsIFRMYW5QYWRCdWZmZXJETUEpOworCit9CisKKworLyogTW9kdWxlIGxvYWRpbmcvdW5sb2FkaW5nICovCittb2R1bGVfaW5pdCh0bGFuX3Byb2JlKTsKK21vZHVsZV9leGl0KHRsYW5fZXhpdCk7CisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogCVRMYW5fRWlzYVByb2JlCisJICoKKwkgKiAgCVJldHVybnM6IDAgb24gc3VjY2VzcywgMSBvdGhlcndpc2UKKwkgKgorCSAqICAJUGFybXM6CSBOb25lCisJICoKKwkgKgorCSAqICAJVGhpcyBmdW5jdGlvbnMgcHJvYmVzIGZvciBFSVNBIGRldmljZXMgYW5kIGNhbGxzIAorCSAqICAJVExhbl9wcm9iZTEgd2hlbiBvbmUgaXMgZm91bmQuIAorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkICBfX2luaXQgVExhbl9FaXNhUHJvYmUgKHZvaWQpIAoreworCWxvbmcgCWlvYWRkcjsKKwlpbnQgCXJjID0gLUVOT0RFVjsKKwlpbnQgCWlycTsKKwl1MTYJZGV2aWNlX2lkOworCisJaWYgKCFFSVNBX2J1cykgewkKKwkJVExBTl9EQkcoVExBTl9ERUJVR19QUk9CRSwgIk5vIEVJU0EgYnVzIHByZXNlbnRcbiIpOworCQlyZXR1cm47CisJfQorCQorCS8qIExvb3AgdGhyb3VnaCBhbGwgc2xvdHMgb2YgdGhlIEVJU0EgYnVzICovCisJZm9yIChpb2FkZHIgPSAweDEwMDA7IGlvYWRkciA8IDB4OTAwMDsgaW9hZGRyICs9IDB4MTAwMCkgeworCQkKKwlUTEFOX0RCRyhUTEFOX0RFQlVHX1BST0JFLCJFSVNBX0lEIDB4JTR4OiAweCU0eFxuIiwgKGludCkgaW9hZGRyICsgMHhDODAsIGludyhpb2FkZHIgKyBFSVNBX0lEKSk7CQorCVRMQU5fREJHKFRMQU5fREVCVUdfUFJPQkUsIkVJU0FfSUQgMHglNHg6IDB4JTR4XG4iLCAoaW50KSBpb2FkZHIgKyAweEM4MiwgaW53KGlvYWRkciArIEVJU0FfSUQyKSk7CisKKworCQlUTEFOX0RCRyhUTEFOX0RFQlVHX1BST0JFLCAiUHJvYmluZyBmb3IgRUlTQSBhZGFwdGVyIGF0IElPOiAweCU0eCA6ICIsCisJCQkJICAgCShpbnQpIGlvYWRkcik7CisJCWlmIChyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIDB4MTAsIFRMYW5TaWduYXR1cmUpID09IE5VTEwpIAorCQkJZ290byBvdXQ7CisKKwkJaWYgKGludyhpb2FkZHIgKyBFSVNBX0lEKSAhPSAweDExMEUpIHsJCQorCQkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCAweDEwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCQorCQlkZXZpY2VfaWQgPSBpbncoaW9hZGRyICsgRUlTQV9JRDIpOworCQlpZiAoZGV2aWNlX2lkICE9ICAweDIwRjEgJiYgZGV2aWNlX2lkICE9IDB4NDBGMSkgeyAJCQorCQkJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgMHgxMCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQkKKwkgCWlmIChpbmIoaW9hZGRyICsgRUlTQV9DUikgIT0gMHgxKSB7IAkvKiBDaGVjayBpZiBhZGFwdGVyIGlzIGVuYWJsZWQgKi8KKwkJCXJlbGVhc2VfcmVnaW9uIChpb2FkZHIsIDB4MTApOworCQkJZ290byBvdXQyOworCQl9CisJCQorCQlpZiAoZGVidWcgPT0gMHgxMCkJCQorCQkJcHJpbnRrKCJGb3VuZCBvbmVcbiIpOworCisKKwkJLyogR2V0IGlycSBmcm9tIGJvYXJkICovCisJCXN3aXRjaCAoaW5iKGlvYWRkciArIDB4Q0MwKSkgeworCQkJY2FzZSgweDEwKToKKwkJCQlpcnE9NTsKKwkJCQlicmVhazsKKwkJCWNhc2UoMHgyMCk6CisJCQkJaXJxPTk7CisJCQkJYnJlYWs7CisJCQljYXNlKDB4NDApOgorCQkJCWlycT0xMDsKKwkJCQlicmVhazsKKwkJCWNhc2UoMHg4MCk6CisJCQkJaXJxPTExOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIG91dDsKKwkJfSAgICAgICAgICAgICAgIAorCQkKKwkJCisJCS8qIFNldHVwIHRoZSBuZXdseSBmb3VuZCBlaXNhIGFkYXB0ZXIgKi8KKwkJcmMgPSBUTGFuX3Byb2JlMSggTlVMTCwgaW9hZGRyLCBpcnEsCisJCQkJCTEyLCBOVUxMKTsKKwkJY29udGludWU7CisJCQorCQlvdXQ6CisJCQlpZiAoZGVidWcgPT0gMHgxMCkKKwkJCQlwcmludGsoIk5vbmUgZm91bmRcbiIpOworCQkJY29udGludWU7CisKKwkJb3V0MjoJaWYgKGRlYnVnID09IDB4MTApCisJCQkJcHJpbnRrKCJDYXJkIGZvdW5kIGJ1dCBpdCBpcyBub3QgZW5hYmxlZCwgc2tpcHBpbmdcbiIpOworCQkJY29udGludWU7CisJCQorCX0KKworfSAvKiBUTGFuX0Vpc2FQcm9iZSAqLworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIFRMYW5fUG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlUTGFuX0hhbmRsZUludGVycnVwdChkZXYtPmlycSwgZGV2LCBOVUxMKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKK30KKyNlbmRpZgorCisJCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0luaXQKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UuCisJICoJUGFybXM6CisJICoJCWRldglUaGUgc3RydWN0dXJlIG9mIHRoZSBkZXZpY2UgdG8gYmUKKwkgKgkJCWluaXQnZWQuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIGNvbXBsZXRlcyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlCisJICoJZGV2aWNlIHN0cnVjdHVyZSBhbmQgZHJpdmVyLiAgSXQgcmVzZXJ2ZXMgdGhlIElPCisJICoJYWRkcmVzc2VzLCBhbGxvY2F0ZXMgbWVtb3J5IGZvciB0aGUgbGlzdHMgYW5kIGJvdW5jZQorCSAqCWJ1ZmZlcnMsIHJldHJpZXZlcyB0aGUgTUFDIGFkZHJlc3MgZnJvbSB0aGUgZWVwcm9tCisJICoJYW5kIGFzc2lnbmVzIHRoZSBkZXZpY2UncyBtZXRob2RzLgorCSAqCQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBUTGFuX0luaXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCWludAkJZG1hX3NpemU7CisJaW50IAkJZXJyOworCWludAkJaTsKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXY7CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlpZiAoIGJidWYgKSB7CisJCWRtYV9zaXplID0gKCBUTEFOX05VTV9SWF9MSVNUUyArIFRMQU5fTlVNX1RYX0xJU1RTICkKKwkgICAgICAgICAgICogKCBzaXplb2YoVExhbkxpc3QpICsgVExBTl9NQVhfRlJBTUVfU0laRSApOworCX0gZWxzZSB7CisJCWRtYV9zaXplID0gKCBUTEFOX05VTV9SWF9MSVNUUyArIFRMQU5fTlVNX1RYX0xJU1RTICkKKwkgICAgICAgICAgICogKCBzaXplb2YoVExhbkxpc3QpICk7CisJfQorCXByaXYtPmRtYVN0b3JhZ2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwcml2LT5wY2lEZXYsIGRtYV9zaXplLCAmcHJpdi0+ZG1hU3RvcmFnZURNQSk7CisJcHJpdi0+ZG1hU2l6ZSA9IGRtYV9zaXplOworCQorCWlmICggcHJpdi0+ZG1hU3RvcmFnZSA9PSBOVUxMICkgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46ICBDb3VsZCBub3QgYWxsb2NhdGUgbGlzdHMgYW5kIGJ1ZmZlcnMgZm9yICVzLlxuIiwKKwkJCWRldi0+bmFtZSApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCBwcml2LT5kbWFTdG9yYWdlLCAwLCBkbWFfc2l6ZSApOworCXByaXYtPnJ4TGlzdCA9IChUTGFuTGlzdCAqKSAKKwkJICAgICAgICggKCAoICh1MzIpIHByaXYtPmRtYVN0b3JhZ2UgKSArIDcgKSAmIDB4RkZGRkZGRjggKTsKKwlwcml2LT5yeExpc3RETUEgPSAoICggKCAodTMyKSBwcml2LT5kbWFTdG9yYWdlRE1BICkgKyA3ICkgJiAweEZGRkZGRkY4ICk7CisJcHJpdi0+dHhMaXN0ID0gcHJpdi0+cnhMaXN0ICsgVExBTl9OVU1fUlhfTElTVFM7CisJcHJpdi0+dHhMaXN0RE1BID0gcHJpdi0+cnhMaXN0RE1BICsgc2l6ZW9mKFRMYW5MaXN0KSAqIFRMQU5fTlVNX1JYX0xJU1RTOworCWlmICggYmJ1ZiApIHsKKwkJcHJpdi0+cnhCdWZmZXIgPSAodTggKikgKCBwcml2LT50eExpc3QgKyBUTEFOX05VTV9UWF9MSVNUUyApOworCQlwcml2LT5yeEJ1ZmZlckRNQSA9cHJpdi0+dHhMaXN0RE1BICsgc2l6ZW9mKFRMYW5MaXN0KSAqIFRMQU5fTlVNX1RYX0xJU1RTOworCQlwcml2LT50eEJ1ZmZlciA9IHByaXYtPnJ4QnVmZmVyICsgKCBUTEFOX05VTV9SWF9MSVNUUyAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKTsKKwkJcHJpdi0+dHhCdWZmZXJETUEgPSBwcml2LT5yeEJ1ZmZlckRNQSArICggVExBTl9OVU1fUlhfTElTVFMgKiBUTEFOX01BWF9GUkFNRV9TSVpFICk7CisJfQorCisJZXJyID0gMDsKKwlmb3IgKCBpID0gMDsgIGkgPCA2IDsgaSsrICkKKwkJZXJyIHw9IFRMYW5fRWVSZWFkQnl0ZSggZGV2LAorCQkJCQkodTgpIHByaXYtPmFkYXB0ZXItPmFkZHJPZnMgKyBpLAorCQkJCQkodTggKikgJmRldi0+ZGV2X2FkZHJbaV0gKTsKKwlpZiAoIGVyciApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJUTEFOOiAlczogRXJyb3IgcmVhZGluZyBNQUMgZnJvbSBlZXByb206ICVkXG4iLAorCQkJZGV2LT5uYW1lLAorCQkJZXJyICk7CisJfQorCWRldi0+YWRkcl9sZW4gPSA2OworCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCS8qIERldmljZSBtZXRob2RzICovCisJZGV2LT5vcGVuID0gJlRMYW5fT3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZUTGFuX1N0YXJ0VHg7CisJZGV2LT5zdG9wID0gJlRMYW5fQ2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmVExhbl9HZXRTdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZUTGFuX1NldE11bHRpY2FzdExpc3Q7CisJZGV2LT5kb19pb2N0bCA9ICZUTGFuX2lvY3RsOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmVExhbl9Qb2xsOworI2VuZGlmCisJZGV2LT50eF90aW1lb3V0ID0gJlRMYW5fdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKworCXJldHVybiAwOworCit9IC8qIFRMYW5fSW5pdCAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fT3BlbgorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKwkgKglQYXJtczoKKwkgKgkJZGV2CVN0cnVjdHVyZSBvZiBkZXZpY2UgdG8gYmUgb3BlbmVkLgorCSAqCisJICoJVGhpcyByb3V0aW5lIHB1dHMgdGhlIGRyaXZlciBhbmQgVExBTiBhZGFwdGVyIGluIGEKKwkgKglzdGF0ZSB3aGVyZSBpdCBpcyByZWFkeSB0byBzZW5kIGFuZCByZWNlaXZlIHBhY2tldHMuCisJICoJSXQgYWxsb2NhdGVzIHRoZSBJUlEsIHJlc2V0cyBhbmQgYnJpbmdzIHRoZSBhZGFwdGVyCisJICoJb3V0IG9mIHJlc2V0LCBhbmQgYWxsb3dzIGludGVycnVwdHMuICBJdCBhbHNvIGRlbGF5cworCSAqCXRoZSBzdGFydHVwIGZvciBhdXRvbmVnb3RpYXRpb24gb3Igc2VuZHMgYSBSeCBHTworCSAqCWNvbW1hbmQgdG8gdGhlIGFkYXB0ZXIsIGFzIGFwcHJvcHJpYXRlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IFRMYW5fT3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQJCWVycjsKKwkKKwlwcml2LT50bGFuUmV2ID0gVExhbl9EaW9SZWFkOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fREVGX1JFVklTSU9OICk7CisJZXJyID0gcmVxdWVzdF9pcnEoIGRldi0+aXJxLCBUTGFuX0hhbmRsZUludGVycnVwdCwgU0FfU0hJUlEsIFRMYW5TaWduYXR1cmUsIGRldiApOworCQorCWlmICggZXJyICkgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46ICBDYW5ub3Qgb3BlbiAlcyBiZWNhdXNlIElSUSAlZCBpcyBhbHJlYWR5IGluIHVzZS5cbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEgKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJCisJaW5pdF90aW1lcigmcHJpdi0+dGltZXIpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCisJLyogTk9URTogSXQgbWlnaHQgbm90IGJlIG5lY2Vzc2FyeSB0byByZWFkIHRoZSBzdGF0cyBiZWZvcmUgYQorCQkJIHJlc2V0IGlmIHlvdSBkb24ndCBjYXJlIHdoYXQgdGhlIHZhbHVlcyBhcmUuCisJKi8KKwlUTGFuX1Jlc2V0TGlzdHMoIGRldiApOworCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9JR05PUkUgKTsKKwlUTGFuX1Jlc2V0QWRhcHRlciggZGV2ICk7CisKKwlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiJXM6IE9wZW5lZC4gIFRMQU4gQ2hpcCBSZXY6ICV4XG4iLCBkZXYtPm5hbWUsIHByaXYtPnRsYW5SZXYgKTsKKworCXJldHVybiAwOworCit9IC8qIFRMYW5fT3BlbiAqLworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5faW9jdGwKKwkgKgkKKwkgKglSZXR1cm5zOgorCSAqCQkwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisJICoJUGFyYW1zOgorCSAqCQlkZXYJc3RydWN0dXJlIG9mIGRldmljZSB0byByZWNlaXZlIGlvY3RsLgorCSAqCQkKKwkgKgkJcnEJaWZyZXEgc3RydWN0dXJlIHRvIGhvbGQgdXNlcnNwYWNlIGRhdGEuCisJICoKKwkgKgkJY21kCWlvY3RsIGNvbW1hbmQuCisJICoKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IFRMYW5faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShycSk7CisJdTMyIHBoeSAgID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisJCisJaWYgKCFwcml2LT5waHlPbmxpbmUpCisJCXJldHVybiAtRUFHQUlOOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KKwkJCWRhdGEtPnBoeV9pZCA9IHBoeTsKKworCisJY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJCVRMYW5fTWlpUmVhZFJlZyhkZXYsIGRhdGEtPnBoeV9pZCAmIDB4MWYsIGRhdGEtPnJlZ19udW0gJiAweDFmLCAmZGF0YS0+dmFsX291dCk7CisJCQlyZXR1cm4gMDsKKwkJCisKKwljYXNlIFNJT0NTTUlJUkVHOgkJLyogV3JpdGUgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJVExhbl9NaWlXcml0ZVJlZyhkZXYsIGRhdGEtPnBoeV9pZCAmIDB4MWYsIGRhdGEtPnJlZ19udW0gJiAweDFmLCBkYXRhLT52YWxfaW4pOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfSAvKiB0bGFuX2lvY3RsICovCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAJVExhbl90eF90aW1lb3V0CisJICoKKwkgKiAJUmV0dXJuczogbm90aGluZworCSAqCisJICogCVBhcmFtczoKKwkgKiAJCWRldglzdHJ1Y3R1cmUgb2YgZGV2aWNlIHdoaWNoIHRpbWVkIG91dCAKKwkgKiAJCQlkdXJpbmcgdHJhbnNtaXQuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIFRMYW5fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCQorCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogVHJhbnNtaXQgdGltZWQgb3V0LlxuIiwgZGV2LT5uYW1lKTsKKwkKKwkvKiBPayBzbyB3ZSB0aW1lZCBvdXQsIGxldHMgc2VlIHdoYXQgd2UgY2FuIGRvIGFib3V0IGl0Li4uKi8KKwlUTGFuX0ZyZWVMaXN0cyggZGV2ICk7CisJVExhbl9SZXNldExpc3RzKCBkZXYgKTsJCQorCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9JR05PUkUgKTsKKwlUTGFuX1Jlc2V0QWRhcHRlciggZGV2ICk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZSggZGV2ICk7CQorCit9CisJCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1N0YXJ0VHgKKwkgKiAgCisJICoJUmV0dXJuczoKKwkgKgkJMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBmYWlsdXJlLgorCSAqCVBhcm1zOgorCSAqCQlza2IJQSBwb2ludGVyIHRvIHRoZSBza19idWZmIGNvbnRhaW5pbmcgdGhlCisJICoJCQlmcmFtZSB0byBiZSBzZW50LgorCSAqCQlkZXYJVGhlIGRldmljZSB0byBzZW5kIHRoZSBkYXRhIG9uLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBhZGRzIGEgZnJhbWUgdG8gdGhlIFR4IGxpc3QgdG8gYmUgc2VudAorCSAqCUFTQVAuICBGaXJzdCBpdAl2ZXJpZmllcyB0aGF0IHRoZSBhZGFwdGVyIGlzIHJlYWR5IGFuZAorCSAqCXRoZXJlIGlzIHJvb20gaW4gdGhlIHF1ZXVlLiAgVGhlbiBpdCBzZXRzIHVwIHRoZSBuZXh0CisJICoJYXZhaWxhYmxlIGxpc3QsIGNvcGllcyB0aGUgZnJhbWUgdG8gdGhlCWNvcnJlc3BvbmRpbmcKKwkgKglidWZmZXIuICBJZiB0aGUgYWRhcHRlciBUeCBjaGFubmVsIGlzIGlkbGUsIGl0IGdpdmVzCisJICoJdGhlIGFkYXB0ZXIgYSBUeCBHbyBjb21tYW5kIG9uIHRoZSBsaXN0LCBvdGhlcndpc2UgaXQKKwkgKglzZXRzIHRoZSBmb3J3YXJkIGFkZHJlc3Mgb2YgdGhlIHByZXZpb3VzIGxpc3QgdG8gcG9pbnQKKwkgKgl0byB0aGlzIG9uZS4gIFRoZW4gaXQgZnJlZXMgdGhlIHNrX2J1ZmYuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgVExhbl9TdGFydFR4KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCVRMYW5MaXN0CSp0YWlsX2xpc3Q7CisJZG1hX2FkZHJfdAl0YWlsX2xpc3RfcGh5czsKKwl1OAkJKnRhaWxfYnVmZmVyOworCWludAkJcGFkOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAoICEgcHJpdi0+cGh5T25saW5lICkgeworCQlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgJXMgUEhZIGlzIG5vdCByZWFkeVxuIiwgZGV2LT5uYW1lICk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiAwOworCX0KKworCXRhaWxfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4VGFpbDsKKwl0YWlsX2xpc3RfcGh5cyA9IHByaXYtPnR4TGlzdERNQSArIHNpemVvZihUTGFuTGlzdCkgKiBwcml2LT50eFRhaWw7CisJCisJaWYgKCB0YWlsX2xpc3QtPmNTdGF0ICE9IFRMQU5fQ1NUQVRfVU5VU0VEICkgeworCQlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgJXMgaXMgYnVzeSAoSGVhZD0lZCBUYWlsPSVkKVxuIiwgZGV2LT5uYW1lLCBwcml2LT50eEhlYWQsIHByaXYtPnR4VGFpbCApOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXByaXYtPnR4QnVzeUNvdW50Kys7CisJCXJldHVybiAxOworCX0KKworCXRhaWxfbGlzdC0+Zm9yd2FyZCA9IDA7CisKKwlpZiAoIGJidWYgKSB7CisJCXRhaWxfYnVmZmVyID0gcHJpdi0+dHhCdWZmZXIgKyAoIHByaXYtPnR4VGFpbCAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKTsKKwkJbWVtY3B5KCB0YWlsX2J1ZmZlciwgc2tiLT5kYXRhLCBza2ItPmxlbiApOworCX0gZWxzZSB7CisJCXRhaWxfbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wY2lEZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlUTGFuX1N0b3JlU0tCKHRhaWxfbGlzdCwgc2tiKTsKKwl9CisKKwlwYWQgPSBUTEFOX01JTl9GUkFNRV9TSVpFIC0gc2tiLT5sZW47CisKKwlpZiAoIHBhZCA+IDAgKSB7CisJCXRhaWxfbGlzdC0+ZnJhbWVTaXplID0gKHUxNikgc2tiLT5sZW4gKyBwYWQ7CisJCXRhaWxfbGlzdC0+YnVmZmVyWzBdLmNvdW50ID0gKHUzMikgc2tiLT5sZW47CisJCXRhaWxfbGlzdC0+YnVmZmVyWzFdLmNvdW50ID0gVExBTl9MQVNUX0JVRkZFUiB8ICh1MzIpIHBhZDsKKwkJdGFpbF9saXN0LT5idWZmZXJbMV0uYWRkcmVzcyA9IFRMYW5QYWRCdWZmZXJETUE7CisJfSBlbHNlIHsKKwkJdGFpbF9saXN0LT5mcmFtZVNpemUgPSAodTE2KSBza2ItPmxlbjsKKwkJdGFpbF9saXN0LT5idWZmZXJbMF0uY291bnQgPSBUTEFOX0xBU1RfQlVGRkVSIHwgKHUzMikgc2tiLT5sZW47CisJCXRhaWxfbGlzdC0+YnVmZmVyWzFdLmNvdW50ID0gMDsKKwkJdGFpbF9saXN0LT5idWZmZXJbMV0uYWRkcmVzcyA9IDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwl0YWlsX2xpc3QtPmNTdGF0ID0gVExBTl9DU1RBVF9SRUFEWTsKKwlpZiAoICEgcHJpdi0+dHhJblByb2dyZXNzICkgeworCQlwcml2LT50eEluUHJvZ3Jlc3MgPSAxOworCQlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgU3RhcnRpbmcgVFggb24gYnVmZmVyICVkXG4iLCBwcml2LT50eFRhaWwgKTsKKwkJb3V0bCggdGFpbF9saXN0X3BoeXMsIGRldi0+YmFzZV9hZGRyICsgVExBTl9DSF9QQVJNICk7CisJCW91dGwoIFRMQU5fSENfR08sIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCApOworCX0gZWxzZSB7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICBBZGRpbmcgYnVmZmVyICVkIHRvIFRYIGNoYW5uZWxcbiIsIHByaXYtPnR4VGFpbCApOworCQlpZiAoIHByaXYtPnR4VGFpbCA9PSAwICkgeworCQkJKCBwcml2LT50eExpc3QgKyAoIFRMQU5fTlVNX1RYX0xJU1RTIC0gMSApICktPmZvcndhcmQgPSB0YWlsX2xpc3RfcGh5czsKKwkJfSBlbHNlIHsKKwkJCSggcHJpdi0+dHhMaXN0ICsgKCBwcml2LT50eFRhaWwgLSAxICkgKS0+Zm9yd2FyZCA9IHRhaWxfbGlzdF9waHlzOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCUNJUkNfSU5DKCBwcml2LT50eFRhaWwsIFRMQU5fTlVNX1RYX0xJU1RTICk7CisKKwlpZiAoIGJidWYgKQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyZXR1cm4gMDsKKworfSAvKiBUTGFuX1N0YXJ0VHggKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0hhbmRsZUludGVycnVwdAorCSAqICAKKwkgKglSZXR1cm5zOgkKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlpcnEJVGhlIGxpbmUgb24gd2hpY2ggdGhlIGludGVycnVwdAorCSAqCQkJb2NjdXJyZWQuCisJICoJCWRldl9pZAlBIHBvaW50ZXIgdG8gdGhlIGRldmljZSBhc3NpZ25lZCB0bworCSAqCQkJdGhpcyBpcnEgbGluZS4KKwkgKgkJcmVncwk/Pz8KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhbiBpbnRlcnJ1cHQgZ2VuZXJhdGVkIGJ5IGl0cworCSAqCWFzc2lnbmVkIFRMQU4gYWRhcHRlci4gIFRoZSBmdW5jdGlvbiBkZWFjdGl2YXRlcworCSAqCWludGVycnVwdHMgb24gaXRzIGFkYXB0ZXIsIHJlY29yZHMgdGhlIHR5cGUgb2YKKwkgKglpbnRlcnJ1cHQsIGV4ZWN1dGVzIHRoZSBhcHByb3ByaWF0ZSBzdWJoYW5kbGVyLCBhbmQKKwkgKglhY2tub3dkZ2VzIHRoZSBpbnRlcnJ1cHQgdG8gdGhlIGFkYXB0ZXIgKHRodXMKKwkgKglyZS1lbmFibGluZyBhZGFwdGVyIGludGVycnVwdHMuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBUTGFuX0hhbmRsZUludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMgkJYWNrOworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CisJdTMyCQlob3N0X2NtZDsKKwl1MTYJCWhvc3RfaW50OworCWludAkJdHlwZTsKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXY7CisKKwlkZXYgPSBkZXZfaWQ7CisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCisJaG9zdF9pbnQgPSBpbncoIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0lOVCApOworCW91dHcoIGhvc3RfaW50LCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9JTlQgKTsKKworCXR5cGUgPSAoIGhvc3RfaW50ICYgVExBTl9ISV9JVF9NQVNLICkgPj4gMjsKKworCWFjayA9IFRMYW5JbnRWZWN0b3JbdHlwZV0oIGRldiwgaG9zdF9pbnQgKTsKKworCWlmICggYWNrICkgeworCQlob3N0X2NtZCA9IFRMQU5fSENfQUNLIHwgYWNrIHwgKCB0eXBlIDw8IDE4ICk7CisJCW91dGwoIGhvc3RfY21kLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKKwl9CisKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9IC8qIFRMYW5fSGFuZGxlSW50ZXJydXB0cyAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fQ2xvc2UKKwkgKiAgCisJICogCVJldHVybnM6CisJICoJCUFuIGVycm9yIGNvZGUuCisJICoJUGFybXM6CisJICoJCWRldglUaGUgZGV2aWNlIHN0cnVjdHVyZSBvZiB0aGUgZGV2aWNlIHRvCisJICoJCQljbG9zZS4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gc2h1dHMgZG93biB0aGUgYWRhcHRlci4gIEl0IHJlY29yZHMgYW55CisJICoJc3RhdHMsIHB1dHMgdGhlIGFkYXB0ZXIgaW50byByZXNldCBzdGF0ZSwgZGVhY3RpdmF0ZXMKKwkgKglpdHMgdGltZSBhcyBuZWVkZWQsIGFuZAlmcmVlcyB0aGUgaXJxIGl0IGlzIHVzaW5nLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IFRMYW5fQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXByaXYtPm5lZ19iZV92ZXJib3NlID0gMDsKKworCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9SRUNPUkQgKTsKKwlvdXRsKCBUTEFOX0hDX0FEX1JTVCwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICk7CisJaWYgKCBwcml2LT50aW1lci5mdW5jdGlvbiAhPSBOVUxMICkgeworCQlkZWxfdGltZXJfc3luYyggJnByaXYtPnRpbWVyICk7CisJCXByaXYtPnRpbWVyLmZ1bmN0aW9uID0gTlVMTDsKKwl9CisJCisJZnJlZV9pcnEoIGRldi0+aXJxLCBkZXYgKTsKKwlUTGFuX0ZyZWVMaXN0cyggZGV2ICk7CisJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIkRldmljZSAlcyBjbG9zZWQuXG4iLCBkZXYtPm5hbWUgKTsKKworCXJldHVybiAwOworCit9IC8qIFRMYW5fQ2xvc2UgKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0dldFN0YXRzCisJICogIAorCSAqCVJldHVybnM6CisJICoJCUEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3Mgc3RhdGlzdGljcyBzdHJ1Y3R1cmUuCisJICoJUGFybXM6CisJICoJCWRldglUaGUgZGV2aWNlIHN0cnVjdHVyZSB0byByZXR1cm4gdGhlCisJICoJCQlzdGF0cyBmb3IuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGRldmljZXMgc3RhdGlzdGljcyBieSByZWFkaW5nCisJICoJdGhlIFRMQU4gY2hpcCdzIG9uYm9hcmQgcmVnaXN0ZXJzLiAgVGhlbiBpdCByZXR1cm5zIHRoZQorCSAqCWFkZHJlc3Mgb2YgdGhlIHN0YXRpc3RpY3Mgc3RydWN0dXJlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlRMYW5fR2V0U3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwkvKiBTaG91bGQgb25seSByZWFkIHN0YXRzIGlmIG9wZW4gPyAqLworCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9SRUNPUkQgKTsKKworCVRMQU5fREJHKCBUTEFOX0RFQlVHX1JYLCAiUkVDRUlWRTogICVzIEVPQyBjb3VudCA9ICVkXG4iLCBkZXYtPm5hbWUsIHByaXYtPnJ4RW9jQ291bnQgKTsKKwlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgJXMgQnVzeSBjb3VudCA9ICVkXG4iLCBkZXYtPm5hbWUsIHByaXYtPnR4QnVzeUNvdW50ICk7CisJaWYgKCBkZWJ1ZyAmIFRMQU5fREVCVUdfR05STCApIHsKKwkJVExhbl9QcmludERpbyggZGV2LT5iYXNlX2FkZHIgKTsKKwkJVExhbl9QaHlQcmludCggZGV2ICk7CQkKKwl9CisJaWYgKCBkZWJ1ZyAmIFRMQU5fREVCVUdfTElTVCApIHsKKwkJZm9yICggaSA9IDA7IGkgPCBUTEFOX05VTV9SWF9MSVNUUzsgaSsrICkKKwkJCVRMYW5fUHJpbnRMaXN0KCBwcml2LT5yeExpc3QgKyBpLCAiUlgiLCBpICk7CisJCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fVFhfTElTVFM7IGkrKyApCisJCQlUTGFuX1ByaW50TGlzdCggcHJpdi0+dHhMaXN0ICsgaSwgIlRYIiwgaSApOworCX0KKwkKKwlyZXR1cm4gKCAmKCAoVExhblByaXZhdGVJbmZvICopIG5ldGRldl9wcml2KGRldikgKS0+c3RhdHMgKTsKKworfSAvKiBUTGFuX0dldFN0YXRzICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9TZXRNdWx0aWNhc3RMaXN0CisJICogIAorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJZGV2CVRoZSBkZXZpY2Ugc3RydWN0dXJlIHRvIHNldCB0aGUKKwkgKgkJCW11bHRpY2FzdCBsaXN0IGZvci4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgVExBTiBhZGFwdG9yIHRvIHZhcmlvdXMgcmVjZWl2ZQorCSAqCW1vZGVzLiAgSWYgdGhlIElGRl9QUk9NSVNDIGZsYWcgaXMgc2V0LCBwcm9taXNjdW91cworCSAqCW1vZGUgaXMgYWNpdHZpYXRlZC4gIE90aGVyd2lzZSwJcHJvbWlzY3VvdXMgbW9kZSBpcworCSAqCXR1cm5lZCBvZmYuICBJZiB0aGUgSUZGX0FMTE1VTFRJIGZsYWcgaXMgc2V0LCB0aGVuCisJICoJdGhlIGhhc2ggdGFibGUgaXMgc2V0IHRvIHJlY2VpdmUgYWxsIGdyb3VwIGFkZHJlc3Nlcy4KKwkgKglPdGhlcndpc2UsIHRoZSBmaXJzdCB0aHJlZSBtdWx0aWNhc3QgYWRkcmVzc2VzIGFyZQorCSAqCXN0b3JlZCBpbiBBUkVHXzEtMywgYW5kIHRoZSByZXN0IGFyZSBzZWxlY3RlZCB2aWEgdGhlCisJICoJaGFzaCB0YWJsZSwgYXMgbmVjZXNzYXJ5LgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBUTGFuX1NldE11bHRpY2FzdExpc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQorewkKKwlzdHJ1Y3QgZGV2X21jX2xpc3QJKmRtaSA9IGRldi0+bWNfbGlzdDsKKwl1MzIJCQloYXNoMSA9IDA7CisJdTMyCQkJaGFzaDIgPSAwOworCWludAkJCWk7CisJdTMyCQkJb2Zmc2V0OworCXU4CQkJdG1wOworCisJaWYgKCBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgKSB7CisJCXRtcCA9IFRMYW5fRGlvUmVhZDgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DTUQgKTsKKwkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DTUQsIHRtcCB8IFRMQU5fTkVUX0NNRF9DQUYgKTsKKwl9IGVsc2UgeworCQl0bXAgPSBUTGFuX0Rpb1JlYWQ4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ01EICk7CisJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ01ELCB0bXAgJiB+VExBTl9ORVRfQ01EX0NBRiApOworCQlpZiAoIGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgKSB7CisJCQlmb3IgKCBpID0gMDsgaSA8IDM7IGkrKyApIAorCQkJCVRMYW5fU2V0TWFjKCBkZXYsIGkgKyAxLCBOVUxMICk7CisJCQlUTGFuX0Rpb1dyaXRlMzIoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0hBU0hfMSwgMHhGRkZGRkZGRiApOworCQkJVExhbl9EaW9Xcml0ZTMyKCBkZXYtPmJhc2VfYWRkciwgVExBTl9IQVNIXzIsIDB4RkZGRkZGRkYgKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoIGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrICkgeworCQkJCWlmICggaSA8IDMgKSB7CisJCQkJCVRMYW5fU2V0TWFjKCBkZXYsIGkgKyAxLCAoY2hhciAqKSAmZG1pLT5kbWlfYWRkciApOworCQkJCX0gZWxzZSB7CisJCQkJCW9mZnNldCA9IFRMYW5fSGFzaEZ1bmMoICh1OCAqKSAmZG1pLT5kbWlfYWRkciApOworCQkJCQlpZiAoIG9mZnNldCA8IDMyICkgCisJCQkJCQloYXNoMSB8PSAoIDEgPDwgb2Zmc2V0ICk7CisJCQkJCWVsc2UKKwkJCQkJCWhhc2gyIHw9ICggMSA8PCAoIG9mZnNldCAtIDMyICkgKTsKKwkJCQl9CisJCQkJZG1pID0gZG1pLT5uZXh0OworCQkJfQorCQkJZm9yICggOyBpIDwgMzsgaSsrICkgCisJCQkJVExhbl9TZXRNYWMoIGRldiwgaSArIDEsIE5VTEwgKTsKKwkJCVRMYW5fRGlvV3JpdGUzMiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fSEFTSF8xLCBoYXNoMSApOworCQkJVExhbl9EaW9Xcml0ZTMyKCBkZXYtPmJhc2VfYWRkciwgVExBTl9IQVNIXzIsIGhhc2gyICk7CisJCX0KKwl9CisKK30gLyogVExhbl9TZXRNdWx0aWNhc3RMaXN0ICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIFRodW5kZXJMQU4gRHJpdmVyIEludGVycnVwdCBWZWN0b3JzIGFuZCBUYWJsZQorCisJUGxlYXNlIHNlZSBDaGFwLiA0LCAiSW50ZXJydXB0IEhhbmRsaW5nIiBvZiB0aGUgIlRodW5kZXJMQU4KKwlQcm9ncmFtbWVyJ3MgR3VpZGUiIGZvciBtb3JlIGluZm9ybWF0aW9ucyBvbiBoYW5kbGluZyBpbnRlcnJ1cHRzCisJZ2VuZXJhdGVkIGJ5IFRMQU4gYmFzZWQgYWRhcHRlcnMuICAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fSGFuZGxlSW52YWxpZAorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMAorCSAqCVBhcm1zOgorCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCisJICoJCQkJcmFpc2VkLgorCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCisJICoJCQkJcG9ydC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyBpbnZhbGlkIGludGVycnVwdHMuICBUaGlzIHNob3VsZAorCSAqCW5ldmVyIGhhcHBlbiB1bmxlc3Mgc29tZSBvdGhlciBhZGFwdGVyIGlzIHRyeWluZyB0byB1c2UKKwkgKgl0aGUgSVJRIGxpbmUgYXNzaWduZWQgdG8gdGhlIGRldmljZS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIFRMYW5fSGFuZGxlSW52YWxpZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKK3sKKwkvKiBwcmludGsoICJUTEFOOiAgSW52YWxpZCBpbnRlcnJ1cHQgb24gJXMuXG4iLCBkZXYtPm5hbWUgKTsgKi8KKwlyZXR1cm4gMDsKKworfSAvKiBUTGFuX0hhbmRsZUludmFsaWQgKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0hhbmRsZVR4RU9GCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkxCisJICoJUGFybXM6CisJICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKKwkgKgkJCQlyYWlzZWQuCisJICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKKwkgKgkJCQlwb3J0LgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFR4IEVPRiBpbnRlcnJ1cHRzIHdoaWNoIGFyZSByYWlzZWQKKwkgKglieSB0aGUgYWRhcHRlciB3aGVuIGl0IGhhcyBjb21wbGV0ZWQgc2VuZGluZyB0aGUKKwkgKgljb250ZW50cyBvZiBhIGJ1ZmZlci4gIElmIGRldGVtaW5lcyB3aGljaCBsaXN0L2J1ZmZlcgorCSAqCXdhcyBjb21wbGV0ZWQgYW5kIHJlc2V0cyBpdC4gIElmIHRoZSBidWZmZXIgd2FzIHRoZSBsYXN0CisJICoJaW4gdGhlIGNoYW5uZWwgKEVPQyksIHRoZW4gdGhlIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYKKwkgKglhbm90aGVyIGJ1ZmZlciBpcyByZWFkeSB0byBzZW5kLCBhbmQgaWYgc28sIHNlbmRzIGEgVHgKKwkgKglHbyBjb21tYW5kLiAgRmluYWxseSwgdGhlIGRyaXZlciBhY3RpdmF0ZXMvY29udGludWVzIHRoZQorCSAqCWFjdGl2aXR5IExFRC4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIFRMYW5fSGFuZGxlVHhFT0YoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBob3N0X2ludCApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQJCWVvYyA9IDA7CisJVExhbkxpc3QJKmhlYWRfbGlzdDsKKwlkbWFfYWRkcl90CWhlYWRfbGlzdF9waHlzOworCXUzMgkJYWNrID0gMDsKKwl1MTYJCXRtcENTdGF0OworCQorCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICBIYW5kbGluZyBUWCBFT0YgKEhlYWQ9JWQgVGFpbD0lZClcbiIsIHByaXYtPnR4SGVhZCwgcHJpdi0+dHhUYWlsICk7CisJaGVhZF9saXN0ID0gcHJpdi0+dHhMaXN0ICsgcHJpdi0+dHhIZWFkOworCisJd2hpbGUgKCgodG1wQ1N0YXQgPSBoZWFkX2xpc3QtPmNTdGF0ICkgJiBUTEFOX0NTVEFUX0ZSTV9DTVApICYmIChhY2sgPCAyNTUpKSB7CisJCWFjaysrOworCQlpZiAoICEgYmJ1ZiApIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBUTGFuX0dldFNLQihoZWFkX2xpc3QpOworCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wY2lEZXYsIGhlYWRfbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQloZWFkX2xpc3QtPmJ1ZmZlcls4XS5hZGRyZXNzID0gMDsKKwkJCWhlYWRfbGlzdC0+YnVmZmVyWzldLmFkZHJlc3MgPSAwOworCQl9CisJCisJCWlmICggdG1wQ1N0YXQgJiBUTEFOX0NTVEFUX0VPQyApCisJCQllb2MgPSAxOworCQkJCisJCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IGhlYWRfbGlzdC0+ZnJhbWVTaXplOworCisJCWhlYWRfbGlzdC0+Y1N0YXQgPSBUTEFOX0NTVEFUX1VOVVNFRDsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsJCQorCQlDSVJDX0lOQyggcHJpdi0+dHhIZWFkLCBUTEFOX05VTV9UWF9MSVNUUyApOyAKKwkJaGVhZF9saXN0ID0gcHJpdi0+dHhMaXN0ICsgcHJpdi0+dHhIZWFkOworCX0KKworCWlmICghYWNrKQorCQlwcmludGsoS0VSTl9JTkZPICJUTEFOOiBSZWNlaXZlZCBpbnRlcnJ1cHQgZm9yIHVuY29tcGxldGVkIFRYIGZyYW1lLlxuIik7CisJCisJaWYgKCBlb2MgKSB7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICBIYW5kbGluZyBUWCBFT0MgKEhlYWQ9JWQgVGFpbD0lZClcbiIsIHByaXYtPnR4SGVhZCwgcHJpdi0+dHhUYWlsICk7CisJCWhlYWRfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4SGVhZDsKKwkJaGVhZF9saXN0X3BoeXMgPSBwcml2LT50eExpc3RETUEgKyBzaXplb2YoVExhbkxpc3QpICogcHJpdi0+dHhIZWFkOworCQlpZiAoICggaGVhZF9saXN0LT5jU3RhdCAmIFRMQU5fQ1NUQVRfUkVBRFkgKSA9PSBUTEFOX0NTVEFUX1JFQURZICkgeworCQkJb3V0bChoZWFkX2xpc3RfcGh5cywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKKwkJCWFjayB8PSBUTEFOX0hDX0dPOworCQl9IGVsc2UgeworCQkJcHJpdi0+dHhJblByb2dyZXNzID0gMDsKKwkJfQorCX0KKwkKKwlpZiAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCApIHsKKwkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0xFRF9SRUcsIFRMQU5fTEVEX0xJTksgfCBUTEFOX0xFRF9BQ1QgKTsKKwkJaWYgKCBwcml2LT50aW1lci5mdW5jdGlvbiA9PSBOVUxMICkgeworCQkJIHByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJlRMYW5fVGltZXI7CisJCQkgcHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJCQkgcHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBUTEFOX1RJTUVSX0FDVF9ERUxBWTsKKwkJCSBwcml2LT50aW1lclNldEF0ID0gamlmZmllczsKKwkJCSBwcml2LT50aW1lclR5cGUgPSBUTEFOX1RJTUVSX0FDVElWSVRZOworCQkJIGFkZF90aW1lcigmcHJpdi0+dGltZXIpOworCQl9IGVsc2UgaWYgKCBwcml2LT50aW1lclR5cGUgPT0gVExBTl9USU1FUl9BQ1RJVklUWSApIHsKKwkJCXByaXYtPnRpbWVyU2V0QXQgPSBqaWZmaWVzOworCQl9CisJfQorCisJcmV0dXJuIGFjazsKKworfSAvKiBUTGFuX0hhbmRsZVR4RU9GICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9IYW5kbGVTdGF0T3ZlcmZsb3cKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTEKKwkgKglQYXJtczoKKwkgKgkJZGV2CQlEZXZpY2UgYXNzaWduZWQgdGhlIElSUSB0aGF0IHdhcworCSAqCQkJCXJhaXNlZC4KKwkgKgkJaG9zdF9pbnQJVGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0lOVAorCSAqCQkJCXBvcnQuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIFN0YXRpc3RpY3MgT3ZlcmZsb3cgaW50ZXJydXB0CisJICoJd2hpY2ggbWVhbnMgdGhhdCBvbmUgb3IgbW9yZSBvZiB0aGUgVExBTiBzdGF0aXN0aWNzCisJICoJcmVnaXN0ZXJzIGhhcyByZWFjaGVkIDEvMiBjYXBhY2l0eSBhbmQgbmVlZHMgdG8gYmUgcmVhZC4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIFRMYW5fSGFuZGxlU3RhdE92ZXJmbG93KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQoreworCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9SRUNPUkQgKTsKKworCXJldHVybiAxOworCit9IC8qIFRMYW5fSGFuZGxlU3RhdE92ZXJmbG93ICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9IYW5kbGVSeEVPRgorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMQorCSAqCVBhcm1zOgorCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCisJICoJCQkJcmFpc2VkLgorCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCisJICoJCQkJcG9ydC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgUnggRU9GIGludGVycnVwdCB3aGljaAorCSAqCWluZGljYXRlcyBhIGZyYW1lIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IHRoZSBhZGFwdGVyIGZyb20KKwkgKgl0aGUgbmV0IGFuZCB0aGUgZnJhbWUgaGFzIGJlZW4gdHJhbnNmZXJyZWQgdG8gbWVtb3J5LgorCSAqCVRoZSBmdW5jdGlvbiBkZXRlcm1pbmVzIHRoZSBib3VuY2UgYnVmZmVyIHRoZSBmcmFtZSBoYXMKKwkgKgliZWVuIGxvYWRlZCBpbnRvLCBjcmVhdGVzIGEgbmV3IHNrX2J1ZmYgYmlnIGVub3VnaCB0bworCSAqCWhvbGQgdGhlIGZyYW1lLCBhbmQgc2VuZHMgaXQgdG8gcHJvdG9jb2wgc3RhY2suICBJdAorCSAqCXRoZW4gcmVzZXRzIHRoZSB1c2VkIGJ1ZmZlciBhbmQgYXBwZW5kcyBpdCB0byB0aGUgZW5kCisJICoJb2YgdGhlIGxpc3QuICBJZiB0aGUgZnJhbWUgd2FzIHRoZSBsYXN0IGluIHRoZSBSeAorCSAqCWNoYW5uZWwgKEVPQyksIHRoZSBmdW5jdGlvbiByZXN0YXJ0cyB0aGUgcmVjZWl2ZSBjaGFubmVsCisJICoJYnkgc2VuZGluZyBhbiBSeCBHbyBjb21tYW5kIHRvIHRoZSBhZGFwdGVyLiAgVGhlbiBpdAorCSAqCWFjdGl2YXRlcy9jb250aW51ZXMgdGhlIGFjdGl2aXR5IExFRC4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIFRMYW5fSGFuZGxlUnhFT0YoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBob3N0X2ludCApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIJCWFjayA9IDA7CisJaW50CQllb2MgPSAwOworCXU4CQkqaGVhZF9idWZmZXI7CisJVExhbkxpc3QJKmhlYWRfbGlzdDsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCVRMYW5MaXN0CSp0YWlsX2xpc3Q7CisJdm9pZAkJKnQ7CisJdTMyCQlmcmFtZVNpemU7CisJdTE2CQl0bXBDU3RhdDsKKwlkbWFfYWRkcl90CWhlYWRfbGlzdF9waHlzOworCisJVExBTl9EQkcoIFRMQU5fREVCVUdfUlgsICJSRUNFSVZFOiAgSGFuZGxpbmcgUlggRU9GIChIZWFkPSVkIFRhaWw9JWQpXG4iLCBwcml2LT5yeEhlYWQsIHByaXYtPnJ4VGFpbCApOworCWhlYWRfbGlzdCA9IHByaXYtPnJ4TGlzdCArIHByaXYtPnJ4SGVhZDsKKwloZWFkX2xpc3RfcGh5cyA9IHByaXYtPnJ4TGlzdERNQSArIHNpemVvZihUTGFuTGlzdCkgKiBwcml2LT5yeEhlYWQ7CisJCisJd2hpbGUgKCgodG1wQ1N0YXQgPSBoZWFkX2xpc3QtPmNTdGF0KSAmIFRMQU5fQ1NUQVRfRlJNX0NNUCkgJiYgKGFjayA8IDI1NSkpIHsKKwkJZnJhbWVTaXplID0gaGVhZF9saXN0LT5mcmFtZVNpemU7CisJCWFjaysrOworCQlpZiAodG1wQ1N0YXQgJiBUTEFOX0NTVEFUX0VPQykKKwkJCWVvYyA9IDE7CisJCQorCQlpZiAoYmJ1ZikgeworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihmcmFtZVNpemUgKyA3KTsKKwkJCWlmIChza2IgPT0gTlVMTCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICJUTEFOOiBDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY2VpdmVkIGRhdGEuXG4iKTsKKwkJCWVsc2UgeworCQkJCWhlYWRfYnVmZmVyID0gcHJpdi0+cnhCdWZmZXIgKyAocHJpdi0+cnhIZWFkICogVExBTl9NQVhfRlJBTUVfU0laRSk7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJCQl0ID0gKHZvaWQgKikgc2tiX3B1dChza2IsIGZyYW1lU2l6ZSk7CisJCQorCQkJCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IGhlYWRfbGlzdC0+ZnJhbWVTaXplOworCisJCQkJbWVtY3B5KCB0LCBoZWFkX2J1ZmZlciwgZnJhbWVTaXplICk7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOworCQkJCW5ldGlmX3J4KCBza2IgKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCQkKKwkJCS8qCisJCSAJICoJSSBjaGFuZ2VkIHRoZSBhbGdvcml0aG0gaGVyZS4gV2hhdCB3ZSBub3cgZG8KKwkJIAkgKglpcyBhbGxvY2F0ZSB0aGUgbmV3IGZyYW1lLiBJZiB0aGlzIGZhaWxzIHdlCisJCSAJICoJc2ltcGx5IHJlY3ljbGUgdGhlIGZyYW1lLgorCQkgCSAqLworCQkKKwkJCW5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKCBUTEFOX01BWF9GUkFNRV9TSVpFICsgNyApOworCQkJCisJCQlpZiAoIG5ld19za2IgIT0gTlVMTCApIHsKKwkJCQlza2IgPSBUTGFuX0dldFNLQihoZWFkX2xpc3QpOworCQkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGNpRGV2LCBoZWFkX2xpc3QtPmJ1ZmZlclswXS5hZGRyZXNzLCBUTEFOX01BWF9GUkFNRV9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXNrYl90cmltKCBza2IsIGZyYW1lU2l6ZSApOworCisJCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gZnJhbWVTaXplOworCisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOworCQkJCW5ldGlmX3J4KCBza2IgKTsKKwkKKwkJCQluZXdfc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoIG5ld19za2IsIDIgKTsKKwkJCQl0ID0gKHZvaWQgKikgc2tiX3B1dCggbmV3X3NrYiwgVExBTl9NQVhfRlJBTUVfU0laRSApOworCQkJCWhlYWRfbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wY2lEZXYsIG5ld19za2ItPmRhdGEsIFRMQU5fTUFYX0ZSQU1FX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJaGVhZF9saXN0LT5idWZmZXJbOF0uYWRkcmVzcyA9ICh1MzIpIHQ7CisJCQkJVExhbl9TdG9yZVNLQihoZWFkX2xpc3QsIG5ld19za2IpOworCQkJfSBlbHNlIAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlRMQU46ICBDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY2VpdmVkIGRhdGEuXG4iICk7CisJCX0KKworCQloZWFkX2xpc3QtPmZvcndhcmQgPSAwOworCQloZWFkX2xpc3QtPmNTdGF0ID0gMDsKKwkJdGFpbF9saXN0ID0gcHJpdi0+cnhMaXN0ICsgcHJpdi0+cnhUYWlsOworCQl0YWlsX2xpc3QtPmZvcndhcmQgPSBoZWFkX2xpc3RfcGh5czsKKworCQlDSVJDX0lOQyggcHJpdi0+cnhIZWFkLCBUTEFOX05VTV9SWF9MSVNUUyApOworCQlDSVJDX0lOQyggcHJpdi0+cnhUYWlsLCBUTEFOX05VTV9SWF9MSVNUUyApOworCQloZWFkX2xpc3QgPSBwcml2LT5yeExpc3QgKyBwcml2LT5yeEhlYWQ7CisJCWhlYWRfbGlzdF9waHlzID0gcHJpdi0+cnhMaXN0RE1BICsgc2l6ZW9mKFRMYW5MaXN0KSAqIHByaXYtPnJ4SGVhZDsKKwl9CisKKwlpZiAoIWFjaykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogUmVjZWl2ZWQgaW50ZXJydXB0IGZvciB1bmNvbXBsZXRlZCBSWCBmcmFtZS5cbiIpOworCQorCisKKworCWlmICggZW9jICkgeyAKKwkJVExBTl9EQkcoIFRMQU5fREVCVUdfUlgsICJSRUNFSVZFOiAgSGFuZGxpbmcgUlggRU9DIChIZWFkPSVkIFRhaWw9JWQpXG4iLCBwcml2LT5yeEhlYWQsIHByaXYtPnJ4VGFpbCApOworCQloZWFkX2xpc3QgPSBwcml2LT5yeExpc3QgKyBwcml2LT5yeEhlYWQ7CisJCWhlYWRfbGlzdF9waHlzID0gcHJpdi0+cnhMaXN0RE1BICsgc2l6ZW9mKFRMYW5MaXN0KSAqIHByaXYtPnJ4SGVhZDsKKwkJb3V0bChoZWFkX2xpc3RfcGh5cywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKKwkJYWNrIHw9IFRMQU5fSENfR08gfCBUTEFOX0hDX1JUOworCQlwcml2LT5yeEVvY0NvdW50Kys7CisJfQorCisJaWYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQgKSB7CisJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9MRURfUkVHLCBUTEFOX0xFRF9MSU5LIHwgVExBTl9MRURfQUNUICk7CisJCWlmICggcHJpdi0+dGltZXIuZnVuY3Rpb24gPT0gTlVMTCApICB7CisJCQlwcml2LT50aW1lci5mdW5jdGlvbiA9ICZUTGFuX1RpbWVyOworCQkJcHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJCQlwcml2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIFRMQU5fVElNRVJfQUNUX0RFTEFZOworCQkJcHJpdi0+dGltZXJTZXRBdCA9IGppZmZpZXM7CisJCQlwcml2LT50aW1lclR5cGUgPSBUTEFOX1RJTUVSX0FDVElWSVRZOworCQkJYWRkX3RpbWVyKCZwcml2LT50aW1lcik7CisJCX0gZWxzZSBpZiAoIHByaXYtPnRpbWVyVHlwZSA9PSBUTEFOX1RJTUVSX0FDVElWSVRZICkgeworCQkJcHJpdi0+dGltZXJTZXRBdCA9IGppZmZpZXM7CisJCX0KKwl9CisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQorCXJldHVybiBhY2s7CisKK30gLyogVExhbl9IYW5kbGVSeEVPRiAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fSGFuZGxlRHVtbXkKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTEKKwkgKglQYXJtczoKKwkgKgkJZGV2CQlEZXZpY2UgYXNzaWduZWQgdGhlIElSUSB0aGF0IHdhcworCSAqCQkJCXJhaXNlZC4KKwkgKgkJaG9zdF9pbnQJVGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0lOVAorCSAqCQkJCXBvcnQuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIER1bW15IGludGVycnVwdCwgd2hpY2ggaXMKKwkgKglyYWlzZWQgd2hlbmV2ZXIgYSB0ZXN0IGludGVycnVwdCBpcyBnZW5lcmF0ZWQgYnkgc2V0dGluZworCSAqCXRoZSBSZXFfSW50IGJpdCBvZiBIT1NUX0NNRCB0byAxLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgVExhbl9IYW5kbGVEdW1teSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKK3sKKwlwcmludGsoICJUTEFOOiAgVGVzdCBpbnRlcnJ1cHQgb24gJXMuXG4iLCBkZXYtPm5hbWUgKTsKKwlyZXR1cm4gMTsKKworfSAvKiBUTGFuX0hhbmRsZUR1bW15ICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9IYW5kbGVUeEVPQworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMQorCSAqCVBhcm1zOgorCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCisJICoJCQkJcmFpc2VkLgorCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCisJICoJCQkJcG9ydC4KKwkgKgorCSAqCVRoaXMgZHJpdmVyIGlzIHN0cnVjdHVyZWQgdG8gZGV0ZXJtaW5lIEVPQyBvY2N1cnJlbmNlcyBieQorCSAqCXJlYWRpbmcgdGhlIENTVEFUIG1lbWJlciBvZiB0aGUgbGlzdCBzdHJ1Y3R1cmUuICBUeCBFT0MKKwkgKglpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCB2aWEgdGhlIERJTyBJTlRESVMgcmVnaXN0ZXIuCisJICoJSG93ZXZlciwgVExBTiBjaGlwcyBiZWZvcmUgcmV2aXNpb24gMy4wIGRpZG4ndCBoYXZlIHRoaXMKKwkgKglmdW5jdGlvbmFsaXR5LCBzbyBwcm9jZXNzIEVPQyBldmVudHMgaWYgdGhpcyBpcyB0aGUKKwkgKgljYXNlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgVExhbl9IYW5kbGVUeEVPQyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCVRMYW5MaXN0CQkqaGVhZF9saXN0OworCWRtYV9hZGRyX3QJCWhlYWRfbGlzdF9waHlzOworCXUzMgkJCWFjayA9IDE7CisJCisJaG9zdF9pbnQgPSAwOworCWlmICggcHJpdi0+dGxhblJldiA8IDB4MzAgKSB7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICBIYW5kbGluZyBUWCBFT0MgKEhlYWQ9JWQgVGFpbD0lZCkgLS0gSVJRXG4iLCBwcml2LT50eEhlYWQsIHByaXYtPnR4VGFpbCApOworCQloZWFkX2xpc3QgPSBwcml2LT50eExpc3QgKyBwcml2LT50eEhlYWQ7CisJCWhlYWRfbGlzdF9waHlzID0gcHJpdi0+dHhMaXN0RE1BICsgc2l6ZW9mKFRMYW5MaXN0KSAqIHByaXYtPnR4SGVhZDsKKwkJaWYgKCAoIGhlYWRfbGlzdC0+Y1N0YXQgJiBUTEFOX0NTVEFUX1JFQURZICkgPT0gVExBTl9DU1RBVF9SRUFEWSApIHsKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCW91dGwoIGhlYWRfbGlzdF9waHlzLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fQ0hfUEFSTSApOworCQkJYWNrIHw9IFRMQU5fSENfR087CisJCX0gZWxzZSB7CisJCQlwcml2LT50eEluUHJvZ3Jlc3MgPSAwOworCQl9CisJfQorCisJcmV0dXJuIGFjazsKKworfSAvKiBUTGFuX0hhbmRsZVR4RU9DICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9IYW5kbGVTdGF0dXNDaGVjaworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMCBpZiBBZGFwdGVyIGNoZWNrLCAxIGlmIE5ldHdvcmsgU3RhdHVzIGNoZWNrLgorCSAqCVBhcm1zOgorCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCisJICoJCQkJcmFpc2VkLgorCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCisJICoJCQkJcG9ydC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyBBZGFwdGVyIENoZWNrL05ldHdvcmsgU3RhdHVzCisJICoJaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkgdGhlIGFkYXB0ZXIuICBJdCBjaGVja3MgdGhlCisJICoJdmVjdG9yIGluIHRoZSBIT1NUX0lOVCByZWdpc3RlciB0byBkZXRlcm1pbmUgaWYgaXQgaXMKKwkgKglhbiBBZGFwdGVyIENoZWNrIGludGVycnVwdC4gIElmIHNvLCBpdCByZXNldHMgdGhlCisJICoJYWRhcHRlci4gIE90aGVyd2lzZSBpdCBjbGVhcnMgdGhlIHN0YXR1cyByZWdpc3RlcnMKKwkgKglhbmQgc2VydmljZXMgdGhlIFBIWS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIFRMYW5fSGFuZGxlU3RhdHVzQ2hlY2soIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBob3N0X2ludCApCit7CQorCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyCQlhY2s7CisJdTMyCQllcnJvcjsKKwl1OAkJbmV0X3N0czsKKwl1MzIJCXBoeTsKKwl1MTYJCXRscGh5X2N0bDsKKwl1MTYJCXRscGh5X3N0czsKKwkKKwlhY2sgPSAxOworCWlmICggaG9zdF9pbnQgJiBUTEFOX0hJX0lWX01BU0sgKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoIGRldiApOworCQllcnJvciA9IGlubCggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKKwkJcHJpbnRrKCAiVExBTjogICVzOiBBZGFwdG9yIEVycm9yID0gMHgleFxuIiwgZGV2LT5uYW1lLCBlcnJvciApOworCQlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBkZXYsIFRMQU5fUkVDT1JEICk7CisJCW91dGwoIFRMQU5fSENfQURfUlNULCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKKworCQlzY2hlZHVsZV93b3JrKCZwcml2LT50bGFuX3RxdWV1ZSk7CisKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlhY2sgPSAwOworCX0gZWxzZSB7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogU3RhdHVzIENoZWNrXG4iLCBkZXYtPm5hbWUgKTsKKwkJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisKKwkJbmV0X3N0cyA9IFRMYW5fRGlvUmVhZDgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9TVFMgKTsKKwkJaWYgKCBuZXRfc3RzICkgeworCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9TVFMsIG5ldF9zdHMgKTsKKwkJCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogICAgTmV0X1N0cyA9ICV4XG4iLCBkZXYtPm5hbWUsICh1bnNpZ25lZCkgbmV0X3N0cyApOworCQl9CisJCWlmICggKCBuZXRfc3RzICYgVExBTl9ORVRfU1RTX01JUlEgKSAmJiAgKCBwcml2LT5waHlOdW0gPT0gMCApICkgeworCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9TVFMsICZ0bHBoeV9zdHMgKTsKKwkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCAmdGxwaHlfY3RsICk7CisgICAgICAgIAkJaWYgKCAhICggdGxwaHlfc3RzICYgVExBTl9UU19QT0xPSyApICYmICEgKCB0bHBoeV9jdGwgJiBUTEFOX1RDX1NXQVBPTCApICkgeworICAgICAgICAgICAgICAgIAkJdGxwaHlfY3RsIHw9IFRMQU5fVENfU1dBUE9MOworICAgICAgICAgICAgICAgIAkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCB0bHBoeV9jdGwpOworICAgICAgICAJCX0gZWxzZSBpZiAoICggdGxwaHlfc3RzICYgVExBTl9UU19QT0xPSyApICYmICggdGxwaHlfY3RsICYgVExBTl9UQ19TV0FQT0wgKSApIHsKKyAgICAgICAgICAgICAgICAJCXRscGh5X2N0bCAmPSB+VExBTl9UQ19TV0FQT0w7CisgICAgICAgICAgICAgICAgCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsIHRscGh5X2N0bCk7CisgICAgICAgIAkJfQorCisJCQlpZiAoZGVidWcpIHsKKwkJCQlUTGFuX1BoeVByaW50KCBkZXYgKTsJCQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGFjazsKKworfSAvKiBUTGFuX0hhbmRsZVN0YXR1c0NoZWNrICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9IYW5kbGVSeEVPQworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMQorCSAqCVBhcm1zOgorCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCisJICoJCQkJcmFpc2VkLgorCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCisJICoJCQkJcG9ydC4KKwkgKgorCSAqCVRoaXMgZHJpdmVyIGlzIHN0cnVjdHVyZWQgdG8gZGV0ZXJtaW5lIEVPQyBvY2N1cnJlbmNlcyBieQorCSAqCXJlYWRpbmcgdGhlIENTVEFUIG1lbWJlciBvZiB0aGUgbGlzdCBzdHJ1Y3R1cmUuICBSeCBFT0MKKwkgKglpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCB2aWEgdGhlIERJTyBJTlRESVMgcmVnaXN0ZXIuCisJICoJSG93ZXZlciwgVExBTiBjaGlwcyBiZWZvcmUgcmV2aXNpb24gMy4wIGRpZG4ndCBoYXZlIHRoaXMKKwkgKglDU1RBVCBtZW1iZXIgb3IgYSBJTlRESVMgcmVnaXN0ZXIsIHNvIGlmIHRoaXMgY2hpcCBpcworCSAqCXByZS0zLjAsIHByb2Nlc3MgRU9DIGludGVycnVwdHMgbm9ybWFsbHkuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UzMiBUTGFuX0hhbmRsZVJ4RU9DKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJZG1hX2FkZHJfdAloZWFkX2xpc3RfcGh5czsKKwl1MzIJCWFjayA9IDE7CisKKwlpZiAoICBwcml2LT50bGFuUmV2IDwgMHgzMCApIHsKKwkJVExBTl9EQkcoIFRMQU5fREVCVUdfUlgsICJSRUNFSVZFOiAgSGFuZGxpbmcgUlggRU9DIChIZWFkPSVkIFRhaWw9JWQpIC0tIElSUVxuIiwgcHJpdi0+cnhIZWFkLCBwcml2LT5yeFRhaWwgKTsKKwkJaGVhZF9saXN0X3BoeXMgPSBwcml2LT5yeExpc3RETUEgKyBzaXplb2YoVExhbkxpc3QpICogcHJpdi0+cnhIZWFkOworCQlvdXRsKCBoZWFkX2xpc3RfcGh5cywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKKwkJYWNrIHw9IFRMQU5fSENfR08gfCBUTEFOX0hDX1JUOworCQlwcml2LT5yeEVvY0NvdW50Kys7CisJfQorCisJcmV0dXJuIGFjazsKKworfSAvKiBUTGFuX0hhbmRsZVJ4RU9DICovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlUaHVuZGVyTEFOIERyaXZlciBUaW1lciBGdW5jdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9UaW1lcgorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlkYXRhCUEgdmFsdWUgZ2l2ZW4gdG8gYWRkIHRpbWVyIHdoZW4KKwkgKgkJCWFkZF90aW1lciB3YXMgY2FsbGVkLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRpbWVkIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZQorCSAqCVRMQU4gZHJpdmVyLiAgVGhlIHR3byBjdXJyZW50IHRpbWVyIHVzZXMgYXJlIGZvcgorCSAqCWRlbGF5aW5nIGZvciBhdXRvbmVnb3Rpb25hdGlvbiBhbmQgZHJpdmluZyB0aGUgQUNUIExFRC4KKwkgKgktCUF1dG9uZWdvdGlhdGlvbiByZXF1aXJlcyBiZWluZyBhbGxvd2VkIGFib3V0CisJICoJCTIgMS8yIHNlY29uZHMgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdHJhbnNtaXQgYQorCSAqCQlwYWNrZXQuICBJdCB3b3VsZCBiZSBhIHZlcnkgYmFkIHRoaW5nIHRvIGhhbmcKKwkgKgkJdGhlIGtlcm5lbCB0aGlzIGxvbmcsIHNvIHRoZSBkcml2ZXIgZG9lc24ndAorCSAqCQlhbGxvdyB0cmFuc21pc3Npb24gJ3RpbCBhZnRlciB0aGlzIHRpbWUsIGZvcgorCSAqCQljZXJ0YWluIFBIWXMuICBJdCB3b3VsZCBiZSBtdWNoIG5pY2VyIGlmIGFsbAorCSAqCQlQSFlzIHdlcmUgaW50ZXJydXB0LWNhcGFibGUgbGlrZSB0aGUgaW50ZXJuYWwKKwkgKgkJUEhZLgorCSAqCS0JVGhlIEFDVCBMRUQsIHdoaWNoIHNob3dzIGFkYXB0ZXIgYWN0aXZpdHksIGlzCisJICoJCWRyaXZlbiBieSB0aGUgZHJpdmVyLCBhbmQgc28gbXVzdCBiZSBsZWZ0IG9uCisJICoJCWZvciBhIHNob3J0IHBlcmlvZCB0byBwb3dlciB1cCB0aGUgTEVEIHNvIGl0CisJICoJCWNhbiBiZSBzZWVuLiAgVGhpcyBkZWxheSBjYW4gYmUgY2hhbmdlZCBieQorCSAqCQljaGFuZ2luZyB0aGUgVExBTl9USU1FUl9BQ1RfREVMQVkgaW4gdGxhbi5oLAorCSAqCQlpZiBkZXNpcmVkLiAgMTAwIG1zICBwcm9kdWNlcyBhIHNsaWdodGx5CisJICoJCXNsdWdnaXNoIHJlc3BvbnNlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fVGltZXIoIHVuc2lnbmVkIGxvbmcgZGF0YSApCit7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyCQllbGFwc2VkOworCXVuc2lnbmVkIGxvbmcJZmxhZ3MgPSAwOworCisJcHJpdi0+dGltZXIuZnVuY3Rpb24gPSBOVUxMOworCisJc3dpdGNoICggcHJpdi0+dGltZXJUeXBlICkgeworI2lmZGVmIE1PTklUT1IJCQorCQljYXNlIFRMQU5fVElNRVJfTElOS19CRUFUOgorCQkJVExhbl9QaHlNb25pdG9yKCBkZXYgKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgVExBTl9USU1FUl9QSFlfUERPV046CisJCQlUTGFuX1BoeVBvd2VyRG93biggZGV2ICk7CisJCQlicmVhazsKKwkJY2FzZSBUTEFOX1RJTUVSX1BIWV9QVVA6CisJCQlUTGFuX1BoeVBvd2VyVXAoIGRldiApOworCQkJYnJlYWs7CisJCWNhc2UgVExBTl9USU1FUl9QSFlfUkVTRVQ6CisJCQlUTGFuX1BoeVJlc2V0KCBkZXYgKTsKKwkJCWJyZWFrOworCQljYXNlIFRMQU5fVElNRVJfUEhZX1NUQVJUX0xJTks6CisJCQlUTGFuX1BoeVN0YXJ0TGluayggZGV2ICk7CisJCQlicmVhazsKKwkJY2FzZSBUTEFOX1RJTUVSX1BIWV9GSU5JU0hfQU46CisJCQlUTGFuX1BoeUZpbmlzaEF1dG9OZWcoIGRldiApOworCQkJYnJlYWs7CisJCWNhc2UgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQ6CisJCQlUTGFuX0ZpbmlzaFJlc2V0KCBkZXYgKTsKKwkJCWJyZWFrOworCQljYXNlIFRMQU5fVElNRVJfQUNUSVZJVFk6CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJaWYgKCBwcml2LT50aW1lci5mdW5jdGlvbiA9PSBOVUxMICkgeworCQkJCWVsYXBzZWQgPSBqaWZmaWVzIC0gcHJpdi0+dGltZXJTZXRBdDsKKwkJCQlpZiAoIGVsYXBzZWQgPj0gVExBTl9USU1FUl9BQ1RfREVMQVkgKSB7CisJCQkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9MRURfUkVHLCBUTEFOX0xFRF9MSU5LICk7CisJCQkJfSBlbHNlICB7CisJCQkJCXByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJlRMYW5fVGltZXI7CisJCQkJCXByaXYtPnRpbWVyLmV4cGlyZXMgPSBwcml2LT50aW1lclNldEF0ICsgVExBTl9USU1FUl9BQ1RfREVMQVk7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCQkJYWRkX3RpbWVyKCAmcHJpdi0+dGltZXIgKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKK30gLyogVExhbl9UaW1lciAqLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVGh1bmRlckxBTiBEcml2ZXIgQWRhcHRlciBSZWxhdGVkIFJvdXRpbmVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1Jlc2V0TGlzdHMKKwkgKiAgCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlkZXYJVGhlIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbGlzdAorCSAqCQkJc3R1Y3R1cmVzIHRvIGJlIHJlc2V0LgorCSAqCisJICoJVGhpcyByb3V0aW5lIHNldHMgdGhlIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggbWFuYWdpbmcKKwkgKgl0aGUgVExBTiBsaXN0cyB0byB0aGVpciBpbml0aWFsIHZhbHVlcy4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX1Jlc2V0TGlzdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50CQlpOworCVRMYW5MaXN0CSpsaXN0OworCWRtYV9hZGRyX3QJbGlzdF9waHlzOworCXN0cnVjdCBza19idWZmCSpza2I7CisJdm9pZAkJKnQgPSBOVUxMOworCisJcHJpdi0+dHhIZWFkID0gMDsKKwlwcml2LT50eFRhaWwgPSAwOworCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fVFhfTElTVFM7IGkrKyApIHsKKwkJbGlzdCA9IHByaXYtPnR4TGlzdCArIGk7CisJCWxpc3QtPmNTdGF0ID0gVExBTl9DU1RBVF9VTlVTRUQ7CisJCWlmICggYmJ1ZiApIHsKKwkJCWxpc3QtPmJ1ZmZlclswXS5hZGRyZXNzID0gcHJpdi0+dHhCdWZmZXJETUEgKyAoIGkgKiBUTEFOX01BWF9GUkFNRV9TSVpFICk7CisJCX0gZWxzZSB7CisJCQlsaXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IDA7CisJCX0KKwkJbGlzdC0+YnVmZmVyWzJdLmNvdW50ID0gMDsKKwkJbGlzdC0+YnVmZmVyWzJdLmFkZHJlc3MgPSAwOworCQlsaXN0LT5idWZmZXJbOF0uYWRkcmVzcyA9IDA7CisJCWxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gMDsKKwl9CisKKwlwcml2LT5yeEhlYWQgPSAwOworCXByaXYtPnJ4VGFpbCA9IFRMQU5fTlVNX1JYX0xJU1RTIC0gMTsKKwlmb3IgKCBpID0gMDsgaSA8IFRMQU5fTlVNX1JYX0xJU1RTOyBpKysgKSB7CisJCWxpc3QgPSBwcml2LT5yeExpc3QgKyBpOworCQlsaXN0X3BoeXMgPSBwcml2LT5yeExpc3RETUEgKyBzaXplb2YoVExhbkxpc3QpICogaTsKKwkJbGlzdC0+Y1N0YXQgPSBUTEFOX0NTVEFUX1JFQURZOworCQlsaXN0LT5mcmFtZVNpemUgPSBUTEFOX01BWF9GUkFNRV9TSVpFOworCQlsaXN0LT5idWZmZXJbMF0uY291bnQgPSBUTEFOX01BWF9GUkFNRV9TSVpFIHwgVExBTl9MQVNUX0JVRkZFUjsKKwkJaWYgKCBiYnVmICkgeworCQkJbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSBwcml2LT5yeEJ1ZmZlckRNQSArICggaSAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKTsKKwkJfSBlbHNlIHsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IoIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKyA3ICk7CisJCQlpZiAoIHNrYiA9PSBOVUxMICkgeworCQkJCXByaW50ayggIlRMQU46ICBDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY2VpdmVkIGRhdGEuXG4iICk7CisJCQkJLyogSWYgdGhpcyBldmVyIGhhcHBlbmVkIGl0IHdvdWxkIGJlIGEgcHJvYmxlbSAqLworCQkJfSBlbHNlIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZSggc2tiLCAyICk7CisJCQkJdCA9ICh2b2lkICopIHNrYl9wdXQoIHNrYiwgVExBTl9NQVhfRlJBTUVfU0laRSApOworCQkJfQorCQkJbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wY2lEZXYsIHQsIFRMQU5fTUFYX0ZSQU1FX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlsaXN0LT5idWZmZXJbOF0uYWRkcmVzcyA9ICh1MzIpIHQ7CisJCQlUTGFuX1N0b3JlU0tCKGxpc3QsIHNrYik7CisJCX0KKwkJbGlzdC0+YnVmZmVyWzFdLmNvdW50ID0gMDsKKwkJbGlzdC0+YnVmZmVyWzFdLmFkZHJlc3MgPSAwOworCQlpZiAoIGkgPCBUTEFOX05VTV9SWF9MSVNUUyAtIDEgKQorCQkJbGlzdC0+Zm9yd2FyZCA9IGxpc3RfcGh5cyArIHNpemVvZihUTGFuTGlzdCk7CisJCWVsc2UKKwkJCWxpc3QtPmZvcndhcmQgPSAwOworCX0KKworfSAvKiBUTGFuX1Jlc2V0TGlzdHMgKi8KKworCit2b2lkIFRMYW5fRnJlZUxpc3RzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludAkJaTsKKwlUTGFuTGlzdAkqbGlzdDsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCisJaWYgKCAhIGJidWYgKSB7CisJCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fVFhfTElTVFM7IGkrKyApIHsKKwkJCWxpc3QgPSBwcml2LT50eExpc3QgKyBpOworCQkJc2tiID0gVExhbl9HZXRTS0IobGlzdCk7CisJCQlpZiAoIHNrYiApIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBjaURldiwgbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueSggc2tiICk7CisJCQkJbGlzdC0+YnVmZmVyWzhdLmFkZHJlc3MgPSAwOworCQkJCWxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gMDsKKwkJCX0KKwkJfQorCisJCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fUlhfTElTVFM7IGkrKyApIHsKKwkJCWxpc3QgPSBwcml2LT5yeExpc3QgKyBpOworCQkJc2tiID0gVExhbl9HZXRTS0IobGlzdCk7CisJCQlpZiAoIHNrYiApIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBjaURldiwgbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MsIFRMQU5fTUFYX0ZSQU1FX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoIHNrYiApOworCQkJCWxpc3QtPmJ1ZmZlcls4XS5hZGRyZXNzID0gMDsKKwkJCQlsaXN0LT5idWZmZXJbOV0uYWRkcmVzcyA9IDA7CisJCQl9CisJCX0KKwl9Cit9IC8qIFRMYW5fRnJlZUxpc3RzICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9QcmludERpbworCSAqICAKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWlvX2Jhc2UJCUJhc2UgSU8gcG9ydCBvZiB0aGUgZGV2aWNlIG9mCisJICoJCQkJd2hpY2ggdG8gcHJpbnQgRElPIHJlZ2lzdGVycy4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gcHJpbnRzIG91dCBhbGwgdGhlIGludGVybmFsIChESU8pCisJICoJcmVnaXN0ZXJzIG9mIGEgVExBTiBjaGlwLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fUHJpbnREaW8oIHUxNiBpb19iYXNlICkKK3sKKwl1MzIgZGF0YTAsIGRhdGExOworCWludAlpOworCisJcHJpbnRrKCAiVExBTjogICBDb250ZW50cyBvZiBpbnRlcm5hbCByZWdpc3RlcnMgZm9yIGlvIGJhc2UgMHglMDRoeC5cbiIsIGlvX2Jhc2UgKTsKKwlwcmludGsoICJUTEFOOiAgICAgIE9mZi4gICswICAgICAgICAgKzRcbiIgKTsKKwlmb3IgKCBpID0gMDsgaSA8IDB4NEM7IGkrPSA4ICkgeworCQlkYXRhMCA9IFRMYW5fRGlvUmVhZDMyKCBpb19iYXNlLCBpICk7CisJCWRhdGExID0gVExhbl9EaW9SZWFkMzIoIGlvX2Jhc2UsIGkgKyAweDQgKTsKKwkJcHJpbnRrKCAiVExBTjogICAgICAweCUwMnggIDB4JTA4eCAweCUwOHhcbiIsIGksIGRhdGEwLCBkYXRhMSApOworCX0KKworfSAvKiBUTGFuX1ByaW50RGlvICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9QcmludExpc3QKKwkgKiAgCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlsaXN0CUEgcG9pbnRlciB0byB0aGUgVExhbkxpc3Qgc3RydWN0dXJlIHRvCisJICoJCQliZSBwcmludGVkLgorCSAqCQl0eXBlCUEgc3RyaW5nIHRvIGRlc2lnbmF0ZSB0eXBlIG9mIGxpc3QsCisJICoJCQkiUngiIG9yICJUeCIuCisJICoJCW51bQlUaGUgaW5kZXggb2YgdGhlIGxpc3QuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHByaW50cyBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0CisJICoJcG9pbnRlZCB0byBieSB0aGUgbGlzdCBwYXJhbWV0ZXIuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgVExhbl9QcmludExpc3QoIFRMYW5MaXN0ICpsaXN0LCBjaGFyICp0eXBlLCBpbnQgbnVtKQoreworCWludCBpOworCisJcHJpbnRrKCAiVExBTjogICAlcyBMaXN0ICVkIGF0IDB4JTA4eFxuIiwgdHlwZSwgbnVtLCAodTMyKSBsaXN0ICk7CisJcHJpbnRrKCAiVExBTjogICAgICBGb3J3YXJkICAgID0gMHglMDh4XG4iLCAgbGlzdC0+Zm9yd2FyZCApOworCXByaW50ayggIlRMQU46ICAgICAgQ1NUQVQgICAgICA9IDB4JTA0aHhcbiIsIGxpc3QtPmNTdGF0ICk7CisJcHJpbnRrKCAiVExBTjogICAgICBGcmFtZSBTaXplID0gMHglMDRoeFxuIiwgbGlzdC0+ZnJhbWVTaXplICk7CisJLyogZm9yICggaSA9IDA7IGkgPCAxMDsgaSsrICkgeyAqLworCWZvciAoIGkgPSAwOyBpIDwgMjsgaSsrICkgeworCQlwcmludGsoICJUTEFOOiAgICAgIEJ1ZmZlclslZF0uY291bnQsIGFkZHIgPSAweCUwOHgsIDB4JTA4eFxuIiwgaSwgbGlzdC0+YnVmZmVyW2ldLmNvdW50LCBsaXN0LT5idWZmZXJbaV0uYWRkcmVzcyApOworCX0KKworfSAvKiBUTGFuX1ByaW50TGlzdCAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJZGV2CVBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZSBvZiBhZGFwdGVyCisJICoJCQl0byB3aGljaCB0byByZWFkIHN0YXRzLgorCSAqCQlyZWNvcmQJRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gYWRkIAorCSAqCisJICoJVGhpcyBmdW5jdGlvbnMgcmVhZHMgYWxsIHRoZSBpbnRlcm5hbCBzdGF0dXMgcmVnaXN0ZXJzCisJICoJb2YgdGhlIFRMQU4gY2hpcCwgd2hpY2ggY2xlYXJzIHRoZW0gYXMgYSBzaWRlIGVmZmVjdC4KKwkgKglJdCB0aGVuIGVpdGhlciBhZGRzIHRoZSB2YWx1ZXMgdG8gdGhlIGRldmljZSdzIHN0YXR1cworCSAqCXN0cnVjdCwgb3IgZGlzY2FyZHMgdGhlbSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgcmVjb3JkCisJICoJaXMgVExBTl9SRUNPUkQgKCE9MCkgIG9yIFRMQU5fSUdOT1JFICg9PTApLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWNvcmQgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyCQl0eF9nb29kLCB0eF91bmRlcjsKKwl1MzIJCXJ4X2dvb2QsIHJ4X292ZXI7CisJdTMyCQlkZWZfdHgsIGNyYywgY29kZTsKKwl1MzIJCW11bHRpX2NvbCwgc2luZ2xlX2NvbDsKKwl1MzIJCWV4Y2Vzc19jb2wsIGxhdGVfY29sLCBsb3NzOworCisJb3V0dyggVExBTl9HT09EX1RYX0ZSTVMsIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fQURSICk7CisJdHhfZ29vZCAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSApOworCXR4X2dvb2QgKz0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAxICkgPDwgODsKKwl0eF9nb29kICs9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMiApIDw8IDE2OworCXR4X3VuZGVyID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAzICk7CisKKwlvdXR3KCBUTEFOX0dPT0RfUlhfRlJNUywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKKwlyeF9nb29kICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICk7CisJcnhfZ29vZCArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDEgKSA8PCA4OworCXJ4X2dvb2QgKz0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAyICkgPDwgMTY7CisJcnhfb3ZlciAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDMgKTsKKwkJCisJb3V0dyggVExBTl9ERUZFUlJFRF9UWCwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKKwlkZWZfdHggID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKTsKKwlkZWZfdHggKz0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAxICkgPDwgODsKKwljcmMgICAgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAyICk7CisJY29kZSAgICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMyApOworCQorCW91dHcoIFRMQU5fTVVMVElDT0xfRlJNUywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKKwltdWx0aV9jb2wgICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICk7CisJbXVsdGlfY29sICArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDEgKSA8PCA4OworCXNpbmdsZV9jb2wgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAyICk7CisJc2luZ2xlX2NvbCArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDMgKSA8PCA4OworCisJb3V0dyggVExBTl9FWENFU1NDT0xfRlJNUywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKKwlleGNlc3NfY29sID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKTsKKwlsYXRlX2NvbCAgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAxICk7CisJbG9zcyAgICAgICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMiApOworCisJaWYgKCByZWNvcmQgKSB7CisJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMgKz0gcnhfZ29vZDsKKwkJcHJpdi0+c3RhdHMucnhfZXJyb3JzICArPSByeF9vdmVyICsgY3JjICsgY29kZTsKKwkJcHJpdi0+c3RhdHMudHhfcGFja2V0cyArPSB0eF9nb29kOworCQlwcml2LT5zdGF0cy50eF9lcnJvcnMgICs9IHR4X3VuZGVyICsgbG9zczsKKwkJcHJpdi0+c3RhdHMuY29sbGlzaW9ucyArPSBtdWx0aV9jb2wgKyBzaW5nbGVfY29sICsgZXhjZXNzX2NvbCArIGxhdGVfY29sOworCisJCXByaXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzICAgICs9IHJ4X292ZXI7CisJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMgICAgICs9IGNyYzsKKwkJcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICAgKz0gY29kZTsKKworCQlwcml2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyArPSB0eF91bmRlcjsKKwkJcHJpdi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgKz0gbG9zczsKKwl9CisJCQkKK30gLyogVExhbl9SZWFkQW5kQ2xlYXJTdGF0cyAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fUmVzZXQKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTAKKwkgKglQYXJtczoKKwkgKgkJZGV2CVBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZSBvZiBhZGFwdGVyCisJICoJCQl0byBiZSByZXNldC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBhZGFwdGVyIGFuZCBpdCdzIHBoeXNpY2FsCisJICoJZGV2aWNlLiAgU2VlIENoYXAuIDMsIHBwLiA5LTEwIG9mIHRoZSAiVGh1bmRlckxBTgorCSAqCVByb2dyYW1tZXIncyBHdWlkZSIgZm9yIGRldGFpbHMuICBUaGUgcm91dGluZSB0cmllcyB0bworCSAqCWltcGxlbWVudCB3aGF0IGlzIGRldGFpbGVkIHRoZXJlLCB0aG91Z2ggYWRqdXN0bWVudHMKKwkgKgloYXZlIGJlZW4gbWFkZS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorVExhbl9SZXNldEFkYXB0ZXIoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50CQlpOworCXUzMgkJYWRkcjsKKwl1MzIJCWRhdGE7CisJdTgJCWRhdGE4OworCisJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBGQUxTRTsKKwlwcml2LT5waHlPbmxpbmU9MDsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisvKiAgMS4JQXNzZXJ0IHJlc2V0IGJpdC4gKi8KKworCWRhdGEgPSBpbmwoZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EKTsKKwlkYXRhIHw9IFRMQU5fSENfQURfUlNUOworCW91dGwoZGF0YSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EKTsKKwkKKwl1ZGVsYXkoMTAwMCk7CisKKy8qICAyLglUdXJuIG9mZiBpbnRlcnJ1cHRzLiAoIFByb2JhYmx5IGlzbid0IG5lY2Vzc2FyeSApICovCisKKwlkYXRhID0gaW5sKGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCk7CisJZGF0YSB8PSBUTEFOX0hDX0lOVF9PRkY7CisJb3V0bChkYXRhLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQpOworCisvKiAgMy4JQ2xlYXIgQVJFR3MgYW5kIEhBU0hzLiAqLworCisgCWZvciAoIGkgPSBUTEFOX0FSRUdfMDsgaSA8PSBUTEFOX0hBU0hfMjsgaSArPSA0ICkgeworCQlUTGFuX0Rpb1dyaXRlMzIoIGRldi0+YmFzZV9hZGRyLCAodTE2KSBpLCAwICk7CisJfQorCisvKiAgNC4JU2V0dXAgTmV0Q29uZmlnIHJlZ2lzdGVyLiAqLworCisJZGF0YSA9IFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTiB8IFRMQU5fTkVUX0NGR19QSFlfRU47CisJVExhbl9EaW9Xcml0ZTE2KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ09ORklHLCAodTE2KSBkYXRhICk7CisKKy8qICA1LglMb2FkIExkX1RtciBhbmQgTGRfVGhyIGluIEhPU1RfQ01ELiAqLworCisgCW91dGwoIFRMQU5fSENfTERfVE1SIHwgMHgzZiwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICk7CisgCW91dGwoIFRMQU5fSENfTERfVEhSIHwgMHg5LCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKKworLyogIDYuCVVucmVzZXQgdGhlIE1JSSBieSBzZXR0aW5nIE5NUlNUIChpbiBOZXRTaW8pIHRvIDEuICovCisKKwlvdXR3KCBUTEFOX05FVF9TSU8sIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fQURSICk7CisJYWRkciA9IGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKwlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX05NUlNULCBhZGRyICk7CisKKy8qICA3LglTZXR1cCB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycy4gKi8KKworCWlmICggcHJpdi0+dGxhblJldiA+PSAweDMwICkgeworCQlkYXRhOCA9IFRMQU5fSURfVFhfRU9DIHwgVExBTl9JRF9SWF9FT0M7CisJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9JTlRfRElTLCBkYXRhOCApOworCX0KKwlUTGFuX1BoeURldGVjdCggZGV2ICk7CisJZGF0YSA9IFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTjsKKwkKKwlpZiAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWSApIHsKKwkJZGF0YSB8PSBUTEFOX05FVF9DRkdfQklUOworCQlpZiAoIHByaXYtPmF1aSA9PSAxICkgeworCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0FDT01NSVQsIDB4MGEgKTsKKwkJfSBlbHNlIGlmICggcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0ZVTEwgKSB7CisJCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fQUNPTU1JVCwgMHgwMCApOworCQkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCQl9IGVsc2UgeworCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0FDT01NSVQsIDB4MDggKTsKKwkJfQorCX0KKworCWlmICggcHJpdi0+cGh5TnVtID09IDAgKSB7CisJCWRhdGEgfD0gVExBTl9ORVRfQ0ZHX1BIWV9FTjsKKwl9CisJVExhbl9EaW9Xcml0ZTE2KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ09ORklHLCAodTE2KSBkYXRhICk7CisKKwlpZiAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkgKSB7CisJCVRMYW5fRmluaXNoUmVzZXQoIGRldiApOworCX0gZWxzZSB7CisJCVRMYW5fUGh5UG93ZXJEb3duKCBkZXYgKTsKKwl9CisKK30gLyogVExhbl9SZXNldEFkYXB0ZXIgKi8KKworCisKKwordm9pZAorVExhbl9GaW5pc2hSZXNldCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1OAkJZGF0YTsKKwl1MzIJCXBoeTsKKwl1OAkJc2lvOworCXUxNgkJc3RhdHVzOworCXUxNgkJcGFydG5lcjsKKwl1MTYJCXRscGh5X2N0bDsKKwl1MTYgCQl0bHBoeV9wYXI7CisJdTE2CQl0bHBoeV9pZDEsIHRscGh5X2lkMjsKKwlpbnQgCQlpOworCisJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisKKwlkYXRhID0gVExBTl9ORVRfQ01EX05SRVNFVCB8IFRMQU5fTkVUX0NNRF9OV1JBUDsKKwlpZiAoIHByaXYtPnRsYW5GdWxsRHVwbGV4ICkgeworCQlkYXRhIHw9IFRMQU5fTkVUX0NNRF9EVVBMRVg7CisJfQorCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ01ELCBkYXRhICk7CisJZGF0YSA9IFRMQU5fTkVUX01BU0tfTUFTSzQgfCBUTEFOX05FVF9NQVNLX01BU0s1OyAKKwlpZiAoIHByaXYtPnBoeU51bSA9PSAwICkgeworCQlkYXRhIHw9IFRMQU5fTkVUX01BU0tfTUFTSzc7IAorCX0KKwlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX01BU0ssIGRhdGEgKTsKKwlUTGFuX0Rpb1dyaXRlMTYoIGRldi0+YmFzZV9hZGRyLCBUTEFOX01BWF9SWCwgKCgxNTM2KSs3KSZ+NyApOworCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fSURfSEksICZ0bHBoeV9pZDEgKTsKKwlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0lEX0xPLCAmdGxwaHlfaWQyICk7CisJCisJaWYgKCAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkgKSB8fCAoIHByaXYtPmF1aSApICkgeworCQlzdGF0dXMgPSBNSUlfR1NfTElOSzsKKwkJcHJpbnRrKCAiVExBTjogICVzOiBMaW5rIGZvcmNlZC5cbiIsIGRldi0+bmFtZSApOworCX0gZWxzZSB7CisJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fU1RTLCAmc3RhdHVzICk7CisJCXVkZWxheSggMTAwMCApOworCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJnN0YXR1cyApOworCQlpZiAoIChzdGF0dXMgJiBNSUlfR1NfTElOSykgJiYJIC8qIFdlIG9ubHkgc3VwcG9ydCBsaW5rIGluZm8gb24gTmF0LlNlbS4gUEhZJ3MgKi8gCisJCQkodGxwaHlfaWQxID09IE5BVF9TRU1fSUQxKSAmJgorCQkJKHRscGh5X2lkMiA9PSBOQVRfU0VNX0lEMikgKSB7CisJCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfQU5fTFBBLCAmcGFydG5lciApOworCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9QQVIsICZ0bHBoeV9wYXIgKTsKKwkJCQorCQkJcHJpbnRrKCAiVExBTjogJXM6IExpbmsgYWN0aXZlIHdpdGggIiwgZGV2LT5uYW1lICk7CisJCQlpZiAoISh0bHBoeV9wYXIgJiBUTEFOX1BIWV9BTl9FTl9TVEFUKSkgeworCQkJICAgICAgCSBwcmludGsoICJmb3JjZWQgMTAlc01icHMgJXMtRHVwbGV4XG4iLCAKKwkJCQkJCXRscGh5X3BhciAmIFRMQU5fUEhZX1NQRUVEXzEwMCA/ICIiIDogIjAiLAorCQkJCQkJdGxwaHlfcGFyICYgVExBTl9QSFlfRFVQTEVYX0ZVTEwgPyAiRnVsbCIgOiAiSGFsZiIpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoICJBdXRvTmVnb3RpYXRpb24gZW5hYmxlZCwgYXQgMTAlc01icHMgJXMtRHVwbGV4XG4iLAorCQkJCQkJdGxwaHlfcGFyICYgVExBTl9QSFlfU1BFRURfMTAwID8gIiIgOiAiMCIsCisJCQkJCQl0bHBoeV9wYXIgJiBUTEFOX1BIWV9EVVBMRVhfRlVMTCA/ICJGdWxsIiA6ICJIYWxmIik7CisJCQkJcHJpbnRrKCJUTEFOOiBQYXJ0bmVyIGNhcGFiaWxpdHk6ICIpOworCQkJCQlmb3IgKGkgPSA1OyBpIDw9IDEwOyBpKyspCisJCQkJCQlpZiAocGFydG5lciAmICgxPDxpKSkKKwkJCQkJCQlwcmludGsoIiVzIixtZWRpYVtpLTVdKTsKKwkJCQlwcmludGsoIlxuIik7CisJCQl9CisKKwkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9MRURfUkVHLCBUTEFOX0xFRF9MSU5LICk7CisjaWZkZWYgTU9OSVRPUgkJCQorCQkJLyogV2UgaGF2ZSBsaW5rIGJlYXQuLmZvciBub3cgYW55d2F5ICovCisJICAgICAgICAJcHJpdi0+bGluayA9IDE7CisJICAgICAgICAJLypFbmFibGluZyBsaW5rIGJlYXQgbW9uaXRvcmluZyAqLworCQkJVExhbl9TZXRUaW1lciggZGV2LCAoMTAqSFopLCBUTEFOX1RJTUVSX0xJTktfQkVBVCApOworI2VuZGlmIAorCQl9IGVsc2UgaWYgKHN0YXR1cyAmIE1JSV9HU19MSU5LKSAgeworCQkJcHJpbnRrKCAiVExBTjogJXM6IExpbmsgYWN0aXZlXG4iLCBkZXYtPm5hbWUgKTsKKwkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9MRURfUkVHLCBUTEFOX0xFRF9MSU5LICk7CisJCX0KKwl9CisKKwlpZiAoIHByaXYtPnBoeU51bSA9PSAwICkgeworICAgICAgICAJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsICZ0bHBoeV9jdGwgKTsKKyAgICAgICAgCXRscGh5X2N0bCB8PSBUTEFOX1RDX0lOVEVOOworICAgICAgICAJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCB0bHBoeV9jdGwgKTsKKyAgICAgICAgCXNpbyA9IFRMYW5fRGlvUmVhZDgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9TSU8gKTsKKyAgICAgICAgCXNpbyB8PSBUTEFOX05FVF9TSU9fTUlOVEVOOworICAgICAgICAJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9TSU8sIHNpbyApOworCX0KKworCWlmICggc3RhdHVzICYgTUlJX0dTX0xJTksgKSB7CisJCVRMYW5fU2V0TWFjKCBkZXYsIDAsIGRldi0+ZGV2X2FkZHIgKTsKKwkJcHJpdi0+cGh5T25saW5lID0gMTsKKwkJb3V0YiggKCBUTEFOX0hDX0lOVF9PTiA+PiA4ICksIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCArIDEgKTsKKwkJaWYgKCBkZWJ1ZyA+PSAxICYmIGRlYnVnICE9IFRMQU5fREVCVUdfUFJPQkUgKSB7CisJCQlvdXRiKCAoIFRMQU5fSENfUkVRX0lOVCA+PiA4ICksIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCArIDEgKTsKKwkJfQorCQlvdXRsKCBwcml2LT5yeExpc3RETUEsIGRldi0+YmFzZV9hZGRyICsgVExBTl9DSF9QQVJNICk7CisJCW91dGwoIFRMQU5fSENfR08gfCBUTEFOX0hDX1JULCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKKwkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCX0gZWxzZSB7CisJCXByaW50ayggIlRMQU46ICVzOiBMaW5rIGluYWN0aXZlLCB3aWxsIHJldHJ5IGluIDEwIHNlY3MuLi5cbiIsIGRldi0+bmFtZSApOworCQlUTGFuX1NldFRpbWVyKCBkZXYsICgxMCpIWiksIFRMQU5fVElNRVJfRklOSVNIX1JFU0VUICk7CisJCXJldHVybjsKKwl9CisKK30gLyogVExhbl9GaW5pc2hSZXNldCAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fU2V0TWFjCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWRldglQb2ludGVyIHRvIGRldmljZSBzdHJ1Y3R1cmUgb2YgYWRhcHRlcgorCSAqCQkJb24gd2hpY2ggdG8gY2hhbmdlIHRoZSBBUkVHLgorCSAqCQlhcmVnCVRoZSBBUkVHIHRvIHNldCB0aGUgYWRkcmVzcyBpbiAoMCAtIDMpLgorCSAqCQltYWMJQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNoYXJzLiAgRWFjaAorCSAqCQkJZWxlbWVudCBzdG9yZXMgb25lIGJ5dGUgb2YgdGhlIGFkZHJlc3MuCisJICoJCQlJRSwgaXQgaXNuJ3QgaW4gYXNjaWkuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHRyYW5zZmVycyBhIE1BQyBhZGRyZXNzIHRvIG9uZSBvZiB0aGUKKwkgKglUTEFOIEFSRUdzIChhZGRyZXNzIHJlZ2lzdGVycykuICBUaGUgVExBTiBjaGlwIGxvY2tzCisJICoJdGhlIHJlZ2lzdGVyIG9uIHdyaXRpbmcgdG8gb2Zmc2V0IDAgYW5kIHVubG9ja3MgdGhlCisJICoJcmVnaXN0ZXIgYWZ0ZXIgd3JpdGluZyB0byBvZmZzZXQgNS4gIElmIE5VTEwgaXMgcGFzc2VkCisJICoJaW4gbWFjLCB0aGVuIHRoZSBBUkVHIGlzIGZpbGxlZCB3aXRoIDAncy4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX1NldE1hYyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFyZWcsIGNoYXIgKm1hYyApCit7CisJaW50IGk7CisJCQkKKwlhcmVnICo9IDY7CisKKwlpZiAoIG1hYyAhPSBOVUxMICkgeworCQlmb3IgKCBpID0gMDsgaSA8IDY7IGkrKyApCisJCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fQVJFR18wICsgYXJlZyArIGksIG1hY1tpXSApOworCX0gZWxzZSB7CisJCWZvciAoIGkgPSAwOyBpIDwgNjsgaSsrICkKKwkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9BUkVHXzAgKyBhcmVnICsgaSwgMCApOworCX0KKworfSAvKiBUTGFuX1NldE1hYyAqLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVGh1bmRlckxBTiBEcml2ZXIgUEhZIExheWVyIFJvdXRpbmVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fUGh5UHJpbnQKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJZGV2CUEgcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSBvZiB0aGUKKwkgKgkJCVRMQU4gZGV2aWNlIGhhdmluZyB0aGUgUEhZcyB0byBiZSBkZXRhaWxlZC4KKwkgKgkJCQkKKwkgKglUaGlzIGZ1bmN0aW9uIHByaW50cyB0aGUgcmVnaXN0ZXJzIGEgUEhZIChha2EgdHJhbnNjZWl2ZXIpLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fUGh5UHJpbnQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTE2IGksIGRhdGEwLCBkYXRhMSwgZGF0YTIsIGRhdGEzLCBwaHk7CisKKwlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKKworCWlmICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSApIHsKKwkJcHJpbnRrKCAiVExBTjogICBEZXZpY2UgJXMsIFVubWFuYWdlZCBQSFkuXG4iLCBkZXYtPm5hbWUgKTsKKwl9IGVsc2UgaWYgKCBwaHkgPD0gVExBTl9QSFlfTUFYX0FERFIgKSB7CisJCXByaW50ayggIlRMQU46ICAgRGV2aWNlICVzLCBQSFkgMHglMDJ4LlxuIiwgZGV2LT5uYW1lLCBwaHkgKTsKKwkJcHJpbnRrKCAiVExBTjogICAgICBPZmYuICArMCAgICAgKzEgICAgICsyICAgICArMyBcbiIgKTsKKyAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IDB4MjA7IGkrPSA0ICkgeworCQkJcHJpbnRrKCAiVExBTjogICAgICAweCUwMngiLCBpICk7CisJCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBpLCAmZGF0YTAgKTsKKwkJCXByaW50ayggIiAweCUwNGh4IiwgZGF0YTAgKTsKKwkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIGkgKyAxLCAmZGF0YTEgKTsKKwkJCXByaW50ayggIiAweCUwNGh4IiwgZGF0YTEgKTsKKwkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIGkgKyAyLCAmZGF0YTIgKTsKKwkJCXByaW50ayggIiAweCUwNGh4IiwgZGF0YTIgKTsKKwkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIGkgKyAzLCAmZGF0YTMgKTsKKwkJCXByaW50ayggIiAweCUwNGh4XG4iLCBkYXRhMyApOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKCAiVExBTjogICBEZXZpY2UgJXMsIEludmFsaWQgUEhZLlxuIiwgZGV2LT5uYW1lICk7CisJfQorCit9IC8qIFRMYW5fUGh5UHJpbnQgKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1BoeURldGVjdAorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlkZXYJQSBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIG9mIHRoZSBhZGFwdGVyCisJICoJCQlmb3Igd2hpY2ggdGhlIFBIWSBuZWVkcyBkZXRlcm1pbmVkLgorCSAqCisJICoJU28gZmFyIEkndmUgZm91bmQgdGhhdCBhZGFwdGVycyB3aGljaCBoYXZlIGV4dGVybmFsIFBIWXMKKwkgKgltYXkgYWxzbyB1c2UgdGhlIGludGVybmFsIFBIWSBmb3IgcGFydCBvZiB0aGUgZnVuY3Rpb25hbGl0eS4KKwkgKgkoZWcsIEFVSS9UaGlubmV0KS4gIFRoaXMgZnVuY3Rpb24gZmluZHMgb3V0IGlmIHRoaXMgVExBTgorCSAqCWNoaXAgaGFzIGFuIGludGVybmFsIFBIWSwgYW5kIHRoZW4gZmluZHMgdGhlIGZpcnN0IGV4dGVybmFsCisJICoJUEhZIChzdGFydGluZyBmcm9tIGFkZHJlc3MgMCkgaWYgaXQgZXhpc3RzKS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX1BoeURldGVjdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYJCWNvbnRyb2w7CisJdTE2CQloaTsKKwl1MTYJCWxvOworCXUzMgkJcGh5OworCisJaWYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZICkgeworCQlwcml2LT5waHlOdW0gPSAweEZGRkY7CisJCXJldHVybjsKKwl9CisKKwlUTGFuX01paVJlYWRSZWcoIGRldiwgVExBTl9QSFlfTUFYX0FERFIsIE1JSV9HRU5fSURfSEksICZoaSApOworCQorCWlmICggaGkgIT0gMHhGRkZGICkgeworCQlwcml2LT5waHlbMF0gPSBUTEFOX1BIWV9NQVhfQUREUjsKKwl9IGVsc2UgeworCQlwcml2LT5waHlbMF0gPSBUTEFOX1BIWV9OT05FOworCX0KKworCXByaXYtPnBoeVsxXSA9IFRMQU5fUEhZX05PTkU7CisJZm9yICggcGh5ID0gMDsgcGh5IDw9IFRMQU5fUEhZX01BWF9BRERSOyBwaHkrKyApIHsKKwkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsICZjb250cm9sICk7CisJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fSURfSEksICZoaSApOworCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0lEX0xPLCAmbG8gKTsKKwkJaWYgKCAoIGNvbnRyb2wgIT0gMHhGRkZGICkgfHwgKCBoaSAhPSAweEZGRkYgKSB8fCAoIGxvICE9IDB4RkZGRiApICkgeworCQkJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIlBIWSBmb3VuZCBhdCAlMDJ4ICUwNHggJTA0eCAlMDR4XG4iLCBwaHksIGNvbnRyb2wsIGhpLCBsbyApOworCQkJaWYgKCAoIHByaXYtPnBoeVsxXSA9PSBUTEFOX1BIWV9OT05FICkgJiYgKCBwaHkgIT0gVExBTl9QSFlfTUFYX0FERFIgKSApIHsKKwkJCQlwcml2LT5waHlbMV0gPSBwaHk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIHByaXYtPnBoeVsxXSAhPSBUTEFOX1BIWV9OT05FICkgeworCQlwcml2LT5waHlOdW0gPSAxOworCX0gZWxzZSBpZiAoIHByaXYtPnBoeVswXSAhPSBUTEFOX1BIWV9OT05FICkgeworCQlwcml2LT5waHlOdW0gPSAwOworCX0gZWxzZSB7CisJCXByaW50ayggIlRMQU46ICBDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UsIG5vIFBIWSB3YXMgZm91bmQhXG4iICk7CisJfQorCit9IC8qIFRMYW5fUGh5RGV0ZWN0ICovCisKKworCisKK3ZvaWQgVExhbl9QaHlQb3dlckRvd24oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTE2CQl2YWx1ZTsKKworCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogUG93ZXJpbmcgZG93biBQSFkocykuXG4iLCBkZXYtPm5hbWUgKTsKKwl2YWx1ZSA9IE1JSV9HQ19QRE9XTiB8IE1JSV9HQ19MT09QQksgfCBNSUlfR0NfSVNPTEFURTsKKwlUTGFuX01paVN5bmMoIGRldi0+YmFzZV9hZGRyICk7CisJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwcml2LT5waHlbcHJpdi0+cGh5TnVtXSwgTUlJX0dFTl9DVEwsIHZhbHVlICk7CisJaWYgKCAoIHByaXYtPnBoeU51bSA9PSAwICkgJiYgKCBwcml2LT5waHlbMV0gIT0gVExBTl9QSFlfTk9ORSApICYmICggISAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX1VTRV9JTlRFUk5fMTAgKSApICkgeworCQlUTGFuX01paVN5bmMoIGRldi0+YmFzZV9hZGRyICk7CisJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcHJpdi0+cGh5WzFdLCBNSUlfR0VOX0NUTCwgdmFsdWUgKTsKKwl9CisKKwkvKiBXYWl0IGZvciA1MCBtcyBhbmQgcG93ZXJ1cAorCSAqIFRoaXMgaXMgYWJpdHJhcnkuICBJdCBpcyBpbnRlbmRlZCB0byBtYWtlIHN1cmUgdGhlCisJICogdHJhbnNjZWl2ZXIgc2V0dGxlcy4KKwkgKi8KKwlUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8yMCksIFRMQU5fVElNRVJfUEhZX1BVUCApOworCit9IC8qIFRMYW5fUGh5UG93ZXJEb3duICovCisKKworCisKK3ZvaWQgVExhbl9QaHlQb3dlclVwKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNgkJdmFsdWU7CisKKwlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiJXM6IFBvd2VyaW5nIHVwIFBIWS5cbiIsIGRldi0+bmFtZSApOworCVRMYW5fTWlpU3luYyggZGV2LT5iYXNlX2FkZHIgKTsKKwl2YWx1ZSA9IE1JSV9HQ19MT09QQks7CisJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwcml2LT5waHlbcHJpdi0+cGh5TnVtXSwgTUlJX0dFTl9DVEwsIHZhbHVlICk7CisJVExhbl9NaWlTeW5jKGRldi0+YmFzZV9hZGRyKTsKKwkvKiBXYWl0IGZvciA1MDAgbXMgYW5kIHJlc2V0IHRoZQorCSAqIHRyYW5zY2VpdmVyLiAgVGhlIFRMQU4gZG9jcyBzYXkgYm90aCA1MCBtcyBhbmQKKwkgKiA1MDAgbXMsIHNvIGRvIHRoZSBsb25nZXIsIGp1c3QgaW4gY2FzZS4KKwkgKi8KKwlUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8yMCksIFRMQU5fVElNRVJfUEhZX1JFU0VUICk7CisKK30gLyogVExhbl9QaHlQb3dlclVwICovCisKKworCisKK3ZvaWQgVExhbl9QaHlSZXNldCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYJCXBoeTsKKwl1MTYJCXZhbHVlOworCisJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisKKwlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiJXM6IFJlc2V0aW5nIFBIWS5cbiIsIGRldi0+bmFtZSApOworCVRMYW5fTWlpU3luYyggZGV2LT5iYXNlX2FkZHIgKTsKKwl2YWx1ZSA9IE1JSV9HQ19MT09QQksgfCBNSUlfR0NfUkVTRVQ7CisJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCB2YWx1ZSApOworCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAmdmFsdWUgKTsKKwl3aGlsZSAoIHZhbHVlICYgTUlJX0dDX1JFU0VUICkgeworCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgJnZhbHVlICk7CisJfQorCisJLyogV2FpdCBmb3IgNTAwIG1zIGFuZCBpbml0aWFsaXplLgorCSAqIEkgZG9uJ3QgcmVtZW1iZXIgd2h5IEkgd2FpdCB0aGlzIGxvbmcuCisJICogSSd2ZSBjaGFuZ2VkIHRoaXMgdG8gNTBtcywgYXMgaXQgc2VlbXMgbG9uZyBlbm91Z2guCisJICovCisJVExhbl9TZXRUaW1lciggZGV2LCAoSFovMjApLCBUTEFOX1RJTUVSX1BIWV9TVEFSVF9MSU5LICk7CisKK30gLyogVExhbl9QaHlSZXNldCAqLworCisKKworCit2b2lkIFRMYW5fUGh5U3RhcnRMaW5rKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNgkJYWJpbGl0eTsKKwl1MTYJCWNvbnRyb2w7CisJdTE2CQlkYXRhOworCXUxNgkJcGh5OworCXUxNgkJc3RhdHVzOworCXUxNgkJdGN0bDsKKworCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogVHJ5aW5nIHRvIGFjdGl2YXRlIGxpbmsuXG4iLCBkZXYtPm5hbWUgKTsKKwlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJnN0YXR1cyApOworCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fU1RTLCAmYWJpbGl0eSApOworCisJaWYgKCAoIHN0YXR1cyAmIE1JSV9HU19BVVRPTkVHICkgJiYgCisJICAgICAoICEgcHJpdi0+YXVpICkgKSB7CisJCWFiaWxpdHkgPSBzdGF0dXMgPj4gMTE7CisJCWlmICggcHJpdi0+c3BlZWQgID09IFRMQU5fU1BFRURfMTAgJiYgCisJCSAgICAgcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0hBTEYpIHsKKwkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgMHgwMDAwKTsKKwkJfSBlbHNlIGlmICggcHJpdi0+c3BlZWQgPT0gVExBTl9TUEVFRF8xMCAmJgorCQkJICAgIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9GVUxMKSB7CisJCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7CisJCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MDEwMCk7CisJCX0gZWxzZSBpZiAoIHByaXYtPnNwZWVkID09IFRMQU5fU1BFRURfMTAwICYmCisJCQkgICAgcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0hBTEYpIHsKKwkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgMHgyMDAwKTsKKwkJfSBlbHNlIGlmICggcHJpdi0+c3BlZWQgPT0gVExBTl9TUEVFRF8xMDAgJiYKKwkJCSAgICBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCkgeworCQkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAweDIxMDApOworCQl9IGVsc2UgeworCQorCQkJLyogU2V0IEF1dG8tTmVnIGFkdmVydGlzZW1lbnQgKi8KKwkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfQU5fQURWLCAoYWJpbGl0eSA8PCA1KSB8IDEpOworCQkJLyogRW5hYmxlZSBBdXRvLU5lZyAqLworCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAweDEwMDAgKTsKKwkJCS8qIFJlc3RhcnQgQXV0by1OZWcgKi8KKwkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgMHgxMjAwICk7CisJCQkvKiBXYWl0IGZvciA0IHNlYyBmb3IgYXV0b25lZ290aWF0aW9uCisJCSAJKiB0byBjb21wbGV0ZS4gIFRoZSBtYXggc3BlYyB0aW1lIGlzIGxlc3MgdGhhbiB0aGlzCisJCSAJKiBidXQgdGhlIGNhcmQgbmVlZCBhZGRpdGlvbmFsIHRpbWUgdG8gc3RhcnQgQU4uCisJCSAJKiAuNSBzZWMgc2hvdWxkIGJlIHBsZW50eSBleHRyYS4KKwkJIAkqLworCQkJcHJpbnRrKCAiVExBTjogJXM6IFN0YXJ0aW5nIGF1dG9uZWdvdGlhdGlvbi5cbiIsIGRldi0+bmFtZSApOworCQkJVExhbl9TZXRUaW1lciggZGV2LCAoMipIWiksIFRMQU5fVElNRVJfUEhZX0ZJTklTSF9BTiApOworCQkJcmV0dXJuOworCQl9CisJCQorCX0JCisJCisJaWYgKCAoIHByaXYtPmF1aSApICYmICggcHJpdi0+cGh5TnVtICE9IDAgKSApIHsKKwkJcHJpdi0+cGh5TnVtID0gMDsKKwkJZGF0YSA9IFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTiB8IFRMQU5fTkVUX0NGR19QSFlfRU47CisJCVRMYW5fRGlvV3JpdGUxNiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NPTkZJRywgZGF0YSApOworCQlUTGFuX1NldFRpbWVyKCBkZXYsICg0MCpIWi8xMDAwKSwgVExBTl9USU1FUl9QSFlfUERPV04gKTsKKwkJcmV0dXJuOworCX0gIGVsc2UgaWYgKCBwcml2LT5waHlOdW0gPT0gMCApIHsKKwkJY29udHJvbCA9IDA7CisgICAgICAgIAlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX0NUTCwgJnRjdGwgKTsKKwkJaWYgKCBwcml2LT5hdWkgKSB7CisgICAgICAgICAgICAgICAgCXRjdGwgfD0gVExBTl9UQ19BVUlTRUw7CisJCX0gZWxzZSB7IAorICAgICAgICAgICAgICAgIAl0Y3RsICY9IH5UTEFOX1RDX0FVSVNFTDsKKwkJCWlmICggcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0ZVTEwgKSB7CisJCQkJY29udHJvbCB8PSBNSUlfR0NfRFVQTEVYOworCQkJCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gVFJVRTsKKwkJCX0KKwkJCWlmICggcHJpdi0+c3BlZWQgPT0gVExBTl9TUEVFRF8xMDAgKSB7CisJCQkJY29udHJvbCB8PSBNSUlfR0NfU1BFRURTRUw7CisJCQl9CisJCX0KKwkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCBjb250cm9sICk7CisgICAgICAgIAlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsIHRjdGwgKTsKKwl9CisKKwkvKiBXYWl0IGZvciAyIHNlYyB0byBnaXZlIHRoZSB0cmFuc2NlaXZlciB0aW1lCisJICogdG8gZXN0YWJsaXNoIGxpbmsuCisJICovCisJVExhbl9TZXRUaW1lciggZGV2LCAoNCpIWiksIFRMQU5fVElNRVJfRklOSVNIX1JFU0VUICk7CisKK30gLyogVExhbl9QaHlTdGFydExpbmsgKi8KKworCisKKwordm9pZCBUTGFuX1BoeUZpbmlzaEF1dG9OZWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTE2CQlhbl9hZHY7CisJdTE2CQlhbl9scGE7CisJdTE2CQlkYXRhOworCXUxNgkJbW9kZTsKKwl1MTYJCXBoeTsKKwl1MTYJCXN0YXR1czsKKwkKKwlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKKworCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fU1RTLCAmc3RhdHVzICk7CisJdWRlbGF5KCAxMDAwICk7CisJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9TVFMsICZzdGF0dXMgKTsKKworCWlmICggISAoIHN0YXR1cyAmIE1JSV9HU19BVVRPQ01QTFQgKSApIHsKKwkJLyogV2FpdCBmb3IgOCBzZWMgdG8gZ2l2ZSB0aGUgcHJvY2VzcworCQkgKiBtb3JlIHRpbWUuICBQZXJoYXBzIHdlIHNob3VsZCBmYWlsIGFmdGVyIGEgd2hpbGUuCisJCSAqLworCQkgaWYgKCFwcml2LT5uZWdfYmVfdmVyYm9zZSsrKSB7CisJCQkgcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogIEdpdmluZyBhdXRvbmVnb3RpYXRpb24gbW9yZSB0aW1lLlxuIik7CisJCSAJIHByaW50ayhLRVJOX0lORk8gIlRMQU46ICBQbGVhc2UgY2hlY2sgdGhhdCB5b3VyIGFkYXB0ZXIgaGFzXG4iKTsKKwkJIAkgcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogIGJlZW4gcHJvcGVybHkgY29ubmVjdGVkIHRvIGEgSFVCIG9yIFN3aXRjaC5cbiIpOworCQkJIHByaW50ayhLRVJOX0lORk8gIlRMQU46ICBUcnlpbmcgdG8gZXN0YWJsaXNoIGxpbmsgaW4gdGhlIGJhY2tncm91bmQuLi5cbiIpOworCQkgfQorCQlUTGFuX1NldFRpbWVyKCBkZXYsICg4KkhaKSwgVExBTl9USU1FUl9QSFlfRklOSVNIX0FOICk7CisJCXJldHVybjsKKwl9CisKKwlwcmludGsoICJUTEFOOiAlczogQXV0b25lZ290aWF0aW9uIGNvbXBsZXRlLlxuIiwgZGV2LT5uYW1lICk7CisJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0FOX0FEViwgJmFuX2FkdiApOworCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9BTl9MUEEsICZhbl9scGEgKTsKKwltb2RlID0gYW5fYWR2ICYgYW5fbHBhICYgMHgwM0UwOworCWlmICggbW9kZSAmIDB4MDEwMCApIHsKKwkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCX0gZWxzZSBpZiAoICEgKCBtb2RlICYgMHgwMDgwICkgJiYgKCBtb2RlICYgMHgwMDQwICkgKSB7CisJCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gVFJVRTsKKwl9CisKKwlpZiAoICggISAoIG1vZGUgJiAweDAxODAgKSApICYmICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMCApICYmICggcHJpdi0+cGh5TnVtICE9IDAgKSApIHsKKwkJcHJpdi0+cGh5TnVtID0gMDsKKwkJZGF0YSA9IFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTiB8IFRMQU5fTkVUX0NGR19QSFlfRU47CisJCVRMYW5fRGlvV3JpdGUxNiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NPTkZJRywgZGF0YSApOworCQlUTGFuX1NldFRpbWVyKCBkZXYsICg0MDAqSFovMTAwMCksIFRMQU5fVElNRVJfUEhZX1BET1dOICk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIHByaXYtPnBoeU51bSA9PSAwICkgeworCQlpZiAoICggcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0ZVTEwgKSB8fCAoIGFuX2FkdiAmIGFuX2xwYSAmIDB4MDA0MCApICkgeworCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCBNSUlfR0NfQVVUT0VOQiB8IE1JSV9HQ19EVVBMRVggKTsKKwkJCXByaW50ayggIlRMQU46ICBTdGFydGluZyBpbnRlcm5hbCBQSFkgd2l0aCBGVUxMLURVUExFWFxuIiApOworCQl9IGVsc2UgeworCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCBNSUlfR0NfQVVUT0VOQiApOworCQkJcHJpbnRrKCAiVExBTjogIFN0YXJ0aW5nIGludGVybmFsIFBIWSB3aXRoIEhBTEYtRFVQTEVYXG4iICk7CisJCX0KKwl9CisKKwkvKiBXYWl0IGZvciAxMDAgbXMuICBObyByZWFzb24gaW4gcGFydGl0aWN1bGFyLgorCSAqLworCVRMYW5fU2V0VGltZXIoIGRldiwgKEhaLzEwKSwgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQgKTsKKwkJCit9IC8qIFRMYW5fUGh5RmluaXNoQXV0b05lZyAqLworCisjaWZkZWYgTU9OSVRPUgorCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgKgorICAgICAgICAqICAgICAgVExhbl9waHlNb25pdG9yCisgICAgICAgICoKKyAgICAgICAgKiAgICAgIFJldHVybnM6IAorICAgICAgICAqICAgICAgICAgICAgICBOb25lCisgICAgICAgICoKKyAgICAgICAgKiAgICAgIFBhcmFtczoKKyAgICAgICAgKiAgICAgICAgICAgICAgZGV2ICAgICAgICAgICAgIFRoZSBkZXZpY2Ugc3RydWN0dXJlIG9mIHRoaXMgZGV2aWNlLgorICAgICAgICAqCisgICAgICAgICogICAgICAKKyAgICAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gbW9uaXRvcnMgUEhZIGNvbmRpdGlvbiBieSByZWFkaW5nIHRoZSBzdGF0dXMKKyAgICAgICAgKiAgICAgIHJlZ2lzdGVyIHZpYSB0aGUgTUlJIGJ1cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBnaXZlIGluZm8KKyAgICAgICAgKiAgICAgIGFib3V0IGxpbmsgY2hhbmdlcyAodXAvZG93biksIGFuZCBwb3NzaWJsZSBzd2l0Y2ggdG8gYWx0ZXJuYXRlCisgICAgICAgICogICAgICBtZWRpYS4KKyAgICAgICAgKgorICAgICAgICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX1BoeU1vbml0b3IoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTE2ICAgICBwaHk7CisJdTE2ICAgICBwaHlfc3RhdHVzOworCisJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisKKyAgICAgICAgLyogR2V0IFBIWSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyAgICAgICAgVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9TVFMsICZwaHlfc3RhdHVzICk7CisKKyAgICAgICAgLyogQ2hlY2sgaWYgbGluayBoYXMgYmVlbiBsb3N0ICovCisgICAgICAgIGlmICghKHBoeV9zdGF0dXMgJiBNSUlfR1NfTElOSykpIHsgCisgCSAgICAgICBpZiAocHJpdi0+bGluaykgeworCQkgICAgICBwcml2LT5saW5rID0gMDsKKwkgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJUTEFOOiAlcyBoYXMgbG9zdCBsaW5rXG4iLCBkZXYtPm5hbWUpOworCSAgICAgICAgICAgICAgZGV2LT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7CisJCSAgICAgIFRMYW5fU2V0VGltZXIoIGRldiwgKDIqSFopLCBUTEFOX1RJTUVSX0xJTktfQkVBVCApOworCQkgICAgICByZXR1cm47CisJCX0KKwl9CisKKyAgICAgICAgLyogTGluayByZXN0YWJsaXNoZWQ/ICovCisgICAgICAgIGlmICgocGh5X3N0YXR1cyAmIE1JSV9HU19MSU5LKSAmJiAhcHJpdi0+bGluaykgeworIAkJcHJpdi0+bGluayA9IDE7CisgICAgICAgIAlwcmludGsoS0VSTl9ERUJVRyAiVExBTjogJXMgaGFzIHJlZXN0YWJsaXNoZWQgbGlua1xuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgCWRldi0+ZmxhZ3MgfD0gSUZGX1JVTk5JTkc7CisgICAgICAgIH0KKworCS8qIFNldHVwIGEgbmV3IG1vbml0b3IgKi8KKwlUTGFuX1NldFRpbWVyKCBkZXYsICgyKkhaKSwgVExBTl9USU1FUl9MSU5LX0JFQVQgKTsKK30JCisKKyNlbmRpZiAvKiBNT05JVE9SICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCVRodW5kZXJMQU4gRHJpdmVyIE1JSSBSb3V0aW5lcworCisJVGhlc2Ugcm91dGluZXMgYXJlIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBpbiBDaGFwLiAyIG9mIHRoZQorCSJUaHVuZGVyTEFOIFByb2dyYW1tZXIncyBHdWlkZSIsIHBwLiAxNS0yNC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fTWlpUmVhZFJlZworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMAlpZiBhY2sgcmVjZWl2ZWQgb2sKKwkgKgkJMQlvdGhlcndpc2UuCisJICoKKwkgKglQYXJtczoKKwkgKgkJZGV2CQlUaGUgZGV2aWNlIHN0cnVjdHVyZSBjb250YWluaW5nCisJICoJCQkJVGhlIGlvIGFkZHJlc3MgYW5kIGludGVycnVwdCBjb3VudAorCSAqCQkJCWZvciB0aGlzIGRldmljZS4KKwkgKgkJcGh5CQlUaGUgYWRkcmVzcyBvZiB0aGUgUEhZIHRvIGJlIHF1ZXJpZWQuCisJICoJCXJlZwkJVGhlIHJlZ2lzdGVyIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZQorCSAqCQkJCXJldHJlaXZlZC4KKwkgKgkJdmFsCQlBIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0byBzdG9yZSB0aGUKKwkgKgkJCQlyZXRyaWV2ZWQgdmFsdWUuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIFRMQU4ncyBNSUkgYnVzIHRvIHJldHJlaXZlIHRoZSBjb250ZW50cworCSAqCW9mIGEgZ2l2ZW4gcmVnaXN0ZXIgb24gYSBQSFkuICBJdCBzZW5kcyB0aGUgYXBwcm9wcmlhdGUgaW5mbworCSAqCWFuZCB0aGVuIHJlYWRzIHRoZSAxNi1iaXQgcmVnaXN0ZXIgdmFsdWUgZnJvbSB0aGUgTUlJIGJ1cyB2aWEKKwkgKgl0aGUgVExBTiBTSU8gcmVnaXN0ZXIuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBUTGFuX01paVJlYWRSZWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBwaHksIHUxNiByZWcsIHUxNiAqdmFsICkKK3sKKwl1OAluYWNrOworCXUxNglzaW8sIHRtcDsKKyAJdTMyCWk7CisJaW50CWVycjsKKwlpbnQJbWludGVuOworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwllcnIgPSBGQUxTRTsKKwlvdXR3KFRMQU5fTkVUX1NJTywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXNpbyA9IGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKwkKKwlpZiAoIWluX2lycSgpKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJVExhbl9NaWlTeW5jKGRldi0+YmFzZV9hZGRyKTsKKworCW1pbnRlbiA9IFRMYW5fR2V0Qml0KCBUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8gKTsKKwlpZiAoIG1pbnRlbiApCisJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvKTsKKworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCAweDEsIDIgKTsJLyogU3RhcnQgKCAwMWIgKSAqLworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCAweDIsIDIgKTsJLyogUmVhZCAgKCAxMGIgKSAqLworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCBwaHksIDUgKTsJLyogRGV2aWNlICMgICAgICAqLworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCByZWcsIDUgKTsJLyogUmVnaXN0ZXIgIyAgICAqLworCisKKwlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NVFhFTiwgc2lvKTsJCS8qIENoYW5nZSBkaXJlY3Rpb24gKi8KKworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CQkvKiBDbG9jayBJZGxlIGJpdCAqLworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CQkvKiBXYWl0IDMwMG5zICovCisKKwluYWNrID0gVExhbl9HZXRCaXQoVExBTl9ORVRfU0lPX01EQVRBLCBzaW8pOwkvKiBDaGVjayBmb3IgQUNLICovCisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CQkvKiBGaW5pc2ggQUNLICovCisJaWYgKG5hY2spIHsJCQkJCS8qIE5vIEFDSywgc28gZmFrZSBpdCAqLworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKwkJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQl9CisJCXRtcCA9IDB4ZmZmZjsKKwkJZXJyID0gVFJVRTsKKwl9IGVsc2UgewkJCQkJLyogQUNLLCBzbyByZWFkIGRhdGEgKi8KKwkJZm9yICh0bXAgPSAwLCBpID0gMHg4MDAwOyBpOyBpID4+PSAxKSB7CisJCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQkJaWYgKFRMYW5fR2V0Qml0KFRMQU5fTkVUX1NJT19NREFUQSwgc2lvKSkKKwkJCQl0bXAgfD0gaTsKKwkJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQl9CisJfQorCisKKwlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwkJLyogSWRsZSBjeWNsZSAqLworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCisJaWYgKCBtaW50ZW4gKQorCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8pOworCisJKnZhbCA9IHRtcDsKKwkKKwlpZiAoIWluX2lycSgpKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworCit9IC8qIFRMYW5fTWlpUmVhZFJlZyAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fTWlpU2VuZERhdGEKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJYmFzZV9wb3J0CVRoZSBiYXNlIElPIHBvcnQgb2YgdGhlIGFkYXB0ZXIJaW4KKwkgKgkJCQlxdWVzdGlvbi4KKwkgKgkJZGV2CQlUaGUgYWRkcmVzcyBvZiB0aGUgUEhZIHRvIGJlIHF1ZXJpZWQuCisJICoJCWRhdGEJCVRoZSB2YWx1ZSB0byBiZSBwbGFjZWQgb24gdGhlIE1JSSBidXMuCisJICoJCW51bV9iaXRzCVRoZSBudW1iZXIgb2YgYml0cyBpbiBkYXRhIHRoYXQgYXJlIHRvCisJICoJCQkJYmUgcGxhY2VkIG9uIHRoZSBNSUkgYnVzLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBzZW5kcyBvbiBzZXF1ZW5jZSBvZiBiaXRzIG9uIHRoZSBNSUkKKwkgKgljb25maWd1cmF0aW9uIGJ1cy4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX01paVNlbmREYXRhKCB1MTYgYmFzZV9wb3J0LCB1MzIgZGF0YSwgdW5zaWduZWQgbnVtX2JpdHMgKQoreworCXUxNiBzaW87CisJdTMyIGk7CisKKwlpZiAoIG51bV9iaXRzID09IDAgKQorCQlyZXR1cm47CisKKwlvdXR3KCBUTEFOX05FVF9TSU8sIGJhc2VfcG9ydCArIFRMQU5fRElPX0FEUiApOworCXNpbyA9IGJhc2VfcG9ydCArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CisJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19NVFhFTiwgc2lvICk7CisKKwlmb3IgKCBpID0gKCAweDEgPDwgKCBudW1fYml0cyAtIDEgKSApOyBpOyBpID4+PSAxICkgeworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7CisJCSh2b2lkKSBUTGFuX0dldEJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOworCQlpZiAoIGRhdGEgJiBpICkKKwkJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTURBVEEsIHNpbyApOworCQllbHNlCisJCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fTURBVEEsIHNpbyApOworCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOworCQkodm9pZCkgVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsKKwl9CisKK30gLyogVExhbl9NaWlTZW5kRGF0YSAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fTWlpU3luYworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQliYXNlX3BvcnQJVGhlIGJhc2UgSU8gcG9ydCBvZiB0aGUgYWRhcHRlciBpbgorCSAqCQkJCXF1ZXN0aW9uLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbnMgc3luY3MgYWxsIFBIWXMgaW4gdGVybXMgb2YgdGhlIE1JSSBjb25maWd1cmF0aW9uCisJICoJYnVzLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fTWlpU3luYyggdTE2IGJhc2VfcG9ydCApCit7CisJaW50IGk7CisJdTE2IHNpbzsKKworCW91dHcoIFRMQU5fTkVUX1NJTywgYmFzZV9wb3J0ICsgVExBTl9ESU9fQURSICk7CisJc2lvID0gYmFzZV9wb3J0ICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKworCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19NVFhFTiwgc2lvICk7CisJZm9yICggaSA9IDA7IGkgPCAzMjsgaSsrICkgeworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7CisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7CisJfQorCit9IC8qIFRMYW5fTWlpU3luYyAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fTWlpV3JpdGVSZWcKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJZGV2CQlUaGUgZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhlIGRldmljZQorCSAqCQkJCXRvIHdyaXRlIHRvLgorCSAqCQlwaHkJCVRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgdG8gYmUgd3JpdHRlbiB0by4KKwkgKgkJcmVnCQlUaGUgcmVnaXN0ZXIgd2hvc2UgY29udGVudHMgYXJlIHRvIGJlCisJICoJCQkJd3JpdHRlbi4KKwkgKgkJdmFsCQlUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgcmVnaXN0ZXIuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIFRMQU4ncyBNSUkgYnVzIHRvIHdyaXRlIHRoZSBjb250ZW50cyBvZiBhCisJICoJZ2l2ZW4gcmVnaXN0ZXIgb24gYSBQSFkuICBJdCBzZW5kcyB0aGUgYXBwcm9wcmlhdGUgaW5mbyBhbmQgdGhlbgorCSAqCXdyaXRlcyB0aGUgMTYtYml0IHJlZ2lzdGVyIHZhbHVlIGZyb20gdGhlIE1JSSBjb25maWd1cmF0aW9uIGJ1cworCSAqCXZpYSB0aGUgVExBTiBTSU8gcmVnaXN0ZXIuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgVExhbl9NaWlXcml0ZVJlZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHBoeSwgdTE2IHJlZywgdTE2IHZhbCApCit7CisJdTE2CXNpbzsKKwlpbnQJbWludGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlvdXR3KFRMQU5fTkVUX1NJTywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXNpbyA9IGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKwkKKwlpZiAoIWluX2lycSgpKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJVExhbl9NaWlTeW5jKCBkZXYtPmJhc2VfYWRkciApOworCisJbWludGVuID0gVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyApOworCWlmICggbWludGVuICkKKwkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvICk7CisKKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgMHgxLCAyICk7CS8qIFN0YXJ0ICggMDFiICkgKi8KKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgMHgxLCAyICk7CS8qIFdyaXRlICggMDFiICkgKi8KKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgcGh5LCA1ICk7CS8qIERldmljZSAjICAgICAgKi8KKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgcmVnLCA1ICk7CS8qIFJlZ2lzdGVyICMgICAgKi8KKworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCAweDIsIDIgKTsJLyogU2VuZCBBQ0sgKi8KKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgdmFsLCAxNiApOwkvKiBTZW5kIERhdGEgKi8KKworCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsJLyogSWRsZSBjeWNsZSAqLworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7CisKKwlpZiAoIG1pbnRlbiApCisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8gKTsKKwkKKwlpZiAoIWluX2lycSgpKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKK30gLyogVExhbl9NaWlXcml0ZVJlZyAqLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVGh1bmRlckxBTiBEcml2ZXIgRWVwcm9tIHJvdXRpbmVzCisKKwlUaGUgQ29tcGFxIE5ldGVsbGlnZW50IDEwIGFuZCAxMC8xMDAgY2FyZHMgdXNlIGEgTWljcm9jaGlwIDI0QzAyQQorCUVFUFJPTS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gTWljcm9jaGlwJ3MKKwlkYXRhIHNoZWV0LiAgSSBkb24ndCBrbm93IGhvdyB3ZWxsIHRoaXMgZnVuY3Rpb25zIHdpbGwgd29yayB3aXRoCisJb3RoZXIgRUVQUk9Ncy4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fRWVTZW5kU3RhcnQKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoJCisJICoJCWlvX2Jhc2UJCVRoZSBJTyBwb3J0IGJhc2UgYWRkcmVzcyBmb3IgdGhlCisJICoJCQkJVExBTiBkZXZpY2Ugd2l0aCB0aGUgRUVQUk9NIHRvCisJICoJCQkJdXNlLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBzZW5kcyBhIHN0YXJ0IGN5Y2xlIHRvIGFuIEVFUFJPTSBhdHRhY2hlZAorCSAqCXRvIGEgVExBTiBjaGlwLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fRWVTZW5kU3RhcnQoIHUxNiBpb19iYXNlICkKK3sKKwl1MTYJc2lvOworCisJb3V0dyggVExBTl9ORVRfU0lPLCBpb19iYXNlICsgVExBTl9ESU9fQURSICk7CisJc2lvID0gaW9fYmFzZSArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CisKKwlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKwlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsKKwlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8gKTsKKwlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOworCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisKK30gLyogVExhbl9FZVNlbmRTdGFydCAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fRWVTZW5kQnl0ZQorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJSWYgdGhlIGNvcnJlY3QgYWNrIHdhcyByZWNlaXZlZCwgMCwgb3RoZXJ3aXNlIDEKKwkgKglQYXJtczoJaW9fYmFzZQkJVGhlIElPIHBvcnQgYmFzZSBhZGRyZXNzIGZvciB0aGUKKwkgKgkJCQlUTEFOIGRldmljZSB3aXRoIHRoZSBFRVBST00gdG8KKwkgKgkJCQl1c2UuCisJICoJCWRhdGEJCVRoZSA4IGJpdHMgb2YgaW5mb3JtYXRpb24gdG8KKwkgKgkJCQlzZW5kIHRvIHRoZSBFRVBST00uCisJICoJCXN0b3AJCUlmIFRMQU5fRUVQUk9NX1NUT1AgaXMgcGFzc2VkLCBhCisJICoJCQkJc3RvcCBjeWNsZSBpcyBzZW50IGFmdGVyIHRoZQorCSAqCQkJCWJ5dGUgaXMgc2VudCBhZnRlciB0aGUgYWNrIGlzCisJICoJCQkJcmVhZC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gc2VuZHMgYSBieXRlIG9uIHRoZSBzZXJpYWwgRUVQUk9NIGxpbmUsCisJICoJZHJpdmluZyB0aGUgY2xvY2sgdG8gc2VuZCBlYWNoIGJpdC4gVGhlIGZ1bmN0aW9uIHRoZW4KKwkgKglyZXZlcnNlcyB0cmFuc21pc3Npb24gZGlyZWN0aW9uIGFuZCByZWFkcyBhbiBhY2tub3dsZWRnZQorCSAqCWJpdC4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IFRMYW5fRWVTZW5kQnl0ZSggdTE2IGlvX2Jhc2UsIHU4IGRhdGEsIGludCBzdG9wICkKK3sKKwlpbnQJZXJyOworCXU4CXBsYWNlOworCXUxNglzaW87CisKKwlvdXR3KCBUTEFOX05FVF9TSU8sIGlvX2Jhc2UgKyBUTEFOX0RJT19BRFIgKTsKKwlzaW8gPSBpb19iYXNlICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKworCS8qIEFzc3VtZSBjbG9jayBpcyBsb3csIHR4IGlzIGVuYWJsZWQ7ICovCisJZm9yICggcGxhY2UgPSAweDgwOyBwbGFjZSAhPSAwOyBwbGFjZSA+Pj0gMSApIHsKKwkJaWYgKCBwbGFjZSAmIGRhdGEgKQorCQkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CisJCWVsc2UKKwkJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCX0KKwlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyApOworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCWVyciA9IFRMYW5fR2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOworCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FVFhFTiwgc2lvICk7CisKKwlpZiAoICggISBlcnIgKSAmJiBzdG9wICkgeworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwkvKiBTVE9QLCByYWlzZSBkYXRhIHdoaWxlIGNsb2NrIGlzIGhpZ2ggKi8KKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOworCX0KKworCXJldHVybiAoIGVyciApOworCit9IC8qIFRMYW5fRWVTZW5kQnl0ZSAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fRWVSZWNlaXZlQnl0ZQorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlpb19iYXNlCQlUaGUgSU8gcG9ydCBiYXNlIGFkZHJlc3MgZm9yIHRoZQorCSAqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bworCSAqCQkJCXVzZS4KKwkgKgkJZGF0YQkJQW4gYWRkcmVzcyB0byBhIGNoYXIgdG8gaG9sZCB0aGUKKwkgKgkJCQlkYXRhIHNlbnQgZnJvbSB0aGUgRUVQUk9NLgorCSAqCQlzdG9wCQlJZiBUTEFOX0VFUFJPTV9TVE9QIGlzIHBhc3NlZCwgYQorCSAqCQkJCXN0b3AgY3ljbGUgaXMgc2VudCBhZnRlciB0aGUKKwkgKgkJCQlieXRlIGlzIHJlY2VpdmVkLCBhbmQgbm8gYWNrIGlzCisJICoJCQkJc2VudC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gcmVjZWl2ZXMgOCBiaXRzIG9mIGRhdGEgZnJvbSB0aGUgRUVQUk9NCisJICoJb3ZlciB0aGUgc2VyaWFsIGxpbmsuICBJdCB0aGVuIHNlbmRzIGFuZCBhY2sgYml0LCBvciBubworCSAqCWFjayBhbmQgYSBzdG9wIGJpdC4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZQorCSAqCWRhdGEgYWZ0ZXIgdGhlIGFkZHJlc3Mgb2YgYSBieXRlIGluIHRoZSBFRVBST00gaGFzIGJlZW4KKwkgKglzZW50LgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fRWVSZWNlaXZlQnl0ZSggdTE2IGlvX2Jhc2UsIHU4ICpkYXRhLCBpbnQgc3RvcCApCit7CisJdTggIHBsYWNlOworCXUxNiBzaW87CisKKwlvdXR3KCBUTEFOX05FVF9TSU8sIGlvX2Jhc2UgKyBUTEFOX0RJT19BRFIgKTsKKwlzaW8gPSBpb19iYXNlICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKwkqZGF0YSA9IDA7CisKKwkvKiBBc3N1bWUgY2xvY2sgaXMgbG93LCB0eCBpcyBlbmFibGVkOyAqLworCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FVFhFTiwgc2lvICk7CisJZm9yICggcGxhY2UgPSAweDgwOyBwbGFjZTsgcGxhY2UgPj49IDEgKSB7CisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCQlpZiAoIFRMYW5fR2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApICkKKwkJCSpkYXRhIHw9IHBsYWNlOworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCX0KKworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyApOworCWlmICggISBzdG9wICkgeworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwkvKiBBY2sgPSAwICovCisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCX0gZWxzZSB7CisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwkJLyogTm8gYWNrID0gMSAoPykgKi8KKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CS8qIFNUT1AsIHJhaXNlIGRhdGEgd2hpbGUgY2xvY2sgaXMgaGlnaCAqLworCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CisJfQorCit9IC8qIFRMYW5fRWVSZWNlaXZlQnl0ZSAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fRWVSZWFkQnl0ZQorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm8gZXJyb3IgPSAwLCBlbHNlLCB0aGUgc3RhZ2UgYXQgd2hpY2ggdGhlIGVycm9yCisJICoJCW9jY3VycmVkLgorCSAqCVBhcm1zOgorCSAqCQlpb19iYXNlCQlUaGUgSU8gcG9ydCBiYXNlIGFkZHJlc3MgZm9yIHRoZQorCSAqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bworCSAqCQkJCXVzZS4KKwkgKgkJZWVfYWRkcgkJVGhlIGFkZHJlc3Mgb2YgdGhlIGJ5dGUgaW4gdGhlCisJICoJCQkJRUVQUk9NIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZQorCSAqCQkJCXJldHJpZXZlZC4KKwkgKgkJZGF0YQkJQW4gYWRkcmVzcyB0byBhIGNoYXIgdG8gaG9sZCB0aGUKKwkgKgkJCQlkYXRhIG9idGFpbmVkIGZyb20gdGhlIEVFUFJPTS4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gcmVhZHMgYSBieXRlIG9mIGluZm9ybWF0aW9uIGZyb20gYW4gYnl0ZQorCSAqCWNlbGwgaW4gdGhlIEVFUFJPTS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IFRMYW5fRWVSZWFkQnl0ZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggZWVfYWRkciwgdTggKmRhdGEgKQoreworCWludCBlcnI7CisJVExhblByaXZhdGVJbmZvICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpbnQgcmV0PTA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJVExhbl9FZVNlbmRTdGFydCggZGV2LT5iYXNlX2FkZHIgKTsKKwllcnIgPSBUTGFuX0VlU2VuZEJ5dGUoIGRldi0+YmFzZV9hZGRyLCAweEEwLCBUTEFOX0VFUFJPTV9BQ0sgKTsKKwlpZiAoZXJyKQorCXsKKwkJcmV0PTE7CisJCWdvdG8gZmFpbDsKKwl9CisJZXJyID0gVExhbl9FZVNlbmRCeXRlKCBkZXYtPmJhc2VfYWRkciwgZWVfYWRkciwgVExBTl9FRVBST01fQUNLICk7CisJaWYgKGVycikKKwl7CisJCXJldD0yOworCQlnb3RvIGZhaWw7CisJfQorCVRMYW5fRWVTZW5kU3RhcnQoIGRldi0+YmFzZV9hZGRyICk7CisJZXJyID0gVExhbl9FZVNlbmRCeXRlKCBkZXYtPmJhc2VfYWRkciwgMHhBMSwgVExBTl9FRVBST01fQUNLICk7CisJaWYgKGVycikKKwl7CisJCXJldD0zOworCQlnb3RvIGZhaWw7CisJfQorCVRMYW5fRWVSZWNlaXZlQnl0ZSggZGV2LT5iYXNlX2FkZHIsIGRhdGEsIFRMQU5fRUVQUk9NX1NUT1AgKTsKK2ZhaWw6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKKworfSAvKiBUTGFuX0VlUmVhZEJ5dGUgKi8KKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RsYW4uaCBiL2RyaXZlcnMvbmV0L3RsYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDMyYmM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdGxhbi5oCkBAIC0wLDAgKzEsNTQwIEBACisjaWZuZGVmIFRMQU5fSAorI2RlZmluZSBUTEFOX0gKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBMaW51eCBUaHVuZGVyTEFOIERyaXZlcgorICoKKyAqICB0bGFuLmgKKyAqICBieSBKYW1lcyBCYW5rcworICoKKyAqICAoQykgMTk5Ny0xOTk4IENhbGRlcmEsIEluYy4KKyAqICAoQykgMTk5OS0yMDAxIFRvcmJlbiBNYXRoaWFzZW4KKyAqIAorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqKiBUaGlzIGZpbGUgaXMgYmVzdCB2aWV3ZWQvZWRpdGVkIHdpdGggdGFic3RvcD00LCBjb2x1bXM+PTEzMgorICoKKyAqICAKKyAqICBEZWMgMTAsIDE5OTkJVG9yYmVuIE1hdGhpYXNlbiA8dG9yYmVuLm1hdGhpYXNlbkBjb21wYXEuY29tPgorICoJCQlOZXcgTWFpbnRhaW5lcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogVExhbiBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRkFMU0UJCQkwCisjZGVmaW5lIFRSVUUJCQkxCisKKyNkZWZpbmUgVExBTl9NSU5fRlJBTUVfU0laRQk2NAorI2RlZmluZSBUTEFOX01BWF9GUkFNRV9TSVpFCTE2MDAKKworI2RlZmluZSBUTEFOX05VTV9SWF9MSVNUUwkzMgorI2RlZmluZSBUTEFOX05VTV9UWF9MSVNUUwk2NAorCisjZGVmaW5lIFRMQU5fSUdOT1JFCQkwCisjZGVmaW5lIFRMQU5fUkVDT1JECQkxCisKKyNkZWZpbmUgVExBTl9EQkcobHZsLCBmb3JtYXQsIGFyZ3MuLi4pCWlmIChkZWJ1ZyZsdmwpIHByaW50ayhLRVJOX0RFQlVHICJUTEFOOiAiIGZvcm1hdCwgIyNhcmdzICk7CisjZGVmaW5lIFRMQU5fREVCVUdfR05STAkJMHgwMDAxCisjZGVmaW5lIFRMQU5fREVCVUdfVFgJCTB4MDAwMgorI2RlZmluZSBUTEFOX0RFQlVHX1JYCQkweDAwMDQgCisjZGVmaW5lIFRMQU5fREVCVUdfTElTVAkJMHgwMDA4CisjZGVmaW5lIFRMQU5fREVCVUdfUFJPQkUJMHgwMDEwCisKKyNkZWZpbmUgVFhfVElNRU9VVAkJKDEwKkhaKQkgLyogV2UgbmVlZCB0aW1lIGZvciBhdXRvLW5lZyAqLworI2RlZmluZSBNQVhfVExBTl9CT0FSRFMJCTgJIC8qIE1heCBudW1iZXIgb2YgYm9hcmRzIGluc3RhbGxlZCBhdCBhIHRpbWUgKi8KKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogRGV2aWNlIElkZW50aWZpY2F0aW9uIERlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkJCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVURUxMSUdFTlRfMTBfVDIJCQkweEIwMTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRFTExJR0VOVF8xMF8xMDBfV1NfNTEwMAkweEIwMzAKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMTgzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjE4MwkJCTB4MDAxMworI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjUJCQkweDAwMTIKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI2CQkJMHgwMDE0CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgdGxhbl9hZGFwdGVyX2VudHJ5IHsKKwl1MTYJdmVuZG9ySWQ7CisJdTE2CWRldmljZUlkOworCWNoYXIJKmRldmljZUxhYmVsOworCXUzMglmbGFnczsKKwl1MTYJYWRkck9mczsKK30gVExhbkFkYXB0ZXJFbnRyeTsKKworI2RlZmluZSBUTEFOX0FEQVBURVJfTk9ORQkJMHgwMDAwMDAwMAorI2RlZmluZSBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWQkweDAwMDAwMDAxCisjZGVmaW5lIFRMQU5fQURBUFRFUl9CSVRfUkFURV9QSFkJMHgwMDAwMDAwMgorI2RlZmluZSBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMAkweDAwMDAwMDA0CisjZGVmaW5lIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQJMHgwMDAwMDAwOAorCisjZGVmaW5lIFRMQU5fU1BFRURfREVGQVVMVAkwCisjZGVmaW5lIFRMQU5fU1BFRURfMTAJCTEwCisjZGVmaW5lIFRMQU5fU1BFRURfMTAwCQkxMDAKKworI2RlZmluZSBUTEFOX0RVUExFWF9ERUZBVUxUCTAKKyNkZWZpbmUgVExBTl9EVVBMRVhfSEFMRgkxCisjZGVmaW5lIFRMQU5fRFVQTEVYX0ZVTEwJMgorCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEVJU0EgRGVmaW5pdGlvbnMKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVJU0FfSUQgICAgICAweGM4MCAgIC8qIEVJU0EgSUQgUmVnaXN0ZXJzICovIAorI2RlZmluZSBFSVNBX0lEMCAgICAgMHhjODAgICAvKiBFSVNBIElEIFJlZ2lzdGVyIDAgKi8gCisjZGVmaW5lIEVJU0FfSUQxICAgICAweGM4MSAgIC8qIEVJU0EgSUQgUmVnaXN0ZXIgMSAqLyAKKyNkZWZpbmUgRUlTQV9JRDIgICAgIDB4YzgyICAgLyogRUlTQSBJRCBSZWdpc3RlciAyICovIAorI2RlZmluZSBFSVNBX0lEMyAgICAgMHhjODMgICAvKiBFSVNBIElEIFJlZ2lzdGVyIDMgKi8gCisjZGVmaW5lIEVJU0FfQ1IgICAgICAweGM4NCAgIC8qIEVJU0EgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBFSVNBX1JFRzAgICAgMHhjODggICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMCAqLworI2RlZmluZSBFSVNBX1JFRzEgICAgMHhjODkgICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZSBFSVNBX1JFRzIgICAgMHhjOGEgICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZSBFSVNBX1JFRzMgICAgMHhjOGYgICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMyAqLworI2RlZmluZSBFSVNBX0FQUk9NICAgMHhjOTAgICAvKiBFdGhlcm5ldCBBZGRyZXNzIFBST00gKi8KKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBSeC9UeCBMaXN0IERlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUTEFOX0JVRkZFUlNfUEVSX0xJU1QJMTAKKyNkZWZpbmUgVExBTl9MQVNUX0JVRkZFUgkweDgwMDAwMDAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfVU5VU0VECTB4ODAwMAorI2RlZmluZSBUTEFOX0NTVEFUX0ZSTV9DTVAJMHg0MDAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfUkVBRFkJMHgzMDAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfRU9DCQkweDA4MDAKKyNkZWZpbmUgVExBTl9DU1RBVF9SWF9FUlJPUgkweDA0MDAKKyNkZWZpbmUgVExBTl9DU1RBVF9QQVNTX0NSQwkweDAyMDAKKyNkZWZpbmUgVExBTl9DU1RBVF9EUF9QUgkweDAxMDAKKworCit0eXBlZGVmIHN0cnVjdCB0bGFuX2J1ZmZlcl9yZWZfdGFnIHsKKwl1MzIJY291bnQ7CisJdTMyCWFkZHJlc3M7Cit9IFRMYW5CdWZmZXJSZWY7CisKKwordHlwZWRlZiBzdHJ1Y3QgdGxhbl9saXN0X3RhZyB7CisJdTMyCQlmb3J3YXJkOworCXUxNgkJY1N0YXQ7CisJdTE2CQlmcmFtZVNpemU7CisJVExhbkJ1ZmZlclJlZglidWZmZXJbVExBTl9CVUZGRVJTX1BFUl9MSVNUXTsKK30gVExhbkxpc3Q7CisKKwordHlwZWRlZiB1OCBUTGFuQnVmZmVyW1RMQU5fTUFYX0ZSQU1FX1NJWkVdOworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogUEhZIGRlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUTEFOX1BIWV9NQVhfQUREUgkweDFGCisjZGVmaW5lIFRMQU5fUEhZX05PTkUJCTB4MjAKKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFRMQU4gUHJpdmF0ZSBJbmZvcm1hdGlvbiBTdHJ1Y3R1cmUKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB0bGFuX3ByaXZhdGVfdGFnIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqbmV4dERldmljZTsKKwlzdHJ1Y3QgcGNpX2RldgkJKnBjaURldjsKKwl2b2lkCQkJKmRtYVN0b3JhZ2U7CisJZG1hX2FkZHJfdAkJZG1hU3RvcmFnZURNQTsKKwl1bnNpZ25lZCBpbnQJCWRtYVNpemU7CisJdTgJCQkqcGFkQnVmZmVyOworCVRMYW5MaXN0ICAgICAgICAgICAgICAgICpyeExpc3Q7CisJZG1hX2FkZHJfdAkJcnhMaXN0RE1BOworCXU4CQkJKnJ4QnVmZmVyOworCWRtYV9hZGRyX3QJCXJ4QnVmZmVyRE1BOworCXUzMiAgICAgICAgICAgICAgICAgICAgIHJ4SGVhZDsKKwl1MzIgICAgICAgICAgICAgICAgICAgICByeFRhaWw7CisJdTMyCQkJcnhFb2NDb3VudDsKKwlUTGFuTGlzdCAgICAgICAgICAgICAgICAqdHhMaXN0OworCWRtYV9hZGRyX3QJCXR4TGlzdERNQTsKKwl1OAkJCSp0eEJ1ZmZlcjsKKwlkbWFfYWRkcl90CQl0eEJ1ZmZlckRNQTsKKwl1MzIgICAgICAgICAgICAgICAgICAgICB0eEhlYWQ7CisJdTMyICAgICAgICAgICAgICAgICAgICAgdHhJblByb2dyZXNzOworCXUzMiAgICAgICAgICAgICAgICAgICAgIHR4VGFpbDsKKwl1MzIJCQl0eEJ1c3lDb3VudDsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBwaHlPbmxpbmU7CisJdTMyCQkJdGltZXJTZXRBdDsKKwl1MzIJCQl0aW1lclR5cGU7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisJc3RydWN0IGJvYXJkCQkqYWRhcHRlcjsKKwl1MzIJCQlhZGFwdGVyUmV2OworCXUzMgkJCWF1aTsKKwl1MzIJCQlkZWJ1ZzsKKwl1MzIJCQlkdXBsZXg7CisJdTMyCQkJcGh5WzJdOworCXUzMgkJCXBoeU51bTsKKwl1MzIJCQlzcGVlZDsKKwl1OAkJCXRsYW5SZXY7CisJdTgJCQl0bGFuRnVsbER1cGxleDsKKwljaGFyICAgICAgICAgICAgICAgICAgICBkZXZOYW1lWzhdOworCXNwaW5sb2NrX3QJCWxvY2s7CisJdTgJCQlsaW5rOworCXU4CQkJaXNfZWlzYTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCQl0bGFuX3RxdWV1ZTsKKwl1OAkJCW5lZ19iZV92ZXJib3NlOworfSBUTGFuUHJpdmF0ZUluZm87CisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBUTGFuIERyaXZlciBUaW1lciBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9USU1FUl9MSU5LX0JFQVQJCTEKKyNkZWZpbmUgVExBTl9USU1FUl9BQ1RJVklUWQkJMgorI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9QRE9XTgkJMworI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9QVVAJCTQKKyNkZWZpbmUgVExBTl9USU1FUl9QSFlfUkVTRVQJCTUKKyNkZWZpbmUgVExBTl9USU1FUl9QSFlfU1RBUlRfTElOSwk2CisjZGVmaW5lIFRMQU5fVElNRVJfUEhZX0ZJTklTSF9BTgk3CisjZGVmaW5lIFRMQU5fVElNRVJfRklOSVNIX1JFU0VUCQk4CisKKyNkZWZpbmUgVExBTl9USU1FUl9BQ1RfREVMQVkJCShIWi8xMCkKKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFRMYW4gRHJpdmVyIEVlcHJvbSBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9FRVBST01fQUNLCQkwCisjZGVmaW5lIFRMQU5fRUVQUk9NX1NUT1AJMQorCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogSG9zdCBSZWdpc3RlciBPZmZzZXRzIGFuZCBDb250ZW50cworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9IT1NUX0NNRAkJCTB4MDAKKyNkZWZpbmUgCVRMQU5fSENfR08JCTB4ODAwMDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfU1RPUAkJMHg0MDAwMDAwMAorI2RlZmluZQkJVExBTl9IQ19BQ0sJCTB4MjAwMDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfQ1NfTUFTSwkJMHgxRkUwMDAwMAorI2RlZmluZQkJVExBTl9IQ19FT0MJCTB4MDAxMDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfUlQJCTB4MDAwODAwMDAKKyNkZWZpbmUJCVRMQU5fSENfTkVTCQkweDAwMDQwMDAwCisjZGVmaW5lCQlUTEFOX0hDX0FEX1JTVAkJMHgwMDAwODAwMAorI2RlZmluZQkJVExBTl9IQ19MRF9UTVIJCTB4MDAwMDQwMDAKKyNkZWZpbmUJCVRMQU5fSENfTERfVEhSCQkweDAwMDAyMDAwCisjZGVmaW5lCQlUTEFOX0hDX1JFUV9JTlQJCTB4MDAwMDEwMDAKKyNkZWZpbmUJCVRMQU5fSENfSU5UX09GRgkJMHgwMDAwMDgwMAorI2RlZmluZQkJVExBTl9IQ19JTlRfT04JCTB4MDAwMDA0MDAKKyNkZWZpbmUJCVRMQU5fSENfQUNfTUFTSwkJMHgwMDAwMDBGRgorI2RlZmluZSBUTEFOX0NIX1BBUk0JCQkweDA0CisjZGVmaW5lIFRMQU5fRElPX0FEUgkJCTB4MDgKKyNkZWZpbmUJCVRMQU5fREFfQURSX0lOQwkJMHg4MDAwCisjZGVmaW5lCQlUTEFOX0RBX1JBTV9BRFIJCTB4NDAwMAorI2RlZmluZSBUTEFOX0hPU1RfSU5UCQkJMHgwQQorI2RlZmluZQkJVExBTl9ISV9JVl9NQVNLCQkweDFGRTAKKyNkZWZpbmUJCVRMQU5fSElfSVRfTUFTSwkJMHgwMDFDCisjZGVmaW5lIFRMQU5fRElPX0RBVEEJCQkweDBDCisKKworLyogVGh1bmRlckxBTiBJbnRlcm5hbCBSZWdpc3RlciBESU8gT2Zmc2V0cyAqLworCisjZGVmaW5lIFRMQU5fTkVUX0NNRAkJCTB4MDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9OUkVTRVQJMHg4MAorI2RlZmluZQkJVExBTl9ORVRfQ01EX05XUkFQCTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9DU0YJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfQ01EX0NBRgkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9DTURfTk9CUlgJMHgwOAorI2RlZmluZQkJVExBTl9ORVRfQ01EX0RVUExFWAkweDA0CisjZGVmaW5lCQlUTEFOX05FVF9DTURfVFJGUkFNCTB4MDIKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9UWFBBQ0UJMHgwMQorI2RlZmluZSBUTEFOX05FVF9TSU8JCQkweDAxCisjZGVmaW5lIAlUTEFOX05FVF9TSU9fTUlOVEVOCTB4ODAKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19FQ0xPSwkweDQwCisjZGVmaW5lCQlUTEFOX05FVF9TSU9fRVRYRU4JMHgyMAorI2RlZmluZQkJVExBTl9ORVRfU0lPX0VEQVRBCTB4MTAKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19OTVJTVAkweDA4CisjZGVmaW5lCQlUTEFOX05FVF9TSU9fTUNMSwkweDA0CisjZGVmaW5lCQlUTEFOX05FVF9TSU9fTVRYRU4JMHgwMgorI2RlZmluZQkJVExBTl9ORVRfU0lPX01EQVRBCTB4MDEKKyNkZWZpbmUgVExBTl9ORVRfU1RTCQkJMHgwMgorI2RlZmluZQkJVExBTl9ORVRfU1RTX01JUlEJMHg4MAorI2RlZmluZQkJVExBTl9ORVRfU1RTX0hCRUFUCTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX1NUU19UWFNUT1AJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfU1RTX1JYU1RPUAkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9TVFNfUlNSVkQJMHgwRgorI2RlZmluZSBUTEFOX05FVF9NQVNLCQkJMHgwMworI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNwkweDgwCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX01BU0s2CTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX01BU0tfTUFTSzUJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNAkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX1JTUlZECTB4MEYKKyNkZWZpbmUgVExBTl9ORVRfQ09ORklHCQkJMHgwNAorI2RlZmluZSAJVExBTl9ORVRfQ0ZHX1JDTEsJMHg4MDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfVENMSwkweDQwMDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19CSVQJMHgyMDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfUlhDUkMJMHgxMDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfUEVGCTB4MDgwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHXzFGUkFHCTB4MDQwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHXzFDSEFOCTB4MDIwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX01URVNUCTB4MDEwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1BIWV9FTgkweDAwODAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19NU01BU0sJMHgwMDdGCisjZGVmaW5lIFRMQU5fTUFOX1RFU1QJCQkweDA2CisjZGVmaW5lIFRMQU5fREVGX1ZFTkRPUl9JRAkJMHgwOAorI2RlZmluZSBUTEFOX0RFRl9ERVZJQ0VfSUQJCTB4MEEKKyNkZWZpbmUgVExBTl9ERUZfUkVWSVNJT04JCTB4MEMKKyNkZWZpbmUgVExBTl9ERUZfU1VCQ0xBU1MJCTB4MEQKKyNkZWZpbmUgVExBTl9ERUZfTUlOX0xBVAkJMHgwRQorI2RlZmluZSBUTEFOX0RFRl9NQVhfTEFUCQkweDBGCisjZGVmaW5lIFRMQU5fQVJFR18wCQkJMHgxMAorI2RlZmluZSBUTEFOX0FSRUdfMQkJCTB4MTYKKyNkZWZpbmUgVExBTl9BUkVHXzIJCQkweDFDCisjZGVmaW5lIFRMQU5fQVJFR18zCQkJMHgyMgorI2RlZmluZSBUTEFOX0hBU0hfMQkJCTB4MjgKKyNkZWZpbmUgVExBTl9IQVNIXzIJCQkweDJDCisjZGVmaW5lIFRMQU5fR09PRF9UWF9GUk1TCQkweDMwCisjZGVmaW5lIFRMQU5fVFhfVU5ERVJVTlMJCTB4MzMKKyNkZWZpbmUgVExBTl9HT09EX1JYX0ZSTVMJCTB4MzQKKyNkZWZpbmUgVExBTl9SWF9PVkVSUlVOUwkJMHgzNworI2RlZmluZSBUTEFOX0RFRkVSUkVEX1RYCQkweDM4CisjZGVmaW5lIFRMQU5fQ1JDX0VSUk9SUwkJCTB4M0EKKyNkZWZpbmUgVExBTl9DT0RFX0VSUk9SUwkJMHgzQgorI2RlZmluZSBUTEFOX01VTFRJQ09MX0ZSTVMJCTB4M0MKKyNkZWZpbmUgVExBTl9TSU5HTEVDT0xfRlJNUwkJMHgzRQorI2RlZmluZSBUTEFOX0VYQ0VTU0NPTF9GUk1TCQkweDQwCisjZGVmaW5lIFRMQU5fTEFURV9DT0xTCQkJMHg0MQorI2RlZmluZSBUTEFOX0NBUlJJRVJfTE9TUwkJMHg0MgorI2RlZmluZSBUTEFOX0FDT01NSVQJCQkweDQzCisjZGVmaW5lIFRMQU5fTEVEX1JFRwkJCTB4NDQKKyNkZWZpbmUJCVRMQU5fTEVEX0FDVAkJMHgxMAorI2RlZmluZQkJVExBTl9MRURfTElOSwkJMHgwMQorI2RlZmluZSBUTEFOX0JTSVpFX1JFRwkJCTB4NDUKKyNkZWZpbmUgVExBTl9NQVhfUlgJCQkweDQ2CisjZGVmaW5lIFRMQU5fSU5UX0RJUwkJCTB4NDgKKyNkZWZpbmUJCVRMQU5fSURfVFhfRU9DCQkweDA0CisjZGVmaW5lCQlUTEFOX0lEX1JYX0VPRgkJMHgwMgorI2RlZmluZQkJVExBTl9JRF9SWF9FT0MJCTB4MDEKKworCisKKy8qIFRodW5kZXJMQU4gSW50ZXJydXB0IENvZGVzICovCisKKyNkZWZpbmUgVExBTl9JTlRfTlVNQkVSX09GX0lOVFMJOAorCisjZGVmaW5lIFRMQU5fSU5UX05PTkUJCQkweDAwMDAKKyNkZWZpbmUgVExBTl9JTlRfVFhfRU9GCQkJMHgwMDAxCisjZGVmaW5lIFRMQU5fSU5UX1NUQVRfT1ZFUkZMT1cJCTB4MDAwMgorI2RlZmluZSBUTEFOX0lOVF9SWF9FT0YJCQkweDAwMDMKKyNkZWZpbmUgVExBTl9JTlRfRFVNTVkJCQkweDAwMDQKKyNkZWZpbmUgVExBTl9JTlRfVFhfRU9DCQkJMHgwMDA1CisjZGVmaW5lIFRMQU5fSU5UX1NUQVRVU19DSEVDSwkJMHgwMDA2CisjZGVmaW5lIFRMQU5fSU5UX1JYX0VPQwkJCTB4MDAwNworCisKKworLyogVGh1bmRlckxBTiBNSUkgUmVnaXN0ZXJzICovCisKKy8qIEdlbmVyaWMgTUlJL1BIWSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBNSUlfR0VOX0NUTAkJCTB4MDAKKyNkZWZpbmUgCU1JSV9HQ19SRVNFVAkJMHg4MDAwCisjZGVmaW5lCQlNSUlfR0NfTE9PUEJLCQkweDQwMDAKKyNkZWZpbmUJCU1JSV9HQ19TUEVFRFNFTAkJMHgyMDAwCisjZGVmaW5lCQlNSUlfR0NfQVVUT0VOQgkJMHgxMDAwCisjZGVmaW5lCQlNSUlfR0NfUERPV04JCTB4MDgwMAorI2RlZmluZQkJTUlJX0dDX0lTT0xBVEUJCTB4MDQwMAorI2RlZmluZQkJTUlJX0dDX0FVVE9SU1JUCQkweDAyMDAKKyNkZWZpbmUJCU1JSV9HQ19EVVBMRVgJCTB4MDEwMAorI2RlZmluZQkJTUlJX0dDX0NPTFRFU1QJCTB4MDA4MAorI2RlZmluZQkJTUlJX0dDX1JFU0VSVkVECQkweDAwN0YKKyNkZWZpbmUgTUlJX0dFTl9TVFMJCQkweDAxCisjZGVmaW5lCQlNSUlfR1NfMTAwQlQ0CQkweDgwMDAKKyNkZWZpbmUJCU1JSV9HU18xMDBCVFhGRAkJMHg0MDAwCisjZGVmaW5lCQlNSUlfR1NfMTAwQlRYSEQJCTB4MjAwMAorI2RlZmluZQkJTUlJX0dTXzEwQlRGRAkJMHgxMDAwCisjZGVmaW5lCQlNSUlfR1NfMTBCVEhECQkweDA4MDAKKyNkZWZpbmUJCU1JSV9HU19SRVNFUlZFRAkJMHgwN0MwCisjZGVmaW5lCQlNSUlfR1NfQVVUT0NNUExUCTB4MDAyMAorI2RlZmluZQkJTUlJX0dTX1JGTFQJCTB4MDAxMAorI2RlZmluZQkJTUlJX0dTX0FVVE9ORUcJCTB4MDAwOAorI2RlZmluZQkJTUlJX0dTX0xJTksJCTB4MDAwNAorI2RlZmluZQkJTUlJX0dTX0pBQkJFUgkJMHgwMDAyCisjZGVmaW5lCQlNSUlfR1NfRVhUQ0FQCQkweDAwMDEKKyNkZWZpbmUgTUlJX0dFTl9JRF9ISQkJCTB4MDIKKyNkZWZpbmUgTUlJX0dFTl9JRF9MTwkJCTB4MDMKKyNkZWZpbmUgCU1JSV9HSUxfT1VJCQkweEZDMDAKKyNkZWZpbmUgCU1JSV9HSUxfTU9ERUwJCTB4MDNGMAorI2RlZmluZSAJTUlJX0dJTF9SRVZJU0lPTgkweDAwMEYKKyNkZWZpbmUgTUlJX0FOX0FEVgkJCTB4MDQKKyNkZWZpbmUgTUlJX0FOX0xQQQkJCTB4MDUKKyNkZWZpbmUgTUlJX0FOX0VYUAkJCTB4MDYKKworLyogVGh1bmRlckxBTiBTcGVjaWZpYyBNSUkvUEhZIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIFRMQU5fVExQSFlfSUQJCQkweDEwCisjZGVmaW5lIFRMQU5fVExQSFlfQ1RMCQkJMHgxMQorI2RlZmluZSAJVExBTl9UQ19JR0xJTksJCTB4ODAwMAorI2RlZmluZQkJVExBTl9UQ19TV0FQT0wJCTB4NDAwMAorI2RlZmluZQkJVExBTl9UQ19BVUlTRUwJCTB4MjAwMAorI2RlZmluZQkJVExBTl9UQ19TUUVFTgkJMHgxMDAwCisjZGVmaW5lCQlUTEFOX1RDX01URVNUCQkweDA4MDAKKyNkZWZpbmUJCVRMQU5fVENfUkVTRVJWRUQJMHgwN0Y4CisjZGVmaW5lCQlUTEFOX1RDX05GRVcJCTB4MDAwNAorI2RlZmluZQkJVExBTl9UQ19JTlRFTgkJMHgwMDAyCisjZGVmaW5lCQlUTEFOX1RDX1RJTlQJCTB4MDAwMQorI2RlZmluZSBUTEFOX1RMUEhZX1NUUwkJCTB4MTIKKyNkZWZpbmUJCVRMQU5fVFNfTUlOVAkJMHg4MDAwCisjZGVmaW5lCQlUTEFOX1RTX1BIT0sJCTB4NDAwMAorI2RlZmluZQkJVExBTl9UU19QT0xPSwkJMHgyMDAwCisjZGVmaW5lCQlUTEFOX1RTX1RQRU5FUkdZCTB4MTAwMAorI2RlZmluZQkJVExBTl9UU19SRVNFUlZFRAkweDBGRkYKKyNkZWZpbmUgVExBTl9UTFBIWV9QQVIJCQkweDE5CisjZGVmaW5lCQlUTEFOX1BIWV9DSU1fU1RBVAkweDAwMjAKKyNkZWZpbmUJCVRMQU5fUEhZX1NQRUVEXzEwMAkweDAwNDAKKyNkZWZpbmUJCVRMQU5fUEhZX0RVUExFWF9GVUxMCTB4MDA4MAorI2RlZmluZQkJVExBTl9QSFlfQU5fRU5fU1RBVCAgICAgMHgwNDAwCisKKy8qIE5hdGlvbmFsIFNlbS4gJiBMZXZlbDEgUEhZIGlkJ3MgKi8KKyNkZWZpbmUgTkFUX1NFTV9JRDEJCQkweDIwMDAKKyNkZWZpbmUgTkFUX1NFTV9JRDIJCQkweDVDMDEKKyNkZWZpbmUgTEVWRUwxX0lEMQkJCTB4NzgxMAorI2RlZmluZSBMRVZFTDFfSUQyCQkJMHgwMDAwCisKKyNkZWZpbmUgQ0lSQ19JTkMoIGEsIGIgKSBpZiAoICsrYSA+PSBiICkgYSA9IDAKKworLyogUm91dGluZXMgdG8gYWNjZXNzIGludGVybmFsIHJlZ2lzdGVycy4gKi8KKworc3RhdGljIGlubGluZSB1OCBUTGFuX0Rpb1JlYWQ4KHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyKQoreworCW91dHcoaW50ZXJuYWxfYWRkciwgYmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKKwlyZXR1cm4gKGluYigoYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSkgKyAoaW50ZXJuYWxfYWRkciAmIDB4MykpKTsKKwkKK30gLyogVExhbl9EaW9SZWFkOCAqLworCisKKworCitzdGF0aWMgaW5saW5lIHUxNiBUTGFuX0Rpb1JlYWQxNih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkcikKK3sKKwlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJcmV0dXJuIChpbncoKGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEpICsgKGludGVybmFsX2FkZHIgJiAweDIpKSk7CisKK30gLyogVExhbl9EaW9SZWFkMTYgKi8KKworCisKKworc3RhdGljIGlubGluZSB1MzIgVExhbl9EaW9SZWFkMzIodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXJldHVybiAoaW5sKGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEpKTsKKworfSAvKiBUTGFuX0Rpb1JlYWQzMiAqLworCisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgVExhbl9EaW9Xcml0ZTgodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIsIHU4IGRhdGEpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCW91dGIoZGF0YSwgYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIChpbnRlcm5hbF9hZGRyICYgMHgzKSk7CisKK30KKworCisKKworc3RhdGljIGlubGluZSB2b2lkIFRMYW5fRGlvV3JpdGUxNih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkciwgdTE2IGRhdGEpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCW91dHcoZGF0YSwgYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIChpbnRlcm5hbF9hZGRyICYgMHgyKSk7CisKK30KKworCisKKworc3RhdGljIGlubGluZSB2b2lkIFRMYW5fRGlvV3JpdGUzMih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkciwgdTMyIGRhdGEpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCW91dGwoZGF0YSwgYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIChpbnRlcm5hbF9hZGRyICYgMHgyKSk7CisKK30KKworI2RlZmluZSBUTGFuX0NsZWFyQml0KCBiaXQsIHBvcnQgKQlvdXRiX3AoaW5iX3AocG9ydCkgJiB+Yml0LCBwb3J0KQorI2RlZmluZSBUTGFuX0dldEJpdCggYml0LCBwb3J0ICkJKChpbnQpIChpbmJfcChwb3J0KSAmIGJpdCkpCisjZGVmaW5lIFRMYW5fU2V0Qml0KCBiaXQsIHBvcnQgKQlvdXRiX3AoaW5iX3AocG9ydCkgfCBiaXQsIHBvcnQpCisKKy8qCisgKiBnaXZlbiA2IGJ5dGVzLCB2aWV3IHRoZW0gYXMgOCA2LWJpdCBudW1iZXJzIGFuZCByZXR1cm4gdGhlIFhPUiBvZiB0aG9zZSAKKyAqIHRoZSBjb2RlIGJlbG93IGlzIGFib3V0IHNldmVuIHRpbWVzIGFzIGZhc3QgYXMgdGhlIG9yaWdpbmFsIGNvZGUgCisgKgorICogVGhlIG9yaWdpbmFsIGNvZGUgd2FzOgorICoKKyAqIHUzMgl4b3IoIHUzMiBhLCB1MzIgYiApIHsJcmV0dXJuICggKCBhICYmICEgYiApIHx8ICggISBhICYmIGIgKSApOyB9CisgKgorICogI2RlZmluZSBYT1I4KCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoICkJXAorICogCXhvciggYSwgeG9yKCBiLCB4b3IoIGMsIHhvciggZCwgeG9yKCBlLCB4b3IoIGYsIHhvciggZywgaCApICkgKSApICkgKSApCisgKiAjZGVmaW5lIERBKCBhLCBiaXQgKQkJKCAoICh1OCkgYVtiaXQvOF0gKSAmICggKHU4KSAoIDEgPDwgYml0JTggKSApICkKKyAqCisgKiAJaGFzaCAgPSBYT1I4KCBEQShhLDApLCBEQShhLCA2KSwgREEoYSwxMiksIERBKGEsMTgpLCBEQShhLDI0KSwgREEoYSwzMCksIERBKGEsMzYpLCBEQShhLDQyKSApOworICogCWhhc2ggfD0gWE9SOCggREEoYSwxKSwgREEoYSwgNyksIERBKGEsMTMpLCBEQShhLDE5KSwgREEoYSwyNSksIERBKGEsMzEpLCBEQShhLDM3KSwgREEoYSw0MykgKSA8PCAxOworICogCWhhc2ggfD0gWE9SOCggREEoYSwyKSwgREEoYSwgOCksIERBKGEsMTQpLCBEQShhLDIwKSwgREEoYSwyNiksIERBKGEsMzIpLCBEQShhLDM4KSwgREEoYSw0NCkgKSA8PCAyOworICogCWhhc2ggfD0gWE9SOCggREEoYSwzKSwgREEoYSwgOSksIERBKGEsMTUpLCBEQShhLDIxKSwgREEoYSwyNyksIERBKGEsMzMpLCBEQShhLDM5KSwgREEoYSw0NSkgKSA8PCAzOworICogCWhhc2ggfD0gWE9SOCggREEoYSw0KSwgREEoYSwxMCksIERBKGEsMTYpLCBEQShhLDIyKSwgREEoYSwyOCksIERBKGEsMzQpLCBEQShhLDQwKSwgREEoYSw0NikgKSA8PCA0OworICogCWhhc2ggfD0gWE9SOCggREEoYSw1KSwgREEoYSwxMSksIERBKGEsMTcpLCBEQShhLDIzKSwgREEoYSwyOSksIERBKGEsMzUpLCBEQShhLDQxKSwgREEoYSw0NykgKSA8PCA1OworICoKKyAqLworc3RhdGljIGlubGluZSB1MzIgVExhbl9IYXNoRnVuYyggY29uc3QgdTggKmEgKQoreworICAgICAgICB1OCAgICAgaGFzaDsKKworICAgICAgICBoYXNoID0gKGFbMF1eYVszXSk7ICAgICAgICAgICAgIC8qICYgMDc3ICovCisgICAgICAgIGhhc2ggXj0gKChhWzBdXmFbM10pPj42KTsgICAgICAgLyogJiAwMDMgKi8KKyAgICAgICAgaGFzaCBePSAoKGFbMV1eYVs0XSk8PDIpOyAgICAgICAvKiAmIDA3NCAqLworICAgICAgICBoYXNoIF49ICgoYVsxXV5hWzRdKT4+NCk7ICAgICAgIC8qICYgMDE3ICovCisgICAgICAgIGhhc2ggXj0gKChhWzJdXmFbNV0pPDw0KTsgICAgICAgLyogJiAwNjAgKi8KKyAgICAgICAgaGFzaCBePSAoKGFbMl1eYVs1XSk+PjIpOyAgICAgICAvKiAmIDA3NyAqLworCisgICAgICAgIHJldHVybiAoaGFzaCAmIDA3Nyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxZGNmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5jCkBAIC0wLDAgKzEsMTgzMCBAQAorLyoKKyAqICAgM2MzNTkuYyAoYykgMjAwMCBNaWtlIFBoaWxsaXBzIChtaWtlcEBsaW51eHRyLm5ldCkgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICBMaW51eCBkcml2ZXIgZm9yIDNDb20gM2MzNTkgVG9rZW5saW5rIFZlbG9jaXR5IFhMIFBDSSBOSUMKKyAqCisgKiAgQmFzZSBEcml2ZXIgT2x5bXBpYzoKKyAqCVdyaXR0ZW4gMTk5OSBQZXRlciBEZSBTY2hyaWp2ZXIgJiBNaWtlIFBoaWxsaXBzCisgKgorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICogCisgKiAgNy8xNy8wMCAtIENsZWFuIHVwLCB2ZXJzaW9uIG51bWJlciAwLjkuMC4gUmVhZHkgdG8gcmVsZWFzZSB0byB0aGUgd29ybGQuCisgKgorICogIDIvMTYvMDEgLSBQb3J0IHVwIHRvIGtlcm5lbCAyLjQuMiByZWFkeSBmb3Igc3VibWlzc2lvbiBpbnRvIHRoZSBrZXJuZWwuCisgKiAgMy8wNS8wMSAtIExhc3QgY2xlYW4gdXAgc3R1ZmYgYmVmb3JlIHN1Ym1pc3Npb24uCisgKiAgMi8xNS8wMSAtIEZpbmFsbHksIHVwZGF0ZSB0byBuZXcgcGNpIGFwaS4gCisgKgorICogIFRvIERvOgorICovCisKKy8qIAorICoJVGVjaG5pY2FsIENhcmQgRGV0YWlscworICoKKyAqICBBbGwgYWNjZXNzIHRvIGRhdGEgaXMgZG9uZSB3aXRoIDE2LzggYml0IHRyYW5zZmVycy4gIFRoZSB0cmFuc2ZlcgorICogIG1ldGhvZCByZWFsbHkgc3Vja3MuIFlvdSBjYW4gb25seSByZWFkIG9yIHdyaXRlIG9uZSBsb2NhdGlvbiBhdCBhIHRpbWUuCisgKgorICogIEFsc28sIHRoZSBtaWNyb2NvZGUgZm9yIHRoZSBjYXJkIG11c3QgYmUgdXBsb2FkZWQgaWYgdGhlIGNhcmQgZG9lcyBub3QgaGF2ZQorICogIHRoZSBmbGFzaHJvbSBvbiBib2FyZC4gIFRoaXMgaXMgYSAyOEsgYmxvYXQgaW4gdGhlIGRyaXZlciB3aGVuIGNvbXBpbGVkCisgKiAgYXMgYSBtb2R1bGUuCisgKgorICogIFJ4IGlzIHZlcnkgc2ltcGxlLCBzdGF0dXMgaW50byBhIHJpbmcgb2YgZGVzY3JpcHRvcnMsIGRtYSBkYXRhIHRyYW5zZmVyLAorICogIGludGVycnVwdHMgdG8gdGVsbCB1cyB3aGVuIGEgcGFja2V0IGlzIHJlY2VpdmVkLgorICoKKyAqICBUeCBpcyBhIGxpdHRsZSBtb3JlIGludGVyZXN0aW5nLiBTaW1pbGFyIHNjZW5hcmlvLCBkZXNjcmlwdG9yIGFuZCBkbWEgZGF0YQorICogIHRyYW5zZmVycywgYnV0IHdlIGRvbid0IGhhdmUgdG8gaW50ZXJydXB0IHRoZSBjYXJkIHRvIHRlbGwgaXQgYW5vdGhlciBwYWNrZXQKKyAqICBpcyByZWFkeSBmb3IgdHJhbnNtaXNzaW9uLCB3ZSBhcmUganVzdCBkb2luZyBzaW1wbGUgbWVtb3J5IHdyaXRlcywgbm90IGlvIG9yIG1taW8KKyAqICB3cml0ZXMuICBUaGUgY2FyZCBjYW4gYmUgc2V0IHVwIHRvIHNpbXBseSBwb2xsIG9uIHRoZSBuZXh0CisgKiAgZGVzY3JpcHRvciBwb2ludGVyIGFuZCB3aGVuIHRoaXMgdmFsdWUgaXMgbm9uLXplcm8gd2lsbCBhdXRvbWF0aWNhbGx5IGRvd25sb2FkCisgKiAgdGhlIG5leHQgcGFja2V0LiAgVGhlIGNhcmQgdGhlbiBpbnRlcnJ1cHRzIHVzIHdoZW4gdGhlIHBhY2tldCBpcyBkb25lLgorICoKKyAqLworCisjZGVmaW5lIFhMX0RFQlVHIDAKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIjNjMzU5LmgiCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhICA9IAorIjNjMzU5LmMgdjEuMi4wIDIvMTcvMDEgLSBNaWtlIFBoaWxsaXBzIChtaWtlcEBsaW51eHRyLm5ldCkiIDsgCisKK01PRFVMRV9BVVRIT1IoIk1pa2UgUGhpbGxpcHMgPG1pa2VwQGxpbnV4dHIubmV0PiIpIDsgCitNT0RVTEVfREVTQ1JJUFRJT04oIjNDb20gM0MzNTkgVmVsb2NpdHkgWEwgVG9rZW4gUmluZyBBZGFwdGVyIERyaXZlciBcbiIpIDsKKworLyogTW9kdWxlIHBhcmFtdGVycyAqLworCisvKiBSaW5nIFNwZWVkIDAsNCwxNiAKKyAqIDAgPSBBdXRvc2Vuc2UgICAKKyAqIDQsMTYgPSBTZWxlY3RlZCBzcGVlZCBvbmx5LCBubyBhdXRvc2Vuc2UKKyAqIFRoaXMgYWxsb3dzIHRoZSBjYXJkIHRvIGJlIHRoZSBmaXJzdCBvbiB0aGUgcmluZworICogYW5kIGJlY29tZSB0aGUgYWN0aXZlIG1vbml0b3IuCisgKgorICogV0FSTklORzogU29tZSBodWJzIHdpbGwgYWxsb3cgeW91IHRvIGluc2VydAorICogYXQgdGhlIHdyb25nIHNwZWVkLgorICogCisgKiBUaGUgYWRhcHRlciB3aWxsIF9ub3RfIGZhaWwgdG8gb3BlbiBpZiB0aGVyZSBhcmUgbm8KKyAqIGFjdGl2ZSBtb25pdG9ycyBvbiB0aGUgcmluZywgaXQgd2lsbCBzaW1wbHkgb3BlbiB1cCBpbiAKKyAqIGl0cyBsYXN0IGtub3duIHJpbmdzcGVlZCBpZiBubyByaW5nc3BlZWQgaXMgc3BlY2lmaWVkLgorICovCisKK3N0YXRpYyBpbnQgcmluZ3NwZWVkW1hMX01BWF9BREFQVEVSU10gPSB7MCx9IDsKKworbW9kdWxlX3BhcmFtX2FycmF5KHJpbmdzcGVlZCwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmluZ3NwZWVkLCIzYzM1OTogUmluZ3NwZWVkIHNlbGVjdGlvbiAtIDQsMTYgb3IgMCIpIDsgCisKKy8qIFBhY2tldCBidWZmZXIgc2l6ZSAqLworCitzdGF0aWMgaW50IHBrdF9idWZfc3pbWExfTUFYX0FEQVBURVJTXSA9IHswLH0gOworIAorbW9kdWxlX3BhcmFtX2FycmF5KHBrdF9idWZfc3osIGludCwgTlVMTCwgMCkgOworTU9EVUxFX1BBUk1fREVTQyhwa3RfYnVmX3N6LCIzYzM1OTogSW5pdGlhbCBidWZmZXIgc2l6ZSIpIDsgCisvKiBNZXNzYWdlIExldmVsICovCisKK3N0YXRpYyBpbnQgbWVzc2FnZV9sZXZlbFtYTF9NQVhfQURBUFRFUlNdID0gezAsfSA7IAorCittb2R1bGVfcGFyYW1fYXJyYXkobWVzc2FnZV9sZXZlbCwgaW50LCBOVUxMLCAwKSA7CitNT0RVTEVfUEFSTV9ERVNDKG1lc3NhZ2VfbGV2ZWwsICIzYzM1OTogTGV2ZWwgb2YgcmVwb3J0ZWQgbWVzc2FnZXMgXG4iKSA7IAorLyogCisgKglUaGlzIGlzIGEgcmVhbCBuYXN0eSB3YXkgb2YgZG9pbmcgdGhpcywgYnV0IG90aGVyd2lzZSB5b3UKKyAqCXdpbGwgYmUgc3R1Y2sgd2l0aCAxNTU1IGxpbmVzIG9mIGhleCAjJ3MgaW4gdGhlIGNvZGUuCisgKi8KKworI2luY2x1ZGUgIjNjMzU5X21pY3JvY29kZS5oIiAKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHhsX3BjaV90YmxbXSA9Cit7CisJe1BDSV9WRU5ET1JfSURfM0NPTSxQQ0lfREVWSUNFX0lEXzNDT01fM0MzNTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyB9CQkJLyogdGVybWluYXRlIGxpc3QgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSx4bF9wY2lfdGJsKSA7IAorCitzdGF0aWMgaW50IHhsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHhsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHhsX29wZW5faHcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgOyAgCitzdGF0aWMgaW50IHhsX2h3X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOyAKK3N0YXRpYyBpbnQgeGxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHhsX2RuX2NvbXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7IAorc3RhdGljIGludCB4bF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHhsX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHhsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIHhsX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgeGxfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpIDsgCitzdGF0aWMgdm9pZCB4bF9hcmJfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgeGxfYXNiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSA7IAorc3RhdGljIHZvaWQgeGxfc3JiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3JiX2NtZCkgOyAKK3N0YXRpYyB2b2lkIHhsX3dhaXRfbWlzcl9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSA7IAorc3RhdGljIGludCB4bF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtdHUpOworc3RhdGljIHZvaWQgeGxfc3JiX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgCitzdGF0aWMgdm9pZCB4bF9hc2JfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgOyAKK3N0YXRpYyB2b2lkIHhsX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgIAorc3RhdGljIHZvaWQgeGxfZnJlZW1lbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSA7ICAKKworCisvKiBFRVByb20gQWNjZXNzIEZ1bmN0aW9ucyAqLworc3RhdGljIHUxNiAgeGxfZWVfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZWVfYWRkcikgOyAKK3N0YXRpYyB2b2lkICB4bF9lZV93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZWVfYWRkciwgdTE2IGVlX3ZhbHVlKSA7IAorCisvKiBEZWJ1Z2dpbmcgZnVuY3Rpb25zICovCisjaWYgWExfREVCVUcKK3N0YXRpYyB2b2lkIHByaW50X3R4X3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgCitzdGF0aWMgdm9pZCBwcmludF9yeF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSA7IAorCitzdGF0aWMgdm9pZCBwcmludF90eF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXYgOyAKKwlzdHJ1Y3QgeGxfdHhfZGVzYyAqdHhkIDsgCisJdTggX19pb21lbSAqeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKwlpbnQgaSA7IAorCisJcHJpbnRrKCJ0eF9yaW5nX2hlYWQ6ICVkLCB0eF9yaW5nX3RhaWw6ICVkLCBmcmVlX2VudDogJWQgXG4iLHhsX3ByaXYtPnR4X3JpbmdfaGVhZCwgCisJCXhsX3ByaXYtPnR4X3JpbmdfdGFpbCwgeGxfcHJpdi0+ZnJlZV9yaW5nX2VudHJpZXMpIDsgCisJcHJpbnRrKCJSaW5nICAgICwgQWRkcmVzcyAsICAgRlNIICAsIERuTmV4dFB0ciwgQnVmZmVyLCBCdWZmZXJfTGVuIFxuIik7IAorCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXR4ZCA9ICYoeGxfcHJpdi0+eGxfdHhfcmluZ1tpXSkgOyAKKwkJcHJpbnRrKCIlZCwgJTA4bHgsICUwOHgsICUwOHgsICUwOHgsICUwOHggXG4iLCBpLCB2aXJ0X3RvX2J1cyh0eGQpLCAKKwkJCXR4ZC0+ZnJhbWVzdGFydGhlYWRlciwgdHhkLT5kbm5leHRwdHIsIHR4ZC0+YnVmZmVyLCB0eGQtPmJ1ZmZlcl9sZW5ndGggKSA7IAorCX0KKworCXByaW50aygiRE5MSVNUUFRSID0gJTA0eCBcbiIsIHJlYWRsKHhsX21taW8gKyBNTUlPX0ROTElTVFBUUikgKTsgCisJCisJcHJpbnRrKCJEbWFDdGwgPSAlMDR4IFxuIiwgcmVhZGwoeGxfbW1pbyArIE1NSU9fRE1BX0NUUkwpICk7IAorCXByaW50aygiUXVldWUgc3RhdHVzID0gJTB4IFxuIixuZXRpZl9ydW5uaW5nKGRldikgKSA7IAorfQorCitzdGF0aWMgdm9pZCBwcmludF9yeF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXYgOyAKKwlzdHJ1Y3QgeGxfcnhfZGVzYyAqcnhkIDsgCisJdTggX19pb21lbSAqeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKwlpbnQgaSA7IAorCisJcHJpbnRrKCJyeF9yaW5nX3RhaWw6ICVkIFxuIiwgeGxfcHJpdi0+cnhfcmluZ190YWlsKSA7IAorCXByaW50aygiUmluZyAgICAsIEFkZHJlc3MgLCAgIEZyYW1lU3RhdGUgICwgVVBOZXh0UHRyLCBGcmFnQWRkciwgRnJhZ19MZW4gXG4iKTsgCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsgCisJCS8qIHJ4ZCA9IChzdHJ1Y3QgeGxfcnhfZGVzYyAqKXhsX3ByaXYtPnJ4X3JpbmdfZG1hX2FkZHIgKyAoaSAqIHNpemVvZihzdHJ1Y3QgeGxfcnhfZGVzYykpIDsgKi8KKwkJcnhkID0gJih4bF9wcml2LT54bF9yeF9yaW5nW2ldKSA7IAorCQlwcmludGsoIiVkLCAlMDhseCwgJTA4eCwgJTA4eCwgJTA4eCwgJTA4eCBcbiIsIGksIHZpcnRfdG9fYnVzKHJ4ZCksIAorCQkJcnhkLT5mcmFtZXN0YXR1cywgcnhkLT51cG5leHRwdHIsIHJ4ZC0+dXBmcmFnYWRkciwgcnhkLT51cGZyYWdsZW4gKSA7IAorCX0KKworCXByaW50aygiVVBMSVNUUFRSID0gJTA0eCBcbiIsIHJlYWRsKHhsX21taW8gKyBNTUlPX1VQTElTVFBUUikgKTsgCisJCisJcHJpbnRrKCJEbWFDdGwgPSAlMDR4IFxuIiwgcmVhZGwoeGxfbW1pbyArIE1NSU9fRE1BX0NUUkwpICk7IAorCXByaW50aygiUXVldWUgc3RhdHVzID0gJTB4IFxuIixuZXRpZl9ydW5uaW5nKGRldikgKSA7Cit9IAorI2VuZGlmCisKKy8qCisgKglSZWFkIHZhbHVlcyBmcm9tIHRoZSBvbi1ib2FyZCBFRVByb20uICBUaGlzIGxvb2tzIHZlcnkgc3RyYW5nZQorICoJYnV0IHlvdSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBFRVByb20gdG8gZ2V0L3NldCB0aGUgdmFsdWUgYmVmb3JlIAorICoJcGFzc2luZy9nZXR0aW5nIHRoZSBuZXh0IHZhbHVlIGZyb20gdGhlIG5pYy4gQXMgd2l0aCBhbGwgcmVxdWVzdHMKKyAqCW9uIHRoaXMgbmljIGl0IGhhcyB0byBiZSBkb25lIGluIHR3byBzdGFnZXMsIGEpIHRlbGwgdGhlIG5pYyB3aGljaAorICoJbWVtb3J5IGFkZHJlc3MgeW91IHdhbnQgdG8gYWNjZXNzIGFuZCBiKSBwYXNzL2dldCB0aGUgdmFsdWUgZnJvbSB0aGUgbmljLgorICoJV2l0aCB0aGUgRUVQcm9tLCB5b3UgaGF2ZSB0byB3YWl0IGJlZm9yZSBhbmQgaW5iZXR3ZWVuIGFjY2VzcyBhKSBhbmQgYikuCisgKglBcyB0aGlzIGlzIG9ubHkgcmVhZCBhdCBpbml0aWFsaXphdGlvbiB0aW1lIGFuZCB0aGUgd2FpdCBwZXJpb2QgaXMgdmVyeSAKKyAqCXNtYWxsIHdlIHNob3VsZG4ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNjaGVkdWxpbmcgaXNzdWVzLgorICovCisKK3N0YXRpYyB1MTYgeGxfZWVfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZWVfYWRkcikKK3sgCisgICAgCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2IDsKKwl1OCBfX2lvbWVtICp4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCisJLyogV2FpdCBmb3IgRUVQcm9tIHRvIG5vdCBiZSBidXN5ICovCisJd3JpdGVsKElPX1dPUkRfUkVBRCB8IEVFQ09OVFJPTCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd2hpbGUgKCByZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSAmIEVFQlVTWSApIDsKKworCS8qIFRlbGwgRUVQcm9tIHdoYXQgd2Ugd2FudCB0byBkbyBhbmQgd2hlcmUgKi8KKwl3cml0ZWwoSU9fV09SRF9XUklURSB8IEVFQ09OVFJPTCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGV3KEVFUkVBRCArIGVlX2FkZHIsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwkvKiBXYWl0IGZvciBFRVByb20gdG8gbm90IGJlIGJ1c3kgKi8KKwl3cml0ZWwoSU9fV09SRF9SRUFEIHwgRUVDT05UUk9MLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3aGlsZSAoIHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICYgRUVCVVNZICkgOyAKKwkKKwkvKiBUZWxsIEVFUHJvbSB3aGF0IHdlIHdhbnQgdG8gZG8gYW5kIHdoZXJlICovCisJd3JpdGVsKElPX1dPUkRfV1JJVEUgfCBFRUNPTlRST0wgLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZXcoRUVSRUFEICsgZWVfYWRkciwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKworCS8qIEZpbmFsbHkgcmVhZCB0aGUgdmFsdWUgZnJvbSB0aGUgRUVQcm9tICovCisJd3JpdGVsKElPX1dPUkRfUkVBRCB8IEVFREFUQSAsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXJldHVybiByZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorfQorCisvKiAKKyAqCVdyaXRlIHZhbHVlcyB0byB0aGUgb25ib2FyZCBlZXByb20uIEFzIHdpdGggZWVwcm9tIHJlYWQgeW91IG5lZWQgdG8gCisgKglzZXQgd2hpY2ggbG9jYXRpb24gdG8gd3JpdGUsIHdhaXQsIHZhbHVlIHRvIHdyaXRlLCB3YWl0LCB3aXRoIHRoZSAKKyAqCWFkZGVkIHR3aXN0IG9mIGhhdmluZyB0byBlbmFibGUgZWVwcm9tIHdyaXRlcyBhcyB3ZWxsLgorICovCisKK3N0YXRpYyB2b2lkICB4bF9lZV93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZWVfYWRkciwgdTE2IGVlX3ZhbHVlKSAKK3sKKyAgICAJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXYgOworCXU4IF9faW9tZW0gKnhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisKKwkvKiBXYWl0IGZvciBFRVByb20gdG8gbm90IGJlIGJ1c3kgKi8KKwl3cml0ZWwoSU9fV09SRF9SRUFEIHwgRUVDT05UUk9MLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3aGlsZSAoIHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICYgRUVCVVNZICkgOworCQorCS8qIEVuYWJsZSB3cml0ZS9lcmFzZSAqLworCXdyaXRlbChJT19XT1JEX1dSSVRFIHwgRUVDT05UUk9MLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZXcoRUVfRU5BQkxFX1dSSVRFLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCisJLyogV2FpdCBmb3IgRUVQcm9tIHRvIG5vdCBiZSBidXN5ICovCisJd3JpdGVsKElPX1dPUkRfUkVBRCB8IEVFQ09OVFJPTCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd2hpbGUgKCByZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSAmIEVFQlVTWSApIDsKKworCS8qIFB1dCB0aGUgdmFsdWUgd2Ugd2FudCB0byB3cml0ZSBpbnRvIEVFREFUQSAqLyAKKwl3cml0ZWwoSU9fV09SRF9XUklURSB8IEVFREFUQSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGV3KGVlX3ZhbHVlLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7CisKKwkvKiBUZWxsIEVFUHJvbSB0byB3cml0ZSBlZXZhbHVlIGludG8gZWVfYWRkciAqLworCXdyaXRlbChJT19XT1JEX1dSSVRFIHwgRUVDT05UUk9MLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZXcoRUVXUklURSArIGVlX2FkZHIsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwkvKiBXYWl0IGZvciBFRVByb20gdG8gbm90IGJlIGJ1c3ksIHRvIGVuc3VyZSB3cml0ZSBnZXRzIGRvbmUgKi8KKwl3cml0ZWwoSU9fV09SRF9SRUFEIHwgRUVDT05UUk9MLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3aGlsZSAoIHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICYgRUVCVVNZICkgOworCQorCXJldHVybiA7IAorfQorIAoraW50IF9fZGV2aW5pdCB4bF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkgCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA7IAorCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2IDsgCisJc3RhdGljIGludCBjYXJkX25vID0gLTEgOworCWludCBpIDsgCisKKwljYXJkX25vKysgOyAKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgeyAKKwkJcmV0dXJuIC1FTk9ERVYgOyAKKwl9IAorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpZiAoKGkgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIjNjMzU5IikpKSB7IAorCQlyZXR1cm4gaSA7IAorCX0gOyAKKworCS8qIAorCSAqIEFsbG93aW5nIGluaXRfdHJkZXYgdG8gYWxsb2NhdGUgdGhlIGRldi0+cHJpdiBzdHJ1Y3R1cmUgd2lsbCBhbGlnbiB4bF9wcml2YXRlCisgICAJICogb24gYSAzMiBieXRlcyBib3VuZGFyeSB3aGljaCB3ZSBuZWVkIGZvciB0aGUgcngvdHggZGVzY3JpcHRvcnMKKwkgKi8KKworCWRldiA9IGFsbG9jX3RyZGV2KHNpemVvZihzdHJ1Y3QgeGxfcHJpdmF0ZSkpIDsgCisJaWYgKCFkZXYpIHsgCisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldikgOyAKKwkJcmV0dXJuIC1FTk9NRU0gOyAKKwl9IAorCXhsX3ByaXYgPSBkZXYtPnByaXYgOyAKKworI2lmIFhMX0RFQlVHICAKKwlwcmludGsoInBjaV9kZXZpY2U6ICVwLCBkZXY6JXAsIGRldi0+cHJpdjogJXAsIGJhWzBdOiAlMTB4LCBiYVsxXTolMTB4XG4iLCAKKwkJcGRldiwgZGV2LCBkZXYtPnByaXYsICh1bnNpZ25lZCBpbnQpcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsICh1bnNpZ25lZCBpbnQpcGRldi0+cmVzb3VyY2VbMV0uc3RhcnQpIDsgIAorI2VuZGlmIAorCisJZGV2LT5pcnE9cGRldi0+aXJxOworCWRldi0+YmFzZV9hZGRyPXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDApIDsgCisJeGxfcHJpdi0+eGxfY2FyZF9uYW1lID0gcGNpX25hbWUocGRldik7CisJeGxfcHJpdi0+eGxfbW1pbz1pb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDEpLCBYTF9JT19TUEFDRSk7CisJeGxfcHJpdi0+cGRldiA9IHBkZXYgOyAKKwkJCisJaWYgKChwa3RfYnVmX3N6W2NhcmRfbm9dIDwgMTAwKSB8fCAocGt0X2J1Zl9zeltjYXJkX25vXSA+IDE4MDAwKSApCisJCXhsX3ByaXYtPnBrdF9idWZfc3ogPSBQS1RfQlVGX1NaIDsgCisJZWxzZQorCQl4bF9wcml2LT5wa3RfYnVmX3N6ID0gcGt0X2J1Zl9zeltjYXJkX25vXSA7IAorCisJZGV2LT5tdHUgPSB4bF9wcml2LT5wa3RfYnVmX3N6IC0gVFJfSExFTiA7IAorCXhsX3ByaXYtPnhsX3Jpbmdfc3BlZWQgPSByaW5nc3BlZWRbY2FyZF9ub10gOyAKKwl4bF9wcml2LT54bF9tZXNzYWdlX2xldmVsID0gbWVzc2FnZV9sZXZlbFtjYXJkX25vXSA7IAorCXhsX3ByaXYtPnhsX2Z1bmN0aW9uYWxfYWRkclswXSA9IHhsX3ByaXYtPnhsX2Z1bmN0aW9uYWxfYWRkclsxXSA9IHhsX3ByaXYtPnhsX2Z1bmN0aW9uYWxfYWRkclsyXSA9IHhsX3ByaXYtPnhsX2Z1bmN0aW9uYWxfYWRkclszXSA9IDAgOyAKKwl4bF9wcml2LT54bF9jb3B5X2FsbF9vcHRpb25zID0gMCA7IAorCQkKKwlpZigoaSA9IHhsX2luaXQoZGV2KSkpIHsKKwkJaW91bm1hcCh4bF9wcml2LT54bF9tbWlvKSA7IAorCQlmcmVlX25ldGRldihkZXYpIDsgCisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldikgOyAKKwkJcmV0dXJuIGkgOyAKKwl9CQkJCQorCisJZGV2LT5vcGVuPSZ4bF9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0PSZ4bF94bWl0OworCWRldi0+Y2hhbmdlX210dT0meGxfY2hhbmdlX210dTsKKwlkZXYtPnN0b3A9JnhsX2Nsb3NlOworCWRldi0+ZG9faW9jdGw9TlVMTDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdD0meGxfc2V0X3J4X21vZGU7CisJZGV2LT5nZXRfc3RhdHM9JnhsX2dldF9zdGF0cyA7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3M9JnhsX3NldF9tYWNfYWRkcmVzcyA7IAorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsgCisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LGRldikgOyAKKwlpZiAoKGkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KSkpIHsgCisJCXByaW50ayhLRVJOX0VSUiAiM0MzNTksIHJlZ2lzdGVyIG5ldGRldiBmYWlsZWRcbiIpIDsgIAorCQlwY2lfc2V0X2RydmRhdGEocGRldixOVUxMKSA7IAorCQlpb3VubWFwKHhsX3ByaXYtPnhsX21taW8pIDsgCisJCWZyZWVfbmV0ZGV2KGRldikgOyAKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KSA7IAorCQlyZXR1cm4gaSA7IAorCX0KKyAgIAorCXByaW50ayhLRVJOX0lORk8gIjNDMzU5OiAlcyByZWdpc3RlcmVkIGFzOiAlc1xuIix4bF9wcml2LT54bF9jYXJkX25hbWUsZGV2LT5uYW1lKSA7IAorCisJcmV0dXJuIDA7IAorfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHhsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisgICAgCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2IDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzIFxuIiwgdmVyc2lvbik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEkvTyBhdCAlaHgsIE1NSU8gYXQgJXAsIHVzaW5nIGlycSAlZFxuIiwKKwkJeGxfcHJpdi0+eGxfY2FyZF9uYW1lLCAodW5zaWduZWQgaW50KWRldi0+YmFzZV9hZGRyICx4bF9wcml2LT54bF9tbWlvLCBkZXYtPmlycSk7CisKKwlzcGluX2xvY2tfaW5pdCgmeGxfcHJpdi0+eGxfbG9jaykgOyAKKworCXJldHVybiB4bF9od19yZXNldChkZXYpIDsgCisKK30KKworCisvKiAKKyAqCUhhcmR3YXJlIHJlc2V0LiAgVGhpcyBuZWVkcyB0byBiZSBhIHNlcGFyYXRlIGVudGl0eSBhcyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBjYXJkCisgKgl3aGVuIHdlIGNoYW5nZSB0aGUgRUVQcm9tIHNldHRpbmdzLgorICovCisKK3N0YXRpYyBpbnQgeGxfaHdfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7IAorICAgIAlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKWRldi0+cHJpdiA7CisJdTggX19pb21lbSAqeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKwl1bnNpZ25lZCBsb25nIHQgOyAKKwl1MTYgaSA7IAorICAgIAl1MTYgcmVzdWx0XzE2IDsgCisJdTggcmVzdWx0XzggOworCXUxNiBzdGFydCA7IAorCWludCBqIDsKKworCS8qCisJICogIFJlc2V0IHRoZSBjYXJkLiAgSWYgdGhlIGNhcmQgaGFzIGdvdCB0aGUgbWljcm9jb2RlIG9uIGJvYXJkLCB3ZSBoYXZlIAorICAgICAgICAgKiAgbWlzc2VkIHRoZSBpbml0aWFsaXphdGlvbiBpbnRlcnJ1cHQsIHNvIHdlIG11c3QgYWx3YXlzIGRvIHRoaXMuCisJICovCisKKwl3cml0ZXcoIEdMT0JBTF9SRVNFVCwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCApIDsgCisKKwkvKiAKKwkgKiBNdXN0IHdhaXQgZm9yIGNtZEluUHJvZ3Jlc3MgYml0ICgxMikgdG8gY2xlYXIgYmVmb3JlIGNvbnRpbnVpbmcgd2l0aAorCSAqIGNhcmQgY29uZmlndXJhdGlvbi4KKwkgKi8KKworCXQ9amlmZmllczsKKwl3aGlsZSAocmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSAmIElOVFNUQVRfQ01EX0lOX1BST0dSRVNTKSB7IAorCQlzY2hlZHVsZSgpOwkJCisJCWlmKGppZmZpZXMtdCA+IDQwKkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAzQ09NIDNDMzU5IFZlbG9jaXR5IFhMICBjYXJkIG5vdCByZXNwb25kaW5nIHRvIGdsb2JhbCByZXNldC5cbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCS8qCisJICogIEVuYWJsZSBwbWJhciBieSBzZXR0aW5nIGJpdCBpbiBDUEF0dGVudGlvbgorCSAqLworCisJd3JpdGVsKCAoSU9fQllURV9SRUFEIHwgQ1BBVFRFTlRJT04pLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOworCXJlc3VsdF84ID0gcmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwlyZXN1bHRfOCA9IHJlc3VsdF84IHwgQ1BBX1BNQkFSVklTIDsgCisJd3JpdGVsKCAoSU9fQllURV9XUklURSB8IENQQVRURU5USU9OKSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKHJlc3VsdF84LCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQorCS8qCisJICogUmVhZCBjcEhvbGQgYml0IGluIHBtYmFyLCBpZiBjbGVhcmVkIHdlIGhhdmUgZ290IEZsYXNocm9tIG9uIGJvYXJkLgorIAkgKiBJZiBub3QsIHdlIG5lZWQgdG8gdXBsb2FkIHRoZSBtaWNyb2NvZGUgdG8gdGhlIGNhcmQKKwkgKi8KKworCXdyaXRlbCggKElPX1dPUkRfUkVBRCB8IFBNQkFSKSx4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCk7ICAKKworI2lmIFhMX0RFQlVHCisJcHJpbnRrKEtFUk5fSU5GTyAiUmVhZCBmcm9tIFBNQkFSID0gJTA0eCBcbiIsIHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpKSA7IAorI2VuZGlmCisKKwlpZiAoIHJlYWR3KCAoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkpICAmIFBNQl9DUEhPTEQgKSB7IAorCisJCS8qIFNldCBQbUJhciwgcHJpdmF0ZU1lbW9yeUJhc2UgYml0cyAoODoyKSB0byAwICovCisKKwkJd3JpdGVsKCAoSU9fV09SRF9SRUFEIHwgUE1CQVIpLHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKTsgIAorCQlyZXN1bHRfMTYgPSByZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQlyZXN1bHRfMTYgPSByZXN1bHRfMTYgJiB+KCgweDdGKSA8PCAyKSA7IAorCQl3cml0ZWwoIChJT19XT1JEX1dSSVRFIHwgUE1CQVIpLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJd3JpdGV3KHJlc3VsdF8xNix4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQorCQkvKiBTZXQgQ1BBdHRlbnRpb24sIG1lbVdyRW4gYml0ICovCisKKwkJd3JpdGVsKCAoSU9fQllURV9SRUFEIHwgQ1BBVFRFTlRJT04pLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJcmVzdWx0XzggPSByZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQlyZXN1bHRfOCA9IHJlc3VsdF84IHwgQ1BBX01FTVdSRU4gIDsgCisJCXdyaXRlbCggKElPX0JZVEVfV1JJVEUgfCBDUEFUVEVOVElPTiksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIocmVzdWx0XzgsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwkJLyogCisJCSAqIE5vdyB0byB3cml0ZSB0aGUgbWljcm9jb2RlIGludG8gdGhlIHNoYXJlZCByYW0gCisJIAkgKiBUaGUgbWljcm9jb2RlIG11c3QgZmluaXNoIGF0IHBvc2l0aW9uIDB4RkZGRiwgc28gd2UgbXVzdCBzdWJ0cmFjdAorCQkgKiB0byBnZXQgdGhlIHN0YXJ0IHBvc2l0aW9uIGZvciB0aGUgY29kZQorCQkgKi8KKworCQlzdGFydCA9ICgweEZGRkYgLSAobWNfc2l6ZSkgKyAxICkgOyAvKiBMb29rcyBzdHJhbmdlIGJ1dCBlbnN1cmVzIGNvbXBpbGVyIG9ubHkgdXNlcyAxNiBiaXQgdW5zaWduZWQgaW50IGZvciB0aGlzICovIAorCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiM0MzNTk6IFVwbG9hZGluZyBNaWNyb2NvZGU6ICIpOyAKKwkJCisJCWZvciAoaSA9IHN0YXJ0LCBqID0gMDsgaiA8IG1jX3NpemU7IGkrKywgaisrKSB7IAorCQkJd3JpdGVsKE1FTV9CWVRFX1dSSVRFIHwgMFhEMDAwMCB8IGksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQkJd3JpdGViKG1pY3JvY29kZVtqXSx4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQkJaWYgKGogJSAxMDI0ID09IDApCisJCQkJcHJpbnRrKCIuIik7CisJCX0KKwkJcHJpbnRrKCJcbiIpIDsgCisKKwkJZm9yIChpPTA7aSA8IDE2OyBpKyspIHsgCisJCQl3cml0ZWwoIChNRU1fQllURV9XUklURSB8IDB4REZGRjApICsgaSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQl3cml0ZWIobWljcm9jb2RlW21jX3NpemUgLSAxNiArIGldLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQl9CisKKwkJLyoKKwkJICogSGF2ZSB0byB3cml0ZSB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgdXBsb2FkIHRvIEZGRjQsIGJ1dAorICAgICAgICAgICAgICAgICAqIHRoZSBhZGRyZXNzIG11c3QgYmUgPj4gNC4gWW91IGRvIG5vdCB3YW50IHRvIGtub3cgaG93IGxvbmcKKyAgICAgICAgICAgICAgICAgKiBpdCB0b29rIG1lIHRvIGRpc2NvdmVyIHRoaXMuCisJCSAqLworCisJCXdyaXRlbChNRU1fV09SRF9XUklURSB8IDB4REZGRjQsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZXcoc3RhcnQgPj4gNCwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSk7CisKKwkJLyogQ2xlYXIgdGhlIENQQXR0ZW50aW9uLCBtZW1XckVuIEJpdCAqLworCQorCQl3cml0ZWwoIChJT19CWVRFX1JFQUQgfCBDUEFUVEVOVElPTiksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQlyZXN1bHRfOCA9IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCXJlc3VsdF84ID0gcmVzdWx0XzggJiB+Q1BBX01FTVdSRU4gOyAKKwkJd3JpdGVsKCAoSU9fQllURV9XUklURSB8IENQQVRURU5USU9OKSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXdyaXRlYihyZXN1bHRfOCwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKworCQkvKiBDbGVhciB0aGUgY3BIb2xkIGJpdCBpbiBwbWJhciAqLworCisJCXdyaXRlbCggKElPX1dPUkRfUkVBRCB8IFBNQkFSKSx4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCk7ICAKKwkJcmVzdWx0XzE2ID0gcmVhZHcoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJcmVzdWx0XzE2ID0gcmVzdWx0XzE2ICYgflBNQl9DUEhPTEQgOyAKKwkJd3JpdGVsKCAoSU9fV09SRF9XUklURSB8IFBNQkFSKSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXdyaXRldyhyZXN1bHRfMTYseGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKworCisJfSAvKiBJZiBtaWNyb2NvZGUgdXBsb2FkIHJlcXVpcmVkICovCisKKwkvKiAKKwkgKiBUaGUgY2FyZCBzaG91bGQgbm93IGdvIHRob3VnaCBhIHNlbGYgdGVzdCBwcm9jZWR1cmUgYW5kIGdldCBpdHNlbGYgcmVhZHkKKyAgICAgICAgICogdG8gYmUgb3BlbmVkLCB3ZSBtdXN0IHdhaXQgZm9yIGFuIHNyYiByZXNwb25zZSB3aXRoIHRoZSBpbml0aWFsaXphdGlvbgorICAgICAgICAgKiBpbmZvcm1hdGlvbi4gCisJICovCisKKyNpZiBYTF9ERUJVRworCXByaW50ayhLRVJOX0lORk8gIiVzOiBNaWNyb2NvZGUgdXBsb2FkZWQsIG11c3Qgd2FpdCBmb3IgdGhlIHNlbGYgdGVzdCB0byBjb21wbGV0ZVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJd3JpdGV3KFNFVElOREVOQUJMRSB8IDB4RkZGLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCisJdD1qaWZmaWVzOworCXdoaWxlICggIShyZWFkdyh4bF9tbWlvICsgTU1JT19JTlRTVEFUVVNfQVVUTykgJiBJTlRTVEFUX1NSQikgKSB7IAorCQlzY2hlZHVsZSgpOwkJCisJCWlmKGppZmZpZXMtdCA+IDE1KkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIjNDT00gM0MzNTkgVmVsb2NpdHkgWEwgIGNhcmQgbm90IHJlc3BvbmRpbmcuXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOyAKKwkJfQorCX0KKworCS8qCisJICogV3JpdGUgdGhlIFJ4QnVmQXJlYSB3aXRoIEQwMDAsIFJ4RWFybHlUaHJlc2gsIFR4U3RhcnRUaHJlc2gsIAorIAkgKiBEblByaVJlcVRocmVzaCwgcmVhZCB0aGUgdGVjaCBkb2NzIGlmIHlvdSB3YW50IHRvIGtub3cgd2hhdAorCSAqIHZhbHVlcyB0aGV5IG5lZWQgdG8gYmUuCisJICovCisKKwl3cml0ZWwoTU1JT19XT1JEX1dSSVRFIHwgUlhCVUZBUkVBLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZXcoMHhEMDAwLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQorCXdyaXRlbChNTUlPX1dPUkRfV1JJVEUgfCBSWEVBUkxZVEhSRVNILCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZXcoMFgwMDIwLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQorCXdyaXRldyggU0VUVFhTVEFSVFRIUkVTSCB8IDB4NDAgLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCisJd3JpdGViKDB4MDQsIHhsX21taW8gKyBNTUlPX0ROQlVSU1RUSFJFU0gpIDsgCisJd3JpdGViKDB4MDQsIHhsX21taW8gKyBETlBSSVJFUVRIUkVTSCkgOworCisJLyoKKwkgKiBSZWFkIFdSQlIgdG8gcHJvdmlkZSB0aGUgbG9jYXRpb24gb2YgdGhlIHNyYiBibG9jaywgaGF2ZSB0byB1c2UgYnl0ZSByZWFkcyBub3Qgd29yZCByZWFkcy4gCisJICogVGVjaCBkb2NzIGhhdmUgdGhpcyB3cm9uZyAhISEhCisJICovCisKKwl3cml0ZWwoTU1JT19CWVRFX1JFQUQgfCBXUkJSLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl4bF9wcml2LT5zcmIgPSByZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA8PCA4IDsgCisJd3JpdGVsKCAoTU1JT19CWVRFX1JFQUQgfCBXUkJSKSArIDEsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXhsX3ByaXYtPnNyYiA9IHhsX3ByaXYtPnNyYiB8IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsKKworI2lmIFhMX0RFQlVHCisJd3JpdGVsKElPX1dPUkRfUkVBRCB8IFNXSVRDSFNFVFRJTkdTLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwlpZiAoIHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICYgMikgeyAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGVmYXVsdCByaW5nIHNwZWVkIDQgbWJwcyBcbiIpIDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJEZWZhdWx0IHJpbmcgc3BlZWQgMTYgbWJwcyBcbiIpIDsgCisJfSAKKwlwcmludGsoS0VSTl9JTkZPICIlczogeGxfcHJpdi0+c3JiID0gJTA0eFxuIix4bF9wcml2LT54bF9jYXJkX25hbWUsIHhsX3ByaXYtPnNyYik7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXY9KHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKnhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJdTggaSA7IAorCXUxNiBod2FkZHJbM10gOyAvKiBTaG91bGQgYmUgdThbNl0gYnV0IHdlIGdldCB3b3JkIHJldHVybiB2YWx1ZXMgKi8KKwlpbnQgb3Blbl9lcnIgOworCisJdTE2IHN3aXRjaHNldHRpbmdzLCBzd2l0Y2hzZXR0aW5nc19lZXByb20gIDsKKyAKKwlpZihyZXF1ZXN0X2lycShkZXYtPmlycSwgJnhsX2ludGVycnVwdCwgU0FfU0hJUlEgLCAiM2MzNTkiLCBkZXYpKSB7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCS8qIAorCSAqIFJlYWQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIEVFUFJPTSB0aGF0IHdlIG5lZWQuIEkga25vdyB3ZQorIAkgKiBzaG91bGQgdXNlIG50b2hzLCBidXQgdGhlIHdvcmQgZ2V0cyBzdG9yZWQgcmV2ZXJzZWQgaW4gdGhlIDE2CisJICogYml0IGZpZWxkIGFueXdheSBhbmQgaXQgYWxsIHdvcmtzIGl0cyBzZWxmIG91dCB3aGVuIHdlIG1lbWNweQorCSAqIGl0IGludG8gZGV2LT5kZXZfYWRkci4gCisJICovCisJCisJaHdhZGRyWzBdID0geGxfZWVfcmVhZChkZXYsMHgxMCkgOyAKKwlod2FkZHJbMV0gPSB4bF9lZV9yZWFkKGRldiwweDExKSA7IAorCWh3YWRkclsyXSA9IHhsX2VlX3JlYWQoZGV2LDB4MTIpIDsgCisKKwkvKiBSaW5nIHNwZWVkICovCisKKwlzd2l0Y2hzZXR0aW5nc19lZXByb20gPSB4bF9lZV9yZWFkKGRldiwweDA4KSA7CisJc3dpdGNoc2V0dGluZ3MgPSBzd2l0Y2hzZXR0aW5nc19lZXByb20gOyAgCisKKwlpZiAoeGxfcHJpdi0+eGxfcmluZ19zcGVlZCAhPSAwKSB7IAorCQlpZiAoeGxfcHJpdi0+eGxfcmluZ19zcGVlZCA9PSA0KSAgCisJCQlzd2l0Y2hzZXR0aW5ncyA9IHN3aXRjaHNldHRpbmdzIHwgMHgwMiA7IAorCQllbHNlIAorCQkJc3dpdGNoc2V0dGluZ3MgPSBzd2l0Y2hzZXR0aW5ncyAmIH4weDAyIDsgCisJfQorCisJLyogT25seSB3cml0ZSBFRVByb20gaWYgdGhlcmUgaGFzIGJlZW4gYSBjaGFuZ2UgKi8KKwlpZiAoc3dpdGNoc2V0dGluZ3MgIT0gc3dpdGNoc2V0dGluZ3NfZWVwcm9tKSB7IAorCQl4bF9lZV93cml0ZShkZXYsMHgwOCxzd2l0Y2hzZXR0aW5ncykgOyAKKwkJLyogSGFyZHdhcmUgcmVzZXQgYWZ0ZXIgY2hhbmdpbmcgRUVQcm9tICovCisJCXhsX2h3X3Jlc2V0KGRldikgOyAKKwl9CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkcixod2FkZHIsZGV2LT5hZGRyX2xlbikgOyAKKwkKKwlvcGVuX2VyciA9IHhsX29wZW5faHcoZGV2KSA7IAorCisJLyogCisJICogVGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cCB3aXRoIGJldHRlciBlcnJvciByZXBvcnRpbmcuCisJICovCisKKwlpZiAob3Blbl9lcnIgIT0gMCkgeyAvKiBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSBvcGVuIGNvbW1hbmQgKi8KKwkJaWYgKG9wZW5fZXJyICYgMHgwNykgeyAvKiBXcm9uZyBzcGVlZCwgcmV0cnkgYXQgZGlmZmVyZW50IHNwZWVkICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3BlbiBFcnJvciwgcmV0cnlpbmcgYXQgZGlmZmVyZW50IHJpbmdzcGVlZCBcbiIsIGRldi0+bmFtZSkgOyAKKwkJCXN3aXRjaHNldHRpbmdzID0gc3dpdGNoc2V0dGluZ3MgXiAyIDsgCisJCQl4bF9lZV93cml0ZShkZXYsMHgwOCxzd2l0Y2hzZXR0aW5ncykgOyAKKwkJCXhsX2h3X3Jlc2V0KGRldikgOyAKKwkJCW9wZW5fZXJyID0geGxfb3Blbl9odyhkZXYpIDsgCisJCQlpZiAob3Blbl9lcnIgIT0gMCkgeyAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3BlbiBlcnJvciByZXR1cm5lZCBhIHNlY29uZCB0aW1lLCB3ZSdyZSBib21iaW5nIG91dCBub3dcbiIsIGRldi0+bmFtZSk7IAorCQkJCWZyZWVfaXJxKGRldi0+aXJxLGRldikgOyAJCQkJCQkKKwkJCQlyZXR1cm4gLUVOT0RFViA7CisJCQl9ICAKKwkJfSBlbHNlIHsgCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3BlbiBFcnJvciA9ICUwNHhcbiIsIGRldi0+bmFtZSwgb3Blbl9lcnIpIDsgCisJCQlmcmVlX2lycShkZXYtPmlycSxkZXYpIDsgCisJCQlyZXR1cm4gLUVOT0RFViA7IAorCQl9CisJfQorCisJLyoKKwkgKiBOb3cgdG8gc2V0IHVwIHRoZSBSeCBhbmQgVHggYnVmZmVyIHN0cnVjdHVyZXMKKwkgKi8KKwkvKiBUaGVzZSBNVVNUIGJlIG9uIDggYnl0ZSBib3VuZGFyaWVzICovCisJeGxfcHJpdi0+eGxfdHhfcmluZyA9IGttYWxsb2MoKHNpemVvZihzdHJ1Y3QgeGxfdHhfZGVzYykgKiBYTF9UWF9SSU5HX1NJWkUpICsgNywgR0ZQX0RNQSB8IEdGUF9LRVJORUwpIDsgCisJaWYgKHhsX3ByaXYtPnhsX3R4X3JpbmcgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgcnggYnVmZmVycy5cbiIsCisJCQkJICAgICBkZXYtPm5hbWUpOworCQlmcmVlX2lycShkZXYtPmlycSxkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJeGxfcHJpdi0+eGxfcnhfcmluZyA9IGttYWxsb2MoKHNpemVvZihzdHJ1Y3QgeGxfcnhfZGVzYykgKiBYTF9SWF9SSU5HX1NJWkUpICs3LCBHRlBfRE1BIHwgR0ZQX0tFUk5FTCkgOyAKKwlpZiAoeGxfcHJpdi0+eGxfdHhfcmluZyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSByeCBidWZmZXJzLlxuIiwKKwkJCQkgICAgIGRldi0+bmFtZSk7CisJCWZyZWVfaXJxKGRldi0+aXJxLGRldik7CisJCWtmcmVlKHhsX3ByaXYtPnhsX3R4X3JpbmcpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHhsX3ByaXYtPnhsX3R4X3JpbmcsMCxzaXplb2Yoc3RydWN0IHhsX3R4X2Rlc2MpICogWExfVFhfUklOR19TSVpFKSA7IAorCW1lbXNldCh4bF9wcml2LT54bF9yeF9yaW5nLDAsc2l6ZW9mKHN0cnVjdCB4bF9yeF9kZXNjKSAqIFhMX1JYX1JJTkdfU0laRSkgOyAKKworCSAvKiBTZXR1cCBSeCBSaW5nICovCisJIGZvciAoaT0wIDsgaSA8IFhMX1JYX1JJTkdfU0laRSA7IGkrKykgeyAKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA7IAorCisJCXNrYiA9IGRldl9hbGxvY19za2IoeGxfcHJpdi0+cGt0X2J1Zl9zeikgOyAKKwkJaWYgKHNrYj09TlVMTCkgCisJCQlicmVhayA7IAorCisJCXNrYi0+ZGV2ID0gZGV2IDsgCisJCXhsX3ByaXYtPnhsX3J4X3JpbmdbaV0udXBmcmFnYWRkciA9IHBjaV9tYXBfc2luZ2xlKHhsX3ByaXYtPnBkZXYsIHNrYi0+ZGF0YSx4bF9wcml2LT5wa3RfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpIDsgCisJCXhsX3ByaXYtPnhsX3J4X3JpbmdbaV0udXBmcmFnbGVuID0geGxfcHJpdi0+cGt0X2J1Zl9zeiB8IFJYVVBMQVNURlJBRzsKKwkJeGxfcHJpdi0+cnhfcmluZ19za2JbaV0gPSBza2IgOyAJCisJfQorCisJaWYgKGk9PTApIHsgCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSByeCBidWZmZXJzLiBBZGFwdGVyIGRpc2FibGVkIFxuIixkZXYtPm5hbWUpIDsgCisJCWZyZWVfaXJxKGRldi0+aXJxLGRldikgOyAKKwkJcmV0dXJuIC1FSU8gOyAKKwl9IAorCisJeGxfcHJpdi0+cnhfcmluZ19ubyA9IGkgOyAKKwl4bF9wcml2LT5yeF9yaW5nX3RhaWwgPSAwIDsgCisJeGxfcHJpdi0+cnhfcmluZ19kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfcnhfcmluZywgc2l6ZW9mKHN0cnVjdCB4bF9yeF9kZXNjKSAqIFhMX1JYX1JJTkdfU0laRSwgUENJX0RNQV9UT0RFVklDRSkgOyAKKwlmb3IgKGk9MDtpPCh4bF9wcml2LT5yeF9yaW5nX25vLTEpO2krKykgeyAKKwkJeGxfcHJpdi0+eGxfcnhfcmluZ1tpXS51cG5leHRwdHIgPSB4bF9wcml2LT5yeF9yaW5nX2RtYV9hZGRyICsgKHNpemVvZiAoc3RydWN0IHhsX3J4X2Rlc2MpICogKGkrMSkpIDsgCisJfSAKKwl4bF9wcml2LT54bF9yeF9yaW5nW2ldLnVwbmV4dHB0ciA9IDAgOyAKKworCXdyaXRlbCh4bF9wcml2LT5yeF9yaW5nX2RtYV9hZGRyLCB4bF9tbWlvICsgTU1JT19VUExJU1RQVFIpIDsgCisJCisJLyogU2V0dXAgVHggUmluZyAqLworCQorCXhsX3ByaXYtPnR4X3JpbmdfZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZSh4bF9wcml2LT5wZGV2LHhsX3ByaXYtPnhsX3R4X3JpbmcsIHNpemVvZihzdHJ1Y3QgeGxfdHhfZGVzYykgKiBYTF9UWF9SSU5HX1NJWkUsUENJX0RNQV9UT0RFVklDRSkgOyAKKwkKKwl4bF9wcml2LT50eF9yaW5nX2hlYWQgPSAxIDsgCisJeGxfcHJpdi0+dHhfcmluZ190YWlsID0gMjU1IDsgLyogU3BlY2lhbCBtYXJrZXIgZm9yIGZpcnN0IHBhY2tldCAqLworCXhsX3ByaXYtPmZyZWVfcmluZ19lbnRyaWVzID0gWExfVFhfUklOR19TSVpFIDsgCisKKwkvKgorIAkgKiBTZXR1cCB0aGUgZmlyc3QgZHVtbXkgRFBEIGVudHJ5IGZvciBwb2xsaW5nIHRvIHN0YXJ0IHdvcmtpbmcuCisJICovCisKKwl4bF9wcml2LT54bF90eF9yaW5nWzBdLmZyYW1lc3RhcnRoZWFkZXIgPSBUWERQREVNUFRZIDsgCisJeGxfcHJpdi0+eGxfdHhfcmluZ1swXS5idWZmZXIgPSAwIDsgCisJeGxfcHJpdi0+eGxfdHhfcmluZ1swXS5idWZmZXJfbGVuZ3RoID0gMCA7IAorCXhsX3ByaXYtPnhsX3R4X3JpbmdbMF0uZG5uZXh0cHRyID0gMCA7IAorCisJd3JpdGVsKHhsX3ByaXYtPnR4X3JpbmdfZG1hX2FkZHIsIHhsX21taW8gKyBNTUlPX0ROTElTVFBUUikgOyAKKwl3cml0ZWwoRE5VTlNUQUxMLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCXdyaXRlbChVUFVOU1RBTEwsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJd3JpdGVsKERORU5BQkxFLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCXdyaXRlYigweDQwLCB4bF9tbWlvICsgTU1JT19ETlBPTEwpIDsJCisKKwkvKgorCSAqIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBjYXJkCisJICovCisKKwl3cml0ZWwoU0VUSU5URU5BQkxFIHwgSU5UX01BU0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJd3JpdGVsKFNFVElOREVOQUJMRSB8IElOVF9NQVNLLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KSA7IAkKKwlyZXR1cm4gMDsKKwkKK30JCisKK3N0YXRpYyBpbnQgeGxfb3Blbl9odyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sgCisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXY9KHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKnhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJdTE2IHZzb2ZmIDsKKwljaGFyIHZlcl9zdHJbMzNdOyAgCisJaW50IG9wZW5fZXJyIDsgCisJaW50IGkgOyAKKwl1bnNpZ25lZCBsb25nIHQgOyAKKworCS8qCisJICogT2theSwgbGV0J3MgYnVpbGQgdXAgdGhlIE9wZW4uTklDIHNyYiBjb21tYW5kCisJICoKKwkgKi8KKwkJCisJd3JpdGVsKCAoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKE9QRU5fTklDLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQorCS8qCisJICogVXNlIHRoaXMgYXMgYSB0ZXN0IGJ5dGUsIGlmIGl0IGNvbWVzIGJhY2sgd2l0aCB0aGUgc2FtZSB2YWx1ZSwgdGhlIGNvbW1hbmQgZGlkbid0IHdvcmsKKwkgKi8KKworCXdyaXRlbCggKE1FTV9CWVRFX1dSSVRFIHwgMHhEMDAwMCB8IHhsX3ByaXYtPnNyYikrIDIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRlYigweGZmLHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwkvKiBPcGVuIG9wdGlvbnMgKi8KKwl3cml0ZWwoIChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpICsgOCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKDB4MDAsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJd3JpdGVsKCAoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSArIDksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRlYigweDAwLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCisJLyogCisJICogTm9kZSBhZGRyZXNzLCBiZSBjYXJlZnVsIGhlcmUsIHRoZSBkb2NzIHNheSB5b3UgY2FuIGp1c3QgcHV0IHplcm9zIGhlcmUgYW5kIGl0IHdpbGwgdXNlCisJICogdGhlIGhhcmR3YXJlIGFkZHJlc3MsIGl0IGRvZXNuJ3QsIHlvdSBtdXN0IGluY2x1ZGUgdGhlIG5vZGUgYWRkcmVzcyBpbiB0aGUgb3BlbiBjb21tYW5kLgorCSAqLworCisJaWYgKHhsX3ByaXYtPnhsX2xhYVswXSkgeyAgLyogSWYgdXNpbmcgYSBMQUEgYWRkcmVzcyAqLworCQlmb3IgKGk9MTA7aTwxNjtpKyspIHsgCisJCQl3cml0ZWwoIChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpICsgaSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQl3cml0ZWIoeGxfcHJpdi0+eGxfbGFhW2ldLHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCX0KKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIseGxfcHJpdi0+eGxfbGFhLGRldi0+YWRkcl9sZW4pIDsgCisJfSBlbHNlIHsgLyogUmVndWxhciBoYXJkd2FyZSBhZGRyZXNzICovIAorCQlmb3IgKGk9MTA7aTwxNjtpKyspIHsgCisJCQl3cml0ZWwoIChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpICsgaSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQl3cml0ZWIoZGV2LT5kZXZfYWRkcltpLTEwXSwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJfQorCX0KKworCS8qIERlZmF1bHQgZXZlcnl0aGluZyBlbHNlIHRvIDAgKi8KKwlmb3IgKGkgPSAxNjsgaSA8IDM0OyBpKyspIHsKKwkJd3JpdGVsKCAoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSArIGksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIoMHgwMCx4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCX0KKwkKKwkvKgorCSAqICBTZXQgdGhlIGNzcmIgYml0IGluIHRoZSBNSVNSIHJlZ2lzdGVyCisJICovCisKKwl4bF93YWl0X21pc3JfZmxhZ3MoZGV2KSA7IAorCXdyaXRlbChNRU1fQllURV9XUklURSB8IE1GX0NTUkIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRlYigweEZGLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCXdyaXRlbChNTUlPX0JZVEVfV1JJVEUgfCBNSVNSX1NFVCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKE1JU1JfQ1NSQiAsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwkvKgorCSAqIE5vdyB3YWl0IGZvciB0aGUgY29tbWFuZCB0byBydW4KKwkgKi8KKworCXQ9amlmZmllczsKKwl3aGlsZSAoISAocmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSAmIElOVFNUQVRfU1JCKSkgeyAKKwkJc2NoZWR1bGUoKTsJCQorCQlpZihqaWZmaWVzLXQgPiA0MCpIWikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIzQ09NIDNDMzU5IFZlbG9jaXR5IFhMICBjYXJkIG5vdCByZXNwb25kaW5nLlxuIik7CisJCQlicmVhayA7IAorCQl9CisJfQorCisJLyoKKwkgKiBMZXQncyBpbnRlcnByZXQgdGhlIG9wZW4gcmVzcG9uc2UKKwkgKi8KKworCXdyaXRlbCggKE1FTV9CWVRFX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSsyLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwlpZiAocmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkhPTApIHsKKwkJb3Blbl9lcnIgPSByZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA8PCA4IDsgCisJCXdyaXRlbCggKE1FTV9CWVRFX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSArIDcsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQlvcGVuX2VyciB8PSByZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQlyZXR1cm4gb3Blbl9lcnIgOyAKKwl9IGVsc2UgeyAKKwkJd3JpdGVsKCAoTUVNX1dPUkRfUkVBRCB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpICsgOCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXhsX3ByaXYtPmFzYiA9IG50b2hzKHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpKSA7IAorCQlwcmludGsoS0VSTl9JTkZPICIlczogQWRhcHRlciBPcGVuZWQgRGV0YWlsczogIixkZXYtPm5hbWUpIDsgCisJCXByaW50aygiQVNCOiAlMDR4Iix4bF9wcml2LT5hc2IgKSA7IAorCQl3cml0ZWwoIChNRU1fV09SRF9SRUFEIHwgMHhEMDAwMCB8IHhsX3ByaXYtPnNyYikgKyAxMCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXByaW50aygiLCBTUkI6ICUwNHgiLG50b2hzKHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpKSApIDsgCisgCisJCXdyaXRlbCggKE1FTV9XT1JEX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSArIDEyLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJeGxfcHJpdi0+YXJiID0gbnRvaHMocmVhZHcoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkpIDsgCisJCXByaW50aygiLCBBUkI6ICUwNHggXG4iLHhsX3ByaXYtPmFyYiApIDsgCisJCXdyaXRlbCggKE1FTV9XT1JEX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSArIDE0LCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJdnNvZmYgPSBudG9ocyhyZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSkgOyAKKworCQkvKiAKKwkJICogSW50ZXJlc3RpbmcsIHNlbmRpbmcgdGhlIGluZGl2aWR1YWwgY2hhcmFjdGVycyBkaXJlY3RseSB0byBwcmludGsgd2FzIGNhdXNpbmcga2xvZ2QgdG8gdXNlCisJCSAqIHVzZSAxMDAlIG9mIHByb2Nlc3NvciB0aW1lLCBzbyB3ZSBidWlsZCB1cCB0aGUgc3RyaW5nIGFuZCBwcmludCB0aGF0IGluc3RlYWQuCisJICAgCSAqLworCisJCWZvciAoaT0wO2k8MHgyMDtpKyspIHsgCisJCQl3cml0ZWwoIChNRU1fQllURV9SRUFEIHwgMHhEMDAwMCB8IHZzb2ZmKSArIGksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQkJdmVyX3N0cltpXSA9IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCX0KKwkJdmVyX3N0cltpXSA9ICdcMCcgOyAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1pY3JvY29kZSB2ZXJzaW9uIFN0cmluZzogJXMgXG4iLGRldi0+bmFtZSx2ZXJfc3RyKTsgCisJfSAJCisJCisJLyoKKwkgKiBJc3N1ZSB0aGUgQWNrSW50ZXJydXB0CisJICovCisJd3JpdGV3KEFDS19JTlRFUlJVUFQgfCBTUkJSQUNLIHwgTEFUQ0hfQUNLLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCisJcmV0dXJuIDAgOyAKK30KKworLyoKKyAqCVRoZXJlIGFyZSB0d28gd2F5cyBvZiBpbXBsZW1lbnRpbmcgcnggb24gdGhlIDM1OSBOSUMsIGVpdGhlcgorICogCWludGVycnVwdCBkcml2ZW4gb3IgcG9sbGluZy4gIFdlIGFyZSBnb2luZyB0byB1c2VzIGludGVycnVwdHMsCisgKglpdCBpcyB0aGUgZWFzaWVyIHdheSBvZiBkb2luZyB0aGluZ3MuCisgKgkKKyAqCVRoZSBSeCB3b3JrcyB3aXRoIGEgcmluZyBvZiBSeCBkZXNjcmlwdG9ycy4gIEF0IGluaXRpYWxpc2UgdGltZSB0aGUgcmluZworICoJZW50cmllcyBwb2ludCB0byB0aGUgbmV4dCBlbnRyeSBleGNlcHQgZm9yIHRoZSBsYXN0IGVudHJ5IGluIHRoZSByaW5nIAorICoJd2hpY2ggcG9pbnRzIHRvIDAuICBUaGUgY2FyZCBpcyBwcm9ncmFtbWVkIHdpdGggdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdAorICoJYXZhaWxhYmxlIGRlc2NyaXB0b3IgYW5kIGtlZXBzIHJlYWRpbmcgdGhlIG5leHRfcHRyIHVudGlsIG5leHRfcHRyIGlzIHNldAorICoJdG8gMC4gIEhvcGVmdWxseSB3aXRoIGEgcmluZyBzaXplIG9mIDE2IHRoZSBjYXJkIHdpbGwgbmV2ZXIgZ2V0IHRvIHJlYWQgYSBuZXh0X3B0cgorICoJb2YgMC4gIEFzIHRoZSBSeCBpbnRlcnJ1cHQgaXMgcmVjZWl2ZWQgd2UgY29weSB0aGUgZnJhbWUgdXAgdG8gdGhlIHByb3RvY29sIGxheWVycworICoJYW5kIHRoZW4gcG9pbnQgdGhlIGVuZCBvZiB0aGUgcmluZyB0byBvdXIgY3VycmVudCBwb3NpdGlvbiBhbmQgcG9pbnQgb3VyIGN1cnJlbnQKKyAqCXBvc2l0aW9uIHRvIDAsIHRoZXJlZm9yZSBtYWtpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24gdGhlIGxhc3QgcG9zaXRpb24gb24gdGhlIHJpbmcuCisgKglUaGUgbGFzdCBwb3NpdGlvbiBvbiB0aGUgcmluZyB0aGVyZWZvcmUgbG9vcHMgY29udGludWFsbHkgbG9vcHMgYXJvdW5kIHRoZSByeCByaW5nLgorICoJCisgKglyeF9yaW5nX3RhaWwgaXMgdGhlIHBvc2l0aW9uIG9uIHRoZSByaW5nIHRvIHByb2Nlc3MgbmV4dC4gKFRoaW5rIG9mIGEgc25ha2UsIHRoZSBoZWFkIAorICoJZXhwYW5kcyBhcyB0aGUgY2FyZCBhZGRzIG5ldyBwYWNrZXRzIGFuZCB3ZSBnbyBhcm91bmQgZWF0aW5nIHRoZSB0YWlsIHByb2Nlc3NpbmcgdGhlCisgKglwYWNrZXRzLikKKyAqCisgKglVbmRvdWJ0YWJseSBpdCBjb3VsZCBiZSBzdHJlYW1saW5lZCBhbmQgaW1wcm92ZWQgdXBvbiwgYnV0IGF0IHRoZSBtb21lbnQgaXQgd29ya3MgCisgKglhbmQgdGhlIGZhc3QgcGF0aCB0aHJvdWdoIHRoZSByb3V0aW5lIGlzIGZpbmUuIAorICoJCisgKglhZHZfcnhfcmluZyBjb3VsZCBiZSBpbmxpbmVkIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlLCBidXQgaXRzIGNhbGxlZCBhICpsb3QqIG9mIHRpbWVzCisgKglpbiB4bF9yeCBzbyB3b3VsZCBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgZnVuY3Rpb24gc2lnbmlmaWNhbnRseS4gCisgKi8KKworc3RhdGljIHZvaWQgYWR2X3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgLyogQWR2YW5jZSByeF9yaW5nLCBjdXQgZG93biBvbiBibG9hdCBpbiB4bF9yeCAqLyAKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdj0oc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJaW50IHByZXZfcmluZ19sb2MgOyAKKworCXByZXZfcmluZ19sb2MgPSAoeGxfcHJpdi0+cnhfcmluZ190YWlsICsgWExfUlhfUklOR19TSVpFIC0gMSkgJiAoWExfUlhfUklOR19TSVpFIC0gMSk7CisJeGxfcHJpdi0+eGxfcnhfcmluZ1twcmV2X3JpbmdfbG9jXS51cG5leHRwdHIgPSB4bF9wcml2LT5yeF9yaW5nX2RtYV9hZGRyICsgKHNpemVvZiAoc3RydWN0IHhsX3J4X2Rlc2MpICogeGxfcHJpdi0+cnhfcmluZ190YWlsKSA7IAorCXhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS5mcmFtZXN0YXR1cyA9IDAgOyAKKwl4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBuZXh0cHRyID0gMCA7IAkKKwl4bF9wcml2LT5yeF9yaW5nX3RhaWwrKyA7IAorCXhsX3ByaXYtPnJ4X3JpbmdfdGFpbCAmPSAoWExfUlhfUklOR19TSVpFLTEpIDsgCisKKwlyZXR1cm4gOyAKK30KKworc3RhdGljIHZvaWQgeGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdj0oc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnNrYjIgOyAKKwlpbnQgZnJhbWVfbGVuZ3RoID0gMCwgY29weV9sZW4gPSAwICA7IAkKKwlpbnQgdGVtcF9yaW5nX2xvYyA7ICAKKworCS8qCisJICogUmVjZWl2ZSB0aGUgbmV4dCBmcmFtZSwgbG9vcCBhcm91bmQgdGhlIHJpbmcgdW50aWwgYWxsIGZyYW1lcworICAJICogaGF2ZSBiZWVuIHJlY2VpdmVkLgorCSAqLyAJIAorCQorCXdoaWxlICh4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0uZnJhbWVzdGF0dXMgJiAoUlhVUERDT01QTEVURSB8IFJYVVBERlVMTCkgKSB7IC8qIERlc2NyaXB0b3IgdG8gcHJvY2VzcyAqLworCisJCWlmICh4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0uZnJhbWVzdGF0dXMgJiBSWFVQREZVTEwgKSB7IC8qIFVwZEZ1bGwsIE11bHRpcGxlIERlc2NyaXB0b3JzIHVzZWQgZm9yIHRoZSBmcmFtZSAqLworCisJCQkvKiAKKwkJCSAqIFRoaXMgaXMgYSBwYWluLCB5b3UgbmVlZCB0byBnbyB0aHJvdWdoIGFsbCB0aGUgZGVzY3JpcHRvcnMgdW50aWwgdGhlIGxhc3Qgb25lIAorCQkJICogZm9yIHRoaXMgZnJhbWUgdG8gZmluZCB0aGUgZnJhbWVsZW5ndGgKKwkJCSAqLworCisJCQl0ZW1wX3JpbmdfbG9jID0geGxfcHJpdi0+cnhfcmluZ190YWlsIDsgCisKKwkJCXdoaWxlICh4bF9wcml2LT54bF9yeF9yaW5nW3RlbXBfcmluZ19sb2NdLmZyYW1lc3RhdHVzICYgUlhVUERGVUxMICkgeworCQkJCXRlbXBfcmluZ19sb2MrKyA7IAorCQkJCXRlbXBfcmluZ19sb2MgJj0gKFhMX1JYX1JJTkdfU0laRS0xKSA7IAorCQkJfQorCisJCQlmcmFtZV9sZW5ndGggPSB4bF9wcml2LT54bF9yeF9yaW5nW3RlbXBfcmluZ19sb2NdLmZyYW1lc3RhdHVzICYgMHg3RkZGIDsgCisKKwkJCXNrYiA9IGRldl9hbGxvY19za2IoZnJhbWVfbGVuZ3RoKSA7CisgCisJCQlpZiAoc2tiPT1OVUxMKSB7IC8qIE5vIG1lbW9yeSBmb3IgZnJhbWUsIHN0aWxsIG5lZWQgdG8gcm9sbCBmb3J3YXJkIHRoZSByeCByaW5nICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRldl9hbGxvY19za2IgZmFpbGVkIC0gbXVsdGkgYnVmZmVyICFcbiIsIGRldi0+bmFtZSkgOyAKKwkJCQl3aGlsZSAoeGxfcHJpdi0+cnhfcmluZ190YWlsICE9IHRlbXBfcmluZ19sb2MpICAKKwkJCQkJYWR2X3J4X3JpbmcoZGV2KSA7IAorCQkJCQorCQkJCWFkdl9yeF9yaW5nKGRldikgOyAvKiBPbmUgbW9yZSB0aW1lIGp1c3QgZm9yIGx1Y2sgOikgKi8gCisJCQkJeGxfcHJpdi0+eGxfc3RhdHMucnhfZHJvcHBlZCsrIDsgCisKKwkJCQl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IFVQQ09NUEFDSyB8IExBVENIX0FDSyAsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJCQkJcmV0dXJuIDsgCQkJCQorCQkJfQorCQorCQkJc2tiLT5kZXYgPSBkZXYgOyAKKworCQkJd2hpbGUgKHhsX3ByaXYtPnJ4X3JpbmdfdGFpbCAhPSB0ZW1wX3JpbmdfbG9jKSB7IAorCQkJCWNvcHlfbGVuID0geGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2xlbiAmIDB4N0ZGRiA7IAorCQkJCWZyYW1lX2xlbmd0aCAtPSBjb3B5X2xlbiA7ICAKKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoeGxfcHJpdi0+cGRldix4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnYWRkcix4bF9wcml2LT5wa3RfYnVmX3N6LFBDSV9ETUFfRlJPTURFVklDRSkgOworCQkJCW1lbWNweShza2JfcHV0KHNrYixjb3B5X2xlbiksIHhsX3ByaXYtPnJ4X3Jpbmdfc2tiW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0tPmRhdGEsIGNvcHlfbGVuKSA7IAorCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh4bF9wcml2LT5wZGV2LHhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS51cGZyYWdhZGRyLHhsX3ByaXYtPnBrdF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKSA7CisJCQkJYWR2X3J4X3JpbmcoZGV2KSA7IAorCQkJfSAKKworCQkJLyogTm93IHdlIGhhdmUgZm91bmQgdGhlIGxhc3QgZnJhZ21lbnQgKi8KKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSh4bF9wcml2LT5wZGV2LHhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS51cGZyYWdhZGRyLHhsX3ByaXYtPnBrdF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKSA7CisJCQltZW1jcHkoc2tiX3B1dChza2IsY29weV9sZW4pLCB4bF9wcml2LT5yeF9yaW5nX3NrYlt4bF9wcml2LT5yeF9yaW5nX3RhaWxdLT5kYXRhLCBmcmFtZV9sZW5ndGgpIDsgCisvKgkJCW1lbWNweShza2JfcHV0KHNrYixmcmFtZV9sZW5ndGgpLCBidXNfdG9fdmlydCh4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnYWRkciksIGZyYW1lX2xlbmd0aCkgOyAqLworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2FkZHIseGxfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsKKwkJCWFkdl9yeF9yaW5nKGRldikgOyAKKwkJCXNrYi0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKHNrYixkZXYpIDsgCisJCQluZXRpZl9yeChza2IpIDsgCisKKwkJfSBlbHNlIHsgLyogU2luZ2xlIERlc2NyaXB0b3IgVXNlZCwgc2ltcGx5IHN3YXAgYnVmZmVycyBvdmVyLCBmYXN0IHBhdGggICovCisKKwkJCWZyYW1lX2xlbmd0aCA9IHhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS5mcmFtZXN0YXR1cyAmIDB4N0ZGRiA7IAorCQkJCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHhsX3ByaXYtPnBrdF9idWZfc3opIDsgCisKKwkJCWlmIChza2I9PU5VTEwpIHsgLyogU3RpbGwgbmVlZCB0byBmaXggdGhlIHJ4IHJpbmcgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZGV2X2FsbG9jX3NrYiBmYWlsZWQgaW4gcngsIHNpbmdsZSBidWZmZXIgXG4iLGRldi0+bmFtZSkgOyAKKwkJCQlhZHZfcnhfcmluZyhkZXYpIDsgCisJCQkJeGxfcHJpdi0+eGxfc3RhdHMucnhfZHJvcHBlZCsrIDsgCisJCQkJd3JpdGVsKEFDS19JTlRFUlJVUFQgfCBVUENPTVBBQ0sgfCBMQVRDSF9BQ0sgLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCQkJCXJldHVybiA7IAorCQkJfQorCisJCQlza2ItPmRldiA9IGRldiA7IAorCisJCQlza2IyID0geGxfcHJpdi0+cnhfcmluZ19za2JbeGxfcHJpdi0+cnhfcmluZ190YWlsXSA7IAorCQkJcGNpX3VubWFwX3NpbmdsZSh4bF9wcml2LT5wZGV2LCB4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnYWRkciwgeGxfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsgCisJCQlza2JfcHV0KHNrYjIsIGZyYW1lX2xlbmd0aCkgOyAKKwkJCXNrYjItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IyLGRldikgOyAKKworCQkJeGxfcHJpdi0+cnhfcmluZ19za2JbeGxfcHJpdi0+cnhfcmluZ190YWlsXSA9IHNrYiA7IAkKKwkJCXhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS51cGZyYWdhZGRyID0gcGNpX21hcF9zaW5nbGUoeGxfcHJpdi0+cGRldixza2ItPmRhdGEseGxfcHJpdi0+cGt0X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSA7IAorCQkJeGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2xlbiA9IHhsX3ByaXYtPnBrdF9idWZfc3ogfCBSWFVQTEFTVEZSQUcgOyAKKwkJCWFkdl9yeF9yaW5nKGRldikgOyAKKwkJCXhsX3ByaXYtPnhsX3N0YXRzLnJ4X3BhY2tldHMrKyA7IAorCQkJeGxfcHJpdi0+eGxfc3RhdHMucnhfYnl0ZXMgKz0gZnJhbWVfbGVuZ3RoIDsgCQorCisJCQluZXRpZl9yeChza2IyKSA7IAkJCisJCSB9IC8qIGlmIG11bHRpcGxlIGJ1ZmZlcnMgKi8KKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllcyA7IAkKKwl9IC8qIHdoaWxlIHBhY2tldCB0byBkbyAqLworCisJLyogQ2xlYXIgdGhlIHVwZENvbXBsZXRlIGludGVycnVwdCAqLworCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgVVBDT01QQUNLIHwgTEFUQ0hfQUNLICwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwlyZXR1cm4gOyAJCit9CisKKy8qCisgKiBUaGlzIGlzIHJ1dGhsZXNzLCBpdCBkb2Vzbid0IGNhcmUgd2hhdCBzdGF0ZSB0aGUgY2FyZCBpcyBpbiBpdCB3aWxsIAorICogY29tcGxldGVseSByZXNldCB0aGUgYWRhcHRlci4KKyAqLworCitzdGF0aWMgdm9pZCB4bF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdj0oc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJdW5zaWduZWQgbG9uZyB0OyAKKworCXdyaXRldyggR0xPQkFMX1JFU0VULCB4bF9tbWlvICsgTU1JT19DT01NQU5EICkgOyAKKworCS8qIAorCSAqIE11c3Qgd2FpdCBmb3IgY21kSW5Qcm9ncmVzcyBiaXQgKDEyKSB0byBjbGVhciBiZWZvcmUgY29udGludWluZyB3aXRoCisJICogY2FyZCBjb25maWd1cmF0aW9uLgorCSAqLworCisJdD1qaWZmaWVzOworCXdoaWxlIChyZWFkdyh4bF9tbWlvICsgTU1JT19JTlRTVEFUVVMpICYgSU5UU1RBVF9DTURfSU5fUFJPR1JFU1MpIHsgCisJCWlmKGppZmZpZXMtdCA+IDQwKkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIjNDT00gM0MzNTkgVmVsb2NpdHkgWEwgIGNhcmQgbm90IHJlc3BvbmRpbmcuXG4iKTsKKwkJCWJyZWFrIDsgCisJCX0KKwl9CisJCit9CisKK3N0YXRpYyB2b2lkIHhsX2ZyZWVtZW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXY9KHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2IDsgCisJaW50IGkgOyAKKworCWZvciAoaT0wO2k8WExfUlhfUklOR19TSVpFO2krKykgeworCQlkZXZfa2ZyZWVfc2tiX2lycSh4bF9wcml2LT5yeF9yaW5nX3NrYlt4bF9wcml2LT5yeF9yaW5nX3RhaWxdKSA7IAorCQlwY2lfdW5tYXBfc2luZ2xlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2FkZHIseGxfcHJpdi0+cGt0X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSA7IAorCQl4bF9wcml2LT5yeF9yaW5nX3RhaWwrKyA7IAorCQl4bF9wcml2LT5yeF9yaW5nX3RhaWwgJj0gWExfUlhfUklOR19TSVpFLTE7IAorCX0gCisKKwkvKiB1bm1hcCByaW5nICovCisJcGNpX3VubWFwX3NpbmdsZSh4bF9wcml2LT5wZGV2LHhsX3ByaXYtPnJ4X3JpbmdfZG1hX2FkZHIsIHNpemVvZihzdHJ1Y3QgeGxfcnhfZGVzYykgKiBYTF9SWF9SSU5HX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSkgOyAKKwkKKwlwY2lfdW5tYXBfc2luZ2xlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+dHhfcmluZ19kbWFfYWRkciwgc2l6ZW9mKHN0cnVjdCB4bF90eF9kZXNjKSAqIFhMX1RYX1JJTkdfU0laRSwgUENJX0RNQV9UT0RFVklDRSkgOyAKKworCWtmcmVlKHhsX3ByaXYtPnhsX3J4X3JpbmcpIDsgCisJa2ZyZWUoeGxfcHJpdi0+eGxfdHhfcmluZykgOyAKKworCXJldHVybiAgOyAKK30KKworc3RhdGljIGlycXJldHVybl90IHhsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSAKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworIAlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9KHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKiB4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCXUxNiBpbnRzdGF0dXMsIG1hY3N0YXR1cyAgOworCisJaWYgKCFkZXYpIHsgCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRldmljZSBzdHJ1Y3R1cmUgZGVhZCwgYWFhaGhoaCAhXG4iKSA7CisJCXJldHVybiBJUlFfTk9ORTsgCisJfQorCisJaW50c3RhdHVzID0gcmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSA7ICAKKworCWlmICghKGludHN0YXR1cyAmIDEpKSAvKiBXZSBkaWRuJ3QgZ2VuZXJhdGUgdGhlIGludGVycnVwdCAqLworCQlyZXR1cm4gSVJRX05PTkU7CisKKwlzcGluX2xvY2soJnhsX3ByaXYtPnhsX2xvY2spIDsgCisKKwkvKgorCSAqIFByb2Nlc3MgdGhlIGludGVycnVwdAorCSAqLworCS8qCisJICogU29tZXRoaW5nIGZpc2h5IGdvaW5nIG9uIGhlcmUsIHdlIHNob3VsZG4ndCBnZXQgMDAwMSBpbnRzLCBub3QgZmF0YWwgdGhvdWdoLgorCSAqLworCWlmIChpbnRzdGF0dXMgPT0gMHgwMDAxKSB7ICAKKwkJd3JpdGVsKEFDS19JTlRFUlJVUFQgfCBMQVRDSF9BQ0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IDAwMDAxIGludCByZWNlaXZlZCBcbiIsZGV2LT5uYW1lKSA7ICAKKwl9IGVsc2UgeyAgCisJCWlmIChpbnRzdGF0dXMgJgkoSE9TVEVSUklOVCB8IFNSQlJJTlQgfCBBUkJDSU5UIHwgVVBDT01QSU5UIHwgRE5DT01QSU5UIHwgSEFSREVSUklOVCB8ICgxPDw4KSB8IFRYVU5ERVJSVU4gfCBBU0JGSU5UKSkgeyAKKwkJCQorCQkJLyogCisJCQkgKiBIb3N0IEVycm9yLgorCQkJICogSXQgbWF5IGJlIHBvc3NpYmxlIHRvIHJlY292ZXIgZnJvbSB0aGlzLCBidXQgdXN1YWxseSBpdCBtZWFucyBzb21ldGhpbmcKKwkJCSAqIGlzIHNlcmlvdXNseSBmdWJhciwgc28gd2UganVzdCBjbG9zZSB0aGUgYWRhcHRlci4KKwkJCSAqLworCisJCQlpZiAoaW50c3RhdHVzICYgSE9TVEVSUklOVCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBIb3N0IEVycm9yLCBwZXJmb3JtaW5nIGdsb2JhbCByZXNldCwgaW50c3RhdHVzID0gJTA0eCBcbiIsZGV2LT5uYW1lLGludHN0YXR1cykgOyAKKwkJCQl3cml0ZXcoIEdMT0JBTF9SRVNFVCwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCApIDsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVzZXR0aW5nIGhhcmR3YXJlOiBcbiIsIGRldi0+bmFtZSk7IAorCQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KSA7CisJCQkJeGxfZnJlZW1lbShkZXYpIDsgCisJCQkJZnJlZV9pcnEoZGV2LT5pcnEsZGV2KTsgCQorCQkJCXhsX3Jlc2V0KGRldikgOyAKKwkJCQl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IExBVENIX0FDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwkJCQlzcGluX3VubG9jaygmeGxfcHJpdi0+eGxfbG9jaykgOyAKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9IC8qIEhvc3QgRXJyb3IgKi8KKworCQkJaWYgKGludHN0YXR1cyAmIFNSQlJJTlQgKSB7ICAvKiBTcmJjIGludGVycnVwdCAqLworCQkJCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgU1JCUkFDSyB8IExBVENIX0FDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOworCQkJCWlmICh4bF9wcml2LT5zcmJfcXVldWVkKQorCQkJCQl4bF9zcmJfYmgoZGV2KSA7IAorCQkJfSAvKiBTUkJSIEludGVycnVwdCAqLworCisJCQlpZiAoaW50c3RhdHVzICYgVFhVTkRFUlJVTikgeyAvKiBJc3N1ZSBEblJlc2V0IGNvbW1hbmQgKi8KKwkJCQl3cml0ZWwoRE5SRVNFVCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQkJd2hpbGUgKHJlYWR3KHhsX21taW8gKyBNTUlPX0lOVFNUQVRVUykgJiBJTlRTVEFUX0NNRF9JTl9QUk9HUkVTUykgeyAvKiBXYWl0IGZvciBjb21tYW5kIHRvIHJ1biAqLworCQkJCQkvKiAhISEgRklYLU1FICEhISEgCisJCQkJCU11c3QgcHV0IGEgdGltZW91dCBjaGVjayBoZXJlICEgKi8KKwkJCQkJLyogRW1wdHkgTG9vcCAqLworCQkJCX0gCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRYIFVuZGVycnVuIHJlY2VpdmVkIFxuIixkZXYtPm5hbWUpIDsKKwkJCQl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IExBVENIX0FDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwkJCX0gLyogVHhVbmRlclJ1biAqLworCQorCQkJaWYgKGludHN0YXR1cyAmIEFSQkNJTlQgKSB7IC8qIEFyYmMgaW50ZXJydXB0ICovCisJCQkJeGxfYXJiX2NtZChkZXYpIDsgCisJCQl9IC8qIEFyYmMgKi8KKworCQkJaWYgKGludHN0YXR1cyAmIEFTQkZJTlQpIHsgCisJCQkJaWYgKHhsX3ByaXYtPmFzYl9xdWV1ZWQgPT0gMSkgeworCQkJCQl4bF9hc2JfY21kKGRldikgOyAKKwkJCQl9IGVsc2UgaWYgKHhsX3ByaXYtPmFzYl9xdWV1ZWQgPT0gMikgeworCQkJCQl4bF9hc2JfYmgoZGV2KSA7IAorCQkJCX0gZWxzZSB7IAorCQkJCQl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IExBVENIX0FDSyB8IEFTQkZBQ0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJCQkJfSAgCisJCQl9IC8qIEFzYmYgKi8KKworCQkJaWYgKGludHN0YXR1cyAmIFVQQ09NUElOVCApIC8qIFVwQ29tcGxldGUgKi8KKwkJCQl4bF9yeChkZXYpIDsgCisKKwkJCWlmIChpbnRzdGF0dXMgJiBETkNPTVBJTlQgKSAgLyogRG5Db21wbGV0ZSAqLworCQkJCXhsX2RuX2NvbXAoZGV2KSA7IAorCisJCQlpZiAoaW50c3RhdHVzICYgSEFSREVSUklOVCApIHsgLyogSGFyZHdhcmUgZXJyb3IgKi8KKwkJCQl3cml0ZWwoTU1JT19XT1JEX1JFQUQgfCBNQUNTVEFUVVMsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQkJCW1hY3N0YXR1cyA9IHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1hY1N0YXR1c0Vycm9yLCBkZXRhaWxzOiAiLCBkZXYtPm5hbWUpOworCQkJCWlmIChtYWNzdGF0dXMgJiAoMTw8MTQpKSAKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidGNoayBlcnJvcjogVW5yZWNvdmVyYWJsZSBlcnJvciBcbiIpIDsgCisJCQkJaWYgKG1hY3N0YXR1cyAmICgxPDwzKSkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWludCBlcnJvcjogSW50ZXJuYWwgd2F0Y2hkb2cgdGltZXIgZXhwaXJlZCBcbiIpIDsKKwkJCQlpZiAobWFjc3RhdHVzICYgKDE8PDIpKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhaW50IGVycm9yOiBIb3N0IHRyaWVkIHRvIHBlcmZvcm0gaW52YWxpZCBvcGVyYXRpb24gXG4iKSA7IAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkluc3RhdHVzID0gJTAyeCwgbWFjc3RhdHVzID0gJTAyeFxuIixpbnRzdGF0dXMsbWFjc3RhdHVzKSA7IAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXNldHRpbmcgaGFyZHdhcmU6IFxuIiwgZGV2LT5uYW1lKTsgCisJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpIDsKKwkJCQl4bF9mcmVlbWVtKGRldikgOyAKKwkJCQlmcmVlX2lycShkZXYtPmlycSxkZXYpOyAKKwkJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpIDsgCisJCQkJZnJlZV9uZXRkZXYoZGV2KSA7ICAKKwkJCQl4bF9yZXNldChkZXYpIDsgCisJCQkJd3JpdGVsKEFDS19JTlRFUlJVUFQgfCBMQVRDSF9BQ0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJCQkJc3Bpbl91bmxvY2soJnhsX3ByaXYtPnhsX2xvY2spIDsgCisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQl9IGVsc2UgeyAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlZCBVbmtub3duIGludGVycnVwdCA6ICUwNHggXG4iLCBkZXYtPm5hbWUsIGludHN0YXR1cykgOworCQkJd3JpdGVsKEFDS19JTlRFUlJVUFQgfCBMQVRDSF9BQ0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCQorCQl9CisJfSAKKworCS8qIFR1cm4gaW50ZXJydXB0cyBiYWNrIG9uICovCisKKwl3cml0ZWwoIFNFVElOREVOQUJMRSB8IElOVF9NQVNLLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCXdyaXRlbCggU0VUSU5URU5BQkxFIHwgSU5UX01BU0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisKKwlzcGluX3VubG9jaygmeGxfcHJpdi0+eGxfbG9jaykgOworCXJldHVybiBJUlFfSEFORExFRDsKK30JCisKKy8qCisgKglUeCAtIFBvbGxpbmcgY29uZmlndXJhdGlvbgorICovCisJCitzdGF0aWMgaW50IHhsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXY9KHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2OworCXN0cnVjdCB4bF90eF9kZXNjICp0eGQgOyAKKwlpbnQgdHhfaGVhZCwgdHhfdGFpbCwgdHhfcHJldiA7IAorCXVuc2lnbmVkIGxvbmcgZmxhZ3MgOyAJCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeGxfcHJpdi0+eGxfbG9jayxmbGFncykgOyAKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KSA7IAorCisJaWYgKHhsX3ByaXYtPmZyZWVfcmluZ19lbnRyaWVzID4gMSApIHsgCQorCQkvKgorCQkgKiBTZXQgdXAgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBwYWNrZXQgCisJCSAqLworCQl0eF9oZWFkID0geGxfcHJpdi0+dHhfcmluZ19oZWFkIDsgCisJCXR4X3RhaWwgPSB4bF9wcml2LT50eF9yaW5nX3RhaWwgOyAKKworCQl0eGQgPSAmKHhsX3ByaXYtPnhsX3R4X3JpbmdbdHhfaGVhZF0pIDsgCisJCXR4ZC0+ZG5uZXh0cHRyID0gMCA7IAorCQl0eGQtPmZyYW1lc3RhcnRoZWFkZXIgPSBza2ItPmxlbiB8IFRYRE5JTkRJQ0FURSA7IAorCQl0eGQtPmJ1ZmZlciA9IHBjaV9tYXBfc2luZ2xlKHhsX3ByaXYtPnBkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpIDsgCisJCXR4ZC0+YnVmZmVyX2xlbmd0aCA9IHNrYi0+bGVuIHwgVFhETkZSQUdMQVNUICA7IAorCQl4bF9wcml2LT50eF9yaW5nX3NrYlt0eF9oZWFkXSA9IHNrYiA7IAorCQl4bF9wcml2LT54bF9zdGF0cy50eF9wYWNrZXRzKysgOyAKKwkJeGxfcHJpdi0+eGxfc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW4gOworCisJCS8qIAorCQkgKiBTZXQgdGhlIG5leHRwdHIgb2YgdGhlIHByZXZpb3VzIGRlc2NyaXB0b3IgZXF1YWwgdG8gdGhpcyBkZXNjcmlwdG9yLCBhZGQgWExfVFhfUklOR19TSVpFIC0xIAorCQkgKiB0byBlbnN1cmUgbm8gbmVnYXRpdmUgbnVtYmVycyBpbiB1bnNpZ25lZCBsb2NhdGlvbnMuCisJCSAqLyAKKwkKKwkJdHhfcHJldiA9ICh4bF9wcml2LT50eF9yaW5nX2hlYWQgKyBYTF9UWF9SSU5HX1NJWkUgLSAxKSAmIChYTF9UWF9SSU5HX1NJWkUgLSAxKSA7IAorCisJCXhsX3ByaXYtPnR4X3JpbmdfaGVhZCsrIDsgCisJCXhsX3ByaXYtPnR4X3JpbmdfaGVhZCAmPSAoWExfVFhfUklOR19TSVpFIC0gMSkgOworCQl4bF9wcml2LT5mcmVlX3JpbmdfZW50cmllcy0tIDsgCisKKwkJeGxfcHJpdi0+eGxfdHhfcmluZ1t0eF9wcmV2XS5kbm5leHRwdHIgPSB4bF9wcml2LT50eF9yaW5nX2RtYV9hZGRyICsgKHNpemVvZiAoc3RydWN0IHhsX3R4X2Rlc2MpICogdHhfaGVhZCkgOyAKKworCQkvKiBTbmVha3ksIGJ5IGRvaW5nIGEgcmVhZCBvbiBEbkxpc3RQdHIgd2UgY2FuIGZvcmNlIHRoZSBjYXJkIHRvIHBvbGwgb24gdGhlIERuTmV4dFB0ciAqLworCQkvKiByZWFkbCh4bF9tbWlvICsgTU1JT19ETkxJU1RQVFIpIDsgKi8KKworCQluZXRpZl93YWtlX3F1ZXVlKGRldikgOyAKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4bF9wcml2LT54bF9sb2NrLGZsYWdzKSA7IAorIAorCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4bF9wcml2LT54bF9sb2NrLGZsYWdzKSA7IAorCQlyZXR1cm4gMTsKKwl9CisKK30KKwkKKy8qIAorICogVGhlIE5JQyBoYXMgdG9sZCB1cyB0aGF0IGEgcGFja2V0IGhhcyBiZWVuIGRvd25sb2FkZWQgb250byB0aGUgY2FyZCwgd2UgbXVzdAorICogZmluZCBvdXQgd2hpY2ggcGFja2V0IGl0IGhhcyBkb25lLCBjbGVhciB0aGUgc2tiIGFuZCBpbmZvcm1hdGlvbiBmb3IgdGhlIHBhY2tldAorICogdGhlbiBhZHZhbmNlIGFyb3VuZCB0aGUgcmluZyBmb3IgYWxsIHRyYW5taXR0ZWQgcGFja2V0cworICovCisKK3N0YXRpYyB2b2lkIHhsX2RuX2NvbXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXY9KHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKiB4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCXN0cnVjdCB4bF90eF9kZXNjICp0eGQgOyAKKworCisJaWYgKHhsX3ByaXYtPnR4X3JpbmdfdGFpbCA9PSAyNTUpIHsvKiBGaXJzdCB0aW1lICovCisJCXhsX3ByaXYtPnhsX3R4X3JpbmdbMF0uZnJhbWVzdGFydGhlYWRlciA9IDAgOyAKKwkJeGxfcHJpdi0+eGxfdHhfcmluZ1swXS5kbm5leHRwdHIgPSAwIDsgIAorCQl4bF9wcml2LT50eF9yaW5nX3RhaWwgPSAxIDsgCisJfQorCisJd2hpbGUgKHhsX3ByaXYtPnhsX3R4X3JpbmdbeGxfcHJpdi0+dHhfcmluZ190YWlsXS5mcmFtZXN0YXJ0aGVhZGVyICYgVFhETkNPTVBMRVRFICkgeyAKKwkJdHhkID0gJih4bF9wcml2LT54bF90eF9yaW5nW3hsX3ByaXYtPnR4X3JpbmdfdGFpbF0pIDsKKwkJcGNpX3VubWFwX3NpbmdsZSh4bF9wcml2LT5wZGV2LHR4ZC0+YnVmZmVyLCB4bF9wcml2LT50eF9yaW5nX3NrYlt4bF9wcml2LT50eF9yaW5nX3RhaWxdLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpIDsgCisJCXR4ZC0+ZnJhbWVzdGFydGhlYWRlciA9IDAgOyAKKwkJdHhkLT5idWZmZXIgPSAweGRlYWRiZWVmICA7IAorCQl0eGQtPmJ1ZmZlcl9sZW5ndGggID0gMCA7ICAKKwkJZGV2X2tmcmVlX3NrYl9pcnEoeGxfcHJpdi0+dHhfcmluZ19za2JbeGxfcHJpdi0+dHhfcmluZ190YWlsXSkgOworCQl4bF9wcml2LT50eF9yaW5nX3RhaWwrKyA7IAorCQl4bF9wcml2LT50eF9yaW5nX3RhaWwgJj0gKFhMX1RYX1JJTkdfU0laRSAtIDEpIDsgCisJCXhsX3ByaXYtPmZyZWVfcmluZ19lbnRyaWVzKysgOyAKKwl9CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldikgOyAKKworCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgRE5DT01QQUNLIHwgTEFUQ0hfQUNLICwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKK30KKworLyoKKyAqIENsb3NlIHRoZSBhZGFwdGVyIHByb3Blcmx5LgorICogVGhpcyBzcmIgcmVwbHkgY2Fubm90IGJlIGhhbmRsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCBhcyB3ZSBoYXZlCisgKiB0byBmcmVlIHRoZSBpbnRlcnJ1cHQgZnJvbSB0aGUgZHJpdmVyLiAKKyAqLworCitzdGF0aWMgaW50IHhsX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopIGRldi0+cHJpdiA7IAorCXU4IF9faW9tZW0gKiB4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCXVuc2lnbmVkIGxvbmcgdCA7IAorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpIDsgCisKKwkvKgorCSAqIENsb3NlIHRoZSBhZGFwdGVyLCBuZWVkIHRvIHN0YWxsIHRoZSByeCBhbmQgdHggcXVldWVzLgorCSAqLworCisgICAgCXdyaXRldyhETlNUQUxMLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCXQ9amlmZmllczsKKwl3aGlsZSAocmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSAmIElOVFNUQVRfQ01EX0lOX1BST0dSRVNTKSB7IAorCQlzY2hlZHVsZSgpOwkJCisJCWlmKGppZmZpZXMtdCA+IDEwKkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAzQ09NIDNDMzU5IFZlbG9jaXR5IFhMLUROU1RBTEwgbm90IHJlc3BvbmRpbmcuXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWsgOyAKKwkJfQorCX0KKyAgICAJd3JpdGV3KERORElTQUJMRSwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwl0PWppZmZpZXM7CisJd2hpbGUgKHJlYWR3KHhsX21taW8gKyBNTUlPX0lOVFNUQVRVUykgJiBJTlRTVEFUX0NNRF9JTl9QUk9HUkVTUykgeyAKKwkJc2NoZWR1bGUoKTsJCQorCQlpZihqaWZmaWVzLXQgPiAxMCpIWikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogM0NPTSAzQzM1OSBWZWxvY2l0eSBYTC1ETkRJU0FCTEUgbm90IHJlc3BvbmRpbmcuXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWsgOworCQl9CisJfQorICAgIAl3cml0ZXcoVVBTVEFMTCwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwl0PWppZmZpZXM7CisJd2hpbGUgKHJlYWR3KHhsX21taW8gKyBNTUlPX0lOVFNUQVRVUykgJiBJTlRTVEFUX0NNRF9JTl9QUk9HUkVTUykgeyAKKwkJc2NoZWR1bGUoKTsJCQorCQlpZihqaWZmaWVzLXQgPiAxMCpIWikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogM0NPTSAzQzM1OSBWZWxvY2l0eSBYTC1VUFNUQUxMIG5vdCByZXNwb25kaW5nLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrIDsgCisJCX0KKwl9CisKKwkvKiBUdXJuIG9mZiBpbnRlcnJ1cHRzLCB3ZSB3aWxsIHN0aWxsIGdldCB0aGUgaW5kaWNhdGlvbiB0aG91Z2gKKyAJICogc28gd2UgY2FuIHRyYXAgaXQKKwkgKi8KKworCXdyaXRlbChTRVRJTlRFTkFCTEUsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisKKwl4bF9zcmJfY21kKGRldixDTE9TRV9OSUMpIDsgCisKKwl0PWppZmZpZXM7CisJd2hpbGUgKCEocmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSAmIElOVFNUQVRfU1JCKSkgeyAKKwkJc2NoZWR1bGUoKTsJCQorCQlpZihqaWZmaWVzLXQgPiAxMCpIWikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogM0NPTSAzQzM1OSBWZWxvY2l0eSBYTC1DTE9TRU5JQyBub3QgcmVzcG9uZGluZy5cbiIsIGRldi0+bmFtZSk7CisJCQlicmVhayA7IAorCQl9CisJfQorCS8qIFJlYWQgdGhlIHNyYiByZXNwb25zZSBmcm9tIHRoZSBhZGFwdGVyICovCisKKwl3cml0ZWwoTUVNX0JZVEVfUkVBRCB8IDB4ZDAwMDAgfCB4bF9wcml2LT5zcmIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKTsKKwlpZiAocmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgIT0gQ0xPU0VfTklDKSB7IAorCQlwcmludGsoS0VSTl9JTkZPICIlczogQ0xPU0VfTklDIGRpZCBub3QgZ2V0IGEgQ0xPU0VfTklDIHJlc3BvbnNlIFxuIixkZXYtPm5hbWUpIDsgCisJfSBlbHNlIHsgCisJCXdyaXRlbCgoTUVNX0JZVEVfUkVBRCB8IDB4ZDAwMDAgfCB4bF9wcml2LT5zcmIpICsyLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOworCQlpZiAocmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSk9PTApIHsgCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQWRhcHRlciBoYXMgYmVlbiBjbG9zZWQgXG4iLGRldi0+bmFtZSkgOworCQkJd3JpdGV3KEFDS19JTlRFUlJVUFQgfCBTUkJSQUNLIHwgTEFUQ0hfQUNLLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCisJCQl4bF9mcmVlbWVtKGRldikgOyAKKwkJCWZyZWVfaXJxKGRldi0+aXJxLGRldikgOyAKKwkJfSBlbHNlIHsgCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ2xvc2UgbmljIGNvbW1hbmQgcmV0dXJuZWQgZXJyb3IgY29kZSAlMDJ4XG4iLGRldi0+bmFtZSwgcmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkpIDsKKwkJfSAKKwl9CisKKwkvKiBSZXNldCB0aGUgdXBsb2FkIGFuZCBkb3dubG9hZCBsb2dpYyAqLworIAorICAgIAl3cml0ZXcoVVBSRVNFVCwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwl0PWppZmZpZXM7CisJd2hpbGUgKHJlYWR3KHhsX21taW8gKyBNTUlPX0lOVFNUQVRVUykgJiBJTlRTVEFUX0NNRF9JTl9QUk9HUkVTUykgeyAKKwkJc2NoZWR1bGUoKTsJCQorCQlpZihqaWZmaWVzLXQgPiAxMCpIWikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogM0NPTSAzQzM1OSBWZWxvY2l0eSBYTC1VUFJFU0VUIG5vdCByZXNwb25kaW5nLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrIDsgCisJCX0KKwl9CisgICAgCXdyaXRldyhETlJFU0VULCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCXQ9amlmZmllczsKKwl3aGlsZSAocmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSAmIElOVFNUQVRfQ01EX0lOX1BST0dSRVNTKSB7IAorCQlzY2hlZHVsZSgpOwkJCisJCWlmKGppZmZpZXMtdCA+IDEwKkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAzQ09NIDNDMzU5IFZlbG9jaXR5IFhMLUROUkVTRVQgbm90IHJlc3BvbmRpbmcuXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWsgOyAKKwkJfQorCX0KKwl4bF9od19yZXNldChkZXYpIDsgCisJcmV0dXJuIDAgOworfQorCitzdGF0aWMgdm9pZCB4bF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKSBkZXYtPnByaXYgOyAKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA7IAorCXVuc2lnbmVkIGNoYXIgZGV2X21jX2FkZHJlc3NbNF0gOyAKKwl1MTYgb3B0aW9ucyA7IAorCWludCBpIDsgCisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQlvcHRpb25zID0gMHgwMDA0IDsgCisJZWxzZQorCQlvcHRpb25zID0gMHgwMDAwIDsgCisKKwlpZiAob3B0aW9ucyBeIHhsX3ByaXYtPnhsX2NvcHlfYWxsX29wdGlvbnMpIHsgLyogQ2hhbmdlZCwgbXVzdCBzZW5kIGNvbW1hbmQgKi8KKwkJeGxfcHJpdi0+eGxfY29weV9hbGxfb3B0aW9ucyA9IG9wdGlvbnMgOyAKKwkJeGxfc3JiX2NtZChkZXYsIFNFVF9SRUNFSVZFX01PREUpIDsKKwkJcmV0dXJuIDsgIAorCX0KKworCWRldl9tY19hZGRyZXNzWzBdID0gZGV2X21jX2FkZHJlc3NbMV0gPSBkZXZfbWNfYWRkcmVzc1syXSA9IGRldl9tY19hZGRyZXNzWzNdID0gMCA7CisKKyAgICAgICAgZm9yIChpPTAsZG1pPWRldi0+bWNfbGlzdDtpIDwgZGV2LT5tY19jb3VudDsgaSsrLGRtaSA9IGRtaS0+bmV4dCkgeworICAgICAgICAgICAgICAgIGRldl9tY19hZGRyZXNzWzBdIHw9IGRtaS0+ZG1pX2FkZHJbMl0gOworICAgICAgICAgICAgICAgIGRldl9tY19hZGRyZXNzWzFdIHw9IGRtaS0+ZG1pX2FkZHJbM10gOworICAgICAgICAgICAgICAgIGRldl9tY19hZGRyZXNzWzJdIHw9IGRtaS0+ZG1pX2FkZHJbNF0gOworICAgICAgICAgICAgICAgIGRldl9tY19hZGRyZXNzWzNdIHw9IGRtaS0+ZG1pX2FkZHJbNV0gOworICAgICAgICB9CisKKwlpZiAobWVtY21wKHhsX3ByaXYtPnhsX2Z1bmN0aW9uYWxfYWRkcixkZXZfbWNfYWRkcmVzcyw0KSAhPSAwKSB7IC8qIE9wdGlvbnMgaGF2ZSBjaGFuZ2VkLCBydW4gdGhlIGNvbW1hbmQgKi8KKwkJbWVtY3B5KHhsX3ByaXYtPnhsX2Z1bmN0aW9uYWxfYWRkciwgZGV2X21jX2FkZHJlc3MsNCkgOyAKKwkJeGxfc3JiX2NtZChkZXYsIFNFVF9GVU5DX0FERFJFU1MpIDsgCisJfQorCXJldHVybiA7IAorfQorCisKKy8qCisgKglXZSBpc3N1ZWQgYW4gc3JiIGNvbW1hbmQgYW5kIG5vdyB3ZSBtdXN0IHJlYWQKKyAqCXRoZSByZXNwb25zZSBmcm9tIHRoZSBjb21wbGV0ZWQgY29tbWFuZC4KKyAqLworCitzdGF0aWMgdm9pZCB4bF9zcmJfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7IAorCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopIGRldi0+cHJpdiA7IAorCXU4IF9faW9tZW0gKiB4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCXU4IHNyYl9jbWQsIHJldF9jb2RlIDsgCisJaW50IGkgOyAKKworCXdyaXRlbChNRU1fQllURV9SRUFEIHwgMHhkMDAwMCB8IHhsX3ByaXYtPnNyYiwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsKKwlzcmJfY21kID0gcmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwl3cml0ZWwoKE1FTV9CWVRFX1JFQUQgfCAweGQwMDAwIHwgeGxfcHJpdi0+c3JiKSArMiwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsKKwlyZXRfY29kZSA9IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwkvKiBSZXRfY29kZSBpcyBzdGFuZGFyZCBhY3Jvc3MgYWxsIGNvbW1hbmRzICovCisKKwlzd2l0Y2ggKHJldF9jb2RlKSB7IAorCWNhc2UgMToKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvbW1hbmQ6ICVkIC0gSW52YWxpZCBDb21tYW5kIGNvZGVcbiIsZGV2LT5uYW1lLHNyYl9jbWQpIDsgCisJCWJyZWFrIDsgCisJY2FzZSA0OgorCQlwcmludGsoS0VSTl9JTkZPICIlczogQ29tbWFuZDogJWQgLSBBZGFwdGVyIGlzIGNsb3NlZCwgbXVzdCBiZSBvcGVuIGZvciB0aGlzIGNvbW1hbmQgXG4iLGRldi0+bmFtZSxzcmJfY21kKSA7IAorCQlicmVhayA7CisJCisJY2FzZSA2OgorCQlwcmludGsoS0VSTl9JTkZPICIlczogQ29tbWFuZDogJWQgLSBPcHRpb25zIEludmFsaWQgZm9yIGNvbW1hbmQgXG4iLGRldi0+bmFtZSxzcmJfY21kKSA7CisJCWJyZWFrIDsKKworCWNhc2UgMDogLyogU3VjY2Vzc2Z1bCBjb21tYW5kIGV4ZWN1dGlvbiAqLyAKKwkJc3dpdGNoIChzcmJfY21kKSB7IAorCQljYXNlIFJFQURfTE9HOiAvKiBSZXR1cm5zIDE0IGJ5dGVzIG9mIGRhdGEgZnJvbSB0aGUgTklDICovCisJCQlpZih4bF9wcml2LT54bF9tZXNzYWdlX2xldmVsKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSRUFELkxPRyAxNCBieXRlcyBvZiBkYXRhICIsZGV2LT5uYW1lKSA7IAorCQkJLyogCisJCQkgKiBXZSBzdGlsbCBoYXZlIHRvIHJlYWQgdGhlIGxvZyBldmVuIGlmIG1lc3NhZ2VfbGV2ZWwgPSAwIGFuZCB3ZSBkb24ndCB3YW50CisJCQkgKiB0byBzZWUgaXQKKwkJCSAqLworCQkJZm9yIChpPTA7aTwxNDtpKyspIHsgCisJCQkJd3JpdGVsKE1FTV9CWVRFX1JFQUQgfCAweGQwMDAwIHwgeGxfcHJpdi0+c3JiIHwgaSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQkJaWYoeGxfcHJpdi0+eGxfbWVzc2FnZV9sZXZlbCkgCisJCQkJCXByaW50aygiJTAyeDoiLHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpKSA7IAkKKwkJCX0gCisJCQlwcmludGsoIlxuIikgOyAKKwkJCWJyZWFrIDsgCisJCWNhc2UgU0VUX0ZVTkNfQUREUkVTUzoKKwkJCWlmKHhsX3ByaXYtPnhsX21lc3NhZ2VfbGV2ZWwpIAorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGdW5jdGlvbmFsIEFkZHJlc3MgU2V0IFxuIixkZXYtPm5hbWUpIDsgIAorCQkJYnJlYWsgOyAKKwkJY2FzZSBDTE9TRV9OSUM6CisJCQlpZih4bF9wcml2LT54bF9tZXNzYWdlX2xldmVsKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlZCBDTE9TRV9OSUMgaW50ZXJydXB0IGluIGludGVycnVwdCBoYW5kbGVyIFxuIixkZXYtPm5hbWUpIDsgCQorCQkJYnJlYWsgOyAKKwkJY2FzZSBTRVRfTVVMVElDQVNUX01PREU6CisJCQlpZih4bF9wcml2LT54bF9tZXNzYWdlX2xldmVsKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNdWx0aWNhc3Qgb3B0aW9ucyBzdWNjZXNzZnVsbHkgY2hhbmdlZFxuIixkZXYtPm5hbWUpIDsgCisJCQlicmVhayA7CisJCWNhc2UgU0VUX1JFQ0VJVkVfTU9ERToKKwkJCWlmKHhsX3ByaXYtPnhsX21lc3NhZ2VfbGV2ZWwpIHsgIAorCQkJCWlmICh4bF9wcml2LT54bF9jb3B5X2FsbF9vcHRpb25zID09IDB4MDAwNCkgCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbnRlcmluZyBwcm9taXNjdW91cyBtb2RlIFxuIiwgZGV2LT5uYW1lKSA7IAorCQkJCWVsc2UKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVudGVyaW5nIG5vcm1hbCByZWNlaXZlIG1vZGUgXG4iLGRldi0+bmFtZSkgOyAKKwkJCX0KKwkJCWJyZWFrIDsgCisgCisJCX0gLyogc3dpdGNoICovCisJCWJyZWFrIDsgCisJfSAvKiBzd2l0Y2ggKi8KKwlyZXR1cm4gOyAJCit9IAorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiB4bF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKSBkZXYtPnByaXYgOworCXJldHVybiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgJnhsX3ByaXYtPnhsX3N0YXRzOyAKK30KKworc3RhdGljIGludCB4bF9zZXRfbWFjX2FkZHJlc3MgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpIAoreworCXN0cnVjdCBzb2NrYWRkciAqc2FkZHIgPSBhZGRyIDsgCisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXYgOyAKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsgCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW5ub3Qgc2V0IG1hYy9sYWEgYWRkcmVzcyB3aGlsZSBjYXJkIGlzIG9wZW5cbiIsIGRldi0+bmFtZSkgOyAKKwkJcmV0dXJuIC1FSU8gOyAKKwl9CisKKwltZW1jcHkoeGxfcHJpdi0+eGxfbGFhLCBzYWRkci0+c2FfZGF0YSxkZXYtPmFkZHJfbGVuKSA7IAorCQorCWlmICh4bF9wcml2LT54bF9tZXNzYWdlX2xldmVsKSB7IAorIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1BQy9MQUEgU2V0IHRvICA9ICV4LiV4LiV4LiV4LiV4LiV4XG4iLGRldi0+bmFtZSwgeGxfcHJpdi0+eGxfbGFhWzBdLAorCQl4bF9wcml2LT54bF9sYWFbMV0sIHhsX3ByaXYtPnhsX2xhYVsyXSwKKwkJeGxfcHJpdi0+eGxfbGFhWzNdLCB4bF9wcml2LT54bF9sYWFbNF0sCisJCXhsX3ByaXYtPnhsX2xhYVs1XSk7CisJfSAKKworCXJldHVybiAwIDsgCit9CisKK3N0YXRpYyB2b2lkIHhsX2FyYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJdTggYXJiX2NtZCA7IAorCXUxNiBsYW5fc3RhdHVzLCBsYW5fc3RhdHVzX2RpZmYgOyAKKworCXdyaXRlbCggKCBNRU1fQllURV9SRUFEIHwgMHhEMDAwMCB8IHhsX3ByaXYtPmFyYiksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCWFyYl9jbWQgPSByZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQorCWlmIChhcmJfY21kID09IFJJTkdfU1RBVFVTX0NIQU5HRSkgeyAvKiBSaW5nLlN0YXR1cy5DaGFuZ2UgKi8KKwkJd3JpdGVsKCAoIChNRU1fV09SRF9SRUFEIHwgMHhEMDAwMCB8IHhsX3ByaXYtPmFyYikgKyA2KSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsKKwkJIAorCQlwcmludGsoS0VSTl9JTkZPICIlczogUmluZyBTdGF0dXMgQ2hhbmdlOiBOZXcgU3RhdHVzID0gJTA0eFxuIiwgZGV2LT5uYW1lLCBudG9ocyhyZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSApKSA7IAorCisJCWxhbl9zdGF0dXMgPSBudG9ocyhyZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSk7CisJCisJCS8qIEFja25vd2xlZGdlIGludGVycnVwdCwgdGhpcyB0ZWxscyBuaWMgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYXJiICovCisJCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgQVJCQ0FDSyB8IExBVENIX0FDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwkJCQorCQlsYW5fc3RhdHVzX2RpZmYgPSB4bF9wcml2LT54bF9sYW5fc3RhdHVzIF4gbGFuX3N0YXR1cyA7IAorCisJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiAoTFNDX0xXRiB8IExTQ19BUlcgfCBMU0NfRlBFIHwgTFNDX1JSKSApIHsgCisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0xXRikgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNob3J0IGNpcmN1aXQgZGV0ZWN0ZWQgb24gdGhlIGxvYmVcbiIsZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfQVJXKSAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQXV0byByZW1vdmFsIGVycm9yXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0ZQRSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRkRYIFByb3RvY29sIEVycm9yXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1JSKSAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRm9yY2UgcmVtb3ZlIE1BQyBmcmFtZSByZWNlaXZlZFxuIixkZXYtPm5hbWUpOworCQkKKwkJCS8qIEFkYXB0ZXIgaGFzIGJlZW4gY2xvc2VkIGJ5IHRoZSBoYXJkd2FyZSAqLworCisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQl4bF9mcmVlbWVtKGRldikgOyAKKwkJCWZyZWVfaXJxKGRldi0+aXJxLGRldik7CisJCQkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIGhhcyBiZWVuIGNsb3NlZCBcbiIsIGRldi0+bmFtZSkgOyAKKwkJfSAvKiBJZiBzZXJpb3VzIGVycm9yICovCisJCQorCQlpZiAoeGxfcHJpdi0+eGxfbWVzc2FnZV9sZXZlbCkgeyAKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfU0lHX0xPU1MpIAorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gcmVjZWl2ZSBzaWduYWwgZGV0ZWN0ZWQgXG4iLCBkZXYtPm5hbWUpIDsgCisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0hBUkRfRVJSKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQmVhY29uaW5nIFxuIixkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19TT0ZUX0VSUikKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgdHJhbnNtaXR0ZWQgU29mdCBFcnJvciBSZXBvcnQgTWFjIEZyYW1lIFxuIixkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19UUkFOX0JDTikgCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBXZSBhcmUgdHJhbm1pdHRpbmcgdGhlIGJlYWNvbiwgYWFhaFxuIixkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19TUykgCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTaW5nbGUgU3RhdGlvbiBvbiB0aGUgcmluZyBcbiIsIGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1JJTkdfUkVDKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmluZyByZWNvdmVyeSBvbmdvaW5nXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0ZEWF9NT0RFKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogT3BlcmF0aW5nIGluIEZEWCBtb2RlXG4iLGRldi0+bmFtZSk7CisJCX0gCQorCQkKKwkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19DTykgeyAKKwkJCQlpZiAoeGxfcHJpdi0+eGxfbWVzc2FnZV9sZXZlbCkgCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VudGVyIE92ZXJmbG93IFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkvKiBJc3N1ZSBSRUFELkxPRyBjb21tYW5kICovCisJCQkJeGxfc3JiX2NtZChkZXYsIFJFQURfTE9HKSA7IAkKKwkJfQorCisJCS8qIFRoZXJlIGlzIG5vIGNvbW1hbmQgaW4gdGhlIHRlY2ggZG9jcyB0byBpc3N1ZSB0aGUgcmVhZF9zcl9jb3VudGVycyAqLworCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NSX0NPKSB7IAorCQkJaWYgKHhsX3ByaXYtPnhsX21lc3NhZ2VfbGV2ZWwpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNvdXJjZSByb3V0aW5nIGNvdW50ZXJzIG92ZXJmbG93XG4iLCBkZXYtPm5hbWUpOworCQl9CisKKwkJeGxfcHJpdi0+eGxfbGFuX3N0YXR1cyA9IGxhbl9zdGF0dXMgOyAKKwkKKwl9ICAvKiBMYW4uY2hhbmdlLnN0YXR1cyAqLworCWVsc2UgaWYgKCBhcmJfY21kID09IFJFQ0VJVkVfREFUQSkgeyAvKiBSZWNlaXZlZC5EYXRhICovCisjaWYgWExfREVCVUcKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUmVjZWl2ZWQuRGF0YSBcbiIpIDsgCisjZW5kaWYgCQkKKwkJd3JpdGVsKCAoKE1FTV9XT1JEX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+YXJiKSArIDYpLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOworCQl4bF9wcml2LT5tYWNfYnVmZmVyID0gbnRvaHMocmVhZHcoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkpIDsKKwkJCisJCS8qIE5vdyB3ZSBhcmUgZ29pbmcgdG8gYmUgcmVhbGx5IGJhc2ljIGhlcmUgYW5kIG5vdCBkbyBhbnl0aGluZworCQkgKiB3aXRoIHRoZSBkYXRhIGF0IGFsbC4gVGhlIHRlY2ggZG9jcyBkbyBub3QgZ2l2ZSBtZSBlbm91Z2gKKwkJICogaW5mb3JtYXRpb24gdG8gY2FsY3VsYXRlIHRoZSBidWZmZXJzIHByb3Blcmx5IHNvIHdlJ3JlCisJCSAqIGp1c3QgZ29pbmcgdG8gdGVsbCB0aGUgbmljIHRoYXQgd2UndmUgZGVhbHQgd2l0aCB0aGUgZnJhbWUKKwkJICogYW55d2F5LgorCQkgKi8KKworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzIDsgCisJCS8qIEFja25vd2xlZGdlIGludGVycnVwdCwgdGhpcyB0ZWxscyBuaWMgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYXJiICovCisJCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgQVJCQ0FDSyB8IExBVENIX0FDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKworCQkvKiBJcyB0aGUgQVNCIGZyZWUgPyAqLyAJCisJCQkKKwkJeGxfcHJpdi0+YXNiX3F1ZXVlZCA9IDAgOyAJCQkKKwkJd3JpdGVsKCAoKE1FTV9CWVRFX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+YXNiKSArIDIpLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOworCQlpZiAocmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgIT0gMHhmZikgeyAKKwkJCXhsX3ByaXYtPmFzYl9xdWV1ZWQgPSAxIDsKKworCQkJeGxfd2FpdF9taXNyX2ZsYWdzKGRldikgOyAgCisKKwkJCXdyaXRlbChNRU1fQllURV9XUklURSB8IE1GX0FTQkZSLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCk7IAorCQkJd3JpdGViKDB4ZmYsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsKKwkJCXdyaXRlbChNTUlPX0JZVEVfV1JJVEUgfCBNSVNSX1NFVCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQl3cml0ZWIoTUlTUl9BU0JGUiwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJCXJldHVybiA7IAkKKwkJCS8qIERyb3Agb3V0IGFuZCB3YWl0IGZvciB0aGUgYm90dG9tIGhhbGYgdG8gYmUgcnVuICovCisJCX0KKwkKKwkJeGxfYXNiX2NtZChkZXYpIDsgCisJCQorCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlZCB1bmtub3duIGFyYiAoeGxfcHJpdikgY29tbWFuZDogJTAyeCBcbiIsZGV2LT5uYW1lLGFyYl9jbWQpIDsgCisJfQorCisJLyogQWNrbm93bGVkZ2UgdGhlIGFyYiBpbnRlcnJ1cHQgKi8KKworCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgQVJCQ0FDSyB8IExBVENIX0FDSyAsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisKKwlyZXR1cm4gOyAKK30KKworCisvKgorICoJVGhlcmUgaXMgb25seSBvbmUgYXNiIGNvbW1hbmQsIGJ1dCB3ZSBjYW4gZ2V0IGNhbGxlZCBmcm9tIGRpZmZlcmVudAorICoJcGxhY2VzLgorICovCisKK3N0YXRpYyB2b2lkIHhsX2FzYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKSBkZXYtPnByaXYgOyAKKwl1OCBfX2lvbWVtICogeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKworCWlmICh4bF9wcml2LT5hc2JfcXVldWVkID09IDEpIAorCQl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IExBVENIX0FDSyB8IEFTQkZBQ0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJCQorCXdyaXRlbChNRU1fQllURV9XUklURSB8IDB4ZDAwMDAgfCB4bF9wcml2LT5hc2IsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRlYigweDgxLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCisJd3JpdGVsKE1FTV9XT1JEX1dSSVRFIHwgMHhkMDAwMCB8IHhsX3ByaXYtPmFzYiB8IDYsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRldyhudG9ocyh4bF9wcml2LT5tYWNfYnVmZmVyKSwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKworCXhsX3dhaXRfbWlzcl9mbGFncyhkZXYpIDsgCQorCisJd3JpdGVsKE1FTV9CWVRFX1dSSVRFIHwgTUZfUkFTQiwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpOyAKKwl3cml0ZWIoMHhmZiwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOworCisJd3JpdGVsKE1NSU9fQllURV9XUklURSB8IE1JU1JfU0VULCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZWIoTUlTUl9SQVNCLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCisJeGxfcHJpdi0+YXNiX3F1ZXVlZCA9IDIgOyAKKworCXJldHVybiA7IAorfQorCisvKgorICogCVRoaXMgd2lsbCBvbmx5IGdldCBjYWxsZWQgaWYgdGhlcmUgd2FzIGFuIGVycm9yCisgKglmcm9tIHRoZSBhc2IgY21kLgorICovCitzdGF0aWMgdm9pZCB4bF9hc2JfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKikgZGV2LT5wcml2IDsgCisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJdTggcmV0X2NvZGUgOyAKKworCXdyaXRlbChNTUlPX0JZVEVfUkVBRCB8IDB4ZDAwMDAgfCB4bF9wcml2LT5hc2IgfCAyLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwlyZXRfY29kZSA9IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJc3dpdGNoIChyZXRfY29kZSkgeyAKKwkJY2FzZSAweDAxOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFTQiBDb21tYW5kLCB1bnJlY29nbml6ZWQgY29tbWFuZCBjb2RlIFxuIixkZXYtPm5hbWUpIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAweDI2OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFTQiBDb21tYW5kLCB1bmV4cGVjdGVkIHJlY2VpdmUgYnVmZmVyIFxuIiwgZGV2LT5uYW1lKSA7IAorCQkJYnJlYWsgOyAKKwkJY2FzZSAweDQwOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFTQiBDb21tYW5kLCBJbnZhbGlkIFN0YXRpb24gSUQgXG4iLCBkZXYtPm5hbWUpIDsgCisJCQlicmVhayA7ICAKKwl9CisJeGxfcHJpdi0+YXNiX3F1ZXVlZCA9IDAgOyAKKwl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IExBVENIX0FDSyB8IEFTQkZBQ0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsKKwlyZXR1cm4gOyAgCit9CisKKy8qIAkKKyAqCUlzc3VlIHNyYiBjb21tYW5kcyB0byB0aGUgbmljIAorICovCisKK3N0YXRpYyB2b2lkIHhsX3NyYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNyYl9jbWQpIAoreworCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopIGRldi0+cHJpdiA7IAorCXU4IF9faW9tZW0gKiB4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCisJc3dpdGNoIChzcmJfY21kKSB7IAorCWNhc2UgUkVBRF9MT0c6CisJCXdyaXRlbChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIoUkVBRF9MT0csIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCWJyZWFrOyAKKworCWNhc2UgQ0xPU0VfTklDOgorCQl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJd3JpdGViKENMT1NFX05JQywgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJYnJlYWsgOworCisJY2FzZSBTRVRfUkVDRUlWRV9NT0RFOgorCQl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJd3JpdGViKFNFVF9SRUNFSVZFX01PREUsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCXdyaXRlbChNRU1fV09SRF9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIgfCA0LCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJd3JpdGV3KHhsX3ByaXYtPnhsX2NvcHlfYWxsX29wdGlvbnMsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCWJyZWFrIDsKKworCWNhc2UgU0VUX0ZVTkNfQUREUkVTUzoKKwkJd3JpdGVsKE1FTV9CWVRFX1dSSVRFIHwgMHhEMDAwMCB8IHhsX3ByaXYtPnNyYiwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXdyaXRlYihTRVRfRlVOQ19BRERSRVNTLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiIHwgNiAsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIoeGxfcHJpdi0+eGxfZnVuY3Rpb25hbF9hZGRyWzBdLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiIHwgNyAsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIoeGxfcHJpdi0+eGxfZnVuY3Rpb25hbF9hZGRyWzFdLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiIHwgOCAsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIoeGxfcHJpdi0+eGxfZnVuY3Rpb25hbF9hZGRyWzJdLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiIHwgOSAsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIoeGxfcHJpdi0+eGxfZnVuY3Rpb25hbF9hZGRyWzNdLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7CisJCWJyZWFrIDsgIAorCX0gLyogc3dpdGNoICovCisKKworCXhsX3dhaXRfbWlzcl9mbGFncyhkZXYpICA7IAorCisJLyogV3JpdGUgMHhmZiB0byB0aGUgQ1NSQiBmbGFnICovCisJd3JpdGVsKE1FTV9CWVRFX1dSSVRFIHwgTUZfQ1NSQiAsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRlYigweEZGLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCS8qIFNldCBjc3JiIGJpdCBpbiBNSVNSIHJlZ2lzdGVyIHRvIHByb2Nlc3MgY29tbWFuZCAqLworCXdyaXRlbChNTUlPX0JZVEVfV1JJVEUgfCBNSVNSX1NFVCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKE1JU1JfQ1NSQiwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwl4bF9wcml2LT5zcmJfcXVldWVkID0gMSA7IAorCisJcmV0dXJuIDsgCit9CisKKy8qCisgKiBUaGlzIGlzIG5hc3R5LCB0byB1c2UgdGhlIE1JU1IgY29tbWFuZCB5b3UgaGF2ZSB0byB3YWl0IGZvciA2IG1lbW9yeSBsb2NhdGlvbnMKKyAqIHRvIGJlIHplcm8uIFRoaXMgaXMgdGhlIHdheSB0aGUgZHJpdmVyIGRvZXMgb24gb3RoZXIgT1MnZXMgc28gd2Ugc2hvdWxkIGJlIG9rIHdpdGggCisgKiB0aGUgZW1wdHkgbG9vcC4KKyAqLworCitzdGF0aWMgdm9pZCB4bF93YWl0X21pc3JfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKikgZGV2LT5wcml2IDsgCisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJCisJaW50IGkgIDsgCisJCisJd3JpdGVsKE1NSU9fQllURV9SRUFEIHwgTUlTUl9SVywgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJaWYgKHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICE9IDApIHsgIC8qIE1pc3Igbm90IGNsZWFyICovCisJCWZvciAoaT0wOyBpPDY7IGkrKykgeyAKKwkJCXdyaXRlbChNRU1fQllURV9SRUFEIHwgMHhERkZFMCB8IGksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQkJd2hpbGUgKHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICE9IDAgKSB7fSA7IC8qIEVtcHR5IExvb3AgKi8KKwkJfSAKKwl9CisKKwl3cml0ZWwoTU1JT19CWVRFX1dSSVRFIHwgTUlTUl9BTkQsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRlYigweDgwLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCisJcmV0dXJuIDsgCit9IAorCisvKgorICoJQ2hhbmdlIG10dSBzaXplLCB0aGlzIHNob3VsZCB3b3JrIHRoZSBzYW1lIGFzIG9seW1waWMKKyAqLworCitzdGF0aWMgaW50IHhsX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSkgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXUxNiBtYXhfbXR1IDsgCisKKwlpZiAoeGxfcHJpdi0+eGxfcmluZ19zcGVlZCA9PSA0KQorCQltYXhfbXR1ID0gNDUwMCA7IAorCWVsc2UKKwkJbWF4X210dSA9IDE4MDAwIDsgCisJCisJaWYgKG10dSA+IG1heF9tdHUpCisJCXJldHVybiAtRUlOVkFMIDsgCisJaWYgKG10dSA8IDEwMCkgCisJCXJldHVybiAtRUlOVkFMIDsgCisKKwlkZXYtPm10dSA9IG10dSA7IAorCXhsX3ByaXYtPnBrdF9idWZfc3ogPSBtdHUgKyBUUl9ITEVOIDsgCisKKwlyZXR1cm4gMCA7IAorfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgeGxfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdj0oc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpb3VubWFwKHhsX3ByaXYtPnhsX21taW8pIDsgCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KSA7IAorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LE5VTEwpIDsgCisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gOyAKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHhsXzNjMzU5X2RyaXZlciA9IHsKKwkubmFtZQkJPSAiM2MzNTkiLAorCS5pZF90YWJsZQk9IHhsX3BjaV90YmwsCisJLnByb2JlCQk9IHhsX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoeGxfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCB4bF9wY2lfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0ICgmeGxfM2MzNTlfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgeGxfcGNpX2NsZWFudXAgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmeGxfM2MzNTlfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoeGxfcGNpX2luaXQpOworbW9kdWxlX2V4aXQoeGxfcGNpX2NsZWFudXApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIikgOyAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5oIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjODYwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5oCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICogIDNjMzU5LmggKGMpIDIwMDAgTWlrZSBQaGlsbGlwcyAobWlrZXBAbGludXh0ci5uZXQpIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgTGludXggZHJpdmVyIGZvciAzQ29tIDNDMzU5IFRva2VuIExpbmsgUENJIFhMIGNhcmRzLgorICoKKyAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIAorICogIGFueSBsYXRlciB2ZXJpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICovCisKKy8qIE1lbW9yeSBBY2Nlc3MgQ29tbWFuZHMgKi8KKyNkZWZpbmUgSU9fQllURV9SRUFEIDB4MjggPDwgMjQKKyNkZWZpbmUgSU9fQllURV9XUklURSAweDE4IDw8IDI0IAorI2RlZmluZSBJT19XT1JEX1JFQUQgMHgyMCA8PCAyNAorI2RlZmluZSBJT19XT1JEX1dSSVRFIDB4MTAgPDwgMjQKKyNkZWZpbmUgTU1JT19CWVRFX1JFQUQgMHg4OCA8PCAyNAorI2RlZmluZSBNTUlPX0JZVEVfV1JJVEUgMHg0OCA8PCAyNAorI2RlZmluZSBNTUlPX1dPUkRfUkVBRCAweDgwIDw8IDI0CisjZGVmaW5lIE1NSU9fV09SRF9XUklURSAweDQwIDw8IDI0CisjZGVmaW5lIE1FTV9CWVRFX1JFQUQgMHg4QyA8PCAyNAorI2RlZmluZSBNRU1fQllURV9XUklURSAweDRDIDw8IDI0CisjZGVmaW5lIE1FTV9XT1JEX1JFQUQgMHg4NCA8PCAyNAorI2RlZmluZSBNRU1fV09SRF9XUklURSAweDQ0IDw8IDI0CisKKyNkZWZpbmUgUE1CQVIgMHgxQzgwCisjZGVmaW5lIFBNQl9DUEhPTEQgKDE8PDEwKQorCisjZGVmaW5lIENQQVRURU5USU9OIDB4MTgwRAorI2RlZmluZSBDUEFfUE1CQVJWSVMgKDE8PDcpCisjZGVmaW5lIENQQV9NRU1XUkVOICgxPDw2KQorCisjZGVmaW5lIFNXSVRDSFNFVFRJTkdTIDB4MUM4OAorI2RlZmluZSBFRUNPTlRST0wgMHgxQzhBCisjZGVmaW5lIEVFREFUQSAweDFDOEMKKyNkZWZpbmUgRUVSRUFEIDB4MDA4MCAKKyNkZWZpbmUgRUVXUklURSAweDAwNDAKKyNkZWZpbmUgRUVFUkFTRSAweDAwNjAKKyNkZWZpbmUgRUVfRU5BQkxFX1dSSVRFIDB4MDAzMAorI2RlZmluZSBFRUJVU1kgKDE8PDE1KQorCisjZGVmaW5lIFdSQlIgMHhDREUwMgorI2RlZmluZSBXV09SIDB4Q0RFMDQKKyNkZWZpbmUgV1dDUiAweENERTA2CisjZGVmaW5lIE1BQ1NUQVRVUyAweENERTA4IAorI2RlZmluZSBNSVNSX1JXIDB4Q0RFMEIKKyNkZWZpbmUgTUlTUl9BTkQgMHhDREUyQgorI2RlZmluZSBNSVNSX1NFVCAweENERTRCCisjZGVmaW5lIFJYQlVGQVJFQSAweENERTEwCisjZGVmaW5lIFJYRUFSTFlUSFJFU0ggMHhDREUxMgorI2RlZmluZSBUWFNUQVJUVEhSRVNIIDB4NTgKKyNkZWZpbmUgRE5QUklSRVFUSFJFU0ggMHgyQworCisjZGVmaW5lIE1JU1JfQ1NSQiAoMTw8NSkKKyNkZWZpbmUgTUlTUl9SQVNCICgxPDw0KQorI2RlZmluZSBNSVNSX1NSQkZSICgxPDwzKQorI2RlZmluZSBNSVNSX0FTQkZSICgxPDwyKQorI2RlZmluZSBNSVNSX0FSQkYgKDE8PDEpIAorCisvKiBNSVNSIEZsYWdzIG1lbW9yeSBsb2NhdGlvbnMgKi8KKyNkZWZpbmUgTUZfU1NCRiAweERGRkUwIAorI2RlZmluZSBNRl9BUkJGIDB4REZGRTEKKyNkZWZpbmUgTUZfQVNCRlIgMHhERkZFMgorI2RlZmluZSBNRl9TUkJGUiAweERGRkUzCisjZGVmaW5lIE1GX1JBU0IgMHhERkZFNAorI2RlZmluZSBNRl9DU1JCIDB4REZGRTUKKworI2RlZmluZSBNTUlPX01BQ0RBVEEgMHgxMCAKKyNkZWZpbmUgTU1JT19NQUNfQUNDRVNTX0NNRCAweDE0CisjZGVmaW5lIE1NSU9fVElNRVIgMHgxQQorI2RlZmluZSBNTUlPX0RNQV9DVFJMIDB4MjAKKyNkZWZpbmUgTU1JT19ETkxJU1RQVFIgMHgyNAorI2RlZmluZSBNTUlPX0hBU0hGSUxURVIgMHgyOAorI2RlZmluZSBNTUlPX0NPTkZJRyAweDI5CisjZGVmaW5lIE1NSU9fRE5QUklSRVFUSFJFU0ggMHgyQworI2RlZmluZSBNTUlPX0ROUE9MTCAweDJECisjZGVmaW5lIE1NSU9fVVBQS1RTVEFUVVMgMHgzMAorI2RlZmluZSBNTUlPX0ZSRUVUSU1FUiAweDM0CisjZGVmaW5lIE1NSU9fQ09VTlRET1dOIDB4MzYKKyNkZWZpbmUgTU1JT19VUExJU1RQVFIgMHgzOAorI2RlZmluZSBNTUlPX1VQUE9MTCAweDNDCisjZGVmaW5lIE1NSU9fVVBCVVJTVFRIUkVTSCAweDQwCisjZGVmaW5lIE1NSU9fRE5CVVJTVFRIUkVTSCAweDQxCisjZGVmaW5lIE1NSU9fSU5UU1RBVFVTX0FVVE8gMHg1NgorI2RlZmluZSBNTUlPX1RYU1RBUlRUSFJFU0ggMHg1OAorI2RlZmluZSBNTUlPX0lOVEVSUlVQVEVOQUJMRSAweDVBCisjZGVmaW5lIE1NSU9fSU5ESUNBVElPTkVOQUJMRSAweDVDCisjZGVmaW5lIE1NSU9fQ09NTUFORCAweDVFICAvKiBUaGVzZSB0d28gYXJlIG1lYW50IHRvIGJlIHRoZSBzYW1lICovCisjZGVmaW5lIE1NSU9fSU5UU1RBVFVTIDB4NUUgLyogTWFrZXMgdGhlIGNvZGUgbW9yZSByZWFkYWJsZSB0aGlzIHdheSAqLworI2RlZmluZSBJTlRTVEFUX0NNRF9JTl9QUk9HUkVTUyAoMTw8MTIpIAorI2RlZmluZSBJTlRTVEFUX1NSQiAoMTw8MTQpCisjZGVmaW5lIElOVFNUQVRfSU5UTEFUQ0ggKDE8PDApCisKKy8qIEluZGljYXRpb24gLyBJbnRlcnJ1cHQgTWFzayAKKyAqIEFubm95aW5nbHkgdGhlIGJpdHMgdG8gYmUgc2V0IGluIHRoZSBpbmRpY2F0aW9uIGFuZCBpbnRlcnJ1cHQgZW5hYmxlCisgKiBkbyBub3QgbWF0Y2ggd2l0aCB0aGUgYWN0dWFsIGJpdHMgcmVjZWl2ZWQgaW4gdGhlIGludGVycnVwdCwgYWx0aG91Z2gKKyAqIHRoZXkgYXJlIGluIHRoZSBzYW1lIG9yZGVyLiAKKyAqIFRoZSBtYXBwaW5nIGZvciB0aGUgaW5kaWNhdGlvbiAvIGludGVycnVwdCBhcmU6CisgKiBCaXQJSW5kaWNhdGlvbiAvIEludGVycnVwdAorICogICAwCUhvc3RFcnJvcgorICogICAxCXR4Y29tcGxldGUKKyAqICAgMgl1cGRuZWVkZWQKKyAqICAgMwlyeGNvbXBsZXRlCisgKiAgIDQJaW50cmVxdWVzdGVkCisgKiAgIDUJbWFjZXJyb3IKKyAqICAgNiAgZG5jb21wbGV0ZQorICogICA3CXVwY29tcGxldGUKKyAqICAgOAl0eHVuZGVycnVuCisgKiAgIDkJYXNiZgorICogIDEwCXNyYnIKKyAqICAxMQlhcmJjCisgKgorICogIFRoZSBvbmx5IG9uZXMgd2UgZG9uJ3Qgd2FudCB0byByZWNlaXZlIGFyZSB0eGNvbXBsZXRlIGFuZCByeGNvbXBsZXRlCisgKiAgd2UgdXNlIGRuY29tcGxldGUgYW5kIHVwY29tcGxldGUgaW5zdGVhZC4KKyAqLworCisjZGVmaW5lIElOVF9NQVNLIDB4RkY1CisKKy8qIE5vdGUgdGhlIHN1YnRsZSBkaWZmZXJlbmNlIGhlcmUsIElORCBhbmQgSU5UICovCisKKyNkZWZpbmUgU0VUSU5ERU5BQkxFICg4PDwxMikKKyNkZWZpbmUgU0VUSU5URU5BQkxFICg3PDwxMikKKyNkZWZpbmUgU1JCQklUICgxPDwxMCkKKyNkZWZpbmUgQVNCQklUICgxPDw5KQorI2RlZmluZSBBUkJCSVQgKDE8PDExKQorCisjZGVmaW5lIFNSQiAweERGRTkwCisjZGVmaW5lIEFTQiAweERGRUQwCisjZGVmaW5lIEFSQiAweEQwMDAwCisjZGVmaW5lIFNDUkFUQ0ggMHhERkVGMAorCisjZGVmaW5lIElOVF9SRVFVRVNUIDB4NjAwMCAvKiAoNiA8PCAxMikgKi8KKyNkZWZpbmUgQUNLX0lOVEVSUlVQVCAweDY4MDAgLyogKDEzIDw8MTEpICovCisjZGVmaW5lIEdMT0JBTF9SRVNFVCAweDAwIAorI2RlZmluZSBETkRJU0FCTEUgMHg1MDAwIAorI2RlZmluZSBETkVOQUJMRSAweDQ4MDAgCisjZGVmaW5lIEROU1RBTEwgMHgzMDAyCisjZGVmaW5lIEROUkVTRVQgMHg1ODAwCisjZGVmaW5lIEROVU5TVEFMTCAweDMwMDMKKyNkZWZpbmUgVVBSRVNFVCAweDI4MDAKKyNkZWZpbmUgVVBTVEFMTCAweDMwMDAKKyNkZWZpbmUgVVBVTlNUQUxMIDB4MzAwMQorI2RlZmluZSBTRVRDT05GSUcgMHg0MDAwCisjZGVmaW5lIFNFVFRYU1RBUlRUSFJFU0ggMHg5ODAwIAorCisvKiBSZWNlaXZlZCBJbnRlcnJ1cHRzICovCisjZGVmaW5lIEFTQkZJTlQgKDE8PDEzKQorI2RlZmluZSBTUkJSSU5UICgxPDwxNCkKKyNkZWZpbmUgQVJCQ0lOVCAoMTw8MTUpCisjZGVmaW5lIFRYVU5ERVJSVU4gKDE8PDExKQorCisjZGVmaW5lIFVQQ09NUElOVCAoMTw8MTApCisjZGVmaW5lIEROQ09NUElOVCAoMTw8OSkKKyNkZWZpbmUgSEFSREVSUklOVCAoMTw8NykKKyNkZWZpbmUgUlhDT01QTEVURSAoMTw8NCkKKyNkZWZpbmUgVFhDT01QSU5UICgxPDwyKQorI2RlZmluZSBIT1NURVJSSU5UICgxPDwxKQorCisvKiBSZWNlaXZlIGRlc2NyaXB0b3IgYml0cyAqLworI2RlZmluZSBSWE9WRVJSVU4gKDE8PDE5KQorI2RlZmluZSBSWEZDICgxPDwyMSkKKyNkZWZpbmUgUlhBUiAoMTw8MjIpCisjZGVmaW5lIFJYVVBEQ09NUExFVEUgKDE8PDIzKQorI2RlZmluZSBSWFVQREZVTEwgKDE8PDI0KQorI2RlZmluZSBSWFVQTEFTVEZSQUcgKDE8PDMxKQorCisvKiBUcmFuc21pdCBkZXNjcmlwdG9yIGJpdHMgKi8KKyNkZWZpbmUgVFhETkNPTVBMRVRFICgxPDwxNikKKyNkZWZpbmUgVFhUWElORElDQVRFICgxPDwyNykKKyNkZWZpbmUgVFhEUERFTVBUWSAoMTw8MjkpCisjZGVmaW5lIFRYRE5JTkRJQ0FURSAoMTw8MzEpCisjZGVmaW5lIFRYRE5GUkFHTEFTVCAoMTw8MzEpCisKKy8qIEludGVycnVwdHMgdG8gQWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUgTEFUQ0hfQUNLIDEgCisjZGVmaW5lIFRYQ09NUEFDSyAoMTw8MSkKKyNkZWZpbmUgSU5UUkVRQUNLICgxPDwyKQorI2RlZmluZSBETkNPTVBBQ0sgKDE8PDMpCisjZGVmaW5lIFVQQ09NUEFDSyAoMTw8NCkKKyNkZWZpbmUgQVNCRkFDSyAoMTw8NSkKKyNkZWZpbmUgU1JCUkFDSyAoMTw8NikKKyNkZWZpbmUgQVJCQ0FDSyAoMTw8NykKKworI2RlZmluZSBYTF9JT19TUEFDRSAxMjgKKyNkZWZpbmUgU1JCX0NPTU1BTkRfU0laRSA1MAorCisvKiBBZGFwdGVyIENvbW1hbmRzICovCisjZGVmaW5lIFJFUVVFU1RfSU5UIDB4MDAKKyNkZWZpbmUgTU9ESUZZX09QRU5fUEFSTVMgMHgwMQorI2RlZmluZSBSRVNUT1JFX09QRU5fUEFSTVMgMHgwMgorI2RlZmluZSBPUEVOX05JQyAweDAzCisjZGVmaW5lIENMT1NFX05JQyAweDA0CisjZGVmaW5lIFNFVF9TTEVFUF9NT0RFIDB4MDUKKyNkZWZpbmUgU0VUX0dST1VQX0FERFJFU1MgMHgwNgorI2RlZmluZSBTRVRfRlVOQ19BRERSRVNTIDB4MDcKKyNkZWZpbmUgUkVBRF9MT0cgMHgwOAorI2RlZmluZSBTRVRfTVVMVElDQVNUX01PREUgMHgwQworI2RlZmluZSBDSEFOR0VfV0FLRVVQX1BBVFRFUk4gMHgwRAorI2RlZmluZSBHRVRfU1RBVElTVElDUyAweDEzCisjZGVmaW5lIFNFVF9SRUNFSVZFX01PREUgMHgxRgorCisvKiBBUkIgQ29tbWFuZHMgKi8KKyNkZWZpbmUgUkVDRUlWRV9EQVRBIDB4ODEKKyNkZWZpbmUgUklOR19TVEFUVVNfQ0hBTkdFIDB4ODQKKworLyogQVNCIENvbW1hbmRzICovCisjZGVmaW5lIEFTQl9SRUNFSVZFX0RBVEUgMHg4MSAKKworLyogRGVmaW5lcyBmb3IgTEFOIFNUQVRVUyBDSEFOR0UgcmVwb3J0cyAqLworI2RlZmluZSBMU0NfU0lHX0xPU1MgMHg4MDAwCisjZGVmaW5lIExTQ19IQVJEX0VSUiAweDQwMDAKKyNkZWZpbmUgTFNDX1NPRlRfRVJSIDB4MjAwMAorI2RlZmluZSBMU0NfVFJBTl9CQ04gMHgxMDAwCisjZGVmaW5lIExTQ19MV0YgICAgICAweDA4MDAKKyNkZWZpbmUgTFNDX0FSVyAgICAgIDB4MDQwMAorI2RlZmluZSBMU0NfRlBFICAgICAgMHgwMjAwCisjZGVmaW5lIExTQ19SUiAgICAgICAweDAxMDAKKyNkZWZpbmUgTFNDX0NPICAgICAgIDB4MDA4MAorI2RlZmluZSBMU0NfU1MgICAgICAgMHgwMDQwCisjZGVmaW5lIExTQ19SSU5HX1JFQyAweDAwMjAKKyNkZWZpbmUgTFNDX1NSX0NPICAgIDB4MDAxMAorI2RlZmluZSBMU0NfRkRYX01PREUgMHgwMDA0CisKKyNkZWZpbmUgWExfTUFYX0FEQVBURVJTIDggLyogMHgwOCBfX01PRFVMRV9TVFJJTkcgY2FuJ3QgaGFuZCAweG5uICovCisKKy8qIDNjMzU5IGRlZmF1bHRzIGZvciBidWZmZXJzICovCisgCisjZGVmaW5lIFhMX1JYX1JJTkdfU0laRSAxNiAvKiBtdXN0IGJlIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBYTF9UWF9SSU5HX1NJWkUgMTYgLyogbXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KKworI2RlZmluZSBQS1RfQlVGX1NaIDQwOTYgLyogRGVmYXVsdCBwYWNrZXQgc2l6ZSAqLworCisvKiAzYzM1OSBkYXRhIHN0cnVjdHVyZXMgKi8KKworc3RydWN0IHhsX3R4X2Rlc2MgeworCXUzMiBkbm5leHRwdHIgOyAKKwl1MzIgZnJhbWVzdGFydGhlYWRlciA7IAorCXUzMiBidWZmZXIgOworCXUzMiBidWZmZXJfbGVuZ3RoIDsKK307CisKK3N0cnVjdCB4bF9yeF9kZXNjIHsKKwl1MzIgdXBuZXh0cHRyIDsgCisJdTMyIGZyYW1lc3RhdHVzIDsgCisJdTMyIHVwZnJhZ2FkZHIgOyAKKwl1MzIgdXBmcmFnbGVuIDsgCit9OworCitzdHJ1Y3QgeGxfcHJpdmF0ZSB7CisJCisKKwkvKiBUaGVzZSB0d28gc3RydWN0dXJlcyBtdXN0IGJlIGFsaWduZWQgb24gOCBieXRlIGJvdW5kYXJpZXMgKi8KKworCS8qIHN0cnVjdCB4bF9yeF9kZXNjIHhsX3J4X3JpbmdbWExfUlhfUklOR19TSVpFXTsgKi8KKwkvKiBzdHJ1Y3QgeGxfdHhfZGVzYyB4bF90eF9yaW5nW1hMX1RYX1JJTkdfU0laRV07ICovCisJc3RydWN0IHhsX3J4X2Rlc2MgKnhsX3J4X3JpbmcgOyAKKwlzdHJ1Y3QgeGxfdHhfZGVzYyAqeGxfdHhfcmluZyA7IAorCXN0cnVjdCBza19idWZmICp0eF9yaW5nX3NrYltYTF9UWF9SSU5HX1NJWkVdLCAqcnhfcmluZ19za2JbWExfUlhfUklOR19TSVpFXTsJCisJaW50IHR4X3JpbmdfaGVhZCwgdHhfcmluZ190YWlsIDsgIAorCWludCByeF9yaW5nX3RhaWwsIHJ4X3Jpbmdfbm8gOyAKKwlpbnQgZnJlZV9yaW5nX2VudHJpZXMgOyAKKworCXUxNiBzcmI7CisJdTE2IGFyYjsKKwl1MTYgYXNiOworCisJdTggX19pb21lbSAqeGxfbW1pbzsKKwljaGFyICp4bF9jYXJkX25hbWU7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgOyAKKwkKKwlzcGlubG9ja190IHhsX2xvY2sgOyAKKworCXZvbGF0aWxlIGludCBzcmJfcXVldWVkOyAgICAKKwlzdHJ1Y3Qgd2FpdF9xdWV1ZSAqc3JiX3dhaXQ7CisJdm9sYXRpbGUgaW50IGFzYl9xdWV1ZWQ7ICAgCisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyB4bF9zdGF0cyA7CisKKwl1MTYgbWFjX2J1ZmZlciA7IAkKKwl1MTYgeGxfbGFuX3N0YXR1cyA7CisJdTggeGxfcmluZ19zcGVlZCA7CisJdTE2IHBrdF9idWZfc3ogOyAKKwl1OCB4bF9tZXNzYWdlX2xldmVsOyAKKwl1MTYgeGxfY29weV9hbGxfb3B0aW9ucyA7ICAKKwl1bnNpZ25lZCBjaGFyIHhsX2Z1bmN0aW9uYWxfYWRkcls0XSA7IAorCXUxNiB4bF9hZGRyX3RhYmxlX2FkZHIsIHhsX3Bhcm1zX2FkZHIgOyAKKwl1OCB4bF9sYWFbNl0gOyAKKwl1MzIgcnhfcmluZ19kbWFfYWRkciA7IAorCXUzMiB0eF9yaW5nX2RtYV9hZGRyIDsgCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvM2MzNTlfbWljcm9jb2RlLmggYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvM2MzNTlfbWljcm9jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzNTRhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OV9taWNyb2NvZGUuaApAQCAtMCwwICsxLDE1ODEgQEAKKworLyoKKyAqIFRoZSBmaXJtd2FyZSB0aGlzIGRyaXZlciBkb3dubG9hZHMgaW50byB0aGUgdG9rZW5yaW5nIGNhcmQgaXMgYQorICogc2VwYXJhdGUgcHJvZ3JhbSBhbmQgaXMgbm90IEdQTCdkIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGUgTGludXgKKyAqIHNpZGUgZHJpdmVyIGFuZCB0aGUgcm91dGluZSB0aGF0IGxvYWRzIHRoaXMgZGF0YSBpbnRvIHRoZSBjYXJkIGFyZS4KKyAqCisgKiBUaGlzIGZpcm13YXJlIGlzIGxpY2Vuc2VkIHRvIHlvdSBzdHJpY3RseSBmb3IgdXNlIGluIGNvbmp1bmN0aW9uCisgKiB3aXRoIHRoZSB1c2Ugb2YgM0NvbSAzQzM1OSBUb2tlblJpbmcgYWRhcHRlcnMuIFRoZXJlIGlzIG5vCisgKiB3YXJhbnR5IGV4cHJlc3NlZCBvciBpbXBsaWVkIGFib3V0IGl0cyBmaXRuZXNzIGZvciBhbnkgcHVycG9zZS4KKyAqLworCisvKiAzYzM1OV9taWNyb2NvZGUubWFjOiAzQ29tIDNDMzU5IFRva2VucmluZyBtaWNyb2NvZGUuCisgKgorICogTm90ZXM6CisgKiAgLSBMb2FkZWQgZnJvbSB4bF9pbml0IHVwb24gYWRhcHRlciBpbml0aWFsaXphdGlvbi4KKyAqCisgKiBBdmFpbGFibGUgZnJvbSAzQ29tIGFzIHBhcnQgb2YgdGhlaXIgc3RhbmRhcmQgM0MzNTkgZHJpdmVyLiAKKyAqCisgKiBtY19zaXplICptdXN0KiBtdXN0IG1hdGNoIHRoZSBtaWNyb2NvZGUgYmVpbmcgdXNlZCwgZWFjaCB2ZXJzaW9uIGlzIGEgCisgKiBkaWZmZXJlbnQgbGVuZ3RoLgorICovCisKK3N0YXRpYyBpbnQgbWNfc2l6ZSA9IDI0ODgwIDsgCisKK3U4IG1pY3JvY29kZVtdID0geyAKKyAweGZlLDB4M2EsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDMzLDB4MmYsMHgzMCwweDMyLDB4MmYsMHgzOSwweDM5LDB4MjAsMHgzMQorLDB4MzcsMHgzYSwweDMxLDB4MzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwweDM2LDB4MzcsMHgzOCwweDM5LDB4NDEsMHg0MiwweDQzLDB4NDQsMHg0NSwweDQ2CissMHgwMCwweDAwLDB4MDcsMHhmZiwweDAyLDB4MDAsMHhmZSwweDlmLDB4MDYsMHgwMCwweDAwLDB4N2MsMHg0OCwweDAwLDB4MDAsMHg3MAorLDB4ODIsMHgwMCwweGZmLDB4ZmYsMHg4NiwweDAwLDB4ZmYsMHhmZiwweDg4LDB4MDAsMHhmZiwweGZmLDB4OWEsMHgwMCwweGZmLDB4ZmYKKywweGZmLDB4ZmYsMHgxMSwweDAwLDB4YzAsMHgwMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MTEsMHgyMiwweDMzLDB4NDQsMHg1NSwweDY2CissMHgzMywweDQzLDB4NGYsMHg0ZCwweDIwLDB4NDIsMHg0MSwweDQyLDB4NDUsMHgxMSwweDQwLDB4YzAsMHgwMCwweGZmLDB4ZmYsMHhmZgorLDB4ZmYsMHgxMSwweDIyLDB4MzMsMHg0NCwweDU1LDB4NjYsMHg1MywweDc0LDB4NjEsMHg3MiwweDc0LDB4MjAsMHg2ZiwweDY2LDB4MjAKKywweDRjLDB4NGMsMHg0MywweDIwLDB4NjYsMHg3MiwweDYxLDB4NmQsMHg2NSwweDJlLDB4MjAsMHgyMCwweDU0LDB4NmYsMHg3NCwweDYxCissMHg2YywweDIwLDB4NjQsMHg2MSwweDc0LDB4NjEsMHgyMCwweDczLDB4NjksMHg3YSwweDY1LDB4MjAsMHg2OSwweDczLDB4MjAsMHg3OAorLDB4NzgsMHg3OCwweDIwLDB4MjAsMHgyMCwweDQyLDB4NDEsMHg0MiwweDQ1LDB4ZTgsMHhkMiwweDAxLDB4ODMsMHgzZSwweGY3LDB4MzQKKywweDAwLDB4NzUsMHgyMSwweGU4LDB4NDEsMHgwMCwweDgzLDB4M2UsMHhmNywweDM0LDB4MDAsMHg3NSwweDE3LDB4ZTgsMHg4MiwweDAwCissMHg4MywweDNlLDB4ZjcsMHgzNCwweDAwLDB4NzUsMHgwZCwweGU4LDB4YmYsMHgwMCwweDgzLDB4M2UsMHhmNywweDM0LDB4MDAsMHg3NQorLDB4MDMsMHhlOCwweDQxLDB4MDIsMHhjMywweDFlLDB4YjgsMHgwMCwweGYwLDB4OGUsMHhkOCwweDMzLDB4ZjYsMHhiOSwweDAwLDB4ODAKKywweDMzLDB4ZGIsMHhhZCwweDAzLDB4ZDgsMHhlMiwweGZiLDB4MWYsMHhiOCwweDAwLDB4MDAsMHg4MywweGZiLDB4MDAsMHg3NCwweDAzCissMHhiOCwweDIyLDB4MDAsMHhhMywweGY3LDB4MzQsMHhjMywweGZhLDB4YmEsMHg1NiwweDAwLDB4YjAsMHhmZiwweGVlLDB4MzMsMHhjMAorLDB4OGUsMHhjMCwweDMzLDB4ZjYsMHhiOSwweGZmLDB4N2YsMHg4MywweDNlLDB4ZmYsMHgzNCwweDAwLDB4NzQsMHgwOCwweDhkLDB4M2UKKywweDMwLDB4NjEsMHhkMSwweGVmLDB4MmIsMHhjZiwweDI2LDB4OGIsMHgxYywweDI2LDB4YzcsMHgwNCwweGZmLDB4ZmYsMHgyNiwweDgzCissMHgzYywweGZmLDB4NzUsMHgxNywweDI2LDB4YzcsMHgwNCwweDAwLDB4MDAsMHgyNiwweDgzLDB4M2MsMHgwMCwweDc1LDB4MGMsMHgyNgorLDB4ODksMHgxYywweDQ2LDB4NDYsMHhlMiwweGUwLDB4YjgsMHgwMCwweDAwLDB4ZWIsMHgwMywweGI4LDB4MjQsMHgwMCwweGEzLDB4ZjcKKywweDM0LDB4YzMsMHhmYSwweGI0LDB4ZDcsMHg5ZSwweDczLDB4M2EsMHg3NSwweDM4LDB4NzksMHgzNiwweDdiLDB4MzQsMHg5ZiwweGIxCissMHgwNSwweGQyLDB4ZWMsMHg3MywweDJkLDB4YjAsMHg0MCwweGQwLDB4ZTAsMHg3MSwweDI3LDB4NzksMHgyNSwweGQwLDB4ZTAsMHg3MworLDB4MjEsMHg3YiwweDFmLDB4MzIsMHhjMCwweDc1LDB4MWIsMHgzMiwweGU0LDB4OWUsMHg3MiwweDE2LDB4NzQsMHgxNCwweDc4LDB4MTIKKywweDdhLDB4MTAsMHg5ZiwweGQyLDB4ZWMsMHg3MiwweDBiLDB4ZDAsMHhlNCwweDcwLDB4MDcsMHg3NSwweDA1LDB4YjgsMHgwMCwweDAwCissMHhlYiwweDAzLDB4YjgsMHgyNiwweDAwLDB4YTMsMHhmNywweDM0LDB4YzMsMHhmYSwweGJhLDB4NWEsMHgwMCwweDMzLDB4YzAsMHhlZgorLDB4ZWYsMHhlZiwweGVmLDB4YjAsMHgwMCwweGU2LDB4NTYsMHhiMCwweDAwLDB4ZTYsMHg1NCwweGJhLDB4NTIsMHgwMCwweGI4LDB4MDEKKywweDAxLDB4ZWYsMHhlOCwweGNhLDB4MDAsMHgzYywweDAxLDB4NzUsMHg3ZiwweGU4LDB4ODMsMHgwMCwweGJhLDB4NTIsMHgwMCwweGI4CissMHgwMiwweDAyLDB4ZWYsMHhlOCwweGI5LDB4MDAsMHgzYywweDAyLDB4NzUsMHg2ZSwweGU4LDB4N2EsMHgwMCwweGJhLDB4NTIsMHgwMAorLDB4YjgsMHgwNCwweDA0LDB4ZWYsMHhlOCwweGE4LDB4MDAsMHgzYywweDA0LDB4NzUsMHg1ZCwweGU4LDB4NzEsMHgwMCwweGJhLDB4NTIKKywweDAwLDB4YjgsMHgwOCwweDA4LDB4ZWYsMHhlOCwweDk3LDB4MDAsMHgzYywweDA4LDB4NzUsMHg0YywweGU4LDB4NjgsMHgwMCwweGJhCissMHg1MiwweDAwLDB4YjgsMHgxMCwweDEwLDB4ZWYsMHhlOCwweDg2LDB4MDAsMHgzYywweDEwLDB4NzUsMHgzYiwweGU4LDB4NWYsMHgwMAorLDB4YmEsMHg1MiwweDAwLDB4YjgsMHgyMCwweDIwLDB4ZWYsMHhlOCwweDc1LDB4MDAsMHgzYywweDIwLDB4NzUsMHgyYSwweGU4LDB4NTYKKywweDAwLDB4YmEsMHg1MiwweDAwLDB4YjgsMHg0MCwweDQwLDB4ZWYsMHhlOCwweDY0LDB4MDAsMHgzYywweDQwLDB4NzUsMHgxOSwweGU4CissMHg0ZCwweDAwLDB4YmEsMHg1MiwweDAwLDB4YjgsMHg4MCwweDgwLDB4ZWYsMHhlOCwweDUzLDB4MDAsMHgzYywweDgwLDB4NzUsMHgwOAorLDB4ZTgsMHg0NCwweDAwLDB4YjgsMHgwMCwweDAwLDB4ZWIsMHgwMywweGI4LDB4MjgsMHgwMCwweGEzLDB4ZjcsMHgzNCwweGMzLDB4YmEKKywweDVhLDB4MDAsMHhiOCwweDAwLDB4ODAsMHhlZiwweGMzLDB4YmEsMHg1YSwweDAwLDB4YjgsMHgwMSwweDgwLDB4ZWYsMHhjMywweGJhCissMHg1YSwweDAwLDB4YjgsMHgwMiwweDgwLDB4ZWYsMHhjMywweGJhLDB4NWEsMHgwMCwweGI4LDB4MDMsMHg4MCwweGVmLDB4YzMsMHhiYQorLDB4NWEsMHgwMCwweGI4LDB4MDQsMHg4MCwweGVmLDB4YzMsMHhiYSwweDVhLDB4MDAsMHhiOCwweDA1LDB4ODAsMHhlZiwweGMzLDB4YmEKKywweDVhLDB4MDAsMHhiOCwweDA2LDB4ODAsMHhlZiwweGMzLDB4YmEsMHg1YSwweDAwLDB4YjgsMHgwNywweDgwLDB4ZWYsMHhjMywweGI5CissMHhmZiwweGZmLDB4ZTQsMHg1OCwweGU0LDB4NTQsMHgzYywweDAwLDB4NzUsMHgwMywweDQ5LDB4NzUsMHhmNywweGMzLDB4ZmEsMHgzMgorLDB4YzAsMHhlNiwweDU2LDB4ZTQsMHg1NiwweDNjLDB4MDAsMHg3NCwweDAzLDB4ZTksMHg4MiwweDAwLDB4YjAsMHhmZiwweGU2LDB4NTYKKywweGU0LDB4NTYsMHgzYywweGZmLDB4NzUsMHg3OCwweGJhLDB4NTIsMHgwMCwweGI4LDB4ZmYsMHhmZiwweGVmLDB4ZWQsMHgzYywweGZmCissMHg3NSwweDZjLDB4YjgsMHgwMCwweGZmLDB4ZWYsMHhlZCwweDNjLDB4MDAsMHg3NSwweDYzLDB4YjAsMHhmZiwweGU2LDB4NTQsMHhlNAorLDB4NTQsMHgzYywweGZmLDB4NzUsMHg1OSwweDMyLDB4YzAsMHhlNiwweDU0LDB4ZTQsMHg1NCwweDNjLDB4MDAsMHg3NSwweDRmLDB4YjAKKywweDBmLDB4ZTYsMHg1MCwweGU0LDB4NTAsMHgyNCwweDBmLDB4M2MsMHgwZiwweDc1LDB4NDMsMHhiMCwweDAwLDB4ZTYsMHg1MCwweGU0CissMHg1MCwweDI0LDB4MGYsMHgzYywweDAwLDB4NzUsMHgzNywweDhjLDB4YzgsMHg4ZSwweGMwLDB4YmUsMHg3MCwweDAwLDB4MjYsMHg4YgorLDB4MTQsMHgyNiwweDhiLDB4NWMsMHgwMiwweGI4LDB4MDAsMHgwMCwweGVmLDB4ZWQsMHgyMywweGMzLDB4M2QsMHgwMCwweDAwLDB4NzUKKywweDFkLDB4YjgsMHhmZiwweGZmLDB4MjMsMHhjMywweGVmLDB4OGIsMHhjOCwweGVkLDB4MjMsMHhjMywweDNiLDB4YzEsMHg3NSwweDBlCissMHg4MywweGM2LDB4MDQsMHgyNiwweDgzLDB4M2MsMHhmZiwweDc1LDB4ZDUsMHhiOCwweDAwLDB4MDAsMHhlYiwweDAzLDB4YjgsMHgyYQorLDB4MDAsMHhhMywweGY3LDB4MzQsMHhjMywweGZhLDB4MzMsMHhjMCwweGJmLDB4MDAsMHgyMCwweGI5LDB4MTcsMHgwMCwweGYzLDB4YWIKKywweGJmLDB4MDAsMHgzMCwweGI5LDB4MTcsMHgwMCwweGYzLDB4YWIsMHhiZiwweDAwLDB4MjIsMHhiOSwweDQwLDB4MDAsMHhmMywweGFiCissMHhiZiwweDAwLDB4MzIsMHhiOSwweDQwLDB4MDAsMHhmMywweGFiLDB4ZmMsMHgxZSwweDhjLDB4YzgsMHg4ZSwweGQ4LDB4MzMsMHhjMAorLDB4OGUsMHhjMCwweGJlLDB4OTIsMHgwMCwweGJmLDB4MDAsMHgyMCwweGI5LDB4MTcsMHgwMCwweGYzLDB4YTQsMHhiZSwweGE5LDB4MDAKKywweGJmLDB4MDAsMHgyMiwweGI5LDB4NDAsMHgwMCwweGYzLDB4YTQsMHgxZiwweGM3LDB4MDYsMHhmYiwweDM0LDB4NjQsMHgwMCwweGJhCissMHgwOCwweDAwLDB4YjgsMHgwZiwweDAwLDB4ZWYsMHhlOCwweDgyLDB4MDEsMHhlOCwweDliLDB4MDEsMHg3MiwweDBkLDB4YzcsMHgwNgorLDB4ZjcsMHgzNCwweDJjLDB4MDAsMHhjNywweDA2LDB4ZjksMHgzNCwweDA0LDB4MDAsMHhjMywweGJhLDB4MGEsMHgwMCwweDMzLDB4YzAKKywweGVmLDB4ZTgsMHg5OCwweDAxLDB4ZTgsMHhiNSwweDAxLDB4YjgsMHgxNywweDAwLDB4YmEsMHg5YywweDAwLDB4ZWYsMHhiOCwweDAwCissMHgxMCwweGJhLDB4OWEsMHgwMCwweGVmLDB4YjgsMHgxNywweDAwLDB4YTksMHgwMSwweDAwLDB4NzQsMHgwMSwweDQwLDB4YmEsMHg4YworLDB4MDAsMHhlZiwweGI4LDB4MDAsMHgxOCwweGJhLDB4ODYsMHgwMCwweGVmLDB4YjgsMHgwYywweDAwLDB4YmEsMHg4MiwweDAwLDB4ZWYKKywweGJhLDB4MDIsMHgwMCwweGVkLDB4MjUsMHhmOSwweGZmLDB4MGQsMHgwMiwweDAwLDB4ZWYsMHhiYSwweDA2LDB4MDAsMHgzMywweGMwCissMHhlZiwweGJhLDB4MDQsMHgwMCwweGI4LDB4NjAsMHgwMCwweGVmLDB4YmEsMHgwMCwweDAwLDB4YjgsMHgxOCwweDAwLDB4ZWYsMHhiYQorLDB4ODAsMHgwMCwweGI5LDB4ZmYsMHhmZiwweGVkLDB4YTksMHgwMSwweDAwLDB4NzUsMHgwNCwweGUyLDB4ZjgsMHhlYiwweDNlLDB4YmEKKywweDBhLDB4MDAsMHhlZCwweGE5LDB4MDAsMHg0MCwweDc0LDB4MzUsMHhhOSwweDAwLDB4MjAsMHg3NCwweDMwLDB4MzMsMHhjMCwweGVmCissMHg1MSwweGI5LDB4YzgsMHgwMCwweGUyLDB4ZmUsMHg1OSwweDFlLDB4MDYsMHgxZiwweDI2LDB4OGIsMHgwZSwweDAyLDB4MzAsMHg4MworLDB4ZjksMHgxNywweDc1LDB4MTgsMHg0OSwweDQ5LDB4YmUsMHgwMiwweDIwLDB4YmYsMHgwNiwweDMwLDB4ZjMsMHhhNiwweDFmLDB4MjMKKywweGM5LDB4NzUsMHgwYSwweGZmLDB4MGUsMHhmYiwweDM0LDB4NzQsMHgxMiwweGU5LDB4NGQsMHhmZiwweDFmLDB4YjgsMHgyYywweDAwCissMHhiYiwweDAwLDB4MDAsMHhhMywweGY3LDB4MzQsMHg4OSwweDFlLDB4ZjksMHgzNCwweGMzLDB4YzcsMHgwNiwweGZiLDB4MzQsMHg2NAorLDB4MDAsMHhlOCwweGQzLDB4MDAsMHg3MiwweDBkLDB4YzcsMHgwNiwweGY3LDB4MzQsMHgyYywweDAwLDB4YzcsMHgwNiwweGY5LDB4MzQKKywweDA0LDB4MDAsMHhjMywweGU4LDB4ZDYsMHgwMCwweGU4LDB4ZjMsMHgwMCwweGI4LDB4MDMsMHgwMCwweGJhLDB4ODIsMHgwMCwweGVmCissMHhiOCwweDQwLDB4ODAsMHhiYSwweDk4LDB4MDAsMHhlZiwweGI4LDB4MDAsMHgxMSwweGJhLDB4OTYsMHgwMCwweGVmLDB4YjgsMHg0MAorLDB4MDAsMHhhOSwweDAxLDB4MDAsMHg3NCwweDAxLDB4NDAsMHhiYSwweDkyLDB4MDAsMHhlZiwweGI4LDB4MDAsMHgxOSwweGJhLDB4OGUKKywweDAwLDB4ZWYsMHhiYSwweDAyLDB4MDAsMHhlZCwweDI1LDB4ZjksMHhmZiwweDBkLDB4MDYsMHgwMCwweGVmLDB4YmEsMHgwNiwweDAwCissMHgzMywweGMwLDB4ZWYsMHhiYSwweDAwLDB4MDAsMHhiOCwweDE4LDB4MDAsMHhlZiwweGJhLDB4ODAsMHgwMCwweGI5LDB4ZmYsMHhmZgorLDB4ZWQsMHhhOSwweDIwLDB4MDAsMHg3NSwweDA0LDB4ZTIsMHhmOCwweGViLDB4NDMsMHhiYSwweDBhLDB4MDAsMHhlZCwweGE5LDB4MDAKKywweDQwLDB4NzQsMHgzYSwweGE5LDB4MDAsMHgyMCwweDc0LDB4MzUsMHgzMywweGMwLDB4ZWYsMHg1MSwweGI5LDB4YzgsMHgwMCwweGUyCissMHhmZSwweDU5LDB4MWUsMHgwNiwweDFmLDB4MjYsMHg4YiwweDBlLDB4MDIsMHgzMiwweDgzLDB4ZjksMHg0MCwweDc1LDB4MWQsMHg0OQorLDB4NDksMHhiZSwweDAyLDB4MjIsMHhiZiwweDA2LDB4MzIsMHhmMywweGE2LDB4MWYsMHgyMywweGM5LDB4NzUsMHgwZiwweGZmLDB4MGUKKywweGZiLDB4MzQsMHg3NCwweDAzLDB4ZTksMHg1YSwweGZmLDB4YjgsMHgwMCwweDAwLDB4ZWIsMHgwYiwweDFmLDB4YjgsMHgyYywweDAwCissMHhiYiwweDAyLDB4MDAsMHg4OSwweDFlLDB4ZjksMHgzNCwweGEzLDB4ZjcsMHgzNCwweGMzLDB4YmEsMHgwMiwweDAwLDB4YjgsMHgwMAorLDB4OWMsMHhlZiwweGJhLDB4MDAsMHgwMCwweGI4LDB4MDAsMHg4NCwweGVmLDB4MzMsMHhjMCwweGVmLDB4YmEsMHgwYSwweDAwLDB4ZWYKKywweGJhLDB4MGUsMHgwMCwweDMzLDB4YzAsMHhlZiwweGMzLDB4YmEsMHgwYSwweDAwLDB4YjksMHhmZiwweGZmLDB4ZWQsMHgyNSwweDAwCissMHg2MCwweDNkLDB4MDAsMHg2MCwweDc0LDB4MDQsMHhlMiwweGY1LDB4ZjgsMHhjMywweGY5LDB4YzMsMHhiMCwweDAwLDB4ZTYsMHg1NgorLDB4YjgsMHgwMCwweGZmLDB4YmEsMHg1MiwweDAwLDB4ZWYsMHhiOSwweGZmLDB4ZmYsMHhiYSwweDU4LDB4MDAsMHhlZCwweDI1LDB4ZWYKKywweDAwLDB4NzQsMHgwOCwweGJhLDB4NWEsMHgwMCwweDMzLDB4YzAsMHhlZiwweGUyLDB4ZWYsMHhjMywweGJhLDB4ODAsMHgwMCwweGVkCissMHhiYSwweDg0LDB4MDAsMHhlZiwweGJhLDB4ODAsMHgwMCwweGVkLDB4YzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4YzYsMHgwNiwweGVjLDB4MzQsMHgxNSwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4OGUsMHhjMCwweDFlLDB4OGMsMHhjOCwweGJlLDB4NDAKKywweDU0LDB4YmYsMHg2MCwweGZlLDB4OGUsMHhkOCwweGI5LDB4MTAsMHgwMCwweGYzLDB4YTQsMHgxZiwweGM3LDB4MDYsMHg4MCwweDM2CissMHgxMCwweDM1LDB4YzcsMHgwNiwweDhjLDB4MzYsMHgzMCwweDM1LDB4OGQsMHgwNiwweDM4LDB4MzUsMHhhMywweDMwLDB4MzUsMHhhMworLDB4MzIsMHgzNSwweDA1LDB4MzMsMHgwMSwweGEzLDB4MzQsMHgzNSwweGM3LDB4MDYsMHgzNiwweDM1LDB4NTAsMHgwMSwweGM3LDB4MDYKKywweDg0LDB4MzYsMHg4MCwweGZlLDB4YzcsMHgwNiwweDg4LDB4MzYsMHhjMCwweGZlLDB4YzYsMHgwNiwweGMyLDB4ZmUsMHhmZiwweGM2CissMHgwNiwweDkzLDB4MzYsMHg4MCwweGM2LDB4MDYsMHg5MiwweDM2LDB4MDAsMHhjNiwweDA2LDB4ODAsMHhmZSwweDgwLDB4YzcsMHgwNgorLDB4ODIsMHhmZSwweDU0LDB4NTAsMHhjNywweDA2LDB4ODQsMHhmZSwweDJiLDB4NGQsMHhlNSwweGNlLDB4YTksMHgwMiwweDAwLDB4NzUKKywweDA4LDB4YzYsMHgwNiwweDgxLDB4ZmUsMHgyMywweGU5LDB4MDUsMHgwMCwweGM2LDB4MDYsMHg4MSwweGZlLDB4MjIsMHhhMSwweGY3CissMHgzNCwweGEzLDB4ODYsMHhmZSwweGI4LDB4NDgsMHgzNCwweDg2LDB4ZTAsMHhhMywweDg4LDB4ZmUsMHg4ZCwweDA2LDB4NGUsMHgzNAorLDB4ODYsMHhlMCwweGEzLDB4OGEsMHhmZSwweGI4LDB4NTgsMHgzNCwweDg2LDB4ZTAsMHhhMywweDhjLDB4ZmUsMHhiOCwweDljLDB4MzQKKywweDg2LDB4ZTAsMHhhMywweDhlLDB4ZmUsMHg4ZCwweDA2LDB4MjAsMHgwMywweDg2LDB4ZTAsMHhhMywweDkwLDB4ZmUsMHgzMywweGMwCissMHhiYSwweDcyLDB4MDAsMHhlZiwweDMzLDB4YzAsMHhiYSwweDc0LDB4MDAsMHhlZiwweGJhLDB4NzYsMHgwMCwweGVmLDB4YjgsMHg4MAorLDB4ZmUsMHg4NiwweGUwLDB4YmEsMHg3MiwweDAwLDB4ZWYsMHhlOCwweGJmLDB4MDcsMHhiYSwweDBjLDB4MDEsMHhiOCwweDQwLDB4NDAKKywweGVmLDB4ZWQsMHhiYSwweDZhLDB4MDAsMHhiOCwweDAzLDB4MDAsMHhjMSwweGUwLDB4MDgsMHgwZCwweDAzLDB4MDAsMHhlZiwweGI5CissMHgwYSwweDAwLDB4ZTgsMHg5NCwweDAwLDB4YmEsMHg2YSwweDAwLDB4YjgsMHgwMywweDAwLDB4YzEsMHhlMCwweDA4LDB4ZWYsMHhhMQorLDB4MzIsMHgzNCwweGEzLDB4YTIsMHgzMywweGM3LDB4MDYsMHhhNiwweDMzLDB4MDQsMHgwMCwweDhkLDB4MDYsMHhhMCwweDMzLDB4YzEKKywweGU4LDB4MDQsMHhjZCwweDM5LDB4YzcsMHgwNiwweDkwLDB4MzYsMHhmZiwweGZmLDB4ZTksMHhlMywweDAwLDB4NjMsMHgwZCwweDY2CissMHgwZCwweDY2LDB4MGQsMHg4YSwweDBkLDB4ZTYsMHgwZSwweDc1LDB4MTIsMHgyZSwweDBmLDB4MDMsMHgwZiwweDUwLDB4MGYsMHg2MAorLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweGVkLDB4MGYsMHhlOSwweDEyLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAKKywweDBkLDB4NjAsMHgwZCwweDIyLDB4MTAsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4ZmUsMHgxMCwweDYwCissMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4YWYsMHgwZiwweDMyLDB4MTAsMHgzNworLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAKKywweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwCissMHgwZCwweDY0LDB4MGUsMHgwMCwweDBmLDB4OTUsMHgwOSwweDYwLDB4MGEsMHg0OSwweGJiLDB4ZmYsMHhmZiwweGJhLDB4NmEsMHgwMAorLDB4ZWQsMHhhOSwweDAwLDB4MjAsMHg3NCwweDM4LDB4ODAsMHgzZSwweDgwLDB4ZmUsMHgxMiwweDc1LDB4MzEsMHhlOCwweDRhLDB4MDAKKywweGExLDB4MzIsMHgzNCwweGEzLDB4YTIsMHgzMywweGM3LDB4MDYsMHhhNiwweDMzLDB4MDQsMHgwMCwweDhkLDB4MDYsMHhhMCwweDMzCissMHhjMSwweGU4LDB4MDQsMHhjZCwweDM5LDB4ZTgsMHgyMiwweDAwLDB4YzcsMHgwNiwweGYzLDB4MzQsMHg0NiwweDAwLDB4YzcsMHgwNgorLDB4ZjUsMHgzNCwweGZmLDB4ZmYsMHhjNywweDA2LDB4OTAsMHgzNiwweGZmLDB4ZmYsMHg1OCwweGU5LDB4MzIsMHgwMCwweDRiLDB4ODMKKywweGZiLDB4MDAsMHg3NSwweGI5LDB4ODMsMHhmOSwweDAwLDB4NzUsMHhiMCwweGMzLDB4NTIsMHhiYSwweDZhLDB4MDAsMHhiOCwweDAzCissMHgwMCwweGMxLDB4ZTAsMHgwOCwweDBkLDB4MDMsMHgwMCwweGVmLDB4NWEsMHhjMywweDUyLDB4YmEsMHg2YSwweDAwLDB4YjgsMHgwMworLDB4MDAsMHhjMSwweGUwLDB4MDgsMHhlZiwweDVhLDB4YzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDY4LDB4ODAsMHgwNywweGExLDB4OTAsMHgzNiwweGNkLDB4MzUsMHg4YiwweDM2LDB4MjQsMHgwMiwweDJlLDB4ZmYsMHhhNCwweDM1CissMHgwYSwweGZhLDB4OGEsMHgyNiwweDk0LDB4MzYsMHg4OCwweDI2LDB4ZTgsMHgzNCwweGM2LDB4MDYsMHg5NCwweDM2LDB4MDAsMHhmYgorLDB4MjIsMHhlNCwweDc1LDB4MDEsMHhjMywweGY2LDB4YzQsMHgyMCwweDc0LDB4N2QsMHhmNiwweGM0LDB4MDgsMHg3NCwweDA1LDB4ODAKKywweDBlLDB4OTIsMHgzNiwweDA0LDB4ODAsMHgyNiwweGU4LDB4MzQsMHhkNywweGM0LDB4MWUsMHg4NCwweDM2LDB4MjYsMHg4YiwweDM3CissMHg4MSwweGU2LDB4ZmYsMHgwMCwweDgzLDB4ZmUsMHgyMCwweDc2LDB4MDUsMHhiMCwweDAxLDB4ZTksMHgyOCwweDAwLDB4NTMsMHgwNgorLDB4ZDEsMHhlNiwweDJlLDB4ZmYsMHg5NCwweDlkLDB4MDYsMHgwNywweDViLDB4MjYsMHg4OCwweDQ3LDB4MDIsMHgzYywweGZmLDB4NzQKKywweDA3LDB4M2MsMHhmZSwweDc1LDB4MTEsMHhlOSwweDNiLDB4MDAsMHhmNiwweDA2LDB4OTIsMHgzNiwweDA4LDB4NzUsMHgzNCwweGY2CissMHgwNiwweDkyLDB4MzYsMHgwNCwweDc0LDB4MmQsMHg4MCwweDI2LDB4OTIsMHgzNiwweGYzLDB4ODAsMHgzZSwweDk1LDB4MzYsMHgwMAorLDB4NzUsMHgyMSwweDI2LDB4ODAsMHgzZiwweDA1LDB4NzUsMHgxMywweGM2LDB4MDYsMHg5NSwweDM2LDB4MDAsMHgyNiwweDgwLDB4N2YKKywweDA2LDB4MDAsMHg3NCwweDA3LDB4MjYsMHg4YiwweDQ3LDB4MDQsMHhhMiwweDk1LDB4MzYsMHhiYSwweDBjLDB4MDEsMHhiOCwweDQwCissMHg0MCwweGVmLDB4ZWQsMHg4YSwweDI2LDB4ZTgsMHgzNCwweGY2LDB4YzQsMHgxMCwweDc1LDB4MDMsMHhlOSwweDViLDB4MDAsMHhmNgorLDB4YzQsMHgwNCwweDc0LDB4MDUsMHg4MCwweDBlLDB4OTIsMHgzNiwweDAxLDB4ODAsMHgyNiwweGU4LDB4MzQsMHhlYiwweGM0LDB4M2UKKywweDg4LDB4MzYsMHgyNiwweDhiLDB4MzUsMHg4MywweGU2LDB4N2YsMHg4MywweGZlLDB4MTIsMHg3MiwweDA4LDB4MjYsMHhjNiwweDQ1CissMHgwMiwweDAxLDB4ZTksMHgyNCwweDAwLDB4ODMsMHhjNiwweDIwLDB4ZDEsMHhlNiwweDJlLDB4ZmYsMHg5NCwweDlkLDB4MDYsMHhjNAorLDB4M2UsMHg4OCwweDM2LDB4MjYsMHg4OCwweDQ1LDB4MDIsMHgzYywweGZmLDB4NzUsMHgwZSwweGY2LDB4MDYsMHg5MiwweDM2LDB4MDEKKywweDc0LDB4MTQsMHhmNiwweDA2LDB4OTIsMHgzNiwweDAyLDB4NzUsMHgwZCwweDgwLDB4MjYsMHg5MiwweDM2LDB4ZmMsMHhiYSwweDBjCissMHgwMSwweGI4LDB4MjAsMHgyMCwweGVmLDB4ZWQsMHg4YSwweDI2LDB4ZTgsMHgzNCwweGY2LDB4YzQsMHgwOCwweDc0LDB4MjIsMHg4MAorLDB4MjYsMHhlOCwweDM0LDB4ZjcsMHg4MCwweDBlLDB4OTIsMHgzNiwweDA0LDB4ZjYsMHgwNiwweDkyLDB4MzYsMHgwOCwweDc0LDB4MTEKKywweDgwLDB4MjYsMHg5MiwweDM2LDB4ZjMsMHhiYSwweDBjLDB4MDEsMHhiOCwweDQwLDB4NDAsMHhlZiwweGVkLDB4OGEsMHgyNiwweGU4CissMHgzNCwweGY2LDB4YzQsMHgwNCwweDc0LDB4MjIsMHg4MCwweDI2LDB4ZTgsMHgzNCwweGZiLDB4ODAsMHgwZSwweDkyLDB4MzYsMHgwMQorLDB4ZjYsMHgwNiwweDkyLDB4MzYsMHgwMiwweDc1LDB4MTEsMHg4MCwweDI2LDB4OTIsMHgzNiwweGZlLDB4YmEsMHgwYywweDAxLDB4YjgKKywweDIwLDB4MjAsMHhlZiwweGVkLDB4OGEsMHgyNiwweGU4LDB4MzQsMHhmNiwweGM0LDB4MDEsMHg3NCwweDY3LDB4ODAsMHgyNiwweGU4CissMHgzNCwweGZlLDB4ODAsMHgzZSwweGU4LDB4ZmYsMHgwMCwweDc0LDB4MzksMHg4MCwweDNlLDB4ZTgsMHhmZiwweDA0LDB4NzQsMHgzMgorLDB4ODAsMHgzZSwweGU4LDB4ZmYsMHgwMSwweDc1LDB4MjEsMHhlNSwweDgwLDB4YTksMHgwMCwweDA3LDB4NzQsMHgwYSwweGJhLDB4OWUKKywweDAwLDB4YjgsMHgwMCwweDAyLDB4ZWYsMHhlOSwweGVmLDB4ZmYsMHhjNiwweDA2LDB4ZTgsMHhmZiwweDAzLDB4YmEsMHgwYywweDAxCissMHhiOCwweDA4LDB4MDgsMHhlZiwweGVkLDB4ZTksMHgyOCwweDAwLDB4ODAsMHgzZSwweGU4LDB4ZmYsMHgwMywweDc0LDB4MDYsMHhlOQorLDB4MWUsMHgwMCwweGU5LDB4MDAsMHgwMCwweGJhLDB4MTAsMHgwMSwweGI4LDB4MDIsMHgwMiwweGVmLDB4ZWQsMHhlNSwweDAwLDB4MGQKKywweDE4LDB4MDAsMHhlNywweDAwLDB4ZTUsMHg4MiwweDBkLDB4MDIsMHgwMCwweGU3LDB4ODIsMHhjNiwweDA2LDB4ZTgsMHhmZiwweDA0CissMHg4YSwweDI2LDB4ZTgsMHgzNCwweGY2LDB4YzQsMHgwMiwweDc0LDB4MGQsMHg4MCwweDI2LDB4ZTgsMHgzNCwweGZkLDB4ODAsMHgyNgorLDB4OTIsMHgzNiwweGJmLDB4ZTgsMHg0ZiwweDBiLDB4ZmEsMHhhMCwweGU4LDB4MzQsMHgwOCwweDA2LDB4OTQsMHgzNiwweGM2LDB4MDYKKywweGU4LDB4MzQsMHgwMCwweGZiLDB4YzMsMHhlOCwweGU3LDB4MGYsMHhjNCwweDFlLDB4ODQsMHgzNiwweDJlLDB4ZmYsMHgxNiwweDAxCissMHgwNywweDI2LDB4ODgsMHg0NywweDAyLDB4ZTksMHg3ZSwweGZlLDB4ZTgsMHgyZCwweDEwLDB4YzQsMHgxZSwweDg0LDB4MzYsMHgyZQorLDB4ZmYsMHgxNiwweDAzLDB4MDcsMHgyNiwweDg4LDB4NDcsMHgwMiwweGU5LDB4NmIsMHhmZSwweDhlLDB4MDYsMHgyNiwweDAyLDB4MmUKKywweGZmLDB4MTYsMHgwNywweDA3LDB4YzMsMHhjMywweDgzLDB4M2UsMHhmNSwweDM0LDB4MDAsMHg3NCwweDBmLDB4ZmYsMHgwZSwweGYzCissMHgzNCwweDc1LDB4MDksMHhlOCwweGM0LDB4ZmQsMHhjNywweDA2LDB4ZjUsMHgzNCwweDAwLDB4MDAsMHhmNiwweDA2LDB4OTMsMHgzNgorLDB4MjAsMHg3NCwweDMwLDB4YTEsMHhjMiwweDM0LDB4M2IsMHgwNiwweGU5LDB4MzQsMHhhMywweGU5LDB4MzQsMHg3NCwweDI0LDB4ODAKKywweDNlLDB4OTUsMHgzNiwweDAwLDB4NzUsMHgxZCwweGY3LDB4MDYsMHhlNiwweDM0LDB4MjAsMHgwMCwweDc0LDB4MTIsMHhhOSwweDIwCissMHgwMCwweDc0LDB4MGQsMHg4MywweDI2LDB4YzIsMHgzNCwweGRmLDB4ODMsMHgyNiwweGU5LDB4MzQsMHhkZiwweGU5LDB4MDMsMHgwMAorLDB4ZTgsMHhkZCwweDA5LDB4YmEsMHgwNiwweDAxLDB4ZWQsMHg4YiwweGQwLDB4ODEsMHhlMiwweDAwLDB4YzAsMHhjMSwweGVhLDB4MGUKKywweDAzLDB4MTYsMHg3NCwweDM0LDB4YzEsMHhlMCwweDAyLDB4MTEsMHgwNiwweDcyLDB4MzQsMHg3MywweDA0LDB4ZmYsMHgwNiwweDc0CissMHgzNCwweGJhLDB4MDIsMHgwMSwweGVkLDB4OGIsMHhkMCwweDgxLDB4ZTIsMHgwMCwweGMwLDB4YzEsMHhlYSwweDBlLDB4MDMsMHgxNgorLDB4NzAsMHgzNCwweGMxLDB4ZTAsMHgwMiwweDExLDB4MDYsMHg2ZSwweDM0LDB4NzMsMHgwNCwweGZmLDB4MDYsMHg3MCwweDM0LDB4YzcKKywweDA2LDB4YTYsMHgzMywweDA0LDB4MDAsMHhjNywweDA2LDB4YWEsMHgzMywweDAwLDB4MDAsMHg4ZCwweDA2LDB4YTAsMHgzMywweGMxCissMHhlOCwweDA0LDB4Y2QsMHgzOSwweGMzLDB4OTUsMHgwOSwweDk1LDB4MDksMHg2NSwweDA5LDB4NzgsMHgwOSwweDk1LDB4MDksMHg5NQorLDB4MDksMHg5MSwweDA3LDB4OTUsMHgwOSwweDk2LDB4MDksMHg4YiwweDA5LDB4OTUsMHgwOSwweDk1LDB4MDksMHg5NSwweDA5LDB4OTUKKywweDA5LDB4OTUsMHgwOSwweDk1LDB4MDksMHg4YiwweGMwLDB4OGIsMHhjMCwweDhiLDB4YzAsMHg4YiwweGMwLDB4OGIsMHhjMCwweDkwCissMHhmNiwweDA2LDB4OTMsMHgzNiwweDIwLDB4NzUsMHgwMywweGU5LDB4Y2MsMHgwMCwweDhjLDB4YzAsMHg0MCwweDhlLDB4YzAsMHgyNgorLDB4OGIsMHgwZSwweDA2LDB4MDAsMHg4NiwweGU5LDB4MjYsMHg4OSwweDBlLDB4MDYsMHgwMCwweDhjLDB4YzIsMHhjMSwweGUyLDB4MDQKKywweGJlLDB4MGUsMHgwMCwweDI2LDB4YTEsMHgwNCwweDAwLDB4ZDAsMHhlMCwweDI0LDB4YzAsMHg4YSwweGUwLDB4YzAsMHhlYywweDA0CissMHgwYSwweGM0LDB4MjYsMHhhMiwweDA1LDB4MDAsMHgyNiwweGExLDB4MDgsMHgwMCwweGE5LDB4MDAsMHhjMCwweDc0LDB4MDMsMHhlOQorLDB4OWUsMHgwMCwweDI2LDB4ZjYsMHgwNiwweDEwLDB4MDAsMHg4MCwweDc1LDB4MDMsMHhlOSwweDBhLDB4MDAsMHgyNiwweGEwLDB4MTYKKywweDAwLDB4MjQsMHgxZiwweDMyLDB4ZTQsMHgwMywweGYwLDB4ODAsMHgzZSwweGVjLDB4MzQsMHgwNiwweDcyLDB4NWMsMHg4MCwweDNlCissMHg5NSwweDM2LDB4MDAsMHg3NSwweDY2LDB4OGIsMHhmYSwweDMzLDB4ZGIsMHg4ZSwweGMzLDB4MjYsMHg4OSwweDFkLDB4MjYsMHg4OAorLDB4NWQsMHgwNCwweDUxLDB4NTAsMHhjNCwweDFlLDB4OGMsMHgzNiwweGI5LDB4MGYsMHgwMCwweDMzLDB4YzAsMHhlOCwweDIxLDB4MDkKKywweDU4LDB4NTksMHgwYiwweGRiLDB4NzQsMHgzNCwweGZlLDB4MGUsMHhlNiwweDNhLDB4MjYsMHhjNiwweDA3LDB4ODEsMHgyNiwweGM2CissMHg0NywweDAxLDB4MDAsMHgyNiwweGM2LDB4NDcsMHgwMiwweGZmLDB4MjYsMHhjNywweDQ3LDB4MDQsMHgwMCwweDAwLDB4MjYsMHg4OQorLDB4NGYsMHgwYSwweDg2LDB4ZjIsMHgyNiwweDg5LDB4NTcsMHgwNiwweDI2LDB4ODksMHg3NywweDA4LDB4MjYsMHhjNiwweDQ3LDB4MDkKKywweDAwLDB4MjYsMHhjNiwweDQ3LDB4MGMsMHgwMiwweGU4LDB4OGMsMHgwOSwweGMzLDB4ZmYsMHgwNiwweGVjLDB4MzMsMHg4YywweGMwCissMHg0OCwweDhlLDB4YzAsMHhmYSwweGU4LDB4OTcsMHgxMCwweGZiLDB4ZTksMHhlYiwweGZmLDB4OGMsMHhjMCwweDQ4LDB4OGUsMHhjMAorLDB4ZmEsMHhlOCwweDhhLDB4MTAsMHhmYiwweGMzLDB4OGMsMHhjMCwweDhlLDB4YzAsMHhmYSwweGU4LDB4ODAsMHgxMCwweGZiLDB4YzMKKywweDgwLDB4M2UsMHg5NSwweDM2LDB4MDAsMHg3NSwweDAzLDB4ZTksMHhjMiwweDAwLDB4YmYsMHgwOCwweDAwLDB4MjYsMHhmNiwweDA2CissMHgxMCwweDAwLDB4ODAsMHg3NSwweDA1LDB4MDMsMHhmZSwweGU5LDB4MGMsMHgwMCwweDI2LDB4YTAsMHgxNiwweDAwLDB4MjQsMHgxZgorLDB4MzIsMHhlNCwweDAzLDB4ZjAsMHgwMywweGZlLDB4YTAsMHg5NSwweDM2LDB4M2MsMHgwMCwweDc1LDB4MDMsMHhlOSwweDljLDB4MDAKKywweDNjLDB4MDEsMHg3NCwweDBiLDB4M2MsMHgwMiwweDc0LDB4MTQsMHgzYywweDAzLDB4NzQsMHgxZCwweGU5LDB4OGQsMHgwMCwweGM2CissMHgwNiwweDk2LDB4MzYsMHgwMSwweGU4LDB4M2MsMHgwMSwweDcyLDB4MjcsMHhlOSwweDgwLDB4MDAsMHhjNiwweDA2LDB4OTYsMHgzNgorLDB4MDIsMHhlOCwweDgzLDB4MDAsMHg3MiwweDFhLDB4ZTksMHg3MywweDAwLDB4YzYsMHgwNiwweDk2LDB4MzYsMHgwMSwweGU4LDB4MjIKKywweDAxLDB4NzIsMHgwZCwweGM2LDB4MDYsMHg5NiwweDM2LDB4MDIsMHhlOCwweDZjLDB4MDAsMHg3MiwweDAzLDB4ZTksMHg1YywweDAwCissMHg1MywweDA2LDB4NTAsMHhjNCwweDFlLDB4OGMsMHgzNiwweGI5LDB4MGIsMHgwMCwweDMzLDB4YzAsMHhlOCwweDQyLDB4MDgsMHg1OAorLDB4MjYsMHhjNiwweDA3LDB4ODIsMHgyNiwweGM2LDB4NDcsMHgwMiwweGZmLDB4OGQsMHgwNiwweGUwLDB4ZmUsMHg4NiwweGM0LDB4MjYKKywweDg5LDB4NDcsMHgwNiwweGEwLDB4OTYsMHgzNiwweDI2LDB4ODgsMHg0NywweDA4LDB4ZTgsMHhjOCwweDA4LDB4MDcsMHg1YiwweDgzCissMHgyNiwweGFkLDB4MzYsMHhmZSwweGExLDB4YWQsMHgzNiwweGU3LDB4MDQsMHhiYSwweDEwLDB4MDEsMHhiOCwweDgwLDB4ODAsMHhlZgorLDB4ZWQsMHhiYSwweDEwLDB4MDEsMHhiOCwweDAyLDB4MDIsMHhlZiwweGVkLDB4NTIsMHhiYSwweGUwLDB4MDAsMHhiOCwweDQxLDB4MTAKKywweGVmLDB4NWEsMHhiOCwweDljLDB4MDMsMHhjZCwweDM5LDB4YzYsMHgwNiwweDk1LDB4MzYsMHgwMCwweDhjLDB4YzAsMHg0OCwweDhlCissMHhjMCwweGZhLDB4ZTgsMHhhOSwweDBmLDB4ZmIsMHhjMywweDFlLDB4MDYsMHgxZiwweDA2LDB4MzMsMHhjMCwweDhlLDB4YzAsMHg4YgorLDB4ZjAsMHg4ZCwweDNlLDB4MjAsMHhmMywweDUxLDB4YjEsMHgwYSwweDI2LDB4ODMsMHg3ZCwweDBjLDB4MDEsMHg3NSwweDJhLDB4NTcKKywweDI2LDB4ODMsMHg3ZCwweDBlLDB4MDAsMHg3NCwweDA2LDB4ZTgsMHgyZiwweDAwLDB4ZTksMHgwMywweDAwLDB4ZTgsMHg2NiwweDA3CissMHg1ZiwweDczLDB4MTYsMHgzMywweGMwLDB4OGUsMHhkOCwweDI2LDB4OGIsMHg0ZCwweDEyLDB4OGQsMHg3NSwweDIwLDB4OGQsMHgzZQorLDB4ZTAsMHhmZSwweGYzLDB4YTQsMHg1OSwweDA3LDB4MWYsMHhmOSwweGMzLDB4ZmUsMHhjOSwweDc0LDB4MDcsMHg4MSwweGM3LDB4MjAKKywweDAxLDB4ZTksMHhjNCwweGZmLDB4NTksMHgwNywweDFmLDB4ZjgsMHhjMywweDUxLDB4NTAsMHg1MywweDU2LDB4NTIsMHg1NywweDMzCissMHhkYiwweDI2LDB4OGEsMHg1ZCwweDBlLDB4MjYsMHg4YiwweDRkLDB4MTIsMHg4ZCwweDdkLDB4MjAsMHg1YSwweDg3LDB4ZDcsMHgyNgorLDB4OGEsMHg0NSwweDE0LDB4ODcsMHhkNywweDQyLDB4MzIsMHhmZiwweDgwLDB4ZmYsMHgwOCwweDc1LDB4MDgsMHhmZSwweGNiLDB4MjIKKywweGRiLDB4NzUsMHhlYSwweDMzLDB4ZGIsMHgyMywweGRiLDB4NzQsMHgwNiwweGZlLDB4YzcsMHhkMCwweGM4LDB4NzMsMHgwYywweDUwCissMHgyNiwweDhhLDB4MDUsMHgzOCwweDA0LDB4NTgsMHg3NCwweDAzLDB4ZTksMHgwYSwweDAwLDB4NDksMHg0NiwweDQ3LDB4MjMsMHhjOQorLDB4NzQsMHgwYSwweGU5LDB4ZDMsMHhmZiwweDVhLDB4NWUsMHg1YiwweDU4LDB4NTksMHhmOCwweGMzLDB4NWEsMHg1ZSwweDViLDB4NTgKKywweDU5LDB4ZjksMHhjMywweDFlLDB4MDYsMHgxZiwweDA2LDB4MzMsMHhjMCwweDhlLDB4YzAsMHg4NiwweGNkLDB4MmIsMHhjZSwweDhiCissMHhmNywweDhiLDB4YzEsMHgzMywweGM5LDB4ODAsMHgzYywweGZmLDB4NzQsMHgxNiwweDgwLDB4ZjksMHgwNiwweDczLDB4MDksMHgzMgorLDB4YzksMHg0NiwweDQ4LDB4NzQsMHgyZSwweGU5LDB4ZWQsMHhmZiwweDNkLDB4NjAsMHgwMCwweDczLDB4MGMsMHhlOSwweDIzLDB4MDAKKywweGZlLDB4YzEsMHg0NiwweDQ4LDB4NzQsMHgxZCwweGU5LDB4ZGMsMHhmZiwweGI4LDB4MTAsMHgwMCwweDhkLDB4M2UsMHgxOCwweDM0CissMHgzMiwweGVkLDB4YjEsMHgwNiwweGYzLDB4YTYsMHg3NCwweDAzLDB4ZTksMHgwOCwweDAwLDB4NDgsMHgyMywweGMwLDB4NzQsMHgwNworLDB4ZTksMHhlOSwweGZmLDB4MDcsMHgxZiwweGY4LDB4YzMsMHg4ZCwweDM2LDB4MTgsMHgzNCwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4OGQKKywweDNlLDB4ZTAsMHhmZSwweGI4LDB4MTAsMHgwMCwweGI5LDB4MDYsMHgwMCwweDU2LDB4ZjMsMHhhNCwweDVlLDB4NDgsMHgzZCwweDAwCissMHgwMCwweDc1LDB4ZjMsMHgwNywweDFmLDB4ZjksMHhjMywweGZmLDB4MDYsMHhlNCwweDMzLDB4YzYsMHgwNiwweGViLDB4MzQsMHgwMAorLDB4MjYsMHg4YiwweDQ1LDB4MDYsMHg4NiwweGUwLDB4YzEsMHhlOCwweDA0LDB4NDgsMHgwNiwweDhlLDB4YzAsMHhmZSwweDA2LDB4ZTYKKywweDNhLDB4ZmEsMHhlOCwweDY5LDB4MGUsMHhmYiwweDA3LDB4YjAsMHhmZiwweGMzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHhiMCwweDAxLDB4YzMsMHhiMCwweDAwLDB4YzMsMHhmNiwweDA2LDB4OTMsMHgzNiwweDIwLDB4NzUsMHgwMywweGIwLDB4MDQsMHhjMworLDB4OGIsMHgwZSwweDk3LDB4MzYsMHg4MSwweGUxLDB4ODAsMHgzMCwweDI2LDB4OGIsMHg0NywweDA0LDB4MjUsMHg3ZiwweGNmLDB4MGIKKywweGMxLDB4YTMsMHg5NywweDM2LDB4YTMsMHhlNiwweDM0LDB4YjAsMHgwMCwweGMzLDB4ZjYsMHgwNiwweDkzLDB4MzYsMHgyMCwweDc0CissMHgwMywweGIwLDB4MDMsMHhjMywweDI2LDB4OGIsMHg0NywweDA4LDB4YTMsMHg5NywweDM2LDB4YTMsMHhlNiwweDM0LDB4MjYsMHg4YQorLDB4NDcsMHgyMCwweGEyLDB4ZmQsMHgzNCwweDNjLDB4MDEsMHg3NSwweDA2LDB4YzcsMHgwNiwweGExLDB4MzYsMHgwMCwweDAwLDB4MjYKKywweDhhLDB4NDcsMHgyMSwweGEyLDB4ZmUsMHgzNCwweDI2LDB4OGIsMHg0NywweDBhLDB4YTMsMHgxOCwweDM0LDB4YTMsMHg1OCwweDM0CissMHgyNiwweDhiLDB4NDcsMHgwYywweGEzLDB4MWEsMHgzNCwweGEzLDB4NWEsMHgzNCwweDI2LDB4OGIsMHg0NywweDBlLDB4YTMsMHgxYworLDB4MzQsMHhhMywweDVjLDB4MzQsMHhjNiwweDA2LDB4MmEsMHgzNCwweGMwLDB4MjYsMHg4YiwweDQ3LDB4MTQsMHgyNSwweDdmLDB4ZmYKKywweDA5LDB4MDYsMHgyYywweDM0LDB4MjYsMHg4YiwweDQ3LDB4MTYsMHgyNSwweGZmLDB4ZmUsMHgyNSwweGZmLDB4ZmMsMHgwOSwweDA2CissMHgyZSwweDM0LDB4YzYsMHgwNiwweDAwLDB4MzQsMHhjMCwweDI2LDB4OGIsMHg0NywweDEwLDB4YTMsMHgwMiwweDM0LDB4MjYsMHg4YgorLDB4NDcsMHgxMiwweGEzLDB4MDQsMHgzNCwweDA2LDB4NTMsMHhlOCwweDg0LDB4MGEsMHg1YiwweDA3LDB4M2QsMHgwMCwweDAwLDB4NzUKKywweDA3LDB4ODAsMHgwZSwweDkyLDB4MzYsMHgwOCwweGIwLDB4ZmUsMHhjMywweGI5LDB4MDAsMHgwMSwweGExLDB4YWMsMHgzMywweDMzCissMHhkMiwweGY3LDB4ZjksMHhhMywweGFlLDB4MzMsMHg5MSwweDQ5LDB4MzMsMHhkMiwweGY3LDB4ZTksMHgwNSwweDAwLDB4M2IsMHhhMworLDB4NDYsMHgzNCwweGJmLDB4MDAsMHgzYiwweDg5LDB4M2UsMHg0NCwweDM0LDB4YmEsMHg2OCwweDAwLDB4YjgsMHhlMCwweGUwLDB4ZWYKKywweGExLDB4YWUsMHgzMywweGU3LDB4NjIsMHhhMSwweGFlLDB4MzMsMHhiYSwweDA4LDB4MDEsMHhlZiwweGExLDB4NDQsMHgzNCwweGU3CissMHg2NCwweGExLDB4NDQsMHgzNCwweGJhLDB4MGEsMHgwMSwweGVmLDB4YjgsMHgwMCwweDAxLDB4MmQsMHgwNCwweDAwLDB4MGQsMHgwMAorLDB4MTAsMHhlNywweDkyLDB4YzMsMHgzZCwweDAwLDB4MDAsMHg3NCwweDBhLDB4MjYsMHg4OSwweDQ3LDB4MDcsMHhlOCwweDgzLDB4M2EKKywweGIwLDB4MDcsMHhjMywweGExLDB4YWUsMHgzMywweDI2LDB4ODksMHg0NywweDJiLDB4YTEsMHg0NCwweDM0LDB4MjYsMHg4OSwweDQ3CissMHgyZCwweGExLDB4NDYsMHgzNCwweDI2LDB4ODksMHg0NywweDJmLDB4ODAsMHgwZSwweDkzLDB4MzYsMHgyMCwweGExLDB4ODgsMHgzNgorLDB4ODYsMHhlMCwweDI2LDB4ODksMHg0NywweDA4LDB4YTEsMHg4NCwweDM2LDB4ODYsMHhlMCwweDI2LDB4ODksMHg0NywweDBhLDB4YTEKKywweDgwLDB4MzYsMHg4NiwweGUwLDB4MjYsMHg4OSwweDQ3LDB4MGMsMHhiOCwweDYwLDB4ZmUsMHg4NiwweGUwLDB4MjYsMHg4OSwweDQ3CissMHgwZSwweGEwLDB4YTEsMHgzNiwweDI2LDB4ODgsMHg0NywweDEwLDB4OGIsMHgzNiwweDg4LDB4MzYsMHgyNiwweGM2LDB4NDQsMHgwMgorLDB4ZmYsMHhlNSwweDllLDB4YTksMHgwMCwweDA4LDB4NzQsMHgwYywweGJhLDB4ODQsMHgwMCwweGVkLDB4MGQsMHgwOCwweDAwLDB4ZWYKKywweGJhLDB4OGUsMHgwMCwweGVmLDB4ZTUsMHgwMiwweDI1LDB4ZjksMHhmZiwweGU3LDB4MDIsMHhiYSwweDEwLDB4MDEsMHhiOCwweDAyCissMHgwMiwweGVmLDB4ZWQsMHhiMCwweDAwLDB4YzMsMHhmNiwweDA2LDB4OTMsMHgzNiwweDIwLDB4NzUsMHgwMywweGIwLDB4MDEsMHhjMworLDB4ODAsMHgyNiwweDkzLDB4MzYsMHg5ZiwweGU4LDB4OGQsMHgwYSwweDgwLDB4MGUsMHg5MiwweDM2LDB4MDgsMHhiMCwweGZlLDB4YzMKKywweGIwLDB4MDAsMHhjMywweGY2LDB4MDYsMHg5MywweDM2LDB4MjAsMHg3NSwweDAzLDB4YjAsMHgwNCwweGMzLDB4YzYsMHgwNiwweDJhCissMHgzNCwweGMwLDB4MjYsMHg4YiwweDQ3LDB4MDYsMHgyNSwweDdmLDB4ZmYsMHhhMywweDJjLDB4MzQsMHgyNiwweDhiLDB4NDcsMHgwOAorLDB4MjUsMHhmZiwweGZlLDB4MjUsMHhmZiwweGZjLDB4YTMsMHgyZSwweDM0LDB4Y2QsMHg1MiwweGIwLDB4MDAsMHhjMywweGY2LDB4MDYKKywweDkzLDB4MzYsMHgyMCwweDc1LDB4MDMsMHhiMCwweDA0LDB4YzMsMHhjNiwweDA2LDB4MDAsMHgzNCwweGMwLDB4MjYsMHg4YiwweDQ3CissMHgwNiwweGEzLDB4MDIsMHgzNCwweDI2LDB4OGIsMHg0NywweDA4LDB4YTMsMHgwNCwweDM0LDB4Y2QsMHg1MiwweGIwLDB4MDAsMHhjMworLDB4ZjYsMHgwNiwweDkzLDB4MzYsMHgyMCwweDc1LDB4MDMsMHhiMCwweDA0LDB4YzMsMHg1NywweDhkLDB4N2YsMHgwNiwweDUxLDB4YjkKKywweDA3LDB4MDAsMHgzMywweGMwLDB4ZjMsMHhhYiwweDU5LDB4OGQsMHg3ZiwweDA2LDB4YTEsMHg3YSwweDM0LDB4MDMsMHgwNiwweDM5CissMHgzNywweDI2LDB4ODgsMHgwNSwweGExLDB4OTUsMHgzNywweDI2LDB4ODgsMHg0NSwweDAyLDB4YTEsMHg4MCwweDM0LDB4MDMsMHgwNgorLDB4NzYsMHgzNCwweDI2LDB4ODgsMHg0NSwweDA3LDB4YTEsMHhjNiwweDM0LDB4MjYsMHg4OCwweDQ1LDB4MDksMHhhMSwweGQ4LDB4MzMKKywweDI2LDB4ODgsMHg0NSwweDBhLDB4MzMsMHhjMCwweGEzLDB4N2EsMHgzNCwweGEzLDB4MzksMHgzNywweGEzLDB4OTUsMHgzNywweGEzCissMHg4MCwweDM0LDB4YTMsMHg3NiwweDM0LDB4YTMsMHhjNiwweDM0LDB4YTMsMHhkOCwweDMzLDB4NWYsMHhiMCwweDAwLDB4YzMsMHhmNgorLDB4MDYsMHg5MywweDM2LDB4MjAsMHg3NSwweDAzLDB4YjAsMHgwNCwweGMzLDB4MjYsMHg4YiwweDRmLDB4MDQsMHg4MywweGY5LDB4MDYKKywweDc0LDB4MTIsMHg4MywweGY5LDB4MDQsMHg3NCwweDBkLDB4ODMsMHhmOSwweDAwLDB4NzQsMHgwOCwweDgzLDB4ZjksMHgwMiwweDc0CissMHgwMywweGIwLDB4MDEsMHhjMywweDg5LDB4MGUsMHhlOCwweDNhLDB4ODMsMHgyNiwweGFiLDB4MzYsMHhmOSwweDA5LDB4MGUsMHhhYgorLDB4MzYsMHhlNSwweDAyLDB4MjUsMHhmOSwweGZmLDB4MGIsMHhjMSwweGU3LDB4MDIsMHhiMCwweDAwLDB4YzMsMHhmNiwweDA2LDB4OTMKKywweDM2LDB4MjAsMHg3NSwweDAzLDB4YjAsMHgwNCwweGMzLDB4MjYsMHg4YiwweDRmLDB4MDQsMHg4MCwweGY5LDB4ZmYsMHg3NCwweDA4CissMHg4MCwweGY5LDB4MDAsMHg3NCwweDEwLDB4YjAsMHgwMSwweGMzLDB4ODMsMHgwZSwweGFkLDB4MzYsMHgwMiwweGExLDB4YWQsMHgzNgorLDB4ZTcsMHgwNCwweGU5LDB4MGEsMHgwMCwweDgzLDB4MjYsMHhhZCwweDM2LDB4ZmQsMHhhMSwweGFkLDB4MzYsMHhlNywweDA0LDB4YjAKKywweDAwLDB4YzMsMHhmNiwweDA2LDB4OTMsMHgzNiwweDIwLDB4NzUsMHgwMywweGIwLDB4MDQsMHhjMywweGU4LDB4ZDUsMHgwNCwweGIwCissMHgwMCwweGMzLDB4ZjYsMHgwNiwweDkzLDB4MzYsMHg4MCwweDc1LDB4MDMsMHhiMCwweDAxLDB4YzMsMHgyNiwweDgzLDB4N2YsMHgwNgorLDB4MDUsMHg3NSwweDAzLDB4ZTksMHg5ZCwweDAwLDB4MjYsMHg4YiwweDU3LDB4MDQsMHgyNiwweDhiLDB4NDcsMHgwOCwweDI2LDB4ODEKKywweDdmLDB4MDYsMHgwMCwweDgwLDB4NzUsMHgwOCwweGVkLDB4MjYsMHg4OSwweDQ3LDB4MGEsMHhlOSwweDlkLDB4MDAsMHgyNiwweDgzCissMHg3ZiwweDA2LDB4MDEsMHg3NSwweDA0LDB4ZWYsMHhlOSwweDkyLDB4MDAsMHgyNiwweDgxLDB4N2YsMHgwNiwweDAxLDB4ODAsMHg3NQorLDB4MDksMHhlZiwweGVkLDB4MjYsMHg4OSwweDQ3LDB4MGEsMHhlOSwweDgxLDB4MDAsMHgyNiwweDgzLDB4N2YsMHgwNiwweDAyLDB4NzUKKywweDA3LDB4MjYsMHgyMSwweDQ3LDB4MDQsMHhlOSwweDczLDB4MDAsMHgyNiwweDgxLDB4N2YsMHgwNiwweDAyLDB4ODAsMHg3NSwweDBjCissMHgyNiwweDIxLDB4NDcsMHgwNCwweGVkLDB4MjYsMHg4OSwweDQ3LDB4MGEsMHhlOSwweDVmLDB4MDAsMHgyNiwweDgzLDB4N2YsMHgwNgorLDB4MDMsMHg3NSwweDA3LDB4MjYsMHgwOSwweDQ3LDB4MDQsMHhlOSwweDUxLDB4MDAsMHgyNiwweDgxLDB4N2YsMHgwNiwweDAzLDB4ODAKKywweDc1LDB4MGMsMHgyNiwweDA5LDB4NDcsMHgwNCwweGVkLDB4MjYsMHg4OSwweDQ3LDB4MGEsMHhlOSwweDNkLDB4MDAsMHgyNiwweDgzCissMHg3ZiwweDA2LDB4MDQsMHg3NSwweDA3LDB4MjYsMHgzMSwweDQ3LDB4MDQsMHhlOSwweDJmLDB4MDAsMHgyNiwweDgxLDB4N2YsMHgwNgorLDB4MDQsMHg4MCwweDc1LDB4MGMsMHgyNiwweDMxLDB4NDcsMHgwNCwweGVkLDB4MjYsMHg4OSwweDQ3LDB4MGEsMHhlOSwweDFiLDB4MDAKKywweGIwLDB4MDEsMHhjMywweGZhLDB4NTMsMHgyNiwweDhiLDB4NGYsMHgwOCwweDBiLDB4YzksMHg3NCwweDBjLDB4OGQsMHgxZSwweGUwCissMHhmZSwweGU4LDB4NTIsMHhmZiwweDgzLDB4YzMsMHgwOCwweGUyLDB4ZjgsMHg1YiwweGZiLDB4YjAsMHgwMCwweGMzLDB4ZjYsMHgwNgorLDB4OTMsMHgzNiwweDgwLDB4NzUsMHgwYSwweGY2LDB4MDYsMHg5MywweDM2LDB4MjAsMHg3NSwweDAzLDB4YjAsMHgwMSwweGMzLDB4OGQKKywweDNlLDB4ZTAsMHhmZSwweGU1LDB4MDAsMHgyNiwweDg5LDB4MDUsMHhlNSwweDAyLDB4MjYsMHg4OSwweDQ1LDB4MDIsMHhhMSwweGFkCissMHgzNiwweDI2LDB4ODksMHg0NSwweDA0LDB4ZTUsMHgwNiwweDI2LDB4ODksMHg0NSwweDA2LDB4ZTUsMHgwOCwweDI2LDB4ODksMHg0NQorLDB4MDgsMHhlNSwweDBhLDB4MjYsMHg4OSwweDQ1LDB4MGEsMHhlNSwweDBlLDB4MjYsMHg4OSwweDQ1LDB4MGMsMHhlNSwweDQ4LDB4MjYKKywweDg5LDB4NDUsMHgwZSwweGU1LDB4NGEsMHgyNiwweDg5LDB4NDUsMHgxMCwweGU1LDB4NGMsMHgyNiwweDg5LDB4NDUsMHgxMiwweGExCissMHhiNywweDM2LDB4MjYsMHg4OSwweDQ1LDB4MTQsMHhlNSwweDUwLDB4MjYsMHg4OSwweDQ1LDB4MTYsMHhlNSwweDUyLDB4MjYsMHg4OQorLDB4NDUsMHgxOCwweGU1LDB4NTQsMHgyNiwweDg5LDB4NDUsMHgxYSwweGU1LDB4NTYsMHgyNiwweDg5LDB4NDUsMHgxYywweGU1LDB4NTgKKywweDI2LDB4ODksMHg0NSwweDFlLDB4ZTUsMHg2MiwweDI2LDB4ODksMHg0NSwweDIwLDB4ZTUsMHg2NCwweDI2LDB4ODksMHg0NSwweDIyCissMHhlNSwweDY2LDB4MjYsMHg4OSwweDQ1LDB4MjQsMHhlNSwweDY4LDB4MjYsMHg4OSwweDQ1LDB4MjYsMHhlNSwweDZhLDB4MjYsMHg4OQorLDB4NDUsMHgyOCwweGU1LDB4NmMsMHgyNiwweDg5LDB4NDUsMHgyYSwweGU1LDB4NzAsMHgyNiwweDg5LDB4NDUsMHgyYywweGU1LDB4NzIKKywweDI2LDB4ODksMHg0NSwweDJlLDB4ZTUsMHg3NCwweDI2LDB4ODksMHg0NSwweDMwLDB4ZTUsMHg3NiwweDI2LDB4ODksMHg0NSwweDMyCissMHhlNSwweDdjLDB4MjYsMHg4OSwweDQ1LDB4MzQsMHhlNSwweDdlLDB4MjYsMHg4OSwweDQ1LDB4MzYsMHhlNSwweDgwLDB4MjYsMHg4OQorLDB4NDUsMHgzOCwweGU1LDB4ODIsMHgyNiwweDg5LDB4NDUsMHgzYSwweGU1LDB4ODYsMHgyNiwweDg5LDB4NDUsMHgzYywweGU1LDB4ODgKKywweDI2LDB4ODksMHg0NSwweDNlLDB4ZTUsMHg5YSwweDI2LDB4ODksMHg0NSwweDQwLDB4ZTUsMHg5ZSwweDI2LDB4ODksMHg0NSwweDQyCissMHhlNSwweGNjLDB4MjYsMHg4OSwweDQ1LDB4NDQsMHhlNSwweGNlLDB4MjYsMHg4OSwweDQ1LDB4NDYsMHhlNSwweGQwLDB4MjYsMHg4OQorLDB4NDUsMHg0OCwweGU1LDB4ZDIsMHgyNiwweDg5LDB4NDUsMHg0YSwweGJhLDB4MDAsMHgwMSwweGVkLDB4MTEsMHgwNiwweDY2LDB4MzQKKywweDczLDB4MDQsMHhmZiwweDA2LDB4NjgsMHgzNCwweDI2LDB4ODksMHg0NSwweDRjLDB4YmEsMHgwMiwweDAxLDB4ZWQsMHhjMSwweGUwCissMHgwMiwweDExLDB4MDYsMHg2ZSwweDM0LDB4NzMsMHgwNCwweGZmLDB4MDYsMHg3MCwweDM0LDB4MjYsMHg4OSwweDQ1LDB4NGUsMHhiYQorLDB4MDQsMHgwMSwweGVkLDB4MTEsMHgwNiwweDZhLDB4MzQsMHg3MywweDA0LDB4ZmYsMHgwNiwweDZjLDB4MzQsMHgyNiwweDg5LDB4NDUKKywweDUwLDB4YmEsMHgwNiwweDAxLDB4ZWQsMHhjMSwweGUwLDB4MDIsMHgxMSwweDA2LDB4NzIsMHgzNCwweDczLDB4MDQsMHhmZiwweDA2CissMHg3NCwweDM0LDB4MjYsMHg4OSwweDQ1LDB4NTIsMHhiYSwweDA4LDB4MDEsMHhlZCwweDI2LDB4ODksMHg0NSwweDU0LDB4YmEsMHgwYQorLDB4MDEsMHhlZCwweDI2LDB4ODksMHg0NSwweDU2LDB4YmEsMHgwYywweDAxLDB4ZWQsMHgyNiwweDg5LDB4NDUsMHg1OCwweGJhLDB4MGUKKywweDAxLDB4ZWQsMHgwMSwweDA2LDB4N2EsMHgzNCwweDI2LDB4ODksMHg0NSwweDVlLDB4YmEsMHgxMCwweDAxLDB4ZWQsMHgyNiwweDg5CissMHg0NSwweDVjLDB4YjAsMHgwMCwweGMzLDB4ZjYsMHgwNiwweDkzLDB4MzYsMHg4MCwweDc0LDB4MDcsMHhmNiwweDA2LDB4OTMsMHgzNgorLDB4MjAsMHg3NSwweDAzLDB4YjAsMHgwMSwweGMzLDB4MjYsMHg4MCwweDdmLDB4MDYsMHgwMCwweDc1LDB4MzAsMHg4MCwweDNlLDB4OTUKKywweDM2LDB4MDAsMHg3NCwweDUyLDB4YzYsMHgwNiwweDk1LDB4MzYsMHgwMCwweDgzLDB4MjYsMHhhZCwweDM2LDB4ZmUsMHhhMSwweGFkCissMHgzNiwweGU3LDB4MDQsMHhiYSwweDEwLDB4MDEsMHhiOCwweDgwLDB4ODAsMHhlZiwweGVkLDB4YmEsMHgxMCwweDAxLDB4YjgsMHgwMgorLDB4MDIsMHhlZiwweGVkLDB4YmEsMHhlMCwweDAwLDB4YjgsMHgwMCwweDEwLDB4ZWYsMHhiMCwweDAwLDB4YzMsMHgyNiwweDhiLDB4NDcKKywweDA0LDB4M2QsMHgwMCwweDAwLDB4NzQsMHgyMCwweDNkLDB4MDMsMHgwMCwweDc3LDB4MWIsMHhiYSwweDEwLDB4MDEsMHhiOCwweDAyCissMHgwMCwweGVmLDB4YmEsMHhlMCwweDAwLDB4YjgsMHgwMSwweDEwLDB4ZWYsMHg4MywweDBlLDB4YWQsMHgzNiwweDAxLDB4YTEsMHhhZAorLDB4MzYsMHhlNywweDA0LDB4YjAsMHgwMCwweGMzLDB4YjAsMHgwNiwweGMzLDB4ZjYsMHgwNiwweDkzLDB4MzYsMHg4MCwweDc1LDB4MDMKKywweGIwLDB4MDEsMHhjMywweDI2LDB4ODMsMHg3ZiwweDA0LDB4MDEsMHg3NCwweDBhLDB4MjYsMHg4MywweDdmLDB4MDQsMHgwMiwweDc0CissMHgxOSwweGIwLDB4MDYsMHhjMywweDI2LDB4ODMsMHg3ZiwweDA2LDB4MGMsMHg3NywweGY2LDB4MjYsMHg4MywweDdmLDB4MGEsMHg2MAorLDB4NzcsMHhlZiwweGU4LDB4MTAsMHgwMCwweDcyLDB4MGIsMHhiMCwweDQ2LDB4YzMsMHhlOCwweDRlLDB4MDAsMHg3MiwweDAzLDB4YjAKKywweDQ2LDB4YzMsMHhiMCwweDAwLDB4YzMsMHg1MSwweGIxLDB4MGEsMHg4YiwweDNlLDB4MjAsMHhmMywweDI2LDB4ODMsMHg3ZCwweDBjCissMHgwMiwweDc1LDB4MDMsMHhlOSwweDBlLDB4MDAsMHhmZSwweGM5LDB4NzQsMHgwNywweDgxLDB4YzcsMHgyMCwweDAxLDB4ZTksMHhlYgorLDB4ZmYsMHg1OSwweGY4LDB4YzMsMHg1NywweDhkLDB4N2QsMHgwZSwweDhkLDB4NzcsMHgwNiwweGI5LDB4MTIsMHgwMCwweGYzLDB4YTQKKywweDhkLDB4N2QsMHgyMCwweDhkLDB4MzYsMHhlMCwweGZlLDB4MjYsMHg4YiwweDRkLDB4MTIsMHhmMywweGE0LDB4ZmYsMHgwNiwweDAxCissMHgzNSwweDVmLDB4MjYsMHhjNywweDQ1LDB4MGMsMHgwMSwweDAwLDB4NTksMHhmOSwweGMzLDB4NTEsMHhiMSwweDBhLDB4OGQsMHgzZQorLDB4MjAsMHhmMywweDhkLDB4MzYsMHhlMCwweGZlLDB4MjYsMHg4MywweDdkLDB4MGMsMHgwMSwweDc1LDB4MWIsMHg1NywweGU4LDB4MjUKKywweDAwLDB4NWYsMHg3MywweDE0LDB4MzMsMHhjMCwweGI5LDB4MjAsMHgwMSwweGYzLDB4YWEsMHgyNiwweGM3LDB4NDUsMHgwYywweDAyCissMHgwMCwweGZmLDB4MGUsMHgwMSwweDM1LDB4NTksMHhmOSwweGMzLDB4ZmUsMHhjOSwweDc0LDB4MDcsMHg4MSwweGM3LDB4MjAsMHgwMQorLDB4ZTksMHhkMywweGZmLDB4NTksMHhmOCwweGMzLDB4NTEsMHgyNiwweDhiLDB4NGQsMHgxMiwweDhkLDB4N2QsMHgyMCwweGYzLDB4YTYKKywweDc0LDB4MDMsMHg1OSwweGY4LDB4YzMsMHg1OSwweGY5LDB4YzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHg4MCwweDNlLDB4ZWMsMHgzNCwweDA2LDB4NzIsMHgzMywweGZmLDB4MDYsMHhmMCwweDMzLDB4NTAsMHhjNCwweDFlLDB4OGMsMHgzNgorLDB4YjksMHgwZiwweDAwLDB4MzMsMHhjMCwweGU4LDB4MjksMHgwMCwweDU4LDB4ODEsMHgyNiwweGMyLDB4MzQsMHhkZiwweDdmLDB4ODEKKywweDI2LDB4ZTksMHgzNCwweGRmLDB4N2YsMHgwYiwweGRiLDB4NzQsMHgxMSwweDI2LDB4YzYsMHgwNywweDg0LDB4MjYsMHhjNiwweDQ3CissMHgwMiwweGZmLDB4MjYsMHg4OSwweDQ3LDB4MDYsMHhlOCwweGFjLDB4MDAsMHhjMywweGZmLDB4MDYsMHhlYSwweDMzLDB4ZTksMHhmNQorLDB4ZmYsMHg1NywweDI2LDB4OGIsMHgzZiwweDAzLDB4ZjksMHgyNiwweDNiLDB4N2YsMHgwMiwweDc0LDB4MTYsMHgyNiwweDNiLDB4N2YKKywweDA0LDB4N2MsMHgyYSwweDNkLDB4MDAsMHgwMCwweDc1LDB4MTMsMHg4ZCwweDdmLDB4MDgsMHgwMywweGY5LDB4MjYsMHgzYiwweDdmCissMHgwMiwweDdjLDB4MTQsMHhmZiwweDA2LDB4ZGUsMHgzMywweDMzLDB4ZGIsMHg1ZiwweGMzLDB4MjYsMHg4YiwweDdmLDB4MDIsMHgyNgorLDB4ODksMHgzZiwweDAzLDB4ZjksMHhlOSwweDA2LDB4MDAsMHgyNiwweDg5LDB4M2YsMHgyNiwweDI5LDB4MGYsMHgyNiwweGM3LDB4MDUKKywweGZmLDB4ZmYsMHgyNiwweDg3LDB4M2YsMHgyNiwweDg5LDB4MGQsMHg4ZCwweDVkLDB4MDIsMHg1MCwweDhiLDB4ZmIsMHg4MywweGU5CissMHgwMiwweDMzLDB4YzAsMHhmMywweGFhLDB4NTgsMHhmZSwweDBlLDB4ZWMsMHgzNCwweDVmLDB4YzMsMHg4YiwweDdjLDB4MDIsMHgzYgorLDB4M2MsMHg3NCwweDJmLDB4ODMsMHgzZCwweGZmLDB4NzUsMHgwYiwweDhkLDB4N2MsMHgwOCwweDg5LDB4N2MsMHgwMiwweDgzLDB4M2QKKywweGZmLDB4NzQsMHgxZSwweDhhLDB4NDUsMHgwMiwweDNjLDB4ODEsMHg3NSwweDBjLDB4ODAsMHgzZSwweGViLDB4MzQsMHgwMCwweDc0CissMHgwNSwweDMzLDB4YzAsMHhlOSwweDBiLDB4MDAsMHg4YiwweDBkLDB4MDEsMHg0YywweDAyLDB4OGQsMHg3NSwweDAyLDB4ODMsMHhlOQorLDB4MDIsMHhjMywweDgwLDB4M2UsMHhlYywweDM0LDB4MDYsMHg3MiwweDA1LDB4MzMsMHhjMCwweGU5LDB4ZjMsMHhmZiwweGZmLDB4MDYKKywweGVlLDB4MzMsMHhlOSwweGJlLDB4ZmYsMHhmNiwweDA2LDB4OTIsMHgzNiwweDQwLDB4NzQsMHgwMSwweGMzLDB4NTcsMHg1NiwweDUxCissMHg1MiwweDhiLDB4MzYsMHg4YywweDM2LDB4ZTgsMHhhNCwweGZmLDB4NzUsMHgwMywweGU5LDB4MWEsMHgwMCwweGU5LDB4MWMsMHgwMAorLDB4ZmUsMHgwNiwweGVjLDB4MzQsMHhjNCwweDNlLDB4ODAsMHgzNiwweGYzLDB4YTQsMHg4MCwweDBlLDB4OTIsMHgzNiwweDQwLDB4YmEKKywweDBjLDB4MDEsMHhiOCwweDgwLDB4ODAsMHhlZiwweGVkLDB4NWEsMHg1OSwweDVlLDB4NWYsMHhjMywweGZmLDB4MDYsMHhlMCwweDMzCissMHg4MCwweDNjLDB4ODEsMHg3NSwweDBjLDB4ZmYsMHgwNiwweGUyLDB4MzMsMHhjNiwweDA2LDB4ZWIsMHgzNCwweDAxLDB4ZTksMHhjZgorLDB4ZmYsMHg4MCwweDNjLDB4ODQsMHg3NSwweDA3LDB4ZmYsMHgwNiwweGU2LDB4MzMsMHhlOSwweGMzLDB4ZmYsMHhmZiwweDA2LDB4ZTgKKywweDMzLDB4ZTksMHhiYywweGZmLDB4OGQsMHgzZSwweGUwLDB4ZmUsMHhhMSwweDcyLDB4MzQsMHhjNywweDA2LDB4NzIsMHgzNCwweDAwCissMHgwMCwweDg5LDB4MDUsMHhhMSwweDc0LDB4MzQsMHhjNywweDA2LDB4NzQsMHgzNCwweDAwLDB4MDAsMHg4OSwweDQ1LDB4MDIsMHhiYQorLDB4MDQsMHgwMSwweGVkLDB4ODksMHg0NSwweDA0LDB4YzcsMHg0NSwweDA2LDB4MDAsMHgwMCwweGExLDB4NmUsMHgzNCwweGM3LDB4MDYKKywweDZlLDB4MzQsMHgwMCwweDAwLDB4ODksMHg0NSwweDA4LDB4YTEsMHg3MCwweDM0LDB4YzcsMHgwNiwweDcwLDB4MzQsMHgwMCwweDAwCissMHg4OSwweDQ1LDB4MGEsMHhiYSwweDAwLDB4MDEsMHhlZCwweDg5LDB4NDUsMHgwYywweGM3LDB4NDUsMHgwZSwweDAwLDB4MDAsMHgzMgorLDB4ZTQsMHhiYSwweDBlLDB4MDEsMHhlYywweDg5LDB4NDUsMHgxMCwweGExLDB4N2UsMHgzNCwweGM3LDB4MDYsMHg3ZSwweDM0LDB4MDAKKywweDAwLDB4ODksMHg0NSwweDEyLDB4YTEsMHg4YywweDM0LDB4YzcsMHgwNiwweDhjLDB4MzQsMHgwMCwweDAwLDB4ODksMHg0NSwweDE0CissMHhhMSwweDhhLDB4MzQsMHhjNywweDA2LDB4OGEsMHgzNCwweDAwLDB4MDAsMHg4OSwweDQ1LDB4MTYsMHhhMSwweDdjLDB4MzQsMHhjNworLDB4MDYsMHg3YywweDM0LDB4MDAsMHgwMCwweDg5LDB4NDUsMHgxOCwweGExLDB4ODgsMHgzNCwweGM3LDB4MDYsMHg4OCwweDM0LDB4MDAKKywweDAwLDB4ODksMHg0NSwweDFhLDB4YTEsMHhjYSwweDMzLDB4YzcsMHgwNiwweGNhLDB4MzMsMHgwMCwweDAwLDB4ODksMHg0NSwweDFjCissMHhhMSwweDc4LDB4MzQsMHhjNywweDA2LDB4NzgsMHgzNCwweDAwLDB4MDAsMHg4OSwweDQ1LDB4MWUsMHhhMSwweGM2LDB4MzQsMHhjNworLDB4MDYsMHhjNiwweDM0LDB4MDAsMHgwMCwweDg5LDB4NDUsMHgyMCwweGMzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweGZhLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHg4ZSwweGMwLDB4YjgsMHhhMCwweDAxLDB4YzEsMHhlOCwweDA0LDB4OGUsMHhkMCwweDhkCissMHgyNiwweDgwLDB4MDAsMHhlOCwweDAwLDB4MDEsMHhlOCwweDEwLDB4ZWIsMHg4YiwweDFlLDB4ZjcsMHgzNCwweDhiLDB4MTYsMHhmOQorLDB4MzQsMHg4YiwweDM2LDB4ZmYsMHgzNCwweDMzLDB4YzAsMHhiOSwweGVmLDB4ZmYsMHg4ZCwweDNlLDB4MTQsMHgwMCwweDJiLDB4Y2YKKywweDJiLDB4Y2UsMHhkMSwweGU5LDB4ZjMsMHhhYiwweDg5LDB4MWUsMHhmNywweDM0LDB4ODksMHgxNiwweGY5LDB4MzQsMHg4MywweGZlCissMHgwMCwweDc0LDB4MGMsMHhiOSwweGVmLDB4ZmYsMHhiZiwweDgwLDB4ZmUsMHgyYiwweGNmLDB4ZDEsMHhlOSwweGYzLDB4YWIsMHhiOQorLDB4ZmYsMHhmZiwweDgxLDB4ZTksMHgwMCwweDNiLDB4ODMsMHhmZSwweDAwLDB4NzQsMHgwMywweGU5LDB4MWIsMHgwMCwweDUxLDB4MWUKKywweGI4LDB4MDAsMHhlMCwweDhlLDB4ZDgsMHgzMywweGY2LDB4OGQsMHgzZSwweDAwLDB4ZDgsMHhiOSwweDAwLDB4MGMsMHhmMywweGE1CissMHgxZiwweDU5LDB4YmUsMHhmZiwweGZmLDB4ODEsMHhlZSwweDAwLDB4ZDgsMHgyYiwweGNlLDB4ODEsMHhlMSwweDAwLDB4ZmYsMHg4OQorLDB4MGUsMHhhYywweDMzLDB4OGQsMHgwNiwweDIwLDB4MDIsMHhjMSwweGU4LDB4MDQsMHhhMywweDMyLDB4MzQsMHg4ZSwweGQwLDB4MzYKKywweGM3LDB4MDYsMHgxZSwweDAwLDB4ODAsMHgxOCwweDM2LDB4YzcsMHgwNiwweDIyLDB4MDAsMHhmZiwweDdmLDB4MzYsMHhjNywweDA2CissMHgwYSwweDAwLDB4ZmYsMHhmZiwweDM2LDB4YzcsMHgwNiwweDFjLDB4MDAsMHg4MCwweDAwLDB4OGQsMHgwNiwweGEwLDB4MDIsMHhjMQorLDB4ZTgsMHgwNCwweGEzLDB4MzAsMHgzNCwweDhlLDB4ZDAsMHgzNiwweGM3LDB4MDYsMHgxZSwweDAwLDB4NTAsMHgyOCwweDM2LDB4YzcKKywweDA2LDB4MGEsMHgwMCwweGZmLDB4ZmYsMHgzNiwweGM3LDB4MDYsMHgxYywweDAwLDB4ODAsMHgwMCwweGI4LDB4YTAsMHgwMSwweGMxCissMHhlOCwweDA0LDB4YTMsMHgzNCwweDM0LDB4YTMsMHhmMiwweDMzLDB4OGUsMHhkMCwweDhkLDB4MjYsMHg4MCwweDAwLDB4YjgsMHgwMAorLDB4OTAsMHhlNywweDAyLDB4OGQsMHgzZSwweDcwLDB4MDEsMHg4YiwweGM3LDB4YzEsMHhlOCwweDA0LDB4YjksMHgwMywweDAwLDB4ODkKKywweDQ1LDB4MGUsMHg4OSwweDQ1LDB4MDIsMHhjNywweDA1LDB4ZmYsMHhmZiwweDgzLDB4YzcsMHgxMCwweDA1LDB4MDEsMHgwMCwweGUyCissMHhlZSwweGU4LDB4NWIsMHgwMSwweGU1LDB4Y2UsMHhhMywweGI1LDB4MzYsMHhlOCwweDIxLDB4MDAsMHhlOCwweDQ1LDB4MDEsMHhhMQorLDB4MzIsMHgzNCwweDhjLDB4Y2IsMHhjZCwweDM3LDB4MGUsMHg1OCwweGE5LDB4MDAsMHhmMCwweDc0LDB4MDcsMHgzMywweGY2LDB4ODkKKywweDM2LDB4ZmYsMHgzNCwweGMzLDB4OGQsMHgzNiwweDMwLDB4NjEsMHg4OSwweDM2LDB4ZmYsMHgzNCwweGMzLDB4MzMsMHhjMCwweDhiCissMHhkMCwweDhiLDB4ZjIsMHhiOSwweDY4LDB4MDAsMHgyZSwweDgwLDB4YmMsMHhhYywweDE3LDB4ODAsMHg3NSwweDAxLDB4ZWYsMHg4MworLDB4YzIsMHgwMiwweDQ2LDB4ZTIsMHhmMSwweGI4LDB4MDIsMHgwMCwweGU3LDB4NTAsMHhiOSwweDVhLDB4MDAsMHgzMywweGZmLDB4YzcKKywweDA1LDB4NjUsMHgxOCwweDhjLDB4NGQsMHgwMiwweDgzLDB4YzcsMHgwNCwweGUyLDB4ZjQsMHgzMywweGMwLDB4OGUsMHhjMCwweDhjCissMHhjOCwweDhlLDB4ZDgsMHg4ZCwweDNlLDB4ODAsMHgwMCwweDhkLDB4MzYsMHg5YywweDE3LDB4YjksMHgwOCwweDAwLDB4ZTgsMHgzNworLDB4MDAsMHg4ZCwweDM2LDB4MjAsMHgyMSwweDhkLDB4M2UsMHhjMCwweDAwLDB4YjksMHgwZCwweDAwLDB4ZTgsMHgyOSwweDAwLDB4OGQKKywweDNlLDB4NDAsMHgwMSwweGI5LDB4MGEsMHgwMCwweGU4LDB4MWYsMHgwMCwweGU4LDB4NGIsMHgwZSwweDMzLDB4YzAsMHg4ZSwweGQ4CissMHhjNywweDA2LDB4NGUsMHgzNywweDZmLDB4MTcsMHhlNywweDQ4LDB4ZTcsMHg0YywweGI4LDB4NDAsMHg5YywweGU3LDB4NGEsMHhlNQorLDB4NDgsMHg5MCwweGI4LDB4MDAsMHg3MCwweGU3LDB4NDgsMHhjMywweGE1LDB4ODMsMHhjNywweDAyLDB4ZTIsMHhmYSwweGMzLDB4ZTUKKywweDRjLDB4YzMsMHg1MCwweDUxLDB4NTYsMHg1NywweDUyLDB4MDYsMHgxZSwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4ZTUsMHg1OCwweGQxCissMHhlMCwweDczLDB4MTEsMHg4YiwweGYwLDB4ZDEsMHhlNiwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4OGIsMHhiNCwweDgwLDB4MDAsMHg4MworLDB4YzYsMHgwYiwweGZmLDB4ZTYsMHgxZiwweDA3LDB4NWEsMHg1ZiwweDVlLDB4NTksMHg1OCwweGNmLDB4NTgsMHgxYywweGU0LDB4MWMKKywweDZjLDB4MWMsMHg4ZSwweDFhLDB4YzAsMHgxZiwweDQwLDB4MWEsMHg0NCwweDFjLDB4NjUsMHgxOCwweDgwLDB4ODAsMHg4MCwweGZmCissMHg4MCwweDAzLDB4MDIsMHg4MCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZgorLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYKKywweDgwLDB4MDMsMHgwMywweDQzLDB4ODAsMHg4MCwweDAyLDB4ODAsMHg0MiwweDAzLDB4MDIsMHhmZiwweDAzLDB4MDEsMHgwMywweDAxCissMHgwMSwweDAzLDB4MDIsMHgwMywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwMiwweDAzLDB4MDEsMHgwMworLDB4MDMsMHhmZiwweDAxLDB4MDEsMHhmZiwweDAxLDB4ZmYsMHgwMSwweDAxLDB4MDMsMHgwMywweDAzLDB4ZmYsMHhmZiwweGZmLDB4ZmYKKywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmCissMHhmZiwweGZmLDB4ZmYsMHgwMiwweGI4LDB4MGYsMHgwMCwweGU3LDB4ODQsMHhiOCwweDBmLDB4ZjgsMHhlNywweDgyLDB4YzMsMHhiOQorLDB4MDgsMHgwMCwweDg5LDB4MGUsMHhlNiwweDNhLDB4OGQsMHgwNiwweDIwLDB4MDMsMHg4YiwweGQwLDB4YzEsMHhlOCwweDA0LDB4YTMKKywweDkwLDB4MDEsMHg4YiwweGMyLDB4OGIsMHhkOCwweGMxLDB4ZTgsMHgwNCwweDhlLDB4YzAsMHgwNSwweDYxLDB4MDAsMHgyNiwweGEzCissMHgwMCwweDAwLDB4YTEsMHgzMCwweDM0LDB4MjYsMHhhMywweDAyLDB4MDAsMHg4MywweGMzLDB4MTQsMHhkMSwweGViLDB4MjYsMHg4OQorLDB4MWUsMHgwOCwweDAwLDB4ODEsMHhjMiwweDEwLDB4MDYsMHhlMiwweGQ5LDB4MjYsMHhjNywweDA2LDB4MDAsMHgwMCwweGZmLDB4ZmYKKywweDhjLDB4MDYsMHg5MiwweDAxLDB4YzMsMHg1MCwweDUxLDB4NTYsMHg1NywweDUyLDB4MDYsMHgxZSwweDMzLDB4YzAsMHg4ZSwweGQ4CissMHhlNywweDVhLDB4ZmYsMHgwNiwweGJlLDB4MzMsMHhiYSwweGQyLDB4MDAsMHhlZCwweGNmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4OGMsMHhjYiwweGExLDB4MzAsMHgzNCwweGNkLDB4MzcsMHhlOSwweDA2LDB4ZWQsMHhiOCwweDMyLDB4MDAsMHhjMywweGU4LDB4OGMKKywweDAxLDB4ZmUsMHgwNiwweGUyLDB4MzQsMHhlOCwweDIxLDB4MDEsMHg3NSwweGYwLDB4ZTgsMHg1MywweDBlLDB4ODEsMHgwZSwweGFmCissMHgzNiwweDAwLDB4YzAsMHhjNywweDA2LDB4YWQsMHgzNiwweDYwLDB4MDAsMHhmNywweDA2LDB4ZTYsMHgzNCwweDgwLDB4MDAsMHg3NQorLDB4MWEsMHhmNywweDA2LDB4ZTYsMHgzNCwweDAwLDB4MDgsMHg3NCwweDA5LDB4YzcsMHgwNiwweGFiLDB4MzYsMHgwYiwweDAwLDB4ZTkKKywweDBmLDB4MDAsMHhjNywweDA2LDB4YWIsMHgzNiwweDAzLDB4MDAsMHhlOSwweDA2LDB4MDAsMHhjNywweDA2LDB4YWIsMHgzNiwweDExCissMHg5YywweGM3LDB4MDYsMHhhOSwweDM2LDB4MTgsMHgwMCwweGY3LDB4MDYsMHhlNiwweDM0LDB4ODAsMHgwMCwweDc1LDB4MGQsMHhmNworLDB4MDYsMHhiNSwweDM2LDB4MDIsMHgwMCwweDc0LDB4MDUsMHg4MywweDBlLDB4YTksMHgzNiwweDIwLDB4YTEsMHhhOSwweDM2LDB4ZTcKKywweDAwLDB4YTEsMHhhYiwweDM2LDB4ZTcsMHgwMiwweGY3LDB4MDYsMHhlNiwweDM0LDB4ODAsMHgwMCwweDc0LDB4MmUsMHhlOCwweGYyCissMHgyZiwweDMzLDB4YzAsMHgwZCwweDQxLDB4MDAsMHhlNywweDU2LDB4YTEsMHhiMSwweDM2LDB4MGQsMHgwMCwweDEwLDB4ZTcsMHgwOAorLDB4YTEsMHhiMywweDM2LDB4ZTcsMHgwYSwweGExLDB4YWYsMHgzNiwweGU3LDB4MDYsMHhiOCwweDQwLDB4MDAsMHhlNywweDRlLDB4MzMKKywweGMwLDB4ZTcsMHgwZSwweGM3LDB4MDYsMHgyNiwweDAyLDB4MDAsMHgwMCwweGU5LDB4MjMsMHgwMCwweGM3LDB4MDYsMHg0ZSwweDM3CissMHgzZiwweDIwLDB4OGUsMHgwNiwweDMwLDB4MzQsMHgyNiwweGY3LDB4MDYsMHgwYSwweDAwLDB4MDAsMHg4MCwweDc0LDB4MDcsMHgyNgorLDB4ODEsMHgwZSwweDA4LDB4MDAsMHgwMCwweDgwLDB4YzYsMHgwNiwweGUwLDB4MzQsMHgwMSwweGI4LDB4MDAsMHgwMCwweGMzLDB4ZmUKKywweDA2LDB4ZTEsMHgzNCwweGM2LDB4MDYsMHhlMCwweDM0LDB4MDAsMHhhMSwweDI2LDB4MDIsMHgwYiwweGMwLDB4NzQsMHgwMSwweGMzCissMHhlOCwweDA0LDB4MDAsMHhiOCwweDAwLDB4MDAsMHhjMywweGExLDB4YTksMHgzNiwweGU3LDB4MDAsMHg4YiwweDFlLDB4YWIsMHgzNgorLDB4ODMsMHhlMywweDA2LDB4ZTUsMHgwMiwweDI1LDB4ZjksMHhmZiwweDBiLDB4YzMsMHgwZCwweDEwLDB4MDAsMHhlNywweDAyLDB4YTEKKywweGFkLDB4MzYsMHhlNywweDA0LDB4YzMsMHhiOCwweDBhLDB4MDAsMHhlNywweDg0LDB4ZmUsMHgwNiwweGU1LDB4MzQsMHhjNiwweDA2CissMHhlMywweDM0LDB4MDEsMHg4ZSwweDA2LDB4MzAsMHgzNCwweDI2LDB4ZjcsMHgwNiwweDBhLDB4MDAsMHgwMCwweDQwLDB4NzQsMHgwNworLDB4MjYsMHg4MSwweDBlLDB4MDgsMHgwMCwweDAwLDB4NDAsMHhjMywweGM3LDB4MDYsMHg0ZSwweDM3LDB4NmYsMHgxNywweGZlLDB4MDYKKywweGU0LDB4MzQsMHhjNiwweDA2LDB4ZTMsMHgzNCwweDAwLDB4YzMsMHhjMywweGY2LDB4MDYsMHgxOCwweDM0LDB4ODAsMHg3NSwweDBkCissMHhhMSwweDE4LDB4MzQsMHgwYiwweDA2LDB4MWEsMHgzNCwweDBiLDB4MDYsMHgxYywweDM0LDB4NzUsMHgwMSwweGMzLDB4YTEsMHgyZQorLDB4MzQsMHgyNSwweGZmLDB4ZmUsMHg4YiwweDE2LDB4ZTcsMHgzNiwweDgxLDB4ZTIsMHgwMCwweDAxLDB4MGIsMHhjMiwweGEzLDB4MmUKKywweDM0LDB4OGQsMHgxNiwweDEwLDB4MDAsMHhiZiwweDAwLDB4MDAsMHhiOSwweDA4LDB4MDAsMHg4YiwweDg1LDB4MDAsMHgzNCwweGVmCissMHg4MywweGMyLDB4MTAsMHg4YiwweDg1LDB4MDIsMHgzNCwweGVmLDB4ODMsMHhjMiwweDEwLDB4OGIsMHg4NSwweDA0LDB4MzQsMHhlZgorLDB4ODMsMHhjMiwweGUyLDB4ODMsMHhjNywweDA2LDB4NDksMHg3NSwweGUyLDB4YjgsMHgwMCwweDAwLDB4OGUsMHhjMCwweGJlLDB4MDAKKywweDM0LDB4YmYsMHhiOSwweDM2LDB4YjksMHgxOCwweDAwLDB4ZjMsMHhhNSwweGI4LDB4MDAsMHgwMCwweGMzLDB4MzMsMHhjMCwweDhlCissMHhjMCwweDhkLDB4M2UsMHhiMCwweDMzLDB4YjksMHgwOCwweDAwLDB4ZjMsMHhhYiwweDhkLDB4M2UsMHgzZSwweDM0LDB4YjksMHgwMworLDB4MDAsMHhmMywweGFiLDB4YzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDUwLDB4NTEsMHg1NiwweDU3LDB4NTIsMHgwNiwweDFlLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHhlNywweDVhLDB4ZmYsMHgwNiwweGJhCissMHgzMywweGU1LDB4NTYsMHgwZCwweDIwLDB4MDAsMHhlNywweDU2LDB4YmEsMHg3YSwweDAwLDB4ZWQsMHgwOCwweDI2LDB4OTQsMHgzNgorLDB4MzMsMHhjMCwweGIxLDB4MDgsMHgzMiwweGVkLDB4MDYsMHg4ZSwweGMwLDB4OGQsMHgzZSwweGUwLDB4ZmYsMHhmMywweGFhLDB4OGUKKywweDA2LDB4MzIsMHgzNCwweDI2LDB4ODEsMHgwZSwweDA4LDB4MDAsMHgwMCwweDAyLDB4MDcsMHhlNSwweDU2LDB4MjUsMHhkZiwweGZmCissMHhlNywweDU2LDB4ZTksMHhmOCwweGZjLDB4MDAsMHhiZCwweDFiLDB4MTAsMHgxYiwweGQ5LDB4MWEsMHhmMywweDFhLDB4NTAsMHg1MQorLDB4NTYsMHg1NywweDUyLDB4MDYsMHgxZSwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4ZTcsMHg1YSwweGZmLDB4MDYsMHhiNiwweDMzLDB4NTMKKywweDA2LDB4NTEsMHhlNSwweDgwLDB4YTMsMHhiNCwweDMzLDB4OGIsMHhkOCwweDhiLDB4YzgsMHgyNSwweDEwLDB4MDAsMHhhMywweGVkCissMHgzNCwweDBiLDB4YzAsMHg3NCwweDE0LDB4ZmYsMHgwNiwweDgwLDB4MzQsMHg4MCwweDNlLDB4ZmUsMHgzNCwweDAwLDB4NzQsMHgwMworLDB4ZTksMHgwNiwweDAwLDB4YjgsMHg4MCwweDAwLDB4ZTgsMHg5ZCwweDA0LDB4ODMsMHhlMywweDAzLDB4ZDEsMHhlMywweDJlLDB4ZmYKKywweDk3LDB4ODYsMHgxYSwweDU5LDB4MDcsMHg1YiwweGU5LDB4YTQsMHhmYywweGJhLDB4MjAsMHgwMCwweDhlLDB4MDYsMHgzYywweDM0CissMHg4MywweDNlLDB4M2MsMHgzNCwweDAwLDB4NzUsMHgwMywweGU5LDB4ZjAsMHgwMCwweGM3LDB4MDYsMHgzYywweDM0LDB4MDAsMHgwMAorLDB4ZTksMHgyYSwweDAwLDB4YmEsMHgxMCwweDAwLDB4OGUsMHgwNiwweDNhLDB4MzQsMHg4MywweDNlLDB4M2EsMHgzNCwweDAwLDB4NzUKKywweDAzLDB4ZTksMHhkNSwweGZmLDB4YzcsMHgwNiwweDNhLDB4MzQsMHgwMCwweDAwLDB4ZTgsMHgxMCwweDAwLDB4ZTksMHhjOSwweGZmCissMHhiYSwweDEwLDB4MDAsMHg4ZSwweDA2LDB4M2EsMHgzNCwweGM3LDB4MDYsMHgzYSwweDM0LDB4MDAsMHgwMCwweDI2LDB4YTEsMHgxNAorLDB4MDAsMHgyNiwweGEzLDB4MGMsMHgwMCwweDI2LDB4YTEsMHgxNiwweDAwLDB4MjYsMHhhMywweDBlLDB4MDAsMHgyNiwweGM2LDB4MDYKKywweDBhLDB4MDAsMHgwMCwweGMxLDB4ZWEsMHgwMiwweDIzLDB4ZDEsMHg3NCwweDFjLDB4YmEsMHgyMCwweDAwLDB4MjYsMHhjNywweDA2CissMHgwZSwweDAwLDB4ZWEsMHgwNSwweDI2LDB4MGIsMHgxNiwweDBjLDB4MDAsMHgyNiwweDg5LDB4MTYsMHgwYywweDAwLDB4ZmYsMHgwNgorLDB4ODYsMHgzNCwweGZmLDB4MDYsMHhkYywweDMzLDB4MjYsMHhhMSwweDBjLDB4MDAsMHhhOSwweDAwLDB4MzcsMHg3NCwweDE2LDB4MjYKKywweGM2LDB4MDYsMHgwYSwweDAwLDB4MDIsMHhhOSwweDAwLDB4MzAsMHg3NCwweDA0LDB4ZmYsMHgwNiwweDdhLDB4MzQsMHhmZiwweDA2CissMHhkYSwweDMzLDB4ZTksMHg0OSwweDAwLDB4YzAsMHhlYywweDA3LDB4ODMsMHgxNiwweDhhLDB4MzQsMHgwMCwweDI0LDB4MDcsMHgzYworLDB4MDcsMHg3NSwweDA0LDB4ZmYsMHgwNiwweDhjLDB4MzQsMHhmZiwweDA2LDB4N2UsMHgzNCwweGExLDB4MzAsMHgzNCwweDhjLDB4YzMKKywweDhlLDB4YzAsMHg4ZSwweGRiLDB4MjYsMHg4MywweDBlLDB4MDgsMHgwMCwweDQwLDB4OGMsMHhkOCwweDI2LDB4ODcsMHgwNiwweDE2CissMHgwMCwweDI2LDB4ODMsMHgzZSwweDE0LDB4MDAsMHhmZiwweDc0LDB4MGEsMHg4ZSwweGMwLDB4MjYsMHg4YywweDFlLDB4MDAsMHgwMAorLDB4ZTksMHgwNSwweDAwLDB4MjYsMHg4YywweDFlLDB4MTQsMHgwMCwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4YzMsMHhjMywweDhjLDB4YzAKKywweDg3LDB4MDYsMHg5MiwweDAxLDB4M2QsMHhmZiwweGZmLDB4NzQsMHgwZCwweDhlLDB4ZDgsMHg4YywweDA2LDB4MDAsMHgwMCwweDMzCissMHhjMCwweDhlLDB4ZDgsMHhlOSwweDA0LDB4MDAsMHg4YywweDA2LDB4OTAsMHgwMSwweGU4LDB4MDEsMHgwMCwweGMzLDB4MDYsMHg4MworLDB4M2UsMHg5MCwweDAxLDB4ZmYsMHg3NCwweDI5LDB4ODMsMHgzZSwweDNhLDB4MzQsMHgwMCwweDc1LDB4MTEsMHhiYSwweDg2LDB4MDAKKywweGU4LDB4MWUsMHgwMCwweDhjLDB4MDYsMHgzYSwweDM0LDB4ODMsMHgzZSwweDkwLDB4MDEsMHhmZiwweDc0LDB4MTEsMHg4MywweDNlCissMHgzYywweDM0LDB4MDAsMHg3NSwweDBhLDB4YmEsMHg4OCwweDAwLDB4ZTgsMHgwNiwweDAwLDB4OGMsMHgwNiwweDNjLDB4MzQsMHgwNworLDB4YzMsMHhhMSwweDkwLDB4MDEsMHg4ZSwweGMwLDB4MjYsMHhhMSwweDA4LDB4MDAsMHhlZiwweDI2LDB4YTEsMHgwMCwweDAwLDB4MjYKKywweGM3LDB4MDYsMHgwMCwweDAwLDB4ZmYsMHhmZiwweGEzLDB4OTAsMHgwMSwweDNkLDB4ZmYsMHhmZiwweDc1LDB4MDMsMHhhMywweDkyCissMHgwMSwweDgzLDB4M2UsMHhlZCwweDM0LDB4MDAsMHg3NCwweDBiLDB4YjgsMHgxMCwweDAwLDB4ZTcsMHg4NCwweGM3LDB4MDYsMHhlZAorLDB4MzQsMHgwMCwweDAwLDB4YzMsMHg1MCwweDUxLDB4NTYsMHg1NywweDUyLDB4MDYsMHgxZSwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4ZTcKKywweDVhLDB4ZmYsMHgwNiwweGJjLDB4MzMsMHhlOSwweDI1LDB4ZmIsMHg1MCwweDUxLDB4NTYsMHg1NywweDUyLDB4MDYsMHgxZSwweDMzCissMHhjMCwweDhlLDB4ZDgsMHhlNywweDVhLDB4ZmYsMHgwNiwweGIwLDB4MzMsMHhlOSwweDExLDB4ZmIsMHg1MCwweDUxLDB4NTYsMHg1NworLDB4NTIsMHgwNiwweDFlLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHhlNywweDVhLDB4ZmYsMHgwNiwweGI0LDB4MzMsMHgwNiwweGZmLDB4MDYKKywweDc2LDB4MzQsMHg4MCwweDNlLDB4ZmUsMHgzNCwweDAwLDB4NzQsMHgwNCwweDA3LDB4ZTksMHhmMCwweGZhLDB4YjgsMHg4MCwweDAwCissMHhlOCwweGQzLDB4MDIsMHgwNywweGU5LDB4ZTYsMHhmYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4YzYsMHgxZCwweDA4LDB4MWQsMHg5MSwweDFlLDB4NWQsMHgxZSwweDczLDB4MWUsMHg4OSwweDFlLDB4OTEsMHgxZSwweGE4LDB4MWQKKywweDkxLDB4MWUsMHg5MSwweDFlLDB4YWYsMHgxZSwweGFmLDB4MWUsMHgxNSwweDFkLDB4MTUsMHgxZCwweDkxLDB4MWUsMHg5OSwweDFmCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMAorLDB4MDAsMHgwMSwweDAwLDB4MTAsMHgwMCwweDAxLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAKKywweDA3LDB4ZTksMHg5OSwweGZhLDB4NTAsMHg1MSwweDU2LDB4NTcsMHg1MiwweDA2LDB4MWUsMHgzMywweGMwLDB4OGUsMHhkOCwweGU3CissMHg1YSwweGZmLDB4MDYsMHhiMiwweDMzLDB4MDYsMHg2OCwweGY2LDB4MWMsMHhlNSwweDA2LDB4YTMsMHhiMiwweDMzLDB4OGIsMHhmMAorLDB4ODMsMHhlNiwweDFlLDB4MmUsMHhmZiwweGE0LDB4YTAsMHgxYywweGU1LDB4MGMsMHhhOSwweDgwLDB4MDAsMHg3NCwweDA2LDB4ZTgKKywweGE0LDB4MDEsMHhlNSwweDA2LDB4YzMsMHg1MywweGU1LDB4MGMsMHg4YiwweGQ4LDB4YTksMHgwMSwweDAwLDB4NzQsMHgxNCwweDgzCissMHgzZSwweGUwLDB4M2EsMHgwMCwweDc0LDB4MGQsMHg4ZSwweDA2LDB4MzgsMHgzNCwweGU4LDB4YmYsMHgwNiwweGM3LDB4MDYsMHhlMAorLDB4M2EsMHgwMCwweDAwLDB4ZTUsMHgwMCwweDBkLDB4MTgsMHgwMCwweGU3LDB4MDAsMHhlNSwweDAyLDB4MGQsMHgxMSwweDAwLDB4ZTcKKywweDAyLDB4OGIsMHhjMywweDViLDB4YTksMHgwMSwweDAwLDB4NzQsMHgwMSwweGMzLDB4OGIsMHhkMCwweGI4LDB4MDAsMHgwOCwweGU3CissMHg4NCwweDhiLDB4YzIsMHg4ZSwweDA2LDB4MzgsMHgzNCwweDI2LDB4YTMsMHgwYywweDAwLDB4OGIsMHhkMCwweGMxLDB4ZTAsMHgwMworLDB4ODMsMHgxNiwweDg4LDB4MzQsMHgwMCwweGZmLDB4MDYsMHg3YywweDM0LDB4MjYsMHg4MywweDNlLDB4MDYsMHgwMCwweDBhLDB4NzUKKywweDIxLDB4OGIsMHhjMiwweDI1LDB4NDAsMHgxOCwweDNkLDB4NDAsMHgwMCwweDc0LDB4MGMsMHgzZCwweDAwLDB4MTAsMHg3NSwweDEyCissMHgyNiwweGZlLDB4MGUsMHgwYSwweDAwLDB4NzQsMHgwYiwweGY3LDB4MDYsMHhlZiwweDM0LDB4MjAsMHgwMCwweDc1LDB4MDMsMHhlOQorLDB4NWEsMHgwNiwweDhjLDB4YzAsMHgyNiwweDhlLDB4MDYsMHgwMiwweDAwLDB4MjYsMHg4MywweDBlLDB4MDgsMHgwMCwweDIwLDB4MjYKKywweGEzLDB4MTIsMHgwMCwweDI2LDB4YTMsMHgxMCwweDAwLDB4YzMsMHhmZiwweDA2LDB4YzQsMHgzMywweGU1LDB4MGMsMHhhOSwweDAxCissMHgwMCwweDc1LDB4MDEsMHhjMywweGE5LDB4ZjAsMHgwNywweDc0LDB4MDEsMHhjMywweGZmLDB4MDYsMHhkNCwweDMzLDB4ZTUsMHgwMAorLDB4MGQsMHgxOCwweDAwLDB4ZTcsMHgwMCwweGMzLDB4ZmYsMHgwNiwweGNhLDB4MzMsMHg4MCwweDNlLDB4YTAsMHgzNiwweDA4LDB4NzUKKywweDE0LDB4OGUsMHgwNiwweDMwLDB4MzQsMHgyNiwweGY3LDB4MDYsMHgwYSwweDAwLDB4MDAsMHgwOCwweDc0LDB4MDcsMHgyNiwweDgxCissMHgwZSwweDA4LDB4MDAsMHgwMCwweDA4LDB4ZTUsMHg4MiwweDI1LDB4ZmQsMHhmZiwweGU3LDB4ODIsMHhlNSwweDBjLDB4NTAsMHhlNQorLDB4ODAsMHgyNSwweDAwLDB4MDcsMHhhMywweGU0LDB4M2EsMHhlNSwweDhjLDB4MjUsMHgwMCwweDgwLDB4YTMsMHhlMiwweDNhLDB4NTgKKywweGE5LDB4MDIsMHgwMCwweDc1LDB4MjUsMHg4MywweDNlLDB4ZTIsMHgzYSwweDAwLDB4NzUsMHgxZSwweDgzLDB4M2UsMHhlNCwweDNhCissMHgwMCwweDc1LDB4MTcsMHhlNSwweDA4LDB4MGQsMHgwMCwweDA0LDB4MjUsMHhmZiwweDA0LDB4ZTcsMHgwOCwweGU4LDB4NmEsMHgwMQorLDB4ZTUsMHg4MiwweDBkLDB4MDIsMHgwMCwweGU3LDB4ODIsMHhlOSwweDIxLDB4MDAsMHhlOCwweDFhLDB4MDYsMHg4MCwweDNlLDB4ZTgKKywweGZmLDB4MDAsMHg3NCwweDBhLDB4ODAsMHgzZSwweGU4LDB4ZmYsMHgwNCwweDc0LDB4MDMsMHhlOSwweDBkLDB4MDAsMHhjNiwweDA2CissMHhlOCwweGZmLDB4MDEsMHhiYSwweDBjLDB4MDEsMHhiOCwweDA4LDB4MDgsMHhlZiwweGVkLDB4ODAsMHgzZSwweDlmLDB4MzYsMHgwNgorLDB4NzUsMHgwNSwweDgzLDB4MGUsMHg5OSwweDM2LDB4NDAsMHhiOCwweDAwLDB4MDEsMHhlOSwweDA5LDB4MDEsMHhmZiwweDA2LDB4Y2MKKywweDMzLDB4ODEsMHgyNiwweGFmLDB4MzYsMHhmZiwweGY3LDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNiwweGZmLDB4MDYsMHhjNiwweDM0CissMHhlOSwweDFlLDB4MDAsMHhmZiwweDA2LDB4Y2UsMHgzMywweGZmLDB4MDYsMHg5NSwweDM3LDB4ODEsMHgyNiwweGFmLDB4MzYsMHhmZgorLDB4ZWYsMHhhMSwweGFmLDB4MzYsMHhlNywweDA2LDB4ZTksMHgwOCwweDAwLDB4ZmYsMHgwNiwweGQwLDB4MzMsMHhmZiwweDA2LDB4N2EKKywweDM0LDB4ZmYsMHgwNiwweGQyLDB4MzMsMHhkMSwweGU2LDB4OGUsMHgwNiwweDMwLDB4MzQsMHgyZSwweDhiLDB4ODQsMHhjMCwweDFjCissMHgyNiwweDA5LDB4MDYsMHgwOCwweDAwLDB4MmUsMHg4YiwweDg0LDB4YzIsMHgxYywweDA5LDB4MDYsMHg2NiwweDM3LDB4YzMsMHhlNQorLDB4MGMsMHhhOSwweDgwLDB4MDAsMHg3NCwweDU2LDB4NTAsMHhlOCwweGYwLDB4MDAsMHg1OCwweGE5LDB4MDAsMHgwMSwweDc1LDB4MDcKKywweGZmLDB4MDYsMHhjNiwweDMzLDB4ZTksMHgwOCwweDAwLDB4ZmYsMHgwNiwweDc4LDB4MzQsMHhmZiwweDA2LDB4YzgsMHgzMywweGU1CissMHg4MiwweDI1LDB4ZmQsMHhmZiwweGU3LDB4ODIsMHhlOCwweDZlLDB4MDUsMHhiYSwweDEwLDB4MDEsMHhlZCwweDgwLDB4M2UsMHhlOAorLDB4ZmYsMHgwMCwweDc0LDB4MGEsMHg4MCwweDNlLDB4ZTgsMHhmZiwweDA0LDB4NzQsMHgwMywweGU5LDB4MWQsMHgwMCwweGM2LDB4MDYKKywweGU4LDB4ZmYsMHgwMSwweGJhLDB4MGMsMHgwMSwweGI4LDB4MDgsMHgwOCwweGVmLDB4ZWQsMHhlOSwweDBkLDB4MDAsMHhjNiwweDA2CissMHhlOCwweGZmLDB4MDMsMHhiYSwweDBjLDB4MDEsMHhiOCwweDA4LDB4MDgsMHhlZiwweGVkLDB4YzMsMHhhOSwweDAxLDB4MDAsMHg3NAorLDB4MWMsMHhlOCwweDJjLDB4MDAsMHg4MywweDNlLDB4ZTAsMHgzYSwweDAwLDB4NzQsMHgwZiwweDA2LDB4OGUsMHgwNiwweDM4LDB4MzQKKywweGU4LDB4YzksMHgwNCwweGM3LDB4MDYsMHhlMCwweDNhLDB4MDAsMHgwMCwweDA3LDB4ZTksMHg1ZCwweDAwLDB4OGIsMHhkMCwweDhlCissMHgwNiwweDM4LDB4MzQsMHgyNiwweGEzLDB4MGMsMHgwMCwweGU4LDB4MDYsMHgwMCwweDY4LDB4NjksMHgxZCwweGU5LDB4NGEsMHgwMAorLDB4YTksMHgwMCwweDA0LDB4NzQsMHgwYSwweGI4LDB4MDAsMHgwNCwweGZmLDB4MDYsMHhkOCwweDMzLDB4ZTksMHgxNywweDAwLDB4YTkKKywweDAwLDB4MDEsMHg3NCwweDBhLDB4ZmYsMHgwNiwweDM5LDB4MzcsMHhiOCwweDAwLDB4MDEsMHhlOSwweDA4LDB4MDAsMHhhOSwweDEwCissMHgwMCwweGI4LDB4MTAsMHgwMCwweDc0LDB4MWQsMHgwOSwweDA2LDB4NjYsMHgzNywweDhjLDB4YzAsMHg4ZSwweDA2LDB4MzAsMHgzNAorLDB4MjYsMHhmNywweDA2LDB4MGEsMHgwMCwweDAwLDB4MDEsMHg3NCwweDA3LDB4MjYsMHg4MSwweDBlLDB4MDgsMHgwMCwweDAwLDB4MDEKKywweDhlLDB4YzAsMHhjMywweGZmLDB4MDYsMHhjMiwweDMzLDB4ZTksMHhmOCwweGZmLDB4ZTUsMHgwMCwweDBkLDB4MTgsMHgwMCwweGU3CissMHgwMCwweGU1LDB4MDIsMHgwZCwweDExLDB4MDAsMHhlNywweDAyLDB4YzMsMHg1OCwweGU5LDB4NDMsMHhmZCwweGU1LDB4MDgsMHgwZAorLDB4MDAsMHgwNCwweDI1LDB4ZmYsMHgwNCwweGU3LDB4MDgsMHhlOSwweGUwLDB4ZmYsMHhlNSwweDBlLDB4YTksMHgwMCwweDA4LDB4NzUKKywweDAxLDB4YzMsMHhlOSwweGY1LDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHg1MCwweDUxLDB4NTYsMHg1NywweDUyLDB4MDYsMHgxZSwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4ZTcsMHg1YSwweGZmLDB4MDYsMHhiOAorLDB4MzMsMHhlNSwweDQ4LDB4MDYsMHg1MywweDU3LDB4ZmYsMHgxNiwweDRlLDB4MzcsMHg1ZiwweDViLDB4ODMsMHgzZSwweDgwLDB4MDEKKywweGZmLDB4NzQsMHg1OCwweDhlLDB4MDYsMHg4MCwweDAxLDB4MjYsMHhmZiwweDBlLDB4MDgsMHgwMCwweDc1LDB4NGQsMHgyNiwweGExCissMHgwMCwweDAwLDB4YTMsMHg4MCwweDAxLDB4MjYsMHhjNywweDA2LDB4MDAsMHgwMCwweGZmLDB4ZmYsMHg4YywweGMwLDB4MjYsMHg4ZQorLDB4MDYsMHgwMiwweDAwLDB4MjYsMHg4MSwweDBlLDB4MDgsMHgwMCwweDgwLDB4MDAsMHg4YiwweGQwLDB4MjYsMHg4NywweDA2LDB4MWEKKywweDAwLDB4MjYsMHg4MywweDNlLDB4MTgsMHgwMCwweGZmLDB4NzQsMHgwYSwweDhlLDB4YzAsMHgyNiwweDg5LDB4MTYsMHgwMCwweDAwCissMHhlOSwweDA1LDB4MDAsMHgyNiwweDg5LDB4MTYsMHgxOCwweDAwLDB4ODMsMHgzZSwweDgwLDB4MDEsMHhmZiwweDc0LDB4MGMsMHg4ZQorLDB4MDYsMHg4MCwweDAxLDB4MjYsMHg4MywweDNlLDB4MDgsMHgwMCwweDAwLDB4NzQsMHhiMywweDA3LDB4ZTksMHgzZSwweGY3LDB4ZTUKKywweDRjLDB4OTAsMHhlNSwweDAyLDB4YTksMHgwMCwweDIwLDB4NzQsMHgwZCwweDI1LDB4ZmYsMHhkZiwweDBkLDB4MDEsMHgwMCwweGU3CissMHgwMiwweDBkLDB4MDAsMHgyMCwweGU3LDB4MDIsMHhlNSwweDBhLDB4OGIsMHhkOCwweGEzLDB4ZjQsMHgzMywweDI1LDB4YzMsMHg1NworLDB4MGQsMHgwMCwweDEwLDB4ZTcsMHgwYSwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDAsMHg4MCwweDc0LDB4MzcsMHhmNywweGMzLDB4MDAKKywweDgwLDB4NzQsMHgwNiwweGY3LDB4YzMsMHgwMCwweDA4LDB4NzQsMHg1ZCwweDgxLDB4MjYsMHhjMiwweDM0LDB4N2YsMHhmZiwweGM3CissMHgwNiwweDM1LDB4MzcsMHgwNSwweDAwLDB4YjgsMHg4MCwweDAzLDB4Y2QsMHgzOSwweDgxLDB4MjYsMHg5YiwweDM2LDB4ZmYsMHg3ZgorLDB4YzcsMHgwNiwweDBmLDB4MzcsMHgwNCwweDAwLDB4ZjcsMHgwNiwweDliLDB4MzYsMHg0MCwweDAwLDB4NzUsMHgwNiwweGM3LDB4MDYKKywweDBmLDB4MzcsMHgwMywweDAwLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDIwLDB4NzQsMHgyYSwweGY3LDB4YzMsMHgwMCwweDA4CissMHg3NCwweDI0LDB4ODAsMHgzZSwweDlkLDB4MzYsMHgwNiwweDdjLDB4MWQsMHhmZiwweDA2LDB4OTQsMHgzNCwweDgzLDB4MGUsMHg2NgorLDB4MzcsMHgyMCwweDhlLDB4MDYsMHgzMCwweDM0LDB4MjYsMHhmNywweDA2LDB4MGEsMHgwMCwweDAwLDB4MDEsMHg3NCwweDA3LDB4MjYKKywweDgxLDB4MGUsMHgwOCwweDAwLDB4MDAsMHgwMSwweGY3LDB4YzMsMHgwMCwweDIwLDB4NzUsMHgzYiwweGY3LDB4MDYsMHg5YSwweDM3CissMHg4MCwweDAwLDB4NzQsMHgwYiwweGZmLDB4MDYsMHg4OSwweDM3LDB4MzMsMHhjMCwweGU3LDB4MGUsMHhlOSwweDA0LDB4MDAsMHhmZgorLDB4MDYsMHgzYiwweDM3LDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDIwLDB4NzQsMHgxYywweDgwLDB4MjYsMHg5ZSwweDM2LDB4ZmYKKywweDc1LDB4MTUsMHg4ZSwweDA2LDB4MzAsMHgzNCwweDI2LDB4ZjcsMHgwNiwweDBhLDB4MDAsMHgwMCwweDA4LDB4NzQsMHgwNywweDI2CissMHg4MSwweDBlLDB4MDgsMHgwMCwweDAwLDB4MDgsMHhjMywweGMzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDIsMHgyMywweDAyLDB4MjMsMHgwMiwweDIzLDB4MDIsMHgyMywweDAzLDB4MjMsMHhkZCwweDIyLDB4MDIsMHgyMywweGZkLDB4MjEKKywweDAyLDB4MjMsMHhhNCwweDI0LDB4ZjMsMHgyNCwweDAyLDB4MjMsMHg4ZCwweDIyLDB4N2EsMHgyMywweDAyLDB4MjMsMHg5NywweDI0CissMHgxYiwweDI0LDB4NzUsMHgyNCwweDAyLDB4MjMsMHgwMiwweDIzLDB4OGUsMHgyNSwweGZiLDB4OGUsMHgwNiwweDdlLDB4MDEsMHhmYgorLDB4MjYsMHg4MywweDNlLDB4MDAsMHgwMCwweGZmLDB4NzQsMHhmMiwweDI2LDB4OGUsMHgwNiwweDAwLDB4MDAsMHhmYSwweDI2LDB4OGIKKywweDFlLDB4MDgsMHgwMCwweDI2LDB4MjMsMHgxZSwweDBhLDB4MDAsMHg3NCwweGU1LDB4OGMsMHhjMCwweDhlLDB4ZDAsMHgyNiwweDhiCissMHgyNiwweDAyLDB4MDAsMHg4YywweDE2LDB4ZjIsMHgzMywweDIyLDB4ZmYsMHg3NSwweDZhLDB4MjYsMHhhMSwweDFjLDB4MDAsMHg4YQorLDB4ZTMsMHg4YSwweGRjLDB4MjIsMHhkOCwweDc1LDB4MGQsMHhkMCwweGU4LDB4MjQsMHhmOCwweDBhLDB4YzAsMHg3NSwweGYyLDB4YjAKKywweDgwLDB4ZTksMHhlZCwweGZmLDB4ZDAsMHhlOCwweDI0LDB4ZjgsMHgwYSwweGMwLDB4NzUsMHgwMiwweGIwLDB4ODAsMHgzMiwweGU0CissMHgyNiwweGEzLDB4MWMsMHgwMCwweGY3LDB4YzMsMHgwOCwweDAwLDB4NzUsMHg0NywweDJlLDB4OGEsMHg5ZiwweGM1LDB4MjUsMHgyZQorLDB4OGIsMHhiZiwweGM1LDB4MjYsMHg4MCwweGMzLDB4MTAsMHgyNiwweDhlLDB4MWQsMHgyNiwweDhjLDB4MWUsMHgwNiwweDAwLDB4OGIKKywweDE2LDB4MDAsMHgwMCwweGM3LDB4MDYsMHgwMCwweDAwLDB4ZmYsMHhmZiwweDI2LDB4ODksMHgxNSwweDgzLDB4ZmEsMHhmZiwweDc1CissMHgwYSwweDJlLDB4OGIsMHg5NywweGNkLDB4MjYsMHgyNiwweDIxLDB4MTYsMHgwOCwweDAwLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHgyNgorLDB4ODksMHgxZSwweDA0LDB4MDAsMHhjMywweDhhLDB4ZGYsMHhiNywweDAwLDB4MmUsMHg4YSwweDlmLDB4YzUsMHgyNSwweGU5LDB4ZTAKKywweGZmLDB4MjYsMHg4MywweDI2LDB4MDgsMHgwMCwweGY3LDB4ODMsMHhjMywweDEwLDB4ZTksMHhkZSwweGZmLDB4NjAsMHgwNiwweDFlCissMHg2OCwweDg3LDB4MjUsMHg2YSwweDAwLDB4MWYsMHg4ZSwweDA2LDB4ZjIsMHgzMywweDhiLDB4MGUsMHgzNCwweDM0LDB4MzksMHgwZQorLDB4ZjIsMHgzMywweDc0LDB4MGUsMHgyNiwweDgxLDB4MGUsMHgwYSwweDAwLDB4MDAsMHgwMiwweDI2LDB4ODEsMHgwZSwweDA4LDB4MDAKKywweDAwLDB4MDIsMHgyNiwweDg5LDB4MjYsMHgwMiwweDAwLDB4YTMsMHhmMiwweDMzLDB4OGUsMHhkMCwweDhkLDB4MjYsMHg4MCwweDAwCissMHgzNiwweDg5LDB4MjYsMHgwMiwweDAwLDB4MzYsMHg4OSwweDFlLDB4MjAsMHgwMCwweDM2LDB4YzcsMHgwNiwweDA4LDB4MDAsMHgwMAorLDB4MDAsMHhiOSwweDA0LDB4MDAsMHhiZSwweDAwLDB4MDAsMHgyZSwweDhiLDB4YmMsMHhjNSwweDI2LDB4MzYsMHhjNywweDA1LDB4ZmYKKywweGZmLDB4MzYsMHhjNywweDQ1LDB4MDIsMHhmZiwweGZmLDB4ODMsMHhjNiwweDAyLDB4ZTIsMHhlYiwweDhlLDB4MDYsMHg3ZSwweDAxCissMHgzNiwweDhiLDB4MGUsMHgyMiwweDAwLDB4OGMsMHhjMCwweDI2LDB4ODMsMHgzZSwweDAwLDB4MDAsMHhmZiwweDI2LDB4OGUsMHgwNgorLDB4MDAsMHgwMCwweDc0LDB4MDcsMHgyNiwweDNiLDB4MGUsMHgyMiwweDAwLDB4N2QsMHhlYSwweDM2LDB4OGMsMHgwNiwweDAwLDB4MDAKKywweDhlLDB4YzAsMHgyNiwweDhjLDB4MTYsMHgwMCwweDAwLDB4ZmIsMHgzNiwweGZmLDB4MmUsMHgxZSwweDAwLDB4MDYsMHgxZSwweDY4CissMHg4YiwweDI1LDB4NmEsMHgwMCwweDFmLDB4MjYsMHgwOSwweDM2LDB4MDgsMHgwMCwweGY3LDB4YzYsMHgwMCwweGZmLDB4NzQsMHgwMQorLDB4YzMsMHg1NiwweDUyLDB4MmUsMHg4YiwweGI0LDB4YzUsMHgyNSwweDgxLDB4ZTYsMHhmZiwweDAwLDB4MmUsMHg4YiwweGI0LDB4YzUKKywweDI2LDB4OGMsMHhjMiwweDhlLDB4YzAsMHgyNiwweGM3LDB4MDYsMHgwMCwweDAwLDB4ZmYsMHhmZiwweDhlLDB4YzIsMHgyNiwweDgzCissMHgzYywweGZmLDB4NzQsMHgwZiwweDhiLDB4ZDAsMHgyNiwweDg3LDB4NTQsMHgwMiwweDhlLDB4YzIsMHgyNiwweGEzLDB4MDAsMHgwMAorLDB4ZTksMHgwNywweDAwLDB4MjYsMHg4OSwweDQ0LDB4MDIsMHgyNiwweDg5LDB4MDQsMHg1YSwweDVlLDB4YzMsMHgwNiwweDFlLDB4NjgKKywweDhiLDB4MjUsMHg2YSwweDAwLDB4MWYsMHg4ZSwweDA2LDB4ZjIsMHgzMywweDI2LDB4YTMsMHgwYSwweDAwLDB4MjYsMHg4OSwweDI2CissMHgwMiwweDAwLDB4YTEsMHgzNCwweDM0LDB4OGUsMHhkMCwweDhkLDB4MjYsMHg4MCwweDAwLDB4OGMsMHgxNiwweGYyLDB4MzMsMHhlOQorLDB4NGQsMHhmZSwweGNmLDB4NTAsMHgxZSwweDUyLDB4NTMsMHgzMywweGMwLDB4OGUsMHhkOCwweDI2LDB4ODMsMHgzZSwweDA0LDB4MDAKKywweGZmLDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweDAwLDB4MDAsMHg3NCwweDAzLDB4ZTksMHgxYSwweDAwLDB4ODMsMHgzZSwweGU2CissMHgzYSwweDAyLDB4NzYsMHgxMywweGZmLDB4MDYsMHhkNiwweDMzLDB4OGMsMHhjMCwweDhlLDB4MDYsMHgzMiwweDM0LDB4YmUsMHg0MAorLDB4MDAsMHg2OCwweDNhLDB4MjMsMHhlOSwweDVlLDB4ZmYsMHhlOCwweDg0LDB4ZjgsMHg1YiwweDVhLDB4MWYsMHg1OCwweGNmLDB4ZTgKKywweGUxLDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOCwweDAwLDB4MTAsMHgyNiwweDhhLDB4MWUsMHgyOSwweDAwLDB4ODgsMHgxZSwweDFiCissMHgzNywweDI2LDB4YzcsMHgwNiwweDBjLDB4MDAsMHhmZiwweDdmLDB4MjYsMHhhMSwweDBlLDB4MDAsMHhlNywweDljLDB4MjYsMHhhMQorLDB4MDgsMHgwMCwweGU3LDB4OWEsMHhlNSwweDAwLDB4ODAsMHhmYiwweDA4LDB4NzQsMHgwOSwweDBkLDB4MTgsMHhhYywweGU3LDB4MDAKKywweDA3LDB4MWYsMHg1OCwweGNmLDB4MGQsMHgxOCwweDAwLDB4ZTksMHhmNCwweGZmLDB4NTAsMHgxZSwweDA2LDB4MzMsMHhjMCwweDhlCissMHhkOCwweDgzLDB4M2UsMHhhMSwweDM2LDB4MDAsMHg3NSwweGI3LDB4MjYsMHg4YiwweDM2LDB4MDYsMHgwMCwweDJlLDB4ZmYsMHg5NAorLDB4ZGMsMHgyMywweDA3LDB4MWYsMHg1OCwweGNmLDB4ZTgsMHg4YSwweDAwLDB4ZTUsMHgwMCwweDBkLDB4MTgsMHgwMCwweGU3LDB4MDAKKywweGU4LDB4NDksMHgwMCwweGMzLDB4NTMsMHhmNywweDA2LDB4ZWYsMHgzNCwweDIwLDB4MDAsMHg3NSwweDJkLDB4ZTUsMHg4YywweDI1CissMHgwMCwweDcwLDB4OGIsMHhkOCwweGU1LDB4OGMsMHgyNSwweDAwLDB4NzAsMHgzYiwweGMzLDB4NzQsMHgwNSwweDhiLDB4ZDgsMHhlOQorLDB4ZjIsMHhmZiwweDNkLDB4MDAsMHgzMCwweDc1LDB4MTAsMHhlNSwweDAyLDB4MjUsMHhlZiwweGZmLDB4ZTcsMHgwMiwweGM3LDB4MDYKKywweGUwLDB4M2EsMHhmZiwweGZmLDB4ZTksMHgwMywweDAwLDB4ZTgsMHgxMiwweDAwLDB4NWIsMHhjMywweGEzLDB4MjMsMHg5NiwweDIzCissMHhhNCwweDIzLDB4YTQsMHgyMywweDk2LDB4MjMsMHhhNCwweDIzLDB4OTYsMHgyMywweDk2LDB4MjMsMHgyNiwweGEwLDB4MjksMHgwMAorLDB4YTIsMHgxYiwweDM3LDB4MjYsMHhjNywweDA2LDB4MGMsMHgwMCwweGZmLDB4N2YsMHgyNiwweGExLDB4MGUsMHgwMCwweGU3LDB4OWMKKywweDI2LDB4YTEsMHgwOCwweDAwLDB4ZTcsMHg5YSwweGU1LDB4MDAsMHgyNSwweGZmLDB4NTMsMHgyNiwweDhiLDB4MzYsMHgwNiwweDAwCissMHg4MywweGU2LDB4MGUsMHgyZSwweDBiLDB4ODQsMHhhZCwweDI1LDB4ZTcsMHgwMCwweGMzLDB4MDYsMHgxZSwweDY4LDB4OGIsMHgyNQorLDB4NmEsMHgwMCwweDFmLDB4ODMsMHgwZSwweGVmLDB4MzQsMHgyMCwweDgzLDB4MGUsMHg5YiwweDM2LDB4MDgsMHhlNSwweDAwLDB4MjUKKywweGVmLDB4ZmYsMHgwZCwweDA4LDB4MDAsMHhlNywweDAwLDB4ZTUsMHgwMCwweGE5LDB4MTAsMHgwMCwweDc1LDB4MDEsMHhjMywweGU1CissMHgwMCwweGE5LDB4MTAsMHgwMCwweDc1LDB4ZjksMHhjMywweDUwLDB4NTMsMHg1MSwweDU2LDB4MDYsMHgxZSwweDMzLDB4YzAsMHg4ZQorLDB4ZDgsMHhiOCwweDA1LDB4MDAsMHhlNywweDg0LDB4ZTUsMHgwOCwweDBkLDB4MDAsMHgwNCwweDI1LDB4ZmYsMHgwNCwweGU3LDB4MDgKKywweGU1LDB4MDAsMHgwZCwweDE4LDB4MDAsMHhlNywweDAwLDB4ZTUsMHgwMiwweDBkLDB4MTEsMHgwMCwweGU3LDB4MDIsMHgxZiwweDA3CissMHg1ZSwweDU5LDB4NWIsMHg1OCwweGMzLDB4NTAsMHgxZSwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4YzcsMHgwNiwweGVmLDB4MzQsMHgwMAorLDB4MDAsMHg4MywweDI2LDB4OWIsMHgzNiwweGY3LDB4ZTUsMHgwMCwweDBkLDB4MTgsMHgwMCwweGU3LDB4MDAsMHhlNSwweDAyLDB4MGQKKywweDExLDB4MDAsMHhlNywweDAyLDB4MWYsMHg1OCwweGNmLDB4NjAsMHgwNiwweDFlLDB4NjgsMHg4NywweDI1LDB4NmEsMHgwMCwweDFmCissMHhlOCwweDE2LDB4ZjUsMHhjMywweDA2LDB4MWUsMHg2OCwweDhiLDB4MjUsMHg2YSwweDAwLDB4MWYsMHg4ZSwweGMwLDB4MjYsMHg4MworLDB4M2UsMHgwYSwweDAwLDB4MDAsMHg3NCwweDAzLDB4ZTgsMHg0MywweDAwLDB4MjYsMHhjNywweDA2LDB4MGEsMHgwMCwweGZmLDB4ZmYKKywweDI2LDB4OGIsMHgxNiwweDA2LDB4MDAsMHg4ZSwweDFlLDB4OGUsMHgwMSwweDhjLDB4ZDgsMHg4YiwweGNhLDB4ODMsMHgzZSwweDAwCissMHgwMCwweGZmLDB4OGUsMHgxZSwweDAwLDB4MDAsMHg3NCwweDBhLDB4MmIsMHgxNiwweDA4LDB4MDAsMHg3MywweGViLDB4MjksMHgwZQorLDB4MDgsMHgwMCwweDI2LDB4ODksMHgwZSwweDA4LDB4MDAsMHgyNiwweDhjLDB4MWUsMHgwMCwweDAwLDB4OGUsMHhkOCwweDhjLDB4MDYKKywweDAwLDB4MDAsMHhjMywweDYwLDB4MDYsMHgxZSwweDY4LDB4ODcsMHgyNSwweDZhLDB4MDAsMHgxZiwweDhlLDB4YzAsMHg4YiwweGM4CissMHg4ZSwweDFlLDB4OGUsMHgwMSwweDI2LDB4YzcsMHgwNiwweDBhLDB4MDAsMHgwMCwweDAwLDB4OGMsMHhkOCwweDgzLDB4M2UsMHgwMAorLDB4MDAsMHhmZiwweDc0LDB4MjUsMHgzYiwweDBlLDB4MDAsMHgwMCwweDhlLDB4MWUsMHgwMCwweDAwLDB4NzUsMHhlZCwweDhlLDB4ZDgKKywweDI2LDB4YTEsMHgwMCwweDAwLDB4YTMsMHgwMCwweDAwLDB4M2QsMHhmZiwweGZmLDB4NzQsMHg1NiwweDhlLDB4ZDgsMHgyNiwweGExCissMHgwOCwweDAwLDB4MDEsMHgwNiwweDA4LDB4MDAsMHhlOSwweDQ5LDB4MDAsMHgyNiwweDhlLDB4MWUsMHgwMiwweDAwLDB4YmUsMHgxOAorLDB4MDAsMHg4MywweDNjLDB4ZmYsMHg3NCwweDNjLDB4MzksMHgwYywweDc0LDB4MTksMHg4ZSwweDFjLDB4YmUsMHgwMCwweDAwLDB4ODMKKywweDNlLDB4MDAsMHgwMCwweGZmLDB4NzQsMHgyYywweDM5LDB4MGUsMHgwMCwweDAwLDB4NzQsMHgwNywweDhlLDB4MWUsMHgwMCwweDAwCissMHhlOSwweGVjLDB4ZmYsMHgyNiwweGExLDB4MDAsMHgwMCwweDg5LDB4MDQsMHgzMywweGM5LDB4OGUsMHhkOSwweDNkLDB4ZmYsMHhmZgorLDB4NzUsMHgxMCwweDgzLDB4ZmUsMHgxOCwweDc1LDB4MGIsMHgyNiwweDhlLDB4MWUsMHgwMiwweDAwLDB4ODEsMHgyNiwweDA4LDB4MDAKKywweDdmLDB4ZmYsMHgzMywweGMwLDB4OGUsMHhkOCwweGMzLDB4MWYsMHgwNywweDYxLDB4Y2YsMHgxZiwweDA3LDB4Y2YsMHg2MCwweDA2CissMHgxZSwweDY4LDB4ODcsMHgyNSwweDZhLDB4MDAsMHgxZiwweGU1LDB4MDYsMHgyNSwweDFlLDB4MDAsMHgzZCwweDFlLDB4MDAsMHg3NQorLDB4ZjYsMHhiOSwweDA4LDB4MDAsMHhlNSwweDU4LDB4ZTcsMHg1YSwweDIzLDB4YzAsMHhlMCwweGY4LDB4YzMsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFjLDB4MDAsMHgwMCwweDAwLDB4YTgsMHgwMCwweDhjLDB4MDIsMHgwNCwweDAwCissMHgwMCwweDA4LDB4MTAsMHgyMCwweDAwLDB4ZmYsMHgwZSwweDBjLDB4MGMsMHgwYSwweDBhLDB4MGEsMHgwYSwweDA4LDB4MDgsMHgwOAorLDB4MDgsMHgwOCwweDA4LDB4MDgsMHgwOCwweDA2LDB4MDYsMHgwNiwweDA2LDB4MDYsMHgwNiwweDA2LDB4MDYsMHgwNiwweDA2LDB4MDYKKywweDA2LDB4MDYsMHgwNiwweDA2LDB4MDYsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0CissMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNAorLDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIKKywweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyCissMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMgorLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIKKywweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MDAsMHgxNCwweDAwLDB4MTAsMHgwMCwweDBjLDB4MDAsMHhmZiwweDdmLDB4ZmYKKywweGJmLDB4ZmYsMHhkZiwweGZmLDB4ZWYsMHhmZiwweGY3LDB4ZmYsMHhmYiwweGZmLDB4ZmQsMHhmZiwweGZlLDB4N2YsMHhmZiwweGJmCissMHhmZiwweGRmLDB4ZmYsMHhlZiwweGZmLDB4ZjcsMHhmZiwweGZiLDB4ZmYsMHhmZCwweGZmLDB4ZmUsMHhmZiwweDAwLDB4MDAsMHgwMAorLDB4ODAsMHgzZSwweGUyLDB4MzQsMHgwMSwweDc2LDB4MDMsMHhlOSwweGE1LDB4MDAsMHhiOCwweDAwLDB4MDAsMHhlNywweDRlLDB4YjkKKywweDI4LDB4MDAsMHhlMiwweGZlLDB4YzYsMHgwNiwweDQ1LDB4MzcsMHgwMiwweGJmLDB4M2YsMHgyOCwweDJlLDB4OGIsMHg0NSwweDA4CissMHhlNywweDRlLDB4YjksMHgyOCwweDAwLDB4ZTIsMHhmZSwweDJlLDB4OGIsMHgxZCwweGM3LDB4MDYsMHhiMywweDM2LDB4NDAsMHgxMQorLDB4YzcsMHgwNiwweGIxLDB4MzYsMHgyNywweDAwLDB4YzcsMHgwNiwweDQ2LDB4MzcsMHgwMiwweDAwLDB4YzcsMHgwNiwweDQ4LDB4MzcKKywweDY0LDB4MDAsMHhmNywweDA2LDB4YjUsMHgzNiwweDAyLDB4MDAsMHg3NSwweDFjLDB4MmUsMHgwYiwweDVkLDB4MDIsMHg4MSwweDI2CissMHhiMywweDM2LDB4ZmYsMHhmZSwweGM3LDB4MDYsMHhiMSwweDM2LDB4OWMsMHgwMCwweGM3LDB4MDYsMHg0NiwweDM3LDB4MDgsMHgwMAorLDB4YzcsMHgwNiwweDQ4LDB4MzcsMHg5MCwweDAxLDB4ODksMHgxZSwweGI3LDB4MzYsMHg4OSwweDFlLDB4ZmUsMHgzMywweGJlLDB4MjAKKywweDAwLDB4OGIsMHhjMywweGU3LDB4NGUsMHhiOSwweDI4LDB4MDAsMHhlMiwweGZlLDB4MmUsMHg4YiwweDQ1LDB4MDQsMHhlNywweDRlCissMHhiOSwweDI4LDB4MDAsMHhlMiwweGZlLDB4ZTUsMHg0ZSwweDhiLDB4Y2IsMHgyZSwweDIzLDB4NDUsMHgwNiwweDJlLDB4MjMsMHg0ZAorLDB4MDYsMHgzYSwweGMxLDB4NzQsMHgzNiwweDRlLDB4NzUsMHhkOSwweDgwLDB4M2UsMHg0NSwweDM3LDB4MDAsMHg3NCwweDBiLDB4YzYKKywweDA2LDB4NDUsMHgzNywweDAwLDB4YmYsMHgyZiwweDI4LDB4ZTksMHg3MiwweGZmLDB4YzYsMHgwNiwweDQ1LDB4MzcsMHgwMSwweGY3CissMHgwNiwweGI1LDB4MzYsMHgwMiwweDAwLDB4NzQsMHgxNCwweGU1LDB4Y2UsMHgyNSwweGZkLDB4ZmYsMHhlNywweGNlLDB4ZTgsMHg0MworLDB4MDAsMHhlNSwweGNlLDB4MGQsMHgwMiwweDAwLDB4ZTcsMHhjZSwweGU4LDB4MzksMHgwMCwweDgwLDB4M2UsMHhlMiwweDM0LDB4MDEKKywweDc2LDB4MDEsMHhjMywweGI4LDB4ZWEsMHgwNSwweGU3LDB4OGMsMHhmYSwweGU4LDB4MTIsMHhmNCwweGZiLDB4OGQsMHgwNiwweGQwCissMHgzOSwweDhiLDB4ZDgsMHhjMSwweGU4LDB4MDQsMHhhMywweDM4LDB4MzQsMHg4ZSwweGMwLDB4YTEsMHgzMCwweDM0LDB4MjYsMHhhMworLDB4MDIsMHgwMCwweDI2LDB4YzcsMHgwNiwweDAwLDB4MDAsMHhmZiwweGZmLDB4ODMsMHhjMywweDE4LDB4ZDEsMHhlYiwweDI2LDB4ODkKKywweDFlLDB4MDgsMHgwMCwweGMzLDB4ZTUsMHgwMiwweDBkLDB4MDAsMHg0MCwweGU3LDB4MDIsMHhlNSwweDAwLDB4MGQsMHgwNCwweDAwCissMHhlNywweDAwLDB4YjgsMHgwMCwweDAwLDB4ZTcsMHgwYSwweGU1LDB4MGEsMHhhOSwweDAwLDB4ODAsMHg3NSwweDE0LDB4ZTUsMHgwOAorLDB4MGQsMHgwMCwweDEwLDB4ZTcsMHgwOCwweGU1LDB4MGEsMHgwZCwweDAwLDB4MDgsMHhiOSwweDA1LDB4MDAsMHhlNywweDBhLDB4ZTIKKywweGZjLDB4YzMsMHhlNSwweDA4LDB4MGQsMHgwMCwweDEwLDB4YjksMHgwNSwweDAwLDB4ZTcsMHgwOCwweGUyLDB4ZmMsMHhjMywweDA0CissMHgwYywweDIwLDB4MDAsMHgwMSwweDBjLDB4N2UsMHhmZiwweDAwLDB4MGMsMHgwMiwweDAwLDB4MTAsMHgwMCwweDQwLDB4MDAsMHgwYworLDB4YzYsMHgwMSwweDAwLDB4MDAsMHhjMCwweGY3LDB4ZmYsMHgwMCwweGMwLDB4MDIsMHgwMCwweDEwLDB4MDAsMHg0MCwweDAwLDB4MDAKKywweDMzLDB4YzAsMHg4ZSwweGQ4LDB4OGQsMHgzZSwweDcyLDB4NDksMHg4ZCwweDM2LDB4YjAsMHgzNywweGI5LDB4MTQsMHgwMCwweDhiCissMHgxZSwweDMwLDB4MzQsMHg4OSwweDVjLDB4MDIsMHgyZSwweDhiLDB4NDUsMHgwMiwweDg5LDB4NDQsMHgwNiwweDJlLDB4OGIsMHgwNQorLDB4ODksMHg0NCwweDA0LDB4ODMsMHhjNywweDA0LDB4ODMsMHhjNiwweDEwLDB4ZTIsMHhlOCwweGM2LDB4MDYsMHg5ZSwweDM2LDB4MGUKKywweGU4LDB4ZmQsMHgyNiwweDY4LDB4ODMsMHgyOCwweGExLDB4YWEsMHgwMiwweGNkLDB4MzUsMHg4MywweDNlLDB4YTEsMHgzNiwweDAwCissMHg3NCwweDAzLDB4ZTksMHgzYiwweDI3LDB4MzMsMHhmZiwweDhlLDB4MDYsMHhhNiwweDAyLDB4OGIsMHgzNiwweGE0LDB4MDIsMHgyZQorLDB4ZmYsMHhhNCwweDJlLDB4MzAsMHg4MywweDBlLDB4OTksMHgzNiwweDA0LDB4YzcsMHgwNiwweDM3LDB4MzcsMHgwMSwweDAwLDB4YzYKKywweDA2LDB4Y2EsMHgzNCwweDAxLDB4ZTksMHg3ZCwweDE5LDB4ODAsMHgzZSwweGEwLDB4MzYsMHgwOCwweDc0LDB4ZTYsMHg4MCwweDI2CissMHg5ZSwweDM2LDB4ZmYsMHg3NSwweDFhLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDIwLDB4NzQsMHgxMiwweGY3LDB4MDYsMHg5YgorLDB4MzYsMHgwMywweDAwLDB4NzUsMHgwYSwweDgzLDB4MGUsMHg2NiwweDM3LDB4MTAsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA4LDB4ZTkKKywweGZiLDB4MDEsMHg4MCwweDNlLDB4OWUsMHgzNiwweDAyLDB4NzUsMHhjZSwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDYsMHhlOSwweGVjCissMHgwMSwweGMzLDB4ZTksMHhlOCwweDAxLDB4MjYsMHhjNywweDA2LDB4MGEsMHgwMCwweDAwLDB4MDAsMHgyNiwweGZmLDB4MjYsMHgwNAorLDB4MDAsMHhhMSwweGQxLDB4MzYsMHgyNiwweDM5LDB4MDYsMHgxYSwweDAwLDB4NzUsMHgyMiwweGExLDB4ZDMsMHgzNiwweDI2LDB4MzkKKywweDA2LDB4MWMsMHgwMCwweDc1LDB4MTgsMHhhMSwweGQ1LDB4MzYsMHgyNiwweDM5LDB4MDYsMHgxZSwweDAwLDB4NzUsMHgwZSwweDI2CissMHhmNywweDA2LDB4MGMsMHgwMCwweDQwLDB4MDAsMHg3NCwweDA1LDB4ODMsMHgwZSwweDY2LDB4MzcsMHg0MCwweDgxLDB4MGUsMHhhZgorLDB4MzYsMHgwMCwweDEwLDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNiwweDgwLDB4M2UsMHg5ZCwweDM2LDB4MDIsMHg3NSwweDA2LDB4Y2QKKywweDM0LDB4ZTksMHhhMiwweDFhLDB4YzMsMHhmNywweDA2LDB4OWIsMHgzNiwweDEwLDB4MDAsMHg3NSwweDU0LDB4MjYsMHhmNiwweDA2CissMHgwYSwweDAwLDB4ZmYsMHg3NSwweDRjLDB4MjYsMHhhMCwweDE5LDB4MDAsMHgyNCwweGMwLDB4M2MsMHg0MCwweDc1LDB4MTEsMHg4MAorLDB4M2UsMHg5NSwweDM2LDB4MDAsMHg3NCwweDNiLDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweGZmLDB4ZmYsMHhlOSwweDMxLDB4MDAKKywweGU4LDB4ZjEsMHgwNCwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDMsMHgwMCwweDc0LDB4MmYsMHg4YiwweGQ4LDB4YjgsMHg3ZCwweDAzCissMHhjZCwweDNhLDB4OGIsMHhjMywweGM2LDB4MDYsMHhhMCwweDM2LDB4MDYsMHhmNywweDA2LDB4OWIsMHgzNiwweDAyLDB4MDAsMHg3NQorLDB4MDUsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA0LDB4ODEsMHgwZSwweDliLDB4MzYsMHg4MCwweDAwLDB4ODMsMHgyNiwweDliLDB4MzYKKywweGZjLDB4ZTksMHgyMywweDAxLDB4ZTgsMHg4NywweDFkLDB4ZTksMHgzMywweDAxLDB4NTAsMHgyNiwweGExLDB4MGMsMHgwMCwweDI1CissMHgwNywweDAwLDB4M2QsMHgwNywweDAwLDB4NzUsMHgwMywweGU5LDB4ODQsMHgwMCwweDNkLDB4MDUsMHgwMCwweDc1LDB4MDMsMHhlOQorLDB4N2MsMHgwMCwweDgzLDB4M2UsMHhlOCwweDNhLDB4MDQsMHg3NCwweDc1LDB4ODMsMHgzZSwweGU4LDB4M2EsMHgwMiwweDc0LDB4NmUKKywweGY3LDB4MDYsMHhlNiwweDM0LDB4MTgsMHg4MCwweDc1LDB4MDMsMHhlOSwweDZhLDB4MDAsMHhmNywweDA2LDB4ZTYsMHgzNCwweDAwCissMHg4MCwweDc0LDB4MzUsMHgyNiwweDgwLDB4M2UsMHgyOSwweDAwLDB4MDIsMHg3NSwweDJkLDB4NTEsMHg1NiwweDU3LDB4OGQsMHgzNgorLDB4M2UsMHgzNCwweDhkLDB4M2UsMHgyMCwweDAwLDB4YjksMHgwNiwweDAwLDB4ZjMsMHhhNiwweDVmLDB4NWUsMHg1OSwweDc0LDB4NDUKKywweDI2LDB4YTEsMHgyMCwweDAwLDB4YTMsMHgzZSwweDM0LDB4MjYsMHhhMSwweDIyLDB4MDAsMHhhMywweDQwLDB4MzQsMHgyNiwweGExCissMHgyNCwweDAwLDB4YTMsMHg0MiwweDM0LDB4ZTksMHgyNiwweDAwLDB4ZjcsMHgwNiwweGU2LDB4MzQsMHgwOCwweDAwLDB4NzQsMHgwYgorLDB4MjYsMHg4MCwweDNlLDB4MTksMHgwMCwweDAwLDB4NzQsMHgwMywweGU5LDB4MTMsMHgwMCwweGY3LDB4MDYsMHhlNiwweDM0LDB4MTAKKywweDAwLDB4NzQsMHgxMiwweDI2LDB4YTAsMHgyOCwweDAwLDB4YzAsMHhlOCwweDA0LDB4MjIsMHhjMCwweDc0LDB4MDcsMHgyNiwweGM3CissMHgwNiwweDA0LDB4MDAsMHhmZiwweGZmLDB4NTgsMHgyMywweGMwLDB4NzQsMHgwMywweGU5LDB4NTcsMHhmZiwweDgxLDB4MjYsMHg5YgorLDB4MzYsMHhmZiwweGZlLDB4ODMsMHhmZSwweDA2LDB4N2YsMHgyNCwweDI2LDB4YTEsMHgyMCwweDAwLDB4M2IsMHgwNiwweGQxLDB4MzYKKywweDc1LDB4MWEsMHgyNiwweGExLDB4MjIsMHgwMCwweDNiLDB4MDYsMHhkMywweDM2LDB4NzUsMHgxMCwweDI2LDB4YTEsMHgyNCwweDAwCissMHgzYiwweDA2LDB4ZDUsMHgzNiwweDc1LDB4MDYsMHg4MSwweDBlLDB4OWIsMHgzNiwweDAwLDB4MDEsMHgyNiwweGExLDB4MjAsMHgwMAorLDB4MjUsMHg3ZiwweGZmLDB4YTMsMHhiOCwweDM0LDB4MjYsMHhhMSwweDIyLDB4MDAsMHhhMywweGJhLDB4MzQsMHgyNiwweGExLDB4MjQKKywweDAwLDB4YTMsMHhiYywweDM0LDB4OGIsMHhjNiwweDg2LDB4YzQsMHhhMywweGMwLDB4MzQsMHhkMSwweGU2LDB4ODAsMHhmYywweDA5CissMHg3NCwweDAzLDB4ZTgsMHhhYSwweDFjLDB4OGIsMHhjNiwweDJlLDB4ZmYsMHhhNCwweDMwLDB4NDksMHgyNiwweGExLDB4MGMsMHgwMAorLDB4M2QsMHhmZiwweDdmLDB4NzQsMHgwZiwweDI2LDB4ZmYsMHgyNiwweDA0LDB4MDAsMHg4ZSwweDA2LDB4MzgsMHgzNCwweGU4LDB4MzYKKywweDA2LDB4Y2QsMHg1MCwweGMzLDB4ZTksMHgxNiwweDAwLDB4Y2QsMHgzNCwweGU5LDB4MTEsMHgwMCwweGNkLDB4MzQsMHg4OSwweDM2CissMHgzZCwweDM3LDB4YTEsMHg5ZCwweDM2LDB4YTMsMHgzZiwweDM3LDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwYywweGU4LDB4OGUsMHgwMAorLDB4YTEsMHg5ZiwweDM2LDB4MjIsMHhlNCwweDc1LDB4MzIsMHhmNywweDA2LDB4NGMsMHgzNywweDAxLDB4MDAsMHg3NSwweDJhLDB4ZjYKKywweDA2LDB4OWQsMHgzNiwweDgwLDB4NzQsMHgwNywweDg4LDB4MjYsMHg5ZSwweDM2LDB4ZTksMHgzMSwweDAwLDB4M2EsMHgwNiwweDlkCissMHgzNiwweGEzLDB4OWQsMHgzNiwweDc0LDB4MjgsMHg4YiwweGYwLDB4MmUsMHhmZiwweGE0LDB4MGQsMHgyYiwweDQ0LDB4MjksMHhlZQorLDB4NDIsMHgxOSwweDQ0LDB4Y2QsMHg0NCwweDJmLDB4NDUsMHg1YSwweDQ1LDB4M2EsMHgyNiwweDllLDB4MzYsMHg3NSwweDAxLDB4YzMKKywweDMyLDB4YzAsMHg4NiwweGM0LDB4OGIsMHhmMCwweGEyLDB4OWUsMHgzNiwweDJlLDB4ZmYsMHhhNCwweDIwLDB4NDksMHg4YiwweDJlCissMHg5OSwweDM2LDB4MjMsMHhlZCwweDc1LDB4MDEsMHhjMywweGJmLDB4MDEsMHgwMCwweGJlLDB4MDAsMHgwMCwweDg1LDB4ZmQsMHg3NQorLDB4MWEsMHg0NiwweGQxLDB4ZTcsMHhlOSwweGY2LDB4ZmYsMHgyYSwweDAwLDB4MjksMHgwMCwweDI4LDB4MDAsMHgyNywweDAwLDB4MjUKKywweDAwLDB4MDUsMHgwMCwweDA3LDB4MDAsMHgyNiwweDAwLDB4MDYsMHgwMCwweDIwLDB4MDAsMHhmNywweGQ3LDB4MjEsMHgzZSwweDk5CissMHgzNiwweGQxLDB4ZTYsMHgyZSwweDhiLDB4YjQsMHg0NywweDJiLDB4ZTksMHg0ZiwweGZmLDB4ZTksMHg1NiwweGZmLDB4ODAsMHgyNgorLDB4OWUsMHgzNiwweGZmLDB4NzUsMHgxNywweGY3LDB4MDYsMHg0YywweDM3LDB4MDEsMHgwMCwweDc1LDB4MGYsMHhmNiwweDA2LDB4OWQKKywweDM2LDB4ODAsMHg3NCwweDA4LDB4ZjcsMHgwNiwweDY2LDB4MzcsMHhmZiwweGZmLDB4NzUsMHgwNywweGM3LDB4MDYsMHg2NiwweDM3CissMHgwMCwweDAwLDB4YzMsMHhmNywweDA2LDB4NDEsMHgzNywweDAxLDB4MDAsMHg3NSwweDBiLDB4YjgsMHg3ZiwweDAzLDB4Y2QsMHgzOQorLDB4YzcsMHgwNiwweDQxLDB4MzcsMHgwMSwweDAwLDB4MzMsMHhmNiwweGI4LDB4MDAsMHg0MCwweDg1LDB4MDYsMHg2NiwweDM3LDB4NzQKKywweDIxLDB4ODAsMHhiYywweDU0LDB4MzcsMHhmZiwweDc0LDB4MDQsMHhmZSwweDg0LDB4NTQsMHgzNywweDgwLDB4YmMsMHg5NiwweDM0CissMHhmZiwweDc0LDB4MDQsMHhmZSwweDg0LDB4OTYsMHgzNCwweDMxLDB4MDYsMHg2NiwweDM3LDB4ODMsMHgzZSwweDY2LDB4MzcsMHgwMAorLDB4NzQsMHgwNSwweDQ2LDB4ZDEsMHhlOCwweDczLDB4ZDQsMHhjMywweGExLDB4ZjQsMHgzMywweGE5LDB4MDAsMHg4OCwweDc0LDB4MGIKKywweGE5LDB4MDAsMHgxMCwweDc1LDB4MDksMHg4YiwweDFlLDB4NDMsMHgzNywweGZmLDB4ZTMsMHhlOSwweGQ3LDB4MDAsMHhjNywweDA2CissMHgzNSwweDM3LDB4MDUsMHgwMCwweGM3LDB4MDYsMHg0MywweDM3LDB4MWUsMHgyYywweGY3LDB4MDYsMHhmNCwweDMzLDB4MDAsMHgwOAorLDB4NzQsMHgwNiwweGM3LDB4MDYsMHg0MywweDM3LDB4MTAsMHgyYywweGI4LDB4ODAsMHgwMywweGNkLDB4MzksMHhlOSwweGNkLDB4ZmUKKywweGE5LDB4MDAsMHgwOCwweDc0LDB4ZDksMHhmZiwweDBlLDB4MzUsMHgzNywweDc1LDB4ZWQsMHhlOSwweDY2LDB4MDAsMHhhOSwweDAwCissMHgwOCwweDc1LDB4Y2IsMHhmZiwweDBlLDB4MzUsMHgzNywweDc1LDB4ZGYsMHg4MSwweDBlLDB4YzIsMHgzNCwweGMwLDB4MDAsMHhmNgorLDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NCwweDQ4LDB4ODEsMHgwZSwweDliLDB4MzYsMHgwMCwweDgwLDB4ZjcsMHgwNiwweDliLDB4MzYKKywweDAxLDB4MDAsMHg3NCwweDFlLDB4YjgsMHg3ZCwweDAzLDB4Y2QsMHgzYSwweDgxLDB4MGUsMHg5YiwweDM2LDB4ODAsMHgwMCwweDgzCissMHgyNiwweDliLDB4MzYsMHhmZSwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDIsMHgwMCwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDQsMHhlOQorLDB4N2IsMHhmZSwweDgwLDB4M2UsMHhhMCwweDM2LDB4MDQsMHg3NSwweDA3LDB4ODMsMHgzZSwweDBmLDB4MzcsMHgwMSwweDc1LDB4MDUKKywweGM2LDB4MDYsMHhhMCwweDM2LDB4MDYsMHhjNywweDA2LDB4MGYsMHgzNywweDAyLDB4MDAsMHhlOSwweDVmLDB4ZmUsMHhiZSwweDAyCissMHgwMCwweGU5LDB4NGEsMHhmZSwweDgwLDB4MjYsMHg5ZSwweDM2LDB4ZmYsMHg3NSwweDNhLDB4ZjYsMHgwNiwweDlkLDB4MzYsMHg4MAorLDB4NzQsMHgyZCwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDAsMHgyMCwweDc1LDB4MmIsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA2LDB4ZmYKKywweDA2LDB4OTQsMHgzNCwweDgzLDB4MGUsMHg2NiwweDM3LDB4MjAsMHg4ZSwweDA2LDB4MzAsMHgzNCwweDI2LDB4ZjcsMHgwNiwweDBhCissMHgwMCwweDAwLDB4MDEsMHg3NCwweDA3LDB4MjYsMHg4MSwweDBlLDB4MDgsMHgwMCwweDAwLDB4MDEsMHhlOSwweDA2LDB4MDAsMHhiZQorLDB4MDQsMHgwMCwweGU5LDB4MDksMHhmZSwweDgxLDB4MGUsMHhhZiwweDM2LDB4MDAsMHgwOCwweGExLDB4YWYsMHgzNiwweGU3LDB4MDYKKywweGU1LDB4MGEsMHhhOSwweDAwLDB4ODAsMHg3NCwweDBlLDB4ODEsMHgyNiwweGFmLDB4MzYsMHhmZiwweGY3LDB4YTEsMHhhZiwweDM2CissMHhlNywweDA2LDB4ZTksMHgwOSwweGZmLDB4ZTksMHhmNSwweGZkLDB4YzcsMHgwNiwweDQxLDB4MzcsMHgwMCwweDAwLDB4ODMsMHgwZQorLDB4OTksMHgzNiwweDAyLDB4ZTksMHhlNywweGZkLDB4ODAsMHgyNiwweDllLDB4MzYsMHhmZiwweDc1LDB4MWQsMHhmNywweDA2LDB4OWIKKywweDM2LDB4MDAsMHg0MCwweDc1LDB4MDUsMHg4MywweDBlLDB4OTksMHgzNiwweDA4LDB4ODMsMHgwZSwweDk5LDB4MzYsMHgyMCwweDgxCissMHgyNiwweDliLDB4MzYsMHhmZiwweGJmLDB4YjgsMHg4NSwweDAzLDB4Y2QsMHgzOSwweGU5LDB4YzAsMHhmZCwweDgwLDB4M2UsMHg5ZQorLDB4MzYsMHgwNiwweDc0LDB4MDcsMHg4MCwweDNlLDB4OWUsMHgzNiwweDBhLDB4NzUsMHgzNCwweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAKKywweDc1LDB4MDYsMHhiZSwweDA3LDB4MDAsMHhlOSwweDk2LDB4ZmQsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA0LDB4ODMsMHgzZSwweDBmCissMHgzNywweDAyLDB4NzQsMHgxYiwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDQsMHgwMCwweDgwLDB4M2UsMHg5ZSwweDM2LDB4MDYsMHg3NQorLDB4MGUsMHhmNywweDA2LDB4OWIsMHgzNiwweDQwLDB4MDAsMHg3NSwweDA2LDB4YzcsMHgwNiwweDBmLDB4MzcsMHgwMywweDAwLDB4ZTkKKywweDdiLDB4ZmQsMHg4MCwweDNlLDB4OWQsMHgzNiwweDA0LDB4NzUsMHgxMiwweDgxLDB4MGUsMHhjMiwweDM0LDB4MDAsMHg0MCwweGZmCissMHgwNiwweDkyLDB4MzQsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA2LDB4ZTksMHg2MiwweGZkLDB4YmUsMHgwNSwweDAwLDB4ZTksMHg0ZAorLDB4ZmQsMHhmNiwweDA2LDB4OWQsMHgzNiwweDgwLDB4NzUsMHgxOSwweDgzLDB4MGUsMHhjMiwweDM0LDB4MDQsMHhiZSwweDA2LDB4MDAKKywweGU5LDB4M2IsMHhmZCwweDgwLDB4MjYsMHg5ZSwweDM2LDB4ZmYsMHg3NSwweGM1LDB4ZmYsMHgwNiwweDMxLDB4MzcsMHhlOSwweDAwCissMHgwMCwweDgzLDB4MjYsMHhjMiwweDM0LDB4YmYsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA2LDB4ZTksMHgyZiwweGZkLDB4ZTUsMHgwYQorLDB4NTAsMHgyNSwweGMzLDB4YmYsMHhlNywweDBhLDB4NTgsMHg4MCwweDI2LDB4OWUsMHgzNiwweGZmLDB4NzUsMHgwZCwweGE5LDB4MDAKKywweDQwLDB4NzUsMHgwOCwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDYsMHhlOSwweDEyLDB4ZmQsMHhiOCwweDgzLDB4MDMsMHhjZCwweDM5CissMHhjMywweGI4LDB4N2MsMHgwMywweGNkLDB4MzksMHhmNywweDA2LDB4ZjQsMHgzMywweDAwLDB4MTAsMHg3NSwweDA5LDB4YzcsMHgwNgorLDB4MzMsMHgzNywweDAyLDB4MDAsMHhlOSwweGY2LDB4ZmMsMHhmZiwweDBlLDB4MzMsMHgzNywweDc0LDB4MDMsMHhlOSwweGVkLDB4ZmMKKywweGZmLDB4MDYsMHg4ZSwweDM0LDB4ZTgsMHhmNywweDE5LDB4ODMsMHgwZSwweGMyLDB4MzQsMHgwOCwweGJlLDB4MDMsMHgwMCwweGU5CissMHhjYywweGZjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDA0LDB4MDQsMHgwNQorLDB4MDQsMHgwNCwweDA0LDB4MDAsMHgwMywweDAwLDB4MDMsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDQsMHgwMCwweDA4LDB4MDgsMHgwNSwweDA4LDB4MDgsMHgwOCwweDAwLDB4MDMsMHgwMCwweDAzLDB4MDMsMHgwMCwweDAwCissMHgwMiwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDBhLDB4MTQsMHgwMCwweDAwLDB4MWEsMHgwMAorLDB4MWMsMHgwMCwweDFlLDB4MjAsMHgwMCwweDAwLDB4MDQsMHg0MSwweDA2LDB4MGIsMHgwOCwweGMyLDB4ZmYsMHhlNywweDA0LDB4MDMKKywweDA2LDB4MDQsMHgwNCwweDA1LDB4MDQsMHgwNiwweDA0LDB4ODcsMHgwNCwweDAzLDB4MDYsMHgwNCwweDA0LDB4ODUsMHg0ZSwweGEyCissMHgwNCwweGNmLDB4MDQsMHhjZCwweGM3LDB4MDYsMHhhMiwweDM3LDB4MDAsMHgwMCwweGM3LDB4MDYsMHhhNiwweDM3LDB4MDAsMHgwMAorLDB4MjYsMHhhMSwweDIwLDB4MDAsMHgyNSwweDdmLDB4ZmYsMHhhMywweGY1LDB4MzYsMHgyNiwweGExLDB4MjIsMHgwMCwweGEzLDB4ZjcKKywweDM2LDB4MjYsMHhhMSwweDI0LDB4MDAsMHhhMywweGY5LDB4MzYsMHhlOCwweDNiLDB4MTksMHg4YiwweGYwLDB4MjYsMHg4YiwweDBlCissMHgwZSwweDAwLDB4MmIsMHhjOCwweDgzLDB4ZTksMHgwZSwweGI4LDB4MDEsMHg4MCwweDgzLDB4ZjksMHgwNCwweDdjLDB4NTEsMHgyNgorLDB4OGEsMHg1NCwweDI4LDB4ODgsMHgxNiwweDFjLDB4MzcsMHg0MCwweDI2LDB4OGIsMHg2YywweDI2LDB4ODYsMHhjZCwweDNiLDB4Y2QKKywweDg2LDB4Y2QsMHg4OSwweDBlLDB4YTQsMHgzNywweDc1LDB4MzgsMHg0MCwweDMyLDB4ZmYsMHgyNiwweDhhLDB4NWMsMHgyOSwweDgwCissMHhmYiwweDE1LDB4NzcsMHgyNSwweDgwLDB4ZmIsMHgwYSwweDc0LDB4MjAsMHg4MCwweGZiLDB4MDEsMHg3NCwweDFiLDB4YjgsMHgwNAorLDB4ODAsMHgyZSwweDNhLDB4OTcsMHgwMiwweDJlLDB4NzQsMHgwNywweDJlLDB4M2EsMHg5NywweDE4LDB4MmUsMHg3NSwweDExLDB4MzMKKywweGMwLDB4ODAsMHhmYiwweDA5LDB4NzUsMHg0ZiwweDhiLDB4ZjMsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHhmZiwweGZmCissMHg1MCwweDUyLDB4YTEsMHhhNCwweDM3LDB4ODYsMHhjNCwweDI2LDB4M2IsMHgwNiwweDI2LDB4MDAsMHg3YywweDMyLDB4MjYsMHg4MQorLDB4M2UsMHgyNiwweDAwLDB4MDAsMHgwNCwweDdlLDB4MjksMHg4ZCwweDc0LDB4MmEsMHgyNiwweDhiLDB4MTQsMHgyMiwweGQyLDB4NzQKKywweDFmLDB4ODAsMHhlNiwweGJmLDB4ODAsMHhmZSwweDA5LDB4NzUsMHgxNywweGM3LDB4MDYsMHhhMiwweDM3LDB4MDEsMHgwMCwweDgwCissMHhmYSwweDA0LDB4NzUsMHgwYywweDI2LDB4OGIsMHg0NCwweDAyLDB4YTMsMHgwMywweDM3LDB4ODYsMHhjNCwweGEzLDB4ZDAsMHgzNAorLDB4NWEsMHg1OCwweGU5LDB4YjEsMHhmZiwweGJkLDB4NzIsMHgzNywweDJlLDB4OGEsMHg4NywweDJlLDB4MmUsMHgyMiwweGMwLDB4NzQKKywweDE2LDB4MDUsMHg0NCwweDJlLDB4OGIsMHhmOCwweDJlLDB4OGIsMHgwNSwweDNlLDB4ODksMHg0NiwweDAwLDB4ODMsMHhjNSwweDAyCissMHg4MywweGM3LDB4MDIsMHgyMiwweGU0LDB4N2QsMHhlZiwweDhkLDB4NzQsMHgyYSwweDgzLDB4ZTksMHgwNCwweDc1LDB4MDMsMHhlOQorLDB4YTEsMHgwMCwweDI2LDB4OGIsMHgxNCwweDIyLDB4ZDIsMHg3NSwweDAzLDB4ZTksMHg3YywweDAwLDB4YzcsMHgwNiwweGE2LDB4MzcKKywweDAxLDB4MDAsMHhiZiwweDcyLDB4MzcsMHg4YiwweDA1LDB4ODMsMHhjNywweDAyLDB4ODAsMHhlNiwweGJmLDB4ODAsMHhlNCwweDNmCissMHg4MCwweGZlLDB4MDksMHg3NSwweDIyLDB4ODAsMHhmYSwweDA0LDB4NzUsMHg1ZSwweGM3LDB4MDYsMHhhMiwweDM3LDB4MDEsMHgwMAorLDB4MjYsMHg4YiwweDQ0LDB4MDIsMHhhMywweDAzLDB4MzcsMHg4NiwweGM0LDB4YTMsMHhkMCwweDM0LDB4ODYsMHhjNCwweGM3LDB4MDYKKywweGE2LDB4MzcsMHgwMCwweDAwLDB4ZTksMHg0NywweDAwLDB4M2IsMHhmZCwweDdlLDB4MTUsMHgyNiwweDhiLDB4MDQsMHhhOCwweDQwCissMHg3NCwweDA2LDB4YjgsMHgwNywweDgwLDB4ZTksMHgzOCwweGZmLDB4MzIsMHhjMCwweDI2LDB4OGIsMHgwNCwweGU5LDB4MmUsMHgwMAorLDB4M2EsMHhmNCwweDc1LDB4YjEsMHhjNywweDQ1LDB4ZmUsMHgwMCwweDAwLDB4ODAsMHhmZSwweDIyLDB4NzUsMHgwZCwweDNhLDB4ZDAKKywweDc3LDB4MTYsMHhjNywweDA2LDB4YTYsMHgzNywweDAwLDB4MDAsMHhlOSwweDEzLDB4MDAsMHgzYSwweGQwLDB4NzUsMHgwOSwweGM3CissMHgwNiwweGE2LDB4MzcsMHgwMCwweDAwLDB4ZTksMHgwNiwweDAwLDB4YjgsMHgwNSwweDgwLDB4ZTksMHgwMiwweGZmLDB4MzIsMHhmNgorLDB4MDMsMHhmMiwweDJiLDB4Y2EsMHhiOCwweDA1LDB4ODAsMHgyMywweGM5LDB4NzYsMHgwMywweGU5LDB4NjQsMHhmZiwweDc0LDB4MDMKKywweGU5LDB4ZWQsMHhmZSwweDMzLDB4YzAsMHhiZiwweDcyLDB4MzcsMHg4YiwweDE1LDB4NDcsMHg0NywweDNiLDB4ZmQsMHg3ZiwweDFiCissMHhmNiwweGM2LDB4ODAsMHg3NCwweDE2LDB4ZjcsMHgwNiwweGE2LDB4MzcsMHgwMSwweDAwLDB4NzQsMHgwNiwweGI4LDB4MDgsMHg4MAorLDB4ZTksMHhjMywweGZlLDB4ZjYsMHhjNiwweDQwLDB4NzQsMHhlMCwweGI4LDB4MDcsMHg4MCwweGU5LDB4YjgsMHhmZSwweDdkLDB4NDIKKywweGEzLDB4NDUsMHg0NCwweDI5LDB4NDQsMHgyOSwweGI3LDB4MjgsMHhlMiwweDI4LDB4ZWUsMHgyYiwweGYyLDB4MjgsMHhmNSwweDI4CissMHgwMSwweDI5LDB4YWMsMHgyYSwweDQ0LDB4MjksMHg0NCwweDI5LDB4NDQsMHgyOSwweDQ0LDB4MjksMHg0NCwweDI5LDB4MDAsMHgwMAorLDB4NzMsMHgzNiwweDAwLDB4MDAsMHgwMywweDM2LDB4YzUsMHgzNSwweDgzLDB4MzUsMHg0NSwweDM1LDB4MDcsMHgzNSwweGQyLDB4MzQKKywweDQ1LDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4YTYsMHgzOCwweDAwLDB4MDAsMHhlMCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweGYyLDB4MzMsMHgwMCwweDAwLDB4YTYsMHgzMywweDYwLDB4MzMsMHhmZCwweDMyLDB4YmMsMHgzMiwweDc3LDB4MzIsMHgzYywweDMyCissMHhmYiwweDMxLDB4NmEsMHgzMSwweDBhLDB4MzEsMHhlMCwweGUwLDB4MTAsMHgxMCwweDEwLDB4ZTAsMHhlMCwweGUwLDB4ZTAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGUwLDB4MDAsMHhlMCwweGUwLDB4ZTAsMHhlMCwweGUwLDB4ZTAsMHhlMCwweGUwCissMHhlMCwweDMzLDB4ZmYsMHgyNiwweGY2LDB4MDYsMHgxYSwweDAwLDB4ODAsMHg3NCwweDFiLDB4MjYsMHg4MCwweDI2LDB4MWEsMHgwMAorLDB4N2YsMHgyNiwweDhiLDB4M2UsMHgyNiwweDAwLDB4ODMsMHhlNywweDFmLDB4NzQsMHgwYiwweDI2LDB4ODAsMHgwZSwweDIwLDB4MDAKKywweDgwLDB4MjYsMHgwMSwweDNlLDB4MGUsMHgwMCwweGMzLDB4NjAsMHgyZSwweDhiLDB4ODQsMHhhNiwweDMwLDB4MjYsMHhhMywweDE4CissMHgwMCwweGQxLDB4ZTYsMHgyZSwweGZmLDB4OTQsMHg1MCwweDMwLDB4NjEsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHhjNAorLDB4MmEsMHgyNiwweGM3LDB4MDYsMHgwZSwweDAwLDB4MTYsMHgwMCwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwNiwweDAwLDB4MjYKKywweGM2LDB4MDYsMHgxOSwweDAwLDB4MDAsMHhlOCwweGJmLDB4MDUsMHhlOCwweDk4LDB4MDUsMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwCissMHgwMCwweDA4LDB4MjYsMHhjNiwweDA2LDB4MjgsMHgwMCwweDQwLDB4MjYsMHhjNiwweDA2LDB4MjksMHgwMCwweDJhLDB4YmYsMHgyYQorLDB4MDAsMHgyNiwweGM2LDB4MDUsMHgwNCwweDI2LDB4YzYsMHg0NSwweDAxLDB4MmEsMHhhMSwweDkzLDB4MzcsMHgzMywweGRiLDB4YTkKKywweDQwLDB4MDAsMHg3NSwweDAyLDB4YjMsMHgwMSwweGE5LDB4MDAsMHgxMCwweDc0LDB4MDIsMHhiNywweDg4LDB4YTksMHgwMCwweDA4CissMHg3NCwweDAzLDB4ODAsMHhjZiwweDQ0LDB4MjYsMHg4OSwweDVkLDB4MDIsMHhjMywweDgzLDB4MGUsMHhjMiwweDM0LDB4MjAsMHgyNgorLDB4YzcsMHgwNiwweDA0LDB4MDAsMHg2YiwweDJiLDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDMwLDB4MDAsMHgyNiwweGM3LDB4MDYKKywweDA2LDB4MDAsMHgwYSwweDAwLDB4MjYsMHhjNywweDA2LDB4MGEsMHgwMCwweDA0LDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOSwweDAwCissMHgwMCwweGU4LDB4NjksMHgwNSwweGU4LDB4MmMsMHgwNSwweDI2LDB4YzcsMHgwNiwweDI2LDB4MDAsMHgwMCwweDIyLDB4MjYsMHhjNgorLDB4MDYsMHgyOCwweDAwLDB4NjAsMHgyNiwweGM2LDB4MDYsMHgyOSwweDAwLDB4MjksMHhiZiwweDJhLDB4MDAsMHgyNiwweGM2LDB4MDUKKywweDA4LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgyZCwweDhkLDB4N2QsMHgwMiwweGJlLDB4NTQsMHgzNywweGI5LDB4MDMsMHgwMCwweGYzCissMHhhNSwweDI2LDB4YzYsMHgwNSwweDA4LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgyZSwweDhkLDB4N2QsMHgwMiwweGJlLDB4NWEsMHgzNworLDB4YjksMHgwMywweDAwLDB4ZjMsMHhhNSwweGU4LDB4ZDQsMHgwNSwweGU4LDB4NjQsMHgwNSwweGI5LDB4MDYsMHgwMCwweGJlLDB4NTQKKywweDM3LDB4OGQsMHgyZSwweDJjLDB4MDAsMHgyNiwweDhiLDB4NDYsMHgwMCwweDI5LDB4MDQsMHg4MywweGM2LDB4MDIsMHg4MywweGM1CissMHgwMiwweDgzLDB4ZjksMHgwNCwweDc1LDB4MDIsMHg0NSwweDQ1LDB4ZTIsMHhlYiwweGMzLDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMAorLDB4YzQsMHgyYSwweDI2LDB4YzcsMHgwNiwweDBlLDB4MDAsMHgyNCwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDA2LDB4MDAKKywweDI2LDB4YzYsMHgwNiwweDE5LDB4MDAsMHgwMCwweGU4LDB4ZTQsMHgwNCwweGU4LDB4YTcsMHgwNCwweDI2LDB4YzcsMHgwNiwweDI2CissMHgwMCwweDAwLDB4MTYsMHgyNiwweGM2LDB4MDYsMHgyOCwweDAwLDB4NjAsMHgyNiwweGM2LDB4MDYsMHgyOSwweDAwLDB4MjgsMHhiZgorLDB4MmEsMHgwMCwweGU4LDB4NWIsMHgwNiwweGU4LDB4NzQsMHgwNSwweGU4LDB4MDQsMHgwNSwweGMzLDB4MjYsMHhjNywweDA2LDB4MDQKKywweDAwLDB4YzQsMHgyYSwweDI2LDB4YzcsMHgwNiwweDBlLDB4MDAsMHgxYSwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDA2CissMHgwMCwweDI2LDB4YzYsMHgwNiwweDE5LDB4MDAsMHgwMCwweGU4LDB4YTMsMHgwNCwweGU4LDB4NjYsMHgwNCwweDI2LDB4YzcsMHgwNgorLDB4MjYsMHgwMCwweDAwLDB4MGMsMHgyNiwweGM2LDB4MDYsMHgyOCwweDAwLDB4NjAsMHgyNiwweGM2LDB4MDYsMHgyOSwweDAwLDB4MjcKKywweGJmLDB4MmEsMHgwMCwweGU4LDB4MjEsMHgwNSwweGMzLDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweGM0LDB4MmEsMHgyNiwweGM3CissMHgwNiwweDBlLDB4MDAsMHgyMCwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDBhLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwYQorLDB4MDAsMHgwNCwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAwLDB4ZTgsMHg0YiwweDA0LDB4ZTgsMHgyNCwweDA0LDB4MjYKKywweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAsMHgxMiwweDI2LDB4YzYsMHgwNiwweDI4LDB4MDAsMHg0MCwweDI2LDB4YzYsMHgwNiwweDI5CissMHgwMCwweDI2LDB4YmYsMHgyYSwweDAwLDB4ZTgsMHhmNCwweDA0LDB4ZTgsMHg4NCwweDA0LDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNAorLDB4MDAsMHhjNCwweDJhLDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDM0LDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDYKKywweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAwLDB4ZTgsMHgwZCwweDA0LDB4ZTgsMHhlNiwweDAzLDB4MjYsMHhjNywweDA2CissMHgyNiwweDAwLDB4MDAsMHgyNiwweDI2LDB4YzYsMHgwNiwweDI4LDB4MDAsMHg0MCwweDI2LDB4YzYsMHgwNiwweDI5LDB4MDAsMHgyNQorLDB4YmYsMHgyYSwweDAwLDB4ZTgsMHhiNiwweDA0LDB4ZTgsMHg0NiwweDA0LDB4ZTgsMHhmYSwweDA0LDB4YzMsMHgyNiwweGM3LDB4MDYKKywweDA0LDB4MDAsMHhjNCwweDJhLDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDM4LDB4MDAsMHhhMSwweGEyLDB4MzcsMHg1MCwweDBiCissMHhjMCwweDc1LDB4MDcsMHgyNiwweGM3LDB4MDYsMHgwZSwweDAwLDB4MzQsMHgwMCwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwNgorLDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOSwweDAwLDB4MDAsMHhlOCwweDk5LDB4MDMsMHhlOCwweGE0LDB4ZmQsMHgyNiwweGM3LDB4NDUKKywweDI2LDB4MDAsMHgyYSwweDU4LDB4MGIsMHhjMCwweDc1LDB4MDYsMHgyNiwweGM3LDB4NDUsMHgyNiwweDAwLDB4MjYsMHhhMSwweDFjCissMHgzNywweGMxLDB4ZTAsMHgwNCwweDI2LDB4ODgsMHg0NSwweDI4LDB4MjYsMHhjNiwweDQ1LDB4MjksMHgyNCwweDgzLDB4YzcsMHgyYQorLDB4ZTgsMHgyOSwweDA0LDB4ZTgsMHhhMCwweDA0LDB4ZTgsMHgyMiwweDA1LDB4ZTgsMHhmOCwweDAzLDB4ZTgsMHgwOSwweDA0LDB4YzMKKywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHhjNCwweDJhLDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDMyLDB4MDAsMHgyNiwweGM3CissMHgwNiwweDA2LDB4MDAsMHgwNiwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAwLDB4ZTgsMHg0NSwweDAzLDB4ZTgsMHg1MAorLDB4ZmQsMHgyNiwweGM3LDB4NDUsMHgyNiwweDAwLDB4MjQsMHhhMSwweDFjLDB4MzcsMHhjMSwweGUwLDB4MDQsMHgyNiwweDg4LDB4NDUKKywweDI4LDB4MjYsMHhjNiwweDQ1LDB4MjksMHgyMywweDgzLDB4YzcsMHgyYSwweGU4LDB4ZTAsMHgwMywweGU4LDB4NmMsMHgwNCwweGU4CissMHg4YSwweDA0LDB4ZTgsMHg5YywweDA0LDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4YzQsMHgyYSwweDI2LDB4YzcsMHgwNgorLDB4MGUsMHgwMCwweDM0LDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDYsMHgwMCwweDI2LDB4YzYsMHgwNiwweDE5LDB4MDAKKywweDAwLDB4ZTgsMHhmZiwweDAyLDB4ZTgsMHgwYSwweGZkLDB4MjYsMHhjNywweDQ1LDB4MjYsMHgwMCwweDI2LDB4YTEsMHgxYywweDM3CissMHhjMSwweGUwLDB4MDQsMHgyNiwweDg4LDB4NDUsMHgyOCwweDI2LDB4YzYsMHg0NSwweDI5LDB4MjIsMHg4MywweGM3LDB4MmEsMHhlOAorLDB4OWEsMHgwMywweGU4LDB4YzcsMHgwMywweGU4LDB4NTcsMHgwMywweGU4LDB4ZjgsMHgwMywweGU4LDB4NzgsMHgwNCwweGU4LDB4OGEKKywweDA0LDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4NzQsMHg0NSwweDI2LDB4YzcsMHgwNiwweDBlLDB4MDAsMHgzZSwweDAwCissMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDYsMHgwMCwweDI2LDB4YzcsMHgwNiwweDBhLDB4MDAsMHgwNCwweDAwLDB4MjYsMHhjNgorLDB4MDYsMHgxOSwweDAwLDB4MDAsMHhlOCwweGZjLDB4MDIsMHhlOCwweGE5LDB4MDIsMHg4MywweDNlLDB4OGQsMHgzNywweDAzLDB4NzUKKywweDAxLDB4OTAsMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAsMHgzMCwweDI2LDB4YzYsMHgwNiwweDI4LDB4MDAsMHg1MCwweDI2CissMHhjNiwweDA2LDB4MjksMHgwMCwweDIwLDB4YmYsMHgyYSwweDAwLDB4ZTgsMHhkMCwweDAzLDB4ZTgsMHgwMSwweDAzLDB4ZTgsMHhiNQorLDB4MDMsMHhlOCwweDlmLDB4MDMsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHg2MSwweDQzLDB4YjksMHhmMCwweDAwLDB4ODMKKywweGU5LDB4MDIsMHgyNiwweDg5LDB4MGUsMHgwZSwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDAyLDB4MDAsMHgyNiwweGM2CissMHgwNiwweDE5LDB4MDAsMHgwMCwweDI2LDB4YzcsMHgwNiwweDFhLDB4MDAsMHgwMCwweDAwLDB4MjYsMHhjNywweDA2LDB4MWMsMHgwMAorLDB4MDAsMHgwMCwweDI2LDB4YzcsMHgwNiwweDFlLDB4MDAsMHgwMCwweDAwLDB4ZTgsMHg0NywweDAyLDB4ODMsMHhlOSwweDBlLDB4ODYKKywweGNkLDB4MjYsMHg4OSwweDBlLDB4MjYsMHgwMCwweDg2LDB4Y2QsMHgyNiwweGM2LDB4MDYsMHgyOCwweDAwLDB4MDAsMHgyNiwweGM2CissMHgwNiwweDI5LDB4MDAsMHgwOCwweGJmLDB4MmEsMHgwMCwweDgzLDB4ZTksMHgwNCwweDI2LDB4ODksMHgwZCwweDI2LDB4YzYsMHg0NQorLDB4MDEsMHgyNiwweDhkLDB4N2QsMHgwMiwweDgzLDB4ZTksMHgwMiwweGJiLDB4MDEsMHgwMCwweGI4LDB4MzAsMHgzMCwweDRiLDB4NzUKKywweDE3LDB4YmIsMHgwYSwweDAwLDB4OGEsMHhjNCwweDI2LDB4ODgsMHgwNSwweGIwLDB4MzEsMHg4MCwweGM0LDB4MDEsMHg4MCwweGZjCissMHgzYSwweDc1LDB4MGEsMHhiNCwweDYxLDB4ZTksMHgwNSwweDAwLDB4MjYsMHg4OCwweDA1LDB4MDQsMHgwMSwweDQ3LDB4NDksMHg3NQorLDB4ZGQsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHgwNCwweDQ1LDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDEyLDB4MDAKKywweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwNiwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAxLDB4ZTgsMHhlNSwweDAxCissMHhlOCwweGQwLDB4MDEsMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAsMHgwNCwweDI2LDB4YzYsMHgwNiwweDI4LDB4MDAsMHgwMAorLDB4MjYsMHhjNiwweDA2LDB4MjksMHgwMCwweDA3LDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4YzQsMHgyYSwweDI2LDB4YzcKKywweDA2LDB4MGUsMHgwMCwweDIwLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDYsMHgwMCwweDI2LDB4YzYsMHgwNiwweDE5CissMHgwMCwweDA2LDB4ZTgsMHgwNCwweDAyLDB4ZTgsMHg5YiwweDAxLDB4MjYsMHhjNywweDA2LDB4MjYsMHgwMCwweDAwLDB4MTIsMHgyNgorLDB4YzYsMHgwNiwweDI4LDB4MDAsMHgwMCwweDI2LDB4YzYsMHgwNiwweDI5LDB4MDAsMHgwNiwweGJmLDB4MmEsMHgwMCwweGU4LDB4NmIKKywweDAyLDB4ZTgsMHhmYiwweDAxLDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4YzQsMHgyYSwweDI2LDB4YzcsMHgwNiwweDBlCissMHgwMCwweDIwLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDYsMHgwMCwweDI2LDB4YzYsMHgwNiwweDE5LDB4MDAsMHgwNQorLDB4ZTgsMHhjNiwweDAxLDB4ZTgsMHg1ZCwweDAxLDB4MjYsMHhjNywweDA2LDB4MjYsMHgwMCwweDAwLDB4MTIsMHgyNiwweGM2LDB4MDYKKywweDI4LDB4MDAsMHgwMCwweDI2LDB4YzYsMHgwNiwweDI5LDB4MDAsMHgwNSwweGJmLDB4MmEsMHgwMCwweGU4LDB4MmQsMHgwMiwweGU4CissMHhiZCwweDAxLDB4YzMsMHhmZiwweDA2LDB4ODIsMHgzNCwweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHgzZCwweDQxLDB4MjYsMHhjNworLDB4MDYsMHgwZSwweDAwLDB4MjAsMHgwMCwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwZSwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTkKKywweDAwLDB4MDQsMHhlOCwweDg0LDB4MDEsMHhlOCwweDFiLDB4MDEsMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAsMHgxMiwweDI2CissMHhjNiwweDA2LDB4MjgsMHgwMCwweDAwLDB4MjYsMHhjNiwweDA2LDB4MjksMHgwMCwweDA0LDB4YmYsMHgyYSwweDAwLDB4ZTgsMHhlYgorLDB4MDEsMHhlOCwweDdiLDB4MDEsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHg2NywweDQyLDB4MjYsMHhjNywweDA2LDB4MGUKKywweDAwLDB4MjAsMHgwMCwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwOCwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAzCissMHhlOCwweDQ2LDB4MDEsMHhlOCwweGRkLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAsMHgxMiwweDI2LDB4YzYsMHgwNgorLDB4MjgsMHgwMCwweDAwLDB4MjYsMHhjNiwweDA2LDB4MjksMHgwMCwweDAzLDB4YmYsMHgyYSwweDAwLDB4ZTgsMHhhZCwweDAxLDB4ZTgKKywweDNkLDB4MDEsMHhjMywweGZmLDB4MDYsMHg4NCwweDM0LDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweDY3LDB4NDIsMHgyNiwweGM3CissMHgwNiwweDBlLDB4MDAsMHgyNCwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDA4LDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOQorLDB4MDAsMHgwMiwweGU4LDB4MDQsMHgwMSwweGU4LDB4OWIsMHgwMCwweDI2LDB4YzcsMHgwNiwweDI2LDB4MDAsMHgwMCwweDE2LDB4MjYKKywweGM2LDB4MDYsMHgyOCwweDAwLDB4MDAsMHgyNiwweGM2LDB4MDYsMHgyOSwweDAwLDB4MDIsMHhiZiwweDJhLDB4MDAsMHgyNiwweGM2CissMHgwNSwweDA0LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgwMSwweGExLDB4MGYsMHgzNywweDg2LDB4ZTAsMHhmNiwweDA2LDB4NmYsMHgzNworLDB4MDEsMHg3NSwweDBmLDB4MzksMHgwNiwweGNjLDB4MzQsMHg3NCwweDA5LDB4OGIsMHhkOCwweGI4LDB4ODksMHgwMywweGNkLDB4MzkKKywweDhiLDB4YzMsMHhhMywweGNjLDB4MzQsMHgyNiwweDg5LDB4NDUsMHgwMiwweDhkLDB4N2QsMHgwNCwweGU4LDB4M2QsMHgwMSwweGU4CissMHhjZCwweDAwLDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4YzQsMHgyYSwweDI2LDB4YzcsMHgwNiwweDBlLDB4MDAsMHgxYworLDB4MDAsMHhhMSwweGEyLDB4MzcsMHg1MCwweDBiLDB4YzAsMHg3NSwweDA3LDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDE4LDB4MDAKKywweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwNiwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAwLDB4ZTgsMHgyMywweDAwCissMHhlOCwweDJlLDB4ZmEsMHgyNiwweGM3LDB4NDUsMHgyNiwweDAwLDB4MGUsMHg1OCwweDBiLDB4YzAsMHg3NSwweDA2LDB4MjYsMHhjNworLDB4NDUsMHgyNiwweDAwLDB4MGEsMHgyNiwweGM2LDB4NDUsMHgyOSwweDAwLDB4ODMsMHhjNywweDJhLDB4ZTgsMHhiZCwweDAwLDB4ZTgKKywweGZmLDB4MDAsMHhjMywweDU2LDB4NTcsMHg1MSwweGI5LDB4MDMsMHgwMCwweGJlLDB4ZDEsMHgzNiwweGJmLDB4MjAsMHgwMCwweGYzCissMHhhNSwweDU5LDB4NWYsMHg1ZSwweGMzLDB4NTYsMHg1NywweDUxLDB4YjksMHgwMywweDAwLDB4YmUsMHhkMSwweDM2LDB4YmYsMHgxYQorLDB4MDAsMHhmMywweGE1LDB4NTksMHg1ZiwweDVlLDB4YzMsMHgyNiwweGM3LDB4MDYsMHgxYSwweDAwLDB4YzAsMHgwMCwweDI2LDB4YzcKKywweDA2LDB4MWMsMHgwMCwweDAwLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgxZSwweDAwLDB4MDAsMHgxMCwweGMzLDB4MjYsMHhjNywweDA2CissMHgxYSwweDAwLDB4YzAsMHgwMCwweDI2LDB4YzcsMHgwNiwweDFjLDB4MDAsMHgwMCwweDAwLDB4MjYsMHhjNywweDA2LDB4MWUsMHgwMAorLDB4MDAsMHgwOCwweGMzLDB4MjYsMHhjNywweDA2LDB4MWEsMHgwMCwweGMwLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgxYywweDAwLDB4MDAKKywweDAwLDB4MjYsMHhjNywweDA2LDB4MWUsMHgwMCwweDAwLDB4MDIsMHhjMywweDI2LDB4YzcsMHgwNiwweDFhLDB4MDAsMHhjMCwweDAwCissMHgyNiwweGM3LDB4MDYsMHgxYywweDAwLDB4ZmYsMHhmZiwweDI2LDB4YzcsMHgwNiwweDFlLDB4MDAsMHhmZiwweGZmLDB4YzMsMHgyNgorLDB4YzYsMHgwNSwweDA4LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgwMiwweDhkLDB4N2QsMHgwMiwweGJlLDB4MDUsMHgzNywweGI5LDB4MDMKKywweDAwLDB4ZjMsMHhhNSwweGMzLDB4MjYsMHhjNiwweDA1LDB4MDQsMHgyNiwweGM2LDB4NDUsMHgwMSwweDA2LDB4YTEsMHgwZCwweDM3CissMHgyNiwweDg5LDB4NDUsMHgwMiwweDhkLDB4N2QsMHgwNCwweGMzLDB4MjYsMHhjNiwweDA1LDB4MDQsMHgyNiwweGM2LDB4NDUsMHgwMQorLDB4MDcsMHhhMSwweDBiLDB4MzcsMHgyNiwweDg5LDB4NDUsMHgwMiwweDgzLDB4YzcsMHgwNCwweGMzLDB4YTEsMHhhMiwweDM3LDB4MGIKKywweGMwLDB4NzQsMHgxMywweDI2LDB4YzYsMHgwNSwweDA0LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgwOSwweGExLDB4MDMsMHgzNywweDI2CissMHg4OSwweDQ1LDB4MDIsMHg4MywweGM3LDB4MDQsMHhjMywweDI2LDB4YzYsMHgwNSwweDA4LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgwMgorLDB4OGQsMHg3ZCwweDAyLDB4YmUsMHgwNSwweDM3LDB4YjksMHgwMywweDAwLDB4ZjMsMHhhNSwweGMzLDB4MjYsMHhjNiwweDA1LDB4MDYKKywweDI2LDB4YzYsMHg0NSwweDAxLDB4MGIsMHg4ZCwweDdkLDB4MDIsMHhiZSwweGVmLDB4MzYsMHhiOSwweDAyLDB4MDAsMHhmMywweGE1CissMHhjMywweDI2LDB4YzYsMHgwNSwweDA2LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgyMCwweGExLDB4NjgsMHgzNywweDI2LDB4ODksMHg0NQorLDB4MDIsMHhhMSwweDZhLDB4MzcsMHgyNiwweDg4LDB4NjUsMHgwNSwweGMxLDB4ZTAsMHgwNCwweDI2LDB4ODgsMHg0NSwweDA0LDB4ODMKKywweGM3LDB4MDYsMHhjMywweDI2LDB4YzYsMHgwNSwweDA0LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgyMSwweDI2LDB4YzcsMHg0NSwweDAyCissMHgwMCwweDAwLDB4ODMsMHhjNywweDA0LDB4YzMsMHgyNiwweGM2LDB4MDUsMHgxNCwweDI2LDB4YzYsMHg0NSwweDAxLDB4MjIsMHg4ZAorLDB4N2QsMHgwMiwweGJlLDB4MWYsMHgzNywweGI5LDB4MDksMHgwMCwweGYzLDB4YTUsMHhjMywweDI2LDB4YzYsMHgwNSwweDBjLDB4MjYKKywweGM2LDB4NDUsMHgwMSwweDIzLDB4OGQsMHg3ZCwweDAyLDB4MWUsMHgwZSwweDFmLDB4OGQsMHgzNiwweDQwLDB4NTQsMHhiOSwweDAzCissMHgwMCwweGYzLDB4YTUsMHgzMywweGMwLDB4YjksMHgwMiwweDAwLDB4ZjMsMHhhYiwweDFmLDB4YzMsMHgyNiwweGM2LDB4MDUsMHgwOAorLDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgyOCwweDhkLDB4N2QsMHgwMiwweGJlLDB4ZDEsMHgzNiwweGI5LDB4MDMsMHgwMCwweGYzLDB4YTUKKywweGMzLDB4MjYsMHhjNiwweDA1LDB4MDgsMHgyNiwweGM2LDB4NDUsMHgwMSwweDI5LDB4YTEsMHhjMiwweDM0LDB4ODYsMHhlMCwweDI2CissMHg4OSwweDQ1LDB4MDIsMHhhMSwweDliLDB4MzYsMHgyNiwweDg5LDB4NDUsMHgwNCwweDI2LDB4ODgsMHg0NSwweDA2LDB4MjYsMHg4OAorLDB4NDUsMHgwNywweDhkLDB4N2QsMHgwOCwweGMzLDB4MjYsMHhjNiwweDA1LDB4MDYsMHgyNiwweGM2LDB4NDUsMHgwMSwweDJiLDB4OGQKKywweDdkLDB4MDIsMHhiZSwweGJiLDB4MzYsMHhiOSwweDAyLDB4MDAsMHhmMywweGE1LDB4YzMsMHgyNiwweGM2LDB4MDUsMHgwNiwweDI2CissMHhjNiwweDQ1LDB4MDEsMHgyYywweDhkLDB4N2QsMHgwMiwweGJlLDB4ZTUsMHgzNiwweGI5LDB4MDIsMHgwMCwweGYzLDB4YTUsMHhjMworLDB4MjYsMHhjNiwweDA1LDB4MDQsMHgyNiwweGM2LDB4NDUsMHgwMSwweDMwLDB4YTEsMHgzNywweDM3LDB4ODYsMHhlMCwweDI2LDB4ODkKKywweDQ1LDB4MDIsMHg4ZCwweDdkLDB4MDQsMHhjMywweDI2LDB4YzcsMHgwNiwweDBlLDB4MDAsMHgxZSwweDAwLDB4MjYsMHhjNywweDA2CissMHgwNiwweDAwLDB4MDIsMHgwMCwweDI2LDB4YzYsMHgwNiwweDE5LDB4MDAsMHgwMCwweGU4LDB4NmMsMHhmZSwweGU4LDB4MDMsMHhmZQorLDB4MjYsMHhjNywweDA2LDB4MjYsMHgwMCwweDAwLDB4MTAsMHgyNiwweGM2LDB4MDYsMHgyOCwweDAwLDB4MzAsMHgyNiwweGM2LDB4MDYKKywweDI5LDB4MDAsMHgxMSwweGJmLDB4MmEsMHgwMCwweGU4LDB4MzUsMHgwMCwweGU4LDB4NDUsMHgwMCwweGU4LDB4NTUsMHgwMCwweGMzCissMHgyNiwweGM3LDB4MDYsMHgwZSwweDAwLDB4MTIsMHgwMCwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwMiwweDAwLDB4MjYsMHhjNgorLDB4MDYsMHgxOSwweDAwLDB4MDAsMHhlOCwweDMyLDB4ZmUsMHhlOCwweGM5LDB4ZmQsMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAKKywweDA0LDB4MjYsMHhjNiwweDA2LDB4MjgsMHgwMCwweDMwLDB4MjYsMHhjNiwweDA2LDB4MjksMHgwMCwweDEzLDB4YzMsMHgyNiwweGM2CissMHgwNSwweDA0LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgwYywweDI2LDB4YzcsMHg0NSwweDAyLDB4MDAsMHgwMSwweDgzLDB4YzcsMHgwNAorLDB4YzMsMHgyNiwweGM2LDB4MDUsMHgwNCwweDI2LDB4YzYsMHg0NSwweDAxLDB4MGUsMHgyNiwweGM3LDB4NDUsMHgwMiwweDAwLDB4MDIKKywweDgzLDB4YzcsMHgwNCwweGMzLDB4MjYsMHhjNiwweDA1LDB4MDQsMHgyNiwweGM2LDB4NDUsMHgwMSwweDIxLDB4MjYsMHhjNywweDQ1CissMHgwMiwweDAwLDB4MDAsMHg4MywweGM3LDB4MDQsMHhjMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4YjMsMHgzOSwweGM5LDB4MzksMHg4MywweDNhLDB4YjMsMHgzOSwweGIzLDB4MzksMHhiMywweDM5LDB4MWMsMHgzYSwweDFjLDB4M2EKKywweGEzLDB4YjYsMHgzNCwweGExLDB4ZTksMHgzNiwweGEzLDB4MTEsMHgzNywweGEzLDB4ZDIsMHgzNCwweGExLDB4ZWIsMHgzNiwweGEzCissMHgxMywweDM3LDB4YTMsMHhkNCwweDM0LDB4YTEsMHhlZCwweDM2LDB4YTMsMHgxNSwweDM3LDB4YTMsMHhkNiwweDM0LDB4YTEsMHgwMQorLDB4MzcsMHhhMywweGNlLDB4MzQsMHhhMSwweGY3LDB4MzYsMHhhMywweDE3LDB4MzcsMHhhMywweGRjLDB4MzQsMHhhMSwweGY5LDB4MzYKKywweGEzLDB4MTksMHgzNywweGEzLDB4ZGUsMHgzNCwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDIsMHgwMCwweDc1LDB4MGMsMHgzMywweGMwCissMHhhMCwweDllLDB4MzYsMHg4YiwweGYwLDB4MmUsMHhmZiwweGE0LDB4NTAsMHgzOSwweGU5LDB4MGYsMHgwMSwweGJlLDB4MDcsMHgwMAorLDB4ZTksMHgxOSwweGYxLDB4ZjYsMHgwNiwweDlkLDB4MzYsMHg4MCwweDc0LDB4ZjMsMHhjNiwweDA2LDB4YTAsMHgzNiwweDAyLDB4YzYKKywweDA2LDB4NmUsMHgzNywweDA4LDB4YzYsMHgwNiwweDcwLDB4MzcsMHgwMiwweGI4LDB4ODgsMHgwMywweGNkLDB4MzksMHhmNiwweDA2CissMHg2ZiwweDM3LDB4MDEsMHg3NSwweDRhLDB4YTEsMHhkMSwweDM2LDB4M2EsMHgwNiwweGU5LDB4MzYsMHg3NSwweDQxLDB4M2EsMHgyNgorLDB4ZWEsMHgzNiwweDc1LDB4M2IsMHhhMSwweGQzLDB4MzYsMHgzYSwweDA2LDB4ZWIsMHgzNiwweDc1LDB4MzIsMHgzYSwweDI2LDB4ZWMKKywweDM2LDB4NzUsMHgyYywweGExLDB4ZDUsMHgzNiwweDNhLDB4MDYsMHhlZCwweDM2LDB4NzUsMHgyMywweDNhLDB4MjYsMHhlZSwweDM2CissMHg3NSwweDFkLDB4YzYsMHgwNiwweDcwLDB4MzcsMHgwMiwweGZlLDB4MGUsMHg2ZSwweDM3LDB4NzUsMHgwZiwweGI4LDB4ODgsMHgwMworLDB4Y2QsMHgzYSwweDgzLDB4MGUsMHg5YiwweDM2LDB4MTIsMHhjNiwweDA2LDB4YTAsMHgzNiwweDBjLDB4ZTksMHhhOCwweGYwLDB4YTEKKywweDA1LDB4MzcsMHgyNiwweDNiLDB4MDYsMHgyMCwweDAwLDB4NzUsMHg0MCwweGExLDB4MDcsMHgzNywweDI2LDB4M2IsMHgwNiwweDIyCissMHgwMCwweDc1LDB4MzYsMHhhMSwweDA5LDB4MzcsMHgyNiwweDNiLDB4MDYsMHgyNCwweDAwLDB4NzUsMHgyYywweGEwLDB4OWUsMHgzNgorLDB4M2MsMHgwMiwweDc1LDB4MDgsMHgyNiwweGY2LDB4MDYsMHgxOCwweDAwLDB4MDgsMHg3NSwweDQ3LDB4YzYsMHgwNiwweDZlLDB4MzcKKywweDA4LDB4ZmUsMHgwZSwweDcwLDB4MzcsMHg3NSwweDFjLDB4YzYsMHgwNiwweDcwLDB4MzcsMHgwMiwweGU1LDB4MDIsMHgwZCwweDAxCissMHgwNCwweDI1LDB4ZWYsMHhmZiwweGU3LDB4MDIsMHhlOSwweDVlLDB4ZjAsMHhjNiwweDA2LDB4NzAsMHgzNywweDAyLDB4YzYsMHgwNgorLDB4NmUsMHgzNywweDA4LDB4ZTUsMHgwMiwweDI1LDB4ZmYsMHhmYiwweDBkLDB4MDEsMHgwMCwweDI1LDB4ZWYsMHhmZiwweGU3LDB4MDIKKywweGU5LDB4NDQsMHhmMCwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDAsMHgwMSwweDc0LDB4MjUsMHgyNiwweGY2LDB4MDYsMHgxOCwweDAwCissMHgwOCwweDc1LDB4ZWQsMHg4MSwweDI2LDB4OWIsMHgzNiwweDdmLDB4ZmYsMHhiOCwweDg5LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4NAorLDB4MDMsMHhjZCwweDNhLDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwNiwweDgzLDB4MjYsMHhjMiwweDM0LDB4YWYsMHhlOSwweDE3LDB4ZjAKKywweGExLDB4MDEsMHgzNywweDNhLDB4MjYsMHgwZiwweDM3LDB4N2YsMHhjNywweGU5LDB4ZjcsMHhmZSwweDgzLDB4MjYsMHg5YiwweDM2CissMHhlYywweGU4LDB4MmEsMHgwZCwweDgxLDB4MGUsMHg5YiwweDM2LDB4ODAsMHgwMCwweGJiLDB4ZmYsMHg3ZiwweGNkLDB4NTMsMHhjNgorLDB4MDYsMHhhMCwweDM2LDB4MDIsMHhlOSwweGYwLDB4ZWYsMHg4MywweDBlLDB4OWIsMHgzNiwweDExLDB4YzYsMHgwNiwweGEwLDB4MzYKKywweDBjLDB4ZTksMHhmOSwweGVmLDB4NDQsMHgzYiwweDJjLDB4M2IsMHhjNywweDJhLDB4NmIsMHgzYiwweDQ0LDB4M2IsMHhjNywweDJhCissMHhjNywweDJhLDB4YzcsMHgyYSwweGEzLDB4YjYsMHgzNCwweDgxLDB4MGUsMHhjMiwweDM0LDB4MDAsMHgyMCwweGY3LDB4MDYsMHg0MQorLDB4MzcsMHgwMSwweDAwLDB4NzQsMHgxYiwweDhjLDB4YzMsMHhjNywweDA2LDB4NDEsMHgzNywweDAwLDB4MDAsMHhiOCwweDdmLDB4MDMKKywweGNkLDB4M2EsMHgzMywweGMwLDB4OGUsMHhjMCwweGJmLDB4NTQsMHgzNywweGI5LDB4MDYsMHgwMCwweGYzLDB4YWIsMHg4ZSwweGMzCissMHgzMywweGMwLDB4YTAsMHg5ZSwweDM2LDB4OGIsMHhmMCwweDJlLDB4ZmYsMHhhNCwweGU0LDB4M2EsMHhmNywweDA2LDB4OWIsMHgzNgorLDB4MDAsMHgwMSwweDc1LDB4MjEsMHg4MywweDI2LDB4YzIsMHgzNCwweGJmLDB4YTEsMHhhOSwweDM2LDB4ZTcsMHgwMCwweGExLDB4OWIKKywweDM2LDB4ZTksMHgwOSwweDAwLDB4YTEsMHg5YiwweDM2LDB4ODEsMHgyNiwweDliLDB4MzYsMHhmZiwweGRmLDB4YTksMHgwMCwweDIwCissMHg3NSwweDA2LDB4ZTksMHg2ZSwweDAwLDB4ZTksMHg2ZiwweGVmLDB4ODMsMHgwZSwweDk5LDB4MzYsMHgwNCwweGM3LDB4MDYsMHgzNworLDB4MzcsMHgwMSwweDAwLDB4YzYsMHgwNiwweGNhLDB4MzQsMHgwMSwweGU5LDB4NTgsMHgwMCwweDgzLDB4MGUsMHg5YiwweDM2LDB4NDAKKywweGU4LDB4NTgsMHgwMCwweGExLDB4MDUsMHgzNywweDNiLDB4MDYsMHhlOSwweDM2LDB4NzUsMHgzNywweGExLDB4MDcsMHgzNywweDNiCissMHgwNiwweGViLDB4MzYsMHg3NSwweDJlLDB4YTEsMHgwOSwweDM3LDB4M2IsMHgwNiwweGVkLDB4MzYsMHg3NSwweDI1LDB4ZmUsMHgwZQorLDB4NzEsMHgzNywweDc1LDB4MWMsMHhiOCwweDg3LDB4MDMsMHhjZCwweDNhLDB4ODMsMHgwZSwweDk5LDB4MzYsMHgxMCwweGExLDB4NTAKKywweDM3LDB4YzcsMHgwNiwweDUwLDB4MzcsMHgwMCwweDAwLDB4MDksMHgwNiwweDk5LDB4MzYsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA4CissMHhlOSwweDE0LDB4ZWYsMHg4MywweDBlLDB4OTksMHgzNiwweDA0LDB4YzcsMHgwNiwweDM3LDB4MzcsMHgwMywweDAwLDB4YzYsMHgwNgorLDB4Y2EsMHgzNCwweDAzLDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwYSwweGU5LDB4ZmMsMHhlZSwweGExLDB4ZDEsMHgzNiwweDI2LDB4M2IKKywweDA2LDB4MjAsMHgwMCwweDc1LDB4MTUsMHhhMSwweGQzLDB4MzYsMHgyNiwweDNiLDB4MDYsMHgyMiwweDAwLDB4NzUsMHgxMiwweGExCissMHhkNSwweDM2LDB4MjYsMHgzYiwweDA2LDB4MjQsMHgwMCwweDc1LDB4MGYsMHhjMywweDhkLDB4MzYsMHgyMCwweDAwLDB4ZTksMHgwYgorLDB4MDAsMHg4ZCwweDM2LDB4MjIsMHgwMCwweGU5LDB4MDQsMHgwMCwweDhkLDB4MzYsMHgyNCwweDAwLDB4ODMsMHhjNCwweDAyLDB4ZjcKKywweDA2LDB4ZTYsMHgzNCwweDAxLDB4MDAsMHg3NCwweDE1LDB4MjYsMHgzYSwweDA0LDB4NzcsMHgwOCwweDcyLDB4MGUsMHgyNiwweDNhCissMHg2NCwweDAxLDB4NzIsMHgwOCwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDYsMHhlOSwweGFiLDB4ZWUsMHhlOCwweDdjLDB4MGEsMHg4YworLDB4YzAsMHgzZCwweGZmLDB4ZmYsMHg3NCwweDFiLDB4MjYsMHhjNiwweDA2LDB4MTgsMHgwMCwweDEwLDB4MjYsMHhjNywweDA2LDB4MDQKKywweDAwLDB4NDksMHgzYywweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwYywweDAwLDB4Y2QsMHg1MCwweGI5LDB4NGUsMHgwMCwweGUyCissMHhmZSwweGM2LDB4MDYsMHhhMCwweDM2LDB4MGEsMHhlOSwweDk0LDB4ZWUsMHhlOSwweDdiLDB4ZWUsMHg4ZiwweDNjLDB4MDYsMHgzZAorLDB4MDYsMHgzZCwweDA2LDB4M2QsMHhkMiwweDNjLDB4ZWEsMHgzYywweDA2LDB4M2QsMHgwNiwweDNkLDB4YTMsMHhiNiwweDM0LDB4ODEKKywweDI2LDB4YzIsMHgzNCwweGFmLDB4ZGYsMHhjNywweDA2LDB4NGMsMHgzNywweDAwLDB4MDAsMHhiOCwweDhhLDB4MDMsMHhjZCwweDNhCissMHg4MCwweDNlLDB4OWQsMHgzNiwweDA0LDB4NzUsMHgwYywweDgwLDB4M2UsMHg5ZSwweDM2LDB4MDYsMHg3NCwweDA1LDB4YzYsMHgwNgorLDB4OWYsMHgzNiwweDA2LDB4MzMsMHhjMCwweGEwLDB4OWUsMHgzNiwweDhiLDB4ZjAsMHgyZSwweGZmLDB4YTQsMHg0YywweDNjLDB4ZjcKKywweDA2LDB4OWIsMHgzNiwweDAwLDB4MjAsMHg3NSwweDBlLDB4ODEsMHgyNiwweDliLDB4MzYsMHhmZiwweGJmLDB4YjgsMHg4YiwweDAzCissMHhjZCwweDNhLDB4ZTksMHg1NCwweDAwLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDAxLDB4NzQsMHgwMywweGU5LDB4MTcsMHhlZQorLDB4YzcsMHgwNiwweDM3LDB4MzcsMHgwMiwweDAwLDB4YzYsMHgwNiwweGNhLDB4MzQsMHgwMiwweDgzLDB4MGUsMHg5OSwweDM2LDB4MDQKKywweDgzLDB4MGUsMHg1MCwweDM3LDB4MDQsMHhmNiwweDA2LDB4OWQsMHgzNiwweDgwLDB4NzUsMHgyYSwweGU4LDB4MWYsMHgwYiwweGU5CissMHgyNywweDAwLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDAxLDB4NzUsMHhkMywweGM3LDB4MDYsMHgzNywweDM3LDB4MDIsMHgwMAorLDB4YzYsMHgwNiwweGNhLDB4MzQsMHgwMiwweDgzLDB4MGUsMHg5OSwweDM2LDB4MDQsMHhjNiwweDA2LDB4YTAsMHgzNiwweDAwLDB4ZjYKKywweDA2LDB4OWQsMHgzNiwweDgwLDB4NzQsMHgwMywweGU4LDB4ZGUsMHgwYSwweDgxLDB4MjYsMHg5YiwweDM2LDB4N2MsMHhmZiwweGJiCissMHhmZiwweGZmLDB4Y2QsMHg1MywweGNkLDB4NTQsMHhlOSwweGJlLDB4ZWQsMHhhMywweGI2LDB4MzQsMHhlOCwweGFkLDB4MDEsMHhiOAorLDB4ODYsMHgwMywweGNkLDB4MzksMHhjNywweDA2LDB4NGMsMHgzNywweDAwLDB4MDAsMHg4MSwweDI2LDB4YzIsMHgzNCwweGFmLDB4ZGYKKywweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NCwweDM0LDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDIwLDB4NzQsMHg1NiwweGY3CissMHgwNiwweDliLDB4MzYsMHgwMCwweDAxLDB4NzQsMHgyNywweGU4LDB4MzUsMHgwMSwweDcyLDB4MWMsMHhiZSwweDAwLDB4NDAsMHg4NQorLDB4MzYsMHhjMiwweDM0LDB4NzUsMHgwOCwweDA5LDB4MzYsMHhjMiwweDM0LDB4ZmYsMHgwNiwweDkyLDB4MzQsMHhlOCwweDhiLDB4MDEKKywweDczLDB4MDYsMHg4MSwweDBlLDB4OTksMHgzNiwweDgwLDB4MDAsMHhlOSwweDZjLDB4ZWQsMHhlOSwweGI1LDB4MDAsMHhjNywweDA2CissMHgzNywweDM3LDB4MDIsMHgwMCwweGM2LDB4MDYsMHhjYSwweDM0LDB4MDIsMHg4MywweDBlLDB4OTksMHgzNiwweDA0LDB4ODMsMHgwZQorLDB4NTAsMHgzNywweDA0LDB4ODAsMHgzZSwweDllLDB4MzYsMHgwOCwweDc0LDB4MDMsMHhlOCwweDVhLDB4MGEsMHhlOCwweGVmLDB4MDAKKywweDcyLDB4ZDYsMHhlOSwweGM4LDB4ZmYsMHg4MCwweDNlLDB4OWUsMHgzNiwweDBhLDB4NzUsMHgxMiwweGM2LDB4MDYsMHhhMCwweDM2CissMHgwMCwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDgsMHgwMCwweDc0LDB4MDIsMHhjZCwweDU0LDB4ZTgsMHgzOSwweDBhLDB4ODEsMHgyNgorLDB4OWIsMHgzNiwweGZmLDB4YmYsMHhlOCwweGM4LDB4MDAsMHg3MiwweGFmLDB4YjgsMHg4YiwweDAzLDB4Y2QsMHgzOSwweGU5LDB4OWMKKywweGZmLDB4ZjYsMHgwNiwweDllLDB4MzYsMHhmZiwweDc1LDB4NTgsMHhhMywweGI2LDB4MzQsMHhlOCwweGZlLDB4MDAsMHg4MSwweDI2CissMHhjMiwweDM0LDB4ZmYsMHhiZiwweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NCwweDQ4LDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMAorLDB4MjAsMHg3NCwweDIyLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDQwLDB4NzUsMHgwOCwweGU4LDB4OTEsMHgwMCwweDcyLDB4MzAKKywweGU5LDB4MjIsMHgwMCwweDI2LDB4YTEsMHgwYywweDAwLDB4YTksMHg2MCwweDAwLDB4NzUsMHgyNCwweDgxLDB4MGUsMHg2NiwweDM3CissMHgwMCwweDA4LDB4ZTksMHhkMiwweGVjLDB4YzcsMHgwNiwweDRjLDB4MzcsMHgwMCwweDAwLDB4ZTgsMHg3MSwweDAwLDB4NzIsMHgxMAorLDB4YjgsMHg4YiwweDAzLDB4Y2QsMHgzOSwweGU4LDB4ZDMsMHgwMCwweDczLDB4MDYsMHg4MSwweDBlLDB4OTksMHgzNiwweDgwLDB4MDAKKywweGU5LDB4YjQsMHhlYywweDgwLDB4M2UsMHg5ZCwweDM2LDB4MDQsMHg3NSwweDBjLDB4ODAsMHgzZSwweDllLDB4MzYsMHgwNiwweDc0CissMHg0NiwweGM2LDB4MDYsMHg5ZiwweDM2LDB4MDYsMHhmNywweDA2LDB4OWIsMHgzNiwweDAwLDB4MDEsMHg3NCwweDBjLDB4ODAsMHgzZQorLDB4OWQsMHgzNiwweDA4LDB4NzUsMHgwNSwweGM2LDB4MDYsMHg5ZiwweDM2LDB4MGEsMHhlOCwweDMyLDB4MDAsMHg3MiwweGQxLDB4ZTgKKywweDk5LDB4MDAsMHg4MCwweDNlLDB4OWQsMHgzNiwweDA4LDB4NzUsMHgxMywweDgxLDB4MGUsMHg5OSwweDM2LDB4ODAsMHgwMCwweGY3CissMHgwNiwweDliLDB4MzYsMHgwMCwweDIwLDB4NzUsMHgwOCwweGI4LDB4OGIsMHgwMywweGNkLDB4MzksMHhlOSwweDY4LDB4ZWMsMHhjNgorLDB4MDYsMHg5ZiwweDM2LDB4MGEsMHhlOSwweDYwLDB4ZWMsMHhiOCwweDg2LDB4MDMsMHhjZCwweDNhLDB4ZTksMHg1OCwweGVjLDB4MjYKKywweGExLDB4MGMsMHgwMCwweGE5LDB4NjAsMHgwMCwweDc0LDB4MDgsMHg4MSwweDI2LDB4YzIsMHgzNCwweGZmLDB4YmYsMHhmOSwweGMzCissMHhmNywweDA2LDB4OWIsMHgzNiwweDAwLDB4NDAsMHg3NCwweDEzLDB4ODEsMHgwZSwweDY2LDB4MzcsMHgwMCwweDA4LDB4ZTgsMHg0YQorLDB4MDAsMHg3MywweDA2LDB4ODEsMHgwZSwweDk5LDB4MzYsMHg4MCwweDAwLDB4ZjksMHhjMywweDgxLDB4MGUsMHg5YiwweDM2LDB4MDAKKywweDQwLDB4ODAsMHgyNiwweDZmLDB4MzcsMHhmZSwweDgxLDB4MjYsMHg5YiwweDM2LDB4N2YsMHhmZiwweGM2LDB4MDYsMHhhMCwweDM2CissMHgwMCwweGY4LDB4YzMsMHg4MSwweDBlLDB4OTksMHgzNiwweDAwLDB4MDEsMHhlOSwweDIxLDB4ZWMsMHgyNiwweGExLDB4MjAsMHgwMAorLDB4YTMsMHhmYiwweDM2LDB4YTMsMHhhYSwweDM0LDB4MjYsMHhhMSwweDIyLDB4MDAsMHhhMywweGZkLDB4MzYsMHhhMywweGFjLDB4MzQKKywweDI2LDB4YTEsMHgyNCwweDAwLDB4YTMsMHhmZiwweDM2LDB4YTMsMHhhZSwweDM0LDB4YzMsMHhhMSwweDA1LDB4MzcsMHgyNiwweDNiCissMHgwNiwweDIwLDB4MDAsMHg3NSwweDE5LDB4YTEsMHgwNywweDM3LDB4MjYsMHgzYiwweDA2LDB4MjIsMHgwMCwweDc1LDB4MGYsMHhhMQorLDB4MDksMHgzNywweDI2LDB4M2IsMHgwNiwweDI0LDB4MDAsMHg3NSwweDA1LDB4ZTgsMHgwMiwweDAwLDB4ZjgsMHhjMywweDUxLDB4MWUKKywweDA2LDB4OGIsMHhjNywweDhkLDB4MzYsMHgyMCwweDAwLDB4YmYsMHgwNSwweDM3LDB4YjksMHgwMywweDAwLDB4MWUsMHgwNiwweDFmCissMHgwNywweGYzLDB4YTUsMHg4YiwweGY4LDB4OGQsMHgzNiwweDIwLDB4MDAsMHhiZiwweGEwLDB4MzQsMHhiOSwweDAzLDB4MDAsMHhmMworLDB4YTUsMHgwNywweDFmLDB4NTksMHg4YiwweGY4LDB4YTEsMHgwNywweDM3LDB4YTMsMHhhNiwweDM0LDB4YTEsMHgwOSwweDM3LDB4YTMKKywweGE4LDB4MzQsMHhmOSwweGMzLDB4YzYsMHgwNiwweGI2LDB4MzQsMHgwMSwweGU5LDB4OGIsMHhlYiwweGU4LDB4ODcsMHgwOCwweDhiCissMHhmMCwweDA1LDB4MTIsMHgwMCwweDI2LDB4MjksMHgwNiwweDBlLDB4MDAsMHgyNiwweDhiLDB4NDQsMHgyYSwweDI2LDB4M2EsMHgwNgorLDB4MGUsMHgwMCwweDc1LDB4NWIsMHgyNiwweDgzLDB4MmUsMHgwZSwweDAwLDB4MDIsMHg4MCwweGZjLDB4MjcsMHg3NSwweDUwLDB4MjYKKywweDhiLDB4NDQsMHgyYywweGE5LDB4ZmYsMHhmZiwweDc1LDB4NDcsMHg4YiwweGZlLDB4MzMsMHhjMCwweDI2LDB4ZjYsMHg0NSwweDNjCissMHg4MCwweDc0LDB4MDYsMHgyNiwweDhhLDB4NDUsMHgzYSwweDI0LDB4MWYsMHgwMywweGY4LDB4MjYsMHg4MCwweDdkLDB4NDUsMHgwOQorLDB4NzUsMHgyZCwweDhjLDB4YzIsMHg4ZSwweDA2LDB4MzgsMHgzNCwweDhlLDB4ZGEsMHg4YiwweDBlLDB4MGUsMHgwMCwweDI2LDB4ODkKKywweDBlLDB4MGUsMHgwMCwweDhkLDB4NzQsMHgyYywweGJmLDB4MTgsMHgwMCwweGYzLDB4YTQsMHgzMywweGMwLDB4OGUsMHhkOCwweDI2CissMHhjNywweDA2LDB4MDQsMHgwMCwweGI1LDB4M2YsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDYsMHgwMCwweGNkLDB4NTAsMHhiOAorLDB4MDYsMHg4MCwweGU5LDB4ZWYsMHhlOSwweDI2LDB4YTEsMHgwYywweDAwLDB4YTMsMHg5MywweDM3LDB4ODMsMHgwZSwweDk5LDB4MzYKKywweDAxLDB4ZTksMHgwMCwweGViLDB4MjYsMHg4MCwweDNlLDB4MWMsMHgwMCwweGZmLDB4NzUsMHgyZiwweDI2LDB4ODAsMHgzZSwweDFlCissMHgwMCwweGZmLDB4NzUsMHgyNywweDI2LDB4ZjcsMHgwNiwweDBjLDB4MDAsMHg0MCwweDAwLDB4NzUsMHgxYiwweGExLDB4ZDEsMHgzNgorLDB4MjYsMHhhMywweDFhLDB4MDAsMHhhMSwweGQzLDB4MzYsMHgyNiwweGEzLDB4MWMsMHgwMCwweGExLDB4ZDUsMHgzNiwweDI2LDB4YTMKKywweDFlLDB4MDAsMHhiOCwweDBhLDB4ODAsMHhlOCwweDM2LDB4MDcsMHhlOSwweGUyLDB4ZWEsMHhmZiwweDA2LDB4OTAsMHgzNCwweGJlCissMHgwYSwweDAwLDB4YzYsMHgwNiwweGI2LDB4MzQsMHgwMSwweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NSwweDA1LDB4ODMsMHgwZQorLDB4YzIsMHgzNCwweDAxLDB4ZTksMHhiNiwweGVhLDB4ODAsMHgzZSwweDlkLDB4MzYsMHgwYSwweDc1LDB4MGYsMHgyNiwweGExLDB4MGMKKywweDAwLDB4MjUsMHgwNywweDAwLDB4M2QsMHgwNCwweDAwLDB4NzUsMHgwMywweGU4LDB4NzksMHgwMCwweGExLDB4ZjMsMHgzNiwweDg2CissMHhlMCwweGU3LDB4MWUsMHhhMywweGUzLDB4MzYsMHg4MSwweDI2LDB4MGIsMHgzNywweDAwLDB4MDMsMHg4MSwweDI2LDB4MGQsMHgzNworLDB4N2IsMHg3ZiwweDgzLDB4MGUsMHgwZCwweDM3LDB4NDgsMHhlOCwweDFlLDB4MDAsMHgyNiwweGExLDB4MGMsMHgwMCwweDI1LDB4MDcKKywweDAwLDB4M2QsMHgwNCwweDAwLDB4NzQsMHgwOSwweDI2LDB4ZjcsMHgwNiwweDBjLDB4MDAsMHgyMCwweDAwLDB4NzUsMHgwNiwweGI4CissMHgwMSwweDAwLDB4ZTksMHgzZiwweGU5LDB4ZTksMHg1ZiwweGVhLDB4YzcsMHgwNiwweDQxLDB4MzcsMHgwMCwweDAwLDB4YjgsMHg3ZgorLDB4MDMsMHhjZCwweDNhLDB4YTEsMHgxZCwweDM3LDB4YTMsMHhjNCwweDM0LDB4ODYsMHhlMCwweDY4LDB4N2YsMHgwMywweDFmLDB4YTMKKywweDA2LDB4MDAsMHgzMywweGMwLDB4OGUsMHhkOCwweGExLDB4MGIsMHgzNywweGEzLDB4YjIsMHgzNCwweGExLDB4MGQsMHgzNywweGEzCissMHhiNCwweDM0LDB4YTEsMHhmMywweDM2LDB4YTMsMHhjOCwweDM0LDB4YTEsMHhlZiwweDM2LDB4YTMsMHg5YywweDM0LDB4YTEsMHhmMQorLDB4MzYsMHhhMywweDllLDB4MzQsMHhjMywweDgwLDB4MGUsMHg5ZCwweDM2LDB4ODAsMHhiZSwweDAwLDB4MDAsMHhlOCwweGI0LDB4MDcKKywweGI4LDB4N2IsMHgwMywweGNkLDB4M2EsMHhiOCwweDdjLDB4MDMsMHhjZCwweDM5LDB4YzcsMHgwNiwweDMzLDB4MzcsMHgwMiwweDAwCissMHhhMSwweGU1LDB4MzYsMHhlNywweDJlLDB4YTEsMHhlNywweDM2LDB4ZTcsMHgzZSwweGI4LDB4ODIsMHgwMywweGNkLDB4M2EsMHhmNworLDB4MDYsMHg5YiwweDM2LDB4MDAsMHgyMCwweDc1LDB4MDMsMHhlOCwweGZkLDB4MDYsMHhhMSwweGQzLDB4MzYsMHhhMywweGVmLDB4MzYKKywweGEzLDB4OWMsMHgzNCwweGExLDB4ZDUsMHgzNiwweGEzLDB4ZjEsMHgzNiwweGEzLDB4OWUsMHgzNCwweGMzLDB4ZjYsMHgwNiwweDlkCissMHgzNiwweDgwLDB4NzQsMHgzMSwweGJlLDB4MjIsMHgwMCwweGU5LDB4MTcsMHgwMCwweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NAorLDB4MjQsMHhiZSwweDIzLDB4MDAsMHhlOSwweDBhLDB4MDAsMHhmNiwweDA2LDB4OWQsMHgzNiwweDgwLDB4NzQsMHgxNywweGJlLDB4MjQKKywweDAwLDB4NTYsMHhlOCwweGE4LDB4MDUsMHg4YywweGMwLDB4M2QsMHhmZiwweGZmLDB4NWUsMHg3NCwweDA1LDB4ZTgsMHhkNywweGVmCissMHhjZCwweDUwLDB4ZTksMHgxZiwweGU4LDB4ZTksMHg5ZiwweGU5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4YjgsMHg4NCwweDAzLDB4Y2QsMHgzYSwweGI4LDB4OGEsMHgwMywweGNkLDB4MzksMHhlOSwweGY3LDB4MDAsMHg4MCwweDNlLDB4YTAKKywweDM2LDB4MDgsMHg3NSwweDJlLDB4YTksMHhkMCwweDA3LDB4NzUsMHgyYywweGExLDB4YjEsMHgzNiwweDBkLDB4MDAsMHgwNCwweGU3CissMHgwOCwweGU1LDB4MDAsMHgyNSwweGZmLDB4NzMsMHhlNywweDAwLDB4YjgsMHg4YSwweDAzLDB4Y2QsMHgzYSwweGU4LDB4YzMsMHgwNgorLDB4MzMsMHhjMCwweGU3LDB4MGUsMHhlNSwweDBhLDB4MjUsMHhjMywweDE3LDB4ZTcsMHgwYSwweGNkLDB4NTQsMHhjNiwweDA2LDB4YTAKKywweDM2LDB4MDAsMHhlOSwweDY4LDB4ZTksMHhiZSwweDA0LDB4MDAsMHhlOSwweDNmLDB4ZTksMHg4MywweDI2LDB4OWIsMHgzNiwweGJmCissMHhjNiwweDA2LDB4NzEsMHgzNywweDAzLDB4YjgsMHg4NiwweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODgsMHgwMywweGNkLDB4M2EsMHhiOAorLDB4ODMsMHgwMywweGNkLDB4M2EsMHhiOCwweDg3LDB4MDMsMHhjZCwweDM5LDB4ODEsMHgwZSwweGMyLDB4MzQsMHgwMCwweDIwLDB4ZTkKKywweDkyLDB4MDAsMHhlOCwweDQ5LDB4MDYsMHhiOCwweDg3LDB4MDMsMHhjZCwweDM5LDB4YmIsMHhmZiwweDdmLDB4Y2QsMHg1MywweGI4CissMHg4NCwweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODgsMHgwMywweGNkLDB4M2EsMHhiOCwweDhiLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4MworLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4NiwweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODUsMHgwMywweGNkLDB4M2EsMHhjMywweGU1LDB4MDAKKywweDI1LDB4ZmYsMHg1MywweGU3LDB4MDAsMHg4MywweDBlLDB4YzIsMHgzNCwweDQwLDB4ODMsMHgyNiwweGMyLDB4MzQsMHhlZiwweGU4CissMHgwYywweDA2LDB4YmIsMHhmZiwweDdmLDB4Y2QsMHg1MywweGI4LDB4OGEsMHgwMywweGNkLDB4M2EsMHhiOCwweDg1LDB4MDMsMHhjZAorLDB4M2EsMHhiOCwweDg2LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4MywweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODcsMHgwMywweGNkLDB4M2EKKywweGI4LDB4OGIsMHgwMywweGNkLDB4M2EsMHhiOCwweDg0LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4OSwweDAzLDB4Y2QsMHgzYSwweGMzCissMHg4MywweDBlLDB4YzIsMHgzNCwweDUwLDB4ZTgsMHgxOCwweDA0LDB4ZTgsMHhkMywweDA1LDB4ZjYsMHgwNiwweDZmLDB4MzcsMHgwMQorLDB4NzUsMHgxMiwweGI4LDB4ODksMHgwMywweGNkLDB4MzksMHg4MywweDNlLDB4MGYsMHgzNywweDAwLDB4NzUsMHgwNiwweGM3LDB4MDYKKywweDBmLDB4MzcsMHgwNCwweDAwLDB4YTEsMHg5ZCwweDM2LDB4ODAsMHhmYywweDA4LDB4NzQsMHgwNSwweGI4LDB4ODQsMHgwMywweGNkCissMHgzOSwweGU1LDB4MDIsMHgwZCwweDAxLDB4MDgsMHgyNSwweGVmLDB4ZmYsMHhlNywweDAyLDB4YTEsMHg5ZCwweDM2LDB4ODYsMHhlMAorLDB4MzIsMHhlNCwweDhiLDB4ZjAsMHhkMSwweGVlLDB4MzMsMHhjMCwweDBkLDB4MjAsMHgwMCwweDA5LDB4MDYsMHhhZCwweDM2LDB4YTEKKywweGFkLDB4MzYsMHhlNywweDA0LDB4ZTksMHg1MywweGU4LDB4ZTksMHg1YSwweGU4LDB4MzMsMHhjMCwweGEwLDB4MWIsMHgzNywweGQxCissMHhlMCwweDNhLDB4MDYsMHhhMCwweDM2LDB4NzUsMHgwMywweGU5LDB4YmEsMHhmZiwweGU5LDB4NjAsMHhlOCwweGM3LDB4MDYsMHg0MQorLDB4MzcsMHgwMCwweDAwLDB4ZTgsMHhjMSwweGUxLDB4ZTgsMHg2YSwweDA2LDB4MzMsMHhjMCwweDBkLDB4NDEsMHgwMCwweGU3LDB4NTYKKywweGExLDB4YjEsMHgzNiwweDBkLDB4MDAsMHgxMCwweGU3LDB4MDgsMHhlNSwweDAyLDB4MjUsMHhmOSwweGZmLDB4MGQsMHgwMywweDAwCissMHhlNywweDAyLDB4YTEsMHhiMywweDM2LDB4ZTcsMHgwYSwweGExLDB4YWYsMHgzNiwweGU3LDB4MDYsMHhhMSwweGFkLDB4MzYsMHhlNworLDB4MDQsMHhlOCwweDdjLDB4MDMsMHhlOCwweDlmLDB4MDMsMHhjNywweDA2LDB4MWQsMHgzNywweDAwLDB4YzgsMHhjNywweDA2LDB4MGIKKywweDM3LDB4MDAsMHgwMywweGM3LDB4MDYsMHgwZCwweDM3LDB4N2IsMHg3ZiwweDMzLDB4YzAsMHhhMywweDk5LDB4MzYsMHhhMywweDliCissMHgzNiwweGEzLDB4OWQsMHgzNiwweGEzLDB4OWYsMHgzNiwweGEzLDB4NGMsMHgzNywweGEzLDB4ZjMsMHgzNiwweGEzLDB4ZWYsMHgzNgorLDB4YTMsMHhmMSwweDM2LDB4ZTgsMHg4MiwweGZkLDB4YzYsMHgwNiwweDlmLDB4MzYsMHgwMiwweGU5LDB4ZWYsMHhlNywweGU1LDB4MDIKKywweDBkLDB4MDEsMHg4OCwweDI1LDB4ZWYsMHhmZiwweDBkLDB4MDAsMHg0MCwweDBkLDB4MDAsMHgwNCwweGU3LDB4MDIsMHhlOCwweGYyCissMHgwNSwweGU1LDB4MGEsMHgwZCwweDQwLDB4MDAsMHhlNywweDBhLDB4MzMsMHhjMCwweGEzLDB4ODEsMHgzNywweGEzLDB4ODUsMHgzNworLDB4YTMsMHg4MywweDM3LDB4YTMsMHg4NywweDM3LDB4YTMsMHg4OSwweDM3LDB4ZTUsMHgwMCwweDBkLDB4MDAsMHg4NCwweGU3LDB4MDAKKywweGI4LDB4OGMsMHgwMywweGNkLDB4MzksMHhiOCwweDgwLDB4MDAsMHhjZCwweDM1LDB4YzcsMHgwNiwweGFhLDB4MDIsMHhmZiwweGZmCissMHhlNSwweDAwLDB4MjUsMHhmZiwweDdiLDB4ZTcsMHgwMCwweDgxLDB4MGUsMHg5YSwweDM3LDB4ODAsMHgwMCwweGI4LDB4N2UsMHgwMworLDB4Y2QsMHgzOSwweDMzLDB4YzAsMHhlNywweDBlLDB4YmUsMHgwOCwweDAwLDB4OGUsMHgwNiwweDM4LDB4MzQsMHhlOCwweGE3LDB4ZWQKKywweDgzLDB4MjYsMHhlZiwweDM0LDB4ZGYsMHhmZiwweDA2LDB4ODEsMHgzNywweGNkLDB4NTAsMHg4MywweDBlLDB4ZWYsMHgzNCwweDIwCissMHhjMywweGY3LDB4MDYsMHg5YSwweDM3LDB4ODAsMHgwMCwweDc0LDB4M2QsMHhhOSwweGQwLDB4MDcsMHg3NCwweDEwLDB4YTksMHgwMAorLDB4MDQsMHg3NCwweDEyLDB4MzMsMHhjMCwweGU3LDB4MGUsMHhmZiwweDA2LDB4ODcsMHgzNywweGU5LDB4ZDIsMHhmZiwweGZmLDB4MDYKKywweDg1LDB4MzcsMHhlOSwweGNiLDB4ZmYsMHhmZiwweDA2LDB4ODMsMHgzNywweGU5LDB4YzQsMHhmZiwweDgzLDB4MjYsMHg5YSwweDM3CissMHg3ZiwweGExLDB4ODksMHgzNywweDAzLDB4MDYsMHg4NywweDM3LDB4M2QsMHgwNSwweDAwLDB4N2YsMHgwMSwweGMzLDB4YmIsMHhmZgorLDB4N2YsMHhjZCwweDUzLDB4ZTksMHgwMCwweDAwLDB4ZTUsMHgwMiwweDI1LDB4ZmYsMHhmYiwweDI1LDB4ZWYsMHhmZiwweDBkLDB4MDEKKywweDAwLDB4ZTcsMHgwMiwweGExLDB4ODMsMHgzNywweDNiLDB4MDYsMHg0NiwweDM3LDB4N2YsMHgyYSwweGExLDB4ODUsMHgzNywweDNiCissMHgwNiwweDQ4LDB4MzcsMHg3YywweDIxLDB4YTEsMHg4OSwweDM3LDB4MDMsMHgwNiwweDg3LDB4MzcsMHgzZCwweDA1LDB4MDAsMHg3ZgorLDB4MTUsMHhjNiwweDA2LDB4OWYsMHgzNiwweDA0LDB4ZTUsMHgwMiwweDI1LDB4ZmYsMHhmNywweDBkLDB4MDEsMHgwMCwweDI1LDB4ZWYKKywweGZmLDB4ZTcsMHgwMiwweGU5LDB4ZjcsMHhlNiwweGJlLDB4MDEsMHgwMCwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDMsMHgwMCwweDc0CissMHgwYSwweDgzLDB4MjYsMHg5YiwweDM2LDB4ZmMsMHg4MywweDBlLDB4YzIsMHgzNCwweDA0LDB4ZTksMHhkMCwweGU2LDB4YjgsMHg3YgorLDB4MDMsMHhjZCwweDM5LDB4ZTUsMHgwMiwweDBkLDB4MDEsMHg2MCwweDI1LDB4ZWYsMHhmZiwweGU3LDB4MDIsMHhjNywweDA2LDB4ZjEKKywweDM0LDB4MjAsMHgwMywweGI4LDB4OGUsMHgwMywweGNkLDB4MzksMHhjMywweDgxLDB4MjYsMHhjMiwweDM0LDB4N2YsMHhmZiwweDgwCissMHgwZSwweDZmLDB4MzcsMHgwMSwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDMsMHgwMCwweDc0LDB4ZDIsMHhiOCwweDdiLDB4MDMsMHhjZAorLDB4M2EsMHhiOCwweDdkLDB4MDMsMHhjZCwweDM5LDB4ODMsMHgyNiwweDliLDB4MzYsMHhlZiwweDMzLDB4YzAsMHhiMCwweDhhLDB4YTIKKywweDlmLDB4MzYsMHhhMiwweDlkLDB4MzYsMHhjNywweDA2LDB4NGMsMHgzNywweDAxLDB4MDAsMHhjNywweDA2LDB4MGYsMHgzNywweDA0CissMHgwMCwweGY3LDB4MDYsMHg5YiwweDM2LDB4NDAsMHgwMCwweDc1LDB4MDYsMHhjNywweDA2LDB4MGYsMHgzNywweDAzLDB4MDAsMHhiOAorLDB4OGQsMHgwMywweGNkLDB4MzksMHhlOCwweDAwLDB4ZDUsMHhlNSwweDAyLDB4MGQsMHgwMSwweDQwLDB4MjUsMHhlZiwweGZmLDB4OGIKKywweGQ4LDB4YjgsMHg3YywweDAzLDB4Y2QsMHgzOSwweGM3LDB4MDYsMHgzMywweDM3LDB4MDIsMHgwMCwweDhiLDB4YzMsMHgwZCwweDAwCissMHgyMCwweDI1LDB4ZjksMHhmZiwweDBiLDB4MDYsMHhlOCwweDNhLDB4ZTcsMHgwMiwweGMzLDB4ZmYsMHgwZSwweGYxLDB4MzQsMHg3NQorLDB4MDEsMHhjMywweGU1LDB4NGUsMHhhOSwweDAxLDB4MDAsMHg3NSwweDEyLDB4ZTUsMHgwMCwweGE5LDB4MDAsMHgwNCwweDc1LDB4MDUKKywweDBkLDB4MDAsMHgwNCwweGU3LDB4MDAsMHhiOCwweDhlLDB4MDMsMHhjZCwweDM5LDB4YzMsMHhlNSwweDAwLDB4YTksMHgwMCwweDA0CissMHg3NCwweGYzLDB4MjUsMHhmZiwweGZiLDB4ZTcsMHgwMCwweGU5LDB4ZWIsMHhmZiwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDQsMHg4MworLDB4MjYsMHg5YiwweDM2LDB4ZmMsMHg4MSwweDBlLDB4OWIsMHgzNiwweDgwLDB4MDAsMHhlOSwweDEwLDB4ZTYsMHhiOCwweDhlLDB4MDMKKywweGNkLDB4M2EsMHhjZCwweDU0LDB4ODEsMHgwZSwweGFmLDB4MzYsMHgwMCwweDE4LDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNiwweGI4CissMHg3YiwweDAzLDB4Y2QsMHgzOSwweGExLDB4ZDMsMHgzNiwweGEzLDB4OGYsMHgzNywweGExLDB4ZDUsMHgzNiwweGEzLDB4OTEsMHgzNworLDB4YzcsMHgwNiwweDhiLDB4MzcsMHgwMiwweDAwLDB4YzcsMHgwNiwweDhkLDB4MzcsMHgwMiwweDAwLDB4ODMsMHgwZSwweDk5LDB4MzYKKywweDQwLDB4ZTksMHhkOSwweGU1LDB4ODAsMHgzZSwweDlmLDB4MzYsMHgwNiwweDc1LDB4MTUsMHhhOSwweGQwLDB4MDcsMHg3NSwweGVjCissMHgyNSwweDAwLDB4MTgsMHg3NSwweDBlLDB4ZmYsMHgwZSwweDhiLDB4MzcsMHg3NSwweGUxLDB4YzYsMHgwNiwweDlmLDB4MzYsMHgwOAorLDB4ZTksMHhiYSwweGU1LDB4ZmYsMHgwZSwweDhkLDB4MzcsMHg3NSwweGQzLDB4YmUsMHgwOCwweDAwLDB4ZTksMHg5ZiwweGU1LDB4YjgKKywweDdiLDB4MDMsMHhjZCwweDM5LDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDIwLDB4NzQsMHgwOCwweGM2LDB4MDYsMHg5ZiwweDM2CissMHgwYSwweGU5LDB4MGQsMHgwMCwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDAsMHg0MCwweDc0LDB4MGIsMHhiOCwweDhiLDB4MDMsMHhjZAorLDB4MzksMHg4MSwweDBlLDB4OTksMHgzNiwweDgwLDB4MDAsMHhlOSwweDgzLDB4ZTUsMHhiOCwweDdiLDB4MDMsMHhjZCwweDM5LDB4YzcKKywweDA2LDB4OGIsMHgzNywweDA0LDB4MDAsMHhjNywweDA2LDB4OGQsMHgzNywweDA0LDB4MDAsMHg4MSwweDBlLDB4OTksMHgzNiwweDAwCissMHgwMiwweGU5LDB4NjksMHhlNSwweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NSwweDFiLDB4YTksMHhkMCwweDA3LDB4NzUsMHhlYgorLDB4YTksMHgwMCwweDE4LDB4NzUsMHgwYywweGZmLDB4MGUsMHg4ZCwweDM3LDB4NzUsMHhlMCwweGU4LDB4MTcsMHhmYiwweGU5LDB4NGMKKywweGU1LDB4YjgsMHg4MiwweDAzLDB4Y2QsMHgzOSwweGMzLDB4ZmYsMHgwZSwweDhiLDB4MzcsMHg3NSwweGNlLDB4YmUsMHgwOSwweDAwCissMHhlOSwweDJiLDB4ZTUsMHhjNywweDA2LDB4M2QsMHgzNywweDAwLDB4MDAsMHhjNywweDA2LDB4OWIsMHgzNiwweDAwLDB4MDAsMHhlOAorLDB4M2MsMHgwMiwweDgxLDB4MjYsMHhhZiwweDM2LDB4ZmYsMHhlNywweGExLDB4YWYsMHgzNiwweGU3LDB4MDYsMHg4MSwweDI2LDB4OWIKKywweDM2LDB4ZmYsMHg3ZiwweGU1LDB4MDIsMHgwZCwweDAxLDB4MDAsMHgyNSwweGVmLDB4ZmYsMHgyNSwweGZmLDB4ZGYsMHhlNywweDAyCissMHhiYiwweGZmLDB4N2YsMHhjZCwweDUzLDB4MzMsMHhjMCwweGEzLDB4OWQsMHgzNiwweGEzLDB4OWYsMHgzNiwweGU4LDB4NTAsMHgwMAorLDB4ZTgsMHg3MywweDAwLDB4YjgsMHg4MSwweDAzLDB4Y2QsMHgzOSwweGMzLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMywweDAwLDB4NzQKKywweDBkLDB4YzYsMHgwNiwweDlmLDB4MzYsMHgwMiwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDAsMHhlOSwweGRmLDB4ZTQsMHg4MywweDBlCissMHg5YiwweDM2LDB4MTAsMHhjNywweDA2LDB4OTksMHgzNiwweDAwLDB4MDAsMHhlOCwweGU3LDB4MDIsMHhlNSwweDU2LDB4MGQsMHgwMgorLDB4MDAsMHhlNywweDU2LDB4YzcsMHgwNiwweGE4LDB4MDIsMHgwMCwweDAwLDB4OGIsMHgzNiwweDNkLDB4MzcsMHhlOCwweDQ0LDB4MDIKKywweGM2LDB4MDYsMHhhMCwweDM2LDB4MGUsMHhlOSwweGI1LDB4ZTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwNiwweGI4LDB4OGEsMHgwMywweGNkLDB4M2EsMHhiOCwweDg1LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4NiwweDAzLDB4Y2QsMHgzYQorLDB4YjgsMHg4MywweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODcsMHgwMywweGNkLDB4M2EsMHhiOCwweDhiLDB4MDMsMHhjZCwweDNhLDB4YjgKKywweDg4LDB4MDMsMHhjZCwweDNhLDB4MDcsMHhjMywweDA2LDB4YjgsMHg4OCwweDAzLDB4Y2QsMHgzYSwweGI4LDB4N2IsMHgwMywweGNkCissMHgzYSwweGI4LDB4ODIsMHgwMywweGNkLDB4M2EsMHhiOCwweDdmLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg3YywweDAzLDB4Y2QsMHgzYQorLDB4YjgsMHg3ZSwweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODAsMHgwMywweGNkLDB4M2EsMHhiOCwweDgxLDB4MDMsMHhjZCwweDNhLDB4YjgKKywweDg0LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4OSwweDAzLDB4Y2QsMHgzYSwweGI4LDB4N2QsMHgwMywweGNkLDB4M2EsMHhiOCwweDhkCissMHgwMywweGNkLDB4M2EsMHhjNywweDA2LDB4NDEsMHgzNywweDAwLDB4MDAsMHgwNywweGMzLDB4MDYsMHg4ZSwweDA2LDB4MzgsMHgzNAorLDB4MWYsMHg4YiwweDBlLDB4MGUsMHgwMCwweDI2LDB4ODksMHgwZSwweDBlLDB4MDAsMHhiZSwweDE4LDB4MDAsMHhiZiwweDE4LDB4MDAKKywweGYzLDB4YTQsMHgwNiwweDFlLDB4MDcsMHhjZCwweDM0LDB4MDcsMHgzMywweGMwLDB4OGUsMHhkOCwweGMzLDB4MjYsMHhmNiwweDA2CissMHgyMCwweDAwLDB4ODAsMHg3NCwweDQ0LDB4MzMsMHhjMCwweDI2LDB4YTAsMHgyNiwweDAwLDB4MjQsMHgxZiwweDhiLDB4ZjAsMHgyNgorLDB4OGIsMHg1YywweDI4LDB4ODksMHgxZSwweDZhLDB4MzcsMHgwNiwweDhlLDB4MDYsMHgzOCwweDM0LDB4MWYsMHhjMCwweGUzLDB4MDQKKywweDI2LDB4ODgsMHg1YywweDI4LDB4OGIsMHhjNiwweGI5LDB4MDYsMHgwMCwweGJlLDB4MjAsMHgwMCwweGJmLDB4MWEsMHgwMCwweGYzCissMHhhNCwweDhiLDB4YzgsMHg4MywweGM3LDB4MDYsMHhmMywweGE0LDB4MjYsMHg4MSwweDI2LDB4MjYsMHgwMCwweDFmLDB4ODAsMHgyNgorLDB4ODEsMHgzNiwweDI2LDB4MDAsMHgwMCwweDgwLDB4ZTksMHhhOSwweGZmLDB4MjYsMHg4YiwweDFlLDB4MjgsMHgwMCwweDg5LDB4MWUKKywweDZhLDB4MzcsMHgwNiwweDhlLDB4MDYsMHgzOCwweDM0LDB4MWYsMHhjMCwweGUzLDB4MDQsMHgyNiwweDg4LDB4MWUsMHgyOCwweDAwCissMHhiOSwweDA2LDB4MDAsMHhiZSwweDIwLDB4MDAsMHhiZiwweDFhLDB4MDAsMHhmMywweGE0LDB4ZTksMHg4NCwweGZmLDB4ODYsMHhjNAorLDB4YTMsMHg2OCwweDM3LDB4ZTgsMHg4NywweGZmLDB4ZjcsMHgwNiwweDZhLDB4MzcsMHgwZiwweDAwLDB4NzQsMHgxMCwweDgwLDB4M2UKKywweDllLDB4MzYsMHgwMCwweDc1LDB4MDksMHhiZSwweDAwLDB4MDAsMHhlOCwweGFjLDB4ZTksMHhjZCwweDUwLDB4YzMsMHhjMywweDUwCissMHg1NiwweDA2LDB4MzMsMHhjMCwweDI2LDB4ZjYsMHgwNiwweDIwLDB4MDAsMHg4MCwweDc0LDB4MDYsMHgyNiwweGEwLDB4MjYsMHgwMAorLDB4MjQsMHgxZiwweDhiLDB4ZjAsMHgyNiwweDhiLDB4NWMsMHgyNiwweDg2LDB4ZmIsMHg4MywweGViLDB4MDQsMHg3NCwweDRmLDB4ODMKKywweGM2LDB4MmEsMHg4YywweGMwLDB4OGUsMHhkOCwweGI5LDB4MDcsMHgwMCwweDMzLDB4YzAsMHg4ZSwweGMwLDB4YmYsMHg3MiwweDM3CissMHhmMywweGFiLDB4MzMsMHhjOSwweDhhLDB4MGMsMHg4MCwweGY5LDB4MDAsMHg3NSwweDAzLDB4ZTksMHgzMCwweDAwLDB4M2IsMHhkOQorLDB4NzMsMHgwMywweGU5LDB4MjksMHgwMCwweDJiLDB4ZDksMHg4YSwweDQ0LDB4MDEsMHgyNSwweDNmLDB4MDAsMHg3NCwweDE5LDB4M2QKKywweDBiLDB4MDAsMHg3ZCwweDE0LDB4ZDEsMHhlMCwweDhiLDB4ZjgsMHgyZSwweDhiLDB4YmQsMHg1YywweDQ5LDB4OGQsMHg3NCwweDAyCissMHg4MywweGU5LDB4MDIsMHhmMywweGE0LDB4ZTksMHgwMiwweDAwLDB4MDMsMHhmMSwweDIzLDB4ZGIsMHg3NSwweGM0LDB4MzMsMHhjMAorLDB4OGUsMHhkOCwweDA3LDB4NWUsMHg1OCwweGMzLDB4MzMsMHhjMCwweDI2LDB4ZjYsMHgwNiwweDIwLDB4MDAsMHg4MCwweDc0LDB4MDYKKywweDI2LDB4YTAsMHgyNiwweDAwLDB4MjQsMHgxZiwweGMzLDB4ZTUsMHgwYSwweDI1LDB4YzMsMHhiZiwweGU3LDB4MGEsMHhiOCwweDg2CissMHgwMywweGNkLDB4MzksMHhiOCwweDgzLDB4MDMsMHhjZCwweDM5LDB4ODEsMHgyNiwweDliLDB4MzYsMHg3YywweGRmLDB4YjgsMHg4NQorLDB4MDMsMHhjZCwweDNhLDB4ZTUsMHgwMiwweDI1LDB4ZmYsMHhmMywweDBkLDB4MDEsMHgwMCwweDI1LDB4ZWYsMHhmZiwweGU3LDB4MDIKKywweGU1LDB4MDAsMHgyNSwweGZmLDB4NTMsMHhlNywweDAwLDB4YTEsMHhlNywweDM2LDB4MjUsMHhmZiwweGZlLDB4YTMsMHhlNywweDM2CissMHhlNywweDNlLDB4ODMsMHgyNiwweDk5LDB4MzYsMHhjZiwweDgxLDB4MGUsMHhhZiwweDM2LDB4MDAsMHgxMCwweGExLDB4YWYsMHgzNgorLDB4ZTcsMHgwNiwweGMzLDB4ZTUsMHgwMiwweDBkLDB4MDEsMHgwYywweDI1LDB4ZWYsMHhmZiwweGU3LDB4MDIsMHhhMSwweGU3LDB4MzYKKywweDBkLDB4MDAsMHgwMSwweGU3LDB4M2UsMHhhMywweGU3LDB4MzYsMHg4MSwweDBlLDB4OWIsMHgzNiwweDAwLDB4MjAsMHg4MywweDBlCissMHg5OSwweDM2LDB4MjAsMHg4MSwweDI2LDB4OWIsMHgzNiwweDdjLDB4YmYsMHg4MSwweDBlLDB4YWYsMHgzNiwweDAwLDB4MTAsMHhhMQorLDB4YWYsMHgzNiwweGU3LDB4MDYsMHhiOCwweDg2LDB4MDMsMHhjZCwweDM5LDB4YjgsMHg4NSwweDAzLDB4Y2QsMHgzOSwweGI4LDB4ODMKKywweDAzLDB4Y2QsMHgzYSwweGMzLDB4MGIsMHhmNiwweDc1LDB4NDksMHgwNiwweDhlLDB4MDYsMHgzMiwweDM0LDB4ODAsMHgzZSwweGUwCissMHgzNCwweDAxLDB4NzUsMHgxYiwweDI2LDB4ODksMHgzNiwweDA2LDB4MDAsMHg4ZSwweDA2LDB4MzIsMHgzNCwweDI2LDB4ZjcsMHgwNgorLDB4MGEsMHgwMCwweDAwLDB4MjAsMHg3NCwweDA3LDB4MjYsMHg4MSwweDBlLDB4MDgsMHgwMCwweDAwLDB4MjAsMHgwNywweGMzLDB4ODAKKywweDNlLDB4ZTMsMHgzNCwweDAxLDB4NzUsMHgxOSwweDI2LDB4ODksMHgzNiwweDA2LDB4MDAsMHg4ZSwweDA2LDB4MzIsMHgzNCwweDI2CissMHhmNywweDA2LDB4MGEsMHgwMCwweDAwLDB4MTAsMHg3NCwweDA3LDB4MjYsMHg4MSwweDBlLDB4MDgsMHgwMCwweDAwLDB4MTAsMHgwNworLDB4YzMsMHhlOSwweGI0LDB4ZmYsMHg1MCwweDUxLDB4NTcsMHgzMywweGMwLDB4YjksMHgwNiwweDAwLDB4OGUsMHhjMCwweGJmLDB4ZDEKKywweDM2LDB4ZjMsMHhhZSwweDVmLDB4NzQsMHgwYywweDI2LDB4ZjYsMHgwNiwweDAwLDB4MDAsMHhjMCwweDc1LDB4MDQsMHhmOCwweDU5CissMHg1OCwweGMzLDB4ZjksMHhlOSwweGY5LDB4ZmYsMHg4YiwweDA1LDB4MGIsMHg0NSwweDAyLDB4MGIsMHg0NSwweDA0LDB4YzMsMHg1MgorLDB4NTAsMHhlNSwweDA2LDB4MjUsMHgxZSwweDAwLDB4M2QsMHgxZSwweDAwLDB4NzUsMHhmNiwweGI4LDB4MDEsMHg4MCwweGU3LDB4NWEKKywweDU4LDB4NWEsMHhjMywweGU4LDB4ZTksMHhmZiwweDUwLDB4ZTUsMHgwMiwweDI1LDB4ZmYsMHg3ZiwweDBkLDB4MDEsMHgwMCwweDI1CissMHhlZiwweGZmLDB4ZTcsMHgwMiwweDBkLDB4MDAsMHg4MCwweGU3LDB4MDIsMHhhMSwweGFkLDB4MzYsMHhlNywweDA0LDB4YTEsMHhhZgorLDB4MzYsMHhlNywweDA2LDB4NTgsMHhjMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDJlLDB4MmIsMHhjZSwweDQxLDB4MTAsMHg0MiwweDdiLDB4NDEsMHgzMCwweDQxLDB4YTIsMHg0MSwweGFmLDB4NDUsMHg0NCwweDI5CissMHhjNywweDJhLDB4YzcsMHgyYSwweDYwLDB4MzksMHhmNCwweDNhLDB4NWMsMHgzYywweDA5LDB4M2QsMHhiMSwweDNkLDB4MzQsMHgzZgorLDB4YzcsMHgyYSwweDNjLDB4M2YsMHhjNywweDJhLDB4YzQsMHgzZiwweDE2LDB4NDAsMHgxNiwweDQwLDB4ZWQsMHg0MCwweGZhLDB4NDAKKywweDA3LDB4NDEsMHhjNywweDJhLDB4YzcsMHgyYSwweGM3LDB4MmEsMHhjNywweDJhLDB4ZDYsMHg1MiwweDAwLDB4MDAsMHgwMSwweDM3CissMHhlOSwweDM2LDB4ZjMsMHgzNiwweGVmLDB4MzYsMHgxZCwweDM3LDB4MGQsMHgzNywweDBiLDB4MzcsMHg5YywweDM3LDB4MDMsMHgzNworLDB4ZmIsMHgzNiwweDYyLDB4MmQsMHg0MCwweDA2LDB4ZDEsMHgyZCwweGY0LDB4MDEsMHhiYSwweDQ0LDB4NDAsMHgwNiwweDhjLDB4NDMKKywweDY0LDB4MDAsMHhlOCwweDJjLDB4YzgsMHgwMCwweGQ4LDB4MmIsMHgwNSwweDAwLDB4ZTksMHg0NSwweDUwLDB4MDAsMHg5NywweDQ1CissMHhmYSwweDAwLDB4YWUsMHgyZCwweDA0LDB4MDEsMHg2YSwweDQyLDB4MDIsMHgwMCwweGY2LDB4MmMsMHhiYywweDAyLDB4OTMsMHgyZAorLDB4ZGMsMHgwNSwweDFkLDB4MmQsMHg2NCwweDAwLDB4YTEsMHgyZCwweDE0LDB4MDAsMHhkNywweDNhLDB4MDgsMHgwNywweDgxLDB4MmQKKywweDY0LDB4MDAsMHhiMywweDNlLDB4MDIsMHgwMCwweDMwLDB4NDMsMHg2NCwweDAwLDB4YzUsMHgyYywweGY0LDB4MDEsMHg4YiwweDQ0CissMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4ODAsMHgzZSwweGZkLDB4MzQsMHgwMiwweDc0LDB4MGMsMHhlOCwweDIwLDB4MDUsMHhjNywweDA2LDB4YTEsMHgzNiwweDAwLDB4MDAKKywweGU5LDB4OWEsMHhmOCwweGZmLDB4MDYsMHhjMCwweDMzLDB4ZTgsMHgxMCwweDA1LDB4OGIsMHgzNiwweDNkLDB4MzcsMHhlOCwweDczCissMHhmZSwweGMzLDB4Y2QsMHgzNCwweGU5LDB4ZTgsMHgwNSwweGM3LDB4MDYsMHhhMywweDM2LDB4MDAsMHgwMCwweGM3LDB4MDYsMHg0MQorLDB4MzcsMHgwMCwweDAwLDB4ZTgsMHhlZCwweGZlLDB4MzMsMHhjMCwweDBkLDB4NDEsMHgwMCwweGU3LDB4NTYsMHhhMSwweGIxLDB4MzYKKywweDBkLDB4MDAsMHgxMCwweGU3LDB4MDgsMHhhMSwweGIzLDB4MzYsMHhlNywweDBhLDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNiwweGExCissMHhhZCwweDM2LDB4ZTcsMHgwNCwweGU4LDB4MmIsMHgwOSwweGM3LDB4MDYsMHgxZCwweDM3LDB4MDAsMHhjOCwweGM3LDB4MDYsMHgwYgorLDB4MzcsMHgwMCwweDAzLDB4YzcsMHgwNiwweDBkLDB4MzcsMHg3YiwweDdmLDB4MzMsMHhjMCwweGEzLDB4OWIsMHgzNiwweGEzLDB4OWQKKywweDM2LDB4YzcsMHgwNiwweDRjLDB4MzcsMHgwMSwweDAwLDB4YzYsMHgwNiwweDllLDB4MzYsMHhmZiwweGM3LDB4MDYsMHgwNSwweDM3CissMHgwMCwweDAwLDB4YzcsMHgwNiwweDA3LDB4MzcsMHgwMCwweDAwLDB4YzcsMHgwNiwweDA5LDB4MzcsMHgwMCwweDAwLDB4YTMsMHhmMworLDB4MzYsMHhhMywweGVmLDB4MzYsMHhhMywweGYxLDB4MzYsMHhlOCwweGZlLDB4ZjUsMHhlNSwweDAyLDB4MjUsMHhmOSwweGZmLDB4MGQKKywweDAzLDB4MDAsMHgwZCwweDAwLDB4ODgsMHgyNSwweGVmLDB4ZmYsMHgwZCwweDAwLDB4NDAsMHgwZCwweDAwLDB4MDQsMHhlNywweDAyCissMHhiOCwweDhmLDB4MDMsMHhjZCwweDM5LDB4YjgsMHg4MCwweDAwLDB4Y2QsMHgzNSwweGM3LDB4MDYsMHhhYSwweDAyLDB4ZmYsMHhmZgorLDB4YTEsMHhhOSwweDM2LDB4YTMsMHhhNywweDM2LDB4MGQsMHgwMCwweGE0LDB4MGQsMHgwMCwweDA4LDB4ZTcsMHgwMCwweGEzLDB4YTkKKywweDM2LDB4YzcsMHgwNiwweGEzLDB4MzYsMHgwMSwweDAwLDB4YzcsMHgwNiwweGE1LDB4MzYsMHgwYywweDAwLDB4ODMsMHgzZSwweGE1CissMHgzNiwweDAwLDB4NzUsMHgwOSwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDUsMHgwMCwweGU5LDB4MTMsMHhmZiwweGZmLDB4MGUsMHhhNQorLDB4MzYsMHhiZSwweDExLDB4MDAsMHhlOCwweDIyLDB4MDUsMHhiOCwweDkwLDB4MDMsMHhjZCwweDM5LDB4YzMsMHg4MywweDNlLDB4YTMKKywweDM2LDB4MDEsMHg3NCwweGQ5LDB4YzMsMHhiOCwweDkwLDB4MDMsMHhjZCwweDNhLDB4MjYsMHhhMCwweDJiLDB4MDAsMHgyNiwweDhiCissMHgxZSwweDJjLDB4MDAsMHhjZCwweDM0LDB4ODMsMHgzZSwweGEzLDB4MzYsMHgwMSwweDc0LDB4MDMsMHhlOSwweGYwLDB4MDQsMHgzYworLDB4MGYsMHg3NSwweDFlLDB4ODEsMHhmYiwweDAwLDB4MDIsMHg3NSwweDE4LDB4MjYsMHhhMSwweDIwLDB4MDAsMHhhMywweDA1LDB4MzcKKywweDI2LDB4YTEsMHgyMiwweDAwLDB4YTMsMHgwNywweDM3LDB4MjYsMHhhMSwweDI0LDB4MDAsMHhhMywweDA5LDB4MzcsMHhlOSwweDA5CissMHgwMCwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDEsMHgwMCwweGU5LDB4YjYsMHhmZSwweGM3LDB4MDYsMHhhMywweDM2LDB4MDIsMHgwMAorLDB4YzYsMHgwNiwweDllLDB4MzYsMHhmZiwweGU4LDB4Y2IsMHhmZCwweGU4LDB4MWMsMHhkOSwweDMzLDB4YzAsMHhhMywweDg1LDB4MzcKKywweGEzLDB4ODMsMHgzNywweGEzLDB4ODcsMHgzNywweGEzLDB4ODksMHgzNywweGI4LDB4OTEsMHgwMywweGNkLDB4MzksMHhiOCwweDgwCissMHgwMCwweGNkLDB4MzUsMHhjNywweDA2LDB4YWEsMHgwMiwweGZmLDB4ZmYsMHhlNSwweDAwLDB4MjUsMHhmZiwweDUzLDB4ZTcsMHgwMAorLDB4ODEsMHgwZSwweDlhLDB4MzcsMHg4MCwweDAwLDB4YjgsMHg5MiwweDAzLDB4Y2QsMHgzOSwweDMzLDB4YzAsMHhlNywweDBlLDB4YmUKKywweDA4LDB4MDAsMHg4ZSwweDA2LDB4MzgsMHgzNCwweGU4LDB4OGUsMHhlNSwweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHg3ZCwweDRiCissMHg4MywweDI2LDB4ZWYsMHgzNCwweGRmLDB4Y2QsMHg1MCwweDgzLDB4MGUsMHhlZiwweDM0LDB4MjAsMHhjMywweGY3LDB4MDYsMHg5YQorLDB4MzcsMHg4MCwweDAwLDB4NzQsMHgzMiwweGE5LDB4ZDAsMHgwNywweDc0LDB4MGMsMHhhOSwweDAwLDB4MDQsMHg3NCwweDBlLDB4MzMKKywweGMwLDB4ZTcsMHgwZSwweGU5LDB4ZGEsMHhmZiwweGZmLDB4MDYsMHg4NSwweDM3LDB4ZTksMHhkMywweGZmLDB4ZmYsMHgwNiwweDgzCissMHgzNywweGU5LDB4Y2MsMHhmZiwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDEsMHgwMCwweGU5LDB4MzYsMHhmZSwweDgzLDB4MjYsMHg5YQorLDB4MzcsMHg3ZiwweGJiLDB4ZmYsMHg3ZiwweGNkLDB4NTMsMHhlNSwweDAwLDB4MGQsMHgwMCwweGFjLDB4ZTcsMHgwMCwweGU1LDB4MDIKKywweDI1LDB4ZmYsMHhmYiwweDI1LDB4ZWYsMHhmZiwweDI1LDB4ZmYsMHhmNywweDBkLDB4MDEsMHgwMCwweGU3LDB4MDIsMHhhMSwweDgzCissMHgzNywweDNiLDB4MDYsMHg0NiwweDM3LDB4N2YsMHhjZCwweGExLDB4ODUsMHgzNywweDNiLDB4MDYsMHg0OCwweDM3LDB4N2MsMHhjNAorLDB4YzcsMHgwNiwweGEzLDB4MzYsMHgwMywweDAwLDB4YmUsMHgxMywweDAwLDB4ZTgsMHhmZCwweDAzLDB4YjgsMHg5MywweDAzLDB4Y2QKKywweDM5LDB4YjgsMHg5NCwweDAzLDB4Y2QsMHgzOSwweGI4LDB4OTYsMHgwMywweGNkLDB4MzksMHhiOCwweDk1LDB4MDMsMHhjZCwweDM5CissMHhiZSwweDA2LDB4MDAsMHhlOCwweGUzLDB4MDMsMHhlOSwweGQ2LDB4MDMsMHg4MywweDNlLDB4YTMsMHgzNiwweDAzLDB4NzQsMHgwMQorLDB4YzMsMHhiZSwweDEzLDB4MDAsMHhlOCwweGQyLDB4MDMsMHhiOCwweDk0LDB4MDMsMHhjZCwweDM5LDB4YzMsMHhiOCwweDk0LDB4MDMKKywweGNkLDB4M2EsMHgyNiwweGEwLDB4MmIsMHgwMCwweDI2LDB4OGIsMHgxZSwweDJjLDB4MDAsMHhjZCwweDM0LDB4ODMsMHgzZSwweGEzCissMHgzNiwweDAzLDB4NzQsMHgwMywweGU5LDB4YTgsMHgwMywweDNjLDB4MGQsMHg3NSwweDNlLDB4ODMsMHhmYiwweDAwLDB4NzUsMHgzOQorLDB4ZTUsMHgwMiwweDBkLDB4MDAsMHgyMCwweGU3LDB4MDIsMHhiOCwweDkzLDB4MDMsMHhjZCwweDNhLDB4YzcsMHgwNiwweGEzLDB4MzYKKywweDA0LDB4MDAsMHhiZSwweDAwLDB4MDAsMHhlOCwweDBjLDB4ZmMsMHhjNiwweDA2LDB4OWQsMHgzNiwweDgwLDB4YzYsMHgwNiwweDllCissMHgzNiwweDAwLDB4YzcsMHgwNiwweDMzLDB4MzcsMHgwMiwweDAwLDB4YjgsMHg5YSwweDAzLDB4Y2QsMHgzOSwweGU4LDB4ZmMsMHgwMAorLDB4YzcsMHgwNiwweDRjLDB4MzcsMHgwMCwweDAwLDB4ZTksMHg2NiwweDAzLDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwOCwweDAwLDB4ZTkKKywweDYxLDB4ZmQsMHg4MywweDNlLDB4YTMsMHgzNiwweDAzLDB4NzUsMHgwOSwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDUsMHgwMCwweGU5CissMHg1MSwweGZkLDB4ZTksMHg0YSwweDAzLDB4ODMsMHgzZSwweGEzLDB4MzYsMHgwNCwweDc0LDB4MTIsMHg4MywweDNlLDB4YTMsMHgzNgorLDB4MDUsMHg3NCwweDBiLDB4Y2QsMHgzNCwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDcsMHgwMCwweGU5LDB4MzUsMHhmZCwweGM3LDB4MDYKKywweGEzLDB4MzYsMHgwNiwweDAwLDB4YzYsMHgwNiwweDllLDB4MzYsMHhmZiwweGI4LDB4OWEsMHgwMywweGNkLDB4M2EsMHhiOCwweDk5CissMHgwMywweGNkLDB4M2EsMHhiOCwweDk2LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg5NywweDAzLDB4Y2QsMHgzOSwweGI4LDB4OTgsMHgwMworLDB4Y2QsMHgzOSwweGI4LDB4OWIsMHgwMywweGNkLDB4MzksMHhlOSwweDE4LDB4ZmQsMHhjZCwweDM0LDB4ODMsMHgzZSwweGEzLDB4MzYKKywweDA0LDB4NzcsMHgxOCwweDgzLDB4M2UsMHhhMywweDM2LDB4MDMsMHg3NSwweDA4LDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDAxCissMHg3NSwweDA5LDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwMSwweDAwLDB4ZTksMHhlOCwweGZjLDB4ZTksMHhlMSwweDAyLDB4Y2QsMHgzNAorLDB4ODMsMHgzZSwweGEzLDB4MzYsMHgwMiwweDc3LDB4MDksMHhjNywweDA2LDB4M2QsMHgzNywweDAxLDB4MDAsMHhlOSwweGQzLDB4ZmMKKywweDgzLDB4M2UsMHhhMywweDM2LDB4MDQsMHg3NywweDA1LDB4YjgsMHg5NiwweDAzLDB4Y2QsMHgzOSwweGU5LDB4YzAsMHgwMiwweDgzCissMHgzZSwweGEzLDB4MzYsMHgwMywweDc1LDB4MTAsMHgyNiwweGExLDB4MGMsMHgwMCwweDI1LDB4MDcsMHgwMCwweDUwLDB4M2QsMHgwNAorLDB4MDAsMHg3NSwweDAzLDB4ZTgsMHgzNiwweDAwLDB4YTEsMHhmMywweDM2LDB4ODYsMHhlMCwweGU3LDB4MWUsMHhhMywweGUzLDB4MzYKKywweDgxLDB4MjYsMHgwYiwweDM3LDB4MDAsMHgwMywweDgxLDB4MjYsMHgwZCwweDM3LDB4N2IsMHg3ZiwweDgzLDB4MGUsMHgwZCwweDM3CissMHg0OCwweGU4LDB4MTQsMHhmMywweDU4LDB4M2QsMHgwNCwweDAwLDB4NzQsMHgwOSwweDI2LDB4ZjcsMHgwNiwweDBjLDB4MDAsMHgyMAorLDB4MDAsMHg3NSwweDA2LDB4YjgsMHgwMSwweDAwLDB4ZTksMHg3YSwweDAyLDB4ZTksMHg4NiwweGZjLDB4YTEsMHhlNSwweDM2LDB4ZTcKKywweDJlLDB4YTEsMHhlNywweDM2LDB4ZTcsMHgzZSwweGExLDB4ZDMsMHgzNiwweGEzLDB4OWMsMHgzNCwweGExLDB4ZDUsMHgzNiwweGEzCissMHg5ZSwweDM0LDB4YzMsMHgyNiwweDgwLDB4M2UsMHgxYywweDAwLDB4ZmYsMHg3NSwweDJmLDB4MjYsMHg4MCwweDNlLDB4MWUsMHgwMAorLDB4ZmYsMHg3NSwweDI3LDB4MjYsMHhmNywweDA2LDB4MGMsMHgwMCwweDQwLDB4MDAsMHg3NSwweDFiLDB4YTEsMHhkMSwweDM2LDB4MjYKKywweGEzLDB4MWEsMHgwMCwweGExLDB4ZDMsMHgzNiwweDI2LDB4YTMsMHgxYywweDAwLDB4YTEsMHhkNSwweDM2LDB4MjYsMHhhMywweDFlCissMHgwMCwweGI4LDB4MGEsMHg4MCwweGU5LDB4MmMsMHgwMiwweGU5LDB4MzgsMHhmYywweGZmLDB4MDYsMHg5MCwweDM0LDB4YmUsMHgwYQorLDB4MDAsMHhjNiwweDA2LDB4YjYsMHgzNCwweDAxLDB4ZjYsMHgwNiwweDlkLDB4MzYsMHg4MCwweDc1LDB4MDUsMHg4MywweDBlLDB4YzIKKywweDM0LDB4MDEsMHhjZCwweDM0LDB4ZTksMHgwYywweGZjLDB4ODMsMHgzZSwweGEzLDB4MzYsMHgwMywweDc1LDB4MDksMHhjNywweDA2CissMHgzZCwweDM3LDB4MDUsMHgwMCwweGU5LDB4ZmMsMHhmYiwweGU1LDB4MDIsMHgwZCwweDAzLDB4MDAsMHgwZCwweDAwLDB4ODgsMHgwZAorLDB4MDAsMHg0MCwweDBkLDB4MDAsMHgwNCwweGU3LDB4MDIsMHhjNywweDA2LDB4YTMsMHgzNiwweDA1LDB4MDAsMHhjNiwweDA2LDB4OWUKKywweDM2LDB4ZmYsMHhiZSwweDAyLDB4MDAsMHhlOCwweGUxLDB4MDEsMHhiOCwweDg5LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg5YSwweDAzCissMHhjZCwweDNhLDB4YjgsMHg5OSwweDAzLDB4Y2QsMHgzOSwweGI4LDB4OTcsMHgwMywweGNkLDB4MzksMHhiOCwweDk4LDB4MDMsMHhjZAorLDB4MzksMHhlOSwweGJiLDB4MDEsMHg4MywweDNlLDB4YTMsMHgzNiwweDAzLDB4NzQsMHgwYSwweDgzLDB4M2UsMHhhMywweDM2LDB4MDQKKywweDc0LDB4MDMsMHhlOSwweGFhLDB4MDEsMHhiZSwweDA2LDB4MDAsMHhlOCwweGFlLDB4MDEsMHhiOCwweDk1LDB4MDMsMHhjZCwweDM5CissMHhlOSwweDljLDB4MDEsMHg4MywweDNlLDB4YTMsMHgzNiwweDA1LDB4NzQsMHgwMywweGU5LDB4OTIsMHgwMSwweGJlLDB4MDIsMHgwMAorLDB4ZTgsMHg5NiwweDAxLDB4YjgsMHg5OSwweDAzLDB4Y2QsMHgzOSwweGU5LDB4ODQsMHgwMSwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDUKKywweDAwLDB4ZTksMHg3YiwweDAxLDB4ZTUsMHgwMiwweDI1LDB4ZmYsMHhkZiwweGU3LDB4MDIsMHhjNywweDA2LDB4YTMsMHgzNiwweDA3CissMHgwMCwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDUsMHgwMCwweGU5LDB4NjUsMHgwMSwweGU4LDB4ZDUsMHgwNCwweGM2LDB4MDYsMHg5ZAorLDB4MzYsMHgwMCwweGM3LDB4MDYsMHg5YiwweDM2LDB4MDAsMHgwMCwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDUsMHgwMCwweGM3LDB4MDYKKywweGE4LDB4MDIsMHgwMCwweDAwLDB4YzcsMHgwNiwweDRjLDB4MzcsMHgwMSwweDAwLDB4ZTUsMHgwMiwweDI1LDB4ZjksMHhmZiwweDBkCissMHgwMywweDAwLDB4MGQsMHgwMCwweDg4LDB4MjUsMHhlZiwweGZmLDB4MGQsMHgwMCwweDQwLDB4MGQsMHgwMCwweDA0LDB4ZTcsMHgwMgorLDB4ZTksMHg2NywweGZjLDB4YjgsMHg5YSwweDAzLDB4Y2QsMHgzOSwweGY3LDB4MDYsMHhmNCwweDMzLDB4MDAsMHgxMCwweDc1LDB4MDkKKywweGM3LDB4MDYsMHgzMywweDM3LDB4MDIsMHgwMCwweGU5LDB4MTYsMHgwMSwweGZmLDB4MGUsMHgzMywweDM3LDB4NzQsMHgwMywweGU5CissMHgwZCwweDAxLDB4ZmYsMHgwNiwweDhlLDB4MzQsMHg4MywweDBlLDB4YzIsMHgzNCwweDA4LDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwMworLDB4MDAsMHhlOSwweGZmLDB4ZmEsMHhjMywweDUyLDB4NTAsMHhiYSwweGUwLDB4MDAsMHhiOCwweDAwLDB4MTAsMHhlZiwweDU4LDB4NWEKKywweGMzLDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwMCwweDAwLDB4ZTksMHhlOSwweGZhLDB4ZmEsMHhlOCwweDU0LDB4MDQsMHhiOCwweDgwCissMHgwMywweDhlLDB4YzAsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4ZDgsMHgyYiwweGI4LDB4N2YsMHgwMywweDhlLDB4YzAsMHgyNgorLDB4YzcsMHgwNiwweDA0LDB4MDAsMHhlOCwweDJjLDB4MzMsMHhjMCwweDhlLDB4YzAsMHhhMSwweGE3LDB4MzYsMHhhMywweGE5LDB4MzYKKywweGExLDB4YTksMHgzNiwweGU3LDB4MDAsMHhhMSwweGFiLDB4MzYsMHhlNywweDAyLDB4YzcsMHgwNiwweDA1LDB4MzcsMHgwMCwweDAwCissMHhjNywweDA2LDB4MDcsMHgzNywweDAwLDB4MDAsMHhjNywweDA2LDB4MDksMHgzNywweDAwLDB4MDAsMHhjNiwweDA2LDB4OWQsMHgzNgorLDB4MDAsMHhjNiwweDA2LDB4OWUsMHgzNiwweGZmLDB4YzcsMHgwNiwweDliLDB4MzYsMHgwMCwweDAwLDB4YzcsMHgwNiwweGEzLDB4MzYKKywweDAwLDB4MDAsMHhjNywweDA2LDB4MGYsMHgzNywweDAwLDB4MDAsMHhjNywweDA2LDB4YTgsMHgwMiwweDAwLDB4MDAsMHhjNywweDA2CissMHg0YywweDM3LDB4MDEsMHgwMCwweDgxLDB4MjYsMHhhZiwweDM2LDB4ZmYsMHhlNywweGExLDB4YWYsMHgzNiwweGU3LDB4MDYsMHhiYgorLDB4ZmYsMHg3ZiwweGNkLDB4NTMsMHhlOCwweDdjLDB4ZjksMHhlNSwweDU2LDB4MGQsMHgwMiwweDAwLDB4ZTcsMHg1NiwweGZiLDB4YzMKKywweDhkLDB4M2UsMHhjMCwweDUzLDB4OGQsMHgzNiwweGYwLDB4MzgsMHhiOSwweDBlLDB4MDAsMHg4YiwweDFlLDB4MzAsMHgzNCwweDg5CissMHg1YywweDAyLDB4MmUsMHg4YiwweDQ1LDB4MDIsMHg4OSwweDQ0LDB4MDYsMHgyZSwweDhiLDB4MDUsMHg4OSwweDQ0LDB4MDQsMHg4MworLDB4YzcsMHgwNCwweDgzLDB4YzYsMHgxMCwweGUyLDB4ZTgsMHhiOCwweDgwLDB4MDMsMHg4ZSwweGMwLDB4MjYsMHhjNywweDA2LDB4MDQKKywweDAwLDB4ZTIsMHg1MSwweGI4LDB4N2YsMHgwMywweDhlLDB4YzAsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4YjIsMHg1MiwweDMzCissMHhjMCwweDhlLDB4YzAsMHhjNywweDA2LDB4YTEsMHgzNiwweDAxLDB4MDAsMHhjNywweDA2LDB4MGYsMHgzNywweDA1LDB4MDAsMHhjMworLDB4MzMsMHhmZiwweDhlLDB4MDYsMHhhNiwweDAyLDB4OGIsMHgzNiwweGE0LDB4MDIsMHgyZSwweGZmLDB4YTQsMHhhMCwweDUzLDB4ZTgKKywweDhjLDB4ZGIsMHhjMywweGU4LDB4NDgsMHhmNywweGU5LDB4ZjYsMHhmZiwweDhlLDB4MDYsMHgzOCwweDM0LDB4ZTgsMHgwNywweGUxCissMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4ZGYsMHg0ZiwweGNkLDB4NTAsMHhjMywweDI2LDB4YzcsMHgwNiwweDBhLDB4MDAsMHgwMAorLDB4MDAsMHgyNiwweGZmLDB4MjYsMHgwNCwweDAwLDB4Y2QsMHgzNCwweGU5LDB4ZDQsMHhmZiwweGExLDB4ZDEsMHgzNiwweDI2LDB4MzkKKywweDA2LDB4MWEsMHgwMCwweDc1LDB4MjIsMHhhMSwweGQzLDB4MzYsMHgyNiwweDM5LDB4MDYsMHgxYywweDAwLDB4NzUsMHgxOCwweGExCissMHhkNSwweDM2LDB4MjYsMHgzOSwweDA2LDB4MWUsMHgwMCwweDc1LDB4MGUsMHgyNiwweGY3LDB4MDYsMHgwYywweDAwLDB4NDAsMHgwMAorLDB4NzQsMHgwNSwweDgzLDB4MGUsMHg2NiwweDM3LDB4NDAsMHg4MSwweDBlLDB4YWYsMHgzNiwweDAwLDB4MTAsMHhhMSwweGFmLDB4MzYKKywweGU3LDB4MDYsMHg4MywweDNlLDB4YTMsMHgzNiwweDAyLDB4NzUsMHgwNSwweGNkLDB4MzQsMHhlOSwweDU2LDB4ZmIsMHg4MywweDNlCissMHhhMywweDM2LDB4MDAsMHg3NCwweGIxLDB4ODMsMHgzZSwweGEzLDB4MzYsMHgwNSwweDc3LDB4YWEsMHgyNiwweGY2LDB4MDYsMHgwYQorLDB4MDAsMHhmZiwweDc1LDB4YTIsMHhlOCwweGZkLDB4ZGQsMHg1MCwweGY2LDB4MDYsMHg5MywweDM2LDB4MjAsMHg3NSwweDAzLDB4ZTkKKywweDhjLDB4MDAsMHgyNiwweGExLDB4MGMsMHgwMCwweDI1LDB4MDcsMHgwMCwweDNkLDB4MDcsMHgwMCwweDc1LDB4MDMsMHhlOSwweDc2CissMHgwMCwweDNkLDB4MDUsMHgwMCwweDc1LDB4MDMsMHhlOSwweDZlLDB4MDAsMHhmNywweDA2LDB4ZTYsMHgzNCwweDE4LDB4ODAsMHg3NQorLDB4MDMsMHhlOSwweDZhLDB4MDAsMHhmNywweDA2LDB4ZTYsMHgzNCwweDAwLDB4ODAsMHg3NCwweDM1LDB4MjYsMHg4MCwweDNlLDB4MjkKKywweDAwLDB4MDIsMHg3NSwweDJkLDB4NTEsMHg1NiwweDU3LDB4OGQsMHgzNiwweDNlLDB4MzQsMHg4ZCwweDNlLDB4MjAsMHgwMCwweGI5CissMHgwNiwweDAwLDB4ZjMsMHhhNiwweDVmLDB4NWUsMHg1OSwweDc1LDB4NDUsMHgyNiwweGExLDB4MjAsMHgwMCwweGEzLDB4M2UsMHgzNAorLDB4MjYsMHhhMSwweDIyLDB4MDAsMHhhMywweDQwLDB4MzQsMHgyNiwweGExLDB4MjQsMHgwMCwweGEzLDB4NDIsMHgzNCwweGU5LDB4MjYKKywweDAwLDB4ZjcsMHgwNiwweGU2LDB4MzQsMHgwOCwweDAwLDB4NzQsMHgwYiwweDI2LDB4ODAsMHgzZSwweDE5LDB4MDAsMHgwMCwweDc0CissMHgwMywweGU5LDB4MTMsMHgwMCwweGY3LDB4MDYsMHhlNiwweDM0LDB4MTAsMHgwMCwweDc0LDB4MTIsMHgyNiwweGEwLDB4MjgsMHgwMAorLDB4YzAsMHhlOCwweDA0LDB4MjIsMHhjMCwweDc0LDB4MDcsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4ZmYsMHhmZiwweDU4LDB4MjMKKywweGMwLDB4NzQsMHgwMywweGU5LDB4ZGQsMHhmZSwweDgxLDB4MjYsMHg5YiwweDM2LDB4ZmYsMHhmZSwweDI2LDB4YTEsMHgyMCwweDAwCissMHgzYiwweDA2LDB4ZDEsMHgzNiwweDc1LDB4MWEsMHgyNiwweGExLDB4MjIsMHgwMCwweDNiLDB4MDYsMHhkMywweDM2LDB4NzUsMHgxMAorLDB4MjYsMHhhMSwweDI0LDB4MDAsMHgzYiwweDA2LDB4ZDUsMHgzNiwweDc1LDB4MDYsMHg4MSwweDBlLDB4OWIsMHgzNiwweDAwLDB4MDEKKywweDI2LDB4YTEsMHgyMCwweDAwLDB4MjUsMHg3ZiwweGZmLDB4YTMsMHhiOCwweDM0LDB4MjYsMHhhMSwweDIyLDB4MDAsMHhhMywweGJhCissMHgzNCwweDI2LDB4YTEsMHgyNCwweDAwLDB4YTMsMHhiYywweDM0LDB4OGIsMHhjNiwweDg2LDB4YzQsMHhhMywweGMwLDB4MzQsMHhkMQorLDB4ZTYsMHg4MCwweGZjLDB4MDksMHg3NCwweDAzLDB4ZTgsMHhmNiwweGY1LDB4YTEsMHgwNSwweDM3LDB4MGIsMHgwNiwweDA3LDB4MzcKKywweDBiLDB4MDYsMHgwOSwweDM3LDB4NzQsMHgzZSwweDI2LDB4YTEsMHgyMCwweDAwLDB4M2IsMHgwNiwweDA1LDB4MzcsMHg3NSwweDE3CissMHgyNiwweGExLDB4MjIsMHgwMCwweDNiLDB4MDYsMHgwNywweDM3LDB4NzUsMHgwZCwweDI2LDB4YTEsMHgyNCwweDAwLDB4M2IsMHgwNgorLDB4MDksMHgzNywweDc1LDB4MDMsMHhlOSwweDFkLDB4MDAsMHgyNiwweGEwLDB4MjgsMHgwMCwweDI0LDB4MGYsMHgzYywweDAzLDB4NzQKKywweDFiLDB4M2MsMHgwMCwweDc1LDB4MGYsMHg4MywweDNlLDB4YTMsMHgzNiwweDA0LDB4NzQsMHgxMCwweGY3LDB4MDYsMHg5YiwweDM2CissMHgwMCwweDAxLDB4NzQsMHgwOCwweDJlLDB4ZmYsMHg5NCwweGY4LDB4NTMsMHhlOSwweDMzLDB4ZmUsMHhjZCwweDM0LDB4YzcsMHgwNgorLDB4M2QsMHgzNywweDAxLDB4MDAsMHhlOSwweDJjLDB4ZjgsMHg4MywweDNlLDB4YTMsMHgzNiwweDA1LDB4NzQsMHgxMCwweDgzLDB4M2UKKywweGEzLDB4MzYsMHgwMSwweDdlLDB4MDksMHg4MywweGVlLDB4MTYsMHgyZSwweGZmLDB4OTQsMHgyNCwweDU0LDB4YzMsMHhjZCwweDM0CissMHhjMywweDI2LDB4YTEsMHgwYywweDAwLDB4M2QsMHhmZiwweDdmLDB4NzQsMHgwNSwweDI2LDB4ZmYsMHgyNiwweDA0LDB4MDAsMHhlOQorLDB4ZmQsMHhmZCwweGExLDB4ZjQsMHgzMywweGE5LDB4MDAsMHg4OCwweDc0LDB4MGIsMHhhOSwweDAwLDB4MTAsMHg3NSwweDA5LDB4OGIKKywweDFlLDB4NDMsMHgzNywweGZmLDB4ZTMsMHhlOSwweDk3LDB4MDAsMHhjNywweDA2LDB4MzUsMHgzNywweDA1LDB4MDAsMHhjNywweDA2CissMHg0MywweDM3LDB4MjgsMHg1MiwweGY3LDB4MDYsMHhmNCwweDMzLDB4MDAsMHgwOCwweDc0LDB4MDYsMHhjNywweDA2LDB4NDMsMHgzNworLDB4MWEsMHg1MiwweGI4LDB4ODAsMHgwMywweGNkLDB4MzksMHhlOSwweGM1LDB4ZmQsMHhhOSwweDAwLDB4MDgsMHg3NCwweGQ5LDB4ZmYKKywweDBlLDB4MzUsMHgzNywweDc1LDB4ZWQsMHhlOSwweDMwLDB4MDAsMHhhOSwweDAwLDB4MDgsMHg3NSwweGNiLDB4ZmYsMHgwZSwweDM1CissMHgzNywweDc1LDB4ZGYsMHg4MSwweDBlLDB4YzIsMHgzNCwweGMwLDB4MDAsMHhmNiwweDA2LDB4OWQsMHgzNiwweDgwLDB4NzQsMHgwZgorLDB4ODEsMHgwZSwweDliLDB4MzYsMHgwMCwweDgwLDB4YzcsMHgwNiwweDBmLDB4MzcsMHgwMiwweDAwLDB4ZTksMHg5MCwweGZkLDB4YzcKKywweDA2LDB4M2QsMHgzNywweDAyLDB4MDAsMHhlOSwweDhiLDB4ZjcsMHg4MCwweDI2LDB4OWUsMHgzNiwweGZmLDB4NzUsMHgzMCwweGY2CissMHgwNiwweDlkLDB4MzYsMHg4MCwweDc0LDB4MjAsMHhmZiwweDA2LDB4OTQsMHgzNCwweDgzLDB4MGUsMHg2NiwweDM3LDB4MjAsMHg4ZQorLDB4MDYsMHgzMCwweDM0LDB4MjYsMHhmNywweDA2LDB4MGEsMHgwMCwweDAwLDB4MDEsMHg3NCwweDA3LDB4MjYsMHg4MSwweDBlLDB4MDgKKywweDAwLDB4MDAsMHgwMSwweGU5LDB4MDksMHgwMCwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDQsMHgwMCwweGU5LDB4NTQsMHhmNywweDgxCissMHgwZSwweGFmLDB4MzYsMHgwMCwweDA4LDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNiwweGU1LDB4MGEsMHhhOSwweDAwLDB4ODAsMHg3NAorLDB4MGUsMHg4MSwweDI2LDB4YWYsMHgzNiwweGZmLDB4ZjcsMHhhMSwweGFmLDB4MzYsMHhlNywweDA2LDB4ZTksMHg0OSwweGZmLDB4ZTkKKywweDJkLDB4ZmQsMHhjNywweDA2LDB4NDEsMHgzNywweDAwLDB4MDAsMHhiZSwweDI5LDB4MDAsMHhlOCwweDJiLDB4ZmQsMHhlOSwweDFlCissMHhmZCwweGNkLDB4MzQsMHg4MywweDNlLDB4YTMsMHgzNiwweDA0LDB4NzcsMHgwOSwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDEsMHgwMAorLDB4ZTksMHgxMCwweGY3LDB4ZTksMHgwOSwweGZkLDB4Y2QsMHgzNCwweGMzLDB4YzcsMHgwNiwweDliLDB4MzYsMHgwMCwweDAwLDB4ZTgKKywweDBjLDB4ZjUsMHg4MSwweDI2LDB4YWYsMHgzNiwweGZmLDB4ZTcsMHhhMSwweGFmLDB4MzYsMHhlNywweDA2LDB4ODEsMHgyNiwweDliCissMHgzNiwweGZmLDB4N2YsMHhlNSwweDAyLDB4MGQsMHgwMSwweDAwLDB4MjUsMHhlZiwweGZmLDB4MjUsMHhmZiwweGRmLDB4ZTcsMHgwMgorLDB4YmIsMHhmZiwweDdmLDB4Y2QsMHg1MywweDMzLDB4YzAsMHhhMywweDlkLDB4MzYsMHhhMywweDlmLDB4MzYsMHhlOCwweDIwLDB4ZjMKKywweGU4LDB4NDMsMHhmMywweDgzLDB4MGUsMHg5YiwweDM2LDB4MTAsMHhjNywweDA2LDB4OTksMHgzNiwweDAwLDB4MDAsMHhlOCwweGQyCissMHhmNSwweGU1LDB4NTYsMHgwZCwweDAyLDB4MDAsMHhlNywweDU2LDB4YzcsMHgwNiwweGE4LDB4MDIsMHgwMCwweDAwLDB4YmUsMHgwMAorLDB4MDAsMHhlOCwweDMwLDB4ZjUsMHhjNiwweDA2LDB4YTAsMHgzNiwweDBlLDB4YjgsMHg5YywweDAzLDB4Y2QsMHgzOSwweGI4LDB4ODAKKywweDAwLDB4Y2QsMHgzNSwweGM3LDB4MDYsMHhhYSwweDAyLDB4ZmYsMHhmZiwweGM3LDB4MDYsMHhhMSwweDM2LDB4MDEsMHgwMCwweGU5CissMHhhNSwweGY2LDB4MDYsMHhiOCwweDhmLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg5MCwweDAzLDB4Y2QsMHgzYSwweGI4LDB4OTEsMHgwMworLDB4Y2QsMHgzYSwweGI4LDB4OTIsMHgwMywweGNkLDB4M2EsMHhiOCwweDkzLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg5NCwweDAzLDB4Y2QKKywweDNhLDB4YjgsMHg5NSwweDAzLDB4Y2QsMHgzYSwweGI4LDB4OTYsMHgwMywweGNkLDB4M2EsMHhiOCwweDk3LDB4MDMsMHhjZCwweDNhCissMHhiOCwweDk4LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg5OSwweDAzLDB4Y2QsMHgzYSwweGI4LDB4OWEsMHgwMywweGNkLDB4M2EsMHhiOAorLDB4OWIsMHgwMywweGNkLDB4M2EsMHhiOCwweDdmLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4MCwweDAzLDB4Y2QsMHgzYSwweDA3LDB4YzMKKywweGY3LDB4NDksMHhmMSwweDRlLDB4ZGYsMHg0ZiwweGRmLDB4NGYsMHhkZiwweDRmLDB4ZGYsMHg0ZiwweGY4LDB4NTEsMHhkZiwweDRmCissMHhmYSwweDRmLDB4MGIsMHg1MCwweGQxLDB4NTEsMHhkZiwweDRmLDB4ZGYsMHg0ZiwweGRmLDB4NGYsMHhkZiwweDRmLDB4ZGYsMHg0ZgorLDB4ZTQsMHg0ZSwweDA2LDB4MDAsMHhjZCwweDRhLDB4MDQsMHgwMCwweGU0LDB4NGUsMHgxOSwweDAwLDB4YWQsMHg0YiwweGZhLDB4MDAKKywweDgyLDB4NGMsMHgwOCwweDA3LDB4MDksMHg0YywweDE0LDB4MDAsMHgyNCwweDRlLDB4NjQsMHgwMCwweGQ3LDB4NGQsMHhmNCwweDAxCissMHg2NCwweDRlLDB4YmMsMHgwMiwweDdhLDB4NGUsMHhlOCwweDAzLDB4NDMsMHg0ZSwweDAyLDB4MDAsMHhiMywweDRlLDB4ZjQsMHgwMQorLDB4NWIsMHg0ZSwweGY0LDB4MDEsMHhlNSwweDRlLDB4MTQsMHgwMCwweDA2LDB4NTAsMHgwNiwweDUwLDB4OTUsMHg0YywweGMxLDB4NTIKKywweGMxLDB4NTIsMHhmZSwweDRjLDB4ZGEsMHg0YywweDA2LDB4NTAsMHgwNiwweDUwLDB4MDYsMHg1MCwweDA2LDB4NTAsMHhiNywweDUxCissMHhiNywweDUxLDB4YjcsMHg1MSwweGI3LDB4NTEsMHhiNywweDUxLDB4YjcsMHg1MSwweDA2LDB4NTAsMHhkNSwweDRhLDB4MDYsMHg1MAorLDB4MWQsMHg0YywweDA2LDB4NTAsMHg4MywweDRkLDB4MWYsMHg0ZCwweDFmLDB4NGQsMHhlZCwweDQwLDB4ZmEsMHg0MCwweDA3LDB4NDEKKywweDM3LDB4MzcsMHgyZSwweDM3LDB4MzcsMHgyMCwweDIwLDB4NzksMHg3OSwweDJmLDB4NzksMHg3OSwweDJmLDB4NzksMHg3OSwweDIwCissMHgzMCwweDMxLDB4MmUsMHgzOSwweDMwLDB4MjAsMHgyMCwweDMwLDB4MzIsMHgyZiwweDMxLDB4MzcsMHgyZiwweDM5LDB4MzksMHgyMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDkwLDB4ZWEsMHhjMCwweDE1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMywweDA2Cit9IDsgIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL0tjb25maWcgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QwZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL0tjb25maWcKQEAgLTAsMCArMSwxODYgQEAKKyMKKyMgVG9rZW4gUmluZyBkcml2ZXIgY29uZmlndXJhdGlvbgorIworCittZW51ICJUb2tlbiBSaW5nIGRldmljZXMiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTCisKKyMgU28gZmFyLCB3ZSBvbmx5IGhhdmUgUENJLCBJU0EsIGFuZCBNQ0EgdG9rZW4gcmluZyBkZXZpY2VzCitjb25maWcgVFIKKwlib29sICJUb2tlbiBSaW5nIGRyaXZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gKFBDSSB8fCBJU0EgfHwgTUNBIHx8IENDVykKKwlzZWxlY3QgTExDCisJaGVscAorCSAgVG9rZW4gUmluZyBpcyBJQk0ncyB3YXkgb2YgY29tbXVuaWNhdGlvbiBvbiBhIGxvY2FsIG5ldHdvcms7IHRoZQorCSAgcmVzdCBvZiB0aGUgd29ybGQgdXNlcyBFdGhlcm5ldC4gVG8gcGFydGljaXBhdGUgb24gYSBUb2tlbiBSaW5nCisJICBuZXR3b3JrLCB5b3UgbmVlZCBhIHNwZWNpYWwgVG9rZW4gcmluZyBuZXR3b3JrIGNhcmQuIElmIHlvdSBhcmUKKwkgIGNvbm5lY3RlZCB0byBzdWNoIGEgVG9rZW4gUmluZyBuZXR3b3JrIGFuZCB3YW50IHRvIHVzZSB5b3VyIFRva2VuCisJICBSaW5nIGNhcmQgdW5kZXIgTGludXgsIHNheSBZIGhlcmUgYW5kIHRvIHRoZSBkcml2ZXIgZm9yIHlvdXIKKwkgIHBhcnRpY3VsYXIgY2FyZCBiZWxvdyBhbmQgcmVhZCB0aGUgVG9rZW4tUmluZyBtaW5pLUhPV1RPLCBhdmFpbGFibGUKKwkgIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gTW9zdCBwZW9wbGUgY2FuCisJICBzYXkgTiBoZXJlLgorCitjb25maWcgSUJNVFIKKwl0cmlzdGF0ZSAiSUJNIFRyb3BpYyBjaGlwc2V0IGJhc2VkIGFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRSICYmIChJU0EgfHwgTUNBKQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgYWxsIElCTSBUb2tlbiBSaW5nIGNhcmRzIHRoYXQgZG9uJ3QgdXNlIERNQS4gSWYKKwkgIHlvdSBoYXZlIHN1Y2ggYSBiZWFzdCwgc2F5IFkgYW5kIHJlYWQgdGhlIFRva2VuLVJpbmcgbWluaS1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFdhcm5pbmc6IHRoaXMgZHJpdmVyIHdpbGwgYWxtb3N0IGRlZmluaXRlbHkgZmFpbCBpZiBtb3JlIHRoYW4gb25lCisJICBhY3RpdmUgVG9rZW4gUmluZyBjYXJkIGlzIHByZXNlbnQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGlibXRyLgorCitjb25maWcgSUJNT0wKKwl0cmlzdGF0ZSAiSUJNIE9seW1waWMgY2hpcHNldCBQQ0kgYWRhcHRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gVFIgJiYgUENJCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciBhbGwgbm9uLUxhbnN0cmVhbWVyIElCTSBQQ0kgVG9rZW4gUmluZyBDYXJkcy4KKwkgIFNwZWNpZmljYWxseSB0aGlzIGlzIGFsbCBJQk0gUENJLCBQQ0kgV2FrZSBPbiBMYW4sIFBDSSBJSSwgUENJIElJCisJICBXYWtlIE9uIExhbiwgYW5kIFBDSSAxMDAvMTYvNCBhZGFwdGVycy4KKworCSAgSWYgeW91IGhhdmUgc3VjaCBhbiBhZGFwdGVyLCBzYXkgWSBhbmQgcmVhZCB0aGUgVG9rZW4tUmluZworCSAgbWluaS1IT1dUTywgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgb2x5bXBpYy4KKworCSAgQWxzbyByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9vbHltcGljLnR4dD4gb3IgY2hlY2sgdGhlCisJICBMaW51eCBUb2tlbiBSaW5nIFByb2plY3Qgc2l0ZSBmb3IgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbiBhdAorCSAgPGh0dHA6Ly93d3cubGludXh0ci5uZXQvPi4KKworY29uZmlnIElCTUxTCisJdHJpc3RhdGUgIklCTSBMYW5zdHJlYW1lciBjaGlwc2V0IFBDSSBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBUUiAmJiBQQ0kgJiYgITY0QklUCisJaGVscAorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciBJQk0gTGFuc3RyZWFtZXIgUENJIFRva2VuIFJpbmcgQ2FyZHMuCisKKwkgIElmIHlvdSBoYXZlIHN1Y2ggYW4gYWRhcHRlciwgc2F5IFkgYW5kIHJlYWQgdGhlIFRva2VuLVJpbmcKKwkgIG1pbmktSE9XVE8sIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGxhbnN0cmVhbWVyLgorCitjb25maWcgM0MzNTkKKwl0cmlzdGF0ZSAiM0NvbSAzQzM1OSBUb2tlbiBMaW5rIFZlbG9jaXR5IFhMIGFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRSICYmIFBDSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgdGhlIDNDb20gUENJIFZlbG9jaXR5IFhMIGNhcmRzLCBzcGVjaWZpY2FsbHkKKwkgIHRoZSAzQ29tIDNDMzU5LCBwbGVhc2Ugbm90ZSB0aGlzIGlzIG5vdCBmb3IgdGhlIDNDMzM5IGNhcmRzLCB5b3UKKwkgIHNob3VsZCB1c2UgdGhlIHRtczM4MCBkcml2ZXIgaW5zdGVhZC4KKworCSAgSWYgeW91IGhhdmUgc3VjaCBhbiBhZGFwdGVyLCBzYXkgWSBhbmQgcmVhZCB0aGUgVG9rZW4tUmluZworCSAgbWluaS1IT1dUTywgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgM2MzNTkuCisKKwkgIEFsc28gcmVhZCB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvM2MzNTkudHh0PiBvciBjaGVjayB0aGUgCisJICBMaW51eCBUb2tlbiBSaW5nIFByb2plY3Qgc2l0ZSBmb3IgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbiBhdAorCSAgPGh0dHA6Ly93d3cubGludXh0ci5uZXQ+CisKK2NvbmZpZyBUTVMzODBUUgorCXRyaXN0YXRlICJHZW5lcmljIFRNUzM4MCBUb2tlbiBSaW5nIElTQS9QQ0kgYWRhcHRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gVFIgJiYgKFBDSSB8fCBJU0EpCisJc2VsZWN0IEZXX0xPQURFUgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGdlbmVyaWMgc3VwcG9ydCBmb3IgdG9rZW4gcmluZyBhZGFwdGVycworCSAgYmFzZWQgb24gdGhlIFRleGFzIEluc3RydW1lbnRzIFRNUzM4MCBzZXJpZXMgY2hpcHNldHMuICBUaGlzCisJICBpbmNsdWRlcyB0aGUgU3lzS29ubmVjdCBUUjQvMTYoKykgSVNBIChTSy00MTkwKSwgU3lzS29ubmVjdAorCSAgVFI0LzE2KCspIFBDSSAoU0stNDU5MCksIFN5c0tvbm5lY3QgVFI0LzE2IFBDSSAoU0stNDU5MSksCisJICBDb21wYXEgNC8xNiBQQ0ksIFRob21hcy1Db25yYWQgVEM0MDQ4IDQvMTYgUENJLCBhbmQgc2V2ZXJhbAorCSAgTWFkZ2UgYWRhcHRlcnMuICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgYmUgYXNrZWQgdG8gc2VsZWN0CisJICB3aGljaCBjYXJkcyB0byBzdXBwb3J0IGJlbG93LiAgSWYgeW91J3JlIHVzaW5nIG1vZHVsZXMsIGVhY2gKKwkgIGNsYXNzIG9mIGNhcmQgd2lsbCBiZSBzdXBwb3J0ZWQgYnkgYSBzZXBhcmF0ZSBtb2R1bGUuCisKKwkgIElmIHlvdSBoYXZlIHN1Y2ggYW4gYWRhcHRlciBhbmQgd291bGQgbGlrZSB0byB1c2UgaXQsIHNheSBZIGFuZAorCSAgcmVhZCB0aGUgVG9rZW4tUmluZyBtaW5pLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgQWxzbyByZWFkIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy90bXMzODB0ci50eHQ+IG9yCisJICBjaGVjayA8aHR0cDovL3d3dy5hdWsuY3gvdG1zMzgwdHIvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgdG1zMzgwdHIuCisKK2NvbmZpZyBUTVNQQ0kKKwl0cmlzdGF0ZSAiR2VuZXJpYyBUTVMzODAgUENJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBUUiAmJiBUTVMzODBUUiAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBUaGlzIHRtczM4MCBtb2R1bGUgc3VwcG9ydHMgZ2VuZXJpYyBUTVMzODAtYmFzZWQgUENJIGNhcmRzLgorCisJICBUaGVzZSBjYXJkcyBhcmUga25vd24gdG8gd29yazoKKwkgIC0gQ29tcGFxIDQvMTYgVFIgUENJCisJICAtIFN5c0tvbm5lY3QgVFI0LzE2IFBDSSAoU0stNDU5MC9TSy00NTkxKQorCSAgLSBUaG9tYXMtQ29ucmFkIFRDNDA0OCBQQ0kgNC8xNgorCSAgLSAzQ29tIFRva2VuIExpbmsgVmVsb2NpdHkKKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgdG1zcGNpLgorCitjb25maWcgU0tJU0EKKwl0cmlzdGF0ZSAiU3lzS29ubmVjdCBUUjQvMTYgSVNBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBUUiAmJiBUTVMzODBUUiAmJiBJU0EKKwloZWxwCisJICBUaGlzIHRtczM4MCBtb2R1bGUgc3VwcG9ydHMgU3lzS29ubmVjdCBUUjQvMTYgSVNBIGNhcmRzLgorCisJICBUaGVzZSBjYXJkcyBhcmUga25vd24gdG8gd29yazoKKwkgIC0gU3lzS29ubmVjdCBUUjQvMTYgSVNBIChTSy00MTkwKQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBza2lzYS4KKworY29uZmlnIFBST1RFT04KKwl0cmlzdGF0ZSAiUHJvdGVvbiBJU0Egc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRSICYmIFRNUzM4MFRSICYmIElTQQorCWhlbHAKKwkgIFRoaXMgdG1zMzgwIG1vZHVsZSBzdXBwb3J0cyBQcm90ZW9uIElTQSBjYXJkcy4KKworCSAgVGhlc2UgY2FyZHMgYXJlIGtub3duIHRvIHdvcms6CisJICAtIFByb3Rlb24gMTM5MgorCSAgLSBQcm90ZW9uIDEzOTIgcGx1cworCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBwcm90ZW9uLgorCitjb25maWcgQUJZU1MKKwl0cmlzdGF0ZSAiTWFkZ2UgU21hcnQgMTYvNCBQQ0kgTWsyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBUUiAmJiBUTVMzODBUUiAmJiBQQ0kKKwloZWxwCisJICBUaGlzIHRtczM4MCBtb2R1bGUgc3VwcG9ydHMgdGhlIE1hZGdlIFNtYXJ0IDE2LzQgUENJIE1rMgorCSAgY2FyZHMgKDUxLTAyKS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgYWJ5c3MuCisKK2NvbmZpZyBNQURHRU1DCisJdHJpc3RhdGUgIk1hZGdlIFNtYXJ0IDE2LzQgUmluZ25vZGUgTWljcm9DaGFubmVsIgorCWRlcGVuZHMgb24gVFIgJiYgVE1TMzgwVFIgJiYgTUNBX0xFR0FDWQorCWhlbHAKKwkgIFRoaXMgdG1zMzgwIG1vZHVsZSBzdXBwb3J0cyB0aGUgTWFkZ2UgU21hcnQgMTYvNCBNQzE2IGFuZCBNQzMyCisJICBNaWNyb0NoYW5uZWwgYWRhcHRlcnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIG1hZGdlbWMuCisKK2NvbmZpZyBTTUNUUgorCXRyaXN0YXRlICJTTUMgSVNBL01DQSBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBUUiAmJiAoSVNBIHx8IE1DQV9MRUdBQ1kpICYmIChCUk9LRU4gfHwgITY0QklUKQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgdGhlIElTQSBhbmQgTUNBIFNNQyBUb2tlbiBSaW5nIGNhcmRzLAorCSAgc3BlY2lmaWNhbGx5IFNNQyBUb2tlbkNhcmQgRWxpdGUgKDgxMTVUKSBhbmQgU01DIFRva2VuQ2FyZCBFbGl0ZS9BCisJICAoODExNVQvQSkgYWRhcHRlcnMuCisKKwkgIElmIHlvdSBoYXZlIHN1Y2ggYW4gYWRhcHRlciBhbmQgd291bGQgbGlrZSB0byB1c2UgaXQsIHNheSBZIG9yIE0gYW5kCisJICByZWFkIHRoZSBUb2tlbi1SaW5nIG1pbmktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+IGFuZCB0aGUgZmlsZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NtY3RyLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHNtY3RyLgorCitlbmRtZW51CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODhiMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGRyaXZlcnMvbmV0L3Rva2VucmluZworIworCitvYmotJChDT05GSUdfSUJNVFIpIAkrPSBpYm10ci5vCitvYmotJChDT05GSUdfSUJNT0wpIAkrPSBvbHltcGljLm8KK29iai0kKENPTkZJR19JQk1MUykgCSs9IGxhbnN0cmVhbWVyLm8KK29iai0kKENPTkZJR19UTVMzODBUUikgCSs9IHRtczM4MHRyLm8KK29iai0kKENPTkZJR19BQllTUykgCSs9IGFieXNzLm8KK29iai0kKENPTkZJR19NQURHRU1DKSAJKz0gbWFkZ2VtYy5vCitvYmotJChDT05GSUdfUFJPVEVPTikgCSs9IHByb3Rlb24ubworb2JqLSQoQ09ORklHX1RNU1BDSSkgCSs9IHRtc3BjaS5vCitvYmotJChDT05GSUdfU0tJU0EpIAkrPSBza2lzYS5vCitvYmotJChDT05GSUdfU01DVFIpIAkrPSBzbWN0ci5vCitvYmotJChDT05GSUdfM0MzNTkpCSs9IDNjMzU5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9hYnlzcy5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2FieXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0YTJiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9hYnlzcy5jCkBAIC0wLDAgKzEsNDgxIEBACisvKgorICogIGFieXNzLmM6IE5ldHdvcmsgZHJpdmVyIGZvciB0aGUgTWFkZ2UgU21hcnQgMTYvNCBQQ0kgTWsyIHRva2VuIHJpbmcgY2FyZC4KKyAqCisgKiAgV3JpdHRlbiAxOTk5LTIwMDAgYnkgQWRhbSBGcml0emxlcgorICoKKyAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgVGhpcyBkcml2ZXIgbW9kdWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY2FyZHM6CisgKiAgICAgIC0gTWFkZ2UgU21hcnQgMTYvNCBQQ0kgTWsyCisgKgorICogIE1haW50YWluZXIocyk6CisgKiAgICBBRglBZGFtIEZyaXR6bGVyCQltaWRAYXVrLmN4CisgKgorICogIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorICoJMzAtRGVjLTk5CUFGCVNwbGl0IG9mZiBmcm9tIHRoZSB0bXMzODB0ciBkcml2ZXIuCisgKgkyMi1KYW4tMDAJQUYJVXBkYXRlZCB0byB1c2UgaW5kaXJlY3QgcmVhZC93cml0ZXMgCisgKgkyMy1Ob3YtMDAJSkcJTmV3IFBDSSBBUEksIGNsZWFudXBzCisgKgorICoKKyAqICBUT0RPOgorICoJMS4gU2VlIGlmIHdlIGNhbiB1c2UgTU1JTyBpbnN0ZWFkIG9mIGluYi9vdXRiL2ludy9vdXR3CisgKgkyLiBBZGQgc3VwcG9ydCBmb3IgTWsxIChoYXMgQVQyNCBhdHRhY2hlZCB0byB0aGUgUENJCisgKgkJY29uZmlnIHJlZ2lzdGVycykKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAidG1zMzgwdHIuaCIKKyNpbmNsdWRlICJhYnlzcy5oIiAgICAgICAgICAgIC8qIE1hZGdlLXNwZWNpZmljIGNvbnN0YW50cyAqLworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisiYWJ5c3MuYzogdjEuMDIgMjMvMTEvMjAwMCBieSBBZGFtIEZyaXR6bGVyXG4iOworCisjZGVmaW5lIEFCWVNTX0lPX0VYVEVOVCA2NAorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWJ5c3NfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9NQURHRSwgUENJX0RFVklDRV9JRF9NQURHRV9NSzIsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfTkVUV09SS19UT0tFTl9SSU5HIDw8IDgsIDB4MDBmZmZmZmYsIH0sCisJeyB9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWJ5c3NfcGNpX3RibCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBhYnlzc19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhYnlzc19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGFieXNzX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYWJ5c3NfY2hpcHNldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYWJ5c3NfcmVhZF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWJ5c3Nfc2V0bnNlbG91dF9waW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBhdDI0X3dyaXRlZGF0YWJ5dGUodW5zaWduZWQgbG9uZyByZWdhZGRyLCB1bnNpZ25lZCBjaGFyIGJ5dGUpOworc3RhdGljIGludCBhdDI0X3NlbmRmdWxsY21kKHVuc2lnbmVkIGxvbmcgcmVnYWRkciwgdW5zaWduZWQgY2hhciBjbWQsIHVuc2lnbmVkIGNoYXIgYWRkcik7CitzdGF0aWMgaW50IGF0MjRfc2VuZGNtZCh1bnNpZ25lZCBsb25nIHJlZ2FkZHIsIHVuc2lnbmVkIGNoYXIgY21kKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0MjRfcmVhZGRhdGFiaXQodW5zaWduZWQgbG9uZyByZWdhZGRyKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0MjRfcmVhZGRhdGFieXRlKHVuc2lnbmVkIGxvbmcgcmVnYWRkcik7CitzdGF0aWMgaW50IGF0MjRfd2FpdGZvcmFjayh1bnNpZ25lZCBsb25nIHJlZ2FkZHIpOworc3RhdGljIGludCBhdDI0X3dhaXRmb3JuYWNrKHVuc2lnbmVkIGxvbmcgcmVnYWRkcik7CitzdGF0aWMgdm9pZCBhdDI0X3NldGxpbmVzKHVuc2lnbmVkIGxvbmcgcmVnYWRkciwgdW5zaWduZWQgY2hhciBjbG9jaywgdW5zaWduZWQgY2hhciBkYXRhKTsKK3N0YXRpYyB2b2lkIGF0MjRfc3RhcnQodW5zaWduZWQgbG9uZyByZWdhZGRyKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0MjRfcmVhZGIodW5zaWduZWQgbG9uZyByZWdhZGRyLCB1bnNpZ25lZCBjaGFyIGFkZHIpOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWJ5c3Nfc2lmcmVhZGIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXJldHVybiBpbmIoZGV2LT5iYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWJ5c3Nfc2lmcmVhZHcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXJldHVybiBpbncoZGV2LT5iYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCBhYnlzc19zaWZ3cml0ZWIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmFsLCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJb3V0Yih2YWwsIGRldi0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgYWJ5c3Nfc2lmd3JpdGV3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCW91dHcodmFsLCBkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFieXNzX2F0dGFjaChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sJCisJc3RhdGljIGludCB2ZXJzaW9ucHJpbnRlZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRfbG9jYWwgKnRwOworCWludCBpLCByZXQsIHBjaV9pcnFfbGluZTsKKwl1bnNpZ25lZCBsb25nIHBjaV9pb2FkZHI7CisJCisJaWYgKHZlcnNpb25wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKCIlcyIsIHZlcnNpb24pOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIFJlbW92ZSBJL08gc3BhY2UgbWFya2VyIGluIGJpdCAwLiAqLworCXBjaV9pcnFfbGluZSA9IHBkZXYtPmlycTsKKwlwY2lfaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKKwkJCisJLyogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGZvdW5kIGEgdmFsaWQgY2FyZC4gKi8KKwkJCisJZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHBjaV9pb2FkZHIsIEFCWVNTX0lPX0VYVEVOVCwgZGV2LT5uYW1lKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX291dF90cmRldjsKKwl9CisJCQorCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgdG1zMzgwdHJfaW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCSAgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dF9yZWdpb247CisJCQorCWRldi0+YmFzZV9hZGRyCT0gcGNpX2lvYWRkcjsKKwlkZXYtPmlycQk9IHBjaV9pcnFfbGluZTsKKwkJCisJcHJpbnRrKCIlczogTWFkZ2UgU21hcnQgMTYvNCBQQ0kgTWsyIChBYnlzcylcbiIsIGRldi0+bmFtZSk7CisJcHJpbnRrKCIlczogICAgSU86ICUjNGx4ICBJUlE6ICVkXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHBjaV9pb2FkZHIsIGRldi0+aXJxKTsKKwkvKgorCSAqIFRoZSBUTVMgU0lGIHJlZ2lzdGVycyBsYXkgMHgxMCBhYm92ZSB0aGUgY2FyZCBiYXNlIGFkZHJlc3MuCisJICovCisJZGV2LT5iYXNlX2FkZHIgKz0gMHgxMDsKKwkJCisJcmV0ID0gdG1zZGV2X2luaXQoZGV2LCBQQ0lfTUFYX0FERFJFU1MsIHBkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGdldCBtZW1vcnkgZm9yIGRldi0+cHJpdi5cbiIsIAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBlcnJfb3V0X2lycTsKKwl9CisKKwlhYnlzc19yZWFkX2VlcHJvbShkZXYpOworCQkKKwlwcmludGsoIiVzOiAgICBSaW5nIFN0YXRpb24gQWRkcmVzczogIiwgZGV2LT5uYW1lKTsKKwlwcmludGsoIiUyLjJ4IiwgZGV2LT5kZXZfYWRkclswXSk7CisJZm9yIChpID0gMTsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCI6JTIuMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIlxuIik7CisKKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisJdHAtPnNldG5zZWxvdXQgPSBhYnlzc19zZXRuc2Vsb3V0X3BpbnM7CisJdHAtPnNpZnJlYWRiID0gYWJ5c3Nfc2lmcmVhZGI7CisJdHAtPnNpZnJlYWR3ID0gYWJ5c3Nfc2lmcmVhZHc7CisJdHAtPnNpZndyaXRlYiA9IGFieXNzX3NpZndyaXRlYjsKKwl0cC0+c2lmd3JpdGV3ID0gYWJ5c3Nfc2lmd3JpdGV3OworCisJbWVtY3B5KHRwLT5Qcm9kdWN0SUQsICJNYWRnZSBQQ0kgMTYvNCBNazIiLCBQUk9EX0lEX1NJWkUgKyAxKTsKKwkJCisJZGV2LT5vcGVuID0gYWJ5c3Nfb3BlbjsKKwlkZXYtPnN0b3AgPSBhYnlzc19jbG9zZTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9vdXRfdG1zZGV2OworCXJldHVybiAwOworCitlcnJfb3V0X3Rtc2RldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJdG1zZGV2X3Rlcm0oZGV2KTsKK2Vycl9vdXRfaXJxOgorCWZyZWVfaXJxKHBkZXYtPmlycSwgZGV2KTsKK2Vycl9vdXRfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKHBjaV9pb2FkZHIsIEFCWVNTX0lPX0VYVEVOVCk7CitlcnJfb3V0X3RyZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGFieXNzX3NldG5zZWxvdXRfcGlucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IHZhbCA9IDA7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCWlmKHRwLT5EYXRhUmF0ZSA9PSBTUEVFRF80KQorCQl2YWwgfD0gMHgwMTsgIC8qIFNldCA0TWJwcyAqLworCWVsc2UKKwkJdmFsIHw9IDB4MDA7ICAvKiBTZXQgMTZNYnBzICovCisJCisJcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgTWFkZ2UgYm9hcmRzIHNob3VsZCB1c2UgdGhpcyBjb2RlOgorICogICAtIFNtYXJ0IDE2LzQgUENJIE1rMiAoQWJ5c3MpCisgKiAgIC0gU21hcnQgMTYvNCBQQ0kgTWsxIChQQ0kgVCkKKyAqICAgLSBTbWFydCAxNi80IENsaWVudCBQbHVzIFBuUCAoQmlnIEFwcGxlKQorICogICAtIFNtYXJ0IDE2LzQgQ2FyZGJ1cyBNazIKKyAqCisgKiBUaGVzZSBhY2Nlc3MgYW4gQXRtZWwgQVQyNCBTRUVQUk9NIHVzaW5nIHRoZWlyIGdsdWUgY2hpcCByZWdpc3RlcnMuIAorICoKKyAqLworc3RhdGljIHZvaWQgYXQyNF93cml0ZWRhdGFieXRlKHVuc2lnbmVkIGxvbmcgcmVnYWRkciwgdW5zaWduZWQgY2hhciBieXRlKQoreworCWludCBpOworCQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJYXQyNF9zZXRsaW5lcyhyZWdhZGRyLCAwLCAoYnl0ZSA+PiAoNy1pKSkmMHgwMSk7CisJCWF0MjRfc2V0bGluZXMocmVnYWRkciwgMSwgKGJ5dGUgPj4gKDctaSkpJjB4MDEpOworCQlhdDI0X3NldGxpbmVzKHJlZ2FkZHIsIDAsIChieXRlID4+ICg3LWkpKSYweDAxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXQyNF9zZW5kZnVsbGNtZCh1bnNpZ25lZCBsb25nIHJlZ2FkZHIsIHVuc2lnbmVkIGNoYXIgY21kLCB1bnNpZ25lZCBjaGFyIGFkZHIpCit7CisJaWYgKGF0MjRfc2VuZGNtZChyZWdhZGRyLCBjbWQpKSB7CisJCWF0MjRfd3JpdGVkYXRhYnl0ZShyZWdhZGRyLCBhZGRyKTsKKwkJcmV0dXJuIGF0MjRfd2FpdGZvcmFjayhyZWdhZGRyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQyNF9zZW5kY21kKHVuc2lnbmVkIGxvbmcgcmVnYWRkciwgdW5zaWduZWQgY2hhciBjbWQpCit7CisJaW50IGk7CisJCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJYXQyNF9zdGFydChyZWdhZGRyKTsKKwkJYXQyNF93cml0ZWRhdGFieXRlKHJlZ2FkZHIsIGNtZCk7CisJCWlmIChhdDI0X3dhaXRmb3JhY2socmVnYWRkcikpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0MjRfcmVhZGRhdGFiaXQodW5zaWduZWQgbG9uZyByZWdhZGRyKQoreworCXVuc2lnbmVkIGNoYXIgdmFsOworCisJYXQyNF9zZXRsaW5lcyhyZWdhZGRyLCAwLCAxKTsKKwlhdDI0X3NldGxpbmVzKHJlZ2FkZHIsIDEsIDEpOworCXZhbCA9IChpbmIocmVnYWRkcikgJiBBVDI0X0RBVEEpPzE6MDsKKwlhdDI0X3NldGxpbmVzKHJlZ2FkZHIsIDEsIDEpOworCWF0MjRfc2V0bGluZXMocmVnYWRkciwgMCwgMSk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXQyNF9yZWFkZGF0YWJ5dGUodW5zaWduZWQgbG9uZyByZWdhZGRyKQoreworCXVuc2lnbmVkIGNoYXIgZGF0YSA9IDA7CisJaW50IGk7CisJCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlkYXRhIDw8PSAxOworCQlkYXRhIHw9IGF0MjRfcmVhZGRhdGFiaXQocmVnYWRkcik7CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgYXQyNF93YWl0Zm9yYWNrKHVuc2lnbmVkIGxvbmcgcmVnYWRkcikKK3sKKwlpbnQgaTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlpZiAoKGF0MjRfcmVhZGRhdGFiaXQocmVnYWRkcikgJiAweDAxKSA9PSAweDAwKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0MjRfd2FpdGZvcm5hY2sodW5zaWduZWQgbG9uZyByZWdhZGRyKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCWlmICgoYXQyNF9yZWFkZGF0YWJpdChyZWdhZGRyKSAmIDB4MDEpID09IDB4MDEpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0MjRfc2V0bGluZXModW5zaWduZWQgbG9uZyByZWdhZGRyLCB1bnNpZ25lZCBjaGFyIGNsb2NrLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdW5zaWduZWQgY2hhciB2YWwgPSBBVDI0X0VOQUJMRTsKKwlpZiAoY2xvY2spCisJCXZhbCB8PSBBVDI0X0NMT0NLOworCWlmIChkYXRhKQorCQl2YWwgfD0gQVQyNF9EQVRBOworCisJb3V0Yih2YWwsIHJlZ2FkZHIpOyAKKwl0bXMzODB0cl93YWl0KDIwKTsgLyogVmVyeSBuZWNlc3NhcnkuICovCit9CisKK3N0YXRpYyB2b2lkIGF0MjRfc3RhcnQodW5zaWduZWQgbG9uZyByZWdhZGRyKQoreworCWF0MjRfc2V0bGluZXMocmVnYWRkciwgMCwgMSk7CisJYXQyNF9zZXRsaW5lcyhyZWdhZGRyLCAxLCAxKTsKKwlhdDI0X3NldGxpbmVzKHJlZ2FkZHIsIDEsIDApOworCWF0MjRfc2V0bGluZXMocmVnYWRkciwgMCwgMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0MjRfcmVhZGIodW5zaWduZWQgbG9uZyByZWdhZGRyLCB1bnNpZ25lZCBjaGFyIGFkZHIpCit7CisJdW5zaWduZWQgY2hhciBkYXRhID0gMHhmZjsKKwkKKwlpZiAoYXQyNF9zZW5kZnVsbGNtZChyZWdhZGRyLCBBVDI0X1dSSVRFLCBhZGRyKSkgeworCQlpZiAoYXQyNF9zZW5kY21kKHJlZ2FkZHIsIEFUMjRfUkVBRCkpIHsKKwkJCWRhdGEgPSBhdDI0X3JlYWRkYXRhYnl0ZShyZWdhZGRyKTsKKwkJCWlmICghYXQyNF93YWl0Zm9ybmFjayhyZWdhZGRyKSkKKwkJCQlkYXRhID0gMHhmZjsKKwkJfQorCX0KKwlyZXR1cm4gZGF0YTsKK30KKworCisvKgorICogRW5hYmxlIGJhc2ljIGZ1bmN0aW9ucyBvZiB0aGUgTWFkZ2UgY2hpcHNldCBuZWVkZWQKKyAqIGZvciBpbml0aWFsaXphdGlvbi4KKyAqLworc3RhdGljIHZvaWQgYWJ5c3NfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgY2hhciByZXNldF9yZWc7CisJdW5zaWduZWQgbG9uZyBpb2FkZHI7CisJCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJcmVzZXRfcmVnID0gaW5iKGlvYWRkciArIFBDSUJNMl9SRVNFVF9SRUcpOworCXJlc2V0X3JlZyB8PSBQQ0lCTTJfUkVTRVRfUkVHX0NISVBfTlJFUzsKKwlvdXRiKHJlc2V0X3JlZywgaW9hZGRyICsgUENJQk0yX1JFU0VUX1JFRyk7CisJdG1zMzgwdHJfd2FpdCgxMDApOworfQorCisvKgorICogRW5hYmxlIHRoZSBmdW5jdGlvbnMgb2YgdGhlIE1hZGdlIGNoaXBzZXQgbmVlZGVkIGZvcgorICogZnVsbCB3b3JraW5nIG9yZGVyLiAKKyAqLworc3RhdGljIGludCBhYnlzc19jaGlwc2V0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBjaGFyIHJlc2V0X3JlZzsKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKwkKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkKKwlyZXNldF9yZWcgPSBpbmIoaW9hZGRyICsgUENJQk0yX1JFU0VUX1JFRyk7CisJCisJcmVzZXRfcmVnIHw9IFBDSUJNMl9SRVNFVF9SRUdfQ0hJUF9OUkVTOworCW91dGIocmVzZXRfcmVnLCBpb2FkZHIgKyBQQ0lCTTJfUkVTRVRfUkVHKTsKKwkKKwlyZXNldF9yZWcgJj0gfihQQ0lCTTJfUkVTRVRfUkVHX0NISVBfTlJFUyB8CisJCSAgICAgICBQQ0lCTTJfUkVTRVRfUkVHX0ZJRk9fTlJFUyB8IAorCQkgICAgICAgUENJQk0yX1JFU0VUX1JFR19TSUZfTlJFUyk7CisJb3V0YihyZXNldF9yZWcsIGlvYWRkciArIFBDSUJNMl9SRVNFVF9SRUcpOworCQorCXRtczM4MHRyX3dhaXQoMTAwKTsKKwkKKwlyZXNldF9yZWcgfD0gUENJQk0yX1JFU0VUX1JFR19DSElQX05SRVM7CisJb3V0YihyZXNldF9yZWcsIGlvYWRkciArIFBDSUJNMl9SRVNFVF9SRUcpOworCQorCXJlc2V0X3JlZyB8PSBQQ0lCTTJfUkVTRVRfUkVHX1NJRl9OUkVTOworCW91dGIocmVzZXRfcmVnLCBpb2FkZHIgKyBQQ0lCTTJfUkVTRVRfUkVHKTsKKworCXJlc2V0X3JlZyB8PSBQQ0lCTTJfUkVTRVRfUkVHX0ZJRk9fTlJFUzsKKwlvdXRiKHJlc2V0X3JlZywgaW9hZGRyICsgUENJQk0yX1JFU0VUX1JFRyk7CisKKwlvdXRiKFBDSUJNMl9JTlRfQ09OVFJPTF9SRUdfU0lOVEVOIHwgCisJICAgICBQQ0lCTTJfSU5UX0NPTlRST0xfUkVHX1BDSV9FUlJfRU5BQkxFLCAKKwkgICAgIGlvYWRkciArIFBDSUJNMl9JTlRfQ09OVFJPTF9SRUcpOworICAKKwlvdXRiKDMwLCBpb2FkZHIgKyBQQ0lCTTJfRklGT19USFJFU0hPTEQpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWJ5c3NfY2hpcHNldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCQorCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW91dGIoMCwgaW9hZGRyICsgUENJQk0yX1JFU0VUX1JFRyk7Cit9CisKKy8qCisgKiBSZWFkIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIHRoZSBBVDI0IFNFRVBST00gb24gTWFkZ2UgY2FyZHMuCisgKgorICovCitzdGF0aWMgdm9pZCBhYnlzc19yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKwlpbnQgaTsKKwkKKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJCisJLyogTXVzdCBlbmFibGUgZ2x1ZSBjaGlwIGZpcnN0ICovCisJYWJ5c3NfZW5hYmxlKGRldik7CisJCisJdmFsID0gYXQyNF9yZWFkYihpb2FkZHIgKyBQQ0lCTTJfU0VFUFJPTV9SRUcsIAorCQkJIFBDSUJNMl9TRUVQUk9NX1JJTkdfU1BFRUQpOworCXRwLT5EYXRhUmF0ZSA9IHZhbD9TUEVFRF80OlNQRUVEXzE2OyAvKiBzZXQgb3BlbiBzcGVlZCAqLworCXByaW50aygiJXM6ICAgIFNFRVBST006IHJpbmcgc3BlZWQ6ICVkTWIvc2VjXG4iLCBkZXYtPm5hbWUsIHRwLT5EYXRhUmF0ZSk7CisJCisJdmFsID0gYXQyNF9yZWFkYihpb2FkZHIgKyBQQ0lCTTJfU0VFUFJPTV9SRUcsCisJCQkgUENJQk0yX1NFRVBST01fUkFNX1NJWkUpICogMTI4OworCXByaW50aygiJXM6ICAgIFNFRVBST006IGFkYXB0ZXIgUkFNOiAlZGtiXG4iLCBkZXYtPm5hbWUsIHZhbCk7CisJCisJZGV2LT5hZGRyX2xlbiA9IDY7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBhdDI0X3JlYWRiKGlvYWRkciArIFBDSUJNMl9TRUVQUk9NX1JFRywgCisJCQkJCSAgICAgIFBDSUJNMl9TRUVQUk9NX0JJQStpKTsKK30KKworc3RhdGljIGludCBhYnlzc19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7ICAKKwlhYnlzc19jaGlwc2V0X2luaXQoZGV2KTsKKwl0bXMzODB0cl9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJ5c3NfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl0bXMzODB0cl9jbG9zZShkZXYpOworCWFieXNzX2NoaXBzZXRfY2xvc2UoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGFieXNzX2RldGFjaCAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwkKKwlpZiAoIWRldikKKwkJQlVHKCk7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkci0weDEwLCBBQllTU19JT19FWFRFTlQpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXRtc2Rldl90ZXJtKGRldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhYnlzc19kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFieXNzIiwKKwkuaWRfdGFibGUJPSBhYnlzc19wY2lfdGJsLAorCS5wcm9iZQkJPSBhYnlzc19hdHRhY2gsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhYnlzc19kZXRhY2gpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWJ5c3NfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWJ5c3NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFieXNzX3JtbW9kICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJmFieXNzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFieXNzX2luaXQpOworbW9kdWxlX2V4aXQoYWJ5c3Nfcm1tb2QpOworCisMCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFZFUlNJT05TICAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIGFieXNzLmMiCisgKiAgYWx0LWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIGFieXNzLmMiCisgKiAgYy1zZXQtc3R5bGUgIksmUiIKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9hYnlzcy5oIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2FieXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlNmU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9hYnlzcy5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIAorICogYWJ5c3MuaDogSGVhZGVyIGZvciB0aGUgYWJ5c3MgdG1zMzgwdHIgbW9kdWxlCisgKgorICogQXV0aG9yczoKKyAqIC0gQWRhbSBGcml0emxlciA8bWlkQGF1ay5jeD4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUFER0VUUl9ICisjZGVmaW5lIF9fTElOVVhfTUFER0VUUl9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qCisgKiBGb3IgTWFkZ2UgU21hcnQgMTYvNCBQQ0kgTWsyLiAgU2luY2Ugd2UgaW5jcmVtZW50IHRoZSBiYXNlIGFkZHJlc3MKKyAqIHRvIGdldCBldmVyeXRoaW5nIGNvcnJlY3QgZm9yIHRoZSBUTVMgU0lGLCB3ZSBkbyB0aGVzZSBhcyBuZWdhdGl2ZXMKKyAqIGFzIHRoZXkgZmFsbCBiZWxvdyB0aGUgU0lGIGluIGFkZHJlc3NpbmcuCisgKi8KKyNkZWZpbmUgUENJQk0yX0lOVF9TVEFUVVNfUkVHICAgICAgICAgICgoc2hvcnQpLTE1KS8qIDB4MDEgKi8KKyNkZWZpbmUgUENJQk0yX0lOVF9DT05UUk9MX1JFRyAgICAgICAgICgoc2hvcnQpLTE0KS8qIDB4MDIgKi8KKyNkZWZpbmUgUENJQk0yX1JFU0VUX1JFRyAgICAgICAgICAgICAgICgoc2hvcnQpLTEyKS8qIDB4MDQgKi8KKyNkZWZpbmUgUENJQk0yX1NFRVBST01fUkVHICAgICAgICAgICAgICgoc2hvcnQpLTkpIC8qIDB4MDcgKi8KKworI2RlZmluZSBQQ0lCTTJfSU5UX0NPTlRST0xfUkVHX1NJTlRFTiAgICAgICAgICAgMHgwMgorI2RlZmluZSBQQ0lCTTJfSU5UX0NPTlRST0xfUkVHX1BDSV9FUlJfRU5BQkxFICAgMHg4MAorI2RlZmluZSBQQ0lCTTJfSU5UX1NUQVRVU19SRUdfUENJX0VSUiAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIFBDSUJNMl9SRVNFVF9SRUdfQ0hJUF9OUkVTICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFBDSUJNMl9SRVNFVF9SRUdfRklGT19OUkVTICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFBDSUJNMl9SRVNFVF9SRUdfU0lGX05SRVMgICAgICAgICAgICAgICAweDA0CisKKyNkZWZpbmUgUENJQk0yX0ZJRk9fVEhSRVNIT0xEICAgMHgyMQorI2RlZmluZSBQQ0lCTTJfQlVSU1RfTEVOR1RIICAgICAweDIyCisKKy8qCisgKiBCaXRzIGluIFBDSUJNMl9TRUVQUk9NX1JFRy4KKyAqLworI2RlZmluZSBBVDI0X0VOQUJMRSAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEFUMjRfREFUQSAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQVQyNF9DTE9DSyAgICAgICAgICAgICAgMHgwMQorCisvKgorICogQVQyNCBDb21tYW5kcy4KKyAqLworI2RlZmluZSBBVDI0X1dSSVRFICAgICAgICAgICAgICAweEEwCisjZGVmaW5lIEFUMjRfUkVBRCAgICAgICAgICAgICAgIDB4QTEKKworLyoKKyAqIEFkZHJlc3NlcyBpbiBBVDI0IFNFRVBST00uCisgKi8KKyNkZWZpbmUgUENJQk0yX1NFRVBST01fQklBICAgICAgICAgIDB4MTIKKyNkZWZpbmUgUENJQk0yX1NFRVBST01fUklOR19TUEVFRCAgIDB4MTgKKyNkZWZpbmUgUENJQk0yX1NFRVBST01fUkFNX1NJWkUgICAgIDB4MUEKKyNkZWZpbmUgUENJQk0yX1NFRVBST01fSFdGMSAgICAgICAgIDB4MUMKKyNkZWZpbmUgUENJQk0yX1NFRVBST01fSFdGMiAgICAgICAgIDB4MUUKKworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9fTElOVVhfTUFER0VUUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOTg4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYwpAQCAtMCwwICsxLDE5ODcgQEAKKy8qIGlibXRyLmM6ICBBIHNoYXJlZC1tZW1vcnkgSUJNIFRva2VuIFJpbmcgMTYvNCBkcml2ZXIgZm9yIGxpbnV4CisgKgorICoJV3JpdHRlbiAxOTkzIGJ5IE1hcmsgU3dhbnNvbiBhbmQgUGV0ZXIgRGUgU2NocmlqdmVyLgorICoJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICoJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKglUaGlzIGRldmljZSBkcml2ZXIgc2hvdWxkIHdvcmsgd2l0aCBBbnkgSUJNIFRva2VuIFJpbmcgQ2FyZCB0aGF0IGRvZXMKKyAqCW5vdCB1c2UgRE1BLgorICoKKyAqCUkgdXNlZCBEb25hbGQgQmVja2VyJ3MgKGJlY2tlckBzY3lsZC5jb20pIGRldmljZSBkcml2ZXIgd29yaworICoJYXMgYSBiYXNlIGZvciBtb3N0IG9mIG15IGluaXRpYWwgd29yay4KKyAqCisgKglDaGFuZ2VzIGJ5IFBldGVyIERlIFNjaHJpanZlcgorICoJCShQZXRlci5EZXNjaHJpanZlckBsaW51eC5jYy5rdWxldXZlbi5hYy5iZSkgOgorICoKKyAqCSsgY2hhbmdlZCBuYW1lIHRvIGlibXRyLmMgaW4gYW50aWNpcGF0aW9uIG9mIG90aGVyIHRyIGJvYXJkcy4KKyAqCSsgY2hhbmdlZCByZXNldCBjb2RlIGFuZCBhZGFwdGVyIG9wZW4gY29kZS4KKyAqCSsgYWRkZWQgU0FQIG9wZW4gY29kZS4KKyAqCSsgYSBmaXJzdCBhdHRlbXB0IHRvIHdyaXRlIGludGVycnVwdCwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcm91dGluZXMuCisgKgorICoJQ2hhbmdlcyBieSBEYXZpZCBXLiBNb3JyaXMgKGR3bUBzaGVsbC5wb3J0YWwuY29tKSA6CisgKgk5NDEwMDMgZHdtOiAtIFJlc3RydWN0dXJlIHRva19wcm9iZSBmb3IgbXVsdGlwbGUgYWRhcHRlcnMsIGRldmljZXMuCisgKgkrIEFkZCBjb21tZW50cywgbWlzYyByZW9yZyBmb3IgY2xhcml0eS4KKyAqCSsgRmxhdHRlbiBpbnRlcnJ1cHQgaGFuZGxlciBsZXZlbHMuCisgKgorICoJQ2hhbmdlcyBieSBGYXJ6YWQgRmFyaWQgKGZhcnp5QHplbi52aWEuZWNwLmZyKQorICoJYW5kIFBhc2NhbCBBbmRyZSAoYW5kcmVAY2hpbWF5LnZpYS5lY3AuZnIpIChNYXJjaCA5IDE5OTUpIDoKKyAqCSsgbXVsdGkgcmluZyBzdXBwb3J0IGNsZWFuIHVwLgorICoJKyBSRkMxMDQyIGNvbXBsaWFuY2UgZW5oYW5jZWQuCisgKgorICoJQ2hhbmdlcyBieSBQYXNjYWwgQW5kcmUgKGFuZHJlQGNoaW1heS52aWEuZWNwLmZyKSAoU2VwdGVtYmVyIDcgMTk5NSkgOgorICoJKyBidWcgY29ycmVjdGlvbiBpbiB0cl90eAorICoJKyByZW1vdmVkIHJlZHVuZGFudCBpbmZvcm1hdGlvbiBkaXNwbGF5CisgKgkrIHNvbWUgY29kZSByZXdvcmtpbmcKKyAqCisgKglDaGFuZ2VzIGJ5IE1pY2hlbCBMZXNwaW5hc3NlICh3YWxrZW5AdmlhLmVjcC5mciksCisgKglZYW5uIERvdXNzb3QgKGRvdXNzb3RAdmlhLmVjcC5mcikgYW5kIFBhc2NhbCBBbmRyZSAoYW5kcmVAdmlhLmVjcC5mcikKKyAqCShGZWJydWFyeSAxOCwgMTk5NikgOgorICoJKyBtb2RpZmllZCBzaGFyZWQgbWVtb3J5IGFuZCBtbWlvIGFjY2VzcyBwb3J0IHRoZSBkcml2ZXIgdG8KKyAqCSAgYWxwaGEgcGxhdGZvcm0gKHN0cnVjdHVyZSBhY2Nlc3MgLT4gcmVhZGIvd3JpdGViKQorICoKKyAqCUNoYW5nZXMgYnkgU3RldmUgS2lwaXN6IChidW5neUBpYm0ubmV0IG9yIGtpcGlzekB2bmV0LmlibS5jb20pCisgKgkoSmFudWFyeSAxOCAxOTk2KToKKyAqCSsgc3dhcHBlZCBXV09SIGFuZCBXV0NSIGluIGlibXRyLmgKKyAqCSsgbW92ZWQgc29tZSBpbml0IGNvZGUgZnJvbSB0b2tfcHJvYmUgaW50byB0cmRldl9pbml0LiAgVGhlCisgKgkgIFBDTUNJQSBjb2RlIGNhbiBjYWxsIHRyZGV2X2luaXQgdG8gY29tcGxldGUgaW5pdGlhbGl6aW5nCisgKgkgIHRoZSBkcml2ZXIuCisgKgkrIGFkZGVkIC1EUENNQ0lBIHRvIHN1cHBvcnQgUENNQ0lBCisgKgkrIGRldGVjdGluZyBQQ01DSUEgQ2FyZCBSZW1vdmFsIGluIGludGVycnVwdCBoYW5kbGVyLiAgSWYKKyAqCSAgSVNSUCBpcyBGRiwgdGhlbiBhIFBDTUNJQSBjYXJkIGhhcyBiZWVuIHJlbW92ZWQKKyAqICAgICAgICAxMC8yMDAwIEJ1cnQgbmVlZGVkIGEgbmV3IG1ldGhvZCB0byBhdm9pZCBjcmFzaGluZyB0aGUgT1MKKyAqCisgKglDaGFuZ2VzIGJ5IFBhdWwgTm9ydG9uIChwbm9ydG9uQGN0cy5jb20pIDoKKyAqCSsgcmVzdHJ1Y3R1cmVkIHRoZSBSRUFELkxPRyBsb2dpYyB0byBwcmV2ZW50IHRoZSB0cmFuc21pdCBTUkIKKyAqCSAgZnJvbSBiZWluZyBydWRlbHkgb3ZlcndyaXR0ZW4gYmVmb3JlIHRoZSB0cmFuc21pdCBjeWNsZSBpcworICoJICBjb21wbGV0ZS4gKEF1Z3VzdCAxNSAxOTk2KQorICoJKyBjb21wbGV0ZWQgbXVsdGlwbGUgYWRhcHRlciBzdXBwb3J0LiAoTm92ZW1iZXIgMjAgMTk5NikKKyAqCSsgaW1wbGVtZW50ZWQgY3N1bV9wYXJ0aWFsX2NvcHkgaW4gdHJfcnggYW5kIGluY3JlYXNlZCByZWNlaXZlIAorICogICAgICAgIGJ1ZmZlciBzaXplIGFuZCBjb3VudC4gTWlub3IgZml4ZXMuIChNYXJjaCAxNSwgMTk5NykKKyAqCisgKglDaGFuZ2VzIGJ5IENocmlzdG9waGVyIFR1cmNrc2luIDx3YWJiaXRAcnRmYy5kZW1vbi5jby51az4KKyAqCSsgTm93IGNvbXBpbGVzIG9rIGFzIGEgbW9kdWxlIGFnYWluLgorICoKKyAqCUNoYW5nZXMgYnkgUGF1bCBOb3J0b24gKHBub3J0b25AaWVlZS5vcmcpIDoKKyAqICAgICAgKyBtb3ZlZCB0aGUgaGVhZGVyIG1hbmlwdWxhdGlvbiBjb2RlIGluIHRyX3R4IGFuZCB0cl9yeCB0bworICogICAgICAgIG5ldC84MDIvdHIuYy4gKEp1bHkgMTIgMTk5NykKKyAqICAgICAgKyBhZGQgcmV0cnkgYW5kIHRpbWVvdXQgb24gb3BlbiBpZiBjYWJsZSBkaXNjb25uZWN0ZWQuIChNYXkgNSAxOTk4KQorICogICAgICArIGxpZnRlZCAyMDAwIGJ5dGUgbXR1IGxpbWl0LiBub3cgZGVwZW5kcyBvbiBzaGFyZWQtUkFNIHNpemUuCisgKiAgICAgICAgTWF5IDI1IDE5OTgpCisgKiAgICAgICsgY2FuJ3QgYWxsb2NhdGUgMmsgcmVjdiBidWZmIGF0IDhrIHNoYXJlZC1SQU0uICgyMCBPY3RvYmVyIDE5OTgpCisgKgorICogICAgICBDaGFuZ2VzIGJ5IEpvZWwgU2xvYW4gKGpqc0BjLW1lLmNvbSkgOgorICogICAgICArIGRpc2FibGUgdmVyYm9zZSBkZWJ1ZyBtZXNzYWdlcyBieSBkZWZhdWx0IC0gdG8gZW5hYmxlIHZlcmJvc2UKKyAqCSAgZGVidWdnaW5nLCBlZGl0IHRoZSBJQk1UUl9ERUJVR19NRVNTQUdFUyBkZWZpbmUgYmVsb3cgCisgKgkKKyAqCUNoYW5nZXMgYnkgTWlrZSBQaGlsbGlwcyA8cGhpbGxpbUBhbXRyYWsuY29tPiA6CisgKgkrIEFkZGVkIGV4dHJhICNpZmRlZidzIHRvIHdvcmsgd2l0aCBuZXcgUENNQ0lBIFRva2VuIFJpbmcgQ29kZS4KKyAqCSAgVGhlIFBDTUNJQSBjb2RlIG5vdyBqdXN0IHNldHMgdXAgdGhlIGNhcmQgc28gaXQgY2FuIGJlIHJlY29nbml6ZWQKKyAqICAgICAgICBieSBpYm10cl9wcm9iZS4gQWxzbyBjaGVja3MgYWxsb2NhdGVkIG1lbW9yeSB2cy4gb24tYm9hcmQgbWVtb3J5CisgKgkgIGZvciBjb3JyZWN0IGZpZ3VyZSB0byB1c2UuCisgKgorICoJQ2hhbmdlcyBieSBUaW0gSG9ja2luICh0aG9ja2luQGlzdW5peC5pdC5pbHN0dS5lZHUpIDoKKyAqCSsgYWRkZWQgc3BpbmxvY2tzIGZvciBTTVAgc2FuaXR5ICgxMCBNYXJjaCAxOTk5KQorICoKKyAqICAgICAgQ2hhbmdlcyBieSBKb2NoZW4gRnJpZWRyaWNoIHRvIGVuYWJsZSBSRkMxNDY5IE9wdGlvbiAyIG11bHRpY2FzdGluZworICogICAgICBpLmUuIHVzaW5nIGZ1bmN0aW9uYWwgYWRkcmVzcyBDMCAwMCAwMCAwNCAwMCAwMCB0byB0cmFuc21pdCBhbmQgCisgKiAgICAgIHJlY2VpdmUgbXVsdGljYXN0IHBhY2tldHMuCisgKgorICogICAgICBDaGFuZ2VzIGJ5IE1pa2UgU3VsbGl2YW4gKGJhc2VkIG9uIG9yaWdpbmFsIHNyYW0gcGF0Y2ggYnkgRGF2ZSBHcm90aGUKKyAqICAgICAgdG8gc3VwcG9ydCB3aW5kb3dpbmcgaW50byBvbiBhZGFwdGVyIHNoYXJlZCByYW0uCisgKiAgICAgIGkuZS4gVXNlIExBTkFJRCB0byBzZXR1cCBhIFBuUCBjb25maWd1cmF0aW9uIHdpdGggMTZLIFJBTS4gUGFnaW5nCisgKiAgICAgIHdpbGwgc2hpZnQgdGhpcyAxNksgd2luZG93IG92ZXIgdGhlIGVudGlyZSBhdmFpbGFibGUgc2hhcmVkIFJBTS4KKyAqCisgKiAgICAgIENoYW5nZXMgYnkgUGV0ZXIgRGUgU2NocmlqdmVyIChwMkBtaW5kLmJlKSA6CisgKiAgICAgICsgZml4ZWQgYSBwcm9ibGVtIHdpdGggUENNQ0lBIGNhcmQgcmVtb3ZhbAorICoKKyAqICAgICAgQ2hhbmdlIGJ5IE1pa2UgU3VsbGl2YW4gZXQgYWwuOgorICogICAgICArIGFkZGVkIHR1cmJvIGNhcmQgc3VwcG9ydC4gTm8gbmVlZCB0byB1c2UgbGFuYWlkIHRvIGNvbmZpZ3VyZQorICogICAgICB0aGUgYWRhcHRlciBpbnRvIGlzYSBjb21wYXRpYmxpdHkgbW9kZS4KKyAqCisgKiAgICAgIENoYW5nZXMgYnkgQnVydCBTaWx2ZXJtYW4gdG8gYWxsb3cgdGhlIGNvbXB1dGVyIHRvIGJlaGF2ZSBuaWNlbHkgd2hlbgorICoJYSBjYWJsZSBpcyBwdWxsZWQgb3Igbm90IGluIHBsYWNlLCBvciBhIFBDTUNJQSBjYXJkIGlzIHJlbW92ZWQgaG90LgorICovCisKKy8qIGNoYW5nZSB0aGUgZGVmaW5lIG9mIElCTVRSX0RFQlVHX01FU1NBR0VTIHRvIGEgbm9uemVybyB2YWx1ZSAKK2luIHRoZSBldmVudCB0aGF0IGNoYXR0eSBkZWJ1ZyBtZXNzYWdlcyBhcmUgZGVzaXJlZCAtIGpqcyAxMi8zMC85OCAqLworCisjZGVmaW5lIElCTVRSX0RFQlVHX01FU1NBR0VTIDAKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaWZkZWYgUENNQ0lBCQkvKiByZXF1aXJlZCBmb3IgaWJtdHJfY3MuYyB0byBidWlsZCAqLworI3VuZGVmIE1PRFVMRQkJLyogeWVzLCByZWFsbHkgKi8KKyN1bmRlZiBFTkFCTEVfUEFHSU5HCisjZWxzZQorI2RlZmluZSBFTkFCTEVfUEFHSU5HIDEJCQorI2VuZGlmCisKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBUUlVFICghRkFMU0UpCisKKy8qIGNoYW5nZXMgdGhlIG91dHB1dCBmb3JtYXQgb2YgZHJpdmVyIGluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIFRSX1ZFUkJPU0UJMAorCisvKiBzb21lIDk1IE9TIHNlbmQgbWFueSBub24gVUkgZnJhbWU7IHRoaXMgYWxsb3cgcmVtb3ZpbmcgdGhlIHdhcm5pbmcgKi8KKyNkZWZpbmUgVFJfRklMVEVSTk9OVUkJMQorCisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2libXRyLmg+CisKKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoIiVzOiAiIGZvcm1hdCwgZGV2LT5uYW1lICwgIyMgYXJncykKKyNkZWZpbmUgRFBSSU5URChmb3JtYXQsIGFyZ3MuLi4pIER1bW15Q2FsbCgiJXM6ICIgZm9ybWF0LCBkZXYtPm5hbWUgLCAjIyBhcmdzKQorCisvKiB2ZXJzaW9uIGFuZCBjcmVkaXRzICovCisjaWZuZGVmIFBDTUNJQQorc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPQorICAgICJcbmlibXRyLmM6IHYxLjMuNTcgICA4LyA3Lzk0IFBldGVyIERlIFNjaHJpanZlciBhbmQgTWFyayBTd2Fuc29uXG4iCisgICAgIiAgICAgICAgIHYyLjEuMTI1IDEwLzIwLzk4IFBhdWwgTm9ydG9uICAgIDxwbm9ydG9uQGllZWUub3JnPlxuIgorICAgICIgICAgICAgICB2Mi4yLjAgICAxMi8zMC85OCBKb2VsIFNsb2FuICAgICA8ampzQGMtbWUuY29tPlxuIgorICAgICIgICAgICAgICB2Mi4yLjEgICAwMi8wOC8wMCBNaWtlIFN1bGxpdmFuICA8c3VsbGl2YW1AdXMuaWJtLmNvbT5cbiIgCisgICAgIiAgICAgICAgIHYyLjIuMiAgIDA3LzI3LzAwIEJ1cnQgU2lsdmVybWFuIDxidXJ0c0B1cy5pYm0uY29tPlxuIiAKKyAgICAiICAgICAgICAgdjIuNC4wICAgMDMvMDEvMDEgTWlrZSBTdWxsaXZhbiA8c3VsbGl2YW5AdXMuaWJtLmNvbT5cbiI7CisjZW5kaWYKKworLyogdGhpcyBhbGxvd3MgZGlzcGxheWluZyBmdWxsIGFkYXB0ZXIgaW5mb3JtYXRpb24gKi8KKworY2hhciAqY2hhbm5lbF9kZWZbXSBfX2RldmluaXRkYXRhID0geyAiSVNBIiwgIk1DQSIsICJJU0EgUCZQIiB9OworCitzdGF0aWMgY2hhciBwY2NoYW5uZWxpZFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJMHgwNSwgMHgwMCwgMHgwNCwgMHgwOSwKKwkweDA0LCAweDAzLCAweDA0LCAweDBmLAorCTB4MDMsIDB4MDYsIDB4MDMsIDB4MDEsCisJMHgwMywgMHgwMSwgMHgwMywgMHgwMCwKKwkweDAzLCAweDA5LCAweDAzLCAweDA5LAorCTB4MDMsIDB4MDAsIDB4MDIsIDB4MDAKK307CisKK3N0YXRpYyBjaGFyIG1jY2hhbm5lbGlkW10gX19kZXZpbml0ZGF0YSA9ICB7CisJMHgwNCwgMHgwZCwgMHgwNCwgMHgwMSwKKwkweDA1LCAweDAyLCAweDA1LCAweDAzLAorCTB4MDMsIDB4MDYsIDB4MDMsIDB4MDMsCisJMHgwNSwgMHgwOCwgMHgwMywgMHgwNCwKKwkweDAzLCAweDA1LCAweDAzLCAweDAxLAorCTB4MDMsIDB4MDgsIDB4MDIsIDB4MDAKK307CisKK2NoYXIgX19kZXZpbml0ICphZGFwdGVyX2RlZihjaGFyIHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAweEY6IHJldHVybiAiUEMgQWRhcHRlciB8IFBDIEFkYXB0ZXIgSUkgfCBBZGFwdGVyL0EiOworCWNhc2UgMHhFOiByZXR1cm4gIjE2LzQgQWRhcHRlciB8IDE2LzQgQWRhcHRlci9BIChsb25nKSI7CisJY2FzZSAweEQ6IHJldHVybiAiMTYvNCBBZGFwdGVyL0EgKHNob3J0KSB8IDE2LzQgSVNBLTE2IEFkYXB0ZXIiOworCWNhc2UgMHhDOiByZXR1cm4gIkF1dG8gMTYvNCBBZGFwdGVyIjsKKwlkZWZhdWx0OiByZXR1cm4gImFkYXB0ZXIgKHVua25vd24gdHlwZSkiOworCX07Cit9OworCisjZGVmaW5lIFRSQ19JTklUIDB4MDEJCS8qICBUcmFjZSBpbml0aWFsaXphdGlvbiAmIFBST0JFcyAqLworI2RlZmluZSBUUkNfSU5JVFYgMHgwMgkJLyogIHZlcmJvc2UgaW5pdCB0cmFjZSBwb2ludHMgICAgICovCit1bnNpZ25lZCBjaGFyIGlibXRyX2RlYnVnX3RyYWNlID0gMDsKKworc3RhdGljIGludCAJaWJtdHJfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CWlibXRyX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdldF9zcmFtX3NpemUoc3RydWN0IHRva19pbmZvICphZGFwdF9pbmZvKTsKK3N0YXRpYyBpbnQgCXRyZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IAl0b2tfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgCXRva19pbml0X2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIAkJdG9rX29wZW5fYWRhcHRlcih1bnNpZ25lZCBsb25nIGRldl9hZGRyKTsKK3N0YXRpYyB2b2lkIAlvcGVuX3NhcCh1bnNpZ25lZCBjaGFyIHR5cGUsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCXRva19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IAl0b2tfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IAl0b2tfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpcnFyZXR1cm5fdCB0b2tfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgCWluaXRpYWxfdG9rX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0cl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0cl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgCQlpYm10cl9yZXNldF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCp0bXIsc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAl0b2tfcmVydW4odW5zaWduZWQgbG9uZyBkZXZfYWRkcik7Cit2b2lkIAkJaWJtdHJfcmVhZGxvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgCW5ldF9kZXZpY2Vfc3RhdHMgKnRva19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgCQlpYm10cl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtdHUpOworc3RhdGljIHZvaWQJZmluZF90dXJib19hZGFwdGVycyhpbnQgKmlvbGlzdCk7CisKK3N0YXRpYyBpbnQgaWJtdHJfcG9ydGxpc3RbSUJNVFJfTUFYX0FEQVBURVJTKzFdIF9fZGV2aW5pdGRhdGEgPSB7CisJMHhhMjAsIDB4YTI0LCAwLCAwLCAwCit9Oworc3RhdGljIGludCBfX2RldmluaXRkYXRhIHR1cmJvX2lvW0lCTVRSX01BWF9BREFQVEVSU10gPSB7MH07CitzdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgdHVyYm9faXJxW0lCTVRSX01BWF9BREFQVEVSU10gPSB7MH07CitzdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgdHVyYm9fc2VhcmNoZWQgPSAwOworCisjaWZuZGVmIFBDTUNJQQorc3RhdGljIF9fdTMyIGlibXRyX21lbV9iYXNlIF9faW5pdGRhdGEgPSAweGQwMDAwOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBQcnRDaGFuSUQoY2hhciAqcGNpZCwgc2hvcnQgc3RyaWRlKQoreworCXNob3J0IGksIGo7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCAyNDsgaSsrLCBqICs9IHN0cmlkZSkKKwkJcHJpbnRrKCIlMXgiLCAoKGludCkgcGNpZFtqXSkgJiAweDBmKTsKKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBIV1BydENoYW5JRCh2b2lkIF9faW9tZW0gKnBjaWQsIHNob3J0IHN0cmlkZSkKK3sKKwlzaG9ydCBpLCBqOworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgMjQ7IGkrKywgaiArPSBzdHJpZGUpCisJCXByaW50aygiJTF4IiwgKChpbnQpIHJlYWRiKHBjaWQgKyBqKSkgJiAweDBmKTsKKwlwcmludGsoIlxuIik7Cit9CisKKy8qIFdlIGhhdmUgdG8gaW9yZW1hcCBldmVyeSBjaGVja2VkIGFkZHJlc3MsIGJlY2F1c2UgaXNhX3JlYWRiIGlzIAorICogZ29pbmcgYXdheS4gCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGZpbmRfdHVyYm9fYWRhcHRlcnMoaW50ICppb2xpc3QpCit7CisJaW50IHJhbV9hZGRyOworCWludCBpbmRleD0wOworCXZvaWQgX19pb21lbSAqY2hhbmlkOworCWludCBmb3VuZF90dXJibz0wOworCXVuc2lnbmVkIGNoYXIgKnRjaGFuaWQsIGN0ZW1wOworCWludCBpLCBqOworCXVuc2lnbmVkIGxvbmcgamlmOworCXZvaWQgX19pb21lbSAqcmFtX21hcHBlZCA7ICAgCisKKwlpZiAodHVyYm9fc2VhcmNoZWQgPT0gMSkgcmV0dXJuOworCXR1cmJvX3NlYXJjaGVkPTE7CisJZm9yIChyYW1fYWRkcj0weEMwMDAwOyByYW1fYWRkciA8IDB4RTAwMDA7IHJhbV9hZGRyKz0weDIwMDApIHsKKworCQlfX3UzMiBpbnRmX3RibD0wOworCisJCWZvdW5kX3R1cmJvPTE7CisJCXJhbV9tYXBwZWQgPSBpb3JlbWFwKCh1MzIpcmFtX2FkZHIsMHgxZmZmKSA7IAorCQlpZiAocmFtX21hcHBlZD09TlVMTCkgCisgCQkJY29udGludWUgOyAKKwkJY2hhbmlkPShDSEFOTkVMX0lEICsgcmFtX21hcHBlZCk7CisJCXRjaGFuaWQ9cGNjaGFubmVsaWQ7CisJCWN0ZW1wPXJlYWRiKGNoYW5pZCkgJiAweDBmOworCQlpZiAoY3RlbXAgIT0gKnRjaGFuaWQpIGNvbnRpbnVlOworCQlmb3IgKGk9MixqPTE7IGk8PTQ2OyBpPWkrMixqKyspIHsKKwkJCWlmICgocmVhZGIoY2hhbmlkK2kpICYgMHgwZikgIT0gdGNoYW5pZFtqXSl7CisJCQkJZm91bmRfdHVyYm89MDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWZvdW5kX3R1cmJvKSBjb250aW51ZTsKKworCQl3cml0ZWIoMHg5MCwgcmFtX21hcHBlZCsweDFFMDEpOworCQlmb3IoaT0yOyBpPDB4MGY7IGkrKykgeworCQkJd3JpdGViKDB4MDAsIHJhbV9tYXBwZWQrMHgxRTAxK2kpOworCQl9CisJCXdyaXRlYigweDAwLCByYW1fbWFwcGVkKzB4MUUwMSk7CisJCWZvcihqaWY9amlmZmllcytUUl9CVVNZX0lOVEVSVkFMOyB0aW1lX2JlZm9yZV9lcShqaWZmaWVzLGppZik7KTsKKwkJaW50Zl90Ymw9bnRvaHMocmVhZHcocmFtX21hcHBlZCtBQ0FfT0ZGU0VUK0FDQV9SVytXUkJSX0VWRU4pKTsKKwkJaWYgKGludGZfdGJsKSB7CisjaWYgSUJNVFJfREVCVUdfTUVTU0FHRVMKKwkJCXByaW50aygiaWJtdHI6OmZpbmRfdHVyYm9fYWRhcHRlcnMsIFR1cmJvIGZvdW5kIGF0ICIKKwkJCQkicmFtX2FkZHIgJXhcbiIscmFtX2FkZHIpOworCQkJcHJpbnRrKCJpYm10cjo6ZmluZF90dXJib19hZGFwdGVycywgaW50ZXJmYWNlX3RhYmxlICIpOworCQkJZm9yKGk9MDsgaTw2OyBpKyspIHsKKwkJCQlwcmludGsoIiV4OiIscmVhZGIocmFtX2FkZHIraW50Zl90YmwraSkpOworCQkJfQorCQkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJCQl0dXJib19pb1tpbmRleF09bnRvaHMocmVhZHcocmFtX21hcHBlZCtpbnRmX3RibCs0KSk7CisJCQl0dXJib19pcnFbaW5kZXhdPXJlYWRiKHJhbV9tYXBwZWQraW50Zl90YmwrMyk7CisJCQlvdXRiKDAsIHR1cmJvX2lvW2luZGV4XSArIEFEQVBUUkVTRVQpOworCQkJZm9yKGppZj1qaWZmaWVzK1RSX1JTVF9USU1FO3RpbWVfYmVmb3JlX2VxKGppZmZpZXMsamlmKTspOworCQkJb3V0YigwLCB0dXJib19pb1tpbmRleF0gKyBBREFQVFJFU0VUUkVMKTsKKwkJCWluZGV4Kys7CisJCQljb250aW51ZTsKKwkJfQorI2lmIElCTVRSX0RFQlVHX01FU1NBR0VTIAorCQlwcmludGsoImlibXRyOjpmaW5kX3R1cmJvX2FkYXB0ZXJzLCBpYm10ciBjYXJkIGZvdW5kIGF0IgorCQkJIiAleCBidXQgbm90IGEgVHVyYm8gbW9kZWxcbiIscmFtX2FkZHIpOworI2VuZGlmCisJaW91bm1hcChyYW1fbWFwcGVkKSA7IAkKKwl9IC8qIGZvciAqLworCWZvcihpPTA7IGk8SUJNVFJfTUFYX0FEQVBURVJTOyBpKyspIHsKKwkJaWYoIXR1cmJvX2lvW2ldKSBicmVhazsKKwkJZm9yIChqPTA7IGo8SUJNVFJfTUFYX0FEQVBURVJTOyBqKyspIHsKKwkJCWlmICggaW9saXN0W2pdICYmIGlvbGlzdFtqXSAhPSB0dXJib19pb1tpXSkgY29udGludWU7CisJCQlpb2xpc3Rbal09dHVyYm9faW9baV07CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaWJtdHJfY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+YmFzZV9hZGRyKSB7CisJCW91dGIoMCxkZXYtPmJhc2VfYWRkcitBREFQVFJFU0VUKTsKKwkJCisJCXNjaGVkdWxlX3RpbWVvdXQoVFJfUlNUX1RJTUUpOyAvKiB3YWl0IDUwbXMgKi8KKworCQlvdXRiKDAsZGV2LT5iYXNlX2FkZHIrQURBUFRSRVNFVFJFTCk7CisJfQorCisjaWZuZGVmIFBDTUNJQQorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBJQk1UUl9JT19FWFRFTlQpOworCisJeyAKKwkJc3RydWN0IHRva19pbmZvICp0aSA9IChzdHJ1Y3QgdG9rX2luZm8gKikgZGV2LT5wcml2OworCQlpb3VubWFwKHRpLT5tbWlvKTsKKwkJaW91bm1hcCh0aS0+c3JhbV92aXJ0KTsKKwl9CisjZW5kaWYJCQorfQorCitpbnQgaWJtdHJfcHJvYmVfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBlcnIgPSBpYm10cl9wcm9iZShkZXYpOworCWlmICghZXJyKSB7CisJCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCQlpZiAoZXJyKQorCQkJaWJtdHJfY2xlYW51cF9jYXJkKGRldik7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglpYm10cl9wcm9iZSgpOiAgUm91dGluZSBzcGVjaWZpZWQgaW4gdGhlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICoJdG8gcHJvYmUgZm9yIGFuIElCTSBUb2tlbiBSaW5nIEFkYXB0ZXIuICBSb3V0aW5lIG91dGxpbmU6CisgKglJLiAgICBJbnRlcnJvZ2F0ZSBoYXJkd2FyZSB0byBkZXRlcm1pbmUgaWYgYW4gYWRhcHRlciBleGlzdHMKKyAqCSAgICAgIGFuZCB3aGF0IHRoZSBzcGVlZHMgYW5kIGZlZWRzIGFyZQorICoJSUkuICAgU2V0dXAgZGF0YSBzdHJ1Y3R1cmVzIHRvIGNvbnRyb2wgZXhlY3V0aW9uIGJhc2VkIHVwb24KKyAqCSAgICAgIGFkYXB0ZXIgY2hhcmFjdGVyaXN0aWNzLgorICoKKyAqCVdlIGV4cGVjdCBpYm10cl9wcm9iZSB0byBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBkZXZpY2UgZW50cnkKKyAqCXdoaWNoIHJlZmVyZW5jZXMgaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBpYm10cl9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCWludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmIChiYXNlX2FkZHIgJiYgYmFzZV9hZGRyIDw9IDB4MWZmKSAvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisJaWYgKGJhc2VfYWRkciA+IDB4MWZmKSB7IC8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gICovCisJCWlmICghaWJtdHJfcHJvYmUxKGRldiwgYmFzZV9hZGRyKSkgcmV0dXJuIDA7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlmaW5kX3R1cmJvX2FkYXB0ZXJzKGlibXRyX3BvcnRsaXN0KTsKKwlmb3IgKGkgPSAwOyBpYm10cl9wb3J0bGlzdFtpXTsgaSsrKSB7CisJCWludCBpb2FkZHIgPSBpYm10cl9wb3J0bGlzdFtpXTsKKworCQlpZiAoIWlibXRyX3Byb2JlMShkZXYsIGlvYWRkcikpIHJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpYm10cl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IFBJT2FkZHIpCit7CisKKwl1bnNpZ25lZCBjaGFyIHNlZ21lbnQsIGludHI9MCwgaXJxPTAsIGksIGosIGNhcmRwcmVzZW50PU5PVE9LLCB0ZW1wPTA7CisJdm9pZCBfX2lvbWVtICogdF9tbWlvID0gTlVMTDsKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqY2RfY2hhbmlkOworCXVuc2lnbmVkIGNoYXIgKnRjaGFuaWQsIGN0ZW1wOworI2lmbmRlZiBQQ01DSUEKKwl1bnNpZ25lZCBjaGFyIHRfaXJxPTA7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlzdGF0aWMgaW50IHZlcnNpb25fcHJpbnRlZDsKKyNlbmRpZgorCisJLyogICAgUXVlcnkgdGhlIGFkYXB0ZXIgUElPIGJhc2UgcG9ydCB3aGljaCB3aWxsIHJldHVybgorCSAqICAgIGluZGljYXRpb24gb2Ygd2hlcmUgTU1JTyB3YXMgcGxhY2VkLiBXZSBhbHNvIGhhdmUgYQorCSAqICAgIGNvZGVkIGludGVycnVwdCBudW1iZXIuCisJICovCisJc2VnbWVudCA9IGluYihQSU9hZGRyKTsKKwlpZiAoc2VnbWVudCA8IDB4NDAgfHwgc2VnbWVudCA+IDB4ZTApIHsKKwkJLyogT3V0IG9mIHJhbmdlIHZhbHVlcyBzbyB3ZSdsbCBhc3N1bWUgbm9uLWV4aXN0ZW50IElPIGRldmljZQorCQkgKiBidXQgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgYSBwcm9ibGVtLCBlc3AgaWYgYSB0dXJibworCQkgKiBhZGFwdGVyIGlzIGJlaW5nIHVzZWQuICAqLworI2lmIElCTVRSX0RFQlVHX01FU1NBR0VTCisJCURQUklOVEsoImlibXRyX3Byb2JlMSgpOiB1bmhhcHB5IHRoYXQgaW5iKDB4JVgpID09IDB4JVgsICIKKwkJCSJIYXJkd2FyZSBQcm9ibGVtP1xuIixQSU9hZGRyLHNlZ21lbnQpOworI2VuZGlmCisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKgorCSAqICAgIENvbXB1dGUgdGhlIGxpbmVhciBiYXNlIGFkZHJlc3Mgb2YgdGhlIE1NSU8gYXJlYQorCSAqICAgIGFzIExJTlVYIGRvZXNuJ3QgY2FyZSBhYm91dCBzZWdtZW50cworCSAqLworCXRfbW1pbyA9IGlvcmVtYXAoKChfX3UzMikgKHNlZ21lbnQgJiAweGZjKSA8PCAxMSkgKyAweDgwMDAwLDIwNDgpOworCWlmICghdF9tbWlvKSB7IAorCQlEUFJJTlRLKCJDYW5ub3QgcmVtYXAgbW1pb2Jhc2UgbWVtb3J5IGFyZWEiKSA7IAorCQlyZXR1cm4gLUVOT0RFViA7IAorCX0gCisJaW50ciA9IHNlZ21lbnQgJiAweDAzOwkvKiBsb3cgYml0cyBpcyBjb2RlZCBpbnRlcnJ1cHQgIyAqLworCWlmIChpYm10cl9kZWJ1Z190cmFjZSAmIFRSQ19JTklUKQorCQlEUFJJTlRLKCJQSU9hZGRyOiAlNGh4IHNlZy9pbnRyOiAlMnggbW1pbyBiYXNlOiAlcCBpbnRyOiAlZFxuIgorCQkJCSwgUElPYWRkciwgKGludCkgc2VnbWVudCwgdF9tbWlvLCAoaW50KSBpbnRyKTsKKworCS8qCisJICogICAgTm93IHdlIHdpbGwgY29tcGFyZSBleHBlY3RlZCAnY2hhbm5lbGlkJyBzdHJpbmdzIHdpdGgKKwkgKiAgICB3aGF0IHdlIGlzIHRoZXJlIHRvIGxlYXJuIG9mIElTQS9NQ0Egb3Igbm90IFRSIGNhcmQKKwkgKi8KKyNpZmRlZiBQQ01DSUEKKwlpb3VubWFwKHRfbW1pbyk7CisJdF9tbWlvID0gdGktPm1taW87CS8qQk1TIHRvIGdldCB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlpcnEgPSB0aS0+aXJxOwkJLypCTVMgdG8gZGlzcGxheSB0aGUgaXJxISAgICovCisjZW5kaWYKKwljZF9jaGFuaWQgPSAoQ0hBTk5FTF9JRCArIHRfbW1pbyk7CS8qIGZvciBlZmZpY2llbmN5ICovCisJdGNoYW5pZCA9IHBjY2hhbm5lbGlkOworCWNhcmRwcmVzZW50ID0gVFJfSVNBOwkvKiB0cnkgSVNBICovCisKKwkvKiAgICBTdWJvcHRpbWl6ZSBrbm93aW5nIGZpcnN0IGJ5dGUgZGlmZmVyZW50ICovCisJY3RlbXAgPSByZWFkYihjZF9jaGFuaWQpICYgMHgwZjsKKwlpZiAoY3RlbXAgIT0gKnRjaGFuaWQpIHsJLyogTk9UIElTQSBjYXJkLCB0cnkgTUNBICovCisJCXRjaGFuaWQgPSBtY2NoYW5uZWxpZDsKKwkJY2FyZHByZXNlbnQgPSBUUl9NQ0E7CisJCWlmIChjdGVtcCAhPSAqdGNoYW5pZCkJLyogTmVpdGhlciBJU0Egbm9yIE1DQSAqLworCQkJY2FyZHByZXNlbnQgPSBOT1RPSzsKKwl9CisJaWYgKGNhcmRwcmVzZW50ICE9IE5PVE9LKSB7CisJCS8qICAgICAgIEtub3cgcHJlc3VtZWQgdHlwZSwgdHJ5IHJlc3Qgb2YgSUQgKi8KKwkJZm9yIChpID0gMiwgaiA9IDE7IGkgPD0gNDY7IGkgPSBpICsgMiwgaisrKSB7CisJCQlpZiggKHJlYWRiKGNkX2NoYW5pZCtpKSYweDBmKSA9PSB0Y2hhbmlkW2pdKSBjb250aW51ZTsKKwkJCS8qIG1hdGNoIGZhaWxlZCwgbm90IFRSIGNhcmQgKi8KKwkJCWNhcmRwcmVzZW50ID0gTk9UT0s7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiAKKwkgKiAgICBJZiB3ZSBoYXZlIGFuIElTQSBib2FyZCBjaGVjayBmb3IgdGhlIElTQSBQJlAgdmVyc2lvbiwKKwkgKiAgICBhcyBpdCBoYXMgZGlmZmVyZW50IElSUSBzZXR0aW5ncyAKKwkgKi8KKwlpZiAoY2FyZHByZXNlbnQgPT0gVFJfSVNBICYmIChyZWFkYihBSVBGSUQgKyB0X21taW8pID09IDB4MGUpKQorCQljYXJkcHJlc2VudCA9IFRSX0lTQVBOUDsKKwlpZiAoY2FyZHByZXNlbnQgPT0gTk9UT0spIHsJLyogImNoYW5uZWxfaWQiIGRpZCBub3QgbWF0Y2gsIHJlcG9ydCAqLworCQlpZiAoIShpYm10cl9kZWJ1Z190cmFjZSAmIFRSQ19JTklUKSkgeworI2lmbmRlZiBQQ01DSUEKKwkJCWlvdW5tYXAodF9tbWlvKTsKKyNlbmRpZgorCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJRFBSSU5USyggIkNoYW5uZWwgSUQgc3RyaW5nIG5vdCBmb3VuZCBmb3IgUElPYWRkcjogJTRoeFxuIiwKKwkJCQkJCQkJUElPYWRkcik7CisJCURQUklOVEsoIkV4cGVjdGVkIGZvciBJU0E6ICIpOworCQlQcnRDaGFuSUQocGNjaGFubmVsaWQsIDEpOworCQlEUFJJTlRLKCIgICAgICAgICAgIGZvdW5kOiAiKTsKKy8qIEJNUyBOb3RlIHRoYXQgdGhpcyBjYW4gYmUgbWlzbGVhZGluZywgd2hlbiBoYXJkd2FyZSBpcyBmbGFreSwgYmVjYXVzZSB5b3UKKyAgIGFyZSByZWFkaW5nIGl0IGEgc2Vjb25kIHRpbWUgaGVyZS4gU28gd2l0aCBteSBmbGFreSBoYXJkd2FyZSwgSSdsbCBzZWUgbXktCisgICBzZWxmIGluIHRoaXMgYmxvY2ssIHdpdGggdGhlIEhXIElEIG1hdGNoaW5nIHRoZSBJU0EgSUQgZXhhY3RseSEgKi8KKwkJSFdQcnRDaGFuSUQoY2RfY2hhbmlkLCAyKTsKKwkJRFBSSU5USygiRXhwZWN0ZWQgZm9yIE1DQTogIik7CisJCVBydENoYW5JRChtY2NoYW5uZWxpZCwgMSk7CisJfQorCS8qIE5vdywgc2V0dXAgc29tZSBvZiB0aGUgcGwwIGJ1ZmZlcnMgZm9yIHRoaXMgZHJpdmVyLi4gKi8KKwkvKiBJZiBjYWxsZWQgZnJvbSBQQ01DSUEsIGl0IGlzIGFscmVhZHkgc2V0IHVwLCBzbyBubyBuZWVkIHRvIAorCSAgIHdhc3RlIHRoZSBtZW1vcnksIGp1c3QgdXNlIHRoZSBleGlzdGluZyBzdHJ1Y3R1cmUgKi8KKyNpZm5kZWYgUENNQ0lBCisJdGktPm1taW8gPSB0X21taW87CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBJQk1UUl9NQVhfQURBUFRFUlM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0dXJib19pb1tpXSAhPSBQSU9hZGRyKQorCQkJY29udGludWU7CisjaWYgSUJNVFJfREVCVUdfTUVTU0FHRVMgCisJCXByaW50aygiaWJtdHI6OnRyX3Byb2JlMSwgc2V0dGluZyBQSU9hZGRyICV4IHRvIFR1cmJvXG4iLAorCQkgICAgICAgUElPYWRkcik7CisjZW5kaWYKKwkJdGktPnR1cmJvID0gMTsKKwkJdF9pcnEgPSB0dXJib19pcnFbaV07CisgICAgICAgIH0KKyNlbmRpZiAvKiAhUENNQ0lBICovCisJdGktPnJlYWRsb2dfcGVuZGluZyA9IDA7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdGktPndhaXRfZm9yX3Jlc2V0KTsKKworCS8qIGlmIFBDTUNJQSwgdGhlIGNhcmQgY2FuIGJlIHJlY29nbml6ZWQgYXMgZWl0aGVyIFRSX0lTQSBvciBUUl9JU0FQTlAKKwkgKiBkZXBlbmRpbmcgd2hpY2ggY2FyZCBpcyBpbnNlcnRlZC4JKi8KKwkKKyNpZm5kZWYgUENNQ0lBCisJc3dpdGNoIChjYXJkcHJlc2VudCkgeworCWNhc2UgVFJfSVNBOgorCQlpZiAoaW50ciA9PSAwKSBpcnEgPSA5OwkvKiBpcnEyIHJlYWxseSBpcyBpcnE5ICovCisJCWlmIChpbnRyID09IDEpIGlycSA9IDM7CisJCWlmIChpbnRyID09IDIpIGlycSA9IDY7CisJCWlmIChpbnRyID09IDMpIGlycSA9IDc7CisJCXRpLT5hZGFwdGVyX2ludF9lbmFibGUgPSBQSU9hZGRyICsgQURBUFRJTlRSRUw7CisJCWJyZWFrOworCWNhc2UgVFJfTUNBOgorCQlpZiAoaW50ciA9PSAwKSBpcnEgPSA5OworCQlpZiAoaW50ciA9PSAxKSBpcnEgPSAzOworCQlpZiAoaW50ciA9PSAyKSBpcnEgPSAxMDsKKwkJaWYgKGludHIgPT0gMykgaXJxID0gMTE7CisJCXRpLT5nbG9iYWxfaW50X2VuYWJsZSA9IDA7CisJCXRpLT5hZGFwdGVyX2ludF9lbmFibGUgPSAwOworCQl0aS0+c3JhbV9waHlzPShfX3UzMikoaW5iKFBJT2FkZHIrQURBUFRSRVNFVFJFTCkgJiAweGZlKSA8PCAxMjsKKwkJYnJlYWs7CisJY2FzZSBUUl9JU0FQTlA6CisJCWlmICghdF9pcnEpIHsKKwkJCWlmIChpbnRyID09IDApIGlycSA9IDk7CisJCQlpZiAoaW50ciA9PSAxKSBpcnEgPSAzOworCQkJaWYgKGludHIgPT0gMikgaXJxID0gMTA7CisJCQlpZiAoaW50ciA9PSAzKSBpcnEgPSAxMTsKKwkJfSBlbHNlCisJCQlpcnE9dF9pcnE7CisJCXRpbWVvdXQgPSBqaWZmaWVzICsgVFJfU1BJTl9JTlRFUlZBTDsKKwkJd2hpbGUgKCFyZWFkYih0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUlcgKyBSUlJfRVZFTikpeworCQkJaWYgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSBjb250aW51ZTsKKwkJCURQUklOVEsoICJIYXJkd2FyZSB0aW1lb3V0IGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiIpOworCQkJaW91bm1hcCh0X21taW8pOworCQkJa2ZyZWUodGkpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJdGktPnNyYW1fcGh5cyA9CisJCSAgICAgKChfX3UzMilyZWFkYih0aS0+bW1pbytBQ0FfT0ZGU0VUK0FDQV9SVytSUlJfRVZFTik8PDEyKTsKKwkJdGktPmFkYXB0ZXJfaW50X2VuYWJsZSA9IFBJT2FkZHIgKyBBREFQVElOVFJFTDsKKwkJYnJlYWs7CisJfSAvKmVuZCBzd2l0Y2ggKGNhcmRwcmVzZW50KSAqLworI2VuZGlmCS8qbm90IFBDTUNJQSAqLworCisJaWYgKGlibXRyX2RlYnVnX3RyYWNlICYgVFJDX0lOSVQpIHsJLyoganVzdCByZXBvcnQgaW50ICovCisJCURQUklOVEsoImlycT0lZCIsIGlycSk7CisJCXByaW50aygiLCBzcmFtX3BoeXM9MHgleCIsIHRpLT5zcmFtX3BoeXMpOworCQlpZihpYm10cl9kZWJ1Z190cmFjZSZUUkNfSU5JVFYpeyAvKiBmdWxsIGNoYXQgaW4gdmVyYm9zZSBvbmx5ICovCisJCQlEUFJJTlRLKCIsIHRpLT5tbWlvPSVwIiwgdGktPm1taW8pOworCQkJcHJpbnRrKCIsIHNlZ21lbnQ9JTAyWCIsIHNlZ21lbnQpOworCQl9CisJCXByaW50aygiLlxuIik7CisJfQorCisJLyogR2V0IGh3IGFkZHJlc3Mgb2YgdG9rZW4gcmluZyBjYXJkICovCisJaiA9IDA7CisJZm9yIChpID0gMDsgaSA8IDB4MTg7IGkgPSBpICsgMikgeworCQkvKiB0ZWNobmljYWwgcmVmZXJlbmNlIHN0YXRlcyB0byBkbyB0aGlzICovCisJCXRlbXAgPSByZWFkYih0aS0+bW1pbyArIEFJUCArIGkpICYgMHgwZjsKKwkJdGktPmh3X2FkZHJlc3Nbal0gPSB0ZW1wOworCQlpZiAoaiAmIDEpCisJCQlkZXYtPmRldl9hZGRyWyhqIC8gMildID0KKwkJCQl0aS0+aHdfYWRkcmVzc1tqXSsgKHRpLT5od19hZGRyZXNzW2ogLSAxXSA8PCA0KTsKKwkJKytqOworCX0KKwkvKiBnZXQgQWRhcHRlciB0eXBlOiAgJ0YnID0gQWRhcHRlci9BLCAnRScgPSAxNi80IEFkYXB0ZXIgSUksLi4uICovCisJdGktPmFkYXB0ZXJfdHlwZSA9IHJlYWRiKHRpLT5tbWlvICsgQUlQQURBUFRZUEUpOworCisJLyogZ2V0IERhdGEgUmF0ZTogIEY9NE1iLCBFPTE2TWIsIEQ9NE1iICYgMTZNYiA/PyAqLworCXRpLT5kYXRhX3JhdGUgPSByZWFkYih0aS0+bW1pbyArIEFJUERBVEFSQVRFKTsKKworCS8qIEdldCBFYXJseSBUb2tlbiBSZWxlYXNlIHN1cHBvcnQ/OiBGPW5vLCBFPTRNYiwgRD0xNk1iLCBDPTQmMTZNYiAqLworCXRpLT50b2tlbl9yZWxlYXNlID0gcmVhZGIodGktPm1taW8gKyBBSVBFQVJMWVRPS0VOKTsKKworCS8qIEhvdyBtdWNoIHNoYXJlZCBSQU0gaXMgb24gYWRhcHRlciA/ICovCisJaWYgKHRpLT50dXJibykgeworCQl0aS0+YXZhaWxfc2hhcmVkX3JhbT0xMjc7CisJfSBlbHNlIHsKKwkJdGktPmF2YWlsX3NoYXJlZF9yYW0gPSBnZXRfc3JhbV9zaXplKHRpKTsvKmluIDUxMiBieXRlIHVuaXRzICovCisJfQorCS8qIFdlIG5lZWQgdG8gc2V0IG9yIGRvIGEgYnVuY2ggb2Ygd29yayBoZXJlIGJhc2VkIG9uIHByZXZpb3VzIHJlc3VsdHMqLworCS8qIFN1cHBvcnQgcGFnaW5nPyAgV2hhdCBzaXplcz86ICBGPW5vLCBFPTE2aywgRD0zMmssIEM9MTYgJiAzMmsgKi8KKwl0aS0+c2hhcmVkX3JhbV9wYWdpbmcgPSByZWFkYih0aS0+bW1pbyArIEFJUFNIUkFNUEFHRSk7CisKKwkvKiBBdmFpbGFibGUgREhCICA0TWIgc2l6ZTogICBGPTIwNDgsIEU9NDA5NiwgRD00NDY0ICovCisJc3dpdGNoIChyZWFkYih0aS0+bW1pbyArIEFJUDRNQkRIQikpIHsKKwljYXNlIDB4ZTogdGktPmRoYl9zaXplNG1iID0gNDA5NjsgYnJlYWs7CisJY2FzZSAweGQ6IHRpLT5kaGJfc2l6ZTRtYiA9IDQ0NjQ7IGJyZWFrOworCWRlZmF1bHQ6ICB0aS0+ZGhiX3NpemU0bWIgPSAyMDQ4OyBicmVhazsKKwl9CisKKwkvKiBBdmFpbGFibGUgREhCIDE2TWIgc2l6ZTogIEY9MjA0OCwgRT00MDk2LCBEPTgxOTIsIEM9MTYzODQsIEI9MTc5NjAgKi8KKwlzd2l0Y2ggKHJlYWRiKHRpLT5tbWlvICsgQUlQMTZNQkRIQikpIHsKKwljYXNlIDB4ZTogdGktPmRoYl9zaXplMTZtYiA9IDQwOTY7IGJyZWFrOworCWNhc2UgMHhkOiB0aS0+ZGhiX3NpemUxNm1iID0gODE5MjsgYnJlYWs7CisJY2FzZSAweGM6IHRpLT5kaGJfc2l6ZTE2bWIgPSAxNjM4NDsgYnJlYWs7CisJY2FzZSAweGI6IHRpLT5kaGJfc2l6ZTE2bWIgPSAxNzk2MDsgYnJlYWs7CisJZGVmYXVsdDogIHRpLT5kaGJfc2l6ZTE2bWIgPSAyMDQ4OyBicmVhazsKKwl9CisKKwkvKiAgICBXZSBtdXN0IGZpZ3VyZSBvdXQgaG93IG11Y2ggc2hhcmVkIG1lbW9yeSBzcGFjZSB0aGlzIGFkYXB0ZXIKKwkgKiAgICB3aWxsIG9jY3VweSBzbyB0aGF0IGlmIHRoZXJlIGFyZSB0d28gYWRhcHRlcnMgd2UgY2FuIGZpdCBib3RoCisJICogICAgaW4uICBHaXZlbiBhIGNob2ljZSwgd2Ugd2lsbCBsaW1pdCB0aGlzIGFkYXB0ZXIgdG8gMzJLLiAgVGhlCisJICogICAgbWF4aW11bSBzcGFjZSB3aWxsIHdpbGwgdXNlIGZvciB0d28gYWRhcHRlcnMgaXMgNjRLIHNvIGlmIHRoZQorCSAqICAgIGFkYXB0ZXIgd2UgYXJlIHdvcmtpbmcgb24gZGVtYW5kcyA2NEsgKGl0IGFsc28gZG9lc24ndCBzdXBwb3J0CisJICogICAgcGFnaW5nKSwgdGhlbiBvbmx5IG9uZSBhZGFwdGVyIGNhbiBiZSBzdXBwb3J0ZWQuICAKKwkgKi8KKworCS8qCisJICogICAgZGV0ZXJtaW5lIGhvdyBtdWNoIG9mIHRvdGFsIFJBTSBpcyBtYXBwZWQgaW50byBQQyBzcGFjZSAKKwkgKi8KKwl0aS0+bWFwcGVkX3JhbV9zaXplPSAvKnNpeHRlZW4gdG8gb25laHVuZHJlZHR3ZW50eWVpZ2h0IDUxMmJ5dGUgYmxvY2tzKi8KKwkgICAgMTw8ICgocmVhZGIodGktPm1taW8rQUNBX09GRlNFVCtBQ0FfUlcrUlJSX09ERCkgPj4gMiAmIDB4MDMpICsgNCk7CisJdGktPnBhZ2VfbWFzayA9IDA7CisJaWYgKHRpLT50dXJibykgIHRpLT5wYWdlX21hc2s9MHhmMDsKKwllbHNlIGlmICh0aS0+c2hhcmVkX3JhbV9wYWdpbmcgPT0gMHhmKTsgIC8qIE5vIHBhZ2luZyBpbiBhZGFwdGVyICovCisJZWxzZSB7CisjaWZkZWYgRU5BQkxFX1BBR0lORworCQl1bnNpZ25lZCBjaGFyIHBnX3NpemUgPSAwOworCQkvKiBCTVM6ICAgcGFnZSBzaXplOiBQQ01DSUEsIHVzZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyOworCQkgICBJU0FQTlAsIHVzZSBMQU5BSURDIGNvbmZpZyB0b29sIGZyb20gd3d3LmlibS5jb20gICovCisJCXN3aXRjaCAodGktPnNoYXJlZF9yYW1fcGFnaW5nKSB7CisJCWNhc2UgMHhmOgorCQkJYnJlYWs7CisJCWNhc2UgMHhlOgorCQkJdGktPnBhZ2VfbWFzayA9ICh0aS0+bWFwcGVkX3JhbV9zaXplID09IDMyKSA/IDB4YzAgOiAwOworCQkJcGdfc2l6ZSA9IDMyOwkvKiAxNktCIHBhZ2Ugc2l6ZSAqLworCQkJYnJlYWs7CisJCWNhc2UgMHhkOgorCQkJdGktPnBhZ2VfbWFzayA9ICh0aS0+bWFwcGVkX3JhbV9zaXplID09IDY0KSA/IDB4ODAgOiAwOworCQkJcGdfc2l6ZSA9IDY0OwkvKiAzMktCIHBhZ2Ugc2l6ZSAqLworCQkJYnJlYWs7CisJCWNhc2UgMHhjOgorCQkJc3dpdGNoICh0aS0+bWFwcGVkX3JhbV9zaXplKSB7CisJCQljYXNlIDMyOgorCQkJCXRpLT5wYWdlX21hc2sgPSAweGMwOworCQkJCXBnX3NpemUgPSAzMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgNjQ6CisJCQkJdGktPnBhZ2VfbWFzayA9IDB4ODA7CisJCQkJcGdfc2l6ZSA9IDY0OworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUFJJTlRLKCJVbmtub3duIHNoYXJlZCByYW0gcGFnaW5nIGluZm8gJTAxWFxuIiwKKwkJCQkJCQl0aS0+c2hhcmVkX3JhbV9wYWdpbmcpOworCQkJaW91bm1hcCh0X21taW8pOyAKKwkJCWtmcmVlKHRpKTsKKwkJCXJldHVybiAtRU5PREVWOworCQkJYnJlYWs7CisJCX0gLyplbmQgc3dpdGNoIHNoYXJlZF9yYW1fcGFnaW5nICovCisKKwkJaWYgKGlibXRyX2RlYnVnX3RyYWNlICYgVFJDX0lOSVQpCisJCQlEUFJJTlRLKCJTaGFyZWQgUkFNIHBhZ2luZyBjb2RlOiAlMDJYLCAiCisJCQkJIm1hcHBlZCBSQU0gc2l6ZTogJWRLLCBzaGFyZWQgUkFNIHNpemU6ICVkSywgIgorCQkJCSJwYWdlIG1hc2s6ICUwMlhcbjoiLAorCQkJCXRpLT5zaGFyZWRfcmFtX3BhZ2luZywgdGktPm1hcHBlZF9yYW1fc2l6ZSAvIDIsCisJCQkJdGktPmF2YWlsX3NoYXJlZF9yYW0gLyAyLCB0aS0+cGFnZV9tYXNrKTsKKyNlbmRpZgkvKkVOQUJMRV9QQUdJTkcgKi8KKwl9CisKKyNpZm5kZWYgUENNQ0lBCisJLyogZmluaXNoIGZpZ3VyaW5nIHRoZSBzaGFyZWQgUkFNIGFkZHJlc3MgKi8KKwlpZiAoY2FyZHByZXNlbnQgPT0gVFJfSVNBKSB7CisJCXN0YXRpYyBfX3UzMiByYW1fYm5kcnlfbWFza1tdID0KKwkJCXsgMHhmZmZmZTAwMCwgMHhmZmZmYzAwMCwgMHhmZmZmODAwMCwgMHhmZmZmMDAwMCB9OworCQlfX3UzMiBuZXdfYmFzZSwgcnJyXzMyLCBjaGtfYmFzZSwgcmJtOworCisJCXJycl8zMj1yZWFkYih0aS0+bW1pbytBQ0FfT0ZGU0VUK0FDQV9SVytSUlJfT0REKSA+PiAyICYgMHgwMzsKKwkJcmJtID0gcmFtX2JuZHJ5X21hc2tbcnJyXzMyXTsKKwkJbmV3X2Jhc2UgPSAoaWJtdHJfbWVtX2Jhc2UgKyAofnJibSkpICYgcmJtOy8qIHVwIHRvIGJvdW5kYXJ5ICovCisJCWNoa19iYXNlID0gbmV3X2Jhc2UgKyAodGktPm1hcHBlZF9yYW1fc2l6ZSA8PCA5KTsKKwkJaWYgKGNoa19iYXNlID4gKGlibXRyX21lbV9iYXNlICsgSUJNVFJfU0hBUkVEX1JBTV9TSVpFKSkgeworCQkJRFBSSU5USygiU2hhcmVkIFJBTSBmb3IgdGhpcyBhZGFwdGVyICglMDV4KSBleGNlZWRzICIKKwkJCSJkcml2ZXIgbGltaXQgKCUwNXgpLCBhZGFwdGVyIG5vdCBzdGFydGVkLlxuIiwKKwkJCWNoa19iYXNlLCBpYm10cl9tZW1fYmFzZSArIElCTVRSX1NIQVJFRF9SQU1fU0laRSk7CisJCQlpb3VubWFwKHRfbW1pbyk7CisJCQlrZnJlZSh0aSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfSBlbHNlIHsgLyogc2VlbXMgY29vbCwgcmVjb3JkIHdoYXQgd2UgaGF2ZSBmaWd1cmVkIG91dCAqLworCQkJdGktPnNyYW1fYmFzZSA9IG5ld19iYXNlID4+IDEyOworCQkJaWJtdHJfbWVtX2Jhc2UgPSBjaGtfYmFzZTsKKwkJfQorCX0KKwllbHNlICB0aS0+c3JhbV9iYXNlID0gdGktPnNyYW1fcGh5cyA+PiAxMjsKKworCS8qIFRoZSBQQ01DSUEgaGFzIGFscmVhZHkgZ290IHRoZSBpbnRlcnJ1cHQgbGluZSBhbmQgdGhlIGlvIHBvcnQsIAorCSAgIHNvIG5vIGNoYW5jZSBvZiBhbnlib2R5IGVsc2UgZ2V0dGluZyBpdCAtIE1MUCAqLworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSA9IGlycSwgJnRva19pbnRlcnJ1cHQsIDAsICJpYm10ciIsIGRldikgIT0gMCkgeworCQlEUFJJTlRLKCJDb3VsZCBub3QgZ3JhYiBpcnEgJWQuICBIYWx0aW5nIFRva2VuIFJpbmcgZHJpdmVyLlxuIiwKKwkJCQkJaXJxKTsKKwkJaW91bm1hcCh0X21taW8pOworCQlrZnJlZSh0aSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKj8/IE5vdywgYWxsb2NhdGUgc29tZSBvZiB0aGUgUElPIFBPUlRzIGZvciB0aGlzIGRyaXZlci4uICovCisJLyogcmVjb3JkIFBJT2FkZHIgcmFuZ2UgYXMgYnVzeSAqLworCWlmICghcmVxdWVzdF9yZWdpb24oUElPYWRkciwgSUJNVFJfSU9fRVhURU5ULCAiaWJtdHIiKSkgeworCQlEUFJJTlRLKCJDb3VsZCBub3QgZ3JhYiBQSU8gcmFuZ2UuIEhhbHRpbmcgZHJpdmVyLlxuIik7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlpb3VubWFwKHRfbW1pbyk7CisJCWtmcmVlKHRpKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoIXZlcnNpb25fcHJpbnRlZCsrKSB7CisJCXByaW50ayh2ZXJzaW9uKTsKKwl9CisjZW5kaWYgLyogIVBDTUNJQSAqLworCURQUklOVEsoIiVzICVzIGZvdW5kXG4iLAorCQljaGFubmVsX2RlZltjYXJkcHJlc2VudCAtIDFdLCBhZGFwdGVyX2RlZih0aS0+YWRhcHRlcl90eXBlKSk7CisJRFBSSU5USygidXNpbmcgaXJxICVkLCBQSU9hZGRyICVoeCwgJWRLIHNoYXJlZCBSQU0uXG4iLAorCQkJaXJxLCBQSU9hZGRyLCB0aS0+bWFwcGVkX3JhbV9zaXplIC8gMik7CisJRFBSSU5USygiSGFyZHdhcmUgYWRkcmVzcyA6ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCQlkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCQlkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdKTsKKwlpZiAodGktPnBhZ2VfbWFzaykKKwkJRFBSSU5USygiU2hhcmVkIFJBTSBwYWdpbmcgZW5hYmxlZC4gIgorCQkJIlBhZ2Ugc2l6ZTogJXVLIFNoYXJlZCBSYW0gc2l6ZSAlZEtcbiIsCisJCQkoKHRpLT5wYWdlX21hc2teMHhmZikrMSkgPj4yLCB0aS0+YXZhaWxfc2hhcmVkX3JhbSAvIDIpOworCWVsc2UKKwkJRFBSSU5USygiU2hhcmVkIFJBTSBwYWdpbmcgZGlzYWJsZWQuIHRpLT5wYWdlX21hc2sgJXhcbiIsCisJCQkJCQkJCXRpLT5wYWdlX21hc2spOworCisJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIERIQiB3ZSBjYW4gdXNlICovCisJLyogdHdvIGNhc2VzIHdoZXJlIGF2YWlsX3NoYXJlZF9yYW0gZG9lc24ndCBlcXVhbCBtYXBwZWRfcmFtX3NpemU6CisJICAgIDEuIGF2YWlsX3NoYXJlZF9yYW0gaXMgMTI3IGJ1dCBtYXBwZWRfcmFtX3NpemUgaXMgMTI4ICh0eXBpY2FsKQorCSAgICAyLiB1c2VyIGhhcyBjb25maWd1cmVkIGFkYXB0ZXIgZm9yIGxlc3MgdGhhbiBhdmFpbF9zaGFyZWRfcmFtCisJICAgICAgIGJ1dCBpcyBub3QgdXNpbmcgcGFnaW5nIChzaGUgc2hvdWxkIHVzZSBwYWdpbmcsIEkgYmVsaWV2ZSkKKwkqLworCWlmICghdGktPnBhZ2VfbWFzaykgeworCQl0aS0+YXZhaWxfc2hhcmVkX3JhbT0KKwkJCQltaW4odGktPm1hcHBlZF9yYW1fc2l6ZSx0aS0+YXZhaWxfc2hhcmVkX3JhbSk7CisJfQorCisJc3dpdGNoICh0aS0+YXZhaWxfc2hhcmVkX3JhbSkgeworCWNhc2UgMTY6CQkvKiA4S0Igc2hhcmVkIFJBTSAqLworCQl0aS0+ZGhiX3NpemU0bWIgPSBtaW4odGktPmRoYl9zaXplNG1iLCAodW5zaWduZWQgc2hvcnQpMjA0OCk7CisJCXRpLT5yYnVmX2xlbjQgPSAxMDMyOworCQl0aS0+cmJ1Zl9jbnQ0PTI7CisJCXRpLT5kaGJfc2l6ZTE2bWIgPSBtaW4odGktPmRoYl9zaXplMTZtYiwgKHVuc2lnbmVkIHNob3J0KTIwNDgpOworCQl0aS0+cmJ1Zl9sZW4xNiA9IDEwMzI7CisJCXRpLT5yYnVmX2NudDE2PTI7CisJCWJyZWFrOworCWNhc2UgMzI6CQkvKiAxNktCIHNoYXJlZCBSQU0gKi8KKwkJdGktPmRoYl9zaXplNG1iID0gbWluKHRpLT5kaGJfc2l6ZTRtYiwgKHVuc2lnbmVkIHNob3J0KTQ0NjQpOworCQl0aS0+cmJ1Zl9sZW40ID0gMTAzMjsKKwkJdGktPnJidWZfY250ND00OworCQl0aS0+ZGhiX3NpemUxNm1iID0gbWluKHRpLT5kaGJfc2l6ZTE2bWIsICh1bnNpZ25lZCBzaG9ydCk0MDk2KTsKKwkJdGktPnJidWZfbGVuMTYgPSAxMDMyOwkvKjEwMjQgdXNhYmxlICovCisJCXRpLT5yYnVmX2NudDE2PTQ7CisJCWJyZWFrOworCWNhc2UgNjQ6CQkvKiAzMktCIHNoYXJlZCBSQU0gKi8KKwkJdGktPmRoYl9zaXplNG1iID0gbWluKHRpLT5kaGJfc2l6ZTRtYiwgKHVuc2lnbmVkIHNob3J0KTQ0NjQpOworCQl0aS0+cmJ1Zl9sZW40ID0gMTAzMjsKKwkJdGktPnJidWZfY250ND02OworCQl0aS0+ZGhiX3NpemUxNm1iID0gbWluKHRpLT5kaGJfc2l6ZTE2bWIsICh1bnNpZ25lZCBzaG9ydCkxMDI0MCk7CisJCXRpLT5yYnVmX2xlbjE2ID0gMTAzMjsKKwkJdGktPnJidWZfY250MTY9NjsKKwkJYnJlYWs7CisJY2FzZSAxMjc6CQkvKiA2My41S0Igc2hhcmVkIFJBTSAqLworCQl0aS0+ZGhiX3NpemU0bWIgPSBtaW4odGktPmRoYl9zaXplNG1iLCAodW5zaWduZWQgc2hvcnQpNDQ2NCk7CisJCXRpLT5yYnVmX2xlbjQgPSAxMDMyOworCQl0aS0+cmJ1Zl9jbnQ0PTY7CisJCXRpLT5kaGJfc2l6ZTE2bWIgPSBtaW4odGktPmRoYl9zaXplMTZtYiwgKHVuc2lnbmVkIHNob3J0KTE2Mzg0KTsKKwkJdGktPnJidWZfbGVuMTYgPSAxMDMyOworCQl0aS0+cmJ1Zl9jbnQxNj0xNjsKKwkJYnJlYWs7CisJY2FzZSAxMjg6CQkvKiA2NEtCICAgc2hhcmVkIFJBTSAqLworCQl0aS0+ZGhiX3NpemU0bWIgPSBtaW4odGktPmRoYl9zaXplNG1iLCAodW5zaWduZWQgc2hvcnQpNDQ2NCk7CisJCXRpLT5yYnVmX2xlbjQgPSAxMDMyOworCQl0aS0+cmJ1Zl9jbnQ0PTY7CisJCXRpLT5kaGJfc2l6ZTE2bWIgPSBtaW4odGktPmRoYl9zaXplMTZtYiwgKHVuc2lnbmVkIHNob3J0KTE3OTYwKTsKKwkJdGktPnJidWZfbGVuMTYgPSAxMDMyOworCQl0aS0+cmJ1Zl9jbnQxNj0xNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdGktPmRoYl9zaXplNG1iID0gMjA0ODsKKwkJdGktPnJidWZfbGVuNCA9IDEwMzI7CisJCXRpLT5yYnVmX2NudDQ9MjsKKwkJdGktPmRoYl9zaXplMTZtYiA9IDIwNDg7CisJCXRpLT5yYnVmX2xlbjE2ID0gMTAzMjsKKwkJdGktPnJidWZfY250MTY9MjsKKwkJYnJlYWs7CisJfQorCS8qIHRoaXMgZm9ybXVsYSBpcyBub3Qgc21hcnQgZW5vdWdoIGZvciB0aGUgcGFnaW5nIGNhc2UKKwl0aS0+cmJ1Zl9jbnQ8eD4gPSAodGktPmF2YWlsX3NoYXJlZF9yYW0gKiBCTE9DS1NaIC0gQURBUFRfUFJJVkFURSAtCisJCQlBUkJMRU5HVEggLSBTU0JMRU5HVEggLSBETENfTUFYX1NBUCAqIFNBUExFTkdUSCAtCisJCQlETENfTUFYX1NUQSAqIFNUQUxFTkdUSCAtIHRpLT5kaGJfc2l6ZTx4Pm1iICogTlVNX0RIQiAtCisJCQlTUkJMRU5HVEggLSBBU0JMRU5HVEgpIC8gdGktPnJidWZfbGVuPHg+OworCSovCisJdGktPm1heG10dTE2ID0gKHRpLT5yYnVmX2xlbjE2IC0gOCkgKiB0aS0+cmJ1Zl9jbnQxNiAgLSBUUl9ITEVOOworCXRpLT5tYXhtdHU0ID0gKHRpLT5yYnVmX2xlbjQgLSA4KSAqIHRpLT5yYnVmX2NudDQgLSBUUl9ITEVOOworCS8qQk1TIGFzc3VtaW5nIDE4IGJ5dGVzIG9mIFJvdXRpbmcgSW5mb3JtYXRpb24gKHVzdWFsbHkgd29ya3MpICovCisJRFBSSU5USygiTWF4aW11bSBSZWNlaXZlIEludGVybmV0IFByb3RvY29sIE1UVSAxNk1icHM6ICVkLCA0TWJwczogJWRcbiIsCisJCQkJCQkgICAgIHRpLT5tYXhtdHUxNiwgdGktPm1heG10dTQpOworCisJZGV2LT5iYXNlX2FkZHIgPSBQSU9hZGRyOwkvKiBzZXQgdGhlIHZhbHVlIGZvciBkZXZpY2UgKi8KKwlkZXYtPm1lbV9zdGFydCA9IHRpLT5zcmFtX2Jhc2UgPDwgMTI7CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAodGktPm1hcHBlZF9yYW1fc2l6ZSA8PCA5KSAtIDE7CisJdHJkZXZfaW5pdChkZXYpOworCXJldHVybiAwOyAgIC8qIFJldHVybiAwIHRvIGluZGljYXRlIHdlIGhhdmUgZm91bmQgYSBUb2tlbiBSaW5nIGNhcmQuICovCit9CQkJCS8qaWJtdHJfcHJvYmUxKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBxdWVyeSB0aGUgYWRhcHRlciBmb3IgdGhlIHNpemUgb2Ygc2hhcmVkIFJBTSAgKi8KKy8qIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBSQU0gc2l6ZSBpbiB1bml0cyBvZiA1MTIgYnl0ZXMgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgX19kZXZpbml0IGdldF9zcmFtX3NpemUoc3RydWN0IHRva19pbmZvICphZGFwdF9pbmZvKQoreworCXVuc2lnbmVkIGNoYXIgYXZhaWxfc3JhbV9jb2RlOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNpemVfY29kZVtdID0geyAwLCAxNiwgMzIsIDY0LCAxMjcsIDEyOCB9OworCS8qIEFkYXB0ZXIgZ2l2ZXMKKwkgICAnRicgLS0gdXNlIFJSUiBiaXRzIDMsMgorCSAgICdFJyAtLSA4a2IgICAnRCcgLS0gMTZrYgorCSAgICdDJyAtLSAzMmtiICAnQScgLS0gNjRLQgorCSAgICdCJyAtIDY0S0IgbGVzcyA1MTIgYnl0ZXMgYXQgdG9wCisJICAgKFdBUk5JTkcgLi4uIG11c3QgemVybyB0b3AgYnl0ZXMgaW4gSU5JVCAqLworCisJYXZhaWxfc3JhbV9jb2RlID0gMHhmIC0gcmVhZGIoYWRhcHRfaW5mby0+bW1pbyArIEFJUEFWQUlMU0hSQU0pOworCWlmIChhdmFpbF9zcmFtX2NvZGUpIHJldHVybiBzaXplX2NvZGVbYXZhaWxfc3JhbV9jb2RlXTsKKwllbHNlCQkvKiBmb3IgY29kZSAnRicsIG11c3QgY29tcHV0ZSBzaXplIGZyb20gUlJSKDMsMikgYml0cyAqLworCQlyZXR1cm4gMSA8PAorCQkgKChyZWFkYihhZGFwdF9pbmZvLT5tbWlvK0FDQV9PRkZTRVQrQUNBX1JXK1JSUl9PREQpPj4yJjMpKzQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRyZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisKKwlTRVRfUEFHRSh0aS0+c3JiX3BhZ2UpOworICAgICAgICB0aS0+b3Blbl9mYWlsdXJlID0gTk8gICAgOworCWRldi0+b3BlbiA9IHRva19vcGVuOworCWRldi0+c3RvcCA9IHRva19jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHRva19zZW5kX3BhY2tldDsKKwlkZXYtPmdldF9zdGF0cyA9IHRva19nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSB0b2tfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+Y2hhbmdlX210dSA9IGlibXRyX2NoYW5nZV9tdHU7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHRva19pbml0X2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpOworCXNob3J0IFBJT2FkZHI7CisJdW5zaWduZWQgbG9uZyBpOworCisJUElPYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisJLyogU3BlY2lhbCBwcm9jZXNzaW5nIGZvciBmaXJzdCBpbnRlcnJ1cHQgYWZ0ZXIgcmVzZXQgKi8KKwl0aS0+ZG9fdG9rX2ludCA9IEZJUlNUX0lOVDsKKwkvKiBSZXNldCBhZGFwdGVyICovCisJd3JpdGViKH5JTlRfRU5BQkxFLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUkVTRVQgKyBJU1JQX0VWRU4pOworCW91dGIoMCwgUElPYWRkciArIEFEQVBUUkVTRVQpOworCisJY3VycmVudC0+c3RhdGU9VEFTS19VTklOVEVSUlVQVElCTEU7CisJc2NoZWR1bGVfdGltZW91dChUUl9SU1RfVElNRSk7IC8qIHdhaXQgNTBtcyAqLworCisJb3V0YigwLCBQSU9hZGRyICsgQURBUFRSRVNFVFJFTCk7CisjaWZkZWYgRU5BQkxFX1BBR0lORworCWlmICh0aS0+cGFnZV9tYXNrKQorCQl3cml0ZWIoU1JQUl9FTkFCTEVfUEFHSU5HLHRpLT5tbWlvK0FDQV9PRkZTRVQrQUNBX1JXK1NSUFJfRVZFTik7CisjZW5kaWYKKwl3cml0ZWIoSU5UX0VOQUJMRSwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUlBfRVZFTik7CisJaSA9IHNsZWVwX29uX3RpbWVvdXQoJnRpLT53YWl0X2Zvcl9yZXNldCwgNCAqIEhaKTsKKwlyZXR1cm4gaT8gMCA6IC1FQUdBSU47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgdG9rX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisJaW50IGk7CisKKwkvKnRoZSBjYXNlIHdlIHdlcmUgbGVmdCBpbiBhIGZhaWx1cmUgc3RhdGUgZHVyaW5nIGEgcHJldmlvdXMgb3BlbiAqLworCWlmICh0aS0+b3Blbl9mYWlsdXJlID09IFlFUykgeworCQlEUFJJTlRLKCJMYXN0IHRpbWUgeW91IHdlcmUgZGlzY29ubmVjdGVkLCBob3cgYWJvdXQgbm93P1xuIik7CisJCXByaW50aygiWW91IGNhbid0IGluc2VydCB3aXRoIGFuIElDUyBjb25uZWN0b3IgaGFsZi1jb2NrZWQuXG4iKTsKKwl9CisKKwl0aS0+b3Blbl9zdGF0dXMgID0gQ0xPU0VEOyAvKiBDTE9TRUQgb3IgT1BFTiAgICAgICovCisJdGktPnNhcF9zdGF0dXMgICA9IENMT1NFRDsgLyogQ0xPU0VEIG9yIE9QRU4gICAgICAqLworCXRpLT5vcGVuX2ZhaWx1cmUgPSAgICAgTk87IC8qIE5PICAgICBvciBZRVMgICAgICAgKi8KKwl0aS0+b3Blbl9tb2RlICAgID0gTUFOVUFMOyAvKiBNQU5VQUwgb3IgQVVUT01BVElDICovCisJLyogMTIvMjAwMCBub3QgdHlwaWNhbCBMaW51eCwgYnV0IHdlIGNhbiB1c2UgUlVOTklORyB0byBsZXQgdXMga25vdyB3aGVuCisJdGhlIG5ldHdvcmsgaGFzIGNyYXBwZWQgb3V0IG9yIGNhYmxlcyBhcmUgZGlzY29ubmVjdGVkLiBVc2VmdWwgYmVjYXVzZQorCXRoZSBJRkZfVVAgZmxhZyBzdGF5cyB1cCB0aGUgd2hvbGUgdGltZSwgdW50aWwgaWZjb25maWcgdHIwIGRvd24uCisJKi8KKwlkZXYtPmZsYWdzICY9IH5JRkZfUlVOTklORzsKKworCXRpLT5zcmFtX3BoeXMgJj0gfjE7IC8qIHRvIHJldmVyc2Ugd2hhdCB3ZSBkbyBpbiB0b2tfY2xvc2UgKi8KKwkvKiBpbml0IHRoZSBzcGlubG9jayAqLworCXNwaW5fbG9ja19pbml0KCZ0aS0+bG9jayk7CisJaW5pdF90aW1lcigmdGktPnRyX3RpbWVyKTsKKwkKKwlpID0gdG9rX2luaXRfY2FyZChkZXYpOworCWlmIChpKSByZXR1cm4gaTsKKworCXdoaWxlICgxKXsKKwkJdG9rX29wZW5fYWRhcHRlcigodW5zaWduZWQgbG9uZykgZGV2KTsKKwkJaT0gaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZ0aS0+d2FpdF9mb3JfcmVzZXQsIDI1ICogSFopOworCQkvKiBzaWcgY2F0Y2g6IGVzdGltYXRlIG9wZW5pbmcgYWRhcHRlciB0YWtlcyBtb3JlIHRoYW4gLjUgc2VjKi8KKwkJaWYgKGk+KDI0NSpIWikvMTApIGJyZWFrOyAvKiBmYW5jaWVyIHRoYW4gaWYgKGk9PTI1KkhaKSAqLworCQlpZiAoaT09MCkgYnJlYWs7CisJCWlmICh0aS0+b3Blbl9zdGF0dXMgPT0gT1BFTiAmJiB0aS0+c2FwX3N0YXR1cz09T1BFTikgeworCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCURQUklOVEsoIkFkYXB0ZXIgaXMgdXAgYW5kIHJ1bm5pbmdcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY3VycmVudC0+c3RhdGU9VEFTS19JTlRFUlJVUFRJQkxFOworCQlpPXNjaGVkdWxlX3RpbWVvdXQoVFJfUkVUUllfSU5URVJWQUwpOyAvKiB3YWl0IDMwIHNlY29uZHMgKi8KKwkJaWYoaSE9MCkgYnJlYWs7IC8qcHJvYi4gYSBzaWduYWwsIGxpa2UgdGhlIGk+MjQqSFogY2FzZSBhYm92ZSAqLworCX0KKwlvdXRiKDAsIGRldi0+YmFzZV9hZGRyICsgQURBUFRSRVNFVCk7Lyoga2lsbCBwZW5kaW5nIGludGVycnVwdHMqLworCURQUklOVEsoIlRFUk1JTkFURUQgdmlhIHNpZ25hbFxuIik7CS8qQk1TIHVzZWZ1bCAqLworCXJldHVybiAtRUFHQUlOOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ09NTUFORF9PRlNUICAgICAgICAgICAgIDAKKyNkZWZpbmUgT1BFTl9PUFRJT05TX09GU1QgICAgICAgIDgKKyNkZWZpbmUgTlVNX1JDVl9CVUZfT0ZTVCAgICAgICAgMjQKKyNkZWZpbmUgUkNWX0JVRl9MRU5fT0ZTVCAgICAgICAgMjYKKyNkZWZpbmUgREhCX0xFTkdUSF9PRlNUICAgICAgICAgMjgKKyNkZWZpbmUgTlVNX0RIQl9PRlNUICAgICAgICAgICAgMzAKKyNkZWZpbmUgRExDX01BWF9TQVBfT0ZTVCAgICAgICAgMzIKKyNkZWZpbmUgRExDX01BWF9TVEFfT0ZTVCAgICAgICAgMzMKKwordm9pZCB0b2tfb3Blbl9hZGFwdGVyKHVuc2lnbmVkIGxvbmcgZGV2X2FkZHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfYWRkcjsKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpOworCWludCBpOworCisJdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKwlTRVRfUEFHRSh0aS0+aW5pdF9zcmJfcGFnZSk7IAorCXdyaXRlYih+U1JCX1JFU1BfSU5ULCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUkVTRVQgKyBJU1JQX09ERCk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgZGlyX29wZW5fYWRhcHRlcik7IGkrKykKKwkJd3JpdGViKDAsIHRpLT5pbml0X3NyYiArIGkpOworCXdyaXRlYihESVJfT1BFTl9BREFQVEVSLCB0aS0+aW5pdF9zcmIgKyBDT01NQU5EX09GU1QpOworCXdyaXRldyhodG9ucyhPUEVOX1BBU1NfQkNPTl9NQUMpLCB0aS0+aW5pdF9zcmIgKyBPUEVOX09QVElPTlNfT0ZTVCk7CisJaWYgKHRpLT5yaW5nX3NwZWVkID09IDE2KSB7CisJCXdyaXRldyhodG9ucyh0aS0+ZGhiX3NpemUxNm1iKSwgdGktPmluaXRfc3JiICsgREhCX0xFTkdUSF9PRlNUKTsKKwkJd3JpdGV3KGh0b25zKHRpLT5yYnVmX2NudDE2KSwgdGktPmluaXRfc3JiICsgTlVNX1JDVl9CVUZfT0ZTVCk7CisJCXdyaXRldyhodG9ucyh0aS0+cmJ1Zl9sZW4xNiksIHRpLT5pbml0X3NyYiArIFJDVl9CVUZfTEVOX09GU1QpOworCX0gZWxzZSB7CisJCXdyaXRldyhodG9ucyh0aS0+ZGhiX3NpemU0bWIpLCB0aS0+aW5pdF9zcmIgKyBESEJfTEVOR1RIX09GU1QpOworCQl3cml0ZXcoaHRvbnModGktPnJidWZfY250NCksIHRpLT5pbml0X3NyYiArIE5VTV9SQ1ZfQlVGX09GU1QpOworCQl3cml0ZXcoaHRvbnModGktPnJidWZfbGVuNCksIHRpLT5pbml0X3NyYiArIFJDVl9CVUZfTEVOX09GU1QpOworCX0KKwl3cml0ZWIoTlVNX0RIQiwJCS8qIGFsd2F5cyAyICovIHRpLT5pbml0X3NyYiArIE5VTV9ESEJfT0ZTVCk7CisJd3JpdGViKERMQ19NQVhfU0FQLCB0aS0+aW5pdF9zcmIgKyBETENfTUFYX1NBUF9PRlNUKTsKKwl3cml0ZWIoRExDX01BWF9TVEEsIHRpLT5pbml0X3NyYiArIERMQ19NQVhfU1RBX09GU1QpOworCXRpLT5zcmIgPSB0aS0+aW5pdF9zcmI7CS8qIFdlIHVzZSB0aGlzIG9uZSBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwl0aS0+c3JiX3BhZ2UgPSB0aS0+aW5pdF9zcmJfcGFnZTsKKwlEUFJJTlRLKCJPcGVuaW5nIGFkYXB0ZXI6IFhtaXQgYmZyczogJWQgWCAlZCwgUmN2IGJmcnM6ICVkIFggJWRcbiIsCisJCXJlYWRiKHRpLT5pbml0X3NyYiArIE5VTV9ESEJfT0ZTVCksCisJCW50b2hzKHJlYWR3KHRpLT5pbml0X3NyYiArIERIQl9MRU5HVEhfT0ZTVCkpLAorCQludG9ocyhyZWFkdyh0aS0+aW5pdF9zcmIgKyBOVU1fUkNWX0JVRl9PRlNUKSksCisJCW50b2hzKHJlYWR3KHRpLT5pbml0X3NyYiArIFJDVl9CVUZfTEVOX09GU1QpKSk7CisJd3JpdGViKElOVF9FTkFCTEUsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JQX0VWRU4pOworCXdyaXRlYihDTURfSU5fU1JCLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIG9wZW5fc2FwKHVuc2lnbmVkIGNoYXIgdHlwZSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisKKwlTRVRfUEFHRSh0aS0+c3JiX3BhZ2UpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IGRsY19vcGVuX3NhcCk7IGkrKykKKwkJd3JpdGViKDAsIHRpLT5zcmIgKyBpKTsKKworI2RlZmluZSBNQVhfSV9GSUVMRF9PRlNUICAgICAgICAxNAorI2RlZmluZSBTQVBfVkFMVUVfT0ZTVCAgICAgICAgICAxNgorI2RlZmluZSBTQVBfT1BUSU9OU19PRlNUICAgICAgICAxNworI2RlZmluZSBTVEFUSU9OX0NPVU5UX09GU1QgICAgICAxOAorCisJd3JpdGViKERMQ19PUEVOX1NBUCwgdGktPnNyYiArIENPTU1BTkRfT0ZTVCk7CisJd3JpdGV3KGh0b25zKE1BWF9JX0ZJRUxEKSwgdGktPnNyYiArIE1BWF9JX0ZJRUxEX09GU1QpOworCXdyaXRlYihTQVBfT1BFTl9JTkRfU0FQIHwgU0FQX09QRU5fUFJJT1JJVFksIHRpLT5zcmIrIFNBUF9PUFRJT05TX09GU1QpOworCXdyaXRlYihTQVBfT1BFTl9TVEFUSU9OX0NOVCwgdGktPnNyYiArIFNUQVRJT05fQ09VTlRfT0ZTVCk7CisJd3JpdGViKHR5cGUsIHRpLT5zcmIgKyBTQVBfVkFMVUVfT0ZTVCk7CisJd3JpdGViKENNRF9JTl9TUkIsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JBX09ERCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCB0b2tfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRva19pbmZvICp0aSA9IChzdHJ1Y3QgdG9rX2luZm8gKikgZGV2LT5wcml2OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCXVuc2lnbmVkIGNoYXIgYWRkcmVzc1s0XTsKKworCWludCBpOworCisJLypCTVMgdGhlIG5leHQgbGluZSBpcyBDUlVDSUFMIG9yIHlvdSBtYXkgYmUgc2FkIHdoZW4geW91ICovCisJLypCTVMgaWZjb25maWcgdHIgZG93biBvciBob3QgdW5wbHVnIGEgUENNQ0lBIGNhcmQgPz9ob3dub3dicm93bmNvdyovCisJaWYgKC8qQk1TSEVMUGRldi0+c3RhcnQgPT0gMCB8fCovIHRpLT5vcGVuX3N0YXR1cyAhPSBPUEVOKSByZXR1cm47CisJYWRkcmVzc1swXSA9IGFkZHJlc3NbMV0gPSBhZGRyZXNzWzJdID0gYWRkcmVzc1szXSA9IDA7CisJbWNsaXN0ID0gZGV2LT5tY19saXN0OworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJYWRkcmVzc1swXSB8PSBtY2xpc3QtPmRtaV9hZGRyWzJdOworCQlhZGRyZXNzWzFdIHw9IG1jbGlzdC0+ZG1pX2FkZHJbM107CisJCWFkZHJlc3NbMl0gfD0gbWNsaXN0LT5kbWlfYWRkcls0XTsKKwkJYWRkcmVzc1szXSB8PSBtY2xpc3QtPmRtaV9hZGRyWzVdOworCQltY2xpc3QgPSBtY2xpc3QtPm5leHQ7CisJfQorCVNFVF9QQUdFKHRpLT5zcmJfcGFnZSk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3Qgc3JiX3NldF9mdW5jdF9hZGRyKTsgaSsrKQorCQl3cml0ZWIoMCwgdGktPnNyYiArIGkpOworCisjZGVmaW5lIEZVTkNUX0FERFJFU1NfT0ZTVCA2CisKKwl3cml0ZWIoRElSX1NFVF9GVU5DX0FERFIsIHRpLT5zcmIgKyBDT01NQU5EX09GU1QpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIAorCQl3cml0ZWIoYWRkcmVzc1tpXSwgdGktPnNyYiArIEZVTkNUX0FERFJFU1NfT0ZTVCArIGkpOworCXdyaXRlYihDTURfSU5fU1JCLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworI2lmIFRSX1ZFUkJPU0UKKwlEUFJJTlRLKCJTZXR0aW5nIGZ1bmN0aW9uYWwgYWRkcmVzczogIik7CisJZm9yIChpPTA7aTw0O2krKykgIHByaW50aygiJTAyWCAiLCBhZGRyZXNzW2ldKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNUQVRJT05fSURfT0ZTVCA0CisKK3N0YXRpYyBpbnQgdG9rX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRva19pbmZvICp0aTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisKKyAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogbG9jayBhZ2FpbnN0IG90aGVyIENQVXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHRpLT5sb2NrKSwgZmxhZ3MpOworCisJLyogU2F2ZSBza2I7IHdlJ2xsIG5lZWQgaXQgd2hlbiB0aGUgYWRhcHRlciBhc2tzIGZvciB0aGUgZGF0YSAqLworCXRpLT5jdXJyZW50X3NrYiA9IHNrYjsKKwlTRVRfUEFHRSh0aS0+c3JiX3BhZ2UpOworCXdyaXRlYihYTUlUX1VJX0ZSQU1FLCB0aS0+c3JiICsgQ09NTUFORF9PRlNUKTsKKwl3cml0ZXcodGktPmV4c2FwX3N0YXRpb25faWQsIHRpLT5zcmIgKyBTVEFUSU9OX0lEX09GU1QpOworCXdyaXRlYihDTURfSU5fU1JCLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJih0aS0+bG9jayksIGZsYWdzKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHRva19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKworCS8qIEltcG9ydGFudCBmb3IgUENNQ0lBIGhvdCB1bnBsdWcsIG90aGVyd2lzZSwgd2UnbGwgcHVsbCB0aGUgY2FyZCwgKi8KKwkvKiB1bmxvYWRpbmcgdGhlIG1vZHVsZSBmcm9tIG1lbW9yeSwgYW5kIHRoZW4gaWYgYSB0aW1lciBwb3BzLCBvdWNoICovCisJZGVsX3RpbWVyX3N5bmMoJnRpLT50cl90aW1lcik7CisJb3V0YigwLCBkZXYtPmJhc2VfYWRkciArIEFEQVBUUkVTRVQpOworCXRpLT5zcmFtX3BoeXMgfD0gMTsKKwl0aS0+b3Blbl9zdGF0dXMgPSBDTE9TRUQ7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJRFBSSU5USygiQWRhcHRlciBpcyBjbG9zZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFJFVENPREVfT0ZTVAkJMgorI2RlZmluZSBPUEVOX0VSUk9SX0NPREVfT0ZTVAk2CisjZGVmaW5lIEFTQl9BRERSRVNTX09GU1QgICAgICAgIDgKKyNkZWZpbmUgU1JCX0FERFJFU1NfT0ZTVCAgICAgICAgMTAKKyNkZWZpbmUgQVJCX0FERFJFU1NfT0ZTVCAgICAgICAgMTIKKyNkZWZpbmUgU1NCX0FERFJFU1NfT0ZTVCAgICAgICAgMTQKKworc3RhdGljIGNoYXIgKnByaW50cGhhc2VbXT0geyJMb2JlIG1lZGlhIHRlc3QiLCJQaHlzaWNhbCBpbnNlcnRpb24iLAorCSAgICAgICJBZGRyZXNzIHZlcmlmaWNhdGlvbiIsIlJvbGwgY2FsbCBwb2xsIiwiUmVxdWVzdCBQYXJhbWV0ZXJzIn07CitzdGF0aWMgY2hhciAqcHJpbnRlcnJvcltdPXsiRnVuY3Rpb24gZmFpbHVyZSIsIlNpZ25hbCBsb3NzIiwiUmVzZXJ2ZWQiLAorCQkiRnJlcXVlbmN5IGVycm9yIiwiVGltZW91dCIsIlJpbmcgZmFpbHVyZSIsIlJpbmcgYmVhY29uaW5nIiwKKwkJIkR1cGxpY2F0ZSBub2RlIGFkZHJlc3MiLAorCQkiUGFyYW1ldGVyIHJlcXVlc3QtcmV0cnkgY291bnQgZXhjZWVkZWQiLCJSZW1vdmUgcmVjZWl2ZWQiLAorCQkiSU1QTCBmb3JjZSByZWNlaXZlZCIsIkR1cGxpY2F0ZSBtb2RpZmllciIsCisJCSJObyBtb25pdG9yIGRldGVjdGVkIiwiTW9uaXRvciBjb250ZW50aW9uIGZhaWxlZCBmb3IgUlBMIn07CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1hcF9hZGRyZXNzKHN0cnVjdCB0b2tfaW5mbyAqdGksIHVuc2lnbmVkIGluZGV4LCBfX3U4ICpwYWdlKQoreworCWlmICh0aS0+cGFnZV9tYXNrKSB7CisJCSpwYWdlID0gKGluZGV4ID4+IDgpICYgdGktPnBhZ2VfbWFzazsKKwkJaW5kZXggJj0gfih0aS0+cGFnZV9tYXNrIDw8IDgpOworCX0KKwlyZXR1cm4gdGktPnNyYW1fdmlydCArIGluZGV4OworfQorCit2b2lkIGRpcl9vcGVuX2FkYXB0ZXIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCB0b2tfaW5mbyAqdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKyAgICAgICAgdW5zaWduZWQgY2hhciByZXRfY29kZTsKKyAgICAgICAgX191MTYgZXJyOworCisgICAgICAgIHRpLT5zcmIgPSBtYXBfYWRkcmVzcyh0aSwKKwkJbnRvaHMocmVhZHcodGktPmluaXRfc3JiICsgU1JCX0FERFJFU1NfT0ZTVCkpLAorCQkmdGktPnNyYl9wYWdlKTsKKyAgICAgICAgdGktPnNzYiA9IG1hcF9hZGRyZXNzKHRpLAorCQludG9ocyhyZWFkdyh0aS0+aW5pdF9zcmIgKyBTU0JfQUREUkVTU19PRlNUKSksCisJCSZ0aS0+c3NiX3BhZ2UpOworICAgICAgICB0aS0+YXJiID0gbWFwX2FkZHJlc3ModGksCisJCW50b2hzKHJlYWR3KHRpLT5pbml0X3NyYiArIEFSQl9BRERSRVNTX09GU1QpKSwKKwkJJnRpLT5hcmJfcGFnZSk7CisgICAgICAgIHRpLT5hc2IgPSBtYXBfYWRkcmVzcyh0aSwKKwkJbnRvaHMocmVhZHcodGktPmluaXRfc3JiICsgQVNCX0FERFJFU1NfT0ZTVCkpLAorCQkmdGktPmFzYl9wYWdlKTsKKyAgICAgICAgdGktPmN1cnJlbnRfc2tiID0gTlVMTDsKKyAgICAgICAgcmV0X2NvZGUgPSByZWFkYih0aS0+aW5pdF9zcmIgKyBSRVRDT0RFX09GU1QpOworICAgICAgICBlcnIgPSBudG9ocyhyZWFkdyh0aS0+aW5pdF9zcmIgKyBPUEVOX0VSUk9SX0NPREVfT0ZTVCkpOworICAgICAgICBpZiAoIXJldF9jb2RlKSB7CisJCXRpLT5vcGVuX3N0YXR1cyA9IE9QRU47IC8qIFRSIGFkYXB0ZXIgaXMgbm93IGF2YWlsYWJsZSAqLworICAgICAgICAgICAgICAgIGlmICh0aS0+b3Blbl9tb2RlID09IEFVVE9NQVRJQykgeworCQkJRFBSSU5USygiQWRhcHRlciByZW9wZW5lZC5cbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZWIoflNSQl9SRVNQX0lOVCwgdGktPm1taW8rQUNBX09GRlNFVCtBQ0FfUkVTRVQrSVNSUF9PREQpOworICAgICAgICAgICAgICAgIG9wZW5fc2FwKEVYVEVOREVEX1NBUCwgZGV2KTsKKwkJcmV0dXJuOworCX0KKwl0aS0+b3Blbl9mYWlsdXJlID0gWUVTOworCWlmIChyZXRfY29kZSA9PSA3KXsKKyAgICAgICAgICAgICAgIGlmIChlcnIgPT0gMHgyNCkgeworCQkJaWYgKCF0aS0+YXV0b19zcGVlZHNhdmUpIHsKKwkJCQlEUFJJTlRLKCJPcGVuIGZhaWxlZDogQWRhcHRlciBzcGVlZCBtdXN0IG1hdGNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyaW5nIHNwZWVkIGlmIEF1dG9tYXRpYyBSaW5nIFNwZWVkIFNhdmUgaXMgIgorCQkJCSAiZGlzYWJsZWQuXG4iKTsKKwkJCQl0aS0+b3Blbl9hY3Rpb24gPSBGQUlMOworCQkJfWVsc2UKKwkJCQlEUFJJTlRLKCJSZXRyeWluZyBvcGVuIHRvIGFkanVzdCB0byAiCisJCQkJCSJyaW5nIHNwZWVkLCAiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSAweDJkKSB7CisJCQlEUFJJTlRLKCJQaHlzaWNhbCBJbnNlcnRpb246IE5vIE1vbml0b3IgRGV0ZWN0ZWQsICIpOworCQkJcHJpbnRrKCJyZXRyeWluZyBhZnRlciAlZHMgZGVsYXkuLi5cbiIsCisJCQkJCVRSX1JFVFJZX0lOVEVSVkFML0haKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSAweDExKSB7CisJCQlEUFJJTlRLKCJMb2JlIE1lZGlhIEZ1bmN0aW9uIEZhaWx1cmUgKDB4MTEpLCAiKTsKKwkJCXByaW50aygiIHJldHJ5aW5nIGFmdGVyICVkcyBkZWxheS4uLlxuIiwKKwkJCQkJVFJfUkVUUllfSU5URVJWQUwvSFopOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCQljaGFyICoqcHJwaGFzZSA9IHByaW50cGhhc2U7CisJCQljaGFyICoqcHJlcnJvciA9IHByaW50ZXJyb3I7CisJCQlEUFJJTlRLKCJUUiBBZGFwdGVyIG1pc2Mgb3BlbiBmYWlsdXJlLCBlcnJvciBjb2RlID0gIik7CisJCQlwcmludGsoIjB4JXgsIFBoYXNlOiAlcywgRXJyb3I6ICVzXG4iLAorCQkJCWVyciwgcHJwaGFzZVtlcnIvMTYgLTFdLCBwcmVycm9yW2VyciUxNiAtMV0pOworCQkJcHJpbnRrKCIgcmV0cnlpbmcgYWZ0ZXIgJWRzIGRlbGF5Li4uXG4iLAorCQkJCQlUUl9SRVRSWV9JTlRFUlZBTC9IWik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgRFBSSU5USygib3BlbiBmYWlsZWQ6IHJldF9jb2RlID0gJTAyWC4uLiwgIiwgcmV0X2NvZGUpOworCWlmICh0aS0+b3Blbl9hY3Rpb24gIT0gRkFJTCkgeworCQlpZiAodGktPm9wZW5fbW9kZT09QVVUT01BVElDKXsKKwkJCXRpLT5vcGVuX2FjdGlvbiA9IFJFT1BFTjsKKwkJCWlibXRyX3Jlc2V0X3RpbWVyKCYodGktPnRyX3RpbWVyKSwgZGV2KTsKKwkJCXJldHVybjsKKwkJfQorCQl3YWtlX3VwKCZ0aS0+d2FpdF9mb3JfcmVzZXQpOworCQlyZXR1cm47CisJfQorCURQUklOVEsoIkZBSUxVUkUsIENBUFVUXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaXJxcmV0dXJuX3QgdG9rX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCS8qICB1bnNpZ25lZCBjaGFyIHN0YXR1c19ldmVuIDsgKi8KKwlzdHJ1Y3QgdG9rX2luZm8gKnRpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisjaWZkZWYgRU5BQkxFX1BBR0lORworCXVuc2lnbmVkIGNoYXIgc2F2ZV9zcnByOworI2VuZGlmCisKKwlkZXYgPSBkZXZfaWQ7CisjaWYgVFJfVkVSQk9TRQorCURQUklOVEsoIkludCBmcm9tIHRva19kcml2ZXIsIGRldiA6ICVwIGlycSVkIHJlZ3M9JXBcbiIsIGRldixpcnEscmVncyk7CisjZW5kaWYKKwl0aSA9IChzdHJ1Y3QgdG9rX2luZm8gKikgZGV2LT5wcml2OworCWlmICh0aS0+c3JhbV9waHlzICYgMSkKKwkJcmV0dXJuIElSUV9OT05FOyAgICAgICAgIC8qIFBDTUNJQSBjYXJkIGV4dHJhY3Rpb24gZmxhZyAqLworCXNwaW5fbG9jaygmKHRpLT5sb2NrKSk7CisjaWZkZWYgRU5BQkxFX1BBR0lORworCXNhdmVfc3JwciA9IHJlYWRiKHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIFNSUFJfRVZFTik7CisjZW5kaWYKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyB0aWxsIHByb2Nlc3NpbmcgaXMgZmluaXNoZWQgKi8KKwl3cml0ZWIoKH5JTlRfRU5BQkxFKSwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1JFU0VUICsgSVNSUF9FVkVOKTsKKworCS8qIFJlc2V0IGludGVycnVwdCBmb3IgSVNBIGJvYXJkcyAqLworCWlmICh0aS0+YWRhcHRlcl9pbnRfZW5hYmxlKQorCQlvdXRiKDAsIHRpLT5hZGFwdGVyX2ludF9lbmFibGUpOworCWVsc2UgLyogdXNlZCBmb3IgUENNQ0lBIGNhcmRzICovCisJCW91dGIoMCwgdGktPmdsb2JhbF9pbnRfZW5hYmxlKTsKKyAgICAgICAgaWYgKHRpLT5kb190b2tfaW50ID09IEZJUlNUX0lOVCl7CisgICAgICAgICAgICAgICAgaW5pdGlhbF90b2tfaW50KGRldik7CisjaWZkZWYgRU5BQkxFX1BBR0lORworICAgICAgICAgICAgICAgIHdyaXRlYihzYXZlX3NycHIsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIFNSUFJfRVZFTik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmKHRpLT5sb2NrKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworICAgICAgICB9CisJLyogIEJlZ2luIGludGVycnVwdCBoYW5kbGVyIEhFUkUgaW5saW5lIHRvIGF2b2lkIHRoZSBleHRyYQorCSAgICBsZXZlbHMgb2YgbG9naWMgYW5kIGNhbGwgZGVwdGggZm9yIHRoZSBvcmlnaW5hbCBzb2x1dGlvbi4gKi8KKwlzdGF0dXMgPSByZWFkYih0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUlcgKyBJU1JQX09ERCk7CisJLypCTVNzdGF0dXNfZXZlbiA9IHJlYWRiICh0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUlcgKyBJU1JQX0VWRU4pICovCisJLypCTVNkZWJ1Z3ByaW50aygidG9rX2ludGVycnVwdDogSVNSUF9PREQgPSAweCV4IElTUlBfRVZFTiA9IDB4JXhcbiIsICovCisJLypCTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsc3RhdHVzX2V2ZW4pOyAgICAgICovCisKKwlpZiAoc3RhdHVzICYgQURBUF9DSEtfSU5UKSB7CisJCWludCBpOworCQl2b2lkIF9faW9tZW0gKmNoZWNrX3JlYXNvbjsKKwkJX191OCBjaGVja19yZWFzb25fcGFnZSA9IDA7CisJCWNoZWNrX3JlYXNvbiA9IG1hcF9hZGRyZXNzKHRpLAorCQkJbnRvaHMocmVhZHcodGktPm1taW8rIEFDQV9PRkZTRVQrQUNBX1JXICsgV1dDUl9FVkVOKSksCisJCQkmY2hlY2tfcmVhc29uX3BhZ2UpOworCQlTRVRfUEFHRShjaGVja19yZWFzb25fcGFnZSk7CisKKwkJRFBSSU5USygiQWRhcHRlciBjaGVjayBpbnRlcnJ1cHRcbiIpOworCQlEUFJJTlRLKCI4IHJlYXNvbiBieXRlcyBmb2xsb3c6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBjaGVja19yZWFzb24rKykKKwkJCXByaW50aygiJTAyWCAiLCAoaW50KSByZWFkYihjaGVja19yZWFzb24pKTsKKwkJcHJpbnRrKCJcbiIpOworCQl3cml0ZWIofkFEQVBfQ0hLX0lOVCwgdGktPm1taW8rIEFDQV9PRkZTRVQrQUNBX1JFU0VUKyBJU1JQX09ERCk7CisJCXN0YXR1cyA9IHJlYWRiKHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIElTUkFfRVZFTik7CisJCURQUklOVEsoIklTUkFfRVZFTiA9PSAweDAyJXhcbiIsc3RhdHVzKTsKKwkJdGktPm9wZW5fc3RhdHVzID0gQ0xPU0VEOworCQl0aS0+c2FwX3N0YXR1cyAgPSBDTE9TRUQ7CisJCXRpLT5vcGVuX21vZGUgICA9IEFVVE9NQVRJQzsKKwkJZGV2LT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJdGktPm9wZW5fYWN0aW9uID0gUkVTVEFSVDsKKwkJb3V0YigwLCBkZXYtPmJhc2VfYWRkciArIEFEQVBUUkVTRVQpOworCQlpYm10cl9yZXNldF90aW1lcigmKHRpLT50cl90aW1lciksIGRldik7LypCTVMgdHJ5IHRvIHJlb3BlbiovCisJCXNwaW5fdW5sb2NrKCYodGktPmxvY2spKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlpZiAocmVhZGIodGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1JXICsgSVNSUF9FVkVOKQorCQkmIChUQ1JfSU5UIHwgRVJSX0lOVCB8IEFDQ0VTU19JTlQpKSB7CisJCURQUklOVEsoImFkYXB0ZXIgZXJyb3I6IElTUlBfRVZFTiA6ICUwMnhcbiIsCisJCQkoaW50KXJlYWRiKHRpLT5tbWlvKyBBQ0FfT0ZGU0VUICsgQUNBX1JXICsgSVNSUF9FVkVOKSk7CisJCXdyaXRlYih+KFRDUl9JTlQgfCBFUlJfSU5UIHwgQUNDRVNTX0lOVCksCisJCQl0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUkVTRVQgKyBJU1JQX0VWRU4pOworCQlzdGF0dXM9IHJlYWRiKHRpLT5tbWlvKyBBQ0FfT0ZGU0VUICsgQUNBX1JXICsgSVNSQV9FVkVOKTsvKkJNUyovCisJCURQUklOVEsoIklTUkFfRVZFTiA9PSAweDAyJXhcbiIsc3RhdHVzKTsvKkJNUyovCisgICAgICAgICAgICAgICAgd3JpdGViKElOVF9FTkFCTEUsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JQX0VWRU4pOworI2lmZGVmIEVOQUJMRV9QQUdJTkcKKyAgICAgICAgICAgICAgICB3cml0ZWIoc2F2ZV9zcnByLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUlcgKyBTUlBSX0VWRU4pOworI2VuZGlmCisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJih0aS0+bG9jaykpOworICAgICAgICAgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKyAgICAgICAgfQorCWlmIChzdGF0dXMgJiBTUkJfUkVTUF9JTlQpIHsJLyogU1JCIHJlc3BvbnNlICovCisJCVNFVF9QQUdFKHRpLT5zcmJfcGFnZSk7CisjaWYgVFJfVkVSQk9TRQorCQlEUFJJTlRLKCJTUkIgcmVzcDogY21kPSUwMlggcnNwPSUwMlhcbiIsCisJCQkJcmVhZGIodGktPnNyYiksIHJlYWRiKHRpLT5zcmIgKyBSRVRDT0RFX09GU1QpKTsKKyNlbmRpZgorCQlzd2l0Y2ggKHJlYWRiKHRpLT5zcmIpKSB7CS8qIFNSQiBjb21tYW5kIGNoZWNrICovCisJCWNhc2UgWE1JVF9ESVJfRlJBTUU6eworCQkJdW5zaWduZWQgY2hhciB4bWl0X3JldF9jb2RlOworCQkJeG1pdF9yZXRfY29kZSA9IHJlYWRiKHRpLT5zcmIgKyBSRVRDT0RFX09GU1QpOworCQkJaWYgKHhtaXRfcmV0X2NvZGUgPT0gMHhmZikgYnJlYWs7CisJCQlEUFJJTlRLKCJlcnJvciBvbiB4bWl0X2Rpcl9mcmFtZSByZXF1ZXN0OiAlMDJYXG4iLAorCQkJCQkJCQl4bWl0X3JldF9jb2RlKTsKKwkJCWlmICh0aS0+Y3VycmVudF9za2IpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycSh0aS0+Y3VycmVudF9za2IpOworCQkJCXRpLT5jdXJyZW50X3NrYiA9IE5VTEw7CisJCQl9CisJCQkvKmRldi0+dGJ1c3kgPSAwOyovCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQlpZiAodGktPnJlYWRsb2dfcGVuZGluZykKKwkJCQlpYm10cl9yZWFkbG9nKGRldik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFhNSVRfVUlfRlJBTUU6eworCQkJdW5zaWduZWQgY2hhciB4bWl0X3JldF9jb2RlOworCisJCQl4bWl0X3JldF9jb2RlID0gcmVhZGIodGktPnNyYiArIFJFVENPREVfT0ZTVCk7CisJCQlpZiAoeG1pdF9yZXRfY29kZSA9PSAweGZmKSBicmVhazsKKwkJCURQUklOVEsoImVycm9yIG9uIHhtaXRfdWlfZnJhbWUgcmVxdWVzdDogJTAyWFxuIiwKKwkJCQkJCQkJeG1pdF9yZXRfY29kZSk7CisJCQlpZiAodGktPmN1cnJlbnRfc2tiKSB7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEodGktPmN1cnJlbnRfc2tiKTsKKwkJCQl0aS0+Y3VycmVudF9za2IgPSBOVUxMOworCQkJfQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJaWYgKHRpLT5yZWFkbG9nX3BlbmRpbmcpCisJCQkJaWJtdHJfcmVhZGxvZyhkZXYpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBESVJfT1BFTl9BREFQVEVSOgorCQkJZGlyX29wZW5fYWRhcHRlcihkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgRExDX09QRU5fU0FQOgorCQkJaWYgKHJlYWRiKHRpLT5zcmIgKyBSRVRDT0RFX09GU1QpKSB7CisJCQkJRFBSSU5USygib3Blbl9zYXAgZmFpbGVkOiByZXRfY29kZSA9ICUwMlgsICIKKwkJCQkJInJldHJ5aW5nXG4iLAorCQkJCQkoaW50KSByZWFkYih0aS0+c3JiICsgUkVUQ09ERV9PRlNUKSk7CisJCQkJdGktPm9wZW5fYWN0aW9uID0gUkVPUEVOOworCQkJCWlibXRyX3Jlc2V0X3RpbWVyKCYodGktPnRyX3RpbWVyKSwgZGV2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXRpLT5leHNhcF9zdGF0aW9uX2lkID0gcmVhZHcodGktPnNyYiArIFNUQVRJT05fSURfT0ZTVCk7CisJCQl0aS0+c2FwX3N0YXR1cyA9IE9QRU47LyogVFIgYWRhcHRlciBpcyBub3cgYXZhaWxhYmxlICovCisJCQlpZiAodGktPm9wZW5fbW9kZT09TUFOVUFMKXsKKwkJCQl3YWtlX3VwKCZ0aS0+d2FpdF9mb3JfcmVzZXQpOworCQkJCWJyZWFrOworCQkJfQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJZGV2LT5mbGFncyB8PSBJRkZfUlVOTklORzsvKkJNUyAxMi8yMDAwKi8KKwkJCWJyZWFrOworCQljYXNlIERJUl9JTlRFUlJVUFQ6CisJCWNhc2UgRElSX01PRF9PUEVOX1BBUkFNUzoKKwkJY2FzZSBESVJfU0VUX0dSUF9BRERSOgorCQljYXNlIERJUl9TRVRfRlVOQ19BRERSOgorCQljYXNlIERMQ19DTE9TRV9TQVA6CisJCQlpZiAocmVhZGIodGktPnNyYiArIFJFVENPREVfT0ZTVCkpCisJCQkJRFBSSU5USygiZXJyb3Igb24gJTAyWDogJTAyWFxuIiwKKwkJCQkJKGludCkgcmVhZGIodGktPnNyYiArIENPTU1BTkRfT0ZTVCksCisJCQkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBSRVRDT0RFX09GU1QpKTsKKwkJCWJyZWFrOworCQljYXNlIERJUl9SRUFEX0xPRzoKKwkJCWlmIChyZWFkYih0aS0+c3JiICsgUkVUQ09ERV9PRlNUKSl7CisJCQkJRFBSSU5USygiZXJyb3Igb24gZGlyX3JlYWRfbG9nOiAlMDJYXG4iLAorCQkJCQkoaW50KSByZWFkYih0aS0+c3JiICsgUkVUQ09ERV9PRlNUKSk7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCWJyZWFrOworCQkJfQorI2lmIElCTVRSX0RFQlVHX01FU1NBR0VTCisKKyNkZWZpbmUgTElORV9FUlJPUlNfT0ZTVCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRFUk5BTF9FUlJPUlNfT0ZTVCAgICAgICAgICAgICAxCisjZGVmaW5lIEJVUlNUX0VSUk9SU19PRlNUICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQUNfRVJST1JTX09GU1QgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBQk9SVF9ERUxJTUlURVJTX09GU1QgICAgICAgICAgICA0CisjZGVmaW5lIExPU1RfRlJBTUVTX09GU1QgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUkVDVl9DT05HRVNUX0NPVU5UX09GU1QgICAgICAgICAgNworI2RlZmluZSBGUkFNRV9DT1BJRURfRVJST1JTX09GU1QgICAgICAgICA4CisjZGVmaW5lIEZSRVFVRU5DWV9FUlJPUlNfT0ZTVCAgICAgICAgICAgIDkKKyNkZWZpbmUgVE9LRU5fRVJST1JTX09GU1QgICAgICAgICAgICAgICAxMAorCisJCQlEUFJJTlRLKCJMaW5lIGVycm9ycyAlMDJYLCBJbnRlcm5hbCBlcnJvcnMgJTAyWCwgIgorCQkJIkJ1cnN0IGVycm9ycyAlMDJYXG4iICJBL0MgZXJyb3JzICUwMlgsICIKKwkJCSJBYm9ydCBkZWxpbWl0ZXJzICUwMlgsIExvc3QgZnJhbWVzICUwMlhcbiIKKwkJCSJSZWNlaXZlIGNvbmdlc3Rpb24gY291bnQgJTAyWCwgIgorCQkJIkZyYW1lIGNvcGllZCBlcnJvcnMgJTAyWFxuRnJlcXVlbmN5IGVycm9ycyAlMDJYLCAiCisJCQkiVG9rZW4gZXJyb3JzICUwMlhcbiIsCisJCQkoaW50KSByZWFkYih0aS0+c3JiICsgTElORV9FUlJPUlNfT0ZTVCksCisJCQkoaW50KSByZWFkYih0aS0+c3JiICsgSU5URVJOQUxfRVJST1JTX09GU1QpLAorCQkJKGludCkgcmVhZGIodGktPnNyYiArIEJVUlNUX0VSUk9SU19PRlNUKSwKKwkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBBQ19FUlJPUlNfT0ZTVCksCisJCQkoaW50KSByZWFkYih0aS0+c3JiICsgQUJPUlRfREVMSU1JVEVSU19PRlNUKSwKKwkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBMT1NUX0ZSQU1FU19PRlNUKSwKKwkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBSRUNWX0NPTkdFU1RfQ09VTlRfT0ZTVCksCisJCQkoaW50KSByZWFkYih0aS0+c3JiICsgRlJBTUVfQ09QSUVEX0VSUk9SU19PRlNUKSwKKwkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBGUkVRVUVOQ1lfRVJST1JTX09GU1QpLAorCQkJKGludCkgcmVhZGIodGktPnNyYiArIFRPS0VOX0VSUk9SU19PRlNUKSk7CisjZW5kaWYKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFBSSU5USygiVW5rbm93biBjb21tYW5kICUwMlggZW5jb3VudGVyZWRcbiIsCisJCQkJCQkoaW50KSByZWFkYih0aS0+c3JiKSk7CisgICAgICAgIAl9CS8qIGVuZCBzd2l0Y2ggU1JCIGNvbW1hbmQgY2hlY2sgKi8KKwkJd3JpdGViKH5TUkJfUkVTUF9JTlQsIHRpLT5tbWlvKyBBQ0FfT0ZGU0VUK0FDQV9SRVNFVCsgSVNSUF9PREQpOworCX0JLyogaWYgU1JCIHJlc3BvbnNlICovCisJaWYgKHN0YXR1cyAmIEFTQl9GUkVFX0lOVCkgewkvKiBBU0IgcmVzcG9uc2UgKi8KKwkJU0VUX1BBR0UodGktPmFzYl9wYWdlKTsKKyNpZiBUUl9WRVJCT1NFCisJCURQUklOVEsoIkFTQiByZXNwOiBjbWQ9JTAyWFxuIiwgcmVhZGIodGktPmFzYikpOworI2VuZGlmCisKKwkJc3dpdGNoIChyZWFkYih0aS0+YXNiKSkgewkvKiBBU0IgY29tbWFuZCBjaGVjayAqLworCQljYXNlIFJFQ19EQVRBOgorCQljYXNlIFhNSVRfVUlfRlJBTUU6CisJCWNhc2UgWE1JVF9ESVJfRlJBTUU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQUklOVEsoInVua25vd24gY29tbWFuZCBpbiBhc2IgJTAyWFxuIiwKKwkJCQkJCShpbnQpIHJlYWRiKHRpLT5hc2IpKTsKKwkJfQkvKiBzd2l0Y2ggQVNCIGNvbW1hbmQgY2hlY2sgKi8KKwkJaWYgKHJlYWRiKHRpLT5hc2IgKyAyKSAhPSAweGZmKQkvKiBjaGVja3MgcmV0X2NvZGUgKi8KKwkJCURQUklOVEsoIkFTQiBlcnJvciAlMDJYIGluIGNtZCAlMDJYXG4iLAorCQkJCShpbnQpIHJlYWRiKHRpLT5hc2IgKyAyKSwgKGludCkgcmVhZGIodGktPmFzYikpOworCQl3cml0ZWIofkFTQl9GUkVFX0lOVCwgdGktPm1taW8rIEFDQV9PRkZTRVQrQUNBX1JFU0VUKyBJU1JQX09ERCk7CisJfQkvKiBpZiBBU0IgcmVzcG9uc2UgKi8KKworI2RlZmluZSBTVEFUVVNfT0ZTVCAgICAgICAgICAgICA2CisjZGVmaW5lIE5FVFdfU1RBVFVTX09GU1QgICAgICAgIDYKKworCWlmIChzdGF0dXMgJiBBUkJfQ01EX0lOVCkgewkvKiBBUkIgcmVzcG9uc2UgKi8KKwkJU0VUX1BBR0UodGktPmFyYl9wYWdlKTsKKyNpZiBUUl9WRVJCT1NFCisJCURQUklOVEsoIkFSQiByZXNwOiBjbWQ9JTAyWFxuIiwgcmVhZGIodGktPmFyYikpOworI2VuZGlmCisKKwkJc3dpdGNoIChyZWFkYih0aS0+YXJiKSkgewkvKiBBUkIgY29tbWFuZCBjaGVjayAqLworCQljYXNlIERMQ19TVEFUVVM6CisJCQlEUFJJTlRLKCJETENfU1RBVFVTIG5ldyBzdGF0dXM6ICUwMlggb24gc3RhdGlvbiAlMDJYXG4iLAorCQkJCW50b2hzKHJlYWR3KHRpLT5hcmIgKyBTVEFUVVNfT0ZTVCkpLAorCQkJCW50b2hzKHJlYWR3KHRpLT5hcmIrIFNUQVRJT05fSURfT0ZTVCkpKTsKKwkJCWJyZWFrOworCQljYXNlIFJFQ19EQVRBOgorCQkJdHJfcngoZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIFJJTkdfU1RBVF9DSEFOR0U6eworCQkJdW5zaWduZWQgc2hvcnQgcmluZ19zdGF0dXM7CisJCQlyaW5nX3N0YXR1cz0gbnRvaHMocmVhZHcodGktPmFyYiArIE5FVFdfU1RBVFVTX09GU1QpKTsKKwkJCWlmIChpYm10cl9kZWJ1Z190cmFjZSAmIFRSQ19JTklUKQorCQkJCURQUklOVEsoIlJpbmcgU3RhdHVzIENoYW5nZS4uLigweCV4KVxuIiwKKwkJCQkJCQkJcmluZ19zdGF0dXMpOworCQkJaWYocmluZ19zdGF0dXMmIChSRU1PVkVfUkVDVnxBVVRPX1JFTU9WQUx8TE9CRV9GQVVMVCkpeworCQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCQlkZXYtPmZsYWdzICY9IH5JRkZfUlVOTklORzsvKm5vdCB0eXBpY2FsIExpbnV4Ki8KKwkJCQlEUFJJTlRLKCJSZW1vdmUgcmVjZWl2ZWQsIG9yIEF1dG8tcmVtb3ZhbCBlcnJvciIKKwkJCQkJIiwgb3IgTG9iZSBmYXVsdFxuIik7CisJCQkJRFBSSU5USygiV2UnbGwgdHJ5IHRvIHJlb3BlbiB0aGUgY2xvc2VkIGFkYXB0ZXIiCisJCQkJCSIgYWZ0ZXIgYSAlZCBzZWNvbmQgZGVsYXkuXG4iLAorCQkJCQkJVFJfUkVUUllfSU5URVJWQUwvSFopOworCQkJCS8qSSB3YXMgY29uZnVzZWQ6IEkgc2F3IHRoZSBUUiByZW9wZW5pbmcgYnV0ICovCisJCQkJLypmb3Jnb3Q6d2l0aCBhbiBSSjQ1IGluIGFuIFJKNDUvSUNTIGFkYXB0ZXIgKi8KKwkJCQkvKmJ1dCBhZGFwdGVyIG5vdCBpbiB0aGUgcmluZywgdGhlIFRSIHdpbGwgICAqLworCQkJCS8qIG9wZW4sIGFuZCB0aGVuIHNvb24gY2xvc2UgYW5kIGNvbWUgaGVyZS4gICovCisJCQkJdGktPm9wZW5fbW9kZSA9IEFVVE9NQVRJQzsKKwkJCQl0aS0+b3Blbl9zdGF0dXMgPSBDTE9TRUQ7IC8qMTIvMjAwMCBCTVMqLworCQkJCXRpLT5vcGVuX2FjdGlvbiA9IFJFT1BFTjsKKwkJCQlpYm10cl9yZXNldF90aW1lcigmKHRpLT50cl90aW1lciksIGRldik7CisJCQl9IGVsc2UgaWYgKHJpbmdfc3RhdHVzICYgTE9HX09WRVJGTE9XKSB7CisJCQkJaWYobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQkJCQl0aS0+cmVhZGxvZ19wZW5kaW5nID0gMTsKKwkJCQllbHNlCisJCQkJCWlibXRyX3JlYWRsb2coZGV2KTsKKwkJCX0KKwkJCWJyZWFrOworICAgICAgICAgIAl9CisJCWNhc2UgWE1JVF9EQVRBX1JFUToKKwkJCXRyX3R4KGRldik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQUklOVEsoIlVua25vd24gY29tbWFuZCAlMDJYIGluIGFyYlxuIiwKKwkJCQkJCShpbnQpIHJlYWRiKHRpLT5hcmIpKTsKKwkJCWJyZWFrOworCQl9CS8qIHN3aXRjaCBBUkIgY29tbWFuZCBjaGVjayAqLworCQl3cml0ZWIofkFSQl9DTURfSU5ULCB0aS0+bW1pbysgQUNBX09GRlNFVCtBQ0FfUkVTRVQgKyBJU1JQX09ERCk7CisJCXdyaXRlYihBUkJfRlJFRSwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUkFfT0REKTsKKwl9CS8qIGlmIEFSQiByZXNwb25zZSAqLworCWlmIChzdGF0dXMgJiBTU0JfUkVTUF9JTlQpIHsJLyogU1NCIHJlc3BvbnNlICovCisJCXVuc2lnbmVkIGNoYXIgcmV0Y29kZTsKKwkJU0VUX1BBR0UodGktPnNzYl9wYWdlKTsKKyNpZiBUUl9WRVJCT1NFCisJCURQUklOVEsoIlNTQiByZXNwOiBjbWQ9JTAyWCByc3A9JTAyWFxuIiwKKwkJCQlyZWFkYih0aS0+c3NiKSwgcmVhZGIodGktPnNzYiArIDIpKTsKKyNlbmRpZgorCisJCXN3aXRjaCAocmVhZGIodGktPnNzYikpIHsJLyogU1NCIGNvbW1hbmQgY2hlY2sgKi8KKwkJY2FzZSBYTUlUX0RJUl9GUkFNRToKKwkJY2FzZSBYTUlUX1VJX0ZSQU1FOgorCQkJcmV0Y29kZSA9IHJlYWRiKHRpLT5zc2IgKyAyKTsKKwkJCWlmIChyZXRjb2RlICYmIChyZXRjb2RlICE9IDB4MjIpKS8qIGNoZWNrcyByZXRfY29kZSAqLworCQkJCURQUklOVEsoInhtaXQgcmV0X2NvZGU6ICUwMlggeG1pdCBlcnJvciBjb2RlOiAiCisJCQkJCSIlMDJYXG4iLAorCQkJCQkoaW50KXJldGNvZGUsIChpbnQpcmVhZGIodGktPnNzYiArIDYpKTsKKwkJCWVsc2UKKwkJCQl0aS0+dHJfc3RhdHMudHhfcGFja2V0cysrOworCQkJYnJlYWs7CisJCWNhc2UgWE1JVF9YSURfQ01EOgorCQkJRFBSSU5USygieG1pdCB4aWQgcmV0X2NvZGU6ICUwMlhcbiIsCisJCQkJCQkoaW50KSByZWFkYih0aS0+c3NiICsgMikpOworCQlkZWZhdWx0OgorCQkJRFBSSU5USygiVW5rbm93biBjb21tYW5kICUwMlggaW4gc3NiXG4iLAorCQkJCQkJKGludCkgcmVhZGIodGktPnNzYikpOworCQl9CS8qIFNTQiBjb21tYW5kIGNoZWNrICovCisJCXdyaXRlYih+U1NCX1JFU1BfSU5ULCB0aS0+bW1pbysgQUNBX09GRlNFVCtBQ0FfUkVTRVQrIElTUlBfT0REKTsKKwkJd3JpdGViKFNTQl9GUkVFLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworCX0JLyogaWYgU1NCIHJlc3BvbnNlICovCisjaWZkZWYgRU5BQkxFX1BBR0lORworCXdyaXRlYihzYXZlX3NycHIsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIFNSUFJfRVZFTik7CisjZW5kaWYKKwl3cml0ZWIoSU5UX0VOQUJMRSwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUlBfRVZFTik7CisJc3Bpbl91bmxvY2soJih0aS0+bG9jaykpOworCXJldHVybiBJUlFfSEFORExFRDsKK30JCQkJLyp0b2tfaW50ZXJydXB0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJTklUX1NUQVRVU19PRlNUICAgICAgICAxCisjZGVmaW5lIElOSVRfU1RBVFVTXzJfT0ZTVCAgICAgIDIKKyNkZWZpbmUgRU5DT0RFRF9BRERSRVNTX09GU1QgICAgOAorCitzdGF0aWMgdm9pZCBpbml0aWFsX3Rva19pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCV9fdTMyIGVuY29kZWRfYWRkciwgaHdfZW5jb2RlZF9hZGRyOworCXN0cnVjdCB0b2tfaW5mbyAqdGk7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5pdF9zdGF0dXM7IC8qQk1TIDEyLzIwMDAqLworCisJdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKworCXRpLT5kb190b2tfaW50ID0gTk9UX0ZJUlNUOworCisJLyogd2UgYXNzaWduIHRoZSBzaGFyZWQtcmFtIGFkZHJlc3MgZm9yIElTQSBkZXZpY2VzICovCisJd3JpdGViKHRpLT5zcmFtX2Jhc2UsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIFJSUl9FVkVOKTsKKyNpZm5kZWYgUENNQ0lBCisgICAgICAgIHRpLT5zcmFtX3ZpcnQgPSBpb3JlbWFwKCgoX191MzIpdGktPnNyYW1fYmFzZSA8PCAxMiksIHRpLT5hdmFpbF9zaGFyZWRfcmFtKTsKKyNlbmRpZgorCXRpLT5pbml0X3NyYiA9IG1hcF9hZGRyZXNzKHRpLAorCQludG9ocyhyZWFkdyh0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBXUkJSX0VWRU4pKSwKKwkJJnRpLT5pbml0X3NyYl9wYWdlKTsKKwlpZiAodGktPnBhZ2VfbWFzayAmJiB0aS0+YXZhaWxfc2hhcmVkX3JhbSA9PSAxMjcpIHsKKwkJdm9pZCBfX2lvbWVtICpsYXN0XzUxMjsKKwkJX191OCBsYXN0XzUxMl9wYWdlPTA7CisJCWludCBpOworCQlsYXN0XzUxMiA9IG1hcF9hZGRyZXNzKHRpLCAweGZlMDAsICZsYXN0XzUxMl9wYWdlKTsKKwkJLyogaW5pdGlhbGl6ZSBoaWdoIHNlY3Rpb24gb2YgcmFtIChpZiBuZWNlc3NhcnkpICovCisJCVNFVF9QQUdFKGxhc3RfNTEyX3BhZ2UpOworCQlmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspCisJCQl3cml0ZWIoMCwgbGFzdF81MTIgKyBpKTsKKwl9CisJU0VUX1BBR0UodGktPmluaXRfc3JiX3BhZ2UpOworCisjaWYgVFJfVkVSQk9TRQorCXsKKwlpbnQgaTsKKworCURQUklOVEsoInRpLT5pbml0X3NyYl9wYWdlPTB4JXhcbiIsIHRpLT5pbml0X3NyYl9wYWdlKTsKKwlEUFJJTlRLKCJpbml0X3NyYiglcCk6IiwgdGktPmluaXRfc3JiICk7CisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisJCXByaW50aygiJTAyWCAiLCAoaW50KSByZWFkYih0aS0+aW5pdF9zcmIgKyBpKSk7CisJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorCisJaHdfZW5jb2RlZF9hZGRyID0gcmVhZHcodGktPmluaXRfc3JiICsgRU5DT0RFRF9BRERSRVNTX09GU1QpOworCWVuY29kZWRfYWRkciA9IG50b2hzKGh3X2VuY29kZWRfYWRkcik7CisgICAgICAgIGluaXRfc3RhdHVzPSAvKkJNUyAxMi8yMDAwIGNoZWNrIGZvciBzaGFsbG93IG1vZGUgcG9zc2liaWxpdHkgKFR1cmJvKSovCisJcmVhZGIodGktPmluaXRfc3JiK29mZnNldG9mKHN0cnVjdCBzcmJfaW5pdF9yZXNwb25zZSxpbml0X3N0YXR1cykpOworCS8qcHJpbnRrKCJJbml0aWFsIGludGVycnVwdDogaW5pdF9zdGF0dXM9IDB4JTAyeFxuIixpbml0X3N0YXR1cyk7Ki8KKwl0aS0+cmluZ19zcGVlZCA9IGluaXRfc3RhdHVzICYgMHgwMSA/IDE2IDogNDsKKwlEUFJJTlRLKCJJbml0aWFsIGludGVycnVwdCA6ICVkIE1icHMsIHNoYXJlZCBSQU0gYmFzZSAlMDh4LlxuIiwKKwkJCQl0aS0+cmluZ19zcGVlZCwgKHVuc2lnbmVkIGludClkZXYtPm1lbV9zdGFydCk7CisJdGktPmF1dG9fc3BlZWRzYXZlPXJlYWRiKHRpLT5pbml0X3NyYitJTklUX1NUQVRVU18yX09GU1QpJjQ/VFJVRTpGQUxTRTsKKworICAgICAgICBpZiAodGktPm9wZW5fbW9kZSA9PSBNQU5VQUwpCXdha2VfdXAoJnRpLT53YWl0X2Zvcl9yZXNldCk7CisJZWxzZQkJCQl0b2tfb3Blbl9hZGFwdGVyKCh1bnNpZ25lZCBsb25nKWRldik7CisgICAgICAgIAorfSAvKmluaXRpYWxfdG9rX2ludCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDTURfQ09SUkVMQVRFX09GU1QgICAgICAxCisjZGVmaW5lIERIQl9BRERSRVNTX09GU1QgICAgICAgIDYKKworI2RlZmluZSBGUkFNRV9MRU5HVEhfT0ZTVCAgICAgICA2CisjZGVmaW5lIEhFQURFUl9MRU5HVEhfT0ZTVCAgICAgIDgKKyNkZWZpbmUgUlNBUF9WQUxVRV9PRlNUICAgICAgICAgOQorCitzdGF0aWMgdm9pZCB0cl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgdHJoX2hkciAqdHJoZHIgPSAoc3RydWN0IHRyaF9oZHIgKikgdGktPmN1cnJlbnRfc2tiLT5kYXRhOworCXVuc2lnbmVkIGludCBoZHJfbGVuOworCV9fdTMyIGRoYj0wLGRoYl9iYXNlOworCXZvaWQgX19pb21lbSAqZGhidWYgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgeG1pdF9jb21tYW5kOworCWludCBpLGRoYl9sZW49MHg0MDAwLHNyY19sZW4sc3JjX29mZnNldDsKKwlzdHJ1Y3QgdHJsbGMgKmxsYzsKKwlzdHJ1Y3Qgc3JiX3htaXQgeHNyYjsKKwlfX3U4IGRoYl9wYWdlID0gMDsKKwlfX3U4IGxsY19zc2FwOworCisJU0VUX1BBR0UodGktPmFzYl9wYWdlKTsKKworCWlmIChyZWFkYih0aS0+YXNiK1JFVENPREVfT0ZTVCkgIT0gMHhGRikgRFBSSU5USygiQVNCIG5vdCBmcmVlICEhIVxuIik7CisKKwkvKiBpbiBwcm92aWRpbmcgdGhlIHRyYW5zbWl0IGludGVycnVwdHMsIGlzIHRlbGxpbmcgdXMgaXQgaXMgcmVhZHkgZm9yCisJICAgZGF0YSBhbmQgcHJvdmlkaW5nIGEgc2hhcmVkIG1lbW9yeSBhZGRyZXNzIGZvciB1cyB0byBzdHVmZiB3aXRoIGRhdGEuCisJICAgSGVyZSB3ZSBjb21wdXRlIHRoZSBlZmZlY3RpdmUgYWRkcmVzcyB3aGVyZSB3ZSB3aWxsIHBsYWNlIGRhdGEuCisJKi8KKwlTRVRfUEFHRSh0aS0+YXJiX3BhZ2UpOworCWRoYj1kaGJfYmFzZT1udG9ocyhyZWFkdyh0aS0+YXJiICsgREhCX0FERFJFU1NfT0ZTVCkpOworCWlmICh0aS0+cGFnZV9tYXNrKSB7CisJCWRoYl9wYWdlID0gKGRoYl9iYXNlID4+IDgpICYgdGktPnBhZ2VfbWFzazsKKwkJZGhiPWRoYl9iYXNlICYgfih0aS0+cGFnZV9tYXNrIDw8IDgpOworCX0KKwlkaGJ1ZiA9IHRpLT5zcmFtX3ZpcnQgKyBkaGI7CisKKwkvKiBGaWd1cmUgb3V0IHRoZSBzaXplIG9mIHRoZSA4MDIuNSBoZWFkZXIgKi8KKwlpZiAoISh0cmhkci0+c2FkZHJbMF0gJiAweDgwKSkJLyogUklGIHByZXNlbnQ/ICovCisJCWhkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHRyaF9oZHIpIC0gVFJfTUFYUklGTEVOOworCWVsc2UKKwkJaGRyX2xlbiA9ICgobnRvaHModHJoZHItPnJjZikgJiBUUl9SQ0ZfTEVOX01BU0spID4+IDgpCisJCSAgICArIHNpemVvZihzdHJ1Y3QgdHJoX2hkcikgLSBUUl9NQVhSSUZMRU47CisKKwlsbGMgPSAoc3RydWN0IHRybGxjICopICh0aS0+Y3VycmVudF9za2ItPmRhdGEgKyBoZHJfbGVuKTsKKworCWxsY19zc2FwID0gbGxjLT5zc2FwOworCVNFVF9QQUdFKHRpLT5zcmJfcGFnZSk7CisJbWVtY3B5X2Zyb21pbygmeHNyYiwgdGktPnNyYiwgc2l6ZW9mKHhzcmIpKTsKKwlTRVRfUEFHRSh0aS0+YXNiX3BhZ2UpOworCXhtaXRfY29tbWFuZCA9IHhzcmIuY29tbWFuZDsKKworCXdyaXRlYih4bWl0X2NvbW1hbmQsIHRpLT5hc2IgKyBDT01NQU5EX09GU1QpOworCXdyaXRldyh4c3JiLnN0YXRpb25faWQsIHRpLT5hc2IgKyBTVEFUSU9OX0lEX09GU1QpOworCXdyaXRlYihsbGNfc3NhcCwgdGktPmFzYiArIFJTQVBfVkFMVUVfT0ZTVCk7CisJd3JpdGViKHhzcmIuY21kX2NvcnIsIHRpLT5hc2IgKyBDTURfQ09SUkVMQVRFX09GU1QpOworCXdyaXRlYigwLCB0aS0+YXNiICsgUkVUQ09ERV9PRlNUKTsKKwlpZiAoKHhtaXRfY29tbWFuZCA9PSBYTUlUX1hJRF9DTUQpIHx8ICh4bWl0X2NvbW1hbmQgPT0gWE1JVF9URVNUX0NNRCkpIHsKKwkJd3JpdGV3KGh0b25zKDB4MTEpLCB0aS0+YXNiICsgRlJBTUVfTEVOR1RIX09GU1QpOworCQl3cml0ZWIoMHgwZSwgdGktPmFzYiArIEhFQURFUl9MRU5HVEhfT0ZTVCk7CisJCVNFVF9QQUdFKGRoYl9wYWdlKTsKKwkJd3JpdGViKEFDLCBkaGJ1Zik7CisJCXdyaXRlYihMTENfRlJBTUUsIGRoYnVmICsgMSk7CisJCWZvciAoaSA9IDA7IGkgPCBUUl9BTEVOOyBpKyspCisJCQl3cml0ZWIoKGludCkgMHgwRkYsIGRoYnVmICsgaSArIDIpOworCQlmb3IgKGkgPSAwOyBpIDwgVFJfQUxFTjsgaSsrKQorCQkJd3JpdGViKDAsIGRoYnVmICsgaSArIFRSX0FMRU4gKyAyKTsKKwkJd3JpdGViKFJFU1BfSU5fQVNCLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworCQlyZXR1cm47CisJfQorCS8qCisJICogICAgdGhlIHRva2VuIHJpbmcgcGFja2V0IGlzIGNvcGllZCBmcm9tIHNrX2J1ZmYgdG8gdGhlIGFkYXB0ZXIKKwkgKiAgICBidWZmZXIgaWRlbnRpZmllZCBpbiB0aGUgY29tbWFuZCBkYXRhIHJlY2VpdmVkIHdpdGggdGhlIGludGVycnVwdC4KKwkgKi8KKwl3cml0ZWIoaGRyX2xlbiwgdGktPmFzYiArIEhFQURFUl9MRU5HVEhfT0ZTVCk7CisJd3JpdGV3KGh0b25zKHRpLT5jdXJyZW50X3NrYi0+bGVuKSwgdGktPmFzYiArIEZSQU1FX0xFTkdUSF9PRlNUKTsKKwlzcmNfbGVuPXRpLT5jdXJyZW50X3NrYi0+bGVuOworCXNyY19vZmZzZXQ9MDsKKwlkaGI9ZGhiX2Jhc2U7CisJd2hpbGUoMSkgeworCQlpZiAodGktPnBhZ2VfbWFzaykgeworCQkJZGhiX3BhZ2U9KGRoYiA+PiA4KSAmIHRpLT5wYWdlX21hc2s7CisJCQlkaGI9ZGhiICYgfih0aS0+cGFnZV9tYXNrIDw8IDgpOworCQkJZGhiX2xlbj0weDQwMDAtZGhiOyAvKiByZW1haW5pbmcgc2l6ZSBvZiB0aGlzIHBhZ2UgKi8KKwkJfQorCQlkaGJ1ZiA9IHRpLT5zcmFtX3ZpcnQgKyBkaGI7CisJCVNFVF9QQUdFKGRoYl9wYWdlKTsKKwkJaWYgKHNyY19sZW4gPiBkaGJfbGVuKSB7CisJCQltZW1jcHlfdG9pbyhkaGJ1ZiwmdGktPmN1cnJlbnRfc2tiLT5kYXRhW3NyY19vZmZzZXRdLAorCQkJCQlkaGJfbGVuKTsKKwkJCXNyY19sZW4gLT0gZGhiX2xlbjsKKwkJCXNyY19vZmZzZXQgKz0gZGhiX2xlbjsKKwkJCWRoYl9iYXNlKz1kaGJfbGVuOworCQkJZGhiPWRoYl9iYXNlOworCQkJY29udGludWU7CisJCX0KKwkJbWVtY3B5X3RvaW8oZGhidWYsICZ0aS0+Y3VycmVudF9za2ItPmRhdGFbc3JjX29mZnNldF0sIHNyY19sZW4pOworCQlicmVhazsKKwl9CisJd3JpdGViKFJFU1BfSU5fQVNCLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworCXRpLT50cl9zdGF0cy50eF9ieXRlcyArPSB0aS0+Y3VycmVudF9za2ItPmxlbjsKKwlkZXZfa2ZyZWVfc2tiX2lycSh0aS0+Y3VycmVudF9za2IpOworCXRpLT5jdXJyZW50X3NrYiA9IE5VTEw7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCWlmICh0aS0+cmVhZGxvZ19wZW5kaW5nKQorCQlpYm10cl9yZWFkbG9nKGRldik7Cit9CQkJCS8qdHJfdHggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNkZWZpbmUgUkVDRUlWRV9CVUZGRVJfT0ZTVCAgICAgNgorI2RlZmluZSBMQU5fSERSX0xFTkdUSF9PRlNUICAgICA4CisjZGVmaW5lIERMQ19IRFJfTEVOR1RIX09GU1QgICAgIDkKKworI2RlZmluZSBEU0FQX09GU1QgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNTQVBfT0ZTVCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTExDX09GU1QgICAgICAgICAgICAgICAgMgorI2RlZmluZSBQUk9USURfT0ZTVCAgICAgICAgICAgICAzCisjZGVmaW5lIEVUSEVSVFlQRV9PRlNUICAgICAgICAgIDYKKworc3RhdGljIHZvaWQgdHJfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisJX191MzIgcmJ1ZmZlcjsKKwl2b2lkIF9faW9tZW0gKnJidWYsICpyYnVmZGF0YSwgKmxsYzsKKwlfX3U4IHJidWZmZXJfcGFnZSA9IDA7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgcmJ1ZmZlcl9sZW4sIGxhbl9oZHJfbGVuLCBoZHJfbGVuLCBpcF9sZW4sIGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIGRsY19oZHJfbGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IHNrYl9zaXplID0gMDsKKwlpbnQgSVB2NF9wID0gMDsKKwl1bnNpZ25lZCBpbnQgY2hrc3VtID0gMDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgYXJiX3JlY19yZXEgcmFyYjsKKworCVNFVF9QQUdFKHRpLT5hcmJfcGFnZSk7CisJbWVtY3B5X2Zyb21pbygmcmFyYiwgdGktPmFyYiwgc2l6ZW9mKHJhcmIpKTsKKwlyYnVmZmVyID0gbnRvaHMocmFyYi5yZWNfYnVmX2FkZHIpIDsKKwlyYnVmID0gbWFwX2FkZHJlc3ModGksIHJidWZmZXIsICZyYnVmZmVyX3BhZ2UpOworCisJU0VUX1BBR0UodGktPmFzYl9wYWdlKTsKKworCWlmIChyZWFkYih0aS0+YXNiICsgUkVUQ09ERV9PRlNUKSAhPTB4RkYpIERQUklOVEsoIkFTQiBub3QgZnJlZSAhISFcbiIpOworCisJd3JpdGViKFJFQ19EQVRBLCB0aS0+YXNiICsgQ09NTUFORF9PRlNUKTsKKwl3cml0ZXcocmFyYi5zdGF0aW9uX2lkLCB0aS0+YXNiICsgU1RBVElPTl9JRF9PRlNUKTsKKwl3cml0ZXcocmFyYi5yZWNfYnVmX2FkZHIsIHRpLT5hc2IgKyBSRUNFSVZFX0JVRkZFUl9PRlNUKTsKKworCWxhbl9oZHJfbGVuID0gcmFyYi5sYW5faGRyX2xlbjsKKwlpZiAobGFuX2hkcl9sZW4gPiBzaXplb2Yoc3RydWN0IHRyaF9oZHIpKSB7CisJCURQUklOVEsoIkxpbnV4IGNhbm5vdCBoYW5kbGUgZ3JlYXRlciB0aGFuIDE4IGJ5dGVzIFJJRlxuIik7CisJCXJldHVybjsKKwl9CQkJLypCTVMgSSBhZGRlZCB0aGlzIGFib3ZlIGp1c3QgdG8gYmUgdmVyeSBzYWZlICovCisJZGxjX2hkcl9sZW4gPSByZWFkYih0aS0+YXJiICsgRExDX0hEUl9MRU5HVEhfT0ZTVCk7CisJaGRyX2xlbiA9IGxhbl9oZHJfbGVuICsgc2l6ZW9mKHN0cnVjdCB0cmxsYykgKyBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKworCVNFVF9QQUdFKHJidWZmZXJfcGFnZSk7CisJbGxjID0gcmJ1ZiArIG9mZnNldG9mKHN0cnVjdCByZWNfYnVmLCBkYXRhKSArIGxhbl9oZHJfbGVuOworCisjaWYgVFJfVkVSQk9TRQorCURQUklOVEsoIm9mZnNldG9mIGRhdGE6ICUwMlggbGFuX2hkcl9sZW46ICUwMlhcbiIsCisJKF9fdTMyKSBvZmZzZXRvZihzdHJ1Y3QgcmVjX2J1ZiwgZGF0YSksICh1bnNpZ25lZCBpbnQpIGxhbl9oZHJfbGVuKTsKKwlEUFJJTlRLKCJsbGM6ICUwOFggcmVjX2J1Zl9hZGRyOiAlMDRYIGRldi0+bWVtX3N0YXJ0OiAlbFhcbiIsCisJCWxsYywgbnRvaHMocmFyYi5yZWNfYnVmX2FkZHIpLCBkZXYtPm1lbV9zdGFydCk7CisJRFBSSU5USygiZHNhcDogJTAyWCwgc3NhcDogJTAyWCwgbGxjOiAlMDJYLCBwcm90aWQ6ICUwMlglMDJYJTAyWCwgIgorCQkiZXRoZXJ0eXBlOiAlMDRYXG4iLAorCQkoaW50KSByZWFkYihsbGMgKyBEU0FQX09GU1QpLCAoaW50KSByZWFkYihsbGMgKyBTU0FQX09GU1QpLAorCQkoaW50KSByZWFkYihsbGMgKyBMTENfT0ZTVCksIChpbnQpIHJlYWRiKGxsYyArIFBST1RJRF9PRlNUKSwKKwkJKGludCkgcmVhZGIobGxjK1BST1RJRF9PRlNUKzEpLChpbnQpcmVhZGIobGxjK1BST1RJRF9PRlNUICsgMiksCisJCShpbnQpIG50b2hzKHJlYWR3KGxsYyArIEVUSEVSVFlQRV9PRlNUKSkpOworI2VuZGlmCisJaWYgKHJlYWRiKGxsYyArIG9mZnNldG9mKHN0cnVjdCB0cmxsYywgbGxjKSkgIT0gVUlfQ01EKSB7CisJCVNFVF9QQUdFKHRpLT5hc2JfcGFnZSk7CisJCXdyaXRlYihEQVRBX0xPU1QsIHRpLT5hc2IgKyBSRVRDT0RFX09GU1QpOworCQl0aS0+dHJfc3RhdHMucnhfZHJvcHBlZCsrOworCQl3cml0ZWIoUkVTUF9JTl9BU0IsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JBX09ERCk7CisJCXJldHVybjsKKwl9CisJbGVuZ3RoID0gbnRvaHMocmFyYi5mcmFtZV9sZW4pOworCWlmIChyZWFkYihsbGMgKyBEU0FQX09GU1QpID09IEVYVEVOREVEX1NBUCAmJgorCSAgIHJlYWRiKGxsYyArIFNTQVBfT0ZTVCkgPT0gRVhURU5ERURfU0FQICYmCisJCWxlbmd0aCA+PSBoZHJfbGVuKQlJUHY0X3AgPSAxOworI2lmIFRSX1ZFUkJPU0UKKyNkZWZpbmUgU0FERFJfT0ZTVAk4CisjZGVmaW5lIERBRERSX09GU1QJMgorCisJaWYgKCFJUHY0X3ApIHsKKworCQl2b2lkIF9faW9tZW0gKnRyaGhkciA9IHJidWYgKyBvZmZzZXRvZihzdHJ1Y3QgcmVjX2J1ZiwgZGF0YSk7CisKKwkJRFBSSU5USygiUHJvYmFibHkgbm9uLUlQIGZyYW1lIHJlY2VpdmVkLlxuIik7CisJCURQUklOVEsoInNzYXA6ICUwMlggZHNhcDogJTAyWCAiCisJCQkic2FkZHI6ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICIKKwkJCSJkYWRkcjogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJCQlyZWFkYihsbGMgKyBTU0FQX09GU1QpLCByZWFkYihsbGMgKyBEU0FQX09GU1QpLAorCQkJcmVhZGIodHJoaGRyK1NBRERSX09GU1QpLCByZWFkYih0cmhoZHIrIFNBRERSX09GU1QrMSksCisJCQlyZWFkYih0cmhoZHIrU0FERFJfT0ZTVCsyKSwgcmVhZGIodHJoaGRyK1NBRERSX09GU1QrMyksCisJCQlyZWFkYih0cmhoZHIrU0FERFJfT0ZTVCs0KSwgcmVhZGIodHJoaGRyK1NBRERSX09GU1QrNSksCisJCQlyZWFkYih0cmhoZHIrREFERFJfT0ZTVCksIHJlYWRiKHRyaGhkcitEQUREUl9PRlNUICsgMSksCisJCQlyZWFkYih0cmhoZHIrREFERFJfT0ZTVCsyKSwgcmVhZGIodHJoaGRyK0RBRERSX09GU1QrMyksCisJCQlyZWFkYih0cmhoZHIrREFERFJfT0ZTVCs0KSwgcmVhZGIodHJoaGRyK0RBRERSX09GU1QrNSkpOworCX0KKyNlbmRpZgorCisJLypCTVMgaGFuZGxlIHRoZSBjYXNlIHNoZSBjb21lcyBpbiB3aXRoIGZldyBob3BzIGJ1dCBsZWF2ZXMgd2l0aCBtYW55ICovCisgICAgICAgIHNrYl9zaXplPWxlbmd0aC1sYW5faGRyX2xlbitzaXplb2Yoc3RydWN0IHRyaF9oZHIpK3NpemVvZihzdHJ1Y3QgdHJsbGMpOworCisJaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihza2Jfc2l6ZSkpKSB7CisJCURQUklOVEsoIm91dCBvZiBtZW1vcnkuIGZyYW1lIGRyb3BwZWQuXG4iKTsKKwkJdGktPnRyX3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJU0VUX1BBR0UodGktPmFzYl9wYWdlKTsKKwkJd3JpdGViKERBVEFfTE9TVCwgdGktPmFzYiArIG9mZnNldG9mKHN0cnVjdCBhc2JfcmVjLCByZXRfY29kZSkpOworCQl3cml0ZWIoUkVTUF9JTl9BU0IsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JBX09ERCk7CisJCXJldHVybjsKKwl9CisJLypCTVMgYWdhaW4sIGlmIHNoZSBjb21lcyBpbiB3aXRoIGZldyBidXQgbGVhdmVzIHdpdGggbWFueSAqLworCXNrYl9yZXNlcnZlKHNrYiwgc2l6ZW9mKHN0cnVjdCB0cmhfaGRyKSAtIGxhbl9oZHJfbGVuKTsKKwlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKwlza2ItPmRldiA9IGRldjsKKwlkYXRhID0gc2tiLT5kYXRhOworCXJidWZmZXJfbGVuID0gbnRvaHMocmVhZHcocmJ1ZiArIG9mZnNldG9mKHN0cnVjdCByZWNfYnVmLCBidWZfbGVuKSkpOworCXJidWZkYXRhID0gcmJ1ZiArIG9mZnNldG9mKHN0cnVjdCByZWNfYnVmLCBkYXRhKTsKKworCWlmIChJUHY0X3ApIHsKKwkJLyogQ29weSB0aGUgaGVhZGVycyB3aXRob3V0IGNoZWNrc3VtbWluZyAqLworCQltZW1jcHlfZnJvbWlvKGRhdGEsIHJidWZkYXRhLCBoZHJfbGVuKTsKKworCQkvKiBXYXRjaCBmb3IgcGFkZGVkIHBhY2tldHMgYW5kIGJvZ29ucyAqLworCQlpcGg9IChzdHJ1Y3QgaXBoZHIgKikoZGF0YSsgbGFuX2hkcl9sZW4gKyBzaXplb2Yoc3RydWN0IHRybGxjKSk7CisJCWlwX2xlbiA9IG50b2hzKGlwaC0+dG90X2xlbikgLSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwkJbGVuZ3RoIC09IGhkcl9sZW47CisJCWlmICgoaXBfbGVuIDw9IGxlbmd0aCkgJiYgKGlwX2xlbiA+IDcpKQorCQkJbGVuZ3RoID0gaXBfbGVuOworCQlkYXRhICs9IGhkcl9sZW47CisJCXJidWZmZXJfbGVuIC09IGhkcl9sZW47CisJCXJidWZkYXRhICs9IGhkcl9sZW47CisJfQorCS8qIENvcHkgdGhlIHBheWxvYWQuLi4gKi8KKyNkZWZpbmUgQlVGRkVSX1BPSU5URVJfT0ZTVAkyCisjZGVmaW5lIEJVRkZFUl9MRU5HVEhfT0ZTVCAgICAgIDYKKwlmb3IgKDs7KSB7CisJCWlmIChpYm10cl9kZWJ1Z190cmFjZSZUUkNfSU5JVFYgJiYgbGVuZ3RoIDwgcmJ1ZmZlcl9sZW4pCisJCQlEUFJJTlRLKCJDVVJJT1VTLCBsZW5ndGg9JWQgPCByYnVmZmVyX2xlbj0lZFxuIiwKKwkJCQkJCWxlbmd0aCxyYnVmZmVyX2xlbik7CisJCWlmIChJUHY0X3ApCisJCQljaGtzdW09Y3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjaygodm9pZCopcmJ1ZmRhdGEsCisJCQkgICAgZGF0YSxsZW5ndGg8cmJ1ZmZlcl9sZW4/bGVuZ3RoOnJidWZmZXJfbGVuLGNoa3N1bSk7CisJCWVsc2UKKwkJCW1lbWNweV9mcm9taW8oZGF0YSwgcmJ1ZmRhdGEsIHJidWZmZXJfbGVuKTsKKwkJcmJ1ZmZlciA9IG50b2hzKHJlYWR3KHJidWYrQlVGRkVSX1BPSU5URVJfT0ZTVCkpIDsKKwkJaWYgKCFyYnVmZmVyKQorCQkJYnJlYWs7CisJCXJidWZmZXIgLT0gMjsKKwkJbGVuZ3RoIC09IHJidWZmZXJfbGVuOworCQlkYXRhICs9IHJidWZmZXJfbGVuOworCQlyYnVmID0gbWFwX2FkZHJlc3ModGksIHJidWZmZXIsICZyYnVmZmVyX3BhZ2UpOworCQlTRVRfUEFHRShyYnVmZmVyX3BhZ2UpOworCQlyYnVmZmVyX2xlbiA9IG50b2hzKHJlYWR3KHJidWYgKyBCVUZGRVJfTEVOR1RIX09GU1QpKTsKKwkJcmJ1ZmRhdGEgPSByYnVmICsgb2Zmc2V0b2Yoc3RydWN0IHJlY19idWYsIGRhdGEpOworCX0KKworCVNFVF9QQUdFKHRpLT5hc2JfcGFnZSk7CisJd3JpdGViKDAsIHRpLT5hc2IgKyBvZmZzZXRvZihzdHJ1Y3QgYXNiX3JlYywgcmV0X2NvZGUpKTsKKworCXdyaXRlYihSRVNQX0lOX0FTQiwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUkFfT0REKTsKKworCXRpLT50cl9zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwl0aS0+dHJfc3RhdHMucnhfcGFja2V0cysrOworCisJc2tiLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCWlmIChJUHY0X3ApIHsKKwkJc2tiLT5jc3VtID0gY2hrc3VtOworCQlza2ItPmlwX3N1bW1lZCA9IDE7CisJfQorCW5ldGlmX3J4KHNrYik7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK30JCQkJLyp0cl9yeCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgaWJtdHJfcmVzZXRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRtciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl0bXItPmV4cGlyZXMgPSBqaWZmaWVzICsgVFJfUkVUUllfSU5URVJWQUw7CisJdG1yLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwl0bXItPmZ1bmN0aW9uID0gdG9rX3JlcnVuOworCWluaXRfdGltZXIodG1yKTsKKwlhZGRfdGltZXIodG1yKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHRva19yZXJ1bih1bnNpZ25lZCBsb25nIGRldl9hZGRyKXsKKworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfYWRkcjsKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisKKwlpZiAoIHRpLT5vcGVuX2FjdGlvbiA9PSBSRVNUQVJUKXsKKwkJdGktPmRvX3Rva19pbnQgPSBGSVJTVF9JTlQ7CisJCW91dGIoMCwgZGV2LT5iYXNlX2FkZHIgKyBBREFQVFJFU0VUUkVMKTsKKyNpZmRlZiBFTkFCTEVfUEFHSU5HCisJCWlmICh0aS0+cGFnZV9tYXNrKQorCQkJd3JpdGViKFNSUFJfRU5BQkxFX1BBR0lORywKKwkJCQl0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUlcgKyBTUlBSX0VWRU4pOworI2VuZGlmCisKKwkJd3JpdGViKElOVF9FTkFCTEUsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JQX0VWRU4pOworCX0gZWxzZQorCQl0b2tfb3Blbl9hZGFwdGVyKGRldl9hZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGlibXRyX3JlYWRsb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpOworCisJdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKworCXRpLT5yZWFkbG9nX3BlbmRpbmcgPSAwOworCVNFVF9QQUdFKHRpLT5zcmJfcGFnZSk7CisJd3JpdGViKERJUl9SRUFEX0xPRywgdGktPnNyYik7CisJd3JpdGViKElOVF9FTkFCTEUsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JQX0VWRU4pOworCXdyaXRlYihDTURfSU5fU1JCLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogdG9rX2dldF9zdGF0cygpOiAgQmFzaWNhbGx5IGEgc2NhZmZvbGQgcm91dGluZSB3aGljaCB3aWxsIHJldHVybgorICAgdGhlIGFkZHJlc3Mgb2YgdGhlIHRyX3N0YXRpc3RpY3Mgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aAorICAgdGhpcyBkZXZpY2UgLS0gdGhlIHRyLi4uLiBzdHJ1Y3R1cmUgaXMgYW4gZXRobmV0IGxvb2stYWxpa2UKKyAgIHNvIGF0IGxlYXN0IGZvciB0aGlzIGl0ZXJhdGlvbiBtYXkgc3VmZmljZS4gICAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnRva19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCB0b2tfaW5mbyAqdG9raTsKKwl0b2tpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisJcmV0dXJuIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSAmdG9raS0+dHJfc3RhdHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGlibXRyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSkKK3sKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisKKwlpZiAodGktPnJpbmdfc3BlZWQgPT0gMTYgJiYgbXR1ID4gdGktPm1heG10dTE2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodGktPnJpbmdfc3BlZWQgPT0gNCAmJiBtdHUgPiB0aS0+bWF4bXR1NCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5tdHUgPSBtdHU7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBNT0RVTEUKKworLyogM0NPTSAzQzYxOUMgc3VwcG9ydHMgOCBpbnRlcnJ1cHRzLCAzMiBJL08gcG9ydHMgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2libXRyW0lCTVRSX01BWF9BREFQVEVSU107CitzdGF0aWMgaW50IGlvW0lCTVRSX01BWF9BREFQVEVSU10gPSB7IDB4YTIwLCAweGEyNCB9Oworc3RhdGljIGludCBpcnFbSUJNVFJfTUFYX0FEQVBURVJTXTsKK3N0YXRpYyBpbnQgbWVtW0lCTVRSX01BWF9BREFQVEVSU107CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShtZW0sIGludCwgTlVMTCwgMCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGlibXRyX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgY291bnQ9MDsKKworCWZpbmRfdHVyYm9fYWRhcHRlcnMoaW8pOworCisJZm9yIChpID0gMDsgaW9baV0gJiYgKGkgPCBJQk1UUl9NQVhfQURBUFRFUlMpOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwkJaXJxW2ldID0gMDsKKwkJbWVtW2ldID0gMDsKKwkJZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCB0b2tfaW5mbykpOworCQlpZiAoZGV2ID09IE5VTEwpIHsgCisJCQlpZiAoaSA9PSAwKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1tpXTsKKwkJZGV2LT5pcnEgPSBpcnFbaV07CisJCWRldi0+bWVtX3N0YXJ0ID0gbWVtW2ldOworCisJCWlmIChpYm10cl9wcm9iZV9jYXJkKGRldikpIHsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQljb250aW51ZTsKKwkJfQorCQlkZXZfaWJtdHJbaV0gPSBkZXY7CisJCWNvdW50Kys7CisJfQorCWlmIChjb3VudCkgcmV0dXJuIDA7CisJcHJpbnRrKCJpYm10cjogcmVnaXN0ZXJfbmV0ZGV2KCkgcmV0dXJuZWQgbm9uLXplcm8uXG4iKTsKKwlyZXR1cm4gLUVJTzsKK30KK21vZHVsZV9pbml0KGlibXRyX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgaWJtdHJfY2xlYW51cCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElCTVRSX01BWF9BREFQVEVSUzsgaSsrKXsKKwkJaWYgKCFkZXZfaWJtdHJbaV0pCisJCQljb250aW51ZTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X2libXRyW2ldKTsKKwkJaWJtdHJfY2xlYW51cF9jYXJkKGRldl9pYm10cltpXSk7CisJCWZyZWVfbmV0ZGV2KGRldl9pYm10cltpXSk7CisJfQorfQorbW9kdWxlX2V4aXQoaWJtdHJfY2xlYW51cCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9sYW5zdHJlYW1lci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllMGIwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9sYW5zdHJlYW1lci5jCkBAIC0wLDAgKzEsMjAxMSBAQAorLyoKKyAqICAgbGFuc3RyZWFtZXIuYyAtLSBkcml2ZXIgZm9yIHRoZSBJQk0gQXV0byBMQU5TdHJlYW1lciBQQ0kgQWRhcHRlcgorICoKKyAqICBXcml0dGVuIEJ5OiBNaWtlIFN1bGxpdmFuLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqICBMaW51eCBkcml2ZXIgZm9yIElCTSBQQ0kgdG9rZW5yaW5nIGNhcmRzIGJhc2VkIG9uIHRoZSBMYW5TdHJlYW1lciBNUEMKKyAqICBjaGlwc2V0LiAKKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIG9seW1waWMgZHJpdmVyIGZvciBJQk0gUENJIFRva2VuUmluZyBjYXJkcyAoUGl0L1BpdC1QaHkvT2x5bXBpYworICogIGNoaXBzZXRzKSB3cml0dGVuICBieToKKyAqICAgICAgMTk5OSBQZXRlciBEZSBTY2hyaWp2ZXIgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoJMTk5OSBNaWtlIFBoaWxsaXBzIChwaGlsbGltQGFtdHJhay5jb20pCisgKgorICogIEJhc2UgRHJpdmVyIFNrZWxldG9uOgorICogICAgICBXcml0dGVuIDE5OTMtOTQgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqICAgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgIAorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgICAKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICAgCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICAgCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgICAKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogTk8gV0FSUkFOVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAgICAgICAgCisgKiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCAgICAgIAorICogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgICAgICAKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgICAgCisgKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kICAgICAgIAorICogZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzICAgICAgICAKKyAqIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byAgICAgCisgKiB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCAgICAgICAgIAorICogcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgICAKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCAgICAgICAgCisgKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCAgIAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICAgICAKKyAqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgICAgCisgKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgIAorICogSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUyAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAgIAorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgICAKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCisgKiAgMTIvMTAvOTkgLSBBbHBoYSBSZWxlYXNlIDAuMS4wCisgKiAgICAgICAgICAgIEZpcnN0IHJlbGVhc2UgdG8gdGhlIHB1YmxpYworICogIDAzLzAzLzAwIC0gTWVyZ2VkIHRvIGtlcm5lbCwgaW5kZW50ZWQgLWtyIC1pOCAtYnJpMCwgZml4ZWQgc29tZSBtaXNzaW5nCisgKgkJbWFsbG9jIGZyZWUgY2hlY2tzLCByZXZpZXdlZCBjb2RlLiA8YWxhbkByZWRoYXQuY29tPgorICogIDAzLzEzLzAwIC0gQWRkZWQgc3BpbmxvY2tzIGZvciBzbXAKKyAqICAwMy8wOC8wMSAtIEFkZGVkIHN1cHBvcnQgZm9yIG1vZHVsZV9pbml0KCkgYW5kIG1vZHVsZV9leGl0KCkKKyAqICAwOC8xNS8wMSAtIEFkZGVkIGlvY3RsKCkgZnVuY3Rpb25hbGl0eSBmb3IgZGVidWdnaW5nLCBjaGFuZ2VkIG5ldGlmXypfcXVldWUKKyAqICAgICAgICAgICAgIGNhbGxzIGFuZCBvdGhlciBpbmNvcnJlY3RuZXNzIC0gS2VudCBZb2RlciA8eW9kZXIxQHVzLmlibS5jb20+CisgKiAgMTEvMDUvMDEgLSBSZXN0cnVjdHVyZWQgdGhlIGludGVycnVwdCBmdW5jdGlvbiwgYWRkZWQgZGVsYXlzLCByZWR1Y2VkIHRoZSAKKyAqICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgVFggZGVzY3JpcHRvcnMgdG8gMSwgd2hpY2ggdG9nZXRoZXIgY2FuIHByZXZlbnQgCisgKiAgICAgICAgICAgICB0aGUgY2FyZCBmcm9tIGxvY2tpbmcgdXAgdGhlIGJveCAtIDx5b2RlcjFAdXMuaWJtLmNvbT4KKyAqICAwOS8yNy8wMiAtIE5ldyBQQ0kgaW50ZXJmYWNlICsgYnVnIGZpeC4gLSA8eW9kZXIxQHVzLmlibS5jb20+CisgKiAgMTEvMTMvMDIgLSBSZW1vdmVkIGZyZWVfaXJxIGNhbGxzIHdoaWNoIGNvdWxkIGNhdXNlIGEgaGFuZywgYWRkZWQKKyAqCSAgICAgICBuZXRpZl9jYXJyaWVyX3tvbnxvZmZ9IC0gPHlvZGVyMUB1cy5pYm0uY29tPgorICogIAorICogIFRvIERvOgorICoKKyAqCisgKiAgSWYgUHJvYmxlbXMgZG8gT2NjdXIKKyAqICBNb3N0IHByb2JsZW1zIGNhbiBiZSByZWN0aWZpZWQgYnkgZWl0aGVyIGNsb3NpbmcgYW5kIG9wZW5pbmcgdGhlIGludGVyZmFjZQorICogIChpZmNvbmZpZyBkb3duIGFuZCB1cCkgb3Igcm1tb2QgYW5kIGluc21vZCdpbmcgdGhlIGRyaXZlciAoYSBiaXQgZGlmZmljdWx0CisgKiAgaWYgY29tcGlsZWQgaW50byB0aGUga2VybmVsKS4KKyAqLworCisvKiBDaGFuZ2UgU1RSRUFNRVJfREVCVUcgdG8gMSB0byBnZXQgdmVyYm9zZSwgYW5kIEkgbWVhbiByZWFsbHkgdmVyYm9zZSwgbWVzc2FnZXMgKi8KKworI2RlZmluZSBTVFJFQU1FUl9ERUJVRyAwCisjZGVmaW5lIFNUUkVBTUVSX0RFQlVHX1BBQ0tFVFMgMAorCisvKiBDaGFuZ2UgU1RSRUFNRVJfTkVUV09SS19NT05JVE9SIHRvIHJlY2VpdmUgbWFjIGZyYW1lcyB0aHJvdWdoIHRoZSBhcmIgY2hhbm5lbC4KKyAqIFdpbGwgYWxzbyBjcmVhdGUgYSAvcHJvYy9uZXQvc3RyZWFtZXJfdHIgZW50cnkgaWYgcHJvY19mcyBpcyBjb21waWxlZCBpbnRvIHRoZQorICoga2VybmVsLgorICogSW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjcmVhdGUgYSByaW5nLWVycm9yIHJlcG9ydGluZyBuZXR3b3JrIG1vZHVsZSAKKyAqIGkuZS4gaXQgd2lsbCBnaXZlIHlvdSB0aGUgc291cmNlIGFkZHJlc3Mgb2YgYmVhY29uZXJzIG9uIHRoZSByaW5nIAorICovCisKKyNkZWZpbmUgU1RSRUFNRVJfTkVUV09SS19NT05JVE9SIDAKKworLyogI2RlZmluZSBDT05GSUdfUFJPQ19GUyAqLworCisvKgorICogIEFsbG93IG9yIGRpc2FsbG93IGlvY3RsJ3MgZm9yIGRlYnVnZ2luZworICovCisKKyNkZWZpbmUgU1RSRUFNRVJfSU9DVEwgMAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgImxhbnN0cmVhbWVyLmgiCisKKyNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKKyNlcnJvciBicm9rZW4gb24gNjQtYml0OiBzdG9yZXMgcG9pbnRlciB0byByeF9yaW5nLT5idWZmZXIgaW4gMzItYml0IGludAorI2VuZGlmCisKKworLyogSSd2ZSBnb3QgdG8gcHV0IHNvbWUgaW50ZWxsaWdlbmNlIGludG8gdGhlIHZlcnNpb24gbnVtYmVyIHNvIHRoYXQgUGV0ZXIgYW5kIEkga25vdworICogd2hpY2ggdmVyc2lvbiBvZiB0aGUgY29kZSBzb21lYm9keSBoYXMgZ290LiAKKyAqIFZlcnNpb24gTnVtYmVyID0gYS5iLmMuZCAgd2hlcmUgYS5iLmMgaXMgdGhlIGxldmVsIG9mIGNvZGUgYW5kIGQgaXMgdGhlIGxhdGVzdCBhdXRob3IuCisgKiBTbyAwLjAuMS5wZHMgPSBQZXRlciwgMC4wLjEubWxwID0gTWlrZQorICogCisgKiBPZmZpY2lhbCByZWxlYXNlcyB3aWxsIG9ubHkgaGF2ZSBhbiBhLmIuYyB2ZXJzaW9uIG51bWJlciBmb3JtYXQuCisgKi8KKworc3RhdGljIGNoYXIgdmVyc2lvbltdID0gIkxhblN0cmVhbWVyLmMgdjAuNC4wIDAzLzA4LzAxIC0gTWlrZSBTdWxsaXZhblxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgdjAuNS4zIDExLzEzLzAyIC0gS2VudCBZb2RlciI7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzdHJlYW1lcl9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fVFIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwKKwl7fQkvKiB0ZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLHN0cmVhbWVyX3BjaV90YmwpOworCisKK3N0YXRpYyBjaGFyICpvcGVuX21hal9lcnJvcltdID0geworCSJObyBlcnJvciIsICJMb2JlIE1lZGlhIFRlc3QiLCAiUGh5c2ljYWwgSW5zZXJ0aW9uIiwKKwkiQWRkcmVzcyBWZXJpZmljYXRpb24iLCAiTmVpZ2hib3IgTm90aWZpY2F0aW9uIChSaW5nIFBvbGwpIiwKKwkiUmVxdWVzdCBQYXJhbWV0ZXJzIiwgIkZEWCBSZWdpc3RyYXRpb24gUmVxdWVzdCIsCisJIkZEWCBMb2JlIE1lZGlhIFRlc3QiLCAiRkRYIER1cGxpY2F0ZSBBZGRyZXNzIENoZWNrIiwKKwkiVW5rbm93biBzdGFnZSIKK307CisKK3N0YXRpYyBjaGFyICpvcGVuX21pbl9lcnJvcltdID0geworCSJObyBlcnJvciIsICJGdW5jdGlvbiBGYWlsdXJlIiwgIlNpZ25hbCBMb3N0IiwgIldpcmUgRmF1bHQiLAorCSJSaW5nIFNwZWVkIE1pc21hdGNoIiwgIlRpbWVvdXQiLCAiUmluZyBGYWlsdXJlIiwgIlJpbmcgQmVhY29uaW5nIiwKKwkiRHVwbGljYXRlIE5vZGUgQWRkcmVzcyIsICJSZXF1ZXN0IFBhcmFtZXRlcnMiLCAiUmVtb3ZlIFJlY2VpdmVkIiwKKwkiUmVzZXJ2ZWQiLCAiUmVzZXJ2ZWQiLCAiTm8gTW9uaXRvciBEZXRlY3RlZCBmb3IgUlBMIiwKKwkiTW9uaXRvciBDb250ZW50aW9uIGZhaWxlciBmb3IgUlBMIiwgIkZEWCBQcm90b2NvbCBFcnJvciIKK307CisKKy8qIE1vZHVsZSBwYXJhbXRlcnMgKi8KKworLyogUmluZyBTcGVlZCAwLDQsMTYKKyAqIDAgPSBBdXRvc2Vuc2UgICAgICAgICAKKyAqIDQsMTYgPSBTZWxlY3RlZCBzcGVlZCBvbmx5LCBubyBhdXRvc2Vuc2UKKyAqIFRoaXMgYWxsb3dzIHRoZSBjYXJkIHRvIGJlIHRoZSBmaXJzdCBvbiB0aGUgcmluZworICogYW5kIGJlY29tZSB0aGUgYWN0aXZlIG1vbml0b3IuCisgKgorICogV0FSTklORzogU29tZSBodWJzIHdpbGwgYWxsb3cgeW91IHRvIGluc2VydAorICogYXQgdGhlIHdyb25nIHNwZWVkCisgKi8KKworc3RhdGljIGludCByaW5nc3BlZWRbU1RSRUFNRVJfTUFYX0FEQVBURVJTXSA9IHsgMCwgfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KHJpbmdzcGVlZCwgaW50LCBOVUxMLCAwKTsKKworLyogUGFja2V0IGJ1ZmZlciBzaXplICovCisKK3N0YXRpYyBpbnQgcGt0X2J1Zl9zeltTVFJFQU1FUl9NQVhfQURBUFRFUlNdID0geyAwLCB9OworCittb2R1bGVfcGFyYW1fYXJyYXkocGt0X2J1Zl9zeiwgaW50LCBOVUxMLCAwKTsKKworLyogTWVzc2FnZSBMZXZlbCAqLworCitzdGF0aWMgaW50IG1lc3NhZ2VfbGV2ZWxbU1RSRUFNRVJfTUFYX0FEQVBURVJTXSA9IHsgMSwgfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1lc3NhZ2VfbGV2ZWwsIGludCwgTlVMTCwgMCk7CisKKyNpZiBTVFJFQU1FUl9JT0NUTAorc3RhdGljIGludCBzdHJlYW1lcl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50KTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHN0cmVhbWVyX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzdHJlYW1lcl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzdHJlYW1lcl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzdHJlYW1lcl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHN0cmVhbWVyX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHN0cmVhbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdHJlYW1lcl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHN0cmVhbWVyX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKTsKK3N0YXRpYyB2b2lkIHN0cmVhbWVyX2FyYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHN0cmVhbWVyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSk7CitzdGF0aWMgdm9pZCBzdHJlYW1lcl9zcmJfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzdHJlYW1lcl9hc2JfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjaWYgU1RSRUFNRVJfTkVUV09SS19NT05JVE9SCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQgc3RyZWFtZXJfcHJvY19pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgICBpbnQgbGVuZ3RoLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IHNwcmludGZfaW5mbyhjaGFyICpidWZmZXIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKmRldl9zdHJlYW1lcj1OVUxMOworI2VuZGlmCisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgc3RyZWFtZXJfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdjsKKwl1bnNpZ25lZCBsb25nIHBpb19zdGFydCwgcGlvX2VuZCwgcGlvX2ZsYWdzLCBwaW9fbGVuOworCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydCwgbW1pb19lbmQsIG1taW9fZmxhZ3MsIG1taW9fbGVuOworCWludCByYyA9IDA7CisJc3RhdGljIGludCBjYXJkX25vPS0xOworCXUxNiBwY3I7CisKKyNpZiBTVFJFQU1FUl9ERUJVRworCXByaW50aygibGFuc3RyZWFtZXI6OnN0cmVhbWVyX2luaXRfb25lLCBlbnRyeSBwZGV2ICVwXG4iLHBkZXYpOworI2VuZGlmCisKKwljYXJkX25vKys7CisJZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKCpzdHJlYW1lcl9wcml2KSk7CisJaWYgKGRldj09TlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImxhbnN0cmVhbWVyOiBvdXQgb2YgbWVtb3J5LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlzdHJlYW1lcl9wcml2ID0gZGV2LT5wcml2OworCisjaWYgU1RSRUFNRVJfTkVUV09SS19NT05JVE9SCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlpZiAoIWRldl9zdHJlYW1lcikKKwkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgibmV0L3N0cmVhbWVyX3RyIiwgMCwgMCwKKwkJCQkJc3RyZWFtZXJfcHJvY19pbmZvLCBOVUxMKTsgCisJc3RyZWFtZXJfcHJpdi0+bmV4dCA9IGRldl9zdHJlYW1lcjsKKwlkZXZfc3RyZWFtZXIgPSBzdHJlYW1lcl9wcml2OworI2VuZGlmCisjZW5kaWYKKworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweEZGRkZGRkZGVUxMKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogTm8gc3VpdGFibGUgUENJIG1hcHBpbmcgYXZhaWxhYmxlLlxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgImxhbnN0cmVhbWVyOiB1bmFibGUgdG8gZW5hYmxlIHBjaSBkZXZpY2VcbiIpOworCQlyYz0tRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlyYyA9IHBjaV9zZXRfbXdpKHBkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgImxhbnN0cmVhbWVyOiB1bmFibGUgdG8gZW5hYmxlIE1XSSBvbiBwY2kgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisJfQorCisJcGlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCXBpb19lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDApOworCXBpb19mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKTsKKwlwaW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKworCW1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJbW1pb19lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDEpOworCW1taW9fZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMSk7CisJbW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpOworCisjaWYgU1RSRUFNRVJfREVCVUcKKwlwcmludGsoImxhbnN0cmVhbWVyOiBwaW9fc3RhcnQgJXggcGlvX2VuZCAleCBwaW9fbGVuICV4IHBpb19mbGFncyAleFxuIiwKKwkJcGlvX3N0YXJ0LCBwaW9fZW5kLCBwaW9fbGVuLCBwaW9fZmxhZ3MpOworCXByaW50aygibGFuc3RyZWFtZXI6IG1taW9fc3RhcnQgJXggbW1pb19lbmQgJXggbW1pb19sZW4gJXggbW1pb19mbGFncyAleFxuIiwKKwkJbW1pb19zdGFydCwgbW1pb19lbmQsIG1taW9fZmxhZ3MsIG1taW9fbGVuKTsKKyNlbmRpZgorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwaW9fc3RhcnQsIHBpb19sZW4sICJsYW5zdHJlYW1lciIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGFuc3RyZWFtZXI6IHVuYWJsZSB0byBnZXQgcGNpIGlvIGFkZHIgJWx4XG4iLAorCQkJcGlvX3N0YXJ0KTsKKwkJcmM9IC1FQlVTWTsKKwkJZ290byBlcnJfb3V0X213aTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtbWlvX3N0YXJ0LCBtbWlvX2xlbiwgImxhbnN0cmVhbWVyIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsYW5zdHJlYW1lcjogdW5hYmxlIHRvIGdldCBwY2kgbW1pbyBhZGRyICVseFxuIiwKKwkJCW1taW9fc3RhcnQpOworCQlyYz0gLUVCVVNZOworCQlnb3RvIGVycl9vdXRfZnJlZV9waW87CisJfQorCisJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbz1pb3JlbWFwKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKKwlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGFuc3RyZWFtZXI6IHVuYWJsZSB0byByZW1hcCBNTUlPICVseFxuIiwKKwkJCW1taW9fc3RhcnQpOworCQlyYz0gLUVJTzsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbW1pbzsKKwl9CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdHJlYW1lcl9wcml2LT5zcmJfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc3RyZWFtZXJfcHJpdi0+dHJiX3dhaXQpOworCisJZGV2LT5vcGVuID0gJnN0cmVhbWVyX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc3RyZWFtZXJfeG1pdDsKKwlkZXYtPmNoYW5nZV9tdHUgPSAmc3RyZWFtZXJfY2hhbmdlX210dTsKKwlkZXYtPnN0b3AgPSAmc3RyZWFtZXJfY2xvc2U7CisjaWYgU1RSRUFNRVJfSU9DVEwKKwlkZXYtPmRvX2lvY3RsID0gJnN0cmVhbWVyX2lvY3RsOworI2Vsc2UKKwlkZXYtPmRvX2lvY3RsID0gTlVMTDsKKyNlbmRpZgorCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnN0cmVhbWVyX3NldF9yeF9tb2RlOworCWRldi0+Z2V0X3N0YXRzID0gJnN0cmVhbWVyX2dldF9zdGF0czsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZzdHJlYW1lcl9zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJZGV2LT5iYXNlX2FkZHI9cGlvX3N0YXJ0OworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9jYXJkX25hbWUgPSAoY2hhciAqKXBkZXYtPnJlc291cmNlWzBdLm5hbWU7CisJc3RyZWFtZXJfcHJpdi0+cGNpX2RldiA9IHBkZXY7CisKKwlpZiAoKHBrdF9idWZfc3pbY2FyZF9ub10gPCAxMDApIHx8IChwa3RfYnVmX3N6W2NhcmRfbm9dID4gMTgwMDApKQorCQlzdHJlYW1lcl9wcml2LT5wa3RfYnVmX3N6ID0gUEtUX0JVRl9TWjsKKwllbHNlCisJCXN0cmVhbWVyX3ByaXYtPnBrdF9idWZfc3ogPSBwa3RfYnVmX3N6W2NhcmRfbm9dOworCisJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcmluZ19zcGVlZCA9IHJpbmdzcGVlZFtjYXJkX25vXTsKKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tZXNzYWdlX2xldmVsID0gbWVzc2FnZV9sZXZlbFtjYXJkX25vXTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJc3Bpbl9sb2NrX2luaXQoJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xvY2spOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQgKHBkZXYsIFBDSV9DT01NQU5ELCAmcGNyKTsKKwlwY3IgfD0gUENJX0NPTU1BTkRfU0VSUjsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQgKHBkZXYsIFBDSV9DT01NQU5ELCBwY3IpOworCisJcHJpbnRrKCIlcyBcbiIsIHZlcnNpb24pOworCXByaW50aygiJXM6ICVzLiBJL08gYXQgJWh4LCBNTUlPIGF0ICVwLCB1c2luZyBpcnEgJWRcbiIsZGV2LT5uYW1lLAorCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9jYXJkX25hbWUsCisJCSh1bnNpZ25lZCBpbnQpIGRldi0+YmFzZV9hZGRyLAorCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvLCAKKwkJZGV2LT5pcnEpOworCisJaWYgKHN0cmVhbWVyX3Jlc2V0KGRldikpCisJCWdvdG8gZXJyX291dF91bm1hcDsKKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfdW5tYXA6CisJaW91bm1hcChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvKTsKK2Vycl9vdXRfZnJlZV9tbWlvOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihtbWlvX3N0YXJ0LCBtbWlvX2xlbik7CitlcnJfb3V0X2ZyZWVfcGlvOgorCXJlbGVhc2VfcmVnaW9uKHBpb19zdGFydCwgcGlvX2xlbik7CitlcnJfb3V0X213aToKKwlwY2lfY2xlYXJfbXdpKHBkZXYpOworZXJyX291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9vdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKyNpZiBTVFJFQU1FUl9ERUJVRworCXByaW50aygibGFuc3RyZWFtZXI6IEV4aXQgZXJyb3IgJXhcbiIscmMpOworI2VuZGlmCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc3RyZWFtZXJfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2PXBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdjsKKworI2lmIFNUUkVBTUVSX0RFQlVHCisJcHJpbnRrKCJsYW5zdHJlYW1lcjo6c3RyZWFtZXJfcmVtb3ZlX29uZSBlbnRyeSBwZGV2ICVwXG4iLHBkZXYpOworI2VuZGlmCisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsYW5zdHJlYW1lcjo6c3RyZWFtZXJfcmVtb3ZlX29uZSwgRVJST1IgZGV2IGlzIE5VTExcbiIpOworCQlyZXR1cm47CisJfQorCisJc3RyZWFtZXJfcHJpdj1kZXYtPnByaXY7CisJaWYgKHN0cmVhbWVyX3ByaXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImxhbnN0cmVhbWVyOjpzdHJlYW1lcl9yZW1vdmVfb25lLCBFUlJPUiBkZXYtPnByaXYgaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKyNpZiBTVFJFQU1FUl9ORVRXT1JLX01PTklUT1IKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXsKKwkJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKipwLCAqKm5leHQ7CisKKwkJZm9yIChwID0gJmRldl9zdHJlYW1lcjsgKnA7IHAgPSBuZXh0KSB7CisJCQluZXh0ID0gJigqcCktPm5leHQ7CisJCQlpZiAoKnAgPT0gc3RyZWFtZXJfcHJpdikgeworCQkJCSpwID0gKm5leHQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFkZXZfc3RyZWFtZXIpCisJCQlyZW1vdmVfcHJvY19lbnRyeSgibmV0L3N0cmVhbWVyX3RyIiwgTlVMTCk7CisJfQorI2VuZGlmCisjZW5kaWYKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaW91bm1hcChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsMSkpOworCXJlbGVhc2VfcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LDApKTsKKwlwY2lfY2xlYXJfbXdpKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK30KKworCitzdGF0aWMgaW50IHN0cmVhbWVyX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXY7CisJX191OCBfX2lvbWVtICpzdHJlYW1lcl9tbWlvOworCXVuc2lnbmVkIGxvbmcgdDsKKwl1bnNpZ25lZCBpbnQgdWFhX2FkZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJX191MTYgbWlzcjsKKworCXN0cmVhbWVyX3ByaXYgPSAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXN0cmVhbWVyX21taW8gPSBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvOworCisJd3JpdGV3KHJlYWR3KHN0cmVhbWVyX21taW8gKyBCQ1RMKSB8IEJDVExfU09GVFJFU0VULCBzdHJlYW1lcl9tbWlvICsgQkNUTCk7CisJdCA9IGppZmZpZXM7CisJLyogSG9sZCBzb2Z0IHJlc2V0IGJpdCBmb3IgYSB3aGlsZSAqLworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CisJc2NoZWR1bGVfdGltZW91dChIWik7CisJCisJd3JpdGV3KHJlYWR3KHN0cmVhbWVyX21taW8gKyBCQ1RMKSAmIH5CQ1RMX1NPRlRSRVNFVCwKKwkgICAgICAgc3RyZWFtZXJfbW1pbyArIEJDVEwpOworCisjaWYgU1RSRUFNRVJfREVCVUcKKwlwcmludGsoIkJDVEw6ICV4XG4iLCByZWFkdyhzdHJlYW1lcl9tbWlvICsgQkNUTCkpOworCXByaW50aygiR1BSOiAleFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIEdQUikpOworCXByaW50aygiU0lTUk1BU0s6ICV4XG4iLCByZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9NQVNLKSk7CisjZW5kaWYKKwl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIEJDVEwpIHwgKEJDVExfUlhfRklGT184IHwgQkNUTF9UWF9GSUZPXzgpLCBzdHJlYW1lcl9tbWlvICsgQkNUTCApOworCisJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3Jpbmdfc3BlZWQgPT0gMCkgewkvKiBBdXRvc2Vuc2UgKi8KKwkJd3JpdGV3KHJlYWR3KHN0cmVhbWVyX21taW8gKyBHUFIpIHwgR1BSX0FVVE9TRU5TRSwKKwkJICAgICAgIHN0cmVhbWVyX21taW8gKyBHUFIpOworCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSaW5nc3BlZWQgYXV0b3NlbnNlIG1vZGUgb25cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwl9IGVsc2UgaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3Jpbmdfc3BlZWQgPT0gMTYpIHsKKwkJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21lc3NhZ2VfbGV2ZWwpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVHJ5aW5nIHRvIG9wZW4gYXQgMTYgTWJwcyBhcyByZXF1ZXN0ZWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJd3JpdGV3KEdQUl8xNk1CUFMsIHN0cmVhbWVyX21taW8gKyBHUFIpOworCX0gZWxzZSBpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcmluZ19zcGVlZCA9PSA0KSB7CisJCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tZXNzYWdlX2xldmVsKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRyeWluZyB0byBvcGVuIGF0IDQgTWJwcyBhcyByZXF1ZXN0ZWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJd3JpdGV3KDAsIHN0cmVhbWVyX21taW8gKyBHUFIpOworCX0KKworCXNrYiA9IGRldl9hbGxvY19za2Ioc3RyZWFtZXJfcHJpdi0+cGt0X2J1Zl9zeik7CisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNrYiBhbGxvY2F0aW9uIGZvciBkaWFnbm9zdGljcyBmYWlsZWQuLi5wcm9jZWVkaW5nXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwl9IGVsc2UgeworCSAgICAgICAgc3RydWN0IHN0cmVhbWVyX3J4X2Rlc2MgKnJ4X3Jpbmc7CisgICAgICAgICAgICAgICAgdTggKmRhdGE7CisKKwkJcnhfcmluZz0oc3RydWN0IHN0cmVhbWVyX3J4X2Rlc2MgKilza2ItPmRhdGE7CisJCWRhdGE9KCh1OCAqKXNrYi0+ZGF0YSkrc2l6ZW9mKHN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjKTsKKwkJcnhfcmluZy0+Zm9yd2FyZD0wOworCQlyeF9yaW5nLT5zdGF0dXM9MDsKKwkJcnhfcmluZy0+YnVmZmVyPWNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsIGRhdGEsIAorCQkJCQkJCTUxMiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCXJ4X3JpbmctPmZyYW1lbGVuX2J1Zmxlbj01MTI7IAorCQl3cml0ZWwoY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgcnhfcmluZywgNTEyLCBQQ0lfRE1BX0ZST01ERVZJQ0UpKSwKKwkJCXN0cmVhbWVyX21taW8rUlhCREEpOworCX0KKworI2lmIFNUUkVBTUVSX0RFQlVHCisJcHJpbnRrKCJHUFIgPSAleFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIEdQUikpOworI2VuZGlmCisJLyogc3RhcnQgc29sbyBpbml0ICovCisJd3JpdGV3KFNJU1JfTUksIHN0cmVhbWVyX21taW8gKyBTSVNSX01BU0tfU1VNKTsKKworCXdoaWxlICghKChyZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUikpICYgU0lTUl9TUkJfUkVQTFkpKSB7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KEhaLzEwKTsKKwkJaWYgKGppZmZpZXMgLSB0ID4gNDAgKiBIWikgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIklCTSBQQ0kgdG9rZW5yaW5nIGNhcmQgbm90IHJlc3BvbmRpbmdcbiIpOworCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNUUkVBTUVSX0lPX1NQQUNFKTsKKwkJCWlmIChza2IpCisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXdyaXRldyh+U0lTUl9TUkJfUkVQTFksIHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJbWlzciA9IHJlYWR3KHN0cmVhbWVyX21taW8gKyBNSVNSX1JVTSk7CisJd3JpdGV3KH5taXNyLCBzdHJlYW1lcl9tbWlvICsgTUlTUl9SVU0pOworCisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOwkvKiByZWxlYXNlIHNrYiB1c2VkIGZvciBkaWFnbm9zdGljcyAqLworCisjaWYgU1RSRUFNRVJfREVCVUcKKwlwcmludGsoIkxBUFdXTzogJXgsIExBUEE6ICV4IExBUEU6ICAleFxuIiwKKwkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUFdXTyksIHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBBKSwKKwkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUEUpKTsKKyNlbmRpZgorCisjaWYgU1RSRUFNRVJfREVCVUcKKwl7CisJCWludCBpOworCQl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUFdXTyksCisJCSAgICAgICBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCXByaW50aygiaW5pdGlhbGl6YXRpb24gcmVzcG9uc2Ugc3JiIGR1bXA6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJCXByaW50aygiJXg6IiwKKwkJCSAgICAgICBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorCisJd3JpdGV3KHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBXV08pICsgNiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCWlmIChyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidG9rZW5yaW5nIGNhcmQgaW5pdGlhbGl6YXRpb24gZmFpbGVkLiBlcnJvcmNvZGUgOiAleFxuIiwKKwkJICAgICAgIG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBEKSkpOworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU1RSRUFNRVJfSU9fU1BBQ0UpOworCQlyZXR1cm4gLTE7CisJfQorCisJd3JpdGV3KHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBXV08pICsgOCwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCXVhYV9hZGRyID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKwlyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CS8qIHNraXAgb3ZlciBMZXZlbC5BZGRyIGZpZWxkICovCisJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfYWRkcl90YWJsZV9hZGRyID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9wYXJtc19hZGRyID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKworI2lmIFNUUkVBTUVSX0RFQlVHCisJcHJpbnRrKCJVQUEgcmVzaWRlcyBhdCAleFxuIiwgdWFhX2FkZHIpOworI2VuZGlmCisKKwkvKiBzZXR1cCB1YWEgYXJlYSBmb3IgYWNjZXNzIHdpdGggTEFQRCAqLworCXsKKwkJaW50IGk7CisJCV9fdTE2IGFkZHI7CisJCXdyaXRldyh1YWFfYWRkciwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSArPSAyKSB7CisJCSAgICAgICAgYWRkcj1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUERJTkMpKTsKKwkJCWRldi0+ZGV2X2FkZHJbaV09IChhZGRyID4+IDgpICYgMHhmZjsKKwkJCWRldi0+ZGV2X2FkZHJbaSsxXT0gYWRkciAmIDB4ZmY7CisJCX0KKyNpZiBTVFJFQU1FUl9ERUJVRworCQlwcmludGsoIkFkYXB0ZXIgYWRkcmVzczogIik7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCXByaW50aygiJTAyeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisjZW5kaWYKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RyZWFtZXJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzdHJlYW1lcl9wcml2ID0gKHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICopIGRldi0+cHJpdjsKKwlfX3U4IF9faW9tZW0gKnN0cmVhbWVyX21taW8gPSBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciBvcGVuX2Vycm9yWzI1NV07CisJaW50IGksIG9wZW5fZmluaXNoZWQgPSAxOworCV9fdTE2IHNyYl93b3JkOworCV9fdTE2IHNyYl9vcGVuOworCWludCByYzsKKworCWlmIChyZWFkdyhzdHJlYW1lcl9tbWlvK0JNQ1RMX1NVTSkgJiBCTUNUTF9SWF9FTkFCTEVEKSB7CisJICAgICAgICByYz1zdHJlYW1lcl9yZXNldChkZXYpOworCX0KKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJnN0cmVhbWVyX2ludGVycnVwdCwgU0FfU0hJUlEsICJsYW5zdHJlYW1lciIsIGRldikpIHsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorI2lmIFNUUkVBTUVSX0RFQlVHCisJcHJpbnRrKCJCTUNUTDogJXhcbiIsIHJlYWR3KHN0cmVhbWVyX21taW8gKyBCTUNUTF9TVU0pKTsKKwlwcmludGsoInBlbmRpbmcgaW50czogJXhcbiIsIHJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSKSk7CisjZW5kaWYKKworCXdyaXRldyhTSVNSX01JIHwgU0lTUl9TUkJfUkVQTFksIHN0cmVhbWVyX21taW8gKyBTSVNSX01BU0spOwkvKiBtb3JlIGludHMgbGF0ZXIsIGRvZXNuJ3Qgc3RvcCBhcmIgY21kIGludGVycnVwdCAqLworCXdyaXRldyhMSVNSX0xJRSwgc3RyZWFtZXJfbW1pbyArIExJU1IpOwkvKiBtb3JlIGludHMgbGF0ZXIgKi8KKworCS8qIGFkYXB0ZXIgaXMgY2xvc2VkLCBzbyBTUkIgaXMgcG9pbnRlZCB0byBieSBMQVBXV08gKi8KKwl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUFdXTyksIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKworI2lmIFNUUkVBTUVSX0RFQlVHCisJcHJpbnRrKCJMQVBXV086ICV4LCBMQVBBOiAleFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUFdXTyksCisJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBBKSk7CisJcHJpbnRrKCJMQVBFOiAleFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUEUpKTsKKwlwcmludGsoIlNJU1IgTWFzayA9ICUwNHhcbiIsIHJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSX01BU0spKTsKKyNlbmRpZgorCWRvIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IFNSQl9DT01NQU5EX1NJWkU7IGkgKz0gMikgeworCQkJd3JpdGV3KDAsIHN0cmVhbWVyX21taW8gKyBMQVBESU5DKTsKKwkJfQorCisJCXdyaXRldyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUFdXTyksc3RyZWFtZXJfbW1pbytMQVBBKTsKKwkJd3JpdGV3KGh0b25zKFNSQl9PUEVOX0FEQVBURVI8PDgpLHN0cmVhbWVyX21taW8rTEFQRElOQykgOyAJLyogb3BlbiAqLworCQl3cml0ZXcoaHRvbnMoU1RSRUFNRVJfQ0xFQVJfUkVUX0NPREU8PDgpLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCXdyaXRldyhTVFJFQU1FUl9DTEVBUl9SRVRfQ09ERSwgc3RyZWFtZXJfbW1pbyArIExBUERJTkMpOworCisJCXdyaXRldyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQV1dPKSArIDgsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKyNpZiBTVFJFQU1FUl9ORVRXT1JLX01PTklUT1IKKwkJLyogSWYgTmV0d29yayBNb25pdG9yLCBpbnN0cnVjdCBjYXJkIHRvIGNvcHkgTUFDIGZyYW1lcyB0aHJvdWdoIHRoZSBBUkIgKi8KKwkJd3JpdGV3KGh0b25zKE9QRU5fQURBUFRFUl9FTkFCTEVfRkRYIHwgT1BFTl9BREFQVEVSX1BBU1NfQURDX01BQyB8IE9QRU5fQURBUFRFUl9QQVNTX0FUVF9NQUMgfCBPUEVOX0FEQVBURVJfUEFTU19CRUFDT04pLCBzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CS8qIG9mZnNldCA4IHdvcmQgY29udGFpbnMgb3BlbiBvcHRpb25zICovCisjZWxzZQorCQl3cml0ZXcoaHRvbnMoT1BFTl9BREFQVEVSX0VOQUJMRV9GRFgpLCBzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CS8qIE9mZnNldCA4IHdvcmQgY29udGFpbnMgT3Blbi5PcHRpb25zICovCisjZW5kaWYKKworCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhWzBdKSB7CisJCQl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUFdXTykgKyAxMiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQkJd3JpdGV3KGh0b25zKChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sYWFbMF0gPDwgOCkgfCAKKwkJCQkgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVsxXSksc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJCXdyaXRldyhodG9ucygoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhWzJdIDw8IDgpIHwgCisJCQkJICAgICBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sYWFbM10pLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCQl3cml0ZXcoaHRvbnMoKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVs0XSA8PCA4KSB8IAorCQkJCSAgICAgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhWzVdKSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYSwgZGV2LT5hZGRyX2xlbik7CisJCX0KKworCQkvKiBzYXZlIG9mZiBzcmIgb3BlbiBvZmZzZXQgKi8KKwkJc3JiX29wZW4gPSByZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQV1dPKTsKKyNpZiBTVFJFQU1FUl9ERUJVRworCQl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUFdXTyksCisJCSAgICAgICBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCXByaW50aygic3JiIG9wZW4gcmVxdWVzdDogXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCXByaW50aygiJXg6IiwgbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sb2NrLCBmbGFncyk7CisJCXN0cmVhbWVyX3ByaXYtPnNyYl9xdWV1ZWQgPSAxOworCisJCS8qIHNpZ25hbCBzb2xvIHRoYXQgU1JCIGNvbW1hbmQgaGFzIGJlZW4gaXNzdWVkICovCisJCXdyaXRldyhMSVNSX1NSQl9DTUQsIHN0cmVhbWVyX21taW8gKyBMSVNSX1NVTSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xvY2ssIGZsYWdzKTsKKworCQl3aGlsZSAoc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCkgeworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZzdHJlYW1lcl9wcml2LT5zcmJfd2FpdCwgNSAqIEhaKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTUkIgdGltZWQgb3V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTSVNSPSV4IE1JU1I9JXgsIExJU1I9JXhcbiIsCisJCQkJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSKSwKKwkJCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIE1JU1JfUlVNKSwKKwkJCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExJU1IpKTsKKwkJCQlzdHJlYW1lcl9wcml2LT5zcmJfcXVldWVkID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisjaWYgU1RSRUFNRVJfREVCVUcKKwkJcHJpbnRrKCJTSVNSX01BU0s6ICV4XG4iLCByZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9NQVNLKSk7CisJCXByaW50aygic3JiIG9wZW4gcmVzcG9uc2U6XG4iKTsKKwkJd3JpdGV3KHNyYl9vcGVuLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCQlwcmludGsoIiV4OiIsCisJCQkgICAgICAgbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSk7CisJCX0KKyNlbmRpZgorCisJCS8qIElmIHdlIGdldCB0aGUgc2FtZSByZXR1cm4gcmVzcG9uc2UgYXMgd2Ugc2V0LCB0aGUgaW50ZXJydXB0IHdhc24ndCByYWlzZWQgYW5kIHRoZSBvcGVuCisJCSAqIHRpbWVkIG91dC4KKwkJICovCisJCXdyaXRldyhzcmJfb3BlbiArIDIsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJc3JiX3dvcmQgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRCkpID4+IDg7CisJCWlmIChzcmJfd29yZCA9PSBTVFJFQU1FUl9DTEVBUl9SRVRfQ09ERSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgT3BlbiB0aW1lIG91dCBvciBlcnJvci5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJaWYgKHNyYl93b3JkICE9IDApIHsKKwkJCWlmIChzcmJfd29yZCA9PSAweDA3KSB7CisJCQkJaWYgKCFzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yaW5nX3NwZWVkICYmIG9wZW5fZmluaXNoZWQpIHsJLyogQXV0b3NlbnNlICwgZmlyc3QgdGltZSBhcm91bmQgKi8KKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJldHJ5aW5nIGF0IGRpZmZlcmVudCByaW5nIHNwZWVkIFxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJCW9wZW5fZmluaXNoZWQgPSAwOworCQkJCX0gZWxzZSB7CisJCQkJCV9fdTE2IGVycm9yX2NvZGU7CisKKwkJCQkJd3JpdGV3KHNyYl9vcGVuICsgNiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQkJCQllcnJvcl9jb2RlID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUEQpKTsKKwkJCQkJc3RyY3B5KG9wZW5fZXJyb3IsIG9wZW5fbWFqX2Vycm9yWyhlcnJvcl9jb2RlICYgMHhmMCkgPj4gNF0pOworCQkJCQlzdHJjYXQob3Blbl9lcnJvciwgIiAtICIpOworCQkJCQlzdHJjYXQob3Blbl9lcnJvciwgb3Blbl9taW5fZXJyb3JbKGVycm9yX2NvZGUgJiAweDBmKV0pOworCisJCQkJCWlmICghc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcmluZ19zcGVlZAorCQkJCQkgICAgJiYgKChlcnJvcl9jb2RlICYgMHgwZikgPT0gMHgwZCkpIAorCQkJCQl7CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJpZWQgdG8gYXV0b3NlbnNlIHJpbmcgc3BlZWQgd2l0aCBubyBtb25pdG9ycyBwcmVzZW50XG4iLCBkZXYtPm5hbWUpOworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBsZWFzZSB0cnkgYWdhaW4gd2l0aCBhIHNwZWNpZmllZCByaW5nIHNwZWVkIFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQkJCQkJcmV0dXJuIC1FSU87CisJCQkJCX0KKworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXNcbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsIG9wZW5fZXJyb3IpOworCQkJCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJCQkJcmV0dXJuIC1FSU87CisKKwkJCQl9CS8qIGlmIGF1dG9zZW5zZSAmJiBvcGVuX2ZpbmlzaGVkICovCisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCYWQgT1BFTiByZXNwb25zZTogJXhcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgc3JiX3dvcmQpOworCQkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9IGVsc2UKKwkJCW9wZW5fZmluaXNoZWQgPSAxOworCX0gd2hpbGUgKCEob3Blbl9maW5pc2hlZCkpOwkvKiBXaWxsIG9ubHkgbG9vcCBpZiByaW5nIHNwZWVkIG1pc21hdGNoIHJlLW9wZW4gYXR0ZW1wdGVkICYmIGF1dG9zZW5zZSBpcyBvbiAqLworCisJd3JpdGV3KHNyYl9vcGVuICsgMTgsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwlzcmJfd29yZD1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUEQpKSA+PiA4OworCWlmIChzcmJfd29yZCAmICgxIDw8IDMpKQorCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPcGVuZWQgaW4gRkRYIE1vZGVcbiIsIGRldi0+bmFtZSk7CisKKwlpZiAoc3JiX3dvcmQgJiAxKQorCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yaW5nX3NwZWVkID0gMTY7CisJZWxzZQorCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yaW5nX3NwZWVkID0gNDsKKworCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tZXNzYWdlX2xldmVsKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogT3BlbmVkIGluICVkIE1icHMgbW9kZVxuIiwgCisJCQlkZXYtPm5hbWUsCisJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yaW5nX3NwZWVkKTsKKworCXdyaXRldyhzcmJfb3BlbiArIDgsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwlzdHJlYW1lcl9wcml2LT5hc2IgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCXN0cmVhbWVyX3ByaXYtPnNyYiA9IG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSk7CisJc3RyZWFtZXJfcHJpdi0+YXJiID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKwlyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CS8qIG9mZnNldCAxNCB3b3JkIGlzIHJzdmQgKi8KKwlzdHJlYW1lcl9wcml2LT50cmIgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCisJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcmVjZWl2ZV9vcHRpb25zID0gMHgwMDsKKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9jb3B5X2FsbF9vcHRpb25zID0gMDsKKworCS8qIHNldHVwIHJ4IHJpbmcgKi8KKwkvKiBlbmFibGUgcnggY2hhbm5lbCAqLworCXdyaXRldyh+Qk1DVExfUlhfRElTLCBzdHJlYW1lcl9tbWlvICsgQk1DVExfUlVNKTsKKworCS8qIHNldHVwIHJ4IGRlc2NyaXB0b3JzICovCisJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZz0KKwkgICAga21hbGxvYyggc2l6ZW9mKHN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjKSoKKwkJICAgICBTVFJFQU1FUl9SWF9SSU5HX1NJWkUsR0ZQX0tFUk5FTCk7CisJaWYgKCFzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nKSB7CisJICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzIEFMTE9DIG9mIHN0cmVhbWVyIHJ4IHJpbmcgRkFJTEVEISFcbiIsZGV2LT5uYW1lKTsKKwkgICAgcmV0dXJuIC1FSU87CisJfQorCisJZm9yIChpID0gMDsgaSA8IFNUUkVBTUVSX1JYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihzdHJlYW1lcl9wcml2LT5wa3RfYnVmX3N6KTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJc2tiLT5kZXYgPSBkZXY7CisKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tpXS5mb3J3YXJkID0gCisJCQljcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShzdHJlYW1lcl9wcml2LT5wY2lfZGV2LCAmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tpICsgMV0sCisJCQkJCXNpemVvZihzdHJ1Y3Qgc3RyZWFtZXJfcnhfZGVzYyksIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbaV0uYnVmZmVyID0gCisJCQljcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShzdHJlYW1lcl9wcml2LT5wY2lfZGV2LCBza2ItPmRhdGEsCisJCQkJCSAgICAgIHN0cmVhbWVyX3ByaXYtPnBrdF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW2ldLmZyYW1lbGVuX2J1ZmxlbiA9IHN0cmVhbWVyX3ByaXYtPnBrdF9idWZfc3o7CisJCXN0cmVhbWVyX3ByaXYtPnJ4X3Jpbmdfc2tiW2ldID0gc2tiOworCX0KKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW1NUUkVBTUVSX1JYX1JJTkdfU0laRSAtIDFdLmZvcndhcmQgPQorCQkJCWNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsICZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nWzBdLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjKSwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisKKwlpZiAoaSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSByeCBidWZmZXJzLiBBZGFwdGVyIGRpc2FibGVkXG4iLCBkZXYtPm5hbWUpOworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkID0gU1RSRUFNRVJfUlhfUklOR19TSVpFIC0gMTsJLyogbGFzdCBwcm9jZXNzZWQgcnggc3RhdHVzICovCisKKwl3cml0ZWwoY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbMF0sCisJCQkJc2l6ZW9mKHN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjKSwgUENJX0RNQV9UT0RFVklDRSkpLCAKKwkJc3RyZWFtZXJfbW1pbyArIFJYQkRBKTsKKwl3cml0ZWwoY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbU1RSRUFNRVJfUlhfUklOR19TSVpFIC0gMV0sCisJCQkJc2l6ZW9mKHN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjKSwgUENJX0RNQV9UT0RFVklDRSkpLCAKKwkJc3RyZWFtZXJfbW1pbyArIFJYTEJEQSk7CisKKwkvKiBzZXQgYnVzIG1hc3RlciBpbnRlcnJ1cHQgZXZlbnQgbWFzayAqLworCXdyaXRldyhNSVNSX1JYX05PQlVGIHwgTUlTUl9SWF9FT0YsIHN0cmVhbWVyX21taW8gKyBNSVNSX01BU0spOworCisKKwkvKiBzZXR1cCB0eCByaW5nICovCisJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZz1rbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RyZWFtZXJfdHhfZGVzYykqCisJCQkJCQlTVFJFQU1FUl9UWF9SSU5HX1NJWkUsR0ZQX0tFUk5FTCk7CisJaWYgKCFzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nKSB7CisJICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzIEFMTE9DIG9mIHN0cmVhbWVyX3R4X3JpbmcgRkFJTEVEXG4iLGRldi0+bmFtZSk7CisJICAgIHJldHVybiAtRUlPOworCX0KKworCXdyaXRldyh+Qk1DVExfVFgyX0RJUywgc3RyZWFtZXJfbW1pbyArIEJNQ1RMX1JVTSk7CS8qIEVuYWJsZXMgVFggY2hhbm5lbCAyICovCisJZm9yIChpID0gMDsgaSA8IFNUUkVBTUVSX1RYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3JpbmdbaV0uZm9yd2FyZCA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsIAorCQkJCQkJCQkJCSZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW2kgKyAxXSwKKwkJCQkJCQkJCQlzaXplb2Yoc3RydWN0IHN0cmVhbWVyX3R4X2Rlc2MpLAorCQkJCQkJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpKTsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tpXS5zdGF0dXMgPSAwOworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW2ldLmJ1ZmNudF9mcmFtZWxlbiA9IDA7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3JpbmdbaV0uYnVmZmVyID0gMDsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tpXS5idWZsZW4gPSAwOworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW2ldLnJzdmQxID0gMDsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tpXS5yc3ZkMiA9IDA7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3JpbmdbaV0ucnN2ZDMgPSAwOworCX0KKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW1NUUkVBTUVSX1RYX1JJTkdfU0laRSAtIDFdLmZvcndhcmQgPQorCQkJCQljcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShzdHJlYW1lcl9wcml2LT5wY2lfZGV2LCAmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1swXSwKKwkJCQkJCQlzaXplb2Yoc3RydWN0IHN0cmVhbWVyX3R4X2Rlc2MpLCBQQ0lfRE1BX1RPREVWSUNFKSk7CisKKwlzdHJlYW1lcl9wcml2LT5mcmVlX3R4X3JpbmdfZW50cmllcyA9IFNUUkVBTUVSX1RYX1JJTkdfU0laRTsKKwlzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWUgPSAwOwkvKiBuZXh0IGVudHJ5IGluIHR4IHJpbmcgdG8gdXNlICovCisJc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1cyA9IFNUUkVBTUVSX1RYX1JJTkdfU0laRSAtIDE7CisKKwkvKiBzZXQgQnVzbWFzdGVyIGludGVycnVwdCBldmVudCBtYXNrIChoYW5kbGUgcmVjZWl2ZXMgb24gaW50ZXJydXB0IG9ubHkgKi8KKwl3cml0ZXcoTUlTUl9UWDJfRU9GIHwgTUlTUl9SWF9OT0JVRiB8IE1JU1JfUlhfRU9GLCBzdHJlYW1lcl9tbWlvICsgTUlTUl9NQVNLKTsKKwkvKiBzZXQgc3lzdGVtIGV2ZW50IGludGVycnVwdCBtYXNrICovCisJd3JpdGV3KFNJU1JfQURBUFRFUl9DSEVDSyB8IFNJU1JfQVJCX0NNRCB8IFNJU1JfVFJCX1JFUExZIHwgU0lTUl9BU0JfRlJFRSwgc3RyZWFtZXJfbW1pbyArIFNJU1JfTUFTS19TVU0pOworCisjaWYgU1RSRUFNRVJfREVCVUcKKwlwcmludGsoIkJNQ1RMOiAleFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIEJNQ1RMX1NVTSkpOworCXByaW50aygiU0lTUiBNQVNLOiAleFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIFNJU1JfTUFTSykpOworI2VuZGlmCisKKyNpZiBTVFJFQU1FUl9ORVRXT1JLX01PTklUT1IKKworCXdyaXRldyhzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9hZGRyX3RhYmxlX2FkZHIsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwlwcmludGsoIiVzOiBOb2RlIEFkZHJlc3M6ICUwNHg6JTA0eDolMDR4XG4iLCBkZXYtPm5hbWUsCisJCW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSksCisJCW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSksCisJCW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSkpOworCXJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKTsKKwlyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CisJcHJpbnRrKCIlczogRnVuY3Rpb25hbCBBZGRyZXNzOiAlMDR4OiUwNHhcbiIsIGRldi0+bmFtZSwKKwkJbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSwKKwkJbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSk7CisKKwl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcGFybXNfYWRkciArIDQsCisJCXN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwlwcmludGsoIiVzOiBOQVVOIEFkZHJlc3M6ICUwNHg6JTA0eDolMDR4XG4iLCBkZXYtPm5hbWUsCisJCW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSksCisJCW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSksCisJCW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSkpOworI2VuZGlmCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVdoZW4gd2UgZW50ZXIgdGhlIHJ4IHJvdXRpbmUgd2UgZG8gbm90IGtub3cgaG93IG1hbnkgZnJhbWVzIGhhdmUgYmVlbiAKKyAqCXF1ZXVlZCBvbiB0aGUgcnggY2hhbm5lbC4gIFRoZXJlZm9yZSB3ZSBzdGFydCBhdCB0aGUgbmV4dCByeCBzdGF0dXMKKyAqCXBvc2l0aW9uIGFuZCB0cmF2ZWwgYXJvdW5kIHRoZSByZWNlaXZlIHJpbmcgdW50aWwgd2UgaGF2ZSBjb21wbGV0ZWQKKyAqCWFsbCB0aGUgZnJhbWVzLgorICoKKyAqCVRoaXMgbWVhbnMgdGhhdCB3ZSBtYXkgcHJvY2VzcyB0aGUgZnJhbWUgYmVmb3JlIHdlIHJlY2VpdmUgdGhlIGVuZAorICoJb2YgZnJhbWUgaW50ZXJydXB0LiBUaGlzIGlzIHdoeSB3ZSBhbHdheXMgdGVzdCB0aGUgc3RhdHVzIGluc3RlYWQKKyAqCW9mIGJsaW5kbHkgcHJvY2Vzc2luZyB0aGUgbmV4dCBmcmFtZS4KKyAqCQorICovCitzdGF0aWMgdm9pZCBzdHJlYW1lcl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzdHJlYW1lcl9wcml2ID0KKwkgICAgKHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICopIGRldi0+cHJpdjsKKwlfX3U4IF9faW9tZW0gKnN0cmVhbWVyX21taW8gPSBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvOworCXN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjICpyeF9kZXNjOworCWludCByeF9yaW5nX2xhc3RfcmVjZWl2ZWQsIGxlbmd0aCwgZnJhbWVfbGVuZ3RoLCBidWZmZXJfY250ID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqc2tiMjsKKworCS8qIHNldHVwIHRoZSBuZXh0IHJ4IGRlc2NyaXB0b3IgdG8gYmUgcmVjZWl2ZWQgKi8KKwlyeF9kZXNjID0gJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbKHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCArIDEpICYgKFNUUkVBTUVSX1JYX1JJTkdfU0laRSAtIDEpXTsKKwlyeF9yaW5nX2xhc3RfcmVjZWl2ZWQgPSBzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQ7CisKKwl3aGlsZSAocnhfZGVzYy0+c3RhdHVzICYgMHgwMTAwMDAwMCkgewkvKiBXaGlsZSBwcm9jZXNzZWQgZGVzY3JpcHRvcnMgYXJlIGF2YWlsYWJsZSAqLworCQlpZiAocnhfcmluZ19sYXN0X3JlY2VpdmVkICE9IHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCkgCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJYIEVycm9yIDEgcnhfcmluZ19sYXN0X3JlY2VpdmVkIG5vdCB0aGUgc2FtZSAleCAleFxuIiwKKwkJCQlyeF9yaW5nX2xhc3RfcmVjZWl2ZWQsIHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCk7CisJCX0KKwkJc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkID0gKHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCArIDEpICYgKFNUUkVBTUVSX1JYX1JJTkdfU0laRSAtIDEpOworCQlyeF9yaW5nX2xhc3RfcmVjZWl2ZWQgPSBzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQ7CisKKwkJbGVuZ3RoID0gcnhfZGVzYy0+ZnJhbWVsZW5fYnVmbGVuICYgMHhmZmZmOwkvKiBidWZmZXIgbGVuZ3RoICovCisJCWZyYW1lX2xlbmd0aCA9IChyeF9kZXNjLT5mcmFtZWxlbl9idWZsZW4gPj4gMTYpICYgMHhmZmZmOworCisJCWlmIChyeF9kZXNjLT5zdGF0dXMgJiAweDdFODMwMDAwKSB7CS8qIGVycm9ycyAqLworCQkJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21lc3NhZ2VfbGV2ZWwpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUnggRXJyb3IgJXggXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIHJ4X2Rlc2MtPnN0YXR1cyk7CisJCQl9CisJCX0gZWxzZSB7CS8qIHJlY2VpdmVkIHdpdGhvdXQgZXJyb3JzICovCisJCQlpZiAocnhfZGVzYy0+c3RhdHVzICYgMHg4MDAwMDAwMCkgewkvKiBmcmFtZSBjb21wbGV0ZSAqLworCQkJCWJ1ZmZlcl9jbnQgPSAxOworCQkJCXNrYiA9IGRldl9hbGxvY19za2Ioc3RyZWFtZXJfcHJpdi0+cGt0X2J1Zl9zeik7CisJCQl9IGVsc2UgeworCQkJCXNrYiA9IGRldl9hbGxvY19za2IoZnJhbWVfbGVuZ3RoKTsKKwkJCX0KKworCQkJaWYgKHNrYiA9PSBOVUxMKSAKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm90IGVub3VnaCBtZW1vcnkgdG8gY29weSBwYWNrZXQgdG8gdXBwZXIgbGF5ZXJzLiBcbiIsCWRldi0+bmFtZSk7CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfc3RhdHMucnhfZHJvcHBlZCsrOworCQkJfSBlbHNlIHsJLyogd2UgYWxsb2NhdGVkIGFuIHNrYiBPSyAqLworCQkJCXNrYi0+ZGV2ID0gZGV2OworCisJCQkJaWYgKGJ1ZmZlcl9jbnQgPT0gMSkgeworCQkJCQkvKiByZWxlYXNlIHRoZSBETUEgbWFwcGluZyAqLworCQkJCQlwY2lfdW5tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsIAorCQkJCQkJbGUzMl90b19jcHUoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLmJ1ZmZlciksCisJCQkJCQlzdHJlYW1lcl9wcml2LT5wa3RfYnVmX3N6LCAKKwkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJCXNrYjIgPSBzdHJlYW1lcl9wcml2LT5yeF9yaW5nX3NrYltyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdOworI2lmIFNUUkVBTUVSX0RFQlVHX1BBQ0tFVFMKKwkJCQkJeworCQkJCQkJaW50IGk7CisJCQkJCQlwcmludGsoInN0cmVhbWVyX3J4IHBhY2tldCBwcmludDogc2tiLT5kYXRhMiAlcCAgc2tiLT5oZWFkICVwXG4iLCBza2IyLT5kYXRhLCBza2IyLT5oZWFkKTsKKwkJCQkJCWZvciAoaSA9IDA7IGkgPCBmcmFtZV9sZW5ndGg7IGkrKykgCisJCQkJCQl7CisJCQkJCQkJcHJpbnRrKCIleDoiLCBza2IyLT5kYXRhW2ldKTsKKwkJCQkJCQlpZiAoKChpICsgMSkgJSAxNikgPT0gMCkKKwkJCQkJCQkJcHJpbnRrKCJcbiIpOworCQkJCQkJfQorCQkJCQkJcHJpbnRrKCJcbiIpOworCQkJCQl9CisjZW5kaWYKKwkJCQkJc2tiX3B1dChza2IyLCBsZW5ndGgpOworCQkJCQlza2IyLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMoc2tiMiwgZGV2KTsKKwkJCQkJLyogcmVjeWNsZSB0aGlzIGRlc2NyaXB0b3IgKi8KKwkJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLnN0YXR1cyA9IDA7CisJCQkJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS5mcmFtZWxlbl9idWZsZW4gPSBzdHJlYW1lcl9wcml2LT5wa3RfYnVmX3N6OworCQkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0uYnVmZmVyID0gCisJCQkJCQljcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShzdHJlYW1lcl9wcml2LT5wY2lfZGV2LCBza2ItPmRhdGEsIHN0cmVhbWVyX3ByaXYtPnBrdF9idWZfc3osCisJCQkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSkpOworCQkJCQlzdHJlYW1lcl9wcml2LT5yeF9yaW5nX3NrYltyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdID0gc2tiOworCQkJCQkvKiBwbGFjZSByZWN5Y2xlZCBkZXNjcmlwdG9yIGJhY2sgb24gdGhlIGFkYXB0ZXIgKi8KKwkJCQkJd3JpdGVsKGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsIAorCQkJCQkJCQkJJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXSwKKwkJCQkJCQkJCXNpemVvZihzdHJ1Y3Qgc3RyZWFtZXJfcnhfZGVzYyksIFBDSV9ETUFfRlJPTURFVklDRSkpLAorCQkJCQkJc3RyZWFtZXJfbW1pbyArIFJYTEJEQSk7CisJCQkJCS8qIHBhc3MgdGhlIHJlY2VpdmVkIHNrYiB1cCB0byB0aGUgcHJvdG9jb2wgKi8KKwkJCQkJbmV0aWZfcngoc2tiMik7CisJCQkJfSBlbHNlIHsKKwkJCQkJZG8gewkvKiBXYWxrIHRoZSBidWZmZXJzICovCisJCQkJCQlwY2lfdW5tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsIGxlMzJfdG9fY3B1KHJ4X2Rlc2MtPmJ1ZmZlciksIGxlbmd0aCwgUENJX0RNQV9GUk9NREVWSUNFKSwgCisJCQkJCQltZW1jcHkoc2tiX3B1dChza2IsIGxlbmd0aCksICh2b2lkICopcnhfZGVzYy0+YnVmZmVyLCBsZW5ndGgpOwkvKiBjb3B5IHRoaXMgZnJhZ21lbnQgKi8KKwkJCQkJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS5zdGF0dXMgPSAwOworCQkJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLmZyYW1lbGVuX2J1ZmxlbiA9IHN0cmVhbWVyX3ByaXYtPnBrdF9idWZfc3o7CisJCQkJCQkKKwkJCQkJCS8qIGdpdmUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBhZGFwdGVyICovCisJCQkJCQl3cml0ZWwoY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgCisJCQkJCQkJCQkmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLAorCQkJCQkJCQkJbGVuZ3RoLCBQQ0lfRE1BX0ZST01ERVZJQ0UpKSwgCisJCQkJCQkJc3RyZWFtZXJfbW1pbyArIFJYTEJEQSk7CisKKwkJCQkJCWlmIChyeF9kZXNjLT5zdGF0dXMgJiAweDgwMDAwMDAwKQorCQkJCQkJCWJyZWFrOwkvKiB0aGlzIGRlc2NyaXB0b3IgY29tcGxldGVzIHRoZSBmcmFtZSAqLworCisJCQkJCQkvKiBlbHNlIGdldCB0aGUgbmV4dCBwZW5kaW5nIGRlc2NyaXB0b3IgKi8KKwkJCQkJCWlmIChyeF9yaW5nX2xhc3RfcmVjZWl2ZWQhPSBzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQpCisJCQkJCQl7CisJCQkJCQkJcHJpbnRrKCJSWCBFcnJvciByeF9yaW5nX2xhc3RfcmVjZWl2ZWQgbm90IHRoZSBzYW1lICV4ICV4XG4iLAorCQkJCQkJCQlyeF9yaW5nX2xhc3RfcmVjZWl2ZWQsCisJCQkJCQkJCXN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCk7CisJCQkJCQl9CisJCQkJCQlyeF9kZXNjID0gJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbKHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCsxKSAmIChTVFJFQU1FUl9SWF9SSU5HX1NJWkUtMSldOworCisJCQkJCQlsZW5ndGggPSByeF9kZXNjLT5mcmFtZWxlbl9idWZsZW4gJiAweGZmZmY7CS8qIGJ1ZmZlciBsZW5ndGggKi8KKwkJCQkJCXN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCA9CShzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQrMSkgJiAoU1RSRUFNRVJfUlhfUklOR19TSVpFIC0gMSk7CisJCQkJCQlyeF9yaW5nX2xhc3RfcmVjZWl2ZWQgPSBzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQ7CisJCQkJCX0gd2hpbGUgKDEpOworCisJCQkJCXNrYi0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQkJLyogc2VuZCB1cCB0byB0aGUgcHJvdG9jb2wgKi8KKwkJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQl9CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfc3RhdHMucnhfYnl0ZXMgKz0gbGVuZ3RoOworCQkJfQkvKiBpZiBza2IgPT0gbnVsbCAqLworCQl9CQkvKiBlbmQgcmVjZWl2ZWQgd2l0aG91dCBlcnJvcnMgKi8KKworCQkvKiB0cnkgdGhlIG5leHQgb25lICovCisJCXJ4X2Rlc2MgPSAmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1socnhfcmluZ19sYXN0X3JlY2VpdmVkICsgMSkgJiAoU1RSRUFNRVJfUlhfUklOR19TSVpFIC0gMSldOworCX0JCQkvKiBlbmQgZm9yIGFsbCBjb21wbGV0ZWQgcnggZGVzY3JpcHRvcnMgKi8KK30KKworc3RhdGljIGlycXJldHVybl90IHN0cmVhbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzdHJlYW1lcl9wcml2ID0KKwkgICAgKHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICopIGRldi0+cHJpdjsKKwlfX3U4IF9faW9tZW0gKnN0cmVhbWVyX21taW8gPSBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvOworCV9fdTE2IHNpc3I7CisJX191MTYgbWlzcjsKKwl1OCBtYXhfaW50ciA9IE1BWF9JTlRSOworCisJc3Bpbl9sb2NrKCZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sb2NrKTsKKwlzaXNyID0gcmVhZHcoc3RyZWFtZXJfbW1pbyArIFNJU1IpOworCisJd2hpbGUoKHNpc3IgJiAoU0lTUl9NSSB8IFNJU1JfU1JCX1JFUExZIHwgU0lTUl9BREFQVEVSX0NIRUNLIHwgU0lTUl9BU0JfRlJFRSB8IAorCQkgICAgICAgU0lTUl9BUkJfQ01EIHwgU0lTUl9UUkJfUkVQTFkgfCBTSVNSX1BBUl9FUlIgfCBTSVNSX1NFUlJfRVJSKSkKKyAgICAgICAgICAgICAgICYmIChtYXhfaW50ciA+IDApKSB7CisKKwkJaWYoc2lzciAmIFNJU1JfUEFSX0VSUikgeworCQkJd3JpdGV3KH5TSVNSX1BBUl9FUlIsIHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCQkodm9pZClyZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9SVU0pOworCQl9CisKKwkJZWxzZSBpZihzaXNyICYgU0lTUl9TRVJSX0VSUikgeworCQkJd3JpdGV3KH5TSVNSX1NFUlJfRVJSLCBzdHJlYW1lcl9tbWlvICsgU0lTUl9SVU0pOworCQkJKHZvaWQpcmVhZHcoc3RyZWFtZXJfbW1pbyArIFNJU1JfUlVNKTsKKwkJfQorCisJCWVsc2UgaWYoc2lzciAmIFNJU1JfTUkpIHsKKwkJCW1pc3IgPSByZWFkdyhzdHJlYW1lcl9tbWlvICsgTUlTUl9SVU0pOworCisJCWlmIChtaXNyICYgTUlTUl9UWDJfRU9GKSB7CisJCQkJd2hpbGUoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1soc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1cyArIDEpICYgKFNUUkVBTUVSX1RYX1JJTkdfU0laRSAtIDEpXS5zdGF0dXMpIHsKKwkJCQlzdHJlYW1lcl9wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzID0gKHN0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXMgKyAxKSAmIChTVFJFQU1FUl9UWF9SSU5HX1NJWkUgLSAxKTsKKwkJCQlzdHJlYW1lcl9wcml2LT5mcmVlX3R4X3JpbmdfZW50cmllcysrOworCQkJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3N0YXRzLnR4X2J5dGVzICs9IHN0cmVhbWVyX3ByaXYtPnR4X3Jpbmdfc2tiW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXNdLT5sZW47CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfc3RhdHMudHhfcGFja2V0cysrOworCQkJCWRldl9rZnJlZV9za2JfaXJxKHN0cmVhbWVyX3ByaXYtPnR4X3Jpbmdfc2tiW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXNdKTsKKwkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXNdLmJ1ZmZlciA9IDB4ZGVhZGJlZWY7CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzXS5zdGF0dXMgPSAwOworCQkJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10uYnVmY250X2ZyYW1lbGVuID0gMDsKKwkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXNdLmJ1ZmxlbiA9IDA7CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzXS5yc3ZkMSA9IDA7CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzXS5yc3ZkMiA9IDA7CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzXS5yc3ZkMyA9IDA7CisJCQl9CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKworCQlpZiAobWlzciAmIE1JU1JfUlhfRU9GKSB7CisJCQlzdHJlYW1lcl9yeChkZXYpOworCQl9CisJCS8qIE1JU1JfUlhfRU9GICovCisKKwkJCWlmIChtaXNyICYgTUlTUl9SWF9OT0JVRikgeworCQkJCS8qIEFjY29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbiwgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZywgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBidXQgdHJhcHBpbmcgaXQga2VlcHMgaXQgb3V0IG9mIC92YXIvbG9nL21lc3NhZ2VzLiAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJfQkJLyogU0lTUl9SWF9OT0JVRiAqLworCisJCQl3cml0ZXcofm1pc3IsIHN0cmVhbWVyX21taW8gKyBNSVNSX1JVTSk7CisJCQkodm9pZClyZWFkdyhzdHJlYW1lcl9tbWlvICsgTUlTUl9SVU0pOworCQl9CisKKwkJZWxzZSBpZiAoc2lzciAmIFNJU1JfU1JCX1JFUExZKSB7CisJCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCA9PSAxKSB7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzdHJlYW1lcl9wcml2LT5zcmJfd2FpdCk7CisJCQl9IGVsc2UgaWYgKHN0cmVhbWVyX3ByaXYtPnNyYl9xdWV1ZWQgPT0gMikgeworCQkJCXN0cmVhbWVyX3NyYl9iaChkZXYpOworCQkJfQorCQkJc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCA9IDA7CisKKwkJCXdyaXRldyh+U0lTUl9TUkJfUkVQTFksIHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCQkodm9pZClyZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9SVU0pOworCQl9CisKKwkJZWxzZSBpZiAoc2lzciAmIFNJU1JfQURBUFRFUl9DSEVDSykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgQ2hlY2sgSW50ZXJydXB0IFJhaXNlZCwgOCBieXRlcyBvZiBpbmZvcm1hdGlvbiBmb2xsb3c6XG4iLCBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKHN0cmVhbWVyX21taW8gKyBMQVBXV08pLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogV29yZHMgJXg6JXg6JXg6JXg6XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpLAorCQkJICAgICAgIG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSksCisJCQkgICAgICAgbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSwKKwkJCSAgICAgICBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpKTsKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG1hbnVhbGx5IHJlc2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCisJCS8qIFNJU1JfQURBUFRFUl9DSEVDSyAqLworCQllbHNlIGlmIChzaXNyICYgU0lTUl9BU0JfRlJFRSkgeworCQkJLyogV2FrZSB1cCBhbnl0aGluZyB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoZSBhc2IgcmVzcG9uc2UgKi8KKwkJCWlmIChzdHJlYW1lcl9wcml2LT5hc2JfcXVldWVkKSB7CisJCQkJc3RyZWFtZXJfYXNiX2JoKGRldik7CisJCQl9CisJCQl3cml0ZXcoflNJU1JfQVNCX0ZSRUUsIHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCQkodm9pZClyZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9SVU0pOworCQl9CisJCS8qIFNJU1JfQVNCX0ZSRUUgKi8KKwkJZWxzZSBpZiAoc2lzciAmIFNJU1JfQVJCX0NNRCkgeworCQkJc3RyZWFtZXJfYXJiX2NtZChkZXYpOworCQkJd3JpdGV3KH5TSVNSX0FSQl9DTUQsIHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCQkodm9pZClyZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9SVU0pOworCQl9CisJCS8qIFNJU1JfQVJCX0NNRCAqLworCQllbHNlIGlmIChzaXNyICYgU0lTUl9UUkJfUkVQTFkpIHsKKwkJCS8qIFdha2UgdXAgYW55dGhpbmcgdGhhdCBpcyB3YWl0aW5nIGZvciB0aGUgdHJiIHJlc3BvbnNlICovCisJCQlpZiAoc3RyZWFtZXJfcHJpdi0+dHJiX3F1ZXVlZCkgeworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc3RyZWFtZXJfcHJpdi0+CisJCQkJCQkgICAgICB0cmJfd2FpdCk7CisJCQl9CisJCQlzdHJlYW1lcl9wcml2LT50cmJfcXVldWVkID0gMDsKKwkJCXdyaXRldyh+U0lTUl9UUkJfUkVQTFksIHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCQkodm9pZClyZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9SVU0pOworCQl9CisJCS8qIFNJU1JfVFJCX1JFUExZICovCisKKwkJc2lzciA9IHJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSKTsKKwkJbWF4X2ludHItLTsKKwl9IC8qIHdoaWxlKCkgKi8JCQorCisJc3Bpbl91bmxvY2soJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xvY2spIDsgCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHN0cmVhbWVyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9CisJICAgIChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJX191OCBfX2lvbWVtICpzdHJlYW1lcl9tbWlvID0gc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzIDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sb2NrLCBmbGFncyk7CisKKwlpZiAoc3RyZWFtZXJfcHJpdi0+ZnJlZV90eF9yaW5nX2VudHJpZXMpIHsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWVdLnN0YXR1cyA9IDA7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19mcmVlXS5idWZjbnRfZnJhbWVsZW4gPSAweDAwMDIwMDAwIHwgc2tiLT5sZW47CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19mcmVlXS5idWZmZXIgPSAKKwkJCWNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpKTsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWVdLnJzdmQxID0gc2tiLT5sZW47CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19mcmVlXS5yc3ZkMiA9IDA7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19mcmVlXS5yc3ZkMyA9IDA7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19mcmVlXS5idWZsZW4gPSBza2ItPmxlbjsKKworCQlzdHJlYW1lcl9wcml2LT50eF9yaW5nX3NrYltzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWVdID0gc2tiOworCQlzdHJlYW1lcl9wcml2LT5mcmVlX3R4X3JpbmdfZW50cmllcy0tOworI2lmIFNUUkVBTUVSX0RFQlVHX1BBQ0tFVFMKKwkJeworCQkJaW50IGk7CisJCQlwcmludGsoInN0cmVhbWVyX3htaXQgcGFja2V0IHByaW50OlxuIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2tiLT5sZW47IGkrKykgeworCQkJCXByaW50aygiJXg6Iiwgc2tiLT5kYXRhW2ldKTsKKwkJCQlpZiAoKChpICsgMSkgJSAxNikgPT0gMCkKKwkJCQkJcHJpbnRrKCJcbiIpOworCQkJfQorCQkJcHJpbnRrKCJcbiIpOworCQl9CisjZW5kaWYKKworCQl3cml0ZWwoY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgCisJCQkJCSZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfZnJlZV0sCisJCQkJCXNpemVvZihzdHJ1Y3Qgc3RyZWFtZXJfdHhfZGVzYyksIFBDSV9ETUFfVE9ERVZJQ0UpKSwKKwkJCXN0cmVhbWVyX21taW8gKyBUWDJMRkRBKTsKKwkJKHZvaWQpcmVhZGwoc3RyZWFtZXJfbW1pbyArIFRYMkxGREEpOworCisJCXN0cmVhbWVyX3ByaXYtPnR4X3JpbmdfZnJlZSA9IChzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWUgKyAxKSAmIChTVFJFQU1FUl9UWF9SSU5HX1NJWkUgLSAxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbG9jayxmbGFncyk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sb2NrLGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorfQorCisKK3N0YXRpYyBpbnQgc3RyZWFtZXJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9CisJICAgIChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJX191OCBfX2lvbWVtICpzdHJlYW1lcl9tbWlvID0gc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPnNyYiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCXdyaXRldyhodG9ucyhTUkJfQ0xPU0VfQURBUFRFUiA8PCA4KSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCXdyaXRldyhodG9ucyhTVFJFQU1FUl9DTEVBUl9SRVRfQ09ERSA8PCA4KSwgc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sb2NrLCBmbGFncyk7CisKKwlzdHJlYW1lcl9wcml2LT5zcmJfcXVldWVkID0gMTsKKwl3cml0ZXcoTElTUl9TUkJfQ01ELCBzdHJlYW1lcl9tbWlvICsgTElTUl9TVU0pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKHN0cmVhbWVyX3ByaXYtPnNyYl9xdWV1ZWQpIAorCXsKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZzdHJlYW1lcl9wcml2LT5zcmJfd2FpdCwKKwkJCQkJICAgICAgIGppZmZpZXMgKyA2MCAqIEhaKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSAKKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNSQiB0aW1lZCBvdXQuXG4iLCBkZXYtPm5hbWUpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU0lTUj0leCBNSVNSPSV4IExJU1I9JXhcbiIsCisJCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIFNJU1IpLAorCQkJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBNSVNSX1JVTSksCisJCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExJU1IpKTsKKwkJCXN0cmVhbWVyX3ByaXYtPnNyYl9xdWV1ZWQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgPSAoc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkICsgMSkgJiAoU1RSRUFNRVJfUlhfUklOR19TSVpFIC0gMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1RSRUFNRVJfUlhfUklOR19TSVpFOyBpKyspIHsKKwkgICAgICAgIGlmIChzdHJlYW1lcl9wcml2LT5yeF9yaW5nX3NrYltzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWRdKSB7CisJCSAgICAgICAgZGV2X2tmcmVlX3NrYihzdHJlYW1lcl9wcml2LT5yeF9yaW5nX3NrYltzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWRdKTsKKwkJfSAKKwkJc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkID0gKHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCArIDEpICYgKFNUUkVBTUVSX1JYX1JJTkdfU0laRSAtIDEpOworCX0KKworCS8qIHJlc2V0IHR4L3J4IGZpZm8ncyBhbmQgYnVzbWFzdGVyIGxvZ2ljICovCisKKwkvKiBUQkQuIEFkZCBncmFjZWZ1bCB3YXkgdG8gcmVzZXQgdGhlIExMQyBjaGFubmVsIHdpdGhvdXQgZG9pbmcgYSBzb2Z0IHJlc2V0LiAKKwkgICB3cml0ZWwocmVhZGwoc3RyZWFtZXJfbW1pbytCQ1RMKXwoMzw8MTMpLHN0cmVhbWVyX21taW8rQkNUTCk7CisJICAgdWRlbGF5KDEpOworCSAgIHdyaXRlbChyZWFkbChzdHJlYW1lcl9tbWlvK0JDVEwpJn4oMzw8MTMpLHN0cmVhbWVyX21taW8rQkNUTCk7CisJICovCisKKyNpZiBTVFJFQU1FUl9ERUJVRworCXdyaXRldyhzdHJlYW1lcl9wcml2LT5zcmIsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwlwcmludGsoInNyYik6ICIpOworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJcHJpbnRrKCIleCAiLCBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpKTsKKwl9CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmVhbWVyX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXYgPQorCSAgICAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCV9fdTggX19pb21lbSAqc3RyZWFtZXJfbW1pbyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW87CisJX191OCBvcHRpb25zID0gMDsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaTsKKwl1bnNpZ25lZCBjaGFyIGRldl9tY19hZGRyZXNzWzVdOworCWludCBpOworCisJd3JpdGVsKHN0cmVhbWVyX3ByaXYtPnNyYiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCW9wdGlvbnMgPSBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9jb3B5X2FsbF9vcHRpb25zOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJb3B0aW9ucyB8PSAoMyA8PCA1KTsJLyogQWxsIExMQyBhbmQgTUFDIGZyYW1lcywgYWxsIHRocm91Z2ggdGhlIG1haW4gcnggY2hhbm5lbCAqLworCWVsc2UKKwkJb3B0aW9ucyAmPSB+KDMgPDwgNSk7CisKKwkvKiBPbmx5IGlzc3VlIHRoZSBzcmIgaWYgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gb3B0aW9ucyAqLworCisJaWYgKChvcHRpb25zIF4gc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfY29weV9hbGxfb3B0aW9ucykpIAorCXsKKwkJLyogTm93IHRvIGlzc3VlIHRoZSBzcmIgY29tbWFuZCB0byBhbHRlciB0aGUgY29weS5hbGwub3B0aW9ucyAqLworCQl3cml0ZXcoaHRvbnMoU1JCX01PRElGWV9SRUNFSVZFX09QVElPTlMgPDwgOCksIHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCXdyaXRldyhodG9ucyhTVFJFQU1FUl9DTEVBUl9SRVRfQ09ERSA8PCA4KSwgc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJd3JpdGV3KGh0b25zKChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yZWNlaXZlX29wdGlvbnMgPDwgOCkgfCBvcHRpb25zKSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoaHRvbnMoMHg0YTQxKSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoaHRvbnMoMHg0ZDQ1KSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoaHRvbnMoMHg1MzIwKSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoMHgyMDIwLCBzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CisKKwkJc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCA9IDI7CS8qIENhbid0IHNsZWVwLCB1c2Ugc3JiX2JoICovCisKKwkJd3JpdGVsKExJU1JfU1JCX0NNRCwgc3RyZWFtZXJfbW1pbyArIExJU1JfU1VNKTsKKworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9jb3B5X2FsbF9vcHRpb25zID0gb3B0aW9uczsKKwkJcmV0dXJuOworCX0KKworCS8qIFNldCB0aGUgZnVuY3Rpb25hbCBhZGRyZXNzZXMgd2UgbmVlZCBmb3IgbXVsdGljYXN0ICovCisJd3JpdGVsKHN0cmVhbWVyX3ByaXYtPnNyYixzdHJlYW1lcl9tbWlvK0xBUEEpOworCWRldl9tY19hZGRyZXNzWzBdID0gZGV2X21jX2FkZHJlc3NbMV0gPSBkZXZfbWNfYWRkcmVzc1syXSA9IGRldl9tY19hZGRyZXNzWzNdID0gMCA7IAorICAKKwlmb3IgKGk9MCxkbWk9ZGV2LT5tY19saXN0O2kgPCBkZXYtPm1jX2NvdW50OyBpKyssZG1pID0gZG1pLT5uZXh0KSAKKwl7IAorICAgCSAgICAgICAgZGV2X21jX2FkZHJlc3NbMF0gfD0gZG1pLT5kbWlfYWRkclsyXSA7IAorCQlkZXZfbWNfYWRkcmVzc1sxXSB8PSBkbWktPmRtaV9hZGRyWzNdIDsgCisJCWRldl9tY19hZGRyZXNzWzJdIHw9IGRtaS0+ZG1pX2FkZHJbNF0gOyAKKwkJZGV2X21jX2FkZHJlc3NbM10gfD0gZG1pLT5kbWlfYWRkcls1XSA7IAorCX0KKyAgCisJd3JpdGV3KGh0b25zKFNSQl9TRVRfRlVOQ19BRERSRVNTIDw8IDgpLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJd3JpdGV3KGh0b25zKFNUUkVBTUVSX0NMRUFSX1JFVF9DT0RFIDw8IDgpLCBzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCXdyaXRldygwLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJd3JpdGV3KGh0b25zKCAoZGV2X21jX2FkZHJlc3NbMF0gPDwgOCkgfCBkZXZfbWNfYWRkcmVzc1sxXSksc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwl3cml0ZXcoaHRvbnMoIChkZXZfbWNfYWRkcmVzc1syXSA8PCA4KSB8IGRldl9tY19hZGRyZXNzWzNdKSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCXN0cmVhbWVyX3ByaXYtPnNyYl9xdWV1ZWQgPSAyIDsgCisJd3JpdGVsKExJU1JfU1JCX0NNRCxzdHJlYW1lcl9tbWlvK0xJU1JfU1VNKTsKK30KKworc3RhdGljIHZvaWQgc3RyZWFtZXJfc3JiX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXYgPSAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCV9fdTggX19pb21lbSAqc3RyZWFtZXJfbW1pbyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW87CisJX191MTYgc3JiX3dvcmQ7CisKKwl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+c3JiLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJc3JiX3dvcmQ9bnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBESU5DKSkgPj4gODsKKworCXN3aXRjaCAoc3JiX3dvcmQpIHsKKworCQkvKiBTUkJfTU9ESUZZX1JFQ0VJVkVfT1BUSU9OUyBpLmUuIHNldF9tdWx0aWNhc3RfbGlzdCBvcHRpb25zIChwcm9taXNjdW91cykgCisJCSAqIEF0IHNvbWUgcG9pbnQgd2Ugc2hvdWxkIGRvIHNvbWV0aGluZyBpZiB3ZSBnZXQgYW4gZXJyb3IsIHN1Y2ggYXMKKwkJICogcmVzZXR0aW5nIHRoZSBJRkZfUFJPTUlTQyBmbGFnIGluIGRldgorCQkgKi8KKworCWNhc2UgU1JCX01PRElGWV9SRUNFSVZFX09QVElPTlM6CisJICAgICAgICBzcmJfd29yZD1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUERJTkMpKSA+PiA4OworCisJCXN3aXRjaCAoc3JiX3dvcmQpIHsKKwkJY2FzZSAweDAxOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZFxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG9wZW4gZm9yIHRoaXMgb3BlcmF0aW9uLCBkb2ghIVxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21lc3NhZ2VfbGV2ZWwpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmUgT3B0aW9ucyBNb2RpZmllZCB0byAleCwleFxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLAorCQkJCSAgICAgICBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9jb3B5X2FsbF9vcHRpb25zLAorCQkJCSAgICAgICBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yZWNlaXZlX29wdGlvbnMpOworCQkJYnJlYWs7CisJCX0JCS8qIHN3aXRjaCBzcmJbMl0gKi8KKwkJYnJlYWs7CisKKworCQkvKiBTUkJfU0VUX0dST1VQX0FERFJFU1MgLSBNdWx0aWNhc3QgZ3JvdXAgc2V0dGluZyAKKwkJICovCisJY2FzZSBTUkJfU0VUX0dST1VQX0FERFJFU1M6CisJICAgICAgICBzcmJfd29yZD1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUERJTkMpKSA+PiA4OworCQlzd2l0Y2ggKHNyYl93b3JkKSB7CisJCWNhc2UgMHgwMDoKKwkJICAgICAgICBicmVhazsKKwkJY2FzZSAweDAxOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZCBcbiIsZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG9wZW4gZm9yIHRoaXMgb3BlcmF0aW9uLCBkb2ghIVxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDB4M2M6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogR3JvdXAvRnVuY3Rpb25hbCBhZGRyZXNzIGluZGljYXRvciBiaXRzIG5vdCBzZXQgY29ycmVjdGx5XG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgzZToJLyogSWYgd2UgZXZlciBpbXBsZW1lbnQgaW5kaXZpZHVhbCBtdWx0aWNhc3QgYWRkcmVzc2VzLCB3aWxsIG5lZWQgdG8gZGVhbCB3aXRoIHRoaXMgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBHcm91cCBhZGRyZXNzIHJlZ2lzdGVycyBmdWxsXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHg1NToKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBHcm91cCBBZGRyZXNzIGFscmVhZHkgc2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0JCS8qIHN3aXRjaCBzcmJbMl0gKi8KKwkJYnJlYWs7CisKKworCQkvKiBTUkJfUkVTRVRfR1JPVVBfQUREUkVTUyAtIFJlbW92ZSBhIG11bHRpY2FzdCBhZGRyZXNzIGZyb20gZ3JvdXAgbGlzdAorCQkgKi8KKwljYXNlIFNSQl9SRVNFVF9HUk9VUF9BRERSRVNTOgorCSAgICAgICAgc3JiX3dvcmQ9bnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBESU5DKSkgPj4gODsKKwkJc3dpdGNoIChzcmJfd29yZCkgeworCQljYXNlIDB4MDA6CisJCSAgICAgICAgYnJlYWs7CisJCWNhc2UgMHgwMToKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGNvbW1hbmQgXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIG11c3QgYmUgb3BlbiBmb3IgdGhpcyBvcGVyYXRpb24sIGRvaCEhXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgzOToJLyogTXVzdCBkZWFsIHdpdGggdGhpcyBpZiBpbmRpdmlkdWFsIG11bHRpY2FzdCBhZGRyZXNzZXMgdXNlZCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdyb3VwIGFkZHJlc3Mgbm90IGZvdW5kIFxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0JCS8qIHN3aXRjaCBzcmJbMl0gKi8KKwkJYnJlYWs7CisKKworCQkvKiBTUkJfU0VUX0ZVTkNfQUREUkVTUyAtIENhbGxlZCBieSB0aGUgc2V0X3J4X21vZGUgCisJCSAqLworCisJY2FzZSBTUkJfU0VUX0ZVTkNfQUREUkVTUzoKKwkgICAgICAgIHNyYl93b3JkPW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8rTEFQRElOQykpID4+IDg7CisJCXN3aXRjaCAoc3JiX3dvcmQpIHsKKwkJY2FzZSAweDAwOgorCQkJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21lc3NhZ2VfbGV2ZWwpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZ1bmN0aW9uYWwgQWRkcmVzcyBNYXNrIFNldCBcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDAxOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZCBcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDA0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgbXVzdCBiZSBvcGVuIGZvciB0aGlzIG9wZXJhdGlvbiwgZG9oISFcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CQkvKiBzd2l0Y2ggc3JiWzJdICovCisJCWJyZWFrOworCisJCS8qIFNSQl9SRUFEX0xPRyAtIFJlYWQgYW5kIHJlc2V0IHRoZSBhZGFwdGVyIGVycm9yIGNvdW50ZXJzCisJCSAqLworCisJY2FzZSBTUkJfUkVBRF9MT0c6CisJICAgICAgICBzcmJfd29yZD1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUERJTkMpKSA+PiA4OworCQlzd2l0Y2ggKHNyYl93b3JkKSB7CisJCWNhc2UgMHgwMDoKKwkJCXsKKwkJCQlpbnQgaTsKKwkJCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlYWQgTG9nIGNvbW1hbmQgY29tcGxldGVcbiIsIGRldi0+bmFtZSk7CisJCQkJcHJpbnRrKCJSZWFkIExvZyBzdGF0aXN0aWNzOiAiKTsKKwkJCQl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+c3JiICsgNiwKKwkJCQkgICAgICAgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCQkJcHJpbnRrKCIleDoiLCBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpKTsKKwkJCQl9CisJCQkJcHJpbnRrKCJcbiIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMHgwMToKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGNvbW1hbmQgXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIG11c3QgYmUgb3BlbiBmb3IgdGhpcyBvcGVyYXRpb24sIGRvaCEhXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJfQkJLyogc3dpdGNoIHNyYlsyXSAqLworCQlicmVhazsKKworCQkvKiBTUkJfUkVBRF9TUl9DT1VOVEVSUyAtIFJlYWQgYW5kIHJlc2V0IHRoZSBzb3VyY2Ugcm91dGluZyBicmlkZ2UgcmVsYXRlZCBjb3VudGVycyAqLworCisJY2FzZSBTUkJfUkVBRF9TUl9DT1VOVEVSUzoKKwkgICAgICAgIHNyYl93b3JkPW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8rTEFQRElOQykpID4+IDg7CisJCXN3aXRjaCAoc3JiX3dvcmQpIHsKKwkJY2FzZSAweDAwOgorCQkJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21lc3NhZ2VfbGV2ZWwpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlYWQgU291cmNlIFJvdXRpbmcgQ291bnRlcnMgaXNzdWVkXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMToKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGNvbW1hbmQgXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIG11c3QgYmUgb3BlbiBmb3IgdGhpcyBvcGVyYXRpb24sIGRvaCEhXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQkJLyogc3dpdGNoIHNyYlsyXSAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGJoIHJldHVybiB2YWx1ZS5cbiIsIGRldi0+bmFtZSk7CisJCWJyZWFrOworCX0JCQkvKiBzd2l0Y2ggc3JiWzBdICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RyZWFtZXJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXY7CisJc3RyZWFtZXJfcHJpdiA9IChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJcmV0dXJuIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSAmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfc3RhdHM7Cit9CisKK3N0YXRpYyBpbnQgc3RyZWFtZXJfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyICpzYWRkciA9IGFkZHI7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXYgPSAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2Fubm90IHNldCBtYWMvbGFhIGFkZHJlc3Mgd2hpbGUgY2FyZCBpcyBvcGVuXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZW1jcHkoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhLCBzYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisKKwlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTUFDL0xBQSBTZXQgdG8gID0gJXguJXguJXguJXguJXguJXhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVswXSwKKwkJICAgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVsxXSwKKwkJICAgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVsyXSwKKwkJICAgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVszXSwKKwkJICAgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVs0XSwKKwkJICAgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVs1XSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdHJlYW1lcl9hcmJfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXYgPQorCSAgICAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCV9fdTggX19pb21lbSAqc3RyZWFtZXJfbW1pbyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW87CisJX191OCBoZWFkZXJfbGVuOworCV9fdTE2IGZyYW1lX2xlbiwgYnVmZmVyX2xlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbWFjX2ZyYW1lOworCV9fdTggZnJhbWVfZGF0YVsyNTZdOworCV9fdTE2IGJ1ZmZfb2ZmOworCV9fdTE2IGxhbl9zdGF0dXMgPSAwLCBsYW5fc3RhdHVzX2RpZmY7CS8qIEluaXRpYWxpemUgdG8gc3RvcCBjb21waWxlciB3YXJuaW5nICovCisJX191OCBmZHhfcHJvdF9lcnJvcjsKKwlfX3UxNiBuZXh0X3B0cjsKKwlfX3UxNiBhcmJfd29yZDsKKworI2lmIFNUUkVBTUVSX05FVFdPUktfTU9OSVRPUgorCXN0cnVjdCB0cmhfaGRyICptYWNfaGRyOworI2VuZGlmCisKKwl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+YXJiLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJYXJiX3dvcmQ9bnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBEKSkgPj4gODsKKwkKKwlpZiAoYXJiX3dvcmQgPT0gQVJCX1JFQ0VJVkVfREFUQSkgewkvKiBSZWNlaXZlLmRhdGEsIE1BQyBmcmFtZXMgKi8KKwkJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPmFyYiArIDYsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJc3RyZWFtZXJfcHJpdi0+bWFjX3J4X2J1ZmZlciA9IGJ1ZmZfb2ZmID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKwkJaGVhZGVyX2xlbj1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUERJTkMpKSA+PiA4OyAvKiA4MDIuNSBUb2tlbi1SaW5nIEhlYWRlciBMZW5ndGggKi8KKwkJZnJhbWVfbGVuID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKworI2lmIFNUUkVBTUVSX0RFQlVHCisJCXsKKwkJCWludCBpOworCQkJX191MTYgbmV4dDsKKwkJCV9fdTggc3RhdHVzOworCQkJX191MTYgbGVuOworCisJCQl3cml0ZXcobnRvaHMoYnVmZl9vZmYpLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CS8qc2V0dXAgd2luZG93IHRvIGZyYW1lIGRhdGEgKi8KKwkJCW5leHQgPSBodG9ucyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCQkJc3RhdHVzID0KKwkJCSAgICBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpICYgMHhmZjsKKwkJCWxlbiA9IG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSk7CisKKwkJCS8qIHByaW50IG91dCAxc3QgMTQgYnl0ZXMgb2YgZnJhbWUgZGF0YSAqLworCQkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQkJCXByaW50aygiTG9jICVkID0gJTA0eFxuIiwgaSwKKwkJCQkgICAgICAgbnRvaHMocmVhZHcKKwkJCQkJICAgICAoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSk7CisJCQl9CisKKwkJCXByaW50aygibmV4dCAlMDR4LCBmcyAlMDJ4LCBsZW4gJTA0eCBcbiIsIG5leHQsCisJCQkgICAgICAgc3RhdHVzLCBsZW4pOworCQl9CisjZW5kaWYKKwkJaWYgKCEobWFjX2ZyYW1lID0gZGV2X2FsbG9jX3NrYihmcmFtZV9sZW4pKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBmcmFtZS5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZHJvcF9mcmFtZTsKKwkJfQorCQkvKiBXYWxrIHRoZSBidWZmZXIgY2hhaW4sIGNyZWF0aW5nIHRoZSBmcmFtZSAqLworCisJCWRvIHsKKwkJCWludCBpOworCQkJX191MTYgcnhfd29yZDsKKworCQkJd3JpdGV3KGh0b25zKGJ1ZmZfb2ZmKSwgc3RyZWFtZXJfbW1pbyArIExBUEEpOwkvKiBzZXR1cCB3aW5kb3cgdG8gZnJhbWUgZGF0YSAqLworCQkJbmV4dF9wdHIgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCQkJcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpOwkvKiByZWFkIHRocnUgc3RhdHVzIHdvcmQgKi8KKwkJCWJ1ZmZlcl9sZW4gPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCisJCQlpZiAoYnVmZmVyX2xlbiA+IDI1NikKKwkJCQlicmVhazsKKworCQkJaSA9IDA7CisJCQl3aGlsZSAoaSA8IGJ1ZmZlcl9sZW4pIHsKKwkJCQlyeF93b3JkPW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8rTEFQRElOQykpOworCQkJCWZyYW1lX2RhdGFbaV09cnhfd29yZCA+PiA4OworCQkJCWZyYW1lX2RhdGFbaSsxXT1yeF93b3JkICYgMHhmZjsKKwkJCQlpICs9IDI7CisJCQl9CisKKwkJCW1lbWNweShza2JfcHV0KG1hY19mcmFtZSwgYnVmZmVyX2xlbiksCisJCQkJICAgICAgZnJhbWVfZGF0YSwgYnVmZmVyX2xlbik7CisJCX0gd2hpbGUgKG5leHRfcHRyICYmIChidWZmX29mZiA9IG5leHRfcHRyKSk7CisKKyNpZiBTVFJFQU1FUl9ORVRXT1JLX01PTklUT1IKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmVkIE1BQyBGcmFtZSwgZGV0YWlsczogXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJbWFjX2hkciA9IChzdHJ1Y3QgdHJoX2hkciAqKSBtYWNfZnJhbWUtPmRhdGE7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogTUFDIEZyYW1lIERlc3QuIEFkZHI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbWFjX2hkci0+ZGFkZHJbMF0sIG1hY19oZHItPmRhZGRyWzFdLAorCQkgICAgICAgbWFjX2hkci0+ZGFkZHJbMl0sIG1hY19oZHItPmRhZGRyWzNdLAorCQkgICAgICAgbWFjX2hkci0+ZGFkZHJbNF0sIG1hY19oZHItPmRhZGRyWzVdKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBNQUMgRnJhbWUgU3JjZS4gQWRkcjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBtYWNfaGRyLT5zYWRkclswXSwgbWFjX2hkci0+c2FkZHJbMV0sCisJCSAgICAgICBtYWNfaGRyLT5zYWRkclsyXSwgbWFjX2hkci0+c2FkZHJbM10sCisJCSAgICAgICBtYWNfaGRyLT5zYWRkcls0XSwgbWFjX2hkci0+c2FkZHJbNV0pOworI2VuZGlmCisJCW1hY19mcmFtZS0+ZGV2ID0gZGV2OworCQltYWNfZnJhbWUtPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhtYWNfZnJhbWUsIGRldik7CisJCW5ldGlmX3J4KG1hY19mcmFtZSk7CisKKwkJLyogTm93IHRlbGwgdGhlIGNhcmQgd2UgaGF2ZSBkZWFsdCB3aXRoIHRoZSByZWNlaXZlZCBmcmFtZSAqLworZHJvcF9mcmFtZToKKwkJLyogU2V0IExJU1IgQml0IDEgKi8KKwkJd3JpdGVsKExJU1JfQVJCX0ZSRUUsIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW8gKyBMSVNSX1NVTSk7CisKKwkJLyogSXMgdGhlIEFTQiBmcmVlID8gKi8KKworCQlpZiAoIShyZWFkbChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvICsgU0lTUikgJiBTSVNSX0FTQl9GUkVFKSkgCisJCXsKKwkJCXN0cmVhbWVyX3ByaXYtPmFzYl9xdWV1ZWQgPSAxOworCQkJd3JpdGVsKExJU1JfQVNCX0ZSRUVfUkVRLCBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvICsgTElTUl9TVU0pOworCQkJcmV0dXJuOworCQkJLyogRHJvcCBvdXQgYW5kIHdhaXQgZm9yIHRoZSBib3R0b20gaGFsZiB0byBiZSBydW4gKi8KKwkJfQorCisKKwkJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPmFzYiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQl3cml0ZXcoaHRvbnMoQVNCX1JFQ0VJVkVfREFUQSA8PCA4KSwgc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJd3JpdGV3KGh0b25zKFNUUkVBTUVSX0NMRUFSX1JFVF9DT0RFIDw8IDgpLCBzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoMCwgc3RyZWFtZXJfbW1pbyArIExBUERJTkMpOworCQl3cml0ZXcoaHRvbnMoc3RyZWFtZXJfcHJpdi0+bWFjX3J4X2J1ZmZlciksIHN0cmVhbWVyX21taW8gKyBMQVBEKTsKKworCQl3cml0ZWwoTElTUl9BU0JfUkVQTFkgfCBMSVNSX0FTQl9GUkVFX1JFUSwgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbyArIExJU1JfU1VNKTsKKworCQlzdHJlYW1lcl9wcml2LT5hc2JfcXVldWVkID0gMjsKKwkJcmV0dXJuOworCisJfSBlbHNlIGlmIChhcmJfd29yZCA9PSBBUkJfTEFOX0NIQU5HRV9TVEFUVVMpIHsJLyogTGFuLmNoYW5nZS5zdGF0dXMgKi8KKwkJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPmFyYiArIDYsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJbGFuX3N0YXR1cyA9IG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSk7CisJCWZkeF9wcm90X2Vycm9yID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBEKSkgPj4gODsKKwkJCisJCS8qIElzc3VlIEFSQiBGcmVlICovCisJCXdyaXRldyhMSVNSX0FSQl9GUkVFLCBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvICsgTElTUl9TVU0pOworCisJCWxhbl9zdGF0dXNfZGlmZiA9IChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sYW5fc3RhdHVzIF4gbGFuX3N0YXR1cykgJiAKKwkJICAgIGxhbl9zdGF0dXM7IAorCisJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiAoTFNDX0xXRiB8IExTQ19BUlcgfCBMU0NfRlBFIHwgTFNDX1JSKSkgCisJCXsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfTFdGKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTaG9ydCBjaXJjdWl0IGRldGVjdGVkIG9uIHRoZSBsb2JlXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19BUlcpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEF1dG8gcmVtb3ZhbCBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfRlBFKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGRFggUHJvdG9jb2wgRXJyb3JcbiIsIGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1JSKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGb3JjZSByZW1vdmUgTUFDIGZyYW1lIHJlY2VpdmVkXG4iLCBkZXYtPm5hbWUpOworCisJCQkvKiBBZGFwdGVyIGhhcyBiZWVuIGNsb3NlZCBieSB0aGUgaGFyZHdhcmUgKi8KKworCQkJLyogcmVzZXQgdHgvcnggZmlmbydzIGFuZCBidXNtYXN0ZXIgbG9naWMgKi8KKworCQkJLyogQFRCRC4gbm8gbGxjIHJlc2V0IG9uIGF1dG9zdHJlYW1lciB3cml0ZWwocmVhZGwoc3RyZWFtZXJfbW1pbytCQ1RMKXwoMzw8MTMpLHN0cmVhbWVyX21taW8rQkNUTCk7CisJCQkgICB1ZGVsYXkoMSk7CisJCQkgICB3cml0ZWwocmVhZGwoc3RyZWFtZXJfbW1pbytCQ1RMKSZ+KDM8PDEzKSxzdHJlYW1lcl9tbWlvK0JDVEwpOyAqLworCisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgbXVzdCBiZSBtYW51YWxseSByZXNldC5cbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJLyogSWYgc2VyaW91cyBlcnJvciAqLworCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkgeworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19TSUdfTE9TUykKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gcmVjZWl2ZSBzaWduYWwgZGV0ZWN0ZWQgXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19IQVJEX0VSUikgCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJlYWNvbmluZyBcbiIsIGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NPRlRfRVJSKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIHRyYW5zbWl0dGVkIFNvZnQgRXJyb3IgUmVwb3J0IE1hYyBGcmFtZSBcbiIsIGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1RSQU5fQkNOKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBXZSBhcmUgdHJhbm1pdHRpbmcgdGhlIGJlYWNvbiwgYWFhaFxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfU1MpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNpbmdsZSBTdGF0aW9uIG9uIHRoZSByaW5nIFxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfUklOR19SRUMpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJpbmcgcmVjb3Zlcnkgb25nb2luZ1xuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfRkRYX01PREUpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9wZXJhdGluZyBpbiBGRFggbW9kZVxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCisJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfQ08pIHsKKwkJCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tZXNzYWdlX2xldmVsKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VudGVyIE92ZXJmbG93IFxuIiwgZGV2LT5uYW1lKTsKKworCQkJLyogSXNzdWUgUkVBRC5MT0cgY29tbWFuZCAqLworCisJCQl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+c3JiLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCQl3cml0ZXcoaHRvbnMoU1JCX1JFQURfTE9HIDw8IDgpLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCQl3cml0ZXcoaHRvbnMoU1RSRUFNRVJfQ0xFQVJfUkVUX0NPREUgPDwgOCksIHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCQl3cml0ZXcoMCwgc3RyZWFtZXJfbW1pbyArIExBUERJTkMpOworCQkJc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCA9IDI7CS8qIENhbid0IHNsZWVwLCB1c2Ugc3JiX2JoICovCisKKwkJCXdyaXRldyhMSVNSX1NSQl9DTUQsIHN0cmVhbWVyX21taW8gKyBMSVNSX1NVTSk7CisJCX0KKworCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NSX0NPKSB7CisJCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogU291cmNlIHJvdXRpbmcgY291bnRlcnMgb3ZlcmZsb3dcbiIsIGRldi0+bmFtZSk7CisKKwkJCS8qIElzc3VlIGEgUkVBRC5TUi5DT1VOVEVSUyAqLworCQkJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPnNyYiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQkJd3JpdGV3KGh0b25zKFNSQl9SRUFEX1NSX0NPVU5URVJTIDw8IDgpLAorCQkJICAgICAgIHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCQl3cml0ZXcoaHRvbnMoU1RSRUFNRVJfQ0xFQVJfUkVUX0NPREUgPDwgOCksCisJCQkgICAgICAgc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJCXN0cmVhbWVyX3ByaXYtPnNyYl9xdWV1ZWQgPSAyOwkvKiBDYW4ndCBzbGVlcCwgdXNlIHNyYl9iaCAqLworCQkJd3JpdGV3KExJU1JfU1JCX0NNRCwgc3RyZWFtZXJfbW1pbyArIExJU1JfU1VNKTsKKworCQl9CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhbl9zdGF0dXMgPSBsYW5fc3RhdHVzOworCX0gLyogTGFuLmNoYW5nZS5zdGF0dXMgKi8KKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmtub3duIGFyYiBjb21tYW5kIFxuIiwgZGV2LT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgc3RyZWFtZXJfYXNiX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXYgPQorCSAgICAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCV9fdTggX19pb21lbSAqc3RyZWFtZXJfbW1pbyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW87CisKKwlpZiAoc3RyZWFtZXJfcHJpdi0+YXNiX3F1ZXVlZCA9PSAxKSAKKwl7CisJCS8qIERyb3BwZWQgdGhyb3VnaCB0aGUgZmlyc3QgdGltZSAqLworCisJCXdyaXRldyhzdHJlYW1lcl9wcml2LT5hc2IsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJd3JpdGV3KGh0b25zKEFTQl9SRUNFSVZFX0RBVEEgPDwgOCksc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJd3JpdGV3KGh0b25zKFNUUkVBTUVSX0NMRUFSX1JFVF9DT0RFIDw8IDgpLCBzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoMCwgc3RyZWFtZXJfbW1pbyArIExBUERJTkMpOworCQl3cml0ZXcoaHRvbnMoc3RyZWFtZXJfcHJpdi0+bWFjX3J4X2J1ZmZlciksIHN0cmVhbWVyX21taW8gKyBMQVBEKTsKKworCQl3cml0ZWwoTElTUl9BU0JfUkVQTFkgfCBMSVNSX0FTQl9GUkVFX1JFUSwgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbyArIExJU1JfU1VNKTsKKwkJc3RyZWFtZXJfcHJpdi0+YXNiX3F1ZXVlZCA9IDI7CisKKwkJcmV0dXJuOworCX0KKworCWlmIChzdHJlYW1lcl9wcml2LT5hc2JfcXVldWVkID09IDIpIHsKKwkJX191OCByYzsKKwkJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPmFzYiArIDIsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJcmM9bnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBEKSkgPj4gODsKKwkJc3dpdGNoIChyYykgeworCQljYXNlIDB4MDE6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5yZWNvZ25pemVkIGNvbW1hbmQgY29kZSBcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDI2OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBidWZmZXIgYWRkcmVzcyBcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweEZGOgorCQkJLyogVmFsaWQgcmVzcG9uc2UsIGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIG9rIGFnYWluICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnZhbGlkIHJldHVybiBjb2RlIGluIGFzYlxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXN0cmVhbWVyX3ByaXYtPmFzYl9xdWV1ZWQgPSAwOworfQorCitzdGF0aWMgaW50IHN0cmVhbWVyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSkKK3sKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9CisJICAgIChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJX191MTYgbWF4X210dTsKKworCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yaW5nX3NwZWVkID09IDQpCisJCW1heF9tdHUgPSA0NTAwOworCWVsc2UKKwkJbWF4X210dSA9IDE4MDAwOworCisJaWYgKG10dSA+IG1heF9tdHUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChtdHUgPCAxMDApCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5tdHUgPSBtdHU7CisJc3RyZWFtZXJfcHJpdi0+cGt0X2J1Zl9zeiA9IG10dSArIFRSX0hMRU47CisKKwlyZXR1cm4gMDsKK30KKworI2lmIFNUUkVBTUVSX05FVFdPUktfTU9OSVRPUgorI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50IHN0cmVhbWVyX3Byb2NfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJICAgICAgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisgIHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzZGV2PU5VTEw7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UgPSBOVUxMOworCWludCBsZW4gPSAwOworCW9mZl90IGJlZ2luID0gMDsKKwlvZmZfdCBwb3MgPSAwOworCWludCBzaXplOworCisgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlzaXplID0gc3ByaW50ZihidWZmZXIsICJJQk0gTGFuU3RyZWFtZXIvTVBDIENoaXBzZXQgVG9rZW4gUmluZyBBZGFwdGVyc1xuIik7CisKKwlwb3MgKz0gc2l6ZTsKKwlsZW4gKz0gc2l6ZTsKKworICBmb3Ioc2Rldj1kZXZfc3RyZWFtZXI7IHNkZXY7IHNkZXY9c2Rldi0+bmV4dCkgeworICAgIHBjaV9kZXZpY2U9c2Rldi0+cGNpX2RldjsKKyAgICBkZXY9cGNpX2dldF9kcnZkYXRhKHBjaV9kZXZpY2UpOworCisJCQkJc2l6ZSA9IHNwcmludGZfaW5mbyhidWZmZXIgKyBsZW4sIGRldik7CisJCQkJbGVuICs9IHNpemU7CisJCQkJcG9zID0gYmVnaW4gKyBsZW47CisKKwkJCQlpZiAocG9zIDwgb2Zmc2V0KSB7CisJCQkJCWxlbiA9IDA7CisJCQkJCWJlZ2luID0gcG9zOworCQkJCX0KKwkJCQlpZiAocG9zID4gb2Zmc2V0ICsgbGVuZ3RoKQorCQkJCQlicmVhazsKKwkJfQkJLyogZm9yICovCisKKwkqc3RhcnQgPSBidWZmZXIgKyAob2Zmc2V0IC0gYmVnaW4pOwkvKiBTdGFydCBvZiB3YW50ZWQgZGF0YSAqLworCWxlbiAtPSAob2Zmc2V0IC0gYmVnaW4pOwkvKiBTdGFydCBzbG9wICovCisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOwkvKiBFbmRpbmcgc2xvcCAqLworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgc3ByaW50Zl9pbmZvKGNoYXIgKmJ1ZmZlciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9CisJICAgIChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJX191OCBfX2lvbWVtICpzdHJlYW1lcl9tbWlvID0gc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbzsKKwlzdHJ1Y3Qgc3RyZWFtZXJfYWRhcHRlcl9hZGRyX3RhYmxlIHNhdDsKKwlzdHJ1Y3Qgc3RyZWFtZXJfcGFyYW1ldGVyc190YWJsZSBzcHQ7CisJaW50IHNpemUgPSAwOworCWludCBpOworCisJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2FkZHJfdGFibGVfYWRkciwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCWZvciAoaSA9IDA7IGkgPCAxNDsgaSArPSAyKSB7CisJCV9fdTE2IGlvX3dvcmQ7CisJCV9fdTggKmRhdGFwID0gKF9fdTggKikgJiBzYXQ7CisJCWlvX3dvcmQ9bnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBESU5DKSk7CisJCWRhdGFwW3NpemVdPWlvX3dvcmQgPj4gODsKKwkJZGF0YXBbc2l6ZSsxXT1pb193b3JkICYgMHhmZjsKKwl9CisJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3Bhcm1zX2FkZHIsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjg7IGkgKz0gMikgeworCQlfX3UxNiBpb193b3JkOworCQlfX3U4ICpkYXRhcCA9IChfX3U4ICopICYgc3B0OworCQlpb193b3JkPW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8rTEFQRElOQykpOworCQlkYXRhcFtzaXplXT1pb193b3JkID4+IDg7CisJCWRhdGFwW3NpemUrMV09aW9fd29yZCAmIDB4ZmY7CisJfQorCisKKwlzaXplID0gc3ByaW50ZihidWZmZXIsICJcbiU2czogQWRhcHRlciBBZGRyZXNzICAgOiBOb2RlIEFkZHJlc3MgICAgICA6IEZ1bmN0aW9uYWwgQWRkclxuIiwgZGV2LT5uYW1lKTsKKworCXNpemUgKz0gc3ByaW50ZihidWZmZXIgKyBzaXplLAorCQkgICAgIiU2czogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCA6ICUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSAgICBkZXYtPm5hbWUsIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sCisJCSAgICBkZXYtPmRldl9hZGRyWzJdLCBkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLAorCQkgICAgZGV2LT5kZXZfYWRkcls1XSwgc2F0Lm5vZGVfYWRkclswXSwgc2F0Lm5vZGVfYWRkclsxXSwKKwkJICAgIHNhdC5ub2RlX2FkZHJbMl0sIHNhdC5ub2RlX2FkZHJbM10sIHNhdC5ub2RlX2FkZHJbNF0sCisJCSAgICBzYXQubm9kZV9hZGRyWzVdLCBzYXQuZnVuY19hZGRyWzBdLCBzYXQuZnVuY19hZGRyWzFdLAorCQkgICAgc2F0LmZ1bmNfYWRkclsyXSwgc2F0LmZ1bmNfYWRkclszXSk7CisKKwlzaXplICs9IHNwcmludGYoYnVmZmVyICsgc2l6ZSwgIlxuJTZzOiBUb2tlbiBSaW5nIFBhcmFtZXRlcnMgVGFibGU6XG4iLCBkZXYtPm5hbWUpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlciArIHNpemUsICIlNnM6IFBoeXNpY2FsIEFkZHIgOiBVcCBOb2RlIEFkZHJlc3MgICA6IFBvbGwgQWRkcmVzcyAgICAgIDogQWNjUHJpIDogQXV0aCBTcmMgOiBBdHQgQ29kZSA6XG4iLCBkZXYtPm5hbWUpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlciArIHNpemUsCisJCSAgICAiJTZzOiAlMDJ4OiUwMng6JTAyeDolMDJ4ICAgOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IDogJTA0eCAgIDogJTA0eCAgICAgOiAgJTA0eCAgICA6XG4iLAorCQkgICAgZGV2LT5uYW1lLCBzcHQucGh5c19hZGRyWzBdLCBzcHQucGh5c19hZGRyWzFdLAorCQkgICAgc3B0LnBoeXNfYWRkclsyXSwgc3B0LnBoeXNfYWRkclszXSwKKwkJICAgIHNwdC51cF9ub2RlX2FkZHJbMF0sIHNwdC51cF9ub2RlX2FkZHJbMV0sCisJCSAgICBzcHQudXBfbm9kZV9hZGRyWzJdLCBzcHQudXBfbm9kZV9hZGRyWzNdLAorCQkgICAgc3B0LnVwX25vZGVfYWRkcls0XSwgc3B0LnVwX25vZGVfYWRkcls0XSwKKwkJICAgIHNwdC5wb2xsX2FkZHJbMF0sIHNwdC5wb2xsX2FkZHJbMV0sIHNwdC5wb2xsX2FkZHJbMl0sCisJCSAgICBzcHQucG9sbF9hZGRyWzNdLCBzcHQucG9sbF9hZGRyWzRdLCBzcHQucG9sbF9hZGRyWzVdLAorCQkgICAgbnRvaHMoc3B0LmFjY19wcmlvcml0eSksIG50b2hzKHNwdC5hdXRoX3NvdXJjZV9jbGFzcyksCisJCSAgICBudG9ocyhzcHQuYXR0X2NvZGUpKTsKKworCXNpemUgKz0gc3ByaW50ZihidWZmZXIgKyBzaXplLCAiJTZzOiBTb3VyY2UgQWRkcmVzcyAgICA6IEJjbiBUIDogTWFqLiBWIDogTGFuIFN0IDogTGNsIFJnIDogTW9uIEVyciA6IEZyYW1lIENvcnJlbCA6IFxuIiwgZGV2LT5uYW1lKTsKKworCXNpemUgKz0gc3ByaW50ZihidWZmZXIgKyBzaXplLAorCQkgICAgIiU2czogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggOiAlMDR4ICA6ICUwNHggICA6ICUwNHggICA6ICUwNHggICA6ICUwNHggICAgOiAgICAgJTA0eCAgICAgOiBcbiIsCisJCSAgICBkZXYtPm5hbWUsIHNwdC5zb3VyY2VfYWRkclswXSwgc3B0LnNvdXJjZV9hZGRyWzFdLAorCQkgICAgc3B0LnNvdXJjZV9hZGRyWzJdLCBzcHQuc291cmNlX2FkZHJbM10sCisJCSAgICBzcHQuc291cmNlX2FkZHJbNF0sIHNwdC5zb3VyY2VfYWRkcls1XSwKKwkJICAgIG50b2hzKHNwdC5iZWFjb25fdHlwZSksIG50b2hzKHNwdC5tYWpvcl92ZWN0b3IpLAorCQkgICAgbnRvaHMoc3B0Lmxhbl9zdGF0dXMpLCBudG9ocyhzcHQubG9jYWxfcmluZyksCisJCSAgICBudG9ocyhzcHQubW9uX2Vycm9yKSwgbnRvaHMoc3B0LmZyYW1lX2NvcnJlbCkpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlciArIHNpemUsICIlNnM6IEJlYWNvbiBEZXRhaWxzIDogIFR4ICA6ICBSeCAgOiBOQVVOIE5vZGUgQWRkcmVzcyA6IE5BVU4gTm9kZSBQaHlzIDogXG4iLAorCQkgICAgZGV2LT5uYW1lKTsKKworCXNpemUgKz0gc3ByaW50ZihidWZmZXIgKyBzaXplLAorCQkgICAgIiU2czogICAgICAgICAgICAgICAgOiAgJTAyeCAgOiAgJTAyeCAgOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCA6ICUwMng6JTAyeDolMDJ4OiUwMnggICAgOiBcbiIsCisJCSAgICBkZXYtPm5hbWUsIG50b2hzKHNwdC5iZWFjb25fdHJhbnNtaXQpLAorCQkgICAgbnRvaHMoc3B0LmJlYWNvbl9yZWNlaXZlKSwgc3B0LmJlYWNvbl9uYXVuWzBdLAorCQkgICAgc3B0LmJlYWNvbl9uYXVuWzFdLCBzcHQuYmVhY29uX25hdW5bMl0sCisJCSAgICBzcHQuYmVhY29uX25hdW5bM10sIHNwdC5iZWFjb25fbmF1bls0XSwKKwkJICAgIHNwdC5iZWFjb25fbmF1bls1XSwgc3B0LmJlYWNvbl9waHlzWzBdLAorCQkgICAgc3B0LmJlYWNvbl9waHlzWzFdLCBzcHQuYmVhY29uX3BoeXNbMl0sCisJCSAgICBzcHQuYmVhY29uX3BoeXNbM10pOworCXJldHVybiBzaXplOworfQorI2VuZGlmCisjZW5kaWYKKworI2lmIFNUUkVBTUVSX0lPQ1RMICYmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCitzdGF0aWMgaW50IHN0cmVhbWVyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworICAgICAgICBpbnQgaTsKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9IChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdTggX19pb21lbSAqc3RyZWFtZXJfbW1pbyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW87CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBJT0NUTF9TSVNSX01BU0s6CisJCXdyaXRldyhTSVNSX01JLCBzdHJlYW1lcl9tbWlvICsgU0lTUl9NQVNLX1NVTSk7CisJCWJyZWFrOworCWNhc2UgSU9DVExfU1BJTl9MT0NLX1RFU1Q6CisJICAgICAgICBwcmludGsoS0VSTl9JTkZPICJzcGluX2xvY2soKSBjYWxsZWQuXG4iKTsKKwkJc3Bpbl9sb2NrKCZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xvY2spOworCQlwcmludGsoS0VSTl9JTkZPICJzcGluX3VubG9jaygpIGZpbmlzaGVkLlxuIik7CisJCWJyZWFrOworCWNhc2UgSU9DVExfUFJJTlRfQkRBUzoKKwkgICAgICAgIHByaW50ayhLRVJOX0lORk8gImJkYXM6IFJYQkRBOiAleCBSWExCREE6ICV4IFRYMkZEQTogJXggVFgyTEZEQTogJXhcbiIsCisJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgUlhCREEpLAorCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIFJYTEJEQSksCisJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgVFgyRkRBKSwKKwkJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBUWDJMRkRBKSk7CisJCWJyZWFrOworCWNhc2UgSU9DVExfUFJJTlRfUkVHSVNURVJTOgorCSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAicmVnaXN0ZXJzOlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIlNJU1I6ICUwNHggTUlTUjogJTA0eCBMSVNSOiAlMDR4IEJDVEw6ICUwNHggQk1DVEw6ICUwNHhcbm1hc2sgICUwNHggbWFzayAgJTA0eFxuIiwgCisJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUiksCisJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgTUlTUl9SVU0pLAorCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExJU1IpLAorCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIEJDVEwpLAorCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIEJNQ1RMX1NVTSksCisJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9NQVNLKSwKKwkJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBNSVNSX01BU0spKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NUTF9QUklOVF9SWF9CVUZTOgorCSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiUHJpbnQgcnggYnVmczpcbiIpOworCQlmb3IoaT0wOyBpPFNUUkVBTUVSX1JYX1JJTkdfU0laRTsgaSsrKQorCQkgICAgICAgIHByaW50ayhLRVJOX0lORk8gInJ4X3JpbmcgJWQgc3RhdHVzOiAweCV4XG4iLCBpLCAKKwkJCSAgICAgICBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW2ldLnN0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgSU9DVExfUFJJTlRfVFhfQlVGUzoKKwkgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlByaW50IHR4IGJ1ZnM6XG4iKTsKKwkJZm9yKGk9MDsgaTxTVFJFQU1FUl9UWF9SSU5HX1NJWkU7IGkrKykKKwkJICAgICAgICBwcmludGsoS0VSTl9JTkZPICJ0eF9yaW5nICVkIHN0YXR1czogMHgleFxuIiwgaSwgCisJCQkgICAgICAgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tpXS5zdGF0dXMpOworCQlicmVhazsKKwljYXNlIElPQ1RMX1JYX0NNRDoKKwkgICAgICAgIHN0cmVhbWVyX3J4KGRldik7CisJCXByaW50ayhLRVJOX0lORk8gIlNlbnQgcnggY29tbWFuZC5cbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiQmFkIGlvY3RsIVxuIik7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzdHJlYW1lcl9wY2lfZHJpdmVyID0geworICAubmFtZSAgICAgPSAibGFuc3RyZWFtZXIiLAorICAuaWRfdGFibGUgPSBzdHJlYW1lcl9wY2lfdGJsLAorICAucHJvYmUgICAgPSBzdHJlYW1lcl9pbml0X29uZSwKKyAgLnJlbW92ZSAgID0gX19kZXZleGl0X3Aoc3RyZWFtZXJfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzdHJlYW1lcl9pbml0X21vZHVsZSh2b2lkKSB7CisgIHJldHVybiBwY2lfbW9kdWxlX2luaXQoJnN0cmVhbWVyX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc3RyZWFtZXJfY2xlYW51cF9tb2R1bGUodm9pZCkgeworICBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnN0cmVhbWVyX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzdHJlYW1lcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChzdHJlYW1lcl9jbGVhbnVwX21vZHVsZSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvbGFuc3RyZWFtZXIuaCBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9sYW5zdHJlYW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NTdkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvbGFuc3RyZWFtZXIuaApAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqICAgbGFuc3RyZWFtZXIuaCAtLSBkcml2ZXIgZm9yIHRoZSBJQk0gQXV0byBMQU5TdHJlYW1lciBQQ0kgQWRhcHRlcgorICoKKyAqICBXcml0dGVuIEJ5OiBNaWtlIFN1bGxpdmFuLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqICBMaW51eCBkcml2ZXIgZm9yIElCTSBQQ0kgdG9rZW5yaW5nIGNhcmRzIGJhc2VkIG9uIHRoZSBMYW5TdHJlYW1lciBNUEMKKyAqICBjaGlwc2V0LiAKKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIG9seW1waWMgZHJpdmVyIGZvciBJQk0gUENJIFRva2VuUmluZyBjYXJkcyAoUGl0L1BpdC1QaHkvT2x5bXBpYworICogIGNoaXBzZXRzKSB3cml0dGVuICBieToKKyAqICAgICAgMTk5OSBQZXRlciBEZSBTY2hyaWp2ZXIgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoJMTk5OSBNaWtlIFBoaWxsaXBzIChwaGlsbGltQGFtdHJhay5jb20pCisgKgorICogIEJhc2UgRHJpdmVyIFNrZWxldG9uOgorICogICAgICBXcml0dGVuIDE5OTMtOTQgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqICAgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgIAorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgICAKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICAgCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICAgCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgICAKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogTk8gV0FSUkFOVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAgICAgICAgCisgKiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCAgICAgIAorICogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgICAgICAKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgICAgCisgKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kICAgICAgIAorICogZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzICAgICAgICAKKyAqIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byAgICAgCisgKiB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCAgICAgICAgIAorICogcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgICAKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCAgICAgICAgCisgKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCAgIAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICAgICAKKyAqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgICAgCisgKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgIAorICogSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUyAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAgIAorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgICAKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCisgKiAgMTIvMTAvOTkgLSBBbHBoYSBSZWxlYXNlIDAuMS4wCisgKiAgICAgICAgICAgIEZpcnN0IHJlbGVhc2UgdG8gdGhlIHB1YmxpYworICogIDA4LzE1LzAxIC0gQWRkZWQgaW9jdGwoKSBkZWZpbml0aW9ucyBhbmQgb3RoZXJzIC0gS2VudCBZb2RlciA8eW9kZXIxQHVzLmlibS5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpZiBTVFJFQU1FUl9JT0NUTCAmJiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgorI2RlZmluZSBJT0NUTF9QUklOVF9SWF9CVUZTICAgU0lPQ0RFVlBSSVZBVEUKKyNkZWZpbmUgSU9DVExfUFJJTlRfVFhfQlVGUyAgIFNJT0NERVZQUklWQVRFKzEKKyNkZWZpbmUgSU9DVExfUlhfQ01EICAgICAgICAgIFNJT0NERVZQUklWQVRFKzIKKyNkZWZpbmUgSU9DVExfVFhfQ01EICAgICAgICAgIFNJT0NERVZQUklWQVRFKzMKKyNkZWZpbmUgSU9DVExfUFJJTlRfUkVHSVNURVJTIFNJT0NERVZQUklWQVRFKzQKKyNkZWZpbmUgSU9DVExfUFJJTlRfQkRBUyAgICAgIFNJT0NERVZQUklWQVRFKzUKKyNkZWZpbmUgSU9DVExfU1BJTl9MT0NLX1RFU1QgIFNJT0NERVZQUklWQVRFKzYKKyNkZWZpbmUgSU9DVExfU0lTUl9NQVNLICAgICAgIFNJT0NERVZQUklWQVRFKzcKKyNlbmRpZgorCisvKiBNQVhfSU5UUiAtIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB3ZSBjYW4gbG9vcAorICogaW5zaWRlIHRoZSBpbnRlcnJ1cHQgZnVuY3Rpb24gYmVmb3JlIHJldHVybmluZworICogY29udHJvbCB0byB0aGUgT1MgKG1heGltdW0gdmFsdWUgaXMgMjU2KQorICovCisjZGVmaW5lIE1BWF9JTlRSIDUKKworI2RlZmluZSBDTFMgMHgwQworI2RlZmluZSBNTFIgMHg4NgorI2RlZmluZSBMVFIgMHgwRAorCisjZGVmaW5lIEJDVEwgMHg2MAorI2RlZmluZSBCQ1RMX1NPRlRSRVNFVCAoMTw8MTUpCisjZGVmaW5lIEJDVExfUlhfRklGT184ICgxPDwxKQorI2RlZmluZSBCQ1RMX1RYX0ZJRk9fOCAoMTw8MykKKworI2RlZmluZSBHUFIgMHg0YQorI2RlZmluZSBHUFJfQVVUT1NFTlNFICgxPDwyKQorI2RlZmluZSBHUFJfMTZNQlBTICgxPDwzKQorCisjZGVmaW5lIExJU1IgMHgxMAorI2RlZmluZSBMSVNSX1NVTSAweDEyCisjZGVmaW5lIExJU1JfUlVNIDB4MTQKKworI2RlZmluZSBMSVNSX0xJRSAoMTw8MTUpCisjZGVmaW5lIExJU1JfU0xJTSAoMTw8MTMpCisjZGVmaW5lIExJU1JfU0xJICgxPDwxMikKKyNkZWZpbmUgTElTUl9CUEVJICgxPDw5KQorI2RlZmluZSBMSVNSX0JQRSAoMTw8OCkKKyNkZWZpbmUgTElTUl9TUkJfQ01EICgxPDw1KQorI2RlZmluZSBMSVNSX0FTQl9SRVBMWSAoMTw8NCkKKyNkZWZpbmUgTElTUl9BU0JfRlJFRV9SRVEgKDE8PDIpCisjZGVmaW5lIExJU1JfQVJCX0ZSRUUgKDE8PDEpCisjZGVmaW5lIExJU1JfVFJCX0ZSQU1FICgxPDwwKQorCisjZGVmaW5lIFNJU1IgMHgxNgorI2RlZmluZSBTSVNSX1NVTSAweDE4CisjZGVmaW5lIFNJU1JfUlVNIDB4MUEKKyNkZWZpbmUgU0lTUl9NQVNLIDB4NTQKKyNkZWZpbmUgU0lTUl9NQVNLX1NVTSAweDU2CisjZGVmaW5lIFNJU1JfTUFTS19SVU0gMHg1OAorCisjZGVmaW5lIFNJU1JfTUkgKDE8PDE1KQorI2RlZmluZSBTSVNSX1NFUlJfRVJSICgxPDwxNCkKKyNkZWZpbmUgU0lTUl9USU1FUiAoMTw8MTEpCisjZGVmaW5lIFNJU1JfTEFQX1BBUl9FUlIgKDE8PDEwKQorI2RlZmluZSBTSVNSX0xBUF9BQ0NfRVJSICgxPDw5KQorI2RlZmluZSBTSVNSX1BBUl9FUlIgKDE8PDgpCisjZGVmaW5lIFNJU1JfQURBUFRFUl9DSEVDSyAoMTw8NikKKyNkZWZpbmUgU0lTUl9TUkJfUkVQTFkgKDE8PDUpCisjZGVmaW5lIFNJU1JfQVNCX0ZSRUUgKDE8PDQpCisjZGVmaW5lIFNJU1JfQVJCX0NNRCAoMTw8MykKKyNkZWZpbmUgU0lTUl9UUkJfUkVQTFkgKDE8PDIpCisKKyNkZWZpbmUgTUlTUl9SVU0gMHg1QQorI2RlZmluZSBNSVNSX01BU0sgMHg1QworI2RlZmluZSBNSVNSX01BU0tfUlVNIDB4NUUKKworI2RlZmluZSBNSVNSX1RYMl9JRExFICgxPDwxNSkKKyNkZWZpbmUgTUlTUl9UWDJfTk9fU1RBVFVTICgxPDwxNCkKKyNkZWZpbmUgTUlTUl9UWDJfSEFMVCAoMTw8MTMpCisjZGVmaW5lIE1JU1JfVFgyX0VPRiAoMTw8MTIpCisjZGVmaW5lIE1JU1JfVFgxX0lETEUgKDE8PDExKQorI2RlZmluZSBNSVNSX1RYMV9OT19TVEFUVVMgKDE8PDEwKQorI2RlZmluZSBNSVNSX1RYMV9IQUxUICgxPDw5KQorI2RlZmluZSBNSVNSX1RYMV9FT0YgKDE8PDgpCisjZGVmaW5lIE1JU1JfUlhfTk9CVUYgKDE8PDUpCisjZGVmaW5lIE1JU1JfUlhfRU9CICgxPDw0KQorI2RlZmluZSBNSVNSX1JYX05PX1NUQVRVUyAoMTw8MikKKyNkZWZpbmUgTUlTUl9SWF9IQUxUICgxPDwxKQorI2RlZmluZSBNSVNSX1JYX0VPRiAoMTw8MCkKKworI2RlZmluZSBMQVBBIDB4NjIKKyNkZWZpbmUgTEFQRSAweDY0CisjZGVmaW5lIExBUEQgMHg2NgorI2RlZmluZSBMQVBESU5DIDB4NjgKKyNkZWZpbmUgTEFQV1dPIDB4NkEKKyNkZWZpbmUgTEFQV1dDIDB4NkMKKyNkZWZpbmUgTEFQQ1RMIDB4NkUKKworI2RlZmluZSBUSU1FUiAweDRFNAorCisjZGVmaW5lIEJNQ1RMX1NVTSAweDUwCisjZGVmaW5lIEJNQ1RMX1JVTSAweDUyCisjZGVmaW5lIEJNQ1RMX1RYMV9ESVMgKDE8PDE0KQorI2RlZmluZSBCTUNUTF9UWDJfRElTICgxPDwxMCkKKyNkZWZpbmUgQk1DVExfUlhfRElTICgxPDw2KQorI2RlZmluZSBCTUNUTF9SWF9FTkFCTEVEICAoMTw8NSkKKworI2RlZmluZSBSWExCREEgIDB4OTAKKyNkZWZpbmUgUlhCREEgICAweDk0CisjZGVmaW5lIFJYU1RBVCAgMHg5OAorI2RlZmluZSBSWERCQSAgIDB4OUMKKworI2RlZmluZSBUWDFMRkRBIDB4QTAKKyNkZWZpbmUgVFgxRkRBICAweEE0CisjZGVmaW5lIFRYMVNUQVQgMHhBOAorI2RlZmluZSBUWDFEQkEgIDB4QUMKKyNkZWZpbmUgVFgyTEZEQSAweEIwCisjZGVmaW5lIFRYMkZEQSAgMHhCNAorI2RlZmluZSBUWDJTVEFUIDB4QjgKKyNkZWZpbmUgVFgyREJBICAweEJDCisKKyNkZWZpbmUgU1RSRUFNRVJfSU9fU1BBQ0UgMjU2CisKKyNkZWZpbmUgU1JCX0NPTU1BTkRfU0laRSA1MAorCisjZGVmaW5lIFNUUkVBTUVSX01BWF9BREFQVEVSUyA4CS8qIDB4MDggX19NT0RVTEVfU1RSSU5HIGNhbid0IGhhbmQgMHhubiAqLworCisvKiBEZWZpbmVzIGZvciBMQU4gU1RBVFVTIENIQU5HRSByZXBvcnRzICovCisjZGVmaW5lIExTQ19TSUdfTE9TUyAweDgwMDAKKyNkZWZpbmUgTFNDX0hBUkRfRVJSIDB4NDAwMAorI2RlZmluZSBMU0NfU09GVF9FUlIgMHgyMDAwCisjZGVmaW5lIExTQ19UUkFOX0JDTiAweDEwMDAKKyNkZWZpbmUgTFNDX0xXRiAgICAgIDB4MDgwMAorI2RlZmluZSBMU0NfQVJXICAgICAgMHgwNDAwCisjZGVmaW5lIExTQ19GUEUgICAgICAweDAyMDAKKyNkZWZpbmUgTFNDX1JSICAgICAgIDB4MDEwMAorI2RlZmluZSBMU0NfQ08gICAgICAgMHgwMDgwCisjZGVmaW5lIExTQ19TUyAgICAgICAweDAwNDAKKyNkZWZpbmUgTFNDX1JJTkdfUkVDIDB4MDAyMAorI2RlZmluZSBMU0NfU1JfQ08gICAgMHgwMDEwCisjZGVmaW5lIExTQ19GRFhfTU9ERSAweDAwMDQKKworLyogRGVmaW5lcyBmb3IgT1BFTiBBREFQVEVSIGNvbW1hbmQgKi8KKworI2RlZmluZSBPUEVOX0FEQVBURVJfRVhUX1dSQVAgKDE8PDE1KQorI2RlZmluZSBPUEVOX0FEQVBURVJfRElTX0hBUkRFRSAoMTw8MTQpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9ESVNfU09GVEVSUiAoMTw8MTMpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9QQVNTX0FEQ19NQUMgKDE8PDEyKQorI2RlZmluZSBPUEVOX0FEQVBURVJfUEFTU19BVFRfTUFDICgxPDwxMSkKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0VOQUJMRV9FQyAoMTw8MTApCisjZGVmaW5lIE9QRU5fQURBUFRFUl9DT05URU5ERVIgKDE8PDgpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9QQVNTX0JFQUNPTiAoMTw8NykKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0VOQUJMRV9GRFggKDE8PDYpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9FTkFCTEVfUlBMICgxPDw1KQorI2RlZmluZSBPUEVOX0FEQVBURVJfSU5ISUJJVF9FVFIgKDE8PDQpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9JTlRFUk5BTF9XUkFQICgxPDwzKQorCisKKy8qIERlZmluZXMgZm9yIFNSQiBDb21tYW5kcyAqLworI2RlZmluZSBTUkJfQ0xPU0VfQURBUFRFUiAweDA0CisjZGVmaW5lIFNSQl9DT05GSUdVUkVfQlJJREdFIDB4MGMKKyNkZWZpbmUgU1JCX0NPTkZJR1VSRV9IUF9DSEFOTkVMIDB4MTMKKyNkZWZpbmUgU1JCX01PRElGWV9CUklER0VfUEFSTVMgMHgxNQorI2RlZmluZSBTUkJfTU9ESUZZX09QRU5fT1BUSU9OUyAweDAxCisjZGVmaW5lIFNSQl9NT0RJRllfUkVDRUlWRV9PUFRJT05TIDB4MTcKKyNkZWZpbmUgU1JCX05PX09QRVJBVElPTiAweDAwCisjZGVmaW5lIFNSQl9PUEVOX0FEQVBURVIgMHgwMworI2RlZmluZSBTUkJfUkVBRF9MT0cgMHgwOAorI2RlZmluZSBTUkJfUkVBRF9TUl9DT1VOVEVSUyAweDE2CisjZGVmaW5lIFNSQl9SRVNFVF9HUk9VUF9BRERSRVNTIDB4MDIKKyNkZWZpbmUgU1JCX1JFU0VUX1RBUkdFVF9TRUdNRVROIDB4MTQKKyNkZWZpbmUgU1JCX1NBVkVfQ09ORklHVVJBVElPTiAweDFiCisjZGVmaW5lIFNSQl9TRVRfQlJJREdFX1BBUk1TIDB4MDkKKyNkZWZpbmUgU1JCX1NFVF9GVU5DX0FERFJFU1MgMHgwNworI2RlZmluZSBTUkJfU0VUX0dST1VQX0FERFJFU1MgMHgwNgorI2RlZmluZSBTUkJfU0VUX1RBUkdFVF9TRUdNRU5UIDB4MDUKKworLyogQ2xlYXIgcmV0dXJuIGNvZGUgKi8KKyNkZWZpbmUgU1RSRUFNRVJfQ0xFQVJfUkVUX0NPREUgMHhmZQorCisvKiBBUkIgQ29tbWFuZHMgKi8KKyNkZWZpbmUgQVJCX1JFQ0VJVkVfREFUQSAweDgxCisjZGVmaW5lIEFSQl9MQU5fQ0hBTkdFX1NUQVRVUyAweDg0CisKKy8qIEFTQiBSZXNwb25zZSBjb21tYW5kcyAqLworI2RlZmluZSBBU0JfUkVDRUlWRV9EQVRBIDB4ODEKKworCisvKiBTdHJlYW1lciBkZWZhdWx0cyBmb3IgYnVmZmVycyAqLworCisjZGVmaW5lIFNUUkVBTUVSX1JYX1JJTkdfU0laRSAxNgkvKiBzaG91bGQgYmUgYSBwb3dlciBvZiAyICovCisvKiBTZXR0aW5nIHRoZSBudW1iZXIgb2YgVFggZGVzY3JpcHRvcnMgdG8gMSBpcyBhIHdvcmthcm91bmQgZm9yIGFuCisgKiB1bmRvY3VtZW50ZWQgaGFyZHdhcmUgcHJvYmxlbSB3aXRoIHRoZSBsYW5zdHJlYW1lciBib2FyZC4gU2V0dGluZworICogdGhpcyB0byBzb21ldGhpbmcgaGlnaGVyIG1heSBzbGlnaHRseSBpbmNyZWFzZSB0aGUgdGhyb3VnaHB1dCB5b3UKKyAqIGNhbiBnZXQgZnJvbSB0aGUgY2FyZCwgYnV0IGF0IHRoZSByaXNrIG9mIGxvY2tpbmcgdXAgdGhlIGJveC4gLSAKKyAqIDx5b2RlcjFAdXMuaWJtLmNvbT4KKyAqLworI2RlZmluZSBTVFJFQU1FUl9UWF9SSU5HX1NJWkUgMQkvKiBzaG91bGQgYmUgYSBwb3dlciBvZiAyICovCisKKyNkZWZpbmUgUEtUX0JVRl9TWiA0MDk2CQkvKiBEZWZhdWx0IHBhY2tldCBzaXplICovCisKKy8qIFN0cmVhbWVyIGRhdGEgc3RydWN0dXJlcyAqLworCitzdHJ1Y3Qgc3RyZWFtZXJfdHhfZGVzYyB7CisJX191MzIgZm9yd2FyZDsKKwlfX3UzMiBzdGF0dXM7CisJX191MzIgYnVmY250X2ZyYW1lbGVuOworCV9fdTMyIGJ1ZmZlcjsKKwlfX3UzMiBidWZsZW47CisJX191MzIgcnN2ZDE7CisJX191MzIgcnN2ZDI7CisJX191MzIgcnN2ZDM7Cit9OworCitzdHJ1Y3Qgc3RyZWFtZXJfcnhfZGVzYyB7CisJX191MzIgZm9yd2FyZDsKKwlfX3UzMiBzdGF0dXM7CisJX191MzIgYnVmZmVyOworCV9fdTMyIGZyYW1lbGVuX2J1ZmxlbjsKK307CisKK3N0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIgeworCV9fdTE2IG5leHQ7CisJX191OCBwYWRkaW5nOworCV9fdTggZnJhbWVfc3RhdHVzOworCV9fdTE2IGJ1ZmZlcl9sZW5ndGg7CisJX191OCBmcmFtZV9kYXRhOworfTsKKworc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgeworCisJX191MTYgc3JiOworCV9fdTE2IHRyYjsKKwlfX3UxNiBhcmI7CisJX191MTYgYXNiOworCisgICAgICAgIHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpuZXh0OworICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwlfX3U4IF9faW9tZW0gKnN0cmVhbWVyX21taW87CisgICAgICAgIGNoYXIgKnN0cmVhbWVyX2NhcmRfbmFtZTsKKyAKKyAgICAgICAgc3BpbmxvY2tfdCBzdHJlYW1lcl9sb2NrOworCisJdm9sYXRpbGUgaW50IHNyYl9xdWV1ZWQ7CS8qIFRydWUgaWYgYW4gU1JCIGlzIHN0aWxsIHBvc3RlZCAqLworCXdhaXRfcXVldWVfaGVhZF90IHNyYl93YWl0OworCisJdm9sYXRpbGUgaW50IGFzYl9xdWV1ZWQ7CS8qIFRydWUgaWYgYW4gQVNCIGlzIHBvc3RlZCAqLworCisJdm9sYXRpbGUgaW50IHRyYl9xdWV1ZWQ7CS8qIFRydWUgaWYgYSBUUkIgaXMgcG9zdGVkICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgdHJiX3dhaXQ7CisKKwlzdHJ1Y3Qgc3RyZWFtZXJfcnhfZGVzYyAqc3RyZWFtZXJfcnhfcmluZzsKKwlzdHJ1Y3Qgc3RyZWFtZXJfdHhfZGVzYyAqc3RyZWFtZXJfdHhfcmluZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfcmluZ19za2JbU1RSRUFNRVJfVFhfUklOR19TSVpFXSwKKwkgICAgKnJ4X3Jpbmdfc2tiW1NUUkVBTUVSX1JYX1JJTkdfU0laRV07CisJaW50IHR4X3JpbmdfZnJlZSwgdHhfcmluZ19sYXN0X3N0YXR1cywgcnhfcmluZ19sYXN0X3JlY2VpdmVkLAorCSAgICBmcmVlX3R4X3JpbmdfZW50cmllczsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0cmVhbWVyX3N0YXRzOworCV9fdTE2IHN0cmVhbWVyX2xhbl9zdGF0dXM7CisJX191OCBzdHJlYW1lcl9yaW5nX3NwZWVkOworCV9fdTE2IHBrdF9idWZfc3o7CisJX191OCBzdHJlYW1lcl9yZWNlaXZlX29wdGlvbnMsIHN0cmVhbWVyX2NvcHlfYWxsX29wdGlvbnMsCisJICAgIHN0cmVhbWVyX21lc3NhZ2VfbGV2ZWw7CisJX191MTYgc3RyZWFtZXJfYWRkcl90YWJsZV9hZGRyLCBzdHJlYW1lcl9wYXJtc19hZGRyOworCV9fdTE2IG1hY19yeF9idWZmZXI7CisJX191OCBzdHJlYW1lcl9sYWFbNl07Cit9OworCitzdHJ1Y3Qgc3RyZWFtZXJfYWRhcHRlcl9hZGRyX3RhYmxlIHsKKworCV9fdTggbm9kZV9hZGRyWzZdOworCV9fdTggcmVzZXJ2ZWRbNF07CisJX191OCBmdW5jX2FkZHJbNF07Cit9OworCitzdHJ1Y3Qgc3RyZWFtZXJfcGFyYW1ldGVyc190YWJsZSB7CisKKwlfX3U4IHBoeXNfYWRkcls0XTsKKwlfX3U4IHVwX25vZGVfYWRkcls2XTsKKwlfX3U4IHVwX3BoeXNfYWRkcls0XTsKKwlfX3U4IHBvbGxfYWRkcls2XTsKKwlfX3UxNiByZXNlcnZlZDsKKwlfX3UxNiBhY2NfcHJpb3JpdHk7CisJX191MTYgYXV0aF9zb3VyY2VfY2xhc3M7CisJX191MTYgYXR0X2NvZGU7CisJX191OCBzb3VyY2VfYWRkcls2XTsKKwlfX3UxNiBiZWFjb25fdHlwZTsKKwlfX3UxNiBtYWpvcl92ZWN0b3I7CisJX191MTYgbGFuX3N0YXR1czsKKwlfX3UxNiBzb2Z0X2Vycm9yX3RpbWU7CisJX191MTYgcmVzZXJ2ZWQxOworCV9fdTE2IGxvY2FsX3Jpbmc7CisJX191MTYgbW9uX2Vycm9yOworCV9fdTE2IGJlYWNvbl90cmFuc21pdDsKKwlfX3UxNiBiZWFjb25fcmVjZWl2ZTsKKwlfX3UxNiBmcmFtZV9jb3JyZWw7CisJX191OCBiZWFjb25fbmF1bls2XTsKKwlfX3UzMiByZXNlcnZlZDI7CisJX191OCBiZWFjb25fcGh5c1s0XTsKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL21hZGdlbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmFlMmJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL21hZGdlbWMuYwpAQCAtMCwwICsxLDgwMCBAQAorLyoKKyAqICBtYWRnZW1jLmM6IERyaXZlciBmb3IgdGhlIE1hZGdlIFNtYXJ0IDE2LzQgTUMxNiBNQ0EgdG9rZW4gcmluZyBjYXJkLgorICoKKyAqICBXcml0dGVuIDIwMDAgYnkgQWRhbSBGcml0emxlcgorICoKKyAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgVGhpcyBkcml2ZXIgbW9kdWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY2FyZHM6CisgKiAgICAgIC0gTWFkZ2UgU21hcnQgMTYvNCBSaW5nbm9kZSBNQzE2CisgKgktIE1hZGdlIFNtYXJ0IDE2LzQgUmluZ25vZGUgTUMzMiAoPz8pCisgKgorICogIE1haW50YWluZXIocyk6CisgKiAgICBBRglBZGFtIEZyaXR6bGVyCQltaWRAYXVrLmN4CisgKgorICogIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorICoJMTYtSmFuLTAwCUFGCUNyZWF0ZWQKKyAqCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9ICJtYWRnZW1jLmM6IHYwLjkxIDIzLzAxLzIwMDAgYnkgQWRhbSBGcml0emxlclxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS1sZWdhY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgInRtczM4MHRyLmgiCisjaW5jbHVkZSAibWFkZ2VtYy5oIiAgICAgICAgICAgIC8qIE1hZGdlLXNwZWNpZmljIGNvbnN0YW50cyAqLworCisjZGVmaW5lIE1BREdFTUNfSU9fRVhURU5UIDMyCisjZGVmaW5lIE1BREdFTUNfU0lGX09GRlNFVCAweDA4CisKK3N0cnVjdCBtYWRnZW1jX2NhcmQgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkvKgorCSAqIFRoZXNlIGFyZSByZWFkIGZyb20gdGhlIEJJQSBST00uCisJICovCisJdW5zaWduZWQgaW50IG1hbmlkOworCXVuc2lnbmVkIGludCBjYXJkdHlwZTsKKwl1bnNpZ25lZCBpbnQgY2FyZHJldjsKKwl1bnNpZ25lZCBpbnQgcmFtc2l6ZTsKKwkKKwkvKgorCSAqIFRoZXNlIGFyZSByZWFkIGZyb20gdGhlIE1DQSBQT1MgcmVnaXN0ZXJzLiAgCisJICovCisJdW5zaWduZWQgaW50IGJ1cnN0bW9kZToyOworCXVuc2lnbmVkIGludCBmYWlybmVzczoxOyAvKiAwID0gRmFpciwgMSA9IFVuZmFpciAqLworCXVuc2lnbmVkIGludCBhcmJsZXZlbDo0OworCXVuc2lnbmVkIGludCByaW5nc3BlZWQ6MjsgLyogMCA9IDRtYiwgMSA9IDE2LCAyID0gQXV0by9ub25lICovCisJdW5zaWduZWQgaW50IGNhYmxldHlwZToxOyAvKiAwID0gUko0NSwgMSA9IERCOSAqLworCisJc3RydWN0IG1hZGdlbWNfY2FyZCAqbmV4dDsKK307CitzdGF0aWMgc3RydWN0IG1hZGdlbWNfY2FyZCAqbWFkZ2VtY19jYXJkX2xpc3Q7CisKKworc3RhdGljIGludCBtYWRnZW1jX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1hZGdlbWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1hZGdlbWNfY2hpcHNldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbWFkZ2VtY19yZWFkX3JvbShzdHJ1Y3QgbWFkZ2VtY19jYXJkICpjYXJkKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBtYWRnZW1jX3NldG5zZWxvdXRfcGlucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG1hZGdlbWNfc2V0Y2FibGV0eXBlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB0eXBlKTsKKworc3RhdGljIGludCBtYWRnZW1jX21jYXByb2MoY2hhciAqYnVmLCBpbnQgc2xvdCwgdm9pZCAqZCk7CisKK3N0YXRpYyB2b2lkIG1hZGdlbWNfc2V0cmVncGFnZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGFnZSk7CitzdGF0aWMgdm9pZCBtYWRnZW1jX3NldHNpZnNlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmFsKTsKK3N0YXRpYyB2b2lkIG1hZGdlbWNfc2V0aW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2YWwpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFkZ2VtY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qCisgKiBUaGVzZSB3b3JrIGFyb3VuZCBwYWdpbmcsIGhvd2V2ZXIgdGhleSBkb24ndCBndWFyZW50ZWUgeW91J3JlIG9uIHRoZQorICogcmlnaHQgcGFnZS4KKyAqLworI2RlZmluZSBTSUZSRUFEQihyZWcpIChpbmIoZGV2LT5iYXNlX2FkZHIgKyAoKHJlZzwweDgpP3JlZzpyZWctMHg4KSkpCisjZGVmaW5lIFNJRldSSVRFQih2YWwsIHJlZykgKG91dGIodmFsLCBkZXYtPmJhc2VfYWRkciArICgocmVnPDB4OCk/cmVnOnJlZy0weDgpKSkKKyNkZWZpbmUgU0lGUkVBRFcocmVnKSAoaW53KGRldi0+YmFzZV9hZGRyICsgKChyZWc8MHg4KT9yZWc6cmVnLTB4OCkpKQorI2RlZmluZSBTSUZXUklURVcodmFsLCByZWcpIChvdXR3KHZhbCwgZGV2LT5iYXNlX2FkZHIgKyAoKHJlZzwweDgpP3JlZzpyZWctMHg4KSkpCisKKy8qCisgKiBSZWFkIGEgYnl0ZS1sZW5ndGggdmFsdWUgZnJvbSB0aGUgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBtYWRnZW1jX3NpZnJlYWRiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwl1bnNpZ25lZCBzaG9ydCByZXQ7CisJaWYgKHJlZzwweDgpCQorCQlyZXQgPSBTSUZSRUFEQihyZWcpOworCWVsc2UgeworCQltYWRnZW1jX3NldHJlZ3BhZ2UoZGV2LCAxKTsJCisJCXJldCA9IFNJRlJFQURCKHJlZyk7CisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDApOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogV3JpdGUgYSBieXRlLWxlbmd0aCB2YWx1ZSB0byBhIHJlZ2lzdGVyLgorICovCitzdGF0aWMgdm9pZCBtYWRnZW1jX3NpZndyaXRlYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2YWwsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlpZiAocmVnPDB4OCkKKwkJU0lGV1JJVEVCKHZhbCwgcmVnKTsKKwllbHNlIHsKKwkJbWFkZ2VtY19zZXRyZWdwYWdlKGRldiwgMSk7CisJCVNJRldSSVRFQih2YWwsIHJlZyk7CisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDApOworCX0KKwlyZXR1cm47Cit9CisKKy8qCisgKiBSZWFkIGEgd29yZC1sZW5ndGggdmFsdWUgZnJvbSBhIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBtYWRnZW1jX3NpZnJlYWR3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwl1bnNpZ25lZCBzaG9ydCByZXQ7CisJaWYgKHJlZzwweDgpCQorCQlyZXQgPSBTSUZSRUFEVyhyZWcpOworCWVsc2UgeworCQltYWRnZW1jX3NldHJlZ3BhZ2UoZGV2LCAxKTsJCisJCXJldCA9IFNJRlJFQURXKHJlZyk7CisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDApOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogV3JpdGUgYSB3b3JkLWxlbmd0aCB2YWx1ZSB0byBhIHJlZ2lzdGVyLgorICovCitzdGF0aWMgdm9pZCBtYWRnZW1jX3NpZndyaXRldyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2YWwsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlpZiAocmVnPDB4OCkKKwkJU0lGV1JJVEVXKHZhbCwgcmVnKTsKKwllbHNlIHsKKwkJbWFkZ2VtY19zZXRyZWdwYWdlKGRldiwgMSk7CisJCVNJRldSSVRFVyh2YWwsIHJlZyk7CisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDApOworCX0KKwlyZXR1cm47Cit9CisKKworCitzdGF0aWMgaW50IF9faW5pdCBtYWRnZW1jX3Byb2JlKHZvaWQpCit7CQorCXN0YXRpYyBpbnQgdmVyc2lvbnByaW50ZWQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cDsKKwlzdHJ1Y3QgbWFkZ2VtY19jYXJkICpjYXJkOworCWludCBpLHNsb3QgPSAwOworCV9fdTggcG9zcmVnWzRdOworCisJaWYgKCFNQ0FfYnVzKQorCQlyZXR1cm4gLTE7CQorIAorCXdoaWxlIChzbG90ICE9IE1DQV9OT1RGT1VORCkgeworCQkvKgorCQkgKiBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IHRoZSBNQzE2LzMyIChNQ0EgSUQgMDAyZCkKKwkJICovCisJCXNsb3QgPSBtY2FfZmluZF91bnVzZWRfYWRhcHRlcigweDAwMmQsIHNsb3QpOworCQlpZiAoc2xvdCA9PSBNQ0FfTk9URk9VTkQpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBJZiB3ZSBnZXQgaGVyZSwgd2UgaGF2ZSBhbiBhZGFwdGVyLgorCQkgKi8KKwkJaWYgKHZlcnNpb25wcmludGVkKysgPT0gMCkKKwkJCXByaW50aygiJXMiLCB2ZXJzaW9uKTsKKworCQlkZXYgPSBhbGxvY190cmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCQlpZiAoZGV2ID09IE5VTEwpIHsKKwkJCXByaW50aygibWFkZ2VtYzogdW5hYmxlIHRvIGFsbG9jYXRlIGRldiBzcGFjZVxuIik7CisJCQlpZiAobWFkZ2VtY19jYXJkX2xpc3QpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJCWRldi0+ZG1hID0gMDsKKworCQkvKgorCQkgKiBGZXRjaCBNQ0EgY29uZmlnIHJlZ2lzdGVycworCQkgKi8KKwkJZm9yKGk9MDtpPDQ7aSsrKQorCQkJcG9zcmVnW2ldID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCBpKzIpOworCQkKKwkJY2FyZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtYWRnZW1jX2NhcmQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGNhcmQ9PU5VTEwpIHsKKwkJCXByaW50aygibWFkZ2VtYzogdW5hYmxlIHRvIGFsbG9jYXRlIGNhcmQgc3RydWN0XG4iKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQlpZiAobWFkZ2VtY19jYXJkX2xpc3QpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY2FyZC0+ZGV2ID0gZGV2OworCisJCS8qCisJCSAqIFBhcnNlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICBUaGlzIGFsbCBjb21lcworCQkgKiBkaXJlY3RseSBmcm9tIHRoZSBwdWJsaWNseSBhdmFpbGFibGUgQDAwMmQuQURGLgorCQkgKiBHZXQgaXQgZnJvbSBNYWRnZSBvciB5b3VyIGxvY2FsIEFERiBsaWJyYXJ5LgorCQkgKi8KKworCQkvKgorCQkgKiBCYXNlIGFkZHJlc3MgCisJCSAqLworCQlkZXYtPmJhc2VfYWRkciA9IDB4MGEyMCArIAorCQkJKChwb3NyZWdbMl0gJiBNQzE2X1BPUzJfQUREUjIpPzB4MDQwMDowKSArCisJCQkoKHBvc3JlZ1swXSAmIE1DMTZfUE9TMF9BRERSMSk/MHgxMDAwOjApICsKKwkJCSgocG9zcmVnWzNdICYgTUMxNl9QT1MzX0FERFIzKT8weDIwMDA6MCk7CisKKwkJLyoKKwkJICogSW50ZXJydXB0IGxpbmUKKwkJICovCisJCXN3aXRjaChwb3NyZWdbMF0gPj4gNikgeyAvKiB1cHBlciB0d28gYml0cyAqLworCQljYXNlIDB4MTogZGV2LT5pcnEgPSAzOyBicmVhazsKKwkJY2FzZSAweDI6IGRldi0+aXJxID0gOTsgYnJlYWs7IC8qIElSUSAyID0gSVJRIDkgKi8KKwkJY2FzZSAweDM6IGRldi0+aXJxID0gMTA7IGJyZWFrOworCQlkZWZhdWx0OiBkZXYtPmlycSA9IDA7IGJyZWFrOworCQl9CisKKwkJaWYgKGRldi0+aXJxID09IDApIHsKKwkJCXByaW50aygiJXM6IGludmFsaWQgSVJRXG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBnZXRvdXQxOworCQl9CisKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTUFER0VNQ19JT19FWFRFTlQsIAorCQkJCSAgICJtYWRnZW1jIikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIm1hZGdlbWM6IHVuYWJsZSB0byBzZXR1cCBTbWFydCBNQyBpbiBzbG90ICVkIGJlY2F1c2Ugb2YgSS9PIGJhc2UgY29uZmxpY3QgYXQgMHglMDRseFxuIiwgc2xvdCwgZGV2LT5iYXNlX2FkZHIpOworCQkJZGV2LT5iYXNlX2FkZHIgKz0gTUFER0VNQ19TSUZfT0ZGU0VUOworCQkJZ290byBnZXRvdXQxOworCQl9CisJCWRldi0+YmFzZV9hZGRyICs9IE1BREdFTUNfU0lGX09GRlNFVDsKKwkJCisJCS8qCisJCSAqIEFyYml0cmF0aW9uIExldmVsCisJCSAqLworCQljYXJkLT5hcmJsZXZlbCA9ICgocG9zcmVnWzBdID4+IDEpICYgMHg3KSArIDg7CisKKwkJLyoKKwkJICogQnVyc3QgbW9kZSBhbmQgRmFpcm5lc3MKKwkJICovCisJCWNhcmQtPmJ1cnN0bW9kZSA9ICgocG9zcmVnWzJdID4+IDYpICYgMHgzKTsKKwkJY2FyZC0+ZmFpcm5lc3MgPSAoKHBvc3JlZ1syXSA+PiA0KSAmIDB4MSk7CisKKwkJLyoKKwkJICogUmluZyBTcGVlZAorCQkgKi8KKwkJaWYgKChwb3NyZWdbMV0gPj4gMikmMHgxKQorCQkJY2FyZC0+cmluZ3NwZWVkID0gMjsgLyogbm90IHNlbGVjdGVkICovCisJCWVsc2UgaWYgKChwb3NyZWdbMl0gPj4gNSkgJiAweDEpCisJCQljYXJkLT5yaW5nc3BlZWQgPSAxOyAvKiAxNk1iICovCisJCWVsc2UKKwkJCWNhcmQtPnJpbmdzcGVlZCA9IDA7IC8qIDRNYiAqLworCisJCS8qIAorCQkgKiBDYWJsZSB0eXBlCisJCSAqLworCQlpZiAoKHBvc3JlZ1sxXSA+PiA2KSYweDEpCisJCQljYXJkLT5jYWJsZXR5cGUgPSAxOyAvKiBTVFAvREI5ICovCisJCWVsc2UKKwkJCWNhcmQtPmNhYmxldHlwZSA9IDA7IC8qIFVUUC9SSi00NSAqLworCisKKwkJLyogCisJCSAqIFJPTSBJbmZvLiBUaGlzIHJlcXVpcmVzIHVzIHRvIGFjdHVhbGx5IHR3aWRkbGUKKwkJICogYml0cyBvbiB0aGUgY2FyZCwgc28gd2UgbXVzdCBlbnN1cmUgYWJvdmUgdGhhdCAKKwkJICogdGhlIGJhc2UgYWRkcmVzcyBpcyBmcmVlIG9mIGNvbmZsaWN0IChyZXF1ZXN0X3JlZ2lvbiBhYm92ZSkuCisJCSAqLworCQltYWRnZW1jX3JlYWRfcm9tKGNhcmQpOworCQkKKwkJaWYgKGNhcmQtPm1hbmlkICE9IDB4NGQpIHsgLyogc29tZXRoaW5nIHdlbnQgd3JvbmcgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNYWRnZSBNQyBST00gcmVhZCBmYWlsZWQgKHVua25vd24gbWFudWZhY3R1cmVyIElEICUwMngpXG4iLCBkZXYtPm5hbWUsIGNhcmQtPm1hbmlkKTsKKwkJCWdvdG8gZ2V0b3V0OworCQl9CisJCQorCQlpZiAoKGNhcmQtPmNhcmR0eXBlICE9IDB4MDgpICYmIChjYXJkLT5jYXJkdHlwZSAhPSAweDBkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1hZGdlIE1DIFJPTSByZWFkIGZhaWxlZCAodW5rbm93biBjYXJkIElEICUwMngpXG4iLCBkZXYtPm5hbWUsIGNhcmQtPmNhcmR0eXBlKTsKKwkJCWdvdG8gZ2V0b3V0OworCQl9CisJICAgICAgIAorCQkvKiBBbGwgY2FyZHMgZXhjZXB0IFJldiAwIGFuZCAxIE1DMTYncyBoYXZlIDI1NmtiIG9mIFJBTSAqLworCQlpZiAoKGNhcmQtPmNhcmR0eXBlID09IDB4MDgpICYmIChjYXJkLT5jYXJkcmV2IDw9IDB4MDEpKQorCQkJY2FyZC0+cmFtc2l6ZSA9IDEyODsKKwkJZWxzZQorCQkJY2FyZC0+cmFtc2l6ZSA9IDI1NjsKKworCQlwcmludGsoIiVzOiAlcyBSZXYgJWQgYXQgMHglMDRseCBJUlEgJWRcbiIsIAorCQkgICAgICAgZGV2LT5uYW1lLCAKKwkJICAgICAgIChjYXJkLT5jYXJkdHlwZSA9PSAweDA4KT9NQURHRU1DMTZfQ0FSRE5BTUU6CisJCSAgICAgICBNQURHRU1DMzJfQ0FSRE5BTUUsIGNhcmQtPmNhcmRyZXYsIAorCQkgICAgICAgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKworCQlpZiAoY2FyZC0+Y2FyZHR5cGUgPT0gMHgwZCkKKwkJCXByaW50aygiJXM6ICAgICBXYXJuaW5nOiBNQzMyIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsIGFuZCBoaWdobHkgdW50ZXN0ZWRcbiIsIGRldi0+bmFtZSk7CisJCQorCQlpZiAoY2FyZC0+cmluZ3NwZWVkPT0yKSB7IC8qIFVua25vd24gKi8KKwkJCXByaW50aygiJXM6ICAgICBXYXJuaW5nOiBSaW5nIHNwZWVkIG5vdCBzZXQgaW4gUE9TIC0tIFBsZWFzZSBydW4gdGhlIHJlZmVyZW5jZSBkaXNrIGFuZCBzZXQgaXQhXG4iLCBkZXYtPm5hbWUpOworCQkJY2FyZC0+cmluZ3NwZWVkID0gMTsgLyogZGVmYXVsdCB0byAxNm1iICovCisJCX0KKwkJCisJCXByaW50aygiJXM6ICAgICBSQU0gU2l6ZTogJWRLQlxuIiwgZGV2LT5uYW1lLCBjYXJkLT5yYW1zaXplKTsKKworCQlwcmludGsoIiVzOiAgICAgUmluZyBTcGVlZDogJWRNYi9zZWMgb24gJXNcbiIsIGRldi0+bmFtZSwgCisJCSAgICAgICAoY2FyZC0+cmluZ3NwZWVkKT8xNjo0LCAKKwkJICAgICAgIGNhcmQtPmNhYmxldHlwZT8iU1RQL0RCOSI6IlVUUC9SSi00NSIpOworCQlwcmludGsoIiVzOiAgICAgQXJiaXRyYXRpb24gTGV2ZWw6ICVkXG4iLCBkZXYtPm5hbWUsIAorCQkgICAgICAgY2FyZC0+YXJibGV2ZWwpOworCisJCXByaW50aygiJXM6ICAgICBCdXJzdCBNb2RlOiAiLCBkZXYtPm5hbWUpOworCQlzd2l0Y2goY2FyZC0+YnVyc3Rtb2RlKSB7CisJCWNhc2UgMDogcHJpbnRrKCJDeWNsZSBzdGVhbCIpOyBicmVhazsKKwkJY2FzZSAxOiBwcmludGsoIkxpbWl0ZWQgYnVyc3QiKTsgYnJlYWs7CisJCWNhc2UgMjogcHJpbnRrKCJEZWxheWVkIHJlbGVhc2UiKTsgYnJlYWs7CisJCWNhc2UgMzogcHJpbnRrKCJJbW1lZGlhdGUgcmVsZWFzZSIpOyBicmVhazsKKwkJfQorCQlwcmludGsoIiAoJXMpXG4iLCAoY2FyZC0+ZmFpcm5lc3MpPyJVbmZhaXIiOiJGYWlyIik7CisKKworCQkvKiAKKwkJICogRW5hYmxlIFNJRiBiZWZvcmUgd2UgYXNzaWduIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwKKwkJICoganVzdCBpbiBjYXNlIHdlIGdldCBzcHVyaW91cyBpbnRlcnJ1cHRzIHRoYXQgbmVlZAorCQkgKiBoYW5kbGluZy4KKwkJICovIAorCQlvdXRiKDAsIGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcwKTsgLyogc2FuaXR5ICovCisJCW1hZGdlbWNfc2V0c2lmc2VsKGRldiwgMSk7CisJCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgbWFkZ2VtY19pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJICAgICAgICJtYWRnZW1jIiwgZGV2KSkgCisJCQlnb3RvIGdldG91dDsKKwkJCisJCW1hZGdlbWNfY2hpcHNldF9pbml0KGRldik7IC8qIGVuYWJsZXMgaW50ZXJydXB0cyEgKi8KKwkJbWFkZ2VtY19zZXRjYWJsZXR5cGUoZGV2LCBjYXJkLT5jYWJsZXR5cGUpOworCisJCS8qIFNldHVwIE1DQSBzdHJ1Y3R1cmVzICovCisJCW1jYV9zZXRfYWRhcHRlcl9uYW1lKHNsb3QsIChjYXJkLT5jYXJkdHlwZSA9PSAweDA4KT9NQURHRU1DMTZfQ0FSRE5BTUU6TUFER0VNQzMyX0NBUkROQU1FKTsKKwkJbWNhX3NldF9hZGFwdGVyX3Byb2NmbihzbG90LCBtYWRnZW1jX21jYXByb2MsIGRldik7CisJCW1jYV9tYXJrX2FzX3VzZWQoc2xvdCk7CisKKwkJcHJpbnRrKCIlczogICAgIFJpbmcgU3RhdGlvbiBBZGRyZXNzOiAiLCBkZXYtPm5hbWUpOworCQlwcmludGsoIiUyLjJ4IiwgZGV2LT5kZXZfYWRkclswXSk7CisJCWZvciAoaSA9IDE7IGkgPCA2OyBpKyspCisJCQlwcmludGsoIjolMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCQlwcmludGsoIlxuIik7CisKKwkJLyogWFhYIGlzIElTQV9NQVhfQUREUkVTUyBjb3JyZWN0IGhlcmU/ICovCisJCWlmICh0bXNkZXZfaW5pdChkZXYsIElTQV9NQVhfQUREUkVTUywgTlVMTCkpIHsKKwkJCXByaW50aygiJXM6IHVuYWJsZSB0byBnZXQgbWVtb3J5IGZvciBkZXYtPnByaXYuXG4iLCAKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHItTUFER0VNQ19TSUZfT0ZGU0VULCAKKwkJCSAgICAgICBNQURHRU1DX0lPX0VYVEVOVCk7IAorCQkJCisJCQlrZnJlZShjYXJkKTsKKwkJCXRtc2Rldl90ZXJtKGRldik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJaWYgKG1hZGdlbWNfY2FyZF9saXN0KQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIC0xOworCQl9CisJCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQkvKiAKKwkJICogVGhlIE1DMTYgaXMgcGh5c2ljYWxseSBhIDMyYml0IGNhcmQuICBIb3dldmVyLCBNYWRnZQorCQkgKiBpbnNpc3RzIG9uIGNhbGxpbmcgaXQgMTZiaXQsIHNvIEknbGwgYXNzdW1lIGhlcmUgdGhhdAorCQkgKiB0aGV5IGtub3cgd2hhdCB0aGV5J3JlIHRhbGtpbmcgYWJvdXQuICBDdXQgb2ZmIERNQQorCQkgKiBhdCAxNm1iLgorCQkgKi8KKwkJdHAtPnNldG5zZWxvdXQgPSBtYWRnZW1jX3NldG5zZWxvdXRfcGluczsKKwkJdHAtPnNpZndyaXRlYiA9IG1hZGdlbWNfc2lmd3JpdGViOworCQl0cC0+c2lmcmVhZGIgPSBtYWRnZW1jX3NpZnJlYWRiOworCQl0cC0+c2lmd3JpdGV3ID0gbWFkZ2VtY19zaWZ3cml0ZXc7CisJCXRwLT5zaWZyZWFkdyA9IG1hZGdlbWNfc2lmcmVhZHc7CisJCXRwLT5EYXRhUmF0ZSA9IChjYXJkLT5yaW5nc3BlZWQpP1NQRUVEXzE2OlNQRUVEXzQ7CisKKwkJbWVtY3B5KHRwLT5Qcm9kdWN0SUQsICJNYWRnZSBNQ0EgMTYvNCAgICAiLCBQUk9EX0lEX1NJWkUgKyAxKTsKKworCQlkZXYtPm9wZW4gPSBtYWRnZW1jX29wZW47CisJCWRldi0+c3RvcCA9IG1hZGdlbWNfY2xvc2U7CisKKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCS8qIEVubGlzdCBpbiB0aGUgY2FyZCBsaXN0ICovCisJCQljYXJkLT5uZXh0ID0gbWFkZ2VtY19jYXJkX2xpc3Q7CisJCQltYWRnZW1jX2NhcmRfbGlzdCA9IGNhcmQ7CisJCQlzbG90Kys7CisJCQljb250aW51ZTsgLyogc3VjY2Vzc2Z1bCwgdHJ5IHRvIGZpbmQgYW5vdGhlciAqLworCQl9CisJCQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlnZXRvdXQ6CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLU1BREdFTUNfU0lGX09GRlNFVCwgCisJCQkgICAgICAgTUFER0VNQ19JT19FWFRFTlQpOyAKKwlnZXRvdXQxOgorCQlrZnJlZShjYXJkKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJc2xvdCsrOworCX0KKworCWlmIChtYWRnZW1jX2NhcmRfbGlzdCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC0xOworfQorCisvKgorICogSGFuZGxlIGludGVycnVwdHMgZ2VuZXJhdGVkIGJ5IHRoZSBjYXJkCisgKgorICogVGhlIE1pY3JvQ2hhbm5lbCBNYWRnZSBjYXJkcyBuZWVkIHNsaWdodGx5IG1vcmUgaGFuZGxpbmcKKyAqIGFmdGVyIGFuIGludGVycnVwdCB0aGFuIG90aGVyIFRNUzM4MCBjYXJkcyBkby4KKyAqCisgKiBGaXJzdCB3ZSBtdXN0IG1ha2Ugc3VyZSBpdCB3YXMgdGhpcyBjYXJkIHRoYXQgZ2VuZXJhdGVkIHRoZQorICogaW50ZXJydXB0IChzaW5jZSBpbnRlcnJ1cHQgc2hhcmluZyBpcyBhbGxvd2VkKS4gIFRoZW4sCisgKiBiZWNhdXNlIHdlJ3JlIHVzaW5nIGxldmVsLXRyaWdnZXJlZCBpbnRlcnJ1cHRzIChhcyBpcworICogc3RhbmRhcmQgb24gTUNBKSwgd2UgbXVzdCB0b2dnbGUgdGhlIGludGVycnVwdCBsaW5lCisgKiBvbiB0aGUgY2FyZCBpbiBvcmRlciB0byBjbGFpbSBhbmQgYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdC4KKyAqIE9uY2UgdGhhdCBpcyBkb25lLCB0aGUgaW50ZXJydXB0IHNob3VsZCBiZSBoYW5kbGFibGUgaW4KKyAqIHRoZSBub3JtYWwgdG1zMzgwdHJfaW50ZXJydXB0KCkgcm91dGluZS4KKyAqCisgKiBUaGVyZSdzIHR3byB3YXlzIHdlIGNhbiBjaGVjayB0byBzZWUgaWYgdGhlIGludGVycnVwdCBpcyBvdXJzLAorICogYm90aCB3aXRoIHRoZWlyIG93biBkaXNhZHZhbnRhZ2VzLi4uCisgKgorICogMSkgIAlSZWFkIGluIHRoZSBTSUZTVFMgcmVnaXN0ZXIgZnJvbSB0aGUgVE1TIGNvbnRyb2xsZXIuICBUaGlzCisgKglpcyBndWFyZW50ZWVkIHRvIGJlIGFjY3VyYXRlLCBob3dldmVyLCB0aGVyZSdzIGEgZmFpcmx5CisgKglsYXJnZSBwZXJmb3JtYW5jZSBwZW5hbHR5IGZvciBkb2luZyBzbzogdGhlIE1hZGdlIGNoaXBzCisgKgltdXN0IHJlcXVlc3QgdGhlIHJlZ2lzdGVyIGZyb20gdGhlIEVhZ2xlLCB0aGUgRWFnbGUgbXVzdAorICoJcmVhZCB0aGVtIGZyb20gaXRzIGludGVybmFsIGJ1cywgYW5kIHRoZW4gdGFrZSB0aGUgcm91dGUKKyAqCWJhY2sgb3V0IGFnYWluLCBmb3IgYSAxNmJpdCByZWFkLiAgCisgKgorICogMikJVXNlIHRoZSBNQ19DT05UUk9MX1JFRzBfU0lOVFIgYml0IGZyb20gdGhlIE1hZGdlIEFTSUNzLgorICoJVGhlIG1ham9yIGRpc2FkdmFudGFnZSBoZXJlIGlzIHRoYXQgdGhlIGFjY3VyYWN5IG9mIHRoZQorICoJYml0IGlzIGluIHF1ZXN0aW9uLiAgSG93ZXZlciwgaXQgY3V0cyBvdXQgdGhlIGV4dHJhIHJlYWQKKyAqCWN5Y2xlcyBpdCB0YWtlcyB0byByZWFkIHRoZSBFYWdsZSdzIFNJRiwgYXMgaXRzIG9ubHkgYW4KKyAqCThiaXQgcmVhZCwgYW5kIHRoZW9yZXRpY2FsbHkgdGhlIE1hZGdlIGJpdCBpcyBkaXJlY3RseQorICoJY29ubmVjdGVkIHRvIHRoZSBpbnRlcnJ1cHQgbGF0Y2ggY29taW5nIG91dCBvZiB0aGUgRWFnbGUKKyAqCWhhcmR3YXJlICh0aGF0IHN0YXRlbWVudCBpcyBub3QgdmVyaWZpZWQpLiAgCisgKgorICogSSBjYW4ndCBkZXRlcm1pbmUgd2hpY2ggb2YgdGhlc2UgbWV0aG9kcyBoYXMgdGhlIGJlc3Qgd2luLiAgRm9yIG5vdywKKyAqIHdlIG1ha2UgYSBjb21wcm9taXNlLiAgVXNlIHRoZSBNYWRnZSB3YXkgZm9yIHRoZSBmaXJzdCBpbnRlcnJ1cHQsCisgKiB3aGljaCBzaG91bGQgYmUgdGhlIGZhc3QtcGF0aCwgYW5kIHRoZW4gb25jZSB3ZSBoaXQgdGhlIGZpcnN0IAorICogaW50ZXJydXB0LCBrZWVwIG9uIHRyeWluZyB1c2luZyB0aGUgU0lGIG1ldGhvZCB1bnRpbCB3ZSd2ZQorICogZXhoYXVzdGVkIGFsbCBjb250aWd1b3VzIGludGVycnVwdHMuCisgKgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFkZ2VtY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgcGVuZGluZyxyZWcxOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlpZiAoIWRldl9pZCkgeworCQlwcmludGsoIm1hZGdlbWNfaW50ZXJydXB0OiB3YXMgbm90IHBhc3NlZCBhIGRldl9pZCFcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCisJLyogTWFrZSBzdXJlIGl0cyByZWFsbHkgdXMuIC0tIHRoZSBNYWRnZSB3YXkgKi8KKwlwZW5kaW5nID0gaW5iKGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcwKTsKKwlpZiAoIShwZW5kaW5nICYgTUNfQ09OVFJPTF9SRUcwX1NJTlRSKSkKKwkJcmV0dXJuIElSUV9OT05FOyAvKiBub3Qgb3VyIGludGVycnVwdCAqLworCisJLyoKKwkgKiBTaW5jZSB3ZSdyZSBsZXZlbC10cmlnZ2VyZWQsIHdlIG1heSBtaXNzIHRoZSByaXNpbmcgZWRnZQorCSAqIG9mIHRoZSBuZXh0IGludGVycnVwdCB3aGlsZSB3ZSdyZSBvZmYgaGFuZGxpbmcgdGhpcyBvbmUsCisJICogc28ga2VlcCBjaGVja2luZyB1bnRpbCB0aGUgU0lGIHZlcmlmaWVzIHRoYXQgaXQgaGFzIG5vdGhpbmcKKwkgKiBsZWZ0IGZvciB1cyB0byBkby4KKwkgKi8KKwlwZW5kaW5nID0gU1RTX1NZU1RFTV9JUlE7CisJZG8geworCQlpZiAocGVuZGluZyAmIFNUU19TWVNURU1fSVJRKSB7CisKKwkJCS8qIFRvZ2dsZSB0aGUgaW50ZXJydXB0IHRvIHJlc2V0IHRoZSBsYXRjaCBvbiBjYXJkICovCisJCQlyZWcxID0gaW5iKGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKwkJCW91dGIocmVnMSBeIE1DX0NPTlRST0xfUkVHMV9TSU5URU4sIAorCQkJICAgICBkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHMSk7CisJCQlvdXRiKHJlZzEsIGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKworCQkJLyogQ29udGludWUgaGFuZGxpbmcgYXMgbm9ybWFsICovCisJCQl0bXMzODB0cl9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQsIHJlZ3MpOworCisJCQlwZW5kaW5nID0gU0lGUkVBRFcoU0lGU1RTKTsgLyogcmVzdGFydCAtIHRoZSBTSUYgd2F5ICovCisKKwkJfSBlbHNlCisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7IAorCX0gd2hpbGUgKDEpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOyAvKiBub3QgcmVhY2hhYmxlICovCit9CisKKy8qCisgKiBTZXQgdGhlIGNhcmQgdG8gdGhlIHByZWZlcmVkIHJpbmcgc3BlZWQuCisgKgorICogVW5saWtlIG5ld2VyIGNhcmRzLCB0aGUgTUMxNi8zMiBoYXZlIHRoZWlyIHNwZWVkIHNlbGVjdGlvbgorICogY2lyY3VpdCBjb25uZWN0ZWQgdG8gdGhlIE1hZGdlIEFTSUNzIGFuZCBub3QgdG8gdGhlIFRNUzM4MAorICogTlNFTE9VVCBwaW5zLiBTZXQgdGhlIEFTSUMgYml0cyBjb3JyZWN0bHkgaGVyZSwgYW5kIHJldHVybiAKKyAqIHplcm8gdG8gbGVhdmUgdGhlIFRNUyBOU0VMT1VUIGJpdHMgdW5hZmZlY3RlZC4KKyAqCisgKi8KK3Vuc2lnbmVkIHNob3J0IG1hZGdlbWNfc2V0bnNlbG91dF9waW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgY2hhciByZWcxOworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlyZWcxID0gaW5iKGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKworCWlmKHRwLT5EYXRhUmF0ZSA9PSBTUEVFRF8xNikKKwkJcmVnMSB8PSBNQ19DT05UUk9MX1JFRzFfU1BFRURfU0VMOyAvKiBhZGQgZm9yIDE2bWIgKi8KKwllbHNlIGlmIChyZWcxICYgTUNfQ09OVFJPTF9SRUcxX1NQRUVEX1NFTCkKKwkJcmVnMSBePSBNQ19DT05UUk9MX1JFRzFfU1BFRURfU0VMOyAvKiByZW1vdmUgZm9yIDRtYiAqLworCW91dGIocmVnMSwgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCisJcmV0dXJuIDA7IC8qIG5vIGNoYW5nZSAqLworfQorCisvKgorICogU2V0IHRoZSByZWdpc3RlciBwYWdlLiAgVGhpcyBlcXVhdGVzIHRvIHRoZSBTUlNYIGxpbmUKKyAqIG9uIHRoZSBUTVMzODBDeDYuCisgKgorICogUmVnaXN0ZXIgc2VsZWN0aW9uIGlzIG5vcm1hbGx5IGRvbmUgdmlhIHRocmVlIGNvbnRpZ3VvdXMKKyAqIGJpdHMuICBIb3dldmVyLCBzb21lIGJvYXJkcyAoc3VjaCBhcyB0aGUgTUMxNi8zMikgdXNlIG9ubHkKKyAqIHR3byBiaXRzLCBwbHVzIGEgc2VwYXJhdGUgYml0IGluIHRoZSBnbHVlIGNoaXAuICBUaGlzCisgKiBzZXRzIHRoZSBTUlNYIGJpdCAodGhlIHRvcCBiaXQpLiAgU2VlIHBhZ2UgNC0xNyBpbiB0aGUKKyAqIFllbGxvdyBCb29rIGZvciB3aGljaCByZWdpc3RlcnMgYXJlIGFmZmVjdGVkLgorICoKKyAqLworc3RhdGljIHZvaWQgbWFkZ2VtY19zZXRyZWdwYWdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwYWdlKQorewkKKwlzdGF0aWMgaW50IHJlZzE7CisKKwlyZWcxID0gaW5iKGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKwlpZiAoKHBhZ2UgPT0gMCkgJiYgKHJlZzEgJiBNQ19DT05UUk9MX1JFRzFfU1JTWCkpIHsKKwkJb3V0YihyZWcxIF4gTUNfQ09OVFJPTF9SRUcxX1NSU1gsIAorCQkgICAgIGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKwl9CisJZWxzZSBpZiAocGFnZSA9PSAxKSB7CisJCW91dGIocmVnMSB8IE1DX0NPTlRST0xfUkVHMV9TUlNYLCAKKwkJICAgICBkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHMSk7CisJfQorCXJlZzEgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCisJcmV0dXJuOworfQorCisvKgorICogVGhlIFNJRiByZWdpc3RlcnMgYXJlIG5vdCBtYXBwZWQgaW50byByZWdpc3RlciBzcGFjZSBieSBkZWZhdWx0CisgKiBTZXQgdGhpcyB0byAxIHRvIG1hcCB0aGVtLCAwIHRvIG1hcCB0aGUgQklBIFJPTS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIG1hZGdlbWNfc2V0c2lmc2VsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2YWwpCit7CisJdW5zaWduZWQgaW50IHJlZzA7CisKKwlyZWcwID0gaW5iKGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcwKTsKKwlpZiAoKHZhbCA9PSAwKSAmJiAocmVnMCAmIE1DX0NPTlRST0xfUkVHMF9TSUZTRUwpKSB7CisJCW91dGIocmVnMCBeIE1DX0NPTlRST0xfUkVHMF9TSUZTRUwsIAorCQkgICAgIGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcwKTsKKwl9IGVsc2UgaWYgKHZhbCA9PSAxKSB7CisJCW91dGIocmVnMCB8IE1DX0NPTlRST0xfUkVHMF9TSUZTRUwsIAorCQkgICAgIGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcwKTsKKwl9CQorCXJlZzAgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzApOworCisJcmV0dXJuOworfQorCisvKgorICogRW5hYmxlIFNJRiBpbnRlcnJ1cHRzCisgKgorICogVGhpcyBkb2VzIG5vdCBlbmFibGUgaW50ZXJydXB0cyBpbiB0aGUgU0lGLCBidXQgcmF0aGVyCisgKiBlbmFibGVzIFNJRiBpbnRlcnJ1cHRzIHRvIGJlIHBhc3NlZCBvbnRvIHRoZSBob3N0LgorICoKKyAqLworc3RhdGljIHZvaWQgbWFkZ2VtY19zZXRpbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnMTsKKworCXJlZzEgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCWlmICgodmFsID09IDApICYmIChyZWcxICYgTUNfQ09OVFJPTF9SRUcxX1NJTlRFTikpIHsKKwkJb3V0YihyZWcxIF4gTUNfQ09OVFJPTF9SRUcxX1NJTlRFTiwgCisJCSAgICAgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCX0gZWxzZSBpZiAodmFsID09IDEpIHsKKwkJb3V0YihyZWcxIHwgTUNfQ09OVFJPTF9SRUcxX1NJTlRFTiwgCisJCSAgICAgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCX0KKworCXJldHVybjsKK30KKworLyoKKyAqIENhYmxlIHR5cGUgaXMgc2V0IHZpYSBjb250cm9sIHJlZ2lzdGVyIDcuIEJpdCB6ZXJvIGhpZ2gKKyAqIGZvciBVVFAsIGxvdyBmb3IgU1RQLgorICovCitzdGF0aWMgdm9pZCBtYWRnZW1jX3NldGNhYmxldHlwZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdHlwZSkKK3sKKwlvdXRiKCh0eXBlPT0wKT9NQ19DT05UUk9MX1JFRzdfQ0FCTEVVVFA6TUNfQ09OVFJPTF9SRUc3X0NBQkxFU1RQLAorCSAgICAgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzcpOworfQorCisvKgorICogRW5hYmxlIHRoZSBmdW5jdGlvbnMgb2YgdGhlIE1hZGdlIGNoaXBzZXQgbmVlZGVkIGZvcgorICogZnVsbCB3b3JraW5nIG9yZGVyLiAKKyAqLworc3RhdGljIGludCBtYWRnZW1jX2NoaXBzZXRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW91dGIoMCwgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOyAvKiBwdWxsIFNSRVNFVCBsb3cgKi8KKwl0bXMzODB0cl93YWl0KDEwMCk7IC8qIHdhaXQgZm9yIGNhcmQgdG8gcmVzZXQgKi8KKworCS8qIGJyaW5nIGJhY2sgaW50byBub3JtYWwgb3BlcmF0aW5nIG1vZGUgKi8KKwlvdXRiKE1DX0NPTlRST0xfUkVHMV9OU1JFU0VULCBkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHMSk7CisKKwkvKiBtYXAgU0lGIHJlZ2lzdGVycyAqLworCW1hZGdlbWNfc2V0c2lmc2VsKGRldiwgMSk7CisKKwkvKiBlbmFibGUgU0lGIGludGVycnVwdHMgKi8KKwltYWRnZW1jX3NldGludChkZXYsIDEpOyAKKworCXJldHVybiAwOworfQorCisvKgorICogRGlzYWJsZSB0aGUgYm9hcmQsIGFuZCBwdXQgYmFjayBpbnRvIHBvd2VyLXVwIHN0YXRlLgorICovCit2b2lkIG1hZGdlbWNfY2hpcHNldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCW1hZGdlbWNfc2V0aW50KGRldiwgMCk7CisJLyogdW5tYXAgU0lGIHJlZ2lzdGVycyAqLworCW1hZGdlbWNfc2V0c2lmc2VsKGRldiwgMCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBSZWFkIHRoZSBjYXJkIHR5cGUgKE1DMTYgb3IgTUMzMikgZnJvbSB0aGUgY2FyZC4KKyAqCisgKiBUaGUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgYXJlIHN0b3JlZCBpbiB0d28gc2VwYXJhdGUKKyAqIHBhZ2VzLiAgUGFnZXMgYXJlIGZsaXBwZWQgYnkgY2xlYXJpbmcgYml0IDMgb2YgQ09OVFJPTF9SRUcwIChQQUdFKQorICogZm9yIHBhZ2UgemVybywgb3Igc2V0dGluZyBiaXQgMyBmb3IgcGFnZSBvbmUuCisgKgorICogUGFnZSB6ZXJvIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGF0YToKKyAqCUJ5dGUgMDogTWFudWZhY3R1cmVyIElEICgweDREIC0tIEFTQ0lJICJNIikKKyAqCUJ5dGUgMTogQ2FyZCB0eXBlOgorICoJCQkweDA4IGZvciBNQzE2CisgKgkJCTB4MEQgZm9yIE1DMzIKKyAqCUJ5dGUgMjogQ2FyZCByZXZpc2lvbgorICoJQnl0ZSAzOiBNaXJyb3Igb2YgUE9TIGNvbmZpZyByZWdpc3RlciAwCisgKglCeXRlIDQ6IE1pcnJvciBvZiBQT1MgMQorICoJQnl0ZSA1OiBNaXJyb3Igb2YgUE9TIDIKKyAqCisgKiBQYWdlIG9uZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGRhdGE6CisgKglCeXRlIDA6IFVudXNlZAorICoJQnl0ZSAxLTY6IEJJQSwgTVNCIHRvIExTQi4KKyAqCisgKiBOb3RlIHRoYXQgdG8gcmVhZCB0aGUgQklBLCB3ZSBtdXN0IHVubWFwIHRoZSBTSUYgcmVnaXN0ZXJzCisgKiBieSBjbGVhcmluZyBiaXQgMiBvZiBDT05UUk9MX1JFRzAgKFNJRlNFTCksIGFzIHRoZSBkYXRhCisgKiB3aWxsIHJlc2lkZSBpbiB0aGUgc2FtZSBsb2dpY2FsIGxvY2F0aW9uLiAgRm9yIHRoaXMgcmVhc29uLAorICogX25ldmVyXyByZWFkIHRoZSBCSUEgd2hpbGUgdGhlIEVhZ2xlIHByb2Nlc3NvciBpcyBydW5uaW5nIQorICogVGhlIFNJRiB3aWxsIGJlIGNvbXBsZXRlbHkgaW5hY2Nlc3NpYmxlIHVudGlsIHRoZSBCSUEgb3BlcmF0aW9uCisgKiBpcyBjb21wbGV0ZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIG1hZGdlbWNfcmVhZF9yb20oc3RydWN0IG1hZGdlbWNfY2FyZCAqY2FyZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHJlZzAsIHJlZzEsIHRtcHJlZzAsIGk7CisKKwlpb2FkZHIgPSBjYXJkLT5kZXYtPmJhc2VfYWRkcjsKKworCXJlZzAgPSBpbmIoaW9hZGRyICsgTUNfQ09OVFJPTF9SRUcwKTsKKwlyZWcxID0gaW5iKGlvYWRkciArIE1DX0NPTlRST0xfUkVHMSk7CisKKwkvKiBTd2l0Y2ggdG8gcGFnZSB6ZXJvIGFuZCB1bm1hcCBTSUYgKi8KKwl0bXByZWcwID0gcmVnMCAmIH4oTUNfQ09OVFJPTF9SRUcwX1BBR0UgKyBNQ19DT05UUk9MX1JFRzBfU0lGU0VMKTsKKwlvdXRiKHRtcHJlZzAsIGlvYWRkciArIE1DX0NPTlRST0xfUkVHMCk7CisJCisJY2FyZC0+bWFuaWQgPSBpbmIoaW9hZGRyICsgTUNfUk9NX01BTlVGQUNUVVJFUklEKTsKKwljYXJkLT5jYXJkdHlwZSA9IGluYihpb2FkZHIgKyBNQ19ST01fQURBUFRFUklEKTsKKwljYXJkLT5jYXJkcmV2ID0gaW5iKGlvYWRkciArIE1DX1JPTV9SRVZJU0lPTik7CisKKwkvKiBTd2l0Y2ggdG8gcm9tIHBhZ2Ugb25lICovCisJb3V0Yih0bXByZWcwIHwgTUNfQ09OVFJPTF9SRUcwX1BBR0UsIGlvYWRkciArIE1DX0NPTlRST0xfUkVHMCk7CisKKwkvKiBSZWFkIEJJQSAqLworCWNhcmQtPmRldi0+YWRkcl9sZW4gPSA2OworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWNhcmQtPmRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgTUNfUk9NX0JJQV9TVEFSVCArIGkpOworCQorCS8qIFJlc3RvcmUgb3JpZ2luYWwgcmVnaXN0ZXIgdmFsdWVzICovCisJb3V0YihyZWcwLCBpb2FkZHIgKyBNQ19DT05UUk9MX1JFRzApOworCW91dGIocmVnMSwgaW9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKwkKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgbWFkZ2VtY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7ICAKKwkvKgorCSAqIEdvIGFoZWFkIGFuZCByZWluaXRpYWxpemUgdGhlIGNoaXBzZXQgYWdhaW4sIGp1c3QgdG8gCisJICogbWFrZSBzdXJlIHdlIGRpZG4ndCBnZXQgbGVmdCBpbiBhIGJhZCBzdGF0ZS4KKwkgKi8KKwltYWRnZW1jX2NoaXBzZXRfaW5pdChkZXYpOworCXRtczM4MHRyX29wZW4oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWRnZW1jX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdG1zMzgwdHJfY2xvc2UoZGV2KTsKKwltYWRnZW1jX2NoaXBzZXRfY2xvc2UoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdpdmUgc29tZSBkZXRhaWxzIGF2YWlsYWJsZSBmcm9tIC9wcm9jL21jYS9zbG90WAorICovCitzdGF0aWMgaW50IG1hZGdlbWNfbWNhcHJvYyhjaGFyICpidWYsIGludCBzbG90LCB2b2lkICpkKSAKK3sJCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWQ7CisJc3RydWN0IG1hZGdlbWNfY2FyZCAqY3VyY2FyZCA9IG1hZGdlbWNfY2FyZF9saXN0OworCWludCBsZW4gPSAwOworCQorCXdoaWxlIChjdXJjYXJkKSB7IC8qIHNlYXJjaCBmb3IgY2FyZCBzdHJ1Y3QgKi8KKwkJaWYgKGN1cmNhcmQtPmRldiA9PSBkZXYpCisJCQlicmVhazsKKwkJY3VyY2FyZCA9IGN1cmNhcmQtPm5leHQ7CisJfQorCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICItLS0tLS0tXG4iKTsKKwlpZiAoY3VyY2FyZCkgeworCQlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJCWludCBpOworCQkKKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIkNhcmQgUmV2aXNpb246ICVkXG4iLCBjdXJjYXJkLT5jYXJkcmV2KTsKKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIlJBTSBTaXplOiAlZGtiXG4iLCBjdXJjYXJkLT5yYW1zaXplKTsKKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIkNhYmxlIHR5cGU6ICVzXG4iLCAoY3VyY2FyZC0+Y2FibGV0eXBlKT8iU1RQL0RCOSI6IlVUUC9SSi00NSIpOworCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiQ29uZmlndXJlZCByaW5nIHNwZWVkOiAlZE1iL3NlY1xuIiwgKGN1cmNhcmQtPnJpbmdzcGVlZCk/MTY6NCk7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJSdW5uaW5nIHJpbmcgc3BlZWQ6ICVkTWIvc2VjXG4iLCAodHAtPkRhdGFSYXRlPT1TUEVFRF8xNik/MTY6NCk7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJEZXZpY2U6ICVzXG4iLCBkZXYtPm5hbWUpOworCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiSU8gUG9ydDogMHglMDRseFxuIiwgZGV2LT5iYXNlX2FkZHIpOworCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiSVJROiAlZFxuIiwgZGV2LT5pcnEpOworCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiQXJiaXRyYXRpb24gTGV2ZWw6ICVkXG4iLCBjdXJjYXJkLT5hcmJsZXZlbCk7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJCdXJzdCBNb2RlOiAiKTsKKwkJc3dpdGNoKGN1cmNhcmQtPmJ1cnN0bW9kZSkgeworCQljYXNlIDA6IGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJDeWNsZSBzdGVhbCIpOyBicmVhazsKKwkJY2FzZSAxOiBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiTGltaXRlZCBidXJzdCIpOyBicmVhazsKKwkJY2FzZSAyOiBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiRGVsYXllZCByZWxlYXNlIik7IGJyZWFrOworCQljYXNlIDM6IGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJJbW1lZGlhdGUgcmVsZWFzZSIpOyBicmVhazsKKwkJfQorCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiICglcylcbiIsIChjdXJjYXJkLT5mYWlybmVzcyk/IlVuZmFpciI6IkZhaXIiKTsKKwkJCisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJSaW5nIFN0YXRpb24gQWRkcmVzczogIik7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIlMi4yeCIsIGRldi0+ZGV2X2FkZHJbMF0pOworCQlmb3IgKGkgPSAxOyBpIDwgNjsgaSsrKQorCQkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiAlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiXG4iKTsKKwl9IGVsc2UgCisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJDYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtYWRnZW1jX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBtYWRnZW1jX2NhcmQgKnRoaXNfY2FyZDsKKwkKKwl3aGlsZSAobWFkZ2VtY19jYXJkX2xpc3QpIHsKKwkJZGV2ID0gbWFkZ2VtY19jYXJkX2xpc3QtPmRldjsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHItTUFER0VNQ19TSUZfT0ZGU0VULCBNQURHRU1DX0lPX0VYVEVOVCk7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQl0bXNkZXZfdGVybShkZXYpOworCQlmcmVlX25ldGRldihkZXYpOworCQl0aGlzX2NhcmQgPSBtYWRnZW1jX2NhcmRfbGlzdDsKKwkJbWFkZ2VtY19jYXJkX2xpc3QgPSB0aGlzX2NhcmQtPm5leHQ7CisJCWtmcmVlKHRoaXNfY2FyZCk7CisJfQorfQorCittb2R1bGVfaW5pdChtYWRnZW1jX3Byb2JlKTsKK21vZHVsZV9leGl0KG1hZGdlbWNfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RWRVJTSU9OUyAgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyBtYWRnZW1jLmMiCisgKiAgYWx0LWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIG1hZGdlbWMuYyIKKyAqICBjLXNldC1zdHlsZSAiSyZSIgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5oIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL21hZGdlbWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGQ4MjIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL21hZGdlbWMuaApAQCAtMCwwICsxLDcwIEBACisvKiAKKyAqIG1hZGdlbWMuaDogSGVhZGVyIGZvciB0aGUgbWFkZ2VtYyB0bXMzODB0ciBtb2R1bGUKKyAqCisgKiBBdXRob3JzOgorICogLSBBZGFtIEZyaXR6bGVyIDxtaWRAYXVrLmN4PgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NQURHRU1DX0gKKyNkZWZpbmUgX19MSU5VWF9NQURHRU1DX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNQURHRU1DMTZfQ0FSRE5BTUUgIk1hZGdlIFNtYXJ0IDE2LzQgTUMxNiBSaW5nbm9kZSIKKyNkZWZpbmUgTUFER0VNQzMyX0NBUkROQU1FICJNYWRnZSBTbWFydCAxNi80IE1DMzIgUmluZ25vZGUiCisKKy8qIAorICogQml0IGRlZmluaXRpb25zIGZvciB0aGUgUE9TIGNvbmZpZyByZWdpc3RlcnMKKyAqLworI2RlZmluZSBNQzE2X1BPUzBfQUREUjEgMHgyMAorI2RlZmluZSBNQzE2X1BPUzJfQUREUjIgMHgwNAorI2RlZmluZSBNQzE2X1BPUzNfQUREUjMgMHgyMAorCisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMAkJKChsb25nKS04KSAvKiAweDAwICovCisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMQkJKChsb25nKS03KSAvKiAweDAxICovCisjZGVmaW5lIE1DX0FEQVBURVJfUE9TX1JFRzAJKChsb25nKS02KSAvKiAweDAyICovCisjZGVmaW5lIE1DX0FEQVBURVJfUE9TX1JFRzEJKChsb25nKS01KSAvKiAweDAzICovCisjZGVmaW5lIE1DX0FEQVBURVJfUE9TX1JFRzIJKChsb25nKS00KSAvKiAweDA0ICovCisjZGVmaW5lIE1DX0FEQVBURVJfUkVHNV9VTlVTRUQJKChsb25nKS0zKSAvKiAweDA1ICovCisjZGVmaW5lIE1DX0FEQVBURVJfUkVHNl9VTlVTRUQJKChsb25nKS0yKSAvKiAweDA2ICovCisjZGVmaW5lIE1DX0NPTlRST0xfUkVHNwkJKChsb25nKS0xKSAvKiAweDA3ICovCisKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcwX1VOS05PV04xCTB4MDEKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcwX1VOS05PV04yCTB4MDIKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcwX1NJRlNFTAkJMHgwNAorI2RlZmluZSBNQ19DT05UUk9MX1JFRzBfUEFHRQkJMHgwOAorI2RlZmluZSBNQ19DT05UUk9MX1JFRzBfVEVTVElOVEVSUlVQVAkweDEwCisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMF9VTktOT1dOMjAJMHgyMAorI2RlZmluZSBNQ19DT05UUk9MX1JFRzBfU0lOVFIJCTB4NDAKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcwX1VOS05PV044MAkweDgwCisKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcxX1NJTlRFTgkJMHgwMQorI2RlZmluZSBNQ19DT05UUk9MX1JFRzFfQklUT0ZERUFUSAkweDAyCisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMV9OU1JFU0VUCQkweDA0CisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMV9VTktOT1dOOAkweDA4CisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMV9VTktOT1dOMTAJMHgxMAorI2RlZmluZSBNQ19DT05UUk9MX1JFRzFfVU5LTk9XTjIwCTB4MjAKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcxX1NSU1gJCTB4NDAKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcxX1NQRUVEX1NFTAkweDgwCisKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUc3X0NBQkxFU1RQCTB4MDAKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUc3X0NBQkxFVVRQCTB4MDEKKworLyoKKyAqIFJPTSBQYWdlIFplcm8KKyAqLworI2RlZmluZSBNQ19ST01fTUFOVUZBQ1RVUkVSSUQJCTB4MDAKKyNkZWZpbmUgTUNfUk9NX0FEQVBURVJJRAkJMHgwMQorI2RlZmluZSBNQ19ST01fUkVWSVNJT04JCQkweDAyCisjZGVmaW5lIE1DX1JPTV9DT05GSUcwCQkJMHgwMworI2RlZmluZSBNQ19ST01fQ09ORklHMQkJCTB4MDQKKyNkZWZpbmUgTUNfUk9NX0NPTkZJRzIJCQkweDA1CisKKy8qCisgKiBST00gUGFnZSBPbmUKKyAqLworI2RlZmluZSBNQ19ST01fVU5VU0VEX0JZVEUJCTB4MDAKKyNkZWZpbmUgTUNfUk9NX0JJQV9TVEFSVAkJMHgwMQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9fTElOVVhfTUFER0VNQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL29seW1waWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTc5MjMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL29seW1waWMuYwpAQCAtMCwwICsxLDE3ODYgQEAKKy8qCisgKiAgIG9seW1waWMuYyAoYykgMTk5OSBQZXRlciBEZSBTY2hyaWp2ZXIgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoJCSAgIDE5OTkvMjAwMCBNaWtlIFBoaWxsaXBzIChtaWtlcEBsaW51eHRyLm5ldCkKKyAqCisgKiAgTGludXggZHJpdmVyIGZvciBJQk0gUENJIHRva2VucmluZyBjYXJkcyBiYXNlZCBvbiB0aGUgUGl0L1BpdC1QaHkvT2x5bXBpYworICogIGNoaXBzZXQuIAorICoKKyAqICBCYXNlIERyaXZlciBTa2VsZXRvbjoKKyAqICAgICAgV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiAgICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisgKgorICogIFRoYW5rcyB0byBFcmlrIERlIENvY2ssIEFkcmlhbiBCcmlkZ2V0dCBhbmQgRnJhbmsgRmllbmUgZm9yIHRoZWlyIAorICogIGFzc2lzdGFuY2UgYW5kIHBlcnNlcnZlcmFuY2Ugd2l0aCB0aGUgdGVzdGluZyBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKiAKKyAqICA0LzI3Lzk5IC0gQWxwaGEgUmVsZWFzZSAwLjEuMAorICogICAgICAgICAgICBGaXJzdCByZWxlYXNlIHRvIHRoZSBwdWJsaWMKKyAqCisgKiAgNi84Lzk5ICAtIE9mZmljaWFsIFJlbGVhc2UgMC4yLjAgICAKKyAqICAgICAgICAgICAgTWVyZ2VkIGludG8gdGhlIGtlcm5lbCBjb2RlIAorICogIDgvMTgvOTkgLSBVcGRhdGVkIGRyaXZlciBmb3IgMi4zLjEzIGtlcm5lbCB0byB1c2UgbmV3IHBjaQorICoJICAgICAgcmVzb3VyY2UuIERyaXZlciBhbHNvIHJlcG9ydHMgdGhlIGNhcmQgbmFtZSByZXR1cm5lZCBieQorICogICAgICAgICAgICB0aGUgcGNpIHJlc291cmNlLgorICogIDEvMTEvMDAgLSBBZGRlZCBzcGlubG9ja3MgZm9yIHNtcAorICogIDIvMjMvMDAgLSBVcGRhdGVkIHRvIGRldl9rZnJlZV9pcnEgCisgKiAgMy8xMC8wMCAtIEZpeGVkIEZEWCBlbmFibGUgd2hpY2ggdHJpZ2dlcmVkIG90aGVyIGJ1Z3MgYWxzbyAKKyAqICAgICAgICAgICAgc3F1YXNoZWQuCisgKiAgNS8yMC8wMCAtIENoYW5nZXMgdG8gaGFuZGxlIE9seW1waWMgb24gTGludXhQUEMuIEVuZGlhbiBjaGFuZ2VzLgorICogICAgICAgICAgICBUaGUgb2RkIHRoaW5nIGFib3V0IHRoZSBjaGFuZ2VzIGlzIHRoYXQgdGhlIGZpeCBmb3IKKyAqICAgICAgICAgICAgZW5kaWFuIGlzc3VlcyB3aXRoIHRoZSBiaWctZW5kaWFuIGRhdGEgaW4gdGhlIGFyYiwgYXNiLi4uCisgKiAgICAgICAgICAgIHdhcyB0byBhbHdheXMgc3dhYigpIHRoZSBieXRlcywgbm8gbWF0dGVyIHdoYXQgQ1BVLgorICogICAgICAgICAgICBUaGF0J3MgYmVjYXVzZSB0aGUgcmVhZFt3bF0oKSBmdW5jdGlvbnMgYWx3YXlzIHN3YXAgdGhlCisgKiAgICAgICAgICAgIGJ5dGVzIG9uIHRoZSB3YXkgaW4gb24gUFBDLgorICogICAgICAgICAgICBGaXhpbmcgdGhlIGhhcmR3YXJlIGRlc2NyaXB0b3JzIHdhcyBhbm90aGVyIG1hdHRlciwKKyAqICAgICAgICAgICAgYmVjYXVzZSB0aGV5IHdlcmVuJ3QgZ29pbmcgdGhyb3VnaCByZWFkW3dsXSgpLCB0aGVyZSBhbGwKKyAqICAgICAgICAgICAgdGhlIHJlc3VsdHMgaGFkIHRvIGJlIGluIG1lbW9yeSBpbiBsZTMyIHZhbHVlcy4ga2RhYWtlcgorICoKKyAqIDEyLzIzLzAwIC0gQWRkZWQgbWluaW1hbCBDYXJkYnVzIHN1cHBvcnQgKFRoYW5rcyBEb25hbGQpLgorICoKKyAqIDAzLzA5LzAxIC0gQWRkIG5ldyBwY2kgYXBpLCBkZXZfYmFzZV9sb2NrLCBnZW5lcmFsIGNsZWFuIHVwLiAKKyAqCisgKiAwMy8yNy8wMSAtIEFkZCBuZXcgZG1hIHBjaSAoVGhhbmtzIHRvIEt5bGUgTHVja2UpIGFuZCBhbGxvY190cmRldgorICoJICAgICAgQ2hhbmdlIHByb2NfZnMgYmVoYXZpb3VyLCBub3cgb25lIGVudHJ5IHBlciBhZGFwdGVyLgorICoKKyAqIDA0LzA5LzAxIC0gQ291cGxlIG9mIGJ1ZyBmaXhlcyB0byB0aGUgZG1hIHVubWFwcyBhbmQgZWplY3RpbmcgdGhlCisgKgkgICAgICBhZGFwdGVyIHdoZW4gbGl2ZSBkb2VzIG5vdCB0YWtlIHRoZSBzeXN0ZW0gZG93biB3aXRoIGl0LgorICogCisgKiAwNi8wMi8wMSAtIENsZWFuIHVwLCBjb3B5IHNrYiBmb3Igc21hbGwgcGFja2V0cworICogCisgKiAwNi8yMi8wMSAtIEFkZCBFSVNSIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIAorICoKKyAqIDA3LzE5LzAxIC0gSW1wcm92ZSBiYWQgTEFBIHJlcG9ydGluZywgc3RyaXAgb3V0IGZyZWVtZW0KKyAqCSAgICAgIGludG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiwgaXRzIGNhbGxlZCBmcm9tIDMgCisgKgkgICAgICBkaWZmZXJlbnQgcGxhY2VzIG5vdy4gCisgKiAwMi8wOS8wMiAtIFJlcGxhY2VkIHNsZWVwX29uLiAKKyAqIDAzLzAxLzAyIC0gUmVwbGFjZSBhY2Nlc3MgdG8gc2V2ZXJhbCByZWdpc3RlcnMgZnJvbSAzMiBiaXQgdG8gCisgKiAJICAgICAgMTYgYml0LiBGaXhlcyBhbGlnbm1lbnQgZXJyb3JzIG9uIFBQQyA2NCBiaXQgbWFjaGluZXMuCisgKiAJICAgICAgVGhhbmtzIHRvIEFsIFRyYXV0bWFuIGZvciB0aGlzIG9uZS4KKyAqIDAzLzEwLzAyIC0gRml4IEJVRyBpbiBhcmJfY21kLiBCdWcgd2FzIHRoZXJlIGFsbCBhbG9uZyBidXQgd2FzCisgKiAJICAgICAgc2lsZW50bHkgaWdub3JlZCB1bnRpbCB0aGUgZXJyb3IgY2hlY2tpbmcgY29kZSAKKyAqIAkgICAgICB3ZW50IGludG8gdmVyc2lvbiAxLjAuMCAKKyAqIDA2LzA0LzAyIC0gQWRkIGNvcnJlY3Qgc3RhcnQgdXAgc2VxdWVuY2UgZm9yIHRoZSBjYXJkYnVzIGFkYXB0ZXJzLgorICogCSAgICAgIFJlcXVpcmVkIGZvciBzdHJpY3QgY29tcGxpYW5jZSB3aXRoIHBjaSBwb3dlciBtZ210IHNwZWNzLgorICogIFRvIERvOgorICoKKyAqCSAgICAgV2FrZSBvbiBsYW4JCisgKiAKKyAqICBJZiBQcm9ibGVtcyBkbyBPY2N1cgorICogIE1vc3QgcHJvYmxlbXMgY2FuIGJlIHJlY3RpZmllZCBieSBlaXRoZXIgY2xvc2luZyBhbmQgb3BlbmluZyB0aGUgaW50ZXJmYWNlCisgKiAgKGlmY29uZmlnIGRvd24gYW5kIHVwKSBvciBybW1vZCBhbmQgaW5zbW9kJ2luZyB0aGUgZHJpdmVyIChhIGJpdCBkaWZmaWN1bHQKKyAqICBpZiBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwpLgorICovCisKKy8qIENoYW5nZSBPTFlNUElDX0RFQlVHIHRvIDEgdG8gZ2V0IHZlcmJvc2UsIGFuZCBJIG1lYW4gcmVhbGx5IHZlcmJvc2UsIG1lc3NhZ2VzICovCisKKyNkZWZpbmUgT0xZTVBJQ19ERUJVRyAwCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIm9seW1waWMuaCIKKworLyogSSd2ZSBnb3QgdG8gcHV0IHNvbWUgaW50ZWxsaWdlbmNlIGludG8gdGhlIHZlcnNpb24gbnVtYmVyIHNvIHRoYXQgUGV0ZXIgYW5kIEkga25vdworICogd2hpY2ggdmVyc2lvbiBvZiB0aGUgY29kZSBzb21lYm9keSBoYXMgZ290LiAKKyAqIFZlcnNpb24gTnVtYmVyID0gYS5iLmMuZCAgd2hlcmUgYS5iLmMgaXMgdGhlIGxldmVsIG9mIGNvZGUgYW5kIGQgaXMgdGhlIGxhdGVzdCBhdXRob3IuCisgKiBTbyAwLjAuMS5wZHMgPSBQZXRlciwgMC4wLjEubWxwID0gTWlrZQorICogCisgKiBPZmZpY2lhbCByZWxlYXNlcyB3aWxsIG9ubHkgaGF2ZSBhbiBhLmIuYyB2ZXJzaW9uIG51bWJlciBmb3JtYXQuIAorICovCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0gCisiT2x5bXBpYy5jIHYxLjAuNSA2LzA0LzAyIC0gUGV0ZXIgRGUgU2NocmlqdmVyICYgTWlrZSBQaGlsbGlwcyIgOyAKKworc3RhdGljIGNoYXIgKm9wZW5fbWFqX2Vycm9yW10gID0geyJObyBlcnJvciIsICJMb2JlIE1lZGlhIFRlc3QiLCAiUGh5c2ljYWwgSW5zZXJ0aW9uIiwKKwkJCQkgICAiQWRkcmVzcyBWZXJpZmljYXRpb24iLCAiTmVpZ2hib3IgTm90aWZpY2F0aW9uIChSaW5nIFBvbGwpIiwKKwkJCQkgICAiUmVxdWVzdCBQYXJhbWV0ZXJzIiwiRkRYIFJlZ2lzdHJhdGlvbiBSZXF1ZXN0IiwKKwkJCQkgICAiRkRYIER1cGxpY2F0ZSBBZGRyZXNzIENoZWNrIiwgIlN0YXRpb24gcmVnaXN0cmF0aW9uIFF1ZXJ5IFdhaXQiLAorCQkJCSAgICJVbmtub3duIHN0YWdlIn07CisKK3N0YXRpYyBjaGFyICpvcGVuX21pbl9lcnJvcltdID0geyJObyBlcnJvciIsICJGdW5jdGlvbiBGYWlsdXJlIiwgIlNpZ25hbCBMb3N0IiwgIldpcmUgRmF1bHQiLAorCQkJCSAgICJSaW5nIFNwZWVkIE1pc21hdGNoIiwgIlRpbWVvdXQiLCJSaW5nIEZhaWx1cmUiLCJSaW5nIEJlYWNvbmluZyIsCisJCQkJICAgIkR1cGxpY2F0ZSBOb2RlIEFkZHJlc3MiLCJSZXF1ZXN0IFBhcmFtZXRlcnMiLCJSZW1vdmUgUmVjZWl2ZWQiLAorCQkJCSAgICJSZXNlcnZlZCIsICJSZXNlcnZlZCIsICJObyBNb25pdG9yIERldGVjdGVkIGZvciBSUEwiLCAKKwkJCQkgICAiTW9uaXRvciBDb250ZW50aW9uIGZhaWxlciBmb3IgUlBMIiwgIkZEWCBQcm90b2NvbCBFcnJvciJ9OworCisvKiBNb2R1bGUgcGFyYW10ZXJzICovCisKK01PRFVMRV9BVVRIT1IoIk1pa2UgUGhpbGxpcHMgPG1pa2VwQGxpbnV4dHIubmV0PiIpIDsgCitNT0RVTEVfREVTQ1JJUFRJT04oIk9seW1waWMgUENJL0NhcmRidXMgQ2hpcHNldCBEcml2ZXIiKSA7IAorCisvKiBSaW5nIFNwZWVkIDAsNCwxNiwxMDAgCisgKiAwID0gQXV0b3NlbnNlICAgICAgICAgCisgKiA0LDE2ID0gU2VsZWN0ZWQgc3BlZWQgb25seSwgbm8gYXV0b3NlbnNlCisgKiBUaGlzIGFsbG93cyB0aGUgY2FyZCB0byBiZSB0aGUgZmlyc3Qgb24gdGhlIHJpbmcKKyAqIGFuZCBiZWNvbWUgdGhlIGFjdGl2ZSBtb25pdG9yLgorICogMTAwID0gTm90aGluZyBhdCBwcmVzZW50LCAxMDBtYnBzIGlzIGF1dG9kZXRlY3RlZAorICogaWYgRkRYIGlzIHR1cm5lZCBvbi4gTWF5IGJlIGltcGxlbWVudGVkIGluIHRoZSBmdXR1cmUgdG8gCisgKiBmYWlsIGlmIDEwMG1wYnMgaXMgbm90IGRldGVjdGVkLgorICoKKyAqIFdBUk5JTkc6IFNvbWUgaHVicyB3aWxsIGFsbG93IHlvdSB0byBpbnNlcnQKKyAqIGF0IHRoZSB3cm9uZyBzcGVlZAorICovCisKK3N0YXRpYyBpbnQgcmluZ3NwZWVkW09MWU1QSUNfTUFYX0FEQVBURVJTXSA9IHswLH0gOworbW9kdWxlX3BhcmFtX2FycmF5KHJpbmdzcGVlZCwgaW50LCBOVUxMLCAwKTsKKworLyogUGFja2V0IGJ1ZmZlciBzaXplICovCisKK3N0YXRpYyBpbnQgcGt0X2J1Zl9zeltPTFlNUElDX01BWF9BREFQVEVSU10gPSB7MCx9IDsKK21vZHVsZV9wYXJhbV9hcnJheShwa3RfYnVmX3N6LCBpbnQsIE5VTEwsIDApIDsKKworLyogTWVzc2FnZSBMZXZlbCAqLworCitzdGF0aWMgaW50IG1lc3NhZ2VfbGV2ZWxbT0xZTVBJQ19NQVhfQURBUFRFUlNdID0gezAsfSA7IAorbW9kdWxlX3BhcmFtX2FycmF5KG1lc3NhZ2VfbGV2ZWwsIGludCwgTlVMTCwgMCkgOworCisvKiBDaGFuZ2UgbmV0d29ya19tb25pdG9yIHRvIHJlY2VpdmUgbWFjIGZyYW1lcyB0aHJvdWdoIHRoZSBhcmIgY2hhbm5lbC4KKyAqIFdpbGwgYWxzbyBjcmVhdGUgYSAvcHJvYy9uZXQvb2x5bXBpY190ciVkIGVudHJ5LCB3aGVyZSAlZCBpcyB0aGUgdHIKKyAqIGRldmljZSwgaS5lLiB0cjAsIHRyMSBldGMuIAorICogSW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjcmVhdGUgYSByaW5nLWVycm9yIHJlcG9ydGluZyBuZXR3b3JrIG1vZHVsZSAKKyAqIGkuZS4gaXQgd2lsbCBnaXZlIHlvdSB0aGUgc291cmNlIGFkZHJlc3Mgb2YgYmVhY29uZXJzIG9uIHRoZSByaW5nIAorICovCitzdGF0aWMgaW50IG5ldHdvcmtfbW9uaXRvcltPTFlNUElDX01BWF9BREFQVEVSU10gPSB7MCx9OworbW9kdWxlX3BhcmFtX2FycmF5KG5ldHdvcmtfbW9uaXRvciwgaW50LCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG9seW1waWNfcGNpX3RibFtdID0geworCXtQQ0lfVkVORE9SX0lEX0lCTSxQQ0lfREVWSUNFX0lEX0lCTV9UUl9XQUtFLFBDSV9BTllfSUQsUENJX0FOWV9JRCx9LAorCXsgfSAJLyogVGVybWluYXRpbmcgRW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSxvbHltcGljX3BjaV90YmwpIDsgCisKKworc3RhdGljIGludCBvbHltcGljX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsgCitzdGF0aWMgaW50IG9seW1waWNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgb2x5bXBpY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBvbHltcGljX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG9seW1waWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBvbHltcGljX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgb2x5bXBpY19mcmVlbWVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgIAorc3RhdGljIGlycXJldHVybl90IG9seW1waWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogb2x5bXBpY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG9seW1waWNfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpIDsgCitzdGF0aWMgdm9pZCBvbHltcGljX2FyYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG9seW1waWNfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXR1KTsKK3N0YXRpYyB2b2lkIG9seW1waWNfc3JiX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgCitzdGF0aWMgdm9pZCBvbHltcGljX2FzYl9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSA7IAorc3RhdGljIGludCBvbHltcGljX3Byb2NfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkgOyAKKworc3RhdGljIGludCBfX2RldmluaXQgb2x5bXBpY19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2IDsgCisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2OworCXN0YXRpYyBpbnQgY2FyZF9ubyA9IC0xIDsKKwlpbnQgaSA7IAorCisJY2FyZF9ubysrIDsgCisKKwlpZiAoKGkgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpIHsKKwkJcmV0dXJuIGkgOyAKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmICgoaSA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwib2x5bXBpYyIpKSkgeyAKKwkJZ290byBvcF9kaXNhYmxlX2RldjsKKwl9CisgCisJZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCBvbHltcGljX3ByaXZhdGUpKSA7IAorCWlmICghZGV2KSB7CisJCWkgPSAtRU5PTUVNOyAKKwkJZ290byBvcF9mcmVlX2RldjsKKwl9CisKKwlvbHltcGljX3ByaXYgPSBkZXYtPnByaXYgOworCQorCXNwaW5fbG9ja19pbml0KCZvbHltcGljX3ByaXYtPm9seW1waWNfbG9jaykgOyAKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9seW1waWNfcHJpdi0+c3JiX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9seW1waWNfcHJpdi0+dHJiX3dhaXQpOworI2lmIE9MWU1QSUNfREVCVUcgIAorCXByaW50ayhLRVJOX0lORk8gInBjaV9kZXZpY2U6ICVwLCBkZXY6JXAsIGRldi0+cHJpdjogJXBcbiIsIHBkZXYsIGRldiwgZGV2LT5wcml2KTsKKyNlbmRpZgorCWRldi0+aXJxPXBkZXYtPmlycTsKKwlkZXYtPmJhc2VfYWRkcj1wY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJb2x5bXBpY19wcml2LT5vbHltcGljX2NhcmRfbmFtZSA9IHBjaV9uYW1lKHBkZXYpOworCW9seW1waWNfcHJpdi0+cGRldiA9IHBkZXY7IAorCW9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwxKSwyNTYpOworCW9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDIpLDIwNDgpOworCWlmICghb2x5bXBpY19wcml2LT5vbHltcGljX21taW8gfHwgIW9seW1waWNfcHJpdi0+b2x5bXBpY19sYXApIHsKKwkJZ290byBvcF9mcmVlX2lvbWFwOworCX0KKwkJCQkKKwlpZiAoKHBrdF9idWZfc3pbY2FyZF9ub10gPCAxMDApIHx8IChwa3RfYnVmX3N6W2NhcmRfbm9dID4gMTgwMDApICkKKwkJb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6ID0gUEtUX0JVRl9TWiA7IAorCWVsc2UKKwkJb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6ID0gcGt0X2J1Zl9zeltjYXJkX25vXSA7IAorCisJZGV2LT5tdHUgPSBvbHltcGljX3ByaXYtPnBrdF9idWZfc3ogLSBUUl9ITEVOIDsgCisJb2x5bXBpY19wcml2LT5vbHltcGljX3Jpbmdfc3BlZWQgPSByaW5nc3BlZWRbY2FyZF9ub10gOyAKKwlvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCA9IG1lc3NhZ2VfbGV2ZWxbY2FyZF9ub10gOyAKKwlvbHltcGljX3ByaXYtPm9seW1waWNfbmV0d29ya19tb25pdG9yID0gbmV0d29ya19tb25pdG9yW2NhcmRfbm9dOworCQorCWlmICgoaSA9IG9seW1waWNfaW5pdChkZXYpKSkgeworCQlnb3RvIG9wX2ZyZWVfaW9tYXA7CisJfQkJCQkKKworCWRldi0+b3Blbj0mb2x5bXBpY19vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0PSZvbHltcGljX3htaXQ7CisJZGV2LT5jaGFuZ2VfbXR1PSZvbHltcGljX2NoYW5nZV9tdHU7CisJZGV2LT5zdG9wPSZvbHltcGljX2Nsb3NlOworCWRldi0+ZG9faW9jdGw9TlVMTDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdD0mb2x5bXBpY19zZXRfcnhfbW9kZTsKKwlkZXYtPmdldF9zdGF0cz0mb2x5bXBpY19nZXRfc3RhdHMgOworCWRldi0+c2V0X21hY19hZGRyZXNzPSZvbHltcGljX3NldF9tYWNfYWRkcmVzcyA7ICAKKwlTRVRfTU9EVUxFX09XTkVSKGRldikgOyAKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsZGV2KSA7IAorCXJlZ2lzdGVyX25ldGRldihkZXYpIDsgCisJcHJpbnRrKCJPbHltcGljOiAlcyByZWdpc3RlcmVkIGFzOiAlc1xuIixvbHltcGljX3ByaXYtPm9seW1waWNfY2FyZF9uYW1lLGRldi0+bmFtZSk7CisJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19uZXR3b3JrX21vbml0b3IpIHsgLyogTXVzdCBnbyBhZnRlciByZWdpc3Rlcl9uZXRkZXYgYXMgd2UgbmVlZCB0aGUgZGV2aWNlIG5hbWUgKi8gCisJCWNoYXIgcHJvY19uYW1lWzIwXSA7IAorCQlzdHJjcHkocHJvY19uYW1lLCJuZXQvb2x5bXBpY18iKSA7IAorCQlzdHJjYXQocHJvY19uYW1lLGRldi0+bmFtZSkgOyAKKwkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShwcm9jX25hbWUsMCxOVUxMLG9seW1waWNfcHJvY19pbmZvLCh2b2lkICopZGV2KSA7IAorCQlwcmludGsoIk9seW1waWM6IE5ldHdvcmsgTW9uaXRvciBpbmZvcm1hdGlvbjogL3Byb2MvJXNcbiIscHJvY19uYW1lKTsgCisJfQorCXJldHVybiAgMCA7CisKK29wX2ZyZWVfaW9tYXA6CisJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvKQorCQlpb3VubWFwKG9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvKTsgCisJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXApCisJCWlvdW5tYXAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCk7CisKK29wX2ZyZWVfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsgCisKK29wX2Rpc2FibGVfZGV2OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgb2x5bXBpY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgCXN0cnVjdCBvbHltcGljX3ByaXZhdGUgKm9seW1waWNfcHJpdjsKKwl1OCBfX2lvbWVtICpvbHltcGljX21taW8sICppbml0X3NyYiwqYWRhcHRlcl9hZGRyOworCXVuc2lnbmVkIGxvbmcgdDsgCisJdW5zaWduZWQgaW50IHVhYV9hZGRyOworCisgICAgCW9seW1waWNfcHJpdj0oc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlvbHltcGljX21taW89b2x5bXBpY19wcml2LT5vbHltcGljX21taW87CisKKwlwcmludGsoIiVzIFxuIiwgdmVyc2lvbik7CisJcHJpbnRrKCIlcy4gSS9PIGF0ICVoeCwgTU1JTyBhdCAlcCwgTEFQIGF0ICVwLCB1c2luZyBpcnEgJWRcbiIsIG9seW1waWNfcHJpdi0+b2x5bXBpY19jYXJkX25hbWUsICh1bnNpZ25lZCBpbnQpIGRldi0+YmFzZV9hZGRyLG9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvLCBvbHltcGljX3ByaXYtPm9seW1waWNfbGFwLCBkZXYtPmlycSk7CisKKwl3cml0ZWwocmVhZGwob2x5bXBpY19tbWlvK0JDVEwpIHwgQkNUTF9TT0ZUUkVTRVQsb2x5bXBpY19tbWlvK0JDVEwpOworCXQ9amlmZmllczsKKwl3aGlsZSgocmVhZGwob2x5bXBpY19tbWlvK0JDVEwpKSAmIEJDVExfU09GVFJFU0VUKSB7CisJCXNjaGVkdWxlKCk7CQkKKwkJaWYoamlmZmllcy10ID4gNDAqSFopIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiSUJNIFBDSSB0b2tlbnJpbmcgY2FyZCBub3QgcmVzcG9uZGluZy5cbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKworCS8qIE5lZWRlZCBmb3IgY2FyZGJ1cyAqLworCWlmKCEocmVhZGwob2x5bXBpY19tbWlvK0JDVEwpICYgQkNUTF9NT0RFX0lORElDQVRPUikpIHsKKwkJd3JpdGVsKHJlYWRsKG9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvK0ZFUk1BU0spfEZFUk1BU0tfSU5UX0JJVCwgb2x5bXBpY19tbWlvK0ZFUk1BU0spOworCX0KKwkKKyNpZiBPTFlNUElDX0RFQlVHCisJcHJpbnRrKCJCQ1RMOiAleFxuIixyZWFkbChvbHltcGljX21taW8rQkNUTCkpOworCXByaW50aygiR1BSOiAleFxuIixyZWFkdyhvbHltcGljX21taW8rR1BSKSk7CisJcHJpbnRrKCJTSVNSTUFTSzogJXhcbiIscmVhZGwob2x5bXBpY19tbWlvK1NJU1JfTUFTSykpOworI2VuZGlmCisJLyogQWFhYWhoaCwgWW91IGhhdmUgZ290IHRvIGJlIHJlYWwgY2FyZWZ1bCBzZXR0aW5nIEdQUiwgdGhlIGNhcmQKKwkgICBob2xkcyB0aGUgcHJldmlvdXMgdmFsdWVzIGZyb20gZmxhc2ggbWVtb3J5LCBpbmNsdWRpbmcgYXV0b3NlbnNlIAorICAgICAgICAgICBhbmQgcmluZyBzcGVlZCAqLworCisJd3JpdGVsKHJlYWRsKG9seW1waWNfbW1pbytCQ1RMKXxCQ1RMX01JTVJFQixvbHltcGljX21taW8rQkNUTCk7CisJCisJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19yaW5nX3NwZWVkICA9PSAwKSB7IC8qIEF1dG9zZW5zZSAqLworCQl3cml0ZXcocmVhZHcob2x5bXBpY19tbWlvK0dQUil8R1BSX0FVVE9TRU5TRSxvbHltcGljX21taW8rR1BSKTsKKwkJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19tZXNzYWdlX2xldmVsKSAKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSaW5nc3BlZWQgYXV0b3NlbnNlIG1vZGUgb25cbiIsb2x5bXBpY19wcml2LT5vbHltcGljX2NhcmRfbmFtZSk7CisJfSBlbHNlIGlmIChvbHltcGljX3ByaXYtPm9seW1waWNfcmluZ19zcGVlZCA9PSAxNikgeworCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRyeWluZyB0byBvcGVuIGF0IDE2IE1icHMgYXMgcmVxdWVzdGVkXG4iLCBvbHltcGljX3ByaXYtPm9seW1waWNfY2FyZF9uYW1lKTsKKwkJd3JpdGV3KEdQUl8xNk1CUFMsIG9seW1waWNfbW1pbytHUFIpOworCX0gZWxzZSBpZiAob2x5bXBpY19wcml2LT5vbHltcGljX3Jpbmdfc3BlZWQgPT0gNCkgeworCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRyeWluZyB0byBvcGVuIGF0IDQgTWJwcyBhcyByZXF1ZXN0ZWRcbiIsIG9seW1waWNfcHJpdi0+b2x5bXBpY19jYXJkX25hbWUpIDsgCisJCXdyaXRldygwLCBvbHltcGljX21taW8rR1BSKTsKKwl9IAorCQorCXdyaXRldyhyZWFkdyhvbHltcGljX21taW8rR1BSKXxHUFJfTkVQVFVORV9CRixvbHltcGljX21taW8rR1BSKTsKKworI2lmIE9MWU1QSUNfREVCVUcKKwlwcmludGsoIkdQUiA9ICV4XG4iLHJlYWR3KG9seW1waWNfbW1pbyArIEdQUikgKSA7IAorI2VuZGlmCisJLyogU29sbyBoYXMgYmVlbiBwYXVzZWQgdG8gbWVldCB0aGUgQ2FyZGJ1cyBwb3dlcgorCSAqIHNwZWNzIGlmIHRoZSBhZGFwdGVyIGlzIGNhcmRidXMuIENoZWNrIHRvIAorCSAqIHNlZSBpdHMgYmVlbiBwYXVzZWQgYW5kIHRoZW4gcmVzdGFydCBzb2xvLiBUaGUKKwkgKiBhZGFwdGVyIHNob3VsZCBzZXQgdGhlIHBhdXNlIGJpdCB3aXRoaW4gMSBzZWNvbmQuCisJICovCisKKwlpZighKHJlYWRsKG9seW1waWNfbW1pbytCQ1RMKSAmIEJDVExfTU9ERV9JTkRJQ0FUT1IpKSB7IAorCQl0PWppZmZpZXM7CisJCXdoaWxlICghcmVhZGwob2x5bXBpY19tbWlvK0NMS0NUTCkgJiBDTEtDVExfUEFVU0UpIHsgCisJCQlzY2hlZHVsZSgpIDsgCisJCQlpZihqaWZmaWVzLXQgPiAyKkhaKSB7IAorCQkJCXByaW50ayhLRVJOX0VSUiAiSUJNIENhcmRidXMgdG9rZW5yaW5nIGFkYXB0ZXIgbm90IHJlc3BvbnNpbmcuXG4iKSA7IAorCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQl9CisJCXdyaXRlbChyZWFkbChvbHltcGljX21taW8rQ0xLQ1RMKSAmIH5DTEtDVExfUEFVU0UsIG9seW1waWNfbW1pbytDTEtDVEwpIDsgCisJfQorCQorCS8qIHN0YXJ0IHNvbG8gaW5pdCAqLworCXdyaXRlbCgoMTw8MTUpLG9seW1waWNfbW1pbytTSVNSX01BU0tfU1VNKTsKKworCXQ9amlmZmllczsKKwl3aGlsZSghKChyZWFkbChvbHltcGljX21taW8rU0lTUl9SUikpICYgU0lTUl9TUkJfUkVQTFkpKSB7CisJCXNjaGVkdWxlKCk7CQkKKwkJaWYoamlmZmllcy10ID4gMTUqSFopIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiSUJNIFBDSSB0b2tlbnJpbmcgY2FyZCBub3QgcmVzcG9uZGluZy5cbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisJCisJd3JpdGVsKHJlYWR3KG9seW1waWNfbW1pbytMQVBXV08pLG9seW1waWNfbW1pbytMQVBBKTsKKworI2lmIE9MWU1QSUNfREVCVUcKKwlwcmludGsoIkxBUFdXTzogJXgsIExBUEE6ICV4XG4iLHJlYWRsKG9seW1waWNfbW1pbytMQVBXV08pLCByZWFkbChvbHltcGljX21taW8rTEFQQSkpOworI2VuZGlmCisKKwlpbml0X3NyYj1vbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgKChyZWFkdyhvbHltcGljX21taW8rTEFQV1dPKSkgJiAofjB4ZjgwMCkpOworCisjaWYgT0xZTVBJQ19ERUJVRwkJCit7CisJaW50IGk7CisJcHJpbnRrKCJpbml0X3NyYiglcCk6ICIsaW5pdF9zcmIpOworCWZvcihpPTA7aTwyMDtpKyspCisJCXByaW50aygiJXggIixyZWFkYihpbml0X3NyYitpKSk7CisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCQorCWlmKHJlYWR3KGluaXRfc3JiKzYpKSB7CisJCXByaW50ayhLRVJOX0lORk8gInRva2VucmluZyBjYXJkIGluaXRpYWxpemF0aW9uIGZhaWxlZC4gZXJyb3Jjb2RlIDogJXhcbiIscmVhZHcoaW5pdF9zcmIrNikpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIHsKKwkJaWYgKCByZWFkYihpbml0X3NyYiArMikgJiAweDQwKSB7IAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiT2x5bXBpYzogQWRhcHRlciBpcyBGRFggY2FwYWJsZS5cbiIpIDsKKwkJfSBlbHNlIHsgCisJCQlwcmludGsoS0VSTl9JTkZPICJPbHltcGljOiBBZGFwdGVyIGNhbm5vdCBkbyBGRFguXG4iKTsKKwkJfQorCX0KKyAgCisJdWFhX2FkZHI9c3dhYjE2KHJlYWR3KGluaXRfc3JiKzgpKTsKKworI2lmIE9MWU1QSUNfREVCVUcKKwlwcmludGsoIlVBQSByZXNpZGVzIGF0ICV4XG4iLHVhYV9hZGRyKTsKKyNlbmRpZgorCisJd3JpdGVsKHVhYV9hZGRyLG9seW1waWNfbW1pbytMQVBBKTsKKwlhZGFwdGVyX2FkZHI9b2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArICh1YWFfYWRkciAmICh+MHhmODAwKSk7CisKKyNpZiBPTFlNUElDX0RFQlVHCisJcHJpbnRrKCJhZGFwdGVyIGFkZHJlc3M6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJcmVhZGIoYWRhcHRlcl9hZGRyKSwgcmVhZGIoYWRhcHRlcl9hZGRyKzEpLHJlYWRiKGFkYXB0ZXJfYWRkcisyKSwKKwkJCXJlYWRiKGFkYXB0ZXJfYWRkciszKSxyZWFkYihhZGFwdGVyX2FkZHIrNCkscmVhZGIoYWRhcHRlcl9hZGRyKzUpKTsKKyNlbmRpZgorCisJbWVtY3B5X2Zyb21pbygmZGV2LT5kZXZfYWRkclswXSwgYWRhcHRlcl9hZGRyLDYpOworCisJb2x5bXBpY19wcml2LT5vbHltcGljX2FkZHJfdGFibGVfYWRkciA9IHN3YWIxNihyZWFkdyhpbml0X3NyYiArIDEyKSk7IAorCW9seW1waWNfcHJpdi0+b2x5bXBpY19wYXJtc19hZGRyID0gc3dhYjE2KHJlYWR3KGluaXRfc3JiICsgMTQpKTsgCisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IG9seW1waWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXY9KHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqb2x5bXBpY19tbWlvPW9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvLCppbml0X3NyYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB0OworCWludCBpLCBvcGVuX2ZpbmlzaGVkID0gMSA7CisJdTggcmVzcCwgZXJyOworCisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCxjdXJyZW50KSA7IAorCisJb2x5bXBpY19pbml0KGRldik7CisKKwlpZihyZXF1ZXN0X2lycShkZXYtPmlycSwgJm9seW1waWNfaW50ZXJydXB0LCBTQV9TSElSUSAsICJvbHltcGljIiwgZGV2KSkgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKyNpZiBPTFlNUElDX0RFQlVHCisJcHJpbnRrKCJCTUNUTDogJXhcbiIscmVhZGwob2x5bXBpY19tbWlvK0JNQ1RMX1NVTSkpOworCXByaW50aygicGVuZGluZyBpbnRzOiAleFxuIixyZWFkbChvbHltcGljX21taW8rU0lTUl9SUikpOworI2VuZGlmCisKKwl3cml0ZWwoU0lTUl9NSSxvbHltcGljX21taW8rU0lTUl9NQVNLX1NVTSk7CisKKwl3cml0ZWwoU0lTUl9NSSB8IFNJU1JfU1JCX1JFUExZLCBvbHltcGljX21taW8rU0lTUl9NQVNLKTsgLyogbW9yZSBpbnRzIGxhdGVyLCBkb2Vzbid0IHN0b3AgYXJiIGNtZCBpbnRlcnJ1cHQgKi8KKworCXdyaXRlbChMSVNSX0xJRSxvbHltcGljX21taW8rTElTUik7IC8qIG1vcmUgaW50cyBsYXRlciAqLworCisJLyogYWRhcHRlciBpcyBjbG9zZWQsIHNvIFNSQiBpcyBwb2ludGVkIHRvIGJ5IExBUFdXTyAqLworCisJd3JpdGVsKHJlYWR3KG9seW1waWNfbW1pbytMQVBXV08pLG9seW1waWNfbW1pbytMQVBBKTsKKwlpbml0X3NyYj1vbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgKChyZWFkdyhvbHltcGljX21taW8rTEFQV1dPKSkgJiAofjB4ZjgwMCkpOworCQorI2lmIE9MWU1QSUNfREVCVUcKKwlwcmludGsoIkxBUFdXTzogJXgsIExBUEE6ICV4XG4iLHJlYWR3KG9seW1waWNfbW1pbytMQVBXV08pLCByZWFkbChvbHltcGljX21taW8rTEFQQSkpOworCXByaW50aygiU0lTUiBNYXNrID0gJTA0eFxuIiwgcmVhZGwob2x5bXBpY19tbWlvK1NJU1JfTUFTSykpOworCXByaW50aygiQmVmb3JlIHRoZSBvcGVuIGNvbW1hbmQgXG4iKTsKKyNlbmRpZgkKKwlkbyB7CisJCW1lbXNldF9pbyhpbml0X3NyYiwwLFNSQl9DT01NQU5EX1NJWkUpOworCisJCXdyaXRlYihTUkJfT1BFTl9BREFQVEVSLGluaXRfc3JiKSA7IAkvKiBvcGVuICovCisJCXdyaXRlYihPTFlNUElDX0NMRUFSX1JFVF9DT0RFLGluaXRfc3JiKzIpOworCisJCS8qIElmIE5ldHdvcmsgTW9uaXRvciwgaW5zdHJ1Y3QgY2FyZCB0byBjb3B5IE1BQyBmcmFtZXMgdGhyb3VnaCB0aGUgQVJCICovCisJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbmV0d29ya19tb25pdG9yKSAKKwkJCXdyaXRldyhzd2FiMTYoT1BFTl9BREFQVEVSX0VOQUJMRV9GRFggfCBPUEVOX0FEQVBURVJfUEFTU19BRENfTUFDIHwgT1BFTl9BREFQVEVSX1BBU1NfQVRUX01BQyB8IE9QRU5fQURBUFRFUl9QQVNTX0JFQUNPTiksIGluaXRfc3JiKzgpOworCQllbHNlCisJCQl3cml0ZXcoc3dhYjE2KE9QRU5fQURBUFRFUl9FTkFCTEVfRkRYKSwgaW5pdF9zcmIrOCk7CisJCisJCS8qIFRlc3QgT1Igb2YgZmlyc3QgMyBieXRlcyBhcyBpdHMgdG90YWxseSBwb3NzaWJsZSBmb3IgCisJCSAqIHNvbWVvbmUgdG8gc2V0IHRoZSBmaXJzdCAyIGJ5dGVzIHRvIGJlIHplcm8sIGFsdGhvdWdoIHRoaXMgCisJCSAqIGlzIGFuIGVycm9yLCB0aGUgZmlyc3QgYnl0ZSBtdXN0IGhhdmUgYml0IDYgc2V0IHRvIDEgICovCisKKwkJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMF0gfCBvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzFdIHwgb2x5bXBpY19wcml2LT5vbHltcGljX2xhYVsyXSkgeworCQkJd3JpdGViKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMF0saW5pdF9zcmIrMTIpOworCQkJd3JpdGViKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMV0saW5pdF9zcmIrMTMpOworCQkJd3JpdGViKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMl0saW5pdF9zcmIrMTQpOworCQkJd3JpdGViKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbM10saW5pdF9zcmIrMTUpOworCQkJd3JpdGViKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbNF0saW5pdF9zcmIrMTYpOworCQkJd3JpdGViKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbNV0saW5pdF9zcmIrMTcpOworCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsb2x5bXBpY19wcml2LT5vbHltcGljX2xhYSxkZXYtPmFkZHJfbGVuKSA7ICAKKwkJfSAJCisJCXdyaXRlYigxLGluaXRfc3JiKzMwKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2ssZmxhZ3MpOwkKKwkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTE7CisKKwkJd3JpdGVsKExJU1JfU1JCX0NNRCxvbHltcGljX21taW8rTElTUl9TVU0pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbHltcGljX3ByaXYtPm9seW1waWNfbG9jayxmbGFncyk7CisKKwkJdCA9IGppZmZpZXMgOyAKKwkKKwkJYWRkX3dhaXRfcXVldWUoJm9seW1waWNfcHJpdi0+c3JiX3dhaXQsJndhaXQpIDsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKSA7IAorIAorIAkJd2hpbGUob2x5bXBpY19wcml2LT5zcmJfcXVldWVkKSB7ICAgICAgICAKKwkJCXNjaGVkdWxlKCkgOyAKKyAgICAgICAgCQlpZihzaWduYWxfcGVuZGluZyhjdXJyZW50KSkJeyAgICAgICAgICAgIAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTaWduYWwgcmVjZWl2ZWQgaW4gb3Blbi5cbiIsCisgICAgICAgICAgICAgICAgCQkJZGV2LT5uYW1lKTsKKyAgICAgICAgICAgIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNJU1I9JXggTElTUj0leFxuIiwKKyAgICAgICAgICAgICAgICAJCQlyZWFkbChvbHltcGljX21taW8rU0lTUiksCisgICAgICAgICAgICAgICAgCQkJcmVhZGwob2x5bXBpY19tbWlvK0xJU1IpKTsKKyAgICAgICAgICAgIAkJCW9seW1waWNfcHJpdi0+c3JiX3F1ZXVlZD0wOworICAgICAgICAgICAgCQkJYnJlYWs7CisgICAgICAgIAkJfQorCQkJaWYgKChqaWZmaWVzLXQpID4gMTAqSFopIHsgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNSQiB0aW1lZCBvdXQuIFxuIixkZXYtPm5hbWUpIDsgCisJCQkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTA7CisJCQkJYnJlYWsgOyAKKwkJCX0gCisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpIDsgCisgICAgCQl9CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZvbHltcGljX3ByaXYtPnNyYl93YWl0LCZ3YWl0KSA7IAorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpIDsgCisJCW9seW1waWNfcHJpdi0+c3JiX3F1ZXVlZCA9IDAgOyAKKyNpZiBPTFlNUElDX0RFQlVHCisJCXByaW50aygiaW5pdF9zcmIoJXApOiAiLGluaXRfc3JiKTsKKwkJZm9yKGk9MDtpPDIwO2krKykKKwkJCXByaW50aygiJTAyeCAiLHJlYWRiKGluaXRfc3JiK2kpKTsKKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJCQorCQkvKiBJZiB3ZSBnZXQgdGhlIHNhbWUgcmV0dXJuIHJlc3BvbnNlIGFzIHdlIHNldCwgdGhlIGludGVycnVwdCB3YXNuJ3QgcmFpc2VkIGFuZCB0aGUgb3BlbgorICAgICAgICAgICAgICAgICAqIHRpbWVkIG91dC4KKwkJICovCisKKwkJc3dpdGNoIChyZXNwID0gcmVhZGIoaW5pdF9zcmIrMikpIHsKKwkJY2FzZSBPTFlNUElDX0NMRUFSX1JFVF9DT0RFOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgT3BlbiB0aW1lIG91dCBvciBlcnJvci5cbiIsIGRldi0+bmFtZSkgOyAKKwkJCWdvdG8gb3V0OworCQljYXNlIDA6CisJCQlvcGVuX2ZpbmlzaGVkID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDc6CisJCQlpZiAoIW9seW1waWNfcHJpdi0+b2x5bXBpY19yaW5nX3NwZWVkICYmIG9wZW5fZmluaXNoZWQpIHsgLyogQXV0b3NlbnNlICwgZmlyc3QgdGltZSBhcm91bmQgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmV0cnlpbmcgYXQgZGlmZmVyZW50IHJpbmcgc3BlZWQgXG4iLCBkZXYtPm5hbWUpOyAKKwkJCQlvcGVuX2ZpbmlzaGVkID0gMCA7ICAKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZXJyID0gcmVhZGIoaW5pdF9zcmIrNyk7CisKKwkJCWlmICghb2x5bXBpY19wcml2LT5vbHltcGljX3Jpbmdfc3BlZWQgJiYgKChlcnIgJiAweDBmKSA9PSAweDBkKSkgeyAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJpZWQgdG8gYXV0b3NlbnNlIHJpbmcgc3BlZWQgd2l0aCBubyBtb25pdG9ycyBwcmVzZW50XG4iLGRldi0+bmFtZSk7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBsZWFzZSB0cnkgYWdhaW4gd2l0aCBhIHNwZWNpZmllZCByaW5nIHNwZWVkIFxuIixkZXYtPm5hbWUpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXMgLSAlc1xuIiwgZGV2LT5uYW1lLAorCQkJCQlvcGVuX21hal9lcnJvclsoZXJyICYgMHhmMCkgPj4gNF0sCisJCQkJCW9wZW5fbWluX2Vycm9yWyhlcnIgJiAweDBmKV0pOworCQkJfQorCQkJZ290byBvdXQ7CisKKwkJY2FzZSAweDMyOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludmFsaWQgTEFBOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQlkZXYtPm5hbWUsIAorCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMF0sCisJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX2xhYVsxXSwKKwkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzJdLAorCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbM10sCisJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX2xhYVs0XSwKKwkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzVdKSA7IAorCQkJZ290byBvdXQ7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCYWQgT1BFTiByZXNwb25zZTogJXhcbiIsIGRldi0+bmFtZSwgcmVzcCk7CisJCQlnb3RvIG91dDsKKworCQl9CisJfSB3aGlsZSAoIShvcGVuX2ZpbmlzaGVkKSkgOyAvKiBXaWxsIG9ubHkgbG9vcCBpZiByaW5nIHNwZWVkIG1pc21hdGNoIHJlLW9wZW4gYXR0ZW1wdGVkICYmIGF1dG9zZW5zZSBpcyBvbiAqLwkKKworCWlmIChyZWFkYihpbml0X3NyYisxOCkgJiAoMTw8MykpIAorCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9wZW5lZCBpbiBGRFggTW9kZVxuIixkZXYtPm5hbWUpOworCisJaWYgKHJlYWRiKGluaXRfc3JiKzE4KSAmICgxPDwxKSkKKwkJb2x5bXBpY19wcml2LT5vbHltcGljX3Jpbmdfc3BlZWQgPSAxMDAgOyAKKwllbHNlIGlmIChyZWFkYihpbml0X3NyYisxOCkgJiAxKQorCQlvbHltcGljX3ByaXYtPm9seW1waWNfcmluZ19zcGVlZCA9IDE2IDsgCisJZWxzZQorCQlvbHltcGljX3ByaXYtPm9seW1waWNfcmluZ19zcGVlZCA9IDQgOyAKKworCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkgCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPcGVuZWQgaW4gJWQgTWJwcyBtb2RlXG4iLGRldi0+bmFtZSwgb2x5bXBpY19wcml2LT5vbHltcGljX3Jpbmdfc3BlZWQpOworCisJb2x5bXBpY19wcml2LT5hc2IgPSBzd2FiMTYocmVhZHcoaW5pdF9zcmIrOCkpOworCW9seW1waWNfcHJpdi0+c3JiID0gc3dhYjE2KHJlYWR3KGluaXRfc3JiKzEwKSk7CisJb2x5bXBpY19wcml2LT5hcmIgPSBzd2FiMTYocmVhZHcoaW5pdF9zcmIrMTIpKTsKKwlvbHltcGljX3ByaXYtPnRyYiA9IHN3YWIxNihyZWFkdyhpbml0X3NyYisxNikpOworCisJb2x5bXBpY19wcml2LT5vbHltcGljX3JlY2VpdmVfb3B0aW9ucyA9IDB4MDEgOyAKKwlvbHltcGljX3ByaXYtPm9seW1waWNfY29weV9hbGxfb3B0aW9ucyA9IDAgOyAKKwkKKwkvKiBzZXR1cCByeCByaW5nICovCisJCisJd3JpdGVsKCgzPDwxNiksb2x5bXBpY19tbWlvK0JNQ1RMX1JXTSk7IC8qIEVuc3VyZSBlbmQgb2YgZnJhbWUgZ2VuZXJhdGVkIGludGVycnVwdHMgKi8gCisKKwl3cml0ZWwoQk1DVExfUlhfRElTfDMsb2x5bXBpY19tbWlvK0JNQ1RMX1JXTSk7IC8qIFllcywgdGhpcyB0aGUgZW5hYmxlcyBSWCBjaGFubmVsICovCisKKwlmb3IoaT0wO2k8T0xZTVBJQ19SWF9SSU5HX1NJWkU7aSsrKSB7CisKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCisJCXNrYj1kZXZfYWxsb2Nfc2tiKG9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeik7CisJCWlmKHNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJc2tiLT5kZXYgPSBkZXY7CisKKwkJb2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbaV0uYnVmZmVyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LCAKKwkJCQkJCQkgIHNrYi0+ZGF0YSxvbHltcGljX3ByaXYtPnBrdF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpIDsgCisJCW9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nW2ldLnJlc19sZW5ndGggPSBjcHVfdG9fbGUzMihvbHltcGljX3ByaXYtPnBrdF9idWZfc3opOyAKKwkJb2x5bXBpY19wcml2LT5yeF9yaW5nX3NrYltpXT1za2I7CisJfQorCisJaWYgKGk9PTApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ4IGJ1ZmZlcnMuIEFkYXB0ZXIgZGlzYWJsZWRcbiIsZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJb2x5bXBpY19wcml2LT5yeF9yaW5nX2RtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nLCAKKwkJCQkJIHNpemVvZihzdHJ1Y3Qgb2x5bXBpY19yeF9kZXNjKSAqIE9MWU1QSUNfUlhfUklOR19TSVpFLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwl3cml0ZWwob2x5bXBpY19wcml2LT5yeF9yaW5nX2RtYV9hZGRyLCBvbHltcGljX21taW8rUlhERVNDUSk7CisJd3JpdGVsKG9seW1waWNfcHJpdi0+cnhfcmluZ19kbWFfYWRkciwgb2x5bXBpY19tbWlvK1JYQ0RBKTsKKwl3cml0ZXcoaSwgb2x5bXBpY19tbWlvK1JYREVTQ1FDTlQpOworCQkKKwlvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19yaW5nX2RtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LCBvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmcsIAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBvbHltcGljX3J4X3N0YXR1cykgKiBPTFlNUElDX1JYX1JJTkdfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwl3cml0ZWwob2x5bXBpY19wcml2LT5yeF9zdGF0dXNfcmluZ19kbWFfYWRkciwgb2x5bXBpY19tbWlvK1JYU1RBVFEpOworCXdyaXRlbChvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19yaW5nX2RtYV9hZGRyLCBvbHltcGljX21taW8rUlhDU0EpOworCQorIAlvbHltcGljX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCA9IE9MWU1QSUNfUlhfUklOR19TSVpFIC0gMTsJLyogbGFzdCBwcm9jZXNzZWQgcnggc3RhdHVzICovCisJb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfbGFzdF9yZWNlaXZlZCA9IE9MWU1QSUNfUlhfUklOR19TSVpFIC0gMTsgIAorCisJd3JpdGV3KGksIG9seW1waWNfbW1pbytSWFNUQVRRQ05UKTsKKworI2lmIE9MWU1QSUNfREVCVUcgCisJcHJpbnRrKCIjIG9mIHJ4IGJ1ZmZlcnM6ICVkLCBSWEVOUTogJXhcbiIsaSwgcmVhZHcob2x5bXBpY19tbWlvK1JYRU5RKSk7CisJcHJpbnRrKCJSWENTQTogJXgsIHJ4X3N0YXR1c19yaW5nWzBdOiAlcFxuIixyZWFkbChvbHltcGljX21taW8rUlhDU0EpLCZvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmdbMF0pOworCXByaW50aygiIHN0YXRfcmluZ1sxXTogJXAsIHN0YXRfcmluZ1syXTogJXAsIHN0YXRfcmluZ1szXTogJXBcbiIsICYob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3N0YXR1c19yaW5nWzFdKSwgJihvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmdbMl0pLCAmKG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9zdGF0dXNfcmluZ1szXSkgKTsKKwlwcmludGsoIiBzdGF0X3JpbmdbNF06ICVwLCBzdGF0X3JpbmdbNV06ICVwLCBzdGF0X3JpbmdbNl06ICVwXG4iLCAmKG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9zdGF0dXNfcmluZ1s0XSksICYob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3N0YXR1c19yaW5nWzVdKSwgJihvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmdbNl0pICk7CisJcHJpbnRrKCIgc3RhdF9yaW5nWzddOiAlcFxuIiwgJihvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmdbN10pICApOworCisJcHJpbnRrKCJSWENEQTogJXgsIHJ4X3JpbmdbMF06ICVwXG4iLHJlYWRsKG9seW1waWNfbW1pbytSWENEQSksJm9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nWzBdKTsKKwlwcmludGsoIlJ4X3JpbmdfZG1hX2FkZHIgPSAlMDh4LCByeF9zdGF0dXNfZG1hX2FkZHIgPSAlMDh4XG4iLAorCQlvbHltcGljX3ByaXYtPnJ4X3JpbmdfZG1hX2FkZHIsb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfcmluZ19kbWFfYWRkcikgOyAKKyNlbmRpZgorCisJd3JpdGV3KCgoKHJlYWR3KG9seW1waWNfbW1pbytSWEVOUSkpICYgMHg4MDAwKSBeIDB4ODAwMCkgfCBpLG9seW1waWNfbW1pbytSWEVOUSk7CisKKyNpZiBPTFlNUElDX0RFQlVHIAorCXByaW50aygiIyBvZiByeCBidWZmZXJzOiAlZCwgUlhFTlE6ICV4XG4iLGksIHJlYWR3KG9seW1waWNfbW1pbytSWEVOUSkpOworCXByaW50aygiUlhDU0E6ICV4LCByeF9yaW5nWzBdOiAlcFxuIixyZWFkbChvbHltcGljX21taW8rUlhDU0EpLCZvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmdbMF0pOworCXByaW50aygiUlhDREE6ICV4LCByeF9yaW5nWzBdOiAlcFxuIixyZWFkbChvbHltcGljX21taW8rUlhDREEpLCZvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1swXSk7CisjZW5kaWYgCisKKwl3cml0ZWwoU0lTUl9SWF9TVEFUVVMgfCBTSVNSX1JYX05PQlVGLG9seW1waWNfbW1pbytTSVNSX01BU0tfU1VNKTsKKworCS8qIHNldHVwIHR4IHJpbmcgKi8KKworCXdyaXRlbChCTUNUTF9UWDFfRElTLG9seW1waWNfbW1pbytCTUNUTF9SV00pOyAvKiBZZXMsIHRoaXMgZW5hYmxlcyBUWCBjaGFubmVsIDEgKi8KKwlmb3IoaT0wO2k8T0xZTVBJQ19UWF9SSU5HX1NJWkU7aSsrKSAKKwkJb2x5bXBpY19wcml2LT5vbHltcGljX3R4X3JpbmdbaV0uYnVmZmVyPTB4ZGVhZGJlZWY7CisKKwlvbHltcGljX3ByaXYtPmZyZWVfdHhfcmluZ19lbnRyaWVzPU9MWU1QSUNfVFhfUklOR19TSVpFOworCW9seW1waWNfcHJpdi0+dHhfcmluZ19kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKG9seW1waWNfcHJpdi0+cGRldixvbHltcGljX3ByaXYtPm9seW1waWNfdHhfcmluZywKKwkJCQkJIHNpemVvZihzdHJ1Y3Qgb2x5bXBpY190eF9kZXNjKSAqIE9MWU1QSUNfVFhfUklOR19TSVpFLFBDSV9ETUFfVE9ERVZJQ0UpIDsgCisJd3JpdGVsKG9seW1waWNfcHJpdi0+dHhfcmluZ19kbWFfYWRkciwgb2x5bXBpY19tbWlvK1RYREVTQ1FfMSk7CisJd3JpdGVsKG9seW1waWNfcHJpdi0+dHhfcmluZ19kbWFfYWRkciwgb2x5bXBpY19tbWlvK1RYQ0RBXzEpOworCXdyaXRldyhPTFlNUElDX1RYX1JJTkdfU0laRSwgb2x5bXBpY19tbWlvK1RYREVTQ1FDTlRfMSk7CisJCisJb2x5bXBpY19wcml2LT50eF9zdGF0dXNfcmluZ19kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKG9seW1waWNfcHJpdi0+cGRldiwgb2x5bXBpY19wcml2LT5vbHltcGljX3R4X3N0YXR1c19yaW5nLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBvbHltcGljX3R4X3N0YXR1cykgKiBPTFlNUElDX1RYX1JJTkdfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwl3cml0ZWwob2x5bXBpY19wcml2LT50eF9zdGF0dXNfcmluZ19kbWFfYWRkcixvbHltcGljX21taW8rVFhTVEFUUV8xKTsKKwl3cml0ZWwob2x5bXBpY19wcml2LT50eF9zdGF0dXNfcmluZ19kbWFfYWRkcixvbHltcGljX21taW8rVFhDU0FfMSk7CisJd3JpdGV3KE9MWU1QSUNfVFhfUklOR19TSVpFLG9seW1waWNfbW1pbytUWFNUQVRRQ05UXzEpOworCQkKKwlvbHltcGljX3ByaXYtPnR4X3JpbmdfZnJlZT0wOyAvKiBuZXh0IGVudHJ5IGluIHR4IHJpbmcgdG8gdXNlICovCisJb2x5bXBpY19wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzPU9MWU1QSUNfVFhfUklOR19TSVpFLTE7IC8qIGxhc3QgcHJvY2Vzc2VkIHR4IHN0YXR1cyAqLworCisJd3JpdGVsKDB4ZmZmZmZmZmYsIG9seW1waWNfbW1pbytFSVNSX1JXTSkgOyAvKiBjbGVhbiB0aGUgZWlzciAqLworCXdyaXRlbCgwLG9seW1waWNfbW1pbytFSVNSKSA7IAorCXdyaXRlbChFSVNSX01BU0tfT1BUSU9OUyxvbHltcGljX21taW8rRUlTUl9NQVNLKSA7IC8qIGVuYWJsZXMgbW9zdCBvZiB0aGUgVFggZXJyb3IgaW50ZXJydXB0cyAqLworCXdyaXRlbChTSVNSX1RYMV9FT0YgfCBTSVNSX0FEQVBURVJfQ0hFQ0sgfCBTSVNSX0FSQl9DTUQgfCBTSVNSX1RSQl9SRVBMWSB8IFNJU1JfQVNCX0ZSRUUgfCBTSVNSX0VSUixvbHltcGljX21taW8rU0lTUl9NQVNLX1NVTSk7CisKKyNpZiBPTFlNUElDX0RFQlVHIAorCXByaW50aygiQk1DVEw6ICV4XG4iLHJlYWRsKG9seW1waWNfbW1pbytCTUNUTF9TVU0pKTsKKwlwcmludGsoIlNJU1IgTUFTSzogJXhcbiIscmVhZGwob2x5bXBpY19tbWlvK1NJU1JfTUFTSykpOworI2VuZGlmCisKKwlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX25ldHdvcmtfbW9uaXRvcikgeyAKKwkJdTggX19pb21lbSAqb2F0IDsgCisJCXU4IF9faW9tZW0gKm9wdCA7IAorCQlvYXQgPSAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIG9seW1waWNfcHJpdi0+b2x5bXBpY19hZGRyX3RhYmxlX2FkZHIpIDsgCisJCW9wdCA9IChvbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgb2x5bXBpY19wcml2LT5vbHltcGljX3Bhcm1zX2FkZHIpIDsgCisKKwkJcHJpbnRrKCIlczogTm9kZSBBZGRyZXNzOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIixkZXYtPm5hbWUsIAorCQkJcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxub2RlX2FkZHIpKSwgCisJCQlyZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikrMSksCisJCQlyZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikrMiksCisJCQlyZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikrMyksCisJCQlyZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikrNCksCisJCQlyZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikrNSkpOworCQlwcmludGsoIiVzOiBGdW5jdGlvbmFsIEFkZHJlc3M6ICUwMng6JTAyeDolMDJ4OiUwMnhcbiIsZGV2LT5uYW1lLCAKKwkJCXJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsZnVuY19hZGRyKSksIAorCQkJcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxmdW5jX2FkZHIpKzEpLAorCQkJcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxmdW5jX2FkZHIpKzIpLAorCQkJcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxmdW5jX2FkZHIpKzMpKTsKKwkJcHJpbnRrKCIlczogTkFVTiBBZGRyZXNzOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIixkZXYtPm5hbWUsIAorCQkJcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHVwX25vZGVfYWRkcikpLAorCQkJcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHVwX25vZGVfYWRkcikrMSksCisJCQlyZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgdXBfbm9kZV9hZGRyKSsyKSwKKwkJCXJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCB1cF9ub2RlX2FkZHIpKzMpLAorCQkJcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHVwX25vZGVfYWRkcikrNCksCisJCQlyZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgdXBfbm9kZV9hZGRyKSs1KSk7CisJfQorCQorCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7CisKK291dDoKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZXR1cm4gLUVJTzsKK30JCisKKy8qCisgKglXaGVuIHdlIGVudGVyIHRoZSByeCByb3V0aW5lIHdlIGRvIG5vdCBrbm93IGhvdyBtYW55IGZyYW1lcyBoYXZlIGJlZW4gCisgKglxdWV1ZWQgb24gdGhlIHJ4IGNoYW5uZWwuICBUaGVyZWZvcmUgd2Ugc3RhcnQgYXQgdGhlIG5leHQgcnggc3RhdHVzCisgKglwb3NpdGlvbiBhbmQgdHJhdmVsIGFyb3VuZCB0aGUgcmVjZWl2ZSByaW5nIHVudGlsIHdlIGhhdmUgY29tcGxldGVkCisgKglhbGwgdGhlIGZyYW1lcy4KKyAqCisgKglUaGlzIG1lYW5zIHRoYXQgd2UgbWF5IHByb2Nlc3MgdGhlIGZyYW1lIGJlZm9yZSB3ZSByZWNlaXZlIHRoZSBlbmQKKyAqCW9mIGZyYW1lIGludGVycnVwdC4gVGhpcyBpcyB3aHkgd2UgYWx3YXlzIHRlc3QgdGhlIHN0YXR1cyBpbnN0ZWFkCisgKglvZiBibGluZGx5IHByb2Nlc3NpbmcgdGhlIG5leHQgZnJhbWUuCisgKgorICoJV2UgYWxzbyByZW1vdmUgdGhlIGxhc3QgNCBieXRlcyBmcm9tIHRoZSBwYWNrZXQgYXMgd2VsbCwgdGhlc2UgYXJlCisgKglqdXN0IHRva2VuIHJpbmcgdHJhaWxlciBpbmZvIGFuZCB1cHNldCBwcm90b2NvbHMgdGhhdCBkb24ndCBjaGVjayAKKyAqCXRoZWlyIG93biBsZW5ndGgsIGkuZS4gU05BLiAKKyAqCQorICovCitzdGF0aWMgdm9pZCBvbHltcGljX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2PShzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKm9seW1waWNfbW1pbz1vbHltcGljX3ByaXYtPm9seW1waWNfbW1pbzsKKwlzdHJ1Y3Qgb2x5bXBpY19yeF9zdGF0dXMgKnJ4X3N0YXR1czsKKwlzdHJ1Y3Qgb2x5bXBpY19yeF9kZXNjICpyeF9kZXNjIDsgCisJaW50IHJ4X3JpbmdfbGFzdF9yZWNlaXZlZCxsZW5ndGgsIGJ1ZmZlcl9jbnQsIGNweV9sZW5ndGgsIGZyYWdfbGVuOworCXN0cnVjdCBza19idWZmICpza2IsICpza2IyOworCWludCBpOworCisJcnhfc3RhdHVzPSYob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3N0YXR1c19yaW5nWyhvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkICsgMSkgJiAoT0xZTVBJQ19SWF9SSU5HX1NJWkUgLSAxKV0pIDsgCisgCisJd2hpbGUgKHJ4X3N0YXR1cy0+c3RhdHVzX2J1ZmZlcmNudCkgeyAKKyAgICAgICAgICAgICAgICB1MzIgbF9zdGF0dXNfYnVmZmVyY250OworCisJCW9seW1waWNfcHJpdi0+cnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWQrKyA7CisJCW9seW1waWNfcHJpdi0+cnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWQgJj0gKE9MWU1QSUNfUlhfUklOR19TSVpFIC0xKTsKKyNpZiBPTFlNUElDX0RFQlVHCisJCXByaW50aygicnggc3RhdHVzOiAleCByeCBsZW46ICV4IFxuIiwgbGUzMl90b19jcHUocnhfc3RhdHVzLT5zdGF0dXNfYnVmZmVyY250KSwgbGUzMl90b19jcHUocnhfc3RhdHVzLT5mcmFnbWVudGNudF9mcmFtZWxlbikpOworI2VuZGlmCisJCWxlbmd0aCA9IGxlMzJfdG9fY3B1KHJ4X3N0YXR1cy0+ZnJhZ21lbnRjbnRfZnJhbWVsZW4pICYgMHhmZmZmOworCQlidWZmZXJfY250ID0gbGUzMl90b19jcHUocnhfc3RhdHVzLT5zdGF0dXNfYnVmZmVyY250KSAmIDB4ZmZmZjsgCisJCWkgPSBidWZmZXJfY250IDsgLyogTmVlZCBidWZmZXJfY250IGxhdGVyIGZvciByeGVucSB1cGRhdGUgKi8gCisJCWZyYWdfbGVuID0gbGUzMl90b19jcHUocnhfc3RhdHVzLT5mcmFnbWVudGNudF9mcmFtZWxlbikgPj4gMTY7IAorCisjaWYgT0xZTVBJQ19ERUJVRyAKKwkJcHJpbnRrKCJsZW5ndGg6ICV4LCBmcmFnX2xlbjogJXgsIGJ1ZmZlcl9jbnQ6ICV4XG4iLCBsZW5ndGgsIGZyYWdfbGVuLCBidWZmZXJfY250KTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGxfc3RhdHVzX2J1ZmZlcmNudCA9IGxlMzJfdG9fY3B1KHJ4X3N0YXR1cy0+c3RhdHVzX2J1ZmZlcmNudCk7CisJCWlmKGxfc3RhdHVzX2J1ZmZlcmNudCAmIDB4QzAwMDAwMDApIHsKKwkJCWlmIChsX3N0YXR1c19idWZmZXJjbnQgJiAweDNCMDAwMDAwKSB7CisJCQkJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19tZXNzYWdlX2xldmVsKSB7CisJCQkJCWlmIChsX3N0YXR1c19idWZmZXJjbnQgJiAoMTw8MjkpKSAgLyogUnggRnJhbWUgVHJ1bmNhdGVkICovCisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUnggRnJhbWUgVHJ1bmNhdGVkIFxuIixkZXYtPm5hbWUpOworCQkJCQlpZiAobF9zdGF0dXNfYnVmZmVyY250ICYgKDE8PDI4KSkgLypSeCByZWNlaXZlIG92ZXJydW4gKi8KKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSeCBGcmFtZSBSZWNlaXZlIG92ZXJydW4gXG4iLGRldi0+bmFtZSk7CisJCQkJCWlmIChsX3N0YXR1c19idWZmZXJjbnQgJiAoMTw8MjcpKSAvKiBObyByZWNlaXZlIGJ1ZmZlcnMgKi8KKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyByZWNlaXZlIGJ1ZmZlcnMgXG4iLGRldi0+bmFtZSk7CisJCQkJCWlmIChsX3N0YXR1c19idWZmZXJjbnQgJiAoMTw8MjUpKSAvKiBSZWNlaXZlIGZyYW1lIGVycm9yIGRldGVjdCAqLworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmUgZnJhbWUgZXJyb3IgZGV0ZWN0IFxuIixkZXYtPm5hbWUpOworCQkJCQlpZiAobF9zdGF0dXNfYnVmZmVyY250ICYgKDE8PDI0KSkgLyogUmVjZWl2ZWQgRXJyb3IgRGV0ZWN0ICovCisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZWQgRXJyb3IgRGV0ZWN0IFxuIixkZXYtPm5hbWUpOworCQkJCX0gCisJCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgKz0gaSA7IAorCQkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkICY9IChPTFlNUElDX1JYX1JJTkdfU0laRSAtMSkgOyAKKwkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfc3RhdHMucnhfZXJyb3JzKys7CSAKKwkJCX0gZWxzZSB7CQorCQkJCisJCQkJaWYgKGJ1ZmZlcl9jbnQgPT0gMSkgeworCQkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKG1heF90KGludCwgb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6LGxlbmd0aCkpIDsgCisJCQkJfSBlbHNlIHsKKwkJCQkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW5ndGgpIDsgCisJCQkJfQorCisJCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBjb3B5IHBhY2tldCB0byB1cHBlciBsYXllcnMuIFxuIixkZXYtPm5hbWUpIDsKKwkJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX3N0YXRzLnJ4X2Ryb3BwZWQrKyA7IAorCQkJCQkvKiBVcGRhdGUgY291bnRlcnMgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgdHJhbnNmZXIgdGhlIGZyYW1lICovCisJCQkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkICs9IGkgOyAKKwkJCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgJj0gKE9MWU1QSUNfUlhfUklOR19TSVpFIC0xKSA7ICAKKwkJCQl9IGVsc2UgIHsKKwkJCQkJc2tiLT5kZXYgPSBkZXYgOyAKKworCQkJCQkvKiBPcHRpbWlzZSBiYXNlZCB1cG9uIG51bWJlciBvZiBidWZmZXJzIHVzZWQuIAorCQkJICAgCSAgIAkgICBJZiBvbmx5IG9uZSBidWZmZXIgaXMgdXNlZCB3ZSBjYW4gc2ltcGx5IHN3YXAgdGhlIGJ1ZmZlcnMgYXJvdW5kLgorCQkJICAgCSAgIAkgICBJZiBtb3JlIHRoYW4gb25lIHRoZW4gd2UgbXVzdCB1c2UgdGhlIG5ldyBidWZmZXIgYW5kIGNvcHkgdGhlIGluZm9ybWF0aW9uCisJCQkgICAJICAgCSAgIGZpcnN0LiBJZGVhbGx5IGFsbCBmcmFtZXMgd291bGQgYmUgaW4gYSBzaW5nbGUgYnVmZmVyLCB0aGlzIGNhbiBiZSB0dW5lZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAJICAgYWx0ZXJpbmcgdGhlIGJ1ZmZlciBzaXplLiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgaXMgbGVzcyB0aGFuCisJCQkJCSAgIDE1MDAgYnl0ZXMgd2UncmUgZ29pbmcgdG8gY29weSBpdCBvdmVyIGFueXdheSB0byBzdG9wIHBhY2tldHMgZ2V0dGluZworCQkJCQkgICBkcm9wcGVkIGZyb20gc29ja2V0cyB3aXRoIGJ1ZmZlcnMgc21hbGxlciB0aGFuIG91ciBwa3RfYnVmX3N6LiAqLworCQkJCQorIAkJCQkJaWYgKGJ1ZmZlcl9jbnQ9PTEpIHsKKwkJCQkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkKysgOyAKKwkJCQkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkICY9IChPTFlNUElDX1JYX1JJTkdfU0laRSAtMSk7CisJCQkJCQlyeF9yaW5nX2xhc3RfcmVjZWl2ZWQgPSBvbHltcGljX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCA7CisJCQkJCQlpZiAobGVuZ3RoID4gMTUwMCkgeyAKKwkJCQkJCQlza2IyPW9seW1waWNfcHJpdi0+cnhfcmluZ19za2JbcnhfcmluZ19sYXN0X3JlY2VpdmVkXSA7IAorCQkJCQkJCS8qIHVubWFwIGJ1ZmZlciAqLworCQkJCQkJCXBjaV91bm1hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LAorCQkJCQkJCQlsZTMyX3RvX2NwdShvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLmJ1ZmZlciksIAorCQkJCQkJCQlvbHltcGljX3ByaXYtPnBrdF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKSA7IAorCQkJCQkJCXNrYl9wdXQoc2tiMixsZW5ndGgtNCk7CisJCQkJCQkJc2tiMi0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKHNrYjIsZGV2KTsKKwkJCQkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLmJ1ZmZlciA9IAorCQkJCQkJCQljcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShvbHltcGljX3ByaXYtPnBkZXYsIHNrYi0+ZGF0YSwgCisJCQkJCQkJCW9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCQkJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS5yZXNfbGVuZ3RoID0gCisJCQkJCQkJCWNwdV90b19sZTMyKG9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeik7IAorCQkJCQkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19za2JbcnhfcmluZ19sYXN0X3JlY2VpdmVkXSA9IHNrYiA7IAorCQkJCQkJCW5ldGlmX3J4KHNrYjIpIDsgCisJCQkJCQl9IGVsc2UgeyAKKwkJCQkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUob2x5bXBpY19wcml2LT5wZGV2LAorCQkJCQkJCQlsZTMyX3RvX2NwdShvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLmJ1ZmZlciksCisJCQkJCQkJCW9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsgCisJCQkJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLGxlbmd0aC00KSxvbHltcGljX3ByaXYtPnJ4X3Jpbmdfc2tiW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0tPmRhdGEsbGVuZ3RoLTQpIDsgCisJCQkJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG9seW1waWNfcHJpdi0+cGRldiwKKwkJCQkJCQkJbGUzMl90b19jcHUob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS5idWZmZXIpLAorCQkJCQkJCQlvbHltcGljX3ByaXYtPnBrdF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKSA7CisJCQkJCQkJc2tiLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMoc2tiLGRldikgOyAKKwkJCQkJCQluZXRpZl9yeChza2IpIDsgCisJCQkJCQl9IAorCQkJCQl9IGVsc2UgeworCQkJCQkJZG8geyAvKiBXYWxrIHRoZSBidWZmZXJzICovIAorCQkJCQkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkKysgOyAKKwkJCQkJCQlvbHltcGljX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCAmPSAoT0xZTVBJQ19SWF9SSU5HX1NJWkUgLTEpOworCQkJCQkJCXJ4X3JpbmdfbGFzdF9yZWNlaXZlZCA9IG9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkIDsgCisJCQkJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KG9seW1waWNfcHJpdi0+cGRldiwKKwkJCQkJCQkJbGUzMl90b19jcHUob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS5idWZmZXIpLAorCQkJCQkJCQlvbHltcGljX3ByaXYtPnBrdF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKSA7IAorCQkJCQkJCXJ4X2Rlc2MgPSAmKG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0pOworCQkJCQkJCWNweV9sZW5ndGggPSAoaSA9PSAxID8gZnJhZ19sZW4gOiBsZTMyX3RvX2NwdShyeF9kZXNjLT5yZXNfbGVuZ3RoKSk7IAorCQkJCQkJCW1lbWNweShza2JfcHV0KHNrYiwgY3B5X2xlbmd0aCksIG9seW1waWNfcHJpdi0+cnhfcmluZ19za2JbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS0+ZGF0YSwgY3B5X2xlbmd0aCkgOworCQkJCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShvbHltcGljX3ByaXYtPnBkZXYsCisJCQkJCQkJCWxlMzJfdG9fY3B1KG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0uYnVmZmVyKSwKKwkJCQkJCQkJb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6LFBDSV9ETUFfRlJPTURFVklDRSkgOworCQkJCQkJfSB3aGlsZSAoLS1pKSA7IAorCQkJCQkJc2tiX3RyaW0oc2tiLHNrYi0+bGVuLTQpIDsgCisJCQkJCQlza2ItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCQkJCW5ldGlmX3J4KHNrYikgOyAKKwkJCQkJfSAKKwkJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllcyA7IAorCQkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfc3RhdHMucnhfcGFja2V0cysrIDsgCisJCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY19zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGggOyAKKwkJCQl9IC8qIGlmIHNrYiA9PSBudWxsICovCisJCQl9IC8qIElmIHN0YXR1cyAmIDB4M2IgKi8KKworCQl9IGVsc2UgeyAvKmlmIGJ1ZmZlcmNudCAmIDB4QyAqLworCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgKz0gaSA7IAorCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgJj0gKE9MWU1QSUNfUlhfUklOR19TSVpFIC0gMSkgOyAKKwkJfSAKKworCQlyeF9zdGF0dXMtPmZyYWdtZW50Y250X2ZyYW1lbGVuID0gMCA7IAorCQlyeF9zdGF0dXMtPnN0YXR1c19idWZmZXJjbnQgPSAwIDsgCisJCXJ4X3N0YXR1cyA9ICYob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3N0YXR1c19yaW5nWyhvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkKzEpICYgKE9MWU1QSUNfUlhfUklOR19TSVpFIC0xKSBdKTsKKworCQl3cml0ZXcoKCgocmVhZHcob2x5bXBpY19tbWlvK1JYRU5RKSkgJiAweDgwMDApIF4gMHg4MDAwKSB8ICBidWZmZXJfY250ICwgb2x5bXBpY19tbWlvK1JYRU5RKTsgCisJfSAvKiB3aGlsZSAqLworCit9CisKK3N0YXRpYyB2b2lkIG9seW1waWNfZnJlZW1lbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sgCisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2PShzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICopZGV2LT5wcml2OworCWludCBpOworCQkJCisJZm9yKGk9MDtpPE9MWU1QSUNfUlhfUklOR19TSVpFO2krKykgeworCQlpZiAob2x5bXBpY19wcml2LT5yeF9yaW5nX3NrYltvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkXSAhPSBOVUxMKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShvbHltcGljX3ByaXYtPnJ4X3Jpbmdfc2tiW29seW1waWNfcHJpdi0+cnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWRdKTsKKwkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19za2Jbb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfbGFzdF9yZWNlaXZlZF0gPSBOVUxMOworCQl9CisJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1tvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkXS5idWZmZXIgIT0gMHhkZWFkYmVlZikgeworCQkJcGNpX3VubWFwX3NpbmdsZShvbHltcGljX3ByaXYtPnBkZXYsIAorCQkJbGUzMl90b19jcHUob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3Jpbmdbb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfbGFzdF9yZWNlaXZlZF0uYnVmZmVyKSwKKwkJCW9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJfQorCQlvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkKys7CisJCW9seW1waWNfcHJpdi0+cnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWQmPU9MWU1QSUNfUlhfUklOR19TSVpFLTE7CisJfQorCS8qIHVubWFwIHJpbmdzICovCisJcGNpX3VubWFwX3NpbmdsZShvbHltcGljX3ByaXYtPnBkZXYsIG9seW1waWNfcHJpdi0+cnhfc3RhdHVzX3JpbmdfZG1hX2FkZHIsIAorCQlzaXplb2Yoc3RydWN0IG9seW1waWNfcnhfc3RhdHVzKSAqIE9MWU1QSUNfUlhfUklOR19TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCXBjaV91bm1hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LCBvbHltcGljX3ByaXYtPnJ4X3JpbmdfZG1hX2FkZHIsCisJCXNpemVvZihzdHJ1Y3Qgb2x5bXBpY19yeF9kZXNjKSAqIE9MWU1QSUNfUlhfUklOR19TSVpFLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCXBjaV91bm1hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LCBvbHltcGljX3ByaXYtPnR4X3N0YXR1c19yaW5nX2RtYV9hZGRyLCAKKwkJc2l6ZW9mKHN0cnVjdCBvbHltcGljX3R4X3N0YXR1cykgKiBPTFlNUElDX1RYX1JJTkdfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlwY2lfdW5tYXBfc2luZ2xlKG9seW1waWNfcHJpdi0+cGRldiwgb2x5bXBpY19wcml2LT50eF9yaW5nX2RtYV9hZGRyLCAKKwkJc2l6ZW9mKHN0cnVjdCBvbHltcGljX3R4X2Rlc2MpICogT0xZTVBJQ19UWF9SSU5HX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJcmV0dXJuIDsgCit9CisgCitzdGF0aWMgaXJxcmV0dXJuX3Qgb2x5bXBpY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykgCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldj0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBvbHltcGljX3ByaXZhdGUgKm9seW1waWNfcHJpdj0oc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwl1OCBfX2lvbWVtICpvbHltcGljX21taW89b2x5bXBpY19wcml2LT5vbHltcGljX21taW87CisJdTMyIHNpc3I7CisJdTggX19pb21lbSAqYWRhcHRlcl9jaGVja19hcmVhIDsgCisJCisJLyogCisJICogIFJlYWQgc2lzciBidXQgZG9uJ3QgcmVzZXQgaXQgeWV0LiAKKwkgKiAgVGhlIGluZGljYXRpb24gYml0IG1heSBoYXZlIGJlZW4gc2V0IGJ1dCB0aGUgaW50ZXJydXB0IGxhdGNoCisJICogIGJpdCBtYXkgbm90IGJlIHNldCwgc28gd2UnZCBsb3NlIHRoZSBpbnRlcnJ1cHQgbGF0ZXIuIAorCSAqLyAKKwlzaXNyPXJlYWRsKG9seW1waWNfbW1pbytTSVNSKSA7IAorCWlmICghKHNpc3IgJiBTSVNSX01JKSkgLyogSW50ZXJydXB0IGlzbid0IGZvciB1cyAqLyAKKwkJcmV0dXJuIElSUV9OT05FOworCXNpc3I9cmVhZGwob2x5bXBpY19tbWlvK1NJU1JfUlIpIDsgIC8qIFJlYWQgJiBSZXNldCBzaXNyICovIAorCisJc3Bpbl9sb2NrKCZvbHltcGljX3ByaXYtPm9seW1waWNfbG9jayk7CisKKwkvKiBIb3Rzd2FwIGdpdmVzIHVzIHRoaXMgb24gcmVtb3ZhbCAqLworCWlmIChzaXNyID09IDB4ZmZmZmZmZmYpIHsgCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBIb3Rzd2FwIGFkYXB0ZXIgcmVtb3ZhbC5cbiIsZGV2LT5uYW1lKSA7IAorCQlzcGluX3VubG9jaygmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2spIDsgCisJCXJldHVybiBJUlFfTk9ORTsKKwl9IAorCQkKKwlpZiAoc2lzciAmIChTSVNSX1NSQl9SRVBMWSB8IFNJU1JfVFgxX0VPRiB8IFNJU1JfUlhfU1RBVFVTIHwgU0lTUl9BREFQVEVSX0NIRUNLIHwgIAorCQkJU0lTUl9BU0JfRlJFRSB8IFNJU1JfQVJCX0NNRCB8IFNJU1JfVFJCX1JFUExZIHwgU0lTUl9SWF9OT0JVRiB8IFNJU1JfRVJSKSkgeyAgCisJCisJCS8qIElmIHdlIGV2ZXIgZ2V0IHRoaXMgdGhlIGFkYXB0ZXIgaXMgc2VyaW91c2x5IGRlYWQuIE9ubHkgYSByZXNldCBpcyBnb2luZyB0byAKKwkJICogYnJpbmcgaXQgYmFjayB0byBsaWZlLiBXZSdyZSB0YWxraW5nIHBjaSBidXMgZXJyb3JzIGFuZCBzdWNoIGxpa2UgOiggKi8gCisJCWlmKChzaXNyICYgU0lTUl9FUlIpICYmIChyZWFkbChvbHltcGljX21taW8rRUlTUikgJiBFSVNSX01BU0tfT1BUSU9OUykpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiT2x5bXBpYzogRUlTUiBFcnJvciwgRUlTUj0lMDh4XG4iLHJlYWRsKG9seW1waWNfbW1pbytFSVNSKSkgOyAKKwkJCXByaW50ayhLRVJOX0VSUiAiVGhlIGFkYXB0ZXIgbXVzdCBiZSByZXNldCB0byBjbGVhciB0aGlzIGNvbmRpdGlvbi5cbiIpIDsgCisJCQlwcmludGsoS0VSTl9FUlIgIlBsZWFzZSByZXBvcnQgdGhpcyBlcnJvciB0byB0aGUgZHJpdmVyIG1haW50YWluZXIgYW5kL1xuIikgOyAKKwkJCXByaW50ayhLRVJOX0VSUiAib3IgdGhlIGxpbnV4LXRyIG1haWxpbmcgbGlzdC5cbiIpIDsgCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm9seW1waWNfcHJpdi0+c3JiX3dhaXQpOworCQkJc3Bpbl91bmxvY2soJm9seW1waWNfcHJpdi0+b2x5bXBpY19sb2NrKSA7IAorCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9IC8qIFNJU1JfRVJSICovCisKKwkJaWYoc2lzciAmIFNJU1JfU1JCX1JFUExZKSB7CisJCQlpZihvbHltcGljX3ByaXYtPnNyYl9xdWV1ZWQ9PTEpIHsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm9seW1waWNfcHJpdi0+c3JiX3dhaXQpOworCQkJfSBlbHNlIGlmIChvbHltcGljX3ByaXYtPnNyYl9xdWV1ZWQ9PTIpIHsgCisJCQkJb2x5bXBpY19zcmJfYmgoZGV2KSA7IAorCQkJfQorCQkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTA7CisJCX0gLyogU0lTUl9TUkJfUkVQTFkgKi8KKworCQkvKiBXZSBzaG91bGRuJ3QgZXZlciBtaXNzIHRoZSBUeCBpbnRlcnJ1cHQsIGJ1dCB0aGUgeW91IG5ldmVyIGtub3csIGhlbmNlIHRoZSBsb29wIHRvIGVuc3VyZQorCQkgICB3ZSBnZXQgYWxsIHR4IGNvbXBsZXRpb25zLiAqLworCQlpZiAoc2lzciAmIFNJU1JfVFgxX0VPRikgeworCQkJd2hpbGUob2x5bXBpY19wcml2LT5vbHltcGljX3R4X3N0YXR1c19yaW5nWyhvbHltcGljX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXMgKyAxKSAmIChPTFlNUElDX1RYX1JJTkdfU0laRS0xKV0uc3RhdHVzKSB7IAorCQkJCW9seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1cysrOworCQkJCW9seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1cyAmPSAoT0xZTVBJQ19UWF9SSU5HX1NJWkUtMSk7CisJCQkJb2x5bXBpY19wcml2LT5mcmVlX3R4X3JpbmdfZW50cmllcysrOworCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY19zdGF0cy50eF9ieXRlcyArPSBvbHltcGljX3ByaXYtPnR4X3Jpbmdfc2tiW29seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10tPmxlbjsKKwkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfc3RhdHMudHhfcGFja2V0cysrIDsgCisJCQkJcGNpX3VubWFwX3NpbmdsZShvbHltcGljX3ByaXYtPnBkZXYsIAorCQkJCQlsZTMyX3RvX2NwdShvbHltcGljX3ByaXYtPm9seW1waWNfdHhfcmluZ1tvbHltcGljX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXNdLmJ1ZmZlciksIAorCQkJCQlvbHltcGljX3ByaXYtPnR4X3Jpbmdfc2tiW29seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10tPmxlbixQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShvbHltcGljX3ByaXYtPnR4X3Jpbmdfc2tiW29seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10pOworCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY190eF9yaW5nW29seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10uYnVmZmVyPTB4ZGVhZGJlZWY7CisJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX3R4X3N0YXR1c19yaW5nW29seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10uc3RhdHVzPTA7CisJCQl9CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0gLyogU0lTUl9UWDFfRU9GICovCisJCisJCWlmIChzaXNyICYgU0lTUl9SWF9TVEFUVVMpIHsKKwkJCW9seW1waWNfcngoZGV2KTsKKwkJfSAvKiBTSVNSX1JYX1NUQVRVUyAqLworCQorCQlpZiAoc2lzciAmIFNJU1JfQURBUFRFUl9DSEVDSykgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgQ2hlY2sgSW50ZXJydXB0IFJhaXNlZCwgOCBieXRlcyBvZiBpbmZvcm1hdGlvbiBmb2xsb3c6XG4iLCBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKG9seW1waWNfbW1pbytMQVBXV0MpLG9seW1waWNfbW1pbytMQVBBKTsKKwkJCWFkYXB0ZXJfY2hlY2tfYXJlYSA9IG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyAoKHJlYWRsKG9seW1waWNfbW1pbytMQVBXV0MpKSAmICh+MHhmODAwKSkgOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEJ5dGVzICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIixkZXYtPm5hbWUsIHJlYWRiKGFkYXB0ZXJfY2hlY2tfYXJlYSswKSwgcmVhZGIoYWRhcHRlcl9jaGVja19hcmVhKzEpLCByZWFkYihhZGFwdGVyX2NoZWNrX2FyZWErMiksIHJlYWRiKGFkYXB0ZXJfY2hlY2tfYXJlYSszKSwgcmVhZGIoYWRhcHRlcl9jaGVja19hcmVhKzQpLCByZWFkYihhZGFwdGVyX2NoZWNrX2FyZWErNSksIHJlYWRiKGFkYXB0ZXJfY2hlY2tfYXJlYSs2KSwgcmVhZGIoYWRhcHRlcl9jaGVja19hcmVhKzcpKSA7IAorCQkJc3Bpbl91bmxvY2soJm9seW1waWNfcHJpdi0+b2x5bXBpY19sb2NrKSA7IAorCQkJcmV0dXJuIElSUV9IQU5ETEVEOyAKKwkJfSAvKiBTSVNSX0FEQVBURVJfQ0hFQ0sgKi8KKwkKKwkJaWYgKHNpc3IgJiBTSVNSX0FTQl9GUkVFKSB7CisJCQkvKiBXYWtlIHVwIGFueXRoaW5nIHRoYXQgaXMgd2FpdGluZyBmb3IgdGhlIGFzYiByZXNwb25zZSAqLyAgCisJCQlpZiAob2x5bXBpY19wcml2LT5hc2JfcXVldWVkKSB7CisJCQkJb2x5bXBpY19hc2JfYmgoZGV2KSA7IAorCQkJfQorCQl9IC8qIFNJU1JfQVNCX0ZSRUUgKi8KKwkKKwkJaWYgKHNpc3IgJiBTSVNSX0FSQl9DTUQpIHsKKwkJCW9seW1waWNfYXJiX2NtZChkZXYpIDsgCisJCX0gLyogU0lTUl9BUkJfQ01EICovCisJCisJCWlmIChzaXNyICYgU0lTUl9UUkJfUkVQTFkpIHsKKwkJCS8qIFdha2UgdXAgYW55dGhpbmcgdGhhdCBpcyB3YWl0aW5nIGZvciB0aGUgdHJiIHJlc3BvbnNlICovCisJCQlpZiAob2x5bXBpY19wcml2LT50cmJfcXVldWVkKSB7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZvbHltcGljX3ByaXYtPnRyYl93YWl0KTsKKwkJCX0KKwkJCW9seW1waWNfcHJpdi0+dHJiX3F1ZXVlZCA9IDAgOyAKKwkJfSAvKiBTSVNSX1RSQl9SRVBMWSAqLwkKKwkKKwkJaWYgKHNpc3IgJiBTSVNSX1JYX05PQlVGKSB7CisJCQkvKiBBY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50YXRpb24sIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcsIGJ1dCB0cmFwcGluZyBpdCBrZWVwcyBpdCBvdXQgb2YKKyAgICAgICAgICAgICAgICAgIAkgICAJICAgL3Zhci9sb2cvbWVzc2FnZXMuICAqLworCQl9IC8qIFNJU1JfUlhfTk9CVUYgKi8KKwl9IGVsc2UgeyAKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuZXhwZWN0ZWQgaW50ZXJydXB0OiAleFxuIixkZXYtPm5hbWUsIHNpc3IpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU0lTUl9NQVNLOiAleFxuIixkZXYtPm5hbWUsIHJlYWRsKG9seW1waWNfbW1pbytTSVNSX01BU0spKSA7CisJfSAvKiBPbmUgaWYgdGhlIGludGVycnVwdHMgd2Ugd2FudCAqLworCXdyaXRlbChTSVNSX01JLG9seW1waWNfbW1pbytTSVNSX01BU0tfU1VNKTsKKwkKKwlzcGluX3VubG9jaygmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2spIDsgCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQkKKworc3RhdGljIGludCBvbHltcGljX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2PShzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKm9seW1waWNfbW1pbz1vbHltcGljX3ByaXYtPm9seW1waWNfbW1pbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzIDsgCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2ssIGZsYWdzKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlpZihvbHltcGljX3ByaXYtPmZyZWVfdHhfcmluZ19lbnRyaWVzKSB7CisJCW9seW1waWNfcHJpdi0+b2x5bXBpY190eF9yaW5nW29seW1waWNfcHJpdi0+dHhfcmluZ19mcmVlXS5idWZmZXIgPSAKKwkJCWNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKG9seW1waWNfcHJpdi0+cGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbixQQ0lfRE1BX1RPREVWSUNFKSk7CisJCW9seW1waWNfcHJpdi0+b2x5bXBpY190eF9yaW5nW29seW1waWNfcHJpdi0+dHhfcmluZ19mcmVlXS5zdGF0dXNfbGVuZ3RoID0gY3B1X3RvX2xlMzIoc2tiLT5sZW4gfCAoMHg4MDAwMDAwMCkpOworCQlvbHltcGljX3ByaXYtPnR4X3Jpbmdfc2tiW29seW1waWNfcHJpdi0+dHhfcmluZ19mcmVlXT1za2I7CisJCW9seW1waWNfcHJpdi0+ZnJlZV90eF9yaW5nX2VudHJpZXMtLTsKKworICAgICAgICAJb2x5bXBpY19wcml2LT50eF9yaW5nX2ZyZWUrKzsKKyAgICAgICAgCW9seW1waWNfcHJpdi0+dHhfcmluZ19mcmVlICY9IChPTFlNUElDX1RYX1JJTkdfU0laRS0xKTsKKwkJd3JpdGV3KCgoKHJlYWR3KG9seW1waWNfbW1pbytUWEVOUV8xKSkgJiAweDgwMDApIF4gMHg4MDAwKSB8IDEsb2x5bXBpY19tbWlvK1RYRU5RXzEpOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9seW1waWNfcHJpdi0+b2x5bXBpY19sb2NrLGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2ssZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9IAorCit9CisJCisKK3N0YXRpYyBpbnQgb2x5bXBpY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXY9KHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqb2x5bXBpY19tbWlvPW9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvLCpzcmI7CisJdW5zaWduZWQgbG9uZyB0LGZsYWdzOworCisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCxjdXJyZW50KSA7IAorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCXdyaXRlbChvbHltcGljX3ByaXYtPnNyYixvbHltcGljX21taW8rTEFQQSk7CisJc3JiPW9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyAob2x5bXBpY19wcml2LT5zcmIgJiAofjB4ZjgwMCkpOworCQorICAgIAl3cml0ZWIoU1JCX0NMT1NFX0FEQVBURVIsc3JiKzApOworCXdyaXRlYigwLHNyYisxKTsKKwl3cml0ZWIoT0xZTVBJQ19DTEVBUl9SRVRfQ09ERSxzcmIrMik7CisKKwlhZGRfd2FpdF9xdWV1ZSgmb2x5bXBpY19wcml2LT5zcmJfd2FpdCwmd2FpdCkgOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSkgOyAKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvbHltcGljX3ByaXYtPm9seW1waWNfbG9jayxmbGFncyk7CisJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTE7CisKKwl3cml0ZWwoTElTUl9TUkJfQ01ELG9seW1waWNfbW1pbytMSVNSX1NVTSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2ssZmxhZ3MpOworCisJd2hpbGUob2x5bXBpY19wcml2LT5zcmJfcXVldWVkKSB7CisKKwkJdCA9IHNjaGVkdWxlX3RpbWVvdXQoNjAqSFopOyAKKworICAgICAgICAJaWYoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCXsgICAgICAgICAgICAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTUkIgdGltZWQgb3V0LlxuIixkZXYtPm5hbWUpOworICAgICAgICAgICAgCQlwcmludGsoS0VSTl9XQVJOSU5HICJTSVNSPSV4IE1JU1I9JXhcbiIscmVhZGwob2x5bXBpY19tbWlvK1NJU1IpLHJlYWRsKG9seW1waWNfbW1pbytMSVNSKSk7CisgICAgICAgICAgICAJCW9seW1waWNfcHJpdi0+c3JiX3F1ZXVlZD0wOworICAgICAgICAgICAgCQlicmVhazsKKyAgICAgICAgCX0KKworCQlpZiAodCA9PSAwKSB7IAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNSQiB0aW1lZCBvdXQuIE1heSBub3QgYmUgZmF0YWwuIFxuIixkZXYtPm5hbWUpIDsgCisJCX0gCisJCW9seW1waWNfcHJpdi0+c3JiX3F1ZXVlZD0wOworICAgIAl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJm9seW1waWNfcHJpdi0+c3JiX3dhaXQsJndhaXQpIDsgCisKKwlvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkKys7CisJb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfbGFzdF9yZWNlaXZlZCY9T0xZTVBJQ19SWF9SSU5HX1NJWkUtMTsKKworCW9seW1waWNfZnJlZW1lbShkZXYpIDsgCQorCisJLyogcmVzZXQgdHgvcnggZmlmbydzIGFuZCBidXNtYXN0ZXIgbG9naWMgKi8KKworCXdyaXRlbChyZWFkbChvbHltcGljX21taW8rQkNUTCl8KDM8PDEzKSxvbHltcGljX21taW8rQkNUTCk7CisJdWRlbGF5KDEpOworCXdyaXRlbChyZWFkbChvbHltcGljX21taW8rQkNUTCkmfigzPDwxMyksb2x5bXBpY19tbWlvK0JDVEwpOworCisjaWYgT0xZTVBJQ19ERUJVRworCXsKKwlpbnQgaSA7IAorCXByaW50aygic3JiKCVwKTogIixzcmIpOworCWZvcihpPTA7aTw0O2krKykKKwkJcHJpbnRrKCIleCAiLHJlYWRiKHNyYitpKSk7CisJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorCWZyZWVfaXJxKGRldi0+aXJxLGRldik7CisKKwlyZXR1cm4gMDsKKwkKK30KKworc3RhdGljIHZvaWQgb2x5bXBpY19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXYgPSAoc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqKSBkZXYtPnByaXYgOyAKKyAgIAl1OCBfX2lvbWVtICpvbHltcGljX21taW8gPSBvbHltcGljX3ByaXYtPm9seW1waWNfbW1pbyA7IAorCXU4IG9wdGlvbnMgPSAwOyAKKwl1OCBfX2lvbWVtICpzcmI7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWkgOyAKKwl1bnNpZ25lZCBjaGFyIGRldl9tY19hZGRyZXNzWzRdIDsgCisJaW50IGkgOyAKKworCXdyaXRlbChvbHltcGljX3ByaXYtPnNyYixvbHltcGljX21taW8rTEFQQSk7CisJc3JiPW9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyAob2x5bXBpY19wcml2LT5zcmIgJiAofjB4ZjgwMCkpOworCW9wdGlvbnMgPSBvbHltcGljX3ByaXYtPm9seW1waWNfY29weV9hbGxfb3B0aW9uczsgCisKKwlpZiAoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykgIAorCQlvcHRpb25zIHw9IDB4NjEgOworCWVsc2UKKwkJb3B0aW9ucyAmPSB+MHg2MSA7IAorCisJLyogT25seSBpc3N1ZSB0aGUgc3JiIGlmIHRoZXJlIGlzIGEgY2hhbmdlIGluIG9wdGlvbnMgKi8KKworCWlmICgob3B0aW9ucyBeIG9seW1waWNfcHJpdi0+b2x5bXBpY19jb3B5X2FsbF9vcHRpb25zKSkgeyAKKwkKKwkJLyogTm93IHRvIGlzc3VlIHRoZSBzcmIgY29tbWFuZCB0byBhbHRlciB0aGUgY29weS5hbGwub3B0aW9ucyAqLworCQorCQl3cml0ZWIoU1JCX01PRElGWV9SRUNFSVZFX09QVElPTlMsc3JiKTsKKwkJd3JpdGViKDAsc3JiKzEpOworCQl3cml0ZWIoT0xZTVBJQ19DTEVBUl9SRVRfQ09ERSxzcmIrMik7CisJCXdyaXRlYigwLHNyYiszKTsKKwkJd3JpdGViKG9seW1waWNfcHJpdi0+b2x5bXBpY19yZWNlaXZlX29wdGlvbnMsc3JiKzQpOworCQl3cml0ZWIob3B0aW9ucyxzcmIrNSk7CisKKwkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTI7IC8qIENhbid0IHNsZWVwLCB1c2Ugc3JiX2JoICovCisKKwkJd3JpdGVsKExJU1JfU1JCX0NNRCxvbHltcGljX21taW8rTElTUl9TVU0pOworCisJCW9seW1waWNfcHJpdi0+b2x5bXBpY19jb3B5X2FsbF9vcHRpb25zID0gb3B0aW9ucyA7CisJCQorCQlyZXR1cm4gOyAgCisJfSAKKworCS8qIFNldCB0aGUgZnVuY3Rpb25hbCBhZGRyZXNzZXMgd2UgbmVlZCBmb3IgbXVsdGljYXN0ICovCisKKwlkZXZfbWNfYWRkcmVzc1swXSA9IGRldl9tY19hZGRyZXNzWzFdID0gZGV2X21jX2FkZHJlc3NbMl0gPSBkZXZfbWNfYWRkcmVzc1szXSA9IDAgOyAKKworCWZvciAoaT0wLGRtaT1kZXYtPm1jX2xpc3Q7aSA8IGRldi0+bWNfY291bnQ7IGkrKyxkbWkgPSBkbWktPm5leHQpIHsgCisJCWRldl9tY19hZGRyZXNzWzBdIHw9IGRtaS0+ZG1pX2FkZHJbMl0gOyAKKwkJZGV2X21jX2FkZHJlc3NbMV0gfD0gZG1pLT5kbWlfYWRkclszXSA7IAorCQlkZXZfbWNfYWRkcmVzc1syXSB8PSBkbWktPmRtaV9hZGRyWzRdIDsgCisJCWRldl9tY19hZGRyZXNzWzNdIHw9IGRtaS0+ZG1pX2FkZHJbNV0gOyAKKwl9CisKKwl3cml0ZWIoU1JCX1NFVF9GVU5DX0FERFJFU1Msc3JiKzApOworCXdyaXRlYigwLHNyYisxKTsKKwl3cml0ZWIoT0xZTVBJQ19DTEVBUl9SRVRfQ09ERSxzcmIrMik7CisJd3JpdGViKDAsc3JiKzMpOworCXdyaXRlYigwLHNyYis0KTsKKwl3cml0ZWIoMCxzcmIrNSk7CisJd3JpdGViKGRldl9tY19hZGRyZXNzWzBdLHNyYis2KTsKKwl3cml0ZWIoZGV2X21jX2FkZHJlc3NbMV0sc3JiKzcpOworCXdyaXRlYihkZXZfbWNfYWRkcmVzc1syXSxzcmIrOCk7CisJd3JpdGViKGRldl9tY19hZGRyZXNzWzNdLHNyYis5KTsKKworCW9seW1waWNfcHJpdi0+c3JiX3F1ZXVlZCA9IDIgOworCXdyaXRlbChMSVNSX1NSQl9DTUQsb2x5bXBpY19tbWlvK0xJU1JfU1VNKTsKKworfQorCitzdGF0aWMgdm9pZCBvbHltcGljX3NyYl9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sgCisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2ID0gKHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKikgZGV2LT5wcml2IDsgCisgICAJdTggX19pb21lbSAqb2x5bXBpY19tbWlvID0gb2x5bXBpY19wcml2LT5vbHltcGljX21taW8gOyAKKwl1OCBfX2lvbWVtICpzcmI7CisKKwl3cml0ZWwob2x5bXBpY19wcml2LT5zcmIsb2x5bXBpY19tbWlvK0xBUEEpOworCXNyYj1vbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgKG9seW1waWNfcHJpdi0+c3JiICYgKH4weGY4MDApKTsKKworCXN3aXRjaCAocmVhZGIoc3JiKSkgeyAKKworCQkvKiBTUkJfTU9ESUZZX1JFQ0VJVkVfT1BUSU9OUyBpLmUuIHNldF9tdWx0aWNhc3RfbGlzdCBvcHRpb25zIChwcm9taXNjdW91cykgCisgICAgICAgICAgICAgICAgICogQXQgc29tZSBwb2ludCB3ZSBzaG91bGQgZG8gc29tZXRoaW5nIGlmIHdlIGdldCBhbiBlcnJvciwgc3VjaCBhcworICAgICAgICAgICAgICAgICAqIHJlc2V0dGluZyB0aGUgSUZGX1BST01JU0MgZmxhZyBpbiBkZXYKKwkJICovCisKKwkJY2FzZSBTUkJfTU9ESUZZX1JFQ0VJVkVfT1BUSU9OUzoKKwkJCXN3aXRjaCAocmVhZGIoc3JiKzIpKSB7IAorCQkJCWNhc2UgMHgwMToKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZFxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgCisJCQkJY2FzZSAweDA0OgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG9wZW4gZm9yIHRoaXMgb3BlcmF0aW9uLCBkb2ghIVxuIixkZXYtPm5hbWUpOworCQkJCQlicmVhayA7IAorCQkJCWRlZmF1bHQ6CisJCQkJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkgCisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZSBPcHRpb25zIE1vZGlmaWVkIHRvICV4LCV4XG4iLGRldi0+bmFtZSxvbHltcGljX3ByaXYtPm9seW1waWNfY29weV9hbGxfb3B0aW9ucywgb2x5bXBpY19wcml2LT5vbHltcGljX3JlY2VpdmVfb3B0aW9ucykgOyAKKwkJCQkJYnJlYWsgOyAJCisJCQl9IC8qIHN3aXRjaCBzcmJbMl0gKi8gCisJCQlicmVhayA7CisJCQorCQkvKiBTUkJfU0VUX0dST1VQX0FERFJFU1MgLSBNdWx0aWNhc3QgZ3JvdXAgc2V0dGluZyAKKyAgICAgICAgICAgICAgICAgKi8KKworCQljYXNlIFNSQl9TRVRfR1JPVVBfQUREUkVTUzoKKwkJCXN3aXRjaCAocmVhZGIoc3JiKzIpKSB7IAorCQkJCWNhc2UgMHgwMDoKKwkJCQkJYnJlYWsgOyAKKwkJCQljYXNlIDB4MDE6CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGNvbW1hbmQgXG4iLGRldi0+bmFtZSkgOyAKKwkJCQkJYnJlYWsgOworCQkJCWNhc2UgMHgwNDoKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgbXVzdCBiZSBvcGVuIGZvciB0aGlzIG9wZXJhdGlvbiwgZG9oISFcbiIsZGV2LT5uYW1lKTsgCisJCQkJCWJyZWFrIDsKKwkJCQljYXNlIDB4M2M6CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBHcm91cC9GdW5jdGlvbmFsIGFkZHJlc3MgaW5kaWNhdG9yIGJpdHMgbm90IHNldCBjb3JyZWN0bHlcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7CisJCQkJY2FzZSAweDNlOiAvKiBJZiB3ZSBldmVyIGltcGxlbWVudCBpbmRpdmlkdWFsIG11bHRpY2FzdCBhZGRyZXNzZXMsIHdpbGwgbmVlZCB0byBkZWFsIHdpdGggdGhpcyAqLworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogR3JvdXAgYWRkcmVzcyByZWdpc3RlcnMgZnVsbFxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgIAorCQkJCWNhc2UgMHg1NToKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdyb3VwIEFkZHJlc3MgYWxyZWFkeSBzZXQuXG4iLGRldi0+bmFtZSkgOyAKKwkJCQkJYnJlYWsgOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrIDsgCisJCQl9IC8qIHN3aXRjaCBzcmJbMl0gKi8gCisJCQlicmVhayA7IAorCisJCS8qIFNSQl9SRVNFVF9HUk9VUF9BRERSRVNTIC0gUmVtb3ZlIGEgbXVsdGljYXN0IGFkZHJlc3MgZnJvbSBncm91cCBsaXN0CisgCQkgKi8KKworCQljYXNlIFNSQl9SRVNFVF9HUk9VUF9BRERSRVNTOgorCQkJc3dpdGNoIChyZWFkYihzcmIrMikpIHsgCisJCQkJY2FzZSAweDAwOgorCQkJCQlicmVhayA7IAorCQkJCWNhc2UgMHgwMToKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZCBcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7IAorCQkJCWNhc2UgMHgwNDoKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgbXVzdCBiZSBvcGVuIGZvciB0aGlzIG9wZXJhdGlvbiwgZG9oISFcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7IAorCQkJCWNhc2UgMHgzOTogLyogTXVzdCBkZWFsIHdpdGggdGhpcyBpZiBpbmRpdmlkdWFsIG11bHRpY2FzdCBhZGRyZXNzZXMgdXNlZCAqLworCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogR3JvdXAgYWRkcmVzcyBub3QgZm91bmQgXG4iLGRldi0+bmFtZSk7IAorCQkJCQlicmVhayA7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWsgOyAKKwkJCX0gLyogc3dpdGNoIHNyYlsyXSAqLworCQkJYnJlYWsgOyAKKworCQkKKwkJLyogU1JCX1NFVF9GVU5DX0FERFJFU1MgLSBDYWxsZWQgYnkgdGhlIHNldF9yeF9tb2RlIAorCQkgKi8KKworCQljYXNlIFNSQl9TRVRfRlVOQ19BRERSRVNTOgorCQkJc3dpdGNoIChyZWFkYihzcmIrMikpIHsgCisJCQkJY2FzZSAweDAwOgorCQkJCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpCisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogRnVuY3Rpb25hbCBBZGRyZXNzIE1hc2sgU2V0IFxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsKKwkJCQljYXNlIDB4MDE6CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGNvbW1hbmQgXG4iLGRldi0+bmFtZSkgOyAKKwkJCQkJYnJlYWsgOyAKKwkJCQljYXNlIDB4MDQ6CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIG11c3QgYmUgb3BlbiBmb3IgdGhpcyBvcGVyYXRpb24sIGRvaCEhXG4iLGRldi0+bmFtZSkgOyAKKwkJCQkJYnJlYWsgOyAKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhayA7IAorCQkJfSAvKiBzd2l0Y2ggc3JiWzJdICovCisJCQlicmVhayA7IAorCQorCQkvKiBTUkJfUkVBRF9MT0cgLSBSZWFkIGFuZCByZXNldCB0aGUgYWRhcHRlciBlcnJvciBjb3VudGVycworIAkJICovCisKKwkJY2FzZSBTUkJfUkVBRF9MT0c6CisJCQlzd2l0Y2ggKHJlYWRiKHNyYisyKSkgeyAKKwkJCQljYXNlIDB4MDA6IAorCQkJCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIAorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlYWQgTG9nIGlzc3VlZFxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgCisJCQkJY2FzZSAweDAxOgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5yZWNvZ25pemVkIHNyYiBjb21tYW5kIFxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgCisJCQkJY2FzZSAweDA0OgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG9wZW4gZm9yIHRoaXMgb3BlcmF0aW9uLCBkb2ghIVxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgCisJCQkKKwkJCX0gLyogc3dpdGNoIHNyYlsyXSAqLworCQkJYnJlYWsgOyAKKwkJCisJCS8qIFNSQl9SRUFEX1NSX0NPVU5URVJTIC0gUmVhZCBhbmQgcmVzZXQgdGhlIHNvdXJjZSByb3V0aW5nIGJyaWRnZSByZWxhdGVkIGNvdW50ZXJzICovCisKKwkJY2FzZSBTUkJfUkVBRF9TUl9DT1VOVEVSUzoKKwkJCXN3aXRjaCAocmVhZGIoc3JiKzIpKSB7IAorCQkJCWNhc2UgMHgwMDogCisJCQkJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkgCisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVhZCBTb3VyY2UgUm91dGluZyBDb3VudGVycyBpc3N1ZWRcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7IAorCQkJCWNhc2UgMHgwMToKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZCBcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7IAorCQkJCWNhc2UgMHgwNDoKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgbXVzdCBiZSBvcGVuIGZvciB0aGlzIG9wZXJhdGlvbiwgZG9oISFcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7IAorCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrIDsgCisJCQl9IC8qIHN3aXRjaCBzcmJbMl0gKi8KKwkJCWJyZWFrIDsKKyAKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGJoIHJldHVybiB2YWx1ZS5cbiIsZGV2LT5uYW1lKTsKKwkJCWJyZWFrIDsgCisJfSAvKiBzd2l0Y2ggc3JiWzBdICovCisKK30gCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIG9seW1waWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2IDsKKwlvbHltcGljX3ByaXY9KHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXJldHVybiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgJm9seW1waWNfcHJpdi0+b2x5bXBpY19zdGF0czsgCit9CisKK3N0YXRpYyBpbnQgb2x5bXBpY19zZXRfbWFjX2FkZHJlc3MgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpIAoreworCXN0cnVjdCBzb2NrYWRkciAqc2FkZHIgPSBhZGRyIDsgCisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2ID0gKHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKilkZXYtPnByaXYgOyAKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsgCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW5ub3Qgc2V0IG1hYy9sYWEgYWRkcmVzcyB3aGlsZSBjYXJkIGlzIG9wZW5cbiIsIGRldi0+bmFtZSkgOyAKKwkJcmV0dXJuIC1FSU8gOyAKKwl9CisKKwltZW1jcHkob2x5bXBpY19wcml2LT5vbHltcGljX2xhYSwgc2FkZHItPnNhX2RhdGEsZGV2LT5hZGRyX2xlbikgOyAKKwkKKwlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIHsgCisgCQlwcmludGsoS0VSTl9JTkZPICIlczogTUFDL0xBQSBTZXQgdG8gID0gJXguJXguJXguJXguJXguJXhcbiIsZGV2LT5uYW1lLCBvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzBdLAorCQlvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzFdLCBvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzJdLAorCQlvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzNdLCBvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzRdLAorCQlvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzVdKTsKKwl9IAorCisJcmV0dXJuIDAgOyAKK30KKworc3RhdGljIHZvaWQgb2x5bXBpY19hcmJfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2ID0gKHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXU4IF9faW9tZW0gKm9seW1waWNfbW1pbz1vbHltcGljX3ByaXYtPm9seW1waWNfbW1pbzsKKwl1OCBfX2lvbWVtICphcmJfYmxvY2ssICphc2JfYmxvY2ssICpzcmIgIDsgCisJdTggaGVhZGVyX2xlbiA7IAorCXUxNiBmcmFtZV9sZW4sIGJ1ZmZlcl9sZW4gOworCXN0cnVjdCBza19idWZmICptYWNfZnJhbWUgOyAgCisJdTggX19pb21lbSAqYnVmX3B0ciA7CisJdTggX19pb21lbSAqZnJhbWVfZGF0YSA7ICAKKwl1MTYgYnVmZl9vZmYgOyAKKwl1MTYgbGFuX3N0YXR1cyA9IDAsIGxhbl9zdGF0dXNfZGlmZiAgOyAvKiBJbml0aWFsaXplIHRvIHN0b3AgY29tcGlsZXIgd2FybmluZyAqLworCXU4IGZkeF9wcm90X2Vycm9yIDsgCisJdTE2IG5leHRfcHRyOworCisJYXJiX2Jsb2NrID0gKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyBvbHltcGljX3ByaXYtPmFyYikgOyAKKwlhc2JfYmxvY2sgPSAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIG9seW1waWNfcHJpdi0+YXNiKSA7IAorCXNyYiA9IChvbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgb2x5bXBpY19wcml2LT5zcmIpIDsgCisJCisJaWYgKHJlYWRiKGFyYl9ibG9jayswKSA9PSBBUkJfUkVDRUlWRV9EQVRBKSB7IC8qIFJlY2VpdmUuZGF0YSwgTUFDIGZyYW1lcyAqLworCisJCWhlYWRlcl9sZW4gPSByZWFkYihhcmJfYmxvY2srOCkgOyAvKiA4MDIuNSBUb2tlbi1SaW5nIEhlYWRlciBMZW5ndGggKi8JCisJCWZyYW1lX2xlbiA9IHN3YWIxNihyZWFkdyhhcmJfYmxvY2sgKyAxMCkpIDsgCisKKwkJYnVmZl9vZmYgPSBzd2FiMTYocmVhZHcoYXJiX2Jsb2NrICsgNikpIDsKKwkJCisJCWJ1Zl9wdHIgPSBvbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgYnVmZl9vZmYgOyAKKworI2lmIE9MWU1QSUNfREVCVUcKK3sKKwkJaW50IGk7CisJCWZyYW1lX2RhdGEgPSBidWZfcHRyK29mZnNldG9mKHN0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIsZnJhbWVfZGF0YSkgOyAKKworCQlmb3IgKGk9MCA7ICBpIDwgMTQgOyBpKyspIHsgCisJCQlwcmludGsoIkxvYyAlZCA9ICUwMnhcbiIsaSxyZWFkYihmcmFtZV9kYXRhICsgaSkpOyAKKwkJfQorCisJCXByaW50aygibmV4dCAlMDR4LCBmcyAlMDJ4LCBsZW4gJTA0eCBcbiIscmVhZHcoYnVmX3B0citvZmZzZXRvZihzdHJ1Y3QgbWFjX3JlY2VpdmVfYnVmZmVyLG5leHQpKSwgcmVhZGIoYnVmX3B0citvZmZzZXRvZihzdHJ1Y3QgbWFjX3JlY2VpdmVfYnVmZmVyLGZyYW1lX3N0YXR1cykpLCByZWFkdyhidWZfcHRyK29mZnNldG9mKHN0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIsYnVmZmVyX2xlbmd0aCkpKTsgCit9CisjZW5kaWYgCisJCW1hY19mcmFtZSA9IGRldl9hbGxvY19za2IoZnJhbWVfbGVuKSA7IAorCQlpZiAoIW1hY19mcmFtZSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBmcmFtZS5cbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIGRyb3BfZnJhbWU7CisJCX0KKworCQkvKiBXYWxrIHRoZSBidWZmZXIgY2hhaW4sIGNyZWF0aW5nIHRoZSBmcmFtZSAqLworCisJCWRvIHsKKwkJCWZyYW1lX2RhdGEgPSBidWZfcHRyK29mZnNldG9mKHN0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIsZnJhbWVfZGF0YSkgOyAKKwkJCWJ1ZmZlcl9sZW4gPSBzd2FiMTYocmVhZHcoYnVmX3B0citvZmZzZXRvZihzdHJ1Y3QgbWFjX3JlY2VpdmVfYnVmZmVyLGJ1ZmZlcl9sZW5ndGgpKSk7IAorCQkJbWVtY3B5X2Zyb21pbyhza2JfcHV0KG1hY19mcmFtZSwgYnVmZmVyX2xlbiksIGZyYW1lX2RhdGEgLCBidWZmZXJfbGVuICkgOworCQkJbmV4dF9wdHI9cmVhZHcoYnVmX3B0citvZmZzZXRvZihzdHJ1Y3QgbWFjX3JlY2VpdmVfYnVmZmVyLG5leHQpKTsgCisJCX0gd2hpbGUgKG5leHRfcHRyICYmIChidWZfcHRyPW9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyBudG9ocyhuZXh0X3B0cikpKTsKKworCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX25ldHdvcmtfbW9uaXRvcikgeyAKKwkJCXN0cnVjdCB0cmhfaGRyICptYWNfaGRyIDsgCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZWQgTUFDIEZyYW1lLCBkZXRhaWxzOiBcbiIsZGV2LT5uYW1lKSA7CisJCQltYWNfaGRyID0gKHN0cnVjdCB0cmhfaGRyICopbWFjX2ZyYW1lLT5kYXRhIDsgCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTUFDIEZyYW1lIERlc3QuIEFkZHI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwgZGV2LT5uYW1lICwgbWFjX2hkci0+ZGFkZHJbMF0sIG1hY19oZHItPmRhZGRyWzFdLCBtYWNfaGRyLT5kYWRkclsyXSwgbWFjX2hkci0+ZGFkZHJbM10sIG1hY19oZHItPmRhZGRyWzRdLCBtYWNfaGRyLT5kYWRkcls1XSkgOyAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNQUMgRnJhbWUgU3JjZS4gQWRkcjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLCBkZXYtPm5hbWUgLCBtYWNfaGRyLT5zYWRkclswXSwgbWFjX2hkci0+c2FkZHJbMV0sIG1hY19oZHItPnNhZGRyWzJdLCBtYWNfaGRyLT5zYWRkclszXSwgbWFjX2hkci0+c2FkZHJbNF0sIG1hY19oZHItPnNhZGRyWzVdKSA7IAorCQl9CisJCW1hY19mcmFtZS0+ZGV2ID0gZGV2IDsgCisJCW1hY19mcmFtZS0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKG1hY19mcmFtZSxkZXYpOworCQluZXRpZl9yeChtYWNfZnJhbWUpIDsgCQorCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCitkcm9wX2ZyYW1lOgorCQkvKiBOb3cgdGVsbCB0aGUgY2FyZCB3ZSBoYXZlIGRlYWx0IHdpdGggdGhlIHJlY2VpdmVkIGZyYW1lICovCisKKwkJLyogU2V0IExJU1IgQml0IDEgKi8KKwkJd3JpdGVsKExJU1JfQVJCX0ZSRUUsb2x5bXBpY19wcml2LT5vbHltcGljX21taW8gKyBMSVNSX1NVTSk7CisKKwkJLyogSXMgdGhlIEFTQiBmcmVlID8gKi8gCQorCQkKKwkJaWYgKHJlYWRiKGFzYl9ibG9jayArIDIpICE9IDB4ZmYpIHsgCisJCQlvbHltcGljX3ByaXYtPmFzYl9xdWV1ZWQgPSAxIDsgCisJCQl3cml0ZWwoTElTUl9BU0JfRlJFRV9SRVEsb2x5bXBpY19wcml2LT5vbHltcGljX21taW8rTElTUl9TVU0pOyAKKwkJCXJldHVybiA7IAkKKwkJCS8qIERyb3Agb3V0IGFuZCB3YWl0IGZvciB0aGUgYm90dG9tIGhhbGYgdG8gYmUgcnVuICovCisJCX0KKwkJCisJCXdyaXRlYihBU0JfUkVDRUlWRV9EQVRBLGFzYl9ibG9jayk7IC8qIFJlY2VpdmUgZGF0YSAqLworCQl3cml0ZWIoT0xZTVBJQ19DTEVBUl9SRVRfQ09ERSxhc2JfYmxvY2srMik7IC8qIE5lY2Vzc2FyeSA/PyAqLworCQl3cml0ZWIocmVhZGIoYXJiX2Jsb2NrKzYpLGFzYl9ibG9jays2KTsgLyogTXVzdCBzZW5kIHRoZSBhZGRyZXNzIGJhY2sgdG8gdGhlIGFkYXB0ZXIgKi8KKwkJd3JpdGViKHJlYWRiKGFyYl9ibG9jays3KSxhc2JfYmxvY2srNyk7IC8qIFRvIGxldCBpdCBrbm93IHdlIGhhdmUgZGVhbHQgd2l0aCB0aGUgZGF0YSAqLwkJCisKKwkJd3JpdGVsKExJU1JfQVNCX1JFUExZIHwgTElTUl9BU0JfRlJFRV9SRVEsb2x5bXBpY19wcml2LT5vbHltcGljX21taW8rTElTUl9TVU0pOworCQkKKwkJb2x5bXBpY19wcml2LT5hc2JfcXVldWVkID0gMiA7IAorCQorCQlyZXR1cm4gOyAJCisJCQorCX0gZWxzZSBpZiAocmVhZGIoYXJiX2Jsb2NrKSA9PSBBUkJfTEFOX0NIQU5HRV9TVEFUVVMpIHsgLyogTGFuLmNoYW5nZS5zdGF0dXMgKi8KKwkJbGFuX3N0YXR1cyA9IHN3YWIxNihyZWFkdyhhcmJfYmxvY2srNikpOworCQlmZHhfcHJvdF9lcnJvciA9IHJlYWRiKGFyYl9ibG9jays4KSA7IAorCQkKKwkJLyogSXNzdWUgQVJCIEZyZWUgKi8KKwkJd3JpdGVsKExJU1JfQVJCX0ZSRUUsb2x5bXBpY19wcml2LT5vbHltcGljX21taW8rTElTUl9TVU0pOworCisJCWxhbl9zdGF0dXNfZGlmZiA9IG9seW1waWNfcHJpdi0+b2x5bXBpY19sYW5fc3RhdHVzIF4gbGFuX3N0YXR1cyA7IAorCisJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiAoTFNDX0xXRiB8IExTQ19BUlcgfCBMU0NfRlBFIHwgTFNDX1JSKSApIHsgCisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0xXRikgCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTaG9ydCBjaXJjdWl0IGRldGVjdGVkIG9uIHRoZSBsb2JlXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0FSVykgCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBdXRvIHJlbW92YWwgZXJyb3JcbiIsZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfRlBFKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRkRYIFByb3RvY29sIEVycm9yXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1JSKSAKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZvcmNlIHJlbW92ZSBNQUMgZnJhbWUgcmVjZWl2ZWRcbiIsZGV2LT5uYW1lKTsKKwkJCisJCQkvKiBBZGFwdGVyIGhhcyBiZWVuIGNsb3NlZCBieSB0aGUgaGFyZHdhcmUgKi8KKwkJCisJCQkvKiByZXNldCB0eC9yeCBmaWZvJ3MgYW5kIGJ1c21hc3RlciBsb2dpYyAqLworCisJCQl3cml0ZWwocmVhZGwob2x5bXBpY19tbWlvK0JDVEwpfCgzPDwxMyksb2x5bXBpY19tbWlvK0JDVEwpOworCQkJdWRlbGF5KDEpOworCQkJd3JpdGVsKHJlYWRsKG9seW1waWNfbW1pbytCQ1RMKSZ+KDM8PDEzKSxvbHltcGljX21taW8rQkNUTCk7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQlvbHltcGljX3ByaXYtPnNyYiA9IHJlYWR3KG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyBMQVBXV08pIDsgCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBoYXMgYmVlbiBjbG9zZWQgXG4iLCBkZXYtPm5hbWUpIDsgCisJCX0gLyogSWYgc2VyaW91cyBlcnJvciAqLworCQkKKwkJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19tZXNzYWdlX2xldmVsKSB7IAorCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19TSUdfTE9TUykgCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyByZWNlaXZlIHNpZ25hbCBkZXRlY3RlZCBcbiIsIGRldi0+bmFtZSkgOyAKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfSEFSRF9FUlIpCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCZWFjb25pbmcgXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NPRlRfRVJSKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciB0cmFuc21pdHRlZCBTb2Z0IEVycm9yIFJlcG9ydCBNYWMgRnJhbWUgXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1RSQU5fQkNOKSAKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFdlIGFyZSB0cmFubWl0dGluZyB0aGUgYmVhY29uLCBhYWFoXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NTKSAKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNpbmdsZSBTdGF0aW9uIG9uIHRoZSByaW5nIFxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfUklOR19SRUMpCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSaW5nIHJlY292ZXJ5IG9uZ29pbmdcbiIsZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfRkRYX01PREUpCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPcGVyYXRpbmcgaW4gRkRYIG1vZGVcbiIsZGV2LT5uYW1lKTsKKwkJfSAJCisJCQorCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0NPKSB7IAorCQkJCQkKKwkJCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIAorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ291bnRlciBPdmVyZmxvdyBcbiIsIGRldi0+bmFtZSk7CisJCQkJCQorCQkJCS8qIElzc3VlIFJFQUQuTE9HIGNvbW1hbmQgKi8KKworCQkJCXdyaXRlYihTUkJfUkVBRF9MT0csIHNyYik7CisJCQkJd3JpdGViKDAsc3JiKzEpOworCQkJCXdyaXRlYihPTFlNUElDX0NMRUFSX1JFVF9DT0RFLHNyYisyKTsKKwkJCQl3cml0ZWIoMCxzcmIrMyk7CisJCQkJd3JpdGViKDAsc3JiKzQpOworCQkJCXdyaXRlYigwLHNyYis1KTsKKwkJCQkJCisJCQkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTI7IC8qIENhbid0IHNsZWVwLCB1c2Ugc3JiX2JoICovCisKKwkJCQl3cml0ZWwoTElTUl9TUkJfQ01ELG9seW1waWNfbW1pbytMSVNSX1NVTSk7CisJCQkJCQorCQl9CisKKwkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19TUl9DTykgeyAKKworCQkJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNvdXJjZSByb3V0aW5nIGNvdW50ZXJzIG92ZXJmbG93XG4iLCBkZXYtPm5hbWUpOworCisJCQkJLyogSXNzdWUgYSBSRUFELlNSLkNPVU5URVJTICovCisJCQkJCisJCQkJd3JpdGViKFNSQl9SRUFEX1NSX0NPVU5URVJTLHNyYik7CisJCQkJd3JpdGViKDAsc3JiKzEpOworCQkJCXdyaXRlYihPTFlNUElDX0NMRUFSX1JFVF9DT0RFLHNyYisyKTsKKwkJCQl3cml0ZWIoMCxzcmIrMyk7CisJCQkJCisJCQkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTI7IC8qIENhbid0IHNsZWVwLCB1c2Ugc3JiX2JoICovCisKKwkJCQl3cml0ZWwoTElTUl9TUkJfQ01ELG9seW1waWNfbW1pbytMSVNSX1NVTSk7CisKKwkJfQorCisJCW9seW1waWNfcHJpdi0+b2x5bXBpY19sYW5fc3RhdHVzID0gbGFuX3N0YXR1cyA7IAorCQorCX0gIC8qIExhbi5jaGFuZ2Uuc3RhdHVzICovCisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5rbm93biBhcmIgY29tbWFuZCBcbiIsIGRldi0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIG9seW1waWNfYXNiX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCXN0cnVjdCBvbHltcGljX3ByaXZhdGUgKm9seW1waWNfcHJpdiA9IChzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICopIGRldi0+cHJpdiA7IAorCXU4IF9faW9tZW0gKmFyYl9ibG9jaywgKmFzYl9ibG9jayA7IAorCisJYXJiX2Jsb2NrID0gKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyBvbHltcGljX3ByaXYtPmFyYikgOyAKKwlhc2JfYmxvY2sgPSAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIG9seW1waWNfcHJpdi0+YXNiKSA7IAorCisJaWYgKG9seW1waWNfcHJpdi0+YXNiX3F1ZXVlZCA9PSAxKSB7ICAgLyogRHJvcHBlZCB0aHJvdWdoIHRoZSBmaXJzdCB0aW1lICovCisKKwkJd3JpdGViKEFTQl9SRUNFSVZFX0RBVEEsYXNiX2Jsb2NrKTsgLyogUmVjZWl2ZSBkYXRhICovCisJCXdyaXRlYihPTFlNUElDX0NMRUFSX1JFVF9DT0RFLGFzYl9ibG9jaysyKTsgLyogTmVjZXNzYXJ5ID8/ICovCisJCXdyaXRlYihyZWFkYihhcmJfYmxvY2srNiksYXNiX2Jsb2NrKzYpOyAvKiBNdXN0IHNlbmQgdGhlIGFkZHJlc3MgYmFjayB0byB0aGUgYWRhcHRlciAqLworCQl3cml0ZWIocmVhZGIoYXJiX2Jsb2NrKzcpLGFzYl9ibG9jays3KTsgLyogVG8gbGV0IGl0IGtub3cgd2UgaGF2ZSBkZWFsdCB3aXRoIHRoZSBkYXRhICovCQkKKworCQl3cml0ZWwoTElTUl9BU0JfUkVQTFkgfCBMSVNSX0FTQl9GUkVFX1JFUSxvbHltcGljX3ByaXYtPm9seW1waWNfbW1pbytMSVNSX1NVTSk7CisJCW9seW1waWNfcHJpdi0+YXNiX3F1ZXVlZCA9IDIgOyAKKworCQlyZXR1cm4gOyAKKwl9CisKKwlpZiAob2x5bXBpY19wcml2LT5hc2JfcXVldWVkID09IDIpIHsgCisJCXN3aXRjaCAocmVhZGIoYXNiX2Jsb2NrKzIpKSB7CisJCQljYXNlIDB4MDE6CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBjb21tYW5kIGNvZGUgXG4iLCBkZXYtPm5hbWUpOworCQkJCWJyZWFrIDsKKwkJCWNhc2UgMHgyNjoKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5yZWNvZ25pemVkIGJ1ZmZlciBhZGRyZXNzIFxuIiwgZGV2LT5uYW1lKTsKKwkJCQlicmVhayA7CisJCQljYXNlIDB4RkY6CisJCQkJLyogVmFsaWQgcmVzcG9uc2UsIGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIG9rIGFnYWluICovCisJCQkJYnJlYWsgOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW52YWxpZCByZXR1cm4gY29kZSBpbiBhc2JcbiIsZGV2LT5uYW1lKTsKKwkJCQlicmVhayA7CisJCX0KKwl9CisJb2x5bXBpY19wcml2LT5hc2JfcXVldWVkID0gMCA7IAorfQorIAorc3RhdGljIGludCBvbHltcGljX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSkgCit7CisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2ID0gKHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXUxNiBtYXhfbXR1IDsgCisKKwlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX3Jpbmdfc3BlZWQgPT0gNCkKKwkJbWF4X210dSA9IDQ1MDAgOyAKKwllbHNlCisJCW1heF9tdHUgPSAxODAwMCA7IAorCQorCWlmIChtdHUgPiBtYXhfbXR1KQorCQlyZXR1cm4gLUVJTlZBTCA7IAorCWlmIChtdHUgPCAxMDApIAorCQlyZXR1cm4gLUVJTlZBTCA7IAorCisJZGV2LT5tdHUgPSBtdHUgOyAKKwlvbHltcGljX3ByaXYtPnBrdF9idWZfc3ogPSBtdHUgKyBUUl9ITEVOIDsgCisKKwlyZXR1cm4gMCA7IAorfQorCitzdGF0aWMgaW50IG9seW1waWNfcHJvY19pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhIDsgCisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2PShzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKm9hdCA9IChvbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgb2x5bXBpY19wcml2LT5vbHltcGljX2FkZHJfdGFibGVfYWRkcikgOyAKKwl1OCBfX2lvbWVtICpvcHQgPSAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIG9seW1waWNfcHJpdi0+b2x5bXBpY19wYXJtc19hZGRyKSA7IAorCWludCBzaXplID0gMCA7IAorCWludCBsZW49MDsKKwlvZmZfdCBiZWdpbj0wOworCW9mZl90IHBvcz0wOworCQorCXNpemUgPSBzcHJpbnRmKGJ1ZmZlciwgCisJCSJJQk0gUGl0L1BpdC1QaHkvT2x5bXBpYyBDaGlwc2V0IFRva2VuIFJpbmcgQWRhcHRlciAlc1xuIixkZXYtPm5hbWUpOworCXNpemUgKz0gc3ByaW50ZihidWZmZXIrc2l6ZSwgIlxuJTZzOiBBZGFwdGVyIEFkZHJlc3MgICA6IE5vZGUgQWRkcmVzcyAgICAgIDogRnVuY3Rpb25hbCBBZGRyXG4iLAorIAkgICBkZXYtPm5hbWUpOyAKKworCXNpemUgKz0gc3ByaW50ZihidWZmZXIrc2l6ZSwgIiU2czogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCA6ICUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgZGV2LT5uYW1lLAorICAgICAgICAgICBkZXYtPmRldl9hZGRyWzBdLAorCSAgIGRldi0+ZGV2X2FkZHJbMV0sCisJICAgZGV2LT5kZXZfYWRkclsyXSwKKyAJICAgZGV2LT5kZXZfYWRkclszXSwKKwkgICBkZXYtPmRldl9hZGRyWzRdLAorCSAgIGRldi0+ZGV2X2FkZHJbNV0sCisJICAgcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxub2RlX2FkZHIpKSwgCisJICAgcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxub2RlX2FkZHIpKzEpLAorCSAgIHJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsbm9kZV9hZGRyKSsyKSwKKwkgICByZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikrMyksCisJICAgcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxub2RlX2FkZHIpKzQpLAorCSAgIHJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsbm9kZV9hZGRyKSs1KSwKKwkgICByZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLGZ1bmNfYWRkcikpLCAKKwkgICByZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLGZ1bmNfYWRkcikrMSksCisJICAgcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxmdW5jX2FkZHIpKzIpLAorCSAgIHJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsZnVuY19hZGRyKSszKSk7CisJIAorCXNpemUgKz0gc3ByaW50ZihidWZmZXIrc2l6ZSwgIlxuJTZzOiBUb2tlbiBSaW5nIFBhcmFtZXRlcnMgVGFibGU6XG4iLCBkZXYtPm5hbWUpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlcitzaXplLCAiJTZzOiBQaHlzaWNhbCBBZGRyIDogVXAgTm9kZSBBZGRyZXNzICAgOiBQb2xsIEFkZHJlc3MgICAgICA6IEFjY1ByaSA6IEF1dGggU3JjIDogQXR0IENvZGUgOlxuIiwKKwkgIGRldi0+bmFtZSkgOyAKKwkgICAKKwlzaXplICs9IHNwcmludGYoYnVmZmVyK3NpemUsICIlNnM6ICUwMng6JTAyeDolMDJ4OiUwMnggICA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IDogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggOiAlMDR4ICAgOiAlMDR4ICAgICA6ICAlMDR4ICAgIDpcbiIsCisJICBkZXYtPm5hbWUsCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgcGh5c19hZGRyKSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgcGh5c19hZGRyKSsxKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBwaHlzX2FkZHIpKzIpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHBoeXNfYWRkcikrMyksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgdXBfbm9kZV9hZGRyKSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgdXBfbm9kZV9hZGRyKSsxKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCB1cF9ub2RlX2FkZHIpKzIpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHVwX25vZGVfYWRkcikrMyksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgdXBfbm9kZV9hZGRyKSs0KSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCB1cF9ub2RlX2FkZHIpKzUpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHBvbGxfYWRkcikpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHBvbGxfYWRkcikrMSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgcG9sbF9hZGRyKSsyKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBwb2xsX2FkZHIpKzMpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHBvbGxfYWRkcikrNCksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgcG9sbF9hZGRyKSs1KSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYWNjX3ByaW9yaXR5KSkpLAorCSAgc3dhYjE2KHJlYWR3KG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBhdXRoX3NvdXJjZV9jbGFzcykpKSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYXR0X2NvZGUpKSkpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlcitzaXplLCAiJTZzOiBTb3VyY2UgQWRkcmVzcyAgICA6IEJjbiBUIDogTWFqLiBWIDogTGFuIFN0IDogTGNsIFJnIDogTW9uIEVyciA6IEZyYW1lIENvcnJlbCA6IFxuIiwKKwkgIGRldi0+bmFtZSkgOyAKKwkKKwlzaXplICs9IHNwcmludGYoYnVmZmVyK3NpemUsICIlNnM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IDogJTA0eCAgOiAlMDR4ICAgOiAlMDR4ICAgOiAlMDR4ICAgOiAlMDR4ICAgIDogICAgICUwNHggICAgIDogXG4iLAorCSAgZGV2LT5uYW1lLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHNvdXJjZV9hZGRyKSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgc291cmNlX2FkZHIpKzEpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHNvdXJjZV9hZGRyKSsyKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBzb3VyY2VfYWRkcikrMyksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgc291cmNlX2FkZHIpKzQpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHNvdXJjZV9hZGRyKSs1KSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX3R5cGUpKSksCisJICBzd2FiMTYocmVhZHcob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIG1ham9yX3ZlY3RvcikpKSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgbGFuX3N0YXR1cykpKSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgbG9jYWxfcmluZykpKSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgbW9uX2Vycm9yKSkpLAorCSAgc3dhYjE2KHJlYWR3KG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBmcmFtZV9jb3JyZWwpKSkpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlcitzaXplLCAiJTZzOiBCZWFjb24gRGV0YWlscyA6ICBUeCAgOiAgUnggIDogTkFVTiBOb2RlIEFkZHJlc3MgOiBOQVVOIE5vZGUgUGh5cyA6IFxuIiwKKwkgIGRldi0+bmFtZSkgOyAKKworCXNpemUgKz0gc3ByaW50ZihidWZmZXIrc2l6ZSwgIiU2czogICAgICAgICAgICAgICAgOiAgJTAyeCAgOiAgJTAyeCAgOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCA6ICUwMng6JTAyeDolMDJ4OiUwMnggICAgOiBcbiIsCisJICBkZXYtPm5hbWUsCisJICBzd2FiMTYocmVhZHcob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIGJlYWNvbl90cmFuc21pdCkpKSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX3JlY2VpdmUpKSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX25hdW4pKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBiZWFjb25fbmF1bikrMSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX25hdW4pKzIpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIGJlYWNvbl9uYXVuKSszKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBiZWFjb25fbmF1bikrNCksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX25hdW4pKzUpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIGJlYWNvbl9waHlzKSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX3BoeXMpKzEpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIGJlYWNvbl9waHlzKSsyKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBiZWFjb25fcGh5cykrMykpOworCisJbGVuPXNpemU7CisJcG9zPWJlZ2luK3NpemU7CisJaWYgKHBvczxvZmZzZXQpIHsKKwkJbGVuPTA7CisJCWJlZ2luPXBvczsKKwl9CisJKnN0YXJ0PWJ1ZmZlcisob2Zmc2V0LWJlZ2luKTsJLyogU3RhcnQgb2Ygd2FudGVkIGRhdGEgKi8KKwlsZW4tPShvZmZzZXQtYmVnaW4pOwkJLyogU3RhcnQgc2xvcCAqLworCWlmKGxlbj5sZW5ndGgpCisJCWxlbj1sZW5ndGg7CQkvKiBFbmRpbmcgc2xvcCAqLworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBvbHltcGljX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpIAoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldikgOyAKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXY9KHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKilkZXYtPnByaXY7CisKKwlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX25ldHdvcmtfbW9uaXRvcikgeyAKKwkJY2hhciBwcm9jX25hbWVbMjBdIDsgCisJCXN0cmNweShwcm9jX25hbWUsIm5ldC9vbHltcGljXyIpIDsgCisJCXN0cmNhdChwcm9jX25hbWUsZGV2LT5uYW1lKSA7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHByb2NfbmFtZSxOVUxMKTsgCisJfQorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldikgOyAKKwlpb3VubWFwKG9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvKSA7IAorCWlvdW5tYXAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCkgOyAKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpIDsKKwlwY2lfc2V0X2RydmRhdGEocGRldixOVUxMKSA7ICAJCisJZnJlZV9uZXRkZXYoZGV2KSA7IAorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgb2x5bXBpY19kcml2ZXIgPSB7IAorCS5uYW1lCQk9ICJvbHltcGljIiwKKwkuaWRfdGFibGUJPSBvbHltcGljX3BjaV90YmwsCisJLnByb2JlCQk9IG9seW1waWNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvbHltcGljX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgb2x5bXBpY19wY2lfaW5pdCh2b2lkKSAKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0ICgmb2x5bXBpY19kcml2ZXIpIDsgCit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbHltcGljX3BjaV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZvbHltcGljX2RyaXZlcikgOyAKK30JCisKKworbW9kdWxlX2luaXQob2x5bXBpY19wY2lfaW5pdCkgOyAKK21vZHVsZV9leGl0KG9seW1waWNfcGNpX2NsZWFudXApIDsgCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9vbHltcGljLmggYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYzU5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5oCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogIG9seW1waWMuaCAoYykgMTk5OSBQZXRlciBEZSBTY2hyaWp2ZXIgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICAgICAgICAgICAgICAgMTk5OSwyMDAwIE1pa2UgUGhpbGxpcHMgKG1pa2VwQGxpbnV4dHIubmV0KQorICoKKyAqICBMaW51eCBkcml2ZXIgZm9yIElCTSBQQ0kgdG9rZW5yaW5nIGNhcmRzIGJhc2VkIG9uIHRoZSBvbHltcGljIGFuZCB0aGUgUElUL1BIWSBjaGlwc2V0LgorICoKKyAqICBCYXNlIERyaXZlciBTa2VsZXRvbjoKKyAqICAgICAgV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiAgICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisgKgorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICovCisKKyNkZWZpbmUgQ0lEIDB4NGUKKworI2RlZmluZSBCQ1RMIDB4NzAKKyNkZWZpbmUgQkNUTF9TT0ZUUkVTRVQgKDE8PDE1KQorI2RlZmluZSBCQ1RMX01JTVJFQiAoMTw8NikKKyNkZWZpbmUgQkNUTF9NT0RFX0lORElDQVRPUiAoMTw8NSkKKworI2RlZmluZSBHUFIgMHg0YQorI2RlZmluZSBHUFJfT1BUSV9CRiAoMTw8NikKKyNkZWZpbmUgR1BSX05FUFRVTkVfQkYgKDE8PDQpIAorI2RlZmluZSBHUFJfQVVUT1NFTlNFICgxPDwyKQorI2RlZmluZSBHUFJfMTZNQlBTICgxPDwzKSAKKworI2RlZmluZSBQQUcgMHg4NQorI2RlZmluZSBMQkMgMHg4ZQorCisjZGVmaW5lIExJU1IgMHgxMAorI2RlZmluZSBMSVNSX1NVTSAweDE0CisjZGVmaW5lIExJU1JfUldNIDB4MTgKKworI2RlZmluZSBMSVNSX0xJRSAoMTw8MTUpCisjZGVmaW5lIExJU1JfU0xJTSAoMTw8MTMpCisjZGVmaW5lIExJU1JfU0xJICgxPDwxMikKKyNkZWZpbmUgTElTUl9QQ01TUk1BU0sgKDE8PDExKQorI2RlZmluZSBMSVNSX1BDTVNSSU5UICgxPDwxMCkKKyNkZWZpbmUgTElTUl9XT0xNQVNLICgxPDw5KQorI2RlZmluZSBMSVNSX1dPTCAoMTw8OCkKKyNkZWZpbmUgTElTUl9TUkJfQ01EICgxPDw1KQorI2RlZmluZSBMSVNSX0FTQl9SRVBMWSAoMTw8NCkKKyNkZWZpbmUgTElTUl9BU0JfRlJFRV9SRVEgKDE8PDIpCisjZGVmaW5lIExJU1JfQVJCX0ZSRUUgKDE8PDEpCisjZGVmaW5lIExJU1JfVFJCX0ZSQU1FICgxPDwwKQorCisjZGVmaW5lIFNJU1IgMHgyMAorI2RlZmluZSBTSVNSX1NVTSAweDI0CisjZGVmaW5lIFNJU1JfUldNIDB4MjgKKyNkZWZpbmUgU0lTUl9SUiAweDJDCisjZGVmaW5lIFNJU1JfUkVTTUFTSyAweDMwCisjZGVmaW5lIFNJU1JfTUFTSyAweDU0CisjZGVmaW5lIFNJU1JfTUFTS19TVU0gMHg1OAorI2RlZmluZSBTSVNSX01BU0tfUldNIDB4NUMKKworI2RlZmluZSBTSVNSX1RYMl9JRExFICgxPDwzMSkKKyNkZWZpbmUgU0lTUl9UWDJfSEFMVCAoMTw8MjkpCisjZGVmaW5lIFNJU1JfVFgyX0VPRiAoMTw8MjgpCisjZGVmaW5lIFNJU1JfVFgxX0lETEUgKDE8PDI3KQorI2RlZmluZSBTSVNSX1RYMV9IQUxUICgxPDwyNSkKKyNkZWZpbmUgU0lTUl9UWDFfRU9GICgxPDwyNCkKKyNkZWZpbmUgU0lTUl9USU1FT1VUICgxPDwyMykKKyNkZWZpbmUgU0lTUl9SWF9OT0JVRiAoMTw8MjIpCisjZGVmaW5lIFNJU1JfUlhfU1RBVFVTICgxPDwyMSkKKyNkZWZpbmUgU0lTUl9SWF9IQUxUICgxPDwxOCkKKyNkZWZpbmUgU0lTUl9SWF9FT0ZfRUFSTFkgKDE8PDE2KQorI2RlZmluZSBTSVNSX01JICgxPDwxNSkKKyNkZWZpbmUgU0lTUl9QSSAoMTw8MTMpCisjZGVmaW5lIFNJU1JfRVJSICgxPDw5KQorI2RlZmluZSBTSVNSX0FEQVBURVJfQ0hFQ0sgKDE8PDYpCisjZGVmaW5lIFNJU1JfU1JCX1JFUExZICgxPDw1KQorI2RlZmluZSBTSVNSX0FTQl9GUkVFICgxPDw0KQorI2RlZmluZSBTSVNSX0FSQl9DTUQgKDE8PDMpCisjZGVmaW5lIFNJU1JfVFJCX1JFUExZICgxPDwyKQorCisjZGVmaW5lIEVJU1IgMHgzNAorI2RlZmluZSBFSVNSX1JXTSAweDM4CisjZGVmaW5lIEVJU1JfTUFTSyAweDNjCisjZGVmaW5lIEVJU1JfTUFTS19PUFRJT05TIDB4MDAxRkZGN0YKKworI2RlZmluZSBMQVBBIDB4NjAKKyNkZWZpbmUgTEFQV1dPIDB4NjQKKyNkZWZpbmUgTEFQV1dDIDB4NjgKKyNkZWZpbmUgTEFQQ1RMIDB4NkMKKyNkZWZpbmUgTEFJUEQgMHg3OAorI2RlZmluZSBMQUlQRERJTkMgMHg3QworCisjZGVmaW5lIFRJTUVSIDB4NTAKKworI2RlZmluZSBDTEtDVEwgMHg3NAorI2RlZmluZSBDTEtDVExfUEFVU0UgKDE8PDE1KSAKKworI2RlZmluZSBQTV9DT04gMHg0CisKKyNkZWZpbmUgQk1DVExfU1VNIDB4NDAKKyNkZWZpbmUgQk1DVExfUldNIDB4NDQKKyNkZWZpbmUgQk1DVExfVFgyX0RJUyAoMTw8MzApIAorI2RlZmluZSBCTUNUTF9UWDFfRElTICgxPDwyNikgCisjZGVmaW5lIEJNQ1RMX1JYX0RJUyAoMTw8MjIpIAorCisjZGVmaW5lIEJNQVNSIDB4Y2MKKworI2RlZmluZSBSWERFU0NRIDB4OTAKKyNkZWZpbmUgUlhERVNDUUNOVCAweDk0CisjZGVmaW5lIFJYQ0RBIDB4OTgKKyNkZWZpbmUgUlhFTlEgMHg5QworI2RlZmluZSBSWFNUQVRRIDB4QTAKKyNkZWZpbmUgUlhTVEFUUUNOVCAweEE0CisjZGVmaW5lIFJYQ1NBIDB4QTgKKyNkZWZpbmUgUlhDTEVOIDB4QUMKKyNkZWZpbmUgUlhITEVOIDB4QUUKKworI2RlZmluZSBUWERFU0NRXzEgMHhiMAorI2RlZmluZSBUWERFU0NRXzIgMHhkMAorI2RlZmluZSBUWERFU0NRQ05UXzEgMHhiNAorI2RlZmluZSBUWERFU0NRQ05UXzIgMHhkNAorI2RlZmluZSBUWENEQV8xIDB4YjgKKyNkZWZpbmUgVFhDREFfMiAweGQ4CisjZGVmaW5lIFRYRU5RXzEgMHhiYworI2RlZmluZSBUWEVOUV8yIDB4ZGMKKyNkZWZpbmUgVFhTVEFUUV8xIDB4YzAKKyNkZWZpbmUgVFhTVEFUUV8yIDB4ZTAKKyNkZWZpbmUgVFhTVEFUUUNOVF8xIDB4YzQKKyNkZWZpbmUgVFhTVEFUUUNOVF8yIDB4ZTQKKyNkZWZpbmUgVFhDU0FfMSAweGM4CisjZGVmaW5lIFRYQ1NBXzIgMHhlOAorLyogQ2FyZGJ1cyAqLworI2RlZmluZSBGRVJNQVNLIDB4ZjQKKyNkZWZpbmUgRkVSTUFTS19JTlRfQklUICgxPDwxNSkKKworI2RlZmluZSBPTFlNUElDX0lPX1NQQUNFIDI1NgorCisjZGVmaW5lIFNSQl9DT01NQU5EX1NJWkUgNTAKKworI2RlZmluZSBPTFlNUElDX01BWF9BREFQVEVSUyA4IC8qIDB4MDggX19NT0RVTEVfU1RSSU5HIGNhbid0IGhhbmQgMHhubiAqLworCisvKiBEZWZpbmVzIGZvciBMQU4gU1RBVFVTIENIQU5HRSByZXBvcnRzICovCisjZGVmaW5lIExTQ19TSUdfTE9TUyAweDgwMDAKKyNkZWZpbmUgTFNDX0hBUkRfRVJSIDB4NDAwMAorI2RlZmluZSBMU0NfU09GVF9FUlIgMHgyMDAwCisjZGVmaW5lIExTQ19UUkFOX0JDTiAweDEwMDAKKyNkZWZpbmUgTFNDX0xXRiAgICAgIDB4MDgwMAorI2RlZmluZSBMU0NfQVJXICAgICAgMHgwNDAwCisjZGVmaW5lIExTQ19GUEUgICAgICAweDAyMDAKKyNkZWZpbmUgTFNDX1JSICAgICAgIDB4MDEwMAorI2RlZmluZSBMU0NfQ08gICAgICAgMHgwMDgwCisjZGVmaW5lIExTQ19TUyAgICAgICAweDAwNDAKKyNkZWZpbmUgTFNDX1JJTkdfUkVDIDB4MDAyMAorI2RlZmluZSBMU0NfU1JfQ08gICAgMHgwMDEwCisjZGVmaW5lIExTQ19GRFhfTU9ERSAweDAwMDQKKworLyogRGVmaW5lcyBmb3IgT1BFTiBBREFQVEVSIGNvbW1hbmQgKi8KKworI2RlZmluZSBPUEVOX0FEQVBURVJfRVhUX1dSQVAgKDE8PDE1KQorI2RlZmluZSBPUEVOX0FEQVBURVJfRElTX0hBUkRFRSAoMTw8MTQpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9ESVNfU09GVEVSUiAoMTw8MTMpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9QQVNTX0FEQ19NQUMgKDE8PDEyKQorI2RlZmluZSBPUEVOX0FEQVBURVJfUEFTU19BVFRfTUFDICgxPDwxMSkKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0VOQUJMRV9FQyAoMTw8MTApCisjZGVmaW5lIE9QRU5fQURBUFRFUl9DT05URU5ERVIgKDE8PDgpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9QQVNTX0JFQUNPTiAoMTw8NykKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0VOQUJMRV9GRFggKDE8PDYpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9FTkFCTEVfUlBMICgxPDw1KQorI2RlZmluZSBPUEVOX0FEQVBURVJfSU5ISUJJVF9FVFIgKDE8PDQpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9JTlRFUk5BTF9XUkFQICgxPDwzKQorI2RlZmluZSBPUEVOX0FEQVBURVJfVVNFX09QVFMyICgxPDwwKQorCisjZGVmaW5lIE9QRU5fQURBUFRFUl8yX0VOQUJMRV9PTk5PVyAoMTw8MTUpCisKKy8qIERlZmluZXMgZm9yIFNSQiBDb21tYW5kcyAqLworCisjZGVmaW5lIFNSQl9BQ0NFU1NfUkVHSVNURVIgMHgxZgorI2RlZmluZSBTUkJfQ0xPU0VfQURBUFRFUiAweDA0CisjZGVmaW5lIFNSQl9DT05GSUdVUkVfQlJJREdFIDB4MGMKKyNkZWZpbmUgU1JCX0NPTkZJR1VSRV9XQUtFVVBfRVZFTlQgMHgxYQorI2RlZmluZSBTUkJfTU9ESUZZX0JSSURHRV9QQVJNUyAweDE1CisjZGVmaW5lIFNSQl9NT0RJRllfT1BFTl9PUFRJT05TIDB4MDEKKyNkZWZpbmUgU1JCX01PRElGWV9SRUNFSVZFX09QVElPTlMgMHgxNworI2RlZmluZSBTUkJfTk9fT1BFUkFUSU9OIDB4MDAKKyNkZWZpbmUgU1JCX09QRU5fQURBUFRFUiAweDAzCisjZGVmaW5lIFNSQl9SRUFEX0xPRyAweDA4CisjZGVmaW5lIFNSQl9SRUFEX1NSX0NPVU5URVJTIDB4MTYKKyNkZWZpbmUgU1JCX1JFU0VUX0dST1VQX0FERFJFU1MgMHgwMgorI2RlZmluZSBTUkJfU0FWRV9DT05GSUdVUkFUSU9OIDB4MWIKKyNkZWZpbmUgU1JCX1NFVF9CUklER0VfUEFSTVMgMHgwOQorI2RlZmluZSBTUkJfU0VUX0JSSURHRV9UQVJHRVRTIDB4MTAKKyNkZWZpbmUgU1JCX1NFVF9GVU5DX0FERFJFU1MgMHgwNworI2RlZmluZSBTUkJfU0VUX0dST1VQX0FERFJFU1MgMHgwNgorI2RlZmluZSBTUkJfU0VUX0dST1VQX0FERFJfT1BUSU9OUyAweDExCisjZGVmaW5lIFNSQl9VUERBVEVfV0FLRVVQX1BBVFRFUk4gMHgxOQorCisvKiBDbGVhciByZXR1cm4gY29kZSAqLworCisjZGVmaW5lIE9MWU1QSUNfQ0xFQVJfUkVUX0NPREUgMHhmZSAKKworLyogQVJCIENvbW1hbmRzICovCisjZGVmaW5lIEFSQl9SRUNFSVZFX0RBVEEgMHg4MQorI2RlZmluZSBBUkJfTEFOX0NIQU5HRV9TVEFUVVMgMHg4NAorLyogQVNCIFJlc3BvbnNlIGNvbW1hbmRzICovCisKKyNkZWZpbmUgQVNCX1JFQ0VJVkVfREFUQSAweDgxCisKKworLyogT2x5bXBpYyBkZWZhdWx0cyBmb3IgYnVmZmVycyAqLworIAorI2RlZmluZSBPTFlNUElDX1JYX1JJTkdfU0laRSAxNiAvKiBzaG91bGQgYmUgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIE9MWU1QSUNfVFhfUklOR19TSVpFIDggLyogc2hvdWxkIGJlIGEgcG93ZXIgb2YgMiAqLworCisjZGVmaW5lIFBLVF9CVUZfU1ogNDA5NiAvKiBEZWZhdWx0IHBhY2tldCBzaXplICovCisKKy8qIE9seW1waWMgZGF0YSBzdHJ1Y3R1cmVzICovCisKKy8qIHh4eHggVGhlc2Ugc3RydWN0dXJlcyBhcmUgYWxsIGxpdHRsZSBlbmRpYW4gaW4gaGFyZHdhcmUuICovCisKK3N0cnVjdCBvbHltcGljX3R4X2Rlc2MgeworCXUzMiBidWZmZXI7CisJdTMyIHN0YXR1c19sZW5ndGg7Cit9OworCitzdHJ1Y3Qgb2x5bXBpY190eF9zdGF0dXMgeworCXUzMiBzdGF0dXM7Cit9OworCitzdHJ1Y3Qgb2x5bXBpY19yeF9kZXNjIHsKKwl1MzIgYnVmZmVyOworCXUzMiByZXNfbGVuZ3RoOyAKK307CisKK3N0cnVjdCBvbHltcGljX3J4X3N0YXR1cyB7CisJdTMyIGZyYWdtZW50Y250X2ZyYW1lbGVuOworCXUzMiBzdGF0dXNfYnVmZmVyY250OworfTsKKy8qIHh4eHggRU5EIFRoZXNlIHN0cnVjdHVyZXMgYXJlIGFsbCBsaXR0bGUgZW5kaWFuIGluIGhhcmR3YXJlLiAqLworLyogeHh4eCBUaGVyZSBtYXkgYmUgbW9yZSwgYnV0IEknbSBwcmV0dHkgc3VyZSBhYm91dCB0aGVzZSAqLworCitzdHJ1Y3QgbWFjX3JlY2VpdmVfYnVmZmVyIHsKKwl1MTYgbmV4dCA7IAorCXU4IHBhZGRpbmcgOyAKKwl1OCBmcmFtZV9zdGF0dXMgOworCXUxNiBidWZmZXJfbGVuZ3RoIDsgCisJdTggZnJhbWVfZGF0YSA7IAorfTsKKworc3RydWN0IG9seW1waWNfcHJpdmF0ZSB7CisJCisJdTE2IHNyYjsgICAgICAvKiBiZTE2ICovCisJdTE2IHRyYjsgICAgICAvKiBiZTE2ICovCisJdTE2IGFyYjsgICAgICAvKiBiZTE2ICovCisJdTE2IGFzYjsgICAgICAvKiBiZTE2ICovCisKKwl1OCBfX2lvbWVtICpvbHltcGljX21taW87CisJdTggX19pb21lbSAqb2x5bXBpY19sYXA7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgOyAKKwljaGFyICpvbHltcGljX2NhcmRfbmFtZSA7IAorCisJc3BpbmxvY2tfdCBvbHltcGljX2xvY2sgOyAKKworCXZvbGF0aWxlIGludCBzcmJfcXVldWVkOyAgICAvKiBUcnVlIGlmIGFuIFNSQiBpcyBzdGlsbCBwb3N0ZWQgKi8JCisJd2FpdF9xdWV1ZV9oZWFkX3Qgc3JiX3dhaXQ7CisKKwl2b2xhdGlsZSBpbnQgYXNiX3F1ZXVlZDsgICAgLyogVHJ1ZSBpZiBhbiBBU0IgaXMgcG9zdGVkICovCisKKwl2b2xhdGlsZSBpbnQgdHJiX3F1ZXVlZDsgICAvKiBUcnVlIGlmIGEgVFJCIGlzIHBvc3RlZCAqLworCXdhaXRfcXVldWVfaGVhZF90IHRyYl93YWl0IDsgCisKKwkvKiBUaGVzZSBtdXN0IGJlIG9uIGEgNCBieXRlIGJvdW5kYXJ5LiAqLworCXN0cnVjdCBvbHltcGljX3J4X2Rlc2Mgb2x5bXBpY19yeF9yaW5nW09MWU1QSUNfUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgb2x5bXBpY190eF9kZXNjIG9seW1waWNfdHhfcmluZ1tPTFlNUElDX1RYX1JJTkdfU0laRV07CisJc3RydWN0IG9seW1waWNfcnhfc3RhdHVzIG9seW1waWNfcnhfc3RhdHVzX3JpbmdbT0xZTVBJQ19SWF9SSU5HX1NJWkVdOwkKKwlzdHJ1Y3Qgb2x5bXBpY190eF9zdGF0dXMgb2x5bXBpY190eF9zdGF0dXNfcmluZ1tPTFlNUElDX1RYX1JJTkdfU0laRV07CQorCisJc3RydWN0IHNrX2J1ZmYgKnR4X3Jpbmdfc2tiW09MWU1QSUNfVFhfUklOR19TSVpFXSwgKnJ4X3Jpbmdfc2tiW09MWU1QSUNfUlhfUklOR19TSVpFXTsJCisJaW50IHR4X3JpbmdfZnJlZSwgdHhfcmluZ19sYXN0X3N0YXR1cywgcnhfcmluZ19sYXN0X3JlY2VpdmVkLHJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkLCBmcmVlX3R4X3JpbmdfZW50cmllczsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG9seW1waWNfc3RhdHMgOworCXUxNiBvbHltcGljX2xhbl9zdGF0dXMgOworCXU4IG9seW1waWNfcmluZ19zcGVlZCA7CisJdTE2IHBrdF9idWZfc3ogOyAKKwl1OCBvbHltcGljX3JlY2VpdmVfb3B0aW9ucywgb2x5bXBpY19jb3B5X2FsbF9vcHRpb25zLG9seW1waWNfbWVzc2FnZV9sZXZlbCwgb2x5bXBpY19uZXR3b3JrX21vbml0b3I7ICAKKwl1MTYgb2x5bXBpY19hZGRyX3RhYmxlX2FkZHIsIG9seW1waWNfcGFybXNfYWRkciA7IAorCXU4IG9seW1waWNfbGFhWzZdIDsgCisJdTMyIHJ4X3JpbmdfZG1hX2FkZHI7CisJdTMyIHJ4X3N0YXR1c19yaW5nX2RtYV9hZGRyOworCXUzMiB0eF9yaW5nX2RtYV9hZGRyOworCXUzMiB0eF9zdGF0dXNfcmluZ19kbWFfYWRkcjsKK307CisKK3N0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSB7CisKKwl1OCBub2RlX2FkZHJbNl0gOyAKKwl1OCByZXNlcnZlZFs0XSA7IAorCXU4IGZ1bmNfYWRkcls0XSA7IAorfSA7IAorCitzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlIHsgCisJCisJdTggIHBoeXNfYWRkcls0XSA7IAorCXU4ICB1cF9ub2RlX2FkZHJbNl0gOyAKKwl1OCAgdXBfcGh5c19hZGRyWzRdIDsgCisJdTggIHBvbGxfYWRkcls2XSA7IAorCXUxNiByZXNlcnZlZCA7IAorCXUxNiBhY2NfcHJpb3JpdHkgOyAKKwl1MTYgYXV0aF9zb3VyY2VfY2xhc3MgOyAKKwl1MTYgYXR0X2NvZGUgOyAKKwl1OCAgc291cmNlX2FkZHJbNl0gOyAKKwl1MTYgYmVhY29uX3R5cGUgOyAKKwl1MTYgbWFqb3JfdmVjdG9yIDsgCisJdTE2IGxhbl9zdGF0dXMgOyAKKwl1MTYgc29mdF9lcnJvcl90aW1lIDsgCisgCXUxNiByZXNlcnZlZDEgOyAKKwl1MTYgbG9jYWxfcmluZyA7IAorCXUxNiBtb25fZXJyb3IgOyAKKwl1MTYgYmVhY29uX3RyYW5zbWl0IDsgCisJdTE2IGJlYWNvbl9yZWNlaXZlIDsgCisJdTE2IGZyYW1lX2NvcnJlbCA7IAorCXU4ICBiZWFjb25fbmF1bls2XSA7IAorCXUzMiByZXNlcnZlZDIgOyAKKwl1OCAgYmVhY29uX3BoeXNbNF0gOyAJCit9OyAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9wcm90ZW9uLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvcHJvdGVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NWIwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvcHJvdGVvbi5jCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICogIHByb3Rlb24uYzogQSBuZXR3b3JrIGRyaXZlciBmb3IgUHJvdGVvbiBJU0EgdG9rZW4gcmluZyBjYXJkcy4KKyAqCisgKiAgQmFzZWQgb24gdG1zcGNpIHdyaXR0ZW4gMTk5OSBieSBBZGFtIEZyaXR6bGVyCisgKiAgCisgKiAgV3JpdHRlbiAyMDAzIGJ5IEpvY2hlbiBGcmllZHJpY2gKKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogIFRoaXMgZHJpdmVyIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNhcmRzOgorICoJLSBQcm90ZW9uIDEzOTIsIDEzOTIrCisgKgorICogIE1haW50YWluZXIocyk6CisgKiAgICBBRiAgICAgICAgQWRhbSBGcml0emxlciAgICAgICAgICAgbWlkQGF1ay5jeAorICogICAgSkYJSm9jaGVuIEZyaWVkcmljaAlqb2NoZW5Ac2NyYW0uZGUKKyAqCisgKiAgTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisgKgkwMi1KYW4tMDMJSkYJQ3JlYXRlZAorICoKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0gInByb3Rlb24uYzogdjEuMDAgMDIvMDEvMjAwMyBieSBKb2NoZW4gRnJpZWRyaWNoXG4iOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcGNpLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaW5jbHVkZSAidG1zMzgwdHIuaCIKKworI2RlZmluZSBQUk9URU9OX0lPX0VYVEVOVCAzMgorCisvKiBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIEkvTyBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkLiAqLworc3RhdGljIHVuc2lnbmVkIGludCBwb3J0bGlzdFtdIF9faW5pdGRhdGEgPSB7CisJMHgwQTIwLCAweDBFMjAsIDB4MUEyMCwgMHgxRTIwLCAweDJBMjAsIDB4MkUyMCwgMHgzQTIwLCAweDNFMjAsLy8gUHJvdC4KKwkweDRBMjAsIDB4NEUyMCwgMHg1QTIwLCAweDVFMjAsIDB4NkEyMCwgMHg2RTIwLCAweDdBMjAsIDB4N0UyMCwvLyBQcm90LgorCTB4OEEyMCwgMHg4RTIwLCAweDlBMjAsIDB4OUUyMCwgMHhBQTIwLCAweEFFMjAsIDB4QkEyMCwgMHhCRTIwLC8vIFByb3QuCisJMHhDQTIwLCAweENFMjAsIDB4REEyMCwgMHhERTIwLCAweEVBMjAsIDB4RUUyMCwgMHhGQTIwLCAweEZFMjAsLy8gUHJvdC4KKwkwCit9OworCisvKiBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIElSUXMgdG8gYmUgcHJvYmVkLiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGlycWxpc3RbXSA9IHsKKwk3LCA2LCA1LCA0LCAzLCAxMiwgMTEsIDEwLCA5LAorCTAKK307CisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgRE1BcyB0byBiZSBwcm9iZWQuICovCitzdGF0aWMgaW50IGRtYWxpc3RbXSBfX2luaXRkYXRhID0geworCTUsIDYsIDcsCisJMAorfTsKKworc3RhdGljIGNoYXIgY2FyZG5hbWVbXSA9ICJQcm90ZW9uIDEzOTJcMCI7CisKK3N0cnVjdCBuZXRfZGV2aWNlICpwcm90ZW9uX3Byb2JlKGludCB1bml0KTsKK3N0YXRpYyBpbnQgcHJvdGVvbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcHJvdGVvbl9yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm90ZW9uX3NldG5zZWxvdXRfcGlucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHByb3Rlb25fc2lmcmVhZGIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXJldHVybiBpbmIoZGV2LT5iYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcHJvdGVvbl9zaWZyZWFkdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJcmV0dXJuIGludyhkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHByb3Rlb25fc2lmd3JpdGViKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCW91dGIodmFsLCBkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHByb3Rlb25fc2lmd3JpdGV3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCW91dHcodmFsLCBkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHByb3Rlb25fcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJdW5zaWduZWQgY2hhciBjaGsxLCBjaGsyOworCWludCBpOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIFBST1RFT05fSU9fRVhURU5ULCBjYXJkbmFtZSkpCisJCXJldHVybiAtRU5PREVWOworCQkKKworCWNoazEgPSBpbmIoaW9hZGRyICsgMHgxZik7ICAgICAgLyogR2V0IFByb3Rlb24gSUQgcmVnIDEgKi8KKwlpZiAoY2hrMSAhPSAweDFmKSAKKwkJZ290byBub2RldjsKKworCWNoazEgPSBpbmIoaW9hZGRyICsgMHgxZSkgJiAweDA3OyAgICAgICAvKiBHZXQgUHJvdGVvbiBJRCByZWcgMCAqLworCWZvciAoaT0wOyBpPDE2OyBpKyspIHsKKwkJY2hrMiA9IGluYihpb2FkZHIgKyAweDFlKSAmIDB4MDc7CisJCWlmICgoKGNoazEgKyAxKSAmIDB4MDcpICE9IGNoazIpCisJCQlnb3RvIG5vZGV2OworCQljaGsxID0gY2hrMjsKKwl9CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlyZXR1cm4gKDApOworbm9kZXY6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBQUk9URU9OX0lPX0VYVEVOVCk7IAorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHA7CisgICAgICAgIHN0YXRpYyBpbnQgdmVyc2lvbnByaW50ZWQ7CisJY29uc3QgdW5zaWduZWQgKnBvcnQ7CisJaW50IGosZXJyID0gMDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlpZiAoZGV2LT5iYXNlX2FkZHIpCS8qIHByb2JlIHNwZWNpZmljIGxvY2F0aW9uICovCisJCWVyciA9IHByb3Rlb25fcHJvYmUxKGRldiwgZGV2LT5iYXNlX2FkZHIpOworCWVsc2UgeworCQlmb3IgKHBvcnQgPSBwb3J0bGlzdDsgKnBvcnQ7IHBvcnQrKykgeworCQkJZXJyID0gcHJvdGVvbl9wcm9iZTEoZGV2LCAqcG9ydCk7CisJCQlpZiAoIWVycikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDQ7CisKKwkvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgZm91bmQgYSB2YWxpZCBjYXJkLiAqLworCisJaWYgKHZlcnNpb25wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIiwgdmVyc2lvbik7CisKKwllcnIgPSAtRUlPOworCWlmICh0bXNkZXZfaW5pdChkZXYsIElTQV9NQVhfQUREUkVTUywgTlVMTCkpCisJCWdvdG8gb3V0NDsKKworCWRldi0+YmFzZV9hZGRyICY9IH4zOyAKKwkJCisJcHJvdGVvbl9yZWFkX2VlcHJvbShkZXYpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAgICBSaW5nIFN0YXRpb24gQWRkcmVzczogIiwgZGV2LT5uYW1lKTsKKwlwcmludGsoIiUyLjJ4IiwgZGV2LT5kZXZfYWRkclswXSk7CisJZm9yIChqID0gMTsgaiA8IDY7IGorKykKKwkJcHJpbnRrKCI6JTIuMngiLCBkZXYtPmRldl9hZGRyW2pdKTsKKwlwcmludGsoIlxuIik7CisJCQorCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl0cC0+c2V0bnNlbG91dCA9IHByb3Rlb25fc2V0bnNlbG91dF9waW5zOworCQkKKwl0cC0+c2lmcmVhZGIgPSBwcm90ZW9uX3NpZnJlYWRiOworCXRwLT5zaWZyZWFkdyA9IHByb3Rlb25fc2lmcmVhZHc7CisJdHAtPnNpZndyaXRlYiA9IHByb3Rlb25fc2lmd3JpdGViOworCXRwLT5zaWZ3cml0ZXcgPSBwcm90ZW9uX3NpZndyaXRldzsKKwkKKwltZW1jcHkodHAtPlByb2R1Y3RJRCwgY2FyZG5hbWUsIFBST0RfSURfU0laRSArIDEpOworCisJdHAtPnRtc3ByaXYgPSBOVUxMOworCisJZGV2LT5vcGVuID0gcHJvdGVvbl9vcGVuOworCWRldi0+c3RvcCA9IHRtczM4MHRyX2Nsb3NlOworCisJaWYgKGRldi0+aXJxID09IDApCisJeworCQlmb3IoaiA9IDA7IGlycWxpc3Rbal0gIT0gMDsgaisrKQorCQl7CisJCQlkZXYtPmlycSA9IGlycWxpc3Rbal07CisJCQlpZiAoIXJlcXVlc3RfaXJxKGRldi0+aXJxLCB0bXMzODB0cl9pbnRlcnJ1cHQsIDAsIAorCQkJCWNhcmRuYW1lLCBkZXYpKQorCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIH0KKwkJCisgICAgICAgICAgICAgICAgaWYoaXJxbGlzdFtqXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvU2VsZWN0IG5vIElSUSBhdmFpbGFibGVcbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIG91dDM7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZm9yKGogPSAwOyBpcnFsaXN0W2pdICE9IDA7IGorKykKKwkJCWlmIChpcnFsaXN0W2pdID09IGRldi0+aXJxKQorCQkJCWJyZWFrOworCQlpZiAoaXJxbGlzdFtqXSA9PSAwKQorCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSWxsZWdhbCBJUlEgJWQgc3BlY2lmaWVkXG4iLAorCQkJCWRldi0+bmFtZSwgZGV2LT5pcnEpOworCQkJZ290byBvdXQzOworCQl9CisJCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgdG1zMzgwdHJfaW50ZXJydXB0LCAwLCAKKwkJCWNhcmRuYW1lLCBkZXYpKQorCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogU2VsZWN0ZWQgSVJRICVkIG5vdCBhdmFpbGFibGVcbiIsIAorCQkJCWRldi0+bmFtZSwgZGV2LT5pcnEpOworCQkJZ290byBvdXQzOworCQl9CisJfQorCisJaWYgKGRldi0+ZG1hID09IDApCisJeworCQlmb3IoaiA9IDA7IGRtYWxpc3Rbal0gIT0gMDsgaisrKQorCQl7CisJCQlkZXYtPmRtYSA9IGRtYWxpc3Rbal07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RfZG1hKGRldi0+ZG1hLCBjYXJkbmFtZSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZihkbWFsaXN0W2pdID09IDApCisJCXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvU2VsZWN0IG5vIERNQSBhdmFpbGFibGVcbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIG91dDI7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZm9yKGogPSAwOyBkbWFsaXN0W2pdICE9IDA7IGorKykKKwkJCWlmIChkbWFsaXN0W2pdID09IGRldi0+ZG1hKQorCQkJCWJyZWFrOworCQlpZiAoZG1hbGlzdFtqXSA9PSAwKQorCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogSWxsZWdhbCBETUEgJWQgc3BlY2lmaWVkXG4iLCAKKwkJCQlkZXYtPm5hbWUsIGRldi0+ZG1hKTsKKwkJCWdvdG8gb3V0MjsKKwkJfQorCQlpZiAocmVxdWVzdF9kbWEoZGV2LT5kbWEsIGNhcmRuYW1lKSkKKwkJeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNlbGVjdGVkIERNQSAlZCBub3QgYXZhaWxhYmxlXG4iLCAKKwkJCQlkZXYtPm5hbWUsIGRldi0+ZG1hKTsKKwkJCWdvdG8gb3V0MjsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogICAgSU86ICUjNGx4ICBJUlE6ICVkICBETUE6ICVkXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwgZGV2LT5kbWEpOworCQkKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXJldHVybiAwOworb3V0OgorCWZyZWVfZG1hKGRldi0+ZG1hKTsKK291dDI6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitvdXQzOgorCXRtc2Rldl90ZXJtKGRldik7CitvdXQ0OgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBQUk9URU9OX0lPX0VYVEVOVCk7IAorCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IHByb3Rlb25fcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX3RyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAidHIlZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCX0KKworCWVyciA9IHNldHVwX2NhcmQoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXJldHVybiBkZXY7CisKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qCisgKiBSZWFkcyBNQUMgYWRkcmVzcyBmcm9tIGFkYXB0ZXIgUkFNLCB3aGljaCBzaG91bGQndmUgcmVhZCBpdCBmcm9tCisgKiB0aGUgb25ib2FyZCBST00uICAKKyAqCisgKiBDYWxsaW5nIHRoaXMgb24gYSBib2FyZCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgaXQgY2FuIGJlIGEgdmVyeQorICogZGFuZ2Vyb3VzIHRoaW5nLiAgVGhlIE1hZGdlIGJvYXJkLCBmb3IgaW5zdGFuY2UsIHdpbGwgbG9jayB5b3VyCisgKiBtYWNoaW5lIGhhcmQgd2hlbiB0aGlzIGlzIGNhbGxlZC4gIEx1Y2tpbHksIGl0cyBzdXBwb3J0ZWQgaW4gYQorICogc2VwYXJhdGUgZHJpdmVyLiAgLS1BU0YKKyAqLworc3RhdGljIHZvaWQgcHJvdGVvbl9yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCQorCS8qIEFkZHJlc3M6IDAwMDA6MDAwMCAqLworCXByb3Rlb25fc2lmd3JpdGV3KGRldiwgMCwgU0lGQURYKTsKKwlwcm90ZW9uX3NpZndyaXRldyhkZXYsIDAsIFNJRkFEUik7CQorCQorCS8qIFJlYWQgc2l4IGJ5dGUgTUFDIGFkZHJlc3MgZGF0YSAqLworCWRldi0+YWRkcl9sZW4gPSA2OworCWZvcihpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IHByb3Rlb25fc2lmcmVhZHcoZGV2LCBTSUZJTkMpID4+IDg7Cit9CisKK3Vuc2lnbmVkIHNob3J0IHByb3Rlb25fc2V0bnNlbG91dF9waW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvdGVvbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7ICAKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2hvcnQgdmFsID0gMDsKKwlpbnQgaTsKKworCS8qIFByb3Rlb24gcmVzZXQgc2VxdWVuY2UgKi8KKwlvdXRiKDAsIGRldi0+YmFzZV9hZGRyICsgMHgxMSk7CisJbWRlbGF5KDIwKTsKKwlvdXRiKDB4MDQsIGRldi0+YmFzZV9hZGRyICsgMHgxMSk7CisJbWRlbGF5KDIwKTsKKwlvdXRiKDAsIGRldi0+YmFzZV9hZGRyICsgMHgxMSk7CisJbWRlbGF5KDEwMCk7CisKKwkvKiBzZXQgY29udHJvbC9zdGF0dXMgcmVnICovCisJdmFsID0gaW5iKGRldi0+YmFzZV9hZGRyICsgMHgxMSk7CisJdmFsIHw9IDB4Nzg7CisJdmFsICY9IDB4Zjk7CisJaWYodHAtPkRhdGFSYXRlID09IFNQRUVEXzQpCisJCXZhbCB8PSAweDIwOworCWVsc2UKKwkJdmFsICY9IH4weDIwOworCisJb3V0Yih2YWwsIGRldi0+YmFzZV9hZGRyICsgMHgxMSk7CisJb3V0YigweGZmLCBkZXYtPmJhc2VfYWRkciArIDB4MTIpOworCWZvcihpID0gMDsgaXJxbGlzdFtpXSAhPSAwOyBpKyspCisJeworCQlpZihpcnFsaXN0W2ldID09IGRldi0+aXJxKQorCQkJYnJlYWs7CisJfQorCXZhbCA9IGk7CisJaSA9ICg3IC0gZGV2LT5kbWEpIDw8IDQ7CisJdmFsIHw9IGk7CisJb3V0Yih2YWwsIGRldi0+YmFzZV9hZGRyICsgMHgxMyk7CisKKwlyZXR1cm4gdG1zMzgwdHJfb3BlbihkZXYpOworfQorCisjaWZkZWYgTU9EVUxFCisKKyNkZWZpbmUgSVNBVFJfTUFYX0FEQVBURVJTIDMKKworc3RhdGljIGludCBpb1tJU0FUUl9NQVhfQURBUFRFUlNdOworc3RhdGljIGludCBpcnFbSVNBVFJfTUFYX0FEQVBURVJTXTsKK3N0YXRpYyBpbnQgZG1hW0lTQVRSX01BWF9BREFQVEVSU107CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShkbWEsIGludCwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcHJvdGVvbl9kZXZbSVNBVFJfTUFYX0FEQVBURVJTXTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaSwgbnVtID0gMCwgZXJyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBJU0FUUl9NQVhfQURBUFRFUlMgOyBpKyspIHsKKwkJZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwkJaWYgKCFkZXYpCisJCQljb250aW51ZTsKKworCQlkZXYtPmJhc2VfYWRkciA9IGlvW2ldOworCQlkZXYtPmlycSA9IGlycVtpXTsKKwkJZGV2LT5kbWEgPSBkbWFbaV07CisJCWVyciA9IHNldHVwX2NhcmQoZGV2KTsKKwkJaWYgKCFlcnIpIHsKKwkJCXByb3Rlb25fZGV2W2ldID0gZGV2OworCQkJKytudW07CisJCX0gZWxzZSB7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fTk9USUNFICJwcm90ZW9uLmM6ICVkIGNhcmRzIGZvdW5kLlxuIiwgbnVtKTsKKwkvKiBQcm9iZSBmb3IgY2FyZHMuICovCisJaWYgKG51bSA9PSAwKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAicHJvdGVvbi5jOiBObyBjYXJkcyBmb3VuZC5cbiIpOworCQlyZXR1cm4gKC1FTk9ERVYpOworCX0KKwlyZXR1cm4gKDApOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSVNBVFJfTUFYX0FEQVBURVJTIDsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcm90ZW9uX2RldltpXTsKKwkJCisJCWlmICghZGV2KSAKKwkJCWNvbnRpbnVlOworCQkKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFBST1RFT05fSU9fRVhURU5UKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCWZyZWVfZG1hKGRldi0+ZG1hKTsKKwkJdG1zZGV2X3Rlcm0oZGV2KTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9Cit9CisjZW5kaWYgLyogTU9EVUxFICovCisKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVkVSU0lPTlMgIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgcHJvdGVvbi5jIgorICogIGFsdC1jb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyBwcm90ZW9uLmMiCisgKiAgYy1zZXQtc3R5bGUgIksmUiIKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9za2lzYS5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NraXNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhYjU0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9za2lzYS5jCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICogIHNraXNhLmM6IEEgbmV0d29yayBkcml2ZXIgZm9yIFNLLU5FVCBUTVMzODAtYmFzZWQgSVNBIHRva2VuIHJpbmcgY2FyZHMuCisgKgorICogIEJhc2VkIG9uIHRtc3BjaSB3cml0dGVuIDE5OTkgYnkgQWRhbSBGcml0emxlcgorICogIAorICogIFdyaXR0ZW4gMjAwMCBieSBKb2NoZW4gRnJpZWRyaWNoCisgKiAgRGVkaWNhdGVkIHRvIG15IGdpcmxmcmllbmQgU3RlZmZpIEJvcHAKKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogIFRoaXMgZHJpdmVyIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNhcmRzOgorICoJLSBTeXNLb25uZWN0IFRSNC8xNigrKSBJU0EJKFNLLTQxOTApCisgKgorICogIE1haW50YWluZXIocyk6CisgKiAgICBBRiAgICAgICAgQWRhbSBGcml0emxlciAgICAgICAgICAgbWlkQGF1ay5jeAorICogICAgSkYJSm9jaGVuIEZyaWVkcmljaAlqb2NoZW5Ac2NyYW0uZGUKKyAqCisgKiAgTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisgKgkxNC1KYW4tMDEJSkYJQ3JlYXRlZAorICoJMjgtT2N0LTAyCUpGCUZpeGVkIHByb2JlIG9mIGNhcmQgZm9yIHN0YXRpYyBjb21waWxhdGlvbi4KKyAqCQkJCUZpeGVkIG1vZHVsZSBpbml0IHRvIG5vdCBtYWtlIGhvdHBsdWcgZ28gd2lsZC4KKyAqCTA5LU5vdi0wMglKRglGaXhlZCBlYXJseSBiYWlsIG91dCBvbiBvdXQgb2YgbWVtb3J5CisgKgkJCQlzaXR1YXRpb25zIGlmIG11bHRpcGxlIGNhcmRzIGFyZSBmb3VuZC4KKyAqCQkJCUNsZWFuZWQgdXAgc29tZSB1bm5lY2Vzc2FyeSBjb25zb2xlIFNQQU0uCisgKgkwOS1EZWMtMDIJSkYJRml4ZWQgbW9kdWxlIHJlZmVyZW5jZSBjb3VudGluZy4KKyAqCTAyLUphbi0wMwlKRglSZW5hbWVkIHRvIHNraXNhLmMKKyAqCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9ICJza2lzYS5jOiB2MS4wMyAwOS8xMi8yMDAyIGJ5IEpvY2hlbiBGcmllZHJpY2hcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcGNpLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaW5jbHVkZSAidG1zMzgwdHIuaCIKKworI2RlZmluZSBTS19JU0FfSU9fRVhURU5UIDMyCisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSS9PIGFkZHJlc3NlcyB0byBiZSBwcm9iZWQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBvcnRsaXN0W10gX19pbml0ZGF0YSA9IHsKKwkweDBBMjAsIDB4MUEyMCwgMHgwQjIwLCAweDFCMjAsIDB4MDk4MCwgMHgxOTgwLCAweDA5MDAsIDB4MTkwMCwvLyBTSworCTAKK307CisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSVJRcyB0byBiZSBwcm9iZWQuIAorICogVXNlZCBhZ2FpbiBhZnRlciBpbml0aWFsIHByb2JlIGZvciBza3RyX2NoaXBzZXRfaW5pdCwgY2FsbGVkIGZyb20gc2t0cl9vcGVuLgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgaXJxbGlzdFtdID0geworCTMsIDUsIDksIDEwLCAxMSwgMTIsIDE1LAorCTAKK307CisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgRE1BcyB0byBiZSBwcm9iZWQuICovCitzdGF0aWMgaW50IGRtYWxpc3RbXSBfX2luaXRkYXRhID0geworCTUsIDYsIDcsCisJMAorfTsKKworc3RhdGljIGNoYXIgaXNhX2NhcmRuYW1lW10gPSAiU0sgTkVUIFRSIDQvMTYgSVNBXDAiOworCitzdHJ1Y3QgbmV0X2RldmljZSAqc2tfaXNhX3Byb2JlKGludCB1bml0KTsKK3N0YXRpYyBpbnQgc2tfaXNhX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBza19pc2FfcmVhZF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc2tfaXNhX3NldG5zZWxvdXRfcGlucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNrX2lzYV9zaWZyZWFkYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJcmV0dXJuIGluYihkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBza19pc2Ffc2lmcmVhZHcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXJldHVybiBpbncoZGV2LT5iYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCBza19pc2Ffc2lmd3JpdGViKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCW91dGIodmFsLCBkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHNrX2lzYV9zaWZ3cml0ZXcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmFsLCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJb3V0dyh2YWwsIGRldi0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBza19pc2FfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJdW5zaWduZWQgY2hhciBvbGQsIGNoazEsIGNoazI7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgU0tfSVNBX0lPX0VYVEVOVCwgaXNhX2NhcmRuYW1lKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvbGQgPSBpbmIoaW9hZGRyICsgU0lGQURSKTsJLyogR2V0IHRoZSBvbGQgU0lGQURSIHZhbHVlICovCisKKwljaGsxID0gMDsJLyogQmVnaW4gd2l0aCBjaGVjayB2YWx1ZSAwICovCisJZG8geworCQkvKiBXcml0ZSBuZXcgU0lGQURSIHZhbHVlICovCisJCW91dGIoY2hrMSwgaW9hZGRyICsgU0lGQURSKTsKKworCQkvKiBSZWFkLCBpbnZlcnQgYW5kIHdyaXRlICovCisJCWNoazIgPSBpbmIoaW9hZGRyICsgU0lGQUREKTsKKwkJY2hrMiBePSAweDBGRTsKKwkJb3V0YihjaGsyLCBpb2FkZHIgKyBTSUZBRFIpOworCisJCS8qIFJlYWQsIGludmVydCBhbmQgY29tcGFyZSAqLworCQljaGsyID0gaW5iKGlvYWRkciArIFNJRkFERCk7CisJCWNoazIgXj0gMHgwRkU7CisKKwkJaWYoY2hrMSAhPSBjaGsyKSB7CisJCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIFNLX0lTQV9JT19FWFRFTlQpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQljaGsxIC09IDI7CisJfSB3aGlsZShjaGsxICE9IDApOwkvKiBSZXBlYXQgMTI4IHRpbWVzIChhbGwgYnl0ZSB2YWx1ZXMpICovCisKKyAgICAJLyogUmVzdG9yZSB0aGUgU0lGQURSIHZhbHVlICovCisJb3V0YihvbGQsIGlvYWRkciArIFNJRkFEUik7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgc2V0dXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwOworICAgICAgICBzdGF0aWMgaW50IHZlcnNpb25wcmludGVkOworCWNvbnN0IHVuc2lnbmVkICpwb3J0OworCWludCBqLCBlcnIgPSAwOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWlmIChkZXYtPmJhc2VfYWRkcikJLyogcHJvYmUgc3BlY2lmaWMgbG9jYXRpb24gKi8KKwkJZXJyID0gc2tfaXNhX3Byb2JlMShkZXYsIGRldi0+YmFzZV9hZGRyKTsKKwllbHNlIHsKKwkJZm9yIChwb3J0ID0gcG9ydGxpc3Q7ICpwb3J0OyBwb3J0KyspIHsKKwkJCWVyciA9IHNrX2lzYV9wcm9iZTEoZGV2LCAqcG9ydCk7CisJCQlpZiAoIWVycikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDQ7CisKKwkvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgZm91bmQgYSB2YWxpZCBjYXJkLiAqLworCisJaWYgKHZlcnNpb25wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIiwgdmVyc2lvbik7CisKKwllcnIgPSAtRUlPOworCWlmICh0bXNkZXZfaW5pdChkZXYsIElTQV9NQVhfQUREUkVTUywgTlVMTCkpCisJCWdvdG8gb3V0NDsKKworCWRldi0+YmFzZV9hZGRyICY9IH4zOyAKKwkJCisJc2tfaXNhX3JlYWRfZWVwcm9tKGRldik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICAgIFJpbmcgU3RhdGlvbiBBZGRyZXNzOiAiLCBkZXYtPm5hbWUpOworCXByaW50aygiJTIuMngiLCBkZXYtPmRldl9hZGRyWzBdKTsKKwlmb3IgKGogPSAxOyBqIDwgNjsgaisrKQorCQlwcmludGsoIjolMi4yeCIsIGRldi0+ZGV2X2FkZHJbal0pOworCXByaW50aygiXG4iKTsKKwkJCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXRwLT5zZXRuc2Vsb3V0ID0gc2tfaXNhX3NldG5zZWxvdXRfcGluczsKKwkJCisJdHAtPnNpZnJlYWRiID0gc2tfaXNhX3NpZnJlYWRiOworCXRwLT5zaWZyZWFkdyA9IHNrX2lzYV9zaWZyZWFkdzsKKwl0cC0+c2lmd3JpdGViID0gc2tfaXNhX3NpZndyaXRlYjsKKwl0cC0+c2lmd3JpdGV3ID0gc2tfaXNhX3NpZndyaXRldzsKKwkKKwltZW1jcHkodHAtPlByb2R1Y3RJRCwgaXNhX2NhcmRuYW1lLCBQUk9EX0lEX1NJWkUgKyAxKTsKKworCXRwLT50bXNwcml2ID0gTlVMTDsKKworCWRldi0+b3BlbiA9IHNrX2lzYV9vcGVuOworCWRldi0+c3RvcCA9IHRtczM4MHRyX2Nsb3NlOworCisJaWYgKGRldi0+aXJxID09IDApCisJeworCQlmb3IoaiA9IDA7IGlycWxpc3Rbal0gIT0gMDsgaisrKQorCQl7CisJCQlkZXYtPmlycSA9IGlycWxpc3Rbal07CisJCQlpZiAoIXJlcXVlc3RfaXJxKGRldi0+aXJxLCB0bXMzODB0cl9pbnRlcnJ1cHQsIDAsIAorCQkJCWlzYV9jYXJkbmFtZSwgZGV2KSkKKwkJCQlicmVhazsKKyAgICAgICAgICAgICAgICB9CisJCQorICAgICAgICAgICAgICAgIGlmKGlycWxpc3Rbal0gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogQXV0b1NlbGVjdCBubyBJUlEgYXZhaWxhYmxlXG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBvdXQzOworCQl9CisJfQorCWVsc2UKKwl7CisJCWZvcihqID0gMDsgaXJxbGlzdFtqXSAhPSAwOyBqKyspCisJCQlpZiAoaXJxbGlzdFtqXSA9PSBkZXYtPmlycSkKKwkJCQlicmVhazsKKwkJaWYgKGlycWxpc3Rbal0gPT0gMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElsbGVnYWwgSVJRICVkIHNwZWNpZmllZFxuIiwKKwkJCQlkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJCWdvdG8gb3V0MzsKKwkJfQorCQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIHRtczM4MHRyX2ludGVycnVwdCwgMCwgCisJCQlpc2FfY2FyZG5hbWUsIGRldikpCisJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBTZWxlY3RlZCBJUlEgJWQgbm90IGF2YWlsYWJsZVxuIiwgCisJCQkJZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCQlnb3RvIG91dDM7CisJCX0KKwl9CisKKwlpZiAoZGV2LT5kbWEgPT0gMCkKKwl7CisJCWZvcihqID0gMDsgZG1hbGlzdFtqXSAhPSAwOyBqKyspCisJCXsKKwkJCWRldi0+ZG1hID0gZG1hbGlzdFtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdF9kbWEoZGV2LT5kbWEsIGlzYV9jYXJkbmFtZSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZihkbWFsaXN0W2pdID09IDApCisJCXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvU2VsZWN0IG5vIERNQSBhdmFpbGFibGVcbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIG91dDI7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZm9yKGogPSAwOyBkbWFsaXN0W2pdICE9IDA7IGorKykKKwkJCWlmIChkbWFsaXN0W2pdID09IGRldi0+ZG1hKQorCQkJCWJyZWFrOworCQlpZiAoZG1hbGlzdFtqXSA9PSAwKQorCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogSWxsZWdhbCBETUEgJWQgc3BlY2lmaWVkXG4iLCAKKwkJCQlkZXYtPm5hbWUsIGRldi0+ZG1hKTsKKwkJCWdvdG8gb3V0MjsKKwkJfQorCQlpZiAocmVxdWVzdF9kbWEoZGV2LT5kbWEsIGlzYV9jYXJkbmFtZSkpCisJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBTZWxlY3RlZCBETUEgJWQgbm90IGF2YWlsYWJsZVxuIiwgCisJCQkJZGV2LT5uYW1lLCBkZXYtPmRtYSk7CisJCQlnb3RvIG91dDI7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICAgIElPOiAlIzRseCAgSVJROiAlZCAgRE1BOiAlZFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEsIGRldi0+ZG1hKTsKKwkJCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlyZXR1cm4gMDsKK291dDoKKwlmcmVlX2RtYShkZXYtPmRtYSk7CitvdXQyOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworb3V0MzoKKwl0bXNkZXZfdGVybShkZXYpOworb3V0NDoKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU0tfSVNBX0lPX0VYVEVOVCk7IAorCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IHNrX2lzYV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJ0ciVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfQorCisJZXJyID0gc2V0dXBfY2FyZChkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJcmV0dXJuIGRldjsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qCisgKiBSZWFkcyBNQUMgYWRkcmVzcyBmcm9tIGFkYXB0ZXIgUkFNLCB3aGljaCBzaG91bGQndmUgcmVhZCBpdCBmcm9tCisgKiB0aGUgb25ib2FyZCBST00uICAKKyAqCisgKiBDYWxsaW5nIHRoaXMgb24gYSBib2FyZCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgaXQgY2FuIGJlIGEgdmVyeQorICogZGFuZ2Vyb3VzIHRoaW5nLiAgVGhlIE1hZGdlIGJvYXJkLCBmb3IgaW5zdGFuY2UsIHdpbGwgbG9jayB5b3VyCisgKiBtYWNoaW5lIGhhcmQgd2hlbiB0aGlzIGlzIGNhbGxlZC4gIEx1Y2tpbHksIGl0cyBzdXBwb3J0ZWQgaW4gYQorICogc2VwYXJhdGUgZHJpdmVyLiAgLS1BU0YKKyAqLworc3RhdGljIHZvaWQgc2tfaXNhX3JlYWRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJCisJLyogQWRkcmVzczogMDAwMDowMDAwICovCisJc2tfaXNhX3NpZndyaXRldyhkZXYsIDAsIFNJRkFEWCk7CisJc2tfaXNhX3NpZndyaXRldyhkZXYsIDAsIFNJRkFEUik7CQorCQorCS8qIFJlYWQgc2l4IGJ5dGUgTUFDIGFkZHJlc3MgZGF0YSAqLworCWRldi0+YWRkcl9sZW4gPSA2OworCWZvcihpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IHNrX2lzYV9zaWZyZWFkdyhkZXYsIFNJRklOQykgPj4gODsKK30KKwordW5zaWduZWQgc2hvcnQgc2tfaXNhX3NldG5zZWxvdXRfcGlucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNrX2lzYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7ICAKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2hvcnQgdmFsID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBvbGR2YWw7CisJaW50IGk7CisKKwl2YWwgPSAwOworCWZvcihpID0gMDsgaXJxbGlzdFtpXSAhPSAwOyBpKyspCisJeworCQlpZihpcnFsaXN0W2ldID09IGRldi0+aXJxKQorCQkJYnJlYWs7CisJfQorCisJdmFsIHw9IENZQ0xFX1RJTUUgPDwgMjsKKwl2YWwgfD0gaSA8PCA0OworCWkgPSBkZXYtPmRtYSAtIDU7CisJdmFsIHw9IGk7CisJaWYodHAtPkRhdGFSYXRlID09IFNQRUVEXzQpCisJCXZhbCB8PSBMSU5FX1NQRUVEX0JJVDsKKwllbHNlCisJCXZhbCAmPSB+TElORV9TUEVFRF9CSVQ7CisJb2xkdmFsID0gc2tfaXNhX3NpZnJlYWRiKGRldiwgUE9TUkVHKTsKKwkvKiBMZWF2ZSBjeWNsZSBiaXRzIGFsb25lICovCisJb2xkdmFsIHw9IDB4ZjM7CisJdmFsICY9IG9sZHZhbDsKKwlza19pc2Ffc2lmd3JpdGViKGRldiwgdmFsLCBQT1NSRUcpOworCisJcmV0dXJuIHRtczM4MHRyX29wZW4oZGV2KTsKK30KKworI2lmZGVmIE1PRFVMRQorCisjZGVmaW5lIElTQVRSX01BWF9BREFQVEVSUyAzCisKK3N0YXRpYyBpbnQgaW9bSVNBVFJfTUFYX0FEQVBURVJTXTsKK3N0YXRpYyBpbnQgaXJxW0lTQVRSX01BWF9BREFQVEVSU107CitzdGF0aWMgaW50IGRtYVtJU0FUUl9NQVhfQURBUFRFUlNdOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZG1hLCBpbnQsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnNrX2lzYV9kZXZbSVNBVFJfTUFYX0FEQVBURVJTXTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaSwgbnVtID0gMCwgZXJyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBJU0FUUl9NQVhfQURBUFRFUlMgOyBpKyspIHsKKwkJZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwkJaWYgKCFkZXYpCisJCQljb250aW51ZTsKKworCQlkZXYtPmJhc2VfYWRkciA9IGlvW2ldOworCQlkZXYtPmlycSA9IGlycVtpXTsKKwkJZGV2LT5kbWEgPSBkbWFbaV07CisJCWVyciA9IHNldHVwX2NhcmQoZGV2KTsKKworCQlpZiAoIWVycikgeworCQkJc2tfaXNhX2RldltpXSA9IGRldjsKKwkJCSsrbnVtOworCQl9IGVsc2UgeworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX05PVElDRSAic2tpc2EuYzogJWQgY2FyZHMgZm91bmQuXG4iLCBudW0pOworCS8qIFByb2JlIGZvciBjYXJkcy4gKi8KKwlpZiAobnVtID09IDApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJza2lzYS5jOiBObyBjYXJkcyBmb3VuZC5cbiIpOworCQlyZXR1cm4gKC1FTk9ERVYpOworCX0KKwlyZXR1cm4gKDApOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSVNBVFJfTUFYX0FEQVBURVJTIDsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza19pc2FfZGV2W2ldOworCisJCWlmICghZGV2KSAKKwkJCWNvbnRpbnVlOworCQkKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNLX0lTQV9JT19FWFRFTlQpOworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJZnJlZV9kbWEoZGV2LT5kbWEpOworCQl0bXNkZXZfdGVybShkZXYpOworCQlmcmVlX25ldGRldihkZXYpOworCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RWRVJTSU9OUyAgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyBza2lzYS5jIgorICogIGFsdC1jb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyBza2lzYS5jIgorICogIGMtc2V0LXN0eWxlICJLJlIiCisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOGFlYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwpAQCAtMCwwICsxLDU3NDIgQEAKKy8qCisgKiAgc21jdHIuYzogQSBuZXR3b3JrIGRyaXZlciBmb3IgdGhlIFNNQyBUb2tlbiBSaW5nIEFkYXB0ZXJzLgorICoKKyAqICBXcml0dGVuIGJ5IEpheSBTY2h1bGlzdCA8anNjaGxzdEBzYW1iYS5vcmc+CisgKgorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqICBUaGlzIGRldmljZSBkcml2ZXIgd29ya3Mgd2l0aCB0aGUgZm9sbG93aW5nIFNNQyBhZGFwdGVyczoKKyAqICAgICAgLSBTTUMgVG9rZW5DYXJkIEVsaXRlICAgKDgxMTVULCBjaGlwcyA4MjUvNTg0KQorICogICAgICAtIFNNQyBUb2tlbkNhcmQgRWxpdGUvQSBNQ0EgKDgxMTVUL0EsIGNoaXBzIDgyNS81OTQpCisgKgorICogIFNvdXJjZShzKToKKyAqICAJLSBTTUMgVG9rZW5DYXJkIFNESy4KKyAqCisgKiAgTWFpbnRhaW5lcihzKToKKyAqICAgIEpTICAgICAgICBKYXkgU2NodWxpc3QgPGpzY2hsc3RAc2FtYmEub3JnPgorICoKKyAqIENoYW5nZXM6CisgKiAgICAwNzEwMjAwMCAgICAgICAgICBKUyAgICAgIEZpeGVkIGEgdGltaW5nIHByb2JsZW0gaW4gc21jdHJfd2FpdF9jbWQoKTsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxzbyBhZGRlZCBhIGJpdCBtb3JlIGRpc2NyaXB0aXZlIGVycm9yIG1zZ3MuCisgKiAgICAwNzEyMjAwMCAgICAgICAgICBKUyAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBkZXRlY3RpbmcgYSBjYXJkIHdpdGgKKyAqCQkJCW1vZHVsZSBpby9pcnEvbWVtIHNwZWNpZmllZC4KKyAqCisgKiAgVG8gZG86CisgKiAgICAxLiBNdWx0aWNhc3Qgc3VwcG9ydC4KKyAqCisgKiAgSW5pdGlhbCAyLjUgY2xlYW51cCBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiAgMjAwMi8xMC8yOAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS1sZWdhY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaWYgQklUU19QRVJfTE9ORyA9PSA2NAorI2Vycm9yIEZJWE1FOiBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCA2NC1iaXQgcGxhdGZvcm1zCisjZW5kaWYKKworI2luY2x1ZGUgInNtY3RyLmgiICAgICAgICAgICAgICAgLyogT3VyIFN0dWZmICovCisjaW5jbHVkZSAic21jdHJfZmlybXdhcmUuaCIgICAgICAvKiBTTUMgYWRhcHRlciBmaXJtd2FyZSAqLworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAic21jdHIuYzogdjEuNCA3LzEyLzAwIGJ5IGpzY2hsc3RAc2FtYmEub3JnXG4iOworc3RhdGljIGNvbnN0IGNoYXIgY2FyZG5hbWVbXSA9ICJzbWN0ciI7CisKKworI2RlZmluZSBTTUNUUl9JT19FWFRFTlQgICAyMAorCisjaWZkZWYgQ09ORklHX01DQV9MRUdBQ1kKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc21jdHJfcG9zaWQgPSAweDZlYzY7CisjZW5kaWYKKworc3RhdGljIGludCByaW5nc3BlZWQ7CisKKy8qIFNNQyBOYW1lIG9mIHRoZSBBZGFwdGVyLiAqLworc3RhdGljIGNoYXIgc21jdHJfbmFtZVtdID0gIlNNQyBUb2tlbkNhcmQiOworY2hhciAqc21jdHJfbW9kZWwgPSAiVW5rbm93biI7CisKKy8qIFVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sIDIgZm9yIGRlYnVnLCBhbmQKKyAqIDMgZm9yIHZlcnkgdmVyYm9zZSBkZWJ1Zy4KKyAqLworI2lmbmRlZiBTTUNUUl9ERUJVRworI2RlZmluZSBTTUNUUl9ERUJVRyAxCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc21jdHJfZGVidWcgPSBTTUNUUl9ERUJVRzsKKworLyogc21jdHIuYyBwcm90b3R5cGVzIGFuZCBmdW5jdGlvbnMgYXJlIGFycmFuZ2VkIGFscGhhYmV0aWNseSAKKyAqIGZvciBjbGVhcml0eSwgbWFpbnRhaW5hYmlsaXR5IGFuZCBwdXJlIG9sZCBmYXNoaW9uIGZ1bi4gCisgKi8KKy8qIEEgKi8KK3N0YXRpYyBpbnQgc21jdHJfYWxsb2Nfc2hhcmVkX21lbW9yeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogQiAqLworc3RhdGljIGludCBzbWN0cl9ieXBhc3Nfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEMgKi8KK3N0YXRpYyBpbnQgc21jdHJfY2hlY2tzdW1fZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IF9faW5pdCBzbWN0cl9jaGtfaXNhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9jaGdfcnhfbWFzayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfY2xlYXJfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9jbGVhcl90cmNfcmVzZXQoaW50IGlvYWRkcik7CitzdGF0aWMgaW50IHNtY3RyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBEICovCitzdGF0aWMgaW50IHNtY3RyX2RlY29kZV9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfZGlzYWJsZV8xNmJpdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfZGlzYWJsZV9hZGFwdGVyX2N0cmxfc3RvcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2Rpc2FibGVfYmljX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogRSAqLworc3RhdGljIGludCBzbWN0cl9lbmFibGVfMTZiaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2VuYWJsZV9hZGFwdGVyX2N0cmxfc3RvcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2VuYWJsZV9hZGFwdGVyX3JhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfZW5hYmxlX2JpY19pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEcgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNtY3RyX2dldF9ib2FyZGlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtY2EpOworc3RhdGljIGludCBzbWN0cl9nZXRfZ3JvdXBfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfZ2V0X2Z1bmN0aW9uYWxfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc21jdHJfZ2V0X251bV9yeF9iZGJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9nZXRfcGh5c2ljYWxfZHJvcF9udW1iZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgX191OCAqc21jdHJfZ2V0X3J4X3BvaW50ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgcXVldWUpOworc3RhdGljIGludCBzbWN0cl9nZXRfc3RhdGlvbl9pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc21jdHJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIEZDQmxvY2sgKnNtY3RyX2dldF90eF9mY2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUsCisgICAgICAgIF9fdTE2IGJ5dGVzX2NvdW50KTsKK3N0YXRpYyBpbnQgc21jdHJfZ2V0X3Vwc3RyZWFtX25laWdoYm9yX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEggKi8KK3N0YXRpYyBpbnQgc21jdHJfaGFyZHdhcmVfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHApOworLyogSSAqLworc3RhdGljIGludCBzbWN0cl9pbml0X2FjYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2luaXRfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF9jYXJkX3JlYWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2luaXRfcnhfYmRicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF9yeF9mY2JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pbml0X3NoYXJlZF9tZW1vcnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2luaXRfdHhfYmRicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF90eF9mY2JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pbnRlcm5hbF9zZWxmX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc21jdHJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9lbmFibGVfaW50X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBfX3UxNiBpbnRlcnJ1cHRfZW5hYmxlX21hc2spOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9pbnRfYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IGlhY2tfY29kZSwKKyAgICAgICAgX191MTYgaWJpdHMpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9pbml0X3RpbWVyc19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX2luaXRfdHhyeF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX2luc2VydF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3JlYWRfcmluZ19zdGF0dXNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9yZWFkX3dvcmRfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IGF3b3JkX2NudCk7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3JlbW92ZV9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3Jlc3VtZV9hY2JfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9yZXN1bWVfcnhfYmRiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiBxdWV1ZSk7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9mY2JfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHF1ZXVlKTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfcmVzdW1lX3R4X2ZjYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV90ZXN0X2ludGVybmFsX3JvbV9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3Rlc3RfaGljX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdGVzdF9tYWNfcmVnX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdHJjX2xvb3BiYWNrX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdHJpX2xvb3BiYWNrX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfd3JpdGVfYnl0ZV9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgc2hvcnQgYXdvcmRfY250LCB2b2lkICpieXRlKTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfd3JpdGVfd29yZF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgc2hvcnQgYXdvcmRfY250LCB2b2lkICp3b3JkKTsKKworLyogSiAqLworc3RhdGljIGludCBzbWN0cl9qb2luX2NvbXBsZXRlX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBMICovCitzdGF0aWMgaW50IHNtY3RyX2xpbmtfdHhfZmNic190b19iZGJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9sb2FkX2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9sb2FkX25vZGVfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfbG9iZV9tZWRpYV90ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9sb2JlX21lZGlhX3Rlc3RfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9sb2JlX21lZGlhX3Rlc3Rfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIE0gKi8KK3N0YXRpYyBpbnQgc21jdHJfbWFrZV84MDI1X2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfSEVBREVSICpybWYsIE1BQ19IRUFERVIgKnRtZiwgX191MTYgYWNfZmMpOworc3RhdGljIGludCBzbWN0cl9tYWtlX2FjY2Vzc19wcmkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdik7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfYWRkcl9tb2Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX1NVQl9WRUNUT1IgKnRzdik7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfYXV0aF9mdW5jdF9jbGFzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9jb3JyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3YsIF9fdTE2IGNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9tYWtlX2Z1bmN0X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdik7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfZ3JvdXBfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9waHlfZHJvcF9udW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdik7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfcHJvZHVjdF9pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9zdGF0aW9uX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19TVUJfVkVDVE9SICp0c3YpOworc3RhdGljIGludCBzbWN0cl9tYWtlX3Jpbmdfc3RhdGlvbl9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdik7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfcmluZ19zdGF0aW9uX3ZlcnNpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdik7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfdHhfc3RhdHVzX2NvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdiwgX191MTYgdHhfZnN0YXR1cyk7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfdXBzdHJlYW1fbmVpZ2hib3JfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV93cmFwX2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdik7CisKKy8qIE8gKi8KK3N0YXRpYyBpbnQgc21jdHJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfb3Blbl90cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogUCAqLworc3RydWN0IG5ldF9kZXZpY2UgKnNtY3RyX3Byb2JlKGludCB1bml0KTsKK3N0YXRpYyBpbnQgX19pbml0IHNtY3RyX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQgc21jdHJfcHJvY2Vzc19yeF9wYWNrZXQoTUFDX0hFQURFUiAqcm1mLCBfX3UxNiBzaXplLAorICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiByeF9zdGF0dXMpOworCisvKiBSICovCitzdGF0aWMgaW50IHNtY3RyX3JhbV9tZW1vcnlfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfcmN2X2NoZ19wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2ICpjb3JyZWxhdG9yKTsKK3N0YXRpYyBpbnQgc21jdHJfcmN2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX0hFQURFUiAqcm1mLAorICAgICAgICBfX3UxNiAqY29ycmVsYXRvcik7CitzdGF0aWMgaW50IHNtY3RyX3Jjdl90eF9mb3J3YXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZik7CitzdGF0aWMgaW50IHNtY3RyX3Jjdl9ycV9hZGRyX3N0YXRlX2F0dGNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19IRUFERVIgKnJtZiwgX191MTYgKmNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9yY3ZfdW5rbm93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2ICpjb3JyZWxhdG9yKTsKK3N0YXRpYyBpbnQgc21jdHJfcmVzZXRfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfcmVzdGFydF90eF9jaGFpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBxdWV1ZSk7CitzdGF0aWMgaW50IHNtY3RyX3Jpbmdfc3RhdHVzX2NoZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfcnhfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIFMgKi8KK3N0YXRpYyBpbnQgc21jdHJfc2VuZF9kYXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9zZW5kX2xvYmVfbWVkaWFfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfc2VuZF9ycHRfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2IGNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9zZW5kX3JwdF9hdHRjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2IGNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9zZW5kX3JwdF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2IGNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9zZW5kX3JwdF90eF9mb3J3YXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19IRUFERVIgKnJtZiwgX191MTYgdHhfZnN0YXR1cyk7CitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnNwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgcmNvZGUsIF9fdTE2IGNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9zZW5kX3JxX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX3NlbmRfdHhfZm9yd2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2ICp0eF9mc3RhdHVzKTsKK3N0YXRpYyBpbnQgc21jdHJfc2V0X2F1dGhfYWNjZXNzX3ByaShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2KTsKK3N0YXRpYyBpbnQgc21jdHJfc2V0X2F1dGhfZnVuY3RfY2xhc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdik7CitzdGF0aWMgaW50IHNtY3RyX3NldF9jb3JyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19TVUJfVkVDVE9SICpyc3YsCisJX191MTYgKmNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9zZXRfZXJyb3JfdGltZXJfdmFsdWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdik7CitzdGF0aWMgaW50IHNtY3RyX3NldF9mcmFtZV9mb3J3YXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICpyc3YsIF9fdTggZGNfc2MpOworc3RhdGljIGludCBzbWN0cl9zZXRfbG9jYWxfcmluZ19udW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc21jdHJfc2V0X2N0cmxfYXR0ZW50aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc21jdHJfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9zZXRfcGFnZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3U4ICpidWYpOworc3RhdGljIGludCBzbWN0cl9zZXRfcGh5X2Ryb3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdik7CitzdGF0aWMgaW50IHNtY3RyX3NldF9yaW5nX3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9zZXRfcnhfbG9va19haGVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfc2V0X3RyY19yZXNldChpbnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQgc21jdHJfc2V0dXBfc2luZ2xlX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBfX3UxNiBjb21tYW5kLCBfX3UxNiBzdWJjb21tYW5kKTsKK3N0YXRpYyBpbnQgc21jdHJfc2V0dXBfc2luZ2xlX2NtZF93X2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgX191MTYgY29tbWFuZCwgX191MTYgc3ViY29tbWFuZCk7CitzdGF0aWMgY2hhciAqc21jdHJfbWFsbG9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHNpemUpOworc3RhdGljIGludCBzbWN0cl9zdGF0dXNfY2hnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBUICovCitzdGF0aWMgdm9pZCBzbWN0cl90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl90cmNfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgRkNCbG9jayAqZmNiLAorICAgICAgICBfX3UxNiBxdWV1ZSk7CitzdGF0aWMgX191MTYgc21jdHJfdHhfY29tcGxldGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNtY3RyX3R4X21vdmVfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191OCAqcGJ1ZmYsIHVuc2lnbmVkIGludCBieXRlcyk7CisKKy8qIFUgKi8KK3N0YXRpYyBpbnQgc21jdHJfdXBkYXRlX2Vycl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfdXBkYXRlX3J4X2NoYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHF1ZXVlKTsKK3N0YXRpYyBpbnQgc21jdHJfdXBkYXRlX3R4X2NoYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIEZDQmxvY2sgKmZjYiwKKyAgICAgICAgX191MTYgcXVldWUpOworCisvKiBXICovCitzdGF0aWMgaW50IHNtY3RyX3dhaXRfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl93YWl0X3doaWxlX2NidXN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjZGVmaW5lIFRPXzI1Nl9CWVRFX0JPVU5EUlkoWCkgICgoKFggKyAweGZmKSAmIDB4ZmYwMCkgLSBYKQorI2RlZmluZSBUT19QQVJBR1JBUEhfQk9VTkRSWShYKSAoKChYICsgMHgwZikgJiAweGZmZjApIC0gWCkKKyNkZWZpbmUgUEFSQUdSQVBIX0JPVU5EUlkoWCkgICAgc21jdHJfbWFsbG9jKGRldiwgVE9fUEFSQUdSQVBIX0JPVU5EUlkoWCkpCisKKy8qIEFsbG9jYXRlIEFkYXB0ZXIgU2hhcmVkIE1lbW9yeS4KKyAqIElNUE9SVEFOVCBOT1RFOiBBbnkgY2hhbmdlcyB0byB0aGlzIGZ1bmN0aW9uIE1VU1QgYmUgbWlycm9yZWQgaW4gdGhlCisgKiBmdW5jdGlvbiAiZ2V0X251bV9yeF9iZGJzIiBiZWxvdyEhIQorICoKKyAqIE9yZGVyIG9mIG1lbW9yeSBhbGxvY2F0aW9uOgorICoKKyAqICAgICAgIDAuIEluaXRpYWwgU3lzdGVtIENvbmZpZ3VyYXRpb24gQmxvY2sgUG9pbnRlcgorICogICAgICAgMS4gU3lzdGVtIENvbmZpZ3VyYXRpb24gQmxvY2sKKyAqICAgICAgIDIuIFN5c3RlbSBDb250cm9sIEJsb2NrCisgKiAgICAgICAzLiBBY3Rpb24gQ29tbWFuZCBCbG9jaworICogICAgICAgNC4gSW50ZXJydXB0IFN0YXR1cyBCbG9jaworICoKKyAqICAgICAgIDUuIE1BQyBUWCBGQ0InUworICogICAgICAgNi4gTk9OLU1BQyBUWCBGQ0InUworICogICAgICAgNy4gTUFDIFRYIEJEQidTCisgKiAgICAgICA4LiBOT04tTUFDIFRYIEJEQidTCisgKiAgICAgICA5LiBNQUMgUlggRkNCJ1MKKyAqICAgICAgMTAuIE5PTi1NQUMgUlggRkNCJ1MKKyAqICAgICAgMTEuIE1BQyBSWCBCREInUworICogICAgICAxMi4gTk9OLU1BQyBSWCBCREInUworICogICAgICAxMy4gTUFDIFRYIERhdGEgQnVmZmVyKCAxLCAyNTYgYnl0ZSBidWZmZXIpCisgKiAgICAgIDE0LiBNQUMgUlggRGF0YSBCdWZmZXIoIDEsIDI1NiBieXRlIGJ1ZmZlcikKKyAqCisgKiAgICAgIDE1LiBOT04tTUFDIFRYIERhdGEgQnVmZmVyCisgKiAgICAgIDE2LiBOT04tTUFDIFJYIERhdGEgQnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgc21jdHJfYWxsb2Nfc2hhcmVkX21lbW9yeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2FsbG9jX3NoYXJlZF9tZW1vcnlcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgLyogQWxsb2NhdGUgaW5pdGlhbCBTeXN0ZW0gQ29udHJvbCBCbG9jayBwb2ludGVyLgorICAgICAgICAgKiBUaGlzIHBvaW50ZXIgaXMgbG9jYXRlZCBpbiB0aGUgbGFzdCBwYWdlLCBsYXN0IG9mZnNldCAtIDQuCisgICAgICAgICAqLworICAgICAgICB0cC0+aXNjcGJfcHRyID0gKElTQ1BCbG9jayAqKSh0cC0+cmFtX2FjY2VzcyArICgoX191MzIpNjQgKiAweDQwMCkKKyAgICAgICAgICAgICAgICAtIChsb25nKUlTQ1BfQkxPQ0tfU0laRSk7CisKKyAgICAgICAgLyogQWxsb2NhdGUgU3lzdGVtIENvbnRyb2wgQmxvY2tzLiAqLworICAgICAgICB0cC0+c2NnYl9wdHIgPSAoU0NHQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LCBzaXplb2YoU0NHQmxvY2spKTsKKyAgICAgICAgUEFSQUdSQVBIX0JPVU5EUlkodHAtPnNoX21lbV91c2VkKTsKKworICAgICAgICB0cC0+c2NsYl9wdHIgPSAoU0NMQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LCBzaXplb2YoU0NMQmxvY2spKTsKKyAgICAgICAgUEFSQUdSQVBIX0JPVU5EUlkodHAtPnNoX21lbV91c2VkKTsKKworICAgICAgICB0cC0+YWNiX2hlYWQgPSAoQUNCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEFDQmxvY2spKnRwLT5udW1fYWNicyk7CisgICAgICAgIFBBUkFHUkFQSF9CT1VORFJZKHRwLT5zaF9tZW1fdXNlZCk7CisKKyAgICAgICAgdHAtPmlzYl9wdHIgPSAoSVNCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsIHNpemVvZihJU0Jsb2NrKSk7CisgICAgICAgIFBBUkFHUkFQSF9CT1VORFJZKHRwLT5zaF9tZW1fdXNlZCk7CisKKyAgICAgICAgdHAtPm1pc2NfY29tbWFuZF9kYXRhID0gKF9fdTE2ICopc21jdHJfbWFsbG9jKGRldiwgTUlTQ19EQVRBX1NJWkUpOworICAgICAgICBQQVJBR1JBUEhfQk9VTkRSWSh0cC0+c2hfbWVtX3VzZWQpOworCisgICAgICAgIC8qIEFsbG9jYXRlIHRyYW5zbWl0IEZDQnMuICovCisgICAgICAgIHRwLT50eF9mY2JfaGVhZFtNQUNfUVVFVUVdID0gKEZDQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LAorICAgICAgICAgICAgICAgIHNpemVvZihGQ0Jsb2NrKSAqIHRwLT5udW1fdHhfZmNic1tNQUNfUVVFVUVdKTsKKworICAgICAgICB0cC0+dHhfZmNiX2hlYWRbTk9OX01BQ19RVUVVRV0gPSAoRkNCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZDQmxvY2spICogdHAtPm51bV90eF9mY2JzW05PTl9NQUNfUVVFVUVdKTsKKworICAgICAgICB0cC0+dHhfZmNiX2hlYWRbQlVHX1FVRVVFXSA9IChGQ0Jsb2NrICopc21jdHJfbWFsbG9jKGRldiwKKyAgICAgICAgICAgICAgICBzaXplb2YoRkNCbG9jaykgKiB0cC0+bnVtX3R4X2ZjYnNbQlVHX1FVRVVFXSk7CisKKyAgICAgICAgLyogQWxsb2NhdGUgdHJhbnNtaXQgQkRCcy4gKi8KKyAgICAgICAgdHAtPnR4X2JkYl9oZWFkW01BQ19RVUVVRV0gPSAoQkRCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEJEQmxvY2spICogdHAtPm51bV90eF9iZGJzW01BQ19RVUVVRV0pOworCisgICAgICAgIHRwLT50eF9iZGJfaGVhZFtOT05fTUFDX1FVRVVFXSA9IChCREJsb2NrICopc21jdHJfbWFsbG9jKGRldiwKKyAgICAgICAgICAgICAgICBzaXplb2YoQkRCbG9jaykgKiB0cC0+bnVtX3R4X2JkYnNbTk9OX01BQ19RVUVVRV0pOworCisgICAgICAgIHRwLT50eF9iZGJfaGVhZFtCVUdfUVVFVUVdID0gKEJEQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LAorICAgICAgICAgICAgICAgIHNpemVvZihCREJsb2NrKSAqIHRwLT5udW1fdHhfYmRic1tCVUdfUVVFVUVdKTsKKworICAgICAgICAvKiBBbGxvY2F0ZSByZWNlaXZlIEZDQnMuICovCisgICAgICAgIHRwLT5yeF9mY2JfaGVhZFtNQUNfUVVFVUVdID0gKEZDQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LAorICAgICAgICAgICAgICAgIHNpemVvZihGQ0Jsb2NrKSAqIHRwLT5udW1fcnhfZmNic1tNQUNfUVVFVUVdKTsKKworICAgICAgICB0cC0+cnhfZmNiX2hlYWRbTk9OX01BQ19RVUVVRV0gPSAoRkNCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZDQmxvY2spICogdHAtPm51bV9yeF9mY2JzW05PTl9NQUNfUVVFVUVdKTsKKworICAgICAgICAvKiBBbGxvY2F0ZSByZWNlaXZlIEJEQnMuICovCisgICAgICAgIHRwLT5yeF9iZGJfaGVhZFtNQUNfUVVFVUVdID0gKEJEQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LAorICAgICAgICAgICAgICAgIHNpemVvZihCREJsb2NrKSAqIHRwLT5udW1fcnhfYmRic1tNQUNfUVVFVUVdKTsKKworICAgICAgICB0cC0+cnhfYmRiX2VuZFtNQUNfUVVFVUVdID0gKEJEQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LCAwKTsKKworICAgICAgICB0cC0+cnhfYmRiX2hlYWRbTk9OX01BQ19RVUVVRV0gPSAoQkRCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEJEQmxvY2spICogdHAtPm51bV9yeF9iZGJzW05PTl9NQUNfUVVFVUVdKTsKKworICAgICAgICB0cC0+cnhfYmRiX2VuZFtOT05fTUFDX1FVRVVFXSA9IChCREJsb2NrICopc21jdHJfbWFsbG9jKGRldiwgMCk7CisKKyAgICAgICAgLyogQWxsb2NhdGUgTUFDIHRyYW5zbWl0IGJ1ZmZlcnMuCisgICAgICAgICAqIE1BQyBUeCBCdWZmZXJzIGRvZW4ndCBoYXZlIHRvIGJlIG9uIGFuIE9ERCBCb3VuZHJ5LgorICAgICAgICAgKi8KKyAgICAgICAgdHAtPnR4X2J1ZmZfaGVhZFtNQUNfUVVFVUVdCisgICAgICAgICAgICAgICAgPSAoX191MTYgKilzbWN0cl9tYWxsb2MoZGV2LCB0cC0+dHhfYnVmZl9zaXplW01BQ19RVUVVRV0pOworICAgICAgICB0cC0+dHhfYnVmZl9jdXJyW01BQ19RVUVVRV0gPSB0cC0+dHhfYnVmZl9oZWFkW01BQ19RVUVVRV07CisgICAgICAgIHRwLT50eF9idWZmX2VuZCBbTUFDX1FVRVVFXSA9IChfX3UxNiAqKXNtY3RyX21hbGxvYyhkZXYsIDApOworCisgICAgICAgIC8qIEFsbG9jYXRlIEJVRyB0cmFuc21pdCBidWZmZXJzLiAqLworICAgICAgICB0cC0+dHhfYnVmZl9oZWFkW0JVR19RVUVVRV0KKyAgICAgICAgICAgICAgICA9IChfX3UxNiAqKXNtY3RyX21hbGxvYyhkZXYsIHRwLT50eF9idWZmX3NpemVbQlVHX1FVRVVFXSk7CisgICAgICAgIHRwLT50eF9idWZmX2N1cnJbQlVHX1FVRVVFXSA9IHRwLT50eF9idWZmX2hlYWRbQlVHX1FVRVVFXTsKKyAgICAgICAgdHAtPnR4X2J1ZmZfZW5kW0JVR19RVUVVRV0gPSAoX191MTYgKilzbWN0cl9tYWxsb2MoZGV2LCAwKTsKKworICAgICAgICAvKiBBbGxvY2F0ZSBNQUMgcmVjZWl2ZSBkYXRhIGJ1ZmZlcnMuCisgICAgICAgICAqIE1BQyBSeCBidWZmZXIgZG9lc24ndCBoYXZlIHRvIGJlIG9uIGEgMjU2IGJ5dGUgYm91bmRhcnkuCisgICAgICAgICAqLworICAgICAgICB0cC0+cnhfYnVmZl9oZWFkW01BQ19RVUVVRV0gPSAoX191MTYgKilzbWN0cl9tYWxsb2MoZGV2LAorICAgICAgICAgICAgICAgIFJYX0RBVEFfQlVGRkVSX1NJWkUgKiB0cC0+bnVtX3J4X2JkYnNbTUFDX1FVRVVFXSk7CisgICAgICAgIHRwLT5yeF9idWZmX2VuZFtNQUNfUVVFVUVdID0gKF9fdTE2ICopc21jdHJfbWFsbG9jKGRldiwgMCk7CisKKyAgICAgICAgLyogQWxsb2NhdGUgTm9uLU1BQyB0cmFuc21pdCBidWZmZXJzLgorICAgICAgICAgKiA/PyBGb3IgbWF4aW11bSBOZXR3YXJlIHBlcmZvcm1hbmNlLCBwdXQgVHggQnVmZmVycyBvbgorICAgICAgICAgKiBPREQgQm91bmRyeSBhbmQgdGhlbiByZXN0b3JlIG1hbGxvYyB0byBFdmVuIEJvdW5kcnlzLgorICAgICAgICAgKi8KKyAgICAgICAgc21jdHJfbWFsbG9jKGRldiwgMUwpOworICAgICAgICB0cC0+dHhfYnVmZl9oZWFkW05PTl9NQUNfUVVFVUVdCisgICAgICAgICAgICAgICAgPSAoX191MTYgKilzbWN0cl9tYWxsb2MoZGV2LCB0cC0+dHhfYnVmZl9zaXplW05PTl9NQUNfUVVFVUVdKTsKKyAgICAgICAgdHAtPnR4X2J1ZmZfY3VycltOT05fTUFDX1FVRVVFXSA9IHRwLT50eF9idWZmX2hlYWRbTk9OX01BQ19RVUVVRV07CisgICAgICAgIHRwLT50eF9idWZmX2VuZCBbTk9OX01BQ19RVUVVRV0gPSAoX191MTYgKilzbWN0cl9tYWxsb2MoZGV2LCAwKTsKKyAgICAgICAgc21jdHJfbWFsbG9jKGRldiwgMUwpOworCisgICAgICAgIC8qIEFsbG9jYXRlIE5vbi1NQUMgcmVjZWl2ZSBkYXRhIGJ1ZmZlcnMuCisgICAgICAgICAqIFRvIGd1YXJhbnRlZSBhIG1pbmltdW0gb2YgMjU2IGNvbnRpZ291cyBtZW1vcnkgdG8KKyAgICAgICAgICogVU1fUmVjZWl2ZV9QYWNrZXQncyBsb29rYWhlYWQgcG9pbnRlciwgYmVmb3JlIGEgcGFnZQorICAgICAgICAgKiBjaGFuZ2Ugb3IgcmluZyBlbmQgaXMgZW5jb3VudGVyZWQsIHBsYWNlIGVhY2ggcnggYnVmZmVyIG9uCisgICAgICAgICAqIGEgMjU2IGJ5dGUgYm91bmRhcnkuCisgICAgICAgICAqLworICAgICAgICBzbWN0cl9tYWxsb2MoZGV2LCBUT18yNTZfQllURV9CT1VORFJZKHRwLT5zaF9tZW1fdXNlZCkpOworICAgICAgICB0cC0+cnhfYnVmZl9oZWFkW05PTl9NQUNfUVVFVUVdID0gKF9fdTE2ICopc21jdHJfbWFsbG9jKGRldiwKKyAgICAgICAgICAgICAgICBSWF9EQVRBX0JVRkZFUl9TSVpFICogdHAtPm51bV9yeF9iZGJzW05PTl9NQUNfUVVFVUVdKTsKKyAgICAgICAgdHAtPnJ4X2J1ZmZfZW5kW05PTl9NQUNfUVVFVUVdID0gKF9fdTE2ICopc21jdHJfbWFsbG9jKGRldiwgMCk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworLyogRW50ZXIgQnlwYXNzIHN0YXRlLiAqLworc3RhdGljIGludCBzbWN0cl9ieXBhc3Nfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgaW50IGVycjsKKworCWlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2J5cGFzc19zdGF0ZVxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBlcnIgPSBzbWN0cl9zZXR1cF9zaW5nbGVfY21kKGRldiwgQUNCX0NNRF9DSEFOR0VfSk9JTl9TVEFURSwgSlNfQllQQVNTX1NUQVRFKTsKKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfY2hlY2tzdW1fZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBfX3UxNiBpLCBjaGVja3N1bSA9IDA7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2NoZWNrc3VtX2Zpcm13YXJlXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHNtY3RyX2VuYWJsZV9hZGFwdGVyX2N0cmxfc3RvcmUoZGV2KTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCBDU19SQU1fU0laRTsgaSArPSAyKQorICAgICAgICAgICAgICAgIGNoZWNrc3VtICs9ICooKF9fdTE2ICopKHRwLT5yYW1fYWNjZXNzICsgaSkpOworCisgICAgICAgIHRwLT5taWNyb2NvZGVfdmVyc2lvbiA9ICooX191MTYgKikodHAtPnJhbV9hY2Nlc3MKKyAgICAgICAgICAgICAgICArIENTX1JBTV9WRVJTSU9OX09GRlNFVCk7CisgICAgICAgIHRwLT5taWNyb2NvZGVfdmVyc2lvbiA+Pj0gODsKKworICAgICAgICBzbWN0cl9kaXNhYmxlX2FkYXB0ZXJfY3RybF9zdG9yZShkZXYpOworCisgICAgICAgIGlmKGNoZWNrc3VtKQorICAgICAgICAgICAgICAgIHJldHVybiAoY2hlY2tzdW0pOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNtY3RyX2Noa19tY2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBDT05GSUdfTUNBX0xFR0FDWQorCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgY3VycmVudF9zbG90OworCV9fdTggcjEsIHIyLCByMywgcjQsIHI1OworCisJY3VycmVudF9zbG90ID0gbWNhX2ZpbmRfdW51c2VkX2FkYXB0ZXIoc21jdHJfcG9zaWQsIDApOworCWlmKGN1cnJlbnRfc2xvdCA9PSBNQ0FfTk9URk9VTkQpCisJCXJldHVybiAoLUVOT0RFVik7CisKKwltY2Ffc2V0X2FkYXB0ZXJfbmFtZShjdXJyZW50X3Nsb3QsIHNtY3RyX25hbWUpOworCW1jYV9tYXJrX2FzX3VzZWQoY3VycmVudF9zbG90KTsKKwl0cC0+c2xvdF9udW0gPSBjdXJyZW50X3Nsb3Q7CisKKwlyMSA9IG1jYV9yZWFkX3N0b3JlZF9wb3ModHAtPnNsb3RfbnVtLCAyKTsKKwlyMiA9IG1jYV9yZWFkX3N0b3JlZF9wb3ModHAtPnNsb3RfbnVtLCAzKTsKKworCWlmKHRwLT5zbG90X251bSkKKwkJb3V0YihDTkZHX1BPU19DT05UUk9MX1JFRywgKF9fdTgpKCh0cC0+c2xvdF9udW0gLSAxKSB8IENORkdfU0xPVF9FTkFCTEVfQklUKSk7CisJZWxzZQorCQlvdXRiKENORkdfUE9TX0NPTlRST0xfUkVHLCAoX191OCkoKHRwLT5zbG90X251bSkgfCBDTkZHX1NMT1RfRU5BQkxFX0JJVCkpOworCisJcjEgPSBpbmIoQ05GR19QT1NfUkVHMSk7CisJcjIgPSBpbmIoQ05GR19QT1NfUkVHMCk7CisKKwl0cC0+YmljX3R5cGUgPSBCSUNfNTk0X0NISVA7CisKKwkvKiBJTyAqLworCXIyID0gbWNhX3JlYWRfc3RvcmVkX3Bvcyh0cC0+c2xvdF9udW0sIDIpOworCXIyICY9IDB4RjA7CisJZGV2LT5iYXNlX2FkZHIgPSAoKF9fdTE2KXIyIDw8IDgpICsgKF9fdTE2KTB4ODAwOworCXJlcXVlc3RfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTTUNUUl9JT19FWFRFTlQsIHNtY3RyX25hbWUpOworCisJLyogSVJRICovCisJcjUgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHRwLT5zbG90X251bSwgNSk7CisJcjUgJj0gMHhDOworICAgICAgICBzd2l0Y2gocjUpCisJeworICAgICAgICAgICAgCWNhc2UgMDoKKwkJCWRldi0+aXJxID0gMzsKKyAgICAgICAgICAgICAgIAkJYnJlYWs7CisKKyAgICAgICAgICAgIAljYXNlIDB4NDoKKwkJCWRldi0+aXJxID0gNDsKKyAgICAgICAgICAgICAgIAkJYnJlYWs7CisKKyAgICAgICAgICAgIAljYXNlIDB4ODoKKwkJCWRldi0+aXJxID0gMTA7CisgICAgICAgICAgICAgICAJCWJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKwkJCWRldi0+aXJxID0gMTU7CisgICAgICAgICAgICAgICAJCWJyZWFrOworCX0KKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIHNtY3RyX2ludGVycnVwdCwgU0FfU0hJUlEsIHNtY3RyX25hbWUsIGRldikpIHsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNNQ1RSX0lPX0VYVEVOVCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEdldCBSQU0gYmFzZSAqLworCXIzID0gbWNhX3JlYWRfc3RvcmVkX3Bvcyh0cC0+c2xvdF9udW0sIDMpOworCXRwLT5yYW1fYmFzZSA9ICgoX191MzIpKHIzICYgMHg3KSA8PCAxMykgKyAweDBDMDAwMDsKKwlpZiAocjMgJiAweDgpCisJCXRwLT5yYW1fYmFzZSArPSAweDAxMDAwMDsKKwlpZiAocjMgJiAweDgwKQorCQl0cC0+cmFtX2Jhc2UgKz0gMHhGMDAwMDA7CisKKwkvKiBHZXQgUmFtIFNpemUgKi8KKwlyMyAmPSAweDMwOworCXIzID4+PSA0OworCisJdHAtPnJhbV91c2FibGUgPSAoX191MTYpQ05GR19TSVpFXzhLQiA8PCByMzsKKwl0cC0+cmFtX3NpemUgPSAoX191MTYpQ05GR19TSVpFXzY0S0I7CisJdHAtPmJvYXJkX2lkIHw9IFRPS0VOX01FRElBOworCisJcjQgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHRwLT5zbG90X251bSwgNCk7CisJdHAtPnJvbV9iYXNlID0gKChfX3UzMikocjQgJiAweDcpIDw8IDEzKSArIDB4MEMwMDAwOworCWlmIChyNCAmIDB4OCkKKwkJdHAtPnJvbV9iYXNlICs9IDB4MDEwMDAwOworCisJLyogR2V0IFJPTSBzaXplLiAqLworCXI0ID4+PSA0OworCXN3aXRjaCAocjQpIHsKKwkJY2FzZSAwOgorCQkJdHAtPnJvbV9zaXplID0gQ05GR19TSVpFXzhLQjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl0cC0+cm9tX3NpemUgPSBDTkZHX1NJWkVfMTZLQjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQl0cC0+cm9tX3NpemUgPSBDTkZHX1NJWkVfMzJLQjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdHAtPnJvbV9zaXplID0gUk9NX0RJU0FCTEU7CisJfQorCisJLyogR2V0IE1lZGlhIFR5cGUuICovCisJcjUgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHRwLT5zbG90X251bSwgNSk7CisJcjUgJj0gQ05GR19NRURJQV9UWVBFX01BU0s7CisJc3dpdGNoKHI1KQorCXsKKwkJY2FzZSAoMCk6CisJCQl0cC0+bWVkaWFfdHlwZSA9IE1FRElBX1NUUF80OworCQkJYnJlYWs7CisKKwkJY2FzZSAoMSk6CisJCQl0cC0+bWVkaWFfdHlwZSA9IE1FRElBX1NUUF8xNjsKKwkJCWJyZWFrOworCisJCWNhc2UgKDMpOgorCQkJdHAtPm1lZGlhX3R5cGUgPSBNRURJQV9VVFBfMTY7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJdHAtPm1lZGlhX3R5cGUgPSBNRURJQV9VVFBfNDsKKwkJCWJyZWFrOworCX0KKwl0cC0+bWVkaWFfbWVudSA9IDE0OworCisJcjIgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHRwLT5zbG90X251bSwgMik7CisJaWYoIShyMiAmIDB4MDIpKQorCQl0cC0+bW9kZV9iaXRzIHw9IEVBUkxZX1RPS0VOX1JFTDsKKworCS8qIERpc2FibGUgc2xvdCAqLworCW91dGIoQ05GR19QT1NfQ09OVFJPTF9SRUcsIDApOworCisJdHAtPmJvYXJkX2lkID0gc21jdHJfZ2V0X2JvYXJkaWQoZGV2LCAxKTsKKwlzd2l0Y2godHAtPmJvYXJkX2lkICYgMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBXRDgxMTVUQToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX21vZGVsID0gIjgxMTVUL0EiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFdEODExNVQ6CisJCQlpZih0cC0+ZXh0cmFfaW5mbyAmIENISVBfUkVWX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX21vZGVsID0gIjgxMTVUIHJldiBYRSI7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX21vZGVsID0gIjgxMTVUIHJldiBYRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9tb2RlbCA9ICJVbmtub3duIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKwlyZXR1cm4gKDApOworI2Vsc2UKKwlyZXR1cm4gKC0xKTsKKyNlbmRpZiAvKiBDT05GSUdfTUNBX0xFR0FDWSAqLworfQorCitzdGF0aWMgaW50IHNtY3RyX2NoZ19yeF9tYXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGVyciA9IDA7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9jaGdfcnhfbWFza1xuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgc21jdHJfc2V0X3BhZ2UoZGV2LCAoX191OCAqKXRwLT5yYW1fYWNjZXNzKTsKKworICAgICAgICBpZih0cC0+bW9kZV9iaXRzICYgTE9PUElOR19NT0RFX01BU0spCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCB8PSBSWF9PV05fQklUOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCAmPSB+UlhfT1dOX0JJVDsKKworICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgUFJPTUlTQ1VPVVNfTU9ERSkKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwIHw9IFBST01JU0NVT1VTX0JJVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgJj0gflBST01JU0NVT1VTX0JJVDsKKworICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX0VSUl9QQUNLRVRTKQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgfD0gU0FWQkFEX0JJVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgJj0gflNBVkJBRF9CSVQ7CisKKyAgICAgICAgaWYodHAtPnJlY2VpdmVfbWFzayAmIEFDQ0VQVF9BVFRfTUFDX0ZSQU1FUykKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwIHw9IFJYQVRNQUM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwICY9IH5SWEFUTUFDOworCisgICAgICAgIGlmKHRwLT5yZWNlaXZlX21hc2sgJiBBQ0NFUFRfTVVMVElfUFJPTSkKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQxIHw9IE1VTFRJQ0FTVF9BRERSRVNTX0JJVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgJj0gfk1VTFRJQ0FTVF9BRERSRVNTX0JJVDsKKworICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX1NPVVJDRV9ST1VUSU5HX1NQQU5OSU5HKQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgfD0gU09VUkNFX1JPVVRJTkdfU1BBTk5JTkdfQklUUzsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodHAtPnJlY2VpdmVfbWFzayAmIEFDQ0VQVF9TT1VSQ0VfUk9VVElORykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgfD0gU09VUkNFX1JPVVRJTkdfRVhQTE9SRVJfQklUOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgJj0gflNPVVJDRV9ST1VUSU5HX1NQQU5OSU5HX0JJVFM7CisgICAgICAgIH0KKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfd3JpdGVfd29yZF9jbWQoZGV2LCBSV19DT05GSUdfUkVHSVNURVJfMCwKKyAgICAgICAgICAgICAgICAmdHAtPmNvbmZpZ193b3JkMCkpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICB9CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3dyaXRlX3dvcmRfY21kKGRldiwgUldfQ09ORklHX1JFR0lTVEVSXzEsCisgICAgICAgICAgICAgICAgJnRwLT5jb25maWdfd29yZDEpKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNtY3RyX2Rpc2FibGVfMTZiaXQoZGV2KTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2NsZWFyX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgb3V0YigodHAtPnRyY19tYXNrIHwgQ1NSX0NMUlRJTlQpLCBkZXYtPmJhc2VfYWRkciArIENTUik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9jbGVhcl90cmNfcmVzZXQoaW50IGlvYWRkcikKK3sKKyAgICAgICAgX191OCByOworCisgICAgICAgIHIgPSBpbmIoaW9hZGRyICsgTVNSKTsKKyAgICAgICAgb3V0Yih+TVNSX1JTVCAmIHIsIGlvYWRkciArIE1TUik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gc21jdHJfb3BlbigpLgorICovCitzdGF0aWMgaW50IHNtY3RyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyAgICAgICAgaW50IGVycjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwl0cC0+Y2xlYW51cCA9IDE7CisKKyAgICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIGFkYXB0ZXIgaXMgYWxyZWFkeSBpbiBhIGNsb3NlZCBzdGF0ZS4gKi8KKyAgICAgICAgaWYodHAtPnN0YXR1cyAhPSBPUEVOKQorICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisKKyAgICAgICAgc21jdHJfZW5hYmxlXzE2Yml0KGRldik7CisgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgKF9fdTggKil0cC0+cmFtX2FjY2Vzcyk7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3JlbW92ZV9jbWQoZGV2KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICB9CisKKyAgICAgICAgZm9yKDs7KQorICAgICAgICB7CisgICAgICAgICAgICAgICAgc2tiID0gc2tiX2RlcXVldWUoJnRwLT5TZW5kU2tiUXVldWUpOworICAgICAgICAgICAgICAgIGlmKHNrYiA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgdHAtPlF1ZXVlU2tiKys7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYihza2IpOworICAgICAgICB9CisKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2RlY29kZV9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHNob3J0IGJpdCA9IDB4ODAsIHNoaWZ0ID0gMTI7CisgICAgICAgIERFQ09ERV9UUkVFX05PREUgKnRyZWU7CisgICAgICAgIHNob3J0IGJyYW5jaCwgdHNpemU7CisgICAgICAgIF9fdTE2IGJ1ZmYgPSAwOworICAgICAgICBsb25nIHdlaWdodDsKKyAgICAgICAgX191OCAqdWNvZGU7CisgICAgICAgIF9fdTE2ICptZW07CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2RlY29kZV9maXJtd2FyZVxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICB3ZWlnaHQgID0gKihsb25nICopKHRwLT5wdHJfdWNvZGUgKyBXRUlHSFRfT0ZGU0VUKTsKKyAgICAgICAgdHNpemUgICA9ICooX191OCAqKSh0cC0+cHRyX3Vjb2RlICsgVFJFRV9TSVpFX09GRlNFVCk7CisgICAgICAgIHRyZWUgICAgPSAoREVDT0RFX1RSRUVfTk9ERSAqKSh0cC0+cHRyX3Vjb2RlICsgVFJFRV9PRkZTRVQpOworICAgICAgICB1Y29kZSAgID0gKF9fdTggKikodHAtPnB0cl91Y29kZSArIFRSRUVfT0ZGU0VUCisgICAgICAgICAgICAgICAgICAgICAgICArICh0c2l6ZSAqIHNpemVvZihERUNPREVfVFJFRV9OT0RFKSkpOworICAgICAgICBtZW0gICAgID0gKF9fdTE2ICopKHRwLT5yYW1fYWNjZXNzKTsKKworICAgICAgICB3aGlsZSh3ZWlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmFuY2ggPSBST09UOworICAgICAgICAgICAgICAgIHdoaWxlKCh0cmVlICsgYnJhbmNoKS0+dGFnICE9IExFQUYgJiYgd2VpZ2h0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaCA9ICp1Y29kZSAmIGJpdCA/ICh0cmVlICsgYnJhbmNoKS0+bGxpbmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAodHJlZSArIGJyYW5jaCktPnJsaW5rOworCisgICAgICAgICAgICAgICAgICAgICAgICBiaXQgPj49IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQtLTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoYml0ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCA9IDB4ODA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjb2RlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnVmZiB8PSAodHJlZSArIGJyYW5jaCktPmluZm8gPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgc2hpZnQgLT0gNDsKKworICAgICAgICAgICAgICAgIGlmKHNoaWZ0IDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqKG1lbSsrKSA9IFNXQVBfQllURVMoYnVmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmICAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ICAgPSAxMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgZm9sbG93aW5nIGFzc3VtZXMgdGhlIENvbnRyb2wgU3RvcmUgTWVtb3J5IGhhcworICAgICAgICAgKiBiZWVuIGluaXRpYWxpemVkIHRvIHplcm8uIElmIHRoZSBsYXN0IHBhcnRpYWwgd29yZAorICAgICAgICAgKiBpcyB6ZXJvLCBpdCB3aWxsIG5vdCBiZSB3cml0dGVuLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoYnVmZikKKyAgICAgICAgICAgICAgICAqKG1lbSsrKSA9IFNXQVBfQllURVMoYnVmZik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9kaXNhYmxlXzE2Yml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHJldHVybiAoMCk7Cit9CisKKy8qCisgKiBPbiBFeGl0LCBBZGFwdGVyIGlzOgorICogMS4gVFJDIGlzIGluIGEgcmVzZXQgc3RhdGUgYW5kIHVuLWluaXRpYWxpemVkLgorICogMi4gQWRhcHRlciBtZW1vcnkgaXMgZW5hYmxlZC4KKyAqIDMuIENvbnRyb2wgU3RvcmUgbWVtb3J5IGlzIG91dCBvZiBjb250ZXh0ICgtV0NTUyBpcyAxKS4KKyAqLworc3RhdGljIGludCBzbWN0cl9kaXNhYmxlX2FkYXB0ZXJfY3RybF9zdG9yZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfZGlzYWJsZV9hZGFwdGVyX2N0cmxfc3RvcmVcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgdHAtPnRyY19tYXNrIHw9IENTUl9XQ1NTOworICAgICAgICBvdXRiKHRwLT50cmNfbWFzaywgaW9hZGRyICsgQ1NSKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2Rpc2FibGVfYmljX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgICAgICB0cC0+dHJjX21hc2sgPSBDU1JfTVNLX0FMTCB8IENTUl9NU0tDQlVTWQorCSAgICAgICAgfCBDU1JfTVNLVElOVCB8IENTUl9XQ1NTOworICAgICAgICBvdXRiKHRwLT50cmNfbWFzaywgaW9hZGRyICsgQ1NSKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2VuYWJsZV8xNmJpdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIF9fdTggICAgcjsKKworICAgICAgICBpZih0cC0+YWRhcHRlcl9idXMgPT0gQlVTX0lTQTE2X1RZUEUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByID0gaW5iKGRldi0+YmFzZV9hZGRyICsgTEFBUik7CisgICAgICAgICAgICAgICAgb3V0YigociB8IExBQVJfTUVNMTZFTkIpLCBkZXYtPmJhc2VfYWRkciArIExBQVIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFRvIGVuYWJsZSB0aGUgYWRhcHRlciBjb250cm9sIHN0b3JlIG1lbW9yeToKKyAqIDEuIEFkYXB0ZXIgbXVzdCBiZSBpbiBhIFJFU0VUIHN0YXRlLgorICogMi4gQWRhcHRlciBtZW1vcnkgbXVzdCBiZSBlbmFibGVkLgorICogMy4gQ29udHJvbCBTdG9yZSBNZW1vcnkgaXMgaW4gY29udGV4dCAoLVdDU1MgaXMgMCkuCisgKi8KK3N0YXRpYyBpbnQgc21jdHJfZW5hYmxlX2FkYXB0ZXJfY3RybF9zdG9yZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfZW5hYmxlX2FkYXB0ZXJfY3RybF9zdG9yZVxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBzbWN0cl9zZXRfdHJjX3Jlc2V0KGlvYWRkcik7CisgICAgICAgIHNtY3RyX2VuYWJsZV9hZGFwdGVyX3JhbShkZXYpOworCisgICAgICAgIHRwLT50cmNfbWFzayAmPSB+Q1NSX1dDU1M7CisgICAgICAgIG91dGIodHAtPnRyY19tYXNrLCBpb2FkZHIgKyBDU1IpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfZW5hYmxlX2FkYXB0ZXJfcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAgICAgX191OCByOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9lbmFibGVfYWRhcHRlcl9yYW1cbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgciA9IGluYihpb2FkZHIgKyBNU1IpOworICAgICAgICBvdXRiKE1TUl9NRU1CIHwgciwgaW9hZGRyICsgTVNSKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2VuYWJsZV9iaWNfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgICAgICBfX3U4IHI7CisKKyAgICAgICAgc3dpdGNoKHRwLT5iaWNfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgKEJJQ181ODRfQ0hJUCk6CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHJjX21hc2sgPSBDU1JfTVNLQ0JVU1kgfCBDU1JfV0NTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGIodHAtPnRyY19tYXNrLCBpb2FkZHIgKyBDU1IpOworICAgICAgICAgICAgICAgICAgICAgICAgciA9IGluYihpb2FkZHIgKyBJUlIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0YihyIHwgSVJSX0lFTiwgaW9hZGRyICsgSVJSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAoQklDXzU5NF9DSElQKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT50cmNfbWFzayA9IENTUl9NU0tDQlVTWSB8IENTUl9XQ1NTOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0Yih0cC0+dHJjX21hc2ssIGlvYWRkciArIENTUik7CisgICAgICAgICAgICAgICAgICAgICAgICByID0gaW5iKGlvYWRkciArIElNQ0NSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGIociB8IElNQ0NSX0VJTCwgaW9hZGRyICsgSU1DQ1IpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzbWN0cl9jaGtfaXNhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgICAgICBfX3U4IHIxLCByMiwgYiwgY2hrc3VtID0gMDsKKyAgICAgICAgX191MTYgcjsKKwlpbnQgaTsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfY2hrX2lzYSAlIzR4XG4iLCBkZXYtPm5hbWUsIGlvYWRkcik7CisKKwlpZigoaW9hZGRyICYgMHgxRikgIT0gMCkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAvKiBHcmFiIHRoZSByZWdpb24gc28gdGhhdCBubyBvbmUgZWxzZSB0cmllcyB0byBwcm9iZSBvdXIgaW9wb3J0cy4gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgU01DVFJfSU9fRVhURU5ULCBzbWN0cl9uYW1lKSkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworICAgICAgICAvKiBDaGVja3N1bSBTTUMgbm9kZSBhZGRyZXNzICovCisgICAgICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGIgPSBpbmIoaW9hZGRyICsgTEFSMCArIGkpOworICAgICAgICAgICAgICAgIGNoa3N1bSArPSBiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoa3N1bSAhPSBOT0RFX0FERFJfQ0tTVU0pCisgICAgICAgICAgICAgICAgZ290byBvdXQyOworCisgICAgICAgIGIgPSBpbmIoaW9hZGRyICsgQkRJRCk7CisJaWYoYiAhPSBCUkRfSURfODExNVQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBUaGUgYWRhcHRlciBmb3VuZCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIGdvdG8gb3V0MjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGZvciA4MTE1VCBCb2FyZCBJRCAqLworICAgICAgICByMiA9IDA7CisgICAgICAgIGZvcihyID0gMDsgciA8IDg7IHIrKykKKyAgICAgICAgeworICAgICAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgMHg4ICsgcik7CisgICAgICAgICAgICByMiArPSByMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHZhbHVlIG9mIFJlZ0YgYWRkcyB1cCB0aGUgc3VtIHRvIDB4RkYgKi8KKyAgICAgICAgaWYoKHIyICE9IDB4RkYpICYmIChyMiAhPSAweEVFKSkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDI7CisKKyAgICAgICAgLyogR2V0IGFkYXB0ZXIgSUQgKi8KKyAgICAgICAgdHAtPmJvYXJkX2lkID0gc21jdHJfZ2V0X2JvYXJkaWQoZGV2LCAwKTsKKyAgICAgICAgc3dpdGNoKHRwLT5ib2FyZF9pZCAmIDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgV0Q4MTE1VEE6CisgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9tb2RlbCA9ICI4MTE1VC9BIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBXRDgxMTVUOgorCQkJaWYodHAtPmV4dHJhX2luZm8gJiBDSElQX1JFVl9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9tb2RlbCA9ICI4MTE1VCByZXYgWEUiOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9tb2RlbCA9ICI4MTE1VCByZXYgWEQiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfbW9kZWwgPSAiVW5rbm93biI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFN0b3JlIEJJQyB0eXBlLiAqLworICAgICAgICB0cC0+YmljX3R5cGUgPSBCSUNfNTg0X0NISVA7CisgICAgICAgIHRwLT5uaWNfdHlwZSA9IE5JQ184MjVfQ0hJUDsKKworICAgICAgICAvKiBDb3B5IFJhbSBTaXplICovCisgICAgICAgIHRwLT5yYW1fdXNhYmxlICA9IENORkdfU0laRV8xNktCOworICAgICAgICB0cC0+cmFtX3NpemUgICAgPSBDTkZHX1NJWkVfNjRLQjsKKworICAgICAgICAvKiBHZXQgNTh4IFJhbSBCYXNlICovCisgICAgICAgIHIxID0gaW5iKGlvYWRkcik7CisgICAgICAgIHIxICY9IDB4M0Y7CisKKyAgICAgICAgcjIgPSBpbmIoaW9hZGRyICsgQ05GR19MQUFSXzU4NCk7CisgICAgICAgIHIyICY9IENORkdfTEFBUl9NQVNLOworICAgICAgICByMiA8PD0gMzsKKyAgICAgICAgcjIgfD0gKChyMSAmIDB4MzgpID4+IDMpOworCisgICAgICAgIHRwLT5yYW1fYmFzZSA9ICgoX191MzIpcjIgPDwgMTYpICsgKCgoX191MzIpKHIxICYgMHg3KSkgPDwgMTMpOworCisgICAgICAgIC8qIEdldCA1ODQgSXJxICovCisgICAgICAgIHIxID0gMDsKKyAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQ05GR19JQ1JfNTgzKTsKKyAgICAgICAgcjEgJj0gQ05GR19JQ1JfSVIyXzU4NDsKKworICAgICAgICByMiA9IGluYihpb2FkZHIgKyBDTkZHX0lSUl81ODMpOworICAgICAgICByMiAmPSBDTkZHX0lSUl9JUlFTOyAgICAgLyogMHg2MCAqLworICAgICAgICByMiA+Pj0gNTsKKworICAgICAgICBzd2l0Y2gocjIpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBpZihyMSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmlycSA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+aXJxID0gMTA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHIxID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+aXJxID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5pcnEgPSAxMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYocjEgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHAtPmV4dHJhX2luZm8gJiBBTFRFUk5BVEVfSVJRX0JJVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmlycSA9IDU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmlycSA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+aXJxID0gMTU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHIxID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+aXJxID0gNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5pcnEgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogTm8gSVJRIGZvdW5kIGFib3J0aW5nXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQyOworICAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgc21jdHJfaW50ZXJydXB0LCBTQV9TSElSUSwgc21jdHJfbmFtZSwgZGV2KSkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDI7CisKKyAgICAgICAgLyogR2V0IDU4eCBSb20gQmFzZSAqLworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBDTkZHX0JJT181ODMpOworICAgICAgICByMSAmPSAweDNFOworICAgICAgICByMSB8PSAweDQwOworCisgICAgICAgIHRwLT5yb21fYmFzZSA9IChfX3UzMilyMSA8PCAxMzsKKworICAgICAgICAvKiBHZXQgNTh4IFJvbSBTaXplICovCisgICAgICAgIHIxID0gaW5iKGlvYWRkciArIENORkdfQklPXzU4Myk7CisgICAgICAgIHIxICY9IDB4QzA7CisgICAgICAgIGlmKHIxID09IDApCisgICAgICAgICAgICAgICAgdHAtPnJvbV9zaXplID0gUk9NX0RJU0FCTEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHIxID4+PSA2OworICAgICAgICAgICAgICAgIHRwLT5yb21fc2l6ZSA9IChfX3UxNilDTkZHX1NJWkVfOEtCIDw8IHIxOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IDU4eCBCb290IFN0YXR1cyAqLworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBDTkZHX0dQMik7CisKKyAgICAgICAgdHAtPm1vZGVfYml0cyAmPSAofkJPT1RfU1RBVFVTX01BU0spOworCisgICAgICAgIGlmKHIxICYgQ05GR19HUDJfQk9PVF9OSUJCTEUpCisgICAgICAgICAgICAgICAgdHAtPm1vZGVfYml0cyB8PSBCT09UX1RZUEVfMTsKKworICAgICAgICAvKiBHZXQgNTh4IFplcm8gV2FpdCBTdGF0ZSAqLworICAgICAgICB0cC0+bW9kZV9iaXRzICY9ICh+WkVST19XQUlUX1NUQVRFX01BU0spOworCisgICAgICAgIHIxID0gaW5iKGlvYWRkciArIENORkdfSVJSXzU4Myk7CisKKyAgICAgICAgaWYocjEgJiBDTkZHX0lSUl9aV1MpCisgICAgICAgICAgICAgICAgIHRwLT5tb2RlX2JpdHMgfD0gWkVST19XQUlUX1NUQVRFXzhfQklUOworCisgICAgICAgIGlmKHRwLT5ib2FyZF9pZCAmIEJPQVJEXzE2QklUKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQ05GR19MQUFSXzU4NCk7CisKKyAgICAgICAgICAgICAgICBpZihyMSAmIENORkdfTEFBUl9aV1MpCisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9kZV9iaXRzIHw9IFpFUk9fV0FJVF9TVEFURV8xNl9CSVQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQgNTg0IE1lZGlhIE1lbnUgKi8KKyAgICAgICAgdHAtPm1lZGlhX21lbnUgPSAxNDsKKyAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQ05GR19JUlJfNTgzKTsKKworICAgICAgICB0cC0+bW9kZV9iaXRzICY9IDB4ZjhmZjsgICAgICAgLyogKH5DTkZHX0lOVEVSRkFDRV9UWVBFX01BU0spICovCisgICAgICAgIGlmKCh0cC0+Ym9hcmRfaWQgJiBUT0tFTl9NRURJQSkgPT0gVE9LRU5fTUVESUEpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBHZXQgQWR2YW5jZWQgRmVhdHVyZXMgKi8KKyAgICAgICAgICAgICAgICBpZigoKHIxICYgMHg2KSA+PiAxKSA9PSAweDMpCisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bWVkaWFfdHlwZSB8PSBNRURJQV9VVFBfMTY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgocjEgJiAweDYpID4+IDEpID09IDB4MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1lZGlhX3R5cGUgfD0gTUVESUFfU1RQXzE2OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKHIxICYgMHg2KSA+PiAxKSA9PSAweDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1lZGlhX3R5cGUgfD0gTUVESUFfVVRQXzQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tZWRpYV90eXBlIHw9IE1FRElBX1NUUF80OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHIxID0gaW5iKGlvYWRkciArIENORkdfR1AyKTsKKyAgICAgICAgICAgICAgICBpZighKHIxICYgMHgyKSApICAgICAgICAgICAvKiBHUDJfRVRSRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vZGVfYml0cyB8PSBFQVJMWV9UT0tFTl9SRUw7CisKKyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgdGhlIGNoaXAgaXMgY29ycnVwdGVkCisgICAgICAgICAgICAgICAgaWYoc21jdHJfcmVhZF81ODRfY2hrc3VtKGlvYWRkcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogRUVQUk9NIENoZWNrc3VtIEZhaWx1cmVcbiIsIGRldi0+bmFtZSk7CisJCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0MjsKKyAgICAgICAgICAgICAgICB9CisJCSovCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworCitvdXQyOgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgU01DVFJfSU9fRVhURU5UKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzbWN0cl9nZXRfYm9hcmRpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWNhKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAgICAgX191OCByLCByMSwgSWRCeXRlOworICAgICAgICBfX3UxNiBCb2FyZElkTWFzazsKKworICAgICAgICB0cC0+Ym9hcmRfaWQgPSBCb2FyZElkTWFzayA9IDA7CisKKwlpZihtY2EpCisJeworCQlCb2FyZElkTWFzayB8PSAoTUlDUk9DSEFOTkVMK0lOVEVSRkFDRV9DSElQK1RPS0VOX01FRElBK1BBR0VEX1JBTStCT0FSRF8xNkJJVCk7CisJCXRwLT5leHRyYV9pbmZvIHw9IChJTlRFUkZBQ0VfNTk0X0NISVArUkFNX1NJWkVfNjRLK05JQ184MjVfQklUK0FMVEVSTkFURV9JUlFfQklUK1NMT1RfMTZCSVQpOworCX0KKwllbHNlCisJeworICAgICAgICAJQm9hcmRJZE1hc2t8PShJTlRFUkZBQ0VfQ0hJUCtUT0tFTl9NRURJQStQQUdFRF9SQU0rQk9BUkRfMTZCSVQpOworICAgICAgICAJdHAtPmV4dHJhX2luZm8gfD0gKElOVEVSRkFDRV81ODRfQ0hJUCArIFJBTV9TSVpFXzY0SworICAgICAgICAJICAgICAgICArIE5JQ184MjVfQklUICsgQUxURVJOQVRFX0lSUV9CSVQpOworCX0KKworCWlmKCFtY2EpCisJeworICAgICAgICAJciA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworICAgICAgICAJciAmPSAweDBjOworICAgICAgIAkJb3V0YihyLCBpb2FkZHIgKyBCSURfUkVHXzEpOworICAgICAgICAJciA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworCisgICAgICAgIAlpZihyICYgQklEX1NJWFRFRU5fQklUX0JJVCkKKyAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgdHAtPmV4dHJhX2luZm8gfD0gU0xPVF8xNkJJVDsKKyAgICAgICAgCSAgICAgICAgdHAtPmFkYXB0ZXJfYnVzID0gQlVTX0lTQTE2X1RZUEU7CisgICAgICAgIAl9CisgICAgICAgIAllbHNlCisgICAgICAgIAkgICAgICAgIHRwLT5hZGFwdGVyX2J1cyA9IEJVU19JU0E4X1RZUEU7CisJfQorCWVsc2UKKwkJdHAtPmFkYXB0ZXJfYnVzID0gQlVTX01DQV9UWVBFOworCisgICAgICAgIC8qIEdldCBCb2FyZCBJZCBCeXRlICovCisgICAgICAgIElkQnl0ZSA9IGluYihpb2FkZHIgKyBCSURfQk9BUkRfSURfQllURSk7CisKKyAgICAgICAgLyogaWYgTWFqb3IgdmVyc2lvbiA+IDEuMCB0aGVuCisgICAgICAgICAqICAgICAgcmV0dXJuOworICAgICAgICAgKi8KKyAgICAgICAgaWYoSWRCeXRlICYgMHhGOCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworICAgICAgICByMSAmPSBCSURfSUNSX01BU0s7CisgICAgICAgIHIxIHw9IEJJRF9PVEhFUl9CSVQ7CisKKyAgICAgICAgb3V0YihyMSwgaW9hZGRyICsgQklEX1JFR18xKTsKKyAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQklEX1JFR18zKTsKKworICAgICAgICByMSAmPSBCSURfRUFSX01BU0s7CisgICAgICAgIHIxIHw9IEJJRF9FTkdSX1BBR0U7CisKKyAgICAgICAgb3V0YihyMSwgaW9hZGRyICsgQklEX1JFR18zKTsKKyAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQklEX1JFR18xKTsKKyAgICAgICAgcjEgJj0gQklEX0lDUl9NQVNLOworICAgICAgICByMSB8PSAoQklEX1JMQSB8IEJJRF9PVEhFUl9CSVQpOworCisgICAgICAgIG91dGIocjEsIGlvYWRkciArIEJJRF9SRUdfMSk7CisKKyAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQklEX1JFR18xKTsKKyAgICAgICAgd2hpbGUocjEgJiBCSURfUkVDQUxMX0RPTkVfTUFTSykKKyAgICAgICAgICAgICAgICByMSA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworCisgICAgICAgIHIgPSBpbmIoaW9hZGRyICsgQklEX0xBUl8wICsgQklEX1JFR182KTsKKworICAgICAgICAvKiBjbGVhciBjaGlwIHJldiBiaXRzICovCisgICAgICAgIHRwLT5leHRyYV9pbmZvICY9IH5DSElQX1JFVl9NQVNLOworICAgICAgICB0cC0+ZXh0cmFfaW5mbyB8PSAoKHIgJiBCSURfRUVQUk9NX0NISVBfUkVWX01BU0spIDw8IDYpOworCisgICAgICAgIHIxID0gaW5iKGlvYWRkciArIEJJRF9SRUdfMSk7CisgICAgICAgIHIxICY9IEJJRF9JQ1JfTUFTSzsKKyAgICAgICAgcjEgfD0gQklEX09USEVSX0JJVDsKKworICAgICAgICBvdXRiKHIxLCBpb2FkZHIgKyBCSURfUkVHXzEpOworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBCSURfUkVHXzMpOworCisgICAgICAgIHIxICY9IEJJRF9FQVJfTUFTSzsKKyAgICAgICAgcjEgfD0gQklEX0VBNjsKKworICAgICAgICBvdXRiKHIxLCBpb2FkZHIgKyBCSURfUkVHXzMpOworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworCisgICAgICAgIHIxICY9IEJJRF9JQ1JfTUFTSzsKKyAgICAgICAgcjEgfD0gQklEX1JMQTsKKworICAgICAgICBvdXRiKHIxLCBpb2FkZHIgKyBCSURfUkVHXzEpOworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworCisgICAgICAgIHdoaWxlKHIxICYgQklEX1JFQ0FMTF9ET05FX01BU0spCisgICAgICAgICAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQklEX1JFR18xKTsKKworICAgICAgICByZXR1cm4gKEJvYXJkSWRNYXNrKTsKK30KKworc3RhdGljIGludCBzbWN0cl9nZXRfZ3JvdXBfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzbWN0cl9pc3N1ZV9yZWFkX3dvcmRfY21kKGRldiwgUldfSU5ESVZJRFVBTF9HUk9VUF9BRERSKTsKKworICAgICAgICByZXR1cm4oc21jdHJfd2FpdF9jbWQoZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfZ2V0X2Z1bmN0aW9uYWxfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzbWN0cl9pc3N1ZV9yZWFkX3dvcmRfY21kKGRldiwgUldfRlVOQ1RJT05BTF9BRERSKTsKKworICAgICAgICByZXR1cm4oc21jdHJfd2FpdF9jbWQoZGV2KSk7Cit9CisKKy8qIENhbGN1bGF0ZSBudW1iZXIgb2YgTm9uLU1BQyByZWNlaXZlIEJEQidzIGFuZCBkYXRhIGJ1ZmZlcnMuCisgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgc2ltdWxhdGUgYWxsb2NhdGVpbmcgc2hhcmVkIG1lbW9yeSBleGFjdGx5CisgKiBhcyB0aGUgYWxsb2NhdGVfc2hhcmVkX21lbW9yeSBmdW5jdGlvbiBhYm92ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzbWN0cl9nZXRfbnVtX3J4X2JkYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgbWVtX3VzZWQgPSAwOworCisgICAgICAgIC8qIEFsbG9jYXRlIFN5c3RlbSBDb250cm9sIEJsb2Nrcy4gKi8KKyAgICAgICAgbWVtX3VzZWQgKz0gc2l6ZW9mKFNDR0Jsb2NrKTsKKworICAgICAgICBtZW1fdXNlZCArPSBUT19QQVJBR1JBUEhfQk9VTkRSWShtZW1fdXNlZCk7CisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihTQ0xCbG9jayk7CisKKyAgICAgICAgbWVtX3VzZWQgKz0gVE9fUEFSQUdSQVBIX0JPVU5EUlkobWVtX3VzZWQpOworICAgICAgICBtZW1fdXNlZCArPSBzaXplb2YoQUNCbG9jaykgKiB0cC0+bnVtX2FjYnM7CisKKyAgICAgICAgbWVtX3VzZWQgKz0gVE9fUEFSQUdSQVBIX0JPVU5EUlkobWVtX3VzZWQpOworICAgICAgICBtZW1fdXNlZCArPSBzaXplb2YoSVNCbG9jayk7CisKKyAgICAgICAgbWVtX3VzZWQgKz0gVE9fUEFSQUdSQVBIX0JPVU5EUlkobWVtX3VzZWQpOworICAgICAgICBtZW1fdXNlZCArPSBNSVNDX0RBVEFfU0laRTsKKworICAgICAgICAvKiBBbGxvY2F0ZSB0cmFuc21pdCBGQ0Incy4gKi8KKyAgICAgICAgbWVtX3VzZWQgKz0gVE9fUEFSQUdSQVBIX0JPVU5EUlkobWVtX3VzZWQpOworCisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihGQ0Jsb2NrKSAqIHRwLT5udW1fdHhfZmNic1tNQUNfUVVFVUVdOworICAgICAgICBtZW1fdXNlZCArPSBzaXplb2YoRkNCbG9jaykgKiB0cC0+bnVtX3R4X2ZjYnNbTk9OX01BQ19RVUVVRV07CisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihGQ0Jsb2NrKSAqIHRwLT5udW1fdHhfZmNic1tCVUdfUVVFVUVdOworCisgICAgICAgIC8qIEFsbG9jYXRlIHRyYW5zbWl0IEJEQnMuICovCisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihCREJsb2NrKSAqIHRwLT5udW1fdHhfYmRic1tNQUNfUVVFVUVdOworICAgICAgICBtZW1fdXNlZCArPSBzaXplb2YoQkRCbG9jaykgKiB0cC0+bnVtX3R4X2JkYnNbTk9OX01BQ19RVUVVRV07CisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihCREJsb2NrKSAqIHRwLT5udW1fdHhfYmRic1tCVUdfUVVFVUVdOworCisgICAgICAgIC8qIEFsbG9jYXRlIHJlY2VpdmUgRkNCcy4gKi8KKyAgICAgICAgbWVtX3VzZWQgKz0gc2l6ZW9mKEZDQmxvY2spICogdHAtPm51bV9yeF9mY2JzW01BQ19RVUVVRV07CisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihGQ0Jsb2NrKSAqIHRwLT5udW1fcnhfZmNic1tOT05fTUFDX1FVRVVFXTsKKworICAgICAgICAvKiBBbGxvY2F0ZSByZWNlaXZlIEJEQnMuICovCisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihCREJsb2NrKSAqIHRwLT5udW1fcnhfYmRic1tNQUNfUVVFVUVdOworCisgICAgICAgIC8qIEFsbG9jYXRlIE1BQyB0cmFuc21pdCBidWZmZXJzLgorICAgICAgICAgKiBNQUMgdHJhbnNtaXQgYnVmZmVycyBkb24ndCBoYXZlIHRvIGJlIG9uIGFuIE9ERCBCb3VuZHJ5LgorICAgICAgICAgKi8KKyAgICAgICAgbWVtX3VzZWQgKz0gdHAtPnR4X2J1ZmZfc2l6ZVtNQUNfUVVFVUVdOworCisgICAgICAgIC8qIEFsbG9jYXRlIEJVRyB0cmFuc21pdCBidWZmZXJzLiAqLworICAgICAgICBtZW1fdXNlZCArPSB0cC0+dHhfYnVmZl9zaXplW0JVR19RVUVVRV07CisKKyAgICAgICAgLyogQWxsb2NhdGUgTUFDIHJlY2VpdmUgZGF0YSBidWZmZXJzLgorICAgICAgICAgKiBNQUMgcmVjZWl2ZSBidWZmZXJzIGRvbid0IGhhdmUgdG8gYmUgb24gYSAyNTYgYnl0ZSBib3VuZGFyeS4KKyAgICAgICAgICovCisgICAgICAgIG1lbV91c2VkICs9IFJYX0RBVEFfQlVGRkVSX1NJWkUgKiB0cC0+bnVtX3J4X2JkYnNbTUFDX1FVRVVFXTsKKworICAgICAgICAvKiBBbGxvY2F0ZSBOb24tTUFDIHRyYW5zbWl0IGJ1ZmZlcnMuCisgICAgICAgICAqIEZvciBtYXhpbXVtIE5ldHdhcmUgcGVyZm9ybWFuY2UsIHB1dCBUeCBCdWZmZXJzIG9uCisgICAgICAgICAqIE9ERCBCb3VuZHJ5LGFuZCB0aGVuIHJlc3RvcmUgbWFsbG9jIHRvIEV2ZW4gQm91bmRyeXMuCisgICAgICAgICAqLworICAgICAgICBtZW1fdXNlZCArPSAxTDsKKyAgICAgICAgbWVtX3VzZWQgKz0gdHAtPnR4X2J1ZmZfc2l6ZVtOT05fTUFDX1FVRVVFXTsKKyAgICAgICAgbWVtX3VzZWQgKz0gMUw7CisKKyAgICAgICAgLyogQ0FMQ1VMQVRFIE5VTUJFUiBPRiBOT04tTUFDIFJYIEJEQidTCisgICAgICAgICAqIEFORCBOT04tTUFDIFJYIERBVEEgQlVGRkVSUworICAgICAgICAgKgorICAgICAgICAgKiBNYWtlIHN1cmUgdGhlIG1lbV91c2VkIG9mZnNldCBhdCB0aGlzIHBvaW50IGlzIHRoZQorICAgICAgICAgKiBzYW1lIGFzIGluIGFsbG9jYXRlX3NoYXJlZCBtZW1vcnkgb3IgdGhlIGZvbGxvd2luZworICAgICAgICAgKiBib3VuZGFyeSBhZGp1c3RtZW50IHdpbGwgYmUgaW5jb3JyZWN0IChpLmUuIG5vdCBhbGxvY2F0aW5nCisgICAgICAgICAqIHRoZSBub24tbWFjIHJlY2VpdmUgYnVmZmVycyBhYm92ZSBjYW5ub3QgY2hhbmdlIHRoZSAyNTYKKyAgICAgICAgICogYnl0ZSBvZmZzZXQpLgorICAgICAgICAgKgorICAgICAgICAgKiBTaW5jZSB0aGlzIGNhbm5vdCBiZSBndWFyYW50ZWVkLCBhZGRpbmcgdGhlIGZ1bGwgMjU2IGJ5dGVzCisgICAgICAgICAqIHRvIHRoZSBhbW91bnQgb2Ygc2hhcmVkIG1lbW9yeSB1c2VkIGF0IHRoaXMgcG9pbnQgd2lsbCBndWFyYW50ZWVkCisgICAgICAgICAqIHRoYXQgdGhlIHJ4IGRhdGEgYnVmZmVycyBkbyBub3Qgb3ZlcmZsb3cgc2hhcmVkIG1lbW9yeS4KKyAgICAgICAgICovCisgICAgICAgIG1lbV91c2VkICs9IDB4MTAwOworCisgICAgICAgIHJldHVybigoMHhmZmZmIC0gbWVtX3VzZWQpIC8gKFJYX0RBVEFfQlVGRkVSX1NJWkUgKyBzaXplb2YoQkRCbG9jaykpKTsKK30KKworc3RhdGljIGludCBzbWN0cl9nZXRfcGh5c2ljYWxfZHJvcF9udW1iZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc21jdHJfaXNzdWVfcmVhZF93b3JkX2NtZChkZXYsIFJXX1BIWVNJQ0FMX0RST1BfTlVNQkVSKTsKKworICAgICAgICByZXR1cm4oc21jdHJfd2FpdF9jbWQoZGV2KSk7Cit9CisKK3N0YXRpYyBfX3U4ICogc21jdHJfZ2V0X3J4X3BvaW50ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgcXVldWUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgQkRCbG9jayAqYmRiOworCisgICAgICAgIGJkYiA9IChCREJsb2NrICopKChfX3UzMil0cC0+cmFtX2FjY2VzcworICAgICAgICAgICAgICAgICsgKF9fdTMyKSh0cC0+cnhfZmNiX2N1cnJbcXVldWVdLT50cmNfYmRiX3B0cikpOworCisgICAgICAgIHRwLT5yeF9mY2JfY3VycltxdWV1ZV0tPmJkYl9wdHIgPSBiZGI7CisKKyAgICAgICAgcmV0dXJuICgoX191OCAqKWJkYi0+ZGF0YV9ibG9ja19wdHIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2dldF9zdGF0aW9uX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHNtY3RyX2lzc3VlX3JlYWRfd29yZF9jbWQoZGV2LCBSV19JTkRJVklEVUFMX01BQ19BRERSRVNTKTsKKworICAgICAgICByZXR1cm4oc21jdHJfd2FpdF9jbWQoZGV2KSk7Cit9CisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4gVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbgorICogb3IgY2xvc2VkLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNtY3RyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgcmV0dXJuICgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikmdHAtPk1hY1N0YXQpOworfQorCitzdGF0aWMgRkNCbG9jayAqc21jdHJfZ2V0X3R4X2ZjYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiBxdWV1ZSwKKyAgICAgICAgX191MTYgYnl0ZXNfY291bnQpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgRkNCbG9jayAqcEZDQjsKKyAgICAgICAgQkRCbG9jayAqcGJkYjsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgYWxsb2Nfc2l6ZTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgKnRlbXA7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAyMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAic21jdHJfZ2V0X3R4X2ZjYlxuIik7CisKKyAgICAgICAgLyogY2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIEZDQiBibG9ja3MgKi8KKyAgICAgICAgaWYodHAtPm51bV90eF9mY2JzX3VzZWRbcXVldWVdID49IHRwLT5udW1fdHhfZmNic1txdWV1ZV0pCisgICAgICAgICAgICAgICAgcmV0dXJuICgoRkNCbG9jayAqKSgtMUwpKTsKKworICAgICAgICAvKiByb3VuZCBvZmYgdGhlIGlucHV0IHBrdCBzaXplIHRvIHRoZSBuZWFyZXN0IGV2ZW4gbnVtYmVyICovCisgICAgICAgIGFsbG9jX3NpemUgPSAoYnl0ZXNfY291bnQgKyAxKSAmIDB4ZmZmZTsKKworICAgICAgICAvKiBjaGVjayBpZiBlbm91Z2ggbWVtICovCisgICAgICAgIGlmKCh0cC0+dHhfYnVmZl91c2VkW3F1ZXVlXSArIGFsbG9jX3NpemUpID4gdHAtPnR4X2J1ZmZfc2l6ZVtxdWV1ZV0pCisgICAgICAgICAgICAgICAgcmV0dXJuICgoRkNCbG9jayAqKSgtMUwpKTsKKworICAgICAgICAvKiBjaGVjayBpZiBwYXN0IHRoZSBlbmQgOworICAgICAgICAgKiBpZiBleGFjdGx5IGVub3VnaCBtZW0gdG8gZW5kIG9mIHJpbmcsIGFsbG9jIGZyb20gZnJvbnQuCisgICAgICAgICAqIHRoaXMgYXZvaWRzIHVwZGF0ZSBvZiBjdXJyIHdoZW4gY3VyciA9IGVuZAorICAgICAgICAgKi8KKyAgICAgICAgaWYoKCh1bnNpZ25lZCBsb25nKSh0cC0+dHhfYnVmZl9jdXJyW3F1ZXVlXSkgKyBhbGxvY19zaXplKQorICAgICAgICAgICAgICAgID49ICh1bnNpZ25lZCBsb25nKSh0cC0+dHhfYnVmZl9lbmRbcXVldWVdKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIGVub3VnaCBtZW1vcnkgZnJvbSByaW5nIGhlYWQgKi8KKyAgICAgICAgICAgICAgICBhbGxvY19zaXplID0gYWxsb2Nfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAoX191MTYpKChfX3UzMil0cC0+dHhfYnVmZl9lbmRbcXVldWVdCisgICAgICAgICAgICAgICAgICAgICAgICAtIChfX3UzMil0cC0+dHhfYnVmZl9jdXJyW3F1ZXVlXSk7CisKKyAgICAgICAgICAgICAgICBpZigodHAtPnR4X2J1ZmZfdXNlZFtxdWV1ZV0gKyBhbGxvY19zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgPiB0cC0+dHhfYnVmZl9zaXplW3F1ZXVlXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChGQ0Jsb2NrICopKC0xTCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHJpbmcgd3JhcCAqLworICAgICAgICAgICAgICAgIHRwLT50eF9idWZmX2N1cnJbcXVldWVdID0gdHAtPnR4X2J1ZmZfaGVhZFtxdWV1ZV07CisgICAgICAgIH0KKworICAgICAgICB0cC0+dHhfYnVmZl91c2VkW3F1ZXVlXSArPSBhbGxvY19zaXplOworICAgICAgICB0cC0+bnVtX3R4X2ZjYnNfdXNlZFtxdWV1ZV0rKzsKKyAgICAgICAgdHAtPnR4X2ZjYl9jdXJyW3F1ZXVlXS0+ZnJhbWVfbGVuZ3RoID0gYnl0ZXNfY291bnQ7CisgICAgICAgIHRwLT50eF9mY2JfY3VycltxdWV1ZV0tPm1lbW9yeV9hbGxvYyA9IGFsbG9jX3NpemU7CisgICAgICAgIHRlbXAgPSB0cC0+dHhfYnVmZl9jdXJyW3F1ZXVlXTsKKyAgICAgICAgdHAtPnR4X2J1ZmZfY3VycltxdWV1ZV0KKyAgICAgICAgICAgICAgICA9IChfX3UxNiAqKSgoX191MzIpdGVtcCArIChfX3UzMikoKGJ5dGVzX2NvdW50ICsgMSkgJiAweGZmZmUpKTsKKworICAgICAgICBwYmRiID0gdHAtPnR4X2ZjYl9jdXJyW3F1ZXVlXS0+YmRiX3B0cjsKKyAgICAgICAgcGJkYi0+YnVmZmVyX2xlbmd0aCA9IGJ5dGVzX2NvdW50OworICAgICAgICBwYmRiLT5kYXRhX2Jsb2NrX3B0ciA9IHRlbXA7CisgICAgICAgIHBiZGItPnRyY19kYXRhX2Jsb2NrX3B0ciA9IFRSQ19QT0lOVEVSKHRlbXApOworCisgICAgICAgIHBGQ0IgPSB0cC0+dHhfZmNiX2N1cnJbcXVldWVdOworICAgICAgICB0cC0+dHhfZmNiX2N1cnJbcXVldWVdID0gdHAtPnR4X2ZjYl9jdXJyW3F1ZXVlXS0+bmV4dF9wdHI7CisKKyAgICAgICAgcmV0dXJuIChwRkNCKTsKK30KKworc3RhdGljIGludCBzbWN0cl9nZXRfdXBzdHJlYW1fbmVpZ2hib3JfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzbWN0cl9pc3N1ZV9yZWFkX3dvcmRfY21kKGRldiwgUldfVVBTVFJFQU1fTkVJR0hCT1JfQUREUkVTUyk7CisKKyAgICAgICAgcmV0dXJuKHNtY3RyX3dhaXRfY21kKGRldikpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2hhcmR3YXJlX3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwKQoreworICAgICAgICBzdHJ1Y3QgdHJfc3RhdGlzdGljcyAqdHN0YXQgPSAmdHAtPk1hY1N0YXQ7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHIiVzOiBzbWN0cl9oYXJkd2FyZV9zZW5kX3BhY2tldFxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBpZih0cC0+c3RhdHVzICE9IE9QRU4pCisgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICAgICAgaWYodHAtPm1vbml0b3Jfc3RhdGVfcmVhZHkgIT0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKworICAgICAgICBmb3IoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTZW5kIGZpcnN0IGJ1ZmZlciBmcm9tIHF1ZXVlICovCisgICAgICAgICAgICAgICAgc2tiID0gc2tiX2RlcXVldWUoJnRwLT5TZW5kU2tiUXVldWUpOworICAgICAgICAgICAgICAgIGlmKHNrYiA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICAgICAgICAgICAgICB0cC0+UXVldWVTa2IrKzsKKworICAgICAgICAgICAgICAgIGlmKHNrYi0+bGVuIDwgU01DX0hFQURFUl9TSVpFIHx8IHNrYi0+bGVuID4gdHAtPm1heF9wYWNrZXRfc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKworICAgICAgICAgICAgICAgIHNtY3RyX2VuYWJsZV8xNmJpdChkZXYpOworICAgICAgICAgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgKF9fdTggKil0cC0+cmFtX2FjY2Vzcyk7CisKKyAgICAgICAgICAgICAgICBpZigoZmNiID0gc21jdHJfZ2V0X3R4X2ZjYihkZXYsIE5PTl9NQUNfUVVFVUUsIHNrYi0+bGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IChGQ0Jsb2NrICopKC0xTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc21jdHJfdHhfbW92ZV9mcmFtZShkZXYsIHNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfX3U4ICopZmNiLT5iZGJfcHRyLT5kYXRhX2Jsb2NrX3B0ciwgc2tiLT5sZW4pOworCisgICAgICAgICAgICAgICAgc21jdHJfc2V0X3BhZ2UoZGV2LCAoX191OCAqKWZjYik7CisKKyAgICAgICAgICAgICAgICBzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE5PTl9NQUNfUVVFVUUpOworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKworICAgICAgICAgICAgICAgIHRzdGF0LT50eF9wYWNrZXRzKys7CisKKyAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2luaXRfYWNicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICBBQ0Jsb2NrICphY2I7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2luaXRfYWNic1xuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBhY2IgICAgICAgICAgICAgICAgICAgICA9IHRwLT5hY2JfaGVhZDsKKyAgICAgICAgYWNiLT5jbWRfZG9uZV9zdGF0dXMgICAgPSAoQUNCX0NPTU1BTkRfRE9ORSB8IEFDQl9DT01NQU5EX1NVQ0NFU1NGVUwpOworICAgICAgICBhY2ItPmNtZF9pbmZvICAgICAgICAgICA9IEFDQl9DSEFJTl9FTkQ7CisgICAgICAgIGFjYi0+Y21kICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgYWNiLT5zdWJjbWQgICAgICAgICAgICAgPSAwOworICAgICAgICBhY2ItPmRhdGFfb2Zmc2V0X2xvICAgICA9IDA7CisgICAgICAgIGFjYi0+ZGF0YV9vZmZzZXRfaGkgICAgID0gMDsKKyAgICAgICAgYWNiLT5uZXh0X3B0cgorICAgICAgICAgICAgICAgID0gKEFDQmxvY2sgKikoKChjaGFyICopYWNiKSArIHNpemVvZihBQ0Jsb2NrKSk7CisgICAgICAgIGFjYi0+dHJjX25leHRfcHRyICAgICAgID0gVFJDX1BPSU5URVIoYWNiLT5uZXh0X3B0cik7CisKKyAgICAgICAgZm9yKGkgPSAxOyBpIDwgdHAtPm51bV9hY2JzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY2IgICAgICAgICAgICAgPSBhY2ItPm5leHRfcHRyOworICAgICAgICAgICAgICAgIGFjYi0+Y21kX2RvbmVfc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICA9IChBQ0JfQ09NTUFORF9ET05FIHwgQUNCX0NPTU1BTkRfU1VDQ0VTU0ZVTCk7CisgICAgICAgICAgICAgICAgYWNiLT5jbWRfaW5mbyA9IEFDQl9DSEFJTl9FTkQ7CisgICAgICAgICAgICAgICAgYWNiLT5jbWQgICAgICAgID0gMDsKKyAgICAgICAgICAgICAgICBhY2ItPnN1YmNtZCAgICAgPSAwOworICAgICAgICAgICAgICAgIGFjYi0+ZGF0YV9vZmZzZXRfbG8gPSAwOworICAgICAgICAgICAgICAgIGFjYi0+ZGF0YV9vZmZzZXRfaGkgPSAwOworICAgICAgICAgICAgICAgIGFjYi0+bmV4dF9wdHIKKyAgICAgICAgICAgICAgICAgICAgICAgID0gKEFDQmxvY2sgKikoKChjaGFyICopYWNiKSArIHNpemVvZihBQ0Jsb2NrKSk7CisgICAgICAgICAgICAgICAgYWNiLT50cmNfbmV4dF9wdHIgPSBUUkNfUE9JTlRFUihhY2ItPm5leHRfcHRyKTsKKyAgICAgICAgfQorCisgICAgICAgIGFjYi0+bmV4dF9wdHIgICAgICAgICAgID0gdHAtPmFjYl9oZWFkOworICAgICAgICBhY2ItPnRyY19uZXh0X3B0ciAgICAgICA9IFRSQ19QT0lOVEVSKHRwLT5hY2JfaGVhZCk7CisgICAgICAgIHRwLT5hY2JfbmV4dCAgICAgICAgICAgID0gdHAtPmFjYl9oZWFkLT5uZXh0X3B0cjsKKyAgICAgICAgdHAtPmFjYl9jdXJyICAgICAgICAgICAgPSB0cC0+YWNiX2hlYWQtPm5leHRfcHRyOworICAgICAgICB0cC0+bnVtX2FjYnNfdXNlZCAgICAgICA9IDA7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pbml0X2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9pbml0X2FkYXB0ZXJcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgdHAtPnN0YXR1cyAgICAgICAgICAgICAgPSBDTE9TRUQ7CisgICAgICAgIHRwLT5wYWdlX29mZnNldF9tYXNrICAgID0gKHRwLT5yYW1fdXNhYmxlICogMTAyNCkgLSAxOworICAgICAgICBza2JfcXVldWVfaGVhZF9pbml0KCZ0cC0+U2VuZFNrYlF1ZXVlKTsKKyAgICAgICAgdHAtPlF1ZXVlU2tiID0gTUFYX1RYX1FVRVVFOworCisgICAgICAgIGlmKCEodHAtPmdyb3VwX2FkZHJlc3NfMCAmIDB4MDA4MCkpCisgICAgICAgICAgICAgICAgdHAtPmdyb3VwX2FkZHJlc3NfMCB8PSAweDAwQzA7CisKKyAgICAgICAgaWYoISh0cC0+ZnVuY3Rpb25hbF9hZGRyZXNzXzAgJiAweDAwQzApKQorICAgICAgICAgICAgICAgIHRwLT5mdW5jdGlvbmFsX2FkZHJlc3NfMCB8PSAweDAwQzA7CisKKyAgICAgICAgdHAtPmZ1bmN0aW9uYWxfYWRkcmVzc1swXSAmPSAweEZGN0Y7CisKKyAgICAgICAgaWYodHAtPmF1dGhvcml6ZWRfZnVuY3Rpb25fY2xhc3NlcyA9PSAwKQorICAgICAgICAgICAgICAgIHRwLT5hdXRob3JpemVkX2Z1bmN0aW9uX2NsYXNzZXMgPSAweDdGRkY7CisKKyAgICAgICAgaWYodHAtPmF1dGhvcml6ZWRfYWNjZXNzX3ByaW9yaXR5ID09IDApCisgICAgICAgICAgICAgICAgdHAtPmF1dGhvcml6ZWRfYWNjZXNzX3ByaW9yaXR5ID0gMHgwNjsKKworICAgICAgICBzbWN0cl9kaXNhYmxlX2JpY19pbnQoZGV2KTsKKyAgICAgICAgc21jdHJfc2V0X3RyY19yZXNldChkZXYtPmJhc2VfYWRkcik7CisKKyAgICAgICAgc21jdHJfZW5hYmxlXzE2Yml0KGRldik7CisgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgKF9fdTggKil0cC0+cmFtX2FjY2Vzcyk7CisKKyAgICAgICAgaWYoc21jdHJfY2hlY2tzdW1fZmlybXdhcmUoZGV2KSkKKwl7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogUHJldmlvdXNseSBsb2FkZWQgZmlybXdhcmUgaXMgbWlzc2luZ1xuIixkZXYtPm5hbWUpOyAgICAgICAgICAgICAgICByZXR1cm4gKC1FTk9FTlQpOworICAgICAgICB9CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3JhbV9tZW1vcnlfdGVzdChkZXYpKSkKKwl7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogUkFNIG1lbW9yeSB0ZXN0IGZhaWxlZC5cbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuICgtRUlPKTsKKyAgICAgICAgfQorCisJc21jdHJfc2V0X3J4X2xvb2tfYWhlYWQoZGV2KTsKKyAgICAgICAgc21jdHJfbG9hZF9ub2RlX2FkZHIoZGV2KTsKKworICAgICAgICAvKiBJbml0aWFsaXplIGFkYXB0ZXIgZm9yIEludGVybmFsIFNlbGYgVGVzdC4gKi8KKyAgICAgICAgc21jdHJfcmVzZXRfYWRhcHRlcihkZXYpOworICAgICAgICBpZigoZXJyID0gc21jdHJfaW5pdF9jYXJkX3JlYWwoZGV2KSkpCisJeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IEluaXRpYWxpemF0aW9uIG9mIGNhcmQgZmFpbGVkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuICgtRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoaXMgcm91dGluZSBjbG9iYmVycyB0aGUgVFJDJ3MgaW50ZXJuYWwgcmVnaXN0ZXJzLiAqLworICAgICAgICBpZigoZXJyID0gc21jdHJfaW50ZXJuYWxfc2VsZl90ZXN0KGRldikpKQorCXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBDYXJkIGZhaWxlZCBpbnRlcm5hbCBzZWxmIHRlc3QgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKC1FSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgLyogUmUtSW5pdGlhbGl6ZSBhZGFwdGVyJ3MgaW50ZXJuYWwgcmVnaXN0ZXJzICovCisgICAgICAgIHNtY3RyX3Jlc2V0X2FkYXB0ZXIoZGV2KTsKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2luaXRfY2FyZF9yZWFsKGRldikpKQorCXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBJbml0aWFsaXphdGlvbiBvZiBjYXJkIGZhaWxlZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiAoLUVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBzbWN0cl9lbmFibGVfYmljX2ludChkZXYpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pc3N1ZV9lbmFibGVfaW50X2NtZChkZXYsIFRSQ19JTlRFUlJVUFRfRU5BQkxFX01BU0spKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF9jYXJkX3JlYWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgZXJyID0gMDsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfaW5pdF9jYXJkX3JlYWxcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgdHAtPnNoX21lbV91c2VkID0gMDsKKyAgICAgICAgdHAtPm51bV9hY2JzICAgID0gTlVNX09GX0FDQlM7CisKKyAgICAgICAgLyogUmFuZ2UgQ2hlY2sgTWF4IFBhY2tldCBTaXplICovCisgICAgICAgIGlmKHRwLT5tYXhfcGFja2V0X3NpemUgPCAyNTYpCisgICAgICAgICAgICAgICAgdHAtPm1heF9wYWNrZXRfc2l6ZSA9IDI1NjsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodHAtPm1heF9wYWNrZXRfc2l6ZSA+IE5PTl9NQUNfVFhfQlVGRkVSX01FTU9SWSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tYXhfcGFja2V0X3NpemUgPSBOT05fTUFDX1RYX0JVRkZFUl9NRU1PUlk7CisgICAgICAgIH0KKworICAgICAgICB0cC0+bnVtX29mX3R4X2J1ZmZzID0gKE5PTl9NQUNfVFhfQlVGRkVSX01FTU9SWQorICAgICAgICAgICAgICAgIC8gdHAtPm1heF9wYWNrZXRfc2l6ZSkgLSAxOworCisgICAgICAgIGlmKHRwLT5udW1fb2ZfdHhfYnVmZnMgPiBOVU1fTk9OX01BQ19UWF9GQ0JTKQorICAgICAgICAgICAgICAgIHRwLT5udW1fb2ZfdHhfYnVmZnMgPSBOVU1fTk9OX01BQ19UWF9GQ0JTOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih0cC0+bnVtX29mX3R4X2J1ZmZzID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bnVtX29mX3R4X2J1ZmZzID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFR4IHF1ZXVlIGNvbnN0YW50cyAqLworICAgICAgICB0cC0+bnVtX3R4X2ZjYnMgICAgICAgIFtCVUdfUVVFVUVdICAgICA9IE5VTV9CVUdfVFhfRkNCUzsKKyAgICAgICAgdHAtPm51bV90eF9iZGJzICAgICAgICBbQlVHX1FVRVVFXSAgICAgPSBOVU1fQlVHX1RYX0JEQlM7CisgICAgICAgIHRwLT50eF9idWZmX3NpemUgICAgICAgW0JVR19RVUVVRV0gICAgID0gQlVHX1RYX0JVRkZFUl9NRU1PUlk7CisgICAgICAgIHRwLT50eF9idWZmX3VzZWQgICAgICAgW0JVR19RVUVVRV0gICAgID0gMDsKKyAgICAgICAgdHAtPnR4X3F1ZXVlX3N0YXR1cyAgICBbQlVHX1FVRVVFXSAgICAgPSBOT1RfVFJBTlNNSVRJTkc7CisKKyAgICAgICAgdHAtPm51bV90eF9mY2JzICAgICAgICBbTUFDX1FVRVVFXSAgICAgPSBOVU1fTUFDX1RYX0ZDQlM7CisgICAgICAgIHRwLT5udW1fdHhfYmRicyAgICAgICAgW01BQ19RVUVVRV0gICAgID0gTlVNX01BQ19UWF9CREJTOworICAgICAgICB0cC0+dHhfYnVmZl9zaXplICAgICAgIFtNQUNfUVVFVUVdICAgICA9IE1BQ19UWF9CVUZGRVJfTUVNT1JZOworICAgICAgICB0cC0+dHhfYnVmZl91c2VkICAgICAgIFtNQUNfUVVFVUVdICAgICA9IDA7CisgICAgICAgIHRwLT50eF9xdWV1ZV9zdGF0dXMgICAgW01BQ19RVUVVRV0gICAgID0gTk9UX1RSQU5TTUlUSU5HOworCisgICAgICAgIHRwLT5udW1fdHhfZmNicyAgICAgICAgW05PTl9NQUNfUVVFVUVdID0gTlVNX05PTl9NQUNfVFhfRkNCUzsKKyAgICAgICAgdHAtPm51bV90eF9iZGJzICAgICAgICBbTk9OX01BQ19RVUVVRV0gPSBOVU1fTk9OX01BQ19UWF9CREJTOworICAgICAgICB0cC0+dHhfYnVmZl9zaXplICAgICAgIFtOT05fTUFDX1FVRVVFXSA9IE5PTl9NQUNfVFhfQlVGRkVSX01FTU9SWTsKKyAgICAgICAgdHAtPnR4X2J1ZmZfdXNlZCAgICAgICBbTk9OX01BQ19RVUVVRV0gPSAwOworICAgICAgICB0cC0+dHhfcXVldWVfc3RhdHVzICAgIFtOT05fTUFDX1FVRVVFXSA9IE5PVF9UUkFOU01JVElORzsKKworICAgICAgICAvKiBSZWNlaXZlIFF1ZXVlIENvbnN0YW50cyAqLworICAgICAgICB0cC0+bnVtX3J4X2ZjYnNbTUFDX1FVRVVFXSA9IE5VTV9NQUNfUlhfRkNCUzsKKyAgICAgICAgdHAtPm51bV9yeF9iZGJzW01BQ19RVUVVRV0gPSBOVU1fTUFDX1JYX0JEQlM7CisKKyAgICAgICAgaWYodHAtPmV4dHJhX2luZm8gJiBDSElQX1JFVl9NQVNLKQorICAgICAgICAgICAgICAgIHRwLT5udW1fcnhfZmNic1tOT05fTUFDX1FVRVVFXSA9IDc4OyAgICAvKiA4MjUgUmV2LiBYRSAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHAtPm51bV9yeF9mY2JzW05PTl9NQUNfUVVFVUVdID0gNzsgICAgIC8qIDgyNSBSZXYuIFhEICovCisKKyAgICAgICAgdHAtPm51bV9yeF9iZGJzW05PTl9NQUNfUVVFVUVdID0gc21jdHJfZ2V0X251bV9yeF9iZGJzKGRldik7CisKKyAgICAgICAgc21jdHJfYWxsb2Nfc2hhcmVkX21lbW9yeShkZXYpOworICAgICAgICBzbWN0cl9pbml0X3NoYXJlZF9tZW1vcnkoZGV2KTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfaW5pdF90aW1lcnNfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfaW5pdF90eHJ4X2NtZChkZXYpKSkKKwl7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogSGFyZHdhcmUgZmFpbHVyZVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2luaXRfcnhfYmRicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgICAgICBCREJsb2NrICpiZGI7CisgICAgICAgIF9fdTE2ICpidWY7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2luaXRfcnhfYmRic1xuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCBOVU1fUlhfUVNfVVNFRDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgYmRiID0gdHAtPnJ4X2JkYl9oZWFkW2ldOworICAgICAgICAgICAgICAgIGJ1ZiA9IHRwLT5yeF9idWZmX2hlYWRbaV07CisgICAgICAgICAgICAgICAgYmRiLT5pbmZvID0gKEJEQl9DSEFJTl9FTkQgfCBCREJfTk9fV0FSTklORyk7CisgICAgICAgICAgICAgICAgYmRiLT5idWZmZXJfbGVuZ3RoID0gUlhfREFUQV9CVUZGRVJfU0laRTsKKyAgICAgICAgICAgICAgICBiZGItPm5leHRfcHRyID0gKEJEQmxvY2sgKikoKChjaGFyICopYmRiKSArIHNpemVvZihCREJsb2NrKSk7CisgICAgICAgICAgICAgICAgYmRiLT5kYXRhX2Jsb2NrX3B0ciA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBiZGItPnRyY19uZXh0X3B0ciA9IFRSQ19QT0lOVEVSKGJkYi0+bmV4dF9wdHIpOworCisgICAgICAgICAgICAgICAgaWYoaSA9PSBOT05fTUFDX1FVRVVFKQorICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT50cmNfZGF0YV9ibG9ja19wdHIgPSBSWF9CVUZGX1RSQ19QT0lOVEVSKGJ1Zik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT50cmNfZGF0YV9ibG9ja19wdHIgPSBUUkNfUE9JTlRFUihidWYpOworCisgICAgICAgICAgICAgICAgZm9yKGogPSAxOyBqIDwgdHAtPm51bV9yeF9iZGJzW2ldOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT5uZXh0X3B0ci0+YmFja19wdHIgPSBiZGI7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGIgPSBiZGItPm5leHRfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gKF9fdTE2ICopKChjaGFyICopYnVmICsgUlhfREFUQV9CVUZGRVJfU0laRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGItPmluZm8gPSAoQkRCX05PVF9DSEFJTl9FTkQgfCBCREJfTk9fV0FSTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGItPmJ1ZmZlcl9sZW5ndGggPSBSWF9EQVRBX0JVRkZFUl9TSVpFOworICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT5uZXh0X3B0ciA9IChCREJsb2NrICopKCgoY2hhciAqKWJkYikgKyBzaXplb2YoQkRCbG9jaykpOworICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT5kYXRhX2Jsb2NrX3B0ciA9IGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJkYi0+dHJjX25leHRfcHRyID0gVFJDX1BPSU5URVIoYmRiLT5uZXh0X3B0cik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGkgPT0gTk9OX01BQ19RVUVVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT50cmNfZGF0YV9ibG9ja19wdHIgPSBSWF9CVUZGX1RSQ19QT0lOVEVSKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkYi0+dHJjX2RhdGFfYmxvY2tfcHRyID0gVFJDX1BPSU5URVIoYnVmKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiZGItPm5leHRfcHRyICAgICAgICAgICA9IHRwLT5yeF9iZGJfaGVhZFtpXTsKKyAgICAgICAgICAgICAgICBiZGItPnRyY19uZXh0X3B0ciAgICAgICA9IFRSQ19QT0lOVEVSKHRwLT5yeF9iZGJfaGVhZFtpXSk7CisKKyAgICAgICAgICAgICAgICB0cC0+cnhfYmRiX2hlYWRbaV0tPmJhY2tfcHRyICAgID0gYmRiOworICAgICAgICAgICAgICAgIHRwLT5yeF9iZGJfY3VycltpXSAgICAgICAgICAgICAgPSB0cC0+cnhfYmRiX2hlYWRbaV0tPm5leHRfcHRyOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pbml0X3J4X2ZjYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgICAgICAgRkNCbG9jayAqZmNiOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IE5VTV9SWF9RU19VU0VEOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmY2IgICAgICAgICAgICAgICA9IHRwLT5yeF9mY2JfaGVhZFtpXTsKKyAgICAgICAgICAgICAgICBmY2ItPmZyYW1lX3N0YXR1cyA9IDA7CisgICAgICAgICAgICAgICAgZmNiLT5mcmFtZV9sZW5ndGggPSAwOworICAgICAgICAgICAgICAgIGZjYi0+aW5mbyAgICAgICAgID0gRkNCX0NIQUlOX0VORDsKKyAgICAgICAgICAgICAgICBmY2ItPm5leHRfcHRyICAgICA9IChGQ0Jsb2NrICopKCgoY2hhciopZmNiKSArIHNpemVvZihGQ0Jsb2NrKSk7CisgICAgICAgICAgICAgICAgaWYoaSA9PSBOT05fTUFDX1FVRVVFKQorICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT50cmNfbmV4dF9wdHIgPSBSWF9GQ0JfVFJDX1BPSU5URVIoZmNiLT5uZXh0X3B0cik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT50cmNfbmV4dF9wdHIgPSBUUkNfUE9JTlRFUihmY2ItPm5leHRfcHRyKTsKKworICAgICAgICAgICAgICAgIGZvcihqID0gMTsgaiA8IHRwLT5udW1fcnhfZmNic1tpXTsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+bmV4dF9wdHItPmJhY2tfcHRyID0gZmNiOworICAgICAgICAgICAgICAgICAgICAgICAgZmNiICAgICAgICAgICAgICAgICAgICAgPSBmY2ItPm5leHRfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT5mcmFtZV9zdGF0dXMgICAgICAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT5mcmFtZV9sZW5ndGggICAgICAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT5pbmZvICAgICAgICAgICAgICAgPSBGQ0JfV0FSTklORzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+bmV4dF9wdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoRkNCbG9jayAqKSgoKGNoYXIgKilmY2IpICsgc2l6ZW9mKEZDQmxvY2spKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSBOT05fTUFDX1FVRVVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPnRyY19uZXh0X3B0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gUlhfRkNCX1RSQ19QT0lOVEVSKGZjYi0+bmV4dF9wdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPnRyY19uZXh0X3B0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVFJDX1BPSU5URVIoZmNiLT5uZXh0X3B0cik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmNiLT5uZXh0X3B0ciA9IHRwLT5yeF9mY2JfaGVhZFtpXTsKKworICAgICAgICAgICAgICAgIGlmKGkgPT0gTk9OX01BQ19RVUVVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+dHJjX25leHRfcHRyID0gUlhfRkNCX1RSQ19QT0lOVEVSKGZjYi0+bmV4dF9wdHIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+dHJjX25leHRfcHRyID0gVFJDX1BPSU5URVIoZmNiLT5uZXh0X3B0cik7CisKKyAgICAgICAgICAgICAgICB0cC0+cnhfZmNiX2hlYWRbaV0tPmJhY2tfcHRyICAgID0gZmNiOworICAgICAgICAgICAgICAgIHRwLT5yeF9mY2JfY3VycltpXSAgICAgICAgICAgICAgPSB0cC0+cnhfZmNiX2hlYWRbaV0tPm5leHRfcHRyOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2luaXRfc2hhcmVkX21lbW9yeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICBfX3UzMiAqaXNjcGI7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2luaXRfc2hhcmVkX21lbW9yeVxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopKHVuc2lnbmVkIGludCl0cC0+aXNjcGJfcHRyKTsKKworICAgICAgICAvKiBJbml0aWFsaXplIEluaXRpYWwgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnQuIChJU0NQKSAqLworICAgICAgICBpc2NwYiA9IChfX3UzMiAqKVBBR0VfUE9JTlRFUigmdHAtPmlzY3BiX3B0ci0+dHJjX3NjZ2JfcHRyKTsKKyAgICAgICAgKmlzY3BiID0gKF9fdTMyKShTV0FQX1dPUkRTKFRSQ19QT0lOVEVSKHRwLT5zY2diX3B0cikpKTsKKworICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopdHAtPnJhbV9hY2Nlc3MpOworCisgICAgICAgIC8qIEluaXRpYWxpemUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlcnMuIChTQ1ApICovCisgICAgICAgIHRwLT5zY2diX3B0ci0+Y29uZmlnID0gKFNDR0JfQUREUkVTU19QT0lOVEVSX0ZPUk1BVAorICAgICAgICAgICAgICAgIHwgU0NHQl9NVUxUSV9XT1JEX0NPTlRST0wgfCBTQ0dCX0RBVEFfRk9STUFUCisgICAgICAgICAgICAgICAgfCBTQ0dCX0JVUlNUX0xFTkdUSCk7CisKKyAgICAgICAgdHAtPnNjZ2JfcHRyLT50cmNfc2NsYl9wdHIgICAgICA9IFRSQ19QT0lOVEVSKHRwLT5zY2xiX3B0cik7CisgICAgICAgIHRwLT5zY2diX3B0ci0+dHJjX2FjYl9wdHIgICAgICAgPSBUUkNfUE9JTlRFUih0cC0+YWNiX2hlYWQpOworICAgICAgICB0cC0+c2NnYl9wdHItPnRyY19pc2JfcHRyICAgICAgID0gVFJDX1BPSU5URVIodHAtPmlzYl9wdHIpOworICAgICAgICB0cC0+c2NnYl9wdHItPmlzYnNpeiAgICAgICAgICAgID0gKHNpemVvZihJU0Jsb2NrKSkgLSAyOworCisgICAgICAgIC8qIEluaXRpYWxpemUgU3lzdGVtIENvbnRyb2wgQmxvY2suIChTQ0IpICovCisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCAgICA9IFNDTEJfVkFMSUQgfCBTQ0xCX0NNRF9OT1A7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+aWFja19jb2RlICAgICAgICA9IDA7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+cmVzdW1lX2NvbnRyb2wgICA9IDA7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+aW50X21hc2tfY29udHJvbCA9IDA7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+aW50X21hc2tfc3RhdGUgICA9IDA7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBJbnRlcnJ1cHQgU3RhdHVzIEJsb2NrLiAoSVNCKSAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCBOVU1fT0ZfSU5URVJSVVBUUzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdHAtPmlzYl9wdHItPklTdGF0dXNbaV0uSVR5cGUgPSAweGYwOworICAgICAgICAgICAgICAgIHRwLT5pc2JfcHRyLT5JU3RhdHVzW2ldLklTdWJ0eXBlID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHRwLT5jdXJyZW50X2lzYl9pbmRleCA9IDA7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBBY3Rpb24gQ29tbWFuZCBCbG9jay4gKEFDQikgKi8KKyAgICAgICAgc21jdHJfaW5pdF9hY2JzKGRldik7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0cmFuc21pdCBGQ0IncyBhbmQgQkRCJ3MuICovCisgICAgICAgIHNtY3RyX2xpbmtfdHhfZmNic190b19iZGJzKGRldik7CisgICAgICAgIHNtY3RyX2luaXRfdHhfYmRicyhkZXYpOworICAgICAgICBzbWN0cl9pbml0X3R4X2ZjYnMoZGV2KTsKKworICAgICAgICAvKiBJbml0aWFsaXplIHJlY2VpdmUgRkNCJ3MgYW5kIEJEQidzLiAqLworICAgICAgICBzbWN0cl9pbml0X3J4X2JkYnMoZGV2KTsKKyAgICAgICAgc21jdHJfaW5pdF9yeF9mY2JzKGRldik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pbml0X3R4X2JkYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgICAgICAgQkRCbG9jayAqYmRiOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IE5VTV9UWF9RU19VU0VEOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiZGIgPSB0cC0+dHhfYmRiX2hlYWRbaV07CisgICAgICAgICAgICAgICAgYmRiLT5pbmZvID0gKEJEQl9OT1RfQ0hBSU5fRU5EIHwgQkRCX05PX1dBUk5JTkcpOworICAgICAgICAgICAgICAgIGJkYi0+bmV4dF9wdHIgPSAoQkRCbG9jayAqKSgoKGNoYXIgKiliZGIpICsgc2l6ZW9mKEJEQmxvY2spKTsKKyAgICAgICAgICAgICAgICBiZGItPnRyY19uZXh0X3B0ciA9IFRSQ19QT0lOVEVSKGJkYi0+bmV4dF9wdHIpOworCisgICAgICAgICAgICAgICAgZm9yKGogPSAxOyBqIDwgdHAtPm51bV90eF9iZGJzW2ldOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT5uZXh0X3B0ci0+YmFja19wdHIgPSBiZGI7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGIgPSBiZGItPm5leHRfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT5pbmZvID0gKEJEQl9OT1RfQ0hBSU5fRU5EIHwgQkRCX05PX1dBUk5JTkcpOworICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT5uZXh0X3B0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChCREJsb2NrICopKCgoY2hhciAqKWJkYikgKyBzaXplb2YoIEJEQmxvY2spKTsgICAgICAgICAgICAgICAgICAgICAgICBiZGItPnRyY19uZXh0X3B0ciA9IFRSQ19QT0lOVEVSKGJkYi0+bmV4dF9wdHIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJkYi0+bmV4dF9wdHIgPSB0cC0+dHhfYmRiX2hlYWRbaV07CisgICAgICAgICAgICAgICAgYmRiLT50cmNfbmV4dF9wdHIgPSBUUkNfUE9JTlRFUih0cC0+dHhfYmRiX2hlYWRbaV0pOworICAgICAgICAgICAgICAgIHRwLT50eF9iZGJfaGVhZFtpXS0+YmFja19wdHIgPSBiZGI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2luaXRfdHhfZmNicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgICAgICBGQ0Jsb2NrICpmY2I7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgTlVNX1RYX1FTX1VTRUQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGZjYiAgICAgICAgICAgICAgID0gdHAtPnR4X2ZjYl9oZWFkW2ldOworICAgICAgICAgICAgICAgIGZjYi0+ZnJhbWVfc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICBmY2ItPmZyYW1lX2xlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgZmNiLT5pbmZvICAgICAgICAgPSBGQ0JfQ0hBSU5fRU5EOworICAgICAgICAgICAgICAgIGZjYi0+bmV4dF9wdHIgPSAoRkNCbG9jayAqKSgoKGNoYXIgKilmY2IpICsgc2l6ZW9mKEZDQmxvY2spKTsKKyAgICAgICAgICAgICAgICBmY2ItPnRyY19uZXh0X3B0ciA9IFRSQ19QT0lOVEVSKGZjYi0+bmV4dF9wdHIpOworCisgICAgICAgICAgICAgICAgZm9yKGogPSAxOyBqIDwgdHAtPm51bV90eF9mY2JzW2ldOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT5uZXh0X3B0ci0+YmFja19wdHIgPSBmY2I7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2IgICAgICAgICAgICAgICAgICAgICA9IGZjYi0+bmV4dF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPmZyYW1lX3N0YXR1cyAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPmZyYW1lX2xlbmd0aCAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPmluZm8gICAgICAgICAgICAgICA9IEZDQl9DSEFJTl9FTkQ7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPm5leHRfcHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKEZDQmxvY2sgKikoKChjaGFyICopZmNiKSArIHNpemVvZihGQ0Jsb2NrKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPnRyY19uZXh0X3B0ciA9IFRSQ19QT0lOVEVSKGZjYi0+bmV4dF9wdHIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZjYi0+bmV4dF9wdHIgICAgICAgICAgID0gdHAtPnR4X2ZjYl9oZWFkW2ldOworICAgICAgICAgICAgICAgIGZjYi0+dHJjX25leHRfcHRyICAgICAgID0gVFJDX1BPSU5URVIodHAtPnR4X2ZjYl9oZWFkW2ldKTsKKworICAgICAgICAgICAgICAgIHRwLT50eF9mY2JfaGVhZFtpXS0+YmFja19wdHIgICAgPSBmY2I7CisgICAgICAgICAgICAgICAgdHAtPnR4X2ZjYl9lbmRbaV0gICAgICAgICAgICAgICA9IHRwLT50eF9mY2JfaGVhZFtpXS0+bmV4dF9wdHI7CisgICAgICAgICAgICAgICAgdHAtPnR4X2ZjYl9jdXJyW2ldICAgICAgICAgICAgICA9IHRwLT50eF9mY2JfaGVhZFtpXS0+bmV4dF9wdHI7CisgICAgICAgICAgICAgICAgdHAtPm51bV90eF9mY2JzX3VzZWRbaV0gICAgICAgICA9IDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2ludGVybmFsX3NlbGZfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3Rlc3RfaW50ZXJuYWxfcm9tX2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZih0cC0+YWNiX2hlYWQtPmNtZF9kb25lX3N0YXR1cyAmIDB4ZmYpCisgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3Rlc3RfaGljX2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZih0cC0+YWNiX2hlYWQtPmNtZF9kb25lX3N0YXR1cyAmIDB4ZmYpCisgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3Rlc3RfbWFjX3JlZ19jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYodHAtPmFjYl9oZWFkLT5jbWRfZG9uZV9zdGF0dXMgJiAweGZmKQorICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKKy8qCisgKiBUaGUgdHlwaWNhbCB3b3JrbG9hZCBvZiB0aGUgZHJpdmVyOiBIYW5kbGUgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzbWN0cl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHA7CisgICAgICAgIGludCBpb2FkZHI7CisgICAgICAgIF9fdTE2IGludGVycnVwdF91bm1hc2tfYml0cyA9IDAsIGludGVycnVwdF9hY2tfY29kZSA9IDB4ZmYwMDsKKyAgICAgICAgX191MTYgZXJyMSwgZXJyID0gTk9UX01ZX0lOVEVSUlVQVDsKKyAgICAgICAgX191OCBpc2JfdHlwZSwgaXNiX3N1YnR5cGU7CisgICAgICAgIF9fdTE2IGlzYl9pbmRleDsKKworICAgICAgICBpZihkZXYgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0NSSVQgIiVzOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgZGV2LT5uYW1lLCBpcnEpOworICAgICAgICAgICAgICAgIHJldHVybiBJUlFfTk9ORTsKKyAgICAgICAgfQorCisgICAgICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgICAgICB0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIAorCisgICAgICAgIGlmKHRwLT5zdGF0dXMgPT0gTk9UX0lOSVRJQUxJWkVEKQorICAgICAgICAgICAgICAgIHJldHVybiBJUlFfTk9ORTsKKworICAgICAgICBzcGluX2xvY2soJnRwLT5sb2NrKTsKKyAgICAgICAgCisgICAgICAgIHNtY3RyX2Rpc2FibGVfYmljX2ludChkZXYpOworICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKworICAgICAgICBzbWN0cl9jbGVhcl9pbnQoZGV2KTsKKworICAgICAgICAvKiBGaXJzdCByZWFkIHRoZSBMU0IgKi8KKyAgICAgICAgd2hpbGUoKHRwLT5pc2JfcHRyLT5JU3RhdHVzW3RwLT5jdXJyZW50X2lzYl9pbmRleF0uSVR5cGUgJiAweGYwKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaXNiX2luZGV4ICAgICAgID0gdHAtPmN1cnJlbnRfaXNiX2luZGV4OworICAgICAgICAgICAgICAgIGlzYl90eXBlICAgICAgICA9IHRwLT5pc2JfcHRyLT5JU3RhdHVzW2lzYl9pbmRleF0uSVR5cGU7CisgICAgICAgICAgICAgICAgaXNiX3N1YnR5cGUgICAgID0gdHAtPmlzYl9wdHItPklTdGF0dXNbaXNiX2luZGV4XS5JU3VidHlwZTsKKworICAgICAgICAgICAgICAgICh0cC0+Y3VycmVudF9pc2JfaW5kZXgpKys7CisgICAgICAgICAgICAgICAgaWYodHAtPmN1cnJlbnRfaXNiX2luZGV4ID09IE5VTV9PRl9JTlRFUlJVUFRTKQorICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmN1cnJlbnRfaXNiX2luZGV4ID0gMDsKKworICAgICAgICAgICAgICAgIGlmKGlzYl90eXBlID49IDB4MTApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworCQkgICAgICAgIHNwaW5fdW5sb2NrKCZ0cC0+bG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXJyID0gSEFSRFdBUkVfRkFJTEVEOworICAgICAgICAgICAgICAgIGludGVycnVwdF9hY2tfY29kZSA9IGlzYl9pbmRleDsKKyAgICAgICAgICAgICAgICB0cC0+aXNiX3B0ci0+SVN0YXR1c1tpc2JfaW5kZXhdLklUeXBlIHw9IDB4ZjA7CisKKyAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfdW5tYXNrX2JpdHMgfD0gKDEgPDwgKF9fdTE2KWlzYl90eXBlKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaChpc2JfdHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElTQl9JTUNfTUFDX1RZUEVfMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChpc2Jfc3VidHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tb25pdG9yX3N0YXRlID0gTVNfTU9OSVRPUl9GU01fSU5BQ1RJVkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vbml0b3Jfc3RhdGUgPSBNU19SRVBFQVRfQkVBQ09OX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9uaXRvcl9zdGF0ZSA9IE1TX1JFUEVBVF9DTEFJTV9UT0tFTl9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vbml0b3Jfc3RhdGUgPSBNU19UUkFOU01JVF9DTEFJTV9UT0tFTl9TVEFURTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tb25pdG9yX3N0YXRlID0gTVNfU1RBTkRCWV9NT05JVE9SX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9uaXRvcl9zdGF0ZSA9IE1TX1RSQU5TTUlUX0JFQUNPTl9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vbml0b3Jfc3RhdGUgPSBNU19BQ1RJVkVfTU9OSVRPUl9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vbml0b3Jfc3RhdGUgPSBNU19UUkFOU01JVF9SSU5HX1BVUkdFX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6ICAgLyogZGlhZ25vc3RpYyBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9uaXRvcl9zdGF0ZSA9IE1TX0JFQUNPTl9URVNUX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc21jdHJfbG9iZV9tZWRpYV90ZXN0KGRldikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yaW5nX3N0YXR1c19mbGFncyA9IFJJTkdfU1RBVFVTX0NIQU5HRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yaW5nX3N0YXR1cyA9IEFVVE9fUkVNT1ZBTF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfcmluZ19zdGF0dXNfY2hnKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX2J5cGFzc19zdGF0ZShkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9pc3N1ZV9pbnNlcnRfY21kKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhc2UgMHgwYS0weGZmLCBpbGxlZ2FsIHN0YXRlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yaW5nX3N0YXR1c19mbGFncyA9IE1PTklUT1JfU1RBVEVfQ0hBTkdFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfcmluZ19zdGF0dXNfY2hnKGRldik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfZW5hYmxlXzE2Yml0KGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIDB4MDIgLSBNQUMgRXJyb3IgQ291bnRlcnMgSW50ZXJydXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBPbmUgb3IgbW9yZSBNQUMgRXJyb3IgQ291bnRlciBpcyBoYWxmIGZ1bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgTUFDIEVycm9yIENvdW50ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgIExvc3RfRlJfRXJyb3JfQ291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICBSQ1ZfQ29uZ2VzdGlvbl9Db3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgIEZSX2NvcGllZF9FcnJvcl9Db3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgIEZSRVFfRXJyb3JfQ291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICBUb2tlbl9FcnJvcl9Db3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgIExpbmVfRXJyb3JfQ291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICBJbnRlcm5hbF9FcnJvcl9Db3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElTQl9JTUNfTUFDX0VSUk9SX0NPVU5URVJTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIDgwMi41IEVycm9yIENvdW50ZXJzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNtY3RyX2lzc3VlX3JlYWRfcmluZ19zdGF0dXNfY21kKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIDB4MDQgLSBNQUMgVHlwZSAyIEludGVycnVwdAorICAgICAgICAgICAgICAgICAgICAgICAgICogSE9TVCBuZWVkcyB0byBlbnF1ZXVlIE1BQyBGcmFtZSBmb3IgdHJhbnNtaXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBTdWJUeXBlIEJpdCAxNSAtIFJRX0lOSVRfUERVKCBSZXF1ZXN0IEluaXRpYWxpemF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAqIENoYW5nZWQgZnJvbSBSUV9JTklUX1BEVSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICogVFJDX1N0YXR1c19DaGFuZ2VkX0luZGljYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19NQUNfVFlQRV8yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzbWN0cl9pc3N1ZV9yZWFkX3Jpbmdfc3RhdHVzX2NtZChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIDB4MDUgLSBUWCBGcmFtZSBJbnRlcnJ1cHQgKEZJKS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19UWF9GUkFNRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQlVHIFFVRVVFIGZvciBUUkMgc3R1Y2sgcmVjZWl2ZSBCVUcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgJiBUWF9QRU5ESU5HX1BSSU9SSVRZXzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfdHhfY29tcGxldGUoZGV2LCBCVUdfUVVFVUUpKSAhPSBTVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT04tTUFDIGZyYW1lcyBvbmx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzYl9zdWJ0eXBlICYgVFhfUEVORElOR19QUklPUklUWV8xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3R4X2NvbXBsZXRlKGRldiwgTk9OX01BQ19RVUVVRSkpICE9IFNVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1BQyBmcmFtZXMgb25seSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc2Jfc3VidHlwZSAmIFRYX1BFTkRJTkdfUFJJT1JJVFlfMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzbWN0cl90eF9jb21wbGV0ZShkZXYsIE1BQ19RVUVVRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSAweDA2IC0gVFggRU5EIE9GIFFVRVVFIChGRSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19FTkRfT0ZfVFhfUVVFVUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJVRyBxdWV1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc2Jfc3VidHlwZSAmIFRYX1BFTkRJTkdfUFJJT1JJVFlfMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9rIHRvIGNsZWFyIFJlY2VpdmUgRklGTyBvdmVycnVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW1hc2sgc2VuZF9CVUcgbm93IGNvbXBsZXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfdW5tYXNrX2JpdHMgfD0gMHg4MDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHhfcXVldWVfc3RhdHVzW0JVR19RVUVVRV0gPSBOT1RfVFJBTlNNSVRJTkc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3R4X2NvbXBsZXRlKGRldiwgQlVHX1FVRVVFKSkgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl9yZXN0YXJ0X3R4X2NoYWluKGRldiwgQlVHX1FVRVVFKSkgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9OLU1BQyBxdWV1ZSBvbmx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzYl9zdWJ0eXBlICYgVFhfUEVORElOR19QUklPUklUWV8xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnR4X3F1ZXVlX3N0YXR1c1tOT05fTUFDX1FVRVVFXSA9IE5PVF9UUkFOU01JVElORzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfdHhfY29tcGxldGUoZGV2LCBOT05fTUFDX1FVRVVFKSkgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl9yZXN0YXJ0X3R4X2NoYWluKGRldiwgTk9OX01BQ19RVUVVRSkpICE9IFNVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1BQyBxdWV1ZSBvbmx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzYl9zdWJ0eXBlICYgVFhfUEVORElOR19QUklPUklUWV8wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnR4X3F1ZXVlX3N0YXR1c1tNQUNfUVVFVUVdID0gTk9UX1RSQU5TTUlUSU5HOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl90eF9jb21wbGV0ZShkZXYsIE1BQ19RVUVVRSkpICE9IFNVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNtY3RyX3Jlc3RhcnRfdHhfY2hhaW4oZGV2LCBNQUNfUVVFVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIDB4MDcgLSBOT04tTUFDIFJYIFJlc291cmNlIEludGVycnVwdAorICAgICAgICAgICAgICAgICAgICAgICAgICogICBTdWJ0eXBlIGJpdCAxMiAtIChCVykgQkRCIHdhcm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgU3VidHlwZSBiaXQgMTMgLSAoRlcpIEZDQiB3YXJuaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIFN1YnR5cGUgYml0IDE0IC0gKEJFKSBCREIgRW5kIG9mIGNoYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIFN1YnR5cGUgYml0IDE1IC0gKEZFKSBGQ0IgRW5kIG9mIGNoYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19OT05fTUFDX1JYX1JFU09VUkNFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cnhfZmlmb19vdmVycnVuX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnJlY2VpdmVfcXVldWVfbnVtYmVyID0gTk9OX01BQ19RVUVVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyMSA9IHNtY3RyX3J4X2ZyYW1lKGRldik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgJiBOT05fTUFDX1JYX1JFU09VUkNFX0ZFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9mY2JfY21kKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldiwgTk9OX01BQ19RVUVVRSkpICE9IFNVQ0NFU1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cC0+cHRyX3J4X2ZjYl9vdmVycnVucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqdHAtPnB0cl9yeF9mY2Jfb3ZlcnJ1bnMpKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc2Jfc3VidHlwZSAmIE5PTl9NQUNfUlhfUkVTT1VSQ0VfQkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfcmVzdW1lX3J4X2JkYl9jbWQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LCBOT05fTUFDX1FVRVVFKSkgIT0gU1VDQ0VTUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRwLT5wdHJfcnhfYmRiX292ZXJydW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp0cC0+cHRyX3J4X2JkYl9vdmVycnVucykrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlcnIxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSAweDA4IC0gTUFDIFJYIFJlc291cmNlIEludGVycnVwdAorICAgICAgICAgICAgICAgICAgICAgICAgICogICBTdWJ0eXBlIGJpdCAxMiAtIChCVykgQkRCIHdhcm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgU3VidHlwZSBiaXQgMTMgLSAoRlcpIEZDQiB3YXJuaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIFN1YnR5cGUgYml0IDE0IC0gKEJFKSBCREIgRW5kIG9mIGNoYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIFN1YnR5cGUgYml0IDE1IC0gKEZFKSBGQ0IgRW5kIG9mIGNoYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19NQUNfUlhfUkVTT1VSQ0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yZWNlaXZlX3F1ZXVlX251bWJlciA9IE1BQ19RVUVVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyMSA9IHNtY3RyX3J4X2ZyYW1lKGRldik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgJiBNQUNfUlhfUkVTT1VSQ0VfRkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfcmVzdW1lX3J4X2ZjYl9jbWQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LCBNQUNfUVVFVUUpKSAhPSBTVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cC0+cHRyX3J4X2ZjYl9vdmVycnVucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqdHAtPnB0cl9yeF9mY2Jfb3ZlcnJ1bnMpKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc2Jfc3VidHlwZSAmIE1BQ19SWF9SRVNPVVJDRV9CRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pc3N1ZV9yZXN1bWVfcnhfYmRiX2NtZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYsIE1BQ19RVUVVRSkpICE9IFNVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRwLT5wdHJfcnhfYmRiX292ZXJydW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp0cC0+cHRyX3J4X2JkYl9vdmVycnVucykrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlcnIxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSAweDA5IC0gTk9OX01BQyBSWCBGcmFtZSBJbnRlcnJ1cHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19OT05fTUFDX1JYX0ZSQU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cnhfZmlmb19vdmVycnVuX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnJlY2VpdmVfcXVldWVfbnVtYmVyID0gTk9OX01BQ19RVUVVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfcnhfZnJhbWUoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgMHgwQSAtIE1BQyBSWCBGcmFtZSBJbnRlcnJ1cHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19NQUNfUlhfRlJBTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yZWNlaXZlX3F1ZXVlX251bWJlciA9IE1BQ19RVUVVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfcnhfZnJhbWUoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgMHgwQiAtIFRSQyBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFRSQyBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgY29uZGl0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdWJ0eXBlIGJpdCAxNCAtIHRyYW5zbWl0IEZJRk8gdW5kZXJydW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHN1YnR5cGUgYml0IDE1IC0gcmVjZWl2ZSBGSUZPIG92ZXJydW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJU0JfSU1DX1RSQ19GSUZPX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgJiBUUkNfRklGT19TVEFUVVNfVFhfVU5ERVJSVU4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cC0+cHRyX3R4X2ZpZm9fdW5kZXJydW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp0cC0+cHRyX3R4X2ZpZm9fdW5kZXJydW5zKSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgJiBUUkNfRklGT19TVEFUVVNfUlhfT1ZFUlJVTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBvdmVycnVuIHN0dWNrIHJlY2VpdmUgY291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmID49IDMsIGhhcyB0byBjbGVhciBpdCBieSBzZW5kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmFjayB0byBiYWNrIGZyYW1lcy4gV2UgcGljaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIERBVChkdXBsaWNhdGUgYWRkcmVzcyBNQUMgZnJhbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnJ4X2ZpZm9fb3ZlcnJ1bl9jb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHAtPnJ4X2ZpZm9fb3ZlcnJ1bl9jb3VudCA+PSAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yeF9maWZvX292ZXJydW5fY291bnQgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWxheSBjbGVhcmluZyBmaWZvIG92ZXJydW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGltYXNrIHRpbGwgc2VuZF9CVUcgdHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvbXBsZXRlIHBvc3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfdW5tYXNrX2JpdHMgJj0gKH4weDgwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9DUklUICJKYXkgcGxlYXNlIHNlbmQgYnVnXG4iKTsvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9zZW5kX2J1ZyhkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRwLT5wdHJfcnhfZmlmb19vdmVycnVucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqdHAtPnB0cl9yeF9maWZvX292ZXJydW5zKSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgMHgwQyAtIEFjdGlvbiBDb21tYW5kIFN0YXR1cyBJbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFN1YnR5cGUgYml0IDE0IC0gQ0IgZW5kIG9mIGNvbW1hbmQgY2hhaW4gKENFKQorICAgICAgICAgICAgICAgICAgICAgICAgICogU3VidHlwZSBiaXQgMTUgLSBDQiBjb21tYW5kIGludGVycnVwdCAoQ0kpCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19DT01NQU5EX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHAtPmFjYl9oZWFkLT5jbWQgPT0gQUNCX0NNRF9ISUNfTk9QKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJpMVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYWFhYWFhYWFhYWFhYWFggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBlcnIgPSBVTV9JbnRlcnJ1cHQoZGV2KTsgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX2VuYWJsZV8xNmJpdChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCh0cC0+YWNiX2hlYWQtPmNtZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gQUNCX0NNRF9SRUFEX1RSQ19TVEFUVVMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAodHAtPmFjYl9oZWFkLT5zdWJjbWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IFJXX1RSQ19TVEFUVVNfQkxPQ0spKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRwLT5wdHJfYmNuX3R5cGUgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih0cC0+cHRyX2Jjbl90eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKF9fdTMyKSgoU0Jsb2NrICopdHAtPm1pc2NfY29tbWFuZF9kYXRhKS0+QkNOX1R5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgoU0Jsb2NrICopdHAtPm1pc2NfY29tbWFuZF9kYXRhKS0+U3RhdHVzX0NIR19JbmRpY2F0ZSAmIEVSUk9SX0NPVU5URVJTX0NIQU5HRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX3VwZGF0ZV9lcnJfc3RhdHMoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKChTQmxvY2sgKil0cC0+bWlzY19jb21tYW5kX2RhdGEpLT5TdGF0dXNfQ0hHX0luZGljYXRlICYgVElfTkRJU19SSU5HX1NUQVRVU19DSEFOR0VEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cmluZ19zdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICgoU0Jsb2NrKil0cC0+bWlzY19jb21tYW5kX2RhdGEpLT5USV9ORElTX1JpbmdfU3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNtY3RyX3Jpbmdfc3RhdHVzX2NoZyhkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHRwLT5yaW5nX3N0YXR1cyAmIFJFTU9WRV9SRUNFSVZFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAodHAtPmNvbmZpZ193b3JkMCAmIE5PX0FVVE9SRU1PVkUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfaXNzdWVfcmVtb3ZlX2NtZChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXJyICE9IFNVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+YWNiX3BlbmRpbmcgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgoU0Jsb2NrICopdHAtPm1pc2NfY29tbWFuZF9kYXRhKS0+U3RhdHVzX0NIR19JbmRpY2F0ZSAmIFVOQV9DSEFOR0VEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cC0+cHRyX3VuYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5wdHJfdW5hWzBdID0gU1dBUF9CWVRFUygoKFNCbG9jayAqKXRwLT5taXNjX2NvbW1hbmRfZGF0YSktPlVOQVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnB0cl91bmFbMV0gPSBTV0FQX0JZVEVTKCgoU0Jsb2NrICopdHAtPm1pc2NfY29tbWFuZF9kYXRhKS0+VU5BWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cHRyX3VuYVsyXSA9IFNXQVBfQllURVMoKChTQmxvY2sgKil0cC0+bWlzY19jb21tYW5kX2RhdGEpLT5VTkFbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKChTQmxvY2sgKil0cC0+bWlzY19jb21tYW5kX2RhdGEpLT5TdGF0dXNfQ0hHX0luZGljYXRlICYgUkVBRFlfVE9fU0VORF9SUV9JTklUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfc2VuZF9ycV9pbml0KGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmFjYl9wZW5kaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgMHgwRCAtIE1BQyBUeXBlIDEgaW50ZXJydXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBTdWJ0eXBlIC0tIDAwIEZSX0JDTiByZWNlaXZlZCBhdCBTMTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgMDEgRlJfQkNOIHJlY2VpdmVkIGF0IFMyMQorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAwMiBGUl9EQVQoREE9TUEsIEE8PjApIHJlY2VpdmVkIGF0IFMyMQorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAwMyBUU01fRVhQIGF0IFMyMQorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAwNCBGUl9SRU1PVkUgcmVjZWl2ZWQgYXQgUzQyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIDA1IFRCUl9FWFAsIEJSX0ZMQUdfU0VUIGF0IFM0MgorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAwNiBUQlRfRVhQIGF0IFM1MworICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElTQl9JTUNfTUFDX1RZUEVfMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgPiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gSEFSRFdBUkVfRkFJTEVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGlzYl9zdWJ0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmpvaW5fc3RhdGUgPSBKU19CWVBBU1NfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cC0+c3RhdHVzICE9IENMT1NFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXR1cyA9IENMT1NFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfc3RhdHVzX2NoZyhkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+am9pbl9zdGF0ZSA9IEpTX0xPQkVfVEVTVF9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmpvaW5fc3RhdGUgPSBKU19ERVRFQ1RfTU9OSVRPUl9QUkVTRU5UX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+am9pbl9zdGF0ZSA9IEpTX0FXQUlUX05FV19NT05JVE9SX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+am9pbl9zdGF0ZSA9IEpTX0RVUExJQ0FURV9BRERSRVNTX1RFU1RfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5qb2luX3N0YXRlID0gSlNfTkVJR0hCT1JfTk9USUZJQ0FUSU9OX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+am9pbl9zdGF0ZSA9IEpTX1JFUVVFU1RfSU5JVElBTElaQVRJT05fU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5qb2luX3N0YXRlID0gSlNfSk9JTl9DT01QTEVURV9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0dXMgPSBPUEVOOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfc3RhdHVzX2NoZyhkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+am9pbl9zdGF0ZSA9IEpTX0JZUEFTU19XQUlUX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIDB4MEUgLSBUUkMgSW5pdGlhbGl6YXRpb24gU2VxdWVuY2UgSW50ZXJydXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBTdWJ0eXBlIC0tIDAwLUZGIEluaXRpYWxpemF0aW4gc2VxdWVuY2UgY29tcGxldGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJU0JfSU1DX1RSQ19JTlRSTkxfVFNUX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXR1cyA9IElOSVRJQUxJWkVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNtY3RyX3N0YXR1c19jaGcoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfZW5hYmxlXzE2Yml0KGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdGhlciBpbnRlcnJ1cHQgdHlwZXMsIGlsbGVnYWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKGVyciAhPSBTVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVja2luZyB0aGUgYWNrIGNvZGUgaW5zdGVhZCBvZiB0aGUgdW5tYXNrIGJpdHMgaGVyZSBpcyBiZWNhdXNlIDoKKyAgICAgICAgICogd2hpbGUgZml4aW5nIHRoZSBzdHVjayByZWNlaXZlLCBEQVQgZnJhbWUgYXJlIHNlbnQgYW5kIG1hc2sgb2ZmCisgICAgICAgICAqIEZJRk8gb3ZlcnJ1biBpbnRlcnJ1cHQgdGVtcG9yYXJpbHkgKGludGVycnVwdF91bm1hc2tfYml0cyA9IDApCisgICAgICAgICAqIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIGlzc3VlIGFjayB0byBJU0IKKyAgICAgICAgICovCisgICAgICAgIGlmKCEoaW50ZXJydXB0X2Fja19jb2RlICYgMHhmZjAwKSkKKyAgICAgICAgICAgICAgICBzbWN0cl9pc3N1ZV9pbnRfYWNrKGRldiwgaW50ZXJydXB0X2Fja19jb2RlLCBpbnRlcnJ1cHRfdW5tYXNrX2JpdHMpOworCisgICAgICAgIHNtY3RyX2Rpc2FibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgc21jdHJfZW5hYmxlX2JpY19pbnQoZGV2KTsKKyAgICAgICAgc3Bpbl91bmxvY2soJnRwLT5sb2NrKTsKKworICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfZW5hYmxlX2ludF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgX191MTYgaW50ZXJydXB0X2VuYWJsZV9tYXNrKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIHRwLT5zY2xiX3B0ci0+aW50X21hc2tfY29udHJvbCAgPSBpbnRlcnJ1cHRfZW5hYmxlX21hc2s7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCAgICAgPSBTQ0xCX1ZBTElEIHwgU0NMQl9DTURfQ0xFQVJfSU5URVJSVVBUX01BU0s7CisKKyAgICAgICAgc21jdHJfc2V0X2N0cmxfYXR0ZW50aW9uKGRldik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9pbnRfYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IGlhY2tfY29kZSwgX191MTYgaWJpdHMpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBpZihzbWN0cl93YWl0X3doaWxlX2NidXN5KGRldikpCisgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICAgICAgdHAtPnNjbGJfcHRyLT5pbnRfbWFza19jb250cm9sID0gaWJpdHM7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+aWFja19jb2RlID0gaWFja19jb2RlIDw8IDE7IC8qIHVzZSB0aGUgb2Zmc2V0IGZyb20gYmFzZSAqLyAgICAgICAgdHAtPnNjbGJfcHRyLT5yZXN1bWVfY29udHJvbCA9IDA7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCA9IFNDTEJfVkFMSUQgfCBTQ0xCX0lBQ0tfQ09ERV9WQUxJRCB8IFNDTEJfQ01EX0NMRUFSX0lOVEVSUlVQVF9NQVNLOworCisgICAgICAgIHNtY3RyX3NldF9jdHJsX2F0dGVudGlvbihkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfaW5pdF90aW1lcnNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIF9fdTE2ICpwVGltZXJfU3RydWMgPSAoX191MTYgKil0cC0+bWlzY19jb21tYW5kX2RhdGE7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgdHAtPmNvbmZpZ193b3JkMCA9IFRIRFJFTiB8IERNQV9UUklHR0VSIHwgVVNFVFBUIHwgTk9fQVVUT1JFTU9WRTsKKyAgICAgICAgdHAtPmNvbmZpZ193b3JkMSA9IDA7CisKKyAgICAgICAgaWYoKHRwLT5tZWRpYV90eXBlID09IE1FRElBX1NUUF8xNikKKyAgICAgICAgICAgICAgICB8fCAodHAtPm1lZGlhX3R5cGUgPT0gTUVESUFfVVRQXzE2KQorICAgICAgICAgICAgICAgIHx8ICh0cC0+bWVkaWFfdHlwZSA9PSBNRURJQV9TVFBfMTZfVVRQXzE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgfD0gRlJFUV8xNk1CX0JJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHRwLT5tb2RlX2JpdHMgJiBFQVJMWV9UT0tFTl9SRUwpCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCB8PSBFVFJFTjsKKworICAgICAgICBpZih0cC0+bW9kZV9iaXRzICYgTE9PUElOR19NT0RFX01BU0spCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCB8PSBSWF9PV05fQklUOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCAmPSB+UlhfT1dOX0JJVDsKKworICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgUFJPTUlTQ1VPVVNfTU9ERSkKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwIHw9IFBST01JU0NVT1VTX0JJVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgJj0gflBST01JU0NVT1VTX0JJVDsKKworICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX0VSUl9QQUNLRVRTKQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgfD0gU0FWQkFEX0JJVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgJj0gflNBVkJBRF9CSVQ7CisKKyAgICAgICAgaWYodHAtPnJlY2VpdmVfbWFzayAmIEFDQ0VQVF9BVFRfTUFDX0ZSQU1FUykKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwIHw9IFJYQVRNQUM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwICY9IH5SWEFUTUFDOworCisgICAgICAgIGlmKHRwLT5yZWNlaXZlX21hc2sgJiBBQ0NFUFRfTVVMVElfUFJPTSkKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQxIHw9IE1VTFRJQ0FTVF9BRERSRVNTX0JJVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgJj0gfk1VTFRJQ0FTVF9BRERSRVNTX0JJVDsKKworICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX1NPVVJDRV9ST1VUSU5HX1NQQU5OSU5HKQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgfD0gU09VUkNFX1JPVVRJTkdfU1BBTk5JTkdfQklUUzsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodHAtPnJlY2VpdmVfbWFzayAmIEFDQ0VQVF9TT1VSQ0VfUk9VVElORykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgfD0gU09VUkNFX1JPVVRJTkdfRVhQTE9SRVJfQklUOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgJj0gflNPVVJDRV9ST1VUSU5HX1NQQU5OSU5HX0JJVFM7CisgICAgICAgIH0KKworICAgICAgICBpZigodHAtPm1lZGlhX3R5cGUgPT0gTUVESUFfU1RQXzE2KQorICAgICAgICAgICAgICAgIHx8ICh0cC0+bWVkaWFfdHlwZSA9PSBNRURJQV9VVFBfMTYpCisgICAgICAgICAgICAgICAgfHwgKHRwLT5tZWRpYV90eXBlID09IE1FRElBX1NUUF8xNl9VVFBfMTYpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMSB8PSBJTlRFUkZSQU1FX1NQQUNJTkdfMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgfD0gSU5URVJGUkFNRV9TUEFDSU5HXzQ7CisKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gdHAtPmNvbmZpZ193b3JkMDsKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gdHAtPmNvbmZpZ193b3JkMTsKKworICAgICAgICBpZigodHAtPm1lZGlhX3R5cGUgPT0gTUVESUFfU1RQXzQpCisgICAgICAgICAgICAgICAgfHwgKHRwLT5tZWRpYV90eXBlID09IE1FRElBX1VUUF80KQorICAgICAgICAgICAgICAgIHx8ICh0cC0+bWVkaWFfdHlwZSA9PSBNRURJQV9TVFBfNF9VVFBfNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDAwRkE7ICAgICAgIC8qIHByZXNjYWxlICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgyNzEwOyAgICAgICAvKiBUUFRfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDI3MTA7ICAgICAgIC8qIFRRUF9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MEEyODsgICAgICAgLyogVE5UX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgzRTgwOyAgICAgICAvKiBUQlRfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDNBOTg7ICAgICAgIC8qIFRTTV9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MUI1ODsgICAgICAgLyogVEFNX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgwMEM4OyAgICAgICAvKiBUQlJfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDA3RDA7ICAgICAgIC8qIFRFUl9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MDAwQTsgICAgICAgLyogVEdUX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgxMTYyOyAgICAgICAvKiBUSFRfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDA3RDA7ICAgICAgIC8qIFRSUl9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MTM4ODsgICAgICAgLyogVFZYX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgwMDAwOyAgICAgICAvKiByZXNlcnZlZCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MDNFODsgICAgICAgLyogcHJlc2NhbGUgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDlDNDA7ICAgICAgIC8qIFRQVF9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4OUM0MDsgICAgICAgLyogVFFQX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgwQTI4OyAgICAgICAvKiBUTlRfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDNFODA7ICAgICAgIC8qIFRCVF9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4M0E5ODsgICAgICAgLyogVFNNX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgxQjU4OyAgICAgICAvKiBUQU1fbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDAwQzg7ICAgICAgIC8qIFRCUl9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MDdEMDsgICAgICAgLyogVEVSX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgwMDBBOyAgICAgICAvKiBUR1RfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDQ1ODg7ICAgICAgIC8qIFRIVF9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MUY0MDsgICAgICAgLyogVFJSX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHg0RTIwOyAgICAgICAvKiBUVlhfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDAwMDA7ICAgICAgIC8qIHJlc2VydmVkICovCisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgbm9kZSBhZGRyZXNzLiAqLworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSBkZXYtPmRldl9hZGRyWzBdIDw8IDgKKyAgICAgICAgICAgICAgICB8IChkZXYtPmRldl9hZGRyWzFdICYgMHhGRik7CisgICAgICAgICpwVGltZXJfU3RydWMrKyA9IGRldi0+ZGV2X2FkZHJbMl0gPDwgOAorICAgICAgICAgICAgICAgIHwgKGRldi0+ZGV2X2FkZHJbM10gJiAweEZGKTsKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gZGV2LT5kZXZfYWRkcls0XSA8PCA4CisgICAgICAgICAgICAgICAgfCAoZGV2LT5kZXZfYWRkcls1XSAmIDB4RkYpOworCisgICAgICAgIC8qIFNldCBncm91cCBhZGRyZXNzLiAqLworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+Z3JvdXBfYWRkcmVzc18wIDw8IDgKKyAgICAgICAgICAgICAgICB8IHRwLT5ncm91cF9hZGRyZXNzXzAgPj4gODsKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gdHAtPmdyb3VwX2FkZHJlc3NbMF0gPDwgOAorICAgICAgICAgICAgICAgIHwgdHAtPmdyb3VwX2FkZHJlc3NbMF0gPj4gODsKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gdHAtPmdyb3VwX2FkZHJlc3NbMV0gPDwgOAorICAgICAgICAgICAgICAgIHwgdHAtPmdyb3VwX2FkZHJlc3NbMV0gPj4gODsKKworICAgICAgICAvKiBTZXQgZnVuY3Rpb25hbCBhZGRyZXNzLiAqLworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+ZnVuY3Rpb25hbF9hZGRyZXNzXzAgPDwgOAorICAgICAgICAgICAgICAgIHwgdHAtPmZ1bmN0aW9uYWxfYWRkcmVzc18wID4+IDg7CisgICAgICAgICpwVGltZXJfU3RydWMrKyA9IHRwLT5mdW5jdGlvbmFsX2FkZHJlc3NbMF0gPDwgOAorICAgICAgICAgICAgICAgIHwgdHAtPmZ1bmN0aW9uYWxfYWRkcmVzc1swXSA+PiA4OworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+ZnVuY3Rpb25hbF9hZGRyZXNzWzFdIDw8IDgKKyAgICAgICAgICAgICAgICB8IHRwLT5mdW5jdGlvbmFsX2FkZHJlc3NbMV0gPj4gODsKKworICAgICAgICAvKiBTZXQgQml0LVdpc2UgZ3JvdXAgYWRkcmVzcy4gKi8KKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gdHAtPmJpdHdpc2VfZ3JvdXBfYWRkcmVzc1swXSA8PCA4CisgICAgICAgICAgICAgICAgfCB0cC0+Yml0d2lzZV9ncm91cF9hZGRyZXNzWzBdID4+IDg7CisgICAgICAgICpwVGltZXJfU3RydWMrKyA9IHRwLT5iaXR3aXNlX2dyb3VwX2FkZHJlc3NbMV0gPDwgOAorICAgICAgICAgICAgICAgIHwgdHAtPmJpdHdpc2VfZ3JvdXBfYWRkcmVzc1sxXSA+PiA4OworCisgICAgICAgIC8qIFNldCByaW5nIG51bWJlciBhZGRyZXNzLiAqLworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+c291cmNlX3JpbmdfbnVtYmVyOworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+dGFyZ2V0X3JpbmdfbnVtYmVyOworCisgICAgICAgIC8qIFBoeXNpY2FsIGRyb3AgbnVtYmVyLiAqLworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAodW5zaWduZWQgc2hvcnQpMDsKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gKHVuc2lnbmVkIHNob3J0KTA7CisKKyAgICAgICAgLyogUHJvZHVjdCBpbnN0YW5jZSBJRC4gKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgOTsgaSsrKQorICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9ICh1bnNpZ25lZCBzaG9ydCkwOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWRfd19kYXRhKGRldiwgQUNCX0NNRF9JTklUX1RSQ19USU1FUlMsIDApOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9pbml0X3R4cnhfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIHZvaWQgKip0eHJ4X3B0cnMgPSAodm9pZCAqKXRwLT5taXNjX2NvbW1hbmRfZGF0YTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorCXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBIYXJkd2FyZSBmYWlsdXJlXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEluaXRpYWxpemUgVHJhbnNtaXQgUXVldWUgUG9pbnRlcnMgdGhhdCBhcmUgdXNlZCwgdG8gcG9pbnQgdG8KKyAgICAgICAgICogYSBzaW5nbGUgRkNCLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgTlVNX1RYX1FTX1VTRUQ7IGkrKykKKyAgICAgICAgICAgICAgICAqdHhyeF9wdHJzKysgPSAodm9pZCAqKVRSQ19QT0lOVEVSKHRwLT50eF9mY2JfaGVhZFtpXSk7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBUcmFuc21pdCBRdWV1ZSBQb2ludGVycyB0aGF0IGFyZSBOT1QgdXNlZCB0byBaRVJPLiAqLworICAgICAgICBmb3IoOyBpIDwgTUFYX1RYX1FTOyBpKyspCisgICAgICAgICAgICAgICAgKnR4cnhfcHRycysrID0gKHZvaWQgKikwOworCisgICAgICAgIC8qIEluaXRpYWxpemUgUmVjZWl2ZSBRdWV1ZSBQb2ludGVycyAoTUFDIGFuZCBOb24tTUFDKSB0aGF0IGFyZQorICAgICAgICAgKiB1c2VkLCB0byBwb2ludCB0byBhIHNpbmdsZSBGQ0IgYW5kIGEgQkRCIGNoYWluIG9mIGJ1ZmZlcnMuCisgICAgICAgICAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCBOVU1fUlhfUVNfVVNFRDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgKnR4cnhfcHRycysrID0gKHZvaWQgKilUUkNfUE9JTlRFUih0cC0+cnhfZmNiX2hlYWRbaV0pOworICAgICAgICAgICAgICAgICp0eHJ4X3B0cnMrKyA9ICh2b2lkICopVFJDX1BPSU5URVIodHAtPnJ4X2JkYl9oZWFkW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEluaXRpYWxpemUgUmVjZWl2ZSBRdWV1ZSBQb2ludGVycyB0aGF0IGFyZSBOT1QgdXNlZCB0byBaRVJPLiAqLworICAgICAgICBmb3IoOyBpIDwgTUFYX1JYX1FTOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqdHhyeF9wdHJzKysgPSAodm9pZCAqKTA7CisgICAgICAgICAgICAgICAgKnR4cnhfcHRycysrID0gKHZvaWQgKikwOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZF93X2RhdGEoZGV2LCBBQ0JfQ01EX0lOSVRfVFhfUlgsIDApOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9pbnNlcnRfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZChkZXYsIEFDQl9DTURfSU5TRVJULCBBQ0JfU1VCX0NNRF9OT1ApOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9yZWFkX3Jpbmdfc3RhdHVzX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X3doaWxlX2NidXN5KGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF9jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWRfd19kYXRhKGRldiwgQUNCX0NNRF9SRUFEX1RSQ19TVEFUVVMsCisgICAgICAgICAgICAgICAgUldfVFJDX1NUQVRVU19CTE9DSyk7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3JlYWRfd29yZF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgYXdvcmRfY250KQoreworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X3doaWxlX2NidXN5KGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF9jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWRfd19kYXRhKGRldiwgQUNCX0NNRF9NQ1RfUkVBRF9WQUxVRSwKKyAgICAgICAgICAgICAgICBhd29yZF9jbnQpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9yZW1vdmVfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgdHAtPnNjbGJfcHRyLT5yZXN1bWVfY29udHJvbCAgICA9IDA7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCAgICAgPSBTQ0xCX1ZBTElEIHwgU0NMQl9DTURfUkVNT1ZFOworCisgICAgICAgIHNtY3RyX3NldF9jdHJsX2F0dGVudGlvbihkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfcmVzdW1lX2FjYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X3doaWxlX2NidXN5KGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICB0cC0+c2NsYl9wdHItPnJlc3VtZV9jb250cm9sID0gU0NMQl9SQ19BQ0I7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCAgPSBTQ0xCX1ZBTElEIHwgU0NMQl9SRVNVTUVfQ09OVFJPTF9WQUxJRDsKKworICAgICAgICB0cC0+YWNiX3BlbmRpbmcgPSAxOworCisgICAgICAgIHNtY3RyX3NldF9jdHJsX2F0dGVudGlvbihkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfcmVzdW1lX3J4X2JkYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYocXVldWUgPT0gTUFDX1FVRVVFKQorICAgICAgICAgICAgICAgIHRwLT5zY2xiX3B0ci0+cmVzdW1lX2NvbnRyb2wgPSBTQ0xCX1JDX1JYX01BQ19CREI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0cC0+c2NsYl9wdHItPnJlc3VtZV9jb250cm9sID0gU0NMQl9SQ19SWF9OT05fTUFDX0JEQjsKKworICAgICAgICB0cC0+c2NsYl9wdHItPnZhbGlkX2NvbW1hbmQgPSBTQ0xCX1ZBTElEIHwgU0NMQl9SRVNVTUVfQ09OVFJPTF9WQUxJRDsKKworICAgICAgICBzbWN0cl9zZXRfY3RybF9hdHRlbnRpb24oZGV2KTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9mY2JfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHF1ZXVlKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9mY2JfY21kXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIGlmKHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koZGV2KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKworICAgICAgICBpZihxdWV1ZSA9PSBNQUNfUVVFVUUpCisgICAgICAgICAgICAgICAgdHAtPnNjbGJfcHRyLT5yZXN1bWVfY29udHJvbCA9IFNDTEJfUkNfUlhfTUFDX0ZDQjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5zY2xiX3B0ci0+cmVzdW1lX2NvbnRyb2wgPSBTQ0xCX1JDX1JYX05PTl9NQUNfRkNCOworCisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCA9IFNDTEJfVkFMSUQgfCBTQ0xCX1JFU1VNRV9DT05UUk9MX1ZBTElEOworCisgICAgICAgIHNtY3RyX3NldF9jdHJsX2F0dGVudGlvbihkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfcmVzdW1lX3R4X2ZjYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfaXNzdWVfcmVzdW1lX3R4X2ZjYl9jbWRcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgaWYoc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKQorICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOworCisgICAgICAgIHRwLT5zY2xiX3B0ci0+cmVzdW1lX2NvbnRyb2wgPSAoU0NMQl9SQ19URkNCMCA8PCBxdWV1ZSk7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCA9IFNDTEJfUkVTVU1FX0NPTlRST0xfVkFMSUQgfCBTQ0xCX1ZBTElEOworCisgICAgICAgIHNtY3RyX3NldF9jdHJsX2F0dGVudGlvbihkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdGVzdF9pbnRlcm5hbF9yb21fY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZChkZXYsIEFDQl9DTURfTUNUX1RFU1QsCisgICAgICAgICAgICAgICAgVFJDX0lOVEVSTkFMX1JPTV9URVNUKTsKKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdGVzdF9oaWNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZChkZXYsIEFDQl9DTURfSElDX1RFU1QsCisgICAgICAgICAgICAgICAgVFJDX0hPU1RfSU5URVJGQUNFX1JFR19URVNUKTsKKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdGVzdF9tYWNfcmVnX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWQoZGV2LCBBQ0JfQ01EX01DVF9URVNULAorICAgICAgICAgICAgICAgIFRSQ19NQUNfUkVHSVNURVJTX1RFU1QpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV90cmNfbG9vcGJhY2tfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZChkZXYsIEFDQl9DTURfTUNUX1RFU1QsCisgICAgICAgICAgICAgICAgVFJDX0lOVEVSTkFMX0xPT1BCQUNLKTsKKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdHJpX2xvb3BiYWNrX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWQoZGV2LCBBQ0JfQ01EX01DVF9URVNULAorICAgICAgICAgICAgICAgIFRSQ19UUklfTE9PUEJBQ0spOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV93cml0ZV9ieXRlX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBzaG9ydCBhd29yZF9jbnQsIHZvaWQgKmJ5dGUpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgaXdvcmQsIGlieXRlOworCWludCBlcnI7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgZm9yKGl3b3JkID0gMCwgaWJ5dGUgPSAwOyBpd29yZCA8ICh1bnNpZ25lZCBpbnQpKGF3b3JkX2NudCAmIDB4ZmYpOworICAgICAgICAJaXdvcmQrKywgaWJ5dGUgKz0gMikKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHRwLT5taXNjX2NvbW1hbmRfZGF0YVtpd29yZF0gPSAoKigoX191OCAqKWJ5dGUgKyBpYnl0ZSkgPDwgOCkKKwkJCXwgKCooKF9fdTggKilieXRlICsgaWJ5dGUgKyAxKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHNtY3RyX3NldHVwX3NpbmdsZV9jbWRfd19kYXRhKGRldiwgQUNCX0NNRF9NQ1RfV1JJVEVfVkFMVUUsIAorCQlhd29yZF9jbnQpKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV93cml0ZV93b3JkX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBzaG9ydCBhd29yZF9jbnQsIHZvaWQgKndvcmQpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGksIGVycjsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCAodW5zaWduZWQgaW50KShhd29yZF9jbnQgJiAweGZmKTsgaSsrKQorICAgICAgICAgICAgICAgIHRwLT5taXNjX2NvbW1hbmRfZGF0YVtpXSA9ICooKF9fdTE2ICopd29yZCArIGkpOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWRfd19kYXRhKGRldiwgQUNCX0NNRF9NQ1RfV1JJVEVfVkFMVUUsCisgICAgICAgICAgICAgICAgYXdvcmRfY250KTsKKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfam9pbl9jb21wbGV0ZV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWQoZGV2LCBBQ0JfQ01EX0NIQU5HRV9KT0lOX1NUQVRFLAorICAgICAgICAgICAgICAgIEpTX0pPSU5fQ09NUExFVEVfU1RBVEUpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9saW5rX3R4X2ZjYnNfdG9fYmRicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgICAgICBGQ0Jsb2NrICpmY2I7CisgICAgICAgIEJEQmxvY2sgKmJkYjsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCBOVU1fVFhfUVNfVVNFRDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgZmNiID0gdHAtPnR4X2ZjYl9oZWFkW2ldOworICAgICAgICAgICAgICAgIGJkYiA9IHRwLT50eF9iZGJfaGVhZFtpXTsKKworICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IHRwLT5udW1fdHhfZmNic1tpXTsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+YmRiX3B0ciAgICAgICAgICAgID0gYmRiOworICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT50cmNfYmRiX3B0ciAgICAgICAgPSBUUkNfUE9JTlRFUihiZGIpOworICAgICAgICAgICAgICAgICAgICAgICAgZmNiID0gKEZDQmxvY2sgKikoKGNoYXIgKilmY2IgKyBzaXplb2YoRkNCbG9jaykpOworICAgICAgICAgICAgICAgICAgICAgICAgYmRiID0gKEJEQmxvY2sgKikoKGNoYXIgKiliZGIgKyBzaXplb2YoQkRCbG9jaykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbG9hZF9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIF9fdTE2IGksIGNoZWNrc3VtID0gMDsKKyAgICAgICAgaW50IGVyciA9IDA7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2xvYWRfZmlybXdhcmVcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgdHAtPnB0cl91Y29kZSAgICAgICAgICAgPSBzbWN0cl9jb2RlOworICAgICAgICB0cC0+bnVtX29mX3R4X2J1ZmZzICAgICA9IDQ7CisgICAgICAgIHRwLT5tb2RlX2JpdHMgICAgICAgICAgfD0gVU1BQzsKKyAgICAgICAgdHAtPnJlY2VpdmVfbWFzayAgICAgICAgPSAwOworICAgICAgICB0cC0+bWF4X3BhY2tldF9zaXplICAgICA9IDQxNzc7CisKKyAgICAgICAgLyogQ2FuIG9ubHkgdXBsb2FkIHRoZSBmaXJtd2FyZSBvbmNlIHBlciBhZGFwdGVyIHJlc2V0LiAqLworICAgICAgICBpZih0cC0+bWljcm9jb2RlX3ZlcnNpb24gIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFVDT0RFX1BSRVNFTlQpOworCisgICAgICAgIC8qIFZlcmlmeSB0aGUgZmlybXdhcmUgZXhpc3RzIGFuZCBpcyB0aGVyZSBpbiB0aGUgcmlnaHQgYW1vdW50LiAqLworICAgICAgICBpZigodHAtPnB0cl91Y29kZSA9PSAwTCkKKyAgICAgICAgICAgICAgICB8fCAoKih0cC0+cHRyX3Vjb2RlICsgVUNPREVfVkVSU0lPTl9PRkZTRVQpIDwgVUNPREVfVkVSU0lPTikpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFVDT0RFX05PVF9QUkVTRU5UKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFVDT0RFX1NJWkUgaXMgbm90IGluY2x1ZGVkIGluIENoZWNrc3VtLiAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCAqKChfX3UxNiAqKSh0cC0+cHRyX3Vjb2RlICsgVUNPREVfU0laRV9PRkZTRVQpKTsgaSArPSAyKQorICAgICAgICAgICAgICAgIGNoZWNrc3VtICs9ICooKF9fdTE2ICopKHRwLT5wdHJfdWNvZGUgKyAyICsgaSkpOworICAgICAgICBpZihjaGVja3N1bSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFVDT0RFX05PVF9QUkVTRU5UKTsKKworICAgICAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYSB2YWxpZCBmaXJtd2FyZSBpbWFnZSwgbGV0cyBraWNrIGl0IG9uIHVwLiAqLworICAgICAgICBzbWN0cl9lbmFibGVfYWRhcHRlcl9yYW0oZGV2KTsKKyAgICAgICAgc21jdHJfZW5hYmxlXzE2Yml0KGRldik7CisgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgKF9fdTggKil0cC0+cmFtX2FjY2Vzcyk7CisKKyAgICAgICAgaWYoKHNtY3RyX2NoZWNrc3VtX2Zpcm13YXJlKGRldikpCisgICAgICAgICAgICAgICAgfHwgKCoodHAtPnB0cl91Y29kZSArIFVDT0RFX1ZFUlNJT05fT0ZGU0VUKQorICAgICAgICAgICAgICAgID4gdHAtPm1pY3JvY29kZV92ZXJzaW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHNtY3RyX2VuYWJsZV9hZGFwdGVyX2N0cmxfc3RvcmUoZGV2KTsKKworICAgICAgICAgICAgICAgIC8qIFplcm8gb3V0IHJhbSBzcGFjZSBmb3IgZmlybXdhcmUuICovCisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgQ1NfUkFNX1NJWkU7IGkgKz0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICooKF9fdTE2ICopKHRwLT5yYW1fYWNjZXNzICsgaSkpID0gMDsKKworICAgICAgICAgICAgICAgIHNtY3RyX2RlY29kZV9maXJtd2FyZShkZXYpOworCisgICAgICAgICAgICAgICAgdHAtPm1pY3JvY29kZV92ZXJzaW9uID0gKih0cC0+cHRyX3Vjb2RlICsgVUNPREVfVkVSU0lPTl9PRkZTRVQpOyAgICAgICAgICAgICAgICAqKChfX3UxNiAqKSh0cC0+cmFtX2FjY2VzcyArIENTX1JBTV9WRVJTSU9OX09GRlNFVCkpCisgICAgICAgICAgICAgICAgICAgICAgICA9ICh0cC0+bWljcm9jb2RlX3ZlcnNpb24gPDwgOCk7CisgICAgICAgICAgICAgICAgKigoX191MTYgKikodHAtPnJhbV9hY2Nlc3MgKyBDU19SQU1fQ0hFQ0tTVU1fT0ZGU0VUKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID0gfih0cC0+bWljcm9jb2RlX3ZlcnNpb24gPDwgOCkgKyAxOworCisgICAgICAgICAgICAgICAgc21jdHJfZGlzYWJsZV9hZGFwdGVyX2N0cmxfc3RvcmUoZGV2KTsKKworICAgICAgICAgICAgICAgIGlmKHNtY3RyX2NoZWNrc3VtX2Zpcm13YXJlKGRldikpCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBIQVJEV0FSRV9GQUlMRUQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVyciA9IFVDT0RFX1BSRVNFTlQ7CisKKyAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9sb2FkX25vZGVfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICBfX3U4IHI7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgciA9IGluYihpb2FkZHIgKyBMQVIwICsgaSk7CisgICAgICAgICAgICAgICAgZGV2LT5kZXZfYWRkcltpXSA9IChjaGFyKXI7CisgICAgICAgIH0KKyAgICAgICAgZGV2LT5hZGRyX2xlbiA9IDY7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworLyogTG9iZSBNZWRpYSBUZXN0LgorICogRHVyaW5nIHRoZSB0cmFuc21pc3Npb24gb2YgdGhlIGluaXRpYWwgMTUwMCBsb2JlIG1lZGlhIE1BQyBmcmFtZXMsCisgKiB0aGUgcGhhc2UgbG9jayBsb29wIGluIHRoZSA4MDUgY2hpcCBtYXkgbG9jaywgYW5kIHRoZW4gdW4tbG9jaywgY2F1c2luZworICogdGhlIDgyNSB0byBnbyBpbnRvIGEgUFVSR0Ugc3RhdGUuIFdoZW4gcGVyZm9ybWluZyBhIFBVUkdFLCB0aGUgTUNUCisgKiBtaWNyb2NvZGUgd2lsbCBub3QgdHJhbnNtaXQgYW55IGZyYW1lcyBnaXZlbiB0byBpdCBieSB0aGUgaG9zdCwgYW5kCisgKiB3aWxsIGNvbnNlcXVlbnRseSBjYXVzZSBhIHRpbWVvdXQuCisgKgorICogTk9URSAxOiBJZiB0aGUgbW9uaXRvcl9zdGF0ZSBpcyBNU19CRUFDT05fVEVTVF9TVEFURSwgYWxsIHRyYW5zbWl0CisgKiBxdWV1ZXMgb3RoZXIgdGhlbiB0aGUgb25lIHVzZWQgZm9yIHRoZSBsb2JlX21lZGlhX3Rlc3Qgc2hvdWxkIGJlCisgKiBkaXNhYmxlZC4hPworICoKKyAqIE5PVEUgMjogSWYgdGhlIG1vbml0b3Jfc3RhdGUgaXMgTVNfQkVBQ09OX1RFU1RfU1RBVEUgYW5kIHRoZSByZWNlaXZlX21hc2sKKyAqIGhhcyBhbnkgbXVsdGktY2FzdCBvciBwcm9taXNjb3VzIGJpdHMgc2V0LCB0aGUgcmVjZWl2ZV9tYXNrIG5lZWRzIHRvCisgKiBiZSBjaGFuZ2VkIHRvIGNsZWFyIHRoZSBtdWx0aS1jYXN0IG9yIHByb21pc2NvdXMgbW9kZSBiaXRzLCB0aGUgbG9iZV90ZXN0CisgKiBydW4sIGFuZCB0aGVuIHRoZSByZWNlaXZlIG1hc2sgc2V0IGJhY2sgdG8gaXRzIG9yaWdpbmFsIHZhbHVlIGlmIHRoZSB0ZXN0CisgKiBpcyBzdWNjZXNzZnVsLgorICovCitzdGF0aWMgaW50IHNtY3RyX2xvYmVfbWVkaWFfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpLCBwZXJyb3IgPSAwOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBzYXZlZF9yY3ZfbWFzazsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfbG9iZV9tZWRpYV90ZXN0XG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIC8qIENsZWFyIHJlY2VpdmUgbWFzayBmb3IgbG9iZSB0ZXN0LiAqLworICAgICAgICBzYXZlZF9yY3ZfbWFzayAgICAgICAgICA9IHRwLT5yZWNlaXZlX21hc2s7CisgICAgICAgIHRwLT5yZWNlaXZlX21hc2sgICAgICAgID0gMDsKKworICAgICAgICBzbWN0cl9jaGdfcnhfbWFzayhkZXYpOworCisgICAgICAgIC8qIFNldHVwIHRoZSBsb2JlIG1lZGlhIHRlc3QuICovCisgICAgICAgIHNtY3RyX2xvYmVfbWVkaWFfdGVzdF9jbWQoZGV2KTsKKyAgICAgICAgaWYoc21jdHJfd2FpdF9jbWQoZGV2KSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHNtY3RyX3Jlc2V0X2FkYXB0ZXIoZGV2KTsKKyAgICAgICAgICAgICAgICB0cC0+c3RhdHVzID0gQ0xPU0VEOworICAgICAgICAgICAgICAgIHJldHVybiAoTE9CRV9NRURJQV9URVNUX0ZBSUxFRCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBUeCBsb2JlIG1lZGlhIHRlc3QgZnJhbWVzLiAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCAxNTAwOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihzbWN0cl9zZW5kX2xvYmVfbWVkaWFfdGVzdChkZXYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBlcnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfcmVzZXRfYWRhcHRlcihkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdGUgPSBDTE9TRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTE9CRV9NRURJQV9URVNUX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnJvciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNtY3RyX2xvYmVfbWVkaWFfdGVzdF9jbWQoZGV2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX3Jlc2V0X2FkYXB0ZXIoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdGUgPSBDTE9TRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChMT0JFX01FRElBX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKHNtY3RyX3NlbmRfZGF0KGRldikpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihzbWN0cl9zZW5kX2RhdChkZXYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX3Jlc2V0X2FkYXB0ZXIoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0ZSA9IENMT1NFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTE9CRV9NRURJQV9URVNUX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgYW55IGZyYW1lcyByZWNlaXZlZCBkdXJpbmcgdGVzdC4gKi8KKyAgICAgICAgaWYoKHRwLT5yeF9mY2JfY3VycltNQUNfUVVFVUVdLT5mcmFtZV9zdGF0dXMpCisgICAgICAgICAgICAgICAgfHwgKHRwLT5yeF9mY2JfY3VycltOT05fTUFDX1FVRVVFXS0+ZnJhbWVfc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHNtY3RyX3Jlc2V0X2FkYXB0ZXIoZGV2KTsKKyAgICAgICAgICAgICAgICB0cC0+c3RhdGUgPSBDTE9TRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIChMT0JFX01FRElBX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldCByZWNlaXZlIG1hc2sgdG8gIlByb21pc2MiIG1vZGUuICovCisgICAgICAgIHRwLT5yZWNlaXZlX21hc2sgPSBzYXZlZF9yY3ZfbWFzazsKKworICAgICAgICBzbWN0cl9jaGdfcnhfbWFzayhkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbG9iZV9tZWRpYV90ZXN0X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2xvYmVfbWVkaWFfdGVzdF9jbWRcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgLyogQ2hhbmdlIHRvIGxvYmUgbWVkaWEgdGVzdCBzdGF0ZS4gKi8KKyAgICAgICAgaWYodHAtPm1vbml0b3Jfc3RhdGUgIT0gTVNfQkVBQ09OX1RFU1RfU1RBVEUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbWN0cl9sb2JlX21lZGlhX3Rlc3Rfc3RhdGUoZGV2KTsKKyAgICAgICAgICAgICAgICBpZihzbWN0cl93YWl0X2NtZChkZXYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiTG9iZSBGYWlsZWQgdGVzdCBzdGF0ZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKExPQkVfTUVESUFfVEVTVF9GQUlMRUQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWQoZGV2LCBBQ0JfQ01EX01DVF9URVNULAorICAgICAgICAgICAgICAgIFRSQ19MT0JFX01FRElBX1RFU1QpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9sb2JlX21lZGlhX3Rlc3Rfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBlcnIgPSBzbWN0cl9zZXR1cF9zaW5nbGVfY21kKGRldiwgQUNCX0NNRF9DSEFOR0VfSk9JTl9TVEFURSwKKyAgICAgICAgICAgICAgICBKU19MT0JFX1RFU1RfU1RBVEUpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlXzgwMjVfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19IRUFERVIgKnJtZiwgTUFDX0hFQURFUiAqdG1mLCBfX3UxNiBhY19mYykKK3sKKyAgICAgICAgdG1mLT5hYyA9IE1TQihhY19mYyk7ICAgICAgICAgICAgICAgICAvKiBtc2IgaXMgYWNjZXNzIGNvbnRyb2wgKi8KKyAgICAgICAgdG1mLT5mYyA9IExTQihhY19mYyk7ICAgICAgICAgICAgICAgICAvKiBsc2IgaXMgZnJhbWUgY29udHJvbCAqLworCisgICAgICAgIHRtZi0+c2FbMF0gPSBkZXYtPmRldl9hZGRyWzBdOworICAgICAgICB0bWYtPnNhWzFdID0gZGV2LT5kZXZfYWRkclsxXTsKKyAgICAgICAgdG1mLT5zYVsyXSA9IGRldi0+ZGV2X2FkZHJbMl07CisgICAgICAgIHRtZi0+c2FbM10gPSBkZXYtPmRldl9hZGRyWzNdOworICAgICAgICB0bWYtPnNhWzRdID0gZGV2LT5kZXZfYWRkcls0XTsKKyAgICAgICAgdG1mLT5zYVs1XSA9IGRldi0+ZGV2X2FkZHJbNV07CisKKyAgICAgICAgc3dpdGNoKHRtZi0+dmMpCisgICAgICAgIHsKKwkJLyogU2VuZCBSUV9JTklUIHRvIFJQUyAqLworICAgICAgICAgICAgICAgIGNhc2UgUlFfSU5JVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbMF0gPSAweGMwOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVsxXSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzJdID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbM10gPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVs0XSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzVdID0gMHgwMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCS8qIFNlbmQgUlBUX1RYX0ZPUldBUkQgdG8gQ1JTICovCisgICAgICAgICAgICAgICAgY2FzZSBSUFRfVFhfRk9SV0FSRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbMF0gPSAweGMwOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVsxXSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzJdID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbM10gPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVs0XSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzVdID0gMHgxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCS8qIEV2ZXJ5dGhpbmcgZWxzZSBnb2VzIHRvIHNlbmRlciAqLworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzBdID0gcm1mLT5zYVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbMV0gPSBybWYtPnNhWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVsyXSA9IHJtZi0+c2FbMl07CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzNdID0gcm1mLT5zYVszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbNF0gPSBybWYtPnNhWzRdOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVs1XSA9IHJtZi0+c2FbNV07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9hY2Nlc3NfcHJpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19TVUJfVkVDVE9SICp0c3YpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICB0c3YtPnN2aSA9IEFVVEhPUklaRURfQUNDRVNTX1BSSU9SSVRZOworICAgICAgICB0c3YtPnN2bCA9IFNfQVVUSE9SSVpFRF9BQ0NFU1NfUFJJT1JJVFk7CisKKyAgICAgICAgdHN2LT5zdnZbMF0gPSBNU0IodHAtPmF1dGhvcml6ZWRfYWNjZXNzX3ByaW9yaXR5KTsKKyAgICAgICAgdHN2LT5zdnZbMV0gPSBMU0IodHAtPmF1dGhvcml6ZWRfYWNjZXNzX3ByaW9yaXR5KTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9hZGRyX21vZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfU1VCX1ZFQ1RPUiAqdHN2KQoreworICAgICAgICB0c3YtPnN2aSA9IEFERFJFU1NfTU9ESUZFUjsKKyAgICAgICAgdHN2LT5zdmwgPSBTX0FERFJFU1NfTU9ESUZFUjsKKworICAgICAgICB0c3YtPnN2dlswXSA9IDA7CisgICAgICAgIHRzdi0+c3Z2WzFdID0gMDsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX21ha2VfYXV0aF9mdW5jdF9jbGFzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgdHN2LT5zdmkgPSBBVVRIT1JJWkVEX0ZVTkNUSU9OX0NMQVNTOworICAgICAgICB0c3YtPnN2bCA9IFNfQVVUSE9SSVpFRF9GVU5DVElPTl9DTEFTUzsKKworICAgICAgICB0c3YtPnN2dlswXSA9IE1TQih0cC0+YXV0aG9yaXplZF9mdW5jdGlvbl9jbGFzc2VzKTsKKyAgICAgICAgdHN2LT5zdnZbMV0gPSBMU0IodHAtPmF1dGhvcml6ZWRfZnVuY3Rpb25fY2xhc3Nlcyk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlX2NvcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdiwgX191MTYgY29ycmVsYXRvcikKK3sKKyAgICAgICAgdHN2LT5zdmkgPSBDT1JSRUxBVE9SOworICAgICAgICB0c3YtPnN2bCA9IFNfQ09SUkVMQVRPUjsKKworICAgICAgICB0c3YtPnN2dlswXSA9IE1TQihjb3JyZWxhdG9yKTsKKyAgICAgICAgdHN2LT5zdnZbMV0gPSBMU0IoY29ycmVsYXRvcik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlX2Z1bmN0X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX1NVQl9WRUNUT1IgKnRzdikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHNtY3RyX2dldF9mdW5jdGlvbmFsX2FkZHJlc3MoZGV2KTsKKworICAgICAgICB0c3YtPnN2aSA9IEZVTkNUSU9OQUxfQUREUkVTUzsKKyAgICAgICAgdHN2LT5zdmwgPSBTX0ZVTkNUSU9OQUxfQUREUkVTUzsKKworICAgICAgICB0c3YtPnN2dlswXSA9IE1TQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMF0pOworICAgICAgICB0c3YtPnN2dlsxXSA9IExTQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMF0pOworCisgICAgICAgIHRzdi0+c3Z2WzJdID0gTVNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsxXSk7CisgICAgICAgIHRzdi0+c3Z2WzNdID0gTFNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsxXSk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlX2dyb3VwX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX1NVQl9WRUNUT1IgKnRzdikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHNtY3RyX2dldF9ncm91cF9hZGRyZXNzKGRldik7CisKKyAgICAgICAgdHN2LT5zdmkgPSBHUk9VUF9BRERSRVNTOworICAgICAgICB0c3YtPnN2bCA9IFNfR1JPVVBfQUREUkVTUzsKKworICAgICAgICB0c3YtPnN2dlswXSA9IE1TQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMF0pOworICAgICAgICB0c3YtPnN2dlsxXSA9IExTQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMF0pOworCisgICAgICAgIHRzdi0+c3Z2WzJdID0gTVNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsxXSk7CisgICAgICAgIHRzdi0+c3Z2WzNdID0gTFNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsxXSk7CisKKyAgICAgICAgLyogU2V0IEdyb3VwIEFkZHJlc3MgU3ViLXZlY3RvciB0byBhbGwgemVyb3MgaWYgb25seSB0aGUKKyAgICAgICAgICogR3JvdXAgQWRkcmVzcy9GdW5jdGlvbmFsIEFkZHJlc3MgSW5kaWNhdG9yIGlzIHNldC4KKyAgICAgICAgICovCisgICAgICAgIGlmKHRzdi0+c3Z2WzBdID09IDB4ODAgJiYgdHN2LT5zdnZbMV0gPT0gMHgwMAorICAgICAgICAJJiYgdHN2LT5zdnZbMl0gPT0gMHgwMCAmJiB0c3YtPnN2dlszXSA9PSAweDAwKQorICAgICAgICAgICAgICAgIHRzdi0+c3Z2WzBdID0gMHgwMDsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX21ha2VfcGh5X2Ryb3BfbnVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3YpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBzbWN0cl9nZXRfcGh5c2ljYWxfZHJvcF9udW1iZXIoZGV2KTsKKworICAgICAgICB0c3YtPnN2aSA9IFBIWVNJQ0FMX0RST1A7CisgICAgICAgIHRzdi0+c3ZsID0gU19QSFlTSUNBTF9EUk9QOworCisgICAgICAgIHRzdi0+c3Z2WzBdID0gTVNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVswXSk7CisgICAgICAgIHRzdi0+c3Z2WzFdID0gTFNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVswXSk7CisKKyAgICAgICAgdHN2LT5zdnZbMl0gPSBNU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzFdKTsKKyAgICAgICAgdHN2LT5zdnZbM10gPSBMU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzFdKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX21ha2VfcHJvZHVjdF9pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfU1VCX1ZFQ1RPUiAqdHN2KQoreworICAgICAgICBpbnQgaTsKKworICAgICAgICB0c3YtPnN2aSA9IFBST0RVQ1RfSU5TVEFOQ0VfSUQ7CisgICAgICAgIHRzdi0+c3ZsID0gU19QUk9EVUNUX0lOU1RBTkNFX0lEOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IDE4OyBpKyspCisgICAgICAgICAgICAgICAgdHN2LT5zdnZbaV0gPSAweEYwOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9zdGF0aW9uX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19TVUJfVkVDVE9SICp0c3YpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBzbWN0cl9nZXRfc3RhdGlvbl9pZChkZXYpOworCisgICAgICAgIHRzdi0+c3ZpID0gU1RBVElPTl9JREVOVElGRVI7CisgICAgICAgIHRzdi0+c3ZsID0gU19TVEFUSU9OX0lERU5USUZFUjsKKworICAgICAgICB0c3YtPnN2dlswXSA9IE1TQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMF0pOworICAgICAgICB0c3YtPnN2dlsxXSA9IExTQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMF0pOworCisgICAgICAgIHRzdi0+c3Z2WzJdID0gTVNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsxXSk7CisgICAgICAgIHRzdi0+c3Z2WzNdID0gTFNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsxXSk7CisKKyAgICAgICAgdHN2LT5zdnZbNF0gPSBNU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzJdKTsKKyAgICAgICAgdHN2LT5zdnZbNV0gPSBMU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzJdKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX21ha2VfcmluZ19zdGF0aW9uX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqIHRzdikKK3sKKyAgICAgICAgdHN2LT5zdmkgPSBSSU5HX1NUQVRJT05fU1RBVFVTOworICAgICAgICB0c3YtPnN2bCA9IFNfUklOR19TVEFUSU9OX1NUQVRVUzsKKworICAgICAgICB0c3YtPnN2dlswXSA9IDA7CisgICAgICAgIHRzdi0+c3Z2WzFdID0gMDsKKyAgICAgICAgdHN2LT5zdnZbMl0gPSAwOworICAgICAgICB0c3YtPnN2dlszXSA9IDA7CisgICAgICAgIHRzdi0+c3Z2WzRdID0gMDsKKyAgICAgICAgdHN2LT5zdnZbNV0gPSAwOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9yaW5nX3N0YXRpb25fdmVyc2lvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgdHN2LT5zdmkgPSBSSU5HX1NUQVRJT05fVkVSU0lPTl9OVU1CRVI7CisgICAgICAgIHRzdi0+c3ZsID0gU19SSU5HX1NUQVRJT05fVkVSU0lPTl9OVU1CRVI7CisKKyAgICAgICAgdHN2LT5zdnZbMF0gPSAweGUyOyAgICAgICAgICAgIC8qIEVCQ0RJQyAtIFMgKi8KKyAgICAgICAgdHN2LT5zdnZbMV0gPSAweGQ0OyAgICAgICAgICAgIC8qIEVCQ0RJQyAtIE0gKi8KKyAgICAgICAgdHN2LT5zdnZbMl0gPSAweGMzOyAgICAgICAgICAgIC8qIEVCQ0RJQyAtIEMgKi8KKyAgICAgICAgdHN2LT5zdnZbM10gPSAweDQwOyAgICAgICAgICAgIC8qIEVCQ0RJQyAtICAgKi8KKyAgICAgICAgdHN2LT5zdnZbNF0gPSAweGU1OyAgICAgICAgICAgIC8qIEVCQ0RJQyAtIFYgKi8KKyAgICAgICAgdHN2LT5zdnZbNV0gPSAweEYwICsgKHRwLT5taWNyb2NvZGVfdmVyc2lvbiA+PiA0KTsKKyAgICAgICAgdHN2LT5zdnZbNl0gPSAweEYwICsgKHRwLT5taWNyb2NvZGVfdmVyc2lvbiAmIDB4MGYpOworICAgICAgICB0c3YtPnN2dls3XSA9IDB4NDA7ICAgICAgICAgICAgLyogRUJDRElDIC0gICAqLworICAgICAgICB0c3YtPnN2dls4XSA9IDB4ZTc7ICAgICAgICAgICAgLyogRUJDRElDIC0gWCAqLworCisgICAgICAgIGlmKHRwLT5leHRyYV9pbmZvICYgQ0hJUF9SRVZfTUFTSykKKyAgICAgICAgICAgICAgICB0c3YtPnN2dls5XSA9IDB4YzU7ICAgIC8qIEVCQ0RJQyAtIEUgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRzdi0+c3Z2WzldID0gMHhjNDsgICAgLyogRUJDRElDIC0gRCAqLworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV90eF9zdGF0dXNfY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2LCBfX3UxNiB0eF9mc3RhdHVzKQoreworICAgICAgICB0c3YtPnN2aSA9IFRSQU5TTUlUX1NUQVRVU19DT0RFOworICAgICAgICB0c3YtPnN2bCA9IFNfVFJBTlNNSVRfU1RBVFVTX0NPREU7CisKKyAgICAgICAgdHN2LT5zdnZbMF0gPSAoKHR4X2ZzdGF0dXMgJiAweDAxMDAgPj4gNikgfHwgSUJNX1BBU1NfU09VUkNFX0FERFIpOworCisgICAgICAgIC8qIFN0cmlwcGVkIGZyYW1lIHN0YXR1cyBvZiBUcmFuc21pdHRlZCBGcmFtZSAqLworICAgICAgICB0c3YtPnN2dlsxXSA9IHR4X2ZzdGF0dXMgJiAweGZmOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV91cHN0cmVhbV9uZWlnaGJvcl9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3YpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBzbWN0cl9nZXRfdXBzdHJlYW1fbmVpZ2hib3JfYWRkcihkZXYpOworCisgICAgICAgIHRzdi0+c3ZpID0gVVBTVFJFQU1fTkVJR0hCT1JfQUREUkVTUzsKKyAgICAgICAgdHN2LT5zdmwgPSBTX1VQU1RSRUFNX05FSUdIQk9SX0FERFJFU1M7CisKKyAgICAgICAgdHN2LT5zdnZbMF0gPSBNU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzBdKTsKKyAgICAgICAgdHN2LT5zdnZbMV0gPSBMU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzBdKTsKKworICAgICAgICB0c3YtPnN2dlsyXSA9IE1TQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMV0pOworICAgICAgICB0c3YtPnN2dlszXSA9IExTQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMV0pOworCisgICAgICAgIHRzdi0+c3Z2WzRdID0gTVNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsyXSk7CisgICAgICAgIHRzdi0+c3Z2WzVdID0gTFNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsyXSk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlX3dyYXBfZGF0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfU1VCX1ZFQ1RPUiAqdHN2KQoreworICAgICAgICB0c3YtPnN2aSA9IFdSQVBfREFUQTsKKyAgICAgICAgdHN2LT5zdmwgPSBTX1dSQVBfREFUQTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCisvKgorICogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gVGhpcyBpcyBjYWxsZWQgc29tZXRpbWUgYWZ0ZXIKKyAqIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgKiByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICogdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworc3RhdGljIGludCBzbWN0cl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX29wZW5cbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgZXJyID0gc21jdHJfaW5pdF9hZGFwdGVyKGRldik7CisgICAgICAgIGlmKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworLyogSW50ZXJydXB0IGRyaXZlbiBvcGVuIG9mIFRva2VuIGNhcmQuICovCitzdGF0aWMgaW50IHNtY3RyX29wZW5fdHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9vcGVuX3RyXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIC8qIE5vdyB3ZSBjYW4gYWN0dWFsbHkgb3BlbiB0aGUgYWRhcHRlci4gKi8KKyAgICAgICAgaWYodHAtPnN0YXR1cyA9PSBPUEVOKQorICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIGlmKHRwLT5zdGF0dXMgIT0gSU5JVElBTElaRUQpCisgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisKKwkvKiBGSVhNRTogaXQgd291bGQgd29yayBhIGxvdCBiZXR0ZXIgaWYgd2UgbWFza2VkIHRoZSBpcnEgc291cmNlcworCSAgIG9uIHRoZSBjYXJkIGhlcmUsIHRoZW4gd2UgY291bGQgc2tpcCB0aGUgbG9ja2luZyBhbmQgcG9sbCBuaWNlbHkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwkKKyAgICAgICAgc21jdHJfc2V0X3BhZ2UoZGV2LCAoX191OCAqKXRwLT5yYW1fYWNjZXNzKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfcmVzdW1lX3J4X2ZjYl9jbWQoZGV2LCAoc2hvcnQpTUFDX1FVRVVFKSkpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9iZGJfY21kKGRldiwgKHNob3J0KU1BQ19RVUVVRSkpKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pc3N1ZV9yZXN1bWVfcnhfZmNiX2NtZChkZXYsIChzaG9ydClOT05fTUFDX1FVRVVFKSkpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9iZGJfY21kKGRldiwgKHNob3J0KU5PTl9NQUNfUVVFVUUpKSkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICB0cC0+c3RhdHVzID0gQ0xPU0VEOworCisgICAgICAgIC8qIEluc2VydCBpbnRvIHRoZSBSaW5nIG9yIEVudGVyIExvb3BiYWNrIE1vZGUuICovCisgICAgICAgIGlmKCh0cC0+bW9kZV9iaXRzICYgTE9PUElOR19NT0RFX01BU0spID09IExPT1BCQUNLX01PREVfMSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHRwLT5zdGF0dXMgPSBDTE9TRUQ7CisKKyAgICAgICAgICAgICAgICBpZighKGVyciA9IHNtY3RyX2lzc3VlX3RyY19sb29wYmFja19jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShlcnIgPSBzbWN0cl93YWl0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXR1cyA9IE9QRU47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc21jdHJfc3RhdHVzX2NoZyhkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCh0cC0+bW9kZV9iaXRzICYgTE9PUElOR19NT0RFX01BU0spID09IExPT1BCQUNLX01PREVfMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdHVzID0gQ0xPU0VEOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShlcnIgPSBzbWN0cl9pc3N1ZV90cmlfbG9vcGJhY2tfY21kKGRldikpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0dXMgPSBPUEVOOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9zdGF0dXNfY2hnKGRldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZigodHAtPm1vZGVfYml0cyAmIExPT1BJTkdfTU9ERV9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBMT09QQkFDS19NT0RFXzMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0dXMgPSBDTE9TRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoZXJyID0gc21jdHJfbG9iZV9tZWRpYV90ZXN0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoZXJyID0gc21jdHJfd2FpdF9jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdHVzID0gT1BFTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9zdGF0dXNfY2hnKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoZXJyID0gc21jdHJfbG9iZV9tZWRpYV90ZXN0KGRldikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNtY3RyX2lzc3VlX2luc2VydF9jbWQoZGV2KTsKKwkJCQllbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlcnIgPT0gTE9CRV9NRURJQV9URVNUX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBMb2JlIE1lZGlhIFRlc3QgRmFpbHVyZSAtIENoZWNrIGNhYmxlP1xuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCitvdXQ6CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCisvKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0ZXIgb2YgdGhpcyB0eXBlLCAKKyAqIGFuZCByZXR1cm4gZGV2aWNlIHN0cnVjdHVyZSBpZiBvbmUgZXhpc3RzLgorICovCitzdHJ1Y3QgbmV0X2RldmljZSBfX2luaXQgKnNtY3RyX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY190cmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBwb3J0c1tdID0geworCQkweDIwMCwgMHgyMjAsIDB4MjQwLCAweDI2MCwgMHgyODAsIDB4MkEwLCAweDJDMCwgMHgyRTAsIDB4MzAwLAorCQkweDMyMCwgMHgzNDAsIDB4MzYwLCAweDM4MCwgMAorCX07CisJY29uc3QgdW5zaWduZWQgKnBvcnQ7CisgICAgICAgIGludCBlcnIgPSAwOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgInRyJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwl9CisKKyAgICAgICAgaWYgKGRldi0+YmFzZV9hZGRyID4gMHgxZmYpICAgIC8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJZXJyID0gc21jdHJfcHJvYmUxKGRldiwgZGV2LT5iYXNlX2FkZHIpOworICAgICAgICBlbHNlIGlmKGRldi0+YmFzZV9hZGRyICE9IDApICAvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisgICAgICAgICAgICAgICAgZXJyID0tRU5YSU87CisJZWxzZSB7CisJCWZvciAocG9ydCA9IHBvcnRzOyAqcG9ydDsgcG9ydCsrKSB7CisJCQllcnIgPSBzbWN0cl9wcm9iZTEoZGV2LCAqcG9ydCk7CisJCQlpZiAoIWVycikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisjaWZkZWYgQ09ORklHX01DQV9MRUdBQ1kKKwl7IHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkgIGlmICh0cC0+c2xvdF9udW0pCisJCW1jYV9tYXJrX2FzX3VudXNlZCh0cC0+c2xvdF9udW0pOworCX0KKyNlbmRpZgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTTUNUUl9JT19FWFRFTlQpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBzbWN0cl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgZXJyOworICAgICAgICBfX3UzMiAqcmFtOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnICYmIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisgICAgICAgICAgICAgICAgcHJpbnRrKHZlcnNpb24pOworCisgICAgICAgIHNwaW5fbG9ja19pbml0KCZ0cC0+bG9jayk7CisgICAgICAgIGRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJLyogQWN0dWFsbHkgZGV0ZWN0IGFuIGFkYXB0ZXIgbm93LiAqLworICAgICAgICBlcnIgPSBzbWN0cl9jaGtfaXNhKGRldik7CisgICAgICAgIGlmKGVyciA8IDApCisgICAgICAgIHsKKwkJaWYgKChlcnIgPSBzbWN0cl9jaGtfbWNhKGRldikpIDwgMCkgeworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0OworCQl9CisgICAgICAgIH0KKworICAgICAgICB0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGRldi0+bWVtX3N0YXJ0ID0gdHAtPnJhbV9iYXNlOworICAgICAgICBkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIDB4MTAwMDA7CisgICAgICAgIHJhbSA9IChfX3UzMiAqKXBoeXNfdG9fdmlydChkZXYtPm1lbV9zdGFydCk7CisgICAgICAgIHRwLT5yYW1fYWNjZXNzID0gKihfX3UzMiAqKSZyYW07CisJdHAtPnN0YXR1cyA9IE5PVF9JTklUSUFMSVpFRDsKKworICAgICAgICBlcnIgPSBzbWN0cl9sb2FkX2Zpcm13YXJlKGRldik7CisgICAgICAgIGlmKGVyciAhPSBVQ09ERV9QUkVTRU5UICYmIGVyciAhPSBTVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogRmlybXdhcmUgbG9hZCBmYWlsZWQgKCVkKVxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dDsKKyAgICAgICAgfQorCisJLyogQWxsb3cgdXNlciB0byBzcGVjaWZ5IHJpbmcgc3BlZWQgb24gbW9kdWxlIGluc2VydC4gKi8KKwlpZihyaW5nc3BlZWQgPT0gNCkKKwkJdHAtPm1lZGlhX3R5cGUgPSBNRURJQV9VVFBfNDsKKwllbHNlCisJCXRwLT5tZWRpYV90eXBlID0gTUVESUFfVVRQXzE2OworCisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiAlcyAlcyBhdCBJbyAlIzR4LCBJcnEgJWQsIFJvbSAlIzR4LCBSYW0gJSM0eC5cbiIsCisgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBzbWN0cl9uYW1lLCBzbWN0cl9tb2RlbCwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWRldi0+YmFzZV9hZGRyLAorICAgICAgICAgICAgICAgIGRldi0+aXJxLCB0cC0+cm9tX2Jhc2UsIHRwLT5yYW1fYmFzZSk7CisKKyAgICAgICAgZGV2LT5vcGVuICAgICAgICAgICAgICAgPSBzbWN0cl9vcGVuOworICAgICAgICBkZXYtPnN0b3AgICAgICAgICAgICAgICA9IHNtY3RyX2Nsb3NlOworICAgICAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCAgICA9IHNtY3RyX3NlbmRfcGFja2V0OworICAgICAgICBkZXYtPnR4X3RpbWVvdXQJCT0gc21jdHJfdGltZW91dDsKKyAgICAgICAgZGV2LT53YXRjaGRvZ190aW1lbwk9IEhaOworICAgICAgICBkZXYtPmdldF9zdGF0cyAgICAgICAgICA9IHNtY3RyX2dldF9zdGF0czsKKyAgICAgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc21jdHJfc2V0X211bHRpY2FzdF9saXN0OworICAgICAgICByZXR1cm4gKDApOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzbWN0cl9wcm9jZXNzX3J4X3BhY2tldChNQUNfSEVBREVSICpybWYsIF9fdTE2IHNpemUsCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHJ4X3N0YXR1cykKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworICAgICAgICBfX3UxNiByY29kZSwgY29ycmVsYXRvcjsKKyAgICAgICAgaW50IGVyciA9IDA7CisgICAgICAgIF9fdTggeGZyYW1lID0gMTsKKyAgICAgICAgX191MTYgdHhfZnN0YXR1czsKKworICAgICAgICBybWYtPnZsID0gU1dBUF9CWVRFUyhybWYtPnZsKTsKKyAgICAgICAgaWYocnhfc3RhdHVzICYgRkNCX1JYX1NUQVRVU19EQV9NQVRDSEVEKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoKHJtZi0+dmMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVjZWl2ZWQgTUFDIEZyYW1lcyBQcm9jZXNzZWQgYnkgUlMuICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElOSVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChyY29kZSA9IHNtY3RyX3Jjdl9pbml0KGRldiwgcm1mLCAmY29ycmVsYXRvcikpID09IEhBUkRXQVJFX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3NlbmRfcnNwKGRldiwgcm1mLCByY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdG9yKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0hHX1BBUk06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChyY29kZSA9IHNtY3RyX3Jjdl9jaGdfcGFyYW0oZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcnJlbGF0b3IpKSA9PUhBUkRXQVJFX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3NlbmRfcnNwKGRldiwgcm1mLCByY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdG9yKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlFfQUREUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHJjb2RlID0gc21jdHJfcmN2X3JxX2FkZHJfc3RhdGVfYXR0Y2goZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtZiwgJmNvcnJlbGF0b3IpKSAhPSBQT1NJVElWRV9BQ0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyY29kZSA9PSBIQVJEV0FSRV9GQUlMRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNtY3RyX3NlbmRfcnNwKGRldiwgcm1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY29kZSwgY29ycmVsYXRvcikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3NlbmRfcnB0X2FkZHIoZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRvcikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJRX0FUVENIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigocmNvZGUgPSBzbWN0cl9yY3ZfcnFfYWRkcl9zdGF0ZV9hdHRjaChkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1mLCAmY29ycmVsYXRvcikpICE9IFBPU0lUSVZFX0FDSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJjb2RlID09IEhBUkRXQVJFX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc21jdHJfc2VuZF9yc3AoZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfc2VuZF9ycHRfYXR0Y2goZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRvcikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJRX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigocmNvZGUgPSBzbWN0cl9yY3ZfcnFfYWRkcl9zdGF0ZV9hdHRjaChkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1mLCAmY29ycmVsYXRvcikpICE9IFBPU0lUSVZFX0FDSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJjb2RlID09IEhBUkRXQVJFX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc21jdHJfc2VuZF9yc3AoZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfc2VuZF9ycHRfc3RhdGUoZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRvcikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRYX0ZPUldBUkQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChyY29kZSA9IHNtY3RyX3Jjdl90eF9mb3J3YXJkKGRldiwgcm1mKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBQT1NJVElWRV9BQ0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyY29kZSA9PSBIQVJEV0FSRV9GQUlMRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNtY3RyX3NlbmRfcnNwKGRldiwgcm1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRvcikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3NlbmRfdHhfZm9yd2FyZChkZXYsIHJtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHhfZnN0YXR1cykpID09IEhBUkRXQVJFX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVyciA9PSBBX0ZSQU1FX1dBU19GT1JXQVJERUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfc2VuZF9ycHRfdHhfZm9yd2FyZChkZXYsCisJCQkJCQlybWYsIHR4X2ZzdGF0dXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gSEFSRFdBUkVfRkFJTEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlY2VpdmVkIE1BQyBGcmFtZXMgUHJvY2Vzc2VkIGJ5IENSUy9SRU0vUlBTLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSU1A6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJRX0lOSVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9ORVdfTU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfU1VBX0NIRzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX0FDVElWRV9FUlI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9OTl9JTkNNUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfQVRUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX0FERFI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBSY3ZkIEF0dC4gTUFDIEZyYW1lIChpZiBSWEFUTUFDIHNldCkgb3IgVU5LTk9XTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGZyYW1lID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISh0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX0FUVF9NQUNfRlJBTUVTKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gc21jdHJfcmN2X3Vua25vd24oZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ycmVsYXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3NlbmRfcnNwKGRldiwgcm1mLHJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRvcikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogMS4gREEgZG9lc24ndCBtYXRjaCAoUHJvbWlzY3VvdXMgTW9kZSkuCisgICAgICAgICAgICAgICAgICogMi4gUGFyc2UgZm9yIEV4dGVuZGVkIE1BQyBGcmFtZSBUeXBlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHN3aXRjaChybWYtPnZjKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlNQOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJTklUOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUV9JTklUOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUV9BRERSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUV9BVFRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlFfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENIR19QQVJNOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfQUREUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfQVRUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX05FV19NT046CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9TVUFfQ0hHOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfTk5fSU5DTVA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9BQ1RJVkVfRVJSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGZyYW1lID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogTk9URTogVU5LTk9XTiBNQUMgZnJhbWVzIHdpbGwgTk9UIGJlIHBhc3NlZCB1cCB1bmxlc3MKKyAgICAgICAgICogQUNDRVBUX0FUVF9NQUNfRlJBTUVTIGlzIHNldC4KKyAgICAgICAgICovCisgICAgICAgIGlmKCgodHAtPnJlY2VpdmVfbWFzayAmIEFDQ0VQVF9BVFRfTUFDX0ZSQU1FUykKKyAgICAgICAgICAgICAgICAmJiAoeGZyYW1lID09IChfX3U4KTApKQorICAgICAgICAgICAgICAgIHx8ICgodHAtPnJlY2VpdmVfbWFzayAmIEFDQ0VQVF9FWFRfTUFDX0ZSQU1FUykKKyAgICAgICAgICAgICAgICAmJiAoeGZyYW1lID09IChfX3U4KTEpKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJtZi0+dmwgPSBTV0FQX0JZVEVTKHJtZi0+dmwpOworCisgICAgICAgICAgICAgICAgaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKSkpCisJCQlyZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBza2ItPmxlbiA9IHNpemU7CisKKyAgICAgICAgICAgICAgICAvKiBTbGlkZSBkYXRhIGludG8gYSBzbGVlayBza2IuICovCisgICAgICAgICAgICAgICAgc2tiX3B1dChza2IsIHNrYi0+bGVuKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoc2tiLT5kYXRhLCBybWYsIHNrYi0+bGVuKTsKKworICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBDb3VudGVycyAqLworICAgICAgICAgICAgICAgIHRwLT5NYWNTdGF0LnJ4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICB0cC0+TWFjU3RhdC5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworICAgICAgICAgICAgICAgIC8qIEtpY2sgdGhlIHBhY2tldCBvbiB1cC4gKi8KKyAgICAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKKyAgICAgICAgICAgICAgICBza2ItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IsIGRldik7CisgICAgICAgICAgICAgICAgbmV0aWZfcngoc2tiKTsKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKyAgICAgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCisvKiBBZGFwdGVyIFJBTSB0ZXN0LiBJbmNyZW1lbnRhbCB3b3JkIE9ERCBib3VuZGFyeSBkYXRhIHRlc3QuICovCitzdGF0aWMgaW50IHNtY3RyX3JhbV9tZW1vcnlfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIF9fdTE2IHBhZ2UsIHBhZ2VzX29mX3JhbSwgc3RhcnRfcGF0dGVybiA9IDAsIHdvcmRfcGF0dGVybiA9IDAsCisgICAgICAgICAgICAgICAgd29yZF9yZWFkID0gMCwgZXJyX3dvcmQgPSAwLCBlcnJfcGF0dGVybiA9IDA7CisgICAgICAgIHVuc2lnbmVkIGludCBlcnJfb2Zmc2V0OworICAgICAgICBfX3UzMiBqLCBwd29yZDsKKyAgICAgICAgX191OCBlcnIgPSAwOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9yYW1fbWVtb3J5X3Rlc3RcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgc3RhcnRfcGF0dGVybiAgID0gMHgwMDAxOworICAgICAgICBwYWdlc19vZl9yYW0gICAgPSB0cC0+cmFtX3NpemUgLyB0cC0+cmFtX3VzYWJsZTsKKyAgICAgICAgcHdvcmQgICAgICAgICAgID0gdHAtPnJhbV9hY2Nlc3M7CisKKyAgICAgICAgLyogSW5jcmVtZW50YWwgd29yZCBPREQgYm91bmRhcnkgdGVzdC4gKi8KKyAgICAgICAgZm9yKHBhZ2UgPSAwOyAocGFnZSA8IHBhZ2VzX29mX3JhbSkgJiYgKH5lcnIpOworICAgICAgICAgICAgICAgIHBhZ2UrKywgc3RhcnRfcGF0dGVybiArPSAweDgwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopKHRwLT5yYW1fYWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICArIChwYWdlICogdHAtPnJhbV91c2FibGUgKiAxMDI0KSArIDEpKTsKKyAgICAgICAgICAgICAgICB3b3JkX3BhdHRlcm4gPSBzdGFydF9wYXR0ZXJuOworCisgICAgICAgICAgICAgICAgZm9yKGogPSAxOyBqIDwgKF9fdTMyKSh0cC0+cmFtX3VzYWJsZSAqIDEwMjQpIC0gMTsgaiArPSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgKihfX3UxNiAqKShwd29yZCArIGopID0gd29yZF9wYXR0ZXJuKys7CisKKyAgICAgICAgICAgICAgICB3b3JkX3BhdHRlcm4gPSBzdGFydF9wYXR0ZXJuOworCisgICAgICAgICAgICAgICAgZm9yKGogPSAxOyBqIDwgKF9fdTMyKSh0cC0+cmFtX3VzYWJsZSAqIDEwMjQpIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKH5lcnIpOyBqICs9IDIsIHdvcmRfcGF0dGVybisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRfcmVhZCA9ICooX191MTYgKikocHdvcmQgKyBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdvcmRfcmVhZCAhPSB3b3JkX3BhdHRlcm4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciAgICAgICAgICAgICA9IChfX3U4KTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycl9vZmZzZXQgICAgICA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycl93b3JkICAgICAgICA9IHdvcmRfcmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyX3BhdHRlcm4gICAgID0gd29yZF9wYXR0ZXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFJBTV9URVNUX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogWmVybyBvdXQgbWVtb3J5LiAqLworICAgICAgICBmb3IocGFnZSA9IDA7IHBhZ2UgPCBwYWdlc19vZl9yYW0gJiYgKH5lcnIpOyBwYWdlKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopKHRwLT5yYW1fYWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICArIChwYWdlICogdHAtPnJhbV91c2FibGUgKiAxMDI0KSkpOworICAgICAgICAgICAgICAgIHdvcmRfcGF0dGVybiA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCAoX191MzIpdHAtPnJhbV91c2FibGUgKiAxMDI0OyBqICs9MikKKyAgICAgICAgICAgICAgICAgICAgICAgICooX191MTYgKikocHdvcmQgKyBqKSA9IHdvcmRfcGF0dGVybjsKKworICAgICAgICAgICAgICAgIGZvcihqID0wOyBqIDwgKF9fdTMyKXRwLT5yYW1fdXNhYmxlICogMTAyNAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKH5lcnIpOyBqICs9IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd29yZF9yZWFkID0gKihfX3UxNiAqKShwd29yZCArIGopOworICAgICAgICAgICAgICAgICAgICAgICAgaWYod29yZF9yZWFkICE9IHdvcmRfcGF0dGVybikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyICAgICAgICAgICAgID0gKF9fdTgpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyX29mZnNldCAgICAgID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyX3dvcmQgICAgICAgID0gd29yZF9yZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfcGF0dGVybiAgICAgPSB3b3JkX3BhdHRlcm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoUkFNX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopdHAtPnJhbV9hY2Nlc3MpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfcmN2X2NoZ19wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2ICpjb3JyZWxhdG9yKQoreworICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2OworICAgICAgICBzaWduZWQgc2hvcnQgdmxlbjsKKyAgICAgICAgX191MTYgcmNvZGUgPSBQT1NJVElWRV9BQ0s7CisgICAgICAgIHVuc2lnbmVkIGludCBzdmVjdG9ycyA9IEZfTk9fU1VCX1ZFQ1RPUlNfRk9VTkQ7CisKKyAgICAgICAgLyogVGhpcyBGcmFtZSBjYW4gb25seSBjb21lIGZyb20gYSBDUlMgKi8KKyAgICAgICAgaWYoKHJtZi0+ZGNfc2MgJiBTQ19NQVNLKSAhPSBTQ19DUlMpCisgICAgICAgICAgICAgICAgcmV0dXJuKEVfSU5BUFBST1BSSUFURV9TT1VSQ0VfQ0xBU1MpOworCisgICAgICAgIC8qIFJlbW92ZSBNVklEIExlbmd0aCBmcm9tIHRvdGFsIGxlbmd0aC4gKi8KKyAgICAgICAgdmxlbiA9IChzaWduZWQgc2hvcnQpcm1mLT52bCAtIDQ7CisKKyAgICAgICAgLyogUG9pbnQgdG8gRmlyc3QgU1ZJRCAqLworICAgICAgICByc3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXJtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisKKyAgICAgICAgLyogU2VhcmNoIGZvciBBcHByb3ByaWF0ZSBTVklEJ3MuICovCisgICAgICAgIHdoaWxlKCh2bGVuID4gMCkgJiYgKHJjb2RlID09IFBPU0lUSVZFX0FDSykpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocnN2LT5zdmkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT1JSRUxBVE9SOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0NPUlJFTEFUT1I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gc21jdHJfc2V0X2NvcnIoZGV2LCByc3YsIGNvcnJlbGF0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMT0NBTF9SSU5HX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZlY3RvcnMgfD0gRl9MT0NBTF9SSU5HX05VTUJFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfbG9jYWxfcmluZ19udW0oZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBU1NJR05fUEhZU0lDQUxfRFJPUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZlY3RvcnMgfD0gRl9BU1NJR05fUEhZU0lDQUxfRFJPUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfcGh5X2Ryb3AoZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUlJPUl9USU1FUl9WQUxVRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZlY3RvcnMgfD0gRl9FUlJPUl9USU1FUl9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfZXJyb3JfdGltZXJfdmFsdWUoZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIT1JJWkVEX0ZVTkNUSU9OX0NMQVNTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0FVVEhPUklaRURfRlVOQ1RJT05fQ0xBU1M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gc21jdHJfc2V0X2F1dGhfZnVuY3RfY2xhc3MoZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIT1JJWkVEX0FDQ0VTU19QUklPUklUWToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZlY3RvcnMgfD0gRl9BVVRIT1JJWkVEX0FDQ0VTU19QUklPUklUWTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfYXV0aF9hY2Nlc3NfcHJpKGRldiwgcnN2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gRV9TVUJfVkVDVE9SX1VOS05PV047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIExldCBTZW5kZXIgS25vdyBpZiBTVU0gb2YgU1YgbGVuZ3RoJ3MgaXMKKyAgICAgICAgICAgICAgICAgKiBsYXJnZXIgdGhlbiBsZW5ndGggaW4gTVZJRCBsZW5ndGggZmllbGQKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZigodmxlbiAtPSByc3YtPnN2bCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1ZFQ1RPUl9MRU5HVEhfRVJST1I7CisKKyAgICAgICAgICAgICAgICByc3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXJzdiArIHJzdi0+c3ZsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHJjb2RlID09IFBPU0lUSVZFX0FDSykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIExldCBTZW5kZXIgS25vdyBpZiBNVklEIGxlbmd0aCBmaWVsZAorICAgICAgICAgICAgICAgICAqIGlzIGxhcmdlciB0aGVuIFNVTSBvZiBTViBsZW5ndGgncworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKHZsZW4gIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gRV9WRUNUT1JfTEVOR1RIX0VSUk9SOworICAgICAgICAgICAgICAgIGVsc2UKKwkJeworICAgICAgICAgICAgICAgIAkvKiBMZXQgU2VuZGVyIEtub3cgaWYgRXhwZWN0ZWQgU1ZJRCBNaXNzaW5nICovCisgICAgICAgICAgICAgICAgCWlmKChzdmVjdG9ycyAmIFJfQ0hHX1BBUk0pIF4gUl9DSEdfUEFSTSkKKyAgICAgICAgICAgICAgICAgICAgICAgIAlyY29kZSA9IEVfTUlTU0lOR19TVUJfVkVDVE9SOworCQl9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHJjb2RlKTsKK30KKworc3RhdGljIGludCBzbWN0cl9yY3ZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2ICpjb3JyZWxhdG9yKQoreworICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2OworICAgICAgICBzaWduZWQgc2hvcnQgdmxlbjsKKyAgICAgICAgX191MTYgcmNvZGUgPSBQT1NJVElWRV9BQ0s7CisgICAgICAgIHVuc2lnbmVkIGludCBzdmVjdG9ycyA9IEZfTk9fU1VCX1ZFQ1RPUlNfRk9VTkQ7CisKKyAgICAgICAgLyogVGhpcyBGcmFtZSBjYW4gb25seSBjb21lIGZyb20gYSBSUFMgKi8KKyAgICAgICAgaWYoKHJtZi0+ZGNfc2MgJiBTQ19NQVNLKSAhPSBTQ19SUFMpCisgICAgICAgICAgICAgICAgcmV0dXJuIChFX0lOQVBQUk9QUklBVEVfU09VUkNFX0NMQVNTKTsKKworICAgICAgICAvKiBSZW1vdmUgTVZJRCBMZW5ndGggZnJvbSB0b3RhbCBsZW5ndGguICovCisgICAgICAgIHZsZW4gPSAoc2lnbmVkIHNob3J0KXJtZi0+dmwgLSA0OworCisgICAgICAgIC8qIFBvaW50IHRvIEZpcnN0IFNWSUQgKi8KKyAgICAgICAgcnN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMilybWYgKyBzaXplb2YoTUFDX0hFQURFUikpOworCisgICAgICAgIC8qIFNlYXJjaCBmb3IgQXBwcm9wcmlhdGUgU1ZJRCdzICovCisgICAgICAgIHdoaWxlKCh2bGVuID4gMCkgJiYgKHJjb2RlID09IFBPU0lUSVZFX0FDSykpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocnN2LT5zdmkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT1JSRUxBVE9SOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0NPUlJFTEFUT1I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gc21jdHJfc2V0X2NvcnIoZGV2LCByc3YsIGNvcnJlbGF0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMT0NBTF9SSU5HX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZlY3RvcnMgfD0gRl9MT0NBTF9SSU5HX05VTUJFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfbG9jYWxfcmluZ19udW0oZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBU1NJR05fUEhZU0lDQUxfRFJPUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZlY3RvcnMgfD0gRl9BU1NJR05fUEhZU0lDQUxfRFJPUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfcGh5X2Ryb3AoZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUlJPUl9USU1FUl9WQUxVRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZlY3RvcnMgfD0gRl9FUlJPUl9USU1FUl9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfZXJyb3JfdGltZXJfdmFsdWUoZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1NVQl9WRUNUT1JfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTGV0IFNlbmRlciBLbm93IGlmIFNVTSBvZiBTViBsZW5ndGgncyBpcworICAgICAgICAgICAgICAgICAqIGxhcmdlciB0aGVuIGxlbmd0aCBpbiBNVklEIGxlbmd0aCBmaWVsZAorCQkgKi8KKyAgICAgICAgICAgICAgICBpZigodmxlbiAtPSByc3YtPnN2bCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1ZFQ1RPUl9MRU5HVEhfRVJST1I7CisKKyAgICAgICAgICAgICAgICByc3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXJzdiArIHJzdi0+c3ZsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHJjb2RlID09IFBPU0lUSVZFX0FDSykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIExldCBTZW5kZXIgS25vdyBpZiBNVklEIGxlbmd0aCBmaWVsZAorICAgICAgICAgICAgICAgICAqIGlzIGxhcmdlciB0aGVuIFNVTSBvZiBTViBsZW5ndGgncworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKHZsZW4gIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gRV9WRUNUT1JfTEVOR1RIX0VSUk9SOworICAgICAgICAgICAgICAgIGVsc2UKKwkJeworICAgICAgICAgICAgICAgIAkvKiBMZXQgU2VuZGVyIEtub3cgaWYgRXhwZWN0ZWQgU1YgTWlzc2luZyAqLworICAgICAgICAgICAgICAgIAlpZigoc3ZlY3RvcnMgJiBSX0lOSVQpIF4gUl9JTklUKQorICAgICAgICAgICAgICAgICAgICAgICAgCXJjb2RlID0gRV9NSVNTSU5HX1NVQl9WRUNUT1I7CisJCX0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAocmNvZGUpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3Jjdl90eF9mb3J3YXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZikKK3sKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdjsKKyAgICAgICAgc2lnbmVkIHNob3J0IHZsZW47CisgICAgICAgIF9fdTE2IHJjb2RlID0gUE9TSVRJVkVfQUNLOworICAgICAgICB1bnNpZ25lZCBpbnQgc3ZlY3RvcnMgPSBGX05PX1NVQl9WRUNUT1JTX0ZPVU5EOworCisgICAgICAgIC8qIFRoaXMgRnJhbWUgY2FuIG9ubHkgY29tZSBmcm9tIGEgQ1JTICovCisgICAgICAgIGlmKChybWYtPmRjX3NjICYgU0NfTUFTSykgIT0gU0NfQ1JTKQorICAgICAgICAgICAgICAgIHJldHVybiAoRV9JTkFQUFJPUFJJQVRFX1NPVVJDRV9DTEFTUyk7CisKKyAgICAgICAgLyogUmVtb3ZlIE1WSUQgTGVuZ3RoIGZyb20gdG90YWwgbGVuZ3RoICovCisgICAgICAgIHZsZW4gPSAoc2lnbmVkIHNob3J0KXJtZi0+dmwgLSA0OworCisgICAgICAgIC8qIFBvaW50IHRvIEZpcnN0IFNWSUQgKi8KKyAgICAgICAgcnN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMilybWYgKyBzaXplb2YoTUFDX0hFQURFUikpOworCisgICAgICAgIC8qIFNlYXJjaCBmb3IgQXBwcm9wcmlhdGUgU1ZJRCdzICovCisgICAgICAgIHdoaWxlKCh2bGVuID4gMCkgJiYgKHJjb2RlID09IFBPU0lUSVZFX0FDSykpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocnN2LT5zdmkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGUkFNRV9GT1JXQVJEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0ZSQU1FX0ZPUldBUkQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gc21jdHJfc2V0X2ZyYW1lX2ZvcndhcmQoZGV2LCByc3YsIAorCQkJCQlybWYtPmRjX3NjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gRV9TVUJfVkVDVE9SX1VOS05PV047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIExldCBTZW5kZXIgS25vdyBpZiBTVU0gb2YgU1YgbGVuZ3RoJ3MgaXMKKyAgICAgICAgICAgICAgICAgKiBsYXJnZXIgdGhlbiBsZW5ndGggaW4gTVZJRCBsZW5ndGggZmllbGQKKwkJICovCisgICAgICAgICAgICAgICAgaWYoKHZsZW4gLT0gcnN2LT5zdmwpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gRV9WRUNUT1JfTEVOR1RIX0VSUk9SOworCisgICAgICAgICAgICAgICAgcnN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMilyc3YgKyByc3YtPnN2bCk7CisgICAgICAgIH0KKworICAgICAgICBpZihyY29kZSA9PSBQT1NJVElWRV9BQ0spCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBMZXQgU2VuZGVyIEtub3cgaWYgTVZJRCBsZW5ndGggZmllbGQKKyAgICAgICAgICAgICAgICAgKiBpcyBsYXJnZXIgdGhlbiBTVU0gb2YgU1YgbGVuZ3RoJ3MKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZih2bGVuICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IEVfVkVDVE9SX0xFTkdUSF9FUlJPUjsKKyAgICAgICAgICAgICAgICBlbHNlCisJCXsKKyAgICAgICAgICAgICAgICAJLyogTGV0IFNlbmRlciBLbm93IGlmIEV4cGVjdGVkIFNWIE1pc3NpbmcgKi8KKyAgICAgICAgICAgICAgICAJaWYoKHN2ZWN0b3JzICYgUl9UWF9GT1JXQVJEKSBeIFJfVFhfRk9SV0FSRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIAlyY29kZSA9IEVfTUlTU0lOR19TVUJfVkVDVE9SOworCQl9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHJjb2RlKTsKK30KKworc3RhdGljIGludCBzbWN0cl9yY3ZfcnFfYWRkcl9zdGF0ZV9hdHRjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfSEVBREVSICpybWYsIF9fdTE2ICpjb3JyZWxhdG9yKQoreworICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2OworICAgICAgICBzaWduZWQgc2hvcnQgdmxlbjsKKyAgICAgICAgX191MTYgcmNvZGUgPSBQT1NJVElWRV9BQ0s7CisgICAgICAgIHVuc2lnbmVkIGludCBzdmVjdG9ycyA9IEZfTk9fU1VCX1ZFQ1RPUlNfRk9VTkQ7CisKKyAgICAgICAgLyogUmVtb3ZlIE1WSUQgTGVuZ3RoIGZyb20gdG90YWwgbGVuZ3RoICovCisgICAgICAgIHZsZW4gPSAoc2lnbmVkIHNob3J0KXJtZi0+dmwgLSA0OworCisgICAgICAgIC8qIFBvaW50IHRvIEZpcnN0IFNWSUQgKi8KKyAgICAgICAgcnN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMilybWYgKyBzaXplb2YoTUFDX0hFQURFUikpOworCisgICAgICAgIC8qIFNlYXJjaCBmb3IgQXBwcm9wcmlhdGUgU1ZJRCdzICovCisgICAgICAgIHdoaWxlKCh2bGVuID4gMCkgJiYgKHJjb2RlID09IFBPU0lUSVZFX0FDSykpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocnN2LT5zdmkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT1JSRUxBVE9SOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0NPUlJFTEFUT1I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gc21jdHJfc2V0X2NvcnIoZGV2LCByc3YsIGNvcnJlbGF0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1NVQl9WRUNUT1JfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTGV0IFNlbmRlciBLbm93IGlmIFNVTSBvZiBTViBsZW5ndGgncyBpcworICAgICAgICAgICAgICAgICAqIGxhcmdlciB0aGVuIGxlbmd0aCBpbiBNVklEIGxlbmd0aCBmaWVsZAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKCh2bGVuIC09IHJzdi0+c3ZsKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IEVfVkVDVE9SX0xFTkdUSF9FUlJPUjsKKworICAgICAgICAgICAgICAgIHJzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpcnN2ICsgcnN2LT5zdmwpOworICAgICAgICB9CisKKyAgICAgICAgaWYocmNvZGUgPT0gUE9TSVRJVkVfQUNLKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTGV0IFNlbmRlciBLbm93IGlmIE1WSUQgbGVuZ3RoIGZpZWxkCisgICAgICAgICAgICAgICAgICogaXMgbGFyZ2VyIHRoZW4gU1VNIG9mIFNWIGxlbmd0aCdzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYodmxlbiAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1ZFQ1RPUl9MRU5HVEhfRVJST1I7CisgICAgICAgICAgICAgICAgZWxzZQorCQl7CisgICAgICAgICAgICAgICAgCS8qIExldCBTZW5kZXIgS25vdyBpZiBFeHBlY3RlZCBTVklEIE1pc3NpbmcgKi8KKyAgICAgICAgICAgICAgICAJaWYoKHN2ZWN0b3JzICYgUl9SUV9BVFRDSF9TVEFURV9BRERSKSAKKwkJCQleIFJfUlFfQVRUQ0hfU1RBVEVfQUREUikKKyAgICAgICAgICAgICAgICAgICAgICAgIAlyY29kZSA9IEVfTUlTU0lOR19TVUJfVkVDVE9SOworCQkJfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChyY29kZSk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfcmN2X3Vua25vd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX0hFQURFUiAqcm1mLAorICAgICAgICBfX3UxNiAqY29ycmVsYXRvcikKK3sKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdjsKKyAgICAgICAgc2lnbmVkIHNob3J0IHZsZW47CisKKyAgICAgICAgKmNvcnJlbGF0b3IgPSAwOworCisgICAgICAgIC8qIFJlbW92ZSBNVklEIExlbmd0aCBmcm9tIHRvdGFsIGxlbmd0aCAqLworICAgICAgICB2bGVuID0gKHNpZ25lZCBzaG9ydClybWYtPnZsIC0gNDsKKworICAgICAgICAvKiBQb2ludCB0byBGaXJzdCBTVklEICovCisgICAgICAgIHJzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpcm1mICsgc2l6ZW9mKE1BQ19IRUFERVIpKTsKKworICAgICAgICAvKiBTZWFyY2ggZm9yIENPUlJFTEFUT1IgZm9yIFJTUCB0byBVTktOT1dOICovCisgICAgICAgIHdoaWxlKCh2bGVuID4gMCkgJiYgKCpjb3JyZWxhdG9yID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoKHJzdi0+c3ZpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09SUkVMQVRPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfc2V0X2NvcnIoZGV2LCByc3YsIGNvcnJlbGF0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmxlbiAtPSByc3YtPnN2bDsKKyAgICAgICAgICAgICAgICByc3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXJzdiArIHJzdi0+c3ZsKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoRV9VTlJFQ09HTklaRURfVkVDVE9SX0lEKTsKK30KKworLyoKKyAqIFJlc2V0IHRoZSA4MjUgTklDIGFuZCBleGl0IHc6CisgKiAxLiBUaGUgTklDIHJlc2V0IGNsZWFyZWQgKG5vbi1yZXNldCBzdGF0ZSksIGhhbHRlZCBhbmQgdW4taW5pdGlhbGl6ZWQuCisgKiAyLiBUSU5UIG1hc2tlZC4KKyAqIDMuIENCVVNZIG1hc2tlZC4KKyAqIDQuIFRJTlQgY2xlYXIuCisgKiA1LiBDQlVTWSBjbGVhci4KKyAqLworc3RhdGljIGludCBzbWN0cl9yZXNldF9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgICAgIC8qIFJlc2V0aW5nIHRoZSBOSUMgd2lsbCBwdXQgaXQgaW4gYSBoYWx0ZWQgYW5kIHVuLWluaXRpYWxpemVkIHN0YXRlLiAqLyAgICAgICAgc21jdHJfc2V0X3RyY19yZXNldChpb2FkZHIpOworICAgICAgICBtZGVsYXkoMjAwKTsgLyogfjIgbXMgKi8KKworICAgICAgICBzbWN0cl9jbGVhcl90cmNfcmVzZXQoaW9hZGRyKTsKKyAgICAgICAgbWRlbGF5KDIwMCk7IC8qIH4yIG1zICovCisKKyAgICAgICAgLyogUmVtb3ZlIGFueSBsYXRjaGVkIGludGVycnVwdHMgdGhhdCBvY2N1cnJlZCBwcmlvciB0byByZXNldGluZyB0aGUKKyAgICAgICAgICogYWRhcHRlciBvciBwb3NzaWJpbHkgY2F1c2VkIGJ5IGxpbmUgZ2xpdGNoZXMgZHVlIHRvIHRoZSByZXNldC4KKyAgICAgICAgICovCisgICAgICAgIG91dGIodHAtPnRyY19tYXNrIHwgQ1NSX0NMUlRJTlQgfCBDU1JfQ0xSQ0JVU1ksIGlvYWRkciArIENTUik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9yZXN0YXJ0X3R4X2NoYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IHF1ZXVlKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBlcnIgPSAwOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9yZXN0YXJ0X3R4X2NoYWluXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIGlmKHRwLT5udW1fdHhfZmNic191c2VkW3F1ZXVlXSAhPSAwCisgICAgICAgICAgICAgICAgJiYgdHAtPnR4X3F1ZXVlX3N0YXR1c1txdWV1ZV0gPT0gTk9UX1RSQU5TTUlUSU5HKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdHAtPnR4X3F1ZXVlX3N0YXR1c1txdWV1ZV0gPSBUUkFOU01JVElORzsKKyAgICAgICAgICAgICAgICBlcnIgPSBzbWN0cl9pc3N1ZV9yZXN1bWVfdHhfZmNiX2NtZChkZXYsIHF1ZXVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9yaW5nX3N0YXR1c19jaGcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9yaW5nX3N0YXR1c19jaGdcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgLyogQ2hlY2sgZm9yIHJpbmdfc3RhdHVzX2ZsYWc6IHdoZW5ldmVyIE1PTklUT1JfU1RBVEVfQklUCisgICAgICAgICAqIEJpdCBpcyBzZXQsIGNoZWNrIHZhbHVlIG9mIG1vbml0b3Jfc3RhdGUsIG9ubHkgdGhlbiB3ZQorICAgICAgICAgKiBlbmFibGUgYW5kIHN0YXJ0IHRyYW5zbWl0L3JlY2VpdmUgdGltZW91dCAoaWYgYW5kIG9ubHkKKyAgICAgICAgICogaWYgaXQgaXMgTVNfQUNUSVZFX01PTklUT1JfU1RBVEUgb3IgTVNfU1RBTkRCWV9NT05JVE9SX1NUQVRFKQorICAgICAgICAgKi8KKyAgICAgICAgaWYodHAtPnJpbmdfc3RhdHVzX2ZsYWdzID09IE1PTklUT1JfU1RBVEVfQ0hBTkdFRCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCh0cC0+bW9uaXRvcl9zdGF0ZSA9PSBNU19BQ1RJVkVfTU9OSVRPUl9TVEFURSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh0cC0+bW9uaXRvcl9zdGF0ZSA9PSBNU19TVEFOREJZX01PTklUT1JfU1RBVEUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tb25pdG9yX3N0YXRlX3JlYWR5ID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIGFkYXB0ZXIgaXMgTk9UIGluIGVpdGhlciBhY3RpdmUgbW9uaXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICogb3Igc3RhbmRieSBtb25pdG9yIHN0YXRlID0+IERpc2FibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRyYW5zbWl0L3JlY2VpdmUgdGltZW91dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vbml0b3Jfc3RhdGVfcmVhZHkgPSAwOworCisJCQkvKiBSaW5nIHNwZWVkIHByb2JsZW0sIHN3aXRjaGluZyB0byBhdXRvIG1vZGUuICovCisJCQlpZih0cC0+bW9uaXRvcl9zdGF0ZSA9PSBNU19NT05JVE9SX0ZTTV9JTkFDVElWRQorCQkJCSYmICF0cC0+Y2xlYW51cCkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW5jb3JyZWN0IHJpbmcgc3BlZWQgc3dpdGNoaW5nLlxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCQlzbWN0cl9zZXRfcmluZ19zcGVlZChkZXYpOworCQkJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCEodHAtPnJpbmdfc3RhdHVzX2ZsYWdzICYgUklOR19TVEFUVVNfQ0hBTkdFRCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKworICAgICAgICBzd2l0Y2godHAtPnJpbmdfc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBSSU5HX1JFQ09WRVJZOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJpbmcgUmVjb3ZlcnlcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+Y3VycmVudF9yaW5nX3N0YXR1cyB8PSBSSU5HX1JFQ09WRVJZOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNJTkdMRV9TVEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNpbmdsZSBTdGF0aW5vblxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jdXJyZW50X3Jpbmdfc3RhdHVzIHw9IFNJTkdMRV9TVEFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIENPVU5URVJfT1ZFUkZMT1c6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogQ291bnRlciBPdmVyZmxvd1xuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jdXJyZW50X3Jpbmdfc3RhdHVzIHw9IENPVU5URVJfT1ZFUkZMT1c7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgUkVNT1ZFX1JFQ0VJVkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlbW92ZSBSZWNlaXZlZFxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jdXJyZW50X3Jpbmdfc3RhdHVzIHw9IFJFTU9WRV9SRUNFSVZFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBBVVRPX1JFTU9WQUxfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogQXV0byBSZW1vdmUgRXJyb3JcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+Y3VycmVudF9yaW5nX3N0YXR1cyB8PSBBVVRPX1JFTU9WQUxfRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTE9CRV9XSVJFX0ZBVUxUOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExvYmUgV2lyZSBGYXVsdFxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jdXJyZW50X3Jpbmdfc3RhdHVzIHw9IExPQkVfV0lSRV9GQVVMVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBUUkFOU01JVF9CRUFDT046CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogVHJhbnNtaXQgQmVhY29uXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmN1cnJlbnRfcmluZ19zdGF0dXMgfD0gVFJBTlNNSVRfQkVBQ09OOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNPRlRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogU29mdCBFcnJvclxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jdXJyZW50X3Jpbmdfc3RhdHVzIHw9IFNPRlRfRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSEFSRF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBIYXJkIEVycm9yXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmN1cnJlbnRfcmluZ19zdGF0dXMgfD0gSEFSRF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTSUdOQUxfTE9TUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBTaWduYWwgTG9zc1xuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jdXJyZW50X3Jpbmdfc3RhdHVzIHw9IFNJR05BTF9MT1NTOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVua25vd24gcmluZyBzdGF0dXMgY2hhbmdlXG4iLAorCQkJCWRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfcnhfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBfX3UxNiBxdWV1ZSwgc3RhdHVzLCByeF9zaXplLCBlcnIgPSAwOworICAgICAgICBfX3U4ICpwYnVmZjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfcnhfZnJhbWVcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgcXVldWUgPSB0cC0+cmVjZWl2ZV9xdWV1ZV9udW1iZXI7CisKKyAgICAgICAgd2hpbGUoKHN0YXR1cyA9IHRwLT5yeF9mY2JfY3VycltxdWV1ZV0tPmZyYW1lX3N0YXR1cykgIT0gU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IEhBUkRXQVJFX0ZBSUxFRDsKKworICAgICAgICAgICAgICAgIGlmKCgoc3RhdHVzICYgMHgwMDdmKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCh0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX0VSUl9QQUNLRVRTKSAhPSAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcmFtZSBsZW5ndGggbGVzcyB0aGUgQ1JDICg0IGJ5dGVzKSArIEZTICgxIGJ5dGUpICovCisgICAgICAgICAgICAgICAgICAgICAgICByeF9zaXplID0gdHAtPnJ4X2ZjYl9jdXJyW3F1ZXVlXS0+ZnJhbWVfbGVuZ3RoIC0gNTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcGJ1ZmYgPSBzbWN0cl9nZXRfcnhfcG9pbnRlcihkZXYsIHF1ZXVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfc2V0X3BhZ2UoZGV2LCBwYnVmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBidWZmIHBvaW50cyB0byBhZGRyIHdpdGhpbiBvbmUgcGFnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcGJ1ZmYgPSAoX191OCAqKVBBR0VfUE9JTlRFUihwYnVmZik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHF1ZXVlID09IE5PTl9NQUNfUVVFVUUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiID0gZGV2X2FsbG9jX3NrYihyeF9zaXplKTsKKwkJCQlpZiAoc2tiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlza2JfcHV0KHNrYiwgcnhfc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCW1lbWNweShza2ItPmRhdGEsIHBidWZmLCByeF9zaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogVXBkYXRlIENvdW50ZXJzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAl0cC0+TWFjU3RhdC5yeF9wYWNrZXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAl0cC0+TWFjU3RhdC5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogS2ljayB0aGUgcGFja2V0IG9uIHVwLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJc2tiLT5kZXYgPSBkZXY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlza2ItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IsIGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXRpZl9yeChza2IpOworCQkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCX0gZWxzZSB7CisJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9wcm9jZXNzX3J4X3BhY2tldCgoTUFDX0hFQURFUiAqKXBidWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4X3NpemUsIGRldiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopdHAtPnJhbV9hY2Nlc3MpOworICAgICAgICAgICAgICAgIHNtY3RyX3VwZGF0ZV9yeF9jaGFpbihkZXYsIHF1ZXVlKTsKKworICAgICAgICAgICAgICAgIGlmKGVyciAhPSBTVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2VuZF9kYXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgaSwgZXJyOworICAgICAgICBNQUNfSEVBREVSICp0bWY7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfc2VuZF9kYXRcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgaWYoKGZjYiA9IHNtY3RyX2dldF90eF9mY2IoZGV2LCBNQUNfUVVFVUUsCisgICAgICAgICAgICAgICAgc2l6ZW9mKE1BQ19IRUFERVIpKSkgPT0gKEZDQmxvY2sgKikoLTFMKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoT1VUX09GX1JFU09VUkNFUyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbml0aWFsaXplIERBVCBEYXRhIEZpZWxkcy4gKi8KKyAgICAgICAgdG1mID0gKE1BQ19IRUFERVIgKilmY2ItPmJkYl9wdHItPmRhdGFfYmxvY2tfcHRyOworICAgICAgICB0bWYtPmFjID0gTVNCKEFDX0ZDX0RBVCk7CisgICAgICAgIHRtZi0+ZmMgPSBMU0IoQUNfRkNfREFUKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bWYtPnNhW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKyAgICAgICAgICAgICAgICB0bWYtPmRhW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKworICAgICAgICB9CisKKyAgICAgICAgdG1mLT52YyAgICAgICAgPSBEQVQ7CisgICAgICAgIHRtZi0+ZGNfc2MgICAgID0gRENfUlMgfCBTQ19SUzsKKyAgICAgICAgdG1mLT52bCAgICAgICAgPSA0OworICAgICAgICB0bWYtPnZsICAgICAgICA9IFNXQVBfQllURVModG1mLT52bCk7CisKKyAgICAgICAgLyogU3RhcnQgVHJhbnNtaXQuICovCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE1BQ19RVUVVRSkpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICAvKiBXYWl0IGZvciBUcmFuc21pdCB0byBDb21wbGV0ZSAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoZmNiLT5mcmFtZV9zdGF0dXMgJiBGQ0JfQ09NTUFORF9ET05FKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbWRlbGF5KDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgR09PRCBmcmFtZSBUeCdlZC4gKi8KKyAgICAgICAgaWYoIShmY2ItPmZyYW1lX3N0YXR1cyAmICBGQ0JfQ09NTUFORF9ET05FKQorICAgICAgICAgICAgICAgIHx8IGZjYi0+ZnJhbWVfc3RhdHVzICYgKEZDQl9UWF9TVEFUVVNfRSB8IEZDQl9UWF9BQ19CSVRTKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoSU5JVElBTElaRV9GQUlMRUQpOworICAgICAgICB9CisKKyAgICAgICAgLyogRGUtYWxsb2NhdGVkIFR4IEZDQiBhbmQgRnJhbWUgQnVmZmVyCisgICAgICAgICAqIFRoZSBGQ0IgbXVzdCBiZSBkZS1hbGxvY2F0ZWQgbWFudWFsbHkgaWYgZXhlY3V0aW5nIHdpdGgKKyAgICAgICAgICogaW50ZXJydXB0cyBkaXNhYmxlZCwgb3RoZXIgd2lzZSB0aGUgSVNSIChMTV9TZXJ2aWNlX0V2ZW50cykKKyAgICAgICAgICogd2lsbCBkZS1hbGxvY2F0ZSBpdCB3aGVuIHRoZSBpbnRlcnJ1cHQgb2NjdXJzLgorICAgICAgICAgKi8KKyAgICAgICAgdHAtPnR4X3F1ZXVlX3N0YXR1c1tNQUNfUVVFVUVdID0gTk9UX1RSQU5TTUlUSU5HOworICAgICAgICBzbWN0cl91cGRhdGVfdHhfY2hhaW4oZGV2LCBmY2IsIE1BQ19RVUVVRSk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQgc21jdHJfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qCisgICAgICAgICAqIElmIHdlIGdldCBoZXJlLCBzb21lIGhpZ2hlciBsZXZlbCBoYXMgZGVjaWRlZCB3ZSBhcmUgYnJva2VuLgorICAgICAgICAgKiBUaGVyZSBzaG91bGQgcmVhbGx5IGJlIGEgImtpY2sgbWUiIGZ1bmN0aW9uIGNhbGwgaW5zdGVhZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmVzZXR0aW5nIHRoZSB0b2tlbiByaW5nIGFkYXB0ZXIgdGFrZXMgYSBsb25nIHRpbWUgc28ganVzdAorICAgICAgICAgKiBmYWtlIHRyYW5zbWlzc2lvbiB0aW1lIGFuZCBnbyBvbiB0cnlpbmcuIE91ciBvd24gdGltZW91dAorICAgICAgICAgKiByb3V0aW5lIGlzIGluIHNrdHJfdGltZXJfY2hrKCkKKyAgICAgICAgICovCisgICAgICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKiBHZXRzIHNrYiBmcm9tIHN5c3RlbSwgcXVldWVzIGl0IGFuZCBjaGVja3MgaWYgaXQgY2FuIGJlIHNlbnQKKyAqLworc3RhdGljIGludCBzbWN0cl9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3NlbmRfcGFja2V0XG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEJsb2NrIGEgdHJhbnNtaXQgb3ZlcmxhcAorICAgICAgICAgKi8KKyAgICAgICAgIAorICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICAgICAgaWYodHAtPlF1ZXVlU2tiID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuICgxKTsgICAgIC8qIFJldHVybiB3aXRoIHRidXN5IHNldDogcXVldWUgZnVsbCAqLworCisgICAgICAgIHRwLT5RdWV1ZVNrYi0tOworICAgICAgICBza2JfcXVldWVfdGFpbCgmdHAtPlNlbmRTa2JRdWV1ZSwgc2tiKTsKKyAgICAgICAgc21jdHJfaGFyZHdhcmVfc2VuZF9wYWNrZXQoZGV2LCB0cCk7CisgICAgICAgIGlmKHRwLT5RdWV1ZVNrYiA+IDApCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2VuZF9sb2JlX21lZGlhX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCU1BQ19TVUJfVkVDVE9SICp0c3Y7CisJTUFDX0hFQURFUiAqdG1mOworICAgICAgICBGQ0Jsb2NrICpmY2I7CisJX191MzIgaTsKKwlpbnQgZXJyOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTUpCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9zZW5kX2xvYmVfbWVkaWFfdGVzdFxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBpZigoZmNiID0gc21jdHJfZ2V0X3R4X2ZjYihkZXYsIE1BQ19RVUVVRSwgc2l6ZW9mKHN0cnVjdCB0cmhfaGRyKQorICAgICAgICAgICAgICAgICsgU19XUkFQX0RBVEEgKyBTX1dSQVBfREFUQSkpID09IChGQ0Jsb2NrICopKC0xTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKE9VVF9PRl9SRVNPVVJDRVMpOworICAgICAgICB9CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBEQVQgRGF0YSBGaWVsZHMuICovCisgICAgICAgIHRtZiA9IChNQUNfSEVBREVSICopZmNiLT5iZGJfcHRyLT5kYXRhX2Jsb2NrX3B0cjsKKyAgICAgICAgdG1mLT5hYyA9IE1TQihBQ19GQ19MT0JFX01FRElBX1RFU1QpOworICAgICAgICB0bWYtPmZjID0gTFNCKEFDX0ZDX0xPQkVfTUVESUFfVEVTVCk7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1mLT5kYVtpXSA9IDA7CisgICAgICAgICAgICAgICAgdG1mLT5zYVtpXSA9IGRldi0+ZGV2X2FkZHJbaV07CisgICAgICAgIH0KKworICAgICAgICB0bWYtPnZjICAgICAgICA9IExPQkVfTUVESUFfVEVTVDsKKyAgICAgICAgdG1mLT5kY19zYyAgICAgPSBEQ19SUyB8IFNDX1JTOworICAgICAgICB0bWYtPnZsICAgICAgICA9IDQ7CisKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0bWYgKyBzaXplb2YoTUFDX0hFQURFUikpOworICAgICAgICBzbWN0cl9tYWtlX3dyYXBfZGF0YShkZXYsIHRzdik7CisgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2Vfd3JhcF9kYXRhKGRldiwgdHN2KTsKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKworICAgICAgICAvKiBTdGFydCBUcmFuc21pdC4gKi8KKyAgICAgICAgdG1mLT52bCA9IFNXQVBfQllURVModG1mLT52bCk7CisgICAgICAgIGlmKChlcnIgPSBzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE1BQ19RVUVVRSkpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICAvKiBXYWl0IGZvciBUcmFuc21pdCB0byBDb21wbGV0ZS4gKDEwIG1zKS4gKi8KKyAgICAgICAgZm9yKGk9MDsgaSA8IDEwMDAwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihmY2ItPmZyYW1lX3N0YXR1cyAmIEZDQl9DT01NQU5EX0RPTkUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtZGVsYXkoMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVjayBpZiBHT09EIGZyYW1lIFR4J2VkICovCisgICAgICAgIGlmKCEoZmNiLT5mcmFtZV9zdGF0dXMgJiBGQ0JfQ09NTUFORF9ET05FKQorICAgICAgICAgICAgICAgIHx8IGZjYi0+ZnJhbWVfc3RhdHVzICYgKEZDQl9UWF9TVEFUVVNfRSB8IEZDQl9UWF9BQ19CSVRTKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoTE9CRV9NRURJQV9URVNUX0ZBSUxFRCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBEZS1hbGxvY2F0ZWQgVHggRkNCIGFuZCBGcmFtZSBCdWZmZXIKKyAgICAgICAgICogVGhlIEZDQiBtdXN0IGJlIGRlLWFsbG9jYXRlZCBtYW51YWxseSBpZiBleGVjdXRpbmcgd2l0aAorICAgICAgICAgKiBpbnRlcnJ1cHRzIGRpc2FibGVkLCBvdGhlciB3aXNlIHRoZSBJU1IgKExNX1NlcnZpY2VfRXZlbnRzKQorICAgICAgICAgKiB3aWxsIGRlLWFsbG9jYXRlIGl0IHdoZW4gdGhlIGludGVycnVwdCBvY2N1cnMuCisgICAgICAgICAqLworICAgICAgICB0cC0+dHhfcXVldWVfc3RhdHVzW01BQ19RVUVVRV0gPSBOT1RfVFJBTlNNSVRJTkc7CisgICAgICAgIHNtY3RyX3VwZGF0ZV90eF9jaGFpbihkZXYsIGZjYiwgTUFDX1FVRVVFKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnB0X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX0hFQURFUiAqcm1mLAorICAgICAgICBfX3UxNiBjb3JyZWxhdG9yKQoreworICAgICAgICBNQUNfSEVBREVSICp0bWY7CisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3Y7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKworICAgICAgICBpZigoZmNiID0gc21jdHJfZ2V0X3R4X2ZjYihkZXYsIE1BQ19RVUVVRSwgc2l6ZW9mKE1BQ19IRUFERVIpCisJCSsgU19DT1JSRUxBVE9SICsgU19QSFlTSUNBTF9EUk9QICsgU19VUFNUUkVBTV9ORUlHSEJPUl9BRERSRVNTCisJCSsgU19BRERSRVNTX01PRElGRVIgKyBTX0dST1VQX0FERFJFU1MgKyBTX0ZVTkNUSU9OQUxfQUREUkVTUykpCisJCT09IChGQ0Jsb2NrICopKC0xTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisKKyAgICAgICAgdG1mIAkJPSAoTUFDX0hFQURFUiAqKWZjYi0+YmRiX3B0ci0+ZGF0YV9ibG9ja19wdHI7CisgICAgICAgIHRtZi0+dmMgICAgCT0gUlBUX0FERFI7CisgICAgICAgIHRtZi0+ZGNfc2MgCT0gKHJtZi0+ZGNfc2MgJiBTQ19NQVNLKSA8PCA0OworICAgICAgICB0bWYtPnZsICAgIAk9IDQ7CisKKyAgICAgICAgc21jdHJfbWFrZV84MDI1X2hkcihkZXYsIHJtZiwgdG1mLCBBQ19GQ19SUFRfQUREUik7CisKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0bWYgKyBzaXplb2YoTUFDX0hFQURFUikpOworICAgICAgICBzbWN0cl9tYWtlX2NvcnIoZGV2LCB0c3YsIGNvcnJlbGF0b3IpOworCisgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdHN2ICsgdHN2LT5zdmwpOworICAgICAgICBzbWN0cl9tYWtlX3BoeV9kcm9wX251bShkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfdXBzdHJlYW1fbmVpZ2hib3JfYWRkcihkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfYWRkcl9tb2QoZGV2LCB0c3YpOworCisgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdHN2ICsgdHN2LT5zdmwpOworICAgICAgICBzbWN0cl9tYWtlX2dyb3VwX2FkZHIoZGV2LCB0c3YpOworCisgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdHN2ICsgdHN2LT5zdmwpOworICAgICAgICBzbWN0cl9tYWtlX2Z1bmN0X2FkZHIoZGV2LCB0c3YpOworCisgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisKKyAgICAgICAgLyogU3VidHJhY3Qgb3V0IE1WSUQgYW5kIE1WTCB3aGljaCBpcworICAgICAgICAgKiBpbmNsdWRlIGluIGJvdGggdmwgYW5kIE1BQ19IRUFERVIKKyAgICAgICAgICovCisvKiAgICAgIGZjYi0+ZnJhbWVfbGVuZ3RoICAgICAgICAgICA9IHRtZi0+dmwgKyBzaXplb2YoTUFDX0hFQURFUikgLSA0OworICAgICAgICBmY2ItPmJkYl9wdHItPmJ1ZmZlcl9sZW5ndGggPSB0bWYtPnZsICsgc2l6ZW9mKE1BQ19IRUFERVIpIC0gNDsKKyovCisgICAgICAgIHRtZi0+dmwgPSBTV0FQX0JZVEVTKHRtZi0+dmwpOworCisgICAgICAgIHJldHVybiAoc21jdHJfdHJjX3NlbmRfcGFja2V0KGRldiwgZmNiLCBNQUNfUVVFVUUpKTsKK30KKworc3RhdGljIGludCBzbWN0cl9zZW5kX3JwdF9hdHRjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2IGNvcnJlbGF0b3IpCit7CisgICAgICAgIE1BQ19IRUFERVIgKnRtZjsKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdjsKKyAgICAgICAgRkNCbG9jayAqZmNiOworCisgICAgICAgIGlmKChmY2IgPSBzbWN0cl9nZXRfdHhfZmNiKGRldiwgTUFDX1FVRVVFLCBzaXplb2YoTUFDX0hFQURFUikKKwkJKyBTX0NPUlJFTEFUT1IgKyBTX1BST0RVQ1RfSU5TVEFOQ0VfSUQgKyBTX0ZVTkNUSU9OQUxfQUREUkVTUworCQkrIFNfQVVUSE9SSVpFRF9GVU5DVElPTl9DTEFTUyArIFNfQVVUSE9SSVpFRF9BQ0NFU1NfUFJJT1JJVFkpKQorCQk9PSAoRkNCbG9jayAqKSgtMUwpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorCisgICAgICAgIHRtZiAJICAgPSAoTUFDX0hFQURFUiAqKWZjYi0+YmRiX3B0ci0+ZGF0YV9ibG9ja19wdHI7CisgICAgICAgIHRtZi0+dmMgICAgPSBSUFRfQVRUQ0g7CisgICAgICAgIHRtZi0+ZGNfc2MgPSAocm1mLT5kY19zYyAmIFNDX01BU0spIDw8IDQ7CisgICAgICAgIHRtZi0+dmwgICAgPSA0OworCisgICAgICAgIHNtY3RyX21ha2VfODAyNV9oZHIoZGV2LCBybWYsIHRtZiwgQUNfRkNfUlBUX0FUVENIKTsKKworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisgICAgICAgIHNtY3RyX21ha2VfY29ycihkZXYsIHRzdiwgY29ycmVsYXRvcik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfcHJvZHVjdF9pZChkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfZnVuY3RfYWRkcihkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfYXV0aF9mdW5jdF9jbGFzcyhkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfYWNjZXNzX3ByaShkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKworICAgICAgICAvKiBTdWJ0cmFjdCBvdXQgTVZJRCBhbmQgTVZMIHdoaWNoIGlzCisgICAgICAgICAqIGluY2x1ZGUgaW4gYm90aCB2bCBhbmQgTUFDX0hFQURFUgorICAgICAgICAgKi8KKy8qICAgICAgZmNiLT5mcmFtZV9sZW5ndGggICAgICAgICAgID0gdG1mLT52bCArIHNpemVvZihNQUNfSEVBREVSKSAtIDQ7CisgICAgICAgIGZjYi0+YmRiX3B0ci0+YnVmZmVyX2xlbmd0aCA9IHRtZi0+dmwgKyBzaXplb2YoTUFDX0hFQURFUikgLSA0OworKi8KKyAgICAgICAgdG1mLT52bCA9IFNXQVBfQllURVModG1mLT52bCk7CisKKyAgICAgICAgcmV0dXJuIChzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE1BQ19RVUVVRSkpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnB0X3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgY29ycmVsYXRvcikKK3sKKyAgICAgICAgTUFDX0hFQURFUiAqdG1mOworICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2OworICAgICAgICBGQ0Jsb2NrICpmY2I7CisKKyAgICAgICAgaWYoKGZjYiA9IHNtY3RyX2dldF90eF9mY2IoZGV2LCBNQUNfUVVFVUUsIHNpemVvZihNQUNfSEVBREVSKQorCQkrIFNfQ09SUkVMQVRPUiArIFNfUklOR19TVEFUSU9OX1ZFUlNJT05fTlVNQkVSCisJCSsgU19SSU5HX1NUQVRJT05fU1RBVFVTICsgU19TVEFUSU9OX0lERU5USUZFUikpCisJCT09IChGQ0Jsb2NrICopKC0xTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisKKyAgICAgICAgdG1mIAkgICA9IChNQUNfSEVBREVSICopZmNiLT5iZGJfcHRyLT5kYXRhX2Jsb2NrX3B0cjsKKyAgICAgICAgdG1mLT52YyAgICA9IFJQVF9TVEFURTsKKyAgICAgICAgdG1mLT5kY19zYyA9IChybWYtPmRjX3NjICYgU0NfTUFTSykgPDwgNDsKKyAgICAgICAgdG1mLT52bCAgICA9IDQ7CisKKyAgICAgICAgc21jdHJfbWFrZV84MDI1X2hkcihkZXYsIHJtZiwgdG1mLCBBQ19GQ19SUFRfU1RBVEUpOworCisgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdG1mICsgc2l6ZW9mKE1BQ19IRUFERVIpKTsKKyAgICAgICAgc21jdHJfbWFrZV9jb3JyKGRldiwgdHN2LCBjb3JyZWxhdG9yKTsKKworICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRzdiArIHRzdi0+c3ZsKTsKKyAgICAgICAgc21jdHJfbWFrZV9yaW5nX3N0YXRpb25fdmVyc2lvbihkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfcmluZ19zdGF0aW9uX3N0YXR1cyhkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2Vfc3RhdGlvbl9pZChkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKworICAgICAgICAvKiBTdWJ0cmFjdCBvdXQgTVZJRCBhbmQgTVZMIHdoaWNoIGlzCisgICAgICAgICAqIGluY2x1ZGUgaW4gYm90aCB2bCBhbmQgTUFDX0hFQURFUgorICAgICAgICAgKi8KKy8qICAgICAgZmNiLT5mcmFtZV9sZW5ndGggICAgICAgICAgID0gdG1mLT52bCArIHNpemVvZihNQUNfSEVBREVSKSAtIDQ7CisgICAgICAgIGZjYi0+YmRiX3B0ci0+YnVmZmVyX2xlbmd0aCA9IHRtZi0+dmwgKyBzaXplb2YoTUFDX0hFQURFUikgLSA0OworKi8KKyAgICAgICAgdG1mLT52bCA9IFNXQVBfQllURVModG1mLT52bCk7CisKKyAgICAgICAgcmV0dXJuIChzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE1BQ19RVUVVRSkpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnB0X3R4X2ZvcndhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX0hFQURFUiAqcm1mLCBfX3UxNiB0eF9mc3RhdHVzKQoreworICAgICAgICBNQUNfSEVBREVSICp0bWY7CisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3Y7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKworICAgICAgICBpZigoZmNiID0gc21jdHJfZ2V0X3R4X2ZjYihkZXYsIE1BQ19RVUVVRSwgc2l6ZW9mKE1BQ19IRUFERVIpCisJCSsgU19UUkFOU01JVF9TVEFUVVNfQ09ERSkpID09IChGQ0Jsb2NrICopKC0xTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisKKyAgICAgICAgdG1mIAkgICA9IChNQUNfSEVBREVSICopZmNiLT5iZGJfcHRyLT5kYXRhX2Jsb2NrX3B0cjsKKyAgICAgICAgdG1mLT52YyAgICA9IFJQVF9UWF9GT1JXQVJEOworICAgICAgICB0bWYtPmRjX3NjID0gKHJtZi0+ZGNfc2MgJiBTQ19NQVNLKSA8PCA0OworICAgICAgICB0bWYtPnZsICAgID0gNDsKKworICAgICAgICBzbWN0cl9tYWtlXzgwMjVfaGRyKGRldiwgcm1mLCB0bWYsIEFDX0ZDX1JQVF9UWF9GT1JXQVJEKTsKKworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisgICAgICAgIHNtY3RyX21ha2VfdHhfc3RhdHVzX2NvZGUoZGV2LCB0c3YsIHR4X2ZzdGF0dXMpOworCisgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisKKyAgICAgICAgLyogU3VidHJhY3Qgb3V0IE1WSUQgYW5kIE1WTCB3aGljaCBpcworICAgICAgICAgKiBpbmNsdWRlIGluIGJvdGggdmwgYW5kIE1BQ19IRUFERVIKKyAgICAgICAgICovCisvKiAgICAgIGZjYi0+ZnJhbWVfbGVuZ3RoICAgICAgICAgICA9IHRtZi0+dmwgKyBzaXplb2YoTUFDX0hFQURFUikgLSA0OworICAgICAgICBmY2ItPmJkYl9wdHItPmJ1ZmZlcl9sZW5ndGggPSB0bWYtPnZsICsgc2l6ZW9mKE1BQ19IRUFERVIpIC0gNDsKKyovCisgICAgICAgIHRtZi0+dmwgPSBTV0FQX0JZVEVTKHRtZi0+dmwpOworCisgICAgICAgIHJldHVybihzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE1BQ19RVUVVRSkpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnNwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgcmNvZGUsIF9fdTE2IGNvcnJlbGF0b3IpCit7CisgICAgICAgIE1BQ19IRUFERVIgKnRtZjsKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdjsKKyAgICAgICAgRkNCbG9jayAqZmNiOworCisgICAgICAgIGlmKChmY2IgPSBzbWN0cl9nZXRfdHhfZmNiKGRldiwgTUFDX1FVRVVFLCBzaXplb2YoTUFDX0hFQURFUikKKwkJKyBTX0NPUlJFTEFUT1IgKyBTX1JFU1BPTlNFX0NPREUpKSA9PSAoRkNCbG9jayAqKSgtMUwpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorCisgICAgICAgIHRtZiAJICAgPSAoTUFDX0hFQURFUiAqKWZjYi0+YmRiX3B0ci0+ZGF0YV9ibG9ja19wdHI7CisgICAgICAgIHRtZi0+dmMgICAgPSBSU1A7CisgICAgICAgIHRtZi0+ZGNfc2MgPSAocm1mLT5kY19zYyAmIFNDX01BU0spIDw8IDQ7CisgICAgICAgIHRtZi0+dmwgICAgPSA0OworCisgICAgICAgIHNtY3RyX21ha2VfODAyNV9oZHIoZGV2LCBybWYsIHRtZiwgQUNfRkNfUlNQKTsKKworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisgICAgICAgIHNtY3RyX21ha2VfY29ycihkZXYsIHRzdiwgY29ycmVsYXRvcik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9zZW5kX3JxX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBNQUNfSEVBREVSICp0bWY7CisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3Y7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKwl1bnNpZ25lZCBpbnQgaSwgY291bnQgPSAwOworCV9fdTE2IGZzdGF0dXM7CisJaW50IGVycjsKKworICAgICAgICBkbyB7CisgICAgICAgIAlpZigoKGZjYiA9IHNtY3RyX2dldF90eF9mY2IoZGV2LCBNQUNfUVVFVUUsIHNpemVvZihNQUNfSEVBREVSKQorCQkJKyBTX1BST0RVQ1RfSU5TVEFOQ0VfSUQgKyBTX1VQU1RSRUFNX05FSUdIQk9SX0FERFJFU1MKKwkJCSsgU19SSU5HX1NUQVRJT05fVkVSU0lPTl9OVU1CRVIgKyBTX0FERFJFU1NfTU9ESUZFUikpCisJCQk9PSAoRkNCbG9jayAqKSgtMUwpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRtZiAJICAgPSAoTUFDX0hFQURFUiAqKWZjYi0+YmRiX3B0ci0+ZGF0YV9ibG9ja19wdHI7CisgICAgICAgICAgICAgICAgdG1mLT52YyAgICA9IFJRX0lOSVQ7CisgICAgICAgICAgICAgICAgdG1mLT5kY19zYyA9IERDX1JQUyB8IFNDX1JTOworICAgICAgICAgICAgICAgIHRtZi0+dmwgICAgPSA0OworCisgICAgICAgICAgICAgICAgc21jdHJfbWFrZV84MDI1X2hkcihkZXYsIE5VTEwsIHRtZiwgQUNfRkNfUlFfSU5JVCk7CisKKyAgICAgICAgICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisgICAgICAgICAgICAgICAgc21jdHJfbWFrZV9wcm9kdWN0X2lkKGRldiwgdHN2KTsKKworICAgICAgICAgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisgICAgICAgICAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgICAgICAgICAgc21jdHJfbWFrZV91cHN0cmVhbV9uZWlnaGJvcl9hZGRyKGRldiwgdHN2KTsKKworICAgICAgICAgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisgICAgICAgICAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgICAgICAgICAgc21jdHJfbWFrZV9yaW5nX3N0YXRpb25fdmVyc2lvbihkZXYsIHRzdik7CisKKyAgICAgICAgICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworICAgICAgICAgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdHN2ICsgdHN2LT5zdmwpOworICAgICAgICAgICAgICAgIHNtY3RyX21ha2VfYWRkcl9tb2QoZGV2LCB0c3YpOworCisgICAgICAgICAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKworICAgICAgICAgICAgICAgIC8qIFN1YnRyYWN0IG91dCBNVklEIGFuZCBNVkwgd2hpY2ggaXMKKyAgICAgICAgICAgICAgICAgKiBpbmNsdWRlIGluIGJvdGggdmwgYW5kIE1BQ19IRUFERVIKKyAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBmY2ItPmZyYW1lX2xlbmd0aCAgICAgICAgICAgPSB0bWYtPnZsICsgc2l6ZW9mKE1BQ19IRUFERVIpIC0gNDsKKyAgICAgICAgICAgICAgICBmY2ItPmJkYl9wdHItPmJ1ZmZlcl9sZW5ndGggPSB0bWYtPnZsICsgc2l6ZW9mKE1BQ19IRUFERVIpIC0gNDsKKyovCisgICAgICAgICAgICAgICAgdG1mLT52bCA9IFNXQVBfQllURVModG1mLT52bCk7CisKKyAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfdHJjX3NlbmRfcGFja2V0KGRldiwgZmNiLCBNQUNfUVVFVUUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIFRyYW5zbWl0IHRvIENvbXBsZXRlICovCisgICAgICAJCWZvcihpID0gMDsgaSA8IDEwMDAwOyBpKyspIAorCQl7CisgICAgICAgICAgCQlpZihmY2ItPmZyYW1lX3N0YXR1cyAmIEZDQl9DT01NQU5EX0RPTkUpCisgICAgICAgICAgICAgIAkJCWJyZWFrOworICAgICAgICAgIAkJbWRlbGF5KDEpOworICAgICAgCQl9CisKKyAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiBHT09EIGZyYW1lIFR4J2VkICovCisgICAgICAgICAgICAgICAgZnN0YXR1cyA9IGZjYi0+ZnJhbWVfc3RhdHVzOworCisgICAgICAgICAgICAgICAgaWYoIShmc3RhdHVzICYgRkNCX0NPTU1BTkRfRE9ORSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEhBUkRXQVJFX0ZBSUxFRCk7CisKKyAgICAgICAgICAgICAgICBpZighKGZzdGF0dXMgJiBGQ0JfVFhfU1RBVFVTX0UpKQorICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKworICAgICAgICAgICAgICAgIC8qIERlLWFsbG9jYXRlZCBUeCBGQ0IgYW5kIEZyYW1lIEJ1ZmZlcgorICAgICAgICAgICAgICAgICAqIFRoZSBGQ0IgbXVzdCBiZSBkZS1hbGxvY2F0ZWQgbWFudWFsbHkgaWYgZXhlY3V0aW5nIHdpdGgKKyAgICAgICAgICAgICAgICAgKiBpbnRlcnJ1cHRzIGRpc2FibGVkLCBvdGhlciB3aXNlIHRoZSBJU1IgKExNX1NlcnZpY2VfRXZlbnRzKQorICAgICAgICAgICAgICAgICAqIHdpbGwgZGUtYWxsb2NhdGUgaXQgd2hlbiB0aGUgaW50ZXJydXB0IG9jY3Vycy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB0cC0+dHhfcXVldWVfc3RhdHVzW01BQ19RVUVVRV0gPSBOT1RfVFJBTlNNSVRJTkc7CisgICAgICAgICAgICAgICAgc21jdHJfdXBkYXRlX3R4X2NoYWluKGRldiwgZmNiLCBNQUNfUVVFVUUpOworICAgICAgICB9IHdoaWxlKGNvdW50IDwgNCAmJiAoKGZzdGF0dXMgJiBGQ0JfVFhfQUNfQklUUykgXiBGQ0JfVFhfQUNfQklUUykpOworCisJcmV0dXJuIChzbWN0cl9qb2luX2NvbXBsZXRlX3N0YXRlKGRldikpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NlbmRfdHhfZm9yd2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2ICp0eF9mc3RhdHVzKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisJaW50IGVycjsKKworICAgICAgICAvKiBDaGVjayBpZiB0aGlzIGlzIHRoZSBFTkQgUE9JTlQgb2YgdGhlIFRyYW5zbWl0IEZvcndhcmQgQ2hhaW4uICovCisgICAgICAgIGlmKHJtZi0+dmwgPD0gMTgpCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKworICAgICAgICAvKiBBbGxvY2F0ZSBUcmFuc21pdCBGQ0Igb25seSBieSByZXF1ZXN0aW5nIDAgYnl0ZXMKKyAgICAgICAgICogb2YgZGF0YSBidWZmZXIuCisgICAgICAgICAqLworICAgICAgICBpZigoZmNiID0gc21jdHJfZ2V0X3R4X2ZjYihkZXYsIE1BQ19RVUVVRSwgMCkpID09IChGQ0Jsb2NrICopKC0xTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKworICAgICAgICAvKiBTZXQgcG9pbnRlciB0byBUcmFuc21pdCBGcmFtZSBCdWZmZXIgdG8gdGhlIGRhdGEKKyAgICAgICAgICogcG9ydGlvbiBvZiB0aGUgcmVjZWl2ZWQgVFggRm9yd2FyZCBmcmFtZSwgbWFraW5nCisgICAgICAgICAqIHN1cmUgdG8gc2tpcCBvdmVyIHRoZSBWZWN0b3IgQ29kZSAodmMpIGFuZCBWZWN0b3IKKyAgICAgICAgICogbGVuZ3RoICh2bCkuCisgICAgICAgICAqLworICAgICAgICBmY2ItPmJkYl9wdHItPnRyY19kYXRhX2Jsb2NrX3B0ciA9IFRSQ19QT0lOVEVSKChfX3UzMilybWYgCisJCSsgc2l6ZW9mKE1BQ19IRUFERVIpICsgMik7CisgICAgICAgIGZjYi0+YmRiX3B0ci0+ZGF0YV9ibG9ja19wdHIgICAgID0gKF9fdTE2ICopKChfX3UzMilybWYgCisJCSsgc2l6ZW9mKE1BQ19IRUFERVIpICsgMik7CisKKyAgICAgICAgZmNiLT5mcmFtZV9sZW5ndGggICAgICAgICAgICAgICAgPSBybWYtPnZsIC0gNCAtIDI7CisgICAgICAgIGZjYi0+YmRiX3B0ci0+YnVmZmVyX2xlbmd0aCAgICAgID0gcm1mLT52bCAtIDQgLSAyOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE1BQ19RVUVVRSkpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICAvKiBXYWl0IGZvciBUcmFuc21pdCB0byBDb21wbGV0ZSAqLworICAgCWZvcihpID0gMDsgaSA8IDEwMDAwOyBpKyspIAorCXsKKyAgICAgICAJCWlmKGZjYi0+ZnJhbWVfc3RhdHVzICYgRkNCX0NPTU1BTkRfRE9ORSkKKyAgICAgICAgICAgCQlicmVhazsKKyAgICAgICAgCW1kZWxheSgxKTsKKyAgIAl9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgR09PRCBmcmFtZSBUeCdlZCAqLworICAgICAgICBpZighKGZjYi0+ZnJhbWVfc3RhdHVzICYgRkNCX0NPTU1BTkRfRE9ORSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfcmVzdW1lX3R4X2ZjYl9jbWQoZGV2LCBNQUNfUVVFVUUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgCQlmb3IoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSAKKwkJeworICAgICAgICAgIAkJaWYoZmNiLT5mcmFtZV9zdGF0dXMgJiBGQ0JfQ09NTUFORF9ET05FKQorICAgICAgICAgICAgICAJCQlicmVhazsKKyAgICAgICAgCQltZGVsYXkoMSk7CisgICAgICAJCX0KKworICAgICAgICAgICAgICAgIGlmKCEoZmNiLT5mcmFtZV9zdGF0dXMgJiBGQ0JfQ09NTUFORF9ET05FKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSEFSRFdBUkVfRkFJTEVEKTsKKyAgICAgICAgfQorCisgICAgICAgICp0eF9mc3RhdHVzID0gZmNiLT5mcmFtZV9zdGF0dXM7CisKKyAgICAgICAgcmV0dXJuIChBX0ZSQU1FX1dBU19GT1JXQVJERUQpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NldF9hdXRoX2FjY2Vzc19wcmkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIGlmKHJzdi0+c3ZsICE9IFNfQVVUSE9SSVpFRF9BQ0NFU1NfUFJJT1JJVFkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChFX1NVQl9WRUNUT1JfTEVOR1RIX0VSUk9SKTsKKworICAgICAgICB0cC0+YXV0aG9yaXplZF9hY2Nlc3NfcHJpb3JpdHkgPSAocnN2LT5zdnZbMF0gPDwgOCB8IHJzdi0+c3Z2WzFdKTsKKworICAgICAgICByZXR1cm4gKFBPU0lUSVZFX0FDSyk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2V0X2F1dGhfZnVuY3RfY2xhc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIGlmKHJzdi0+c3ZsICE9IFNfQVVUSE9SSVpFRF9GVU5DVElPTl9DTEFTUykKKyAgICAgICAgICAgICAgICByZXR1cm4gKEVfU1VCX1ZFQ1RPUl9MRU5HVEhfRVJST1IpOworCisgICAgICAgIHRwLT5hdXRob3JpemVkX2Z1bmN0aW9uX2NsYXNzZXMgPSAocnN2LT5zdnZbMF0gPDwgOCB8IHJzdi0+c3Z2WzFdKTsKKworICAgICAgICByZXR1cm4gKFBPU0lUSVZFX0FDSyk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2V0X2NvcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX1NVQl9WRUNUT1IgKnJzdiwKKyAgICAgICAgX191MTYgKmNvcnJlbGF0b3IpCit7CisgICAgICAgIGlmKHJzdi0+c3ZsICE9IFNfQ09SUkVMQVRPUikKKyAgICAgICAgICAgICAgICByZXR1cm4gKEVfU1VCX1ZFQ1RPUl9MRU5HVEhfRVJST1IpOworCisgICAgICAgICpjb3JyZWxhdG9yID0gKHJzdi0+c3Z2WzBdIDw8IDggfCByc3YtPnN2dlsxXSk7CisKKyAgICAgICAgcmV0dXJuIChQT1NJVElWRV9BQ0spOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NldF9lcnJvcl90aW1lcl92YWx1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2KQoreworCV9fdTE2IGVycl90dmFsOworCWludCBlcnI7CisKKyAgICAgICAgaWYocnN2LT5zdmwgIT0gU19FUlJPUl9USU1FUl9WQUxVRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKEVfU1VCX1ZFQ1RPUl9MRU5HVEhfRVJST1IpOworCisgICAgICAgIGVycl90dmFsID0gKHJzdi0+c3Z2WzBdIDw8IDggfCByc3YtPnN2dlsxXSkqMTA7CisKKyAgICAgICAgc21jdHJfaXNzdWVfd3JpdGVfd29yZF9jbWQoZGV2LCBSV19URVJfVEhSRVNIT0xELCAmZXJyX3R2YWwpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgcmV0dXJuIChQT1NJVElWRV9BQ0spOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NldF9mcmFtZV9mb3J3YXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICpyc3YsIF9fdTggZGNfc2MpCit7CisgICAgICAgIGlmKChyc3YtPnN2bCA8IDIpIHx8IChyc3YtPnN2bCA+IFNfRlJBTUVfRk9SV0FSRCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChFX1NVQl9WRUNUT1JfTEVOR1RIX0VSUk9SKTsKKworICAgICAgICBpZigoZGNfc2MgJiBEQ19NQVNLKSAhPSBEQ19DUlMpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihyc3YtPnN2bCA+PSAyICYmIHJzdi0+c3ZsIDwgMjApCisgICAgICAgICAgICAgICAgCXJldHVybiAoRV9UUkFOU01JVF9GT1JXQVJEX0lOVkFMSUQpOworCisgICAgICAgICAgICAgICAgaWYoKHJzdi0+c3Z2WzBdICE9IDApIHx8IChyc3YtPnN2dlsxXSAhPSAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRV9UUkFOU01JVF9GT1JXQVJEX0lOVkFMSUQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChQT1NJVElWRV9BQ0spOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NldF9sb2NhbF9yaW5nX251bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgaWYocnN2LT5zdmwgIT0gU19MT0NBTF9SSU5HX05VTUJFUikKKyAgICAgICAgICAgICAgICByZXR1cm4gKEVfU1VCX1ZFQ1RPUl9MRU5HVEhfRVJST1IpOworCisgICAgICAgIGlmKHRwLT5wdHJfbG9jYWxfcmluZ19udW0pCisgICAgICAgICAgICAgICAgKihfX3UxNiAqKSh0cC0+cHRyX2xvY2FsX3JpbmdfbnVtKSAKKwkJCT0gKHJzdi0+c3Z2WzBdIDw8IDggfCByc3YtPnN2dlsxXSk7CisKKyAgICAgICAgcmV0dXJuIChQT1NJVElWRV9BQ0spOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc21jdHJfc2V0X2N0cmxfYXR0ZW50aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgICAgIGlmKHRwLT5iaWNfdHlwZSA9PSBCSUNfNTg1X0NISVApCisgICAgICAgICAgICAgICAgb3V0YigodHAtPnRyY19tYXNrIHwgSFdSX0NBKSwgaW9hZGRyICsgSFdSKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0YigodHAtPnRyY19tYXNrIHwgQ1NSX0NBKSwgaW9hZGRyICsgQ1NSKTsKKyAgICAgICAgICAgICAgICBvdXRiKHRwLT50cmNfbWFzaywgaW9hZGRyICsgQ1NSKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNtY3RyX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfc2V0X211bHRpY2FzdF9saXN0XG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHJldHVybjsKK30KKworc3RhdGljIGludCBzbWN0cl9zZXRfcGFnZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3U4ICpidWYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgX191OCBhbWFzazsKKyAgICAgICAgX191MzIgdHB0cjsKKworICAgICAgICB0cHRyID0gKF9fdTMyKWJ1ZiAtIChfX3UzMil0cC0+cmFtX2FjY2VzczsKKyAgICAgICAgYW1hc2sgPSAoX191OCkoKHRwdHIgJiBQUl9QQUdFX01BU0spID4+IDgpOworICAgICAgICBvdXRiKGFtYXNrLCBkZXYtPmJhc2VfYWRkciArIFBSKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NldF9waHlfZHJvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfU1VCX1ZFQ1RPUiAqcnN2KQoreworCWludCBlcnI7CisKKyAgICAgICAgaWYocnN2LT5zdmwgIT0gU19QSFlTSUNBTF9EUk9QKQorICAgICAgICAgICAgICAgIHJldHVybiAoRV9TVUJfVkVDVE9SX0xFTkdUSF9FUlJPUik7CisKKyAgICAgICAgc21jdHJfaXNzdWVfd3JpdGVfYnl0ZV9jbWQoZGV2LCBSV19QSFlTSUNBTF9EUk9QX05VTUJFUiwgJnJzdi0+c3Z2WzBdKTsKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICByZXR1cm4gKFBPU0lUSVZFX0FDSyk7Cit9CisKKy8qIFJlc2V0IHRoZSByaW5nIHNwZWVkIHRvIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IGl0IHdhcy4gVGhpcyBhdXRvLXBpbG90CisgKiBtb2RlIHJlcXVpcmVzIGEgY29tcGxldGUgcmVzZXQgYW5kIHJlLWluaXQgb2YgdGhlIGFkYXB0ZXIuCisgKi8KK3N0YXRpYyBpbnQgc21jdHJfc2V0X3Jpbmdfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKyAgICAgICAgaWYodHAtPm1lZGlhX3R5cGUgPT0gTUVESUFfVVRQXzE2KQorICAgICAgICAgICAgICAgIHRwLT5tZWRpYV90eXBlID0gTUVESUFfVVRQXzQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0cC0+bWVkaWFfdHlwZSA9IE1FRElBX1VUUF8xNjsKKworICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKworICAgICAgICAvKiBSZS1Jbml0aWFsaXplIGFkYXB0ZXIncyBpbnRlcm5hbCByZWdpc3RlcnMgKi8KKyAgICAgICAgc21jdHJfcmVzZXRfYWRhcHRlcihkZXYpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pbml0X2NhcmRfcmVhbChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgc21jdHJfZW5hYmxlX2JpY19pbnQoZGV2KTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfZW5hYmxlX2ludF9jbWQoZGV2LCBUUkNfSU5URVJSVVBUX0VOQUJMRV9NQVNLKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIHNtY3RyX2Rpc2FibGVfMTZiaXQoZGV2KTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2V0X3J4X2xvb2tfYWhlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBfX3UxNiBzd29yZCwgcndvcmQ7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3NldF9yeF9sb29rX2FoZWFkX2ZsYWdcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgdHAtPmFkYXB0ZXJfZmxhZ3MgJj0gfihGT1JDRURfMTZCSVRfTU9ERSk7CisgICAgICAgIHRwLT5hZGFwdGVyX2ZsYWdzIHw9IFJYX1ZBTElEX0xPT0tBSEVBRDsKKworICAgICAgICBpZih0cC0+YWRhcHRlcl9idXMgPT0gQlVTX0lTQTE2X1RZUEUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd29yZCA9ICooKF9fdTE2ICopKHRwLT5yYW1fYWNjZXNzKSk7CisgICAgICAgICAgICAgICAgKigoX191MTYgKikodHAtPnJhbV9hY2Nlc3MpKSA9IDB4MTIzNDsKKworICAgICAgICAgICAgICAgIHNtY3RyX2Rpc2FibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgICAgICAgICByd29yZCA9ICooKF9fdTE2ICopKHRwLT5yYW1fYWNjZXNzKSk7CisgICAgICAgICAgICAgICAgc21jdHJfZW5hYmxlXzE2Yml0KGRldik7CisKKyAgICAgICAgICAgICAgICBpZihyd29yZCAhPSAweDEyMzQpCisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+YWRhcHRlcl9mbGFncyB8PSBGT1JDRURfMTZCSVRfTU9ERTsKKworICAgICAgICAgICAgICAgICooKF9fdTE2ICopKHRwLT5yYW1fYWNjZXNzKSkgPSBzd29yZDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2V0X3RyY19yZXNldChpbnQgaW9hZGRyKQoreworICAgICAgICBfX3U4IHI7CisKKyAgICAgICAgciA9IGluYihpb2FkZHIgKyBNU1IpOworICAgICAgICBvdXRiKE1TUl9SU1QgfCByLCBpb2FkZHIgKyBNU1IpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgaWYgdGhlIGFkYXB0ZXIgaXMgYnVzeSBvciBub3QuCisgKi8KK3N0YXRpYyBpbnQgc21jdHJfc2V0dXBfc2luZ2xlX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBfX3UxNiBjb21tYW5kLCBfX3UxNiBzdWJjb21tYW5kKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBlcnI7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3NldHVwX3NpbmdsZV9jbWRcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGlmKChlcnIgPSAodW5zaWduZWQgaW50KXNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICB0cC0+YWNiX2hlYWQtPmNtZF9kb25lX3N0YXR1cyAgID0gMDsKKyAgICAgICAgdHAtPmFjYl9oZWFkLT5jbWQgICAgICAgICAgICAgICA9IGNvbW1hbmQ7CisgICAgICAgIHRwLT5hY2JfaGVhZC0+c3ViY21kICAgICAgICAgICAgPSBzdWJjb21tYW5kOworCisgICAgICAgIGVyciA9IHNtY3RyX2lzc3VlX3Jlc3VtZV9hY2JfY21kKGRldik7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBjYW4gbm90IGJlIGNhbGxlZCB3aXRoIHRoZSBhZGFwdGVyIGJ1c3kuCisgKi8KK3N0YXRpYyBpbnQgc21jdHJfc2V0dXBfc2luZ2xlX2NtZF93X2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgX191MTYgY29tbWFuZCwgX191MTYgc3ViY29tbWFuZCkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHRwLT5hY2JfaGVhZC0+Y21kX2RvbmVfc3RhdHVzICAgPSBBQ0JfQ09NTUFORF9OT1RfRE9ORTsKKyAgICAgICAgdHAtPmFjYl9oZWFkLT5jbWQgICAgICAgICAgICAgICA9IGNvbW1hbmQ7CisgICAgICAgIHRwLT5hY2JfaGVhZC0+c3ViY21kICAgICAgICAgICAgPSBzdWJjb21tYW5kOworICAgICAgICB0cC0+YWNiX2hlYWQtPmRhdGFfb2Zmc2V0X2xvCisgICAgICAgICAgICAgICAgPSAoX191MTYpVFJDX1BPSU5URVIodHAtPm1pc2NfY29tbWFuZF9kYXRhKTsKKworICAgICAgICByZXR1cm4oc21jdHJfaXNzdWVfcmVzdW1lX2FjYl9jbWQoZGV2KSk7Cit9CisKK3N0YXRpYyBjaGFyICpzbWN0cl9tYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgc2l6ZSkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBjaGFyICptOworCisgICAgICAgIG0gPSAoY2hhciAqKSh0cC0+cmFtX2FjY2VzcyArIHRwLT5zaF9tZW1fdXNlZCk7CisgICAgICAgIHRwLT5zaF9tZW1fdXNlZCArPSAoX191MzIpc2l6ZTsKKworICAgICAgICByZXR1cm4gKG0pOworfQorCitzdGF0aWMgaW50IHNtY3RyX3N0YXR1c19jaGcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9zdGF0dXNfY2hnXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHN3aXRjaCh0cC0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBPUEVOOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIENMT1NFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyogSW50ZXJydXB0IGRyaXZlbiBvcGVuKCkgY29tcGxldGlvbi4gWFhYICovCisgICAgICAgICAgICAgICAgY2FzZSBJTklUSUFMSVpFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5ncm91cF9hZGRyZXNzXzAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmdyb3VwX2FkZHJlc3NbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmdyb3VwX2FkZHJlc3NbMV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmZ1bmN0aW9uYWxfYWRkcmVzc18wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5mdW5jdGlvbmFsX2FkZHJlc3NbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmZ1bmN0aW9uYWxfYWRkcmVzc1sxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9vcGVuX3RyKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogc3RhdHVzIGNoYW5nZSB1bmtub3duICV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIHRwLT5zdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX3RyY19zZW5kX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBGQ0Jsb2NrICpmY2IsCisgICAgICAgIF9fdTE2IHF1ZXVlKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBlcnIgPSAwOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl90cmNfc2VuZF9wYWNrZXRcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgZmNiLT5pbmZvID0gRkNCX0NIQUlOX0VORCB8IEZDQl9FTkFCTEVfVEZTOworICAgICAgICBpZih0cC0+bnVtX3R4X2ZjYnNbcXVldWVdICE9IDEpCisgICAgICAgICAgICAgICAgZmNiLT5iYWNrX3B0ci0+aW5mbyA9IEZDQl9JTlRFUlJVUFRfRU5BQkxFIHwgRkNCX0VOQUJMRV9URlM7CisKKyAgICAgICAgaWYodHAtPnR4X3F1ZXVlX3N0YXR1c1txdWV1ZV0gPT0gTk9UX1RSQU5TTUlUSU5HKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdHAtPnR4X3F1ZXVlX3N0YXR1c1txdWV1ZV0gPSBUUkFOU01JVElORzsKKyAgICAgICAgICAgICAgICBlcnIgPSBzbWN0cl9pc3N1ZV9yZXN1bWVfdHhfZmNiX2NtZChkZXYsIHF1ZXVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIF9fdTE2IHNtY3RyX3R4X2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHF1ZXVlKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIF9fdTE2IHN0YXR1cywgZXJyID0gMDsKKyAgICAgICAgaW50IGNzdGF0dXM7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3R4X2NvbXBsZXRlXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHdoaWxlKChzdGF0dXMgPSB0cC0+dHhfZmNiX2VuZFtxdWV1ZV0tPmZyYW1lX3N0YXR1cykgIT0gU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHN0YXR1cyAmIDB4N2UwMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gSEFSRFdBUkVfRkFJTEVEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3VwZGF0ZV90eF9jaGFpbihkZXYsIHRwLT50eF9mY2JfZW5kW3F1ZXVlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlKSkgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworCisgICAgICAgICAgICAgICAgaWYodHAtPm1vZGVfYml0cyAmIFVNQUMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShzdGF0dXMgJiAoRkNCX1RYX1NUQVRVU19BUjEgfCBGQ0JfVFhfU1RBVFVTX0FSMikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RhdHVzID0gTk9fU1VDSF9ERVNUSU5BVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShzdGF0dXMgJiAoRkNCX1RYX1NUQVRVU19DUjEgfCBGQ0JfVFhfU1RBVFVTX0NSMikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdGF0dXMgPSBERVNUX09VVF9PRl9SRVNPVVJDRVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cyAmIEZDQl9UWF9TVEFUVVNfRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdGF0dXMgPSBNQVhfQ09MTElTSU9OUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RhdHVzID0gU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjc3RhdHVzID0gU1VDQ0VTUzsKKworICAgICAgICAgICAgICAgIGlmKHF1ZXVlID09IEJVR19RVUVVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IFNVQ0NFU1M7CisKKyAgICAgICAgICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgICAgICAgICBpZihlcnIgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc21jdHJfdHhfbW92ZV9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3U4ICpwYnVmZiwgdW5zaWduZWQgaW50IGJ5dGVzKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCByYW1fdXNhYmxlOworICAgICAgICBfX3UzMiBmbGVuLCBsZW4sIG9mZnNldCA9IDA7CisgICAgICAgIF9fdTggKmZyYWcsICpwYWdlOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl90eF9tb3ZlX2ZyYW1lXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHJhbV91c2FibGUgPSAoKHVuc2lnbmVkIGludCl0cC0+cmFtX3VzYWJsZSkgPDwgMTA7CisgICAgICAgIGZyYWcgICAgICAgPSBza2ItPmRhdGE7CisgICAgICAgIGZsZW4gICAgICAgPSBza2ItPmxlbjsKKworICAgICAgICB3aGlsZShmbGVuID4gMCAmJiBieXRlcyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIHBidWZmKTsKKworICAgICAgICAgICAgICAgIG9mZnNldCA9IFNNQ19QQUdFX09GRlNFVChwYnVmZik7CisKKyAgICAgICAgICAgICAgICBpZihvZmZzZXQgKyBmbGVuID4gcmFtX3VzYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHJhbV91c2FibGUgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gZmxlbjsKKworICAgICAgICAgICAgICAgIGlmKGxlbiA+IGJ5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYnl0ZXM7CisKKyAgICAgICAgICAgICAgICBwYWdlID0gKGNoYXIgKikgKG9mZnNldCArIHRwLT5yYW1fYWNjZXNzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocGFnZSwgZnJhZywgbGVuKTsKKworICAgICAgICAgICAgICAgIGZsZW4gLT1sZW47CisgICAgICAgICAgICAgICAgYnl0ZXMgLT0gbGVuOworICAgICAgICAgICAgICAgIGZyYWcgKz0gbGVuOworICAgICAgICAgICAgICAgIHBidWZmICs9IGxlbjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKKy8qIFVwZGF0ZSB0aGUgZXJyb3Igc3RhdGlzdGljIGNvdW50ZXJzIGZvciB0aGlzIGFkYXB0ZXIuICovCitzdGF0aWMgaW50IHNtY3RyX3VwZGF0ZV9lcnJfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBzdHJ1Y3QgdHJfc3RhdGlzdGljcyAqdHN0YXQgPSAmdHAtPk1hY1N0YXQ7CisKKyAgICAgICAgaWYodHN0YXQtPmludGVybmFsX2Vycm9ycykKKyAgICAgICAgICAgICAgICB0c3RhdC0+aW50ZXJuYWxfZXJyb3JzCisgICAgICAgICAgICAgICAgICAgICAgICArPSAqKHRwLT5taXNjX2NvbW1hbmRfZGF0YSArIDApICYgMHgwMGZmOworCisgICAgICAgIGlmKHRzdGF0LT5saW5lX2Vycm9ycykKKyAgICAgICAgICAgICAgICB0c3RhdC0+bGluZV9lcnJvcnMgKz0gKih0cC0+bWlzY19jb21tYW5kX2RhdGEgKyAwKSA+PiA4OworCisgICAgICAgIGlmKHRzdGF0LT5BX0NfZXJyb3JzKQorICAgICAgICAgICAgICAgIHRzdGF0LT5BX0NfZXJyb3JzICs9ICoodHAtPm1pc2NfY29tbWFuZF9kYXRhICsgMSkgJiAweDAwZmY7CisKKyAgICAgICAgaWYodHN0YXQtPmJ1cnN0X2Vycm9ycykKKyAgICAgICAgICAgICAgICB0c3RhdC0+YnVyc3RfZXJyb3JzICs9ICoodHAtPm1pc2NfY29tbWFuZF9kYXRhICsgMSkgPj4gODsKKworICAgICAgICBpZih0c3RhdC0+YWJvcnRfZGVsaW1pdGVycykKKyAgICAgICAgICAgICAgICB0c3RhdC0+YWJvcnRfZGVsaW1pdGVycyArPSAqKHRwLT5taXNjX2NvbW1hbmRfZGF0YSArIDIpID4+IDg7CisKKyAgICAgICAgaWYodHN0YXQtPnJlY3ZfY29uZ2VzdF9jb3VudCkKKyAgICAgICAgICAgICAgICB0c3RhdC0+cmVjdl9jb25nZXN0X2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICArPSAqKHRwLT5taXNjX2NvbW1hbmRfZGF0YSArIDMpICYgMHgwMGZmOworCisgICAgICAgIGlmKHRzdGF0LT5sb3N0X2ZyYW1lcykKKyAgICAgICAgICAgICAgICB0c3RhdC0+bG9zdF9mcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICs9ICoodHAtPm1pc2NfY29tbWFuZF9kYXRhICsgMykgPj4gODsKKworICAgICAgICBpZih0c3RhdC0+ZnJlcXVlbmN5X2Vycm9ycykKKyAgICAgICAgICAgICAgICB0c3RhdC0+ZnJlcXVlbmN5X2Vycm9ycyArPSAqKHRwLT5taXNjX2NvbW1hbmRfZGF0YSArIDQpICYgMHgwMGZmOworCisgICAgICAgIGlmKHRzdGF0LT5mcmFtZV9jb3BpZWRfZXJyb3JzKQorICAgICAgICAgICAgICAgICB0c3RhdC0+ZnJhbWVfY29waWVkX2Vycm9ycworICAgICAgICAgICAgICAgICAgICAgICAgKz0gKih0cC0+bWlzY19jb21tYW5kX2RhdGEgKyA0KSA+PiA4OworCisgICAgICAgIGlmKHRzdGF0LT50b2tlbl9lcnJvcnMpCisgICAgICAgICAgICAgICAgdHN0YXQtPnRva2VuX2Vycm9ycyArPSAqKHRwLT5taXNjX2NvbW1hbmRfZGF0YSArIDUpID4+IDg7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl91cGRhdGVfcnhfY2hhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgRkNCbG9jayAqZmNiOworICAgICAgICBCREJsb2NrICpiZGI7CisgICAgICAgIF9fdTE2IHNpemUsIGxlbjsKKworICAgICAgICBmY2IgPSB0cC0+cnhfZmNiX2N1cnJbcXVldWVdOworICAgICAgICBsZW4gPSBmY2ItPmZyYW1lX2xlbmd0aDsKKworICAgICAgICBmY2ItPmZyYW1lX3N0YXR1cyA9IDA7CisgICAgICAgIGZjYi0+aW5mbyA9IEZDQl9DSEFJTl9FTkQ7CisgICAgICAgIGZjYi0+YmFja19wdHItPmluZm8gPSBGQ0JfV0FSTklORzsKKworICAgICAgICB0cC0+cnhfZmNiX2N1cnJbcXVldWVdID0gdHAtPnJ4X2ZjYl9jdXJyW3F1ZXVlXS0+bmV4dF9wdHI7CisKKyAgICAgICAgLyogdXBkYXRlIFJYIEJEQnMgKi8KKyAgICAgICAgc2l6ZSA9IChsZW4gPj4gUlhfQkRCX1NJWkVfU0hJRlQpOworICAgICAgICBpZihsZW4gJiBSWF9EQVRBX0JVRkZFUl9TSVpFX01BU0spCisgICAgICAgICAgICAgICAgc2l6ZSArPSBzaXplb2YoQkRCbG9jayk7CisgICAgICAgIHNpemUgJj0gKH5SWF9CREJfU0laRV9NQVNLKTsKKworICAgICAgICAvKiBjaGVjayBpZiB3cmFwIGFyb3VuZCAqLworICAgICAgICBiZGIgPSAoQkRCbG9jayAqKSgoX191MzIpKHRwLT5yeF9iZGJfY3VycltxdWV1ZV0pICsgKF9fdTMyKShzaXplKSk7CisgICAgICAgIGlmKChfX3UzMiliZGIgPj0gKF9fdTMyKXRwLT5yeF9iZGJfZW5kW3F1ZXVlXSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGJkYiA9IChCREJsb2NrICopKChfX3UzMikodHAtPnJ4X2JkYl9oZWFkW3F1ZXVlXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKF9fdTMyKShiZGIpIC0gKF9fdTMyKSh0cC0+cnhfYmRiX2VuZFtxdWV1ZV0pKTsKKyAgICAgICAgfQorCisgICAgICAgIGJkYi0+YmFja19wdHItPmluZm8gPSBCREJfQ0hBSU5fRU5EOworICAgICAgICB0cC0+cnhfYmRiX2N1cnJbcXVldWVdLT5iYWNrX3B0ci0+aW5mbyA9IEJEQl9OT1RfQ0hBSU5fRU5EOworICAgICAgICB0cC0+cnhfYmRiX2N1cnJbcXVldWVdID0gYmRiOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfdXBkYXRlX3R4X2NoYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIEZDQmxvY2sgKmZjYiwKKyAgICAgICAgX191MTYgcXVldWUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDIwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJzbWN0cl91cGRhdGVfdHhfY2hhaW5cbiIpOworCisgICAgICAgIGlmKHRwLT5udW1fdHhfZmNic191c2VkW3F1ZXVlXSA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAoSEFSRFdBUkVfRkFJTEVEKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodHAtPnR4X2J1ZmZfdXNlZFtxdWV1ZV0gPCBmY2ItPm1lbW9yeV9hbGxvYykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHhfYnVmZl91c2VkW3F1ZXVlXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEhBUkRXQVJFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHAtPnR4X2J1ZmZfdXNlZFtxdWV1ZV0gLT0gZmNiLT5tZW1vcnlfYWxsb2M7CisKKyAgICAgICAgICAgICAgICAvKiBpZiBhbGwgdHJhbnNtaXQgYnVmZmVyIGFyZSBjbGVhcmVkCisgICAgICAgICAgICAgICAgICogbmVlZCB0byBzZXQgdGhlIHR4X2J1ZmZfY3VycltdIHRvIHR4X2J1ZmZfaGVhZFtdCisgICAgICAgICAgICAgICAgICogb3RoZXJ3aXNlLCB0eCBidWZmZXIgd2lsbCBiZSBzZWdyZWdhdGUgYW5kIGNhbm5vdAorICAgICAgICAgICAgICAgICAqIGFjY29tbW9kYXRlIGFuZCBidWZmZXIgZ3JlYXRlciB0aGFuIChjdXJyIC0gaGVhZCkgYW5kCisgICAgICAgICAgICAgICAgICogKGVuZCAtIGN1cnIpIHNpbmNlIHdlIGRvIG5vdCBhbGxvdyB3cmFwIGFyb3VuZCBhbGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKHRwLT50eF9idWZmX3VzZWRbcXVldWVdID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHhfYnVmZl9jdXJyW3F1ZXVlXSA9IHRwLT50eF9idWZmX2hlYWRbcXVldWVdOworCisgICAgICAgICAgICAgICAgdHAtPm51bV90eF9mY2JzX3VzZWRbcXVldWVdLS07CisgICAgICAgICAgICAgICAgZmNiLT5mcmFtZV9zdGF0dXMgPSAwOworICAgICAgICAgICAgICAgIHRwLT50eF9mY2JfZW5kW3F1ZXVlXSA9IGZjYi0+bmV4dF9wdHI7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfd2FpdF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgbG9vcF9jb3VudCA9IDB4MjAwMDA7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3dhaXRfY21kXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHdoaWxlKGxvb3BfY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih0cC0+YWNiX2hlYWQtPmNtZF9kb25lX3N0YXR1cyAmIEFDQl9DT01NQU5EX0RPTkUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJdWRlbGF5KDEpOworICAgICAgICAgICAgICAgIGxvb3BfY291bnQtLTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGxvb3BfY291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFSRFdBUkVfRkFJTEVEKTsKKworICAgICAgICBpZih0cC0+YWNiX2hlYWQtPmNtZF9kb25lX3N0YXR1cyAmIDB4ZmYpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBUkRXQVJFX0ZBSUxFRCk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl93YWl0X3doaWxlX2NidXN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IHRpbWVvdXQgPSAweDIwMDAwOworICAgICAgICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgICAgIF9fdTggcjsKKworICAgICAgICBpZih0cC0+YmljX3R5cGUgPT0gQklDXzU4NV9DSElQKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUodGltZW91dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByID0gaW5iKGlvYWRkciArIEhXUik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZigociAmIEhXUl9DQlVTWSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlKHRpbWVvdXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgciA9IGluYihpb2FkZHIgKyBDU1IpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHIgJiBDU1JfQ0JVU1kpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKHRpbWVvdXQpCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoSEFSRFdBUkVfRkFJTEVEKTsKK30KKworI2lmZGVmIE1PRFVMRQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UqIGRldl9zbWN0cltTTUNUUl9NQVhfQURBUFRFUlNdOworc3RhdGljIGludCBpb1tTTUNUUl9NQVhfQURBUFRFUlNdOworc3RhdGljIGludCBpcnFbU01DVFJfTUFYX0FEQVBURVJTXTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKHJpbmdzcGVlZCwgaW50LCAwKTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpzZXR1cF9jYXJkKGludCBuKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY190cmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCWludCBlcnI7CisJCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZGV2LT5pcnEgPSBpcnFbbl07CisJZXJyID0gc21jdHJfcHJvYmUxKGRldiwgaW9bbl0pOworCWlmIChlcnIpIAorCQlnb3RvIG91dDsKKwkJCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7Cisgb3V0MToKKyNpZmRlZiBDT05GSUdfTUNBX0xFR0FDWQorCXsgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCSAgaWYgKHRwLT5zbG90X251bSkKKwkJbWNhX21hcmtfYXNfdW51c2VkKHRwLT5zbG90X251bSk7CisJfQorI2VuZGlmCisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNNQ1RSX0lPX0VYVEVOVCk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCQkJCisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworICAgICAgICBpbnQgaSwgZm91bmQgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgU01DVFJfTUFYX0FEQVBURVJTOyBpKyspIHsKKwkJZGV2ID0gaW9bMF0/IHNldHVwX2NhcmQoaSkgOiBzbWN0cl9wcm9iZSgtMSk7CisJCWlmICghSVNfRVJSKGRldikpIHsKKwkJCSsrZm91bmQ7CisJCQlkZXZfc21jdHJbaV0gPSBkZXY7CisJCX0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmb3VuZCA/IDAgOiAtRU5PREVWOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IFNNQ1RSX01BWF9BREFQVEVSUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfc21jdHJbaV07CisKKwkJaWYgKGRldikgeworCisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworI2lmZGVmIENPTkZJR19NQ0FfTEVHQUNZCisJCQl7IHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJCWlmICh0cC0+c2xvdF9udW0pCisJCQkJbWNhX21hcmtfYXNfdW51c2VkKHRwLT5zbG90X251bSk7CisJCQl9CisjZW5kaWYKKwkJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTTUNUUl9JT19FWFRFTlQpOworCQkJaWYgKGRldi0+aXJxKQorCQkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisgICAgICAgIH0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0ci5oIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwNmM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0ci5oCkBAIC0wLDAgKzEsMTU4OCBAQAorLyogc21jdHIuaDogU01DIFRva2VuIFJpbmcgZHJpdmVyIGhlYWRlciBmb3IgTGludXgKKyAqCisgKiBBdXRob3JzOgorICogIC0gSmF5IFNjaHVsaXN0IDxqc2NobHN0QHNhbWJhLm9yZz4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfU01DVFJfSAorI2RlZmluZSBfX0xJTlVYX1NNQ1RSX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNQVhfVFhfUVVFVUUgMTAKKworI2RlZmluZSBTTUNfSEVBREVSX1NJWkUgMTQKKworI2RlZmluZSBTTUNfUEFHRV9PRkZTRVQoWCkgICAgICAgICAgKCgodW5zaWduZWQgbG9uZykoWCkgLSB0cC0+cmFtX2FjY2VzcykgJiB0cC0+cGFnZV9vZmZzZXRfbWFzaykKKworI2RlZmluZSBJTklUICAgICAgICAgICAgMHgwRAorI2RlZmluZSBSUV9BVFRDSCAgICAgICAgMHgxMAorI2RlZmluZSBSUV9TVEFURSAgICAgICAgMHgwRgorI2RlZmluZSBSUV9BRERSICAgICAgICAgMHgwRQorI2RlZmluZSBDSEdfUEFSTSAgICAgICAgMHgwQworI2RlZmluZSBSU1AgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBUWF9GT1JXQVJEICAgICAgMHgwOQorCisjZGVmaW5lIEFDX0ZDX0RBVAkoKDM8PDEzKSB8IDEpCisjZGVmaW5lICAgICAgREFUICAgICAgICAgICAgIDB4MDcKKworI2RlZmluZSBSUFRfTkVXX01PTiAgICAgMHgyNQorI2RlZmluZSBSUFRfU1VBX0NIRyAgICAgMHgyNgorI2RlZmluZSBSUFRfQUNUSVZFX0VSUiAgMHgyOAorI2RlZmluZSBSUFRfTk5fSU5DTVAgICAgMHgyNworI2RlZmluZSBSUFRfRVJST1IgICAgICAgMHgyOQorCisjZGVmaW5lIFJRX0lOSVQgICAgICAgICAweDIwCisjZGVmaW5lIFJQVF9BVFRDSCAgICAgICAweDI0CisjZGVmaW5lIFJQVF9TVEFURSAgICAgICAweDIzCisjZGVmaW5lIFJQVF9BRERSICAgICAgICAweDIyCisKKyNkZWZpbmUgUE9TSVRJVkVfQUNLICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgQV9GUkFNRV9XQVNfRk9SV0FSREVEICAgICAgICAgICAweDg4ODgKKworI2RlZmluZSAgICAgIEdST1VQX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgyQgorI2RlZmluZSAgICAgIFBIWVNJQ0FMX0RST1AgICAgICAgICAgICAgICAgICAgMHgwQgorI2RlZmluZSAgICAgIEFVVEhPUklaRURfQUNDRVNTX1BSSU9SSVRZICAgICAgMHgwNworI2RlZmluZSAgICAgIEFVVEhPUklaRURfRlVOQ1RJT05fQ0xBU1MgICAgICAgMHgwNgorI2RlZmluZSAgICAgIEZVTkNUSU9OQUxfQUREUkVTUyAgICAgICAgICAgICAgMHgyQworI2RlZmluZSAgICAgIFJJTkdfU1RBVElPTl9TVEFUVVMgICAgICAgICAgICAgMHgyOQorI2RlZmluZSAgICAgIFRSQU5TTUlUX1NUQVRVU19DT0RFICAgICAgICAgICAgMHgyQQorI2RlZmluZSAgICAgIElCTV9QQVNTX1NPVVJDRV9BRERSICAgIDB4MDEKKyNkZWZpbmUgICAgICBBQ19GQ19SUFRfVFhfRk9SV0FSRCAgICAgICAgICAgICgoMDw8MTMpIHwgMCkKKyNkZWZpbmUgICAgICBBQ19GQ19SUFRfU1RBVEUgICAgICAgICAgICAgICAgICgoMDw8MTMpIHwgMCkKKyNkZWZpbmUgICAgICBBQ19GQ19SUFRfQUREUiAgICAgICAgICAgICAgICAgICgoMDw8MTMpIHwgMCkKKyNkZWZpbmUgICAgICBDT1JSRUxBVE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDkKKworI2RlZmluZSBQT1NJVElWRV9BQ0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX01BQ19EQVRBX0lOQ09NUExFVEUgICAgICAgICAgIDB4ODAwMSAgICAgICAgICAvKiBub3QgdXNlZCAgICAqLworI2RlZmluZSBFX1ZFQ1RPUl9MRU5HVEhfRVJST1IgICAgICAgICAgIDB4ODAwMiAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX1VOUkVDT0dOSVpFRF9WRUNUT1JfSUQgICAgICAgIDB4ODAwMyAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX0lOQVBQUk9QUklBVEVfU09VUkNFX0NMQVNTICAgIDB4ODAwNCAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX1NVQl9WRUNUT1JfTEVOR1RIX0VSUk9SICAgICAgIDB4ODAwNSAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX1RSQU5TTUlUX0ZPUldBUkRfSU5WQUxJRCAgICAgIDB4ODAwNiAgICAgICAgICAvKiBkZWYuIGJ5IElCTSAqLworI2RlZmluZSBFX01JU1NJTkdfU1VCX1ZFQ1RPUiAgICAgICAgICAgIDB4ODAwNyAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX1NVQl9WRUNUT1JfVU5LTk9XTiAgICAgICAgICAgIDB4ODAwOCAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX01BQ19IRUFERVJfVE9PX0xPTkcgICAgICAgICAgIDB4ODAwOSAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX0ZVTkNUSU9OX0RJU0FCTEVEICAgICAgICAgICAgIDB4ODAwQSAgICAgICAgICAvKiBub3QgdXNlZCAgICAqLworCisjZGVmaW5lIEFfRlJBTUVfV0FTX0ZPUldBUkRFRCAgICAgICAgICAgMHg4ODg4ICAgICAgICAgIC8qIHVzZWQgYnkgc2VuZF9UWF9GT1JXQVJEICovCisKKyNkZWZpbmUgVVBTVFJFQU1fTkVJR0hCT1JfQUREUkVTUyAgICAgICAweDAyCisjZGVmaW5lIExPQ0FMX1JJTkdfTlVNQkVSICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBBU1NJR05fUEhZU0lDQUxfRFJPUCAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRVJST1JfVElNRVJfVkFMVUUgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEFVVEhPUklaRURfRlVOQ1RJT05fQ0xBU1MgICAgICAgMHgwNgorI2RlZmluZSBBVVRIT1JJWkVEX0FDQ0VTU19QUklPUklUWSAgICAgIDB4MDcKKyNkZWZpbmUgQ09SUkVMQVRPUiAgICAgICAgICAgICAgICAgICAgICAweDA5CisjZGVmaW5lIFBIWVNJQ0FMX0RST1AgICAgICAgICAgICAgICAgICAgMHgwQgorI2RlZmluZSBSRVNQT05TRV9DT0RFICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQUREUkVTU19NT0RJRkVSICAgICAgICAgICAgICAgICAweDIxCisjZGVmaW5lIFBST0RVQ1RfSU5TVEFOQ0VfSUQgICAgICAgICAgICAgMHgyMgorI2RlZmluZSBSSU5HX1NUQVRJT05fVkVSU0lPTl9OVU1CRVIgICAgIDB4MjMKKyNkZWZpbmUgV1JBUF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAweDI2CisjZGVmaW5lIEZSQU1FX0ZPUldBUkQgICAgICAgICAgICAgICAgICAgMHgyNworI2RlZmluZSBTVEFUSU9OX0lERU5USUZFUiAgICAgICAgICAgICAgIDB4MjgKKyNkZWZpbmUgUklOR19TVEFUSU9OX1NUQVRVUyAgICAgICAgICAgICAweDI5CisjZGVmaW5lIFRSQU5TTUlUX1NUQVRVU19DT0RFICAgICAgICAgICAgMHgyQQorI2RlZmluZSBHUk9VUF9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4MkIKKyNkZWZpbmUgRlVOQ1RJT05BTF9BRERSRVNTICAgICAgICAgICAgICAweDJDCisKKyNkZWZpbmUgRl9OT19TVUJfVkVDVE9SU19GT1VORCAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBGX1VQU1RSRUFNX05FSUdIQk9SX0FERFJFU1MgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEZfTE9DQUxfUklOR19OVU1CRVIgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgRl9BU1NJR05fUEhZU0lDQUxfRFJPUCAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBGX0VSUk9SX1RJTUVSX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEZfQVVUSE9SSVpFRF9GVU5DVElPTl9DTEFTUyAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgRl9BVVRIT1JJWkVEX0FDQ0VTU19QUklPUklUWSAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBGX0NPUlJFTEFUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEZfUEhZU0lDQUxfRFJPUCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgRl9SRVNQT05TRV9DT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBGX1BST0RVQ1RfSU5TVEFOQ0VfSUQgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIEZfUklOR19TVEFUSU9OX1ZFUlNJT05fTlVNQkVSICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgRl9TVEFUSU9OX0lERU5USUZFUiAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBGX1JJTkdfU1RBVElPTl9TVEFUVVMgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEZfR1JPVVBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgRl9GVU5DVElPTkFMX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBGX0ZSQU1FX0ZPUldBUkQgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisKKyNkZWZpbmUgUl9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUl9SUV9BVFRDSF9TVEFURV9BRERSICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUl9DSEdfUEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUl9UWF9GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZfRlJBTUVfRk9SV0FSRAorCisKKyNkZWZpbmUgICAgICBVUFNUUkVBTV9ORUlHSEJPUl9BRERSRVNTICAgICAgIDB4MDIKKyNkZWZpbmUgICAgICBBRERSRVNTX01PRElGRVIgICAgICAgICAgICAgICAgIDB4MjEKKyNkZWZpbmUgICAgICBSSU5HX1NUQVRJT05fVkVSU0lPTl9OVU1CRVIgICAgIDB4MjMKKyNkZWZpbmUgICAgICBQUk9EVUNUX0lOU1RBTkNFX0lEICAgICAgICAgICAgIDB4MjIKKworI2RlZmluZSAgICAgIFJQVF9UWF9GT1JXQVJEICAweDJBCisKKyNkZWZpbmUgQUNfRkNfSU5JVCAgICAgICAgICAgICAgICAgICAgICAoMzw8MTMpIHwgMCAvKiAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFDX0ZDX1JRX0lOSVQgICAgICAgICAgICAgICAgICAgKCgzPDwxMykgfCAwKSAvKiAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFDX0ZDX1JRX0FUVENIICAgICAgICAgICAgICAgICAgKDM8PDEzKSB8IDAgLyogREMgPSBTQyBvZiByeCBmcmFtZSAqLworI2RlZmluZSBBQ19GQ19SUV9TVEFURSAgICAgICAgICAgICAgICAgICgzPDwxMykgfCAwIC8qIERDID0gU0Mgb2YgcnggZnJhbWUgKi8KKyNkZWZpbmUgQUNfRkNfUlFfQUREUiAgICAgICAgICAgICAgICAgICAoMzw8MTMpIHwgMCAvKiBEQyA9IFNDIG9mIHJ4IGZyYW1lICovCisjZGVmaW5lIEFDX0ZDX0NIR19QQVJNICAgICAgICAgICAgICAgICAgKDM8PDEzKSB8IDAgLyogICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBQ19GQ19SU1AgICAgICAgICAgICAgICAgICAgICAgICgwPDwxMykgfCAwIC8qIERDID0gU0Mgb2YgcnggZnJhbWUgKi8KKyNkZWZpbmUgQUNfRkNfUlBUX0FUVENIICAgICAgICAgICAgICAgICAoMDw8MTMpIHwgMAorCisjZGVmaW5lIFNfVVBTVFJFQU1fTkVJR0hCT1JfQUREUkVTUyAgICAgICAgICAgICAgIDYgKyAyCisjZGVmaW5lIFNfTE9DQUxfUklOR19OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgIDIgKyAyCisjZGVmaW5lIFNfQVNTSUdOX1BIWVNJQ0FMX0RST1AgICAgICAgICAgICAgICAgICAgIDQgKyAyCisjZGVmaW5lIFNfRVJST1JfVElNRVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgIDIgKyAyCisjZGVmaW5lIFNfQVVUSE9SSVpFRF9GVU5DVElPTl9DTEFTUyAgICAgICAgICAgICAgIDIgKyAyCisjZGVmaW5lIFNfQVVUSE9SSVpFRF9BQ0NFU1NfUFJJT1JJVFkgICAgICAgICAgICAgIDIgKyAyCisjZGVmaW5lIFNfQ09SUkVMQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKyAyCisjZGVmaW5lIFNfUEhZU0lDQUxfRFJPUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyAyCisjZGVmaW5lIFNfUkVTUE9OU0VfQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyAyCisjZGVmaW5lIFNfQUREUkVTU19NT0RJRkVSICAgICAgICAgICAgICAgICAgICAgICAgIDIgKyAyCisjZGVmaW5lIFNfUFJPRFVDVF9JTlNUQU5DRV9JRCAgICAgICAgICAgICAgICAgICAgMTggKyAyCisjZGVmaW5lIFNfUklOR19TVEFUSU9OX1ZFUlNJT05fTlVNQkVSICAgICAgICAgICAgMTAgKyAyCisjZGVmaW5lIFNfU1RBVElPTl9JREVOVElGRVIgICAgICAgICAgICAgICAgICAgICAgIDYgKyAyCisjZGVmaW5lIFNfUklOR19TVEFUSU9OX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIDYgKyAyCisjZGVmaW5lIFNfR1JPVVBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyAyCisjZGVmaW5lIFNfRlVOQ1RJT05BTF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgIDQgKyAyCisjZGVmaW5lIFNfRlJBTUVfRk9SV0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAyNTIgKyAyCisjZGVmaW5lIFNfVFJBTlNNSVRfU1RBVFVTX0NPREUgICAgICAgICAgICAgICAgICAgIDIgKyAyCisKKyNkZWZpbmUgSVNCX0lNQ19SRVMwICAgICAgICAgICAgICAgICAgICAweDAwMDAgIC8qICovCisjZGVmaW5lIElTQl9JTUNfTUFDX1RZUEVfMyAgICAgICAgICAgICAgMHgwMDAxICAvKiBNQUNfQVJDX0lORElDQVRFICovCisjZGVmaW5lIElTQl9JTUNfTUFDX0VSUk9SX0NPVU5URVJTICAgICAgMHgwMDAyICAvKiAqLworI2RlZmluZSBJU0JfSU1DX1JFUzEgICAgICAgICAgICAgICAgICAgIDB4MDAwMyAgLyogKi8KKyNkZWZpbmUgSVNCX0lNQ19NQUNfVFlQRV8yICAgICAgICAgICAgICAweDAwMDQgIC8qIFFVRV9NQUNfSU5ESUNBVEUgKi8KKyNkZWZpbmUgSVNCX0lNQ19UWF9GUkFNRSAgICAgICAgICAgICAgICAweDAwMDUgIC8qICovCisjZGVmaW5lIElTQl9JTUNfRU5EX09GX1RYX1FVRVVFICAgICAgICAgMHgwMDA2ICAvKiAqLworI2RlZmluZSBJU0JfSU1DX05PTl9NQUNfUlhfUkVTT1VSQ0UgICAgIDB4MDAwNyAgLyogKi8KKyNkZWZpbmUgSVNCX0lNQ19NQUNfUlhfUkVTT1VSQ0UgICAgICAgICAweDAwMDggIC8qICovCisjZGVmaW5lIElTQl9JTUNfTk9OX01BQ19SWF9GUkFNRSAgICAgICAgMHgwMDA5ICAvKiAqLworI2RlZmluZSBJU0JfSU1DX01BQ19SWF9GUkFNRSAgICAgICAgICAgIDB4MDAwQSAgLyogKi8KKyNkZWZpbmUgSVNCX0lNQ19UUkNfRklGT19TVEFUVVMgICAgICAgICAweDAwMEIgIC8qICovCisjZGVmaW5lIElTQl9JTUNfQ09NTUFORF9TVEFUVVMgICAgICAgICAgMHgwMDBDICAvKiAqLworI2RlZmluZSBJU0JfSU1DX01BQ19UWVBFXzEgICAgICAgICAgICAgIDB4MDAwRCAgLyogU2VsZiBSZW1vdmVkICovCisjZGVmaW5lIElTQl9JTUNfVFJDX0lOVFJOTF9UU1RfU1RBVFVTICAgMHgwMDBFICAvKiAqLworI2RlZmluZSBJU0JfSU1DX1JFUzIgICAgICAgICAgICAgICAgICAgIDB4MDAwRiAgLyogKi8KKworI2RlZmluZSBOT05fTUFDX1JYX1JFU09VUkNFX0JXICAgICAgICAgIDB4MTAgICAgLyogc2hpZnRlZCByaWdodCA4IGJpdHMgKi8KKyNkZWZpbmUgTk9OX01BQ19SWF9SRVNPVVJDRV9GVyAgICAgICAgICAweDIwICAgIC8qIHNoaWZ0ZWQgcmlnaHQgOCBiaXRzICovCisjZGVmaW5lIE5PTl9NQUNfUlhfUkVTT1VSQ0VfQkUgICAgICAgICAgMHg0MCAgICAvKiBzaGlmdGVkIHJpZ2h0IDggYml0cyAqLworI2RlZmluZSBOT05fTUFDX1JYX1JFU09VUkNFX0ZFICAgICAgICAgIDB4ODAgICAgLyogc2hpZnRlZCByaWdodCA4IGJpdHMgKi8KKyNkZWZpbmUgUkFXX05PTl9NQUNfUlhfUkVTT1VSQ0VfQlcgICAgICAweDEwMDAgIC8qICovCisjZGVmaW5lIFJBV19OT05fTUFDX1JYX1JFU09VUkNFX0ZXICAgICAgMHgyMDAwICAvKiAqLworI2RlZmluZSBSQVdfTk9OX01BQ19SWF9SRVNPVVJDRV9CRSAgICAgIDB4NDAwMCAgLyogKi8KKyNkZWZpbmUgUkFXX05PTl9NQUNfUlhfUkVTT1VSQ0VfRkUgICAgICAweDgwMDAgIC8qICovCisKKyNkZWZpbmUgTUFDX1JYX1JFU09VUkNFX0JXICAgICAgICAgICAgICAweDEwICAgIC8qIHNoaWZ0ZWQgcmlnaHQgOCBiaXRzICovCisjZGVmaW5lIE1BQ19SWF9SRVNPVVJDRV9GVyAgICAgICAgICAgICAgMHgyMCAgICAvKiBzaGlmdGVkIHJpZ2h0IDggYml0cyAqLworI2RlZmluZSBNQUNfUlhfUkVTT1VSQ0VfQkUgICAgICAgICAgICAgIDB4NDAgICAgLyogc2hpZnRlZCByaWdodCA4IGJpdHMgKi8KKyNkZWZpbmUgTUFDX1JYX1JFU09VUkNFX0ZFICAgICAgICAgICAgICAweDgwICAgIC8qIHNoaWZ0ZWQgcmlnaHQgOCBiaXRzICovCisjZGVmaW5lIFJBV19NQUNfUlhfUkVTT1VSQ0VfQlcgICAgICAgICAgMHgxMDAwICAvKiAqLworI2RlZmluZSBSQVdfTUFDX1JYX1JFU09VUkNFX0ZXICAgICAgICAgIDB4MjAwMCAgLyogKi8KKyNkZWZpbmUgUkFXX01BQ19SWF9SRVNPVVJDRV9CRSAgICAgICAgICAweDQwMDAgIC8qICovCisjZGVmaW5lIFJBV19NQUNfUlhfUkVTT1VSQ0VfRkUgICAgICAgICAgMHg4MDAwICAvKiAqLworCisjZGVmaW5lIFRSQ19GSUZPX1NUQVRVU19UWF9VTkRFUlJVTiAgICAgMHg0MCAgICAvKiBzaGlmdGVkIHJpZ2h0IDggYml0cyAqLworI2RlZmluZSBUUkNfRklGT19TVEFUVVNfUlhfT1ZFUlJVTiAgICAgIDB4ODAgICAgLyogc2hpZnRlZCByaWdodCA4IGJpdHMgKi8KKyNkZWZpbmUgUkFXX1RSQ19GSUZPX1NUQVRVU19UWF9VTkRFUlJVTiAweDQwMDAgIC8qICovCisjZGVmaW5lIFJBV19UUkNfRklGT19TVEFUVVNfUlhfT1ZFUlJVTiAgMHg4MDAwICAvKiAqLworCisjZGVmaW5lICAgICAgIENTUl9DTFJUSU5UICAgICAgICAgICAgIDB4MDgKKworI2RlZmluZSBNU0IoWCkgICAgICAgICAgICAgICAgICAoKF9fdTgpKChfX3UxNikgWCA+PiA4KSkKKyNkZWZpbmUgTFNCKFgpICAgICAgICAgICAgICAgICAgKChfX3U4KSgoX191MTYpIFggJiAgMHhmZikpCisKKyNkZWZpbmUgQUNfRkNfTE9CRV9NRURJQV9URVNUICAgICAgICAgICAoKDM8PDEzKSB8IDApCisjZGVmaW5lIFNfV1JBUF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDggKyAyIC8qIDUwMCArIDIgKi8KKyNkZWZpbmUgICAgICBXUkFQX0RBVEEgICAgICAgICAgICAgICAgICAgICAgIDB4MjYKKyNkZWZpbmUgTE9CRV9NRURJQV9URVNUIDB4MDgKKworLyogRGVzdGluYXRpb24gQ2xhc3MgKGRjKSAqLworCisjZGVmaW5lIERDX01BU0sgICAgICAgICAweEYwCisjZGVmaW5lIERDX1JTICAgICAgICAgICAweDAwCisjZGVmaW5lIERDX0NSUyAgICAgICAgICAweDQwCisjZGVmaW5lIERDX1JQUyAgICAgICAgICAweDUwCisjZGVmaW5lIERDX1JFTSAgICAgICAgICAweDYwCisKKy8qIFNvdXJjZSBDbGFzc2VzIChzYykgKi8KKworI2RlZmluZSBTQ19NQVNLICAgICAgICAgMHgwRgorI2RlZmluZSBTQ19SUyAgICAgICAgICAgMHgwMAorI2RlZmluZSBTQ19DUlMgICAgICAgICAgMHgwNAorI2RlZmluZSBTQ19SUFMgICAgICAgICAgMHgwNQorI2RlZmluZSBTQ19SRU0gICAgICAgICAgMHgwNgorCisjZGVmaW5lIFBSCQkweDExCisjZGVmaW5lIFBSX1BBR0VfTUFTSwkweDBDMDAwCisKKyNkZWZpbmUgTUlDUk9DSEFOTkVMCTB4MDAwOAorI2RlZmluZSBJTlRFUkZBQ0VfQ0hJUAkweDAwMTAKKyNkZWZpbmUgQk9BUkRfMTZCSVQJMHgwMDQwCisjZGVmaW5lIFBBR0VEX1JBTQkweDAwODAKKyNkZWZpbmUgV0Q4MTE1VEEJKFRPS0VOX01FRElBIHwgTUlDUk9DSEFOTkVMIHwgSU5URVJGQUNFX0NISVAgfCBQQUdFRF9SQU0pCisjZGVmaW5lIFdEODExNVQJCShUT0tFTl9NRURJQSB8IElOVEVSRkFDRV9DSElQIHwgQk9BUkRfMTZCSVQgfCBQQUdFRF9SQU0pCisKKyNkZWZpbmUgQlJEX0lEXzgzMTYJMHg1MAorCisjZGVmaW5lIHI1ODdfU0VSCTB4MDAxCisjZGVmaW5lIFNFUl9ESU4JCTB4ODAKKyNkZWZpbmUgU0VSX0RPVVQJMHg0MAorI2RlZmluZSBTRVJfQ0xLCQkweDIwCisjZGVmaW5lIFNFUl9FQ1MJCTB4MTAKKyNkZWZpbmUgU0VSX0U4MDYJMHgwOAorI2RlZmluZSBTRVJfUE5QCQkweDA0CisjZGVmaW5lIFNFUl9CSU8JCTB4MDIKKyNkZWZpbmUgU0VSXzE2QgkJMHgwMQorCisjZGVmaW5lIHI1ODdfSURSCTB4MDA0CisjZGVmaW5lIElEUl9JUlFfTUFTSwkweDBGMAorI2RlZmluZSBJRFJfRENTX01BU0sJMHgwMDcKKyNkZWZpbmUgSURSX1JXUwkJMHgwMDgKKworCisjZGVmaW5lIHI1ODdfQklPCTB4MDAzCisjZGVmaW5lIEJJT19FTkIJCTB4MDgwCisjZGVmaW5lIEJJT19NQVNLCTB4MDNGCisKKyNkZWZpbmUgcjU4N19QQ1IJMHgwMDUKKyNkZWZpbmUgUENSX1JBTVMJMHgwNDAKKworCisKKyNkZWZpbmUgTlVNX0FERFJfQklUUwk4CisKKyNkZWZpbmUgSVNBX01BWF9BRERSRVNTCQkweDAwZmZmZmZmCisKKyNkZWZpbmUgU01DVFJfTUFYX0FEQVBURVJTCTcKKworI2RlZmluZSBNQ19UQUJMRV9FTlRSSUVTICAgICAgMTYKKworI2RlZmluZSBNQVhGUkFHTUVOVFMgICAgICAgICAgMzIKKworI2RlZmluZSBDSElQX1JFVl9NQVNLICAgICAgICAgMHgzMDAwCisKKyNkZWZpbmUgTUFYX1RYX1FTICAgICAgICAgICAgIDgKKyNkZWZpbmUgTlVNX1RYX1FTX1VTRUQgICAgICAgIDMKKworI2RlZmluZSBNQVhfUlhfUVMgICAgICAgICAgICAgMgorI2RlZmluZSBOVU1fUlhfUVNfVVNFRCAgICAgICAgMgorCisjZGVmaW5lIElOVEVMX0RBVEFfRk9STUFUCTB4NDAwMAorI2RlZmluZSBJTlRFTF9BRERSRVNTX1BPSU5URVJfRk9STUFUCTB4ODAwMAorI2RlZmluZSBQQUdFX1BPSU5URVIoWCkJCSgoKCh1bnNpZ25lZCBsb25nKShYKSAtIHRwLT5yYW1fYWNjZXNzKSAmIHRwLT5wYWdlX29mZnNldF9tYXNrKSArIHRwLT5yYW1fYWNjZXNzKQorI2RlZmluZSBTV0FQX1dPUkRTKFgpCQkoKChYICYgMHhGRkZGKSA8PCAxNikgfCAoWCA+PiAxNikpCisKKyNkZWZpbmUgSU5URVJGQUNFX0NISVAgICAgICAgICAgMHgwMDEwICAgICAgICAgIC8qIFNvZnQgQ29uZmlnIEFkYXB0ZXIgKi8KKyNkZWZpbmUgQURWQU5DRURfRkVBVFVSRVMgICAgICAgMHgwMDIwICAgICAgICAgIC8qIEFkdi4gbmV0dy4gaW50ZXJmYWNlIGZlYXR1cmVzICovCisjZGVmaW5lIEJPQVJEXzE2QklUICAgICAgICAgICAgIDB4MDA0MCAgICAgICAgICAvKiAxNiBiaXQgY2FwYWJpbGl0eSAqLworI2RlZmluZSBQQUdFRF9SQU0gICAgICAgICAgICAgICAweDAwODAgICAgICAgICAgLyogQWRhcHRlciBoYXMgcGFnZWQgUkFNICovCisKKyNkZWZpbmUgUEFHRURfUk9NICAgICAgICAgICAgICAgMHgwMTAwICAgICAgICAgIC8qIEFkYXB0ZXIgaGFzIHBhZ2VkIFJPTSAqLworCisjZGVmaW5lIFJBTV9TSVpFX1VOS05PV04gICAgICAgIDB4MDAwMCAgICAgICAgICAvKiBVbmtub3duIFJBTSBzaXplICovCisjZGVmaW5lIFJBTV9TSVpFXzBLICAgICAgICAgICAgIDB4MDAwMSAgICAgICAgICAvKiAwSyAgUkFNICovCisjZGVmaW5lIFJBTV9TSVpFXzhLICAgICAgICAgICAgIDB4MDAwMiAgICAgICAgICAvKiA4ayAgUkFNICovCisjZGVmaW5lIFJBTV9TSVpFXzE2SyAgICAgICAgICAgIDB4MDAwMyAgICAgICAgICAvKiAxNmsgUkFNICovCisjZGVmaW5lIFJBTV9TSVpFXzMySyAgICAgICAgICAgIDB4MDAwNCAgICAgICAgICAvKiAzMmsgUkFNICovCisjZGVmaW5lIFJBTV9TSVpFXzY0SyAgICAgICAgICAgIDB4MDAwNSAgICAgICAgICAvKiA2NGsgUkFNICovCisjZGVmaW5lIFJBTV9TSVpFX1JFU0VSVkVEXzYgICAgIDB4MDAwNiAgICAgICAgICAvKiBSZXNlcnZlZCBSQU0gc2l6ZSAqLworI2RlZmluZSBSQU1fU0laRV9SRVNFUlZFRF83ICAgICAweDAwMDcgICAgICAgICAgLyogUmVzZXJ2ZWQgUkFNIHNpemUgKi8KKyNkZWZpbmUgUkFNX1NJWkVfTUFTSyAgICAgICAgICAgMHgwMDA3ICAgICAgICAgIC8qIElzb2xhdGVzIFJBTSBTaXplICovCisKKyNkZWZpbmUgVE9LRU5fTUVESUEgICAgICAgICAgIDB4MDAwNQorCisjZGVmaW5lIEJJRF9SRUdfMCAgICAgICAweDAwCisjZGVmaW5lIEJJRF9SRUdfMSAgICAgICAweDAxCisjZGVmaW5lIEJJRF9SRUdfMiAgICAgICAweDAyCisjZGVmaW5lIEJJRF9SRUdfMyAgICAgICAweDAzCisjZGVmaW5lIEJJRF9SRUdfNCAgICAgICAweDA0CisjZGVmaW5lIEJJRF9SRUdfNSAgICAgICAweDA1CisjZGVmaW5lIEJJRF9SRUdfNiAgICAgICAweDA2CisjZGVmaW5lIEJJRF9SRUdfNyAgICAgICAweDA3CisjZGVmaW5lIEJJRF9MQVJfMCAgICAgICAweDA4CisjZGVmaW5lIEJJRF9MQVJfMSAgICAgICAweDA5CisjZGVmaW5lIEJJRF9MQVJfMiAgICAgICAweDBBCisjZGVmaW5lIEJJRF9MQVJfMyAgICAgICAweDBCCisjZGVmaW5lIEJJRF9MQVJfNCAgICAgICAweDBDCisjZGVmaW5lIEJJRF9MQVJfNSAgICAgICAweDBECisKKyNkZWZpbmUgQklEX0JPQVJEX0lEX0JZVEUgICAgICAgMHgwRQorI2RlZmluZSBCSURfQ0hDS1NNX0JZVEUgICAgICAgICAweDBGCisjZGVmaW5lIEJJRF9MQVJfT0ZGU0VUICAgICAgICAgIDB4MDggIAorCisjZGVmaW5lIEJJRF9NU1pfNTgzX0JJVCAgICAgICAgIDB4MDgKKyNkZWZpbmUgQklEX1NJWFRFRU5fQklUX0JJVCAgICAgMHgwMQorCisjZGVmaW5lIEJJRF9CT0FSRF9SRVZfTUFTSyAgICAgIDB4MUUKKworI2RlZmluZSBCSURfTUVESUFfVFlQRV9CSVQgICAgICAweDAxCisjZGVmaW5lIEJJRF9TT0ZUX0NPTkZJR19CSVQgICAgIDB4MjAKKyNkZWZpbmUgQklEX1JBTV9TSVpFX0JJVCAgICAgICAgMHg0MAorI2RlZmluZSBCSURfQlVTX1RZUEVfQklUICAgICAgICAweDgwCisKKyNkZWZpbmUgQklEX0NSICAgICAgICAgIDB4MTAKKworI2RlZmluZSBCSURfVFhQICAgICAgICAgMHgwNCAgICAgICAgICAgIC8qIFRyYW5zbWl0IFBhY2tldCBDb21tYW5kICovCisKKyNkZWZpbmUgQklEX1RDUl9ESUZGICAgIDB4MEQgICAgLyogVHJhbnNtaXQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCisjZGVmaW5lIEJJRF9UQ1JfVkFMICAgICAweDE4ICAgICAgICAgICAgLyogVmFsdWUgdG8gVGVzdCA4MzkwIG9yIDY5MCAqLworI2RlZmluZSBCSURfUFMwICAgICAgICAgMHgwMCAgICAgICAgICAgIC8qIFJlZ2lzdGVyIFBhZ2UgU2VsZWN0IDAgKi8KKyNkZWZpbmUgQklEX1BTMSAgICAgICAgIDB4NDAgICAgICAgICAgICAvKiBSZWdpc3RlciBQYWdlIFNlbGVjdCAxICovCisjZGVmaW5lIEJJRF9QUzIgICAgICAgICAweDgwICAgICAgICAgICAgLyogUmVnaXN0ZXIgUGFnZSBTZWxlY3QgMiAqLworI2RlZmluZSBCSURfUFNfTUFTSyAgICAgMHgzRiAgICAgICAgICAgIC8qIEZvciBNYXNraW5nIE9mZiBQYWdlIFNlbGVjdCBCaXRzICovCisKKyNkZWZpbmUgQklEX0VFUFJPTV8wICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEJJRF9FRVBST01fMSAgICAgICAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBCSURfRUVQUk9NXzIgICAgICAgICAgICAgICAgICAgIDB4MEEKKyNkZWZpbmUgQklEX0VFUFJPTV8zICAgICAgICAgICAgICAgICAgICAweDBCCisjZGVmaW5lIEJJRF9FRVBST01fNCAgICAgICAgICAgICAgICAgICAgMHgwQworI2RlZmluZSBCSURfRUVQUk9NXzUgICAgICAgICAgICAgICAgICAgIDB4MEQKKyNkZWZpbmUgQklEX0VFUFJPTV82ICAgICAgICAgICAgICAgICAgICAweDBFCisjZGVmaW5lIEJJRF9FRVBST01fNyAgICAgICAgICAgICAgICAgICAgMHgwRgorCisjZGVmaW5lIEJJRF9PVEhFUl9CSVQgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBCSURfSUNSX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MEMKKyNkZWZpbmUgQklEX0VBUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDBGCisjZGVmaW5lIEJJRF9FTkdSX1BBR0UgICAgICAgICAgICAgICAgICAgMHgwQTAKKyNkZWZpbmUgQklEX1JMQSAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEJJRF9FQTYgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBCSURfUkVDQUxMX0RPTkVfTUFTSyAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQklEX0JJRF9FRVBST01fT1ZFUlJJREUgICAgICAgICAweEZGQjAKKyNkZWZpbmUgQklEX0VYVFJBX0VFUFJPTV9PVkVSUklERSAgICAgICAweEZGRDAKKyNkZWZpbmUgQklEX0VFUFJPTV9NRURJQV9NQVNLICAgICAgICAgICAweDA3CisjZGVmaW5lIEJJRF9TVEFSTEFOX1RZUEUgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBCSURfRVRIRVJORVRfVFlQRSAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQklEX1RQX1RZUEUgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEJJRF9FV19UWVBFICAgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBCSURfVE9LRU5fUklOR19UWVBFICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQklEX1VUUDJfVFlQRSAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEJJRF9FRVBST01fSVJRX01BU0sgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBCSURfUFJJTUFSWV9JUlEgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQklEX0FMVEVSTkFURV9JUlFfMSAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEJJRF9BTFRFUk5BVEVfSVJRXzIgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBCSURfQUxURVJOQVRFX0lSUV8zICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgQklEX0VFUFJPTV9SQU1fU0laRV9NQVNLICAgICAgICAweEUwCisjZGVmaW5lIEJJRF9FRVBST01fUkFNX1NJWkVfUkVTMSAgICAgICAgMHgwMAorI2RlZmluZSBCSURfRUVQUk9NX1JBTV9TSVpFX1JFUzIgICAgICAgIDB4MjAKKyNkZWZpbmUgQklEX0VFUFJPTV9SQU1fU0laRV84SyAgICAgICAgICAweDQwCisjZGVmaW5lIEJJRF9FRVBST01fUkFNX1NJWkVfMTZLICAgICAgICAgMHg2MAorI2RlZmluZSBCSURfRUVQUk9NX1JBTV9TSVpFXzMySyAgICAgICAgIDB4ODAKKyNkZWZpbmUgQklEX0VFUFJPTV9SQU1fU0laRV82NEsgICAgICAgICAweEEwCisjZGVmaW5lIEJJRF9FRVBST01fUkFNX1NJWkVfUkVTMyAgICAgICAgMHhDMAorI2RlZmluZSBCSURfRUVQUk9NX1JBTV9TSVpFX1JFUzQgICAgICAgIDB4RTAKKyNkZWZpbmUgQklEX0VFUFJPTV9CVVNfVFlQRV9NQVNLICAgICAgICAweDA3CisjZGVmaW5lIEJJRF9FRVBST01fQlVTX1RZUEVfQVQgICAgICAgICAgMHgwMAorI2RlZmluZSBCSURfRUVQUk9NX0JVU19UWVBFX01DQSAgICAgICAgIDB4MDEKKyNkZWZpbmUgQklEX0VFUFJPTV9CVVNfVFlQRV9FSVNBICAgICAgICAweDAyCisjZGVmaW5lIEJJRF9FRVBST01fQlVTX1RZUEVfTkVDICAgICAgICAgMHgwMworI2RlZmluZSBCSURfRUVQUk9NX0JVU19TSVpFX01BU0sgICAgICAgIDB4MTgKKyNkZWZpbmUgQklEX0VFUFJPTV9CVVNfU0laRV84QklUICAgICAgICAweDAwCisjZGVmaW5lIEJJRF9FRVBST01fQlVTX1NJWkVfMTZCSVQgICAgICAgMHgwOAorI2RlZmluZSBCSURfRUVQUk9NX0JVU19TSVpFXzMyQklUICAgICAgIDB4MTAKKyNkZWZpbmUgQklEX0VFUFJPTV9CVVNfU0laRV82NEJJVCAgICAgICAweDE4CisjZGVmaW5lIEJJRF9FRVBST01fQlVTX01BU1RFUiAgICAgICAgICAgMHgyMAorI2RlZmluZSBCSURfRUVQUk9NX1JBTV9QQUdJTkcgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQklEX0VFUFJPTV9ST01fUEFHSU5HICAgICAgICAgICAweDgwCisjZGVmaW5lIEJJRF9FRVBST01fUEFHSU5HX01BU0sgICAgICAgICAgMHhDMAorI2RlZmluZSBCSURfRUVQUk9NX0xPV19DT1NUICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQklEX0VFUFJPTV9JT19NQVBQRUQgICAgICAgICAgICAweDEwCisjZGVmaW5lIEJJRF9FRVBST01fSE1JICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBCSURfRUVQUk9NX0FVVE9fTUVESUFfREVURUNUICAgIDB4MDEKKyNkZWZpbmUgQklEX0VFUFJPTV9DSElQX1JFVl9NQVNLICAgICAgICAweDBDCisKKyNkZWZpbmUgQklEX0VFUFJPTV9MQU5fQUREUiAgICAgICAgICAgICAweDMwCisKKyNkZWZpbmUgQklEX0VFUFJPTV9NRURJQV9PUFRJT04gICAgICAgICAweDU0CisjZGVmaW5lIEJJRF9FRVBST01fTUVESUFfVVRQICAgICAgICAgICAgMHgwMQorI2RlZmluZSBCSURfRUVQUk9NXzRNQl9SSU5HICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQklEX0VFUFJPTV8xNk1CX1JJTkcgICAgICAgICAgICAweDEwCisjZGVmaW5lIEJJRF9FRVBST01fTUVESUFfU1RQICAgICAgICAgICAgMHg0MAorCisjZGVmaW5lIEJJRF9FRVBST01fTUlTQ19EQVRBICAgICAgICAgICAgMHg1NgorI2RlZmluZSBCSURfRUVQUk9NX0VBUkxZX1RPS0VOX1JFTEVBU0UgIDB4MDIKKworI2RlZmluZSBDTkZHX0lEXzgwMDNFICAgICAgICAgICAweDZmYzAKKyNkZWZpbmUgQ05GR19JRF84MDAzUyAgICAgICAgICAgMHg2ZmMxCisjZGVmaW5lIENORkdfSURfODAwM1cgICAgICAgICAgIDB4NmZjMgorI2RlZmluZSBDTkZHX0lEXzgxMTVUUkEgICAgICAgICAweDZlYzYKKyNkZWZpbmUgQ05GR19JRF84MDEzRSAgICAgICAgICAgMHg2MUM4CisjZGVmaW5lIENORkdfSURfODAxM1cgICAgICAgICAgIDB4NjFDOQorI2RlZmluZSBDTkZHX0lEX0JJU1RSTzAzRSAgICAgICAweEVGRTUKKyNkZWZpbmUgQ05GR19JRF9CSVNUUk8xM0UgICAgICAgMHhFRkQ1CisjZGVmaW5lIENORkdfSURfQklTVFJPMTNXICAgICAgIDB4RUZENAorI2RlZmluZSBDTkZHX01TUl81ODMgICAgMHgwCisjZGVmaW5lIENORkdfSUNSXzU4MyAgICAweDEKKyNkZWZpbmUgQ05GR19JQVJfNTgzICAgIDB4MgorI2RlZmluZSBDTkZHX0JJT181ODMgICAgMHgzCisjZGVmaW5lIENORkdfRUFSXzU4MyAgICAweDMKKyNkZWZpbmUgQ05GR19JUlJfNTgzICAgIDB4NAorI2RlZmluZSBDTkZHX0xBQVJfNTg0ICAgMHg1CisjZGVmaW5lIENORkdfR1AyICAgICAgICAgICAgICAgIDB4NworI2RlZmluZSBDTkZHX0xBQVJfTUFTSyAgICAgICAgICAweDFGCisjZGVmaW5lIENORkdfTEFBUl9aV1MgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQ05GR19MQUFSX0wxNkUgICAgICAgICAgMHg0MAorI2RlZmluZSBDTkZHX0lDUl9JUjJfNTg0ICAgICAgICAweDA0CisjZGVmaW5lIENORkdfSUNSX01BU0sgICAgICAgMHgwOAorI2RlZmluZSBDTkZHX0lDUl9NU1ogICAgICAgIDB4MDgKKyNkZWZpbmUgQ05GR19JQ1JfUkxBICAgICAgICAweDEwCisjZGVmaW5lIENORkdfSUNSX1NUTyAgICAgICAgMHg4MAorI2RlZmluZSBDTkZHX0lSUl9JUlFTICAgICAgICAgICAweDYwCisjZGVmaW5lIENORkdfSVJSX0lFTiAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQ05GR19JUlJfWldTICAgICAgICAgICAgMHgwMQorI2RlZmluZSBDTkZHX0dQMl9CT09UX05JQkJMRSAgICAweDBGCisjZGVmaW5lIENORkdfSVJSX09VVDIgICAgICAgMHgwNAorI2RlZmluZSBDTkZHX0lSUl9PVVQxICAgICAgIDB4MDIKKworI2RlZmluZSBDTkZHX1NJWkVfOEtCICAgICAgICAgICA4CisjZGVmaW5lIENORkdfU0laRV8xNktCICAgICAgICAgIDE2CisjZGVmaW5lIENORkdfU0laRV8zMktCICAgICAgICAgIDMyCisjZGVmaW5lIENORkdfU0laRV82NEtCICAgICAgICAgIDY0CisjZGVmaW5lIENORkdfU0laRV8xMjhLQiAgICAgMTI4CisjZGVmaW5lIENORkdfU0laRV8yNTZLQiAgICAgMjU2CisjZGVmaW5lIFJPTV9ESVNBQkxFICAgICAgICAgICAgIDB4MAorCisjZGVmaW5lIENORkdfU0xPVF9FTkFCTEVfQklUICAgIDB4MDgKKworI2RlZmluZSBDTkZHX1BPU19DT05UUk9MX1JFRyAgICAweDA5NgorI2RlZmluZSBDTkZHX1BPU19SRUcwICAgICAgICAgICAweDEwMAorI2RlZmluZSBDTkZHX1BPU19SRUcxICAgICAgICAgICAweDEwMQorI2RlZmluZSBDTkZHX1BPU19SRUcyICAgICAgICAgICAweDEwMgorI2RlZmluZSBDTkZHX1BPU19SRUczICAgICAgICAgICAweDEwMworI2RlZmluZSBDTkZHX1BPU19SRUc0ICAgICAgICAgICAweDEwNAorI2RlZmluZSBDTkZHX1BPU19SRUc1ICAgICAgICAgICAweDEwNQorCisjZGVmaW5lIENORkdfQURBUFRFUl9UWVBFX01BU0sgIDB4MGUKKworI2RlZmluZSBTTE9UXzE2QklUICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgSU5URVJGQUNFXzVYM19DSElQICAgICAgMHgwMDAwICAgICAgICAgIC8qIDAwMDAgPSA1ODMgb3IgNTkzIGNoaXBzICovCisjZGVmaW5lIE5JQ182OTBfQklUICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAgICAgICAgIC8qIE5JQyBpcyA2OTAgKi8KKyNkZWZpbmUgQUxURVJOQVRFX0lSUV9CSVQgICAgICAgMHgwMDIwICAgICAgICAgIC8qIEFsdGVybmF0ZSBJUlEgaXMgdXNlZCAqLworI2RlZmluZSBJTlRFUkZBQ0VfNTg0X0NISVAgICAgICAweDAwNDAgICAgICAgICAgLyogMDAwMSA9IDU4NCBjaGlwICovCisjZGVmaW5lIElOVEVSRkFDRV81OTRfQ0hJUCAgICAgIDB4MDA4MCAgICAgICAgICAvKiAwMDEwID0gNTk0IGNoaXAgKi8KKyNkZWZpbmUgSU5URVJGQUNFXzU4NV9DSElQICAgICAgMHgwMTAwICAgICAgICAgIC8qIDAxMDAgPSA1ODUvNzkwIGNoaXAgKi8KKyNkZWZpbmUgSU5URVJGQUNFX0NISVBfTUFTSyAgICAgMHgwM0MwICAgICAgICAgIC8qIElzb2xhdGVzIEludGZjIENoaXAgVHlwZSAqLworCisjZGVmaW5lIEJPQVJEXzE2QklUICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBOT0RFX0FERFJfQ0tTVU0gCTB4RUUKKyNkZWZpbmUgQlJEX0lEXzgxMTVUICAgIAkweDA0CisKKyNkZWZpbmUgTklDXzgyNV9CSVQgICAgICAgICAgICAgMHgwNDAwICAgICAgICAgIC8qIFRSQyA4M0M4MjUgTklDICovCisjZGVmaW5lIE5JQ183OTBfQklUICAgICAgICAgICAgIDB4MDgwMCAgICAgICAgICAvKiBOSUMgaXMgODNDNzkwIEV0aGVybmV0ICovCisKKyNkZWZpbmUgQ0hJUF9SRVZfTUFTSyAgICAgICAgICAgMHgzMDAwCisKKyNkZWZpbmUgSFdSX0NCVVNZCQkJMHgwMgorI2RlZmluZSBIV1JfQ0EJCQkJMHgwMQorCisjZGVmaW5lIE1BQ19RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBOT05fTUFDX1FVRVVFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQlVHX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgIC8qIE5PIFJFQ0VJVkUgUVVFVUUsIE9OTFkgVFggKi8KKworI2RlZmluZSBOVU1fTUFDX1RYX0ZDQlMgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTlVNX01BQ19UWF9CREJTICAgICAgICAgICAgICAgICBOVU1fTUFDX1RYX0ZDQlMKKyNkZWZpbmUgTlVNX01BQ19SWF9GQ0JTICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIE5VTV9NQUNfUlhfQkRCUyAgICAgICAgICAgICAgICAgOAorCisjZGVmaW5lIE5VTV9OT05fTUFDX1RYX0ZDQlMgICAgICAgICAgICAgNgorI2RlZmluZSBOVU1fTk9OX01BQ19UWF9CREJTICAgICAgICAgICAgIE5VTV9OT05fTUFDX1RYX0ZDQlMKKworI2RlZmluZSBOVU1fTk9OX01BQ19SWF9CREJTICAgICAgICAgICAgIDAgICAgICAgLyogQ0FMQ1VMQVRFRCBEWU5BTUlDQUxMWSAqLworCisjZGVmaW5lIE5VTV9CVUdfVFhfRkNCUyAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBOVU1fQlVHX1RYX0JEQlMgICAgICAgICAgICAgICAgIE5VTV9CVUdfVFhfRkNCUworCisjZGVmaW5lIE1BQ19UWF9CVUZGRVJfTUVNT1JZICAgICAgICAgICAgMTAyNAorI2RlZmluZSBOT05fTUFDX1RYX0JVRkZFUl9NRU1PUlkgICAgICAgICgyMCAqIDEwMjQpCisjZGVmaW5lIEJVR19UWF9CVUZGRVJfTUVNT1JZICAgICAgICAgICAgKE5VTV9CVUdfVFhfRkNCUyAqIDMyKQorCisjZGVmaW5lIFJYX0JVRkZFUl9NRU1PUlkgICAgICAgICAgICAgICAgMCAgICAgICAvKiBDQUxDVUxBVEVEIERZTkFNSUNBTExZICovCisjZGVmaW5lIFJYX0RBVEFfQlVGRkVSX1NJWkUgICAgICAgICAgICAgMjU2CisjZGVmaW5lIFJYX0JEQl9TSVpFX1NISUZUICAgICAgICAgICAgICAgMyAgICAgICAvKiBsb2cyKFJYX0RBVEFfQlVGRkVSX1NJWkUpLWxvZzIoc2l6ZW9mKEJEQmxvY2spKSAqLworI2RlZmluZSBSWF9CREJfU0laRV9NQVNLICAgICAgICAgICAgICAgIChzaXplb2YoQkRCbG9jaykgLSAxKQorI2RlZmluZSBSWF9EQVRBX0JVRkZFUl9TSVpFX01BU0sgICAgICAgIChSWF9EQVRBX0JVRkZFUl9TSVpFLTEpCisKKyNkZWZpbmUgTlVNX09GX0lOVEVSUlVQVFMgICAgICAgICAgICAgICAweDIwCisKKyNkZWZpbmUgTk9UX1RSQU5TTUlUSU5HICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFRSQU5TTUlUSU5HCQkJMQorCisjZGVmaW5lIFRSQ19JTlRFUlJVUFRfRU5BQkxFX01BU0sgICAgICAgMHg3RkY2CisKKyNkZWZpbmUgVUNPREVfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAweDU4CisKKyNkZWZpbmUgVUNPREVfU0laRV9PRkZTRVQgICAgICAgICAgICAgICAweDAwMDAgIC8qIFdPUkQgKi8KKyNkZWZpbmUgVUNPREVfQ0hFQ0tTVU1fT0ZGU0VUICAgICAgICAgICAweDAwMDIgIC8qIFdPUkQgKi8KKyNkZWZpbmUgVUNPREVfVkVSU0lPTl9PRkZTRVQgICAgICAgICAgICAweDAwMDQgIC8qIEJZVEUgKi8KKworI2RlZmluZSBDU19SQU1fU0laRSAgICAgICAgICAgICAgICAgICAgIDBYMjAwMAorI2RlZmluZSBDU19SQU1fQ0hFQ0tTVU1fT0ZGU0VUICAgICAgICAgIDB4MUZGRSAgLyogV09SRCAxRkZFKE1TQiktMUZGRihMU0IpKi8KKyNkZWZpbmUgQ1NfUkFNX1ZFUlNJT05fT0ZGU0VUICAgICAgICAgICAweDFGRkMgIC8qIFdPUkQgMUZGQyhNU0IpLTFGRkQoTFNCKSovCisKKyNkZWZpbmUgTUlTQ19EQVRBX1NJWkUgICAgICAgICAgICAgICAgICAxMjgKKyNkZWZpbmUgTlVNX09GX0FDQlMgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQUNCX0NPTU1BTkRfTk9UX0RPTkUgICAgICAgICAgICAweDAwMDAgIC8qIEluaXQsIGNvbW1hbmQgbm90IGRvbmUgKi8KKyNkZWZpbmUgQUNCX0NPTU1BTkRfRE9ORSAgICAgICAgICAgICAgICAweDgwMDAgIC8qIFRSQyBzYXlzIGNvbW1hbmQgZG9uZSAqLworI2RlZmluZSBBQ0JfQ09NTUFORF9TVEFUVVNfTUFTSyAgICAgICAgIDB4MDBGRiAgLyogbG93IGJ5dGUgaXMgc3RhdHVzICovCisjZGVmaW5lIEFDQl9DT01NQU5EX1NVQ0NFU1NGVUwgICAgICAgICAgMHgwMDAwICAvKiBtZWFucyBjbWQgd2FzIHN1Y2Nlc3NmdWwgKi8KKyNkZWZpbmUgQUNCX05PVF9DSEFJTl9FTkQgICAgICAgICAgICAgICAweDAwMDAgIC8qIHRlbGwgVFJDIG1vcmUgQ0JzIGluIGNoYWluICovCisjZGVmaW5lIEFDQl9DSEFJTl9FTkQgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiB0ZWxsIFRSQyBsYXN0IENCIGluIGNoYWluICovCisjZGVmaW5lIEFDQl9DT01NQU5EX05PX0lOVEVSUlVQVCAgICAgICAgMHgwMDAwICAvKiB0ZWxsIFRSQyBubyBJTlQgYWZ0ZXIgQ0IgKi8KKyNkZWZpbmUgQUNCX0NPTU1BTkRfSU5URVJSVVBUICAgICAgICAgICAweDIwMDAgIC8qIHRlbGwgVFJDIHRvIElOVCBhZnRlciBDQiAqLworI2RlZmluZSBBQ0JfU1VCX0NNRF9OT1AgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBBQ0JfQ01EX0hJQ19OT1AgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBBQ0JfQ01EX01DVF9OT1AgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBBQ0JfQ01EX01DVF9URVNUICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBBQ0JfQ01EX0hJQ19URVNUICAgICAgICAgICAgICAgIDB4MDA4MQorI2RlZmluZSBBQ0JfQ01EX0lOU0VSVCAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBBQ0JfQ01EX1JFTU9WRSAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBBQ0JfQ01EX01DVF9XUklURV9WQUxVRSAgICAgICAgIDB4MDAwNAorI2RlZmluZSBBQ0JfQ01EX0hJQ19XUklURV9WQUxVRSAgICAgICAgIDB4MDA4NAorI2RlZmluZSBBQ0JfQ01EX01DVF9SRUFEX1ZBTFVFICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBBQ0JfQ01EX0hJQ19SRUFEX1ZBTFVFICAgICAgICAgIDB4MDA4NQorI2RlZmluZSBBQ0JfQ01EX0lOSVRfVFhfUlggICAgICAgICAgICAgIDB4MDA4NgorI2RlZmluZSBBQ0JfQ01EX0lOSVRfVFJDX1RJTUVSUyAgICAgICAgIDB4MDAwNgorI2RlZmluZSBBQ0JfQ01EX1JFQURfVFJDX1NUQVRVUyAgICAgICAgIDB4MDAwNworI2RlZmluZSBBQ0JfQ01EX0NIQU5HRV9KT0lOX1NUQVRFICAgICAgIDB4MDAwOAorI2RlZmluZSBBQ0JfQ01EX1JFU0VSVkVEXzkgICAgICAgICAgICAgIDB4MDAwOQorI2RlZmluZSBBQ0JfQ01EX1JFU0VSVkVEX0EgICAgICAgICAgICAgIDB4MDAwQQorI2RlZmluZSBBQ0JfQ01EX1JFU0VSVkVEX0IgICAgICAgICAgICAgIDB4MDAwQgorI2RlZmluZSBBQ0JfQ01EX1JFU0VSVkVEX0MgICAgICAgICAgICAgIDB4MDAwQworI2RlZmluZSBBQ0JfQ01EX1JFU0VSVkVEX0QgICAgICAgICAgICAgIDB4MDAwRAorI2RlZmluZSBBQ0JfQ01EX1JFU0VSVkVEX0UgICAgICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBBQ0JfQ01EX1JFU0VSVkVEX0YgICAgICAgICAgICAgIDB4MDAwRgorCisjZGVmaW5lIFRSQ19NQUNfUkVHSVNURVJTX1RFU1QgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFRSQ19JTlRFUk5BTF9MT09QQkFDSyAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRSQ19UUklfTE9PUEJBQ0sgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFRSQ19JTlRFUk5BTF9ST01fVEVTVCAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIFRSQ19MT0JFX01FRElBX1RFU1QgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFRSQ19BTkFMT0dfVEVTVCAgICAgICAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIFRSQ19IT1NUX0lOVEVSRkFDRV9SRUdfVEVTVCAgICAgMHgwMDAzCisKKyNkZWZpbmUgVEVTVF9ETUFfMSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgVEVTVF9ETUFfMiAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVEVTVF9NQ1RfUk9NICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgSElDX0lOVEVSTkFMX0RJQUcgICAgICAgICAgICAgICAweDAwMDMKKworI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV8wICAgICAgIDB4MDAwMQorI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV8xICAgICAgIDB4MDAwMgorI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV8yICAgICAgIDB4MDAwNAorI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV8zICAgICAgIDB4MDAwOAorI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV80ICAgICAgIDB4MDAxMAorI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV81ICAgICAgIDB4MDAyMAorI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV82ICAgICAgIDB4MDA0MAorI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV83ICAgICAgIDB4MDA4MAorCisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfMCAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfMSAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfMiAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfMyAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfNCAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfNSAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfNiAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfNyAgICAgICAgICAgMHgwMDgwCisKKyNkZWZpbmUgRkNCX0ZSQU1FX0xFTkdUSCAgICAgICAgICAgICAgICAweDEwMAorI2RlZmluZSBGQ0JfQ09NTUFORF9ET05FICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogRkNCIFdvcmQgMCAqLworI2RlZmluZSBGQ0JfTk9UX0NIQUlOX0VORCAgICAgICAgICAgICAgIDB4MDAwMCAgLyogRkNCIFdvcmQgMSAqLworI2RlZmluZSBGQ0JfQ0hBSU5fRU5EICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBGQ0JfTk9fV0FSTklORyAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBGQ0JfV0FSTklORyAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBGQ0JfSU5URVJSVVBUX0RJU0FCTEUgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBGQ0JfSU5URVJSVVBUX0VOQUJMRSAgICAgICAgICAgIDB4MjAwMAorCisjZGVmaW5lIEZDQl9FTkFCTEVfSU1BICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEZDQl9FTkFCTEVfVEVTICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBHdWFyYW50ZWUgVHggYmVmb3JlIEludCAqLworI2RlZmluZSBGQ0JfRU5BQkxFX1RGUyAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogUG9zdCBUeCBGcmFtZSBTdGF0dXMgKi8KKyNkZWZpbmUgRkNCX0VOQUJMRV9OVEMgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE5vIFR4IENSQyAqLworCisjZGVmaW5lIEZDQl9UWF9TVEFUVVNfQ1IyICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEZDQl9UWF9TVEFUVVNfQVIyICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEZDQl9UWF9TVEFUVVNfQ1IxICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEZDQl9UWF9TVEFUVVNfQVIxICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIEZDQl9UWF9BQ19CSVRTICAgICAgICAgICAgICAgICAgKEZDQl9UWF9TVEFUVVNfQVIxK0ZDQl9UWF9TVEFUVVNfQVIyK0ZDQl9UWF9TVEFUVVNfQ1IxK0ZDQl9UWF9TVEFUVVNfQ1IyKQorI2RlZmluZSBGQ0JfVFhfU1RBVFVTX0UgICAgICAgICAgICAgICAgIDB4MDEwMAorCisjZGVmaW5lIEZDQl9SWF9TVEFUVVNfQU5ZX0VSUk9SICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEZDQl9SWF9TVEFUVVNfRkNTX0VSUk9SICAgICAgICAgMHgwMDAyCisKKyNkZWZpbmUgRkNCX1JYX1NUQVRVU19JQV9NQVRDSEVEICAgICAgICAweDA0MDAKKyNkZWZpbmUgRkNCX1JYX1NUQVRVU19JR0FfQlNHQV9NQVRDSEVEICAweDA1MDAKKyNkZWZpbmUgRkNCX1JYX1NUQVRVU19GQV9NQVRDSEVEICAgICAgICAweDA2MDAKKyNkZWZpbmUgRkNCX1JYX1NUQVRVU19CQV9NQVRDSEVEICAgICAgICAweDA3MDAKKyNkZWZpbmUgRkNCX1JYX1NUQVRVU19EQV9NQVRDSEVEICAgICAgICAweDA0MDAKKyNkZWZpbmUgRkNCX1JYX1NUQVRVU19TT1VSQ0VfUk9VVElORyAgICAweDA4MDAKKworI2RlZmluZSBCREJfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lIEJEQl9OT1RfQ0hBSU5fRU5EICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEJEQl9DSEFJTl9FTkQgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIEJEQl9OT19XQVJOSU5HICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEJEQl9XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisKKyNkZWZpbmUgRVJST1JfQ09VTlRFUlNfQ0hBTkdFRCAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVElfTkRJU19SSU5HX1NUQVRVU19DSEFOR0VEICAgICAweDAwMDIKKyNkZWZpbmUgVU5BX0NIQU5HRUQgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUkVBRFlfVE9fU0VORF9SUV9JTklUICAgICAgICAgICAweDAwMDgKKworI2RlZmluZSBTQ0dCX0FERFJFU1NfUE9JTlRFUl9GT1JNQVQgICAgIElOVEVMX0FERFJFU1NfUE9JTlRFUl9GT1JNQVQKKyNkZWZpbmUgU0NHQl9EQVRBX0ZPUk1BVCAgICAgICAgICAgICAgICBJTlRFTF9EQVRBX0ZPUk1BVAorI2RlZmluZSBTQ0dCX01VTFRJX1dPUkRfQ09OVFJPTCAgICAgICAgIDAKKyNkZWZpbmUgU0NHQl9CVVJTVF9MRU5HVEggICAgICAgICAgICAgICAweDAwMEUgIC8qIERNQSBCdXJzdCBMZW5ndGggKi8KKworI2RlZmluZSBTQ0dCX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgIChJTlRFTF9BRERSRVNTX1BPSU5URVJfRk9STUFUK0lOVEVMX0RBVEFfRk9STUFUK1NDR0JfQlVSU1RfTEVOR1RIKQorCisjZGVmaW5lIElTQ1BfQkxPQ0tfU0laRSAgICAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSBSQU1fU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAKKyNkZWZpbmUgSU5JVF9TWVNfQ09ORklHX1BUUl9PRkZTRVQgICAgICAoUkFNX1NJWkUtSVNDUF9CTE9DS19TSVpFKQorI2RlZmluZSBTQ0dQX0JMT0NLX09GRlNFVCAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBTQ0xCX05PVF9WQUxJRCAgICAgICAgICAgICAgICAgIDB4MDAwMCAgLyogSW5pdGlhbGx5LCBTQ0xCIG5vdCB2YWxpZCAqLworI2RlZmluZSBTQ0xCX1ZBTElEICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogSG9zdCB0ZWxscyBUUkMgU0NMQiB2YWxpZCAqLworI2RlZmluZSBTQ0xCX1BST0NFU1NFRCAgICAgICAgICAgICAgICAgIDB4MDAwMCAgLyogVFJDIHNheXMgU0NMQiBwcm9jZXNzZWQgKi8KKyNkZWZpbmUgU0NMQl9SRVNVTUVfQ09OVFJPTF9OT1RfVkFMSUQgICAweDAwMDAgIC8qIEluaXRpYWxseSwgUkMgbm90IHZhbGlkICovCisjZGVmaW5lIFNDTEJfUkVTVU1FX0NPTlRST0xfVkFMSUQgICAgICAgMHg0MDAwICAvKiBIb3N0IHRlbGxzIFRSQyBSQyB2YWxpZCAqLworI2RlZmluZSBTQ0xCX0lBQ0tfQ09ERV9OT1RfVkFMSUQgICAgICAgIDB4MDAwMCAgLyogSW5pdGlhbGx5LCBJQUNLIG5vdCB2YWxpZCAqLworI2RlZmluZSBTQ0xCX0lBQ0tfQ09ERV9WQUxJRCAgICAgICAgICAgIDB4MjAwMCAgLyogSG9zdCB0ZWxscyBUUkMgSUFDSyB2YWxpZCAqLworI2RlZmluZSBTQ0xCX0NNRF9OT1AgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBTQ0xCX0NNRF9SRU1PVkUgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBTQ0xCX0NNRF9TVVNQRU5EX0FDQl9DSEFJTiAgICAgIDB4MDAwMgorI2RlZmluZSBTQ0xCX0NNRF9TRVRfSU5URVJSVVBUX01BU0sgICAgIDB4MDAwMworI2RlZmluZSBTQ0xCX0NNRF9DTEVBUl9JTlRFUlJVUFRfTUFTSyAgIDB4MDAwNAorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF81ICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF82ICAgICAgICAgICAgIDB4MDAwNgorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF83ICAgICAgICAgICAgIDB4MDAwNworI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF84ICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF85ICAgICAgICAgICAgIDB4MDAwOQorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF9BICAgICAgICAgICAgIDB4MDAwQQorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF9CICAgICAgICAgICAgIDB4MDAwQgorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF9DICAgICAgICAgICAgIDB4MDAwQworI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF9EICAgICAgICAgICAgIDB4MDAwRAorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF9FICAgICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF9GICAgICAgICAgICAgIDB4MDAwRgorCisjZGVmaW5lIFNDTEJfUkNfQUNCICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBY3Rpb24gQ29tbWFuZCBCbG9jayBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1JFUzAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQWx3YXlzIFplcm8gKi8KKyNkZWZpbmUgU0NMQl9SQ19SRVMxICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFsd2F5cyBaZXJvICovCisjZGVmaW5lIFNDTEJfUkNfUkVTMiAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBbHdheXMgWmVybyAqLworI2RlZmluZSBTQ0xCX1JDX1JYX01BQ19GQ0IgICAgICAgICAgICAgIDB4MDAxMCAgLyogUlhfTUFDX0ZDQiBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1JYX01BQ19CREIgICAgICAgICAgICAgIDB4MDAyMCAgLyogUlhfTUFDX0JEQiBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1JYX05PTl9NQUNfRkNCICAgICAgICAgIDB4MDA0MCAgLyogUlhfTk9OX01BQ19GQ0IgQ2hhaW4gKi8KKyNkZWZpbmUgU0NMQl9SQ19SWF9OT05fTUFDX0JEQiAgICAgICAgICAweDAwODAgIC8qIFJYX05PTl9NQUNfQkRCIENoYWluICovCisjZGVmaW5lIFNDTEJfUkNfVEZDQjAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBUWCBQcmlvcml0eSAwIEZDQiBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1RGQ0IxICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogVFggUHJpb3JpdHkgMSBGQ0IgQ2hhaW4gKi8KKyNkZWZpbmUgU0NMQl9SQ19URkNCMiAgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIFRYIFByaW9yaXR5IDIgRkNCIENoYWluICovCisjZGVmaW5lIFNDTEJfUkNfVEZDQjMgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBUWCBQcmlvcml0eSAzIEZDQiBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1RGQ0I0ICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogVFggUHJpb3JpdHkgNCBGQ0IgQ2hhaW4gKi8KKyNkZWZpbmUgU0NMQl9SQ19URkNCNSAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIFRYIFByaW9yaXR5IDUgRkNCIENoYWluICovCisjZGVmaW5lIFNDTEJfUkNfVEZDQjYgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBUWCBQcmlvcml0eSA2IEZDQiBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1RGQ0I3ICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogVFggUHJpb3JpdHkgNyBGQ0IgQ2hhaW4gKi8KKworI2RlZmluZSBTQ0xCX0lNQ19SRVMwICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogKi8KKyNkZWZpbmUgU0NMQl9JTUNfTUFDX1RZUEVfMyAgICAgICAgICAgICAweDAwMDIgIC8qIE1BQ19BUkNfSU5ESUNBVEUgKi8KKyNkZWZpbmUgU0NMQl9JTUNfTUFDX0VSUk9SX0NPVU5URVJTICAgICAweDAwMDQgIC8qICovCisjZGVmaW5lIFNDTEJfSU1DX1JFUzEgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiAqLworI2RlZmluZSBTQ0xCX0lNQ19NQUNfVFlQRV8yICAgICAgICAgICAgIDB4MDAxMCAgLyogUVVFX01BQ19JTkRJQ0FURSAqLworI2RlZmluZSBTQ0xCX0lNQ19UWF9GUkFNRSAgICAgICAgICAgICAgIDB4MDAyMCAgLyogKi8KKyNkZWZpbmUgU0NMQl9JTUNfRU5EX09GX1RYX1FVRVVFICAgICAgICAweDAwNDAgIC8qICovCisjZGVmaW5lIFNDTEJfSU1DX05PTl9NQUNfUlhfUkVTT1VSQ0UgICAgMHgwMDgwICAvKiAqLworI2RlZmluZSBTQ0xCX0lNQ19NQUNfUlhfUkVTT1VSQ0UgICAgICAgIDB4MDEwMCAgLyogKi8KKyNkZWZpbmUgU0NMQl9JTUNfTk9OX01BQ19SWF9GUkFNRSAgICAgICAweDAyMDAgIC8qICovCisjZGVmaW5lIFNDTEJfSU1DX01BQ19SWF9GUkFNRSAgICAgICAgICAgMHgwNDAwICAvKiAqLworI2RlZmluZSBTQ0xCX0lNQ19UUkNfRklGT19TVEFUVVMgICAgICAgIDB4MDgwMCAgLyogKi8KKyNkZWZpbmUgU0NMQl9JTUNfQ09NTUFORF9TVEFUVVMgICAgICAgICAweDEwMDAgIC8qICovCisjZGVmaW5lIFNDTEJfSU1DX01BQ19UWVBFXzEgICAgICAgICAgICAgMHgyMDAwICAvKiBTZWxmIFJlbW92ZWQgKi8KKyNkZWZpbmUgU0NMQl9JTUNfVFJDX0lOVFJOTF9UU1RfU1RBVFVTICAweDQwMDAgIC8qICovCisjZGVmaW5lIFNDTEJfSU1DX1JFUzIgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiAqLworCisjZGVmaW5lIERNQV9UUklHR0VSICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEZSRVFfMTZNQl9CSVQgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFRIRFJFTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIENGRzBfUlNWMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIENGRzBfUlNWMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIEVUUkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFJYX09XTl9CSVQgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFJYQVRNQUMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFBST01JU0NVT1VTX0JJVCAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFVTRVRQVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFNBVkJBRF9CSVQgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIE9ORVFVRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIE5PX0FVVE9SRU1PVkUgICAgICAgICAgICAgICAgICAgMHg4MDAwCisKKyNkZWZpbmUgUlhfRkNCX0FSRUFfODMxNiAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBSWF9CVUZGX0FSRUFfODMxNiAgICAgICAweDAwMDAwMDAwCisKKyNkZWZpbmUgVFJDX1BPSU5URVIoWCkgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKShYKSAtIHRwLT5yYW1fYWNjZXNzKQorI2RlZmluZSBSWF9GQ0JfVFJDX1BPSU5URVIoWCkgICAoKHVuc2lnbmVkIGxvbmcpKFgpIC0gdHAtPnJhbV9hY2Nlc3MgKyBSWF9GQ0JfQVJFQV84MzE2KQorI2RlZmluZSBSWF9CVUZGX1RSQ19QT0lOVEVSKFgpICgodW5zaWduZWQgbG9uZykoWCkgLSB0cC0+cmFtX2FjY2VzcyArIFJYX0JVRkZfQVJFQV84MzE2KQorCisvLyBPZmZzZXQgMDogTVNSIC0gTWVtb3J5IFNlbGVjdCBSZWdpc3RlcgorLy8KKyNkZWZpbmUgcjU4N19NU1IgICAgICAgIDB4MDAwICAgLy8gUmVnaXN0ZXIgT2Zmc2V0CisvLyNkZWZpbmUgICAgICAgTVNSX1JTVCAgICAgICAgIDB4MDgwICAgLy8gTEFOIENvbnRyb2xsZXIgUmVzZXQKKyNkZWZpbmUgTVNSX01FTkIgICAgICAgIDB4MDQwICAgLy8gU2hhcmVkIE1lbW9yeSBFbmFibGUKKyNkZWZpbmUgTVNSX1JBMTggICAgICAgIDB4MDIwICAgLy8gUmFtIEFkZHJlc3MgYml0IDE4ICAgKDU4MywgNTg0LCA1ODcpCisjZGVmaW5lIE1TUl9SQTE3ICAgICAgICAweDAxMCAgIC8vIFJhbSBBZGRyZXNzIGJpdCAxNyAgICg1ODMsIDU4NCwgNTg1Lzc5MCkKKyNkZWZpbmUgTVNSX1JBMTYgICAgICAgIDB4MDA4ICAgLy8gUmFtIEFkZHJlc3MgYml0IDE2ICAgKDU4MywgNTg0LCA1ODUvNzkwKQorI2RlZmluZSBNU1JfUkExNSAgICAgICAgMHgwMDQgICAvLyBSYW0gQWRkcmVzcyBiaXQgMTUgICAoNTgzLCA1ODQsIDU4NS83OTApCisjZGVmaW5lIE1TUl9SQTE0ICAgICAgICAweDAwMiAgIC8vIFJhbSBBZGRyZXNzIGJpdCAxNCAgICg1ODMsIDU4NCwgNTg1Lzc5MCkKKyNkZWZpbmUgTVNSX1JBMTMgICAgICAgIDB4MDAxICAgLy8gUmFtIEFkZHJlc3MgYml0IDEzICAgKDU4MywgNTg0LCA1ODUvNzkwKQorCisjZGVmaW5lIE1TUl9NQVNLICAgICAgICAweDAzRiAgIC8vIE1hc2sgZm9yIEFkZHJlc3MgYml0cyBSQTE4LVJBMTMgKDU4MywgNTg0LCA1ODcpCisKKyNkZWZpbmUgTVNSICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBJUlIgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEhXUiAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTEFBUiAgICAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBJTUNDUiAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIExBUjAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQkRJRCAgICAgICAgICAgICAgICAgICAgMHgwRSAgICAvLyBBZGFwdGVyIElEIGJ5dGUgcmVnaXN0ZXIgb2Zmc2V0CisjZGVmaW5lIENTUiAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUFIgICAgICAgICAgICAgICAgICAgICAgMHgxMQorCisjZGVmaW5lIE1TUl9SU1QgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgTVNSX01FTUIgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBNU1JfMFdTICAgICAgICAgICAgICAgICAweDIwCisKKyNkZWZpbmUgRk9SQ0VEXzE2QklUX01PREUgICAgICAgMHgwMDAyCisKKyNkZWZpbmUgSU5URVJGUkFNRV9TUEFDSU5HXzE2ICAgICAgICAgICAweDAwMDMgIC8qIDYgYnl0ZXMgKi8KKyNkZWZpbmUgSU5URVJGUkFNRV9TUEFDSU5HXzQgICAgICAgICAgICAweDAwMDEgIC8qIDIgYnl0ZXMgKi8KKyNkZWZpbmUgTVVMVElDQVNUX0FERFJFU1NfQklUICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgTk9OX1NSQ19ST1VUSU5HX0JJVCAgICAgICAgICAgICAweDAwMjAKKworI2RlZmluZSBMT09QSU5HX01PREVfTUFTSyAgICAgICAweDAwMDcKKworLyoKKyAqIERlY29kZSBmaXJtd2FyZSBkZWZpbmVzLgorICovCisjZGVmaW5lIFNXQVBfQllURVMoWCkJCSgoWCAmIDB4ZmYpIDw8IDgpIHwgKFggPj4gOCkKKyNkZWZpbmUgV0VJR0hUX09GRlNFVAkJNQorI2RlZmluZSBUUkVFX1NJWkVfT0ZGU0VUCTkKKyNkZWZpbmUgVFJFRV9PRkZTRVQJCTExCisKKy8qIFRoZSBIdWZmbWFuIEVuY29kaW5nIFRyZWUgaXMgY29uc3RydWN0ZWQgb2YgdGhlc2Ugbm9kZXMuICovCit0eXBlZGVmIHN0cnVjdCB7CisJX191OAlsbGluazsJLyogU2hvcnQgdmVyc2lvbiBvZiBhYm92ZSBub2RlLiAqLworCV9fdTgJdGFnOworCV9fdTgJaW5mbzsJLyogVGhpcyBub2RlIGlzIHVzZWQgb24gZGVjb2Rlcy4gKi8KKwlfX3U4CXJsaW5rOworfSBERUNPREVfVFJFRV9OT0RFOworCisjZGVmaW5lIFJPT1QJMAkvKiBCcmFuY2ggdmFsdWUuICovCisjZGVmaW5lIExFQUYJMAkvKiBUYWcgZmllbGQgdmFsdWUuICovCisjZGVmaW5lIEJSQU5DSAkxCS8qIFRhZyBmaWVsZCB2YWx1ZS4gKi8KKworLyoKKyAqIE11bHRpY2FzdCBUYWJsZSBTdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBfX3U4ICAgIGFkZHJlc3NbNl07CisgICAgICAgIF9fdTggICAgaW5zdGFuY2VfY291bnQ7Cit9IE1jVGFibGU7CisKKy8qCisgKiBGcmFnbWVudCBEZXNjcmlwdG9yIERlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBfX3U4ICAqZnJhZ21lbnRfcHRyOworICAgICAgICBfX3UzMiAgIGZyYWdtZW50X2xlbmd0aDsKK30gRnJhZ21lbnRTdHJ1Y3R1cmU7CisKKy8qCisgKiBEYXRhIEJ1ZmZlciBTdHJ1Y3R1cmUgRGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIF9fdTMyIGZyYWdtZW50X2NvdW50OworICAgICAgICBGcmFnbWVudFN0cnVjdHVyZSAgICAgICBmcmFnbWVudF9saXN0W01BWEZSQUdNRU5UU107Cit9IERhdGFCdWZmZXJTdHJ1Y3R1cmU7CisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICAgICAgICAgIF9fdTggICAgSVR5cGU7CisgICAgICAgICAgICAgICAgX191OCAgICBJU3VidHlwZTsKK30gSW50ZXJydXB0X1N0YXR1c19Xb3JkOworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IEJEQmxvY2tUeXBlIHsKKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBpbmZvOyAgICAgICAgICAgICAgICAgICAvKiAwMiAqLworICAgICAgICAgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHRyY19uZXh0X3B0cjsgICAgICAgICAgIC8qIDA2ICovCisgICAgICAgICAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgdHJjX2RhdGFfYmxvY2tfcHRyOyAgICAgLyogMTAgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoOyAgICAgICAgICAvKiAxMiAqLworCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgKmRhdGFfYmxvY2tfcHRyOyAgICAgICAgLyogMTYgKi8KKyAgICAgICAgICAgICAgICBzdHJ1Y3QgIEJEQmxvY2tUeXBlICAgICAqbmV4dF9wdHI7ICAgICAgICAgICAgICAvKiAyMCAqLworICAgICAgICAgICAgICAgIHN0cnVjdCAgQkRCbG9ja1R5cGUgICAgICpiYWNrX3B0cjsgICAgICAgICAgICAgIC8qIDI0ICovCisgICAgICAgICAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgZmlsbGVyWzhdOyAgICAgICAgICAgICAgLyogMzIgKi8KK30gQkRCbG9jazsKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCBGQ0Jsb2NrVHlwZSB7CisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgZnJhbWVfc3RhdHVzOyAgICAgICAgICAgLyogMDIgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBpbmZvOyAgICAgICAgICAgICAgICAgICAvKiAwNCAqLworICAgICAgICAgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHRyY19uZXh0X3B0cjsgICAgICAgICAgIC8qIDA4ICovCisgICAgICAgICAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgdHJjX2JkYl9wdHI7ICAgICAgICAgICAgLyogMTIgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBmcmFtZV9sZW5ndGg7ICAgICAgICAgICAvKiAxNCAqLworCisgICAgICAgICAgICAgICAgQkRCbG9jayAgICAgICAgICAgICAgICAgKmJkYl9wdHI7ICAgICAgICAgICAgICAgLyogMTggKi8KKyAgICAgICAgICAgICAgICBzdHJ1Y3QgIEZDQmxvY2tUeXBlICAgICAqbmV4dF9wdHI7ICAgICAgICAgICAgICAvKiAyMiAqLworICAgICAgICAgICAgICAgIHN0cnVjdCAgRkNCbG9ja1R5cGUgICAgICpiYWNrX3B0cjsgICAgICAgICAgICAgIC8qIDI2ICovCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgbWVtb3J5X2FsbG9jOyAgICAgICAgICAgLyogMjggKi8KKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICBmaWxsZXJbNF07ICAgICAgICAgICAgICAvKiAzMiAqLworCit9IEZDQmxvY2s7CisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgU0Jsb2NrVHlwZXsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxfRXJyb3JfQ291bnQ7CisgICAgICAgICAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVfRXJyb3JfQ291bnQ7CisgICAgICAgICAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDX0Vycm9yX0NvdW50OworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgICAgICAgICBCdXJzdF9FcnJvcl9Db3VudDsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VSVkVEX0NPVU5URVJfMDsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEX1RSQU5TX0NvdW50OworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNWX0Nvbmdlc3Rpb25fQ291bnQ7CisgICAgICAgICAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb3N0X0ZSX0Vycm9yX0NvdW50OworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJFUV9FcnJvcl9Db3VudDsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSX0NvcGllZF9FcnJvcl9Db3VudDsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VSVkVEX0NPVU5URVJfMTsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuX0Vycm9yX0NvdW50OworCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgICAgICAgICBUSV9ORElTX1JpbmdfU3RhdHVzOworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNOX1R5cGU7CisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcl9Db2RlOworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgU0Ffb2ZfTGFzdF9BTVBfU01QWzNdOworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5BWzNdOworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgVWNvZGVfVmVyc2lvbl9OdW1iZXI7CisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNfQ0hHX0luZGljYXRlOworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVJWRURfU1RBVFVTXzA7Cit9IFNCbG9jazsKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCBBQ0Jsb2NrVHlwZSB7CisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgY21kX2RvbmVfc3RhdHVzOyAgICAvKiAwMiAqLworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGNtZF9pbmZvOyAgICAgICAgICAgLyogMDQgKi8KKyAgICAgICAgICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICB0cmNfbmV4dF9wdHI7ICAgICAgICAgICAvKiAwOCAqLworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGNtZDsgICAgICAgICAgICAgICAgLyogMTAgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBzdWJjbWQ7ICAgICAgICAgICAgIC8qIDEyICovCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXRfbG87ICAgICAgICAgLyogMTQgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldF9oaTsgICAgICAgICAvKiAxNiAqLworCisgICAgICAgICAgICAgICAgc3RydWN0ICBBQ0Jsb2NrVHlwZSAgICAgKm5leHRfcHRyOyAgICAgICAgICAgICAgLyogMjAgKi8KKworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgIGZpbGxlclsxMl07ICAgICAgICAgICAgIC8qIDMyICovCit9IEFDQmxvY2s7CisKKyNkZWZpbmUgTlVNX09GX0lOVEVSUlVQVFMgICAgICAgICAgICAgICAweDIwCisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICAgICAgICAgIEludGVycnVwdF9TdGF0dXNfV29yZCAgIElTdGF0dXNbTlVNX09GX0lOVEVSUlVQVFNdOworfSBJU0Jsb2NrOworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICB2YWxpZF9jb21tYW5kOyAgICAgICAgICAvKiAwMiAqLworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGlhY2tfY29kZTsgICAgICAgICAgICAgIC8qIDA0ICovCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgcmVzdW1lX2NvbnRyb2w7ICAgICAgICAgLyogMDYgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBpbnRfbWFza19jb250cm9sOyAgICAgICAvKiAwOCAqLworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGludF9tYXNrX3N0YXRlOyAgICAgICAgIC8qIDEwICovCisKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICBmaWxsZXJbNl07ICAgICAgICAgICAgICAvKiAxNiAqLworfSBTQ0xCbG9jazsKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdAoreworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGNvbmZpZzsgICAgICAgICAgICAgICAgIC8qIDAyICovCisgICAgICAgICAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgdHJjX3NjbGJfcHRyOyAgICAgICAgICAgLyogMDYgKi8KKyAgICAgICAgICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICB0cmNfYWNiX3B0cjsgICAgICAgICAgICAvKiAxMCAqLworICAgICAgICAgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHRyY19pc2JfcHRyOyAgICAgICAgICAgIC8qIDE0ICovCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgaXNic2l6OyAgICAgICAgICAgICAgICAgLyogMTYgKi8KKworICAgICAgICAgICAgICAgIFNDTEJsb2NrICAgICAgICAgICAgICAgICpzY2xiX3B0cjsgICAgICAgICAgICAgIC8qIDIwICovCisgICAgICAgICAgICAgICAgQUNCbG9jayAgICAgICAgICAgICAgICAgKmFjYl9wdHI7ICAgICAgICAgICAgICAgLyogMjQgKi8KKyAgICAgICAgICAgICAgICBJU0Jsb2NrICAgICAgICAgICAgICAgICAqaXNiX3B0cjsgICAgICAgICAgICAgICAvKiAyOCAqLworCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgTm9uX01hY19SeF9CZGJzOyAgICAgICAgLyogMzAgREVCVUcgKi8KKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICBmaWxsZXJbMl07ICAgICAgICAgICAgICAvKiAzMiAqLworCit9IFNDR0Jsb2NrOworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0Cit7CisJX191MzIJCXRyY19zY2diX3B0cjsKKwlTQ0dCbG9jawkqc2NnYl9wdHI7Cit9IElTQ1BCbG9jazsKKyNwcmFnbWEgcGFjaygpCisKK3R5cGVkZWYgc3RydWN0IG5ldF9sb2NhbCB7CisJSVNDUEJsb2NrICAgICAgICppc2NwYl9wdHI7CisgICAgICAgIFNDR0Jsb2NrICAgICAgICAqc2NnYl9wdHI7CisgICAgICAgIFNDTEJsb2NrICAgICAgICAqc2NsYl9wdHI7CisgICAgICAgIElTQmxvY2sgICAgICAgICAqaXNiX3B0cjsKKworCUFDQmxvY2sgICAgICAgICAqYWNiX2hlYWQ7CisgICAgICAgIEFDQmxvY2sgICAgICAgICAqYWNiX2N1cnI7CisgICAgICAgIEFDQmxvY2sgICAgICAgICAqYWNiX25leHQ7CisKKwlfX3U4CQlhZGFwdGVyX25hbWVbMTJdOworCisJX191MTYJCW51bV9yeF9iZGJzCVtOVU1fUlhfUVNfVVNFRF07CisJX191MTYJCW51bV9yeF9mY2JzCVtOVU1fUlhfUVNfVVNFRF07CisKKwlfX3UxNgkJbnVtX3R4X2JkYnMJW05VTV9UWF9RU19VU0VEXTsKKwlfX3UxNgkJbnVtX3R4X2ZjYnMJW05VTV9UWF9RU19VU0VEXTsKKworCV9fdTE2CQludW1fb2ZfdHhfYnVmZnM7CisKKwlfX3UxNgkJdHhfYnVmZl9zaXplCVtOVU1fVFhfUVNfVVNFRF07CisJX191MTYJCXR4X2J1ZmZfdXNlZAlbTlVNX1RYX1FTX1VTRURdOworCV9fdTE2CQl0eF9xdWV1ZV9zdGF0dXMJW05VTV9UWF9RU19VU0VEXTsKKworCUZDQmxvY2sJCSp0eF9mY2JfaGVhZFtOVU1fVFhfUVNfVVNFRF07CisJRkNCbG9jawkJKnR4X2ZjYl9jdXJyW05VTV9UWF9RU19VU0VEXTsKKwlGQ0Jsb2NrCQkqdHhfZmNiX2VuZFtOVU1fVFhfUVNfVVNFRF07CisJQkRCbG9jawkJKnR4X2JkYl9oZWFkW05VTV9UWF9RU19VU0VEXTsKKwlfX3UxNgkJKnR4X2J1ZmZfaGVhZFtOVU1fVFhfUVNfVVNFRF07CisJX191MTYJCSp0eF9idWZmX2VuZFtOVU1fVFhfUVNfVVNFRF07CisJX191MTYJCSp0eF9idWZmX2N1cnJbTlVNX1RYX1FTX1VTRURdOworCV9fdTE2CQludW1fdHhfZmNic191c2VkW05VTV9UWF9RU19VU0VEXTsKKworCUZDQmxvY2sJCSpyeF9mY2JfaGVhZFtOVU1fUlhfUVNfVVNFRF07CisJRkNCbG9jawkJKnJ4X2ZjYl9jdXJyW05VTV9SWF9RU19VU0VEXTsKKwlCREJsb2NrCQkqcnhfYmRiX2hlYWRbTlVNX1JYX1FTX1VTRURdOworCUJEQmxvY2sJCSpyeF9iZGJfY3VycltOVU1fUlhfUVNfVVNFRF07CisJQkRCbG9jawkJKnJ4X2JkYl9lbmRbTlVNX1JYX1FTX1VTRURdOworCV9fdTE2CQkqcnhfYnVmZl9oZWFkW05VTV9SWF9RU19VU0VEXTsKKwlfX3UxNgkJKnJ4X2J1ZmZfZW5kW05VTV9SWF9RU19VU0VEXTsKKworCV9fdTMyCQkqcHRyX2xvY2FsX3JpbmdfbnVtOworCisJX191MzIJCXNoX21lbV91c2VkOworCisJX191MTYJCXBhZ2Vfb2Zmc2V0X21hc2s7CisKKwlfX3UxNgkJYXV0aG9yaXplZF9mdW5jdGlvbl9jbGFzc2VzOworCV9fdTE2CQlhdXRob3JpemVkX2FjY2Vzc19wcmlvcml0eTsKKworICAgICAgICBfX3UxNiAgICAgICAgICAgIG51bV9hY2JzOworICAgICAgICBfX3UxNiAgICAgICAgICAgIG51bV9hY2JzX3VzZWQ7CisgICAgICAgIF9fdTE2ICAgICAgICAgICAgYWNiX3BlbmRpbmc7CisKKwlfX3UxNgkJY3VycmVudF9pc2JfaW5kZXg7CisKKwlfX3U4ICAgICAgICAgICAgbW9uaXRvcl9zdGF0ZTsKKwlfX3U4CQltb25pdG9yX3N0YXRlX3JlYWR5OworCV9fdTE2CQlyaW5nX3N0YXR1czsKKwlfX3U4CQlyaW5nX3N0YXR1c19mbGFnczsKKwlfX3U4CQljdXJyZW50X3Jpbmdfc3RhdHVzOworCV9fdTgJCXN0YXRlOworCisJX191OAkJam9pbl9zdGF0ZTsKKworCV9fdTgJCXNsb3RfbnVtOworCV9fdTE2CQlwb3NfaWQ7CisKKwlfX3UzMgkJKnB0cl91bmE7CisJX191MzIJCSpwdHJfYmNuX3R5cGU7CisJX191MzIJCSpwdHJfdHhfZmlmb191bmRlcnJ1bnM7CisJX191MzIJCSpwdHJfcnhfZmlmb191bmRlcnJ1bnM7CisJX191MzIJCSpwdHJfcnhfZmlmb19vdmVycnVuczsKKwlfX3UzMgkJKnB0cl90eF9maWZvX292ZXJydW5zOworCV9fdTMyCQkqcHRyX3R4X2ZjYl9vdmVycnVuczsKKwlfX3UzMgkJKnB0cl9yeF9mY2Jfb3ZlcnJ1bnM7CisJX191MzIJCSpwdHJfdHhfYmRiX292ZXJydW5zOworCV9fdTMyCQkqcHRyX3J4X2JkYl9vdmVycnVuczsKKworCV9fdTE2CQlyZWNlaXZlX3F1ZXVlX251bWJlcjsKKworCV9fdTgJCXJ4X2ZpZm9fb3ZlcnJ1bl9jb3VudDsKKwlfX3U4CQl0eF9maWZvX292ZXJydW5fY291bnQ7CisKKwlfX3UxNiAgICAgICAgICAgIGFkYXB0ZXJfZmxhZ3M7CisJX191MTYJCWFkYXB0ZXJfZmxhZ3MxOworCV9fdTE2ICAgICAgICAgICAgKm1pc2NfY29tbWFuZF9kYXRhOworCV9fdTE2ICAgICAgICAgICAgbWF4X3BhY2tldF9zaXplOworCisJX191MTYgICAgICAgICAgICBjb25maWdfd29yZDA7CisgICAgICAgIF9fdTE2ICAgICAgICAgICAgY29uZmlnX3dvcmQxOworCisJX191OCAgICAgICAgICAgIHRyY19tYXNrOworCisJX191MTYgICAgICAgICAgICBzb3VyY2VfcmluZ19udW1iZXI7CisgICAgICAgIF9fdTE2ICAgICAgICAgICAgdGFyZ2V0X3JpbmdfbnVtYmVyOworCisJX191MTYJCW1pY3JvY29kZV92ZXJzaW9uOworCisJX191MTYgICAgICAgICAgICBiaWNfdHlwZTsKKyAgICAgICAgX191MTYgICAgICAgICAgICBuaWNfdHlwZTsKKyAgICAgICAgX191MTYgICAgICAgICAgICBib2FyZF9pZDsKKworCV9fdTE2ICAgICAgICAgICAgcm9tX3NpemU7CisJX191MzIJCXJvbV9iYXNlOworICAgICAgICBfX3UxNiAgICAgICAgICAgIHJhbV9zaXplOworICAgICAgICBfX3UxNiAgICAgICAgICAgIHJhbV91c2FibGU7CisJX191MzIJCXJhbV9iYXNlOworCV9fdTMyCQlyYW1fYWNjZXNzOworCisJX191MTYgICAgICAgICAgICBleHRyYV9pbmZvOworICAgICAgICBfX3UxNiAgICAgICAgICAgIG1vZGVfYml0czsKKwlfX3UxNgkJbWVkaWFfbWVudTsKKwlfX3UxNgkJbWVkaWFfdHlwZTsKKwlfX3UxNgkJYWRhcHRlcl9idXM7CisKKwlfX3UxNgkJc3RhdHVzOworCV9fdTE2ICAgICAgICAgICAgcmVjZWl2ZV9tYXNrOworCisJX191MTYgICAgICAgICAgICBncm91cF9hZGRyZXNzXzA7CisgICAgICAgIF9fdTE2ICAgICAgICAgICAgZ3JvdXBfYWRkcmVzc1syXTsKKyAgICAgICAgX191MTYgICAgICAgICAgICBmdW5jdGlvbmFsX2FkZHJlc3NfMDsKKyAgICAgICAgX191MTYgICAgICAgICAgICBmdW5jdGlvbmFsX2FkZHJlc3NbMl07CisgICAgICAgIF9fdTE2ICAgICAgICAgICAgYml0d2lzZV9ncm91cF9hZGRyZXNzWzJdOworCisJX191OCAgICAgICAgICAgICpwdHJfdWNvZGU7CisKKwlfX3U4CQljbGVhbnVwOworCisJc3RydWN0IHNrX2J1ZmZfaGVhZCBTZW5kU2tiUXVldWU7CisgICAgICAgIF9fdTE2IFF1ZXVlU2tiOworCisJc3RydWN0IHRyX3N0YXRpc3RpY3MgTWFjU3RhdDsgICAvKiBNQUMgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgKi8KKwkKKwlzcGlubG9ja190CWxvY2s7Cit9IE5FVF9MT0NBTDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU05NUC1PTi1CT0FSRCBBZ2VudCBMaW5rIFN0cnVjdHVyZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBfX3U4ICAgICAgICAgICBMbmtTaWdTdHJbMTJdOyAvKiBzaWduYXR1cmUgc3RyaW5nICJTbWNMaW5rVGFibGUiICovCisgICAgICAgIF9fdTggICAgICAgICAgIExua0RydlR5cDsgICAgIC8qIDE9UmVkYm94IE9ESSwgMj1PREkgRE9TLCAzPU9ESSBPUy8yLCA0PU5ESVMgRE9TICovCisgICAgICAgIF9fdTggICAgICAgICAgIExua0ZsZzsgICAgICAgIC8qIDAgaWYgbm8gYWdlbnQgbGlua2VkLCAxIGlmIGFnZW50IGxpbmtlZCAqLworICAgICAgICB2b2lkICAgICAgICAgICAqTG5rTmZvOyAgICAgICAvKiByb3V0aW5lIHdoaWNoIHJldHVybnMgcG9pbnRlciB0byBOSUMgaW5mbyAqLworICAgICAgICB2b2lkICAgICAgICAgICAqTG5rQWd0UmN2OyAgICAvKiBwb2ludGVyIHRvIGFnZW50IHJlY2VpdmUgdHJhcCBlbnRyeSAqLworICAgICAgICB2b2lkICAgICAgICAgICAqTG5rQWd0WG10OyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYWdlbnQgdHJhbnNtaXQgdHJhcAorZW50cnkgICovCit2b2lkICAgICAgICAgICAqTG5rR2V0OyAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gTklDIHJlY2VpdmUgZGF0YQorY29weSByb3V0aW5lICovCisgICAgICAgIHZvaWQgICAgICAgICAgICpMbmtTbmQ7ICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBOSUMgc2VuZCByb3V0aW5lCisqLworICAgICAgICB2b2lkICAgICAgICAgICAqTG5rUnN0OyAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gTklDIGRyaXZlciByZXNldAorcm91dGluZSAqLworICAgICAgICB2b2lkICAgICAgICAgICAqTG5rTWliOyAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gTUlCIGRhdGEgYmFzZSAqLworICAgICAgICB2b2lkICAgICAgICAgICAqTG5rTWliQWN0OyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gTUlCIGFjdGlvbiByb3V0aW5lIGxpc3QgKi8KKyAgICAgICAgX191MTYgICAgICAgICAgIExua0NudE9mZnNldDsgIC8qIG9mZnNldCB0byBlcnJvciBjb3VudGVycyAqLworICAgICAgICBfX3UxNiAgICAgICAgICAgTG5rQ250TnVtOyAgICAgLyogbnVtYmVyIG9mIGVycm9yIGNvdW50ZXJzICovCisgICAgICAgIF9fdTE2ICAgICAgICAgICBMbmtDbnRTaXplOyAgICAvKiBzaXplIG9mIGVycm9yIGNvdW50ZXJzIGkuZS4gMzIgPSAzMiBiaXRzICovCisgICAgICAgIHZvaWQgICAgICAgICAgICpMbmtJU1I7ICAgICAgIC8qIHBvaW50ZXIgdG8gaW50ZXJydXB0IHZlY3RvciAqLworICAgICAgICBfX3U4ICAgICAgICAgICBMbmtGcm1UeXA7ICAgICAvKiAxPUV0aGVybmV0LCAyPVRva2VuIFJpbmcgKi8KKyAgICAgICAgX191OCAgICAgICAgICAgTG5rRHJ2VmVyMSA7ICAgLyogZHJpdmVyIG1ham9yIHZlcnNpb24gKi8KKyAgICAgICAgX191OCAgICAgICAgICAgTG5rRHJ2VmVyMiA7ICAgLyogZHJpdmVyIG1pbm9yIHZlcnNpb24gKi8KK30gQWdlbnRMaW5rOworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHBjbV9jYXJkX2ZsYWdzKGJpdF9tYXBwZWQpCisgKi8KKyNkZWZpbmUgUkVHX0NPTVBMRVRFICAgMHgwMDAxCisjZGVmaW5lIElOU0VSVEVEICAgICAgIDB4MDAwMgorI2RlZmluZSBQQ0NfSU5TRVJURUQgICAweDAwMDQgICAgICAgICAvKiAxPWN1cnJlbnRseSBpbnNlcnRlZCwgMD1jdXIgcmVtb3ZlZCAqLworCisvKgorICogQWRhcHRlciBSQU0gdGVzdCBwYXR0ZXJucworICovCisjZGVmaW5lIFJBTV9QQVRURVJOXzEgIDB4NTVBQQorI2RlZmluZSBSQU1fUEFUVEVSTl8yICAweDkyNDkKKyNkZWZpbmUgUkFNX1BBVFRFUk5fMyAgMHhEQjZECisKKy8qCisgKiBkZWZpbml0aW9ucyBmb3IgUkFNIHRlc3QKKyAqLworI2RlZmluZSBST01fU0lHTkFUVVJFICAweEFBNTUKKyNkZWZpbmUgTUlOX1JPTV9TSVpFICAgMHgyMDAwCisKKy8qCisgKiBSZXR1cm4gQ29kZXMKKyAqLworI2RlZmluZSBTVUNDRVNTICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQURBUFRFUl9BTkRfQ09ORklHICAgICAgMHgwMDAxCisjZGVmaW5lIEFEQVBURVJfTk9fQ09ORklHICAgICAgIDB4MDAwMgorI2RlZmluZSBOT1RfTVlfSU5URVJSVVBUICAgICAgICAweDAwMDMKKyNkZWZpbmUgRlJBTUVfUkVKRUNURUQgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEVWRU5UU19ESVNBQkxFRCAgICAgICAgIDB4MDAwNQorI2RlZmluZSBPVVRfT0ZfUkVTT1VSQ0VTICAgICAgICAweDAwMDYKKyNkZWZpbmUgSU5WQUxJRF9QQVJBTUVURVIgICAgICAgMHgwMDA3CisjZGVmaW5lIElOVkFMSURfRlVOQ1RJT04gICAgICAgIDB4MDAwOAorI2RlZmluZSBJTklUSUFMSVpFX0ZBSUxFRCAgICAgICAweDAwMDkKKyNkZWZpbmUgQ0xPU0VfRkFJTEVEICAgICAgICAgICAgMHgwMDBBCisjZGVmaW5lIE1BWF9DT0xMSVNJT05TICAgICAgICAgIDB4MDAwQgorI2RlZmluZSBOT19TVUNIX0RFU1RJTkFUSU9OICAgICAweDAwMEMKKyNkZWZpbmUgQlVGRkVSX1RPT19TTUFMTF9FUlJPUiAgMHgwMDBECisjZGVmaW5lIEFEQVBURVJfQ0xPU0VEICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBVQ09ERV9OT1RfUFJFU0VOVCAgICAgICAweDAwMEYKKyNkZWZpbmUgRklGT19VTkRFUlJVTiAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIERFU1RfT1VUX09GX1JFU09VUkNFUyAgIDB4MDAxMQorI2RlZmluZSBBREFQVEVSX05PVF9JTklUSUFMSVpFRCAweDAwMTIKKyNkZWZpbmUgUEVORElORyAgICAgICAgICAgICAgICAgMHgwMDEzCisjZGVmaW5lIFVDT0RFX1BSRVNFTlQgICAgICAgICAgIDB4MDAxNAorI2RlZmluZSBOT1RfSU5JVF9CWV9CUklER0UgICAgICAweDAwMTUKKworI2RlZmluZSBPUEVOX0ZBSUxFRCAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgSEFSRFdBUkVfRkFJTEVEICAgICAgICAgMHgwMDgxCisjZGVmaW5lIFNFTEZfVEVTVF9GQUlMRUQgICAgICAgIDB4MDA4MgorI2RlZmluZSBSQU1fVEVTVF9GQUlMRUQgICAgICAgICAweDAwODMKKyNkZWZpbmUgUkFNX0NPTkZMSUNUICAgICAgICAgICAgMHgwMDg0CisjZGVmaW5lIFJPTV9DT05GTElDVCAgICAgICAgICAgIDB4MDA4NQorI2RlZmluZSBVTktOT1dOX0FEQVBURVIgICAgICAgICAweDAwODYKKyNkZWZpbmUgQ09ORklHX0VSUk9SICAgICAgICAgICAgMHgwMDg3CisjZGVmaW5lIENPTkZJR19XQVJOSU5HICAgICAgICAgIDB4MDA4OAorI2RlZmluZSBOT19GSVhFRF9DTkZHICAgICAgICAgICAweDAwODkKKyNkZWZpbmUgRUVST01fQ0tTVU1fRVJST1IgICAgICAgMHgwMDhBCisjZGVmaW5lIFJPTV9TSUdOQVRVUkVfRVJST1IgICAgIDB4MDA4QgorI2RlZmluZSBST01fQ0hFQ0tTVU1fRVJST1IgICAgICAweDAwOEMKKyNkZWZpbmUgUk9NX1NJWkVfRVJST1IgICAgICAgICAgMHgwMDhECisjZGVmaW5lIFVOU1VQUE9SVEVEX05JQ19DSElQICAgIDB4MDA4RQorI2RlZmluZSBOSUNfUkVHX0VSUk9SICAgICAgICAgICAweDAwOEYKKyNkZWZpbmUgQklDX1JFR19FUlJPUiAgICAgICAgICAgMHgwMDkwCisjZGVmaW5lIE1JQ1JPQ09ERV9URVNUX0VSUk9SICAgIDB4MDA5MQorI2RlZmluZSBMT0JFX01FRElBX1RFU1RfRkFJTEVEICAweDAwOTIKKworI2RlZmluZSBBREFQVEVSX0ZPVU5EX0xBTl9DT1JSVVBUIDB4MDA5QgorCisjZGVmaW5lIEFEQVBURVJfTk9UX0ZPVU5EICAgICAgIDB4RkZGRgorCisjZGVmaW5lIElMTEVHQUxfRlVOQ1RJT04gICAgICAgIElOVkFMSURfRlVOQ1RJT04KKworLyogRXJyb3JzICovCisjZGVmaW5lIElPX0JBU0VfSU5WQUxJRCAgICAgICAgIDB4MDAwMQorI2RlZmluZSBJT19CQVNFX1JBTkdFICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgSVJRX0lOVkFMSUQgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIElSUV9SQU5HRSAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBSQU1fQkFTRV9JTlZBTElEICAgICAgICAweDAwMTAKKyNkZWZpbmUgUkFNX0JBU0VfUkFOR0UgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFJBTV9TSVpFX1JBTkdFICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBNRURJQV9JTlZBTElEICAgICAgICAgICAweDA4MDAKKworLyogV2FybmluZ3MgKi8KKyNkZWZpbmUgSVJRX01JU01BVENIICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFJBTV9CQVNFX01JU01BVENIICAgICAgIDB4MDEwMAorI2RlZmluZSBSQU1fU0laRV9NSVNNQVRDSCAgICAgICAweDAyMDAKKyNkZWZpbmUgQlVTX01PREVfTUlTTUFUQ0ggICAgICAgMHgwNDAwCisKKyNkZWZpbmUgUlhfQ1JDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUlhfQUxJR05NRU5UX0VSUk9SICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFJYX0hXX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIGZpZWxkIFJJTkdfU1RBVFVTX0ZMQUdTCisgKi8KKyNkZWZpbmUgUklOR19TVEFUVVNfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgIDBYMDEKKyNkZWZpbmUgTU9OSVRPUl9TVEFURV9DSEFOR0VEICAgICAgICAgICAgICAgICAgIDBYMDIKKyNkZWZpbmUgSk9JTl9TVEFURV9DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgIDBYMDQKKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgZmllbGQgSk9JTl9TVEFURQorICovCisjZGVmaW5lIEpTX0JZUEFTU19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEpTX0xPQkVfVEVTVF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEpTX0RFVEVDVF9NT05JVE9SX1BSRVNFTlRfU1RBVEUgICAgICAgICAweDAyCisjZGVmaW5lIEpTX0FXQUlUX05FV19NT05JVE9SX1NUQVRFICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEpTX0RVUExJQ0FURV9BRERSRVNTX1RFU1RfU1RBVEUgICAgICAgICAweDA0CisjZGVmaW5lIEpTX05FSUdIQk9SX05PVElGSUNBVElPTl9TVEFURSAgICAgICAgICAweDA1CisjZGVmaW5lIEpTX1JFUVVFU1RfSU5JVElBTElaQVRJT05fU1RBVEUgICAgICAgICAweDA2CisjZGVmaW5lIEpTX0pPSU5fQ09NUExFVEVfU1RBVEUgICAgICAgICAgICAgICAgICAweDA3CisjZGVmaW5lIEpTX0JZUEFTU19XQUlUX1NUQVRFICAgICAgICAgICAgICAgICAgICAweDA4CisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIGZpZWxkIE1PTklUT1JfU1RBVEUKKyAqLworI2RlZmluZSBNU19NT05JVE9SX0ZTTV9JTkFDVElWRSAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBNU19SRVBFQVRfQkVBQ09OX1NUQVRFICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBNU19SRVBFQVRfQ0xBSU1fVE9LRU5fU1RBVEUgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBNU19UUkFOU01JVF9DTEFJTV9UT0tFTl9TVEFURSAgICAgICAgICAgMHgwMworI2RlZmluZSBNU19TVEFOREJZX01PTklUT1JfU1RBVEUgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBNU19UUkFOU01JVF9CRUFDT05fU1RBVEUgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBNU19BQ1RJVkVfTU9OSVRPUl9TVEFURSAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBNU19UUkFOU01JVF9SSU5HX1BVUkdFX1NUQVRFICAgICAgICAgICAgMHgwNworI2RlZmluZSBNU19CRUFDT05fVEVTVF9TVEFURSAgICAgICAgICAgICAgICAgICAgMHgwOQorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBiaXQtZmllbGQgUklOR19TVEFUVVMKKyAqLworI2RlZmluZSBTSUdOQUxfTE9TUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIEhBUkRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgU09GVF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBUUkFOU01JVF9CRUFDT04gICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIExPQkVfV0lSRV9GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgQVVUT19SRU1PVkFMX0VSUk9SICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBSRU1PVkVfUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIENPVU5URVJfT1ZFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgU0lOR0xFX1NUQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBSSU5HX1JFQ09WRVJZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIGZpZWxkIEJVU19UWVBFCisgKi8KKyNkZWZpbmUgQVRfQlVTICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBNQ0FfQlVTICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEVJU0FfQlVTICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUENJX0JVUyAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBQQ01DSUFfQlVTICAgICAgICAgICAgICAweDA0CisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgYWRhcHRlcl9mbGFncworICovCisjZGVmaW5lIFJYX1ZBTElEX0xPT0tBSEVBRCAgICAgIDB4MDAwMQorI2RlZmluZSBGT1JDRURfMTZCSVRfTU9ERSAgICAgICAweDAwMDIKKyNkZWZpbmUgQURBUFRFUl9ESVNBQkxFRCAgICAgICAgMHgwMDA0CisjZGVmaW5lIFRSQU5TTUlUX0NIQUlOX0lOVCAgICAgIDB4MDAwOAorI2RlZmluZSBFQVJMWV9SWF9GUkFNRSAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgRUFSTFlfVFggICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIEVBUkxZX1JYX0NPUFkgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBVU0VTX1BIWVNJQ0FMX0FERFIgICAgICAweDAwODAJCS8qIFJzdmQgZm9yIERFQyBQQ0kgYW5kIDkyMzIgKi8KKyNkZWZpbmUgTkVFRFNfUEhZU0lDQUxfQUREUiAgCTB4MDEwMCAgICAgICAJLyogUmVzZXJ2ZWQqLworI2RlZmluZSBSWF9TVEFUVVNfUEVORElORyAgICAgICAweDAyMDAKKyNkZWZpbmUgRVJYX0RJU0FCTEVEICAgICAgICAgCTB4MDQwMCAgICAgICAJLyogRUFSTFlfUlhfRU5BQkxFIHJjdl9tYXNrICovCisjZGVmaW5lIEVOQUJMRV9UWF9QRU5ESU5HICAgICAgIDB4MDgwMAorI2RlZmluZSBFTkFCTEVfUlhfUEVORElORyAgICAgICAweDEwMDAKKyNkZWZpbmUgUEVSTV9DTE9TRSAgICAgICAgICAgICAgMHgyMDAwICAKKyNkZWZpbmUgSU9fTUFQUEVEICAgICAgICAgICAgICAgMHg0MDAwICAJLyogSU9tYXBwZWQgYnVzIGludGVyZmFjZSA3OTUgKi8KKyNkZWZpbmUgRVRYX0RJU0FCTEVEICAgICAgICAgICAgMHg4MDAwCisKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBhZGFwdGVyX2ZsYWdzMQorICovCisjZGVmaW5lIFRYX1BIWV9SWF9WSVJUICAgICAgICAgIDB4MDAwMSAKKyNkZWZpbmUgTkVFRFNfSE9TVF9SQU0gICAgICAgICAgMHgwMDAyCisjZGVmaW5lIE5FRURTX01FRElBX1RZUEUgICAgICAgIDB4MDAwNAorI2RlZmluZSBFQVJMWV9SWF9ET05FICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgUE5QX0JPT1RfQklUICAgICAgICAgICAgMHgwMDEwICAvKiBhY3RpdmF0ZXMgUG5QICYgY29uZmlnIG9uIHBvd2VyLXVwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgPT4gcmVndWxhciBQblAgb3BlcmF0aW9uICovCisjZGVmaW5lIFBOUF9FTkFCTEUgICAgICAgICAgICAgIDB4MDAyMCAgLyogcmVndWxhciBQblAgb3BlcmF0aW9uIGNsZWFyID0+ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gUG5QLCBvdmVycmlkZXMgUE5QX0JPT1RfQklUICovCisjZGVmaW5lIFNBVFVSTl9FTkFCTEUgICAgICAgICAgIDB4MDA0MAorCisjZGVmaW5lIEFEQVBURVJfUkVNT1ZBQkxFICAgICAgIDB4MDA4MCAJLyogYWRhcHRlciBpcyBob3Qgc3dhcHBhYmxlICovCisjZGVmaW5lIFRYX1BIWSAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogVXNlcyBwaHlzaWNhbCBhZGRyZXNzIGZvciB0eCBidWZzICovCisjZGVmaW5lIFJYX1BIWSAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogVXNlcyBwaHlzaWNhbCBhZGRyZXNzIGZvciByeCBidWZzICovCisjZGVmaW5lIFRYX1ZJUlQgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogVXNlcyB2aXJ0dWFsIGFkZHIgZm9yIHR4IGJ1ZnMgKi8KKyNkZWZpbmUgUlhfVklSVCAgICAgICAgICAgICAgICAgMHgwODAwIAorI2RlZmluZSBORUVEU19TRVJWSUNFICAgICAgICAgICAweDEwMDAgCisKKy8qCisgKiBBZGFwdGVyIFN0YXR1cyBDb2RlcworICovCisjZGVmaW5lIE9QRU4gICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBJTklUSUFMSVpFRCAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgQ0xPU0VEICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEZBSUxFRCAgICAgICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBOT1RfSU5JVElBTElaRUQgICAgICAgICAweDAwMDYKKyNkZWZpbmUgSU9fQ09ORkxJQ1QgICAgICAgICAgICAgMHgwMDA3CisjZGVmaW5lIENBUkRfUkVNT1ZFRCAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBDQVJEX0lOU0VSVEVEICAgICAgICAgICAweDAwMDkKKworLyoKKyAqIE1vZGUgQml0IERlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgSU5URVJSVVBUX1NUQVRVU19CSVQgICAgMHg4MDAwICAvKiBQQyBJbnRlcnJ1cHQgTGluZTogMCA9IE5vdCBFbmFibGVkICovCisjZGVmaW5lIEJPT1RfU1RBVFVTX01BU0sgICAgICAgIDB4NjAwMCAgLyogTWFzayB0byBpc29sYXRlIEJPT1RfU1RBVFVTICovCisjZGVmaW5lIEJPT1RfSU5ISUJJVCAgICAgICAgICAgIDB4MDAwMCAgLyogQk9PVF9TVEFUVVMgaXMgJ2luaGliaXRlZCcgKi8KKyNkZWZpbmUgQk9PVF9UWVBFXzEgICAgICAgICAgICAgMHgyMDAwICAvKiBVbnVzZWQgQk9PVF9TVEFUVVMgdmFsdWUgKi8KKyNkZWZpbmUgQk9PVF9UWVBFXzIgICAgICAgICAgICAgMHg0MDAwICAvKiBVbnVzZWQgQk9PVF9TVEFUVVMgdmFsdWUgKi8KKyNkZWZpbmUgQk9PVF9UWVBFXzMgICAgICAgICAgICAgMHg2MDAwICAvKiBVbnVzZWQgQk9PVF9TVEFUVVMgdmFsdWUgKi8KKyNkZWZpbmUgWkVST19XQUlUX1NUQVRFX01BU0sgICAgMHgxODAwICAvKiBNYXNrIHRvIGlzb2xhdGUgV2FpdCBTdGF0ZSBmbGFncyAqLworI2RlZmluZSBaRVJPX1dBSVRfU1RBVEVfOF9CSVQgICAweDEwMDAgIC8qIDAgPSBEaXNhYmxlZCAoSW5zZXJ0cyBXYWl0IFN0YXRlcykgKi8KKyNkZWZpbmUgWkVST19XQUlUX1NUQVRFXzE2X0JJVCAgMHgwODAwICAvKiAwID0gRGlzYWJsZWQgKEluc2VydHMgV2FpdCBTdGF0ZXMpICovCisjZGVmaW5lIExPT1BJTkdfTU9ERV9NQVNLICAgICAgIDB4MDAwNworI2RlZmluZSBMT09QQkFDS19NT0RFXzAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgTE9PUEJBQ0tfTU9ERV8xICAgICAgICAgMHgwMDAxCisjZGVmaW5lIExPT1BCQUNLX01PREVfMiAgICAgICAgIDB4MDAwMgorI2RlZmluZSBMT09QQkFDS19NT0RFXzMgICAgICAgICAweDAwMDMKKyNkZWZpbmUgTE9PUEJBQ0tfTU9ERV80ICAgICAgICAgMHgwMDA0CisjZGVmaW5lIExPT1BCQUNLX01PREVfNSAgICAgICAgIDB4MDAwNQorI2RlZmluZSBMT09QQkFDS19NT0RFXzYgICAgICAgICAweDAwMDYKKyNkZWZpbmUgTE9PUEJBQ0tfTU9ERV83ICAgICAgICAgMHgwMDA3CisjZGVmaW5lIEFVVE9fTUVESUFfREVURUNUICAgICAgIDB4MDAwOAorI2RlZmluZSBNQU5VQUxfQ1JDICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgRUFSTFlfVE9LRU5fUkVMICAgICAgICAgMHgwMDIwICAvKiBFYXJseSBUb2tlbiBSZWxlYXNlIGZvciBUb2tlbiBSaW5nICovCisjZGVmaW5lIFVNQUMgICAgICAgICAgICAgICAweDAwNDAgCisjZGVmaW5lIFVUUDJfUE9SVCAgICAgICAgICAgICAgIDB4MDA4MCAgLyogRm9yIDgyMTZUMiwgMD1wb3J0IEEsIDE9UG9ydCBCLiAqLworI2RlZmluZSBCTkNfMTBCVF9JTlRFUkZBQ0UgICAgICAweDA2MDAgIC8qIEJOQyBhbmQgVVRQIGN1cnJlbnQgbWVkaWEgc2V0ICovCisjZGVmaW5lIFVUUF9JTlRFUkZBQ0UgICAgICAgICAgIDB4MDUwMCAgLyogRXRoZXJuZXQgVVRQIE9ubHkuICovCisjZGVmaW5lIEJOQ19JTlRFUkZBQ0UgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBBVUlfSU5URVJGQUNFICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgQVVJXzEwQlRfSU5URVJGQUNFICAgICAgMHgwMjAwCisjZGVmaW5lIFNUQVJMQU5fMTBfSU5URVJGQUNFICAgIDB4MDEwMAorI2RlZmluZSBJTlRFUkZBQ0VfVFlQRV9NQVNLICAgICAweDA3MDAKKworLyoKKyAqIE1lZGlhIFR5cGUgQml0IERlZmluaXRpb25zCisgKgorICogbGVnZW5kOiAgICAgIFRQID0gVHdpc3RlZCBQYWlyCisgKiAgICAgICAgICAgICAgU1RQID0gU2hpZWxkZWQgdHdpc3RlZCBwYWlyCisgKiAgICAgICAgICAgICAgVVRQID0gVW5zaGllbGRlZCB0d2lzdGVkIHBhaXIKKyAqLworCisjZGVmaW5lIENORkdfTUVESUFfVFlQRV9NQVNLICAgIDB4MDAxZSAgLyogUE9TIFJlZ2lzdGVyIDMgTWFzayAgICAgICAgICovCisKKyNkZWZpbmUgTUVESUFfUzEwICAgICAgICAgICAgICAgMHgwMDAwICAvKiBFdGhlcm5ldCBhZGFwdGVyLCBUUC4gICAgICAgICovCisjZGVmaW5lIE1FRElBX0FVSV9VVFAgICAgICAgICAgIDB4MDAwMSAgLyogRXRoZXJuZXQgYWRhcHRlciwgQVVJL1VUUCBtZWRpYSAqLworI2RlZmluZSBNRURJQV9CTkMgICAgICAgICAgICAgICAweDAwMDIgIC8qIEV0aGVybmV0IGFkYXB0ZXIsIEJOQyBtZWRpYS4gKi8KKyNkZWZpbmUgTUVESUFfQVVJICAgICAgICAgICAgICAgMHgwMDAzICAvKiBFdGhlcm5ldCBBZGFwdGVyLCBBVUkgbWVkaWEuICovCisjZGVmaW5lIE1FRElBX1NUUF8xNiAgICAgICAgICAgIDB4MDAwNCAgLyogVG9rZW5SaW5nIGFkYXAsIDE2TWJpdCBTVFAuICAqLworI2RlZmluZSBNRURJQV9TVFBfNCAgICAgICAgICAgICAweDAwMDUgIC8qIFRva2VuUmluZyBhZGFwLCA0TWJpdCBTVFAuICAgKi8KKyNkZWZpbmUgTUVESUFfVVRQXzE2ICAgICAgICAgICAgMHgwMDA2ICAvKiBUb2tlblJpbmcgYWRhcCwgMTZNYml0IFVUUC4gICovCisjZGVmaW5lIE1FRElBX1VUUF80ICAgICAgICAgICAgIDB4MDAwNyAgLyogVG9rZW5SaW5nIGFkYXAsIDRNYml0IFVUUC4gICAqLworI2RlZmluZSBNRURJQV9VVFAgICAgICAgICAgICAgICAweDAwMDggIC8qIEV0aGVybmV0IGFkYXB0ZXIsIFVUUCBtZWRpYSAobm8gQVVJKQorKi8KKyNkZWZpbmUgTUVESUFfQk5DX1VUUCAgICAgICAgICAgMHgwMDEwICAvKiBFdGhlcm5ldCBhZGFwdGVyLCBCTkMvVVRQIG1lZGlhICovCisjZGVmaW5lIE1FRElBX1VUUEZEICAgICAgICAgICAgIDB4MDAxMSAgLyogRXRoZXJuZXQgYWRhcHRlciwgVFAgZnVsbCBkdXBsZXggKi8KKyNkZWZpbmUgTUVESUFfVVRQTkwgICAgICAgICAgICAgMHgwMDEyICAvKiBFdGhlcm5ldCBhZGFwdGVyLCBUUCB3aXRoIGxpbmsgaW50ZWdyaXR5IHRlc3QgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTUVESUFfQVVJX0JOQyAgICAgICAgICAgMHgwMDEzICAvKiBFdGhlcm5ldCBhZGFwdGVyLCBBVUkvQk5DIG1lZGlhICovCisjZGVmaW5lIE1FRElBX0FVSV9CTkNfVVRQICAgICAgIDB4MDAxNCAgLyogRXRoZXJuZXQgYWRhcHRlciwgQVVJX0JOQy9VVFAgKi8KKyNkZWZpbmUgTUVESUFfVVRQQSAgICAgICAgICAgICAgMHgwMDE1ICAvKiBFdGhlcm5ldCBVVFAtMTBNYnBzIFBvcnRzIEEgKi8KKyNkZWZpbmUgTUVESUFfVVRQQiAgICAgICAgICAgICAgMHgwMDE2ICAvKiBFdGhlcm5ldCBVVFAtMTBNYnBzIFBvcnRzIEIgKi8KKyNkZWZpbmUgTUVESUFfU1RQXzE2X1VUUF8xNiAgICAgMHgwMDE3ICAvKiBUb2tlbiBSaW5nIFNUUC0xNk1icHMvVVRQLTE2TWJwcyAqLworI2RlZmluZSBNRURJQV9TVFBfNF9VVFBfNCAgICAgICAweDAwMTggIC8qIFRva2VuIFJpbmcgU1RQLTRNYnBzL1VUUC00TWJwcyAqLworCisjZGVmaW5lIE1FRElBX1NUUDEwMF9VVFAxMDAgICAgIDB4MDAyMCAgLyogRXRoZXJuZXQgU1RQLTEwME1icHMvVVRQLTEwME1icHMgKi8KKyNkZWZpbmUgTUVESUFfVVRQMTAwRkQgICAgICAgICAgMHgwMDIxICAvKiBFdGhlcm5ldCBVVFAtMTAwTWJwcywgZnVsbCBkdXBsZXggKi8KKyNkZWZpbmUgTUVESUFfVVRQMTAwICAgICAgICAgICAgMHgwMDIyICAvKiBFdGhlcm5ldCBVVFAtMTAwTWJwcyAqLworCisKKyNkZWZpbmUgTUVESUFfVU5LTk9XTiAgICAgICAgICAgMHhGRkZGICAvKiBVbmtub3duIGFkYXB0ZXIvbWVkaWEgdHlwZSAgICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIGZpZWxkOgorICogbWVkaWFfdHlwZTIKKyAqLworI2RlZmluZSBNRURJQV9UWVBFX01JSSAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1FRElBX1RZUEVfVVRQICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTUVESUFfVFlQRV9CTkMgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBNRURJQV9UWVBFX0FVSSAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIE1FRElBX1RZUEVfUzEwICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgTUVESUFfVFlQRV9BVVRPX1NFTlNFICAgICAgIDB4MTAwMAorI2RlZmluZSBNRURJQV9UWVBFX0FVVE9fREVURUNUICAgICAgMHg0MDAwCisjZGVmaW5lIE1FRElBX1RZUEVfQVVUT19ORUdPVElBVEUgICAweDgwMDAKKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgZmllbGQ6CisgKiBsaW5lX3NwZWVkCisgKi8KKyNkZWZpbmUgTElORV9TUEVFRF9VTktOT1dOICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBMSU5FX1NQRUVEXzQgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIExJTkVfU1BFRURfMTAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTElORV9TUEVFRF8xNiAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBMSU5FX1NQRUVEXzEwMCAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIExJTkVfU1BFRURfVDQgICAgICAgICAgICAgICAweDAwMDggIC8qIDEwMEJhc2VUNCBhbGlhc2VkIGZvciA5MzMyQlZUICovCisjZGVmaW5lIExJTkVfU1BFRURfRlVMTF9EVVBMRVggICAgICAweDgwMDAKKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgZmllbGQ6CisgKiBiaWNfdHlwZSAoQnVzIGludGVyZmFjZSBjaGlwIHR5cGUpCisgKi8KKyNkZWZpbmUgQklDX05PX0NISVAgICAgICAgICAgICAgMHgwMDAwICAvKiBCdXMgaW50ZXJmYWNlIGNoaXAgbm90IGltcGxlbWVudGVkICovCisjZGVmaW5lIEJJQ181ODNfQ0hJUCAgICAgICAgICAgIDB4MDAwMSAgLyogODNDNTgzIGJ1cyBpbnRlcmZhY2UgY2hpcCAqLworI2RlZmluZSBCSUNfNTg0X0NISVAgICAgICAgICAgICAweDAwMDIgIC8qIDgzQzU4NCBidXMgaW50ZXJmYWNlIGNoaXAgKi8KKyNkZWZpbmUgQklDXzU4NV9DSElQICAgICAgICAgICAgMHgwMDAzICAvKiA4M0M1ODUgYnVzIGludGVyZmFjZSBjaGlwICovCisjZGVmaW5lIEJJQ181OTNfQ0hJUCAgICAgICAgICAgIDB4MDAwNCAgLyogODNDNTkzIGJ1cyBpbnRlcmZhY2UgY2hpcCAqLworI2RlZmluZSBCSUNfNTk0X0NISVAgICAgICAgICAgICAweDAwMDUgIC8qIDgzQzU5NCBidXMgaW50ZXJmYWNlIGNoaXAgKi8KKyNkZWZpbmUgQklDXzU2NF9DSElQICAgICAgICAgICAgMHgwMDA2ICAvKiBQQ01DSUEgQnVzIGludGVyZmFjZSBjaGlwICovCisjZGVmaW5lIEJJQ183OTBfQ0hJUCAgICAgICAgICAgIDB4MDAwNyAgLyogODNDNzkwIGJ1cyBpLWZhY2UvRXRoZXJuZXQgTklDIGNoaXAgKi8KKyNkZWZpbmUgQklDXzU3MV9DSElQICAgICAgICAgICAgMHgwMDA4ICAvKiA4M0M1NzEgRUlTQSBidXMgbWFzdGVyIGktZmFjZSAqLworI2RlZmluZSBCSUNfNTg3X0NISVAgICAgICAgICAgICAweDAwMDkgIC8qIFRva2VuIFJpbmcgQVQgYnVzIG1hc3RlciBpLWZhY2UgKi8KKyNkZWZpbmUgQklDXzU3NF9DSElQICAgICAgICAgICAgMHgwMDEwICAvKiBGRUFTVCBidXMgaW50ZXJmYWNlIGNoaXAgKi8KKyNkZWZpbmUgQklDXzg0MzJfQ0hJUCAgICAgICAgICAgMHgwMDExICAvKiA4NDMyIGJ1cyBpLWZhY2UvRXRoZXJuZXQgTklDKERFQyBQQ0kpICovCisjZGVmaW5lIEJJQ185MzMyX0NISVAgICAgICAgICAgIDB4MDAxMiAgLyogOTMzMiBidXMgaS1mYWNlLzEwME1icHMgRXRoZXIgTklDKERFQyBQQ0kpICovCisjZGVmaW5lIEJJQ184NDMyRV9DSElQICAgICAgICAgIDB4MDAxMyAgLyogODQzMiBFbmhhbmNlZCBidXMgaWZhY2UvRXRoZXJuZXQgTklDKERFQykgKi8KKyNkZWZpbmUgQklDX0VQSUMxMDBfQ0hJUCAgICAgICAgMHgwMDE0ICAvKiBFUElDLzEwMCAxMC8xMDAgTWJwcyBFdGhlcm5ldCBCSUMvTklDICovCisjZGVmaW5lIEJJQ19DOTRfQ0hJUCAgICAgICAgICAgIDB4MDAxNSAgLyogOTFDOTQgYnVzIGktZmFjZSBpbiBQQ01DSUEgbW9kZSAqLworI2RlZmluZSBCSUNfWDgwMjBfQ0hJUCAgICAgICAgICAweDAwMTYgIC8qIFhpbGlueCBQQ01DSUEgbXVsdGktZnVuYyBpLWZhY2UgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgZmllbGQ6CisgKiBuaWNfdHlwZSAoQnVzIGludGVyZmFjZSBjaGlwIHR5cGUpCisgKi8KKyNkZWZpbmUgTklDX1VOS19DSElQICAgICAgICAgICAgMHgwMDAwICAvKiBVbmtub3duIE5JQyBjaGlwICAgICAgKi8KKyNkZWZpbmUgTklDXzgzOTBfQ0hJUCAgICAgICAgICAgMHgwMDAxICAvKiBEUDgzOTAgRXRoZXJuZXQgTklDICAgKi8KKyNkZWZpbmUgTklDXzY5MF9DSElQICAgICAgICAgICAgMHgwMDAyICAvKiA4M0M2OTAgRXRoZXJuZXQgTklDICAgKi8KKyNkZWZpbmUgTklDXzgyNV9DSElQICAgICAgICAgICAgMHgwMDAzICAvKiA4M0M4MjUgVG9rZW4gUmluZyBOSUMgKi8KKy8qICAgICAgI2RlZmluZSBOSUNfPz8/X0NISVAgICAgMHgwMDA0ICAqLyAvKiBOb3QgdXNlZCAgICAgICAgICAgKi8KKy8qICAgICAgI2RlZmluZSBOSUNfPz8/X0NISVAgICAgMHgwMDA1ICAqLyAvKiBOb3QgdXNlZCAgICAgICAgICAgKi8KKy8qICAgICAgI2RlZmluZSBOSUNfPz8/X0NISVAgICAgMHgwMDA2ICAqLyAvKiBOb3QgdXNlZCAgICAgICAgICAgKi8KKyNkZWZpbmUgTklDXzc5MF9DSElQICAgICAgICAgICAgMHgwMDA3ICAvKiA4M0M3OTAgYnVzIGktZmFjZS9FdGhlcm5ldCBOSUMgY2hpcCAqLworI2RlZmluZSBOSUNfQzEwMF9DSElQICAgICAgICAgICAweDAwMTAgIC8qIEZFQVNUIDEwME1icHMgRXRoZXJuZXQgTklDICovCisjZGVmaW5lIE5JQ184NDMyX0NISVAgICAgICAgICAgIDB4MDAxMSAgLyogODQzMiBidXMgaS1mYWNlL0V0aGVybmV0IE5JQyhERUMgUENJKSAqLworI2RlZmluZSBOSUNfOTMzMl9DSElQICAgICAgICAgICAweDAwMTIgIC8qIDkzMzIgYnVzIGktZmFjZS8xMDBNYnBzIEV0aGVyIE5JQyhERUMgUENJKSAqLworI2RlZmluZSBOSUNfODQzMkVfQ0hJUCAgICAgICAgICAweDAwMTMgIC8qIDg0MzIgZW5oYW5jZWQgYnVzIGlmYWNlL0V0aGVybmV0IE5JQyhERUMpICovCisjZGVmaW5lIE5JQ19FUElDMTAwX0NISVAgICAgICAgIDB4MDAxNCAgIC8qIEVQSUMvMTAwIDEwLzEwMCBNYnBzIEV0aGVybmV0IEJJQy9OSUMgKi8KKyNkZWZpbmUgTklDX0M5NF9DSElQICAgICAgICAgICAgMHgwMDE1ICAvKiA5MUM5NCBQQyBDYXJkIHdpdGggbXVsdGkgZnVuYyAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBmaWVsZDoKKyAqIGFkYXB0ZXJfdHlwZSBUaGUgYWRhcHRlcl90eXBlIGZpZWxkIGRlc2NyaWJlcyB0aGUgYWRhcHRlci9idXMKKyAqICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIEJVU19JU0ExNl9UWVBFICAgICAgICAgIDB4MDAwMSAgLyogMTYgYml0IGFkYXAgaW4gMTYgYml0IChFKUlTQSBzbG90ICAqLworI2RlZmluZSBCVVNfSVNBOF9UWVBFICAgICAgICAgICAweDAwMDIgIC8qIDgvMTZiIGFkYXAgaW4gOCBiaXQgWFQvKEUpSVNBIHNsb3QgKi8KKyNkZWZpbmUgQlVTX01DQV9UWVBFICAgICAgICAgICAgMHgwMDAzICAvKiBNaWNybyBDaGFubmVsIGFkYXB0ZXIgICAgICAgICAgICAgICovCisKKy8qCisgKiBSZWNlaXZlIE1hc2sgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBBQ0NFUFRfTVVMVElDQVNUICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBBQ0NFUFRfQlJPQURDQVNUICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQUk9NSVNDVU9VU19NT0RFICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBBQ0NFUFRfU09VUkNFX1JPVVRJTkcgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBBQ0NFUFRfRVJSX1BBQ0tFVFMgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBBQ0NFUFRfQVRUX01BQ19GUkFNRVMgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBBQ0NFUFRfTVVMVElfUFJPTSAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBUUkFOU01JVF9PTkxZICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBBQ0NFUFRfRVhUX01BQ19GUkFNRVMgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBFQVJMWV9SWF9FTkFCTEUgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBQS1RfU0laRV9OT1RfTkVFREVEICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBBQ0NFUFRfU09VUkNFX1JPVVRJTkdfU1BBTk5JTkcgIDB4MDgwOAorCisjZGVmaW5lIEFDQ0VQVF9BTExfTUFDX0ZSQU1FUyAgICAgICAgICAgMHgwMTIwCisKKy8qCisgKiBjb25maWdfbW9kZSBkZWZzCisgKi8KKyNkZWZpbmUgU1RPUkVfRUVST00gICAgICAgICAgICAgMHgwMDAxICAvKiBTdG9yZSBjb25maWcgaW4gRUVST00uICovCisjZGVmaW5lIFNUT1JFX1JFR1MgICAgICAgICAgICAgIDB4MDAwMiAgLyogU3RvcmUgY29uZmlnIGluIHJlZ2lzdGVyIHNldC4gKi8KKworLyoKKyAqIGVxdWF0ZXMgZm9yIGxtYWNfZmxhZ3MgaW4gYWRhcHRlciBzdHJ1Y3R1cmUgKEV0aGVybmV0KQorICovCisjZGVmaW5lICAgICAgICAgTUVNX0RJU0FCTEUgICAgIDB4MDAwMQorI2RlZmluZSAgICAgICAgIFJYX1NUQVRVU19QT0xMICAweDAwMDIKKyNkZWZpbmUgICAgICAgICBVU0VfUkVfQklUICAgICAgMHgwMDA0CisvKiNkZWZpbmUgICAgICAgUkVTRVJWRUQgICAgICAgIDB4MDAwOCAqLworLyojZGVmaW5lICAgICAgIFJFU0VSVkVEICAgICAgICAweDAwMTAgKi8KKy8qI2RlZmluZSAgICAgICBSRVNFUlZFRCAgICAgICAgMHgwMDIwICovCisvKiNkZWZpbmUgICAgICAgUkVTRVJWRUQgICAgICAgIDB4MDA0MCAqLworLyojZGVmaW5lICAgICAgIFJFU0VSVkVEICAgICAgICAweDAwODAgKi8KKy8qI2RlZmluZSAgICAgICBSRVNFUlZFRCAgICAgICAgMHgwMTAwICovCisvKiNkZWZpbmUgICAgICAgUkVTRVJWRUQgICAgICAgIDB4MDIwMCAqLworLyojZGVmaW5lICAgICAgIFJFU0VSVkVEICAgICAgICAweDA0MDAgKi8KKy8qI2RlZmluZSAgICAgICBSRVNFUlZFRCAgICAgICAgMHgwODAwICovCisvKiNkZWZpbmUgICAgICAgUkVTRVJWRUQgICAgICAgIDB4MTAwMCAqLworLyojZGVmaW5lICAgICAgIFJFU0VSVkVEICAgICAgICAweDIwMDAgKi8KKy8qI2RlZmluZSAgICAgICBSRVNFUlZFRCAgICAgICAgMHg0MDAwICovCisvKiNkZWZpbmUgICAgICAgUkVTRVJWRUQgICAgICAgIDB4ODAwMCAqLworCisvKiBtZWRpYV9vcHRzICYgbWVkaWFfc2V0IEZpZWxkcyBiaXQgZGVmcyBmb3IgRXRoZXJuZXQgLi4uICovCisjZGVmaW5lICAgICAgICAgTUVEX09QVF9CTkMgICAgIDB4MDEKKyNkZWZpbmUgICAgICAgICBNRURfT1BUX1VUUCAgICAgMHgwMgorI2RlZmluZSAgICAgICAgIE1FRF9PUFRfQVVJICAgICAweDA0CisjZGVmaW5lICAgICAgICAgTUVEX09QVF8xME1CICAgIDB4MDgKKyNkZWZpbmUgICAgICAgICBNRURfT1BUXzEwME1CICAgMHgxMAorI2RlZmluZSAgICAgICAgIE1FRF9PUFRfUzEwICAgICAweDIwCisKKy8qIG1lZGlhX29wdHMgJiBtZWRpYV9zZXQgRmllbGRzIGJpdCBkZWZzIGZvciBUb2tlbiBSaW5nIC4uLiAqLworI2RlZmluZSAgICAgICAgIE1FRF9PUFRfNE1CICAgICAweDA4CisjZGVmaW5lICAgICAgICAgTUVEX09QVF8xNk1CICAgIDB4MTAKKyNkZWZpbmUgICAgICAgICBNRURfT1BUX1NUUCAgICAgMHg0MAorCisjZGVmaW5lIE1BWF84MDIzX1NJWkUgICAgICAgICAgIDE1MDAgICAgLyogTWF4IDgwMi4zIHNpemUgb2YgZnJhbWUuICovCisjZGVmaW5lIERFRkFVTFRfRVJYX1ZBTFVFICAgICAgIDQgICAgICAgLyogTnVtYmVyIG9mIDE2LWJ5dGUgYmxvY2tzIGZvciA3OTBCIGVhcmx5IFJ4LiAqLworI2RlZmluZSBERUZBVUxUX0VUWF9WQUxVRSAgICAgICAzMiAgICAgIC8qIE51bWJlciBvZiBieXRlcyBmb3IgNzkwQiBlYXJseSBUeC4gKi8KKyNkZWZpbmUgREVGQVVMVF9UWF9SRVRSSUVTICAgICAgMyAgICAgICAvKiBOdW1iZXIgb2YgdHJhbnNtaXQgcmV0cmllcyAqLworI2RlZmluZSBMUEJLX0ZSQU1FX1NJWkUgICAgICAgICAxMDI0ICAgIC8qIERlZmF1bHQgbG9vcGJhY2sgZnJhbWUgZm9yIFJ4IGNhbGlicmF0aW9uIHRlc3QuICovCisjZGVmaW5lIE1BWF9MT09LQUhFQURfU0laRSAgICAgIDI1MiAgICAgLyogTWF4IGxvb2thaGVhZCBzaXplIGZvciBldGhlcm5ldC4gKi8KKworI2RlZmluZSBSV19NQUNfU1RBVEUgICAgICAgICAgICAgICAgICAgIDB4MTEwMQorI2RlZmluZSBSV19TQV9PRl9MQVNUX0FNUF9PUl9TTVAgICAgICAgIDB4MjgwMworI2RlZmluZSBSV19QSFlTSUNBTF9EUk9QX05VTUJFUiAgICAgICAgIDB4M0IwMgorI2RlZmluZSBSV19VUFNUUkVBTV9ORUlHSEJPUl9BRERSRVNTICAgIDB4M0UwMworI2RlZmluZSBSV19QUk9EVUNUX0lOU1RBTkNFX0lEICAgICAgICAgIDB4NEIwOQorCisjZGVmaW5lIFJXX1RSQ19TVEFUVVNfQkxPQ0sgICAgICAgICAgICAgMHg1NDEyCisKKyNkZWZpbmUgUldfTUFDX0VSUk9SX0NPVU5URVJTX05PX0NMRUFSICAweDgwMDYKKyNkZWZpbmUgUldfTUFDX0VSUk9SX0NPVU5URVJfQ0xFQVIgICAgICAweDdBMDYKKyNkZWZpbmUgUldfQ09ORklHX1JFR0lTVEVSXzAgICAgICAgICAgICAweEEwMDEKKyNkZWZpbmUgUldfQ09ORklHX1JFR0lTVEVSXzEgICAgICAgICAgICAweEExMDEKKyNkZWZpbmUgUldfUFJFU0NBTEVfVElNRVJfVEhSRVNIT0xEICAgICAweEEyMDEKKyNkZWZpbmUgUldfVFBUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEEzMDEKKyNkZWZpbmUgUldfVFFQX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEE0MDEKKyNkZWZpbmUgUldfVE5UX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEE1MDEKKyNkZWZpbmUgUldfVEJUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEE2MDEKKyNkZWZpbmUgUldfVFNNX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEE3MDEKKyNkZWZpbmUgUldfVEFNX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEE4MDEKKyNkZWZpbmUgUldfVEJSX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEE5MDEKKyNkZWZpbmUgUldfVEVSX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEFBMDEKKyNkZWZpbmUgUldfVEdUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEFCMDEKKyNkZWZpbmUgUldfVEhUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEFDMDEKKyNkZWZpbmUgUldfVFJSX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEFEMDEKKyNkZWZpbmUgUldfVFZYX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEFFMDEKKyNkZWZpbmUgUldfSU5ESVZJRFVBTF9NQUNfQUREUkVTUyAgICAgICAweEIwMDMKKworI2RlZmluZSBSV19JTkRJVklEVUFMX0dST1VQX0FERFJFU1MgICAgIDB4QjMwMyAgLyogYWxsIG9mIGdyb3VwIGFkZHIgKi8KKyNkZWZpbmUgUldfSU5ESVZJRFVBTF9HUk9VUF9BRERSX1dPUkRfMCAweEIzMDEgIC8qIDFzdCB3b3JkIG9mIGdyb3VwIGFkZHIgKi8KKyNkZWZpbmUgUldfSU5ESVZJRFVBTF9HUk9VUF9BRERSICAgICAgICAweEI0MDIgIC8qIDJuZC0zcmQgd29yZCBvZiBncm91cCBhZGRyICovCisjZGVmaW5lIFJXX0ZVTkNUSU9OQUxfQUREUkVTUyAgICAgICAgICAgMHhCNjAzICAvKiBhbGwgb2YgZnVuY3Rpb25hbCBhZGRyICovCisjZGVmaW5lIFJXX0ZVTkNUSU9OQUxfQUREUl9XT1JEXzAgICAgICAgMHhCNjAxICAvKiAxc3Qgd29yZCBvZiBmdW5jICBhZGRyICovCisjZGVmaW5lIFJXX0ZVTkNUSU9OQUxfQUREUiAgICAgICAgICAgICAgMHhCNzAyICAvKiAybmQtM3JkIHdvcmQgZnVuYyBhZGRyICovCisKKyNkZWZpbmUgUldfQklUX1NJR05JRklDQU5UX0dST1VQX0FERFIgICAweEI5MDIKKyNkZWZpbmUgUldfU09VUkNFX1JJTkdfQlJJREdFX05VTUJFUiAgICAweEJCMDEKKyNkZWZpbmUgUldfVEFSR0VUX1JJTkdfTlVNQkVSICAgICAgICAgICAweEJDMDEKKworI2RlZmluZSBSV19ISUNfSU5URVJSVVBUX01BU0sgICAgICAgICAgIDB4QzYwMQorCisjZGVmaW5lIFNPVVJDRV9ST1VUSU5HX1NQQU5OSU5HX0JJVFMgICAgMHgwMEMwICAvKiBTcGFubmluZyBUcmVlIEZyYW1lcyAqLworI2RlZmluZSBTT1VSQ0VfUk9VVElOR19FWFBMT1JFUl9CSVQgICAgIDB4MDA0MCAgLyogRXhwbG9yZXIgYW5kIFNpbmdsZSBSb3V0ZSAqLworCisgICAgICAgIC8qIHdyaXRlICovCisKKyNkZWZpbmUgQ1NSX01TS19BTEwgICAgICAgICAgICAgMHg4MCAgICAvLyBCaWMgNTg3IE9ubHkKKyNkZWZpbmUgQ1NSX01TS1RJTlQgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBDU1JfTVNLQ0JVU1kgICAgICAgICAgICAweDEwCisjZGVmaW5lIENTUl9DTFJUSU5UICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQ1NSX0NMUkNCVVNZICAgICAgICAgICAgMHgwNAorI2RlZmluZSBDU1JfV0NTUyAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIENTUl9DQSAgICAgICAgICAgICAgICAgIDB4MDEKKworICAgICAgICAvKiByZWFkICovCisKKyNkZWZpbmUgQ1NSX1RJTlQgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBDU1JfQ0lOVCAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIENTUl9UU1RBVCAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQ1NSX0NTVEFUICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBDU1JfRkFVTFQgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIENTUl9DQlVTWSAgICAgICAgICAgICAgIDB4MDEKKworI2RlZmluZSBMQUFSX01FTTE2RU5CICAgICAgICAgICAweDgwCisjZGVmaW5lIFp3czE2ICAgICAgICAgICAgICAgICAgIDB4MjAKKworI2RlZmluZSBJUlJfSUVOICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIFp3czggICAgICAgICAgICAgICAgICAgIDB4MDEKKworI2RlZmluZSBJTUNDUl9FSUwgICAgICAgICAgICAgICAweDA0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgX191OCAgICAgICAgICAgIGFjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWNjZXNzIENvbnRyb2wgKi8KKyAgICAgICAgX191OCAgICAgICAgICAgIGZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJhbWUgQ29udHJvbCAqLworICAgICAgICBfX3U4ICAgICAgICAgICAgZGFbNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0IEFkZHIgKi8KKyAgICAgICAgX191OCAgICAgICAgICAgIHNhWzZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlIEFkZHIgKi8KKworICAgICAgICBfX3UxNiAgICAgICAgICAgIHZsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVjdG9yIExlbmd0aCAqLworICAgICAgICBfX3U4ICAgICAgICAgICAgZGNfc2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0L1NvdXJjZSBDbGFzcyAqLworICAgICAgICBfX3U4ICAgICAgICAgICAgdmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZWN0b3IgQ29kZSAqLworICAgICAgICB9IE1BQ19IRUFERVI7CisKKyNkZWZpbmUgTUFYX1NVQl9WRUNUT1JfSU5GTyAgICAgKFJYX0RBVEFfQlVGRkVSX1NJWkUgLSBzaXplb2YoTUFDX0hFQURFUikgLSAyKQorCit0eXBlZGVmIHN0cnVjdAorICAgICAgICB7CisgICAgICAgIF9fdTggICAgICAgICAgICBzdmw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Yi12ZWN0b3IgTGVuZ3RoICovCisgICAgICAgIF9fdTggICAgICAgICAgICBzdmk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Yi12ZWN0b3IgQ29kZSAqLworICAgICAgICBfX3U4ICAgICAgICAgICAgc3Z2W01BWF9TVUJfVkVDVE9SX0lORk9dOyAgICAgICAvKiBTdWItdmVjdG9yIEluZm8gKi8KKyAgICAgICAgfSBNQUNfU1VCX1ZFQ1RPUjsKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfX0xJTlVYX1NNQ1RSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0cl9maXJtd2FyZS5oIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyX2Zpcm13YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmMmNiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0cl9maXJtd2FyZS5oCkBAIC0wLDAgKzEsOTc5IEBACisvKgorICogVGhlIGZpcm13YXJlIHRoaXMgZHJpdmVyIGRvd25sb2FkcyBpbnRvIHRoZSB0b2tlbnJpbmcgY2FyZCBpcyBhCisgKiBzZXBhcmF0ZSBwcm9ncmFtIGFuZCBpcyBub3QgR1BMJ2Qgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoZSBMaW51eAorICogc2lkZSBkcml2ZXIgYW5kIHRoZSByb3V0aW5lIHRoYXQgbG9hZHMgdGhpcyBkYXRhIGludG8gdGhlIGNhcmQgYXJlLgorICoKKyAqIFRoaXMgZmlybXdhcmUgaXMgbGljZW5zZWQgdG8geW91IHN0cmljdGx5IGZvciB1c2UgaW4gY29uanVuY3Rpb24KKyAqIHdpdGggdGhlIHVzZSBvZiBTTUMgVG9rZW5SaW5nIGFkYXB0ZXJzLiBUaGVyZSBpcyBubyB3YXJhbnR5CisgKiBleHByZXNzZWQgb3IgaW1wbGllZCBhYm91dCBpdHMgZml0bmVzcyBmb3IgYW55IHB1cnBvc2UuCisgKi8KKworLyogc21jdHJfZmlybXdhcmUuaDogU01DIFRva2VuUmluZyBkcml2ZXIgZmlybXdhcmUgZHVtcCBmb3IgTGludXguCisgKgorICogTm90ZXM6CisgKiAgLSBUaGlzIGlzIGFuIDhLIGJpbmFyeSBpbWFnZS4gKE1DVC5CSU4gdjYuM0MxIDAzLzAxLzk1KQorICoKKyAqIEF1dGhvcnM6CisgKiAgLSBKYXkgU2NodWxpc3QgPGpzY2hsc3RAc2FtYmEub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1NNQ1RSKSB8fCBkZWZpbmVkKENPTkZJR19TTUNUUl9NT0RVTEUpCisKK3Vuc2lnbmVkIGNoYXIgc21jdHJfY29kZVtdID0geworCTB4MEJDLCAweDAxRCwgMHgwMTIsIDB4MDNCLCAweDA2MywgMHgwQjQsIDB4MEU5LCAweDAwMCwKKwkweDAwMCwgMHgwMUYsIDB4MDAwLCAweDAwMSwgMHgwMDEsIDB4MDAwLCAweDAwMiwgMHgwMDUsCisJMHgwMDEsIDB4MDAwLCAweDAwNiwgMHgwMDMsIDB4MDAxLCAweDAwMCwgMHgwMDQsIDB4MDA5LAorCTB4MDAxLCAweDAwMCwgMHgwMEEsIDB4MDA3LCAweDAwMSwgMHgwMDAsIDB4MDA4LCAweDAwQiwKKwkweDAwMSwgMHgwMDAsIDB4MDBDLCAweDAwMCwgMHgwMDAsIDB4MDAwLCAweDAwMCwgMHgwMEYsCisJMHgwMDEsIDB4MDAwLCAweDAxMCwgMHgwMEQsIDB4MDAxLCAweDAwMCwgMHgwMEUsIDB4MDEzLAorCTB4MDAxLCAweDAwMCwgMHgwMTQsIDB4MDExLCAweDAwMSwgMHgwMDAsIDB4MDEyLCAweDAwMCwKKwkweDAwMCwgMHgwMDUsIDB4MDAwLCAweDAxNSwgMHgwMDEsIDB4MDAwLCAweDAxNiwgMHgwMTksCisJMHgwMDEsIDB4MDAwLCAweDAxQSwgMHgwMTcsIDB4MDAxLCAweDAwMCwgMHgwMTgsIDB4MDAwLAorCTB4MDAwLCAweDAwRSwgMHgwMDAsIDB4MDAwLCAweDAwMCwgMHgwMDEsIDB4MDAwLCAweDAwMCwKKwkweDAwMCwgMHgwMDQsIDB4MDAwLCAweDAxQiwgMHgwMDEsIDB4MDAwLCAweDAxQywgMHgwMDAsCisJMHgwMDAsIDB4MDA3LCAweDAwMCwgMHgwMDAsIDB4MDAwLCAweDAwRiwgMHgwMDAsIDB4MDAwLAorCTB4MDAwLCAweDAwQiwgMHgwMDAsIDB4MDFELCAweDAwMSwgMHgwMDAsIDB4MDFFLCAweDAwMCwKKwkweDAwMCwgMHgwMDgsIDB4MDAwLCAweDAwMCwgMHgwMDAsIDB4MDAyLCAweDAwMCwgMHgwMDAsCisJMHgwMDAsIDB4MDBDLCAweDAwMCwgMHgwMDAsIDB4MDAwLCAweDAwNiwgMHgwMDAsIDB4MDAwLAorCTB4MDAwLCAweDAwRCwgMHgwMDAsIDB4MDAwLCAweDAwMCwgMHgwMDMsIDB4MDAwLCAweDAwMCwKKwkweDAwMCwgMHgwMEEsIDB4MDAwLCAweDAwMCwgMHgwMDAsIDB4MDA5LCAweDAwMCwgMHgwMDQsCisJMHgwNzgsIDB4MEM2LCAweDBCQywgMHgwMDEsIDB4MDk0LCAweDAwNCwgMHgwOTMsIDB4MDgwLAorCTB4MEM4LCAweDA0MCwgMHgwNjIsIDB4MEU5LCAweDBEQSwgMHgwMUMsIDB4MDJDLCAweDAxNSwKKwkweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTgsCisJMHgwMEIsIDB4MEU5LCAweDBFNSwgMHgwRDUsIDB4MDk1LCAweDBDMSwgMHgwOUQsIDB4MDc3LAorCTB4MENFLCAweDBCQiwgMHgwQTAsIDB4MDZFLCAweDAxQywgMHgwMDUsIDB4MEY2LCAweDA3NywKKwkweDBDNiwgMHgwMDIsIDB4MEZBLCAweDA5NiwgMHgwNzAsIDB4MEU4LCAweDAxRCwgMHgwQzAsCisJMHgwMTcsIDB4MDBFLCAweDAwMiwgMHgwRkEsIDB4MDU4LCAweDA3RCwgMHgwQzAsIDB4MDVGLAorCTB4MDcyLCAweDBDRSwgMHgwRUMsIDB4MEE0LCAweDBDMywgMHgwODQsIDB4MDkwLCAweDA3QSwKKwkweDAzMCwgMHgwQ0QsIDB4MDhELCAweDA3OSwgMHgwMTksIDB4MEU3LCAweDA2QywgMHgwMjQsCisJMHgwMjcsIDB4MDlDLCAweDAwOCwgMHgwMzksIDB4MDA3LCAweDAzOCwgMHgwQTgsIDB4MDRBLAorCTB4MDRDLCAweDBFQSwgMHgwNEQsIDB4MDk4LCAweDA5QiwgMHgwMjQsIDB4MDRDLCAweDBDMCwKKwkweDAyNiwgMHgwRDMsIDB4MEU3LCAweDA1NCwgMHgwNUEsIDB4MDRELCAweDBGMiwgMHgwNEMsCisJMHgwMEMsIDB4MDEzLCAweDAyMywgMHgwNDksIDB4MDkwLCAweDAzMiwgMHgwNkUsIDB4MEE0LAorCTB4MERGLCAweDA5MywgMHgwNzEsIDB4MDEzLCAweDA3NywgMHgwMjYsIDB4MEUxLCAweDAyNiwKKwkweDBGOCwgMHgwMjYsIDB4MDBDLCAweDA0QywgMHgwMTIsIDB4MDI2LCAweDAwOCwgMHgwMDksCisJMHgwODIsIDB4MDgyLCAweDA2MCwgMHgwQTksIDB4MDMwLCAweDA3OSwgMHgwMzYsIDB4MEIwLAorCTB4MEIyLCAweDBBOCwgMHgwQTcsIDB4MDcyLCAweDA2NCwgMHgwOEYsIDB4MDlCLCAweDAzMywKKwkweDAzMywgMHgwRjksIDB4MEI4LCAweDAzOSwgMHgwRDUsIDB4MDExLCAweDA3MywgMHgwQUEsCisJMHgwNzUsIDB4MDI2LCAweDA1RCwgMHgwMjYsIDB4MDUxLCAweDA5MywgMHgwMkEsIDB4MDQ5LAorCTB4MDk0LCAweDBDOSwgMHgwOTUsIDB4MDg5LCAweDBCQywgMHgwNEQsIDB4MEM4LCAweDA5QiwKKwkweDA4MCwgMHgwOUIsIDB4MEEwLCAweDA5OSwgMHgwMDYsIDB4MDRDLCAweDA4NiwgMHgwMjYsCisJMHgwNTgsIDB4MDlCLCAweDBBNCwgMHgwOUIsIDB4MDk5LCAweDAzNywgMHgwNjIsIDB4MDZDLAorCTB4MDY3LCAweDA5QiwgMHgwMzMsIDB4MDMwLCAweDBCRiwgMHgwMzYsIDB4MDY2LCAweDA2MSwKKwkweDBCRiwgMHgwMzYsIDB4MEVDLCAweDBDNSwgMHgwQkQsIDB4MDY2LCAweDA4MiwgMHgwNUEsCisJMHgwNTAsIDB4MDMxLCAweDBENSwgMHgwOUQsIDB4MDk4LCAweDAxOCwgMHgwMjksIDB4MDNDLAorCTB4MDk4LCAweDA4NiwgMHgwNEMsIDB4MDE3LCAweDAyNiwgMHgwM0UsIDB4MDJDLCAweDBCOCwKKwkweDA2OSwgMHgwM0IsIDB4MDQ5LCAweDAyRSwgMHgwQjQsIDB4MDA4LCAweDA0MywgMHgwMUEsCisJMHgwQTQsIDB4MEY5LCAweDBCMywgMHgwNTEsIDB4MEYxLCAweDAxMCwgMHgwRjMsIDB4MDQzLAorCTB4MENELCAweDAwOCwgMHgwNkYsIDB4MDYzLCAweDA3OSwgMHgwQjMsIDB4MDMzLCAweDAwRSwKKwkweDAxMywgMHgwOTgsIDB4MDQ5LCAweDA5OCwgMHgwMDQsIDB4MERBLCAweDA3QywgMHgwRTAsCisJMHgwNTIsIDB4MDc5LCAweDAzMSwgMHgwMEMsIDB4MDk4LCAweDAyRSwgMHgwNEQsIDB4MEFDLAorCTB4MDJDLCAweDA4NCwgMHgwMTQsIDB4MEVFLCAweDA0QywgMHgwRkUsIDB4MDY3LCAweDA1RSwKKwkweDBFNCwgMHgwOUEsIDB4MDc1LCAweDAyOSwgMHgwRDcsIDB4MEE5LCAweDAzNSwgMHgwM0EsCisJMHgwOTQsIDB4MDVCLCAweDBENSwgMHgwOUIsIDB4MDU4LCAweDBCNCwgMHgwQUYsIDB4MDc1LAorCTB4MDY2LCAweDBBRiwgMHgwMTQsIDB4MEE5LCAweDBFRiwgMHgwNDAsIDB4MDk1LCAweDAyNSwKKwkweDAwOCwgMHgwQjksIDB4MEFELCAweDA0MiwgMHgwRkMsIDB4MEQ4LCAweDBEOSwgMHgwOEMsCisJMHgwMzMsIDB4MDBFLCAweDAxMywgMHgwOTgsIDB4MDY2LCAweDAxRSwgMHgwNDUsIDB4MEFDLAorCTB4MEIwLCAweDAwQywgMHgwNDIsIDB4MEQzLCAweDBDQywgMHgwQTYsIDB4MDEyLCAweDA2MiwKKwkweDBERSwgMHgwQjQsIDB4MEIxLCAweDA4MCwgMHgwNDksIDB4MDdELCAweDBBMiwgMHgwREUsCisJMHgwQjQsIDB4MDE4LCAweDBDMCwgMHgwMjQsIDB4MDg0LCAweDBFNiwgMHgwNTQsIDB4MEY1LAorCTB4MDgzLCAweDA0NiwgMHgwMDEsIDB4MDY4LCAweDAxQSwgMHgwNjMsIDB4MDBDLCAweDBDNiwKKwkweDAxMiwgMHgwNjQsIDB4MEZBLCAweDA0QywgMHgwMzUsIDB4MDFDLCAweDAyQywgMHgwMEUsCisJMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLAorCTB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUQsIDB4MEQ3LCAweDAwMiwKKwkweDA3MCwgMHgwRTAsIDB4MDRDLCAweDBGMywgMHgwQTEsIDB4MEMxLCAweDBENSwgMHgwQzAsCisJMHgwM0MsIDB4MEI5LCAweDA2OSwgMHgwMzksIDB4MDYwLCAweDA0RSwgMHgwNTgsIDB4MDc3LAorCTB4MDAyLCAweDA2NywgMHgwOTMsIDB4MDNDLCAweDA5OSwgMHgwRTQsIDB4MENGLCAweDAzOCwKKwkweDAxQywgMHgwOTcsIDB4MDJFLCAweDA0MCwgMHgwMUIsIDB4MDkwLCAweDAzMSwgMHgwNDYsCisJMHgwQTMsIDB4MDVFLCAweDAwRSwgMHgwODgsIDB4MDM0LCAweDA2QSwgMHgwMzUsIDB4MEUwLAorCTB4MEU4LCAweDBBQSwgMHgwMzUsIDB4MDFBLCAweDBBOSwgMHgwRjUsIDB4MDE1LCAweDA0NiwKKwkweDBBMywgMHgwRUEsIDB4MDdELCAweDA0QSwgMHgwQTMsIDB4MDUxLCAweDBBQSwgMHgwOUYsCisJMHgwNzAsIDB4MDU0LCAweDBBNiwgMHgwNTcsIDB4MDJFLCAweDBCNCwgMHgwQ0QsIDB4MEM4LAorCTB4MEEzLCAweDAwQywgMHgwQzEsIDB4MERBLCAweDBDNiwgMHgwRTEsIDB4MENCLCAweDA3QSwKKwkweDBENCwgMHgwMUMsIDB4MDY4LCAweDBGRiwgMHgwQ0YsIDB4MDU1LCAweDBBOCwgMHgwQzAsCisJMHgwMkQsIDB4MDg1LCAweDAxMSwgMHgwMTcsIDB4MDQ0LCAweDAyQSwgMHgwMzAsIDB4MDBCLAorCTB4MDRBLCAweDA4OCwgMHgwQzIsIDB4MDRELCAweDBCNSwgMHgwMjAsIDB4MEQ1LCAweDAyNiwKKwkweDAwMSwgMHgwNjksIDB4MDUxLCAweDA2OSwgMHgwNTIsIDB4MDE5LCAweDA1MiwgMHgwNjAsCisJMHgwMTYsIDB4MDk1LCAweDAxNiwgMHgwODIsIDB4MDk2LCAweDA1NCwgMHgwOTgsIDB4MDA1LAorCTB4MEE1LCAweDA0NSwgMHgwRjMsIDB4MERELCAweDA2QSwgMHgwRjksIDB4MDI4LCAweDAxOCwKKwkweDBFRiwgMHgwMDAsIDB4MDMwLCAweDAzMCwgMHgwNTEsIDB4MDRFLCAweDA0NCwgMHgwNUQsCisJMHgwMTIsIDB4MEQxLCAweDA0MywgMHgwRTYsIDB4MDEyLCAweDA2RiwgMHgwOUUsIDB4MEJBLAorCTB4MENDLCAweDBERiwgMHgwMjUsIDB4MDAzLCAweDAxRCwgMHgwRTAsIDB4MDA2LCAweDAwNiwKKwkweDAwQSwgMHgwMzAsIDB4MENDLCAweDBBOSwgMHgwRUIsIDB4MDJELCAweDAwMCwgMHgwODYsCisJMHgwQTYsIDB4MDEyLCAweDA2NSwgMHgwNEYsIDB4MDU2LCAweDBENiwgMHgwNjUsIDB4MDQ5LAorCTB4MDVGLCAweDAzRCwgMHgwRTgsIDB4MDM3LCAweDBDOSwgMHgwNDAsIDB4MEM3LCAweDA3OCwKKwkweDAwMSwgMHgwODEsIDB4MDgyLCAweDA4QywgMHgwMzMsIDB4MDE4LCAweDA0OSwgMHgwODAsCisJMHgwQUUsIDB4MDQwLCAweDBDNSwgMHgwMTgsIDB4MDA1LCAweDA5QywgMHgwNkQsIDB4MDE4LAorCTB4MDY2LCAweDAwRSwgMHgwRjMsIDB4MEEwLCAweDBDNiwgMHgwMTIsIDB4MDYyLCAweDBERSwKKwkweDBGNSwgMHgwMDQsIDB4MEI0LCAweDBBQywgMHgwNkIsIDB4MEM2LCAweDAxOSwgMHgwOTEsCisJMHgwNzMsIDB4MDA1LCAweDA0OCwgMHgwMkUsIDB4MDcyLCAweDA5NCwgMHgwODAsIDB4MDczLAorCTB4MEExLCAweDBDOCwgMHgwNDcsIDB4MDM2LCAweDA2NiwgMHgwNjQsIDB4MDJGLCAweDAzNiwKKwkweDA2NiwgMHgwNjQsIDB4MDA3LCAweDA5OSwgMHgwMDIsIDB4MDkxLCAweDA4RSwgMHgwNzIsCisJMHgwRDEsIDB4MDBGLCAweDA5RCwgMHgwMDYsIDB4MDMxLCAweDA3MywgMHgwQTAsIDB4MEMzLAorCTB4MDUxLCAweDA2QSwgMHgwMUEsIDB4MDIwLCAweDBCRiwgMHgwM0EsIDB4MDBDLCAweDAyQywKKwkweDA3MywgMHgwODcsIDB4MDQzLCAweDA1RSwgMHgwNjAsIDB4MDAyLCAweDAyMywgMHgwRkMsCisJMHgwRTAsIDB4MEQ2LCAweDAzNSwgMHgwRUYsIDB4MDlFLCAweDBGNSwgMHgwRUYsIDB4MDkyLAorCTB4MDgxLCAweDA4RSwgMHgwRjAsIDB4MDAzLCAweDAwMywgMHgwMDUsIDB4MDE4LCAweDA2NiwKKwkweDA0NSwgMHgwQ0MsIDB4MDBCLCAweDA0OCwgMHgwMkUsIDB4MDcwLCAweDAwQSwgMHgwNDAsCisJMHgwMzksIDB4MEQwLCAweDBFNCwgMHgwMjMsIDB4MDlCLCAweDAzMywgMHgwMzIsIDB4MDE3LAorCTB4MDlCLCAweDAzMywgMHgwMzIsIDB4MDAzLCAweDBDQywgMHgwODUsIDB4MDQ4LCAweDBDNywKKwkweDAzOCwgMHgwMTQsIDB4MEE1LCAweDBDRSwgMHgwMjksIDB4MDdFLCAweDBEMiwgMHgwODAsCisJMHgwQTEsIDB4MEE4LCAweDBCNCwgMHgwNDgsIDB4MDg4LCAweDAyRiwgMHgwQ0UsIDB4MDgzLAorCTB4MDBCLCAweDAxQywgMHgwRTEsIDB4MEQwLCAweDBENywgMHgwOTgsIDB4MDA0LCAweDA4OCwKKwkweDA4NywgMHgwQ0UsIDB4MDk2LCAweDAzMSwgMHgwNzMsIDB4MEE1LCAweDA4RiwgMHgwRjMsCisJMHgwODMsIDB4MDU4LCAweDBENywgMHgwQkUsIDB4MDdCLCAweDA4MiwgMHgwQUYsIDB4MDkyLAorCTB4MDgxLCAweDA4RSwgMHgwRjAsIDB4MDAzLCAweDAwMywgMHgwMDUsIDB4MDE4LCAweDA2NiwKKwkweDA0NSwgMHgwQ0MsIDB4MDE1LCAweDAyMCwgMHgwQjksIDB4MEM4LCAweDAyOSwgMHgwMDAsCisJMHgwRTcsIDB4MDQzLCAweDA5MCwgMHgwOEUsIDB4MDZDLCAweDBDQywgMHgwQzgsIDB4MDVFLAorCTB4MDZDLCAweDBDQywgMHgwQzgsIDB4MDBGLCAweDAzMiwgMHgwMDUsIDB4MDIzLCAweDAxQywKKwkweDBFNCwgMHgwNTAsIDB4MEQ0LCAweDA1QSwgMHgwMTcsIDB4MDg4LCAweDAyRiwgMHgwQ0UsCisJMHgwODMsIDB4MDEwLCAweDBGOSwgMHgwRDAsIDB4MDIzLCAweDAxNywgMHgwM0EsIDB4MDA0LAorCTB4MDM1LCAweDBFNiwgMHgwMDAsIDB4MDIyLCAweDAxNiwgMHgwMzksIDB4MEMzLCAweDBBMywKKwkweDBGQywgMHgwRTAsIDB4MEQ2LCAweDAzNSwgMHgwRTAsIDB4MEJGLCAweDBGNCwgMHgwMTgsCisJMHgwRjIsIDB4MDJELCAweDA0RCwgMHgwNDMsIDB4MDUxLCAweDA2RSwgMHgwNUEsIDB4MDIyLAorCTB4MDFGLCAweDAzMCwgMHgwRDQsIDB4MDE3LCAweDBFNywgMHgwNDEsIDB4MDkxLCAweDA3MywKKwkweDAwNSwgMHgwNDgsIDB4MDJFLCAweDA3NywgMHgwNjksIDB4MDAwLCAweDBFNywgMHgwNDMsCisJMHgwOTAsIDB4MDhFLCAweDA2QywgMHgwQ0MsIDB4MEM4LCAweDA1RSwgMHgwNkMsIDB4MENDLAorCTB4MEM4LCAweDAwRiwgMHgwMzIsIDB4MDA1LCAweDAyMywgMHgwMUMsIDB4MEVGLCAweDA0QywKKwkweDA0RSwgMHgwMDYsIDB4MDA0LCAweDBDOSwgMHgwOUUsIDB4MDBCLCAweDBGRiwgMHgwNDEsCisJMHgwOEYsIDB4MDIyLCAweDBENCwgMHgwRDQsIDB4MDM1LCAweDAxNiwgMHgwRTUsIDB4MEEyLAorCTB4MDIxLCAweDBGMywgMHgwNUEsIDB4MDgyLCAweDBGQywgMHgwRTgsIDB4MDMyLCAweDAyRSwKKwkweDA2MCwgMHgwQTksIDB4MDA1LCAweDBDRSwgMHgwMTMsIDB4MDQ4LCAweDAwNywgMHgwM0EsCisJMHgwMUMsIDB4MDg0LCAweDA3MywgMHgwNjYsIDB4MDY2LCAweDA0MiwgMHgwRjMsIDB4MDY2LAorCTB4MDY2LCAweDA0MCwgMHgwNzksIDB4MDkwLCAweDAyOSwgMHgwMTgsIDB4MEU3LCAweDAwQSwKKwkweDA5OCwgMHgwOUMsIDB4MDBBLCAweDA5RSwgMHgwQjUsIDB4MDEyLCAweDA1QywgMHgwN0MsCisJMHgwQzMsIDB4MDMxLCAweDA4QiwgMHgwOTgsIDB4MDJBLCAweDA3QywgMHgwRDMsIDB4MEVELAorCTB4MDM4LCAweDBFOSwgMHgwRDMsIDB4MDRFLCAweDA3NCwgMHgwRUQsIDB4MDQ5LCAweDA5RSwKKwkweDAwQiwgMHgwRkYsIDB4MDQxLCAweDA4RiwgMHgwMjIsIDB4MEQ0LCAweDBENCwgMHgwMzUsCisJMHgwMTYsIDB4MEU1LCAweDBBMiwgMHgwMkQsIDB4MEVCLCAweDA0NSwgMHgwMzMsIDB4MDhGLAorCTB4MEZDLCAweDBGNywgMHgwQTAsIDB4MDVGLCAweDAyNSwgMHgwMDMsIDB4MDFELCAweDBFNCwKKwkweDAwRSwgMHgwMDYsIDB4MDBBLCAweDAzMCwgMHgwQ0MsIDB4MDBDLCAweDBGMywgMHgwRUIsCisJMHgwNDAsIDB4MERFLCAweDA2MSwgMHgwQTgsIDB4MDcwLCAweDA5MiwgMHgwMEEsIDB4MDAwLAorCTB4MEUxLCAweDAyNCwgMHgwMUUsIDB4MDAwLCAweDBFMSwgMHgwMjQsIDB4MDFFLCAweDAwMCwKKwkweDBFMSwgMHgwMjQsIDB4MDFFLCAweDAwMCwgMHgwRTEsIDB4MDI0LCAweDAxRSwgMHgwMDAsCisJMHgwRTEsIDB4MDI0LCAweDAxRSwgMHgwMDEsIDB4MDBGLCAweDA5OCwgMHgwMkEsIDB4MDBCLAorCTB4MEYzLCAweDBBMCwgMHgwQzgsIDB4MEI5LCAweDBBMiwgMHgwQTQsIDB4MDE3LCAweDAzQSwKKwkweDA2OSwgMHgwMDAsIDB4MEU3LCAweDA0MywgMHgwOTAsIDB4MDhFLCAweDA3NSwgMHgwNDgsCisJMHgwNUUsIDB4MDcwLCAweDA2OSwgMHgwMDEsIDB4MEU2LCAweDAwMCwgMHgwNTIsIDB4MDMxLAorCTB4MENDLCAweDAxOCwgMHgwMTQsIDB4MEE1LCAweDBDQywgMHgwMDksIDB4MDgyLCAweDA5NCwKKwkweDA3MywgMHgwMEMsIDB4MEEwLCAweDA5MSwgMHgwRjUsIDB4MDI1LCAweDBDQywgMHgwMDcsCisJMHgwMDYsIDB4MDg0LCAweDA4NCwgMHgwOUYsIDB4MDMwLCAweDBBMiwgMHgwQTQsIDB4MDdELAorCTB4MDUwLCAweDA3NSwgMHgwQTYsIDB4MDY1LCAweDAwMSwgMHgwNEEsIDB4MDhFLCAweDBCNCwKKwkweDBDQywgMHgwQzQsIDB4MDM1LCAweDA1NCwgMHgwNzUsIDB4MDY2LCAweDBBNCwgMHgwOTcsCisJMHgwN0EsIDB4MDg5LCAweDA1MCwgMHgwNTMsIDB4MDEzLCAweDA4MCwgMHgwMTksIDB4MEUzLAorCTB4MDQ5LCAweDA1QywgMHgwNkQsIDB4MENFLCAweDBBOSwgMHgwNDAsIDB4MDM1LCAweDAwNiwKKwkweDA3OCwgMHgwRDIsIDB4MDU3LCAweDAwNiwgMHgwRjEsIDB4MEIzLCAweDAyQSwgMHgwOEQsCisJMHgwOTcsIDB4MDIzLCAweDA2MiwgMHgwOTIsIDB4MDVELCAweDA2OSwgMHgwOTksIDB4MDFDLAorCTB4MDZBLCAweDAzNiwgMHgwRTYsIDB4MENELCAweDA0NiwgMHgwMTIsIDB4MDZGLCAweDA5RSwKKwkweDBFMSwgMHgwQUIsIDB4MEU0LCAweDBBMywgMHgwMEMsIDB4MEMwLCAweDBERSwgMHgwQUMsCisJMHgwRDQsIDB4MDBELCAweDAyOCwgMHgwMUIsIDB4MEQwLCAweDAxMiwgMHgwQTUsIDB4MDAwLAorCTB4MEY4LCAweDA0QiwgMHgwQUQsIDB4MDMzLCAweDAyOCwgMHgwMDYsIDB4MEEwLCAweDBERSwKKwkweDAxNCwgMHgwOTcsIDB4MDNBLCAweDA4OSwgMHgwNUQsIDB4MEMwLCAweDAwRCwgMHgwRTMsCisJMHgwMDYsIDB4MDkwLCAweDA5MiwgMHgwNUQsIDB4MDY5LCAweDA5OCwgMHgwNjYsIDB4MEI5LAorCTB4MDE5LCAweDA5NSwgMHgwRTQsIDB4MEE4LCAweDBDRiwgMHgwOUQsIDB4MDMzLCAweDAxOCwKKwkweDA0OSwgMHgwQkUsIDB4MDdCLCAweDA4NiwgMHgwQUYsIDB4MDkyLCAweDA4QywgMHgwMzMsCisJMHgwMjQsIDB4MDE0LCAweDAwQywgMHgwRjQsIDB4MDgzLCAweDAyNCwgMHgwMjEsIDB4MEMyLAorCTB4MDcwLCAweDBCRiwgMHgwRjQsIDB4MDE4LCAweDBGMiwgMHgwMkQsIDB4MDRELCAweDA0MywKKwkweDA1MSwgMHgwNkUsIDB4MDVBLCAweDAyMiwgMHgwMUYsIDB4MDMyLCAweDBBOCwgMHgwMkYsCisJMHgwQ0UsIDB4MDgzLCAweDAyMiwgMHgwRTYsIDB4MDA1LCAweDBBNCwgMHgwMTcsIDB4MDNBLAorCTB4MDY5LCAweDAwMCwgMHgwRTcsIDB4MDQzLCAweDA5MCwgMHgwOEUsIDB4MDc1LCAweDA0OCwKKwkweDA1RSwgMHgwNzAsIDB4MDY5LCAweDAwMSwgMHgwRTYsIDB4MDQyLCAweDBBNCwgMHgwNjMsCisJMHgwOTgsIDB4MDAyLCAweDAyOSwgMHgwNEIsIDB4MDlBLCAweDAyOSwgMHgwNzgsIDB4MEU5LAorCTB4MDQwLCAweDA1MywgMHgwMTMsIDB4MDgxLCAweDA4MSwgMHgwMzIsIDB4MDY3LCAweDA4MiwKKwkweDBGRiwgMHgwRDAsIDB4MDYzLCAweDBDOCwgMHgwQjUsIDB4MDM1LCAweDAwRCwgMHgwNDUsCisJMHgwQUUsIDB4MDUwLCAweDAwOCwgMHgwN0MsIDB4MEUwLCAweDBEMCwgMHgwNUYsIDB4MDlELAorCTB4MDA2LCAweDA0NSwgMHgwQ0MsIDB4MDAxLCAweDBBNCwgMHgwMTcsIDB4MDNBLCAweDA2OSwKKwkweDAwMCwgMHgwRTcsIDB4MDQzLCAweDA5MCwgMHgwOEUsIDB4MDc1LCAweDA0OCwgMHgwNUUsCisJMHgwNzAsIDB4MDY5LCAweDAwMSwgMHgwRTYsIDB4MDU5LCAweDBBNCwgMHgwNjMsIDB4MDk4LAorCTB4MDFDLCAweDA1MiwgMHgwOTcsIDB4MDNCLCAweDAzMCwgMHgwNTIsIDB4MDhFLCAweDA3RCwKKwkweDAyQSwgMHgwMDksIDB4MDFGLCAweDA1MSwgMHgwRUIsIDB4MEE0LCAweDBBNCwgMHgwMEEsCisJMHgwQjksIDB4MDk0LCAweDA4NywgMHgwQUUsIDB4MEM1LCAweDAzMSwgMHgwMzgsIDB4MDAyLAorCTB4MEZGLCAweDBEMCwgMHgwNjMsIDB4MEM4LCAweDBCNSwgMHgwMzUsIDB4MDBELCAweDA0NSwKKwkweDBBRSwgMHgwNTAsIDB4MDA4LCAweDA3QywgMHgwRUEsIDB4MDIwLCAweDBCRiwgMHgwM0EsCisJMHgwMEMsIDB4MDhCLCAweDA5QSwgMHgwMTYsIDB4MDkwLCAweDA1QywgMHgwRTksIDB4MEE0LAorCTB4MDAzLCAweDA5RCwgMHgwMEUsIDB4MDQyLCAweDAzOSwgMHgwRDUsIDB4MDIxLCAweDA3OSwKKwkweDA5NSwgMHgwNDgsIDB4MDBGLCAweDAzMCwgMHgwMEEsIDB4MDkxLCAweDA4RSwgMHgwNjAsCisJMHgwRUIsIDB4MDI5LCAweDA3MywgMHgwMDAsIDB4MDA5LCAweDA1NCwgMHgwMDQsIDB4MENBLAorCTB4MDgyLCAweDA2NSwgMHgwNTIsIDB4MDY1LCAweDBFNCwgMHgwQ0EsIDB4MDIyLCAweDA2NSwKKwkweDA3MiwgMHgwNjUsIDB4MDA5LCAweDAzMiwgMHgwRTAsIDB4MDk5LCAweDA3MiwgMHgwNEMsCisJMHgwQzQsIDB4MEUwLCAweDAwQiwgMHgwRkYsIDB4MDQxLCAweDA4RiwgMHgwMjIsIDB4MEQ0LAorCTB4MEQ0LCAweDAzNSwgMHgwMTYsIDB4MEI5LCAweDA0MCwgMHgwMjEsIDB4MEYzLCAweDA4QSwKKwkweDA4MiwgMHgwRkMsIDB4MEU4LCAweDAzMiwgMHgwMkUsIDB4MDYwLCAweDBBOSwgMHgwMDUsCisJMHgwQ0UsIDB4MDlBLCAweDA0MCwgMHgwMzksIDB4MEQwLCAweDBFNCwgMHgwMjMsIDB4MDlELAorCTB4MDUyLCAweDAxNywgMHgwOTksIDB4MDU0LCAweDA2MSwgMHgwOTksIDB4MDAxLCAweDBFNiwKKwkweDA0MCwgMHgwQTQsIDB4MDYzLCAweDA5OCwgMHgwMDQsIDB4MEIxLCAweDA4NCwgMHgwOTgsCisJMHgwMTgsIDB4MEVGLCAweDAyRCwgMHgwMDMsIDB4MDA1LCAweDAzMSwgMHgwMzgsIDB4MDAyLAorCTB4MEZGLCAweDBEMCwgMHgwNjMsIDB4MEM4LCAweDBCNSwgMHgwMzUsIDB4MDBELCAweDA0NSwKKwkweDBCOSwgMHgwNjgsIDB4MDg4LCAweDA3QywgMHgwRTAsIDB4MDUwLCAweDA1RiwgMHgwOUQsCisJMHgwMDYsIDB4MDQ1LCAweDBDQywgMHgwODEsIDB4MDQ4LCAweDAyRSwgMHgwNzEsIDB4MDM0LAorCTB4MDhGLCAweDA0OCwgMHgwMDEsIDB4MDQ4LCAweDAxNSwgMHgwMjEsIDB4MDA1LCAweDAyMSwKKwkweDBFOSwgMHgwMEEsIDB4MDUyLCAweDAwMywgMHgwQ0UsIDB4MDVBLCAweDA0NiwgMHgwMzksCisJMHgwQ0YsIDB4MDQ3LCAweDA4RSwgMHgwNjAsIDB4MEFCLCAweDAxQSwgMHgwRjMsIDB4MDUzLAorCTB4MDQzLCAweDBFQiwgMHgwMzUsIDB4MDI0LCAweDBCOCwgMHgwMUIsIDB4MDMwLCAweDAwNywKKwkweDAwOSwgMHgwOEEsIDB4MDc0LCAweDAyRiwgMHgwN0UsIDB4MDQxLCAweDA3NCwgMHgwMUUsCisJMHgwMUQsIDB4MDBELCAweDA4NywgMHgwNDYsIDB4MDQ5LCAweDBENSwgMHgwOTUsIDB4MEQxLAorCTB4MEQ1LCAweDBENSwgMHgwQkIsIDB4MEE5LCAweDA0RSwgMHgwODIsIDB4MDlELCAweDAwNSwKKwkweDAzQSwgMHgwMEEsIDB4MDc0LCAweDAxNCwgMHgwRTgsIDB4MDI5LCAweDBEMCwgMHgwNDIsCisJMHgwNzQsIDB4MDVCLCAweDBDRSwgMHgwNTAsIDB4MEM0LCAweDAwNywgMHgwNDUsIDB4MEJDLAorCTB4MEUyLCAweDAwQywgMHgwNDAsIDB4MDc0LCAweDA1QiwgMHgwQ0UsIDB4MDgzLCAweDAwNCwKKwkweDBGOSwgMHgwOTUsIDB4MDRELCAweDAxMywgMHgwNjMsIDB4MDVFLCAweDA2RiwgMHgwMzEsCisJMHgwM0IsIDB4MEEwLCAweDA4QiwgMHgwQTIsIDB4MEM1LCAweDAzOSwgMHgwOEQsIDB4MDc4LAorCTB4MDNBLCAweDAyMiwgMHgwQTAsIDB4MDAwLCAweDA2QiwgMHgwQzEsIDB4MEQxLCAweDA1NCwKKwkweDA2MCwgMHgwMTYsIDB4MEQ5LCAweDA5MSwgMHgwQTIsIDB4MEU3LCAweDA0MywgMHgwOEMsCisJMHgwMjQsIDB4MERDLCAweDAxQywgMHgwRTAsIDB4MDUxLCAweDAxNywgMHgwMzksIDB4MDZCLAorCTB4MDNCLCAweDBDQywgMHgwNEIsIDB4MDQyLCAweDAyRSwgMHgwNkIsIDB4MDUwLCAweDBCRiwKKwkweDAzNiwgMHgwMzYsIDB4MDY1LCAweDA0RiwgMHgwN0EsIDB4MDE4LCAweDA1NSwgMHgwMjUsCisJMHgwNzgsIDB4MDk4LCAweDAyMywgMHgwRTcsIDB4MDUwLCAweDAzRSwgMHgwRjMsIDB4MDgxLAorCTB4MDRDLCAweDAwMiwgMHgwNkQsIDB4MDNFLCAweDA3MSwgMHgwNTMsIDB4MEFGLCAweDA3OCwKKwkweDBBOSwgMHgwRDQsIDB4MEE2LCAweDAyOSwgMHgwQjEsIDB4MEJDLCAweDBEOSwgMHgwOTksCisJMHgwQjIsIDB4MDhFLCAweDA2MiwgMHgwOEYsIDB4MDIyLCAweDAyRSwgMHgwNzUsIDB4MDE2LAorCTB4MEIwLCAweDBCMiwgMHgwQUIsIDB4MDIzLCAweDAyOCwgMHgwMTYsIDB4MDU0LCAweDA1MiwKKwkweDAzMSwgMHgwQkMsIDB4MEQ5LCAweDA5OSwgMHgwQjIsIDB4MDhFLCAweDA2NiwgMHgwMTksCisJMHgwMDIsIDB4MDJFLCAweDA3NSwgMHgwMTYsIDB4MDUwLCAweDAyQywgMHgwQTksIDB4MEM4LAorCTB4MEM2LCAweDBGNSwgMHgwMjAsIDB4MEQzLCAweDBFNCwgMHgwN0YsIDB4MDRGLCAweDA5QywKKwkweDAwQSwgMHgwRDYsIDB4MDE2LCAweDA3RiwgMHgwOTAsIDB4MEVFLCAweDA0QywgMHgwRUIsCisJMHgwQ0YsIDB4MEUyLCAweDA4OCwgMHgwQkEsIDB4MDJGLCAweDA0MiwgMHgwODYsIDB4MEFFLAorCTB4MEJELCAweDBFNSwgMHgwQTcsIDB4MDUyLCAweDA5RiwgMHgwOTMsIDB4MDYzLCAweDA3OSwKKwkweDBFQiwgMHgwMzMsIDB4MDA4LCAweDBGOSwgMHgwOTQsIDB4MDUyLCAweDA0NywgMHgwQ0QsCisJMHgwOTksIDB4MDI1LCAweDA2RiwgMHgwM0EsIDB4MDBDLCAweDAxMywgMHgwRTYsIDB4MDU1LAorCTB4MDM0LCAweDA0QywgMHgwNUEsIDB4MDRELCAweDBCNSwgMHgwMjMsIDB4MDk1LCAweDBBNSwKKwkweDA0OCwgMHgwMTEsIDB4MDVBLCAweDAwQSwgMHgwNDMsIDB4MDk1LCAweDBBQywgMHgwMkMsCisJMHgwQkEsIDB4MDI0LCAweDAwNSwgMHgwNDksIDB4MEIxLCAweDBCQywgMHgwQ0EsIDB4MEE3LAorCTB4MDcyLCAweDA2QywgMHgwNkIsIDB4MEM1LCAweDBCRCwgMHgwRTgsIDB4MDMxLCAweDA2OSwKKwkweDA1MiwgMHgwNUQsIDB4MDA2LCAweDAxMiwgMHgwNjUsIDB4MDNFLCAweDBCMSwgMHgwNTAsCisJMHgwNEMsIDB4MDdELCAweDA0RiwgMHgwQUMsIDB4MDBBLCAweDAzMCwgMHgwMEIsIDB4MDM2LAorCTB4MDY0LCAweDAxMSwgMHgwNzMsIDB4MDhBLCAweDA4MywgMHgwOEUsIDB4MDc1LCAweDAxMiwKKwkweDA5RiwgMHgwN0IsIDB4MEQyLCAweDA5OSwgMHgwNTgsIDB4MEVFLCAweDA4MiwgMHgwMkUsCisJMHgwNzcsIDB4MEEwLCAweDBFMywgMHgwOUQsIDB4MDVELCAweDA0RiwgMHgwQkMsIDB4MDJBLAorCTB4MDUzLCAweDAyOSwgMHgwNTMsIDB4MERFLCAweDA5MywgMHgwMjQsIDB4MEJBLCAweDBCMywKKwkweDAzNiwgMHgwQUEsIDB4MDRBLCAweDBDNiwgMHgwNzksIDB4MEQ0LCAweDBCOSwgMHgwREUsCisJMHgwNjIsIDB4MDVBLCAweDAxMSwgMHgwNzMsIDB4MDUwLCAweDA1MCwgMHgwQkYsIDB4MDM3LAorCTB4MDM2LCAweDA2RiwgMHgwMTMsIDB4MDIzLCAweDBCQSwgMHgwMEMsIDB4MDI0LCAweDBDRSwKKwkweDBCRCwgMHgwRTIsIDB4MEE3LCAweDA1MiwgMHgwQjIsIDB4MDhFLCAweDA2QiwgMHgwNjAsCisJMHgwNjIsIDB4MDJFLCAweDA3NSwgMHgwMTMsIDB4MDMwLCAweDBBQywgMHgwQTAsIDB4MDU5LAorCTB4MENBLCAweDA2NCwgMHgwNjMsIDB4MDc5LCAweDBCMywgMHgwMzMsIDB4MDY1LCAweDAxQywKKwkweDBDQywgMHgwMzIsIDB4MDA0LCAweDA1QywgMHgwRUEsIDB4MDJDLCAweDBBMCwgMHgwNTksCisJMHgwREYsIDB4MDIzLCAweDAxQiwgMHgwRDQsIDB4MDgzLCAweDA1MiwgMHgwNDcsIDB4MERELAorCTB4MDc5LCAweDA5NiwgMHgwRDQsIDB4MDlFLCAweDBCMywgMHgwNTIsIDB4MDRCLCAweDBBMiwKKwkweDA1QSwgMHgwMUEsIDB4MDhELCAweDA1RCwgMHgwN0IsIDB4MDgyLCAweDBBNywgMHgwNTIsCisJMHgwQjIsIDB4MDhFLCAweDA2NiwgMHgwMTksIDB4MDAyLCAweDAyRSwgMHgwNzUsIDB4MDE2LAorCTB4MDUwLCAweDAyQywgMHgwOEMsIDB4MDMyLCAweDAxRCwgMHgwN0IsIDB4MDhFLCAweDBBNywKKwkweDA1MiwgMHgwQjEsIDB4MEJDLCAweDBEOSwgMHgwOTksIDB4MDk4LCAweDAwNCwgMHgwREEsCisJMHgwN0MsIDB4MEUyLCAweDBBQywgMHgwRkUsIDB4MDY2LCAweDAxOSwgMHgwMDIsIDB4MDJFLAorCTB4MDY1LCAweDA1MCwgMHgwQkYsIDB4MDMzLCAweDA2NiwgMHgwNjQsIDB4MEZFLCAweDA3NCwKKwkweDAxOCwgMHgwODYsIDB4MDRDLCAweDAxNywgMHgwMjYsIDB4MEQ2LCAweDAxNiwgMHgwNTIsCisJMHgwMzksIDB4MDE4LCAweDBERSwgMHgwN0EsIDB4MENDLCAweDBDMiwgMHgwM0UsIDB4MDY1LAorCTB4MDE0LCAweDA5MSwgMHgwRjMsIDB4MDY2LCAweDA0OSwgMHgwMDgsIDB4MDZFLCAweDA4MywKKwkweDAwOSwgMHgwMzMsIDB4MEFGLCAweDAzMSwgMHgwRUQsIDB4MDBELCAweDA5RCwgMHgwMDYsCisJMHgwMTIsIDB4MDYyLCAweDAyQSwgMHgwMzEsIDB4MDhELCAweDA2RCwgMHgwRTcsIDB4MDQxLAorCTB4MDgyLCAweDA3QywgMHgwQ0EsIDB4MEE2LCAweDA4OSwgMHgwODcsIDB4MDA5LCAweDAyRSwKKwkweDAyOSwgMHgwQjEsIDB4MEFGLCAweDAxMCwgMHgwMzksIDB4MEQ2LCAweDA2NCwgMHgwOTcsCisJMHgwMzAsIDB4MDFELCAweDA0MiwgMHgwNzUsIDB4MDkzLCAweDA0NCwgMHgwMDIsIDB4MDhDLAorCTB4MDI0LCAweDBEMiwgMHgwN0EsIDB4MEIzLCAweDA1MCwgMHgwRjYsIDB4MDg5LCAweDAwNSwKKwkweDA0MywgMHgwNUUsIDB4MDYxLCAweDA5OCwgMHgwQzAsIDB4MDJDLCAweDA5MiwgMHgwMjUsCisJMHgwM0MsIDB4MDhCLCAweDAyNCwgMHgwODksIDB4MDQ5LCAweDAwNSwgMHgwNDksIDB4MEU3LAorCTB4MDBDLCAweDBCOSwgMHgwODQsIDB4MDk4LCAweDBCNywgMHgwQUQsIDB4MDMzLCAweDA0NCwKKwkweDBBRSwgMHgwNUEsIDB4MDUxLCAweDA4NiwgMHgwNjAsIDB4MDlGLCAweDAzOCwgMHgwQTksCisJMHgwQTIsIDB4MDZDLCAweDA2QiwgMHgwQzQsIDB4MDhFLCAweDBGNCwgMHgwNUUsIDB4MDQ5LAorCTB4MDQ2LCAweDAxMiwgMHgwNjIsIDB4MERFLCAweDBCNCwgMHgwQ0QsIDB4MDIxLCAweDA1QywKKwkweDBCNCwgMHgwQTMsIDB4MDBDLCAweDBDMSwgMHgwM0UsIDB4MDcyLCAweDAyOSwgMHgwQTIsCisJMHgwNkMsIDB4MDZCLCAweDBDNiwgMHgwMTIsIDB4MDYyLCAweDA0NywgMHgwRjAsIDB4MEU4LAorCTB4MEMzLCAweDAzMiwgMHgwMDQsIDB4MDM1LCAweDA0MCwgMHgwOTIsIDB4MEE0LCAweDA4MiwKKwkweDA4OCwgMHgwMTAsIDB4MDkyLCAweDA3QywgMHgwQ0IsIDB4MEQ0LCAweDAyRiwgMHgwQTQsCisJMHgwMDIsIDB4MDExLCAweDA4NCwgMHgwOTgsIDB4MEI3LCAweDBBRCwgMHgwMzMsIDB4MDQ0LAorCTB4MEFFLCAweDA1QSwgMHgwNTEsIDB4MDg2LCAweDA2MCwgMHgwOUYsIDB4MDM4LCAweDBBOSwKKwkweDBBMiwgMHgwNkMsIDB4MDZCLCAweDBDNCwgMHgwOEUsIDB4MEY0LCAweDA1RSwgMHgwNDksCisJMHgwNDQsIDB4MDA4LCAweDA0OSwgMHgwM0UsIDB4MDY1LCAweDBFQSwgMHgwMTcsIDB4MEQyLAorCTB4MDAxLCAweDAwOCwgMHgwQzIsIDB4MDRDLCAweDA1QiwgMHgwRDYsIDB4MDk5LCAweDBBNCwKKwkweDAyQiwgMHgwOTYsIDB4MDk0LCAweDA2MSwgMHgwOTgsIDB4MDI3LCAweDBDRSwgMHgwNDUsCisJMHgwMzQsIDB4MDRELCAweDA4RCwgMHgwNzgsIDB4MDgxLCAweDAwOSwgMHgwMjcsIDB4MENDLAorCTB4MEJELCAweDAxMiwgMHgwMjgsIDB4MDZDLCAweDA1OCwgMHgwQUYsIDB4MEI2LCAweDBGMywKKwkweDBBMCwgMHgwQzEsIDB4MDNFLCAweDA2NSwgMHgwNTMsIDB4MDQ0LCAweDBEOCwgMHgwRDcsCisJMHgwOTIsIDB4MDhFLCAweDA3RCwgMHgwNEIsIDB4MEMyLCAweDBGQSwgMHgwNjEsIDB4MDI2LAorCTB4MDA2LCAweDAzQSwgMHgwQjMsIDB4MDZCLCAweDAwMywgMHgwMDUsIDB4MDQ5LCAweDBFNywKKwkweDAwQywgMHgwQjksIDB4MDZGLCAweDA1QSwgMHgwNjYsIDB4MDk1LCAweDA1QywgMHgwQjQsCisJMHgwQTMsIDB4MDBDLCAweDBDMSwgMHgwM0UsIDB4MDcwLCAweDAyOSwgMHgwQTIsIDB4MDZFLAorCTB4MEE0LCAweDBERiwgMHgwOTMsIDB4MDcxLCAweDAxMywgMHgwNzcsIDB4MDI2LCAweDBFMSwKKwkweDAyNiwgMHgwRjgsIDB4MDI2LCAweDBDNiwgMHgwQkMsIDB4MDk0LCAweDA3MywgMHgwRjksCisJMHgwMkYsIDB4MDBCLCAweDBFOSwgMHgwODQsIDB4MDk4LCAweDAxOCwgMHgwRUEsIDB4MENDLAorCTB4MEVDLCAweDAwQywgMHgwMTUsIDB4MDI3LCAweDA5QywgMHgwMzIsIDB4MEZGLCAweDAzRCwKKwkweDA1NiwgMHgwQUYsIDB4MDkyLCAweDA4QiwgMHgwN0EsIDB4MEQzLCAweDAzNSwgMHgwRDUsCisJMHgwQ0IsIDB4MDRBLCAweDAzMCwgMHgwQ0MsIDB4MDEzLCAweDBFNywgMHgwMDIsIDB4MDlBLAorCTB4MDI2LCAweDBDNiwgMHgwQkMsIDB4MDk0LCAweDA3MywgMHgwNDEsIDB4MDk3LCAweDA5MSwKKwkweDBGNCwgMHgwODMsIDB4MENFLCAweDAwNCwgMHgwMjAsIDB4MDYyLCAweDA4QiwgMHgwMDUsCisJMHgwMTYsIDB4MDQ5LCAweDA4QywgMHgwMjQsIDB4MEMwLCAweDBDNywgMHgwNTYsIDB4MDkwLAorCTB4MEMwLCAweDBDMSwgMHgwNTIsIDB4MDc5LCAweDBDMywgMHgwMkUsIDB4MDVCLCAweDBENSwKKwkweDBBNiwgMHgwNzIsIDB4MEQyLCAweDA5NCwgMHgwRkEsIDB4MEFELCAweDA1OCwgMHgwQzgsCisJMHgwRkEsIDB4MDlGLCAweDA1NCwgMHgwQjMsIDB4MDMyLCAweDA0QiwgMHgwQjksIDB4MDU0LAorCTB4MEE2LCAweDA1MSwgMHgwODYsIDB4MDZCLCAweDA3OSwgMHgwRDAsIDB4MDYwLCAweDA5RiwKKwkweDAzMiwgMHgwMDUsIDB4MDM0LCAweDA0RCwgMHgwOEQsIDB4MDdBLCAweDA0RCwgMHgwMUUsCisJMHgwN0EsIDB4MEIzLCAweDA1MSwgMHgwMDAsIDB4MEE5LCAweDAzRCwgMHgwNTksIDB4MEE4LAorCTB4MDdCLCAweDA0NCwgMHgwODIsIDB4MEExLCAweDBBRiwgMHgwNEEsIDB4MDhELCAweDA1MiwKKwkweDBBOSwgMHgwNTIsIDB4MDQxLCAweDA0OSwgMHgwNEYsIDB4MDNBLCAweDAyRSwgMHgwNDAsCisJMHgwQTQsIDB4MDk5LCAweDA1MCwgMHgwQkUsIDB4MDkwLCAweDAwOCwgMHgwNTIsIDB4MDc5LAorCTB4MEMzLCAweDAyRSwgMHgwNjEsIDB4MDI2LCAweDAyRCwgMHgwRUIsIDB4MDRDLCAweDBEMCwKKwkweDAxNSwgMHgwQ0IsIDB4MDRBLCAweDAzMCwgMHgwQ0MsIDB4MDEzLCAweDBFNywgMHgwMDIsCisJMHgwOUEsIDB4MDI2LCAweDBDNiwgMHgwQkMsIDB4MDQ4LCAweDBGRSwgMHgwMUQsIDB4MDI1LAorCTB4MDQ2LCAweDBBOSwgMHgwNTQsIDB4MEE5LCAweDAyMCwgMHgwQTQsIDB4MEE3LCAweDA5RCwKKwkweDAxNywgMHgwMjAsIDB4MDUyLCAweDA0QywgMHgwQTgsIDB4MDVGLCAweDA0OCwgMHgwMDQsCisJMHgwMjMsIDB4MDA5LCAweDAzMSwgMHgwNkYsIDB4MDVBLCAweDA2NiwgMHgwODAsIDB4MEFFLAorCTB4MDVBLCAweDA1MSwgMHgwODYsIDB4MDYwLCAweDA5RiwgMHgwMzgsIDB4MDE0LCAweDBEMSwKKwkweDAzNiwgMHgwMzUsIDB4MEU0LCAweDBBNywgMHgwOUQsIDB4MDE3LCAweDAyMCwgMHgwNTIsCisJMHgwNEMsIDB4MEEyLCAweDA0NSwgMHgwMEQsIDB4MDhCLCAweDAxNSwgMHgwRjQsIDB4MDkxLAorCTB4MERFLCAweDA4QiwgMHgwQzksIDB4MDI4LCAweDBDMiwgMHgwNEMsIDB4MDVCLCAweDBENiwKKwkweDA5OSwgMHgwQTksIDB4MDVDLCAweDBCNCwgMHgwQTMsIDB4MDBDLCAweDBENiwgMHgwRjMsCisJMHgwQTAsIDB4MEMxLCAweDAzRSwgMHgwNjQsIDB4MDBBLCAweDA2OCwgMHgwOUIsIDB4MDFBLAorCTB4MEYxLCAweDA2RCwgMHgwNEMsIDB4MEFBLCAweDA5MiwgMHgwRTAsIDB4MDM2LCAweDA5NCwKKwkweDA3MCwgMHgwOUIsIDB4MDI5LCAweDA3OCwgMHgwMTMsIDB4MEFFLCAweDBCMywgMHgwQUEsCisJMHgwODUsIDB4MEQ0LCAweDA0MywgMHgwNzUsIDB4MDA5LCAweDAzQSwgMHgwQzksIDB4MEVCLAorCTB4MDM1LCAweDAyNCwgMHgwQjgsIDB4MDFCLCAweDAzMiwgMHgwOEUsIDB4MDEzLCAweDA0OCwKKwkweDA3RSwgMHgwNEUsIDB4MEZELCAweDA0MCwgMHgwRkQsIDB4MDQwLCAweDBGRCwgMHgwNDAsCisJMHgwRkQsIDB4MDQwLCAweDBGRCwgMHgwNDAsIDB4MEZDLCAweDAxMywgMHgwRjQsIDB4MDIxLAorCTB4MEY5LCAweDAxNywgMHgwNDUsIDB4MDhBLCAweDAzMCwgMHgwMEIsIDB4MDMzLCAweDA1RiwKKwkweDA4MywgMHgwQTIsIDB4MDJBLCAweDAzMCwgMHgwMEIsIDB4MDMzLCAweDA1RiwgMHgwODMsCisJMHgwQTIsIDB4MEE4LCAweDBDMCwgMHgwMkQsIDB4MEIzLCAweDAyMCwgMHgwNzAsIDB4MDkyLAorCTB4MDEzLCAweDA5QSwgMHgwREUsIDB4MDc0LCAweDAxOCwgMHgwMjcsIDB4MENDLCAweDBBQSwKKwkweDA2OCwgMHgwOUIsIDB4MDFBLCAweDBGNywgMHgwMDcsIDB4MDQ1LCAweDA1MSwgMHgwODAsCisJMHgwNUIsIDB4MDY2LCAweDA0NywgMHgwMDcsIDB4MDM4LCAweDBBOCwgMHgwMjMsIDB4MEU3LAorCTB4MDUxLCAweDAxMSwgMHgwM0YsIDB4MEUwLCAweDBFOCwgMHgwODUsIDB4MDQ2LCAweDAwMSwKKwkweDA2RCwgMHgwOTksIDB4MDA2LCAweDAxMiwgMHgwNjUsIDB4MDRGLCAweDA3QSwgMHgwMjAsCisJMHgwMjQsIDB4MEJBLCAweDBCMywgMHgwMzIsIDB4MDE1LCAweDAyNSwgMHgwN0IsIDB4MEFELAorCTB4MDMzLCAweDA3OCwgMHgwQUUsIDB4MDBFLCAweDA3MywgMHgwRDAsIDB4MDQ3LCAweDBDRSwKKwkweDBBNywgMHgwMzAsIDB4MENDLCAweDA0NCwgMHgwRkYsIDB4MDgzLCAweDBBMiwgMHgwQTgsCisJMHgwQzAsIDB4MDJDLCAweDBEOSwgMHgwOTEsIDB4MEMxLCAweDBEMSwgMHgwMTUsIDB4MDE4LAorCTB4MDA1LCAweDA5QiwgMHgwMzIsIDB4MDA4LCAweDBCQSwgMHgwMkMsIDB4MDUxLCAweDA4MCwKKwkweDA1OSwgMHgwQjMsIDB4MDIwLCAweDA3MCwgMHgwOTIsIDB4MEUyLCAweDA5OCwgMHgwODksCisJMHgwRkQsIDB4MEJDLCAweDBFRSwgMHgwMTgsIDB4MDkwLCAweDBGQywgMHgwOEIsIDB4MEEyLAorCTB4MEM1LCAweDAyQiwgMHgwMEQsIDB4MDc4LCAweDAzQSwgMHgwMjIsIDB4MEE1LCAweDA2MSwKKwkweDBBRiwgMHgwMDcsIDB4MDQ1LCAweDA1MSwgMHgwODAsIDB4MDVCLCAweDA2NiwgMHgwNDQsCisJMHgwOUUsIDB4MEIzLCAweDA1MiwgMHgwNEIsIDB4MDgzLCAweDBBRCwgMHgwQzcsIDB4MDA5LAorCTB4MEJFLCAweDAxRiwgMHgwOUYsIDB4MDc0LCAweDA2NSwgMHgwNUQsIDB4MDBBLCAweDAxNywKKwkweDA3QywgMHgwQUIsIDB4MEEwLCAweDBDMiwgMHgwNEMsIDB4MDM4LCAweDA0OSwgMHgwMTIsCisJMHgwMkUsIDB4MDM4LCAweDA0OSwgMHgwMDcsIDB4MEEzLCAweDAwQywgMHgwQzEsIDB4MDNFLAorCTB4MDY1LCAweDA1MywgMHgwNDQsIDB4MEQ4LCAweDBENywgMHgwQUQsIDB4MEU3LCAweDAwMCwKKwkweDAzMiwgMHgwNEIsIDB4MDlCLCAweDAzMywgMHgwMzQsIDB4MDRBLCAweDAwMywgMHgwMDAsCisJMHgwOUQsIDB4MDI1LCAweDBDRSwgMHgwODMsIDB4MDI0LCAweDBCOCwgMHgwMTksIDB4MDk5LAorCTB4MDhDLCAweDAwMiwgMHgwMTIsIDB4MDRCLCAweDBBMSwgMHgwOTksIDB4MEQ4LCAweDBDMCwKKwkweDAyNywgMHgwNDksIDB4MDczLCAweDBDRiwgMHgwRjksIDB4MDNDLCAweDBGNCwgMHgwN0MsCisJMHgwRTcsIDB4MDk4LCAweDAwNCwgMHgwRTksIDB4MDJFLCAweDA3RiwgMHgwMzksIDB4MEUzLAorCTB4MDRGLCAweDA0NiwgMHgwNTMsIDB4MEMwLCAweDA2MCwgMHgwMTMsIDB4MEE0LCAweDBCOSwKKwkweDBFNSwgMHgwM0MsIDB4MDAzLCAweDBERSwgMHgwOEYsIDB4MDlDLCAweDBGMywgMHgwMDAsCisJMHgwOUMsIDB4MDZGLCAweDBDRiwgMHgwM0UsIDB4MDg1LCAweDBGOSwgMHgwQTMsIDB4MDM2LAorCTB4MDAyLCAweDAxRSwgMHgwNjAsIDB4MDM4LCAweDA5MiwgMHgwM0UsIDB4MDYzLCAweDAxQSwKKwkweDAxMCwgMHgwOUYsIDB4MENGLCAweDAxOCwgMHgwMTAsIDB4MDkyLCAweDBCQywgMHgwRDAsCisJMHgwQTQsIDB4MDBDLCAweDBEQywgMHgwQzAsIDB4MDBGLCAweDA5QywgMHgwOTcsIDB4MDM0LAorCTB4MDYyLCAweDBCNiwgMHgwRTcsIDB4MEYzLCAweDBGMywgMHgwQTUsIDB4MENGLCAweDAxOCwKKwkweDA0MiwgMHgwMzQsIDB4MDFDLCAweDBDMiwgMHgwQ0EsIDB4MEZBLCAweDA4RSwgMHgwNjgsCisJMHgwNTIsIDB4MDA2LCAweDBBRiwgMHgwM0MsIDB4MEEzLCAweDAwRCwgMHgwQkYsIDB4MDlFLAorCTB4MDUwLCAweDBFMSwgMHgwRDEsIDB4MDczLCAweDBDQSwgMHgwRTAsIDB4MDNBLCAweDBGQywKKwkweDBDMSwgMHgwMDksIDB4MDFBLCAweDAxRSwgMHgwNkEsIDB4MDVDLCAweDA1QiwgMHgwOEUsCisJMHgwNjMsIDB4MDRFLCAweDA3NywgMHgwNzMsIDB4MENDLCAweDA2MSwgMHgwNjcsIDB4MERELAorCTB4MEU2LCAweDA2QywgMHgwNDgsIDB4MEQxLCAweDBGMywgMHgwMUIsIDB4MDI0LCAweDA2OSwKKwkweDA1MSwgMHgwMDgsIDB4MEQ0LCAweDA0MiwgMHgwMUIsIDB4MEY0LCAweDA2NywgMHgwRDEsCisJMHgwODAsIDB4MDRFLCAweDAyRiwgMHgwRDAsIDB4MDhDLCAweDBEOCwgMHgwMzAsIDB4MDA5LAorCTB4MEMyLCAweDAxRSwgMHgwODAsIDB4MDFDLCAweDA0NiwgMHgwMDEsIDB4MDNBLCAweDA0NywKKwkweDBEMCwgMHgwMzEsIDB4MEExLCAweDAwNiwgMHgwMDEsIDB4MDNBLCAweDA3RiwgMHgwNDYsCisJMHgwMzAsIDB4MDIxLCAweDAxOCwgMHgwMDQsIDB4MEU5LCAweDA1RSwgMHgwODQsIDB4MDI5LAorCTB4MDAwLCAweDBDMCwgMHgwMjcsIDB4MENELCAweDBEMCwgMHgwMDAsIDB4MDdDLCAweDA5OCwKKwkweDAwNCwgMHgwRjksIDB4MDJFLCAweDA4NCwgMHgwNjIsIDB4MDhDLCAweDAwMiwgMHgwN0QsCisJMHgwQkEsIDB4MDNFLCAweDA3RSwgMHgwNEMsIDB4MDAyLCAweDA3RCwgMHgwMkUsIDB4MDhDLAorCTB4MDYxLCAweDAwOCwgMHgwMzAsIDB4MDA5LCAweDBGNCwgMHgwMUQsIDB4MDAxLCAweDA2NSwKKwkweDA3MywgMHgwMDAsIDB4MDlGLCAweDA1MSwgMHgwRDAsIDB4MDg1LCAweDAyMCwgMHgwMTgsCisJMHgwMDQsIDB4MEZBLCAweDBCRCwgMHgwMTksIDB4MDQ2LCAweDAxOCwgMHgwQzAsIDB4MDI3LAorCTB4MERGLCAweDBEMSwgMHgwOTQsIDB4MDM4LCAweDA0QywgMHgwMDIsIDB4MDdELCAweDAxNywKKwkweDA0NiwgMHgwNTcsIDB4MDAxLCAweDAzMCwgMHgwMDksIDB4MEY1LCAweDBGQSwgMHgwMDEsCisJMHgwMDksIDB4MDA2LCAweDAwMSwgMHgwM0UsIDB4MDg3LCAweDBBMSwgMHgwNEIsIDB4MDg4LAorCTB4MEMwLCAweDAyNywgMHgwREMsIDB4MDc0LCAweDAwRCwgMHgwMzksIDB4MEQzLCAweDAwMCwKKwkweDA5RiwgMHgwNzMsIDB4MEQwLCAweDAzMCwgMHgwQjMsIDB4MDk4LCAweDAwNCwgMHgwRkIsCisJMHgwQkQsIDB4MDA2LCAweDBDNCwgMHgwODMsIDB4MDAwLCAweDA5RiwgMHgwNDcsIDB4MEQwLAorCTB4MDM2LCAweDA0OCwgMHgwQ0MsIDB4MDAyLCAweDA3MSwgMHgwQkYsIDB4MDNGLCAweDA5QSwKKwkweDAxNywgMHgwRTYsIDB4MDNGLCAweDAwOCwgMHgwMjEsIDB4MEU2LCAweDA5MiwgMHgwQTQsCisJMHgwOEYsIDB4MDlBLCAweDAxMCwgMHgwMzEsIDB4MEE3LCAweDBGMywgMHgwMTAsIDB4MEIxLAorCTB4MDg0LCAweDBBRiwgMHgwM0EsIDB4MEFDLCAweDBEQywgMHgwRjcsIDB4MDczLCAweDBGMiwKKwkweDA1QywgMHgwQzYsIDB4MDJBLCAweDBEQiwgMHgwOUUsIDB4MDdFLCAweDA3RSwgMHgwOTcsCisJMHgwMzEsIDB4MDA4LCAweDA2MywgMHgwRDAsIDB4MDczLCAweDA3QiwgMHgwNDMsIDB4MEE4LAorCTB4MEU2LCAweDAzRCwgMHgwMzQsIDB4MEVBLCAweDBGMywgMHgwRTMsIDB4MDE1LCAweDBCRiwKKwkweDA5RiwgMHgwMTgsIDB4MDVGLCAweDA0NSwgMHgwQ0YsIDB4MEU4LCAweDA5RiwgMHgwNUYsCisJMHgwOUEsIDB4MDVCLCAweDAwMywgMHgwRDAsIDB4MEYzLCAweDBEMywgMHgwQ0UsIDB4MDM3LAorCTB4MDFDLCAweDBEMCwgMHgwMEYsIDB4MEJCLCAweDA5RSwgMHgwNjgsIDB4MDc4LCAweDAzQiwKKwkweDBCQywgMHgwQ0EsIDB4MDMxLCAweDBFOCwgMHgwRjksIDB4MEEyLCAweDAwMiwgMHgwMTIsCisJMHgwQTIsIDB4MDczLCAweDA1MSwgMHgwMDgsIDB4MDZGLCAweDBEMSwgMHgwRjMsIDB4MDQ2LAorCTB4MDAxLCAweDAzOCwgMHgwQkYsIDB4MDQwLCAweDBGQywgMHgwMjMsIDB4MDAwLCAweDA5QywKKwkweDAyMSwgMHgwRTgsIDB4MDQ5LCAweDA1MSwgMHgwODAsIDB4MDRFLCAweDA5MSwgMHgwRjQsCisJMHgwMjEsIDB4MDAzLCAweDAxOSwgMHgwODAsIDB4MDRFLCAweDA5RiwgMHgwRDAsIDB4MDIxLAorCTB4MDYzLCAweDAwNiwgMHgwMDEsIDB4MDNBLCAweDA1NiwgMHgwOEMsIDB4MDAyLCAweDA3NCwKKwkweDBGRSwgMHgwNzUsIDB4MDQ5LCAweDA1RSwgMHgwNjMsIDB4MEQzLCAweDA0QSwgMHgwNTQsCisJMHgwNDIsIDB4MDM1LCAweDAxMywgMHgwQTcsIDB4MEQxLCAweDA4MCwgMHgwNEUsIDB4MDk1LAorCTB4MEU4LCAweDAxRSwgMHgwOUEsIDB4MDRDLCAweDAwMiwgMHgwN0MsIDB4MERELCAweDAxQiwKKwkweDBCOSwgMHgwRTYsIDB4MDAxLCAweDAzRSwgMHgwNEIsIDB4MEEwLCAweDA2MiwgMHgwQTMsCisJMHgwMDAsIDB4MDlGLCAweDA2RSwgMHgwOEMsIDB4MEZDLCAweDBGMywgMHgwMDAsIDB4MDlGLAorCTB4MDRCLCAweDBBMCwgMHgwNDIsIDB4MDE4LCAweDBDQywgMHgwMDIsIDB4MDdELCAweDAwNywKKwkweDA0MywgMHgwREEsIDB4MDEzLCAweDAwMCwgMHgwOUYsIDB4MDUxLCAweDBEMCwgMHgwM0QsCisJMHgwMzQsIDB4MDk4LCAweDAwNCwgMHgwRkEsIDB4MEJELCAweDAxQywgMHgwNjIsIDB4MDhDLAorCTB4MDAyLCAweDA3RCwgMHgwRkQsIDB4MDFDLCAweDA2MSwgMHgwNzMsIDB4MDAwLCAweDA5RiwKKwkweDA0NSwgMHgwRDEsIDB4MEY0LCAweDA0RSwgMHgwNjAsIDB4MDEzLCAweDBFQiwgMHgwRjQsCisJMHgwMjUsIDB4MEIwLCAweDAzMywgMHgwMDAsIDB4MDlGLCAweDA0MywgMHgwRDEsIDB4MEE3LAorCTB4MDlDLCAweDAxOCwgMHgwMDQsIDB4MEZCLCAweDA4RSwgMHgwODQsIDB4MDAzLCAweDBFOSwKKwkweDA4MCwgMHgwNEYsIDB4MEI5LCAweDBFOCwgMHgwNDMsIDB4MEMxLCAweDAzMCwgMHgwMDksCisJMHgwRjcsIDB4MDdBLCAweDAwQSwgMHgwMzEsIDB4MDk4LCAweDAwNCwgMHgwRkEsIDB4MDNFLAorCTB4MDg0LCAweDA0MCwgMHgwNDEsIDB4MDgwLCAweDA0RSwgMHgwODIsIDB4MEU3LCAweDA0MSwKKwkweDA4NywgMHgwMDksIDB4MDIzLCAweDAwNCwgMHgwMjMsIDB4MDAwLCAweDA5RCwgMHgwMDUsCisJMHgwQ0UsIDB4MDk2LCAweDAxQywgMHgwMjQsIDB4MDhDLCAweDAxMCwgMHgwOEMsIDB4MDAyLAorCTB4MDc0LCAweDAxNywgMHgwM0EsIDB4MDA0LCAweDAzOCwgMHgwNDksIDB4MDE4LCAweDAyMSwKKwkweDAxOCwgMHgwMDQsIDB4MEU4LCAweDAyRSwgMHgwNzQsIDB4MDUwLCAweDBFMSwgMHgwMjQsCisJMHgwNjAsIDB4MDg0LCAweDA2MCwgMHgwMTMsIDB4MEEwLCAweDBCOSwgMHgwRDQsIDB4MDExLAorCTB4MEMyLCAweDA0OCwgMHgwQzEsIDB4MDA4LCAweDBDMCwgMHgwMjcsIDB4MDQxLCAweDA3MywKKwkweDBBOCwgMHgwMjMsIDB4MDg0LCAweDA5MSwgMHgwODIsIDB4MDExLCAweDA4MCwgMHgwNEUsCisJMHgwODIsIDB4MEU3LCAweDA1MiwgMHgwOEUsIDB4MDEyLCAweDA0NiwgMHgwMDgsIDB4MDQ2LAorCTB4MDAxLCAweDAzQSwgMHgwMEIsIDB4MDlELCAweDA0MCwgMHgwMUMsIDB4MDI0LCAweDA4QywKKwkweDAxMCwgMHgwOEMsIDB4MDAyLCAweDA3NCwgMHgwMTcsIDB4MDNBLCAweDAwOSwgMHgwMEUsCisJMHgwMTIsIDB4MDQ2LCAweDAwOCwgMHgwNDYsIDB4MDAxLCAweDAzQSwgMHgwMEIsIDB4MDk4LAorCTB4MDZBLCAweDAxQywgMHgwMjQsIDB4MEIwLCAweDBFMSwgMHgwMTgsIDB4MDA0LCAweDBFOCwKKwkweDAyRSwgMHgwNkIsIDB4MDUwLCAweDBFMSwgMHgwMjUsIDB4MDg3LCAweDAwOCwgMHgwQzAsCisJMHgwMjcsIDB4MDQxLCAweDA3MywgMHgwMDUsIDB4MDQzLCAweDA4NCwgMHgwOTYsIDB4MDFDLAorCTB4MDIzLCAweDAwMCwgMHgwOUQsIDB4MDA1LCAweDBDQywgMHgwQUEsIDB4MDFDLCAweDAyNCwKKwkweDBCMCwgMHgwRTEsIDB4MDE4LCAweDAwNCwgMHgwRTgsIDB4MDJFLCAweDA3MCwgMHgwNjgsCisJMHgwNzAsIDB4MDkyLCAweDBDMywgMHgwODQsIDB4MDYwLCAweDAxMywgMHgwRTUsIDB4MDQ0LAorCTB4MEY5LCAweDA0MCwgMHgwOUQsIDB4MDA1LCAweDBDRSwgMHgwNUEsIDB4MDFDLCAweDAyNCwKKwkweDBCMCwgMHgwRTEsIDB4MDE4LCAweDAwNCwgMHgwRjksIDB4MEQxLCAweDAzRSwgMHgwNzAsCisJMHgwMjcsIDB4MENGLCAweDAxMywgMHgwRTUsIDB4MDQ0LCAweDAyQywgMHgwQTAsIDB4MDQyLAorCTB4MENCLCAweDA4OSwgMHgwRjIsIDB4MDIxLCAweDAzQSwgMHgwMEIsIDB4MDlDLCAweDAwQSwKKwkweDAxQywgMHgwMjQsIDB4MEIwLCAweDBFMSwgMHgwMTgsIDB4MDA0LCAweDBGOSwgMHgwRDEsCisJMHgwMEIsIDB4MDM4LCAweDAxMCwgMHgwQjMsIDB4MEM0LCAweDAyMSwgMHgwMzksIDB4MDM2LAorCTB4MDVDLCAweDA0MiwgMHgwQzgsIDB4MDg0LCAweDAyQiwgMHgwNzksIDB4MEQwLCAweDA2MSwKKwkweDBDMiwgMHgwNzQsIDB4MDE1LCAweDAyNCwgMHgwQkEsIDB4MEQzLCAweDAzMSwgMHgwRTUsCisJMHgwNTksIDB4MDA4LCAweDAyOSwgMHgwMDgsIDB4MEUwLCAweDA2NiwgMHgwNjMsIDB4MDQyLAorCTB4MDk1LCAweDAxMiwgMHgwODEsIDB4MDAwLCAweDAyOSwgMHgwMEIsIDB4MEMxLCAweDA1MSwKKwkweDAyNCwgMHgwQjgsIDB4MDE5LCAweDA5OSwgMHgwOTAsIDB4MDIyLCAweDA5MCwgMHgwQjQsCisJMHgwMTgsIDB4MEEwLCAweDA5MSwgMHgwNDEsIDB4MDAxLCAweDA0MSwgMHgwNDEsIDB4MDQxLAorCTB4MDUyLCAweDA4MywgMHgwQ0EsIDB4MDQwLCAweDAyOCwgMHgwNjgsIDB4MDI5LCAweDAwOCwKKwkweDBCQSwgMHgwMTYsIDB4MDEwLCAweDA5QywgMHgwOTksIDB4MDBCLCAweDA1NiwgMHgwOTQsCisJMHgwOTAsIDB4MDUyLCAweDAxNSwgMHgwNzQsIDB4MEMwLCAweDAyNywgMHgwMUEsIDB4MDJBLAorCTB4MEQyLCAweDA5MCwgMHgwMjUsIDB4MEQzLCAweDAwMCwgMHgwOUQsIDB4MDI4LCAweDBBQiwKKwkweDA0QSwgMHgwNDIsIDB4MDE3LCAweDA0QywgMHgwMDIsIDB4MDcwLCAweDBENCwgMHgwODQsCisJMHgwMkUsIDB4MDk4LCAweDAwNCwgMHgwRTEsIDB4MDJBLCAweDA0MiwgMHgwMTcsIDB4MDRDLAorCTB4MDAyLCAweDA3MCwgMHgwODIsIDB4MDkwLCAweDA0QiwgMHgwQTYsIDB4MDAxLCAweDAzOCwKKwkweDA1MSwgMHgwNDgsIDB4MDQyLCAweDBFOSwgMHgwODAsIDB4MDRFLCAweDAxNSwgMHgwQTQsCisJMHgwMjEsIDB4MDc0LCAweDBDMCwgMHgwMjcsIDB4MDBGLCAweDBBNCwgMHgwMTIsIDB4MEU5LAorCTB4MDgwLCAweDA0RSwgMHgwODIsIDB4MEFDLCAweDA4MCwgMHgwQUMsIDB4MEEwLCAweDBBQywKKwkweDBBOSwgMHgwNTksIDB4MEU1LCAweDA2NCwgMHgwNDUsIDB4MDY1LCAweDBDQSwgMHgwQzgsCisJMHgwNEEsIDB4MENFLCAweDAwQSwgMHgwQ0UsIDB4MDRBLCAweDBDRSwgMHgwOTUsIDB4MDkxLAorCTB4MDk1LCAweDA5NCwgMHgwOTUsIDB4MDkzLCAweDAyOSwgMHgwMjUsIDB4MEMwLCAweDBDQywKKwkweDBDQywgMHgwODgsIDB4MEE0LCAweDA5NywgMHgwNTYsIDB4MDM2LCAweDA2NCwgMHgwNzIsCisJMHgwOTAsIDB4MDU0LCAweDA4QSwgMHgwOUMsIDB4MDQ1LCAweDAwOCwgMHgwQjksIDB4MEI3LAorCTB4MDY2LCAweDAxMiwgMHgwOTMsIDB4MDA5LCAweDBDOSwgMHgwQjIsIDB4MDc0LCAweDA4RSwKKwkweDBCQSwgMHgwNjAsIDB4MDEzLCAweDBFNSwgMHgwMzQsIDB4MDhFLCAweDBCQSwgMHgwNjAsCisJMHgwMTMsIDB4MEU0LCAweDA3NCwgMHgwOEUsIDB4MEJBLCAweDA2MCwgMHgwMTMsIDB4MEU1LAorCTB4MDY5LCAweDAxRCwgMHgwNzQsIDB4MEMwLCAweDAyNywgMHgwQ0EsIDB4MDI5LCAweDAxRCwKKwkweDA3NCwgMHgwQzAsIDB4MDI3LCAweDBDRSwgMHgwRDIsIDB4MDI1LCAweDBEMywgMHgwMDAsCisJMHgwOUYsIDB4MDM4LCAweDBBNCwgMHgwNEIsIDB4MEE2LCAweDAwMSwgMHgwM0UsIDB4MDVFLAorCTB4MDkxLCAweDAyRSwgMHgwOTgsIDB4MDA0LCAweDBGOSwgMHgwMTUsIDB4MDIyLCAweDA1RCwKKwkweDAzMCwgMHgwMDksIDB4MEYzLCAweDBFOSwgMHgwMTIsIDB4MEU5LCAweDA4MCwgMHgwNEYsCisJMHgwOTAsIDB4MDUyLCAweDAyNSwgMHgwRDMsIDB4MDAwLCAweDA5RCwgMHgwQzUsIDB4MDQ4LAorCTB4MDI1LCAweDBEMywgMHgwMDAsIDB4MDlDLCAweDA0NSwgMHgwQ0UsIDB4MENELCAweDAwOSwKKwkweDBDOSwgMHgwQjIsIDB4MDFBLCAweDA0NCwgMHgwQkEsIDB4MDYwLCAweDAxMywgMHgwRTcsCisJMHgwMzQsIDB4MDg5LCAweDA3NCwgMHgwQzAsIDB4MDI3LCAweDAxQywgMHgwMjcsIDB4MEI3LAorCTB4MDlDLCAweDA4MCwgMHgwQzIsIDB4MEQ3LCAweDA3NiwgMHgwNTksIDB4MDlCLCAweDA5MywKKwkweDAwQywgMHgwNjQsIDB4MEMzLCAweDAxRCwgMHgwMUIsIDB4MEY0LCAweDA0NSwgMHgwNEIsCisJMHgwQzcsIDB4MEM2LCAweDAzQSwgMHgwMzcsIDB4MEU4LCAweDA4MSwgMHgwNEIsIDB4MEM3LAorCTB4MEM2LCAweDAzQSwgMHgwMzcsIDB4MEU4LCAweDA5MSwgMHgwNEIsIDB4MEM3LCAweDBDNiwKKwkweDAzMiwgMHgwNjEsIDB4MDhFLCAweDBCMywgMHgwQkMsIDB4MEMzLCAweDA0QSwgMHgwMjIsCisJMHgwRTYsIDB4MEI1LCAweDAyNCwgMHgwOTcsIDB4MDcxLCAweDBDOSwgMHgwODcsIDB4MEI0LAorCTB4MDMxLCAweDBBRSwgMHgwNzMsIDB4MEEyLCAweDBDRiwgMHgwMzksIDB4MEQyLCAweDA1RCwKKwkweDAwNCwgMHgwNDQsIDB4MDQyLCAweDBDMCwgMHgwRDYsIDB4MERFLCAweDA3MSwgMHgwMDYsCisJMHgwMTYsIDB4MEJCLCAweDBEQiwgMHgwQ0UsIDB4MDgzLCAweDAwQywgMHgwNjQsIDB4MEMzLAorCTB4MDFELCAweDAzMSwgMHgwMTMsIDB4MDA0LCAweDBGOSwgMHgwOTUsIDB4MDRELCAweDAxMywKKwkweDAzMiwgMHgwOTMsIDB4MDYzLCAweDA1RSwgMHgwNjYsIDB4MDE0LCAweDBDQywgMHgwMjksCisJMHgwMkEsIDB4MDUzLCAweDAzMCwgMHgwQTYsIDB4MDYxLCAweDA0QywgMHgwQzIsIDB4MDk5LAorCTB4MDg1LCAweDAzQSwgMHgwNzIsIDB4MENDLCAweDBDMiwgMHgwOTksIDB4MDg1LCAweDAwNiwKKwkweDAxQiwgMHgwQjMsIDB4MDBBLCAweDA2NiwgMHgwMTQsIDB4MDE0LCAweDAyNCwgMHgwOTksCisJMHgwODUsIDB4MDMzLCAweDAwQSwgMHgwMDgsIDB4MEIxLCAweDA4NiwgMHgwNjEsIDB4MDRDLAorCTB4MEMyLCAweDA4NCwgMHgwMjEsIDB4MDY4LCAweDA3MywgMHgwM0IsIDB4MDMwLCAweDBBNiwKKwkweDA2MSwgMHgwNDEsIDB4MDRFLCAweDBBNSwgMHgwOTgsIDB4MDUzLCAweDAzMCwgMHgwQUMsCisJMHgwNTksIDB4MDc2LCAweDA2MSwgMHgwNEMsIDB4MEMyLCAweDBCMCwgMHgwOEQsIDB4MEQ2LAorCTB4MDYxLCAweDA0QywgMHgwQzIsIDB4MEIwLCAweDAyQywgMHgwRjYsIDB4MDYxLCAweDA0QywKKwkweDBDMiwgMHgwQjEsIDB4MDhDLCAweDBBNSwgMHgwOTgsIDB4MDUzLCAweDAzMCwgMHgwQUMsCisJMHgwMEYsIDB4MDI0LCAweDBDQywgMHgwMjksIDB4MDk4LCAweDA1NiwgMHgwMEYsIDB4MDI4LAorCTB4MDY2LCAweDAxNSwgMHgwOTIsIDB4MDFBLCAweDAxOSwgMHgwODUsIDB4MDMzLCAweDAwQSwKKwkweDBDQSwgMHgwODUsIDB4MDBDLCAweDBDMiwgMHgwOTksIDB4MDg1LCAweDA2NSwgMHgwQzMsCisJMHgwRDksIDB4MDg1LCAweDAzMywgMHgwMEEsIDB4MENFLCAweDA3MCwgMHgwODYsIDB4MDYxLAorCTB4MDRDLCAweDBDMiwgMHgwQjMsIDB4MDk3LCAweDA3MSwgMHgwMEMsIDB4MDk5LCAweDAzQiwKKwkweDBDQywgMHgwODMsIDB4MDU4LCAweDAwQiwgMHgwRUEsIDB4MDc3LCAweDA5RCwgMHgwMDYsCisJMHgwNEEsIDB4MEJFLCAweDAwNCwgMHgwNzQsIDB4MDYwLCAweDBFMCwgMHgwRDEsIDB4MDRFLAorCTB4MDM4LCAweDA0QywgMHgwM0UsIDB4MEVFLCAweDAzRSwgMHgwRUUsIDB4MDNFLCAweDBFRSwKKwkweDAzRSwgMHgwRUUsIDB4MDMwLCAweDBCQiwgMHgwQ0EsIDB4MEUxLCAweDAxRiwgMHgwNzcsCisJMHgwMUYsIDB4MDc3LCAweDAxRiwgMHgwNzcsIDB4MDFGLCAweDA3NywgMHgwMjcsIDB4MDcwLAorCTB4MDhGLCAweDBCQiwgMHgwODAsIDB4MDBFLCAweDAxMSwgMHgwRjcsIDB4MDcxLCAweDBGNywKKwkweDA3QywgMHgwNkYsIDB4MDNDLCAweDBCMywgMHgwMzYsIDB4MDAyLCAweDBGQiwgMHgwOEQsCisJMHgwRTYsIDB4MDU1LCAweDA3MCwgMHgwN0YsIDB4MDJELCAweDAyNCwgMHgwNjksIDB4MDU1LAorCTB4MDRGLCAweDA1OCwgMHgwQTksIDB4MDIzLCAweDAxRiwgMHgwNTQsIDB4MEY3LCAweDA4QSwKKwkweDA5NSwgMHgwMjUsIDB4MDJCLCAweDA3NSwgMHgwMEMsIDB4MENDLCAweDBBQywgMHgwNTYsCisJMHgwNTEsIDB4MENDLCAweDA1MSwgMHgwRTQsIDB4MDQ1LCAweDBDRSwgMHgwQTIsIDB4MDEyLAorCTB4MDM5LCAweDBDMCwgMHgwQTAsIDB4MEFGLCAweDA1NiwgMHgwNkEsIDB4MDQ5LCAweDA3RiwKKwkweDAwMiwgMHgwOEMsIDB4MDA5LCAweDBGOCwgMHgwMEIsIDB4MEVCLCAweDBBRiwgMHgwNTYsCisJMHgwNzYsIDB4MDY3LCAweDA1MiwgMHgwQjIsIDB4MDhFLCAweDA2OSwgMHgwQTcsIDB4MDExLAorCTB4MDczLCAweDBBOCwgMHgwQjEsIDB4MEJDLCAweDBDQSwgMHgwQTAsIDB4MEE5LCAweDAzNiwKKwkweDA1MCwgMHgwMkMsIDB4MDk4LCAweDBFNywgMHgwMEEsIDB4MEY1LCAweDA2NiwgMHgwQTQsCisJMHgwOTcsIDB4MEUyLCAweDA1QSwgMHgwMzAsIDB4MDI3LCAweDBCQSwgMHgwRjcsIDB4MDgzLAorCTB4MDRFLCAweDBBNSwgMHgwMzMsIDB4MDBBLCAweDA2NiwgMHgwMTUsIDB4MDhELCAweDBFNiwKKwkweDA1NSwgMHgwMzksIDB4MEQyLCAweDBBNywgMHgwQUMsIDB4MDU0LCAweDA2MCwgMHgwMTYsCisJMHgwNzAsIDB4MDFCLCAweDA3MiwgMHgwOEUsIDB4MDYyLCAweDA4RiwgMHgwMjIsIDB4MDJFLAorCTB4MDc1LCAweDAxNiwgMHgwMDIsIDB4MEZCLCAweDA4RCwgMHgwRTYsIDB4MDBBLCAweDA5NSwKKwkweDAzRCwgMHgwNjIsIDB4MEEzLCAweDAwMCwgMHgwQjcsIDB4MDAxLCAweDBCNSwgMHgwNTMsCisJMHgwREUsIDB4MDJBLCAweDA1NCwgMHgwOTQsIDB4MEFELCAweDBENCwgMHgwMzMsIDB4MDMyLAorCTB4MEIxLCAweDA1OSwgMHgwNDcsIDB4MDMxLCAweDA0NywgMHgwOTEsIDB4MDE3LCAweDAzQSwKKwkweDA4OCwgMHgwNDgsIDB4MEU3LCAweDAwMiwgMHgwQjAsIDB4MDE3LCAweDBEQywgMHgwNjcsCisJMHgwOUQsIDB4MDRCLCAweDA4RCwgMHgwRTcsIDB4MDUyLCAweDBBQSwgMHgwN0IsIDB4MEQ0LAorCTB4MEFBLCAweDA5MiwgMHgwQkQsIDB4MEQ2LCAweDA5OSwgMHgwQkMsIDB4MDU2LCAweDAwMiwKKwkweDBGQiwgMHgwOEMsIDB4MEYzLCAweDA2NiwgMHgwNjYsIDB4MEM2LCAweDBGMywgMHgwNjYsCisJMHgwNjYsIDB4MDYyLCAweDA5OSwgMHgwMkEsIDB4MEY4LCAweDAxOCwgMHgwNjgsIDB4MDcwLAorCTB4MEIwLCAweDA4QSwgMHgwMEQsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1MiwKKwkweDAzMiwgMHgwRTEsIDB4MDQwLCAweDA1QywgMHgwMzgsIDB4MDBCLCAweDBFQSwgMHgwOUIsCisJMHgwODcsIDB4MDAxLCAweDA3RCwgMHgwQzAsIDB4MDVGLCAweDA3MCwgMHgwMTcsIDB4MERDLAorCTB4MDA1LCAweDBGNSwgMHgwREMsIDB4MDlCLCAweDAwMSwgMHgwN0QsIDB4MDYxLCAweDA0RCwKKwkweDA4MCwgMHgwQkUsIDB4MEE3LCAweDA3OSwgMHgwODIsIDB4MEEyLCAweDAxRiwgMHgwNTAsCisJMHgwMTUsIDB4MDJBLCAweDA4RiwgMHgwOEIsIDB4MDFDLCAweDBFNSwgMHgwQTUsIDB4MDEzLAorCTB4MDg0LCAweDA1OCwgMHgwRTcsIDB4MDAyLCAweDA5MSwgMHgwNTQsIDB4MDA1LCAweDAwMiwKKwkweDA0QiwgMHgwQkQsIDB4MDIyLCAweDAxQSwgMHgwOTQsIDB4MDdGLCAweDA5QywgMHgwMUEsCisJMHgwQzAsIDB4MDVGLCAweDA0MiwgMHgwMUEsIDB4MDIxLCAweDBEMSwgMHgwODAsIDB4MDU5LAorCTB4MEMwLCAweDA2RCwgMHgwMUMsIDB4MDJDLCAweDAwQSwgMHgwODMsIDB4MDU1LCAweDA1NSwKKwkweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsCisJMHgwNTUsIDB4MDU0LCAweDAxQywgMHgwQjgsIDB4MDVDLCAweDA2RSwgMHgwMTcsIDB4MDlDLAorCTB4MDJGLCAweDAzOCwgMHgwNUUsIDB4MDcwLCAweDBFNywgMHgwQjgsIDB4MDVFLCAweDA3MCwKKwkweDBCQywgMHgwRTEsIDB4MDc5LCAweDBDMiwgMHgwRjMsIDB4MDg1LCAweDBFNywgMHgwMEIsCisJMHgwQ0UsIDB4MDE3LCAweDA5QywgMHgwMjksIDB4MDlDLCAweDAyOSwgMHgwOUMsIDB4MDI5LAorCTB4MDlDLCAweDAyMywgMHgwMEYsIDB4MDU4LCAweDAxNCwgMHgwRUUsIDB4MDM1LCAweDA3NywKKwkweDAyNiwgMHgwMjEsIDB4MDkzLCAweDAwNSwgMHgwQzksIDB4MEIwLCAweDAxNywgMHgwRDIsCisJMHgwMUQsIDB4MDE4LCAweDA4QSwgMHgwMjEsIDB4MDkzLCAweDAwNSwgMHgwQzksIDB4MEIwLAorCTB4MDE3LCAweDBEMSwgMHgwODcsIDB4MEFDLCAweDAwQSwgMHgwNzQsIDB4MDBGLCAweDBBRSwKKwkweDBGNSwgMHgwNUEsIDB4MDgyLCAweDBBMywgMHgwRTQsIDB4MDNBLCAweDAzMSwgMHgwMTQsCisJMHgwQkIsIDB4MEQ3LCAweDA1OSwgMHgwOTksIDB4MDc0LCAweDBBMiwgMHgwMTksIDB4MDMwLAorCTB4MDVDLCAweDA5QiwgMHgwMDEsIDB4MDdELCAweDAxOCwgMHgwN0EsIDB4MEMwLCAweDBBNywKKwkweDA0MCwgMHgwRjgsIDB4MDQzLCAweDBENCwgMHgwNjMsIDB4MDg5LCAweDAyNSwgMHgwRDAsCisJMHgwMTAsIDB4MEQ2LCAweDAxQywgMHgwNkEsIDB4MDEwLCAweDBGNSwgMHgwNTUsIDB4MDg5LAorCTB4MDI1LCAweDBEMSwgMHgwNTEsIDB4MDY2LCAweDAxRiwgMHgwNTEsIDB4MEY1LCAweDA5MSwKKwkweDA0OSwgMHgwMkUsIDB4MDg5LCAweDAxNSwgMHgwOTgsIDB4MDZBLCAweDBBMywgMHgwRTAsCisJMHgwOEEsIDB4MDk0LCAweDA2NSwgMHgwNjQsIDB4MDBFLCAweDAxMywgMHgwMTcsIDB4MDM4LAorCTB4MEE4LCAweDA4NiwgMHgwNEMsIDB4MDE3LCAweDAyNiwgMHgwQzAsIDB4MDVGLCAweDA0NiwKKwkweDAxRSwgMHgwQjAsIDB4MDI4LCAweDA2MywgMHgwMUYsIDB4MDA4LCAweDA3QSwgMHgwOEMsCisJMHgwNzEsIDB4MDI0LCAweDBCQSwgMHgwMDIsIDB4MDFBLCAweDBEMCwgMHgwMEQsIDB4MDQyLAorCTB4MDFFLCAweDBBQSwgMHgwQjEsIDB4MDI0LCAweDBCQSwgMHgwMkEsIDB4MDJELCAweDAzMSwKKwkweDBGNSwgMHgwMUYsIDB4MDU4LCAweDA3NCwgMHgwOTIsIDB4MEU4LCAweDA4NywgMHgwNUEsCisJMHgwNjMsIDB4MDUyLCAweDBERSwgMHgwRjQsIDB4MDUxLCAweDA2OSwgMHgwNEEsIDB4MDNFLAorCTB4MDA5LCAweDA2OSwgMHgwNDYsIDB4MDUwLCAweDBGMCwgMHgwRTEsIDB4MDMxLCAweDA3MywKKwkweDAwNSwgMHgwNDUsIDB4MEJELCAweDA1OSwgMHgwOEQsIDB4MDhCLCAweDA0QSwgMHgwN0MsCisJMHgwRDMsIDB4MEVELCAweDAzOCwgMHgwRTksIDB4MEQzLCAweDA0RSwgMHgwNzQsIDB4MEVELAorCTB4MDQ0LCAweDAzMiwgMHgwNjAsIDB4MEI5LCAweDAzNiwgMHgwMDIsIDB4MEZBLCAweDA1QiwKKwkweDBERSwgMHgwOEEsIDB4MDJELCAweDAyOSwgMHgwRDAsIDB4MEUxLCAweDAyMSwgMHgwRjUsCisJMHgwQTMsIDB4MDkyLCAweDAyMSwgMHgwRjIsIDB4MDE5LCAweDAzMCwgMHgwNUMsIDB4MDlCLAorCTB4MDAxLCAweDA3RCwgMHgwMjEsIDB4MEY1LCAweDBBMCwgMHgwQzYsIDB4MDAxLCAweDA2NywKKwkweDAwMSwgMHgwQjQsIDB4MDQ1LCAweDBDRSwgMHgwQTUsIDB4MDEyLCAweDAzOSwgMHgwRDQsCisJMHgwMUMsIDB4MDA1LCAweDBGNCwgMHgwNDAsIDB4MEExLCAweDBDMiwgMHgwQzMsIDB4MDUwLAorCTB4MDZBLCAweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBQSwKKwkweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLCAweDA4MSwgMHgwQUYsCisJMHgwODYsIDB4MDlGLCAweDAxOSwgMHgwMUIsIDB4MEU3LCAweDA4MSwgMHgwRjMsIDB4MDY1LAorCTB4MEYyLCAweDA4MCwgMHgwQkUsIDB4MDcwLCAweDAxNywgMHgwREYsIDB4MERGLCAweDAzOCwKKwkweDAwQiwgMHgwRUIsIDB4MDBELCAweDBDMywgMHgwODAsIDB4MEJFLCAweDBBNywgMHgwMEYsCisJMHgwOTUsIDB4MDRGLCAweDA1QSwgMHgwOTQsIDB4MEMwLCAweDAyQywgMHgwRDgsIDB4MEIxLAorCTB4MEE3LCAweDBDRSwgMHgwNUEsIDB4MDExLCAweDA3MywgMHgwQTgsIDB4MDNBLCAweDBDMiwKKwkweDBDQywgMHgwQjYsIDB4MDMwLCAweDAxNywgMHgwREMsIDB4MDZGLCAweDAzNSwgMHgwQTksCisJMHgwODAsIDB4MDRELCAweDBBNywgMHgwQ0UsIDB4MDJBLCAweDAxOCwgMHgwNzksIDB4MEM1LAorCTB4MDQ5LCAweDBERSwgMHgwNjEsIDB4MEE4LCAweDAyMiwgMHgwRTcsIDB4MDUwLCAweDAzMywKKwkweDBGOSwgMHgwOTgsIDB4MDY0LCAweDAwOCwgMHgwQjksIDB4MDk1LCAweDA0MiwgMHgwRkMsCisJMHgwQ0MsIDB4MEQ5LCAweDA5NSwgMHgwM0QsIDB4MDYyLCAweDBBMiwgMHgwNDgsIDB4MEQ0LAorCTB4MDQ4LCAweDBFNywgMHgwMDIsIDB4MDg4LCAweDBCOSwgMHgwQzEsIDB4MEEwLCAweDBFMywKKwkweDA5RCwgMHgwNEUsIDB4MDYyLCAweDBFNiwgMHgwQ0MsIDB4MEM2LCAweDA2QiwgMHgwQ0UsCisJMHgwODMsIDB4MDEwLCAweDBDOSwgMHgwODIsIDB4MEU0LCAweDBEQSwgMHgwQzIsIDB4MEM4LAorCTB4MDFFLCAweDBDMywgMHgwQjksIDB4MDM2LCAweDAwMiwgMHgwRkEsIDB4MEE5LCAweDBFQiwKKwkweDA0RSwgMHgwMzAsIDB4MDMwLCAweDBGQSwgMHgwMEQsIDB4MEYwLCAweDBBOSwgMHgwRUIsCisJMHgwNDAsIDB4MEI5LCAweDAwRiwgMHgwQUEsIDB4MDdBLCAweDBEMiwgMHgwQzIsIDB4MEM4LAorCTB4MEZBLCAweDBBNywgMHgwQUQsIDB4MDQxLCAweDAwQSwgMHgwNDcsIDB4MEQ1LCAweDAzRCwKKwkweDA2OCwgMHgwQUMsIDB4MEYxLCAweDBGNSwgMHgwNEYsIDB4MDVBLCAweDA5NywgMHgwNTQsCisJMHgwN0QsIDB4MDRGLCAweDBBOCwgMHgwQUEsIDB4MDU1LCAweDAxRiwgMHgwMTEsIDB4MDczLAorCTB4MDVBLCAweDBCMCwgMHgwMTcsIDB4MERFLCAweDA1RCwgMHgwNTksIDB4MEE5LCAweDAyNSwKKwkweDBEMCwgMHgwNTUsIDB4MDJBLCAweDA0NiwgMHgwQkMsIDB4MEI4LCAweDAyMiwgMHgwQUUsCisJMHgwNDUsIDB4MDI5LCAweDAzRSwgMHgwMTQsIDB4MEZBLCAweDBFMSwgMHgwOTksIDB4MDk0LAorCTB4MENBLCAweDA0QSwgMHgwQkUsIDB4MDNELCAweDBENiwgMHgwOTksIDB4MDkyLCAweDA1RCwKKwkweDAxNSwgMHgwMTcsIDB4MEM4LCAweDBENywgMHgwREMsIDB4MDE1LCAweDAxNywgMHgwOEEsCisJMHgwNDAsIDB4MDFGLCAweDAwQSwgMHgwOUUsIDB4MEFDLCAweDBDOSwgMHgwNjUsIDB4MDQ5LAorCTB4MDVDLCAweDAxRCwgMHgwMTAsIDB4MDY4LCAweDA0QSwgMHgwM0UsIDB4MDVCLCAweDBERSwKKwkweDA4MywgMHgwMTYsIDB4MDk1LCAweDA4MCwgMHgwQkUsIDB4MDkxLCAweDA3NCwgMHgwNTgsCisJMHgwQTQsIDB4MDAwLCAweDA3QywgMHgwMzgsIDB4MEU3LCAweDA1NiwgMHgwMzAsIDB4MDE3LAorCTB4MERGLCAweDA3NSwgMHgwQTYsIDB4MDY0LCAweDA5NywgMHgwNDUsIDB4MDIwLCAweDA5RCwKKwkweDAwMywgMHgwNUYsIDB4MDcwLCAweDA1NCwgMHgwNUUsIDB4MDI5LCAweDAxRCwgMHgwRjAsCisJMHgwQTksIDB4MEVBLCAweDBDQywgMHgwODYsIDB4MDU0LCAweDA5NSwgMHgwQzEsIDB4MEQxLAorCTB4MDA2LCAweDA4MywgMHgwMEYsIDB4MEFBLCAweDA3QiwgMHgwRDAsIDB4MDY1LCAweDA0OSwKKwkweDA0NSwgMHgwQkQsIDB4MEU5LCAweDA2MiwgMHgwRDIsIDB4MDkxLCAweDBERiwgMHgwMDQsCisJMHgwNUQsIDB4MDE2LCAweDAyOSwgMHgwMUMsIDB4MDdELCAweDA0RiwgMHgwQUMsIDB4MDFBLAorCTB4MDQ3LCAweDAxQSwgMHgwQTksIDB4MEY1LCAweDA2NywgMHgwNjYsIDB4MDUzLCAweDAyOCwKKwkweDBCNywgMHgwQkQsIDB4MDJDLCAweDA1QSwgMHgwNTIsIDB4MDNCLCAweDBFMywgMHgwREQsCisJMHgwNTksIDB4MEE5LCAweDAyNSwgMHgwRDEsIDB4MEE4LCAweDBBQywgMHgwMDgsIDB4MDZCLAorCTB4MEVFLCAweDAwOCwgMHgwQUIsIDB4MEM1LCAweDAyMCwgMHgwMkYsIDB4MDg1LCAweDA0RiwKKwkweDA1NiwgMHgwNjYsIDB4MDc1LCAweDA0OSwgMHgwNUMsIDB4MDFDLCAweDAxOCwgMHgwMUQsCisJMHgwODEsIDB4MEMyLCAweDA2NCwgMHgwMDUsIDB4MEYwLCAweDA4MCwgMHgwQkUsIDB4MDM1LAorCTB4MDVDLCAweDBEMCwgMHgwMTcsIDB4MEMyLCAweDA1NSwgMHgwRjAsIDB4MDk1LCAweDA3QywKKwkweDAyNSwgMHgwNUYsIDB4MDA4LCAweDAwQiwgMHgwRTEsIDB4MDAxLCAweDA3QywgMHgwN0IsCisJMHgwQUIsIDB4MDM1LCAweDAyNCwgMHgwQkEsIDB4MDEwLCAweDA1NSwgMHgwOTMsIDB4MDFBLAorCTB4MEZCLCAweDA4MiwgMHgwMkEsIDB4MEYxLCAweDA0OCwgMHgwRDcsIDB4MEMyLCAweDBBNywKKwkweDBBQiwgMHgwMzEsIDB4MEIyLCAweDBBNCwgMHgwQUMsIDB4MDYzLCAweDA5RCwgMHgwNEEsCisJMHgwOEQsIDB4MDdDLCAweDA3QiwgMHgwQUIsIDB4MDM1LCAweDAyNCwgMHgwQkEsIDB4MDEwLAorCTB4MDU0LCAweDAzMCwgMHgwOEQsIDB4MDdELCAweDBDMSwgMHgwMTUsIDB4MDc4LCAweDBBQywKKwkweDA2RiwgMHgwNUEsIDB4MDk0LCAweDA2MCwgMHgwMUEsIDB4MEUzLCAweDA3OSwgMHgwRDQsCisJMHgwQUEsIDB4MDRGLCAweDA4NSwgMHgwNEYsIDB4MDU2LCAweDA2NiwgMHgwRDUsIDB4MDQ5LAorCTB4MDU4LCAweDBDNywgMHgwM0EsIDB4MDk1LCAweDA0OSwgMHgwRjAsIDB4MDQ1LCAweDBEMSwKKwkweDA2MiwgMHgwOTQsIDB4MDg2LCAweDBCQywgMHgwMUQsIDB4MDEzLCAweDBEMiwgMHgwOTAsCisJMHgwRkYsIDB4MENGLCAweDA3QSwgMHgwODMsIDB4MEYyLCAweDA1MCwgMHgwMzEsIDB4MERFLAorCTB4MDAwLCAweDA2MCwgMHgwNjAsIDB4MEExLCAweDAxNywgMHgwMzUsIDB4MEE4LCAweDA1RiwKKwkweDA5QiwgMHgwMUIsIDB4MDM3LCAweDAwNywgMHgwNDQsIDB4MDFBLCAweDAzMCwgMHgwMEIsCisJMHgwMzgsIDB4MDBELCAweDBCQywgMHgwMUMsIDB4MEUwLCAweDBEMCwgMHgwNDcsIDB4MENFLAorCTB4MEEwLCAweDBBQSwgMHgwN0EsIDB4MEExLCAweDA5OCwgMHgwNkEsIDB4MDkyLCAweDA5NSwKKwkweDAzRCwgMHgwNjgsIDB4MDMxLCAweDA4MCwgMHgwNUIsIDB4MDgwLCAweDBEQSwgMHgwQTksCisJMHgwRUYsIDB4MDQxLCAweDA5NSwgMHgwMjUsIDB4MDE2LCAweDBGNywgMHgwQTUsIDB4MDhCLAorCTB4MDRBLCAweDBDNiwgMHgwNzksIDB4MEIzLCAweDAzMywgMHgwNjAsIDB4MDJGLCAweDBBQSwKKwkweDA5RSwgMHgwQjEsIDB4MDUxLCAweDA4MCwgMHgwNTksIDB4MDlFLCAweDBDQSwgMHgwQTcsCisJMHgwQUMsIDB4MDBBLCAweDAzMCwgMHgwMEIsIDB4MDY3LCAweDBCMiwgMHgwQUQsIDB4MEQ1LAorCTB4MERBLCAweDA5MiwgMHgwNUQsIDB4MDE3LCAweDBBMywgMHgwMDAsIDB4MEIzLCAweDAyRCwKKwkweDA5NSwgMHgwNkUsIDB4MDA4LCAweDBBOSwgMHgwNTgsIDB4MEExLCAweDAxNywgMHgwM0EsCisJMHgwOEIsIDB4MDAxLCAweDA3RCwgMHgwNTQsIDB4MEY3LCAweDA4RSwgMHgwOTUsIDB4MDI1LAorCTB4MDA4LCAweDAxQywgMHgwRTAsIDB4MDU2LCAweDAwMiwgMHgwRkIsIDB4MEMxLCAweDBEMSwKKwkweDAxNSwgMHgwMTgsIDB4MDA1LCAweDA5MiwgMHgwNkIsIDB4MDNDLCAweDAxRCwgMHgwMTIsCisJMHgwMjgsIDB4MEMwLCAweDAyQywgMHgwQTUsIDB4MDZDLCAweDAxMSwgMHgwNzAsIDB4MDE3LAorCTB4MEIyLCAweDAzOCwgMHgwNEQsIDB4MDgwLCAweDBCRSwgMHgwRTAsIDB4MDJGLCAweDBCNCwKKwkweDBFQywgMHgwNEEsIDB4MEVELCAweDBCMywgMHgwOUUsIDB4MDAyLCAweDBGQiwgMHgwODAsCisJMHgwQkUsIDB4MEUwLCAweDAyRiwgMHgwQjEsIDB4MDM5LCAweDA5MywgMHgwM0UsIDB4MDZELAorCTB4MEU3LCAweDAxMCwgMHgwNjAsIDB4MDlGLCAweDAzMiwgMHgwQTksIDB4MEEyLCAweDA2QywKKwkweDAwNSwgMHgwRjQsIDB4MDQwLCAweDBFNiwgMHgwMEEsIDB4MDk1LCAweDAzRCwgMHgwNkEsCisJMHgwMjMsIDB4MDAwLCAweDBCMywgMHgwODAsIDB4MERBLCAweDBBNywgMHgwRDYsIDB4MDJBLAorCTB4MDAzLCAweDAwRCwgMHgwNzAsIDB4MDE3LCAweDBEMiwgMHgwMkUsIDB4MDc2LCAweDAyOSwKKwkweDA0RiwgMHgwQkMsIDB4MDU0LCAweDBBNiwgMHgwNTEsIDB4MDZGLCAweDA3QSwgMHgwNTgsCisJMHgwQjQsIDB4MEFDLCAweDAwNSwgMHgwRjQsIDB4MDhCLCAweDBBMiwgMHgwRjQsIDB4MDBFLAorCTB4MDM1LCAweDAwRCwgMHgwNDksIDB4MDJFLCAweDBCNCwgMHgwQ0MsIDB4MDE4LCAweDBBNSwKKwkweDBDOCwgMHgwRjgsIDB4MDRBLCAweDA5NywgMHgwMjMsIDB4MEUxLCAweDAwNSwgMHgwMkUsCisJMHgwNDcsIDB4MEMyLCAweDA4QSwgMHgwNUMsIDB4MDhGLCAweDA4NSwgMHgwNjksIDB4MDcyLAorCTB4MDNFLCAweDAxRiwgMHgwNEEsIDB4MEMzLCAweDA1NSwgMHgwMUYsIDB4MDU2LCAweDA0MywKKwkweDAzMiwgMHgwOEMsIDB4MEEzLCAweDA1RSwgMHgwNjAsIDB4MEE4LCAweDA0NSwgMHgwQ0UsCisJMHgwMEQsIDB4MDYwLCAweDAyRiwgMHgwQTMsIDB4MDg0LCAweDA5RCwgMHgwRDgsIDB4MEYwLAorCTB4MDE3LCAweDBEMiwgMHgwMkUsIDB4MDBFLCAweDAxQiwgMHgwMjMsIDB4MDg0LCAweDBEOCwKKwkweDAwQiwgMHgwRUIsIDB4MDg5LCAweDBGMywgMHgwODAsIDB4MEJFLCAweDBFMCwgMHgwMkYsCisJMHgwQkIsIDB4MDM5LCAweDA4NSwgMHgwREYsIDB4MDIyLCAweDAwMywgMHgwRTcsIDB4MDAxLAorCTB4MDdELCAweDBDMCwgMHgwNUYsIDB4MDcwLCAweDAxNywgMHgwRDEsIDB4MDE3LCAweDAzOCwKKwkweDAxNCwgMHgwNUIsIDB4MEQ2LCAweDBBMiwgMHgwNzQsIDB4MDBELCAweDA0QiwgMHgwN0EsCisJMHgwQjMsIDB4MDMxLCAweDA5NiwgMHgwOTQsIDB4MDZCLCAweDBDQywgMHgwMzUsIDB4MDIzLAorCTB4MEQ3LCAweDA0OSwgMHgwNDgsIDB4MDE1LCAweDA3MywgMHgwMjksIDB4MDBGLCAweDA1RCwKKwkweDA4QSwgMHgwQzAsIDB4MDVGLCAweDA0RCwgMHgwNzksIDB4MDg0LCAweDAzNSwgMHgwODAsCisJMHgwQkUsIDB4MDg4LCAweDAxQywgMHgwQzMsIDB4MDUyLCAweDA5RiwgMHgwNTksIDB4MDY4LAorCTB4MEMwLCAweDAyQywgMHgwRTAsIDB4MDM2LCAweDBBQSwgMHgwN0IsIDB4MENELCAweDA0QSwKKwkweDA5MiwgMHgwQkUsIDB4MEYzLCAweDA4MSwgMHgwNEEsIDB4MDdELCAweDA1QiwgMHgwNTksCisJMHgwOTQsIDB4MENBLCAweDAxQywgMHgwMjQsIDB4MEVFLCAweDBDNywgMHgwODAsIDB4MEJFLAorCTB4MDg4LCAweDAxQywgMHgwQzMsIDB4MDUyLCAweDA5RiwgMHgwNTksIDB4MDY4LCAweDBDMCwKKwkweDAyQywgMHgwRTAsIDB4MDM2LCAweDBBQSwgMHgwN0IsIDB4MENELCAweDA0QSwgMHgwOTIsCisJMHgwQkUsIDB4MEYzLCAweDA4MSwgMHgwNDMsIDB4MDg0LCAweDA5QywgMHgwN0IsIDB4MDM4LAorCTB4MDBCLCAweDBFQiwgMHgwQUYsIDB4MDcwLCAweDBENCwgMHgwRUEsIDB4MDUzLCAweDAwMCwKKwkweDA5QiwgMHgwNEYsIDB4MDlDLCAweDA1NCwgMHgwMzAsIDB4MEYzLCAweDA4QSwgMHgwOTQsCisJMHgwRkEsIDB4MEI2LCAweDBCMywgMHgwMjksIDB4MDk0LCAweDAyMiwgMHgwRTYsIDB4MDFBLAorCTB4MDg1LCAweDBGOSwgMHgwQjAsIDB4MDU5LCAweDA5MywgMHgwRjksIDB4MEQyLCAweDBDNCwKKwkweDAzMiwgMHgwNjAsIDB4MEI5LCAweDAzNiwgMHgwQjAsIDB4MEIzLCAweDA5MCwgMHgwRDksCisJMHgwNzcsIDB4MDI2LCAweDAxQywgMHgwMjcsIDB4MDIyLCAweDBFOCwgMHgwOTYsIDB4MEI0LAorCTB4MDIzLCAweDBFQSwgMHgwOUUsIDB4MEI1LCAweDAxMSwgMHgwODAsIDB4MDU5LCAweDA2NSwKKwkweDA4NiwgMHgwMjAsIDB4MDczLCAweDA5NiwgMHgwOEQsIDB4MDc5LCAweDBBRCwgMHgwNTgsCisJMHgwMEIsIDB4MEU5LCAweDAxNywgMHgwNDQsIDB4MDhBLCAweDA0QSwgMHgwMDcsIDB4MEQ3LAorCTB4MDdBLCAweDA4MiwgMHgwQTEsIDB4MDkwLCAweDBGQSwgMHgwRUYsIDB4MDAxLCAweDA1NCwKKwkweDBCQSwgMHgwNTAsIDB4MEQ0LCAweDA1OSwgMHgwMUUsIDB4MDJDLCAweDBFOSwgMHgwRjMsCisJMHgwOEEsIDB4MDk5LCAweDA4NSwgMHgwNkIsIDB4MDBCLCAweDAyMywgMHgwMTUsIDB4MDk3LAorCTB4MDcyLCAweDA2MSwgMHgwMTcsIDB4MDMwLCAweDBENCwgMHgwMkMsIDB4MDczLCAweDA4NywKKwkweDA0OCwgMHgwQUEsIDB4MDAyLCAweDA4MSwgMHgwMjUsIDB4MERFLCAweDA5MSwgMHgwMEQsCisJMHgwNEEsIDB4MEMwLCAweDA1RiwgMHgwN0UsIDB4MEQyLCAweDA4MCwgMHgwQTUsIDB4MDNFLAorCTB4MEIyLCAweDBEMCwgMHgwQzgsIDB4MDZCLCAweDA4MCwgMHgwQkUsIDB4MDg4LCAweDAxQywKKwkweDBFQSwgMHgwMDksIDB4MDE3LCAweDA0NCwgMHgwMUEsIDB4MDM3LCAweDAxQSwgMHgwOTEsCisJMHgwNzQsIDB4MDU4LCAweDBBMywgMHgwNzEsIDB4MEFGLCAweDAwNywgMHgwNDQsIDB4MDU0LAorCTB4MDZFLCAweDAzNSwgMHgwRTAsIDB4MEU4LCAweDBBQSwgMHgwNjQsIDB4MDBGLCAweDA5MCwKKwkweDBGQSwgMHgwRDAsIDB4MDYzLCAweDAwMCwgMHgwQjMsIDB4MDgwLCAweDBEQSwgMHgwMkMsCisJMHgwNzMsIDB4MDg3LCAweDA0OCwgMHgwQUEsIDB4MDAyLCAweDA4MSwgMHgwMjUsIDB4MERFLAorCTB4MDkxLCAweDAwRCwgMHgwNEEsIDB4MEMwLCAweDA1RiwgMHgwNDgsIDB4MEJBLCAweDAyNywKKwkweDBBMywgMHgwMDAsIDB4MEI3LCAweDAwMSwgMHgwQjcsIDB4MDRGLCAweDA5QywgMHgwQjQsCisJMHgwNkIsIDB4MENDLCAweDAzNSwgMHgwMTYsIDB4MEY1LCAweDA2NiwgMHgwNjMsIDB4MDJELAorCTB4MDI5LCAweDAxRSwgMHgwQkEsIDB4MDRBLCAweDA0MCwgMHgwQUIsIDB4MDk5LCAweDA0OCwKKwkweDA3QSwgMHgwRUMsIDB4MDUwLCAweDA4QiwgMHgwOUMsIDB4MDA4LCAweDAyMiwgMHgwRkMsCisJMHgwRjksIDB4MEIyLCAweDA1NSwgMHgwM0QsIDB4MDYyLCAweDBBOSwgMHgwMjMsIDB4MDUxLAorCTB4MDIzLCAweDA5QywgMHgwMEEsIDB4MDNDLCAweDA3MywgMHgwMEQsIDB4MDQ0LCAweDA1QywKKwkweDBFMSwgMHgwNTAsIDB4MDcxLCAweDBDRSwgMHgwQTEsIDB4MDFGLCAweDBFNywgMHgwMTUsCisJMHgwNkIsIDB4MDBCLCAweDAyNSwgMHgwRUQsIDB4MDBCLCAweDA5MywgMHgwNjAsIDB4MDJGLAorCTB4MEFBLCAweDA5RSwgMHgwQUMsIDB4MDM2LCAweDA2NSwgMHgwNDksIDB4MDVGLCAweDA3QSwKKwkweDAyMCwgMHgwNTAsIDB4MDA4LCAweDA3RiwgMHgwRUYsIDB4MDM5LCAweDAxNCwgMHgwNDksCisJMHgwMDEsIDB4MDExLCAweDA4MSwgMHgwMDQsIDB4MDYwLCAweDA0MCwgMHgwQ0MsIDB4MDU5LAorCTB4MEMwLCAweDBBRCwgMHgwMjMsIDB4MEVCLCAweDA0MSwgMHgwQjAsIDB4MDgxLCAweDBGMiwKKwkweDAzQSwgMHgwNDEsIDB4MEFBLCAweDA1MCwgMHgwNDMsIDB4MEU0LCAweDBENCwgMHgwODYsCisJMHgwNTQsIDB4MEEwLCAweDA4NywgMHgwQzEsIDB4MDUyLCAweDBDQSwgMHgwOTMsIDB4MDAxLAorCTB4MDMyLCAweDA1NCwgMHgwOUQsIDB4MDI0LCAweDAwMiwgMHgwMDAsIDB4MDAwLCAweDA1MiwKKwkweDBBRiwgMHgwMTYsIDB4MDQ2LCAweDBBNywgMHgwOTEsIDB4MDY3LCAweDAwOCwgMHgwQjQsCisJMHgwMDQsIDB4MDUxLCAweDBGMSwgMHgwNjUsIDB4MDE5LCAweDBCNCwgMHgwNkUsIDB4MDJELAorCTB4MEMwLCAweDBBRCwgMHgwNDksIDB4MDAwLCAweDA5MiwgMHgwNTcsIDB4MDFCLCAweDA3NCwKKwkweDA0NSwgMHgwNUYsIDB4MDIzLCAweDA1MSwgMHgwQjcsIDB4MDQ0LCAweDAwQSwgMHgwMTAsCisJMHgwMDYsIDB4MEEzLCAweDA2RSwgMHgwOEIsIDB4MDZCLCAweDAwOCwgMHgwMUYsIDB4MDE5LAorCTB4MEQxLCAweDBFNiwgMHgwODAsIDB4MDgyLCAweDA4MCwgMHgwNTQsIDB4MDA0LCAweDAyQSwKKwkweDA0NSwgMHgwOTEsIDB4MEE5LCAweDBFNCwgMHgwNTksIDB4MEMyLCAweDAyRCwgMHgwMDEsCisJMHgwMTQsIDB4MDA0LCAweDA1MCwgMHgwRDMsIDB4MEZDLCAweDA1NSwgMHgwODQsIDB4MDYxLAorCTB4MEQ5LCAweDA4MCwgMHgwNTEsIDB4MDJGLCAweDBFMiwgMHgwMUYsIDB4MDQ2LCAweDA1RiwKKwkweDA0MCwgMHgwRTAsIDB4MDIwLCAweDAxNSwgMHgwNEEsIDB4MEJDLCAweDA1OSwgMHgwMUEsCisJMHgwOUUsIDB4MDQ1LCAweDA5QywgMHgwMjIsIDB4MEQwLCAweDAxMSwgMHgwNDgsIDB4MENCLAorCTB4MEU4LCAweDAxNCwgMHgwMDgsIDB4MDAxLCAweDA1NCwgMHgwMTUsIDB4MEUyLCAweDBDOCwKKwkweDBENCwgMHgwRjIsIDB4MDJDLCAweDBFMSwgMHgwMTYsIDB4MDgwLCAweDA4QSwgMHgwNDYsCisJMHgwNUYsIDB4MDUyLCAweDA3QywgMHgwRDksIDB4MEE4LCAweDBGOCwgMHgwODgsIDB4MEQwLAorCTB4MDVBLCAweDAzQywgMHgwRDIsIDB4MDVDLCAweDA1QiwgMHgwODAsIDB4MERBLCAweDBBNywKKwkweDBENiwgMHgwNUEsIDB4MDA4LCAweDA4NiwgMHgwQTQsIDB4MDVELCAweDAxNywgMHgwQTAsCisJMHgwQzMsIDB4MDUyLCAweDAyRSwgMHgwODgsIDB4MEE4LCAweDAyMiwgMHgwMUYsIDB4MDUzLAorCTB4MEVBLCAweDBEQSwgMHgwQ0MsIDB4MEE2LCAweDA1MCwgMHgwRTEsIDB4MDI3LCAweDA3NiwKKwkweDAzQywgMHgwMDUsIDB4MEY1LCAweDA0RiwgMHgwQUIsIDB4MDZCLCAweDAzMiwgMHgwOTksCisJMHgwNDMsIDB4MDg0LCAweDA5QywgMHgwN0IsIDB4MDM4LCAweDAwQiwgMHgwRTksIDB4MDI3LAorCTB4MEFDLCAweDBENCwgMHgwOTIsIDB4MEUwLCAweDAwRSwgMHgwREEsIDB4MDM4LCAweDA0RCwKKwkweDA4MCwgMHgwQkUsIDB4MEU2LCAweDA3RCwgMHgwNTAsIDB4MEJBLCAweDA1MSwgMHgwQUUsCisJMHgwNjYsIDB4MEVGLCAweDBCQywgMHgwREMsIDB4MDdCLCAweDA4NywgMHgwMUUsIDB4MDAyLAorCTB4MEZBLCAweDA5MywgMHgwRTYsIDB4MENELCAweDA0NywgMHgwQzQsIDB4MDQzLCAweDBDRCwKKwkweDAwRiwgMHgwMzQsIDB4MDlELCAweDBBMywgMHgwMDAsIDB4MEIwLCAweDA1NSwgMHgwMDEsCisJMHgwQUUsIDB4MDAzLCAweDA4NCwgMHgwMDQsIDB4MENFLCAweDAwMSwgMHgwRDAsIDB4MEUxLAorCTB4MDcwLCAweDAwMiwgMHgwODAsIDB4MDBFLCAweDA4OSwgMHgwRTksIDB4MDIyLCAweDAxRiwKKwkweDBFMCwgMHgwRTgsIDB4MDk2LCAweDBCMCwgMHgwMTEsIDB4MEY0LCAweDBDMiwgMHgwQ0UsCisJMHgwMDMsIDB4MDZBLCAweDA0NCwgMHgwMkQsIDB4MEMwLCAweDA2RCwgMHgwNDgsIDB4MDA1LAorCTB4MEI4LCAweDAwRCwgMHgwQTMsIDB4MDAwLCAweDBCNywgMHgwNzYsIDB4MEQ1LCAweDBERSwKKwkweDBCMSwgMHgwNTAsIDB4MERDLCAweDA3RCwgMHgwNzcsIDB4MEJDLCAweDA1NCwgMHgwQkEsCisJMHgwNTIsIDB4MDdGLCAweDA1OCwgMHgwMTQsIDB4MDM0LCAweDAwRiwgMHgwOUEsIDB4MEYzLAorCTB4MDgxLCAweDA1OCwgMHgwMEIsIDB4MEVBLCAweDBFRiwgMHgwNTgsIDB4MDE0LCAweDA2MCwKKwkweDAxNiwgMHgwQTUsIDB4MDZDLCAweDAyRSwgMHgwRjcsIDB4MDgxLCAweDA0QiwgMHgwQTUsCisJMHgwNkYsIDB4MDdELCAweDA1RCwgMHgwRUUsIDB4MEI1LCAweDAyRSwgMHgwOTUsIDB4MDgwLAorCTB4MEJFLCAweDBGMCwgMHgwNzMsIDB4MEJELCAweDAwNCwgMHgwN0MsIDB4MEVBLCAweDBGRSwKKwkweDBFQiwgMHgwNEMsIDB4MERFLCAweDAyOSwgMHgwNTMsIDB4MERELCAweDA2QSwgMHgwNTQsCisJMHgwOTQsIDB4MEE5LCAweDBFQSwgMHgwMEEsIDB4MDhDLCAweDAwMiwgMHgwRDYsIDB4MDRDLAorCTB4MDNDLCAweDAwNSwgMHgwRjQsIDB4MDAwLCAweDBFQSwgMHgwQ0QsIDB4MDU2LCAweDBBRiwKKwkweDBDMCwgMHgwNDcsIDB4MEQyLCAweDA5QywgMHgwOEQsIDB4MDI5LCAweDBDQSwgMHgwRTAsCisJMHgwMkYsIDB4MEFFLCAweDBCRCwgMHgwNzUsIDB4MDk5LCAweDA5RCwgMHgwNEEsIDB4MEY5LAorCTB4MEVGLCAweDA1MSwgMHgwN0MsIDB4MDk0LCAweDAwQywgMHgwNzcsIDB4MDgwLCAweDAxOCwKKwkweDAxOCwgMHgwMjksIDB4MDJBLCAweDBGOCwgMHgwRTAsIDB4MEU4LCAweDBBQSwgMHgwMzAsCisJMHgwMEIsIDB4MDJBLCAweDA5OCwgMHgwN0MsIDB4MDFELCAweDAxMSwgMHgwNTEsIDB4MDgwLAorCTB4MDU5LCAweDA1NCwgMHgwQzMsIDB4MDUxLCAweDBGNSwgMHgwMUIsIDB4MDMzLCAweDAyNCwKKwkweDBCQiwgMHgwODIsIDB4MEE1LCAweDAxOSwgMHgwNUMsIDB4MDFELCAweDAxMCwgMHgwMjgsCisJMHgwQzAsIDB4MDJDLCAweDA5QSwgMHgwQzcsIDB4MEMxLCAweDBEMSwgMHgwMjIsIDB4MDhDLAorCTB4MDAyLCAweDBDOSwgMHgwOTQsIDB4MDY0LCAweDA1QywgMHgwMEMsIDB4MEQ2LCAweDA4RSwKKwkweDAxMywgMHgwNjAsIDB4MDJGLCAweDBCOCwgMHgwMEIsIDB4MEVBLCAweDAzMCwgMHgwRTMsCisJMHgwQzAsIDB4MDVGLCAweDA0OCwgMHgwREMsIDB4MDc4LCAweDAwQiwgMHgwRTgsIDB4MDAwLAorCTB4MEUzLCAweDBDMCwgMHgwNUYsIDB4MDZDLCAweDAzOCwgMHgwRDUsIDB4MDJFLCAweDAzNSwKKwkweDA0RiwgMHgwNUEsIDB4MDhBLCAweDA2MSwgMHgwQUEsIDB4MDlGLCAweDA1NiwgMHgwMUIsCisJMHgwMzIsIDB4MDk5LCAweDA0NiwgMHgwNDIsIDB4MEM4LCAweDAwMSwgMHgwMEMsIDB4MDQ1LAorCTB4MENFLCAweDBBNSwgMHgwMTcsIDB4MEU2LCAweDBDNiwgMHgwQ0UsIDB4MEE5LCAweDBFQiwKKwkweDAxNSwgMHgwMTYsIDB4MDQ2LCAweDBBMiwgMHgwNDcsIDB4MDM4LCAweDAxNCwgMHgwNDMsCisJMHgwMjYsIDB4MDIyLCAweDBFNywgMHgwM0QsIDB4MDYwLCAweDAyRiwgMHgwQUEsIDB4MDlFLAorCTB4MEI1LCAweDAxMiwgMHgwRTAsIDB4MDdGLCAweDAwMSwgMHgwN0QsIDB4MEUzLCAweDBFNywKKwkweDAwMiwgMHgwOTMsIDB4MEY5LCAweDA5NSwgMHgwNDQsIDB4MDVDLCAweDBFNSwgMHgwQTAsCisJMHgwRTMsIDB4MDlELCAweDA0QSwgMHgwN0YsIDB4MDlDLCAweDA1NCwgMHgwQTksIDB4MEVCLAorCTB4MDUxLCAweDAwNSwgMHgwNDYsIDB4MEI5LCAweDBGQywgMHgwQzAsIDB4MDFCLCAweDAyMiwKKwkweDAyRSwgMHgwNjQsIDB4MDU0LCAweDAyRiwgMHgwQ0QsIDB4MDQ2LCAweDBDQywgMHgwQTcsCisJMHgwRDUsIDB4MDg2LCAweDBDQywgMHgwQTYsIDB4MDUwLCAweDA1NSwgMHgwQzYsIDB4MDQ1LAorCTB4MENFLCAweDA1QSwgMHgwMEUsIDB4MDM5LCAweDBENCwgMHgwQTcsIDB4MEY5LCAweDBDNSwKKwkweDA0QSwgMHgwOUUsIDB4MEI1LCAweDAxMSwgMHgwODAsIDB4MDU5LCAweDBDMCwgMHgwNkQsCisJMHgwQ0YsIDB4MEU2LCAweDAwMCwgMHgwRDksIDB4MDExLCAweDA3MywgMHgwMjIsIDB4MEExLAorCTB4MDdFLCAweDA2QSwgMHgwMzYsIDB4MDY1LCAweDAzRSwgMHgwQUMsIDB4MDM2LCAweDA2NSwKKwkweDAzMiwgMHgwQjAsIDB4MDE3LCAweDBERCwgMHgwM0UsIDB4MDcyLCAweDBEMiwgMHgwNzksCisJMHgwMzEsIDB4MDBDLCAweDA5OCwgMHgwMkUsIDB4MDRDLCAweDAyMCwgMHgwNzMsIDB4MDJBLAorCTB4MDhGLCAweDBGMywgMHgwOEEsIDB4MEFELCAweDBFNywgMHgwNDEsIDB4MDgyLCAweDA3QywKKwkweDBDQSwgMHgwQTYsIDB4MDg5LCAweDBCNSwgMHgwODUsIDB4MDlGLCAweDBCMCwgMHgwRjAsCisJMHgwMTcsIDB4MEQ1LCAweDAxRiwgMHgwNTQsIDB4MDU0LCAweDAyNSwgMHgwMUEsIDB4MEE4LAorCTB4MEZGLCAweDAyQSwgMHgwOTQsIDB4MDY1LCAweDAxMSwgMHgwRDcsIDB4MDQ5LCAweDA0NCwKKwkweDBENSwgMHgwQ0MsIDB4MEEwLCAweDA1NSwgMHgwRDgsIDB4MEFFLCAweDAwRSwgMHgwODgsCisJMHgwMTQsIDB4MDYwLCAweDAxNiwgMHgwNEQsIDB4MDYzLCAweDAyMiwgMHgwRTAsIDB4MDcyLAorCTB4MDg2LCAweDAzOCwgMHgwNEQsIDB4MDgwLCAweDBCRSwgMHgwRTAsIDB4MDJGLCAweDBCOCwKKwkweDAwQiwgMHgwRUUsIDB4MDAyLCAweDBGQiwgMHgwODEsIDB4MDM4LCAweDBGMCwgMHgwMTcsCisJMHgwRDcsIDB4MEQ3LCAweDAxRSwgMHgwMDIsIDB4MEZBLCAweDBGQSwgMHgwRTMsIDB4MEMwLAorCTB4MDVGLCAweDA0QywgMHgwODUsIDB4MDkwLCAweDAwMiwgMHgwMTgsIDB4MEM4LCAweDA1QiwKKwkweDA4MCwgMHgwREEsIDB4MDMwLCAweDAwQiwgMHgwNzAsIDB4MDFCLCAweDA0QywgMHgwMjIsCisJMHgwRDMsIDB4MDRDLCAweDAzMywgMHgwMDMsIDB4MDhDLCAweDAyRSwgMHgwNEMsIDB4MDQzLAorCTB4MDI2LCAweDBEMCwgMHgwRjUsIDB4MDYzLCAweDA2NiwgMHgwRDAsIDB4MDk1LCAweDBBNywKKwkweDBDRSwgMHgwNDUsIDB4MDMzLCAweDAwQSwgMHgwRDYsIDB4MDE2LCAweDA0MiwgMHgwMzgsCisJMHgwNkUsIDB4MEU0LCAweDBDRSwgMHgwQkQsIDB4MDU5LCAweDAyQywgMHgwRDIsIDB4MEFCLAorCTB4MEJBLCAweDA5NCwgMHgwOUQsIDB4MEU2LCAweDAxQSwgMHgwQjAsIDB4MDE3LCAweDBENSwKKwkweDA0RiwgMHgwNUEsIDB4MDhCLCAweDAwOSwgMHgwMUEsIDB4MDg4LCAweDBCOSwgMHgwQzUsCisJMHgwNDIsIDB4MDQ3LCAweDAzMCwgMHgwRDQsIDB4MDMyLCAweDAxNiwgMHgwNzIsIDB4MDg4LAorCTB4MDY1LCAweDBCRCwgMHgwNTksIDB4MDk5LCAweDAyNSwgMHgwQTUsIDB4MDYwLCAweDAyRiwKKwkweDBCOCwgMHgwNjAsIDB4MEYzLCAweDAwOCwgMHgwQjcsIDB4MDRBLCAweDAxQSwgMHgwOEYsCisJMHgwQUIsIDB4MDBELCAweDA5OSwgMHgwNDYsIDB4MDUxLCAweDBBRiwgMHgwMzgsIDB4MEE4LAorCTB4MDhFLCAweDA5MCwgMHgwNjUsIDB4MDEzLCAweDA1MiwgMHgwMTgsIDB4MEEwLCAweDA1NCwKKwkweDBCMSwgMHgwNDIsIDB4MDJFLCAweDA2MSwgMHgwQTgsIDB4MDQ4LCAweDBFNywgMHgwMkQsCisJMHgwMTYsIDB4MEY3LCAweDBBOCwgMHgwMDUsIDB4MEE1LCAweDA2MCwgMHgwMkYsIDB4MEE0LAorCTB4MDc1LCAweDBEMiwgMHgwNTEsIDB4MDM1LCAweDA3MywgMHgwMjgsIDB4MDE1LCAweDA3NiwKKwkweDAyQiwgMHgwODMsIDB4MEEyLCAweDAwNSwgMHgwMTgsIDB4MDA1LCAweDA5MywgMHgwNTgsCisJMHgwQzgsIDB4MEI4LCAweDAwNiwgMHgwMjgsIDB4MDYzLCAweDA4NCwgMHgwRDgsIDB4MDBCLAorCTB4MEVFLCAweDAwMiwgMHgwRkIsIDB4MDgwLCAweDBCRSwgMHgwRTAsIDB4MDJGLCAweDBBMCwKKwkweDA0MywgMHgwQTcsIDB4MDAxLCAweDA3RCwgMHgwNEMsIDB4MEUzLCAweDBDMCwgMHgwNUYsCisJMHgwNzAsIDB4MDE3LCAweDBEQywgMHgwMDUsIDB4MEY0LCAweDA2NCwgMHgwMkQsIDB4MEMwLAorCTB4MDZELCAweDAxOCwgMHgwMDUsIDB4MEI4LCAweDAwRCwgMHgwQTUsIDB4MEJELCAweDA2QSwKKwkweDAyMywgMHgwODYsIDB4MEFBLCAweDA5RSwgMHgwQjUsIDB4MDExLCAweDBBNCwgMHgwNkEsCisJMHgwQTMsIDB4MEVBLCAweDA4QSwgMHgwOEQsIDB4MDIzLCAweDBFMSwgMHgwMTcsIDB4MDM4LAorCTB4MDM0LCAweDA2OSwgMHgwNzEsIDB4MDk4LCAweDA0NSwgMHgwQTYsIDB4MDk4LCAweDA2QSwKKwkweDAzRSwgMHgwQUMsIDB4MDM2LCAweDA2NSwgMHgwMTksIDB4MDQ2LCAweDBCQywgMHgwRTIsCisJMHgwQTIsIDB4MDNBLCAweDA0MSwgMHgwOTQsIDB4MDRELCAweDA0OCwgMHgwNjIsIDB4MDgxLAorCTB4MDUyLCAweDBDNSwgMHgwMTYsIDB4MEY3LCAweDBBOCwgMHgwOEIsIDB4MDRBLCAweDA1NCwKKwkweDBGNSwgMHgwQTgsIDB4MDhDLCAweDAwMiwgMHgwREMsIDB4MDA2LCAweDBEMSwgMHgwMDMsCisJMHgwOUMsIDB4MEI0LCAweDBBOSwgMHgwRUUsIDB4MDBBLCAweDA5NSwgMHgwMjUsIDB4MDJBLAorCTB4MDdBLCAweDBBRCwgMHgwNDYsIDB4MDAxLCAweDA2NywgMHgwMDEsIDB4MEI1LCAweDBENywKKwkweDBBQywgMHgwMEEsIDB4MDMwLCAweDAwQiwgMHgwNkMsIDB4MDQ5LCAweDAzNSwgMHgwRTYsCisJMHgwQjUsIDB4MDY3LCAweDBGMywgMHgwMDAsIDB4MDZDLCAweDA4OCwgMHgwQjksIDB4MDkxLAorCTB4MDUwLCAweDBCRiwgMHgwMzEsIDB4MDFCLCAweDAzMiwgMHgwQTcsIDB4MEI4LCAweDA2OCwKKwkweDA5NSwgMHgwMjUsIDB4MDdCLCAweDBBRCwgMHgwMzMsIDB4MDc4LCAweDBBNywgMHgwQ0QsCisJMHgwM0UsIDB4MEQzLCAweDA4RSwgMHgwOUQsIDB4MDM0LCAweDBFNywgMHgwNEUsIDB4MEQ0LAorCTB4MDIyLCAweDBFNywgMHgwMDYsIDB4MDg0LCAweDA4RSwgMHgwNjAsIDB4MEE4LCAweDBGRiwKKwkweDAzOCwgMHgwQUIsIDB4MDgzLCAweDA5QywgMHgwMkEsIDB4MDA4LCAweDBGOSwgMHgwRDQsCisJMHgwMjAsIDB4MDYzLCAweDBCQywgMHgwMUEsIDB4MDA2LCAweDAwQSwgMHgwQzAsIDB4MDVGLAorCTB4MDQ2LCAweDA0MiwgMHgwREMsIDB4MDA2LCAweDBEMSwgMHgwODAsIDB4MDVCLCAweDA4MCwKKwkweDBEQSwgMHgwMjIsIDB4MEU2LCAweDAxQSwgMHgwODQsIDB4MDhFLCAweDA3MiwgMHgwRDEsCisJMHgwNkYsIDB4MDVBLCAweDA4MCwgMHgwODcsIDB4MDFBLCAweDBBQSwgMHgwN0EsIDB4MEQ0LAorCTB4MDQ4LCAweDBDOCwgMHgwRDUsIDB4MDQ3LCAweDBENSwgMHgwMTUsIDB4MDIzLCAweDAyMywKKwkweDBFMSwgMHgwMTcsIDB4MDM4LCAweDAzNCwgMHgwOEMsIDB4MEJBLCAweDA0QiwgMHgwN0IsCisJMHgwRDQsIDB4MDAyLCAweDBEMiwgMHgwOEMsIDB4MDIyLCAweDBEQywgMHgwMDYsIDB4MEQ1LAorCTB4MDFGLCAweDA1NiwgMHgwMUIsIDB4MDMyLCAweDA4QywgMHgwQTMsIDB4MDVFLCAweDA3MSwKKwkweDA1MSwgMHgwMUQsIDB4MDIwLCAweDBDQSwgMHgwMjYsIDB4MEE0LCAweDAzMSwgMHgwNDAsCisJMHgwQTksIDB4MDYyLCAweDBCMCwgMHgwMTcsIDB4MERGLCAweDA5RSwgMHgwRjQsIDB4MEI3LAorCTB4MEM5LCAweDA0MCwgMHgwQzcsIDB4MDc4LCAweDAwMSwgMHgwODEsIDB4MDgyLCAweDBCOCwKKwkweDAzOCwgMHgwMzksIDB4MDQ5LCAweDAxQywgMHgwMjYsIDB4MEMwLCAweDA1RiwgMHgwNzAsCisJMHgwMTcsIDB4MEQ0LCAweDBBQiwgMHgwRTEsIDB4MDJBLCAweDBGOCwgMHgwNEEsIDB4MEJFLAorCTB4MDEyLCAweDBBRiwgMHgwOEYsIDB4MDk3LCAweDA0RiwgMHgwQ0IsIDB4MEE3LCAweDAwMSwKKwkweDA3RCwgMHgwREEsIDB4MDgwLCAweDBBQSwgMHgwOTEsIDB4MDY0LCAweDA3RiwgMHgwNEEsCisJMHgwODEsIDB4MEQ1LCAweDAyMiwgMHgwQzgsIDB4MEZFLCAweDA4MiwgMHgwODAsIDB4MDI1LAorCTB4MDQ4LCAweDBCMiwgMHgwM0UsIDB4MEJCLCAweDBEQywgMHgwMzUsIDB4MDJFLCAweDA5NCwKKwkweDAwNywgMHgwRTgsIDB4MDhBLCAweDA5QywgMHgwMDMsIDB4MEUyLCAweDA0QiwgMHgwQTUsCisJMHgwNzcsIDB4MEFCLCAweDBCMywgMHgwMzIsIDB4MEU5LCAweDA0QiwgMHgwQkQsIDB4MDU5LAorCTB4MDg2LCAweDA4NCwgMHgwOTcsIDB4MDdBLCAweDAwNCwgMHgwQkEsIDB4MDUzLCAweDBFMSwKKwkweDAzMiwgMHgwRUYsIDB4MDUwLCAweDBENCwgMHgwRTYsIDB4MDM1LCAweDA1MywgMHgwRUIsCisJMHgwMDIsIDB4MDlDLCAweDBDNywgMHgwRDcsIDB4MDdBLCAweDBCMywgMHgwMzAsIDB4MEQyLAorCTB4MDVELCAweDBFQSwgMHgwMDIsIDB4MEU5LCAweDA0NCwgMHgwNUQsIDB4MDE2LCAweDAyOCwKKwkweDBDMCwgMHgwMkMsIDB4MEUwLCAweDAzNiwgMHgwOTEsIDB4MDc0LCAweDA0NSwgMHgwNTksCisJMHgwMTgsIDB4MEQ1LCAweDA0RiwgMHgwQUMsIDB4MDBBLCAweDBDNCwgMHgwMzUsIDB4MDMwLAorCTB4MDhCLCAweDAzOCwgMHgwNjksIDB4MDJCLCAweDBCRCwgMHgwNTksIDB4MDk4LCAweDA2OSwKKwkweDAyRSwgMHgwRjUsIDB4MDEyLCAweDBFOSwgMHgwNTgsIDB4MDY3LCAweDA0QSwgMHgwRUYsCisJMHgwNTAsIDB4MEQ1LCAweDA4RSwgMHgwM0UsIDB4MDFDLCAweDBBNCwgMHgwQjAsIDB4MENFLAorCTB4MDkzLCAweDAyMSwgMHgwNkUsIDB4MDFBLCAweDA0OCwgMHgwMUYsIDB4MEEyLCAweDAyQSwKKwkweDBDMywgMHgwMEQsIDB4MDU3LCAweDA3QSwgMHgwQjMsIDB4MDBELCAweDAwOSwgMHgwMkUsCisJMHgwRjQsIDB4MDQzLCAweDA1RCwgMHgwMjgsIDB4MDhCLCAweDA4MywgMHgwMjAsIDB4MDkyLAorCTB4MDM4LCAweDA0RCwgMHgwODAsIDB4MEJFLCAweDBFMCwgMHgwMkYsIDB4MEFDLCAweDAxNywKKwkweDA0OSwgMHgwQjMsIDB4MEE1LCAweDA4MiwgMHgwRTksIDB4MDNFLCAweDBFOSwgMHgwMzYsCisJMHgwNzQsIDB4MEUwLCAweDAyRiwgMHgwQTYsIDB4MENFLCAweDA5QywgMHgwMDUsIDB4MEY0LAorCTB4MEMyLCAweDAyQywgMHgwOEMsIDB4MDUyLCAweDA1NywgMHgwN0EsIDB4MEQ0LCAweDA4RCwKKwkweDA0OCwgMHgwRkEsIDB4MEVGLCAweDA1MCwgMHgwRDUsIDB4MEFFLCAweDAzNSwgMHgwNTMsCisJMHgwRUIsIDB4MDAyLCAweDA4NiwgMHgwMjEsIDB4MEFBLCAweDBFRiwgMHgwNTYsIDB4MDY2LAorCTB4MDFBLCAweDA0QiwgMHgwQkQsIDB4MDQ0LCAweDBCQSwgMHgwNTAsIDB4MEM0LCAweDBFOSwKKwkweDA1MywgMHgwRUIsIDB4MDAyLCAweDA4NiwgMHgwODEsIDB4MEY1LCAweDBERSwgMHgwQTEsCisJMHgwQTgsIDB4MDYyLCAweDAxRiwgMHgwNUQsIDB4MEZFLCAweDBBMiwgMHgwNUQsIDB4MDI5LAorCTB4MDc3LCAweDBBOCwgMHgwNkEsIDB4MDYxLCAweDA4RCwgMHgwNDAsIDB4MEZELCAweDAxMSwKKwkweDA1MywgMHgwMEMsIDB4MDZBLCAweDBBNywgMHgwRDYsIDB4MDA1LCAweDAzMCwgMHgwQzcsCisJMHgwRDcsIDB4MDdGLCAweDBBOSwgMHgwNTcsIDB4MDRBLCAweDA1RCwgMHgwRUIsIDB4MDQ4LAorCTB4MDFCLCAweDAwQywgMHgwN0MsIDB4MDhCLCAweDA5RCwgMHgwOEEsIDB4MDUzLCAweDBFRiwKKwkweDA2NiwgMHgwOTQsIDB4MENBLCAweDA1NCwgMHgwRjUsIDB4MEEwLCAweDBDNiwgMHgwMDEsCisJMHgwNkUsIDB4MDAzLCAweDA2QSwgMHgwOUYsIDB4MDU2LCAweDA3NiwgMHgwNjUsIDB4MDMyLAorCTB4MDhCLCAweDA3QiwgMHgwRDIsIDB4MEM1LCAweDBBNSwgMHgwNjAsIDB4MDJGLCAweDBBQSwKKwkweDA3RCwgMHgwNjUsIDB4MEEzLCAweDAwMCwgMHgwQjcsIDB4MDAxLCAweDBCNCwgMHgwQzgsCisJMHgwNUEsIDB4MDA3LCAweDA4RiwgMHgwRUQsIDB4MDAxLCAweDBENSwgMHgwMjcsIDB4MDkxLAorCTB4MDY3LCAweDAwMSwgMHgwQjQsIDB4MDhCLCAweDA5QywgMHgwNTQsIDB4MDFDLCAweDA3MywKKwkweDBBOCwgMHgwODQsIDB4MDVDLCAweDBDMSwgMHgwNTAsIDB4MEJGLCAweDAzNiwgMHgwNTYsCisJMHgwNjAsIDB4MEFCLCAweDA4QywgMHgwOEIsIDB4MDlDLCAweDA1NCwgMHgwMUMsIDB4MDczLAorCTB4MEE4LCAweDA4NCwgMHgwNUMsIDB4MEMxLCAweDA1MCwgMHgwQkYsIDB4MDM2LCAweDA1NiwKKwkweDA2QywgMHgwMDUsIDB4MEY1LCAweDA1MywgMHgwRDYsIDB4MEEyLCAweDAzMCwgMHgwMEIsCisJMHgwMjksIDB4MDVCLCAweDAxOSwgMHgwRkMsIDB4MEY2LCAweDA5NCwgMHgwNDUsIDB4MENGLAorCTB4MDE1LCAweDAwQiwgMHgwRjMsIDB4MDNDLCAweDBCMywgMHgwMkEsIDB4MDdBLCAweDBDNSwKKwkweDA0NiwgMHgwMDEsIDB4MDY0LCAweDA4QSwgMHgwMzEsIDB4MDIzLCAweDA5QywgMHgwMEEsCisJMHgwNUQsIDB4MEVBLCAweDAzNCwgMHgwMzMsIDB4MDJFLCAweDA5NSwgMHgwQzcsIDB4MENFLAorCTB4MDJBLCAweDA0RiwgMHgwRTYsIDB4MDUwLCAweDAyMCwgMHgwQjksIDB4MDMxLCAweDAwQywKKwkweDA5QiwgMHgwRUYsIDB4MDM5LCAweDAxNCwgMHgwNDUsIDB4MENFLCAweDA0NSwgMHgwMDcsCisJMHgwMUMsIDB4MEVBLCAweDA0NiwgMHgwODcsIDB4MEFCLCAweDAxQiwgMHgwMzYsIDB4MDg0LAorCTB4MEE3LCAweDA1RSwgMHgwQUMsIDB4MDk2LCAweDA2NywgMHgwNTIsIDB4MEIwLCAweDAxNywKKwkweDBEQywgMHgwRkUsIDB4MDdCLCAweDA0QSwgMHgwMjIsIDB4MEU3LCAweDA4QSwgMHgwODUsCisJMHgwRjksIDB4MDlFLCAweDA1OSwgMHgwOTcsIDB4MDdBLCAweDA4RCwgMHgwMEMsIDB4MENCLAorCTB4MEE1LCAweDAyNywgMHgwRjMsIDB4MEEwLCAweDA0NCwgMHgwMzIsIDB4MDYwLCAweDBCOSwKKwkweDAzNywgMHgwREUsIDB4MDcyLCAweDAyOCwgMHgwOEIsIDB4MDlDLCAweDA4QSwgMHgwMEUsCisJMHgwMzksIDB4MEQ0LCAweDA4QywgMHgwMDUsIDB4MEY3LCAweDBFNywgMHgwQjgsIDB4MDJBLAorCTB4MEY5LCAweDAyOCwgMHgwMTgsIDB4MEVGLCAweDAwMCwgMHgwMzAsIDB4MDMwLCAweDA1NywKKwkweDAwNywgMHgwNDQsIDB4MDBBLCAweDA1MCwgMHgwOEYsIDB4MEYwLCAweDA3MywgMHgwOTEsCisJMHgwNDEsIDB4MDFGLCAweDAzQSwgMHgwOTAsIDB4MDQ1LCAweDBDMCwgMHgwQkIsIDB4MDE4LAorCTB4MEUxLCAweDAzNiwgMHgwMDIsIDB4MEZCLCAweDBGQiwgMHgwOUUsIDB4MDAyLCAweDBGQSwKKwkweDBFRSwgMHgwRTcsIDB4MEY1LCAweDBDRiwgMHgwMDEsIDB4MDdELCAweDAxMCwgMHgwNUMsCisJMHgwRjAsIDB4MDE3LCAweDBEMSwgMHgwMDUsIDB4MENGLCAweDAwMSwgMHgwN0QsIDB4MDUzLAorCTB4MEVCLCAweDAyRCwgMHgwMTgsIDB4MDA1LCAweDBCOCwgMHgwMEQsIDB4MEE2LCAweDA0MiwKKwkweDBEQywgMHgwMDYsIDB4MEQzLCAweDAxNywgMHgwMzUsIDB4MEE4LCAweDA4QiwgMHgwOUMsCisJMHgwMEEsIDB4MDBFLCAweDAzOSwgMHgwRDQsIDB4MDBDLCAweDBGRSwgMHgwN0IsIDB4MDRBLAorCTB4MDIyLCAweDBFNiwgMHgwNTUsIDB4MDBCLCAweDBGMywgMHgwMzEsIDB4MEIzLCAweDA2MCwKKwkweDAyRiwgMHgwQkMsIDB4MDdDLCAweDBFMiwgMHgwQTQsIDB4MEZFLCAweDA2NSwgMHgwNTEsCisJMHgwMTcsIDB4MDM4LCAweDAxNCwgMHgwMUMsIDB4MDczLCAweDBBOCwgMHgwMTksIDB4MEZDLAorCTB4MEY2LCAweDA5NCwgMHgwNDUsIDB4MENDLCAweDBBQSwgMHgwMTcsIDB4MEU2LCAweDA2MywKKwkweDA2NiwgMHgwMEEsIDB4MEI4LCAweDBDQywgMHgwODUsIDB4MEExLCAweDA1OCwgMHgwRjYsCisJMHgwQTIsIDB4MDM1LCAweDA0OCwgMHgwNDgsIDB4MDdGLCAweDA0QSwgMHgwODksIDB4MDk1LAorCTB4MDIxLCAweDAyMSwgMHgwRkQsIDB4MDA1LCAweDAwMiwgMHgwNTQsIDB4MDlFLCAweDA0NSwKKwkweDA5MSwgMHgwMEUsIDB4MDNDLCAweDAwNSwgMHgwRjUsIDB4MDA3LCAweDA0MCwgMHgwNTUsCisJMHgwNDgsIDB4MDUyLCAweDAzRSwgMHgwODYsIDB4MEEwLCAweDA3NSwgMHgwNDgsIDB4MDUyLAorCTB4MDNFLCAweDBCNSwgMHgwMDAsIDB4MDRBLCAweDA5QywgMHgwMDAsIDB4MDZCLCAweDBDNywKKwkweDBDRSwgMHgwNDUsIDB4MDI3LCAweDBGMywgMHgwMkEsIDB4MDg0LCAweDAzNywgMHgwMzUsCisJMHgwREUsIDB4MEEwLCAweDBBQiwgMHgwMjMsIDB4MDFBLCAweDBBRSwgMHgwRjUsIDB4MDgzLAorCTB4MDU5LCAweDAxOCwgMHgwRDcsIDB4MDQzLCAweDBERSwgMHgwMkEsIDB4MEQwLCAweDA5NCwKKwkweDBFQiwgMHgwREUsIDB4MDA1LCAweDAzQSwgMHgwOTUsIDB4MDlGLCAweDBDQywgMHgwQzMsCisJMHgwMjAsIDB4MDQ1LCAweDBDQywgMHgwQUEsIDB4MDE3LCAweDBFNiwgMHgwNjYsIDB4MENDLAorCTB4MDQzLCAweDAyNiwgMHgwNEYsIDB4MEU3LCAweDA0MSwgMHgwMjIsIDB4MDJFLCAweDA3MCwKKwkweDA2OCwgMHgwMzgsIDB4MEU3LCAweDA1MywgMHgwRTAsIDB4MDJGLCAweDBBQiwgMHgwQkMsCisJMHgwMTIsIDB4MEQyLCAweDBFOSwgMHgwNTgsIDB4MDBCLCAweDBFQSwgMHgwQTcsIDB4MEFELAorCTB4MDQ1LCAweDBBMSwgMHgwMUYsIDB4MEMwLCAweDA1RiwgMHgwNzgsIDB4MDM5LCAweDBDOCwKKwkweDBBMCwgMHgwOEYsIDB4MDlELCAweDA0OCwgMHgwMUMsIDB4MDI0LCAweDBFRSwgMHgwQzcsCisJMHgwODAsIDB4MEJFLCAweDBCQSwgMHgwRjUsIDB4MDZELCAweDA2NiwgMHgwNDksIDB4MDc3LAorCTB4MDBELCAweDA0RSwgMHgwQTUsIDB4MDMwLCAweDAwOSwgMHgwQjQsIDB4MEY5LCAweDBDNSwKKwkweDA0MywgMHgwMEYsIDB4MDM4LCAweDBBOSwgMHgwM0YsIDB4MDlELCAweDAwMiwgMHgwRkIsCisJMHgwQ0UsIDB4MDQ1LCAweDAxMSwgMHgwNzMsIDB4MDkxLCAweDA0MSwgMHgwQzcsIDB4MDNBLAorCTB4MDkxLCAweDA5RiwgMHgwQ0YsIDB4MDY5LCAweDA0NCwgMHgwNUMsIDB4MEYxLCAweDA1MCwKKwkweDBCRiwgMHgwMzMsIDB4MENCLCAweDAzMiwgMHgwQTcsIDB4MEFDLCAweDA1NCwgMHgwOTAsCisJMHgwOEQsIDB4MDQ0LCAweDA4RSwgMHgwNzAsIDB4MDI5LCAweDA3NywgMHgwQTgsIDB4MEQwLAorCTB4MENDLCAweDBCQSwgMHgwNTYsIDB4MEIwLCAweDBCMiwgMHgwOUQsIDB4MDhDLCAweDA4NiwKKwkweDA0QywgMHgwMTcsIDB4MDI2LCAweDA3NywgMHgwMjYsIDB4MDFDLCAweDAyNywgMHgwMUMsCisJMHgwMjQsIDB4MDlFLCAweDAyMywgMHgwNjEsIDB4MEJFLCAweDA4RSwgMHgwMTIsIDB4MDRGLAorCTB4MDExLCAweDA4NywgMHgwMUMsIDB4MEVBLCAweDA1QywgMHgwMDUsIDB4MEY1LCAweDBENywKKwkweDBCOCwgMHgwNkEsIDB4MDc1LCAweDAyOSwgMHgwNzcsIDB4MEFCLCAweDAwRCwgMHgwOTksCisJMHgwNzQsIDB4MEE1LCAweDA0RiwgMHgwNzIsIDB4MEEwLCAweDBBQSwgMHgwNEEsIDB4MEM2LAorCTB4MEYzLCAweDA2NiwgMHgwNjYsIDB4MEM2LCAweDAzOSwgMHgwODIsIDB4MEFGLCAweDA3NSwKKwkweDBBNiwgMHgwNkYsIDB4MDE0LCAweDA2QiwgMHgwQ0UsIDB4MDA1LCAweDA3MCwgMHgwNzMsCisJMHgwOTYsIDB4MDgyLCAweDAzRSwgMHgwNzUsIDB4MDI4LCAweDBFMSwgMHgwM0EsIDB4MEE3LAorCTB4MEFELCAweDA0NCwgMHgwNjAsIDB4MDE2LCAweDA1MiwgMHgwQjYsIDB4MDFELCAweDA3QSwKKwkweDBCNiwgMHgwQjMsIDB4MDI0LCAweDBCQiwgMHgwODYsIDB4MEE3LCAweDA1MiwgMHgwOTgsCisJMHgwMDQsIDB4MERBLCAweDA3QywgMHgwRTIsIDB4MEExLCAweDA4NywgMHgwOUMsIDB4MDU1LAorCTB4MEY3LCAweDA5QywgMHgwQjUsIDB4MEFDLCAweDAyQywgMHgwOTUsIDB4MDMzLCAweDBCOSwKKwkweDAzMSwgMHgwMDUsIDB4MEQ5LCAweDA1MywgMHgwRDYsIDB4MEEyLCAweDAzMCwgMHgwMEIsCisJMHgwMjksIDB4MDVCLCAweDAwMiwgMHgwMkUsIDB4MDYxLCAweDA1QSwgMHgwMTcsIDB4MEU2LAorCTB4MDlDLCAweDBCMywgMHgwMkEsIDB4MDdBLCAweDBDNSwgMHgwNDAsIDB4MDIxLCAweDBBOCwKKwkweDA5MSwgMHgwQ0UsIDB4MDA1LCAweDAyNywgMHgwRjMsIDB4MEE1LCAweDA4OCwgMHgwNjQsCisJMHgwQzEsIDB4MDcyLCAweDA2NSwgMHgwNEYsIDB4MDU4LCAweDAxNCwgMHgwMEMsIDB4MDhELAorCTB4MDdFLCAweDBGMywgMHgwODEsIDB4MDQ0LCAweDA1QywgMHgwRUYsIDB4MDQxLCAweDBDNywKKwkweDAzQSwgMHgwQkUsIDB4MDAyLCAweDBGQSwgMHgwQTksIDB4MEVBLCAweDBDRSwgMHgwQ0MsCisJMHgwQTksIDB4MDI5LCAweDA1MywgMHgwRDYsIDB4MEEyLCAweDA0NiwgMHgwNDcsIDB4MERELAorCTB4MDdBLCAweDBDMCwgMHgwQTMsIDB4MDAwLCAweDA4NiwgMHgwRTIsIDB4MDlCLCAweDAyOSwKKwkweDA3OCwgMHgwOEIsIDB4MDgxLCAweDAwOSwgMHgwOTgsIDB4MDcwLCAweDA5QiwgMHgwMjksCisJMHgwNzksIDB4MDVELCAweDBEOSwgMHgwNzIsIDB4MEVELCAweDA5NCwgMHgwQkMsIDB4MEI5LAorCTB4MDc2LCAweDAxMywgMHgwM0IsIDB4MDJBLCAweDA1RCwgMHgwQjIsIDB4MDk3LCAweDA5NSwKKwkweDAyRSwgMHgwRDksIDB4MDRCLCAweDBDQSwgMHgwN0QsIDB4MDVCLCAweDA1OSwgMHgwOTQsCisJMHgwQ0EsIDB4MDFDLCAweDAyNCwgMHgwRUUsIDB4MEM3LCAweDA5NCwgMHgwQkMsIDB4MEMwLAorCTB4MDI2LCAweDBEMywgMHgwRTcsIDB4MDE1LCAweDAwQywgMHgwM0MsIDB4MEUyLCAweDBBQywKKwkweDBGRSwgMHgwN0IsIDB4MDRBLCAweDAyMiwgMHgwRTcsIDB4MDhBLCAweDA4NSwgMHgwRjksCisJMHgwOUUsIDB4MDU5LCAweDA5NywgMHgwN0EsIDB4MDhELCAweDAwQywgMHgwQ0IsIDB4MEE1LAorCTB4MDI3LCAweDBGMywgMHgwQTAsIDB4MDQxLCAweDA3MiwgMHgwNjIsIDB4MDE5LCAweDAzNywKKwkweDBERSwgMHgwNzAsIDB4MDI4LCAweDA4QiwgMHgwOUMsIDB4MDhBLCAweDAwRSwgMHgwMzksCisJMHgwRDQsIDB4MDhELCAweDAwRiwgMHgwNTYsIDB4MDM2LCAweDA2RCwgMHgwMDksIDB4MDRFLAorCTB4MEJELCAweDA1OSwgMHgwMkMsIDB4MENFLCAweDBBNSwgMHgwNkIsIDB4MDBCLCAweDAyMiwKKwkweDBEOSwgMHgwOUQsIDB4MEM5LCAweDBCMiwgMHgwOTcsIDB4MEJFLCAweDBGMywgMHgwODEsCisJMHgwNEEsIDB4MDdELCAweDA2NSwgMHgwQTMsIDB4MDAwLCAweDA5MywgMHgwOEYsIDB4MDY3LAorCTB4MDI5LCAweDA3OCwgMHgwQzIsIDB4MDRELCAweDBDMSwgMHgwRDEsIDB4MDA2LCAweDA4MiwKKwkweDAzMSwgMHgwQUYsIDB4MDA3LCAweDAzOCwgMHgwMzQsIDB4MDExLCAweDBGMywgMHgwQTgsCisJMHgwMkEsIDB4MDlFLCAweDBBOCwgMHgwNjYsIDB4MDFBLCAweDBBNCwgMHgwQTUsIDB4MDRGLAorCTB4MDVBLCAweDAwQywgMHgwMTEsIDB4MDhGLCAweDBBQSwgMHgwN0IsIDB4MEQwLCAweDA2NSwKKwkweDA0OSwgMHgwNDUsIDB4MEJELCAweDBFOSwgMHgwNjIsIDB4MEQyLCAweDBCMSwgMHgwOUUsCisJMHgwNkMsIDB4MENDLCAweDBDNiwgMHgwMTksIDB4MDg3LCAweDAwOSwgMHgwQzMsIDB4MDhFLAorCTB4MDc1LCAweDA0MSwgMHgwMUYsIDB4MDNBLCAweDBBNSwgMHgwMTMsIDB4MEQ1LCAweDA1NSwKKwkweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsCisJMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LAorCTB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwKKwkweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsCisJMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LAorCTB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDVBLCAweDBDQywgMHgwOTAKKyB9OworCisjZW5kaWYJLyogZGVmaW5lZChDT05GSUdfU01DVFIpIHx8IGRlZmluZWQoQ09ORklHX1NNQ1RSX01PRFVMRSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3RtczM4MHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0M2I0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5jCkBAIC0wLDAgKzEsMjQxMCBAQAorLyoKKyAqICB0bXMzODB0ci5jOiBBIG5ldHdvcmsgZHJpdmVyIGxpYnJhcnkgZm9yIFRleGFzIEluc3RydW1lbnRzIFRNUzM4MC1iYXNlZAorICogICAgICAgICAgICAgIFRva2VuIFJpbmcgQWRhcHRlcnMuCisgKgorICogIE9yaWdpbmFsbHkgc2t0ci5jOiBXcml0dGVuIDE5OTcgYnkgQ2hyaXN0b3BoIEdvb3MKKyAqCisgKiAgQSBmaW5lIHJlc3VsdCBvZiB0aGUgTGludXggU3lzdGVtcyBOZXR3b3JrIEFyY2hpdGVjdHVyZSBQcm9qZWN0LgorICogIGh0dHA6Ly93d3cubGludXgtc25hLm9yZworICoKKyAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgVGhlIGZvbGxvd2luZyBtb2R1bGVzIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciBjYXJkIHN1cHBvcnQ6CisgKgktIHRtc3BjaSAoR2VuZXJpYyBQQ0kgY2FyZCBzdXBwb3J0KQorICoJLSBhYnlzcyAoTWFkZ2UgUENJIHN1cHBvcnQpCisgKiAgICAgIC0gdG1zaXNhIChTeXNLb25uZWN0IFRSNC8xNiBJU0EpCisgKgorICogIFNvdXJjZXM6CisgKiAgCS0gVGhlIGhhcmR3YXJlIHJlbGF0ZWQgcGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIHRha2UgZnJvbQorICogIAkgIHRoZSBTeXNLb25uZWN0IFRva2VuIFJpbmcgZHJpdmVyIGZvciBXaW5kb3dzIE5ULgorICogIAktIEkgdXNlZCB0aGUgSUJNIFRva2VuIFJpbmcgZHJpdmVyICdpYm10ci5jJyBhcyBhIGJhc2UgZm9yIHRoaXMKKyAqICAJICBkcml2ZXIsIGFzIHdlbGwgYXMgdGhlICdza2VsZXRvbi5jJyBkcml2ZXIgYnkgRG9uYWxkIEJlY2tlci4KKyAqICAJLSBBbHNvIHZhcmlvdXMgb3RoZXIgZHJpdmVycyBpbiB0aGUgbGludXggc291cmNlIHRyZWUgd2VyZSB0YWtlbgorICogIAkgIGFzIHNhbXBsZXMgZm9yIHNvbWUgdGFza3MuCisgKiAgICAgIC0gVEkgVE1TMzgwIFNlY29uZC1HZW5lcmF0aW9uIFRva2VuIFJpbmcgVXNlcidzIEd1aWRlCisgKiAgCS0gVEkgZGF0YXNoZWV0cyBmb3IgcmVzcGVjdGl2ZSBjaGlwcworICogIAktIERhdmlkIEhlaW4gYXQgVGV4YXMgSW5zdHJ1bWVudHMgCisgKiAgCS0gVmFyaW91cyBNYWRnZSBlbXBsb3llZXMKKyAqCisgKiAgTWFpbnRhaW5lcihzKToKKyAqICAgIEpTCUpheSBTY2h1bGlzdAkJanNjaGxzdEBzYW1iYS5vcmcKKyAqICAgIENHCUNocmlzdG9waCBHb29zCQljZ29vc0BzeXNrb25uZWN0LmRlCisgKiAgICBBRglBZGFtIEZyaXR6bGVyCQltaWRAYXVrLmN4CisgKiAgICBNTFAgICAgICAgTWlrZSBQaGlsbGlwcyAgICAgICAgICAgcGhpbGxpbUBhbXRyYWsuY29tCisgKiAgICBKRglKb2NoZW4gRnJpZWRyaWNoCWpvY2hlbkBzY3JhbS5kZQorICogICAgIAorICogIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorICoJMjktQXVnLTk3CUNHCUNyZWF0ZWQKKyAqCTA0LUFwci05OAlDRwlGaXhlZCBwcm9ibGVtcyBjYXVzZWQgYnkgdG9rX3RpbWVyX2NoZWNrCisgKgkxMC1BcHItOTgJQ0cJRml4ZWQgbG9ja3VwcyBhdCBjYWJsZSBkaXNjb25uZWN0aW9uCisgKgkyNy1NYXktOTgJSlMJRm9ybWF0ZWQgdG8gTGludXggS2VybmVsIEZvcm1hdAorICoJMzEtTWF5LTk4CUpTCUhhY2tlZCBpbiBQQ0kgc3VwcG9ydAorICoJMTYtSnVuLTk4CUpTCU1vZHVsaXplZCBmb3IgbXVsdGlwbGUgY2FyZHMgd2l0aCBvbmUgZHJpdmVyCisgKgkgICBTZXAtOTkJQUYJUmVuYW1lZCB0byB0bXMzODB0ciAoc3VwcG9ydHMgbW9yZSB0aGFuIFNLJ3MpCisgKiAgICAgIDIzLVNlcC05OQlBRiAgICAgIEFkZGVkIENvbXBhcSBhbmQgVGhvbWFzLUNvbnJhZCBQQ0kgc3VwcG9ydAorICoJCQkJRml4ZWQgYSBidWcgY2F1c2luZyBkb3VibGUgY29waWVzIG9uIFBDSQorICoJCQkJRml4ZWQgZm9yIG5ldyBtdWx0aWNhc3Qgc3R1ZmYgKDIuMi8yLjMpCisgKgkyNS1TZXAtOTkJQUYJVXBlZCBUUExfTlVNIGZyb20gMyB0byA5CisgKgkJCQlSZW1vdmVkIGV4dHJhbmVvdXMgJ05vIGZyZWUgVFBMJworICoJMjItRGVjLTk5CUFGCUFkZGVkIE1hZGdlIFBDSSBNazIgc3VwcG9ydCBhbmQgZ2VuZXJhbGl6ZWQKKyAqCQkJCXBhcnRzIG9mIHRoZSBpbml0aWxpemF0aW9uIHByb2NlZHVyZS4KKyAqCTMwLURlYy05OQlBRglUdXJuZWQgdG1zMzgwdHIgaW50byBhIGxpYnJhcnkgYWxhIDgzOTAuCisgKgkJCQlNYWRnZSBzdXBwb3J0IGlzIHByb3ZpZGVkIGluIHRoZSBhYnlzcyBtb2R1bGUKKyAqCQkJCUdlbmVyaWMgUENJIHN1cHBvcnQgaXMgaW4gdGhlIHRtc3BjaSBtb2R1bGUuCisgKgkzMC1Ob3YtMDAJSkYJVXBkYXRlZCBQQ0kgY29kZSB0byBzdXBwb3J0IElPIE1NVSB2aWEKKyAqCQkJCXBjaV9tYXBfc3RhdGljKCkuIEFscGhhIHVzZXMgdGhpcyBNTVUgZm9yIElTQQorICoJCQkJYXMgd2VsbC4KKyAqICAgICAgMTQtSmFuLTAxCUpGCUZpeCBETUEgb24gaWZkb3duL2lmdXAgc2VxdWVuY2VzLiBTb21lIAorICogICAgICAJCQljbGVhbnVwLgorICoJMTMtSmFuLTAyCUpGCUFkZCBzcGlubG9jayB0byBmaXggcmFjZSBjb25kaXRpb24uCisgKgkwOS1Ob3YtMDIJSkYJRml4ZWQgcHJpbnRrcyB0byBub3QgU1BBTSB0aGUgY29uc29sZSBkdXJpbmcKKyAqCQkJCW5vcm1hbCBvcGVyYXRpb24uCisgKgkzMC1EZWMtMDIJSkYJUmVtb3ZlZCBpbmNvcnJlY3QgX19pbml0IGZyb20gCisgKgkJCQl0bXMzODB0cl9pbml0X2NhcmQuCisgKiAgICAgIAkJCQorICogIFRvIGRvOgorICogICAgMS4gTXVsdGkvQnJvYWRjYXN0IHBhY2tldCBoYW5kbGluZyAodGhpcyBtYXkgaGF2ZSBmaXhlZCBpdHNlbGYpCisgKiAgICAyLiBXcml0ZSBhIHNrdHJpc2EgbW9kdWxlIHRoYXQgaW5jbHVkZXMgdGhlIG9sZCBJU0Egc3VwcG9ydCAoZG9uZSkKKyAqICAgIDMuIEFsbG93IG1vZHVsZXMgdG8gbG9hZCB0aGVpciBvd24gbWljcm9jb2RlCisgKiAgICA0LiBTcGVlZCB1cCB0aGUgQlVEIHByb2Nlc3MgLS0gZnJlZXppbmcgdGhlIGtlcm5lbCBmb3IgMytzZWMgaXMKKyAqICAgICAgICAgcXVpdGUgdW5hY2NlcHRhYmxlLgorICogICAgNS4gU3RpbGwgYSBmZXcgcmVtYWluaW5nIHN0YWxscyB3aGVuIHRoZSBjYWJsZSBpcyB1bnBsdWdnZWQuCisgKi8KKworI2lmZGVmIE1PRFVMRQorc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0gInRtczM4MHRyLmM6IHYxLjEwIDMwLzEyLzIwMDIgYnkgQ2hyaXN0b3BoIEdvb3MsIEFkYW0gRnJpdHpsZXJcbiI7CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJ0bXMzODB0ci5oIgkJLyogT3VyIFN0dWZmICovCisKKy8qIFVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sIDIgZm9yIGRlYnVnLCBhbmQKKyAqIDMgZm9yIHZlcnkgdmVyYm9zZSBkZWJ1Zy4KKyAqLworI2lmbmRlZiBUTVMzODBUUl9ERUJVRworI2RlZmluZSBUTVMzODBUUl9ERUJVRyAwCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdG1zMzgwdHJfZGVidWcgPSBUTVMzODBUUl9ERUJVRzsKKworc3RhdGljIHN0cnVjdCBkZXZpY2UgdG1zX2RldmljZTsKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLgorICogQWxwaGFiZXRpY2FsIGJ5IGZ1bmN0aW9uIG5hbWUuCisgKi8KKworLyogIkEiICovCisvKiAiQiIgKi8KK3N0YXRpYyBpbnQgICAgICB0bXMzODB0cl9icmluZ3VwX2RpYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLyogIkMiICovCitzdGF0aWMgdm9pZAl0bXMzODB0cl9jYW5jZWxfdHhfcXVldWUoc3RydWN0IG5ldF9sb2NhbCogdHApOworc3RhdGljIGludCAJdG1zMzgwdHJfY2hpcHNldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCXRtczM4MHRyX2Noa19pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfY2hrX291dHN0YW5kaW5nX2NtZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfY2hrX3NyY19hZGRyKHVuc2lnbmVkIGNoYXIgKmZyYW1lLCB1bnNpZ25lZCBjaGFyICpod19hZGRyKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRtczM4MHRyX2Noa19zc2Ioc3RydWN0IG5ldF9sb2NhbCAqdHAsIHVuc2lnbmVkIHNob3J0IElycVR5cGUpOworaW50CSAJdG1zMzgwdHJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfY21kX3N0YXR1c19pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvKiAiRCIgKi8KK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjaWYgVE1TMzgwVFJfREVCVUcgPiAwCitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfZHVtcCh1bnNpZ25lZCBjaGFyICpEYXRhLCBpbnQgbGVuZ3RoKTsKKyNlbmRpZgorLyogIkUiICovCitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfZXhlY19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgQ29tbWFuZCk7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfZXhlY19zaWZjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IFdyaXRlVmFsdWUpOworLyogIkYiICovCisvKiAiRyIgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdG1zMzgwdHJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLyogIkgiICovCitzdGF0aWMgaW50IAl0bXMzODB0cl9oYXJkd2FyZV9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvKiAiSSIgKi8KK3N0YXRpYyBpbnQgCXRtczM4MHRyX2luaXRfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9pbml0X2lwYihzdHJ1Y3QgbmV0X2xvY2FsICp0cCk7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfaW5pdF9uZXRfbG9jYWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfaW5pdF9vcGIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvKiAiTSIgKi8KKy8qICJPIiAqLworaW50CQl0bXMzODB0cl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJdG1zMzgwdHJfb3Blbl9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLyogIlAiICovCisvKiAiUiIgKi8KK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9yY3Zfc3RhdHVzX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgCXRtczM4MHRyX3JlYWRfcHRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCXRtczM4MHRyX3JlYWRfcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKkRhdGEsCisJCQl1bnNpZ25lZCBzaG9ydCBBZGRyZXNzLCBpbnQgTGVuZ3RoKTsKK3N0YXRpYyBpbnQgCXRtczM4MHRyX3Jlc2V0X2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfcmVzZXRfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCXRtczM4MHRyX3Jpbmdfc3RhdHVzX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8qICJTIiAqLworc3RhdGljIGludCAJdG1zMzgwdHJfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAl0bXMzODB0cl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CisvKiAiVCIgKi8KK3N0YXRpYyB2b2lkIAl0bXMzODB0cl90aW1lcl9jaGsodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIAl0bXMzODB0cl90aW1lcl9lbmRfd2FpdCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgCXRtczM4MHRyX3R4X3N0YXR1c19pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvKiAiVSIgKi8KK3N0YXRpYyB2b2lkIAl0bXMzODB0cl91cGRhdGVfcmN2X3N0YXRzKHN0cnVjdCBuZXRfbG9jYWwgKnRwLAorCQkJdW5zaWduZWQgY2hhciBEYXRhUHRyW10sIHVuc2lnbmVkIGludCBMZW5ndGgpOworLyogIlciICovCit2b2lkCSAJdG1zMzgwdHJfd2FpdCh1bnNpZ25lZCBsb25nIHRpbWUpOworc3RhdGljIHZvaWQgCXRtczM4MHRyX3dyaXRlX3JwbF9zdGF0dXMoUlBMICpycGwsIHVuc2lnbmVkIGludCBTdGF0dXMpOworc3RhdGljIHZvaWQgCXRtczM4MHRyX3dyaXRlX3RwbF9zdGF0dXMoVFBMICp0cGwsIHVuc2lnbmVkIGludCBTdGF0dXMpOworCisjZGVmaW5lIFNJRlJFQURCKHJlZykgKCgoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdiktPnNpZnJlYWRiKGRldiwgcmVnKSkKKyNkZWZpbmUgU0lGV1JJVEVCKHZhbCwgcmVnKSAoKChzdHJ1Y3QgbmV0X2xvY2FsICopZGV2LT5wcml2KS0+c2lmd3JpdGViKGRldiwgdmFsLCByZWcpKQorI2RlZmluZSBTSUZSRUFEVyhyZWcpICgoKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXYpLT5zaWZyZWFkdyhkZXYsIHJlZykpCisjZGVmaW5lIFNJRldSSVRFVyh2YWwsIHJlZykgKCgoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdiktPnNpZndyaXRldyhkZXYsIHZhbCwgcmVnKSkKKworCisKKyNpZiAwIC8qIFRNUzM4MFRSX0RFQlVHID4gMCAqLworc3RhdGljIGludCBtYWRnZW1jX3NpZnByb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgb2xkLCBjaGsxLCBjaGsyOworCQorCW9sZCA9IFNJRlJFQURCKFNJRkFEUik7ICAvKiBHZXQgdGhlIG9sZCBTSUZBRFIgdmFsdWUgKi8KKworICAgICAgICBjaGsxID0gMDsgICAgICAgLyogQmVnaW4gd2l0aCBjaGVjayB2YWx1ZSAwICovCisgICAgICAgIGRvIHsKKwkJbWFkZ2VtY19zZXRyZWdwYWdlKGRldiwgMCk7CisgICAgICAgICAgICAgICAgLyogV3JpdGUgbmV3IFNJRkFEUiB2YWx1ZSAqLworCQlTSUZXUklURUIoY2hrMSwgU0lGQURSKTsKKwkJY2hrMiA9IFNJRlJFQURCKFNJRkFEUik7CisJCWlmIChjaGsyICE9IGNoazEpCisJCQlyZXR1cm4gLTE7CisJCQorCQltYWRnZW1jX3NldHJlZ3BhZ2UoZGV2LCAxKTsKKyAgICAgICAgICAgICAgICAvKiBSZWFkLCBpbnZlcnQgYW5kIHdyaXRlICovCisJCWNoazIgPSBTSUZSRUFEQihTSUZBREQpOworCQlpZiAoY2hrMiAhPSBjaGsxKQorCQkJcmV0dXJuIC0xOworCisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDApOworICAgICAgICAgICAgICAgIGNoazIgXj0gMHgwRkU7CisJCVNJRldSSVRFQihjaGsyLCBTSUZBRFIpOworCisgICAgICAgICAgICAgICAgLyogUmVhZCwgaW52ZXJ0IGFuZCBjb21wYXJlICovCisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDEpOworCQljaGsyID0gU0lGUkVBREIoU0lGQUREKTsKKwkJbWFkZ2VtY19zZXRyZWdwYWdlKGRldiwgMCk7CisgICAgICAgICAgICAgICAgY2hrMiBePSAweDBGRTsKKworICAgICAgICAgICAgICAgIGlmKGNoazEgIT0gY2hrMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOyAgICAvKiBObyBhZGFwdGVyICovCisgICAgICAgICAgICAgICAgY2hrMSAtPSAyOworICAgICAgICB9IHdoaWxlKGNoazEgIT0gMCk7ICAgICAvKiBSZXBlYXQgMTI4IHRpbWVzIChhbGwgYnl0ZSB2YWx1ZXMpICovCisKKwltYWRnZW1jX3NldHJlZ3BhZ2UoZGV2LCAwKTsgLyogc2FuaXR5ICovCisgICAgICAgIC8qIFJlc3RvcmUgdGhlIFNJRkFEUiB2YWx1ZSAqLworCVNJRldSSVRFQihvbGQsIFNJRkFEUik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisvKgorICogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gVGhpcyBpcyBjYWxsZWQgc29tZXRpbWUgYWZ0ZXIKKyAqIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgKiByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICogdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworaW50IHRtczM4MHRyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKwkKKwkvKiBpbml0IHRoZSBzcGlubG9jayAqLworCXNwaW5fbG9ja19pbml0KCZ0cC0+bG9jayk7CisJaW5pdF90aW1lcigmdHAtPnRpbWVyKTsKKworCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSBoZXJlLiBEb24ndCBmb3JnZXQgdG8gc2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MuICovCisKKyNpZmRlZiBDT05GSUdfSVNBCisJaWYoZGV2LT5kbWEgPiAwKSAKKwl7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJZGlzYWJsZV9kbWEoZGV2LT5kbWEpOworCQlzZXRfZG1hX21vZGUoZGV2LT5kbWEsIERNQV9NT0RFX0NBU0NBREUpOworCQllbmFibGVfZG1hKGRldi0+ZG1hKTsKKwkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJfQorI2VuZGlmCisJCisJZXJyID0gdG1zMzgwdHJfY2hpcHNldF9pbml0KGRldik7CisgIAlpZihlcnIpCisJeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ2hpcHNldCBpbml0aWFsaXphdGlvbiBlcnJvclxuIiwgCisJCQlkZXYtPm5hbWUpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwl0cC0+dGltZXIuZXhwaXJlcwk9IGppZmZpZXMgKyAzMCpIWjsKKwl0cC0+dGltZXIuZnVuY3Rpb24JPSB0bXMzODB0cl90aW1lcl9lbmRfd2FpdDsKKwl0cC0+dGltZXIuZGF0YQkJPSAodW5zaWduZWQgbG9uZylkZXY7CisJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBZGFwdGVyIFJBTSBzaXplOiAlZEtcbiIsIAorCSAgICAgICBkZXYtPm5hbWUsIHRtczM4MHRyX3JlYWRfcHRyKGRldikpOworCisJdG1zMzgwdHJfZW5hYmxlX2ludGVycnVwdHMoZGV2KTsKKwl0bXMzODB0cl9vcGVuX2FkYXB0ZXIoZGV2KTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCisJLyogV2FpdCBmb3IgaW50ZXJydXB0IGZyb20gaGFyZHdhcmUuIElmIGludGVycnVwdCBkb2VzIG5vdCBjb21lLAorCSAqIHRoZXJlIHdpbGwgYmUgYSB0aW1lb3V0IGZyb20gdGhlIHRpbWVyLgorCSAqLworCXRwLT5TbGVlcGluZyA9IDE7CisJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmdHAtPndhaXRfZm9yX3Rva19pbnQpOworCWRlbF90aW1lcigmdHAtPnRpbWVyKTsKKworCS8qIElmIEFkYXB0ZXJWaXJ0T3BlbkZsYWcgaXMgMSwgdGhlIGFkYXB0ZXIgaXMgbm93IG9wZW4gZm9yIHVzZSAqLworCWlmKHRwLT5BZGFwdGVyVmlydE9wZW5GbGFnID09IDApCisJeworCQl0bXMzODB0cl9kaXNhYmxlX2ludGVycnVwdHMoZGV2KTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJdHAtPlN0YXJ0VGltZSA9IGppZmZpZXM7CisKKwkvKiBTdGFydCBmdW5jdGlvbiBjb250cm9sIHRpbWVyICovCisJdHAtPnRpbWVyLmV4cGlyZXMJPSBqaWZmaWVzICsgMipIWjsKKwl0cC0+dGltZXIuZnVuY3Rpb24JPSB0bXMzODB0cl90aW1lcl9jaGs7CisJdHAtPnRpbWVyLmRhdGEJCT0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWFkZF90aW1lcigmdHAtPnRpbWVyKTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBUaW1lb3V0IGZ1bmN0aW9uIHdoaWxlIHdhaXRpbmcgZm9yIGV2ZW50CisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX3RpbWVyX2VuZF93YWl0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlKilkYXRhOworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmKHRwLT5TbGVlcGluZykKKwl7CisJCXRwLT5TbGVlcGluZyA9IDA7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHAtPndhaXRfZm9yX3Rva19pbnQpOworCX0KKworCXJldHVybjsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGNoaXBzZXQKKyAqLworc3RhdGljIGludCB0bXMzODB0cl9jaGlwc2V0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCXRtczM4MHRyX2luaXRfaXBiKHRwKTsKKwl0bXMzODB0cl9pbml0X29wYihkZXYpOworCXRtczM4MHRyX2luaXRfbmV0X2xvY2FsKGRldik7CisKKwlpZih0bXMzODB0cl9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVzZXR0aW5nIGFkYXB0ZXIuLi5cbiIsIGRldi0+bmFtZSk7CisJZXJyID0gdG1zMzgwdHJfcmVzZXRfYWRhcHRlcihkZXYpOworCWlmKGVyciA8IDApCisJCXJldHVybiAoLTEpOworCisJaWYodG1zMzgwdHJfZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEJyaW5ndXAgZGlhZ3MuLi5cbiIsIGRldi0+bmFtZSk7CisJZXJyID0gdG1zMzgwdHJfYnJpbmd1cF9kaWFncyhkZXYpOworCWlmKGVyciA8IDApCisJCXJldHVybiAoLTEpOworCisJaWYodG1zMzgwdHJfZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEluaXQgYWRhcHRlci4uLlxuIiwgZGV2LT5uYW1lKTsKKwllcnIgPSB0bXMzODB0cl9pbml0X2FkYXB0ZXIoZGV2KTsKKwlpZihlcnIgPCAwKQorCQlyZXR1cm4gKC0xKTsKKworCWlmKHRtczM4MHRyX2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBEb25lIVxuIiwgZGV2LT5uYW1lKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogSW5pdGlhbGl6ZXMgdGhlIG5ldF9sb2NhbCBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX2luaXRfbmV0X2xvY2FsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCWRtYV9hZGRyX3QgZG1hYnVmOworCisJdHAtPnNjYi5DTUQJPSAwOworCXRwLT5zY2IuUGFybVswXSA9IDA7CisJdHAtPnNjYi5QYXJtWzFdID0gMDsKKworCXRwLT5zc2IuU1RTCT0gMDsKKwl0cC0+c3NiLlBhcm1bMF0gPSAwOworCXRwLT5zc2IuUGFybVsxXSA9IDA7CisJdHAtPnNzYi5QYXJtWzJdID0gMDsKKworCXRwLT5DTURxdWV1ZQk9IDA7CisKKwl0cC0+QWRhcHRlck9wZW5GbGFnCT0gMDsKKwl0cC0+QWRhcHRlclZpcnRPcGVuRmxhZyA9IDA7CisJdHAtPlNjYkluVXNlCQk9IDA7CisJdHAtPk9wZW5Db21tYW5kSXNzdWVkCT0gMDsKKwl0cC0+UmVPcGVuSW5Qcm9ncmVzcwk9IDA7CisJdHAtPkhhbHRJblByb2dyZXNzCT0gMDsKKwl0cC0+VHJhbnNtaXRIYWx0U2NoZWR1bGVkID0gMDsKKwl0cC0+TG9iZVdpcmVGYXVsdExvZ2dlZAk9IDA7CisJdHAtPkxhc3RPcGVuU3RhdHVzCT0gMDsKKwl0cC0+TWF4UGFja2V0U2l6ZQk9IERFRkFVTFRfUEFDS0VUX1NJWkU7CisKKwkvKiBDcmVhdGUgY2lyY3VsYXIgY2hhaW4gb2YgdHJhbnNtaXQgbGlzdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFBMX05VTTsgaSsrKQorCXsKKwkJdHAtPlRwbFtpXS5OZXh0VFBMQWRkciA9IGh0b25sKCgoY2hhciAqKSgmdHAtPlRwbFsoaSsxKSAlIFRQTF9OVU1dKSAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7IC8qIERNQSBidWZmZXIgbWF5IGJlIE1NVSBkcml2ZW4gKi8KKwkJdHAtPlRwbFtpXS5TdGF0dXMJPSAwOworCQl0cC0+VHBsW2ldLkZyYW1lU2l6ZQk9IDA7CisJCXRwLT5UcGxbaV0uRnJhZ0xpc3RbMF0uRGF0YUNvdW50CT0gMDsKKwkJdHAtPlRwbFtpXS5GcmFnTGlzdFswXS5EYXRhQWRkcgkJPSAwOworCQl0cC0+VHBsW2ldLk5leHRUUExQdHIJPSAmdHAtPlRwbFsoaSsxKSAlIFRQTF9OVU1dOworCQl0cC0+VHBsW2ldLk1EYXRhCT0gTlVMTDsKKwkJdHAtPlRwbFtpXS5UUExJbmRleAk9IGk7CisJCXRwLT5UcGxbaV0uRE1BQnVmZgk9IDA7CisJCXRwLT5UcGxbaV0uQnVzeUZsYWcJPSAwOworCX0KKworCXRwLT5UcGxGcmVlID0gdHAtPlRwbEJ1c3kgPSAmdHAtPlRwbFswXTsKKworCS8qIENyZWF0ZSBjaXJjdWxhciBjaGFpbiBvZiByZWNlaXZlIGxpc3RzICovCisJZm9yIChpID0gMDsgaSA8IFJQTF9OVU07IGkrKykKKwl7CisJCXRwLT5ScGxbaV0uTmV4dFJQTEFkZHIgPSBodG9ubCgoKGNoYXIgKikoJnRwLT5ScGxbKGkrMSkgJSBSUExfTlVNXSkgLSAoY2hhciAqKXRwKSArIHRwLT5kbWFidWZmZXIpOyAvKiBETUEgYnVmZmVyIG1heSBiZSBNTVUgZHJpdmVuICovCisJCXRwLT5ScGxbaV0uU3RhdHVzID0gKFJYX1ZBTElEIHwgUlhfU1RBUlRfRlJBTUUgfCBSWF9FTkRfRlJBTUUgfCBSWF9GUkFNRV9JUlEpOworCQl0cC0+UnBsW2ldLkZyYW1lU2l6ZSA9IDA7CisJCXRwLT5ScGxbaV0uRnJhZ0xpc3RbMF0uRGF0YUNvdW50ID0gY3B1X3RvX2JlMTYoKHVuc2lnbmVkIHNob3J0KXRwLT5NYXhQYWNrZXRTaXplKTsKKworCQkvKiBBbGxvYyBza2IgYW5kIHBvaW50IGFkYXB0ZXIgdG8gZGF0YSBhcmVhICovCisJCXRwLT5ScGxbaV0uU2tiID0gZGV2X2FsbG9jX3NrYih0cC0+TWF4UGFja2V0U2l6ZSk7CisJCQl0cC0+UnBsW2ldLkRNQUJ1ZmYgPSAwOworCisJCS8qIHNrYiA9PSBOVUxMID8gdGhlbiB1c2UgbG9jYWwgYnVmZmVyICovCisJCWlmKHRwLT5ScGxbaV0uU2tiID09IE5VTEwpCisJCXsKKwkJCXRwLT5ScGxbaV0uU2tiU3RhdCA9IFNLQl9VTkFWQUlMQUJMRTsKKwkJCXRwLT5ScGxbaV0uRnJhZ0xpc3RbMF0uRGF0YUFkZHIgPSBodG9ubCgoKGNoYXIgKil0cC0+TG9jYWxSeEJ1ZmZlcnNbaV0gLSAoY2hhciAqKXRwKSArIHRwLT5kbWFidWZmZXIpOworCQkJdHAtPlJwbFtpXS5NRGF0YSA9IHRwLT5Mb2NhbFJ4QnVmZmVyc1tpXTsKKwkJfQorCQllbHNlCS8qIFNLQiAhPSBOVUxMICovCisJCXsKKwkJCXRwLT5ScGxbaV0uU2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcHV0KHRwLT5ScGxbaV0uU2tiLCB0cC0+TWF4UGFja2V0U2l6ZSk7CisKKwkJCS8qIGRhdGEgdW5yZWFjaGFibGUgZm9yIERNQSA/IHRoZW4gdXNlIGxvY2FsIGJ1ZmZlciAqLworCQkJZG1hYnVmID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHRwLT5ScGxbaV0uU2tiLT5kYXRhLCB0cC0+TWF4UGFja2V0U2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWlmKHRwLT5kbWFsaW1pdCAmJiAoZG1hYnVmICsgdHAtPk1heFBhY2tldFNpemUgPiB0cC0+ZG1hbGltaXQpKQorCQkJeworCQkJCXRwLT5ScGxbaV0uU2tiU3RhdCA9IFNLQl9EQVRBX0NPUFk7CisJCQkJdHAtPlJwbFtpXS5GcmFnTGlzdFswXS5EYXRhQWRkciA9IGh0b25sKCgoY2hhciAqKXRwLT5Mb2NhbFJ4QnVmZmVyc1tpXSAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7CisJCQkJdHAtPlJwbFtpXS5NRGF0YSA9IHRwLT5Mb2NhbFJ4QnVmZmVyc1tpXTsKKwkJCX0KKwkJCWVsc2UJLyogRE1BIGRpcmVjdGx5IGluIHNrYi0+ZGF0YSAqLworCQkJeworCQkJCXRwLT5ScGxbaV0uU2tiU3RhdCA9IFNLQl9ETUFfRElSRUNUOworCQkJCXRwLT5ScGxbaV0uRnJhZ0xpc3RbMF0uRGF0YUFkZHIgPSBodG9ubChkbWFidWYpOworCQkJCXRwLT5ScGxbaV0uTURhdGEgPSB0cC0+UnBsW2ldLlNrYi0+ZGF0YTsKKwkJCQl0cC0+UnBsW2ldLkRNQUJ1ZmYgPSBkbWFidWY7CisJCQl9CisJCX0KKworCQl0cC0+UnBsW2ldLk5leHRSUExQdHIgPSAmdHAtPlJwbFsoaSsxKSAlIFJQTF9OVU1dOworCQl0cC0+UnBsW2ldLlJQTEluZGV4ID0gaTsKKwl9CisKKwl0cC0+UnBsSGVhZCA9ICZ0cC0+UnBsWzBdOworCXRwLT5ScGxUYWlsID0gJnRwLT5ScGxbUlBMX05VTS0xXTsKKwl0cC0+UnBsVGFpbC0+U3RhdHVzID0gKFJYX1NUQVJUX0ZSQU1FIHwgUlhfRU5EX0ZSQU1FIHwgUlhfRlJBTUVfSVJRKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIEluaXRpYWxpemVzIHRoZSBpbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXIgYmxvY2suCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX2luaXRfaXBiKHN0cnVjdCBuZXRfbG9jYWwgKnRwKQoreworCXRwLT5pcGIuSW5pdF9PcHRpb25zCT0gQlVSU1RfTU9ERTsKKwl0cC0+aXBiLkNNRF9TdGF0dXNfSVYJPSAwOworCXRwLT5pcGIuVFhfSVYJCT0gMDsKKwl0cC0+aXBiLlJYX0lWCQk9IDA7CisJdHAtPmlwYi5SaW5nX1N0YXR1c19JVgk9IDA7CisJdHAtPmlwYi5TQ0JfQ2xlYXJfSVYJPSAwOworCXRwLT5pcGIuQWRhcHRlcl9DSEtfSVYJPSAwOworCXRwLT5pcGIuUlhfQnVyc3RfU2l6ZQk9IEJVUlNUX1NJWkU7CisJdHAtPmlwYi5UWF9CdXJzdF9TaXplCT0gQlVSU1RfU0laRTsKKwl0cC0+aXBiLkRNQV9BYm9ydF9UaHJobGQgPSBETUFfUkVUUklFUzsKKwl0cC0+aXBiLlNDQl9BZGRyCT0gMDsKKwl0cC0+aXBiLlNTQl9BZGRyCT0gMDsKKworCXJldHVybjsKK30KKworLyoKKyAqIEluaXRpYWxpemVzIHRoZSBvcGVuIHBhcmFtZXRlciBibG9jay4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfaW5pdF9vcGIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cDsKKwl1bnNpZ25lZCBsb25nIEFkZHI7CisJdW5zaWduZWQgc2hvcnQgUnBsU2l6ZSAgICA9IFJQTF9TSVpFOworCXVuc2lnbmVkIHNob3J0IFRwbFNpemUgICAgPSBUUExfU0laRTsKKwl1bnNpZ25lZCBzaG9ydCBCdWZmZXJTaXplID0gQlVGRkVSX1NJWkU7CisJaW50IGk7CisKKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl0cC0+b2NwbC5PUEVOT3B0aW9ucyAJID0gMDsKKwl0cC0+b2NwbC5PUEVOT3B0aW9ucyAJfD0gRU5BQkxFX0ZVTExfRFVQTEVYX1NFTEVDVElPTjsKKwl0cC0+b2NwbC5GdWxsRHVwbGV4IAkgPSAwOworCXRwLT5vY3BsLkZ1bGxEdXBsZXggCXw9IE9QRU5fRlVMTF9EVVBMRVhfT0ZGOworCisgICAgICAgIC8qIAorCSAqIFNldCBub2RlIGFkZHJlc3MgCisJICoKKwkgKiBXZSBnbyBhaGVhZCBhbmQgcHV0IGl0IGluIHRoZSBPUEIgZXZlbiB0aG91Z2ggb24KKwkgKiBtb3N0IG9mIHRoZSBnZW5lcmljIGFkYXB0ZXJzIHRoaXMgaXNuJ3QgcmVxdWlyZWQuCisJICogSXRzIHNpbXBsZXIgdGhpcyB3YXkuICAtLSBBU0YKKwkgKi8KKyAgICAgICAgZm9yIChpPTA7aTw2O2krKykKKyAgICAgICAgICAgICAgICB0cC0+b2NwbC5Ob2RlQWRkcltpXSA9ICgodW5zaWduZWQgY2hhciAqKWRldi0+ZGV2X2FkZHIpW2ldOworCisJdHAtPm9jcGwuR3JvdXBBZGRyCSA9IDA7CisJdHAtPm9jcGwuRnVuY3RBZGRyCSA9IDA7CisJdHAtPm9jcGwuUnhMaXN0U2l6ZQkgPSBjcHVfdG9fYmUxNigodW5zaWduZWQgc2hvcnQpUnBsU2l6ZSk7CisJdHAtPm9jcGwuVHhMaXN0U2l6ZQkgPSBjcHVfdG9fYmUxNigodW5zaWduZWQgc2hvcnQpVHBsU2l6ZSk7CisJdHAtPm9jcGwuQnVmU2l6ZQkgPSBjcHVfdG9fYmUxNigodW5zaWduZWQgc2hvcnQpQnVmZmVyU2l6ZSk7CisJdHAtPm9jcGwuUmVzZXJ2ZWQJID0gMDsKKwl0cC0+b2NwbC5UWEJ1Zk1pbgkgPSBUWF9CVUZfTUlOOworCXRwLT5vY3BsLlRYQnVmTWF4CSA9IFRYX0JVRl9NQVg7CisKKwlBZGRyID0gaHRvbmwoKChjaGFyICopdHAtPlByb2R1Y3RJRCAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7CisKKwl0cC0+b2NwbC5Qcm9kSURBZGRyWzBdCSA9IExPV09SRChBZGRyKTsKKwl0cC0+b2NwbC5Qcm9kSURBZGRyWzFdCSA9IEhJV09SRChBZGRyKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIFNlbmQgT1BFTiBjb21tYW5kIHRvIGFkYXB0ZXIKKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfb3Blbl9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYodHAtPk9wZW5Db21tYW5kSXNzdWVkKQorCQlyZXR1cm47CisKKwl0cC0+T3BlbkNvbW1hbmRJc3N1ZWQgPSAxOworCXRtczM4MHRyX2V4ZWNfY21kKGRldiwgT0NfT1BFTik7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBDbGVhciB0aGUgYWRhcHRlcidzIGludGVycnVwdCBmbGFnLiBDbGVhciBzeXN0ZW0gaW50ZXJydXB0IGVuYWJsZQorICogKFNJTlRFTik6IGRpc2FibGUgYWRhcHRlciB0byBzeXN0ZW0gaW50ZXJydXB0cy4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJU0lGV1JJVEVCKDAsIFNJRkFDTCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBTZXQgdGhlIGFkYXB0ZXIncyBpbnRlcnJ1cHQgZmxhZy4gU2V0IHN5c3RlbSBpbnRlcnJ1cHQgZW5hYmxlCisgKiAoU0lOVEVOKTogZW5hYmxlIGFkYXB0ZXIgdG8gc3lzdGVtIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJU0lGV1JJVEVCKEFDTF9TSU5URU4sIFNJRkFDTCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBQdXQgY29tbWFuZCBpbiBjb21tYW5kIHF1ZXVlLCB0cnkgdG8gZXhlY3V0ZSBpdC4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfZXhlY19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgQ29tbWFuZCkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl0cC0+Q01EcXVldWUgfD0gQ29tbWFuZDsKKwl0bXMzODB0cl9jaGtfb3V0c3RhbmRpbmdfY21kcyhkZXYpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB0bXMzODB0cl90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBJZiB3ZSBnZXQgaGVyZSwgc29tZSBoaWdoZXIgbGV2ZWwgaGFzIGRlY2lkZWQgd2UgYXJlIGJyb2tlbi4KKwkgKiBUaGVyZSBzaG91bGQgcmVhbGx5IGJlIGEgImtpY2sgbWUiIGZ1bmN0aW9uIGNhbGwgaW5zdGVhZC4KKwkgKgorCSAqIFJlc2V0dGluZyB0aGUgdG9rZW4gcmluZyBhZGFwdGVyIHRha2VzIGEgbG9uZyB0aW1lIHNvIGp1c3QKKwkgKiBmYWtlIHRyYW5zbWlzc2lvbiB0aW1lIGFuZCBnbyBvbiB0cnlpbmcuIE91ciBvd24gdGltZW91dAorCSAqIHJvdXRpbmUgaXMgaW4gdG1zMzgwdHJfdGltZXJfY2hrKCkKKwkgKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKiBHZXRzIHNrYiBmcm9tIHN5c3RlbSwgcXVldWVzIGl0IGFuZCBjaGVja3MgaWYgaXQgY2FuIGJlIHNlbnQKKyAqLworc3RhdGljIGludCB0bXMzODB0cl9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCisJZXJyID0gdG1zMzgwdHJfaGFyZHdhcmVfc2VuZF9wYWNrZXQoc2tiLCBkZXYpOworCWlmKHRwLT5UcGxGcmVlLT5OZXh0VFBMUHRyLT5CdXN5RmxhZykKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXJldHVybiAoZXJyKTsKK30KKworLyoKKyAqIE1vdmUgZnJhbWVzIGludG8gYWRhcHRlciB0eCBxdWV1ZQorICovCitzdGF0aWMgaW50IHRtczM4MHRyX2hhcmR3YXJlX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJVFBMICp0cGw7CisJc2hvcnQgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCWRtYV9hZGRyX3QgZG1hYnVmLCBuZXdidWY7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgCisJLyogVHJ5IHRvIGdldCBhIGZyZWUgVFBMIGZyb20gdGhlIGNoYWluLgorCSAqCisJICogTk9URTogV2UgKm11c3QqIGFsd2F5cyBsZWF2ZSBvbmUgdW51c2VkIFRQTCBpbiB0aGUgY2hhaW4sCisJICogYmVjYXVzZSBvdGhlcndpc2UgdGhlIGFkYXB0ZXIgbWlnaHQgc2VuZCBmcmFtZXMgdHdpY2UuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisJaWYodHAtPlRwbEZyZWUtPk5leHRUUExQdHItPkJ1c3lGbGFnKSAgeyAvKiBObyBmcmVlIFRQTCAqLworCQlpZiAodG1zMzgwdHJfZGVidWcgPiAwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBObyBmcmVlIFRQTFxuIiwgZGV2LT5uYW1lKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZG1hYnVmID0gMDsKKworCS8qIElzIGJ1ZmZlciByZWFjaGFibGUgZm9yIEJ1c21hc3Rlci1ETUE/ICovCisKKwlsZW5ndGgJPSBza2ItPmxlbjsKKwlkbWFidWYgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgc2tiLT5kYXRhLCBsZW5ndGgsIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmKHRwLT5kbWFsaW1pdCAmJiAoZG1hYnVmICsgbGVuZ3RoID4gdHAtPmRtYWxpbWl0KSkgeworCQkvKiBDb3B5IGZyYW1lIHRvIGxvY2FsIGJ1ZmZlciAqLworCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCBkbWFidWYsIGxlbmd0aCwgUENJX0RNQV9UT0RFVklDRSk7CisJCWRtYWJ1ZiAgPSAwOworCQlpIAk9IHRwLT5UcGxGcmVlLT5UUExJbmRleDsKKwkJYnVmIAk9IHRwLT5Mb2NhbFR4QnVmZmVyc1tpXTsKKwkJbWVtY3B5KGJ1Ziwgc2tiLT5kYXRhLCBsZW5ndGgpOworCQluZXdidWYgCT0gKChjaGFyICopYnVmIC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyOworCX0KKwllbHNlIHsKKwkJLyogU2VuZCBkaXJlY3QgZnJvbSBza2ItPmRhdGEgKi8KKwkJbmV3YnVmCT0gZG1hYnVmOworCQlidWYJPSBza2ItPmRhdGE7CisJfQorCS8qIFNvdXJjZSBhZGRyZXNzIGluIHBhY2tldD8gKi8KKwl0bXMzODB0cl9jaGtfc3JjX2FkZHIoYnVmLCBkZXYtPmRldl9hZGRyKTsKKwl0cC0+TGFzdFNlbmRUaW1lCT0gamlmZmllczsKKwl0cGwgCQkJPSB0cC0+VHBsRnJlZTsJLyogR2V0IHRoZSAiZnJlZSIgVFBMICovCisJdHBsLT5CdXN5RmxhZyAJCT0gMTsJCS8qIE1hcmsgVFBMIGFzIGJ1c3kgKi8KKwl0cC0+VHBsRnJlZSAJCT0gdHBsLT5OZXh0VFBMUHRyOworICAgIAorCS8qIFNhdmUgdGhlIHNrYiBmb3IgZGVsYXllZCByZXR1cm4gb2Ygc2tiIHRvIHN5c3RlbSAqLworCXRwbC0+U2tiID0gc2tiOworCXRwbC0+RE1BQnVmZiA9IGRtYWJ1ZjsKKwl0cGwtPkZyYWdMaXN0WzBdLkRhdGFDb3VudCA9IGNwdV90b19iZTE2KCh1bnNpZ25lZCBzaG9ydClsZW5ndGgpOworCXRwbC0+RnJhZ0xpc3RbMF0uRGF0YUFkZHIgID0gaHRvbmwobmV3YnVmKTsKKworCS8qIFdyaXRlIHRoZSBkYXRhIGxlbmd0aCBpbiB0aGUgdHJhbnNtaXQgbGlzdC4gKi8KKwl0cGwtPkZyYW1lU2l6ZSAJPSBjcHVfdG9fYmUxNigodW5zaWduZWQgc2hvcnQpbGVuZ3RoKTsKKwl0cGwtPk1EYXRhIAk9IGJ1ZjsKKworCS8qIFRyYW5zbWl0IHRoZSBmcmFtZSBhbmQgc2V0IHRoZSBzdGF0dXMgdmFsdWVzLiAqLworCXRtczM4MHRyX3dyaXRlX3RwbF9zdGF0dXModHBsLCBUWF9WQUxJRCB8IFRYX1NUQVJUX0ZSQU1FCisJCQkJfCBUWF9FTkRfRlJBTUUgfCBUWF9QQVNTX1NSQ19BRERSCisJCQkJfCBUWF9GUkFNRV9JUlEpOworCisJLyogTGV0IGFkYXB0ZXIgc2VuZCB0aGUgZnJhbWUuICovCisJdG1zMzgwdHJfZXhlY19zaWZjbWQoZGV2LCBDTURfVFhfVkFMSUQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdyaXRlIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgJ1N0YXR1cycgZmllbGQgb2YgdGhlIHNwZWNpZmllZCBUUEwuCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIHdoZW5ldmVyIHRoZSBzdGF0dXMgb2YgYW55IFRQTCBtdXN0IGJlCisgKiBtb2RpZmllZCBieSB0aGUgZHJpdmVyLCBiZWNhdXNlIHRoZSBjb21waWxlciBtYXkgb3RoZXJ3aXNlIGNoYW5nZSB0aGUKKyAqIG9yZGVyIG9mIGluc3RydWN0aW9ucyBzdWNoIHRoYXQgd3JpdGluZyB0aGUgVFBMIHN0YXR1cyBtYXkgYmUgZXhlY3V0ZWQgYXQKKyAqIGFuIHVuZGVzaXJlYWJsZSB0aW1lLiBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCwgdGhlIHN0YXR1cyBpcyBhbHdheXMKKyAqIHdyaXR0ZW4gd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl93cml0ZV90cGxfc3RhdHVzKFRQTCAqdHBsLCB1bnNpZ25lZCBpbnQgU3RhdHVzKQoreworCXRwbC0+U3RhdHVzID0gU3RhdHVzOworfQorCitzdGF0aWMgdm9pZCB0bXMzODB0cl9jaGtfc3JjX2FkZHIodW5zaWduZWQgY2hhciAqZnJhbWUsIHVuc2lnbmVkIGNoYXIgKmh3X2FkZHIpCit7CisJdW5zaWduZWQgY2hhciBTUkJpdDsKKworCWlmKCgoKHVuc2lnbmVkIGxvbmcpZnJhbWVbOF0pICYgfjB4ODApICE9IDApCS8qIENvbXBhcmUgNCBieXRlcyAqLworCQlyZXR1cm47CisJaWYoKHVuc2lnbmVkIHNob3J0KWZyYW1lWzEyXSAhPSAwKQkJLyogQ29tcGFyZSAyIGJ5dGVzICovCisJCXJldHVybjsKKworCVNSQml0ID0gZnJhbWVbOF0gJiAweDgwOworCW1lbWNweSgmZnJhbWVbOF0sIGh3X2FkZHIsIDYpOworCWZyYW1lWzhdIHw9IFNSQml0OworCisJcmV0dXJuOworfQorCisvKgorICogVGhlIHRpbWVyIHJvdXRpbmU6IENoZWNrIGlmIGFkYXB0ZXIgc3RpbGwgb3BlbiBhbmQgd29ya2luZywgcmVvcGVuIGlmIG5vdC4gCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX3RpbWVyX2Noayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSopZGF0YTsKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZih0cC0+SGFsdEluUHJvZ3Jlc3MpCisJCXJldHVybjsKKworCXRtczM4MHRyX2Noa19vdXRzdGFuZGluZ19jbWRzKGRldik7CisJaWYodGltZV9iZWZvcmUodHAtPkxhc3RTZW5kVGltZSArIFNFTkRfVElNRU9VVCwgamlmZmllcykKKwkJJiYgKHRwLT5UcGxGcmVlICE9IHRwLT5UcGxCdXN5KSkKKwl7CisJCS8qIEFueXRoaW5nIHRvIHNlbmQsIGJ1dCBzdGFsbGVkIHRvbyBsb25nICovCisJCXRwLT5MYXN0U2VuZFRpbWUgPSBqaWZmaWVzOworCQl0bXMzODB0cl9leGVjX2NtZChkZXYsIE9DX0NMT1NFKTsJLyogRG9lcyByZW9wZW4gYXV0b21hdGljYWxseSAqLworCX0KKworCXRwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIDIqSFo7CisJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworCisJaWYodHAtPkFkYXB0ZXJPcGVuRmxhZyB8fCB0cC0+UmVPcGVuSW5Qcm9ncmVzcykKKwkJcmV0dXJuOworCXRwLT5SZU9wZW5JblByb2dyZXNzID0gMTsKKwl0bXMzODB0cl9vcGVuX2FkYXB0ZXIoZGV2KTsKKworCXJldHVybjsKK30KKworLyoKKyAqIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6IEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4KKyAqLworaXJxcmV0dXJuX3QgdG1zMzgwdHJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cDsKKwl1bnNpZ25lZCBzaG9ydCBpcnFfdHlwZTsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZihkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGRldi0+bmFtZSwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlycV90eXBlID0gU0lGUkVBRFcoU0lGU1RTKTsKKworCXdoaWxlKGlycV90eXBlICYgU1RTX1NZU1RFTV9JUlEpIHsKKwkJaGFuZGxlZCA9IDE7CisJCWlycV90eXBlICY9IFNUU19JUlFfTUFTSzsKKworCQlpZighdG1zMzgwdHJfY2hrX3NzYih0cCwgaXJxX3R5cGUpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERBVEEgTEFURSBvY2N1cnJlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoKGlycV90eXBlKSB7CisJCWNhc2UgU1RTX0lSUV9SRUNFSVZFX1NUQVRVUzoKKwkJCXRtczM4MHRyX3Jlc2V0X2ludGVycnVwdChkZXYpOworCQkJdG1zMzgwdHJfcmN2X3N0YXR1c19pcnEoZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RTX0lSUV9UUkFOU01JVF9TVEFUVVM6CisJCQkvKiBDaGVjayBpZiBUUkFOU01JVC5IQUxUIGNvbW1hbmQgaXMgY29tcGxldGUgKi8KKwkJCWlmKHRwLT5zc2IuUGFybVswXSAmIENPTU1BTkRfQ09NUExFVEUpIHsKKwkJCQl0cC0+VHJhbnNtaXRDb21tYW5kQWN0aXZlID0gMDsKKwkJCQkJdHAtPlRyYW5zbWl0SGFsdFNjaGVkdWxlZCA9IDA7CisKKwkJCQkJLyogSXNzdWUgYSBuZXcgdHJhbnNtaXQgY29tbWFuZC4gKi8KKwkJCQkJdG1zMzgwdHJfZXhlY19jbWQoZGV2LCBPQ19UUkFOU01JVCk7CisJCQkJfQorCisJCQkJdG1zMzgwdHJfcmVzZXRfaW50ZXJydXB0KGRldik7CisJCQkJdG1zMzgwdHJfdHhfc3RhdHVzX2lycShkZXYpOworCQkJCWJyZWFrOworCisJCWNhc2UgU1RTX0lSUV9DT01NQU5EX1NUQVRVUzoKKwkJCS8qIFRoZSBTU0IgY29udGFpbnMgc3RhdHVzIG9mIGxhc3QgY29tbWFuZAorCQkJICogb3RoZXIgdGhhbiByZWNlaXZlL3RyYW5zbWl0LgorCQkJICovCisJCQl0bXMzODB0cl9jbWRfc3RhdHVzX2lycShkZXYpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBTVFNfSVJRX1NDQl9DTEVBUjoKKwkJCS8qIFRoZSBTQ0IgaXMgZnJlZSBmb3IgYW5vdGhlciBjb21tYW5kLiAqLworCQkJdHAtPlNjYkluVXNlID0gMDsKKwkJCXRtczM4MHRyX2Noa19vdXRzdGFuZGluZ19jbWRzKGRldik7CisJCQlicmVhazsKKwkJCQorCQljYXNlIFNUU19JUlFfUklOR19TVEFUVVM6CisJCQl0bXMzODB0cl9yaW5nX3N0YXR1c19pcnEoZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RTX0lSUV9BREFQVEVSX0NIRUNLOgorCQkJdG1zMzgwdHJfY2hrX2lycShkZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVFNfSVJRX0xMQ19TVEFUVVM6CisJCQlwcmludGsoS0VSTl9ERUJVRyAidG1zMzgwdHI6IHVuZXhwZWN0ZWQgTExDIHN0YXR1cyBJUlFcbiIpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBTVFNfSVJRX1RJTUVSOgorCQkJcHJpbnRrKEtFUk5fREVCVUcgInRtczM4MHRyOiB1bmV4cGVjdGVkIFRpbWVyIElSUVxuIik7CisJCQlicmVhazsKKwkJCQorCQljYXNlIFNUU19JUlFfUkVDRUlWRV9QRU5ESU5HOgorCQkJcHJpbnRrKEtFUk5fREVCVUcgInRtczM4MHRyOiB1bmV4cGVjdGVkIFJlY2VpdmUgUGVuZGluZyBJUlFcbiIpOworCQkJYnJlYWs7CisJCQkKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0RFQlVHICJVbmtub3duIFRva2VuIFJpbmcgSVJRICgweCUwNHgpXG4iLCBpcnFfdHlwZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFJlc2V0IHN5c3RlbSBpbnRlcnJ1cHQgaWYgbm90IGFscmVhZHkgZG9uZS4gKi8KKwkJaWYoaXJxX3R5cGUgIT0gU1RTX0lSUV9UUkFOU01JVF9TVEFUVVMKKwkJCSYmIGlycV90eXBlICE9IFNUU19JUlFfUkVDRUlWRV9TVEFUVVMpIHsKKwkJCXRtczM4MHRyX3Jlc2V0X2ludGVycnVwdChkZXYpOworCQl9CisKKwkJaXJxX3R5cGUgPSBTSUZSRUFEVyhTSUZTVFMpOworCX0KKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKgorICogIFJlc2V0IHRoZSBJTlRFUlJVUFQgU1lTVEVNIGJpdCBhbmQgaXNzdWUgU1NCIENMRUFSIGNvbW1hbmQuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX3Jlc2V0X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlTU0IgKnNzYiA9ICZ0cC0+c3NiOworCisJLyoKKwkgKiBbV29ya2Fyb3VuZCBmb3IgIkRhdGEgTGF0ZSJdCisJICogU2V0IGFsbCBmaWVsZHMgb2YgdGhlIFNTQiB0byB3ZWxsLWRlZmluZWQgdmFsdWVzIHNvIHdlIGNhbgorCSAqIGNoZWNrIGlmIHRoZSBhZGFwdGVyIGhhcyB3cml0dGVuIHRoZSBTU0IuCisJICovCisKKwlzc2ItPlNUUwk9ICh1bnNpZ25lZCBzaG9ydCkgLTE7CisJc3NiLT5QYXJtWzBdIAk9ICh1bnNpZ25lZCBzaG9ydCkgLTE7CisJc3NiLT5QYXJtWzFdIAk9ICh1bnNpZ25lZCBzaG9ydCkgLTE7CisJc3NiLT5QYXJtWzJdIAk9ICh1bnNpZ25lZCBzaG9ydCkgLTE7CisKKwkvKiBGcmVlIFNTQiBieSBpc3N1aW5nIFNTQl9DTEVBUiBjb21tYW5kIGFmdGVyIHJlYWRpbmcgSVJRIGNvZGUKKwkgKiBhbmQgY2xlYXIgU1RTX1NZU1RFTV9JUlEgYml0OiBlbmFibGUgYWRhcHRlciBmb3IgZnVydGhlciBpbnRlcnJ1cHRzLgorCSAqLworCXRtczM4MHRyX2V4ZWNfc2lmY21kKGRldiwgQ01EX1NTQl9DTEVBUiB8IENNRF9DTEVBUl9TWVNURU1fSVJRKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSBTU0IgaGFzIGFjdHVhbGx5IGJlZW4gd3JpdHRlbiBieSB0aGUgYWRhcHRlci4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgdG1zMzgwdHJfY2hrX3NzYihzdHJ1Y3QgbmV0X2xvY2FsICp0cCwgdW5zaWduZWQgc2hvcnQgSXJxVHlwZSkKK3sKKwlTU0IgKnNzYiA9ICZ0cC0+c3NiOwkvKiBUaGUgYWRkcmVzcyBvZiB0aGUgU1NCLiAqLworCisJLyogQyAwIDEgMiBJTlRFUlJVUFQgQ09ERQorCSAqIC0gLSAtIC0gLS0tLS0tLS0tLS0tLS0KKwkgKiAxIDEgMSAxIFRSQU5TTUlUIFNUQVRVUworCSAqIDEgMSAxIDEgUkVDRUlWRSBTVEFUVVMKKwkgKiAxID8gPyAwIENPTU1BTkQgU1RBVFVTCisJICogMCAwIDAgMCBTQ0IgQ0xFQVIKKwkgKiAxIDEgMCAwIFJJTkcgU1RBVFVTCisJICogMCAwIDAgMCBBREFQVEVSIENIRUNLCisJICoKKwkgKiAwID0gU1NCIGZpZWxkIG5vdCBhZmZlY3RlZCBieSBpbnRlcnJ1cHQKKwkgKiAxID0gU1NCIGZpZWxkIGlzIGFmZmVjdGVkIGJ5IGludGVycnVwdAorCSAqCisJICogQyA9IFNTQiBBRERSRVNTICswOiBDT01NQU5ECisJICogMCA9IFNTQiBBRERSRVNTICsyOiBTVEFUVVMgMAorCSAqIDEgPSBTU0IgQUREUkVTUyArNDogU1RBVFVTIDEKKwkgKiAyID0gU1NCIEFERFJFU1MgKzY6IFNUQVRVUyAyCisJICovCisKKwkvKiBDaGVjayBpZiB0aGlzIGludGVycnVwdCBkb2VzIHVzZSB0aGUgU1NCLiAqLworCisJaWYoSXJxVHlwZSAhPSBTVFNfSVJRX1RSQU5TTUlUX1NUQVRVUworCQkmJiBJcnFUeXBlICE9IFNUU19JUlFfUkVDRUlWRV9TVEFUVVMKKwkJJiYgSXJxVHlwZSAhPSBTVFNfSVJRX0NPTU1BTkRfU1RBVFVTCisJCSYmIElycVR5cGUgIT0gU1RTX0lSUV9SSU5HX1NUQVRVUykKKwl7CisJCXJldHVybiAoMSk7CS8qIFNTQiBub3QgaW52b2x2ZWQuICovCisJfQorCisJLyogTm90ZTogQWxsIGZpZWxkcyBvZiB0aGUgU1NCIGhhdmUgYmVlbiBzZXQgdG8gYWxsIG9uZXMgKC0xKSBhZnRlciBpdAorCSAqIGhhcyBsYXN0IGJlZW4gdXNlZCBieSB0aGUgc29mdHdhcmUgKHNlZSBEcml2ZXJJc3IoKSkuCisJICoKKwkgKiBDaGVjayBpZiB0aGUgYWZmZWN0ZWQgU1NCIGZpZWxkcyBhcmUgc3RpbGwgdW5jaGFuZ2VkLgorCSAqLworCisJaWYoc3NiLT5TVFMgPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKKwkJcmV0dXJuICgwKTsJLyogQ29tbWFuZCBmaWVsZCBub3QgeWV0IGF2YWlsYWJsZS4gKi8KKwlpZihJcnFUeXBlID09IFNUU19JUlFfQ09NTUFORF9TVEFUVVMpCisJCXJldHVybiAoMSk7CS8qIFN0YXR1cyBmaWVsZHMgbm90IGFsd2F5cyBhZmZlY3RlZC4gKi8KKwlpZihzc2ItPlBhcm1bMF0gPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKKwkJcmV0dXJuICgwKTsJLyogU3RhdHVzIDEgZmllbGQgbm90IHlldCBhdmFpbGFibGUuICovCisJaWYoSXJxVHlwZSA9PSBTVFNfSVJRX1JJTkdfU1RBVFVTKQorCQlyZXR1cm4gKDEpOwkvKiBTdGF0dXMgMiAmIDMgZmllbGRzIG5vdCBhZmZlY3RlZC4gKi8KKworCS8qIE5vdGU6IEF0IHRoaXMgcG9pbnQsIHRoZSBpbnRlcnJ1cHQgaXMgZWl0aGVyIFRSQU5TTUlUIG9yIFJFQ0VJVkUuICovCisJaWYoc3NiLT5QYXJtWzFdID09ICh1bnNpZ25lZCBzaG9ydCkgLTEpCisJCXJldHVybiAoMCk7CS8qIFN0YXR1cyAyIGZpZWxkIG5vdCB5ZXQgYXZhaWxhYmxlLiAqLworCWlmKHNzYi0+UGFybVsyXSA9PSAodW5zaWduZWQgc2hvcnQpIC0xKQorCQlyZXR1cm4gKDApOwkvKiBTdGF0dXMgMyBmaWVsZCBub3QgeWV0IGF2YWlsYWJsZS4gKi8KKworCXJldHVybiAoMSk7CS8qIEFsbCBTU0IgZmllbGRzIGhhdmUgYmVlbiB3cml0dGVuIGJ5IHRoZSBhZGFwdGVyLiAqLworfQorCisvKgorICogRXZhbHVhdGVzIHRoZSBjb21tYW5kIHJlc3VsdHMgc3RhdHVzIGluIHRoZSBTU0Igc3RhdHVzIGZpZWxkLgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9jbWRfc3RhdHVzX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBzaG9ydCBzc2JfY21kLCBzc2JfcGFybV8wOworCXVuc2lnbmVkIHNob3J0IHNzYl9wYXJtXzE7CisJY2hhciAqb3Blbl9lcnIgPSAiT3BlbiBlcnJvciAtIjsKKwljaGFyICpjb2RlX2VyciA9ICJPcGVuIGNvZGUgLSI7CisKKwkvKiBDb3B5IHRoZSBzc2IgdmFsdWVzIHRvIGxvY2FsIHZhcmlhYmxlcyAqLworCXNzYl9jbWQgICAgPSB0cC0+c3NiLlNUUzsKKwlzc2JfcGFybV8wID0gdHAtPnNzYi5QYXJtWzBdOworCXNzYl9wYXJtXzEgPSB0cC0+c3NiLlBhcm1bMV07CisKKwlpZihzc2JfY21kID09IE9QRU4pCisJeworCQl0cC0+U2xlZXBpbmcgPSAwOworCQlpZighdHAtPlJlT3BlbkluUHJvZ3Jlc3MpCisJICAgIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0cC0+d2FpdF9mb3JfdG9rX2ludCk7CisKKwkJdHAtPk9wZW5Db21tYW5kSXNzdWVkID0gMDsKKwkJdHAtPlNjYkluVXNlID0gMDsKKworCQlpZigoc3NiX3Bhcm1fMCAmIDB4MDBGRikgPT0gR09PRF9DT01QTEVUSU9OKQorCQl7CisJCQkvKiBTdWNjZXNzLCB0aGUgYWRhcHRlciBpcyBvcGVuLiAqLworCQkJdHAtPkxvYmVXaXJlRmF1bHRMb2dnZWQJPSAwOworCQkJdHAtPkFkYXB0ZXJPcGVuRmxhZyAJPSAxOworCQkJdHAtPkFkYXB0ZXJWaXJ0T3BlbkZsYWcgPSAxOworCQkJdHAtPlRyYW5zbWl0Q29tbWFuZEFjdGl2ZSA9IDA7CisJCQl0bXMzODB0cl9leGVjX2NtZChkZXYsIE9DX1RSQU5TTUlUKTsKKwkJCXRtczM4MHRyX2V4ZWNfY21kKGRldiwgT0NfUkVDRUlWRSk7CisKKwkJCWlmKHRwLT5SZU9wZW5JblByb2dyZXNzKQorCQkJCXRwLT5SZU9wZW5JblByb2dyZXNzID0gMDsKKworCQkJcmV0dXJuOworCQl9CisJCWVsc2UgCS8qIFRoZSBhZGFwdGVyIGRpZCBub3Qgb3Blbi4gKi8KKwkJeworCSAgICAJCWlmKHNzYl9wYXJtXzAgJiBOT0RFX0FERFJfRVJST1IpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vZGUgYWRkcmVzcyBlcnJvclxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkgICAgCQlpZihzc2JfcGFybV8wICYgTElTVF9TSVpFX0VSUk9SKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaXN0IHNpemUgZXJyb3JcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJICAgIAkJaWYoc3NiX3Bhcm1fMCAmIEJVRl9TSVpFX0VSUk9SKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCdWZmZXIgc2l6ZSBlcnJvclxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkgICAgCQlpZihzc2JfcGFybV8wICYgVFhfQlVGX0NPVU5UX0VSUk9SKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUeCBidWZmZXIgY291bnQgZXJyb3JcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJICAgIAkJaWYoc3NiX3Bhcm1fMCAmIElOVkFMSURfT1BFTl9PUFRJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludmFsaWQgb3BlbiBvcHRpb25cbiIsCisJCQkJCWRldi0+bmFtZSk7CisJICAgIAkJaWYoc3NiX3Bhcm1fMCAmIE9QRU5fRVJST1IpCisJCQl7CisJCQkJLyogU2hvdyB0aGUgb3BlbiBwaGFzZS4gKi8KKwkJCQlzd2l0Y2goc3NiX3Bhcm1fMCAmIE9QRU5fUEhBU0VTX01BU0spCisJCQkJeworCQkJCQljYXNlIExPQkVfTUVESUFfVEVTVDoKKwkJCQkJCWlmKCF0cC0+TG9iZVdpcmVGYXVsdExvZ2dlZCkKKwkJCQkJCXsKKwkJCQkJCQl0cC0+TG9iZVdpcmVGYXVsdExvZ2dlZCA9IDE7CisJCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIExvYmUgd2lyZSBmYXVsdCAoY2hlY2sgY2FibGUgISkuXG4iLCBkZXYtPm5hbWUsIG9wZW5fZXJyKTsKKwkJICAgIAkJCQl9CisJCQkJCQl0cC0+UmVPcGVuSW5Qcm9ncmVzcwk9IDE7CisJCQkJCQl0cC0+QWRhcHRlck9wZW5GbGFnIAk9IDA7CisJCQkJCQl0cC0+QWRhcHRlclZpcnRPcGVuRmxhZyA9IDE7CisJCQkJCQl0bXMzODB0cl9vcGVuX2FkYXB0ZXIoZGV2KTsKKwkJCQkJCXJldHVybjsKKworCQkJCQljYXNlIFBIWVNJQ0FMX0lOU0VSVElPTjoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBQaHlzaWNhbCBpbnNlcnRpb24uXG4iLCBkZXYtPm5hbWUsIG9wZW5fZXJyKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQUREUkVTU19WRVJJRklDQVRJT046CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgQWRkcmVzcyB2ZXJpZmljYXRpb24uXG4iLCBkZXYtPm5hbWUsIG9wZW5fZXJyKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgUEFSVElDSVBBVElPTl9JTl9SSU5HX1BPTEw6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgUGFydGljaXBhdGlvbiBpbiByaW5nIHBvbGwuXG4iLCBkZXYtPm5hbWUsIG9wZW5fZXJyKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgUkVRVUVTVF9JTklUSUFMSVNBVElPTjoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBSZXF1ZXN0IGluaXRpYWxpc2F0aW9uLlxuIiwgZGV2LT5uYW1lLCBvcGVuX2Vycik7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEZVTExEVVBMRVhfQ0hFQ0s6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgRnVsbCBkdXBsZXggY2hlY2suXG4iLCBkZXYtPm5hbWUsIG9wZW5fZXJyKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgVW5rbm93biBvcGVuIHBoYXNlXG4iLCBkZXYtPm5hbWUsIG9wZW5fZXJyKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIFNob3cgdGhlIG9wZW4gZXJyb3JzLiAqLworCQkJCXN3aXRjaChzc2JfcGFybV8wICYgT1BFTl9FUlJPUl9DT0RFU19NQVNLKQorCQkJCXsKKwkJCQkJY2FzZSBPUEVOX0ZVTkNUSU9OX0ZBSUxVUkU6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgT1BFTl9GVU5DVElPTl9GQUlMVVJFIiwgZGV2LT5uYW1lLCBjb2RlX2Vycik7CisJCQkJCQl0cC0+TGFzdE9wZW5TdGF0dXMgPQorCQkJCQkJCU9QRU5fRlVOQ1RJT05fRkFJTFVSRTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9TSUdOQUxfTE9TUzoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBPUEVOX1NJR05BTF9MT1NTXG4iLCBkZXYtPm5hbWUsIGNvZGVfZXJyKTsKKwkJCQkJCXRwLT5MYXN0T3BlblN0YXR1cyA9CisJCQkJCQkJT1BFTl9TSUdOQUxfTE9TUzsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9USU1FT1VUOgorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIE9QRU5fVElNRU9VVFxuIiwgZGV2LT5uYW1lLCBjb2RlX2Vycik7CisJCQkJCQl0cC0+TGFzdE9wZW5TdGF0dXMgPQorCQkJCQkJCU9QRU5fVElNRU9VVDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9SSU5HX0ZBSUxVUkU6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgT1BFTl9SSU5HX0ZBSUxVUkVcbiIsIGRldi0+bmFtZSwgY29kZV9lcnIpOworCQkJCQkJdHAtPkxhc3RPcGVuU3RhdHVzID0KKwkJCQkJCQlPUEVOX1JJTkdfRkFJTFVSRTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9SSU5HX0JFQUNPTklORzoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBPUEVOX1JJTkdfQkVBQ09OSU5HXG4iLCBkZXYtPm5hbWUsIGNvZGVfZXJyKTsKKwkJCQkJCXRwLT5MYXN0T3BlblN0YXR1cyA9CisJCQkJCQkJT1BFTl9SSU5HX0JFQUNPTklORzsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9EVVBMSUNBVEVfTk9ERUFERFI6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgT1BFTl9EVVBMSUNBVEVfTk9ERUFERFJcbiIsIGRldi0+bmFtZSwgY29kZV9lcnIpOworCQkJCQkJdHAtPkxhc3RPcGVuU3RhdHVzID0KKwkJCQkJCQlPUEVOX0RVUExJQ0FURV9OT0RFQUREUjsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9SRVFVRVNUX0lOSVQ6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgT1BFTl9SRVFVRVNUX0lOSVRcbiIsIGRldi0+bmFtZSwgY29kZV9lcnIpOworCQkJCQkJdHAtPkxhc3RPcGVuU3RhdHVzID0KKwkJCQkJCQlPUEVOX1JFUVVFU1RfSU5JVDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9SRU1PVkVfUkVDRUlWRUQ6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgT1BFTl9SRU1PVkVfUkVDRUlWRUQiLCBkZXYtPm5hbWUsIGNvZGVfZXJyKTsKKwkJCQkJCXRwLT5MYXN0T3BlblN0YXR1cyA9CisJCQkJCQkJT1BFTl9SRU1PVkVfUkVDRUlWRUQ7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE9QRU5fRlVMTERVUExFWF9TRVQ6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgT1BFTl9GVUxMRFVQTEVYX1NFVFxuIiwgZGV2LT5uYW1lLCBjb2RlX2Vycik7CisJCQkJCQl0cC0+TGFzdE9wZW5TdGF0dXMgPQorCQkJCQkJCU9QRU5fRlVMTERVUExFWF9TRVQ7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIFVua25vd24gb3BlbiBlcnIgY29kZSIsIGRldi0+bmFtZSwgY29kZV9lcnIpOworCQkJCQkJdHAtPkxhc3RPcGVuU3RhdHVzID0KKwkJCQkJCQlPUEVOX0ZVTkNUSU9OX0ZBSUxVUkU7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXRwLT5BZGFwdGVyT3BlbkZsYWcgCT0gMDsKKwkJCXRwLT5BZGFwdGVyVmlydE9wZW5GbGFnID0gMDsKKworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmKHNzYl9jbWQgIT0gUkVBRF9FUlJPUl9MT0cpCisJCQlyZXR1cm47CisKKwkJLyogQWRkIHZhbHVlcyBmcm9tIHRoZSBlcnJvciBsb2cgdGFibGUgdG8gdGhlIE1BQworCQkgKiBzdGF0aXN0aWNzIGNvdW50ZXJzIGFuZCB1cGRhdGUgdGhlIGVycm9ybG9ndGFibGUKKwkJICogbWVtb3J5LgorCQkgKi8KKwkJdHAtPk1hY1N0YXQubGluZV9lcnJvcnMgKz0gdHAtPmVycm9ybG9ndGFibGUuTGluZV9FcnJvcjsKKwkJdHAtPk1hY1N0YXQuYnVyc3RfZXJyb3JzICs9IHRwLT5lcnJvcmxvZ3RhYmxlLkJ1cnN0X0Vycm9yOworCQl0cC0+TWFjU3RhdC5BX0NfZXJyb3JzICs9IHRwLT5lcnJvcmxvZ3RhYmxlLkFSSV9GQ0lfRXJyb3I7CisJCXRwLT5NYWNTdGF0Lmxvc3RfZnJhbWVzICs9IHRwLT5lcnJvcmxvZ3RhYmxlLkxvc3RfRnJhbWVfRXJyb3I7CisJCXRwLT5NYWNTdGF0LnJlY3ZfY29uZ2VzdF9jb3VudCArPSB0cC0+ZXJyb3Jsb2d0YWJsZS5SeF9Db25nZXN0X0Vycm9yOworCQl0cC0+TWFjU3RhdC5yeF9lcnJvcnMgKz0gdHAtPmVycm9ybG9ndGFibGUuUnhfQ29uZ2VzdF9FcnJvcjsKKwkJdHAtPk1hY1N0YXQuZnJhbWVfY29waWVkX2Vycm9ycyArPSB0cC0+ZXJyb3Jsb2d0YWJsZS5GcmFtZV9Db3BpZWRfRXJyb3I7CisJCXRwLT5NYWNTdGF0LnRva2VuX2Vycm9ycyArPSB0cC0+ZXJyb3Jsb2d0YWJsZS5Ub2tlbl9FcnJvcjsKKwkJdHAtPk1hY1N0YXQuZHVtbXkxICs9IHRwLT5lcnJvcmxvZ3RhYmxlLkRNQV9CdXNfRXJyb3I7CisJCXRwLT5NYWNTdGF0LmR1bW15MSArPSB0cC0+ZXJyb3Jsb2d0YWJsZS5ETUFfUGFyaXR5X0Vycm9yOworCQl0cC0+TWFjU3RhdC5hYm9ydF9kZWxpbWl0ZXJzICs9IHRwLT5lcnJvcmxvZ3RhYmxlLkFib3J0RGVsaW1ldGVyczsKKwkJdHAtPk1hY1N0YXQuZnJlcXVlbmN5X2Vycm9ycyArPSB0cC0+ZXJyb3Jsb2d0YWJsZS5GcmVxdWVuY3lfRXJyb3I7CisJCXRwLT5NYWNTdGF0LmludGVybmFsX2Vycm9ycyArPSB0cC0+ZXJyb3Jsb2d0YWJsZS5JbnRlcm5hbF9FcnJvcjsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIHRtczM4MHRyX29wZW4oKS4KKyAqLworaW50IHRtczM4MHRyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlkZWxfdGltZXIoJnRwLT50aW1lcik7CisKKwkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnggaGVyZS4gKi8KKworCXRwLT5IYWx0SW5Qcm9ncmVzcyAJPSAxOworCXRtczM4MHRyX2V4ZWNfY21kKGRldiwgT0NfQ0xPU0UpOworCXRwLT50aW1lci5leHBpcmVzCT0gamlmZmllcyArIDEqSFo7CisJdHAtPnRpbWVyLmZ1bmN0aW9uIAk9IHRtczM4MHRyX3RpbWVyX2VuZF93YWl0OworCXRwLT50aW1lci5kYXRhIAkJPSAodW5zaWduZWQgbG9uZylkZXY7CisJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworCisJdG1zMzgwdHJfZW5hYmxlX2ludGVycnVwdHMoZGV2KTsKKworCXRwLT5TbGVlcGluZyA9IDE7CisJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmdHAtPndhaXRfZm9yX3Rva19pbnQpOworCXRwLT5UcmFuc21pdENvbW1hbmRBY3RpdmUgPSAwOworICAgIAorCWRlbF90aW1lcigmdHAtPnRpbWVyKTsKKwl0bXMzODB0cl9kaXNhYmxlX2ludGVycnVwdHMoZGV2KTsKKyAgIAorI2lmZGVmIENPTkZJR19JU0EKKwlpZihkZXYtPmRtYSA+IDApIAorCXsKKwkJdW5zaWduZWQgbG9uZyBmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCQlkaXNhYmxlX2RtYShkZXYtPmRtYSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCX0KKyNlbmRpZgorCQorCVNJRldSSVRFVygweEZGMDAsIFNJRkNNRCk7CisjaWYgMAorCWlmKGRldi0+ZG1hID4gMCkgLyogd2hhdCB0aGU/ICovCisJCVNJRldSSVRFQigweGZmLCBQT1NSRUcpOworI2VuZGlmCisJdG1zMzgwdHJfY2FuY2VsX3R4X3F1ZXVlKHRwKTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4gVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbgorICogb3IgY2xvc2VkLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnRtczM4MHRyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopJnRwLT5NYWNTdGF0KTsKK30KKworLyoKKyAqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdGVyLgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IE9wZW5PcHRpb25zOworCQorCU9wZW5PcHRpb25zID0gdHAtPm9jcGwuT1BFTk9wdGlvbnMgJgorCQl+KFBBU1NfQURBUFRFUl9NQUNfRlJBTUVTCisJCSAgfCBQQVNTX0FUVEVOVElPTl9GUkFNRVMKKwkJICB8IFBBU1NfQkVBQ09OX01BQ19GUkFNRVMKKwkJICB8IENPUFlfQUxMX01BQ19GUkFNRVMKKwkJICB8IENPUFlfQUxMX05PTl9NQUNfRlJBTUVTKTsKKwkKKwl0cC0+b2NwbC5GdW5jdEFkZHIgPSAwOworCQorCWlmKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJT3Blbk9wdGlvbnMgfD0gQ09QWV9BTExfTk9OX01BQ19GUkFNRVMgfAorCQkJQ09QWV9BTExfTUFDX0ZSQU1FUzsKKwllbHNlCisJeworCQlpZihkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQl7CisJCQkvKiBEaXNhYmxlIHByb21pc2N1b3VzIG1vZGUsIHVzZSBub3JtYWwgbW9kZS4gKi8KKwkJCXRwLT5vY3BsLkZ1bmN0QWRkciA9IDB4RkZGRkZGRkY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbnQgaTsKKwkJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0ID0gZGV2LT5tY19saXN0OworCQkJZm9yIChpPTA7IGk8IGRldi0+bWNfY291bnQ7IGkrKykKKwkJCXsKKwkJCQkoKGNoYXIgKikoJnRwLT5vY3BsLkZ1bmN0QWRkcikpWzBdIHw9CisJCQkJCW1jbGlzdC0+ZG1pX2FkZHJbMl07CisJCQkJKChjaGFyICopKCZ0cC0+b2NwbC5GdW5jdEFkZHIpKVsxXSB8PQorCQkJCQltY2xpc3QtPmRtaV9hZGRyWzNdOworCQkJCSgoY2hhciAqKSgmdHAtPm9jcGwuRnVuY3RBZGRyKSlbMl0gfD0KKwkJCQkJbWNsaXN0LT5kbWlfYWRkcls0XTsKKwkJCQkoKGNoYXIgKikoJnRwLT5vY3BsLkZ1bmN0QWRkcikpWzNdIHw9CisJCQkJCW1jbGlzdC0+ZG1pX2FkZHJbNV07CisJCQkJbWNsaXN0ID0gbWNsaXN0LT5uZXh0OworCQkJfQorCQl9CisJCXRtczM4MHRyX2V4ZWNfY21kKGRldiwgT0NfU0VUX0ZVTkNUX0FERFIpOworCX0KKwkKKwl0cC0+b2NwbC5PUEVOT3B0aW9ucyA9IE9wZW5PcHRpb25zOworCXRtczM4MHRyX2V4ZWNfY21kKGRldiwgT0NfTU9ESUZZX09QRU5fUEFSTVMpOworCXJldHVybjsKK30KKworLyoKKyAqIFdhaXQgZm9yIHNvbWUgdGltZSAobWljcm9zZWNvbmRzKQorICovCit2b2lkIHRtczM4MHRyX3dhaXQodW5zaWduZWQgbG9uZyB0aW1lKQoreworI2lmIDAKKwlsb25nIHRtcDsKKwkKKwl0bXAgPSBqaWZmaWVzICsgdGltZS8oMTAwMDAwMC9IWik7CisJZG8geworICAJCWN1cnJlbnQtPnN0YXRlIAkJPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXRtcCA9IHNjaGVkdWxlX3RpbWVvdXQodG1wKTsKKwl9IHdoaWxlKHRpbWVfYWZ0ZXIodG1wLCBqaWZmaWVzKSk7CisjZWxzZQorCXVkZWxheSh0aW1lKTsKKyNlbmRpZgorCXJldHVybjsKK30KKworLyoKKyAqIFdyaXRlIGEgY29tbWFuZCB2YWx1ZSB0byB0aGUgU0lGQ01EIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX2V4ZWNfc2lmY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBXcml0ZVZhbHVlKQoreworCXVuc2lnbmVkIHNob3J0IGNtZDsKKwl1bnNpZ25lZCBzaG9ydCBTaWZTdHNWYWx1ZTsKKwl1bnNpZ25lZCBsb25nIGxvb3BfY291bnRlcjsKKworCVdyaXRlVmFsdWUgPSAoKFdyaXRlVmFsdWUgXiBDTURfU1lTVEVNX0lSUSkgfCBDTURfSU5URVJSVVBUX0FEQVBURVIpOworCWNtZCA9ICh1bnNpZ25lZCBzaG9ydClXcml0ZVZhbHVlOworCWxvb3BfY291bnRlciA9IDAsNSAqIDgwMDAwMDsKKwlkbyB7CisJCVNpZlN0c1ZhbHVlID0gU0lGUkVBRFcoU0lGU1RTKTsKKwl9IHdoaWxlKChTaWZTdHNWYWx1ZSAmIENNRF9JTlRFUlJVUFRfQURBUFRFUikgJiYgbG9vcF9jb3VudGVyLS0pOworCVNJRldSSVRFVyhjbWQsIFNJRkNNRCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBQcm9jZXNzZXMgYWRhcHRlciBoYXJkd2FyZSByZXNldCwgaGFsdHMgYWRhcHRlciBhbmQgZG93bmxvYWRzIGZpcm13YXJlLAorICogY2xlYXJzIHRoZSBoYWx0IGJpdC4KKyAqLworc3RhdGljIGludCB0bXMzODB0cl9yZXNldF9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIHNob3J0ICpmd19wdHI7CisJdW5zaWduZWQgc2hvcnQgY291bnQsIGMsIGNvdW50MjsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5ID0gTlVMTDsKKworCXN0cm5jcHkodG1zX2RldmljZS5idXNfaWQsZGV2LT5uYW1lLCBCVVNfSURfU0laRSk7CisKKwlpZiAocmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksICJ0bXMzODB0ci5iaW4iLCAmdG1zX2RldmljZSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IGZpcm13YXJlICVzIGlzIG1pc3NpbmcsIGNhbm5vdCBzdGFydC5cbiIsCisJCQlkZXYtPm5hbWUsICJ0bXMzODB0ci5iaW4iKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJZndfcHRyID0gKHVuc2lnbmVkIHNob3J0ICopZndfZW50cnktPmRhdGE7CisJY291bnQyID0gZndfZW50cnktPnNpemUgLyAyOworCisJLyogSGFyZHdhcmUgYWRhcHRlciByZXNldCAqLworCVNJRldSSVRFVyhBQ0xfQVJFU0VULCBTSUZBQ0wpOworCXRtczM4MHRyX3dhaXQoNDApOworCQorCWMgPSBTSUZSRUFEVyhTSUZBQ0wpOworCXRtczM4MHRyX3dhaXQoMjApOworCisJaWYoZGV2LT5kbWEgPT0gMCkJLyogRm9yIFBDSSBhZGFwdGVycyAqLworCXsKKwkJYyAmPSB+KEFDTF9OU0VMT1VUMCB8IEFDTF9OU0VMT1VUMSk7CS8qIENsZWFyIGJpdHMgKi8KKwkJaWYodHAtPnNldG5zZWxvdXQpCisJCSAgYyB8PSAoKnRwLT5zZXRuc2Vsb3V0KShkZXYpOworCX0KKworCS8qIEluIGNhc2UgYSBjb21tYW5kIGlzIHBlbmRpbmcgLSBmb3JnZXQgaXQgKi8KKwl0cC0+U2NiSW5Vc2UgPSAwOworCisJYyAmPSB+QUNMX0FSRVNFVDsJCS8qIENsZWFyIGFkYXB0ZXIgcmVzZXQgYml0ICovCisJYyB8PSAgQUNMX0NQSEFMVDsJCS8qIEhhbHQgYWRhcHRlciBDUFUsIGFsbG93IGRvd25sb2FkICovCisJYyB8PSBBQ0xfQk9PVDsKKwljIHw9IEFDTF9TSU5URU47CisJYyAmPSB+QUNMX1BTRE1BRU47CQkvKiBDbGVhciBwc2V1ZG8gZG1hIGJpdCAqLworCVNJRldSSVRFVyhjLCBTSUZBQ0wpOworCXRtczM4MHRyX3dhaXQoNDApOworCisJY291bnQgPSAwOworCS8qIERvd25sb2FkIGZpcm13YXJlIHZpYSBESU8gaW50ZXJmYWNlOiAqLworCWRvIHsKKwkJaWYgKGNvdW50MiA8IDMpIGNvbnRpbnVlOworCisJCS8qIERvd25sb2FkIGZpcnN0IGFkZHJlc3MgcGFydCAqLworCQlTSUZXUklURVcoKmZ3X3B0ciwgU0lGQURYKTsKKwkJZndfcHRyKys7CisJCWNvdW50Mi0tOworCQkvKiBEb3dubG9hZCBzZWNvbmQgYWRkcmVzcyBwYXJ0ICovCisJCVNJRldSSVRFVygqZndfcHRyLCBTSUZBREQpOworCQlmd19wdHIrKzsKKwkJY291bnQyLS07CisKKwkJaWYoKGNvdW50ID0gKmZ3X3B0cikgIT0gMCkJLyogTG9hZCBsb29wIGNvdW50ZXIgKi8KKwkJeworCQkJZndfcHRyKys7CS8qIERvd25sb2FkIGJsb2NrIGRhdGEgKi8KKwkJCWNvdW50Mi0tOworCQkJaWYgKGNvdW50ID4gY291bnQyKSBjb250aW51ZTsKKworCQkJZm9yKDsgY291bnQgPiAwOyBjb3VudC0tKQorCQkJeworCQkJCVNJRldSSVRFVygqZndfcHRyLCBTSUZJTkMpOworCQkJCWZ3X3B0cisrOworCQkJCWNvdW50Mi0tOworCQkJfQorCQl9CisJCWVsc2UJLyogU3RvcCwgaWYgbGFzdCBibG9jayBkb3dubG9hZGVkICovCisJCXsKKwkJCWMgPSBTSUZSRUFEVyhTSUZBQ0wpOworCQkJYyAmPSAofkFDTF9DUEhBTFQgfCBBQ0xfU0lOVEVOKTsKKworCQkJLyogQ2xlYXIgQ1BIQUxUIGFuZCBzdGFydCBCVUQgKi8KKwkJCVNJRldSSVRFVyhjLCBTSUZBQ0wpOworCQkJaWYgKGZ3X2VudHJ5KQorCQkJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0gd2hpbGUoY291bnQgPT0gMCk7CisKKwlpZiAoZndfZW50cnkpCisJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBBZGFwdGVyIERvd25sb2FkIEZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwlyZXR1cm4gKC0xKTsKK30KKworLyoKKyAqIFN0YXJ0cyBicmluZyB1cCBkaWFnbm9zdGljcyBvZiB0b2tlbiByaW5nIGFkYXB0ZXIgYW5kIGV2YWx1YXRlcworICogZGlhZ25vc3RpYyByZXN1bHRzLgorICovCitzdGF0aWMgaW50IHRtczM4MHRyX2JyaW5ndXBfZGlhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgbG9vcF9jbnQsIHJldHJ5X2NudDsKKwl1bnNpZ25lZCBzaG9ydCBTdGF0dXM7CisKKwl0bXMzODB0cl93YWl0KEhBTEZfU0VDT05EKTsKKwl0bXMzODB0cl9leGVjX3NpZmNtZChkZXYsIEVYRUNfU09GVF9SRVNFVCk7CisJdG1zMzgwdHJfd2FpdChIQUxGX1NFQ09ORCk7CisKKwlyZXRyeV9jbnQgPSBCVURfTUFYX1JFVFJJRVM7CS8qIG1heGltYWwgbnVtYmVyIG9mIHJldHJ5cyAqLworCisJZG8geworCQlyZXRyeV9jbnQtLTsKKwkJaWYodG1zMzgwdHJfZGVidWcgPiAzKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIkJVRC1TdGF0dXM6ICIpOworCQlsb29wX2NudCA9IEJVRF9NQVhfTE9PUENOVDsJLyogbWF4aW11bTogdGhyZWUgc2Vjb25kcyovCisJCWRvIHsJCQkvKiBJbnNwZWN0IEJVRCByZXN1bHRzICovCisJCQlsb29wX2NudC0tOworCQkJdG1zMzgwdHJfd2FpdChIQUxGX1NFQ09ORCk7CisJCQlTdGF0dXMgPSBTSUZSRUFEVyhTSUZTVFMpOworCQkJU3RhdHVzICY9IFNUU19NQVNLOworCisJCQlpZih0bXMzODB0cl9kZWJ1ZyA+IDMpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAlMDRYIFxuIiwgU3RhdHVzKTsKKwkJCS8qIEJVRCBzdWNjZXNzZnVsbHkgY29tcGxldGVkICovCisJCQlpZihTdGF0dXMgPT0gU1RTX0lOSVRJQUxJWkUpCisJCQkJcmV0dXJuICgxKTsKKwkJLyogVW5yZWNvdmVyYWJsZSBoYXJkd2FyZSBlcnJvciwgQlVEIG5vdCBjb21wbGV0ZWQ/ICovCisJCX0gd2hpbGUoKGxvb3BfY250ID4gMCkgJiYgKChTdGF0dXMgJiAoU1RTX0VSUk9SIHwgU1RTX1RFU1QpKQorCQkJIT0gKFNUU19FUlJPUiB8IFNUU19URVNUKSkpOworCisJCS8qIEVycm9yIHByZXZlbnRpbmcgY29tcGxldGlvbiBvZiBCVUQgKi8KKwkJaWYocmV0cnlfY250ID4gMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFkYXB0ZXIgU29mdHdhcmUgUmVzZXQuXG4iLCAKKwkJCQlkZXYtPm5hbWUpOworCQkJdG1zMzgwdHJfZXhlY19zaWZjbWQoZGV2LCBFWEVDX1NPRlRfUkVTRVQpOworCQkJdG1zMzgwdHJfd2FpdChIQUxGX1NFQ09ORCk7CisJCX0KKwl9IHdoaWxlKHJldHJ5X2NudCA+IDApOworCisJU3RhdHVzID0gU0lGUkVBRFcoU0lGU1RTKTsKKwkKKwlwcmludGsoS0VSTl9JTkZPICIlczogSGFyZHdhcmUgZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJLyogSGFyZHdhcmUgZXJyb3Igb2NjdXJyZWQhICovCisJU3RhdHVzICY9IDB4MDAxZjsKKwlpZiAoU3RhdHVzICYgMHgwMDEwKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogQlVEIEVycm9yOiBUaW1lb3V0XG4iLCBkZXYtPm5hbWUpOworCWVsc2UgaWYgKChTdGF0dXMgJiAweDAwMGYpID4gNikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJVRCBFcnJvcjogSWxsZWdhbCBGYWlsdXJlXG4iLCBkZXYtPm5hbWUpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJyaW5nIFVwIERpYWdub3N0aWNzIEVycm9yICglMDRYKSBvY2N1cnJlZFxuIiwgZGV2LT5uYW1lLCBTdGF0dXMgJiAweDAwMGYpOworCisJcmV0dXJuICgtMSk7Cit9CisKKy8qCisgKiBDb3B5IGluaXRpYWxpc2F0aW9uIGRhdGEgdG8gYWRhcHRlciBtZW1vcnksIGJlZ2lubmluZyBhdCBhZGRyZXNzCisgKiAxOjBBMDA7IFN0YXJ0aW5nIERNQSB0ZXN0IGFuZCBldmFsdWF0aW5nIHJlc3VsdCBiaXRzLgorICovCitzdGF0aWMgaW50IHRtczM4MHRyX2luaXRfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWNvbnN0IHVuc2lnbmVkIGNoYXIgU0NCX1Rlc3RbNl0gPSB7MHgwMCwgMHgwMCwgMHhDMSwgMHhFMiwgMHhENCwgMHg4Qn07CisJY29uc3QgdW5zaWduZWQgY2hhciBTU0JfVGVzdFs4XSA9IHsweEZGLCAweEZGLCAweEQxLCAweEQ3LAorCQkJCQkJMHhDNSwgMHhEOSwgMHhDMywgMHhENH07CisJdm9pZCAqcHRyID0gKHZvaWQgKikmdHAtPmlwYjsKKwl1bnNpZ25lZCBzaG9ydCAqaXBiX3B0ciA9ICh1bnNpZ25lZCBzaG9ydCAqKXB0cjsKKwl1bnNpZ25lZCBjaGFyICpjYl9wdHIgPSAodW5zaWduZWQgY2hhciAqKSAmdHAtPnNjYjsKKwl1bnNpZ25lZCBjaGFyICpzYl9wdHIgPSAodW5zaWduZWQgY2hhciAqKSAmdHAtPnNzYjsKKwl1bnNpZ25lZCBzaG9ydCBTdGF0dXM7CisJaW50IGksIGxvb3BfY250LCByZXRyeV9jbnQ7CisKKwkvKiBOb3JtYWxpemU6IGJ5dGUgb3JkZXIgbG93L2hpZ2gsIHdvcmQgb3JkZXIgaGlnaC9sb3chIChvbmx5IElQQiEpICovCisJdHAtPmlwYi5TQ0JfQWRkciA9IFNXQVBXKCgoY2hhciAqKSZ0cC0+c2NiIC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyKTsKKwl0cC0+aXBiLlNTQl9BZGRyID0gU1dBUFcoKChjaGFyICopJnRwLT5zc2IgLSAoY2hhciAqKXRwKSArIHRwLT5kbWFidWZmZXIpOworCisJaWYodG1zMzgwdHJfZGVidWcgPiAzKQorCXsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidWZmZXIgKHJlYWwpOiAlbHhcbiIsIGRldi0+bmFtZSwgKGxvbmcpICZ0cC0+c2NiKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidWZmZXIgKHZpcnQpOiAlbHhcbiIsIGRldi0+bmFtZSwgKGxvbmcpICgoY2hhciAqKSZ0cC0+c2NiIC0gKGNoYXIgKil0cCkgKyAobG9uZykgdHAtPmRtYWJ1ZmZlcik7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogYnVmZmVyIChETUEpIDogJWx4XG4iLCBkZXYtPm5hbWUsIChsb25nKSB0cC0+ZG1hYnVmZmVyKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidWZmZXIgKHRwKSAgOiAlbHhcbiIsIGRldi0+bmFtZSwgKGxvbmcpIHRwKTsKKwl9CisJLyogTWF4aW11bTogdGhyZWUgaW5pdGlhbGl6YXRpb24gcmV0cmllcyAqLworCXJldHJ5X2NudCA9IElOSVRfTUFYX1JFVFJJRVM7CisKKwlkbyB7CisJCXJldHJ5X2NudC0tOworCisJCS8qIFRyYW5zZmVyIGluaXRpYWxpemF0aW9uIGJsb2NrICovCisJCVNJRldSSVRFVygweDAwMDEsIFNJRkFEWCk7CisKKwkJLyogVG8gYWRkcmVzcyAwMDAxOjBBMDAgb2YgYWRhcHRlciBSQU0gKi8KKwkJU0lGV1JJVEVXKDB4MEEwMCwgU0lGQUREKTsKKworCQkvKiBXcml0ZSAxMSB3b3JkcyB0byBhZGFwdGVyIFJBTSAqLworCQlmb3IoaSA9IDA7IGkgPCAxMTsgaSsrKQorCQkJU0lGV1JJVEVXKGlwYl9wdHJbaV0sIFNJRklOQyk7CisKKwkJLyogRXhlY3V0ZSBTQ0IgYWRhcHRlciBjb21tYW5kICovCisJCXRtczM4MHRyX2V4ZWNfc2lmY21kKGRldiwgQ01EX0VYRUNVVEUpOworCisJCWxvb3BfY250ID0gSU5JVF9NQVhfTE9PUENOVDsJLyogTWF4aW11bTogMTEgc2Vjb25kcyAqLworCisJCS8qIFdoaWxlIHJlbWFpbmluZyByZXRyaWVzLCBubyBlcnJvciBhbmQgbm90IGNvbXBsZXRlZCAqLworCQlkbyB7CisJCQlTdGF0dXMgPSAwOworCQkJbG9vcF9jbnQtLTsKKwkJCXRtczM4MHRyX3dhaXQoSEFMRl9TRUNPTkQpOworCisJCQkvKiBNYXNrIGludGVyZXN0aW5nIHN0YXR1cyBiaXRzICovCisJCQlTdGF0dXMgPSBTSUZSRUFEVyhTSUZTVFMpOworCQkJU3RhdHVzICY9IFNUU19NQVNLOworCQl9IHdoaWxlKCgoU3RhdHVzICYoU1RTX0lOSVRJQUxJWkUgfCBTVFNfRVJST1IgfCBTVFNfVEVTVCkpICE9IDApCisJCQkmJiAoKFN0YXR1cyAmIFNUU19FUlJPUikgPT0gMCkgJiYgKGxvb3BfY250ICE9IDApKTsKKworCQlpZigoU3RhdHVzICYgKFNUU19JTklUSUFMSVpFIHwgU1RTX0VSUk9SIHwgU1RTX1RFU1QpKSA9PSAwKQorCQl7CisJCQkvKiBJbml0aWFsaXphdGlvbiBjb21wbGV0ZWQgd2l0aG91dCBlcnJvciAqLworCQkJaSA9IDA7CisJCQlkbyB7CS8qIFRlc3QgaWYgY29udGVudHMgb2YgU0NCIGlzIHZhbGlkICovCisJCQkJaWYoU0NCX1Rlc3RbaV0gIT0gKihjYl9wdHIgKyBpKSkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBETUEgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQkJCQkvKiBETUEgZGF0YSBlcnJvcjogd3JvbmcgZGF0YSBpbiBTQ0IgKi8KKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJfQorCQkJCWkrKzsKKwkJCX0gd2hpbGUoaSA8IDYpOworCisJCQlpID0gMDsKKwkJCWRvIHsJLyogVGVzdCBpZiBjb250ZW50cyBvZiBTU0IgaXMgdmFsaWQgKi8KKwkJCQlpZihTU0JfVGVzdFtpXSAhPSAqKHNiX3B0ciArIGkpKQorCQkJCQkvKiBETUEgZGF0YSBlcnJvcjogd3JvbmcgZGF0YSBpbiBTU0IgKi8KKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJaSsrOworCQkJfSB3aGlsZSAoaSA8IDgpOworCisJCQlyZXR1cm4gKDEpOwkvKiBBZGFwdGVyIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCAqLworCQl9CisJCWVsc2UKKwkJeworCQkJaWYoKFN0YXR1cyAmIFNUU19FUlJPUikgIT0gMCkKKwkJCXsKKwkJCQkvKiBJbml0aWFsaXphdGlvbiBlcnJvciBvY2N1cnJlZCAqLworCQkJCVN0YXR1cyA9IFNJRlJFQURXKFNJRlNUUyk7CisJCQkJU3RhdHVzICY9IFNUU19FUlJPUl9NQVNLOworCQkJCS8qIFNob3dJbml0aWFsaXNhdGlvbkVycm9yQ29kZShTdGF0dXMpOyAqLworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdGF0dXMgZXJyb3I6ICVkXG4iLCBkZXYtPm5hbWUsIFN0YXR1cyk7CisJCQkJcmV0dXJuICgtMSk7IC8qIFVucmVjb3ZlcmFibGUgZXJyb3IgKi8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZihyZXRyeV9jbnQgPiAwKQorCQkJCXsKKwkJCQkJLyogUmVzZXQgYWRhcHRlciBhbmQgdHJ5IGluaXQgYWdhaW4gKi8KKwkJCQkJdG1zMzgwdHJfZXhlY19zaWZjbWQoZGV2LCBFWEVDX1NPRlRfUkVTRVQpOworCQkJCQl0bXMzODB0cl93YWl0KEhBTEZfU0VDT05EKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IHdoaWxlKHJldHJ5X2NudCA+IDApOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJldHJ5IGV4Y2VlZGVkXG4iLCBkZXYtPm5hbWUpOworCXJldHVybiAoLTEpOworfQorCisvKgorICogQ2hlY2sgZm9yIG91dHN0YW5kaW5nIGNvbW1hbmRzIGluIGNvbW1hbmQgcXVldWUgYW5kIHRyaWVzIHRvIGV4ZWN1dGUKKyAqIGNvbW1hbmQgaW1tZWRpYXRlbHkuIENvcnJlc3BvbmRpbmcgY29tbWFuZCBmbGFnIGluIGNvbW1hbmQgcXVldWUgaXMgY2xlYXJlZC4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfY2hrX291dHN0YW5kaW5nX2NtZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBBZGRyID0gMDsKKworCWlmKHRwLT5DTURxdWV1ZSA9PSAwKQorCQlyZXR1cm47CQkvKiBObyBjb21tYW5kIGV4ZWN1dGlvbiAqLworCisJLyogSWYgU0NCIGluIHVzZTogbm8gY29tbWFuZCAqLworCWlmKHRwLT5TY2JJblVzZSA9PSAxKQorCQlyZXR1cm47CisKKwkvKiBDaGVjayBpZiBhZGFwdGVyIGlzIG9wZW5lZCwgYXZvaWRpbmcgQ09NTUFORF9SRUpFQ1QKKwkgKiBpbnRlcnJ1cHQgYnkgdGhlIGFkYXB0ZXIhCisJICovCisJaWYodHAtPkFkYXB0ZXJPcGVuRmxhZyA9PSAwKQorCXsKKwkJaWYodHAtPkNNRHF1ZXVlICYgT0NfT1BFTikKKwkJeworCQkJLyogRXhlY3V0ZSBPUEVOIGNvbW1hbmQJKi8KKwkJCXRwLT5DTURxdWV1ZSBePSBPQ19PUEVOOworCisJCQlBZGRyID0gaHRvbmwoKChjaGFyICopJnRwLT5vY3BsIC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyKTsKKwkJCXRwLT5zY2IuUGFybVswXSA9IExPV09SRChBZGRyKTsKKwkJCXRwLT5zY2IuUGFybVsxXSA9IEhJV09SRChBZGRyKTsKKwkJCXRwLT5zY2IuQ01EID0gT1BFTjsKKwkJfQorCQllbHNlCisJCQkvKiBObyBPUEVOIGNvbW1hbmQgcXVldWVkLCBidXQgYWRhcHRlciBjbG9zZWQuIE5vdGU6CisJCQkgKiBXZSdsbCB0cnkgdG8gcmUtb3BlbiB0aGUgYWRhcHRlciBpbiBEcml2ZXJQb2xsKCkKKwkJCSAqLworCQkJcmV0dXJuOwkJLyogTm8gYWRhcHRlciBjb21tYW5kIGlzc3VlZCAqLworCX0KKwllbHNlCisJeworCQkvKiBBZGFwdGVyIGlzIG9wZW47IGV2YWx1YXRlIGNvbW1hbmQgcXVldWU6IHRyeSB0byBleGVjdXRlCisJCSAqIG91dHN0YW5kaW5nIGNvbW1hbmRzIChkZXBlbmRpbmcgb24gcHJpb3JpdHkhKSBDTE9TRQorCQkgKiBjb21tYW5kIHF1ZXVlZAorCQkgKi8KKwkJaWYodHAtPkNNRHF1ZXVlICYgT0NfQ0xPU0UpCisJCXsKKwkJCXRwLT5DTURxdWV1ZSBePSBPQ19DTE9TRTsKKwkJCXRwLT5BZGFwdGVyT3BlbkZsYWcgPSAwOworCQkJdHAtPnNjYi5QYXJtWzBdID0gMDsgLyogUGFybVswXSwgUGFybVsxXSBhcmUgaWdub3JlZCAqLworCQkJdHAtPnNjYi5QYXJtWzFdID0gMDsgLyogYnV0IHNob3VsZCBiZSBzZXQgdG8gemVybyEgKi8KKwkJCXRwLT5zY2IuQ01EID0gQ0xPU0U7CisJCQlpZighdHAtPkhhbHRJblByb2dyZXNzKQorCQkJCXRwLT5DTURxdWV1ZSB8PSBPQ19PUEVOOyAvKiByZS1vcGVuIGFkYXB0ZXIgKi8KKwkJCWVsc2UKKwkJCQl0cC0+Q01EcXVldWUgPSAwOwkvKiBubyBtb3JlIGNvbW1hbmRzICovCisJCX0KKwkJZWxzZQorCQl7CisJCQlpZih0cC0+Q01EcXVldWUgJiBPQ19SRUNFSVZFKQorCQkJeworCQkJCXRwLT5DTURxdWV1ZSBePSBPQ19SRUNFSVZFOworCQkJCUFkZHIgPSBodG9ubCgoKGNoYXIgKil0cC0+UnBsSGVhZCAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7CisJCQkJdHAtPnNjYi5QYXJtWzBdID0gTE9XT1JEKEFkZHIpOworCQkJCXRwLT5zY2IuUGFybVsxXSA9IEhJV09SRChBZGRyKTsKKwkJCQl0cC0+c2NiLkNNRCA9IFJFQ0VJVkU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYodHAtPkNNRHF1ZXVlICYgT0NfVFJBTlNNSVRfSEFMVCkKKwkJCQl7CisJCQkJCS8qIE5PVEU6IFRSQU5TTUlULkhBTFQgbXVzdCBiZSBjaGVja2VkIAorCQkJCQkgKiBiZWZvcmUgVFJBTlNNSVQuCisJCQkJCSAqLworCQkJCQl0cC0+Q01EcXVldWUgXj0gT0NfVFJBTlNNSVRfSEFMVDsKKwkJCQkJdHAtPnNjYi5DTUQgPSBUUkFOU01JVF9IQUxUOworCisJCQkJCS8qIFBhcm1bMF0gYW5kIFBhcm1bMV0gYXJlIGlnbm9yZWQKKwkJCQkJICogYnV0IHNob3VsZCBiZSBzZXQgdG8gemVybyEKKwkJCQkJICovCisJCQkJCXRwLT5zY2IuUGFybVswXSA9IDA7CisJCQkJCXRwLT5zY2IuUGFybVsxXSA9IDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmKHRwLT5DTURxdWV1ZSAmIE9DX1RSQU5TTUlUKQorCQkJCQl7CisJCQkJCQkvKiBOT1RFOiBUUkFOU01JVCBtdXN0IGJlIAorCQkJCQkJICogY2hlY2tlZCBhZnRlciBUUkFOU01JVC5IQUxUCisJCQkJCQkgKi8KKwkJCQkJCWlmKHRwLT5UcmFuc21pdENvbW1hbmRBY3RpdmUpCisJCQkJCQl7CisJCQkJCQkJaWYoIXRwLT5UcmFuc21pdEhhbHRTY2hlZHVsZWQpCisJCQkJCQkJeworCQkJCQkJCQl0cC0+VHJhbnNtaXRIYWx0U2NoZWR1bGVkID0gMTsKKwkJCQkJCQkJdG1zMzgwdHJfZXhlY19jbWQoZGV2LCBPQ19UUkFOU01JVF9IQUxUKSA7CisJCQkJCQkJfQorCQkJCQkJCXRwLT5UcmFuc21pdENvbW1hbmRBY3RpdmUgPSAwOworCQkJCQkJCXJldHVybjsKKwkJCQkJCX0KKworCQkJCQkJdHAtPkNNRHF1ZXVlIF49IE9DX1RSQU5TTUlUOworCQkJCQkJdG1zMzgwdHJfY2FuY2VsX3R4X3F1ZXVlKHRwKTsKKwkJCQkJCUFkZHIgPSBodG9ubCgoKGNoYXIgKil0cC0+VHBsQnVzeSAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7CisJCQkJCQl0cC0+c2NiLlBhcm1bMF0gPSBMT1dPUkQoQWRkcik7CisJCQkJCQl0cC0+c2NiLlBhcm1bMV0gPSBISVdPUkQoQWRkcik7CisJCQkJCQl0cC0+c2NiLkNNRCA9IFRSQU5TTUlUOworCQkJCQkJdHAtPlRyYW5zbWl0Q29tbWFuZEFjdGl2ZSA9IDE7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlpZih0cC0+Q01EcXVldWUgJiBPQ19NT0RJRllfT1BFTl9QQVJNUykKKwkJCQkJCXsKKwkJCQkJCQl0cC0+Q01EcXVldWUgXj0gT0NfTU9ESUZZX09QRU5fUEFSTVM7CisJCQkJCQkJdHAtPnNjYi5QYXJtWzBdID0gdHAtPm9jcGwuT1BFTk9wdGlvbnM7IC8qIG5ldyBPUEVOIG9wdGlvbnMqLworCQkJCQkJCXRwLT5zY2IuUGFybVswXSB8PSBFTkFCTEVfRlVMTF9EVVBMRVhfU0VMRUNUSU9OOworCQkJCQkJCXRwLT5zY2IuUGFybVsxXSA9IDA7IC8qIGlzIGlnbm9yZWQgYnV0IHNob3VsZCBiZSB6ZXJvICovCisJCQkJCQkJdHAtPnNjYi5DTUQgPSBNT0RJRllfT1BFTl9QQVJNUzsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlpZih0cC0+Q01EcXVldWUgJiBPQ19TRVRfRlVOQ1RfQUREUikKKwkJCQkJCQl7CisJCQkJCQkJCXRwLT5DTURxdWV1ZSBePSBPQ19TRVRfRlVOQ1RfQUREUjsKKwkJCQkJCQkJdHAtPnNjYi5QYXJtWzBdID0gTE9XT1JEKHRwLT5vY3BsLkZ1bmN0QWRkcik7CisJCQkJCQkJCXRwLT5zY2IuUGFybVsxXSA9IEhJV09SRCh0cC0+b2NwbC5GdW5jdEFkZHIpOworCQkJCQkJCQl0cC0+c2NiLkNNRCA9IFNFVF9GVU5DVF9BRERSOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlpZih0cC0+Q01EcXVldWUgJiBPQ19TRVRfR1JPVVBfQUREUikKKwkJCQkJCQkJeworCQkJCQkJCQkJdHAtPkNNRHF1ZXVlIF49IE9DX1NFVF9HUk9VUF9BRERSOworCQkJCQkJCQkJdHAtPnNjYi5QYXJtWzBdID0gTE9XT1JEKHRwLT5vY3BsLkdyb3VwQWRkcik7CisJCQkJCQkJCQl0cC0+c2NiLlBhcm1bMV0gPSBISVdPUkQodHAtPm9jcGwuR3JvdXBBZGRyKTsKKwkJCQkJCQkJCXRwLT5zY2IuQ01EID0gU0VUX0dST1VQX0FERFI7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQlpZih0cC0+Q01EcXVldWUgJiBPQ19SRUFEX0VSUk9SX0xPRykKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQl0cC0+Q01EcXVldWUgXj0gT0NfUkVBRF9FUlJPUl9MT0c7CisJCQkJCQkJCQkJQWRkciA9IGh0b25sKCgoY2hhciAqKSZ0cC0+ZXJyb3Jsb2d0YWJsZSAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7CisJCQkJCQkJCQkJdHAtPnNjYi5QYXJtWzBdID0gTE9XT1JEKEFkZHIpOworCQkJCQkJCQkJCXRwLT5zY2IuUGFybVsxXSA9IEhJV09SRChBZGRyKTsKKwkJCQkJCQkJCQl0cC0+c2NiLkNNRCA9IFJFQURfRVJST1JfTE9HOworCQkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJeworCQkJCQkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNoZWNrRm9yT3V0c3RhbmRpbmdDb21tYW5kOiB1bmtub3duIENvbW1hbmRcbiIpOworCQkJCQkJCQkJCXRwLT5DTURxdWV1ZSA9IDA7CisJCQkJCQkJCQkJcmV0dXJuOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJdHAtPlNjYkluVXNlID0gMTsJLyogU2V0IHNlbWFwaG9yZTogU0NCIGluIHVzZS4gKi8KKworCS8qIEV4ZWN1dGUgU0NCIGFuZCBnZW5lcmF0ZSBJUlEgd2hlbiBkb25lLiAqLworCXRtczM4MHRyX2V4ZWNfc2lmY21kKGRldiwgQ01EX0VYRUNVVEUgfCBDTURfU0NCX1JFUVVFU1QpOworCisJcmV0dXJuOworfQorCisvKgorICogSVJRIGNvbmRpdGlvbnM6IHNpZ25hbCBsb3NzIG9uIHRoZSByaW5nLCB0cmFuc21pdCBvciByZWNlaXZlIG9mIGJlYWNvbgorICogZnJhbWVzIChkaXNhYmxlZCBpZiBiaXQgMSBvZiBPUEVOIG9wdGlvbiBpcyBzZXQpOyByZXBvcnQgZXJyb3IgTUFDCisgKiBmcmFtZSB0cmFuc21pdCAoZGlzYWJsZWQgaWYgYml0IDIgb2YgT1BFTiBvcHRpb24gaXMgc2V0KTsgb3BlbiBvciBzaG9ydAorICogY2lyY3VpdCBmYXVsdCBvbiB0aGUgbG9iZSBpcyBkZXRlY3RlZDsgcmVtb3ZlIE1BQyBmcmFtZSByZWNlaXZlZDsKKyAqIGVycm9yIGNvdW50ZXIgb3ZlcmZsb3cgKDI1NSk7IG9wZW5lZCBhZGFwdGVyIGlzIHRoZSBvbmx5IHN0YXRpb24gaW4gcmluZy4KKyAqIEFmdGVyIHNvbWUgb2YgdGhlIElSUXMgdGhlIGFkYXB0ZXIgaXMgY2xvc2VkIQorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9yaW5nX3N0YXR1c19pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl0cC0+Q3VycmVudFJpbmdTdGF0dXMgPSBiZTE2X3RvX2NwdSgodW5zaWduZWQgc2hvcnQpdHAtPnNzYi5QYXJtWzBdKTsKKworCS8qIEZpcnN0OiBmaWxsIHVwIHN0YXRpc3RpY3MgKi8KKwlpZih0cC0+c3NiLlBhcm1bMF0gJiBTSUdOQUxfTE9TUykKKwl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTaWduYWwgTG9zc1xuIiwgZGV2LT5uYW1lKTsKKwkJdHAtPk1hY1N0YXQubGluZV9lcnJvcnMrKzsKKwl9CisKKwkvKiBBZGFwdGVyIGlzIGNsb3NlZCwgYnV0IGluaXRpYWxpemVkICovCisJaWYodHAtPnNzYi5QYXJtWzBdICYgTE9CRV9XSVJFX0ZBVUxUKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExvYmUgV2lyZSBGYXVsdCwgUmVvcGVuIEFkYXB0ZXJcbiIsIAorCQkJZGV2LT5uYW1lKTsKKwkJdHAtPk1hY1N0YXQubGluZV9lcnJvcnMrKzsKKwl9CisKKwlpZih0cC0+c3NiLlBhcm1bMF0gJiBSSU5HX1JFQ09WRVJZKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogUmluZyBSZWNvdmVyeVxuIiwgZGV2LT5uYW1lKTsKKworCS8qIENvdW50ZXIgb3ZlcmZsb3c6IHJlYWQgZXJyb3IgbG9nICovCisJaWYodHAtPnNzYi5QYXJtWzBdICYgQ09VTlRFUl9PVkVSRkxPVykKKwl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VudGVyIE92ZXJmbG93XG4iLCBkZXYtPm5hbWUpOworCQl0bXMzODB0cl9leGVjX2NtZChkZXYsIE9DX1JFQURfRVJST1JfTE9HKTsKKwl9CisKKwkvKiBBZGFwdGVyIGlzIGNsb3NlZCwgYnV0IGluaXRpYWxpemVkICovCisJaWYodHAtPnNzYi5QYXJtWzBdICYgUkVNT1ZFX1JFQ0VJVkVEKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVtb3ZlIFJlY2VpdmVkLCBSZW9wZW4gQWRhcHRlclxuIiwgCisJCQlkZXYtPm5hbWUpOworCisJLyogQWRhcHRlciBpcyBjbG9zZWQsIGJ1dCBpbml0aWFsaXplZCAqLworCWlmKHRwLT5zc2IuUGFybVswXSAmIEFVVE9fUkVNT1ZBTF9FUlJPUikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEF1dG8gUmVtb3ZhbCBFcnJvciwgUmVvcGVuIEFkYXB0ZXJcbiIsIAorCQkJZGV2LT5uYW1lKTsKKworCWlmKHRwLT5zc2IuUGFybVswXSAmIEhBUkRfRVJST1IpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBIYXJkIEVycm9yXG4iLCBkZXYtPm5hbWUpOworCisJaWYodHAtPnNzYi5QYXJtWzBdICYgU09GVF9FUlJPUikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNvZnQgRXJyb3JcbiIsIGRldi0+bmFtZSk7CisKKwlpZih0cC0+c3NiLlBhcm1bMF0gJiBUUkFOU01JVF9CRUFDT04pCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUcmFuc21pdCBCZWFjb25cbiIsIGRldi0+bmFtZSk7CisKKwlpZih0cC0+c3NiLlBhcm1bMF0gJiBTSU5HTEVfU1RBVElPTikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNpbmdsZSBTdGF0aW9uXG4iLCBkZXYtPm5hbWUpOworCisJLyogQ2hlY2sgaWYgYWRhcHRlciBoYXMgYmVlbiBjbG9zZWQgKi8KKwlpZih0cC0+c3NiLlBhcm1bMF0gJiBBREFQVEVSX0NMT1NFRCkKKwl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBZGFwdGVyIGNsb3NlZCAoUmVvcGVuaW5nKSwiIAorCQkJIkN1cnJlbnRSaW5nU3RhdCAleFxuIiwKKwkJCWRldi0+bmFtZSwgdHAtPkN1cnJlbnRSaW5nU3RhdHVzKTsKKwkJdHAtPkFkYXB0ZXJPcGVuRmxhZyA9IDA7CisJCXRtczM4MHRyX29wZW5fYWRhcHRlcihkZXYpOworCX0KKworCXJldHVybjsKK30KKworLyoKKyAqIElzc3VlZCBpZiBhZGFwdGVyIGhhcyBlbmNvdW50ZXJlZCBhbiB1bnJlY292ZXJhYmxlIGhhcmR3YXJlCisgKiBvciBzb2Z0d2FyZSBlcnJvci4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfY2hrX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0IEFkYXB0ZXJDaGVja0Jsb2NrWzRdOworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXRwLT5BZGFwdGVyT3BlbkZsYWcgPSAwOwkvKiBBZGFwdGVyIGNsb3NlZCBub3cgKi8KKworCS8qIFBhZ2UgbnVtYmVyIG9mIGFkYXB0ZXIgbWVtb3J5ICovCisJU0lGV1JJVEVXKDB4MDAwMSwgU0lGQURYKTsKKwkvKiBBZGRyZXNzIG9mZnNldCAqLworCVNJRldSSVRFVyhDSEVDS0FERFIsIFNJRkFEUik7CisKKwkvKiBSZWFkaW5nIDggYnl0ZSBhZGFwdGVyIGNoZWNrIGJsb2NrLiAqLworCWZvcihpID0gMDsgaSA8IDQ7IGkrKykKKwkJQWRhcHRlckNoZWNrQmxvY2tbaV0gPSBTSUZSRUFEVyhTSUZJTkMpOworCisJaWYodG1zMzgwdHJfZGVidWcgPiAzKQorCXsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBZGFwdGVyQ2hlY2tCbG9jazogIiwgZGV2LT5uYW1lKTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCXByaW50aygiJTA0WCIsIEFkYXB0ZXJDaGVja0Jsb2NrW2ldKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKworCXN3aXRjaChBZGFwdGVyQ2hlY2tCbG9ja1swXSkKKwl7CisJCWNhc2UgRElPX1BBUklUWToKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBESU8gcGFyaXR5IGVycm9yXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBETUFfUkVBRF9BQk9SVDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzIERNQSByZWFkIG9wZXJhdGlvbiBhYm9ydGVkOlxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJc3dpdGNoIChBZGFwdGVyQ2hlY2tCbG9ja1sxXSkKKwkJCXsKKwkJCQljYXNlIDA6CisJCQkJCXByaW50ayhLRVJOX0lORk8gIlRpbWVvdXRcbiIpOworCQkJCQlwcmludGsoS0VSTl9JTkZPICJBZGRyZXNzOiAlMDRYICUwNFhcbiIsCisJCQkJCQlBZGFwdGVyQ2hlY2tCbG9ja1syXSwKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzNdKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDE6CisJCQkJCXByaW50ayhLRVJOX0lORk8gIlBhcml0eSBlcnJvclxuIik7CisJCQkJCXByaW50ayhLRVJOX0lORk8gIkFkZHJlc3M6ICUwNFggJTA0WFxuIiwKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzJdLCAKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzNdKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDI6IAorCQkJCQlwcmludGsoS0VSTl9JTkZPICJCdXMgZXJyb3JcbiIpOworCQkJCQlwcmludGsoS0VSTl9JTkZPICJBZGRyZXNzOiAlMDRYICUwNFhcbiIsCisJCQkJCQlBZGFwdGVyQ2hlY2tCbG9ja1syXSwgCisJCQkJCQlBZGFwdGVyQ2hlY2tCbG9ja1szXSk7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiVW5rbm93biBlcnJvci5cbiIpOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgRE1BX1dSSVRFX0FCT1JUOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERNQSB3cml0ZSBvcGVyYXRpb24gYWJvcnRlZDogXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCQlzd2l0Y2ggKEFkYXB0ZXJDaGVja0Jsb2NrWzFdKQorCQkJeworCQkJCWNhc2UgMDogCisJCQkJCXByaW50ayhLRVJOX0lORk8gIlRpbWVvdXRcbiIpOworCQkJCQlwcmludGsoS0VSTl9JTkZPICJBZGRyZXNzOiAlMDRYICUwNFhcbiIsCisJCQkJCQlBZGFwdGVyQ2hlY2tCbG9ja1syXSwgCisJCQkJCQlBZGFwdGVyQ2hlY2tCbG9ja1szXSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAxOiAKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiUGFyaXR5IGVycm9yXG4iKTsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQWRkcmVzczogJTA0WCAlMDRYXG4iLAorCQkJCQkJQWRhcHRlckNoZWNrQmxvY2tbMl0sIAorCQkJCQkJQWRhcHRlckNoZWNrQmxvY2tbM10pOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMjogCisJCQkJCXByaW50ayhLRVJOX0lORk8gIkJ1cyBlcnJvclxuIik7CisJCQkJCXByaW50ayhLRVJOX0lORk8gIkFkZHJlc3M6ICUwNFggJTA0WFxuIiwKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzJdLCAKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzNdKTsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlwcmludGsoS0VSTl9JTkZPICJVbmtub3duIGVycm9yLlxuIik7CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJTExFR0FMX09QX0NPREU6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSWxsZWdhbCBvcGVyYXRpb24gY29kZSBpbiBmaXJtd2FyZVxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJLyogUGFybVswLTNdOiBhZGFwdGVyIGludGVybmFsIHJlZ2lzdGVyIFIxMy1SMTUgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgUEFSSVRZX0VSUk9SUzoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBZGFwdGVyIGludGVybmFsIGJ1cyBwYXJpdHkgZXJyb3JcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCS8qIFBhcm1bMC0zXTogYWRhcHRlciBpbnRlcm5hbCByZWdpc3RlciBSMTMtUjE1ICovCisJCQlicmVhazsKKworCQljYXNlIFJBTV9EQVRBX0VSUk9SOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJBTSBkYXRhIGVycm9yXG4iLCBkZXYtPm5hbWUpOworCQkJLyogUGFybVswLTFdOiBNU1cvTFNXIGFkZHJlc3Mgb2YgUkFNIGxvY2F0aW9uLiAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBSQU1fUEFSSVRZX0VSUk9SOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJBTSBwYXJpdHkgZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJCQkvKiBQYXJtWzAtMV06IE1TVy9MU1cgYWRkcmVzcyBvZiBSQU0gbG9jYXRpb24uICovCisJCQlicmVhazsKKworCQljYXNlIFJJTkdfVU5ERVJSVU46CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJuYWwgRE1BIHVuZGVycnVuIGRldGVjdGVkXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCQlicmVhazsKKworCQljYXNlIElOVkFMSURfSVJROgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVucmVjb2duaXplZCBpbnRlcnJ1cHQgZGV0ZWN0ZWRcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCS8qIFBhcm1bMC0zXTogYWRhcHRlciBpbnRlcm5hbCByZWdpc3RlciBSMTMtUjE1ICovCisJCQlicmVhazsKKworCQljYXNlIElOVkFMSURfRVJST1JfSVJROgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVucmVjb2duaXplZCBlcnJvciBpbnRlcnJ1cHQgZGV0ZWN0ZWRcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCS8qIFBhcm1bMC0zXTogYWRhcHRlciBpbnRlcm5hbCByZWdpc3RlciBSMTMtUjE1ICovCisJCQlicmVhazsKKworCQljYXNlIElOVkFMSURfWE9QOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVucmVjb2duaXplZCBYT1AgcmVxdWVzdCBkZXRlY3RlZFxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJLyogUGFybVswLTNdOiBhZGFwdGVyIGludGVybmFsIHJlZ2lzdGVyIFIxMy1SMTUgKi8KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5rbm93biBzdGF0dXMiLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJfQorCisJaWYodG1zMzgwdHJfY2hpcHNldF9pbml0KGRldikgPT0gMSkKKwl7CisJCS8qIFJlc3RhcnQgb2YgZmlybXdhcmUgc3VjY2Vzc2Z1bCAqLworCQl0cC0+QWRhcHRlck9wZW5GbGFnID0gMTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBJbnRlcm5hbCBhZGFwdGVyIHBvaW50ZXIgdG8gUkFNIGRhdGEgYXJlIGNvcGllZCBmcm9tIGFkYXB0ZXIgaW50bworICogaG9zdCBzeXN0ZW0uCisgKi8KK3N0YXRpYyBpbnQgdG1zMzgwdHJfcmVhZF9wdHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2hvcnQgYWRhcHRlcnJhbTsKKworCXRtczM4MHRyX3JlYWRfcmFtKGRldiwgKHVuc2lnbmVkIGNoYXIgKikmdHAtPmludHB0cnMuQnVybmVkSW5BZGRyUHRyLAorCQkJQURBUFRFUl9JTlRfUFRSUywgMTYpOworCXRtczM4MHRyX3JlYWRfcmFtKGRldiwgKHVuc2lnbmVkIGNoYXIgKikmYWRhcHRlcnJhbSwKKwkJCWNwdV90b19iZTE2KCh1bnNpZ25lZCBzaG9ydCl0cC0+aW50cHRycy5BZGFwdGVyUkFNUHRyKSwgMik7CisJcmV0dXJuIGJlMTZfdG9fY3B1KGFkYXB0ZXJyYW0pOyAKK30KKworLyoKKyAqIFJlYWRzIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYWRhcHRlciB0byBzeXN0ZW0gbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9yZWFkX3JhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpEYXRhLAorCQkJCXVuc2lnbmVkIHNob3J0IEFkZHJlc3MsIGludCBMZW5ndGgpCit7CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgb2xkX3NpZmFkeCwgb2xkX3NpZmFkciwgSW5Xb3JkOworCisJLyogU2F2ZSB0aGUgY3VycmVudCB2YWx1ZXMgKi8KKwlvbGRfc2lmYWR4ID0gU0lGUkVBRFcoU0lGQURYKTsKKwlvbGRfc2lmYWRyID0gU0lGUkVBRFcoU0lGQURSKTsKKworCS8qIFBhZ2UgbnVtYmVyIG9mIGFkYXB0ZXIgbWVtb3J5ICovCisJU0lGV1JJVEVXKDB4MDAwMSwgU0lGQURYKTsKKwkvKiBBZGRyZXNzIG9mZnNldCBpbiBhZGFwdGVyIFJBTSAqLworICAgICAgICBTSUZXUklURVcoQWRkcmVzcywgU0lGQURSKTsKKworCS8qIENvcHkgbGVuIGJ5dGUgZnJvbSBhZGFwdGVyIG1lbW9yeSB0byBzeXN0ZW0gZGF0YSBhcmVhLiAqLworCWkgPSAwOworCWZvcig7OykKKwl7CisJCUluV29yZCA9IFNJRlJFQURXKFNJRklOQyk7CisKKwkJKihEYXRhICsgaSkgPSBISUJZVEUoSW5Xb3JkKTsJLyogV3JpdGUgZmlyc3QgYnl0ZSAqLworCQlpZigrK2kgPT0gTGVuZ3RoKQkJLyogQWxsIGlzIGRvbmUgYnJlYWsgKi8KKwkJCWJyZWFrOworCisJCSooRGF0YSArIGkpID0gTE9CWVRFKEluV29yZCk7CS8qIFdyaXRlIHNlY29uZCBieXRlICovCisJCWlmICgrK2kgPT0gTGVuZ3RoKQkJLyogQWxsIGlzIGRvbmUgYnJlYWsgKi8KKwkJCWJyZWFrOworCX0KKworCS8qIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWVzICovCisJU0lGV1JJVEVXKG9sZF9zaWZhZHgsIFNJRkFEWCk7CisJU0lGV1JJVEVXKG9sZF9zaWZhZHIsIFNJRkFEUik7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBDYW5jZWwgYWxsIHF1ZXVlZCBwYWNrZXRzIGluIHRoZSB0cmFuc21pc3Npb24gcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX2NhbmNlbF90eF9xdWV1ZShzdHJ1Y3QgbmV0X2xvY2FsKiB0cCkKK3sKKwlUUEwgKnRwbDsKKworCS8qCisJICogTk9URTogVGhlcmUgbXVzdCBub3QgYmUgYW4gYWN0aXZlIFRSQU5TTUlUIGNvbW1hbmQgcGVuZGluZywgd2hlbgorCSAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorCSAqLworCWlmKHRwLT5UcmFuc21pdENvbW1hbmRBY3RpdmUpCisJCXJldHVybjsKKworCWZvcig7OykKKwl7CisJCXRwbCA9IHRwLT5UcGxCdXN5OworCQlpZighdHBsLT5CdXN5RmxhZykKKwkJCWJyZWFrOworCQkvKiAiUmVtb3ZlIiBUUEwgZnJvbSBidXN5IGxpc3QuICovCisJCXRwLT5UcGxCdXN5ID0gdHBsLT5OZXh0VFBMUHRyOworCQl0bXMzODB0cl93cml0ZV90cGxfc3RhdHVzKHRwbCwgMCk7CS8qIENsZWFyIFZBTElEIGJpdCAqLworCQl0cGwtPkJ1c3lGbGFnID0gMDsJCS8qICJmcmVlIiBUUEwgKi8KKworCQlwcmludGsoS0VSTl9JTkZPICJDYW5jZWwgdHggKCUwOGxYaCkuXG4iLCAodW5zaWduZWQgbG9uZyl0cGwpOworCQlpZiAodHBsLT5ETUFCdWZmKQorCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwgdHBsLT5ETUFCdWZmLCB0cGwtPlNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkodHBsLT5Ta2IpOworCX0KKworCXJldHVybjsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGEgdHJhbnNtaXQgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBieSB0aGUKKyAqIGFkYXB0ZXIuIEZvciBhIGNvbW1hbmQgY29tcGxldGUgaW50ZXJydXB0LCBpdCBpcyBjaGVja2VkIGlmIHdlIGhhdmUgdG8KKyAqIGlzc3VlIGEgbmV3IHRyYW5zbWl0IGNvbW1hbmQgb3Igbm90LgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl90eF9zdGF0dXNfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgSGlnaEJ5dGUsIEhpZ2hBYywgTG93QWM7CisJVFBMICp0cGw7CisKKwkvKiBOT1RFOiBBdCB0aGlzIHBvaW50IHRoZSBTU0IgZnJvbSBUUkFOU01JVCBTVEFUVVMgaXMgbm8gbG9uZ2VyCisJICogYXZhaWxhYmxlLCBiZWNhdXNlIHRoZSBDTEVBUiBTU0IgY29tbWFuZCBoYXMgYWxyZWFkeSBiZWVuIGlzc3VlZC4KKwkgKgorCSAqIFByb2Nlc3MgYWxsIGNvbXBsZXRlIHRyYW5zbWlzc2lvbnMuCisJICovCisKKwlmb3IoOzspCisJeworCQl0cGwgPSB0cC0+VHBsQnVzeTsKKwkJaWYoIXRwbC0+QnVzeUZsYWcgfHwgKHRwbC0+U3RhdHVzCisJCQkmIChUWF9WQUxJRCB8IFRYX0ZSQU1FX0NPTVBMRVRFKSkKKwkJCSE9IFRYX0ZSQU1FX0NPTVBMRVRFKQorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8qICJSZW1vdmUiIFRQTCBmcm9tIGJ1c3kgbGlzdC4gKi8KKwkJdHAtPlRwbEJ1c3kgPSB0cGwtPk5leHRUUExQdHIgOworCisJCS8qIENoZWNrIHRoZSB0cmFuc21pdCBzdGF0dXMgZmllbGQgb25seSBmb3IgZGlyZWN0ZWQgZnJhbWVzKi8KKwkJaWYoRElSRUNURURfRlJBTUUodHBsKSAmJiAodHBsLT5TdGF0dXMgJiBUWF9FUlJPUikgPT0gMCkKKwkJeworCQkJSGlnaEJ5dGUgPSBHRVRfVFJBTlNNSVRfU1RBVFVTX0hJR0hfQllURSh0cGwtPlN0YXR1cyk7CisJCQlIaWdoQWMgICA9IEdFVF9GUkFNRV9TVEFUVVNfSElHSF9BQyhIaWdoQnl0ZSk7CisJCQlMb3dBYyAgICA9IEdFVF9GUkFNRV9TVEFUVVNfTE9XX0FDKEhpZ2hCeXRlKTsKKworCQkJaWYoKEhpZ2hBYyAhPSBMb3dBYykgfHwgKEhpZ2hBYyA9PSBBQ19OT1RfUkVDT0dOSVpFRCkpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAoREE9JTA4bFggbm90IHJlY29nbml6ZWQpXG4iLAorCQkJCQlkZXYtPm5hbWUsCisJCQkJCSoodW5zaWduZWQgbG9uZyAqKSZ0cGwtPk1EYXRhWzIrMl0pOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKHRtczM4MHRyX2RlYnVnID4gMykKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBEaXJlY3RlZCBmcmFtZSB0eCdkXG4iLCAKKwkJCQkJCWRldi0+bmFtZSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZighRElSRUNURURfRlJBTUUodHBsKSkKKwkJCXsKKwkJCQlpZih0bXMzODB0cl9kZWJ1ZyA+IDMpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQnJvYWRjYXN0IGZyYW1lIHR4J2RcbiIsCisJCQkJCQlkZXYtPm5hbWUpOworCQkJfQorCQl9CisKKwkJdHAtPk1hY1N0YXQudHhfcGFja2V0cysrOworCQlpZiAodHBsLT5ETUFCdWZmKQorCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwgdHBsLT5ETUFCdWZmLCB0cGwtPlNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9pcnEodHBsLT5Ta2IpOworCQl0cGwtPkJ1c3lGbGFnID0gMDsJLyogImZyZWUiIFRQTCAqLworCX0KKworCWlmKCF0cC0+VHBsRnJlZS0+TmV4dFRQTFB0ci0+QnVzeUZsYWcpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBDYWxsZWQgaWYgYSBmcmFtZSByZWNlaXZlIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgYnkgdGhlIGFkYXB0ZXIuCisgKiBDaGVjayBpZiB0aGUgZnJhbWUgaXMgdmFsaWQgYW5kIGluZGljYXRlIGl0IHRvIHN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfcmN2X3N0YXR1c19pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgY2hhciAqUmVjZWl2ZURhdGFQdHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgTGVuZ3RoLCBMZW5ndGgyOworCVJQTCAqcnBsOworCVJQTCAqU2F2ZUhlYWQ7CisJZG1hX2FkZHJfdCBkbWFidWY7CisKKwkvKiBOT1RFOiBBdCB0aGlzIHBvaW50IHRoZSBTU0IgZnJvbSBSRUNFSVZFIFNUQVRVUyBpcyBubyBsb25nZXIKKwkgKiBhdmFpbGFibGUsIGJlY2F1c2UgdGhlIENMRUFSIFNTQiBjb21tYW5kIGhhcyBhbHJlYWR5IGJlZW4gaXNzdWVkLgorCSAqCisJICogUHJvY2VzcyBhbGwgY29tcGxldGUgcmVjZWl2ZXMuCisJICovCisKKwlmb3IoOzspCisJeworCQlycGwgPSB0cC0+UnBsSGVhZDsKKwkJaWYocnBsLT5TdGF0dXMgJiBSWF9WQUxJRCkKKwkJCWJyZWFrOwkJLyogUlBMIHN0aWxsIGluIHVzZSBieSBhZGFwdGVyICovCisKKwkJLyogRm9yd2FyZCBSUExIZWFkIHBvaW50ZXIgdG8gbmV4dCBsaXN0LiAqLworCQlTYXZlSGVhZCA9IHRwLT5ScGxIZWFkOworCQl0cC0+UnBsSGVhZCA9IHJwbC0+TmV4dFJQTFB0cjsKKworCQkvKiBHZXQgdGhlIGZyYW1lIHNpemUgKEJ5dGUgc3dhcCBmb3IgSW50ZWwpLgorCQkgKiBEbyB0aGlzIGVhcmx5IChzZWUgd29ya2Fyb3VuZCBjb21tZW50IGJlbG93KQorCQkgKi8KKwkJTGVuZ3RoID0gYmUxNl90b19jcHUoKHVuc2lnbmVkIHNob3J0KXJwbC0+RnJhbWVTaXplKTsKKworCQkvKiBDaGVjayBpZiB0aGUgRnJhbWVfU3RhcnQsIEZyYW1lX0VuZCBhbmQKKwkJICogRnJhbWVfQ29tcGxldGUgYml0cyBhcmUgc2V0LgorCQkgKi8KKwkJaWYoKHJwbC0+U3RhdHVzICYgVkFMSURfU0lOR0xFX0JVRkZFUl9GUkFNRSkKKwkJCT09IFZBTElEX1NJTkdMRV9CVUZGRVJfRlJBTUUpCisJCXsKKwkJCVJlY2VpdmVEYXRhUHRyID0gcnBsLT5NRGF0YTsKKworCQkJLyogV29ya2Fyb3VuZCBmb3IgZGVsYXllZCB3cml0ZSBvZiBGcmFtZVNpemUgb24gSVNBCisJCQkgKiAoRnJhbWVTaXplIGlzIGZhbHNlIGJ1dCB2YWxpZC1iaXQgaXMgcmVzZXQpCisJCQkgKiBGcmFtZSBzaXplIGlzIHNldCB0byB6ZXJvIHdoZW4gdGhlIFJQTCBpcyBmcmVlZC4KKwkJCSAqIExlbmd0aDIgaXMgdGhlcmUgYmVjYXVzZSB0aGVyZSBoYXZlIGFsc28gYmVlbgorCQkJICogY2FzZXMgd2hlcmUgdGhlIEZyYW1lU2l6ZSB3YXMgcGFydGlhbGx5IHdyaXR0ZW4KKwkJCSAqLworCQkJTGVuZ3RoMiA9IGJlMTZfdG9fY3B1KCh1bnNpZ25lZCBzaG9ydClycGwtPkZyYW1lU2l6ZSk7CisKKwkJCWlmKExlbmd0aCA9PSAwIHx8IExlbmd0aCAhPSBMZW5ndGgyKQorCQkJeworCQkJCXRwLT5ScGxIZWFkID0gU2F2ZUhlYWQ7CisJCQkJYnJlYWs7CS8qIFJldHVybiB0byB0bXMzODB0cl9pbnRlcnJ1cHQgKi8KKwkJCX0KKwkJCXRtczM4MHRyX3VwZGF0ZV9yY3Zfc3RhdHModHAsUmVjZWl2ZURhdGFQdHIsTGVuZ3RoKTsKKwkJCSAgCisJCQlpZih0bXMzODB0cl9kZWJ1ZyA+IDMpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBQYWNrZXQgTGVuZ3RoICUwNFggKCVkKVxuIiwKKwkJCQkJZGV2LT5uYW1lLCBMZW5ndGgsIExlbmd0aCk7CisJCQkgIAorCQkJLyogSW5kaWNhdGUgdGhlIHJlY2VpdmVkIGZyYW1lIHRvIHN5c3RlbSB0aGUKKwkJCSAqIGFkYXB0ZXIgZG9lcyB0aGUgU291cmNlLVJvdXRpbmcgcGFkZGluZyBmb3IgCisJCQkgKiB1cy4gU2VlOiBPcGVuT3B0aW9ucyBpbiB0bXMzODB0cl9pbml0X29wYigpCisJCQkgKi8KKwkJCXNrYiA9IHJwbC0+U2tiOworCQkJaWYocnBsLT5Ta2JTdGF0ID09IFNLQl9VTkFWQUlMQUJMRSkKKwkJCXsKKwkJCQkvKiBUcnkgYWdhaW4gdG8gYWxsb2NhdGUgc2tiICovCisJCQkJc2tiID0gZGV2X2FsbG9jX3NrYih0cC0+TWF4UGFja2V0U2l6ZSk7CisJCQkJaWYoc2tiID09IE5VTEwpCisJCQkJeworCQkJCQkvKiBVcGRhdGUgU3RhdHMgPz8gKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJc2tiLT5kZXYJPSBkZXY7CisJCQkJCXNrYl9wdXQoc2tiLCB0cC0+TWF4UGFja2V0U2l6ZSk7CisJCQkJCXJwbC0+U2tiU3RhdCAJPSBTS0JfREFUQV9DT1BZOworCQkJCQlSZWNlaXZlRGF0YVB0ciAJPSBycGwtPk1EYXRhOworCQkJCX0KKwkJCX0KKworCQkJaWYoc2tiICYmIChycGwtPlNrYlN0YXQgPT0gU0tCX0RBVEFfQ09QWQorCQkJCXx8IHJwbC0+U2tiU3RhdCA9PSBTS0JfRE1BX0RJUkVDVCkpCisJCQl7CisJCQkJaWYocnBsLT5Ta2JTdGF0ID09IFNLQl9EQVRBX0NPUFkpCisJCQkJCW1lbWNweShza2ItPmRhdGEsIFJlY2VpdmVEYXRhUHRyLCBMZW5ndGgpOworCisJCQkJLyogRGVsaXZlciBmcmFtZSB0byBzeXN0ZW0gKi8KKwkJCQlycGwtPlNrYiA9IE5VTEw7CisJCQkJc2tiX3RyaW0oc2tiLExlbmd0aCk7CisJCQkJc2tiLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJfQorCQl9CisJCWVsc2UJLyogSW52YWxpZCBmcmFtZSAqLworCQl7CisJCQlpZihycGwtPlNrYiAhPSBOVUxMKQorCQkJCWRldl9rZnJlZV9za2JfaXJxKHJwbC0+U2tiKTsKKworCQkJLyogU2tpcCBsaXN0LiAqLworCQkJaWYocnBsLT5TdGF0dXMgJiBSWF9TVEFSVF9GUkFNRSkKKwkJCQkvKiBGcmFtZSBzdGFydCBiaXQgaXMgc2V0IC0+IG92ZXJmbG93LiAqLworCQkJCXRwLT5NYWNTdGF0LnJ4X2Vycm9ycysrOworCQl9CisJCWlmIChycGwtPkRNQUJ1ZmYpCisJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCBycGwtPkRNQUJ1ZmYsIHRwLT5NYXhQYWNrZXRTaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJcnBsLT5ETUFCdWZmID0gMDsKKworCQkvKiBBbGxvY2F0ZSBuZXcgc2tiIGZvciBycGwgKi8KKwkJcnBsLT5Ta2IgPSBkZXZfYWxsb2Nfc2tiKHRwLT5NYXhQYWNrZXRTaXplKTsKKwkJLyogc2tiID09IE5VTEwgPyB0aGVuIHVzZSBsb2NhbCBidWZmZXIgKi8KKwkJaWYocnBsLT5Ta2IgPT0gTlVMTCkKKwkJeworCQkJcnBsLT5Ta2JTdGF0ID0gU0tCX1VOQVZBSUxBQkxFOworCQkJcnBsLT5GcmFnTGlzdFswXS5EYXRhQWRkciA9IGh0b25sKCgoY2hhciAqKXRwLT5Mb2NhbFJ4QnVmZmVyc1tycGwtPlJQTEluZGV4XSAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7CisJCQlycGwtPk1EYXRhID0gdHAtPkxvY2FsUnhCdWZmZXJzW3JwbC0+UlBMSW5kZXhdOworCQl9CisJCWVsc2UJLyogc2tiICE9IE5VTEwgKi8KKwkJeworCQkJcnBsLT5Ta2ItPmRldiA9IGRldjsKKwkJCXNrYl9wdXQocnBsLT5Ta2IsIHRwLT5NYXhQYWNrZXRTaXplKTsKKworCQkJLyogRGF0YSB1bnJlYWNoYWJsZSBmb3IgRE1BID8gdGhlbiB1c2UgbG9jYWwgYnVmZmVyICovCisJCQlkbWFidWYgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgcnBsLT5Ta2ItPmRhdGEsIHRwLT5NYXhQYWNrZXRTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJaWYodHAtPmRtYWxpbWl0ICYmIChkbWFidWYgKyB0cC0+TWF4UGFja2V0U2l6ZSA+IHRwLT5kbWFsaW1pdCkpCisJCQl7CisJCQkJcnBsLT5Ta2JTdGF0ID0gU0tCX0RBVEFfQ09QWTsKKwkJCQlycGwtPkZyYWdMaXN0WzBdLkRhdGFBZGRyID0gaHRvbmwoKChjaGFyICopdHAtPkxvY2FsUnhCdWZmZXJzW3JwbC0+UlBMSW5kZXhdIC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyKTsKKwkJCQlycGwtPk1EYXRhID0gdHAtPkxvY2FsUnhCdWZmZXJzW3JwbC0+UlBMSW5kZXhdOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIERNQSBkaXJlY3RseSBpbiBza2ItPmRhdGEgKi8KKwkJCQlycGwtPlNrYlN0YXQgPSBTS0JfRE1BX0RJUkVDVDsKKwkJCQlycGwtPkZyYWdMaXN0WzBdLkRhdGFBZGRyID0gaHRvbmwoZG1hYnVmKTsKKwkJCQlycGwtPk1EYXRhID0gcnBsLT5Ta2ItPmRhdGE7CisJCQkJcnBsLT5ETUFCdWZmID0gZG1hYnVmOworCQkJfQorCQl9CisKKwkJcnBsLT5GcmFnTGlzdFswXS5EYXRhQ291bnQgPSBjcHVfdG9fYmUxNigodW5zaWduZWQgc2hvcnQpdHAtPk1heFBhY2tldFNpemUpOworCQlycGwtPkZyYW1lU2l6ZSA9IDA7CisKKwkJLyogUGFzcyB0aGUgbGFzdCBSUEwgYmFjayB0byB0aGUgYWRhcHRlciAqLworCQl0cC0+UnBsVGFpbC0+RnJhbWVTaXplID0gMDsKKworCQkvKiBSZXNldCB0aGUgQ1NUQVQgZmllbGQgaW4gdGhlIGxpc3QuICovCisJCXRtczM4MHRyX3dyaXRlX3JwbF9zdGF0dXModHAtPlJwbFRhaWwsIFJYX1ZBTElEIHwgUlhfRlJBTUVfSVJRKTsKKworCQkvKiBDdXJyZW50IFJQTCBiZWNvbWVzIGxhc3Qgb25lIGluIGxpc3QuICovCisJCXRwLT5ScGxUYWlsID0gdHAtPlJwbFRhaWwtPk5leHRSUExQdHI7CisKKwkJLyogSW5mb3JtIGFkYXB0ZXIgYWJvdXQgUlBMIHZhbGlkLiAqLworCQl0bXMzODB0cl9leGVjX3NpZmNtZChkZXYsIENNRF9SWF9WQUxJRCk7CisJfQorCisJcmV0dXJuOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCB3aGVuZXZlciB0aGUgc3RhdHVzIG9mIGFueSBSUEwgbXVzdCBiZQorICogbW9kaWZpZWQgYnkgdGhlIGRyaXZlciwgYmVjYXVzZSB0aGUgY29tcGlsZXIgbWF5IG90aGVyd2lzZSBjaGFuZ2UgdGhlCisgKiBvcmRlciBvZiBpbnN0cnVjdGlvbnMgc3VjaCB0aGF0IHdyaXRpbmcgdGhlIFJQTCBzdGF0dXMgbWF5IGJlIGV4ZWN1dGVkCisgKiBhdCBhbiB1bmRlc2lyZWFibGUgdGltZS4gV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQsIHRoZSBzdGF0dXMgaXMKKyAqIGFsd2F5cyB3cml0dGVuIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfd3JpdGVfcnBsX3N0YXR1cyhSUEwgKnJwbCwgdW5zaWduZWQgaW50IFN0YXR1cykKK3sKKwlycGwtPlN0YXR1cyA9IFN0YXR1czsKKworCXJldHVybjsKK30KKworLyoKKyAqIFRoZSBmdW5jdGlvbiB1cGRhdGVzIHRoZSBzdGF0aXN0aWMgY291bnRlcnMgaW4gbWFjLT5NYWNTdGF0LgorICogSXQgZGlmZmVydGlhdGVzIGJldHdlZW4gZGlyZWN0ZWQgYW5kIGJyb2FkY2FzdC9tdWx0aWNhc3QgKCA9PWZ1bmN0aW9uYWwpCisgKiBmcmFtZXMuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX3VwZGF0ZV9yY3Zfc3RhdHMoc3RydWN0IG5ldF9sb2NhbCAqdHAsIHVuc2lnbmVkIGNoYXIgRGF0YVB0cltdLAorCQkJCQl1bnNpZ25lZCBpbnQgTGVuZ3RoKQoreworCXRwLT5NYWNTdGF0LnJ4X3BhY2tldHMrKzsKKwl0cC0+TWFjU3RhdC5yeF9ieXRlcyArPSBMZW5ndGg7CisJCisJLyogVGVzdCBmdW5jdGlvbmFsIGJpdCAqLworCWlmKERhdGFQdHJbMl0gJiBHUk9VUF9CSVQpCisJCXRwLT5NYWNTdGF0Lm11bHRpY2FzdCsrOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHRtczM4MHRyX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhZGRyID0gYWRkcjsKKwkKKwlpZiAodHAtPkFkYXB0ZXJPcGVuRmxhZyB8fCB0cC0+QWRhcHRlclZpcnRPcGVuRmxhZykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2Fubm90IHNldCBNQUMvTEFBIGFkZHJlc3Mgd2hpbGUgY2FyZCBpcyBvcGVuXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHNhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworI2lmIFRNUzM4MFRSX0RFQlVHID4gMAorLyoKKyAqIER1bXAgUGFja2V0IChkYXRhKQorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9kdW1wKHVuc2lnbmVkIGNoYXIgKkRhdGEsIGludCBsZW5ndGgpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGxlbmd0aCAvIDg7IGkrKywgaiArPSA4KQorCXsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJICAgICAgIERhdGFbaiswXSxEYXRhW2orMV0sRGF0YVtqKzJdLERhdGFbaiszXSwKKwkJICAgICAgIERhdGFbais0XSxEYXRhW2orNV0sRGF0YVtqKzZdLERhdGFbais3XSk7CisJfQorCisJcmV0dXJuOworfQorI2VuZGlmCisKK3ZvaWQgdG1zZGV2X3Rlcm0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cDsKKworCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cC0+ZG1hYnVmZmVyLCBzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCksCisJCVBDSV9ETUFfQklESVJFQ1RJT05BTCk7Cit9CisKK2ludCB0bXNkZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGRtYWxpbWl0LCAKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdG1zX2xvY2FsOworCisJbWVtc2V0KGRldi0+cHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwl0bXNfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRtc19sb2NhbC0+d2FpdF9mb3JfdG9rX2ludCk7CisJdG1zX2xvY2FsLT5kbWFsaW1pdCA9IGRtYWxpbWl0OworCXRtc19sb2NhbC0+cGRldiA9IHBkZXY7CisJdG1zX2xvY2FsLT5kbWFidWZmZXIgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCAodm9pZCAqKXRtc19sb2NhbCwKKwkgICAgc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCWlmICh0bXNfbG9jYWwtPmRtYWJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSA+IGRtYWxpbWl0KQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lbW9yeSBub3QgYWNjZXNzaWJsZSBmb3IgRE1BXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJdG1zZGV2X3Rlcm0oZGV2KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCQorCS8qIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjYXJkIGRyaXZlciBpZiBuZWVkZWQgKi8KKwlkZXYtPm9wZW4JCT0gdG1zMzgwdHJfb3BlbjsKKwlkZXYtPnN0b3AJCT0gdG1zMzgwdHJfY2xvc2U7CisJZGV2LT5kb19pb2N0bAkJPSBOVUxMOyAKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHRtczM4MHRyX3NlbmRfcGFja2V0OworCWRldi0+dHhfdGltZW91dAkJPSB0bXMzODB0cl90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBIWjsKKwlkZXYtPmdldF9zdGF0cwkJPSB0bXMzODB0cl9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmdG1zMzgwdHJfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzCT0gdG1zMzgwdHJfc2V0X21hY19hZGRyZXNzOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKKworRVhQT1JUX1NZTUJPTCh0bXMzODB0cl9vcGVuKTsKK0VYUE9SVF9TWU1CT0wodG1zMzgwdHJfY2xvc2UpOworRVhQT1JUX1NZTUJPTCh0bXMzODB0cl9pbnRlcnJ1cHQpOworRVhQT1JUX1NZTUJPTCh0bXNkZXZfaW5pdCk7CitFWFBPUlRfU1lNQk9MKHRtc2Rldl90ZXJtKTsKK0VYUE9SVF9TWU1CT0wodG1zMzgwdHJfd2FpdCk7CisKK3N0cnVjdCBtb2R1bGUgKlRNUzM4MF9tb2R1bGUgPSBOVUxMOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMiLCB2ZXJzaW9uKTsKKwkKKwlUTVMzODBfbW9kdWxlID0gJl9fdGhpc19tb2R1bGU7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlUTVMzODBfbW9kdWxlID0gTlVMTDsKK30KKyNlbmRpZgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVkVSU0lPTlMgIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgdG1zMzgwdHIuYyIKKyAqICBhbHQtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgdG1zMzgwdHIuYyIKKyAqICBjLXNldC1zdHlsZSAiSyZSIgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3RtczM4MHRyLmggYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvdG1zMzgwdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmM1YmEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3RtczM4MHRyLmgKQEAgLTAsMCArMSwxMTQxIEBACisvKiAKKyAqIHRtczM4MHRyLmg6IFRJIFRNUzM4MCBUb2tlbiBSaW5nIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBBdXRob3JzOgorICogLSBDaHJpc3RvcGggR29vcyA8Y2dvb3NAc3lza29ubmVjdC5kZT4KKyAqIC0gQWRhbSBGcml0emxlciA8bWlkQGF1ay5jeD4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfVE1TMzgwVFJfSAorI2RlZmluZSBfX0xJTlVYX1RNUzM4MFRSX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisvKiBtb2R1bGUgcHJvdG90eXBlcyAqLworaW50IHRtczM4MHRyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgdG1zMzgwdHJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpcnFyZXR1cm5fdCB0bXMzODB0cl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitpbnQgdG1zZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBkbWFsaW1pdCwKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYpOwordm9pZCB0bXNkZXZfdGVybShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgdG1zMzgwdHJfd2FpdCh1bnNpZ25lZCBsb25nIHRpbWUpOworCisjZGVmaW5lIFRNUzM4MFRSX01BWF9BREFQVEVSUyA3CisKKyNkZWZpbmUgU0VORF9USU1FT1VUIDEwKkhaCisKKyNkZWZpbmUgVFJfUkNGX0xPTkdFU1RfRlJBTUVfTUFTSyAweDAwNzAKKyNkZWZpbmUgVFJfUkNGX0ZSQU1FNEsgMHgwMDMwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICBCaXQgb3JkZXIgZm9yIGFkYXB0ZXIgY29tbXVuaWNhdGlvbiB3aXRoIERNQQkJICAgICovCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICovCisvKiAgQml0ICA4IHwgOXwgMTB8IDExfHwgMTJ8IDEzfCAxNHwgMTV8fCAwfCAxfCAyfCAzfHwgNHwgNXwgNnwgN3wgICovCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICovCisvKiAgVGhlIGJ5dGVzIGluIGEgd29yZCBtdXN0IGJlIGJ5dGUgc3dhcHBlZC4gQWxzbywgaWYgYSBkb3VibGUJICAgICovCisvKiAgd29yZCBpcyB1c2VkIGZvciBzdG9yYWdlLCB0aGVuIHRoZSB3b3JkcywgYXMgd2VsbCBhcyB0aGUgYnl0ZXMsICovCisvKiAgbXVzdCBiZSBzd2FwcGVkLiAJCQkJCQkgICAgKi8KKy8qICBCaXQgb3JkZXIgZm9yIGFkYXB0ZXIgY29tbXVuaWNhdGlvbiB3aXRoIERJTyAJCSAgICAqLworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAqLworLyogIEJpdCAgMCB8IDF8IDJ8IDN8fCA0fCA1fCA2fCA3fHwgOHwgOXwgMTB8IDExfHwgMTJ8IDEzfCAxNHwgMTV8ICAqLworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTd2FwIHdvcmRzIG9mIGEgbG9uZy4gICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTV0FQVyh4KSAoKCh4KSA8PCAxNikgfCAoKHgpID4+IDE2KSkKKworLyogR2V0IHRoZSBsb3cgYnl0ZSBvZiBhIHdvcmQuICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExPQllURSh3KSAgICAgICAoKHVuc2lnbmVkIGNoYXIpKHcpKQorCisvKiBHZXQgdGhlIGhpZ2ggYnl0ZSBvZiBhIHdvcmQuICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSElCWVRFKHcpICAgICAgICgodW5zaWduZWQgY2hhcikoKHVuc2lnbmVkIHNob3J0KSh3KSA+PiA4KSkKKworLyogR2V0IHRoZSBsb3cgd29yZCBvZiBhIGxvbmcuICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExPV09SRChsKSAgICAgICAoKHVuc2lnbmVkIHNob3J0KShsKSkKKworLyogR2V0IHRoZSBoaWdoIHdvcmQgb2YgYSBsb25nLiAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhJV09SRChsKSAgICAgICAoKHVuc2lnbmVkIHNob3J0KSgodW5zaWduZWQgbG9uZykobCkgPj4gMTYpKQorCisKKworLyogVG9rZW4gcmluZyBhZGFwdGVyIEkvTyBhZGRyZXNzZXMgZm9yIG5vcm1hbCBtb2RlLiAqLworCisvKgorICogVGhlIFNJRiByZWdpc3RlcnMuICBDb21tb24gdG8gYWxsIGFkYXB0ZXJzLgorICovCisvKiBCYXNpYyBTSUYgKFNSU1ggPSAwKSAqLworI2RlZmluZSBTSUZEQVQgICAgICAJCTB4MDAJLyogU0lGL0RNQSBkYXRhLiAqLworI2RlZmluZSBTSUZJTkMgICAgICAJCTB4MDIgIAkvKiBJTyBXb3JkIGRhdGEgd2l0aCBhdXRvIGluY3JlbWVudC4gKi8KKyNkZWZpbmUgU0lGSU5IICAgICAgCQkweDAzICAJLyogSU8gQnl0ZSBkYXRhIHdpdGggYXV0byBpbmNyZW1lbnQuICovCisjZGVmaW5lIFNJRkFEUiAgICAgIAkJMHgwNCAgCS8qIFNJRi9ETUEgQWRkcmVzcy4gKi8KKyNkZWZpbmUgU0lGQ01EICAgICAgCQkweDA2ICAJLyogU0lGIENvbW1hbmQuICovCisjZGVmaW5lIFNJRlNUUyAgICAgIAkJMHgwNiAgCS8qIFNJRiBTdGF0dXMuICovCisKKy8qICJFeHRlbmRlZCIgU0lGIChTUlNYID0gMSkgKi8KKyNkZWZpbmUgU0lGQUNMICAgICAgCQkweDA4ICAJLyogU0lGIEFkYXB0ZXIgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgU0lGQUREICAgICAgCQkweDBhIAkvKiBTSUYvRE1BIEFkZHJlc3MuIC0tIDB4MGEgKi8KKyNkZWZpbmUgU0lGQURYICAgICAgCQkweDBjICAgICAvKiAweDBjICovCisjZGVmaW5lIERNQUxFTiAgICAgIAkJMHgwZSAJLyogU0lGIERNQSBsZW5ndGguIC0tIDB4MGUgKi8KKworLyoKKyAqIFBPUyBSZWdpc3RlcnMuICBPbmx5IGZvciBJU0EgQWRhcHRlcnMuCisgKi8KKyNkZWZpbmUgUE9TUkVHICAgICAgCQkweDEwIAkvKiBBZGFwdGVyIFByb2dyYW0gT3B0aW9uIFNlbGVjdCAoUE9TKQorCQkJIAkJICogUmVnaXN0ZXI6IGJhc2UgSU8gYWRkcmVzcyArIDE2IGJ5dGUuCisJCQkgCQkgKi8KKyNkZWZpbmUgUE9TUkVHXzIgICAgCQkyNEwgCS8qIG9ubHkgZm9yIFRSNC8xNisgYWRhcHRlcgorCQkJIAkJICogYmFzZSBJTyBhZGRyZXNzICsgMjQgYnl0ZS4gLS0gMHgxOAorCQkJIAkJICovCisKKy8qIFNJRkNNRCBjb21tYW5kIGNvZGVzIChoaWdoLWxvdykgKi8KKyNkZWZpbmUgQ01EX0lOVEVSUlVQVF9BREFQVEVSICAgMHg4MDAwICAvKiBDYXVzZSBpbnRlcm5hbCBhZGFwdGVyIGludGVycnVwdCAqLworI2RlZmluZSBDTURfQURBUFRFUl9SRVNFVCAgIAkweDQwMDAgIC8qIEhhcmR3YXJlIHJlc2V0IG9mIGFkYXB0ZXIgKi8KKyNkZWZpbmUgQ01EX1NTQl9DTEVBUgkJMHgyMDAwICAvKiBBY2tub3dsZWRnZSB0byBhZGFwdGVyIHRvCisJCQkJCSAqIHN5c3RlbSBpbnRlcnJ1cHRzLgorCQkJCQkgKi8KKyNkZWZpbmUgQ01EX0VYRUNVVEUJCTB4MTAwMAkvKiBFeGVjdXRlIFNDQiBjb21tYW5kICovCisjZGVmaW5lIENNRF9TQ0JfUkVRVUVTVAkJMHgwODAwICAvKiBSZXF1ZXN0IGFkYXB0ZXIgdG8gaW50ZXJydXB0CisJCQkJCSAqIHN5c3RlbSB3aGVuIFNDQiBpcyBhdmFpbGFibGUgZm9yCisJCQkJCSAqIGFub3RoZXIgY29tbWFuZC4KKwkJCQkJICovCisjZGVmaW5lIENNRF9SWF9DT05USU5VRQkJMHgwNDAwICAvKiBDb250aW51ZSByZWNlaXZlIGFmdGVyIG9kZCBwb2ludGVyCisJCQkJCSAqIHN0b3AuIChvZGQgcG9pbnRlciByZWNlaXZlIG1ldGhvZCkKKwkJCQkJICovCisjZGVmaW5lIENNRF9SWF9WQUxJRAkJMHgwMjAwICAvKiBOb3cgYWN0dWFsIFJQTCBpcyB2YWxpZC4gKi8KKyNkZWZpbmUgQ01EX1RYX1ZBTElECQkweDAxMDAgIC8qIE5vdyBhY3R1YWwgVFBMIGlzIHZhbGlkLiAodmFsaWQKKwkJCQkJICogYml0IHJlY2VpdmUvdHJhbnNtaXQgbWV0aG9kKQorCQkJCQkgKi8KKyNkZWZpbmUgQ01EX1NZU1RFTV9JUlEJCTB4MDA4MCAgLyogQWRhcHRlci10by1hdHRhY2hlZC1zeXN0ZW0KKwkJCQkJICogaW50ZXJydXB0IGlzIHJlc2V0LgorCQkJCQkgKi8KKyNkZWZpbmUgQ01EX0NMRUFSX1NZU1RFTV9JUlEJMHgwMDgwCS8qIENsZWFyIFNZU1RFTV9JTlRFUlJVUFQgYml0LgorCQkJCQkgKiAod3JpdGU6IDE9aWdub3JlLCAwPXJlc2V0KQorCQkJCQkgKi8KKyNkZWZpbmUgRVhFQ19TT0ZUX1JFU0VUCQkweEZGMDAgIC8qIGFkYXB0ZXIgc29mdCByZXNldC4gKHJlc3RhcnQKKwkJCQkJICogYWRhcHRlciBhZnRlciBoYXJkd2FyZSByZXNldCkKKwkJCQkJICovCisKKworLyogQUNMIGNvbW1hbmRzIChoaWdoLWxvdykgKi8KKyNkZWZpbmUgQUNMX1NXSExEQQkJMHgwODAwICAvKiBTb2Z0d2FyZSBob2xkIGFja25vd2xlZGdlLiAqLworI2RlZmluZSBBQ0xfU1dERElSCQkweDA0MDAgIC8qIERhdGEgdHJhbnNmZXIgZGlyZWN0aW9uLiAqLworI2RlZmluZSBBQ0xfU1dIUlEJCTB4MDIwMCAgLyogUHNldWRvIERNQSBvcGVyYXRpb24uICovCisjZGVmaW5lIEFDTF9QU0RNQUVOCQkweDAxMDAgIC8qIEVuYWJsZSBwc2V1ZG8gc3lzdGVtIERNQS4gKi8KKyNkZWZpbmUgQUNMX0FSRVNFVAkJMHgwMDgwICAvKiBBZGFwdGVyIGhhcmR3YXJlIHJlc2V0IGNvbW1hbmQuCisJCQkJCSAqIChoZWxkIGluIHJlc2V0IGNvbmRpdGlvbiBhcworCQkJCQkgKiBsb25nIGFzIGJpdCBpcyBzZXQpCisJCQkJCSAqLworI2RlZmluZSBBQ0xfQ1BIQUxUCQkweDAwNDAgIC8qIENvbW11bmljYXRpb24gcHJvY2Vzc29yIGhhbHQuCisJCQkJCSAqIChjYW4gb25seSBiZSBzZXQgd2hpbGUgQUNMX0FSRVNFVAorCQkJCQkgKiBiaXQgaXMgc2V0OyBwcmV2ZW50cyBhZGFwdGVyCisJCQkJCSAqIHByb2Nlc3NvciBmcm9tIGV4ZWN1dGluZyBjb2RlIHdoaWxlCisJCQkJCSAqIGRvd25sb2FkaW5nIGZpcm13YXJlKQorCQkJCQkgKi8KKyNkZWZpbmUgQUNMX0JPT1QJCTB4MDAyMAorI2RlZmluZSBBQ0xfU0lOVEVOCQkweDAwMDggIC8qIFN5c3RlbSBpbnRlcnJ1cHQgZW5hYmxlL2Rpc2FibGUKKwkJCQkJICogKDEvMCk6IGNhbiBiZSB3cml0dGVuIGlmIEFDTF9BUkVTRVQKKwkJCQkJICogaXMgemVyby4KKwkJCQkJICovCisjZGVmaW5lIEFDTF9QRU4gICAgICAgICAgICAgICAgIDB4MDAwNAorCisjZGVmaW5lIEFDTF9OU0VMT1VUMCAgICAgICAgICAgIDB4MDAwMiAKKyNkZWZpbmUgQUNMX05TRUxPVVQxICAgICAgICAgICAgMHgwMDAxCS8qIE5TRUxPVVR4IGhhdmUgYSBjYXJkLXNwZWNpZmljCisJCQkJCSAqIG1lYW5pbmcgZm9yIHNldHRpbmcgcmluZyBzcGVlZC4KKwkJCQkJICovCisKKyNkZWZpbmUgUFNfRE1BX01BU0sJCShBQ0xfU1dIUlEgfCBBQ0xfUFNETUFFTikKKworCisvKiBTSUZTVFMgcmVnaXN0ZXIgcmV0dXJuIGNvZGVzIChoaWdoLWxvdykgKi8KKyNkZWZpbmUgU1RTX1NZU1RFTV9JUlEJCTB4MDA4MAkvKiBBZGFwdGVyLXRvLWF0dGFjaGVkLXN5c3RlbQorCQkJCQkgKiBpbnRlcnJ1cHQgaXMgdmFsaWQuCisJCQkJCSAqLworI2RlZmluZSBTVFNfSU5JVElBTElaRQkJMHgwMDQwICAvKiBJTklUSUFMSVpFIHN0YXR1cy4gKHJlYWR5IHRvCisJCQkJCSAqIGluaXRpYWxpemUpCisJCQkJCSAqLworI2RlZmluZSBTVFNfVEVTVAkJMHgwMDIwICAvKiBURVNUIHN0YXR1cy4gKEJVRCBub3QgY29tcGxldGVkKSAqLworI2RlZmluZSBTVFNfRVJST1IJCTB4MDAxMCAgLyogRVJST1Igc3RhdHVzLiAodW5yZWNvdmVyYWJsZQorCQkJCQkgKiBIVyBlcnJvciBvY2N1cnJlZCkKKwkJCQkJICovCisjZGVmaW5lIFNUU19NQVNLCQkweDAwRjAgIC8qIE1hc2sgaW50ZXJlc3Rpbmcgc3RhdHVzIGJpdHMuICovCisjZGVmaW5lIFNUU19FUlJPUl9NQVNLCQkweDAwMEYgIC8qIEdldCBFcnJvciBDb2RlIGJ5IG1hc2tpbmcgdGhlCisJCQkJCSAqIGludGVycnVwdCBjb2RlIGJpdHMuCisJCQkJCSAqLworI2RlZmluZSBBREFQVEVSX0lOVF9QVFJTCTB4MEEwMCAgLyogQWRkcmVzcyBvZmZzZXQgb2YgYWRhcHRlciBpbnRlcm5hbAorCQkJCQkgKiBwb2ludGVycyAwMTowYTAwIChoaWdoLWxvdykgaGF2ZSB0bworCQkJCQkgKiBiZSByZWFkIGFmdGVyIGluaXQgYW5kIGJlZm9yZSBvcGVuLgorCQkJCQkgKi8KKworCisvKiBJbnRlcnJ1cHQgQ29kZXMgKG9ubHkgTUFDIElSUXMpICovCisjZGVmaW5lIFNUU19JUlFfQURBUFRFUl9DSEVDSwkweDAwMDAJLyogdW5yZWNvdmVyYWJsZSBoYXJkd2FyZSBvcgorCQkJCQkgKiBzb2Z0d2FyZSBlcnJvci4KKwkJCQkJICovIAorI2RlZmluZSBTVFNfSVJRX1JJTkdfU1RBVFVTCTB4MDAwNCAgLyogU1NCIGlzIHVwZGF0ZWQgd2l0aCByaW5nIHN0YXR1cy4gKi8KKyNkZWZpbmUgU1RTX0lSUV9MTENfU1RBVFVTCTB4MDAwNQkvKiBOb3QgdXNlZCBpbiBNQUMtb25seSBtaWNyb2NvZGUgKi8KKyNkZWZpbmUgU1RTX0lSUV9TQ0JfQ0xFQVIJMHgwMDA2CS8qIFNDQiBjbGVhciwgZm9sbG93aW5nIGFuCisJCQkJCSAqIFNDQl9SRVFVRVNUIElSUS4KKwkJCQkJICovCisjZGVmaW5lIFNUU19JUlFfVElNRVIJCTB4MDAwNwkvKiBOb3Qgbm9ybWFsbHkgdXNlZCBpbiBNQUMgdWNvZGUgKi8KKyNkZWZpbmUgU1RTX0lSUV9DT01NQU5EX1NUQVRVUwkweDAwMDgJLyogU1NCIGlzIHVwZGF0ZWQgd2l0aCBjb21tYW5kIAorCQkJCQkgKiBzdGF0dXMuCisJCQkJCSAqLyAKKyNkZWZpbmUgU1RTX0lSUV9SRUNFSVZFX1NUQVRVUwkweDAwMEEJLyogU1NCIGlzIHVwZGF0ZWQgd2l0aCByZWNlaXZlCisJCQkJCSAqIHN0YXR1cy4KKwkJCQkJICovCisjZGVmaW5lIFNUU19JUlFfVFJBTlNNSVRfU1RBVFVTCTB4MDAwQwkvKiBTU0IgaXMgdXBkYXRlZCB3aXRoIHRyYW5zbWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhdHVzCisJCQkJCSAqLworI2RlZmluZSBTVFNfSVJRX1JFQ0VJVkVfUEVORElORwkweDAwMEUJLyogTm90IHVzZWQgaW4gTUFDLW9ubHkgbWljcm9jb2RlICovCisjZGVmaW5lIFNUU19JUlFfTUFTSwkJMHgwMDBGCS8qID0gU1RTX0VSUk9SX01BU0suICovCisKKworLyogVFJBTlNNSVRfU1RBVFVTIGNvbXBsZXRpb24gY29kZTogKFNTQi5QYXJtWzBdKSAqLworI2RlZmluZSBDT01NQU5EX0NPTVBMRVRFCTB4MDA4MAkvKiBUUkFOU01JVCBjb21tYW5kIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChhdm9pZCB0aGlzISkgaXNzdWUgYW5vdGhlciB0cmFuc21pdAorCQkJCQkgKiB0byBzZW5kIGFkZGl0aW9uYWwgZnJhbWVzLgorCQkJCQkgKi8KKyNkZWZpbmUgRlJBTUVfQ09NUExFVEUJCTB4MDA0MAkvKiBGcmFtZSBoYXMgYmVlbiB0cmFuc21pdHRlZDsKKwkJCQkJICogSU5URVJSVVBUX0ZSQU1FIGJpdCB3YXMgc2V0IGluIHRoZQorCQkJCQkgKiBDU1RBVCByZXF1ZXN0OyBpbmRpY2F0aW9uIG9mIHBvc3NpYmx5CisJCQkJCSAqIG1vcmUgdGhhbiBvbmUgZnJhbWUgdHJhbnNtaXNzaW9ucyEKKwkJCQkJICogU1NCLlBhcm1bMC0xXTogMzIgYml0IHBvaW50ZXIgdG8KKwkJCQkJICogVFBMIG9mIGxhc3QgZnJhbWUuCisJCQkJCSAqLworI2RlZmluZSBMSVNUX0VSUk9SCQkweDAwMjAJLyogRXJyb3IgaW4gb25lIG9mIHRoZSBUUExzIHRoYXQKKwkJCQkJICogY29tcG9zZSB0aGUgZnJhbWU7IFRSQU5TTUlUCisJCQkJCSAqIHRlcm1pbmF0ZWQ7IFBhcm1bMS0yXTogMzJiaXQgcG9pbnRlcgorCQkJCQkgKiB0byBUUEwgd2hpY2ggc3RhcnRzIHRoZSBlcnJvcgorCQkJCQkgKiBmcmFtZTsgZXJyb3IgZGV0YWlscyBpbiBiaXRzIDgtMTMuCisJCQkJCSAqICgxND8pCisJCQkJCSAqLworI2RlZmluZSBGUkFNRV9TSVpFX0VSUk9SCTB4ODAwMAkvKiBGUkFNRV9TSVpFIGRvZXMgbm90IGVxdWFsIHRoZSBzdW0gb2YKKwkJCQkJICogdGhlIHZhbGlkIERBVEFfQ09VTlQgZmllbGRzOworCQkJCQkgKiBGUkFNRV9TSVpFIGxlc3MgdGhhbiBoZWFkZXIgcGx1cworCQkJCQkgKiBpbmZvcm1hdGlvbiBmaWVsZC4gKDE1IGJ5dGVzICsKKwkJCQkJICogcm91dGluZyBmaWVsZCkgT3IgaWYgRlJBTUVfU0laRQorCQkJCQkgKiB3YXMgc3BlY2lmaWVkIGFzIHplcm8gaW4gb25lIGxpc3QuCisJCQkJCSAqLworI2RlZmluZSBUWF9USFJFU0hPTEQJCTB4NDAwMAkvKiBGUkFNRV9TSVpFIGdyZWF0ZXIgdGhhbiAoQlVGRkVSX1NJWkUKKwkJCQkJICogLSA5KSAqIFRYX0JVRl9NQVguCisJCQkJCSAqLworI2RlZmluZSBPRERfQUREUkVTUwkJMHgyMDAwCS8qIE9kZCBmb3J3YXJkIHBvaW50ZXIgdmFsdWUgaXMKKwkJCQkJICogcmVhZCBvbiBhIGxpc3Qgd2l0aG91dCBFTkRfRlJBTUUKKwkJCQkJICogaW5kaWNhdGlvbi4KKwkJCQkJICovCisjZGVmaW5lIEZSQU1FX0VSUk9SCQkweDEwMDAJLyogU1RBUlRfRlJBTUUgYml0IChub3QpIGFudGljaXBhdGVkLAorCQkJCQkgKiBidXQgKG5vdCkgc2V0LgorCQkJCQkgKi8KKyNkZWZpbmUgQUNDRVNTX1BSSU9SSVRZX0VSUk9SCTB4MDgwMAkvKiBBY2Nlc3MgcHJpb3JpdHkgcmVxdWVzdGVkIGhhcyBub3QKKwkJCQkJICogYmVlbiBhbGxvd2VkLgorCQkJCQkgKi8KKyNkZWZpbmUgVU5FTkFCTEVEX01BQ19GUkFNRQkweDA0MDAJLyogTUFDIGZyYW1lIGhhcyBzb3VyY2UgY2xhc3Mgb2YgemVybworCQkJCQkgKiBvciBNQUMgZnJhbWUgUENGIEFUVE4gZmllbGQgaXMKKwkJCQkJICogZ3JlYXRlciB0aGFuIG9uZS4KKwkJCQkJICovCisjZGVmaW5lIElMTEVHQUxfRlJBTUVfRk9STUFUCTB4MDIwMAkvKiBCaXQgMCBvciBGQyBmaWVsZCB3YXMgc2V0IHRvIG9uZS4gKi8KKworCisvKgorICogU2luY2Ugd2UgbmVlZCB0byBzdXBwb3J0IHNvbWUgZnVuY3Rpb25zIGV2ZW4gaWYgdGhlIGFkYXB0ZXIgaXMgaW4gYQorICogQ0xPU0VEIHN0YXRlLCB3ZSBoYXZlIGEgKHBzZXVkby0pIGNvbW1hbmQgcXVldWUgd2hpY2ggaG9sZHMgY29tbWFuZHMKKyAqIHRoYXQgYXJlIG91dHN0YW5kaWcgdG8gYmUgZXhlY3V0ZWQuCisgKgorICogRWFjaCB0aW1lIGEgY29tbWFuZCBjb21wbGV0ZXMsIGFuIGludGVycnVwdCBvY2N1cnMgYW5kIHRoZSBuZXh0CisgKiBjb21tYW5kIGlzIGV4ZWN1dGVkLiBUaGUgY29tbWFuZCBxdWV1ZSBpcyBhY3R1YWxseSBhIHNpbXBsZSB3b3JkIHdpdGggCisgKiBhIGJpdCBmb3IgZWFjaCBvdXRzdGFuZGlnIGNvbW1hbmQuIFRoZXJlZm9yZSB0aGUgY29tbWFuZHMgd2lsbCBub3QgYmUKKyAqIGV4ZWN1dGVkIGluIHRoZSBvcmRlciB0aGV5IGhhdmUgYmVlbiBxdWV1ZWQuCisgKgorICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHRoZSBjb21tYW5kIGNvZGUgYml0cyBhbmQgdGhlIGNvbW1hbmQgcXVldWU6CisgKi8KKyNkZWZpbmUgT0NfT1BFTgkJCTB4MDAwMQkvKiBPUEVOIGNvbW1hbmQgKi8KKyNkZWZpbmUgT0NfVFJBTlNNSVQJCTB4MDAwMgkvKiBUUkFOU01JVCBjb21tYW5kICovCisjZGVmaW5lIE9DX1RSQU5TTUlUX0hBTFQJMHgwMDA0CS8qIFRSQU5TTUlUX0hBTFQgY29tbWFuZCAqLworI2RlZmluZSBPQ19SRUNFSVZFCQkweDAwMDgJLyogUkVDRUlWRSBjb21tYW5kICovCisjZGVmaW5lIE9DX0NMT1NFCQkweDAwMTAJLyogQ0xPU0UgY29tbWFuZCAqLworI2RlZmluZSBPQ19TRVRfR1JPVVBfQUREUgkweDAwMjAJLyogU0VUX0dST1VQX0FERFIgY29tbWFuZCAqLworI2RlZmluZSBPQ19TRVRfRlVOQ1RfQUREUgkweDAwNDAJLyogU0VUX0ZVTkNUX0FERFIgY29tbWFuZCAqLworI2RlZmluZSBPQ19SRUFEX0VSUk9SX0xPRwkweDAwODAJLyogUkVBRF9FUlJPUl9MT0cgY29tbWFuZCAqLworI2RlZmluZSBPQ19SRUFEX0FEQVBURVIJCTB4MDEwMAkvKiBSRUFEX0FEQVBURVIgY29tbWFuZCAqLworI2RlZmluZSBPQ19NT0RJRllfT1BFTl9QQVJNUwkweDA0MDAJLyogTU9ESUZZX09QRU5fUEFSTVMgY29tbWFuZCAqLworI2RlZmluZSBPQ19SRVNUT1JFX09QRU5fUEFSTVMJMHgwODAwCS8qIFJFU1RPUkVfT1BFTl9QQVJNUyBjb21tYW5kICovCisjZGVmaW5lIE9DX1NFVF9GSVJTVF8xNl9HUk9VUAkweDEwMDAJLyogU0VUX0ZJUlNUXzE2X0dST1VQIGNvbW1hbmQgKi8KKyNkZWZpbmUgT0NfU0VUX0JSSURHRV9QQVJNUwkweDIwMDAJLyogU0VUX0JSSURHRV9QQVJNUyBjb21tYW5kICovCisjZGVmaW5lIE9DX0NPTkZJR19CUklER0VfUEFSTVMJMHg0MDAwCS8qIENPTkZJR19CUklER0VfUEFSTVMgY29tbWFuZCAqLworCisjZGVmaW5lIE9QRU4JCQkweDAzMDAJLyogQzogb3BlbiBjb21tYW5kLiBTOiBjb21wbGV0aW9uLiAqLworI2RlZmluZSBUUkFOU01JVAkJMHgwNDAwCS8qIEM6IHRyYW5zbWl0IGNvbW1hbmQuIFM6IGNvbXBsZXRpb24KKwkJCQkJICogc3RhdHVzLiAocmVqZWN0OiBDT01NQU5EX1JFSkVDVCBpZgorCQkJCQkgKiBhZGFwdGVyIG5vdCBvcGVuZWQsIFRSQU5TTUlUIGFscmVhZHkKKwkJCQkJICogaXNzdWVkIG9yIGFkZHJlc3MgcGFzc2VkIGluIHRoZSBTQ0IKKwkJCQkJICogbm90IHdvcmQgYWxpZ25lZCkKKwkJCQkJICovCisjZGVmaW5lIFRSQU5TTUlUX0hBTFQJCTB4MDUwMAkvKiBDOiBpbnRlcnJ1cHQgVFggVFBMIGNoYWluOyBpZiBubworCQkJCQkgKiBUUkFOU01JVCBjb21tYW5kIGlzc3VlZCwgdGhlIGNvbW1hbmQKKwkJCQkJICogaXMgaWdub3JlZCAoY29tcGxldGlvbiB3aXRoIFRSQU5TTUlUCisJCQkJCSAqIHN0YXR1cyAoMHgwNDAwKSEpCisJCQkJCSAqLworI2RlZmluZSBSRUNFSVZFCQkJMHgwNjAwCS8qIEM6IHJlY2VpdmUgY29tbWFuZC4gUzogY29tcGxldGlvbgorCQkJCQkgKiBzdGF0dXMuIChyZWplY3Q6IENPTU1BTkRfUkVKRUNUIGlmCisJCQkJCSAqIGFkYXB0ZXIgbm90IG9wZW5lZCwgUkVDRUlWRSBhbHJlYWR5CisJCQkJCSAqIGlzc3VlZCBvciBhZGRyZXNzIHBhc3NlZCBpbiB0aGUgU0NCIAorCQkJCQkgKiBub3Qgd29yZCBhbGlnbmVkKQorCQkJCQkgKi8KKyNkZWZpbmUgQ0xPU0UJCQkweDA3MDAJLyogQzogY2xvc2UgYWRhcHRlci4gUzogY29tcGxldGlvbi4KKwkJCQkJICogKENPTU1BTkRfUkVKRUNUIGlmIGFkYXB0ZXIgbm90IG9wZW4pCisJCQkJCSAqLworI2RlZmluZSBTRVRfR1JPVVBfQUREUgkJMHgwODAwCS8qIEM6IGFsdGVyIGFkYXB0ZXIgZ3JvdXAgYWRkcmVzcyBhZnRlcgorCQkJCQkgKiBPUEVOLiBTOiBjb21wbGV0aW9uLiAoQ09NTUFORF9SRUpFQ1QKKwkJCQkJICogaWYgYWRhcHRlciBub3Qgb3BlbikKKwkJCQkJICovCisjZGVmaW5lIFNFVF9GVU5DVF9BRERSCQkweDA5MDAJLyogQzogYWx0ZXIgYWRhcHRlciBmdW5jdGlvbmFsIGFkZHJlc3MKKwkJCQkJICogYWZ0ZXIgT1BFTi4gUzogY29tcGxldGlvbi4KKwkJCQkJICogKENPTU1BTkRfUkVKRUNUIGlmIGFkYXB0ZXIgbm90IG9wZW4pCisJCQkJCSAqLworI2RlZmluZSBSRUFEX0VSUk9SX0xPRwkJMHgwQTAwCS8qIEM6IHJlYWQgYWRhcHRlciBlcnJvciBjb3VudGVycy4KKwkJCQkJICogUzogY29tcGxldGlvbi4gKGNvbW1hbmQgaWdub3JlZAorCQkJCQkgKiBpZiBhZGFwdGVyIG5vdCBvcGVuISkKKwkJCQkJICovCisjZGVmaW5lIFJFQURfQURBUFRFUgkJMHgwQjAwCS8qIEM6IHJlYWQgZGF0YSBmcm9tIGFkYXB0ZXIgbWVtb3J5LgorCQkJCQkgKiAoaW1wb3J0YW50OiBhZnRlciBpbml0IGFuZCBiZWZvcmUKKwkJCQkJICogb3BlbiEpIFM6IGNvbXBsZXRpb24uIChBREFQVEVSX0NIRUNLCisJCQkJCSAqIGludGVycnVwdCBpZiB1bmRlZmluZWQgc3RvcmFnZSBhcmVhCisJCQkJCSAqIHJlYWQpCisJCQkJCSAqLworI2RlZmluZSBNT0RJRllfT1BFTl9QQVJNUwkweDBEMDAJLyogQzogbW9kaWZ5IHNvbWUgYWRhcHRlciBvcGVyYXRpb25hbAorCQkJCQkgKiBwYXJhbWV0ZXJzLiAoYml0IGNvcnJlc3BvbmRlbmQgdG8KKwkJCQkJICogV1JBUF9JTlRFUkZBQ0UgaXMgaWdub3JlZCkKKwkJCQkJICogUzogY29tcGxldGlvbi4gKHJlamVjdDogCisJCQkJCSAqIENPTU1BTkRfUkVKRUNUKQorCQkJCQkgKi8KKyNkZWZpbmUgUkVTVE9SRV9PUEVOX1BBUk1TCTB4MEUwMAkvKiBDOiBtb2RpZnkgc29tZSBhZGFwdGVyIG9wZXJhdGlvbmFsCisJCQkJCSAqIHBhcmFtZXRlcnMuIChiaXQgY29ycmVzcG9uZGVuZAorCQkJCQkgKiB0byBXUkFQX0lOVEVSRkFDRSBpcyBpZ25vcmVkKQorCQkJCQkgKiBTOiBjb21wbGV0aW9uLiAocmVqZWN0OgorCQkJCQkgKiBDT01NQU5EX1JFSkVDVCkKKwkJCQkJICovCisjZGVmaW5lIFNFVF9GSVJTVF8xNl9HUk9VUAkweDBGMDAJLyogQzogYWx0ZXIgdGhlIGZpcnN0IHR3byBieXRlcyBpbgorCQkJCQkgKiBhZGFwdGVyIGdyb3VwIGFkZHJlc3MuCisJCQkJCSAqIFM6IGNvbXBsZXRpb24uIChyZWplY3Q6CisJCQkJCSAqIENPTU1BTkRfUkVKRUNUKQorCQkJCQkgKi8KKyNkZWZpbmUgU0VUX0JSSURHRV9QQVJNUwkweDEwMDAJLyogQzogdmFsdWVzIGFuZCBjb25kaXRpb25zIGZvciB0aGUKKwkJCQkJICogYWRhcHRlciBoYXJkd2FyZSB0byB1c2Ugd2hlbiBmcmFtZXMKKwkJCQkJICogYXJlIGNvcGllZCBmb3IgZm9yd2FyZGluZy4KKwkJCQkJICogUzogY29tcGxldGlvbi4gKHJlamVjdDoKKwkJCQkJICogQ09NTUFORF9SRUpFQ1QpCisJCQkJCSAqLworI2RlZmluZSBDT05GSUdfQlJJREdFX1BBUk1TCTB4MTEwMAkvKiBDOiAuLgorCQkJCQkgKiBTOiBjb21wbGV0aW9uLiAocmVqZWN0OgorCQkJCQkgKiBDT01NQU5EX1JFSkVDVCkKKwkJCQkJICovCisKKyNkZWZpbmUgU1BFRURfNAkJCTQKKyNkZWZpbmUgU1BFRURfMTYJCTE2CS8qIERlZmF1bHQgdHJhbnNtaXNzaW9uIHNwZWVkICAqLworCisKKy8qIEluaXRpYWxpemF0aW9uIFBhcmFtZXRlciBCbG9jayAoSVBCKTsgd29yZCBhbGlnbm1lbnQgbmVjZXNzYXJ5ISAqLworI2RlZmluZSBCVVJTVF9TSVpFCTB4MDAxOAkvKiBEZWZhdWx0IGJ1cnN0IHNpemUgKi8KKyNkZWZpbmUgQlVSU1RfTU9ERQkweDlGMDAJLyogQnVyc3QgbW9kZSBlbmFibGUgKi8KKyNkZWZpbmUgRE1BX1JFVFJJRVMJMHgwNTA1CS8qIE1hZ2ljIERNQSByZXRyeSBudW1iZXIuLi4gKi8KKworI2RlZmluZSBDWUNMRV9USU1FCTMJLyogRGVmYXVsdCBBVC1idXMgY3ljbGUgdGltZTogNTAwIG5zCisJCQkJICogKGxhdGVyIGFkYXB0ZXIgdmVyc2lvbjogZml4ICBjeWNsZSB0aW1lISkKKwkJCQkgKi8KKyNkZWZpbmUgTElORV9TUEVFRF9CSVQJMHg4MAorCisvKiBNYWNybyBkZWZpbml0aW9uIGZvciB0aGUgd2FpdCBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgT05FX1NFQ09ORF9USUNLUwkxMDAwMDAwCisjZGVmaW5lIEhBTEZfU0VDT05ECQkoT05FX1NFQ09ORF9USUNLUyAvIDIpCisjZGVmaW5lIE9ORV9TRUNPTkQJCShPTkVfU0VDT05EX1RJQ0tTKQorI2RlZmluZSBUV09fU0VDT05EUwkJKE9ORV9TRUNPTkRfVElDS1MgKiAyKQorI2RlZmluZSBUSFJFRV9TRUNPTkRTCQkoT05FX1NFQ09ORF9USUNLUyAqIDMpCisjZGVmaW5lIEZPVVJfU0VDT05EUwkJKE9ORV9TRUNPTkRfVElDS1MgKiA0KQorI2RlZmluZSBGSVZFX1NFQ09ORFMJCShPTkVfU0VDT05EX1RJQ0tTICogNSkKKworI2RlZmluZSBCVUZGRVJfU0laRSAJCTIwNDgJLyogQnVmZmVycyBvbiBBZGFwdGVyICovCisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IEluaXRfT3B0aW9uczsJLyogSW5pdGlhbGl6ZSB3aXRoIGJ1cnN0IG1vZGU7CisJCQkJCSAqIExMQyBkaXNhYmxlZC4gKE1BQyBvbmx5KQorCQkJCQkgKi8KKworCS8qIEludGVycnVwdCB2ZWN0b3JzIHRoZSBhZGFwdGVyIHBsYWNlcyBvbiBhdHRhY2hlZCBzeXN0ZW0gYnVzLiAqLworCXVfaW50OF90ICBDTURfU3RhdHVzX0lWOyAgICAvKiBJbnRlcnJ1cHQgdmVjdG9yOiBjb21tYW5kIHN0YXR1cy4gKi8KKwl1X2ludDhfdCAgVFhfSVY7CSAgICAvKiBJbnRlcnJ1cHQgdmVjdG9yOiB0cmFuc21pdC4gKi8KKwl1X2ludDhfdCAgUlhfSVY7CSAgICAvKiBJbnRlcnJ1cHQgdmVjdG9yOiByZWNlaXZlLiAqLworCXVfaW50OF90ICBSaW5nX1N0YXR1c19JVjsgICAvKiBJbnRlcnJ1cHQgdmVjdG9yOiByaW5nIHN0YXR1cy4gKi8KKwl1X2ludDhfdCAgU0NCX0NsZWFyX0lWOwkgICAgLyogSW50ZXJydXB0IHZlY3RvcjogU0NCIGNsZWFyLiAqLworCXVfaW50OF90ICBBZGFwdGVyX0NIS19JVjsgICAvKiBJbnRlcnJ1cHQgdmVjdG9yOiBhZGFwdGVyIGNoZWNrLiAqLworCisJdV9pbnQxNl90IFJYX0J1cnN0X1NpemU7ICAgIC8qIE1heC4gbnVtYmVyIG9mIHRyYW5zZmVyIGN5Y2xlcy4gKi8KKwl1X2ludDE2X3QgVFhfQnVyc3RfU2l6ZTsgICAgLyogRHVyaW5nIERNQSBidXJzdDsgZXZlbiB2YWx1ZSEgKi8KKwl1X2ludDE2X3QgRE1BX0Fib3J0X1RocmhsZDsgLyogTnVtYmVyIG9mIERNQSByZXRyaWVzLiAqLworCisJdV9pbnQzMl90IFNDQl9BZGRyOyAgIC8qIFNDQiBhZGRyZXNzOiBldmVuLCB3b3JkIGFsaWduZWQsIGhpZ2gtbG93ICovCisJdV9pbnQzMl90IFNTQl9BZGRyOyAgIC8qIFNTQiBhZGRyZXNzOiBldmVuLCB3b3JkIGFsaWduZWQsIGhpZ2gtbG93ICovCit9IElQQiwgKklQQl9QdHI7CisjcHJhZ21hIHBhY2soKQorCisvKgorICogT1BFTiBDb21tYW5kIFBhcmFtZXRlciBMaXN0IChPQ1BMKSAoY2FuIGJlIHJldXNlZCwgaWYgdGhlIGFkYXB0ZXIgaGFzIHRvCisgKiBiZSByZW9wZW5lZCkKKyAqLworI2RlZmluZSBCVUZGRVJfU0laRQkyMDQ4CQkvKiBCdWZmZXJzIG9uIEFkYXB0ZXIuICovCisjZGVmaW5lIFRQTF9TSVpFCTgrNipUWF9GUkFHX05VTSAvKiBEZXBlbmRpbmcgb24gZnJhZ21lbnRzIHBlciBUUEwuICovCisjZGVmaW5lIFJQTF9TSVpFCTE0CQkvKiAod2l0aCBUSSBmaXJtd2FyZSB2Mi4yNiBoYW5kbGluZworCQkJCQkgKiB1cCB0byBuaW5lIGZyYWdtZW50cyBwb3NzaWJsZSkKKwkJCQkJICovCisjZGVmaW5lIFRYX0JVRl9NSU4JMjAJCS8qID8/PyAoU3RlcGhhbjogY2FsY3VsYXRpb24gd2l0aCAqLworI2RlZmluZSBUWF9CVUZfTUFYCTQwCQkvKiBCVUZGRVJfU0laRSBhbmQgTUFYX0ZSQU1FX1NJWkUpID8/PyAKKwkJCQkJICovCisjZGVmaW5lIERJU0FCTEVfRUFSTFlfVE9LRU5fUkVMRUFTRSAJMHgxMDAwCisKKy8qIE9QRU4gT3B0aW9ucyAoaGlnaC1sb3cpICovCisjZGVmaW5lIFdSQVBfSU5URVJGQUNFCQkweDAwODAJLyogSW5zZXJ0aW5nIG9taXR0ZWQgZm9yIHRlc3QKKwkJCQkJICogcHVycG9zZXM7IHRyYW5zbWl0IGRhdGEgYXBwZWFycworCQkJCQkgKiBhcyByZWNlaXZlIGRhdGEuICh1c2VmdWwgZm9yCisJCQkJCSAqIHRlc3Rpbmc7IGNoYW5nZTogQ0xPU0UgbmVjZXNzYXJ5KQorCQkJCQkgKi8KKyNkZWZpbmUgRElTQUJMRV9IQVJEX0VSUk9SCTB4MDA0MAkvKiBPbiBIQVJEX0VSUk9SICYgVFJBTlNNSVRfQkVBQ09OCisJCQkJCSAqIG5vIFJJTkcuU1RBVFVTIGludGVycnVwdC4KKwkJCQkJICovCisjZGVmaW5lIERJU0FCTEVfU09GVF9FUlJPUgkweDAwMjAJLyogT24gU09GVF9FUlJPUiwgbm8gUklORy5TVEFUVVMKKwkJCQkJICogaW50ZXJydXB0LgorCQkJCQkgKi8KKyNkZWZpbmUgUEFTU19BREFQVEVSX01BQ19GUkFNRVMJMHgwMDEwCS8qIFBhc3NpbmcgdW5zdXBwb3J0ZWQgTUFDIGZyYW1lcworCQkJCQkgKiB0byBzeXN0ZW0uCisJCQkJCSAqLworI2RlZmluZSBQQVNTX0FUVEVOVElPTl9GUkFNRVMJMHgwMDA4CS8qIEFsbCBjaGFuZ2VkIGF0dGVudGlvbiBNQUMgZnJhbWVzIGFyZQorCQkJCQkgKiBwYXNzZWQgdG8gdGhlIHN5c3RlbS4KKwkJCQkJICovCisjZGVmaW5lIFBBRF9ST1VUSU5HX0ZJRUxECTB4MDAwNAkvKiBSb3V0aW5nIGZpZWxkIGlzIHBhZGRlZCB0byAxOAorCQkJCQkgKiBieXRlcy4KKwkJCQkJICovCisjZGVmaW5lIEZSQU1FX0hPTEQJCTB4MDAwMgkvKkFkYXB0ZXIgd2FpdHMgZm9yIGVudGlyZSBmcmFtZSBiZWZvcmUKKwkJCQkJICogaW5pdGlhdGluZyBETUEgdHJhbnNmZXI7IG90aGVyd2lzZToKKwkJCQkJICogRE1BIHRyYW5zZmVyIGluaXRpYXRpb24gaWYgaW50ZXJuYWwKKwkJCQkJICogYnVmZmVyIGZpbGxlZC4KKwkJCQkJICovCisjZGVmaW5lIENPTlRFTkRFUgkJMHgwMDAxCS8qIEFkYXB0ZXIgcGFydGljaXBhdGVzIGluIHRoZSBtb25pdG9yCisJCQkJCSAqIGNvbnRlbnRpb24gcHJvY2Vzcy4KKwkJCQkJICovCisjZGVmaW5lIFBBU1NfQkVBQ09OX01BQ19GUkFNRVMJMHg4MDAwCS8qIEFkYXB0ZXIgcGFzc2VzIGJlYWNvbiBNQUMgZnJhbWVzCisJCQkJCSAqIHRvIHRoZSBzeXN0ZW0uCisJCQkJCSAqLworI2RlZmluZSBFQVJMWV9UT0tFTl9SRUxFQVNFIAkweDEwMDAJLyogT25seSB2YWxpZCBpbiAxNiBNYnBzIG9wZXJhdGlvbjsKKwkJCQkJICogMCA9IEVUUi4gKG5vIGVmZmVjdCBpbiA0IE1icHMKKwkJCQkJICogb3BlcmF0aW9uKQorCQkJCQkgKi8KKyNkZWZpbmUgQ09QWV9BTExfTUFDX0ZSQU1FUwkweDA0MDAJLyogQWxsIE1BQyBmcmFtZXMgYXJlIGNvcGllZCB0bworCQkJCQkgKiB0aGUgc3lzdGVtLiAoYWZ0ZXIgT1BFTjogZHVwbGljYXRlCisJCQkJCSAqIGFkZHJlc3MgdGVzdCAoREFUKSBNQUMgZnJhbWUgaXMgCisJCQkJCSAqIGZpcnN0IHJlY2VpdmVkIGZyYW1lIGNvcGllZCB0byB0aGUKKwkJCQkJICogc3lzdGVtKQorCQkJCQkgKi8KKyNkZWZpbmUgQ09QWV9BTExfTk9OX01BQ19GUkFNRVMJMHgwMjAwCS8qIEFsbCBub24gTUFDIGZyYW1lcyBhcmUgY29waWVkIHRvCisJCQkJCSAqIHRoZSBzeXN0ZW0uCisJCQkJCSAqLworI2RlZmluZSBQQVNTX0ZJUlNUX0JVRl9PTkxZCTB4MDEwMAkvKiBQYXNzZXMgb25seSBmaXJzdCBpbnRlcm5hbCBidWZmZXIKKwkJCQkJICogb2YgZWFjaCByZWNlaXZlZCBmcmFtZTsgRnJhbWVTaXplCisJCQkJCSAqIG9mIFJQTHMgbXVzdCBjb250YWluIGludGVybmFsCisJCQkJCSAqIEJVRkZFUl9TSVpFIGJpdHMgZm9yIHByb21pc2NvdXMgbW9kZS4KKwkJCQkJICovCisjZGVmaW5lIEVOQUJMRV9GVUxMX0RVUExFWF9TRUxFQ1RJT04JMHgyMDAwIAorIAkJCQkJLyogRW5hYmxlIHRoZSB1c2Ugb2YgZnVsbC1kdXBsZXgKKwkJCQkJICogc2V0dGluZ3Mgd2l0aCBiaXRzIGluIGJ5dGUgMjIgaW4KKwkJCQkJICogb2NwbC4gKG5ldyBmZWF0dXJlIGluIGZpcm13YXJlCisJCQkJCSAqIHZlcnNpb24gMy4wOSkKKwkJCQkJICovCisKKy8qIEZ1bGwtZHVwbGV4IHNldHRpbmdzICovCisjZGVmaW5lIE9QRU5fRlVMTF9EVVBMRVhfT0ZGCTB4MDAwMAorI2RlZmluZSBPUEVOX0ZVTExfRFVQTEVYX09OCTB4MDBjMAorI2RlZmluZSBPUEVOX0ZVTExfRFVQTEVYX0FVVE8JMHgwMDgwCisKKyNkZWZpbmUgUFJPRF9JRF9TSVpFCTE4CS8qIExlbmd0aCBvZiBwcm9kdWN0IElELiAqLworCisjZGVmaW5lIFRYX0ZSQUdfTlVNCTMJIC8qIE51bWJlciBvZiBmcmFnbWVudHMgdXNlZCBpbiBvbmUgVFBMLiAqLworI2RlZmluZSBUWF9NT1JFX0ZSQUdNRU5UUyAweDgwMDAgLyogQml0IHNldCBpbiBEYXRhQ291bnQgdG8gaW5kaWNhdGUgbW9yZQorCQkJCSAgKiBmcmFnbWVudHMgZm9sbG93aW5nLgorCQkJCSAgKi8KKworLyogWFhYIGlzIHRoZXJlIHNvbWUgYmV0dGVyIHdheSB0byBkbyB0aGlzPyAqLworI2RlZmluZSBJU0FfTUFYX0FERFJFU1MgCTB4MDBmZmZmZmYKKyNkZWZpbmUgUENJX01BWF9BRERSRVNTCQkweGZmZmZmZmZmCisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgeworCXVfaW50MTZfdCBPUEVOT3B0aW9uczsKKwl1X2ludDhfdCAgTm9kZUFkZHJbNl07CS8qIEFkYXB0ZXIgbm9kZSBhZGRyZXNzOyB1c2UgUk9NIAorCQkJCSAqIGFkZHJlc3MKKwkJCQkgKi8KKwl1X2ludDMyX3QgR3JvdXBBZGRyOwkvKiBNdWx0aWNhc3Q6IGhpZ2ggb3JkZXIKKwkJCQkgKiBieXRlcyA9IDB4QzAwMAorCQkJCSAqLworCXVfaW50MzJfdCBGdW5jdEFkZHI7CS8qIEhpZ2ggb3JkZXIgYnl0ZXMgPSAweEMwMDAgKi8KKwl1X2ludDE2X3QgUnhMaXN0U2l6ZTsJLyogUlBMIHNpemU6IDAgKD0yNiksIDE0LCAyMCBvcgorCQkJCSAqIDI2IGJ5dGVzIHJlYWQgYnkgdGhlIGFkYXB0ZXIuCisJCQkJICogKERlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIAorCQkJCSAqIGZyYWdtZW50cy9saXN0KQorCQkJCSAqLworCXVfaW50MTZfdCBUeExpc3RTaXplOwkvKiBUUEwgc2l6ZSAqLworCXVfaW50MTZfdCBCdWZTaXplOwkvKiBJcyBhdXRvbWF0aWNhbGx5IHJvdW5kZWQgdXAgdG8gdGhlCisJCQkJICogbmVhcmVzdCBuSyBib3VuZGFyeS4KKwkJCQkgKi8KKwl1X2ludDE2X3QgRnVsbER1cGxleDsKKwl1X2ludDE2X3QgUmVzZXJ2ZWQ7CisJdV9pbnQ4X3QgIFRYQnVmTWluOwkvKiBOdW1iZXIgb2YgYWRhcHRlciBidWZmZXJzIHJlc2VydmVkCisJCQkJICogZm9yIHRyYW5zbWlzc2lvbiBhIG1pbmltdW0gb2YgMgorCQkJCSAqIGJ1ZmZlcnMgbXVzdCBiZSBhbGxvY2F0ZWQuCisJCQkJICovCisJdV9pbnQ4X3QgIFRYQnVmTWF4OwkvKiBNYXhpbXVtIG51bWJlciBvZiBhZGFwdGVyIGJ1ZmZlcnMKKwkJCQkgKiBmb3IgdHJhbnNtaXQ7IGEgbWluaW11bSBvZiAyIGJ1ZmZlcnMKKwkJCQkgKiBtdXN0IGJlIGF2YWlsYWJsZSBmb3IgcmVjZWl2ZS4KKwkJCQkgKiBEZWZhdWx0OiA2CisJCQkJICovCisJdV9pbnQxNl90IFByb2RJREFkZHJbMl07LyogUG9pbnRlciB0byBwcm9kdWN0IElELiAqLworfSBPUEIsICpPUEJfUHRyOworI3ByYWdtYSBwYWNrKCkKKworLyoKKyAqIFNDQjogYWRhcHRlciBjb21tYW5kcyBlbmFibGVkIGJ5IHRoZSBob3N0IHN5c3RlbSBzdGFydGVkIGJ5IHdyaXRpbmcKKyAqIENNRF9JTlRFUlJVUFRfQURBUFRFUiB8IENNRF9FWEVDVVRFICh8U0NCX1JFUVVFU1QpIHRvIHRoZSBTSUZDTUQgSU8KKyAqIHJlZ2lzdGVyLiAoc3BlY2lhbCBjYXNlOiB8IENNRF9TWVNURU1fSVJRIGZvciBpbml0aWFsaXphdGlvbikKKyAqLworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQxNl90IENNRDsJCS8qIENvbW1hbmQgY29kZSAqLworCXVfaW50MTZfdCBQYXJtWzJdOwkvKiBQb2ludGVyIHRvIENvbW1hbmQgUGFyYW1ldGVyIEJsb2NrICovCit9IFNDQjsJLyogU3lzdGVtIENvbW1hbmQgQmxvY2sgKDMyIGJpdCBwaHlzaWNhbCBhZGRyZXNzOyBiaWcgZW5kaWFuKSovCisjcHJhZ21hIHBhY2soKQorCisvKgorICogU1NCOiBhZGFwdGVyIGNvbW1hbmQgcmV0dXJuIHN0YXR1cyBjYW4gYmUgZXZhbHVhdGVkIGFmdGVyIENPTU1BTkRfU1RBVFVTCisgKiBhZGFwdGVyIHRvIHN5c3RlbSBpbnRlcnJ1cHQgYWZ0ZXIgcmVhZGluZyBTU0IsIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIFNTQgorICogaGFzIHRvIGJlIHRvbGQgdGhlIGFkYXB0ZXIgYnkgd3JpdGluZyBDTURfSU5URVJSVVBUX0FEQVBURVIgfCBDTURfU1NCX0NMRUFSCisgKiBpbiB0aGUgU0lGQ01EIElPIHJlZ2lzdGVyLgorICovCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKwl1X2ludDE2X3QgU1RTOwkJLyogU3RhdHVzIGNvZGUgKi8KKwl1X2ludDE2X3QgUGFybVszXTsJLyogUGFyYW1ldGVyIG9yIHBvaW50ZXIgdG8gU3RhdHVzIFBhcmFtZXRlcgorCQkJCSAqIEJsb2NrLgorCQkJCSAqLworfSBTU0I7CS8qIFN5c3RlbSBTdGF0dXMgQmxvY2sgKGJpZyBlbmRpYW4gLSBwaHlzaWNhbCBhZGRyZXNzKSAgKi8KKyNwcmFnbWEgcGFjaygpCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBCdXJuZWRJbkFkZHJQdHI7CS8qIFBvaW50ZXIgdG8gYWRhcHRlciBidXJuZWQgaW4KKwkJCQkJICogYWRkcmVzcy4gKEJJQSkKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQgU29mdHdhcmVMZXZlbFB0cjsvKiBQb2ludGVyIHRvIHNvZnR3YXJlIGxldmVsIGRhdGEuICovCisJdW5zaWduZWQgc2hvcnQgQWRhcHRlckFkZHJQdHI7CS8qIFBvaW50ZXIgdG8gYWRhcHRlciBhZGRyZXNzZXMuICovCisJdW5zaWduZWQgc2hvcnQgQWRhcHRlclBhcm1zUHRyOwkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgcGFyYW1ldGVycy4gKi8KKwl1bnNpZ25lZCBzaG9ydCBNQUNCdWZmZXJQdHI7CS8qIFBvaW50ZXIgdG8gTUFDIGJ1ZmZlci4gKGludGVybmFsKSAqLworCXVuc2lnbmVkIHNob3J0IExMQ0NvdW50ZXJzUHRyOwkvKiBQb2ludGVyIHRvIExMQyBjb3VudGVycy4gICovCisJdW5zaWduZWQgc2hvcnQgU3BlZWRGbGFnUHRyOwkvKiBQb2ludGVyIHRvIGRhdGEgcmF0ZSBmbGFnLgorCQkJCQkgKiAoNC8xNiBNYnBzKQorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydCBBZGFwdGVyUkFNUHRyOwkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgUkFNIGZvdW5kLiAoS0IpICovCit9IElOVFBUUlM7CS8qIEFkYXB0ZXIgaW50ZXJuYWwgcG9pbnRlcnMgKi8KKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQ4X3QgIExpbmVfRXJyb3I7CQkvKiBMaW5lIGVycm9yOiBjb2RlIHZpb2xhdGlvbiBpbgorCQkJCQkgKiBmcmFtZSBvciBpbiBhIHRva2VuLCBvciBGQ1MgZXJyb3IuCisJCQkJCSAqLworCXVfaW50OF90ICBJbnRlcm5hbF9FcnJvcjsJLyogSUJNIHNwZWNpZmljLiAoUmVzZXJ2ZWRfMSkgKi8KKwl1X2ludDhfdCAgQnVyc3RfRXJyb3I7CisJdV9pbnQ4X3QgIEFSSV9GQ0lfRXJyb3I7CS8qIEFSSS9GQ0kgYml0IHplcm8gaW4gQU1QIG9yCisJCQkJCSAqIFNNUCBNQUMgZnJhbWUuCisJCQkJCSAqLworCXVfaW50OF90ICBBYm9ydERlbGltZXRlcnM7CS8qIElCTSBzcGVjaWZpYy4gKFJlc2VydmVkXzIpICovCisJdV9pbnQ4X3QgIFJlc2VydmVkXzM7CisJdV9pbnQ4X3QgIExvc3RfRnJhbWVfRXJyb3I7CS8qIFJlY2VpdmUgb2YgZW5kIG9mIHRyYW5zbWl0dGVkCisJCQkJCSAqIGZyYW1lIGZhaWxlZC4KKwkJCQkJICovCisJdV9pbnQ4X3QgIFJ4X0Nvbmdlc3RfRXJyb3I7CS8qIEFkYXB0ZXIgaW4gcmVwZWF0IG1vZGUgaGFzIG5vdAorCQkJCQkgKiBlbm91Z2ggYnVmZmVyIHNwYWNlIHRvIGNvcHkgaW5jb21pbmcKKwkJCQkJICogZnJhbWUuCisJCQkJCSAqLworCXVfaW50OF90ICBGcmFtZV9Db3BpZWRfRXJyb3I7CS8qIEFSSSBiaXQgbm90IHplcm8gaW4gZnJhbWUKKwkJCQkJICogYWRkcmVzc2VkIHRvIGFkYXB0ZXIuCisJCQkJCSAqLworCXVfaW50OF90ICBGcmVxdWVuY3lfRXJyb3I7CS8qIElCTSBzcGVjaWZpYy4gKFJlc2VydmVkXzQpICovCisJdV9pbnQ4X3QgIFRva2VuX0Vycm9yOwkJLyogKGFjdGl2ZSBvbmx5IGluIG1vbml0b3Igc3RhdGlvbikgKi8KKwl1X2ludDhfdCAgUmVzZXJ2ZWRfNTsKKwl1X2ludDhfdCAgRE1BX0J1c19FcnJvcjsJLyogRE1BIGJ1cyBlcnJvcnMgbm90IGV4Y2VlZGluZyB0aGUKKwkJCQkJICogYWJvcnQgdGhyZXNob2xkcy4KKwkJCQkJICovCisJdV9pbnQ4X3QgIERNQV9QYXJpdHlfRXJyb3I7CS8qIERNQSBwYXJpdHkgZXJyb3JzIG5vdCBleGNlZWRpbmcKKwkJCQkJICogdGhlIGFib3J0IHRocmVzaG9sZHMuCisJCQkJCSAqLworfSBFUlJPUlRBQjsJLyogQWRhcHRlciBlcnJvciBjb3VudGVycyAqLworI3ByYWdtYSBwYWNrKCkKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZW5kIGFuZCBSZWNlaXZlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQxNl90IERhdGFDb3VudDsJLyogVmFsdWUgMCwgZXZlbiBhbmQgb2RkIHZhbHVlcyBhcmUKKwkJCQkgKiBwZXJtaXR0ZWQ7IHZhbHVlIGlzIHVuYWx0ZXJlZCBtb3N0CisJCQkJICogc2lnbmlmaWNhbnQgYml0IHNldDogZm9sbG93aW5nCisJCQkJICogZnJhZ21lbnRzIGxhc3QgZnJhZ21lbnQ6IG1vc3QKKwkJCQkgKiBzaWduaWZpY2FudCBiaXQgaXMgbm90IGV2YWx1YXRlZC4KKwkJCQkgKiAoPz8/KQorCQkJCSAqLworCXVfaW50MzJfdCBEYXRhQWRkcjsJLyogUG9pbnRlciB0byBmcmFtZSBkYXRhIGZyYWdtZW50OworCQkJCSAqIGV2ZW4gb3Igb2RkLgorCQkJCSAqLworfSBGcmFnbWVudDsKKyNwcmFnbWEgcGFjaygpCisKKyNkZWZpbmUgTUFYX0ZSQUdfTlVNQkVSUyAgICA5CS8qIE1heGltYWwgbnVtYmVyIG9mIGZyYWdtZW50cyBwb3NzaWJsZSB0byB1c2UKKwkJCQkgKiBpbiBvbmUgUlBML1RQTC4gKGRlcGVuZGluZyBvbiBUSSBmaXJtd2FyZSAKKwkJCQkgKiB2ZXJzaW9uKQorCQkJCSAqLworCisvKgorICogQUMgKDEpLCBGQyAoMSksIERzdCAoNiksIFNyYyAoNiksIFJJRiAoMTgpLCBEYXRhICg0NDcyKSA9IDQ1MDQKKyAqIFRoZSBwYWNrZXQgc2l6ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dzOiA1NDgsIDE1MDIsIDIwODQsIDQ1MDQsIDgxNzYsCisgKiAxMTQzOSwgMTc4MzIuIFJlZmVyIHRvIFRNUzM4MCBTZWNvbmQgR2VuZXJhdGlvbiBUb2tlbiBSaW5nIFVzZXIncyBHdWlkZQorICogUGFnZSAyLTI3LgorICovCisjZGVmaW5lIEhFQURFUl9TSVpFCQkoMSArIDEgKyA2ICsgNikKKyNkZWZpbmUgU1JDX1NJWkUJCTE4CisjZGVmaW5lIE1JTl9EQVRBX1NJWkUJCTUxNgorI2RlZmluZSBERUZBVUxUX0RBVEFfU0laRQk0NDcyCisjZGVmaW5lIE1BWF9EQVRBX1NJWkUJCTE3ODAwCisKKyNkZWZpbmUgREVGQVVMVF9QQUNLRVRfU0laRSAoSEVBREVSX1NJWkUgKyBTUkNfU0laRSArIERFRkFVTFRfREFUQV9TSVpFKQorI2RlZmluZSBNSU5fUEFDS0VUX1NJWkUgICAgIChIRUFERVJfU0laRSArIFNSQ19TSVpFICsgTUlOX0RBVEFfU0laRSkKKyNkZWZpbmUgTUFYX1BBQ0tFVF9TSVpFICAgICAoSEVBREVSX1NJWkUgKyBTUkNfU0laRSArIE1BWF9EQVRBX1NJWkUpCisKKy8qCisgKiBNYWNyb3MgdG8gZGVhbCB3aXRoIHRoZSBmcmFtZSBzdGF0dXMgZmllbGQuCisgKi8KKyNkZWZpbmUgQUNfTk9UX1JFQ09HTklaRUQJMHgwMAorI2RlZmluZSBHUk9VUF9CSVQJCTB4ODAKKyNkZWZpbmUgR0VUX1RSQU5TTUlUX1NUQVRVU19ISUdIX0JZVEUoVHMpICgodW5zaWduZWQgY2hhcikoKFRzKSA+PiA4KSkKKyNkZWZpbmUgR0VUX0ZSQU1FX1NUQVRVU19ISUdIX0FDKEZzKQkgICgodW5zaWduZWQgY2hhcikoKChGcykgJiAweEMwKSA+PiA2KSkKKyNkZWZpbmUgR0VUX0ZSQU1FX1NUQVRVU19MT1dfQUMoRnMpICAgICAgICgodW5zaWduZWQgY2hhcikoKChGcykgJiAweDBDKSA+PiAyKSkKKyNkZWZpbmUgRElSRUNURURfRlJBTUUoQ29udGV4dCkgICAgICAgICAgICghKChDb250ZXh0KS0+TURhdGFbMl0gJiBHUk9VUF9CSVQpKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlbmQgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBkZWZpbmUgVFhfQ1NUQVQgX1JFUVVFU1QgKFIpIGFuZCBfQ09NUExFVEUgKEMpIHZhbHVlcyAoaGlnaC1sb3cpICovCisKKyNkZWZpbmUgVFhfVkFMSUQJCTB4MDA4MAkvKiBSOiBzZXQgdmlhIFRSQU5TTUlULlZBTElEIGludGVycnVwdC4KKwkJCQkJICogQzogYWx3YXlzIHJlc2V0IHRvIHplcm8hCisJCQkJCSAqLworI2RlZmluZSBUWF9GUkFNRV9DT01QTEVURQkweDAwNDAJLyogUjogbXVzdCBiZSByZXNldCB0byB6ZXJvLgorCQkJCQkgKiBDOiBzZXQgdG8gb25lLgorCQkJCQkgKi8KKyNkZWZpbmUgVFhfU1RBUlRfRlJBTUUJCTB4MDAyMCAgLyogUjogc3RhcnQgb2YgYSBmcmFtZTogMSAKKwkJCQkJICogQzogdW5jaGFuZ2VkLgorCQkJCQkgKi8KKyNkZWZpbmUgVFhfRU5EX0ZSQU1FCQkweDAwMTAgIC8qIFI6IGVuZCBvZiBhIGZyYW1lOiAxCisJCQkJCSAqIEM6IHVuY2hhbmdlZC4KKwkJCQkJICovCisjZGVmaW5lIFRYX0ZSQU1FX0lSUQkJMHgwMDA4ICAvKiBSOiByZXF1ZXN0IGludGVycnVwdCBnZW5lcmF0aW9uCisJCQkJCSAqIGFmdGVyIHRyYW5zbWlzc2lvbi4KKwkJCQkJICogQzogdW5jaGFuZ2VkLgorCQkJCQkgKi8KKyNkZWZpbmUgVFhfRVJST1IJCTB4MDAwNCAgLyogUjogcmVzZXJ2ZWQuCisJCQkJCSAqIEM6IHNldCB0byBvbmUgaWYgRXJyb3Igb2NjdXJyZWQuCisJCQkJCSAqLworI2RlZmluZSBUWF9JTlRFUkZSQU1FX1dBSVQJMHgwMDA0CisjZGVmaW5lIFRYX1BBU1NfQ1JDCQkweDAwMDIgIC8qIFI6IHNldCBpZiBDUkMgdmFsdWUgaXMgYWxyZWFkeQorCQkJCQkgKiBjYWxjdWxhdGVkLiAodmFsaWQgb25seSBpbgorCQkJCQkgKiBGUkFNRV9TVEFSVCBUUEwpCisJCQkJCSAqIEM6IHVuY2hhbmdlZC4KKwkJCQkJICovCisjZGVmaW5lIFRYX1BBU1NfU1JDX0FERFIJMHgwMDAxICAvKiBSOiBhZGFwdGVyIHVzZXMgZXhwbGljaXQgZnJhbWUKKwkJCQkJICogc291cmNlIGFkZHJlc3MgYW5kIGRvZXMgbm90IG92ZXJ3cml0ZQorCQkJCQkgKiB3aXRoIHRoZSBhZGFwdGVyIG5vZGUgYWRkcmVzcy4KKwkJCQkJICogKHZhbGlkIG9ubHkgaW4gRlJBTUVfU1RBUlQgVFBMKQorCQkJCQkgKgorCQkJCQkgKiBDOiB1bmNoYW5nZWQuCisJCQkJCSAqLworI2RlZmluZSBUWF9TVFJJUF9GUwkJMHhGRjAwICAvKiBSOiByZXNlcnZlZC4KKwkJCQkJICogQzogaWYgbm8gVHJhbnNtaXNzaW9uIEVycm9yLAorCQkJCQkgKiBmaWVsZCBjb250YWlucyBjb3B5IG9mIEZTIGJ5dGUgYWZ0ZXIKKwkJCQkJICogc3RyaXBwaW5nIG9mIGZyYW1lLgorCQkJCQkgKi8KKworLyoKKyAqIFN0cnVjdHVyZSBvZiBUcmFuc21pdCBQYXJhbWV0ZXIgTGlzdHMgKFRQTHMpIChvbmx5IG9uZSBmcmFtZSBldmVyeSBUUEwsCisgKiBidXQgcG9zc2libHkgbXVsdGlwbGUgVFBMcyBmb3Igb25lIGZyYW1lKSB0aGUgbGVuZ3RoIG9mIHRoZSBUUExzIGhhcyB0byBiZQorICogaW5pdGlhbGl6ZWQgaW4gdGhlIE9QTC4gKE9QRU4gcGFyYW1ldGVyIGxpc3QpCisgKi8KKyNkZWZpbmUgVFBMX05VTQkJMwkvKiBOdW1iZXIgb2YgVHJhbnNtaXQgUGFyYW1ldGVyIExpc3RzLgorCQkJCSAqICEhIE1VU1QgQkUgPj0gMyAhIQorCQkJCSAqLworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHNfVFBMIFRQTDsKKworc3RydWN0IHNfVFBMIHsJLyogVHJhbnNtaXQgUGFyYW1ldGVyIExpc3QgKGFsaWduIG9uIGV2ZW4gd29yZCBib3VuZGFyaWVzKSAqLworCXVfaW50MzJfdCBOZXh0VFBMQWRkcjsJCS8qIFBvaW50ZXIgdG8gbmV4dCBUUEwgaW4gY2hhaW47IGlmCisJCQkJCSAqIHBvaW50ZXIgaXMgb2RkOiB0aGlzIGlzIHRoZSBsYXN0CisJCQkJCSAqIFRQTC4gUG9pbnRpbmcgdG8gaXRzZWxmIGNhbiBjYXVzZQorCQkJCQkgKiBwcm9ibGVtcyEKKwkJCQkJICovCisJdm9sYXRpbGUgdV9pbnQxNl90IFN0YXR1czsJLyogSW5pdGlhbGl6ZWQgYnkgdGhlIGFkYXB0ZXI6CisJCQkJCSAqIENTVEFUX1JFUVVFU1QgaW1wb3J0YW50OiB1cGRhdGUgbGVhc3QKKwkJCQkJICogc2lnbmlmaWNhbnQgYml0IGZpcnN0ISBTZXQgYnkgdGhlCisJCQkJCSAqIGFkYXB0ZXI6IENTVEFUX0NPTVBMRVRFIHN0YXR1cy4KKwkJCQkJICovCisJdV9pbnQxNl90IEZyYW1lU2l6ZTsJCS8qIE51bWJlciBvZiBieXRlcyB0byBiZSB0cmFuc21pdHRlZAorCQkJCQkgKiBhcyBhIGZyYW1lIGluY2x1ZGluZyBBQy9GQywKKwkJCQkJICogRGVzdGluYXRpb24sIFNvdXJjZSwgUm91dGluZyBmaWVsZAorCQkJCQkgKiBub3QgaW5jbHVkaW5nIENSQywgRlMsIEVuZCBEZWxpbWl0ZXIKKwkJCQkJICogKHZhbGlkIG9ubHkgaWYgU1RBUlRfRlJBTUUgYml0IGluIAorCQkJCQkgKiBDU1RBVCBub256ZXJvKSBtdXN0IG5vdCBiZSB6ZXJvIGluCisJCQkJCSAqIGFueSBsaXN0OyBtYXhpbXVtIHZhbHVlOiAoQlVGRkVSX1NJWkUKKwkJCQkJICogLSA4KSAqIFRYX0JVRl9NQVggc3VtIG9mIERhdGFDb3VudAorCQkJCQkgKiB2YWx1ZXMgaW4gRnJhZ21lbnRMaXN0IG11c3QgZXF1YWwKKwkJCQkJICogRnJhbWVfU2l6ZSB2YWx1ZSBpbiBTVEFSVF9GUkFNRSBUUEwhCisJCQkJCSAqIGZyYW1lIGRhdGEgZnJhZ21lbnQgbGlzdC4KKwkJCQkJICovCisKKwkvKiBUUEwvUlBMIHNpemUgaW4gT1BFTiBwYXJhbWV0ZXIgbGlzdCBkZXBlbmRpbmcgb24gbWF4aW1hbAorCSAqIG51bWJlcnMgb2YgZnJhZ21lbnRzIHVzZWQgaW4gb25lIHBhcmFtZXRlciBsaXN0LgorCSAqLworCUZyYWdtZW50IEZyYWdMaXN0W1RYX0ZSQUdfTlVNXTsJLyogTWF4aW11bTogbmluZSBmcmFtZSBmcmFnbWVudHMgaW4gb25lCisJCQkJCSAqIFRQTCBhY3R1YWwgdmVyc2lvbiBvZiBmaXJtd2FyZTogOQorCQkJCQkgKiBmcmFnbWVudHMgcG9zc2libGUuCisJCQkJCSAqLworI3ByYWdtYSBwYWNrKCkKKworCS8qIFNwZWNpYWwgcHJvcHJpZXRhcnkgZGF0YSBhbmQgcHJlY2FsY3VsYXRpb25zICovCisKKwlUUEwgKk5leHRUUExQdHI7CQkvKiBQb2ludGVyIHRvIG5leHQgVFBMIGluIGNoYWluLiAqLworCXVuc2lnbmVkIGNoYXIgKk1EYXRhOworCXN0cnVjdCBza19idWZmICpTa2I7CisJdW5zaWduZWQgY2hhciBUUExJbmRleDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIEJ1c3lGbGFnOy8qIEZsYWc6IFRQTCBidXN5PyAqLworCWRtYV9hZGRyX3QgRE1BQnVmZjsJCS8qIERNQSBJTyBidXMgYWRkcmVzcyBmcm9tIHBjaV9tYXAgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVJlY2VpdmUgRnVuY3Rpb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIGRlZmluZSBSRUNFSVZFX0NTVEFUX1JFUVVFU1QgKFIpIGFuZCBSRUNFSVZFX0NTVEFUX0NPTVBMRVRFIChDKSB2YWx1ZXMuCisgKiAoaGlnaC1sb3cpCisgKi8KKyNkZWZpbmUgUlhfVkFMSUQJCTB4MDA4MAkvKiBSOiBzZXQ7IHRlbGwgYWRhcHRlciB3aXRoCisJCQkJCSAqIFJFQ0VJVkUuVkFMSUQgaW50ZXJydXB0LgorCQkJCQkgKiBDOiByZXNldCB0byB6ZXJvLgorCQkJCQkgKi8KKyNkZWZpbmUgUlhfRlJBTUVfQ09NUExFVEUJMHgwMDQwICAvKiBSOiBtdXN0IGJlIHJlc2V0IHRvIHplcm8sCisJCQkJCSAqIEM6IHNldCB0byBvbmUuCisJCQkJCSAqLworI2RlZmluZSBSWF9TVEFSVF9GUkFNRQkJMHgwMDIwICAvKiBSOiBtdXN0IGJlIHJlc2V0IHRvIHplcm8uCisJCQkJCSAqIEM6IHNldCB0byBvbmUgb24gdGhlIGxpc3QuCisJCQkJCSAqLworI2RlZmluZSBSWF9FTkRfRlJBTUUJCTB4MDAxMCAgLyogUjogbXVzdCBiZSByZXNldCB0byB6ZXJvLgorCQkJCQkgKiBDOiBzZXQgdG8gb25lIG9uIHRoZSBsaXN0CisJCQkJCSAqIHRoYXQgZW5kcyB0aGUgZnJhbWUuCisJCQkJCSAqLworI2RlZmluZSBSWF9GUkFNRV9JUlEJCTB4MDAwOCAgLyogUjogcmVxdWVzdCBpbnRlcnJ1cHQgZ2VuZXJhdGlvbgorCQkJCQkgKiBhZnRlciByZWNlaXZlLgorCQkJCQkgKiBDOiB1bmNoYW5nZWQuCisJCQkJCSAqLworI2RlZmluZSBSWF9JTlRFUkZSQU1FX1dBSVQJMHgwMDA0ICAvKiBSOiBhZnRlciByZWNlaXZpbmcgYSBmcmFtZToKKwkJCQkJICogaW50ZXJydXB0IGFuZCB3YWl0IGZvciBhCisJCQkJCSAqIFJFQ0VJVkUuQ09OVElOVUUuCisJCQkJCSAqIEM6IHVuY2hhbmdlZC4KKwkJCQkJICovCisjZGVmaW5lIFJYX1BBU1NfQ1JDCQkweDAwMDIgIC8qIFI6IGlmIHNldCwgdGhlIGFkYXB0ZXIgaW5jbHVkZXMKKwkJCQkJICogdGhlIENSQyBpbiBkYXRhIHBhc3NlZC4gKGxhc3QgZm91ciAKKwkJCQkJICogYnl0ZXM7IHZhbGlkIG9ubHkgaWYgRlJBTUVfU1RBUlQgaXMKKwkJCQkJICogc2V0KQorCQkJCQkgKiBDOiBzZXQsIGlmIENSQyBpcyBpbmNsdWRlZCBpbgorCQkJCQkgKiByZWNlaXZlZCBkYXRhLgorCQkJCQkgKi8KKyNkZWZpbmUgUlhfUEFTU19TUkNfQUREUgkweDAwMDEgIC8qIFI6IGFkYXB0ZXIgdXNlcyBleHBsaWNpdCBmcmFtZQorCQkJCQkgKiBzb3VyY2UgYWRkcmVzcyBhbmQgZG9lcyBub3QKKwkJCQkJICogb3ZlcndyaXRlIHdpdGggdGhlIGFkYXB0ZXIgbm9kZQorCQkJCQkgKiBhZGRyZXNzLiAodmFsaWQgb25seSBpZiBGUkFNRV9TVEFSVAorCQkJCQkgKiBpcyBzZXQpCisJCQkJCSAqIEM6IHVuY2hhbmdlZC4KKwkJCQkJICovCisjZGVmaW5lIFJYX1JFQ0VJVkVfRlMJCTB4RkMwMCAgLyogUjogcmVzZXJ2ZWQ7IG11c3QgYmUgcmVzZXQgdG8gemVyby4KKwkJCQkJICogQzogb24gbGlzdHMgd2l0aCBTVEFSVF9GUkFNRSwgZmllbGQKKwkJCQkJICogY29udGFpbnMgZnJhbWUgc3RhdHVzIGZpZWxkIGZyb20KKwkJCQkJICogcmVjZWl2ZWQgZnJhbWU7IG90aGVyd2lzZSBjbGVhcmVkLgorCQkJCQkgKi8KKyNkZWZpbmUgUlhfQUREUl9NQVRDSAkJMHgwMzAwICAvKiBSOiByZXNlcnZlZDsgbXVzdCBiZSByZXNldCB0byB6ZXJvLgorCQkJCQkgKiBDOiBhZGRyZXNzIG1hdGNoIGNvZGUgbWFzay4KKwkJCQkJICovIAorI2RlZmluZSBSWF9TVEFUVVNfTUFTSwkJMHgwMEZGICAvKiBNYXNrIGZvciByZWNlaXZlIHN0YXR1cyBiaXRzLiAqLworCisjZGVmaW5lIFJYX0lOVEVSTl9BRERSX01BVENIICAgIDB4MDEwMCAgLyogQzogaW50ZXJuYWxseSBhZGRyZXNzIG1hdGNoLiAqLworI2RlZmluZSBSWF9FWFRFUk5fQUREUl9NQVRDSCAgICAweDAyMDAgIC8qIEM6IGV4dGVybmFsbHkgbWF0Y2hlZCB2aWEKKwkJCQkJICogWE1BVENIL1hGQUlMIGludGVyZmFjZS4KKwkJCQkJICovCisjZGVmaW5lIFJYX0lOVEVYVF9BRERSX01BVENIICAgIDB4MDMwMCAgLyogQzogaW50ZXJuYWxseSBhbmQgZXh0ZXJuYWxseQorCQkJCQkgKiBtYXRjaGVkLgorCQkJCQkgKi8KKyNkZWZpbmUgUlhfUkVBRFkgKFJYX1ZBTElEIHwgUlhfRlJBTUVfSVJRKSAvKiBSZWFkeSBmb3IgcmVjZWl2ZS4gKi8KKworLyogQ29uc3RhbnRzIGZvciBDb21tYW5kIFN0YXR1cyBJbnRlcnJ1cHQuCisgKiBDT01NQU5EX1JFSkVDVCBzdGF0dXMgZmllbGQgYml0IGZ1bmN0aW9ucyAoU1NCLlBhcm1bMF0pCisgKi8KKyNkZWZpbmUgSUxMRUdBTF9DT01NQU5ECQkweDAwODAJLyogU2V0IGlmIGFuIHVua25vd24gY29tbWFuZAorCQkJCQkgKiBpcyBpc3N1ZWQgdG8gdGhlIGFkYXB0ZXIKKwkJCQkJICovCisjZGVmaW5lIEFERFJFU1NfRVJST1IJCTB4MDA0MCAgLyogU2V0IGlmIGFueSBhZGRyZXNzIGZpZWxkIGluCisJCQkJCSAqIHRoZSBTQ0IgaXMgb2RkLiAobm90IHdvcmQgYWxpZ25lZCkKKwkJCQkJICovCisjZGVmaW5lIEFEQVBURVJfT1BFTgkJMHgwMDIwICAvKiBDb21tYW5kIGlzc3VlZCBpbGxlZ2FsIHdpdGgKKwkJCQkJICogb3BlbiBhZGFwdGVyLgorCQkJCQkgKi8KKyNkZWZpbmUgQURBUFRFUl9DTE9TRQkJMHgwMDEwICAvKiBDb21tYW5kIGlzc3VlZCBpbGxlZ2FsIHdpdGgKKwkJCQkJICogY2xvc2VkIGFkYXB0ZXIuCisJCQkJCSAqLworI2RlZmluZSBTQU1FX0NPTU1BTkQJCTB4MDAwOCAgLyogQ29tbWFuZCBpc3N1ZWQgd2l0aCBzYW1lIGNvbW1hbmQKKwkJCQkJICogYWxyZWFkeSBleGVjdXRpbmcuCisJCQkJCSAqLworCisvKiBPUEVOX0NPTVBMRVRJT04gdmFsdWVzIChTU0IuUGFybVswXSwgTVNCKSAqLworI2RlZmluZSBOT0RFX0FERFJfRVJST1IJCTB4MDA0MCAgLyogV3JvbmcgYWRkcmVzcyBvciBCSUEgcmVhZAorCQkJCQkgKiB6ZXJvIGFkZHJlc3MuCisJCQkJCSAqLworI2RlZmluZSBMSVNUX1NJWkVfRVJST1IJCTB4MDAyMCAgLyogSWYgTGlzdF9TaXplIHZhbHVlIG5vdCBpbiAwLAorCQkJCQkgKiAxNCwgMjAsIDI2LgorCQkJCQkgKi8KKyNkZWZpbmUgQlVGX1NJWkVfRVJST1IJCTB4MDAxMCAgLyogTm90IGVub3VnaCBhdmFpbGFibGUgbWVtb3J5IGZvcgorCQkJCQkgKiB0d28gYnVmZmVycy4KKwkJCQkJICovCisjZGVmaW5lIFRYX0JVRl9DT1VOVF9FUlJPUgkweDAwMDQgIC8qIFJlbWFpbmluZyByZWNlaXZlIGJ1ZmZlcnMgbGVzcyB0aGFuCisJCQkJCSAqIHR3by4KKwkJCQkJICovCisjZGVmaW5lIE9QRU5fRVJST1IJCTB4MDAwMgkvKiBFcnJvciBkdXJpbmcgcmluZyBpbnNlcnRpb247IG1vcmUKKwkJCQkJICogaW5mb3JtYXRpb24gaW4gYml0cyA4LTE1LgorCQkJCQkgKi8KKworLyogU3RhbmRhcmQgcmV0dXJuIGNvZGVzICovCisjZGVmaW5lIEdPT0RfQ09NUExFVElPTgkJMHgwMDgwICAvKiA9T1BFTl9TVUNDRVNTRlVMTCAqLworI2RlZmluZSBJTlZBTElEX09QRU5fT1BUSU9OCTB4MDAwMSAgLyogT1BFTiBvcHRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5CisJCQkJCSAqIHRoZSBhZGFwdGVyLgorCQkJCQkgKi8KKworLyogT1BFTiBwaGFzZXM7IGRldGFpbHMgb2YgT1BFTl9FUlJPUiAoU1NCLlBhcm1bMF0sIExTQikgICAgICAgICAgICAqLworI2RlZmluZSBPUEVOX1BIQVNFU19NQVNLICAgICAgICAgICAgMHhGMDAwICAvKiBDaGVjayBvbmx5IHRoZSBiaXRzIDgtMTEuICovCisjZGVmaW5lIExPQkVfTUVESUFfVEVTVCAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgUEhZU0lDQUxfSU5TRVJUSU9OICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBBRERSRVNTX1ZFUklGSUNBVElPTiAgICAgICAgMHgzMDAwCisjZGVmaW5lIFBBUlRJQ0lQQVRJT05fSU5fUklOR19QT0xMICAweDQwMDAKKyNkZWZpbmUgUkVRVUVTVF9JTklUSUFMSVNBVElPTiAgICAgIDB4NTAwMAorI2RlZmluZSBGVUxMRFVQTEVYX0NIRUNLICAgICAgICAgICAgMHg2MDAwCisKKy8qIE9QRU4gZXJyb3IgY29kZXM7IGRldGFpbHMgb2YgT1BFTl9FUlJPUiAoU1NCLlBhcm1bMF0sIExTQikgKi8KKyNkZWZpbmUgT1BFTl9FUlJPUl9DT0RFU19NQVNLCTB4MEYwMCAgLyogQ2hlY2sgb25seSB0aGUgYml0cyAxMi0xNS4gKi8KKyNkZWZpbmUgT1BFTl9GVU5DVElPTl9GQUlMVVJFICAgMHgwMTAwICAvKiBVbmFibGUgdG8gdHJhbnNtaXQgdG8gaXRzZWxmIG9yCisJCQkJCSAqIGZyYW1lcyByZWNlaXZlZCBiZWZvcmUgaW5zZXJ0aW9uLgorCQkJCQkgKi8KKyNkZWZpbmUgT1BFTl9TSUdOQUxfTE9TUwkweDAyMDAJLyogU2lnbmFsIGxvc3MgY29uZGl0aW9uIGRldGVjdGVkIGF0CisJCQkJCSAqIHJlY2VpdmVyLgorCQkJCQkgKi8KKyNkZWZpbmUgT1BFTl9USU1FT1VUCQkweDA1MDAJLyogSW5zZXJ0aW9uIHRpbWVyIGV4cGlyZWQgYmVmb3JlCisJCQkJCSAqIGxvZ2ljYWwgaW5zZXJ0aW9uLgorCQkJCQkgKi8KKyNkZWZpbmUgT1BFTl9SSU5HX0ZBSUxVUkUJMHgwNjAwCS8qIFVuYWJsZSB0byByZWNlaXZlIG93biByaW5nIHB1cmdlCisJCQkJCSAqIE1BQyBmcmFtZXMuCisJCQkJCSAqLworI2RlZmluZSBPUEVOX1JJTkdfQkVBQ09OSU5HCTB4MDcwMAkvKiBCZWFjb24gTUFDIGZyYW1lIHJlY2VpdmVkIGFmdGVyCisJCQkJCSAqIHJpbmcgaW5zZXJ0aW9uLgorCQkJCQkgKi8KKyNkZWZpbmUgT1BFTl9EVVBMSUNBVEVfTk9ERUFERFIJMHgwODAwICAvKiBPdGhlciBzdGF0aW9uIGluIHJpbmcgZm91bmQKKwkJCQkJICogd2l0aCB0aGUgc2FtZSBhZGRyZXNzLgorCQkJCQkgKi8KKyNkZWZpbmUgT1BFTl9SRVFVRVNUX0lOSVQJMHgwOTAwCS8qIFJQUyBwcmVzZW50IGJ1dCBkb2VzIG5vdCByZXNwb25kLiAqLworI2RlZmluZSBPUEVOX1JFTU9WRV9SRUNFSVZFRCAgICAweDBBMDAgIC8qIEFkYXB0ZXIgcmVjZWl2ZWQgYSByZW1vdmUgYWRhcHRlcgorCQkJCQkgKiBNQUMgZnJhbWUuCisJCQkJCSAqLworI2RlZmluZSBPUEVOX0ZVTExEVVBMRVhfU0VUCTB4MEQwMAkvKiBHb3QgdGhpcyB3aXRoIGZ1bGwgZHVwbGV4IG9uIHdoZW4KKwkJCQkJICogdHJ5aW5nIHRvIGNvbm5lY3QgdG8gYSBub3JtYWwgcmluZy4KKwkJCQkJICovCisKKy8qIFNFVF9CUklER0VfUEFSTVMgcmV0dXJuIGNvZGVzOiAqLworI2RlZmluZSBCUklER0VfSU5WQUxJRF9NQVhfTEVOICAweDQwMDAgIC8qIE1BWF9ST1VUSU5HX0ZJRUxEX0xFTkdUSCBvZGQsCisJCQkJCSAqIGxlc3MgdGhhbiA2IG9yID4gMzAuCisJCQkJCSAqLworI2RlZmluZSBCUklER0VfSU5WQUxJRF9TUkNfUklORyAweDIwMDAgIC8qIFNPVVJDRV9SSU5HIG51bWJlciB6ZXJvLCB0b28gbGFyZ2UKKwkJCQkJICogb3IgPSBUQVJHRVRfUklORy4KKwkJCQkJICovCisjZGVmaW5lIEJSSURHRV9JTlZBTElEX1RSR19SSU5HIDB4MTAwMCAgLyogVEFSR0VUX1JJTkcgbnVtYmVyIHplcm8sIHRvbyBsYXJnZQorCQkJCQkgKiBvciA9IFNPVVJDRV9SSU5HLgorCQkJCQkgKi8KKyNkZWZpbmUgQlJJREdFX0lOVkFMSURfQlJER0VfTk8gMHgwODAwICAvKiBCUklER0VfTlVNQkVSIHRvbyBsYXJnZS4gKi8KKyNkZWZpbmUgQlJJREdFX0lOVkFMSURfT1BUSU9OUyAgMHgwNDAwICAvKiBJbnZhbGlkIGJyaWRnZSBvcHRpb25zLiAqLworI2RlZmluZSBCUklER0VfRElBR1NfRkFJTEVEICAgICAweDAyMDAgIC8qIERpYWdub3N0aWNzIG9mIFRNUzM4MFNSQSBmYWlsZWQuICovCisjZGVmaW5lIEJSSURHRV9OT19TUkEgICAgICAgICAgIDB4MDEwMCAgLyogVGhlIFRNUzM4MFNSQSBkb2VzIG5vdCBleGlzdCBpbiBIVworCQkJCQkgKiBjb25maWd1cmF0aW9uLgorCQkJCQkgKi8KKworLyoKKyAqIEJyaW5nIFVwIERpYWdub3N0aWNzIGVycm9yIGNvZGVzLgorICovCisjZGVmaW5lIEJVRF9JTklUSUFMX0VSUk9SICAgICAgIDB4MAorI2RlZmluZSBCVURfQ0hFQ0tTVU1fRVJST1IgICAgICAweDEKKyNkZWZpbmUgQlVEX0FEQVBURVJfUkFNX0VSUk9SICAgMHgyCisjZGVmaW5lIEJVRF9JTlNUUlVDVElPTl9FUlJPUiAgIDB4MworI2RlZmluZSBCVURfQ09OVEVYVF9FUlJPUiAgICAgICAweDQKKyNkZWZpbmUgQlVEX1BST1RPQ09MX0VSUk9SICAgICAgMHg1CisjZGVmaW5lIEJVRF9JTlRFUkZBQ0VfRVJST1IJMHg2CisKKy8qIEJVRCBjb25zdGFudHMgKi8KKyNkZWZpbmUgQlVEX01BWF9SRVRSSUVTICAgICAgICAgMworI2RlZmluZSBCVURfTUFYX0xPT1BDTlQgICAgICAgICA2CisjZGVmaW5lIEJVRF9USU1FT1VUICAgICAgICAgICAgIDMwMDAKKworLyogSW5pdGlhbGl6YXRpb24gY29uc3RhbnRzICovCisjZGVmaW5lIElOSVRfTUFYX1JFVFJJRVMgICAgICAgIDMJLyogTWF4aW11bSB0aHJlZSByZXRyaWVzLiAqLworI2RlZmluZSBJTklUX01BWF9MT09QQ05UICAgICAgICAyMiAgICAgIC8qIE1heGltdW0gbG9vcCBjb3VudHMuICovCisKKy8qIFJJTkcgU1RBVFVTIGZpZWxkIHZhbHVlcyAoaGlnaC9sb3cpICovCisjZGVmaW5lIFNJR05BTF9MT1NTICAgICAgICAgICAgIDB4MDA4MCAgLyogTG9zcyBvZiBzaWduYWwgb24gdGhlIHJpbmcKKwkJCQkJICogZGV0ZWN0ZWQuCisJCQkJCSAqLworI2RlZmluZSBIQVJEX0VSUk9SICAgICAgICAgICAgICAweDAwNDAgIC8qIFRyYW5zbWl0dGluZyBvciByZWNlaXZpbmcgYmVhY29uCisJCQkJCSAqIGZyYW1lcy4KKwkJCQkJICovCisjZGVmaW5lIFNPRlRfRVJST1IgICAgICAgICAgICAgIDB4MDAyMCAgLyogUmVwb3J0IGVycm9yIE1BQyBmcmFtZQorCQkJCQkgKiB0cmFuc21pdHRlZC4KKwkJCQkJICovCisjZGVmaW5lIFRSQU5TTUlUX0JFQUNPTiAgICAgICAgIDB4MDAxMCAgLyogVHJhbnNtaXR0aW5nIGJlYWNvbiBmcmFtZXMgb24gdGhlCisJCQkJCSAqIHJpbmcuCisJCQkJCSAqLworI2RlZmluZSBMT0JFX1dJUkVfRkFVTFQgICAgICAgICAweDAwMDggIC8qIE9wZW4gb3Igc2hvcnQgY2lyY3VpdCBpbiB0aGUKKwkJCQkJICogY2FibGUgdG8gY29uY2VudHJhdG9yOyBhZGFwdGVyCisJCQkJCSAqIGNsb3NlZC4KKwkJCQkJICovCisjZGVmaW5lIEFVVE9fUkVNT1ZBTF9FUlJPUiAgICAgIDB4MDAwNCAgLyogTG9iZSB3cmFwIHRlc3QgZmFpbGVkLCBkZWluc2VydGVkOworCQkJCQkgKiBhZGFwdGVyIGNsb3NlZC4KKwkJCQkJICovCisjZGVmaW5lIFJFTU9WRV9SRUNFSVZFRCAgICAgICAgIDB4MDAwMSAgLyogUmVjZWl2ZWQgYSByZW1vdmUgcmluZyBzdGF0aW9uIE1BQworCQkJCQkgKiBNQUMgZnJhbWUgcmVxdWVzdDsgYWRhcHRlciBjbG9zZWQuCisJCQkJCSAqLworI2RlZmluZSBDT1VOVEVSX09WRVJGTE9XICAgICAgICAweDgwMDAgIC8qIE92ZXJmbG93IG9mIG9uZSBvZiB0aGUgYWRhcHRlcnMKKwkJCQkJICogZXJyb3IgY291bnRlcnM7IFJFQUQuRVJST1IuTE9HLgorCQkJCQkgKi8KKyNkZWZpbmUgU0lOR0xFX1NUQVRJT04gICAgICAgICAgMHg0MDAwICAvKiBBZGFwdGVyIGlzIHRoZSBvbmx5IHN0YXRpb24gb24gdGhlCisJCQkJCSAqIHJpbmcuCisJCQkJCSAqLworI2RlZmluZSBSSU5HX1JFQ09WRVJZICAgICAgICAgICAweDIwMDAgIC8qIENsYWltIHRva2VuIE1BQyBmcmFtZXMgb24gdGhlIHJpbmc7CisJCQkJCSAqIHJlc2V0IGFmdGVyIHJpbmcgcHVyZ2UgZnJhbWUuCisJCQkJCSAqLworCisjZGVmaW5lIEFEQVBURVJfQ0xPU0VEIChMT0JFX1dJUkVfRkFVTFQgfCBBVVRPX1JFTU9WQUxfRVJST1IgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJFTU9WRV9SRUNFSVZFRCkKKworLyogQWRhcHRlcl9jaGVja19ibG9jay5TdGF0dXMgZmllbGQgYml0IGFzc2lnbm1lbnRzOiAqLworI2RlZmluZSBESU9fUEFSSVRZICAgICAgICAgICAgICAweDgwMDAgIC8qIEFkYXB0ZXIgZGV0ZWN0cyBiYWQgcGFyaXR5CisJCQkJCSAqIHRocm91Z2ggZGlyZWN0IEkvTyBhY2Nlc3MuCisJCQkJCSAqLworI2RlZmluZSBETUFfUkVBRF9BQk9SVCAgICAgICAgICAweDQwMDAgIC8qIEFib3J0aW5nIERNQSByZWFkIG9wZXJhdGlvbgorCQkJCQkgKiBmcm9tIHN5c3RlbSBQYXJtWzBdOiAwPXRpbWVvdXQsCisJCQkJCSAqIDE9cGFyaXR5IGVycm9yLCAyPWJ1cyBlcnJvcjsKKwkJCQkJICogUGFybVsxXTogMzIgYml0IHBvaW50ZXIgdG8gaG9zdAorCQkJCQkgKiBzeXN0ZW0gYWRkcmVzcyBhdCBmYWlsdXJlLgorCQkJCQkgKi8KKyNkZWZpbmUgRE1BX1dSSVRFX0FCT1JUICAgICAgICAgMHgyMDAwICAvKiBBYm9ydGluZyBETUEgd3JpdGUgb3BlcmF0aW9uCisJCQkJCSAqIHRvIHN5c3RlbS4gKHBhcmFtZXRlcnMgYW5hbG9nb3VzIHRvCisJCQkJCSAqIERNQV9SRUFEX0FCT1JUKQorCQkJCQkgKi8KKyNkZWZpbmUgSUxMRUdBTF9PUF9DT0RFICAgICAgICAgMHgxMDAwICAvKiBJbGxlZ2FsIG9wZXJhdGlvbiBjb2RlIGluIHRoZQorCQkJCQkgKiB0aGUgYWRhcHRlcnMgZmlybXdhcmUgUGFybVswXS0yOgorCQkJCQkgKiBjb21tdW5pY2F0aW9ucyBwcm9jZXNzb3IgcmVnaXN0ZXJzCisJCQkJCSAqIFIxMy1SMTUuCisJCQkJCSAqLworI2RlZmluZSBQQVJJVFlfRVJST1JTICAgICAgICAgICAweDA4MDAgIC8qIEFkYXB0ZXIgZGV0ZWN0cyBpbnRlcm5hbCBidXMKKwkJCQkJICogcGFyaXR5IGVycm9yLgorCQkJCQkgKi8KKyNkZWZpbmUgUkFNX0RBVEFfRVJST1IgICAgICAgICAgMHgwMDgwICAvKiBWYWxpZCBvbmx5IGR1cmluZyBSQU0gdGVzdGluZzsKKwkJCQkJICogUkFNIGRhdGEgZXJyb3IgUGFybVswLTFdOiAzMiBiaXQKKwkJCQkJICogcG9pbnRlciB0byBSQU0gbG9jYXRpb24uCisJCQkJCSAqLworI2RlZmluZSBSQU1fUEFSSVRZX0VSUk9SICAgICAgICAweDAwNDAgIC8qIFZhbGlkIG9ubHkgZHVyaW5nIFJBTSB0ZXN0aW5nOworCQkJCQkgKiBSQU0gcGFyaXR5IGVycm9yIFBhcm1bMC0xXTogMzIgYml0CisJCQkJCSAqIHBvaW50ZXIgdG8gUkFNIGxvY2F0aW9uLgorCQkJCQkgKi8KKyNkZWZpbmUgUklOR19VTkRFUlJVTiAgICAgICAgICAgMHgwMDIwICAvKiBJbnRlcm5hbCBETUEgdW5kZXJydW4gd2hlbgorCQkJCQkgKiB0cmFuc21pdHRpbmcgb250byByaW5nLgorCQkJCQkgKi8KKyNkZWZpbmUgSU5WQUxJRF9JUlEgICAgICAgICAgICAgMHgwMDA4ICAvKiBVbnJlY29nbml6ZWQgaW50ZXJydXB0IGdlbmVyYXRlZAorCQkJCQkgKiBpbnRlcm5hbCB0byBhZGFwdGVyIFBhcm1bMC0yXToKKwkJCQkJICogYWRhcHRlciByZWdpc3RlciBSMTMtUjE1LgorCQkJCQkgKi8KKyNkZWZpbmUgSU5WQUxJRF9FUlJPUl9JUlEgICAgICAgMHgwMDA0ICAvKiBVbnJlY29nbml6ZWQgZXJyb3IgaW50ZXJydXB0CisJCQkJCSAqIGdlbmVyYXRlZCBQYXJtWzAtMl06IGFkYXB0ZXIgcmVnaXN0ZXIKKwkJCQkJICogUjEzLVIxNS4KKwkJCQkJICovCisjZGVmaW5lIElOVkFMSURfWE9QICAgICAgICAgICAgIDB4MDAwMiAgLyogVW5yZWNvZ25pemVkIFhPUCByZXF1ZXN0IGluCisJCQkJCSAqIGNvbW11bmljYXRpb24gcHJvY2Vzc29yIFBhcm1bMC0yXToKKwkJCQkJICogYWRhcHRlciByZWdpc3RlciBSMTMtUjE1LgorCQkJCQkgKi8KKyNkZWZpbmUgQ0hFQ0tBRERSICAgICAgICAgICAgICAgMHgwNUUwICAvKiBBZGFwdGVyIGNoZWNrIHN0YXR1cyBpbmZvcm1hdGlvbgorCQkJCQkgKiBhZGRyZXNzIG9mZnNldC4KKwkJCQkJICovCisjZGVmaW5lIFJPTV9QQUdFXzAgICAgICAgICAgICAgIDB4MDAwMCAgLyogQWRhcHRlciBST00gcGFnZSAwLiAqLworCisvKgorICogUkVDRUlWRS5TVEFUVVMgaW50ZXJydXB0IHJlc3VsdCBTU0IgdmFsdWVzOiAoaGlnaC1sb3cpCisgKiAoUkVDRUlWRV9DT01QTEVURSBmaWVsZCBiaXQgZGVmaW5pdGlvbnMgaW4gU1NCLlBhcm1bMF0pCisgKi8KKyNkZWZpbmUgUlhfQ09NUExFVEUgICAgICAgICAgICAgMHgwMDgwICAvKiBTU0IuUGFybVswXTsgU1NCLlBhcm1bMV06IDMyCisJCQkJCSAqIGJpdCBwb2ludGVyIHRvIGxhc3QgUlBMLgorCQkJCQkgKi8KKyNkZWZpbmUgUlhfU1VTUEVOREVEICAgICAgICAgICAgMHgwMDQwICAvKiBTU0IuUGFybVswXTsgU1NCLlBhcm1bMV06IDMyCisJCQkJCSAqIGJpdCBwb2ludGVyIHRvIFJQTCB3aXRoIG9kZAorCQkJCQkgKiBmb3J3YXJkIHBvaW50ZXIuCisJCQkJCSAqLworCisvKiBWYWxpZCByZWNlaXZlIENTVEFUOiAqLworI2RlZmluZSBSWF9GUkFNRV9DT05UUk9MX0JJVFMgKFJYX1ZBTElEIHwgUlhfU1RBUlRfRlJBTUUgfCBSWF9FTkRfRlJBTUUgfCBcCisJCQkgICAgICAgUlhfRlJBTUVfQ09NUExFVEUpCisjZGVmaW5lIFZBTElEX1NJTkdMRV9CVUZGRVJfRlJBTUUgKFJYX1NUQVJUX0ZSQU1FIHwgUlhfRU5EX0ZSQU1FIHwgXAorCQkJCSAgIFJYX0ZSQU1FX0NPTVBMRVRFKQorCit0eXBlZGVmIGVudW0gU0tCX1NUQVQgU0tCX1NUQVQ7CitlbnVtIFNLQl9TVEFUIHsKKwlTS0JfVU5BVkFJTEFCTEUsCisJU0tCX0RNQV9ESVJFQ1QsCisJU0tCX0RBVEFfQ09QWQorfTsKKworLyogUmVjZWl2ZSBQYXJhbWV0ZXIgTGlzdCAoUlBMKSBUaGUgbGVuZ3RoIG9mIHRoZSBSUExzIGhhcyB0byBiZSBpbml0aWFsaXplZCAKKyAqIGluIHRoZSBPUEwuIChPUEVOIHBhcmFtZXRlciBsaXN0KQorICovCisjZGVmaW5lIFJQTF9OVU0JCTMKKworI2RlZmluZSBSWF9GUkFHX05VTSAgICAgMQkvKiBNYXhpbWFsIG51bWJlciBvZiB1c2VkIGZyYWdtZW50cyBpbiBvbmUgUlBMLgorCQkJCSAqICh1cCB0byBmaXJtd2FyZSB2Mi4yNDogMywgbm93OiB1cCB0byA5KQorCQkJCSAqLworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHNfUlBMIFJQTDsKK3N0cnVjdCBzX1JQTCB7CS8qIFJlY2VpdmUgUGFyYW1ldGVyIExpc3QgKi8KKwl1X2ludDMyX3QgTmV4dFJQTEFkZHI7CQkvKiBQb2ludGVyIHRvIG5leHQgUlBMIGluIGNoYWluCisJCQkJCSAqIChub3JtYWxpemVkID0gcGh5c2ljYWwgMzIgYml0CisJCQkJCSAqIGFkZHJlc3MpIGlmIHBvaW50ZXIgaXMgb2RkOiB0aGlzCisJCQkJCSAqIGlzIGxhc3QgUlBMLiBQb2ludGluZyB0byBpdHNlbGYgY2FuCisJCQkJCSAqIGNhdXNlIHByb2JsZW1zIQorCQkJCQkgKi8KKwl2b2xhdGlsZSB1X2ludDE2X3QgU3RhdHVzOwkvKiBTZXQgYnkgY3JlYXRpb24gb2YgUmVjZWl2ZSBQYXJhbWV0ZXIKKwkJCQkJICogTGlzdCBSRUNFSVZFX0NTVEFUX0NPTVBMRVRFIHNldCBieQorCQkJCQkgKiBhZGFwdGVyIGluIGxpc3RzIHRoYXQgc3RhcnQgb3IgZW5kCisJCQkJCSAqIGEgZnJhbWUuCisJCQkJCSAqLworCXZvbGF0aWxlIHVfaW50MTZfdCBGcmFtZVNpemU7CSAvKiBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgYXMgYQorCQkJCQkgKiBmcmFtZSBpbmNsdWRpbmcgQUMvRkMsIERlc3RpbmF0aW9uLAorCQkJCQkgKiBTb3VyY2UsIFJvdXRpbmcgZmllbGQgbm90IGluY2x1ZGluZyAKKwkJCQkJICogQ1JDLCBGUyAoRnJhbWUgU3RhdHVzKSwgRW5kIERlbGltaXRlcgorCQkJCQkgKiAodmFsaWQgb25seSBpZiBTVEFSVF9GUkFNRSBiaXQgaW4gCisJCQkJCSAqIENTVEFUIG5vbnplcm8pIG11c3Qgbm90IGJlIHplcm8gaW4KKwkJCQkJICogYW55IGxpc3Q7IG1heGltdW0gdmFsdWU6IChCVUZGRVJfU0laRQorCQkJCQkgKiAtIDgpICogVFhfQlVGX01BWCBzdW0gb2YgRGF0YUNvdW50CisJCQkJCSAqIHZhbHVlcyBpbiBGcmFnbWVudExpc3QgbXVzdCBlcXVhbAorCQkJCQkgKiBGcmFtZV9TaXplIHZhbHVlIGluIFNUQVJUX0ZSQU1FIFRQTCEKKwkJCQkJICogZnJhbWUgZGF0YSBmcmFnbWVudCBsaXN0CisJCQkJCSAqLworCisJLyogVFBML1JQTCBzaXplIGluIE9QRU4gcGFyYW1ldGVyIGxpc3QgZGVwZW5kaW5nIG9uIG1heGltYWwgbnVtYmVycworCSAqIG9mIGZyYWdtZW50cyB1c2VkIGluIG9uZSBwYXJhbWV0ZXIgbGlzdC4KKwkgKi8KKwlGcmFnbWVudCBGcmFnTGlzdFtSWF9GUkFHX05VTV07CS8qIE1heGltdW06IG5pbmUgZnJhbWUgZnJhZ21lbnRzIGluCisJCQkJCSAqIG9uZSBUUEwuIEFjdHVhbCB2ZXJzaW9uIG9mIGZpcm13YXJlOgorCQkJCQkgKiA5IGZyYWdtZW50cyBwb3NzaWJsZS4KKwkJCQkJICovCisjcHJhZ21hIHBhY2soKQorCisJLyogU3BlY2lhbCBwcm9wcmlldGFyeSBkYXRhIGFuZCBwcmVjYWxjdWxhdGlvbnMuICovCisJUlBMICpOZXh0UlBMUHRyOwkvKiBMb2dpY2FsIHBvaW50ZXIgdG8gbmV4dCBSUEwgaW4gY2hhaW4uICovCisJdW5zaWduZWQgY2hhciAqTURhdGE7CisJc3RydWN0IHNrX2J1ZmYgKlNrYjsKKwlTS0JfU1RBVCBTa2JTdGF0OworCWludCBSUExJbmRleDsKKwlkbWFfYWRkcl90IERNQUJ1ZmY7CQkvKiBETUEgSU8gYnVzIGFkZHJlc3MgZnJvbSBwY2lfbWFwICovCit9OworCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3R5cGVkZWYgc3RydWN0IG5ldF9sb2NhbCB7CisjcHJhZ21hIHBhY2soMSkKKwlJUEIgaXBiOwkvKiBJbml0aWFsaXphdGlvbiBQYXJhbWV0ZXIgQmxvY2suICovCisJU0NCIHNjYjsJLyogU3lzdGVtIENvbW1hbmQgQmxvY2s6IHN5c3RlbSB0byBhZGFwdGVyIAorCQkJICogY29tbXVuaWNhdGlvbi4KKwkJCSAqLworCVNTQiBzc2I7CS8qIFN5c3RlbSBTdGF0dXMgQmxvY2s6IGFkYXB0ZXIgdG8gc3lzdGVtIAorCQkJICogY29tbXVuaWNhdGlvbi4KKwkJCSAqLworCU9QQiBvY3BsOwkvKiBPcGVuIE9wdGlvbnMgUGFyYW1ldGVyIEJsb2NrLiAqLworCisJRVJST1JUQUIgZXJyb3Jsb2d0YWJsZTsJLyogQWRhcHRlciBzdGF0aXN0aWMgZXJyb3IgY291bnRlcnMuCisJCQkJICogKHJlYWQgZnJvbSBhZGFwdGVyIG1lbW9yeSkKKwkJCQkgKi8KKwl1bnNpZ25lZCBjaGFyIFByb2R1Y3RJRFtQUk9EX0lEX1NJWkUgKyAxXTsgLyogUHJvZHVjdCBJRCAqLworI3ByYWdtYSBwYWNrKCkKKworCVRQTCBUcGxbVFBMX05VTV07CisJVFBMICpUcGxGcmVlOworCVRQTCAqVHBsQnVzeTsKKwl1bnNpZ25lZCBjaGFyIExvY2FsVHhCdWZmZXJzW1RQTF9OVU1dW0RFRkFVTFRfUEFDS0VUX1NJWkVdOworCisJUlBMIFJwbFtSUExfTlVNXTsKKwlSUEwgKlJwbEhlYWQ7CisJUlBMICpScGxUYWlsOworCXVuc2lnbmVkIGNoYXIgTG9jYWxSeEJ1ZmZlcnNbUlBMX05VTV1bREVGQVVMVF9QQUNLRVRfU0laRV07CisKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlpbnQgRGF0YVJhdGU7CisJdW5zaWduZWQgY2hhciBTY2JJblVzZTsKKwl1bnNpZ25lZCBzaG9ydCBDTURxdWV1ZTsKKworCXVuc2lnbmVkIGxvbmcgQWRhcHRlck9wZW5GbGFnOjE7CisJdW5zaWduZWQgbG9uZyBBZGFwdGVyVmlydE9wZW5GbGFnOjE7CisJdW5zaWduZWQgbG9uZyBPcGVuQ29tbWFuZElzc3VlZDoxOworCXVuc2lnbmVkIGxvbmcgVHJhbnNtaXRDb21tYW5kQWN0aXZlOjE7CisJdW5zaWduZWQgbG9uZyBUcmFuc21pdEhhbHRTY2hlZHVsZWQ6MTsKKwl1bnNpZ25lZCBsb25nIEhhbHRJblByb2dyZXNzOjE7CisJdW5zaWduZWQgbG9uZyBMb2JlV2lyZUZhdWx0TG9nZ2VkOjE7CisJdW5zaWduZWQgbG9uZyBSZU9wZW5JblByb2dyZXNzOjE7CisJdW5zaWduZWQgbG9uZyBTbGVlcGluZzoxOworCisJdW5zaWduZWQgbG9uZyBMYXN0T3BlblN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBDdXJyZW50UmluZ1N0YXR1czsKKwl1bnNpZ25lZCBsb25nIE1heFBhY2tldFNpemU7CisJCisJdW5zaWduZWQgbG9uZyBTdGFydFRpbWU7CisJdW5zaWduZWQgbG9uZyBMYXN0U2VuZFRpbWU7CisKKwlzdHJ1Y3QgdHJfc3RhdGlzdGljcyBNYWNTdGF0OwkvKiBNQUMgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgKi8KKworCXVuc2lnbmVkIGxvbmcgZG1hbGltaXQ7IC8qIHRoZSBtYXggRE1BIGFkZHJlc3MgKGllLCBJU0EpICovCisJZG1hX2FkZHJfdCAgICBkbWFidWZmZXI7IC8qIHRoZSBETUEgYnVzIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0bworCQkJCSAgICBwcml2LiBNaWdodCBiZSBkaWZmZXJlbnQgZnJvbSB2aXJ0X3RvX2J1cygpCisJCQkJICAgIGZvciBhcmNoaXRlY3R1cmVzIHdpdGggSU8gTU1VIChBbHBoYSkgKi8KKworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCisJd2FpdF9xdWV1ZV9oZWFkX3QgIHdhaXRfZm9yX3Rva19pbnQ7CisKKwlJTlRQVFJTIGludHB0cnM7CS8qIEludGVybmFsIGFkYXB0ZXIgcG9pbnRlci4gTXVzdCBiZSByZWFkCisJCQkJICogYmVmb3JlIE9QRU4gY29tbWFuZC4KKwkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydCAoKnNldG5zZWxvdXQpKHN0cnVjdCBuZXRfZGV2aWNlICopOworCXVuc2lnbmVkIHNob3J0ICgqc2lmcmVhZGIpKHN0cnVjdCBuZXRfZGV2aWNlICosIHVuc2lnbmVkIHNob3J0KTsKKwl2b2lkICgqc2lmd3JpdGViKShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworCXVuc2lnbmVkIHNob3J0ICgqc2lmcmVhZHcpKHN0cnVjdCBuZXRfZGV2aWNlICosIHVuc2lnbmVkIHNob3J0KTsKKwl2b2lkICgqc2lmd3JpdGV3KShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworCisJc3BpbmxvY2tfdCBsb2NrOyAgICAgICAgICAgICAgICAvKiBTTVAgcHJvdGVjdGlvbiAqLworCXZvaWQgKnRtc3ByaXY7Cit9IE5FVF9MT0NBTDsKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfX0xJTlVYX1RNUzM4MFRSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXNwY2kuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXNwY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2RkYjVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3Rtc3BjaS5jCkBAIC0wLDAgKzEsMjY3IEBACisvKgorICogIHRtc3BjaS5jOiBBIGdlbmVyaWMgbmV0d29yayBkcml2ZXIgZm9yIFRNUzM4MC1iYXNlZCBQQ0kgdG9rZW4gcmluZyBjYXJkcy4KKyAqCisgKiAgV3JpdHRlbiAxOTk5IGJ5IEFkYW0gRnJpdHpsZXIKKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogIFRoaXMgZHJpdmVyIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNhcmRzOgorICoJLSBTeXNLb25uZWN0IFRSNC8xNigrKSBQQ0kJKFNLLTQ1OTApCisgKgktIFN5c0tvbm5lY3QgVFI0LzE2IFBDSQkJKFNLLTQ1OTEpCisgKiAgICAgIC0gQ29tcGFxIFRSIDQvMTYgUENJCisgKiAgICAgIC0gVGhvbWFzLUNvbnJhZCBUQzQwNDggNC8xNiBQQ0kgCisgKiAgICAgIC0gM0NvbSAzQzMzOSBUb2tlbiBMaW5rIFZlbG9jaXR5CisgKgorICogIE1haW50YWluZXIocyk6CisgKiAgICBBRglBZGFtIEZyaXR6bGVyCQltaWRAYXVrLmN4CisgKgorICogIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorICoJMzAtRGVjLTk5CUFGCVNwbGl0IG9mZiBmcm9tIHRoZSB0bXMzODB0ciBkcml2ZXIuCisgKgkyMi1KYW4tMDAJQUYJVXBkYXRlZCB0byB1c2UgaW5kaXJlY3QgcmVhZC93cml0ZXMKKyAqCTIzLU5vdi0wMAlKRwlOZXcgUENJIEFQSSwgY2xlYW51cHMKKyAqCisgKiAgVE9ETzoKKyAqCTEuIFNlZSBpZiB3ZSBjYW4gdXNlIE1NSU8gaW5zdGVhZCBvZiBwb3J0IGFjY2Vzc2VzCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgInRtczM4MHRyLmgiCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKyJ0bXNwY2kuYzogdjEuMDIgMjMvMTEvMjAwMCBieSBBZGFtIEZyaXR6bGVyXG4iOworCisjZGVmaW5lIFRNU19QQ0lfSU9fRVhURU5UIDMyCisKK3N0cnVjdCBjYXJkX2luZm8geworCXVuc2lnbmVkIGNoYXIgbnNlbG91dFsyXTsgLyogTlNFTE9VVCB2YWxzIGZvciA0bWIoWzBdKSBhbmQgMTZtYihbMV0pICovCisJY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2FyZF9pbmZvIGNhcmRfaW5mb190YWJsZVtdID0geworCXsgezB4MDMsIDB4MDF9LCAiQ29tcGFxIDQvMTYgVFIgUENJIn0sCisJeyB7MHgwMywgMHgwMX0sICJTSyBORVQgVFIgNC8xNiBQQ0kifSwKKwl7IHsweDAzLCAweDAxfSwgIlRob21hcy1Db25yYWQgVEM0MDQ4IFBDSSA0LzE2In0sCisJeyB7MHgwMywgMHgwMX0sICIzQ29tIFRva2VuIExpbmsgVmVsb2NpdHkifSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0bXNwY2lfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX1RPS0VOUklORywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULCBQQ0lfREVWSUNFX0lEX1NZU0tPTk5FQ1RfVFIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEgfSwKKwl7IFBDSV9WRU5ET1JfSURfVENPTlJBRCwgUENJX0RFVklDRV9JRF9UQ09OUkFEX1RPS0VOUklORywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMiB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0MzMzksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDMgfSwKKwl7IH0JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0bXNwY2lfcGNpX3RibCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHZvaWQgdG1zX3BjaV9yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0bXNfcGNpX3NldG5zZWxvdXRfcGlucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHRtc19wY2lfc2lmcmVhZGIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXJldHVybiBpbmIoZGV2LT5iYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdG1zX3BjaV9zaWZyZWFkdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJcmV0dXJuIGludyhkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHRtc19wY2lfc2lmd3JpdGViKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCW91dGIodmFsLCBkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHRtc19wY2lfc2lmd3JpdGV3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCW91dHcodmFsLCBkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRtc19wY2lfYXR0YWNoKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQorewkKKwlzdGF0aWMgaW50IHZlcnNpb25wcmludGVkOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldF9sb2NhbCAqdHA7CisJaW50IGksIHJldDsKKwl1bnNpZ25lZCBpbnQgcGNpX2lycV9saW5lOworCXVuc2lnbmVkIGxvbmcgcGNpX2lvYWRkcjsKKwlzdHJ1Y3QgY2FyZF9pbmZvICpjYXJkaW5mbyA9ICZjYXJkX2luZm9fdGFibGVbZW50LT5kcml2ZXJfZGF0YV07CisJCQorCWlmICh2ZXJzaW9ucHJpbnRlZCsrID09IDApCisJCXByaW50aygiJXMiLCB2ZXJzaW9uKTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBSZW1vdmUgSS9PIHNwYWNlIG1hcmtlciBpbiBiaXQgMC4gKi8KKwlwY2lfaXJxX2xpbmUgPSBwZGV2LT5pcnE7CisJcGNpX2lvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCk7CisKKwkvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgZm91bmQgYSB2YWxpZCBjYXJkLiAqLworCWRldiA9IGFsbG9jX3RyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmICghcmVxdWVzdF9yZWdpb24ocGNpX2lvYWRkciwgVE1TX1BDSV9JT19FWFRFTlQsIGRldi0+bmFtZSkpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9vdXRfdHJkZXY7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCB0bXMzODB0cl9pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJICBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfb3V0X3JlZ2lvbjsKKworCWRldi0+YmFzZV9hZGRyCT0gcGNpX2lvYWRkcjsKKwlkZXYtPmlycSAJPSBwY2lfaXJxX2xpbmU7CisJZGV2LT5kbWEJPSAwOworCisJcHJpbnRrKCIlczogJXNcbiIsIGRldi0+bmFtZSwgY2FyZGluZm8tPm5hbWUpOworCXByaW50aygiJXM6ICAgIElPOiAlIzRseCAgSVJROiAlZFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCQkKKwl0bXNfcGNpX3JlYWRfZWVwcm9tKGRldik7CisKKwlwcmludGsoIiVzOiAgICBSaW5nIFN0YXRpb24gQWRkcmVzczogIiwgZGV2LT5uYW1lKTsKKwlwcmludGsoIiUyLjJ4IiwgZGV2LT5kZXZfYWRkclswXSk7CisJZm9yIChpID0gMTsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCI6JTIuMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIlxuIik7CisJCQorCXJldCA9IHRtc2Rldl9pbml0KGRldiwgUENJX01BWF9BRERSRVNTLCBwZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50aygiJXM6IHVuYWJsZSB0byBnZXQgbWVtb3J5IGZvciBkZXYtPnByaXYuXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIGVycl9vdXRfaXJxOworCX0KKworCXRwID0gZGV2LT5wcml2OworCXRwLT5zZXRuc2Vsb3V0ID0gdG1zX3BjaV9zZXRuc2Vsb3V0X3BpbnM7CisJCQorCXRwLT5zaWZyZWFkYiA9IHRtc19wY2lfc2lmcmVhZGI7CisJdHAtPnNpZnJlYWR3ID0gdG1zX3BjaV9zaWZyZWFkdzsKKwl0cC0+c2lmd3JpdGViID0gdG1zX3BjaV9zaWZ3cml0ZWI7CisJdHAtPnNpZndyaXRldyA9IHRtc19wY2lfc2lmd3JpdGV3OworCQkKKwltZW1jcHkodHAtPlByb2R1Y3RJRCwgY2FyZGluZm8tPm5hbWUsIFBST0RfSURfU0laRSArIDEpOworCisJdHAtPnRtc3ByaXYgPSBjYXJkaW5mbzsKKworCWRldi0+b3BlbiA9IHRtczM4MHRyX29wZW47CisJZGV2LT5zdG9wID0gdG1zMzgwdHJfY2xvc2U7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dF90bXNkZXY7CisJCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfdG1zZGV2OgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwl0bXNkZXZfdGVybShkZXYpOworZXJyX291dF9pcnE6CisJZnJlZV9pcnEocGRldi0+aXJxLCBkZXYpOworZXJyX291dF9yZWdpb246CisJcmVsZWFzZV9yZWdpb24ocGNpX2lvYWRkciwgVE1TX1BDSV9JT19FWFRFTlQpOworZXJyX291dF90cmRldjoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWFkcyBNQUMgYWRkcmVzcyBmcm9tIGFkYXB0ZXIgUkFNLCB3aGljaCBzaG91bGQndmUgcmVhZCBpdCBmcm9tCisgKiB0aGUgb25ib2FyZCBST00uICAKKyAqCisgKiBDYWxsaW5nIHRoaXMgb24gYSBib2FyZCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgaXQgY2FuIGJlIGEgdmVyeQorICogZGFuZ2Vyb3VzIHRoaW5nLiAgVGhlIE1hZGdlIGJvYXJkLCBmb3IgaW5zdGFuY2UsIHdpbGwgbG9jayB5b3VyCisgKiBtYWNoaW5lIGhhcmQgd2hlbiB0aGlzIGlzIGNhbGxlZC4gIEx1Y2tpbHksIGl0cyBzdXBwb3J0ZWQgaW4gYQorICogc2VwYXJhdGUgZHJpdmVyLiAgLS1BU0YKKyAqLworc3RhdGljIHZvaWQgdG1zX3BjaV9yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCQorCS8qIEFkZHJlc3M6IDAwMDA6MDAwMCAqLworCXRtc19wY2lfc2lmd3JpdGV3KGRldiwgMCwgU0lGQURYKTsKKwl0bXNfcGNpX3NpZndyaXRldyhkZXYsIDAsIFNJRkFEUik7CQorCQorCS8qIFJlYWQgc2l4IGJ5dGUgTUFDIGFkZHJlc3MgZGF0YSAqLworCWRldi0+YWRkcl9sZW4gPSA2OworCWZvcihpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IHRtc19wY2lfc2lmcmVhZHcoZGV2LCBTSUZJTkMpID4+IDg7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0bXNfcGNpX3NldG5zZWxvdXRfcGlucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IHZhbCA9IDA7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBkZXYtPnByaXY7CisJc3RydWN0IGNhcmRfaW5mbyAqY2FyZGluZm8gPSB0cC0+dG1zcHJpdjsKKyAgCisJaWYodHAtPkRhdGFSYXRlID09IFNQRUVEXzQpCisJCXZhbCB8PSBjYXJkaW5mby0+bnNlbG91dFswXTsJLyogU2V0IDRNYnBzICovCisJZWxzZQorCQl2YWwgfD0gY2FyZGluZm8tPm5zZWxvdXRbMV07CS8qIFNldCAxNk1icHMgKi8KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdG1zX3BjaV9kZXRhY2ggKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoIWRldikKKwkJQlVHKCk7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgVE1TX1BDSV9JT19FWFRFTlQpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXRtc2Rldl90ZXJtKGRldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB0bXNfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAidG1zcGNpIiwKKwkuaWRfdGFibGUJPSB0bXNwY2lfcGNpX3RibCwKKwkucHJvYmUJCT0gdG1zX3BjaV9hdHRhY2gsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh0bXNfcGNpX2RldGFjaCksCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0bXNfcGNpX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnRtc19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRtc19wY2lfcm1tb2QgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmdG1zX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0bXNfcGNpX2luaXQpOworbW9kdWxlX2V4aXQodG1zX3BjaV9ybW1vZCk7CisKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVkVSU0lPTlMgIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgdG1zcGNpLmMiCisgKiAgYWx0LWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIHRtc3BjaS5jIgorICogIGMtc2V0LXN0eWxlICJLJlIiCisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC8yMTE0Mi5jIGIvZHJpdmVycy9uZXQvdHVsaXAvMjExNDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGI2OTRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvMjExNDIuYwpAQCAtMCwwICsxLDI0NSBAQAorLyoKKwlkcml2ZXJzL25ldC90dWxpcC8yMTE0Mi5jCisKKwlNYWludGFpbmVkIGJ5IEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKwlDb3B5cmlnaHQgMjAwMCwyMDAxICBUaGUgTGludXggS2VybmVsIFRlYW0KKwlXcml0dGVuL2NvcHlyaWdodCAxOTk0LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJUGxlYXNlIHJlZmVyIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay90dWxpcC11c2VyLntwZGYscHMsaHRtbH0KKwlmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGRyaXZlciwgb3IgdmlzaXQgdGhlIHByb2plY3QKKwlXZWIgcGFnZSBhdCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3R1bGlwLworCisqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJ0dWxpcC5oIgorCisKK3N0YXRpYyB1MTYgdDIxMTQyX2NzcjEzW10gPSB7IDB4MDAwMSwgMHgwMDA5LCAweDAwMDksIDB4MDAwMCwgMHgwMDAxLCB9OwordTE2IHQyMTE0Ml9jc3IxNFtdID0JICAgIHsgMHhGRkZGLCAweDA3MDUsIDB4MDcwNSwgMHgwMDAwLCAweDdGM0QsIH07CitzdGF0aWMgdTE2IHQyMTE0Ml9jc3IxNVtdID0geyAweDAwMDgsIDB4MDAwNiwgMHgwMDBFLCAweDAwMDgsIDB4MDAwOCwgfTsKKworCisvKiBIYW5kbGUgdGhlIDIxMTQzIHVuaXF1ZWx5OiBkbyBhdXRvc2VsZWN0IHdpdGggTldheSwgbm90IHRoZSBFRVBST00gbGlzdAorICAgb2YgYXZhaWxhYmxlIHRyYW5zY2VpdmVycy4gICovCit2b2lkIHQyMTE0Ml90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJaW50IGNzcjEyID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpOworCWludCBuZXh0X3RpY2sgPSA2MCpIWjsKKwlpbnQgbmV3X2NzcjYgPSAwOworCisJaWYgKHR1bGlwX2RlYnVnID4gMikKKwkJcHJpbnRrKEtFUk5fSU5GTyIlczogMjExNDMgbmVnb3RpYXRpb24gc3RhdHVzICU4Ljh4LCAlcy5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGNzcjEyLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSk7CisJaWYgKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworCQlpZiAodHVsaXBfY2hlY2tfZHVwbGV4KGRldikgPCAwKSB7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJbmV4dF90aWNrID0gMypIWjsKKwkJfSBlbHNlIHsKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJCW5leHRfdGljayA9IDYwKkhaOworCQl9CisJfSBlbHNlIGlmICh0cC0+bndheXNldCkgeworCQkvKiBEb24ndCBzY3JldyB1cCBhIG5lZ290aWF0ZWQgc2Vzc2lvbiEgKi8KKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8iJXM6IFVzaW5nIE5XYXktc2V0ICVzIG1lZGlhLCBjc3IxMiAlOC44eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgY3NyMTIpOworCX0gZWxzZSBpZiAodHAtPm1lZGlhbG9jaykgeworCQkJOworCX0gZWxzZSBpZiAoZGV2LT5pZl9wb3J0ID09IDMpIHsKKwkJaWYgKGNzcjEyICYgMikgewkvKiBObyAxMDBtYnBzIGxpbmsgYmVhdCwgcmV2ZXJ0IHRvIDEwbWJwcy4gKi8KKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogTm8gMjExNDMgMTAwYmFzZVR4IGxpbmsgYmVhdCwgJTguOHgsICIKKwkJCQkJICAgInRyeWluZyBOV2F5LlxuIiwgZGV2LT5uYW1lLCBjc3IxMik7CisJCQl0MjExNDJfc3RhcnRfbndheShkZXYpOworCQkJbmV4dF90aWNrID0gMypIWjsKKwkJfQorCX0gZWxzZSBpZiAoKGNzcjEyICYgMHg3MDAwKSAhPSAweDUwMDApIHsKKwkJLyogTmVnb3RpYXRpb24gZmFpbGVkLiAgU2VhcmNoIG1lZGlhIHR5cGVzLiAqLworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogMjExNDMgbmVnb3RpYXRpb24gZmFpbGVkLCBzdGF0dXMgJTguOHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgY3NyMTIpOworCQlpZiAoIShjc3IxMiAmIDQpKSB7CQkvKiAxMG1icHMgbGluayBiZWF0IGdvb2QuICovCisJCQluZXdfY3NyNiA9IDB4ODI0MjAwMDA7CisJCQlkZXYtPmlmX3BvcnQgPSAwOworCQkJaW93cml0ZTMyKDAsIGlvYWRkciArIENTUjEzKTsKKwkJCWlvd3JpdGUzMigweDAwMDNGRkZGLCBpb2FkZHIgKyBDU1IxNCk7CisJCQlpb3dyaXRlMTYodDIxMTQyX2NzcjE1W2Rldi0+aWZfcG9ydF0sIGlvYWRkciArIENTUjE1KTsKKwkJCWlvd3JpdGUzMih0MjExNDJfY3NyMTNbZGV2LT5pZl9wb3J0XSwgaW9hZGRyICsgQ1NSMTMpOworCQl9IGVsc2UgeworCQkJLyogU2VsZWN0IDEwMG1icHMgcG9ydCB0byBjaGVjayBmb3IgbGluayBiZWF0LiAqLworCQkJbmV3X2NzcjYgPSAweDgzODYwMDAwOworCQkJZGV2LT5pZl9wb3J0ID0gMzsKKwkJCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBDU1IxMyk7CisJCQlpb3dyaXRlMzIoMHgwMDAzRkY3RiwgaW9hZGRyICsgQ1NSMTQpOworCQkJaW93cml0ZTE2KDgsIGlvYWRkciArIENTUjE1KTsKKwkJCWlvd3JpdGUzMigxLCBpb2FkZHIgKyBDU1IxMyk7CisJCX0KKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8iJXM6IFRlc3RpbmcgbmV3IDIxMTQzIG1lZGlhICVzLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdKTsKKwkJaWYgKG5ld19jc3I2ICE9ICh0cC0+Y3NyNiAmIH4weDAwRDUpKSB7CisJCQl0cC0+Y3NyNiAmPSAweDAwRDU7CisJCQl0cC0+Y3NyNiB8PSBuZXdfY3NyNjsKKwkJCWlvd3JpdGUzMigweDAzMDEsIGlvYWRkciArIENTUjEyKTsKKwkJCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisJCX0KKwkJbmV4dF90aWNrID0gMypIWjsKKwl9CisKKwkvKiBtb2RfdGltZXIgc3luY2hyb25pemVzIHVzIHdpdGggcG90ZW50aWFsIGFkZF90aW1lciBjYWxscworCSAqIGZyb20gaW50ZXJydXB0cy4KKwkgKi8KKwltb2RfdGltZXIoJnRwLT50aW1lciwgUlVOX0FUKG5leHRfdGljaykpOworfQorCisKK3ZvaWQgdDIxMTQyX3N0YXJ0X253YXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlpbnQgY3NyMTQgPSAoKHRwLT5zeW1fYWR2ZXJ0aXNlICYgMHgwNzgwKSA8PCA5KSAgfAorCQkoKHRwLT5zeW1fYWR2ZXJ0aXNlICYgMHgwMDIwKSA8PCAxKSB8IDB4ZmZiZjsKKworCWRldi0+aWZfcG9ydCA9IDA7CisJdHAtPm53YXkgPSB0cC0+bWVkaWFzZW5zZSA9IDE7CisJdHAtPm53YXlzZXQgPSB0cC0+bHBhciA9IDA7CisJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZXN0YXJ0aW5nIDIxMTQzIGF1dG9uZWdvdGlhdGlvbiwgY3NyMTQ9JTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBjc3IxNCk7CisJaW93cml0ZTMyKDB4MDAwMSwgaW9hZGRyICsgQ1NSMTMpOworCXVkZWxheSgxMDApOworCWlvd3JpdGUzMihjc3IxNCwgaW9hZGRyICsgQ1NSMTQpOworCXRwLT5jc3I2ID0gMHg4MjQyMDAwMCB8ICh0cC0+c3ltX2FkdmVydGlzZSAmIDB4MDA0MCA/IEZ1bGxEdXBsZXggOiAwKTsKKwlpb3dyaXRlMzIodHAtPmNzcjYsIGlvYWRkciArIENTUjYpOworCWlmICh0cC0+bXRhYmxlICAmJiAgdHAtPm10YWJsZS0+Y3NyMTVkaXIpIHsKKwkJaW93cml0ZTMyKHRwLT5tdGFibGUtPmNzcjE1ZGlyLCBpb2FkZHIgKyBDU1IxNSk7CisJCWlvd3JpdGUzMih0cC0+bXRhYmxlLT5jc3IxNXZhbCwgaW9hZGRyICsgQ1NSMTUpOworCX0gZWxzZQorCQlpb3dyaXRlMTYoMHgwMDA4LCBpb2FkZHIgKyBDU1IxNSk7CisJaW93cml0ZTMyKDB4MTMwMSwgaW9hZGRyICsgQ1NSMTIpOyAJCS8qIFRyaWdnZXIgTldBWS4gKi8KK30KKworCisKK3ZvaWQgdDIxMTQyX2xua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNzcjUpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJaW50IGNzcjEyID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpOworCisJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyIlczogMjExNDMgbGluayBzdGF0dXMgaW50ZXJydXB0ICU4Ljh4LCBDU1I1ICV4LCAiCisJCQkgICAiJTguOHguXG4iLCBkZXYtPm5hbWUsIGNzcjEyLCBjc3I1LCBpb3JlYWQzMihpb2FkZHIgKyBDU1IxNCkpOworCisJLyogSWYgTldheSBmaW5pc2hlZCBhbmQgd2UgaGF2ZSBhIG5lZ290aWF0ZWQgcGFydG5lciBjYXBhYmlsaXR5LiAqLworCWlmICh0cC0+bndheSAgJiYgICF0cC0+bndheXNldCAgJiYgIChjc3IxMiAmIDB4NzAwMCkgPT0gMHg1MDAwKSB7CisJCWludCBzZXR1cF9kb25lID0gMDsKKwkJaW50IG5lZ290aWF0ZWQgPSB0cC0+c3ltX2FkdmVydGlzZSAmIChjc3IxMiA+PiAxNik7CisJCXRwLT5scGFyID0gY3NyMTIgPj4gMTY7CisJCXRwLT5ud2F5c2V0ID0gMTsKKwkJaWYgKG5lZ290aWF0ZWQgJiAweDAxMDApCQlkZXYtPmlmX3BvcnQgPSA1OworCQllbHNlIGlmIChuZWdvdGlhdGVkICYgMHgwMDgwKQlkZXYtPmlmX3BvcnQgPSAzOworCQllbHNlIGlmIChuZWdvdGlhdGVkICYgMHgwMDQwKQlkZXYtPmlmX3BvcnQgPSA0OworCQllbHNlIGlmIChuZWdvdGlhdGVkICYgMHgwMDIwKQlkZXYtPmlmX3BvcnQgPSAwOworCQllbHNlIHsKKwkJCXRwLT5ud2F5c2V0ID0gMDsKKwkJCWlmICgoY3NyMTIgJiAyKSA9PSAwICAmJiAgKHRwLT5zeW1fYWR2ZXJ0aXNlICYgMHgwMTgwKSkKKwkJCQlkZXYtPmlmX3BvcnQgPSAzOworCQl9CisJCXRwLT5mdWxsX2R1cGxleCA9ICh0dWxpcF9tZWRpYV9jYXBbZGV2LT5pZl9wb3J0XSAmIE1lZGlhQWx3YXlzRkQpID8gMTowOworCisJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpIHsKKwkJCWlmICh0cC0+bndheXNldCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogU3dpdGNoaW5nIHRvICVzIGJhc2VkIG9uIGxpbmsgIgorCQkJCQkgICAibmVnb3RpYXRpb24gJTQuNHggJiAlNC40eCA9ICU0LjR4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgdHAtPnN5bV9hZHZlcnRpc2UsCisJCQkJCSAgIHRwLT5scGFyLCBuZWdvdGlhdGVkKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQXV0b25lZ290aWF0aW9uIGZhaWxlZCwgdXNpbmcgJXMsIgorCQkJCQkgICAiIGxpbmsgYmVhdCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLCBjc3IxMik7CisJCX0KKworCQlpZiAodHAtPm10YWJsZSkgeworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgdHAtPm10YWJsZS0+bGVhZmNvdW50OyBpKyspCisJCQkJaWYgKHRwLT5tdGFibGUtPm1sZWFmW2ldLm1lZGlhID09IGRldi0+aWZfcG9ydCkgeworCQkJCQlpbnQgc3RhcnR1cCA9ICEgKCh0cC0+Y2hpcF9pZCA9PSBEQzIxMTQzICYmIHRwLT5yZXZpc2lvbiA9PSA2NSkpOworCQkJCQl0cC0+Y3VyX2luZGV4ID0gaTsKKwkJCQkJdHVsaXBfc2VsZWN0X21lZGlhKGRldiwgc3RhcnR1cCk7CisJCQkJCXNldHVwX2RvbmUgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCX0KKwkJaWYgKCAhIHNldHVwX2RvbmUpIHsKKwkJCXRwLT5jc3I2ID0gKGRldi0+aWZfcG9ydCAmIDEgPyAweDgzOEUwMDAwIDogMHg4MjQyMDAwMCkgfCAodHAtPmNzcjYgJiAweDIwZmYpOworCQkJaWYgKHRwLT5mdWxsX2R1cGxleCkKKwkJCQl0cC0+Y3NyNiB8PSAweDAyMDA7CisJCQlpb3dyaXRlMzIoMSwgaW9hZGRyICsgQ1NSMTMpOworCQl9CisjaWYgMAkJCQkJCQkvKiBSZXN0YXJ0IHNob3VsZG4ndCBiZSBuZWVkZWQuICovCisJCWlvd3JpdGUzMih0cC0+Y3NyNiB8IFJ4T24sIGlvYWRkciArIENTUjYpOworCQlpZiAodHVsaXBfZGVidWcgPiAyKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAgUmVzdGFydGluZyBUeCBhbmQgUngsIENTUjUgaXMgJTguOHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSkpOworI2VuZGlmCisJCXR1bGlwX3N0YXJ0X3J4dHgodHApOworCQlpZiAodHVsaXBfZGVidWcgPiAyKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAgU2V0dGluZyBDU1I2ICU4Ljh4LyV4IENTUjEyICU4Ljh4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHRwLT5jc3I2LCBpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSwKKwkJCQkgICBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMikpOworCX0gZWxzZSBpZiAoKHRwLT5ud2F5c2V0ICAmJiAgKGNzcjUgJiAweDA4MDAwMDAwKQorCQkJCSYmIChkZXYtPmlmX3BvcnQgPT0gMyAgfHwgIGRldi0+aWZfcG9ydCA9PSA1KQorCQkJCSYmIChjc3IxMiAmIDIpID09IDIpIHx8CisJCQkgICAodHAtPm53YXkgJiYgKGNzcjUgJiAoVFBMbmtGYWlsKSkpKSB7CisJCS8qIExpbmsgYmxldz8gTWF5YmUgcmVzdGFydCBOV2F5LiAqLworCQlkZWxfdGltZXJfc3luYygmdHAtPnRpbWVyKTsKKwkJdDIxMTQyX3N0YXJ0X253YXkoZGV2KTsKKwkJdHAtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQoMypIWik7CisJCWFkZF90aW1lcigmdHAtPnRpbWVyKTsKKwl9IGVsc2UgaWYgKGRldi0+aWZfcG9ydCA9PSAzICB8fCAgZGV2LT5pZl9wb3J0ID09IDUpIHsKKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8iJXM6IDIxMTQzICVzIGxpbmsgYmVhdCAlcy5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwKKwkJCQkgICAoY3NyMTIgJiAyKSA/ICJmYWlsZWQiIDogImdvb2QiKTsKKwkJaWYgKChjc3IxMiAmIDIpICAmJiAgISB0cC0+bWVkaWFsb2NrKSB7CisJCQlkZWxfdGltZXJfc3luYygmdHAtPnRpbWVyKTsKKwkJCXQyMTE0Ml9zdGFydF9ud2F5KGRldik7CisJCQl0cC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKKwkJCWFkZF90aW1lcigmdHAtPnRpbWVyKTsKKwkJfSBlbHNlIGlmIChkZXYtPmlmX3BvcnQgPT0gNSkKKwkJCWlvd3JpdGUzMihpb3JlYWQzMihpb2FkZHIgKyBDU1IxNCkgJiB+MHgwODAsIGlvYWRkciArIENTUjE0KTsKKwl9IGVsc2UgaWYgKGRldi0+aWZfcG9ydCA9PSAwICB8fCAgZGV2LT5pZl9wb3J0ID09IDQpIHsKKwkJaWYgKChjc3IxMiAmIDQpID09IDApCisJCQlwcmludGsoS0VSTl9JTkZPIiVzOiAyMTE0MyAxMGJhc2VUIGxpbmsgYmVhdCBnb29kLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUpOworCX0gZWxzZSBpZiAoIShjc3IxMiAmIDQpKSB7CQkvKiAxMG1icHMgbGluayBiZWF0IGdvb2QuICovCisJCWlmICh0dWxpcF9kZWJ1ZykKKwkJCXByaW50ayhLRVJOX0lORk8iJXM6IDIxMTQzIDEwbWJwcyBzZW5zZWQgbWVkaWEuXG4iLAorCQkJCSAgIGRldi0+bmFtZSk7CisJCWRldi0+aWZfcG9ydCA9IDA7CisJfSBlbHNlIGlmICh0cC0+bndheXNldCkgeworCQlpZiAodHVsaXBfZGVidWcpCisJCQlwcmludGsoS0VSTl9JTkZPIiVzOiAyMTE0MyB1c2luZyBOV2F5LXNldCAlcywgY3NyNiAlOC44eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgdHAtPmNzcjYpOworCX0gZWxzZSB7CQkvKiAxMDBtYnBzIGxpbmsgYmVhdCBnb29kLiAqLworCQlpZiAodHVsaXBfZGVidWcpCisJCQlwcmludGsoS0VSTl9JTkZPIiVzOiAyMTE0MyAxMDBiYXNlVHggc2Vuc2VkIG1lZGlhLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUpOworCQlkZXYtPmlmX3BvcnQgPSAzOworCQl0cC0+Y3NyNiA9IDB4ODM4RTAwMDAgfCAodHAtPmNzcjYgJiAweDIwZmYpOworCQlpb3dyaXRlMzIoMHgwMDAzRkY3RiwgaW9hZGRyICsgQ1NSMTQpOworCQlpb3dyaXRlMzIoMHgwMzAxLCBpb2FkZHIgKyBDU1IxMik7CisJCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisJfQorfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL0tjb25maWcgYi9kcml2ZXJzL25ldC90dWxpcC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2RhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC9LY29uZmlnCkBAIC0wLDAgKzEsMTY2IEBACisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIlR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIChQQ0kgfHwgRUlTQSB8fCBDQVJEQlVTKQorCitjb25maWcgTkVUX1RVTElQCisJYm9vbCAiXCJUdWxpcFwiIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgc2VsZWN0cyB0aGUgIlR1bGlwIiBmYW1pbHkgb2YgRUlTQS9QQ0kgbmV0d29yayBjYXJkcy4KKworY29uZmlnIERFMjEwNFgKKwl0cmlzdGF0ZSAiRWFybHkgREVDY2hpcCBUdWxpcCAoZGMyMTA0eCkgUENJIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfVFVMSVAgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGlzIGRldmVsb3BlZCBmb3IgdGhlIFNNQyBFdGhlclBvd2VyIHNlcmllcyBFdGhlcm5ldAorCSAgY2FyZHMgYW5kIGFsc28gd29ya3Mgd2l0aCBjYXJkcyBiYXNlZCBvbiB0aGUgREVDY2hpcAorCSAgMjEwNDAgKFR1bGlwIHNlcmllcykgY2hpcHMuICBTb21lIExpbmtTeXMgUENJIGNhcmRzIGFyZQorCSAgb2YgdGhpcyB0eXBlLiAgKElmIHlvdXIgY2FyZCBpcyBOT1QgU01DIEV0aGVyUG93ZXIgMTAvMTAwIFBDSQorCSAgKHNtYzkzMzJkc3QpLCB5b3UgY2FuIGFsc28gdHJ5IHRoZSBkcml2ZXIgZm9yICJHZW5lcmljIERFQ2NoaXAiCisJICBjYXJkcywgYmVsb3cuICBIb3dldmVyLCBtb3N0IHBlb3BsZSB3aXRoIGEgbmV0d29yayBjYXJkIG9mIHRoaXMgdHlwZQorCSAgd2lsbCBzYXkgWSBoZXJlLikgRG8gcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGRlMjEwNHguCisKK2NvbmZpZyBUVUxJUAorCXRyaXN0YXRlICJERUNjaGlwIFR1bGlwIChkYzIxMTR4KSBQQ0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9UVUxJUCAmJiBQQ0kKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBpcyBkZXZlbG9wZWQgZm9yIHRoZSBTTUMgRXRoZXJQb3dlciBzZXJpZXMgRXRoZXJuZXQKKwkgIGNhcmRzIGFuZCBhbHNvIHdvcmtzIHdpdGggY2FyZHMgYmFzZWQgb24gdGhlIERFQ2NoaXAgCisJICAyMTE0MCAoVHVsaXAgc2VyaWVzKSBjaGlwcy4gIFNvbWUgTGlua1N5cyBQQ0kgY2FyZHMgYXJlCisJICBvZiB0aGlzIHR5cGUuICAoSWYgeW91ciBjYXJkIGlzIE5PVCBTTUMgRXRoZXJQb3dlciAxMC8xMDAgUENJCisJICAoc21jOTMzMmRzdCksIHlvdSBjYW4gYWxzbyB0cnkgdGhlIGRyaXZlciBmb3IgIkdlbmVyaWMgREVDY2hpcCIKKwkgIGNhcmRzLCBhYm92ZS4gIEhvd2V2ZXIsIG1vc3QgcGVvcGxlIHdpdGggYSBuZXR3b3JrIGNhcmQgb2YgdGhpcyB0eXBlCisJICB3aWxsIHNheSBZIGhlcmUuKSBEbyByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgdHVsaXAuCisKK2NvbmZpZyBUVUxJUF9NV0kKKwlib29sICJOZXcgYnVzIGNvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBUVUxJUCAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGNvbmZpZ3VyZXMgeW91ciBUdWxpcCBjYXJkIHNwZWNpZmljYWxseSBmb3IgdGhlIGNhcmQgYW5kCisJICBzeXN0ZW0gY2FjaGUgbGluZSBzaXplIHR5cGUgeW91IGFyZSB1c2luZy4KKworCSAgVGhpcyBpcyBleHBlcmltZW50YWwgY29kZSwgbm90IHlldCB0ZXN0ZWQgb24gbWFueSBib2FyZHMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBUVUxJUF9NTUlPCisJYm9vbCAiVXNlIFBDSSBzaGFyZWQgbWVtIGZvciBOSUMgcmVnaXN0ZXJzIgorCWRlcGVuZHMgb24gVFVMSVAKKwloZWxwCisJICBVc2UgUENJIHNoYXJlZCBtZW1vcnkgZm9yIHRoZSBOSUMgcmVnaXN0ZXJzLCByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoCisJICB0aGUgVHVsaXAncyBQSU8gKHByb2dyYW1tZWQgSS9PIHBvcnRzKS4gIEZhc3RlciwgYnV0IGNvdWxkIHByb2R1Y2UKKwkgIG9ic2N1cmUgYnVncyBpZiB5b3VyIG1haW5ib2FyZCBoYXMgbWVtb3J5IGNvbnRyb2xsZXIgdGltaW5nIGlzc3Vlcy4KKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFRVTElQX05BUEkKKwlib29sICJVc2UgTkFQSSBSWCBwb2xsaW5nICIKKwlkZXBlbmRzIG9uIFRVTElQCisJaGVscAorCSAgTkFQSSBpcyBhIG5ldyBkcml2ZXIgQVBJIGRlc2lnbmVkIHRvIHJlZHVjZSBDUFUgYW5kIGludGVycnVwdCBsb2FkCisJICB3aGVuIHRoZSBkcml2ZXIgaXMgcmVjZWl2aW5nIGxvdHMgb2YgcGFja2V0cyBmcm9tIHRoZSBjYXJkLiBJdCBpcworCSAgc3RpbGwgc29tZXdoYXQgZXhwZXJpbWVudGFsIGFuZCB0aHVzIG5vdCB5ZXQgZW5hYmxlZCBieSBkZWZhdWx0LgorCisJICBJZiB5b3VyIGVzdGltYXRlZCBSeCBsb2FkIGlzIDEwa3BwcyBvciBtb3JlLCBvciBpZiB0aGUgY2FyZCB3aWxsIGJlCisJICBkZXBsb3llZCBvbiBwb3RlbnRpYWxseSB1bmZyaWVuZGx5IG5ldHdvcmtzIChlLmcuIGluIGEgZmlyZXdhbGwpLAorCSAgdGhlbiBzYXkgWSBoZXJlLgorCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL05BUElfSE9XVE8udHh0PiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFRVTElQX05BUElfSFdfTUlUSUdBVElPTgorCWJvb2wgIlVzZSBJbnRlcnJ1cHQgTWl0aWdhdGlvbiAiCisJZGVwZW5kcyBvbiBUVUxJUF9OQVBJCisJLS0taGVscC0tLQorCSAgVXNlIEhXIHRvIHJlZHVjZSBSWCBpbnRlcnJ1cHRzLiBOb3Qgc3RyaWN0IG5lY2Vzc2FyeSBzaW5jZSBOQVBJIHJlZHVjZXMKKwkgIFJYIGludGVycnVwdHMgYnV0IGl0c2VsZi4gQWx0aG91Z2ggdGhpcyByZWR1Y2VzIFJYIGludGVycnVwdHMgZXZlbiBhdAorCSAgbG93IGxldmVscyB0cmFmZmljIGF0IHRoZSBjb3N0IG9mIGEgc21hbGwgbGF0ZW5jeS4KKworCSAgSWYgaW4gZG91YnQsIHNheSBZLgorCitjb25maWcgREU0WDUKKwl0cmlzdGF0ZSAiR2VuZXJpYyBERUNjaGlwICYgRElHSVRBTCBFdGhlcldPUktTIFBDSS9FSVNBIgorCWRlcGVuZHMgb24gTkVUX1RVTElQICYmIChQQ0kgfHwgRUlTQSkKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBESUdJVEFMIHNlcmllcyBvZiBQQ0kvRUlTQSBFdGhlcm5ldCBjYXJkcy4KKwkgIFRoZXNlIGluY2x1ZGUgdGhlIERFNDI1LCBERTQzNCwgREU0MzUsIERFNDUwIGFuZCBERTUwMCBtb2RlbHMuICBJZgorCSAgeW91IGhhdmUgYSBuZXR3b3JrIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZCB0aGUKKwkgIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gTW9yZSBzcGVjaWZpYworCSAgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIGluCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGU0eDUudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBkZTR4NS4KKworY29uZmlnIFdJTkJPTkRfODQwCisJdHJpc3RhdGUgIldpbmJvbmQgVzg5Yzg0MCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1RVTElQICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBNSUkKKwloZWxwCisJICBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIFdpbmJvbmQgVzg5Yzg0MCBjaGlwLiAgSXQgYWxzbyB3b3JrcyB3aXRoIAorCSAgdGhlIFRYOTg4MiBjaGlwIG9uIHRoZSBDb21wZXggUkwxMDAtQVRYIGJvYXJkLgorCSAgTW9yZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhbmQgdXBkYXRlcyBhcmUgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL2RyaXZlcnMuaHRtbD4uCisKK2NvbmZpZyBETTkxMDIKKwl0cmlzdGF0ZSAiRGF2aWNvbSBETTkxMHgvRE05ODB4IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfVFVMSVAgJiYgUENJCisJc2VsZWN0IENSQzMyCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgaXMgZm9yIERNOTEwMihBKS9ETTkxMzIvRE05ODAxIGNvbXBhdGlibGUgUENJIGNhcmRzIGZyb20KKwkgIERhdmljb20gKDxodHRwOi8vd3d3LmRhdmljb20uY29tLnR3Lz4pLiAgSWYgeW91IGhhdmUgc3VjaCBhIG5ldHdvcmsKKwkgIChFdGhlcm5ldCkgY2FyZCwgc2F5IFkuICBTb21lIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RtZmUudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBkbWZlLgorCitjb25maWcgUENNQ0lBX1hJUkNPTQorCXRyaXN0YXRlICJYaXJjb20gQ2FyZEJ1cyBzdXBwb3J0IChuZXcgZHJpdmVyKSIKKwlkZXBlbmRzIG9uIE5FVF9UVUxJUCAmJiBDQVJEQlVTCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBEaWdpdGFsICJUdWxpcCIgRXRoZXJuZXQgQ2FyZEJ1cyBhZGFwdGVycy4KKwkgIEl0IHNob3VsZCB3b3JrIHdpdGggbW9zdCBERUMgMjEqNCotYmFzZWQgY2hpcHMvZXRoZXJjYXJkcywgYXMgd2VsbAorCSAgYXMgd2l0aCB3b3JrLWFsaWtlIGNoaXBzIGZyb20gTGl0ZS1PbiAoUE5JQykgYW5kIE1hY3Jvbml4IChNWElDKSBhbmQKKwkgIEFTSVguCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgeGlyY29tX2NiLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBDTUNJQV9YSVJUVUxJUAorCXRyaXN0YXRlICJYaXJjb20gVHVsaXAtbGlrZSBDYXJkQnVzIHN1cHBvcnQgKG9sZCBkcml2ZXIpIgorCWRlcGVuZHMgb24gTkVUX1RVTElQICYmIENBUkRCVVMgJiYgQlJPS0VOX09OX1NNUAorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgRGlnaXRhbCAiVHVsaXAiIEV0aGVybmV0IENhcmRCdXMgYWRhcHRlcnMuCisJICBJdCBzaG91bGQgd29yayB3aXRoIG1vc3QgREVDIDIxKjQqLWJhc2VkIGNoaXBzL2V0aGVyY2FyZHMsIGFzIHdlbGwKKwkgIGFzIHdpdGggd29yay1hbGlrZSBjaGlwcyBmcm9tIExpdGUtT24gKFBOSUMpIGFuZCBNYWNyb25peCAoTVhJQykgYW5kCisJICBBU0lYLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIHhpcmNvbV90dWxpcF9jYi4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC90dWxpcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmI5YjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvTWFrZWZpbGUKQEAgLTAsMCArMSwxNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4ICJUdWxpcCIgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIGRyaXZlcnMuCisjCisKK29iai0kKENPTkZJR19QQ01DSUFfWElSVFVMSVApCSs9IHhpcmNvbV90dWxpcF9jYi5vCitvYmotJChDT05GSUdfUENNQ0lBX1hJUkNPTSkJKz0geGlyY29tX2NiLm8KK29iai0kKENPTkZJR19ETTkxMDIpCQkrPSBkbWZlLm8KK29iai0kKENPTkZJR19XSU5CT05EXzg0MCkJKz0gd2luYm9uZC04NDAubworb2JqLSQoQ09ORklHX0RFMjEwNFgpCQkrPSBkZTIxMDR4Lm8KK29iai0kKENPTkZJR19UVUxJUCkJCSs9IHR1bGlwLm8KK29iai0kKENPTkZJR19ERTRYNSkJCSs9IGRlNHg1Lm8KKworIyBEZWNsYXJlIG11bHRpLXBhcnQgZHJpdmVycy4KKwordHVsaXAtb2JqcwkJCTo9IGVlcHJvbS5vIGludGVycnVwdC5vIG1lZGlhLm8gXAorCQkJCSAgIHRpbWVyLm8gdHVsaXBfY29yZS5vCQlcCisJCQkJICAgMjExNDIubyBwbmljLm8gcG5pYzIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOGUxOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKQEAgLTAsMCArMSwyMTg3IEBACisvKiBkZTIxMDR4LmM6IEEgTGludXggUENJIEV0aGVybmV0IGRyaXZlciBmb3IgSW50ZWwvRGlnaXRhbCAyMTA0MC8xIGNoaXBzLiAqLworLyoKKwlDb3B5cmlnaHQgMjAwMSwyMDAzIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKworCUNvcHlyaWdodCAxOTk0LCAxOTk1IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLgkgICAgW2RlNHg1LmNdCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5NC0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCQkgICAgW3R1bGlwLmNdCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisJdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKwlEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisJcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorCWEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisKKwlTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCVRPRE8sIGluIHJvdWdoIHByaW9yaXR5IG9yZGVyOgorCSogU3VwcG9ydCBmb3JjaW5nIG1lZGlhIHR5cGUgd2l0aCBhIG1vZHVsZSBwYXJhbWV0ZXIsCisJICBsaWtlIGRsMmsuYy9zdW5kYW5jZS5jCisJKiBDb25zdGFudHMgKG1vZHVsZSBwYXJtcz8pIGZvciBSeCB3b3JrIGxpbWl0CisJKiBDb21wbGV0ZSByZXNldCBvbiBQY2lFcnIKKwkqIEp1bWJvIGZyYW1lcyAvIGRldi0+Y2hhbmdlX210dQorCSogQWRqdXN0IFJ4IEZJRk8gdGhyZXNob2xkIGFuZCBNYXggUnggRE1BIGJ1cnN0IG9uIFJ4IEZJRk8gZXJyb3IKKwkqIEFkanVzdCBUeCBGSUZPIHRocmVzaG9sZCBhbmQgTWF4IFR4IERNQSBidXJzdCBvbiBUeCBGSUZPIGVycm9yCisJKiBJbXBsZW1lbnQgVHggc29mdHdhcmUgaW50ZXJydXB0IG1pdGlnYXRpb24gdmlhCisJICBUeCBkZXNjcmlwdG9yIGJpdAorCisgKi8KKworI2RlZmluZSBEUlZfTkFNRQkJImRlMjEwNHgiCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMC43IgorI2RlZmluZSBEUlZfUkVMREFURQkJIk1hciAxNywgMjAwNCIKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSA9CitLRVJOX0lORk8gRFJWX05BTUUgIiBQQ0kgRXRoZXJuZXQgZHJpdmVyIHYiIERSVl9WRVJTSU9OICIgKCIgRFJWX1JFTERBVEUgIilcbiI7CisKK01PRFVMRV9BVVRIT1IoIkplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwvRGlnaXRhbCAyMTA0MC8xIHNlcmllcyBQQ0kgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsKK21vZHVsZV9wYXJhbSAoZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDIChkZWJ1ZywgImRlMjEwNHggYml0bWFwcGVkIG1lc3NhZ2UgZW5hYmxlIG51bWJlciIpOworCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWJ1ZmZlciBSeCBzdHJ1Y3R1cmUuICovCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2hwcGFfXykgXAorICAgICAgICB8fCBkZWZpbmVkKF9fc3BhcmNfKSB8fCBkZWZpbmVkKF9faWE2NF9fKSBcCisgICAgICAgIHx8IGRlZmluZWQoX19zaF9fKSB8fCBkZWZpbmVkKF9fbWlwc19fKQorc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAxNTE4OworI2Vsc2UKK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMTAwOworI2VuZGlmCittb2R1bGVfcGFyYW0gKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MgKHJ4X2NvcHlicmVhaywgImRlMjEwNHggQnJlYWtwb2ludCBhdCB3aGljaCBSeCBwYWNrZXRzIGFyZSBjb3BpZWQiKTsKKworI2RlZmluZSBQRlgJCQlEUlZfTkFNRSAiOiAiCisKKyNkZWZpbmUgREVfREVGX01TR19FTkFCTEUJKE5FVElGX01TR19EUlYJCXwgXAorCQkJCSBORVRJRl9NU0dfUFJPQkUgCXwgXAorCQkJCSBORVRJRl9NU0dfTElOSwkJfCBcCisJCQkJIE5FVElGX01TR19JRkRPV04JfCBcCisJCQkJIE5FVElGX01TR19JRlVQCQl8IFwKKwkJCQkgTkVUSUZfTVNHX1JYX0VSUgl8IFwKKwkJCQkgTkVUSUZfTVNHX1RYX0VSUikKKworI2RlZmluZSBERV9SWF9SSU5HX1NJWkUJCTY0CisjZGVmaW5lIERFX1RYX1JJTkdfU0laRQkJNjQKKyNkZWZpbmUgREVfUklOR19CWVRFUwkJXAorCQkoKHNpemVvZihzdHJ1Y3QgZGVfZGVzYykgKiBERV9SWF9SSU5HX1NJWkUpICsJXAorCQkoc2l6ZW9mKHN0cnVjdCBkZV9kZXNjKSAqIERFX1RYX1JJTkdfU0laRSkpCisjZGVmaW5lIE5FWFRfVFgoTikJCSgoKE4pICsgMSkgJiAoREVfVFhfUklOR19TSVpFIC0gMSkpCisjZGVmaW5lIE5FWFRfUlgoTikJCSgoKE4pICsgMSkgJiAoREVfUlhfUklOR19TSVpFIC0gMSkpCisjZGVmaW5lIFRYX0JVRkZTX0FWQUlMKENQKQkJCQkJXAorCSgoKENQKS0+dHhfdGFpbCA8PSAoQ1ApLT50eF9oZWFkKSA/CQkJXAorCSAgKENQKS0+dHhfdGFpbCArIChERV9UWF9SSU5HX1NJWkUgLSAxKSAtIChDUCktPnR4X2hlYWQgOglcCisJICAoQ1ApLT50eF90YWlsIC0gKENQKS0+dHhfaGVhZCAtIDEpCisKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTUzNgkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4qLworI2RlZmluZSBSWF9PRkZTRVQJCTIKKworI2RlZmluZSBERV9TRVRVUF9TS0IJCSgoc3RydWN0IHNrX2J1ZmYgKikgMSkKKyNkZWZpbmUgREVfRFVNTVlfU0tCCQkoKHN0cnVjdCBza19idWZmICopIDIpCisjZGVmaW5lIERFX1NFVFVQX0ZSQU1FX1dPUkRTCTk2CisjZGVmaW5lIERFX0VFUFJPTV9XT1JEUwkJMjU2CisjZGVmaW5lIERFX0VFUFJPTV9TSVpFCQkoREVfRUVQUk9NX1dPUkRTICogc2l6ZW9mKHUxNikpCisjZGVmaW5lIERFX01BWF9NRURJQQkJNQorCisjZGVmaW5lIERFX01FRElBX1RQX0FVVE8JMAorI2RlZmluZSBERV9NRURJQV9CTkMJCTEKKyNkZWZpbmUgREVfTUVESUFfQVVJCQkyCisjZGVmaW5lIERFX01FRElBX1RQCQkzCisjZGVmaW5lIERFX01FRElBX1RQX0ZECQk0CisjZGVmaW5lIERFX01FRElBX0lOVkFMSUQJREVfTUFYX01FRElBCisjZGVmaW5lIERFX01FRElBX0ZJUlNUCQkwCisjZGVmaW5lIERFX01FRElBX0xBU1QJCShERV9NQVhfTUVESUEgLSAxKQorI2RlZmluZSBERV9BVUlfQk5DCQkoU1VQUE9SVEVEX0FVSSB8IFNVUFBPUlRFRF9CTkMpCisKKyNkZWZpbmUgREVfVElNRVJfTElOSwkJKDYwICogSFopCisjZGVmaW5lIERFX1RJTUVSX05PX0xJTksJKDUgKiBIWikKKworI2RlZmluZSBERV9OVU1fUkVHUwkJMTYKKyNkZWZpbmUgREVfUkVHU19TSVpFCQkoREVfTlVNX1JFR1MgKiBzaXplb2YodTMyKSkKKyNkZWZpbmUgREVfUkVHU19WRVIJCTEKKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUCQkoNipIWikKKworI2RlZmluZSBERV9VTkFMSUdORURfMTYoYSkJKHUxNikoZ2V0X3VuYWxpZ25lZCgodTE2ICopKGEpKSkKKworLyogVGhpcyBpcyBhIG15c3RlcmlvdXMgdmFsdWUgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBDU1IxMSBpbiB0aGUgMjEwNDAgKG9ubHkpCisgICB0byBzdXBwb3J0IGEgcHJlLU5XYXkgZnVsbC1kdXBsZXggc2lnbmFsaW5nIG1lY2hhbmlzbSB1c2luZyBzaG9ydCBmcmFtZXMuCisgICBObyBvbmUga25vd3Mgd2hhdCBpdCBzaG91bGQgYmUsIGJ1dCBpZiBsZWZ0IGF0IGl0cyBkZWZhdWx0IHZhbHVlIHNvbWUKKyAgIDEwYmFzZTIoISkgcGFja2V0cyB0cmlnZ2VyIGEgZnVsbC1kdXBsZXgtcmVxdWVzdCBpbnRlcnJ1cHQuICovCisjZGVmaW5lIEZVTExfRFVQTEVYX01BR0lDCTB4Njk2OQorCitlbnVtIHsKKwkvKiBOSUMgcmVnaXN0ZXJzICovCisJQnVzTW9kZQkJCT0gMHgwMCwKKwlUeFBvbGwJCQk9IDB4MDgsCisJUnhQb2xsCQkJPSAweDEwLAorCVJ4UmluZ0FkZHIJCT0gMHgxOCwKKwlUeFJpbmdBZGRyCQk9IDB4MjAsCisJTWFjU3RhdHVzCQk9IDB4MjgsCisJTWFjTW9kZQkJCT0gMHgzMCwKKwlJbnRyTWFzawkJPSAweDM4LAorCVJ4TWlzc2VkCQk9IDB4NDAsCisJUk9NQ21kCQkJPSAweDQ4LAorCUNTUjExCQkJPSAweDU4LAorCVNJQVN0YXR1cwkJPSAweDYwLAorCUNTUjEzCQkJPSAweDY4LAorCUNTUjE0CQkJPSAweDcwLAorCUNTUjE1CQkJPSAweDc4LAorCVBDSVBNCQkJPSAweDQwLAorCisJLyogQnVzTW9kZSBiaXRzICovCisJQ21kUmVzZXQJCT0gKDEgPDwgMCksCisJQ2FjaGVBbGlnbjE2CQk9IDB4MDAwMDgwMDAsCisJQnVyc3RMZW40CQk9IDB4MDAwMDA0MDAsCisKKwkvKiBSeC9UeFBvbGwgYml0cyAqLworCU5vcm1hbFR4UG9sbAkJPSAoMSA8PCAwKSwKKwlOb3JtYWxSeFBvbGwJCT0gKDEgPDwgMCksCisKKwkvKiBUeC9SeCBkZXNjcmlwdG9yIHN0YXR1cyBiaXRzICovCisJRGVzY093bgkJCT0gKDEgPDwgMzEpLAorCVJ4RXJyb3IJCQk9ICgxIDw8IDE1KSwKKwlSeEVyckxvbmcJCT0gKDEgPDwgNyksCisJUnhFcnJDUkMJCT0gKDEgPDwgMSksCisJUnhFcnJGSUZPCQk9ICgxIDw8IDApLAorCVJ4RXJyUnVudAkJPSAoMSA8PCAxMSksCisJUnhFcnJGcmFtZQkJPSAoMSA8PCAxNCksCisJUmluZ0VuZAkJCT0gKDEgPDwgMjUpLAorCUZpcnN0RnJhZwkJPSAoMSA8PCAyOSksCisJTGFzdEZyYWcJCT0gKDEgPDwgMzApLAorCVR4RXJyb3IJCQk9ICgxIDw8IDE1KSwKKwlUeEZJRk9VbmRlcgkJPSAoMSA8PCAxKSwKKwlUeExpbmtGYWlsCQk9ICgxIDw8IDIpIHwgKDEgPDwgMTApIHwgKDEgPDwgMTEpLAorCVR4TWF4Q29sCQk9ICgxIDw8IDgpLAorCVR4T1dDCQkJPSAoMSA8PCA5KSwKKwlUeEphYmJlcgkJPSAoMSA8PCAxNCksCisJU2V0dXBGcmFtZQkJPSAoMSA8PCAyNyksCisJVHhTd0ludAkJCT0gKDEgPDwgMzEpLAorCisJLyogTWFjU3RhdHVzIGJpdHMgKi8KKwlJbnRyT0sJCQk9ICgxIDw8IDE2KSwKKwlJbnRyRXJyCQkJPSAoMSA8PCAxNSksCisJUnhJbnRyCQkJPSAoMSA8PCA2KSwKKwlSeEVtcHR5CQkJPSAoMSA8PCA3KSwKKwlUeEludHIJCQk9ICgxIDw8IDApLAorCVR4RW1wdHkJCQk9ICgxIDw8IDIpLAorCVBjaUVycgkJCT0gKDEgPDwgMTMpLAorCVR4U3RhdGUJCQk9ICgxIDw8IDIyKSB8ICgxIDw8IDIxKSB8ICgxIDw8IDIwKSwKKwlSeFN0YXRlCQkJPSAoMSA8PCAxOSkgfCAoMSA8PCAxOCkgfCAoMSA8PCAxNyksCisJTGlua0ZhaWwJCT0gKDEgPDwgMTIpLAorCUxpbmtQYXNzCQk9ICgxIDw8IDQpLAorCVJ4U3RvcHBlZAkJPSAoMSA8PCA4KSwKKwlUeFN0b3BwZWQJCT0gKDEgPDwgMSksCisKKwkvKiBNYWNNb2RlIGJpdHMgKi8KKwlUeEVuYWJsZQkJPSAoMSA8PCAxMyksCisJUnhFbmFibGUJCT0gKDEgPDwgMSksCisJUnhUeAkJCT0gVHhFbmFibGUgfCBSeEVuYWJsZSwKKwlGdWxsRHVwbGV4CQk9ICgxIDw8IDkpLAorCUFjY2VwdEFsbE11bHRpY2FzdAk9ICgxIDw8IDcpLAorCUFjY2VwdEFsbFBoeXMJCT0gKDEgPDwgNiksCisJQk9DbnQJCQk9ICgxIDw8IDUpLAorCU1hY01vZGVDbGVhcgkJPSAoMTw8MTIpIHwgKDE8PDExKSB8ICgxPDwxMCkgfCAoMTw8OCkgfCAoMTw8MykgfAorCQkJCSAgUnhUeCB8IEJPQ250IHwgQWNjZXB0QWxsUGh5cyB8IEFjY2VwdEFsbE11bHRpY2FzdCwKKworCS8qIFJPTUNtZCBiaXRzICovCisJRUVfU0hJRlRfQ0xLCQk9IDB4MDIsCS8qIEVFUFJPTSBzaGlmdCBjbG9jay4gKi8KKwlFRV9DUwkJCT0gMHgwMSwJLyogRUVQUk9NIGNoaXAgc2VsZWN0LiAqLworCUVFX0RBVEFfV1JJVEUJCT0gMHgwNCwJLyogRGF0YSBmcm9tIHRoZSBUdWxpcCB0byBFRVBST00uICovCisJRUVfV1JJVEVfMAkJPSAweDAxLAorCUVFX1dSSVRFXzEJCT0gMHgwNSwKKwlFRV9EQVRBX1JFQUQJCT0gMHgwOCwJLyogRGF0YSBmcm9tIHRoZSBFRVBST00gY2hpcC4gKi8KKwlFRV9FTkIJCQk9ICgweDQ4MDAgfCBFRV9DUyksCisKKwkvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KKwlFRV9SRUFEX0NNRAkJPSA2LAorCisJLyogUnhNaXNzZWQgYml0cyAqLworCVJ4TWlzc2VkT3ZlcgkJPSAoMSA8PCAxNiksCisJUnhNaXNzZWRNYXNrCQk9IDB4ZmZmZiwKKworCS8qIFNST00tcmVsYXRlZCBiaXRzICovCisJU1JPTUMwSW5mb0xlYWYJCT0gMjcsCisJTWVkaWFCbG9ja01hc2sJCT0gMHgzZiwKKwlNZWRpYUN1c3RvbUNTUnMJCT0gKDEgPDwgNiksCisJCisJLyogUENJUE0gYml0cyAqLworCVBNX1NsZWVwCQk9ICgxIDw8IDMxKSwKKwlQTV9Tbm9vemUJCT0gKDEgPDwgMzApLAorCVBNX01hc2sJCQk9IFBNX1NsZWVwIHwgUE1fU25vb3plLAorCQorCS8qIFNJQVN0YXR1cyBiaXRzICovCisJTldheVN0YXRlCQk9ICgxIDw8IDE0KSB8ICgxIDw8IDEzKSB8ICgxIDw8IDEyKSwKKwlOV2F5UmVzdGFydAkJPSAoMSA8PCAxMiksCisJTm9uc2VsUG9ydEFjdGl2ZQk9ICgxIDw8IDkpLAorCUxpbmtGYWlsU3RhdHVzCQk9ICgxIDw8IDIpLAorCU5ldEN4bkVycgkJPSAoMSA8PCAxKSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgZGVfaW50cl9tYXNrID0KKwlJbnRyT0sgfCBJbnRyRXJyIHwgUnhJbnRyIHwgUnhFbXB0eSB8IFR4SW50ciB8IFR4RW1wdHkgfAorCUxpbmtQYXNzIHwgTGlua0ZhaWwgfCBQY2lFcnI7CisKKy8qCisgKiBTZXQgdGhlIHByb2dyYW1tYWJsZSBidXJzdCBsZW5ndGggdG8gNCBsb25nd29yZHMgZm9yIGFsbDoKKyAqIERNQSBlcnJvcnMgcmVzdWx0IHdpdGhvdXQgdGhlc2UgdmFsdWVzLiBDYWNoZSBhbGlnbiAxNiBsb25nLgorICovCitzdGF0aWMgY29uc3QgdTMyIGRlX2J1c19tb2RlID0gQ2FjaGVBbGlnbjE2IHwgQnVyc3RMZW40OworCitzdHJ1Y3QgZGVfc3JvbV9tZWRpYV9ibG9jayB7CisJdTgJCQlvcHRzOworCXUxNgkJCWNzcjEzOworCXUxNgkJCWNzcjE0OworCXUxNgkJCWNzcjE1OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGRlX3Nyb21faW5mb19sZWFmIHsKKwl1MTYJCQlkZWZhdWx0X21lZGlhOworCXU4CQkJbl9ibG9ja3M7CisJdTgJCQl1bnVzZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZGVfZGVzYyB7CisJdTMyCQkJb3B0czE7CisJdTMyCQkJb3B0czI7CisJdTMyCQkJYWRkcjE7CisJdTMyCQkJYWRkcjI7Cit9OworCitzdHJ1Y3QgbWVkaWFfaW5mbyB7CisJdTE2CQkJdHlwZTsJLyogREVfTUVESUFfeHh4ICovCisJdTE2CQkJY3NyMTM7CisJdTE2CQkJY3NyMTQ7CisJdTE2CQkJY3NyMTU7Cit9OworCitzdHJ1Y3QgcmluZ19pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsKKwlkbWFfYWRkcl90CQltYXBwaW5nOworfTsKKworc3RydWN0IGRlX3ByaXZhdGUgeworCXVuc2lnbmVkCQl0eF9oZWFkOworCXVuc2lnbmVkCQl0eF90YWlsOworCXVuc2lnbmVkCQlyeF90YWlsOworCisJdm9pZAkJCV9faW9tZW0gKnJlZ3M7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKwlzcGlubG9ja190CQlsb2NrOworCisJc3RydWN0IGRlX2Rlc2MJCSpyeF9yaW5nOworCXN0cnVjdCBkZV9kZXNjCQkqdHhfcmluZzsKKwlzdHJ1Y3QgcmluZ19pbmZvCXR4X3NrYltERV9UWF9SSU5HX1NJWkVdOworCXN0cnVjdCByaW5nX2luZm8Jcnhfc2tiW0RFX1JYX1JJTkdfU0laRV07CisJdW5zaWduZWQJCXJ4X2J1Zl9zejsKKwlkbWFfYWRkcl90CQlyaW5nX2RtYTsKKworCXUzMgkJCW1zZ19lbmFibGU7CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7CisKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisKKwl1MTYJCQlzZXR1cF9mcmFtZVtERV9TRVRVUF9GUkFNRV9XT1JEU107CisKKwl1MzIJCQltZWRpYV90eXBlOworCXUzMgkJCW1lZGlhX3N1cHBvcnRlZDsKKwl1MzIJCQltZWRpYV9hZHZlcnRpc2U7CisJc3RydWN0IG1lZGlhX2luZm8JbWVkaWFbREVfTUFYX01FRElBXTsKKwlzdHJ1Y3QgdGltZXJfbGlzdAltZWRpYV90aW1lcjsKKworCXU4CQkJKmVlX2RhdGE7CisJdW5zaWduZWQJCWJvYXJkX2lkeDsKKwl1bnNpZ25lZAkJZGUyMTA0MCA6IDE7CisJdW5zaWduZWQJCW1lZGlhX2xvY2sgOiAxOworfTsKKworCitzdGF0aWMgdm9pZCBkZV9zZXRfcnhfbW9kZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBkZV90eCAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKTsKK3N0YXRpYyB2b2lkIGRlX2NsZWFuX3JpbmdzIChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpOworc3RhdGljIHZvaWQgZGVfbWVkaWFfaW50ZXJydXB0IChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUsIHUzMiBzdGF0dXMpOworc3RhdGljIHZvaWQgZGUyMTA0MF9tZWRpYV90aW1lciAodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGRlMjEwNDFfbWVkaWFfdGltZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGRlX29rX3RvX2FkdmVydGlzZSAoc3RydWN0IGRlX3ByaXZhdGUgKmRlLCB1MzIgbmV3X21lZGlhKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZGVfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBkZV9wY2lfdGJsKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtZWRpYV9uYW1lW0RFX01BWF9NRURJQV0gPSB7CisJIjEwYmFzZVQgYXV0byIsCisJIkJOQyIsCisJIkFVSSIsCisJIjEwYmFzZVQtSEQiLAorCSIxMGJhc2VULUZEIgorfTsKKworLyogMjEwNDAgdHJhbnNjZWl2ZXIgcmVnaXN0ZXIgc2V0dGluZ3M6CisgKiBUUCBBVVRPKHVudXNlZCksIEJOQyh1bnVzZWQpLCBBVUksIFRQLCBUUCBGRCovCitzdGF0aWMgdTE2IHQyMTA0MF9jc3IxM1tdID0geyAwLCAwLCAweDhGMDksIDB4OEYwMSwgMHg4RjAxLCB9Oworc3RhdGljIHUxNiB0MjEwNDBfY3NyMTRbXSA9IHsgMCwgMCwgMHgwNzA1LCAweEZGRkYsIDB4RkZGRCwgfTsKK3N0YXRpYyB1MTYgdDIxMDQwX2NzcjE1W10gPSB7IDAsIDAsIDB4MDAwNiwgMHgwMDAwLCAweDAwMDAsIH07CisKKy8qIDIxMDQxIHRyYW5zY2VpdmVyIHJlZ2lzdGVyIHNldHRpbmdzOiBUUCBBVVRPLCBCTkMsIEFVSSwgVFAsIFRQIEZEKi8KK3N0YXRpYyB1MTYgdDIxMDQxX2NzcjEzW10gPSB7IDB4RUYwMSwgMHhFRjA5LCAweEVGMDksIDB4RUYwMSwgMHhFRjA5LCB9Oworc3RhdGljIHUxNiB0MjEwNDFfY3NyMTRbXSA9IHsgMHhGRkZGLCAweEY3RkQsIDB4RjdGRCwgMHg2RjNGLCAweDZGM0QsIH07CitzdGF0aWMgdTE2IHQyMTA0MV9jc3IxNVtdID0geyAweDAwMDgsIDB4MDAwNiwgMHgwMDBFLCAweDAwMDgsIDB4MDAwOCwgfTsKKworCisjZGVmaW5lIGRyMzIocmVnKQkJcmVhZGwoZGUtPnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgZHczMihyZWcsdmFsKQkJd3JpdGVsKCh2YWwpLCBkZS0+cmVncyArIChyZWcpKQorCisKK3N0YXRpYyB2b2lkIGRlX3J4X2Vycl9hY2N0IChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUsIHVuc2lnbmVkIHJ4X3RhaWwsCisJCQkgICAgdTMyIHN0YXR1cywgdTMyIGxlbikKK3sKKwlpZiAobmV0aWZfbXNnX3J4X2VyciAoZGUpKQorCQlwcmludGsgKEtFUk5fREVCVUcKKwkJCSIlczogcnggZXJyLCBzbG90ICVkIHN0YXR1cyAweCV4IGxlbiAlZFxuIiwKKwkJCWRlLT5kZXYtPm5hbWUsIHJ4X3RhaWwsIHN0YXR1cywgbGVuKTsKKworCWlmICgoc3RhdHVzICYgMHgzODAwMDMwMCkgIT0gMHgwMzAwKSB7CisJCS8qIEluZ29yZSBlYXJsaWVyIGJ1ZmZlcnMuICovCisJCWlmICgoc3RhdHVzICYgMHhmZmZmKSAhPSAweDdmZmYpIHsKKwkJCWlmIChuZXRpZl9tc2dfcnhfZXJyKGRlKSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3ZlcnNpemVkIEV0aGVybmV0IGZyYW1lICIKKwkJCQkJICAgInNwYW5uZWQgbXVsdGlwbGUgYnVmZmVycywgc3RhdHVzICU4Ljh4IVxuIiwKKwkJCQkJICAgZGUtPmRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCWRlLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9CisJfSBlbHNlIGlmIChzdGF0dXMgJiBSeEVycm9yKSB7CisJCS8qIFRoZXJlIHdhcyBhIGZhdGFsIGVycm9yLiAqLworCQlkZS0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOyAvKiBlbmQgb2YgYSBwYWNrZXQuKi8KKwkJaWYgKHN0YXR1cyAmIDB4MDg5MCkgZGUtPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBSeEVyckNSQykgZGUtPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBSeEVyckZJRk8pIGRlLT5uZXRfc3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlX3J4IChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisJdW5zaWduZWQgcnhfdGFpbCA9IGRlLT5yeF90YWlsOworCXVuc2lnbmVkIHJ4X3dvcmsgPSBERV9SWF9SSU5HX1NJWkU7CisJdW5zaWduZWQgZHJvcCA9IDA7CisJaW50IHJjOworCisJd2hpbGUgKHJ4X3dvcmstLSkgeworCQl1MzIgc3RhdHVzLCBsZW47CisJCWRtYV9hZGRyX3QgbWFwcGluZzsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKmNvcHlfc2tiOworCQl1bnNpZ25lZCBjb3B5aW5nX3NrYiwgYnVmbGVuOworCisJCXNrYiA9IGRlLT5yeF9za2JbcnhfdGFpbF0uc2tiOworCQlpZiAoIXNrYikKKwkJCUJVRygpOworCQlybWIoKTsKKwkJc3RhdHVzID0gbGUzMl90b19jcHUoZGUtPnJ4X3JpbmdbcnhfdGFpbF0ub3B0czEpOworCQlpZiAoc3RhdHVzICYgRGVzY093bikKKwkJCWJyZWFrOworCisJCWxlbiA9ICgoc3RhdHVzID4+IDE2KSAmIDB4N2ZmKSAtIDQ7CisJCW1hcHBpbmcgPSBkZS0+cnhfc2tiW3J4X3RhaWxdLm1hcHBpbmc7CisKKwkJaWYgKHVubGlrZWx5KGRyb3ApKSB7CisJCQlkZS0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gcnhfbmV4dDsKKwkJfQorCisJCWlmICh1bmxpa2VseSgoc3RhdHVzICYgMHgzODAwODMwMCkgIT0gMHgwMzAwKSkgeworCQkJZGVfcnhfZXJyX2FjY3QoZGUsIHJ4X3RhaWwsIHN0YXR1cywgbGVuKTsKKwkJCWdvdG8gcnhfbmV4dDsKKwkJfQorCisJCWNvcHlpbmdfc2tiID0gKGxlbiA8PSByeF9jb3B5YnJlYWspOworCisJCWlmICh1bmxpa2VseShuZXRpZl9tc2dfcnhfc3RhdHVzKGRlKSkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJ4IHNsb3QgJWQgc3RhdHVzIDB4JXggbGVuICVkIGNvcHlpbmc/ICVkXG4iLAorCQkJICAgICAgIGRlLT5kZXYtPm5hbWUsIHJ4X3RhaWwsIHN0YXR1cywgbGVuLAorCQkJICAgICAgIGNvcHlpbmdfc2tiKTsKKworCQlidWZsZW4gPSBjb3B5aW5nX3NrYiA/IChsZW4gKyBSWF9PRkZTRVQpIDogZGUtPnJ4X2J1Zl9zejsKKwkJY29weV9za2IgPSBkZXZfYWxsb2Nfc2tiIChidWZsZW4pOworCQlpZiAodW5saWtlbHkoIWNvcHlfc2tiKSkgeworCQkJZGUtPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlkcm9wID0gMTsKKwkJCXJ4X3dvcmsgPSAxMDA7CisJCQlnb3RvIHJ4X25leHQ7CisJCX0KKwkJY29weV9za2ItPmRldiA9IGRlLT5kZXY7CisKKwkJaWYgKCFjb3B5aW5nX3NrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZShkZS0+cGRldiwgbWFwcGluZywKKwkJCQkJIGJ1ZmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNrYl9wdXQoc2tiLCBsZW4pOworCisJCQltYXBwaW5nID0KKwkJCWRlLT5yeF9za2JbcnhfdGFpbF0ubWFwcGluZyA9CisJCQkJcGNpX21hcF9zaW5nbGUoZGUtPnBkZXYsIGNvcHlfc2tiLT50YWlsLAorCQkJCQkgICAgICAgYnVmbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGUtPnJ4X3NrYltyeF90YWlsXS5za2IgPSBjb3B5X3NrYjsKKwkJfSBlbHNlIHsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZS0+cGRldiwgbWFwcGluZywgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJc2tiX3Jlc2VydmUoY29weV9za2IsIFJYX09GRlNFVCk7CisJCQltZW1jcHkoc2tiX3B1dChjb3B5X3NrYiwgbGVuKSwgc2tiLT50YWlsLCBsZW4pOworCisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGUtPnBkZXYsIG1hcHBpbmcsIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJLyogV2UnbGwgcmV1c2UgdGhlIG9yaWdpbmFsIHJpbmcgYnVmZmVyLiAqLworCQkJc2tiID0gY29weV9za2I7CisJCX0KKworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMgKHNrYiwgZGUtPmRldik7CisKKwkJZGUtPm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7CisJCWRlLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWRlLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlyYyA9IG5ldGlmX3J4IChza2IpOworCQlpZiAocmMgPT0gTkVUX1JYX0RST1ApCisJCQlkcm9wID0gMTsKKworcnhfbmV4dDoKKwkJZGUtPnJ4X3JpbmdbcnhfdGFpbF0ub3B0czEgPSBjcHVfdG9fbGUzMihEZXNjT3duKTsKKwkJaWYgKHJ4X3RhaWwgPT0gKERFX1JYX1JJTkdfU0laRSAtIDEpKQorCQkJZGUtPnJ4X3JpbmdbcnhfdGFpbF0ub3B0czIgPQorCQkJCWNwdV90b19sZTMyKFJpbmdFbmQgfCBkZS0+cnhfYnVmX3N6KTsKKwkJZWxzZQorCQkJZGUtPnJ4X3JpbmdbcnhfdGFpbF0ub3B0czIgPSBjcHVfdG9fbGUzMihkZS0+cnhfYnVmX3N6KTsKKwkJZGUtPnJ4X3JpbmdbcnhfdGFpbF0uYWRkcjEgPSBjcHVfdG9fbGUzMihtYXBwaW5nKTsKKwkJcnhfdGFpbCA9IE5FWFRfUlgocnhfdGFpbCk7CisJfQorCisJaWYgKCFyeF93b3JrKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcnggd29yayBsaW1pdCByZWFjaGVkXG4iLCBkZS0+ZGV2LT5uYW1lKTsKKworCWRlLT5yeF90YWlsID0gcnhfdGFpbDsKK30KKworc3RhdGljIGlycXJldHVybl90IGRlX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gZHIzMihNYWNTdGF0dXMpOworCWlmICgoIShzdGF0dXMgJiAoSW50ck9LfEludHJFcnIpKSkgfHwgKHN0YXR1cyA9PSAweEZGRkYpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlpZiAobmV0aWZfbXNnX2ludHIoZGUpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludHIsIHN0YXR1cyAlMDh4IG1vZGUgJTA4eCBkZXNjICV1LyV1LyV1XG4iLAorCQkgICAgICAgIGRldi0+bmFtZSwgc3RhdHVzLCBkcjMyKE1hY01vZGUpLCBkZS0+cnhfdGFpbCwgZGUtPnR4X2hlYWQsIGRlLT50eF90YWlsKTsKKworCWR3MzIoTWFjU3RhdHVzLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIChSeEludHIgfCBSeEVtcHR5KSkgeworCQlkZV9yeChkZSk7CisJCWlmIChzdGF0dXMgJiBSeEVtcHR5KQorCQkJZHczMihSeFBvbGwsIE5vcm1hbFJ4UG9sbCk7CisJfQorCisJc3Bpbl9sb2NrKCZkZS0+bG9jayk7CisKKwlpZiAoc3RhdHVzICYgKFR4SW50ciB8IFR4RW1wdHkpKQorCQlkZV90eChkZSk7CisKKwlpZiAoc3RhdHVzICYgKExpbmtQYXNzIHwgTGlua0ZhaWwpKQorCQlkZV9tZWRpYV9pbnRlcnJ1cHQoZGUsIHN0YXR1cyk7CisKKwlzcGluX3VubG9jaygmZGUtPmxvY2spOworCisJaWYgKHN0YXR1cyAmIFBjaUVycikgeworCQl1MTYgcGNpX3N0YXR1czsKKworCQlwY2lfcmVhZF9jb25maWdfd29yZChkZS0+cGRldiwgUENJX1NUQVRVUywgJnBjaV9zdGF0dXMpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGUtPnBkZXYsIFBDSV9TVEFUVVMsIHBjaV9zdGF0dXMpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgYnVzIGVycm9yLCBzdGF0dXM9JTA4eCwgUENJIHN0YXR1cz0lMDR4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMsIHBjaV9zdGF0dXMpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgZGVfdHggKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1bnNpZ25lZCB0eF9oZWFkID0gZGUtPnR4X2hlYWQ7CisJdW5zaWduZWQgdHhfdGFpbCA9IGRlLT50eF90YWlsOworCisJd2hpbGUgKHR4X3RhaWwgIT0gdHhfaGVhZCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQl1MzIgc3RhdHVzOworCisJCXJtYigpOworCQlzdGF0dXMgPSBsZTMyX3RvX2NwdShkZS0+dHhfcmluZ1t0eF90YWlsXS5vcHRzMSk7CisJCWlmIChzdGF0dXMgJiBEZXNjT3duKQorCQkJYnJlYWs7CisKKwkJc2tiID0gZGUtPnR4X3NrYlt0eF90YWlsXS5za2I7CisJCWlmICghc2tiKQorCQkJQlVHKCk7CisJCWlmICh1bmxpa2VseShza2IgPT0gREVfRFVNTVlfU0tCKSkKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAodW5saWtlbHkoc2tiID09IERFX1NFVFVQX1NLQikpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoZGUtPnBkZXYsIGRlLT50eF9za2JbdHhfdGFpbF0ubWFwcGluZywKKwkJCQkJIHNpemVvZihkZS0+c2V0dXBfZnJhbWUpLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCXBjaV91bm1hcF9zaW5nbGUoZGUtPnBkZXYsIGRlLT50eF9za2JbdHhfdGFpbF0ubWFwcGluZywKKwkJCQkgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCWlmIChzdGF0dXMgJiBMYXN0RnJhZykgeworCQkJaWYgKHN0YXR1cyAmIFR4RXJyb3IpIHsKKwkJCQlpZiAobmV0aWZfbXNnX3R4X2VycihkZSkpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHggZXJyLCBzdGF0dXMgMHgleFxuIiwKKwkJCQkJICAgICAgIGRlLT5kZXYtPm5hbWUsIHN0YXR1cyk7CisJCQkJZGUtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgVHhPV0MpCisJCQkJCWRlLT5uZXRfc3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBUeE1heENvbCkKKwkJCQkJZGUtPm5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBUeExpbmtGYWlsKQorCQkJCQlkZS0+bmV0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFR4RklGT1VuZGVyKQorCQkJCQlkZS0+bmV0X3N0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQl9IGVsc2UgeworCQkJCWRlLT5uZXRfc3RhdHMudHhfcGFja2V0cysrOworCQkJCWRlLT5uZXRfc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJaWYgKG5ldGlmX21zZ190eF9kb25lKGRlKSkKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eCBkb25lLCBzbG90ICVkXG4iLCBkZS0+ZGV2LT5uYW1lLCB0eF90YWlsKTsKKwkJCX0KKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCX0KKworbmV4dDoKKwkJZGUtPnR4X3NrYlt0eF90YWlsXS5za2IgPSBOVUxMOworCisJCXR4X3RhaWwgPSBORVhUX1RYKHR4X3RhaWwpOworCX0KKworCWRlLT50eF90YWlsID0gdHhfdGFpbDsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRlLT5kZXYpICYmIChUWF9CVUZGU19BVkFJTChkZSkgPiAoREVfVFhfUklOR19TSVpFIC8gNCkpKQorCQluZXRpZl93YWtlX3F1ZXVlKGRlLT5kZXYpOworfQorCitzdGF0aWMgaW50IGRlX3N0YXJ0X3htaXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGludCBlbnRyeSwgdHhfZnJlZTsKKwl1MzIgbWFwcGluZywgbGVuLCBmbGFncyA9IEZpcnN0RnJhZyB8IExhc3RGcmFnOworCXN0cnVjdCBkZV9kZXNjICp0eGQ7CisKKwlzcGluX2xvY2tfaXJxKCZkZS0+bG9jayk7CisKKwl0eF9mcmVlID0gVFhfQlVGRlNfQVZBSUwoZGUpOworCWlmICh0eF9mcmVlID09IDApIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcGluX3VubG9ja19pcnEoJmRlLT5sb2NrKTsKKwkJcmV0dXJuIDE7CisJfQorCXR4X2ZyZWUtLTsKKworCWVudHJ5ID0gZGUtPnR4X2hlYWQ7CisKKwl0eGQgPSAmZGUtPnR4X3JpbmdbZW50cnldOworCisJbGVuID0gc2tiLT5sZW47CisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKGRlLT5wZGV2LCBza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKGVudHJ5ID09IChERV9UWF9SSU5HX1NJWkUgLSAxKSkKKwkJZmxhZ3MgfD0gUmluZ0VuZDsKKwlpZiAoIXR4X2ZyZWUgfHwgKHR4X2ZyZWUgPT0gKERFX1RYX1JJTkdfU0laRSAvIDIpKSkKKwkJZmxhZ3MgfD0gVHhTd0ludDsKKwlmbGFncyB8PSBsZW47CisJdHhkLT5vcHRzMiA9IGNwdV90b19sZTMyKGZsYWdzKTsKKwl0eGQtPmFkZHIxID0gY3B1X3RvX2xlMzIobWFwcGluZyk7CisKKwlkZS0+dHhfc2tiW2VudHJ5XS5za2IgPSBza2I7CisJZGUtPnR4X3NrYltlbnRyeV0ubWFwcGluZyA9IG1hcHBpbmc7CisJd21iKCk7CisKKwl0eGQtPm9wdHMxID0gY3B1X3RvX2xlMzIoRGVzY093bik7CisJd21iKCk7CisKKwlkZS0+dHhfaGVhZCA9IE5FWFRfVFgoZW50cnkpOworCWlmIChuZXRpZl9tc2dfdHhfcXVldWVkKGRlKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eCBxdWV1ZWQsIHNsb3QgJWQsIHNrYmxlbiAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZW50cnksIHNrYi0+bGVuKTsKKworCWlmICh0eF9mcmVlID09IDApCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycSgmZGUtPmxvY2spOworCisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLworCWR3MzIoVHhQb2xsLCBOb3JtYWxUeFBvbGwpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICAgTm90ZSB0aGF0IHdlIG9ubHkgdXNlIGV4Y2x1c2lvbiBhcm91bmQgYWN0dWFsbHkgcXVldWVpbmcgdGhlCisgICBuZXcgZnJhbWUsIG5vdCBhcm91bmQgZmlsbGluZyBkZS0+c2V0dXBfZnJhbWUuICBUaGlzIGlzIG5vbi1kZXRlcm1pbmlzdGljCisgICB3aGVuIHJlLWVudGVyZWQgYnV0IHN0aWxsIGNvcnJlY3QuICovCisKKyN1bmRlZiBzZXRfYml0X2xlCisjZGVmaW5lIHNldF9iaXRfbGUoaSxwKSBkbyB7ICgoY2hhciAqKShwKSlbKGkpLzhdIHw9ICgxPDwoKGkpJTgpKTsgfSB3aGlsZSgwKQorCitzdGF0aWMgdm9pZCBidWlsZF9zZXR1cF9mcmFtZV9oYXNoKHUxNiAqc2V0dXBfZnJtLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKwl1MTYgaGFzaF90YWJsZVszMl07CisJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJaW50IGk7CisJdTE2ICplYWRkcnM7CisKKwltZW1zZXQoaGFzaF90YWJsZSwgMCwgc2l6ZW9mKGhhc2hfdGFibGUpKTsKKwlzZXRfYml0X2xlKDI1NSwgaGFzaF90YWJsZSk7IAkJCS8qIEJyb2FkY2FzdCBlbnRyeSAqLworCS8qIFRoaXMgc2hvdWxkIHdvcmsgb24gYmlnLWVuZGlhbiBtYWNoaW5lcyBhcyB3ZWxsLiAqLworCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJaW50IGluZGV4ID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSAmIDB4MWZmOworCisJCXNldF9iaXRfbGUoaW5kZXgsIGhhc2hfdGFibGUpOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQkqc2V0dXBfZnJtKysgPSBoYXNoX3RhYmxlW2ldOworCQkJKnNldHVwX2ZybSsrID0gaGFzaF90YWJsZVtpXTsKKwkJfQorCQlzZXR1cF9mcm0gPSAmZGUtPnNldHVwX2ZyYW1lWzEzKjZdOworCX0KKworCS8qIEZpbGwgdGhlIGZpbmFsIGVudHJ5IHdpdGggb3VyIHBoeXNpY2FsIGFkZHJlc3MuICovCisJZWFkZHJzID0gKHUxNiAqKWRldi0+ZGV2X2FkZHI7CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzBdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMF07CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzFdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMV07CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzJdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMl07Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX3NldHVwX2ZyYW1lX3BlcmZlY3QodTE2ICpzZXR1cF9mcm0sIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCWludCBpOworCXUxNiAqZWFkZHJzOworCisJLyogV2UgaGF2ZSA8PSAxNCBhZGRyZXNzZXMgc28gd2UgY2FuIHVzZSB0aGUgd29uZGVyZnVsCisJICAgMTYgYWRkcmVzcyBwZXJmZWN0IGZpbHRlcmluZyBvZiB0aGUgVHVsaXAuICovCisJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBpIDwgZGV2LT5tY19jb3VudDsKKwkgICAgIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCWVhZGRycyA9ICh1MTYgKiltY2xpc3QtPmRtaV9hZGRyOworCQkqc2V0dXBfZnJtKysgPSAqZWFkZHJzOyAqc2V0dXBfZnJtKysgPSAqZWFkZHJzKys7CisJCSpzZXR1cF9mcm0rKyA9ICplYWRkcnM7ICpzZXR1cF9mcm0rKyA9ICplYWRkcnMrKzsKKwkJKnNldHVwX2ZybSsrID0gKmVhZGRyczsgKnNldHVwX2ZybSsrID0gKmVhZGRycysrOworCX0KKwkvKiBGaWxsIHRoZSB1bnVzZWQgZW50cmllcyB3aXRoIHRoZSBicm9hZGNhc3QgYWRkcmVzcy4gKi8KKwltZW1zZXQoc2V0dXBfZnJtLCAweGZmLCAoMTUtaSkqMTIpOworCXNldHVwX2ZybSA9ICZkZS0+c2V0dXBfZnJhbWVbMTUqNl07CisKKwkvKiBGaWxsIHRoZSBmaW5hbCBlbnRyeSB3aXRoIG91ciBwaHlzaWNhbCBhZGRyZXNzLiAqLworCWVhZGRycyA9ICh1MTYgKilkZXYtPmRldl9hZGRyOworCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1swXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzBdOworCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1sxXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzFdOworCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1syXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzJdOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGVfc2V0X3J4X21vZGUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCXUzMiBtYWNtb2RlOworCXVuc2lnbmVkIGludCBlbnRyeTsKKwl1MzIgbWFwcGluZzsKKwlzdHJ1Y3QgZGVfZGVzYyAqdHhkOworCXN0cnVjdCBkZV9kZXNjICpkdW1teV90eGQgPSBOVUxMOworCisJbWFjbW9kZSA9IGRyMzIoTWFjTW9kZSkgJiB+KEFjY2VwdEFsbE11bHRpY2FzdCB8IEFjY2VwdEFsbFBoeXMpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCW1hY21vZGUgfD0gQWNjZXB0QWxsTXVsdGljYXN0IHwgQWNjZXB0QWxsUGh5czsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChkZXYtPm1jX2NvdW50ID4gMTAwMCkgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIGZpbHRlciB3ZWxsIC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJbWFjbW9kZSB8PSBBY2NlcHRBbGxNdWx0aWNhc3Q7CisJCWdvdG8gb3V0OworCX0KKworCS8qIE5vdGUgdGhhdCBvbmx5IHRoZSBsb3ctYWRkcmVzcyBzaG9ydHdvcmQgb2Ygc2V0dXBfZnJhbWUgaXMgdmFsaWQhCisJICAgVGhlIHZhbHVlcyBhcmUgZG91YmxlZCBmb3IgYmlnLWVuZGlhbiBhcmNoaXRlY3R1cmVzLiAqLworCWlmIChkZXYtPm1jX2NvdW50ID4gMTQpCS8qIE11c3QgdXNlIGEgbXVsdGljYXN0IGhhc2ggdGFibGUuICovCisJCWJ1aWxkX3NldHVwX2ZyYW1lX2hhc2ggKGRlLT5zZXR1cF9mcmFtZSwgZGV2KTsKKwllbHNlCisJCWJ1aWxkX3NldHVwX2ZyYW1lX3BlcmZlY3QgKGRlLT5zZXR1cF9mcmFtZSwgZGV2KTsKKworCS8qCisJICogTm93IGFkZCB0aGlzIGZyYW1lIHRvIHRoZSBUeCBsaXN0LgorCSAqLworCisJZW50cnkgPSBkZS0+dHhfaGVhZDsKKworCS8qIEF2b2lkIGEgY2hpcCBlcnJhdGEgYnkgcHJlZml4aW5nIGEgZHVtbXkgZW50cnkuICovCisJaWYgKGVudHJ5ICE9IDApIHsKKwkJZGUtPnR4X3NrYltlbnRyeV0uc2tiID0gREVfRFVNTVlfU0tCOworCisJCWR1bW15X3R4ZCA9ICZkZS0+dHhfcmluZ1tlbnRyeV07CisJCWR1bW15X3R4ZC0+b3B0czIgPSAoZW50cnkgPT0gKERFX1RYX1JJTkdfU0laRSAtIDEpKSA/CisJCQkJICAgY3B1X3RvX2xlMzIoUmluZ0VuZCkgOiAwOworCQlkdW1teV90eGQtPmFkZHIxID0gMDsKKworCQkvKiBNdXN0IHNldCBEZXNjT3duZWQgbGF0ZXIgdG8gYXZvaWQgcmFjZSB3aXRoIGNoaXAgKi8KKworCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCX0KKworCWRlLT50eF9za2JbZW50cnldLnNrYiA9IERFX1NFVFVQX1NLQjsKKwlkZS0+dHhfc2tiW2VudHJ5XS5tYXBwaW5nID0gbWFwcGluZyA9CisJICAgIHBjaV9tYXBfc2luZ2xlIChkZS0+cGRldiwgZGUtPnNldHVwX2ZyYW1lLAorCQkJICAgIHNpemVvZiAoZGUtPnNldHVwX2ZyYW1lKSwgUENJX0RNQV9UT0RFVklDRSk7CisKKwkvKiBQdXQgdGhlIHNldHVwIGZyYW1lIG9uIHRoZSBUeCBsaXN0LiAqLworCXR4ZCA9ICZkZS0+dHhfcmluZ1tlbnRyeV07CisJaWYgKGVudHJ5ID09IChERV9UWF9SSU5HX1NJWkUgLSAxKSkKKwkJdHhkLT5vcHRzMiA9IGNwdV90b19sZTMyKFNldHVwRnJhbWUgfCBSaW5nRW5kIHwgc2l6ZW9mIChkZS0+c2V0dXBfZnJhbWUpKTsKKwllbHNlCisJCXR4ZC0+b3B0czIgPSBjcHVfdG9fbGUzMihTZXR1cEZyYW1lIHwgc2l6ZW9mIChkZS0+c2V0dXBfZnJhbWUpKTsKKwl0eGQtPmFkZHIxID0gY3B1X3RvX2xlMzIobWFwcGluZyk7CisJd21iKCk7CisKKwl0eGQtPm9wdHMxID0gY3B1X3RvX2xlMzIoRGVzY093bik7CisJd21iKCk7CisKKwlpZiAoZHVtbXlfdHhkKSB7CisJCWR1bW15X3R4ZC0+b3B0czEgPSBjcHVfdG9fbGUzMihEZXNjT3duKTsKKwkJd21iKCk7CisJfQorCisJZGUtPnR4X2hlYWQgPSBORVhUX1RYKGVudHJ5KTsKKworCWlmIChUWF9CVUZGU19BVkFJTChkZSkgPCAwKQorCQlCVUcoKTsKKwlpZiAoVFhfQlVGRlNfQVZBSUwoZGUpID09IDApCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHRyYW5zbWl0IGRlbWFuZC4gKi8KKwlkdzMyKFR4UG9sbCwgTm9ybWFsVHhQb2xsKTsKKworb3V0OgorCWlmIChtYWNtb2RlICE9IGRyMzIoTWFjTW9kZSkpCisJCWR3MzIoTWFjTW9kZSwgbWFjbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlX3NldF9yeF9tb2RlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZkZS0+bG9jaywgZmxhZ3MpOworCV9fZGVfc2V0X3J4X21vZGUoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZGUtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlX3J4X21pc3NlZChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUsIHUzMiByeF9taXNzZWQpCit7CisJaWYgKHVubGlrZWx5KHJ4X21pc3NlZCAmIFJ4TWlzc2VkT3ZlcikpCisJCWRlLT5uZXRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBSeE1pc3NlZE1hc2s7CisJZWxzZQorCQlkZS0+bmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gKHJ4X21pc3NlZCAmIFJ4TWlzc2VkTWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGVfZ2V0X3N0YXRzKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1MzIgdG1wID0gZHIzMihSeE1pc3NlZCk7IC8qIHNlbGYtY2xlYXJpbmcgKi8KKworCWRlX3J4X21pc3NlZChkZSwgdG1wKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpkZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisKKwkvKiBUaGUgY2hpcCBvbmx5IG5lZWQgcmVwb3J0IGZyYW1lIHNpbGVudGx5IGRyb3BwZWQuICovCisJc3Bpbl9sb2NrX2lycSgmZGUtPmxvY2spOworIAlpZiAobmV0aWZfcnVubmluZyhkZXYpICYmIG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisgCQlfX2RlX2dldF9zdGF0cyhkZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZS0+bG9jayk7CisKKwlyZXR1cm4gJmRlLT5uZXRfc3RhdHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlX2lzX3J1bm5pbmcgKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwlyZXR1cm4gKGRyMzIoTWFjU3RhdHVzKSAmIChSeFN0YXRlIHwgVHhTdGF0ZSkpID8gMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlX3N0b3Bfcnh0eCAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXUzMiBtYWNtb2RlOworCXVuc2lnbmVkIGludCB3b3JrID0gMTAwMDsKKworCW1hY21vZGUgPSBkcjMyKE1hY01vZGUpOworCWlmIChtYWNtb2RlICYgUnhUeCkgeworCQlkdzMyKE1hY01vZGUsIG1hY21vZGUgJiB+UnhUeCk7CisJCWRyMzIoTWFjTW9kZSk7CisJfQorCisJd2hpbGUgKC0td29yayA+IDApIHsKKwkJaWYgKCFkZV9pc19ydW5uaW5nKGRlKSkKKwkJCXJldHVybjsKKwkJY3B1X3JlbGF4KCk7CisJfQorCQorCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0aW1lb3V0IGV4cGlyZWQgc3RvcHBpbmcgRE1BXG4iLCBkZS0+ZGV2LT5uYW1lKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlX3N0YXJ0X3J4dHggKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1MzIgbWFjbW9kZTsKKworCW1hY21vZGUgPSBkcjMyKE1hY01vZGUpOworCWlmICgobWFjbW9kZSAmIFJ4VHgpICE9IFJ4VHgpIHsKKwkJZHczMihNYWNNb2RlLCBtYWNtb2RlIHwgUnhUeCk7CisJCWRyMzIoTWFjTW9kZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZV9zdG9wX2h3IChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisKKwl1ZGVsYXkoNSk7CisJZHczMihJbnRyTWFzaywgMCk7CisKKwlkZV9zdG9wX3J4dHgoZGUpOworCisJZHczMihNYWNTdGF0dXMsIGRyMzIoTWFjU3RhdHVzKSk7CisKKwl1ZGVsYXkoMTApOworCisJZGUtPnJ4X3RhaWwgPSAwOworCWRlLT50eF9oZWFkID0gZGUtPnR4X3RhaWwgPSAwOworfQorCitzdGF0aWMgdm9pZCBkZV9saW5rX3VwKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwlpZiAoIW5ldGlmX2NhcnJpZXJfb2soZGUtPmRldikpIHsKKwkJbmV0aWZfY2Fycmllcl9vbihkZS0+ZGV2KTsKKwkJaWYgKG5ldGlmX21zZ19saW5rKGRlKSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHVwLCBtZWRpYSAlc1xuIiwKKwkJCSAgICAgICBkZS0+ZGV2LT5uYW1lLCBtZWRpYV9uYW1lW2RlLT5tZWRpYV90eXBlXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZV9saW5rX2Rvd24oc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCWlmIChuZXRpZl9jYXJyaWVyX29rKGRlLT5kZXYpKSB7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRlLT5kZXYpOworCQlpZiAobmV0aWZfbXNnX2xpbmsoZGUpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgZG93blxuIiwgZGUtPmRldi0+bmFtZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZV9zZXRfbWVkaWEgKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1bnNpZ25lZCBtZWRpYSA9IGRlLT5tZWRpYV90eXBlOworCXUzMiBtYWNtb2RlID0gZHIzMihNYWNNb2RlKTsKKworCWlmIChkZV9pc19ydW5uaW5nKGRlKSkKKwkJQlVHKCk7CisKKwlpZiAoZGUtPmRlMjEwNDApCisJCWR3MzIoQ1NSMTEsIEZVTExfRFVQTEVYX01BR0lDKTsKKwlkdzMyKENTUjEzLCAwKTsgLyogUmVzZXQgcGh5ICovCisJZHczMihDU1IxNCwgZGUtPm1lZGlhW21lZGlhXS5jc3IxNCk7CisJZHczMihDU1IxNSwgZGUtPm1lZGlhW21lZGlhXS5jc3IxNSk7CisJZHczMihDU1IxMywgZGUtPm1lZGlhW21lZGlhXS5jc3IxMyk7CisKKwkvKiBtdXN0IGRlbGF5IDEwbXMgYmVmb3JlIHdyaXRpbmcgdG8gb3RoZXIgcmVnaXN0ZXJzLAorCSAqIGVzcGVjaWFsbHkgQ1NSNgorCSAqLworCW1kZWxheSgxMCk7CisKKwlpZiAobWVkaWEgPT0gREVfTUVESUFfVFBfRkQpCisJCW1hY21vZGUgfD0gRnVsbER1cGxleDsKKwllbHNlCisJCW1hY21vZGUgJj0gfkZ1bGxEdXBsZXg7CisJCisJaWYgKG5ldGlmX21zZ19saW5rKGRlKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogc2V0IGxpbmsgJXNcbiIKKwkJICAgICAgIEtFUk5fSU5GTyAiJXM6ICAgIG1vZGUgMHgleCwgc2lhIDB4JXgsMHgleCwweCV4LDB4JXhcbiIKKwkJICAgICAgIEtFUk5fSU5GTyAiJXM6ICAgIHNldCBtb2RlIDB4JXgsIHNldCBzaWEgMHgleCwweCV4LDB4JXhcbiIsCisJCSAgICAgICBkZS0+ZGV2LT5uYW1lLCBtZWRpYV9uYW1lW21lZGlhXSwKKwkJICAgICAgIGRlLT5kZXYtPm5hbWUsIGRyMzIoTWFjTW9kZSksIGRyMzIoU0lBU3RhdHVzKSwKKwkJICAgICAgIGRyMzIoQ1NSMTMpLCBkcjMyKENTUjE0KSwgZHIzMihDU1IxNSksCisJCSAgICAgICBkZS0+ZGV2LT5uYW1lLCBtYWNtb2RlLCBkZS0+bWVkaWFbbWVkaWFdLmNzcjEzLAorCQkgICAgICAgZGUtPm1lZGlhW21lZGlhXS5jc3IxNCwgZGUtPm1lZGlhW21lZGlhXS5jc3IxNSk7CisJfQorCWlmIChtYWNtb2RlICE9IGRyMzIoTWFjTW9kZSkpCisJCWR3MzIoTWFjTW9kZSwgbWFjbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlX25leHRfbWVkaWEgKHN0cnVjdCBkZV9wcml2YXRlICpkZSwgdTMyICptZWRpYSwKKwkJCSAgIHVuc2lnbmVkIGludCBuX21lZGlhKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5fbWVkaWE7IGkrKykgeworCQlpZiAoZGVfb2tfdG9fYWR2ZXJ0aXNlKGRlLCBtZWRpYVtpXSkpIHsKKwkJCWRlLT5tZWRpYV90eXBlID0gbWVkaWFbaV07CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlMjEwNDBfbWVkaWFfdGltZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSAoc3RydWN0IGRlX3ByaXZhdGUgKikgZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGUtPmRldjsKKwl1MzIgc3RhdHVzID0gZHIzMihTSUFTdGF0dXMpOworCXVuc2lnbmVkIGludCBjYXJyaWVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJY2FycmllciA9IChzdGF0dXMgJiBOZXRDeG5FcnIpID8gMCA6IDE7CisJCQorCWlmIChjYXJyaWVyKSB7CisJCWlmIChkZS0+bWVkaWFfdHlwZSAhPSBERV9NRURJQV9BVUkgJiYgKHN0YXR1cyAmIExpbmtGYWlsU3RhdHVzKSkKKwkJCWdvdG8gbm9fbGlua195ZXQ7CisKKwkJZGUtPm1lZGlhX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgREVfVElNRVJfTElOSzsKKwkJYWRkX3RpbWVyKCZkZS0+bWVkaWFfdGltZXIpOworCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2soZGV2KSkKKwkJCWRlX2xpbmtfdXAoZGUpOworCQllbHNlCisJCQlpZiAobmV0aWZfbXNnX3RpbWVyKGRlKSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgbGluayBvaywgc3RhdHVzICV4XG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIG1lZGlhX25hbWVbZGUtPm1lZGlhX3R5cGVdLAorCQkJCSAgICAgICBzdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJZGVfbGlua19kb3duKGRlKTsJCisKKwlpZiAoZGUtPm1lZGlhX2xvY2spCisJCXJldHVybjsKKworCWlmIChkZS0+bWVkaWFfdHlwZSA9PSBERV9NRURJQV9BVUkpIHsKKwkJdTMyIG5leHRfc3RhdGUgPSBERV9NRURJQV9UUDsKKwkJZGVfbmV4dF9tZWRpYShkZSwgJm5leHRfc3RhdGUsIDEpOworCX0gZWxzZSB7CisJCXUzMiBuZXh0X3N0YXRlID0gREVfTUVESUFfQVVJOworCQlkZV9uZXh0X21lZGlhKGRlLCAmbmV4dF9zdGF0ZSwgMSk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlLT5sb2NrLCBmbGFncyk7CisJZGVfc3RvcF9yeHR4KGRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZS0+bG9jaywgZmxhZ3MpOworCWRlX3NldF9tZWRpYShkZSk7CisJZGVfc3RhcnRfcnh0eChkZSk7CisKK25vX2xpbmtfeWV0OgorCWRlLT5tZWRpYV90aW1lci5leHBpcmVzID0gamlmZmllcyArIERFX1RJTUVSX05PX0xJTks7CisJYWRkX3RpbWVyKCZkZS0+bWVkaWFfdGltZXIpOworCisJaWYgKG5ldGlmX21zZ190aW1lcihkZSkpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBsaW5rLCB0cnlpbmcgbWVkaWEgJXMsIHN0YXR1cyAleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbWVkaWFfbmFtZVtkZS0+bWVkaWFfdHlwZV0sIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVfb2tfdG9fYWR2ZXJ0aXNlIChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUsIHUzMiBuZXdfbWVkaWEpCit7CisJc3dpdGNoIChuZXdfbWVkaWEpIHsKKwljYXNlIERFX01FRElBX1RQX0FVVE86CisJCWlmICghKGRlLT5tZWRpYV9hZHZlcnRpc2UgJiBBRFZFUlRJU0VEX0F1dG9uZWcpKQorCQkJcmV0dXJuIDA7CisJCWlmICghKGRlLT5tZWRpYV9hZHZlcnRpc2UgJiAoQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkpKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgREVfTUVESUFfQk5DOgorCQlpZiAoIShkZS0+bWVkaWFfYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF9CTkMpKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgREVfTUVESUFfQVVJOgorCQlpZiAoIShkZS0+bWVkaWFfYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF9BVUkpKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgREVfTUVESUFfVFA6CisJCWlmICghKGRlLT5tZWRpYV9hZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBERV9NRURJQV9UUF9GRDoKKwkJaWYgKCEoZGUtPm1lZGlhX2FkdmVydGlzZSAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwl9CisJCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRlMjEwNDFfbWVkaWFfdGltZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSAoc3RydWN0IGRlX3ByaXZhdGUgKikgZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGUtPmRldjsKKwl1MzIgc3RhdHVzID0gZHIzMihTSUFTdGF0dXMpOworCXVuc2lnbmVkIGludCBjYXJyaWVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJY2FycmllciA9IChzdGF0dXMgJiBOZXRDeG5FcnIpID8gMCA6IDE7CisJCQorCWlmIChjYXJyaWVyKSB7CisJCWlmICgoZGUtPm1lZGlhX3R5cGUgPT0gREVfTUVESUFfVFBfQVVUTyB8fAorCQkgICAgIGRlLT5tZWRpYV90eXBlID09IERFX01FRElBX1RQIHx8CisJCSAgICAgZGUtPm1lZGlhX3R5cGUgPT0gREVfTUVESUFfVFBfRkQpICYmCisJCSAgICAoc3RhdHVzICYgTGlua0ZhaWxTdGF0dXMpKQorCQkJZ290byBub19saW5rX3lldDsKKworCQlkZS0+bWVkaWFfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBERV9USU1FUl9MSU5LOworCQlhZGRfdGltZXIoJmRlLT5tZWRpYV90aW1lcik7CisJCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQkJZGVfbGlua191cChkZSk7CisJCWVsc2UKKwkJCWlmIChuZXRpZl9tc2dfdGltZXIoZGUpKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBsaW5rIG9rLCBtb2RlICV4IHN0YXR1cyAleFxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBtZWRpYV9uYW1lW2RlLT5tZWRpYV90eXBlXSwKKwkJCQkgICAgICAgZHIzMihNYWNNb2RlKSwgc3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCWRlX2xpbmtfZG93bihkZSk7CQorCisJLyogaWYgbWVkaWEgdHlwZSBsb2NrZWQsIGRvbid0IHN3aXRjaCBtZWRpYSAqLworCWlmIChkZS0+bWVkaWFfbG9jaykKKwkJZ290byBzZXRfbWVkaWE7CisKKwkvKiBpZiBhY3Rpdml0eSBkZXRlY3RlZCwgdXNlIHRoYXQgYXMgaGludCBmb3IgbmV3IG1lZGlhIHR5cGUgKi8KKwlpZiAoc3RhdHVzICYgTm9uc2VsUG9ydEFjdGl2ZSkgeworCQl1bnNpZ25lZCBpbnQgaGF2ZV9tZWRpYSA9IDE7CisKKwkJLyogaWYgQVVJL0JOQyBzZWxlY3RlZCwgdGhlbiBhY3Rpdml0eSBpcyBvbiBUUCBwb3J0ICovCisJCWlmIChkZS0+bWVkaWFfdHlwZSA9PSBERV9NRURJQV9BVUkgfHwKKwkJICAgIGRlLT5tZWRpYV90eXBlID09IERFX01FRElBX0JOQykgeworCQkJaWYgKGRlX29rX3RvX2FkdmVydGlzZShkZSwgREVfTUVESUFfVFBfQVVUTykpCisJCQkJZGUtPm1lZGlhX3R5cGUgPSBERV9NRURJQV9UUF9BVVRPOworCQkJZWxzZQorCQkJCWhhdmVfbWVkaWEgPSAwOworCQl9CisKKwkJLyogVFAgc2VsZWN0ZWQuICBJZiB0aGVyZSBpcyBvbmx5IFRQIGFuZCBCTkMsIHRoZW4gaXQncyBCTkMgKi8KKwkJZWxzZSBpZiAoKChkZS0+bWVkaWFfc3VwcG9ydGVkICYgREVfQVVJX0JOQykgPT0gU1VQUE9SVEVEX0JOQykgJiYKKwkJCSBkZV9va190b19hZHZlcnRpc2UoZGUsIERFX01FRElBX0JOQykpCisJCQlkZS0+bWVkaWFfdHlwZSA9IERFX01FRElBX0JOQzsKKworCQkvKiBUUCBzZWxlY3RlZC4gIElmIHRoZXJlIGlzIG9ubHkgVFAgYW5kIEFVSSwgdGhlbiBpdCdzIEFVSSAqLworCQllbHNlIGlmICgoKGRlLT5tZWRpYV9zdXBwb3J0ZWQgJiBERV9BVUlfQk5DKSA9PSBTVVBQT1JURURfQVVJKSAmJgorCQkJIGRlX29rX3RvX2FkdmVydGlzZShkZSwgREVfTUVESUFfQVVJKSkKKwkJCWRlLT5tZWRpYV90eXBlID0gREVfTUVESUFfQVVJOworCisJCS8qIG90aGVyd2lzZSwgaWdub3JlIHRoZSBoaW50ICovCisJCWVsc2UKKwkJCWhhdmVfbWVkaWEgPSAwOworCisJCWlmIChoYXZlX21lZGlhKQorCQkJZ290byBzZXRfbWVkaWE7CisJfQorCisJLyoKKwkgKiBBYnNlbnQgb3IgYW1iaWd1b3VzIGFjdGl2aXR5IGhpbnQsIG1vdmUgdG8gbmV4dCBhZHZlcnRpc2VkCisJICogbWVkaWEgc3RhdGUuICBJZiBkZS0+bWVkaWFfdHlwZSBpcyBsZWZ0IHVuY2hhbmdlZCwgdGhpcworCSAqIHNpbXBseSByZXNldHMgdGhlIFBIWSBhbmQgcmVsb2FkcyB0aGUgY3VycmVudCBtZWRpYSBzZXR0aW5ncy4KKwkgKi8KKwlpZiAoZGUtPm1lZGlhX3R5cGUgPT0gREVfTUVESUFfQVVJKSB7CisJCXUzMiBuZXh0X3N0YXRlc1tdID0geyBERV9NRURJQV9CTkMsIERFX01FRElBX1RQX0FVVE8gfTsKKwkJZGVfbmV4dF9tZWRpYShkZSwgbmV4dF9zdGF0ZXMsIEFSUkFZX1NJWkUobmV4dF9zdGF0ZXMpKTsKKwl9IGVsc2UgaWYgKGRlLT5tZWRpYV90eXBlID09IERFX01FRElBX0JOQykgeworCQl1MzIgbmV4dF9zdGF0ZXNbXSA9IHsgREVfTUVESUFfVFBfQVVUTywgREVfTUVESUFfQVVJIH07CisJCWRlX25leHRfbWVkaWEoZGUsIG5leHRfc3RhdGVzLCBBUlJBWV9TSVpFKG5leHRfc3RhdGVzKSk7CisJfSBlbHNlIHsKKwkJdTMyIG5leHRfc3RhdGVzW10gPSB7IERFX01FRElBX0FVSSwgREVfTUVESUFfQk5DLCBERV9NRURJQV9UUF9BVVRPIH07CisJCWRlX25leHRfbWVkaWEoZGUsIG5leHRfc3RhdGVzLCBBUlJBWV9TSVpFKG5leHRfc3RhdGVzKSk7CisJfQorCQorc2V0X21lZGlhOgorCXNwaW5fbG9ja19pcnFzYXZlKCZkZS0+bG9jaywgZmxhZ3MpOworCWRlX3N0b3Bfcnh0eChkZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGUtPmxvY2ssIGZsYWdzKTsKKwlkZV9zZXRfbWVkaWEoZGUpOworCWRlX3N0YXJ0X3J4dHgoZGUpOworCitub19saW5rX3lldDoKKwlkZS0+bWVkaWFfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBERV9USU1FUl9OT19MSU5LOworCWFkZF90aW1lcigmZGUtPm1lZGlhX3RpbWVyKTsKKworCWlmIChuZXRpZl9tc2dfdGltZXIoZGUpKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogbm8gbGluaywgdHJ5aW5nIG1lZGlhICVzLCBzdGF0dXMgJXhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIG1lZGlhX25hbWVbZGUtPm1lZGlhX3R5cGVdLCBzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBkZV9tZWRpYV9pbnRlcnJ1cHQgKHN0cnVjdCBkZV9wcml2YXRlICpkZSwgdTMyIHN0YXR1cykKK3sKKwlpZiAoc3RhdHVzICYgTGlua1Bhc3MpIHsKKwkJZGVfbGlua191cChkZSk7CisJCW1vZF90aW1lcigmZGUtPm1lZGlhX3RpbWVyLCBqaWZmaWVzICsgREVfVElNRVJfTElOSyk7CisJCXJldHVybjsKKwl9CisJCisJaWYgKCEoc3RhdHVzICYgTGlua0ZhaWwpKQorCQlCVUcoKTsKKworCWlmIChuZXRpZl9jYXJyaWVyX29rKGRlLT5kZXYpKSB7CisJCWRlX2xpbmtfZG93bihkZSk7CisJCW1vZF90aW1lcigmZGUtPm1lZGlhX3RpbWVyLCBqaWZmaWVzICsgREVfVElNRVJfTk9fTElOSyk7CisJfQorfQorCitzdGF0aWMgaW50IGRlX3Jlc2V0X21hYyAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXUzMiBzdGF0dXMsIHRtcDsKKworCS8qCisJICogUmVzZXQgTUFDLiAgZGU0eDUuYyBhbmQgdHVsaXAuYyBleGFtaW5lZCBmb3IgImFkdmljZSIKKwkgKiBpbiB0aGlzIGFyZWEuCisJICovCisKKwlpZiAoZHIzMihCdXNNb2RlKSA9PSAweGZmZmZmZmZmKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogUmVzZXQgdGhlIGNoaXAsIGhvbGRpbmcgYml0IDAgc2V0IGF0IGxlYXN0IDUwIFBDSSBjeWNsZXMuICovCisJZHczMiAoQnVzTW9kZSwgQ21kUmVzZXQpOworCW1kZWxheSAoMSk7CisKKwlkdzMyIChCdXNNb2RlLCBkZV9idXNfbW9kZSk7CisJbWRlbGF5ICgxKTsKKworCWZvciAodG1wID0gMDsgdG1wIDwgNTsgdG1wKyspIHsKKwkJZHIzMiAoQnVzTW9kZSk7CisJCW1kZWxheSAoMSk7CisJfQorCisJbWRlbGF5ICgxKTsKKworCXN0YXR1cyA9IGRyMzIoTWFjU3RhdHVzKTsKKwlpZiAoc3RhdHVzICYgKFJ4U3RhdGUgfCBUeFN0YXRlKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAoc3RhdHVzID09IDB4ZmZmZmZmZmYpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZV9hZGFwdGVyX3dha2UgKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1MzIgcG1jdGw7CisKKwlpZiAoZGUtPmRlMjEwNDApCisJCXJldHVybjsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZS0+cGRldiwgUENJUE0sICZwbWN0bCk7CisJaWYgKHBtY3RsICYgUE1fTWFzaykgeworCQlwbWN0bCAmPSB+UE1fTWFzazsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZS0+cGRldiwgUENJUE0sIHBtY3RsKTsKKworCQkvKiBkZTR4NS5jIGRlbGF5cywgc28gd2UgZG8gdG9vICovCisJCW1zbGVlcCgxMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZV9hZGFwdGVyX3NsZWVwIChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisJdTMyIHBtY3RsOworCisJaWYgKGRlLT5kZTIxMDQwKQorCQlyZXR1cm47CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGUtPnBkZXYsIFBDSVBNLCAmcG1jdGwpOworCXBtY3RsIHw9IFBNX1NsZWVwOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGUtPnBkZXYsIFBDSVBNLCBwbWN0bCk7Cit9CisKK3N0YXRpYyBpbnQgZGVfaW5pdF9odyAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZS0+ZGV2OworCXUzMiBtYWNtb2RlOworCWludCByYzsKKworCWRlX2FkYXB0ZXJfd2FrZShkZSk7CisJCisJbWFjbW9kZSA9IGRyMzIoTWFjTW9kZSkgJiB+TWFjTW9kZUNsZWFyOworCisJcmMgPSBkZV9yZXNldF9tYWMoZGUpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJZGVfc2V0X21lZGlhKGRlKTsgLyogcmVzZXQgcGh5ICovCisKKwlkdzMyKFJ4UmluZ0FkZHIsIGRlLT5yaW5nX2RtYSk7CisJZHczMihUeFJpbmdBZGRyLCBkZS0+cmluZ19kbWEgKyAoc2l6ZW9mKHN0cnVjdCBkZV9kZXNjKSAqIERFX1JYX1JJTkdfU0laRSkpOworCisJZHczMihNYWNNb2RlLCBSeFR4IHwgbWFjbW9kZSk7CisKKwlkcjMyKFJ4TWlzc2VkKTsgLyogc2VsZi1jbGVhcmluZyAqLworCisJZHczMihJbnRyTWFzaywgZGVfaW50cl9tYXNrKTsKKworCWRlX3NldF9yeF9tb2RlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZV9yZWZpbGxfcnggKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IERFX1JYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihkZS0+cnhfYnVmX3N6KTsKKwkJaWYgKCFza2IpCisJCQlnb3RvIGVycl9vdXQ7CisKKwkJc2tiLT5kZXYgPSBkZS0+ZGV2OworCisJCWRlLT5yeF9za2JbaV0ubWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKGRlLT5wZGV2LAorCQkJc2tiLT50YWlsLCBkZS0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlkZS0+cnhfc2tiW2ldLnNrYiA9IHNrYjsKKworCQlkZS0+cnhfcmluZ1tpXS5vcHRzMSA9IGNwdV90b19sZTMyKERlc2NPd24pOworCQlpZiAoaSA9PSAoREVfUlhfUklOR19TSVpFIC0gMSkpCisJCQlkZS0+cnhfcmluZ1tpXS5vcHRzMiA9CisJCQkJY3B1X3RvX2xlMzIoUmluZ0VuZCB8IGRlLT5yeF9idWZfc3opOworCQllbHNlCisJCQlkZS0+cnhfcmluZ1tpXS5vcHRzMiA9IGNwdV90b19sZTMyKGRlLT5yeF9idWZfc3opOworCQlkZS0+cnhfcmluZ1tpXS5hZGRyMSA9IGNwdV90b19sZTMyKGRlLT5yeF9za2JbaV0ubWFwcGluZyk7CisJCWRlLT5yeF9yaW5nW2ldLmFkZHIyID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlkZV9jbGVhbl9yaW5ncyhkZSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgZGVfaW5pdF9yaW5ncyAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCW1lbXNldChkZS0+dHhfcmluZywgMCwgc2l6ZW9mKHN0cnVjdCBkZV9kZXNjKSAqIERFX1RYX1JJTkdfU0laRSk7CisJZGUtPnR4X3JpbmdbREVfVFhfUklOR19TSVpFIC0gMV0ub3B0czIgPSBjcHVfdG9fbGUzMihSaW5nRW5kKTsKKworCWRlLT5yeF90YWlsID0gMDsKKwlkZS0+dHhfaGVhZCA9IGRlLT50eF90YWlsID0gMDsKKworCXJldHVybiBkZV9yZWZpbGxfcnggKGRlKTsKK30KKworc3RhdGljIGludCBkZV9hbGxvY19yaW5ncyAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCWRlLT5yeF9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGUtPnBkZXYsIERFX1JJTkdfQllURVMsICZkZS0+cmluZ19kbWEpOworCWlmICghZGUtPnJ4X3JpbmcpCisJCXJldHVybiAtRU5PTUVNOworCWRlLT50eF9yaW5nID0gJmRlLT5yeF9yaW5nW0RFX1JYX1JJTkdfU0laRV07CisJcmV0dXJuIGRlX2luaXRfcmluZ3MoZGUpOworfQorCitzdGF0aWMgdm9pZCBkZV9jbGVhbl9yaW5ncyAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXVuc2lnbmVkIGk7CisKKwltZW1zZXQoZGUtPnJ4X3JpbmcsIDAsIHNpemVvZihzdHJ1Y3QgZGVfZGVzYykgKiBERV9SWF9SSU5HX1NJWkUpOworCWRlLT5yeF9yaW5nW0RFX1JYX1JJTkdfU0laRSAtIDFdLm9wdHMyID0gY3B1X3RvX2xlMzIoUmluZ0VuZCk7CisJd21iKCk7CisJbWVtc2V0KGRlLT50eF9yaW5nLCAwLCBzaXplb2Yoc3RydWN0IGRlX2Rlc2MpICogREVfVFhfUklOR19TSVpFKTsKKwlkZS0+dHhfcmluZ1tERV9UWF9SSU5HX1NJWkUgLSAxXS5vcHRzMiA9IGNwdV90b19sZTMyKFJpbmdFbmQpOworCXdtYigpOworCisJZm9yIChpID0gMDsgaSA8IERFX1JYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChkZS0+cnhfc2tiW2ldLnNrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZShkZS0+cGRldiwgZGUtPnJ4X3NrYltpXS5tYXBwaW5nLAorCQkJCQkgZGUtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IoZGUtPnJ4X3NrYltpXS5za2IpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IERFX1RYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZS0+dHhfc2tiW2ldLnNrYjsKKwkJaWYgKChza2IpICYmIChza2IgIT0gREVfRFVNTVlfU0tCKSkgeworCQkJaWYgKHNrYiAhPSBERV9TRVRVUF9TS0IpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJZGUtPm5ldF9zdGF0cy50eF9kcm9wcGVkKys7CisJCQkJcGNpX3VubWFwX3NpbmdsZShkZS0+cGRldiwKKwkJCQkJZGUtPnR4X3NrYltpXS5tYXBwaW5nLAorCQkJCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQl9IGVsc2UgeworCQkJCXBjaV91bm1hcF9zaW5nbGUoZGUtPnBkZXYsCisJCQkJCWRlLT50eF9za2JbaV0ubWFwcGluZywKKwkJCQkJc2l6ZW9mKGRlLT5zZXR1cF9mcmFtZSksCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJfQorCQl9CisJfQorCisJbWVtc2V0KCZkZS0+cnhfc2tiLCAwLCBzaXplb2Yoc3RydWN0IHJpbmdfaW5mbykgKiBERV9SWF9SSU5HX1NJWkUpOworCW1lbXNldCgmZGUtPnR4X3NrYiwgMCwgc2l6ZW9mKHN0cnVjdCByaW5nX2luZm8pICogREVfVFhfUklOR19TSVpFKTsKK30KKworc3RhdGljIHZvaWQgZGVfZnJlZV9yaW5ncyAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCWRlX2NsZWFuX3JpbmdzKGRlKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGRlLT5wZGV2LCBERV9SSU5HX0JZVEVTLCBkZS0+cnhfcmluZywgZGUtPnJpbmdfZG1hKTsKKwlkZS0+cnhfcmluZyA9IE5VTEw7CisJZGUtPnR4X3JpbmcgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGRlX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG5ldGlmX21zZ19pZnVwKGRlKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbmFibGluZyBpbnRlcmZhY2VcbiIsIGRldi0+bmFtZSk7CisKKwlkZS0+cnhfYnVmX3N6ID0gKGRldi0+bXR1IDw9IDE1MDAgPyBQS1RfQlVGX1NaIDogZGV2LT5tdHUgKyAzMik7CisKKwlyYyA9IGRlX2FsbG9jX3JpbmdzKGRlKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcmluZyBhbGxvY2F0aW9uIGZhaWx1cmUsIGVycj0lZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBkZV9pbml0X2h3KGRlKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaC93IGluaXQgZmFpbHVyZSwgZXJyPSVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCByYyk7CisJCWdvdG8gZXJyX291dF9mcmVlOworCX0KKworCXJjID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGRlX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSVJRICVkIHJlcXVlc3QgZmFpbHVyZSwgZXJyPSVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmlycSwgcmMpOworCQlnb3RvIGVycl9vdXRfaHc7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwltb2RfdGltZXIoJmRlLT5tZWRpYV90aW1lciwgamlmZmllcyArIERFX1RJTUVSX05PX0xJTkspOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaHc6CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlLT5sb2NrLCBmbGFncyk7CisJZGVfc3RvcF9odyhkZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGUtPmxvY2ssIGZsYWdzKTsKKworZXJyX291dF9mcmVlOgorCWRlX2ZyZWVfcmluZ3MoZGUpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBkZV9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChuZXRpZl9tc2dfaWZkb3duKGRlKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkaXNhYmxpbmcgaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOworCisJZGVsX3RpbWVyX3N5bmMoJmRlLT5tZWRpYV90aW1lcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGUtPmxvY2ssIGZsYWdzKTsKKwlkZV9zdG9wX2h3KGRlKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZS0+bG9jaywgZmxhZ3MpOworCQorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJZGVfZnJlZV9yaW5ncyhkZSk7CisJZGVfYWRhcHRlcl9zbGVlcChkZSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRlLT5wZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5JQyBzdGF0dXMgJTA4eCBtb2RlICUwOHggc2lhICUwOHggZGVzYyAldS8ldS8ldVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBkcjMyKE1hY1N0YXR1cyksIGRyMzIoTWFjTW9kZSksIGRyMzIoU0lBU3RhdHVzKSwKKwkgICAgICAgZGUtPnJ4X3RhaWwsIGRlLT50eF9oZWFkLCBkZS0+dHhfdGFpbCk7CisKKwlkZWxfdGltZXJfc3luYygmZGUtPm1lZGlhX3RpbWVyKTsKKworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlzcGluX2xvY2tfaXJxKCZkZS0+bG9jayk7CisKKwlkZV9zdG9wX2h3KGRlKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycSgmZGUtPmxvY2spOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCQkKKwkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50cy4gKi8KKwlfX2RlX2dldF9zdGF0cyhkZSk7CisKKwlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCWRlX2NsZWFuX3JpbmdzKGRlKTsKKworCWRlX2luaXRfaHcoZGUpOworCQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgX19kZV9nZXRfcmVncyhzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUsIHU4ICpidWYpCit7CisJaW50IGk7CisJdTMyICpyYnVmID0gKHUzMiAqKWJ1ZjsKKwkKKwkvKiByZWFkIGFsbCBDU1JzICovCisJZm9yIChpID0gMDsgaSA8IERFX05VTV9SRUdTOyBpKyspCisJCXJidWZbaV0gPSBkcjMyKGkgKiA4KTsKKworCS8qIGhhbmRsZSBzZWxmLWNsZWFyaW5nIFJ4TWlzc2VkIGNvdW50ZXIsIENTUjggKi8KKwlkZV9yeF9taXNzZWQoZGUsIHJidWZbOF0pOworfQorCitzdGF0aWMgaW50IF9fZGVfZ2V0X3NldHRpbmdzKHN0cnVjdCBkZV9wcml2YXRlICpkZSwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCWVjbWQtPnN1cHBvcnRlZCA9IGRlLT5tZWRpYV9zdXBwb3J0ZWQ7CisJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCWVjbWQtPnBoeV9hZGRyZXNzID0gMDsKKwllY21kLT5hZHZlcnRpc2luZyA9IGRlLT5tZWRpYV9hZHZlcnRpc2U7CisJCisJc3dpdGNoIChkZS0+bWVkaWFfdHlwZSkgeworCWNhc2UgREVfTUVESUFfQVVJOgorCQllY21kLT5wb3J0ID0gUE9SVF9BVUk7CisJCWVjbWQtPnNwZWVkID0gNTsKKwkJYnJlYWs7CisJY2FzZSBERV9NRURJQV9CTkM6CisJCWVjbWQtPnBvcnQgPSBQT1JUX0JOQzsKKwkJZWNtZC0+c3BlZWQgPSAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllY21kLT5wb3J0ID0gUE9SVF9UUDsKKwkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKKwkJYnJlYWs7CisJfQorCQorCWlmIChkcjMyKE1hY01vZGUpICYgRnVsbER1cGxleCkKKwkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJZWxzZQorCQllY21kLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKworCWlmIChkZS0+bWVkaWFfbG9jaykKKwkJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwllbHNlCisJCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKworCS8qIGlnbm9yZSBtYXh0eHBrdCwgbWF4cnhwa3QgZm9yIG5vdyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZV9zZXRfc2V0dGluZ3Moc3RydWN0IGRlX3ByaXZhdGUgKmRlLCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJdTMyIG5ld19tZWRpYTsKKwl1bnNpZ25lZCBpbnQgbWVkaWFfbG9jazsKKworCWlmIChlY21kLT5zcGVlZCAhPSBTUEVFRF8xMCAmJiBlY21kLT5zcGVlZCAhPSA1ICYmIGVjbWQtPnNwZWVkICE9IDIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkZS0+ZGUyMTA0MCAmJiBlY21kLT5zcGVlZCA9PSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+ZHVwbGV4ICE9IERVUExFWF9IQUxGICYmIGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPnBvcnQgIT0gUE9SVF9UUCAmJiBlY21kLT5wb3J0ICE9IFBPUlRfQVVJICYmIGVjbWQtPnBvcnQgIT0gUE9SVF9CTkMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkZS0+ZGUyMTA0MCAmJiBlY21kLT5wb3J0ID09IFBPUlRfQk5DKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+dHJhbnNjZWl2ZXIgIT0gWENWUl9JTlRFUk5BTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19ESVNBQkxFICYmIGVjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlY21kLT5hZHZlcnRpc2luZyAmIH5kZS0+bWVkaWFfc3VwcG9ydGVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSAmJgorCSAgICAoIShlY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfQXV0b25lZykpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwlzd2l0Y2ggKGVjbWQtPnBvcnQpIHsKKwljYXNlIFBPUlRfQVVJOgorCQluZXdfbWVkaWEgPSBERV9NRURJQV9BVUk7CisJCWlmICghKGVjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF9BVUkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgUE9SVF9CTkM6CisJCW5ld19tZWRpYSA9IERFX01FRElBX0JOQzsKKwkJaWYgKCEoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEX0JOQykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCisJCQluZXdfbWVkaWEgPSBERV9NRURJQV9UUF9BVVRPOworCQllbHNlIGlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQluZXdfbWVkaWEgPSBERV9NRURJQV9UUF9GRDsKKwkJZWxzZQorCQkJbmV3X21lZGlhID0gREVfTUVESUFfVFA7CisJCWlmICghKGVjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF9UUCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCEoZWNtZC0+YWR2ZXJ0aXNpbmcgJiAoQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfCBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwkKKwltZWRpYV9sb2NrID0gKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpID8gMCA6IDE7CisJCisJaWYgKChuZXdfbWVkaWEgPT0gZGUtPm1lZGlhX3R5cGUpICYmCisJICAgIChtZWRpYV9sb2NrID09IGRlLT5tZWRpYV9sb2NrKSAmJgorCSAgICAoZWNtZC0+YWR2ZXJ0aXNpbmcgPT0gZGUtPm1lZGlhX2FkdmVydGlzZSkpCisJCXJldHVybiAwOyAvKiBub3RoaW5nIHRvIGNoYW5nZSAqLworCSAgICAKKwlkZV9saW5rX2Rvd24oZGUpOworCWRlX3N0b3Bfcnh0eChkZSk7CisJCisJZGUtPm1lZGlhX3R5cGUgPSBuZXdfbWVkaWE7CisJZGUtPm1lZGlhX2xvY2sgPSBtZWRpYV9sb2NrOworCWRlLT5tZWRpYV9hZHZlcnRpc2UgPSBlY21kLT5hZHZlcnRpc2luZzsKKwlkZV9zZXRfbWVkaWEoZGUpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZV9nZXRfZHJ2aW5mbyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKworCXN0cmNweSAoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5IChpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5IChpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoZGUtPnBkZXYpKTsKKwlpbmZvLT5lZWR1bXBfbGVuID0gREVfRUVQUk9NX1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgZGVfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIERFX1JFR1NfU0laRTsKK30KKworc3RhdGljIGludCBkZV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxKCZkZS0+bG9jayk7CisJcmMgPSBfX2RlX2dldF9zZXR0aW5ncyhkZSwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZS0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZGVfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmZGUtPmxvY2spOworCXJjID0gX19kZV9zZXRfc2V0dGluZ3MoZGUsIGVjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmZGUtPmxvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdTMyIGRlX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKworCXJldHVybiBkZS0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgZGVfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBtc2dsdmwpCit7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCisJZGUtPm1zZ19lbmFibGUgPSBtc2dsdmw7Cit9CisKK3N0YXRpYyBpbnQgZGVfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisKKwlpZiAoIWRlLT5lZV9kYXRhKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKChlZXByb20tPm9mZnNldCAhPSAwKSB8fCAoZWVwcm9tLT5tYWdpYyAhPSAwKSB8fAorCSAgICAoZWVwcm9tLT5sZW4gIT0gREVfRUVQUk9NX1NJWkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltZW1jcHkoZGF0YSwgZGUtPmVlX2RhdGEsIGVlcHJvbS0+bGVuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisJdTMyIHN0YXR1czsKKworCWlmIChkZS0+bWVkaWFfdHlwZSAhPSBERV9NRURJQV9UUF9BVVRPKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobmV0aWZfY2Fycmllcl9vayhkZS0+ZGV2KSkKKwkJZGVfbGlua19kb3duKGRlKTsKKworCXN0YXR1cyA9IGRyMzIoU0lBU3RhdHVzKTsKKwlkdzMyKFNJQVN0YXR1cywgKHN0YXR1cyAmIH5OV2F5U3RhdGUpIHwgTldheVJlc3RhcnQpOworCWlmIChuZXRpZl9tc2dfbGluayhkZSkpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIG53YXkgcmVzdGFydCwgc3RhdHVzICV4LCV4XG4iLAorCQkgICAgICAgZGUtPmRldi0+bmFtZSwgc3RhdHVzLCBkcjMyKFNJQVN0YXR1cykpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZV9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLAorCQkJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisKKwlyZWdzLT52ZXJzaW9uID0gKERFX1JFR1NfVkVSIDw8IDIpIHwgZGUtPmRlMjEwNDA7CisKKwlzcGluX2xvY2tfaXJxKCZkZS0+bG9jayk7CisJX19kZV9nZXRfcmVncyhkZSwgZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZS0+bG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZGVfZXRodG9vbF9vcHMgPSB7CisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF90eF9jc3VtCQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisJLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLmdldF9kcnZpbmZvCQk9IGRlX2dldF9kcnZpbmZvLAorCS5nZXRfcmVnc19sZW4JCT0gZGVfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfc2V0dGluZ3MJCT0gZGVfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gZGVfc2V0X3NldHRpbmdzLAorCS5nZXRfbXNnbGV2ZWwJCT0gZGVfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gZGVfc2V0X21zZ2xldmVsLAorCS5nZXRfZWVwcm9tCQk9IGRlX2dldF9lZXByb20sCisJLm53YXlfcmVzZXQJCT0gZGVfbndheV9yZXNldCwKKwkuZ2V0X3JlZ3MJCT0gZGVfZ2V0X3JlZ3MsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZGUyMTA0MF9nZXRfbWFjX2FkZHJlc3MgKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1bnNpZ25lZCBpOworCisJZHczMiAoUk9NQ21kLCAwKTsJLyogUmVzZXQgdGhlIHBvaW50ZXIgd2l0aCBhIGR1bW15IHdyaXRlLiAqLworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlpbnQgdmFsdWUsIGJvZ3VzY250ID0gMTAwMDAwOworCQlkbworCQkJdmFsdWUgPSBkcjMyKFJPTUNtZCk7CisJCXdoaWxlICh2YWx1ZSA8IDAgJiYgLS1ib2d1c2NudCA+IDApOworCQlkZS0+ZGV2LT5kZXZfYWRkcltpXSA9IHZhbHVlOworCQl1ZGVsYXkoMSk7CisJCWlmIChib2d1c2NudCA8PSAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggInRpbWVvdXQgcmVhZGluZyAyMTA0MCBNQUMgYWRkcmVzcyBieXRlICV1XG4iLCBpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkZTIxMDQwX2dldF9tZWRpYV9pbmZvKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWRlLT5tZWRpYV90eXBlID0gREVfTUVESUFfVFA7CisJZGUtPm1lZGlhX3N1cHBvcnRlZCB8PSBTVVBQT1JURURfVFAgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCSAgICAgICBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEX0FVSTsKKwlkZS0+bWVkaWFfYWR2ZXJ0aXNlID0gZGUtPm1lZGlhX3N1cHBvcnRlZDsKKworCWZvciAoaSA9IDA7IGkgPCBERV9NQVhfTUVESUE7IGkrKykgeworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSBERV9NRURJQV9BVUk6CisJCWNhc2UgREVfTUVESUFfVFA6CisJCWNhc2UgREVfTUVESUFfVFBfRkQ6CisJCQlkZS0+bWVkaWFbaV0udHlwZSA9IGk7CisJCQlkZS0+bWVkaWFbaV0uY3NyMTMgPSB0MjEwNDBfY3NyMTNbaV07CisJCQlkZS0+bWVkaWFbaV0uY3NyMTQgPSB0MjEwNDBfY3NyMTRbaV07CisJCQlkZS0+bWVkaWFbaV0uY3NyMTUgPSB0MjEwNDBfY3NyMTVbaV07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRlLT5tZWRpYVtpXS50eXBlID0gREVfTUVESUFfSU5WQUxJRDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiBOb3RlOiB0aGlzIHJvdXRpbmUgcmV0dXJucyBleHRyYSBkYXRhIGJpdHMgZm9yIHNpemUgZGV0ZWN0aW9uLiAqLworc3RhdGljIHVuc2lnbmVkIF9faW5pdCB0dWxpcF9yZWFkX2VlcHJvbSh2b2lkIF9faW9tZW0gKnJlZ3MsIGludCBsb2NhdGlvbiwgaW50IGFkZHJfbGVuKQoreworCWludCBpOworCXVuc2lnbmVkIHJldHZhbCA9IDA7CisJdm9pZCBfX2lvbWVtICplZV9hZGRyID0gcmVncyArIFJPTUNtZDsKKwlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IChFRV9SRUFEX0NNRCA8PCBhZGRyX2xlbik7CisKKwl3cml0ZWwoRUVfRU5CICYgfkVFX0NTLCBlZV9hZGRyKTsKKwl3cml0ZWwoRUVfRU5CLCBlZV9hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gNCArIGFkZHJfbGVuOyBpID49IDA7IGktLSkgeworCQlzaG9ydCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfREFUQV9XUklURSA6IDA7CisJCXdyaXRlbChFRV9FTkIgfCBkYXRhdmFsLCBlZV9hZGRyKTsKKwkJcmVhZGwoZWVfYWRkcik7CisJCXdyaXRlbChFRV9FTkIgfCBkYXRhdmFsIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJcmVhZGwoZWVfYWRkcik7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKHJlYWRsKGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKwl9CisJd3JpdGVsKEVFX0VOQiwgZWVfYWRkcik7CisJcmVhZGwoZWVfYWRkcik7CisKKwlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworCQl3cml0ZWwoRUVfRU5CIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJcmVhZGwoZWVfYWRkcik7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKHJlYWRsKGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKwkJd3JpdGVsKEVFX0VOQiwgZWVfYWRkcik7CisJCXJlYWRsKGVlX2FkZHIpOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKwl3cml0ZWwoRUVfRU5CICYgfkVFX0NTLCBlZV9hZGRyKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZGUyMTA0MV9nZXRfc3JvbV9pbmZvIChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisJdW5zaWduZWQgaSwgc2Ffb2Zmc2V0ID0gMCwgb2ZzOworCXU4IGVlX2RhdGFbREVfRUVQUk9NX1NJWkUgKyA2XSA9IHt9OworCXVuc2lnbmVkIGVlX2FkZHJfc2l6ZSA9IHR1bGlwX3JlYWRfZWVwcm9tKGRlLT5yZWdzLCAweGZmLCA4KSAmIDB4NDAwMDAgPyA4IDogNjsKKwlzdHJ1Y3QgZGVfc3JvbV9pbmZvX2xlYWYgKmlsOworCXZvaWQgKmJ1ZnA7CisKKwkvKiBkb3dubG9hZCBlbnRpcmUgZWVwcm9tICovCisJZm9yIChpID0gMDsgaSA8IERFX0VFUFJPTV9XT1JEUzsgaSsrKQorCQkoKHUxNiAqKWVlX2RhdGEpW2ldID0KKwkJCWxlMTZfdG9fY3B1KHR1bGlwX3JlYWRfZWVwcm9tKGRlLT5yZWdzLCBpLCBlZV9hZGRyX3NpemUpKTsKKworCS8qIERFQyBub3cgaGFzIGEgc3BlY2lmaWNhdGlvbiBidXQgZWFybHkgYm9hcmQgbWFrZXJzCisJICAganVzdCBwdXQgdGhlIGFkZHJlc3MgaW4gdGhlIGZpcnN0IEVFUFJPTSBsb2NhdGlvbnMuICovCisJLyogVGhpcyBkb2VzICBtZW1jbXAoZWVkYXRhLCBlZWRhdGErMTYsIDgpICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkgKyspCisJCWlmIChlZV9kYXRhW2ldICE9IGVlX2RhdGFbMTYraV0pCisJCQlzYV9vZmZzZXQgPSAyMDsKKworCS8qIHN0b3JlIE1BQyBhZGRyZXNzICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkgKyspCisJCWRlLT5kZXYtPmRldl9hZGRyW2ldID0gZWVfZGF0YVtpICsgc2Ffb2Zmc2V0XTsKKworCS8qIGdldCBvZmZzZXQgb2YgY29udHJvbGxlciAwIGluZm8gbGVhZi4gIGlnbm9yZSAybmQgYnl0ZS4gKi8KKwlvZnMgPSBlZV9kYXRhW1NST01DMEluZm9MZWFmXTsKKwlpZiAob2ZzID49IChzaXplb2YoZWVfZGF0YSkgLSBzaXplb2Yoc3RydWN0IGRlX3Nyb21faW5mb19sZWFmKSAtIHNpemVvZihzdHJ1Y3QgZGVfc3JvbV9tZWRpYV9ibG9jaykpKQorCQlnb3RvIGJhZF9zcm9tOworCisJLyogZ2V0IHBvaW50ZXIgdG8gaW5mbyBsZWFmICovCisJaWwgPSAoc3RydWN0IGRlX3Nyb21faW5mb19sZWFmICopICZlZV9kYXRhW29mc107CisKKwkvKiBwYXJhbm9pYSBjaGVja3MgKi8KKwlpZiAoaWwtPm5fYmxvY2tzID09IDApCisJCWdvdG8gYmFkX3Nyb207CisJaWYgKChzaXplb2YoZWVfZGF0YSkgLSBvZnMpIDwKKwkgICAgKHNpemVvZihzdHJ1Y3QgZGVfc3JvbV9pbmZvX2xlYWYpICsgKHNpemVvZihzdHJ1Y3QgZGVfc3JvbV9tZWRpYV9ibG9jaykgKiBpbC0+bl9ibG9ja3MpKSkKKwkJZ290byBiYWRfc3JvbTsKKworCS8qIGdldCBkZWZhdWx0IG1lZGlhIHR5cGUgKi8KKwlzd2l0Y2ggKERFX1VOQUxJR05FRF8xNigmaWwtPmRlZmF1bHRfbWVkaWEpKSB7CisJY2FzZSAweDAwMDE6ICBkZS0+bWVkaWFfdHlwZSA9IERFX01FRElBX0JOQzsgYnJlYWs7CisJY2FzZSAweDAwMDI6ICBkZS0+bWVkaWFfdHlwZSA9IERFX01FRElBX0FVSTsgYnJlYWs7CisJY2FzZSAweDAyMDQ6ICBkZS0+bWVkaWFfdHlwZSA9IERFX01FRElBX1RQX0ZEOyBicmVhazsKKwlkZWZhdWx0OiBkZS0+bWVkaWFfdHlwZSA9IERFX01FRElBX1RQX0FVVE87IGJyZWFrOworCX0KKwkKKwlpZiAobmV0aWZfbXNnX3Byb2JlKGRlKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZGUlZDogU1JPTSBsZWFmIG9mZnNldCAldSwgZGVmYXVsdCBtZWRpYSAlc1xuIiwKKwkJICAgICAgIGRlLT5ib2FyZF9pZHgsIG9mcywKKwkJICAgICAgIG1lZGlhX25hbWVbZGUtPm1lZGlhX3R5cGVdKTsKKworCS8qIGluaXQgU0lBIHJlZ2lzdGVyIHZhbHVlcyB0byBkZWZhdWx0cyAqLworCWZvciAoaSA9IDA7IGkgPCBERV9NQVhfTUVESUE7IGkrKykgeworCQlkZS0+bWVkaWFbaV0udHlwZSA9IERFX01FRElBX0lOVkFMSUQ7CisJCWRlLT5tZWRpYVtpXS5jc3IxMyA9IDB4ZmZmZjsKKwkJZGUtPm1lZGlhW2ldLmNzcjE0ID0gMHhmZmZmOworCQlkZS0+bWVkaWFbaV0uY3NyMTUgPSAweGZmZmY7CisJfQorCisJLyogcGFyc2UgbWVkaWEgYmxvY2tzIHRvIHNlZSB3aGF0IG1lZGlhcyBhcmUgc3VwcG9ydGVkLAorCSAqIGFuZCBpZiBhbnkgY3VzdG9tIENTUiB2YWx1ZXMgYXJlIHByb3ZpZGVkCisJICovCisJYnVmcCA9ICgodm9pZCAqKWlsKSArIHNpemVvZigqaWwpOworCWZvciAoaSA9IDA7IGkgPCBpbC0+bl9ibG9ja3M7IGkrKykgeworCQlzdHJ1Y3QgZGVfc3JvbV9tZWRpYV9ibG9jayAqaWIgPSBidWZwOworCQl1bnNpZ25lZCBpZHg7CisKKwkJLyogaW5kZXggYmFzZWQgb24gbWVkaWEgdHlwZSBpbiBtZWRpYSBibG9jayAqLworCQlzd2l0Y2goaWItPm9wdHMgJiBNZWRpYUJsb2NrTWFzaykgeworCQljYXNlIDA6IC8qIDEwYmFzZVQgKi8KKwkJCWRlLT5tZWRpYV9zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEXzEwYmFzZVRfSGFsZgorCQkJCQkgIHwgU1VQUE9SVEVEX0F1dG9uZWc7CisJCQlpZHggPSBERV9NRURJQV9UUDsKKwkJCWRlLT5tZWRpYVtERV9NRURJQV9UUF9BVVRPXS50eXBlID0gREVfTUVESUFfVFBfQVVUTzsKKwkJCWJyZWFrOworCQljYXNlIDE6IC8qIEJOQyAqLworCQkJZGUtPm1lZGlhX3N1cHBvcnRlZCB8PSBTVVBQT1JURURfQk5DOworCQkJaWR4ID0gREVfTUVESUFfQk5DOworCQkJYnJlYWs7CisJCWNhc2UgMjogLyogQVVJICovCisJCQlkZS0+bWVkaWFfc3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9BVUk7CisJCQlpZHggPSBERV9NRURJQV9BVUk7CisJCQlicmVhazsKKwkJY2FzZSA0OiAvKiAxMGJhc2VULUZEICovCisJCQlkZS0+bWVkaWFfc3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwKKwkJCQkJICB8IFNVUFBPUlRFRF9BdXRvbmVnOworCQkJaWR4ID0gREVfTUVESUFfVFBfRkQ7CisJCQlkZS0+bWVkaWFbREVfTUVESUFfVFBfQVVUT10udHlwZSA9IERFX01FRElBX1RQX0FVVE87CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gYmFkX3Nyb207CisJCX0KKworCQlkZS0+bWVkaWFbaWR4XS50eXBlID0gaWR4OworCisJCWlmIChuZXRpZl9tc2dfcHJvYmUoZGUpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiZGUlZDogICBtZWRpYSBibG9jayAjJXU6ICVzIiwKKwkJCSAgICAgICBkZS0+Ym9hcmRfaWR4LCBpLAorCQkJICAgICAgIG1lZGlhX25hbWVbZGUtPm1lZGlhW2lkeF0udHlwZV0pOworCisJCWJ1ZnAgKz0gc2l6ZW9mIChpYi0+b3B0cyk7CisKKwkJaWYgKGliLT5vcHRzICYgTWVkaWFDdXN0b21DU1JzKSB7CisJCQlkZS0+bWVkaWFbaWR4XS5jc3IxMyA9IERFX1VOQUxJR05FRF8xNigmaWItPmNzcjEzKTsKKwkJCWRlLT5tZWRpYVtpZHhdLmNzcjE0ID0gREVfVU5BTElHTkVEXzE2KCZpYi0+Y3NyMTQpOworCQkJZGUtPm1lZGlhW2lkeF0uY3NyMTUgPSBERV9VTkFMSUdORURfMTYoJmliLT5jc3IxNSk7CisJCQlidWZwICs9IHNpemVvZihpYi0+Y3NyMTMpICsgc2l6ZW9mKGliLT5jc3IxNCkgKworCQkJCXNpemVvZihpYi0+Y3NyMTUpOworCisJCQlpZiAobmV0aWZfbXNnX3Byb2JlKGRlKSkKKwkJCQlwcmludGsoIiAoJXgsJXgsJXgpXG4iLAorCQkJCSAgICAgICBkZS0+bWVkaWFbaWR4XS5jc3IxMywKKwkJCQkgICAgICAgZGUtPm1lZGlhW2lkeF0uY3NyMTQsCisJCQkJICAgICAgIGRlLT5tZWRpYVtpZHhdLmNzcjE1KTsKKwkJCQkgICAgICAgCisJCX0gZWxzZSBpZiAobmV0aWZfbXNnX3Byb2JlKGRlKSkKKwkJCXByaW50aygiXG4iKTsKKworCQlpZiAoYnVmcCA+ICgodm9pZCAqKSZlZV9kYXRhW0RFX0VFUFJPTV9TSVpFIC0gM10pKQorCQkJYnJlYWs7CisJfQorCisJZGUtPm1lZGlhX2FkdmVydGlzZSA9IGRlLT5tZWRpYV9zdXBwb3J0ZWQ7CisKK2ZpbGxfZGVmYXVsdHM6CisJLyogZmlsbCBpbiBkZWZhdWx0cywgZm9yIGNhc2VzIHdoZXJlIGN1c3RvbSBDU1JzIG5vdCB1c2VkICovCisJZm9yIChpID0gMDsgaSA8IERFX01BWF9NRURJQTsgaSsrKSB7CisJCWlmIChkZS0+bWVkaWFbaV0uY3NyMTMgPT0gMHhmZmZmKQorCQkJZGUtPm1lZGlhW2ldLmNzcjEzID0gdDIxMDQxX2NzcjEzW2ldOworCQlpZiAoZGUtPm1lZGlhW2ldLmNzcjE0ID09IDB4ZmZmZikKKwkJCWRlLT5tZWRpYVtpXS5jc3IxNCA9IHQyMTA0MV9jc3IxNFtpXTsKKwkJaWYgKGRlLT5tZWRpYVtpXS5jc3IxNSA9PSAweGZmZmYpCisJCQlkZS0+bWVkaWFbaV0uY3NyMTUgPSB0MjEwNDFfY3NyMTVbaV07CisJfQorCisJZGUtPmVlX2RhdGEgPSBrbWFsbG9jKERFX0VFUFJPTV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGUtPmVlX2RhdGEpCisJCW1lbWNweShkZS0+ZWVfZGF0YSwgJmVlX2RhdGFbMF0sIERFX0VFUFJPTV9TSVpFKTsKKworCXJldHVybjsKKworYmFkX3Nyb206CisJLyogZm9yIGVycm9yIGNhc2VzLCBpdCdzIG9rIHRvIGFzc3VtZSB3ZSBzdXBwb3J0IGFsbCB0aGVzZSAqLworCWZvciAoaSA9IDA7IGkgPCBERV9NQVhfTUVESUE7IGkrKykKKwkJZGUtPm1lZGlhW2ldLnR5cGUgPSBpOworCWRlLT5tZWRpYV9zdXBwb3J0ZWQgPQorCQlTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCVNVUFBPUlRFRF9BdXRvbmVnIHwKKwkJU1VQUE9SVEVEX1RQIHwKKwkJU1VQUE9SVEVEX0FVSSB8CisJCVNVUFBPUlRFRF9CTkM7CisJZ290byBmaWxsX2RlZmF1bHRzOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkZV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlOworCWludCByYzsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJbG9uZyBwY2lhZGRyOworCXN0YXRpYyBpbnQgYm9hcmRfaWR4ID0gLTE7CisKKwlib2FyZF9pZHgrKzsKKworI2lmbmRlZiBNT0RVTEUKKwlpZiAoYm9hcmRfaWR4ID09IDApCisJCXByaW50aygiJXMiLCB2ZXJzaW9uKTsKKyNlbmRpZgorCisJLyogYWxsb2NhdGUgYSBuZXcgZXRoZXJuZXQgZGV2aWNlIHN0cnVjdHVyZSwgYW5kIGZpbGwgaW4gZGVmYXVsdHMgKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGRlX3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKwlkZXYtPm9wZW4gPSBkZV9vcGVuOworCWRldi0+c3RvcCA9IGRlX2Nsb3NlOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gZGVfc2V0X3J4X21vZGU7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBkZV9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gZGVfZ2V0X3N0YXRzOworCWRldi0+ZXRodG9vbF9vcHMgPSAmZGVfZXRodG9vbF9vcHM7CisJZGV2LT50eF90aW1lb3V0ID0gZGVfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKworCWRlID0gZGV2LT5wcml2OworCWRlLT5kZTIxMDQwID0gZW50LT5kcml2ZXJfZGF0YSA9PSAwID8gMSA6IDA7CisJZGUtPnBkZXYgPSBwZGV2OworCWRlLT5kZXYgPSBkZXY7CisJZGUtPm1zZ19lbmFibGUgPSAoZGVidWcgPCAwID8gREVfREVGX01TR19FTkFCTEUgOiBkZWJ1Zyk7CisJZGUtPmJvYXJkX2lkeCA9IGJvYXJkX2lkeDsKKwlzcGluX2xvY2tfaW5pdCAoJmRlLT5sb2NrKTsKKwlpbml0X3RpbWVyKCZkZS0+bWVkaWFfdGltZXIpOworCWlmIChkZS0+ZGUyMTA0MCkKKwkJZGUtPm1lZGlhX3RpbWVyLmZ1bmN0aW9uID0gZGUyMTA0MF9tZWRpYV90aW1lcjsKKwllbHNlCisJCWRlLT5tZWRpYV90aW1lci5mdW5jdGlvbiA9IGRlMjEwNDFfbWVkaWFfdGltZXI7CisJZGUtPm1lZGlhX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGU7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIHdha2UgdXAgZGV2aWNlLCBhc3NpZ24gcmVzb3VyY2VzICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9mcmVlOworCisJLyogcmVzZXJ2ZSBQQ0kgcmVzb3VyY2VzIHRvIGVuc3VyZSBkcml2ZXIgYXRvbWljaXR5ICovCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCisJLyogY2hlY2sgZm9yIGludmFsaWQgSVJRIHZhbHVlICovCisJaWYgKHBkZXYtPmlycSA8IDIpIHsKKwkJcmMgPSAtRUlPOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbnZhbGlkIGlycSAoJWQpIGZvciBwY2kgZGV2ICVzXG4iLAorCQkgICAgICAgcGRldi0+aXJxLCBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyX291dF9yZXM7CisJfQorCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisKKwkvKiBvYnRhaW4gYW5kIGNoZWNrIHZhbGlkaXR5IG9mIFBDSSBJL08gYWRkcmVzcyAqLworCXBjaWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJaWYgKCFwY2lhZGRyKSB7CisJCXJjID0gLUVJTzsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibm8gTU1JTyByZXNvdXJjZSBmb3IgcGNpIGRldiAlc1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJfb3V0X3JlczsKKwl9CisJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkgPCBERV9SRUdTX1NJWkUpIHsKKwkJcmMgPSAtRUlPOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJNTUlPIHJlc291cmNlICglbHgpIHRvbyBzbWFsbCBvbiBwY2kgZGV2ICVzXG4iLAorCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSwgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9vdXRfcmVzOworCX0KKworCS8qIHJlbWFwIENTUiByZWdpc3RlcnMgKi8KKwlyZWdzID0gaW9yZW1hcF9ub2NhY2hlKHBjaWFkZHIsIERFX1JFR1NfU0laRSk7CisJaWYgKCFyZWdzKSB7CisJCXJjID0gLUVJTzsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG1hcCBQQ0kgTU1JTyAoJWx4QCVseCkgb24gcGNpIGRldiAlc1xuIiwKKwkJICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSksIHBjaWFkZHIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJfb3V0X3JlczsKKwl9CisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZykgcmVnczsKKwlkZS0+cmVncyA9IHJlZ3M7CisKKwlkZV9hZGFwdGVyX3dha2UoZGUpOworCisJLyogbWFrZSBzdXJlIGhhcmR3YXJlIGlzIG5vdCBydW5uaW5nICovCisJcmMgPSBkZV9yZXNldF9tYWMoZGUpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgcmVzZXQgTUFDLCBwY2kgZGV2ICVzXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9vdXRfaW9tYXA7CisJfQorCisJLyogZ2V0IE1BQyBhZGRyZXNzLCBpbml0aWFsaXplIGRlZmF1bHQgbWVkaWEgdHlwZSBhbmQKKwkgKiBnZXQgbGlzdCBvZiBzdXBwb3J0ZWQgbWVkaWEKKwkgKi8KKwlpZiAoZGUtPmRlMjEwNDApIHsKKwkJZGUyMTA0MF9nZXRfbWFjX2FkZHJlc3MoZGUpOworCQlkZTIxMDQwX2dldF9tZWRpYV9pbmZvKGRlKTsKKwl9IGVsc2UgeworCQlkZTIxMDQxX2dldF9zcm9tX2luZm8oZGUpOworCX0KKworCS8qIHJlZ2lzdGVyIG5ldyBuZXR3b3JrIGludGVyZmFjZSB3aXRoIGtlcm5lbCAqLworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfaW9tYXA7CisKKwkvKiBwcmludCBpbmZvIGFib3V0IGJvYXJkIGFuZCBpbnRlcmZhY2UganVzdCByZWdpc3RlcmVkICovCisJcHJpbnRrIChLRVJOX0lORk8gIiVzOiAlcyBhdCAweCVseCwgIgorCQkiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngsICIKKwkJIklSUSAlZFxuIiwKKwkJZGV2LT5uYW1lLAorCQlkZS0+ZGUyMTA0MCA/ICIyMTA0MCIgOiAiMjEwNDEiLAorCQlkZXYtPmJhc2VfYWRkciwKKwkJZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwKKwkJZGV2LT5kZXZfYWRkclsyXSwgZGV2LT5kZXZfYWRkclszXSwKKwkJZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSwKKwkJZGV2LT5pcnEpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwkvKiBlbmFibGUgYnVzbWFzdGVyaW5nICovCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBwdXQgYWRhcHRlciB0byBzbGVlcCAqLworCWRlX2FkYXB0ZXJfc2xlZXAoZGUpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaW9tYXA6CisJaWYgKGRlLT5lZV9kYXRhKQorCQlrZnJlZShkZS0+ZWVfZGF0YSk7CisJaW91bm1hcChyZWdzKTsKK2Vycl9vdXRfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworZXJyX291dF9mcmVlOgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZGVfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisKKwlpZiAoIWRldikKKwkJQlVHKCk7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZGUtPmVlX2RhdGEpCisJCWtmcmVlKGRlLT5lZV9kYXRhKTsKKwlpb3VubWFwKGRlLT5yZWdzKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IGRlX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCisJcnRubF9sb2NrKCk7CisJaWYgKG5ldGlmX3J1bm5pbmcgKGRldikpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmRlLT5tZWRpYV90aW1lcik7CisKKwkJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCQlzcGluX2xvY2tfaXJxKCZkZS0+bG9jayk7CisKKwkJZGVfc3RvcF9odyhkZSk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJCXNwaW5fdW5sb2NrX2lycSgmZGUtPmxvY2spOworCQllbmFibGVfaXJxKGRldi0+aXJxKTsKKwkJCisJCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnRzLiAqLworCQlfX2RlX2dldF9zdGF0cyhkZSk7CisKKwkJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKwkJZGVfY2xlYW5fcmluZ3MoZGUpOworCisJCWRlX2FkYXB0ZXJfc2xlZXAoZGUpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJfSBlbHNlIHsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCX0KKwlydG5sX3VubG9jaygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlX3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCisJcnRubF9sb2NrKCk7CisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCWdvdG8gb3V0OworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJCWRlX2luaXRfaHcoZGUpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJfSBlbHNlIHsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCX0KK291dDoKKwlydG5sX3VubG9jaygpOworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkZV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0gZGVfcGNpX3RibCwKKwkucHJvYmUJCT0gZGVfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2V4aXRfcChkZV9yZW1vdmVfb25lKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IGRlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBkZV9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRlX2luaXQgKHZvaWQpCit7CisjaWZkZWYgTU9EVUxFCisJcHJpbnRrKCIlcyIsIHZlcnNpb24pOworI2VuZGlmCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCAoJmRlX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZV9leGl0ICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJmRlX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGRlX2luaXQpOworbW9kdWxlX2V4aXQoZGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzgwMGMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwpAQCAtMCwwICsxLDU3NzggQEAKKy8qICBkZTR4NS5jOiBBIERJR0lUQUwgREMyMXg0eCBERUNjaGlwIGFuZCBERTQyNS9ERTQzNC9ERTQzNS9ERTQ1MC9ERTUwMAorICAgICAgICAgICAgIGV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCisKKyAgICBDb3B5cmlnaHQgMTk5NCwgMTk5NSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbi4KKworICAgIFRlc3RpbmcgcmVzb3VyY2VzIGZvciB0aGlzIGRyaXZlciBoYXZlIGJlZW4gbWFkZSBhdmFpbGFibGUKKyAgICBpbiBwYXJ0IGJ5IE5BU0EgQW1lcyBSZXNlYXJjaCBDZW50ZXIgKG1qYWNvYkBuYXMubmFzYS5nb3YpLgorCisgICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhdCBkYXZpZXNAbWFuaWFjLnVsdHJhbmV0LmNvbS4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiAgIElNUExJRUQKKyAgICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAgICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAgICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsICBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAgICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAgICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAgICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAgICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAgICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAgICBPcmlnaW5hbGx5LCAgIHRoaXMgIGRyaXZlciAgd2FzICAgIHdyaXR0ZW4gIGZvciB0aGUgIERpZ2l0YWwgICBFcXVpcG1lbnQKKyAgICBDb3Jwb3JhdGlvbiBzZXJpZXMgb2YgRXRoZXJXT1JLUyBldGhlcm5ldCBjYXJkczoKKworICAgICAgICBERTQyNSBUUC9DT0FYIEVJU0EKKwlERTQzNCBUUCBQQ0kKKwlERTQzNSBUUC9DT0FYL0FVSSBQQ0kKKwlERTQ1MCBUUC9DT0FYL0FVSSBQQ0kKKwlERTUwMCAxMC8xMDAgUENJIEZhc3Rlcm5ldAorCisgICAgYnV0IGl0ICB3aWxsICBub3cgYXR0ZW1wdCAgdG8gIHN1cHBvcnQgYWxsICBjYXJkcyB3aGljaCAgIGNvbmZvcm0gdG8gdGhlCisgICAgRGlnaXRhbCBTZW1pY29uZHVjdG9yICAgU1JPTSAgIFNwZWNpZmljYXRpb24uICAgIFRoZSAgZHJpdmVyICAgY3VycmVudGx5CisgICAgcmVjb2duaXNlcyB0aGUgZm9sbG93aW5nIGNoaXBzOgorCisgICAgICAgIERDMjEwNDAgIChubyBTUk9NKSAKKwlEQzIxMDQxW0FdICAKKwlEQzIxMTQwW0FdIAorCURDMjExNDIgCisJREMyMTE0MyAKKworICAgIFNvIGZhciB0aGUgZHJpdmVyIGlzIGtub3duIHRvIHdvcmsgd2l0aCB0aGUgZm9sbG93aW5nIGNhcmRzOgorCisgICAgICAgIEtJTkdTVE9OCisJTGlua3N5cworCVpOWVgzNDIKKwlTTUM4NDMyCisJU01DOTMzMiAody9uZXcgU1JPTSkKKwlaTllYMzFbNDVdCisJWk5ZWDM0NiAxMC8xMDAgNCBwb3J0IChjYW4gYWN0IGFzIGEgMTAvMTAwIGJyaWRnZSEpIAorCisgICAgVGhlIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgb24gYSByZWxhdGl2ZWx5IGJ1c3kgbmV0d29yayB1c2luZyB0aGUgREU0MjUsCisgICAgREU0MzQsIERFNDM1IGFuZCBERTUwMCBjYXJkcyBhbmQgYmVuY2htYXJrZWQgd2l0aCAndHRjcCc6IGl0IHRyYW5zZmVycmVkCisgICAgMTZNIG9mIGRhdGEgdG8gYSBERUNzdGF0aW9uIDUwMDAvMjAwIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgICAgICBUQ1AgICAgICAgICAgIFVEUAorICAgICAgICAgICAgIFRYICAgICBSWCAgICAgVFggICAgIFJYCisgICAgREU0MjUgICAxMDMwayAgOTk3ayAgIDExNzBrICAxMTI4aworICAgIERFNDM0ICAgMTA2M2sgIDk5NWsgICAxMTcwayAgMTEyNWsKKyAgICBERTQzNSAgIDEwNjNrICA5OTVrICAgMTE3MGsgIDExMjVrCisgICAgREU1MDAgICAxMDYzayAgOTk4ayAgIDExNzBrICAxMTI1ayAgaW4gMTBNYi9zIG1vZGUKKworICAgIEFsbCAgdmFsdWVzIGFyZSB0eXBpY2FsIChpbiAgIGtCeXRlcy9zZWMpIGZyb20gYSAgc2FtcGxlICBvZiA0IGZvciAgZWFjaAorICAgIG1lYXN1cmVtZW50LiBUaGVpciBlcnJvciBpcyArLy0yMGsgb24gYSBxdWlldCAocHJpdmF0ZSkgbmV0d29yayBhbmQgYWxzbworICAgIGRlcGVuZCBvbiB3aGF0IGxvYWQgdGhlIENQVSBoYXMuCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgVGhpcyBkcml2ZXIgIGhhcyBiZWVuIHdyaXR0ZW4gc3Vic3RhbnRpYWxseSAgZnJvbSAgc2NyYXRjaCwgYWx0aG91Z2ggaXRzCisgICAgaW5oZXJpdGFuY2Ugb2Ygc3R5bGUgYW5kIHN0YWNrIGludGVyZmFjZSBmcm9tICdld3JrMy5jJyBhbmQgaW4gdHVybiBmcm9tCisgICAgRG9uYWxkIEJlY2tlcidzICdsYW5jZS5jJyBzaG91bGQgYmUgb2J2aW91cy4gV2l0aCB0aGUgbW9kdWxlIGF1dG9sb2FkIG9mCisgICAgZXZlcnkgIHVzYWJsZSBERUNjaGlwIGJvYXJkLCAgSSAgcGluY2hlZCBEb25hbGQncyAnbmV4dF9tb2R1bGUnIGZpZWxkIHRvCisgICAgbGluayBteSBtb2R1bGVzIHRvZ2V0aGVyLgorCisgICAgVXB0byAxNSBFSVNBIGNhcmRzIGNhbiBiZSBzdXBwb3J0ZWQgdW5kZXIgdGhpcyBkcml2ZXIsIGxpbWl0ZWQgcHJpbWFyaWx5CisgICAgYnkgdGhlIGF2YWlsYWJsZSBJUlEgbGluZXMuICBJIGhhdmUgIGNoZWNrZWQgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIG9mCisgICAgbXVsdGlwbGUgZGVwY2EsIEV0aGVyV09SS1MgMyBjYXJkcyBhbmQgZGU0eDUgY2FyZHMgYW5kICBoYXZlIG5vdCBmb3VuZCBhCisgICAgcHJvYmxlbSB5ZXQgKHByb3ZpZGVkIHlvdSBoYXZlIGF0IGxlYXN0IGRlcGNhLmMgdjAuMzgpIC4uLgorCisgICAgUENJIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQgIHRvIGFsbG93IHRoZSBkcml2ZXIgIHRvIHdvcmsgd2l0aCB0aGUgREU0MzQsCisgICAgREU0MzUsIERFNDUwIGFuZCBERTUwMCBjYXJkcy4gVGhlIEkvTyBhY2Nlc3NlcyBhcmUgYSBiaXQgb2YgYSBrbHVkZ2UgZHVlCisgICAgdG8gdGhlIGRpZmZlcmVuY2VzIGluIHRoZSBFSVNBIGFuZCBQQ0kgQ1NSIGFkZHJlc3Mgb2Zmc2V0cyBmcm9tIHRoZSBiYXNlCisgICAgYWRkcmVzcy4KKworICAgIFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyAgZHJpdmVyIGFzIGEgbG9hZGFibGUgIG1vZHVsZSBoYXMgYmVlbiBpbmNsdWRlZAorICAgIGFuZCB1c2VkIGV4dGVuc2l2ZWx5ICBkdXJpbmcgdGhlIGRyaXZlciBkZXZlbG9wbWVudCAgKHRvIHNhdmUgdGhvc2UgbG9uZworICAgIHJlYm9vdCBzZXF1ZW5jZXMpLiAgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQgIHVuZGVyIFBDSSBhbmQgRUlTQSBoYXMgYmVlbgorICAgIGFjaGlldmVkIGJ5IGxldHRpbmcgdGhlIGRyaXZlciBhdXRvcHJvYmUgYXMgaWYgaXQgd2VyZSBjb21waWxlZCBpbnRvIHRoZQorICAgIGtlcm5lbC4gRG8gbWFrZSBzdXJlICB5b3UncmUgbm90IHNoYXJpbmcgIGludGVycnVwdHMgd2l0aCBhbnl0aGluZyAgdGhhdAorICAgIGNhbm5vdCBhY2NvbW1vZGF0ZSAgaW50ZXJydXB0ICBzaGFyaW5nIQorCisgICAgVG8gdXRpbGlzZSB0aGlzIGFiaWxpdHksIHlvdSBoYXZlIHRvIGRvIDggdGhpbmdzOgorCisgICAgMCkgaGF2ZSBhIGNvcHkgb2YgdGhlIGxvYWRhYmxlIG1vZHVsZXMgY29kZSBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0uCisgICAgMSkgY29weSBkZTR4NS5jIGZyb20gdGhlICAvbGludXgvZHJpdmVycy9uZXQgZGlyZWN0b3J5IHRvIHlvdXIgZmF2b3VyaXRlCisgICAgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKyAgICAyKSBmb3IgZml4ZWQgIGF1dG9wcm9iZXMgKG5vdCAgcmVjb21tZW5kZWQpLCAgZWRpdCB0aGUgc291cmNlIGNvZGUgIG5lYXIKKyAgICBsaW5lIDU1OTQgdG8gcmVmbGVjdCB0aGUgSS9PIGFkZHJlc3MgIHlvdSdyZSB1c2luZywgb3IgYXNzaWduIHRoZXNlIHdoZW4KKyAgICBsb2FkaW5nIGJ5OgorCisgICAgICAgICAgICAgICAgICAgaW5zbW9kIGRlNHg1IGlvPTB4Z2hoICAgICAgICAgICB3aGVyZSBnID0gYnVzIG51bWJlcgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGggPSBkZXZpY2UgbnVtYmVyICAgCisKKyAgICAgICBOQjogYXV0b3Byb2JpbmcgZm9yIG1vZHVsZXMgaXMgbm93IHN1cHBvcnRlZCBieSBkZWZhdWx0LiBZb3UgbWF5IGp1c3QKKyAgICAgICAgICAgdXNlOgorCisgICAgICAgICAgICAgICAgICAgaW5zbW9kIGRlNHg1CisKKyAgICAgICAgICAgdG8gbG9hZCBhbGwgYXZhaWxhYmxlIGJvYXJkcy4gRm9yIGEgc3BlY2lmaWMgYm9hcmQsIHN0aWxsIHVzZQorCSAgIHRoZSAnaW89PycgYWJvdmUuCisgICAgMykgY29tcGlsZSAgZGU0eDUuYywgYnV0IGluY2x1ZGUgLURNT0RVTEUgaW4gIHRoZSBjb21tYW5kIGxpbmUgdG8gZW5zdXJlCisgICAgdGhhdCB0aGUgY29ycmVjdCBiaXRzIGFyZSBjb21waWxlZCAoc2VlIGVuZCBvZiBzb3VyY2UgY29kZSkuCisgICAgNCkgaWYgeW91IGFyZSB3YW50aW5nIHRvIGFkZCBhIG5ldyAgY2FyZCwgZ290byA1LiBPdGhlcndpc2UsIHJlY29tcGlsZSBhCisgICAga2VybmVsIHdpdGggdGhlIGRlNHg1IGNvbmZpZ3VyYXRpb24gdHVybmVkIG9mZiBhbmQgcmVib290LgorICAgIDUpIGluc21vZCBkZTR4NSBbaW89MHhnaGhdCisgICAgNikgcnVuIHRoZSBuZXQgc3RhcnR1cCBiaXRzIGZvciB5b3VyIG5ldyBldGg/PyBpbnRlcmZhY2UocykgbWFudWFsbHkgCisgICAgKHVzdWFsbHkgL2V0Yy9yYy5pbmV0WzEyXSBhdCBib290IHRpbWUpLiAKKyAgICA3KSBlbmpveSEKKworICAgIFRvIHVubG9hZCBhIG1vZHVsZSwgdHVybiBvZmYgdGhlIGFzc29jaWF0ZWQgaW50ZXJmYWNlKHMpIAorICAgICdpZmNvbmZpZyBldGg/PyBkb3duJyB0aGVuICdybW1vZCBkZTR4NScuCisKKyAgICBBdXRvbWVkaWEgZGV0ZWN0aW9uIGlzIGluY2x1ZGVkIHNvIHRoYXQgaW4gIHByaW5jaXBhbCB5b3UgY2FuIGRpc2Nvbm5lY3QKKyAgICBmcm9tLCBlLmcuICBUUCwgcmVjb25uZWN0ICB0byBCTkMgIGFuZCAgdGhpbmdzIHdpbGwgc3RpbGwgd29yayAgKGFmdGVyIGEKKyAgICBwYXVzZSB3aGlsc3QgdGhlICAgZHJpdmVyIGZpZ3VyZXMgb3V0ICAgd2hlcmUgaXRzIG1lZGlhIHdlbnQpLiAgTXkgdGVzdHMKKyAgICB1c2luZyBwaW5nIHNob3dlZCB0aGF0IGl0IGFwcGVhcnMgdG8gd29yay4uLi4KKworICAgIEJ5ICBkZWZhdWx0LCAgdGhlIGRyaXZlciB3aWxsICBub3cgICBhdXRvZGV0ZWN0IGFueSAgREVDY2hpcCBiYXNlZCBjYXJkLgorICAgIFNob3VsZCB5b3UgaGF2ZSBhIG5lZWQgdG8gcmVzdHJpY3QgdGhlIGRyaXZlciB0byBESUdJVEFMIG9ubHkgY2FyZHMsIHlvdQorICAgIGNhbiBjb21waWxlIHdpdGggYSAgREVDX09OTFkgZGVmaW5lLCBvciBpZiAgbG9hZGluZyBhcyBhIG1vZHVsZSwgdXNlIHRoZQorICAgICdkZWNfb25seT0xJyAgcGFyYW1ldGVyLiAKKworICAgIEkndmUgY2hhbmdlZCB0aGUgdGltaW5nIHJvdXRpbmVzIHRvICB1c2UgdGhlIGtlcm5lbCB0aW1lciBhbmQgc2NoZWR1bGluZworICAgIGZ1bmN0aW9ucyAgc28gdGhhdCB0aGUgIGhhbmdzICBhbmQgb3RoZXIgYXNzb3J0ZWQgcHJvYmxlbXMgdGhhdCBvY2N1cnJlZAorICAgIHdoaWxlIGF1dG9zZW5zaW5nIHRoZSAgbWVkaWEgIHNob3VsZCBiZSBnb25lLiAgQSAgYm9udXMgIGZvciB0aGUgREMyMTA0MAorICAgIGF1dG8gIG1lZGlhIHNlbnNlIGFsZ29yaXRobSBpcyAgdGhhdCBpdCBjYW4gbm93ICB1c2Ugb25lIHRoYXQgaXMgbW9yZSBpbgorICAgIGxpbmUgd2l0aCB0aGUgIHJlc3QgKHRoZSBEQzIxMDQwICBjaGlwIGRvZXNuJ3QgIGhhdmUgYSBoYXJkd2FyZSAgdGltZXIpLgorICAgIFRoZSBkb3duc2lkZSBpcyB0aGUgMSAnamlmZmllcycgKDEwbXMpIHJlc29sdXRpb24uCisKKyAgICBJRUVFIDgwMi4zdSBNSUkgaW50ZXJmYWNlIGNvZGUgaGFzICBiZWVuIGFkZGVkIGluIGFudGljaXBhdGlvbiB0aGF0IHNvbWUKKyAgICBwcm9kdWN0cyBtYXkgdXNlIGl0IGluIHRoZSBmdXR1cmUuCisKKyAgICBUaGUgU01DOTMzMiBjYXJkICBoYXMgYSBub24tY29tcGxpYW50IFNST00gIHdoaWNoIG5lZWRzIGZpeGluZyAtICBJIGhhdmUKKyAgICBwYXRjaGVkIHRoaXMgIGRyaXZlciB0byBkZXRlY3QgaXQgIGJlY2F1c2UgdGhlIFNST00gZm9ybWF0IHVzZWQgY29tcGxpZXMKKyAgICB0byBhIHByZXZpb3VzIERFQy1TVEQgZm9ybWF0LgorCisgICAgSSBoYXZlIHJlbW92ZWQgdGhlIGJ1ZmZlciBjb3BpZXMgbmVlZGVkIGZvciByZWNlaXZlIG9uIEludGVscy4gIEkgY2Fubm90CisgICAgcmVtb3ZlIHRoZW0gZm9yICAgQWxwaGFzIHNpbmNlICB0aGUgIFR1bGlwIGhhcmR3YXJlICAgb25seSBkb2VzIGxvbmd3b3JkCisgICAgYWxpZ25lZCAgRE1BIHRyYW5zZmVycyAgYW5kICB0aGUgIEFscGhhcyBnZXQgICBhbGlnbm1lbnQgdHJhcHMgd2l0aCAgbm9uCisgICAgbG9uZ3dvcmQgYWxpZ25lZCBkYXRhIGNvcGllcyAod2hpY2ggbWFrZXMgdGhlbSByZWFsbHkgc2xvdykuIE5vIGNvbW1lbnQuCisKKyAgICBJICBoYXZlIGFkZGVkIFNST00gZGVjb2RpbmcgIHJvdXRpbmVzIHRvIG1ha2UgdGhpcyAgZHJpdmVyIHdvcmsgd2l0aCBhbnkKKyAgICBjYXJkIHRoYXQgIHN1cHBvcnRzIHRoZSBEaWdpdGFsICBTZW1pY29uZHVjdG9yIFNST00gc3BlYy4gVGhpcyB3aWxsIGhlbHAKKyAgICBhbGwgIGNhcmRzIHJ1bm5pbmcgdGhlIGRjMjExNHggIHNlcmllcyBjaGlwcyBpbiBwYXJ0aWN1bGFyLiAgQ2FyZHMgdXNpbmcKKyAgICB0aGUgZGMyMTA0eCAgY2hpcHMgc2hvdWxkIHJ1biBjb3JyZWN0bHkgd2l0aCAgdGhlIGJhc2ljICBkcml2ZXIuICBJJ20gaW4KKyAgICBkZWJ0IHRvIDxtamFjb2JAZmVyYWwuY29tPiBmb3IgdGhlICB0ZXN0aW5nIGFuZCBmZWVkYmFjayB0aGF0IGhlbHBlZCBnZXQKKyAgICB0aGlzIGZlYXR1cmUgd29ya2luZy4gIFNvIGZhciB3ZSBoYXZlICB0ZXN0ZWQgS0lOR1NUT04sIFNNQzg0MzIsIFNNQzkzMzIKKyAgICAod2l0aCB0aGUgbGF0ZXN0IFNST00gY29tcGx5aW5nICB3aXRoIHRoZSBTUk9NIHNwZWMgIFYzOiB0aGVpciBmaXJzdCB3YXMKKyAgICBicm9rZW4pLCBaTllYMzQyICBhbmQgIExpbmtTeXMuIFpZTlgzMTQgKGR1YWwgIDIxMDQxICBNQUMpIGFuZCAgWk5ZWCAzMTUKKyAgICAocXVhZCAyMTA0MSBNQUMpICBjYXJkcyBhbHNvICBhcHBlYXIgIHRvIHdvcmsgZGVzcGl0ZSB0aGVpciAgaW5jb3JyZWN0bHkKKyAgICB3aXJlZCBJUlFzLgorCisgICAgSSBoYXZlIGFkZGVkIGEgdGVtcG9yYXJ5IGZpeCBmb3IgaW50ZXJydXB0IHByb2JsZW1zIHdoZW4gc29tZSBTQ1NJIGNhcmRzCisgICAgc2hhcmUgdGhlIHNhbWUgaW50ZXJydXB0IGFzIHRoZSBERUNjaGlwIGJhc2VkICBjYXJkcy4gVGhlIHByb2JsZW0gb2NjdXJzCisgICAgYmVjYXVzZSAgdGhlIFNDU0kgY2FyZCB3YW50cyB0byAgZ3JhYiB0aGUgaW50ZXJydXB0ICBhcyBhIGZhc3QgaW50ZXJydXB0CisgICAgKHJ1bnMgdGhlICAgc2VydmljZSByb3V0aW5lIHdpdGggaW50ZXJydXB0cyB0dXJuZWQgICBvZmYpIHZzLiAgdGhpcyBjYXJkCisgICAgd2hpY2ggcmVhbGx5IG5lZWRzIHRvIHJ1biB0aGUgc2VydmljZSByb3V0aW5lIHdpdGggaW50ZXJydXB0cyB0dXJuZWQgb24uCisgICAgVGhpcyBkcml2ZXIgd2lsbCAgbm93ICAgYWRkIHRoZSBpbnRlcnJ1cHQgc2VydmljZSAgIHJvdXRpbmUgIGFzICBhICBmYXN0CisgICAgaW50ZXJydXB0IGlmIGl0ICAgaXMgYm91bmNlZCBmcm9tIHRoZSAgIHNsb3cgaW50ZXJydXB0LiAgVEhJUyBJUyBOT1QgICBBCisgICAgUkVDT01NRU5ERUQgV0FZIFRPIFJVTiBUSEUgRFJJVkVSICBhbmQgaGFzIGJlZW4gZG9uZSAgZm9yIGEgbGltaXRlZCB0aW1lCisgICAgdW50aWwgIHBlb3BsZSAgIHNvcnQgIG91dCB0aGVpciAgY29tcGF0aWJpbGl0eSAgICBpc3N1ZXMgYW5kIHRoZSAga2VybmVsCisgICAgaW50ZXJydXB0ICBzZXJ2aWNlIGNvZGUgIGlzICBmaXhlZC4gICBZT1UgIFNIT1VMRCBTRVBBUkFURSBPVVQgIFRIRSBGQVNUCisgICAgSU5URVJSVVBUIENBUkRTIEZST00gVEhFIFNMT1cgSU5URVJSVVBUIENBUkRTIHRvIGVuc3VyZSB0aGF0IHRoZXkgZG8gbm90CisgICAgcnVuIG9uIHRoZSBzYW1lIGludGVycnVwdC4gUENNQ0lBL0NhcmRCdXMgaXMgYW5vdGhlciBjYW4gb2Ygd29ybXMuLi4KKworICAgIEZpbmFsbHksIEkgdGhpbmsgIEkgaGF2ZSByZWFsbHkgIGZpeGVkICB0aGUgbW9kdWxlICBsb2FkaW5nIHByb2JsZW0gd2l0aAorICAgIG1vcmUgdGhhbiBvbmUgREVDY2hpcCBiYXNlZCAgY2FyZC4gIEFzIGEgIHNpZGUgZWZmZWN0LCBJIGRvbid0IG1lc3Mgd2l0aAorICAgIHRoZSAgZGV2aWNlIHN0cnVjdHVyZSBhbnkgIG1vcmUgd2hpY2ggbWVhbnMgdGhhdCAgaWYgbW9yZSB0aGFuIDEgY2FyZCBpbgorICAgIDIuMC54IGlzICAgIGluc3RhbGxlZCAoNCAgaW4gICAyLjEueCksICB0aGUgIHVzZXIgICB3aWxsIGhhdmUgICB0byAgZWRpdAorICAgIGxpbnV4L2RyaXZlcnMvbmV0L1NwYWNlLmMgIHRvIG1ha2Ugcm9vbSBmb3IgIHRoZW0uIEhlbmNlLCBtb2R1bGUgbG9hZGluZworICAgIGlzICB0aGUgcHJlZmVycmVkIHdheSB0byB1c2UgICB0aGlzIGRyaXZlciwgc2luY2UgIGl0ICBkb2Vzbid0IGhhdmUgdGhpcworICAgIGxpbWl0YXRpb24uCisKKyAgICBXaGVyZSBTUk9NIG1lZGlhICBkZXRlY3Rpb24gaXMgdXNlZCBhbmQgIGZ1bGwgZHVwbGV4IGlzIHNwZWNpZmllZCBpbiB0aGUKKyAgICBTUk9NLCAgdGhlIGZlYXR1cmUgaXMgIGlnbm9yZWQgdW5sZXNzICBscC0+cGFyYW1zLmZkeCAgaXMgc2V0IGF0IGNvbXBpbGUKKyAgICB0aW1lICBPUiBkdXJpbmcgIGEgICBtb2R1bGUgbG9hZCAgKGluc21vZCAgZGU0eDUgICBhcmdzPSdldGg/PzpmZHgnIFtzZWUKKyAgICBiZWxvd10pLiAgVGhpcyBpcyBiZWNhdXNlIHRoZXJlICBpcyBubyB3YXkgIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGZ1bGwKKyAgICBkdXBsZXggICBsaW5rcyAgZXhjZXB0IHRocm91Z2ggICBhdXRvbmVnb3RpYXRpb24uICAgIFdoZW4gSSAgaW5jbHVkZSB0aGUKKyAgICBhdXRvbmVnb3RpYXRpb24gZmVhdHVyZSBpbiAgdGhlIFNST00gYXV0b2NvbmYgIGNvZGUsIHRoaXMgZGV0ZWN0aW9uIHdpbGwKKyAgICBvY2N1ciBhdXRvbWF0aWNhbGx5IGZvciB0aGF0IGNhc2UuCisKKyAgICBDb21tYW5kICBsaW5lIGFyZ3VtZW50cyBhcmUgIG5vdyAgYWxsb3dlZCwgc2ltaWxhciAgdG8gcGFzc2luZyBhcmd1bWVudHMKKyAgICB0aHJvdWdoIExJTE8uIFRoaXMgd2lsbCBhbGxvdyBhIHBlciBhZGFwdGVyIGJvYXJkICBzZXQgdXAgb2YgZnVsbCBkdXBsZXgKKyAgICBhbmQgbWVkaWEuIFRoZSBvbmx5IGxleGljYWwgY29uc3RyYWludHMgIGFyZTogdGhlIGJvYXJkIG5hbWUgKGRldi0+bmFtZSkKKyAgICBhcHBlYXJzIGluIHRoZSBsaXN0IGJlZm9yZSBpdHMgIHBhcmFtZXRlcnMuICBUaGUgbGlzdCBvZiBwYXJhbWV0ZXJzIGVuZHMKKyAgICBlaXRoZXIgYXQgdGhlIGVuZCBvZiB0aGUgcGFyYW1ldGVyIGxpc3Qgb3Igd2l0aCBhbm90aGVyIGJvYXJkIG5hbWUuICBUaGUKKyAgICBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgYWxsb3dlZDoKKworICAgICAgICAgICAgZmR4ICAgICAgICBmb3IgZnVsbCBkdXBsZXgKKwkgICAgYXV0b3NlbnNlICB0byBzZXQgdGhlIG1lZGlhL3NwZWVkOyB3aXRoIHRoZSBmb2xsb3dpbmcgCisJICAgICAgICAgICAgICAgc3ViLXBhcmFtZXRlcnM6CisJCSAgICAgICBUUCwgVFBfTlcsIEJOQywgQVVJLCBCTkNfQVVJLCAxMDBNYiwgMTBNYiwgQVVUTworCisgICAgQ2FzZSBzZW5zaXRpdml0eSBpcyBpbXBvcnRhbnQgIGZvciAgdGhlIHN1Yi1wYXJhbWV0ZXJzLiBUaGV5ICptdXN0KiAgIGJlCisgICAgdXBwZXIgY2FzZS4gRXhhbXBsZXM6CisKKyAgICAgICAgaW5zbW9kIGRlNHg1IGFyZ3M9J2V0aDE6ZmR4IGF1dG9zZW5zZT1CTkMgZXRoMDphdXRvc2Vuc2U9MTAwTWInLgorCisgICAgRm9yIGEgY29tcGlsZWQgaW4gZHJpdmVyLCBhdCBvciBhYm92ZSBsaW5lIDU0OCwgcGxhY2UgZS5nLgorCSNkZWZpbmUgREU0WDVfUEFSTSAiZXRoMDpmZHggYXV0b3NlbnNlPUFVSSBldGgyOmF1dG9zZW5zZT1UUCIKKworICAgIFllcywgIEkga25vdyBmdWxsIGR1cGxleCBpc24ndCAgcGVybWlzc2libGUgb24gQk5DICBvciBBVUk7IHRoZXkncmUganVzdAorICAgIGV4YW1wbGVzLiBCeSBkZWZhdWx0LCBmdWxsIGR1cGxleCBpcyB0dXJuZWQgb2ZmIGFuZCAgQVVUTyBpcyB0aGUgZGVmYXVsdAorICAgIGF1dG9zZW5zZSBzZXR0aW5nLiAgSW4gcmVhbGl0eSwgSSBleHBlY3Qgb25seSAgdGhlIGZ1bGwgZHVwbGV4IG9wdGlvbiB0bworICAgIGJlIHVzZWQuIE5vdGUgdGhlIHVzZSBvZiBzaW5nbGUgcXVvdGVzIGluIHRoZSB0d28gZXhhbXBsZXMgYWJvdmUgYW5kIHRoZQorICAgIGxhY2sgb2YgY29tbWFzIHRvIHNlcGFyYXRlIGl0ZW1zLiBBTFNPLCB5b3UgbXVzdCBnZXQgdGhlIHJlcXVlc3RlZCBtZWRpYQorICAgIGNvcnJlY3QgaW4gcmVsYXRpb24gdG8gd2hhdCB0aGUgYWRhcHRlciBTUk9NIHNheXMgaXQgaGFzLiBUaGVyZSdzIG5vIHdheQorICAgIHRvICBkZXRlcm1pbmUgdGhpcyBpbiAgYWR2YW5jZSBvdGhlciB0aGFuIGJ5ICB0cmlhbCBhbmQgZXJyb3IgYW5kIGNvbW1vbgorICAgIHNlbnNlLCBlLmcuIGNhbGwgYSBCTkMgY29ubmVjdG9yZWQgcG9ydCAnQk5DJywgbm90ICcxME1iJy4KKworICAgIENoYW5nZWQgdGhlIGJ1cyBwcm9iaW5nLiAgRUlTQSB1c2VkIHRvIGJlICBkb25lIGZpcnN0LCAgZm9sbG93ZWQgYnkgUENJLgorICAgIE1vc3QgcGVvcGxlIHByb2JhYmx5IGRvbid0IGV2ZW4ga25vdyAgd2hhdCBhIGRlNDI1IGlzIHRvZGF5IGFuZCB0aGUgRUlTQQorICAgIHByb2JlIGhhcyBtZXNzZWQgIHVwIHNvbWUgU0NTSSBjYXJkcyAgaW4gdGhlIHBhc3QsICBzbyBub3cgUENJIGlzIGFsd2F5cworICAgIHByb2JlZCAgZmlyc3QgIGZvbGxvd2VkIGJ5ICBFSVNBIGlmICBhKSB0aGUgYXJjaGl0ZWN0dXJlIGFsbG93cyBFSVNBIGFuZAorICAgIGVpdGhlciAgYikgdGhlcmUgaGF2ZSBiZWVuIG5vIFBDSSBjYXJkcyBkZXRlY3RlZCBvciAgYykgYW4gRUlTQSBwcm9iZSBpcworICAgIGZvcmNlZCBieSAgdGhlIHVzZXIuICBUbyBmb3JjZSAgYSBwcm9iZSAgaW5jbHVkZSAgImZvcmNlX2Vpc2EiICBpbiAgeW91cgorICAgIGluc21vZCAiYXJncyIgbGluZTsgIGZvciBidWlsdC1pbiBrZXJuZWxzIGVpdGhlciBjaGFuZ2UgdGhlIGRyaXZlciB0byBkbworICAgIHRoaXMgIGF1dG9tYXRpY2FsbHkgIG9yIGluY2x1ZGUgICNkZWZpbmUgREU0WDVfRk9SQ0VfRUlTQSAgb24gb3IgIGJlZm9yZQorICAgIGxpbmUgMTA0MCBpbiB0aGUgZHJpdmVyLgorCisgICAgVE8gRE86IAorICAgIC0tLS0tLQorCisgICAgUmV2aXNpb24gSGlzdG9yeQorICAgIC0tLS0tLS0tLS0tLS0tLS0KKworICAgIFZlcnNpb24gICBEYXRlICAgICAgICBEZXNjcmlwdGlvbgorICAKKyAgICAgIDAuMSAgICAgMTctTm92LTk0ICAgSW5pdGlhbCB3cml0aW5nLiBBTFBIQSBjb2RlIHJlbGVhc2UuCisgICAgICAwLjIgICAgIDEzLUphbi05NSAgIEFkZGVkIFBDSSBzdXBwb3J0IGZvciBERTQzNSdzLgorICAgICAgMC4yMSAgICAxOS1KYW4tOTUgICBBZGRlZCBhdXRvIG1lZGlhIGRldGVjdGlvbi4KKyAgICAgIDAuMjIgICAgMTAtRmViLTk1ICAgRml4IGludGVycnVwdCBoYW5kbGVyIGNhbGwgPGNocmlzQGNvc3kuc2JnLmFjLmF0Pi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRml4IHJlY29nbml0aW9uIGJ1ZyByZXBvcnRlZCBieSA8YmttQHN0YXIucmwuYWMudWs+LgorCQkJICBBZGQgcmVxdWVzdC9yZWxlYXNlX3JlZ2lvbiBjb2RlLgorCQkJICBBZGQgbG9hZGFibGUgbW9kdWxlcyBzdXBwb3J0IGZvciBQQ0kuCisJCQkgIENsZWFuIHVwIGxvYWRhYmxlIG1vZHVsZXMgc3VwcG9ydC4KKyAgICAgIDAuMjMgICAgMjgtRmViLTk1ICAgQWRkZWQgREMyMTA0MSBhbmQgREMyMTE0MCBzdXBwb3J0LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRml4IG1pc3NlZCBmcmFtZSBjb3VudGVyIHZhbHVlIGFuZCBpbml0aWFsaXNhdGlvbi4KKwkJCSAgRml4ZWQgRUlTQSBwcm9iZS4KKyAgICAgIDAuMjQgICAgMTEtQXByLTk1ICAgQ2hhbmdlIGRlbGF5IHJvdXRpbmUgdG8gdXNlIDxsaW51eC91ZGVsYXk+LgorICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2UgVFhfQlVGRlNfQVZBSUwgbWFjcm8uCisJCQkgIENoYW5nZSBtZWRpYSBhdXRvZGV0ZWN0aW9uIHRvIGFsbG93IG1hbnVhbCBzZXR0aW5nLgorCQkJICBDb21wbGV0ZWQgREU1MDAgKERDMjExNDApIHN1cHBvcnQuCisgICAgICAwLjI0MSAgIDE4LUFwci05NSAgIEludGVyaW0gcmVsZWFzZSB3aXRob3V0IERFNTAwIEF1dG9zZW5zZSBBbGdvcml0aG0uCisgICAgICAwLjI0MiAgIDEwLU1heS05NSAgIE1pbm9yIGNoYW5nZXMuCisgICAgICAwLjMwICAgIDEyLUp1bi05NSAgIFRpbWVyIGZpeCBmb3IgREMyMTE0MC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydGFiaWxpdHkgY2hhbmdlcy4KKwkJCSAgQWRkIEFMUEhBIGNoYW5nZXMgZnJvbSA8amVzdGFicm9AYW50LnRheTEuZGVjLmNvbT4uCisJCQkgIEFkZCBERTUwMCBzZW1pIGF1dG9tYXRpYyBhdXRvc2Vuc2UuCisJCQkgIEFkZCBMaW5rIEZhaWwgaW50ZXJydXB0IFRQIGZhaWx1cmUgZGV0ZWN0aW9uLgorCQkJICBBZGQgdGltZXIgYmFzZWQgbGluayBjaGFuZ2UgZGV0ZWN0aW9uLgorCQkJICBQbHVnZ2VkIGEgbWVtb3J5IGxlYWsgaW4gZGU0eDVfcXVldWVfcGt0KCkuCisgICAgICAwLjMxICAgIDEzLUp1bi05NSAgIEZpeGVkIFBDSSBzdHVmZiBmb3IgMS4zLjEuCisgICAgICAwLjMyICAgIDI2LUp1bi05NSAgIEFkZGVkIHZlcmlmeV9hcmVhKCkgY2FsbHMgaW4gZGU0eDVfaW9jdGwoKSBmcm9tIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiBieSA8aGVpa29AY29sb3NzdXMuZXNjYXBlLmRlPi4KKyAgICAgIDAuMzMgICAgIDgtQXVnLTk1ICAgQWRkIHNoYXJlZCBpbnRlcnJ1cHQgc3VwcG9ydCAobm90IHJlbGVhc2VkIHlldCkuCisgICAgICAwLjMzMSAgIDIxLUF1Zy05NSAgIEZpeCBkZTR4NV9vcGVuKCkgd2l0aCBmYXN0IENQVXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeCBkZTR4NV9pbnRlcnJ1cHQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRml4IGRjMjExNDBfYXV0b2NvbmYoKSBtZXNzLgorCQkJICBObyBzaGFyZWQgaW50ZXJydXB0IHN1cHBvcnQuCisgICAgICAwLjMzMiAgIDExLVNlcC05NSAgIEFkZGVkIE1JSSBtYW5hZ2VtZW50IGludGVyZmFjZSByb3V0aW5lcy4KKyAgICAgIDAuNDAgICAgIDUtTWFyLTk2ICAgRml4IHNldHVwIGZyYW1lIHRpbWVvdXQgPG1hYXJ0ZW5iQGhwa3VpcGMuY2Vybi5jaD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBrZXJuZWwgdGltZXIgY29kZSAoaC93IGlzIHRvbyBmbGFreSkuCisJCQkgIEFkZCBNSUkgYmFzZWQgUEhZIGF1dG9zZW5zZS4KKwkJCSAgQWRkIG5ldyBtdWx0aWNhc3RpbmcgY29kZS4KKwkJCSAgQWRkIG5ldyBhdXRvc2Vuc2UgYWxnb3JpdGhtcyBmb3IgbWVkaWEvbW9kZSAKKwkJCSAgc2VsZWN0aW9uIHVzaW5nIGtlcm5lbCBzY2hlZHVsaW5nL3RpbWluZy4KKwkJCSAgUmUtZm9ybWF0dGVkLgorCQkJICBNYWRlIGNoYW5nZXMgc3VnZ2VzdGVkIGJ5IDxqZWZmQHJvdXRlci5wYXRjaC5uZXQ+OgorCQkJICAgIENoYW5nZSBkcml2ZXIgdG8gZGV0ZWN0IGFsbCBERUNjaGlwIGJhc2VkIGNhcmRzCisJCQkgICAgd2l0aCBERUNfT05MWSByZXN0cmljdGlvbiBhIHNwZWNpYWwgY2FzZS4KKwkJCSAgICBDaGFuZ2VkIGRyaXZlciB0byBhdXRvcHJvYmUgYXMgYSBtb2R1bGUuIE5vIGlycQorCQkJICAgIGNoZWNraW5nIGlzIGRvbmUgbm93IC0gYXNzdW1lIEJJT1MgaXMgZ29vZCEKKwkJCSAgQWRkZWQgU01DOTMzMiBkZXRlY3Rpb24gPG1hbmFiZUBSb3kuZHNsLnR1dGljcy5hYy5qcD4KKyAgICAgIDAuNDEgICAgMjEtTWFyLTk2ICAgRG9uJ3QgY2hlY2sgZm9yIGdldF9od19hZGRyIGNoZWNrc3VtIHVubGVzcyBERUMgY2FyZAorICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IDxuaWxlc0BheHA3NDVnc2ZjLm5hc2EuZ292PgorCQkJICBGaXggZm9yIG11bHRpcGxlIFBDSSBjYXJkcyByZXBvcnRlZCBieSA8am9zQHhvcy5ubD4KKwkJCSAgRHVoLCBwdXQgdGhlIFNBX1NISVJRIGZsYWcgaW50byByZXF1ZXN0X2ludGVycnVwdCgpLgorCQkJICBGaXggU01DIGV0aGVybmV0IGFkZHJlc3MgaW4gZW5ldF9kZXRbXS4KKwkJCSAgUHJpbnQgY2hpcCBuYW1lIGluc3RlYWQgb2YgIlVOS05PV04iIGR1cmluZyBib290LgorICAgICAgMC40MiAgICAyNi1BcHItOTYgICBGaXggTUlJIHdyaXRlIFRBIGJpdCBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRml4IGJ1ZyBpbiBkYzIxMDQwIGFuZCBkYzIxMDQxIGF1dG9zZW5zZSBjb2RlLgorCQkJICBSZW1vdmUgYnVmZmVyIGNvcGllcyBvbiByZWNlaXZlIGZvciBJbnRlbHMuCisJCQkgIENoYW5nZSBza19idWZmIGhhbmRsaW5nIGR1cmluZyBtZWRpYSBkaXNjb25uZWN0cyB0bworCQkJICAgZWxpbWluYXRlIERVUCBwYWNrZXRzLgorCQkJICBBZGQgZHluYW1pYyBUWCB0aHJlc2hvbGRpbmcuCisJCQkgIENoYW5nZSBhbGwgY2hpcHMgdG8gdXNlIHBlcmZlY3QgbXVsdGljYXN0IGZpbHRlcmluZy4KKwkJCSAgRml4IGFsbG9jX2RldmljZSgpIGJ1ZyA8amFyaUBtYXJra3VzMi5maW1yLmZpPgorICAgICAgMC40MyAgIDIxLUp1bi05NiAgICBGaXggdW5jb25uZWN0ZWQgbWVkaWEgVFggcmV0cnkgYnVnLgorICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgQWNjdG9uIHRvIHRoZSBsaXN0IG9mIGJyb2tlbiBjYXJkcy4KKwkJCSAgRml4IFRYIHVuZGVyLXJ1biBidWcgZm9yIG5vbiBEQzIxMTQwIGNoaXBzLgorCQkJICBGaXggYm9vdCBjb21tYW5kIHByb2JlIGJ1ZyBpbiBhbGxvY19kZXZpY2UoKSBhcworCQkJICAgcmVwb3J0ZWQgYnkgPGtvZW4uZ2FkZXluZUBiYXJjby5jb20+IGFuZCAKKwkJCSAgIDxvcmF2YUBuZXRoZXIudGt5Lmh1dC5maT4uCisJCQkgIEFkZCBjYWNoZSBsb2NrcyB0byBwcmV2ZW50IGEgcmFjZSBjb25kaXRpb24gYXMKKwkJCSAgIHJlcG9ydGVkIGJ5IDxjc2RAbWljcm9wbGV4LmNvbT4gYW5kIAorCQkJICAgPGJhYmFAYmVja21hbi51aXVjLmVkdT4uCisJCQkgIFVwZ3JhZGVkIGFsbG9jX2RldmljZSgpIGNvZGUuCisgICAgICAwLjQzMSAgMjgtSnVuLTk2ICAgIEZpeCBwb3RlbnRpYWwgYnVnIGluIHF1ZXVlX3BrdCgpIGZyb20gZGlzY3Vzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIDxjc2RAbWljcm9wbGV4LmNvbT4KKyAgICAgIDAuNDQgICAxMy1BdWctOTYgICAgRml4IFJYIG92ZXJmbG93IGJ1ZyBpbiAyMTE0WzAyM10gY2hpcHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeCBFSVNBIHByb2JlIGJ1Z3MgcmVwb3J0ZWQgYnkgPG9zMkBrcGkua2hhcmtvdi51YT4KKwkJCSAgYW5kIDxtaWNoYWVsQGNvbXB1cmV4LmNvbT4uCisgICAgICAwLjQ0MSAgIDktU2VwLTk2ICAgIENoYW5nZSBkYzIxMDQxX2F1dG9jb25mKCkgdG8gcHJvYmUgcXVpZXQgQk5DIG1lZGlhCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgbG9vcGJhY2sgcGFja2V0LgorICAgICAgMC40NDIgICA5LVNlcC05NiAgICBJbmNsdWRlIEFVSSBpbiBkYzIxMDQxIG1lZGlhIHByaW50b3V0LiBCdWcgcmVwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IDxiaGF0QG11bmRvb2suY3MubXUuT1ouQVU+CisgICAgICAwLjQ1ICAgIDgtRGVjLTk2ICAgIEluY2x1ZGUgZW5kaWFuIGZ1bmN0aW9ucyBmb3IgUFBDIHVzZSwgZnJvbSB3b3JrIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPGNvcnRAY3Mubm10LmVkdT4gYW5kIDxnLnRob21hc0BvcGVuZ3JvdXAub3JnPi4KKyAgICAgIDAuNDUxICAyOC1EZWMtOTYgICAgQWRkZWQgZml4IHRvIGFsbG93IGF1dG9wcm9iZSBmb3IgbW9kdWxlcyBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiBmcm9tIDxtamFjb2JAZmVyYWwuY29tPi4KKyAgICAgIDAuNSAgICAzMC1KYW4tOTcgICAgQWRkZWQgU1JPTSBkZWNvZGluZyBmdW5jdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZWQgZGVidWcgZmxhZ3MuCisJCQkgIEZpeCBzbGVlcC93YWtldXAgY2FsbHMgZm9yIFBDSSBjYXJkcywgYnVnIHJlcG9ydGVkCisJCQkgICBieSA8Y3Jvc3NAZ3dlZXAubGtnLmRlYy5jb20+LgorCQkJICBBZGRlZCBtdWx0aS1NQUMsIG9uZSBTUk9NIGZlYXR1cmUgZnJvbSBkaXNjdXNzaW9uCisJCQkgICB3aXRoIDxtamFjb2JAZmVyYWwuY29tPi4KKwkJCSAgQWRkZWQgZnVsbCBtb2R1bGUgYXV0b3Byb2JlIGNhcGFiaWxpdHkuCisJCQkgIEFkZGVkIGF0dGVtcHQgdG8gdXNlIGFuIFNNQzkzMzIgd2l0aCBicm9rZW4gU1JPTS4KKwkJCSAgQWRkZWQgZml4IGZvciBaWU5YIG11bHRpLW1hYyBjYXJkcyB0aGF0IGRpZG4ndAorCQkJICAgZ2V0IHRoZWlyIElSUXMgd2lyZWQgY29ycmVjdGx5LgorICAgICAgMC41MSAgIDEzLUZlYi05NyAgICBBZGRlZCBlbmRpYW4gZml4ZXMgZm9yIHRoZSBTUk9NIGFjY2Vzc2VzIGZyb20KKwkJCSAgIDxwYXViZXJ0QGlyYW0uZXM+CisJCQkgIEZpeCBpbml0X2Nvbm5lY3Rpb24oKSB0byByZW1vdmUgZXh0cmEgZGV2aWNlIHJlc2V0LgorCQkJICBGaXggTUFDL1BIWSByZXNldCBvcmRlcmluZyBpbiBkYzIxMTQwbV9hdXRvY29uZigpLgorCQkJICBGaXggaW5pdGlhbGlzYXRpb24gcHJvYmxlbSB3aXRoIGxwLT50aW1lb3V0IGluCisJCQkgICB0eXBlWF9pbmZvYmxvY2soKSBmcm9tIDxwYXViZXJ0QGlyYW0uZXM+LgorCQkJICBGaXggTUlJIFBIWSByZXNldCBwcm9ibGVtIGZyb20gd29yayBkb25lIGJ5CisJCQkgICA8cGF1YmVydEBpcmFtLmVzPi4KKyAgICAgIDAuNTIgICAyNi1BcHItOTcgICAgU29tZSBjaGFuZ2VzIG1heSBub3QgY3JlZGl0IHRoZSByaWdodCBwZW9wbGUgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBkaXNrIGNyYXNoIG1lYW50IEkgbG9zdCBzb21lIG1haWwuCisJCQkgIENoYW5nZSBSWCBpbnRlcnJ1cHQgcm91dGluZSB0byBkcm9wIHJhdGhlciB0aGFuIAorCQkJICAgZGVmZXIgcGFja2V0cyB0byBhdm9pZCBoYW5nIHJlcG9ydGVkIGJ5IAorCQkJICAgPGcudGhvbWFzQG9wZW5ncm91cC5vcmc+LgorCQkJICBGaXggc3JvbV9leGVjKCkgdG8gcmV0dXJuIGZvciBDT01QQUNUIGFuZCB0eXBlIDEKKwkJCSAgIGluZm9ibG9ja3MuCisJCQkgIEFkZGVkIERDMjExNDIgYW5kIERDMjExNDMgZnVuY3Rpb25zLgorCQkJICBBZGRlZCBieXRlIGNvdW50ZXJzIGZyb20gPHBoaWxAdGF6ZW5kYS5kZW1vbi5jby51az4KKwkJCSAgQWRkZWQgU0FfSU5URVJSVVBUIHRlbXBvcmFyeSBmaXggZnJvbSAKKwkJCSAgIDxtamFjb2JAZmVyYWwuY29tPi4KKyAgICAgIDAuNTMgICAxMi1Ob3YtOTcgICAgRml4IHRoZSAqX3Byb2JlKCkgdG8gaW5jbHVkZSAnZXRoPz8nIG5hbWUgZHVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgbG9hZDogYnVnIHJlcG9ydGVkIGJ5CisJCQkgICA8UGlldGUuQnJvb2tzQGNsLmNhbS5hYy51az4KKwkJCSAgRml4IG11bHRpLU1BQywgb25lIFNST00sIHRvIHdvcmsgd2l0aCAyMTE0eCBjaGlwczoKKwkJCSAgIGJ1ZyByZXBvcnRlZCBieSA8Y21ldHpAaW5uZXIubmV0Pi4KKwkJCSAgTWFrZSBhYm92ZSBzZWFyY2ggaW5kZXBlbmRlbnQgb2YgQklPUyBkZXZpY2Ugc2NhbgorCQkJICAgZGlyZWN0aW9uLgorCQkJICBDb21wbGV0ZWQgREMyMTE0WzIzXSBhdXRvc2Vuc2UgZnVuY3Rpb25zLgorICAgICAgMC41MzEgIDIxLURlYy05NyAgICBGaXggREU1MDAtWEEgMTAwTWIvcyBidWcgcmVwb3J0ZWQgYnkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cm9iaW5AaW50ZXJjb3JlLmNvbQorCQkJICBGaXggdHlwZTFfaW5mb2Jsb2NrKCkgYnVnIGludHJvZHVjZWQgaW4gMC41MywgZnJvbQorCQkJICAgcHJvYmxlbSByZXBvcnRzIGJ5IAorCQkJICAgPHBhcm1lZUBwb3N0ZWNzcy5uY3JmcmFuLmZyYW5jZS5uY3IuY29tPiBhbmQKKwkJCSAgIDxqb0BpY2UuZGlsbGluZ2VuLmJheW5ldC5kZT4uCisJCQkgIEFkZGVkIGFyZ3VtZW50IGxpc3QgdG8gc2V0IHVwIGVhY2ggYm9hcmQgZnJvbSBlaXRoZXIKKwkJCSAgIGEgbW9kdWxlJ3MgY29tbWFuZCBsaW5lIG9yIGEgY29tcGlsZWQgaW4gI2RlZmluZS4KKwkJCSAgQWRkZWQgZ2VuZXJpYyBNSUkgUEhZIGZ1bmN0aW9uYWxpdHkgdG8gZGVhbCB3aXRoCisJCQkgICBuZXdlciBQSFkgY2hpcHMuCisJCQkgIEZpeCB0aGUgbWVzcyBpbiAyLjEuNjcuCisgICAgICAwLjUzMiAgIDUtSmFuLTk4ICAgIEZpeCBidWcgaW4gbWlpX2dldF9waHkoKSByZXBvcnRlZCBieSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWRoYXRAY29jb2NvLm5ldD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeCBidWcgaW4gcGNpX3Byb2JlKCkgZm9yIDY0IGJpdCBzeXN0ZW1zIHJlcG9ydGVkCisJCQkgICBieSA8YmVsbGlvdHRAYWNjZXNzb25lLmNvbT4uCisgICAgICAwLjUzMyAgIDktSmFuLTk4ICAgIEZpeCBtb3JlIDY0IGJpdCBidWdzIHJlcG9ydGVkIGJ5IDxqYWxAY3MuYnJvd24uZWR1Pi4KKyAgICAgIDAuNTM0ICAyNC1KYW4tOTggICAgRml4IGxhc3QgKD8pIGVuZGlhbiBidWcgZnJvbSA8Z2VlcnRAbGludXgtbTY4ay5vcmc+CisgICAgICAwLjUzNSAgMjEtRmViLTk4ICAgIEZpeCBFdGhlcm5ldCBBZGRyZXNzIFBST00gcmVzZXQgYnVnIGZvciBEQzIxMDQwLgorICAgICAgMC41MzYgIDIxLU1hci05OCAgICBDaGFuZ2UgcGNpX3Byb2JlKCkgdG8gdXNlIHRoZSBwY2lfZGV2IHN0cnVjdHVyZS4KKwkJCSAgKipJbmNvbXBhdGlibGUgd2l0aCAyLjAueCBmcm9tIGhlcmUuKioKKyAgICAgIDAuNTQwICAgNS1KdWwtOTggICAgQXRvbWljaXplIGFzc2VydGlvbiBvZiBkZXYtPmludGVycnVwdCBmb3IgU01QCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIDxsbWFAdmFyZXNlYXJjaC5jb20+CisJCQkgIEFkZCBUUCwgQVVJIGFuZCBCTkMgY2FzZXMgdG8gMjExNDBtX2F1dG9jb25mKCkgZm9yCisJCQkgICBjYXNlIHdoZXJlIGEgMjExNDAgdW5kZXIgU1JPTSBjb250cm9sIHVzZXMsIGUuZy4gQVVJCisJCQkgICBmcm9tIHByb2JsZW0gcmVwb3J0IGJ5IDxkZWxjaGluaUBscG5wMDkuaW4ycDMuZnI+CisJCQkgIEFkZCBNSUkgcGFyYWxsZWwgZGV0ZWN0aW9uIHRvIDIxMTR4X2F1dG9jb25mKCkgZm9yCisJCQkgICBjYXNlIHdoZXJlIG5vIGF1dG9uZWdvdGlhdGlvbiBwYXJ0bmVyIGV4aXN0cyBmcm9tCisJCQkgICBwcm9ibGVtIHJlcG9ydCBieSA8bWxhcHNsZXlAbmRpcmVjdC5jby51az4uCisJCQkgIEFkZCBhYmlsaXR5IHRvIGZvcmNlIGNvbm5lY3Rpb24gdHlwZSBkaXJlY3RseSBldmVuCisJCQkgICB3aGVuIHVzaW5nIFNST00gY29udHJvbCBmcm9tIHByb2JsZW0gcmVwb3J0IGJ5CisJCQkgICA8ZWFybEBleGlzLm5ldD4uCisJCQkgIFVwZGF0ZWQgdGhlIFBDSSBpbnRlcmZhY2UgdG8gY29uZm9ybSB3aXRoIHRoZSBsYXRlc3QKKwkJCSAgIHZlcnNpb24uIEkgaG9wZSBub3RoaW5nIGlzIGJyb2tlbi4uLgorICAgICAgICAgIAkJICBBZGQgVFggZG9uZSBpbnRlcnJ1cHQgbW9kaWZpY2F0aW9uIGZyb20gc3VnZ2VzdGlvbgorCQkJICAgYnkgPEF1c3Rpbi5Eb25uZWxseUBjbC5jYW0uYWMudWs+LgorCQkJICBGaXggaXNfYW5jX2NhcGFibGUoKSBidWcgcmVwb3J0ZWQgYnkgCisJCQkgICA8QXVzdGluLkRvbm5lbGx5QGNsLmNhbS5hYy51az4uCisJCQkgIEZpeCB0eXBlWzEzXV9pbmZvYmxvY2soKSBidWc6IGR1cmluZyBNSUkgc2VhcmNoLCBQSFkKKwkJCSAgIGxwLT5yc3Qgbm90IHJ1biBiZWNhdXNlIGxwLT5pYm4gbm90IGluaXRpYWxpc2VkIC0KKwkJCSAgIGZyb20gcmVwb3J0ICYgZml4IGJ5IDxwYXViZXJ0QGlyYW0uZXM+LgorCQkJICBGaXggcHJvYmUgYnVnIHdpdGggRUlTQSAmIFBDSSBjYXJkcyBwcmVzZW50IGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydCBieSA8ZWlyaWtAbmV0Y29tLmNvbT4uCisgICAgICAwLjU0MSAgMjQtQXVnLTk4ICAgIEZpeCBjb21waWxlciBwcm9ibGVtcyBhc3NvY2lhdGVkIHdpdGggaTM4Ni1zdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcyBmcm9tIG11bHRpcGxlIGJ1ZyByZXBvcnRzIGFuZCB0ZW1wb3JhcnkgZml4CisJCQkgICBmcm9tIDxwYXViZXJ0QGlyYW0uZXM+LgorCQkJICBGaXggcGNpX3Byb2JlKCkgdG8gY29ycmVjdGx5IGVtdWxhdGUgdGhlIG9sZAorCQkJICAgcGNpYmlvc19maW5kX2NsYXNzKCkgZnVuY3Rpb24uCisJCQkgIEFkZCBhbl9leGNlcHRpb24oKSBmb3Igb2xkIFpZTlgzNDYgYW5kIGZpeCBjb21waWxlCisJCQkgICB3YXJuaW5nIG9uIFBQQyAmIFNQQVJDLCBmcm9tIDxlY2RAc2t5bmV0LmJlPi4KKwkJCSAgRml4IGxhc3RQQ0kgdG8gY29ycmVjdGx5IHdvcmsgd2l0aCBjb21waWxlZCBpbgorCQkJICAga2VybmVscyBhbmQgbW9kdWxlcyBmcm9tIGJ1ZyByZXBvcnQgYnkgCisJCQkgICA8WmxhdGtvLkNhbHVzaWNAQ0FSTmV0LmhyPiBldCBhbC4KKyAgICAgIDAuNTQyICAxNS1TZXAtOTggICAgRml4IGRjMjExNHhfYXV0b2NvbmYoKSB0byBzdG9wIG11bHRpcGxlIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIG1lZGlhIGlzIHVuY29ubmVjdGVkLgorCQkJICBDaGFuZ2UgZGV2LT5pbnRlcnJ1cHQgdG8gbHAtPmludGVycnVwdCB0byBlbnN1cmUKKwkJCSAgIGFsaWdubWVudCBmb3IgQWxwaGEncyBhbmQgYXZvaWQgdGhlaXIgdW5hbGlnbmVkCisJCQkgICBhY2Nlc3MgdHJhcHMuIFRoaXMgZmxhZyBpcyBtZXJlbHkgZm9yIGxvZyBtZXNzYWdlczoKKwkJCSAgIHNob3VsZCBkbyBzb21ldGhpbmcgbW9yZSBkZWZpbml0aXZlIHRob3VnaC4uLgorICAgICAgMC41NDMgIDMwLURlYy05OCAgICBBZGQgU01QIHNwaW4gbG9ja2luZy4KKyAgICAgIDAuNTQ0ICAgOC1NYXktOTkgICAgRml4IGZvciBidWdneSBTUk9NIGluIE1vdG9yb2xhIGVtYmVkZGVkIGJvYXJkcyB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAyMTE0MyBieSA8bW1wb3J0ZXJAaG9tZS5jb20+LgorCQkJICBDaGFuZ2UgUENJL0VJU0EgYnVzIHByb2Jpbmcgb3JkZXIuCisgICAgICAwLjU0NSAgMjgtTm92LTk5ICAgIEZ1cnRoZXIgTW90byBTUk9NIGJ1ZyBmaXggZnJvbSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtcG9ydGVyQGVuZy5tY2QubW90LmNvbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIGRvdWJsZSBjaGVja2luZyBmb3IgREVCVUdfUlggaW4gZGU0eDVfZGJnX3J4KCkKKwkJCSAgIGZyb20gcmVwb3J0IGJ5IDxnZWVydEBsaW51eC1tNjhrLm9yZz4KKyAgICAgIDAuNTQ2ICAyMi1GZWItMDEgICAgRml4ZXMgQWxwaGEgWFAxMDAwIG9vcHMuICBUaGUgc3JvbV9zZWFyY2ggZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcyBjYXVzaW5nIGEgcGFnZSBmYXVsdCB3aGVuIGluaXRpYWxpemluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlICdwYicsIG9uIGEgbm9uIGRlNHg1IFBDSSBkZXZpY2UsIGluIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYSBQQ0kgYnJpZGdlIChERUMgY2hpcCAyMTE1MikuIFRoZSB2YWx1ZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BiJyBpcyBub3cgb25seSBpbml0aWFsaXplZCBpZiBhIGRlNHg1IGNoaXAgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZyYW5jZUBoYW5kaGVsZHMub3JnPiAgCisgICAgICAwLjU0NyAgMDgtTm92LTAxICAgIFVzZSBsaWJyYXJ5IGNyYzMyIGZ1bmN0aW9ucyBieSA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgICAgICAwLjU0OCAgMzAtQXVnLTAzICAgIEJpZyAyLjYgY2xlYW51cC4gUG9ydGVkIHRvIFBDSS9FSVNBIHByb2JpbmcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljIERNQSBBUElzLiBGaXhlZCBERTQyNSBzdXBwb3J0IG9uIEFscGhhLgorCQkJICAgPG1hekB3aWxkLXdpbmQuZnIuZXUub3JnPgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9laXNhLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCisKKyNpbmNsdWRlICJkZTR4NS5oIgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9ICJkZTR4NS5jOlYwLjU0NiAyMDAxLzAyLzIyIGRhdmllc0BtYW5pYWMudWx0cmFuZXQuY29tXG4iOworCisjZGVmaW5lIGNfY2hhciBjb25zdCBjaGFyCisjZGVmaW5lIFRXSURETEUoYSkgKHVfc2hvcnQpbGUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgodV9zaG9ydCAqKShhKSkpCisKKy8qCisqKiBNSUkgSW5mb3JtYXRpb24KKyovCitzdHJ1Y3QgcGh5X3RhYmxlIHsKKyAgICBpbnQgcmVzZXQ7ICAgICAgICAgICAgICAvKiBIYXJkIHJlc2V0IHJlcXVpcmVkPyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpZDsgICAgICAgICAgICAgICAgIC8qIElFRUUgT1VJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IHRhOyAgICAgICAgICAgICAgICAgLyogT25lIGN5Y2xlIFRBIHRpbWUgLSA4MDIuM3UgaXMgY29uZnVzaW5nIGhlcmUgKi8KKyAgICBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAvKiBOb24gYXV0b25lZ290aWF0aW9uIChwYXJhbGxlbCkgc3BlZWQgZGV0LiAgICAqLworCWludCByZWc7CisJaW50IG1hc2s7CisJaW50IHZhbHVlOworICAgIH0gc3BkOworfTsKKworc3RydWN0IG1paV9waHkgeworICAgIGludCByZXNldDsgICAgICAgICAgICAgIC8qIEhhcmQgcmVzZXQgcmVxdWlyZWQ/ICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGlkOyAgICAgICAgICAgICAgICAgLyogSUVFRSBPVUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgdGE7ICAgICAgICAgICAgICAgICAvKiBPbmUgY3ljbGUgVEEgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHN0cnVjdCB7ICAgICAgICAgICAgICAgIC8qIE5vbiBhdXRvbmVnb3RpYXRpb24gKHBhcmFsbGVsKSBzcGVlZCBkZXQuICovCisJaW50IHJlZzsKKwlpbnQgbWFzazsKKwlpbnQgdmFsdWU7CisgICAgfSBzcGQ7CisgICAgaW50IGFkZHI7ICAgICAgICAgICAgICAgLyogTUlJIGFkZHJlc3MgZm9yIHRoZSBQSFkgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1X2NoYXIgICpnZXA7ICAgICAgICAgICAvKiBTdGFydCBvZiBHRVAgc2VxdWVuY2UgYmxvY2sgaW4gU1JPTSAgICAgICAqLworICAgIHVfY2hhciAgKnJzdDsgICAgICAgICAgIC8qIFN0YXJ0IG9mIHJlc2V0IHNlcXVlbmNlIGluIFNST00gICAgICAgICAgICovCisgICAgdV9pbnQgbWM7ICAgICAgICAgICAgICAgLyogTWVkaWEgQ2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1X2ludCBhbmE7ICAgICAgICAgICAgICAvKiBOV2F5IEFkdmVydGlzZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVfaW50IGZkeDsgICAgICAgICAgICAgIC8qIEZ1bGwgRHVwbGVYIGNhcGFiaWxpdGVzIGZvciBlYWNoIG1lZGlhICAgICovCisgICAgdV9pbnQgdHRtOyAgICAgICAgICAgICAgLyogVHJhbnNtaXQgVGhyZXNob2xkIE1vZGUgZm9yIGVhY2ggbWVkaWEgICAgKi8KKyAgICB1X2ludCBtY2k7ICAgICAgICAgICAgICAvKiAyMTE0MiBNSUkgQ29ubmVjdG9yIEludGVycnVwdCBpbmZvICAgICAgICAqLworfTsKKworI2RlZmluZSBERTRYNV9NQVhfUEhZIDggICAgIC8qIEFsbG93IHVwdG8gOCBhdHRhY2hlZCBQSFkgZGV2aWNlcyBwZXIgYm9hcmQgKi8KKworc3RydWN0IHNpYV9waHkgeworICAgIHVfY2hhciBtYzsgICAgICAgICAgICAgIC8qIE1lZGlhIENvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdV9jaGFyIGV4dDsgICAgICAgICAgICAgLyogY3NyMTMtMTUgdmFsaWQgd2hlbiBzZXQgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgY3NyMTM7ICAgICAgICAgICAgICAvKiBTSUEgQ29ubmVjdGl2aXR5IFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworICAgIGludCBjc3IxNDsgICAgICAgICAgICAgIC8qIFNJQSBUWC9SWCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGNzcjE1OyAgICAgICAgICAgICAgLyogU0lBIEdlbmVyYWwgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgZ2VwYzsgICAgICAgICAgICAgICAvKiBTSUEgR0VQIENvbnRyb2wgSW5mb3JtYXRpb24gICAgICAgICAgICAgICAqLworICAgIGludCBnZXA7ICAgICAgICAgICAgICAgIC8qIFNJQSBHRVAgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9OworCisvKgorKiogRGVmaW5lIHRoZSBrbm93IHVuaXZlcnNlIG9mIFBIWSBkZXZpY2VzIHRoYXQgY2FuIGJlCisqKiByZWNvZ25pc2VkIGJ5IHRoaXMgZHJpdmVyLgorKi8KK3N0YXRpYyBzdHJ1Y3QgcGh5X3RhYmxlIHBoeV9pbmZvW10gPSB7CisgICAgezAsIE5BVElPTkFMX1RYLCAxLCB7MHgxOSwgMHg0MCwgMHgwMH19LCAgICAgICAvKiBOYXRpb25hbCBUWCAgICAgICovCisgICAgezEsIEJST0FEQ09NX1Q0LCAxLCB7MHgxMCwgMHgwMiwgMHgwMn19LCAgICAgICAvKiBCcm9hZGNvbSBUNCAgICAgICovCisgICAgezAsIFNFRVFfVDQgICAgLCAxLCB7MHgxMiwgMHgxMCwgMHgxMH19LCAgICAgICAvKiBTRUVRIFQ0ICAgICAgICAgICovCisgICAgezAsIENZUFJFU1NfVDQgLCAxLCB7MHgwNSwgMHgyMCwgMHgyMH19LCAgICAgICAvKiBDeXByZXNzIFQ0ICAgICAgICovCisgICAgezAsIDB4NzgxMCAgICAgLCAxLCB7MHgxNCwgMHgwODAwLCAweDA4MDB9fSAgICAvKiBMZXZlbCBPbmUgTFRYOTcwICovCit9OworCisvKgorKiogVGhlc2UgR0VORVJJQyB2YWx1ZXMgYXNzdW1lcyB0aGF0IHRoZSBQSFkgZGV2aWNlcyBmb2xsb3cgODAyLjN1IGFuZAorKiogYWxsb3cgcGFyYWxsZWwgZGV0ZWN0aW9uIHRvIHNldCB0aGUgbGluayBwYXJ0bmVyIGFiaWxpdHkgcmVnaXN0ZXIuCisqKiBEZXRlY3Rpb24gb2YgMTAwQmFzZS1UWCBbSC9GIER1cGxleF0gYW5kIDEwMEJhc2UtVDQgaXMgc3VwcG9ydGVkLgorKi8KKyNkZWZpbmUgR0VORVJJQ19SRUcgICAweDA1ICAgICAgLyogQXV0b25lZy4gTGluayBQYXJ0bmVyIEFkdmVydGlzZW1lbnQgUmVnLiAqLworI2RlZmluZSBHRU5FUklDX01BU0sgIE1JSV9BTkxQQV8xMDBNIC8qIEFsbCAxMDBNYi9zIFRlY2hub2xvZ2llcyAgICAgICAgICAgICovCisjZGVmaW5lIEdFTkVSSUNfVkFMVUUgTUlJX0FOTFBBXzEwME0gLyogMTAwQi1UWCwgMTAwQi1UWCBGRFgsIDEwMEItVDQgICAgICAgKi8KKworLyoKKyoqIERlZmluZSBzcGVjaWFsIFNST00gZGV0ZWN0aW9uIGNhc2VzCisqLworc3RhdGljIGNfY2hhciBlbmV0X2RldFtdW0VUSF9BTEVOXSA9IHsKKyAgICB7MHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMH0sCisgICAgezB4MDAsIDB4MDAsIDB4ZTgsIDB4MDAsIDB4MDAsIDB4MDB9Cit9OworCisjZGVmaW5lIFNNQyAgICAxCisjZGVmaW5lIEFDQ1RPTiAyCisKKy8qCisqKiBTUk9NIFJlcGFpciBkZWZpbml0aW9ucy4gSWYgYSBicm9rZW4gU1JPTSBpcyBkZXRlY3RlZCBhIGNhcmQgbWF5CisqKiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBoZWxwIGZpZ3VyZSBvdXQgd2hhdCB0byBkby4gVGhpcyBpcyBhCisqKiAic3RhYiBpbiB0aGUgZGFyayIgYW5kIHNvIGZhciBmb3IgU01DOTMzMidzIG9ubHkuCisqLworc3RhdGljIGNfY2hhciBzcm9tX3JlcGFpcl9pbmZvW11bMTAwXSA9IHsKKyAgICB7MHgwMCwweDFlLDB4MDAsMHgwMCwweDAwLDB4MDgsICAgICAgICAgICAgIC8qIFNNQzkzMzIgKi8KKyAgICAgMHgxZiwweDAxLDB4OGYsMHgwMSwweDAwLDB4MDEsMHgwMCwweDAyLAorICAgICAweDAxLDB4MDAsMHgwMCwweDc4LDB4ZTAsMHgwMSwweDAwLDB4NTAsCisgICAgIDB4MDAsMHgxOCx9Cit9OworCisKKyNpZmRlZiBERTRYNV9ERUJVRworc3RhdGljIGludCBkZTR4NV9kZWJ1ZyA9IERFNFg1X0RFQlVHOworI2Vsc2UKKy8qc3RhdGljIGludCBkZTR4NV9kZWJ1ZyA9IChERUJVR19NSUkgfCBERUJVR19TUk9NIHwgREVCVUdfUENJQ0ZHIHwgREVCVUdfTUVESUEgfCBERUJVR19WRVJTSU9OKTsqLworc3RhdGljIGludCBkZTR4NV9kZWJ1ZyA9IChERUJVR19NRURJQSB8IERFQlVHX1ZFUlNJT04pOworI2VuZGlmCisKKy8qCisqKiBBbGxvdyBwZXIgYWRhcHRlciBzZXQgdXAuIEZvciBtb2R1bGVzIHRoaXMgaXMgc2ltcGx5IGEgY29tbWFuZCBsaW5lCisqKiBwYXJhbWV0ZXIsIGUuZy46IAorKiogaW5zbW9kIGRlNHg1IGFyZ3M9J2V0aDE6ZmR4IGF1dG9zZW5zZT1CTkMgZXRoMDphdXRvc2Vuc2U9MTAwTWInLgorKioKKyoqIEZvciBhIGNvbXBpbGVkIGluIGRyaXZlciwgcGxhY2UgZS5nLgorKiogICAgICNkZWZpbmUgREU0WDVfUEFSTSAiZXRoMDpmZHggYXV0b3NlbnNlPUFVSSBldGgyOmF1dG9zZW5zZT1UUCIKKyoqIGhlcmUKKyovCisjaWZkZWYgREU0WDVfUEFSTQorc3RhdGljIGNoYXIgKmFyZ3MgPSBERTRYNV9QQVJNOworI2Vsc2UKK3N0YXRpYyBjaGFyICphcmdzOworI2VuZGlmCisKK3N0cnVjdCBwYXJhbWV0ZXJzIHsKKyAgICBpbnQgZmR4OworICAgIGludCBhdXRvc2Vuc2U7Cit9OworCisjZGVmaW5lIERFNFg1X0FVVE9TRU5TRV9NUyAyNTAgICAgICAvKiBtc2VjIGF1dG9zZW5zZSB0aWNrIChERTUwMCkgKi8KKworI2RlZmluZSBERTRYNV9OREEgMHhmZmUwICAgICAgICAgICAgLyogTm8gRGV2aWNlIChJL08pIEFkZHJlc3MgKi8KKworLyoKKyoqIEV0aGVybmV0IFBST00gZGVmaW5lcworKi8KKyNkZWZpbmUgUFJPQkVfTEVOR1RIICAgIDMyCisjZGVmaW5lIEVUSF9QUk9NX1NJRyAgICAweEFBNTUwMEZGVUwKKworLyoKKyoqIEV0aGVybmV0IEluZm8KKyovCisjZGVmaW5lIFBLVF9CVUZfU1oJMTUzNiAgICAgICAgICAgIC8qIEJ1ZmZlciBzaXplIGZvciBlYWNoIFR4L1J4IGJ1ZmZlciAqLworI2RlZmluZSBJRUVFODAyXzNfU1ogICAgMTUxOCAgICAgICAgICAgIC8qIFBhY2tldCArIENSQyAqLworI2RlZmluZSBNQVhfUEtUX1NaICAgCTE1MTQgICAgICAgICAgICAvKiBNYXhpbXVtIGV0aGVybmV0IHBhY2tldCBsZW5ndGggKi8KKyNkZWZpbmUgTUFYX0RBVF9TWiAgIAkxNTAwICAgICAgICAgICAgLyogTWF4aW11bSBldGhlcm5ldCBkYXRhIGxlbmd0aCAqLworI2RlZmluZSBNSU5fREFUX1NaICAgCTEgICAgICAgICAgICAgICAvKiBNaW5pbXVtIGV0aGVybmV0IGRhdGEgbGVuZ3RoICovCisjZGVmaW5lIFBLVF9IRFJfTEVOICAgICAxNCAgICAgICAgICAgICAgLyogQWRkcmVzc2VzIGFuZCBkYXRhIGxlbmd0aCBpbmZvICovCisjZGVmaW5lIEZBS0VfRlJBTUVfTEVOICAoTUFYX1BLVF9TWiArIDEpCisjZGVmaW5lIFFVRVVFX1BLVF9USU1FT1VUICgzKkhaKSAgICAgICAgLyogMyBzZWNvbmQgdGltZW91dCAqLworCisKKy8qCisqKiBFSVNBIGJ1cyBkZWZpbmVzCisqLworI2RlZmluZSBERTRYNV9FSVNBX0lPX1BPUlRTICAgMHgwYzAwICAgIC8qIEkvTyBwb3J0IGJhc2UgYWRkcmVzcywgc2xvdCAwICovCisjZGVmaW5lIERFNFg1X0VJU0FfVE9UQUxfU0laRSAweDEwMCAgICAgLyogSS9PIGFkZHJlc3MgZXh0ZW50ICovCisKKyNkZWZpbmUgRUlTQV9BTExPV0VEX0lSUV9MSVNUICB7NSwgOSwgMTAsIDExfQorCisjZGVmaW5lIERFNFg1X1NJR05BVFVSRSB7IkRFNDI1IiwiREU0MzQiLCJERTQzNSIsIkRFNDUwIiwiREU1MDAifQorI2RlZmluZSBERTRYNV9OQU1FX0xFTkdUSCA4CisKK3N0YXRpYyBjX2NoYXIgKmRlNHg1X3NpZ25hdHVyZXNbXSA9IERFNFg1X1NJR05BVFVSRTsKKworLyoKKyoqIEV0aGVybmV0IFBST00gZGVmaW5lcyBmb3IgREMyMTA0MAorKi8KKyNkZWZpbmUgUFJPQkVfTEVOR1RIICAgIDMyCisjZGVmaW5lIEVUSF9QUk9NX1NJRyAgICAweEFBNTUwMEZGVUwKKworLyoKKyoqIFBDSSBCdXMgZGVmaW5lcworKi8KKyNkZWZpbmUgUENJX01BWF9CVVNfTlVNICAgICAgOAorI2RlZmluZSBERTRYNV9QQ0lfVE9UQUxfU0laRSAweDgwICAgICAgIC8qIEkvTyBhZGRyZXNzIGV4dGVudCAqLworI2RlZmluZSBERTRYNV9DTEFTU19DT0RFICAgICAweDAwMDIwMDAwIC8qIE5ldHdvcmsgY29udHJvbGxlciwgRXRoZXJuZXQgKi8KKworLyoKKyoqIE1lbW9yeSBBbGlnbm1lbnQuIEVhY2ggZGVzY3JpcHRvciBpcyA0IGxvbmd3b3JkcyBsb25nLiBUbyBmb3JjZSBhCisqKiBwYXJ0aWN1bGFyIGFsaWdubWVudCBvbiB0aGUgVFggZGVzY3JpcHRvciwgYWRqdXN0IERFU0NfU0tJUF9MRU4gYW5kCisqKiBERVNDX0FMSUdOLiBBTElHTiBhbGlnbnMgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHByaXZhdGUgbWVtb3J5IGFyZWEKKyoqIGFuZCBoZW5jZSB0aGUgUlggZGVzY3JpcHRvciByaW5nJ3MgZmlyc3QgZW50cnkuIAorKi8KKyNkZWZpbmUgREU0WDVfQUxJR040ICAgICAgKCh1X2xvbmcpNCAtIDEpICAgICAvKiAxIGxvbmd3b3JkIGFsaWduICovCisjZGVmaW5lIERFNFg1X0FMSUdOOCAgICAgICgodV9sb25nKTggLSAxKSAgICAgLyogMiBsb25nd29yZCBhbGlnbiAqLworI2RlZmluZSBERTRYNV9BTElHTjE2ICAgICAoKHVfbG9uZykxNiAtIDEpICAgIC8qIDQgbG9uZ3dvcmQgYWxpZ24gKi8KKyNkZWZpbmUgREU0WDVfQUxJR04zMiAgICAgKCh1X2xvbmcpMzIgLSAxKSAgICAvKiA4IGxvbmd3b3JkIGFsaWduICovCisjZGVmaW5lIERFNFg1X0FMSUdONjQgICAgICgodV9sb25nKTY0IC0gMSkgICAgLyogMTYgbG9uZ3dvcmQgYWxpZ24gKi8KKyNkZWZpbmUgREU0WDVfQUxJR04xMjggICAgKCh1X2xvbmcpMTI4IC0gMSkgICAvKiAzMiBsb25nd29yZCBhbGlnbiAqLworCisjZGVmaW5lIERFNFg1X0FMSUdOICAgICAgICAgREU0WDVfQUxJR04zMiAgICAgICAgICAgLyogS2VlcCB0aGUgREMyMTA0MCBoYXBweS4uLiAqLworI2RlZmluZSBERTRYNV9DQUNIRV9BTElHTiAgIENBTF8xNkxPTkcKKyNkZWZpbmUgREVTQ19TS0lQX0xFTiBEU0xfMCAgICAgICAgICAgICAvKiBNdXN0IGFncmVlIHdpdGggREVTQ19BTElHTiAqLworLyojZGVmaW5lIERFU0NfQUxJR04gICAgdTMyIGR1bW15WzRdOyAgLyAqIE11c3QgYWdyZWUgd2l0aCBERVNDX1NLSVBfTEVOICovCisjZGVmaW5lIERFU0NfQUxJR04KKworI2lmbmRlZiBERUNfT05MWSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZSBSRUFETUUuZGU0eDUgZm9yIHVzaW5nIHRoaXMgKi8KK3N0YXRpYyBpbnQgZGVjX29ubHk7CisjZWxzZQorc3RhdGljIGludCBkZWNfb25seSA9IDE7CisjZW5kaWYKKworLyoKKyoqIERFNFg1IElSUSBFTkFCTEUvRElTQUJMRQorKi8KKyNkZWZpbmUgRU5BQkxFX0lSUXMgeyBcCisgICAgaW1yIHw9IGxwLT5pcnFfZW47XAorICAgIG91dGwoaW1yLCBERTRYNV9JTVIpOyAgICAgICAgICAgICAgIC8qIEVuYWJsZSB0aGUgSVJRcyAqL1wKK30KKworI2RlZmluZSBESVNBQkxFX0lSUXMge1wKKyAgICBpbXIgPSBpbmwoREU0WDVfSU1SKTtcCisgICAgaW1yICY9IH5scC0+aXJxX2VuO1wKKyAgICBvdXRsKGltciwgREU0WDVfSU1SKTsgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBJUlFzICovXAorfQorCisjZGVmaW5lIFVOTUFTS19JUlFzIHtcCisgICAgaW1yIHw9IGxwLT5pcnFfbWFzaztcCisgICAgb3V0bChpbXIsIERFNFg1X0lNUik7ICAgICAgICAgICAgICAgLyogVW5tYXNrIHRoZSBJUlFzICovXAorfQorCisjZGVmaW5lIE1BU0tfSVJRcyB7XAorICAgIGltciA9IGlubChERTRYNV9JTVIpO1wKKyAgICBpbXIgJj0gfmxwLT5pcnFfbWFzaztcCisgICAgb3V0bChpbXIsIERFNFg1X0lNUik7ICAgICAgICAgICAgICAgLyogTWFzayB0aGUgSVJRcyAqL1wKK30KKworLyoKKyoqIERFNFg1IFNUQVJUL1NUT1AKKyovCisjZGVmaW5lIFNUQVJUX0RFNFg1IHtcCisgICAgb21yID0gaW5sKERFNFg1X09NUik7XAorICAgIG9tciB8PSBPTVJfU1QgfCBPTVJfU1I7XAorICAgIG91dGwob21yLCBERTRYNV9PTVIpOyAgICAgICAgICAgICAgIC8qIEVuYWJsZSB0aGUgVFggYW5kL29yIFJYICovXAorfQorCisjZGVmaW5lIFNUT1BfREU0WDUge1wKKyAgICBvbXIgPSBpbmwoREU0WDVfT01SKTtcCisgICAgb21yICY9IH4oT01SX1NUfE9NUl9TUik7XAorICAgIG91dGwob21yLCBERTRYNV9PTVIpOyAgICAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIFRYIGFuZC9vciBSWCAqLyBcCit9CisKKy8qCisqKiBERTRYNSBTSUEgUkVTRVQKKyovCisjZGVmaW5lIFJFU0VUX1NJQSBvdXRsKDAsIERFNFg1X1NJQ1IpOyAgLyogUmVzZXQgU0lBIGNvbm5lY3Rpdml0eSByZWdzICovCisKKy8qCisqKiBERTUwMCBBVVRPU0VOU0UgVElNRVIgSU5URVJWQUwgKE1JTExJU0VDUykKKyovCisjZGVmaW5lIERFNFg1X0FVVE9TRU5TRV9NUyAgMjUwCisKKy8qCisqKiBTUk9NIFN0cnVjdHVyZQorKi8KK3N0cnVjdCBkZTR4NV9zcm9tIHsKKyAgICBjaGFyIHN1Yl92ZW5kb3JfaWRbMl07CisgICAgY2hhciBzdWJfc3lzdGVtX2lkWzJdOworICAgIGNoYXIgcmVzZXJ2ZWRbMTJdOworICAgIGNoYXIgaWRfYmxvY2tfY3JjOworICAgIGNoYXIgcmVzZXJ2ZWQyOworICAgIGNoYXIgdmVyc2lvbjsKKyAgICBjaGFyIG51bV9jb250cm9sbGVyczsKKyAgICBjaGFyIGllZWVfYWRkcls2XTsKKyAgICBjaGFyIGluZm9bMTAwXTsKKyAgICBzaG9ydCBjaGtzdW07Cit9OworI2RlZmluZSBTVUJfVkVORE9SX0lEIDB4NTAwYQorCisvKgorKiogREU0WDUgRGVzY3JpcHRvcnMuIE1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgUlggYnVmZmVycyBhcmUgY29udGlndW91cworKiogYW5kIGhhdmUgc2l6ZXMgb2YgYm90aCBhIHBvd2VyIG9mIDIgYW5kIGEgbXVsdGlwbGUgb2YgNC4KKyoqIEEgc2l6ZSBvZiAyNTYgYnl0ZXMgZm9yIGVhY2ggYnVmZmVyIGNvdWxkIGJlIGNob3NlbiBiZWNhdXNlIG92ZXIgOTAlIG9mCisqKiBhbGwgcGFja2V0cyBpbiBvdXIgbmV0d29yayBhcmUgPDI1NiBieXRlcyBsb25nIGFuZCA2NCBsb25nd29yZCBhbGlnbm1lbnQKKyoqIGlzIHBvc3NpYmxlLiAxNTM2IHNob3dlZCBiZXR0ZXIgJ3R0Y3AnIHBlcmZvcm1hbmNlLiBUYWtlIHlvdXIgcGljay4gMzIgVFgKKyoqIGRlc2NyaXB0b3JzIGFyZSBuZWVkZWQgZm9yIG1hY2hpbmVzIHdpdGggYW4gQUxQSEEgQ1BVLgorKi8KKyNkZWZpbmUgTlVNX1JYX0RFU0MgOCAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUlggZGVzY3JpcHRvcnMgICAqLworI2RlZmluZSBOVU1fVFhfREVTQyAzMiAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBUWCBkZXNjcmlwdG9ycyAgICovCisjZGVmaW5lIFJYX0JVRkZfU1ogIDE1MzYgICAgICAgICAgICAgICAgLyogUG93ZXIgb2YgMiBmb3Iga21hbGxvYyBhbmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNdWx0aXBsZSBvZiA0IGZvciBEQzIxMDQwICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbG93cyA1MTIgYnl0ZSBhbGlnbm1lbnQgICovCitzdHJ1Y3QgZGU0eDVfZGVzYyB7CisgICAgdm9sYXRpbGUgczMyIHN0YXR1czsKKyAgICB1MzIgZGVzMTsKKyAgICB1MzIgYnVmOworICAgIHUzMiBuZXh0OworICAgIERFU0NfQUxJR04KK307CisKKy8qCisqKiBUaGUgREU0WDUgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIERFNFg1X1BLVF9TVEFUX1NaIDE2CisjZGVmaW5lIERFNFg1X1BLVF9CSU5fU1ogIDEyOCAgICAgICAgICAgIC8qIFNob3VsZCBiZSA+PTEwMCB1bmxlc3MgeW91CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlYXNlIERFNFg1X1BLVF9TVEFUX1NaICovCisKK3N0cnVjdCBwa3Rfc3RhdHMgeworCXVfaW50IGJpbnNbREU0WDVfUEtUX1NUQVRfU1pdOyAgICAgIC8qIFByaXZhdGUgc3RhdHMgY291bnRlcnMgICAgICAgKi8KKwl1X2ludCB1bmljYXN0OworCXVfaW50IG11bHRpY2FzdDsKKwl1X2ludCBicm9hZGNhc3Q7CisJdV9pbnQgZXhjZXNzaXZlX2NvbGxpc2lvbnM7CisJdV9pbnQgdHhfdW5kZXJydW5zOworCXVfaW50IGV4Y2Vzc2l2ZV91bmRlcnJ1bnM7CisJdV9pbnQgcnhfcnVudF9mcmFtZXM7CisJdV9pbnQgcnhfY29sbGlzaW9uOworCXVfaW50IHJ4X2RyaWJibGU7CisJdV9pbnQgcnhfb3ZlcmZsb3c7Cit9OworCitzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSB7CisgICAgY2hhciBhZGFwdGVyX25hbWVbODBdOyAgICAgICAgICAgICAgICAgIC8qIEFkYXB0ZXIgbmFtZSAgICAgICAgICAgICAgICAgKi8KKyAgICB1X2xvbmcgaW50ZXJydXB0OyAgICAgICAgICAgICAgICAgICAgICAgLyogQWxpZ25lZCBJU1IgZmxhZyAgICAgICAgICAgICAqLworICAgIHN0cnVjdCBkZTR4NV9kZXNjICpyeF9yaW5nOwkJICAgIC8qIFJYIGRlc2NyaXB0b3IgcmluZyAgICAgICAgICAgKi8KKyAgICBzdHJ1Y3QgZGU0eDVfZGVzYyAqdHhfcmluZzsJCSAgICAvKiBUWCBkZXNjcmlwdG9yIHJpbmcgICAgICAgICAgICovCisgICAgc3RydWN0IHNrX2J1ZmYgKnR4X3NrYltOVU1fVFhfREVTQ107ICAgIC8qIFRYIHNrYiBmb3IgZnJlZWluZyB3aGVuIHNlbnQgKi8KKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiW05VTV9SWF9ERVNDXTsgICAgLyogUlggc2tiJ3MgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCByeF9uZXcsIHJ4X29sZDsgICAgICAgICAgICAgICAgICAgICAvKiBSWCBkZXNjcmlwdG9yIHJpbmcgcG9pbnRlcnMgICovCisgICAgaW50IHR4X25ldywgdHhfb2xkOyAgICAgICAgICAgICAgICAgICAgIC8qIFRYIGRlc2NyaXB0b3IgcmluZyBwb2ludGVycyAgKi8KKyAgICBjaGFyIHNldHVwX2ZyYW1lW1NFVFVQX0ZSQU1FX0xFTl07ICAgICAgLyogSG9sZHMgTUNBIGFuZCBQQSBpbmZvLiAgICAgICAqLworICAgIGNoYXIgZnJhbWVbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaW4gc2l6ZWQgcGFja2V0IGZvciBsb29wYmFjayovCisgICAgc3BpbmxvY2tfdCBsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkYXB0ZXIgc3BlY2lmaWMgc3BpbmxvY2sgICAgKi8KKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsgICAgICAgICAgLyogUHVibGljIHN0YXRzICAgICAgICAgICAgICAgICAqLworICAgIHN0cnVjdCBwa3Rfc3RhdHMgcGt0U3RhdHM7CSAgICAgICAgICAgIC8qIFByaXZhdGUgc3RhdHMgY291bnRlcnMJICAgICovCisgICAgY2hhciByeFJpbmdTaXplOworICAgIGNoYXIgdHhSaW5nU2l6ZTsKKyAgICBpbnQgIGJ1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRUlTQSBvciBQQ0kgICAgICAgICAgICAgICAgICAqLworICAgIGludCAgYnVzX251bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQQ0kgQnVzIG51bWJlciAgICAgICAgICAgICAgICovCisgICAgaW50ICBkZXZpY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldmljZSBudW1iZXIgb24gUENJIGJ1cyAgICAgKi8KKyAgICBpbnQgIHN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRhcHRlciBPUEVORUQgb3IgQ0xPU0VEICAgICAqLworICAgIGludCAgY2hpcHNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEQzIxMDQwLCBEQzIxMDQxIG9yIERDMjExNDAgICovCisgICAgczMyICBpcnFfbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVycnVwdCBNYXNrIChFbmFibGUpIGJpdHMgKi8KKyAgICBzMzIgIGlycV9lbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VtbWFyeSBpbnRlcnJ1cHQgYml0cyAgICAgICAqLworICAgIGludCAgbWVkaWE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZWRpYSAoZWcgVFApLCBtb2RlIChlZyAxMDBCKSovCisgICAgaW50ICBjX21lZGlhOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHRoZSBsYXN0IG1lZGlhIGNvbm4gKi8KKyAgICBpbnQgIGZkeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVkaWEgZnVsbCBkdXBsZXggZmxhZyAgICAgICAqLworICAgIGludCAgbGlua09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaW5rIGlzIE9LICAgICAgICAgICAgICAgICAgICovCisgICAgaW50ICBhdXRvc2Vuc2U7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbG93L2Rpc2FsbG93IGF1dG9zZW5zaW5nICAgKi8KKyAgICBpbnQgIHR4X2VuYWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIGRlc2NyaXB0b3IgcG9sbGluZyAgICAqLworICAgIGludCAgc2V0dXBfZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXR1cCBmcmFtZSBmaWx0ZXJpbmcgdHlwZSAgICovCisgICAgaW50ICBsb2NhbF9zdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXRlIHdpdGhpbiBhICdtZWRpYScgc3RhdGUgKi8KKyAgICBzdHJ1Y3QgbWlpX3BoeSBwaHlbREU0WDVfTUFYX1BIWV07ICAgICAgLyogTGlzdCBvZiBhdHRhY2hlZCBQSFkgZGV2aWNlcyAqLworICAgIHN0cnVjdCBzaWFfcGh5IHNpYTsgICAgICAgICAgICAgICAgICAgICAvKiBTSUEgUEhZIEluZm9ybWF0aW9uICAgICAgICAgICovCisgICAgaW50ICBhY3RpdmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluZGV4IHRvIGFjdGl2ZSBQSFkgZGV2aWNlICAgKi8KKyAgICBpbnQgIG1paV9jbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGF0dGFjaGVkIFBIWSdzICAgICAqLworICAgIGludCAgdGltZW91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTY2hlZHVsaW5nIGNvdW50ZXIgICAgICAgICAgICovCisgICAgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7ICAgICAgICAgICAgICAgIC8qIFRpbWVyIGluZm8gZm9yIGtlcm5lbCAgICAgICAgKi8KKyAgICBpbnQgdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGVtcG9yYXJ5IGdsb2JhbCBwZXIgY2FyZCAgICAqLworICAgIHN0cnVjdCB7CisJdV9sb25nIGxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9jayB0aGUgY2FjaGUgYWNjZXNzZXMgICAgICAqLworCXMzMiBjc3IwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmVkIEJ1cyBNb2RlIFJlZ2lzdGVyICAgICAgKi8KKwlzMzIgY3NyNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlZCBPcGVyYXRpbmcgTW9kZSBSZWcuICAgICovCisJczMyIGNzcjc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZWQgSVJRIE1hc2sgUmVnaXN0ZXIgICAgICAqLworCXMzMiBnZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmVkIEdlbmVyYWwgUHVycG9zZSBSZWcuICAgKi8KKwlzMzIgZ2VwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIGluZm8gZm9yIEdFUCAgICAgICAgICovCisJczMyIGNzcjEzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZWQgU0lBIENvbm5lY3Rpdml0eSBSZWcuICAqLworCXMzMiBjc3IxNDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmVkIFNJQSBUWC9SWCBSZWdpc3RlciAgICAgKi8KKwlzMzIgY3NyMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlZCBTSUEgR2VuZXJhbCBSZWdpc3RlciAgICovCisJaW50IHNhdmVfY250OyAgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBpZiBzdGF0ZSBhbHJlYWR5IHNhdmVkICAqLworCXN0cnVjdCBza19idWZmICpza2I7ICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhlIChyZS1vcmRlcmVkKSBza2IncyAgKi8KKyAgICB9IGNhY2hlOworICAgIHN0cnVjdCBkZTR4NV9zcm9tIHNyb207ICAgICAgICAgICAgICAgICAvKiBBIGNvcHkgb2YgdGhlIFNST00gICAgICAgICAgICovCisgICAgaW50IGNmcnY7CQkJCSAgICAvKiBDYXJkIENGUlYgY29weSAqLworICAgIGludCByeF9vdmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgJ1JYIG92ZXJmbG93JyB0YWcgICovCisgICAgaW50IHVzZVNST007ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBub24tREVDIGNhcmQgdXNlIFNST00gICAgKi8KKyAgICBpbnQgdXNlTUlJOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5mb2Jsb2NrIHVzaW5nIHRoZSBNSUkgICAgICAqLworICAgIGludCBhc0JpdFZhbGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRvc2Vuc2UgYml0cyBpbiBHRVA/ICAgICAgICovCisgICAgaW50IGFzUG9sYXJpdHk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgPT4gYXNzZXJ0ZWQgaGlnaCAgICAgICAgICAgKi8KKyAgICBpbnQgYXNCaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0b3NlbnNlIGJpdCBudW1iZXIgaW4gR0VQICAqLworICAgIGludCBkZWZNZWRpdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTUk9NIGRlZmF1bHQgbWVkaXVtICAgICAgICAgICovCisgICAgaW50IHRjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExhc3QgaW5mb2Jsb2NrIG51bWJlciAgICAgICAgKi8KKyAgICBpbnQgaW5mb2Jsb2NrX2luaXQ7ICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZWQgdGhpcyBpbmZvYmxvY2s/ICAqLworICAgIGludCBpbmZvbGVhZl9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAvKiBTUk9NIGluZm9sZWFmIGZvciBjb250cm9sbGVyICovCisgICAgczMyIGluZm9ibG9ja19jc3I2OyAgICAgICAgICAgICAgICAgICAgIC8qIGNzcjYgdmFsdWUgaW4gU1JPTSBpbmZvYmxvY2sgKi8KKyAgICBpbnQgaW5mb2Jsb2NrX21lZGlhOyAgICAgICAgICAgICAgICAgICAgLyogaW5mb2Jsb2NrIG1lZGlhICAgICAgICAgICAgICAqLworICAgIGludCAoKmluZm9sZWFmX2ZuKShzdHJ1Y3QgbmV0X2RldmljZSAqKTsgICAgLyogUG9pbnRlciB0byBpbmZvbGVhZiBmdW5jdGlvbiAqLworICAgIHVfY2hhciAqcnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIFR5cGUgNSByZXNldCBpbmZvICovCisgICAgdV9jaGFyICBpYm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluZm9ibG9jayBudW1iZXIgICAgICAgICAgICAgKi8KKyAgICBzdHJ1Y3QgcGFyYW1ldGVycyBwYXJhbXM7ICAgICAgICAgICAgICAgLyogQ29tbWFuZCBsaW5lLyAjZGVmaW5lZCBwYXJhbXMgKi8KKyAgICBzdHJ1Y3QgZGV2aWNlICpnZW5kZXY7CSAgICAgICAgICAgIC8qIEdlbmVyaWMgZGV2aWNlICovCisgICAgZG1hX2FkZHJfdCBkbWFfcmluZ3M7CQkgICAgLyogRE1BIGhhbmRsZSBmb3IgcmluZ3MJICAgICovCisgICAgaW50IGRtYV9zaXplOwkJCSAgICAvKiBTaXplIG9mIHRoZSBETUEgYXJlYQkgICAgKi8KKyAgICBjaGFyICpyeF9idWZzOwkJCSAgICAvKiByeCBidWZzIG9uIGFscGhhLCBzcGFyYywgLi4uICovCit9OworCisvKgorKiogVG8gZ2V0IGFyb3VuZCBjZXJ0YWluIHBveHkgY2FyZHMgdGhhdCBkb24ndCBwcm92aWRlIGFuIFNST00KKyoqIGZvciB0aGUgc2Vjb25kIGFuZCBtb3JlIERFQ2NoaXAsIEkgaGF2ZSB0byBrZXkgb2ZmIHRoZSBmaXJzdAorKiogY2hpcCdzIGFkZHJlc3MuIEknbGwgYXNzdW1lIHRoZXJlJ3Mgbm90IGEgYmFkIFNST00gaWZmOgorKioKKyoqICAgICAgbyB0aGUgY2hpcHNldCBpcyB0aGUgc2FtZQorKiogICAgICBvIHRoZSBidXMgbnVtYmVyIGlzIHRoZSBzYW1lIGFuZCA+IDAKKyoqICAgICAgbyB0aGUgc3VtIG9mIGFsbCB0aGUgcmV0dXJuZWQgaHcgYWRkcmVzcyBieXRlcyBpcyAwIG9yIDB4NWZhCisqKgorKiogQWxzbyBoYXZlIHRvIHNhdmUgdGhlIGlycSBmb3IgdGhvc2UgY2FyZHMgd2hvc2UgaGFyZHdhcmUgZGVzaWduZXJzCisqKiBjYW4ndCBmb2xsb3cgdGhlIFBDSSB0byBQQ0kgQnJpZGdlIEFyY2hpdGVjdHVyZSBzcGVjLgorKi8KK3N0YXRpYyBzdHJ1Y3QgeworICAgIGludCBjaGlwc2V0OworICAgIGludCBidXM7CisgICAgaW50IGlycTsKKyAgICB1X2NoYXIgYWRkcltFVEhfQUxFTl07Cit9IGxhc3QgPSB7MCx9OworCisvKgorKiogVGhlIHRyYW5zbWl0IHJpbmcgZnVsbCBjb25kaXRpb24gaXMgZGVzY3JpYmVkIGJ5IHRoZSB0eF9vbGQgYW5kIHR4X25ldworKiogcG9pbnRlcnMgYnk6CisqKiAgICB0eF9vbGQgICAgICAgICAgICA9IHR4X25ldyAgICBFbXB0eSByaW5nCisqKiAgICB0eF9vbGQgICAgICAgICAgICA9IHR4X25ldysxICBGdWxsIHJpbmcKKyoqICAgIHR4X29sZCt0eFJpbmdTaXplID0gdHhfbmV3KzEgIEZ1bGwgcmluZyAgKHdyYXBwZWQgY29uZGl0aW9uKQorKi8KKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwgKChscC0+dHhfb2xkPD1scC0+dHhfbmV3KT9cCisJCQlscC0+dHhfb2xkK2xwLT50eFJpbmdTaXplLWxwLT50eF9uZXctMTpcCisJCQlscC0+dHhfb2xkICAgICAgICAgICAgICAgLWxwLT50eF9uZXctMSkKKworI2RlZmluZSBUWF9QS1RfUEVORElORyAobHAtPnR4X29sZCAhPSBscC0+dHhfbmV3KQorCisvKgorKiogUHVibGljIEZ1bmN0aW9ucworKi8KK3N0YXRpYyBpbnQgICAgIGRlNHg1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkZTR4NV9xdWV1ZV9wa3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZGU0eDVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCAgICAgZGU0eDVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0ICBuZXRfZGV2aWNlX3N0YXRzICpkZTR4NV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9sb2NhbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBwa3RfbGVuKTsKK3N0YXRpYyB2b2lkICAgIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRlNHg1X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworCisvKgorKiogUHJpdmF0ZSBmdW5jdGlvbnMKKyovCitzdGF0aWMgaW50ICAgICBkZTR4NV9od19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2Jhc2UsIHN0cnVjdCBkZXZpY2UgKmdlbmRldik7CitzdGF0aWMgaW50ICAgICBkZTR4NV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGU0eDVfc3dfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkZTR4NV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRlNHg1X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGU0eDVfYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGU0eDVfdHh1cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRlNHg1X3J4X292ZmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgICAgIGF1dG9jb25mX21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgY3JlYXRlX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpmcmFtZSwgaW50IGxlbik7CitzdGF0aWMgdm9pZCAgICBsb2FkX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWYsIHUzMiBmbGFncywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50ICAgICBkYzIxMDQwX2F1dG9jb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGMyMTA0MV9hdXRvY29uZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRjMjExNDBtX2F1dG9jb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGMyMTE0eF9hdXRvY29uZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIHNyb21fYXV0b2NvbmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkZTR4NV9zdXNwZWN0X3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB0aW1lb3V0LCBpbnQgcHJldl9zdGF0ZSwgaW50ICgqZm4pKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCksIGludCAoKmFzZm4pKHN0cnVjdCBuZXRfZGV2aWNlICopKTsKK3N0YXRpYyBpbnQgICAgIGRjMjEwNDBfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNzcjEzLCBpbnQgY3NyMTQsIGludCBjc3IxNSwgaW50IHRpbWVvdXQsIGludCBuZXh0X3N0YXRlLCBpbnQgc3VzcGVjdF9zdGF0ZSwgaW50ICgqZm4pKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCkpOworc3RhdGljIGludCAgICAgdGVzdF9tZWRpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzMzIgaXJxcywgczMyIGlycV9tYXNrLCBzMzIgY3NyMTMsIHMzMiBjc3IxNCwgczMyIGNzcjE1LCBzMzIgbXNlYyk7CitzdGF0aWMgaW50ICAgICB0ZXN0X2Zvcl8xMDBNYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXNlYyk7CitzdGF0aWMgaW50ICAgICB3YWl0X2Zvcl9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgdGVzdF9taWlfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWcsIGludCBtYXNrLCBpbnQgcG9sLCBsb25nIG1zZWMpOworc3RhdGljIGludCAgICAgaXNfc3BkXzEwMChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGlzXzEwMF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGlzXzEwX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgaXNfYW5jX2NhcGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBwaW5nX21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtc2VjKTsKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZGU0eDVfYWxsb2NfcnhfYnVmZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5kZXgsIGludCBsZW4pOworc3RhdGljIHZvaWQgICAgZGU0eDVfZnJlZV9yeF9idWZmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X2ZyZWVfdHhfYnVmZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9zYXZlX3NrYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9yc3RfZGVzY19yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgZGU0eDVfY2FjaGVfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZsYWcpOworc3RhdGljIHZvaWQgICAgZGU0eDVfcHV0X2NhY2hlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgICAgZGU0eDVfcHV0Yl9jYWNoZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBzdHJ1Y3QgIHNrX2J1ZmYgKmRlNHg1X2dldF9jYWNoZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X3NldHVwX2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9pbml0X2Nvbm5lY3Rpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkZTR4NV9yZXNldF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICByZXNldF9pbml0X3NpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzMzIgc2ljciwgczMyIHN0cnIsIHMzMiBzaWdyKTsKK3N0YXRpYyBpbnQgICAgIHRlc3RfYW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHMzMiBpcnFzLCBzMzIgaXJxX21hc2ssIHMzMiBtc2VjKTsKK3N0YXRpYyBpbnQgICAgIHRlc3RfdHAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgczMyIG1zZWMpOworc3RhdGljIGludCAgICAgRUlTQV9zaWduYXR1cmUoY2hhciAqbmFtZSwgc3RydWN0IGRldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgICAgIFBDSV9zaWduYXR1cmUoY2hhciAqbmFtZSwgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwKTsKK3N0YXRpYyB2b2lkICAgIERldmljZVByZXNlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9sb25nIGlvYmFzZSk7CitzdGF0aWMgdm9pZCAgICBlbmV0X2FkZHJfcnN0KHVfbG9uZyBhcHJvbV9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIGRlNHg1X2JhZF9zcm9tKHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCk7CitzdGF0aWMgc2hvcnQgICBzcm9tX3JkKHVfbG9uZyBhZGRyZXNzLCB1X2NoYXIgb2Zmc2V0KTsKK3N0YXRpYyB2b2lkICAgIHNyb21fbGF0Y2godV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHJlc3MpOworc3RhdGljIHZvaWQgICAgc3JvbV9jb21tYW5kKHVfaW50IGNvbW1hbmQsIHVfbG9uZyBhZGRyZXNzKTsKK3N0YXRpYyB2b2lkICAgIHNyb21fYWRkcmVzcyh1X2ludCBjb21tYW5kLCB1X2xvbmcgYWRkcmVzcywgdV9jaGFyIG9mZnNldCk7CitzdGF0aWMgc2hvcnQgICBzcm9tX2RhdGEodV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHJlc3MpOworLypzdGF0aWMgdm9pZCAgICBzcm9tX2J1c3kodV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHJlc3MpOyovCitzdGF0aWMgdm9pZCAgICBzZW5kdG9fc3JvbSh1X2ludCBjb21tYW5kLCB1X2xvbmcgYWRkcik7CitzdGF0aWMgaW50ICAgICBnZXRmcm9tX3Nyb20odV9sb25nIGFkZHIpOworc3RhdGljIGludCAgICAgc3JvbV9tYXBfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBzcm9tX2luZm9sZWFmX2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBzcm9tX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBzcm9tX2V4ZWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyICpwKTsKK3N0YXRpYyBpbnQgICAgIG1paV9yZCh1X2NoYXIgcGh5cmVnLCB1X2NoYXIgcGh5YWRkciwgdV9sb25nIGlvYWRkcik7CitzdGF0aWMgdm9pZCAgICBtaWlfd3IoaW50IGRhdGEsIHVfY2hhciBwaHlyZWcsIHVfY2hhciBwaHlhZGRyLCB1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIG1paV9yZGF0YSh1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyB2b2lkICAgIG1paV93ZGF0YShpbnQgZGF0YSwgaW50IGxlbiwgdV9sb25nIGlvYWRkcik7CitzdGF0aWMgdm9pZCAgICBtaWlfdGEodV9sb25nIHJ3LCB1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIG1paV9zd2FwKGludCBkYXRhLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkICAgIG1paV9hZGRyZXNzKHVfY2hhciBhZGRyLCB1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyB2b2lkICAgIHNlbmR0b19taWkodTMyIGNvbW1hbmQsIGludCBkYXRhLCB1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIGdldGZyb21fbWlpKHUzMiBjb21tYW5kLCB1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIG1paV9nZXRfb3VpKHVfY2hhciBwaHlhZGRyLCB1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIG1paV9nZXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgU2V0TXVsdGljYXN0RmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZ2V0X2h3X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBzcm9tX3JlcGFpcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY2FyZCk7CitzdGF0aWMgaW50ICAgICB0ZXN0X2JhZF9lbmV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGF0dXMpOworc3RhdGljIGludCAgICAgYW5fZXhjZXB0aW9uKHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCk7CitzdGF0aWMgY2hhciAgICAqYnVpbGRfc2V0dXBfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1vZGUpOworc3RhdGljIHZvaWQgICAgZGlzYWJsZV9hc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBlbmFibGVfYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB0aW1lX291dCk7CitzdGF0aWMgbG9uZyAgICBkZTR4NV9zd2l0Y2hfbWFjX3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBnZXBfcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBnZXBfd3IoczMyIGRhdGEsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICgqZm4pKHVfbG9uZyBkYXRhKSwgdV9sb25nIGRhdGEsIHVfbG9uZyBtc2VjKTsKK3N0YXRpYyB2b2lkICAgIHlhd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXRlKTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X3BhcnNlX3BhcmFtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X2RiZ19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgZGU0eDVfZGJnX21paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgayk7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9kYmdfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9kYmdfc3JvbShzdHJ1Y3QgZGU0eDVfc3JvbSAqcCk7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9kYmdfcngoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbik7CitzdGF0aWMgaW50ICAgICBkZTR4NV9zdHJuY21wKGNoYXIgKmEsIGNoYXIgKmIsIGludCBuKTsKK3N0YXRpYyBpbnQgICAgIGRjMjEwNDFfaW5mb2xlYWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkYzIxMTQwX2luZm9sZWFmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGMyMTE0Ml9pbmZvbGVhZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRjMjExNDNfaW5mb2xlYWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICB0eXBlMF9pbmZvYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyIGNvdW50LCB1X2NoYXIgKnApOworc3RhdGljIGludCAgICAgdHlwZTFfaW5mb2Jsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciBjb3VudCwgdV9jaGFyICpwKTsKK3N0YXRpYyBpbnQgICAgIHR5cGUyX2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCk7CitzdGF0aWMgaW50ICAgICB0eXBlM19pbmZvYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyIGNvdW50LCB1X2NoYXIgKnApOworc3RhdGljIGludCAgICAgdHlwZTRfaW5mb2Jsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciBjb3VudCwgdV9jaGFyICpwKTsKK3N0YXRpYyBpbnQgICAgIHR5cGU1X2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCk7CitzdGF0aWMgaW50ICAgICBjb21wYWN0X2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCk7CisKKy8qCisqKiBOb3RlIG5vdyB0aGF0IG1vZHVsZSBhdXRvcHJvYmluZyBpcyBhbGxvd2VkIHVuZGVyIEVJU0EgYW5kIFBDSS4gVGhlCisqKiBJUlEgbGluZXMgd2lsbCBub3QgYmUgYXV0by1kZXRlY3RlZDsgaW5zdGVhZCBJJ2xsIHJlbHkgb24gdGhlIEJJT1NlcworKiogdG8gImRvIHRoZSByaWdodCB0aGluZyIuCisqLworCitzdGF0aWMgaW50IGlvPTB4MDsvKiBFRElUIFRISVMgTElORSBGT1IgWU9VUiBDT05GSUdVUkFUSU9OIElGIE5FRURFRCAgICAgICAgKi8KKworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRlNHg1X2RlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRlY19vbmx5LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGFyZ3MsIGNoYXJwLCAwKTsKKworTU9EVUxFX1BBUk1fREVTQyhpbywgImRlNHg1IEkvTyBiYXNlIGFkZHJlc3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGU0eDVfZGVidWcsICJkZTR4NSBkZWJ1ZyBtYXNrIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlY19vbmx5LCAiZGU0eDUgcHJvYmUgb25seSBmb3IgRGlnaXRhbCBib2FyZHMgKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoYXJncywgImRlNHg1IGZ1bGwgZHVwbGV4IGFuZCBtZWRpYSB0eXBlIHNldHRpbmdzOyBzZWUgZGU0eDUuYyBmb3IgZGV0YWlscyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorKiogTGlzdCB0aGUgU1JPTSBpbmZvbGVhZiBmdW5jdGlvbnMgYW5kIGNoaXBzZXRzCisqLworc3RydWN0IEluZm9MZWFmIHsKKyAgICBpbnQgY2hpcHNldDsKKyAgICBpbnQgKCpmbikoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit9Oworc3RhdGljIHN0cnVjdCBJbmZvTGVhZiBpbmZvbGVhZl9hcnJheVtdID0geworICAgIHtEQzIxMDQxLCBkYzIxMDQxX2luZm9sZWFmfSwKKyAgICB7REMyMTE0MCwgZGMyMTE0MF9pbmZvbGVhZn0sCisgICAge0RDMjExNDIsIGRjMjExNDJfaW5mb2xlYWZ9LAorICAgIHtEQzIxMTQzLCBkYzIxMTQzX2luZm9sZWFmfQorfTsKKyNkZWZpbmUgSU5GT0xFQUZfU0laRSAoc2l6ZW9mKGluZm9sZWFmX2FycmF5KS8oc2l6ZW9mKGludCkrc2l6ZW9mKGludCAqKSkpCisKKy8qCisqKiBMaXN0IHRoZSBTUk9NIGluZm8gYmxvY2sgZnVuY3Rpb25zCisqLworc3RhdGljIGludCAoKmRjX2luZm9ibG9ja1tdKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIsIHVfY2hhciAqKSA9IHsKKyAgICB0eXBlMF9pbmZvYmxvY2ssCisgICAgdHlwZTFfaW5mb2Jsb2NrLAorICAgIHR5cGUyX2luZm9ibG9jaywKKyAgICB0eXBlM19pbmZvYmxvY2ssCisgICAgdHlwZTRfaW5mb2Jsb2NrLAorICAgIHR5cGU1X2luZm9ibG9jaywKKyAgICBjb21wYWN0X2luZm9ibG9jaworfTsKKworI2RlZmluZSBDT01QQUNUIChzaXplb2YoZGNfaW5mb2Jsb2NrKS9zaXplb2YoaW50ICopIC0gMSkKKworLyoKKyoqIE1pc2NlbGxhbmVvdXMgZGVmaW5lcy4uLgorKi8KKyNkZWZpbmUgUkVTRVRfREU0WDUge1wKKyAgICBpbnQgaTtcCisgICAgaT1pbmwoREU0WDVfQk1SKTtcCisgICAgbWRlbGF5KDEpO1wKKyAgICBvdXRsKGkgfCBCTVJfU1dSLCBERTRYNV9CTVIpO1wKKyAgICBtZGVsYXkoMSk7XAorICAgIG91dGwoaSwgREU0WDVfQk1SKTtcCisgICAgbWRlbGF5KDEpO1wKKyAgICBmb3IgKGk9MDtpPDU7aSsrKSB7aW5sKERFNFg1X0JNUik7IG1kZWxheSgxKTt9XAorICAgIG1kZWxheSgxKTtcCit9CisKKyNkZWZpbmUgUEhZX0hBUkRfUkVTRVQge1wKKyAgICBvdXRsKEdFUF9IUlNULCBERTRYNV9HRVApOyAgICAgICAgICAgLyogSGFyZCBSRVNFVCB0aGUgUEhZIGRldi4gKi9cCisgICAgbWRlbGF5KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzc2VydCBmb3IgMW1zICovXAorICAgIG91dGwoMHgwMCwgREU0WDVfR0VQKTtcCisgICAgbWRlbGF5KDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIDJtcyAqL1wKK30KKworDAorc3RhdGljIGludCBfX2RldmluaXQgCitkZTR4NV9od19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2Jhc2UsIHN0cnVjdCBkZXZpY2UgKmdlbmRldikKK3sKKyAgICBjaGFyIG5hbWVbREU0WDVfTkFNRV9MRU5HVEggKyAxXTsKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKyAgICBpbnQgaSwgc3RhdHVzPTA7CisKKyAgICBnZW5kZXYtPmRyaXZlcl9kYXRhID0gZGV2OworCisgICAgLyogRW5zdXJlIHdlJ3JlIG5vdCBzbGVlcGluZyAqLworICAgIGlmIChscC0+YnVzID09IEVJU0EpIHsKKwlvdXRiKFdBS0VVUCwgUENJX0NGUE0pOworICAgIH0gZWxzZSB7CisJcGRldiA9IHRvX3BjaV9kZXYgKGdlbmRldik7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DRkRBX1BTTSwgV0FLRVVQKTsKKyAgICB9CisgICAgbWRlbGF5KDEwKTsKKworICAgIFJFU0VUX0RFNFg1OworICAgIAorICAgIGlmICgoaW5sKERFNFg1X1NUUykgJiAoU1RTX1RTIHwgU1RTX1JTKSkgIT0gMCkgeworCXJldHVybiAtRU5YSU87ICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXJkd2FyZSBjb3VsZCBub3QgcmVzZXQgKi8KKyAgICB9CisgICAgCisgICAgLyogCisgICAgKiogTm93IGZpbmQgb3V0IHdoYXQga2luZCBvZiBEQzIxMDQwL0RDMjEwNDEvREMyMTE0MCBib2FyZCB3ZSBoYXZlLgorICAgICovCisgICAgbHAtPnVzZVNST00gPSBGQUxTRTsKKyAgICBpZiAobHAtPmJ1cyA9PSBQQ0kpIHsKKwlQQ0lfc2lnbmF0dXJlKG5hbWUsIGxwKTsKKyAgICB9IGVsc2UgeworCUVJU0Ffc2lnbmF0dXJlKG5hbWUsIGdlbmRldik7CisgICAgfQorICAgIAorICAgIGlmICgqbmFtZSA9PSAnXDAnKSB7ICAgICAgICAgICAgICAgICAgICAgLyogTm90IGZvdW5kIGEgYm9hcmQgc2lnbmF0dXJlICovCisJcmV0dXJuIC1FTlhJTzsKKyAgICB9CisgICAgCisgICAgZGV2LT5iYXNlX2FkZHIgPSBpb2Jhc2U7CisgICAgcHJpbnRrICgiJXM6ICVzIGF0IDB4JTA0bHgiLCBnZW5kZXYtPmJ1c19pZCwgbmFtZSwgaW9iYXNlKTsKKyAgICAKKyAgICBwcmludGsoIiwgaC93IGFkZHJlc3MgIik7CisgICAgc3RhdHVzID0gZ2V0X2h3X2FkZHIoZGV2KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU4gLSAxOyBpKyspIHsgICAgIC8qIGdldCB0aGUgZXRoZXJuZXQgYWRkci4gKi8KKwlwcmludGsoIiUyLjJ4OiIsIGRldi0+ZGV2X2FkZHJbaV0pOworICAgIH0KKyAgICBwcmludGsoIiUyLjJ4LFxuIiwgZGV2LT5kZXZfYWRkcltpXSk7CisgICAgCisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisJcHJpbnRrKCIgICAgICB3aGljaCBoYXMgYW4gRXRoZXJuZXQgUFJPTSBDUkMgZXJyb3IuXG4iKTsKKwlyZXR1cm4gLUVOWElPOworICAgIH0gZWxzZSB7CisJbHAtPmNhY2hlLmdlcGMgPSBHRVBfSU5JVDsKKwlscC0+YXNCaXQgPSBHRVBfU0xOSzsKKwlscC0+YXNQb2xhcml0eSA9IEdFUF9TTE5LOworCWxwLT5hc0JpdFZhbGlkID0gVFJVRTsKKwlscC0+dGltZW91dCA9IC0xOworCWxwLT5nZW5kZXYgPSBnZW5kZXY7CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKwlpbml0X3RpbWVyKCZscC0+dGltZXIpOworCWRlNHg1X3BhcnNlX3BhcmFtcyhkZXYpOworCisJLyoKKwkqKiBDaG9vc2UgY29ycmVjdCBhdXRvc2Vuc2luZyBpbiBjYXNlIHNvbWVvbmUgbWVzc2VkIHVwCisJKi8KKyAgICAgICAgbHAtPmF1dG9zZW5zZSA9IGxwLT5wYXJhbXMuYXV0b3NlbnNlOworICAgICAgICBpZiAobHAtPmNoaXBzZXQgIT0gREMyMTE0MCkgeworICAgICAgICAgICAgaWYgKChscC0+Y2hpcHNldD09REMyMTA0MCkgJiYgKGxwLT5wYXJhbXMuYXV0b3NlbnNlJlRQX05XKSkgeworICAgICAgICAgICAgICAgIGxwLT5wYXJhbXMuYXV0b3NlbnNlID0gVFA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGxwLT5jaGlwc2V0PT1EQzIxMDQxKSAmJiAobHAtPnBhcmFtcy5hdXRvc2Vuc2UmQk5DX0FVSSkpIHsKKyAgICAgICAgICAgICAgICBscC0+cGFyYW1zLmF1dG9zZW5zZSA9IEJOQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCWxwLT5mZHggPSBscC0+cGFyYW1zLmZkeDsKKwlzcHJpbnRmKGxwLT5hZGFwdGVyX25hbWUsIiVzICglcykiLCBuYW1lLCBnZW5kZXYtPmJ1c19pZCk7CisKKwlscC0+ZG1hX3NpemUgPSAoTlVNX1JYX0RFU0MgKyBOVU1fVFhfREVTQykgKiBzaXplb2Yoc3RydWN0IGRlNHg1X2Rlc2MpOworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fc3BhcmNfdjlfXykgfHwgZGVmaW5lZChERTRYNV9ET19NRU1DUFkpCisJbHAtPmRtYV9zaXplICs9IFJYX0JVRkZfU1ogKiBOVU1fUlhfREVTQyArIERFNFg1X0FMSUdOOworI2VuZGlmCisJbHAtPnJ4X3JpbmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoZ2VuZGV2LCBscC0+ZG1hX3NpemUsCisJCQkJCSAmbHAtPmRtYV9yaW5ncywgR0ZQX0FUT01JQyk7CisJaWYgKGxwLT5yeF9yaW5nID09IE5VTEwpIHsKKwkgICAgcmV0dXJuIC1FTk9NRU07CisJfQorCisJbHAtPnR4X3JpbmcgPSBscC0+cnhfcmluZyArIE5VTV9SWF9ERVNDOworCSAgICAKKwkvKgorCSoqIFNldCB1cCB0aGUgUlggZGVzY3JpcHRvciByaW5nIChJbnRlbHMpCisJKiogQWxsb2NhdGUgY29udGlndW91cyByZWNlaXZlIGJ1ZmZlcnMsIGxvbmcgd29yZCBhbGlnbmVkIChBbHBoYXMpIAorCSovCisjaWYgIWRlZmluZWQoX19hbHBoYV9fKSAmJiAhZGVmaW5lZChfX3Bvd2VycGNfXykgJiYgIWRlZmluZWQoX19zcGFyY192OV9fKSAmJiAhZGVmaW5lZChERTRYNV9ET19NRU1DUFkpCisJZm9yIChpPTA7IGk8TlVNX1JYX0RFU0M7IGkrKykgeworCSAgICBscC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOworCSAgICBscC0+cnhfcmluZ1tpXS5kZXMxID0gY3B1X3RvX2xlMzIoUlhfQlVGRl9TWik7CisJICAgIGxwLT5yeF9yaW5nW2ldLmJ1ZiA9IDA7CisJICAgIGxwLT5yeF9yaW5nW2ldLm5leHQgPSAwOworCSAgICBscC0+cnhfc2tiW2ldID0gKHN0cnVjdCBza19idWZmICopIDE7ICAgICAvKiBEdW1teSBlbnRyeSAqLworCX0KKworI2Vsc2UKKwl7CisJCWRtYV9hZGRyX3QgZG1hX3J4X2J1ZnM7CisKKwkJZG1hX3J4X2J1ZnMgPSBscC0+ZG1hX3JpbmdzICsgKE5VTV9SWF9ERVNDICsgTlVNX1RYX0RFU0MpCisJCSAgICAgIAkqIHNpemVvZihzdHJ1Y3QgZGU0eDVfZGVzYyk7CisJCWRtYV9yeF9idWZzID0gKGRtYV9yeF9idWZzICsgREU0WDVfQUxJR04pICYgfkRFNFg1X0FMSUdOOworCQlscC0+cnhfYnVmcyA9IChjaGFyICopKCgobG9uZykobHAtPnJ4X3JpbmcgKyBOVU1fUlhfREVTQworCQkgICAgICAJKyBOVU1fVFhfREVTQykgKyBERTRYNV9BTElHTikgJiB+REU0WDVfQUxJR04pOworCQlmb3IgKGk9MDsgaTxOVU1fUlhfREVTQzsgaSsrKSB7CisJICAgIAkJbHAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwkgICAgCQlscC0+cnhfcmluZ1tpXS5kZXMxID0gY3B1X3RvX2xlMzIoUlhfQlVGRl9TWik7CisJICAgIAkJbHAtPnJ4X3JpbmdbaV0uYnVmID0KKwkJCQljcHVfdG9fbGUzMihkbWFfcnhfYnVmcytpKlJYX0JVRkZfU1opOworCSAgICAJCWxwLT5yeF9yaW5nW2ldLm5leHQgPSAwOworCSAgICAJCWxwLT5yeF9za2JbaV0gPSAoc3RydWN0IHNrX2J1ZmYgKikgMTsgLyogRHVtbXkgZW50cnkgKi8KKwkJfQorCisJfQorI2VuZGlmCisKKwliYXJyaWVyKCk7CisKKwlscC0+cnhSaW5nU2l6ZSA9IE5VTV9SWF9ERVNDOworCWxwLT50eFJpbmdTaXplID0gTlVNX1RYX0RFU0M7CisJICAgIAorCS8qIFdyaXRlIHRoZSBlbmQgb2YgbGlzdCBtYXJrZXIgdG8gdGhlIGRlc2NyaXB0b3IgbGlzdHMgKi8KKwlscC0+cnhfcmluZ1tscC0+cnhSaW5nU2l6ZSAtIDFdLmRlczEgfD0gY3B1X3RvX2xlMzIoUkRfUkVSKTsKKwlscC0+dHhfcmluZ1tscC0+dHhSaW5nU2l6ZSAtIDFdLmRlczEgfD0gY3B1X3RvX2xlMzIoVERfVEVSKTsKKworCS8qIFRlbGwgdGhlIGFkYXB0ZXIgd2hlcmUgdGhlIFRYL1JYIHJpbmdzIGFyZSBsb2NhdGVkLiAqLworCW91dGwobHAtPmRtYV9yaW5ncywgREU0WDVfUlJCQSk7CisJb3V0bChscC0+ZG1hX3JpbmdzICsgTlVNX1JYX0RFU0MgKiBzaXplb2Yoc3RydWN0IGRlNHg1X2Rlc2MpLAorCSAgICAgREU0WDVfVFJCQSk7CisJICAgIAorCS8qIEluaXRpYWxpc2UgdGhlIElSUSBtYXNrIGFuZCBFbmFibGUvRGlzYWJsZSAqLworCWxwLT5pcnFfbWFzayA9IElNUl9SSU0gfCBJTVJfVElNIHwgSU1SX1RVTSB8IElNUl9VTk07CisJbHAtPmlycV9lbiAgID0gSU1SX05JTSB8IElNUl9BSU07CisKKwkvKiBDcmVhdGUgYSBsb29wYmFjayBwYWNrZXQgZnJhbWUgZm9yIGxhdGVyIG1lZGlhIHByb2JpbmcgKi8KKwljcmVhdGVfcGFja2V0KGRldiwgbHAtPmZyYW1lLCBzaXplb2YobHAtPmZyYW1lKSk7CisKKwkvKiBDaGVjayBpZiB0aGUgUlggb3ZlcmZsb3cgYnVnIG5lZWRzIHRlc3RpbmcgZm9yICovCisJaSA9IGxwLT5jZnJ2ICYgMHgwMDAwMDBmZTsKKwlpZiAoKGxwLT5jaGlwc2V0ID09IERDMjExNDApICYmIChpID09IDB4MjApKSB7CisJICAgIGxwLT5yeF9vdmYgPSAxOworCX0KKworCS8qIEluaXRpYWxpc2UgdGhlIFNST00gcG9pbnRlcnMgaWYgcG9zc2libGUgKi8KKwlpZiAobHAtPnVzZVNST00pIHsKKwkgICAgbHAtPnN0YXRlID0gSU5JVElBTElTRUQ7CisJICAgIGlmIChzcm9tX2luZm9sZWFmX2luZm8oZGV2KSkgeworCSAgICAgICAgZG1hX2ZyZWVfY29oZXJlbnQgKGdlbmRldiwgbHAtPmRtYV9zaXplLAorCQkJICAgICAgIGxwLT5yeF9yaW5nLCBscC0+ZG1hX3JpbmdzKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwkgICAgfQorCSAgICBzcm9tX2luaXQoZGV2KTsKKwl9CisKKwlscC0+c3RhdGUgPSBDTE9TRUQ7CisKKwkvKgorCSoqIENoZWNrIGZvciBhbiBNSUkgaW50ZXJmYWNlCisJKi8KKwlpZiAoKGxwLT5jaGlwc2V0ICE9IERDMjEwNDApICYmIChscC0+Y2hpcHNldCAhPSBEQzIxMDQxKSkgeworCSAgICBtaWlfZ2V0X3BoeShkZXYpOworCX0KKwkKKyNpZm5kZWYgX19zcGFyY192OV9fCisJcHJpbnRrKCIgICAgICBhbmQgcmVxdWlyZXMgSVJRJWQgKHByb3ZpZGVkIGJ5ICVzKS5cbiIsIGRldi0+aXJxLAorI2Vsc2UKKwlwcmludGsoIiAgICAgIGFuZCByZXF1aXJlcyBJUlEleCAocHJvdmlkZWQgYnkgJXMpLlxuIiwgZGV2LT5pcnEsCisjZW5kaWYKKwkgICAgICAgKChscC0+YnVzID09IFBDSSkgPyAiUENJIEJJT1MiIDogIkVJU0EgQ05GRyIpKTsKKyAgICB9CisgICAgCisgICAgaWYgKGRlNHg1X2RlYnVnICYgREVCVUdfVkVSU0lPTikgeworCXByaW50ayh2ZXJzaW9uKTsKKyAgICB9CisgICAgCisgICAgLyogVGhlIERFNFg1LXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOworICAgIFNFVF9ORVRERVZfREVWKGRldiwgZ2VuZGV2KTsKKyAgICBkZXYtPm9wZW4gPSAmZGU0eDVfb3BlbjsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZkZTR4NV9xdWV1ZV9wa3Q7CisgICAgZGV2LT5zdG9wID0gJmRlNHg1X2Nsb3NlOworICAgIGRldi0+Z2V0X3N0YXRzID0gJmRlNHg1X2dldF9zdGF0czsKKyAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisgICAgZGV2LT5kb19pb2N0bCA9ICZkZTR4NV9pb2N0bDsKKyAgICAKKyAgICBkZXYtPm1lbV9zdGFydCA9IDA7CisgICAgCisgICAgLyogRmlsbCBpbiB0aGUgZ2VuZXJpYyBmaWVsZHMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisgICAgaWYgKChzdGF0dXMgPSByZWdpc3Rlcl9uZXRkZXYgKGRldikpKSB7CisJICAgIGRtYV9mcmVlX2NvaGVyZW50IChnZW5kZXYsIGxwLT5kbWFfc2l6ZSwKKwkJCSAgICAgICBscC0+cnhfcmluZywgbHAtPmRtYV9yaW5ncyk7CisJICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIAorICAgIC8qIExldCB0aGUgYWRhcHRlciBzbGVlcCB0byBzYXZlIHBvd2VyICovCisgICAgeWF3bihkZXYsIFNMRUVQKTsKKyAgICAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisMCitzdGF0aWMgaW50CitkZTR4NV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGksIHN0YXR1cyA9IDA7CisgICAgczMyIG9tcjsKKworICAgIC8qIEFsbG9jYXRlIHRoZSBSWCBidWZmZXJzICovCisgICAgZm9yIChpPTA7IGk8bHAtPnJ4UmluZ1NpemU7IGkrKykgeworCWlmIChkZTR4NV9hbGxvY19yeF9idWZmKGRldiwgaSwgMCkgPT0gTlVMTCkgeworCSAgICBkZTR4NV9mcmVlX3J4X2J1ZmZzKGRldik7CisJICAgIHJldHVybiAtRUFHQUlOOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICoqIFdha2UgdXAgdGhlIGFkYXB0ZXIKKyAgICAqLworICAgIHlhd24oZGV2LCBXQUtFVVApOworCisgICAgLyogCisgICAgKiogUmUtaW5pdGlhbGl6ZSB0aGUgREU0WDUuLi4gCisgICAgKi8KKyAgICBzdGF0dXMgPSBkZTR4NV9pbml0KGRldik7CisgICAgc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKyAgICBscC0+c3RhdGUgPSBPUEVOOworICAgIGRlNHg1X2RiZ19vcGVuKGRldik7CisgICAgCisgICAgaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAodm9pZCAqKWRlNHg1X2ludGVycnVwdCwgU0FfU0hJUlEsIAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPmFkYXB0ZXJfbmFtZSwgZGV2KSkgeworCXByaW50aygiZGU0eDVfb3BlbigpOiBSZXF1ZXN0ZWQgSVJRJWQgaXMgYnVzeSAtIGF0dGVtcGluZyBGQVNUL1NIQVJFLi4uIiwgZGV2LT5pcnEpOworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgZGU0eDVfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPmFkYXB0ZXJfbmFtZSwgZGV2KSkgeworCSAgICBwcmludGsoIlxuICAgICAgICAgICAgICBDYW5ub3QgZ2V0IElSUS0gcmVjb25maWd1cmUgeW91ciBoYXJkd2FyZS5cbiIpOworCSAgICBkaXNhYmxlX2FzdChkZXYpOworCSAgICBkZTR4NV9mcmVlX3J4X2J1ZmZzKGRldik7CisJICAgIGRlNHg1X2ZyZWVfdHhfYnVmZnMoZGV2KTsKKwkgICAgeWF3bihkZXYsIFNMRUVQKTsKKwkgICAgbHAtPnN0YXRlID0gQ0xPU0VEOworCSAgICByZXR1cm4gLUVBR0FJTjsKKwl9IGVsc2UgeworCSAgICBwcmludGsoIlxuICAgICAgICAgICAgICBTdWNjZWVkZWQsIGJ1dCB5b3Ugc2hvdWxkIHJlY29uZmlndXJlIHlvdXIgaGFyZHdhcmUgdG8gYXZvaWQgdGhpcy5cbiIpOworCSAgICBwcmludGsoIldBUk5JTkc6IHRoZXJlIG1heSBiZSBJUlEgcmVsYXRlZCBwcm9ibGVtcyBpbiBoZWF2aWx5IGxvYWRlZCBzeXN0ZW1zLlxuIik7CisJfQorICAgIH0KKworICAgIGxwLT5pbnRlcnJ1cHQgPSBVTk1BU0tfSU5URVJSVVBUUzsKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICAKKyAgICBTVEFSVF9ERTRYNTsKKwkKKyAgICBkZTR4NV9zZXR1cF9pbnRyKGRldik7CisgICAgCisgICAgaWYgKGRlNHg1X2RlYnVnICYgREVCVUdfT1BFTikgeworCXByaW50aygiXHRzdHM6ICAweCUwOHhcbiIsIGlubChERTRYNV9TVFMpKTsKKwlwcmludGsoIlx0Ym1yOiAgMHglMDh4XG4iLCBpbmwoREU0WDVfQk1SKSk7CisJcHJpbnRrKCJcdGltcjogIDB4JTA4eFxuIiwgaW5sKERFNFg1X0lNUikpOworCXByaW50aygiXHRvbXI6ICAweCUwOHhcbiIsIGlubChERTRYNV9PTVIpKTsKKwlwcmludGsoIlx0c2lzcjogMHglMDh4XG4iLCBpbmwoREU0WDVfU0lTUikpOworCXByaW50aygiXHRzaWNyOiAweCUwOHhcbiIsIGlubChERTRYNV9TSUNSKSk7CisJcHJpbnRrKCJcdHN0cnI6IDB4JTA4eFxuIiwgaW5sKERFNFg1X1NUUlIpKTsKKwlwcmludGsoIlx0c2lncjogMHglMDh4XG4iLCBpbmwoREU0WDVfU0lHUikpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorKiogSW5pdGlhbGl6ZSB0aGUgREU0WDUgb3BlcmF0aW5nIGNvbmRpdGlvbnMuIE5COiBhIGNoaXAgcHJvYmxlbSB3aXRoIHRoZQorKiogREMyMTE0MCByZXF1aXJlcyB1c2luZyBwZXJmZWN0IGZpbHRlcmluZyBtb2RlIGZvciB0aGF0IGNoaXAuIFNpbmNlIEkgY2FuJ3QKKyoqIHNlZSB3aHkgSSdkIHdhbnQgPiAxNCBtdWx0aWNhc3QgYWRkcmVzc2VzLCBJIGhhdmUgY2hhbmdlZCBhbGwgY2hpcHMgdG8gdXNlCisqKiB0aGUgcGVyZmVjdCBmaWx0ZXJpbmcgbW9kZS4gS2VlcCB0aGUgRE1BIGJ1cnN0IGxlbmd0aCBhdCA4OiB0aGVyZSBzZWVtcworKiogdG8gYmUgZGF0YSBjb3JydXB0aW9uIHByb2JsZW1zIGlmIGl0IGlzIGxhcmdlciAoVURQIGVycm9ycyBzZWVuIGZyb20gYQorKiogdHRjcCBzb3VyY2UpLgorKi8KK3N0YXRpYyBpbnQKK2RlNHg1X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sgIAorICAgIC8qIExvY2sgb3V0IG90aGVyIHByb2Nlc3NlcyB3aGlsc3Qgc2V0dGluZyB1cCB0aGUgaGFyZHdhcmUgKi8KKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgCisgICAgZGU0eDVfc3dfcmVzZXQoZGV2KTsKKyAgICAKKyAgICAvKiBBdXRvY29uZmlndXJlIHRoZSBjb25uZWN0ZWQgcG9ydCAqLworICAgIGF1dG9jb25mX21lZGlhKGRldik7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RlNHg1X3N3X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGksIGosIHN0YXR1cyA9IDA7CisgICAgczMyIGJtciwgb21yOworICAgIAorICAgIC8qIFNlbGVjdCB0aGUgTUlJIG9yIFNSTCBwb3J0IG5vdyBhbmQgUkVTRVQgdGhlIE1BQyAqLworICAgIGlmICghbHAtPnVzZVNST00pIHsKKwlpZiAobHAtPnBoeVtscC0+YWN0aXZlXS5pZCAhPSAwKSB7CisJICAgIGxwLT5pbmZvYmxvY2tfY3NyNiA9IE9NUl9TRFAgfCBPTVJfUFMgfCBPTVJfSEJEOworCX0gZWxzZSB7CisJICAgIGxwLT5pbmZvYmxvY2tfY3NyNiA9IE9NUl9TRFAgfCBPTVJfVFRNOworCX0KKwlkZTR4NV9zd2l0Y2hfbWFjX3BvcnQoZGV2KTsKKyAgICB9CisKKyAgICAvKiAKKyAgICAqKiBTZXQgdGhlIHByb2dyYW1tYWJsZSBidXJzdCBsZW5ndGggdG8gOCBsb25nd29yZHMgZm9yIGFsbCB0aGUgREMyMTE0MAorICAgICoqIEZhc3Rlcm5ldCBjaGlwcyBhbmQgNCBsb25nd29yZHMgZm9yIGFsbCBvdGhlcnM6IERNQSBlcnJvcnMgcmVzdWx0CisgICAgKiogd2l0aG91dCB0aGVzZSB2YWx1ZXMuIENhY2hlIGFsaWduIDE2IGxvbmcuCisgICAgKi8KKyAgICBibXIgPSAobHAtPmNoaXBzZXQ9PURDMjExNDAgPyBQQkxfOCA6IFBCTF80KSB8IERFU0NfU0tJUF9MRU4gfCBERTRYNV9DQUNIRV9BTElHTjsKKyAgICBibXIgfD0gKChscC0+Y2hpcHNldCAmIH4weDAwZmYpPT1EQzIxMTR4ID8gQk1SX1JNTCA6IDApOworICAgIG91dGwoYm1yLCBERTRYNV9CTVIpOworCisgICAgb21yID0gaW5sKERFNFg1X09NUikgJiB+T01SX1BSOyAgICAgICAgICAgICAvKiBUdXJuIG9mZiBwcm9taXNjdW91cyBtb2RlICovCisgICAgaWYgKGxwLT5jaGlwc2V0ID09IERDMjExNDApIHsKKwlvbXIgfD0gKE9NUl9TRFAgfCBPTVJfU0IpOworICAgIH0KKyAgICBscC0+c2V0dXBfZiA9IFBFUkZFQ1Q7CisgICAgb3V0bChscC0+ZG1hX3JpbmdzLCBERTRYNV9SUkJBKTsKKyAgICBvdXRsKGxwLT5kbWFfcmluZ3MgKyBOVU1fUlhfREVTQyAqIHNpemVvZihzdHJ1Y3QgZGU0eDVfZGVzYyksCisJIERFNFg1X1RSQkEpOworICAgIAorICAgIGxwLT5yeF9uZXcgPSBscC0+cnhfb2xkID0gMDsKKyAgICBscC0+dHhfbmV3ID0gbHAtPnR4X29sZCA9IDA7CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IGxwLT5yeFJpbmdTaXplOyBpKyspIHsKKwlscC0+cnhfcmluZ1tpXS5zdGF0dXMgPSBjcHVfdG9fbGUzMihSX09XTik7CisgICAgfQorICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBscC0+dHhSaW5nU2l6ZTsgaSsrKSB7CisJbHAtPnR4X3JpbmdbaV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoMCk7CisgICAgfQorICAgIAorICAgIGJhcnJpZXIoKTsKKworICAgIC8qIEJ1aWxkIHRoZSBzZXR1cCBmcmFtZSBkZXBlbmRpbmcgb24gZmlsdGVyaW5nIG1vZGUgKi8KKyAgICBTZXRNdWx0aWNhc3RGaWx0ZXIoZGV2KTsKKyAgICAKKyAgICBsb2FkX3BhY2tldChkZXYsIGxwLT5zZXR1cF9mcmFtZSwgUEVSRkVDVF9GfFREX1NFVHxTRVRVUF9GUkFNRV9MRU4sIChzdHJ1Y3Qgc2tfYnVmZiAqKTEpOworICAgIG91dGwob21yfE9NUl9TVCwgREU0WDVfT01SKTsKKworICAgIC8qIFBvbGwgZm9yIHNldHVwIGZyYW1lIGNvbXBsZXRpb24gKGFkYXB0ZXIgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgbm93KSAqLworCisgICAgZm9yIChqPTAsIGk9MDsoaTw1MDApICYmIChqPT0wKTtpKyspIHsgICAgICAgLyogVXB0byA1MDBtcyBkZWxheSAqLworCW1kZWxheSgxKTsKKwlpZiAoKHMzMilsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tscC0+dHhfbmV3XS5zdGF0dXMpID49IDApIGo9MTsKKyAgICB9CisgICAgb3V0bChvbXIsIERFNFg1X09NUik7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcCBldmVyeXRoaW5nISAqLworCisgICAgaWYgKGogPT0gMCkgeworCXByaW50aygiJXM6IFNldHVwIGZyYW1lIHRpbWVkIG91dCwgc3RhdHVzICUwOHhcbiIsIGRldi0+bmFtZSwgCisJICAgICAgIGlubChERTRYNV9TVFMpKTsKKwlzdGF0dXMgPSAtRUlPOworICAgIH0KKyAgICAKKyAgICBscC0+dHhfbmV3ID0gKCsrbHAtPnR4X25ldykgJSBscC0+dHhSaW5nU2l6ZTsKKyAgICBscC0+dHhfb2xkID0gbHAtPnR4X25ldzsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIAorKiogV3JpdGVzIGEgc29ja2V0IGJ1ZmZlciBhZGRyZXNzIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSB0cmFuc21pdCBkZXNjcmlwdG9yLgorKi8KK3N0YXRpYyBpbnQKK2RlNHg1X3F1ZXVlX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBzdGF0dXMgPSAwOworICAgIHVfbG9uZyBmbGFncyA9IDA7CisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgaWYgKGxwLT50eF9lbmFibGUgPT0gTk8pIHsgICAgICAgICAgICAgICAgICAgLyogQ2Fubm90IHNlbmQgZm9yIG5vdyAqLworCXJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKgorICAgICoqIENsZWFuIG91dCB0aGUgVFggcmluZyBhc3luY2hyb25vdXNseSB0byBpbnRlcnJ1cHRzIC0gc29tZXRpbWVzIHRoZQorICAgICoqIGludGVycnVwdHMgYXJlIGxvc3QgYnkgZGVsYXllZCBkZXNjcmlwdG9yIHN0YXR1cyB1cGRhdGVzIHJlbGF0aXZlIHRvCisgICAgKiogdGhlIGlycSBhc3NlcnRpb24sIGVzcGVjaWFsbHkgd2l0aCBhIGJ1c3kgUENJIGJ1cy4KKyAgICAqLworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIGRlNHg1X3R4KGRldik7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIC8qIFRlc3QgaWYgY2FjaGUgaXMgYWxyZWFkeSBsb2NrZWQgLSByZXF1ZXVlIHNrYiBpZiBzbyAqLworICAgIGlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkICopJmxwLT5jYWNoZS5sb2NrKSAmJiAhbHAtPmludGVycnVwdCkgCisJcmV0dXJuIC0xOworCisgICAgLyogVHJhbnNtaXQgZGVzY3JpcHRvciByaW5nIGZ1bGwgb3Igc3RhbGUgc2tiICovCisgICAgaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSB8fCAodV9sb25nKSBscC0+dHhfc2tiW2xwLT50eF9uZXddID4gMSkgeworCWlmIChscC0+aW50ZXJydXB0KSB7CisJICAgIGRlNHg1X3B1dGJfY2FjaGUoZGV2LCBza2IpOyAgICAgICAgICAvKiBSZXF1ZXVlIHRoZSBidWZmZXIgKi8KKwl9IGVsc2UgeworCSAgICBkZTR4NV9wdXRfY2FjaGUoZGV2LCBza2IpOworCX0KKwlpZiAoZGU0eDVfZGVidWcgJiBERUJVR19UWCkgeworCSAgICBwcmludGsoIiVzOiB0cmFuc21pdCBidXN5LCBsb3N0IG1lZGlhIG9yIHN0YWxlIHNrYiBmb3VuZDpcbiAgU1RTOiUwOHhcbiAgdGJ1c3k6JWRcbiAgSU1SOiUwOHhcbiAgT01SOiUwOHhcbiBTdGFsZSBza2I6ICVzXG4iLGRldi0+bmFtZSwgaW5sKERFNFg1X1NUUyksIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSwgaW5sKERFNFg1X0lNUiksIGlubChERTRYNV9PTVIpLCAoKHVfbG9uZykgbHAtPnR4X3NrYltscC0+dHhfbmV3XSA+IDEpID8gIllFUyIgOiAiTk8iKTsKKwl9CisgICAgfSBlbHNlIGlmIChza2ItPmxlbiA+IDApIHsKKwkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgc3R1ZmYgcXVldWVkIGxvY2FsbHksIHVzZSB0aGF0IGZpcnN0ICovCisJaWYgKGxwLT5jYWNoZS5za2IgJiYgIWxwLT5pbnRlcnJ1cHQpIHsKKwkgICAgZGU0eDVfcHV0X2NhY2hlKGRldiwgc2tiKTsKKwkgICAgc2tiID0gZGU0eDVfZ2V0X2NhY2hlKGRldik7CisJfQorCisJd2hpbGUgKHNrYiAmJiAhbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJICAgICAgICh1X2xvbmcpIGxwLT50eF9za2JbbHAtPnR4X25ld10gPD0gMSkgeworCSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCSAgICBsb2FkX3BhY2tldChkZXYsIHNrYi0+ZGF0YSwgVERfSUMgfCBURF9MUyB8IFREX0ZTIHwgc2tiLT5sZW4sIHNrYik7CisgCSAgICBscC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJICAgIG91dGwoUE9MTF9ERU1BTkQsIERFNFg1X1RQRCk7LyogU3RhcnQgdGhlIFRYICovCisJCQorCSAgICBscC0+dHhfbmV3ID0gKCsrbHAtPnR4X25ldykgJSBscC0+dHhSaW5nU2l6ZTsKKwkgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCSAgICAKKwkgICAgaWYgKFRYX0JVRkZTX0FWQUlMKSB7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7ICAgICAgICAgLyogQW5vdGhlciBwa3QgbWF5IGJlIHF1ZXVlZCAqLworCSAgICB9CisJICAgIHNrYiA9IGRlNHg1X2dldF9jYWNoZShkZXYpOworCSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCX0KKwlpZiAoc2tiKSBkZTR4NV9wdXRiX2NhY2hlKGRldiwgc2tiKTsKKyAgICB9CisgICAgCisgICAgbHAtPmNhY2hlLmxvY2sgPSAwOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyoqIFRoZSBERTRYNSBpbnRlcnJ1cHQgaGFuZGxlci4gCisqKiAKKyoqIEkvTyBSZWFkL1dyaXRlcyB0aHJvdWdoIGludGVybWVkaWF0ZSBQQ0kgYnJpZGdlcyBhcmUgbmV2ZXIgJ3Bvc3RlZCcsCisqKiBzbyB0aGF0IHRoZSBhc3NlcnRlZCBpbnRlcnJ1cHQgYWx3YXlzIGhhcyBzb21lIHJlYWwgZGF0YSB0byB3b3JrIHdpdGggLQorKiogaWYgdGhlc2UgSS9PIGFjY2Vzc2VzIGFyZSBldmVyIGNoYW5nZWQgdG8gbWVtb3J5IGFjY2Vzc2VzLCBlbnN1cmUgdGhlCisqKiBTVFMgd3JpdGUgaXMgcmVhZCBpbW1lZGlhdGVseSB0byBjb21wbGV0ZSB0aGUgdHJhbnNhY3Rpb24gaWYgdGhlIGFkYXB0ZXIKKyoqIGlzIG5vdCBvbiBidXMgMC4gTG9zdCBpbnRlcnJ1cHRzIGNhbiBzdGlsbCBvY2N1ciB3aGVuIHRoZSBQQ0kgYnVzIGxvYWQKKyoqIGlzIGhpZ2ggYW5kIGRlc2NyaXB0b3Igc3RhdHVzIGJpdHMgY2Fubm90IGJlIHNldCBiZWZvcmUgdGhlIGFzc29jaWF0ZWQKKyoqIGludGVycnVwdCBpcyBhc3NlcnRlZCBhbmQgdGhpcyByb3V0aW5lIGVudGVyZWQuCisqLworc3RhdGljIGlycXJldHVybl90CitkZTR4NV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscDsKKyAgICBzMzIgaW1yLCBvbXIsIHN0cywgbGltaXQ7CisgICAgdV9sb25nIGlvYmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDA7CisgICAgCisgICAgaWYgKGRldiA9PSBOVUxMKSB7CisJcHJpbnRrICgiZGU0eDVfaW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCXJldHVybiBJUlFfTk9ORTsKKyAgICB9CisgICAgbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHNwaW5fbG9jaygmbHAtPmxvY2spOworICAgIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCQorICAgIERJU0FCTEVfSVJRczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbnN1cmUgbm9uIHJlLWVudHJhbmN5ICovCisKKyAgICBpZiAodGVzdF9hbmRfc2V0X2JpdChNQVNLX0lOVEVSUlVQVFMsICh2b2lkKikgJmxwLT5pbnRlcnJ1cHQpKQorCXByaW50aygiJXM6IFJlLWVudGVyaW5nIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci5cbiIsIGRldi0+bmFtZSk7CisKKyAgICBzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCQorICAgIGZvciAobGltaXQ9MDsgbGltaXQ8ODsgbGltaXQrKykgeworCXN0cyA9IGlubChERTRYNV9TVFMpOyAgICAgICAgICAgIC8qIFJlYWQgSVJRIHN0YXR1cyAqLworCW91dGwoc3RzLCBERTRYNV9TVFMpOyAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBib2FyZCBpbnRlcnJ1cHRzICovCisJICAgIAorCWlmICghKHN0cyAmIGxwLT5pcnFfbWFzaykpIGJyZWFrOy8qIEFsbCBkb25lICovCisJaGFuZGxlZCA9IDE7CisJICAgIAorCWlmIChzdHMgJiAoU1RTX1JJIHwgU1RTX1JVKSkgICAgIC8qIFJ4IGludGVycnVwdCAocGFja2V0W3NdIGFycml2ZWQpICovCisJICBkZTR4NV9yeChkZXYpOworCSAgICAKKwlpZiAoc3RzICYgKFNUU19USSB8IFNUU19UVSkpICAgICAvKiBUeCBpbnRlcnJ1cHQgKHBhY2tldCBzZW50KSAqLworCSAgZGU0eDVfdHgoZGV2KTsgCisJICAgIAorCWlmIChzdHMgJiBTVFNfTE5GKSB7ICAgICAgICAgICAgIC8qIFRQIExpbmsgaGFzIGZhaWxlZCAqLworCSAgICBscC0+aXJxX21hc2sgJj0gfklNUl9MRk07CisJfQorCSAgICAKKwlpZiAoc3RzICYgU1RTX1VORikgeyAgICAgICAgICAgICAvKiBUcmFuc21pdCB1bmRlcnJ1biAqLworCSAgICBkZTR4NV90eHVyKGRldik7CisJfQorCSAgICAKKwlpZiAoc3RzICYgU1RTX1NFKSB7ICAgICAgICAgICAgICAvKiBCdXMgRXJyb3IgKi8KKwkgICAgU1RPUF9ERTRYNTsKKwkgICAgcHJpbnRrKCIlczogRmF0YWwgYnVzIGVycm9yIG9jY3VycmVkLCBzdHM9JSM4eCwgZGV2aWNlIHN0b3BwZWQuXG4iLAorCQkgICBkZXYtPm5hbWUsIHN0cyk7CisJICAgIHNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJICAgIHJldHVybiBJUlFfSEFORExFRDsKKwl9CisgICAgfQorCisgICAgLyogTG9hZCB0aGUgVFggcmluZyB3aXRoIGFueSBsb2NhbGx5IHN0b3JlZCBwYWNrZXRzICovCisgICAgaWYgKCF0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkICopJmxwLT5jYWNoZS5sb2NrKSkgeworCXdoaWxlIChscC0+Y2FjaGUuc2tiICYmICFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYgbHAtPnR4X2VuYWJsZSkgeworCSAgICBkZTR4NV9xdWV1ZV9wa3QoZGU0eDVfZ2V0X2NhY2hlKGRldiksIGRldik7CisJfQorCWxwLT5jYWNoZS5sb2NrID0gMDsKKyAgICB9CisKKyAgICBscC0+aW50ZXJydXB0ID0gVU5NQVNLX0lOVEVSUlVQVFM7CisgICAgRU5BQkxFX0lSUXM7CisgICAgc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKyAgICAKKyAgICByZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIGludAorZGU0eDVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgZW50cnk7CisgICAgczMyIHN0YXR1czsKKyAgICAKKyAgICBmb3IgKGVudHJ5PWxwLT5yeF9uZXc7IChzMzIpbGUzMl90b19jcHUobHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyk+PTA7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5PWxwLT5yeF9uZXcpIHsKKwlzdGF0dXMgPSAoczMyKWxlMzJfdG9fY3B1KGxwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCQorCWlmIChscC0+cnhfb3ZmKSB7CisJICAgIGlmIChpbmwoREU0WDVfTUZDKSAmIE1GQ19GT0NNKSB7CisJCWRlNHg1X3J4X292ZmMoZGV2KTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKwlpZiAoc3RhdHVzICYgUkRfRlMpIHsgICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHRoZSBzdGFydCBvZiBmcmFtZSAqLworCSAgICBscC0+cnhfb2xkID0gZW50cnk7CisJfQorCQorCWlmIChzdGF0dXMgJiBSRF9MUykgeyAgICAgICAgICAgICAgICAgLyogVmFsaWQgZnJhbWUgc3RhdHVzICovCisJICAgIGlmIChscC0+dHhfZW5hYmxlKSBscC0+bGlua09LKys7CisJICAgIGlmIChzdGF0dXMgJiBSRF9FUykgewkgICAgICAvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCisJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3Igc3RhdHMuICovCisJCWlmIChzdGF0dXMgJiAoUkRfUkYgfCBSRF9UTCkpIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJEX0NFKSAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJEX09GKSAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBSRF9UTCkgICAgICAgICAgIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBSRF9SRikgICAgICAgICAgIGxwLT5wa3RTdGF0cy5yeF9ydW50X2ZyYW1lcysrOworCQlpZiAoc3RhdHVzICYgUkRfQ1MpICAgICAgICAgICBscC0+cGt0U3RhdHMucnhfY29sbGlzaW9uKys7CisJCWlmIChzdGF0dXMgJiBSRF9EQikgICAgICAgICAgIGxwLT5wa3RTdGF0cy5yeF9kcmliYmxlKys7CisJCWlmIChzdGF0dXMgJiBSRF9PRikgICAgICAgICAgIGxwLT5wa3RTdGF0cy5yeF9vdmVyZmxvdysrOworCSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQSB2YWxpZCBmcmFtZSByZWNlaXZlZCAqLworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlzaG9ydCBwa3RfbGVuID0gKHNob3J0KShsZTMyX3RvX2NwdShscC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzKQorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gMTYpIC0gNDsKKwkJCisJCWlmICgoc2tiID0gZGU0eDVfYWxsb2NfcnhfYnVmZihkZXYsIGVudHJ5LCBwa3RfbGVuKSkgPT0gTlVMTCkgeworCQkgICAgcHJpbnRrKCIlczogSW5zdWZmaWNpZW50IG1lbW9yeTsgbnVraW5nIHBhY2tldC5cbiIsIAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUpOworCQkgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJfSBlbHNlIHsKKwkJICAgIGRlNHg1X2RiZ19yeChza2IsIHBrdF9sZW4pOworCisJCSAgICAvKiBQdXNoIHVwIHRoZSBwcm90b2NvbCBzdGFjayAqLworCQkgICAgc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJICAgIGRlNHg1X2xvY2FsX3N0YXRzKGRldiwgc2tiLT5kYXRhLCBwa3RfbGVuKTsKKwkJICAgIG5ldGlmX3J4KHNrYik7CisJCSAgICAKKwkJICAgIC8qIFVwZGF0ZSBzdGF0cyAqLworCQkgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJICAgIGxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisgCQkgICAgbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0KKwkgICAgfQorCSAgICAKKwkgICAgLyogQ2hhbmdlIGJ1ZmZlciBvd25lcnNoaXAgZm9yIHRoaXMgZnJhbWUsIGJhY2sgdG8gdGhlIGFkYXB0ZXIgKi8KKwkgICAgZm9yICg7bHAtPnJ4X29sZCE9ZW50cnk7bHAtPnJ4X29sZD0oKytscC0+cnhfb2xkKSVscC0+cnhSaW5nU2l6ZSkgeworCQlscC0+cnhfcmluZ1tscC0+cnhfb2xkXS5zdGF0dXMgPSBjcHVfdG9fbGUzMihSX09XTik7CisJCWJhcnJpZXIoKTsKKwkgICAgfQorCSAgICBscC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoUl9PV04pOworCSAgICBiYXJyaWVyKCk7CisJfQorCQorCS8qCisJKiogVXBkYXRlIGVudHJ5IGluZm9ybWF0aW9uCisJKi8KKwlscC0+cnhfbmV3ID0gKCsrbHAtPnJ4X25ldykgJSBscC0+cnhSaW5nU2l6ZTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZGU0eDVfZnJlZV90eF9idWZmKHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCwgaW50IGVudHJ5KQoreworICAgIGRtYV91bm1hcF9zaW5nbGUobHAtPmdlbmRldiwgbGUzMl90b19jcHUobHAtPnR4X3JpbmdbZW50cnldLmJ1ZiksCisJCSAgICAgbGUzMl90b19jcHUobHAtPnR4X3JpbmdbZW50cnldLmRlczEpICYgVERfVEJTMSwKKwkJICAgICBETUFfVE9fREVWSUNFKTsKKyAgICBpZiAoKHVfbG9uZykgbHAtPnR4X3NrYltlbnRyeV0gPiAxKQorCWRldl9rZnJlZV9za2JfaXJxKGxwLT50eF9za2JbZW50cnldKTsKKyAgICBscC0+dHhfc2tiW2VudHJ5XSA9IE5VTEw7Cit9CisKKy8qCisqKiBCdWZmZXIgc2VudCAtIGNoZWNrIGZvciBUWCBidWZmZXIgZXJyb3JzLgorKi8KK3N0YXRpYyBpbnQKK2RlNHg1X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGVudHJ5OworICAgIHMzMiBzdGF0dXM7CisgICAgCisgICAgZm9yIChlbnRyeSA9IGxwLT50eF9vbGQ7IGVudHJ5ICE9IGxwLT50eF9uZXc7IGVudHJ5ID0gbHAtPnR4X29sZCkgeworCXN0YXR1cyA9IChzMzIpbGUzMl90b19jcHUobHAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyk7CisJaWYgKHN0YXR1cyA8IDApIHsgICAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgbm90IHNlbnQgeWV0ICovCisJICAgIGJyZWFrOworCX0gZWxzZSBpZiAoc3RhdHVzICE9IDB4N2ZmZmZmZmYpIHsgICAgLyogTm90IHNldHVwIGZyYW1lICovCisJICAgIGlmIChzdGF0dXMgJiBURF9FUykgeyAgICAgICAgICAgICAvKiBBbiBlcnJvciBoYXBwZW5lZCAqLworCQlscC0+c3RhdHMudHhfZXJyb3JzKys7IAorCQlpZiAoc3RhdHVzICYgVERfTkMpIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgVERfTEMpIGxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBURF9VRikgbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBURF9FQykgbHAtPnBrdFN0YXRzLmV4Y2Vzc2l2ZV9jb2xsaXNpb25zKys7CisJCWlmIChzdGF0dXMgJiBURF9ERSkgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJICAgIAorCQlpZiAoVFhfUEtUX1BFTkRJTkcpIHsKKwkJICAgIG91dGwoUE9MTF9ERU1BTkQsIERFNFg1X1RQRCk7LyogUmVzdGFydCBhIHN0YWxsZWQgVFggKi8KKwkJfQorCSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBQYWNrZXQgc2VudCAqLworCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQlpZiAobHAtPnR4X2VuYWJsZSkgbHAtPmxpbmtPSysrOworCSAgICB9CisJICAgIC8qIFVwZGF0ZSB0aGUgY29sbGlzaW9uIGNvdW50ZXIgKi8KKwkgICAgbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKChzdGF0dXMgJiBURF9FQykgPyAxNiA6IAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAoKHN0YXR1cyAmIFREX0NDKSA+PiAzKSk7CisKKwkgICAgLyogRnJlZSB0aGUgYnVmZmVyLiAqLworCSAgICBpZiAobHAtPnR4X3NrYltlbnRyeV0gIT0gTlVMTCkKKwkgICAgCWRlNHg1X2ZyZWVfdHhfYnVmZihscCwgZW50cnkpOworCX0KKwkKKwkvKiBVcGRhdGUgYWxsIHRoZSBwb2ludGVycyAqLworCWxwLT50eF9vbGQgPSAoKytscC0+dHhfb2xkKSAlIGxwLT50eFJpbmdTaXplOworICAgIH0KKworICAgIC8qIEFueSByZXNvdXJjZXMgYXZhaWxhYmxlPyAqLworICAgIGlmIChUWF9CVUZGU19BVkFJTCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwlpZiAobHAtPmludGVycnVwdCkKKwkgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCWVsc2UKKwkgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICB9CisJCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RlNHg1X2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IG5leHRfdGljayA9IERFNFg1X0FVVE9TRU5TRV9NUzsKKyAgICAKKyAgICBkaXNhYmxlX2FzdChkZXYpOworICAgIAorICAgIGlmIChscC0+dXNlU1JPTSkgeworCW5leHRfdGljayA9IHNyb21fYXV0b2NvbmYoZGV2KTsKKyAgICB9IGVsc2UgaWYgKGxwLT5jaGlwc2V0ID09IERDMjExNDApIHsKKwluZXh0X3RpY2sgPSBkYzIxMTQwbV9hdXRvY29uZihkZXYpOworICAgIH0gZWxzZSBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTA0MSkgeworCW5leHRfdGljayA9IGRjMjEwNDFfYXV0b2NvbmYoZGV2KTsKKyAgICB9IGVsc2UgaWYgKGxwLT5jaGlwc2V0ID09IERDMjEwNDApIHsKKwluZXh0X3RpY2sgPSBkYzIxMDQwX2F1dG9jb25mKGRldik7CisgICAgfQorICAgIGxwLT5saW5rT0sgPSAwOworICAgIGVuYWJsZV9hc3QoZGV2LCBuZXh0X3RpY2spOworICAgIAorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkZTR4NV90eHVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IG9tcjsKKworICAgIG9tciA9IGlubChERTRYNV9PTVIpOworICAgIGlmICghKG9tciAmIE9NUl9TRikgfHwgKGxwLT5jaGlwc2V0PT1EQzIxMDQxKSB8fCAobHAtPmNoaXBzZXQ9PURDMjEwNDApKSB7CisJb21yICY9IH4oT01SX1NUfE9NUl9TUik7CisJb3V0bChvbXIsIERFNFg1X09NUik7CisJd2hpbGUgKGlubChERTRYNV9TVFMpICYgU1RTX1RTKTsKKwlpZiAoKG9tciAmIE9NUl9UUikgPCBPTVJfVFIpIHsKKwkgICAgb21yICs9IDB4NDAwMDsKKwl9IGVsc2UgeworCSAgICBvbXIgfD0gT01SX1NGOworCX0KKwlvdXRsKG9tciB8IE9NUl9TVCB8IE9NUl9TUiwgREU0WDVfT01SKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgCitkZTR4NV9yeF9vdmZjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IG9tcjsKKworICAgIG9tciA9IGlubChERTRYNV9PTVIpOworICAgIG91dGwob21yICYgfk9NUl9TUiwgREU0WDVfT01SKTsKKyAgICB3aGlsZSAoaW5sKERFNFg1X1NUUykgJiBTVFNfUlMpOworCisgICAgZm9yICg7IChzMzIpbGUzMl90b19jcHUobHAtPnJ4X3JpbmdbbHAtPnJ4X25ld10uc3RhdHVzKT49MDspIHsKKwlscC0+cnhfcmluZ1tscC0+cnhfbmV3XS5zdGF0dXMgPSBjcHVfdG9fbGUzMihSX09XTik7CisJbHAtPnJ4X25ldyA9ICgrK2xwLT5yeF9uZXcgJSBscC0+cnhSaW5nU2l6ZSk7CisgICAgfQorCisgICAgb3V0bChvbXIsIERFNFg1X09NUik7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RlNHg1X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgczMyIGltciwgb21yOworICAgIAorICAgIGRpc2FibGVfYXN0KGRldik7CisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgCisgICAgaWYgKGRlNHg1X2RlYnVnICYgREVCVUdfQ0xPU0UpIHsKKwlwcmludGsoIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlOC44eC5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgaW5sKERFNFg1X1NUUykpOworICAgIH0KKyAgICAKKyAgICAvKiAKKyAgICAqKiBXZSBzdG9wIHRoZSBERTRYNSBoZXJlLi4uIG1hc2sgaW50ZXJydXB0cyBhbmQgc3RvcCBUWCAmIFJYCisgICAgKi8KKyAgICBESVNBQkxFX0lSUXM7CisgICAgU1RPUF9ERTRYNTsKKyAgICAKKyAgICAvKiBGcmVlIHRoZSBhc3NvY2lhdGVkIGlycSAqLworICAgIGZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworICAgIGxwLT5zdGF0ZSA9IENMT1NFRDsKKworICAgIC8qIEZyZWUgYW55IHNvY2tldCBidWZmZXJzICovCisgICAgZGU0eDVfZnJlZV9yeF9idWZmcyhkZXYpOworICAgIGRlNHg1X2ZyZWVfdHhfYnVmZnMoZGV2KTsKKyAgICAKKyAgICAvKiBQdXQgdGhlIGFkYXB0ZXIgdG8gc2xlZXAgdG8gc2F2ZSBwb3dlciAqLworICAgIHlhd24oZGV2LCBTTEVFUCk7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitkZTR4NV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKyAgICBscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IChpbnQpKGlubChERTRYNV9NRkMpICYgKE1GQ19PVkZMIHwgTUZDX0NOVFIpKTsKKyAgICAKKyAgICByZXR1cm4gJmxwLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X2xvY2FsX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IHBrdF9sZW4pCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaT0xOyBpPERFNFg1X1BLVF9TVEFUX1NaLTE7IGkrKykgeworICAgICAgICBpZiAocGt0X2xlbiA8IChpKkRFNFg1X1BLVF9CSU5fU1opKSB7CisJICAgIGxwLT5wa3RTdGF0cy5iaW5zW2ldKys7CisJICAgIGkgPSBERTRYNV9QS1RfU1RBVF9TWjsKKwl9CisgICAgfQorICAgIGlmIChidWZbMF0gJiAweDAxKSB7ICAgICAgICAgIC8qIE11bHRpY2FzdC9Ccm9hZGNhc3QgKi8KKyAgICAgICAgaWYgKCgqKHMzMiAqKSZidWZbMF0gPT0gLTEpICYmICgqKHMxNiAqKSZidWZbNF0gPT0gLTEpKSB7CisJICAgIGxwLT5wa3RTdGF0cy5icm9hZGNhc3QrKzsKKwl9IGVsc2UgeworCSAgICBscC0+cGt0U3RhdHMubXVsdGljYXN0Kys7CisJfQorICAgIH0gZWxzZSBpZiAoKCooczMyICopJmJ1ZlswXSA9PSAqKHMzMiAqKSZkZXYtPmRldl9hZGRyWzBdKSAmJgorCSAgICAgICAoKihzMTYgKikmYnVmWzRdID09ICooczE2ICopJmRldi0+ZGV2X2FkZHJbNF0pKSB7CisgICAgICAgIGxwLT5wa3RTdGF0cy51bmljYXN0Kys7CisgICAgfQorCQkKKyAgICBscC0+cGt0U3RhdHMuYmluc1swXSsrOyAgICAgICAvKiBEdXBsaWNhdGVzIHN0YXRzLnJ4X3BhY2tldHMgKi8KKyAgICBpZiAobHAtPnBrdFN0YXRzLmJpbnNbMF0gPT0gMCkgeyAvKiBSZXNldCBjb3VudGVycyAqLworICAgICAgICBtZW1zZXQoKGNoYXIgKikmbHAtPnBrdFN0YXRzLCAwLCBzaXplb2YobHAtPnBrdFN0YXRzKSk7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKgorKiogUmVtb3ZlcyB0aGUgVERfSUMgZmxhZyBmcm9tIHByZXZpb3VzIGRlc2NyaXB0b3IgdG8gaW1wcm92ZSBUWCBwZXJmb3JtYW5jZS4KKyoqIElmIHRoZSBmbGFnIGlzIGNoYW5nZWQgb24gYSBkZXNjcmlwdG9yIHRoYXQgaXMgYmVpbmcgcmVhZCBieSB0aGUgaGFyZHdhcmUsCisqKiBJIGFzc3VtZSBQQ0kgdHJhbnNhY3Rpb24gb3JkZXJpbmcgd2lsbCBtZWFuIHlvdSBhcmUgZWl0aGVyIHN1Y2Nlc3NmdWwgb3IKKyoqIGp1c3QgbWlzcyBhc3NlcnRpbmcgdGhlIGNoYW5nZSB0byB0aGUgaGFyZHdhcmUuIEFueXdheSB5b3UncmUgbWVzc2luZyB3aXRoCisqKiBhIGRlc2NyaXB0b3IgeW91IGRvbid0IG93biwgYnV0IHRoaXMgc2hvdWxkbid0IGtpbGwgdGhlIGNoaXAgcHJvdmlkZWQKKyoqIHRoZSBkZXNjcmlwdG9yIHJlZ2lzdGVyIGlzIHJlYWQgb25seSB0byB0aGUgaGFyZHdhcmUuCisqLworc3RhdGljIHZvaWQKK2xvYWRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgdTMyIGZsYWdzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGVudHJ5ID0gKGxwLT50eF9uZXcgPyBscC0+dHhfbmV3LTEgOiBscC0+dHhSaW5nU2l6ZS0xKTsKKyAgICBkbWFfYWRkcl90IGJ1Zl9kbWEgPSBkbWFfbWFwX3NpbmdsZShscC0+Z2VuZGV2LCBidWYsIGZsYWdzICYgVERfVEJTMSwgRE1BX1RPX0RFVklDRSk7CisKKyAgICBscC0+dHhfcmluZ1tscC0+dHhfbmV3XS5idWYgPSBjcHVfdG9fbGUzMihidWZfZG1hKTsKKyAgICBscC0+dHhfcmluZ1tscC0+dHhfbmV3XS5kZXMxICY9IGNwdV90b19sZTMyKFREX1RFUik7CisgICAgbHAtPnR4X3JpbmdbbHAtPnR4X25ld10uZGVzMSB8PSBjcHVfdG9fbGUzMihmbGFncyk7CisgICAgbHAtPnR4X3NrYltscC0+dHhfbmV3XSA9IHNrYjsKKyAgICBscC0+dHhfcmluZ1tlbnRyeV0uZGVzMSAmPSBjcHVfdG9fbGUzMih+VERfSUMpOworICAgIGJhcnJpZXIoKTsKKworICAgIGxwLT50eF9yaW5nW2xwLT50eF9uZXddLnN0YXR1cyA9IGNwdV90b19sZTMyKFRfT1dOKTsKKyAgICBiYXJyaWVyKCk7Cit9CisKKy8qCisqKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyovCitzdGF0aWMgdm9pZAorc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICAvKiBGaXJzdCwgZG91YmxlIGNoZWNrIHRoYXQgdGhlIGFkYXB0ZXIgaXMgb3BlbiAqLworICAgIGlmIChscC0+c3RhdGUgPT0gT1BFTikgeworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsgICAgICAgICAvKiBzZXQgcHJvbWlzY3VvdXMgbW9kZSAqLworCSAgICB1MzIgb21yOworCSAgICBvbXIgPSBpbmwoREU0WDVfT01SKTsKKwkgICAgb21yIHw9IE9NUl9QUjsKKwkgICAgb3V0bChvbXIsIERFNFg1X09NUik7CisJfSBlbHNlIHsgCisJICAgIFNldE11bHRpY2FzdEZpbHRlcihkZXYpOworCSAgICBsb2FkX3BhY2tldChkZXYsIGxwLT5zZXR1cF9mcmFtZSwgVERfSUMgfCBQRVJGRUNUX0YgfCBURF9TRVQgfCAKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUVVBfRlJBTUVfTEVOLCAoc3RydWN0IHNrX2J1ZmYgKikxKTsKKwkgICAgCisJICAgIGxwLT50eF9uZXcgPSAoKytscC0+dHhfbmV3KSAlIGxwLT50eFJpbmdTaXplOworCSAgICBvdXRsKFBPTExfREVNQU5ELCBERTRYNV9UUEQpOyAgICAgICAvKiBTdGFydCB0aGUgVFggKi8KKwkgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJfQorICAgIH0KK30KKworLyoKKyoqIENhbGN1bGF0ZSB0aGUgaGFzaCBjb2RlIGFuZCB1cGRhdGUgdGhlIGxvZ2ljYWwgYWRkcmVzcyBmaWx0ZXIKKyoqIGZyb20gYSBsaXN0IG9mIGV0aGVybmV0IG11bHRpY2FzdCBhZGRyZXNzZXMuCisqKiBMaXR0bGUgZW5kaWFuIGNyYyBvbmUgbGluZXIgZnJvbSBNYXR0IFRob21hcywgREVDLgorKi8KK3N0YXRpYyB2b2lkCitTZXRNdWx0aWNhc3RGaWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pPWRldi0+bWNfbGlzdDsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGksIGosIGJpdCwgYnl0ZTsKKyAgICB1MTYgaGFzaGNvZGU7CisgICAgdTMyIG9tciwgY3JjOworICAgIGNoYXIgKnBhOworICAgIHVuc2lnbmVkIGNoYXIgKmFkZHJzOworCisgICAgb21yID0gaW5sKERFNFg1X09NUik7CisgICAgb21yICY9IH4oT01SX1BSIHwgT01SX1BNKTsKKyAgICBwYSA9IGJ1aWxkX3NldHVwX2ZyYW1lKGRldiwgQUxMKTsgICAgICAgIC8qIEJ1aWxkIHRoZSBiYXNpYyBmcmFtZSAqLworICAgIAorICAgIGlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwgKGRldi0+bWNfY291bnQgPiAxNCkpIHsKKwlvbXIgfD0gT01SX1BNOyAgICAgICAgICAgICAgICAgICAgICAgLyogUGFzcyBhbGwgbXVsdGljYXN0cyAqLworICAgIH0gZWxzZSBpZiAobHAtPnNldHVwX2YgPT0gSEFTSF9QRVJGKSB7ICAgLyogSGFzaCBGaWx0ZXJpbmcgKi8KKwlmb3IgKGk9MDtpPGRldi0+bWNfY291bnQ7aSsrKSB7ICAgICAgLyogZm9yIGVhY2ggYWRkcmVzcyBpbiB0aGUgbGlzdCAqLworCSAgICBhZGRycz1kbWktPmRtaV9hZGRyOworCSAgICBkbWk9ZG1pLT5uZXh0OworCSAgICBpZiAoKCphZGRycyAmIDB4MDEpID09IDEpIHsgICAgICAvKiBtdWx0aWNhc3QgYWRkcmVzcz8gKi8gCisJCWNyYyA9IGV0aGVyX2NyY19sZShFVEhfQUxFTiwgYWRkcnMpOworCQloYXNoY29kZSA9IGNyYyAmIEhBU0hfQklUUzsgIC8qIGhhc2hjb2RlIGlzIDkgTFNiIG9mIENSQyAqLworCQkKKwkJYnl0ZSA9IGhhc2hjb2RlID4+IDM7ICAgICAgICAvKiBiaXRbMy04XSAtPiBieXRlIGluIGZpbHRlciAqLworCQliaXQgPSAxIDw8IChoYXNoY29kZSAmIDB4MDcpOy8qIGJpdFswLTJdIC0+IGJpdCBpbiBieXRlICovCisJCQorCQlieXRlIDw8PSAxOyAgICAgICAgICAgICAgICAgIC8qIGNhbGMgb2Zmc2V0IGludG8gc2V0dXAgZnJhbWUgKi8KKwkJaWYgKGJ5dGUgJiAweDAyKSB7CisJCSAgICBieXRlIC09IDE7CisJCX0KKwkJbHAtPnNldHVwX2ZyYW1lW2J5dGVdIHw9IGJpdDsKKwkgICAgfQorCX0KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlcmZlY3QgZmlsdGVyaW5nICovCisJZm9yIChqPTA7IGo8ZGV2LT5tY19jb3VudDsgaisrKSB7CisJICAgIGFkZHJzPWRtaS0+ZG1pX2FkZHI7CisJICAgIGRtaT1kbWktPm5leHQ7CisJICAgIGZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsgCisJCSoocGEgKyAoaSYxKSkgPSAqYWRkcnMrKzsKKwkJaWYgKGkgJiAweDAxKSBwYSArPSA0OworCSAgICB9CisJfQorICAgIH0KKyAgICBvdXRsKG9tciwgREU0WDVfT01SKTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKKyNpZmRlZiBDT05GSUdfRUlTQQorCitzdGF0aWMgdV9jaGFyIGRlNHg1X2lycVtdID0gRUlTQV9BTExPV0VEX0lSUV9MSVNUOworCitzdGF0aWMgaW50IF9faW5pdCBkZTR4NV9laXNhX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpnZW5kZXYpCit7CisJc3RydWN0IGVpc2FfZGV2aWNlICplZGV2OworCXVfbG9uZyBpb2Jhc2U7CisJdV9jaGFyIGlycSwgcmVndmFsOworCXVfc2hvcnQgdmVuZG9yOworCXUzMiBjZmlkOworCWludCBzdGF0dXMsIGRldmljZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZTR4NV9wcml2YXRlICpscDsKKworCWVkZXYgPSB0b19laXNhX2RldmljZSAoZ2VuZGV2KTsKKwlpb2Jhc2UgPSBlZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uIChpb2Jhc2UsIERFNFg1X0VJU0FfVE9UQUxfU0laRSwgImRlNHg1IikpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uIChpb2Jhc2UgKyBERTRYNV9FSVNBX0lPX1BPUlRTLAorCQkJICAgICBERTRYNV9FSVNBX1RPVEFMX1NJWkUsICJkZTR4NSIpKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byByZWxlYXNlX3JlZ18xOworCX0KKwkKKwlpZiAoIShkZXYgPSBhbGxvY19ldGhlcmRldiAoc2l6ZW9mIChzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSkpKSkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIHJlbGVhc2VfcmVnXzI7CisJfQorCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwljZmlkID0gKHUzMikgaW5sKFBDSV9DRklEKTsKKwlscC0+Y2ZydiA9ICh1X3Nob3J0KSBpbmwoUENJX0NGUlYpOworCWRldmljZSA9IChjZmlkID4+IDgpICYgMHgwMGZmZmYwMDsKKwl2ZW5kb3IgPSAodV9zaG9ydCkgY2ZpZDsKKwkgICAgCisJLyogUmVhZCB0aGUgRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAqLworCXJlZ3ZhbCA9IGluYihFSVNBX1JFRzApICYgKEVSMF9JTlRMIHwgRVIwX0lOVFQpOworI2lmZGVmIENPTkZJR19BTFBIQQorCS8qIExvb2tzIGxpa2UgdGhlIEplbnNlbiBmaXJtd2FyZSAocmV2IDIuMikgZG9lc24ndCByZWFsbHkKKwkgKiBjYXJlIGFib3V0IHRoZSBFSVNBIGNvbmZpZ3VyYXRpb24sIGFuZCB0aHVzIGRvZXNuJ3QKKwkgKiBjb25maWd1cmUgdGhlIFBMWCBicmlkZ2UgcHJvcGVybHkuIE9oIHdlbGwuLi4gU2ltcGx5IG1pbWljCisJICogdGhlIEVJU0EgY29uZmlnIGZpbGUgdG8gc29ydCBpdCBvdXQuICovCisJCisJLyogRUlTQSBSRUcxOiBBc3NlcnQgRGVjQ2hpcCAyMTA0MCBIVyBSZXNldCAqLworCW91dGIgKEVSMV9JQU0gfCAxLCBFSVNBX1JFRzEpOworCW1kZWxheSAoMSk7CisKKyAgICAgICAgLyogRUlTQSBSRUcxOiBEZWFzc2VydCBEZWNDaGlwIDIxMDQwIEhXIFJlc2V0ICovCisJb3V0YiAoRVIxX0lBTSwgRUlTQV9SRUcxKTsKKwltZGVsYXkgKDEpOworCisJLyogRUlTQSBSRUczOiBSL1cgQnVyc3QgVHJhbnNmZXIgRW5hYmxlICovCisJb3V0YiAoRVIzX0JXRSB8IEVSM19CUkUsIEVJU0FfUkVHMyk7CisJCisJLyogMzJfYml0IHNsYXZlL21hc3RlciwgUHJlZW1wdCBUaW1lPTIzIGJjbGtzLCBVbmxhdGNoZWQgSW50ZXJydXB0ICovCisJb3V0YiAoRVIwX0JTVyB8IEVSMF9CTVcgfCBFUjBfRVBUIHwgcmVndmFsLCBFSVNBX1JFRzApOworI2VuZGlmCisJaXJxID0gZGU0eDVfaXJxWyhyZWd2YWwgPj4gMSkgJiAweDAzXTsKKwkKKwlpZiAoaXNfREMyMTE0eCkgeworCSAgICBkZXZpY2UgPSAoKGxwLT5jZnJ2ICYgQ0ZSVl9STikgPCBEQzIxMTR4X0JSSyA/IERDMjExNDIgOiBEQzIxMTQzKTsKKwl9CisJbHAtPmNoaXBzZXQgPSBkZXZpY2U7CisJbHAtPmJ1cyA9IEVJU0E7CisKKwkvKiBXcml0ZSB0aGUgUENJIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzICovCisJb3V0bChQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01BU1RFUiwgUENJX0NGQ1MpOworCW91dGwoMHgwMDAwNjAwMCwgUENJX0NGTFQpOworCW91dGwoaW9iYXNlLCBQQ0lfQ0JJTyk7CisJICAgIAorCURldmljZVByZXNlbnQoZGV2LCBFSVNBX0FQUk9NKTsKKworCWRldi0+aXJxID0gaXJxOworCisJaWYgKCEoc3RhdHVzID0gZGU0eDVfaHdfaW5pdCAoZGV2LCBpb2Jhc2UsIGdlbmRldikpKSB7CisJCXJldHVybiAwOworCX0KKworCWZyZWVfbmV0ZGV2IChkZXYpOworIHJlbGVhc2VfcmVnXzI6CisJcmVsZWFzZV9yZWdpb24gKGlvYmFzZSArIERFNFg1X0VJU0FfSU9fUE9SVFMsIERFNFg1X0VJU0FfVE9UQUxfU0laRSk7CisgcmVsZWFzZV9yZWdfMToKKwlyZWxlYXNlX3JlZ2lvbiAoaW9iYXNlLCBERTRYNV9FSVNBX1RPVEFMX1NJWkUpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZGU0eDVfZWlzYV9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXVfbG9uZyBpb2Jhc2U7CisKKwlkZXYgPSBkZXZpY2UtPmRyaXZlcl9kYXRhOworCWlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCQorCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCWZyZWVfbmV0ZGV2IChkZXYpOworCXJlbGVhc2VfcmVnaW9uIChpb2Jhc2UgKyBERTRYNV9FSVNBX0lPX1BPUlRTLCBERTRYNV9FSVNBX1RPVEFMX1NJWkUpOworCXJlbGVhc2VfcmVnaW9uIChpb2Jhc2UsIERFNFg1X0VJU0FfVE9UQUxfU0laRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCBkZTR4NV9laXNhX2lkc1tdID0geworICAgICAgICB7ICJERUM0MjUwIiwgMCB9LAkvKiAwIGlzIHRoZSBib2FyZCBuYW1lIGluZGV4Li4uICovCisgICAgICAgIHsgIiIgfQorfTsKKworc3RhdGljIHN0cnVjdCBlaXNhX2RyaXZlciBkZTR4NV9laXNhX2RyaXZlciA9IHsKKyAgICAgICAgLmlkX3RhYmxlID0gZGU0eDVfZWlzYV9pZHMsCisgICAgICAgIC5kcml2ZXIgICA9IHsKKyAgICAgICAgICAgICAgICAubmFtZSAgICA9ICJkZTR4NSIsCisgICAgICAgICAgICAgICAgLnByb2JlICAgPSBkZTR4NV9laXNhX3Byb2JlLAorICAgICAgICAgICAgICAgIC5yZW1vdmUgID0gX19kZXZleGl0X3AgKGRlNHg1X2Vpc2FfcmVtb3ZlKSwKKyAgICAgICAgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZWlzYSwgZGU0eDVfZWlzYV9pZHMpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCisKKy8qCisqKiBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBjdXJyZW50IGJ1cyAod2hpY2ggaXMgPjApIGZvciBhIERFQ2NoaXAgd2l0aCBhbgorKiogU1JPTSwgc28gdGhhdCBpbiBtdWx0aXBvcnQgY2FyZHMgdGhhdCBoYXZlIG9uZSBTUk9NIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIAorKiogREVDY2hpcHMsIHdlIGNhbiBmaW5kIHRoZSBiYXNlIFNST00gaXJyZXNwZWN0aXZlIG9mIHRoZSBCSU9TIHNjYW4gZGlyZWN0aW9uLgorKiogRm9yIHNpbmdsZSBwb3J0IGNhcmRzIHRoaXMgaXMgYSB0aW1lIHdhc3Rlci4uLgorKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCAKK3Nyb21fc2VhcmNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworICAgIHVfY2hhciBwYjsKKyAgICB1X3Nob3J0IHZlbmRvciwgc3RhdHVzOworICAgIHVfaW50IGlycSA9IDAsIGRldmljZTsKKyAgICB1X2xvbmcgaW9iYXNlID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB1cHBlciAzMiBiaXRzIGluIEFscGhhcyAqLworICAgIGludCBpLCBqLCBjZnJ2OworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgc3RydWN0IGxpc3RfaGVhZCAqd2FsayA9ICZwZGV2LT5idXNfbGlzdDsKKworICAgIGZvciAod2FsayA9IHdhbGstPm5leHQ7IHdhbGsgIT0gJnBkZXYtPmJ1c19saXN0OyB3YWxrID0gd2Fsay0+bmV4dCkgeworCXN0cnVjdCBwY2lfZGV2ICp0aGlzX2RldiA9IHBjaV9kZXZfYih3YWxrKTsKKworCS8qIFNraXAgdGhlIHBjaV9idXMgbGlzdCBlbnRyeSAqLworCWlmIChsaXN0X2VudHJ5KHdhbGssIHN0cnVjdCBwY2lfYnVzLCBkZXZpY2VzKSA9PSBwZGV2LT5idXMpIGNvbnRpbnVlOworCisJdmVuZG9yID0gdGhpc19kZXYtPnZlbmRvcjsKKwlkZXZpY2UgPSB0aGlzX2Rldi0+ZGV2aWNlIDw8IDg7CisJaWYgKCEoaXNfREMyMTA0MCB8fCBpc19EQzIxMDQxIHx8IGlzX0RDMjExNDAgfHwgaXNfREMyMTE0eCkpIGNvbnRpbnVlOworCisJLyogR2V0IHRoZSBjaGlwIGNvbmZpZ3VyYXRpb24gcmV2aXNpb24gcmVnaXN0ZXIgKi8KKwlwYiA9IHRoaXNfZGV2LT5idXMtPm51bWJlcjsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodGhpc19kZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmNmcnYpOworCisJLyogU2V0IHRoZSBkZXZpY2UgbnVtYmVyIGluZm9ybWF0aW9uICovCisJbHAtPmRldmljZSA9IFBDSV9TTE9UKHRoaXNfZGV2LT5kZXZmbik7CisJbHAtPmJ1c19udW0gPSBwYjsKKwkgICAgCisJLyogU2V0IHRoZSBjaGlwc2V0IGluZm9ybWF0aW9uICovCisJaWYgKGlzX0RDMjExNHgpIHsKKwkgICAgZGV2aWNlID0gKChjZnJ2ICYgQ0ZSVl9STikgPCBEQzIxMTR4X0JSSyA/IERDMjExNDIgOiBEQzIxMTQzKTsKKwl9CisJbHAtPmNoaXBzZXQgPSBkZXZpY2U7CisKKwkvKiBHZXQgdGhlIGJvYXJkIEkvTyBhZGRyZXNzICg2NCBiaXRzIG9uIHNwYXJjNjQpICovCisJaW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHRoaXNfZGV2LCAwKTsKKworCS8qIEZldGNoIHRoZSBJUlEgdG8gYmUgdXNlZCAqLworCWlycSA9IHRoaXNfZGV2LT5pcnE7CisJaWYgKChpcnEgPT0gMCkgfHwgKGlycSA9PSAweGZmKSB8fCAoKGludClpcnEgPT0gLTEpKSBjb250aW51ZTsKKwkgICAgCisJLyogQ2hlY2sgaWYgSS9PIGFjY2Vzc2VzIGFyZSBlbmFibGVkICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQodGhpc19kZXYsIFBDSV9DT01NQU5ELCAmc3RhdHVzKTsKKwlpZiAoIShzdGF0dXMgJiBQQ0lfQ09NTUFORF9JTykpIGNvbnRpbnVlOworCisJLyogU2VhcmNoIGZvciBhIHZhbGlkIFNST00gYXR0YWNoZWQgdG8gdGhpcyBERUNjaGlwICovCisJRGV2aWNlUHJlc2VudChkZXYsIERFNFg1X0FQUk9NKTsKKwlmb3IgKGo9MCwgaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKKwkgICAgaiArPSAodV9jaGFyKSAqKCh1X2NoYXIgKikmbHAtPnNyb20gKyBTUk9NX0hXQUREICsgaSk7CisJfQorCWlmICgoaiAhPSAwKSAmJiAoaiAhPSAweDVmYSkpIHsKKwkgICAgbGFzdC5jaGlwc2V0ID0gZGV2aWNlOworCSAgICBsYXN0LmJ1cyA9IHBiOworCSAgICBsYXN0LmlycSA9IGlycTsKKwkgICAgZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeworCQlsYXN0LmFkZHJbaV0gPSAodV9jaGFyKSooKHVfY2hhciAqKSZscC0+c3JvbSArIFNST01fSFdBREQgKyBpKTsKKwkgICAgfQorCSAgICByZXR1cm47CisJfQorICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoKKyoqIFBDSSBidXMgSS9PIGRldmljZSBwcm9iZQorKiogTkI6IFBDSSBJL08gYWNjZXNzZXMgYW5kIEJ1cyBNYXN0ZXJpbmcgYXJlIGVuYWJsZWQgYnkgdGhlIFBDSSBCSU9TLCBub3QKKyoqIHRoZSBkcml2ZXIuIFNvbWUgUENJIEJJT1MncywgcHJlIFYyLjEsIG5lZWQgdGhlIHNsb3QgKyBmZWF0dXJlcyB0byBiZQorKiogZW5hYmxlZCBieSB0aGUgdXNlciBmaXJzdCBpbiB0aGUgc2V0IHVwIHV0aWxpdHkuIEhlbmNlIHdlIGp1c3QgY2hlY2sgZm9yCisqKiBlbmFibGVkIGZlYXR1cmVzIGFuZCBzaWxlbnRseSBpZ25vcmUgdGhlIGNhcmQgaWYgdGhleSdyZSBub3QuCisqKgorKiogU1RPUCBQUkVTUzogU29tZSBCSU9TJ3MgX19yZXF1aXJlX18gdGhlIGRyaXZlciB0byBlbmFibGUgdGhlIGJ1cyBtYXN0ZXJpbmcKKyoqIGJpdC4gSGVyZSwgY2hlY2sgZm9yIEkvTyBhY2Nlc3NlcyBhbmQgdGhlbiBzZXQgQk0uIElmIHlvdSBwdXQgdGhlIGNhcmQgaW4KKyoqIGEgbm9uIEJNIHNsb3QsIHlvdSdyZSBvbiB5b3VyIG93biAoYW5kIGNvbXBsYWluIHRvIHRoZSBQQyB2ZW5kb3IgdGhhdCB5b3VyCisqKiBQQyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIFBDSSBzdGFuZGFyZCkhCisqKgorKiogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNvbXBhdGlibGUgd2l0aCB0aGUgKmxhdGVzdCogMi4xLngga2VybmVscy4gRm9yIDIuMC54CisqKiBrZXJuZWxzIHVzZSB0aGUgVjAuNTM1W25dIGRyaXZlcnMuCisqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkZTR4NV9wY2lfcHJvYmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJdV9jaGFyIHBiLCBwYnVzID0gMCwgZGV2X251bSwgZG51bSA9IDAsIHRpbWVyOworCXVfc2hvcnQgdmVuZG9yLCBzdGF0dXM7CisJdV9pbnQgaXJxID0gMCwgZGV2aWNlOworCXVfbG9uZyBpb2Jhc2UgPSAwOwkvKiBDbGVhciB1cHBlciAzMiBiaXRzIGluIEFscGhhcyAqLworCWludCBlcnJvcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZTR4NV9wcml2YXRlICpscDsKKworCWRldl9udW0gPSBQQ0lfU0xPVChwZGV2LT5kZXZmbik7CisJcGIgPSBwZGV2LT5idXMtPm51bWJlcjsKKworCWlmIChpbykgeyAvKiBwcm9iZSBhIHNpbmdsZSBQQ0kgZGV2aWNlICovCisJCXBidXMgPSAodV9zaG9ydCkoaW8gPj4gOCk7CisJCWRudW0gPSAodV9zaG9ydCkoaW8gJiAweGZmKTsKKwkJaWYgKChwYnVzICE9IHBiKSB8fCAoZG51bSAhPSBkZXZfbnVtKSkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCXZlbmRvciA9IHBkZXYtPnZlbmRvcjsKKwlkZXZpY2UgPSBwZGV2LT5kZXZpY2UgPDwgODsKKwlpZiAoIShpc19EQzIxMDQwIHx8IGlzX0RDMjEwNDEgfHwgaXNfREMyMTE0MCB8fCBpc19EQzIxMTR4KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBPaywgdGhlIGRldmljZSBzZWVtcyB0byBiZSBmb3IgdXMuICovCisJaWYgKChlcnJvciA9IHBjaV9lbmFibGVfZGV2aWNlIChwZGV2KSkpCisJCXJldHVybiBlcnJvcjsKKworCWlmICghKGRldiA9IGFsbG9jX2V0aGVyZGV2IChzaXplb2YgKHN0cnVjdCBkZTR4NV9wcml2YXRlKSkpKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBkaXNhYmxlX2RldjsKKwl9CisKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJbHAtPmJ1cyA9IFBDSTsKKwlscC0+YnVzX251bSA9IDA7CisJCisJLyogU2VhcmNoIGZvciBhbiBTUk9NIG9uIHRoaXMgYnVzICovCisJaWYgKGxwLT5idXNfbnVtICE9IHBiKSB7CisJICAgIGxwLT5idXNfbnVtID0gcGI7CisJICAgIHNyb21fc2VhcmNoKGRldiwgcGRldik7CisJfQorCisJLyogR2V0IHRoZSBjaGlwIGNvbmZpZ3VyYXRpb24gcmV2aXNpb24gcmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX1JFVklTSU9OX0lELCAmbHAtPmNmcnYpOworCisJLyogU2V0IHRoZSBkZXZpY2UgbnVtYmVyIGluZm9ybWF0aW9uICovCisJbHAtPmRldmljZSA9IGRldl9udW07CisJbHAtPmJ1c19udW0gPSBwYjsKKwkKKwkvKiBTZXQgdGhlIGNoaXBzZXQgaW5mb3JtYXRpb24gKi8KKwlpZiAoaXNfREMyMTE0eCkgeworCSAgICBkZXZpY2UgPSAoKGxwLT5jZnJ2ICYgQ0ZSVl9STikgPCBEQzIxMTR4X0JSSyA/IERDMjExNDIgOiBEQzIxMTQzKTsKKwl9CisJbHAtPmNoaXBzZXQgPSBkZXZpY2U7CisKKwkvKiBHZXQgdGhlIGJvYXJkIEkvTyBhZGRyZXNzICg2NCBiaXRzIG9uIHNwYXJjNjQpICovCisJaW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCisJLyogRmV0Y2ggdGhlIElSUSB0byBiZSB1c2VkICovCisJaXJxID0gcGRldi0+aXJxOworCWlmICgoaXJxID09IDApIHx8IChpcnEgPT0gMHhmZikgfHwgKChpbnQpaXJxID09IC0xKSkgeworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9kZXY7CisJfQorCSAgICAKKwkvKiBDaGVjayBpZiBJL08gYWNjZXNzZXMgYW5kIEJ1cyBNYXN0ZXJpbmcgYXJlIGVuYWJsZWQgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnN0YXR1cyk7CisjaWZkZWYgX19wb3dlcnBjX18KKwlpZiAoIShzdGF0dXMgJiBQQ0lfQ09NTUFORF9JTykpIHsKKwkgICAgc3RhdHVzIHw9IFBDSV9DT01NQU5EX0lPOworCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIHN0YXR1cyk7CisJICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmc3RhdHVzKTsKKwl9CisjZW5kaWYgLyogX19wb3dlcnBjX18gKi8KKwlpZiAoIShzdGF0dXMgJiBQQ0lfQ09NTUFORF9JTykpIHsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfZGV2OworCX0KKworCWlmICghKHN0YXR1cyAmIFBDSV9DT01NQU5EX01BU1RFUikpIHsKKwkgICAgc3RhdHVzIHw9IFBDSV9DT01NQU5EX01BU1RFUjsKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBzdGF0dXMpOworCSAgICBwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnN0YXR1cyk7CisJfQorCWlmICghKHN0YXR1cyAmIFBDSV9DT01NQU5EX01BU1RFUikpIHsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfZGV2OworCX0KKworCS8qIENoZWNrIHRoZSBsYXRlbmN5IHRpbWVyIGZvciB2YWx1ZXMgPj0gMHg2MCAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmdGltZXIpOworCWlmICh0aW1lciA8IDB4NjApIHsKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDYwKTsKKwl9CisKKwlEZXZpY2VQcmVzZW50KGRldiwgREU0WDVfQVBST00pOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbiAoaW9iYXNlLCBERTRYNV9QQ0lfVE9UQUxfU0laRSwgImRlNHg1IikpIHsKKwkJZXJyb3IgPSAtRUJVU1k7CisJCWdvdG8gZnJlZV9kZXY7CisJfQorCisJZGV2LT5pcnEgPSBpcnE7CisJCisJaWYgKChlcnJvciA9IGRlNHg1X2h3X2luaXQoZGV2LCBpb2Jhc2UsICZwZGV2LT5kZXYpKSkgeworCQlnb3RvIHJlbGVhc2U7CisJfQorCisJcmV0dXJuIDA7CisKKyByZWxlYXNlOgorCXJlbGVhc2VfcmVnaW9uIChpb2Jhc2UsIERFNFg1X1BDSV9UT1RBTF9TSVpFKTsKKyBmcmVlX2RldjoKKwlmcmVlX25ldGRldiAoZGV2KTsKKyBkaXNhYmxlX2RldjoKKwlwY2lfZGlzYWJsZV9kZXZpY2UgKHBkZXYpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRlNHg1X3BjaV9yZW1vdmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdV9sb25nIGlvYmFzZTsKKworCWRldiA9IHBkZXYtPmRldi5kcml2ZXJfZGF0YTsKKwlpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCWZyZWVfbmV0ZGV2IChkZXYpOworCXJlbGVhc2VfcmVnaW9uIChpb2Jhc2UsIERFNFg1X1BDSV9UT1RBTF9TSVpFKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UgKHBkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZGU0eDVfcGNpX3RibFtdID0geworICAgICAgICB7IFBDSV9WRU5ET1JfSURfREVDLCBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUCwKKyAgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisgICAgICAgIHsgUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMsCisgICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMSB9LAorICAgICAgICB7IFBDSV9WRU5ET1JfSURfREVDLCBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUF9GQVNULAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMiB9LAorICAgICAgICB7IFBDSV9WRU5ET1JfSURfREVDLCBQQ0lfREVWSUNFX0lEX0RFQ18yMTE0MiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDMgfSwKKyAgICAgICAgeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRlNHg1X3BjaV9kcml2ZXIgPSB7CisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJkZTR4NSIsCisgICAgICAgIC5pZF90YWJsZSAgICAgICA9IGRlNHg1X3BjaV90YmwsCisgICAgICAgIC5wcm9iZSAgICAgICAgICA9IGRlNHg1X3BjaV9wcm9iZSwKKwkucmVtb3ZlICAgICAgICAgPSBfX2RldmV4aXRfcCAoZGU0eDVfcGNpX3JlbW92ZSksCit9OworCisjZW5kaWYKKworLyoKKyoqIEF1dG8gY29uZmlndXJlIHRoZSBtZWRpYSBoZXJlIHJhdGhlciB0aGFuIHNldHRpbmcgdGhlIHBvcnQgYXQgY29tcGlsZQorKiogdGltZS4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBkZTR4NV9pbml0KCkgYW5kIHdoZW4gYSBsb3NzIG9mIG1lZGlhIGlzCisqKiBkZXRlY3RlZCAoZXhjZXNzaXZlIGNvbGxpc2lvbnMsIGxvc3Mgb2YgY2Fycmllciwgbm8gY2FycmllciBvciBsaW5rIGZhaWwKKyoqIFtUUF0gb3Igbm8gcmVjZW50IHJlY2VpdmUgYWN0aXZpdHkpIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHVzZXIgaGFzIGJlZW4gCisqKiBzbmVha3kgYW5kIGNoYW5nZWQgdGhlIHBvcnQgb24gdXMuCisqLworc3RhdGljIGludAorYXV0b2NvbmZfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworCisgICAgbHAtPmxpbmtPSyA9IDA7CisgICAgbHAtPmNfbWVkaWEgPSBBVVRPOyAgICAgICAgICAgICAgICAgICAgIC8qIEJvZ3VzIGxhc3QgbWVkaWEgKi8KKyAgICBkaXNhYmxlX2FzdChkZXYpOworICAgIGlubChERTRYNV9NRkMpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBaZXJvIHRoZSBsb3N0IGZyYW1lcyBjb3VudGVyICovCisgICAgbHAtPm1lZGlhID0gSU5JVDsKKyAgICBscC0+dGNvdW50ID0gMDsKKworICAgIGlmIChscC0+dXNlU1JPTSkgeworCW5leHRfdGljayA9IHNyb21fYXV0b2NvbmYoZGV2KTsKKyAgICB9IGVsc2UgaWYgKGxwLT5jaGlwc2V0ID09IERDMjEwNDApIHsKKwluZXh0X3RpY2sgPSBkYzIxMDQwX2F1dG9jb25mKGRldik7CisgICAgfSBlbHNlIGlmIChscC0+Y2hpcHNldCA9PSBEQzIxMDQxKSB7CisJbmV4dF90aWNrID0gZGMyMTA0MV9hdXRvY29uZihkZXYpOworICAgIH0gZWxzZSBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTE0MCkgeworCW5leHRfdGljayA9IGRjMjExNDBtX2F1dG9jb25mKGRldik7CisgICAgfQorCisgICAgZW5hYmxlX2FzdChkZXYsIG5leHRfdGljayk7CisgICAgCisgICAgcmV0dXJuIChscC0+bWVkaWEpOworfQorCisvKgorKiogQXV0b2NvbmZpZ3VyZSB0aGUgbWVkaWEgd2hlbiB1c2luZyB0aGUgREMyMTA0MC4gQVVJIGNhbm5vdCBiZSBkaXN0aW5ndWlzaGVkCisqKiBmcm9tIEJOQyBhcyB0aGUgcG9ydCBoYXMgYSBqdW1wZXIgdG8gc2V0IHRoaWNrIG9yIHRoaW4gd2lyZS4gV2hlbiBzZXQgZm9yCisqKiBCTkMsIHRoZSBCTkMgcG9ydCB3aWxsIGluZGljYXRlIGFjdGl2aXR5IGlmIGl0J3Mgbm90IHRlcm1pbmF0ZWQgY29ycmVjdGx5LgorKiogVGhlIG9ubHkgd2F5IHRvIHRlc3QgZm9yIHRoYXQgaXMgdG8gcGxhY2UgYSBsb29wYmFjayBwYWNrZXQgb250byB0aGUKKyoqIG5ldHdvcmsgYW5kIHdhdGNoIGZvciBlcnJvcnMuIFNpbmNlIHdlJ3JlIG1lc3Npbmcgd2l0aCB0aGUgaW50ZXJydXB0IG1hc2sKKyoqIHJlZ2lzdGVyLCBkaXNhYmxlIHRoZSBib2FyZCBpbnRlcnJ1cHRzIGFuZCBkbyBub3QgYWxsb3cgYW55IG1vcmUgcGFja2V0cyB0bworKiogYmUgcXVldWVkIHRvIHRoZSBoYXJkd2FyZS4gUmUtZW5hYmxlIGV2ZXJ5dGhpbmcgb25seSB3aGVuIHRoZSBtZWRpYSBpcworKiogZm91bmQuCisqKiBJIG1heSBoYXZlIHRvICJhZ2Ugb3V0IiBsb2NhbGx5IHF1ZXVlZCBwYWNrZXRzIHNvIHRoYXQgdGhlIGhpZ2hlciBsYXllcgorKiogdGltZW91dHMgZG9uJ3QgZWZmZWN0aXZlbHkgZHVwbGljYXRlIHBhY2tldHMgb24gdGhlIG5ldHdvcmsuCisqLworc3RhdGljIGludAorZGMyMTA0MF9hdXRvY29uZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisgICAgczMyIGltcjsKKyAgICAKKyAgICBzd2l0Y2ggKGxwLT5tZWRpYSkgeworICAgIGNhc2UgSU5JVDoKKwlESVNBQkxFX0lSUXM7CisJbHAtPnR4X2VuYWJsZSA9IE5POworCWxwLT50aW1lb3V0ID0gLTE7CisJZGU0eDVfc2F2ZV9za2JzKGRldik7CisJaWYgKChscC0+YXV0b3NlbnNlID09IEFVVE8pIHx8IChscC0+YXV0b3NlbnNlID09IFRQKSkgeworCSAgICBscC0+bWVkaWEgPSBUUDsKKwl9IGVsc2UgaWYgKChscC0+YXV0b3NlbnNlID09IEJOQykgfHwgKGxwLT5hdXRvc2Vuc2UgPT0gQVVJKSB8fCAobHAtPmF1dG9zZW5zZSA9PSBCTkNfQVVJKSkgeworCSAgICBscC0+bWVkaWEgPSBCTkNfQVVJOworCX0gZWxzZSBpZiAobHAtPmF1dG9zZW5zZSA9PSBFWFRfU0lBKSB7CisJICAgIGxwLT5tZWRpYSA9IEVYVF9TSUE7CisJfSBlbHNlIHsKKwkgICAgbHAtPm1lZGlhID0gTkM7CisJfQorCWxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJbmV4dF90aWNrID0gZGMyMTA0MF9hdXRvY29uZihkZXYpOworCWJyZWFrOworCQorICAgIGNhc2UgVFA6CisJbmV4dF90aWNrID0gZGMyMTA0MF9zdGF0ZShkZXYsIDB4OGYwMSwgMHhmZmZmLCAweDAwMDAsIDMwMDAsIEJOQ19BVUksIAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQX1NVU1BFQ1QsIHRlc3RfdHApOworCWJyZWFrOworCQorICAgIGNhc2UgVFBfU1VTUEVDVDoKKwluZXh0X3RpY2sgPSBkZTR4NV9zdXNwZWN0X3N0YXRlKGRldiwgMTAwMCwgVFAsIHRlc3RfdHAsIGRjMjEwNDBfYXV0b2NvbmYpOworCWJyZWFrOworCQorICAgIGNhc2UgQk5DOgorICAgIGNhc2UgQVVJOgorICAgIGNhc2UgQk5DX0FVSToKKwluZXh0X3RpY2sgPSBkYzIxMDQwX3N0YXRlKGRldiwgMHg4ZjA5LCAweDA3MDUsIDB4MDAwNiwgMzAwMCwgRVhUX1NJQSwgCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTkNfQVVJX1NVU1BFQ1QsIHBpbmdfbWVkaWEpOworCWJyZWFrOworCQorICAgIGNhc2UgQk5DX0FVSV9TVVNQRUNUOgorCW5leHRfdGljayA9IGRlNHg1X3N1c3BlY3Rfc3RhdGUoZGV2LCAxMDAwLCBCTkNfQVVJLCBwaW5nX21lZGlhLCBkYzIxMDQwX2F1dG9jb25mKTsKKwlicmVhazsKKwkKKyAgICBjYXNlIEVYVF9TSUE6CisJbmV4dF90aWNrID0gZGMyMTA0MF9zdGF0ZShkZXYsIDB4MzA0MSwgMHgwMDAwLCAweDAwMDYsIDMwMDAsIAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQywgRVhUX1NJQV9TVVNQRUNULCBwaW5nX21lZGlhKTsKKwlicmVhazsKKwkKKyAgICBjYXNlIEVYVF9TSUFfU1VTUEVDVDoKKwluZXh0X3RpY2sgPSBkZTR4NV9zdXNwZWN0X3N0YXRlKGRldiwgMTAwMCwgRVhUX1NJQSwgcGluZ19tZWRpYSwgZGMyMTA0MF9hdXRvY29uZik7CisJYnJlYWs7CisJCisgICAgY2FzZSBOQzoKKwkvKiBkZWZhdWx0IHRvIFRQIGZvciBhbGwgKi8KKwlyZXNldF9pbml0X3NpYShkZXYsIDB4OGYwMSwgMHhmZmZmLCAweDAwMDApOworCWlmIChscC0+bWVkaWEgIT0gbHAtPmNfbWVkaWEpIHsKKwkgICAgZGU0eDVfZGJnX21lZGlhKGRldik7CisJICAgIGxwLT5jX21lZGlhID0gbHAtPm1lZGlhOworCX0KKwlscC0+bWVkaWEgPSBJTklUOworCWxwLT50eF9lbmFibGUgPSBOTzsKKwlicmVhazsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIG5leHRfdGljazsKK30KKworc3RhdGljIGludAorZGMyMTA0MF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY3NyMTMsIGludCBjc3IxNCwgaW50IGNzcjE1LCBpbnQgdGltZW91dCwKKwkgICAgICBpbnQgbmV4dF9zdGF0ZSwgaW50IHN1c3BlY3Rfc3RhdGUsIAorCSAgICAgIGludCAoKmZuKShzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQpKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IG5leHRfdGljayA9IERFNFg1X0FVVE9TRU5TRV9NUzsKKyAgICBpbnQgbGlua0JhZDsKKworICAgIHN3aXRjaCAobHAtPmxvY2FsX3N0YXRlKSB7CisgICAgY2FzZSAwOgorCXJlc2V0X2luaXRfc2lhKGRldiwgY3NyMTMsIGNzcjE0LCBjc3IxNSk7CisJbHAtPmxvY2FsX3N0YXRlKys7CisJbmV4dF90aWNrID0gNTAwOworCWJyZWFrOworCSAgICAKKyAgICBjYXNlIDE6CisJaWYgKCFscC0+dHhfZW5hYmxlKSB7CisJICAgIGxpbmtCYWQgPSBmbihkZXYsIHRpbWVvdXQpOworCSAgICBpZiAobGlua0JhZCA8IDApIHsKKwkJbmV4dF90aWNrID0gbGlua0JhZCAmIH5USU1FUl9DQjsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKGxpbmtCYWQgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkJICAgIGxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJCSAgICBscC0+bWVkaWEgPSBuZXh0X3N0YXRlOworCQl9IGVsc2UgeworCQkgICAgZGU0eDVfaW5pdF9jb25uZWN0aW9uKGRldik7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoIWxwLT5saW5rT0sgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkgICAgbHAtPm1lZGlhID0gc3VzcGVjdF9zdGF0ZTsKKwkgICAgbmV4dF90aWNrID0gMzAwMDsKKwl9CisJYnJlYWs7CisgICAgfQorICAgIAorICAgIHJldHVybiBuZXh0X3RpY2s7Cit9CisKK3N0YXRpYyBpbnQKK2RlNHg1X3N1c3BlY3Rfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHRpbWVvdXQsIGludCBwcmV2X3N0YXRlLAorCQkgICAgICBpbnQgKCpmbikoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50KSwKKwkJICAgICAgaW50ICgqYXNmbikoc3RydWN0IG5ldF9kZXZpY2UgKikpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworICAgIGludCBsaW5rQmFkOworCisgICAgc3dpdGNoIChscC0+bG9jYWxfc3RhdGUpIHsKKyAgICBjYXNlIDE6CisJaWYgKGxwLT5saW5rT0spIHsKKwkgICAgbHAtPm1lZGlhID0gcHJldl9zdGF0ZTsKKwl9IGVsc2UgeworCSAgICBscC0+bG9jYWxfc3RhdGUrKzsKKwkgICAgbmV4dF90aWNrID0gYXNmbihkZXYpOworCX0KKwlicmVhazsKKworICAgIGNhc2UgMjoKKwlsaW5rQmFkID0gZm4oZGV2LCB0aW1lb3V0KTsKKwlpZiAobGlua0JhZCA8IDApIHsKKwkgICAgbmV4dF90aWNrID0gbGlua0JhZCAmIH5USU1FUl9DQjsKKwl9IGVsc2UgaWYgKCFsaW5rQmFkKSB7CisJICAgIGxwLT5sb2NhbF9zdGF0ZS0tOworCSAgICBscC0+bWVkaWEgPSBwcmV2X3N0YXRlOworCX0gZWxzZSB7CisJICAgIGxwLT5tZWRpYSA9IElOSVQ7CisJICAgIGxwLT50Y291bnQrKzsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIG5leHRfdGljazsKK30KKworLyoKKyoqIEF1dG9jb25maWd1cmUgdGhlIG1lZGlhIHdoZW4gdXNpbmcgdGhlIERDMjEwNDEuIEFVSSBuZWVkcyB0byBiZSB0ZXN0ZWQKKyoqIGJlZm9yZSBCTkMsIGJlY2F1c2UgdGhlIEJOQyBwb3J0IHdpbGwgaW5kaWNhdGUgYWN0aXZpdHkgaWYgaXQncyBub3QKKyoqIHRlcm1pbmF0ZWQgY29ycmVjdGx5LiBUaGUgb25seSB3YXkgdG8gdGVzdCBmb3IgdGhhdCBpcyB0byBwbGFjZSBhIGxvb3BiYWNrCisqKiBwYWNrZXQgb250byB0aGUgbmV0d29yayBhbmQgd2F0Y2ggZm9yIGVycm9ycy4gU2luY2Ugd2UncmUgbWVzc2luZyB3aXRoCisqKiB0aGUgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIsIGRpc2FibGUgdGhlIGJvYXJkIGludGVycnVwdHMgYW5kIGRvIG5vdCBhbGxvdworKiogYW55IG1vcmUgcGFja2V0cyB0byBiZSBxdWV1ZWQgdG8gdGhlIGhhcmR3YXJlLiBSZS1lbmFibGUgZXZlcnl0aGluZyBvbmx5CisqKiB3aGVuIHRoZSBtZWRpYSBpcyBmb3VuZC4KKyovCitzdGF0aWMgaW50CitkYzIxMDQxX2F1dG9jb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgczMyIHN0cywgaXJxcywgaXJxX21hc2ssIGltciwgb21yOworICAgIGludCBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisgICAgCisgICAgc3dpdGNoIChscC0+bWVkaWEpIHsKKyAgICBjYXNlIElOSVQ6CisJRElTQUJMRV9JUlFzOworCWxwLT50eF9lbmFibGUgPSBOTzsKKwlscC0+dGltZW91dCA9IC0xOworCWRlNHg1X3NhdmVfc2ticyhkZXYpOyAgICAgICAgICAvKiBTYXZlIG5vbiB0cmFuc21pdHRlZCBza2IncyAqLworCWlmICgobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSB8fCAobHAtPmF1dG9zZW5zZSA9PSBUUF9OVykpIHsKKwkgICAgbHAtPm1lZGlhID0gVFA7ICAgICAgICAgICAgLyogT24gY2hpcCBhdXRvIG5lZ290aWF0aW9uIGlzIGJyb2tlbiAqLworCX0gZWxzZSBpZiAobHAtPmF1dG9zZW5zZSA9PSBUUCkgeworCSAgICBscC0+bWVkaWEgPSBUUDsKKwl9IGVsc2UgaWYgKGxwLT5hdXRvc2Vuc2UgPT0gQk5DKSB7CisJICAgIGxwLT5tZWRpYSA9IEJOQzsKKwl9IGVsc2UgaWYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVJKSB7CisJICAgIGxwLT5tZWRpYSA9IEFVSTsKKwl9IGVsc2UgeworCSAgICBscC0+bWVkaWEgPSBOQzsKKwl9CisJbHAtPmxvY2FsX3N0YXRlID0gMDsKKwluZXh0X3RpY2sgPSBkYzIxMDQxX2F1dG9jb25mKGRldik7CisJYnJlYWs7CisJCisgICAgY2FzZSBUUF9OVzoKKwlpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJICAgIG9tciA9IGlubChERTRYNV9PTVIpOy8qIFNldCB1cCBmdWxsIGR1cGxleCBmb3IgdGhlIGF1dG9uZWdvdGlhdGUgKi8KKwkgICAgb3V0bChvbXIgfCBPTVJfRkRYLCBERTRYNV9PTVIpOworCX0KKwlpcnFzID0gU1RTX0xORiB8IFNUU19MTlA7CisJaXJxX21hc2sgPSBJTVJfTEZNIHwgSU1SX0xQTTsKKwlzdHMgPSB0ZXN0X21lZGlhKGRldiwgaXJxcywgaXJxX21hc2ssIDB4ZWYwMSwgMHhmZmZmLCAweDAwMDgsIDI0MDApOworCWlmIChzdHMgPCAwKSB7CisJICAgIG5leHRfdGljayA9IHN0cyAmIH5USU1FUl9DQjsKKwl9IGVsc2UgeworCSAgICBpZiAoc3RzICYgU1RTX0xOUCkgeworCQlscC0+bWVkaWEgPSBBTlM7CisJICAgIH0gZWxzZSB7CisJCWxwLT5tZWRpYSA9IEFVSTsKKwkgICAgfQorCSAgICBuZXh0X3RpY2sgPSBkYzIxMDQxX2F1dG9jb25mKGRldik7CisJfQorCWJyZWFrOworCQorICAgIGNhc2UgQU5TOgorCWlmICghbHAtPnR4X2VuYWJsZSkgeworCSAgICBpcnFzID0gU1RTX0xOUDsKKwkgICAgaXJxX21hc2sgPSBJTVJfTFBNOworCSAgICBzdHMgPSB0ZXN0X2FucyhkZXYsIGlycXMsIGlycV9tYXNrLCAzMDAwKTsKKwkgICAgaWYgKHN0cyA8IDApIHsKKwkJbmV4dF90aWNrID0gc3RzICYgflRJTUVSX0NCOworCSAgICB9IGVsc2UgeworCQlpZiAoIShzdHMgJiBTVFNfTE5QKSAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCQkgICAgbHAtPm1lZGlhID0gVFA7CisJCSAgICBuZXh0X3RpY2sgPSBkYzIxMDQxX2F1dG9jb25mKGRldik7CisJCX0gZWxzZSB7CisJCSAgICBscC0+bG9jYWxfc3RhdGUgPSAxOworCQkgICAgZGU0eDVfaW5pdF9jb25uZWN0aW9uKGRldik7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoIWxwLT5saW5rT0sgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkgICAgbHAtPm1lZGlhID0gQU5TX1NVU1BFQ1Q7CisJICAgIG5leHRfdGljayA9IDMwMDA7CisJfQorCWJyZWFrOworCQorICAgIGNhc2UgQU5TX1NVU1BFQ1Q6CisJbmV4dF90aWNrID0gZGU0eDVfc3VzcGVjdF9zdGF0ZShkZXYsIDEwMDAsIEFOUywgdGVzdF90cCwgZGMyMTA0MV9hdXRvY29uZik7CisJYnJlYWs7CisJCisgICAgY2FzZSBUUDoKKwlpZiAoIWxwLT50eF9lbmFibGUpIHsKKwkgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCQlvbXIgPSBpbmwoREU0WDVfT01SKTsgICAgICAgICAgLyogU2V0IHVwIGhhbGYgZHVwbGV4IGZvciBUUCAqLworCQlvdXRsKG9tciAmIH5PTVJfRkRYLCBERTRYNV9PTVIpOworCSAgICB9CisJICAgIGlycXMgPSBTVFNfTE5GIHwgU1RTX0xOUDsKKwkgICAgaXJxX21hc2sgPSBJTVJfTEZNIHwgSU1SX0xQTTsKKwkgICAgc3RzID0gdGVzdF9tZWRpYShkZXYsaXJxcywgaXJxX21hc2ssIDB4ZWYwMSwgMHhmZjNmLCAweDAwMDgsIDI0MDApOworCSAgICBpZiAoc3RzIDwgMCkgeworCQluZXh0X3RpY2sgPSBzdHMgJiB+VElNRVJfQ0I7CisJICAgIH0gZWxzZSB7CisJCWlmICghKHN0cyAmIFNUU19MTlApICYmIChscC0+YXV0b3NlbnNlID09IEFVVE8pKSB7CisJCSAgICBpZiAoaW5sKERFNFg1X1NJU1IpICYgU0lTUl9OUkEpIHsKKwkJCWxwLT5tZWRpYSA9IEFVSTsgICAgICAgLyogTm9uIHNlbGVjdGVkIHBvcnQgYWN0aXZpdHkgKi8KKwkJICAgIH0gZWxzZSB7CisJCQlscC0+bWVkaWEgPSBCTkM7CisJCSAgICB9CisJCSAgICBuZXh0X3RpY2sgPSBkYzIxMDQxX2F1dG9jb25mKGRldik7CisJCX0gZWxzZSB7CisJCSAgICBscC0+bG9jYWxfc3RhdGUgPSAxOworCQkgICAgZGU0eDVfaW5pdF9jb25uZWN0aW9uKGRldik7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoIWxwLT5saW5rT0sgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkgICAgbHAtPm1lZGlhID0gVFBfU1VTUEVDVDsKKwkgICAgbmV4dF90aWNrID0gMzAwMDsKKwl9CisJYnJlYWs7CisJCisgICAgY2FzZSBUUF9TVVNQRUNUOgorCW5leHRfdGljayA9IGRlNHg1X3N1c3BlY3Rfc3RhdGUoZGV2LCAxMDAwLCBUUCwgdGVzdF90cCwgZGMyMTA0MV9hdXRvY29uZik7CisJYnJlYWs7CisJCisgICAgY2FzZSBBVUk6CisJaWYgKCFscC0+dHhfZW5hYmxlKSB7CisJICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwkJb21yID0gaW5sKERFNFg1X09NUik7ICAgICAgICAgIC8qIFNldCB1cCBoYWxmIGR1cGxleCBmb3IgQVVJICovCisJCW91dGwob21yICYgfk9NUl9GRFgsIERFNFg1X09NUik7CisJICAgIH0KKwkgICAgaXJxcyA9IDA7CisJICAgIGlycV9tYXNrID0gMDsKKwkgICAgc3RzID0gdGVzdF9tZWRpYShkZXYsaXJxcywgaXJxX21hc2ssIDB4ZWYwOSwgMHhmNzNkLCAweDAwMGUsIDEwMDApOworCSAgICBpZiAoc3RzIDwgMCkgeworCQluZXh0X3RpY2sgPSBzdHMgJiB+VElNRVJfQ0I7CisJICAgIH0gZWxzZSB7CisJCWlmICghKGlubChERTRYNV9TSVNSKSAmIFNJU1JfU1JBKSAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCQkgICAgbHAtPm1lZGlhID0gQk5DOworCQkgICAgbmV4dF90aWNrID0gZGMyMTA0MV9hdXRvY29uZihkZXYpOworCQl9IGVsc2UgeworCQkgICAgbHAtPmxvY2FsX3N0YXRlID0gMTsKKwkJICAgIGRlNHg1X2luaXRfY29ubmVjdGlvbihkZXYpOworCQl9CisJICAgIH0KKwl9IGVsc2UgaWYgKCFscC0+bGlua09LICYmIChscC0+YXV0b3NlbnNlID09IEFVVE8pKSB7CisJICAgIGxwLT5tZWRpYSA9IEFVSV9TVVNQRUNUOworCSAgICBuZXh0X3RpY2sgPSAzMDAwOworCX0KKwlicmVhazsKKwkKKyAgICBjYXNlIEFVSV9TVVNQRUNUOgorCW5leHRfdGljayA9IGRlNHg1X3N1c3BlY3Rfc3RhdGUoZGV2LCAxMDAwLCBBVUksIHBpbmdfbWVkaWEsIGRjMjEwNDFfYXV0b2NvbmYpOworCWJyZWFrOworCQorICAgIGNhc2UgQk5DOgorCXN3aXRjaCAobHAtPmxvY2FsX3N0YXRlKSB7CisJY2FzZSAwOgorCSAgICBpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJCW9tciA9IGlubChERTRYNV9PTVIpOyAgICAgICAgICAvKiBTZXQgdXAgaGFsZiBkdXBsZXggZm9yIEJOQyAqLworCQlvdXRsKG9tciAmIH5PTVJfRkRYLCBERTRYNV9PTVIpOworCSAgICB9CisJICAgIGlycXMgPSAwOworCSAgICBpcnFfbWFzayA9IDA7CisJICAgIHN0cyA9IHRlc3RfbWVkaWEoZGV2LGlycXMsIGlycV9tYXNrLCAweGVmMDksIDB4ZjczZCwgMHgwMDA2LCAxMDAwKTsKKwkgICAgaWYgKHN0cyA8IDApIHsKKwkJbmV4dF90aWNrID0gc3RzICYgflRJTUVSX0NCOworCSAgICB9IGVsc2UgeworCQlscC0+bG9jYWxfc3RhdGUrKzsgICAgICAgICAgICAgLyogRW5zdXJlIG1lZGlhIGNvbm5lY3RlZCAqLworCQluZXh0X3RpY2sgPSBkYzIxMDQxX2F1dG9jb25mKGRldik7CisJICAgIH0KKwkgICAgYnJlYWs7CisJICAgIAorCWNhc2UgMToKKwkgICAgaWYgKCFscC0+dHhfZW5hYmxlKSB7CisJCWlmICgoc3RzID0gcGluZ19tZWRpYShkZXYsIDMwMDApKSA8IDApIHsKKwkJICAgIG5leHRfdGljayA9IHN0cyAmIH5USU1FUl9DQjsKKwkJfSBlbHNlIHsKKwkJICAgIGlmIChzdHMpIHsKKwkJCWxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJCQlscC0+bWVkaWEgPSBOQzsKKwkJICAgIH0gZWxzZSB7CisJCQlkZTR4NV9pbml0X2Nvbm5lY3Rpb24oZGV2KTsKKwkJICAgIH0KKwkJfQorCSAgICB9IGVsc2UgaWYgKCFscC0+bGlua09LICYmIChscC0+YXV0b3NlbnNlID09IEFVVE8pKSB7CisJCWxwLT5tZWRpYSA9IEJOQ19TVVNQRUNUOworCQluZXh0X3RpY2sgPSAzMDAwOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKwlicmVhazsKKwkKKyAgICBjYXNlIEJOQ19TVVNQRUNUOgorCW5leHRfdGljayA9IGRlNHg1X3N1c3BlY3Rfc3RhdGUoZGV2LCAxMDAwLCBCTkMsIHBpbmdfbWVkaWEsIGRjMjEwNDFfYXV0b2NvbmYpOworCWJyZWFrOworCQorICAgIGNhc2UgTkM6CisJb21yID0gaW5sKERFNFg1X09NUik7ICAgIC8qIFNldCB1cCBmdWxsIGR1cGxleCBmb3IgdGhlIGF1dG9uZWdvdGlhdGUgKi8KKwlvdXRsKG9tciB8IE9NUl9GRFgsIERFNFg1X09NUik7CisJcmVzZXRfaW5pdF9zaWEoZGV2LCAweGVmMDEsIDB4ZmZmZiwgMHgwMDA4KTsvKiBJbml0aWFsaXNlIHRoZSBTSUEgKi8KKwlpZiAobHAtPm1lZGlhICE9IGxwLT5jX21lZGlhKSB7CisJICAgIGRlNHg1X2RiZ19tZWRpYShkZXYpOworCSAgICBscC0+Y19tZWRpYSA9IGxwLT5tZWRpYTsKKwl9CisJbHAtPm1lZGlhID0gSU5JVDsKKwlscC0+dHhfZW5hYmxlID0gTk87CisJYnJlYWs7CisgICAgfQorICAgIAorICAgIHJldHVybiBuZXh0X3RpY2s7Cit9CisKKy8qCisqKiBTb21lIGF1dG9uZWdvdGlhdGlvbiBjaGlwcyBhcmUgYnJva2VuIGluIHRoYXQgdGhleSBkbyBub3QgcmV0dXJuIHRoZQorKiogYWNrbm93bGVkZ2UgYml0IChhbmxwYSAmIE1JSV9BTkxQQV9BQ0spIGluIHRoZSBsaW5rIHBhcnRuZXIgYWR2ZXJ0aXNlbWVudAorKiogcmVnaXN0ZXIsIGV4Y2VwdCBhdCB0aGUgZmlyc3QgcG93ZXIgdXAgbmVnb3RpYXRpb24uCisqLworc3RhdGljIGludAorZGMyMTE0MG1fYXV0b2NvbmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCBhbmEsIGFubHBhLCBjYXAsIGNyLCBzbG5rLCBzcjsKKyAgICBpbnQgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworICAgIHVfbG9uZyBpbXIsIG9tciwgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgCisgICAgc3dpdGNoKGxwLT5tZWRpYSkgeworICAgIGNhc2UgSU5JVDogCisgICAgICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwkgICAgRElTQUJMRV9JUlFzOworCSAgICBscC0+dHhfZW5hYmxlID0gRkFMU0U7CisJICAgIGxwLT5saW5rT0sgPSAwOworCSAgICBkZTR4NV9zYXZlX3NrYnMoZGV2KTsgICAgICAgICAgLyogU2F2ZSBub24gdHJhbnNtaXR0ZWQgc2tiJ3MgKi8KKwl9CisJaWYgKChuZXh0X3RpY2sgPSBkZTR4NV9yZXNldF9waHkoZGV2KSkgPCAwKSB7CisJICAgIG5leHRfdGljayAmPSB+VElNRVJfQ0I7CisJfSBlbHNlIHsKKwkgICAgaWYgKGxwLT51c2VTUk9NKSB7CisJCWlmIChzcm9tX21hcF9tZWRpYShkZXYpIDwgMCkgeworCQkgICAgbHAtPnRjb3VudCsrOworCQkgICAgcmV0dXJuIG5leHRfdGljazsKKwkJfQorCQlzcm9tX2V4ZWMoZGV2LCBscC0+cGh5W2xwLT5hY3RpdmVdLmdlcCk7CisJCWlmIChscC0+aW5mb2Jsb2NrX21lZGlhID09IEFOUykgeworCQkgICAgYW5hID0gbHAtPnBoeVtscC0+YWN0aXZlXS5hbmEgfCBNSUlfQU5BX0NTTUE7CisJCSAgICBtaWlfd3IoYW5hLCBNSUlfQU5BLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJbHAtPnRtcCA9IE1JSV9TUl9BU1NDOyAgICAgLyogRmFrZSBvdXQgdGhlIE1JSSBzcGVlZCBzZXQgKi8KKwkJU0VUXzEwTWI7CisJCWlmIChscC0+YXV0b3NlbnNlID09IF8xMDBNYikgeworCQkgICAgbHAtPm1lZGlhID0gXzEwME1iOworCQl9IGVsc2UgaWYgKGxwLT5hdXRvc2Vuc2UgPT0gXzEwTWIpIHsKKwkJICAgIGxwLT5tZWRpYSA9IF8xME1iOworCQl9IGVsc2UgaWYgKChscC0+YXV0b3NlbnNlID09IEFVVE8pICYmIAorCQkJICAgICAgICAgICAgKChzcj1pc19hbmNfY2FwYWJsZShkZXYpKSAmIE1JSV9TUl9BTkMpKSB7CisJCSAgICBhbmEgPSAoKChzciA+PiA2KSAmIE1JSV9BTkFfVEFGKSB8IE1JSV9BTkFfQ1NNQSk7CisJCSAgICBhbmEgJj0gKGxwLT5mZHggPyB+MCA6IH5NSUlfQU5BX0ZEQU0pOworCQkgICAgbWlpX3dyKGFuYSwgTUlJX0FOQSwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpOworCQkgICAgbHAtPm1lZGlhID0gQU5TOworCQl9IGVsc2UgaWYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykgeworCQkgICAgbHAtPm1lZGlhID0gU1BEX0RFVDsKKwkJfSBlbHNlIGlmIChpc19zcGRfMTAwKGRldikgJiYgaXNfMTAwX3VwKGRldikpIHsKKwkJICAgIGxwLT5tZWRpYSA9IF8xMDBNYjsKKwkJfSBlbHNlIHsKKwkJICAgIGxwLT5tZWRpYSA9IE5DOworCQl9CisJICAgIH0KKwkgICAgbHAtPmxvY2FsX3N0YXRlID0gMDsKKwkgICAgbmV4dF90aWNrID0gZGMyMTE0MG1fYXV0b2NvbmYoZGV2KTsKKwl9CisJYnJlYWs7CisJCisgICAgY2FzZSBBTlM6CisJc3dpdGNoIChscC0+bG9jYWxfc3RhdGUpIHsKKwljYXNlIDA6CisJICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwkJbWlpX3dyKE1JSV9DUl9BU1NFIHwgTUlJX0NSX1JBTiwgTUlJX0NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJICAgIH0KKwkgICAgY3IgPSB0ZXN0X21paV9yZWcoZGV2LCBNSUlfQ1IsIE1JSV9DUl9SQU4sIEZBTFNFLCA1MDApOworCSAgICBpZiAoY3IgPCAwKSB7CisJCW5leHRfdGljayA9IGNyICYgflRJTUVSX0NCOworCSAgICB9IGVsc2UgeworCQlpZiAoY3IpIHsKKwkJICAgIGxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJCSAgICBscC0+bWVkaWEgPSBTUERfREVUOworCQl9IGVsc2UgeworCQkgICAgbHAtPmxvY2FsX3N0YXRlKys7CisJCX0KKwkJbmV4dF90aWNrID0gZGMyMTE0MG1fYXV0b2NvbmYoZGV2KTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgICAgCisJY2FzZSAxOgorCSAgICBpZiAoKHNyPXRlc3RfbWlpX3JlZyhkZXYsIE1JSV9TUiwgTUlJX1NSX0FTU0MsIFRSVUUsIDIwMDApKSA8IDApIHsKKwkJbmV4dF90aWNrID0gc3IgJiB+VElNRVJfQ0I7CisJICAgIH0gZWxzZSB7CisJCWxwLT5tZWRpYSA9IFNQRF9ERVQ7CisJCWxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJCWlmIChzcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWNjZXNzISAqLworCQkgICAgbHAtPnRtcCA9IE1JSV9TUl9BU1NDOworCQkgICAgYW5scGEgPSBtaWlfcmQoTUlJX0FOTFBBLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJCSAgICBhbmEgPSBtaWlfcmQoTUlJX0FOQSwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpOworCQkgICAgaWYgKCEoYW5scGEgJiBNSUlfQU5MUEFfUkYpICYmIAorCQkJIChjYXAgPSBhbmxwYSAmIE1JSV9BTkxQQV9UQUYgJiBhbmEpKSB7CisJCQlpZiAoY2FwICYgTUlJX0FOQV8xMDBNKSB7CisJCQkgICAgbHAtPmZkeCA9ICgoYW5hICYgYW5scGEgJiBNSUlfQU5BX0ZEQU0gJiBNSUlfQU5BXzEwME0pID8gVFJVRSA6IEZBTFNFKTsKKwkJCSAgICBscC0+bWVkaWEgPSBfMTAwTWI7CisJCQl9IGVsc2UgaWYgKGNhcCAmIE1JSV9BTkFfMTBNKSB7CisJCQkgICAgbHAtPmZkeCA9ICgoYW5hICYgYW5scGEgJiBNSUlfQU5BX0ZEQU0gJiBNSUlfQU5BXzEwTSkgPyBUUlVFIDogRkFMU0UpOworCisJCQkgICAgbHAtPm1lZGlhID0gXzEwTWI7CisJCQl9CisJCSAgICB9CisJCX0gICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dG8gTmVnb3RpYXRpb24gZmFpbGVkIHRvIGZpbmlzaCAqLworCQluZXh0X3RpY2sgPSBkYzIxMTQwbV9hdXRvY29uZihkZXYpOworCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0byBOZWdvdGlhdGlvbiBmYWlsZWQgdG8gc3RhcnQgKi8KKwkgICAgYnJlYWs7CisJfQorCWJyZWFrOworCQorICAgIGNhc2UgU1BEX0RFVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaG9vc2UgMTBNYi9zIG9yIDEwME1iL3MgKi8KKyAgICAgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCSAgICBscC0+dG1wID0gKGxwLT5waHlbbHAtPmFjdGl2ZV0uaWQgPyBNSUlfU1JfTEtTIDogCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAofmdlcF9yZChkZXYpICYgR0VQX0xOUCkpOworCSAgICBTRVRfMTAwTWJfUERFVDsKKwl9CisgICAgICAgIGlmICgoc2xuayA9IHRlc3RfZm9yXzEwME1iKGRldiwgNjUwMCkpIDwgMCkgeworCSAgICBuZXh0X3RpY2sgPSBzbG5rICYgflRJTUVSX0NCOworCX0gZWxzZSB7CisJICAgIGlmIChpc19zcGRfMTAwKGRldikgJiYgaXNfMTAwX3VwKGRldikpIHsKKwkJbHAtPm1lZGlhID0gXzEwME1iOworCSAgICB9IGVsc2UgaWYgKCghaXNfc3BkXzEwMChkZXYpICYmIChpc18xMF91cChkZXYpICYgbHAtPnRtcCkpKSB7CisJCWxwLT5tZWRpYSA9IF8xME1iOworCSAgICB9IGVsc2UgeworCQlscC0+bWVkaWEgPSBOQzsKKwkgICAgfQorCSAgICBuZXh0X3RpY2sgPSBkYzIxMTQwbV9hdXRvY29uZihkZXYpOworCX0KKwlicmVhazsKKwkKKyAgICBjYXNlIF8xMDBNYjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IDEwME1iL3MgKi8KKyAgICAgICAgbmV4dF90aWNrID0gMzAwMDsKKwlpZiAoIWxwLT50eF9lbmFibGUpIHsKKwkgICAgU0VUXzEwME1iOworCSAgICBkZTR4NV9pbml0X2Nvbm5lY3Rpb24oZGV2KTsKKwl9IGVsc2UgeworCSAgICBpZiAoIWxwLT5saW5rT0sgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkJaWYgKCFpc18xMDBfdXAoZGV2KSB8fCAoIWxwLT51c2VTUk9NICYmICFpc19zcGRfMTAwKGRldikpKSB7CisJCSAgICBscC0+bWVkaWEgPSBJTklUOworCQkgICAgbHAtPnRjb3VudCsrOworCQkgICAgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworCQl9CisJICAgIH0KKwl9CisJYnJlYWs7CisKKyAgICBjYXNlIEJOQzoKKyAgICBjYXNlIEFVSToKKyAgICBjYXNlIF8xME1iOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IDEwTWIvcyAqLworICAgICAgICBuZXh0X3RpY2sgPSAzMDAwOworCWlmICghbHAtPnR4X2VuYWJsZSkgeworCSAgICBTRVRfMTBNYjsKKwkgICAgZGU0eDVfaW5pdF9jb25uZWN0aW9uKGRldik7CisJfSBlbHNlIHsKKwkgICAgaWYgKCFscC0+bGlua09LICYmIChscC0+YXV0b3NlbnNlID09IEFVVE8pKSB7CisJCWlmICghaXNfMTBfdXAoZGV2KSB8fCAoIWxwLT51c2VTUk9NICYmIGlzX3NwZF8xMDAoZGV2KSkpIHsKKwkJICAgIGxwLT5tZWRpYSA9IElOSVQ7CisJCSAgICBscC0+dGNvdW50Kys7CisJCSAgICBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisJCX0KKwkgICAgfQorCX0KKwlicmVhazsKKwkKKyAgICBjYXNlIE5DOgorICAgICAgICBpZiAobHAtPm1lZGlhICE9IGxwLT5jX21lZGlhKSB7CisJICAgIGRlNHg1X2RiZ19tZWRpYShkZXYpOworCSAgICBscC0+Y19tZWRpYSA9IGxwLT5tZWRpYTsKKwl9CisJbHAtPm1lZGlhID0gSU5JVDsKKwlscC0+dHhfZW5hYmxlID0gRkFMU0U7CisJYnJlYWs7CisgICAgfQorICAgIAorICAgIHJldHVybiBuZXh0X3RpY2s7Cit9CisKKy8qCisqKiBUaGlzIHJvdXRpbmUgbWF5IGJlIG1lcmdlZCBpbnRvIGRjMjExNDBtX2F1dG9jb25mKCkgc29tZXRpbWUgYXMgSSdtCisqKiBjaGFuZ2luZyBob3cgSSBmaWd1cmUgb3V0IHRoZSBtZWRpYSAtIGJ1dCB0cnlpbmcgdG8ga2VlcCBpdCBiYWNrd2FyZHMKKyoqIGNvbXBhdGlibGUgd2l0aCB0aGUgZGU1MDAteGEgYW5kIGRlNTAwLWFhLgorKiogV2hldGhlciBpdCdzIEJOQywgQVVJLCBTWU0gb3IgTUlJIGlzIHNvcnRlZCBvdXQgaW4gdGhlIGluZm9ibG9jaworKiogZnVuY3Rpb25zIGFuZCBzZXQgZHVyaW5nIGRlNHg1X21hY19wb3J0KCkgYW5kL29yIGRlNHg1X3Jlc2V0X3BoeSgpLgorKiogVGhpcyByb3V0aW5lIGp1c3QgaGFzIHRvIGZpZ3VyZSBvdXQgd2hldGhlciAxME1iL3Mgb3IgMTAwTWIvcyBpcworKiogYWN0aXZlLgorKiogV2hlbiBhdXRvbmVnb3RpYXRpb24gaXMgd29ya2luZywgdGhlIEFOUyBwYXJ0IHNlYXJjaGVzIHRoZSBTUk9NIGZvcgorKiogdGhlIGhpZ2hlc3QgY29tbW9uIHNwZWVkIChUUCkgbGluayB0aGF0IGJvdGggY2FuIHJ1biBhbmQgaWYgdGhhdCBjYW4KKyoqIGJlIGZ1bGwgZHVwbGV4LiBUaGF0IGluZm9ibG9jayBpcyBleGVjdXRlZCBhbmQgdGhlbiB0aGUgbGluayBzcGVlZCBzZXQuCisqKgorKiogT25seSBfMTBNYiBhbmQgXzEwME1iIGFyZSB0ZXN0ZWQgaGVyZS4KKyovCitzdGF0aWMgaW50CitkYzIxMTR4X2F1dG9jb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgczMyIGNyLCBhbmxwYSwgYW5hLCBjYXAsIGlycXMsIGlycV9tYXNrLCBpbXIsIG9tciwgc2xuaywgc3IsIHN0czsKKyAgICBpbnQgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworCisgICAgc3dpdGNoIChscC0+bWVkaWEpIHsKKyAgICBjYXNlIElOSVQ6CisgICAgICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwkgICAgRElTQUJMRV9JUlFzOworCSAgICBscC0+dHhfZW5hYmxlID0gRkFMU0U7CisJICAgIGxwLT5saW5rT0sgPSAwOworICAgICAgICAgICAgbHAtPnRpbWVvdXQgPSAtMTsKKwkgICAgZGU0eDVfc2F2ZV9za2JzKGRldik7ICAgICAgICAgICAgLyogU2F2ZSBub24gdHJhbnNtaXR0ZWQgc2tiJ3MgKi8KKwkgICAgaWYgKGxwLT5wYXJhbXMuYXV0b3NlbnNlICYgfkFVVE8pIHsKKwkJc3JvbV9tYXBfbWVkaWEoZGV2KTsgICAgICAgICAvKiBGaXhlZCBtZWRpYSByZXF1ZXN0ZWQgICAgICAqLworCQlpZiAobHAtPm1lZGlhICE9IGxwLT5wYXJhbXMuYXV0b3NlbnNlKSB7CisJCSAgICBscC0+dGNvdW50Kys7CisJCSAgICBscC0+bWVkaWEgPSBJTklUOworCQkgICAgcmV0dXJuIG5leHRfdGljazsKKwkJfQorCQlscC0+bWVkaWEgPSBJTklUOworCSAgICB9CisJfQorCWlmICgobmV4dF90aWNrID0gZGU0eDVfcmVzZXRfcGh5KGRldikpIDwgMCkgeworCSAgICBuZXh0X3RpY2sgJj0gflRJTUVSX0NCOworCX0gZWxzZSB7CisJICAgIGlmIChscC0+YXV0b3NlbnNlID09IF8xMDBNYikgeworCQlscC0+bWVkaWEgPSBfMTAwTWI7CisJICAgIH0gZWxzZSBpZiAobHAtPmF1dG9zZW5zZSA9PSBfMTBNYikgeworCQlscC0+bWVkaWEgPSBfMTBNYjsKKwkgICAgfSBlbHNlIGlmIChscC0+YXV0b3NlbnNlID09IFRQKSB7CisJCWxwLT5tZWRpYSA9IFRQOworCSAgICB9IGVsc2UgaWYgKGxwLT5hdXRvc2Vuc2UgPT0gQk5DKSB7CisJCWxwLT5tZWRpYSA9IEJOQzsKKwkgICAgfSBlbHNlIGlmIChscC0+YXV0b3NlbnNlID09IEFVSSkgeworCQlscC0+bWVkaWEgPSBBVUk7CisJICAgIH0gZWxzZSB7CisJCWxwLT5tZWRpYSA9IFNQRF9ERVQ7CisJCWlmICgobHAtPmluZm9ibG9ja19tZWRpYSA9PSBBTlMpICYmIAorCQkgICAgICAgICAgICAgICAgICAgICgoc3I9aXNfYW5jX2NhcGFibGUoZGV2KSkgJiBNSUlfU1JfQU5DKSkgeworCQkgICAgYW5hID0gKCgoc3IgPj4gNikgJiBNSUlfQU5BX1RBRikgfCBNSUlfQU5BX0NTTUEpOworCQkgICAgYW5hICY9IChscC0+ZmR4ID8gfjAgOiB+TUlJX0FOQV9GREFNKTsKKwkJICAgIG1paV93cihhbmEsIE1JSV9BTkEsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTsKKwkJICAgIGxwLT5tZWRpYSA9IEFOUzsKKwkJfQorCSAgICB9CisJICAgIGxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJICAgIG5leHRfdGljayA9IGRjMjExNHhfYXV0b2NvbmYoZGV2KTsKKyAgICAgICAgfQorCWJyZWFrOworCQorICAgIGNhc2UgQU5TOgorCXN3aXRjaCAobHAtPmxvY2FsX3N0YXRlKSB7CisJY2FzZSAwOgorCSAgICBpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJCW1paV93cihNSUlfQ1JfQVNTRSB8IE1JSV9DUl9SQU4sIE1JSV9DUiwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpOworCSAgICB9CisJICAgIGNyID0gdGVzdF9taWlfcmVnKGRldiwgTUlJX0NSLCBNSUlfQ1JfUkFOLCBGQUxTRSwgNTAwKTsKKwkgICAgaWYgKGNyIDwgMCkgeworCQluZXh0X3RpY2sgPSBjciAmIH5USU1FUl9DQjsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKGNyKSB7CisJCSAgICBscC0+bG9jYWxfc3RhdGUgPSAwOworCQkgICAgbHAtPm1lZGlhID0gU1BEX0RFVDsKKwkJfSBlbHNlIHsKKwkJICAgIGxwLT5sb2NhbF9zdGF0ZSsrOworCQl9CisJCW5leHRfdGljayA9IGRjMjExNHhfYXV0b2NvbmYoZGV2KTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgICAgCisJY2FzZSAxOgorCSAgICBpZiAoKHNyPXRlc3RfbWlpX3JlZyhkZXYsIE1JSV9TUiwgTUlJX1NSX0FTU0MsIFRSVUUsIDIwMDApKSA8IDApIHsKKwkJbmV4dF90aWNrID0gc3IgJiB+VElNRVJfQ0I7CisJICAgIH0gZWxzZSB7CisJCWxwLT5tZWRpYSA9IFNQRF9ERVQ7CisJCWxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJCWlmIChzcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWNjZXNzISAqLworCQkgICAgbHAtPnRtcCA9IE1JSV9TUl9BU1NDOworCQkgICAgYW5scGEgPSBtaWlfcmQoTUlJX0FOTFBBLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJCSAgICBhbmEgPSBtaWlfcmQoTUlJX0FOQSwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpOworCQkgICAgaWYgKCEoYW5scGEgJiBNSUlfQU5MUEFfUkYpICYmIAorCQkJIChjYXAgPSBhbmxwYSAmIE1JSV9BTkxQQV9UQUYgJiBhbmEpKSB7CisJCQlpZiAoY2FwICYgTUlJX0FOQV8xMDBNKSB7CisJCQkgICAgbHAtPmZkeCA9ICgoYW5hICYgYW5scGEgJiBNSUlfQU5BX0ZEQU0gJiBNSUlfQU5BXzEwME0pID8gVFJVRSA6IEZBTFNFKTsKKwkJCSAgICBscC0+bWVkaWEgPSBfMTAwTWI7CisJCQl9IGVsc2UgaWYgKGNhcCAmIE1JSV9BTkFfMTBNKSB7CisJCQkgICAgbHAtPmZkeCA9ICgoYW5hICYgYW5scGEgJiBNSUlfQU5BX0ZEQU0gJiBNSUlfQU5BXzEwTSkgPyBUUlVFIDogRkFMU0UpOworCQkJICAgIGxwLT5tZWRpYSA9IF8xME1iOworCQkJfQorCQkgICAgfQorCQl9ICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRvIE5lZ290aWF0aW9uIGZhaWxlZCB0byBmaW5pc2ggKi8KKwkJbmV4dF90aWNrID0gZGMyMTE0eF9hdXRvY29uZihkZXYpOworCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0byBOZWdvdGlhdGlvbiBmYWlsZWQgdG8gc3RhcnQgICovCisJICAgIGJyZWFrOworCX0KKwlicmVhazsKKworICAgIGNhc2UgQVVJOgorCWlmICghbHAtPnR4X2VuYWJsZSkgeworCSAgICBpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJCW9tciA9IGlubChERTRYNV9PTVIpOyAgIC8qIFNldCB1cCBoYWxmIGR1cGxleCBmb3IgQVVJICAgICAgICAqLworCQlvdXRsKG9tciAmIH5PTVJfRkRYLCBERTRYNV9PTVIpOworCSAgICB9CisJICAgIGlycXMgPSAwOworCSAgICBpcnFfbWFzayA9IDA7CisJICAgIHN0cyA9IHRlc3RfbWVkaWEoZGV2LGlycXMsIGlycV9tYXNrLCAwLCAwLCAwLCAxMDAwKTsKKwkgICAgaWYgKHN0cyA8IDApIHsKKwkJbmV4dF90aWNrID0gc3RzICYgflRJTUVSX0NCOworCSAgICB9IGVsc2UgeworCQlpZiAoIShpbmwoREU0WDVfU0lTUikgJiBTSVNSX1NSQSkgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkJICAgIGxwLT5tZWRpYSA9IEJOQzsKKwkJICAgIG5leHRfdGljayA9IGRjMjExNHhfYXV0b2NvbmYoZGV2KTsKKwkJfSBlbHNlIHsKKwkJICAgIGxwLT5sb2NhbF9zdGF0ZSA9IDE7CisJCSAgICBkZTR4NV9pbml0X2Nvbm5lY3Rpb24oZGV2KTsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmICghbHAtPmxpbmtPSyAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCSAgICBscC0+bWVkaWEgPSBBVUlfU1VTUEVDVDsKKwkgICAgbmV4dF90aWNrID0gMzAwMDsKKwl9CisJYnJlYWs7CisJCisgICAgY2FzZSBBVUlfU1VTUEVDVDoKKwluZXh0X3RpY2sgPSBkZTR4NV9zdXNwZWN0X3N0YXRlKGRldiwgMTAwMCwgQVVJLCBwaW5nX21lZGlhLCBkYzIxMTR4X2F1dG9jb25mKTsKKwlicmVhazsKKwkKKyAgICBjYXNlIEJOQzoKKwlzd2l0Y2ggKGxwLT5sb2NhbF9zdGF0ZSkgeworCWNhc2UgMDoKKwkgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCQlvbXIgPSBpbmwoREU0WDVfT01SKTsgICAgICAgICAgLyogU2V0IHVwIGhhbGYgZHVwbGV4IGZvciBCTkMgKi8KKwkJb3V0bChvbXIgJiB+T01SX0ZEWCwgREU0WDVfT01SKTsKKwkgICAgfQorCSAgICBpcnFzID0gMDsKKwkgICAgaXJxX21hc2sgPSAwOworCSAgICBzdHMgPSB0ZXN0X21lZGlhKGRldixpcnFzLCBpcnFfbWFzaywgMCwgMCwgMCwgMTAwMCk7CisJICAgIGlmIChzdHMgPCAwKSB7CisJCW5leHRfdGljayA9IHN0cyAmIH5USU1FUl9DQjsKKwkgICAgfSBlbHNlIHsKKwkJbHAtPmxvY2FsX3N0YXRlKys7ICAgICAgICAgICAgIC8qIEVuc3VyZSBtZWRpYSBjb25uZWN0ZWQgKi8KKwkJbmV4dF90aWNrID0gZGMyMTE0eF9hdXRvY29uZihkZXYpOworCSAgICB9CisJICAgIGJyZWFrOworCSAgICAKKwljYXNlIDE6CisJICAgIGlmICghbHAtPnR4X2VuYWJsZSkgeworCQlpZiAoKHN0cyA9IHBpbmdfbWVkaWEoZGV2LCAzMDAwKSkgPCAwKSB7CisJCSAgICBuZXh0X3RpY2sgPSBzdHMgJiB+VElNRVJfQ0I7CisJCX0gZWxzZSB7CisJCSAgICBpZiAoc3RzKSB7CisJCQlscC0+bG9jYWxfc3RhdGUgPSAwOworCQkJbHAtPnRjb3VudCsrOworCQkJbHAtPm1lZGlhID0gSU5JVDsKKwkJICAgIH0gZWxzZSB7CisJCQlkZTR4NV9pbml0X2Nvbm5lY3Rpb24oZGV2KTsKKwkJICAgIH0KKwkJfQorCSAgICB9IGVsc2UgaWYgKCFscC0+bGlua09LICYmIChscC0+YXV0b3NlbnNlID09IEFVVE8pKSB7CisJCWxwLT5tZWRpYSA9IEJOQ19TVVNQRUNUOworCQluZXh0X3RpY2sgPSAzMDAwOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKwlicmVhazsKKwkKKyAgICBjYXNlIEJOQ19TVVNQRUNUOgorCW5leHRfdGljayA9IGRlNHg1X3N1c3BlY3Rfc3RhdGUoZGV2LCAxMDAwLCBCTkMsIHBpbmdfbWVkaWEsIGRjMjExNHhfYXV0b2NvbmYpOworCWJyZWFrOworCQorICAgIGNhc2UgU1BEX0RFVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaG9vc2UgMTBNYi9zIG9yIDEwME1iL3MgKi8KKwkgIGlmIChzcm9tX21hcF9tZWRpYShkZXYpIDwgMCkgeworCSAgICAgIGxwLT50Y291bnQrKzsKKwkgICAgICBscC0+bWVkaWEgPSBJTklUOworCSAgICAgIHJldHVybiBuZXh0X3RpY2s7CisJICB9CisJICBpZiAobHAtPm1lZGlhID09IF8xMDBNYikgeworCSAgICAgIGlmICgoc2xuayA9IHRlc3RfZm9yXzEwME1iKGRldiwgNjUwMCkpIDwgMCkgeworCQkgIGxwLT5tZWRpYSA9IFNQRF9ERVQ7CisJCSAgcmV0dXJuICAoc2xuayAmIH5USU1FUl9DQik7CisJICAgICAgfQorCSAgfSBlbHNlIHsKKwkgICAgICBpZiAod2FpdF9mb3JfbGluayhkZXYpIDwgMCkgeworCQkgIGxwLT5tZWRpYSA9IFNQRF9ERVQ7CisJCSAgcmV0dXJuIFBERVRfTElOS19XQUlUOworCSAgICAgIH0KKwkgIH0KKwkgIGlmIChscC0+bWVkaWEgPT0gQU5TKSB7ICAgICAgICAgICAvKiBEbyBNSUkgcGFyYWxsZWwgZGV0ZWN0aW9uICovCisJICAgICAgaWYgKGlzX3NwZF8xMDAoZGV2KSkgeworCQkgIGxwLT5tZWRpYSA9IF8xMDBNYjsKKwkgICAgICB9IGVsc2UgeworCQkgIGxwLT5tZWRpYSA9IF8xME1iOworCSAgICAgIH0KKwkgICAgICBuZXh0X3RpY2sgPSBkYzIxMTR4X2F1dG9jb25mKGRldik7CisJICB9IGVsc2UgaWYgKCgobHAtPm1lZGlhID09IF8xMDBNYikgJiYgaXNfMTAwX3VwKGRldikpIHx8CisJCSAgICAgKCgobHAtPm1lZGlhID09IF8xME1iKSB8fCAobHAtPm1lZGlhID09IFRQKSB8fAorCQkgICAgICAgKGxwLT5tZWRpYSA9PSBCTkMpICAgfHwgKGxwLT5tZWRpYSA9PSBBVUkpKSAmJiAKKwkJICAgICAgaXNfMTBfdXAoZGV2KSkpIHsKKwkgICAgICBuZXh0X3RpY2sgPSBkYzIxMTR4X2F1dG9jb25mKGRldik7CisJICB9IGVsc2UgeworCSAgICAgIGxwLT50Y291bnQrKzsKKwkgICAgICBscC0+bWVkaWEgPSBJTklUOworCSAgfQorCSAgYnJlYWs7CisJCisgICAgY2FzZSBfMTBNYjoKKyAgICAgICAgbmV4dF90aWNrID0gMzAwMDsKKwlpZiAoIWxwLT50eF9lbmFibGUpIHsKKwkgICAgU0VUXzEwTWI7CisJICAgIGRlNHg1X2luaXRfY29ubmVjdGlvbihkZXYpOworCX0gZWxzZSB7CisJICAgIGlmICghbHAtPmxpbmtPSyAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCQlpZiAoIWlzXzEwX3VwKGRldikgfHwgKCFscC0+dXNlU1JPTSAmJiBpc19zcGRfMTAwKGRldikpKSB7CisJCSAgICBscC0+bWVkaWEgPSBJTklUOworCQkgICAgbHAtPnRjb3VudCsrOworCQkgICAgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworCQl9CisJICAgIH0KKwl9CisJYnJlYWs7CisKKyAgICBjYXNlIF8xMDBNYjoKKyAgICAgICAgbmV4dF90aWNrID0gMzAwMDsKKwlpZiAoIWxwLT50eF9lbmFibGUpIHsKKwkgICAgU0VUXzEwME1iOworCSAgICBkZTR4NV9pbml0X2Nvbm5lY3Rpb24oZGV2KTsKKwl9IGVsc2UgeworCSAgICBpZiAoIWxwLT5saW5rT0sgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkJaWYgKCFpc18xMDBfdXAoZGV2KSB8fCAoIWxwLT51c2VTUk9NICYmICFpc19zcGRfMTAwKGRldikpKSB7CisJCSAgICBscC0+bWVkaWEgPSBJTklUOworCQkgICAgbHAtPnRjb3VudCsrOworCQkgICAgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworCQl9CisJICAgIH0KKwl9CisJYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCWxwLT50Y291bnQrKzsKK3ByaW50aygiSHVoPzogbWVkaWE6JTAyeFxuIiwgbHAtPm1lZGlhKTsKKwlscC0+bWVkaWEgPSBJTklUOworCWJyZWFrOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gbmV4dF90aWNrOworfQorCitzdGF0aWMgaW50Citzcm9tX2F1dG9jb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIHJldHVybiBscC0+aW5mb2xlYWZfZm4oZGV2KTsKK30KKworLyoKKyoqIFRoaXMgbWFwcGluZyBrZWVwcyB0aGUgb3JpZ2luYWwgbWVkaWEgY29kZXMgYW5kIEZEWCBmbGFnIHVuY2hhbmdlZC4KKyoqIFdoaWxlIGl0IGlzbid0IHN0cmljdGx5IG5lY2Vzc2FyeSwgaXQgaGVscHMgbWUgZm9yIHRoZSBtb21lbnQuLi4KKyoqIFRoZSBlYXJseSByZXR1cm4gYXZvaWRzIGEgbWVkaWEgc3RhdGUgLyBTUk9NIG1lZGlhIHNwYWNlIGNsYXNoLgorKi8KK3N0YXRpYyBpbnQKK3Nyb21fbWFwX21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIGxwLT5mZHggPSAwOworICAgIGlmIChscC0+aW5mb2Jsb2NrX21lZGlhID09IGxwLT5tZWRpYSkgCisgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaChscC0+aW5mb2Jsb2NrX21lZGlhKSB7CisgICAgICBjYXNlIFNST01fMTBCQVNFVEY6CisJaWYgKCFscC0+cGFyYW1zLmZkeCkgcmV0dXJuIC0xOworCWxwLT5mZHggPSBUUlVFOworICAgICAgY2FzZSBTUk9NXzEwQkFTRVQ6CisJaWYgKGxwLT5wYXJhbXMuZmR4ICYmICFscC0+ZmR4KSByZXR1cm4gLTE7CisJaWYgKChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSB8fCAoKGxwLT5jaGlwc2V0ICYgfjB4MDBmZikgPT0gREMyMTE0eCkpIHsKKwkgICAgbHAtPm1lZGlhID0gXzEwTWI7CisJfSBlbHNlIHsKKwkgICAgbHAtPm1lZGlhID0gVFA7CisJfQorCWJyZWFrOworCisgICAgICBjYXNlIFNST01fMTBCQVNFMjoKKwlscC0+bWVkaWEgPSBCTkM7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgU1JPTV8xMEJBU0U1OgorCWxwLT5tZWRpYSA9IEFVSTsKKwlicmVhazsKKworICAgICAgY2FzZSBTUk9NXzEwMEJBU0VURjoKKyAgICAgICAgaWYgKCFscC0+cGFyYW1zLmZkeCkgcmV0dXJuIC0xOworCWxwLT5mZHggPSBUUlVFOworICAgICAgY2FzZSBTUk9NXzEwMEJBU0VUOgorCWlmIChscC0+cGFyYW1zLmZkeCAmJiAhbHAtPmZkeCkgcmV0dXJuIC0xOworCWxwLT5tZWRpYSA9IF8xMDBNYjsKKwlicmVhazsKKworICAgICAgY2FzZSBTUk9NXzEwMEJBU0VUNDoKKwlscC0+bWVkaWEgPSBfMTAwTWI7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgU1JPTV8xMDBCQVNFRkY6CisJaWYgKCFscC0+cGFyYW1zLmZkeCkgcmV0dXJuIC0xOworCWxwLT5mZHggPSBUUlVFOworICAgICAgY2FzZSBTUk9NXzEwMEJBU0VGOiAKKwlpZiAobHAtPnBhcmFtcy5mZHggJiYgIWxwLT5mZHgpIHJldHVybiAtMTsKKwlscC0+bWVkaWEgPSBfMTAwTWI7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgQU5TOgorCWxwLT5tZWRpYSA9IEFOUzsKKwlscC0+ZmR4ID0gbHAtPnBhcmFtcy5mZHg7CisJYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6IAorCXByaW50aygiJXM6IEJhZCBtZWRpYSBjb2RlIFslZF0gZGV0ZWN0ZWQgaW4gU1JPTSFcbiIsIGRldi0+bmFtZSwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+aW5mb2Jsb2NrX21lZGlhKTsKKwlyZXR1cm4gLTE7CisJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitkZTR4NV9pbml0X2Nvbm5lY3Rpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1X2xvbmcgZmxhZ3MgPSAwOworCisgICAgaWYgKGxwLT5tZWRpYSAhPSBscC0+Y19tZWRpYSkgeworICAgICAgICBkZTR4NV9kYmdfbWVkaWEoZGV2KTsKKwlscC0+Y19tZWRpYSA9IGxwLT5tZWRpYTsgICAgICAgICAgLyogU3RvcCBzY3JvbGxpbmcgbWVkaWEgbWVzc2FnZXMgKi8KKyAgICB9CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICBkZTR4NV9yc3RfZGVzY19yaW5nKGRldik7CisgICAgZGU0eDVfc2V0dXBfaW50cihkZXYpOworICAgIGxwLT50eF9lbmFibGUgPSBZRVM7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICBvdXRsKFBPTExfREVNQU5ELCBERTRYNV9UUEQpOworCisgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisgICAgcmV0dXJuOworfQorCisvKgorKiogR2VuZXJhbCBQSFkgcmVzZXQgZnVuY3Rpb24uIFNvbWUgTUlJIGRldmljZXMgZG9uJ3QgcmVzZXQgY29ycmVjdGx5CisqKiBzaW5jZSB0aGVpciBNSUkgYWRkcmVzcyBwaW5zIGNhbiBmbG9hdCBhdCB2b2x0YWdlcyB0aGF0IGFyZSBkZXBlbmRlbnQKKyoqIG9uIHRoZSBzaWduYWwgcGluIHVzZS4gRG8gYSBkb3VibGUgcmVzZXQgdG8gZW5zdXJlIGEgcmVzZXQuCisqLworc3RhdGljIGludAorZGU0eDVfcmVzZXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IG5leHRfdGljayA9IDA7CisKKyAgICBpZiAoKGxwLT51c2VTUk9NKSB8fCAobHAtPnBoeVtscC0+YWN0aXZlXS5pZCkpIHsKKwlpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJICAgIGlmIChscC0+dXNlU1JPTSkgeworCQlpZiAobHAtPnBoeVtscC0+YWN0aXZlXS5yc3QpIHsKKwkJICAgIHNyb21fZXhlYyhkZXYsIGxwLT5waHlbbHAtPmFjdGl2ZV0ucnN0KTsKKwkJICAgIHNyb21fZXhlYyhkZXYsIGxwLT5waHlbbHAtPmFjdGl2ZV0ucnN0KTsKKwkJfSBlbHNlIGlmIChscC0+cnN0KSB7ICAgICAgICAgIC8qIFR5cGUgNSBpbmZvYmxvY2sgcmVzZXQgKi8KKwkJICAgIHNyb21fZXhlYyhkZXYsIGxwLT5yc3QpOworCQkgICAgc3JvbV9leGVjKGRldiwgbHAtPnJzdCk7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJUEhZX0hBUkRfUkVTRVQ7CisJICAgIH0KKwkgICAgaWYgKGxwLT51c2VNSUkpIHsKKwkgICAgICAgIG1paV93cihNSUlfQ1JfUlNULCBNSUlfQ1IsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCWlmIChscC0+dXNlTUlJKSB7CisJICAgIG5leHRfdGljayA9IHRlc3RfbWlpX3JlZyhkZXYsIE1JSV9DUiwgTUlJX0NSX1JTVCwgRkFMU0UsIDUwMCk7CisJfQorICAgIH0gZWxzZSBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTE0MCkgeworCVBIWV9IQVJEX1JFU0VUOworICAgIH0KKworICAgIHJldHVybiBuZXh0X3RpY2s7Cit9CisKK3N0YXRpYyBpbnQKK3Rlc3RfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgczMyIGlycXMsIHMzMiBpcnFfbWFzaywgczMyIGNzcjEzLCBzMzIgY3NyMTQsIHMzMiBjc3IxNSwgczMyIG1zZWMpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgczMyIHN0cywgY3NyMTI7CisgICAgCisgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCWxwLT50aW1lb3V0ID0gbXNlYy8xMDA7CisJaWYgKCFscC0+dXNlU1JPTSkgeyAgICAgIC8qIEFscmVhZHkgZG9uZSBpZiBieSBTUk9NLCBlbHNlIGRjMjEwNFswMV0gKi8KKwkgICAgcmVzZXRfaW5pdF9zaWEoZGV2LCBjc3IxMywgY3NyMTQsIGNzcjE1KTsKKwl9CisKKwkvKiBzZXQgdXAgdGhlIGludGVycnVwdCBtYXNrICovCisJb3V0bChpcnFfbWFzaywgREU0WDVfSU1SKTsKKworCS8qIGNsZWFyIGFsbCBwZW5kaW5nIGludGVycnVwdHMgKi8KKwlzdHMgPSBpbmwoREU0WDVfU1RTKTsKKwlvdXRsKHN0cywgREU0WDVfU1RTKTsKKwkKKwkvKiBjbGVhciBjc3IxMiBOUkEgYW5kIFNSQSBiaXRzICovCisJaWYgKChscC0+Y2hpcHNldCA9PSBEQzIxMDQxKSB8fCBscC0+dXNlU1JPTSkgeworCSAgICBjc3IxMiA9IGlubChERTRYNV9TSVNSKTsKKwkgICAgb3V0bChjc3IxMiwgREU0WDVfU0lTUik7CisJfQorICAgIH0KKyAgICAKKyAgICBzdHMgPSBpbmwoREU0WDVfU1RTKSAmIH5USU1FUl9DQjsKKyAgICAKKyAgICBpZiAoIShzdHMgJiBpcnFzKSAmJiAtLWxwLT50aW1lb3V0KSB7CisJc3RzID0gMTAwIHwgVElNRVJfQ0I7CisgICAgfSBlbHNlIHsKKwlscC0+dGltZW91dCA9IC0xOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3RzOworfQorCitzdGF0aWMgaW50Cit0ZXN0X3RwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHMzMiBtc2VjKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBzaXNyOworICAgIAorICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwlscC0+dGltZW91dCA9IG1zZWMvMTAwOworICAgIH0KKyAgICAKKyAgICBzaXNyID0gKGlubChERTRYNV9TSVNSKSAmIH5USU1FUl9DQikgJiAoU0lTUl9MS0YgfCBTSVNSX05DUik7CisKKyAgICBpZiAoc2lzciAmJiAtLWxwLT50aW1lb3V0KSB7CisJc2lzciA9IDEwMCB8IFRJTUVSX0NCOworICAgIH0gZWxzZSB7CisJbHAtPnRpbWVvdXQgPSAtMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNpc3I7Cit9CisKKy8qCisqKiBTYW1wbGVzIHRoZSAxMDBNYiBMaW5rIFN0YXRlIFNpZ25hbC4gVGhlIHNhbXBsZSBpbnRlcnZhbCBpcyBpbXBvcnRhbnQKKyoqIGJlY2F1c2UgdG9vIGZhc3QgYSByYXRlIGNhbiBnaXZlIGVycm9uZW91cyByZXN1bHRzIGFuZCBjb25mdXNlIHRoZQorKiogc3BlZWQgc2Vuc2UgYWxnb3JpdGhtLgorKi8KKyNkZWZpbmUgU0FNUExFX0lOVEVSVkFMIDUwMCAgLyogbXMgKi8KKyNkZWZpbmUgU0FNUExFX0RFTEFZICAgIDIwMDAgLyogbXMgKi8KK3N0YXRpYyBpbnQKK3Rlc3RfZm9yXzEwME1iKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtc2VjKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGdlcCA9IDAsIHJldCA9ICgobHAtPmNoaXBzZXQgJiB+MHgwMGZmKT09REMyMTE0eD8gLTEgOkdFUF9TTE5LKTsKKworICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwlpZiAoKG1zZWMvU0FNUExFX0lOVEVSVkFMKSA8PSAwKSByZXR1cm4gMDsKKwlpZiAobXNlYyA+IFNBTVBMRV9ERUxBWSkgeworCSAgICBscC0+dGltZW91dCA9IChtc2VjIC0gU0FNUExFX0RFTEFZKS9TQU1QTEVfSU5URVJWQUw7CisJICAgIGdlcCA9IFNBTVBMRV9ERUxBWSB8IFRJTUVSX0NCOworCSAgICByZXR1cm4gZ2VwOworCX0gZWxzZSB7CisJICAgIGxwLT50aW1lb3V0ID0gbXNlYy9TQU1QTEVfSU5URVJWQUw7CisJfQorICAgIH0KKyAgICAKKyAgICBpZiAobHAtPnBoeVtscC0+YWN0aXZlXS5pZCB8fCBscC0+dXNlU1JPTSkgeworCWdlcCA9IGlzXzEwMF91cChkZXYpIHwgaXNfc3BkXzEwMChkZXYpOworICAgIH0gZWxzZSB7CisJZ2VwID0gKH5nZXBfcmQoZGV2KSAmIChHRVBfU0xOSyB8IEdFUF9MTlApKTsKKyAgICB9CisgICAgaWYgKCEoZ2VwICYgcmV0KSAmJiAtLWxwLT50aW1lb3V0KSB7CisJZ2VwID0gU0FNUExFX0lOVEVSVkFMIHwgVElNRVJfQ0I7CisgICAgfSBlbHNlIHsKKwlscC0+dGltZW91dCA9IC0xOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gZ2VwOworfQorCitzdGF0aWMgaW50Cit3YWl0X2Zvcl9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwlscC0+dGltZW91dCA9IDE7CisgICAgfQorICAgIAorICAgIGlmIChscC0+dGltZW91dC0tKSB7CisJcmV0dXJuIFRJTUVSX0NCOworICAgIH0gZWxzZSB7CisJbHAtPnRpbWVvdXQgPSAtMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisqKgorKioKKyovCitzdGF0aWMgaW50Cit0ZXN0X21paV9yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJlZywgaW50IG1hc2ssIGludCBwb2wsIGxvbmcgbXNlYykKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCB0ZXN0OworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKyAgICBpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJbHAtPnRpbWVvdXQgPSBtc2VjLzEwMDsKKyAgICB9CisgICAgCisgICAgaWYgKHBvbCkgcG9sID0gfjA7CisgICAgcmVnID0gbWlpX3JkKCh1X2NoYXIpcmVnLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSkgJiBtYXNrOworICAgIHRlc3QgPSAocmVnIF4gcG9sKSAmIG1hc2s7CisgICAgCisgICAgaWYgKHRlc3QgJiYgLS1scC0+dGltZW91dCkgeworCXJlZyA9IDEwMCB8IFRJTUVSX0NCOworICAgIH0gZWxzZSB7CisJbHAtPnRpbWVvdXQgPSAtMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlZzsKK30KKworc3RhdGljIGludAoraXNfc3BkXzEwMChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBzcGQ7CisgICAgCisgICAgaWYgKGxwLT51c2VNSUkpIHsKKwlzcGQgPSBtaWlfcmQobHAtPnBoeVtscC0+YWN0aXZlXS5zcGQucmVnLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJc3BkID0gfihzcGQgXiBscC0+cGh5W2xwLT5hY3RpdmVdLnNwZC52YWx1ZSk7CisJc3BkICY9IGxwLT5waHlbbHAtPmFjdGl2ZV0uc3BkLm1hc2s7CisgICAgfSBlbHNlIGlmICghbHAtPnVzZVNST00pIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGU1MDAteGEgKi8KKwlzcGQgPSAoKH5nZXBfcmQoZGV2KSkgJiBHRVBfU0xOSyk7CisgICAgfSBlbHNlIHsKKwlpZiAoKGxwLT5pYm4gPT0gMikgfHwgIWxwLT5hc0JpdFZhbGlkKQorCSAgICByZXR1cm4gKChscC0+Y2hpcHNldCA9PSBEQzIxMTQzKT8ofmlubChERTRYNV9TSVNSKSZTSVNSX0xTMTAwKTowKTsKKworCXNwZCA9IChscC0+YXNCaXRWYWxpZCAmIChscC0+YXNQb2xhcml0eSBeIChnZXBfcmQoZGV2KSAmIGxwLT5hc0JpdCkpKSB8CisJICAgICAgICAgIChscC0+bGlua09LICYgfmxwLT5hc0JpdFZhbGlkKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNwZDsKK30KKworc3RhdGljIGludAoraXNfMTAwX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgCisgICAgaWYgKGxwLT51c2VNSUkpIHsKKwkvKiBEb3VibGUgcmVhZCBmb3Igc3RpY2t5IGJpdHMgJiB0ZW1wb3JhcnkgZHJvcHMgKi8KKwltaWlfcmQoTUlJX1NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJcmV0dXJuIChtaWlfcmQoTUlJX1NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSkgJiBNSUlfU1JfTEtTKTsKKyAgICB9IGVsc2UgaWYgKCFscC0+dXNlU1JPTSkgeyAgICAgICAgICAgICAgICAgICAgICAgLyogZGU1MDAteGEgKi8KKwlyZXR1cm4gKCh+Z2VwX3JkKGRldikpICYgR0VQX1NMTkspOworICAgIH0gZWxzZSB7CisJaWYgKChscC0+aWJuID09IDIpIHx8ICFscC0+YXNCaXRWYWxpZCkKKwkgICAgcmV0dXJuICgobHAtPmNoaXBzZXQgPT0gREMyMTE0Myk/KH5pbmwoREU0WDVfU0lTUikmU0lTUl9MUzEwMCk6MCk7CisKKyAgICAgICAgcmV0dXJuICgobHAtPmFzQml0VmFsaWQmKGxwLT5hc1BvbGFyaXR5XihnZXBfcmQoZGV2KSZscC0+YXNCaXQpKSkgfAorCQkobHAtPmxpbmtPSyAmIH5scC0+YXNCaXRWYWxpZCkpOworICAgIH0KK30KKworc3RhdGljIGludAoraXNfMTBfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKyAgICBpZiAobHAtPnVzZU1JSSkgeworCS8qIERvdWJsZSByZWFkIGZvciBzdGlja3kgYml0cyAmIHRlbXBvcmFyeSBkcm9wcyAqLworCW1paV9yZChNSUlfU1IsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTsKKwlyZXR1cm4gKG1paV9yZChNSUlfU1IsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKSAmIE1JSV9TUl9MS1MpOworICAgIH0gZWxzZSBpZiAoIWxwLT51c2VTUk9NKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBkZTUwMC14YSAqLworCXJldHVybiAoKH5nZXBfcmQoZGV2KSkgJiBHRVBfTE5QKTsKKyAgICB9IGVsc2UgeworCWlmICgobHAtPmlibiA9PSAyKSB8fCAhbHAtPmFzQml0VmFsaWQpCisJICAgIHJldHVybiAoKChscC0+Y2hpcHNldCAmIH4weDAwZmYpID09IERDMjExNHgpID8KKwkJICAgICh+aW5sKERFNFg1X1NJU1IpJlNJU1JfTFMxMCk6CisJCSAgICAwKTsKKworCXJldHVybiAoKGxwLT5hc0JpdFZhbGlkJihscC0+YXNQb2xhcml0eV4oZ2VwX3JkKGRldikmbHAtPmFzQml0KSkpIHwKKwkJKGxwLT5saW5rT0sgJiB+bHAtPmFzQml0VmFsaWQpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2lzX2FuY19jYXBhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgCisgICAgaWYgKGxwLT5waHlbbHAtPmFjdGl2ZV0uaWQgJiYgKCFscC0+dXNlU1JPTSB8fCBscC0+dXNlTUlJKSkgeworCXJldHVybiAobWlpX3JkKE1JSV9TUiwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpKTsKKyAgICB9IGVsc2UgaWYgKChscC0+Y2hpcHNldCAmIH4weDAwZmYpID09IERDMjExNHgpIHsKKwlyZXR1cm4gKGlubChERTRYNV9TSVNSKSAmIFNJU1JfTFBOKSA+PiAxMjsKKyAgICB9IGVsc2UgeworCXJldHVybiAwOworICAgIH0KK30KKworLyoKKyoqIFNlbmQgYSBwYWNrZXQgb250byB0aGUgbWVkaWEgYW5kIHdhdGNoIGZvciBzZW5kIGVycm9ycyB0aGF0IGluZGljYXRlIHRoZQorKiogbWVkaWEgaXMgYmFkIG9yIHVuY29ubmVjdGVkLgorKi8KK3N0YXRpYyBpbnQKK3BpbmdfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1zZWMpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IHNpc3I7CisgICAgCisgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCWxwLT50aW1lb3V0ID0gbXNlYy8xMDA7CisJCisJbHAtPnRtcCA9IGxwLT50eF9uZXc7ICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHRoZSByaW5nIHBvc2l0aW9uICovCisJbG9hZF9wYWNrZXQoZGV2LCBscC0+ZnJhbWUsIFREX0xTIHwgVERfRlMgfCBzaXplb2YobHAtPmZyYW1lKSwgKHN0cnVjdCBza19idWZmICopMSk7CisJbHAtPnR4X25ldyA9ICgrK2xwLT50eF9uZXcpICUgbHAtPnR4UmluZ1NpemU7CisJb3V0bChQT0xMX0RFTUFORCwgREU0WDVfVFBEKTsKKyAgICB9CisgICAgCisgICAgc2lzciA9IGlubChERTRYNV9TSVNSKTsKKworICAgIGlmICgoIShzaXNyICYgU0lTUl9OQ1IpKSAmJiAKKwkoKHMzMilsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tscC0+dG1wXS5zdGF0dXMpIDwgMCkgJiYgCisJICgtLWxwLT50aW1lb3V0KSkgeworCXNpc3IgPSAxMDAgfCBUSU1FUl9DQjsKKyAgICB9IGVsc2UgeworCWlmICgoIShzaXNyICYgU0lTUl9OQ1IpKSAmJiAKKwkgICAgIShsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tscC0+dG1wXS5zdGF0dXMpICYgKFRfT1dOIHwgVERfRVMpKSAmJgorCSAgICBscC0+dGltZW91dCkgeworCSAgICBzaXNyID0gMDsKKwl9IGVsc2UgeworCSAgICBzaXNyID0gMTsKKwl9CisJbHAtPnRpbWVvdXQgPSAtMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNpc3I7Cit9CisKKy8qCisqKiBUaGlzIGZ1bmN0aW9uIGRvZXMgMiB0aGluZ3M6IG9uIEludGVscyBpdCBrbWFsbG9jJ3MgYW5vdGhlciBidWZmZXIgdG8KKyoqIHJlcGxhY2UgdGhlIG9uZSBhYm91dCB0byBiZSBwYXNzZWQgdXAuIE9uIEFscGhhJ3MgaXQga21hbGxvY3MgYSBidWZmZXIKKyoqIGludG8gd2hpY2ggdGhlIHBhY2tldCBpcyBjb3BpZWQuCisqLworc3RhdGljIHN0cnVjdCBza19idWZmICoKK2RlNHg1X2FsbG9jX3J4X2J1ZmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluZGV4LCBpbnQgbGVuKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgc3RydWN0IHNrX2J1ZmYgKnA7CisKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pICYmICFkZWZpbmVkKF9fcG93ZXJwY19fKSAmJiAhZGVmaW5lZChfX3NwYXJjX3Y5X18pICYmICFkZWZpbmVkKERFNFg1X0RPX01FTUNQWSkKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqcmV0OworICAgIHVfbG9uZyBpPTAsIHRtcDsKKworICAgIHAgPSBkZXZfYWxsb2Nfc2tiKElFRUU4MDJfM19TWiArIERFNFg1X0FMSUdOICsgMik7CisgICAgaWYgKCFwKSByZXR1cm4gTlVMTDsKKworICAgIHAtPmRldiA9IGRldjsKKyAgICB0bXAgPSB2aXJ0X3RvX2J1cyhwLT5kYXRhKTsKKyAgICBpID0gKCh0bXAgKyBERTRYNV9BTElHTikgJiB+REU0WDVfQUxJR04pIC0gdG1wOworICAgIHNrYl9yZXNlcnZlKHAsIGkpOworICAgIGxwLT5yeF9yaW5nW2luZGV4XS5idWYgPSBjcHVfdG9fbGUzMih0bXAgKyBpKTsKKworICAgIHJldCA9IGxwLT5yeF9za2JbaW5kZXhdOworICAgIGxwLT5yeF9za2JbaW5kZXhdID0gcDsKKworICAgIGlmICgodV9sb25nKSByZXQgPiAxKSB7CisJc2tiX3B1dChyZXQsIGxlbik7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKworI2Vsc2UKKyAgICBpZiAobHAtPnN0YXRlICE9IE9QRU4pIHJldHVybiAoc3RydWN0IHNrX2J1ZmYgKikxOyAvKiBGYWtlIG91dCB0aGUgb3BlbiAqLworCisgICAgcCA9IGRldl9hbGxvY19za2IobGVuICsgMik7CisgICAgaWYgKCFwKSByZXR1cm4gTlVMTDsKKworICAgIHAtPmRldiA9IGRldjsKKyAgICBza2JfcmVzZXJ2ZShwLCAyKTsJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsaWduICovCisgICAgaWYgKGluZGV4IDwgbHAtPnJ4X29sZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV3JhcHBlZCBidWZmZXIgKi8KKwlzaG9ydCB0bGVuID0gKGxwLT5yeFJpbmdTaXplIC0gbHAtPnJ4X29sZCkgKiBSWF9CVUZGX1NaOworCW1lbWNweShza2JfcHV0KHAsdGxlbiksbHAtPnJ4X2J1ZnMgKyBscC0+cnhfb2xkICogUlhfQlVGRl9TWix0bGVuKTsKKwltZW1jcHkoc2tiX3B1dChwLGxlbi10bGVuKSxscC0+cnhfYnVmcyxsZW4tdGxlbik7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGluZWFyIGJ1ZmZlciAqLworCW1lbWNweShza2JfcHV0KHAsbGVuKSxscC0+cnhfYnVmcyArIGxwLT5yeF9vbGQgKiBSWF9CVUZGX1NaLGxlbik7CisgICAgfQorCQkgICAgCisgICAgcmV0dXJuIHA7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X2ZyZWVfcnhfYnVmZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGk8bHAtPnJ4UmluZ1NpemU7IGkrKykgeworCWlmICgodV9sb25nKSBscC0+cnhfc2tiW2ldID4gMSkgeworCSAgICBkZXZfa2ZyZWVfc2tiKGxwLT5yeF9za2JbaV0pOworCX0KKwlscC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOworCWxwLT5yeF9za2JbaV0gPSAoc3RydWN0IHNrX2J1ZmYgKikxOyAgICAvKiBEdW1teSBlbnRyeSAqLworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X2ZyZWVfdHhfYnVmZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGk8bHAtPnR4UmluZ1NpemU7IGkrKykgeworCWlmIChscC0+dHhfc2tiW2ldKQorCSAgICBkZTR4NV9mcmVlX3R4X2J1ZmYobHAsIGkpOworCWxwLT50eF9yaW5nW2ldLnN0YXR1cyA9IDA7CisgICAgfQorCisgICAgLyogVW5sb2FkIHRoZSBsb2NhbGx5IHF1ZXVlZCBwYWNrZXRzICovCisgICAgd2hpbGUgKGxwLT5jYWNoZS5za2IpIHsKKwlkZXZfa2ZyZWVfc2tiKGRlNHg1X2dldF9jYWNoZShkZXYpKTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qCisqKiBXaGVuIGEgdXNlciBwdWxscyBhIGNvbm5lY3Rpb24sIHRoZSBERUNjaGlwIGNhbiBlbmQgdXAgaW4gYQorKiogJ3J1bm5pbmcgLSB3YWl0aW5nIGZvciBlbmQgb2YgdHJhbnNtaXNzaW9uJyBzdGF0ZS4gVGhpcyBtZWFucyB0aGF0IHdlCisqKiBoYXZlIHRvIHBlcmZvcm0gYSBjaGlwIHNvZnQgcmVzZXQgdG8gZW5zdXJlIHRoYXQgd2UgY2FuIHN5bmNocm9uaXplCisqKiB0aGUgaGFyZHdhcmUgYW5kIHNvZnR3YXJlIGFuZCBtYWtlIGFueSBtZWRpYSBwcm9iZXMgdXNpbmcgYSBsb29wYmFjaworKiogcGFja2V0IG1lYW5pbmdmdWwuCisqLworc3RhdGljIHZvaWQKK2RlNHg1X3NhdmVfc2ticyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIHMzMiBvbXI7CisKKyAgICBpZiAoIWxwLT5jYWNoZS5zYXZlX2NudCkgeworCVNUT1BfREU0WDU7CisJZGU0eDVfdHgoZGV2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsdXNoIGFueSBzZW50IHNrYidzICovCisJZGU0eDVfZnJlZV90eF9idWZmcyhkZXYpOworCWRlNHg1X2NhY2hlX3N0YXRlKGRldiwgREU0WDVfU0FWRV9TVEFURSk7CisJZGU0eDVfc3dfcmVzZXQoZGV2KTsKKwlkZTR4NV9jYWNoZV9zdGF0ZShkZXYsIERFNFg1X1JFU1RPUkVfU1RBVEUpOworCWxwLT5jYWNoZS5zYXZlX2NudCsrOworCVNUQVJUX0RFNFg1OworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X3JzdF9kZXNjX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaTsKKyAgICBzMzIgb21yOworCisgICAgaWYgKGxwLT5jYWNoZS5zYXZlX2NudCkgeworCVNUT1BfREU0WDU7CisJb3V0bChscC0+ZG1hX3JpbmdzLCBERTRYNV9SUkJBKTsKKwlvdXRsKGxwLT5kbWFfcmluZ3MgKyBOVU1fUlhfREVTQyAqIHNpemVvZihzdHJ1Y3QgZGU0eDVfZGVzYyksCisJICAgICBERTRYNV9UUkJBKTsKKyAgICAKKwlscC0+cnhfbmV3ID0gbHAtPnJ4X29sZCA9IDA7CisJbHAtPnR4X25ldyA9IGxwLT50eF9vbGQgPSAwOworICAgIAorCWZvciAoaSA9IDA7IGkgPCBscC0+cnhSaW5nU2l6ZTsgaSsrKSB7CisJICAgIGxwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IGNwdV90b19sZTMyKFJfT1dOKTsKKwl9CisgICAgCisJZm9yIChpID0gMDsgaSA8IGxwLT50eFJpbmdTaXplOyBpKyspIHsKKwkgICAgbHAtPnR4X3JpbmdbaV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoMCk7CisJfQorICAgIAorCWJhcnJpZXIoKTsKKwlscC0+Y2FjaGUuc2F2ZV9jbnQtLTsKKwlTVEFSVF9ERTRYNTsKKyAgICB9CisgICAgICAgIAorICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X2NhY2hlX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmbGFnKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisgICAgc3dpdGNoKGZsYWcpIHsKKyAgICAgIGNhc2UgREU0WDVfU0FWRV9TVEFURToKKwlscC0+Y2FjaGUuY3NyMCA9IGlubChERTRYNV9CTVIpOworCWxwLT5jYWNoZS5jc3I2ID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfU1QgfCBPTVJfU1IpKTsKKwlscC0+Y2FjaGUuY3NyNyA9IGlubChERTRYNV9JTVIpOworCWJyZWFrOworCisgICAgICBjYXNlIERFNFg1X1JFU1RPUkVfU1RBVEU6CisJb3V0bChscC0+Y2FjaGUuY3NyMCwgREU0WDVfQk1SKTsKKwlvdXRsKGxwLT5jYWNoZS5jc3I2LCBERTRYNV9PTVIpOworCW91dGwobHAtPmNhY2hlLmNzcjcsIERFNFg1X0lNUik7CisJaWYgKGxwLT5jaGlwc2V0ID09IERDMjExNDApIHsKKwkgICAgZ2VwX3dyKGxwLT5jYWNoZS5nZXBjLCBkZXYpOworCSAgICBnZXBfd3IobHAtPmNhY2hlLmdlcCwgZGV2KTsKKwl9IGVsc2UgeworCSAgICByZXNldF9pbml0X3NpYShkZXYsIGxwLT5jYWNoZS5jc3IxMywgbHAtPmNhY2hlLmNzcjE0LCAKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPmNhY2hlLmNzcjE1KTsKKwl9CisJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGU0eDVfcHV0X2NhY2hlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqcDsKKworICAgIGlmIChscC0+Y2FjaGUuc2tiKSB7CisJZm9yIChwPWxwLT5jYWNoZS5za2I7IHAtPm5leHQ7IHA9cC0+bmV4dCk7CisJcC0+bmV4dCA9IHNrYjsKKyAgICB9IGVsc2UgeworCWxwLT5jYWNoZS5za2IgPSBza2I7CisgICAgfQorICAgIHNrYi0+bmV4dCA9IE5VTEw7CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkZTR4NV9wdXRiX2NhY2hlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCA9IGxwLT5jYWNoZS5za2I7CisKKyAgICBscC0+Y2FjaGUuc2tiID0gc2tiOworICAgIHNrYi0+bmV4dCA9IHA7CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitkZTR4NV9nZXRfY2FjaGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHN0cnVjdCBza19idWZmICpwID0gbHAtPmNhY2hlLnNrYjsKKworICAgIGlmIChwKSB7CisJbHAtPmNhY2hlLnNrYiA9IHAtPm5leHQ7CisJcC0+bmV4dCA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisKKy8qCisqKiBDaGVjayB0aGUgQXV0byBOZWdvdGlhdGlvbiBTdGF0ZS4gUmV0dXJuIE9LIHdoZW4gYSBsaW5rIHBhc3MgaW50ZXJydXB0CisqKiBpcyByZWNlaXZlZCBhbmQgdGhlIGF1dG8tbmVnb3RpYXRpb24gc3RhdHVzIGlzIE5XQVkgT0suCisqLworc3RhdGljIGludAordGVzdF9hbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgczMyIGlycXMsIHMzMiBpcnFfbWFzaywgczMyIG1zZWMpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgczMyIHN0cywgYW5zOworICAgIAorICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwlscC0+dGltZW91dCA9IG1zZWMvMTAwOworCW91dGwoaXJxX21hc2ssIERFNFg1X0lNUik7CisJCisJLyogY2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXN0cyA9IGlubChERTRYNV9TVFMpOworCW91dGwoc3RzLCBERTRYNV9TVFMpOworICAgIH0KKyAgICAKKyAgICBhbnMgPSBpbmwoREU0WDVfU0lTUikgJiBTSVNSX0FOUzsKKyAgICBzdHMgPSBpbmwoREU0WDVfU1RTKSAmIH5USU1FUl9DQjsKKyAgICAKKyAgICBpZiAoIShzdHMgJiBpcnFzKSAmJiAoYW5zIF4gQU5TX05XT0spICYmIC0tbHAtPnRpbWVvdXQpIHsKKwlzdHMgPSAxMDAgfCBUSU1FUl9DQjsKKyAgICB9IGVsc2UgeworCWxwLT50aW1lb3V0ID0gLTE7CisgICAgfQorICAgIAorICAgIHJldHVybiBzdHM7Cit9CisKK3N0YXRpYyB2b2lkCitkZTR4NV9zZXR1cF9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgczMyIGltciwgc3RzOworICAgIAorICAgIGlmIChpbmwoREU0WDVfT01SKSAmIE9NUl9TUikgeyAgIC8qIE9ubHkgdW5tYXNrIGlmIFRYL1JYIGlzIGVuYWJsZWQgKi8KKwlpbXIgPSAwOworCVVOTUFTS19JUlFzOworCXN0cyA9IGlubChERTRYNV9TVFMpOyAgICAgICAgLyogUmVzZXQgYW55IHBlbmRpbmcgKHN0YWxlKSBpbnRlcnJ1cHRzICovCisJb3V0bChzdHMsIERFNFg1X1NUUyk7CisJRU5BQkxFX0lSUXM7CisgICAgfQorICAgIAorICAgIHJldHVybjsKK30KKworLyoKKyoqCisqLworc3RhdGljIHZvaWQKK3Jlc2V0X2luaXRfc2lhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHMzMiBjc3IxMywgczMyIGNzcjE0LCBzMzIgY3NyMTUpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBSRVNFVF9TSUE7CisgICAgaWYgKGxwLT51c2VTUk9NKSB7CisJaWYgKGxwLT5pYm4gPT0gMykgeworCSAgICBzcm9tX2V4ZWMoZGV2LCBscC0+cGh5W2xwLT5hY3RpdmVdLnJzdCk7CisJICAgIHNyb21fZXhlYyhkZXYsIGxwLT5waHlbbHAtPmFjdGl2ZV0uZ2VwKTsKKwkgICAgb3V0bCgxLCBERTRYNV9TSUNSKTsKKwkgICAgcmV0dXJuOworCX0gZWxzZSB7CisJICAgIGNzcjE1ID0gbHAtPmNhY2hlLmNzcjE1OworCSAgICBjc3IxNCA9IGxwLT5jYWNoZS5jc3IxNDsKKwkgICAgY3NyMTMgPSBscC0+Y2FjaGUuY3NyMTM7CisJICAgIG91dGwoY3NyMTUgfCBscC0+Y2FjaGUuZ2VwYywgREU0WDVfU0lHUik7CisJICAgIG91dGwoY3NyMTUgfCBscC0+Y2FjaGUuZ2VwLCBERTRYNV9TSUdSKTsKKwl9CisgICAgfSBlbHNlIHsKKwlvdXRsKGNzcjE1LCBERTRYNV9TSUdSKTsKKyAgICB9CisgICAgb3V0bChjc3IxNCwgREU0WDVfU1RSUik7CisgICAgb3V0bChjc3IxMywgREU0WDVfU0lDUik7CisKKyAgICBtZGVsYXkoMTApOworCisgICAgcmV0dXJuOworfQorCisvKgorKiogQ3JlYXRlIGEgbG9vcGJhY2sgZXRoZXJuZXQgcGFja2V0CisqLworc3RhdGljIHZvaWQKK2NyZWF0ZV9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqZnJhbWUsIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgY2hhciAqYnVmID0gZnJhbWU7CisgICAgCisgICAgZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeyAgICAgICAgICAgICAvKiBVc2UgdGhpcyBzb3VyY2UgYWRkcmVzcyAqLworCSpidWYrKyA9IGRldi0+ZGV2X2FkZHJbaV07CisgICAgfQorICAgIGZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsgICAgICAgICAgICAgLyogVXNlIHRoaXMgZGVzdGluYXRpb24gYWRkcmVzcyAqLworCSpidWYrKyA9IGRldi0+ZGV2X2FkZHJbaV07CisgICAgfQorICAgIAorICAgICpidWYrKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFja2V0IGxlbmd0aCAoMiBieXRlcykgKi8KKyAgICAqYnVmKysgPSAxOworICAgIAorICAgIHJldHVybjsKK30KKworLyoKKyoqIExvb2sgZm9yIGEgcGFydGljdWxhciBib2FyZCBuYW1lIGluIHRoZSBFSVNBIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyovCitzdGF0aWMgaW50CitFSVNBX3NpZ25hdHVyZShjaGFyICpuYW1lLCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisgICAgaW50IGksIHN0YXR1cyA9IDAsIHNpZ2xlbiA9IHNpemVvZihkZTR4NV9zaWduYXR1cmVzKS9zaXplb2YoY19jaGFyICopOworICAgIHN0cnVjdCBlaXNhX2RldmljZSAqZWRldjsKKworICAgICpuYW1lID0gJ1wwJzsKKyAgICBlZGV2ID0gdG9fZWlzYV9kZXZpY2UgKGRldmljZSk7CisgICAgaSA9IGVkZXYtPmlkLmRyaXZlcl9kYXRhOworCisgICAgaWYgKGkgPj0gMCAmJiBpIDwgc2lnbGVuKSB7CisJICAgIHN0cmNweSAobmFtZSwgZGU0eDVfc2lnbmF0dXJlc1tpXSk7CisJICAgIHN0YXR1cyA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHRoZSBkZXZpY2UgbmFtZSBzdHJpbmcgKi8KK30KKworLyoKKyoqIExvb2sgZm9yIGEgcGFydGljdWxhciBib2FyZCBuYW1lIGluIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorKi8KK3N0YXRpYyBpbnQKK1BDSV9zaWduYXR1cmUoY2hhciAqbmFtZSwgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwKQoreworICAgIGludCBpLCBzdGF0dXMgPSAwLCBzaWdsZW4gPSBzaXplb2YoZGU0eDVfc2lnbmF0dXJlcykvc2l6ZW9mKGNfY2hhciAqKTsKKyAgICAKKyAgICBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTA0MCkgeworCXN0cmNweShuYW1lLCAiREU0MzQvNSIpOworCXJldHVybiBzdGF0dXM7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWFyY2ggZm9yIGEgREVDIG5hbWUgaW4gdGhlIFNST00gKi8KKwlpbnQgaSA9ICooKGNoYXIgKikmbHAtPnNyb20gKyAxOSkgKiAzOworCXN0cm5jcHkobmFtZSwgKGNoYXIgKikmbHAtPnNyb20gKyAyNiArIGksIDgpOworICAgIH0KKyAgICBuYW1lWzhdID0gJ1wwJzsKKyAgICBmb3IgKGk9MDsgaTxzaWdsZW47IGkrKykgeworCWlmIChzdHJzdHIobmFtZSxkZTR4NV9zaWduYXR1cmVzW2ldKSE9TlVMTCkgYnJlYWs7CisgICAgfQorICAgIGlmIChpID09IHNpZ2xlbikgeworCWlmIChkZWNfb25seSkgeworCSAgICAqbmFtZSA9ICdcMCc7CisJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgY2hpcCBuYW1lIHRvIGF2b2lkIGNvbmZ1c2lvbiAqLworCSAgICBzdHJjcHkobmFtZSwgKCgobHAtPmNoaXBzZXQgPT0gREMyMTA0MCkgPyAiREMyMTA0MCIgOgorCQkJICAgKChscC0+Y2hpcHNldCA9PSBEQzIxMDQxKSA/ICJEQzIxMDQxIiA6CisJCQkgICAgKChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSA/ICJEQzIxMTQwIiA6CisJCQkgICAgICgobHAtPmNoaXBzZXQgPT0gREMyMTE0MikgPyAiREMyMTE0MiIgOgorCQkJICAgICAgKChscC0+Y2hpcHNldCA9PSBEQzIxMTQzKSA/ICJEQzIxMTQzIiA6ICJVTktOT1dOIgorCQkJICAgICApKSkpKSkpOworCX0KKwlpZiAobHAtPmNoaXBzZXQgIT0gREMyMTA0MSkgeworCSAgICBscC0+dXNlU1JPTSA9IFRSVUU7ICAgICAgICAgICAgIC8qIGNhcmQgaXMgbm90IHJlY29nbmlzYWJseSBERUMgKi8KKwl9CisgICAgfSBlbHNlIGlmICgobHAtPmNoaXBzZXQgJiB+MHgwMGZmKSA9PSBEQzIxMTR4KSB7CisJbHAtPnVzZVNST00gPSBUUlVFOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorKiogU2V0IHVwIHRoZSBFdGhlcm5ldCBQUk9NIGNvdW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBFdGhlcm5ldCBhZGRyZXNzIG9uCisqKiB0aGUgREMyMTA0MCwgZWxzZSAgcmVhZCB0aGUgU1JPTSBmb3IgdGhlIG90aGVyIGNoaXBzLgorKiogVGhlIFNST00gbWF5IG5vdCBiZSBwcmVzZW50IGluIGEgbXVsdGktTUFDIGNhcmQsIHNvIGZpcnN0IHJlYWQgdGhlCisqKiBNQUMgYWRkcmVzcyBhbmQgY2hlY2sgZm9yIGEgYmFkIGFkZHJlc3MuIElmIHRoZXJlIGlzIGEgYmFkIG9uZSB0aGVuIGV4aXQKKyoqIGltbWVkaWF0ZWx5IHdpdGggdGhlIHByaW9yIHNyb20gY29udGVudHMgaW50YWN0ICh0aGUgaC93IGFkZHJlc3Mgd2lsbAorKiogYmUgZml4ZWQgdXAgbGF0ZXIpLgorKi8KK3N0YXRpYyB2b2lkCitEZXZpY2VQcmVzZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfbG9uZyBhcHJvbV9hZGRyKQoreworICAgIGludCBpLCBqPTA7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAKKyAgICBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTA0MCkgeworCWlmIChscC0+YnVzID09IEVJU0EpIHsKKwkgICAgZW5ldF9hZGRyX3JzdChhcHJvbV9hZGRyKTsgLyogUmVzZXQgRXRoZXJuZXQgQWRkcmVzcyBST00gUG9pbnRlciAqLworCX0gZWxzZSB7CisJICAgIG91dGwoMCwgYXByb21fYWRkcik7ICAgICAgIC8qIFJlc2V0IEV0aGVybmV0IEFkZHJlc3MgUk9NIFBvaW50ZXIgKi8KKwl9CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIG5ldyBzcm9tICovCisJdV9zaG9ydCB0bXAsICpwID0gKHNob3J0ICopKChjaGFyICopJmxwLT5zcm9tICsgU1JPTV9IV0FERCk7CisJZm9yIChpPTA7IGk8KEVUSF9BTEVOPj4xKTsgaSsrKSB7CisJICAgIHRtcCA9IHNyb21fcmQoYXByb21fYWRkciwgKFNST01fSFdBREQ+PjEpICsgaSk7CisJICAgICpwID0gbGUxNl90b19jcHUodG1wKTsKKwkgICAgaiArPSAqcCsrOworCX0KKwlpZiAoKGogPT0gMCkgfHwgKGogPT0gMHgyZmZmZCkpIHsKKwkgICAgcmV0dXJuOworCX0KKworCXA9KHNob3J0ICopJmxwLT5zcm9tOworCWZvciAoaT0wOyBpPChzaXplb2Yoc3RydWN0IGRlNHg1X3Nyb20pPj4xKTsgaSsrKSB7CisJICAgIHRtcCA9IHNyb21fcmQoYXByb21fYWRkciwgaSk7CisJICAgICpwKysgPSBsZTE2X3RvX2NwdSh0bXApOworCX0KKwlkZTR4NV9kYmdfc3JvbSgoc3RydWN0IGRlNHg1X3Nyb20gKikmbHAtPnNyb20pOworICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKKy8qCisqKiBTaW5jZSB0aGUgd3JpdGUgb24gdGhlIEVuZXQgUFJPTSByZWdpc3RlciBkb2Vzbid0IHNlZW0gdG8gcmVzZXQgdGhlIFBST00KKyoqIHBvaW50ZXIgY29ycmVjdGx5IChhdCBsZWFzdCBvbiBteSBERTQyNSBFSVNBIGNhcmQpLCB0aGlzIHJvdXRpbmUgc2hvdWxkIGRvCisqKiBpdC4uLmZyb20gZGVwY2EuYy4KKyovCitzdGF0aWMgdm9pZAorZW5ldF9hZGRyX3JzdCh1X2xvbmcgYXByb21fYWRkcikKK3sKKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgdTMyIGE7CisJICAgIHUzMiBiOworCX0gbGxzaWc7CisJY2hhciBTaWdbc2l6ZW9mKHUzMikgPDwgMV07CisgICAgfSBkZXY7CisgICAgc2hvcnQgc2lnTGVuZ3RoPTA7CisgICAgczggZGF0YTsKKyAgICBpbnQgaSwgajsKKyAgICAKKyAgICBkZXYubGxzaWcuYSA9IEVUSF9QUk9NX1NJRzsKKyAgICBkZXYubGxzaWcuYiA9IEVUSF9QUk9NX1NJRzsKKyAgICBzaWdMZW5ndGggPSBzaXplb2YodTMyKSA8PCAxOworICAgIAorICAgIGZvciAoaT0wLGo9MDtqPHNpZ0xlbmd0aCAmJiBpPFBST0JFX0xFTkdUSCtzaWdMZW5ndGgtMTtpKyspIHsKKwlkYXRhID0gaW5iKGFwcm9tX2FkZHIpOworCWlmIChkZXYuU2lnW2pdID09IGRhdGEpIHsgICAgLyogdHJhY2sgc2lnbmF0dXJlICovCisJICAgIGorKzsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgIC8qIGxvc3Qgc2lnbmF0dXJlOyBiZWdpbiBzZWFyY2ggYWdhaW4gKi8KKwkgICAgaWYgKGRhdGEgPT0gZGV2LlNpZ1swXSkgeyAgLyogcmFyZSBjYXNlLi4uLiAqLworCQlqPTE7CisJICAgIH0gZWxzZSB7CisJCWo9MDsKKwkgICAgfQorCX0KKyAgICB9CisgICAgCisgICAgcmV0dXJuOworfQorCisvKgorKiogRm9yIHRoZSBiYWQgc3RhdHVzIGNhc2UgYW5kIG5vIFNST00sIHRoZW4gYWRkIG9uZSB0byB0aGUgcHJldmlvdXMKKyoqIGFkZHJlc3MuIEhvd2V2ZXIsIG5lZWQgdG8gYWRkIG9uZSBiYWNrd2FyZHMgaW4gY2FzZSB3ZSBoYXZlIDB4ZmYKKyoqIGFzIG9uZSBvciBtb3JlIG9mIHRoZSBieXRlcy4gT25seSB0aGUgbGFzdCAzIGJ5dGVzIHNob3VsZCBiZSBjaGVja2VkCisqKiBhcyB0aGUgZmlyc3QgdGhyZWUgYXJlIGludmFyaWFudCAtIGFzc2lnbmVkIHRvIGFuIG9yZ2FuaXNhdGlvbi4KKyovCitzdGF0aWMgaW50CitnZXRfaHdfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgYnJva2VuLCBpLCBrLCB0bXAsIHN0YXR1cyA9IDA7CisgICAgdV9zaG9ydCBqLGNoa3N1bTsKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgYnJva2VuID0gZGU0eDVfYmFkX3Nyb20obHApOworCisgICAgZm9yIChpPTAsaz0wLGo9MDtqPDM7aisrKSB7CisJayA8PD0gMTsKKwlpZiAoayA+IDB4ZmZmZikgay09MHhmZmZmOworCQorCWlmIChscC0+YnVzID09IFBDSSkgeworCSAgICBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTA0MCkgeworCQl3aGlsZSAoKHRtcCA9IGlubChERTRYNV9BUFJPTSkpIDwgMCk7CisJCWsgKz0gKHVfY2hhcikgdG1wOworCQlkZXYtPmRldl9hZGRyW2krK10gPSAodV9jaGFyKSB0bXA7CisJCXdoaWxlICgodG1wID0gaW5sKERFNFg1X0FQUk9NKSkgPCAwKTsKKwkJayArPSAodV9zaG9ydCkgKHRtcCA8PCA4KTsKKwkJZGV2LT5kZXZfYWRkcltpKytdID0gKHVfY2hhcikgdG1wOworCSAgICB9IGVsc2UgaWYgKCFicm9rZW4pIHsKKwkJZGV2LT5kZXZfYWRkcltpXSA9ICh1X2NoYXIpIGxwLT5zcm9tLmllZWVfYWRkcltpXTsgaSsrOworCQlkZXYtPmRldl9hZGRyW2ldID0gKHVfY2hhcikgbHAtPnNyb20uaWVlZV9hZGRyW2ldOyBpKys7CisJICAgIH0gZWxzZSBpZiAoKGJyb2tlbiA9PSBTTUMpIHx8IChicm9rZW4gPT0gQUNDVE9OKSkgeworCQlkZXYtPmRldl9hZGRyW2ldID0gKigodV9jaGFyICopJmxwLT5zcm9tICsgaSk7IGkrKzsKKwkJZGV2LT5kZXZfYWRkcltpXSA9ICooKHVfY2hhciAqKSZscC0+c3JvbSArIGkpOyBpKys7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBrICs9ICh1X2NoYXIpICh0bXAgPSBpbmIoRUlTQV9BUFJPTSkpOworCSAgICBkZXYtPmRldl9hZGRyW2krK10gPSAodV9jaGFyKSB0bXA7CisJICAgIGsgKz0gKHVfc2hvcnQpICgodG1wID0gaW5iKEVJU0FfQVBST00pKSA8PCA4KTsKKwkgICAgZGV2LT5kZXZfYWRkcltpKytdID0gKHVfY2hhcikgdG1wOworCX0KKwkKKwlpZiAoayA+IDB4ZmZmZikgay09MHhmZmZmOworICAgIH0KKyAgICBpZiAoayA9PSAweGZmZmYpIGs9MDsKKyAgICAKKyAgICBpZiAobHAtPmJ1cyA9PSBQQ0kpIHsKKwlpZiAobHAtPmNoaXBzZXQgPT0gREMyMTA0MCkgeworCSAgICB3aGlsZSAoKHRtcCA9IGlubChERTRYNV9BUFJPTSkpIDwgMCk7CisJICAgIGNoa3N1bSA9ICh1X2NoYXIpIHRtcDsKKwkgICAgd2hpbGUgKCh0bXAgPSBpbmwoREU0WDVfQVBST00pKSA8IDApOworCSAgICBjaGtzdW0gfD0gKHVfc2hvcnQpICh0bXAgPDwgOCk7CisJICAgIGlmICgoayAhPSBjaGtzdW0pICYmIChkZWNfb25seSkpIHN0YXR1cyA9IC0xOworCX0KKyAgICB9IGVsc2UgeworCWNoa3N1bSA9ICh1X2NoYXIpIGluYihFSVNBX0FQUk9NKTsKKwljaGtzdW0gfD0gKHVfc2hvcnQpIChpbmIoRUlTQV9BUFJPTSkgPDwgOCk7CisJaWYgKChrICE9IGNoa3N1bSkgJiYgKGRlY19vbmx5KSkgc3RhdHVzID0gLTE7CisgICAgfQorCisgICAgLyogSWYgcG9zc2libGUsIHRyeSB0byBmaXggYSBicm9rZW4gY2FyZCAtIFNNQyBvbmx5IHNvIGZhciAqLworICAgIHNyb21fcmVwYWlyKGRldiwgYnJva2VuKTsKKworI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQorICAgIC8qIAorICAgICoqIElmIHRoZSBhZGRyZXNzIHN0YXJ0cyB3aXRoIDAwIGEwLCB3ZSBoYXZlIHRvIGJpdC1yZXZlcnNlCisgICAgKiogZWFjaCBieXRlIG9mIHRoZSBhZGRyZXNzLgorICAgICovCisgICAgaWYgKCAoX21hY2hpbmUgJiBfTUFDSF9QbWFjKSAmJgorCSAoZGV2LT5kZXZfYWRkclswXSA9PSAwKSAmJgorCSAoZGV2LT5kZXZfYWRkclsxXSA9PSAweGEwKSApCisgICAgeworCSAgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47ICsraSkKKwkgICAgeworCQkgICAgaW50IHggPSBkZXYtPmRldl9hZGRyW2ldOworCQkgICAgeCA9ICgoeCAmIDB4ZikgPDwgNCkgKyAoKHggJiAweGYwKSA+PiA0KTsKKwkJICAgIHggPSAoKHggJiAweDMzKSA8PCAyKSArICgoeCAmIDB4Y2MpID4+IDIpOworCQkgICAgZGV2LT5kZXZfYWRkcltpXSA9ICgoeCAmIDB4NTUpIDw8IDEpICsgKCh4ICYgMHhhYSkgPj4gMSk7CisJICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCisKKyAgICAvKiBUZXN0IGZvciBhIGJhZCBlbmV0IGFkZHJlc3MgKi8KKyAgICBzdGF0dXMgPSB0ZXN0X2JhZF9lbmV0KGRldiwgc3RhdHVzKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisqKiBUZXN0IGZvciBlbmV0IGFkZHJlc3NlcyBpbiB0aGUgZmlyc3QgMzIgYnl0ZXMuIFRoZSBidWlsdC1pbiBzdHJuY21wCisqKiBkaWRuJ3Qgc2VlbSB0byB3b3JrIGhlcmUuLi4/CisqLworc3RhdGljIGludAorZGU0eDVfYmFkX3Nyb20oc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwKQoreworICAgIGludCBpLCBzdGF0dXMgPSAwOworCisgICAgZm9yIChpPTA7IGk8c2l6ZW9mKGVuZXRfZGV0KS9FVEhfQUxFTjsgaSsrKSB7CisJaWYgKCFkZTR4NV9zdHJuY21wKChjaGFyICopJmxwLT5zcm9tLCAoY2hhciAqKSZlbmV0X2RldFtpXSwgMykgJiYKKwkgICAgIWRlNHg1X3N0cm5jbXAoKGNoYXIgKikmbHAtPnNyb20rMHgxMCwgKGNoYXIgKikmZW5ldF9kZXRbaV0sIDMpKSB7CisJICAgIGlmIChpID09IDApIHsKKwkJc3RhdHVzID0gU01DOworCSAgICB9IGVsc2UgaWYgKGkgPT0gMSkgeworCQlzdGF0dXMgPSBBQ0NUT047CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK2RlNHg1X3N0cm5jbXAoY2hhciAqYSwgY2hhciAqYiwgaW50IG4pCit7CisgICAgaW50IHJldD0wOworCisgICAgZm9yICg7biAmJiAhcmV0O24tLSkgeworCXJldCA9ICphKysgLSAqYisrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitzcm9tX3JlcGFpcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY2FyZCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgc3dpdGNoKGNhcmQpIHsKKyAgICAgIGNhc2UgU01DOgorCW1lbXNldCgoY2hhciAqKSZscC0+c3JvbSwgMCwgc2l6ZW9mKHN0cnVjdCBkZTR4NV9zcm9tKSk7CisJbWVtY3B5KGxwLT5zcm9tLmllZWVfYWRkciwgKGNoYXIgKilkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGxwLT5zcm9tLmluZm8sIChjaGFyICopJnNyb21fcmVwYWlyX2luZm9bU01DLTFdLCAxMDApOworCWxwLT51c2VTUk9NID0gVFJVRTsKKwlicmVhazsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qCisqKiBBc3N1bWUgdGhhdCB0aGUgaXJxJ3MgZG8gbm90IGZvbGxvdyB0aGUgUENJIHNwZWMgLSB0aGlzIGlzIHNlZW1zCisqKiB0byBiZSB0cnVlIHNvIGZhciAoMiBmb3IgMikuCisqLworc3RhdGljIGludAordGVzdF9iYWRfZW5ldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhdHVzKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGksIHRtcDsKKworICAgIGZvciAodG1wPTAsaT0wOyBpPEVUSF9BTEVOOyBpKyspIHRtcCArPSAodV9jaGFyKWRldi0+ZGV2X2FkZHJbaV07CisgICAgaWYgKCh0bXAgPT0gMCkgfHwgKHRtcCA9PSAweDVmYSkpIHsKKwlpZiAoKGxwLT5jaGlwc2V0ID09IGxhc3QuY2hpcHNldCkgJiYgCisJICAgIChscC0+YnVzX251bSA9PSBsYXN0LmJ1cykgJiYgKGxwLT5idXNfbnVtID4gMCkpIHsKKwkgICAgZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgZGV2LT5kZXZfYWRkcltpXSA9IGxhc3QuYWRkcltpXTsKKwkgICAgZm9yIChpPUVUSF9BTEVOLTE7IGk+MjsgLS1pKSB7CisJCWRldi0+ZGV2X2FkZHJbaV0gKz0gMTsKKwkJaWYgKGRldi0+ZGV2X2FkZHJbaV0gIT0gMCkgYnJlYWs7CisJICAgIH0KKwkgICAgZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgbGFzdC5hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKwkgICAgaWYgKCFhbl9leGNlcHRpb24obHApKSB7CisJCWRldi0+aXJxID0gbGFzdC5pcnE7CisJICAgIH0KKworCSAgICBzdGF0dXMgPSAwOworCX0KKyAgICB9IGVsc2UgaWYgKCFzdGF0dXMpIHsKKwlsYXN0LmNoaXBzZXQgPSBscC0+Y2hpcHNldDsKKwlsYXN0LmJ1cyA9IGxwLT5idXNfbnVtOworCWxhc3QuaXJxID0gZGV2LT5pcnE7CisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgbGFzdC5hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorKiogTGlzdCBvZiBib2FyZCBleGNlcHRpb25zIHdpdGggY29ycmVjdGx5IHdpcmVkIElSUXMKKyovCitzdGF0aWMgaW50Cithbl9leGNlcHRpb24oc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwKQoreworICAgIGlmICgoKih1X3Nob3J0ICopbHAtPnNyb20uc3ViX3ZlbmRvcl9pZCA9PSAweDAwYzApICYmIAorCSgqKHVfc2hvcnQgKilscC0+c3JvbS5zdWJfc3lzdGVtX2lkID09IDB4OTVlMCkpIHsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisqKiBTUk9NIFJlYWQKKyovCitzdGF0aWMgc2hvcnQKK3Nyb21fcmQodV9sb25nIGFkZHIsIHVfY2hhciBvZmZzZXQpCit7CisgICAgc2VuZHRvX3Nyb20oU1JPTV9SRCB8IFNST01fU1IsIGFkZHIpOworICAgIAorICAgIHNyb21fbGF0Y2goU1JPTV9SRCB8IFNST01fU1IgfCBEVF9DUywgYWRkcik7CisgICAgc3JvbV9jb21tYW5kKFNST01fUkQgfCBTUk9NX1NSIHwgRFRfSU4gfCBEVF9DUywgYWRkcik7CisgICAgc3JvbV9hZGRyZXNzKFNST01fUkQgfCBTUk9NX1NSIHwgRFRfQ1MsIGFkZHIsIG9mZnNldCk7CisgICAgCisgICAgcmV0dXJuIHNyb21fZGF0YShTUk9NX1JEIHwgU1JPTV9TUiB8IERUX0NTLCBhZGRyKTsKK30KKworc3RhdGljIHZvaWQKK3Nyb21fbGF0Y2godV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHIpCit7CisgICAgc2VuZHRvX3Nyb20oY29tbWFuZCwgYWRkcik7CisgICAgc2VuZHRvX3Nyb20oY29tbWFuZCB8IERUX0NMSywgYWRkcik7CisgICAgc2VuZHRvX3Nyb20oY29tbWFuZCwgYWRkcik7CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorc3JvbV9jb21tYW5kKHVfaW50IGNvbW1hbmQsIHVfbG9uZyBhZGRyKQoreworICAgIHNyb21fbGF0Y2goY29tbWFuZCwgYWRkcik7CisgICAgc3JvbV9sYXRjaChjb21tYW5kLCBhZGRyKTsKKyAgICBzcm9tX2xhdGNoKChjb21tYW5kICYgMHgwMDAwZmYwMCkgfCBEVF9DUywgYWRkcik7CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorc3JvbV9hZGRyZXNzKHVfaW50IGNvbW1hbmQsIHVfbG9uZyBhZGRyLCB1X2NoYXIgb2Zmc2V0KQoreworICAgIGludCBpLCBhOworICAgIAorICAgIGEgPSBvZmZzZXQgPDwgMjsKKyAgICBmb3IgKGk9MDsgaTw2OyBpKyssIGEgPDw9IDEpIHsKKwlzcm9tX2xhdGNoKGNvbW1hbmQgfCAoKGEgJiAweDgwKSA/IERUX0lOIDogMCksIGFkZHIpOworICAgIH0KKyAgICB1ZGVsYXkoMSk7CisgICAgCisgICAgaSA9IChnZXRmcm9tX3Nyb20oYWRkcikgPj4gMykgJiAweDAxOworICAgIAorICAgIHJldHVybjsKK30KKworc3RhdGljIHNob3J0Citzcm9tX2RhdGEodV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHIpCit7CisgICAgaW50IGk7CisgICAgc2hvcnQgd29yZCA9IDA7CisgICAgczMyIHRtcDsKKyAgICAKKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKSB7CisJc2VuZHRvX3Nyb20oY29tbWFuZCAgfCBEVF9DTEssIGFkZHIpOworCXRtcCA9IGdldGZyb21fc3JvbShhZGRyKTsKKwlzZW5kdG9fc3JvbShjb21tYW5kLCBhZGRyKTsKKwkKKwl3b3JkID0gKHdvcmQgPDwgMSkgfCAoKHRtcCA+PiAzKSAmIDB4MDEpOworICAgIH0KKyAgICAKKyAgICBzZW5kdG9fc3JvbShjb21tYW5kICYgMHgwMDAwZmYwMCwgYWRkcik7CisgICAgCisgICAgcmV0dXJuIHdvcmQ7Cit9CisKKy8qCitzdGF0aWMgdm9pZAorc3JvbV9idXN5KHVfaW50IGNvbW1hbmQsIHVfbG9uZyBhZGRyKQoreworICAgc2VuZHRvX3Nyb20oKGNvbW1hbmQgJiAweDAwMDBmZjAwKSB8IERUX0NTLCBhZGRyKTsKKyAgIAorICAgd2hpbGUgKCEoKGdldGZyb21fc3JvbShhZGRyKSA+PiAzKSAmIDB4MDEpKSB7CisgICAgICAgbWRlbGF5KDEpOworICAgfQorICAgCisgICBzZW5kdG9fc3JvbShjb21tYW5kICYgMHgwMDAwZmYwMCwgYWRkcik7CisgICAKKyAgIHJldHVybjsKK30KKyovCisKK3N0YXRpYyB2b2lkCitzZW5kdG9fc3JvbSh1X2ludCBjb21tYW5kLCB1X2xvbmcgYWRkcikKK3sKKyAgICBvdXRsKGNvbW1hbmQsIGFkZHIpOworICAgIHVkZWxheSgxKTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK2dldGZyb21fc3JvbSh1X2xvbmcgYWRkcikKK3sKKyAgICBzMzIgdG1wOworICAgIAorICAgIHRtcCA9IGlubChhZGRyKTsKKyAgICB1ZGVsYXkoMSk7CisgICAgCisgICAgcmV0dXJuIHRtcDsKK30KKworc3RhdGljIGludAorc3JvbV9pbmZvbGVhZl9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgaSwgY291bnQ7CisgICAgdV9jaGFyICpwOworCisgICAgLyogRmluZCB0aGUgaW5mb2xlYWYgZGVjb2RlciBmdW5jdGlvbiB0aGF0IG1hdGNoZXMgdGhpcyBjaGlwc2V0ICovCisgICAgZm9yIChpPTA7IGk8SU5GT0xFQUZfU0laRTsgaSsrKSB7CisJaWYgKGxwLT5jaGlwc2V0ID09IGluZm9sZWFmX2FycmF5W2ldLmNoaXBzZXQpIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA9PSBJTkZPTEVBRl9TSVpFKSB7CisJbHAtPnVzZVNST00gPSBGQUxTRTsKKwlwcmludGsoIiVzOiBDYW5ub3QgZmluZCBjb3JyZWN0IGNoaXBzZXQgZm9yIFNST00gZGVjb2RpbmchXG4iLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lKTsKKwlyZXR1cm4gLUVOWElPOworICAgIH0KKworICAgIGxwLT5pbmZvbGVhZl9mbiA9IGluZm9sZWFmX2FycmF5W2ldLmZuOworCisgICAgLyogRmluZCB0aGUgaW5mb3JtYXRpb24gb2Zmc2V0IHRoYXQgdGhpcyBmdW5jdGlvbiBzaG91bGQgdXNlICovCisgICAgY291bnQgPSAqKCh1X2NoYXIgKikmbHAtPnNyb20gKyAxOSk7CisgICAgcCAgPSAodV9jaGFyICopJmxwLT5zcm9tICsgMjY7CisKKyAgICBpZiAoY291bnQgPiAxKSB7CisJZm9yIChpPWNvdW50OyBpOyAtLWksIHArPTMpIHsKKwkgICAgaWYgKGxwLT5kZXZpY2UgPT0gKnApIGJyZWFrOworCX0KKwlpZiAoaSA9PSAwKSB7CisJICAgIGxwLT51c2VTUk9NID0gRkFMU0U7CisJICAgIHByaW50aygiJXM6IENhbm5vdCBmaW5kIGNvcnJlY3QgUENJIGRldmljZSBbJWRdIGZvciBTUk9NIGRlY29kaW5nIVxuIiwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGxwLT5kZXZpY2UpOworCSAgICByZXR1cm4gLUVOWElPOworCX0KKyAgICB9CisKKyAgICBscC0+aW5mb2xlYWZfb2Zmc2V0ID0gVFdJRERMRShwKzEpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisqKiBUaGlzIHJvdXRpbmUgbG9hZHMgYW55IHR5cGUgMSBvciAzIE1JSSBpbmZvIGludG8gdGhlIG1paSBkZXZpY2UKKyoqIHN0cnVjdCBhbmQgZXhlY3V0ZXMgYW55IHR5cGUgNSBjb2RlIHRvIHJlc2V0IFBIWSBkZXZpY2VzIGZvciB0aGlzCisqKiBjb250cm9sbGVyLgorKiogVGhlIGluZm8gZm9yIHRoZSBNSUkgZGV2aWNlcyB3aWxsIGJlIHZhbGlkIHNpbmNlIHRoZSBpbmRleCB1c2VkCisqKiB3aWxsIGZvbGxvdyB0aGUgZGlzY292ZXJ5IHByb2Nlc3MgZnJvbSBNSUkgYWRkcmVzcyAxLTMxIHRoZW4gMC4KKyovCitzdGF0aWMgdm9pZAorc3JvbV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgKnAgPSAodV9jaGFyICopJmxwLT5zcm9tICsgbHAtPmluZm9sZWFmX29mZnNldDsKKyAgICB1X2NoYXIgY291bnQ7CisKKyAgICBwKz0yOworICAgIGlmIChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSB7CisJbHAtPmNhY2hlLmdlcGMgPSAoKnArKyB8IEdFUF9DVFJMKTsKKwlnZXBfd3IobHAtPmNhY2hlLmdlcGMsIGRldik7CisgICAgfQorCisgICAgLyogQmxvY2sgY291bnQgKi8KKyAgICBjb3VudCA9ICpwKys7CisKKyAgICAvKiBKdW1wIHRoZSBpbmZvYmxvY2tzIHRvIGZpbmQgdHlwZXMgKi8KKyAgICBmb3IgKDtjb3VudDsgLS1jb3VudCkgeworCWlmICgqcCA8IDEyOCkgeworCSAgICBwICs9IENPTVBBQ1RfTEVOOworCX0gZWxzZSBpZiAoKihwKzEpID09IDUpIHsKKwkgICAgdHlwZTVfaW5mb2Jsb2NrKGRldiwgMSwgcCk7CisJICAgIHAgKz0gKCgqcCAmIEJMT0NLX0xFTikgKyAxKTsKKwl9IGVsc2UgaWYgKCoocCsxKSA9PSA0KSB7CisJICAgIHAgKz0gKCgqcCAmIEJMT0NLX0xFTikgKyAxKTsKKwl9IGVsc2UgaWYgKCoocCsxKSA9PSAzKSB7CisJICAgIHR5cGUzX2luZm9ibG9jayhkZXYsIDEsIHApOworCSAgICBwICs9ICgoKnAgJiBCTE9DS19MRU4pICsgMSk7CisJfSBlbHNlIGlmICgqKHArMSkgPT0gMikgeworCSAgICBwICs9ICgoKnAgJiBCTE9DS19MRU4pICsgMSk7CisJfSBlbHNlIGlmICgqKHArMSkgPT0gMSkgeworCSAgICB0eXBlMV9pbmZvYmxvY2soZGV2LCAxLCBwKTsKKwkgICAgcCArPSAoKCpwICYgQkxPQ0tfTEVOKSArIDEpOworCX0gZWxzZSB7CisJICAgIHAgKz0gKCgqcCAmIEJMT0NLX0xFTikgKyAxKTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKgorKiogQSBnZW5lcmljIHJvdXRpbmUgdGhhdCB3cml0ZXMgR0VQIGNvbnRyb2wsIGRhdGEgYW5kIHJlc2V0IGluZm9ybWF0aW9uCisqKiB0byB0aGUgR0VQIHJlZ2lzdGVyICgyMTE0MCkgb3IgY3NyMTUgR0VQIHBvcnRpb24gKDIxMTRbMjNdKS4KKyovCitzdGF0aWMgdm9pZAorc3JvbV9leGVjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciAqcCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1X2NoYXIgY291bnQgPSAocCA/ICpwKysgOiAwKTsKKyAgICB1X3Nob3J0ICp3ID0gKHVfc2hvcnQgKilwOworCisgICAgaWYgKCgobHAtPmlibiAhPSAxKSAmJiAobHAtPmlibiAhPSAzKSAmJiAobHAtPmlibiAhPSA1KSkgfHwgIWNvdW50KSByZXR1cm47CisKKyAgICBpZiAobHAtPmNoaXBzZXQgIT0gREMyMTE0MCkgUkVTRVRfU0lBOworIAorICAgIHdoaWxlIChjb3VudC0tKSB7CisJZ2VwX3dyKCgobHAtPmNoaXBzZXQ9PURDMjExNDApICYmIChscC0+aWJuIT01KSA/IAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwKysgOiBUV0lERExFKHcrKykpLCBkZXYpOworCW1kZWxheSgyKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDJtcyBwZXIgYWN0aW9uICovCisgICAgfQorCisgICAgaWYgKGxwLT5jaGlwc2V0ICE9IERDMjExNDApIHsKKwlvdXRsKGxwLT5jYWNoZS5jc3IxNCwgREU0WDVfU1RSUik7CisJb3V0bChscC0+Y2FjaGUuY3NyMTMsIERFNFg1X1NJQ1IpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoKKyoqIEJhc2ljYWxseSB0aGlzIGZ1bmN0aW9uIGlzIGEgTk9QIHNpbmNlIGl0IHdpbGwgbmV2ZXIgYmUgY2FsbGVkLAorKiogdW5sZXNzIEkgaW1wbGVtZW50IHRoZSBEQzIxMDQxIFNST00gZnVuY3Rpb25zLiBUaGVyZSdzIG5vIG5lZWQKKyoqIHNpbmNlIHRoZSBleGlzdGluZyBjb2RlIHdpbGwgYmUgc2F0aXNmYWN0b3J5IGZvciBhbGwgYm9hcmRzLgorKi8KK3N0YXRpYyBpbnQgCitkYzIxMDQxX2luZm9sZWFmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcmV0dXJuIERFNFg1X0FVVE9TRU5TRV9NUzsKK30KKworc3RhdGljIGludCAKK2RjMjExNDBfaW5mb2xlYWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBjb3VudCA9IDA7CisgICAgdV9jaGFyICpwID0gKHVfY2hhciAqKSZscC0+c3JvbSArIGxwLT5pbmZvbGVhZl9vZmZzZXQ7CisgICAgaW50IG5leHRfdGljayA9IERFNFg1X0FVVE9TRU5TRV9NUzsKKworICAgIC8qIFJlYWQgdGhlIGNvbm5lY3Rpb24gdHlwZSAqLworICAgIHArPTI7CisKKyAgICAvKiBHRVAgY29udHJvbCAqLworICAgIGxwLT5jYWNoZS5nZXBjID0gKCpwKysgfCBHRVBfQ1RSTCk7CisKKyAgICAvKiBCbG9jayBjb3VudCAqLworICAgIGNvdW50ID0gKnArKzsKKworICAgIC8qIFJlY3Vyc2l2ZWx5IGZpZ3VyZSBvdXQgdGhlIGluZm8gYmxvY2tzICovCisgICAgaWYgKCpwIDwgMTI4KSB7CisJbmV4dF90aWNrID0gZGNfaW5mb2Jsb2NrW0NPTVBBQ1RdKGRldiwgY291bnQsIHApOworICAgIH0gZWxzZSB7CisJbmV4dF90aWNrID0gZGNfaW5mb2Jsb2NrWyoocCsxKV0oZGV2LCBjb3VudCwgcCk7CisgICAgfQorCisgICAgaWYgKGxwLT50Y291bnQgPT0gY291bnQpIHsKKwlscC0+bWVkaWEgPSBOQzsKKyAgICAgICAgaWYgKGxwLT5tZWRpYSAhPSBscC0+Y19tZWRpYSkgeworCSAgICBkZTR4NV9kYmdfbWVkaWEoZGV2KTsKKwkgICAgbHAtPmNfbWVkaWEgPSBscC0+bWVkaWE7CisJfQorCWxwLT5tZWRpYSA9IElOSVQ7CisJbHAtPnRjb3VudCA9IDA7CisJbHAtPnR4X2VuYWJsZSA9IEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBuZXh0X3RpY2sgJiB+VElNRVJfQ0I7Cit9CisKK3N0YXRpYyBpbnQgCitkYzIxMTQyX2luZm9sZWFmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgY291bnQgPSAwOworICAgIHVfY2hhciAqcCA9ICh1X2NoYXIgKikmbHAtPnNyb20gKyBscC0+aW5mb2xlYWZfb2Zmc2V0OworICAgIGludCBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisKKyAgICAvKiBSZWFkIHRoZSBjb25uZWN0aW9uIHR5cGUgKi8KKyAgICBwKz0yOworCisgICAgLyogQmxvY2sgY291bnQgKi8KKyAgICBjb3VudCA9ICpwKys7CisKKyAgICAvKiBSZWN1cnNpdmVseSBmaWd1cmUgb3V0IHRoZSBpbmZvIGJsb2NrcyAqLworICAgIGlmICgqcCA8IDEyOCkgeworCW5leHRfdGljayA9IGRjX2luZm9ibG9ja1tDT01QQUNUXShkZXYsIGNvdW50LCBwKTsKKyAgICB9IGVsc2UgeworCW5leHRfdGljayA9IGRjX2luZm9ibG9ja1sqKHArMSldKGRldiwgY291bnQsIHApOworICAgIH0KKworICAgIGlmIChscC0+dGNvdW50ID09IGNvdW50KSB7CisJbHAtPm1lZGlhID0gTkM7CisgICAgICAgIGlmIChscC0+bWVkaWEgIT0gbHAtPmNfbWVkaWEpIHsKKwkgICAgZGU0eDVfZGJnX21lZGlhKGRldik7CisJICAgIGxwLT5jX21lZGlhID0gbHAtPm1lZGlhOworCX0KKwlscC0+bWVkaWEgPSBJTklUOworCWxwLT50Y291bnQgPSAwOworCWxwLT50eF9lbmFibGUgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV4dF90aWNrICYgflRJTUVSX0NCOworfQorCitzdGF0aWMgaW50IAorZGMyMTE0M19pbmZvbGVhZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIGNvdW50ID0gMDsKKyAgICB1X2NoYXIgKnAgPSAodV9jaGFyICopJmxwLT5zcm9tICsgbHAtPmluZm9sZWFmX29mZnNldDsKKyAgICBpbnQgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworCisgICAgLyogUmVhZCB0aGUgY29ubmVjdGlvbiB0eXBlICovCisgICAgcCs9MjsKKworICAgIC8qIEJsb2NrIGNvdW50ICovCisgICAgY291bnQgPSAqcCsrOworCisgICAgLyogUmVjdXJzaXZlbHkgZmlndXJlIG91dCB0aGUgaW5mbyBibG9ja3MgKi8KKyAgICBpZiAoKnAgPCAxMjgpIHsKKwluZXh0X3RpY2sgPSBkY19pbmZvYmxvY2tbQ09NUEFDVF0oZGV2LCBjb3VudCwgcCk7CisgICAgfSBlbHNlIHsKKwluZXh0X3RpY2sgPSBkY19pbmZvYmxvY2tbKihwKzEpXShkZXYsIGNvdW50LCBwKTsKKyAgICB9CisgICAgaWYgKGxwLT50Y291bnQgPT0gY291bnQpIHsKKwlscC0+bWVkaWEgPSBOQzsKKyAgICAgICAgaWYgKGxwLT5tZWRpYSAhPSBscC0+Y19tZWRpYSkgeworCSAgICBkZTR4NV9kYmdfbWVkaWEoZGV2KTsKKwkgICAgbHAtPmNfbWVkaWEgPSBscC0+bWVkaWE7CisJfQorCWxwLT5tZWRpYSA9IElOSVQ7CisJbHAtPnRjb3VudCA9IDA7CisJbHAtPnR4X2VuYWJsZSA9IEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBuZXh0X3RpY2sgJiB+VElNRVJfQ0I7Cit9CisKKy8qCisqKiBUaGUgY29tcGFjdCBpbmZvYmxvY2sgaXMgb25seSBkZXNpZ25lZCBmb3IgREMyMTE0MFtBXSBjaGlwcywgc28KKyoqIHdlJ2xsIHJldXNlIHRoZSBkYzIxMTQwbV9hdXRvY29uZiBmdW5jdGlvbi4gTm9uIE1JSSBtZWRpYSBvbmx5LgorKi8KK3N0YXRpYyBpbnQgCitjb21wYWN0X2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBmbGFncywgY3NyNjsKKworICAgIC8qIFJlY3Vyc2l2ZWx5IGZpZ3VyZSBvdXQgdGhlIGluZm8gYmxvY2tzICovCisgICAgaWYgKC0tY291bnQgPiBscC0+dGNvdW50KSB7CisJaWYgKCoocCtDT01QQUNUX0xFTikgPCAxMjgpIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1tDT01QQUNUXShkZXYsIGNvdW50LCBwK0NPTVBBQ1RfTEVOKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrWyoocCtDT01QQUNUX0xFTisxKV0oZGV2LCBjb3VudCwgcCtDT01QQUNUX0xFTik7CisJfQorICAgIH0KKworICAgIGlmICgobHAtPm1lZGlhID09IElOSVQpICYmIChscC0+dGltZW91dCA8IDApKSB7CisgICAgICAgIGxwLT5pYm4gPSBDT01QQUNUOworICAgICAgICBscC0+YWN0aXZlID0gMDsKKwlnZXBfd3IobHAtPmNhY2hlLmdlcGMsIGRldik7CisJbHAtPmluZm9ibG9ja19tZWRpYSA9ICgqcCsrKSAmIENPTVBBQ1RfTUM7CisJbHAtPmNhY2hlLmdlcCA9ICpwKys7CisJY3NyNiA9ICpwKys7CisJZmxhZ3MgPSAqcCsrOworCisJbHAtPmFzQml0VmFsaWQgPSAoZmxhZ3MgJiAweDgwKSA/IDAgOiAtMTsKKwlscC0+ZGVmTWVkaXVtID0gKGZsYWdzICYgMHg0MCkgPyAtMSA6IDA7CisJbHAtPmFzQml0ID0gMSA8PCAoKGNzcjYgPj4gMSkgJiAweDA3KTsKKwlscC0+YXNQb2xhcml0eSA9ICgoY3NyNiAmIDB4ODApID8gLTEgOiAwKSAmIGxwLT5hc0JpdDsKKwlscC0+aW5mb2Jsb2NrX2NzcjYgPSBPTVJfREVGIHwgKChjc3I2ICYgMHg3MSkgPDwgMTgpOworCWxwLT51c2VNSUkgPSBGQUxTRTsKKworCWRlNHg1X3N3aXRjaF9tYWNfcG9ydChkZXYpOworICAgIH0KKworICAgIHJldHVybiBkYzIxMTQwbV9hdXRvY29uZihkZXYpOworfQorCisvKgorKiogVGhpcyBibG9jayBkZXNjcmliZXMgbm9uIE1JSSBtZWRpYSBmb3IgdGhlIERDMjExNDBbQV0gb25seS4KKyovCitzdGF0aWMgaW50IAordHlwZTBfaW5mb2Jsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciBjb3VudCwgdV9jaGFyICpwKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIGZsYWdzLCBjc3I2LCBsZW4gPSAoKnAgJiBCTE9DS19MRU4pKzE7CisKKyAgICAvKiBSZWN1cnNpdmVseSBmaWd1cmUgb3V0IHRoZSBpbmZvIGJsb2NrcyAqLworICAgIGlmICgtLWNvdW50ID4gbHAtPnRjb3VudCkgeworCWlmICgqKHArbGVuKSA8IDEyOCkgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrW0NPTVBBQ1RdKGRldiwgY291bnQsIHArbGVuKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrWyoocCtsZW4rMSldKGRldiwgY291bnQsIHArbGVuKTsKKwl9CisgICAgfQorCisgICAgaWYgKChscC0+bWVkaWEgPT0gSU5JVCkgJiYgKGxwLT50aW1lb3V0IDwgMCkpIHsKKyAgICAgICAgbHAtPmlibiA9IDA7CisgICAgICAgIGxwLT5hY3RpdmUgPSAwOworICAgICAgICBnZXBfd3IobHAtPmNhY2hlLmdlcGMsIGRldik7CisJcCs9MjsKKwlscC0+aW5mb2Jsb2NrX21lZGlhID0gKCpwKyspICYgQkxPQ0swX01DOworCWxwLT5jYWNoZS5nZXAgPSAqcCsrOworCWNzcjYgPSAqcCsrOworCWZsYWdzID0gKnArKzsKKworCWxwLT5hc0JpdFZhbGlkID0gKGZsYWdzICYgMHg4MCkgPyAwIDogLTE7CisJbHAtPmRlZk1lZGl1bSA9IChmbGFncyAmIDB4NDApID8gLTEgOiAwOworCWxwLT5hc0JpdCA9IDEgPDwgKChjc3I2ID4+IDEpICYgMHgwNyk7CisJbHAtPmFzUG9sYXJpdHkgPSAoKGNzcjYgJiAweDgwKSA/IC0xIDogMCkgJiBscC0+YXNCaXQ7CisJbHAtPmluZm9ibG9ja19jc3I2ID0gT01SX0RFRiB8ICgoY3NyNiAmIDB4NzEpIDw8IDE4KTsKKwlscC0+dXNlTUlJID0gRkFMU0U7CisKKwlkZTR4NV9zd2l0Y2hfbWFjX3BvcnQoZGV2KTsKKyAgICB9CisKKyAgICByZXR1cm4gZGMyMTE0MG1fYXV0b2NvbmYoZGV2KTsKK30KKworLyogVGhlc2UgZnVuY3Rpb25zIGFyZSB1bmRlciBjb25zdHJ1Y3Rpb24hICovCisKK3N0YXRpYyBpbnQgCit0eXBlMV9pbmZvYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyIGNvdW50LCB1X2NoYXIgKnApCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgbGVuID0gKCpwICYgQkxPQ0tfTEVOKSsxOworCisgICAgLyogUmVjdXJzaXZlbHkgZmlndXJlIG91dCB0aGUgaW5mbyBibG9ja3MgKi8KKyAgICBpZiAoLS1jb3VudCA+IGxwLT50Y291bnQpIHsKKwlpZiAoKihwK2xlbikgPCAxMjgpIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1tDT01QQUNUXShkZXYsIGNvdW50LCBwK2xlbik7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1sqKHArbGVuKzEpXShkZXYsIGNvdW50LCBwK2xlbik7CisJfQorICAgIH0KKworICAgIHAgKz0gMjsKKyAgICBpZiAobHAtPnN0YXRlID09IElOSVRJQUxJU0VEKSB7CisgICAgICAgIGxwLT5pYm4gPSAxOworCWxwLT5hY3RpdmUgPSAqcCsrOworCWxwLT5waHlbbHAtPmFjdGl2ZV0uZ2VwID0gKCpwID8gcCA6IE5VTEwpOyBwICs9ICgqcCArIDEpOworCWxwLT5waHlbbHAtPmFjdGl2ZV0ucnN0ID0gKCpwID8gcCA6IE5VTEwpOyBwICs9ICgqcCArIDEpOworCWxwLT5waHlbbHAtPmFjdGl2ZV0ubWMgID0gVFdJRERMRShwKTsgcCArPSAyOworCWxwLT5waHlbbHAtPmFjdGl2ZV0uYW5hID0gVFdJRERMRShwKTsgcCArPSAyOworCWxwLT5waHlbbHAtPmFjdGl2ZV0uZmR4ID0gVFdJRERMRShwKTsgcCArPSAyOworCWxwLT5waHlbbHAtPmFjdGl2ZV0udHRtID0gVFdJRERMRShwKTsKKwlyZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKChscC0+bWVkaWEgPT0gSU5JVCkgJiYgKGxwLT50aW1lb3V0IDwgMCkpIHsKKyAgICAgICAgbHAtPmlibiA9IDE7CisgICAgICAgIGxwLT5hY3RpdmUgPSAqcDsKKwlscC0+aW5mb2Jsb2NrX2NzcjYgPSBPTVJfTUlJXzEwMDsKKwlscC0+dXNlTUlJID0gVFJVRTsKKwlscC0+aW5mb2Jsb2NrX21lZGlhID0gQU5TOworCisJZGU0eDVfc3dpdGNoX21hY19wb3J0KGRldik7CisgICAgfQorCisgICAgcmV0dXJuIGRjMjExNDBtX2F1dG9jb25mKGRldik7Cit9CisKK3N0YXRpYyBpbnQgCit0eXBlMl9pbmZvYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyIGNvdW50LCB1X2NoYXIgKnApCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgbGVuID0gKCpwICYgQkxPQ0tfTEVOKSsxOworCisgICAgLyogUmVjdXJzaXZlbHkgZmlndXJlIG91dCB0aGUgaW5mbyBibG9ja3MgKi8KKyAgICBpZiAoLS1jb3VudCA+IGxwLT50Y291bnQpIHsKKwlpZiAoKihwK2xlbikgPCAxMjgpIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1tDT01QQUNUXShkZXYsIGNvdW50LCBwK2xlbik7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1sqKHArbGVuKzEpXShkZXYsIGNvdW50LCBwK2xlbik7CisJfQorICAgIH0KKworICAgIGlmICgobHAtPm1lZGlhID09IElOSVQpICYmIChscC0+dGltZW91dCA8IDApKSB7CisgICAgICAgIGxwLT5pYm4gPSAyOworICAgICAgICBscC0+YWN0aXZlID0gMDsKKwlwICs9IDI7CisJbHAtPmluZm9ibG9ja19tZWRpYSA9ICgqcCkgJiBNRURJQV9DT0RFOworCisgICAgICAgIGlmICgoKnArKykgJiBFWFRfRklFTEQpIHsKKwkgICAgbHAtPmNhY2hlLmNzcjEzID0gVFdJRERMRShwKTsgcCArPSAyOworCSAgICBscC0+Y2FjaGUuY3NyMTQgPSBUV0lERExFKHApOyBwICs9IDI7CisJICAgIGxwLT5jYWNoZS5jc3IxNSA9IFRXSURETEUocCk7IHAgKz0gMjsKKwl9IGVsc2UgeworCSAgICBscC0+Y2FjaGUuY3NyMTMgPSBDU1IxMzsKKwkgICAgbHAtPmNhY2hlLmNzcjE0ID0gQ1NSMTQ7CisJICAgIGxwLT5jYWNoZS5jc3IxNSA9IENTUjE1OworCX0KKyAgICAgICAgbHAtPmNhY2hlLmdlcGMgPSAoKHMzMikoVFdJRERMRShwKSkgPDwgMTYpOyBwICs9IDI7CisgICAgICAgIGxwLT5jYWNoZS5nZXAgID0gKChzMzIpKFRXSURETEUocCkpIDw8IDE2KTsKKwlscC0+aW5mb2Jsb2NrX2NzcjYgPSBPTVJfU0lBOworCWxwLT51c2VNSUkgPSBGQUxTRTsKKworCWRlNHg1X3N3aXRjaF9tYWNfcG9ydChkZXYpOworICAgIH0KKworICAgIHJldHVybiBkYzIxMTR4X2F1dG9jb25mKGRldik7Cit9CisKK3N0YXRpYyBpbnQgCit0eXBlM19pbmZvYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyIGNvdW50LCB1X2NoYXIgKnApCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgbGVuID0gKCpwICYgQkxPQ0tfTEVOKSsxOworCisgICAgLyogUmVjdXJzaXZlbHkgZmlndXJlIG91dCB0aGUgaW5mbyBibG9ja3MgKi8KKyAgICBpZiAoLS1jb3VudCA+IGxwLT50Y291bnQpIHsKKwlpZiAoKihwK2xlbikgPCAxMjgpIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1tDT01QQUNUXShkZXYsIGNvdW50LCBwK2xlbik7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1sqKHArbGVuKzEpXShkZXYsIGNvdW50LCBwK2xlbik7CisJfQorICAgIH0KKworICAgIHAgKz0gMjsKKyAgICBpZiAobHAtPnN0YXRlID09IElOSVRJQUxJU0VEKSB7CisgICAgICAgIGxwLT5pYm4gPSAzOworICAgICAgICBscC0+YWN0aXZlID0gKnArKzsKKwlpZiAoTU9UT19TUk9NX0JVRykgbHAtPmFjdGl2ZSA9IDA7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5nZXAgPSAoKnAgPyBwIDogTlVMTCk7IHAgKz0gKDIgKiAoKnApICsgMSk7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5yc3QgPSAoKnAgPyBwIDogTlVMTCk7IHAgKz0gKDIgKiAoKnApICsgMSk7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5tYyAgPSBUV0lERExFKHApOyBwICs9IDI7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5hbmEgPSBUV0lERExFKHApOyBwICs9IDI7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5mZHggPSBUV0lERExFKHApOyBwICs9IDI7CisJbHAtPnBoeVtscC0+YWN0aXZlXS50dG0gPSBUV0lERExFKHApOyBwICs9IDI7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5tY2kgPSAqcDsKKwlyZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKChscC0+bWVkaWEgPT0gSU5JVCkgJiYgKGxwLT50aW1lb3V0IDwgMCkpIHsKKyAgICAgICAgbHAtPmlibiA9IDM7CisJbHAtPmFjdGl2ZSA9ICpwOworCWlmIChNT1RPX1NST01fQlVHKSBscC0+YWN0aXZlID0gMDsKKwlscC0+aW5mb2Jsb2NrX2NzcjYgPSBPTVJfTUlJXzEwMDsKKwlscC0+dXNlTUlJID0gVFJVRTsKKwlscC0+aW5mb2Jsb2NrX21lZGlhID0gQU5TOworCisJZGU0eDVfc3dpdGNoX21hY19wb3J0KGRldik7CisgICAgfQorCisgICAgcmV0dXJuIGRjMjExNHhfYXV0b2NvbmYoZGV2KTsKK30KKworc3RhdGljIGludCAKK3R5cGU0X2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBmbGFncywgY3NyNiwgbGVuID0gKCpwICYgQkxPQ0tfTEVOKSsxOworCisgICAgLyogUmVjdXJzaXZlbHkgZmlndXJlIG91dCB0aGUgaW5mbyBibG9ja3MgKi8KKyAgICBpZiAoLS1jb3VudCA+IGxwLT50Y291bnQpIHsKKwlpZiAoKihwK2xlbikgPCAxMjgpIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1tDT01QQUNUXShkZXYsIGNvdW50LCBwK2xlbik7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1sqKHArbGVuKzEpXShkZXYsIGNvdW50LCBwK2xlbik7CisJfQorICAgIH0KKworICAgIGlmICgobHAtPm1lZGlhID09IElOSVQpICYmIChscC0+dGltZW91dCA8IDApKSB7CisgICAgICAgIGxwLT5pYm4gPSA0OworICAgICAgICBscC0+YWN0aXZlID0gMDsKKwlwKz0yOworCWxwLT5pbmZvYmxvY2tfbWVkaWEgPSAoKnArKykgJiBNRURJQV9DT0RFOworICAgICAgICBscC0+Y2FjaGUuY3NyMTMgPSBDU1IxMzsgICAgICAgICAgICAgIC8qIEhhcmQgY29kZWQgZGVmYXVsdHMgKi8KKwlscC0+Y2FjaGUuY3NyMTQgPSBDU1IxNDsKKwlscC0+Y2FjaGUuY3NyMTUgPSBDU1IxNTsKKyAgICAgICAgbHAtPmNhY2hlLmdlcGMgPSAoKHMzMikoVFdJRERMRShwKSkgPDwgMTYpOyBwICs9IDI7CisgICAgICAgIGxwLT5jYWNoZS5nZXAgID0gKChzMzIpKFRXSURETEUocCkpIDw8IDE2KTsgcCArPSAyOworCWNzcjYgPSAqcCsrOworCWZsYWdzID0gKnArKzsKKworCWxwLT5hc0JpdFZhbGlkID0gKGZsYWdzICYgMHg4MCkgPyAwIDogLTE7CisJbHAtPmRlZk1lZGl1bSA9IChmbGFncyAmIDB4NDApID8gLTEgOiAwOworCWxwLT5hc0JpdCA9IDEgPDwgKChjc3I2ID4+IDEpICYgMHgwNyk7CisJbHAtPmFzUG9sYXJpdHkgPSAoKGNzcjYgJiAweDgwKSA/IC0xIDogMCkgJiBscC0+YXNCaXQ7CisJbHAtPmluZm9ibG9ja19jc3I2ID0gT01SX0RFRiB8ICgoY3NyNiAmIDB4NzEpIDw8IDE4KTsKKwlscC0+dXNlTUlJID0gRkFMU0U7CisKKwlkZTR4NV9zd2l0Y2hfbWFjX3BvcnQoZGV2KTsKKyAgICB9CisKKyAgICByZXR1cm4gZGMyMTE0eF9hdXRvY29uZihkZXYpOworfQorCisvKgorKiogVGhpcyBibG9jayB0eXBlIHByb3ZpZGVzIGluZm9ybWF0aW9uIGZvciByZXNldHRpbmcgZXh0ZXJuYWwgZGV2aWNlcworKiogKGNoaXBzKSB0aHJvdWdoIHRoZSBHZW5lcmFsIFB1cnBvc2UgUmVnaXN0ZXIuCisqLworc3RhdGljIGludCAKK3R5cGU1X2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBsZW4gPSAoKnAgJiBCTE9DS19MRU4pKzE7CisKKyAgICAvKiBSZWN1cnNpdmVseSBmaWd1cmUgb3V0IHRoZSBpbmZvIGJsb2NrcyAqLworICAgIGlmICgtLWNvdW50ID4gbHAtPnRjb3VudCkgeworCWlmICgqKHArbGVuKSA8IDEyOCkgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrW0NPTVBBQ1RdKGRldiwgY291bnQsIHArbGVuKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrWyoocCtsZW4rMSldKGRldiwgY291bnQsIHArbGVuKTsKKwl9CisgICAgfQorCisgICAgLyogTXVzdCBiZSBpbml0aWFsaXppbmcgdG8gcnVuIHRoaXMgY29kZSAqLworICAgIGlmICgobHAtPnN0YXRlID09IElOSVRJQUxJU0VEKSB8fCAobHAtPm1lZGlhID09IElOSVQpKSB7CisJcCs9MjsKKyAgICAgICAgbHAtPnJzdCA9IHA7CisgICAgICAgIHNyb21fZXhlYyhkZXYsIGxwLT5yc3QpOworICAgIH0KKworICAgIHJldHVybiBERTRYNV9BVVRPU0VOU0VfTVM7Cit9CisKKy8qCisqKiBNSUkgUmVhZC9Xcml0ZQorKi8KKworc3RhdGljIGludAorbWlpX3JkKHVfY2hhciBwaHlyZWcsIHVfY2hhciBwaHlhZGRyLCB1X2xvbmcgaW9hZGRyKQoreworICAgIG1paV93ZGF0YShNSUlfUFJFQU1CTEUsICAyLCBpb2FkZHIpOyAgIC8qIFN0YXJ0IG9mIDM0IGJpdCBwcmVhbWJsZS4uLiAgICAqLworICAgIG1paV93ZGF0YShNSUlfUFJFQU1CTEUsIDMyLCBpb2FkZHIpOyAgIC8qIC4uLmNvbnRpbnVlZCAgICAgICAgICAgICAgICAgICAqLworICAgIG1paV93ZGF0YShNSUlfU1RSRCwgNCwgaW9hZGRyKTsgICAgICAgIC8qIFNGRCBhbmQgUmVhZCBvcGVyYXRpb24gICAgICAgICAqLworICAgIG1paV9hZGRyZXNzKHBoeWFkZHIsIGlvYWRkcik7ICAgICAgICAgIC8qIFBIWSBhZGRyZXNzIHRvIGJlIGFjY2Vzc2VkICAgICAqLworICAgIG1paV9hZGRyZXNzKHBoeXJlZywgaW9hZGRyKTsgICAgICAgICAgIC8qIFBIWSBSZWdpc3RlciB0byByZWFkICAgICAgICAgICAqLworICAgIG1paV90YShNSUlfU1RSRCwgaW9hZGRyKTsgICAgICAgICAgICAgIC8qIFR1cm4gYXJvdW5kIHRpbWUgLSAyIE1EQyAgICAgICAqLworICAgIAorICAgIHJldHVybiBtaWlfcmRhdGEoaW9hZGRyKTsgICAgICAgICAgICAgIC8qIFJlYWQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAqLworfQorCitzdGF0aWMgdm9pZAorbWlpX3dyKGludCBkYXRhLCB1X2NoYXIgcGh5cmVnLCB1X2NoYXIgcGh5YWRkciwgdV9sb25nIGlvYWRkcikKK3sKKyAgICBtaWlfd2RhdGEoTUlJX1BSRUFNQkxFLCAgMiwgaW9hZGRyKTsgICAvKiBTdGFydCBvZiAzNCBiaXQgcHJlYW1ibGUuLi4gICAgKi8KKyAgICBtaWlfd2RhdGEoTUlJX1BSRUFNQkxFLCAzMiwgaW9hZGRyKTsgICAvKiAuLi5jb250aW51ZWQgICAgICAgICAgICAgICAgICAgKi8KKyAgICBtaWlfd2RhdGEoTUlJX1NUV1IsIDQsIGlvYWRkcik7ICAgICAgICAvKiBTRkQgYW5kIFdyaXRlIG9wZXJhdGlvbiAgICAgICAgKi8KKyAgICBtaWlfYWRkcmVzcyhwaHlhZGRyLCBpb2FkZHIpOyAgICAgICAgICAvKiBQSFkgYWRkcmVzcyB0byBiZSBhY2Nlc3NlZCAgICAgKi8KKyAgICBtaWlfYWRkcmVzcyhwaHlyZWcsIGlvYWRkcik7ICAgICAgICAgICAvKiBQSFkgUmVnaXN0ZXIgdG8gd3JpdGUgICAgICAgICAgKi8KKyAgICBtaWlfdGEoTUlJX1NUV1IsIGlvYWRkcik7ICAgICAgICAgICAgICAvKiBUdXJuIGFyb3VuZCB0aW1lIC0gMiBNREMgICAgICAgKi8KKyAgICBkYXRhID0gbWlpX3N3YXAoZGF0YSwgMTYpOyAgICAgICAgICAgICAvKiBTd2FwIGRhdGEgYml0IG9yZGVyaW5nICAgICAgICAgKi8KKyAgICBtaWlfd2RhdGEoZGF0YSwgMTYsIGlvYWRkcik7ICAgICAgICAgICAvKiBXcml0ZSBkYXRhICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK21paV9yZGF0YSh1X2xvbmcgaW9hZGRyKQoreworICAgIGludCBpOworICAgIHMzMiB0bXAgPSAwOworICAgIAorICAgIGZvciAoaT0wOyBpPDE2OyBpKyspIHsKKwl0bXAgPDw9IDE7CisJdG1wIHw9IGdldGZyb21fbWlpKE1JSV9NUkQgfCBNSUlfUkQsIGlvYWRkcik7CisgICAgfQorICAgIAorICAgIHJldHVybiB0bXA7Cit9CisKK3N0YXRpYyB2b2lkCittaWlfd2RhdGEoaW50IGRhdGEsIGludCBsZW4sIHVfbG9uZyBpb2FkZHIpCit7CisgICAgaW50IGk7CisgICAgCisgICAgZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKKwlzZW5kdG9fbWlpKE1JSV9NV1IgfCBNSUlfV1IsIGRhdGEsIGlvYWRkcik7CisJZGF0YSA+Pj0gMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorbWlpX2FkZHJlc3ModV9jaGFyIGFkZHIsIHVfbG9uZyBpb2FkZHIpCit7CisgICAgaW50IGk7CisgICAgCisgICAgYWRkciA9IG1paV9zd2FwKGFkZHIsIDUpOworICAgIGZvciAoaT0wOyBpPDU7IGkrKykgeworCXNlbmR0b19taWkoTUlJX01XUiB8IE1JSV9XUiwgYWRkciwgaW9hZGRyKTsKKwlhZGRyID4+PSAxOworICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCittaWlfdGEodV9sb25nIHJ3LCB1X2xvbmcgaW9hZGRyKQoreworICAgIGlmIChydyA9PSBNSUlfU1RXUikgeworCXNlbmR0b19taWkoTUlJX01XUiB8IE1JSV9XUiwgMSwgaW9hZGRyKTsgIAorCXNlbmR0b19taWkoTUlJX01XUiB8IE1JSV9XUiwgMCwgaW9hZGRyKTsgIAorICAgIH0gZWxzZSB7CisJZ2V0ZnJvbV9taWkoTUlJX01SRCB8IE1JSV9SRCwgaW9hZGRyKTsgICAgICAgIC8qIFRyaS1zdGF0ZSBNRElPICovCisgICAgfQorICAgIAorICAgIHJldHVybjsKK30KKworc3RhdGljIGludAorbWlpX3N3YXAoaW50IGRhdGEsIGludCBsZW4pCit7CisgICAgaW50IGksIHRtcCA9IDA7CisgICAgCisgICAgZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKKwl0bXAgPDw9IDE7CisJdG1wIHw9IChkYXRhICYgMSk7CisJZGF0YSA+Pj0gMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHRtcDsKK30KKworc3RhdGljIHZvaWQKK3NlbmR0b19taWkodTMyIGNvbW1hbmQsIGludCBkYXRhLCB1X2xvbmcgaW9hZGRyKQoreworICAgIHUzMiBqOworICAgIAorICAgIGogPSAoZGF0YSAmIDEpIDw8IDE3OworICAgIG91dGwoY29tbWFuZCB8IGosIGlvYWRkcik7CisgICAgdWRlbGF5KDEpOworICAgIG91dGwoY29tbWFuZCB8IE1JSV9NREMgfCBqLCBpb2FkZHIpOworICAgIHVkZWxheSgxKTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK2dldGZyb21fbWlpKHUzMiBjb21tYW5kLCB1X2xvbmcgaW9hZGRyKQoreworICAgIG91dGwoY29tbWFuZCwgaW9hZGRyKTsKKyAgICB1ZGVsYXkoMSk7CisgICAgb3V0bChjb21tYW5kIHwgTUlJX01EQywgaW9hZGRyKTsKKyAgICB1ZGVsYXkoMSk7CisgICAgCisgICAgcmV0dXJuICgoaW5sKGlvYWRkcikgPj4gMTkpICYgMSk7Cit9CisKKy8qCisqKiBIZXJlJ3MgMyB3YXlzIHRvIGNhbGN1bGF0ZSB0aGUgT1VJIGZyb20gdGhlIElEIHJlZ2lzdGVycy4KKyovCitzdGF0aWMgaW50CittaWlfZ2V0X291aSh1X2NoYXIgcGh5YWRkciwgdV9sb25nIGlvYWRkcikKK3sKKy8qCisgICAgdW5pb24geworCXVfc2hvcnQgcmVnOworCXVfY2hhciBicmVnWzJdOworICAgIH0gYTsKKyAgICBpbnQgaSwgcjIsIHIzLCByZXQ9MDsqLworICAgIGludCByMiwgcjM7CisKKyAgICAvKiBSZWFkIHIyIGFuZCByMyAqLworICAgIHIyID0gbWlpX3JkKE1JSV9JRDAsIHBoeWFkZHIsIGlvYWRkcik7CisgICAgcjMgPSBtaWlfcmQoTUlJX0lEMSwgcGh5YWRkciwgaW9hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNFRVEgYW5kIEN5cHJlc3Mgd2F5ICogLworICAgIC8gKiBTaHVmZmxlIHIyIGFuZCByMyAqIC8KKyAgICBhLnJlZz0wOworICAgIHIzID0gKChyMz4+MTApfChyMjw8NikpJjB4MGZmOworICAgIHIyID0gKChyMj4+MikmMHgzZmZmKTsKKworICAgIC8gKiBCaXQgcmV2ZXJzZSByMyAqIC8KKyAgICBmb3IgKGk9MDtpPDg7aSsrKSB7CisJcmV0PDw9MTsKKwlyZXQgfD0gKHIzJjEpOworCXIzPj49MTsKKyAgICB9CisKKyAgICAvICogQml0IHJldmVyc2UgcjIgKiAvCisgICAgZm9yIChpPTA7aTwxNjtpKyspIHsKKwlhLnJlZzw8PTE7CisJYS5yZWcgfD0gKHIyJjEpOworCXIyPj49MTsKKyAgICB9CisKKyAgICAvICogU3dhcCByMiBieXRlcyAqIC8KKyAgICBpPWEuYnJlZ1swXTsKKyAgICBhLmJyZWdbMF09YS5icmVnWzFdOworICAgIGEuYnJlZ1sxXT1pOworCisgICAgcmV0dXJuICgoYS5yZWc8PDgpfHJldCk7ICovICAgICAgICAgICAgICAgICAvKiBTRUVRIGFuZCBDeXByZXNzIHdheSAqLworLyogICAgcmV0dXJuICgocjI8PDYpfCh1X2ludCkocjM+PjEwKSk7ICovICAgICAgLyogTkFUSU9OQUwgYW5kIEJST0FEQ09NIHdheSAqLworICAgIHJldHVybiByMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKEkgZGlkIGl0KSBNeSB3YXkgKi8KK30KKworLyoKKyoqIFRoZSBTUk9NIHNwZWMgZm9yY2VzIHVzIHRvIHNlYXJjaCBhZGRyZXNzZXMgWzEtMzEgMF0uIEJ1bW1lci4KKyovCitzdGF0aWMgaW50CittaWlfZ2V0X3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpLCBqLCBrLCBuLCBsaW1pdD1zaXplb2YocGh5X2luZm8pL3NpemVvZihzdHJ1Y3QgcGh5X3RhYmxlKTsKKyAgICBpbnQgaWQ7CisgICAgCisgICAgbHAtPmFjdGl2ZSA9IDA7CisgICAgbHAtPnVzZU1JSSA9IFRSVUU7CisKKyAgICAvKiBTZWFyY2ggdGhlIE1JSSBhZGRyZXNzIHNwYWNlIGZvciBwb3NzaWJsZSBQSFkgZGV2aWNlcyAqLworICAgIGZvciAobj0wLCBscC0+bWlpX2NudD0wLCBpPTE7ICEoKGk9PTEpICYmIChuPT0xKSk7IGk9KGkrMSklREU0WDVfTUFYX01JSSkgeworCWxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciA9IGk7CisJaWYgKGk9PTApIG4rKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvdW50IGN5Y2xlcyAqLworCXdoaWxlIChkZTR4NV9yZXNldF9waHkoZGV2KTwwKSB1ZGVsYXkoMTAwKTsvKiBXYWl0IGZvciByZXNldCAqLworCWlkID0gbWlpX2dldF9vdWkoaSwgREU0WDVfTUlJKTsgCisJaWYgKChpZCA9PSAwKSB8fCAoaWQgPT0gNjU1MzUpKSBjb250aW51ZTsgIC8qIFZhbGlkIElEPyAqLworCWZvciAoaj0wOyBqPGxpbWl0OyBqKyspIHsgICAgICAgICAgICAgICAgICAvKiBTZWFyY2ggUEhZIHRhYmxlICovCisJICAgIGlmIChpZCAhPSBwaHlfaW5mb1tqXS5pZCkgY29udGludWU7ICAgIC8qIElEIG1hdGNoPyAqLworCSAgICBmb3IgKGs9MDsgbHAtPnBoeVtrXS5pZCAmJiAoayA8IERFNFg1X01BWF9QSFkpOyBrKyspOworCSAgICBpZiAoayA8IERFNFg1X01BWF9QSFkpIHsKKwkJbWVtY3B5KChjaGFyICopJmxwLT5waHlba10sCisJCSAgICAgICAoY2hhciAqKSZwaHlfaW5mb1tqXSwgc2l6ZW9mKHN0cnVjdCBwaHlfdGFibGUpKTsKKwkJbHAtPnBoeVtrXS5hZGRyID0gaTsKKwkJbHAtPm1paV9jbnQrKzsKKwkJbHAtPmFjdGl2ZSsrOworCSAgICB9IGVsc2UgeworCQlnb3RvIHB1cmdhdG9yeTsgICAgICAgICAgICAgICAgICAgIC8qIFN0b3AgdGhlIHNlYXJjaCAqLworCSAgICB9CisJICAgIGJyZWFrOworCX0KKwlpZiAoKGogPT0gbGltaXQpICYmIChpIDwgREU0WDVfTUFYX01JSSkpIHsKKwkgICAgZm9yIChrPTA7IGxwLT5waHlba10uaWQgJiYgKGsgPCBERTRYNV9NQVhfUEhZKTsgaysrKTsKKwkgICAgbHAtPnBoeVtrXS5hZGRyID0gaTsKKwkgICAgbHAtPnBoeVtrXS5pZCA9IGlkOworCSAgICBscC0+cGh5W2tdLnNwZC5yZWcgPSBHRU5FUklDX1JFRzsgICAgICAvKiBBTkxQQSByZWdpc3RlciAgICAgICAgICovCisJICAgIGxwLT5waHlba10uc3BkLm1hc2sgPSBHRU5FUklDX01BU0s7ICAgIC8qIDEwME1iL3MgdGVjaG5vbG9naWVzICAgKi8KKwkgICAgbHAtPnBoeVtrXS5zcGQudmFsdWUgPSBHRU5FUklDX1ZBTFVFOyAgLyogVFggJiBUNCwgSC9GIER1cGxleCAgICAqLworCSAgICBscC0+bWlpX2NudCsrOworCSAgICBscC0+YWN0aXZlKys7CisJICAgIHByaW50aygiJXM6IFVzaW5nIGdlbmVyaWMgTUlJIGRldmljZSBjb250cm9sLiBJZiB0aGUgYm9hcmQgZG9lc24ndCBvcGVyYXRlLCBcbnBsZWFzZSBtYWlsIHRoZSBmb2xsb3dpbmcgZHVtcCB0byB0aGUgYXV0aG9yOlxuIiwgZGV2LT5uYW1lKTsKKwkgICAgaiA9IGRlNHg1X2RlYnVnOworCSAgICBkZTR4NV9kZWJ1ZyB8PSBERUJVR19NSUk7CisJICAgIGRlNHg1X2RiZ19taWkoZGV2LCBrKTsKKwkgICAgZGU0eDVfZGVidWcgPSBqOworCSAgICBwcmludGsoIlxuIik7CisJfQorICAgIH0KKyAgcHVyZ2F0b3J5OgorICAgIGxwLT5hY3RpdmUgPSAwOworICAgIGlmIChscC0+cGh5WzBdLmlkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgdGhlIFBIWSBkZXZpY2VzICovCisJZm9yIChrPTA7IGxwLT5waHlba10uaWQgJiYgKGsgPCBERTRYNV9NQVhfUEhZKTsgaysrKSB7IC8qRm9yIGVhY2ggUEhZKi8KKwkgICAgbWlpX3dyKE1JSV9DUl9SU1QsIE1JSV9DUiwgbHAtPnBoeVtrXS5hZGRyLCBERTRYNV9NSUkpOworCSAgICB3aGlsZSAobWlpX3JkKE1JSV9DUiwgbHAtPnBoeVtrXS5hZGRyLCBERTRYNV9NSUkpICYgTUlJX0NSX1JTVCk7CisJICAgIAorCSAgICBkZTR4NV9kYmdfbWlpKGRldiwgayk7CisJfQorICAgIH0KKyAgICBpZiAoIWxwLT5taWlfY250KSBscC0+dXNlTUlJID0gRkFMU0U7CisKKyAgICByZXR1cm4gbHAtPm1paV9jbnQ7Cit9CisKK3N0YXRpYyBjaGFyICoKK2J1aWxkX3NldHVwX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtb2RlKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGk7CisgICAgY2hhciAqcGEgPSBscC0+c2V0dXBfZnJhbWU7CisgICAgCisgICAgLyogSW5pdGlhbGlzZSB0aGUgc2V0dXAgZnJhbWUgKi8KKyAgICBpZiAobW9kZSA9PSBBTEwpIHsKKwltZW1zZXQobHAtPnNldHVwX2ZyYW1lLCAwLCBTRVRVUF9GUkFNRV9MRU4pOworICAgIH0KKyAgICAKKyAgICBpZiAobHAtPnNldHVwX2YgPT0gSEFTSF9QRVJGKSB7CisJZm9yIChwYT1scC0+c2V0dXBfZnJhbWUrSU1QRVJGX1BBX09GRlNFVCwgaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKKwkgICAgKihwYSArIGkpID0gZGV2LT5kZXZfYWRkcltpXTsgICAgICAgICAgICAgICAgIC8qIEhvc3QgYWRkcmVzcyAqLworCSAgICBpZiAoaSAmIDB4MDEpIHBhICs9IDI7CisJfQorCSoobHAtPnNldHVwX2ZyYW1lICsgKEhBU0hfVEFCTEVfTEVOID4+IDMpIC0gMykgPSAweDgwOworICAgIH0gZWxzZSB7CisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeyAvKiBIb3N0IGFkZHJlc3MgKi8KKwkgICAgKihwYSArIChpJjEpKSA9IGRldi0+ZGV2X2FkZHJbaV07CisJICAgIGlmIChpICYgMHgwMSkgcGEgKz0gNDsKKwl9CisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeyAvKiBCcm9hZGNhc3QgYWRkcmVzcyAqLworCSAgICAqKHBhICsgKGkmMSkpID0gKGNoYXIpIDB4ZmY7CisJICAgIGlmIChpICYgMHgwMSkgcGEgKz0gNDsKKwl9CisgICAgfQorICAgIAorICAgIHJldHVybiBwYTsgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludHMgdG8gdGhlIG5leHQgZW50cnkgKi8KK30KKworc3RhdGljIHZvaWQKK2VuYWJsZV9hc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHRpbWVfb3V0KQoreworICAgIHRpbWVvdXQoZGV2LCAodm9pZCAqKSZkZTR4NV9hc3QsICh1X2xvbmcpZGV2LCB0aW1lX291dCk7CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGlzYWJsZV9hc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIAorICAgIGRlbF90aW1lcigmbHAtPnRpbWVyKTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBsb25nCitkZTR4NV9zd2l0Y2hfbWFjX3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzMzIgb21yOworCisgICAgU1RPUF9ERTRYNTsKKworICAgIC8qIEFzc2VydCB0aGUgT01SX1BTIGJpdCBpbiBDU1I2ICovCisgICAgb21yID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfUFMgfCBPTVJfSEJEIHwgT01SX1RUTSB8IE9NUl9QQ1MgfCBPTVJfU0NSIHwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUl9GRFgpKTsKKyAgICBvbXIgfD0gbHAtPmluZm9ibG9ja19jc3I2OworICAgIGlmIChvbXIgJiBPTVJfUFMpIG9tciB8PSBPTVJfSEJEOworICAgIG91dGwob21yLCBERTRYNV9PTVIpOworICAgIAorICAgIC8qIFNvZnQgUmVzZXQgKi8KKyAgICBSRVNFVF9ERTRYNTsKKyAgICAKKyAgICAvKiBSZXN0b3JlIHRoZSBHRVAgLSBlc3BlY2lhbGx5IGZvciBDT01QQUNUIGFuZCBUeXBlIDAgSW5mb2Jsb2NrcyAqLworICAgIGlmIChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSB7CisJZ2VwX3dyKGxwLT5jYWNoZS5nZXBjLCBkZXYpOworCWdlcF93cihscC0+Y2FjaGUuZ2VwLCBkZXYpOworICAgIH0gZWxzZSBpZiAoKGxwLT5jaGlwc2V0ICYgfjB4MGZmKSA9PSBEQzIxMTR4KSB7CisJcmVzZXRfaW5pdF9zaWEoZGV2LCBscC0+Y2FjaGUuY3NyMTMsIGxwLT5jYWNoZS5jc3IxNCwgbHAtPmNhY2hlLmNzcjE1KTsKKyAgICB9CisKKyAgICAvKiBSZXN0b3JlIENTUjYgKi8KKyAgICBvdXRsKG9tciwgREU0WDVfT01SKTsKKworICAgIC8qIFJlc2V0IENTUjggKi8KKyAgICBpbmwoREU0WDVfTUZDKTsKKworICAgIHJldHVybiBvbXI7Cit9CisKK3N0YXRpYyB2b2lkCitnZXBfd3IoczMyIGRhdGEsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTE0MCkgeworCW91dGwoZGF0YSwgREU0WDVfR0VQKTsKKyAgICB9IGVsc2UgaWYgKChscC0+Y2hpcHNldCAmIH4weDAwZmYpID09IERDMjExNHgpIHsKKwlvdXRsKChkYXRhPDwxNikgfCBscC0+Y2FjaGUuY3NyMTUsIERFNFg1X1NJR1IpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIGludAorZ2VwX3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTE0MCkgeworCXJldHVybiBpbmwoREU0WDVfR0VQKTsKKyAgICB9IGVsc2UgaWYgKChscC0+Y2hpcHNldCAmIH4weDAwZmYpID09IERDMjExNHgpIHsKKwlyZXR1cm4gKGlubChERTRYNV9TSUdSKSAmIDB4MDAwZmZmZmYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICgqZm4pKHVfbG9uZyBkYXRhKSwgdV9sb25nIGRhdGEsIHVfbG9uZyBtc2VjKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGR0OworICAgIAorICAgIC8qIEZpcnN0LCBjYW5jZWwgYW55IHBlbmRpbmcgdGltZXIgZXZlbnRzICovCisgICAgZGVsX3RpbWVyKCZscC0+dGltZXIpOworICAgIAorICAgIC8qIENvbnZlcnQgbXNlYyB0byB0aWNrcyAqLworICAgIGR0ID0gKG1zZWMgKiBIWikgLyAxMDAwOworICAgIGlmIChkdD09MCkgZHQ9MTsKKyAgICAKKyAgICAvKiBTZXQgdXAgdGltZXIgKi8KKyAgICBpbml0X3RpbWVyKCZscC0+dGltZXIpOworICAgIGxwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIGR0OworICAgIGxwLT50aW1lci5mdW5jdGlvbiA9IGZuOworICAgIGxwLT50aW1lci5kYXRhID0gZGF0YTsKKyAgICBhZGRfdGltZXIoJmxwLT50aW1lcik7CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAoreWF3bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhdGUpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBpZiAoKGxwLT5jaGlwc2V0ID09IERDMjEwNDApIHx8IChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSkgcmV0dXJuOworCisgICAgaWYobHAtPmJ1cyA9PSBFSVNBKSB7CisJc3dpdGNoKHN0YXRlKSB7CisJICBjYXNlIFdBS0VVUDoKKwkgICAgb3V0YihXQUtFVVAsIFBDSV9DRlBNKTsKKwkgICAgbWRlbGF5KDEwKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgU05PT1pFOgorCSAgICBvdXRiKFNOT09aRSwgUENJX0NGUE0pOworCSAgICBicmVhazsKKworCSAgY2FzZSBTTEVFUDoKKwkgICAgb3V0bCgwLCBERTRYNV9TSUNSKTsKKwkgICAgb3V0YihTTEVFUCwgUENJX0NGUE0pOworCSAgICBicmVhazsKKwl9CisgICAgfSBlbHNlIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYgKGxwLT5nZW5kZXYpOworCXN3aXRjaChzdGF0ZSkgeworCSAgY2FzZSBXQUtFVVA6CisJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0ZEQV9QU00sIFdBS0VVUCk7CisJICAgIG1kZWxheSgxMCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIFNOT09aRToKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DRkRBX1BTTSwgU05PT1pFKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgU0xFRVA6CisJICAgIG91dGwoMCwgREU0WDVfU0lDUik7CisJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0ZEQV9QU00sIFNMRUVQKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X3BhcnNlX3BhcmFtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgY2hhciAqcCwgKnEsIHQ7CisKKyAgICBscC0+cGFyYW1zLmZkeCA9IDA7CisgICAgbHAtPnBhcmFtcy5hdXRvc2Vuc2UgPSBBVVRPOworCisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgcmV0dXJuOworCisgICAgaWYgKChwID0gc3Ryc3RyKGFyZ3MsIGRldi0+bmFtZSkpKSB7CisJaWYgKCEocSA9IHN0cnN0cihwK3N0cmxlbihkZXYtPm5hbWUpLCAiZXRoIikpKSBxID0gcCArIHN0cmxlbihwKTsKKwl0ID0gKnE7CisJKnEgPSAnXDAnOworCisJaWYgKHN0cnN0cihwLCAiZmR4IikgfHwgc3Ryc3RyKHAsICJGRFgiKSkgbHAtPnBhcmFtcy5mZHggPSAxOworCisJaWYgKHN0cnN0cihwLCAiYXV0b3NlbnNlIikgfHwgc3Ryc3RyKHAsICJBVVRPU0VOU0UiKSkgeworCSAgICBpZiAoc3Ryc3RyKHAsICJUUCIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gVFA7CisJICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHAsICJUUF9OVyIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gVFBfTlc7CisJICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHAsICJCTkMiKSkgeworCQlscC0+cGFyYW1zLmF1dG9zZW5zZSA9IEJOQzsKKwkgICAgfSBlbHNlIGlmIChzdHJzdHIocCwgIkFVSSIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gQVVJOworCSAgICB9IGVsc2UgaWYgKHN0cnN0cihwLCAiQk5DX0FVSSIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gQk5DOworCSAgICB9IGVsc2UgaWYgKHN0cnN0cihwLCAiMTBNYiIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gXzEwTWI7CisJICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHAsICIxMDBNYiIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gXzEwME1iOworCSAgICB9IGVsc2UgaWYgKHN0cnN0cihwLCAiQVVUTyIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gQVVUTzsKKwkgICAgfQorCX0KKwkqcSA9IHQ7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGU0eDVfZGJnX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCBpOworICAgIAorICAgIGlmIChkZTR4NV9kZWJ1ZyAmIERFQlVHX09QRU4pIHsKKwlwcmludGsoIiVzOiBkZTR4NSBvcGVuaW5nIHdpdGggaXJxICVkXG4iLGRldi0+bmFtZSxkZXYtPmlycSk7CisJcHJpbnRrKCJcdHBoeXNpY2FsIGFkZHJlc3M6ICIpOworCWZvciAoaT0wO2k8NjtpKyspIHsKKwkgICAgcHJpbnRrKCIlMi4yeDoiLChzaG9ydClkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCXByaW50aygiRGVzY3JpcHRvciBoZWFkIGFkZHJlc3NlczpcbiIpOworCXByaW50aygiXHQweCU4LjhseCAgMHglOC44bHhcbiIsKHVfbG9uZylscC0+cnhfcmluZywodV9sb25nKWxwLT50eF9yaW5nKTsKKwlwcmludGsoIkRlc2NyaXB0b3IgYWRkcmVzc2VzOlxuUlg6ICIpOworCWZvciAoaT0wO2k8bHAtPnJ4UmluZ1NpemUtMTtpKyspeworCSAgICBpZiAoaSA8IDMpIHsKKwkJcHJpbnRrKCIweCU4LjhseCAgIiwodV9sb25nKSZscC0+cnhfcmluZ1tpXS5zdGF0dXMpOworCSAgICB9CisJfQorCXByaW50aygiLi4uMHglOC44bHhcbiIsKHVfbG9uZykmbHAtPnJ4X3JpbmdbaV0uc3RhdHVzKTsKKwlwcmludGsoIlRYOiAiKTsKKwlmb3IgKGk9MDtpPGxwLT50eFJpbmdTaXplLTE7aSsrKXsKKwkgICAgaWYgKGkgPCAzKSB7CisJCXByaW50aygiMHglOC44bHggICIsICh1X2xvbmcpJmxwLT50eF9yaW5nW2ldLnN0YXR1cyk7CisJICAgIH0KKwl9CisJcHJpbnRrKCIuLi4weCU4LjhseFxuIiwgKHVfbG9uZykmbHAtPnR4X3JpbmdbaV0uc3RhdHVzKTsKKwlwcmludGsoIkRlc2NyaXB0b3IgYnVmZmVyczpcblJYOiAiKTsKKwlmb3IgKGk9MDtpPGxwLT5yeFJpbmdTaXplLTE7aSsrKXsKKwkgICAgaWYgKGkgPCAzKSB7CisJCXByaW50aygiMHglOC44eCAgIixsZTMyX3RvX2NwdShscC0+cnhfcmluZ1tpXS5idWYpKTsKKwkgICAgfQorCX0KKwlwcmludGsoIi4uLjB4JTguOHhcbiIsbGUzMl90b19jcHUobHAtPnJ4X3JpbmdbaV0uYnVmKSk7CisJcHJpbnRrKCJUWDogIik7CisJZm9yIChpPTA7aTxscC0+dHhSaW5nU2l6ZS0xO2krKyl7CisJICAgIGlmIChpIDwgMykgeworCQlwcmludGsoIjB4JTguOHggICIsIGxlMzJfdG9fY3B1KGxwLT50eF9yaW5nW2ldLmJ1ZikpOworCSAgICB9CisJfQorCXByaW50aygiLi4uMHglOC44eFxuIiwgbGUzMl90b19jcHUobHAtPnR4X3JpbmdbaV0uYnVmKSk7CisJcHJpbnRrKCJSaW5nIHNpemU6IFxuUlg6ICVkXG5UWDogJWRcbiIsIAorCSAgICAgICAoc2hvcnQpbHAtPnJ4UmluZ1NpemUsIAorCSAgICAgICAoc2hvcnQpbHAtPnR4UmluZ1NpemUpOyAKKyAgICB9CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGU0eDVfZGJnX21paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaykKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKyAgICBpZiAoZGU0eDVfZGVidWcgJiBERUJVR19NSUkpIHsKKwlwcmludGsoIlxuTUlJIGRldmljZSBhZGRyZXNzOiAlZFxuIiwgbHAtPnBoeVtrXS5hZGRyKTsKKwlwcmludGsoIk1JSSBDUjogICV4XG4iLG1paV9yZChNSUlfQ1IsbHAtPnBoeVtrXS5hZGRyLERFNFg1X01JSSkpOworCXByaW50aygiTUlJIFNSOiAgJXhcbiIsbWlpX3JkKE1JSV9TUixscC0+cGh5W2tdLmFkZHIsREU0WDVfTUlJKSk7CisJcHJpbnRrKCJNSUkgSUQwOiAleFxuIixtaWlfcmQoTUlJX0lEMCxscC0+cGh5W2tdLmFkZHIsREU0WDVfTUlJKSk7CisJcHJpbnRrKCJNSUkgSUQxOiAleFxuIixtaWlfcmQoTUlJX0lEMSxscC0+cGh5W2tdLmFkZHIsREU0WDVfTUlJKSk7CisJaWYgKGxwLT5waHlba10uaWQgIT0gQlJPQURDT01fVDQpIHsKKwkgICAgcHJpbnRrKCJNSUkgQU5BOiAleFxuIixtaWlfcmQoMHgwNCxscC0+cGh5W2tdLmFkZHIsREU0WDVfTUlJKSk7CisJICAgIHByaW50aygiTUlJIEFOQzogJXhcbiIsbWlpX3JkKDB4MDUsbHAtPnBoeVtrXS5hZGRyLERFNFg1X01JSSkpOworCX0KKwlwcmludGsoIk1JSSAxNjogICV4XG4iLG1paV9yZCgweDEwLGxwLT5waHlba10uYWRkcixERTRYNV9NSUkpKTsKKwlpZiAobHAtPnBoeVtrXS5pZCAhPSBCUk9BRENPTV9UNCkgeworCSAgICBwcmludGsoIk1JSSAxNzogICV4XG4iLG1paV9yZCgweDExLGxwLT5waHlba10uYWRkcixERTRYNV9NSUkpKTsKKwkgICAgcHJpbnRrKCJNSUkgMTg6ICAleFxuIixtaWlfcmQoMHgxMixscC0+cGh5W2tdLmFkZHIsREU0WDVfTUlJKSk7CisJfSBlbHNlIHsKKwkgICAgcHJpbnRrKCJNSUkgMjA6ICAleFxuIixtaWlfcmQoMHgxNCxscC0+cGh5W2tdLmFkZHIsREU0WDVfTUlJKSk7CisJfQorICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkZTR4NV9kYmdfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIAorICAgIGlmIChscC0+bWVkaWEgIT0gbHAtPmNfbWVkaWEpIHsKKwlpZiAoZGU0eDVfZGVidWcgJiBERUJVR19NRURJQSkgeworCSAgICBwcmludGsoIiVzOiBtZWRpYSBpcyAlcyVzXG4iLCBkZXYtPm5hbWUsCisJCSAgIChscC0+bWVkaWEgPT0gTkMgID8gInVuY29ubmVjdGVkLCBsaW5rIGRvd24gb3IgaW5jb21wYXRpYmxlIGNvbm5lY3Rpb24iIDoKKwkJICAgIChscC0+bWVkaWEgPT0gVFAgID8gIlRQIiA6CisJCSAgICAgKGxwLT5tZWRpYSA9PSBBTlMgPyAiVFAvTndheSIgOgorCQkgICAgICAobHAtPm1lZGlhID09IEJOQyA/ICJCTkMiIDogCisJCSAgICAgICAobHAtPm1lZGlhID09IEFVSSA/ICJBVUkiIDogCisJCQkobHAtPm1lZGlhID09IEJOQ19BVUkgPyAiQk5DL0FVSSIgOiAKKwkJCSAobHAtPm1lZGlhID09IEVYVF9TSUEgPyAiRVhUIFNJQSIgOiAKKwkJCSAgKGxwLT5tZWRpYSA9PSBfMTAwTWIgID8gIjEwME1iL3MiIDoKKwkJCSAgIChscC0+bWVkaWEgPT0gXzEwTWIgICA/ICIxME1iL3MiIDoKKwkJCSAgICAiPz8/IgorCQkJICAgICkpKSkpKSkpKSwgKGxwLT5mZHg/IiBmdWxsIGR1cGxleC4iOiIuIikpOworCX0KKwlscC0+Y19tZWRpYSA9IGxwLT5tZWRpYTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGU0eDVfZGJnX3Nyb20oc3RydWN0IGRlNHg1X3Nyb20gKnApCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoZGU0eDVfZGVidWcgJiBERUJVR19TUk9NKSB7CisJcHJpbnRrKCJTdWItc3lzdGVtIFZlbmRvciBJRDogJTA0eFxuIiwgKigodV9zaG9ydCAqKXAtPnN1Yl92ZW5kb3JfaWQpKTsKKwlwcmludGsoIlN1Yi1zeXN0ZW0gSUQ6ICAgICAgICAlMDR4XG4iLCAqKCh1X3Nob3J0ICopcC0+c3ViX3N5c3RlbV9pZCkpOworCXByaW50aygiSUQgQmxvY2sgQ1JDOiAgICAgICAgICUwMnhcbiIsICh1X2NoYXIpKHAtPmlkX2Jsb2NrX2NyYykpOworCXByaW50aygiU1JPTSB2ZXJzaW9uOiAgICAgICAgICUwMnhcbiIsICh1X2NoYXIpKHAtPnZlcnNpb24pKTsKKwlwcmludGsoIiMgY29udHJvbGxlcnM6ICAgICAgICAgJTAyeFxuIiwgKHVfY2hhcikocC0+bnVtX2NvbnRyb2xsZXJzKSk7CisKKwlwcmludGsoIkhhcmR3YXJlIEFkZHJlc3M6ICAgICAiKTsKKwlmb3IgKGk9MDtpPEVUSF9BTEVOLTE7aSsrKSB7CisJICAgIHByaW50aygiJTAyeDoiLCAodV9jaGFyKSoocC0+aWVlZV9hZGRyK2kpKTsKKwl9CisJcHJpbnRrKCIlMDJ4XG4iLCAodV9jaGFyKSoocC0+aWVlZV9hZGRyK2kpKTsKKwlwcmludGsoIkNSQyBjaGVja3N1bTogICAgICAgICAlMDR4XG4iLCAodV9zaG9ydCkocC0+Y2hrc3VtKSk7CisJZm9yIChpPTA7IGk8NjQ7IGkrKykgeworCSAgICBwcmludGsoIiUzZCAlMDR4XG4iLCBpPDwxLCAodV9zaG9ydCkqKCh1X3Nob3J0ICopcCtpKSk7CisJfQorICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X2RiZ19yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKQoreworICAgIGludCBpLCBqOworCisgICAgaWYgKGRlNHg1X2RlYnVnICYgREVCVUdfUlgpIHsKKwlwcmludGsoIlI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IDwtICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IGxlbi9TQVA6JTAyeCUwMnggWyVkXVxuIiwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbMF0sCisJICAgICAgICh1X2NoYXIpc2tiLT5kYXRhWzFdLAorCSAgICAgICAodV9jaGFyKXNrYi0+ZGF0YVsyXSwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbM10sCisJICAgICAgICh1X2NoYXIpc2tiLT5kYXRhWzRdLAorCSAgICAgICAodV9jaGFyKXNrYi0+ZGF0YVs1XSwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbNl0sCisJICAgICAgICh1X2NoYXIpc2tiLT5kYXRhWzddLAorCSAgICAgICAodV9jaGFyKXNrYi0+ZGF0YVs4XSwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbOV0sCisJICAgICAgICh1X2NoYXIpc2tiLT5kYXRhWzEwXSwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbMTFdLAorCSAgICAgICAodV9jaGFyKXNrYi0+ZGF0YVsxMl0sCisJICAgICAgICh1X2NoYXIpc2tiLT5kYXRhWzEzXSwKKwkgICAgICAgbGVuKTsKKwlmb3IgKGo9MDsgbGVuPjA7ais9MTYsIGxlbi09MTYpIHsKKwkgIHByaW50aygiICAgICUwM3g6ICIsaik7CisJICBmb3IgKGk9MDsgaTwxNiAmJiBpPGxlbjsgaSsrKSB7CisJICAgIHByaW50aygiJTAyeCAiLCh1X2NoYXIpc2tiLT5kYXRhW2kral0pOworCSAgfQorCSAgcHJpbnRrKCJcbiIpOworCX0KKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qCisqKiBQZXJmb3JtIElPQ1RMIGNhbGwgZnVuY3Rpb25zIGhlcmUuIFNvbWUgYXJlIHByaXZpbGVnZWQgb3BlcmF0aW9ucyBhbmQgdGhlCisqKiBlZmZlY3RpdmUgdWlkIGlzIGNoZWNrZWQgaW4gdGhvc2UgY2FzZXMuIEluIHRoZSBub3JtYWwgY291cnNlIG9mIGV2ZW50cworKiogdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgZm9yIG15IHRlc3RpbmcuCisqLworc3RhdGljIGludAorZGU0eDVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHN0cnVjdCBkZTR4NV9pb2N0bCAqaW9jID0gKHN0cnVjdCBkZTR4NV9pb2N0bCAqKSAmcnEtPmlmcl9pZnJ1OworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaSwgaiwgc3RhdHVzID0gMDsKKyAgICBzMzIgb21yOworICAgIHVuaW9uIHsKKwl1OCAgYWRkclsxNDRdOworCXUxNiBzdmFsWzcyXTsKKwl1MzIgbHZhbFszNl07CisgICAgfSB0bXA7CisgICAgdV9sb25nIGZsYWdzID0gMDsKKyAgICAKKyAgICBzd2l0Y2goaW9jLT5jbWQpIHsKKyAgICBjYXNlIERFNFg1X0dFVF9IV0FERFI6ICAgICAgICAgICAvKiBHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwlpb2MtPmxlbiA9IEVUSF9BTEVOOworCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKKwkgICAgdG1wLmFkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworCX0KKwlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgdG1wLmFkZHIsIGlvYy0+bGVuKSkgcmV0dXJuIC1FRkFVTFQ7CisJYnJlYWs7CisKKyAgICBjYXNlIERFNFg1X1NFVF9IV0FERFI6ICAgICAgICAgICAvKiBTZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldHVybiAtRVBFUk07CisJaWYgKGNvcHlfZnJvbV91c2VyKHRtcC5hZGRyLCBpb2MtPmRhdGEsIEVUSF9BTEVOKSkgcmV0dXJuIC1FRkFVTFQ7CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeworCSAgICBkZXYtPmRldl9hZGRyW2ldID0gdG1wLmFkZHJbaV07CisJfQorCWJ1aWxkX3NldHVwX2ZyYW1lKGRldiwgUEhZU19BRERSX09OTFkpOworCS8qIFNldCB1cCB0aGUgZGVzY3JpcHRvciBhbmQgZ2l2ZSBvd25lcnNoaXAgdG8gdGhlIGNhcmQgKi8KKwlsb2FkX3BhY2tldChkZXYsIGxwLT5zZXR1cF9mcmFtZSwgVERfSUMgfCBQRVJGRUNUX0YgfCBURF9TRVQgfCAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUVVBfRlJBTUVfTEVOLCAoc3RydWN0IHNrX2J1ZmYgKikxKTsKKwlscC0+dHhfbmV3ID0gKCsrbHAtPnR4X25ldykgJSBscC0+dHhSaW5nU2l6ZTsKKwlvdXRsKFBPTExfREVNQU5ELCBERTRYNV9UUEQpOyAgICAgICAgICAgICAgICAvKiBTdGFydCB0aGUgVFggKi8KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7ICAgICAgICAgICAgICAgICAgICAgIC8qIFVubG9jayB0aGUgVFggcmluZyAqLworCWJyZWFrOworCisgICAgY2FzZSBERTRYNV9TRVRfUFJPTTogICAgICAgICAgICAgLyogU2V0IFByb21pc2N1b3VzIE1vZGUgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldHVybiAtRVBFUk07CisJb21yID0gaW5sKERFNFg1X09NUik7CisJb21yIHw9IE9NUl9QUjsKKwlvdXRsKG9tciwgREU0WDVfT01SKTsKKwlkZXYtPmZsYWdzIHw9IElGRl9QUk9NSVNDOworCWJyZWFrOworCisgICAgY2FzZSBERTRYNV9DTFJfUFJPTTogICAgICAgICAgICAgLyogQ2xlYXIgUHJvbWlzY3VvdXMgTW9kZSAqLworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwlvbXIgPSBpbmwoREU0WDVfT01SKTsKKwlvbXIgJj0gfk9NUl9QUjsKKwlvdXRsKG9tciwgREU0WDVfT01SKTsKKwlkZXYtPmZsYWdzICY9IH5JRkZfUFJPTUlTQzsKKwlicmVhazsKKworICAgIGNhc2UgREU0WDVfU0FZX0JPTzogICAgICAgICAgICAgIC8qIFNheSAiQm9vISIgdG8gdGhlIGtlcm5lbCBsb2cgZmlsZSAqLworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwlwcmludGsoIiVzOiBCb28hXG4iLCBkZXYtPm5hbWUpOworCWJyZWFrOworCisgICAgY2FzZSBERTRYNV9NQ0FfRU46ICAgICAgICAgICAgICAgLyogRW5hYmxlIHBhc3MgYWxsIG11bHRpY2FzdCBhZGRyZXNzaW5nICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSByZXR1cm4gLUVQRVJNOworCW9tciA9IGlubChERTRYNV9PTVIpOworCW9tciB8PSBPTVJfUE07CisJb3V0bChvbXIsIERFNFg1X09NUik7CisJYnJlYWs7CisKKyAgICBjYXNlIERFNFg1X0dFVF9TVEFUUzogICAgICAgICAgICAvKiBHZXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisgICAgeworICAgICAgICBzdHJ1Y3QgcGt0X3N0YXRzIHN0YXRidWY7CisJaW9jLT5sZW4gPSBzaXplb2Yoc3RhdGJ1Zik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJbWVtY3B5KCZzdGF0YnVmLCAmbHAtPnBrdFN0YXRzLCBpb2MtPmxlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgJnN0YXRidWYsIGlvYy0+bGVuKSkgCisJCXJldHVybiAtRUZBVUxUOyAKKwlicmVhazsKKyAgICB9CisgICAgY2FzZSBERTRYNV9DTFJfU1RBVFM6ICAgICAgICAgICAgLyogWmVybyBvdXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSByZXR1cm4gLUVQRVJNOworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCW1lbXNldCgmbHAtPnBrdFN0YXRzLCAwLCBzaXplb2YobHAtPnBrdFN0YXRzKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlicmVhazsKKworICAgIGNhc2UgREU0WDVfR0VUX09NUjogICAgICAgICAgICAgIC8qIEdldCB0aGUgT01SIFJlZ2lzdGVyIGNvbnRlbnRzICovCisJdG1wLmFkZHJbMF0gPSBpbmwoREU0WDVfT01SKTsKKwlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgdG1wLmFkZHIsIDEpKSByZXR1cm4gLUVGQVVMVDsKKwlicmVhazsKKworICAgIGNhc2UgREU0WDVfU0VUX09NUjogICAgICAgICAgICAgIC8qIFNldCB0aGUgT01SIFJlZ2lzdGVyIGNvbnRlbnRzICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSByZXR1cm4gLUVQRVJNOworCWlmIChjb3B5X2Zyb21fdXNlcih0bXAuYWRkciwgaW9jLT5kYXRhLCAxKSkgcmV0dXJuIC1FRkFVTFQ7CisJb3V0bCh0bXAuYWRkclswXSwgREU0WDVfT01SKTsKKwlicmVhazsKKworICAgIGNhc2UgREU0WDVfR0VUX1JFRzogICAgICAgICAgICAgIC8qIEdldCB0aGUgREU0WDUgUmVnaXN0ZXJzICovCisJaiA9IDA7CisJdG1wLmx2YWxbMF0gPSBpbmwoREU0WDVfU1RTKTsgais9NDsKKwl0bXAubHZhbFsxXSA9IGlubChERTRYNV9CTVIpOyBqKz00OworCXRtcC5sdmFsWzJdID0gaW5sKERFNFg1X0lNUik7IGorPTQ7CisJdG1wLmx2YWxbM10gPSBpbmwoREU0WDVfT01SKTsgais9NDsKKwl0bXAubHZhbFs0XSA9IGlubChERTRYNV9TSVNSKTsgais9NDsKKwl0bXAubHZhbFs1XSA9IGlubChERTRYNV9TSUNSKTsgais9NDsKKwl0bXAubHZhbFs2XSA9IGlubChERTRYNV9TVFJSKTsgais9NDsKKwl0bXAubHZhbFs3XSA9IGlubChERTRYNV9TSUdSKTsgais9NDsKKwlpb2MtPmxlbiA9IGo7CisJaWYgKGNvcHlfdG9fdXNlcihpb2MtPmRhdGEsIHRtcC5hZGRyLCBpb2MtPmxlbikpIHJldHVybiAtRUZBVUxUOworCWJyZWFrOworCQorI2RlZmluZSBERTRYNV9EVU1QICAgICAgICAgICAgICAweDBmIC8qIER1bXAgdGhlIERFNFg1IFN0YXR1cyAqLworLyoJCisgICAgICBjYXNlIERFNFg1X0RVTVA6CisJaiA9IDA7CisJdG1wLmFkZHJbaisrXSA9IGRldi0+aXJxOworCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKKwkgICAgdG1wLmFkZHJbaisrXSA9IGRldi0+ZGV2X2FkZHJbaV07CisJfQorCXRtcC5hZGRyW2orK10gPSBscC0+cnhSaW5nU2l6ZTsKKwl0bXAubHZhbFtqPj4yXSA9IChsb25nKWxwLT5yeF9yaW5nOyBqKz00OworCXRtcC5sdmFsW2o+PjJdID0gKGxvbmcpbHAtPnR4X3Jpbmc7IGorPTQ7CisJCisJZm9yIChpPTA7aTxscC0+cnhSaW5nU2l6ZS0xO2krKyl7CisJICAgIGlmIChpIDwgMykgeworCQl0bXAubHZhbFtqPj4yXSA9IChsb25nKSZscC0+cnhfcmluZ1tpXS5zdGF0dXM7IGorPTQ7CisJICAgIH0KKwl9CisJdG1wLmx2YWxbaj4+Ml0gPSAobG9uZykmbHAtPnJ4X3JpbmdbaV0uc3RhdHVzOyBqKz00OworCWZvciAoaT0wO2k8bHAtPnR4UmluZ1NpemUtMTtpKyspeworCSAgICBpZiAoaSA8IDMpIHsKKwkJdG1wLmx2YWxbaj4+Ml0gPSAobG9uZykmbHAtPnR4X3JpbmdbaV0uc3RhdHVzOyBqKz00OworCSAgICB9CisJfQorCXRtcC5sdmFsW2o+PjJdID0gKGxvbmcpJmxwLT50eF9yaW5nW2ldLnN0YXR1czsgais9NDsKKwkKKwlmb3IgKGk9MDtpPGxwLT5yeFJpbmdTaXplLTE7aSsrKXsKKwkgICAgaWYgKGkgPCAzKSB7CisJCXRtcC5sdmFsW2o+PjJdID0gKHMzMilsZTMyX3RvX2NwdShscC0+cnhfcmluZ1tpXS5idWYpOyBqKz00OworCSAgICB9CisJfQorCXRtcC5sdmFsW2o+PjJdID0gKHMzMilsZTMyX3RvX2NwdShscC0+cnhfcmluZ1tpXS5idWYpOyBqKz00OworCWZvciAoaT0wO2k8bHAtPnR4UmluZ1NpemUtMTtpKyspeworCSAgICBpZiAoaSA8IDMpIHsKKwkJdG1wLmx2YWxbaj4+Ml0gPSAoczMyKWxlMzJfdG9fY3B1KGxwLT50eF9yaW5nW2ldLmJ1Zik7IGorPTQ7CisJICAgIH0KKwl9CisJdG1wLmx2YWxbaj4+Ml0gPSAoczMyKWxlMzJfdG9fY3B1KGxwLT50eF9yaW5nW2ldLmJ1Zik7IGorPTQ7CisJCisJZm9yIChpPTA7aTxscC0+cnhSaW5nU2l6ZTtpKyspeworCSAgICB0bXAubHZhbFtqPj4yXSA9IGxlMzJfdG9fY3B1KGxwLT5yeF9yaW5nW2ldLnN0YXR1cyk7IGorPTQ7CisJfQorCWZvciAoaT0wO2k8bHAtPnR4UmluZ1NpemU7aSsrKXsKKwkgICAgdG1wLmx2YWxbaj4+Ml0gPSBsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tpXS5zdGF0dXMpOyBqKz00OworCX0KKwkKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9CTVIpOyAgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9UUEQpOyAgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9SUEQpOyAgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9SUkJBKTsgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9UUkJBKTsgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9TVFMpOyAgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9PTVIpOyAgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9JTVIpOyAgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGxwLT5jaGlwc2V0OyBqKz00OyAKKwlpZiAobHAtPmNoaXBzZXQgPT0gREMyMTE0MCkgeworCSAgICB0bXAubHZhbFtqPj4yXSA9IGdlcF9yZChkZXYpOyAgais9NDsKKwl9IGVsc2UgeworCSAgICB0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9TSVNSKTsgais9NDsKKwkgICAgdG1wLmx2YWxbaj4+Ml0gPSBpbmwoREU0WDVfU0lDUik7IGorPTQ7CisJICAgIHRtcC5sdmFsW2o+PjJdID0gaW5sKERFNFg1X1NUUlIpOyBqKz00OworCSAgICB0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9TSUdSKTsgais9NDsgCisJfQorCXRtcC5sdmFsW2o+PjJdID0gbHAtPnBoeVtscC0+YWN0aXZlXS5pZDsgais9NDsgCisJaWYgKGxwLT5waHlbbHAtPmFjdGl2ZV0uaWQgJiYgKCFscC0+dXNlU1JPTSB8fCBscC0+dXNlTUlJKSkgeworCSAgICB0bXAubHZhbFtqPj4yXSA9IGxwLT5hY3RpdmU7IGorPTQ7IAorCSAgICB0bXAubHZhbFtqPj4yXT1taWlfcmQoTUlJX0NSLGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkcixERTRYNV9NSUkpOyBqKz00OworCSAgICB0bXAubHZhbFtqPj4yXT1taWlfcmQoTUlJX1NSLGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkcixERTRYNV9NSUkpOyBqKz00OworCSAgICB0bXAubHZhbFtqPj4yXT1taWlfcmQoTUlJX0lEMCxscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsREU0WDVfTUlJKTsgais9NDsKKwkgICAgdG1wLmx2YWxbaj4+Ml09bWlpX3JkKE1JSV9JRDEsbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLERFNFg1X01JSSk7IGorPTQ7CisJICAgIGlmIChscC0+cGh5W2xwLT5hY3RpdmVdLmlkICE9IEJST0FEQ09NX1Q0KSB7CisJCXRtcC5sdmFsW2o+PjJdPW1paV9yZChNSUlfQU5BLGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkcixERTRYNV9NSUkpOyBqKz00OworCQl0bXAubHZhbFtqPj4yXT1taWlfcmQoTUlJX0FOTFBBLGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkcixERTRYNV9NSUkpOyBqKz00OworCSAgICB9CisJICAgIHRtcC5sdmFsW2o+PjJdPW1paV9yZCgweDEwLGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkcixERTRYNV9NSUkpOyBqKz00OworCSAgICBpZiAobHAtPnBoeVtscC0+YWN0aXZlXS5pZCAhPSBCUk9BRENPTV9UNCkgeworCQl0bXAubHZhbFtqPj4yXT1taWlfcmQoMHgxMSxscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsREU0WDVfTUlJKTsgais9NDsKKwkJdG1wLmx2YWxbaj4+Ml09bWlpX3JkKDB4MTIsbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLERFNFg1X01JSSk7IGorPTQ7CisJICAgIH0gZWxzZSB7CisJCXRtcC5sdmFsW2o+PjJdPW1paV9yZCgweDE0LGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkcixERTRYNV9NSUkpOyBqKz00OworCSAgICB9CisJfQorCQorCXRtcC5hZGRyW2orK10gPSBscC0+dHhSaW5nU2l6ZTsKKwl0bXAuYWRkcltqKytdID0gbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpOworCQorCWlvYy0+bGVuID0gajsKKwlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgdG1wLmFkZHIsIGlvYy0+bGVuKSkgcmV0dXJuIC1FRkFVTFQ7CisJYnJlYWs7CisKKyovCisgICAgZGVmYXVsdDoKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgfQorICAgIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRlNHg1X21vZHVsZV9pbml0ICh2b2lkKQoreworCWludCBlcnIgPSAwOworCisjaWZkZWYgQ09ORklHX1BDSQorCWVyciA9IHBjaV9tb2R1bGVfaW5pdCAoJmRlNHg1X3BjaV9kcml2ZXIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0VJU0EKKwllcnIgfD0gZWlzYV9kcml2ZXJfcmVnaXN0ZXIgKCZkZTR4NV9laXNhX2RyaXZlcik7CisjZW5kaWYKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZTR4NV9tb2R1bGVfZXhpdCAodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmZGU0eDVfcGNpX2RyaXZlcik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRUlTQQorCWVpc2FfZHJpdmVyX3VucmVnaXN0ZXIgKCZkZTR4NV9laXNhX2RyaXZlcik7CisjZW5kaWYKK30KKworbW9kdWxlX2luaXQgKGRlNHg1X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0IChkZTR4NV9tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5oIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDM3YTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuaApAQCAtMCwwICsxLDEwMjkgQEAKKy8qCisgICAgQ29weXJpZ2h0IDE5OTQgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uCisKKyAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gIHRoZSB0ZXJtcyBvZiB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyAgICBUaGUgYXV0aG9yIG1heSAgICBiZSAgcmVhY2hlZCBhcyBkYXZpZXNAd2FudG9uLmxrZy5kZWMuY29tICBvciAgIERpZ2l0YWwKKyAgICBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIDU1MCBLaW5nIFN0cmVldCwgTGl0dGxldG9uIE1BIDAxNDYwLgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyoKKyoqIERDMjEwNDAgQ1NSPDEuLjE1PiBSZWdpc3RlciBBZGRyZXNzIE1hcAorKi8KKyNkZWZpbmUgREU0WDVfQk1SICAgIGlvYmFzZSsoMHgwMDAgPDwgbHAtPmJ1cykgIC8qIEJ1cyBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X1RQRCAgICBpb2Jhc2UrKDB4MDA4IDw8IGxwLT5idXMpICAvKiBUcmFuc21pdCBQb2xsIERlbWFuZCBSZWcgKi8KKyNkZWZpbmUgREU0WDVfUlBEICAgIGlvYmFzZSsoMHgwMTAgPDwgbHAtPmJ1cykgIC8qIFJlY2VpdmUgUG9sbCBEZW1hbmQgUmVnICovCisjZGVmaW5lIERFNFg1X1JSQkEgICBpb2Jhc2UrKDB4MDE4IDw8IGxwLT5idXMpICAvKiBSWCBSaW5nIEJhc2UgQWRkcmVzcyBSZWcgKi8KKyNkZWZpbmUgREU0WDVfVFJCQSAgIGlvYmFzZSsoMHgwMjAgPDwgbHAtPmJ1cykgIC8qIFRYIFJpbmcgQmFzZSBBZGRyZXNzIFJlZyAqLworI2RlZmluZSBERTRYNV9TVFMgICAgaW9iYXNlKygweDAyOCA8PCBscC0+YnVzKSAgLyogU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X09NUiAgICBpb2Jhc2UrKDB4MDMwIDw8IGxwLT5idXMpICAvKiBPcGVyYXRpb24gTW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBERTRYNV9JTVIgICAgaW9iYXNlKygweDAzOCA8PCBscC0+YnVzKSAgLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfTUZDICAgIGlvYmFzZSsoMHgwNDAgPDwgbHAtPmJ1cykgIC8qIE1pc3NlZCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIERFNFg1X0FQUk9NICBpb2Jhc2UrKDB4MDQ4IDw8IGxwLT5idXMpICAvKiBFdGhlcm5ldCBBZGRyZXNzIFBST00gKi8KKyNkZWZpbmUgREU0WDVfQlJPTSAgIGlvYmFzZSsoMHgwNDggPDwgbHAtPmJ1cykgIC8qIEJvb3QgUk9NIFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X1NST00gICBpb2Jhc2UrKDB4MDQ4IDw8IGxwLT5idXMpICAvKiBTZXJpYWwgUk9NIFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X01JSSAgICBpb2Jhc2UrKDB4MDQ4IDw8IGxwLT5idXMpICAvKiBNSUkgSW50ZXJmYWNlIFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X0REUiAgICBpb2Jhc2UrKDB4MDUwIDw8IGxwLT5idXMpICAvKiBEYXRhIERpYWdub3N0aWMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfRkRSICAgIGlvYmFzZSsoMHgwNTggPDwgbHAtPmJ1cykgIC8qIEZ1bGwgRHVwbGV4IFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X0dQVCAgICBpb2Jhc2UrKDB4MDU4IDw8IGxwLT5idXMpICAvKiBHZW5lcmFsIFB1cnBvc2UgVGltZXIgUmVnLiovCisjZGVmaW5lIERFNFg1X0dFUCAgICBpb2Jhc2UrKDB4MDYwIDw8IGxwLT5idXMpICAvKiBHZW5lcmFsIFB1cnBvc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfU0lTUiAgIGlvYmFzZSsoMHgwNjAgPDwgbHAtPmJ1cykgIC8qIFNJQSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfU0lDUiAgIGlvYmFzZSsoMHgwNjggPDwgbHAtPmJ1cykgIC8qIFNJQSBDb25uZWN0aXZpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfU1RSUiAgIGlvYmFzZSsoMHgwNzAgPDwgbHAtPmJ1cykgIC8qIFNJQSBUWC9SWCBSZWdpc3RlciAqLworI2RlZmluZSBERTRYNV9TSUdSICAgaW9iYXNlKygweDA3OCA8PCBscC0+YnVzKSAgLyogU0lBIEdlbmVyYWwgUmVnaXN0ZXIgKi8KKworLyoKKyoqIEVJU0EgUmVnaXN0ZXIgQWRkcmVzcyBNYXAKKyovCisjZGVmaW5lIEVJU0FfSUQgICAgICBpb2Jhc2UrMHgwYzgwICAgLyogRUlTQSBJRCBSZWdpc3RlcnMgKi8gCisjZGVmaW5lIEVJU0FfSUQwICAgICBpb2Jhc2UrMHgwYzgwICAgLyogRUlTQSBJRCBSZWdpc3RlciAwICovIAorI2RlZmluZSBFSVNBX0lEMSAgICAgaW9iYXNlKzB4MGM4MSAgIC8qIEVJU0EgSUQgUmVnaXN0ZXIgMSAqLyAKKyNkZWZpbmUgRUlTQV9JRDIgICAgIGlvYmFzZSsweDBjODIgICAvKiBFSVNBIElEIFJlZ2lzdGVyIDIgKi8gCisjZGVmaW5lIEVJU0FfSUQzICAgICBpb2Jhc2UrMHgwYzgzICAgLyogRUlTQSBJRCBSZWdpc3RlciAzICovIAorI2RlZmluZSBFSVNBX0NSICAgICAgaW9iYXNlKzB4MGM4NCAgIC8qIEVJU0EgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBFSVNBX1JFRzAgICAgaW9iYXNlKzB4MGM4OCAgIC8qIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAwICovCisjZGVmaW5lIEVJU0FfUkVHMSAgICBpb2Jhc2UrMHgwYzg5ICAgLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRUlTQV9SRUcyICAgIGlvYmFzZSsweDBjOGEgICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZSBFSVNBX1JFRzMgICAgaW9iYXNlKzB4MGM4ZiAgIC8qIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAzICovCisjZGVmaW5lIEVJU0FfQVBST00gICBpb2Jhc2UrMHgwYzkwICAgLyogRXRoZXJuZXQgQWRkcmVzcyBQUk9NICovCisKKy8qCisqKiBQQ0kvRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyBBZGRyZXNzIE1hcAorKi8KKyNkZWZpbmUgUENJX0NGSUQgICAgIGlvYmFzZSsweDAwMDggICAvKiBQQ0kgQ29uZmlndXJhdGlvbiBJRCBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfQ0ZDUyAgICAgaW9iYXNlKzB4MDAwYyAgIC8qIFBDSSBDb21tYW5kL1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfQ0ZSViAgICAgaW9iYXNlKzB4MDAxOCAgIC8qIFBDSSBSZXZpc2lvbiBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfQ0ZMVCAgICAgaW9iYXNlKzB4MDAxYyAgIC8qIFBDSSBMYXRlbmN5IFRpbWVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9DQklPICAgICBpb2Jhc2UrMHgwMDI4ICAgLyogUENJIEJhc2UgSS9PIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9DQk1BICAgICBpb2Jhc2UrMHgwMDJjICAgLyogUENJIEJhc2UgTWVtb3J5IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX0NCRVIgICAgIGlvYmFzZSsweDAwMzAgICAvKiBQQ0kgRXhwYW5zaW9uIFJPTSBCYXNlIEFkZHJlc3MgUmVnLiAqLworI2RlZmluZSBQQ0lfQ0ZJVCAgICAgaW9iYXNlKzB4MDAzYyAgIC8qIFBDSSBDb25maWd1cmF0aW9uIEludGVycnVwdCBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfQ0ZEQSAgICAgaW9iYXNlKzB4MDA0MCAgIC8qIFBDSSBEcml2ZXIgQXJlYSBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfQ0ZERCAgICAgaW9iYXNlKzB4MDA0MSAgIC8qIFBDSSBEcml2ZXIgRGVwZW5kZW50IEFyZWEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX0NGUE0gICAgIGlvYmFzZSsweDAwNDMgICAvKiBQQ0kgUG93ZXIgTWFuYWdlbWVudCBBcmVhIFJlZ2lzdGVyICovCisKKy8qCisqKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMCBiaXQgZGVmaW5pdGlvbnMKKyovCisjZGVmaW5lIEVSMF9CU1cgICAgICAgMHg4MCAgICAgICAgICAgLyogRUlTQSBCdXMgU2xhdmUgV2lkdGgsIDE6IDMyIGJpdHMgKi8KKyNkZWZpbmUgRVIwX0JNVyAgICAgICAweDQwICAgICAgICAgICAvKiBFSVNBIEJ1cyBNYXN0ZXIgV2lkdGgsIDE6IDMyIGJpdHMgKi8KKyNkZWZpbmUgRVIwX0VQVCAgICAgICAweDIwICAgICAgICAgICAvKiBFSVNBIFBSRUVNUFQgVGltZSwgMDogMjMgQkNMS3MgKi8KKyNkZWZpbmUgRVIwX0lTVFMgICAgICAweDEwICAgICAgICAgICAvKiBJbnRlcnJ1cHQgU3RhdHVzIChYKSAqLworI2RlZmluZSBFUjBfTEkgICAgICAgIDB4MDggICAgICAgICAgIC8qIExhdGNoIEludGVycnVwdHMgKi8KKyNkZWZpbmUgRVIwX0lOVEwgICAgICAweDA2ICAgICAgICAgICAvKiBJTlRlcnJ1cHQgTGV2ZWwgKi8KKyNkZWZpbmUgRVIwX0lOVFQgICAgICAweDAxICAgICAgICAgICAvKiBJTlRlcnJ1cHQgVHlwZSwgMDogTGV2ZWwsIDE6IEVkZ2UgKi8KKworLyoKKyoqIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxIGJpdCBkZWZpbml0aW9ucworKi8KKyNkZWZpbmUgRVIxX0lBTSAgICAgICAweGUwICAgICAgICAgICAvKiBJU0EgQWRkcmVzcyBNb2RlICovCisjZGVmaW5lIEVSMV9JQUUgICAgICAgMHgxMCAgICAgICAgICAgLyogSVNBIEFkZHJlc3NpbmcgRW5hYmxlICovCisjZGVmaW5lIEVSMV9VUElOICAgICAgMHgwZiAgICAgICAgICAgLyogVXNlciBQaW5zICovCisKKy8qCisqKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiBiaXQgZGVmaW5pdGlvbnMKKyovCisjZGVmaW5lIEVSMl9CUlMgICAgICAgMHhjMCAgICAgICAgICAgLyogQm9vdCBST00gU2l6ZSAqLworI2RlZmluZSBFUjJfQlJBICAgICAgIDB4M2MgICAgICAgICAgIC8qIEJvb3QgUk9NIEFkZHJlc3MgPDE2OjEzPiAqLworCisvKgorKiogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDMgYml0IGRlZmluaXRpb25zCisqLworI2RlZmluZSBFUjNfQldFICAgICAgIDB4NDAgICAgICAgICAgIC8qIEJ1cnN0IFdyaXRlIEVuYWJsZSAqLworI2RlZmluZSBFUjNfQlJFICAgICAgIDB4MDQgICAgICAgICAgIC8qIEJ1cnN0IFJlYWQgRW5hYmxlICovCisjZGVmaW5lIEVSM19MU1IgICAgICAgMHgwMiAgICAgICAgICAgLyogTG9jYWwgU29mdHdhcmUgUmVzZXQgKi8KKworLyoKKyoqIFBDSSBDb25maWd1cmF0aW9uIElEIFJlZ2lzdGVyIChQQ0lfQ0ZJRCkuIFRoZSBEZXZpY2UgSURzIGFyZSBsZWZ0CisqKiBzaGlmdGVkIDggYml0cyB0byBhbGxvdyBkZXRlY3Rpb24gb2YgREMyMTE0MiBhbmQgREMyMTE0MyB2YXJpYW50cyB3aXRoCisqKiB0aGUgY29uZmlndXJhdGlvbiByZXZpc2lvbiByZWdpc3RlciBzdGVwIG51bWJlci4KKyovCisjZGVmaW5lIENGSURfRElEICAgIDB4ZmYwMCAgICAgICAgICAgLyogRGV2aWNlIElEICovCisjZGVmaW5lIENGSURfVklEICAgIDB4MDBmZiAgICAgICAgICAgLyogVmVuZG9yIElEICovCisjZGVmaW5lIERDMjEwNDBfRElEIDB4MDIwMCAgICAgICAgICAgLyogVW5pcXVlIERldmljZSBJRCAjICovCisjZGVmaW5lIERDMjEwNDBfVklEIDB4MTAxMSAgICAgICAgICAgLyogREMyMTA0MCBNYW51ZmFjdHVyZXIgKi8KKyNkZWZpbmUgREMyMTA0MV9ESUQgMHgxNDAwICAgICAgICAgICAvKiBVbmlxdWUgRGV2aWNlIElEICMgKi8KKyNkZWZpbmUgREMyMTA0MV9WSUQgMHgxMDExICAgICAgICAgICAvKiBEQzIxMDQxIE1hbnVmYWN0dXJlciAqLworI2RlZmluZSBEQzIxMTQwX0RJRCAweDA5MDAgICAgICAgICAgIC8qIFVuaXF1ZSBEZXZpY2UgSUQgIyAqLworI2RlZmluZSBEQzIxMTQwX1ZJRCAweDEwMTEgICAgICAgICAgIC8qIERDMjExNDAgTWFudWZhY3R1cmVyICovCisjZGVmaW5lIERDMjExNHhfRElEIDB4MTkwMCAgICAgICAgICAgLyogVW5pcXVlIERldmljZSBJRCAjICovCisjZGVmaW5lIERDMjExNHhfVklEIDB4MTAxMSAgICAgICAgICAgLyogREMyMTE0WzIzXSBNYW51ZmFjdHVyZXIgKi8KKworLyoKKyoqIENoaXBzZXQgZGVmaW5lcworKi8KKyNkZWZpbmUgREMyMTA0MCAgICAgREMyMTA0MF9ESUQKKyNkZWZpbmUgREMyMTA0MSAgICAgREMyMTA0MV9ESUQKKyNkZWZpbmUgREMyMTE0MCAgICAgREMyMTE0MF9ESUQKKyNkZWZpbmUgREMyMTE0eCAgICAgREMyMTE0eF9ESUQKKyNkZWZpbmUgREMyMTE0MiAgICAgKERDMjExNHhfRElEIHwgMHgwMDEwKQorI2RlZmluZSBEQzIxMTQzICAgICAoREMyMTE0eF9ESUQgfCAweDAwMzApCisjZGVmaW5lIERDMjExNHhfQlJLIDB4MDAyMCAgICAgICAgICAgLyogQ0ZSViBicmVhayBiZXR3ZWVuIERDMjExNDIgJiBEQzIxMTQzICovCisKKyNkZWZpbmUgaXNfREMyMTA0MCAoKHZlbmRvciA9PSBEQzIxMDQwX1ZJRCkgJiYgKGRldmljZSA9PSBEQzIxMDQwX0RJRCkpCisjZGVmaW5lIGlzX0RDMjEwNDEgKCh2ZW5kb3IgPT0gREMyMTA0MV9WSUQpICYmIChkZXZpY2UgPT0gREMyMTA0MV9ESUQpKQorI2RlZmluZSBpc19EQzIxMTQwICgodmVuZG9yID09IERDMjExNDBfVklEKSAmJiAoZGV2aWNlID09IERDMjExNDBfRElEKSkKKyNkZWZpbmUgaXNfREMyMTE0eCAoKHZlbmRvciA9PSBEQzIxMTR4X1ZJRCkgJiYgKGRldmljZSA9PSBEQzIxMTR4X0RJRCkpCisjZGVmaW5lIGlzX0RDMjExNDIgKCh2ZW5kb3IgPT0gREMyMTE0eF9WSUQpICYmIChkZXZpY2UgPT0gREMyMTE0MikpCisjZGVmaW5lIGlzX0RDMjExNDMgKCh2ZW5kb3IgPT0gREMyMTE0eF9WSUQpICYmIChkZXZpY2UgPT0gREMyMTE0MykpCisKKy8qCisqKiBQQ0kgQ29uZmlndXJhdGlvbiBDb21tYW5kL1N0YXR1cyBSZWdpc3RlciAoUENJX0NGQ1MpCisqLworI2RlZmluZSBDRkNTX0RQRSAgICAweDgwMDAwMDAwICAgICAgIC8qIERldGVjdGVkIFBhcml0eSBFcnJvciAoUykgKi8KKyNkZWZpbmUgQ0ZDU19TU0UgICAgMHg0MDAwMDAwMCAgICAgICAvKiBTaWduYWwgU3lzdGVtIEVycm9yICAgKFMpICovCisjZGVmaW5lIENGQ1NfUk1BICAgIDB4MjAwMDAwMDAgICAgICAgLyogUmVjZWl2ZSBNYXN0ZXIgQWJvcnQgIChTKSAqLworI2RlZmluZSBDRkNTX1JUQSAgICAweDEwMDAwMDAwICAgICAgIC8qIFJlY2VpdmUgVGFyZ2V0IEFib3J0ICAoUykgKi8KKyNkZWZpbmUgQ0ZDU19EU1QgICAgMHgwNjAwMDAwMCAgICAgICAvKiBERVZTRUwgVGltaW5nICAgICAgICAgKFMpICovCisjZGVmaW5lIENGQ1NfRFBSICAgIDB4MDEwMDAwMDAgICAgICAgLyogRGF0YSBQYXJpdHkgUmVwb3J0ICAgIChTKSAqLworI2RlZmluZSBDRkNTX0ZCQiAgICAweDAwODAwMDAwICAgICAgIC8qIEZhc3QgQmFjay1Uby1CYWNrICAgICAoUykgKi8KKyNkZWZpbmUgQ0ZDU19TRUUgICAgMHgwMDAwMDEwMCAgICAgICAvKiBTeXN0ZW0gRXJyb3IgRW5hYmxlICAgKEMpICovCisjZGVmaW5lIENGQ1NfUEVSICAgIDB4MDAwMDAwNDAgICAgICAgLyogUGFyaXR5IEVycm9yIFJlc3BvbnNlIChDKSAqLworI2RlZmluZSBDRkNTX01PICAgICAweDAwMDAwMDA0ICAgICAgIC8qIE1hc3RlciBPcGVyYXRpb24gICAgICAoQykgKi8KKyNkZWZpbmUgQ0ZDU19NU0EgICAgMHgwMDAwMDAwMiAgICAgICAvKiBNZW1vcnkgU3BhY2UgQWNjZXNzICAgKEMpICovCisjZGVmaW5lIENGQ1NfSU9TQSAgIDB4MDAwMDAwMDEgICAgICAgLyogSS9PIFNwYWNlIEFjY2VzcyAgICAgIChDKSAqLworCisvKgorKiogUENJIENvbmZpZ3VyYXRpb24gUmV2aXNpb24gUmVnaXN0ZXIgKFBDSV9DRlJWKQorKi8KKyNkZWZpbmUgQ0ZSVl9CQyAgICAgMHhmZjAwMDAwMCAgICAgICAvKiBCYXNlIENsYXNzICovCisjZGVmaW5lIENGUlZfU0MgICAgIDB4MDBmZjAwMDAgICAgICAgLyogU3ViY2xhc3MgKi8KKyNkZWZpbmUgQ0ZSVl9STiAgICAgMHgwMDAwMDBmMCAgICAgICAvKiBSZXZpc2lvbiBOdW1iZXIgKi8KKyNkZWZpbmUgQ0ZSVl9TTiAgICAgMHgwMDAwMDAwZiAgICAgICAvKiBTdGVwIE51bWJlciAqLworI2RlZmluZSBCQVNFX0NMQVNTICAweDAyMDAwMDAwICAgICAgIC8qIEluZGljYXRlcyBOZXR3b3JrIENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgU1VCX0NMQVNTICAgMHgwMDAwMDAwMCAgICAgICAvKiBJbmRpY2F0ZXMgRXRoZXJuZXQgQ29udHJvbGxlciAqLworI2RlZmluZSBTVEVQX05VTUJFUiAweDAwMDAwMDIwICAgICAgIC8qIEluY3JlbWVudHMgZm9yIGZ1dHVyZSBjaGlwcyAqLworI2RlZmluZSBSRVZfTlVNQkVSICAweDAwMDAwMDAzICAgICAgIC8qIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDM6IFJldiBpbiBTdGVwICovCisjZGVmaW5lIENGUlZfTUFTSyAgIDB4ZmZmZjAwMDAgICAgICAgLyogUmVnaXN0ZXIgbWFzayAqLworCisvKgorKiogUENJIENvbmZpZ3VyYXRpb24gTGF0ZW5jeSBUaW1lciBSZWdpc3RlciAoUENJX0NGTFQpCisqLworI2RlZmluZSBDRkxUX0JDICAgICAweDAwMDBmZjAwICAgICAgIC8qIExhdGVuY3kgVGltZXIgYml0cyAqLworCisvKgorKiogUENJIENvbmZpZ3VyYXRpb24gQmFzZSBJL08gQWRkcmVzcyBSZWdpc3RlciAoUENJX0NCSU8pCisqLworI2RlZmluZSBDQklPX01BU0sgICAtMTI4ICAgICAgICAgICAgIC8qIEJhc2UgSS9PIEFkZHJlc3MgTWFzayAqLworI2RlZmluZSBDQklPX0lPU0kgICAweDAwMDAwMDAxICAgICAgIC8qIEkvTyBTcGFjZSBJbmRpY2F0b3IgKFJPLCB2YWx1ZSBpcyAxKSAqLworCisvKgorKiogUENJIENvbmZpZ3VyYXRpb24gQ2FyZCBJbmZvcm1hdGlvbiBTdHJ1Y3R1cmUgUmVnaXN0ZXIgKFBDSV9DQ0lTKQorKi8KKyNkZWZpbmUgQ0NJU19ST01JICAgMHhmMDAwMDAwMCAgICAgICAvKiBST00gSW1hZ2UgKi8KKyNkZWZpbmUgQ0NJU19BU08gICAgMHgwZmZmZmZmOCAgICAgICAvKiBBZGRyZXNzIFNwYWNlIE9mZnNldCAqLworI2RlZmluZSBDQ0lTX0FTSSAgICAweDAwMDAwMDA3ICAgICAgIC8qIEFkZHJlc3MgU3BhY2UgSW5kaWNhdG9yICovCisKKy8qCisqKiBQQ0kgQ29uZmlndXJhdGlvbiBTdWJzeXN0ZW0gSUQgUmVnaXN0ZXIgKFBDSV9TU0lEKQorKi8KKyNkZWZpbmUgU1NJRF9TU0lEICAgMHhmZmZmMDAwMCAgICAgICAvKiBTdWJzeXN0ZW0gSUQgKi8KKyNkZWZpbmUgU1NJRF9TVklEICAgMHgwMDAwZmZmZiAgICAgICAvKiBTdWJzeXN0ZW0gVmVuZG9yIElEICovCisKKy8qCisqKiBQQ0kgQ29uZmlndXJhdGlvbiBFeHBhbnNpb24gUk9NIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAoUENJX0NCRVIpCisqLworI2RlZmluZSBDQkVSX01BU0sgICAweGZmZmZmYzAwICAgICAgIC8qIEV4cGFuc2lvbiBST00gQmFzZSBBZGRyZXNzIE1hc2sgKi8KKyNkZWZpbmUgQ0JFUl9ST01FICAgMHgwMDAwMDAwMSAgICAgICAvKiBST00gRW5hYmxlICovCisKKy8qCisqKiBQQ0kgQ29uZmlndXJhdGlvbiBJbnRlcnJ1cHQgUmVnaXN0ZXIgKFBDSV9DRklUKQorKi8KKyNkZWZpbmUgQ0ZJVF9NWExUICAgMHhmZjAwMDAwMCAgICAgICAvKiBNQVhfTEFUIFZhbHVlICgwLjI1dXMgcGVyaW9kcykgKi8KKyNkZWZpbmUgQ0ZJVF9NTkdUICAgMHgwMGZmMDAwMCAgICAgICAvKiBNSU5fR05UIFZhbHVlICgwLjI1dXMgcGVyaW9kcykgKi8KKyNkZWZpbmUgQ0ZJVF9JUlFQICAgMHgwMDAwZmYwMCAgICAgICAvKiBJbnRlcnJ1cHQgUGluICovCisjZGVmaW5lIENGSVRfSVJRTCAgIDB4MDAwMDAwZmYgICAgICAgLyogSW50ZXJydXB0IExpbmUgKi8KKworLyoKKyoqIFBDSSBDb25maWd1cmF0aW9uIFBvd2VyIE1hbmFnZW1lbnQgQXJlYSBSZWdpc3RlciAoUENJX0NGUE0pCisqLworI2RlZmluZSBTTEVFUCAgICAgICAweDgwICAgICAgICAgICAgIC8qIFBvd2VyIFNhdmluZyBTbGVlcCBNb2RlICovCisjZGVmaW5lIFNOT09aRSAgICAgIDB4NDAgICAgICAgICAgICAgLyogUG93ZXIgU2F2aW5nIFNub296ZSBNb2RlICovCisjZGVmaW5lIFdBS0VVUCAgICAgIDB4MDAgICAgICAgICAgICAgLyogUG93ZXIgU2F2aW5nIFdha2V1cCAqLworCisjZGVmaW5lIFBDSV9DRkRBX0RTVSAweDQxICAgICAgICAgICAgLyogOCBiaXQgQ29uZmlndXJhdGlvbiBTcGFjZSBBZGRyZXNzICovCisjZGVmaW5lIFBDSV9DRkRBX1BTTSAweDQzICAgICAgICAgICAgLyogOCBiaXQgQ29uZmlndXJhdGlvbiBTcGFjZSBBZGRyZXNzICovCisKKy8qCisqKiBEQzIxMDQwIEJ1cyBNb2RlIFJlZ2lzdGVyIChERTRYNV9CTVIpCisqLworI2RlZmluZSBCTVJfUk1MICAgIDB4MDAyMDAwMDAgICAgICAgLyogW01lbW9yeV0gUmVhZCBNdWx0aXBsZSAqLworI2RlZmluZSBCTVJfREJPICAgIDB4MDAxMDAwMDAgICAgICAgLyogRGVzY3JpcHRvciBCeXRlIE9yZGVyaW5nIChFbmRpYW4pICovCisjZGVmaW5lIEJNUl9UQVAgICAgMHgwMDBlMDAwMCAgICAgICAvKiBUcmFuc21pdCBBdXRvbWF0aWMgUG9sbGluZyAqLworI2RlZmluZSBCTVJfREFTICAgIDB4MDAwMTAwMDAgICAgICAgLyogRGlhZ25vc3RpYyBBZGRyZXNzIFNwYWNlICovCisjZGVmaW5lIEJNUl9DQUwgICAgMHgwMDAwYzAwMCAgICAgICAvKiBDYWNoZSBBbGlnbm1lbnQgKi8KKyNkZWZpbmUgQk1SX1BCTCAgICAweDAwMDAzZjAwICAgICAgIC8qIFByb2dyYW1tYWJsZSBCdXJzdCBMZW5ndGggKi8KKyNkZWZpbmUgQk1SX0JMRSAgICAweDAwMDAwMDgwICAgICAgIC8qIEJpZy9MaXR0bGUgRW5kaWFuICovCisjZGVmaW5lIEJNUl9EU0wgICAgMHgwMDAwMDA3YyAgICAgICAvKiBEZXNjcmlwdG9yIFNraXAgTGVuZ3RoICovCisjZGVmaW5lIEJNUl9CQVIgICAgMHgwMDAwMDAwMiAgICAgICAvKiBCdXMgQVJiaXRyYXRpb24gKi8KKyNkZWZpbmUgQk1SX1NXUiAgICAweDAwMDAwMDAxICAgICAgIC8qIFNvZnR3YXJlIFJlc2V0ICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRpbWluZ3MgaGVyZSBhcmUgZm9yIDEwQkFTRS1UL0FVSSBvbmx5Ki8KKyNkZWZpbmUgVEFQX05PUE9MTCAweDAwMDAwMDAwICAgICAgIC8qIE5vIGF1dG9tYXRpYyBwb2xsaW5nICovCisjZGVmaW5lIFRBUF8yMDBVUyAgMHgwMDAyMDAwMCAgICAgICAvKiBUWCBhdXRvbWF0aWMgcG9sbGluZyBldmVyeSAyMDB1cyAqLworI2RlZmluZSBUQVBfODAwVVMgIDB4MDAwNDAwMDAgICAgICAgLyogVFggYXV0b21hdGljIHBvbGxpbmcgZXZlcnkgODAwdXMgKi8KKyNkZWZpbmUgVEFQXzFfNk1TICAweDAwMDYwMDAwICAgICAgIC8qIFRYIGF1dG9tYXRpYyBwb2xsaW5nIGV2ZXJ5IDEuNm1zICovCisjZGVmaW5lIFRBUF8xMl84VVMgMHgwMDA4MDAwMCAgICAgICAvKiBUWCBhdXRvbWF0aWMgcG9sbGluZyBldmVyeSAxMi44dXMgKi8KKyNkZWZpbmUgVEFQXzI1XzZVUyAweDAwMGEwMDAwICAgICAgIC8qIFRYIGF1dG9tYXRpYyBwb2xsaW5nIGV2ZXJ5IDI1LjZ1cyAqLworI2RlZmluZSBUQVBfNTFfMlVTIDB4MDAwYzAwMDAgICAgICAgLyogVFggYXV0b21hdGljIHBvbGxpbmcgZXZlcnkgNTEuMnVzICovCisjZGVmaW5lIFRBUF8xMDJfNFVTIDB4MDAwZTAwMDAgICAgICAvKiBUWCBhdXRvbWF0aWMgcG9sbGluZyBldmVyeSAxMDIuNHVzICovCisKKyNkZWZpbmUgQ0FMX05PVVNFICAweDAwMDAwMDAwICAgICAgIC8qIE5vdCB1c2VkICovCisjZGVmaW5lIENBTF84TE9ORyAgMHgwMDAwNDAwMCAgICAgICAvKiA4LWxvbmd3b3JkIGFsaWdubWVudCAqLworI2RlZmluZSBDQUxfMTZMT05HIDB4MDAwMDgwMDAgICAgICAgLyogMTYtbG9uZ3dvcmQgYWxpZ25tZW50ICovCisjZGVmaW5lIENBTF8zMkxPTkcgMHgwMDAwYzAwMCAgICAgICAvKiAzMi1sb25nd29yZCBhbGlnbm1lbnQgKi8KKworI2RlZmluZSBQQkxfMCAgICAgIDB4MDAwMDAwMDAgICAgICAgLyogIERNQSBidXJzdCBsZW5ndGggPSBhbW91bnQgaW4gUlggRklGTyAqLworI2RlZmluZSBQQkxfMSAgICAgIDB4MDAwMDAxMDAgICAgICAgLyogIDEgbG9uZ3dvcmQgIERNQSBidXJzdCBsZW5ndGggKi8KKyNkZWZpbmUgUEJMXzIgICAgICAweDAwMDAwMjAwICAgICAgIC8qICAyIGxvbmd3b3JkcyBETUEgYnVyc3QgbGVuZ3RoICovCisjZGVmaW5lIFBCTF80ICAgICAgMHgwMDAwMDQwMCAgICAgICAvKiAgNCBsb25nd29yZHMgRE1BIGJ1cnN0IGxlbmd0aCAqLworI2RlZmluZSBQQkxfOCAgICAgIDB4MDAwMDA4MDAgICAgICAgLyogIDggbG9uZ3dvcmRzIERNQSBidXJzdCBsZW5ndGggKi8KKyNkZWZpbmUgUEJMXzE2ICAgICAweDAwMDAxMDAwICAgICAgIC8qIDE2IGxvbmd3b3JkcyBETUEgYnVyc3QgbGVuZ3RoICovCisjZGVmaW5lIFBCTF8zMiAgICAgMHgwMDAwMjAwMCAgICAgICAvKiAzMiBsb25nd29yZHMgRE1BIGJ1cnN0IGxlbmd0aCAqLworCisjZGVmaW5lIERTTF8wICAgICAgMHgwMDAwMDAwMCAgICAgICAvKiAgMCBsb25nd29yZCAgLyBkZXNjcmlwdG9yICovCisjZGVmaW5lIERTTF8xICAgICAgMHgwMDAwMDAwNCAgICAgICAvKiAgMSBsb25nd29yZCAgLyBkZXNjcmlwdG9yICovCisjZGVmaW5lIERTTF8yICAgICAgMHgwMDAwMDAwOCAgICAgICAvKiAgMiBsb25nd29yZHMgLyBkZXNjcmlwdG9yICovCisjZGVmaW5lIERTTF80ICAgICAgMHgwMDAwMDAxMCAgICAgICAvKiAgNCBsb25nd29yZHMgLyBkZXNjcmlwdG9yICovCisjZGVmaW5lIERTTF84ICAgICAgMHgwMDAwMDAyMCAgICAgICAvKiAgOCBsb25nd29yZHMgLyBkZXNjcmlwdG9yICovCisjZGVmaW5lIERTTF8xNiAgICAgMHgwMDAwMDA0MCAgICAgICAvKiAxNiBsb25nd29yZHMgLyBkZXNjcmlwdG9yICovCisjZGVmaW5lIERTTF8zMiAgICAgMHgwMDAwMDA4MCAgICAgICAvKiAzMiBsb25nd29yZHMgLyBkZXNjcmlwdG9yICovCisKKy8qCisqKiBEQzIxMDQwIFRyYW5zbWl0IFBvbGwgRGVtYW5kIFJlZ2lzdGVyIChERTRYNV9UUEQpCisqLworI2RlZmluZSBUUEQgICAgICAgIDB4MDAwMDAwMDEgICAgICAgLyogVHJhbnNtaXQgUG9sbCBEZW1hbmQgKi8KKworLyoKKyoqIERDMjEwNDAgUmVjZWl2ZSBQb2xsIERlbWFuZCBSZWdpc3RlciAoREU0WDVfUlBEKQorKi8KKyNkZWZpbmUgUlBEICAgICAgICAweDAwMDAwMDAxICAgICAgIC8qIFJlY2VpdmUgUG9sbCBEZW1hbmQgKi8KKworLyoKKyoqIERDMjEwNDAgUmVjZWl2ZSBSaW5nIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAoREU0WDVfUlJCQSkKKyovCisjZGVmaW5lIFJSQkEgICAgICAgMHhmZmZmZmZmYyAgICAgICAvKiBSWCBEZXNjcmlwdG9yIExpc3QgU3RhcnQgQWRkcmVzcyAqLworCisvKgorKiogREMyMTA0MCBUcmFuc21pdCBSaW5nIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAoREU0WDVfVFJCQSkKKyovCisjZGVmaW5lIFRSQkEgICAgICAgMHhmZmZmZmZmYyAgICAgICAvKiBUWCBEZXNjcmlwdG9yIExpc3QgU3RhcnQgQWRkcmVzcyAqLworCisvKgorKiogU3RhdHVzIFJlZ2lzdGVyIChERTRYNV9TVFMpCisqLworI2RlZmluZSBTVFNfR1BJICAgIDB4MDQwMDAwMDAgICAgICAgLyogR2VuZXJhbCBQdXJwb3NlIFBvcnQgSW50ZXJydXB0ICovCisjZGVmaW5lIFNUU19CRSAgICAgMHgwMzgwMDAwMCAgICAgICAvKiBCdXMgRXJyb3IgQml0cyAqLworI2RlZmluZSBTVFNfVFMgICAgIDB4MDA3MDAwMDAgICAgICAgLyogVHJhbnNtaXQgUHJvY2VzcyBTdGF0ZSAqLworI2RlZmluZSBTVFNfUlMgICAgIDB4MDAwZTAwMDAgICAgICAgLyogUmVjZWl2ZSBQcm9jZXNzIFN0YXRlICovCisjZGVmaW5lIFNUU19OSVMgICAgMHgwMDAxMDAwMCAgICAgICAvKiBOb3JtYWwgSW50ZXJydXB0IFN1bW1hcnkgKi8KKyNkZWZpbmUgU1RTX0FJUyAgICAweDAwMDA4MDAwICAgICAgIC8qIEFibm9ybWFsIEludGVycnVwdCBTdW1tYXJ5ICovCisjZGVmaW5lIFNUU19FUiAgICAgMHgwMDAwNDAwMCAgICAgICAvKiBFYXJseSBSZWNlaXZlICovCisjZGVmaW5lIFNUU19GQkUgICAgMHgwMDAwMjAwMCAgICAgICAvKiBGYXRhbCBCdXMgRXJyb3IgKi8KKyNkZWZpbmUgU1RTX1NFICAgICAweDAwMDAyMDAwICAgICAgIC8qIFN5c3RlbSBFcnJvciAqLworI2RlZmluZSBTVFNfTE5GICAgIDB4MDAwMDEwMDAgICAgICAgLyogTGluayBGYWlsICovCisjZGVmaW5lIFNUU19GRCAgICAgMHgwMDAwMDgwMCAgICAgICAvKiBGdWxsLUR1cGxleCBTaG9ydCBGcmFtZSBSZWNlaXZlZCAqLworI2RlZmluZSBTVFNfVE0gICAgIDB4MDAwMDA4MDAgICAgICAgLyogVGltZXIgRXhwaXJlZCAoREMyMTA0MSkgKi8KKyNkZWZpbmUgU1RTX0VUSSAgICAweDAwMDAwNDAwICAgICAgIC8qIEVhcmx5IFRyYW5zbWl0IEludGVycnVwdCAqLworI2RlZmluZSBTVFNfQVQgICAgIDB4MDAwMDA0MDAgICAgICAgLyogQVVJL1RQIFBpbiAqLworI2RlZmluZSBTVFNfUldUICAgIDB4MDAwMDAyMDAgICAgICAgLyogUmVjZWl2ZSBXYXRjaGRvZyBUaW1lLU91dCAqLworI2RlZmluZSBTVFNfUlBTICAgIDB4MDAwMDAxMDAgICAgICAgLyogUmVjZWl2ZSBQcm9jZXNzIFN0b3BwZWQgKi8KKyNkZWZpbmUgU1RTX1JVICAgICAweDAwMDAwMDgwICAgICAgIC8qIFJlY2VpdmUgQnVmZmVyIFVuYXZhaWxhYmxlICovCisjZGVmaW5lIFNUU19SSSAgICAgMHgwMDAwMDA0MCAgICAgICAvKiBSZWNlaXZlIEludGVycnVwdCAqLworI2RlZmluZSBTVFNfVU5GICAgIDB4MDAwMDAwMjAgICAgICAgLyogVHJhbnNtaXQgVW5kZXJmbG93ICovCisjZGVmaW5lIFNUU19MTlAgICAgMHgwMDAwMDAxMCAgICAgICAvKiBMaW5rIFBhc3MgKi8KKyNkZWZpbmUgU1RTX0FOQyAgICAweDAwMDAwMDEwICAgICAgIC8qIEF1dG9uZWdvdGlhdGlvbiBDb21wbGV0ZSAqLworI2RlZmluZSBTVFNfVEpUICAgIDB4MDAwMDAwMDggICAgICAgLyogVHJhbnNtaXQgSmFiYmVyIFRpbWUtT3V0ICovCisjZGVmaW5lIFNUU19UVSAgICAgMHgwMDAwMDAwNCAgICAgICAvKiBUcmFuc21pdCBCdWZmZXIgVW5hdmFpbGFibGUgKi8KKyNkZWZpbmUgU1RTX1RQUyAgICAweDAwMDAwMDAyICAgICAgIC8qIFRyYW5zbWl0IFByb2Nlc3MgU3RvcHBlZCAqLworI2RlZmluZSBTVFNfVEkgICAgIDB4MDAwMDAwMDEgICAgICAgLyogVHJhbnNtaXQgSW50ZXJydXB0ICovCisKKyNkZWZpbmUgRUJfUEFSICAgICAweDAwMDAwMDAwICAgICAgIC8qIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBFQl9NQSAgICAgIDB4MDA4MDAwMDAgICAgICAgLyogTWFzdGVyIEFib3J0ICovCisjZGVmaW5lIEVCX1RBICAgICAgMHgwMTAwMDAwMCAgICAgICAvKiBUYXJnZXQgQWJvcnQgKi8KKyNkZWZpbmUgRUJfUkVTMCAgICAweDAxODAwMDAwICAgICAgIC8qIFJlc2VydmVkICovCisjZGVmaW5lIEVCX1JFUzEgICAgMHgwMjAwMDAwMCAgICAgICAvKiBSZXNlcnZlZCAqLworCisjZGVmaW5lIFRTX1NUT1AgICAgMHgwMDAwMDAwMCAgICAgICAvKiBTdG9wcGVkICovCisjZGVmaW5lIFRTX0ZURCAgICAgMHgwMDEwMDAwMCAgICAgICAvKiBGZXRjaCBUcmFuc21pdCBEZXNjcmlwdG9yICovCisjZGVmaW5lIFRTX1dFT1QgICAgMHgwMDIwMDAwMCAgICAgICAvKiBXYWl0IGZvciBFbmQgT2YgVHJhbnNtaXNzaW9uICovCisjZGVmaW5lIFRTX1FEQVQgICAgMHgwMDMwMDAwMCAgICAgICAvKiBRdWV1ZSBza2IgZGF0YSBpbnRvIFRYIEZJRk8gKi8KKyNkZWZpbmUgVFNfUkVTICAgICAweDAwNDAwMDAwICAgICAgIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFRTX1NQS1QgICAgMHgwMDUwMDAwMCAgICAgICAvKiBTZXR1cCBQYWNrZXQgKi8KKyNkZWZpbmUgVFNfU1VTUCAgICAweDAwNjAwMDAwICAgICAgIC8qIFN1c3BlbmRlZCAqLworI2RlZmluZSBUU19DTFREICAgIDB4MDA3MDAwMDAgICAgICAgLyogQ2xvc2UgVHJhbnNtaXQgRGVzY3JpcHRvciAqLworCisjZGVmaW5lIFJTX1NUT1AgICAgMHgwMDAwMDAwMCAgICAgICAvKiBTdG9wcGVkICovCisjZGVmaW5lIFJTX0ZSRCAgICAgMHgwMDAyMDAwMCAgICAgICAvKiBGZXRjaCBSZWNlaXZlIERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgUlNfQ0VPUiAgICAweDAwMDQwMDAwICAgICAgIC8qIENoZWNrIGZvciBFbmQgb2YgUmVjZWl2ZSBQYWNrZXQgKi8KKyNkZWZpbmUgUlNfV0ZSUCAgICAweDAwMDYwMDAwICAgICAgIC8qIFdhaXQgZm9yIFJlY2VpdmUgUGFja2V0ICovCisjZGVmaW5lIFJTX1NVU1AgICAgMHgwMDA4MDAwMCAgICAgICAvKiBTdXNwZW5kZWQgKi8KKyNkZWZpbmUgUlNfQ0xSRCAgICAweDAwMGEwMDAwICAgICAgIC8qIENsb3NlIFJlY2VpdmUgRGVzY3JpcHRvciAqLworI2RlZmluZSBSU19GTFVTSCAgIDB4MDAwYzAwMDAgICAgICAgLyogRmx1c2ggUlggRklGTyAqLworI2RlZmluZSBSU19RUkZTICAgIDB4MDAwZTAwMDAgICAgICAgLyogUXVldWUgUlggRklGTyBpbnRvIFJYIFNrYiAqLworCisjZGVmaW5lIElOVF9DQU5DRUwgMHgwMDAxZmZmZiAgICAgICAvKiBGb3IgemVyb2luZyBhbGwgaW50ZXJydXB0IHNvdXJjZXMgKi8KKworLyoKKyoqIE9wZXJhdGlvbiBNb2RlIFJlZ2lzdGVyIChERTRYNV9PTVIpCisqLworI2RlZmluZSBPTVJfU0MgICAgIDB4ODAwMDAwMDAgICAgICAgLyogU3BlY2lhbCBDYXB0dXJlIEVmZmVjdCBFbmFibGUgKi8KKyNkZWZpbmUgT01SX1JBICAgICAweDQwMDAwMDAwICAgICAgIC8qIFJlY2VpdmUgQWxsICovCisjZGVmaW5lIE9NUl9TRFAgICAgMHgwMjAwMDAwMCAgICAgICAvKiBTRCBQb2xhcml0eSAtIE1VU1QgQkUgQVNTRVJURUQgKi8KKyNkZWZpbmUgT01SX1NDUiAgICAweDAxMDAwMDAwICAgICAgIC8qIFNjcmFtYmxlciBNb2RlICovCisjZGVmaW5lIE9NUl9QQ1MgICAgMHgwMDgwMDAwMCAgICAgICAvKiBQQ1MgRnVuY3Rpb24gKi8KKyNkZWZpbmUgT01SX1RUTSAgICAweDAwNDAwMDAwICAgICAgIC8qIFRyYW5zbWl0IFRocmVzaG9sZCBNb2RlICovCisjZGVmaW5lIE9NUl9TRiAgICAgMHgwMDIwMDAwMCAgICAgICAvKiBTdG9yZSBhbmQgRm9yd2FyZCAqLworI2RlZmluZSBPTVJfSEJEICAgIDB4MDAwODAwMDAgICAgICAgLyogSGVhcnRCZWF0IERpc2FibGUgKi8KKyNkZWZpbmUgT01SX1BTICAgICAweDAwMDQwMDAwICAgICAgIC8qIFBvcnQgU2VsZWN0ICovCisjZGVmaW5lIE9NUl9DQSAgICAgMHgwMDAyMDAwMCAgICAgICAvKiBDYXB0dXJlIEVmZmVjdCBFbmFibGUgKi8KKyNkZWZpbmUgT01SX0JQICAgICAweDAwMDEwMDAwICAgICAgIC8qIEJhY2sgUHJlc3N1cmUgKi8KKyNkZWZpbmUgT01SX1RSICAgICAweDAwMDBjMDAwICAgICAgIC8qIFRocmVzaG9sZCBDb250cm9sIEJpdHMgKi8KKyNkZWZpbmUgT01SX1NUICAgICAweDAwMDAyMDAwICAgICAgIC8qIFN0YXJ0L1N0b3AgVHJhbnNtaXNzaW9uIENvbW1hbmQgKi8KKyNkZWZpbmUgT01SX0ZDICAgICAweDAwMDAxMDAwICAgICAgIC8qIEZvcmNlIENvbGxpc2lvbiBNb2RlICovCisjZGVmaW5lIE9NUl9PTSAgICAgMHgwMDAwMGMwMCAgICAgICAvKiBPcGVyYXRpbmcgTW9kZSAqLworI2RlZmluZSBPTVJfRkRYICAgIDB4MDAwMDAyMDAgICAgICAgLyogRnVsbCBEdXBsZXggTW9kZSAqLworI2RlZmluZSBPTVJfRktEICAgIDB4MDAwMDAxMDAgICAgICAgLyogRmxha3kgT3NjaWxsYXRvciBEaXNhYmxlICovCisjZGVmaW5lIE9NUl9QTSAgICAgMHgwMDAwMDA4MCAgICAgICAvKiBQYXNzIEFsbCBNdWx0aWNhc3QgKi8KKyNkZWZpbmUgT01SX1BSICAgICAweDAwMDAwMDQwICAgICAgIC8qIFByb21pc2N1b3VzIE1vZGUgKi8KKyNkZWZpbmUgT01SX1NCICAgICAweDAwMDAwMDIwICAgICAgIC8qIFN0YXJ0L1N0b3AgQmFja29mZiBDb3VudGVyICovCisjZGVmaW5lIE9NUl9JRiAgICAgMHgwMDAwMDAxMCAgICAgICAvKiBJbnZlcnNlIEZpbHRlcmluZyAqLworI2RlZmluZSBPTVJfUEIgICAgIDB4MDAwMDAwMDggICAgICAgLyogUGFzcyBCYWQgRnJhbWVzICovCisjZGVmaW5lIE9NUl9ITyAgICAgMHgwMDAwMDAwNCAgICAgICAvKiBIYXNoIE9ubHkgRmlsdGVyaW5nIE1vZGUgKi8KKyNkZWZpbmUgT01SX1NSICAgICAweDAwMDAwMDAyICAgICAgIC8qIFN0YXJ0L1N0b3AgUmVjZWl2ZSAqLworI2RlZmluZSBPTVJfSFAgICAgIDB4MDAwMDAwMDEgICAgICAgLyogSGFzaC9QZXJmZWN0IFJlY2VpdmUgRmlsdGVyaW5nIE1vZGUgKi8KKworI2RlZmluZSBUUl83MiAgICAgIDB4MDAwMDAwMDAgICAgICAgLyogVGhyZXNob2xkIHNldCB0byA3MiAoMTI4KSBieXRlcyAqLworI2RlZmluZSBUUl85NiAgICAgIDB4MDAwMDQwMDAgICAgICAgLyogVGhyZXNob2xkIHNldCB0byA5NiAoMjU2KSBieXRlcyAqLworI2RlZmluZSBUUl8xMjggICAgIDB4MDAwMDgwMDAgICAgICAgLyogVGhyZXNob2xkIHNldCB0byAxMjggKDUxMikgYnl0ZXMgKi8KKyNkZWZpbmUgVFJfMTYwICAgICAweDAwMDBjMDAwICAgICAgIC8qIFRocmVzaG9sZCBzZXQgdG8gMTYwICgxMDI0KSBieXRlcyAqLworCisjZGVmaW5lIE9NUl9ERUYgICAgIChPTVJfU0RQKQorI2RlZmluZSBPTVJfU0lBICAgICAoT01SX1NEUCB8IE9NUl9UVE0pCisjZGVmaW5lIE9NUl9TWU0gICAgIChPTVJfU0RQIHwgT01SX1NDUiB8IE9NUl9QQ1MgfCBPTVJfSEJEIHwgT01SX1BTKQorI2RlZmluZSBPTVJfTUlJXzEwICAoT01SX1NEUCB8IE9NUl9UVE0gfCBPTVJfUFMpCisjZGVmaW5lIE9NUl9NSUlfMTAwIChPTVJfU0RQIHwgT01SX0hCRCB8IE9NUl9QUykKKworLyoKKyoqIERDMjEwNDAgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKERFNFg1X0lNUikKKyovCisjZGVmaW5lIElNUl9HUE0gICAgMHgwNDAwMDAwMCAgICAgICAvKiBHZW5lcmFsIFB1cnBvc2UgUG9ydCBNYXNrICovCisjZGVmaW5lIElNUl9OSU0gICAgMHgwMDAxMDAwMCAgICAgICAvKiBOb3JtYWwgSW50ZXJydXB0IFN1bW1hcnkgTWFzayAqLworI2RlZmluZSBJTVJfQUlNICAgIDB4MDAwMDgwMDAgICAgICAgLyogQWJub3JtYWwgSW50ZXJydXB0IFN1bW1hcnkgTWFzayAqLworI2RlZmluZSBJTVJfRVJNICAgIDB4MDAwMDQwMDAgICAgICAgLyogRWFybHkgUmVjZWl2ZSBNYXNrICovCisjZGVmaW5lIElNUl9GQk0gICAgMHgwMDAwMjAwMCAgICAgICAvKiBGYXRhbCBCdXMgRXJyb3IgTWFzayAqLworI2RlZmluZSBJTVJfU0VNICAgIDB4MDAwMDIwMDAgICAgICAgLyogU3lzdGVtIEVycm9yIE1hc2sgKi8KKyNkZWZpbmUgSU1SX0xGTSAgICAweDAwMDAxMDAwICAgICAgIC8qIExpbmsgRmFpbCBNYXNrICovCisjZGVmaW5lIElNUl9GRE0gICAgMHgwMDAwMDgwMCAgICAgICAvKiBGdWxsLUR1cGxleCAoU2hvcnQgRnJhbWUpIE1hc2sgKi8KKyNkZWZpbmUgSU1SX1RNTSAgICAweDAwMDAwODAwICAgICAgIC8qIFRpbWVyIEV4cGlyZWQgTWFzayAoREMyMTA0MSkgKi8KKyNkZWZpbmUgSU1SX0VUTSAgICAweDAwMDAwNDAwICAgICAgIC8qIEVhcmx5IFRyYW5zbWl0IEludGVycnVwdCBNYXNrICovCisjZGVmaW5lIElNUl9BVE0gICAgMHgwMDAwMDQwMCAgICAgICAvKiBBVUkvVFAgU3dpdGNoIE1hc2sgKi8KKyNkZWZpbmUgSU1SX1JXTSAgICAweDAwMDAwMjAwICAgICAgIC8qIFJlY2VpdmUgV2F0Y2hkb2cgVGltZS1PdXQgTWFzayAqLworI2RlZmluZSBJTVJfUlNNICAgIDB4MDAwMDAxMDAgICAgICAgLyogUmVjZWl2ZSBTdG9wcGVkIE1hc2sgKi8KKyNkZWZpbmUgSU1SX1JVTSAgICAweDAwMDAwMDgwICAgICAgIC8qIFJlY2VpdmUgQnVmZmVyIFVuYXZhaWxhYmxlIE1hc2sgKi8KKyNkZWZpbmUgSU1SX1JJTSAgICAweDAwMDAwMDQwICAgICAgIC8qIFJlY2VpdmUgSW50ZXJydXB0IE1hc2sgKi8KKyNkZWZpbmUgSU1SX1VOTSAgICAweDAwMDAwMDIwICAgICAgIC8qIFVuZGVyZmxvdyBJbnRlcnJ1cHQgTWFzayAqLworI2RlZmluZSBJTVJfQU5NICAgIDB4MDAwMDAwMTAgICAgICAgLyogQXV0b25lZ290aWF0aW9uIENvbXBsZXRlIE1hc2sgKi8KKyNkZWZpbmUgSU1SX0xQTSAgICAweDAwMDAwMDEwICAgICAgIC8qIExpbmsgUGFzcyAqLworI2RlZmluZSBJTVJfVEpNICAgIDB4MDAwMDAwMDggICAgICAgLyogVHJhbnNtaXQgVGltZS1PdXQgSmFiYmVyIE1hc2sgKi8KKyNkZWZpbmUgSU1SX1RVTSAgICAweDAwMDAwMDA0ICAgICAgIC8qIFRyYW5zbWl0IEJ1ZmZlciBVbmF2YWlsYWJsZSBNYXNrICovCisjZGVmaW5lIElNUl9UU00gICAgMHgwMDAwMDAwMiAgICAgICAvKiBUcmFuc21pc3Npb24gU3RvcHBlZCBNYXNrICovCisjZGVmaW5lIElNUl9USU0gICAgMHgwMDAwMDAwMSAgICAgICAvKiBUcmFuc21pdCBJbnRlcnJ1cHQgTWFzayAqLworCisvKgorKiogTWlzc2VkIEZyYW1lcyBhbmQgRklGTyBPdmVyZmxvdyBDb3VudGVycyAoREU0WDVfTUZDKQorKi8KKyNkZWZpbmUgTUZDX0ZPQ08gICAweDEwMDAwMDAwICAgICAgIC8qIEZJRk8gT3ZlcmZsb3cgQ291bnRlciBPdmVyZmxvdyBCaXQgKi8KKyNkZWZpbmUgTUZDX0ZPQyAgICAweDBmZmUwMDAwICAgICAgIC8qIEZJRk8gT3ZlcmZsb3cgQ291bnRlciBCaXRzICovCisjZGVmaW5lIE1GQ19PVkZMICAgMHgwMDAxMDAwMCAgICAgICAvKiBNaXNzZWQgRnJhbWVzIENvdW50ZXIgT3ZlcmZsb3cgQml0ICovCisjZGVmaW5lIE1GQ19DTlRSICAgMHgwMDAwZmZmZiAgICAgICAvKiBNaXNzZWQgRnJhbWVzIENvdW50ZXIgQml0cyAqLworI2RlZmluZSBNRkNfRk9DTSAgIDB4MWZmZTAwMDAgICAgICAgLyogRklGTyBPdmVyZmxvdyBDb3VudGVyIE1hc2sgKi8KKworLyoKKyoqIERDMjEwNDAgRXRoZXJuZXQgQWRkcmVzcyBQUk9NIChERTRYNV9BUFJPTSkKKyovCisjZGVmaW5lIEFQUk9NX0ROICAgMHg4MDAwMDAwMCAgICAgICAvKiBEYXRhIE5vdCBWYWxpZCAqLworI2RlZmluZSBBUFJPTV9EVCAgIDB4MDAwMDAwZmYgICAgICAgLyogQWRkcmVzcyBCeXRlICovCisKKy8qCisqKiBEQzIxMDQxIEJvb3QvRXRoZXJuZXQgQWRkcmVzcyBST00gKERFNFg1X0JST00pCisqLworI2RlZmluZSBCUk9NX01PREUgMHgwMDAwODAwMCAgICAgICAvKiBNT0RFXzE6IDAsICBNT0RFXzA6IDEgIChyZWFkIG9ubHkpICovCisjZGVmaW5lIEJST01fUkQgICAweDAwMDA0MDAwICAgICAgIC8qIFJlYWQgZnJvbSBCb290IFJPTSAqLworI2RlZmluZSBCUk9NX1dSICAgMHgwMDAwMjAwMCAgICAgICAvKiBXcml0ZSB0byBCb290IFJPTSAqLworI2RlZmluZSBCUk9NX0JSICAgMHgwMDAwMTAwMCAgICAgICAvKiBTZWxlY3QgQm9vdCBST00gd2hlbiBzZXQgKi8KKyNkZWZpbmUgQlJPTV9TUiAgIDB4MDAwMDA4MDAgICAgICAgLyogU2VsZWN0IFNlcmlhbCBST00gd2hlbiBzZXQgKi8KKyNkZWZpbmUgQlJPTV9SRUcgIDB4MDAwMDA0MDAgICAgICAgLyogRXh0ZXJuYWwgUmVnaXN0ZXIgU2VsZWN0ICovCisjZGVmaW5lIEJST01fRFQgICAweDAwMDAwMGZmICAgICAgIC8qIERhdGEgQnl0ZSAqLworCisvKgorKiogREMyMTA0MSBTZXJpYWwvRXRoZXJuZXQgQWRkcmVzcyBST00gKERFNFg1X1NST00sIERFNFg1X01JSSkKKyovCisjZGVmaW5lIE1JSV9NREkgICAweDAwMDgwMDAwICAgICAgIC8qIE1JSSBNYW5hZ2VtZW50IERhdGEgSW4gKi8KKyNkZWZpbmUgTUlJX01ETyAgIDB4MDAwNjAwMDAgICAgICAgLyogTUlJIE1hbmFnZW1lbnQgTW9kZS9EYXRhIE91dCAqLworI2RlZmluZSBNSUlfTVJEICAgMHgwMDA0MDAwMCAgICAgICAvKiBNSUkgTWFuYWdlbWVudCBEZWZpbmUgUmVhZCBNb2RlICovCisjZGVmaW5lIE1JSV9NV1IgICAweDAwMDAwMDAwICAgICAgIC8qIE1JSSBNYW5hZ2VtZW50IERlZmluZSBXcml0ZSBNb2RlICovCisjZGVmaW5lIE1JSV9NRFQgICAweDAwMDIwMDAwICAgICAgIC8qIE1JSSBNYW5hZ2VtZW50IERhdGEgT3V0ICovCisjZGVmaW5lIE1JSV9NREMgICAweDAwMDEwMDAwICAgICAgIC8qIE1JSSBNYW5hZ2VtZW50IENsb2NrICovCisjZGVmaW5lIE1JSV9SRCAgICAweDAwMDA0MDAwICAgICAgIC8qIFJlYWQgZnJvbSBNSUkgKi8KKyNkZWZpbmUgTUlJX1dSICAgIDB4MDAwMDIwMDAgICAgICAgLyogV3JpdGUgdG8gTUlJICovCisjZGVmaW5lIE1JSV9TRUwgICAweDAwMDAwODAwICAgICAgIC8qIFNlbGVjdCBNSUkgd2hlbiBSRVNFVCAqLworCisjZGVmaW5lIFNST01fTU9ERSAweDAwMDA4MDAwICAgICAgIC8qIE1PREVfMTogMCwgIE1PREVfMDogMSAgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgU1JPTV9SRCAgIDB4MDAwMDQwMDAgICAgICAgLyogUmVhZCBmcm9tIEJvb3QgUk9NICovCisjZGVmaW5lIFNST01fV1IgICAweDAwMDAyMDAwICAgICAgIC8qIFdyaXRlIHRvIEJvb3QgUk9NICovCisjZGVmaW5lIFNST01fQlIgICAweDAwMDAxMDAwICAgICAgIC8qIFNlbGVjdCBCb290IFJPTSB3aGVuIHNldCAqLworI2RlZmluZSBTUk9NX1NSICAgMHgwMDAwMDgwMCAgICAgICAvKiBTZWxlY3QgU2VyaWFsIFJPTSB3aGVuIHNldCAqLworI2RlZmluZSBTUk9NX1JFRyAgMHgwMDAwMDQwMCAgICAgICAvKiBFeHRlcm5hbCBSZWdpc3RlciBTZWxlY3QgKi8KKyNkZWZpbmUgU1JPTV9EVCAgIDB4MDAwMDAwZmYgICAgICAgLyogRGF0YSBCeXRlICovCisKKyNkZWZpbmUgRFRfT1VUICAgIDB4MDAwMDAwMDggICAgICAgLyogU2VyaWFsIERhdGEgT3V0ICovCisjZGVmaW5lIERUX0lOICAgICAweDAwMDAwMDA0ICAgICAgIC8qIFNlcmlhbCBEYXRhIEluICovCisjZGVmaW5lIERUX0NMSyAgICAweDAwMDAwMDAyICAgICAgIC8qIFNlcmlhbCBST00gQ2xvY2sgKi8KKyNkZWZpbmUgRFRfQ1MgICAgIDB4MDAwMDAwMDEgICAgICAgLyogU2VyaWFsIFJPTSBDaGlwIFNlbGVjdCAqLworCisjZGVmaW5lIE1JSV9QUkVBTUJMRSAweGZmZmZmZmZmICAgIC8qIE1JSSBNYW5hZ2VtZW50IFByZWFtYmxlICovCisjZGVmaW5lIE1JSV9URVNUICAgICAweGFhYWFhYWFhICAgIC8qIE1JSSBUZXN0IFNpZ25hbCAqLworI2RlZmluZSBNSUlfU1RSRCAgICAgMHgwNiAgICAgICAgICAvKiBTdGFydCBvZiBGcmFtZStPcCBDb2RlOiB1c2UgbG93IG5pYmJsZSAqLworI2RlZmluZSBNSUlfU1RXUiAgICAgMHgwYSAgICAgICAgICAvKiBTdGFydCBvZiBGcmFtZStPcCBDb2RlOiB1c2UgbG93IG5pYmJsZSAqLworCisjZGVmaW5lIE1JSV9DUiAgICAgICAweDAwICAgICAgICAgIC8qIE1JSSBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX1NSICAgICAgIDB4MDEgICAgICAgICAgLyogTUlJIE1hbmFnZW1lbnQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9JRDAgICAgICAweDAyICAgICAgICAgIC8qIFBIWSBJZGVudGlmaWVyIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgTUlJX0lEMSAgICAgIDB4MDMgICAgICAgICAgLyogUEhZIElkZW50aWZpZXIgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBNSUlfQU5BICAgICAgMHgwNCAgICAgICAgICAvKiBBdXRvIE5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgKi8KKyNkZWZpbmUgTUlJX0FOTFBBICAgIDB4MDUgICAgICAgICAgLyogQXV0byBOZWdvdGlhdGlvbiBMaW5rIFBhcnRuZXIgQWJpbGl0eSAqLworI2RlZmluZSBNSUlfQU5FICAgICAgMHgwNiAgICAgICAgICAvKiBBdXRvIE5lZ290aWF0aW9uIEV4cGFuc2lvbiAqLworI2RlZmluZSBNSUlfQU5QICAgICAgMHgwNyAgICAgICAgICAvKiBBdXRvIE5lZ290aWF0aW9uIE5leHQgUGFnZSBUWCAqLworCisjZGVmaW5lIERFNFg1X01BWF9NSUkgMzIgICAgICAgICAgIC8qIE1heGltdW0gYWRkcmVzcyBvZiBNSUkgUEhZIGRldmljZXMgKi8KKworLyoKKyoqIE1JSSBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIKKyovCisjZGVmaW5lIE1JSV9DUl9SU1QgIDB4ODAwMCAgICAgICAgIC8qIFJFU0VUIHRoZSBQSFkgY2hpcCAqLworI2RlZmluZSBNSUlfQ1JfTFBCSyAweDQwMDAgICAgICAgICAvKiBMb29wYmFjayBlbmFibGUgKi8KKyNkZWZpbmUgTUlJX0NSX1NQRCAgMHgyMDAwICAgICAgICAgLyogMDogMTBNYi9zOyAxOiAxMDBNYi9zICovCisjZGVmaW5lIE1JSV9DUl8xMCAgIDB4MDAwMCAgICAgICAgIC8qIFNldCAxME1iL3MgKi8KKyNkZWZpbmUgTUlJX0NSXzEwMCAgMHgyMDAwICAgICAgICAgLyogU2V0IDEwME1iL3MgKi8KKyNkZWZpbmUgTUlJX0NSX0FTU0UgMHgxMDAwICAgICAgICAgLyogQXV0byBTcGVlZCBTZWxlY3QgRW5hYmxlICovCisjZGVmaW5lIE1JSV9DUl9QRCAgIDB4MDgwMCAgICAgICAgIC8qIFBvd2VyIERvd24gKi8KKyNkZWZpbmUgTUlJX0NSX0lTT0wgMHgwNDAwICAgICAgICAgLyogSXNvbGF0ZSBNb2RlICovCisjZGVmaW5lIE1JSV9DUl9SQU4gIDB4MDIwMCAgICAgICAgIC8qIFJlc3RhcnQgQXV0byBOZWdvdGlhdGlvbiAqLworI2RlZmluZSBNSUlfQ1JfRkRNICAweDAxMDAgICAgICAgICAvKiBGdWxsIER1cGxleCBNb2RlICovCisjZGVmaW5lIE1JSV9DUl9DVEUgIDB4MDA4MCAgICAgICAgIC8qIENvbGxpc2lvbiBUZXN0IEVuYWJsZSAqLworCisvKgorKiogTUlJIE1hbmFnZW1lbnQgU3RhdHVzIFJlZ2lzdGVyCisqLworI2RlZmluZSBNSUlfU1JfVDRDICAweDgwMDAgICAgICAgICAvKiAxMDBCQVNFLVQ0IGNhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSX1RYRkQgMHg0MDAwICAgICAgICAgLyogMTAwQkFTRS1UWCBGdWxsIER1cGxleCBjYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl9UWEhEIDB4MjAwMCAgICAgICAgIC8qIDEwMEJBU0UtVFggSGFsZiBEdXBsZXggY2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfVEZEICAweDEwMDAgICAgICAgICAvKiAxMEJBU0UtVCBGdWxsIER1cGxleCBjYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl9USEQgIDB4MDgwMCAgICAgICAgIC8qIDEwQkFTRS1UIEhhbGYgRHVwbGV4IGNhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSX0FTU0MgMHgwMDIwICAgICAgICAgLyogQXV0byBTcGVlZCBTZWxlY3Rpb24gQ29tcGxldGUqLworI2RlZmluZSBNSUlfU1JfUkZEICAweDAwMTAgICAgICAgICAvKiBSZW1vdGUgRmF1bHQgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgTUlJX1NSX0FOQyAgMHgwMDA4ICAgICAgICAgLyogQXV0byBOZWdvdGlhdGlvbiBjYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl9MS1MgIDB4MDAwNCAgICAgICAgIC8qIExpbmsgU3RhdHVzICovCisjZGVmaW5lIE1JSV9TUl9KQUJEIDB4MDAwMiAgICAgICAgIC8qIEphYmJlciBEZXRlY3QgKi8KKyNkZWZpbmUgTUlJX1NSX1hDICAgMHgwMDAxICAgICAgICAgLyogRXh0ZW5kZWQgQ2FwYWJpbGl0aWVzICovCisKKy8qCisqKiBNSUkgTWFuYWdlbWVudCBBdXRvIE5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIKKyovCisjZGVmaW5lIE1JSV9BTkFfVEFGICAweDAzZTAgICAgICAgIC8qIFRlY2hub2xvZ3kgQWJpbGl0eSBGaWVsZCAqLworI2RlZmluZSBNSUlfQU5BX1Q0QU0gMHgwMjAwICAgICAgICAvKiBUNCBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5BX1RYQU0gMHgwMTgwICAgICAgICAvKiBUWCBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5BX0ZEQU0gMHgwMTQwICAgICAgICAvKiBGdWxsIER1cGxleCBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5BX0hEQU0gMHgwMmEwICAgICAgICAvKiBIYWxmIER1cGxleCBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5BXzEwME0gMHgwMzgwICAgICAgICAvKiAxMDBNYiBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5BXzEwTSAgMHgwMDYwICAgICAgICAvKiAxME1iIFRlY2hub2xvZ3kgQWJpbGl0eSBNYXNrICovCisjZGVmaW5lIE1JSV9BTkFfQ1NNQSAweDAwMDEgICAgICAgIC8qIENTTUEtQ0QgQ2FwYWJsZSAqLworCisvKgorKiogTUlJIE1hbmFnZW1lbnQgQXV0byBOZWdvdGlhdGlvbiBSZW1vdGUgRW5kIFJlZ2lzdGVyCisqLworI2RlZmluZSBNSUlfQU5MUEFfTlAgICAweDgwMDAgICAgICAvKiBOZXh0IFBhZ2UgKEVuYWJsZSkgKi8KKyNkZWZpbmUgTUlJX0FOTFBBX0FDSyAgMHg0MDAwICAgICAgLyogUmVtb3RlIEFja25vd2xlZGdlICovCisjZGVmaW5lIE1JSV9BTkxQQV9SRiAgIDB4MjAwMCAgICAgIC8qIFJlbW90ZSBGYXVsdCAqLworI2RlZmluZSBNSUlfQU5MUEFfVEFGICAweDAzZTAgICAgICAvKiBUZWNobm9sb2d5IEFiaWxpdHkgRmllbGQgKi8KKyNkZWZpbmUgTUlJX0FOTFBBX1Q0QU0gMHgwMjAwICAgICAgLyogVDQgVGVjaG5vbG9neSBBYmlsaXR5IE1hc2sgKi8KKyNkZWZpbmUgTUlJX0FOTFBBX1RYQU0gMHgwMTgwICAgICAgLyogVFggVGVjaG5vbG9neSBBYmlsaXR5IE1hc2sgKi8KKyNkZWZpbmUgTUlJX0FOTFBBX0ZEQU0gMHgwMTQwICAgICAgLyogRnVsbCBEdXBsZXggVGVjaG5vbG9neSBBYmlsaXR5IE1hc2sgKi8KKyNkZWZpbmUgTUlJX0FOTFBBX0hEQU0gMHgwMmEwICAgICAgLyogSGFsZiBEdXBsZXggVGVjaG5vbG9neSBBYmlsaXR5IE1hc2sgKi8KKyNkZWZpbmUgTUlJX0FOTFBBXzEwME0gMHgwMzgwICAgICAgLyogMTAwTWIgVGVjaG5vbG9neSBBYmlsaXR5IE1hc2sgKi8KKyNkZWZpbmUgTUlJX0FOTFBBXzEwTSAgMHgwMDYwICAgICAgLyogMTBNYiBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5MUEFfQ1NNQSAweDAwMDEgICAgICAvKiBDU01BLUNEIENhcGFibGUgKi8KKworLyoKKyoqIFNST00gTWVkaWEgRGVmaW5pdGlvbnMgKEFCRyBTUk9NIFNlY3Rpb24pCisqLworI2RlZmluZSBNRURJQV9OV0FZICAgICAweDAwODAgICAgICAvKiBOd2F5IChBdXRvIE5lZ290aWF0aW9uKSBvbiBQSFkgKi8KKyNkZWZpbmUgTUVESUFfTUlJICAgICAgMHgwMDQwICAgICAgLyogTUlJIFByZXNlbnQgb24gdGhlIGFkYXB0ZXIgKi8KKyNkZWZpbmUgTUVESUFfRklCUkUgICAgMHgwMDA4ICAgICAgLyogRmlicmUgTWVkaWEgcHJlc2VudCAqLworI2RlZmluZSBNRURJQV9BVUkgICAgICAweDAwMDQgICAgICAvKiBBVUkgTWVkaWEgcHJlc2VudCAqLworI2RlZmluZSBNRURJQV9UUCAgICAgICAweDAwMDIgICAgICAvKiBUUCBNZWRpYSBwcmVzZW50ICovCisjZGVmaW5lIE1FRElBX0JOQyAgICAgIDB4MDAwMSAgICAgIC8qIEJOQyBNZWRpYSBwcmVzZW50ICovCisKKy8qCisqKiBTUk9NIERlZmluaXRpb25zIChEaWdpdGFsIFNlbWljb25kdWN0b3IgRm9ybWF0KQorKi8KKyNkZWZpbmUgU1JPTV9TU1ZJRCAgICAgMHgwMDAwICAgICAgLyogU3ViLXN5c3RlbSBWZW5kb3IgSUQgb2Zmc2V0ICovCisjZGVmaW5lIFNST01fU1NJRCAgICAgIDB4MDAwMiAgICAgIC8qIFN1Yi1zeXN0ZW0gSUQgb2Zmc2V0ICovCisjZGVmaW5lIFNST01fQ0lTUEwgICAgIDB4MDAwNCAgICAgIC8qIENhcmRCdXMgQ0lTIFBvaW50ZXIgbG93IG9mZnNldCAqLworI2RlZmluZSBTUk9NX0NJU1BIICAgICAweDAwMDYgICAgICAvKiBDYXJkQnVzIENJUyBQb2ludGVyIGhpZ2ggb2Zmc2V0ICovCisjZGVmaW5lIFNST01fSURDUkMgICAgIDB4MDAxMCAgICAgIC8qIElEIEJsb2NrIENSQyBvZmZzZXQqLworI2RlZmluZSBTUk9NX1JTVkQyICAgICAweDAwMTEgICAgICAvKiBJRCBSZXNlcnZlZCAyIG9mZnNldCAqLworI2RlZmluZSBTUk9NX1NGViAgICAgICAweDAwMTIgICAgICAvKiBTUk9NIEZvcm1hdCBWZXJzaW9uIG9mZnNldCAqLworI2RlZmluZSBTUk9NX0NDTlQgICAgICAweDAwMTMgICAgICAvKiBDb250cm9sbGVyIENvdW50IG9mZnNldCAqLworI2RlZmluZSBTUk9NX0hXQUREICAgICAweDAwMTQgICAgICAvKiBIYXJkd2FyZSBBZGRyZXNzIG9mZnNldCAqLworI2RlZmluZSBTUk9NX01SU1ZEICAgICAweDAwN2MgICAgICAvKiBNYW51ZmFjdHVyZXIgUmVzZXJ2ZWQgb2Zmc2V0Ki8KKyNkZWZpbmUgU1JPTV9DUkMgICAgICAgMHgwMDdlICAgICAgLyogU1JPTSBDUkMgb2Zmc2V0ICovCisKKy8qCisqKiBTUk9NIE1lZGlhIENvbm5lY3Rpb24gRGVmaW5pdGlvbnMKKyovCisjZGVmaW5lIFNST01fMTBCVCAgICAgIDB4MDAwMCAgICAgIC8qICAxMEJBU0UtVCBoYWxmIGR1cGxleCAqLworI2RlZmluZSBTUk9NXzEwQlROICAgICAweDAxMDAgICAgICAvKiAgMTBCQVNFLVQgd2l0aCBOd2F5ICovCisjZGVmaW5lIFNST01fMTBCVEYgICAgIDB4MDIwNCAgICAgIC8qICAxMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBTUk9NXzEwQlROTFAgICAweDA0MDAgICAgICAvKiAgMTBCQVNFLVQgd2l0aG91dCBMaW5rIFBhc3MgdGVzdCAqLworI2RlZmluZSBTUk9NXzEwQjIgICAgICAweDAwMDEgICAgICAvKiAgMTBCQVNFLTIgKEJOQykgKi8KKyNkZWZpbmUgU1JPTV8xMEI1ICAgICAgMHgwMDAyICAgICAgLyogIDEwQkFTRS01IChBVUkpICovCisjZGVmaW5lIFNST01fMTAwQlRIICAgIDB4MDAwMyAgICAgIC8qICAxMDBCQVNFLVQgaGFsZiBkdXBsZXggKi8KKyNkZWZpbmUgU1JPTV8xMDBCVEYgICAgMHgwMjA1ICAgICAgLyogIDEwMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBTUk9NXzEwMEJUNCAgICAweDAwMDYgICAgICAvKiAgMTAwQkFTRS1UNCAqLworI2RlZmluZSBTUk9NXzEwMEJGWCAgICAweDAwMDcgICAgICAvKiAgMTAwQkFTRS1GWCBoYWxmIGR1cGxleCAoRmliZXIpICovCisjZGVmaW5lIFNST01fTTEwQlQgICAgIDB4MDAwOSAgICAgIC8qICBNSUkgMTBCQVNFLVQgaGFsZiBkdXBsZXggKi8KKyNkZWZpbmUgU1JPTV9NMTBCVEYgICAgMHgwMjBhICAgICAgLyogIE1JSSAxMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBTUk9NX00xMDBCVCAgICAweDAwMGQgICAgICAvKiAgTUlJIDEwMEJBU0UtVCBoYWxmIGR1cGxleCAqLworI2RlZmluZSBTUk9NX00xMDBCVEYgICAweDAyMGUgICAgICAvKiAgTUlJIDEwMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBTUk9NX00xMDBCVDQgICAweDAwMGYgICAgICAvKiAgTUlJIDEwMEJBU0UtVDQgKi8KKyNkZWZpbmUgU1JPTV9NMTAwQkYgICAgMHgwMDEwICAgICAgLyogIE1JSSAxMDBCQVNFLUZYIGhhbGYgZHVwbGV4ICovCisjZGVmaW5lIFNST01fTTEwMEJGRiAgIDB4MDIxMSAgICAgIC8qICBNSUkgMTAwQkFTRS1GWCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBTUk9NX1BEQSAgICAgICAweDA4MDAgICAgICAvKiAgUG93ZXJ1cCAmIER5bmFtaWMgQXV0b3NlbnNlICovCisjZGVmaW5lIFNST01fUEFPICAgICAgIDB4ODgwMCAgICAgIC8qICBQb3dlcnVwIEF1dG9zZW5zZSBPbmx5ICovCisjZGVmaW5lIFNST01fTlNNSSAgICAgIDB4ZmZmZiAgICAgIC8qICBObyBTZWxlY3RlZCBNZWRpYSBJbmZvcm1hdGlvbiAqLworCisvKgorKiogU1JPTSBNZWRpYSBEZWZpbml0aW9ucworKi8KKyNkZWZpbmUgU1JPTV8xMEJBU0VUICAgMHgwMDAwICAgICAgLyogIDEwQkFTRS1UIGhhbGYgZHVwbGV4ICovCisjZGVmaW5lIFNST01fMTBCQVNFMiAgIDB4MDAwMSAgICAgIC8qICAxMEJBU0UtMiAoQk5DKSAqLworI2RlZmluZSBTUk9NXzEwQkFTRTUgICAweDAwMDIgICAgICAvKiAgMTBCQVNFLTUgKEFVSSkgKi8KKyNkZWZpbmUgU1JPTV8xMDBCQVNFVCAgMHgwMDAzICAgICAgLyogIDEwMEJBU0UtVCBoYWxmIGR1cGxleCAqLworI2RlZmluZSBTUk9NXzEwQkFTRVRGICAweDAwMDQgICAgICAvKiAgMTBCQVNFLVQgZnVsbCBkdXBsZXggKi8KKyNkZWZpbmUgU1JPTV8xMDBCQVNFVEYgMHgwMDA1ICAgICAgLyogIDEwMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBTUk9NXzEwMEJBU0VUNCAweDAwMDYgICAgICAvKiAgMTAwQkFTRS1UNCAqLworI2RlZmluZSBTUk9NXzEwMEJBU0VGICAweDAwMDcgICAgICAvKiAgMTAwQkFTRS1GWCBoYWxmIGR1cGxleCAqLworI2RlZmluZSBTUk9NXzEwMEJBU0VGRiAweDAwMDggICAgICAvKiAgMTAwQkFTRS1GWCBmdWxsIGR1cGxleCAqLworCisjZGVmaW5lIEJMT0NLX0xFTiAgICAgIDB4N2YgICAgICAgIC8qIEV4dGVuZGVkIGJsb2NrcyBsZW5ndGggbWFzayAqLworI2RlZmluZSBFWFRfRklFTEQgICAgICAweDQwICAgICAgICAvKiBFeHRlbmRlZCBibG9ja3MgZXh0ZW5zaW9uIGZpZWxkIGJpdCAqLworI2RlZmluZSBNRURJQV9DT0RFICAgICAweDNmICAgICAgICAvKiBFeHRlbmRlZCBibG9ja3MgbWVkaWEgY29kZSBtYXNrICovCisKKy8qCisqKiBTUk9NIENvbXBhY3QgRm9ybWF0IEJsb2NrIE1hc2tzCisqLworI2RlZmluZSBDT01QQUNUX0ZJICAgICAgMHg4MCAgICAgICAvKiBGb3JtYXQgSW5kaWNhdG9yICovCisjZGVmaW5lIENPTVBBQ1RfTEVOICAgICAweDA0ICAgICAgIC8qIExlbmd0aCAqLworI2RlZmluZSBDT01QQUNUX01DICAgICAgMHgzZiAgICAgICAvKiBNZWRpYSBDb2RlICovCisKKy8qCisqKiBTUk9NIEV4dGVuZGVkIEZvcm1hdCBCbG9jayBUeXBlIDAgTWFza3MKKyovCisjZGVmaW5lIEJMT0NLMF9GSSAgICAgIDB4ODAgICAgICAgIC8qIEZvcm1hdCBJbmRpY2F0b3IgKi8KKyNkZWZpbmUgQkxPQ0swX01DUyAgICAgMHg4MCAgICAgICAgLyogTWVkaWEgQ29kZSBieXRlIFNpZ24gKi8KKyNkZWZpbmUgQkxPQ0swX01DICAgICAgMHgzZiAgICAgICAgLyogTWVkaWEgQ29kZSAqLworCisvKgorKiogREMyMTA0MCBGdWxsIER1cGxleCBSZWdpc3RlciAoREU0WDVfRkRSKQorKi8KKyNkZWZpbmUgRkRSX0ZEQUNWICAweDAwMDBmZmZmICAgICAgLyogRnVsbCBEdXBsZXggQXV0byBDb25maWd1cmF0aW9uIFZhbHVlICovCisKKy8qCisqKiBEQzIxMDQxIEdlbmVyYWwgUHVycG9zZSBUaW1lciBSZWdpc3RlciAoREU0WDVfR1BUKQorKi8KKyNkZWZpbmUgR1BUX0NPTiAgMHgwMDAxMDAwMCAgICAgICAgLyogT25lIHNob3Q6IDAsICBDb250aW51b3VzOiAxICovCisjZGVmaW5lIEdQVF9WQUwgIDB4MDAwMGZmZmYgICAgICAgIC8qIFRpbWVyIFZhbHVlICovCisKKy8qCisqKiBEQzIxMTQwIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlciAoREU0WDVfR0VQKSAoaGFyZHdhcmUgZGVwZW5kZW50IGJpdHMpCisqLworLyogVmFsaWQgT05MWSBmb3IgREU1MDAgaGFyZHdhcmUgKi8KKyNkZWZpbmUgR0VQX0xOUCAgMHgwMDAwMDA4MCAgICAgICAgLyogTGluayBQYXNzICAgICAgICAgICAgICAgKGlucHV0KSAgICAgICAgKi8KKyNkZWZpbmUgR0VQX1NMTksgMHgwMDAwMDA0MCAgICAgICAgLyogU1lNIExJTksgICAgICAgICAgICAgICAgKGlucHV0KSAgICAgICAgKi8KKyNkZWZpbmUgR0VQX1NERVQgMHgwMDAwMDAyMCAgICAgICAgLyogU2lnbmFsIERldGVjdCAgICAgICAgICAgKGlucHV0KSAgICAgICAgKi8KKyNkZWZpbmUgR0VQX0hSU1QgMHgwMDAwMDAxMCAgICAgICAgLyogSGFyZCBSRVNFVCAodG8gUEhZKSAgICAgKG91dHB1dCkgICAgICAgKi8KKyNkZWZpbmUgR0VQX0ZEWEQgMHgwMDAwMDAwOCAgICAgICAgLyogRnVsbCBEdXBsZXggRGlzYWJsZSAgICAgKG91dHB1dCkgICAgICAgKi8KKyNkZWZpbmUgR0VQX1BIWUwgMHgwMDAwMDAwNCAgICAgICAgLyogUEhZIExvb3BiYWNrICAgICAgICAgICAgKG91dHB1dCkgICAgICAgKi8KKyNkZWZpbmUgR0VQX0ZMRUQgMHgwMDAwMDAwMiAgICAgICAgLyogRm9yY2UgQWN0aXZpdHkgTEVEIG9uICAgKG91dHB1dCkgICAgICAgKi8KKyNkZWZpbmUgR0VQX01PREUgMHgwMDAwMDAwMSAgICAgICAgLyogMDogMTBNYi9zLCAgMTogMTAwTWIvcyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0VQX0lOSVQgMHgwMDAwMDExZiAgICAgICAgLyogU2V0dXAgaW5wdXRzICgwKSBhbmQgb3V0cHV0cyAoMSkgICAgICAgKi8KKyNkZWZpbmUgR0VQX0NUUkwgMHgwMDAwMDEwMCAgICAgICAgLyogR0VQIGNvbnRyb2wgYml0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoKKyoqIFNJQSBSZWdpc3RlciBEZWZhdWx0cworKi8KKyNkZWZpbmUgQ1NSMTMgMHgwMDAwMDAwMQorI2RlZmluZSBDU1IxNCAweDAwMDNmZjdmICAgICAgICAgICAvKiBBdXRvbmVnb3RpYXRpb24gZGlzYWJsZWQgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IxNSAweDAwMDAwMDA4CisKKy8qCisqKiBTSUEgU3RhdHVzIFJlZ2lzdGVyIChERTRYNV9TSVNSKQorKi8KKyNkZWZpbmUgU0lTUl9MUEMgICAweGZmZmYwMDAwICAgICAgLyogTGluayBQYXJ0bmVyJ3MgQ29kZSBXb3JkICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9MUE4gICAweDAwMDA4MDAwICAgICAgLyogTGluayBQYXJ0bmVyIE5lZ290aWFibGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9BTlMgICAweDAwMDA3MDAwICAgICAgLyogQXV0byBOZWdvdGlhdGlvbiBBcmJpdHJhdGlvbiBTdGF0ZSAgICAgKi8KKyNkZWZpbmUgU0lTUl9OU04gICAweDAwMDAwODAwICAgICAgLyogTm9uIFN0YWJsZSBOTFBzIERldGVjdGVkIChEQzIxMDQxKSAgICAgKi8KKyNkZWZpbmUgU0lTUl9UUkYgICAweDAwMDAwODAwICAgICAgLyogVHJhbnNtaXQgUmVtb3RlIEZhdWx0ICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9OU05EICAweDAwMDAwNDAwICAgICAgLyogTm9uIFN0YWJsZSBOTFBzIERldGVjdGVkIChEQzIxMTQyKSAgICAgKi8KKyNkZWZpbmUgU0lTUl9BTlJfRkRTIDB4MDAwMDA0MDAgICAgLyogQXV0byBOZWdvdGlhdGUgUmVzdGFydC9GdWxsIER1cGxleCBTZWwuKi8KKyNkZWZpbmUgU0lTUl9UUkEgICAweDAwMDAwMjAwICAgICAgLyogMTBCQVNFLVQgUmVjZWl2ZSBQb3J0IEFjdGl2aXR5ICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9OUkEgICAweDAwMDAwMjAwICAgICAgLyogTm9uIFNlbGVjdGVkIFBvcnQgUmVjZWl2ZSBBY3Rpdml0eSAgICAgKi8KKyNkZWZpbmUgU0lTUl9BUkEgICAweDAwMDAwMTAwICAgICAgLyogQVVJIFJlY2VpdmUgUG9ydCBBY3Rpdml0eSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9TUkEgICAweDAwMDAwMTAwICAgICAgLyogU2VsZWN0ZWQgUG9ydCBSZWNlaXZlIEFjdGl2aXR5ICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9EQU8gICAweDAwMDAwMDgwICAgICAgLyogUExMIEFsbCBPbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9EQVogICAweDAwMDAwMDQwICAgICAgLyogUExMIEFsbCBaZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9EU1AgICAweDAwMDAwMDIwICAgICAgLyogUExMIFNlbGYtVGVzdCBQYXNzICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9EU0QgICAweDAwMDAwMDEwICAgICAgLyogUExMIFNlbGYtVGVzdCBEb25lICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9BUFMgICAweDAwMDAwMDA4ICAgICAgLyogQXV0byBQb2xhcml0eSBTdGF0ZSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9MS0YgICAweDAwMDAwMDA0ICAgICAgLyogTGluayBGYWlsIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9MUzEwICAweDAwMDAwMDA0ICAgICAgLyogMTBNYi9zIExpbmsgRmFpbCBTdGF0dXMgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9OQ1IgICAweDAwMDAwMDAyICAgICAgLyogTmV0d29yayBDb25uZWN0aW9uIEVycm9yICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9MUzEwMCAweDAwMDAwMDAyICAgICAgLyogMTAwTWIvcyBMaW5rIEZhaWwgU3RhdHVzICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9QQVVJICAweDAwMDAwMDAxICAgICAgLyogQVVJX1RQIEluZGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9NUkEgICAweDAwMDAwMDAxICAgICAgLyogTUlJIFJlY2VpdmUgUG9ydCBBY3Rpdml0eSAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBBTlNfTkRJUyAgIDB4MDAwMDAwMDAgICAgICAvKiBOd2F5IGRpc2FibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBTlNfVERJUyAgIDB4MDAwMDEwMDAgICAgICAvKiBUcmFuc21pdCBEaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBTlNfQURFVCAgIDB4MDAwMDIwMDAgICAgICAvKiBBYmlsaXR5IERldGVjdCAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBTlNfQUNLICAgIDB4MDAwMDMwMDAgICAgICAvKiBBY2tub3dsZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBTlNfQ0FDSyAgIDB4MDAwMDQwMDAgICAgICAvKiBDb21wbGV0ZSBBY2tub3dsZWRnZSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBTlNfTldPSyAgIDB4MDAwMDUwMDAgICAgICAvKiBOd2F5IE9LIC0gRkxQIExpbmsgR29vZCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBTlNfTENISyAgIDB4MDAwMDYwMDAgICAgICAvKiBMaW5rIENoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFNJU1JfUlNUICAgMHgwMDAwMDMwMSAgICAgIC8qIENTUjEyIHJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNJU1JfQU5SICAgMHgwMDAwMTMwMSAgICAgIC8qIEF1dG9uZWdvdGlhdGlvbiByZXN0YXJ0ICAgICAgICAgICAgICAgICovCisKKy8qCisqKiBTSUEgQ29ubmVjdGl2aXR5IFJlZ2lzdGVyIChERTRYNV9TSUNSKQorKi8KKyNkZWZpbmUgU0lDUl9TRE0gICAweGZmZmYwMDAwICAgICAgIC8qIFNJQSBEaWFnbm9zdGljcyBNb2RlICovCisjZGVmaW5lIFNJQ1JfT0U1NyAgMHgwMDAwODAwMCAgICAgICAvKiBPdXRwdXQgRW5hYmxlIDUgNiA3ICovCisjZGVmaW5lIFNJQ1JfT0UyNCAgMHgwMDAwNDAwMCAgICAgICAvKiBPdXRwdXQgRW5hYmxlIDIgNCAqLworI2RlZmluZSBTSUNSX09FMTMgIDB4MDAwMDIwMDAgICAgICAgLyogT3V0cHV0IEVuYWJsZSAxIDMgKi8KKyNkZWZpbmUgU0lDUl9JRSAgICAweDAwMDAxMDAwICAgICAgIC8qIElucHV0IEVuYWJsZSAqLworI2RlZmluZSBTSUNSX0VYVCAgIDB4MDAwMDAwMDAgICAgICAgLyogU0lBIE1VWCBTZWxlY3QgRXh0ZXJuYWwgU0lBIE1vZGUgKi8KKyNkZWZpbmUgU0lDUl9EX1NJQSAweDAwMDAwNDAwICAgICAgIC8qIFNJQSBNVVggU2VsZWN0IERpYWdub3N0aWNzIC0gU0lBIFNpZ3MgKi8KKyNkZWZpbmUgU0lDUl9EUExMICAweDAwMDAwODAwICAgICAgIC8qIFNJQSBNVVggU2VsZWN0IERpYWdub3N0aWNzIC0gRFBMTCBTaWdzKi8KKyNkZWZpbmUgU0lDUl9BUExMICAweDAwMDAwYTAwICAgICAgIC8qIFNJQSBNVVggU2VsZWN0IERpYWdub3N0aWNzIC0gRFBMTCBTaWdzKi8KKyNkZWZpbmUgU0lDUl9EX1J4TSAweDAwMDAwYzAwICAgICAgIC8qIFNJQSBNVVggU2VsZWN0IERpYWdub3N0aWNzIC0gUnhNIFNpZ3MgKi8KKyNkZWZpbmUgU0lDUl9NX1J4TSAweDAwMDAwZDAwICAgICAgIC8qIFNJQSBNVVggU2VsZWN0IERpYWdub3N0aWNzIC0gUnhNIFNpZ3MgKi8KKyNkZWZpbmUgU0lDUl9MTktUICAweDAwMDAwZTAwICAgICAgIC8qIFNJQSBNVVggU2VsZWN0IERpYWdub3N0aWNzIC0gTGluayBUZXN0Ki8KKyNkZWZpbmUgU0lDUl9TRUwgICAweDAwMDAwZjAwICAgICAgIC8qIFNJQSBNVVggU2VsZWN0IEFVSSBvciBUUCB3aXRoIExFRHMgKi8KKyNkZWZpbmUgU0lDUl9BU0UgICAweDAwMDAwMDgwICAgICAgIC8qIEFQTEwgU3RhcnQgRW5hYmxlKi8KKyNkZWZpbmUgU0lDUl9TSU0gICAweDAwMDAwMDQwICAgICAgIC8qIFNlcmlhbCBJbnRlcmZhY2UgSW5wdXQgTXVsdGlwbGV4ZXIgKi8KKyNkZWZpbmUgU0lDUl9FTkkgICAweDAwMDAwMDIwICAgICAgIC8qIEVuY29kZXIgSW5wdXQgTXVsdGlwbGV4ZXIgKi8KKyNkZWZpbmUgU0lDUl9FRFAgICAweDAwMDAwMDEwICAgICAgIC8qIFNJQSBQTEwgRXh0ZXJuYWwgSW5wdXQgRW5hYmxlICovCisjZGVmaW5lIFNJQ1JfQVVJICAgMHgwMDAwMDAwOCAgICAgICAvKiAxMEJhc2UtVCAoMCkgb3IgQVVJICgxKSAqLworI2RlZmluZSBTSUNSX0NBQyAgIDB4MDAwMDAwMDQgICAgICAgLyogQ1NSIEF1dG8gQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBTSUNSX1BTICAgIDB4MDAwMDAwMDIgICAgICAgLyogUGluIEFVSS9UUCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgU0lDUl9TUkwgICAweDAwMDAwMDAxICAgICAgIC8qIFNJQSBSZXNldCAqLworI2RlZmluZSBTSUFfUkVTRVQgIDB4MDAwMDAwMDAgICAgICAgLyogU0lBIFJlc2V0IFZhbHVlICovCisKKy8qCisqKiBTSUEgVHJhbnNtaXQgYW5kIFJlY2VpdmUgUmVnaXN0ZXIgKERFNFg1X1NUUlIpCisqLworI2RlZmluZSBTVFJSX1RBUyAgIDB4MDAwMDgwMDAgICAgICAgLyogMTBCYXNlLVQvQVVJIEF1dG9zZW5zaW5nIEVuYWJsZSAqLworI2RlZmluZSBTVFJSX1NQUCAgIDB4MDAwMDQwMDAgICAgICAgLyogU2V0IFBvbGFyaXR5IFBsdXMgKi8KKyNkZWZpbmUgU1RSUl9BUEUgICAweDAwMDAyMDAwICAgICAgIC8qIEF1dG8gUG9sYXJpdHkgRW5hYmxlICovCisjZGVmaW5lIFNUUlJfTFRFICAgMHgwMDAwMTAwMCAgICAgICAvKiBMaW5rIFRlc3QgRW5hYmxlICovCisjZGVmaW5lIFNUUlJfU1FFICAgMHgwMDAwMDgwMCAgICAgICAvKiBTaWduYWwgUXVhbGl0eSBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9DTEQgICAweDAwMDAwNDAwICAgICAgIC8qIENvbGxpc2lvbiBEZXRlY3QgRW5hYmxlICovCisjZGVmaW5lIFNUUlJfQ1NRICAgMHgwMDAwMDIwMCAgICAgICAvKiBDb2xsaXNpb24gU3F1ZWxjaCBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9SU1EgICAweDAwMDAwMTAwICAgICAgIC8qIFJlY2VpdmUgU3F1ZWxjaCBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9BTkUgICAweDAwMDAwMDgwICAgICAgIC8qIEF1dG8gTmVnb3RpYXRlIEVuYWJsZSAqLworI2RlZmluZSBTVFJSX0hERSAgIDB4MDAwMDAwNDAgICAgICAgLyogSGFsZiBEdXBsZXggRW5hYmxlICovCisjZGVmaW5lIFNUUlJfQ1BFTiAgMHgwMDAwMDAzMCAgICAgICAvKiBDb21wZW5zYXRpb24gRW5hYmxlICovCisjZGVmaW5lIFNUUlJfTFNFICAgMHgwMDAwMDAwOCAgICAgICAvKiBMaW5rIFB1bHNlIFNlbmQgRW5hYmxlICovCisjZGVmaW5lIFNUUlJfRFJFTiAgMHgwMDAwMDAwNCAgICAgICAvKiBEcml2ZXIgRW5hYmxlICovCisjZGVmaW5lIFNUUlJfTEJLICAgMHgwMDAwMDAwMiAgICAgICAvKiBMb29wYmFjayBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9FQ0VOICAweDAwMDAwMDAxICAgICAgIC8qIEVuY29kZXIgRW5hYmxlICovCisjZGVmaW5lIFNUUlJfUkVTRVQgMHhmZmZmZmZmZiAgICAgICAvKiBSZXNldCB2YWx1ZSBmb3IgU1RSUiAqLworCisvKgorKiogU0lBIEdlbmVyYWwgUmVnaXN0ZXIgKERFNFg1X1NJR1IpCisqLworI2RlZmluZSBTSUdSX1JNSSAgIDB4NDAwMDAwMDAgICAgICAgLyogUmVjZWl2ZSBNYXRjaCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0lHUl9HSTEgICAweDIwMDAwMDAwICAgICAgIC8qIEdlbmVyYWwgUG9ydCBJbnRlcnJ1cHQgMSAqLworI2RlZmluZSBTSUdSX0dJMCAgIDB4MTAwMDAwMDAgICAgICAgLyogR2VuZXJhbCBQb3J0IEludGVycnVwdCAwICovCisjZGVmaW5lIFNJR1JfQ1dFICAgMHgwODAwMDAwMCAgICAgICAvKiBDb250cm9sIFdyaXRlIEVuYWJsZSAqLworI2RlZmluZSBTSUdSX1JNRSAgIDB4MDQwMDAwMDAgICAgICAgLyogUmVjZWl2ZSBNYXRjaCBFbmFibGUgKi8KKyNkZWZpbmUgU0lHUl9HRUkxICAweDAyMDAwMDAwICAgICAgIC8qIEdFUCBJbnRlcnJ1cHQgRW5hYmxlIG9uIFBvcnQgMSAqLworI2RlZmluZSBTSUdSX0dFSTAgIDB4MDEwMDAwMDAgICAgICAgLyogR0VQIEludGVycnVwdCBFbmFibGUgb24gUG9ydCAwICovCisjZGVmaW5lIFNJR1JfTEdTMyAgMHgwMDgwMDAwMCAgICAgICAvKiBMRUQvR0VQMyBTZWxlY3QgKi8KKyNkZWZpbmUgU0lHUl9MR1MyICAweDAwNDAwMDAwICAgICAgIC8qIExFRC9HRVAyIFNlbGVjdCAqLworI2RlZmluZSBTSUdSX0xHUzEgIDB4MDAyMDAwMDAgICAgICAgLyogTEVEL0dFUDEgU2VsZWN0ICovCisjZGVmaW5lIFNJR1JfTEdTMCAgMHgwMDEwMDAwMCAgICAgICAvKiBMRUQvR0VQMCBTZWxlY3QgKi8KKyNkZWZpbmUgU0lHUl9NRCAgICAweDAwMGYwMDAwICAgICAgIC8qIEdlbmVyYWwgUHVycG9zZSBNb2RlIGFuZCBEYXRhICovCisjZGVmaW5lIFNJR1JfTFYyICAgMHgwMDAwODAwMCAgICAgICAvKiBHZW5lcmFsIFB1cnBvc2UgTEVEMiB2YWx1ZSAqLworI2RlZmluZSBTSUdSX0xFMiAgIDB4MDAwMDQwMDAgICAgICAgLyogR2VuZXJhbCBQdXJwb3NlIExFRDIgZW5hYmxlICovCisjZGVmaW5lIFNJR1JfRlJMICAgMHgwMDAwMjAwMCAgICAgICAvKiBGb3JjZSBSZWNlaXZlciBMb3cgKi8KKyNkZWZpbmUgU0lHUl9EUFNUICAweDAwMDAxMDAwICAgICAgIC8qIFBMTCBTZWxmIFRlc3QgU3RhcnQgKi8KKyNkZWZpbmUgU0lHUl9MU0QgICAweDAwMDAwODAwICAgICAgIC8qIExFRCBTdHJldGNoIERpc2FibGUgKi8KKyNkZWZpbmUgU0lHUl9GTEYgICAweDAwMDAwNDAwICAgICAgIC8qIEZvcmNlIExpbmsgRmFpbCAqLworI2RlZmluZSBTSUdSX0ZVU1EgIDB4MDAwMDAyMDAgICAgICAgLyogRm9yY2UgVW5zcXVlbGNoICovCisjZGVmaW5lIFNJR1JfVFNDSyAgMHgwMDAwMDEwMCAgICAgICAvKiBUZXN0IENsb2NrICovCisjZGVmaW5lIFNJR1JfTFYxICAgMHgwMDAwMDA4MCAgICAgICAvKiBHZW5lcmFsIFB1cnBvc2UgTEVEMSB2YWx1ZSAqLworI2RlZmluZSBTSUdSX0xFMSAgIDB4MDAwMDAwNDAgICAgICAgLyogR2VuZXJhbCBQdXJwb3NlIExFRDEgZW5hYmxlICovCisjZGVmaW5lIFNJR1JfUldSICAgMHgwMDAwMDAyMCAgICAgICAvKiBSZWNlaXZlIFdhdGNoZG9nIFJlbGVhc2UgKi8KKyNkZWZpbmUgU0lHUl9SV0QgICAweDAwMDAwMDEwICAgICAgIC8qIFJlY2VpdmUgV2F0Y2hkb2cgRGlzYWJsZSAqLworI2RlZmluZSBTSUdSX0FCTSAgIDB4MDAwMDAwMDggICAgICAgLyogQk5DOiAwLCAgQVVJOjEgKi8KKyNkZWZpbmUgU0lHUl9KQ0sgICAweDAwMDAwMDA0ICAgICAgIC8qIEphYmJlciBDbG9jayAqLworI2RlZmluZSBTSUdSX0hVSiAgIDB4MDAwMDAwMDIgICAgICAgLyogSG9zdCBVbmphYiAqLworI2RlZmluZSBTSUdSX0pCRCAgIDB4MDAwMDAwMDEgICAgICAgLyogSmFiYmVyIERpc2FibGUgKi8KKyNkZWZpbmUgU0lHUl9SRVNFVCAweGZmZmYwMDAwICAgICAgIC8qIFJlc2V0IHZhbHVlIGZvciBTSUdSICovCisKKy8qCisqKiBSZWNlaXZlIERlc2NyaXB0b3IgQml0IFN1bW1hcnkKKyovCisjZGVmaW5lIFJfT1dOICAgICAgMHg4MDAwMDAwMCAgICAgICAvKiBPd24gQml0ICovCisjZGVmaW5lIFJEX0ZGICAgICAgMHg0MDAwMDAwMCAgICAgICAvKiBGaWx0ZXJpbmcgRmFpbCAqLworI2RlZmluZSBSRF9GTCAgICAgIDB4M2ZmZjAwMDAgICAgICAgLyogRnJhbWUgTGVuZ3RoICovCisjZGVmaW5lIFJEX0VTICAgICAgMHgwMDAwODAwMCAgICAgICAvKiBFcnJvciBTdW1tYXJ5ICovCisjZGVmaW5lIFJEX0xFICAgICAgMHgwMDAwNDAwMCAgICAgICAvKiBMZW5ndGggRXJyb3IgKi8KKyNkZWZpbmUgUkRfRFQgICAgICAweDAwMDAzMDAwICAgICAgIC8qIERhdGEgVHlwZSAqLworI2RlZmluZSBSRF9SRiAgICAgIDB4MDAwMDA4MDAgICAgICAgLyogUnVudCBGcmFtZSAqLworI2RlZmluZSBSRF9NRiAgICAgIDB4MDAwMDA0MDAgICAgICAgLyogTXVsdGljYXN0IEZyYW1lICovCisjZGVmaW5lIFJEX0ZTICAgICAgMHgwMDAwMDIwMCAgICAgICAvKiBGaXJzdCBEZXNjcmlwdG9yICovCisjZGVmaW5lIFJEX0xTICAgICAgMHgwMDAwMDEwMCAgICAgICAvKiBMYXN0IERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgUkRfVEwgICAgICAweDAwMDAwMDgwICAgICAgIC8qIEZyYW1lIFRvbyBMb25nICovCisjZGVmaW5lIFJEX0NTICAgICAgMHgwMDAwMDA0MCAgICAgICAvKiBDb2xsaXNpb24gU2VlbiAqLworI2RlZmluZSBSRF9GVCAgICAgIDB4MDAwMDAwMjAgICAgICAgLyogRnJhbWUgVHlwZSAqLworI2RlZmluZSBSRF9SSiAgICAgIDB4MDAwMDAwMTAgICAgICAgLyogUmVjZWl2ZSBXYXRjaGRvZyAqLworI2RlZmluZSBSRF9SRSAgICAgIDB4MDAwMDAwMDggICAgICAgLyogUmVwb3J0IG9uIE1JSSBFcnJvciAqLworI2RlZmluZSBSRF9EQiAgICAgIDB4MDAwMDAwMDQgICAgICAgLyogRHJpYmJsaW5nIEJpdCAqLworI2RlZmluZSBSRF9DRSAgICAgIDB4MDAwMDAwMDIgICAgICAgLyogQ1JDIEVycm9yICovCisjZGVmaW5lIFJEX09GICAgICAgMHgwMDAwMDAwMSAgICAgICAvKiBPdmVyZmxvdyAqLworCisjZGVmaW5lIFJEX1JFUiAgICAgMHgwMjAwMDAwMCAgICAgICAvKiBSZWNlaXZlIEVuZCBPZiBSaW5nICovCisjZGVmaW5lIFJEX1JDSCAgICAgMHgwMTAwMDAwMCAgICAgICAvKiBTZWNvbmQgQWRkcmVzcyBDaGFpbmVkICovCisjZGVmaW5lIFJEX1JCUzIgICAgMHgwMDNmZjgwMCAgICAgICAvKiBCdWZmZXIgMiBTaXplICovCisjZGVmaW5lIFJEX1JCUzEgICAgMHgwMDAwMDdmZiAgICAgICAvKiBCdWZmZXIgMSBTaXplICovCisKKy8qCisqKiBUcmFuc21pdCBEZXNjcmlwdG9yIEJpdCBTdW1tYXJ5CisqLworI2RlZmluZSBUX09XTiAgICAgIDB4ODAwMDAwMDAgICAgICAgLyogT3duIEJpdCAqLworI2RlZmluZSBURF9FUyAgICAgIDB4MDAwMDgwMDAgICAgICAgLyogRXJyb3IgU3VtbWFyeSAqLworI2RlZmluZSBURF9UTyAgICAgIDB4MDAwMDQwMDAgICAgICAgLyogVHJhbnNtaXQgSmFiYmVyIFRpbWUtT3V0ICovCisjZGVmaW5lIFREX0xPICAgICAgMHgwMDAwMDgwMCAgICAgICAvKiBMb3NzIE9mIENhcnJpZXIgKi8KKyNkZWZpbmUgVERfTkMgICAgICAweDAwMDAwNDAwICAgICAgIC8qIE5vIENhcnJpZXIgKi8KKyNkZWZpbmUgVERfTEMgICAgICAweDAwMDAwMjAwICAgICAgIC8qIExhdGUgQ29sbGlzaW9uICovCisjZGVmaW5lIFREX0VDICAgICAgMHgwMDAwMDEwMCAgICAgICAvKiBFeGNlc3NpdmUgQ29sbGlzaW9ucyAqLworI2RlZmluZSBURF9IRiAgICAgIDB4MDAwMDAwODAgICAgICAgLyogSGVhcnRiZWF0IEZhaWwgKi8KKyNkZWZpbmUgVERfQ0MgICAgICAweDAwMDAwMDc4ICAgICAgIC8qIENvbGxpc2lvbiBDb3VudGVyICovCisjZGVmaW5lIFREX0xGICAgICAgMHgwMDAwMDAwNCAgICAgICAvKiBMaW5rIEZhaWwgKi8KKyNkZWZpbmUgVERfVUYgICAgICAweDAwMDAwMDAyICAgICAgIC8qIFVuZGVyZmxvdyBFcnJvciAqLworI2RlZmluZSBURF9ERSAgICAgIDB4MDAwMDAwMDEgICAgICAgLyogRGVmZXJyZWQgKi8KKworI2RlZmluZSBURF9JQyAgICAgIDB4ODAwMDAwMDAgICAgICAgLyogSW50ZXJydXB0IE9uIENvbXBsZXRpb24gKi8KKyNkZWZpbmUgVERfTFMgICAgICAweDQwMDAwMDAwICAgICAgIC8qIExhc3QgU2VnbWVudCAqLworI2RlZmluZSBURF9GUyAgICAgIDB4MjAwMDAwMDAgICAgICAgLyogRmlyc3QgU2VnbWVudCAqLworI2RlZmluZSBURF9GVDEgICAgIDB4MTAwMDAwMDAgICAgICAgLyogRmlsdGVyaW5nIFR5cGUgKi8KKyNkZWZpbmUgVERfU0VUICAgICAweDA4MDAwMDAwICAgICAgIC8qIFNldHVwIFBhY2tldCAqLworI2RlZmluZSBURF9BQyAgICAgIDB4MDQwMDAwMDAgICAgICAgLyogQWRkIENSQyBEaXNhYmxlICovCisjZGVmaW5lIFREX1RFUiAgICAgMHgwMjAwMDAwMCAgICAgICAvKiBUcmFuc21pdCBFbmQgT2YgUmluZyAqLworI2RlZmluZSBURF9UQ0ggICAgIDB4MDEwMDAwMDAgICAgICAgLyogU2Vjb25kIEFkZHJlc3MgQ2hhaW5lZCAqLworI2RlZmluZSBURF9EUEQgICAgIDB4MDA4MDAwMDAgICAgICAgLyogRGlzYWJsZWQgUGFkZGluZyAqLworI2RlZmluZSBURF9GVDAgICAgIDB4MDA0MDAwMDAgICAgICAgLyogRmlsdGVyaW5nIFR5cGUgKi8KKyNkZWZpbmUgVERfVEJTMiAgICAweDAwM2ZmODAwICAgICAgIC8qIEJ1ZmZlciAyIFNpemUgKi8KKyNkZWZpbmUgVERfVEJTMSAgICAweDAwMDAwN2ZmICAgICAgIC8qIEJ1ZmZlciAxIFNpemUgKi8KKworI2RlZmluZSBQRVJGRUNUX0YgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSEFTSF9GICAgICBURF9GVDAKKyNkZWZpbmUgSU5WRVJTRV9GICBURF9GVDEKKyNkZWZpbmUgSEFTSF9PX0YgICAoVERfRlQxIHwgVERfRjApCisKKy8qCisqKiBNZWRpYSAvIG1vZGUgc3RhdGUgbWFjaGluZSBkZWZpbml0aW9ucworKiogVXNlciBzZWxlY3RhYmxlOgorKi8KKyNkZWZpbmUgVFAgICAgICAgICAgICAgIDB4MDA0MCAgICAgLyogMTBCYXNlLVQgKG5vdyBlcXVpdiB0byBfMTBNYikgICAgICAgICovCisjZGVmaW5lIFRQX05XICAgICAgICAgICAweDAwMDIgICAgIC8qIDEwQmFzZS1UIHdpdGggTndheSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTkMgICAgICAgICAgICAgMHgwMDA0ICAgICAvKiBUaGlud2lyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQVVJICAgICAgICAgICAgIDB4MDAwOCAgICAgLyogVGhpY2t3aXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJOQ19BVUkgICAgICAgICAweDAwMTAgICAgIC8qIEJOQy9BVUkgb24gREMyMTA0MCBpbmRpc3Rpbmd1aXNoYWJsZSAqLworI2RlZmluZSBfMTBNYiAgICAgICAgICAgMHgwMDQwICAgICAvKiAxME1iL3MgRXRoZXJuZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgXzEwME1iICAgICAgICAgIDB4MDA4MCAgICAgLyogMTAwTWIvcyBFdGhlcm5ldCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFVVE8gICAgICAgICAgICAweDQwMDAgICAgIC8qIEF1dG8gc2Vuc2UgdGhlIG1lZGlhIG9yIHNwZWVkICAgICAgICAqLworCisvKgorKiogSW50ZXJuYWwgc3RhdGVzCisqLworI2RlZmluZSBOQyAgICAgICAgICAgICAgMHgwMDAwICAgICAvKiBObyBDb25uZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQU5TICAgICAgICAgICAgIDB4MDAyMCAgICAgLyogSW50ZXJtZWRpYXRlIEF1dG9OZWdvdGlhdGlvbiBTdGF0ZSAgICovCisjZGVmaW5lIFNQRF9ERVQgICAgICAgICAweDAxMDAgICAgIC8qIFBhcmFsbGVsIHNwZWVkIGRldGVjdGlvbiAgICAgICAgICAgICAqLworI2RlZmluZSBJTklUICAgICAgICAgICAgMHgwMjAwICAgICAvKiBJbml0aWFsIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVhUX1NJQSAgICAgICAgIDB4MDQwMCAgICAgLyogRXh0ZXJuYWwgU0lBIGZvciBtb3RoZXJib2FyZCBjaGlwICAgICovCisjZGVmaW5lIEFOU19TVVNQRUNUICAgICAweDA4MDIgICAgIC8qIFN1c3BlY3QgdGhlIEFOUyAoVFApIHBvcnQgaXMgZG93biAgICAqLworI2RlZmluZSBUUF9TVVNQRUNUICAgICAgMHgwODAzICAgICAvKiBTdXNwZWN0IHRoZSBUUCBwb3J0IGlzIGRvd24gICAgICAgICAgKi8KKyNkZWZpbmUgQk5DX0FVSV9TVVNQRUNUIDB4MDgwNCAgICAgLyogU3VzcGVjdCB0aGUgQk5DIG9yIEFVSSBwb3J0IGlzIGRvd24gICovCisjZGVmaW5lIEVYVF9TSUFfU1VTUEVDVCAweDA4MDUgICAgIC8qIFN1c3BlY3QgdGhlIEVYVCBTSUEgcG9ydCBpcyBkb3duICAgICAqLworI2RlZmluZSBCTkNfU1VTUEVDVCAgICAgMHgwODA2ICAgICAvKiBTdXNwZWN0IHRoZSBCTkMgcG9ydCBpcyBkb3duICAgICAgICAgKi8KKyNkZWZpbmUgQVVJX1NVU1BFQ1QgICAgIDB4MDgwNyAgICAgLyogU3VzcGVjdCB0aGUgQVVJIHBvcnQgaXMgZG93biAgICAgICAgICovCisjZGVmaW5lIE1JSSAgICAgICAgICAgICAweDEwMDAgICAgIC8qIE1JSSBvbiB0aGUgMjExNDMgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFRJTUVSX0NCICAgICAgICAweDgwMDAwMDAwIC8qIFRpbWVyIGNhbGxiYWNrIGRldGVjdGlvbiAgICAgICAgICAgICAqLworCisvKgorKiogREU0WDUgREVCVUcgT3B0aW9ucworKi8KKyNkZWZpbmUgREVCVUdfTk9ORSAgICAgIDB4MDAwMCAgICAgLyogTm8gREVCVUcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCVUdfVkVSU0lPTiAgIDB4MDAwMSAgICAgLyogUHJpbnQgdmVyc2lvbiBtZXNzYWdlICovCisjZGVmaW5lIERFQlVHX01FRElBICAgICAweDAwMDIgICAgIC8qIFByaW50IG1lZGlhIG1lc3NhZ2VzICovCisjZGVmaW5lIERFQlVHX1RYICAgICAgICAweDAwMDQgICAgIC8qIFByaW50IFRYIChxdWV1ZV9wa3QpIG1lc3NhZ2VzICovCisjZGVmaW5lIERFQlVHX1JYICAgICAgICAweDAwMDggICAgIC8qIFByaW50IFJYIChkZTR4NV9yeCkgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCVUdfU1JPTSAgICAgIDB4MDAxMCAgICAgLyogUHJpbnQgU1JPTSBtZXNzYWdlcyAqLworI2RlZmluZSBERUJVR19NSUkgICAgICAgMHgwMDIwICAgICAvKiBQcmludCBNSUkgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCVUdfT1BFTiAgICAgIDB4MDA0MCAgICAgLyogUHJpbnQgZGU0eDVfb3BlbigpIG1lc3NhZ2VzICovCisjZGVmaW5lIERFQlVHX0NMT1NFICAgICAweDAwODAgICAgIC8qIFByaW50IGRlNHg1X2Nsb3NlKCkgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCVUdfUENJQ0ZHICAgIDB4MDEwMAorI2RlZmluZSBERUJVR19BTEwgICAgICAgMHgwMWZmCisKKy8qCisqKiBNaXNjZWxsYW5lb3VzCisqLworI2RlZmluZSBQQ0kgIDAKKyNkZWZpbmUgRUlTQSAxCisKKyNkZWZpbmUgSEFTSF9UQUJMRV9MRU4gICA1MTIgICAgICAgLyogQml0cyAqLworI2RlZmluZSBIQVNIX0JJVFMgICAgICAgIDB4MDFmZiAgICAvKiA5IExTIGJpdHMgKi8KKworI2RlZmluZSBTRVRVUF9GUkFNRV9MRU4gIDE5MiAgICAgICAvKiBCeXRlcyAqLworI2RlZmluZSBJTVBFUkZfUEFfT0ZGU0VUIDE1NiAgICAgICAvKiBCeXRlcyAqLworCisjZGVmaW5lIFBPTExfREVNQU5EICAgICAgICAgIDEKKworI2RlZmluZSBMT1NUX01FRElBX1RIUkVTSE9MRCAzCisKKyNkZWZpbmUgTUFTS19JTlRFUlJVUFRTICAgICAgMQorI2RlZmluZSBVTk1BU0tfSU5URVJSVVBUUyAgICAwCisKKyNkZWZpbmUgREU0WDVfU1RSTEVOICAgICAgICAgOAorCisjZGVmaW5lIERFNFg1X0lOSVQgICAgICAgICAgIDAgICAgIC8qIEluaXRpYWxpc2F0aW9uIHRpbWUgKi8KKyNkZWZpbmUgREU0WDVfUlVOICAgICAgICAgICAgMSAgICAgLyogUnVuIHRpbWUgKi8KKworI2RlZmluZSBERTRYNV9TQVZFX1NUQVRFICAgICAwCisjZGVmaW5lIERFNFg1X1JFU1RPUkVfU1RBVEUgIDEKKworLyoKKyoqIEFkZHJlc3MgRmlsdGVyaW5nIE1vZGVzCisqLworI2RlZmluZSBQRVJGRUNUICAgICAgICAgICAgICAwICAgICAvKiAxNiBwZXJmZWN0IHBoeXNpY2FsIGFkZHJlc3NlcyAqLworI2RlZmluZSBIQVNIX1BFUkYgICAgICAgICAgICAxICAgICAvKiAxIHBlcmZlY3QsIDUxMiBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisjZGVmaW5lIFBFUkZFQ1RfUkVKICAgICAgICAgIDIgICAgIC8qIFJlamVjdCAxNiBwZXJmZWN0IHBoeXNpY2FsIGFkZHJlc3NlcyAqLworI2RlZmluZSBBTExfSEFTSCAgICAgICAgICAgICAzICAgICAvKiBIYXNoZXMgYWxsIHBoeXNpY2FsICYgbXVsdGljYXN0IGFkZHJzICovCisKKyNkZWZpbmUgQUxMICAgICAgICAgICAgICAgICAgMCAgICAgLyogQ2xlYXIgb3V0IGFsbCB0aGUgc2V0dXAgZnJhbWUgKi8KKyNkZWZpbmUgUEhZU19BRERSX09OTFkgICAgICAgMSAgICAgLyogVXBkYXRlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9ubHkgKi8KKworLyoKKyoqIEJvb2xlYW5zCisqLworI2RlZmluZSBOTyAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEZBTFNFICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBZRVMgICAgICAgICAgICAgICAgICB+MAorI2RlZmluZSBUUlVFICAgICAgICAgICAgICAgICB+MAorCisvKgorKiogQWRhcHRlciBzdGF0ZQorKi8KKyNkZWZpbmUgSU5JVElBTElTRUQgICAgICAgICAgMCAgICAgLyogQWZ0ZXIgaC93IGluaXRpYWxpc2VkIGFuZCBtZW0gYWxsb2MnZCAqLworI2RlZmluZSBDTE9TRUQgICAgICAgICAgICAgICAxICAgICAvKiBSZWFkeSBmb3Igb3BlbmluZyAqLworI2RlZmluZSBPUEVOICAgICAgICAgICAgICAgICAyICAgICAvKiBSdW5uaW5nICovCisKKy8qCisqKiBWYXJpb3VzIHdhaXQgdGltZXMKKyovCisjZGVmaW5lIFBERVRfTElOS19XQUlUICAgIDEyMDAgICAgLyogbXNlY3MgdG8gd2FpdCBmb3IgbGluayBkZXRlY3QgYml0cyAgICAgKi8KKyNkZWZpbmUgQU5TX0ZJTklTSF9XQUlUICAgMTAwMCAgICAvKiBtc2VjcyB0byB3YWl0IGZvciBsaW5rIGRldGVjdCBiaXRzICAgICAqLworCisvKgorKiogSUVFRSBPVUlzIGZvciB2YXJpb3VzIFBIWSB2ZW5kb3IvY2hpcCBjb21ib3MgLSBSZWcgMiB2YWx1ZXMgb25seS4gU2luY2UKKyoqIHRoZSB2ZW5kb3JzIHNlZW0gc3BsaXQgNTAtNTAgb24gaG93IHRvIGNhbGN1bGF0ZSB0aGUgT1VJIHJlZ2lzdGVyIHZhbHVlcworKiogYW55d2F5LCBqdXN0IHJlYWRpbmcgUmVnMiBzZWVtcyByZWFzb25hYmxlIGZvciBub3cgW3NlZSBkZTR4NV9nZXRfb3VpKCldLgorKi8KKyNkZWZpbmUgTkFUSU9OQUxfVFggMHgyMDAwCisjZGVmaW5lIEJST0FEQ09NX1Q0IDB4MDNlMAorI2RlZmluZSBTRUVRX1Q0ICAgICAweDAwMTYKKyNkZWZpbmUgQ1lQUkVTU19UNCAgMHgwMDE0CisKKy8qCisqKiBTcGVlZCBTZWxlY3Rpb24gc3R1ZmYKKyovCisjZGVmaW5lIFNFVF8xME1iIHtcCisgIGlmICgobHAtPnBoeVtscC0+YWN0aXZlXS5pZCkgJiYgKCFscC0+dXNlU1JPTSB8fCBscC0+dXNlTUlJKSkge1wKKyAgICBvbXIgPSBpbmwoREU0WDVfT01SKSAmIH4oT01SX1RUTSB8IE9NUl9QQ1MgfCBPTVJfU0NSIHwgT01SX0ZEWCk7XAorICAgIGlmICgobHAtPnRtcCAhPSBNSUlfU1JfQVNTQykgfHwgKGxwLT5hdXRvc2Vuc2UgIT0gQVVUTykpIHtcCisgICAgICBtaWlfd3IoTUlJX0NSXzEwfChscC0+ZmR4P01JSV9DUl9GRE06MCksIE1JSV9DUiwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpO1wKKyAgICB9XAorICAgIG9tciB8PSAoKGxwLT5mZHggPyBPTVJfRkRYIDogMCkgfCBPTVJfVFRNKTtcCisgICAgb3V0bChvbXIsIERFNFg1X09NUik7XAorICAgIGlmICghbHAtPnVzZVNST00pIGxwLT5jYWNoZS5nZXAgPSAwO1wKKyAgfSBlbHNlIGlmIChscC0+dXNlU1JPTSAmJiAhbHAtPnVzZU1JSSkge1wKKyAgICBvbXIgPSAoaW5sKERFNFg1X09NUikgJiB+KE9NUl9QUyB8IE9NUl9IQkQgfCBPTVJfVFRNIHwgT01SX1BDUyB8IE9NUl9TQ1IgfCBPTVJfRkRYKSk7XAorICAgIG9tciB8PSAobHAtPmZkeCA/IE9NUl9GRFggOiAwKTtcCisgICAgb3V0bChvbXIgfCAobHAtPmluZm9ibG9ja19jc3I2ICYgfihPTVJfU0NSIHwgT01SX0hCRCkpLCBERTRYNV9PTVIpO1wKKyAgfSBlbHNlIHtcCisgICAgb21yID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfUFMgfCBPTVJfSEJEIHwgT01SX1RUTSB8IE9NUl9QQ1MgfCBPTVJfU0NSIHwgT01SX0ZEWCkpO1wKKyAgICBvbXIgfD0gKGxwLT5mZHggPyBPTVJfRkRYIDogMCk7XAorICAgIG91dGwob21yIHwgT01SX1NEUCB8IE9NUl9UVE0sIERFNFg1X09NUik7XAorICAgIGxwLT5jYWNoZS5nZXAgPSAobHAtPmZkeCA/IDAgOiBHRVBfRkRYRCk7XAorICAgIGdlcF93cihscC0+Y2FjaGUuZ2VwLCBkZXYpO1wKKyAgfVwKK30KKworI2RlZmluZSBTRVRfMTAwTWIge1wKKyAgaWYgKChscC0+cGh5W2xwLT5hY3RpdmVdLmlkKSAmJiAoIWxwLT51c2VTUk9NIHx8IGxwLT51c2VNSUkpKSB7XAorICAgIGludCBmZHg9MDtcCisgICAgaWYgKGxwLT5waHlbbHAtPmFjdGl2ZV0uaWQgPT0gTkFUSU9OQUxfVFgpIHtcCisgICAgICAgIG1paV93cihtaWlfcmQoMHgxOCwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpICYgfjB4MjAwMCxcCisgICAgICAgICAgICAgICAgICAgICAgMHgxOCwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpO1wKKyAgICB9XAorICAgIG9tciA9IGlubChERTRYNV9PTVIpICYgfihPTVJfVFRNIHwgT01SX1BDUyB8IE9NUl9TQ1IgfCBPTVJfRkRYKTtcCisgICAgc3IgPSBtaWlfcmQoTUlJX1NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7XAorICAgIGlmICghKHNyICYgTUlJX0FOQV9UNEFNKSAmJiBscC0+ZmR4KSBmZHg9MTtcCisgICAgaWYgKChscC0+dG1wICE9IE1JSV9TUl9BU1NDKSB8fCAobHAtPmF1dG9zZW5zZSAhPSBBVVRPKSkge1wKKyAgICAgIG1paV93cihNSUlfQ1JfMTAwfChmZHg/TUlJX0NSX0ZETTowKSwgTUlJX0NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7XAorICAgIH1cCisgICAgaWYgKGZkeCkgb21yIHw9IE9NUl9GRFg7XAorICAgIG91dGwob21yLCBERTRYNV9PTVIpO1wKKyAgICBpZiAoIWxwLT51c2VTUk9NKSBscC0+Y2FjaGUuZ2VwID0gMDtcCisgIH0gZWxzZSBpZiAobHAtPnVzZVNST00gJiYgIWxwLT51c2VNSUkpIHtcCisgICAgb21yID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfUFMgfCBPTVJfSEJEIHwgT01SX1RUTSB8IE9NUl9QQ1MgfCBPTVJfU0NSIHwgT01SX0ZEWCkpO1wKKyAgICBvbXIgfD0gKGxwLT5mZHggPyBPTVJfRkRYIDogMCk7XAorICAgIG91dGwob21yIHwgbHAtPmluZm9ibG9ja19jc3I2LCBERTRYNV9PTVIpO1wKKyAgfSBlbHNlIHtcCisgICAgb21yID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfUFMgfCBPTVJfSEJEIHwgT01SX1RUTSB8IE9NUl9QQ1MgfCBPTVJfU0NSIHwgT01SX0ZEWCkpO1wKKyAgICBvbXIgfD0gKGxwLT5mZHggPyBPTVJfRkRYIDogMCk7XAorICAgIG91dGwob21yIHwgT01SX1NEUCB8IE9NUl9QUyB8IE9NUl9IQkQgfCBPTVJfUENTIHwgT01SX1NDUiwgREU0WDVfT01SKTtcCisgICAgbHAtPmNhY2hlLmdlcCA9IChscC0+ZmR4ID8gMCA6IEdFUF9GRFhEKSB8IEdFUF9NT0RFO1wKKyAgICBnZXBfd3IobHAtPmNhY2hlLmdlcCwgZGV2KTtcCisgIH1cCit9CisKKy8qIEZJWCBNRSBzbyBJIGRvbid0IGphbSAxME1iIG5ldHdvcmtzICovCisjZGVmaW5lIFNFVF8xMDBNYl9QREVUIHtcCisgIGlmICgobHAtPnBoeVtscC0+YWN0aXZlXS5pZCkgJiYgKCFscC0+dXNlU1JPTSB8fCBscC0+dXNlTUlJKSkge1wKKyAgICBtaWlfd3IoTUlJX0NSXzEwMHxNSUlfQ1JfQVNTRSwgTUlJX0NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7XAorICAgIG9tciA9IChpbmwoREU0WDVfT01SKSAmIH4oT01SX1RUTSB8IE9NUl9QQ1MgfCBPTVJfU0NSIHwgT01SX0ZEWCkpO1wKKyAgICBvdXRsKG9tciwgREU0WDVfT01SKTtcCisgIH0gZWxzZSBpZiAobHAtPnVzZVNST00gJiYgIWxwLT51c2VNSUkpIHtcCisgICAgb21yID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfVFRNIHwgT01SX1BDUyB8IE9NUl9TQ1IgfCBPTVJfRkRYKSk7XAorICAgIG91dGwob21yLCBERTRYNV9PTVIpO1wKKyAgfSBlbHNlIHtcCisgICAgb21yID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfUFMgfCBPTVJfSEJEIHwgT01SX1RUTSB8IE9NUl9QQ1MgfCBPTVJfU0NSIHwgT01SX0ZEWCkpO1wKKyAgICBvdXRsKG9tciB8IE9NUl9TRFAgfCBPTVJfUFMgfCBPTVJfSEJEIHwgT01SX1BDUywgREU0WDVfT01SKTtcCisgICAgbHAtPmNhY2hlLmdlcCA9IChHRVBfRkRYRCB8IEdFUF9NT0RFKTtcCisgICAgZ2VwX3dyKGxwLT5jYWNoZS5nZXAsIGRldik7XAorICB9XAorfQorCisvKgorKiogSW5jbHVkZSB0aGUgSU9DVEwgc3R1ZmYKKyovCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCisjZGVmaW5lCURFNFg1SU9DVEwJU0lPQ0RFVlBSSVZBVEUKKworc3RydWN0IGRlNHg1X2lvY3RsIHsKKwl1bnNpZ25lZCBzaG9ydCBjbWQ7ICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgdG8gcnVuICovCisJdW5zaWduZWQgc2hvcnQgbGVuOyAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyICovCisJdW5zaWduZWQgY2hhciAgX191c2VyICpkYXRhOyAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciAqLworfTsKKworLyogCisqKiBSZWNvZ25pc2VkIGNvbW1hbmRzIGZvciB0aGUgZHJpdmVyIAorKi8KKyNkZWZpbmUgREU0WDVfR0VUX0hXQUREUgkweDAxIC8qIEdldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyAqLworI2RlZmluZSBERTRYNV9TRVRfSFdBRERSCTB4MDIgLyogU2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzICovCisjZGVmaW5lIERFNFg1X1NFVF9QUk9NICAJMHgwMyAvKiBTZXQgUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBERTRYNV9DTFJfUFJPTSAgCTB4MDQgLyogQ2xlYXIgUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBERTRYNV9TQVlfQk9PCSAgICAgICAgMHgwNSAvKiBTYXkgIkJvbyEiIHRvIHRoZSBrZXJuZWwgbG9nIGZpbGUgKi8KKyNkZWZpbmUgREU0WDVfR0VUX01DQSAgIAkweDA2IC8qIEdldCBhIG11bHRpY2FzdCBhZGRyZXNzICovCisjZGVmaW5lIERFNFg1X1NFVF9NQ0EgICAJMHgwNyAvKiBTZXQgYSBtdWx0aWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBERTRYNV9DTFJfTUNBICAgIAkweDA4IC8qIENsZWFyIGEgbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgREU0WDVfTUNBX0VOICAgIAkweDA5IC8qIEVuYWJsZSBhIG11bHRpY2FzdCBhZGRyZXNzIGdyb3VwICovCisjZGVmaW5lIERFNFg1X0dFVF9TVEFUUyAgCTB4MGEgLyogR2V0IHRoZSBkcml2ZXIgc3RhdGlzdGljcyAqLworI2RlZmluZSBERTRYNV9DTFJfU1RBVFMgCTB4MGIgLyogWmVybyBvdXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisjZGVmaW5lIERFNFg1X0dFVF9PTVIgICAgICAgICAgIDB4MGMgLyogR2V0IHRoZSBPTVIgUmVnaXN0ZXIgY29udGVudHMgKi8KKyNkZWZpbmUgREU0WDVfU0VUX09NUiAgICAgICAgICAgMHgwZCAvKiBTZXQgdGhlIE9NUiBSZWdpc3RlciBjb250ZW50cyAqLworI2RlZmluZSBERTRYNV9HRVRfUkVHICAgICAgICAgICAweDBlIC8qIEdldCB0aGUgREU0WDUgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTU9UT19TUk9NX0JVRyAgICAoKGxwLT5hY3RpdmUgPT0gOCkgJiYgKCgobGUzMl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoKHMzMiAqKWRldi0+ZGV2X2FkZHIpKSkpJjB4MDBmZmZmZmYpPT0weDNlMDAwOCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMgYi9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1ZjMzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYwpAQCAtMCwwICsxLDIwNjYgQEAKKy8qCisgICAgQSBEYXZpY29tIERNOTEwMi9ETTkxMDJBL0RNOTEwMkErRE05ODAxL0RNOTEwMkErRE05ODAyIE5JQyBmYXN0CisgICAgZXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTcgIFN0ZW4gV2FuZworCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAgICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBEQVZJQ09NIFdlYi1TaXRlOiB3d3cuZGF2aWNvbS5jb20udHcKKworICAgIEF1dGhvcjogU3RlbiBXYW5nLCA4ODYtMy01Nzk4Nzk3LTg1MTcsIEUtbWFpbDogc3Rlbl93YW5nQGRhdmljb20uY29tLnR3CisgICAgTWFpbnRhaW5lcjogVG9iaWFzIFJpbmdzdHJvbSA8dG9yaUB1bmhhcHB5Lm1pbmUubnU+CisKKyAgICAoQylDb3B5cmlnaHQgMTk5Ny0xOTk4IERBVklDT00gU2VtaWNvbmR1Y3RvcixJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgICBNYXJjZWxvIFRvc2F0dGkgPG1hcmNlbG9AY29uZWN0aXZhLmNvbS5icj4gOgorICAgIE1hZGUgaXQgY29tcGlsZSBpbiAyLjMgKGRldmljZSB0byBuZXRfZGV2aWNlKQorCisgICAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4gOgorICAgIENsZWFuZWQgdXAgZm9yIGtlcm5lbCBtZXJnZS4KKyAgICBSZW1vdmVkIHRoZSBiYWNrIGNvbXBhdGliaWxpdHkgc3VwcG9ydAorICAgIFJlZm9ybWF0dGVkLCBmaXhpbmcgc3BlbGxpbmcgZXRjIGFzIEkgd2VudAorICAgIFJlbW92ZWQgSVJRIDAtMTUgYXNzdW1wdGlvbgorCisgICAgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPiA6CisgICAgVXBkYXRlZCB0byB1c2UgbmV3IFBDSSBkcml2ZXIgQVBJLgorICAgIFJlc291cmNlIHVzYWdlIGNsZWFudXBzLgorICAgIFJlcG9ydCBkcml2ZXIgdmVyc2lvbiB0byB1c2VyLgorCisgICAgVG9iaWFzIFJpbmdzdHJvbSA8dG9yaUB1bmhhcHB5Lm1pbmUubnU+IDoKKyAgICBDbGVhbmVkIHVwIGFuZCBhZGRlZCBTTVAgc2FmZXR5LiAgVGhhbmtzIGdvIHRvIEplZmYgR2FyemlrLAorICAgIEFuZHJldyBNb3J0b24gYW5kIEZyYW5rIERhdmlzIGZvciB0aGUgU01QIHNhZmV0eSBmaXhlcy4KKworICAgIFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+IDoKKyAgICBDbGVhbmVkIHVwIHBvaW50ZXIgYXJpdGhtZXRpY3MuCisgICAgRml4ZWQgYSBsb3Qgb2YgNjRiaXQgaXNzdWVzLgorICAgIENsZWFuZWQgdXAgcHJpbnRrKClzIGEgYml0LgorICAgIEZpeGVkIHNvbWUgb2J2aW91cyBiaWcgZW5kaWFuIHByb2JsZW1zLgorCisgICAgVG9iaWFzIFJpbmdzdHJvbSA8dG9yaUB1bmhhcHB5Lm1pbmUubnU+IDoKKyAgICBVc2UgdGltZV9hZnRlciBmb3IgamlmZmllcyBjYWxjdWxhdGlvbi4gIEFkZGVkIGV0aHRvb2wKKyAgICBzdXBwb3J0LiAgVXBkYXRlZCBQQ0kgcmVzb3VyY2UgYWxsb2NhdGlvbi4gIERvIG5vdAorICAgIGZvcmdldCB0byB1bm1hcCBQQ0kgbWFwcGVkIHNrYnMuCisKKyAgICBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICAgIEFkZGVkIG5ldyBQQ0kgaWRlbnRpZmllcnMgcHJvdmlkZWQgYnkgQ2xlYXIgWmhhbmcgYXQgQUxpIAorICAgIGZvciB0aGVpciAxNTYzIGV0aGVybmV0IGRldmljZS4KKworICAgIFRPRE8KKworICAgIEltcGxlbWVudCBwY2lfZHJpdmVyOjpzdXNwZW5kKCkgYW5kIHBjaV9kcml2ZXI6OnJlc3VtZSgpCisgICAgcG93ZXIgbWFuYWdlbWVudCBtZXRob2RzLgorCisgICAgQ2hlY2sgb24gNjQgYml0IGJveGVzLgorICAgIENoZWNrIGFuZCBmaXggb24gYmlnIGVuZGlhbiBib3hlcy4KKworICAgIFRlc3QgYW5kIG1ha2Ugc3VyZSBQQ0kgbGF0ZW5jeSBpcyBub3cgY29ycmVjdCBmb3IgYWxsIGNhc2VzLgorKi8KKworI2RlZmluZSBEUlZfTkFNRQkiZG1mZSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMzYuNCIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIjIwMDItMDEtMTciCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKworLyogQm9hcmQvU3lzdGVtL0RlYnVnIGluZm9ybWF0aW9uL2RlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBQQ0lfRE05MTMyX0lEICAgMHg5MTMyMTI4MiAgICAgIC8qIERhdmljb20gRE05MTMyIElEICovCisjZGVmaW5lIFBDSV9ETTkxMDJfSUQgICAweDkxMDIxMjgyICAgICAgLyogRGF2aWNvbSBETTkxMDIgSUQgKi8KKyNkZWZpbmUgUENJX0RNOTEwMF9JRCAgIDB4OTEwMDEyODIgICAgICAvKiBEYXZpY29tIERNOTEwMCBJRCAqLworI2RlZmluZSBQQ0lfRE05MDA5X0lEICAgMHg5MDA5MTI4MiAgICAgIC8qIERhdmljb20gRE05MDA5IElEICovCisKKyNkZWZpbmUgRE05MTAyX0lPX1NJWkUgIDB4ODAKKyNkZWZpbmUgRE05MTAyQV9JT19TSVpFIDB4MTAwCisjZGVmaW5lIFRYX01BWF9TRU5EX0NOVCAweDEgICAgICAgICAgICAgLyogTWF4aW11bSB0eCBwYWNrZXQgcGVyIHRpbWUgKi8KKyNkZWZpbmUgVFhfREVTQ19DTlQgICAgIDB4MTAgICAgICAgICAgICAvKiBBbGxvY2F0ZWQgVHggZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgUlhfREVTQ19DTlQgICAgIDB4MjAgICAgICAgICAgICAvKiBBbGxvY2F0ZWQgUnggZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgVFhfRlJFRV9ERVNDX0NOVCAoVFhfREVTQ19DTlQgLSAyKQkvKiBNYXggVFggcGFja2V0IGNvdW50ICovCisjZGVmaW5lIFRYX1dBS0VfREVTQ19DTlQgKFRYX0RFU0NfQ05UIC0gMykJLyogVFggd2FrZXVwIGNvdW50ICovCisjZGVmaW5lIERFU0NfQUxMX0NOVCAgICAoVFhfREVTQ19DTlQgKyBSWF9ERVNDX0NOVCkKKyNkZWZpbmUgVFhfQlVGX0FMTE9DICAgIDB4NjAwCisjZGVmaW5lIFJYX0FMTE9DX1NJWkUgICAweDYyMAorI2RlZmluZSBETTkxMFhfUkVTRVQgICAgMQorI2RlZmluZSBDUjBfREVGQVVMVCAgICAgMHgwMEUwMDAwMCAgICAgIC8qIFRYICYgUlggYnVyc3QgbW9kZSAqLworI2RlZmluZSBDUjZfREVGQVVMVCAgICAgMHgwMDA4MDAwMCAgICAgIC8qIEhEICovCisjZGVmaW5lIENSN19ERUZBVUxUICAgICAweDE4MGMxCisjZGVmaW5lIENSMTVfREVGQVVMVCAgICAweDA2ICAgICAgICAgICAgLyogVHhKYWJiZXIgUnhXYXRjaGRvZyAqLworI2RlZmluZSBUREVTMF9FUlJfTUFTSyAgMHg0MzAyICAgICAgICAgIC8qIFRYSlQsIExDLCBFQywgRlVFICovCisjZGVmaW5lIE1BWF9QQUNLRVRfU0laRSAxNTE0CisjZGVmaW5lIERNRkVfTUFYX01VTFRJQ0FTVCAxNAorI2RlZmluZSBSWF9DT1BZX1NJWkUJMTAwCisjZGVmaW5lIE1BWF9DSEVDS19QQUNLRVQgMHg4MDAwCisjZGVmaW5lIERNOTgwMV9OT0lTRV9GTE9PUiA4CisjZGVmaW5lIERNOTgwMl9OT0lTRV9GTE9PUiA1CisKKyNkZWZpbmUgRE1GRV8xME1IRiAgICAgIDAKKyNkZWZpbmUgRE1GRV8xMDBNSEYgICAgIDEKKyNkZWZpbmUgRE1GRV8xME1GRCAgICAgIDQKKyNkZWZpbmUgRE1GRV8xMDBNRkQgICAgIDUKKyNkZWZpbmUgRE1GRV9BVVRPICAgICAgIDgKKyNkZWZpbmUgRE1GRV8xTV9IUE5BICAgIDB4MTAKKworI2RlZmluZSBETUZFX1RYVEhfNzIJMHg0MDAwMDAJLyogVFggVEggNzIgYnl0ZSAqLworI2RlZmluZSBETUZFX1RYVEhfOTYJMHg0MDQwMDAJLyogVFggVEggOTYgYnl0ZSAqLworI2RlZmluZSBETUZFX1RYVEhfMTI4CTB4MDAwMAkJLyogVFggVEggMTI4IGJ5dGUgKi8KKyNkZWZpbmUgRE1GRV9UWFRIXzI1NgkweDQwMDAJCS8qIFRYIFRIIDI1NiBieXRlICovCisjZGVmaW5lIERNRkVfVFhUSF81MTIJMHg4MDAwCQkvKiBUWCBUSCA1MTIgYnl0ZSAqLworI2RlZmluZSBETUZFX1RYVEhfMUsJMHhDMDAwCQkvKiBUWCBUSCAxSyAgYnl0ZSAqLworCisjZGVmaW5lIERNRkVfVElNRVJfV1VUICAoamlmZmllcyArIEhaICogMSkvKiB0aW1lciB3YWtldXAgdGltZSA6IDEgc2Vjb25kICovCisjZGVmaW5lIERNRkVfVFhfVElNRU9VVCAoKDMqSFopLzIpCS8qIHR4IHBhY2tldCB0aW1lLW91dCB0aW1lIDEuNSBzIiAqLworI2RlZmluZSBETUZFX1RYX0tJQ0sgCShIWi8yKQkvKiB0eCBwYWNrZXQgS2ljay1vdXQgdGltZSAwLjUgcyIgKi8KKworI2RlZmluZSBETUZFX0RCVUcoZGJ1Z19ub3csIG1zZywgdmFsdWUpIGlmIChkbWZlX2RlYnVnIHx8IChkYnVnX25vdykpIHByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAlcyAlbHhcbiIsIChtc2cpLCAobG9uZykgKHZhbHVlKSkKKworI2RlZmluZSBTSE9XX01FRElBX1RZUEUobW9kZSkgcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IENoYW5nZSBTcGVlZCB0byAlc01oeiAlcyBkdXBsZXhcbiIsbW9kZSAmIDEgPyIxMDAiOiIxMCIsIG1vZGUgJiA0ID8gImZ1bGwiOiJoYWxmIik7CisKKworLyogQ1I5IGRlZmluaXRpb246IFNST00vTUlJICovCisjZGVmaW5lIENSOV9TUk9NX1JFQUQgICAweDQ4MDAKKyNkZWZpbmUgQ1I5X1NSQ1MgICAgICAgIDB4MQorI2RlZmluZSBDUjlfU1JDTEsgICAgICAgMHgyCisjZGVmaW5lIENSOV9DUkRPVVQgICAgICAweDgKKyNkZWZpbmUgU1JPTV9EQVRBXzAgICAgIDB4MAorI2RlZmluZSBTUk9NX0RBVEFfMSAgICAgMHg0CisjZGVmaW5lIFBIWV9EQVRBXzEgICAgICAweDIwMDAwCisjZGVmaW5lIFBIWV9EQVRBXzAgICAgICAweDAwMDAwCisjZGVmaW5lIE1EQ0xLSCAgICAgICAgICAweDEwMDAwCisKKyNkZWZpbmUgUEhZX1BPV0VSX0RPV04JMHg4MDAKKworI2RlZmluZSBTUk9NX1Y0MV9DT0RFICAgMHgxNAorCisjZGVmaW5lIFNST01fQ0xLX1dSSVRFKGRhdGEsIGlvYWRkcikgb3V0bChkYXRhfENSOV9TUk9NX1JFQUR8Q1I5X1NSQ1MsaW9hZGRyKTt1ZGVsYXkoNSk7b3V0bChkYXRhfENSOV9TUk9NX1JFQUR8Q1I5X1NSQ1N8Q1I5X1NSQ0xLLGlvYWRkcik7dWRlbGF5KDUpO291dGwoZGF0YXxDUjlfU1JPTV9SRUFEfENSOV9TUkNTLGlvYWRkcik7dWRlbGF5KDUpOworCisjZGVmaW5lIF9fQ0hLX0lPX1NJWkUocGNpX2lkLCBkZXZfcmV2KSAoICgocGNpX2lkKT09UENJX0RNOTEzMl9JRCkgfHwgKChkZXZfcmV2KSA+PSAweDAyMDAwMDMwKSApID8gRE05MTAyQV9JT19TSVpFOiBETTkxMDJfSU9fU0laRQorI2RlZmluZSBDSEtfSU9fU0laRShwY2lfZGV2LCBkZXZfcmV2KSBfX0NIS19JT19TSVpFKCgocGNpX2RldiktPmRldmljZSA8PCAxNikgfCAocGNpX2RldiktPnZlbmRvciwgZGV2X3JldikKKworLyogU3RlbiBDaGVjayAqLworI2RlZmluZSBERVZJQ0UgbmV0X2RldmljZQorCisvKiBTdHJ1Y3R1cmUvZW51bSBkZWNsYXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdHJ1Y3QgdHhfZGVzYyB7CisgICAgICAgIHUzMiB0ZGVzMCwgdGRlczEsIHRkZXMyLCB0ZGVzMzsgLyogRGF0YSBmb3IgdGhlIGNhcmQgKi8KKyAgICAgICAgY2hhciAqdHhfYnVmX3B0cjsgICAgICAgICAgICAgICAvKiBEYXRhIGZvciB1cyAqLworICAgICAgICBzdHJ1Y3QgdHhfZGVzYyAqbmV4dF90eF9kZXNjOworfSBfX2F0dHJpYnV0ZV9fKCggYWxpZ25lZCgzMikgKSk7CisKK3N0cnVjdCByeF9kZXNjIHsKKwl1MzIgcmRlczAsIHJkZXMxLCByZGVzMiwgcmRlczM7IC8qIERhdGEgZm9yIHRoZSBjYXJkICovCisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYl9wdHI7CS8qIERhdGEgZm9yIHVzICovCisJc3RydWN0IHJ4X2Rlc2MgKm5leHRfcnhfZGVzYzsKK30gX19hdHRyaWJ1dGVfXygoIGFsaWduZWQoMzIpICkpOworCitzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvIHsKKwl1MzIgY2hpcF9pZDsJCQkvKiBDaGlwIHZlbmRvci9EZXZpY2UgSUQgKi8KKwl1MzIgY2hpcF9yZXZpc2lvbjsJCS8qIENoaXAgcmV2aXNpb24gKi8KKwlzdHJ1Y3QgREVWSUNFICpuZXh0X2RldjsJLyogbmV4dCBkZXZpY2UgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJCS8qIFBDSSBkZXZpY2UgKi8KKwlzcGlubG9ja190IGxvY2s7CisKKwlsb25nIGlvYWRkcjsJCQkvKiBJL08gYmFzZSBhZGRyZXNzICovCisJdTMyIGNyMF9kYXRhOworCXUzMiBjcjVfZGF0YTsKKwl1MzIgY3I2X2RhdGE7CisJdTMyIGNyN19kYXRhOworCXUzMiBjcjE1X2RhdGE7CisKKwkvKiBwb2ludGVyIGZvciBtZW1vcnkgcGh5c2ljYWwgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgYnVmX3Bvb2xfZG1hX3B0cjsJLyogVHggYnVmZmVyIHBvb2wgbWVtb3J5ICovCisJZG1hX2FkZHJfdCBidWZfcG9vbF9kbWFfc3RhcnQ7CS8qIFR4IGJ1ZmZlciBwb29sIGFsaWduIGR3b3JkICovCisJZG1hX2FkZHJfdCBkZXNjX3Bvb2xfZG1hX3B0cjsJLyogZGVzY3JpcHRvciBwb29sIG1lbW9yeSAqLworCWRtYV9hZGRyX3QgZmlyc3RfdHhfZGVzY19kbWE7CisJZG1hX2FkZHJfdCBmaXJzdF9yeF9kZXNjX2RtYTsKKworCS8qIGRlc2NyaXB0b3IgcG9pbnRlciAqLworCXVuc2lnbmVkIGNoYXIgKmJ1Zl9wb29sX3B0cjsJLyogVHggYnVmZmVyIHBvb2wgbWVtb3J5ICovCisJdW5zaWduZWQgY2hhciAqYnVmX3Bvb2xfc3RhcnQ7CS8qIFR4IGJ1ZmZlciBwb29sIGFsaWduIGR3b3JkICovCisJdW5zaWduZWQgY2hhciAqZGVzY19wb29sX3B0cjsJLyogZGVzY3JpcHRvciBwb29sIG1lbW9yeSAqLworCXN0cnVjdCB0eF9kZXNjICpmaXJzdF90eF9kZXNjOworCXN0cnVjdCB0eF9kZXNjICp0eF9pbnNlcnRfcHRyOworCXN0cnVjdCB0eF9kZXNjICp0eF9yZW1vdmVfcHRyOworCXN0cnVjdCByeF9kZXNjICpmaXJzdF9yeF9kZXNjOworCXN0cnVjdCByeF9kZXNjICpyeF9pbnNlcnRfcHRyOworCXN0cnVjdCByeF9kZXNjICpyeF9yZWFkeV9wdHI7CS8qIHBhY2tldCBjb21lIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBsb25nIHR4X3BhY2tldF9jbnQ7CS8qIHRyYW5zbWl0dGVkIHBhY2tldCBjb3VudCAqLworCXVuc2lnbmVkIGxvbmcgdHhfcXVldWVfY250OwkvKiB3YWl0IHRvIHNlbmQgcGFja2V0IGNvdW50ICovCisJdW5zaWduZWQgbG9uZyByeF9hdmFpbF9jbnQ7CS8qIGF2YWlsYWJsZSByeCBkZXNjcmlwdG9yIGNvdW50ICovCisJdW5zaWduZWQgbG9uZyBpbnRlcnZhbF9yeF9jbnQ7CS8qIHJ4IHBhY2tldCBjb3VudCBhIGNhbGxiYWNrIHRpbWUgKi8KKworCXUxNiBIUE5BX2NvbW1hbmQ7CQkvKiBGb3IgSFBOQSByZWdpc3RlciAxNiAqLworCXUxNiBIUE5BX3RpbWVyOwkJCS8qIEZvciBIUE5BIHJlbW90ZSBkZXZpY2UgY2hlY2sgKi8KKwl1MTYgZGJ1Z19jbnQ7CisJdTE2IE5JQ19jYXBhYmlsaXR5OwkJLyogTklDIG1lZGlhIGNhcGFiaWxpdHkgKi8KKwl1MTYgUEhZX3JlZzQ7CQkJLyogU2F2ZWQgUGh5eGNlciByZWdpc3RlciA0IHZhbHVlICovCisKKwl1OCBIUE5BX3ByZXNlbnQ7CQkvKiAwOm5vbmUsIDE6RE05ODAxLCAyOkRNOTgwMiAqLworCXU4IGNoaXBfdHlwZTsJCQkvKiBLZWVwIERNOTEwMkEgY2hpcCB0eXBlICovCisJdTggbWVkaWFfbW9kZTsJCQkvKiB1c2VyIHNwZWNpZnkgbWVkaWEgbW9kZSAqLworCXU4IG9wX21vZGU7CQkJLyogcmVhbCB3b3JrIG1lZGlhIG1vZGUgKi8KKwl1OCBwaHlfYWRkcjsKKwl1OCBsaW5rX2ZhaWxlZDsJCQkvKiBFdmVyIGxpbmsgZmFpbGVkICovCisJdTggd2FpdF9yZXNldDsJCQkvKiBIYXJkd2FyZSBmYWlsZWQsIG5lZWQgdG8gcmVzZXQgKi8KKwl1OCBkbTkxMHhfY2hrX21vZGU7CQkvKiBPcGVyYXRpbmcgbW9kZSBjaGVjayAqLworCXU4IGZpcnN0X2luX2NhbGxiYWNrOwkJLyogRmxhZyB0byByZWNvcmQgc3RhdGUgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKworCS8qIFN5c3RlbSBkZWZpbmVkIHN0YXRpc3RpYyBjb3VudGVyICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKwkvKiBEcml2ZXIgZGVmaW5lZCBzdGF0aXN0aWMgY291bnRlciAqLworCXVuc2lnbmVkIGxvbmcgdHhfZmlmb191bmRlcnJ1bjsKKwl1bnNpZ25lZCBsb25nIHR4X2xvc3NfY2FycmllcjsKKwl1bnNpZ25lZCBsb25nIHR4X25vX2NhcnJpZXI7CisJdW5zaWduZWQgbG9uZyB0eF9sYXRlX2NvbGxpc2lvbjsKKwl1bnNpZ25lZCBsb25nIHR4X2V4Y2Vzc2l2ZV9jb2xsaXNpb247CisJdW5zaWduZWQgbG9uZyB0eF9qYWJiZXJfdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIHJlc2V0X2NvdW50OworCXVuc2lnbmVkIGxvbmcgcmVzZXRfY3I4OworCXVuc2lnbmVkIGxvbmcgcmVzZXRfZmF0YWw7CisJdW5zaWduZWQgbG9uZyByZXNldF9UWHRpbWVvdXQ7CisKKwkvKiBOSUMgU1JPTSBkYXRhICovCisJdW5zaWduZWQgY2hhciBzcm9tWzEyOF07Cit9OworCitlbnVtIGRtZmVfb2Zmc2V0cyB7CisJRENSMCA9IDB4MDAsIERDUjEgPSAweDA4LCBEQ1IyID0gMHgxMCwgRENSMyA9IDB4MTgsIERDUjQgPSAweDIwLAorCURDUjUgPSAweDI4LCBEQ1I2ID0gMHgzMCwgRENSNyA9IDB4MzgsIERDUjggPSAweDQwLCBEQ1I5ID0gMHg0OCwKKwlEQ1IxMCA9IDB4NTAsIERDUjExID0gMHg1OCwgRENSMTIgPSAweDYwLCBEQ1IxMyA9IDB4NjgsIERDUjE0ID0gMHg3MCwKKwlEQ1IxNSA9IDB4NzgKK307CisKK2VudW0gZG1mZV9DUjZfYml0cyB7CisJQ1I2X1JYU0MgPSAweDIsIENSNl9QQkYgPSAweDgsIENSNl9QTSA9IDB4NDAsIENSNl9QQU0gPSAweDgwLAorCUNSNl9GRE0gPSAweDIwMCwgQ1I2X1RYU0MgPSAweDIwMDAsIENSNl9TVEkgPSAweDEwMDAwMCwKKwlDUjZfU0ZUID0gMHgyMDAwMDAsIENSNl9SWEEgPSAweDQwMDAwMDAwLCBDUjZfTk9fUFVSR0UgPSAweDIwMDAwMDAwCit9OworCisvKiBHbG9iYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0ZGF0YSBwcmludGVkX3ZlcnNpb247CitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJS0VSTl9JTkZPIERSVl9OQU1FICI6IERhdmljb20gRE05eHh4IG5ldCBkcml2ZXIsIHZlcnNpb24gIgorCURSVl9WRVJTSU9OICIgKCIgRFJWX1JFTERBVEUgIilcbiI7CisKK3N0YXRpYyBpbnQgZG1mZV9kZWJ1ZzsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRtZmVfbWVkaWFfbW9kZSA9IERNRkVfQVVUTzsKK3N0YXRpYyB1MzIgZG1mZV9jcjZfdXNlcl9zZXQ7CisKKy8qIEZvciBtb2R1bGUgaW5wdXQgcGFyYW1ldGVyICovCitzdGF0aWMgaW50IGRlYnVnOworc3RhdGljIHUzMiBjcjZzZXQ7CitzdGF0aWMgdW5zaWduZWQgY2hhciBtb2RlID0gODsKK3N0YXRpYyB1OCBjaGttb2RlID0gMTsKK3N0YXRpYyB1OCBIUE5BX21vZGU7CQkvKiBEZWZhdWx0OiBMb3cgUG93ZXIvSGlnaCBTcGVlZCAqLworc3RhdGljIHU4IEhQTkFfcnhfY21kOwkJLyogRGVmYXVsdDogRGlzYWJsZSBSeCByZW1vdGUgY29tbWFuZCAqLworc3RhdGljIHU4IEhQTkFfdHhfY21kOwkJLyogRGVmYXVsdDogRG9uJ3QgaXNzdWUgcmVtb3RlIGNvbW1hbmQgKi8KK3N0YXRpYyB1OCBIUE5BX05vaXNlRmxvb3I7CS8qIERlZmF1bHQ6IEhQTkEgTm9pc2VGbG9vciAqLworc3RhdGljIHU4IFNGX21vZGU7CQkvKiBTcGVjaWFsIEZ1bmN0aW9uOiAxOlZMQU4sIDI6UlggRmxvdyBDb250cm9sCisJCQkJICAgNDogVFggcGF1c2UgcGFja2V0ICovCisKKworLyogZnVuY3Rpb24gZGVjbGFyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBkbWZlX29wZW4oc3RydWN0IERFVklDRSAqKTsKK3N0YXRpYyBpbnQgZG1mZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICosIHN0cnVjdCBERVZJQ0UgKik7CitzdGF0aWMgaW50IGRtZmVfc3RvcChzdHJ1Y3QgREVWSUNFICopOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogZG1mZV9nZXRfc3RhdHMoc3RydWN0IERFVklDRSAqKTsKK3N0YXRpYyB2b2lkIGRtZmVfc2V0X2ZpbHRlcl9tb2RlKHN0cnVjdCBERVZJQ0UgKik7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKK3N0YXRpYyB1MTYgcmVhZF9zcm9tX3dvcmQobG9uZyAsaW50KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBkbWZlX2ludGVycnVwdChpbnQgLCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBwb2xsX2RtZmUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCitzdGF0aWMgdm9pZCBkbWZlX2Rlc2NyaXB0b3JfaW5pdChzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICosIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgYWxsb2NhdGVfcnhfYnVmZmVyKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKik7CitzdGF0aWMgdm9pZCB1cGRhdGVfY3I2KHUzMiwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBzZW5kX2ZpbHRlcl9mcmFtZShzdHJ1Y3QgREVWSUNFICogLGludCk7CitzdGF0aWMgdm9pZCBkbTkxMzJfaWRfdGFibGUoc3RydWN0IERFVklDRSAqICxpbnQpOworc3RhdGljIHUxNiBwaHlfcmVhZCh1bnNpZ25lZCBsb25nLCB1OCwgdTgsIHUzMik7CitzdGF0aWMgdm9pZCBwaHlfd3JpdGUodW5zaWduZWQgbG9uZywgdTgsIHU4LCB1MTYsIHUzMik7CitzdGF0aWMgdm9pZCBwaHlfd3JpdGVfMWJpdCh1bnNpZ25lZCBsb25nLCB1MzIpOworc3RhdGljIHUxNiBwaHlfcmVhZF8xYml0KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHU4IGRtZmVfc2Vuc2Vfc3BlZWQoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqKTsKK3N0YXRpYyB2b2lkIGRtZmVfcHJvY2Vzc19tb2RlKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKik7CitzdGF0aWMgdm9pZCBkbWZlX3RpbWVyKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGlubGluZSB1MzIgY2FsX0NSQyh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwgdTgpOworc3RhdGljIHZvaWQgZG1mZV9yeF9wYWNrZXQoc3RydWN0IERFVklDRSAqLCBzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICopOworc3RhdGljIHZvaWQgZG1mZV9mcmVlX3R4X3BrdChzdHJ1Y3QgREVWSUNFICosIHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKik7CitzdGF0aWMgdm9pZCBkbWZlX3JldXNlX3NrYihzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICosIHN0cnVjdCBza19idWZmICopOworc3RhdGljIHZvaWQgZG1mZV9keW5hbWljX3Jlc2V0KHN0cnVjdCBERVZJQ0UgKik7CitzdGF0aWMgdm9pZCBkbWZlX2ZyZWVfcnhidWZmZXIoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqKTsKK3N0YXRpYyB2b2lkIGRtZmVfaW5pdF9kbTkxMHgoc3RydWN0IERFVklDRSAqKTsKK3N0YXRpYyB2b2lkIGRtZmVfcGFyc2Vfc3JvbShzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICopOworc3RhdGljIHZvaWQgZG1mZV9wcm9ncmFtX0RNOTgwMShzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICosIGludCk7CitzdGF0aWMgdm9pZCBkbWZlX3Byb2dyYW1fRE05ODAyKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKik7CitzdGF0aWMgdm9pZCBkbWZlX0hQTkFfcmVtb3RlX2NtZF9jaGsoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqICk7CitzdGF0aWMgdm9pZCBkbWZlX3NldF9waHl4Y2VyKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKik7CisKKy8qIERNOTEwWCBuZXR3b3JrIGJhb3JkIHJvdXRpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICoJU2VhcmNoIERNOTEwWCBib2FyZCAsYWxsb2NhdGUgc3BhY2UgYW5kIHJlZ2lzdGVyIGl0CisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgZG1mZV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGI7CS8qIGJvYXJkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdTMyIGRldl9yZXYsIHBjaV9wbXI7CisJaW50IGksIGVycjsKKworCURNRkVfREJVRygwLCAiZG1mZV9pbml0X29uZSgpIiwgMCk7CisKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsodmVyc2lvbik7CisKKwkvKiBJbml0IG5ldHdvcmsgZGV2aWNlICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCpkYikpOworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IDMyLWJpdCBQQ0kgRE1BIG5vdCBhdmFpbGFibGUuXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisJfQorCisJLyogRW5hYmxlIE1hc3Rlci9JTyBhY2Nlc3MsIERpc2FibGUgbWVtb3J5IGFjY2VzcyAqLworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlOworCisJaWYgKCFwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IEkvTyBiYXNlIGlzIHplcm9cbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwl9CisKKwkvKiBSZWFkIENoaXAgcmV2aXNpb24gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX1JFVklTSU9OX0lELCAmZGV2X3Jldik7CisKKwlpZiAocGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSA8IChDSEtfSU9fU0laRShwZGV2LCBkZXZfcmV2KSkgKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBBbGxvY2F0ZWQgSS9PIHNpemUgdG9vIHNtYWxsXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisJfQorCisjaWYgMAkvKiBwY2lfe2VuYWJsZV9kZXZpY2Usc2V0X21hc3Rlcn0gc2V0cyBtaW5pbXVtIGxhdGVuY3kgZm9yIHVzIG5vdyAqLworCisJLyogU2V0IExhdGVuY3kgVGltZXIgODBoICovCisJLyogRklYTUU6IHNldHRpbmcgdmFsdWVzID4gMzIgYnJlYWtzIHNvbWUgU2lTIDU1OXggc3R1ZmYuCisJICAgTmVlZCBhIFBDSSBxdWlyay4uICovCisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4ODApOworI2VuZGlmCisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IEZhaWxlZCB0byByZXF1ZXN0IFBDSSByZWdpb25zXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisJfQorCisJLyogSW5pdCBzeXN0ZW0gJiBkZXZpY2UgKi8KKwlkYiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBBbGxvY2F0ZSBUeC9SeCBkZXNjcmlwdG9yIG1lbW9yeSAqLworCWRiLT5kZXNjX3Bvb2xfcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIERFU0NfQUxMX0NOVCArIDB4MjAsICZkYi0+ZGVzY19wb29sX2RtYV9wdHIpOworCWRiLT5idWZfcG9vbF9wdHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBUWF9CVUZfQUxMT0MgKiBUWF9ERVNDX0NOVCArIDQsICZkYi0+YnVmX3Bvb2xfZG1hX3B0cik7CisKKwlkYi0+Zmlyc3RfdHhfZGVzYyA9IChzdHJ1Y3QgdHhfZGVzYyAqKSBkYi0+ZGVzY19wb29sX3B0cjsKKwlkYi0+Zmlyc3RfdHhfZGVzY19kbWEgPSBkYi0+ZGVzY19wb29sX2RtYV9wdHI7CisJZGItPmJ1Zl9wb29sX3N0YXJ0ID0gZGItPmJ1Zl9wb29sX3B0cjsKKwlkYi0+YnVmX3Bvb2xfZG1hX3N0YXJ0ID0gZGItPmJ1Zl9wb29sX2RtYV9wdHI7CisKKwlkYi0+Y2hpcF9pZCA9IGVudC0+ZHJpdmVyX2RhdGE7CisJZGItPmlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlkYi0+Y2hpcF9yZXZpc2lvbiA9IGRldl9yZXY7CisKKwlkYi0+cGRldiA9IHBkZXY7CisKKwlkZXYtPmJhc2VfYWRkciA9IGRiLT5pb2FkZHI7CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJZGV2LT5vcGVuID0gJmRtZmVfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZkbWZlX3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gJmRtZmVfc3RvcDsKKwlkZXYtPmdldF9zdGF0cyA9ICZkbWZlX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZkbWZlX3NldF9maWx0ZXJfbW9kZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gJnBvbGxfZG1mZTsKKyNlbmRpZgorCWRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOworCXNwaW5fbG9ja19pbml0KCZkYi0+bG9jayk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg1MCwgJnBjaV9wbXIpOworCXBjaV9wbXIgJj0gMHg3MDAwMDsKKwlpZiAoIChwY2lfcG1yID09IDB4MTAwMDApICYmIChkZXZfcmV2ID09IDB4MDIwMDAwMzEpICkKKwkJZGItPmNoaXBfdHlwZSA9IDE7CS8qIERNOTEwMkEgRTMgKi8KKwllbHNlCisJCWRiLT5jaGlwX3R5cGUgPSAwOworCisJLyogcmVhZCA2NCB3b3JkIHNyb20gZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorCQkoKHUxNiAqKSBkYi0+c3JvbSlbaV0gPSBjcHVfdG9fbGUxNihyZWFkX3Nyb21fd29yZChkYi0+aW9hZGRyLCBpKSk7CisKKwkvKiBTZXQgTm9kZSBhZGRyZXNzICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGRiLT5zcm9tWzIwICsgaV07CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYgKGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X3JlczsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBEYXZpY29tIERNJTA0bHggYXQgcGNpJXMsIiwKKwkJZGV2LT5uYW1lLAorCQllbnQtPmRyaXZlcl9kYXRhID4+IDE2LAorCQlwY2lfbmFtZShwZGV2KSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlYyUwMngiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiwgaXJxICVkLlxuIiwgZGV2LT5pcnEpOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXRfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJfb3V0X2ZyZWU6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkbWZlX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJRE1GRV9EQlVHKDAsICJkbWZlX3JlbW92ZV9vbmUoKSIsIDApOworCisgCWlmIChkZXYpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkYi0+cGRldiwgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqCisJCQkJCURFU0NfQUxMX0NOVCArIDB4MjAsIGRiLT5kZXNjX3Bvb2xfcHRyLAorIAkJCQkJZGItPmRlc2NfcG9vbF9kbWFfcHRyKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkYi0+cGRldiwgVFhfQlVGX0FMTE9DICogVFhfREVTQ19DTlQgKyA0LAorCQkJCQlkYi0+YnVmX3Bvb2xfcHRyLCBkYi0+YnVmX3Bvb2xfZG1hX3B0cik7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CS8qIGZyZWUgYm9hcmQgaW5mb3JtYXRpb24gKi8KKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCX0KKworCURNRkVfREJVRygwLCAiZG1mZV9yZW1vdmVfb25lKCkgZXhpdCIsIDApOworfQorCisKKy8qCisgKglPcGVuIHRoZSBpbnRlcmZhY2UuCisgKglUaGUgaW50ZXJmYWNlIGlzIG9wZW5lZCB3aGVuZXZlciAiaWZjb25maWciIGFjdGl2ZXMgaXQuCisgKi8KKworc3RhdGljIGludCBkbWZlX29wZW4oc3RydWN0IERFVklDRSAqZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJRE1GRV9EQlVHKDAsICJkbWZlX29wZW4iLCAwKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmZG1mZV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHN5c3RlbSB2YXJpYWJsZSBpbml0ICovCisJZGItPmNyNl9kYXRhID0gQ1I2X0RFRkFVTFQgfCBkbWZlX2NyNl91c2VyX3NldDsKKwlkYi0+dHhfcGFja2V0X2NudCA9IDA7CisJZGItPnR4X3F1ZXVlX2NudCA9IDA7CisJZGItPnJ4X2F2YWlsX2NudCA9IDA7CisJZGItPmxpbmtfZmFpbGVkID0gMTsKKwlkYi0+d2FpdF9yZXNldCA9IDA7CisKKwlkYi0+Zmlyc3RfaW5fY2FsbGJhY2sgPSAwOworCWRiLT5OSUNfY2FwYWJpbGl0eSA9IDB4ZjsJLyogQWxsIGNhcGFiaWxpdHkqLworCWRiLT5QSFlfcmVnNCA9IDB4MWUwOworCisJLyogQ1I2IG9wZXJhdGlvbiBtb2RlIGRlY2lzaW9uICovCisJaWYgKCAhY2hrbW9kZSB8fCAoZGItPmNoaXBfaWQgPT0gUENJX0RNOTEzMl9JRCkgfHwKKwkJKGRiLT5jaGlwX3JldmlzaW9uID49IDB4MDIwMDAwMzApICkgeworICAgIAkJZGItPmNyNl9kYXRhIHw9IERNRkVfVFhUSF8yNTY7CisJCWRiLT5jcjBfZGF0YSA9IENSMF9ERUZBVUxUOworCQlkYi0+ZG05MTB4X2Noa19tb2RlPTQ7CQkvKiBFbnRlciB0aGUgbm9ybWFsIG1vZGUgKi8KKyAJfSBlbHNlIHsKKwkJZGItPmNyNl9kYXRhIHw9IENSNl9TRlQ7CS8qIFN0b3JlICYgRm9yd2FyZCBtb2RlICovCisJCWRiLT5jcjBfZGF0YSA9IDA7CisJCWRiLT5kbTkxMHhfY2hrX21vZGUgPSAxOwkvKiBFbnRlciB0aGUgY2hlY2sgbW9kZSAqLworCX0KKworCS8qIEluaXRpbGl6ZSBETTkxMFggYm9hcmQgKi8KKwlkbWZlX2luaXRfZG05MTB4KGRldik7CisKKwkvKiBBY3RpdmUgU3lzdGVtIEludGVyZmFjZSAqLworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCS8qIHNldCBhbmQgYWN0aXZlIGEgdGltZXIgcHJvY2VzcyAqLworCWluaXRfdGltZXIoJmRiLT50aW1lcik7CisJZGItPnRpbWVyLmV4cGlyZXMgPSBETUZFX1RJTUVSX1dVVCArIEhaICogMjsKKwlkYi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlkYi0+dGltZXIuZnVuY3Rpb24gPSAmZG1mZV90aW1lcjsKKwlhZGRfdGltZXIoJmRiLT50aW1lcik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKglJbml0aWxpemUgRE05MTBYIGJvYXJkCisgKglSZXNldCBETTkxMFggYm9hcmQKKyAqCUluaXRpbGl6ZSBUWC9SeCBkZXNjcmlwdG9yIGNoYWluIHN0cnVjdHVyZQorICoJU2VuZCB0aGUgc2V0LXVwIGZyYW1lCisgKglFbmFibGUgVHgvUnggbWFjaGluZQorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfaW5pdF9kbTkxMHgoc3RydWN0IERFVklDRSAqZGV2KQoreworCXN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRiLT5pb2FkZHI7CisKKwlETUZFX0RCVUcoMCwgImRtZmVfaW5pdF9kbTkxMHgoKSIsIDApOworCisJLyogUmVzZXQgRE05MTB4IE1BQyBjb250cm9sbGVyICovCisJb3V0bChETTkxMFhfUkVTRVQsIGlvYWRkciArIERDUjApOwkvKiBSRVNFVCBNQUMgKi8KKwl1ZGVsYXkoMTAwKTsKKwlvdXRsKGRiLT5jcjBfZGF0YSwgaW9hZGRyICsgRENSMCk7CisJdWRlbGF5KDUpOworCisJLyogUGh5IGFkZHIgOiBETTkxMChBKTIvRE05MTMyLzk4MDEsIHBoeSBhZGRyZXNzID0gMSAqLworCWRiLT5waHlfYWRkciA9IDE7CisKKwkvKiBQYXJzZXIgU1JPTSBhbmQgbWVkaWEgbW9kZSAqLworCWRtZmVfcGFyc2Vfc3JvbShkYik7CisJZGItPm1lZGlhX21vZGUgPSBkbWZlX21lZGlhX21vZGU7CisKKwkvKiBSRVNFVCBQaHl4Y2VyIENoaXAgYnkgR1BSIHBvcnQgYml0IDcgKi8KKwlvdXRsKDB4MTgwLCBpb2FkZHIgKyBEQ1IxMik7CQkvKiBMZXQgYml0IDcgb3V0cHV0IHBvcnQgKi8KKwlpZiAoZGItPmNoaXBfaWQgPT0gUENJX0RNOTAwOV9JRCkgeworCQlvdXRsKDB4ODAsIGlvYWRkciArIERDUjEyKTsJLyogSXNzdWUgUkVTRVQgc2lnbmFsICovCisJCW1kZWxheSgzMDApOwkJCS8qIERlbGF5IDMwMCBtcyAqLworCX0KKwlvdXRsKDB4MCwgaW9hZGRyICsgRENSMTIpOwkvKiBDbGVhciBSRVNFVCBzaWduYWwgKi8KKworCS8qIFByb2Nlc3MgUGh5eGNlciBNZWRpYSBNb2RlICovCisJaWYgKCAhKGRiLT5tZWRpYV9tb2RlICYgMHgxMCkgKQkvKiBGb3JjZSAxTSBtb2RlICovCisJCWRtZmVfc2V0X3BoeXhjZXIoZGIpOworCisJLyogTWVkaWEgTW9kZSBQcm9jZXNzICovCisJaWYgKCAhKGRiLT5tZWRpYV9tb2RlICYgRE1GRV9BVVRPKSApCisJCWRiLT5vcF9tb2RlID0gZGItPm1lZGlhX21vZGU7IAkvKiBGb3JjZSBNb2RlICovCisKKwkvKiBJbml0aWxpYXplIFRyYW5zbWl0L1JlY2VpdmUgZGVjcmlwdG9yIGFuZCBDUjMvNCAqLworCWRtZmVfZGVzY3JpcHRvcl9pbml0KGRiLCBpb2FkZHIpOworCisJLyogSW5pdCBDUjYgdG8gcHJvZ3JhbSBETTkxMHggb3BlcmF0aW9uICovCisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGlvYWRkcik7CisKKwkvKiBTZW5kIHNldHVwIGZyYW1lICovCisJaWYgKGRiLT5jaGlwX2lkID09IFBDSV9ETTkxMzJfSUQpCisJCWRtOTEzMl9pZF90YWJsZShkZXYsIGRldi0+bWNfY291bnQpOwkvKiBETTkxMzIgKi8KKwllbHNlCisJCXNlbmRfZmlsdGVyX2ZyYW1lKGRldiwgZGV2LT5tY19jb3VudCk7CS8qIERNOTEwMi9ETTkxMDJBICovCisKKwkvKiBJbml0IENSNywgaW50ZXJydXB0IGFjdGl2ZSBiaXQgKi8KKwlkYi0+Y3I3X2RhdGEgPSBDUjdfREVGQVVMVDsKKwlvdXRsKGRiLT5jcjdfZGF0YSwgaW9hZGRyICsgRENSNyk7CisKKwkvKiBJbml0IENSMTUsIFR4IGphYmJlciBhbmQgUnggd2F0Y2hkb2cgdGltZXIgKi8KKwlvdXRsKGRiLT5jcjE1X2RhdGEsIGlvYWRkciArIERDUjE1KTsKKworCS8qIEVuYWJsZSBETTkxMFggVHgvUnggZnVuY3Rpb24gKi8KKwlkYi0+Y3I2X2RhdGEgfD0gQ1I2X1JYU0MgfCBDUjZfVFhTQyB8IDB4NDAwMDA7CisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGlvYWRkcik7Cit9CisKKworLyoKKyAqCUhhcmR3YXJlIHN0YXJ0IHRyYW5zbWlzc2lvbi4KKyAqCVNlbmQgYSBwYWNrZXQgdG8gbWVkaWEgZnJvbSB0aGUgdXBwZXIgbGF5ZXIuCisgKi8KKworc3RhdGljIGludCBkbWZlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IERFVklDRSAqZGV2KQoreworCXN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdHhfZGVzYyAqdHhwdHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURNRkVfREJVRygwLCAiZG1mZV9zdGFydF94bWl0IiwgMCk7CisKKwkvKiBSZXNvdXJjZSBmbGFnIGNoZWNrICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogVG9vIGxhcmdlIHBhY2tldCBjaGVjayAqLworCWlmIChza2ItPmxlbiA+IE1BWF9QQUNLRVRfU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogYmlnIHBhY2tldCA9ICVkXG4iLCAodTE2KXNrYi0+bGVuKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGItPmxvY2ssIGZsYWdzKTsKKworCS8qIE5vIFR4IHJlc291cmNlIGNoZWNrLCBpdCBuZXZlciBoYXBwZW4gbnJvbWFsbHkgKi8KKwlpZiAoZGItPnR4X3F1ZXVlX2NudCA+PSBUWF9GUkVFX0RFU0NfQ05UKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBObyBUeCByZXNvdXJjZSAlbGRcbiIsIGRiLT50eF9xdWV1ZV9jbnQpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBEaXNhYmxlIE5JQyBpbnRlcnJ1cHQgKi8KKwlvdXRsKDAsIGRldi0+YmFzZV9hZGRyICsgRENSNyk7CisKKwkvKiB0cmFuc21pdCB0aGlzIHBhY2tldCAqLworCXR4cHRyID0gZGItPnR4X2luc2VydF9wdHI7CisJbWVtY3B5KHR4cHRyLT50eF9idWZfcHRyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwl0eHB0ci0+dGRlczEgPSBjcHVfdG9fbGUzMigweGUxMDAwMDAwIHwgc2tiLT5sZW4pOworCisJLyogUG9pbnQgdG8gbmV4dCB0cmFuc21pdCBmcmVlIGRlc2NyaXB0b3IgKi8KKwlkYi0+dHhfaW5zZXJ0X3B0ciA9IHR4cHRyLT5uZXh0X3R4X2Rlc2M7CisKKwkvKiBUcmFuc21pdCBQYWNrZXQgUHJvY2VzcyAqLworCWlmICggKCFkYi0+dHhfcXVldWVfY250KSAmJiAoZGItPnR4X3BhY2tldF9jbnQgPCBUWF9NQVhfU0VORF9DTlQpICkgeworCQl0eHB0ci0+dGRlczAgPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsJLyogU2V0IG93bmVyIGJpdCAqLworCQlkYi0+dHhfcGFja2V0X2NudCsrOwkJCS8qIFJlYWR5IHRvIHNlbmQgKi8KKwkJb3V0bCgweDEsIGRldi0+YmFzZV9hZGRyICsgRENSMSk7CS8qIElzc3VlIFR4IHBvbGxpbmcgKi8KKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CQkvKiBzYXZlZCB0aW1lIHN0YW1wICovCisJfSBlbHNlIHsKKwkJZGItPnR4X3F1ZXVlX2NudCsrOwkJCS8qIHF1ZXVlIFRYIHBhY2tldCAqLworCQlvdXRsKDB4MSwgZGV2LT5iYXNlX2FkZHIgKyBEQ1IxKTsJLyogSXNzdWUgVHggcG9sbGluZyAqLworCX0KKworCS8qIFR4IHJlc291cmNlIGNoZWNrICovCisJaWYgKCBkYi0+dHhfcXVldWVfY250IDwgVFhfRlJFRV9ERVNDX0NOVCApCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCS8qIFJlc3RvcmUgQ1I3IHRvIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworCW91dGwoZGItPmNyN19kYXRhLCBkZXYtPmJhc2VfYWRkciArIERDUjcpOworCisJLyogZnJlZSB0aGlzIFNLQiAqLworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglTdG9wIHRoZSBpbnRlcmZhY2UuCisgKglUaGUgaW50ZXJmYWNlIGlzIHN0b3BwZWQgd2hlbiBpdCBpcyBicm91Z2h0LgorICovCisKK3N0YXRpYyBpbnQgZG1mZV9zdG9wKHN0cnVjdCBERVZJQ0UgKmRldikKK3sKKwlzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCURNRkVfREJVRygwLCAiZG1mZV9zdG9wIiwgMCk7CisKKwkvKiBkaXNhYmxlIHN5c3RlbSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIGRlbGV0ZWQgdGltZXIgKi8KKwlkZWxfdGltZXJfc3luYygmZGItPnRpbWVyKTsKKworCS8qIFJlc2V0ICYgc3RvcCBETTkxMFggYm9hcmQgKi8KKwlvdXRsKERNOTEwWF9SRVNFVCwgaW9hZGRyICsgRENSMCk7CisJdWRlbGF5KDUpOworCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDAsIDB4ODAwMCwgZGItPmNoaXBfaWQpOworCisJLyogZnJlZSBpbnRlcnJ1cHQgKi8KKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCS8qIGZyZWUgYWxsb2NhdGVkIHJ4IGJ1ZmZlciAqLworCWRtZmVfZnJlZV9yeGJ1ZmZlcihkYik7CisKKyNpZiAwCisJLyogc2hvdyBzdGF0aXN0aWMgY291bnRlciAqLworCXByaW50ayhEUlZfTkFNRSAiOiBGVTolbHggRUM6JWx4IExDOiVseCBOQzolbHggTE9DOiVseCBUWEpUOiVseCBSRVNFVDolbHggUkNSODolbHggRkFMOiVseCBUVDolbHhcbiIsCisJCWRiLT50eF9maWZvX3VuZGVycnVuLCBkYi0+dHhfZXhjZXNzaXZlX2NvbGxpc2lvbiwKKwkJZGItPnR4X2xhdGVfY29sbGlzaW9uLCBkYi0+dHhfbm9fY2FycmllciwgZGItPnR4X2xvc3NfY2FycmllciwKKwkJZGItPnR4X2phYmJlcl90aW1lb3V0LCBkYi0+cmVzZXRfY291bnQsIGRiLT5yZXNldF9jcjgsCisJCWRiLT5yZXNldF9mYXRhbCwgZGItPnJlc2V0X1RYdGltZW91dCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglETTkxMDIgaW5zdGVycnVwdCBoYW5kbGVyCisgKglyZWNlaXZlIHRoZSBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIsIGZyZWUgdGhlIHRyYW5zbWl0dGVkIHBhY2tldAorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkbWZlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBERVZJQ0UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRE1GRV9EQlVHKDAsICJkbWZlX2ludGVycnVwdCgpIiwgMCk7CisKKwlpZiAoIWRldikgeworCQlETUZFX0RCVUcoMSwgImRtZmVfaW50ZXJydXB0KCkgd2l0aG91dCBERVZJQ0UgYXJnIiwgMCk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGItPmxvY2ssIGZsYWdzKTsKKworCS8qIEdvdCBETTkxMFggc3RhdHVzICovCisJZGItPmNyNV9kYXRhID0gaW5sKGlvYWRkciArIERDUjUpOworCW91dGwoZGItPmNyNV9kYXRhLCBpb2FkZHIgKyBEQ1I1KTsKKwlpZiAoICEoZGItPmNyNV9kYXRhICYgMHhjMSkgKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHQgaW4gQ1I3IHRvIHNvbHZlIHRoZSBpbnRlcnJ1cHQgZWRnZSBwcm9ibGVtICovCisJb3V0bCgwLCBpb2FkZHIgKyBEQ1I3KTsKKworCS8qIENoZWNrIHN5c3RlbSBzdGF0dXMgKi8KKwlpZiAoZGItPmNyNV9kYXRhICYgMHgyMDAwKSB7CisJCS8qIHN5c3RlbSBidXMgZXJyb3IgaGFwcGVuICovCisJCURNRkVfREJVRygxLCAiU3lzdGVtIGJ1cyBlcnJvciBoYXBwZW4uIENSNT0iLCBkYi0+Y3I1X2RhdGEpOworCQlkYi0+cmVzZXRfZmF0YWwrKzsKKwkJZGItPndhaXRfcmVzZXQgPSAxOwkvKiBOZWVkIHRvIFJFU0VUICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkgLyogUmVjZWl2ZWQgdGhlIGNvbWluZyBwYWNrZXQgKi8KKwlpZiAoIChkYi0+Y3I1X2RhdGEgJiAweDQwKSAmJiBkYi0+cnhfYXZhaWxfY250ICkKKwkJZG1mZV9yeF9wYWNrZXQoZGV2LCBkYik7CisKKwkvKiByZWFsbG9jYXRlIHJ4IGRlc2NyaXB0b3IgYnVmZmVyICovCisJaWYgKGRiLT5yeF9hdmFpbF9jbnQ8UlhfREVTQ19DTlQpCisJCWFsbG9jYXRlX3J4X2J1ZmZlcihkYik7CisKKwkvKiBGcmVlIHRoZSB0cmFuc21pdHRlZCBkZXNjcmlwdG9yICovCisJaWYgKCBkYi0+Y3I1X2RhdGEgJiAweDAxKQorCQlkbWZlX2ZyZWVfdHhfcGt0KGRldiwgZGIpOworCisJLyogTW9kZSBDaGVjayAqLworCWlmIChkYi0+ZG05MTB4X2Noa19tb2RlICYgMHgyKSB7CisJCWRiLT5kbTkxMHhfY2hrX21vZGUgPSAweDQ7CisJCWRiLT5jcjZfZGF0YSB8PSAweDEwMDsKKwkJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRiLT5pb2FkZHIpOworCX0KKworCS8qIFJlc3RvcmUgQ1I3IHRvIGVuYWJsZSBpbnRlcnJ1cHQgbWFzayAqLworCW91dGwoZGItPmNyN19kYXRhLCBpb2FkZHIgKyBEQ1I3KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyoKKyAqIFBvbGxpbmcgJ2ludGVycnVwdCcgLSB1c2VkIGJ5IHRoaW5ncyBsaWtlIG5ldGNvbnNvbGUgdG8gc2VuZCBza2JzCisgKiB3aXRob3V0IGhhdmluZyB0byByZS1lbmFibGUgaW50ZXJydXB0cy4gSXQncyBub3QgY2FsbGVkIHdoaWxlCisgKiB0aGUgaW50ZXJydXB0IHJvdXRpbmUgaXMgZXhlY3V0aW5nLgorICovCisKK3N0YXRpYyB2b2lkIHBvbGxfZG1mZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBkaXNhYmxlX2lycSBoZXJlIGlzIG5vdCB2ZXJ5IG5pY2UsIGJ1dCB3aXRoIHRoZSBsb2NrbGVzcworCSAgIGludGVycnVwdCBoYW5kbGVyIHdlIGhhdmUgbm8gb3RoZXIgY2hvaWNlLiAqLworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlkbWZlX2ludGVycnVwdCAoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworLyoKKyAqCUZyZWUgVFggcmVzb3VyY2UgYWZ0ZXIgVFggY29tcGxldGUKKyAqLworCitzdGF0aWMgdm9pZCBkbWZlX2ZyZWVfdHhfcGt0KHN0cnVjdCBERVZJQ0UgKmRldiwgc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqIGRiKQoreworCXN0cnVjdCB0eF9kZXNjICp0eHB0cjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXUzMiB0ZGVzMDsKKworCXR4cHRyID0gZGItPnR4X3JlbW92ZV9wdHI7CisJd2hpbGUoZGItPnR4X3BhY2tldF9jbnQpIHsKKwkJdGRlczAgPSBsZTMyX3RvX2NwdSh0eHB0ci0+dGRlczApOworCQkvKiBwcmludGsoRFJWX05BTUUgIjogdGRlczA9JXhcbiIsIHRkZXMwKTsgKi8KKwkJaWYgKHRkZXMwICYgMHg4MDAwMDAwMCkKKwkJCWJyZWFrOworCisJCS8qIEEgcGFja2V0IHNlbnQgY29tcGxldGVkICovCisJCWRiLT50eF9wYWNrZXRfY250LS07CisJCWRiLT5zdGF0cy50eF9wYWNrZXRzKys7CisKKwkJLyogVHJhbnNtaXQgc3RhdGlzdGljIGNvdW50ZXIgKi8KKwkJaWYgKCB0ZGVzMCAhPSAweDdmZmZmZmZmICkgeworCQkJLyogcHJpbnRrKERSVl9OQU1FICI6IHRkZXMwPSV4XG4iLCB0ZGVzMCk7ICovCisJCQlkYi0+c3RhdHMuY29sbGlzaW9ucyArPSAodGRlczAgPj4gMykgJiAweGY7CisJCQlkYi0+c3RhdHMudHhfYnl0ZXMgKz0gbGUzMl90b19jcHUodHhwdHItPnRkZXMxKSAmIDB4N2ZmOworCQkJaWYgKHRkZXMwICYgVERFUzBfRVJSX01BU0spIHsKKwkJCQlkYi0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkJCQlpZiAodGRlczAgJiAweDAwMDIpIHsJLyogVW5kZXJSdW4gKi8KKwkJCQkJZGItPnR4X2ZpZm9fdW5kZXJydW4rKzsKKwkJCQkJaWYgKCAhKGRiLT5jcjZfZGF0YSAmIENSNl9TRlQpICkgeworCQkJCQkJZGItPmNyNl9kYXRhID0gZGItPmNyNl9kYXRhIHwgQ1I2X1NGVDsKKwkJCQkJCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhLCBkYi0+aW9hZGRyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAodGRlczAgJiAweDAxMDApCisJCQkJCWRiLT50eF9leGNlc3NpdmVfY29sbGlzaW9uKys7CisJCQkJaWYgKHRkZXMwICYgMHgwMjAwKQorCQkJCQlkYi0+dHhfbGF0ZV9jb2xsaXNpb24rKzsKKwkJCQlpZiAodGRlczAgJiAweDA0MDApCisJCQkJCWRiLT50eF9ub19jYXJyaWVyKys7CisJCQkJaWYgKHRkZXMwICYgMHgwODAwKQorCQkJCQlkYi0+dHhfbG9zc19jYXJyaWVyKys7CisJCQkJaWYgKHRkZXMwICYgMHg0MDAwKQorCQkJCQlkYi0+dHhfamFiYmVyX3RpbWVvdXQrKzsKKwkJCX0KKwkJfQorCisgICAgCQl0eHB0ciA9IHR4cHRyLT5uZXh0X3R4X2Rlc2M7CisJfS8qIEVuZCBvZiB3aGlsZSAqLworCisJLyogVXBkYXRlIFRYIHJlbW92ZSBwb2ludGVyIHRvIG5leHQgKi8KKwlkYi0+dHhfcmVtb3ZlX3B0ciA9IHR4cHRyOworCisJLyogU2VuZCB0aGUgVHggcGFja2V0IGluIHF1ZXVlICovCisJaWYgKCAoZGItPnR4X3BhY2tldF9jbnQgPCBUWF9NQVhfU0VORF9DTlQpICYmIGRiLT50eF9xdWV1ZV9jbnQgKSB7CisJCXR4cHRyLT50ZGVzMCA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOwkvKiBTZXQgb3duZXIgYml0ICovCisJCWRiLT50eF9wYWNrZXRfY250Kys7CQkJLyogUmVhZHkgdG8gc2VuZCAqLworCQlkYi0+dHhfcXVldWVfY250LS07CisJCW91dGwoMHgxLCBpb2FkZHIgKyBEQ1IxKTsJCS8qIElzc3VlIFR4IHBvbGxpbmcgKi8KKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CQkvKiBzYXZlZCB0aW1lIHN0YW1wICovCisJfQorCisJLyogUmVzb3VyY2UgYXZhaWxhYmxlIGNoZWNrICovCisJaWYgKCBkYi0+dHhfcXVldWVfY250IDwgVFhfV0FLRV9ERVNDX0NOVCApCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsJLyogQWN0aXZlIHVwcGVyIGxheWVyLCBzZW5kIGFnYWluICovCit9CisKKworLyoKKyAqCUNhbGN1bGF0ZSB0aGUgQ1JDIHZhbHVkZSBvZiB0aGUgUnggcGFja2V0CisgKglmbGFnID0gCTEgOiByZXR1cm4gdGhlIHJldmVyc2UgQ1JDIChmb3IgdGhlIHJlY2VpdmVkIHBhY2tldCBDUkMpCisgKgkJMCA6IHJldHVybiB0aGUgbm9ybWFsIENSQyAoZm9yIEhhc2ggVGFibGUgaW5kZXgpCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgY2FsX0NSQyh1bnNpZ25lZCBjaGFyICogRGF0YSwgdW5zaWduZWQgaW50IExlbiwgdTggZmxhZykKK3sKKwl1MzIgY3JjID0gY3JjMzIofjAsIERhdGEsIExlbik7CisJaWYgKGZsYWcpIGNyYyA9IH5jcmM7CisJcmV0dXJuIGNyYzsKK30KKworCisvKgorICoJUmVjZWl2ZSB0aGUgY29tZSBwYWNrZXQgYW5kIHBhc3MgdG8gdXBwZXIgbGF5ZXIKKyAqLworCitzdGF0aWMgdm9pZCBkbWZlX3J4X3BhY2tldChzdHJ1Y3QgREVWSUNFICpkZXYsIHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKiBkYikKK3sKKwlzdHJ1Y3QgcnhfZGVzYyAqcnhwdHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcnhsZW47CisJdTMyIHJkZXMwOworCisJcnhwdHIgPSBkYi0+cnhfcmVhZHlfcHRyOworCisJd2hpbGUoZGItPnJ4X2F2YWlsX2NudCkgeworCQlyZGVzMCA9IGxlMzJfdG9fY3B1KHJ4cHRyLT5yZGVzMCk7CisJCWlmIChyZGVzMCAmIDB4ODAwMDAwMDApCS8qIHBhY2tldCBvd25lciBjaGVjayAqLworCQkJYnJlYWs7CisKKwkJZGItPnJ4X2F2YWlsX2NudC0tOworCQlkYi0+aW50ZXJ2YWxfcnhfY250Kys7CisKKwkJcGNpX3VubWFwX3NpbmdsZShkYi0+cGRldiwgbGUzMl90b19jcHUocnhwdHItPnJkZXMyKSwgUlhfQUxMT0NfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJaWYgKCAocmRlczAgJiAweDMwMCkgIT0gMHgzMDApIHsKKwkJCS8qIEEgcGFja2V0IHdpdGhvdXQgRmlyc3QvTGFzdCBmbGFnICovCisJCQkvKiByZXVzZSB0aGlzIFNLQiAqLworCQkJRE1GRV9EQlVHKDAsICJSZXVzZSBTSyBidWZmZXIsIHJkZXMwIiwgcmRlczApOworCQkJZG1mZV9yZXVzZV9za2IoZGIsIHJ4cHRyLT5yeF9za2JfcHRyKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEEgcGFja2V0IHdpdGggRmlyc3QvTGFzdCBmbGFnICovCisJCQlyeGxlbiA9ICggKHJkZXMwID4+IDE2KSAmIDB4M2ZmZikgLSA0OworCisJCQkvKiBlcnJvciBzdW1tYXJ5IGJpdCBjaGVjayAqLworCQkJaWYgKHJkZXMwICYgMHg4MDAwKSB7CisJCQkJLyogVGhpcyBpcyBhIGVycm9yIHBhY2tldCAqLworCQkJCS8vcHJpbnRrKERSVl9OQU1FICI6IHJkZXMwOiAlbHhcbiIsIHJkZXMwKTsKKwkJCQlkYi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJaWYgKHJkZXMwICYgMSkKKwkJCQkJZGItPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkJaWYgKHJkZXMwICYgMikKKwkJCQkJZGItPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlpZiAocmRlczAgJiAweDgwKQorCQkJCQlkYi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJfQorCisJCQlpZiAoICEocmRlczAgJiAweDgwMDApIHx8CisJCQkJKChkYi0+Y3I2X2RhdGEgJiBDUjZfUE0pICYmIChyeGxlbj42KSkgKSB7CisJCQkJc2tiID0gcnhwdHItPnJ4X3NrYl9wdHI7CisKKwkJCQkvKiBSZWNlaXZlZCBQYWNrZXQgQ1JDIGNoZWNrIG5lZWQgb3Igbm90ICovCisJCQkJaWYgKCAoZGItPmRtOTEweF9jaGtfbW9kZSAmIDEpICYmCisJCQkJCShjYWxfQ1JDKHNrYi0+dGFpbCwgcnhsZW4sIDEpICE9CisJCQkJCSgqKHUzMiAqKSAoc2tiLT50YWlsK3J4bGVuKSApKSkgeyAvKiBGSVhNRSAoPykgKi8KKwkJCQkJLyogRm91bmQgYSBlcnJvciByZWNlaXZlZCBwYWNrZXQgKi8KKwkJCQkJZG1mZV9yZXVzZV9za2IoZGIsIHJ4cHRyLT5yeF9za2JfcHRyKTsKKwkJCQkJZGItPmRtOTEweF9jaGtfbW9kZSA9IDM7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogR29vZCBwYWNrZXQsIHNlbmQgdG8gdXBwZXIgbGF5ZXIgKi8KKwkJCQkJLyogU2hvcnN0IHBhY2tldCB1c2VkIG5ldyBTS0IgKi8KKwkJCQkJaWYgKCAocnhsZW4gPCBSWF9DT1BZX1NJWkUpICYmCisJCQkJCQkoIChza2IgPSBkZXZfYWxsb2Nfc2tiKHJ4bGVuICsgMikgKQorCQkJCQkJIT0gTlVMTCkgKSB7CisJCQkJCQkvKiBzaXplIGxlc3MgdGhhbiBDT1BZX1NJWkUsIGFsbG9jYXRlIGEgcnhsZW4gU0tCICovCisJCQkJCQlza2ItPmRldiA9IGRldjsKKwkJCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIDE2Ynl0ZSBhbGlnbiAqLworCQkJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCByeGxlbiksIHJ4cHRyLT5yeF9za2JfcHRyLT50YWlsLCByeGxlbik7CisJCQkJCQlkbWZlX3JldXNlX3NrYihkYiwgcnhwdHItPnJ4X3NrYl9wdHIpOworCQkJCQl9IGVsc2UgeworCQkJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJCQlza2JfcHV0KHNrYiwgcnhsZW4pOworCQkJCQl9CisJCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJCWRiLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJCWRiLT5zdGF0cy5yeF9ieXRlcyArPSByeGxlbjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIFJldXNlIFNLQiBidWZmZXIgd2hlbiB0aGUgcGFja2V0IGlzIGVycm9yICovCisJCQkJRE1GRV9EQlVHKDAsICJSZXVzZSBTSyBidWZmZXIsIHJkZXMwIiwgcmRlczApOworCQkJCWRtZmVfcmV1c2Vfc2tiKGRiLCByeHB0ci0+cnhfc2tiX3B0cik7CisJCQl9CisJCX0KKworCQlyeHB0ciA9IHJ4cHRyLT5uZXh0X3J4X2Rlc2M7CisJfQorCisJZGItPnJ4X3JlYWR5X3B0ciA9IHJ4cHRyOworfQorCisKKy8qCisgKglHZXQgc3RhdGlzdGljcyBmcm9tIGRyaXZlci4KKyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBkbWZlX2dldF9zdGF0cyhzdHJ1Y3QgREVWSUNFICpkZXYpCit7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJRE1GRV9EQlVHKDAsICJkbWZlX2dldF9zdGF0cyIsIDApOworCXJldHVybiAmZGItPnN0YXRzOworfQorCisKKy8qCisgKiBTZXQgRE05MTBYIG11bHRpY2FzdCBhZGRyZXNzCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9zZXRfZmlsdGVyX21vZGUoc3RydWN0IERFVklDRSAqIGRldikKK3sKKwlzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURNRkVfREJVRygwLCAiZG1mZV9zZXRfZmlsdGVyX21vZGUoKSIsIDApOworCXNwaW5fbG9ja19pcnFzYXZlKCZkYi0+bG9jaywgZmxhZ3MpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlETUZFX0RCVUcoMCwgIkVuYWJsZSBQUk9NIE1vZGUiLCAwKTsKKwkJZGItPmNyNl9kYXRhIHw9IENSNl9QTSB8IENSNl9QQkY7CisJCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhLCBkYi0+aW9hZGRyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJIHx8IGRldi0+bWNfY291bnQgPiBETUZFX01BWF9NVUxUSUNBU1QpIHsKKwkJRE1GRV9EQlVHKDAsICJQYXNzIGFsbCBtdWx0aWNhc3QgYWRkcmVzcyIsIGRldi0+bWNfY291bnQpOworCQlkYi0+Y3I2X2RhdGEgJj0gfihDUjZfUE0gfCBDUjZfUEJGKTsKKwkJZGItPmNyNl9kYXRhIHw9IENSNl9QQU07CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlETUZFX0RCVUcoMCwgIlNldCBtdWx0aWNhc3QgYWRkcmVzcyIsIGRldi0+bWNfY291bnQpOworCWlmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTMyX0lEKQorCQlkbTkxMzJfaWRfdGFibGUoZGV2LCBkZXYtPm1jX2NvdW50KTsJLyogRE05MTMyICovCisJZWxzZQorCQlzZW5kX2ZpbHRlcl9mcmFtZShkZXYsIGRldi0+bWNfY291bnQpOyAJLyogRE05MTAyL0RNOTEwMkEgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCWlmIChucC0+cGRldikKKwkJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGRldikpOworCWVsc2UKKwkJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIkVJU0EgMHglbHggJWQiLAorCQkJZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKK307CisKKy8qCisgKglBIHBlcmlvZGljIHRpbWVyIHJvdXRpbmUKKyAqCUR5bmFtaWMgbWVkaWEgc2Vuc2UsIGFsbG9jYXRlIFJ4IGJ1ZmZlci4uLgorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXUzMiB0bXBfY3I4OworCXVuc2lnbmVkIGNoYXIgdG1wX2NyMTI7CisJc3RydWN0IERFVklDRSAqZGV2ID0gKHN0cnVjdCBERVZJQ0UgKikgZGF0YTsKKwlzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlETUZFX0RCVUcoMCwgImRtZmVfdGltZXIoKSIsIDApOworCXNwaW5fbG9ja19pcnFzYXZlKCZkYi0+bG9jaywgZmxhZ3MpOworCisJLyogTWVkaWEgbW9kZSBwcm9jZXNzIHdoZW4gTGluayBPSyBiZWZvcmUgZW50ZXIgdGhpcyByb3V0ZSAqLworCWlmIChkYi0+Zmlyc3RfaW5fY2FsbGJhY2sgPT0gMCkgeworCQlkYi0+Zmlyc3RfaW5fY2FsbGJhY2sgPSAxOworCQlpZiAoZGItPmNoaXBfdHlwZSAmJiAoZGItPmNoaXBfaWQ9PVBDSV9ETTkxMDJfSUQpKSB7CisJCQlkYi0+Y3I2X2RhdGEgJj0gfjB4NDAwMDA7CisJCQl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSwgZGItPmlvYWRkcik7CisJCQlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAwLCAweDEwMDAsIGRiLT5jaGlwX2lkKTsKKwkJCWRiLT5jcjZfZGF0YSB8PSAweDQwMDAwOworCQkJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRiLT5pb2FkZHIpOworCQkJZGItPnRpbWVyLmV4cGlyZXMgPSBETUZFX1RJTUVSX1dVVCArIEhaICogMjsKKwkJCWFkZF90aW1lcigmZGItPnRpbWVyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKworCS8qIE9wZXJhdGluZyBNb2RlIENoZWNrICovCisJaWYgKCAoZGItPmRtOTEweF9jaGtfbW9kZSAmIDB4MSkgJiYKKwkJKGRiLT5zdGF0cy5yeF9wYWNrZXRzID4gTUFYX0NIRUNLX1BBQ0tFVCkgKQorCQlkYi0+ZG05MTB4X2Noa19tb2RlID0gMHg0OworCisJLyogRHluYW1pYyByZXNldCBETTkxMFggOiBzeXN0ZW0gZXJyb3Igb3IgdHJhbnNtaXQgdGltZS1vdXQgKi8KKwl0bXBfY3I4ID0gaW5sKGRiLT5pb2FkZHIgKyBEQ1I4KTsKKwlpZiAoIChkYi0+aW50ZXJ2YWxfcnhfY250PT0wKSAmJiAodG1wX2NyOCkgKSB7CisJCWRiLT5yZXNldF9jcjgrKzsKKwkJZGItPndhaXRfcmVzZXQgPSAxOworCX0KKwlkYi0+aW50ZXJ2YWxfcnhfY250ID0gMDsKKworCS8qIFRYIHBvbGxpbmcga2ljayBtb25pdG9yICovCisJaWYgKCBkYi0+dHhfcGFja2V0X2NudCAmJgorCSAgICAgdGltZV9hZnRlcihqaWZmaWVzLCBkZXYtPnRyYW5zX3N0YXJ0ICsgRE1GRV9UWF9LSUNLKSApIHsKKwkJb3V0bCgweDEsIGRldi0+YmFzZV9hZGRyICsgRENSMSk7ICAgLyogVHggcG9sbGluZyBhZ2FpbiAqLworCisJCS8qIFRYIFRpbWVvdXQgKi8KKwkJaWYgKCB0aW1lX2FmdGVyKGppZmZpZXMsIGRldi0+dHJhbnNfc3RhcnQgKyBETUZFX1RYX1RJTUVPVVQpICkgeworCQkJZGItPnJlc2V0X1RYdGltZW91dCsrOworCQkJZGItPndhaXRfcmVzZXQgPSAxOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFR4IHRpbWVvdXQgLSByZXNldHRpbmdcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJfQorCX0KKworCWlmIChkYi0+d2FpdF9yZXNldCkgeworCQlETUZFX0RCVUcoMCwgIkR5bmFtaWMgUmVzZXQgZGV2aWNlIiwgZGItPnR4X3BhY2tldF9jbnQpOworCQlkYi0+cmVzZXRfY291bnQrKzsKKwkJZG1mZV9keW5hbWljX3Jlc2V0KGRldik7CisJCWRiLT5maXJzdF9pbl9jYWxsYmFjayA9IDA7CisJCWRiLT50aW1lci5leHBpcmVzID0gRE1GRV9USU1FUl9XVVQ7CisJCWFkZF90aW1lcigmZGItPnRpbWVyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIExpbmsgc3RhdHVzIGNoZWNrLCBEeW5hbWljIG1lZGlhIHR5cGUgY2hhbmdlICovCisJaWYgKGRiLT5jaGlwX2lkID09IFBDSV9ETTkxMzJfSUQpCisJCXRtcF9jcjEyID0gaW5iKGRiLT5pb2FkZHIgKyBEQ1I5ICsgMyk7CS8qIERNOTEzMiAqLworCWVsc2UKKwkJdG1wX2NyMTIgPSBpbmIoZGItPmlvYWRkciArIERDUjEyKTsJLyogRE05MTAyL0RNOTEwMkEgKi8KKworCWlmICggKChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTAyX0lEKSAmJgorCQkoZGItPmNoaXBfcmV2aXNpb24gPT0gMHgwMjAwMDAzMCkpIHx8CisJCSgoZGItPmNoaXBfaWQgPT0gUENJX0RNOTEzMl9JRCkgJiYKKwkJKGRiLT5jaGlwX3JldmlzaW9uID09IDB4MDIwMDAwMTApKSApIHsKKwkJLyogRE05MTAyQSBDaGlwICovCisJCWlmICh0bXBfY3IxMiAmIDIpCisJCQl0bXBfY3IxMiA9IDB4MDsJCS8qIExpbmsgZmFpbGVkICovCisJCWVsc2UKKwkJCXRtcF9jcjEyID0gMHgzOwkvKiBMaW5rIE9LICovCisJfQorCisJaWYgKCAhKHRtcF9jcjEyICYgMHgzKSAmJiAhZGItPmxpbmtfZmFpbGVkICkgeworCQkvKiBMaW5rIEZhaWxlZCAqLworCQlETUZFX0RCVUcoMCwgIkxpbmsgRmFpbGVkIiwgdG1wX2NyMTIpOworCQlkYi0+bGlua19mYWlsZWQgPSAxOworCisJCS8qIEZvciBGb3JjZSAxMC8xMDBNIEhhbGYvRnVsbCBtb2RlOiBFbmFibGUgQXV0by1OZWdvIG1vZGUgKi8KKwkJLyogQVVUTyBvciBmb3JjZSAxTSBIb21lcnVuL0xvbmdydW4gZG9uJ3QgbmVlZCAqLworCQlpZiAoICEoZGItPm1lZGlhX21vZGUgJiAweDM4KSApCisJCQlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAwLCAweDEwMDAsIGRiLT5jaGlwX2lkKTsKKworCQkvKiBBVVRPIG1vZGUsIGlmIElOVCBwaHl4Y2VyIGxpbmsgZmFpbGVkLCBzZWxlY3QgRVhUIGRldmljZSAqLworCQlpZiAoZGItPm1lZGlhX21vZGUgJiBETUZFX0FVVE8pIHsKKwkJCS8qIDEwLzEwME0gbGluayBmYWlsZWQsIHVzZWQgMU0gSG9tZS1OZXQgKi8KKwkJCWRiLT5jcjZfZGF0YXw9MHgwMDA0MDAwMDsJLyogYml0MTg9MSwgTUlJICovCisJCQlkYi0+Y3I2X2RhdGEmPX4weDAwMDAwMjAwOwkvKiBiaXQ5PTAsIEhEIG1vZGUgKi8KKwkJCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhLCBkYi0+aW9hZGRyKTsKKwkJfQorCX0gZWxzZQorCQlpZiAoKHRtcF9jcjEyICYgMHgzKSAmJiBkYi0+bGlua19mYWlsZWQpIHsKKwkJCURNRkVfREJVRygwLCAiTGluayBsaW5rIE9LIiwgdG1wX2NyMTIpOworCQkJZGItPmxpbmtfZmFpbGVkID0gMDsKKworCQkJLyogQXV0byBTZW5zZSBTcGVlZCAqLworCQkJaWYgKCAoZGItPm1lZGlhX21vZGUgJiBETUZFX0FVVE8pICYmCisJCQkJZG1mZV9zZW5zZV9zcGVlZChkYikgKQorCQkJCWRiLT5saW5rX2ZhaWxlZCA9IDE7CisJCQlkbWZlX3Byb2Nlc3NfbW9kZShkYik7CisJCQkvKiBTSE9XX01FRElBX1RZUEUoZGItPm9wX21vZGUpOyAqLworCQl9CisKKwkvKiBIUE5BIHJlbW90ZSBjb21tYW5kIGNoZWNrICovCisJaWYgKGRiLT5IUE5BX2NvbW1hbmQgJiAweGYwMCkgeworCQlkYi0+SFBOQV90aW1lci0tOworCQlpZiAoIWRiLT5IUE5BX3RpbWVyKQorCQkJZG1mZV9IUE5BX3JlbW90ZV9jbWRfY2hrKGRiKTsKKwl9CisKKwkvKiBUaW1lciBhY3RpdmUgYWdhaW4gKi8KKwlkYi0+dGltZXIuZXhwaXJlcyA9IERNRkVfVElNRVJfV1VUOworCWFkZF90aW1lcigmZGItPnRpbWVyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworfQorCisKKy8qCisgKglEeW5hbWljIHJlc2V0IHRoZSBETTkxMFggYm9hcmQKKyAqCVN0b3AgRE05MTBYIGJvYXJkCisgKglGcmVlIFR4L1J4IGFsbG9jYXRlZCBtZW1vcnkKKyAqCVJlc2V0IERNOTEwWCBib2FyZAorICoJUmUtaW5pdGlsaXplIERNOTEwWCBib2FyZAorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfZHluYW1pY19yZXNldChzdHJ1Y3QgREVWSUNFICpkZXYpCit7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJRE1GRV9EQlVHKDAsICJkbWZlX2R5bmFtaWNfcmVzZXQoKSIsIDApOworCisJLyogU29wdCBNQUMgY29udHJvbGxlciAqLworCWRiLT5jcjZfZGF0YSAmPSB+KENSNl9SWFNDIHwgQ1I2X1RYU0MpOwkvKiBEaXNhYmxlIFR4L1J4ICovCisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRldi0+YmFzZV9hZGRyKTsKKwlvdXRsKDAsIGRldi0+YmFzZV9hZGRyICsgRENSNyk7CQkvKiBEaXNhYmxlIEludGVycnVwdCAqLworCW91dGwoaW5sKGRldi0+YmFzZV9hZGRyICsgRENSNSksIGRldi0+YmFzZV9hZGRyICsgRENSNSk7CisKKwkvKiBEaXNhYmxlIHVwcGVyIGxheWVyIGludGVyZmFjZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIEZyZWUgUnggQWxsb2NhdGUgYnVmZmVyICovCisJZG1mZV9mcmVlX3J4YnVmZmVyKGRiKTsKKworCS8qIHN5c3RlbSB2YXJpYWJsZSBpbml0ICovCisJZGItPnR4X3BhY2tldF9jbnQgPSAwOworCWRiLT50eF9xdWV1ZV9jbnQgPSAwOworCWRiLT5yeF9hdmFpbF9jbnQgPSAwOworCWRiLT5saW5rX2ZhaWxlZCA9IDE7CisJZGItPndhaXRfcmVzZXQgPSAwOworCisJLyogUmUtaW5pdGlsaXplIERNOTEwWCBib2FyZCAqLworCWRtZmVfaW5pdF9kbTkxMHgoZGV2KTsKKworCS8qIFJlc3RhcnQgdXBwZXIgbGF5ZXIgaW50ZXJmYWNlICovCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisKKy8qCisgKglmcmVlIGFsbCBhbGxvY2F0ZWQgcnggYnVmZmVyCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9mcmVlX3J4YnVmZmVyKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKiBkYikKK3sKKwlETUZFX0RCVUcoMCwgImRtZmVfZnJlZV9yeGJ1ZmZlcigpIiwgMCk7CisKKwkvKiBmcmVlIGFsbG9jYXRlZCByeCBidWZmZXIgKi8KKwl3aGlsZSAoZGItPnJ4X2F2YWlsX2NudCkgeworCQlkZXZfa2ZyZWVfc2tiKGRiLT5yeF9yZWFkeV9wdHItPnJ4X3NrYl9wdHIpOworCQlkYi0+cnhfcmVhZHlfcHRyID0gZGItPnJ4X3JlYWR5X3B0ci0+bmV4dF9yeF9kZXNjOworCQlkYi0+cnhfYXZhaWxfY250LS07CisJfQorfQorCisKKy8qCisgKglSZXVzZSB0aGUgU0sgYnVmZmVyCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9yZXVzZV9za2Ioc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIsIHN0cnVjdCBza19idWZmICogc2tiKQoreworCXN0cnVjdCByeF9kZXNjICpyeHB0ciA9IGRiLT5yeF9pbnNlcnRfcHRyOworCisJaWYgKCEocnhwdHItPnJkZXMwICYgY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCkpKSB7CisJCXJ4cHRyLT5yeF9za2JfcHRyID0gc2tiOworCQlyeHB0ci0+cmRlczIgPSBjcHVfdG9fbGUzMiggcGNpX21hcF9zaW5nbGUoZGItPnBkZXYsIHNrYi0+dGFpbCwgUlhfQUxMT0NfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKSApOworCQl3bWIoKTsKKwkJcnhwdHItPnJkZXMwID0gY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCk7CisJCWRiLT5yeF9hdmFpbF9jbnQrKzsKKwkJZGItPnJ4X2luc2VydF9wdHIgPSByeHB0ci0+bmV4dF9yeF9kZXNjOworCX0gZWxzZQorCQlETUZFX0RCVUcoMCwgIlNLIEJ1ZmZlciByZXVzZSBtZXRob2QgZXJyb3IiLCBkYi0+cnhfYXZhaWxfY250KTsKK30KKworCisvKgorICoJSW5pdGlhbGl6ZSB0cmFuc21pdC9SZWNlaXZlIGRlc2NyaXB0b3IKKyAqCVVzaW5nIENoYWluIHN0cnVjdHVyZSwgYW5kIGFsbG9jYXRlIFR4L1J4IGJ1ZmZlcgorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfZGVzY3JpcHRvcl9pbml0KHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiLCB1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwlzdHJ1Y3QgdHhfZGVzYyAqdG1wX3R4OworCXN0cnVjdCByeF9kZXNjICp0bXBfcng7CisJdW5zaWduZWQgY2hhciAqdG1wX2J1ZjsKKwlkbWFfYWRkcl90IHRtcF90eF9kbWEsIHRtcF9yeF9kbWE7CisJZG1hX2FkZHJfdCB0bXBfYnVmX2RtYTsKKwlpbnQgaTsKKworCURNRkVfREJVRygwLCAiZG1mZV9kZXNjcmlwdG9yX2luaXQoKSIsIDApOworCisJLyogdHggZGVzY3JpcHRvciBzdGFydCBwb2ludGVyICovCisJZGItPnR4X2luc2VydF9wdHIgPSBkYi0+Zmlyc3RfdHhfZGVzYzsKKwlkYi0+dHhfcmVtb3ZlX3B0ciA9IGRiLT5maXJzdF90eF9kZXNjOworCW91dGwoZGItPmZpcnN0X3R4X2Rlc2NfZG1hLCBpb2FkZHIgKyBEQ1I0KTsgICAgIC8qIFRYIERFU0MgYWRkcmVzcyAqLworCisJLyogcnggZGVzY3JpcHRvciBzdGFydCBwb2ludGVyICovCisJZGItPmZpcnN0X3J4X2Rlc2MgPSAodm9pZCAqKWRiLT5maXJzdF90eF9kZXNjICsgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIFRYX0RFU0NfQ05UOworCWRiLT5maXJzdF9yeF9kZXNjX2RtYSA9ICBkYi0+Zmlyc3RfdHhfZGVzY19kbWEgKyBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogVFhfREVTQ19DTlQ7CisJZGItPnJ4X2luc2VydF9wdHIgPSBkYi0+Zmlyc3RfcnhfZGVzYzsKKwlkYi0+cnhfcmVhZHlfcHRyID0gZGItPmZpcnN0X3J4X2Rlc2M7CisJb3V0bChkYi0+Zmlyc3RfcnhfZGVzY19kbWEsIGlvYWRkciArIERDUjMpOwkvKiBSWCBERVNDIGFkZHJlc3MgKi8KKworCS8qIEluaXQgVHJhbnNtaXQgY2hhaW4gKi8KKwl0bXBfYnVmID0gZGItPmJ1Zl9wb29sX3N0YXJ0OworCXRtcF9idWZfZG1hID0gZGItPmJ1Zl9wb29sX2RtYV9zdGFydDsKKwl0bXBfdHhfZG1hID0gZGItPmZpcnN0X3R4X2Rlc2NfZG1hOworCWZvciAodG1wX3R4ID0gZGItPmZpcnN0X3R4X2Rlc2MsIGkgPSAwOyBpIDwgVFhfREVTQ19DTlQ7IGkrKywgdG1wX3R4KyspIHsKKwkJdG1wX3R4LT50eF9idWZfcHRyID0gdG1wX2J1ZjsKKwkJdG1wX3R4LT50ZGVzMCA9IGNwdV90b19sZTMyKDApOworCQl0bXBfdHgtPnRkZXMxID0gY3B1X3RvX2xlMzIoMHg4MTAwMDAwMCk7CS8qIElDLCBjaGFpbiAqLworCQl0bXBfdHgtPnRkZXMyID0gY3B1X3RvX2xlMzIodG1wX2J1Zl9kbWEpOworCQl0bXBfdHhfZG1hICs9IHNpemVvZihzdHJ1Y3QgdHhfZGVzYyk7CisJCXRtcF90eC0+dGRlczMgPSBjcHVfdG9fbGUzMih0bXBfdHhfZG1hKTsKKwkJdG1wX3R4LT5uZXh0X3R4X2Rlc2MgPSB0bXBfdHggKyAxOworCQl0bXBfYnVmID0gdG1wX2J1ZiArIFRYX0JVRl9BTExPQzsKKwkJdG1wX2J1Zl9kbWEgPSB0bXBfYnVmX2RtYSArIFRYX0JVRl9BTExPQzsKKwl9CisJKC0tdG1wX3R4KS0+dGRlczMgPSBjcHVfdG9fbGUzMihkYi0+Zmlyc3RfdHhfZGVzY19kbWEpOworCXRtcF90eC0+bmV4dF90eF9kZXNjID0gZGItPmZpcnN0X3R4X2Rlc2M7CisKKwkgLyogSW5pdCBSZWNlaXZlIGRlc2NyaXB0b3IgY2hhaW4gKi8KKwl0bXBfcnhfZG1hPWRiLT5maXJzdF9yeF9kZXNjX2RtYTsKKwlmb3IgKHRtcF9yeCA9IGRiLT5maXJzdF9yeF9kZXNjLCBpID0gMDsgaSA8IFJYX0RFU0NfQ05UOyBpKyssIHRtcF9yeCsrKSB7CisJCXRtcF9yeC0+cmRlczAgPSBjcHVfdG9fbGUzMigwKTsKKwkJdG1wX3J4LT5yZGVzMSA9IGNwdV90b19sZTMyKDB4MDEwMDA2MDApOworCQl0bXBfcnhfZG1hICs9IHNpemVvZihzdHJ1Y3QgcnhfZGVzYyk7CisJCXRtcF9yeC0+cmRlczMgPSBjcHVfdG9fbGUzMih0bXBfcnhfZG1hKTsKKwkJdG1wX3J4LT5uZXh0X3J4X2Rlc2MgPSB0bXBfcnggKyAxOworCX0KKwkoLS10bXBfcngpLT5yZGVzMyA9IGNwdV90b19sZTMyKGRiLT5maXJzdF9yeF9kZXNjX2RtYSk7CisJdG1wX3J4LT5uZXh0X3J4X2Rlc2MgPSBkYi0+Zmlyc3RfcnhfZGVzYzsKKworCS8qIHByZS1hbGxvY2F0ZSBSeCBidWZmZXIgKi8KKwlhbGxvY2F0ZV9yeF9idWZmZXIoZGIpOworfQorCisKKy8qCisgKglVcGRhdGUgQ1I2IHZhbHVlCisgKglGaXJzdGx5IHN0b3AgRE05MTBYICwgdGhlbiB3cml0dGVuIHZhbHVlIGFuZCBzdGFydAorICovCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9jcjYodTMyIGNyNl9kYXRhLCB1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwl1MzIgY3I2X3RtcDsKKworCWNyNl90bXAgPSBjcjZfZGF0YSAmIH4weDIwMDI7ICAgICAgICAgICAvKiBzdG9wIFR4L1J4ICovCisJb3V0bChjcjZfdG1wLCBpb2FkZHIgKyBEQ1I2KTsKKwl1ZGVsYXkoNSk7CisJb3V0bChjcjZfZGF0YSwgaW9hZGRyICsgRENSNik7CisJdWRlbGF5KDUpOworfQorCisKKy8qCisgKglTZW5kIGEgc2V0dXAgZnJhbWUgZm9yIERNOTEzMgorICoJVGhpcyBzZXR1cCBmcmFtZSBpbml0aWxpemUgRE05MTBYIGFkZHJlc3MgZmlsdGVyIG1vZGUKKyovCisKK3N0YXRpYyB2b2lkIGRtOTEzMl9pZF90YWJsZShzdHJ1Y3QgREVWSUNFICpkZXYsIGludCBtY19jbnQpCit7CisJc3RydWN0IGRldl9tY19saXN0ICptY3B0cjsKKwl1MTYgKiBhZGRycHRyOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIrMHhjMDsJCS8qIElEIFRhYmxlICovCisJdTMyIGhhc2hfdmFsOworCXUxNiBpLCBoYXNoX3RhYmxlWzRdOworCisJRE1GRV9EQlVHKDAsICJkbTkxMzJfaWRfdGFibGUoKSIsIDApOworCisJLyogTm9kZSBhZGRyZXNzICovCisJYWRkcnB0ciA9ICh1MTYgKikgZGV2LT5kZXZfYWRkcjsKKwlvdXR3KGFkZHJwdHJbMF0sIGlvYWRkcik7CisJaW9hZGRyICs9IDQ7CisJb3V0dyhhZGRycHRyWzFdLCBpb2FkZHIpOworCWlvYWRkciArPSA0OworCW91dHcoYWRkcnB0clsyXSwgaW9hZGRyKTsKKwlpb2FkZHIgKz0gNDsKKworCS8qIENsZWFyIEhhc2ggVGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQloYXNoX3RhYmxlW2ldID0gMHgwOworCisJLyogYnJvYWRjYXN0IGFkZHJlc3MgKi8KKwloYXNoX3RhYmxlWzNdID0gMHg4MDAwOworCisJLyogdGhlIG11bHRpY2FzdCBhZGRyZXNzIGluIEhhc2ggVGFibGUgOiA2NCBiaXRzICovCisJZm9yIChtY3B0ciA9IGRldi0+bWNfbGlzdCwgaSA9IDA7IGkgPCBtY19jbnQ7IGkrKywgbWNwdHIgPSBtY3B0ci0+bmV4dCkgeworCQloYXNoX3ZhbCA9IGNhbF9DUkMoIChjaGFyICopIG1jcHRyLT5kbWlfYWRkciwgNiwgMCkgJiAweDNmOworCQloYXNoX3RhYmxlW2hhc2hfdmFsIC8gMTZdIHw9ICh1MTYpIDEgPDwgKGhhc2hfdmFsICUgMTYpOworCX0KKworCS8qIFdyaXRlIHRoZSBoYXNoIHRhYmxlIHRvIE1BQyBNRCB0YWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGlvYWRkciArPSA0KQorCQlvdXR3KGhhc2hfdGFibGVbaV0sIGlvYWRkcik7Cit9CisKKworLyoKKyAqCVNlbmQgYSBzZXR1cCBmcmFtZSBmb3IgRE05MTAyL0RNOTEwMkEKKyAqCVRoaXMgc2V0dXAgZnJhbWUgaW5pdGlsaXplIERNOTEwWCBhZGRyZXNzIGZpbHRlciBtb2RlCisgKi8KKworc3RhdGljIHZvaWQgc2VuZF9maWx0ZXJfZnJhbWUoc3RydWN0IERFVklDRSAqZGV2LCBpbnQgbWNfY250KQoreworCXN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jcHRyOworCXN0cnVjdCB0eF9kZXNjICp0eHB0cjsKKwl1MTYgKiBhZGRycHRyOworCXUzMiAqIHN1cHRyOworCWludCBpOworCisJRE1GRV9EQlVHKDAsICJzZW5kX2ZpbHRlcl9mcmFtZSgpIiwgMCk7CisKKwl0eHB0ciA9IGRiLT50eF9pbnNlcnRfcHRyOworCXN1cHRyID0gKHUzMiAqKSB0eHB0ci0+dHhfYnVmX3B0cjsKKworCS8qIE5vZGUgYWRkcmVzcyAqLworCWFkZHJwdHIgPSAodTE2ICopIGRldi0+ZGV2X2FkZHI7CisJKnN1cHRyKysgPSBhZGRycHRyWzBdOworCSpzdXB0cisrID0gYWRkcnB0clsxXTsKKwkqc3VwdHIrKyA9IGFkZHJwdHJbMl07CisKKwkvKiBicm9hZGNhc3QgYWRkcmVzcyAqLworCSpzdXB0cisrID0gMHhmZmZmOworCSpzdXB0cisrID0gMHhmZmZmOworCSpzdXB0cisrID0gMHhmZmZmOworCisJLyogZml0IHRoZSBtdWx0aWNhc3QgYWRkcmVzcyAqLworCWZvciAobWNwdHIgPSBkZXYtPm1jX2xpc3QsIGkgPSAwOyBpIDwgbWNfY250OyBpKyssIG1jcHRyID0gbWNwdHItPm5leHQpIHsKKwkJYWRkcnB0ciA9ICh1MTYgKikgbWNwdHItPmRtaV9hZGRyOworCQkqc3VwdHIrKyA9IGFkZHJwdHJbMF07CisJCSpzdXB0cisrID0gYWRkcnB0clsxXTsKKwkJKnN1cHRyKysgPSBhZGRycHRyWzJdOworCX0KKworCWZvciAoOyBpPDE0OyBpKyspIHsKKwkJKnN1cHRyKysgPSAweGZmZmY7CisJCSpzdXB0cisrID0gMHhmZmZmOworCQkqc3VwdHIrKyA9IDB4ZmZmZjsKKwl9CisKKwkvKiBwcmVwYXJlIHRoZSBzZXR1cCBmcmFtZSAqLworCWRiLT50eF9pbnNlcnRfcHRyID0gdHhwdHItPm5leHRfdHhfZGVzYzsKKwl0eHB0ci0+dGRlczEgPSBjcHVfdG9fbGUzMigweDg5MDAwMGMwKTsKKworCS8qIFJlc291cmNlIENoZWNrIGFuZCBTZW5kIHRoZSBzZXR1cCBwYWNrZXQgKi8KKwlpZiAoIWRiLT50eF9wYWNrZXRfY250KSB7CisJCS8qIFJlc291cmNlIEVtcHR5ICovCisJCWRiLT50eF9wYWNrZXRfY250Kys7CisJCXR4cHRyLT50ZGVzMCA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOworCQl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSB8IDB4MjAwMCwgZGV2LT5iYXNlX2FkZHIpOworCQlvdXRsKDB4MSwgZGV2LT5iYXNlX2FkZHIgKyBEQ1IxKTsJLyogSXNzdWUgVHggcG9sbGluZyAqLworCQl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSwgZGV2LT5iYXNlX2FkZHIpOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwl9IGVsc2UKKwkJZGItPnR4X3F1ZXVlX2NudCsrOwkvKiBQdXQgaW4gVFggcXVldWUgKi8KK30KKworCisvKgorICoJQWxsb2NhdGUgcnggYnVmZmVyLAorICoJQXMgcG9zc2libGUgYXMgYWxsb2NhdGUgbWF4aXVtbiBSeCBidWZmZXIKKyAqLworCitzdGF0aWMgdm9pZCBhbGxvY2F0ZV9yeF9idWZmZXIoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIpCit7CisJc3RydWN0IHJ4X2Rlc2MgKnJ4cHRyOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlyeHB0ciA9IGRiLT5yeF9pbnNlcnRfcHRyOworCisJd2hpbGUoZGItPnJ4X2F2YWlsX2NudCA8IFJYX0RFU0NfQ05UKSB7CisJCWlmICggKCBza2IgPSBkZXZfYWxsb2Nfc2tiKFJYX0FMTE9DX1NJWkUpICkgPT0gTlVMTCApCisJCQlicmVhazsKKwkJcnhwdHItPnJ4X3NrYl9wdHIgPSBza2I7IC8qIEZJWE1FICg/KSAqLworCQlyeHB0ci0+cmRlczIgPSBjcHVfdG9fbGUzMiggcGNpX21hcF9zaW5nbGUoZGItPnBkZXYsIHNrYi0+dGFpbCwgUlhfQUxMT0NfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKSApOworCQl3bWIoKTsKKwkJcnhwdHItPnJkZXMwID0gY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCk7CisJCXJ4cHRyID0gcnhwdHItPm5leHRfcnhfZGVzYzsKKwkJZGItPnJ4X2F2YWlsX2NudCsrOworCX0KKworCWRiLT5yeF9pbnNlcnRfcHRyID0gcnhwdHI7Cit9CisKKworLyoKKyAqCVJlYWQgb25lIHdvcmQgZGF0YSBmcm9tIHRoZSBzZXJpYWwgUk9NCisgKi8KKworc3RhdGljIHUxNiByZWFkX3Nyb21fd29yZChsb25nIGlvYWRkciwgaW50IG9mZnNldCkKK3sKKwlpbnQgaTsKKwl1MTYgc3JvbV9kYXRhID0gMDsKKwlsb25nIGNyOV9pb2FkZHIgPSBpb2FkZHIgKyBEQ1I5OworCisJb3V0bChDUjlfU1JPTV9SRUFELCBjcjlfaW9hZGRyKTsKKwlvdXRsKENSOV9TUk9NX1JFQUQgfCBDUjlfU1JDUywgY3I5X2lvYWRkcik7CisKKwkvKiBTZW5kIHRoZSBSZWFkIENvbW1hbmQgMTEwYiAqLworCVNST01fQ0xLX1dSSVRFKFNST01fREFUQV8xLCBjcjlfaW9hZGRyKTsKKwlTUk9NX0NMS19XUklURShTUk9NX0RBVEFfMSwgY3I5X2lvYWRkcik7CisJU1JPTV9DTEtfV1JJVEUoU1JPTV9EQVRBXzAsIGNyOV9pb2FkZHIpOworCisJLyogU2VuZCB0aGUgb2Zmc2V0ICovCisJZm9yIChpID0gNTsgaSA+PSAwOyBpLS0pIHsKKwkJc3JvbV9kYXRhID0gKG9mZnNldCAmICgxIDw8IGkpKSA/IFNST01fREFUQV8xIDogU1JPTV9EQVRBXzA7CisJCVNST01fQ0xLX1dSSVRFKHNyb21fZGF0YSwgY3I5X2lvYWRkcik7CisJfQorCisJb3V0bChDUjlfU1JPTV9SRUFEIHwgQ1I5X1NSQ1MsIGNyOV9pb2FkZHIpOworCisJZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwkJb3V0bChDUjlfU1JPTV9SRUFEIHwgQ1I5X1NSQ1MgfCBDUjlfU1JDTEssIGNyOV9pb2FkZHIpOworCQl1ZGVsYXkoNSk7CisJCXNyb21fZGF0YSA9IChzcm9tX2RhdGEgPDwgMSkgfCAoKGlubChjcjlfaW9hZGRyKSAmIENSOV9DUkRPVVQpID8gMSA6IDApOworCQlvdXRsKENSOV9TUk9NX1JFQUQgfCBDUjlfU1JDUywgY3I5X2lvYWRkcik7CisJCXVkZWxheSg1KTsKKwl9CisKKwlvdXRsKENSOV9TUk9NX1JFQUQsIGNyOV9pb2FkZHIpOworCXJldHVybiBzcm9tX2RhdGE7Cit9CisKKworLyoKKyAqCUF1dG8gc2Vuc2UgdGhlIG1lZGlhIG1vZGUKKyAqLworCitzdGF0aWMgdTggZG1mZV9zZW5zZV9zcGVlZChzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICogZGIpCit7CisJdTggRXJyRmxhZyA9IDA7CisJdTE2IHBoeV9tb2RlOworCisJLyogQ1I2IGJpdDE4PTAsIHNlbGVjdCAxMC8xMDBNICovCisJdXBkYXRlX2NyNiggKGRiLT5jcjZfZGF0YSAmIH4weDQwMDAwKSwgZGItPmlvYWRkcik7CisKKwlwaHlfbW9kZSA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMSwgZGItPmNoaXBfaWQpOworCXBoeV9tb2RlID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxLCBkYi0+Y2hpcF9pZCk7CisKKwlpZiAoIChwaHlfbW9kZSAmIDB4MjQpID09IDB4MjQgKSB7CisJCWlmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTMyX0lEKQkvKiBETTkxMzIgKi8KKwkJCXBoeV9tb2RlID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCA3LCBkYi0+Y2hpcF9pZCkgJiAweGYwMDA7CisJCWVsc2UgCQkJCS8qIERNOTEwMi9ETTkxMDJBICovCisJCQlwaHlfbW9kZSA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMTcsIGRiLT5jaGlwX2lkKSAmIDB4ZjAwMDsKKwkJLyogcHJpbnRrKERSVl9OQU1FICI6IFBoeV9tb2RlICV4ICIscGh5X21vZGUpOyAqLworCQlzd2l0Y2ggKHBoeV9tb2RlKSB7CisJCWNhc2UgMHgxMDAwOiBkYi0+b3BfbW9kZSA9IERNRkVfMTBNSEY7IGJyZWFrOworCQljYXNlIDB4MjAwMDogZGItPm9wX21vZGUgPSBETUZFXzEwTUZEOyBicmVhazsKKwkJY2FzZSAweDQwMDA6IGRiLT5vcF9tb2RlID0gRE1GRV8xMDBNSEY7IGJyZWFrOworCQljYXNlIDB4ODAwMDogZGItPm9wX21vZGUgPSBETUZFXzEwME1GRDsgYnJlYWs7CisJCWRlZmF1bHQ6IGRiLT5vcF9tb2RlID0gRE1GRV8xME1IRjsKKwkJCUVyckZsYWcgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlkYi0+b3BfbW9kZSA9IERNRkVfMTBNSEY7CisJCURNRkVfREJVRygwLCAiTGluayBGYWlsZWQgOiIsIHBoeV9tb2RlKTsKKwkJRXJyRmxhZyA9IDE7CisJfQorCisJcmV0dXJuIEVyckZsYWc7Cit9CisKKworLyoKKyAqCVNldCAxMC8xMDAgcGh5eGNlciBjYXBhYmlsaXR5CisgKglBVVRPIG1vZGUgOiBwaHl4Y2VyIHJlZ2lzdGVyNCBpcyBOSUMgY2FwYWJpbGl0eQorICoJRm9yY2UgbW9kZTogcGh5eGNlciByZWdpc3RlcjQgaXMgdGhlIGZvcmNlIG1lZGlhCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9zZXRfcGh5eGNlcihzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYikKK3sKKwl1MTYgcGh5X3JlZzsKKworCS8qIFNlbGVjdCAxMC8xMDBNIHBoeXhjZXIgKi8KKwlkYi0+Y3I2X2RhdGEgJj0gfjB4NDAwMDA7CisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRiLT5pb2FkZHIpOworCisJLyogRE05MDA5IENoaXA6IFBoeXhjZXIgcmVnMTggYml0MTI9MCAqLworCWlmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MDA5X0lEKSB7CisJCXBoeV9yZWcgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDE4LCBkYi0+Y2hpcF9pZCkgJiB+MHgxMDAwOworCQlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxOCwgcGh5X3JlZywgZGItPmNoaXBfaWQpOworCX0KKworCS8qIFBoeXhjZXIgY2FwYWJpbGl0eSBzZXR0aW5nICovCisJcGh5X3JlZyA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgNCwgZGItPmNoaXBfaWQpICYgfjB4MDFlMDsKKworCWlmIChkYi0+bWVkaWFfbW9kZSAmIERNRkVfQVVUTykgeworCQkvKiBBVVRPIE1vZGUgKi8KKwkJcGh5X3JlZyB8PSBkYi0+UEhZX3JlZzQ7CisJfSBlbHNlIHsKKwkJLyogRm9yY2UgTW9kZSAqLworCQlzd2l0Y2goZGItPm1lZGlhX21vZGUpIHsKKwkJY2FzZSBETUZFXzEwTUhGOiBwaHlfcmVnIHw9IDB4MjA7IGJyZWFrOworCQljYXNlIERNRkVfMTBNRkQ6IHBoeV9yZWcgfD0gMHg0MDsgYnJlYWs7CisJCWNhc2UgRE1GRV8xMDBNSEY6IHBoeV9yZWcgfD0gMHg4MDsgYnJlYWs7CisJCWNhc2UgRE1GRV8xMDBNRkQ6IHBoeV9yZWcgfD0gMHgxMDA7IGJyZWFrOworCQl9CisJCWlmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MDA5X0lEKSBwaHlfcmVnICY9IDB4NjE7CisJfQorCisgIAkvKiBXcml0ZSBuZXcgY2FwYWJpbGl0eSB0byBQaHl4Y2VyIFJlZzQgKi8KKwlpZiAoICEocGh5X3JlZyAmIDB4MDFlMCkpIHsKKwkJcGh5X3JlZ3w9ZGItPlBIWV9yZWc0OworCQlkYi0+bWVkaWFfbW9kZXw9RE1GRV9BVVRPOworCX0KKwlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCA0LCBwaHlfcmVnLCBkYi0+Y2hpcF9pZCk7CisKKyAJLyogUmVzdGFydCBBdXRvLU5lZ290aWF0aW9uICovCisJaWYgKCBkYi0+Y2hpcF90eXBlICYmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTAyX0lEKSApCisJCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDAsIDB4MTgwMCwgZGItPmNoaXBfaWQpOworCWlmICggIWRiLT5jaGlwX3R5cGUgKQorCQlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAwLCAweDEyMDAsIGRiLT5jaGlwX2lkKTsKK30KKworCisvKgorICoJUHJvY2VzcyBvcC1tb2RlCisgKglBVVRPIG1vZGUgOiBQSFkgY29udHJvbGxlciBpbiBBdXRvLW5lZ290aWF0aW9uIE1vZGUKKyAqCUZvcmNlIG1vZGU6IFBIWSBjb250cm9sbGVyIGluIGZvcmNlIG1vZGUgd2l0aCBIVUIKKyAqCQkJTi13YXkgZm9yY2UgY2FwYWJpbGl0eSB3aXRoIFNXSVRDSAorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfcHJvY2Vzc19tb2RlKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiKQoreworCXUxNiBwaHlfcmVnOworCisJLyogRnVsbCBEdXBsZXggTW9kZSBDaGVjayAqLworCWlmIChkYi0+b3BfbW9kZSAmIDB4NCkKKwkJZGItPmNyNl9kYXRhIHw9IENSNl9GRE07CS8qIFNldCBGdWxsIER1cGxleCBCaXQgKi8KKwllbHNlCisJCWRiLT5jcjZfZGF0YSAmPSB+Q1I2X0ZETTsJLyogQ2xlYXIgRnVsbCBEdXBsZXggQml0ICovCisKKwkvKiBUcmFuc2NpdmVyIFNlbGVjdGlvbiAqLworCWlmIChkYi0+b3BfbW9kZSAmIDB4MTApCQkvKiAxTSBIb21lUE5BICovCisJCWRiLT5jcjZfZGF0YSB8PSAweDQwMDAwOy8qIEV4dGVybmFsIE1JSSBzZWxlY3QgKi8KKwllbHNlCisJCWRiLT5jcjZfZGF0YSAmPSB+MHg0MDAwMDsvKiBJbnRlcm5hbCAxMC8xMDAgdHJhbnNjaXZlciAqLworCisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRiLT5pb2FkZHIpOworCisJLyogMTAvMTAwTSBwaHl4Y2VyIGZvcmNlIG1vZGUgbmVlZCAqLworCWlmICggIShkYi0+bWVkaWFfbW9kZSAmIDB4MTgpKSB7CisJCS8qIEZvcmVjZSBNb2RlICovCisJCXBoeV9yZWcgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDYsIGRiLT5jaGlwX2lkKTsKKwkJaWYgKCAhKHBoeV9yZWcgJiAweDEpICkgeworCQkJLyogcGFydGVyIHdpdGhvdXQgTi1XYXkgY2FwYWJpbGl0eSAqLworCQkJcGh5X3JlZyA9IDB4MDsKKwkJCXN3aXRjaChkYi0+b3BfbW9kZSkgeworCQkJY2FzZSBETUZFXzEwTUhGOiBwaHlfcmVnID0gMHgwOyBicmVhazsKKwkJCWNhc2UgRE1GRV8xME1GRDogcGh5X3JlZyA9IDB4MTAwOyBicmVhazsKKwkJCWNhc2UgRE1GRV8xMDBNSEY6IHBoeV9yZWcgPSAweDIwMDA7IGJyZWFrOworCQkJY2FzZSBETUZFXzEwME1GRDogcGh5X3JlZyA9IDB4MjEwMDsgYnJlYWs7CisJCQl9CisJCQlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAwLCBwaHlfcmVnLCBkYi0+Y2hpcF9pZCk7CisgICAgICAgCQkJaWYgKCBkYi0+Y2hpcF90eXBlICYmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTAyX0lEKSApCisJCQkJbWRlbGF5KDIwKTsKKwkJCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDAsIHBoeV9yZWcsIGRiLT5jaGlwX2lkKTsKKwkJfQorCX0KK30KKworCisvKgorICoJV3JpdGUgYSB3b3JkIHRvIFBoeSByZWdpc3RlcgorICovCisKK3N0YXRpYyB2b2lkIHBoeV93cml0ZSh1bnNpZ25lZCBsb25nIGlvYmFzZSwgdTggcGh5X2FkZHIsIHU4IG9mZnNldCwgdTE2IHBoeV9kYXRhLCB1MzIgY2hpcF9pZCkKK3sKKwl1MTYgaTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKworCWlmIChjaGlwX2lkID09IFBDSV9ETTkxMzJfSUQpIHsKKwkJaW9hZGRyID0gaW9iYXNlICsgMHg4MCArIG9mZnNldCAqIDQ7CisJCW91dHcocGh5X2RhdGEsIGlvYWRkcik7CisJfSBlbHNlIHsKKwkJLyogRE05MTAyL0RNOTEwMkEgQ2hpcCAqLworCQlpb2FkZHIgPSBpb2Jhc2UgKyBEQ1I5OworCisJCS8qIFNlbmQgMzMgc3luY2hyb25pemF0aW9uIGNsb2NrIHRvIFBoeSBjb250cm9sbGVyICovCisJCWZvciAoaSA9IDA7IGkgPCAzNTsgaSsrKQorCQkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8xKTsKKworCQkvKiBTZW5kIHN0YXJ0IGNvbW1hbmQoMDEpIHRvIFBoeSAqLworCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzApOworCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzEpOworCisJCS8qIFNlbmQgd3JpdGUgY29tbWFuZCgwMSkgdG8gUGh5ICovCisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMCk7CisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMSk7CisKKwkJLyogU2VuZCBQaHkgYWRkcmVzcyAqLworCQlmb3IgKGkgPSAweDEwOyBpID4gMDsgaSA9IGkgPj4gMSkKKwkJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgcGh5X2FkZHIgJiBpID8gUEhZX0RBVEFfMSA6IFBIWV9EQVRBXzApOworCisJCS8qIFNlbmQgcmVnaXN0ZXIgYWRkcmVzcyAqLworCQlmb3IgKGkgPSAweDEwOyBpID4gMDsgaSA9IGkgPj4gMSkKKwkJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgb2Zmc2V0ICYgaSA/IFBIWV9EQVRBXzEgOiBQSFlfREFUQV8wKTsKKworCQkvKiB3cml0dGVuIHRyYXNuaXRpb24gKi8KKwkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8xKTsKKwkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8wKTsKKworCQkvKiBXcml0ZSBhIHdvcmQgZGF0YSB0byBQSFkgY29udHJvbGxlciAqLworCQlmb3IgKCBpID0gMHg4MDAwOyBpID4gMDsgaSA+Pj0gMSkKKwkJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgcGh5X2RhdGEgJiBpID8gUEhZX0RBVEFfMSA6IFBIWV9EQVRBXzApOworCX0KK30KKworCisvKgorICoJUmVhZCBhIHdvcmQgZGF0YSBmcm9tIHBoeSByZWdpc3RlcgorICovCisKK3N0YXRpYyB1MTYgcGh5X3JlYWQodW5zaWduZWQgbG9uZyBpb2Jhc2UsIHU4IHBoeV9hZGRyLCB1OCBvZmZzZXQsIHUzMiBjaGlwX2lkKQoreworCWludCBpOworCXUxNiBwaHlfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKworCWlmIChjaGlwX2lkID09IFBDSV9ETTkxMzJfSUQpIHsKKwkJLyogRE05MTMyIENoaXAgKi8KKwkJaW9hZGRyID0gaW9iYXNlICsgMHg4MCArIG9mZnNldCAqIDQ7CisJCXBoeV9kYXRhID0gaW53KGlvYWRkcik7CisJfSBlbHNlIHsKKwkJLyogRE05MTAyL0RNOTEwMkEgQ2hpcCAqLworCQlpb2FkZHIgPSBpb2Jhc2UgKyBEQ1I5OworCisJCS8qIFNlbmQgMzMgc3luY2hyb25pemF0aW9uIGNsb2NrIHRvIFBoeSBjb250cm9sbGVyICovCisJCWZvciAoaSA9IDA7IGkgPCAzNTsgaSsrKQorCQkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8xKTsKKworCQkvKiBTZW5kIHN0YXJ0IGNvbW1hbmQoMDEpIHRvIFBoeSAqLworCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzApOworCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzEpOworCisJCS8qIFNlbmQgcmVhZCBjb21tYW5kKDEwKSB0byBQaHkgKi8KKwkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8xKTsKKwkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8wKTsKKworCQkvKiBTZW5kIFBoeSBhZGRyZXNzICovCisJCWZvciAoaSA9IDB4MTA7IGkgPiAwOyBpID0gaSA+PiAxKQorCQkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBwaHlfYWRkciAmIGkgPyBQSFlfREFUQV8xIDogUEhZX0RBVEFfMCk7CisKKwkJLyogU2VuZCByZWdpc3RlciBhZGRyZXNzICovCisJCWZvciAoaSA9IDB4MTA7IGkgPiAwOyBpID0gaSA+PiAxKQorCQkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBvZmZzZXQgJiBpID8gUEhZX0RBVEFfMSA6IFBIWV9EQVRBXzApOworCisJCS8qIFNraXAgdHJhbnNpdGlvbiBzdGF0ZSAqLworCQlwaHlfcmVhZF8xYml0KGlvYWRkcik7CisKKwkJLyogcmVhZCAxNmJpdCBkYXRhICovCisJCWZvciAocGh5X2RhdGEgPSAwLCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCXBoeV9kYXRhIDw8PSAxOworCQkJcGh5X2RhdGEgfD0gcGh5X3JlYWRfMWJpdChpb2FkZHIpOworCQl9CisJfQorCisJcmV0dXJuIHBoeV9kYXRhOworfQorCisKKy8qCisgKglXcml0ZSBvbmUgYml0IGRhdGEgdG8gUGh5IENvbnRyb2xsZXIKKyAqLworCitzdGF0aWMgdm9pZCBwaHlfd3JpdGVfMWJpdCh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTMyIHBoeV9kYXRhKQoreworCW91dGwocGh5X2RhdGEsIGlvYWRkcik7CQkJLyogTUlJIENsb2NrIExvdyAqLworCXVkZWxheSgxKTsKKwlvdXRsKHBoeV9kYXRhIHwgTURDTEtILCBpb2FkZHIpOwkvKiBNSUkgQ2xvY2sgSGlnaCAqLworCXVkZWxheSgxKTsKKwlvdXRsKHBoeV9kYXRhLCBpb2FkZHIpOwkJCS8qIE1JSSBDbG9jayBMb3cgKi8KKwl1ZGVsYXkoMSk7Cit9CisKKworLyoKKyAqCVJlYWQgb25lIGJpdCBwaHkgZGF0YSBmcm9tIFBIWSBjb250cm9sbGVyCisgKi8KKworc3RhdGljIHUxNiBwaHlfcmVhZF8xYml0KHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXUxNiBwaHlfZGF0YTsKKworCW91dGwoMHg1MDAwMCwgaW9hZGRyKTsKKwl1ZGVsYXkoMSk7CisJcGh5X2RhdGEgPSAoIGlubChpb2FkZHIpID4+IDE5ICkgJiAweDE7CisJb3V0bCgweDQwMDAwLCBpb2FkZHIpOworCXVkZWxheSgxKTsKKworCXJldHVybiBwaHlfZGF0YTsKK30KKworCisvKgorICoJUGFyc2VyIFNST00gYW5kIG1lZGlhIG1vZGUKKyAqLworCitzdGF0aWMgdm9pZCBkbWZlX3BhcnNlX3Nyb20oc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqIGRiKQoreworCWNoYXIgKiBzcm9tID0gZGItPnNyb207CisJaW50IGRtZmVfbW9kZSwgdG1wX3JlZzsKKworCURNRkVfREJVRygwLCAiZG1mZV9wYXJzZV9zcm9tKCkgIiwgMCk7CisKKwkvKiBJbml0IENSMTUgKi8KKwlkYi0+Y3IxNV9kYXRhID0gQ1IxNV9ERUZBVUxUOworCisJLyogQ2hlY2sgU1JPTSBWZXJzaW9uICovCisJaWYgKCAoIChpbnQpIHNyb21bMThdICYgMHhmZikgPT0gU1JPTV9WNDFfQ09ERSkgeworCQkvKiBTUk9NIFY0LjAxICovCisJCS8qIEdldCBOSUMgc3VwcG9ydCBtZWRpYSBtb2RlICovCisJCWRiLT5OSUNfY2FwYWJpbGl0eSA9IGxlMTZfdG9fY3B1cChzcm9tICsgMzQpOworCQlkYi0+UEhZX3JlZzQgPSAwOworCQlmb3IgKHRtcF9yZWcgPSAxOyB0bXBfcmVnIDwgMHgxMDsgdG1wX3JlZyA8PD0gMSkgeworCQkJc3dpdGNoKCBkYi0+TklDX2NhcGFiaWxpdHkgJiB0bXBfcmVnICkgeworCQkJY2FzZSAweDE6IGRiLT5QSFlfcmVnNCB8PSAweDAwMjA7IGJyZWFrOworCQkJY2FzZSAweDI6IGRiLT5QSFlfcmVnNCB8PSAweDAwNDA7IGJyZWFrOworCQkJY2FzZSAweDQ6IGRiLT5QSFlfcmVnNCB8PSAweDAwODA7IGJyZWFrOworCQkJY2FzZSAweDg6IGRiLT5QSFlfcmVnNCB8PSAweDAxMDA7IGJyZWFrOworCQkJfQorCQl9CisKKwkJLyogTWVkaWEgTW9kZSBGb3JjZSBvciBub3QgY2hlY2sgKi8KKwkJZG1mZV9tb2RlID0gbGUzMl90b19jcHVwKHNyb20gKyAzNCkgJiBsZTMyX3RvX2NwdXAoc3JvbSArIDM2KTsKKwkJc3dpdGNoKGRtZmVfbW9kZSkgeworCQljYXNlIDB4NDogZG1mZV9tZWRpYV9tb2RlID0gRE1GRV8xMDBNSEY7IGJyZWFrOwkvKiAxMDBNSEYgKi8KKwkJY2FzZSAweDI6IGRtZmVfbWVkaWFfbW9kZSA9IERNRkVfMTBNRkQ7IGJyZWFrOwkvKiAxME1GRCAqLworCQljYXNlIDB4ODogZG1mZV9tZWRpYV9tb2RlID0gRE1GRV8xMDBNRkQ7IGJyZWFrOwkvKiAxMDBNRkQgKi8KKwkJY2FzZSAweDEwMDoKKwkJY2FzZSAweDIwMDogZG1mZV9tZWRpYV9tb2RlID0gRE1GRV8xTV9IUE5BOyBicmVhazsvKiBIb21lUE5BICovCisJCX0KKworCQkvKiBTcGVjaWFsIEZ1bmN0aW9uIHNldHRpbmcgKi8KKwkJLyogVkxBTiBmdW5jdGlvbiAqLworCQlpZiAoIChTRl9tb2RlICYgMHgxKSB8fCAoc3JvbVs0M10gJiAweDgwKSApCisJCQlkYi0+Y3IxNV9kYXRhIHw9IDB4NDA7CisKKwkJLyogRmxvdyBDb250cm9sICovCisJCWlmICggKFNGX21vZGUgJiAweDIpIHx8IChzcm9tWzQwXSAmIDB4MSkgKQorCQkJZGItPmNyMTVfZGF0YSB8PSAweDQwMDsKKworCQkvKiBUWCBwYXVzZSBwYWNrZXQgKi8KKwkJaWYgKCAoU0ZfbW9kZSAmIDB4NCkgfHwgKHNyb21bNDBdICYgMHhlKSApCisJCQlkYi0+Y3IxNV9kYXRhIHw9IDB4OTgwMDsKKwl9CisKKwkvKiBQYXJzZSBIUE5BIHBhcmFtZXRlciAqLworCWRiLT5IUE5BX2NvbW1hbmQgPSAxOworCisJLyogQWNjZXB0IHJlbW90ZSBjb21tYW5kIG9yIG5vdCAqLworCWlmIChIUE5BX3J4X2NtZCA9PSAwKQorCQlkYi0+SFBOQV9jb21tYW5kIHw9IDB4ODAwMDsKKworCSAvKiBJc3N1ZSByZW1vdGUgY29tbWFuZCAmIG9wZXJhdGlvbiBtb2RlICovCisJaWYgKEhQTkFfdHhfY21kID09IDEpCisJCXN3aXRjaChIUE5BX21vZGUpIHsJLyogSXNzdWUgUmVtb3RlIENvbW1hbmQgKi8KKwkJY2FzZSAwOiBkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDkwNDsgYnJlYWs7CisJCWNhc2UgMTogZGItPkhQTkFfY29tbWFuZCB8PSAweDBhMDA7IGJyZWFrOworCQljYXNlIDI6IGRiLT5IUE5BX2NvbW1hbmQgfD0gMHgwNTA2OyBicmVhazsKKwkJY2FzZSAzOiBkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDYwMjsgYnJlYWs7CisJCX0KKwllbHNlCisJCXN3aXRjaChIUE5BX21vZGUpIHsJLyogRG9uJ3QgSXNzdWUgKi8KKwkJY2FzZSAwOiBkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDAwNDsgYnJlYWs7CisJCWNhc2UgMTogZGItPkhQTkFfY29tbWFuZCB8PSAweDAwMDA7IGJyZWFrOworCQljYXNlIDI6IGRiLT5IUE5BX2NvbW1hbmQgfD0gMHgwMDA2OyBicmVhazsKKwkJY2FzZSAzOiBkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDAwMjsgYnJlYWs7CisJCX0KKworCS8qIENoZWNrIERNOTgwMSBvciBETTk4MDIgcHJlc2VudCBvciBub3QgKi8KKwlkYi0+SFBOQV9wcmVzZW50ID0gMDsKKwl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YXwweDQwMDAwLCBkYi0+aW9hZGRyKTsKKwl0bXBfcmVnID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAzLCBkYi0+Y2hpcF9pZCk7CisJaWYgKCAoIHRtcF9yZWcgJiAweGZmZjAgKSA9PSAweGI5MDAgKSB7CisJCS8qIERNOTgwMSBvciBETTk4MDIgcHJlc2VudCAqLworCQlkYi0+SFBOQV90aW1lciA9IDg7CisJCWlmICggcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAzMSwgZGItPmNoaXBfaWQpID09IDB4NDQwNCkgeworCQkJLyogRE05ODAxIEhvbWVSdW4gKi8KKwkJCWRiLT5IUE5BX3ByZXNlbnQgPSAxOworCQkJZG1mZV9wcm9ncmFtX0RNOTgwMShkYiwgdG1wX3JlZyk7CisJCX0gZWxzZSB7CisJCQkvKiBETTk4MDIgTG9uZ1J1biAqLworCQkJZGItPkhQTkFfcHJlc2VudCA9IDI7CisJCQlkbWZlX3Byb2dyYW1fRE05ODAyKGRiKTsKKwkJfQorCX0KKworfQorCisKKy8qCisgKglJbml0IEhvbWVSdW4gRE05ODAxCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9wcm9ncmFtX0RNOTgwMShzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICogZGIsIGludCBIUE5BX3JldikKK3sKKwl1aW50IHJlZzE3LCByZWcyNTsKKworCWlmICggIUhQTkFfTm9pc2VGbG9vciApIEhQTkFfTm9pc2VGbG9vciA9IERNOTgwMV9OT0lTRV9GTE9PUjsKKwlzd2l0Y2goSFBOQV9yZXYpIHsKKwljYXNlIDB4YjkwMDogLyogRE05ODAxIEUzICovCisJCWRiLT5IUE5BX2NvbW1hbmQgfD0gMHgxMDAwOworCQlyZWcyNSA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMjQsIGRiLT5jaGlwX2lkKTsKKwkJcmVnMjUgPSAoIChyZWcyNSArIEhQTkFfTm9pc2VGbG9vcikgJiAweGZmKSB8IDB4ZjAwMDsKKwkJcmVnMTcgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDE3LCBkYi0+Y2hpcF9pZCk7CisJCWJyZWFrOworCWNhc2UgMHhiOTAxOiAvKiBETTk4MDEgRTQgKi8KKwkJcmVnMjUgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDI1LCBkYi0+Y2hpcF9pZCk7CisJCXJlZzI1ID0gKHJlZzI1ICYgMHhmZjAwKSArIEhQTkFfTm9pc2VGbG9vcjsKKwkJcmVnMTcgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDE3LCBkYi0+Y2hpcF9pZCk7CisJCXJlZzE3ID0gKHJlZzE3ICYgMHhmZmYwKSArIEhQTkFfTm9pc2VGbG9vciArIDM7CisJCWJyZWFrOworCWNhc2UgMHhiOTAyOiAvKiBETTk4MDEgRTUgKi8KKwljYXNlIDB4YjkwMzogLyogRE05ODAxIEU2ICovCisJZGVmYXVsdDoKKwkJZGItPkhQTkFfY29tbWFuZCB8PSAweDEwMDA7CisJCXJlZzI1ID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAyNSwgZGItPmNoaXBfaWQpOworCQlyZWcyNSA9IChyZWcyNSAmIDB4ZmYwMCkgKyBIUE5BX05vaXNlRmxvb3IgLSA1OworCQlyZWcxNyA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMTcsIGRiLT5jaGlwX2lkKTsKKwkJcmVnMTcgPSAocmVnMTcgJiAweGZmZjApICsgSFBOQV9Ob2lzZUZsb29yOworCQlicmVhazsKKwl9CisJcGh5X3dyaXRlKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMTYsIGRiLT5IUE5BX2NvbW1hbmQsIGRiLT5jaGlwX2lkKTsKKwlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxNywgcmVnMTcsIGRiLT5jaGlwX2lkKTsKKwlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAyNSwgcmVnMjUsIGRiLT5jaGlwX2lkKTsKK30KKworCisvKgorICoJSW5pdCBIb21lUnVuIERNOTgwMgorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfcHJvZ3JhbV9ETTk4MDIoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqIGRiKQoreworCXVpbnQgcGh5X3JlZzsKKworCWlmICggIUhQTkFfTm9pc2VGbG9vciApIEhQTkFfTm9pc2VGbG9vciA9IERNOTgwMl9OT0lTRV9GTE9PUjsKKwlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxNiwgZGItPkhQTkFfY29tbWFuZCwgZGItPmNoaXBfaWQpOworCXBoeV9yZWcgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDI1LCBkYi0+Y2hpcF9pZCk7CisJcGh5X3JlZyA9ICggcGh5X3JlZyAmIDB4ZmYwMCkgKyBIUE5BX05vaXNlRmxvb3I7CisJcGh5X3dyaXRlKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMjUsIHBoeV9yZWcsIGRiLT5jaGlwX2lkKTsKK30KKworCisvKgorICoJQ2hlY2sgcmVtb3RlIEhQTkEgcG93ZXIgYW5kIHNwZWVkIHN0YXR1cy4gSWYgbm90IGNvcnJlY3QsCisgKglpc3N1ZSBjb21tYW5kIGFnYWluLgorKi8KKworc3RhdGljIHZvaWQgZG1mZV9IUE5BX3JlbW90ZV9jbWRfY2hrKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKiBkYikKK3sKKwl1aW50IHBoeV9yZWc7CisKKwkvKiBHb3QgcmVtb3RlIGRldmljZSBzdGF0dXMgKi8KKwlwaHlfcmVnID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxNywgZGItPmNoaXBfaWQpICYgMHg2MDsKKwlzd2l0Y2gocGh5X3JlZykgeworCWNhc2UgMHgwMDogcGh5X3JlZyA9IDB4MGEwMDticmVhazsgLyogTFAvTFMgKi8KKwljYXNlIDB4MjA6IHBoeV9yZWcgPSAweDA5MDA7YnJlYWs7IC8qIExQL0hTICovCisJY2FzZSAweDQwOiBwaHlfcmVnID0gMHgwNjAwO2JyZWFrOyAvKiBIUC9MUyAqLworCWNhc2UgMHg2MDogcGh5X3JlZyA9IDB4MDUwMDticmVhazsgLyogSFAvSFMgKi8KKwl9CisKKwkvKiBDaGVjayByZW1vdGUgZGV2aWNlIHN0YXR1cyBtYXRjaCBvdXIgc2V0dGluZyBvdCBub3QgKi8KKwlpZiAoIHBoeV9yZWcgIT0gKGRiLT5IUE5BX2NvbW1hbmQgJiAweDBmMDApICkgeworCQlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxNiwgZGItPkhQTkFfY29tbWFuZCwgZGItPmNoaXBfaWQpOworCQlkYi0+SFBOQV90aW1lcj04OworCX0gZWxzZQorCQlkYi0+SFBOQV90aW1lcj02MDA7CS8qIE1hdGNoLCBldmVyeSAxMCBtaW51dGVzLCBjaGVjayAqLworfQorCisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGRtZmVfcGNpX3RibFtdID0geworCXsgMHgxMjgyLCAweDkxMzIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFBDSV9ETTkxMzJfSUQgfSwKKwl7IDB4MTI4MiwgMHg5MTAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBQQ0lfRE05MTAyX0lEIH0sCisJeyAweDEyODIsIDB4OTEwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUENJX0RNOTEwMF9JRCB9LAorCXsgMHgxMjgyLCAweDkwMDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFBDSV9ETTkwMDlfSUQgfSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZG1mZV9wY2lfdGJsKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZG1mZV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImRtZmUiLAorCS5pZF90YWJsZQk9IGRtZmVfcGNpX3RibCwKKwkucHJvYmUJCT0gZG1mZV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRtZmVfcmVtb3ZlX29uZSksCit9OworCitNT0RVTEVfQVVUSE9SKCJTdGVuIFdhbmcsIHN0ZW5fd2FuZ0BkYXZpY29tLmNvbS50dyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEYXZpY29tIERNOTEwWCBmYXN0IGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obW9kZSwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW0oY3I2c2V0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNoa21vZGUsIGJ5dGUsIDApOworbW9kdWxlX3BhcmFtKEhQTkFfbW9kZSwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW0oSFBOQV9yeF9jbWQsIGJ5dGUsIDApOworbW9kdWxlX3BhcmFtKEhQTkFfdHhfY21kLCBieXRlLCAwKTsKK21vZHVsZV9wYXJhbShIUE5BX05vaXNlRmxvb3IsIGJ5dGUsIDApOworbW9kdWxlX3BhcmFtKFNGX21vZGUsIGJ5dGUsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRhdmljb20gRE05eHh4IGVuYWJsZSBkZWJ1Z2dpbmcgKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZSwgIkRhdmljb20gRE05eHh4OiBCaXQgMDogMTAvMTAwTWJwcywgYml0IDI6IGR1cGxleCwgYml0IDg6IEhvbWVQTkEiKTsKK01PRFVMRV9QQVJNX0RFU0MoU0ZfbW9kZSwgIkRhdmljb20gRE05eHh4IHNwZWNpYWwgZnVuY3Rpb24gKGJpdCAwOiBWTEFOLCBiaXQgMSBGbG93IENvbnRyb2wsIGJpdCAyOiBUWCBwYXVzZSBwYWNrZXQpIik7CisKKy8qCURlc2NyaXB0aW9uOgorICoJd2hlbiB1c2VyIHVzZWQgaW5zbW9kIHRvIGFkZCBtb2R1bGUsIHN5c3RlbSBpbnZva2VkIGluaXRfbW9kdWxlKCkKKyAqCXRvIGluaXRpbGl6ZSBhbmQgcmVnaXN0ZXIuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgZG1mZV9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByYzsKKworCXByaW50ayh2ZXJzaW9uKTsKKwlwcmludGVkX3ZlcnNpb24gPSAxOworCisJRE1GRV9EQlVHKDAsICJpbml0X21vZHVsZSgpICIsIGRlYnVnKTsKKworCWlmIChkZWJ1ZykKKwkJZG1mZV9kZWJ1ZyA9IGRlYnVnOwkvKiBzZXQgZGVidWcgZmxhZyAqLworCWlmIChjcjZzZXQpCisJCWRtZmVfY3I2X3VzZXJfc2V0ID0gY3I2c2V0OworCisgCXN3aXRjaChtb2RlKSB7CisgICAJY2FzZSBETUZFXzEwTUhGOgorCWNhc2UgRE1GRV8xMDBNSEY6CisJY2FzZSBETUZFXzEwTUZEOgorCWNhc2UgRE1GRV8xMDBNRkQ6CisJY2FzZSBETUZFXzFNX0hQTkE6CisJCWRtZmVfbWVkaWFfbW9kZSA9IG1vZGU7CisJCWJyZWFrOworCWRlZmF1bHQ6ZG1mZV9tZWRpYV9tb2RlID0gRE1GRV9BVVRPOworCQlicmVhazsKKwl9CisKKwlpZiAoSFBOQV9tb2RlID4gNCkKKwkJSFBOQV9tb2RlID0gMDsJCS8qIERlZmF1bHQ6IExQL0hTICovCisJaWYgKEhQTkFfcnhfY21kID4gMSkKKwkJSFBOQV9yeF9jbWQgPSAwOwkvKiBEZWZhdWx0OiBJZ25vcmVkIHJlbW90ZSBjbWQgKi8KKwlpZiAoSFBOQV90eF9jbWQgPiAxKQorCQlIUE5BX3R4X2NtZCA9IDA7CS8qIERlZmF1bHQ6IERvbid0IGlzc3VlIHJlbW90ZSBjbWQgKi8KKwlpZiAoSFBOQV9Ob2lzZUZsb29yID4gMTUpCisJCUhQTkFfTm9pc2VGbG9vciA9IDA7CisKKwlyYyA9IHBjaV9tb2R1bGVfaW5pdCgmZG1mZV9kcml2ZXIpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglEZXNjcmlwdGlvbjoKKyAqCXdoZW4gdXNlciB1c2VkIHJtbW9kIHRvIGRlbGV0ZSBtb2R1bGUsIHN5c3RlbSBpbnZva2VkIGNsZWFuX21vZHVsZSgpCisgKgl0byB1bi1yZWdpc3RlciBhbGwgcmVnaXN0ZXJlZCBzZXJ2aWNlcy4KKyAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgZG1mZV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCURNRkVfREJVRygwLCAiZG1mZV9jbGVhbl9tb2R1bGUoKSAiLCBkZWJ1Zyk7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkbWZlX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGRtZmVfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZG1mZV9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9lZXByb20uYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2VlcHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNWJmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC9lZXByb20uYwpAQCAtMCwwICsxLDM1NyBAQAorLyoKKwlkcml2ZXJzL25ldC90dWxpcC9lZXByb20uYworCisJTWFpbnRhaW5lZCBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJQ29weXJpZ2h0IDIwMDAsMjAwMSAgVGhlIExpbnV4IEtlcm5lbCBUZWFtCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5NC0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVBsZWFzZSByZWZlciB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdHVsaXAtdXNlci57cGRmLHBzLGh0bWx9CisJZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBkcml2ZXIsIG9yIHZpc2l0IHRoZSBwcm9qZWN0CisJV2ViIHBhZ2UgYXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy90dWxpcC8KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgInR1bGlwLmgiCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworCisKKy8qIFNlcmlhbCBFRVBST00gc2VjdGlvbi4gKi8KKy8qIFRoZSBtYWluIHJvdXRpbmUgdG8gcGFyc2UgdGhlIHZlcnkgY29tcGxpY2F0ZWQgU1JPTSBzdHJ1Y3R1cmUuCisgICBTZWFyY2ggd3d3LmRpZ2l0YWwuY29tIGZvciAiMjFYNCBTUk9NIiB0byBnZXQgZGV0YWlscy4KKyAgIFRoaXMgY29kZSBpcyB2ZXJ5IGNvbXBsZXgsIGFuZCB3aWxsIHJlcXVpcmUgY2hhbmdlcyB0byBzdXBwb3J0CisgICBhZGRpdGlvbmFsIGNhcmRzLCBzbyBJJ2xsIGJlIHZlcmJvc2UgYWJvdXQgd2hhdCBpcyBnb2luZyBvbi4KKyAgICovCisKKy8qIEtub3duIGNhcmRzIHRoYXQgaGF2ZSBvbGQtc3R5bGUgRUVQUk9Ncy4gKi8KK3N0YXRpYyBzdHJ1Y3QgZWVwcm9tX2ZpeHVwIGVlcHJvbV9maXh1cHNbXSBfX2RldmluaXRkYXRhID0geworICB7IkFzYW50ZSIsIDAsIDAsIDB4OTQsIHsweDFlMDAsIDB4MDAwMCwgMHgwODAwLCAweDAxMDAsIDB4MDE4YywKKwkJCSAgMHgwMDAwLCAweDAwMDAsIDB4ZTA3OCwgMHgwMDAxLCAweDAwNTAsIDB4MDAxOCB9fSwKKyAgeyJTTUM5MzMyRFNUIiwgMCwgMCwgMHhDMCwgeyAweDFlMDAsIDB4MDAwMCwgMHgwODAwLCAweDA0MWYsCisJCQkgICAweDAwMDAsIDB4MDA5RSwgLyogMTBiYXNlVCAqLworCQkJICAgMHgwMDA0LCAweDAwOUUsIC8qIDEwYmFzZVQtRkQgKi8KKwkJCSAgIDB4MDkwMywgMHgwMDZELCAvKiAxMDBiYXNlVHggKi8KKwkJCSAgIDB4MDkwNSwgMHgwMDZELCAvKiAxMDBiYXNlVHgtRkQgKi8gfX0sCisgIHsiQ29nZW50IEVNMTAwIiwgMCwgMCwgMHg5MiwgeyAweDFlMDAsIDB4MDAwMCwgMHgwODAwLCAweDA2M2YsCisJCQkJIDB4MDEwNywgMHg4MDIxLCAvKiAxMDBiYXNlRnggKi8KKwkJCQkgMHgwMTA4LCAweDgwMjEsIC8qIDEwMGJhc2VGeC1GRCAqLworCQkJCSAweDAxMDAsIDB4MDA5RSwgLyogMTBiYXNlVCAqLworCQkJCSAweDAxMDQsIDB4MDA5RSwgLyogMTBiYXNlVC1GRCAqLworCQkJCSAweDAxMDMsIDB4MDA2RCwgLyogMTAwYmFzZVR4ICovCisJCQkJIDB4MDEwNSwgMHgwMDZELCAvKiAxMDBiYXNlVHgtRkQgKi8gfX0sCisgIHsiTWF4dGVjaCBOWC0xMTAiLCAwLCAwLCAweEU4LCB7IDB4MWUwMCwgMHgwMDAwLCAweDA4MDAsIDB4MDUxMywKKwkJCQkgICAweDEwMDEsIDB4MDA5RSwgLyogMTBiYXNlMiwgQ1NSMTIgMHgxMCovCisJCQkJICAgMHgwMDAwLCAweDAwOUUsIC8qIDEwYmFzZVQgKi8KKwkJCQkgICAweDAwMDQsIDB4MDA5RSwgLyogMTBiYXNlVC1GRCAqLworCQkJCSAgIDB4MDMwMywgMHgwMDZELCAvKiAxMDBiYXNlVHgsIENTUjEyIDB4MDMgKi8KKwkJCQkgICAweDAzMDUsIDB4MDA2RCwgLyogMTAwYmFzZVR4LUZEIENTUjEyIDB4MDMgKi99fSwKKyAgeyJBY2N0b24gRU4xMjA3IiwgMCwgMCwgMHhFOCwgeyAweDFlMDAsIDB4MDAwMCwgMHgwODAwLCAweDA1MUYsCisJCQkJICAweDFCMDEsIDB4MDAwMCwgLyogMTBiYXNlMiwgICBDU1IxMiAweDFCICovCisJCQkJICAweDBCMDAsIDB4MDA5RSwgLyogMTBiYXNlVCwgICBDU1IxMiAweDBCICovCisJCQkJICAweDBCMDQsIDB4MDA5RSwgLyogMTBiYXNlVC1GRCxDU1IxMiAweDBCICovCisJCQkJICAweDFCMDMsIDB4MDA2RCwgLyogMTAwYmFzZVR4LCBDU1IxMiAweDFCICovCisJCQkJICAweDFCMDUsIDB4MDA2RCwgLyogMTAwYmFzZVR4LUZEIENTUjEyIDB4MUIgKi8KKyAgIH19LAorICB7Ik5ldFdpbmRlciIsIDB4MDAsIDB4MTAsIDB4NTcsCisJLyogRGVmYXVsdCBtZWRpYSA9IE1JSQorCSAqIE1JSSBibG9jaywgcmVzZXQgc2VxdWVuY2UgKDMpID0gMHgwODIxIDB4MDAwMCAweDAwMDEsIGNhcGFiaWxpdGllcyAweDAxZTEKKwkgKi8KKwl7IDB4MWUwMCwgMHgwMDAwLCAweDAwMGIsIDB4OGYwMSwgMHgwMTAzLCAweDAzMDAsIDB4MDgyMSwgMHgwMDAsIDB4MDAwMSwgMHgwMDAwLCAweDAxZTEgfQorICB9LAorICB7TlVMTH19OworCisKK3N0YXRpYyBjb25zdCBjaGFyICpibG9ja19uYW1lW10gX19kZXZpbml0ZGF0YSA9IHsKKwkiMjExNDAgbm9uLU1JSSIsCisJIjIxMTQwIE1JSSBQSFkiLAorCSIyMTE0MiBTZXJpYWwgUEhZIiwKKwkiMjExNDIgTUlJIFBIWSIsCisJIjIxMTQzIFNZTSBQSFkiLAorCSIyMTE0MyByZXNldCBtZXRob2QiCit9OworCisKKy8qKgorICogdHVsaXBfYnVpbGRfZmFrZV9tZWRpYXRhYmxlIC0gQnVpbGQgYSBmYWtlIG1lZGlhdGFibGUgZW50cnkuCisgKiBAdHA6IFB0ciB0byB0aGUgdHVsaXAgcHJpdmF0ZSBkYXRhLgorICoKKyAqIFNvbWUgY2FyZHMgbGlrZSB0aGUgM3g1IEhTQyBjYXJkcyAoSjM1MTRBKSBkbyBub3QgaGF2ZSBhIHN0YW5kYXJkIAorICogc3JvbSBhbmQgY2FuIG5vdCBiZSBoYW5kbGVkIHVuZGVyIHRoZSBmaXh1cCByb3V0aW5lLiAgVGhlc2UgY2FyZHMKKyAqIHN0aWxsIG5lZWQgYSB2YWxpZCBtZWRpYXRhYmxlIGVudHJ5IGZvciBjb3JyZWN0IGNzcjEyIHNldHVwIGFuZCAKKyAqIG1paSBoYW5kbGluZy4KKyAqIAorICogU2luY2UgdGhpcyBpcyBjdXJyZW50bHkgYSBwYXJpc2MtbGludXggc3BlY2lmaWMgZnVuY3Rpb24sIHRoZQorICogI2lmZGVmIF9faHBwYV9fIHNob3VsZCBjb21wbGV0ZWx5IG9wdGltaXplIHRoaXMgZnVuY3Rpb24gYXdheSBmb3IKKyAqIG5vbi1wYXJpc2MgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0dWxpcF9idWlsZF9mYWtlX21lZGlhdGFibGUoc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwKQoreworI2lmZGVmIENPTkZJR19HU0MKKwlpZiAodHAtPmZsYWdzICYgTkVFRFNfRkFLRV9NRURJQV9UQUJMRSkgeworCQlzdGF0aWMgdW5zaWduZWQgY2hhciBsZWFmZGF0YVtdID0KKwkJCXsgMHgwMSwgICAgICAgLyogcGh5IG51bWJlciAqLworCQkJICAweDAyLCAgICAgICAvKiBncHIgc2V0dXAgc2VxdWVuY2UgbGVuZ3RoICovCisJCQkgIDB4MDIsIDB4MDAsIC8qIGdwciBzZXR1cCBzZXF1ZW5jZSAqLworCQkJICAweDAyLCAgICAgICAvKiBwaHkgcmVzZXQgc2VxdWVuY2UgbGVuZ3RoICovCisJCQkgIDB4MDEsIDB4MDAsIC8qIHBoeSByZXNldCBzZXF1ZW5jZSAqLworCQkJICAweDAwLCAweDc4LCAvKiBtZWRpYSBjYXBhYmlsaXRpZXMgKi8KKwkJCSAgMHgwMCwgMHhlMCwgLyogbndheSBhZHZlcnRpc21lbnQgKi8KKwkJCSAgMHgwMCwgMHgwNSwgLyogZmR4IGJpdCBtYXAgKi8KKwkJCSAgMHgwMCwgMHgwNiAgLyogdHRtIGJpdCBtYXAgKi8KKwkJCX07CisKKwkJdHAtPm10YWJsZSA9IChzdHJ1Y3QgbWVkaWF0YWJsZSAqKQorCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IG1lZGlhdGFibGUpICsgc2l6ZW9mKHN0cnVjdCBtZWRpYWxlYWYpLCBHRlBfS0VSTkVMKTsKKworCQlpZiAodHAtPm10YWJsZSA9PSBOVUxMKQorCQkJcmV0dXJuOyAvKiBIb3JyaWJsZSwgaW1wb3NzaWJsZSBmYWlsdXJlLiAqLworCisJCXRwLT5tdGFibGUtPmRlZmF1bHRtZWRpYSA9IDB4ODAwOworCQl0cC0+bXRhYmxlLT5sZWFmY291bnQgPSAxOworCQl0cC0+bXRhYmxlLT5jc3IxMmRpciA9IDB4M2Y7IC8qIGlucHV0cyBvbiBiaXQ3IGZvciBoc2MtcGNpLCBiaXQ2IGZvciBwY2ktZnggKi8KKwkJdHAtPm10YWJsZS0+aGFzX25vbm1paSA9IDA7CisJCXRwLT5tdGFibGUtPmhhc19yZXNldCA9IDA7CisJCXRwLT5tdGFibGUtPmhhc19taWkgPSAxOworCQl0cC0+bXRhYmxlLT5jc3IxNWRpciA9IHRwLT5tdGFibGUtPmNzcjE1dmFsID0gMDsKKwkJdHAtPm10YWJsZS0+bWxlYWZbMF0udHlwZSA9IDE7CisJCXRwLT5tdGFibGUtPm1sZWFmWzBdLm1lZGlhID0gMTE7CisJCXRwLT5tdGFibGUtPm1sZWFmWzBdLmxlYWZkYXRhID0gJmxlYWZkYXRhWzBdOworCQl0cC0+ZmxhZ3MgfD0gSEFTX1BIWV9JUlE7CisJCXRwLT5jc3IxMl9zaGFkb3cgPSAtMTsKKwl9CisjZW5kaWYgCit9CisKK3ZvaWQgX19kZXZpbml0IHR1bGlwX3BhcnNlX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIFRoZSBsYXN0IG1lZGlhIGluZm8gbGlzdCBwYXJzZWQsIGZvciBtdWx0aXBvcnQgYm9hcmRzLiAgKi8KKwlzdGF0aWMgc3RydWN0IG1lZGlhdGFibGUgKmxhc3RfbWVkaWF0YWJsZTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciAqbGFzdF9lZV9kYXRhOworCXN0YXRpYyBpbnQgY29udHJvbGxlcl9pbmRleDsKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgKmVlX2RhdGEgPSB0cC0+ZWVwcm9tOworCWludCBpOworCisJdHAtPm10YWJsZSA9IE5VTEw7CisJLyogRGV0ZWN0IGFuIG9sZC1zdHlsZSAoU0Egb25seSkgRUVQUk9NIGxheW91dDoKKwkgICBtZW1jbXAoZWVkYXRhLCBlZWRhdGErMTYsIDgpLiAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpICsrKQorCQlpZiAoZWVfZGF0YVtpXSAhPSBlZV9kYXRhWzE2K2ldKQorCQkJYnJlYWs7CisJaWYgKGkgPj0gOCkgeworCQlpZiAoZWVfZGF0YVswXSA9PSAweGZmKSB7CisJCQlpZiAobGFzdF9tZWRpYXRhYmxlKSB7CisJCQkJY29udHJvbGxlcl9pbmRleCsrOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAgQ29udHJvbGxlciAlZCBvZiBtdWx0aXBvcnQgYm9hcmQuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIGNvbnRyb2xsZXJfaW5kZXgpOworCQkJCXRwLT5tdGFibGUgPSBsYXN0X21lZGlhdGFibGU7CisJCQkJZWVfZGF0YSA9IGxhc3RfZWVfZGF0YTsKKwkJCQlnb3RvIHN1YnNlcXVlbnRfYm9hcmQ7CisJCQl9IGVsc2UKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogIE1pc3NpbmcgRUVQUk9NLCB0aGlzIGludGVyZmFjZSBtYXkgIgorCQkJCQkgICAibm90IHdvcmsgY29ycmVjdGx5IVxuIiwKKwkJCSAgIGRldi0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwkgIC8qIERvIGEgZml4LXVwIGJhc2VkIG9uIHRoZSB2ZW5kb3IgaGFsZiBvZiB0aGUgc3RhdGlvbiBhZGRyZXNzIHByZWZpeC4gKi8KKwkgIGZvciAoaSA9IDA7IGVlcHJvbV9maXh1cHNbaV0ubmFtZTsgaSsrKSB7CisJCWlmIChkZXYtPmRldl9hZGRyWzBdID09IGVlcHJvbV9maXh1cHNbaV0uYWRkcjAKKwkJCSYmICBkZXYtPmRldl9hZGRyWzFdID09IGVlcHJvbV9maXh1cHNbaV0uYWRkcjEKKwkJCSYmICBkZXYtPmRldl9hZGRyWzJdID09IGVlcHJvbV9maXh1cHNbaV0uYWRkcjIpIHsKKwkJICBpZiAoZGV2LT5kZXZfYWRkclsyXSA9PSAweEU4ICAmJiAgZWVfZGF0YVsweDFhXSA9PSAweDU1KQorCQkJICBpKys7CQkJLyogQW4gQWNjdG9uIEVOMTIwNywgbm90IGFuIG91dGxhdyBNYXh0ZWNoLiAqLworCQkgIG1lbWNweShlZV9kYXRhICsgMjYsIGVlcHJvbV9maXh1cHNbaV0ubmV3dGFibGUsCisJCQkJIHNpemVvZihlZXByb21fZml4dXBzW2ldLm5ld3RhYmxlKSk7CisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9sZCBmb3JtYXQgRUVQUk9NIG9uICclcycgYm9hcmQuICBVc2luZyIKKwkJCQkgIiBzdWJzdGl0dXRlIG1lZGlhIGNvbnRyb2wgaW5mby5cbiIsCisJCQkJIGRldi0+bmFtZSwgZWVwcm9tX2ZpeHVwc1tpXS5uYW1lKTsKKwkJICBicmVhazsKKwkJfQorCSAgfQorCSAgaWYgKGVlcHJvbV9maXh1cHNbaV0ubmFtZSA9PSBOVUxMKSB7IC8qIE5vIGZpeHVwIGZvdW5kLiAqLworCQkgIHByaW50ayhLRVJOX0lORk8gIiVzOiBPbGQgc3R5bGUgRUVQUk9NIHdpdGggbm8gbWVkaWEgc2VsZWN0aW9uICIKKwkJCQkgImluZm9ybWF0aW9uLlxuIiwKKwkJCSAgIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwkgIH0KKwl9CisKKwljb250cm9sbGVyX2luZGV4ID0gMDsKKwlpZiAoZWVfZGF0YVsxOV0gPiAxKSB7CQkvKiBNdWx0aXBvcnQgYm9hcmQuICovCisJCWxhc3RfZWVfZGF0YSA9IGVlX2RhdGE7CisJfQorc3Vic2VxdWVudF9ib2FyZDoKKworCWlmIChlZV9kYXRhWzI3XSA9PSAwKSB7CQkvKiBObyB2YWxpZCBtZWRpYSB0YWJsZS4gKi8KKwkJdHVsaXBfYnVpbGRfZmFrZV9tZWRpYXRhYmxlKHRwKTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBjaGFyICpwID0gKHZvaWQgKillZV9kYXRhICsgZWVfZGF0YVsyN107CisJCXVuc2lnbmVkIGNoYXIgY3NyMTJkaXIgPSAwOworCQlpbnQgY291bnQsIG5ld19hZHZlcnRpc2UgPSAwOworCQlzdHJ1Y3QgbWVkaWF0YWJsZSAqbXRhYmxlOworCQl1MTYgbWVkaWEgPSBnZXRfdTE2KHApOworCisJCXAgKz0gMjsKKwkJaWYgKHRwLT5mbGFncyAmIENTUjEyX0lOX1NST00pCisJCQljc3IxMmRpciA9ICpwKys7CisJCWNvdW50ID0gKnArKzsKKworCSAgICAgICAgLyogdGhlcmUgaXMgbm8gcGh5IGluZm9ybWF0aW9uLCBkb24ndCBldmVuIHRyeSB0byBidWlsZCBtdGFibGUgKi8KKwkgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CisJCQlpZiAodHVsaXBfZGVidWcgPiAwKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBubyBwaHkgaW5mbywgYWJvcnRpbmcgbXRhYmxlIGJ1aWxkXG4iLCBkZXYtPm5hbWUpOworCQkgICAgICAgIHJldHVybjsKKwkJfQorCisJCW10YWJsZSA9IChzdHJ1Y3QgbWVkaWF0YWJsZSAqKQorCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IG1lZGlhdGFibGUpICsgY291bnQqc2l6ZW9mKHN0cnVjdCBtZWRpYWxlYWYpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKG10YWJsZSA9PSBOVUxMKQorCQkJcmV0dXJuOwkJCQkvKiBIb3JyaWJsZSwgaW1wb3NzaWJsZSBmYWlsdXJlLiAqLworCQlsYXN0X21lZGlhdGFibGUgPSB0cC0+bXRhYmxlID0gbXRhYmxlOworCQltdGFibGUtPmRlZmF1bHRtZWRpYSA9IG1lZGlhOworCQltdGFibGUtPmxlYWZjb3VudCA9IGNvdW50OworCQltdGFibGUtPmNzcjEyZGlyID0gY3NyMTJkaXI7CisJCW10YWJsZS0+aGFzX25vbm1paSA9IG10YWJsZS0+aGFzX21paSA9IG10YWJsZS0+aGFzX3Jlc2V0ID0gMDsKKwkJbXRhYmxlLT5jc3IxNWRpciA9IG10YWJsZS0+Y3NyMTV2YWwgPSAwOworCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAgRUVQUk9NIGRlZmF1bHQgbWVkaWEgdHlwZSAlcy5cbiIsIGRldi0+bmFtZSwKKwkJCSAgIG1lZGlhICYgMHgwODAwID8gIkF1dG9zZW5zZSIgOiBtZWRpYW5hbWVbbWVkaWEgJiBNRURJQV9NQVNLXSk7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlzdHJ1Y3QgbWVkaWFsZWFmICpsZWFmID0gJm10YWJsZS0+bWxlYWZbaV07CisKKwkJCWlmICgocFswXSAmIDB4ODApID09IDApIHsgLyogMjExNDAgQ29tcGFjdCBibG9jay4gKi8KKwkJCQlsZWFmLT50eXBlID0gMDsKKwkJCQlsZWFmLT5tZWRpYSA9IHBbMF0gJiAweDNmOworCQkJCWxlYWYtPmxlYWZkYXRhID0gcDsKKwkJCQlpZiAoKHBbMl0gJiAweDYxKSA9PSAweDAxKQkvKiBCb2d1cywgYnV0IFpueXggYm9hcmRzIGRvIGl0LiAqLworCQkJCQltdGFibGUtPmhhc19taWkgPSAxOworCQkJCXAgKz0gNDsKKwkJCX0gZWxzZSB7CisJCQkJbGVhZi0+dHlwZSA9IHBbMV07CisJCQkJaWYgKHBbMV0gPT0gMHgwNSkgeworCQkJCQltdGFibGUtPmhhc19yZXNldCA9IGk7CisJCQkJCWxlYWYtPm1lZGlhID0gcFsyXSAmIDB4MGY7CisJCQkJfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBETTkxMFggJiYgcFsxXSA9PSAweDgwKSB7CisJCQkJCS8qIEhhY2sgdG8gaWdub3JlIERhdmljb20gZGVsYXkgcGVyaW9kIGJsb2NrICovCisJCQkJCW10YWJsZS0+bGVhZmNvdW50LS07CisJCQkJCWNvdW50LS07CisJCQkJCWktLTsKKwkJCQkJbGVhZi0+bGVhZmRhdGEgPSBwICsgMjsKKwkJCQkJcCArPSAocFswXSAmIDB4M2YpICsgMTsKKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIGlmIChwWzFdICYgMSkgeworCQkJCQlpbnQgZ3ByX2xlbiwgcmVzZXRfbGVuOworCisJCQkJCW10YWJsZS0+aGFzX21paSA9IDE7CisJCQkJCWxlYWYtPm1lZGlhID0gMTE7CisJCQkJCWdwcl9sZW49cFszXSoyOworCQkJCQlyZXNldF9sZW49cFs0K2dwcl9sZW5dKjI7CisJCQkJCW5ld19hZHZlcnRpc2UgfD0gZ2V0X3UxNigmcFs3K2dwcl9sZW4rcmVzZXRfbGVuXSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbXRhYmxlLT5oYXNfbm9ubWlpID0gMTsKKwkJCQkJbGVhZi0+bWVkaWEgPSBwWzJdICYgTUVESUFfTUFTSzsKKwkJCQkJLyogRGF2aWNvbSdzIG1lZGlhIG51bWJlciBmb3IgMTAwQmFzZVRYIGlzIHN0cmFuZ2UgKi8KKwkJCQkJaWYgKHRwLT5jaGlwX2lkID09IERNOTEwWCAmJiBsZWFmLT5tZWRpYSA9PSAxKQorCQkJCQkJbGVhZi0+bWVkaWEgPSAzOworCQkJCQlzd2l0Y2ggKGxlYWYtPm1lZGlhKSB7CisJCQkJCWNhc2UgMDogbmV3X2FkdmVydGlzZSB8PSAweDAwMjA7IGJyZWFrOworCQkJCQljYXNlIDQ6IG5ld19hZHZlcnRpc2UgfD0gMHgwMDQwOyBicmVhazsKKwkJCQkJY2FzZSAzOiBuZXdfYWR2ZXJ0aXNlIHw9IDB4MDA4MDsgYnJlYWs7CisJCQkJCWNhc2UgNTogbmV3X2FkdmVydGlzZSB8PSAweDAxMDA7IGJyZWFrOworCQkJCQljYXNlIDY6IG5ld19hZHZlcnRpc2UgfD0gMHgwMjAwOyBicmVhazsKKwkJCQkJfQorCQkJCQlpZiAocFsxXSA9PSAyICAmJiAgbGVhZi0+bWVkaWEgPT0gMCkgeworCQkJCQkJaWYgKHBbMl0gJiAweDQwKSB7CisJCQkJCQkJdTMyIGJhc2UxNSA9IGdldF91bmFsaWduZWQoKHUxNiopJnBbN10pOworCQkJCQkJCW10YWJsZS0+Y3NyMTVkaXIgPQorCQkJCQkJCQkoZ2V0X3VuYWxpZ25lZCgodTE2KikmcFs5XSk8PDE2KSArIGJhc2UxNTsKKwkJCQkJCQltdGFibGUtPmNzcjE1dmFsID0KKwkJCQkJCQkJKGdldF91bmFsaWduZWQoKHUxNiopJnBbMTFdKTw8MTYpICsgYmFzZTE1OworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQltdGFibGUtPmNzcjE1ZGlyID0gZ2V0X3VuYWxpZ25lZCgodTE2KikmcFszXSk8PDE2OworCQkJCQkJCW10YWJsZS0+Y3NyMTV2YWwgPSBnZXRfdW5hbGlnbmVkKCh1MTYqKSZwWzVdKTw8MTY7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJbGVhZi0+bGVhZmRhdGEgPSBwICsgMjsKKwkJCQlwICs9IChwWzBdICYgMHgzZikgKyAxOworCQkJfQorCQkJaWYgKHR1bGlwX2RlYnVnID4gMSAgJiYgIGxlYWYtPm1lZGlhID09IDExKSB7CisJCQkJdW5zaWduZWQgY2hhciAqYnAgPSBsZWFmLT5sZWFmZGF0YTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogIE1JSSBpbnRlcmZhY2UgUEhZICVkLCBzZXR1cC9yZXNldCAiCisJCQkJCSAgICJzZXF1ZW5jZXMgJWQvJWQgbG9uZywgY2FwYWJpbGl0aWVzICUyLjJ4ICUyLjJ4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBicFswXSwgYnBbMV0sIGJwWzIgKyBicFsxXSoyXSwKKwkJCQkJICAgYnBbNSArIGJwWzIgKyBicFsxXSoyXSoyXSwgYnBbNCArIGJwWzIgKyBicFsxXSoyXSoyXSk7CisJCQl9CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogIEluZGV4ICMlZCAtIE1lZGlhICVzICgjJWQpIGRlc2NyaWJlZCAiCisJCQkJICAgImJ5IGEgJXMgKCVkKSBibG9jay5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpLCBtZWRpYW5hbWVbbGVhZi0+bWVkaWEgJiAxNV0sIGxlYWYtPm1lZGlhLAorCQkJCSAgIGxlYWYtPnR5cGUgPCBBUlJBWV9TSVpFKGJsb2NrX25hbWUpID8gYmxvY2tfbmFtZVtsZWFmLT50eXBlXSA6ICI8dW5rbm93bj4iLAorCQkJCSAgIGxlYWYtPnR5cGUpOworCQl9CisJCWlmIChuZXdfYWR2ZXJ0aXNlKQorCQkJdHAtPnN5bV9hZHZlcnRpc2UgPSBuZXdfYWR2ZXJ0aXNlOworCX0KK30KKy8qIFJlYWRpbmcgYSBzZXJpYWwgRUVQUk9NIGlzIGEgImJpdCIgZ3J1bmd5LCBidXQgd2Ugd29yayBvdXIgd2F5IHRocm91Z2g6LT4uKi8KKworLyogIEVFUFJPTV9DdHJsIGJpdHMuICovCisjZGVmaW5lIEVFX1NISUZUX0NMSwkweDAyCS8qIEVFUFJPTSBzaGlmdCBjbG9jay4gKi8KKyNkZWZpbmUgRUVfQ1MJCTB4MDEJLyogRUVQUk9NIGNoaXAgc2VsZWN0LiAqLworI2RlZmluZSBFRV9EQVRBX1dSSVRFCTB4MDQJLyogRGF0YSBmcm9tIHRoZSBUdWxpcCB0byBFRVBST00uICovCisjZGVmaW5lIEVFX1dSSVRFXzAJMHgwMQorI2RlZmluZSBFRV9XUklURV8xCTB4MDUKKyNkZWZpbmUgRUVfREFUQV9SRUFECTB4MDgJLyogRGF0YSBmcm9tIHRoZSBFRVBST00gY2hpcC4gKi8KKyNkZWZpbmUgRUVfRU5CCQkoMHg0ODAwIHwgRUVfQ1MpCisKKy8qIERlbGF5IGJldHdlZW4gRUVQUk9NIGNsb2NrIHRyYW5zaXRpb25zLgorICAgRXZlbiBhdCAzM01oeiBjdXJyZW50IFBDSSBpbXBsZW1lbnRhdGlvbnMgZG9uJ3Qgb3ZlcnJ1biB0aGUgRUVQUk9NIGNsb2NrLgorICAgV2UgYWRkIGEgYnVzIHR1cm4tYXJvdW5kIHRvIGluc3VyZSB0aGF0IHRoaXMgcmVtYWlucyB0cnVlLiAqLworI2RlZmluZSBlZXByb21fZGVsYXkoKQlpb3JlYWQzMihlZV9hZGRyKQorCisvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KKyNkZWZpbmUgRUVfUkVBRF9DTUQJCSg2KQorCisvKiBOb3RlOiB0aGlzIHJvdXRpbmUgcmV0dXJucyBleHRyYSBkYXRhIGJpdHMgZm9yIHNpemUgZGV0ZWN0aW9uLiAqLworaW50IF9fZGV2aW5pdCB0dWxpcF9yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbG9jYXRpb24sIGludCBhZGRyX2xlbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCByZXR2YWwgPSAwOworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmVlX2FkZHIgPSB0cC0+YmFzZV9hZGRyICsgQ1NSOTsKKwlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IChFRV9SRUFEX0NNRCA8PCBhZGRyX2xlbik7CisKKwlpb3dyaXRlMzIoRUVfRU5CICYgfkVFX0NTLCBlZV9hZGRyKTsKKwlpb3dyaXRlMzIoRUVfRU5CLCBlZV9hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gNCArIGFkZHJfbGVuOyBpID49IDA7IGktLSkgeworCQlzaG9ydCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfREFUQV9XUklURSA6IDA7CisJCWlvd3JpdGUzMihFRV9FTkIgfCBkYXRhdmFsLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJCWlvd3JpdGUzMihFRV9FTkIgfCBkYXRhdmFsIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlvcmVhZDMyKGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKwl9CisJaW93cml0ZTMyKEVFX0VOQiwgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5KCk7CisKKwlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworCQlpb3dyaXRlMzIoRUVfRU5CIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlvcmVhZDMyKGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKwkJaW93cml0ZTMyKEVFX0VOQiwgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSgpOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKwlpb3dyaXRlMzIoRUVfRU5CICYgfkVFX0NTLCBlZV9hZGRyKTsKKwlyZXR1cm4gKHRwLT5mbGFncyAmIEhBU19TV0FQUEVEX1NFRVBST00pID8gc3dhYjE2KHJldHZhbCkgOiByZXR2YWw7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2ludGVycnVwdC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvaW50ZXJydXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiNWNkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2ludGVycnVwdC5jCkBAIC0wLDAgKzEsNzg2IEBACisvKgorCWRyaXZlcnMvbmV0L3R1bGlwL2ludGVycnVwdC5jCisKKwlNYWludGFpbmVkIGJ5IEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKwlDb3B5cmlnaHQgMjAwMCwyMDAxICBUaGUgTGludXggS2VybmVsIFRlYW0KKwlXcml0dGVuL2NvcHlyaWdodCAxOTk0LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJUGxlYXNlIHJlZmVyIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay90dWxpcC11c2VyLntwZGYscHMsaHRtbH0KKwlmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGRyaXZlciwgb3IgdmlzaXQgdGhlIHByb2plY3QKKwlXZWIgcGFnZSBhdCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3R1bGlwLworCisqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSAidHVsaXAuaCIKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCitpbnQgdHVsaXBfcnhfY29weWJyZWFrOwordW5zaWduZWQgaW50IHR1bGlwX21heF9pbnRlcnJ1cHRfd29yazsKKworI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJX0hXX01JVElHQVRJT04KKyNkZWZpbmUgTUlUX1NJWkUgMTUKKyNkZWZpbmUgTUlUX1RBQkxFIDE1IC8qIFdlIHVzZSAwIG9yIG1heCAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IG1pdF90YWJsZVtNSVRfU0laRSsxXSA9Cit7CisgICAgICAgIC8qICBDUlMxMSAyMTE0MyBoYXJkd2FyZSBNaXRpZ2F0aW9uIENvbnRyb2wgSW50ZXJydXB0CisgICAgICAgICAgICBXZSB1c2Ugb25seSBSWCBtaXRpZ2F0aW9uIHdlIG90aGVyIHRlY2huaXF1ZXMgZm9yCisgICAgICAgICAgICBUWCBpbnRyLiBtaXRpZ2F0aW9uLgorCisgICAgICAgICAgIDMxICAgIEN5Y2xlIFNpemUgKHRpbWVyIGNvbnRyb2wpCisgICAgICAgICAgIDMwOjI3IFRYIHRpbWVyIGluIDE2ICogQ3ljbGUgc2l6ZQorICAgICAgICAgICAyNjoyNCBUWCBObyBwa3RzIGJlZm9yZSBJbnQuCisgICAgICAgICAgIDIzOjIwIFJYIHRpbWVyIGluIEN5Y2xlIHNpemUKKyAgICAgICAgICAgMTk6MTcgUlggTm8gcGt0cyBiZWZvcmUgSW50LgorICAgICAgICAgICAxNiAgICAgICBDb250aW51ZXMgTW9kZSAoQ00pCisgICAgICAgICovCisKKyAgICAgICAgMHgwLCAgICAgICAgICAgICAvKiBJTSBkaXNhYmxlZCAqLworICAgICAgICAweDgwMTUwMDAwLCAgICAgIC8qIFJYIHRpbWUgPSAxLCBSWCBwa3RzID0gMiwgQ00gPSAxICovCisgICAgICAgIDB4ODAxNTAwMDAsCisgICAgICAgIDB4ODAyNzAwMDAsCisgICAgICAgIDB4ODAzNzAwMDAsCisgICAgICAgIDB4ODA0OTAwMDAsCisgICAgICAgIDB4ODA1OTAwMDAsCisgICAgICAgIDB4ODA2OTAwMDAsCisgICAgICAgIDB4ODA3QjAwMDAsCisgICAgICAgIDB4ODA4QjAwMDAsCisgICAgICAgIDB4ODA5RDAwMDAsCisgICAgICAgIDB4ODBBRDAwMDAsCisgICAgICAgIDB4ODBCRDAwMDAsCisgICAgICAgIDB4ODBDRjAwMDAsCisgICAgICAgIDB4ODBERjAwMDAsCisvLyAgICAgICAweDgwRkYwMDAwICAgICAgLyogUlggdGltZSA9IDE2LCBSWCBwa3RzID0gNywgQ00gPSAxICovCisgICAgICAgIDB4ODBGMTAwMDAgICAgICAvKiBSWCB0aW1lID0gMTYsIFJYIHBrdHMgPSAwLCBDTSA9IDEgKi8KK307CisjZW5kaWYKKworCitpbnQgdHVsaXBfcmVmaWxsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnk7CisJaW50IHJlZmlsbGVkID0gMDsKKworCS8qIFJlZmlsbCB0aGUgUnggcmluZyBidWZmZXJzLiAqLworCWZvciAoOyB0cC0+Y3VyX3J4IC0gdHAtPmRpcnR5X3J4ID4gMDsgdHAtPmRpcnR5X3J4KyspIHsKKwkJZW50cnkgPSB0cC0+ZGlydHlfcnggJSBSWF9SSU5HX1NJWkU7CisJCWlmICh0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiID09IE5VTEwpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwkJCXNrYiA9IHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2IgPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWJyZWFrOworCisJCQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHNrYi0+dGFpbCwgUEtUX0JVRl9TWiwKKwkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJdHAtPnJ4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcgPSBtYXBwaW5nOworCisJCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCQl0cC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IGNwdV90b19sZTMyKG1hcHBpbmcpOworCQkJcmVmaWxsZWQrKzsKKwkJfQorCQl0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bmVkKTsKKwl9CisJaWYodHAtPmNoaXBfaWQgPT0gTEM4MkMxNjgpIHsKKwkJaWYoKChpb3JlYWQzMih0cC0+YmFzZV9hZGRyICsgQ1NSNSk+PjE3KSYweDA3KSA9PSA0KSB7CisJCQkvKiBSeCBzdG9wcGVkIGR1ZSB0byBvdXQgb2YgYnVmZmVycywKKwkJCSAqIHJlc3RhcnQgaXQKKwkJCSAqLworCQkJaW93cml0ZTMyKDB4MDEsIHRwLT5iYXNlX2FkZHIgKyBDU1IyKTsKKwkJfQorCX0KKwlyZXR1cm4gcmVmaWxsZWQ7Cit9CisKKyNpZmRlZiBDT05GSUdfVFVMSVBfTkFQSQorCit2b2lkIG9vbV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCW5ldGlmX3J4X3NjaGVkdWxlKGRldik7Cit9CisKK2ludCB0dWxpcF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5ID0gdHAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlpbnQgcnhfd29ya19saW1pdCA9ICpidWRnZXQ7CisJaW50IHJlY2VpdmVkID0gMDsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlnb3RvIGRvbmU7CisKKwlpZiAocnhfd29ya19saW1pdCA+IGRldi0+cXVvdGEpCisJCXJ4X3dvcmtfbGltaXQgPSBkZXYtPnF1b3RhOworCisjaWZkZWYgQ09ORklHX1RVTElQX05BUElfSFdfTUlUSUdBVElPTgorCisvKiB0aGF0IG9uZSBidWZmZXIgaXMgbmVlZGVkIGZvciBtaXQgYWN0aXZhdGlvbjsgb3IgbWlnaHQgYmUgYQorICAgYnVnIGluIHRoZSByaW5nIGJ1ZmZlciBjb2RlOyBjaGVjayBsYXRlciAtLSBKSFMqLworCisgICAgICAgIGlmIChyeF93b3JrX2xpbWl0ID49UlhfUklOR19TSVpFKSByeF93b3JrX2xpbWl0LS07CisjZW5kaWYKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDQpCisJCXByaW50ayhLRVJOX0RFQlVHICIgSW4gdHVsaXBfcngoKSwgZW50cnkgJWQgJTguOHguXG4iLCBlbnRyeSwKKwkJCSAgIHRwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCisgICAgICAgZG8geworCQlpZiAoaW9yZWFkMzIodHAtPmJhc2VfYWRkciArIENTUjUpID09IDB4ZmZmZmZmZmYpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgSW4gdHVsaXBfcG9sbCgpLCBoYXJkd2FyZSBkaXNhcHBlYXJlZC5cbiIpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgICAgICAgIC8qIEFja25vd2xlZGdlIGN1cnJlbnQgUlggaW50ZXJydXB0IHNvdXJjZXMuICovCisgICAgICAgICAgICAgICBpb3dyaXRlMzIoKFJ4SW50ciB8IFJ4Tm9CdWYpLCB0cC0+YmFzZV9hZGRyICsgQ1NSNSk7CisgCisgCisgICAgICAgICAgICAgICAvKiBJZiB3ZSBvd24gdGhlIG5leHQgZW50cnksIGl0IGlzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKyAgICAgICAgICAgICAgIHdoaWxlICggISAodHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyAmIGNwdV90b19sZTMyKERlc2NPd25lZCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgIHMzMiBzdGF0dXMgPSBsZTMyX3RvX2NwdSh0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKKyAKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRwLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSA9PSB0cC0+Y3VyX3J4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworIAorICAgICAgICAgICAgICAgICAgICAgICBpZiAodHVsaXBfZGVidWcgPiA1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogSW4gdHVsaXBfcngoKSwgZW50cnkgJWQgJTguOHguXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGVudHJ5LCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1yeF93b3JrX2xpbWl0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG5vdF9kb25lOworIAorICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXR1cyAmIDB4MzgwMDgzMDApICE9IDB4MDMwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdHVzICYgMHgzODAwMDMwMCkgIT0gMHgwMzAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluZ29yZSBlYXJsaWVyIGJ1ZmZlcnMuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXR1cyAmIDB4ZmZmZikgIT0gMHg3ZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCBmcmFtZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGFubmVkIG11bHRpcGxlIGJ1ZmZlcnMsIHN0YXR1cyAlOC44eCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAmIFJ4RGVzY0ZhdGFsRXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZXJlIHdhcyBhIGZhdGFsIGVycm9yLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWNlaXZlIGVycm9yLCBSeCBzdGF0dXMgJTguOHguXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBlbmQgb2YgYSBwYWNrZXQuKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiAweDA4OTApIHRwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgMHgwMDA0KSB0cC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgMHgwMDAyKSB0cC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmIDB4MDAwMSkgdHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9taXQgdGhlIGZvdXIgb2N0ZXQgQ1JDIGZyb20gdGhlIGxlbmd0aC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBwa3RfbGVuID0gKChzdGF0dXMgPj4gMTYpICYgMHg3ZmYpIC0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworICAKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwa3RfbGVuID4gMTUxOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEJvZ3VzIHBhY2tldCBzaXplIG9mICVkICglI3gpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIHBrdF9sZW4sIHBrdF9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2xlbiA9IDE1MTg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8gYWNjZXB0IHdpdGhvdXQgY29weWluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGt0X2xlbiA8IHR1bGlwX3J4X2NvcHlicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiX3Jlc2VydmUoc2tiLCAyKTsgICAgLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodHAtPnBkZXYsCisJCQkJCQkJCSAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nLAorCQkJCQkJCQkgICBwa3RfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworI2lmICEgZGVmaW5lZChfX2FscGhhX18pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGhfY29weV9hbmRfc3VtKHNrYiwgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLnNrYi0+dGFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2xlbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2JfcHV0KHNrYiwgcGt0X2xlbik7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiLT50YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9sZW4pOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UodHAtPnBkZXYsCisJCQkJCQkJCSAgICAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nLAorCQkJCQkJCQkgICAgICBwa3RfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAvKiBQYXNzIHVwIHRoZSBza2IgYWxyZWFkeSBvbiB0aGUgUnggcmluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnRlbXAgPSBza2JfcHV0KHNrYiA9IHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3RfbGVuKTsKKyAgCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZyAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KHRwLT5yeF9yaW5nW2VudHJ5XS5idWZmZXIxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBJbnRlcm5hbCBmYXVsdDogVGhlIHNrYnVmZiBhZGRyZXNzZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvIG5vdCBtYXRjaCBpbiB0dWxpcF9yeDogJTA4eCB2cy4gJTA4bGx4ICVwIC8gJXAuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGUzMl90b19jcHUodHAtPnJ4X3JpbmdbZW50cnldLmJ1ZmZlcjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+aGVhZCwgdGVtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtUX0JVRl9TWiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKyAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKyAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQrKzsKKworICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9ICgrK3RwLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworICAgICAgICAgICAgICAgICAgICAgICBpZiAodHAtPmN1cl9yeCAtIHRwLT5kaXJ0eV9yeCA+IFJYX1JJTkdfU0laRS80KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1bGlwX3JlZmlsbF9yeChkZXYpOworIAorICAgICAgICAgICAgICAgIH0KKyAKKyAgICAgICAgICAgICAgIC8qIE5ldyBhY2sgc3RyYXRlZ3kuLi4gaXJxIGRvZXMgbm90IGFjayBSeCBhbnkgbG9uZ2VyCisgICAgICAgICAgICAgICAgICBob3BlZnVsbHkgdGhpcyBoZWxwcyAqLworIAorICAgICAgICAgICAgICAgLyogUmVhbGx5IGJhZCB0aGluZ3MgY2FuIGhhcHBlbiBoZXJlLi4uIElmIG5ldyBwYWNrZXQgYXJyaXZlcworICAgICAgICAgICAgICAgICogYW5kIGFuIGlycSBhcnJpdmVzICh0eCBvciBqdXN0IGR1ZSB0byBvY2Nhc2lvbmFsbHkgdW5zZXQKKyAgICAgICAgICAgICAgICAqIG1hc2spLCBpdCB3aWxsIGJlIGFja2VkIGJ5IGlycSBoYW5kbGVyLCBidXQgbmV3IHRocmVhZAorICAgICAgICAgICAgICAgICogaXMgbm90IHNjaGVkdWxlZC4gSXQgaXMgbWFqb3IgaG9sZSBpbiBkZXNpZ24uCisgICAgICAgICAgICAgICAgKiBObyBpZGVhIGhvdyB0byBmaXggdGhpcyBpZiAicGxheWluZyB3aXRoIGZpcmUiIHdpbGwgZmFpbAorICAgICAgICAgICAgICAgICogdG9tb3Jyb3cgKG5pZ2h0IDAxMTAyOSkuIElmIGl0IHdpbGwgbm90IGZhaWwsIHdlIHdvbgorICAgICAgICAgICAgICAgICogZmluYWxseTogYW1vdW50IG9mIElPIGRpZCBub3QgaW5jcmVhc2UgYXQgYWxsLiAqLworICAgICAgIH0gd2hpbGUgKChpb3JlYWQzMih0cC0+YmFzZV9hZGRyICsgQ1NSNSkgJiBSeEludHIpKTsKKyAKK2RvbmU6CisgCisgI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJX0hXX01JVElHQVRJT04KKyAgCisgICAgICAgICAgLyogV2UgdXNlIHRoaXMgc2ltcGxpc3RpYyBzY2hlbWUgZm9yIElNLiBJdCdzIHByb3ZlbiBieQorICAgICAgICAgICAgIHJlYWwgbGlmZSBpbnN0YWxsYXRpb25zLiBXZSBjYW4gaGF2ZSBJTSBlbmFibGVkCisgICAgICAgICAgICBjb250aW51ZXNseSBidXQgdGhpcyB3b3VsZCBjYXVzZSB1bm5lY2Vzc2FyeSBsYXRlbmN5LiAKKyAgICAgICAgICAgIFVuZm9ydHVuZWx5IHdlIGNhbid0IHVzZSBhbGwgdGhlIE5FVF9SWF8qIGZlZWRiYWNrIGhlcmUuIAorICAgICAgICAgICAgVGhpcyB3b3VsZCB0dXJuIG9uIElNIGZvciBkZXZpY2VzIHRoYXQgaXMgbm90IGNvbnRyaWJ1dGluZyAKKyAgICAgICAgICAgIHRvIGJhY2tsb2cgY29uZ2VzdGlvbiB3aXRoIHVubmVjZXNzYXJ5IGxhdGVuY3kuIAorICAKKyAgICAgICAgICAgICBXZSBtb25pdG9yIHRoZSB0aGUgZGV2aWNlIFJYLXJpbmcgYW5kIGhhdmU6CisgIAorICAgICAgICAgICAgIEhXIEludGVycnVwdCBNaXRpZ2F0aW9uIGVpdGhlciBPTiBvciBPRkYuCisgIAorICAgICAgICAgICAgT046ICBNb3JlIHRoZW4gMSBwa3QgcmVjZWl2ZWQgKHBlciBpbnRyLikgT1Igd2UgYXJlIGRyb3BwaW5nIAorICAgICAgICAgICAgIE9GRjogT25seSAxIHBrdCByZWNlaXZlZAorICAgICAgICAgICAgCisgICAgICAgICAgICAgTm90ZS4gV2Ugb25seSB1c2UgbWluIGFuZCBtYXggKDAsIDE1KSBzZXR0aW5ncyBmcm9tIG1pdF90YWJsZSAqLworICAKKyAgCisgICAgICAgICAgaWYoIHRwLT5mbGFncyAmICBIQVNfSU5UUl9NSVRJR0FUSU9OKSB7CisgICAgICAgICAgICAgICAgIGlmKCByZWNlaXZlZCA+IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgdHAtPm1pdF9vbiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5taXRfb24gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW93cml0ZTMyKG1pdF90YWJsZVtNSVRfVEFCTEVdLCB0cC0+YmFzZV9hZGRyICsgQ1NSMTEpOworICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRwLT5taXRfb24gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bWl0X29uID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCB0cC0+YmFzZV9hZGRyICsgQ1NSMTEpOworICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyNlbmRpZiAvKiBDT05GSUdfVFVMSVBfTkFQSV9IV19NSVRJR0FUSU9OICovCisgCisgICAgICAgICBkZXYtPnF1b3RhIC09IHJlY2VpdmVkOworICAgICAgICAgKmJ1ZGdldCAtPSByZWNlaXZlZDsKKyAKKyAgICAgICAgIHR1bGlwX3JlZmlsbF9yeChkZXYpOworICAgICAgICAgCisgICAgICAgICAvKiBJZiBSWCByaW5nIGlzIG5vdCBmdWxsIHdlIGFyZSBvdXQgb2YgbWVtb3J5LiAqLworICAgICAgICAgaWYgKHRwLT5yeF9idWZmZXJzW3RwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRV0uc2tiID09IE5VTEwpIGdvdG8gb29tOworIAorICAgICAgICAgLyogUmVtb3ZlIHVzIGZyb20gcG9sbGluZyBsaXN0IGFuZCBlbmFibGUgUlggaW50ci4gKi8KKyAKKyAgICAgICAgIG5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisgICAgICAgICBpb3dyaXRlMzIodHVsaXBfdGJsW3RwLT5jaGlwX2lkXS52YWxpZF9pbnRycywgdHAtPmJhc2VfYWRkcitDU1I3KTsKKyAKKyAgICAgICAgIC8qIFRoZSBsYXN0IG9wIGhhcHBlbnMgYWZ0ZXIgcG9sbCBjb21wbGV0aW9uLiBXaGljaCBtZWFucyB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICogMS4gaXQgY2FuIHJhY2Ugd2l0aCBkaXNhYmxpbmcgaXJxcyBpbiBpcnEgaGFuZGxlcgorICAgICAgICAgICogMi4gaXQgY2FuIHJhY2Ugd2l0aCBkaXNlL2VuYWJsaW5nIGlycXMgaW4gb3RoZXIgcG9sbCB0aHJlYWRzCisgICAgICAgICAgKiAzLiBpZiBhbiBpcnEgcmFpc2VkIGFmdGVyIGJlZ2lubmluZyBsb29wLCBpdCB3aWxsIGJlIGltbWVkaWF0ZWx5CisgICAgICAgICAgKiAgICB0cmlnZ2VyZWQgaGVyZS4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBTdW1tYXJpemluZzogdGhlIGxvZ2ljIHJlc3VsdHMgaW4gc29tZSByZWR1bmRhbnQgaXJxcyBib3RoCisgICAgICAgICAgKiBkdWUgdG8gcmFjZXMgaW4gbWFza2luZyBhbmQgZHVlIHRvIHRvbyBsYXRlIGFja2luZyBvZiBhbHJlYWR5CisgICAgICAgICAgKiBwcm9jZXNzZWQgaXJxcy4gQnV0IGl0IG11c3Qgbm90IHJlc3VsdCBpbiBsb3NpbmcgZXZlbnRzLgorICAgICAgICAgICovCisgCisgICAgICAgICByZXR1cm4gMDsKKyAKKyBub3RfZG9uZToKKyAgICAgICAgIGlmICghcmVjZWl2ZWQpIHsKKworICAgICAgICAgICAgICAgICByZWNlaXZlZCA9IGRldi0+cXVvdGE7IC8qIE5vdCB0byBoYXBwZW4gKi8KKyAgICAgICAgIH0KKyAgICAgICAgIGRldi0+cXVvdGEgLT0gcmVjZWl2ZWQ7CisgICAgICAgICAqYnVkZ2V0IC09IHJlY2VpdmVkOworIAorICAgICAgICAgaWYgKHRwLT5jdXJfcnggLSB0cC0+ZGlydHlfcnggPiBSWF9SSU5HX1NJWkUvMiB8fAorICAgICAgICAgICAgIHRwLT5yeF9idWZmZXJzW3RwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRV0uc2tiID09IE5VTEwpCisgICAgICAgICAgICAgICAgIHR1bGlwX3JlZmlsbF9yeChkZXYpOworIAorICAgICAgICAgaWYgKHRwLT5yeF9idWZmZXJzW3RwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRV0uc2tiID09IE5VTEwpIGdvdG8gb29tOworIAorICAgICAgICAgcmV0dXJuIDE7CisgCisgCisgb29tOiAgICAvKiBFeGVjdXRlZCB3aXRoIFJYIGludHMgZGlzYWJsZWQgKi8KKyAKKyAgICAgICAgIAorICAgICAgICAgLyogU3RhcnQgdGltZXIsIHN0b3AgcG9sbGluZywgYnV0IGRvIG5vdCBlbmFibGUgcnggaW50ZXJydXB0cy4gKi8KKyAgICAgICAgIG1vZF90aW1lcigmdHAtPm9vbV90aW1lciwgamlmZmllcysxKTsKKyAgICAgICAKKyAgICAgICAgIC8qIFRoaW5rOiB0aW1lcl9wZW5kaW5nKCkgd2FzIGFuIGV4cGxpY2l0IHNpZ25hdHVyZSBvZiBidWcuCisgICAgICAgICAgKiBUaW1lciBjYW4gYmUgcGVuZGluZyBub3cgYnV0IGZpcmVkIGFuZCBjb21wbGV0ZWQKKyAgICAgICAgICAqIGJlZm9yZSB3ZSBkaWQgbmV0aWZfcnhfY29tcGxldGUoKS4gU2VlPyBXZSB3b3VsZCBsb3NlIGl0LiAqLworIAorICAgICAgICAgLyogcmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBwb2xsaW5nIGxpc3QgKi8KKyAgICAgICAgIG5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisgCisgICAgICAgICByZXR1cm4gMDsKK30KKworI2Vsc2UgLyogQ09ORklHX1RVTElQX05BUEkgKi8KKworc3RhdGljIGludCB0dWxpcF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5ID0gdHAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlpbnQgcnhfd29ya19saW1pdCA9IHRwLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSAtIHRwLT5jdXJfcng7CisJaW50IHJlY2VpdmVkID0gMDsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDQpCisJCXByaW50ayhLRVJOX0RFQlVHICIgSW4gdHVsaXBfcngoKSwgZW50cnkgJWQgJTguOHguXG4iLCBlbnRyeSwKKwkJCSAgIHRwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCS8qIElmIHdlIG93biB0aGUgbmV4dCBlbnRyeSwgaXQgaXMgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworCXdoaWxlICggISAodHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyAmIGNwdV90b19sZTMyKERlc2NPd25lZCkpKSB7CisJCXMzMiBzdGF0dXMgPSBsZTMyX3RvX2NwdSh0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKKworCQlpZiAodHVsaXBfZGVidWcgPiA1KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbiB0dWxpcF9yeCgpLCBlbnRyeSAlZCAlOC44eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBlbnRyeSwgc3RhdHVzKTsKKwkJaWYgKC0tcnhfd29ya19saW1pdCA8IDApCisJCQlicmVhazsKKwkJaWYgKChzdGF0dXMgJiAweDM4MDA4MzAwKSAhPSAweDAzMDApIHsKKwkJCWlmICgoc3RhdHVzICYgMHgzODAwMDMwMCkgIT0gMHgwMzAwKSB7CisJCQkJLyogSW5nb3JlIGVhcmxpZXIgYnVmZmVycy4gKi8KKwkJCQlpZiAoKHN0YXR1cyAmIDB4ZmZmZikgIT0gMHg3ZmZmKSB7CisJCQkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3ZlcnNpemVkIEV0aGVybmV0IGZyYW1lICIKKwkJCQkJCQkgICAic3Bhbm5lZCBtdWx0aXBsZSBidWZmZXJzLCBzdGF0dXMgJTguOHghXG4iLAorCQkJCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCQkJdHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFJ4RGVzY0ZhdGFsRXJyKSB7CisJCQkJLyogVGhlcmUgd2FzIGEgZmF0YWwgZXJyb3IuICovCisJCQkJaWYgKHR1bGlwX2RlYnVnID4gMikKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWNlaXZlIGVycm9yLCBSeCBzdGF0dXMgJTguOHguXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJCXRwLT5zdGF0cy5yeF9lcnJvcnMrKzsgLyogZW5kIG9mIGEgcGFja2V0LiovCisJCQkJaWYgKHN0YXR1cyAmIDB4MDg5MCkgdHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgMHgwMDA0KSB0cC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIDB4MDAwMikgdHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgMHgwMDAxKSB0cC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIE9taXQgdGhlIGZvdXIgb2N0ZXQgQ1JDIGZyb20gdGhlIGxlbmd0aC4gKi8KKwkJCXNob3J0IHBrdF9sZW4gPSAoKHN0YXR1cyA+PiAxNikgJiAweDdmZikgLSA0OworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQlpZiAocGt0X2xlbiA+IDE1MTgpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQm9ndXMgcGFja2V0IHNpemUgb2YgJWQgKCUjeCkuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHBrdF9sZW4sIHBrdF9sZW4pOworCQkJCXBrdF9sZW4gPSAxNTE4OworCQkJCXRwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQl9CisjZW5kaWYKKworCQkJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBhY2NlcHQgd2l0aG91dCBjb3B5aW5nCisJCQkgICB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCisJCQlpZiAocGt0X2xlbiA8IHR1bGlwX3J4X2NvcHlicmVhaworCQkJCSYmIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSh0cC0+cGRldiwKKwkJCQkJCQkgICAgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcsCisJCQkJCQkJICAgIHBrdF9sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisjaWYgISBkZWZpbmVkKF9fYWxwaGFfXykKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLnNrYi0+dGFpbCwKKwkJCQkJCSBwa3RfbGVuLCAwKTsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisjZWxzZQorCQkJCW1lbWNweShza2JfcHV0KHNrYiwgcGt0X2xlbiksCisJCQkJICAgICAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2ItPnRhaWwsCisJCQkJICAgICAgIHBrdF9sZW4pOworI2VuZGlmCisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHRwLT5wZGV2LAorCQkJCQkJCSAgICAgICB0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKwkJCQkJCQkgICAgICAgcGt0X2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCX0gZWxzZSB7IAkvKiBQYXNzIHVwIHRoZSBza2IgYWxyZWFkeSBvbiB0aGUgUnggcmluZy4gKi8KKwkJCQljaGFyICp0ZW1wID0gc2tiX3B1dChza2IgPSB0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiLAorCQkJCQkJICAgICBwa3RfbGVuKTsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQkJaWYgKHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nICE9CisJCQkJICAgIGxlMzJfdG9fY3B1KHRwLT5yeF9yaW5nW2VudHJ5XS5idWZmZXIxKSkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnRlcm5hbCBmYXVsdDogVGhlIHNrYnVmZiBhZGRyZXNzZXMgIgorCQkJCQkgICAgICAgImRvIG5vdCBtYXRjaCBpbiB0dWxpcF9yeDogJTA4eCB2cy4gJUx4ICVwIC8gJXAuXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lLAorCQkJCQkgICAgICAgbGUzMl90b19jcHUodHAtPnJ4X3JpbmdbZW50cnldLmJ1ZmZlcjEpLAorCQkJCQkgICAgICAgKGxvbmcgbG9uZyl0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKwkJCQkJICAgICAgIHNrYi0+aGVhZCwgdGVtcCk7CisJCQkJfQorI2VuZGlmCisKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKwkJCQkJCSBQS1RfQlVGX1NaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQkJdHAtPnJ4X2J1ZmZlcnNbZW50cnldLnNrYiA9IE5VTEw7CisJCQkJdHAtPnJ4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcgPSAwOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCQkJbmV0aWZfcngoc2tiKTsKKworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXRwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQl0cC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCQlyZWNlaXZlZCsrOworCQllbnRyeSA9ICgrK3RwLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworCX0KKwlyZXR1cm4gcmVjZWl2ZWQ7Cit9CisjZW5kaWYgIC8qIENPTkZJR19UVUxJUF9OQVBJICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBoeV9pbnRlcnJ1cHQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisjaWZkZWYgX19ocHBhX18KKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBjc3IxMiA9IGlvcmVhZDMyKHRwLT5iYXNlX2FkZHIgKyBDU1IxMikgJiAweGZmOworCisJaWYgKGNzcjEyICE9IHRwLT5jc3IxMl9zaGFkb3cpIHsKKwkJLyogYWNrIGludGVycnVwdCAqLworCQlpb3dyaXRlMzIoY3NyMTIgfCAweDAyLCB0cC0+YmFzZV9hZGRyICsgQ1NSMTIpOworCQl0cC0+Y3NyMTJfc2hhZG93ID0gY3NyMTI7CisJCS8qIGRvIGxpbmsgY2hhbmdlIHN0dWZmICovCisJCXNwaW5fbG9jaygmdHAtPmxvY2spOworCQl0dWxpcF9jaGVja19kdXBsZXgoZGV2KTsKKwkJc3Bpbl91bmxvY2soJnRwLT5sb2NrKTsKKwkJLyogY2xlYXIgaXJxIGFjayBiaXQgKi8KKwkJaW93cml0ZTMyKGNzcjEyICYgfjB4MDIsIHRwLT5iYXNlX2FkZHIgKyBDU1IxMik7CisKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworaXJxcmV0dXJuX3QgdHVsaXBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlpbnQgY3NyNTsKKwlpbnQgbWlzc2VkOworCWludCByeCA9IDA7CisJaW50IHR4ID0gMDsKKwlpbnQgb2kgPSAwOworCWludCBtYXhyeCA9IFJYX1JJTkdfU0laRTsKKwlpbnQgbWF4dHggPSBUWF9SSU5HX1NJWkU7CisJaW50IG1heG9pID0gVFhfUklOR19TSVpFOworI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJCisJaW50IHJ4ZCA9IDA7CisjZWxzZQorCWludCBlbnRyeTsKKyNlbmRpZgorCXVuc2lnbmVkIGludCB3b3JrX2NvdW50ID0gdHVsaXBfbWF4X2ludGVycnVwdF93b3JrOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKworCS8qIExldCdzIHNlZSB3aGV0aGVyIHRoZSBpbnRlcnJ1cHQgcmVhbGx5IGlzIGZvciB1cyAqLworCWNzcjUgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I1KTsKKworICAgICAgICBpZiAodHAtPmZsYWdzICYgSEFTX1BIWV9JUlEpIAorCSAgICAgICAgaGFuZGxlZCA9IHBoeV9pbnRlcnJ1cHQgKGRldik7CisgICAgCisJaWYgKChjc3I1ICYgKE5vcm1hbEludHJ8QWJub3JtYWxJbnRyKSkgPT0gMCkKKwkJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CisKKwl0cC0+bmlyKys7CisKKwlkbyB7CisKKyNpZmRlZiBDT05GSUdfVFVMSVBfTkFQSQorCisJCWlmICghcnhkICYmIChjc3I1ICYgKFJ4SW50ciB8IFJ4Tm9CdWYpKSkgeworCQkJcnhkKys7CisJCQkvKiBNYXNrIFJYIGludHJzIGFuZCBhZGQgdGhlIGRldmljZSB0byBwb2xsIGxpc3QuICovCisJCQlpb3dyaXRlMzIodHVsaXBfdGJsW3RwLT5jaGlwX2lkXS52YWxpZF9pbnRycyZ+UnhQb2xsSW50LCBpb2FkZHIgKyBDU1I3KTsKKwkJCW5ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJCQkKKwkJCWlmICghKGNzcjUmfihBYm5vcm1hbEludHJ8Tm9ybWFsSW50cnxSeFBvbGxJbnR8VFBMbmtQYXNzKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCX0KKwkJCisgICAgICAgICAgICAgICAvKiBBY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0IHNvdXJjZXMgd2UgaGFuZGxlIGhlcmUgQVNBUAorICAgICAgICAgICAgICAgICAgdGhlIHBvbGwgZnVuY3Rpb24gZG9lcyBSeCBhbmQgUnhOb0J1ZiBhY2tpbmcgKi8KKwkJCisJCWlvd3JpdGUzMihjc3I1ICYgMHgwMDAxZmYzZiwgaW9hZGRyICsgQ1NSNSk7CisKKyNlbHNlIAorCQkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKwkJaW93cml0ZTMyKGNzcjUgJiAweDAwMDFmZmZmLCBpb2FkZHIgKyBDU1I1KTsKKworCisJCWlmIChjc3I1ICYgKFJ4SW50ciB8IFJ4Tm9CdWYpKSB7CisJCQkJcnggKz0gdHVsaXBfcngoZGV2KTsKKwkJCXR1bGlwX3JlZmlsbF9yeChkZXYpOworCQl9CisKKyNlbmRpZiAvKiAgQ09ORklHX1RVTElQX05BUEkgKi8KKwkJCisJCWlmICh0dWxpcF9kZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludGVycnVwdCAgY3NyNT0lIzguOHggbmV3IGNzcjU9JSM4Ljh4LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGNzcjUsIGlvcmVhZDMyKGlvYWRkciArIENTUjUpKTsKKwkJCisKKwkJaWYgKGNzcjUgJiAoVHhOb0J1ZiB8IFR4RGllZCB8IFR4SW50ciB8IFRpbWVySW50KSkgeworCQkJdW5zaWduZWQgaW50IGRpcnR5X3R4OworCisJCQlzcGluX2xvY2soJnRwLT5sb2NrKTsKKworCQkJZm9yIChkaXJ0eV90eCA9IHRwLT5kaXJ0eV90eDsgdHAtPmN1cl90eCAtIGRpcnR5X3R4ID4gMDsKKwkJCQkgZGlydHlfdHgrKykgeworCQkJCWludCBlbnRyeSA9IGRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQkJCWludCBzdGF0dXMgPSBsZTMyX3RvX2NwdSh0cC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKKworCQkJCWlmIChzdGF0dXMgPCAwKQorCQkJCQlicmVhazsJCQkvKiBJdCBzdGlsbCBoYXMgbm90IGJlZW4gVHhlZCAqLworCisJCQkJLyogQ2hlY2sgZm9yIFJ4IGZpbHRlciBzZXR1cCBmcmFtZXMuICovCisJCQkJaWYgKHRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPT0gTlVMTCkgeworCQkJCQkvKiB0ZXN0IGJlY2F1c2UgZHVtbXkgZnJhbWVzIG5vdCBtYXBwZWQgKi8KKwkJCQkJaWYgKHRwLT50eF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nKQorCQkJCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwKKwkJCQkJCQkgdHAtPnR4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcsCisJCQkJCQkJIHNpemVvZih0cC0+c2V0dXBfZnJhbWUpLAorCQkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKHN0YXR1cyAmIDB4ODAwMCkgeworCQkJCQkvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBlcnJvciwgVHggc3RhdHVzICU4Ljh4LlxuIiwKKwkJCQkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisjZW5kaWYKKwkJCQkJdHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCQlpZiAoc3RhdHVzICYgMHg0MTA0KSB0cC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJaWYgKHN0YXR1cyAmIDB4MEMwMCkgdHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJCWlmIChzdGF0dXMgJiAweDAyMDApIHRwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQkJCWlmIChzdGF0dXMgJiAweDAwMDIpIHRwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCQlpZiAoKHN0YXR1cyAmIDB4MDA4MCkgJiYgdHAtPmZ1bGxfZHVwbGV4ID09IDApCisJCQkJCQl0cC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQkJCX0gZWxzZSB7CisJCQkJCXRwLT5zdGF0cy50eF9ieXRlcyArPQorCQkJCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYi0+bGVuOworCQkJCQl0cC0+c3RhdHMuY29sbGlzaW9ucyArPSAoc3RhdHVzID4+IDMpICYgMTU7CisJCQkJCXRwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJfQorCisJCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwgdHAtPnR4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcsCisJCQkJCQkgdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYi0+bGVuLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCQkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQkJCWRldl9rZnJlZV9za2JfaXJxKHRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IpOworCQkJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPSBOVUxMOworCQkJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nID0gMDsKKwkJCQl0eCsrOworCQkJfQorCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCWlmICh0cC0+Y3VyX3R4IC0gZGlydHlfdHggPiBUWF9SSU5HX1NJWkUpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQtb2Ytc3luYyBkaXJ0eSBwb2ludGVyLCAlZCB2cy4gJWQuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIGRpcnR5X3R4LCB0cC0+Y3VyX3R4KTsKKwkJCQlkaXJ0eV90eCArPSBUWF9SSU5HX1NJWkU7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKHRwLT5jdXJfdHggLSBkaXJ0eV90eCA8IFRYX1JJTkdfU0laRSAtIDIpCisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJCQl0cC0+ZGlydHlfdHggPSBkaXJ0eV90eDsKKwkJCWlmIChjc3I1ICYgVHhEaWVkKSB7CisJCQkJaWYgKHR1bGlwX2RlYnVnID4gMikKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRoZSB0cmFuc21pdHRlciBzdG9wcGVkLiIKKwkJCQkJCSAgICIgIENTUjUgaXMgJXgsIENTUjYgJXgsIG5ldyBDU1I2ICV4LlxuIiwKKwkJCQkJCSAgIGRldi0+bmFtZSwgY3NyNSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNiksIHRwLT5jc3I2KTsKKwkJCQl0dWxpcF9yZXN0YXJ0X3J4dHgodHApOworCQkJfQorCQkJc3Bpbl91bmxvY2soJnRwLT5sb2NrKTsKKwkJfQorCisJCS8qIExvZyBlcnJvcnMuICovCisJCWlmIChjc3I1ICYgQWJub3JtYWxJbnRyKSB7CS8qIEFibm9ybWFsIGVycm9yIHN1bW1hcnkgYml0LiAqLworCQkJaWYgKGNzcjUgPT0gMHhmZmZmZmZmZikKKwkJCQlicmVhazsKKwkJCWlmIChjc3I1ICYgVHhKYWJiZXIpIHRwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmIChjc3I1ICYgVHhGSUZPVW5kZXJmbG93KSB7CisJCQkJaWYgKCh0cC0+Y3NyNiAmIDB4QzAwMCkgIT0gMHhDMDAwKQorCQkJCQl0cC0+Y3NyNiArPSAweDQwMDA7CS8qIEJ1bXAgdXAgdGhlIFR4IHRocmVzaG9sZCAqLworCQkJCWVsc2UKKwkJCQkJdHAtPmNzcjYgfD0gMHgwMDIwMDAwMDsgIC8qIFN0b3JlLW4tZm9yd2FyZC4gKi8KKwkJCQkvKiBSZXN0YXJ0IHRoZSB0cmFuc21pdCBwcm9jZXNzLiAqLworCQkJCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisJCQkJaW93cml0ZTMyKDAsIGlvYWRkciArIENTUjEpOworCQkJfQorCQkJaWYgKGNzcjUgJiAoUnhEaWVkIHwgUnhOb0J1ZikpIHsKKwkJCQlpZiAodHAtPmZsYWdzICYgQ09NRVRfTUFDX0FERFIpIHsKKwkJCQkJaW93cml0ZTMyKHRwLT5tY19maWx0ZXJbMF0sIGlvYWRkciArIDB4QUMpOworCQkJCQlpb3dyaXRlMzIodHAtPm1jX2ZpbHRlclsxXSwgaW9hZGRyICsgMHhCMCk7CisJCQkJfQorCQkJfQorCQkJaWYgKGNzcjUgJiBSeERpZWQpIHsJCS8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I4KSAmIDB4ZmZmZjsKKwkJCQl0cC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJdHVsaXBfc3RhcnRfcnh0eCh0cCk7CisJCQl9CisJCQkvKgorCQkJICogTkI6IHQyMTE0Ml9sbmtfY2hhbmdlKCkgZG9lcyBhIGRlbF90aW1lcl9zeW5jKCksIHNvIGJlIGNhcmVmdWwgaWYgdGhpcworCQkJICogY2FsbCBpcyBldmVyIGRvbmUgdW5kZXIgdGhlIHNwaW5sb2NrCisJCQkgKi8KKwkJCWlmIChjc3I1ICYgKFRQTG5rUGFzcyB8IFRQTG5rRmFpbCB8IDB4MDgwMDAwMDApKSB7CisJCQkJaWYgKHRwLT5saW5rX2NoYW5nZSkKKwkJCQkJKHRwLT5saW5rX2NoYW5nZSkoZGV2LCBjc3I1KTsKKwkJCX0KKwkJCWlmIChjc3I1ICYgU3l0ZW1FcnJvcikgeworCQkJCWludCBlcnJvciA9IChjc3I1ID4+IDIzKSAmIDc7CisJCQkJLyogb29wcywgd2UgaGl0IGEgUENJIGVycm9yLiAgVGhlIGNvZGUgcHJvZHVjZWQgY29ycmVzcG9uZHMKKwkJCQkgKiB0byB0aGUgcmVhc29uOgorCQkJCSAqICAwIC0gcGFyaXR5IGVycm9yCisJCQkJICogIDEgLSBtYXN0ZXIgYWJvcnQKKwkJCQkgKiAgMiAtIHRhcmdldCBhYm9ydAorCQkJCSAqIE5vdGUgdGhhdCBvbiBwYXJpdHkgZXJyb3IsIHdlIHNob3VsZCBkbyBhIHNvZnR3YXJlIHJlc2V0CisJCQkJICogb2YgdGhlIGNoaXAgdG8gZ2V0IGl0IGJhY2sgaW50byBhIHNhbmUgc3RhdGUgKGFjY29yZGluZworCQkJCSAqIHRvIHRoZSAyMTE0Mi8zIGRvY3MgdGhhdCBpcykuCisJCQkJICogICAtLSBybWsKKwkJCQkgKi8KKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAoJWx1KSBTeXN0ZW0gRXJyb3Igb2NjdXJyZWQgKCVkKVxuIiwKKwkJCQkJZGV2LT5uYW1lLCB0cC0+bmlyLCBlcnJvcik7CisJCQl9CisJCQkvKiBDbGVhciBhbGwgZXJyb3Igc291cmNlcywgaW5jbHVkZWQgdW5kb2N1bWVudGVkIG9uZXMhICovCisJCQlpb3dyaXRlMzIoMHgwODAwZjdiYSwgaW9hZGRyICsgQ1NSNSk7CisJCQlvaSsrOworCQl9CisJCWlmIChjc3I1ICYgVGltZXJJbnQpIHsKKworCQkJaWYgKHR1bGlwX2RlYnVnID4gMikKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZS1lbmFibGluZyBpbnRlcnJ1cHRzLCAlOC44eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgY3NyNSk7CisJCQlpb3dyaXRlMzIodHVsaXBfdGJsW3RwLT5jaGlwX2lkXS52YWxpZF9pbnRycywgaW9hZGRyICsgQ1NSNyk7CisJCQl0cC0+dHRpbWVyID0gMDsKKwkJCW9pKys7CisJCX0KKwkJaWYgKHR4ID4gbWF4dHggfHwgcnggPiBtYXhyeCB8fCBvaSA+IG1heG9pKSB7CisJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGR1cmluZyBhbiBpbnRlcnJ1cHQsICIKKwkJCQkJICAgImNzcjU9MHglOC44eC4gKCVsdSkgKCVkLCVkLCVkKVxuIiwgZGV2LT5uYW1lLCBjc3I1LCB0cC0+bmlyLCB0eCwgcngsIG9pKTsKKworICAgICAgICAgICAgICAgICAgICAgICAvKiBBY2tub3dsZWRnZSBhbGwgaW50ZXJydXB0IHNvdXJjZXMuICovCisgICAgICAgICAgICAgICAgICAgICAgICBpb3dyaXRlMzIoMHg4MDAxZmZmZiwgaW9hZGRyICsgQ1NSNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHAtPmZsYWdzICYgSEFTX0lOVFJfTUlUSUdBVElPTikgeworICAgICAgICAgICAgICAgICAgICAgLyogSm9zaXAgTG9uY2FyaWMgYXQgSUNBU0UgZGlkIGV4dGVuc2l2ZSBleHBlcmltZW50YXRpb24KKwkJCXRvIGRldmVsb3AgYSBnb29kIGludGVycnVwdCBtaXRpZ2F0aW9uIHNldHRpbmcuKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW93cml0ZTMyKDB4OGIyNDAwMDAsIGlvYWRkciArIENTUjExKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gTEM4MkMxNjgpIHsKKwkJCQkvKiB0aGUgTEM4MkMxNjggZG9lc24ndCBoYXZlIGEgaHcgdGltZXIuKi8KKwkJCQlpb3dyaXRlMzIoMHgwMCwgaW9hZGRyICsgQ1NSNyk7CisJCQkJbW9kX3RpbWVyKCZ0cC0+dGltZXIsIFJVTl9BVChIWi81MCkpOworCQkJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFzayBhbGwgaW50ZXJydXB0aW5nIHNvdXJjZXMsIHNldCB0aW1lciB0bworCQkJCXJlLWVuYWJsZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW93cml0ZTMyKCgofmNzcjUpICYgMHgwMDAxZWJlZikgfCBBYm5vcm1hbEludHIgfCBUaW1lckludCwgaW9hZGRyICsgQ1NSNyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvd3JpdGUzMigweDAwMTIsIGlvYWRkciArIENTUjExKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCWJyZWFrOworCQl9CisKKwkJd29ya19jb3VudC0tOworCQlpZiAod29ya19jb3VudCA9PSAwKQorCQkJYnJlYWs7CisKKwkJY3NyNSA9IGlvcmVhZDMyKGlvYWRkciArIENTUjUpOworCisjaWZkZWYgQ09ORklHX1RVTElQX05BUEkKKwkJaWYgKHJ4ZCkKKwkJCWNzcjUgJj0gflJ4UG9sbEludDsKKwl9IHdoaWxlICgoY3NyNSAmIChUeE5vQnVmIHwgCisJCQkgIFR4RGllZCB8IAorCQkJICBUeEludHIgfCAKKwkJCSAgVGltZXJJbnQgfAorCQkJICAvKiBBYm5vcm1hbCBpbnRyLiAqLworCQkJICBSeERpZWQgfCAKKwkJCSAgVHhGSUZPVW5kZXJmbG93IHwgCisJCQkgIFR4SmFiYmVyIHwgCisJCQkgIFRQTG5rRmFpbCB8ICAKKwkJCSAgU3l0ZW1FcnJvciApKSAhPSAwKTsKKyNlbHNlIAorCX0gd2hpbGUgKChjc3I1ICYgKE5vcm1hbEludHJ8QWJub3JtYWxJbnRyKSkgIT0gMCk7CisKKwl0dWxpcF9yZWZpbGxfcngoZGV2KTsKKworCS8qIGNoZWNrIGlmIHRoZSBjYXJkIGlzIGluIHN1c3BlbmQgbW9kZSAqLworCWVudHJ5ID0gdHAtPmRpcnR5X3J4ICUgUlhfUklOR19TSVpFOworCWlmICh0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiID09IE5VTEwpIHsKKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbiByeCBzdXNwZW5kIG1vZGU6ICglbHUpICh0cC0+Y3VyX3J4ID0gJXUsIHR0aW1lciA9ICVkLCByeCA9ICVkKSBnby9zdGF5IGluIHN1c3BlbmQgbW9kZVxuIiwgZGV2LT5uYW1lLCB0cC0+bmlyLCB0cC0+Y3VyX3J4LCB0cC0+dHRpbWVyLCByeCk7CisJCWlmICh0cC0+Y2hpcF9pZCA9PSBMQzgyQzE2OCkgeworCQkJaW93cml0ZTMyKDB4MDAsIGlvYWRkciArIENTUjcpOworCQkJbW9kX3RpbWVyKCZ0cC0+dGltZXIsIFJVTl9BVChIWi81MCkpOworCQl9IGVsc2UgeworCQkJaWYgKHRwLT50dGltZXIgPT0gMCB8fCAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTEpICYgMHhmZmZmKSA9PSAwKSB7CisJCQkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGluIHJ4IHN1c3BlbmQgbW9kZTogKCVsdSkgc2V0IHRpbWVyXG4iLCBkZXYtPm5hbWUsIHRwLT5uaXIpOworCQkJCWlvd3JpdGUzMih0dWxpcF90YmxbdHAtPmNoaXBfaWRdLnZhbGlkX2ludHJzIHwgVGltZXJJbnQsCisJCQkJCWlvYWRkciArIENTUjcpOworCQkJCWlvd3JpdGUzMihUaW1lckludCwgaW9hZGRyICsgQ1NSNSk7CisJCQkJaW93cml0ZTMyKDEyLCBpb2FkZHIgKyBDU1IxMSk7CisJCQkJdHAtPnR0aW1lciA9IDE7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLyogQ09ORklHX1RVTElQX05BUEkgKi8KKworCWlmICgobWlzc2VkID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSOCkgJiAweDFmZmZmKSkgeworCQl0cC0+c3RhdHMucnhfZHJvcHBlZCArPSBtaXNzZWQgJiAweDEwMDAwID8gMHgxMDAwMCA6IG1pc3NlZDsKKwl9CisKKwlpZiAodHVsaXBfZGVidWcgPiA0KQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBjc3I1PSUjNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIENTUjUpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMgYi9kcml2ZXJzL25ldC90dWxpcC9tZWRpYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYWUwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC9tZWRpYS5jCkBAIC0wLDAgKzEsNTYyIEBACisvKgorCWRyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMKKworCU1haW50YWluZWQgYnkgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQorCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlQbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3R1bGlwLXVzZXIue3BkZixwcyxodG1sfQorCWZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgZHJpdmVyLCBvciB2aXNpdCB0aGUgcHJvamVjdAorCVdlYiBwYWdlIGF0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdHVsaXAvCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJ0dWxpcC5oIgorCisKKy8qIFRoZSBtYXhpbXVtIGRhdGEgY2xvY2sgcmF0ZSBpcyAyLjUgTWh6LiAgVGhlIG1pbmltdW0gdGltaW5nIGlzIHVzdWFsbHkKKyAgIG1ldCBieSBiYWNrLXRvLWJhY2sgUENJIEkvTyBjeWNsZXMsIGJ1dCB3ZSBpbnNlcnQgYSBkZWxheSB0byBhdm9pZAorICAgIm92ZXJjbG9ja2luZyIgaXNzdWVzIG9yIGZ1dHVyZSA2Nk1oeiBQQ0kuICovCisjZGVmaW5lIG1kaW9fZGVsYXkoKSBpb3JlYWQzMihtZGlvX2FkZHIpCisKKy8qIFJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKyAgIE1ESU8gcHJvdG9jb2wuICBJdCBpcyBqdXN0IGRpZmZlcmVudCBlbm91Z2ggZnJvbSB0aGUgRUVQUk9NIHByb3RvY29sCisgICB0byBub3Qgc2hhcmUgY29kZS4gIFRoZSBtYXhpdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICovCisjZGVmaW5lIE1ESU9fU0hJRlRfQ0xLCQkweDEwMDAwCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTAJMHgwMDAwMAorI2RlZmluZSBNRElPX0RBVEFfV1JJVEUxCTB4MjAwMDAKKyNkZWZpbmUgTURJT19FTkIJCTB4MDAwMDAgLyogSWdub3JlIHRoZSAweDAyMDAwIGRhdGFib29rIHNldHRpbmcuICovCisjZGVmaW5lIE1ESU9fRU5CX0lOCQkweDQwMDAwCisjZGVmaW5lIE1ESU9fREFUQV9SRUFECQkweDgwMDAwCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGNvbWV0X21paXJlZzJvZmZzZXRbMzJdID0geworCTB4QjQsIDB4QjgsIDB4QkMsIDB4QzAsICAweEM0LCAweEM4LCAweENDLCAwLCAgMCwwLDAsMCwgIDAsMCwwLDAsCisJMCwweEQwLDAsMCwgIDAsMCwwLDAsICAwLDAsMCwwLCAwLCAweEQ0LCAweEQ4LCAweERDLCB9OworCisKKy8qIE1JSSB0cmFuc2NlaXZlciBjb250cm9sIHNlY3Rpb24uCisgICBSZWFkIGFuZCB3cml0ZSB0aGUgTUlJIHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQgc2VyaWFsCisgICBNRElPIHByb3RvY29sLiAgU2VlIHRoZSBNSUkgc3BlY2lmaWNhdGlvbnMgb3IgRFA4Mzg0MEEgZGF0YSBzaGVldAorICAgZm9yIGRldGFpbHMuICovCisKK2ludCB0dWxpcF9tZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisJaW50IHJlYWRfY21kID0gKDB4ZjYgPDwgMTApIHwgKChwaHlfaWQgJiAweDFmKSA8PCA1KSB8IGxvY2F0aW9uOworCWludCByZXR2YWwgPSAwOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwl2b2lkIF9faW9tZW0gKm1kaW9fYWRkciA9IGlvYWRkciArIENTUjk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChsb2NhdGlvbiAmIH4weDFmKQorCQlyZXR1cm4gMHhmZmZmOworCisJaWYgKHRwLT5jaGlwX2lkID09IENPTUVUICAmJiAgcGh5X2lkID09IDMwKSB7CisJCWlmIChjb21ldF9taWlyZWcyb2Zmc2V0W2xvY2F0aW9uXSkKKwkJCXJldHVybiBpb3JlYWQzMihpb2FkZHIgKyBjb21ldF9taWlyZWcyb2Zmc2V0W2xvY2F0aW9uXSk7CisJCXJldHVybiAweGZmZmY7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5taWlfbG9jaywgZmxhZ3MpOworCWlmICh0cC0+Y2hpcF9pZCA9PSBMQzgyQzE2OCkgeworCQlpbnQgaSA9IDEwMDA7CisJCWlvd3JpdGUzMigweDYwMDIwMDAwICsgKHBoeV9pZDw8MjMpICsgKGxvY2F0aW9uPDwxOCksIGlvYWRkciArIDB4QTApOworCQlpb3JlYWQzMihpb2FkZHIgKyAweEEwKTsKKwkJaW9yZWFkMzIoaW9hZGRyICsgMHhBMCk7CisJCXdoaWxlICgtLWkgPiAwKSB7CisJCQliYXJyaWVyKCk7CisJCQlpZiAoICEgKChyZXR2YWwgPSBpb3JlYWQzMihpb2FkZHIgKyAweEEwKSkgJiAweDgwMDAwMDAwKSkKKwkJCQlicmVhazsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bWlpX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJldHZhbCAmIDB4ZmZmZjsKKwl9CisKKwlpZih0cC0+Y2hpcF9pZCA9PSBVTEk1MjZYICYmIHRwLT5yZXZpc2lvbiA+PSAweDQwKSB7CisJCWludCB2YWx1ZTsKKwkJaW50IGkgPSAxMDAwOworCQkKKwkJdmFsdWUgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I5KTsKKwkJaW93cml0ZTMyKHZhbHVlICYgMHhGRkVGRkZGRiwgaW9hZGRyICsgQ1NSOSk7CisJCQorCQl2YWx1ZSA9IChwaHlfaWQgPDwgMjEpIHwgKGxvY2F0aW9uIDw8IDE2KSB8IDB4MDgwMDAwMDA7CisJCWlvd3JpdGUzMih2YWx1ZSwgaW9hZGRyICsgQ1NSMTApOworCQkKKwkJd2hpbGUoLS1pID4gMCkgeworCQkJbWRpb19kZWxheSgpOworCQkJaWYoaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTApICYgMHgxMDAwMDAwMCkKKwkJCQlicmVhazsKKwkJfQorCQlyZXR2YWwgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5taWlfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmV0dmFsICYgMHhGRkZGOworCX0KKwkvKiBFc3RhYmxpc2ggc3luYyBieSBzZW5kaW5nIGF0IGxlYXN0IDMyIGxvZ2ljIG9uZXMuICovCisJZm9yIChpID0gMzI7IGkgPj0gMDsgaS0tKSB7CisJCWlvd3JpdGUzMihNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJaW93cml0ZTMyKE1ESU9fRU5CIHwgTURJT19EQVRBX1dSSVRFMSB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gTURJT19EQVRBX1dSSVRFMSA6IDA7CisKKwkJaW93cml0ZTMyKE1ESU9fRU5CIHwgZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlpb3dyaXRlMzIoTURJT19FTkIgfCBkYXRhdmFsIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJLyogUmVhZCB0aGUgdHdvIHRyYW5zaXRpb24sIDE2IGRhdGEsIGFuZCB3aXJlLWlkbGUgYml0cy4gKi8KKwlmb3IgKGkgPSAxOTsgaSA+IDA7IGktLSkgeworCQlpb3dyaXRlMzIoTURJT19FTkJfSU4sIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW9yZWFkMzIobWRpb19hZGRyKSAmIE1ESU9fREFUQV9SRUFEKSA/IDEgOiAwKTsKKwkJaW93cml0ZTMyKE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bWlpX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gKHJldHZhbD4+MSkgJiAweGZmZmY7Cit9CisKK3ZvaWQgdHVsaXBfbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWwpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlpbnQgY21kID0gKDB4NTAwMiA8PCAxNikgfCAoKHBoeV9pZCAmIDB4MWYpIDw8IDIzKSB8IChsb2NhdGlvbjw8MTgpIHwgKHZhbCAmIDB4ZmZmZik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCXZvaWQgX19pb21lbSAqbWRpb19hZGRyID0gaW9hZGRyICsgQ1NSOTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGxvY2F0aW9uICYgfjB4MWYpCisJCXJldHVybjsKKworCWlmICh0cC0+Y2hpcF9pZCA9PSBDT01FVCAmJiBwaHlfaWQgPT0gMzApIHsKKwkJaWYgKGNvbWV0X21paXJlZzJvZmZzZXRbbG9jYXRpb25dKQorCQkJaW93cml0ZTMyKHZhbCwgaW9hZGRyICsgY29tZXRfbWlpcmVnMm9mZnNldFtsb2NhdGlvbl0pOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5taWlfbG9jaywgZmxhZ3MpOworCWlmICh0cC0+Y2hpcF9pZCA9PSBMQzgyQzE2OCkgeworCQlpbnQgaSA9IDEwMDA7CisJCWlvd3JpdGUzMihjbWQsIGlvYWRkciArIDB4QTApOworCQlkbyB7CisJCQliYXJyaWVyKCk7CisJCQlpZiAoICEgKGlvcmVhZDMyKGlvYWRkciArIDB4QTApICYgMHg4MDAwMDAwMCkpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0taSA+IDApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bWlpX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodHAtPmNoaXBfaWQgPT0gVUxJNTI2WCAmJiB0cC0+cmV2aXNpb24gPj0gMHg0MCkgeworCQlpbnQgdmFsdWU7CisJCWludCBpID0gMTAwMDsKKwkJCisJCXZhbHVlID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSOSk7CisJCWlvd3JpdGUzMih2YWx1ZSAmIDB4RkZFRkZGRkYsIGlvYWRkciArIENTUjkpOworCQkKKwkJdmFsdWUgPSAocGh5X2lkIDw8IDIxKSB8IChsb2NhdGlvbiA8PCAxNikgfCAweDA0MDAwMDAwIHwgKHZhbCAmIDB4RkZGRik7CisJCWlvd3JpdGUzMih2YWx1ZSwgaW9hZGRyICsgQ1NSMTApOworCQkKKwkJd2hpbGUoLS1pID4gMCkgeworCQkJaWYgKGlvcmVhZDMyKGlvYWRkciArIENTUjEwKSAmIDB4MTAwMDAwMDApCisJCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPm1paV9sb2NrLCBmbGFncyk7CisJfQorCQkKKwkvKiBFc3RhYmxpc2ggc3luYyBieSBzZW5kaW5nIDMyIGxvZ2ljIG9uZXMuICovCisJZm9yIChpID0gMzI7IGkgPj0gMDsgaS0tKSB7CisJCWlvd3JpdGUzMihNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJaW93cml0ZTMyKE1ESU9fRU5CIHwgTURJT19EQVRBX1dSSVRFMSB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCS8qIFNoaWZ0IHRoZSBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChjbWQgJiAoMSA8PCBpKSkgPyBNRElPX0RBVEFfV1JJVEUxIDogMDsKKwkJaW93cml0ZTMyKE1ESU9fRU5CIHwgZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlpb3dyaXRlMzIoTURJT19FTkIgfCBkYXRhdmFsIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJLyogQ2xlYXIgb3V0IGV4dHJhIGJpdHMuICovCisJZm9yIChpID0gMjsgaSA+IDA7IGktLSkgeworCQlpb3dyaXRlMzIoTURJT19FTkJfSU4sIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJaW93cml0ZTMyKE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bWlpX2xvY2ssIGZsYWdzKTsKK30KKworCisvKiBTZXQgdXAgdGhlIHRyYW5zY2VpdmVyIGNvbnRyb2wgcmVnaXN0ZXJzIGZvciB0aGUgc2VsZWN0ZWQgbWVkaWEgdHlwZS4gKi8KK3ZvaWQgdHVsaXBfc2VsZWN0X21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGFydHVwKQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCXN0cnVjdCBtZWRpYXRhYmxlICptdGFibGUgPSB0cC0+bXRhYmxlOworCXUzMiBuZXdfY3NyNjsKKwlpbnQgaTsKKworCWlmIChtdGFibGUpIHsKKwkJc3RydWN0IG1lZGlhbGVhZiAqbWxlYWYgPSAmbXRhYmxlLT5tbGVhZlt0cC0+Y3VyX2luZGV4XTsKKwkJdW5zaWduZWQgY2hhciAqcCA9IG1sZWFmLT5sZWFmZGF0YTsKKwkJc3dpdGNoIChtbGVhZi0+dHlwZSkgeworCQljYXNlIDA6CQkJCQkvKiAyMTE0MCBub24tTUlJIHhjdnIuICovCisJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVXNpbmcgYSAyMTE0MCBub24tTUlJIHRyYW5zY2VpdmVyIgorCQkJCQkgICAiIHdpdGggY29udHJvbCBzZXR0aW5nICUyLjJ4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBwWzFdKTsKKwkJCWRldi0+aWZfcG9ydCA9IHBbMF07CisJCQlpZiAoc3RhcnR1cCkKKwkJCQlpb3dyaXRlMzIobXRhYmxlLT5jc3IxMmRpciB8IDB4MTAwLCBpb2FkZHIgKyBDU1IxMik7CisJCQlpb3dyaXRlMzIocFsxXSwgaW9hZGRyICsgQ1NSMTIpOworCQkJbmV3X2NzcjYgPSAweDAyMDAwMDAwIHwgKChwWzJdICYgMHg3MSkgPDwgMTgpOworCQkJYnJlYWs7CisJCWNhc2UgMjogY2FzZSA0OiB7CisJCQl1MTYgc2V0dXBbNV07CisJCQl1MzIgY3NyMTN2YWwsIGNzcjE0dmFsLCBjc3IxNWRpciwgY3NyMTV2YWw7CisJCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQkJCXNldHVwW2ldID0gZ2V0X3UxNigmcFtpKjIgKyAxXSk7CisKKwkJCWRldi0+aWZfcG9ydCA9IHBbMF0gJiBNRURJQV9NQVNLOworCQkJaWYgKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFBbHdheXNGRCkKKwkJCQl0cC0+ZnVsbF9kdXBsZXggPSAxOworCisJCQlpZiAoc3RhcnR1cCAmJiBtdGFibGUtPmhhc19yZXNldCkgeworCQkJCXN0cnVjdCBtZWRpYWxlYWYgKnJsZWFmID0gJm10YWJsZS0+bWxlYWZbbXRhYmxlLT5oYXNfcmVzZXRdOworCQkJCXVuc2lnbmVkIGNoYXIgKnJzdCA9IHJsZWFmLT5sZWFmZGF0YTsKKwkJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlc2V0dGluZyB0aGUgdHJhbnNjZWl2ZXIuXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcnN0WzBdOyBpKyspCisJCQkJCWlvd3JpdGUzMihnZXRfdTE2KHJzdCArIDEgKyAoaTw8MSkpIDw8IDE2LCBpb2FkZHIgKyBDU1IxNSk7CisJCQl9CisJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogMjExNDMgbm9uLU1JSSAlcyB0cmFuc2NlaXZlciBjb250cm9sICIKKwkJCQkJICAgIiU0LjR4LyU0LjR4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgc2V0dXBbMF0sIHNldHVwWzFdKTsKKwkJCWlmIChwWzBdICYgMHg0MCkgewkvKiBTSUEgKENTUjEzLTE1KSBzZXR1cCB2YWx1ZXMgYXJlIHByb3ZpZGVkLiAqLworCQkJCWNzcjEzdmFsID0gc2V0dXBbMF07CisJCQkJY3NyMTR2YWwgPSBzZXR1cFsxXTsKKwkJCQljc3IxNWRpciA9IChzZXR1cFszXTw8MTYpIHwgc2V0dXBbMl07CisJCQkJY3NyMTV2YWwgPSAoc2V0dXBbNF08PDE2KSB8IHNldHVwWzJdOworCQkJCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBDU1IxMyk7CisJCQkJaW93cml0ZTMyKGNzcjE0dmFsLCBpb2FkZHIgKyBDU1IxNCk7CisJCQkJaW93cml0ZTMyKGNzcjE1ZGlyLCBpb2FkZHIgKyBDU1IxNSk7CS8qIERpcmVjdGlvbiAqLworCQkJCWlvd3JpdGUzMihjc3IxNXZhbCwgaW9hZGRyICsgQ1NSMTUpOwkvKiBEYXRhICovCisJCQkJaW93cml0ZTMyKGNzcjEzdmFsLCBpb2FkZHIgKyBDU1IxMyk7CisJCQl9IGVsc2UgeworCQkJCWNzcjEzdmFsID0gMTsKKwkJCQljc3IxNHZhbCA9IDA7CisJCQkJY3NyMTVkaXIgPSAoc2V0dXBbMF08PDE2KSB8IDB4MDAwODsKKwkJCQljc3IxNXZhbCA9IChzZXR1cFsxXTw8MTYpIHwgMHgwMDA4OworCQkJCWlmIChkZXYtPmlmX3BvcnQgPD0gNCkKKwkJCQkJY3NyMTR2YWwgPSB0MjExNDJfY3NyMTRbZGV2LT5pZl9wb3J0XTsKKwkJCQlpZiAoc3RhcnR1cCkgeworCQkJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgQ1NSMTMpOworCQkJCQlpb3dyaXRlMzIoY3NyMTR2YWwsIGlvYWRkciArIENTUjE0KTsKKwkJCQl9CisJCQkJaW93cml0ZTMyKGNzcjE1ZGlyLCBpb2FkZHIgKyBDU1IxNSk7CS8qIERpcmVjdGlvbiAqLworCQkJCWlvd3JpdGUzMihjc3IxNXZhbCwgaW9hZGRyICsgQ1NSMTUpOwkvKiBEYXRhICovCisJCQkJaWYgKHN0YXJ0dXApIGlvd3JpdGUzMihjc3IxM3ZhbCwgaW9hZGRyICsgQ1NSMTMpOworCQkJfQorCQkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICBTZXR0aW5nIENTUjE1IHRvICU4Ljh4LyU4Ljh4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBjc3IxNWRpciwgY3NyMTV2YWwpOworCQkJaWYgKG1sZWFmLT50eXBlID09IDQpCisJCQkJbmV3X2NzcjYgPSAweDgyMDIwMDAwIHwgKChzZXR1cFsyXSAmIDB4NzEpIDw8IDE4KTsKKwkJCWVsc2UKKwkJCQluZXdfY3NyNiA9IDB4ODI0MjAwMDA7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDE6IGNhc2UgMzogeworCQkJaW50IHBoeV9udW0gPSBwWzBdOworCQkJaW50IGluaXRfbGVuZ3RoID0gcFsxXTsKKwkJCXUxNiAqbWlzY19pbmZvLCB0bXBfaW5mbzsKKworCQkJZGV2LT5pZl9wb3J0ID0gMTE7CisJCQluZXdfY3NyNiA9IDB4MDIwRTAwMDA7CisJCQlpZiAobWxlYWYtPnR5cGUgPT0gMykgewkvKiAyMTE0MiAqLworCQkJCXUxNiAqaW5pdF9zZXF1ZW5jZSA9ICh1MTYqKShwKzIpOworCQkJCXUxNiAqcmVzZXRfc2VxdWVuY2UgPSAmKCh1MTYqKShwKzMpKVtpbml0X2xlbmd0aF07CisJCQkJaW50IHJlc2V0X2xlbmd0aCA9IHBbMiArIGluaXRfbGVuZ3RoKjJdOworCQkJCW1pc2NfaW5mbyA9IHJlc2V0X3NlcXVlbmNlICsgcmVzZXRfbGVuZ3RoOworCQkJCWlmIChzdGFydHVwKQorCQkJCQlmb3IgKGkgPSAwOyBpIDwgcmVzZXRfbGVuZ3RoOyBpKyspCisJCQkJCQlpb3dyaXRlMzIoZ2V0X3UxNigmcmVzZXRfc2VxdWVuY2VbaV0pIDw8IDE2LCBpb2FkZHIgKyBDU1IxNSk7CisJCQkJZm9yIChpID0gMDsgaSA8IGluaXRfbGVuZ3RoOyBpKyspCisJCQkJCWlvd3JpdGUzMihnZXRfdTE2KCZpbml0X3NlcXVlbmNlW2ldKSA8PCAxNiwgaW9hZGRyICsgQ1NSMTUpOworCQkJfSBlbHNlIHsKKwkJCQl1OCAqaW5pdF9zZXF1ZW5jZSA9IHAgKyAyOworCQkJCXU4ICpyZXNldF9zZXF1ZW5jZSA9IHAgKyAzICsgaW5pdF9sZW5ndGg7CisJCQkJaW50IHJlc2V0X2xlbmd0aCA9IHBbMiArIGluaXRfbGVuZ3RoXTsKKwkJCQltaXNjX2luZm8gPSAodTE2KikocmVzZXRfc2VxdWVuY2UgKyByZXNldF9sZW5ndGgpOworCQkJCWlmIChzdGFydHVwKSB7CisJCQkJCWlvd3JpdGUzMihtdGFibGUtPmNzcjEyZGlyIHwgMHgxMDAsIGlvYWRkciArIENTUjEyKTsKKwkJCQkJZm9yIChpID0gMDsgaSA8IHJlc2V0X2xlbmd0aDsgaSsrKQorCQkJCQkJaW93cml0ZTMyKHJlc2V0X3NlcXVlbmNlW2ldLCBpb2FkZHIgKyBDU1IxMik7CisJCQkJfQorCQkJCWZvciAoaSA9IDA7IGkgPCBpbml0X2xlbmd0aDsgaSsrKQorCQkJCQlpb3dyaXRlMzIoaW5pdF9zZXF1ZW5jZVtpXSwgaW9hZGRyICsgQ1NSMTIpOworCQkJfQorCQkJdG1wX2luZm8gPSBnZXRfdTE2KCZtaXNjX2luZm9bMV0pOworCQkJaWYgKHRtcF9pbmZvKQorCQkJCXRwLT5hZHZlcnRpc2luZ1twaHlfbnVtXSA9IHRtcF9pbmZvIHwgMTsKKwkJCWlmICh0bXBfaW5mbyAmJiBzdGFydHVwIDwgMikgeworCQkJCWlmICh0cC0+bWlpX2FkdmVydGlzZSA9PSAwKQorCQkJCQl0cC0+bWlpX2FkdmVydGlzZSA9IHRwLT5hZHZlcnRpc2luZ1twaHlfbnVtXTsKKwkJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICBBZHZlcnRpc2luZyAlNC40eCBvbiBNSUkgJWQuXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lLCB0cC0+bWlpX2FkdmVydGlzZSwgdHAtPnBoeXNbcGh5X251bV0pOworCQkJCXR1bGlwX21kaW9fd3JpdGUoZGV2LCB0cC0+cGh5c1twaHlfbnVtXSwgNCwgdHAtPm1paV9hZHZlcnRpc2UpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSA1OiBjYXNlIDY6IHsKKwkJCXUxNiBzZXR1cFs1XTsKKworCQkJbmV3X2NzcjYgPSAwOyAvKiBGSVhNRSAqLworCisJCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQkJCXNldHVwW2ldID0gZ2V0X3UxNigmcFtpKjIgKyAxXSk7CisKKwkJCWlmIChzdGFydHVwICYmIG10YWJsZS0+aGFzX3Jlc2V0KSB7CisJCQkJc3RydWN0IG1lZGlhbGVhZiAqcmxlYWYgPSAmbXRhYmxlLT5tbGVhZlttdGFibGUtPmhhc19yZXNldF07CisJCQkJdW5zaWduZWQgY2hhciAqcnN0ID0gcmxlYWYtPmxlYWZkYXRhOworCQkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVzZXR0aW5nIHRoZSB0cmFuc2NlaXZlci5cbiIsCisJCQkJCQkgICBkZXYtPm5hbWUpOworCQkJCWZvciAoaSA9IDA7IGkgPCByc3RbMF07IGkrKykKKwkJCQkJaW93cml0ZTMyKGdldF91MTYocnN0ICsgMSArIChpPDwxKSkgPDwgMTYsIGlvYWRkciArIENTUjE1KTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIEludmFsaWQgbWVkaWEgdGFibGUgc2VsZWN0aW9uICVkLlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBtbGVhZi0+dHlwZSk7CisJCQluZXdfY3NyNiA9IDB4MDIwRTAwMDA7CisJCX0KKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVXNpbmcgbWVkaWEgdHlwZSAlcywgQ1NSMTIgaXMgJTIuMnguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0sCisJCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpICYgMHhmZik7CisJfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBMQzgyQzE2OCkgeworCQlpZiAoc3RhcnR1cCAmJiAhIHRwLT5tZWRpYWxvY2spCisJCQlkZXYtPmlmX3BvcnQgPSB0cC0+bWlpX2NudCA/IDExIDogMDsKKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUE5JQyBQSFkgc3RhdHVzIGlzICUzLjN4LCBtZWRpYSAlcy5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyAweEI4KSwgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0pOworCQlpZiAodHAtPm1paV9jbnQpIHsKKwkJCW5ld19jc3I2ID0gMHg4MTBDMDAwMDsKKwkJCWlvd3JpdGUzMigweDAwMDEsIGlvYWRkciArIENTUjE1KTsKKwkJCWlvd3JpdGUzMigweDAyMDFCMDdBLCBpb2FkZHIgKyAweEI4KTsKKwkJfSBlbHNlIGlmIChzdGFydHVwKSB7CisJCQkvKiBTdGFydCB3aXRoIDEwbWJwcyB0byBkbyBhdXRvbmVnb3RpYXRpb24uICovCisJCQlpb3dyaXRlMzIoMHgzMiwgaW9hZGRyICsgQ1NSMTIpOworCQkJbmV3X2NzcjYgPSAweDAwNDIwMDAwOworCQkJaW93cml0ZTMyKDB4MDAwMUIwNzgsIGlvYWRkciArIDB4QjgpOworCQkJaW93cml0ZTMyKDB4MDIwMUIwNzgsIGlvYWRkciArIDB4QjgpOworCQl9IGVsc2UgaWYgKGRldi0+aWZfcG9ydCA9PSAzICB8fCAgZGV2LT5pZl9wb3J0ID09IDUpIHsKKwkJCWlvd3JpdGUzMigweDMzLCBpb2FkZHIgKyBDU1IxMik7CisJCQluZXdfY3NyNiA9IDB4MDE4NjAwMDA7CisJCQkvKiBUcmlnZ2VyIGF1dG9uZWdvdGlhdGlvbi4gKi8KKwkJCWlvd3JpdGUzMihzdGFydHVwID8gMHgwMjAxRjg2OCA6IDB4MDAwMUY4NjgsIGlvYWRkciArIDB4QjgpOworCQl9IGVsc2UgeworCQkJaW93cml0ZTMyKDB4MzIsIGlvYWRkciArIENTUjEyKTsKKwkJCW5ld19jc3I2ID0gMHgwMDQyMDAwMDsKKwkJCWlvd3JpdGUzMigweDFGMDc4LCBpb2FkZHIgKyAweEI4KTsKKwkJfQorCX0gZWxzZSB7CQkJCQkvKiBVbmtub3duIGNoaXAgdHlwZSB3aXRoIG5vIG1lZGlhIHRhYmxlLiAqLworCQlpZiAodHAtPmRlZmF1bHRfcG9ydCA9PSAwKQorCQkJZGV2LT5pZl9wb3J0ID0gdHAtPm1paV9jbnQgPyAxMSA6IDM7CisJCWlmICh0dWxpcF9tZWRpYV9jYXBbZGV2LT5pZl9wb3J0XSAmIE1lZGlhSXNNSUkpIHsKKwkJCW5ld19jc3I2ID0gMHgwMjBFMDAwMDsKKwkJfSBlbHNlIGlmICh0dWxpcF9tZWRpYV9jYXBbZGV2LT5pZl9wb3J0XSAmIE1lZGlhSXNGeCkgeworCQkJbmV3X2NzcjYgPSAweDAyODYwMDAwOworCQl9IGVsc2UKKwkJCW5ld19jc3I2ID0gMHgwMzg2MDAwMDsKKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTm8gbWVkaWEgZGVzY3JpcHRpb24gdGFibGUsIGFzc3VtaW5nICIKKwkJCQkgICAiJXMgdHJhbnNjZWl2ZXIsIENTUjEyICUyLjJ4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLAorCQkJCSAgIGlvcmVhZDMyKGlvYWRkciArIENTUjEyKSk7CisJfQorCisJdHAtPmNzcjYgPSBuZXdfY3NyNiB8ICh0cC0+Y3NyNiAmIDB4ZmRmZikgfCAodHAtPmZ1bGxfZHVwbGV4ID8gMHgwMjAwIDogMCk7CisJcmV0dXJuOworfQorCisvKgorICBDaGVjayB0aGUgTUlJIG5lZ290aWF0ZWQgZHVwbGV4IGFuZCBjaGFuZ2UgdGhlIENTUjYgc2V0dGluZyBpZgorICByZXF1aXJlZC4KKyAgUmV0dXJuIDAgaWYgZXZlcnl0aGluZyBpcyBPSy4KKyAgUmV0dXJuIDwgMCBpZiB0aGUgdHJhbnNjZWl2ZXIgaXMgbWlzc2luZyBvciBoYXMgbm8gbGluayBiZWF0LgorICAqLworaW50IHR1bGlwX2NoZWNrX2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IGJtc3IsIGxwYSwgbmVnb3RpYXRlZCwgbmV3X2NzcjY7CisKKwlibXNyID0gdHVsaXBfbWRpb19yZWFkKGRldiwgdHAtPnBoeXNbMF0sIE1JSV9CTVNSKTsKKwlscGEgPSB0dWxpcF9tZGlvX3JlYWQoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0xQQSk7CisJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSBzdGF0dXMgJTQuNHgsIExpbmsgcGFydG5lciByZXBvcnQgIgorCQkJICAgIiU0LjR4LlxuIiwgZGV2LT5uYW1lLCBibXNyLCBscGEpOworCWlmIChibXNyID09IDB4ZmZmZikKKwkJcmV0dXJuIC0yOworCWlmICgoYm1zciAmIEJNU1JfTFNUQVRVUykgPT0gMCkgeworCQlpbnQgbmV3X2Jtc3IgPSB0dWxpcF9tZGlvX3JlYWQoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0JNU1IpOworCQlpZiAoKG5ld19ibXNyICYgQk1TUl9MU1RBVFVTKSA9PSAwKSB7CisJCQlpZiAodHVsaXBfZGVidWcgID4gMSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTm8gbGluayBiZWF0IG9uIHRoZSBNSUkgaW50ZXJmYWNlLCIKKwkJCQkJICAgIiBzdGF0dXMgJTQuNHguXG4iLCBkZXYtPm5hbWUsIG5ld19ibXNyKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwluZWdvdGlhdGVkID0gbHBhICYgdHAtPmFkdmVydGlzaW5nWzBdOworCXRwLT5mdWxsX2R1cGxleCA9IG1paV9kdXBsZXgodHAtPmZ1bGxfZHVwbGV4X2xvY2ssIG5lZ290aWF0ZWQpOworCisJbmV3X2NzcjYgPSB0cC0+Y3NyNjsKKworCWlmIChuZWdvdGlhdGVkICYgTFBBXzEwMCkgbmV3X2NzcjYgJj0gflR4VGhyZXNob2xkOworCWVsc2UJCQkgIG5ld19jc3I2IHw9IFR4VGhyZXNob2xkOworCWlmICh0cC0+ZnVsbF9kdXBsZXgpIG5ld19jc3I2IHw9IEZ1bGxEdXBsZXg7CisJZWxzZQkJICAgICBuZXdfY3NyNiAmPSB+RnVsbER1cGxleDsKKworCWlmIChuZXdfY3NyNiAhPSB0cC0+Y3NyNikgeworCQl0cC0+Y3NyNiA9IG5ld19jc3I2OworCQl0dWxpcF9yZXN0YXJ0X3J4dHgodHApOworCisJCWlmICh0dWxpcF9kZWJ1ZyA+IDApCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU2V0dGluZyAlcy1kdXBsZXggYmFzZWQgb24gTUlJIgorCQkJCSAgICIjJWQgbGluayBwYXJ0bmVyIGNhcGFiaWxpdHkgb2YgJTQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgdHAtPmZ1bGxfZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiLAorCQkJCSAgIHRwLT5waHlzWzBdLCBscGEpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2RldmluaXQgdHVsaXBfZmluZF9taWkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBib2FyZF9pZHgpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcGh5biwgcGh5X2lkeCA9IDA7CisJaW50IG1paV9yZWcwOworCWludCBtaWlfYWR2ZXJ0OworCXVuc2lnbmVkIGludCB0b19hZHZlcnQsIG5ld19ibWNyLCBhbmVfc3dpdGNoOworCisJLyogRmluZCB0aGUgY29ubmVjdGVkIE1JSSB4Y3Zycy4KKwkgICBEb2luZyB0aGlzIGluIG9wZW4oKSB3b3VsZCBhbGxvdyBkZXRlY3RpbmcgZXh0ZXJuYWwgeGN2cnMgbGF0ZXIsCisJICAgYnV0IHRha2VzIG11Y2ggdGltZS4gKi8KKwlmb3IgKHBoeW4gPSAxOyBwaHluIDw9IDMyICYmIHBoeV9pZHggPCBzaXplb2YgKHRwLT5waHlzKTsgcGh5bisrKSB7CisJCWludCBwaHkgPSBwaHluICYgMHgxZjsKKwkJaW50IG1paV9zdGF0dXMgPSB0dWxpcF9tZGlvX3JlYWQgKGRldiwgcGh5LCBNSUlfQk1TUik7CisJCWlmICgobWlpX3N0YXR1cyAmIDB4ODMwMSkgPT0gMHg4MDAxIHx8CisJCSAgICAoKG1paV9zdGF0dXMgJiBCTVNSXzEwMEJBU0U0KSA9PSAwCisJCSAgICAgJiYgKG1paV9zdGF0dXMgJiAweDc4MDApICE9IDApKSB7CisJCQkvKiBwcmVzZXJ2ZSBCZWNrZXIgbG9naWMsIGdhaW4gaW5kZW50YXRpb24gbGV2ZWwgKi8KKwkJfSBlbHNlIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbWlpX3JlZzAgPSB0dWxpcF9tZGlvX3JlYWQgKGRldiwgcGh5LCBNSUlfQk1DUik7CisJCW1paV9hZHZlcnQgPSB0dWxpcF9tZGlvX3JlYWQgKGRldiwgcGh5LCBNSUlfQURWRVJUSVNFKTsKKwkJYW5lX3N3aXRjaCA9IDA7CisKKwkJLyogaWYgbm90IGFkdmVydGlzaW5nIGF0IGFsbCwgZ2VuIGFuCisJCSAqIGFkdmVydGlzaW5nIHZhbHVlIGZyb20gdGhlIGNhcGFiaWxpdHkKKwkJICogYml0cyBpbiBCTVNSCisJCSAqLworCQlpZiAoKG1paV9hZHZlcnQgJiBBRFZFUlRJU0VfQUxMKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBpbnQgdG1wYWR2ID0gdHVsaXBfbWRpb19yZWFkIChkZXYsIHBoeSwgTUlJX0JNU1IpOworCQkJbWlpX2FkdmVydCA9ICgodG1wYWR2ID4+IDYpICYgMHgzZTApIHwgMTsKKwkJfQorCisJCWlmICh0cC0+bWlpX2FkdmVydGlzZSkgeworCQkJdHAtPmFkdmVydGlzaW5nW3BoeV9pZHhdID0KKwkJCXRvX2FkdmVydCA9IHRwLT5taWlfYWR2ZXJ0aXNlOworCQl9IGVsc2UgaWYgKHRwLT5hZHZlcnRpc2luZ1twaHlfaWR4XSkgeworCQkJdG9fYWR2ZXJ0ID0gdHAtPmFkdmVydGlzaW5nW3BoeV9pZHhdOworCQl9IGVsc2UgeworCQkJdHAtPmFkdmVydGlzaW5nW3BoeV9pZHhdID0KKwkJCXRwLT5taWlfYWR2ZXJ0aXNlID0KKwkJCXRvX2FkdmVydCA9IG1paV9hZHZlcnQ7CisJCX0KKworCQl0cC0+cGh5c1twaHlfaWR4KytdID0gcGh5OworCisJCXByaW50ayAoS0VSTl9JTkZPICJ0dWxpcCVkOiAgTUlJIHRyYW5zY2VpdmVyICMlZCAiCisJCQkiY29uZmlnICU0LjR4IHN0YXR1cyAlNC40eCBhZHZlcnRpc2luZyAlNC40eC5cbiIsCisJCQlib2FyZF9pZHgsIHBoeSwgbWlpX3JlZzAsIG1paV9zdGF0dXMsIG1paV9hZHZlcnQpOworCisJCS8qIEZpeHVwIGZvciBETGluayB3aXRoIG1pc3dpcmVkIFBIWS4gKi8KKwkJaWYgKG1paV9hZHZlcnQgIT0gdG9fYWR2ZXJ0KSB7CisJCQlwcmludGsgKEtFUk5fREVCVUcgInR1bGlwJWQ6ICBBZHZlcnRpc2luZyAlNC40eCBvbiBQSFkgJWQsIgorCQkJCSIgcHJldmlvdXNseSBhZHZlcnRpc2luZyAlNC40eC5cbiIsCisJCQkJYm9hcmRfaWR4LCB0b19hZHZlcnQsIHBoeSwgbWlpX2FkdmVydCk7CisJCQl0dWxpcF9tZGlvX3dyaXRlIChkZXYsIHBoeSwgNCwgdG9fYWR2ZXJ0KTsKKwkJfQorCisJCS8qIEVuYWJsZSBhdXRvbmVnb3RpYXRpb246IHNvbWUgYm9hcmRzIGRlZmF1bHQgdG8gb2ZmLiAqLworCQlpZiAodHAtPmRlZmF1bHRfcG9ydCA9PSAwKSB7CisJCQluZXdfYm1jciA9IG1paV9yZWcwIHwgQk1DUl9BTkVOQUJMRTsKKwkJCWlmIChuZXdfYm1jciAhPSBtaWlfcmVnMCkgeworCQkJCW5ld19ibWNyIHw9IEJNQ1JfQU5SRVNUQVJUOworCQkJCWFuZV9zd2l0Y2ggPSAxOworCQkJfQorCQl9CisJCS8qIC4uLm9yIGRpc2FibGUgbndheSwgaWYgZm9yY2luZyBtZWRpYSAqLworCQllbHNlIHsKKwkJCW5ld19ibWNyID0gbWlpX3JlZzAgJiB+Qk1DUl9BTkVOQUJMRTsKKwkJCWlmIChuZXdfYm1jciAhPSBtaWlfcmVnMCkKKwkJCQlhbmVfc3dpdGNoID0gMTsKKwkJfQorCisJCS8qIGNsZWFyIG91dCBiaXRzIHdlIG5ldmVyIHdhbnQgYXQgdGhpcyBwb2ludCAqLworCQluZXdfYm1jciAmPSB+KEJNQ1JfQ1RTVCB8IEJNQ1JfRlVMTERQTFggfCBCTUNSX0lTT0xBVEUgfAorCQkJICAgICAgQk1DUl9QRE9XTiB8IEJNQ1JfU1BFRUQxMDAgfCBCTUNSX0xPT1BCQUNLIHwKKwkJCSAgICAgIEJNQ1JfUkVTRVQpOworCisJCWlmICh0cC0+ZnVsbF9kdXBsZXgpCisJCQluZXdfYm1jciB8PSBCTUNSX0ZVTExEUExYOworCQlpZiAodHVsaXBfbWVkaWFfY2FwW3RwLT5kZWZhdWx0X3BvcnRdICYgTWVkaWFJczEwMCkKKwkJCW5ld19ibWNyIHw9IEJNQ1JfU1BFRUQxMDA7CisKKwkJaWYgKG5ld19ibWNyICE9IG1paV9yZWcwKSB7CisJCQkvKiBzb21lIHBoeXMgbmVlZCB0aGUgQU5FIHN3aXRjaCB0bworCQkJICogaGFwcGVuIGJlZm9yZSBmb3JjZWQgbWVkaWEgc2V0dGluZ3MKKwkJCSAqIHdpbGwgInRha2UuIiAgSG93ZXZlciwgd2Ugd3JpdGUgdGhlCisJCQkgKiBzYW1lIHZhbHVlIHR3aWNlIGluIG9yZGVyIG5vdCB0bworCQkJICogY29uZnVzZSB0aGUgc2FuZSBwaHlzLgorCQkJICovCisJCQlpZiAoYW5lX3N3aXRjaCkgeworCQkJCXR1bGlwX21kaW9fd3JpdGUgKGRldiwgcGh5LCBNSUlfQk1DUiwgbmV3X2JtY3IpOworCQkJCXVkZWxheSAoMTApOworCQkJfQorCQkJdHVsaXBfbWRpb193cml0ZSAoZGV2LCBwaHksIE1JSV9CTUNSLCBuZXdfYm1jcik7CisJCX0KKwl9CisJdHAtPm1paV9jbnQgPSBwaHlfaWR4OworCWlmICh0cC0+bXRhYmxlICYmIHRwLT5tdGFibGUtPmhhc19taWkgJiYgcGh5X2lkeCA9PSAwKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJ0dWxpcCVkOiAqKipXQVJOSU5HKioqOiBObyBNSUkgdHJhbnNjZWl2ZXIgZm91bmQhXG4iLAorCQkJYm9hcmRfaWR4KTsKKwkJdHAtPnBoeXNbMF0gPSAxOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3BuaWMuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3BuaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTk4MGJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvcG5pYy5jCkBAIC0wLDAgKzEsMTcyIEBACisvKgorCWRyaXZlcnMvbmV0L3R1bGlwL3BuaWMuYworCisJTWFpbnRhaW5lZCBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJQ29weXJpZ2h0IDIwMDAsMjAwMSAgVGhlIExpbnV4IEtlcm5lbCBUZWFtCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5NC0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVBsZWFzZSByZWZlciB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdHVsaXAtdXNlci57cGRmLHBzLGh0bWx9CisJZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBkcml2ZXIsIG9yIHZpc2l0IHRoZSBwcm9qZWN0CisJV2ViIHBhZ2UgYXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy90dWxpcC8KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgInR1bGlwLmgiCisKKwordm9pZCBwbmljX2RvX253YXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwl1MzIgcGh5X3JlZyA9IGlvcmVhZDMyKGlvYWRkciArIDB4QjgpOworCXUzMiBuZXdfY3NyNiA9IHRwLT5jc3I2ICYgfjB4NDBDNDAyMDA7CisKKwlpZiAocGh5X3JlZyAmIDB4NzgwMDAwMDApIHsgLyogSWdub3JlIGJhc2VUNCAqLworCQlpZiAocGh5X3JlZyAmIDB4MjAwMDAwMDApCQlkZXYtPmlmX3BvcnQgPSA1OworCQllbHNlIGlmIChwaHlfcmVnICYgMHg0MDAwMDAwMCkJZGV2LT5pZl9wb3J0ID0gMzsKKwkJZWxzZSBpZiAocGh5X3JlZyAmIDB4MTAwMDAwMDApCWRldi0+aWZfcG9ydCA9IDQ7CisJCWVsc2UgaWYgKHBoeV9yZWcgJiAweDA4MDAwMDAwKQlkZXYtPmlmX3BvcnQgPSAwOworCQl0cC0+bndheXNldCA9IDE7CisJCW5ld19jc3I2ID0gKGRldi0+aWZfcG9ydCAmIDEpID8gMHgwMTg2MDAwMCA6IDB4MDA0MjAwMDA7CisJCWlvd3JpdGUzMigweDMyIHwgKGRldi0+aWZfcG9ydCAmIDEpLCBpb2FkZHIgKyBDU1IxMik7CisJCWlmIChkZXYtPmlmX3BvcnQgJiAxKQorCQkJaW93cml0ZTMyKDB4MUY4NjgsIGlvYWRkciArIDB4QjgpOworCQlpZiAocGh5X3JlZyAmIDB4MzAwMDAwMDApIHsKKwkJCXRwLT5mdWxsX2R1cGxleCA9IDE7CisJCQluZXdfY3NyNiB8PSAweDAwMDAwMjAwOworCQl9CisJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFBOSUMgYXV0b25lZ290aWF0ZWQgc3RhdHVzICU4Ljh4LCAlcy5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBwaHlfcmVnLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSk7CisJCWlmICh0cC0+Y3NyNiAhPSBuZXdfY3NyNikgeworCQkJdHAtPmNzcjYgPSBuZXdfY3NyNjsKKwkJCS8qIFJlc3RhcnQgVHggKi8KKwkJCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJfQorCX0KK30KKwordm9pZCBwbmljX2xua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNzcjUpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJaW50IHBoeV9yZWcgPSBpb3JlYWQzMihpb2FkZHIgKyAweEI4KTsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUE5JQyBsaW5rIGNoYW5nZWQgc3RhdGUgJTguOHgsIENTUjUgJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBwaHlfcmVnLCBjc3I1KTsKKwlpZiAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSkgJiBUUExua0ZhaWwpIHsKKwkJaW93cml0ZTMyKChpb3JlYWQzMihpb2FkZHIgKyBDU1I3KSAmIH5UUExua0ZhaWwpIHwgVFBMbmtQYXNzLCBpb2FkZHIgKyBDU1I3KTsKKwkJLyogSWYgd2UgdXNlIGFuIGV4dGVybmFsIE1JSSwgdGhlbiB3ZSBtdXN0bid0IHVzZSB0aGUKKwkJICogaW50ZXJuYWwgbmVnb3RpYXRpb24uCisJCSAqLworCQlpZiAodHVsaXBfbWVkaWFfY2FwW2Rldi0+aWZfcG9ydF0gJiBNZWRpYUlzTUlJKQorCQkJcmV0dXJuOworCQlpZiAoISB0cC0+bndheXNldCAgfHwgIGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0ID4gMSpIWikgeworCQkJdHAtPmNzcjYgPSAweDAwNDIwMDAwIHwgKHRwLT5jc3I2ICYgMHgwMDAwZmRmZik7CisJCQlpb3dyaXRlMzIodHAtPmNzcjYsIGlvYWRkciArIENTUjYpOworCQkJaW93cml0ZTMyKDB4MzAsIGlvYWRkciArIENTUjEyKTsKKwkJCWlvd3JpdGUzMigweDAyMDFGMDc4LCBpb2FkZHIgKyAweEI4KTsgLyogVHVybiBvbiBhdXRvbmVnb3RpYXRpb24uICovCisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJfQorCX0gZWxzZSBpZiAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSkgJiBUUExua1Bhc3MpIHsKKwkJaWYgKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworCQkJc3Bpbl9sb2NrKCZ0cC0+bG9jayk7CisJCQl0dWxpcF9jaGVja19kdXBsZXgoZGV2KTsKKwkJCXNwaW5fdW5sb2NrKCZ0cC0+bG9jayk7CisJCX0gZWxzZSB7CisJCQlwbmljX2RvX253YXkoZGV2KTsKKwkJfQorCQlpb3dyaXRlMzIoKGlvcmVhZDMyKGlvYWRkciArIENTUjcpICYgflRQTG5rUGFzcykgfCBUUExua0ZhaWwsIGlvYWRkciArIENTUjcpOworCX0KK30KKwordm9pZCBwbmljX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlpbnQgbmV4dF90aWNrID0gNjAqSFo7CisKKwlpZighaW9yZWFkMzIoaW9hZGRyICsgQ1NSNykpIHsKKwkJLyogdGhlIHRpbWVyIHdhcyBjYWxsZWQgZHVlIHRvIGEgd29yayBvdmVyZmxvdworCQkgKiBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIuIFNraXAgdGhlIGNvbm5lY3Rpb24KKwkJICogY2hlY2tzLCB0aGUgbmljIGlzIGRlZmluaXRpdmVseSBzcGVha2luZyB3aXRoCisJCSAqIGhpcyBsaW5rIHBhcnRuZXIuCisJCSAqLworCQlnb3RvIHRvb19nb29kX2Nvbm5lY3Rpb247CisJfQorCisJaWYgKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworCQlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJCWlmICh0dWxpcF9jaGVja19kdXBsZXgoZGV2KSA+IDApCisJCQluZXh0X3RpY2sgPSAzKkhaOworCQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwl9IGVsc2UgeworCQlpbnQgY3NyMTIgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMik7CisJCWludCBuZXdfY3NyNiA9IHRwLT5jc3I2ICYgfjB4NDBDNDAyMDA7CisJCWludCBwaHlfcmVnID0gaW9yZWFkMzIoaW9hZGRyICsgMHhCOCk7CisJCWludCBjc3I1ID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSk7CisKKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUE5JQyB0aW1lciBQSFkgc3RhdHVzICU4Ljh4LCAlcyAiCisJCQkJICAgIkNTUjUgJTguOHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgcGh5X3JlZywgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0sIGNzcjUpOworCQlpZiAocGh5X3JlZyAmIDB4MDQwMDAwMDApIHsJLyogUmVtb3RlIGxpbmsgZmF1bHQgKi8KKwkJCWlvd3JpdGUzMigweDAyMDFGMDc4LCBpb2FkZHIgKyAweEI4KTsKKwkJCW5leHRfdGljayA9IDEqSFo7CisJCQl0cC0+bndheXNldCA9IDA7CisJCX0gZWxzZSBpZiAocGh5X3JlZyAmIDB4NzgwMDAwMDApIHsgLyogSWdub3JlIGJhc2VUNCAqLworCQkJcG5pY19kb19ud2F5KGRldik7CisJCQluZXh0X3RpY2sgPSA2MCpIWjsKKwkJfSBlbHNlIGlmIChjc3I1ICYgVFBMbmtGYWlsKSB7IC8qIDEwMGJhc2VUeCBsaW5rIGJlYXQgKi8KKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyBsaW5rIGJlYXQgZmFpbGVkLCBDU1IxMiAlNC40eCwgIgorCQkJCQkgICAiQ1NSNSAlOC44eCwgUEhZICUzLjN4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgY3NyMTIsCisJCQkJCSAgIGlvcmVhZDMyKGlvYWRkciArIENTUjUpLCBpb3JlYWQzMihpb2FkZHIgKyAweEI4KSk7CisJCQluZXh0X3RpY2sgPSAzKkhaOworCQkJaWYgKHRwLT5tZWRpYWxvY2spIHsKKwkJCX0gZWxzZSBpZiAodHAtPm53YXlzZXQgICYmICAoZGV2LT5pZl9wb3J0ICYgMSkpIHsKKwkJCQluZXh0X3RpY2sgPSAxKkhaOworCQkJfSBlbHNlIGlmIChkZXYtPmlmX3BvcnQgPT0gMCkgeworCQkJCWRldi0+aWZfcG9ydCA9IDM7CisJCQkJaW93cml0ZTMyKDB4MzMsIGlvYWRkciArIENTUjEyKTsKKwkJCQluZXdfY3NyNiA9IDB4MDE4NjAwMDA7CisJCQkJaW93cml0ZTMyKDB4MUY4NjgsIGlvYWRkciArIDB4QjgpOworCQkJfSBlbHNlIHsKKwkJCQlkZXYtPmlmX3BvcnQgPSAwOworCQkJCWlvd3JpdGUzMigweDMyLCBpb2FkZHIgKyBDU1IxMik7CisJCQkJbmV3X2NzcjYgPSAweDAwNDIwMDAwOworCQkJCWlvd3JpdGUzMigweDFGMDc4LCBpb2FkZHIgKyAweEI4KTsKKwkJCX0KKwkJCWlmICh0cC0+Y3NyNiAhPSBuZXdfY3NyNikgeworCQkJCXRwLT5jc3I2ID0gbmV3X2NzcjY7CisJCQkJLyogUmVzdGFydCBUeCAqLworCQkJCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisJCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENoYW5naW5nIFBOSUMgY29uZmlndXJhdGlvbiB0byAlcyAiCisJCQkJCQkgICAiJXMtZHVwbGV4LCBDU1I2ICU4Ljh4LlxuIiwKKwkJCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0sCisJCQkJCQkgICB0cC0+ZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIsIG5ld19jc3I2KTsKKwkJCX0KKwkJfQorCX0KK3Rvb19nb29kX2Nvbm5lY3Rpb246CisJbW9kX3RpbWVyKCZ0cC0+dGltZXIsIFJVTl9BVChuZXh0X3RpY2spKTsKKwlpZighaW9yZWFkMzIoaW9hZGRyICsgQ1NSNykpIHsKKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzdyB0aW1lciB3YWtldXAuXG4iLCBkZXYtPm5hbWUpOworCQlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJCXR1bGlwX3JlZmlsbF9yeChkZXYpOworCQllbmFibGVfaXJxKGRldi0+aXJxKTsKKwkJaW93cml0ZTMyKHR1bGlwX3RibFt0cC0+Y2hpcF9pZF0udmFsaWRfaW50cnMsIGlvYWRkciArIENTUjcpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3BuaWMyLmMgYi9kcml2ZXJzL25ldC90dWxpcC9wbmljMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZjRhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC9wbmljMi5jCkBAIC0wLDAgKzEsNDA3IEBACisvKgorCWRyaXZlcnMvbmV0L3R1bGlwL3BuaWMyLmMKKworCU1haW50YWluZWQgYnkgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQorCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgorICAgICAgICBNb2RpZmllZCB0byBoZXAgc3VwcG9ydCBQTklDX0lJIGJ5IEtldmluIEIuIEhlbmRyaWNrcworCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlQbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3R1bGlwLXVzZXIue3BkZixwcyxodG1sfQorCWZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgZHJpdmVyLCBvciB2aXNpdCB0aGUgcHJvamVjdAorCVdlYiBwYWdlIGF0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdHVsaXAvCisKKyovCisKKworLyogVW5kZXJzdGFuZGluZyB0aGUgUE5JQ19JSSAtIGV2ZXJ5dGhpbmcgaXMgdGhpcyBmaWxlIGlzIGJhc2VkCisgKiBvbiB0aGUgUE5JQ19JSV9QREYgZGF0YXNoZWV0IHdoaWNoIGlzIHNvcmVseSBsYWNraW5nIGluIGRldGFpbAorICoKKyAqIEFzIEkgdW5kZXJzdGFuZCB0aGluZ3MsIGhlcmUgYXJlIHRoZSByZWdpc3RlcnMgYW5kIGJpdHMgdGhhdAorICogZXhwbGFpbiB0aGUgbWFza3MgYW5kIGNvbnN0YW50cyB1c2VkIGluIHRoaXMgZmlsZSB0aGF0IGFyZQorICogZWl0aGVyIGRpZmZlcmVudCBmcm9tIHRoZSAyMTE0Mi8zIG9yIGltcG9ydGFudCBmb3IgYmFzaWMgb3BlcmF0aW9uLgorICoKKyAqCisgKiBDU1IgNiAgKG1hc2sgPSAweGZlM2JkMWZkIG9mIGJpdHMgbm90IHRvIGNoYW5nZSkKKyAqIC0tLS0tCisgKiBCaXQgMjQgICAgLSBTQ1IKKyAqIEJpdCAyMyAgICAtIFBDUworICogQml0IDIyICAgIC0gVFRNIChUcmFzbWl0IFRocmVzaG9sZCBNb2RlKQorICogQml0IDE4ICAgIC0gUG9ydCBTZWxlY3QKKyAqIEJpdCAxMyAgICAtIFN0YXJ0IC0gMSwgU3RvcCAtIDAgVHJhbnNtaXNzaW9ucworICogQml0IDExOjEwIC0gTG9vcCBCYWNrIE9wZXJhdGlvbiBNb2RlCisgKiBCaXQgOSAgICAgLSBGdWxsIER1cGxleCBtb2RlIChBZHZlcnRpc2UgMTBCYXNlVC1GRCBpcyBDU1IxNDw3PiBpcyBzZXQpCisgKiBCaXQgMSAgICAgLSBTdGFydCAtIDEsIFN0b3AgLSAwIFJlY2VpdmUKKyAqCisgKgorICogQ1NSIDE0ICAobWFzayA9IDB4ZmZmMGVlMzkgb2YgYml0cyBub3QgdG8gY2hhbmdlKQorICogLS0tLS0tCisgKiBCaXQgMTkgICAgLSBQQVVTRS1QYXVzZQorICogQml0IDE4ICAgIC0gQWR2ZXJ0aXNlIFQ0CisgKiBCaXQgMTcgICAgLSBBZHZlcnRpc2UgMTAwYmFzZVR4LUZECisgKiBCaXQgMTYgICAgLSBBZHZlcnRpc2UgMTAwYmFzZVR4LUhECisgKiBCaXQgMTIgICAgLSBMVEUgLSBMaW5rIFRlc3QgRW5hYmxlCisgKiBCaXQgNyAgICAgLSBBTkUgLSBBdXRvIE5lZ290aWF0ZSBFbmFibGUKKyAqIEJpdCA2ICAgICAtIEhERSAtIEFkdmVydGlzZSAxMGJhc2VULUhECisgKiBCaXQgMiAgICAgLSBSZXNldCB0byBQb3dlciBkb3duIC0ga2VwdCBhcyAxIGZvciBub3JtYWwgb3BlcmF0aW9uCisgKiBCaXQgMSAgICAgLSAgTG9vcCBCYWNrIGVuYWJsZSBmb3IgMTBiYXNlVCBNQ0MKKyAqCisgKgorICogQ1NSIDEyCisgKiAtLS0tLS0KKyAqIEJpdCAyNSAgICAtIFBhcnRuZXIgY2FuIGRvIFQ0CisgKiBCaXQgMjQgICAgLSBQYXJ0bmVyIGNhbiBkbyAxMDBiYXNlVHgtRkQKKyAqIEJpdCAyMyAgICAtIFBhcnRuZXIgY2FuIGRvIDEwMGJhc2VUeC1IRAorICogQml0IDIyICAgIC0gUGFydG5lciBjYW4gZG8gMTBiYXNlVC1GRAorICogQml0IDIxICAgIC0gUGFydG5lciBjYW4gZG8gMTBiYXNlVC1IRAorICogQml0IDE1ICAgIC0gTFBOIGlzIDEgaWYgYWxsIGFib3ZlIGJpdHMgYXJlIHZhbGlkIG90aGVyIHdpc2UgMAorICogQml0IDE0OjEyIC0gYXV0b25lZ290aWF0aW9uIHN0YXRlICh3cml0ZSAwMDEgdG8gc3RhcnQgYXV0b25lZ290aWF0ZSkKKyAqIEJpdCAzICAgICAtIEF1dG9wb2xhcml0eSBzdGF0ZQorICogQml0IDIgICAgIC0gTFMxMEIgLSBsaW5rIHN0YXRlIG9mIDEwYmFzZVQgMCAtIGdvb2QsIDEgLSBmYWlsZWQKKyAqIEJpdCAxICAgICAtIExTMTAwQiAtIGxpbmsgc3RhdGUgb2YgMTAwYmFzZVQgMCAtIGdvb2QsIDEtIGZhaWxkCisgKgorICoKKyAqIERhdGEgUG9ydCBTZWxlY3Rpb24gSW5mbworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQ1NSMTQ8Nz4gICBDU1I2PDE4PiAgICBDU1I2PDIyPiAgICBDU1I2PDIzPiAgICBDU1I2PDI0PiAgIE1PREUvUE9SVAorICogICAxICAgICAgICAgICAwICAgICAgICAgICAwIChYKSAgICAgICAwIChYKSAgICAgICAxICAgICAgICBOV0FZCisgKiAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDEgICAgICAgICAgIDAgKFgpICAgICAgIDAgICAgICAgIDEwYmFzZVQKKyAqICAgMCAgICAgICAgICAgMSAgICAgICAgICAgMCAgICAgICAgICAgMSAgICAgICAgICAgMSAoWCkgICAgMTAwYmFzZVQKKyAqCisgKgorICovCisKKworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSAidHVsaXAuaCIKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisKK3ZvaWQgcG5pYzJfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCWludCBuZXh0X3RpY2sgPSA2MCpIWjsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0lORk8iJXM6IFBOSUMyIG5lZ290aWF0aW9uIHN0YXR1cyAlOC44eC5cbiIsCisgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSxpb3JlYWQzMihpb2FkZHIgKyBDU1IxMikpOworCisJaWYgKG5leHRfdGljaykgeworCQltb2RfdGltZXIoJnRwLT50aW1lciwgUlVOX0FUKG5leHRfdGljaykpOworCX0KK30KKworCit2b2lkIHBuaWMyX3N0YXJ0X253YXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKyAgICAgICAgaW50IGNzcjE0OworICAgICAgICBpbnQgY3NyMTI7CisKKyAgICAgICAgLyogc2V0IHVwIHdoYXQgdG8gYWR2ZXJ0aXNlIGR1cmluZyB0aGUgbmVnb3RpYXRpb24gKi8KKworICAgICAgICAvKiBsb2FkIGluIGNzcjE0ICBhbmQgbWFzayBvZmYgYml0cyBub3QgdG8gdG91Y2gKKyAgICAgICAgICogY29tbWVudCBhdCB0b3Agb2YgZmlsZSBleHBsYWlucyBtYXNrIHZhbHVlCisgICAgICAgICAqLworCWNzcjE0ID0gKGlvcmVhZDMyKGlvYWRkciArIENTUjE0KSAmIDB4ZmZmMGVlMzkpOworCisgICAgICAgIC8qIGJpdCAxNyAtIGFkdmV0aXNlIDEwMGJhc2VUeC1GRCAqLworICAgICAgICBpZiAodHAtPnN5bV9hZHZlcnRpc2UgJiAweDAxMDApIGNzcjE0IHw9IDB4MDAwMjAwMDA7CisKKyAgICAgICAgLyogYml0IDE2IC0gYWR2ZXJ0aXNlIDEwMGJhc2VUeC1IRCAqLworICAgICAgICBpZiAodHAtPnN5bV9hZHZlcnRpc2UgJiAweDAwODApIGNzcjE0IHw9IDB4MDAwMTAwMDA7CisKKyAgICAgICAgLyogYml0IDYgLSBhZHZlcnRpc2UgMTBiYXNlVC1IRCAqLworICAgICAgICBpZiAodHAtPnN5bV9hZHZlcnRpc2UgJiAweDAwMjApIGNzcjE0IHw9IDB4MDAwMDAwNDA7CisKKyAgICAgICAgLyogTm93IHNldCBiaXQgMTIgTGluayBUZXN0IEVuYWJsZSwgQml0IDcgQXV0b25lZ290aWF0aW9uIEVuYWJsZQorICAgICAgICAgKiBhbmQgYml0IDAgRG9uJ3QgUG93ZXJEb3duIDEwYmFzZVQKKyAgICAgICAgICovCisgICAgICAgIGNzcjE0IHw9IDB4MDAwMDExODQ7CisKKwlpZiAodHVsaXBfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlc3RhcnRpbmcgUE5JQzIgYXV0b25lZ290aWF0aW9uLCAiCisgICAgICAgICAgICAgICAgICAgICAgImNzcjE0PSU4Ljh4LlxuIiwgZGV2LT5uYW1lLCBjc3IxNCk7CisKKyAgICAgICAgLyogdGVsbCBwbmljMl9sbmtfY2hhbmdlIHdlIGFyZSBkb2luZyBhbiBud2F5IG5lZ290aWF0aW9uICovCisJZGV2LT5pZl9wb3J0ID0gMDsKKwl0cC0+bndheSA9IHRwLT5tZWRpYXNlbnNlID0gMTsKKwl0cC0+bndheXNldCA9IHRwLT5scGFyID0gMDsKKworICAgICAgICAvKiBub3cgd2UgaGF2ZSB0byBzZXQgdXAgY3NyNiBmb3IgTldBWSBzdGF0ZSAqLworCisJdHAtPmNzcjYgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I2KTsKKwlpZiAodHVsaXBfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE9uIEVudHJ5IHRvIE53YXksICIKKyAgICAgICAgICAgICAgICAgICAgICAiY3NyNj0lOC44eC5cbiIsIGRldi0+bmFtZSwgdHAtPmNzcjYpOworCisgICAgICAgIC8qIG1hc2sgb2ZmIGFueSBiaXRzIG5vdCB0byB0b3VjaAorICAgICAgICAgKiBjb21tZW50IGF0IHRvcCBvZiBmaWxlIGV4cGxhaW5zIG1hc2sgdmFsdWUKKyAgICAgICAgICovCisJdHAtPmNzcjYgPSB0cC0+Y3NyNiAmIDB4ZmUzYmQxZmQ7CisKKyAgICAgICAgLyogZG9uJ3QgZm9yZ2V0IHRoYXQgYml0IDkgaXMgYWxzbyB1c2VkIGZvciBhZHZlcnRpc2luZyAqLworICAgICAgICAvKiBhZHZlcnRpc2UgMTBiYXNlVC1GRCBmb3IgdGhlIG5lZ290aWF0aW9uIChiaXQgOSkgKi8KKyAgICAgICAgaWYgKHRwLT5zeW1fYWR2ZXJ0aXNlICYgMHgwMDQwKSB0cC0+Y3NyNiB8PSAweDAwMDAwMjAwOworCisgICAgICAgIC8qIHNldCBiaXQgMjQgZm9yIG53YXkgbmVnb3RpYXRpb24gbW9kZSAuLi4KKyAgICAgICAgICogc2VlIERhdGEgUG9ydCBTZWxlY3Rpb24gY29tbWVudCBhdCB0b3Agb2YgZmlsZQorICAgICAgICAgKiBhbmQgIlN0b3AiIC0gcmVzZXQgYm90aCBUcmFuc21pdCAoYml0IDEzKSBhbmQgUmVjZWl2ZSAoYml0IDEpCisgICAgICAgICAqLworICAgICAgICB0cC0+Y3NyNiB8PSAweDAxMDAwMDAwOworCWlvd3JpdGUzMihjc3IxNCwgaW9hZGRyICsgQ1NSMTQpOworCWlvd3JpdGUzMih0cC0+Y3NyNiwgaW9hZGRyICsgQ1NSNik7CisgICAgICAgIHVkZWxheSgxMDApOworCisgICAgICAgIC8qIGFsbCBzZXQgdXAgc28gbm93IGZvcmNlIHRoZSBuZWdvdGlhdGlvbiB0byBiZWdpbiAqLworCisgICAgICAgIC8qIHJlYWQgaW4gY3VycmVudCB2YWx1ZXMgYW5kIG1hc2sgb2ZmIGFsbCBidXQgdGhlCisJICogQXV0b25lZ290aWF0aW9uIGJpdHMgMTQ6MTIuICBXcml0aW5nIGEgMDAxIHRvIHRob3NlIGJpdHMKKyAgICAgICAgICogc2hvdWxkIHN0YXJ0IHRoZSBhdXRvbmVnb3RpYXRpb24KKyAgICAgICAgICovCisgICAgICAgIGNzcjEyID0gKGlvcmVhZDMyKGlvYWRkciArIENTUjEyKSAmIDB4ZmZmZjhmZmYpOworICAgICAgICBjc3IxMiB8PSAweDEwMDA7CisJaW93cml0ZTMyKGNzcjEyLCBpb2FkZHIgKyBDU1IxMik7Cit9CisKKworCit2b2lkIHBuaWMyX2xua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNzcjUpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisgICAgICAgIGludCBjc3IxNDsKKworICAgICAgICAvKiByZWFkIHRoZSBzdGF1cyByZWdpc3RlciB0byBmaW5kIG91dCB3aGF0IGlzIHVwICovCisJaW50IGNzcjEyID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpOworCisJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyIlczogUE5JQzIgbGluayBzdGF0dXMgaW50ZXJydXB0ICU4Ljh4LCAiCisgICAgICAgICAgICAgICAgICAgICAgICIgQ1NSNSAleCwgJTguOHguXG4iLCBkZXYtPm5hbWUsIGNzcjEyLAorICAgICAgICAgICAgICAgICAgICAgICBjc3I1LCBpb3JlYWQzMihpb2FkZHIgKyBDU1IxNCkpOworCisJLyogSWYgTldheSBmaW5pc2hlZCBhbmQgd2UgaGF2ZSBhIG5lZ290aWF0ZWQgcGFydG5lciBjYXBhYmlsaXR5LgorICAgICAgICAgKiBjaGVjayBiaXRzIDE0OjEyIGZvciBiaXQgcGF0dGVybiAxMDEgLSBhbGwgaXMgZ29vZAorICAgICAgICAgKi8KKwlpZiAodHAtPm53YXkgICYmICAhdHAtPm53YXlzZXQpIHsKKworCSAgICAgICAgLyogd2UgZGlkIGFuIGF1dG8gbmVnb3RpYXRpb24gKi8KKworICAgICAgICAgICAgICAgIGlmICgoY3NyMTIgJiAweDcwMDApID09IDB4NTAwMCkgeworCisJICAgICAgICAgICAgICAgLyogbmVnb3RpYXRpb24gZW5kZWQgc3VjY2Vzc2Z1bGx5ICovCisKKwkgICAgICAgICAgICAgICAvKiBnZXQgdGhlIGxpbmsgcGFydG5lcnMgcmVwbHkgYW5kIG1hc2sgb3V0IGFsbCBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICogYml0cyAyNC0yMSB3aGljaCBzaG93IHRoZSBwYXJ0bmVycyBjYXBhYmlsaXRlcworICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgbWF0Y2ggdGhvc2UgdG8gd2hhdCB3ZSBhZHZlcnRpc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZW4gYmVnaW4gdG8gaW50ZXJwcmV0IHRoZSByZXN1bHRzIG9mIHRoZSBuZWdvdGlhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICogQWx3YXlzIGdvIGluIHRoaXMgb3JkZXIgOiAod2UgYXJlIGlnbm9yaW5nIFQ0IGZvciBub3cpCisgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAxMDBiYXNlVHgtRkQsIDEwMGJhc2VUeC1IRCwgMTBiYXNlVC1GRCwgMTBiYXNlVC1IRAorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCQkgICAgICAgIGludCBuZWdvdGlhdGVkID0gKChjc3IxMiA+PiAxNikgJiAweDAxRTApICYgdHAtPnN5bV9hZHZlcnRpc2U7CisJCSAgICAgICAgdHAtPmxwYXIgPSAoY3NyMTIgPj4gMTYpOworCQkgICAgICAgIHRwLT5ud2F5c2V0ID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZ290aWF0ZWQgJiAweDAxMDApICAgICAgICBkZXYtPmlmX3BvcnQgPSA1OworCQkgICAgICAgIGVsc2UgaWYgKG5lZ290aWF0ZWQgJiAweDAwODApCWRldi0+aWZfcG9ydCA9IDM7CisJCSAgICAgICAgZWxzZSBpZiAobmVnb3RpYXRlZCAmIDB4MDA0MCkJZGV2LT5pZl9wb3J0ID0gNDsKKwkJCWVsc2UgaWYgKG5lZ290aWF0ZWQgJiAweDAwMjApCWRldi0+aWZfcG9ydCA9IDA7CisJCQllbHNlIHsKKwkJCSAgICAgaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBmdW5ueSBhdXRvbmVnb3RpYXRlIHJlc3VsdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNzcjEyICU4Ljh4IGFkdmVydGlzaW5nICU0LjR4XG4iLAorCQkJICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGNzcjEyLCB0cC0+c3ltX2FkdmVydGlzZSk7CisJCQkgICAgIHRwLT5ud2F5c2V0ID0gMDsKKwkJCSAgICAgLyogc28gY2hlY2sgIGlmIDEwMGJhc2VUeCBsaW5rIHN0YXRlIGlzIG9rYXkgKi8KKwkJCSAgICAgaWYgKChjc3IxMiAmIDIpID09IDAgICYmICAodHAtPnN5bV9hZHZlcnRpc2UgJiAweDAxODApKQorCQkJICAgICAgIGRldi0+aWZfcG9ydCA9IDM7CisJCQl9CisKKwkJCS8qIG5vdyByZWNvcmQgdGhlIGR1cGxleCB0aGF0IHdhcyBuZWdvdGlhdGVkICovCisJCQl0cC0+ZnVsbF9kdXBsZXggPSAwOworCQkJaWYgKChkZXYtPmlmX3BvcnQgPT0gNCkgfHwgKGRldi0+aWZfcG9ydCA9PSA1KSkKKwkJCSAgICAgICB0cC0+ZnVsbF9kdXBsZXggPSAxOworCisJCQlpZiAodHVsaXBfZGVidWcgPiAxKSB7CisJCQkgICAgICAgaWYgKHRwLT5ud2F5c2V0KQorCQkJICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBTd2l0Y2hpbmcgdG8gJXMgYmFzZWQgb24gbGluayAiCisJCQkJICAgICJuZWdvdGlhdGlvbiAlNC40eCAmICU0LjR4ID0gJTQuNHguXG4iLAorCQkJCSAgICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3ltX2FkdmVydGlzZSwgdHAtPmxwYXIsIG5lZ290aWF0ZWQpOworCQkJfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1lbWJlciB0byB0dXJuIG9mZiBiaXQgNyAtIGF1dG9uZWdvdGlhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGVuYWJsZSBzbyB3ZSBjYW4gcHJvcGVybHkgZW5kIG53YXkgbW9kZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNldCBkdXBsZXggKGllLiB1c2UgY3NyNjw5PiBhZ2FpbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCSAgICAgICAgICAgICAgICBjc3IxNCA9IChpb3JlYWQzMihpb2FkZHIgKyBDU1IxNCkgJiAweGZmZmZmZjdmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvd3JpdGUzMihjc3IxNCxpb2FkZHIgKyBDU1IxNCk7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IHNldCB0aGUgZGF0YSBwb3J0IGFuZCBvcGVyYXRpbmcgbW9kZQorCQkJICogKHNlZSB0aGUgRGF0YSBQb3J0IFNlbGVjdGlvbiBjb21tZW50cyBhdAorCQkJICogdGhlIHRvcCBvZiB0aGUgZmlsZQorCQkJICovCisKKwkJCS8qIGdldCBjdXJyZW50IGNzcjYgYW5kIG1hc2sgb2ZmIGJpdHMgbm90IHRvIHRvdWNoICovCisJCQkvKiBzZWUgY29tbWVudCBhdCB0b3Agb2YgZmlsZSAqLworCisJCQl0cC0+Y3NyNiA9IChpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSAmIDB4ZmUzYmQxZmQpOworCisJCQkvKiBzbyBpZiB1c2luZyBpZl9wb3J0IDMgb3IgNSB0aGVuIHNlbGVjdCB0aGUgMTAwYmFzZVQKKwkJCSAqIHBvcnQgZWxzZSBzZWxlY3QgdGhlIDEwYmFzZVQgcG9ydC4KKwkJCSAqIFNlZSB0aGUgRGF0YSBQb3J0IFNlbGVjdGlvbiB0YWJsZSBhdCB0aGUgdG9wCisJCQkgKiBvZiB0aGUgZmlsZSB3aGljaCB3YXMgdGFrZW4gZnJvbSB0aGUgUE5JQ19JSS5QREYKKwkJCSAqIGRhdGFzaGVldAorCQkJICovCisJCQlpZiAoZGV2LT5pZl9wb3J0ICYgMSkgdHAtPmNzcjYgfD0gMHgwMTg0MDAwMDsKKwkJCWVsc2UgdHAtPmNzcjYgfD0gMHgwMDQwMDAwMDsKKworCQkJLyogbm93IHNldCB0aGUgZnVsbCBkdXBsZXggYml0IGFwcHJvcHJpYXRlbHkgKi8KKwkJCWlmICh0cC0+ZnVsbF9kdXBsZXgpIHRwLT5jc3I2IHw9IDB4MDAwMDAyMDA7CisKKwkJCWlvd3JpdGUzMigxLCBpb2FkZHIgKyBDU1IxMyk7CisKKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDIpCisJCQkgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogIFNldHRpbmcgQ1NSNiAlOC44eC8leCBDU1IxMiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlOC44eC5cbiIsIGRldi0+bmFtZSwgdHAtPmNzcjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvcmVhZDMyKGlvYWRkciArIENTUjYpLCBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMikpOworCisJCQkvKiBub3cgdGhlIGZvbGxvd2luZyBhY3R1YWxseSB3cml0ZXMgb3V0IHRoZQorCQkJICogbmV3IGNzcjYgdmFsdWVzCisJCQkgKi8KKwkJCXR1bGlwX3N0YXJ0X3J4dHgodHApOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKwkgICAgICAgIH0gZWxzZSB7CisJICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvbmVnb3RpYXRpb24gZmFpbGVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgJXMsIGxpbmsgYmVhdCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCSAgICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgY3NyMTIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1lbWJlciB0byB0dXJuIG9mZiBiaXQgNyAtIGF1dG9uZWdvdGlhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGVuYWJsZSBzbyB3ZSBkb24ndCBmb3JnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCSAgICAgICAgICAgICAgICBjc3IxNCA9IChpb3JlYWQzMihpb2FkZHIgKyBDU1IxNCkgJiAweGZmZmZmZjdmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvd3JpdGUzMihjc3IxNCxpb2FkZHIgKyBDU1IxNCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoYXQgc2hvdWxkIHdlIGRvIHdoZW4gYXV0b25lZ290aWF0ZSBmYWlscz8KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNob3VsZCB3ZSB0cnkgYWdhaW4gb3IgZGVmYXVsdCB0byBiYXNlbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICogY2FzZS4gIEkganVzdCBkb24ndCBrbm93LgorICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciBub3cgZGVmYXVsdCB0byBzb21lIGJhc2VsaW5lIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJICAgICAgICAgICAgICAgICBkZXYtPmlmX3BvcnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5ud2F5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bndheXNldCA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdG8gMTBiYXNlVHgtSEQgLSBzZWUgRGF0YSBQb3J0IFNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvbW1lbnQgZ2l2ZW4gYXQgdGhlIHRvcCBvZiB0aGUgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCSAgICAgICAgICAgICAgICAgdHAtPmNzcjYgPSAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSNikgJiAweGZlM2JkMWZkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+Y3NyNiB8PSAweDAwNDAwMDAwOworCisJICAgICAgICAgICAgICAgICB0dWxpcF9yZXN0YXJ0X3J4dHgodHApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisJCX0KKwl9CisKKwlpZiAoKHRwLT5ud2F5c2V0ICAmJiAgKGNzcjUgJiAweDA4MDAwMDAwKQorCQkJICAmJiAoZGV2LT5pZl9wb3J0ID09IDMgIHx8ICBkZXYtPmlmX3BvcnQgPT0gNSkKKwkJCSAgJiYgKGNzcjEyICYgMikgPT0gMikgfHwgKHRwLT5ud2F5ICYmIChjc3I1ICYgKFRQTG5rRmFpbCkpKSkgeworCisJCS8qIExpbmsgYmxldz8gTWF5YmUgcmVzdGFydCBOV2F5LiAqLworCisJCWlmICh0dWxpcF9kZWJ1ZyA+IDIpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFVnaCEgTGluayBibGV3P1xuIiwgZGV2LT5uYW1lKTsKKworCQlkZWxfdGltZXJfc3luYygmdHAtPnRpbWVyKTsKKwkJcG5pYzJfc3RhcnRfbndheShkZXYpOworCQl0cC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKKwkJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworCX0KKworCisgICAgICAgIGlmIChkZXYtPmlmX3BvcnQgPT0gMyAgfHwgIGRldi0+aWZfcG9ydCA9PSA1KSB7CisKKwkgICAgICAgIC8qIHdlIGFyZSBhdCAxMDBtYiBhbmQgYSBwb3RlbnRpYWwgbGluayBjaGFuZ2Ugb2NjdXJyZWQgKi8KKworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogUE5JQzIgJXMgbGluayBiZWF0ICVzLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLAorCQkJCSAgIChjc3IxMiAmIDIpID8gImZhaWxlZCIgOiAiZ29vZCIpOworCisgICAgICAgICAgICAgICAgLyogY2hlY2sgMTAwIGxpbmsgYmVhdCAqLworCisgICAgICAgICAgICAgICAgdHAtPm53YXkgPSAwOworICAgICAgICAgICAgICAgIHRwLT5ud2F5c2V0ID0gMTsKKworICAgICAgICAgICAgICAgIC8qIGlmIGZhaWxlZCB0aGVuIHRyeSBkb2luZyBhbiBud2F5IHRvIGdldCBpbiBzeW5jICovCisJCWlmICgoY3NyMTIgJiAyKSAgJiYgICEgdHAtPm1lZGlhbG9jaykgeworCQkJZGVsX3RpbWVyX3N5bmMoJnRwLT50aW1lcik7CisJCQlwbmljMl9zdGFydF9ud2F5KGRldik7CisJCQl0cC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKKyAgICAgICAJCQlhZGRfdGltZXIoJnRwLT50aW1lcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDAgIHx8ICBkZXYtPmlmX3BvcnQgPT0gNCkgeworCisJICAgICAgICAvKiB3ZSBhcmUgYXQgMTBtYiBhbmQgYSBwb3RlbnRpYWwgbGluayBjaGFuZ2Ugb2NjdXJyZWQgKi8KKworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogUE5JQzIgJXMgbGluayBiZWF0ICVzLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLAorCQkJCSAgIChjc3IxMiAmIDQpID8gImZhaWxlZCIgOiAiZ29vZCIpOworCisKKyAgICAgICAgICAgICAgICB0cC0+bndheSA9IDA7CisgICAgICAgICAgICAgICAgdHAtPm53YXlzZXQgPSAxOworCisgICAgICAgICAgICAgICAgLyogaWYgZmFpbGVkLCB0cnkgZG9pbmcgYW4gbndheSB0byBnZXQgaW4gc3luYyAqLworCQlpZiAoKGNzcjEyICYgNCkgICYmICAhIHRwLT5tZWRpYWxvY2spIHsKKwkJCWRlbF90aW1lcl9zeW5jKCZ0cC0+dGltZXIpOworCQkJcG5pYzJfc3RhcnRfbndheShkZXYpOworCQkJdHAtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQoMypIWik7CisgICAgICAgCQkJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisKKwlpZiAodHVsaXBfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9JTkZPIiVzOiBQTklDMiBMaW5rIENoYW5nZSBEZWZhdWx0P1xuIixkZXYtPm5hbWUpOworCisgICAgICAgIC8qIGlmIGFsbCBlbHNlIGZhaWxzIGRlZmF1bHQgdG8gdHJ5aW5nIDEwYmFzZVQtSEQgKi8KKwlkZXYtPmlmX3BvcnQgPSAwOworCisgICAgICAgIC8qIG1ha2Ugc3VyZSBhdXRvbmVnb3RpYXRlIGVuYWJsZSBpcyBvZmYgKi8KKwljc3IxNCA9IChpb3JlYWQzMihpb2FkZHIgKyBDU1IxNCkgJiAweGZmZmZmZjdmKTsKKyAgICAgICAgaW93cml0ZTMyKGNzcjE0LGlvYWRkciArIENTUjE0KTsKKworICAgICAgICAvKiBzZXQgdG8gMTBiYXNlVHgtSEQgLSBzZWUgRGF0YSBQb3J0IFNlbGVjdGlvbgorICAgICAgICAgKiBjb21tZW50IGdpdmVuIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUKKyAgICAgICAgICovCisJdHAtPmNzcjYgPSAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSNikgJiAweGZlM2JkMWZkKTsKKyAgICAgICAgdHAtPmNzcjYgfD0gMHgwMDQwMDAwMDsKKworCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3RpbWVyLmMgYi9kcml2ZXJzL25ldC90dWxpcC90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MTU2ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC90aW1lci5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorCWRyaXZlcnMvbmV0L3R1bGlwL3RpbWVyLmMKKworCU1haW50YWluZWQgYnkgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQorCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlQbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3R1bGlwLXVzZXIue3BkZixwcyxodG1sfQorCWZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgZHJpdmVyLCBvciB2aXNpdCB0aGUgcHJvamVjdAorCVdlYiBwYWdlIGF0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdHVsaXAvCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJ0dWxpcC5oIgorCisKK3ZvaWQgdHVsaXBfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCXUzMiBjc3IxMiA9IGlvcmVhZDMyKGlvYWRkciArIENTUjEyKTsKKwlpbnQgbmV4dF90aWNrID0gMipIWjsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDIpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNZWRpYSBzZWxlY3Rpb24gdGljaywgJXMsIHN0YXR1cyAlOC44eCBtb2RlIgorCQkJICAgIiAlOC44eCBTSUEgJTguOHggJTguOHggJTguOHggJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSksCisJCQkgICBpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSwgY3NyMTIsIGlvcmVhZDMyKGlvYWRkciArIENTUjEzKSwKKwkJCSAgIGlvcmVhZDMyKGlvYWRkciArIENTUjE0KSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTUpKTsKKwl9CisJc3dpdGNoICh0cC0+Y2hpcF9pZCkgeworCWNhc2UgREMyMTE0MDoKKwljYXNlIERDMjExNDI6CisJY2FzZSBNWDk4NzEzOgorCWNhc2UgQ09NUEVYOTg4MToKKwljYXNlIERNOTEwWDoKKwljYXNlIFVMSTUyNlg6CisJZGVmYXVsdDogeworCQlzdHJ1Y3QgbWVkaWFsZWFmICptbGVhZjsKKwkJdW5zaWduZWQgY2hhciAqcDsKKwkJaWYgKHRwLT5tdGFibGUgPT0gTlVMTCkgewkvKiBObyBFRVBST00gaW5mbywgdXNlIGdlbmVyaWMgY29kZS4gKi8KKwkJCS8qIE5vdCBtdWNoIHRoYXQgY2FuIGJlIGRvbmUuCisJCQkgICBBc3N1bWUgdGhpcyBhIGdlbmVyaWMgTUlJIG9yIFNZTSB0cmFuc2NlaXZlci4gKi8KKwkJCW5leHRfdGljayA9IDYwKkhaOworCQkJaWYgKHR1bGlwX2RlYnVnID4gMikKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5ldHdvcmsgbWVkaWEgbW9uaXRvciBDU1I2ICU4Ljh4ICIKKwkJCQkJICAgIkNTUjEyIDB4JTIuMnguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIENTUjYpLCBjc3IxMiAmIDB4ZmYpOworCQkJYnJlYWs7CisJCX0KKwkJbWxlYWYgPSAmdHAtPm10YWJsZS0+bWxlYWZbdHAtPmN1cl9pbmRleF07CisJCXAgPSBtbGVhZi0+bGVhZmRhdGE7CisJCXN3aXRjaCAobWxlYWYtPnR5cGUpIHsKKwkJY2FzZSAwOiBjYXNlIDQ6IHsKKwkJCS8qIFR5cGUgMCBzZXJpYWwgb3IgNCBTWU0gdHJhbnNjZWl2ZXIuICBDaGVjayB0aGUgbGluayBiZWF0IGJpdC4gKi8KKwkJCWludCBvZmZzZXQgPSBtbGVhZi0+dHlwZSA9PSA0ID8gNSA6IDI7CisJCQlzOCBiaXRudW0gPSBwW29mZnNldF07CisJCQlpZiAocFtvZmZzZXQrMV0gJiAweDgwKSB7CisJCQkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUciJXM6IFRyYW5zY2VpdmVyIG1vbml0b3IgdGljayAiCisJCQkJCQkgICAiQ1NSMTI9JSMyLjJ4LCBubyBtZWRpYSBzZW5zZS5cbiIsCisJCQkJCQkgICBkZXYtPm5hbWUsIGNzcjEyKTsKKwkJCQlpZiAobWxlYWYtPnR5cGUgPT0gNCkgeworCQkJCQlpZiAobWxlYWYtPm1lZGlhID09IDMgJiYgKGNzcjEyICYgMHgwMikpCisJCQkJCQlnb3RvIHNlbGVjdF9uZXh0X21lZGlhOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDIpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc2NlaXZlciBtb25pdG9yIHRpY2s6IENTUjEyPSUjMi4yeCIKKwkJCQkJICAgIiBiaXQgJWQgaXMgJWQsIGV4cGVjdGluZyAlZC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgY3NyMTIsIChiaXRudW0gPj4gMSkgJiA3LAorCQkJCQkgICAoY3NyMTIgJiAoMSA8PCAoKGJpdG51bSA+PiAxKSAmIDcpKSkgIT0gMCwKKwkJCQkJICAgKGJpdG51bSA+PSAwKSk7CisJCQkvKiBDaGVjayB0aGF0IHRoZSBzcGVjaWZpZWQgYml0IGhhcyB0aGUgcHJvcGVyIHZhbHVlLiAqLworCQkJaWYgKChiaXRudW0gPCAwKSAhPQorCQkJCSgoY3NyMTIgJiAoMSA8PCAoKGJpdG51bSA+PiAxKSAmIDcpKSkgIT0gMCkpIHsKKwkJCQlpZiAodHVsaXBfZGVidWcgPiAyKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IExpbmsgYmVhdCBkZXRlY3RlZCBmb3IgJXMuXG4iLCBkZXYtPm5hbWUsCisJCQkJCSAgICAgICBtZWRpYW5hbWVbbWxlYWYtPm1lZGlhICYgTUVESUFfTUFTS10pOworCQkJCWlmICgocFsyXSAmIDB4NjEpID09IDB4MDEpCS8qIEJvZ3VzIFpueXggYm9hcmQuICovCisJCQkJCWdvdG8gYWN0dWFsbHlfbWlpOworCQkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQlpZiAodHAtPm1lZGlhbG9jaykKKwkJCQlicmVhazsKKwkgIHNlbGVjdF9uZXh0X21lZGlhOgorCQkJaWYgKC0tdHAtPmN1cl9pbmRleCA8IDApIHsKKwkJCQkvKiBXZSBzdGFydCBhZ2FpbiwgYnV0IHNob3VsZCBpbnN0ZWFkIGxvb2sgZm9yIGRlZmF1bHQuICovCisJCQkJdHAtPmN1cl9pbmRleCA9IHRwLT5tdGFibGUtPmxlYWZjb3VudCAtIDE7CisJCQl9CisJCQlkZXYtPmlmX3BvcnQgPSB0cC0+bXRhYmxlLT5tbGVhZlt0cC0+Y3VyX2luZGV4XS5tZWRpYTsKKwkJCWlmICh0dWxpcF9tZWRpYV9jYXBbZGV2LT5pZl9wb3J0XSAmIE1lZGlhSXNGRCkKKwkJCQlnb3RvIHNlbGVjdF9uZXh0X21lZGlhOyAvKiBTa2lwIEZEIGVudHJpZXMuICovCisJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTm8gbGluayBiZWF0IG9uIG1lZGlhICVzLCIKKwkJCQkgICAgICAgIiB0cnlpbmcgdHJhbnNjZWl2ZXIgdHlwZSAlcy5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgbWVkaWFuYW1lW21sZWFmLT5tZWRpYSAmIE1FRElBX01BU0tdLAorCQkJCSAgICAgICBtZWRpYW5hbWVbdHAtPm10YWJsZS0+bWxlYWZbdHAtPmN1cl9pbmRleF0ubWVkaWFdKTsKKwkJCXR1bGlwX3NlbGVjdF9tZWRpYShkZXYsIDApOworCQkJLyogUmVzdGFydCB0aGUgdHJhbnNtaXQgcHJvY2Vzcy4gKi8KKwkJCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisJCQluZXh0X3RpY2sgPSAoMjQqSFopLzEwOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAxOiAgY2FzZSAzOgkJLyogMjExNDAsIDIxMTQyIE1JSSAqLworCQlhY3R1YWxseV9taWk6CisJCQlpZiAodHVsaXBfY2hlY2tfZHVwbGV4KGRldikgPCAwKSB7CisJCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJCQluZXh0X3RpY2sgPSAzKkhaOworCQkJfSBlbHNlIHsKKwkJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCQkJbmV4dF90aWNrID0gNjAqSFo7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgkJCQkJLyogMjExNDIgc2VyaWFsIGJsb2NrIGhhcyBubyBsaW5rIGJlYXQuICovCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlicmVhazsKKwl9CisJLyogbW9kX3RpbWVyIHN5bmNocm9uaXplcyB1cyB3aXRoIHBvdGVudGlhbCBhZGRfdGltZXIgY2FsbHMKKwkgKiBmcm9tIGludGVycnVwdHMuCisJICovCisJbW9kX3RpbWVyKCZ0cC0+dGltZXIsIFJVTl9BVChuZXh0X3RpY2spKTsKK30KKworCit2b2lkIG14aWNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCWludCBuZXh0X3RpY2sgPSA2MCpIWjsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyIlczogTVhJQyBuZWdvdGlhdGlvbiBzdGF0dXMgJTguOHguXG4iLCBkZXYtPm5hbWUsCisJCQkgICBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMikpOworCX0KKwlpZiAobmV4dF90aWNrKSB7CisJCW1vZF90aW1lcigmdHAtPnRpbWVyLCBSVU5fQVQobmV4dF90aWNrKSk7CisJfQorfQorCisKK3ZvaWQgY29tZXRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IG5leHRfdGljayA9IDYwKkhaOworCisJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDb21ldCBsaW5rIHN0YXR1cyAlNC40eCBwYXJ0bmVyIGNhcGFiaWxpdHkgIgorCQkJICAgIiU0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwKKwkJCSAgIHR1bGlwX21kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCAxKSwKKwkJCSAgIHR1bGlwX21kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCA1KSk7CisJLyogbW9kX3RpbWVyIHN5bmNocm9uaXplcyB1cyB3aXRoIHBvdGVudGlhbCBhZGRfdGltZXIgY2FsbHMKKwkgKiBmcm9tIGludGVycnVwdHMuCisJICovCisJaWYgKHR1bGlwX2NoZWNrX2R1cGxleChkZXYpIDwgMCkKKwkJeyBuZXRpZl9jYXJyaWVyX29mZihkZXYpOyB9CisJZWxzZQorCQl7IG5ldGlmX2NhcnJpZXJfb24oZGV2KTsgfQorCW1vZF90aW1lcigmdHAtPnRpbWVyLCBSVU5fQVQobmV4dF90aWNrKSk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwLmggYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzQ2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcC5oCkBAIC0wLDAgKzEsNDkzIEBACisvKgorCWRyaXZlcnMvbmV0L3R1bGlwL3R1bGlwLmgKKworCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQorCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlQbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3R1bGlwLXVzZXIue3BkZixwcyxodG1sfQorCWZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgZHJpdmVyLCBvciB2aXNpdCB0aGUgcHJvamVjdAorCVdlYiBwYWdlIGF0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdHVsaXAvCisKKyovCisKKyNpZm5kZWYgX19ORVRfVFVMSVBfSF9fCisjZGVmaW5lIF9fTkVUX1RVTElQX0hfXworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKworCisvKiB1bmRlZmluZSwgb3IgZGVmaW5lIHRvIHZhcmlvdXMgZGVidWdnaW5nIGxldmVscyAoPjQgPT0gb2JzY2VuZSBsZXZlbHMpICovCisjZGVmaW5lIFRVTElQX0RFQlVHIDEKKworLyogdW5kZWZpbmUgVVNFX0lPX09QUyBmb3IgTU1JTywgZGVmaW5lIGZvciBQSU8gKi8KKyNpZmRlZiBDT05GSUdfVFVMSVBfTU1JTworIyB1bmRlZiBVU0VfSU9fT1BTCisjZWxzZQorIyBkZWZpbmUgVVNFX0lPX09QUyAxCisjZW5kaWYKKworCisKK3N0cnVjdCB0dWxpcF9jaGlwX3RhYmxlIHsKKwljaGFyICpjaGlwX25hbWU7CisJaW50IGlvX3NpemU7CisJaW50IHZhbGlkX2ludHJzOwkvKiBDU1I3IGludGVycnVwdCBlbmFibGUgc2V0dGluZ3MgKi8KKwlpbnQgZmxhZ3M7CisJdm9pZCAoKm1lZGlhX3RpbWVyKSAodW5zaWduZWQgbG9uZyBkYXRhKTsKK307CisKKworZW51bSB0YmxfZmxhZyB7CisJSEFTX01JSQkJCT0gMHgwMDAxLAorCUhBU19NRURJQV9UQUJMRQkJPSAweDAwMDIsCisJQ1NSMTJfSU5fU1JPTQkJPSAweDAwMDQsCisJQUxXQVlTX0NIRUNLX01JSQk9IDB4MDAwOCwKKwlIQVNfQUNQSQkJPSAweDAwMTAsCisJTUNfSEFTSF9PTkxZCQk9IDB4MDAyMCwgLyogSGFzaC1vbmx5IG11bHRpY2FzdCBmaWx0ZXIuICovCisJSEFTX1BOSUNOV0FZCQk9IDB4MDA4MCwKKwlIQVNfTldBWQkJPSAweDAwNDAsIC8qIFVzZXMgaW50ZXJuYWwgTldheSB4Y3ZyLiAqLworCUhBU19JTlRSX01JVElHQVRJT04JPSAweDAxMDAsCisJSVNfQVNJWAkJCT0gMHgwMjAwLAorCUhBU184MDIzWAkJPSAweDA0MDAsCisJQ09NRVRfTUFDX0FERFIJCT0gMHgwODAwLAorCUhBU19QQ0lfTVdJCQk9IDB4MTAwMCwKKwlIQVNfUEhZX0lSUQkJPSAweDIwMDAsCisJSEFTX1NXQVBQRURfU0VFUFJPTQk9IDB4NDAwMCwKKwlORUVEU19GQUtFX01FRElBX1RBQkxFCT0gMHg4MDAwLAorfTsKKworCisvKiBjaGlwIHR5cGVzLiAgY2FyZWZ1bCEgIG9yZGVyIGlzIFZFUlkgSU1QT1JUQU5UIGhlcmUsIGFzIHRoZXNlCisgKiBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBkcml2ZXIgYXMgaW5kaWNlcyBpbnRvIGFycmF5cyAqLworLyogTm90ZSAyMTE0MiA9PSAyMTE0My4gKi8KK2VudW0gY2hpcHMgeworCURDMjEwNDAgPSAwLAorCURDMjEwNDEgPSAxLAorCURDMjExNDAgPSAyLAorCURDMjExNDIgPSAzLCBEQzIxMTQzID0gMywKKwlMQzgyQzE2OCwKKwlNWDk4NzEzLAorCU1YOTg3MTUsCisJTVg5ODcyNSwKKwlBWDg4MTQwLAorCVBOSUMyLAorCUNPTUVULAorCUNPTVBFWDk4ODEsCisJSTIxMTQ1LAorCURNOTEwWCwKKwlDT05FWEFOVCwKKwlVTEk1MjZYCit9OworCisKK2VudW0gTWVkaWFJcyB7CisJTWVkaWFJc0ZEID0gMSwKKwlNZWRpYUFsd2F5c0ZEID0gMiwKKwlNZWRpYUlzTUlJID0gNCwKKwlNZWRpYUlzRnggPSA4LAorCU1lZGlhSXMxMDAgPSAxNgorfTsKKworCisvKiBPZmZzZXRzIHRvIHRoZSBDb21tYW5kIGFuZCBTdGF0dXMgUmVnaXN0ZXJzLCAiQ1NScyIuICBBbGwgYWNjZXNzZXMKKyAgIG11c3QgYmUgbG9uZ3dvcmQgaW5zdHJ1Y3Rpb25zIGFuZCBxdWFkd29yZCBhbGlnbmVkLiAqLworZW51bSB0dWxpcF9vZmZzZXRzIHsKKwlDU1IwID0gMCwKKwlDU1IxID0gMHgwOCwKKwlDU1IyID0gMHgxMCwKKwlDU1IzID0gMHgxOCwKKwlDU1I0ID0gMHgyMCwKKwlDU1I1ID0gMHgyOCwKKwlDU1I2ID0gMHgzMCwKKwlDU1I3ID0gMHgzOCwKKwlDU1I4ID0gMHg0MCwKKwlDU1I5ID0gMHg0OCwKKwlDU1IxMCA9IDB4NTAsCisJQ1NSMTEgPSAweDU4LAorCUNTUjEyID0gMHg2MCwKKwlDU1IxMyA9IDB4NjgsCisJQ1NSMTQgPSAweDcwLAorCUNTUjE1ID0gMHg3OCwKK307CisKKy8qIHJlZ2lzdGVyIG9mZnNldCBhbmQgYml0cyBmb3IgQ0ZERCBQQ0kgY29uZmlnIHJlZyAqLworZW51bSBwY2lfY2ZnX2RyaXZlcl9yZWcgeworCUNGREQgPSAweDQwLAorCUNGRERfU2xlZXAgPSAoMSA8PCAzMSksCisJQ0ZERF9Tbm9vemUgPSAoMSA8PCAzMCksCit9OworCisjZGVmaW5lIFJ4UG9sbEludCAoUnhJbnRyfFJ4Tm9CdWZ8UnhEaWVkfFJ4SmFiYmVyKQorCisvKiBUaGUgYml0cyBpbiB0aGUgQ1NSNSBzdGF0dXMgcmVnaXN0ZXJzLCBtb3N0bHkgaW50ZXJydXB0IHNvdXJjZXMuICovCitlbnVtIHN0YXR1c19iaXRzIHsKKwlUaW1lckludCA9IDB4ODAwLAorCVN5dGVtRXJyb3IgPSAweDIwMDAsCisJVFBMbmtGYWlsID0gMHgxMDAwLAorCVRQTG5rUGFzcyA9IDB4MTAsCisJTm9ybWFsSW50ciA9IDB4MTAwMDAsCisJQWJub3JtYWxJbnRyID0gMHg4MDAwLAorCVJ4SmFiYmVyID0gMHgyMDAsCisJUnhEaWVkID0gMHgxMDAsCisJUnhOb0J1ZiA9IDB4ODAsCisJUnhJbnRyID0gMHg0MCwKKwlUeEZJRk9VbmRlcmZsb3cgPSAweDIwLAorCVR4SmFiYmVyID0gMHgwOCwKKwlUeE5vQnVmID0gMHgwNCwKKwlUeERpZWQgPSAweDAyLAorCVR4SW50ciA9IDB4MDEsCit9OworCisvKiBiaXQgbWFzayBmb3IgQ1NSNSBUWC9SWCBwcm9jZXNzIHN0YXRlICovCisjZGVmaW5lIENTUjVfVFMJMHgwMDcwMDAwMAorI2RlZmluZSBDU1I1X1JTCTB4MDAwZTAwMDAKKworZW51bSB0dWxpcF9tb2RlX2JpdHMgeworCVR4VGhyZXNob2xkCQk9ICgxIDw8IDIyKSwKKwlGdWxsRHVwbGV4CQk9ICgxIDw8IDkpLAorCVR4T24JCQk9IDB4MjAwMCwKKwlBY2NlcHRCcm9hZGNhc3QJCT0gMHgwMTAwLAorCUFjY2VwdEFsbE11bHRpY2FzdAk9IDB4MDA4MCwKKwlBY2NlcHRBbGxQaHlzCQk9IDB4MDA0MCwKKwlBY2NlcHRSdW50CQk9IDB4MDAwOCwKKwlSeE9uCQkJPSAweDAwMDIsCisJUnhUeAkJCT0gKFR4T24gfCBSeE9uKSwKK307CisKKworZW51bSB0dWxpcF9idXNjb25maWdfYml0cyB7CisJTVdJCQkJPSAoMSA8PCAyNCksCisJTVJMCQkJPSAoMSA8PCAyMyksCisJTVJNCQkJPSAoMSA8PCAyMSksCisJQ0FMU2hpZnQJCT0gMTQsCisJQnVyc3RMZW5TaGlmdAkJPSA4LAorfTsKKworCisvKiBUaGUgVHVsaXAgUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KK3N0cnVjdCB0dWxpcF9yeF9kZXNjIHsKKwlzMzIgc3RhdHVzOworCXMzMiBsZW5ndGg7CisJdTMyIGJ1ZmZlcjE7CisJdTMyIGJ1ZmZlcjI7Cit9OworCisKK3N0cnVjdCB0dWxpcF90eF9kZXNjIHsKKwlzMzIgc3RhdHVzOworCXMzMiBsZW5ndGg7CisJdTMyIGJ1ZmZlcjE7CisJdTMyIGJ1ZmZlcjI7CQkvKiBXZSB1c2Ugb25seSBidWZmZXIgMS4gICovCit9OworCisKK2VudW0gZGVzY19zdGF0dXNfYml0cyB7CisJRGVzY093bmVkID0gMHg4MDAwMDAwMCwKKwlSeERlc2NGYXRhbEVyciA9IDB4ODAwMCwKKwlSeFdob2xlUGt0ID0gMHgwMzAwLAorfTsKKworCitlbnVtIHQyMTE0M19jc3I2X2JpdHMgeworCWNzcjZfc2MgPSAoMTw8MzEpLAorCWNzcjZfcmEgPSAoMTw8MzApLAorCWNzcjZfaWduX2Rlc3RfbXNiID0gKDE8PDI2KSwKKwljc3I2X21ibyA9ICgxPDwyNSksCisJY3NyNl9zY3IgPSAoMTw8MjQpLCAgLyogc2NyYW1ibGUgbW9kZSBmbGFnOiBjYW4ndCBiZSBzZXQgKi8KKwljc3I2X3BjcyA9ICgxPDwyMyksICAvKiBFbmFibGVzIFBDUyBmdW5jdGlvbnMgKHN5bWJvbCBtb2RlIHJlcXVpcmVzIGNzcjZfcHMgYmUgc2V0KSBkZWZhdWx0IGlzIHNldCAqLworCWNzcjZfdHRtID0gKDE8PDIyKSwgIC8qIFRyYW5zbWl0IFRocmVzaG9sZCBNb2RlLCBzZXQgZm9yIDEwYmFzZVQsIDAgZm9yIDEwMEJhc2VUWCAqLworCWNzcjZfc2YgPSAoMTw8MjEpLCAgIC8qIFN0b3JlIGFuZCBmb3J3YXJkLiBJZiBzZXQgaWdub3JlcyBUUiBiaXRzICovCisJY3NyNl9oYmQgPSAoMTw8MTkpLCAgLyogSGVhcnQgYmVhdCBkaXNhYmxlLiBEaXNhYmxlcyBTUUUgZnVuY3Rpb24gaW4gMTBiYXNlVCAqLworCWNzcjZfcHMgPSAoMTw8MTgpLCAgIC8qIFBvcnQgU2VsZWN0LiAwIChkZWZ1YWx0KSA9IDEwYmFzZVQsIDEgPSAxMDBiYXNlVFg6IGNhbid0IGJlIHNldCAqLworCWNzcjZfY2EgPSAoMTw8MTcpLCAgIC8qIENvbGxpc2lvbiBPZmZzZXQgRW5hYmxlLiBJZiBzZXQgdXNlcyBzcGVjaWFsIGFsZ29yaXRobSBpbiBsb3cgY29sbGlzaW9uIHNpdHVhdGlvbnMgKi8KKwljc3I2X3RyaCA9ICgxPDwxNSksICAvKiBUcmFuc21pdCBUaHJlc2hvbGQgaGlnaCBiaXQgKi8KKwljc3I2X3RybCA9ICgxPDwxNCksICAvKiBUcmFuc21pdCBUaHJlc2hvbGQgbG93IGJpdCAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFRoaXMgdGFibGUgc2hvd3MgdHJhbnNtaXQgdGhyZXNob2xkIHZhbHVlcyBiYXNlZCBvbiBtZWRpYSAgICoKKwkgKiBhbmQgdGhlc2UgdHdvIHJlZ2lzdGVycyAoZnJvbSBQTklDMSAmIDIgZG9jcykgTm90ZTogdGhpcyBpcyAqCisJICogYWxsIG1lYW5pbmdsZXNzIGlmIHNmIGlzIHNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAodHJoLHRybCkgKiAxMDBCYXNlVFggKiAxMEJhc2VUICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAgICgwLDApICAgKiAgICAgMTI4ICAgKiAgICA3MiAgICoKKwkgKiAgICgwLDEpICAgKiAgICAgMjU2ICAgKiAgICA5NiAgICoKKwkgKiAgICgxLDApICAgKiAgICAgNTEyICAgKiAgIDEyOCAgICoKKwkgKiAgICgxLDEpICAgKiAgICAxMDI0ICAgKiAgIDE2MCAgICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwljc3I2X2ZjID0gKDE8PDEyKSwgICAvKiBGb3JjZXMgYSBjb2xsaXNpb24gaW4gbmV4dCB0cmFuc21pc3Npb24gKGZvciB0ZXN0aW5nIGluIGxvb3BiYWNrIG1vZGUpICovCisJY3NyNl9vbV9pbnRfbG9vcCA9ICgxPDwxMCksIC8qIGludGVybmFsIChGSUZPKSBsb29wYmFjayBmbGFnICovCisJY3NyNl9vbV9leHRfbG9vcCA9ICgxPDwxMSksIC8qIGV4dGVybmFsIChQTUQpIGxvb3BiYWNrIGZsYWcgKi8KKwkvKiBzZXQgYm90aCBhbmQgeW91IGdldCAoUEhZKSBsb29wYmFjayAqLworCWNzcjZfZmQgPSAoMTw8OSksICAgIC8qIEZ1bGwgZHVwbGV4IG1vZGUsIGRpc2FibGVzIGhlYXJiZWF0LCBubyBsb29wYmFjayAqLworCWNzcjZfcG0gPSAoMTw8NyksICAgIC8qIFBhc3MgQWxsIE11bHRpY2FzdCAqLworCWNzcjZfcHIgPSAoMTw8NiksICAgIC8qIFByb21pc2N1b3VzIG1vZGUgKi8KKwljc3I2X3NiID0gKDE8PDUpLCAgICAvKiBTdGFydCgxKS9TdG9wKDApIGJhY2tvZmYgY291bnRlciAqLworCWNzcjZfaWYgPSAoMTw8NCksICAgIC8qIEludmVyc2UgRmlsdGVyaW5nLCByZWplY3RzIG9ubHkgYWRkcmVzc2VzIGluIGFkZHJlc3MgdGFibGU6IGNhbid0IGJlIHNldCAqLworCWNzcjZfcGIgPSAoMTw8MyksICAgIC8qIFBhc3MgQmFkIEZyYW1lcywgKDEpIGNhdXNlcyBldmVuIGJhZCBmcmFtZXMgdG8gYmUgcGFzc2VkIG9uICovCisJY3NyNl9obyA9ICgxPDwyKSwgICAgLyogSGFzaC1vbmx5IGZpbHRlcmluZyBtb2RlOiBjYW4ndCBiZSBzZXQgKi8KKwljc3I2X2hwID0gKDE8PDApLCAgICAvKiBIYXNoL1BlcmZlY3QgUmVjZWl2ZSBGaWx0ZXJpbmcgTW9kZTogY2FuJ3QgYmUgc2V0ICovCisKKwljc3I2X21hc2tfY2FwdHVyZSA9IChjc3I2X3NjIHwgY3NyNl9jYSksCisJY3NyNl9tYXNrX2RlZnN0YXRlID0gKGNzcjZfbWFza19jYXB0dXJlIHwgY3NyNl9tYm8pLAorCWNzcjZfbWFza19oZGNhcCA9IChjc3I2X21hc2tfZGVmc3RhdGUgfCBjc3I2X2hiZCB8IGNzcjZfcHMpLAorCWNzcjZfbWFza19oZGNhcHR0ID0gKGNzcjZfbWFza19oZGNhcCAgfCBjc3I2X3RyaCB8IGNzcjZfdHJsKSwKKwljc3I2X21hc2tfZnVsbGNhcCA9IChjc3I2X21hc2tfaGRjYXB0dCB8IGNzcjZfZmQpLAorCWNzcjZfbWFza19mdWxscHJvbWlzYyA9IChjc3I2X3ByIHwgY3NyNl9wbSksCisJY3NyNl9tYXNrX2ZpbHRlcnMgPSAoY3NyNl9ocCB8IGNzcjZfaG8gfCBjc3I2X2lmKSwKKwljc3I2X21hc2tfMTAwYnQgPSAoY3NyNl9zY3IgfCBjc3I2X3BjcyB8IGNzcjZfaGJkKSwKK307CisKKworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgZWZmaWNpZW5jeS4KKyAgIE1ha2luZyB0aGUgVHggcmluZyB0b28gbGFyZ2UgZGVjcmVhc2VzIHRoZSBlZmZlY3RpdmVuZXNzIG9mIGNoYW5uZWwKKyAgIGJvbmRpbmcgYW5kIHBhY2tldCBwcmlvcml0eS4KKyAgIFRoZXJlIGFyZSBubyBpbGwgZWZmZWN0cyBmcm9tIHRvby1sYXJnZSByZWNlaXZlIHJpbmdzLiAqLworCisjZGVmaW5lIFRYX1JJTkdfU0laRQkzMgorI2RlZmluZSBSWF9SSU5HX1NJWkUJMTI4IAorI2RlZmluZSBNRURJQV9NQVNLICAgICAzMQorCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzYJLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIuICovCisKKyNkZWZpbmUgVFVMSVBfTUlOX0NBQ0hFX0xJTkUJOAkvKiBpbiB1bml0cyBvZiAzMi1iaXQgd29yZHMgKi8KKworI2lmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9faHBwYV9fKQorLyogVGhlIFVsdHJhU3BhcmMgUENJIGNvbnRyb2xsZXJzIHdpbGwgZGlzY29ubmVjdCBhdCBldmVyeSA2NC1ieXRlCisgKiBjcm9zc2luZyBhbnl3YXlzIHNvIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHRlbGwgVHVsaXAgdG8gYnVyc3QKKyAqIGFueSBtb3JlIHRoYW4gdGhhdC4KKyAqLworI2RlZmluZSBUVUxJUF9NQVhfQ0FDSEVfTElORQkxNgkvKiBpbiB1bml0cyBvZiAzMi1iaXQgd29yZHMgKi8KKyNlbHNlCisjZGVmaW5lIFRVTElQX01BWF9DQUNIRV9MSU5FCTMyCS8qIGluIHVuaXRzIG9mIDMyLWJpdCB3b3JkcyAqLworI2VuZGlmCisKKworLyogUmluZy13cmFwIGZsYWcgaW4gbGVuZ3RoIGZpZWxkLCB1c2UgZm9yIGxhc3QgcmluZyBlbnRyeS4KKwkweDAxMDAwMDAwIG1lYW5zIGNoYWluIG9uIGJ1ZmZlcjIgYWRkcmVzcywKKwkweDAyMDAwMDAwIG1lYW5zIHVzZSB0aGUgcmluZyBzdGFydCBhZGRyZXNzIGluIENTUjIvMy4KKyAgIE5vdGU6IFNvbWUgd29yay1hbGlrZSBjaGlwcyBkbyBub3QgZnVuY3Rpb24gY29ycmVjdGx5IGluIGNoYWluZWQgbW9kZS4KKyAgIFRoZSBBU0lYIGNoaXAgd29ya3Mgb25seSBpbiBjaGFpbmVkIG1vZGUuCisgICBUaHVzIHdlIGluZGljYXRlcyByaW5nIG1vZGUsIGJ1dCBhbHdheXMgd3JpdGUgdGhlICduZXh0JyBmaWVsZCBmb3IKKyAgIGNoYWluZWQgbW9kZSBhcyB3ZWxsLgorKi8KKyNkZWZpbmUgREVTQ19SSU5HX1dSQVAgMHgwMjAwMDAwMAorCisKKyNkZWZpbmUgRUVQUk9NX1NJWkUgNTEyIAkvKiAyIDw8IEVFUFJPTV9BRERSTEVOICovCisKKworI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMgKyAoeCkpCisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQkJCS8qIEFLQSBnZXRfdW5hbGlnbmVkKCkgKi8KKyNkZWZpbmUgZ2V0X3UxNihwdHIpICgqKHUxNiAqKShwdHIpKQorI2Vsc2UKKyNkZWZpbmUgZ2V0X3UxNihwdHIpICgoKHU4KikocHRyKSlbMF0gKyAoKCh1OCopKHB0cikpWzFdPDw4KSkKKyNlbmRpZgorCitzdHJ1Y3QgbWVkaWFsZWFmIHsKKwl1OCB0eXBlOworCXU4IG1lZGlhOworCXVuc2lnbmVkIGNoYXIgKmxlYWZkYXRhOworfTsKKworCitzdHJ1Y3QgbWVkaWF0YWJsZSB7CisJdTE2IGRlZmF1bHRtZWRpYTsKKwl1OCBsZWFmY291bnQ7CisJdTggY3NyMTJkaXI7CQkvKiBHZW5lcmFsIHB1cnBvc2UgcGluIGRpcmVjdGlvbnMuICovCisJdW5zaWduZWQgaGFzX21paToxOworCXVuc2lnbmVkIGhhc19ub25taWk6MTsKKwl1bnNpZ25lZCBoYXNfcmVzZXQ6NjsKKwl1MzIgY3NyMTVkaXI7CisJdTMyIGNzcjE1dmFsOwkJLyogMjExNDMgTldheSBzZXR0aW5nLiAqLworCXN0cnVjdCBtZWRpYWxlYWYgbWxlYWZbMF07Cit9OworCisKK3N0cnVjdCBtZWRpYWluZm8geworCXN0cnVjdCBtZWRpYWluZm8gKm5leHQ7CisJaW50IGluZm9fdHlwZTsKKwlpbnQgaW5kZXg7CisJdW5zaWduZWQgY2hhciAqaW5mbzsKK307CisKK3N0cnVjdCByaW5nX2luZm8geworCXN0cnVjdCBza19idWZmCSpza2I7CisJZG1hX2FkZHJfdAltYXBwaW5nOworfTsKKworCitzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSB7CisJY29uc3QgY2hhciAqcHJvZHVjdF9uYW1lOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X21vZHVsZTsKKwlzdHJ1Y3QgdHVsaXBfcnhfZGVzYyAqcnhfcmluZzsKKwlzdHJ1Y3QgdHVsaXBfdHhfZGVzYyAqdHhfcmluZzsKKwlkbWFfYWRkcl90IHJ4X3JpbmdfZG1hOworCWRtYV9hZGRyX3QgdHhfcmluZ19kbWE7CisJLyogVGhlIHNhdmVkIGFkZHJlc3Mgb2YgYSBzZW50LWluLXBsYWNlIHBhY2tldC9idWZmZXIsIGZvciBza2ZyZWUoKS4gKi8KKwlzdHJ1Y3QgcmluZ19pbmZvIHR4X2J1ZmZlcnNbVFhfUklOR19TSVpFXTsKKwkvKiBUaGUgYWRkcmVzc2VzIG9mIHJlY2VpdmUtaW4tcGxhY2Ugc2tidWZmcy4gKi8KKwlzdHJ1Y3QgcmluZ19pbmZvIHJ4X2J1ZmZlcnNbUlhfUklOR19TSVpFXTsKKwl1MTYgc2V0dXBfZnJhbWVbOTZdOwkvKiBQc2V1ZG8tVHggZnJhbWUgdG8gaW5pdCBhZGRyZXNzIHRhYmxlLiAqLworCWludCBjaGlwX2lkOworCWludCByZXZpc2lvbjsKKwlpbnQgZmxhZ3M7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qIE1lZGlhIHNlbGVjdGlvbiB0aW1lci4gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBvb21fdGltZXI7ICAgIC8qIE91dCBvZiBtZW1vcnkgdGltZXIuICovCisJdTMyIG1jX2ZpbHRlclsyXTsKKwlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCBtaWlfbG9jazsKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCBjdXJfdHg7CS8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSAqLworCXVuc2lnbmVkIGludCBkaXJ0eV9yeCwgZGlydHlfdHg7CS8qIFRoZSByaW5nIGVudHJpZXMgdG8gYmUgZnJlZSgpZWQuICovCisKKyNpZmRlZiAJQ09ORklHX1RVTElQX05BUElfSFdfTUlUSUdBVElPTgorICAgICAgICBpbnQgbWl0X29uOworI2VuZGlmCisJdW5zaWduZWQgaW50IGZ1bGxfZHVwbGV4OjE7CS8qIEZ1bGwtZHVwbGV4IG9wZXJhdGlvbiByZXF1ZXN0ZWQuICovCisJdW5zaWduZWQgaW50IGZ1bGxfZHVwbGV4X2xvY2s6MTsKKwl1bnNpZ25lZCBpbnQgZmFrZV9hZGRyOjE7CS8qIE11bHRpcG9ydCBib2FyZCBmYWtlZCBhZGRyZXNzLiAqLworCXVuc2lnbmVkIGludCBkZWZhdWx0X3BvcnQ6NDsJLyogTGFzdCBkZXYtPmlmX3BvcnQgdmFsdWUuICovCisJdW5zaWduZWQgaW50IG1lZGlhMjo0OwkvKiBTZWNvbmRhcnkgbW9uaXRvcmVkIG1lZGlhIHBvcnQuICovCisJdW5zaWduZWQgaW50IG1lZGlhbG9jazoxOwkvKiBEb24ndCBzZW5zZSBtZWRpYSB0eXBlLiAqLworCXVuc2lnbmVkIGludCBtZWRpYXNlbnNlOjE7CS8qIE1lZGlhIHNlbnNpbmcgaW4gcHJvZ3Jlc3MuICovCisJdW5zaWduZWQgaW50IG53YXk6MSwgbndheXNldDoxOwkJLyogMjExNDMgaW50ZXJuYWwgTldheS4gKi8KKwl1bnNpZ25lZCBpbnQgY3NyMDsJLyogQ1NSMCBzZXR0aW5nLiAqLworCXVuc2lnbmVkIGludCBjc3I2OwkvKiBDdXJyZW50IENTUjYgY29udHJvbCBzZXR0aW5ncy4gKi8KKwl1bnNpZ25lZCBjaGFyIGVlcHJvbVtFRVBST01fU0laRV07CS8qIFNlcmlhbCBFRVBST00gY29udGVudHMuICovCisJdm9pZCAoKmxpbmtfY2hhbmdlKSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBjc3I1KTsKKwl1MTYgc3ltX2FkdmVydGlzZSwgbWlpX2FkdmVydGlzZTsgLyogTldheSBjYXBhYmlsaXRpZXMgYWR2ZXJ0aXNlZC4gICovCisJdTE2IGxwYXI7CQkvKiAyMTE0MyBMaW5rIHBhcnRuZXIgYWJpbGl0eS4gKi8KKwl1MTYgYWR2ZXJ0aXNpbmdbNF07CisJc2lnbmVkIGNoYXIgcGh5c1s0XSwgbWlpX2NudDsJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisJc3RydWN0IG1lZGlhdGFibGUgKm10YWJsZTsKKwlpbnQgY3VyX2luZGV4OwkJLyogQ3VycmVudCBtZWRpYSBpbmRleC4gKi8KKwlpbnQgc2F2ZWRfaWZfcG9ydDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlpbnQgdHRpbWVyOworCWludCBzdXNwX3J4OworCXVuc2lnbmVkIGxvbmcgbmlyOworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworCWludCBjc3IxMl9zaGFkb3c7CisJaW50IHBhZDA7CQkvKiBVc2VkIGZvciA4LWJ5dGUgYWxpZ25tZW50ICovCit9OworCisKK3N0cnVjdCBlZXByb21fZml4dXAgeworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgY2hhciBhZGRyMDsKKwl1bnNpZ25lZCBjaGFyIGFkZHIxOworCXVuc2lnbmVkIGNoYXIgYWRkcjI7CisJdTE2IG5ld3RhYmxlWzMyXTsJLyogTWF4IGxlbmd0aCBiZWxvdy4gKi8KK307CisKKworLyogMjExNDIuYyAqLworZXh0ZXJuIHUxNiB0MjExNDJfY3NyMTRbXTsKK3ZvaWQgdDIxMTQyX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit2b2lkIHQyMTE0Ml9zdGFydF9ud2F5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCB0MjExNDJfbG5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY3NyNSk7CisKKworLyogUE5JQzIuYyAqLwordm9pZCBwbmljMl9sbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjc3I1KTsKK3ZvaWQgcG5pYzJfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgcG5pYzJfc3RhcnRfbndheShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcG5pYzJfbG5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY3NyNSk7CisKKy8qIGVlcHJvbS5jICovCit2b2lkIHR1bGlwX3BhcnNlX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCB0dWxpcF9yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbG9jYXRpb24sIGludCBhZGRyX2xlbik7CisKKy8qIGludGVycnVwdC5jICovCitleHRlcm4gdW5zaWduZWQgaW50IHR1bGlwX21heF9pbnRlcnJ1cHRfd29yazsKK2V4dGVybiBpbnQgdHVsaXBfcnhfY29weWJyZWFrOworaXJxcmV0dXJuX3QgdHVsaXBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworaW50IHR1bGlwX3JlZmlsbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZmRlZiBDT05GSUdfVFVMSVBfTkFQSQoraW50IHR1bGlwX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpOworI2VuZGlmCisKKworLyogbWVkaWEuYyAqLworaW50IHR1bGlwX21kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOwordm9pZCB0dWxpcF9tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKTsKK3ZvaWQgdHVsaXBfc2VsZWN0X21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGFydHVwKTsKK2ludCB0dWxpcF9jaGVja19kdXBsZXgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHR1bGlwX2ZpbmRfbWlpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYm9hcmRfaWR4KTsKKworLyogcG5pYy5jICovCit2b2lkIHBuaWNfZG9fbndheShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcG5pY19sbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjc3I1KTsKK3ZvaWQgcG5pY190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworCisvKiB0aW1lci5jICovCit2b2lkIHR1bGlwX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit2b2lkIG14aWNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgY29tZXRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKKworLyogdHVsaXBfY29yZS5jICovCitleHRlcm4gaW50IHR1bGlwX2RlYnVnOworZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBtZWRpYW5hbWVbXTsKK2V4dGVybiBjb25zdCBjaGFyIHR1bGlwX21lZGlhX2NhcFtdOworZXh0ZXJuIHN0cnVjdCB0dWxpcF9jaGlwX3RhYmxlIHR1bGlwX3RibFtdOwordm9pZCBvb21fdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybiB1OCB0MjEwNDBfY3NyMTNbXTsKKworc3RhdGljIGlubGluZSB2b2lkIHR1bGlwX3N0YXJ0X3J4dHgoc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwKQoreworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlpb3dyaXRlMzIodHAtPmNzcjYgfCBSeFR4LCBpb2FkZHIgKyBDU1I2KTsKKwliYXJyaWVyKCk7CisJKHZvaWQpIGlvcmVhZDMyKGlvYWRkciArIENTUjYpOyAvKiBtbWlvIHN5bmMgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHR1bGlwX3N0b3Bfcnh0eChzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHApCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCXUzMiBjc3I2ID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSNik7CisKKwlpZiAoY3NyNiAmIFJ4VHgpIHsKKwkJdW5zaWduZWQgaT0xMzAwLzEwOworCQlpb3dyaXRlMzIoY3NyNiAmIH5SeFR4LCBpb2FkZHIgKyBDU1I2KTsKKwkJYmFycmllcigpOworCQkvKiB3YWl0IHVudGlsIGluLWZsaWdodCBmcmFtZSBjb21wbGV0ZXMuCisJCSAqIE1heCB0aW1lIEAgMTBCVDogMTUwMCo4Yi8xME1icHMgPT0gMTIwMHVzICgrIDEwMHVzIG1hcmdpbikKKwkJICogVHlwaWNhbGx5IGV4cGVjdCB0aGlzIGxvb3AgdG8gZW5kIGluIDwgNTAgdXMgb24gMTAwQlQuCisJCSAqLworCQl3aGlsZSAoLS1pICYmIChpb3JlYWQzMihpb2FkZHIgKyBDU1I1KSAmIChDU1I1X1RTfENTUjVfUlMpKSkKKwkJCXVkZWxheSgxMCk7CisKKwkJaWYgKCFpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0dWxpcF9zdG9wX3J4dHgoKSBmYWlsZWRcbiIsCisJCQkJCXBjaV9uYW1lKHRwLT5wZGV2KSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHVsaXBfcmVzdGFydF9yeHR4KHN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCkKK3sKKwlpZighKHRwLT5jaGlwX2lkID09IFVMSTUyNlggJiYgCisJCSh0cC0+cmV2aXNpb24gPT0gMHg0MCB8fCB0cC0+cmV2aXNpb24gPT0gMHg1MCkpKSB7CisJCXR1bGlwX3N0b3Bfcnh0eCh0cCk7CisJCXVkZWxheSg1KTsKKwl9CisJdHVsaXBfc3RhcnRfcnh0eCh0cCk7Cit9CisKKyNlbmRpZiAvKiBfX05FVF9UVUxJUF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDk4YjNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCkBAIC0wLDAgKzEsMTg2MSBAQAorLyogdHVsaXBfY29yZS5jOiBBIERFQyAyMXg0eC1mYW1pbHkgZXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4gKi8KKworLyoKKwlNYWludGFpbmVkIGJ5IEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKwlDb3B5cmlnaHQgMjAwMCwyMDAxICBUaGUgTGludXggS2VybmVsIFRlYW0KKwlXcml0dGVuL2NvcHlyaWdodCAxOTk0LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJUGxlYXNlIHJlZmVyIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay90dWxpcC11c2VyLntwZGYscHMsaHRtbH0KKwlmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGRyaXZlciwgb3IgdmlzaXQgdGhlIHByb2plY3QKKwlXZWIgcGFnZSBhdCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3R1bGlwLworCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNkZWZpbmUgRFJWX05BTUUJInR1bGlwIgorI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJCisjZGVmaW5lIERSVl9WRVJTSU9OICAgICIxLjEuMTMtTkFQSSIgLyogS2VlcCBhdCBsZWFzdCBmb3IgdGVzdCAqLworI2Vsc2UKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMS4xMyIKKyNlbmRpZgorI2RlZmluZSBEUlZfUkVMREFURQkiTWF5IDExLCAyMDAyIgorCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJ0dWxpcC5oIgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBfX3NwYXJjX18KKyNpbmNsdWRlIDxhc20vcGJtLmg+CisjZW5kaWYKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCSJMaW51eCBUdWxpcCBkcml2ZXIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICIgKCIgRFJWX1JFTERBVEUgIilcbiI7CisKKworLyogQSBmZXcgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLiAqLworCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0LiAqLworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyNTsKKworI2RlZmluZSBNQVhfVU5JVFMgOAorLyogVXNlZCB0byBwYXNzIHRoZSBmdWxsLWR1cGxleCBmbGFnLCBldGMuICovCitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4W01BWF9VTklUU107CitzdGF0aWMgaW50IG9wdGlvbnNbTUFYX1VOSVRTXTsKK3N0YXRpYyBpbnQgbXR1W01BWF9VTklUU107CQkJLyogSnVtYm8gTVRVIGZvciBpbnRlcmZhY2VzLiAqLworCisvKiAgVGhlIHBvc3NpYmxlIG1lZGlhIHR5cGVzIHRoYXQgY2FuIGJlIHNldCBpbiBvcHRpb25zW10gYXJlOiAqLworY29uc3QgY2hhciAqIGNvbnN0IG1lZGlhbmFtZVszMl0gPSB7CisJIjEwYmFzZVQiLCAiMTBiYXNlMiIsICJBVUkiLCAiMTAwYmFzZVR4IiwKKwkiMTBiYXNlVC1GRFgiLCAiMTAwYmFzZVR4LUZEWCIsICIxMDBiYXNlVDQiLCAiMTAwYmFzZUZ4IiwKKwkiMTAwYmFzZUZ4LUZEWCIsICJNSUkgMTBiYXNlVCIsICJNSUkgMTBiYXNlVC1GRFgiLCAiTUlJIiwKKwkiMTBiYXNlVChmb3JjZWQpIiwgIk1JSSAxMDBiYXNlVHgiLCAiTUlJIDEwMGJhc2VUeC1GRFgiLCAiTUlJIDEwMGJhc2VUNCIsCisJIk1JSSAxMDBiYXNlRngtSERYIiwgIk1JSSAxMDBiYXNlRngtRkRYIiwgIkhvbWUtUE5BIDFNYnBzIiwgIkludmFsaWQtMTkiLAorCSIiLCIiLCIiLCIiLCAiIiwiIiwiIiwiIiwgICIiLCIiLCIiLCJUcmFuc2NlaXZlciByZXNldCIsCit9OworCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWJ1ZmZlciBSeCBzdHJ1Y3R1cmUuICovCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2hwcGFfXykgXAorCXx8IGRlZmluZWQoX19zcGFyY18pIHx8IGRlZmluZWQoX19pYTY0X18pIFwKKwl8fCBkZWZpbmVkKF9fc2hfXykgfHwgZGVmaW5lZChfX21pcHNfXykKK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMTUxODsKKyNlbHNlCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IDEwMDsKKyNlbmRpZgorCisvKgorICBTZXQgdGhlIGJ1cyBwZXJmb3JtYW5jZSByZWdpc3Rlci4KKwlUeXBpY2FsOiBTZXQgMTYgbG9uZ3dvcmQgY2FjaGUgYWxpZ25tZW50LCBubyBidXJzdCBsaW1pdC4KKwlDYWNoZSBhbGlnbm1lbnQgYml0cyAxNToxNAkgICAgIEJ1cnN0IGxlbmd0aCAxMzo4CisJCTAwMDAJTm8gYWxpZ25tZW50ICAweDAwMDAwMDAwIHVubGltaXRlZAkJMDgwMCA4IGxvbmd3b3JkcworCQk0MDAwCTggIGxvbmd3b3JkcwkJMDEwMCAxIGxvbmd3b3JkCQkxMDAwIDE2IGxvbmd3b3JkcworCQk4MDAwCTE2IGxvbmd3b3JkcwkJMDIwMCAyIGxvbmd3b3JkcwkyMDAwIDMyIGxvbmd3b3JkcworCQlDMDAwCTMyICBsb25nd29yZHMJCTA0MDAgNCBsb25nd29yZHMKKwlXYXJuaW5nOiBtYW55IG9sZGVyIDQ4NiBzeXN0ZW1zIGFyZSBicm9rZW4gYW5kIHJlcXVpcmUgc2V0dGluZyAweDAwQTA0ODAwCisJICAgOCBsb25nd29yZCBjYWNoZSBhbGlnbm1lbnQsIDggbG9uZ3dvcmQgYnVyc3QuCisJVG9EbzogTm9uLUludGVsIHNldHRpbmcgY291bGQgYmUgYmV0dGVyLgorKi8KKworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9faWE2NF9fKQorc3RhdGljIGludCBjc3IwID0gMHgwMUEwMDAwMCB8IDB4RTAwMDsKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKK3N0YXRpYyBpbnQgY3NyMCA9IDB4MDFBMDAwMDAgfCAweDgwMDA7CisjZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfX2hwcGFfXykKKy8qIFRoZSBVbHRyYVNwYXJjIFBDSSBjb250cm9sbGVycyB3aWxsIGRpc2Nvbm5lY3QgYXQgZXZlcnkgNjQtYnl0ZQorICogY3Jvc3NpbmcgYW55d2F5cyBzbyBpdCBtYWtlcyBubyBzZW5zZSB0byB0ZWxsIFR1bGlwIHRvIGJ1cnN0CisgKiBhbnkgbW9yZSB0aGFuIHRoYXQuCisgKi8KK3N0YXRpYyBpbnQgY3NyMCA9IDB4MDFBMDAwMDAgfCAweDkwMDA7CisjZWxpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19zaF9fKQorc3RhdGljIGludCBjc3IwID0gMHgwMUEwMDAwMCB8IDB4NDgwMDsKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCitzdGF0aWMgaW50IGNzcjAgPSAweDAwMjAwMDAwIHwgMHg0MDAwOworI2Vsc2UKKyN3YXJuaW5nIFByb2Nlc3NvciBhcmNoaXRlY3R1cmUgdW5kZWZpbmVkIQorc3RhdGljIGludCBjc3IwID0gMHgwMEEwMDAwMCB8IDB4NDgwMDsKKyNlbmRpZgorCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICg0KkhaKQorCisKK01PRFVMRV9BVVRIT1IoIlRoZSBMaW51eCBLZXJuZWwgVGVhbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEaWdpdGFsIDIxKjQqIFR1bGlwIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworbW9kdWxlX3BhcmFtKHR1bGlwX2RlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY3NyMCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworCisjZGVmaW5lIFBGWCBEUlZfTkFNRSAiOiAiCisKKyNpZmRlZiBUVUxJUF9ERUJVRworaW50IHR1bGlwX2RlYnVnID0gVFVMSVBfREVCVUc7CisjZWxzZQoraW50IHR1bGlwX2RlYnVnID0gMTsKKyNlbmRpZgorCisKKworLyoKKyAqIFRoaXMgdGFibGUgdXNlIGR1cmluZyBvcGVyYXRpb24gZm9yIGNhcGFiaWxpdGllcyBhbmQgbWVkaWEgdGltZXIuCisgKgorICogSXQgaXMgaW5kZXhlZCB2aWEgdGhlIHZhbHVlcyBpbiAnZW51bSBjaGlwcycKKyAqLworCitzdHJ1Y3QgdHVsaXBfY2hpcF90YWJsZSB0dWxpcF90YmxbXSA9IHsKKyAgeyB9LCAvKiBwbGFjZWhvbGRlciBmb3IgYXJyYXksIHNsb3QgdW51c2VkIGN1cnJlbnRseSAqLworICB7IH0sIC8qIHBsYWNlaG9sZGVyIGZvciBhcnJheSwgc2xvdCB1bnVzZWQgY3VycmVudGx5ICovCisKKyAgLyogREMyMTE0MCAqLworICB7ICJEaWdpdGFsIERTMjExNDAgVHVsaXAiLCAxMjgsIDB4MDAwMWViZWYsCisJSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00gfCBIQVNfUENJX01XSSwgdHVsaXBfdGltZXIgfSwKKworICAvKiBEQzIxMTQyLCBEQzIxMTQzICovCisgIHsgIkRpZ2l0YWwgRFMyMTE0MyBUdWxpcCIsIDEyOCwgMHgwODAxZmJmZiwKKwlIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQUxXQVlTX0NIRUNLX01JSSB8IEhBU19BQ1BJIHwgSEFTX05XQVkKKwl8IEhBU19JTlRSX01JVElHQVRJT04gfCBIQVNfUENJX01XSSwgdDIxMTQyX3RpbWVyIH0sCisKKyAgLyogTEM4MkMxNjggKi8KKyAgeyAiTGl0ZS1PbiA4MmMxNjggUE5JQyIsIDI1NiwgMHgwMDAxZmJlZiwKKwlIQVNfTUlJIHwgSEFTX1BOSUNOV0FZLCBwbmljX3RpbWVyIH0sCisKKyAgLyogTVg5ODcxMyAqLworICB7ICJNYWNyb25peCA5ODcxMyBQTUFDIiwgMTI4LCAweDAwMDFlYmVmLAorCUhBU19NSUkgfCBIQVNfTUVESUFfVEFCTEUgfCBDU1IxMl9JTl9TUk9NLCBteGljX3RpbWVyIH0sCisKKyAgLyogTVg5ODcxNSAqLworICB7ICJNYWNyb25peCA5ODcxNSBQTUFDIiwgMjU2LCAweDAwMDFlYmVmLAorCUhBU19NRURJQV9UQUJMRSwgbXhpY190aW1lciB9LAorCisgIC8qIE1YOTg3MjUgKi8KKyAgeyAiTWFjcm9uaXggOTg3MjUgUE1BQyIsIDI1NiwgMHgwMDAxZWJlZiwKKwlIQVNfTUVESUFfVEFCTEUsIG14aWNfdGltZXIgfSwKKworICAvKiBBWDg4MTQwICovCisgIHsgIkFTSVggQVg4ODE0MCIsIDEyOCwgMHgwMDAxZmJmZiwKKwlIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQ1NSMTJfSU5fU1JPTSB8IE1DX0hBU0hfT05MWQorCXwgSVNfQVNJWCwgdHVsaXBfdGltZXIgfSwKKworICAvKiBQTklDMiAqLworICB7ICJMaXRlLU9uIFBOSUMtSUkiLCAyNTYsIDB4MDgwMWZiZmYsCisJSEFTX01JSSB8IEhBU19OV0FZIHwgSEFTXzgwMjNYIHwgSEFTX1BDSV9NV0ksIHBuaWMyX3RpbWVyIH0sCisKKyAgLyogQ09NRVQgKi8KKyAgeyAiQURNdGVrIENvbWV0IiwgMjU2LCAweDAwMDFhYmVmLAorCUhBU19NSUkgfCBNQ19IQVNIX09OTFkgfCBDT01FVF9NQUNfQUREUiwgY29tZXRfdGltZXIgfSwKKworICAvKiBDT01QRVg5ODgxICovCisgIHsgIkNvbXBleCA5ODgxIFBNQUMiLCAxMjgsIDB4MDAwMWViZWYsCisJSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00sIG14aWNfdGltZXIgfSwKKworICAvKiBJMjExNDUgKi8KKyAgeyAiSW50ZWwgRFMyMTE0NSBUdWxpcCIsIDEyOCwgMHgwODAxZmJmZiwKKwlIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQUxXQVlTX0NIRUNLX01JSSB8IEhBU19BQ1BJCisJfCBIQVNfTldBWSB8IEhBU19QQ0lfTVdJLCB0MjExNDJfdGltZXIgfSwKKworICAvKiBETTkxMFggKi8KKyAgeyAiRGF2aWNvbSBETTkxMDIvRE05MTAyQSIsIDEyOCwgMHgwMDAxZWJlZiwKKwlIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQ1NSMTJfSU5fU1JPTSB8IEhBU19BQ1BJLAorCXR1bGlwX3RpbWVyIH0sCisKKyAgLyogUlM3MTEyICovCisgIHsgIkNvbmV4YW50IExBTmZpbml0eSIsIDI1NiwgMHgwMDAxZWJlZiwKKwlIQVNfTUlJIHwgSEFTX0FDUEksIHR1bGlwX3RpbWVyIH0sCisKKyAgIC8qIFVMaTUyNlggKi8KKyAgIHsgIlVMaSBNNTI2MS9NNTI2MyIsIDEyOCwgMHgwMDAxZWJlZiwKKyAgICAgICAgSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00gfCBIQVNfQUNQSSwgdHVsaXBfdGltZXIgfSwKK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHR1bGlwX3BjaV90YmxbXSA9IHsKKwl7IDB4MTAxMSwgMHgwMDA5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBEQzIxMTQwIH0sCisJeyAweDEwMTEsIDB4MDAxOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgREMyMTE0MyB9LAorCXsgMHgxMUFELCAweDAwMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIExDODJDMTY4IH0sCisJeyAweDEwZDksIDB4MDUxMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVg5ODcxMyB9LAorCXsgMHgxMGQ5LCAweDA1MzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YOTg3MTUgfSwKKy8qCXsgMHgxMGQ5LCAweDA1MzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YOTg3MjUgfSwqLworCXsgMHgxMjVCLCAweDE0MDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFYODgxNDAgfSwKKwl7IDB4MTFBRCwgMHhjMTE1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBQTklDMiB9LAorCXsgMHgxMzE3LCAweDA5ODEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDEzMTcsIDB4MDk4NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTMxNywgMHgxOTg1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxMzE3LCAweDk1MTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDEzRDEsIDB4QUIwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTNEMSwgMHhBQjAzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxM0QxLCAweEFCMDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDEwNEEsIDB4MDk4MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTA0QSwgMHgyNzc0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxMjU5LCAweGExMjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDExRjYsIDB4OTg4MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NUEVYOTg4MSB9LAorCXsgMHg4MDg2LCAweDAwMzksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEkyMTE0NSB9LAorCXsgMHgxMjgyLCAweDkxMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERNOTEwWCB9LAorCXsgMHgxMjgyLCAweDkxMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERNOTEwWCB9LAorCXsgMHgxMTEzLCAweDEyMTYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDExMTMsIDB4MTIxNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVg5ODcxNSB9LAorCXsgMHgxMTEzLCAweDk1MTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDExODYsIDB4MTU0MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTE4NiwgMHgxNTYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxMTg2LCAweDE1OTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDE0ZjEsIDB4MTgwMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09ORVhBTlQgfSwKKwl7IDB4MTYyNiwgMHg4NDEwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxNzM3LCAweEFCMDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDE3MzcsIDB4QUIwOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTdCMywgMHhBQjA4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorIAl7IDB4MTBiOSwgMHg1MjYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBVTEk1MjZYIH0sCS8qIEFMaSAxNTYzIGludGVncmF0ZWQgZXRoZXJuZXQgKi8KKyAJeyAweDEwYjksIDB4NTI2MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVUxJNTI2WCB9LAkvKiBBTGkgMTU2MyBpbnRlZ3JhdGVkIGV0aGVybmV0ICovCisJeyAweDEwYjcsIDB4OTMwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwgLyogM0NvbSAzQ1NPSE8xMDBCLVRYICovCisJeyB9IC8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHR1bGlwX3BjaV90YmwpOworCisKKy8qIEEgZnVsbC1kdXBsZXggbWFwIGZvciBtZWRpYSB0eXBlcy4gKi8KK2NvbnN0IGNoYXIgdHVsaXBfbWVkaWFfY2FwWzMyXSA9Cit7MCwwLDAsMTYsICAzLDE5LDE2LDI0LCAgMjcsNCw3LDUsIDAsMjAsMjMsMjAsICAyOCwzMSwwLDAsIH07CisKK3N0YXRpYyB2b2lkIHR1bGlwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB0dWxpcF9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHR1bGlwX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHR1bGlwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHR1bGlwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdHVsaXBfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB0dWxpcF9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp0dWxpcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHByaXZhdGVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgcG9sbF90dWxpcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0dWxpcF9zZXRfcG93ZXJfc3RhdGUgKHN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCwKKwkJCQkgICBpbnQgc2xlZXAsIGludCBzbm9vemUpCit7CisJaWYgKHRwLT5mbGFncyAmIEhBU19BQ1BJKSB7CisJCXUzMiB0bXAsIG5ld3RtcDsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkICh0cC0+cGRldiwgQ0ZERCwgJnRtcCk7CisJCW5ld3RtcCA9IHRtcCAmIH4oQ0ZERF9TbGVlcCB8IENGRERfU25vb3plKTsKKwkJaWYgKHNsZWVwKQorCQkJbmV3dG1wIHw9IENGRERfU2xlZXA7CisJCWVsc2UgaWYgKHNub296ZSkKKwkJCW5ld3RtcCB8PSBDRkREX1Nub296ZTsKKwkJaWYgKHRtcCAhPSBuZXd0bXApCisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkICh0cC0+cGRldiwgQ0ZERCwgbmV3dG1wKTsKKwl9CisKK30KKworCitzdGF0aWMgdm9pZCB0dWxpcF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCWludCBuZXh0X3RpY2sgPSAzKkhaOworCWludCBpOworCisJLyogV2FrZSB0aGUgY2hpcCBmcm9tIHNsZWVwL3Nub296ZSBtb2RlLiAqLworCXR1bGlwX3NldF9wb3dlcl9zdGF0ZSAodHAsIDAsIDApOworCisJLyogT24gc29tZSBjaGlwIHJldnMgd2UgbXVzdCBzZXQgdGhlIE1JSS9TWU0gcG9ydCBiZWZvcmUgdGhlIHJlc2V0IT8gKi8KKwlpZiAodHAtPm1paV9jbnQgIHx8ICAodHAtPm10YWJsZSAgJiYgIHRwLT5tdGFibGUtPmhhc19taWkpKQorCQlpb3dyaXRlMzIoMHgwMDA0MDAwMCwgaW9hZGRyICsgQ1NSNik7CisKKwkvKiBSZXNldCB0aGUgY2hpcCwgaG9sZGluZyBiaXQgMCBzZXQgYXQgbGVhc3QgNTAgUENJIGN5Y2xlcy4gKi8KKwlpb3dyaXRlMzIoMHgwMDAwMDAwMSwgaW9hZGRyICsgQ1NSMCk7CisJdWRlbGF5KDEwMCk7CisKKwkvKiBEZWFzc2VydCByZXNldC4KKwkgICBXYWl0IHRoZSBzcGVjaWZpZWQgNTAgUENJIGN5Y2xlcyBhZnRlciBhIHJlc2V0IGJ5IGluaXRpYWxpemluZworCSAgIFR4IGFuZCBSeCBxdWV1ZXMgYW5kIHRoZSBhZGRyZXNzIGZpbHRlciBsaXN0LiAqLworCWlvd3JpdGUzMih0cC0+Y3NyMCwgaW9hZGRyICsgQ1NSMCk7CisJdWRlbGF5KDEwMCk7CisKKwlpZiAodHVsaXBfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR1bGlwX3VwKCksIGlycT09JWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKworCWlvd3JpdGUzMih0cC0+cnhfcmluZ19kbWEsIGlvYWRkciArIENTUjMpOworCWlvd3JpdGUzMih0cC0+dHhfcmluZ19kbWEsIGlvYWRkciArIENTUjQpOworCXRwLT5jdXJfcnggPSB0cC0+Y3VyX3R4ID0gMDsKKwl0cC0+ZGlydHlfcnggPSB0cC0+ZGlydHlfdHggPSAwOworCisJaWYgKHRwLT5mbGFncyAmIE1DX0hBU0hfT05MWSkgeworCQl1MzIgYWRkcl9sb3cgPSBsZTMyX3RvX2NwdShnZXRfdW5hbGlnbmVkKCh1MzIgKilkZXYtPmRldl9hZGRyKSk7CisJCXUzMiBhZGRyX2hpZ2ggPSBsZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKCh1MTYgKikoZGV2LT5kZXZfYWRkcis0KSkpOworCQlpZiAodHAtPmNoaXBfaWQgPT0gQVg4ODE0MCkgeworCQkJaW93cml0ZTMyKDAsIGlvYWRkciArIENTUjEzKTsKKwkJCWlvd3JpdGUzMihhZGRyX2xvdywgIGlvYWRkciArIENTUjE0KTsKKwkJCWlvd3JpdGUzMigxLCBpb2FkZHIgKyBDU1IxMyk7CisJCQlpb3dyaXRlMzIoYWRkcl9oaWdoLCBpb2FkZHIgKyBDU1IxNCk7CisJCX0gZWxzZSBpZiAodHAtPmZsYWdzICYgQ09NRVRfTUFDX0FERFIpIHsKKwkJCWlvd3JpdGUzMihhZGRyX2xvdywgIGlvYWRkciArIDB4QTQpOworCQkJaW93cml0ZTMyKGFkZHJfaGlnaCwgaW9hZGRyICsgMHhBOCk7CisJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgMHhBQyk7CisJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgMHhCMCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGlzIGlzIHNldF9yeF9tb2RlKCksIGJ1dCB3aXRob3V0IHN0YXJ0aW5nIHRoZSB0cmFuc21pdHRlci4gKi8KKwkJdTE2ICplYWRkcnMgPSAodTE2ICopZGV2LT5kZXZfYWRkcjsKKwkJdTE2ICpzZXR1cF9mcm0gPSAmdHAtPnNldHVwX2ZyYW1lWzE1KjZdOworCQlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwkJLyogMjExNDAgYnVnOiB5b3UgbXVzdCBhZGQgdGhlIGJyb2FkY2FzdCBhZGRyZXNzLiAqLworCQltZW1zZXQodHAtPnNldHVwX2ZyYW1lLCAweGZmLCBzaXplb2YodHAtPnNldHVwX2ZyYW1lKSk7CisJCS8qIEZpbGwgdGhlIGZpbmFsIGVudHJ5IG9mIHRoZSB0YWJsZSB3aXRoIG91ciBwaHlzaWNhbCBhZGRyZXNzLiAqLworCQkqc2V0dXBfZnJtKysgPSBlYWRkcnNbMF07ICpzZXR1cF9mcm0rKyA9IGVhZGRyc1swXTsKKwkJKnNldHVwX2ZybSsrID0gZWFkZHJzWzFdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMV07CisJCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1syXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzJdOworCisJCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgdHAtPnNldHVwX2ZyYW1lLAorCQkJCQkgc2l6ZW9mKHRwLT5zZXR1cF9mcmFtZSksCisJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJdHAtPnR4X2J1ZmZlcnNbdHAtPmN1cl90eF0uc2tiID0gTlVMTDsKKwkJdHAtPnR4X2J1ZmZlcnNbdHAtPmN1cl90eF0ubWFwcGluZyA9IG1hcHBpbmc7CisKKwkJLyogUHV0IHRoZSBzZXR1cCBmcmFtZSBvbiB0aGUgVHggbGlzdC4gKi8KKwkJdHAtPnR4X3JpbmdbdHAtPmN1cl90eF0ubGVuZ3RoID0gY3B1X3RvX2xlMzIoMHgwODAwMDAwMCB8IDE5Mik7CisJCXRwLT50eF9yaW5nW3RwLT5jdXJfdHhdLmJ1ZmZlcjEgPSBjcHVfdG9fbGUzMihtYXBwaW5nKTsKKwkJdHAtPnR4X3JpbmdbdHAtPmN1cl90eF0uc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bmVkKTsKKworCQl0cC0+Y3VyX3R4Kys7CisJfQorCisJdHAtPnNhdmVkX2lmX3BvcnQgPSBkZXYtPmlmX3BvcnQ7CisJaWYgKGRldi0+aWZfcG9ydCA9PSAwKQorCQlkZXYtPmlmX3BvcnQgPSB0cC0+ZGVmYXVsdF9wb3J0OworCisJLyogQWxsb3cgc2VsZWN0aW5nIGEgZGVmYXVsdCBtZWRpYS4gKi8KKwlpID0gMDsKKwlpZiAodHAtPm10YWJsZSA9PSBOVUxMKQorCQlnb3RvIG1lZGlhX3BpY2tlZDsKKwlpZiAoZGV2LT5pZl9wb3J0KSB7CisJCWludCBsb29raW5nX2ZvciA9IHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc01JSSA/IDExIDoKKwkJCShkZXYtPmlmX3BvcnQgPT0gMTIgPyAwIDogZGV2LT5pZl9wb3J0KTsKKwkJZm9yIChpID0gMDsgaSA8IHRwLT5tdGFibGUtPmxlYWZjb3VudDsgaSsrKQorCQkJaWYgKHRwLT5tdGFibGUtPm1sZWFmW2ldLm1lZGlhID09IGxvb2tpbmdfZm9yKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVzaW5nIHVzZXItc3BlY2lmaWVkIG1lZGlhICVzLlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSk7CisJCQkJZ290byBtZWRpYV9waWNrZWQ7CisJCQl9CisJfQorCWlmICgodHAtPm10YWJsZS0+ZGVmYXVsdG1lZGlhICYgMHgwODAwKSA9PSAwKSB7CisJCWludCBsb29raW5nX2ZvciA9IHRwLT5tdGFibGUtPmRlZmF1bHRtZWRpYSAmIE1FRElBX01BU0s7CisJCWZvciAoaSA9IDA7IGkgPCB0cC0+bXRhYmxlLT5sZWFmY291bnQ7IGkrKykKKwkJCWlmICh0cC0+bXRhYmxlLT5tbGVhZltpXS5tZWRpYSA9PSBsb29raW5nX2ZvcikgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVc2luZyBFRVBST00tc2V0IG1lZGlhICVzLlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbbG9va2luZ19mb3JdKTsKKwkJCQlnb3RvIG1lZGlhX3BpY2tlZDsKKwkJCX0KKwl9CisJLyogU3RhcnQgc2Vuc2luZyBmaXJzdCBub24tZnVsbC1kdXBsZXggbWVkaWEuICovCisJZm9yIChpID0gdHAtPm10YWJsZS0+bGVhZmNvdW50IC0gMTsKKwkJICh0dWxpcF9tZWRpYV9jYXBbdHAtPm10YWJsZS0+bWxlYWZbaV0ubWVkaWFdICYgTWVkaWFBbHdheXNGRCkgJiYgaSA+IDA7IGktLSkKKwkJOworbWVkaWFfcGlja2VkOgorCisJdHAtPmNzcjYgPSAwOworCXRwLT5jdXJfaW5kZXggPSBpOworCXRwLT5ud2F5c2V0ID0gMDsKKworCWlmIChkZXYtPmlmX3BvcnQpIHsKKwkJaWYgKHRwLT5jaGlwX2lkID09IERDMjExNDMgICYmCisJCSAgICAodHVsaXBfbWVkaWFfY2FwW2Rldi0+aWZfcG9ydF0gJiBNZWRpYUlzTUlJKSkgeworCQkJLyogV2UgbXVzdCByZXNldCB0aGUgbWVkaWEgQ1NScyB3aGVuIHdlIGZvcmNlLXNlbGVjdCBNSUkgbW9kZS4gKi8KKwkJCWlvd3JpdGUzMigweDAwMDAsIGlvYWRkciArIENTUjEzKTsKKwkJCWlvd3JpdGUzMigweDAwMDAsIGlvYWRkciArIENTUjE0KTsKKwkJCWlvd3JpdGUzMigweDAwMDgsIGlvYWRkciArIENTUjE1KTsKKwkJfQorCQl0dWxpcF9zZWxlY3RfbWVkaWEoZGV2LCAxKTsKKwl9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IERDMjExNDIpIHsKKwkJaWYgKHRwLT5taWlfY250KSB7CisJCQl0dWxpcF9zZWxlY3RfbWVkaWEoZGV2LCAxKTsKKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVzaW5nIE1JSSB0cmFuc2NlaXZlciAlZCwgc3RhdHVzICIKKwkJCQkJICAgIiU0LjR4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCB0cC0+cGh5c1swXSwgdHVsaXBfbWRpb19yZWFkKGRldiwgdHAtPnBoeXNbMF0sIDEpKTsKKwkJCWlvd3JpdGUzMihjc3I2X21hc2tfZGVmc3RhdGUsIGlvYWRkciArIENTUjYpOworCQkJdHAtPmNzcjYgPSBjc3I2X21hc2tfaGRjYXA7CisJCQlkZXYtPmlmX3BvcnQgPSAxMTsKKwkJCWlvd3JpdGUzMigweDAwMDAsIGlvYWRkciArIENTUjEzKTsKKwkJCWlvd3JpdGUzMigweDAwMDAsIGlvYWRkciArIENTUjE0KTsKKwkJfSBlbHNlCisJCQl0MjExNDJfc3RhcnRfbndheShkZXYpOworCX0gZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gUE5JQzIpIHsKKwkgICAgICAgIC8qIGZvciBpbml0aWFsIHN0YXJ0dXAgYWR2ZXJ0aXNlIDEwLzEwMCBGdWxsIGFuZCBIYWxmICovCisJICAgICAgICB0cC0+c3ltX2FkdmVydGlzZSA9IDB4MDFFMDsKKyAgICAgICAgICAgICAgICAvKiBlbmFibGUgYXV0b25lZ290aWF0ZSBlbmQgaW50ZXJydXB0ICovCisJICAgICAgICBpb3dyaXRlMzIoaW9yZWFkMzIoaW9hZGRyK0NTUjUpfCAweDAwMDA4MDEwLCBpb2FkZHIgKyBDU1I1KTsKKwkgICAgICAgIGlvd3JpdGUzMihpb3JlYWQzMihpb2FkZHIrQ1NSNyl8IDB4MDAwMDgwMTAsIGlvYWRkciArIENTUjcpOworCQlwbmljMl9zdGFydF9ud2F5KGRldik7CisJfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBMQzgyQzE2OCAgJiYgICEgdHAtPm1lZGlhbG9jaykgeworCQlpZiAodHAtPm1paV9jbnQpIHsKKwkJCWRldi0+aWZfcG9ydCA9IDExOworCQkJdHAtPmNzcjYgPSAweDgxNEMwMDAwIHwgKHRwLT5mdWxsX2R1cGxleCA/IDB4MDIwMCA6IDApOworCQkJaW93cml0ZTMyKDB4MDAwMSwgaW9hZGRyICsgQ1NSMTUpOworCQl9IGVsc2UgaWYgKGlvcmVhZDMyKGlvYWRkciArIENTUjUpICYgVFBMbmtQYXNzKQorCQkJcG5pY19kb19ud2F5KGRldik7CisJCWVsc2UgeworCQkJLyogU3RhcnQgd2l0aCAxMG1icHMgdG8gZG8gYXV0b25lZ290aWF0aW9uLiAqLworCQkJaW93cml0ZTMyKDB4MzIsIGlvYWRkciArIENTUjEyKTsKKwkJCXRwLT5jc3I2ID0gMHgwMDQyMDAwMDsKKwkJCWlvd3JpdGUzMigweDAwMDFCMDc4LCBpb2FkZHIgKyAweEI4KTsKKwkJCWlvd3JpdGUzMigweDAyMDFCMDc4LCBpb2FkZHIgKyAweEI4KTsKKwkJCW5leHRfdGljayA9IDEqSFo7CisJCX0KKwl9IGVsc2UgaWYgKCh0cC0+Y2hpcF9pZCA9PSBNWDk4NzEzIHx8IHRwLT5jaGlwX2lkID09IENPTVBFWDk4ODEpCisJCQkgICAmJiAhIHRwLT5tZWRpYWxvY2spIHsKKwkJZGV2LT5pZl9wb3J0ID0gMDsKKwkJdHAtPmNzcjYgPSAweDAxODgwMDAwIHwgKHRwLT5mdWxsX2R1cGxleCA/IDB4MDIwMCA6IDApOworCQlpb3dyaXRlMzIoMHgwZjM3MDAwMCB8IGlvcmVhZDE2KGlvYWRkciArIDB4ODApLCBpb2FkZHIgKyAweDgwKTsKKwl9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IE1YOTg3MTUgfHwgdHAtPmNoaXBfaWQgPT0gTVg5ODcyNSkgeworCQkvKiBQcm92aWRlZCBieSBCT0xPLCBNYWNyb25peCAtIDEyLzEwLzE5OTguICovCisJCWRldi0+aWZfcG9ydCA9IDA7CisJCXRwLT5jc3I2ID0gMHgwMWE4MDIwMDsKKwkJaW93cml0ZTMyKDB4MGYzNzAwMDAgfCBpb3JlYWQxNihpb2FkZHIgKyAweDgwKSwgaW9hZGRyICsgMHg4MCk7CisJCWlvd3JpdGUzMigweDExMDAwIHwgaW9yZWFkMTYoaW9hZGRyICsgMHhhMCksIGlvYWRkciArIDB4YTApOworCX0gZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gQ09NRVQgfHwgdHAtPmNoaXBfaWQgPT0gQ09ORVhBTlQpIHsKKwkJLyogRW5hYmxlIGF1dG9tYXRpYyBUeCB1bmRlcnJ1biByZWNvdmVyeS4gKi8KKwkJaW93cml0ZTMyKGlvcmVhZDMyKGlvYWRkciArIDB4ODgpIHwgMSwgaW9hZGRyICsgMHg4OCk7CisJCWRldi0+aWZfcG9ydCA9IHRwLT5taWlfY250ID8gMTEgOiAwOworCQl0cC0+Y3NyNiA9IDB4MDAwNDAwMDA7CisJfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBBWDg4MTQwKSB7CisJCXRwLT5jc3I2ID0gdHAtPm1paV9jbnQgPyAweDAwMDQwMTAwIDogMHgwMDAwMDEwMDsKKwl9IGVsc2UKKwkJdHVsaXBfc2VsZWN0X21lZGlhKGRldiwgMSk7CisKKwkvKiBTdGFydCB0aGUgY2hpcCdzIFR4IHRvIHByb2Nlc3Mgc2V0dXAgZnJhbWUuICovCisJdHVsaXBfc3RvcF9yeHR4KHRwKTsKKwliYXJyaWVyKCk7CisJdWRlbGF5KDUpOworCWlvd3JpdGUzMih0cC0+Y3NyNiB8IFR4T24sIGlvYWRkciArIENTUjYpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaW93cml0ZTMyKHR1bGlwX3RibFt0cC0+Y2hpcF9pZF0udmFsaWRfaW50cnMsIGlvYWRkciArIENTUjUpOworCWlvd3JpdGUzMih0dWxpcF90YmxbdHAtPmNoaXBfaWRdLnZhbGlkX2ludHJzLCBpb2FkZHIgKyBDU1I3KTsKKwl0dWxpcF9zdGFydF9yeHR4KHRwKTsKKwlpb3dyaXRlMzIoMCwgaW9hZGRyICsgQ1NSMik7CQkvKiBSeCBwb2xsIGRlbWFuZCAqLworCisJaWYgKHR1bGlwX2RlYnVnID4gMikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgdHVsaXBfdXAoKSwgQ1NSMCAlOC44eCwgQ1NSNSAlOC44eCBDU1I2ICU4Ljh4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMCksIGlvcmVhZDMyKGlvYWRkciArIENTUjUpLAorCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNikpOworCX0KKworCS8qIFNldCB0aGUgdGltZXIgdG8gc3dpdGNoIHRvIGNoZWNrIGZvciBsaW5rIGJlYXQgYW5kIHBlcmhhcHMgc3dpdGNoCisJICAgdG8gYW4gYWx0ZXJuYXRlIG1lZGlhIHR5cGUuICovCisJdHAtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQobmV4dF90aWNrKTsKKwlhZGRfdGltZXIoJnRwLT50aW1lcik7CisjaWZkZWYgQ09ORklHX1RVTElQX05BUEkKKwlpbml0X3RpbWVyKCZ0cC0+b29tX3RpbWVyKTsKKyAgICAgICAgdHAtPm9vbV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworICAgICAgICB0cC0+b29tX3RpbWVyLmZ1bmN0aW9uID0gb29tX3RpbWVyOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQKK3R1bGlwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnR1bGlwX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSkpCisJCXJldHVybiByZXR2YWw7CisKKwl0dWxpcF9pbml0X3JpbmcgKGRldik7CisKKwl0dWxpcF91cCAoZGV2KTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgdHVsaXBfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodHVsaXBfbWVkaWFfY2FwW2Rldi0+aWZfcG9ydF0gJiBNZWRpYUlzTUlJKSB7CisJCS8qIERvIG5vdGhpbmcgLS0gdGhlIG1lZGlhIG1vbml0b3Igc2hvdWxkIGhhbmRsZSB0aGlzLiAqLworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVvdXQgdXNpbmcgTUlJIGRldmljZS5cbiIsCisJCQkJICAgZGV2LT5uYW1lKTsKKwl9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IERDMjExNDAgfHwgdHAtPmNoaXBfaWQgPT0gREMyMTE0MgorCQkJICAgfHwgdHAtPmNoaXBfaWQgPT0gTVg5ODcxMyB8fCB0cC0+Y2hpcF9pZCA9PSBDT01QRVg5ODgxCisJCQkgICB8fCB0cC0+Y2hpcF9pZCA9PSBETTkxMFggfHwgdHAtPmNoaXBfaWQgPT0gVUxJNTI2WCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogMjExNDAgdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTguOHgsICIKKwkJCSAgICJTSUEgJTguOHggJTguOHggJTguOHggJTguOHgsIHJlc2V0dGluZy4uLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSksIGlvcmVhZDMyKGlvYWRkciArIENTUjEyKSwKKwkJCSAgIGlvcmVhZDMyKGlvYWRkciArIENTUjEzKSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTQpLCBpb3JlYWQzMihpb2FkZHIgKyBDU1IxNSkpOworCQlpZiAoICEgdHAtPm1lZGlhbG9jayAgJiYgIHRwLT5tdGFibGUpIHsKKwkJCWRvCisJCQkJLS10cC0+Y3VyX2luZGV4OworCQkJd2hpbGUgKHRwLT5jdXJfaW5kZXggPj0gMAorCQkJCSAgICYmICh0dWxpcF9tZWRpYV9jYXBbdHAtPm10YWJsZS0+bWxlYWZbdHAtPmN1cl9pbmRleF0ubWVkaWFdCisJCQkJCSAgICYgTWVkaWFJc0ZEKSk7CisJCQlpZiAoLS10cC0+Y3VyX2luZGV4IDwgMCkgeworCQkJCS8qIFdlIHN0YXJ0IGFnYWluLCBidXQgc2hvdWxkIGluc3RlYWQgbG9vayBmb3IgZGVmYXVsdC4gKi8KKwkJCQl0cC0+Y3VyX2luZGV4ID0gdHAtPm10YWJsZS0+bGVhZmNvdW50IC0gMTsKKwkJCX0KKwkJCXR1bGlwX3NlbGVjdF9tZWRpYShkZXYsIDApOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3dpdGNoaW5nIHRvICVzICIKKwkJCQkgICAibWVkaWEuXG4iLCBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdKTsKKwkJfQorCX0gZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gUE5JQzIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBOSUMyIHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICU4Ljh4LCAiCisJCSAgICAgICAiQ1NSNi83ICU4Ljh4IC8gJTguOHggQ1NSMTIgJTguOHgsIHJlc2V0dGluZy4uLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgKGludClpb3JlYWQzMihpb2FkZHIgKyBDU1I1KSwgKGludClpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSwKKwkJICAgICAgIChpbnQpaW9yZWFkMzIoaW9hZGRyICsgQ1NSNyksIChpbnQpaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTguOHgsIENTUjEyICIKKwkJCSAgICIlOC44eCwgcmVzZXR0aW5nLi4uXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBDU1I1KSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpKTsKKwkJZGV2LT5pZl9wb3J0ID0gMDsKKwl9CisKKyNpZiBkZWZpbmVkKHdheV90b29fbWFueV9tZXNzYWdlcykKKwlpZiAodHVsaXBfZGVidWcgPiAzKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJCXU4ICpidWYgPSAodTggKikodHAtPnJ4X3JpbmdbaV0uYnVmZmVyMSk7CisJCQlpbnQgajsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlMmQ6ICU4Ljh4ICU4Ljh4ICU4Ljh4ICU4Ljh4ICAiCisJCQkJICAgIiUyLjJ4ICUyLjJ4ICUyLjJ4LlxuIiwKKwkJCQkgICBpLCAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLnN0YXR1cywKKwkJCQkgICAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLmxlbmd0aCwKKwkJCQkgICAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLmJ1ZmZlcjEsCisJCQkJICAgKHVuc2lnbmVkIGludCl0cC0+cnhfcmluZ1tpXS5idWZmZXIyLAorCQkJCSAgIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0pOworCQkJZm9yIChqID0gMDsgYnVmW2pdICE9IDB4ZWUgJiYgaiA8IDE2MDA7IGorKykKKwkJCQlpZiAoaiA8IDEwMCkgcHJpbnRrKCIgJTIuMngiLCBidWZbal0pOworCQkJcHJpbnRrKCIgaj0lZC5cbiIsIGopOworCQl9CisJCXByaW50ayhLRVJOX0RFQlVHICIgIFJ4IHJpbmcgJTguOHg6ICIsIChpbnQpdHAtPnJ4X3JpbmcpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAlOC44eCIsICh1bnNpZ25lZCBpbnQpdHAtPnJ4X3JpbmdbaV0uc3RhdHVzKTsKKwkJcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAiICBUeCByaW5nICU4Ljh4OiAiLCAoaW50KXRwLT50eF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKCIgJTguOHgiLCAodW5zaWduZWQgaW50KXRwLT50eF9yaW5nW2ldLnN0YXR1cyk7CisJCXByaW50aygiXG4iKTsKKwl9CisjZW5kaWYKKworCS8qIFN0b3AgYW5kIHJlc3RhcnQgdGhlIGNoaXAncyBUeCBwcm9jZXNzZXMgLiAqLworCisJdHVsaXBfcmVzdGFydF9yeHR4KHRwKTsKKwkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQuICovCisJaW93cml0ZTMyKDAsIGlvYWRkciArIENTUjEpOworCisJdHAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnRwLT5sb2NrLCBmbGFncyk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQgdHVsaXBfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCXRwLT5zdXNwX3J4ID0gMDsKKwl0cC0+dHRpbWVyID0gMDsKKwl0cC0+bmlyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQl0cC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAweDAwMDAwMDAwOworCQl0cC0+cnhfcmluZ1tpXS5sZW5ndGggPSBjcHVfdG9fbGUzMihQS1RfQlVGX1NaKTsKKwkJdHAtPnJ4X3JpbmdbaV0uYnVmZmVyMiA9IGNwdV90b19sZTMyKHRwLT5yeF9yaW5nX2RtYSArIHNpemVvZihzdHJ1Y3QgdHVsaXBfcnhfZGVzYykgKiAoaSArIDEpKTsKKwkJdHAtPnJ4X2J1ZmZlcnNbaV0uc2tiID0gTlVMTDsKKwkJdHAtPnJ4X2J1ZmZlcnNbaV0ubWFwcGluZyA9IDA7CisJfQorCS8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcuICovCisJdHAtPnJ4X3JpbmdbaS0xXS5sZW5ndGggPSBjcHVfdG9fbGUzMihQS1RfQlVGX1NaIHwgREVTQ19SSU5HX1dSQVApOworCXRwLT5yeF9yaW5nW2ktMV0uYnVmZmVyMiA9IGNwdV90b19sZTMyKHRwLT5yeF9yaW5nX2RtYSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nOworCisJCS8qIE5vdGUgdGhlIHJlY2VpdmUgYnVmZmVyIG11c3QgYmUgbG9uZ3dvcmQgYWxpZ25lZC4KKwkJICAgZGV2X2FsbG9jX3NrYigpIHByb3ZpZGVzIDE2IGJ5dGUgYWxpZ25tZW50LiAgQnV0IGRvICpub3QqCisJCSAgIHVzZSBza2JfcmVzZXJ2ZSgpIHRvIGFsaWduIHRoZSBJUCBoZWFkZXIhICovCisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOworCQl0cC0+cnhfYnVmZmVyc1tpXS5za2IgPSBza2I7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWJyZWFrOworCQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHNrYi0+dGFpbCwKKwkJCQkJIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXRwLT5yeF9idWZmZXJzW2ldLm1hcHBpbmcgPSBtYXBwaW5nOworCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCXRwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd25lZCk7CS8qIE93bmVkIGJ5IFR1bGlwIGNoaXAgKi8KKwkJdHAtPnJ4X3JpbmdbaV0uYnVmZmVyMSA9IGNwdV90b19sZTMyKG1hcHBpbmcpOworCX0KKwl0cC0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KShpIC0gUlhfUklOR19TSVpFKTsKKworCS8qIFRoZSBUeCBidWZmZXIgZGVzY3JpcHRvciBpcyBmaWxsZWQgaW4gYXMgbmVlZGVkLCBidXQgd2UKKwkgICBkbyBuZWVkIHRvIGNsZWFyIHRoZSBvd25lcnNoaXAgYml0LiAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQl0cC0+dHhfYnVmZmVyc1tpXS5za2IgPSBOVUxMOworCQl0cC0+dHhfYnVmZmVyc1tpXS5tYXBwaW5nID0gMDsKKwkJdHAtPnR4X3JpbmdbaV0uc3RhdHVzID0gMHgwMDAwMDAwMDsKKwkJdHAtPnR4X3JpbmdbaV0uYnVmZmVyMiA9IGNwdV90b19sZTMyKHRwLT50eF9yaW5nX2RtYSArIHNpemVvZihzdHJ1Y3QgdHVsaXBfdHhfZGVzYykgKiAoaSArIDEpKTsKKwl9CisJdHAtPnR4X3JpbmdbaS0xXS5idWZmZXIyID0gY3B1X3RvX2xlMzIodHAtPnR4X3JpbmdfZG1hKTsKK30KKworc3RhdGljIGludAordHVsaXBfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5OworCXUzMiBmbGFnOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0gdHAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworCXRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPSBza2I7CisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBza2ItPmRhdGEsCisJCQkJIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwl0cC0+dHhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZyA9IG1hcHBpbmc7CisJdHAtPnR4X3JpbmdbZW50cnldLmJ1ZmZlcjEgPSBjcHVfdG9fbGUzMihtYXBwaW5nKTsKKworCWlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4IDwgVFhfUklOR19TSVpFLzIpIHsvKiBUeXBpY2FsIHBhdGggKi8KKwkJZmxhZyA9IDB4NjAwMDAwMDA7IC8qIE5vIGludGVycnVwdCAqLworCX0gZWxzZSBpZiAodHAtPmN1cl90eCAtIHRwLT5kaXJ0eV90eCA9PSBUWF9SSU5HX1NJWkUvMikgeworCQlmbGFnID0gMHhlMDAwMDAwMDsgLyogVHgtZG9uZSBpbnRyLiAqLworCX0gZWxzZSBpZiAodHAtPmN1cl90eCAtIHRwLT5kaXJ0eV90eCA8IFRYX1JJTkdfU0laRSAtIDIpIHsKKwkJZmxhZyA9IDB4NjAwMDAwMDA7IC8qIE5vIFR4LWRvbmUgaW50ci4gKi8KKwl9IGVsc2UgewkJLyogTGVhdmUgcm9vbSBmb3Igc2V0X3J4X21vZGUoKSB0byBmaWxsIGVudHJpZXMuICovCisJCWZsYWcgPSAweGUwMDAwMDAwOyAvKiBUeC1kb25lIGludHIuICovCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl9CisJaWYgKGVudHJ5ID09IFRYX1JJTkdfU0laRS0xKQorCQlmbGFnID0gMHhlMDAwMDAwMCB8IERFU0NfUklOR19XUkFQOworCisJdHAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCA9IGNwdV90b19sZTMyKHNrYi0+bGVuIHwgZmxhZyk7CisJLyogaWYgd2Ugd2VyZSB1c2luZyBUcmFuc21pdCBBdXRvbWF0aWMgUG9sbGluZywgd2Ugd291bGQgbmVlZCBhCisJICogd21iKCkgaGVyZS4gKi8KKwl0cC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bmVkKTsKKwl3bWIoKTsKKworCXRwLT5jdXJfdHgrKzsKKworCS8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHRyYW5zbWl0IGRlbWFuZC4gKi8KKwlpb3dyaXRlMzIoMCwgdHAtPmJhc2VfYWRkciArIENTUjEpOworCisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0dWxpcF9jbGVhbl90eF9yaW5nKHN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCkKK3sKKwl1bnNpZ25lZCBpbnQgZGlydHlfdHg7CisKKwlmb3IgKGRpcnR5X3R4ID0gdHAtPmRpcnR5X3R4IDsgdHAtPmN1cl90eCAtIGRpcnR5X3R4ID4gMDsKKwkJZGlydHlfdHgrKykgeworCQlpbnQgZW50cnkgPSBkaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKKwkJaW50IHN0YXR1cyA9IGxlMzJfdG9fY3B1KHRwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQl0cC0+c3RhdHMudHhfZXJyb3JzKys7CS8qIEl0IHdhc24ndCBUeGVkICovCisJCQl0cC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gMDsKKwkJfQorCisJCS8qIENoZWNrIGZvciBUeCBmaWx0ZXIgc2V0dXAgZnJhbWVzLiAqLworCQlpZiAodHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9PSBOVUxMKSB7CisJCQkvKiB0ZXN0IGJlY2F1c2UgZHVtbXkgZnJhbWVzIG5vdCBtYXBwZWQgKi8KKwkJCWlmICh0cC0+dHhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZykKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LAorCQkJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKwkJCQkJc2l6ZW9mKHRwLT5zZXR1cF9mcmFtZSksCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJY29udGludWU7CisJCX0KKworCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cC0+dHhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKwkJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiLT5sZW4sCisJCQkJUENJX0RNQV9UT0RFVklDRSk7CisKKwkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQlkZXZfa2ZyZWVfc2tiX2lycSh0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiKTsKKwkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9IE5VTEw7CisJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHR1bGlwX2Rvd24gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRlbF90aW1lcl9zeW5jICgmdHAtPnRpbWVyKTsKKyNpZmRlZiBDT05GSUdfVFVMSVBfTkFQSQorCWRlbF90aW1lcl9zeW5jICgmdHAtPm9vbV90aW1lcik7CisjZW5kaWYKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJnRwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCWlvd3JpdGUzMiAoMHgwMDAwMDAwMCwgaW9hZGRyICsgQ1NSNyk7CisKKwkvKiBTdG9wIHRoZSBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworCXR1bGlwX3N0b3Bfcnh0eCh0cCk7CisKKwkvKiBwcmVwYXJlIHJlY2VpdmUgYnVmZmVycyAqLworCXR1bGlwX3JlZmlsbF9yeChkZXYpOworCisJLyogcmVsZWFzZSBhbnkgdW5jb25zdW1lZCB0cmFuc21pdCBidWZmZXJzICovCisJdHVsaXBfY2xlYW5fdHhfcmluZyh0cCk7CisKKwlpZiAoaW9yZWFkMzIgKGlvYWRkciArIENTUjYpICE9IDB4ZmZmZmZmZmYpCisJCXRwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlvcmVhZDMyIChpb2FkZHIgKyBDU1I4KSAmIDB4ZmZmZjsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJaW5pdF90aW1lcigmdHAtPnRpbWVyKTsKKwl0cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwl0cC0+dGltZXIuZnVuY3Rpb24gPSB0dWxpcF90YmxbdHAtPmNoaXBfaWRdLm1lZGlhX3RpbWVyOworCisJZGV2LT5pZl9wb3J0ID0gdHAtPnNhdmVkX2lmX3BvcnQ7CisKKwkvKiBMZWF2ZSB0aGUgZHJpdmVyIGluIHNub296ZSwgbm90IHNsZWVwLCBtb2RlLiAqLworCXR1bGlwX3NldF9wb3dlcl9zdGF0ZSAodHAsIDAsIDEpOworfQorCisKK3N0YXRpYyBpbnQgdHVsaXBfY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJaW50IGk7CisKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCisJdHVsaXBfZG93biAoZGV2KTsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzICUyLjJ4LlxuIiwKKwkJCWRldi0+bmFtZSwgaW9yZWFkMzIgKGlvYWRkciArIENTUjUpKTsKKworCWZyZWVfaXJxIChkZXYtPmlycSwgZGV2KTsKKworCS8qIEZyZWUgYWxsIHRoZSBza2J1ZmZzIGluIHRoZSBSeCBxdWV1ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHRwLT5yeF9idWZmZXJzW2ldLnNrYjsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nID0gdHAtPnJ4X2J1ZmZlcnNbaV0ubWFwcGluZzsKKworCQl0cC0+cnhfYnVmZmVyc1tpXS5za2IgPSBOVUxMOworCQl0cC0+cnhfYnVmZmVyc1tpXS5tYXBwaW5nID0gMDsKKworCQl0cC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOwkvKiBOb3Qgb3duZWQgYnkgVHVsaXAgY2hpcC4gKi8KKwkJdHAtPnJ4X3JpbmdbaV0ubGVuZ3RoID0gMDsKKwkJdHAtPnJ4X3JpbmdbaV0uYnVmZmVyMSA9IDB4QkFERjAwRDA7CS8qIEFuIGludmFsaWQgYWRkcmVzcy4gKi8KKwkJaWYgKHNrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwgbWFwcGluZywgUEtUX0JVRl9TWiwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiIChza2IpOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHAtPnR4X2J1ZmZlcnNbaV0uc2tiOworCisJCWlmIChza2IgIT0gTlVMTCkgeworCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwgdHAtPnR4X2J1ZmZlcnNbaV0ubWFwcGluZywKKwkJCQkJIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IgKHNrYik7CisJCX0KKwkJdHAtPnR4X2J1ZmZlcnNbaV0uc2tiID0gTlVMTDsKKwkJdHAtPnR4X2J1ZmZlcnNbaV0ubWFwcGluZyA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdHVsaXBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJCXRwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlvcmVhZDMyKGlvYWRkciArIENTUjgpICYgMHhmZmZmOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuICZ0cC0+c3RhdHM7Cit9CisKKworc3RhdGljIHZvaWQgdHVsaXBfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBkZXYpKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBvcHMgPSB7CisJLmdldF9kcnZpbmZvID0gdHVsaXBfZ2V0X2RydmluZm8KK307CisKKy8qIFByb3ZpZGUgaW9jdGwoKSBjYWxscyB0byBleGFtaW5lIHRoZSBNSUkgeGN2ciBzdGF0ZS4gKi8KK3N0YXRpYyBpbnQgcHJpdmF0ZV9pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkocnEpOworCWNvbnN0IHVuc2lnbmVkIGludCBwaHlfaWR4ID0gMDsKKwlpbnQgcGh5ID0gdHAtPnBoeXNbcGh5X2lkeF0gJiAweDFmOworCXVuc2lnbmVkIGludCByZWdudW0gPSBkYXRhLT5yZWdfbnVtOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgkJLyogR2V0IGFkZHJlc3Mgb2YgTUlJIFBIWSBpbiB1c2UuICovCisJCWlmICh0cC0+bWlpX2NudCkKKwkJCWRhdGEtPnBoeV9pZCA9IHBoeTsKKwkJZWxzZSBpZiAodHAtPmZsYWdzICYgSEFTX05XQVkpCisJCQlkYXRhLT5waHlfaWQgPSAzMjsKKwkJZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gQ09NRVQpCisJCQlkYXRhLT5waHlfaWQgPSAxOworCQllbHNlCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCWNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCWlmIChkYXRhLT5waHlfaWQgPT0gMzIgJiYgKHRwLT5mbGFncyAmIEhBU19OV0FZKSkgeworCQkJaW50IGNzcjEyID0gaW9yZWFkMzIgKGlvYWRkciArIENTUjEyKTsKKwkJCWludCBjc3IxNCA9IGlvcmVhZDMyIChpb2FkZHIgKyBDU1IxNCk7CisJCQlzd2l0Y2ggKHJlZ251bSkgeworCQkJY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChjc3IxNDw8NSkgJiAweDEwMDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRldi0+aWZfcG9ydCA9PSA1ICYmIHRwLT5ud2F5c2V0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT52YWxfb3V0ID0gMHgxMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+dmFsX291dCA9ICh0dWxpcF9tZWRpYV9jYXBbZGV2LT5pZl9wb3J0XSZNZWRpYUlzMTAwID8gMHgyMDAwIDogMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdJk1lZGlhSXNGRCA/IDB4MDEwMCA6IDApOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT52YWxfb3V0ID0KKwkJCQkJMHgxODQ4ICsKKwkJCQkJKChjc3IxMiYweDcwMDApID09IDB4NTAwMCA/IDB4MjAgOiAwKSArCisJCQkJCSgoY3NyMTImMHgwNikgPT0gNiA/IDAgOiA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+dmFsX291dCB8PSAweDYwNDg7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmVydGlzZWQgdmFsdWUsIGJvZ3VzIDEwYmFzZVR4LUZEIHZhbHVlIGZyb20gQ1NSNi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+dmFsX291dCA9CisJCQkJCSgoaW9yZWFkMzIoaW9hZGRyICsgQ1NSNikgPj4gMykgJiAweDAwNDApICsKKwkJCQkJKChjc3IxNCA+PiAxKSAmIDB4MjApICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+dmFsX291dCB8PSAoKGNzcjE0ID4+IDkpICYgMHgwM0MwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNTogZGF0YS0+dmFsX291dCA9IHRwLT5scGFyOyBicmVhazsKKwkJCWRlZmF1bHQ6IGRhdGEtPnZhbF9vdXQgPSAwOyBicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRhdGEtPnZhbF9vdXQgPSB0dWxpcF9tZGlvX3JlYWQgKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgcmVnbnVtKTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQlpZiAoIWNhcGFibGUgKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKHJlZ251bSAmIH4weDFmKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChkYXRhLT5waHlfaWQgPT0gcGh5KSB7CisJCQl1MTYgdmFsdWUgPSBkYXRhLT52YWxfaW47CisJCQlzd2l0Y2ggKHJlZ251bSkgeworCQkJY2FzZSAwOgkvKiBDaGVjayBmb3IgYXV0b25lZ290aWF0aW9uIG9uIG9yIHJlc2V0LiAqLworCQkJCXRwLT5mdWxsX2R1cGxleF9sb2NrID0gKHZhbHVlICYgMHg5MDAwKSA/IDAgOiAxOworCQkJCWlmICh0cC0+ZnVsbF9kdXBsZXhfbG9jaykKKwkJCQkJdHAtPmZ1bGxfZHVwbGV4ID0gKHZhbHVlICYgMHgwMTAwKSA/IDEgOiAwOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXRwLT5hZHZlcnRpc2luZ1twaHlfaWR4XSA9CisJCQkJdHAtPm1paV9hZHZlcnRpc2UgPSBkYXRhLT52YWxfaW47CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGRhdGEtPnBoeV9pZCA9PSAzMiAmJiAodHAtPmZsYWdzICYgSEFTX05XQVkpKSB7CisJCQl1MTYgdmFsdWUgPSBkYXRhLT52YWxfaW47CisJCQlpZiAocmVnbnVtID09IDApIHsKKwkJCSAgaWYgKCh2YWx1ZSAmIDB4MTIwMCkgPT0gMHgxMjAwKSB7CisJCQkgICAgaWYgKHRwLT5jaGlwX2lkID09IFBOSUMyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuaWMyX3N0YXJ0X253YXkgKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCQkgICB0MjExNDJfc3RhcnRfbndheSAoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkgIH0KKwkJCX0gZWxzZSBpZiAocmVnbnVtID09IDQpCisJCQkJdHAtPnN5bV9hZHZlcnRpc2UgPSB2YWx1ZTsKKwkJfSBlbHNlIHsKKwkJCXR1bGlwX21kaW9fd3JpdGUgKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgcmVnbnVtLCBkYXRhLT52YWxfaW4pOworCQl9CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgICBOb3RlIHRoYXQgd2Ugb25seSB1c2UgZXhjbHVzaW9uIGFyb3VuZCBhY3R1YWxseSBxdWV1ZWluZyB0aGUKKyAgIG5ldyBmcmFtZSwgbm90IGFyb3VuZCBmaWxsaW5nIHRwLT5zZXR1cF9mcmFtZS4gIFRoaXMgaXMgbm9uLWRldGVybWluaXN0aWMKKyAgIHdoZW4gcmUtZW50ZXJlZCBidXQgc3RpbGwgY29ycmVjdC4gKi8KKworI3VuZGVmIHNldF9iaXRfbGUKKyNkZWZpbmUgc2V0X2JpdF9sZShpLHApIGRvIHsgKChjaGFyICopKHApKVsoaSkvOF0gfD0gKDE8PCgoaSklOCkpOyB9IHdoaWxlKDApCisKK3N0YXRpYyB2b2lkIGJ1aWxkX3NldHVwX2ZyYW1lX2hhc2godTE2ICpzZXR1cF9mcm0sIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgaGFzaF90YWJsZVszMl07CisJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJaW50IGk7CisJdTE2ICplYWRkcnM7CisKKwltZW1zZXQoaGFzaF90YWJsZSwgMCwgc2l6ZW9mKGhhc2hfdGFibGUpKTsKKwlzZXRfYml0X2xlKDI1NSwgaGFzaF90YWJsZSk7IAkJCS8qIEJyb2FkY2FzdCBlbnRyeSAqLworCS8qIFRoaXMgc2hvdWxkIHdvcmsgb24gYmlnLWVuZGlhbiBtYWNoaW5lcyBhcyB3ZWxsLiAqLworCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJaW50IGluZGV4ID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSAmIDB4MWZmOworCisJCXNldF9iaXRfbGUoaW5kZXgsIGhhc2hfdGFibGUpOworCisJfQorCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCSpzZXR1cF9mcm0rKyA9IGhhc2hfdGFibGVbaV07CisJCSpzZXR1cF9mcm0rKyA9IGhhc2hfdGFibGVbaV07CisJfQorCXNldHVwX2ZybSA9ICZ0cC0+c2V0dXBfZnJhbWVbMTMqNl07CisKKwkvKiBGaWxsIHRoZSBmaW5hbCBlbnRyeSB3aXRoIG91ciBwaHlzaWNhbCBhZGRyZXNzLiAqLworCWVhZGRycyA9ICh1MTYgKilkZXYtPmRldl9hZGRyOworCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1swXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzBdOworCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1sxXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzFdOworCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1syXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzJdOworfQorCitzdGF0aWMgdm9pZCBidWlsZF9zZXR1cF9mcmFtZV9wZXJmZWN0KHUxNiAqc2V0dXBfZnJtLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJaW50IGk7CisJdTE2ICplYWRkcnM7CisKKwkvKiBXZSBoYXZlIDw9IDE0IGFkZHJlc3NlcyBzbyB3ZSBjYW4gdXNlIHRoZSB3b25kZXJmdWwKKwkgICAxNiBhZGRyZXNzIHBlcmZlY3QgZmlsdGVyaW5nIG9mIHRoZSBUdWxpcC4gKi8KKwlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IGkgPCBkZXYtPm1jX2NvdW50OworCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJZWFkZHJzID0gKHUxNiAqKW1jbGlzdC0+ZG1pX2FkZHI7CisJCSpzZXR1cF9mcm0rKyA9ICplYWRkcnM7ICpzZXR1cF9mcm0rKyA9ICplYWRkcnMrKzsKKwkJKnNldHVwX2ZybSsrID0gKmVhZGRyczsgKnNldHVwX2ZybSsrID0gKmVhZGRycysrOworCQkqc2V0dXBfZnJtKysgPSAqZWFkZHJzOyAqc2V0dXBfZnJtKysgPSAqZWFkZHJzKys7CisJfQorCS8qIEZpbGwgdGhlIHVudXNlZCBlbnRyaWVzIHdpdGggdGhlIGJyb2FkY2FzdCBhZGRyZXNzLiAqLworCW1lbXNldChzZXR1cF9mcm0sIDB4ZmYsICgxNS1pKSoxMik7CisJc2V0dXBfZnJtID0gJnRwLT5zZXR1cF9mcmFtZVsxNSo2XTsKKworCS8qIEZpbGwgdGhlIGZpbmFsIGVudHJ5IHdpdGggb3VyIHBoeXNpY2FsIGFkZHJlc3MuICovCisJZWFkZHJzID0gKHUxNiAqKWRldi0+ZGV2X2FkZHI7CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzBdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMF07CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzFdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMV07CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzJdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMl07Cit9CisKKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlpbnQgY3NyNjsKKworCWNzcjYgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSAmIH4weDAwRDU7CisKKwl0cC0+Y3NyNiAmPSB+MHgwMEQ1OworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJCQkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCXRwLT5jc3I2IHw9IEFjY2VwdEFsbE11bHRpY2FzdCB8IEFjY2VwdEFsbFBoeXM7CisJCWNzcjYgfD0gQWNjZXB0QWxsTXVsdGljYXN0IHwgQWNjZXB0QWxsUGh5czsKKwkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IDEwMDApICB8fCAgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIGZpbHRlciB3ZWxsIC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJdHAtPmNzcjYgfD0gQWNjZXB0QWxsTXVsdGljYXN0OworCQljc3I2IHw9IEFjY2VwdEFsbE11bHRpY2FzdDsKKwl9IGVsc2UJaWYgKHRwLT5mbGFncyAmIE1DX0hBU0hfT05MWSkgeworCQkvKiBTb21lIHdvcmstYWxpa2VzIGhhdmUgb25seSBhIDY0LWVudHJ5IGhhc2ggZmlsdGVyIHRhYmxlLiAqLworCQkvKiBTaG91bGQgdmVyaWZ5IGNvcnJlY3RuZXNzIG9uIGJpZy1lbmRpYW4vX19wb3dlcnBjX18gKi8KKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCWludCBpOworCQlpZiAoZGV2LT5tY19jb3VudCA+IDY0KSB7CQkvKiBBcmJpdHJhcnkgbm9uLWVmZmVjdGl2ZSBsaW1pdC4gKi8KKwkJCXRwLT5jc3I2IHw9IEFjY2VwdEFsbE11bHRpY2FzdDsKKwkJCWNzcjYgfD0gQWNjZXB0QWxsTXVsdGljYXN0OworCQl9IGVsc2UgeworCQkJdTMyIG1jX2ZpbHRlclsyXSA9IHswLCAwfTsJCSAvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKwkJCWludCBmaWx0ZXJiaXQ7CisJCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsKKwkJCQkgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCQlpZiAodHAtPmZsYWdzICYgQ09NRVRfTUFDX0FERFIpCisJCQkJCWZpbHRlcmJpdCA9IGV0aGVyX2NyY19sZShFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcik7CisJCQkJZWxzZQorCQkJCQlmaWx0ZXJiaXQgPSBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDI2OworCQkJCWZpbHRlcmJpdCAmPSAweDNmOworCQkJCW1jX2ZpbHRlcltmaWx0ZXJiaXQgPj4gNV0gfD0gMSA8PCAoZmlsdGVyYml0ICYgMzEpOworCQkJCWlmICh0dWxpcF9kZWJ1ZyA+IDIpIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFkZGVkIGZpbHRlciBmb3IgJTIuMng6JTIuMng6JTIuMng6IgorCQkJCQkJICAgIiUyLjJ4OiUyLjJ4OiUyLjJ4ICAlOC44eCBiaXQgJWQuXG4iLCBkZXYtPm5hbWUsCisJCQkJCQkgICBtY2xpc3QtPmRtaV9hZGRyWzBdLCBtY2xpc3QtPmRtaV9hZGRyWzFdLAorCQkJCQkJICAgbWNsaXN0LT5kbWlfYWRkclsyXSwgbWNsaXN0LT5kbWlfYWRkclszXSwKKwkJCQkJCSAgIG1jbGlzdC0+ZG1pX2FkZHJbNF0sIG1jbGlzdC0+ZG1pX2FkZHJbNV0sCisJCQkJCQkgICBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpLCBmaWx0ZXJiaXQpOworCQkJCX0KKwkJCX0KKwkJCWlmIChtY19maWx0ZXJbMF0gPT0gdHAtPm1jX2ZpbHRlclswXSAgJiYKKwkJCQltY19maWx0ZXJbMV0gPT0gdHAtPm1jX2ZpbHRlclsxXSkKKwkJCQk7CQkJCS8qIE5vIGNoYW5nZS4gKi8KKwkJCWVsc2UgaWYgKHRwLT5mbGFncyAmIElTX0FTSVgpIHsKKwkJCQlpb3dyaXRlMzIoMiwgaW9hZGRyICsgQ1NSMTMpOworCQkJCWlvd3JpdGUzMihtY19maWx0ZXJbMF0sIGlvYWRkciArIENTUjE0KTsKKwkJCQlpb3dyaXRlMzIoMywgaW9hZGRyICsgQ1NSMTMpOworCQkJCWlvd3JpdGUzMihtY19maWx0ZXJbMV0sIGlvYWRkciArIENTUjE0KTsKKwkJCX0gZWxzZSBpZiAodHAtPmZsYWdzICYgQ09NRVRfTUFDX0FERFIpIHsKKwkJCQlpb3dyaXRlMzIobWNfZmlsdGVyWzBdLCBpb2FkZHIgKyAweEFDKTsKKwkJCQlpb3dyaXRlMzIobWNfZmlsdGVyWzFdLCBpb2FkZHIgKyAweEIwKTsKKwkJCX0KKwkJCXRwLT5tY19maWx0ZXJbMF0gPSBtY19maWx0ZXJbMF07CisJCQl0cC0+bWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzFdOworCQl9CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJdTMyIHR4X2ZsYWdzID0gMHgwODAwMDAwMCB8IDE5MjsKKworCQkvKiBOb3RlIHRoYXQgb25seSB0aGUgbG93LWFkZHJlc3Mgc2hvcnR3b3JkIG9mIHNldHVwX2ZyYW1lIGlzIHZhbGlkIQorCQkgICBUaGUgdmFsdWVzIGFyZSBkb3VibGVkIGZvciBiaWctZW5kaWFuIGFyY2hpdGVjdHVyZXMuICovCisJCWlmIChkZXYtPm1jX2NvdW50ID4gMTQpIHsgLyogTXVzdCB1c2UgYSBtdWx0aWNhc3QgaGFzaCB0YWJsZS4gKi8KKwkJCWJ1aWxkX3NldHVwX2ZyYW1lX2hhc2godHAtPnNldHVwX2ZyYW1lLCBkZXYpOworCQkJdHhfZmxhZ3MgPSAweDA4NDAwMDAwIHwgMTkyOworCQl9IGVsc2UgeworCQkJYnVpbGRfc2V0dXBfZnJhbWVfcGVyZmVjdCh0cC0+c2V0dXBfZnJhbWUsIGRldik7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAodHAtPmN1cl90eCAtIHRwLT5kaXJ0eV90eCA+IFRYX1JJTkdfU0laRSAtIDIpIHsKKwkJCS8qIFNhbWUgc2V0dXAgcmVjZW50bHkgcXVldWVkLCB3ZSBuZWVkIG5vdCBhZGQgaXQuICovCisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBpbnQgZW50cnk7CisJCQlpbnQgZHVtbXkgPSAtMTsKKworCQkJLyogTm93IGFkZCB0aGlzIGZyYW1lIHRvIHRoZSBUeCBsaXN0LiAqLworCisJCQllbnRyeSA9IHRwLT5jdXJfdHgrKyAlIFRYX1JJTkdfU0laRTsKKworCQkJaWYgKGVudHJ5ICE9IDApIHsKKwkJCQkvKiBBdm9pZCBhIGNoaXAgZXJyYXRhIGJ5IHByZWZpeGluZyBhIGR1bW15IGVudHJ5LiBEb24ndCBkbworCQkJCSAgIHRoaXMgb24gdGhlIFVMSTUyNlggYXMgaXQgdHJpZ2dlcnMgYSBkaWZmZXJlbnQgcHJvYmxlbSAqLworCQkJCWlmICghKHRwLT5jaGlwX2lkID09IFVMSTUyNlggJiYgKHRwLT5yZXZpc2lvbiA9IDB4NDAgfHwgdHAtPnJldmlzaW9uID09IDB4NTApKSkgeworCQkJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiID0gTlVMTDsKKwkJCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcgPSAwOworCQkJCQl0cC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0KKwkJCQkJCShlbnRyeSA9PSBUWF9SSU5HX1NJWkUtMSkgPyBjcHVfdG9fbGUzMihERVNDX1JJTkdfV1JBUCkgOiAwOworCQkJCQl0cC0+dHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IDA7CisJCQkJCS8qIE11c3Qgc2V0IERlc2NPd25lZCBsYXRlciB0byBhdm9pZCByYWNlIHdpdGggY2hpcCAqLworCQkJCQlkdW1teSA9IGVudHJ5OworCQkJCQllbnRyeSA9IHRwLT5jdXJfdHgrKyAlIFRYX1JJTkdfU0laRTsKKwkJCQl9CisJCQl9CisKKwkJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPSBOVUxMOworCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcgPQorCQkJCXBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cC0+c2V0dXBfZnJhbWUsCisJCQkJCSAgICAgICBzaXplb2YodHAtPnNldHVwX2ZyYW1lKSwKKwkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJLyogUHV0IHRoZSBzZXR1cCBmcmFtZSBvbiB0aGUgVHggbGlzdC4gKi8KKwkJCWlmIChlbnRyeSA9PSBUWF9SSU5HX1NJWkUtMSkKKwkJCQl0eF9mbGFncyB8PSBERVNDX1JJTkdfV1JBUDsJCS8qIFdyYXAgcmluZy4gKi8KKwkJCXRwLT50eF9yaW5nW2VudHJ5XS5sZW5ndGggPSBjcHVfdG9fbGUzMih0eF9mbGFncyk7CisJCQl0cC0+dHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9CisJCQkJY3B1X3RvX2xlMzIodHAtPnR4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcpOworCQkJdHAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd25lZCk7CisJCQlpZiAoZHVtbXkgPj0gMCkKKwkJCQl0cC0+dHhfcmluZ1tkdW1teV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bmVkKTsKKwkJCWlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSAtIDIpCisJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCQkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQuICovCisJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgQ1NSMSk7CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCX0KKworCWlvd3JpdGUzMihjc3I2LCBpb2FkZHIgKyBDU1I2KTsKK30KKworI2lmZGVmIENPTkZJR19UVUxJUF9NV0kKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0dWxpcF9td2lfY29uZmlnIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXU4IGNhY2hlOworCXUxNiBwY2lfY29tbWFuZDsKKwl1MzIgY3NyMDsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHVsaXBfbXdpX2NvbmZpZygpXG4iLCBwY2lfbmFtZShwZGV2KSk7CisKKwl0cC0+Y3NyMCA9IGNzcjAgPSAwOworCisJLyogaWYgd2UgaGF2ZSBhbnkgY2FjaGUgbGluZSBzaXplIGF0IGFsbCwgd2UgY2FuIGRvIE1STSAqLworCWNzcjAgfD0gTVJNOworCisJLyogLi4uYW5kIGJhcnJpbmcgaGFyZHdhcmUgYnVncywgTVdJICovCisJaWYgKCEodHAtPmNoaXBfaWQgPT0gREMyMTE0MyAmJiB0cC0+cmV2aXNpb24gPT0gNjUpKQorCQljc3IwIHw9IE1XSTsKKworCS8qIHNldCBvciBkaXNhYmxlIE1XSSBpbiB0aGUgc3RhbmRhcmQgUENJIGNvbW1hbmQgYml0LgorCSAqIENoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSAgbXdpIGlzIGRlc2lyZWQgYnV0IG5vdCBhdmFpbGFibGUKKwkgKi8KKwlpZiAoY3NyMCAmIE1XSSkJcGNpX3NldF9td2kocGRldik7CisJZWxzZQkJcGNpX2NsZWFyX213aShwZGV2KTsKKworCS8qIHJlYWQgcmVzdWx0IGZyb20gaGFyZHdhcmUgKGluIGNhc2UgYml0IHJlZnVzZWQgdG8gZW5hYmxlKSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NvbW1hbmQpOworCWlmICgoY3NyMCAmIE1XSSkgJiYgKCEocGNpX2NvbW1hbmQgJiBQQ0lfQ09NTUFORF9JTlZBTElEQVRFKSkpCisJCWNzcjAgJj0gfk1XSTsKKworCS8qIGlmIGNhY2hlIGxpbmUgc2l6ZSBoYXJkd2lyZWQgdG8gemVybywgbm8gTVdJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJmNhY2hlKTsKKwlpZiAoKGNzcjAgJiBNV0kpICYmIChjYWNoZSA9PSAwKSkgeworCQljc3IwICY9IH5NV0k7CisJCXBjaV9jbGVhcl9td2kocGRldik7CisJfQorCisJLyogYXNzaWduIHBlci1jYWNoZWxpbmUtc2l6ZSBjYWNoZSBhbGlnbm1lbnQgYW5kCisJICogYnVyc3QgbGVuZ3RoIHZhbHVlcworCSAqLworCXN3aXRjaCAoY2FjaGUpIHsKKwljYXNlIDg6CisJCWNzcjAgfD0gTVJMIHwgKDEgPDwgQ0FMU2hpZnQpIHwgKDE2IDw8IEJ1cnN0TGVuU2hpZnQpOworCQlicmVhazsKKwljYXNlIDE2OgorCQljc3IwIHw9IE1STCB8ICgyIDw8IENBTFNoaWZ0KSB8ICgxNiA8PCBCdXJzdExlblNoaWZ0KTsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJY3NyMCB8PSBNUkwgfCAoMyA8PCBDQUxTaGlmdCkgfCAoMzIgPDwgQnVyc3RMZW5TaGlmdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNhY2hlID0gMDsKKwkJYnJlYWs7CisJfQorCisJLyogaWYgd2UgaGF2ZSBhIGdvb2QgY2FjaGUgbGluZSBzaXplLCB3ZSBieSBub3cgaGF2ZSBhIGdvb2QKKwkgKiBjc3IwLCBzbyBzYXZlIGl0IGFuZCBleGl0CisJICovCisJaWYgKGNhY2hlKQorCQlnb3RvIG91dDsKKworCS8qIHdlIGRvbid0IGhhdmUgYSBnb29kIGNzcjAgb3IgY2FjaGUgbGluZSBzaXplLCBkaXNhYmxlIE1XSSAqLworCWlmIChjc3IwICYgTVdJKSB7CisJCXBjaV9jbGVhcl9td2kocGRldik7CisJCWNzcjAgJj0gfk1XSTsKKwl9CisKKwkvKiBzYW5lIGRlZmF1bHRzIGZvciBidXJzdCBsZW5ndGggYW5kIGNhY2hlIGFsaWdubWVudAorCSAqIG9yaWdpbmFsbHkgZnJvbSBkZTR4NSBkcml2ZXIKKwkgKi8KKwljc3IwIHw9ICg4IDw8IEJ1cnN0TGVuU2hpZnQpIHwgKDEgPDwgQ0FMU2hpZnQpOworCitvdXQ6CisJdHAtPmNzcjAgPSBjc3IwOworCWlmICh0dWxpcF9kZWJ1ZyA+IDIpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTVdJIGNvbmZpZyBjYWNoZWxpbmU9JWQsIGNzcjA9JTA4eFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCBjYWNoZSwgY3NyMCk7Cit9CisjZW5kaWYKKworLyoKKyAqCUNoaXBzIHRoYXQgaGF2ZSB0aGUgTVJNL3Jlc2VydmVkIGJpdCBxdWlyayBhbmQgdGhlIGJ1cnN0IHF1aXJrLiBUaGF0CisgKglpcyB0aGUgRE05MTBYIGFuZCB0aGUgb24gY2hpcCBVTGkgZGV2aWNlcworICovCisgCitzdGF0aWMgaW50IHR1bGlwX3VsaV9kbV9xdWlyayhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpZiAocGRldi0+dmVuZG9yID09IDB4MTI4MiAmJiBwZGV2LT5kZXZpY2UgPT0gMHg5MTAyKQorCQlyZXR1cm4gMTsKKwlpZiAocGRldi0+dmVuZG9yID09IDB4MTBiOSAmJiBwZGV2LT5kZXZpY2UgPT0gMHg1MjYxKQorCQlyZXR1cm4gMTsKKwlpZiAocGRldi0+dmVuZG9yID09IDB4MTBiOSAmJiBwZGV2LT5kZXZpY2UgPT0gMHg1MjYzKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdHVsaXBfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHA7CisJLyogU2VlIG5vdGUgYmVsb3cgb24gdGhlIG11bHRpcG9ydCBjYXJkcy4gKi8KKwlzdGF0aWMgdW5zaWduZWQgY2hhciBsYXN0X3BoeXNfYWRkcls2XSA9IHsweDAwLCAnTCcsICdpJywgJ24nLCAndScsICd4J307CisJc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGVhcmx5XzQ4Nl9jaGlwc2V0c1tdID0geworCQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjQyNCkgfSwKKwkJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNDk2KSB9LAorCQl7IH0sCisJfTsKKwlzdGF0aWMgaW50IGxhc3RfaXJxOworCXN0YXRpYyBpbnQgbXVsdGlwb3J0X2NudDsJLyogRm9yIGZvdXItcG9ydCBib2FyZHMgdy9vbmUgRUVQUk9NICovCisJdTggY2hpcF9yZXY7CisJaW50IGksIGlycTsKKwl1bnNpZ25lZCBzaG9ydCBzdW07CisJdW5zaWduZWQgY2hhciAqZWVfZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCXN0YXRpYyBpbnQgYm9hcmRfaWR4ID0gLTE7CisJaW50IGNoaXBfaWR4ID0gZW50LT5kcml2ZXJfZGF0YTsKKwljb25zdCBjaGFyICpjaGlwX25hbWUgPSB0dWxpcF90YmxbY2hpcF9pZHhdLmNoaXBfbmFtZTsKKwl1bnNpZ25lZCBpbnQgZWVwcm9tX21pc3NpbmcgPSAwOworCXVuc2lnbmVkIGludCBmb3JjZV9jc3IwID0gMDsKKworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IGRpZF92ZXJzaW9uOwkJLyogQWxyZWFkeSBwcmludGVkIHZlcnNpb24gaW5mby4gKi8KKwlpZiAodHVsaXBfZGVidWcgPiAwICAmJiAgZGlkX3ZlcnNpb24rKyA9PSAwKQorCQlwcmludGsgKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKyNlbmRpZgorCisJYm9hcmRfaWR4Kys7CisKKwkvKgorCSAqCUxhbiBtZWRpYSB3aXJlIGEgdHVsaXAgY2hpcCB0byBhIHdhbiBpbnRlcmZhY2UuIE5lZWRzIGEgdmVyeQorCSAqCWRpZmZlcmVudCBkcml2ZXIgKGxtYyBkcml2ZXIpCisJICovCisKKyAgICAgICAgaWYgKHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9MTUMpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggInNraXBwaW5nIExNQyBjYXJkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qCisJICoJRWFybHkgRE05MTAwJ3MgbmVlZCBzb2Z0d2FyZSBDUkMgYW5kIHRoZSBETUZFIGRyaXZlcgorCSAqLworCisJaWYgKHBkZXYtPnZlbmRvciA9PSAweDEyODIgJiYgcGRldi0+ZGV2aWNlID09IDB4OTEwMCkKKwl7CisJCXUzMiBkZXZfcmV2OworCQkvKiBSZWFkIENoaXAgcmV2aXNpb24gKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmRldl9yZXYpOworCQlpZihkZXZfcmV2IDwgMHgwMjAwMDAzMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAic2tpcHBpbmcgZWFybHkgRE05MTAwIHdpdGggQ3JjIGJ1ZyAodXNlIGRtZmUpXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyoKKwkgKglMb29rcyBmb3IgZWFybHkgUENJIGNoaXBzZXRzIHdoZXJlIHBlb3BsZSByZXBvcnQgaGFuZ3MKKwkgKgl3aXRob3V0IHRoZSB3b3JrYXJvdW5kcyBiZWluZyBvbi4KKwkgKi8KKworCS8qIDEuIEludGVsIFNhdHVybi4gU3dpdGNoIHRvIDggbG9uZyB3b3JkcyBidXJzdCwgOCBsb25nIHdvcmQgY2FjaGUKKwkgICAgICBhbGlnbmVkLiAgQXJpZXMgbWlnaHQgbmVlZCB0aGlzIHRvby4gVGhlIFNhdHVybiBlcnJhdGEgYXJlIG5vdCAKKwkgICAgICBwcmV0dHkgcmVhZGluZyBidXQgdGhhbmtmdWxseSBpdCdzIGFuIG9sZCA0ODYgY2hpcHNldC4KKworCSAgIDIuIFRoZSBkcmVhZGVkIFNpUzQ5NiA0ODYgY2hpcHNldC4gU2FtZSB3b3JrYXJvdW5kIGFzIEludGVsCisJICAgICAgU2F0dXJuLgorCSovCisKKwlpZiAocGNpX2Rldl9wcmVzZW50KGVhcmx5XzQ4Nl9jaGlwc2V0cykpIHsKKwkJY3NyMCA9IE1STCB8IE1STSB8ICg4IDw8IEJ1cnN0TGVuU2hpZnQpIHwgKDEgPDwgQ0FMU2hpZnQpOworCQlmb3JjZV9jc3IwID0gMTsKKwl9CisKKwkvKiBidWdmaXg6IHRoZSBBU0lYIG11c3QgaGF2ZSBhIGJ1cnN0IGxpbWl0IG9yIGhvcnJpYmxlIHRoaW5ncyBoYXBwZW4uICovCisJaWYgKGNoaXBfaWR4ID09IEFYODgxNDApIHsKKwkJaWYgKChjc3IwICYgMHgzZjAwKSA9PSAwKQorCQkJY3NyMCB8PSAweDIwMDA7CisJfQorCisJLyogUE5JQyBkb2Vzbid0IGhhdmUgTVdJL01STC9NUk0uLi4gKi8KKwlpZiAoY2hpcF9pZHggPT0gTEM4MkMxNjgpCisJCWNzcjAgJj0gfjB4ZmZmMTAwMDA7IC8qIHplcm8gcmVzZXJ2ZWQgYml0cyAzMToyMCwgMTYgKi8KKworCS8qIERNOTEwMkEgaGFzIHRyb3VibGVzIHdpdGggTVJNICYgY2xlYXIgcmVzZXJ2ZWQgYml0cyAyNDoyMiwgMjAsIDE2LCA3OjEgKi8KKwlpZiAodHVsaXBfdWxpX2RtX3F1aXJrKHBkZXYpKSB7CisJCWNzcjAgJj0gfjB4MDFmMTAwZmY7CisjaWYgZGVmaW5lZChfX3NwYXJjX18pCisgICAgICAgICAgICAgICAgY3NyMCA9IChjc3IwICYgfjB4ZmYwMCkgfCAweGUwMDA7CisjZW5kaWYKKwl9CisJLyoKKwkgKglBbmQgYmFjayB0byBidXNpbmVzcworCSAqLworCisJaSA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYCisJCQkiQ2Fubm90IGVuYWJsZSB0dWxpcCBib2FyZCAjJWQsIGFib3J0aW5nXG4iLAorCQkJYm9hcmRfaWR4KTsKKwkJcmV0dXJuIGk7CisJfQorCisJaXJxID0gcGRldi0+aXJxOworCisJLyogYWxsb2NfZXRoZXJkZXYgZW5zdXJlcyBhbGlnbmVkIGFuZCB6ZXJvZWQgcHJpdmF0ZSBzdHJ1Y3R1cmVzICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYgKHNpemVvZiAoKnRwKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImV0aGVyIGRldmljZSBhbGxvYyBmYWlsZWQsIGFib3J0aW5nXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisJaWYgKHBjaV9yZXNvdXJjZV9sZW4gKHBkZXYsIDApIDwgdHVsaXBfdGJsW2NoaXBfaWR4XS5pb19zaXplKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICIlczogSS9PIHJlZ2lvbiAoMHglbHhAMHglbHgpIHRvbyBzbWFsbCwgIgorCQkJImFib3J0aW5nXG4iLCBwY2lfbmFtZShwZGV2KSwKKwkJCXBjaV9yZXNvdXJjZV9sZW4gKHBkZXYsIDApLAorCQkJcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKSk7CisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKwl9CisKKwkvKiBncmFiIGFsbCByZXNvdXJjZXMgZnJvbSBib3RoIFBJTyBhbmQgTU1JTyByZWdpb25zLCBhcyB3ZQorCSAqIGRvbid0IHdhbnQgYW55b25lIGVsc2UgbWVzc2luZyBhcm91bmQgd2l0aCBvdXIgaGFyZHdhcmUgKi8KKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyAocGRldiwgInR1bGlwIikpCisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKworI2lmbmRlZiBVU0VfSU9fT1BTCisJaW9hZGRyID0gIHBjaV9pb21hcChwZGV2LCAxLCB0dWxpcF90YmxbY2hpcF9pZHhdLmlvX3NpemUpOworI2Vsc2UKKwlpb2FkZHIgPSAgcGNpX2lvbWFwKHBkZXYsIDAsIHR1bGlwX3RibFtjaGlwX2lkeF0uaW9fc2l6ZSk7CisjZW5kaWYKKwlpZiAoIWlvYWRkcikKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUgKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmNoaXBfcmV2KTsKKworCS8qCisJICogaW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlICd0cCcKKwkgKiBpdCBpcyB6ZXJvZWQgYW5kIGFsaWduZWQgaW4gYWxsb2NfZXRoZXJkZXYKKwkgKi8KKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl0cC0+cnhfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgdHVsaXBfcnhfZGVzYykgKiBSWF9SSU5HX1NJWkUgKworCQkJCQkgICBzaXplb2Yoc3RydWN0IHR1bGlwX3R4X2Rlc2MpICogVFhfUklOR19TSVpFLAorCQkJCQkgICAmdHAtPnJ4X3JpbmdfZG1hKTsKKwlpZiAoIXRwLT5yeF9yaW5nKQorCQlnb3RvIGVycl9vdXRfbXRhYmxlOworCXRwLT50eF9yaW5nID0gKHN0cnVjdCB0dWxpcF90eF9kZXNjICopKHRwLT5yeF9yaW5nICsgUlhfUklOR19TSVpFKTsKKwl0cC0+dHhfcmluZ19kbWEgPSB0cC0+cnhfcmluZ19kbWEgKyBzaXplb2Yoc3RydWN0IHR1bGlwX3J4X2Rlc2MpICogUlhfUklOR19TSVpFOworCisJdHAtPmNoaXBfaWQgPSBjaGlwX2lkeDsKKwl0cC0+ZmxhZ3MgPSB0dWxpcF90YmxbY2hpcF9pZHhdLmZsYWdzOworCXRwLT5wZGV2ID0gcGRldjsKKwl0cC0+YmFzZV9hZGRyID0gaW9hZGRyOworCXRwLT5yZXZpc2lvbiA9IGNoaXBfcmV2OworCXRwLT5jc3IwID0gY3NyMDsKKwlzcGluX2xvY2tfaW5pdCgmdHAtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZ0cC0+bWlpX2xvY2spOworCWluaXRfdGltZXIoJnRwLT50aW1lcik7CisJdHAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJdHAtPnRpbWVyLmZ1bmN0aW9uID0gdHVsaXBfdGJsW3RwLT5jaGlwX2lkXS5tZWRpYV90aW1lcjsKKworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9hZGRyOworCisjaWZkZWYgQ09ORklHX1RVTElQX01XSQorCWlmICghZm9yY2VfY3NyMCAmJiAodHAtPmZsYWdzICYgSEFTX1BDSV9NV0kpKQorCQl0dWxpcF9td2lfY29uZmlnIChwZGV2LCBkZXYpOworI2Vsc2UKKwkvKiBNV0kgaXMgYnJva2VuIGZvciBEQzIxMTQzIHJldiA2NS4uLiAqLworCWlmIChjaGlwX2lkeCA9PSBEQzIxMTQzICYmIGNoaXBfcmV2ID09IDY1KQorCQl0cC0+Y3NyMCAmPSB+TVdJOworI2VuZGlmCisKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKwl0dWxpcF9zdG9wX3J4dHgodHApOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKyNpZmRlZiBDT05GSUdfR1NDCisJaWYgKHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9IUCkgeworCQlzd2l0Y2ggKHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpIHsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQljYXNlIDB4MTA2MToKKwkJY2FzZSAweDEwNjI6CisJCWNhc2UgMHgxMDYzOgorCQljYXNlIDB4MTA5ODoKKwkJY2FzZSAweDEwOTk6CisJCWNhc2UgMHgxMEVFOgorCQkJdHAtPmZsYWdzIHw9IEhBU19TV0FQUEVEX1NFRVBST00gfCBORUVEU19GQUtFX01FRElBX1RBQkxFOworCQkJY2hpcF9uYW1lID0gIkdTQyBEUzIxMTQwIFR1bGlwIjsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogQ2xlYXIgdGhlIG1pc3NlZC1wYWNrZXQgY291bnRlci4gKi8KKwlpb3JlYWQzMihpb2FkZHIgKyBDU1I4KTsKKworCS8qIFRoZSBzdGF0aW9uIGFkZHJlc3MgUk9NIGlzIHJlYWQgYnl0ZSBzZXJpYWxseS4gIFRoZSByZWdpc3RlciBtdXN0CisJICAgYmUgcG9sbGVkLCB3YWl0aW5nIGZvciB0aGUgdmFsdWUgdG8gYmUgcmVhZCBiaXQgc2VyaWFsbHkgZnJvbSB0aGUKKwkgICBFRVBST00uCisJICAgKi8KKwllZV9kYXRhID0gdHAtPmVlcHJvbTsKKwlzdW0gPSAwOworCWlmIChjaGlwX2lkeCA9PSBMQzgyQzE2OCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlpbnQgdmFsdWUsIGJvZ3VzY250ID0gMTAwMDAwOworCQkJaW93cml0ZTMyKDB4NjAwIHwgaSwgaW9hZGRyICsgMHg5OCk7CisJCQlkbworCQkJCXZhbHVlID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSOSk7CisJCQl3aGlsZSAodmFsdWUgPCAwICAmJiAtLWJvZ3VzY250ID4gMCk7CisJCQlwdXRfdW5hbGlnbmVkKGxlMTZfdG9fY3B1KHZhbHVlKSwgKCh1MTYqKWRldi0+ZGV2X2FkZHIpICsgaSk7CisJCQlzdW0gKz0gdmFsdWUgJiAweGZmZmY7CisJCX0KKwl9IGVsc2UgaWYgKGNoaXBfaWR4ID09IENPTUVUKSB7CisJCS8qIE5vIG5lZWQgdG8gcmVhZCB0aGUgRUVQUk9NLiAqLworCQlwdXRfdW5hbGlnbmVkKGNwdV90b19sZTMyKGlvcmVhZDMyKGlvYWRkciArIDB4QTQpKSwgKHUzMiAqKWRldi0+ZGV2X2FkZHIpOworCQlwdXRfdW5hbGlnbmVkKGNwdV90b19sZTE2KGlvcmVhZDMyKGlvYWRkciArIDB4QTgpKSwgKHUxNiAqKShkZXYtPmRldl9hZGRyICsgNCkpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSArKykKKwkJCXN1bSArPSBkZXYtPmRldl9hZGRyW2ldOworCX0gZWxzZSB7CisJCS8qIEEgc2VyaWFsIEVFUFJPTSBpbnRlcmZhY2UsIHdlIHJlYWQgbm93IGFuZCBzb3J0IGl0IG91dCBsYXRlci4gKi8KKwkJaW50IHNhX29mZnNldCA9IDA7CisJCWludCBlZV9hZGRyX3NpemUgPSB0dWxpcF9yZWFkX2VlcHJvbShkZXYsIDB4ZmYsIDgpICYgMHg0MDAwMCA/IDggOiA2OworCisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHAtPmVlcHJvbSk7IGkrPTIpIHsKKwkJCXUxNiBkYXRhID0gdHVsaXBfcmVhZF9lZXByb20oZGV2LCBpLzIsIGVlX2FkZHJfc2l6ZSk7CisJCQllZV9kYXRhW2ldID0gZGF0YSAmIDB4ZmY7CisJCQllZV9kYXRhW2kgKyAxXSA9IGRhdGEgPj4gODsKKwkJfQorCisJCS8qIERFQyBub3cgaGFzIGEgc3BlY2lmaWNhdGlvbiAoc2VlIE5vdGVzKSBidXQgZWFybHkgYm9hcmQgbWFrZXJzCisJCSAgIGp1c3QgcHV0IHRoZSBhZGRyZXNzIGluIHRoZSBmaXJzdCBFRVBST00gbG9jYXRpb25zLiAqLworCQkvKiBUaGlzIGRvZXMgIG1lbWNtcChlZV9kYXRhLCBlZV9kYXRhKzE2LCA4KSAqLworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSArKykKKwkJCWlmIChlZV9kYXRhW2ldICE9IGVlX2RhdGFbMTYraV0pCisJCQkJc2Ffb2Zmc2V0ID0gMjA7CisJCWlmIChjaGlwX2lkeCA9PSBDT05FWEFOVCkgeworCQkJLyogQ2hlY2sgdGhhdCB0aGUgdHVwbGUgdHlwZSBhbmQgbGVuZ3RoIGlzIGNvcnJlY3QuICovCisJCQlpZiAoZWVfZGF0YVsweDE5OF0gPT0gMHgwNCAgJiYgIGVlX2RhdGFbMHgxOTldID09IDYpCisJCQkJc2Ffb2Zmc2V0ID0gMHgxOUE7CisJCX0gZWxzZSBpZiAoZWVfZGF0YVswXSA9PSAweGZmICAmJiAgZWVfZGF0YVsxXSA9PSAweGZmICYmCisJCQkJICAgZWVfZGF0YVsyXSA9PSAwKSB7CisJCQlzYV9vZmZzZXQgPSAyOwkJLyogR3JyciwgZGFtbiBNYXRyb3ggYm9hcmRzLiAqLworCQkJbXVsdGlwb3J0X2NudCA9IDQ7CisJCX0KKyNpZmRlZiBDT05GSUdfRERCNTQ3NgorCQlpZiAoKHBkZXYtPmJ1cy0+bnVtYmVyID09IDApICYmIChQQ0lfU0xPVChwZGV2LT5kZXZmbikgPT0gNikpIHsKKwkJCS8qIEREQjU0NzYgTUFDIGFkZHJlc3MgaW4gZmlyc3QgRUVQUk9NIGxvY2F0aW9ucy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgc2Ffb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gbWVkaWEgdGFibGUgZWl0aGVyICovCisgICAgICAgICAgICAgICAgICAgICAgIHRwLT5mbGFncyAmPSB+SEFTX01FRElBX1RBQkxFOworICAgICAgICAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0REQjU0NzcKKyAgICAgICAgICAgICAgIGlmICgocGRldi0+YnVzLT5udW1iZXIgPT0gMCkgJiYgKFBDSV9TTE9UKHBkZXYtPmRldmZuKSA9PSA0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAvKiBEREI1NDc3IE1BQyBhZGRyZXNzIGluIGZpcnN0IEVFUFJPTSBsb2NhdGlvbnMuICovCisgICAgICAgICAgICAgICAgICAgICAgIHNhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIG1lZGlhIHRhYmxlIGVpdGhlciAqLworICAgICAgICAgICAgICAgICAgICAgICB0cC0+ZmxhZ3MgJj0gfkhBU19NRURJQV9UQUJMRTsKKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19NSVBTX0NPQkFMVAorICAgICAgICAgICAgICAgaWYgKChwZGV2LT5idXMtPm51bWJlciA9PSAwKSAmJiAKKyAgICAgICAgICAgICAgICAgICAoKFBDSV9TTE9UKHBkZXYtPmRldmZuKSA9PSA3KSB8fAorICAgICAgICAgICAgICAgICAgICAoUENJX1NMT1QocGRldi0+ZGV2Zm4pID09IDEyKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogQ29iYWx0IE1BQyBhZGRyZXNzIGluIGZpcnN0IEVFUFJPTSBsb2NhdGlvbnMuICovCisgICAgICAgICAgICAgICAgICAgICAgIHNhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIG1lZGlhIHRhYmxlIGVpdGhlciAqLworICAgICAgICAgICAgICAgICAgICAgICB0cC0+ZmxhZ3MgJj0gfkhBU19NRURJQV9UQUJMRTsKKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19HU0MKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBicm9rZW4gc3JvbSAqLworCQlpZiAoZWVfZGF0YVswXSA9PSAweDYxICYmIGVlX2RhdGFbMV0gPT0gMHgxMCkgeworCQkJLyogcGNpX3ZlbmRvcl9pZCBhbmQgc3Vic3lzdGVtX2lkIGFyZSBzd2FwcGVkICovCisJCQllZV9kYXRhWzBdID0gZWVfZGF0YVsyXTsKKwkJCWVlX2RhdGFbMV0gPSBlZV9kYXRhWzNdOworCQkJZWVfZGF0YVsyXSA9IDB4NjE7CisJCQllZV9kYXRhWzNdID0gMHgxMDsKKworCQkJLyogSFNDLVBDSSBib2FyZHMgbmVlZCB0byBiZSBieXRlLXN3YXBlZCBhbmQgc2hpZnRlZAorCQkJICogdXAgMSB3b3JkLiAgVGhpcyBzaGlmdCBuZWVkcyB0byBoYXBwZW4gYXQgdGhlIGVuZAorCQkJICogb2YgdGhlIE1BQyBmaXJzdCBiZWNhdXNlIG9mIHRoZSAyIGJ5dGUgb3ZlcmxhcC4KKwkJCSAqLworCQkJZm9yIChpID0gNDsgaSA+PSAwOyBpIC09IDIpIHsKKwkJCQllZV9kYXRhWzE3ICsgaSArIDNdID0gZWVfZGF0YVsxNyArIGldOworCQkJCWVlX2RhdGFbMTYgKyBpICsgNV0gPSBlZV9kYXRhWzE2ICsgaV07CisJCQl9CisJCX0KKyNlbmRpZgorCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpICsrKSB7CisJCQlkZXYtPmRldl9hZGRyW2ldID0gZWVfZGF0YVtpICsgc2Ffb2Zmc2V0XTsKKwkJCXN1bSArPSBlZV9kYXRhW2kgKyBzYV9vZmZzZXRdOworCQl9CisJfQorCS8qIExpdGUtT24gYm9hcmRzIGhhdmUgdGhlIGFkZHJlc3MgYnl0ZS1zd2FwcGVkLiAqLworCWlmICgoZGV2LT5kZXZfYWRkclswXSA9PSAweEEwICB8fCAgZGV2LT5kZXZfYWRkclswXSA9PSAweEMwIHx8IGRldi0+ZGV2X2FkZHJbMF0gPT0gMHgwMikKKwkJJiYgIGRldi0+ZGV2X2FkZHJbMV0gPT0gMHgwMCkKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrPTIpIHsKKwkJCWNoYXIgdG1wID0gZGV2LT5kZXZfYWRkcltpXTsKKwkJCWRldi0+ZGV2X2FkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2krMV07CisJCQlkZXYtPmRldl9hZGRyW2krMV0gPSB0bXA7CisJCX0KKwkvKiBPbiB0aGUgWnlueCAzMTUgRXRoZXJhcnJheSBhbmQgb3RoZXIgbXVsdGlwb3J0IGJvYXJkcyBvbmx5IHRoZQorCSAgIGZpcnN0IFR1bGlwIGhhcyBhbiBFRVBST00uCisJICAgT24gU3BhcmMgc3lzdGVtcyB0aGUgbWFjIGFkZHJlc3MgaXMgaGVsZCBpbiB0aGUgT0JQIHByb3BlcnR5CisJICAgImxvY2FsLW1hYy1hZGRyZXNzIi4KKwkgICBUaGUgYWRkcmVzc2VzIG9mIHRoZSBzdWJzZXF1ZW50IHBvcnRzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGZpcnN0LgorCSAgIE1hbnkgUENJIEJJT1NlcyBhbHNvIGluY29ycmVjdGx5IHJlcG9ydCB0aGUgSVJRIGxpbmUsIHNvIHdlIGNvcnJlY3QKKwkgICB0aGF0IGhlcmUgYXMgd2VsbC4gKi8KKwlpZiAoc3VtID09IDAgIHx8IHN1bSA9PSA2KjB4ZmYpIHsKKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykKKwkJc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7CisjZW5kaWYKKwkJZWVwcm9tX21pc3NpbmcgPSAxOworCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQkJZGV2LT5kZXZfYWRkcltpXSA9IGxhc3RfcGh5c19hZGRyW2ldOworCQlkZXYtPmRldl9hZGRyW2ldID0gbGFzdF9waHlzX2FkZHJbaV0gKyAxOworI2lmIGRlZmluZWQoX19zcGFyY19fKQorCQlpZiAoKHBjcCAhPSBOVUxMKSAmJiBwcm9tX2dldHByb3BsZW4ocGNwLT5wcm9tX25vZGUsCisJCQkibG9jYWwtbWFjLWFkZHJlc3MiKSA9PSA2KSB7CisJCQlwcm9tX2dldHByb3BlcnR5KHBjcC0+cHJvbV9ub2RlLCAibG9jYWwtbWFjLWFkZHJlc3MiLAorCQkJICAgIGRldi0+ZGV2X2FkZHIsIDYpOworCQl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQkJLyogUGF0Y2ggdXAgeDg2IEJJT1MgYnVnLiAqLworCQlpZiAobGFzdF9pcnEpCisJCQlpcnEgPSBsYXN0X2lycTsKKyNlbmRpZgorCX0KKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWxhc3RfcGh5c19hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKwlsYXN0X2lycSA9IGlycTsKKwlkZXYtPmlycSA9IGlycTsKKworCS8qIFRoZSBsb3dlciBmb3VyIGJpdHMgYXJlIHRoZSBtZWRpYSB0eXBlLiAqLworCWlmIChib2FyZF9pZHggPj0gMCAgJiYgIGJvYXJkX2lkeCA8IE1BWF9VTklUUykgeworCQlpZiAob3B0aW9uc1tib2FyZF9pZHhdICYgTUVESUFfTUFTSykKKwkJCXRwLT5kZWZhdWx0X3BvcnQgPSBvcHRpb25zW2JvYXJkX2lkeF0gJiBNRURJQV9NQVNLOworCQlpZiAoKG9wdGlvbnNbYm9hcmRfaWR4XSAmIEZ1bGxEdXBsZXgpIHx8IGZ1bGxfZHVwbGV4W2JvYXJkX2lkeF0gPiAwKQorCQkJdHAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJaWYgKG10dVtib2FyZF9pZHhdID4gMCkKKwkJCWRldi0+bXR1ID0gbXR1W2JvYXJkX2lkeF07CisJfQorCWlmIChkZXYtPm1lbV9zdGFydCAmIE1FRElBX01BU0spCisJCXRwLT5kZWZhdWx0X3BvcnQgPSBkZXYtPm1lbV9zdGFydCAmIE1FRElBX01BU0s7CisJaWYgKHRwLT5kZWZhdWx0X3BvcnQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidHVsaXAlZDogVHJhbnNjZWl2ZXIgc2VsZWN0aW9uIGZvcmNlZCB0byAlcy5cbiIsCisJCSAgICAgICBib2FyZF9pZHgsIG1lZGlhbmFtZVt0cC0+ZGVmYXVsdF9wb3J0ICYgTUVESUFfTUFTS10pOworCQl0cC0+bWVkaWFsb2NrID0gMTsKKwkJaWYgKHR1bGlwX21lZGlhX2NhcFt0cC0+ZGVmYXVsdF9wb3J0XSAmIE1lZGlhQWx3YXlzRkQpCisJCQl0cC0+ZnVsbF9kdXBsZXggPSAxOworCX0KKwlpZiAodHAtPmZ1bGxfZHVwbGV4KQorCQl0cC0+ZnVsbF9kdXBsZXhfbG9jayA9IDE7CisKKwlpZiAodHVsaXBfbWVkaWFfY2FwW3RwLT5kZWZhdWx0X3BvcnRdICYgTWVkaWFJc01JSSkgeworCQl1MTYgbWVkaWEyYWR2ZXJ0W10gPSB7IDB4MjAsIDB4NDAsIDB4MDNlMCwgMHg2MCwgMHg4MCwgMHgxMDAsIDB4MjAwIH07CisJCXRwLT5taWlfYWR2ZXJ0aXNlID0gbWVkaWEyYWR2ZXJ0W3RwLT5kZWZhdWx0X3BvcnQgLSA5XTsKKwkJdHAtPm1paV9hZHZlcnRpc2UgfD0gKHRwLT5mbGFncyAmIEhBU184MDIzWCk7IC8qIE1hdGNoaW5nIGJpdHMhICovCisJfQorCisJaWYgKHRwLT5mbGFncyAmIEhBU19NRURJQV9UQUJMRSkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgInR1bGlwJWQiLCBib2FyZF9pZHgpOwkvKiBoYWNrICovCisJCXR1bGlwX3BhcnNlX2VlcHJvbShkZXYpOworCQlzdHJjcHkoZGV2LT5uYW1lLCAiZXRoJWQiKTsJCQkvKiB1bi1oYWNrICovCisJfQorCisJaWYgKCh0cC0+ZmxhZ3MgJiBBTFdBWVNfQ0hFQ0tfTUlJKSB8fAorCQkodHAtPm10YWJsZSAgJiYgIHRwLT5tdGFibGUtPmhhc19taWkpIHx8CisJCSggISB0cC0+bXRhYmxlICAmJiAgKHRwLT5mbGFncyAmIEhBU19NSUkpKSkgeworCQlpZiAodHAtPm10YWJsZSAgJiYgIHRwLT5tdGFibGUtPmhhc19taWkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCB0cC0+bXRhYmxlLT5sZWFmY291bnQ7IGkrKykKKwkJCQlpZiAodHAtPm10YWJsZS0+bWxlYWZbaV0ubWVkaWEgPT0gMTEpIHsKKwkJCQkJdHAtPmN1cl9pbmRleCA9IGk7CisJCQkJCXRwLT5zYXZlZF9pZl9wb3J0ID0gZGV2LT5pZl9wb3J0OworCQkJCQl0dWxpcF9zZWxlY3RfbWVkaWEoZGV2LCAyKTsKKwkJCQkJZGV2LT5pZl9wb3J0ID0gdHAtPnNhdmVkX2lmX3BvcnQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJfQorCisJCS8qIEZpbmQgdGhlIGNvbm5lY3RlZCBNSUkgeGN2cnMuCisJCSAgIERvaW5nIHRoaXMgaW4gb3BlbigpIHdvdWxkIGFsbG93IGRldGVjdGluZyBleHRlcm5hbCB4Y3ZycworCQkgICBsYXRlciwgYnV0IHRha2VzIG11Y2ggdGltZS4gKi8KKwkJdHVsaXBfZmluZF9taWkgKGRldiwgYm9hcmRfaWR4KTsKKwl9CisKKwkvKiBUaGUgVHVsaXAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSB0dWxpcF9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gdHVsaXBfc3RhcnRfeG1pdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSB0dWxpcF90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJCisJZGV2LT5wb2xsID0gdHVsaXBfcG9sbDsKKwlkZXYtPndlaWdodCA9IDE2OworI2VuZGlmCisJZGV2LT5zdG9wID0gdHVsaXBfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSB0dWxpcF9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9IHByaXZhdGVfaW9jdGw7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gJnBvbGxfdHVsaXA7CisjZW5kaWYKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmb3BzKTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmluZzsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyByZXYgJWQgYXQgJXAsIiwKKwkgICAgICAgZGV2LT5uYW1lLCBjaGlwX25hbWUsIGNoaXBfcmV2LCBpb2FkZHIpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJaWYgKGVlcHJvbV9taXNzaW5nKQorCQlwcmludGsoIiBFRVBST00gbm90IHByZXNlbnQsIik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlYyUyLjJYIiwgaSA/ICc6JyA6ICcgJywgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIsIElSUSAlZC5cbiIsIGlycSk7CisKKyAgICAgICAgaWYgKHRwLT5jaGlwX2lkID09IFBOSUMyKQorCQl0cC0+bGlua19jaGFuZ2UgPSBwbmljMl9sbmtfY2hhbmdlOworCWVsc2UgaWYgKHRwLT5mbGFncyAmIEhBU19OV0FZKQorCQl0cC0+bGlua19jaGFuZ2UgPSB0MjExNDJfbG5rX2NoYW5nZTsKKwllbHNlIGlmICh0cC0+ZmxhZ3MgJiBIQVNfUE5JQ05XQVkpCisJCXRwLT5saW5rX2NoYW5nZSA9IHBuaWNfbG5rX2NoYW5nZTsKKworCS8qIFJlc2V0IHRoZSB4Y3ZyIGludGVyZmFjZSBhbmQgdHVybiBvbiBoZWFydGJlYXQuICovCisJc3dpdGNoIChjaGlwX2lkeCkgeworCWNhc2UgREMyMTE0MDoKKwljYXNlIERNOTEwWDoKKwljYXNlIFVMSTUyNlg6CisJZGVmYXVsdDoKKwkJaWYgKHRwLT5tdGFibGUpCisJCQlpb3dyaXRlMzIodHAtPm10YWJsZS0+Y3NyMTJkaXIgfCAweDEwMCwgaW9hZGRyICsgQ1NSMTIpOworCQlicmVhazsKKwljYXNlIERDMjExNDI6CisJCWlmICh0cC0+bWlpX2NudCAgfHwgIHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworCQkJaW93cml0ZTMyKGNzcjZfbWFza19kZWZzdGF0ZSwgaW9hZGRyICsgQ1NSNik7CisJCQlpb3dyaXRlMzIoMHgwMDAwLCBpb2FkZHIgKyBDU1IxMyk7CisJCQlpb3dyaXRlMzIoMHgwMDAwLCBpb2FkZHIgKyBDU1IxNCk7CisJCQlpb3dyaXRlMzIoY3NyNl9tYXNrX2hkY2FwLCBpb2FkZHIgKyBDU1I2KTsKKwkJfSBlbHNlCisJCQl0MjExNDJfc3RhcnRfbndheShkZXYpOworCQlicmVhazsKKwljYXNlIFBOSUMyOgorCSAgICAgICAgLyoganVzdCBkbyBhIHJlc2V0IGZvciBzYW5pdHkgc2FrZSAqLworCQlpb3dyaXRlMzIoMHgwMDAwLCBpb2FkZHIgKyBDU1IxMyk7CisJCWlvd3JpdGUzMigweDAwMDAsIGlvYWRkciArIENTUjE0KTsKKwkJYnJlYWs7CisJY2FzZSBMQzgyQzE2ODoKKwkJaWYgKCAhIHRwLT5taWlfY250KSB7CisJCQl0cC0+bndheSA9IDE7CisJCQl0cC0+bndheXNldCA9IDA7CisJCQlpb3dyaXRlMzIoY3NyNl90dG0gfCBjc3I2X2NhLCBpb2FkZHIgKyBDU1I2KTsKKwkJCWlvd3JpdGUzMigweDMwLCBpb2FkZHIgKyBDU1IxMik7CisJCQlpb3dyaXRlMzIoMHgwMDAxRjA3OCwgaW9hZGRyICsgQ1NSNik7CisJCQlpb3dyaXRlMzIoMHgwMjAxRjA3OCwgaW9hZGRyICsgQ1NSNik7IC8qIFR1cm4gb24gYXV0b25lZ290aWF0aW9uLiAqLworCQl9CisJCWJyZWFrOworCWNhc2UgTVg5ODcxMzoKKwljYXNlIENPTVBFWDk4ODE6CisJCWlvd3JpdGUzMigweDAwMDAwMDAwLCBpb2FkZHIgKyBDU1I2KTsKKwkJaW93cml0ZTMyKDB4MDAwNzExQzAsIGlvYWRkciArIENTUjE0KTsgLyogVHVybiBvbiBOV2F5LiAqLworCQlpb3dyaXRlMzIoMHgwMDAwMDAwMSwgaW9hZGRyICsgQ1NSMTMpOworCQlicmVhazsKKwljYXNlIE1YOTg3MTU6CisJY2FzZSBNWDk4NzI1OgorCQlpb3dyaXRlMzIoMHgwMWE4MDAwMCwgaW9hZGRyICsgQ1NSNik7CisJCWlvd3JpdGUzMigweEZGRkZGRkZGLCBpb2FkZHIgKyBDU1IxNCk7CisJCWlvd3JpdGUzMigweDAwMDAxMDAwLCBpb2FkZHIgKyBDU1IxMik7CisJCWJyZWFrOworCWNhc2UgQ09NRVQ6CisJCS8qIE5vIGluaXRpYWxpemF0aW9uIG5lY2Vzc2FyeS4gKi8KKwkJYnJlYWs7CisJfQorCisJLyogcHV0IHRoZSBjaGlwIGluIHNub296ZSBtb2RlIHVudGlsIG9wZW5lZCAqLworCXR1bGlwX3NldF9wb3dlcl9zdGF0ZSAodHAsIDAsIDEpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9yaW5nOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQgKHBkZXYsCisJCQkgICAgIHNpemVvZiAoc3RydWN0IHR1bGlwX3J4X2Rlc2MpICogUlhfUklOR19TSVpFICsKKwkJCSAgICAgc2l6ZW9mIChzdHJ1Y3QgdHVsaXBfdHhfZGVzYykgKiBUWF9SSU5HX1NJWkUsCisJCQkgICAgIHRwLT5yeF9yaW5nLCB0cC0+cnhfcmluZ19kbWEpOworCitlcnJfb3V0X210YWJsZToKKwlpZiAodHAtPm10YWJsZSkKKwkJa2ZyZWUgKHRwLT5tdGFibGUpOworCXBjaV9pb3VubWFwKHBkZXYsIGlvYWRkcik7CisKK2Vycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyAocGRldik7CisKK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJZnJlZV9uZXRkZXYgKGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IHR1bGlwX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkZXYgJiYgbmV0aWZfcnVubmluZyAoZGV2KSAmJiBuZXRpZl9kZXZpY2VfcHJlc2VudCAoZGV2KSkgeworCQluZXRpZl9kZXZpY2VfZGV0YWNoIChkZXYpOworCQl0dWxpcF9kb3duIChkZXYpOworCQkvKiBwY2lfcG93ZXJfb2ZmKHBkZXYsIC0xKTsgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB0dWxpcF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkZXYgJiYgbmV0aWZfcnVubmluZyAoZGV2KSAmJiAhbmV0aWZfZGV2aWNlX3ByZXNlbnQgKGRldikpIHsKKyNpZiAxCisJCXBjaV9lbmFibGVfZGV2aWNlIChwZGV2KTsKKyNlbmRpZgorCQkvKiBwY2lfcG93ZXJfb24ocGRldik7ICovCisJCXR1bGlwX3VwIChkZXYpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoIChkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB0dWxpcF9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJcGNpX2ZyZWVfY29uc2lzdGVudCAocGRldiwKKwkJCSAgICAgc2l6ZW9mIChzdHJ1Y3QgdHVsaXBfcnhfZGVzYykgKiBSWF9SSU5HX1NJWkUgKworCQkJICAgICBzaXplb2YgKHN0cnVjdCB0dWxpcF90eF9kZXNjKSAqIFRYX1JJTkdfU0laRSwKKwkJCSAgICAgdHAtPnJ4X3JpbmcsIHRwLT5yeF9yaW5nX2RtYSk7CisJaWYgKHRwLT5tdGFibGUpCisJCWtmcmVlICh0cC0+bXRhYmxlKTsKKwlwY2lfaW91bm1hcChwZGV2LCB0cC0+YmFzZV9hZGRyKTsKKwlmcmVlX25ldGRldiAoZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zIChwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEgKHBkZXYsIE5VTEwpOworCisJLyogcGNpX3Bvd2VyX29mZiAocGRldiwgLTEpOyAqLworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKy8qCisgKiBQb2xsaW5nICdpbnRlcnJ1cHQnIC0gdXNlZCBieSB0aGluZ3MgbGlrZSBuZXRjb25zb2xlIHRvIHNlbmQgc2ticworICogd2l0aG91dCBoYXZpbmcgdG8gcmUtZW5hYmxlIGludGVycnVwdHMuIEl0J3Mgbm90IGNhbGxlZCB3aGlsZQorICogdGhlIGludGVycnVwdCByb3V0aW5lIGlzIGV4ZWN1dGluZy4KKyAqLworCitzdGF0aWMgdm9pZCBwb2xsX3R1bGlwIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGRpc2FibGVfaXJxIGhlcmUgaXMgbm90IHZlcnkgbmljZSwgYnV0IHdpdGggdGhlIGxvY2tsZXNzCisJICAgaW50ZXJydXB0IGhhbmRsZXIgd2UgaGF2ZSBubyBvdGhlciBjaG9pY2UuICovCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXR1bGlwX2ludGVycnVwdCAoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHR1bGlwX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJPSB0dWxpcF9wY2lfdGJsLAorCS5wcm9iZQkJPSB0dWxpcF9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHR1bGlwX3JlbW92ZV9vbmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gdHVsaXBfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHR1bGlwX3Jlc3VtZSwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KK307CisKKworc3RhdGljIGludCBfX2luaXQgdHVsaXBfaW5pdCAodm9pZCkKK3sKKyNpZmRlZiBNT0RVTEUKKwlwcmludGsgKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKyNlbmRpZgorCisJLyogY29weSBtb2R1bGUgcGFybXMgaW50byBnbG9iYWxzICovCisJdHVsaXBfcnhfY29weWJyZWFrID0gcnhfY29weWJyZWFrOworCXR1bGlwX21heF9pbnRlcnJ1cHRfd29yayA9IG1heF9pbnRlcnJ1cHRfd29yazsKKworCS8qIHByb2JlIGZvciBhbmQgaW5pdCBib2FyZHMgKi8KKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0ICgmdHVsaXBfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgdHVsaXBfY2xlYW51cCAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZ0dWxpcF9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KHR1bGlwX2luaXQpOworbW9kdWxlX2V4aXQodHVsaXBfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2U2NGVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYwpAQCAtMCwwICsxLDE3MTYgQEAKKy8qIHdpbmJvbmQtODQwLmM6IEEgTGludXggUENJIG5ldHdvcmsgYWRhcHRlciBkZXZpY2UgZHJpdmVyLiAqLworLyoKKwlXcml0dGVuIDE5OTgtMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisJRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKwlhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJU3VwcG9ydCBhbmQgdXBkYXRlcyBhdmFpbGFibGUgYXQKKwlodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL2RyaXZlcnMuaHRtbAorCisJRG8gbm90IHJlbW92ZSB0aGUgY29weXJpZ2h0IGluZm9ybWF0aW9uLgorCURvIG5vdCBjaGFuZ2UgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gdW5sZXNzIGFuIGltcHJvdmVtZW50IGhhcyBiZWVuIG1hZGUuCisJTWVyZWx5IHJlbW92aW5nIG15IG5hbWUsIGFzIENvbXBleCBoYXMgZG9uZSBpbiB0aGUgcGFzdCwgZG9lcyBub3QgY291bnQKKwlhcyBhbiBpbXByb3ZlbWVudC4KKworCUNoYW5nZWxvZzoKKwkqIHBvcnRlZCB0byAyLjQKKwkJPz8/CisJKiBzcGluIGxvY2sgdXBkYXRlLCBtZW1vcnkgYmFycmllcnMsIG5ldyBzdHlsZSBkbWEgbWFwcGluZ3MKKwkJbGltaXQgZWFjaCB0eCBidWZmZXIgdG8gPCAxMDI0IGJ5dGVzCisJCXJlbW92ZSBEZXNjSW50ciBmcm9tIFJ4IGRlc2NyaXB0b3JzICh0aGF0J3MgYW4gVHggZmxhZykKKwkJcmVtb3ZlIG5leHQgcG9pbnRlciBmcm9tIFR4IGRlc2NyaXB0b3JzCisJCXN5bmNocm9uaXplIHR4X3FfYnl0ZXMKKwkJc29mdHdhcmUgcmVzZXQgaW4gdHhfdGltZW91dAorCQkJQ29weXJpZ2h0IChDKSAyMDAwIE1hbmZyZWQgU3ByYXVsCisJKiBmdXJ0aGVyIGNsZWFudXBzCisJCXBvd2VyIG1hbmFnZW1lbnQuCisJCXN1cHBvcnQgZm9yIGJpZyBlbmRpYW4gZGVzY3JpcHRvcnMKKwkJCUNvcHlyaWdodCAoQykgMjAwMSBNYW5mcmVkIFNwcmF1bAorICAJKiBldGh0b29sIHN1cHBvcnQgKGpnYXJ6aWspCisJKiBSZXBsYWNlIHNvbWUgTUlJLXJlbGF0ZWQgbWFnaWMgbnVtYmVycyB3aXRoIGNvbnN0YW50cyAoamdhcnppaykKKyAgCisJVE9ETzoKKwkqIGVuYWJsZSBwY2lfcG93ZXJfb2ZmCisJKiBXYWtlLU9uLUxBTgorKi8KKyAgCisjZGVmaW5lIERSVl9OQU1FCSJ3aW5ib25kLTg0MCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMDEtZCIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIk5vdi0xNy0yMDAxIgorCisKKy8qIEF1dG9tYXRpY2FsbHkgZXh0cmFjdGVkIGNvbmZpZ3VyYXRpb24gaW5mbzoKK3Byb2JlLWZ1bmM6IHdpbmJvbmQ4NDBfcHJvYmUKK2NvbmZpZy1pbjogdHJpc3RhdGUgJ1dpbmJvbmQgVzg5Yzg0MCBFdGhlcm5ldCBzdXBwb3J0JyBDT05GSUdfV0lOQk9ORF84NDAKKworYy1oZWxwLW5hbWU6IFdpbmJvbmQgVzg5Yzg0MCBQQ0kgRXRoZXJuZXQgc3VwcG9ydAorYy1oZWxwLXN5bWJvbDogQ09ORklHX1dJTkJPTkRfODQwCitjLWhlbHA6IFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgV2luYm9uZCBXODljODQwIGNoaXAuICBJdCBhbHNvIHdvcmtzIHdpdGgKK2MtaGVscDogdGhlIFRYOTg4MiBjaGlwIG9uIHRoZSBDb21wZXggUkwxMDAtQVRYIGJvYXJkLgorYy1oZWxwOiBNb3JlIHNwZWNpZmljIGluZm9ybWF0aW9uIGFuZCB1cGRhdGVzIGFyZSBhdmFpbGFibGUgZnJvbSAKK2MtaGVscDogaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay9kcml2ZXJzLmh0bWwKKyovCisKKy8qIFRoZSB1c2VyLWNvbmZpZ3VyYWJsZSB2YWx1ZXMuCisgICBUaGVzZSBtYXkgYmUgbW9kaWZpZWQgd2hlbiBhIGRyaXZlciBtb2R1bGUgaXMgbG9hZGVkLiovCisKK3N0YXRpYyBpbnQgZGVidWcgPSAxOwkJCS8qIDEgbm9ybWFsIG1lc3NhZ2VzLCAwIHF1aWV0IC4uIDcgdmVyYm9zZS4gKi8KK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gMjA7CisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIFJ4LWFsbC1tdWx0aWNhc3QpLgorICAgVGhlICc4NDAgdXNlcyBhIDY0IGVsZW1lbnQgaGFzaCB0YWJsZSBiYXNlZCBvbiB0aGUgRXRoZXJuZXQgQ1JDLiAgKi8KK3N0YXRpYyBpbnQgbXVsdGljYXN0X2ZpbHRlcl9saW1pdCA9IDMyOworCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWZyYW1lcyBzY2hlbWUuCisgICBTZXR0aW5nIHRvID4gMTUxOCBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuICovCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhazsKKworLyogVXNlZCB0byBwYXNzIHRoZSBtZWRpYSB0eXBlLCBldGMuCisgICBCb3RoICdvcHRpb25zW10nIGFuZCAnZnVsbF9kdXBsZXhbXScgc2hvdWxkIGV4aXN0IGZvciBkcml2ZXIKKyAgIGludGVyb3BlcmFiaWxpdHkuCisgICBUaGUgbWVkaWEgdHlwZSBpcyB1c3VhbGx5IHBhc3NlZCBpbiAnb3B0aW9uc1tdJy4KKyovCisjZGVmaW5lIE1BWF9VTklUUyA4CQkvKiBNb3JlIGFyZSBzdXBwb3J0ZWQsIGxpbWl0IG9ubHkgb24gb3B0aW9ucyAqLworc3RhdGljIGludCBvcHRpb25zW01BWF9VTklUU10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNldCBhdCBjb21waWxlIHRpbWUuICovCisKKy8qIEtlZXAgdGhlIHJpbmcgc2l6ZXMgYSBwb3dlciBvZiB0d28gZm9yIGNvbXBpbGUgZWZmaWNpZW5jeS4KKyAgIFRoZSBjb21waWxlciB3aWxsIGNvbnZlcnQgPHVuc2lnbmVkPiclJzwyXk4+IGludG8gYSBiaXQgbWFzay4KKyAgIE1ha2luZyB0aGUgVHggcmluZyB0b28gbGFyZ2UgZGVjcmVhc2VzIHRoZSBlZmZlY3RpdmVuZXNzIG9mIGNoYW5uZWwKKyAgIGJvbmRpbmcgYW5kIHBhY2tldCBwcmlvcml0eS4KKyAgIFRoZXJlIGFyZSBubyBpbGwgZWZmZWN0cyBmcm9tIHRvby1sYXJnZSByZWNlaXZlIHJpbmdzLiAqLworI2RlZmluZSBUWF9SSU5HX1NJWkUJMTYKKyNkZWZpbmUgVFhfUVVFVUVfTEVOCTEwCQkvKiBMaW1pdCByaW5nIGVudHJpZXMgYWN0dWFsbHkgdXNlZC4gICovCisjZGVmaW5lIFRYX1FVRVVFX0xFTl9SRVNUQVJUCTUKKyNkZWZpbmUgUlhfUklOR19TSVpFCTMyCisKKyNkZWZpbmUgVFhfQlVGTElNSVQJKDEwMjQtMTI4KQorCisvKiBUaGUgcHJlc3VtZWQgRklGTyBzaXplIGZvciB3b3JraW5nIGFyb3VuZCB0aGUgVHgtRklGTy1vdmVyZmxvdyBidWcuCisgICBUbyBhdm9pZCBvdmVyZmxvd2luZyB3ZSBkb24ndCBxdWV1ZSBhZ2FpbiB1bnRpbCB3ZSBoYXZlIHJvb20gZm9yIGEKKyAgIGZ1bGwtc2l6ZSBwYWNrZXQuCisgKi8KKyNkZWZpbmUgVFhfRklGT19TSVpFICgyMDQ4KQorI2RlZmluZSBUWF9CVUdfRklGT19MSU1JVCAoVFhfRklGT19TSVpFLTE1MTQtMTYpCisKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoMipIWikKKworI2RlZmluZSBQS1RfQlVGX1NaCQkxNTM2CQkJLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIuKi8KKworLyogSW5jbHVkZSBmaWxlcywgZGVzaWduZWQgdG8gc3VwcG9ydCBtb3N0IGtlcm5lbCB2ZXJzaW9ucyAyLjAuMCBhbmQgbGF0ZXIuICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkJLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKy8qIFRoZXNlIGlkZW50aWZ5IHRoZSBkcml2ZXIgYmFzZSB2ZXJzaW9uIGFuZCBtYXkgbm90IGJlIHJlbW92ZWQuICovCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgKDIuNCBwb3J0KSAiIERSVl9SRUxEQVRFICIgIERvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+XG4iCitLRVJOX0lORk8gIiAgaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay9kcml2ZXJzLmh0bWxcbiI7CisKK01PRFVMRV9BVVRIT1IoIkRvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIldpbmJvbmQgVzg5Yzg0MCBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXVsdGljYXN0X2ZpbHRlcl9saW1pdCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfaW50ZXJydXB0X3dvcmssICJ3aW5ib25kLTg0MCBtYXhpbXVtIGV2ZW50cyBoYW5kbGVkIHBlciBpbnRlcnJ1cHQiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJ3aW5ib25kLTg0MCBkZWJ1ZyBsZXZlbCAoMC02KSIpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICJ3aW5ib25kLTg0MCBjb3B5IGJyZWFrcG9pbnQgZm9yIGNvcHktb25seS10aW55LWZyYW1lcyIpOworTU9EVUxFX1BBUk1fREVTQyhtdWx0aWNhc3RfZmlsdGVyX2xpbWl0LCAid2luYm9uZC04NDAgbWF4aW11bSBudW1iZXIgb2YgZmlsdGVyZWQgbXVsdGljYXN0IGFkZHJlc3NlcyIpOworTU9EVUxFX1BBUk1fREVTQyhvcHRpb25zLCAid2luYm9uZC04NDA6IEJpdHMgMC0zOiBtZWRpYSB0eXBlLCBiaXQgMTc6IGZ1bGwgZHVwbGV4Iik7CitNT0RVTEVfUEFSTV9ERVNDKGZ1bGxfZHVwbGV4LCAid2luYm9uZC04NDAgZnVsbCBkdXBsZXggc2V0dGluZyhzKSAoMSkiKTsKKworLyoKKwkJCQlUaGVvcnkgb2YgT3BlcmF0aW9uCisKK0kuIEJvYXJkIENvbXBhdGliaWxpdHkKKworVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBXaW5ib25kIHc4OWM4NDAgY2hpcC4KKworSUkuIEJvYXJkLXNwZWNpZmljIHNldHRpbmdzCisKK05vbmUuCisKK0lJSS4gRHJpdmVyIG9wZXJhdGlvbgorCitUaGlzIGNoaXAgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBEaWdpdGFsIDIxKjQqICJUdWxpcCIgZmFtaWx5LiAgVGhlIGZpcnN0Cit0d2VsdmUgcmVnaXN0ZXJzIGFuZCB0aGUgZGVzY3JpcHRvciBmb3JtYXQgYXJlIG5lYXJseSBpZGVudGljYWwuICBSZWFkIGEKK1R1bGlwIG1hbnVhbCBmb3Igb3BlcmF0aW9uYWwgZGV0YWlscy4KKworQSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIG11bHRpY2FzdCBmaWx0ZXIgYW5kIHN0YXRpb24gYWRkcmVzcyBhcmUKK3N0b3JlZCBpbiByZWdpc3RlcnMgcmF0aGVyIHRoYW4gbG9hZGVkIHRocm91Z2ggYSBwc2V1ZG8tdHJhbnNtaXQgcGFja2V0LgorCitVbmxpa2UgdGhlIFR1bGlwLCB0cmFuc21pdCBidWZmZXJzIGFyZSBsaW1pdGVkIHRvIDFLQi4gIFRvIHRyYW5zbWl0IGEKK2Z1bGwtc2l6ZWQgcGFja2V0IHdlIG11c3QgdXNlIGJvdGggZGF0YSBidWZmZXJzIGluIGEgZGVzY3JpcHRvci4gIFRodXMgdGhlCitkcml2ZXIgdXNlcyByaW5nIG1vZGUgd2hlcmUgZGVzY3JpcHRvcnMgYXJlIGltcGxpY2l0bHkgc2VxdWVudGlhbCBpbiBtZW1vcnksCityYXRoZXIgdGhhbiB1c2luZyB0aGUgc2Vjb25kIGRlc2NyaXB0b3IgYWRkcmVzcyBhcyBhIGNoYWluIHBvaW50ZXIgdG8KK3N1YnNlcXVlbnQgZGVzY3JpcHRvcnMuCisKK0lWLiBOb3RlcworCitJZiB5b3UgYXJlIGdvaW5nIHRvIGFsbW9zdCBjbG9uZSBhIFR1bGlwLCB3aHkgbm90IGdvIGFsbCB0aGUgd2F5IGFuZCBhdm9pZAordGhlIG5lZWQgZm9yIGEgbmV3IGRyaXZlcj8KKworSVZiLiBSZWZlcmVuY2VzCisKK2h0dHA6Ly93d3cuc2N5bGQuY29tL2V4cGVydC8xMDBtYnBzLmh0bWwKK2h0dHA6Ly93d3cuc2N5bGQuY29tL2V4cGVydC9OV2F5Lmh0bWwKK2h0dHA6Ly93d3cud2luYm9uZC5jb20udHcvCisKK0lWYy4gRXJyYXRhCisKK0EgaG9ycmlibGUgYnVnIGV4aXN0cyBpbiB0aGUgdHJhbnNtaXQgRklGTy4gIEFwcGFyZW50bHkgdGhlIGNoaXAgZG9lc24ndAorY29ycmVjdGx5IGRldGVjdCBhIGZ1bGwgRklGTywgYW5kIHF1ZXVpbmcgbW9yZSB0aGFuIDIwNDggYnl0ZXMgbWF5IHJlc3VsdCBpbgorc2lsZW50IGRhdGEgY29ycnVwdGlvbi4KKworVGVzdCB3aXRoICdwaW5nIC1zIDEwMDAwJyBvbiBhIGZhc3QgY29tcHV0ZXIuCisKKyovCisKKwwKKworLyoKKyAgUENJIHByb2JlIHRhYmxlLgorKi8KK2VudW0gcGNpX2lkX2ZsYWdzX2JpdHMgeworICAgICAgICAvKiBTZXQgUENJIGNvbW1hbmQgcmVnaXN0ZXIgYml0cyBiZWZvcmUgY2FsbGluZyBwcm9iZTEoKS4gKi8KKyAgICAgICAgUENJX1VTRVNfSU89MSwgUENJX1VTRVNfTUVNPTIsIFBDSV9VU0VTX01BU1RFUj00LAorICAgICAgICAvKiBSZWFkIGFuZCBtYXAgdGhlIHNpbmdsZSBmb2xsb3dpbmcgUENJIEJBUi4gKi8KKyAgICAgICAgUENJX0FERFIwPTA8PDQsIFBDSV9BRERSMT0xPDw0LCBQQ0lfQUREUjI9Mjw8NCwgUENJX0FERFIzPTM8PDQsCisgICAgICAgIFBDSV9BRERSXzY0QklUUz0weDEwMCwgUENJX05PX0FDUElfV0FLRT0weDIwMCwgUENJX05PX01JTl9MQVRFTkNZPTB4NDAwLAorfTsKK2VudW0gY2hpcF9jYXBhYmlsaXR5X2ZsYWdzIHsKKwlDYW5IYXZlTUlJPTEsIEhhc0Jyb2tlblR4PTIsIEFsd2F5c0ZEWD00LCBGRFhPbk5vTUlJPTgsfTsKKyNpZmRlZiBVU0VfSU9fT1BTCisjZGVmaW5lIFc4NDBfRkxBR1MgKFBDSV9VU0VTX0lPIHwgUENJX0FERFIwIHwgUENJX1VTRVNfTUFTVEVSKQorI2Vsc2UKKyNkZWZpbmUgVzg0MF9GTEFHUyAoUENJX1VTRVNfTUVNIHwgUENJX0FERFIxIHwgUENJX1VTRVNfTUFTVEVSKQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3ODQwX3BjaV90YmxbXSA9IHsKKwl7IDB4MTA1MCwgMHgwODQwLCBQQ0lfQU5ZX0lELCAweDgxNTMsICAgICAwLCAwLCAwIH0sCisJeyAweDEwNTAsIDB4MDg0MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMSB9LAorCXsgMHgxMWY2LCAweDIwMTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDIgfSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdzg0MF9wY2lfdGJsKTsKKworc3RydWN0IHBjaV9pZF9pbmZvIHsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgICAgc3RydWN0IG1hdGNoX2luZm8geworICAgICAgICAgICAgICAgIGludCAgICAgcGNpLCBwY2lfbWFzaywgc3Vic3lzdGVtLCBzdWJzeXN0ZW1fbWFzazsKKyAgICAgICAgICAgICAgICBpbnQgcmV2aXNpb24sIHJldmlzaW9uX21hc2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgOCBiaXRzLiAqLworICAgICAgICB9IGlkOworICAgICAgICBlbnVtIHBjaV9pZF9mbGFnc19iaXRzIHBjaV9mbGFnczsKKyAgICAgICAgaW50IGlvX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZWRlZCBmb3IgSS9PIHJlZ2lvbiBjaGVjayBvciBpb3JlbWFwKCkuICovCisgICAgICAgIGludCBkcnZfZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEcml2ZXIgdXNlLCBpbnRlbmRlZCBhcyBjYXBhYmlsaXR5IGZsYWdzLiAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkX2luZm8gcGNpX2lkX3RibFtdID0geworCXsiV2luYm9uZCBXODljODQwIiwJCQkvKiBTb21ldGltZSBhIExldmVsLU9uZSBzd2l0Y2ggY2FyZC4gKi8KKwkgeyAweDA4NDAxMDUwLCAweGZmZmZmZmZmLCAweDgxNTMwMDAwLCAweGZmZmYwMDAwIH0sCisJIFc4NDBfRkxBR1MsIDEyOCwgQ2FuSGF2ZU1JSSB8IEhhc0Jyb2tlblR4IHwgRkRYT25Ob01JSX0sCisJeyJXaW5ib25kIFc4OWM4NDAiLCB7IDB4MDg0MDEwNTAsIDB4ZmZmZmZmZmYsIH0sCisJIFc4NDBfRkxBR1MsIDEyOCwgQ2FuSGF2ZU1JSSB8IEhhc0Jyb2tlblR4fSwKKwl7IkNvbXBleCBSTDEwMC1BVFgiLCB7IDB4MjAxMTExRjYsIDB4ZmZmZmZmZmYsfSwKKwkgVzg0MF9GTEFHUywgMTI4LCBDYW5IYXZlTUlJIHwgSGFzQnJva2VuVHh9LAorCXtOVUxMLH0sCQkJCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisKKy8qIFRoaXMgZHJpdmVyIHdhcyB3cml0dGVuIHRvIHVzZSBQQ0kgbWVtb3J5IHNwYWNlLCBob3dldmVyIHNvbWUgeDg2IHN5c3RlbXMKKyAgIHdvcmsgb25seSB3aXRoIEkvTyBzcGFjZSBhY2Nlc3Nlcy4gIFBhc3MgLURVU0VfSU9fT1BTIHRvIHVzZSBQQ0kgSS9PIHNwYWNlCisgICBhY2Nlc3NlcyBpbnN0ZWFkIG9mIG1lbW9yeSBzcGFjZS4gKi8KKworLyogT2Zmc2V0cyB0byB0aGUgQ29tbWFuZCBhbmQgU3RhdHVzIFJlZ2lzdGVycywgIkNTUnMiLgorICAgV2hpbGUgc2ltaWxhciB0byB0aGUgVHVsaXAsIHRoZXNlIHJlZ2lzdGVycyBhcmUgbG9uZ3dvcmQgYWxpZ25lZC4KKyAgIE5vdGU6IEl0J3Mgbm90IHVzZWZ1bCB0byBkZWZpbmUgc3ltYm9saWMgbmFtZXMgZm9yIGV2ZXJ5IHJlZ2lzdGVyIGJpdCBpbgorICAgdGhlIGRldmljZS4gIFRoZSBuYW1lIGNhbiBvbmx5IHBhcnRpYWxseSBkb2N1bWVudCB0aGUgc2VtYW50aWNzIGFuZCBtYWtlCisgICB0aGUgZHJpdmVyIGxvbmdlciBhbmQgbW9yZSBkaWZmaWN1bHQgdG8gcmVhZC4KKyovCitlbnVtIHc4NDBfb2Zmc2V0cyB7CisJUENJQnVzQ2ZnPTB4MDAsIFR4U3RhcnREZW1hbmQ9MHgwNCwgUnhTdGFydERlbWFuZD0weDA4LAorCVJ4UmluZ1B0cj0weDBDLCBUeFJpbmdQdHI9MHgxMCwKKwlJbnRyU3RhdHVzPTB4MTQsIE5ldHdvcmtDb25maWc9MHgxOCwgSW50ckVuYWJsZT0weDFDLAorCVJ4TWlzc2VkPTB4MjAsIEVFQ3RybD0weDI0LCBNSUlDdHJsPTB4MjQsIEJvb3RSb209MHgyOCwgR1BUaW1lcj0weDJDLAorCUN1clJ4RGVzY0FkZHI9MHgzMCwgQ3VyUnhCdWZBZGRyPTB4MzQsCQkJLyogRGVidWcgdXNlICovCisJTXVsdGljYXN0RmlsdGVyMD0weDM4LCBNdWx0aWNhc3RGaWx0ZXIxPTB4M0MsIFN0YXRpb25BZGRyPTB4NDAsCisJQ3VyVHhEZXNjQWRkcj0weDRDLCBDdXJUeEJ1ZkFkZHI9MHg1MCwKK307CisKKy8qIEJpdHMgaW4gdGhlIGludGVycnVwdCBzdGF0dXMvZW5hYmxlIHJlZ2lzdGVycy4gKi8KKy8qIFRoZSBiaXRzIGluIHRoZSBJbnRyIFN0YXR1cy9FbmFibGUgcmVnaXN0ZXJzLCBtb3N0bHkgaW50ZXJydXB0IHNvdXJjZXMuICovCitlbnVtIGludHJfc3RhdHVzX2JpdHMgeworCU5vcm1hbEludHI9MHgxMDAwMCwgQWJub3JtYWxJbnRyPTB4ODAwMCwKKwlJbnRyUENJRXJyPTB4MjAwMCwgVGltZXJJbnQ9MHg4MDAsCisJSW50clJ4RGllZD0weDEwMCwgUnhOb0J1Zj0weDgwLCBJbnRyUnhEb25lPTB4NDAsCisJVHhGSUZPVW5kZXJmbG93PTB4MjAsIFJ4RXJySW50cj0weDEwLAorCVR4SWRsZT0weDA0LCBJbnRyVHhTdG9wcGVkPTB4MDIsIEludHJUeERvbmU9MHgwMSwKK307CisKKy8qIEJpdHMgaW4gdGhlIE5ldHdvcmtDb25maWcgcmVnaXN0ZXIuICovCitlbnVtIHJ4X21vZGVfYml0cyB7CisJQWNjZXB0RXJyPTB4ODAsIEFjY2VwdFJ1bnQ9MHg0MCwKKwlBY2NlcHRCcm9hZGNhc3Q9MHgyMCwgQWNjZXB0TXVsdGljYXN0PTB4MTAsCisJQWNjZXB0QWxsUGh5cz0weDA4LCBBY2NlcHRNeVBoeXM9MHgwMiwKK307CisKK2VudW0gbWlpX3JlZ19iaXRzIHsKKwlNRElPX1NoaWZ0Q2xrPTB4MTAwMDAsIE1ESU9fRGF0YUluPTB4ODAwMDAsIE1ESU9fRGF0YU91dD0weDIwMDAwLAorCU1ESU9fRW5iT3V0cHV0PTB4NDAwMDAsIE1ESU9fRW5iSW4gPSAweDAwMDAwLAorfTsKKworLyogVGhlIFR1bGlwIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3Qgdzg0MF9yeF9kZXNjIHsKKwlzMzIgc3RhdHVzOworCXMzMiBsZW5ndGg7CisJdTMyIGJ1ZmZlcjE7CisJdTMyIGJ1ZmZlcjI7Cit9OworCitzdHJ1Y3Qgdzg0MF90eF9kZXNjIHsKKwlzMzIgc3RhdHVzOworCXMzMiBsZW5ndGg7CisJdTMyIGJ1ZmZlcjEsIGJ1ZmZlcjI7Cit9OworCisvKiBCaXRzIGluIG5ldHdvcmtfZGVzYy5zdGF0dXMgKi8KK2VudW0gZGVzY19zdGF0dXNfYml0cyB7CisJRGVzY093bj0weDgwMDAwMDAwLCBEZXNjRW5kUmluZz0weDAyMDAwMDAwLCBEZXNjVXNlTGluaz0weDAxMDAwMDAwLAorCURlc2NXaG9sZVBrdD0weDYwMDAwMDAwLCBEZXNjU3RhcnRQa3Q9MHgyMDAwMDAwMCwgRGVzY0VuZFBrdD0weDQwMDAwMDAwLAorCURlc2NJbnRyPTB4ODAwMDAwMDAsCit9OworCisjZGVmaW5lIE1JSV9DTlQJCTEgLyogd2luYm9uZCBvbmx5IHN1cHBvcnRzIG9uZSBNSUkgKi8KK3N0cnVjdCBuZXRkZXZfcHJpdmF0ZSB7CisJc3RydWN0IHc4NDBfcnhfZGVzYyAqcnhfcmluZzsKKwlkbWFfYWRkcl90CXJ4X2FkZHJbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgdzg0MF90eF9kZXNjICp0eF9yaW5nOworCWRtYV9hZGRyX3QJdHhfYWRkcltUWF9SSU5HX1NJWkVdOworCWRtYV9hZGRyX3QgcmluZ19kbWFfYWRkcjsKKwkvKiBUaGUgYWRkcmVzc2VzIG9mIHJlY2VpdmUtaW4tcGxhY2Ugc2tidWZmcy4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiogcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJLyogVGhlIHNhdmVkIGFkZHJlc3Mgb2YgYSBzZW50LWluLXBsYWNlIHBhY2tldC9idWZmZXIsIGZvciBsYXRlciBmcmVlKCkuICovCisJc3RydWN0IHNrX2J1ZmYqIHR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkvKiBNZWRpYSBtb25pdG9yaW5nIHRpbWVyLiAqLworCS8qIEZyZXF1ZW50bHkgdXNlZCB2YWx1ZXM6IGtlZXAgc29tZSBhZGphY2VudCBmb3IgY2FjaGUgZWZmZWN0LiAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQgY2hpcF9pZCwgZHJ2X2ZsYWdzOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCWludCBjc3I2OworCXN0cnVjdCB3ODQwX3J4X2Rlc2MgKnJ4X2hlYWRfZGVzYzsKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCBkaXJ0eV9yeDsJCS8qIFByb2R1Y2VyL2NvbnN1bWVyIHJpbmcgaW5kaWNlcyAqLworCXVuc2lnbmVkIGludCByeF9idWZfc3o7CQkJCS8qIEJhc2VkIG9uIE1UVStzbGFjay4gKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3R4LCBkaXJ0eV90eDsKKwl1bnNpZ25lZCBpbnQgdHhfcV9ieXRlczsKKwl1bnNpZ25lZCBpbnQgdHhfZnVsbDsJCQkJLyogVGhlIFR4IHF1ZXVlIGlzIGZ1bGwuICovCisJLyogTUlJIHRyYW5zY2VpdmVyIHNlY3Rpb24uICovCisJaW50IG1paV9jbnQ7CQkJCQkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisJdW5zaWduZWQgY2hhciBwaHlzW01JSV9DTlRdOwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMsIGJ1dCBvbmx5IHRoZSBmaXJzdCBpcyB1c2VkICovCisJdTMyIG1paTsKKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpX2lmOworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworfTsKKworc3RhdGljIGludCAgZWVwcm9tX3JlYWQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBsb2NhdGlvbik7CitzdGF0aWMgaW50ICBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworc3RhdGljIGludCAgbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICB1cGRhdGVfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5ldGRldl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgaW5pdF9yeHR4X3JpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZnJlZV9yeHR4X3JpbmdzKHN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnApOworc3RhdGljIHZvaWQgaW5pdF9yZWdpc3RlcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB0eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhbGxvY19yaW5nZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGZyZWVfcmluZ2Rlc2Moc3RydWN0IG5ldGRldl9wcml2YXRlICpucCk7CitzdGF0aWMgaW50ICBzdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBuZXRkZXZfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKTsKK3N0YXRpYyBpbnQgIG5ldGRldl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB1MzIgX19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworc3RhdGljIGludCAgbmV0ZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisMCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHc4NDBfcHJvYmUxIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wOworCXN0YXRpYyBpbnQgZmluZF9jbnQ7CisJaW50IGNoaXBfaWR4ID0gZW50LT5kcml2ZXJfZGF0YTsKKwlpbnQgaXJxOworCWludCBpLCBvcHRpb24gPSBmaW5kX2NudCA8IE1BWF9VTklUUyA/IG9wdGlvbnNbZmluZF9jbnRdIDogMDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwlpbnQgYmFyID0gMTsKKworCWkgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoaSkgcmV0dXJuIGk7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlycSA9IHBkZXYtPmlycTsKKworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsMHhGRkZGZmZmZikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2luYm9uZC04NDA6IERldmljZSAlcyBkaXNhYmxlZCBkdWUgdG8gRE1BIGxpbWl0YXRpb25zLlxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqbnApKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSkpCisJCWdvdG8gZXJyX291dF9uZXRkZXY7CisjaWZkZWYgVVNFX0lPX09QUworCWJhciA9IDA7CisjZW5kaWYKKwlpb2FkZHIgPSBwY2lfaW9tYXAocGRldiwgYmFyLCBwY2lfaWRfdGJsW2NoaXBfaWR4XS5pb19zaXplKTsKKwlpZiAoIWlvYWRkcikKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJKCh1MTYgKilkZXYtPmRldl9hZGRyKVtpXSA9IGxlMTZfdG9fY3B1KGVlcHJvbV9yZWFkKGlvYWRkciwgaSkpOworCisJLyogUmVzZXQgdGhlIGNoaXAgdG8gZXJhc2UgcHJldmlvdXMgbWlzY29uZmlndXJhdGlvbi4KKwkgICBObyBob2xkIHRpbWUgcmVxdWlyZWQhICovCisJaW93cml0ZTMyKDB4MDAwMDAwMDEsIGlvYWRkciArIFBDSUJ1c0NmZyk7CisKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKworCW5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlucC0+cGNpX2RldiA9IHBkZXY7CisJbnAtPmNoaXBfaWQgPSBjaGlwX2lkeDsKKwlucC0+ZHJ2X2ZsYWdzID0gcGNpX2lkX3RibFtjaGlwX2lkeF0uZHJ2X2ZsYWdzOworCXNwaW5fbG9ja19pbml0KCZucC0+bG9jayk7CisJbnAtPm1paV9pZi5kZXYgPSBkZXY7CisJbnAtPm1paV9pZi5tZGlvX3JlYWQgPSBtZGlvX3JlYWQ7CisJbnAtPm1paV9pZi5tZGlvX3dyaXRlID0gbWRpb193cml0ZTsKKwlucC0+YmFzZV9hZGRyID0gaW9hZGRyOworCQorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJaWYgKGRldi0+bWVtX3N0YXJ0KQorCQlvcHRpb24gPSBkZXYtPm1lbV9zdGFydDsKKworCS8qIFRoZSBsb3dlciBmb3VyIGJpdHMgYXJlIHRoZSBtZWRpYSB0eXBlLiAqLworCWlmIChvcHRpb24gPiAwKSB7CisJCWlmIChvcHRpb24gJiAweDIwMCkKKwkJCW5wLT5taWlfaWYuZnVsbF9kdXBsZXggPSAxOworCQlpZiAob3B0aW9uICYgMTUpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogaWdub3JpbmcgdXNlciBzdXBwbGllZCBtZWRpYSB0eXBlICVkIiwKKwkJCQlkZXYtPm5hbWUsIG9wdGlvbiAmIDE1KTsKKwl9CisJaWYgKGZpbmRfY250IDwgTUFYX1VOSVRTICAmJiAgZnVsbF9kdXBsZXhbZmluZF9jbnRdID4gMCkKKwkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7CisKKwlpZiAobnAtPm1paV9pZi5mdWxsX2R1cGxleCkKKwkJbnAtPm1paV9pZi5mb3JjZV9tZWRpYSA9IDE7CisKKwkvKiBUaGUgY2hpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZuZXRkZXZfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzdGFydF90eDsKKwlkZXYtPnN0b3AgPSAmbmV0ZGV2X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJmdldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKwlkZXYtPmRvX2lvY3RsID0gJm5ldGRldl9pb2N0bDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKworCWkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoaSkKKwkJZ290byBlcnJfb3V0X2NsZWFyZGV2OworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0ICVwLCAiLAorCQkgICBkZXYtPm5hbWUsIHBjaV9pZF90YmxbY2hpcF9pZHhdLm5hbWUsIGlvYWRkcik7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIlMi4yeCwgSVJRICVkLlxuIiwgZGV2LT5kZXZfYWRkcltpXSwgaXJxKTsKKworCWlmIChucC0+ZHJ2X2ZsYWdzICYgQ2FuSGF2ZU1JSSkgeworCQlpbnQgcGh5LCBwaHlfaWR4ID0gMDsKKwkJZm9yIChwaHkgPSAxOyBwaHkgPCAzMiAmJiBwaHlfaWR4IDwgTUlJX0NOVDsgcGh5KyspIHsKKwkJCWludCBtaWlfc3RhdHVzID0gbWRpb19yZWFkKGRldiwgcGh5LCBNSUlfQk1TUik7CisJCQlpZiAobWlpX3N0YXR1cyAhPSAweGZmZmYgICYmICBtaWlfc3RhdHVzICE9IDB4MDAwMCkgeworCQkJCW5wLT5waHlzW3BoeV9pZHgrK10gPSBwaHk7CisJCQkJbnAtPm1paV9pZi5hZHZlcnRpc2luZyA9IG1kaW9fcmVhZChkZXYsIHBoeSwgTUlJX0FEVkVSVElTRSk7CisJCQkJbnAtPm1paSA9IChtZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9QSFlTSUQxKSA8PCAxNikrCisJCQkJCQltZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9QSFlTSUQyKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTUlJIFBIWSAlOC44eGggZm91bmQgYXQgYWRkcmVzcyAlZCwgc3RhdHVzICIKKwkJCQkJICAgIjB4JTQuNHggYWR2ZXJ0aXNpbmcgJTQuNHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIG5wLT5taWksIHBoeSwgbWlpX3N0YXR1cywgbnAtPm1paV9pZi5hZHZlcnRpc2luZyk7CisJCQl9CisJCX0KKwkJbnAtPm1paV9jbnQgPSBwaHlfaWR4OworCQlucC0+bWlpX2lmLnBoeV9pZCA9IG5wLT5waHlzWzBdOworCQlpZiAocGh5X2lkeCA9PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1JSSBQSFkgbm90IGZvdW5kIC0tIHRoaXMgZGV2aWNlIG1heSAiCisJCQkJCSAgICJub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuXG4iLCBkZXYtPm5hbWUpOworCQl9CisJfQorCisJZmluZF9jbnQrKzsKKwlyZXR1cm4gMDsKKworZXJyX291dF9jbGVhcmRldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcGNpX2lvdW5tYXAocGRldiwgaW9hZGRyKTsKK2Vycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXRfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2IChkZXYpOworCXJldHVybiAtRU5PREVWOworfQorCisMCisvKiBSZWFkIHRoZSBFRVBST00gYW5kIE1JSSBNYW5hZ2VtZW50IERhdGEgSS9PIChNRElPKSBpbnRlcmZhY2VzLiAgVGhlc2UgYXJlCisgICBvZnRlbiBzZXJpYWwgYml0IHN0cmVhbXMgZ2VuZXJhdGVkIGJ5IHRoZSBob3N0IHByb2Nlc3Nvci4KKyAgIFRoZSBleGFtcGxlIGJlbG93IGlzIGZvciB0aGUgY29tbW9uIDkzYzQ2IEVFUFJPTSwgNjQgMTYgYml0IHdvcmRzLiAqLworCisvKiBEZWxheSBiZXR3ZWVuIEVFUFJPTSBjbG9jayB0cmFuc2l0aW9ucy4KKyAgIE5vIGV4dHJhIGRlbGF5IGlzIG5lZWRlZCB3aXRoIDMzTWh6IFBDSSwgYnV0IGZ1dHVyZSA2Nk1oeiBhY2Nlc3MgbWF5IG5lZWQKKyAgIGEgZGVsYXkuICBOb3RlIHRoYXQgcHJlLTIuMC4zNCBrZXJuZWxzIGhhZCBhIGNhY2hlLWFsaWdubWVudCBidWcgdGhhdAorICAgbWFkZSB1ZGVsYXkoKSB1bnJlbGlhYmxlLgorICAgVGhlIG9sZCBtZXRob2Qgb2YgdXNpbmcgYW4gSVNBIGFjY2VzcyBhcyBhIGRlbGF5LCBfX1NMT1dfRE9XTl9JT19fLCBpcworICAgZGVwcmljYXRlZC4KKyovCisjZGVmaW5lIGVlcHJvbV9kZWxheShlZV9hZGRyKQlpb3JlYWQzMihlZV9hZGRyKQorCitlbnVtIEVFUFJPTV9DdHJsX0JpdHMgeworCUVFX1NoaWZ0Q2xrPTB4MDIsIEVFX1dyaXRlMD0weDgwMSwgRUVfV3JpdGUxPTB4ODA1LAorCUVFX0NoaXBTZWxlY3Q9MHg4MDEsIEVFX0RhdGFJbj0weDA4LAorfTsKKworLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCitlbnVtIEVFUFJPTV9DbWRzIHsKKwlFRV9Xcml0ZUNtZD0oNSA8PCA2KSwgRUVfUmVhZENtZD0oNiA8PCA2KSwgRUVfRXJhc2VDbWQ9KDcgPDwgNiksCit9OworCitzdGF0aWMgaW50IGVlcHJvbV9yZWFkKHZvaWQgX19pb21lbSAqYWRkciwgaW50IGxvY2F0aW9uKQoreworCWludCBpOworCWludCByZXR2YWwgPSAwOworCXZvaWQgX19pb21lbSAqZWVfYWRkciA9IGFkZHIgKyBFRUN0cmw7CisJaW50IHJlYWRfY21kID0gbG9jYXRpb24gfCBFRV9SZWFkQ21kOworCWlvd3JpdGUzMihFRV9DaGlwU2VsZWN0LCBlZV9hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMTA7IGkgPj0gMDsgaS0tKSB7CisJCXNob3J0IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRV9Xcml0ZTEgOiBFRV9Xcml0ZTA7CisJCWlvd3JpdGUzMihkYXRhdmFsLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOworCQlpb3dyaXRlMzIoZGF0YXZhbCB8IEVFX1NoaWZ0Q2xrLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOworCX0KKwlpb3dyaXRlMzIoRUVfQ2hpcFNlbGVjdCwgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOworCisJZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwkJaW93cml0ZTMyKEVFX0NoaXBTZWxlY3QgfCBFRV9TaGlmdENsaywgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW9yZWFkMzIoZWVfYWRkcikgJiBFRV9EYXRhSW4pID8gMSA6IDApOworCQlpb3dyaXRlMzIoRUVfQ2hpcFNlbGVjdCwgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKKwl9CisKKwkvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisJaW93cml0ZTMyKDAsIGVlX2FkZHIpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qICBNSUkgdHJhbnNjZWl2ZXIgY29udHJvbCBzZWN0aW9uLgorCVJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKwlNRElPIHByb3RvY29sLiAgU2VlIHRoZSBNSUkgc3BlY2lmaWNhdGlvbnMgb3IgRFA4Mzg0MEEgZGF0YSBzaGVldAorCWZvciBkZXRhaWxzLgorCisJVGhlIG1heGltdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICBUaGUgbWluaW11bSB0aW1pbmcgaXMgdXN1YWxseQorCW1ldCBieSBiYWNrLXRvLWJhY2sgMzNNaHogUENJIGN5Y2xlcy4gKi8KKyNkZWZpbmUgbWRpb19kZWxheShtZGlvX2FkZHIpIGlvcmVhZDMyKG1kaW9fYWRkcikKKworLyogU2V0IGlmZiBhIE1JSSB0cmFuc2NlaXZlciBvbiBhbnkgaW50ZXJmYWNlIHJlcXVpcmVzIG1kaW8gcHJlYW1ibGUuCisgICBUaGlzIG9ubHkgc2V0IHdpdGggb2xkZXIgdHJhbnNjZWl2ZXJzLCBzbyB0aGUgZXh0cmEKKyAgIGNvZGUgc2l6ZSBvZiBhIHBlci1pbnRlcmZhY2UgZmxhZyBpcyBub3Qgd29ydGh3aGlsZS4gKi8KK3N0YXRpYyBjaGFyIG1paV9wcmVhbWJsZV9yZXF1aXJlZCA9IDE7CisKKyNkZWZpbmUgTURJT19XUklURTAgKE1ESU9fRW5iT3V0cHV0KQorI2RlZmluZSBNRElPX1dSSVRFMSAoTURJT19EYXRhT3V0IHwgTURJT19FbmJPdXRwdXQpCisKKy8qIEdlbmVyYXRlIHRoZSBwcmVhbWJsZSByZXF1aXJlZCBmb3IgaW5pdGlhbCBzeW5jaHJvbml6YXRpb24gYW5kCisgICBhIGZldyBvbGRlciB0cmFuc2NlaXZlcnMuICovCitzdGF0aWMgdm9pZCBtZGlvX3N5bmModm9pZCBfX2lvbWVtICptZGlvX2FkZHIpCit7CisJaW50IGJpdHMgPSAzMjsKKworCS8qIEVzdGFibGlzaCBzeW5jIGJ5IHNlbmRpbmcgYXQgbGVhc3QgMzIgbG9naWMgb25lcy4gKi8KKwl3aGlsZSAoLS1iaXRzID49IDApIHsKKwkJaW93cml0ZTMyKE1ESU9fV1JJVEUxLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KG1kaW9fYWRkcik7CisJCWlvd3JpdGUzMihNRElPX1dSSVRFMSB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkobWRpb19hZGRyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKm1kaW9fYWRkciA9IG5wLT5iYXNlX2FkZHIgKyBNSUlDdHJsOworCWludCBtaWlfY21kID0gKDB4ZjYgPDwgMTApIHwgKHBoeV9pZCA8PCA1KSB8IGxvY2F0aW9uOworCWludCBpLCByZXR2YWwgPSAwOworCisJaWYgKG1paV9wcmVhbWJsZV9yZXF1aXJlZCkKKwkJbWRpb19zeW5jKG1kaW9fYWRkcik7CisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChtaWlfY21kICYgKDEgPDwgaSkpID8gTURJT19XUklURTEgOiBNRElPX1dSSVRFMDsKKworCQlpb3dyaXRlMzIoZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCQlpb3dyaXRlMzIoZGF0YXZhbCB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkobWRpb19hZGRyKTsKKwl9CisJLyogUmVhZCB0aGUgdHdvIHRyYW5zaXRpb24sIDE2IGRhdGEsIGFuZCB3aXJlLWlkbGUgYml0cy4gKi8KKwlmb3IgKGkgPSAyMDsgaSA+IDA7IGktLSkgeworCQlpb3dyaXRlMzIoTURJT19FbmJJbiwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpb3JlYWQzMihtZGlvX2FkZHIpICYgTURJT19EYXRhSW4pID8gMSA6IDApOworCQlpb3dyaXRlMzIoTURJT19FbmJJbiB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkobWRpb19hZGRyKTsKKwl9CisJcmV0dXJuIChyZXR2YWw+PjEpICYgMHhmZmZmOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqbWRpb19hZGRyID0gbnAtPmJhc2VfYWRkciArIE1JSUN0cmw7CisJaW50IG1paV9jbWQgPSAoMHg1MDAyIDw8IDE2KSB8IChwaHlfaWQgPDwgMjMpIHwgKGxvY2F0aW9uPDwxOCkgfCB2YWx1ZTsKKwlpbnQgaTsKKworCWlmIChsb2NhdGlvbiA9PSA0ICAmJiAgcGh5X2lkID09IG5wLT5waHlzWzBdKQorCQlucC0+bWlpX2lmLmFkdmVydGlzaW5nID0gdmFsdWU7CisKKwlpZiAobWlpX3ByZWFtYmxlX3JlcXVpcmVkKQorCQltZGlvX3N5bmMobWRpb19hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChtaWlfY21kICYgKDEgPDwgaSkpID8gTURJT19XUklURTEgOiBNRElPX1dSSVRFMDsKKworCQlpb3dyaXRlMzIoZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCQlpb3dyaXRlMzIoZGF0YXZhbCB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkobWRpb19hZGRyKTsKKwl9CisJLyogQ2xlYXIgb3V0IGV4dHJhIGJpdHMuICovCisJZm9yIChpID0gMjsgaSA+IDA7IGktLSkgeworCQlpb3dyaXRlMzIoTURJT19FbmJJbiwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCQlpb3dyaXRlMzIoTURJT19FbmJJbiB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkobWRpb19hZGRyKTsKKwl9CisJcmV0dXJuOworfQorCisMCitzdGF0aWMgaW50IG5ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZV9hZGRyOworCWludCBpOworCisJaW93cml0ZTMyKDB4MDAwMDAwMDEsIGlvYWRkciArIFBDSUJ1c0NmZyk7CQkvKiBSZXNldCAqLworCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCWkgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJmludHJfaGFuZGxlciwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoaSkKKwkJZ290byBvdXRfZXJyOworCisJaWYgKGRlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3ODljODQwX29wZW4oKSBpcnEgJWQuXG4iLAorCQkJICAgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisKKwlpZigoaT1hbGxvY19yaW5nZGVzYyhkZXYpKSkKKwkJZ290byBvdXRfZXJyOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwlpbml0X3JlZ2lzdGVycyhkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlpZiAoZGVidWcgPiAyKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgbmV0ZGV2X29wZW4oKS5cbiIsIGRldi0+bmFtZSk7CisKKwkvKiBTZXQgdGhlIHRpbWVyIHRvIGNoZWNrIGZvciBsaW5rIGJlYXQuICovCisJaW5pdF90aW1lcigmbnAtPnRpbWVyKTsKKwlucC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxKkhaOworCW5wLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCW5wLT50aW1lci5mdW5jdGlvbiA9ICZuZXRkZXZfdGltZXI7CQkJCS8qIHRpbWVyIGhhbmRsZXIgKi8KKwlhZGRfdGltZXIoJm5wLT50aW1lcik7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwlyZXR1cm4gaTsKK30KKworI2RlZmluZSBNSUlfREFWSUNPTV9ETTkxMDEJMHgwMTgxYjgwMAorCitzdGF0aWMgaW50IHVwZGF0ZV9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGR1cGxleCwgZmFzdGV0aCwgcmVzdWx0LCBtaWlfcmVnOworCisJLyogQlNNUiAqLworCW1paV9yZWcgPSBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgTUlJX0JNU1IpOworCisJaWYgKG1paV9yZWcgPT0gMHhmZmZmKQorCQlyZXR1cm4gbnAtPmNzcjY7CisJLyogcmVyZWFkOiB0aGUgbGluayBzdGF0dXMgYml0IGlzIHN0aWNreSAqLworCW1paV9yZWcgPSBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgTUlJX0JNU1IpOworCWlmICghKG1paV9yZWcgJiAweDQpKSB7CisJCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKKwkJCWlmIChkZWJ1ZykKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTUlJICMlZCByZXBvcnRzIG5vIGxpbmsuIERpc2FibGluZyB3YXRjaGRvZy5cbiIsCisJCQkJCWRldi0+bmFtZSwgbnAtPnBoeXNbMF0pOworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJfQorCQlyZXR1cm4gbnAtPmNzcjY7CisJfQorCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCWlmIChkZWJ1ZykKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNSUkgIyVkIGxpbmsgaXMgYmFjay4gRW5hYmxpbmcgd2F0Y2hkb2cuXG4iLAorCQkJCWRldi0+bmFtZSwgbnAtPnBoeXNbMF0pOworCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJfQorCQorCWlmICgobnAtPm1paSAmIH4weGYpID09IE1JSV9EQVZJQ09NX0RNOTEwMSkgeworCQkvKiBJZiB0aGUgbGluayBwYXJ0bmVyIGRvZXNuJ3Qgc3VwcG9ydCBhdXRvbmVnb3RpYXRpb24KKwkJICogdGhlIE1JSSBkZXRlY3RzIGl0J3MgYWJpbGl0aWVzIHdpdGggdGhlICJwYXJhbGxlbCBkZXRlY3Rpb24iLgorCQkgKiBTb21lIE1JSXMgdXBkYXRlIHRoZSBMUEEgcmVnaXN0ZXIgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcGFyYWxsZWwKKwkJICogZGV0ZWN0aW9uLCBzb21lIGRvbid0LgorCQkgKiBUaGUgRGF2aWNvbSBQSFkgW2F0IGxlYXN0IDAxODFiODAwXSBkb2Vzbid0LgorCQkgKiBJbnN0ZWFkIGJpdCA5IGFuZCAxMyBvZiB0aGUgQk1DUiBhcmUgdXBkYXRlZCB0byB0aGUgcmVzdWx0CisJCSAqIG9mIHRoZSBuZWdvdGlhdGlvbi4uCisJCSAqLworCQltaWlfcmVnID0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTUNSKTsKKwkJZHVwbGV4ID0gbWlpX3JlZyAmIEJNQ1JfRlVMTERQTFg7CisJCWZhc3RldGggPSBtaWlfcmVnICYgQk1DUl9TUEVFRDEwMDsKKwl9IGVsc2UgeworCQlpbnQgbmVnb3RpYXRlZDsKKwkJbWlpX3JlZwk9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlfTFBBKTsKKwkJbmVnb3RpYXRlZCA9IG1paV9yZWcgJiBucC0+bWlpX2lmLmFkdmVydGlzaW5nOworCisJCWR1cGxleCA9IChuZWdvdGlhdGVkICYgTFBBXzEwMEZVTEwpIHx8ICgobmVnb3RpYXRlZCAmIDB4MDJDMCkgPT0gTFBBXzEwRlVMTCk7CisJCWZhc3RldGggPSBuZWdvdGlhdGVkICYgMHgzODA7CisJfQorCWR1cGxleCB8PSBucC0+bWlpX2lmLmZvcmNlX21lZGlhOworCS8qIHJlbW92ZSBmYXN0ZXRoZXIgYW5kIGZ1bGxkdXBsZXggKi8KKwlyZXN1bHQgPSBucC0+Y3NyNiAmIH4weDIwMDAwMjAwOworCWlmIChkdXBsZXgpCisJCXJlc3VsdCB8PSAweDIwMDsKKwlpZiAoZmFzdGV0aCkKKwkJcmVzdWx0IHw9IDB4MjAwMDAwMDA7CisJaWYgKHJlc3VsdCAhPSBucC0+Y3NyNiAmJiBkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNldHRpbmcgJWRNQml0LSVzLWR1cGxleCBiYXNlZCBvbiBNSUkjJWRcbiIsCisJCQkJIGRldi0+bmFtZSwgZmFzdGV0aCA/IDEwMCA6IDEwLCAKKwkJCSAgIAlkdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIsIG5wLT5waHlzWzBdKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisjZGVmaW5lIFJYVFhfVElNRU9VVAkyMDAwCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2NzcjYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ldykKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlX2FkZHI7CisJaW50IGxpbWl0ID0gUlhUWF9USU1FT1VUOworCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQluZXcgPSAwOworCWlmIChuZXc9PW5wLT5jc3I2KQorCQlyZXR1cm47CisJLyogc3RvcCBib3RoIFR4IGFuZCBSeCBwcm9jZXNzZXMgKi8KKwlpb3dyaXRlMzIobnAtPmNzcjYgJiB+MHgyMDAyLCBpb2FkZHIgKyBOZXR3b3JrQ29uZmlnKTsKKwkvKiB3YWl0IHVudGlsIHRoZXkgaGF2ZSByZWFsbHkgc3RvcHBlZCAqLworCWZvciAoOzspIHsKKwkJaW50IGNzcjUgPSBpb3JlYWQzMihpb2FkZHIgKyBJbnRyU3RhdHVzKTsKKwkJaW50IHQ7CisKKwkJdCA9IChjc3I1ID4+IDE3KSAmIDB4MDc7CisJCWlmICh0PT0wfHx0PT0xKSB7CisJCQkvKiByeCBzdG9wcGVkICovCisJCQl0ID0gKGNzcjUgPj4gMjApICYgMHgwNzsKKwkJCWlmICh0PT0wfHx0PT0xKQorCQkJCWJyZWFrOworCQl9CisKKwkJbGltaXQtLTsKKwkJaWYoIWxpbWl0KSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY291bGRuJ3Qgc3RvcCByeHR4LCBJbnRyU3RhdHVzICV4aC5cbiIsCisJCQkJCWRldi0+bmFtZSwgY3NyNSk7CisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoMSk7CisJfQorCW5wLT5jc3I2ID0gbmV3OworCS8qIGFuZCByZXN0YXJ0IHRoZW0gd2l0aCB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gKi8KKwlpb3dyaXRlMzIobnAtPmNzcjYsIGlvYWRkciArIE5ldHdvcmtDb25maWcpOworCWlmIChuZXcgJiAweDIwMCkKKwkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZV9hZGRyOworCisJaWYgKGRlYnVnID4gMikKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNZWRpYSBzZWxlY3Rpb24gdGltZXIgdGljaywgc3RhdHVzICU4Ljh4ICIKKwkJCSAgICJjb25maWcgJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBJbnRyU3RhdHVzKSwKKwkJCSAgIGlvcmVhZDMyKGlvYWRkciArIE5ldHdvcmtDb25maWcpKTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJdXBkYXRlX2NzcjYoZGV2LCB1cGRhdGVfbGluayhkZXYpKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlucC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxMCpIWjsKKwlhZGRfdGltZXIoJm5wLT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcnh0eF9yaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJbnAtPnJ4X2hlYWRfZGVzYyA9ICZucC0+cnhfcmluZ1swXTsKKwlucC0+dHhfcmluZyA9IChzdHJ1Y3Qgdzg0MF90eF9kZXNjKikmbnAtPnJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKworCS8qIEluaXRpYWwgYWxsIFJ4IGRlc2NyaXB0b3JzLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlucC0+cnhfcmluZ1tpXS5sZW5ndGggPSBucC0+cnhfYnVmX3N6OworCQlucC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOworCQlucC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwl9CisJLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZy4gKi8KKwlucC0+cnhfcmluZ1tpLTFdLmxlbmd0aCB8PSBEZXNjRW5kUmluZzsKKworCS8qIEZpbGwgaW4gdGhlIFJ4IGJ1ZmZlcnMuICBIYW5kbGUgYWxsb2NhdGlvbiBmYWlsdXJlIGdyYWNlZnVsbHkuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKG5wLT5yeF9idWZfc3opOworCQlucC0+cnhfc2tidWZmW2ldID0gc2tiOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlicmVhazsKKwkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQlucC0+cnhfYWRkcltpXSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LHNrYi0+dGFpbCwKKwkJCQkJc2tiLT5sZW4sUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQlucC0+cnhfcmluZ1tpXS5idWZmZXIxID0gbnAtPnJ4X2FkZHJbaV07CisJCW5wLT5yeF9yaW5nW2ldLnN0YXR1cyA9IERlc2NPd247CisJfQorCisJbnAtPmN1cl9yeCA9IDA7CisJbnAtPmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkoaSAtIFJYX1JJTkdfU0laRSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBUeCBkZXNjcmlwdG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlucC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJbnAtPnR4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwl9CisJbnAtPnR4X2Z1bGwgPSAwOworCW5wLT50eF9xX2J5dGVzID0gbnAtPmRpcnR5X3R4ID0gbnAtPmN1cl90eCA9IDA7CisKKwlpb3dyaXRlMzIobnAtPnJpbmdfZG1hX2FkZHIsIG5wLT5iYXNlX2FkZHIgKyBSeFJpbmdQdHIpOworCWlvd3JpdGUzMihucC0+cmluZ19kbWFfYWRkcitzaXplb2Yoc3RydWN0IHc4NDBfcnhfZGVzYykqUlhfUklOR19TSVpFLAorCQlucC0+YmFzZV9hZGRyICsgVHhSaW5nUHRyKTsKKworfQorCitzdGF0aWMgdm9pZCBmcmVlX3J4dHhfcmluZ3Moc3RydWN0IG5ldGRldl9wcml2YXRlKiBucCkKK3sKKwlpbnQgaTsKKwkvKiBGcmVlIGFsbCB0aGUgc2tidWZmcyBpbiB0aGUgUnggcXVldWUuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCWlmIChucC0+cnhfc2tidWZmW2ldKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCQkJbnAtPnJ4X2FkZHJbaV0sCisJCQkJCQlucC0+cnhfc2tidWZmW2ldLT5sZW4sCisJCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihucC0+cnhfc2tidWZmW2ldKTsKKwkJfQorCQlucC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwl9CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChucC0+dHhfc2tidWZmW2ldKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCQkJbnAtPnR4X2FkZHJbaV0sCisJCQkJCQlucC0+dHhfc2tidWZmW2ldLT5sZW4sCisJCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IobnAtPnR4X3NrYnVmZltpXSk7CisJCX0KKwkJbnAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBpbml0X3JlZ2lzdGVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2VfYWRkcjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWlvd3JpdGU4KGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIFN0YXRpb25BZGRyICsgaSk7CisKKwkvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVycy4gKi8KKyNpZmRlZiBfX0JJR19FTkRJQU4KKwlpID0gKDE8PDIwKTsJLyogQmlnLWVuZGlhbiBkZXNjcmlwdG9ycyAqLworI2Vsc2UKKwlpID0gMDsKKyNlbmRpZgorCWkgfD0gKDB4MDQ8PDIpOwkJLyogc2tpcCBsZW5ndGggNCB1MzIgKi8KKwlpIHw9IDB4MDI7CQkvKiBnaXZlIFJ4IHByaW9yaXR5ICovCisKKwkvKiBDb25maWd1cmUgdGhlIFBDSSBidXMgYnVyc3RzIGFuZCBGSUZPIHRocmVzaG9sZHMuCisJICAgNDg2OiBTZXQgOCBsb25nd29yZCBjYWNoZSBhbGlnbm1lbnQsIDggbG9uZ3dvcmQgYnVyc3QuCisJICAgNTg2OiBTZXQgMTYgbG9uZ3dvcmQgY2FjaGUgYWxpZ25tZW50LCBubyBidXJzdCBsaW1pdC4KKwkgICBDYWNoZSBhbGlnbm1lbnQgYml0cyAxNToxNAkgICAgIEJ1cnN0IGxlbmd0aCAxMzo4CisJCTAwMDAJPG5vdCBhbGxvd2VkPiAJCTAwMDAgYWxpZ24gdG8gY2FjaGUJMDgwMCA4IGxvbmd3b3JkcworCQk0MDAwCTggIGxvbmd3b3JkcwkJMDEwMCAxIGxvbmd3b3JkCQkxMDAwIDE2IGxvbmd3b3JkcworCQk4MDAwCTE2IGxvbmd3b3JkcwkJMDIwMCAyIGxvbmd3b3JkcwkyMDAwIDMyIGxvbmd3b3JkcworCQlDMDAwCTMyICBsb25nd29yZHMJCTA0MDAgNCBsb25nd29yZHMgKi8KKworI2lmIGRlZmluZWQgKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChNT0RVTEUpCisJLyogV2hlbiBub3QgYSBtb2R1bGUgd2UgY2FuIHdvcmsgYXJvdW5kIGJyb2tlbiAnNDg2IFBDSSBib2FyZHMuICovCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2IDw9IDQpIHsKKwkJaSB8PSAweDQ4MDA7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUaGlzIGlzIGEgMzg2LzQ4NiBQQ0kgc3lzdGVtLCBzZXR0aW5nIGNhY2hlICIKKwkJCSAgICJhbGlnbm1lbnQgdG8gOCBsb25nd29yZHMuXG4iLCBkZXYtPm5hbWUpOworCX0gZWxzZSB7CisJCWkgfD0gMHhFMDAwOworCX0KKyNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9faWE2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisJaSB8PSAweEUwMDA7CisjZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKKwlpIHw9IDB4NDgwMDsKKyNlbHNlCisjd2FybmluZyBQcm9jZXNzb3IgYXJjaGl0ZWN0dXJlIHVuZGVmaW5lZAorCWkgfD0gMHg0ODAwOworI2VuZGlmCisJaW93cml0ZTMyKGksIGlvYWRkciArIFBDSUJ1c0NmZyk7CisKKwlucC0+Y3NyNiA9IDA7CisJLyogMTI4IGJ5dGUgVHggdGhyZXNob2xkOyAKKwkJVHJhbnNtaXQgb247IFJlY2VpdmUgb247ICovCisJdXBkYXRlX2NzcjYoZGV2LCAweDAwMDIyMDAyIHwgdXBkYXRlX2xpbmsoZGV2KSB8IF9fc2V0X3J4X21vZGUoZGV2KSk7CisKKwkvKiBDbGVhciBhbmQgRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaW93cml0ZTMyKDB4MUEwRjUsIGlvYWRkciArIEludHJTdGF0dXMpOworCWlvd3JpdGUzMigweDFBMEY1LCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKworCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBSeFN0YXJ0RGVtYW5kKTsKK30KKworc3RhdGljIHZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2VfYWRkcjsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlOC44eCwiCisJCSAgICIgcmVzZXR0aW5nLi4uXG4iLCBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIEludHJTdGF0dXMpKTsKKworCXsKKwkJaW50IGk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgIFJ4IHJpbmcgJXA6ICIsIG5wLT5yeF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKCIgJTguOHgiLCAodW5zaWduZWQgaW50KW5wLT5yeF9yaW5nW2ldLnN0YXR1cyk7CisJCXByaW50aygiXG4iS0VSTl9ERUJVRyIgIFR4IHJpbmcgJXA6ICIsIG5wLT50eF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKCIgJTguOHgiLCBucC0+dHhfcmluZ1tpXS5zdGF0dXMpOworCQlwcmludGsoIlxuIik7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJUeCBjdXIgJWQgVHggZGlydHkgJWQgVHggRnVsbCAlZCwgcSBieXRlcyAlZC5cbiIsCisJCQkJbnAtPmN1cl90eCwgbnAtPmRpcnR5X3R4LCBucC0+dHhfZnVsbCwgbnAtPnR4X3FfYnl0ZXMpOworCXByaW50ayhLRVJOX0RFQlVHICJUeCBEZXNjcmlwdG9yIGFkZHIgJXhoLlxuIixpb3JlYWQzMihpb2FkZHIrMHg0QykpOworCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwkvKgorCSAqIFVuZGVyIGhpZ2ggbG9hZCBkaXJ0eV90eCBhbmQgdGhlIGludGVybmFsIHR4IGRlc2NyaXB0b3IgcG9pbnRlcgorCSAqIGNvbWUgb3V0IG9mIHN5bmMsIHRodXMgcGVyZm9ybSBhIHNvZnR3YXJlIHJlc2V0IGFuZCByZWluaXRpYWxpemUKKwkgKiBldmVyeXRoaW5nLgorCSAqLworCisJaW93cml0ZTMyKDEsIG5wLT5iYXNlX2FkZHIrUENJQnVzQ2ZnKTsKKwl1ZGVsYXkoMSk7CisKKwlmcmVlX3J4dHhfcmluZ3MobnApOworCWluaXRfcnh0eF9yaW5ncyhkZXYpOworCWluaXRfcmVnaXN0ZXJzKGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbnAtPnN0YXRzLnR4X2Vycm9ycysrOworCXJldHVybjsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgUnggYW5kIFR4IHJpbmdzLCBhbG9uZyB3aXRoIHZhcmlvdXMgJ2RldicgYml0cy4gKi8KK3N0YXRpYyBpbnQgYWxsb2NfcmluZ2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW5wLT5yeF9idWZfc3ogPSAoZGV2LT5tdHUgPD0gMTUwMCA/IFBLVF9CVUZfU1ogOiBkZXYtPm10dSArIDMyKTsKKworCW5wLT5yeF9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobnAtPnBjaV9kZXYsCisJCQlzaXplb2Yoc3RydWN0IHc4NDBfcnhfZGVzYykqUlhfUklOR19TSVpFICsKKwkJCXNpemVvZihzdHJ1Y3Qgdzg0MF90eF9kZXNjKSpUWF9SSU5HX1NJWkUsCisJCQkmbnAtPnJpbmdfZG1hX2FkZHIpOworCWlmKCFucC0+cnhfcmluZykKKwkJcmV0dXJuIC1FTk9NRU07CisJaW5pdF9yeHR4X3JpbmdzKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcmluZ2Rlc2Moc3RydWN0IG5ldGRldl9wcml2YXRlICpucCkKK3sKKwlwY2lfZnJlZV9jb25zaXN0ZW50KG5wLT5wY2lfZGV2LAorCQkJc2l6ZW9mKHN0cnVjdCB3ODQwX3J4X2Rlc2MpKlJYX1JJTkdfU0laRSArCisJCQlzaXplb2Yoc3RydWN0IHc4NDBfdHhfZGVzYykqVFhfUklOR19TSVpFLAorCQkJbnAtPnJ4X3JpbmcsIG5wLT5yaW5nX2RtYV9hZGRyKTsKKworfQorCitzdGF0aWMgaW50IHN0YXJ0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgZW50cnk7CisKKwkvKiBDYXV0aW9uOiB0aGUgd3JpdGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUsIHNldCB0aGUgZmllbGQKKwkgICB3aXRoIHRoZSAib3duZXJzaGlwIiBiaXRzIGxhc3QuICovCisKKwkvKiBDYWxjdWxhdGUgdGhlIG5leHQgVHggZGVzY3JpcHRvciBlbnRyeS4gKi8KKwllbnRyeSA9IG5wLT5jdXJfdHggJSBUWF9SSU5HX1NJWkU7CisKKwlucC0+dHhfYWRkcltlbnRyeV0gPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQlza2ItPmRhdGEsc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCW5wLT50eF9za2J1ZmZbZW50cnldID0gc2tiOworCisJbnAtPnR4X3JpbmdbZW50cnldLmJ1ZmZlcjEgPSBucC0+dHhfYWRkcltlbnRyeV07CisJaWYgKHNrYi0+bGVuIDwgVFhfQlVGTElNSVQpIHsKKwkJbnAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCA9IERlc2NXaG9sZVBrdCB8IHNrYi0+bGVuOworCX0gZWxzZSB7CisJCWludCBsZW4gPSBza2ItPmxlbiAtIFRYX0JVRkxJTUlUOworCisJCW5wLT50eF9yaW5nW2VudHJ5XS5idWZmZXIyID0gbnAtPnR4X2FkZHJbZW50cnldK1RYX0JVRkxJTUlUOworCQlucC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gRGVzY1dob2xlUGt0IHwgKGxlbiA8PCAxMSkgfCBUWF9CVUZMSU1JVDsKKwl9CisJaWYoZW50cnkgPT0gVFhfUklOR19TSVpFLTEpCisJCW5wLT50eF9yaW5nW2VudHJ5XS5sZW5ndGggfD0gRGVzY0VuZFJpbmc7CisKKwkvKiBOb3cgYWNxdWlyZSB0aGUgaXJxIHNwaW5sb2NrLgorCSAqIFRoZSBkaWZmaWN1bHQgcmFjZSBpcyB0aGUgdGhlIG9yZGVyaW5nIGJldHdlZW4KKwkgKiBpbmNyZWFzaW5nIG5wLT5jdXJfdHggYW5kIHNldHRpbmcgRGVzY093bjoKKwkgKiAtIGlmIG5wLT5jdXJfdHggaXMgaW5jcmVhc2VkIGZpcnN0IHRoZSBpbnRlcnJ1cHQKKwkgKiAgIGhhbmRsZXIgY291bGQgY29uc2lkZXIgdGhlIHBhY2tldCBhcyB0cmFuc21pdHRlZAorCSAqICAgc2luY2UgRGVzY093biBpcyBjbGVhcmVkLgorCSAqIC0gSWYgRGVzY093biBpcyBzZXQgZmlyc3QgdGhlIE5JQyBjb3VsZCByZXBvcnQgdGhlCisJICogICBwYWNrZXQgYXMgc2VudCwgYnV0IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3b3VsZCBpZ25vcmUgaXQKKwkgKiAgIHNpbmNlIHRoZSBucC0+Y3VyX3R4IHdhcyBub3QgeWV0IGluY3JlYXNlZC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbnAtPmN1cl90eCsrOworCisJd21iKCk7IC8qIGZsdXNoIGxlbmd0aCwgYnVmZmVyMSwgYnVmZmVyMiAqLworCW5wLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBEZXNjT3duOworCXdtYigpOyAvKiBmbHVzaCBzdGF0dXMgYW5kIGtpY2sgdGhlIGhhcmR3YXJlICovCisJaW93cml0ZTMyKDAsIG5wLT5iYXNlX2FkZHIgKyBUeFN0YXJ0RGVtYW5kKTsKKwlucC0+dHhfcV9ieXRlcyArPSBza2ItPmxlbjsKKwkvKiBXb3JrIGFyb3VuZCBob3JyaWJsZSBidWcgaW4gdGhlIGNoaXAgYnkgbWFya2luZyB0aGUgcXVldWUgYXMgZnVsbAorCSAgIHdoZW4gd2UgZG8gbm90IGhhdmUgRklGTyByb29tIGZvciBhIG1heGltdW0gc2l6ZWQgcGFja2V0LiAqLworCWlmIChucC0+Y3VyX3R4IC0gbnAtPmRpcnR5X3R4ID4gVFhfUVVFVUVfTEVOIHx8CisJCSgobnAtPmRydl9mbGFncyAmIEhhc0Jyb2tlblR4KSAmJiBucC0+dHhfcV9ieXRlcyA+IFRYX0JVR19GSUZPX0xJTUlUKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXdtYigpOworCQlucC0+dHhfZnVsbCA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlpZiAoZGVidWcgPiA0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJhbnNtaXQgZnJhbWUgIyVkIHF1ZXVlZCBpbiBzbG90ICVkLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgbnAtPmN1cl90eCwgZW50cnkpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X3R4X2RvbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlmb3IgKDsgbnAtPmN1cl90eCAtIG5wLT5kaXJ0eV90eCA+IDA7IG5wLT5kaXJ0eV90eCsrKSB7CisJCWludCBlbnRyeSA9IG5wLT5kaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKKwkJaW50IHR4X3N0YXR1cyA9IG5wLT50eF9yaW5nW2VudHJ5XS5zdGF0dXM7CisKKwkJaWYgKHR4X3N0YXR1cyA8IDApCisJCQlicmVhazsKKwkJaWYgKHR4X3N0YXR1cyAmIDB4ODAwMCkgeyAJLyogVGhlcmUgd2FzIGFuIGVycm9yLCBsb2cgaXQuICovCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCWlmIChkZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBlcnJvciwgVHggc3RhdHVzICU4Ljh4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCB0eF9zdGF0dXMpOworI2VuZGlmCisJCQlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlpZiAodHhfc3RhdHVzICYgMHgwMTA0KSBucC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiAweDBDODApIG5wLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIDB4MDIwMCkgbnAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiAweDAwMDIpIG5wLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJaWYgKCh0eF9zdGF0dXMgJiAweDAwODApICYmIG5wLT5taWlfaWYuZnVsbF9kdXBsZXggPT0gMCkKKwkJCQlucC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQl9IGVsc2UgeworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQlpZiAoZGVidWcgPiAzKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJhbnNtaXQgc2xvdCAlZCBvaywgVHggc3RhdHVzICU4Ljh4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBlbnRyeSwgdHhfc3RhdHVzKTsKKyNlbmRpZgorCQkJbnAtPnN0YXRzLnR4X2J5dGVzICs9IG5wLT50eF9za2J1ZmZbZW50cnldLT5sZW47CisJCQlucC0+c3RhdHMuY29sbGlzaW9ucyArPSAodHhfc3RhdHVzID4+IDMpICYgMTU7CisJCQlucC0+c3RhdHMudHhfcGFja2V0cysrOworCQl9CisJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KKwkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldixucC0+dHhfYWRkcltlbnRyeV0sCisJCQkJCW5wLT50eF9za2J1ZmZbZW50cnldLT5sZW4sCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQlucC0+dHhfcV9ieXRlcyAtPSBucC0+dHhfc2tidWZmW2VudHJ5XS0+bGVuOworCQlkZXZfa2ZyZWVfc2tiX2lycShucC0+dHhfc2tidWZmW2VudHJ5XSk7CisJCW5wLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwl9CisJaWYgKG5wLT50eF9mdWxsICYmCisJCW5wLT5jdXJfdHggLSBucC0+ZGlydHlfdHggPCBUWF9RVUVVRV9MRU5fUkVTVEFSVCAmJgorCQlucC0+dHhfcV9ieXRlcyA8IFRYX0JVR19GSUZPX0xJTUlUKSB7CisJCS8qIFRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsLCBjbGVhciB0YnVzeS4gKi8KKwkJbnAtPnR4X2Z1bGwgPSAwOworCQl3bWIoKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KK30KKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworc3RhdGljIGlycXJldHVybl90IGludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlX2FkZHI7CisJaW50IHdvcmtfbGltaXQgPSBtYXhfaW50ZXJydXB0X3dvcms7CisJaW50IGhhbmRsZWQgPSAwOworCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQlyZXR1cm4gSVJRX05PTkU7CisJZG8geworCQl1MzIgaW50cl9zdGF0dXMgPSBpb3JlYWQzMihpb2FkZHIgKyBJbnRyU3RhdHVzKTsKKworCQkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKwkJaW93cml0ZTMyKGludHJfc3RhdHVzICYgMHgwMDFmZmZmLCBpb2FkZHIgKyBJbnRyU3RhdHVzKTsKKworCQlpZiAoZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbnRlcnJ1cHQsIHN0YXR1cyAlNC40eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisKKwkJaWYgKChpbnRyX3N0YXR1cyAmIChOb3JtYWxJbnRyfEFibm9ybWFsSW50cikpID09IDApCisJCQlicmVhazsKKworCQloYW5kbGVkID0gMTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiAoSW50clJ4RG9uZSB8IFJ4Tm9CdWYpKQorCQkJbmV0ZGV2X3J4KGRldik7CisJCWlmIChpbnRyX3N0YXR1cyAmIFJ4Tm9CdWYpCisJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgUnhTdGFydERlbWFuZCk7CisKKwkJaWYgKGludHJfc3RhdHVzICYgKFR4SWRsZSB8IEludHJUeERvbmUpICYmCisJCQlucC0+Y3VyX3R4ICE9IG5wLT5kaXJ0eV90eCkgeworCQkJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJCQluZXRkZXZfdHhfZG9uZShkZXYpOworCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJfQorCisJCS8qIEFibm9ybWFsIGVycm9yIHN1bW1hcnkvdW5jb21tb24gZXZlbnRzIGhhbmRsZXJzLiAqLworCQlpZiAoaW50cl9zdGF0dXMgJiAoQWJub3JtYWxJbnRyIHwgVHhGSUZPVW5kZXJmbG93IHwgSW50clBDSUVyciB8CisJCQkJCQkgICBUaW1lckludCB8IEludHJUeFN0b3BwZWQpKQorCQkJbmV0ZGV2X2Vycm9yKGRldiwgaW50cl9zdGF0dXMpOworCisJCWlmICgtLXdvcmtfbGltaXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIG11Y2ggd29yayBhdCBpbnRlcnJ1cHQsICIKKwkJCQkgICAic3RhdHVzPTB4JTQuNHguXG4iLCBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKwkJCS8qIFNldCB0aGUgdGltZXIgdG8gcmUtZW5hYmxlIHRoZSBvdGhlciBpbnRlcnJ1cHRzIGFmdGVyCisJCQkgICAxMCo4MnVzZWMgdGlja3MuICovCisJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSB7CisJCQkJaW93cml0ZTMyKEFibm9ybWFsSW50ciB8IFRpbWVySW50LCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwkJCQlpb3dyaXRlMzIoMTAsIGlvYWRkciArIEdQVGltZXIpOworCQkJfQorCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlpZiAoZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBzdGF0dXM9JSM0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgSW50clN0YXR1cykpOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgbG9naWNhbGx5IHBhcnQgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyLCBidXQgc2VwYXJhdGVkCisgICBmb3IgY2xhcml0eSBhbmQgYmV0dGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uICovCitzdGF0aWMgaW50IG5ldGRldl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeSA9IG5wLT5jdXJfcnggJSBSWF9SSU5HX1NJWkU7CisJaW50IHdvcmtfbGltaXQgPSBucC0+ZGlydHlfcnggKyBSWF9SSU5HX1NJWkUgLSBucC0+Y3VyX3J4OworCisJaWYgKGRlYnVnID4gNCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiIEluIG5ldGRldl9yeCgpLCBlbnRyeSAlZCBzdGF0dXMgJTQuNHguXG4iLAorCQkJICAgZW50cnksIG5wLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCX0KKworCS8qIElmIEVPUCBpcyBzZXQgb24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworCXdoaWxlICgtLXdvcmtfbGltaXQgPj0gMCkgeworCQlzdHJ1Y3Qgdzg0MF9yeF9kZXNjICpkZXNjID0gbnAtPnJ4X2hlYWRfZGVzYzsKKwkJczMyIHN0YXR1cyA9IGRlc2MtPnN0YXR1czsKKworCQlpZiAoZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbmV0ZGV2X3J4KCkgc3RhdHVzIHdhcyAlOC44eC5cbiIsCisJCQkJICAgc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJaWYgKChzdGF0dXMgJiAweDM4MDA4MzAwKSAhPSAweDAzMDApIHsKKwkJCWlmICgoc3RhdHVzICYgMHgzODAwMDMwMCkgIT0gMHgwMzAwKSB7CisJCQkJLyogSW5nb3JlIGVhcmxpZXIgYnVmZmVycy4gKi8KKwkJCQlpZiAoKHN0YXR1cyAmIDB4ZmZmZikgIT0gMHg3ZmZmKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdmVyc2l6ZWQgRXRoZXJuZXQgZnJhbWUgc3Bhbm5lZCAiCisJCQkJCQkgICAibXVsdGlwbGUgYnVmZmVycywgZW50cnkgJSN4IHN0YXR1cyAlNC40eCFcbiIsCisJCQkJCQkgICBkZXYtPm5hbWUsIG5wLT5jdXJfcngsIHN0YXR1cyk7CisJCQkJCW5wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJfQorCQkJfSBlbHNlIGlmIChzdGF0dXMgJiAweDgwMDApIHsKKwkJCQkvKiBUaGVyZSB3YXMgYSBmYXRhbCBlcnJvci4gKi8KKwkJCQlpZiAoZGVidWcgPiAyKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlY2VpdmUgZXJyb3IsIFJ4IHN0YXR1cyAlOC44eC5cbiIsCisJCQkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBlbmQgb2YgYSBwYWNrZXQuKi8KKwkJCQlpZiAoc3RhdHVzICYgMHgwODkwKSBucC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiAweDAwNEMpIG5wLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgMHgwMDAyKSBucC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCS8qIE9taXQgdGhlIGZvdXIgb2N0ZXQgQ1JDIGZyb20gdGhlIGxlbmd0aC4gKi8KKwkJCWludCBwa3RfbGVuID0gKChzdGF0dXMgPj4gMTYpICYgMHg3ZmYpIC0gNDsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQlpZiAoZGVidWcgPiA0KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgIG5ldGRldl9yeCgpIG5vcm1hbCBSeCBwa3QgbGVuZ3RoICVkIgorCQkJCQkgICAiIHN0YXR1cyAleC5cbiIsIHBrdF9sZW4sIHN0YXR1cyk7CisjZW5kaWYKKwkJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8gYWNjZXB0IHdpdGhvdXQgY29weWluZworCQkJICAgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLworCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKKwkJCQkmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobnAtPnBjaV9kZXYsbnAtPnJ4X2FkZHJbZW50cnldLAorCQkJCQkJCSAgICBucC0+cnhfc2tidWZmW2VudHJ5XS0+bGVuLAorCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBucC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShucC0+cGNpX2RldixucC0+cnhfYWRkcltlbnRyeV0sCisJCQkJCQkJICAgICAgIG5wLT5yeF9za2J1ZmZbZW50cnldLT5sZW4sCisJCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQl9IGVsc2UgeworCQkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsbnAtPnJ4X2FkZHJbZW50cnldLAorCQkJCQkJCW5wLT5yeF9za2J1ZmZbZW50cnldLT5sZW4sCisJCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlza2JfcHV0KHNrYiA9IG5wLT5yeF9za2J1ZmZbZW50cnldLCBwa3RfbGVuKTsKKwkJCQlucC0+cnhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQl9CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24JCQkJLyogUmVtb3ZlIGFmdGVyIHRlc3RpbmcuICovCisJCQkvKiBZb3Ugd2lsbCB3YW50IHRoaXMgaW5mbyBmb3IgdGhlIGluaXRpYWwgZGVidWcuICovCisJCQlpZiAoZGVidWcgPiA1KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgIFJ4IGRhdGEgJTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMng6IgorCQkJCQkgICAiJTIuMnggJTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMnggJTIuMnglMi4yeCAiCisJCQkJCSAgICIlZC4lZC4lZC4lZC5cbiIsCisJCQkJCSAgIHNrYi0+ZGF0YVswXSwgc2tiLT5kYXRhWzFdLCBza2ItPmRhdGFbMl0sIHNrYi0+ZGF0YVszXSwKKwkJCQkJICAgc2tiLT5kYXRhWzRdLCBza2ItPmRhdGFbNV0sIHNrYi0+ZGF0YVs2XSwgc2tiLT5kYXRhWzddLAorCQkJCQkgICBza2ItPmRhdGFbOF0sIHNrYi0+ZGF0YVs5XSwgc2tiLT5kYXRhWzEwXSwKKwkJCQkJICAgc2tiLT5kYXRhWzExXSwgc2tiLT5kYXRhWzEyXSwgc2tiLT5kYXRhWzEzXSwKKwkJCQkJICAgc2tiLT5kYXRhWzE0XSwgc2tiLT5kYXRhWzE1XSwgc2tiLT5kYXRhWzE2XSwKKwkJCQkJICAgc2tiLT5kYXRhWzE3XSk7CisjZW5kaWYKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCW5wLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlucC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCQllbnRyeSA9ICgrK25wLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworCQlucC0+cnhfaGVhZF9kZXNjID0gJm5wLT5yeF9yaW5nW2VudHJ5XTsKKwl9CisKKwkvKiBSZWZpbGwgdGhlIFJ4IHJpbmcgYnVmZmVycy4gKi8KKwlmb3IgKDsgbnAtPmN1cl9yeCAtIG5wLT5kaXJ0eV9yeCA+IDA7IG5wLT5kaXJ0eV9yeCsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWVudHJ5ID0gbnAtPmRpcnR5X3J4ICUgUlhfUklOR19TSVpFOworCQlpZiAobnAtPnJ4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkgeworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihucC0+cnhfYnVmX3N6KTsKKwkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWJyZWFrOwkJCS8qIEJldHRlciBsdWNrIG5leHQgcm91bmQuICovCisJCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCQlucC0+cnhfYWRkcltlbnRyeV0gPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQkJCQlza2ItPnRhaWwsCisJCQkJCQkJc2tiLT5sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlucC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IG5wLT5yeF9hZGRyW2VudHJ5XTsKKwkJfQorCQl3bWIoKTsKKwkJbnAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyA9IERlc2NPd247CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZV9hZGRyOworCisJaWYgKGRlYnVnID4gMikKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBYm5vcm1hbCBldmVudCwgJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisJaWYgKGludHJfc3RhdHVzID09IDB4ZmZmZmZmZmYpCisJCXJldHVybjsKKwlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwlpZiAoaW50cl9zdGF0dXMgJiBUeEZJRk9VbmRlcmZsb3cpIHsKKwkJaW50IG5ldzsKKwkJLyogQnVtcCB1cCB0aGUgVHggdGhyZXNob2xkICovCisjaWYgMAorCQkvKiBUaGlzIGNhdXNlcyBsb3RzIG9mIGRyb3BwZWQgcGFja2V0cywKKwkJICogYW5kIHVuZGVyIGhpZ2ggbG9hZCBldmVuIHR4X3RpbWVvdXRzCisJCSAqLworCQluZXcgPSBucC0+Y3NyNiArIDB4NDAwMDsKKyNlbHNlCisJCW5ldyA9IChucC0+Y3NyNiA+PiAxNCkmMHg3ZjsKKwkJaWYgKG5ldyA8IDY0KQorCQkJbmV3ICo9IDI7CisJCSBlbHNlCisJCSAJbmV3ID0gMTI3OyAvKiBsb2FkIGZ1bGwgcGFja2V0IGJlZm9yZSBzdGFydGluZyAqLworCQluZXcgPSAobnAtPmNzcjYgJiB+KDB4N0YgPDwgMTQpKSB8IChuZXc8PDE0KTsKKyNlbmRpZgorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFR4IHVuZGVyZmxvdywgbmV3IGNzcjYgJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBuZXcpOworCQl1cGRhdGVfY3NyNihkZXYsIG5ldyk7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIEludHJSeERpZWQpIHsJCS8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLworCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIFRpbWVySW50KSB7CisJCS8qIFJlLWVuYWJsZSBvdGhlciBpbnRlcnJ1cHRzLiAqLworCQlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJCWlvd3JpdGUzMigweDFBMEY1LCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwl9CisJbnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW9yZWFkMzIoaW9hZGRyICsgUnhNaXNzZWQpICYgMHhmZmZmOworCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBSeFN0YXJ0RGVtYW5kKTsKKwlzcGluX3VubG9jaygmbnAtPmxvY2spOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2VfYWRkcjsKKworCS8qIFRoZSBjaGlwIG9ubHkgbmVlZCByZXBvcnQgZnJhbWUgc2lsZW50bHkgZHJvcHBlZC4gKi8KKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiBuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQlucC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpb3JlYWQzMihpb2FkZHIgKyBSeE1pc3NlZCkgJiAweGZmZmY7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlyZXR1cm4gJm5wLT5zdGF0czsKK30KKworCitzdGF0aWMgdTMyIF9fc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlX2FkZHI7CisJdTMyIG1jX2ZpbHRlclsyXTsJCQkvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKwl1MzIgcnhfbW9kZTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJCQkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdEFsbFBoeXMKKwkJCXwgQWNjZXB0TXlQaHlzOworCX0gZWxzZSBpZiAoKGRldi0+bWNfY291bnQgPiBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0KQorCQkJICAgfHwgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBtYXRjaCwgb3IgYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQltZW1zZXQobWNfZmlsdGVyLCAweGZmLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCXJ4X21vZGUgPSBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXM7CisJfSBlbHNlIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCWludCBpOworCQltZW1zZXQobWNfZmlsdGVyLCAwLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkJIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQlpbnQgZmlsdGVyYml0ID0gKGV0aGVyX2NyYyhFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcikgPj4gMjYpIF4gMHgzRjsKKwkJCWZpbHRlcmJpdCAmPSAweDNmOworCQkJbWNfZmlsdGVyW2ZpbHRlcmJpdCA+PiA1XSB8PSAxIDw8IChmaWx0ZXJiaXQgJiAzMSk7CisJCX0KKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwl9CisJaW93cml0ZTMyKG1jX2ZpbHRlclswXSwgaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMCk7CisJaW93cml0ZTMyKG1jX2ZpbHRlclsxXSwgaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMSk7CisJcmV0dXJuIHJ4X21vZGU7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHJ4X21vZGUgPSBfX3NldF9yeF9tb2RlKGRldik7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXVwZGF0ZV9jc3I2KGRldiwgKG5wLT5jc3I2ICYgfjB4MDBGOCkgfCByeF9tb2RlKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RyY3B5IChpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkgKGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJjcHkgKGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworfQorCitzdGF0aWMgaW50IG5ldGRldl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXJjID0gbWlpX2V0aHRvb2xfZ3NldCgmbnAtPm1paV9pZiwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBuZXRkZXZfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByYzsKKworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyYyA9IG1paV9ldGh0b29sX3NzZXQoJm5wLT5taWlfaWYsIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZGV2X253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmbnAtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIG1paV9saW5rX29rKCZucC0+bWlpX2lmKTsKK30KKworc3RhdGljIHUzMiBuZXRkZXZfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRlYnVnOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKwlkZWJ1ZyA9IHZhbHVlOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MJCT0gbmV0ZGV2X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IG5ldGRldl9zZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQJCT0gbmV0ZGV2X253YXlfcmVzZXQsCisJLmdldF9saW5rCQk9IG5ldGRldl9nZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsCQk9IG5ldGRldl9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBuZXRkZXZfc2V0X21zZ2xldmVsLAorCS5nZXRfc2cJCQk9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5nZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorfTsKKworc3RhdGljIGludCBuZXRkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkocnEpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KKwkJZGF0YS0+cGh5X2lkID0gKChzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+cGh5c1swXSAmIDB4MWY7CisJCS8qIEZhbGwgVGhyb3VnaCAqLworCisJY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCQlkYXRhLT52YWxfb3V0ID0gbWRpb19yZWFkKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYpOworCQlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNJT0NTTUlJUkVHOgkJLyogV3JpdGUgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCQltZGlvX3dyaXRlKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYsIGRhdGEtPnZhbF9pbik7CisJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2VfYWRkcjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChkZWJ1ZyA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlOC44eCAiCisJCQkgICAiQ29uZmlnICU4Ljh4LlxuIiwgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBJbnRyU3RhdHVzKSwKKwkJCSAgIGlvcmVhZDMyKGlvYWRkciArIE5ldHdvcmtDb25maWcpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBRdWV1ZSBwb2ludGVycyB3ZXJlIFR4ICVkIC8gJWQsICBSeCAlZCAvICVkLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgbnAtPmN1cl90eCwgbnAtPmRpcnR5X3R4LCBucC0+Y3VyX3J4LCBucC0+ZGlydHlfcngpOworCX0KKworIAkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCXVwZGF0ZV9jc3I2KGRldiwgMCk7CisJaW93cml0ZTMyKDB4MDAwMCwgaW9hZGRyICsgSW50ckVuYWJsZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwl3bWIoKTsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwlpZiAoaW9yZWFkMzIoaW9hZGRyICsgTmV0d29ya0NvbmZpZykgIT0gMHhmZmZmZmZmZikKKwkJbnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW9yZWFkMzIoaW9hZGRyICsgUnhNaXNzZWQpICYgMHhmZmZmOworCisjaWZkZWYgX19pMzg2X18KKwlpZiAoZGVidWcgPiAyKSB7CisJCWludCBpOworCisJCXByaW50ayhLRVJOX0RFQlVHIiAgVHggcmluZyBhdCAlOC44eDpcbiIsCisJCQkgICAoaW50KW5wLT50eF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAjJWQgZGVzYy4gJTQuNHggJTQuNHggJTguOHguXG4iLAorCQkJCSAgIGksIG5wLT50eF9yaW5nW2ldLmxlbmd0aCwKKwkJCQkgICBucC0+dHhfcmluZ1tpXS5zdGF0dXMsIG5wLT50eF9yaW5nW2ldLmJ1ZmZlcjEpOworCQlwcmludGsoIlxuIktFUk5fREVCVUcgIiAgUnggcmluZyAlOC44eDpcbiIsCisJCQkgICAoaW50KW5wLT5yeF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiICMlZCBkZXNjLiAlNC40eCAlNC40eCAlOC44eFxuIiwKKwkJCQkgICBpLCBucC0+cnhfcmluZ1tpXS5sZW5ndGgsCisJCQkJICAgbnAtPnJ4X3JpbmdbaV0uc3RhdHVzLCBucC0+cnhfcmluZ1tpXS5idWZmZXIxKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBfX2kzODZfXyBkZWJ1Z2dpbmcgb25seSAqLworCisJZGVsX3RpbWVyX3N5bmMoJm5wLT50aW1lcik7CisKKwlmcmVlX3J4dHhfcmluZ3MobnApOworCWZyZWVfcmluZ2Rlc2MobnApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB3ODQwX3JlbW92ZTEgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJCisJaWYgKGRldikgeworCQlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX2lvdW5tYXAocGRldiwgbnAtPmJhc2VfYWRkcik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKKy8qCisgKiBzdXNwZW5kL3Jlc3VtZSBzeW5jaHJvbml6YXRpb246CisgKiAtIG9wZW4sIGNsb3NlLCBkb19pb2N0bDoKKyAqIAlydG5sX2xvY2ssICYgbmV0aWZfZGV2aWNlX2RldGFjaCBhZnRlciB0aGUgcnRubF91bmxvY2suCisgKiAtIGdldF9zdGF0czoKKyAqIAlzcGluX2xvY2tfaXJxKG5wLT5sb2NrKSwgZG9lc24ndCB0b3VjaCBodyBpZiBub3QgcHJlc2VudAorICogLSBoYXJkX3N0YXJ0X3htaXQ6CisgKiAJbmV0aWZfc3RvcF9xdWV1ZSArIHNwaW5fdW5sb2NrX3dhaXQoJmRldi0+eG1pdF9sb2NrKTsKKyAqIC0gdHhfdGltZW91dDoKKyAqIAluZXRpZl9kZXZpY2VfZGV0YWNoICsgc3Bpbl91bmxvY2tfd2FpdCgmZGV2LT54bWl0X2xvY2spOworICogLSBzZXRfbXVsdGljYXN0X2xpc3QKKyAqIAluZXRpZl9kZXZpY2VfZGV0YWNoICsgc3Bpbl91bmxvY2tfd2FpdCgmZGV2LT54bWl0X2xvY2spOworICogLSBpbnRlcnJ1cHQgaGFuZGxlcgorICogCWRvZXNuJ3QgdG91Y2ggaHcgaWYgbm90IHByZXNlbnQsIHN5bmNocm9uaXplX2lycSB3YWl0cyBmb3IKKyAqIAlydW5uaW5nIGluc3RhbmNlcyBvZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICogRGlzYWJsaW5nIGh3IHJlcXVpcmVzIGNsZWFyaW5nIGNzcjYgJiBJbnRyRW5hYmxlLgorICogdXBkYXRlX2NzcjYgJiBhbGwgZnVuY3Rpb24gdGhhdCB3cml0ZSBJbnRyRW5hYmxlIGNoZWNrIG5ldGlmX2RldmljZV9wcmVzZW50CisgKiBiZWZvcmUgc2V0dGluZ3MgYW55IGJpdHMuCisgKgorICogRGV0YWNoIG11c3Qgb2NjdXIgdW5kZXIgc3Bpbl91bmxvY2tfaXJxKCksIGludGVycnVwdHMgZnJvbSBhIGRldGFjaGVkCisgKiBkZXZpY2Ugd291bGQgY2F1c2UgYW4gaXJxIHN0b3JtLgorICovCitzdGF0aWMgaW50IHc4NDBfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlX2FkZHI7CisKKwlydG5sX2xvY2soKTsKKwlpZiAobmV0aWZfcnVubmluZyAoZGV2KSkgeworCQlkZWxfdGltZXJfc3luYygmbnAtPnRpbWVyKTsKKworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkJdXBkYXRlX2NzcjYoZGV2LCAwKTsKKwkJaW93cml0ZTMyKDAsIGlvYWRkciArIEludHJFbmFibGUpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJCXNwaW5fdW5sb2NrX3dhaXQoJmRldi0+eG1pdF9sb2NrKTsKKwkJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKwkKKwkJbnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW9yZWFkMzIoaW9hZGRyICsgUnhNaXNzZWQpICYgMHhmZmZmOworCisJCS8qIG5vIG1vcmUgaGFyZHdhcmUgYWNjZXNzZXMgYmVoaW5kIHRoaXMgbGluZS4gKi8KKworCQlpZiAobnAtPmNzcjYpIEJVRygpOworCQlpZiAoaW9yZWFkMzIoaW9hZGRyICsgSW50ckVuYWJsZSkpIEJVRygpOworCisJCS8qIHBjaV9wb3dlcl9vZmYocGRldiwgLTEpOyAqLworCisJCWZyZWVfcnh0eF9yaW5ncyhucCk7CisJfSBlbHNlIHsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCX0KKwlydG5sX3VubG9jaygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHc4NDBfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJ0bmxfbG9jaygpOworCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQlnb3RvIG91dDsgLyogZGV2aWNlIG5vdCBzdXNwZW5kZWQgKi8KKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCS8qCXBjaV9wb3dlcl9vbihwZGV2KTsgKi8KKworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJCWlvd3JpdGUzMigxLCBucC0+YmFzZV9hZGRyK1BDSUJ1c0NmZyk7CisJCWlvcmVhZDMyKG5wLT5iYXNlX2FkZHIrUENJQnVzQ2ZnKTsKKwkJdWRlbGF5KDEpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJCWluaXRfcnh0eF9yaW5ncyhkZXYpOworCQlpbml0X3JlZ2lzdGVycyhkZXYpOworCQlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwkJbW9kX3RpbWVyKCZucC0+dGltZXIsIGppZmZpZXMgKyAxKkhaKTsKKwl9IGVsc2UgeworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJfQorb3V0OgorCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHc4NDBfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IHc4NDBfcGNpX3RibCwKKwkucHJvYmUJCT0gdzg0MF9wcm9iZTEsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3ODQwX3JlbW92ZTEpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gdzg0MF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gdzg0MF9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHc4NDBfaW5pdCh2b2lkKQoreworCXByaW50ayh2ZXJzaW9uKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ3ODQwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3ODQwX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnc4NDBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodzg0MF9pbml0KTsKK21vZHVsZV9leGl0KHc4NDBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fY2IuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV9jYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Y2M0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fY2IuYwpAQCAtMCwwICsxLDEyNzcgQEAKKy8qCisgKiB4aXJjb21fY2I6IEEgZHJpdmVyIGZvciB0aGUgKHR1bGlwLWxpa2UpIFhpcmNvbSBDYXJkYnVzIGV0aGVybmV0IGNhcmRzIAorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgKEMpIGJ5IHRoZSByZXNwZWN0aXZlIGF1dGhvcnMsIGFuZCBsaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKiBMaWNlbnNlLgorICoKKyAqIFdyaXR0ZW4gYnkgQXJqYW4gdmFuIGRlIFZlbiBmb3IgUmVkIEhhdCwgSW5jLgorICogQmFzZWQgb24gd29yayBieSBKZWZmIEdhcnppaywgRG91ZyBMZWRmb3JkIGFuZCBEb25hbGQgQmVja2VyIAorICoKKyAqICAJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogICAgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqCisgKiAJJElkOiB4aXJjb21fY2IuYyx2IDEuMzMgMjAwMS8wMy8xOSAxNDowMjowNyBhcmphbnYgRXhwICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgZW50ZXIoeCkgICBwcmludGsoIkVudGVyOiAlcywgJXMgbGluZSAlaVxuIix4LF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBsZWF2ZSh4KSAgIHByaW50aygiTGVhdmU6ICVzLCAlcyBsaW5lICVpXG4iLHgsX19GSUxFX18sX19MSU5FX18pCisjZWxzZQorI2RlZmluZSBlbnRlcih4KSAgIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBsZWF2ZSh4KSAgIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJYaXJjb20gQ2FyZGJ1cyBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkFyamFuIHZhbiBkZSBWZW4gPGFyamFudkByZWRoYXQuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKworLyogSU8gcmVnaXN0ZXJzIG9uIHRoZSBjYXJkLCBvZmZzZXRzICovCisjZGVmaW5lIENTUjAJMHgwMAorI2RlZmluZSBDU1IxCTB4MDgKKyNkZWZpbmUgQ1NSMgkweDEwCisjZGVmaW5lIENTUjMJMHgxOAorI2RlZmluZSBDU1I0CTB4MjAKKyNkZWZpbmUgQ1NSNQkweDI4CisjZGVmaW5lIENTUjYJMHgzMAorI2RlZmluZSBDU1I3CTB4MzgKKyNkZWZpbmUgQ1NSOAkweDQwCisjZGVmaW5lIENTUjkJMHg0OAorI2RlZmluZSBDU1IxMAkweDUwCisjZGVmaW5lIENTUjExCTB4NTgKKyNkZWZpbmUgQ1NSMTIJMHg2MAorI2RlZmluZSBDU1IxMwkweDY4CisjZGVmaW5lIENTUjE0CTB4NzAKKyNkZWZpbmUgQ1NSMTUJMHg3OAorI2RlZmluZSBDU1IxNgkweDgwCisKKy8qIFBDSSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJX1BPV0VSTUdNVCAJMHg0MAorCisvKiBPZmZzZXRzIG9mIHRoZSBidWZmZXJzIHdpdGhpbiB0aGUgZGVzY3JpcHRvciBwYWdlcywgaW4gYnl0ZXMgKi8KKworI2RlZmluZSBOVU1ERVNDUklQVE9SUyA0CisKK3N0YXRpYyBpbnQgYnVmZmVyb2Zmc2V0c1tOVU1ERVNDUklQVE9SU10gPSB7MTI4LDIwNDgsNDA5Niw2MTQ0fTsKKworCitzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgeworCS8qIFNlbmQgYW5kIHJlY2VpdmUgYnVmZmVycywga2VybmVsLWFkZHJlc3NhYmxlIGFuZCBkbWEgYWRkcmVzc2FibGUgZm9ybXMgKi8KKworCXVuc2lnbmVkIGludCAqcnhfYnVmZmVyOworCXVuc2lnbmVkIGludCAqdHhfYnVmZmVyOworCisJZG1hX2FkZHJfdCByeF9kbWFfaGFuZGxlOworCWRtYV9hZGRyX3QgdHhfZG1hX2hhbmRsZTsKKworCXN0cnVjdCBza19idWZmICp0eF9za2JbNF07CisKKwl1bnNpZ25lZCBsb25nIGlvX3BvcnQ7CisJaW50IG9wZW47CisJCisJLyogdHJhbnNtaXRfdXNlZCBpcyB0aGUgcm90YXRpbmcgY291bnRlciB0aGF0IGluZGljYXRlcyB3aGljaCB0cmFuc21pdAorCSAgIGRlc2NyaXB0b3IgaGFzIHRvIGJlIHVzZWQgbmV4dCAqLworCWludCB0cmFuc21pdF91c2VkOworCisJLyogU3BpbmxvY2sgdG8gc2VyaWFsaXplIHJlZ2lzdGVyIG9wZXJhdGlvbnMuCisJICAgSXQgbXVzdCBiZSBoZWx0IHdoaWxlIG1hbmlwdWxhdGluZyB0aGUgZm9sbG93aW5nIHJlZ2lzdGVyczoKKwkgICBDU1IwLCBDU1I2LCBDU1I3LCBDU1I5LCBDU1IxMCwgQ1NSMTUKKwkgKi8KKwlzcGlubG9ja190IGxvY2s7CisKKworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Cit9OworCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgeGlyY29tX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgeGlyY29tX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgeGlyY29tX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgeGlyY29tX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHhpcmNvbV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB4aXJjb21fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB4aXJjb21fdXAoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqeGlyY29tX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgeGlyY29tX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpbnZlc3RpZ2F0ZV9yZWFkX2Rlc2NyaXB0b3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQsIGludCBkZXNjbnIsIHVuc2lnbmVkIGludCBidWZmZXJvZmZzZXQpOworc3RhdGljIHZvaWQgaW52ZXN0aWdhdGVfd3JpdGVfZGVzY3JpcHRvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQsIGludCBkZXNjbnIsIHVuc2lnbmVkIGludCBidWZmZXJvZmZzZXQpOworc3RhdGljIHZvaWQgcmVhZF9tYWNfYWRkcmVzcyhzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgdHJhbnNjZWl2ZXJfdm9vZG9vKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CitzdGF0aWMgdm9pZCBpbml0aWFsaXplX2NhcmQoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIHRyaWdnZXJfdHJhbnNtaXQoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIHRyaWdnZXJfcmVjZWl2ZShzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgc2V0dXBfZGVzY3JpcHRvcnMoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9kZXNjcmlwdG9ycyhzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIGludCBsaW5rX3N0YXR1c19jaGFuZ2VkKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CitzdGF0aWMgdm9pZCBhY3RpdmF0ZV9yZWNlaXZlcihzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV9yZWNlaXZlcihzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgYWN0aXZhdGVfdHJhbnNtaXR0ZXIoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIGRlYWN0aXZhdGVfdHJhbnNtaXR0ZXIoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIGVuYWJsZV90cmFuc21pdF9pbnRlcnJ1cHQoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIGVuYWJsZV9yZWNlaXZlX2ludGVycnVwdChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgZW5hYmxlX2xpbmtfaW50ZXJydXB0KHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CitzdGF0aWMgdm9pZCBkaXNhYmxlX2FsbF9pbnRlcnJ1cHRzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CitzdGF0aWMgaW50IGxpbmtfc3RhdHVzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CisKKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgeGlyY29tX3BjaV90YWJsZVtdID0geworCXsweDExNUQsIDB4MDAwMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCXswLH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHhpcmNvbV9wY2lfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgeGlyY29tX29wcyA9IHsKKwkubmFtZQkJPSAieGlyY29tX2NiIiwgCisJLmlkX3RhYmxlCT0geGlyY29tX3BjaV90YWJsZSwgCisJLnByb2JlCQk9IHhpcmNvbV9wcm9iZSwgCisJLnJlbW92ZQkJPSB4aXJjb21fcmVtb3ZlLCAKKwkuc3VzcGVuZCA9TlVMTCwKKwkucmVzdW1lID1OVUxMCit9OworCisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgcHJpbnRfYmluYXJ5KHVuc2lnbmVkIGludCBudW1iZXIpCit7CisJaW50IGksaTI7CisJY2hhciBidWZmZXJbNjRdOworCW1lbXNldChidWZmZXIsMCw2NCk7CisJaTI9MDsKKwlmb3IgKGk9MzE7aT49MDtpLS0pIHsKKwkJaWYgKG51bWJlciAmICgxPDxpKSkKKwkJCWJ1ZmZlcltpMisrXT0nMSc7CisJCWVsc2UKKwkJCWJ1ZmZlcltpMisrXT0nMCc7CisJCWlmICgoaSYzKT09MCkgCisJCQlidWZmZXJbaTIrK109JyAnOworCX0KKwlwcmludGsoIiVzXG4iLGJ1ZmZlcik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnByaXZhdGUgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgInhpcmNvbV9jYiIpOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocHJpdmF0ZS0+cGRldikpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorfTsKKworLyogeGlyY29tX3Byb2JlIGlzIHRoZSBjb2RlIHRoYXQgZ2V0cyBjYWxsZWQgb24gZGV2aWNlIGluc2VydGlvbi4KKyAgIGl0IHNldHMgdXAgdGhlIGhhcmR3YXJlIGFuZCByZWdpc3RlcnMgdGhlIGRldmljZSB0byB0aGUgbmV0d29ya2xheWVyLgorICAgCisgICBUT0RPOiBTZW5kIDEgb3IgMiAiZHVtbXkiIHBhY2tldHMgaGVyZSBhcyB0aGUgY2FyZCBzZWVtcyB0byBkaXNjYXJkIHRoZQorICAgICAgICAgZmlyc3QgdHdvIHBhY2tldHMgdGhhdCBnZXQgc2VuZCwgYW5kIHB1bXAgaGF0ZXMgdGhhdC4KKyAgICAgICAgIAorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCB4aXJjb21fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnByaXZhdGU7CisJdW5zaWduZWQgY2hhciBjaGlwX3JldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHNob3J0IHRtcDE2OworCWVudGVyKCJ4aXJjb21fcHJvYmUiKTsKKwkKKwkvKiBGaXJzdCBkbyB0aGUgUENJIGluaXRpYWxpc2F0aW9uICovCisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCXJldHVybiAtRU5PREVWOworCisJLyogZGlzYWJsZSBhbGwgcG93ZXJtYW5hZ2VtZW50ICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfUE9XRVJNR01ULCAweDAwMDApOworCQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOyAvKiBXaHkgaXNuJ3QgdGhpcyBkb25lIGJ5IHBjaV9lbmFibGVfZGV2aWNlID8qLworCisJLyogY2xlYXIgUENJIHN0YXR1cywgaWYgYW55ICovIAorCXBjaV9yZWFkX2NvbmZpZ193b3JkIChwZGV2LFBDSV9TVEFUVVMsICZ0bXAxNik7IAorCXBjaV93cml0ZV9jb25maWdfd29yZCAocGRldiwgUENJX1NUQVRVUyx0bXAxNik7CisJCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmY2hpcF9yZXYpOworCQorCWlmICghcmVxdWVzdF9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCAxMjgsICJ4aXJjb21fY2IiKSkgeworCQlwcmludGsoS0VSTl9FUlIgInhpcmNvbV9wcm9iZTogZmFpbGVkIHRvIGFsbG9jYXRlIGlvLXJlZ2lvblxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIAorCSAgIEJlZm9yZSBjaGFuZ2luZyB0aGUgaGFyZHdhcmUsIGFsbG9jYXRlIHRoZSBtZW1vcnkuCisJICAgVGhpcyB3YXksIHdlIGNhbiBmYWlsIGdyYWNlZnVsbHkgaWYgbm90IGVub3VnaCBtZW1vcnkKKwkgICBpcyBhdmFpbGFibGUuIAorCSAqLworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgeGlyY29tX3ByaXZhdGUpKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgInhpcmNvbV9wcm9iZTogZmFpbGVkIHRvIGFsbG9jYXRlIGV0aGVyZGV2XG4iKTsKKwkJZ290byBkZXZpY2VfZmFpbDsKKwl9CisJcHJpdmF0ZSA9IG5ldGRldl9wcml2KGRldik7CisJCisJLyogQWxsb2NhdGUgdGhlIHNlbmQvcmVjZWl2ZSBidWZmZXJzICovCisJcHJpdmF0ZS0+cnhfYnVmZmVyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiw4MTkyLCZwcml2YXRlLT5yeF9kbWFfaGFuZGxlKTsKKwlpZiAocHJpdmF0ZS0+cnhfYnVmZmVyID09IE5VTEwpIHsKKyAJCXByaW50ayhLRVJOX0VSUiAieGlyY29tX3Byb2JlOiBubyBtZW1vcnkgZm9yIHJ4IGJ1ZmZlciBcbiIpOworCQlnb3RvIHJ4X2J1Zl9mYWlsOworCX0JCisJcHJpdmF0ZS0+dHhfYnVmZmVyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiw4MTkyLCZwcml2YXRlLT50eF9kbWFfaGFuZGxlKTsKKwlpZiAocHJpdmF0ZS0+dHhfYnVmZmVyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ4aXJjb21fcHJvYmU6IG5vIG1lbW9yeSBmb3IgdHggYnVmZmVyIFxuIik7CisJCWdvdG8gdHhfYnVmX2ZhaWw7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKworCXByaXZhdGUtPmRldiA9IGRldjsKKwlwcml2YXRlLT5wZGV2ID0gcGRldjsKKwlwcml2YXRlLT5pb19wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCXNwaW5fbG9ja19pbml0KCZwcml2YXRlLT5sb2NrKTsKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPmJhc2VfYWRkciA9IHByaXZhdGUtPmlvX3BvcnQ7CisJCisJaW5pdGlhbGl6ZV9jYXJkKHByaXZhdGUpOworCXJlYWRfbWFjX2FkZHJlc3MocHJpdmF0ZSk7CisJc2V0dXBfZGVzY3JpcHRvcnMocHJpdmF0ZSk7CisJCisJZGV2LT5vcGVuID0gJnhpcmNvbV9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnhpcmNvbV9zdGFydF94bWl0OworCWRldi0+c3RvcCA9ICZ4aXJjb21fY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmeGlyY29tX2dldF9zdGF0czsKKwlkZXYtPnByaXYgPSBwcml2YXRlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmeGlyY29tX3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgorCVNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAieGlyY29tX3Byb2JlOiBuZXRkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZC5cbiIpOworCQlnb3RvIHJlZ19mYWlsOworCX0KKwkJCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFhpcmNvbSBjYXJkYnVzIHJldmlzaW9uICVpIGF0IGlycSAlaSBcbiIsIGRldi0+bmFtZSwgY2hpcF9yZXYsIHBkZXYtPmlycSk7CisJLyogc3RhcnQgdGhlIHRyYW5zbWl0dGVyIHRvIGdldCBhIGhlYXJ0YmVhdCAqLworCS8qIFRPRE86IHNlbmQgMiBkdW1teSBwYWNrZXRzIGhlcmUgKi8KKwl0cmFuc2NlaXZlcl92b29kb28ocHJpdmF0ZSk7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXZhdGUtPmxvY2ssZmxhZ3MpOworCWFjdGl2YXRlX3RyYW5zbWl0dGVyKHByaXZhdGUpOworCWFjdGl2YXRlX3JlY2VpdmVyKHByaXZhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXZhdGUtPmxvY2ssZmxhZ3MpOworCQorCXRyaWdnZXJfcmVjZWl2ZShwcml2YXRlKTsKKwkKKwlsZWF2ZSgieGlyY29tX3Byb2JlIik7CisJcmV0dXJuIDA7CisKK3JlZ19mYWlsOgorCWtmcmVlKHByaXZhdGUtPnR4X2J1ZmZlcik7Cit0eF9idWZfZmFpbDoKKwlrZnJlZShwcml2YXRlLT5yeF9idWZmZXIpOworcnhfYnVmX2ZhaWw6CisJZnJlZV9uZXRkZXYoZGV2KTsKK2RldmljZV9mYWlsOgorCXJldHVybiAtRU5PREVWOworfQorCisKKy8qCisgeGlyY29tX3JlbW92ZSBpcyBjYWxsZWQgb24gbW9kdWxlLXVubG9hZCBvciBvbiBkZXZpY2UtZWplY3QuCisgaXQgdW5yZWdpc3RlcnMgdGhlIGlycSwgaW8tcmVnaW9uIGFuZCBuZXR3b3JrIGRldmljZS4KKyBJbnRlcnJ1cHRzIGFuZCBzdWNoIGFyZSBhbHJlYWR5IHN0b3BwZWQgaW4gdGhlICJpZmNvbmZpZyBldGhYIGRvd24iCisgY29kZS4KKyAqLworc3RhdGljIHZvaWQgX19kZXZleGl0IHhpcmNvbV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZW50ZXIoInhpcmNvbV9yZW1vdmUiKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsODE5MixjYXJkLT5yeF9idWZmZXIsY2FyZC0+cnhfZG1hX2hhbmRsZSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LDgxOTIsY2FyZC0+dHhfYnVmZmVyLGNhcmQtPnR4X2RtYV9oYW5kbGUpOworCisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIDEyOCk7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlsZWF2ZSgieGlyY29tX3JlbW92ZSIpOworfSAKKworc3RhdGljIGlycXJldHVybl90IHhpcmNvbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJaW50IGk7CisKKwllbnRlcigieGlyY29tX2ludGVycnVwdFxuIik7CisKKwlzcGluX2xvY2soJmNhcmQtPmxvY2spOworCXN0YXR1cyA9IGlubChjYXJkLT5pb19wb3J0K0NTUjUpOworCisjaWZkZWYgREVCVUcJCisJcHJpbnRfYmluYXJ5KHN0YXR1cyk7CisJcHJpbnRrKCJ0eCBzdGF0dXMgMHglMDh4IDB4JTA4eCBcbiIsY2FyZC0+dHhfYnVmZmVyWzBdLGNhcmQtPnR4X2J1ZmZlcls0XSk7CisJcHJpbnRrKCJyeCBzdGF0dXMgMHglMDh4IDB4JTA4eCBcbiIsY2FyZC0+cnhfYnVmZmVyWzBdLGNhcmQtPnJ4X2J1ZmZlcls0XSk7CisjZW5kaWYJCisJLyogSGFuZGxlIHNoYXJlZCBpcnEgYW5kIGhvdHBsdWcgKi8KKwlpZiAoc3RhdHVzID09IDAgfHwgc3RhdHVzID09IDB4ZmZmZmZmZmYpIHsKKwkJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaWYgKGxpbmtfc3RhdHVzX2NoYW5nZWQoY2FyZCkpIHsKKwkJaW50IG5ld2xpbms7CisJCXByaW50ayhLRVJOX0RFQlVHICJ4aXJjb21fY2I6IExpbmsgc3RhdHVzIGhhcyBjaGFuZ2VkIFxuIik7CisJCW5ld2xpbmsgPSBsaW5rX3N0YXR1cyhjYXJkKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAgInhpcmNvbV9jYjogTGluayBpcyAlaSBtYml0IFxuIixuZXdsaW5rKTsKKwkJaWYgKG5ld2xpbmspCisJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCWVsc2UKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQorCX0KKworCS8qIENsZWFyIGFsbCByZW1haW5pbmcgaW50ZXJydXB0cyAqLwkKKwlzdGF0dXMgfD0gMHhmZmZmZmZmZjsgLyogRklYTUU6IG1ha2UgdGhpcyBjbGVhciBvbmx5IHRoZQorCQkJCSAgICAgICAgcmVhbCBleGlzdGluZyBiaXRzICovCisJb3V0bChzdGF0dXMsY2FyZC0+aW9fcG9ydCtDU1I1KTsKKwkKKworCWZvciAoaT0wO2k8TlVNREVTQ1JJUFRPUlM7aSsrKSAKKwkJaW52ZXN0aWdhdGVfd3JpdGVfZGVzY3JpcHRvcihkZXYsY2FyZCxpLGJ1ZmZlcm9mZnNldHNbaV0pOworCWZvciAoaT0wO2k8TlVNREVTQ1JJUFRPUlM7aSsrKSAKKwkJaW52ZXN0aWdhdGVfcmVhZF9kZXNjcmlwdG9yKGRldixjYXJkLGksYnVmZmVyb2Zmc2V0c1tpXSk7CisKKwkKKwlzcGluX3VubG9jaygmY2FyZC0+bG9jayk7CisJbGVhdmUoInhpcmNvbV9pbnRlcnJ1cHQiKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgeGlyY29tX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbmV4dGRlc2NyaXB0b3I7CisJaW50IGRlc2M7CisJZW50ZXIoInhpcmNvbV9zdGFydF94bWl0Iik7CisJCisJY2FyZCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworCQorCS8qIEZpcnN0IHNlZSBpZiB3ZSBjYW4gZnJlZSBzb21lIGRlc2NyaXB0b3JzICovCisJZm9yIChkZXNjPTA7ZGVzYzxOVU1ERVNDUklQVE9SUztkZXNjKyspIAorCQlpbnZlc3RpZ2F0ZV93cml0ZV9kZXNjcmlwdG9yKGRldixjYXJkLGRlc2MsYnVmZmVyb2Zmc2V0c1tkZXNjXSk7CisJCisJCisJbmV4dGRlc2NyaXB0b3IgPSAoY2FyZC0+dHJhbnNtaXRfdXNlZCArMSkgJSAoTlVNREVTQ1JJUFRPUlMpOworCWRlc2MgPSBjYXJkLT50cmFuc21pdF91c2VkOworCQorCS8qIG9ubHkgc2VuZCB0aGUgcGFja2V0IGlmIHRoZSBkZXNjcmlwdG9yIGlzIGZyZWUgKi8KKwlpZiAoY2FyZC0+dHhfYnVmZmVyWzQqZGVzY109PTApIHsKKwkJCS8qIENvcHkgdGhlIHBhY2tldCBkYXRhOyB6ZXJvIHRoZSBtZW1vcnkgZmlyc3QgYXMgdGhlIGNhcmQKKwkJCSAgIHNvbWV0aW1lcyBzZW5kcyBtb3JlIHRoYW4geW91IGFzayBpdCB0by4gKi8KKwkJCQorCQkJbWVtc2V0KCZjYXJkLT50eF9idWZmZXJbYnVmZmVyb2Zmc2V0c1tkZXNjXS80XSwwLDE1MzYpOworCQkJbWVtY3B5KCYoY2FyZC0+dHhfYnVmZmVyW2J1ZmZlcm9mZnNldHNbZGVzY10vNF0pLHNrYi0+ZGF0YSxza2ItPmxlbik7CisJCisJCisJCQkvKiBGSVhNRTogVGhlIHNwZWNpZmljYXRpb24gdGVsbHMgdXMgdGhhdCB0aGUgbGVuZ3RoIHdlIHNlbmQgSEFTIHRvIGJlIGEgbXVsdGlwbGUgb2YKKwkJCSAgIDQgYnl0ZXMuICovCisJCQkgICAKKwkJCWNhcmQtPnR4X2J1ZmZlcls0KmRlc2MrMV0gPSBza2ItPmxlbjsKKwkJCWlmIChkZXNjID09IE5VTURFU0NSSVBUT1JTLTEpCisJCQkJY2FyZC0+dHhfYnVmZmVyWzQqZGVzYysxXSB8PSAoMTw8MjUpOyAgLyogYml0IDI1OiBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIHJpbmcgKi8KKworCQkJY2FyZC0+dHhfYnVmZmVyWzQqZGVzYysxXSB8PSAweEYwMDAwMDAwOworCQkJCQkJIC8qIDB4RjAuLi4gbWVhbnMgd2FudCBpbnRlcnJ1cHRzKi8gCisJCQljYXJkLT50eF9za2JbZGVzY10gPSBza2I7CisJCQkKKwkJCXdtYigpOworCQkJLyogVGhpcyBnaXZlcyB0aGUgZGVzY3JpcHRvciB0byB0aGUgY2FyZCAqLworCQkJY2FyZC0+dHhfYnVmZmVyWzQqZGVzY10gPSAweDgwMDAwMDAwOworCQkJdHJpZ2dlcl90cmFuc21pdChjYXJkKTsKKwkJCWlmICgoKGludCljYXJkLT50eF9idWZmZXJbbmV4dGRlc2NyaXB0b3IqNF0pPDApIHsJLyogbmV4dCBkZXNjcmlwdG9yIGlzIG9jY3VwaWVkLi4uICovCisJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJfQorCQkJY2FyZC0+dHJhbnNtaXRfdXNlZCA9IG5leHRkZXNjcmlwdG9yOworCQkJbGVhdmUoInhpcmNvbS1zdGFydF94bWl0IC0gc2VudCIpOwkKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJfQorCQorCisKKwkvKiBVaCBvaC4uLiBubyBmcmVlIGRlc2NyaXB0b3IuLi4gZHJvcCB0aGUgcGFja2V0ICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworCXRyaWdnZXJfdHJhbnNtaXQoY2FyZCk7CisJCisJcmV0dXJuIC1FSU87Cit9CisKKworCisKK3N0YXRpYyBpbnQgeGlyY29tX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnhwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0dmFsOworCWVudGVyKCJ4aXJjb21fb3BlbiIpOworCXByaW50ayhLRVJOX0lORk8gInhpcmNvbSBjYXJkYnVzIGFkYXB0b3IgZm91bmQsIHJlZ2lzdGVyaW5nIGFzICVzLCB1c2luZyBpcnEgJWkgXG4iLGRldi0+bmFtZSxkZXYtPmlycSk7CisJcmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZ4aXJjb21faW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJbGVhdmUoInhpcmNvbV9vcGVuIC0gTm8gSVJRIik7CisJCXJldHVybiByZXR2YWw7CisJfQorCQorCXhpcmNvbV91cCh4cCk7CisJeHAtPm9wZW4gPSAxOworCWxlYXZlKCJ4aXJjb21fb3BlbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhpcmNvbV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWVudGVyKCJ4aXJjb21fY2xvc2UiKTsKKwljYXJkID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7IC8qIHdlIGRvbid0IHdhbnQgbmV3IHBhY2tldHMgKi8KKworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLGZsYWdzKTsKKwkKKwlkaXNhYmxlX2FsbF9pbnRlcnJ1cHRzKGNhcmQpOworI2lmIDAJCisJLyogV2UgY2FuIGVuYWJsZSB0aGlzIGFnYWluIG9uY2Ugd2Ugc2VuZCBkdW1teSBwYWNrZXRzIG9uIGlmY29uZmlnIGV0aFggdXAgKi8KKwlkZWFjdGl2YXRlX3JlY2VpdmVyKGNhcmQpOworCWRlYWN0aXZhdGVfdHJhbnNtaXR0ZXIoY2FyZCk7CisjZW5kaWYJCisJcmVtb3ZlX2Rlc2NyaXB0b3JzKGNhcmQpOworCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworCQorCWNhcmQtPm9wZW4gPSAwOworCWZyZWVfaXJxKGRldi0+aXJxLGRldik7CisJCisJbGVhdmUoInhpcmNvbV9jbG9zZSIpOworCQorCXJldHVybiAwOworCQorfQorCisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp4aXJjb21fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHJldHVybiAmY2FyZC0+c3RhdHM7Cit9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIHhpcmNvbV9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJeGlyY29tX2ludGVycnVwdChkZXYtPmlycSwgZGV2LCBOVUxMKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfY2FyZChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWVudGVyKCJpbml0aWFsaXplX2NhcmQiKTsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCS8qIEZpcnN0OiByZXNldCB0aGUgY2FyZCAqLworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSMCk7CisJdmFsIHw9IDB4MDE7CQkvKiBTb2Z0d2FyZSByZXNldCAqLworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSMCk7CisKKwl1ZGVsYXkoMTAwKTsJCS8qIGdpdmUgdGhlIGNhcmQgc29tZSB0aW1lIHRvIHJlc2V0ICovCisKKwl2YWwgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjApOworCXZhbCAmPSB+MHgwMTsJCS8qIGRpc2FibGUgU29mdHdhcmUgcmVzZXQgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjApOworCisKKwl2YWwgPSAwOwkJLyogVmFsdWUgMHgwMCBpcyBhIHNhZmUgYW5kIGNvbnNlcnZhdGl2ZSB2YWx1ZSAKKwkJCQkgICBmb3IgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1IwKTsKKworCisJZGlzYWJsZV9hbGxfaW50ZXJydXB0cyhjYXJkKTsKKwlkZWFjdGl2YXRlX3JlY2VpdmVyKGNhcmQpOworCWRlYWN0aXZhdGVfdHJhbnNtaXR0ZXIoY2FyZCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlsZWF2ZSgiaW5pdGlhbGl6ZV9jYXJkIik7Cit9CisKKy8qCit0cmlnZ2VyX3RyYW5zbWl0IGNhdXNlcyB0aGUgY2FyZCB0byBjaGVjayBmb3IgZnJhbWVzIHRvIGJlIHRyYW5zbWl0dGVkLgorVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgd3JpdGluZyB0byB0aGUgQ1NSMSBwb3J0LiBUaGUgZG9jdW1lbnRhdGlvbgorY2xhaW1zIHRoYXQgdGhlIGFjdCBvZiB3cml0aW5nIGlzIHN1ZmZpY2llbnQgYW5kIHRoYXQgdGhlIHZhbHVlIGlzCitpZ25vcmVkOyBJIGNob3NlIHplcm8uCisqLworc3RhdGljIHZvaWQgdHJpZ2dlcl90cmFuc21pdChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigidHJpZ2dlcl90cmFuc21pdCIpOworCisJdmFsID0gMDsKKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjEpOworCisJbGVhdmUoInRyaWdnZXJfdHJhbnNtaXQiKTsKK30KKworLyoKK3RyaWdnZXJfcmVjZWl2ZSBjYXVzZXMgdGhlIGNhcmQgdG8gY2hlY2sgZm9yIGVtcHR5IGZyYW1lcyBpbiB0aGUKK2Rlc2NyaXB0b3IgbGlzdCBpbiB3aGljaCBwYWNrZXRzIGNhbiBiZSByZWNlaXZlZC4KK1RoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHdyaXRpbmcgdG8gdGhlIENTUjIgcG9ydC4gVGhlIGRvY3VtZW50YXRpb24KK2NsYWltcyB0aGF0IHRoZSBhY3Qgb2Ygd3JpdGluZyBpcyBzdWZmaWNpZW50IGFuZCB0aGF0IHRoZSB2YWx1ZSBpcworaWdub3JlZDsgSSBjaG9zZSB6ZXJvLgorKi8KK3N0YXRpYyB2b2lkIHRyaWdnZXJfcmVjZWl2ZShzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigidHJpZ2dlcl9yZWNlaXZlIik7CisKKwl2YWwgPSAwOworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSMik7CisKKwlsZWF2ZSgidHJpZ2dlcl9yZWNlaXZlIik7Cit9CisKKy8qCitzZXR1cF9kZXNjcmlwdG9ycyBpbml0aWFsaXplcyB0aGUgc2VuZCBhbmQgcmVjZWl2ZSBidWZmZXJzIHRvIGJlIHZhbGlkCitkZXNjcmlwdG9ycyBhbmQgcHJvZ3JhbXMgdGhlIGFkZHJlc3NlcyBpbnRvIHRoZSBjYXJkLgorKi8KK3N0YXRpYyB2b2lkIHNldHVwX2Rlc2NyaXB0b3JzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGludCBhZGRyZXNzOworCWludCBpOworCWVudGVyKCJzZXR1cF9kZXNjcmlwdG9ycyIpOworCisKKwlpZiAoY2FyZC0+cnhfYnVmZmVyID09IE5VTEwpCisJCUJVRygpOworCWlmIChjYXJkLT50eF9idWZmZXIgPT0gTlVMTCkKKwkJQlVHKCk7CisKKwkvKiBSZWNlaXZlIGRlc2NyaXB0b3JzICovCisJbWVtc2V0KGNhcmQtPnJ4X2J1ZmZlciwgMCwgMTI4KTsJLyogY2xlYXIgdGhlIGRlc2NyaXB0b3JzICovCisJZm9yIChpPTA7aTxOVU1ERVNDUklQVE9SUztpKysgKSB7CisKKwkJLyogUnggRGVzY3IwOiBJdCdzIGVtcHR5LCBsZXQgdGhlIGNhcmQgb3duIGl0LCBubyBlcnJvcnMgLT4gMHg4MDAwMDAwMCAqLworCQljYXJkLT5yeF9idWZmZXJbaSo0ICsgMF0gPSAweDgwMDAwMDAwOworCQkvKiBSeCBEZXNjcjE6IGJ1ZmZlciAxIGlzIDE1MzYgYnl0ZXMsIGJ1ZmZlciAyIGlzIDAgYnl0ZXMgKi8KKwkJY2FyZC0+cnhfYnVmZmVyW2kqNCArIDFdID0gMTUzNjsKKwkJaWYgKGk9PU5VTURFU0NSSVBUT1JTLTEpCisJCQljYXJkLT5yeF9idWZmZXJbaSo0ICsgMV0gfD0gKDEgPDwgMjUpOyAvKiBiaXQgMjUgaXMgImxhc3QgZGVzY3JpcHRvciIgKi8KKworCQkvKiBSeCBEZXNjcjI6IGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorCQkgICB3ZSBzdG9yZSB0aGUgYnVmZmVyIGF0IHRoZSAybmQgaGFsZiBvZiB0aGUgcGFnZSAqLworCQorCQlhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpIGNhcmQtPnJ4X2RtYV9oYW5kbGU7CisJCWNhcmQtPnJ4X2J1ZmZlcltpKjQgKyAyXSA9IGNwdV90b19sZTMyKGFkZHJlc3MgKyBidWZmZXJvZmZzZXRzW2ldKTsKKwkJLyogUnggRGVzYzM6IGFkZHJlc3Mgb2YgMm5kIGJ1ZmZlciAtPiAwICovCisJCWNhcmQtPnJ4X2J1ZmZlcltpKjQgKyAzXSA9IDA7CisJfQorCQorCXdtYigpOworCS8qIFdyaXRlIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgcmluZyBhZGRyZXNzIHRvIHRoZSBjYXJkICovCisJYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSBjYXJkLT5yeF9kbWFfaGFuZGxlOworCXZhbCA9IGNwdV90b19sZTMyKGFkZHJlc3MpOyAKKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjMpOwkvKiBSZWNlaXZlIGRlc2NyIGxpc3QgYWRkcmVzcyAqLworCisKKwkvKiB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLworCW1lbXNldChjYXJkLT50eF9idWZmZXIsIDAsIDEyOCk7CS8qIGNsZWFyIHRoZSBkZXNjcmlwdG9ycyAqLworCQorCWZvciAoaT0wO2k8TlVNREVTQ1JJUFRPUlM7aSsrICkgeworCQkvKiBUeCBEZXNjcjA6IEVtcHR5LCB3ZSBvd24gaXQsIG5vIGVycm9ycyAtPiAweDAwMDAwMDAwICovCisJCWNhcmQtPnR4X2J1ZmZlcltpKjQgKyAwXSA9IDB4MDAwMDAwMDA7CisJCS8qIFR4IERlc2NyMTogYnVmZmVyIDEgaXMgMTUzNiBieXRlcywgYnVmZmVyIDIgaXMgMCBieXRlcyAqLworCQljYXJkLT50eF9idWZmZXJbaSo0ICsgMV0gPSAxNTM2OworCQlpZiAoaT09TlVNREVTQ1JJUFRPUlMtMSkKKwkJCWNhcmQtPnR4X2J1ZmZlcltpKjQgKyAxXSB8PSAoMSA8PCAyNSk7IC8qIGJpdCAyNSBpcyAibGFzdCBkZXNjcmlwdG9yIiAqLworCQkKKwkJLyogVHggRGVzY3IyOiBhZGRyZXNzIG9mIHRoZSBidWZmZXIKKwkJICAgd2Ugc3RvcmUgdGhlIGJ1ZmZlciBhdCB0aGUgMm5kIGhhbGYgb2YgdGhlIHBhZ2UgKi8KKwkJYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSBjYXJkLT50eF9kbWFfaGFuZGxlOworCQljYXJkLT50eF9idWZmZXJbaSo0ICsgMl0gPSBjcHVfdG9fbGUzMihhZGRyZXNzICsgYnVmZmVyb2Zmc2V0c1tpXSk7CisJCS8qIFR4IERlc2MzOiBhZGRyZXNzIG9mIDJuZCBidWZmZXIgLT4gMCAqLworCQljYXJkLT50eF9idWZmZXJbaSo0ICsgM10gPSAwOworCX0KKworCXdtYigpOworCS8qIHdpdGUgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZyB0byB0aGUgY2FyZCAqLworCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykgY2FyZC0+dHhfZG1hX2hhbmRsZTsKKwl2YWwgPWNwdV90b19sZTMyKGFkZHJlc3MpOworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSNCk7CS8qIHhtaXQgZGVzY3IgbGlzdCBhZGRyZXNzICovCisKKwlsZWF2ZSgic2V0dXBfZGVzY3JpcHRvcnMiKTsKK30KKworLyoKK3JlbW92ZV9kZXNjcmlwdG9ycyBpbmZvcm1zIHRoZSBjYXJkIHRoZSBkZXNjcmlwdG9ycyBhcmUgbm8gbG9uZ2VyCit2YWxpZCBieSBzZXR0aW5nIHRoZSBhZGRyZXNzIGluIHRoZSBjYXJkIHRvIDB4MDAuCisqLworc3RhdGljIHZvaWQgcmVtb3ZlX2Rlc2NyaXB0b3JzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWVudGVyKCJyZW1vdmVfZGVzY3JpcHRvcnMiKTsKKworCXZhbCA9IDA7CisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1IzKTsJLyogUmVjZWl2ZSBkZXNjcmlwdG9yIGFkZHJlc3MgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjQpOwkvKiBTZW5kIGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCisJbGVhdmUoInJlbW92ZV9kZXNjcmlwdG9ycyIpOworfQorCisvKgorbGlua19zdGF0dXNfY2hhbmdlZCByZXR1cm5zIDEgaWYgdGhlIGNhcmQgaGFzIGluZGljYXRlZCB0aGF0Cit0aGUgbGluayBzdGF0dXMgaGFzIGNoYW5nZWQuIFRoZSBuZXcgbGluayBzdGF0dXMgaGFzIHRvIGJlIHJlYWQgZnJvbSBDU1IxMi4KKworVGhpcyBmdW5jdGlvbiBhbHNvIGNsZWFycyB0aGUgc3RhdHVzLWJpdC4KKyovCitzdGF0aWMgaW50IGxpbmtfc3RhdHVzX2NoYW5nZWQoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJZW50ZXIoImxpbmtfc3RhdHVzX2NoYW5nZWQiKTsKKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSNSk7CS8qIFN0YXR1cyByZWdpc3RlciAqLworCisJaWYgKCh2YWwgJiAoMSA8PCAyNykpID09IDApIHsJLyogbm8gY2hhbmdlICovCisJCWxlYXZlKCJsaW5rX3N0YXR1c19jaGFuZ2VkIC0gbm9jaGFuZ2UiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogY2xlYXIgdGhlIGV2ZW50IGJ5IHdyaXRpbmcgYSAxIHRvIHRoZSBiaXQgaW4gdGhlCisJICAgc3RhdHVzIHJlZ2lzdGVyLiAqLworCXZhbCA9ICgxIDw8IDI3KTsKKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjUpOworCisJbGVhdmUoImxpbmtfc3RhdHVzX2NoYW5nZWQgLSBjaGFuZ2VkIik7CisJcmV0dXJuIDE7Cit9CisKKworLyoKK3RyYW5zbWl0X2FjdGl2ZSByZXR1cm5zIDEgaWYgdGhlIHRyYW5zbWl0dGVyIG9uIHRoZSBjYXJkIGlzCitpbiBhIG5vbi1zdG9wcGVkIHN0YXRlLgorKi8KK3N0YXRpYyBpbnQgdHJhbnNtaXRfYWN0aXZlKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWVudGVyKCJ0cmFuc21pdF9hY3RpdmUiKTsKKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSNSk7CS8qIFN0YXR1cyByZWdpc3RlciAqLworCisJaWYgKCh2YWwgJiAoNyA8PCAyMCkpID09IDApIHsJLyogdHJhbnNtaXR0ZXIgZGlzYWJsZWQgKi8KKwkJbGVhdmUoInRyYW5zbWl0X2FjdGl2ZSAtIGluYWN0aXZlIik7CisJCXJldHVybiAwOworCX0KKworCWxlYXZlKCJ0cmFuc21pdF9hY3RpdmUgLSBhY3RpdmUiKTsKKwlyZXR1cm4gMTsKK30KKworLyoKK3JlY2VpdmVfYWN0aXZlIHJldHVybnMgMSBpZiB0aGUgcmVjZWl2ZXIgb24gdGhlIGNhcmQgaXMKK2luIGEgbm9uLXN0b3BwZWQgc3RhdGUuCisqLworc3RhdGljIGludCByZWNlaXZlX2FjdGl2ZShzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigicmVjZWl2ZV9hY3RpdmUiKTsKKworCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I1KTsJLyogU3RhdHVzIHJlZ2lzdGVyICovCisKKwlpZiAoKHZhbCAmICg3IDw8IDE3KSkgPT0gMCkgewkvKiByZWNlaXZlciBkaXNhYmxlZCAqLworCQlsZWF2ZSgicmVjZWl2ZV9hY3RpdmUgLSBpbmFjdGl2ZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsZWF2ZSgicmVjZWl2ZV9hY3RpdmUgLSBhY3RpdmUiKTsKKwlyZXR1cm4gMTsKK30KKworLyoKK2FjdGl2YXRlX3JlY2VpdmVyIGVuYWJsZXMgdGhlIHJlY2VpdmVyIG9uIHRoZSBjYXJkLgorQmVmb3JlIGJlaW5nIGFsbG93ZWQgdG8gYWN0aXZlIHRoZSByZWNlaXZlciwgdGhlIHJlY2VpdmVyCittdXN0IGJlIGNvbXBsZXRlbHkgZGUtYWN0aXZhdGVkLiBUbyBhY2hpZXZlIHRoaXMsCit0aGlzIGNvZGUgYWN0dWFsbHkgZGlzYWJsZXMgdGhlIHJlY2VpdmVyIGZpcnN0OyB0aGVuIGl0IHdhaXRzIGZvciB0aGUgCityZWNlaXZlciB0byBiZWNvbWUgaW5hY3RpdmUsIHRoZW4gaXQgYWN0aXZhdGVzIHRoZSByZWNlaXZlciBhbmQgdGhlbgoraXQgd2FpdHMgZm9yIHRoZSByZWNlaXZlciB0byBiZSBhY3RpdmUuCisKK211c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KKyovCitzdGF0aWMgdm9pZCBhY3RpdmF0ZV9yZWNlaXZlcihzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY291bnRlcjsKKwllbnRlcigiYWN0aXZhdGVfcmVjZWl2ZXIiKTsKKworCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsJLyogT3BlcmF0aW9uIG1vZGUgKi8KKwkKKwkvKiBJZiB0aGUgImFjdGl2ZSIgYml0IGlzIHNldCBhbmQgdGhlIHJlY2VpdmVyIGlzIGFscmVhZHkKKwkgICBhY3RpdmUsIG5vIG5lZWQgdG8gZG8gdGhlIGV4cGVuc2l2ZSB0aGluZyAqLworCWlmICgodmFsJjIpICYmIChyZWNlaXZlX2FjdGl2ZShjYXJkKSkpCisJCXJldHVybjsKKwkKKwkKKwl2YWwgPSB2YWwgJiB+MjsJCS8qIGRpc2FibGUgdGhlIHJlY2VpdmVyICovCisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsKKworCWNvdW50ZXIgPSAxMDsKKwl3aGlsZSAoY291bnRlciA+IDApIHsKKwkJaWYgKCFyZWNlaXZlX2FjdGl2ZShjYXJkKSkKKwkJCWJyZWFrOworCQkvKiB3YWl0IGEgd2hpbGUgKi8KKwkJdWRlbGF5KDUwKTsKKwkJY291bnRlci0tOworCQlpZiAoY291bnRlciA8PSAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJ4aXJjb21fY2I6IFJlY2VpdmVyIGZhaWxlZCB0byBkZWFjdGl2YXRlXG4iKTsKKwl9CisKKwkvKiBlbmFibGUgdGhlIHJlY2VpdmVyICovCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsJLyogT3BlcmF0aW9uIG1vZGUgKi8KKwl2YWwgPSB2YWwgfCAyOwkJCQkvKiBlbmFibGUgdGhlIHJlY2VpdmVyICovCisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsKKworCS8qIG5vdyB3YWl0IGZvciB0aGUgY2FyZCB0byBhY3RpdmF0ZSBhZ2FpbiAqLworCWNvdW50ZXIgPSAxMDsKKwl3aGlsZSAoY291bnRlciA+IDApIHsKKwkJaWYgKHJlY2VpdmVfYWN0aXZlKGNhcmQpKQorCQkJYnJlYWs7CisJCS8qIHdhaXQgYSB3aGlsZSAqLworCQl1ZGVsYXkoNTApOworCQljb3VudGVyLS07CisJCWlmIChjb3VudGVyIDw9IDApCisJCQlwcmludGsoS0VSTl9FUlIgInhpcmNvbV9jYjogUmVjZWl2ZXIgZmFpbGVkIHRvIHJlLWFjdGl2YXRlXG4iKTsKKwl9CisKKwlsZWF2ZSgiYWN0aXZhdGVfcmVjZWl2ZXIiKTsKK30KKworLyoKK2RlYWN0aXZhdGVfcmVjZWl2ZXIgZGlzYWJsZXMgdGhlIHJlY2VpdmVyIG9uIHRoZSBjYXJkLgorVG8gYWNoaWV2ZSB0aGlzIHRoaXMgY29kZSBkaXNhYmxlcyB0aGUgcmVjZWl2ZXIgZmlyc3Q7IAordGhlbiBpdCB3YWl0cyBmb3IgdGhlIHJlY2VpdmVyIHRvIGJlY29tZSBpbmFjdGl2ZS4KKworbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIGRlYWN0aXZhdGVfcmVjZWl2ZXIoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNvdW50ZXI7CisJZW50ZXIoImRlYWN0aXZhdGVfcmVjZWl2ZXIiKTsKKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSNik7CS8qIE9wZXJhdGlvbiBtb2RlICovCisJdmFsID0gdmFsICYgfjI7CQkJCS8qIGRpc2FibGUgdGhlIHJlY2VpdmVyICovCisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsKKworCWNvdW50ZXIgPSAxMDsKKwl3aGlsZSAoY291bnRlciA+IDApIHsKKwkJaWYgKCFyZWNlaXZlX2FjdGl2ZShjYXJkKSkKKwkJCWJyZWFrOworCQkvKiB3YWl0IGEgd2hpbGUgKi8KKwkJdWRlbGF5KDUwKTsKKwkJY291bnRlci0tOworCQlpZiAoY291bnRlciA8PSAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJ4aXJjb21fY2I6IFJlY2VpdmVyIGZhaWxlZCB0byBkZWFjdGl2YXRlXG4iKTsKKwl9CisKKworCWxlYXZlKCJkZWFjdGl2YXRlX3JlY2VpdmVyIik7Cit9CisKKworLyoKK2FjdGl2YXRlX3RyYW5zbWl0dGVyIGVuYWJsZXMgdGhlIHRyYW5zbWl0dGVyIG9uIHRoZSBjYXJkLgorQmVmb3JlIGJlaW5nIGFsbG93ZWQgdG8gYWN0aXZlIHRoZSB0cmFuc21pdHRlciwgdGhlIHRyYW5zbWl0dGVyCittdXN0IGJlIGNvbXBsZXRlbHkgZGUtYWN0aXZhdGVkLiBUbyBhY2hpZXZlIHRoaXMsCit0aGlzIGNvZGUgYWN0dWFsbHkgZGlzYWJsZXMgdGhlIHRyYW5zbWl0dGVyIGZpcnN0OyB0aGVuIGl0IHdhaXRzIGZvciB0aGUgCit0cmFuc21pdHRlciB0byBiZWNvbWUgaW5hY3RpdmUsIHRoZW4gaXQgYWN0aXZhdGVzIHRoZSB0cmFuc21pdHRlciBhbmQgdGhlbgoraXQgd2FpdHMgZm9yIHRoZSB0cmFuc21pdHRlciB0byBiZSBhY3RpdmUgYWdhaW4uCisKK211c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KKyovCitzdGF0aWMgdm9pZCBhY3RpdmF0ZV90cmFuc21pdHRlcihzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY291bnRlcjsKKwllbnRlcigiYWN0aXZhdGVfdHJhbnNtaXR0ZXIiKTsKKworCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsJLyogT3BlcmF0aW9uIG1vZGUgKi8KKworCS8qIElmIHRoZSAiYWN0aXZlIiBiaXQgaXMgc2V0IGFuZCB0aGUgcmVjZWl2ZXIgaXMgYWxyZWFkeQorCSAgIGFjdGl2ZSwgbm8gbmVlZCB0byBkbyB0aGUgZXhwZW5zaXZlIHRoaW5nICovCSAKKwlpZiAoKHZhbCYoMTw8MTMpKSAmJiAodHJhbnNtaXRfYWN0aXZlKGNhcmQpKSkKKwkJcmV0dXJuOworCisJdmFsID0gdmFsICYgfigxIDw8IDEzKTsJLyogZGlzYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjYpOworCisJY291bnRlciA9IDEwOworCXdoaWxlIChjb3VudGVyID4gMCkgeworCQlpZiAoIXRyYW5zbWl0X2FjdGl2ZShjYXJkKSkKKwkJCWJyZWFrOworCQkvKiB3YWl0IGEgd2hpbGUgKi8KKwkJdWRlbGF5KDUwKTsKKwkJY291bnRlci0tOworCQlpZiAoY291bnRlciA8PSAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJ4aXJjb21fY2I6IFRyYW5zbWl0dGVyIGZhaWxlZCB0byBkZWFjdGl2YXRlXG4iKTsKKwl9CisKKwkvKiBlbmFibGUgdGhlIHRyYW5zbWl0dGVyICovCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsJLyogT3BlcmF0aW9uIG1vZGUgKi8KKwl2YWwgPSB2YWwgfCAoMSA8PCAxMyk7CS8qIGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjYpOworCisJLyogbm93IHdhaXQgZm9yIHRoZSBjYXJkIHRvIGFjdGl2YXRlIGFnYWluICovCisJY291bnRlciA9IDEwOworCXdoaWxlIChjb3VudGVyID4gMCkgeworCQlpZiAodHJhbnNtaXRfYWN0aXZlKGNhcmQpKQorCQkJYnJlYWs7CisJCS8qIHdhaXQgYSB3aGlsZSAqLworCQl1ZGVsYXkoNTApOworCQljb3VudGVyLS07CisJCWlmIChjb3VudGVyIDw9IDApCisJCQlwcmludGsoS0VSTl9FUlIgInhpcmNvbV9jYjogVHJhbnNtaXR0ZXIgZmFpbGVkIHRvIHJlLWFjdGl2YXRlXG4iKTsKKwl9CisKKwlsZWF2ZSgiYWN0aXZhdGVfdHJhbnNtaXR0ZXIiKTsKK30KKworLyoKK2RlYWN0aXZhdGVfdHJhbnNtaXR0ZXIgZGlzYWJsZXMgdGhlIHRyYW5zbWl0dGVyIG9uIHRoZSBjYXJkLgorVG8gYWNoaWV2ZSB0aGlzIHRoaXMgY29kZSBkaXNhYmxlcyB0aGUgdHJhbnNtaXR0ZXIgZmlyc3Q7IAordGhlbiBpdCB3YWl0cyBmb3IgdGhlIHRyYW5zbWl0dGVyIHRvIGJlY29tZSBpbmFjdGl2ZS4KKworbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIGRlYWN0aXZhdGVfdHJhbnNtaXR0ZXIoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNvdW50ZXI7CisJZW50ZXIoImRlYWN0aXZhdGVfdHJhbnNtaXR0ZXIiKTsKKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSNik7CS8qIE9wZXJhdGlvbiBtb2RlICovCisJdmFsID0gdmFsICYgfjI7CQkvKiBkaXNhYmxlIHRoZSB0cmFuc21pdHRlciAqLworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSNik7CisKKwljb3VudGVyID0gMjA7CisJd2hpbGUgKGNvdW50ZXIgPiAwKSB7CisJCWlmICghdHJhbnNtaXRfYWN0aXZlKGNhcmQpKQorCQkJYnJlYWs7CisJCS8qIHdhaXQgYSB3aGlsZSAqLworCQl1ZGVsYXkoNTApOworCQljb3VudGVyLS07CisJCWlmIChjb3VudGVyIDw9IDApCisJCQlwcmludGsoS0VSTl9FUlIgInhpcmNvbV9jYjogVHJhbnNtaXR0ZXIgZmFpbGVkIHRvIGRlYWN0aXZhdGVcbiIpOworCX0KKworCisJbGVhdmUoImRlYWN0aXZhdGVfdHJhbnNtaXR0ZXIiKTsKK30KKworCisvKgorZW5hYmxlX3RyYW5zbWl0X2ludGVycnVwdCBlbmFibGVzIHRoZSB0cmFuc21pdCBpbnRlcnJ1cHQKKworbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIGVuYWJsZV90cmFuc21pdF9pbnRlcnJ1cHQoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJZW50ZXIoImVuYWJsZV90cmFuc21pdF9pbnRlcnJ1cHQiKTsKKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSNyk7CS8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKwl2YWwgfD0gMTsJCQkJLyogZW5hYmxlIHRoZSB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjcpOworCisJbGVhdmUoImVuYWJsZV90cmFuc21pdF9pbnRlcnJ1cHQiKTsKK30KKworCisvKgorZW5hYmxlX3JlY2VpdmVfaW50ZXJydXB0IGVuYWJsZXMgdGhlIHJlY2VpdmUgaW50ZXJydXB0CisKK211c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KKyovCitzdGF0aWMgdm9pZCBlbmFibGVfcmVjZWl2ZV9pbnRlcnJ1cHQoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJZW50ZXIoImVuYWJsZV9yZWNlaXZlX2ludGVycnVwdCIpOworCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I3KTsJLyogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworCXZhbCA9IHZhbCB8ICgxIDw8IDYpOwkJCS8qIGVuYWJsZSB0aGUgcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjcpOworCisJbGVhdmUoImVuYWJsZV9yZWNlaXZlX2ludGVycnVwdCIpOworfQorCisvKgorZW5hYmxlX2xpbmtfaW50ZXJydXB0IGVuYWJsZXMgdGhlIGxpbmsgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQKKworbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIGVuYWJsZV9saW5rX2ludGVycnVwdChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigiZW5hYmxlX2xpbmtfaW50ZXJydXB0Iik7CisKKwl2YWwgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjcpOwkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisJdmFsID0gdmFsIHwgKDEgPDwgMjcpOwkJCS8qIGVuYWJsZSB0aGUgbGluayBzdGF0dXMgY2hhZ2UgaW50ZXJydXB0ICovCisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1I3KTsKKworCWxlYXZlKCJlbmFibGVfbGlua19pbnRlcnJ1cHQiKTsKK30KKworCisKKy8qCitkaXNhYmxlX2FsbF9pbnRlcnJ1cHRzIGRpc2FibGVzIGFsbCBpbnRlcnJ1cHRzCisKK211c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KKyovCitzdGF0aWMgdm9pZCBkaXNhYmxlX2FsbF9pbnRlcnJ1cHRzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWVudGVyKCJlbmFibGVfYWxsX2ludGVycnVwdHMiKTsKKwkKKwl2YWwgPSAwOwkJCQkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1I3KTsKKworCWxlYXZlKCJkaXNhYmxlX2FsbF9pbnRlcnJ1cHRzIik7Cit9CisKKy8qCitlbmFibGVfY29tbW9uX2ludGVycnVwdHMgZW5hYmxlcyBzZXZlcmFsIHdlaXJkIGludGVycnVwdHMKKworbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIGVuYWJsZV9jb21tb25faW50ZXJydXB0cyhzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigiZW5hYmxlX2xpbmtfaW50ZXJydXB0Iik7CisKKwl2YWwgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjcpOwkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisJdmFsIHw9ICgxPDwxNik7IC8qIE5vcm1hbCBJbnRlcnJ1cHQgU3VtbWFyeSAqLworCXZhbCB8PSAoMTw8MTUpOyAvKiBBYm5vcm1hbCBJbnRlcnJ1cHQgU3VtbWFyeSAqLworCXZhbCB8PSAoMTw8MTMpOyAvKiBGYXRhbCBidXMgZXJyb3IgKi8KKwl2YWwgfD0gKDE8PDgpOyAgLyogUmVjZWl2ZSBQcm9jZXNzIFN0b3BwZWQgKi8KKwl2YWwgfD0gKDE8PDcpOyAgLyogUmVjZWl2ZSBCdWZmZXIgVW5hdmFpbGFibGUgKi8KKwl2YWwgfD0gKDE8PDUpOyAgLyogVHJhbnNtaXQgVW5kZXJmbG93ICovCisJdmFsIHw9ICgxPDwyKTsgIC8qIFRyYW5zbWl0IEJ1ZmZlciBVbmF2YWlsYWJsZSAqLworCXZhbCB8PSAoMTw8MSk7ICAvKiBUcmFuc21pdCBQcm9jZXNzIFN0b3BwZWQgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjcpOworCisJbGVhdmUoImVuYWJsZV9saW5rX2ludGVycnVwdCIpOworfQorCisvKgorZW5hYmxlX3Byb21pc2Mgc3RhcnRzIHByb21pc2MgbW9kZQorCittdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQuCisqLworc3RhdGljIGludCBlbmFibGVfcHJvbWlzYyhzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigiZW5hYmxlX3Byb21pc2MiKTsKKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSNik7CQorCXZhbCA9IHZhbCB8ICgxIDw8IDYpOwkKKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjYpOworCisJbGVhdmUoImVuYWJsZV9wcm9taXNjIik7CisJcmV0dXJuIDE7Cit9CisKKworCisKKy8qIAorbGlua19zdGF0dXMoKSBjaGVja3MgdGhlIHRoZSBsaW5rcyBzdGF0dXMgYW5kIHdpbGwgcmV0dXJuIDAgZm9yIG5vIGxpbmssIDEwIGZvciAxMG1iaXQgbGluayBhbmQgMTAwIGZvci4uIGd1ZXNzIHdoYXQuCisKK011c3QgYmUgY2FsbGVkIGluIGxvY2tlZCBzdGF0ZSB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQKKyovCitzdGF0aWMgaW50IGxpbmtfc3RhdHVzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWVudGVyKCJsaW5rX3N0YXR1cyIpOworCQorCXZhbCA9IGluYihjYXJkLT5pb19wb3J0ICsgQ1NSMTIpOworCQorCWlmICghKHZhbCYoMTw8MikpKSAgLyogYml0IDIgaXMgMCBmb3IgMTBtYml0IGxpbmssIDEgZm9yIG5vdCBhbiAxMG1iaXQgbGluayAqLworCQlyZXR1cm4gMTA7CisJaWYgKCEodmFsJigxPDwxKSkpICAvKiBiaXQgMSBpcyAwIGZvciAxMDBtYml0IGxpbmssIDEgZm9yIG5vdCBhbiAxMDBtYml0IGxpbmsgKi8KKwkJcmV0dXJuIDEwMDsKKwkJCisJLyogSWYgd2UgZ2V0IGhlcmUgLT4gbm8gbGluayBhdCBhbGwgKi8JCisKKwlsZWF2ZSgibGlua19zdGF0dXMiKTsKKwlyZXR1cm4gMDsKK30KKworCisKKworCisvKgorICByZWFkX21hY19hZGRyZXNzKCkgcmVhZHMgdGhlIE1BQyBhZGRyZXNzIGZyb20gdGhlIE5JQyBhbmQgc3RvcmVzIGl0IGluIHRoZSAiZGV2IiBzdHJ1Y3R1cmUuCisgCisgIFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIHRoZSBzcGlubG9jayBpdHNlbGYgYW5kIGNhbiwgYXMgYSByZXN1bHQsIG5vdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWx0LgorICovCitzdGF0aWMgdm9pZCByZWFkX21hY19hZGRyZXNzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGosIHR1cGxlLCBsaW5rLCBkYXRhX2lkLCBkYXRhX2NvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwllbnRlcigicmVhZF9tYWNfYWRkcmVzcyIpOworCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJb3V0bCgxIDw8IDEyLCBjYXJkLT5pb19wb3J0ICsgQ1NSOSk7CS8qIGVuYWJsZSBib290IHJvbSBhY2Nlc3MgKi8KKwlmb3IgKGkgPSAweDEwMDsgaSA8IDB4MWY3OyBpICs9IGxpbmsgKyAyKSB7CisJCW91dGwoaSwgY2FyZC0+aW9fcG9ydCArIENTUjEwKTsKKwkJdHVwbGUgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjkpICYgMHhmZjsKKwkJb3V0bChpICsgMSwgY2FyZC0+aW9fcG9ydCArIENTUjEwKTsKKwkJbGluayA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSOSkgJiAweGZmOworCQlvdXRsKGkgKyAyLCBjYXJkLT5pb19wb3J0ICsgQ1NSMTApOworCQlkYXRhX2lkID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I5KSAmIDB4ZmY7CisJCW91dGwoaSArIDMsIGNhcmQtPmlvX3BvcnQgKyBDU1IxMCk7CisJCWRhdGFfY291bnQgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjkpICYgMHhmZjsKKwkJaWYgKCh0dXBsZSA9PSAweDIyKSAmJiAoZGF0YV9pZCA9PSAweDA0KSAmJiAoZGF0YV9jb3VudCA9PSAweDA2KSkgeworCQkJLyogCisJCQkgKiBUaGlzIGlzIGl0LiAgV2UgaGF2ZSB0aGUgZGF0YSB3ZSB3YW50LgorCQkJICovCisJCQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7CisJCQkJb3V0bChpICsgaiArIDQsIGNhcmQtPmlvX3BvcnQgKyBDU1IxMCk7CisJCQkJY2FyZC0+ZGV2LT5kZXZfYWRkcltqXSA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSOSkgJiAweGZmOworCQkJfQorCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAobGluayA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisjaWZkZWYgREVCVUcKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiVjJTIuMlgiLCBpID8gJzonIDogJyAnLCBjYXJkLT5kZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlsZWF2ZSgicmVhZF9tYWNfYWRkcmVzcyIpOworfQorCisKKy8qCisgdHJhbnNjZWl2ZXJfdm9vZG9vKCkgZW5hYmxlcyB0aGUgZXh0ZXJuYWwgVVRQIHBsdWcgdGhpbmd5LgorIGl0J3MgY2FsbGVkIHZvb2RvbyBhcyBJIHN0b2xlIHRoaXMgY29kZSBhbmQgY2Fubm90IGNyb3NzLXJlZmVyZW5jZQorIGl0IHdpdGggdGhlIHNwZWNpZmljYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIHRyYW5zY2VpdmVyX3Zvb2RvbyhzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWVudGVyKCJ0cmFuc2NlaXZlcl92b29kb28iKTsKKworCS8qIGRpc2FibGUgYWxsIHBvd2VybWFuYWdlbWVudCAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoY2FyZC0+cGRldiwgUENJX1BPV0VSTUdNVCwgMHgwMDAwKTsKKworCXNldHVwX2Rlc2NyaXB0b3JzKGNhcmQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCW91dGwoMHgwMDA4LCBjYXJkLT5pb19wb3J0ICsgQ1NSMTUpOworICAgICAgICB1ZGVsYXkoMjUpOyAgCisgICAgICAgIG91dGwoMHhhODA1MDAwMCwgY2FyZC0+aW9fcG9ydCArIENTUjE1KTsKKyAgICAgICAgdWRlbGF5KDI1KTsKKyAgICAgICAgb3V0bCgweGEwMGYwMDAwLCBjYXJkLT5pb19wb3J0ICsgQ1NSMTUpOworICAgICAgICB1ZGVsYXkoMjUpOworICAgICAgICAKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJbmV0aWZfc3RhcnRfcXVldWUoY2FyZC0+ZGV2KTsKKwlsZWF2ZSgidHJhbnNjZWl2ZXJfdm9vZG9vIik7Cit9CisKKworc3RhdGljIHZvaWQgeGlyY29tX3VwKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJZW50ZXIoInhpcmNvbV91cCIpOworCisJLyogZGlzYWJsZSBhbGwgcG93ZXJtYW5hZ2VtZW50ICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChjYXJkLT5wZGV2LCBQQ0lfUE9XRVJNR01ULCAweDAwMDApOworCisJc2V0dXBfZGVzY3JpcHRvcnMoY2FyZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJCisJZW5hYmxlX2xpbmtfaW50ZXJydXB0KGNhcmQpOworCWVuYWJsZV90cmFuc21pdF9pbnRlcnJ1cHQoY2FyZCk7CisJZW5hYmxlX3JlY2VpdmVfaW50ZXJydXB0KGNhcmQpOworCWVuYWJsZV9jb21tb25faW50ZXJydXB0cyhjYXJkKTsKKwllbmFibGVfcHJvbWlzYyhjYXJkKTsKKwkKKwkvKiBUaGUgY2FyZCBjYW4gaGF2ZSByZWNlaXZlZCBwYWNrZXRzIGFscmVhZHksIHJlYWQgdGhlbSBhd2F5IG5vdyAqLworCWZvciAoaT0wO2k8TlVNREVTQ1JJUFRPUlM7aSsrKSAKKwkJaW52ZXN0aWdhdGVfcmVhZF9kZXNjcmlwdG9yKGNhcmQtPmRldixjYXJkLGksYnVmZmVyb2Zmc2V0c1tpXSk7CisKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwl0cmlnZ2VyX3JlY2VpdmUoY2FyZCk7CisJdHJpZ2dlcl90cmFuc21pdChjYXJkKTsKKwluZXRpZl9zdGFydF9xdWV1ZShjYXJkLT5kZXYpOworCWxlYXZlKCJ4aXJjb21fdXAiKTsKK30KKworLyogQnVmZmVyb2Zmc2V0IGlzIGluIEJZVEVTICovCitzdGF0aWMgdm9pZCBpbnZlc3RpZ2F0ZV9yZWFkX2Rlc2NyaXB0b3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQsIGludCBkZXNjbnIsIHVuc2lnbmVkIGludCBidWZmZXJvZmZzZXQpCit7CisJCWludCBzdGF0dXM7CQkKKwkJCisJCWVudGVyKCJpbnZlc3RpZ2F0ZV9yZWFkX2Rlc2NyaXB0b3IiKTsKKwkJc3RhdHVzID0gY2FyZC0+cnhfYnVmZmVyWzQqZGVzY25yXTsKKwkJCisJCWlmICgoc3RhdHVzID4gMCkpIHsJLyogcGFja2V0IHJlY2VpdmVkICovCisJCQorCQkJLyogVE9ETzogZGlzY2FyZCBlcnJvciBwYWNrZXRzICovCisJCQkKKwkJCXNob3J0IHBrdF9sZW4gPSAoKHN0YXR1cyA+PiAxNikgJiAweDdmZikgLSA0OwkvKiBtaW51cyA0LCB3ZSBkb24ndCB3YW50IHRoZSBDUkMgKi8KKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCWlmIChwa3RfbGVuID4gMTUxOCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAieGlyY29tX2NiOiBQYWNrZXQgbGVuZ3RoICVpIGlzIGJvZ3VzIFxuIixwa3RfbGVuKTsKKwkJCQlwa3RfbGVuID0gMTUxODsKKwkJCX0KKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMik7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQljYXJkLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgKHVuc2lnbmVkIGNoYXIqKSZjYXJkLT5yeF9idWZmZXJbYnVmZmVyb2Zmc2V0IC8gNF0sIHBrdF9sZW4sIDApOworCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJY2FyZC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJY2FyZC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCQorCQkgICAgICBvdXQ6CisJCQkvKiBnaXZlIHRoZSBidWZmZXIgYmFjayB0byB0aGUgY2FyZCAqLworCQkJY2FyZC0+cnhfYnVmZmVyWzQqZGVzY25yXSA9ICAweDgwMDAwMDAwOworCQkJdHJpZ2dlcl9yZWNlaXZlKGNhcmQpOworCQl9CisKKwkJbGVhdmUoImludmVzdGlnYXRlX3JlYWRfZGVzY3JpcHRvciIpOworCit9CisKKworLyogQnVmZmVyb2Zmc2V0IGlzIGluIEJZVEVTICovCitzdGF0aWMgdm9pZCBpbnZlc3RpZ2F0ZV93cml0ZV9kZXNjcmlwdG9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCwgaW50IGRlc2NuciwgdW5zaWduZWQgaW50IGJ1ZmZlcm9mZnNldCkKK3sKKwkJaW50IHN0YXR1czsKKworCQllbnRlcigiaW52ZXN0aWdhdGVfd3JpdGVfZGVzY3JpcHRvciIpOworCQkKKwkJc3RhdHVzID0gY2FyZC0+dHhfYnVmZmVyWzQqZGVzY25yXTsKKyNpZiAwCQkKKwkJaWYgKHN0YXR1cyAmIDB4ODAwMCkgewkvKiBNYWpvciBlcnJvciAqLworCQkJcHJpbnRrKEtFUk5fRVJSICJNYWpvciB0cmFuc21pdCBlcnJvciBzdGF0dXMgJXggXG4iLCBzdGF0dXMpOworCQkJY2FyZC0+dHhfYnVmZmVyWzQqZGVzY25yXSA9IDA7CisJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQl9CisjZW5kaWYKKwkJaWYgKHN0YXR1cyA+IDApIHsJLyogYml0IDMxIGlzIDAgd2hlbiBkb25lICovCisJCQlpZiAoY2FyZC0+dHhfc2tiW2Rlc2Nucl0hPU5VTEwpIHsKKwkJCQljYXJkLT5zdGF0cy50eF9ieXRlcyArPSBjYXJkLT50eF9za2JbZGVzY25yXS0+bGVuOworCQkJCWRldl9rZnJlZV9za2JfaXJxKGNhcmQtPnR4X3NrYltkZXNjbnJdKTsKKwkJCX0KKwkJCWNhcmQtPnR4X3NrYltkZXNjbnJdID0gTlVMTDsKKwkJCS8qIEJpdCA4IGluIHRoZSBzdGF0dXMgZmllbGQgaXMgMSBpZiB0aGVyZSB3YXMgYSBjb2xsaXNpb24gKi8KKwkJCWlmIChzdGF0dXMmKDE8PDgpKQorCQkJCWNhcmQtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCWNhcmQtPnR4X2J1ZmZlcls0KmRlc2Nucl0gPSAwOyAvKiBkZXNjcmlwdG9yIGlzIGZyZWUgYWdhaW4gKi8KKwkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCQljYXJkLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCX0KKworCQlsZWF2ZSgiaW52ZXN0aWdhdGVfd3JpdGVfZGVzY3JpcHRvciIpOworCQkKK30KKworCitzdGF0aWMgaW50IF9faW5pdCB4aXJjb21faW5pdCh2b2lkKQoreworCXBjaV9yZWdpc3Rlcl9kcml2ZXIoJnhpcmNvbV9vcHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgeGlyY29tX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnhpcmNvbV9vcHMpOworfSAKKworbW9kdWxlX2luaXQoeGlyY29tX2luaXQpIAorbW9kdWxlX2V4aXQoeGlyY29tX2V4aXQpCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV90dWxpcF9jYi5jIGIvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX3R1bGlwX2NiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjY2IyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV90dWxpcF9jYi5jCkBAIC0wLDAgKzEsMTc0OCBAQAorLyogeGlyY29tX3R1bGlwX2NiLmM6IEEgWGlyY29tIENCRS0xMDAgZXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4gKi8KKy8qCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5NC0xOTk5IGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlMaW51eCBrZXJuZWwtc3BlY2lmaWMgY2hhbmdlczoKKworCUxLMS4wIChJb24gQmFkdWxlc2N1KQorCS0gTWFqb3IgY2xlYW51cAorCS0gVXNlIDIuNCBQQ0kgQVBJCisJLSBTdXBwb3J0IGV0aHRvb2wKKwktIFJld3JpdGUgcGVyZmVjdCBmaWx0ZXIvaGFzaCBjb2RlCisJLSBVc2UgaW50ZXJydXB0cyBmb3IgbWVkaWEgY2hhbmdlcworCisJTEsxLjEgKElvbiBCYWR1bGVzY3UpCisJLSBEaXNhbGxvdyBuZWdvdGlhdGlvbiBvZiB1bnN1cHBvcnRlZCBmdWxsLWR1cGxleCBtb2RlcworKi8KKworI2RlZmluZSBEUlZfTkFNRQkieGlyY29tX3R1bGlwX2NiIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC45MStMSzEuMSIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIk9jdG9iZXIgMTEsIDIwMDEiCisKKyNkZWZpbmUgQ0FSREJVUyAxCisKKy8qIEEgZmV3IHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4gKi8KKworI2RlZmluZSB4aXJjb21fZGVidWcgZGVidWcKKyNpZmRlZiBYSVJDT01fREVCVUcKK3N0YXRpYyBpbnQgeGlyY29tX2RlYnVnID0gWElSQ09NX0RFQlVHOworI2Vsc2UKK3N0YXRpYyBpbnQgeGlyY29tX2RlYnVnID0gMTsKKyNlbmRpZgorCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0LiAqLworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyNTsKKworI2RlZmluZSBNQVhfVU5JVFMgNAorLyogVXNlZCB0byBwYXNzIHRoZSBmdWxsLWR1cGxleCBmbGFnLCBldGMuICovCitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4W01BWF9VTklUU107CitzdGF0aWMgaW50IG9wdGlvbnNbTUFYX1VOSVRTXTsKK3N0YXRpYyBpbnQgbXR1W01BWF9VTklUU107CQkJLyogSnVtYm8gTVRVIGZvciBpbnRlcmZhY2VzLiAqLworCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBlZmZpY2llbmN5LgorICAgTWFraW5nIHRoZSBUeCByaW5nIHRvbyBsYXJnZSBkZWNyZWFzZXMgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgY2hhbm5lbAorICAgYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LgorICAgVGhlcmUgYXJlIG5vIGlsbCBlZmZlY3RzIGZyb20gdG9vLWxhcmdlIHJlY2VpdmUgcmluZ3MuICovCisjZGVmaW5lIFRYX1JJTkdfU0laRQkxNgorI2RlZmluZSBSWF9SSU5HX1NJWkUJMzIKKworLyogU2V0IHRoZSBjb3B5IGJyZWFrcG9pbnQgZm9yIHRoZSBjb3B5LW9ubHktdGlueS1idWZmZXIgUnggc3RydWN0dXJlLiAqLworI2lmZGVmIF9fYWxwaGFfXworc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAxNTE4OworI2Vsc2UKK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMTAwOworI2VuZGlmCisKKy8qCisgIFNldCB0aGUgYnVzIHBlcmZvcm1hbmNlIHJlZ2lzdGVyLgorCVR5cGljYWw6IFNldCAxNiBsb25nd29yZCBjYWNoZSBhbGlnbm1lbnQsIG5vIGJ1cnN0IGxpbWl0LgorCUNhY2hlIGFsaWdubWVudCBiaXRzIDE1OjE0CSAgICAgQnVyc3QgbGVuZ3RoIDEzOjgKKwkJMDAwMAlObyBhbGlnbm1lbnQgIDB4MDAwMDAwMDAgdW5saW1pdGVkCQkwODAwIDggbG9uZ3dvcmRzCisJCTQwMDAJOCAgbG9uZ3dvcmRzCQkwMTAwIDEgbG9uZ3dvcmQJCTEwMDAgMTYgbG9uZ3dvcmRzCisJCTgwMDAJMTYgbG9uZ3dvcmRzCQkwMjAwIDIgbG9uZ3dvcmRzCTIwMDAgMzIgbG9uZ3dvcmRzCisJCUMwMDAJMzIgIGxvbmd3b3JkcwkJMDQwMCA0IGxvbmd3b3JkcworCVdhcm5pbmc6IG1hbnkgb2xkZXIgNDg2IHN5c3RlbXMgYXJlIGJyb2tlbiBhbmQgcmVxdWlyZSBzZXR0aW5nIDB4MDBBMDQ4MDAKKwkgICA4IGxvbmd3b3JkIGNhY2hlIGFsaWdubWVudCwgOCBsb25nd29yZCBidXJzdC4KKwlUb0RvOiBOb24tSW50ZWwgc2V0dGluZyBjb3VsZCBiZSBiZXR0ZXIuCisqLworCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19pYTY0X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKK3N0YXRpYyBpbnQgY3NyMCA9IDB4MDFBMDAwMDAgfCAweEUwMDA7CisjZWxpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQorc3RhdGljIGludCBjc3IwID0gMHgwMUIwMDAwMCB8IDB4ODAwMDsKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKQorc3RhdGljIGludCBjc3IwID0gMHgwMUIwMDA4MCB8IDB4ODAwMDsKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCitzdGF0aWMgaW50IGNzcjAgPSAweDAxQTAwMDAwIHwgMHg4MDAwOworI2Vsc2UKKyN3YXJuaW5nIFByb2Nlc3NvciBhcmNoaXRlY3R1cmUgdW5kZWZpbmVkIQorc3RhdGljIGludCBjc3IwID0gMHgwMEEwMDAwMCB8IDB4NDgwMDsKKyNlbmRpZgorCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQJCSg0ICogSFopCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzYJCQkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4qLworI2RlZmluZSBQS1RfU0VUVVBfU1oJCTE5MgkJCS8qIFNpemUgb2YgdGhlIHNldHVwIGZyYW1lICovCisKKy8qIFBDSSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJX1BPV0VSTUdNVCAJMHg0MAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KK0tFUk5fSU5GTyBEUlZfTkFNRSAiLmMgZGVyaXZlZCBmcm9tIHR1bGlwLmM6djAuOTEgNC8xNC85OSBiZWNrZXJAc2N5bGQuY29tXG4iCitLRVJOX0lORk8gIiB1bm9mZmljaWFsIDIuNC54IGtlcm5lbCBwb3J0LCB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIiwgIiBEUlZfUkVMREFURSAiXG4iOworCitNT0RVTEVfQVVUSE9SKCJEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYaXJjb20gQ0JFLTEwMCBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY3NyMCwgaW50LCAwKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZnVsbF9kdXBsZXgsIGludCwgTlVMTCwgMCk7CisKKyNkZWZpbmUgUlVOX0FUKHgpIChqaWZmaWVzICsgKHgpKQorCisvKgorCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworSS4gQm9hcmQgQ29tcGF0aWJpbGl0eQorCitUaGlzIGRldmljZSBkcml2ZXIgd2FzIGZvcmtlZCBmcm9tIHRoZSBkcml2ZXIgZm9yIHRoZSBERUNjaGlwICJUdWxpcCIsCitEaWdpdGFsJ3Mgc2luZ2xlLWNoaXAgZXRoZXJuZXQgY29udHJvbGxlcnMgZm9yIFBDSS4gIEl0IHN1cHBvcnRzIFhpcmNvbSdzCithbG1vc3QtVHVsaXAtY29tcGF0aWJsZSBDQkUtMTAwIENhcmRCdXMgYWRhcHRlcnMuCisKK0lJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworCitQQ0kgYnVzIGRldmljZXMgYXJlIGNvbmZpZ3VyZWQgYnkgdGhlIHN5c3RlbSBhdCBib290IHRpbWUsIHNvIG5vIGp1bXBlcnMKK25lZWQgdG8gYmUgc2V0IG9uIHRoZSBib2FyZC4gIFRoZSBzeXN0ZW0gQklPUyBwcmVmZXJhYmx5IHNob3VsZCBhc3NpZ24gdGhlCitQQ0kgSU5UQSBzaWduYWwgdG8gYW4gb3RoZXJ3aXNlIHVudXNlZCBzeXN0ZW0gSVJRIGxpbmUuCisKK0lJSS4gRHJpdmVyIG9wZXJhdGlvbgorCitJSUlhLiBSaW5nIGJ1ZmZlcnMKKworVGhlIFhpcmNvbSBjYW4gdXNlIGVpdGhlciByaW5nIGJ1ZmZlcnMgb3IgbGlzdHMgb2YgVHggYW5kIFJ4IGRlc2NyaXB0b3JzLgorVGhpcyBkcml2ZXIgdXNlcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCByaW5ncyBvZiBSeCBhbmQgVHggZGVzY3JpcHRvcnMsIHNldCBhdAorY29tcGlsZSB0aW1lIGJ5IFJYL1RYX1JJTkdfU0laRS4gIFRoaXMgdmVyc2lvbiBvZiB0aGUgZHJpdmVyIGFsbG9jYXRlcyBza2J1ZmZzCitmb3IgdGhlIFJ4IHJpbmcgYnVmZmVycyBhdCBvcGVuKCkgdGltZSBhbmQgcGFzc2VzIHRoZSBza2ItPmRhdGEgZmllbGQgdG8gdGhlCitYaXJjb20gYXMgcmVjZWl2ZSBkYXRhIGJ1ZmZlcnMuICBXaGVuIGFuIGluY29taW5nIGZyYW1lIGlzIGxlc3MgdGhhbgorUlhfQ09QWUJSRUFLIGJ5dGVzIGxvbmcsIGEgZnJlc2ggc2tidWZmIGlzIGFsbG9jYXRlZCBhbmQgdGhlIGZyYW1lIGlzCitjb3BpZWQgdG8gdGhlIG5ldyBza2J1ZmYuICBXaGVuIHRoZSBpbmNvbWluZyBmcmFtZSBpcyBsYXJnZXIsIHRoZSBza2J1ZmYgaXMKK3Bhc3NlZCBkaXJlY3RseSB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgYW5kIHJlcGxhY2VkIGJ5IGEgbmV3bHkgYWxsb2NhdGVkCitza2J1ZmYuCisKK1RoZSBSWF9DT1BZQlJFQUsgdmFsdWUgaXMgY2hvc2VuIHRvIHRyYWRlLW9mZiB0aGUgbWVtb3J5IHdhc3RlZCBieQordXNpbmcgYSBmdWxsLXNpemVkIHNrYnVmZiBmb3Igc21hbGwgZnJhbWVzIHZzLiB0aGUgY29weWluZyBjb3N0cyBvZiBsYXJnZXIKK2ZyYW1lcy4gIEZvciBzbWFsbCBmcmFtZXMgdGhlIGNvcHlpbmcgY29zdCBpcyBuZWdsaWdpYmxlIChlc3AuIGNvbnNpZGVyaW5nCit0aGF0IHdlIGFyZSBwcmUtbG9hZGluZyB0aGUgY2FjaGUgd2l0aCBpbW1lZGlhdGVseSB1c2VmdWwgaGVhZGVyCitpbmZvcm1hdGlvbikuICBGb3IgbGFyZ2UgZnJhbWVzIHRoZSBjb3B5aW5nIGNvc3QgaXMgbm9uLXRyaXZpYWwsIGFuZCB0aGUKK2xhcmdlciBjb3B5IG1pZ2h0IGZsdXNoIHRoZSBjYWNoZSBvZiB1c2VmdWwgZGF0YS4gIEEgc3VidGxlIGFzcGVjdCBvZiB0aGlzCitjaG9pY2UgaXMgdGhhdCB0aGUgWGlyY29tIG9ubHkgcmVjZWl2ZXMgaW50byBsb25nd29yZCBhbGlnbmVkIGJ1ZmZlcnMsIHRodXMKK3RoZSBJUCBoZWFkZXIgYXQgb2Zmc2V0IDE0IGlzbid0IGxvbmd3b3JkIGFsaWduZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KK0NvcGllZCBmcmFtZXMgYXJlIHB1dCBpbnRvIHRoZSBuZXcgc2tidWZmIGF0IGFuIG9mZnNldCBvZiAiKzIiLCB0aHVzIGNvcHlpbmcKK2hhcyB0aGUgYmVuZWZpY2lhbCBlZmZlY3Qgb2YgYWxpZ25pbmcgdGhlIElQIGhlYWRlciBhbmQgcHJlbG9hZGluZyB0aGUKK2NhY2hlLgorCitJSUlDLiBTeW5jaHJvbml6YXRpb24KK1RoZSBkcml2ZXIgcnVucyBhcyB0d28gaW5kZXBlbmRlbnQsIHNpbmdsZS10aHJlYWRlZCBmbG93cyBvZiBjb250cm9sLiAgT25lCitpcyB0aGUgc2VuZC1wYWNrZXQgcm91dGluZSwgd2hpY2ggZW5mb3JjZXMgc2luZ2xlLXRocmVhZGVkIHVzZSBieSB0aGUKK2Rldi0+dGJ1c3kgZmxhZy4gIFRoZSBvdGhlciB0aHJlYWQgaXMgdGhlIGludGVycnVwdCBoYW5kbGVyLCB3aGljaCBpcyBzaW5nbGUKK3RocmVhZGVkIGJ5IHRoZSBoYXJkd2FyZSBhbmQgb3RoZXIgc29mdHdhcmUuCisKK1RoZSBzZW5kIHBhY2tldCB0aHJlYWQgaGFzIHBhcnRpYWwgY29udHJvbCBvdmVyIHRoZSBUeCByaW5nIGFuZCAnZGV2LT50YnVzeScKK2ZsYWcuICBJdCBzZXRzIHRoZSB0YnVzeSBmbGFnIHdoZW5ldmVyIGl0J3MgcXVldWluZyBhIFR4IHBhY2tldC4gSWYgdGhlIG5leHQKK3F1ZXVlIHNsb3QgaXMgZW1wdHksIGl0IGNsZWFycyB0aGUgdGJ1c3kgZmxhZyB3aGVuIGZpbmlzaGVkIG90aGVyd2lzZSBpdCBzZXRzCit0aGUgJ3RwLT50eF9mdWxsJyBmbGFnLgorCitUaGUgaW50ZXJydXB0IGhhbmRsZXIgaGFzIGV4Y2x1c2l2ZSBjb250cm9sIG92ZXIgdGhlIFJ4IHJpbmcgYW5kIHJlY29yZHMgc3RhdHMKK2Zyb20gdGhlIFR4IHJpbmcuICAoVGhlIFR4LWRvbmUgaW50ZXJydXB0IGNhbid0IGJlIHNlbGVjdGl2ZWx5IHR1cm5lZCBvZmYsIHNvCit3ZSBjYW4ndCBhdm9pZCB0aGUgaW50ZXJydXB0IG92ZXJoZWFkIGJ5IGhhdmluZyB0aGUgVHggcm91dGluZSByZWFwIHRoZSBUeAorc3RhdHMuKQkgQWZ0ZXIgcmVhcGluZyB0aGUgc3RhdHMsIGl0IG1hcmtzIHRoZSBxdWV1ZSBlbnRyeSBhcyBlbXB0eSBieSBzZXR0aW5nCit0aGUgJ2Jhc2UnIHRvIHplcm8uCSBJZmYgdGhlICd0cC0+dHhfZnVsbCcgZmxhZyBpcyBzZXQsIGl0IGNsZWFycyBib3RoIHRoZQordHhfZnVsbCBhbmQgdGJ1c3kgZmxhZ3MuCisKK0lWLiBOb3RlcworCitJVmIuIFJlZmVyZW5jZXMKKworaHR0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L2xpbnV4L21pc2MvTldheS5odG1sCitodHRwOi8vd3d3LmRpZ2l0YWwuY29tICAoc2VhcmNoIGZvciBjdXJyZW50IDIxKjQqIGRhdGFzaGVldHMgYW5kICIyMVg0IFNST00iKQoraHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvRFAvRFA4Mzg0MEEuaHRtbAorCitJVmMuIEVycmF0YQorCisqLworCisvKiBBIGZ1bGwtZHVwbGV4IG1hcCBmb3IgbWVkaWEgdHlwZXMuICovCitlbnVtIE1lZGlhSXMgeworCU1lZGlhSXNGRCA9IDEsIE1lZGlhQWx3YXlzRkQ9MiwgTWVkaWFJc01JST00LCBNZWRpYUlzRng9OCwKKwlNZWRpYUlzMTAwPTE2fTsKK3N0YXRpYyBjb25zdCBjaGFyIG1lZGlhX2NhcFtdID0KK3swLDAsMCwxNiwgIDMsMTksMTYsMjQsICAyNyw0LDcsNSwgMCwyMCwyMywyMCB9OworCisvKiBPZmZzZXRzIHRvIHRoZSBDb21tYW5kIGFuZCBTdGF0dXMgUmVnaXN0ZXJzLCAiQ1NScyIuICBBbGwgYWNjZXNzZXMKKyAgIG11c3QgYmUgbG9uZ3dvcmQgaW5zdHJ1Y3Rpb25zIGFuZCBxdWFkd29yZCBhbGlnbmVkLiAqLworZW51bSB4aXJjb21fb2Zmc2V0cyB7CisJQ1NSMD0wLCAgICBDU1IxPTB4MDgsIENTUjI9MHgxMCwgQ1NSMz0weDE4LCBDU1I0PTB4MjAsIENTUjU9MHgyOCwKKwlDU1I2PTB4MzAsIENTUjc9MHgzOCwgQ1NSOD0weDQwLCBDU1I5PTB4NDgsIENTUjEwPTB4NTAsIENTUjExPTB4NTgsCisJQ1NSMTI9MHg2MCwgQ1NSMTM9MHg2OCwgQ1NSMTQ9MHg3MCwgQ1NSMTU9MHg3OCwgQ1NSMTY9MHgwNCwgfTsKKworLyogVGhlIGJpdHMgaW4gdGhlIENTUjUgc3RhdHVzIHJlZ2lzdGVycywgbW9zdGx5IGludGVycnVwdCBzb3VyY2VzLiAqLworZW51bSBzdGF0dXNfYml0cyB7CisJTGlua0NoYW5nZT0weDA4MDAwMDAwLAorCU5vcm1hbEludHI9MHgxMDAwMCwgTm9ybWFsSW50ck1hc2s9MHgwMDAxNDA0NSwKKwlBYm5vcm1hbEludHI9MHg4MDAwLCBBYm5vcm1hbEludHJNYXNrPTB4MGEwMGE1YTIsCisJUmVzZXJ2ZWRJbnRyTWFzaz0weGUwMDAxYTE4LAorCUVhcmx5UnhJbnRyPTB4NDAwMCwgQnVzRXJyb3JJbnRyPTB4MjAwMCwKKwlFYXJseVR4SW50cj0weDQwMCwgUnhEaWVkPTB4MTAwLCBSeE5vQnVmPTB4ODAsIFJ4SW50cj0weDQwLAorCVR4RklGT1VuZGVyZmxvdz0weDIwLCBUeE5vQnVmPTB4MDQsIFR4RGllZD0weDAyLCBUeEludHI9MHgwMSwKK307CisKK2VudW0gY3NyMF9jb250cm9sX2JpdHMgeworCUVuYWJsZU1XST0weDAxMDAwMDAwLCBFbmFibGVNUkw9MHgwMDgwMDAwMCwKKwlFbmFibGVNUk09MHgwMDIwMDAwMCwgRXF1YWxCdXNQcmlvPTB4MDIsCisJU29mdHdhcmVSZXNldD0weDAxLAorfTsKKworZW51bSBjc3I2X2NvbnRyb2xfYml0cyB7CisJUmVjZWl2ZUFsbEJpdD0weDQwMDAwMDAwLCBBbGxNdWx0aUJpdD0weDgwLCBQcm9taXNjQml0PTB4NDAsCisJSGFzaEZpbHRlckJpdD0weDAxLCBGdWxsRHVwbGV4Qml0PTB4MDIwMCwKKwlUeFRocmVzaDEwPTB4NDAwMDAwLCBUeFN0b3JlRm9ydz0weDIwMDAwMCwKKwlUeFRocmVzaE1hc2s9MHhjMDAwLCBUeFRocmVzaFNoaWZ0PTE0LAorCUVuYWJsZVR4PTB4MjAwMCwgRW5hYmxlUng9MHgwMiwKKwlSZXNlcnZlZFplcm9NYXNrPTB4OGQ5MzAxMzQsIFJlc2VydmVkT25lTWFzaz0weDMyMGMwMDAwLAorCUVuYWJsZVR4Ung9KEVuYWJsZVR4IHwgRW5hYmxlUngpLAorfTsKKworCitlbnVtIHRibF9mbGFnIHsKKwlIQVNfTUlJPTEsIEhBU19BQ1BJPTIsCit9Oworc3RhdGljIHN0cnVjdCB4aXJjb21fY2hpcF90YWJsZSB7CisJY2hhciAqY2hpcF9uYW1lOworCWludCB2YWxpZF9pbnRyczsJCQkvKiBDU1I3IGludGVycnVwdCBlbmFibGUgc2V0dGluZ3MgKi8KKwlpbnQgZmxhZ3M7Cit9IHhpcmNvbV90YmxbXSA9IHsKKyAgeyAiWGlyY29tIENhcmRidXMgQWRhcHRlciIsCisJTGlua0NoYW5nZSB8IE5vcm1hbEludHIgfCBBYm5vcm1hbEludHIgfCBCdXNFcnJvckludHIgfAorCVJ4RGllZCB8IFJ4Tm9CdWYgfCBSeEludHIgfCBUeEZJRk9VbmRlcmZsb3cgfCBUeE5vQnVmIHwgVHhEaWVkIHwgVHhJbnRyLAorCUhBU19NSUkgfCBIQVNfQUNQSSwgfSwKKyAgeyBOVUxMLCB9LAorfTsKKy8qIFRoaXMgbWF0Y2hlcyB0aGUgdGFibGUgYWJvdmUuICovCitlbnVtIGNoaXBzIHsKKwlYMzIwMV8zLAorfTsKKworCisvKiBUaGUgWGlyY29tIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3QgeGlyY29tX3J4X2Rlc2MgeworCXMzMiBzdGF0dXM7CisJczMyIGxlbmd0aDsKKwl1MzIgYnVmZmVyMSwgYnVmZmVyMjsKK307CisKK3N0cnVjdCB4aXJjb21fdHhfZGVzYyB7CisJczMyIHN0YXR1czsKKwlzMzIgbGVuZ3RoOworCXUzMiBidWZmZXIxLCBidWZmZXIyOwkJCQkvKiBXZSB1c2Ugb25seSBidWZmZXIgMS4gICovCit9OworCitlbnVtIHR4X2Rlc2MwX3N0YXR1c19iaXRzIHsKKwlUeDBEZXNjT3duZWQ9MHg4MDAwMDAwMCwgVHgwRGVzY0Vycm9yPTB4ODAwMCwgVHgwTm9DYXJyaWVyPTB4MDgwMCwKKwlUeDBMYXRlQ29sbD0weDAyMDAsIFR4ME1hbnlDb2xsPTB4MDEwMCwgVHgwVW5kZXJmbG93PTB4MDIsCit9OworZW51bSB0eF9kZXNjMV9zdGF0dXNfYml0cyB7CisJVHgxQ29tcGxJbnRyPTB4ODAwMDAwMDAsIFR4MUxhc3RTZWc9MHg0MDAwMDAwMCwgVHgxRmlyc3RTZWc9MHgyMDAwMDAwMCwKKwlUeDFTZXR1cFBrdD0weDA4MDAwMDAwLCBUeDFEaXNhYmxlQ1JDPTB4MDQwMDAwMDAsIFR4MVJpbmdXcmFwPTB4MDIwMDAwMDAsCisJVHgxQ2hhaW5EZXNjPTB4MDEwMDAwMDAsIFR4MU5vUGFkPTB4ODAwMDAwLCBUeDFIYXNoU2V0dXA9MHg0MDAwMDAsCisJVHgxV2hvbGVQa3Q9KFR4MUZpcnN0U2VnIHwgVHgxTGFzdFNlZyksCit9OworZW51bSByeF9kZXNjMF9zdGF0dXNfYml0cyB7CisJUngwRGVzY093bmVkPTB4ODAwMDAwMDAsIFJ4MERlc2NFcnJvcj0weDgwMDAsIFJ4ME5vU3BhY2U9MHg0MDAwLAorCVJ4MFJ1bnQ9MHgwODAwLCBSeDBNY2FzdFBrdD0weDA0MDAsIFJ4MEZpcnN0U2VnPTB4MDIwMCwgUngwTGFzdFNlZz0weDAxMDAsCisJUngwSHVnZUZyYW1lPTB4ODAsIFJ4MENSQ0Vycm9yPTB4MDIsCisJUngwV2hvbGVQa3Q9KFJ4MEZpcnN0U2VnIHwgUngwTGFzdFNlZyksCit9OworZW51bSByeF9kZXNjMV9zdGF0dXNfYml0cyB7CisJUngxUmluZ1dyYXA9MHgwMjAwMDAwMCwgUngxQ2hhaW5EZXNjPTB4MDEwMDAwMDAsCit9OworCitzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgeworCXN0cnVjdCB4aXJjb21fcnhfZGVzYyByeF9yaW5nW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHhpcmNvbV90eF9kZXNjIHR4X3JpbmdbVFhfUklOR19TSVpFXTsKKwkvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQtaW4tcGxhY2UgcGFja2V0L2J1ZmZlciwgZm9yIHNrZnJlZSgpLiAqLworCXN0cnVjdCBza19idWZmKiB0eF9za2J1ZmZbVFhfUklOR19TSVpFXTsKKyNpZmRlZiBDQVJEQlVTCisJLyogVGhlIFgzMjAxLTMgcmVxdWlyZXMgNC1ieXRlIGFsaWduZWQgdHggYnVmcyAqLworCXN0cnVjdCBza19idWZmKiB0eF9hbGlnbmVkX3NrYnVmZltUWF9SSU5HX1NJWkVdOworI2VuZGlmCisJLyogVGhlIGFkZHJlc3NlcyBvZiByZWNlaXZlLWluLXBsYWNlIHNrYnVmZnMuICovCisJc3RydWN0IHNrX2J1ZmYqIHJ4X3NrYnVmZltSWF9SSU5HX1NJWkVdOworCXUxNiBzZXR1cF9mcmFtZVtQS1RfU0VUVVBfU1ogLyBzaXplb2YodTE2KV07CS8qIFBzZXVkby1UeCBmcmFtZSB0byBpbml0IGFkZHJlc3MgdGFibGUuICovCisJaW50IGNoaXBfaWQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdW5zaWduZWQgaW50IGN1cl9yeCwgY3VyX3R4OwkJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCisJdW5zaWduZWQgaW50IGRpcnR5X3J4LCBkaXJ0eV90eDsJLyogVGhlIHJpbmcgZW50cmllcyB0byBiZSBmcmVlKCllZC4gKi8KKwl1bnNpZ25lZCBpbnQgdHhfZnVsbDoxOwkJCQkvKiBUaGUgVHggcXVldWUgaXMgZnVsbC4gKi8KKwl1bnNpZ25lZCBpbnQgc3BlZWQxMDA6MTsKKwl1bnNpZ25lZCBpbnQgZnVsbF9kdXBsZXg6MTsJCQkvKiBGdWxsLWR1cGxleCBvcGVyYXRpb24gcmVxdWVzdGVkLiAqLworCXVuc2lnbmVkIGludCBhdXRvbmVnOjE7CisJdW5zaWduZWQgaW50IGRlZmF1bHRfcG9ydDo0OwkJLyogTGFzdCBkZXYtPmlmX3BvcnQgdmFsdWUuICovCisJdW5zaWduZWQgaW50IG9wZW46MTsKKwl1bnNpZ25lZCBpbnQgY3NyMDsJCQkJCS8qIENTUjAgc2V0dGluZy4gKi8KKwl1bnNpZ25lZCBpbnQgY3NyNjsJCQkJCS8qIEN1cnJlbnQgQ1NSNiBjb250cm9sIHNldHRpbmdzLiAqLworCXUxNiB0b19hZHZlcnRpc2U7CQkJCQkvKiBOV2F5IGNhcGFiaWxpdGllcyBhZHZlcnRpc2VkLiAgKi8KKwl1MTYgYWR2ZXJ0aXNpbmdbNF07CisJc2lnbmVkIGNoYXIgcGh5c1s0XSwgbWlpX2NudDsJCS8qIE1JSSBkZXZpY2UgYWRkcmVzc2VzLiAqLworCWludCBzYXZlZF9pZl9wb3J0OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKTsKK3N0YXRpYyB2b2lkIHhpcmNvbV91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHhpcmNvbV9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB4aXJjb21fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHhpcmNvbV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgeGlyY29tX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgeGlyY29tX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHhpcmNvbV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHhpcmNvbV9tZWRpYV9jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgeGlyY29tX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgeGlyY29tX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp4aXJjb21fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB4aXJjb21faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNoZWNrX2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgb3BzOworCisKKy8qIFRoZSBYaXJjb20gY2FyZHMgYXJlIHBpY2t5IGFib3V0IHdoZW4gY2VydGFpbiBiaXRzIGluIENTUjYgY2FuIGJlCisgICBtYW5pcHVsYXRlZC4gIEtlaXRoIE93ZW5zIDxrYW9zQG9jcy5jb20uYXU+LiAqLworc3RhdGljIHZvaWQgb3V0bF9DU1I2KHUzMiBuZXdjc3I2LCBsb25nIGlvYWRkcikKK3sKKwljb25zdCBpbnQgc3RyaWN0X2JpdHMgPQorCQlUeFRocmVzaDEwIHwgVHhTdG9yZUZvcncgfCBUeFRocmVzaE1hc2sgfCBFbmFibGVUeFJ4IHwgRnVsbER1cGxleEJpdDsKKyAgICBpbnQgY3NyNSwgY3NyNV8yMl8yMCwgY3NyNV8xOV8xNywgY3VycmNzcjYsIGF0dGVtcHRzID0gMjAwOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgc2F2ZV9mbGFncyhmbGFncyk7CisgICAgY2xpKCk7CisJLyogbWFzayBvdXQgdGhlIHJlc2VydmVkIGJpdHMgdGhhdCBhbHdheXMgcmVhZCAwIG9uIHRoZSBYaXJjb20gY2FyZHMgKi8KKwluZXdjc3I2ICY9IH5SZXNlcnZlZFplcm9NYXNrOworCS8qIG9yIGluIHRoZSByZXNlcnZlZCBiaXRzIHRoYXQgYWx3YXlzIHJlYWQgMSAqLworCW5ld2NzcjYgfD0gUmVzZXJ2ZWRPbmVNYXNrOworICAgIGN1cnJjc3I2ID0gaW5sKGlvYWRkciArIENTUjYpOworICAgIGlmICgoKG5ld2NzcjYgJiBzdHJpY3RfYml0cykgPT0gKGN1cnJjc3I2ICYgc3RyaWN0X2JpdHMpKSB8fAorCSgoY3VycmNzcjYgJiB+RW5hYmxlVHhSeCkgPT0gMCkpIHsKKwkJb3V0bChuZXdjc3I2LCBpb2FkZHIgKyBDU1I2KTsJLyogc2FmZSAqLworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuOworICAgIH0KKyAgICAvKiBtYWtlIHN1cmUgdGhlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlciBhcmUgc3RvcHBlZCBmaXJzdCAqLworICAgIGN1cnJjc3I2ICY9IH5FbmFibGVUeFJ4OworICAgIHdoaWxlICgxKSB7CisJCWNzcjUgPSBpbmwoaW9hZGRyICsgQ1NSNSk7CisJCWlmIChjc3I1ID09IDB4ZmZmZmZmZmYpCisJCQlicmVhazsgIC8qIGNhbm5vdCByZWFkIGNzcjUsIGNhcmQgcmVtb3ZlZD8gKi8KKwkJY3NyNV8yMl8yMCA9IGNzcjUgJiAweDcwMDAwMDsKKwkJY3NyNV8xOV8xNyA9IGNzcjUgJiAweDBlMDAwMDsKKwkJaWYgKChjc3I1XzIyXzIwID09IDAgfHwgY3NyNV8yMl8yMCA9PSAweDYwMDAwMCkgJiYKKwkJCShjc3I1XzE5XzE3ID09IDAgfHwgY3NyNV8xOV8xNyA9PSAweDgwMDAwIHx8IGNzcjVfMTlfMTcgPT0gMHhjMDAwMCkpCisJCQlicmVhazsgIC8qIGJvdGggYXJlIHN0b3BwZWQgb3Igc3VzcGVuZGVkICovCisJCWlmICghLS1hdHRlbXB0cykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiBvdXRsX0NTUjYgdG9vIG1hbnkgYXR0ZW1wdHMsIgorCQkJCSAgICJjc3I1PTB4JTA4eFxuIiwgY3NyNSk7CisJCQlvdXRsKG5ld2NzcjYsIGlvYWRkciArIENTUjYpOyAgLyogdW5zYWZlIGJ1dCBkbyBpdCBhbnl3YXkgKi8KKwkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJCW91dGwoY3VycmNzcjYsIGlvYWRkciArIENTUjYpOworCQl1ZGVsYXkoMSk7CisgICAgfQorICAgIC8qIG5vdyBpdCBpcyBzYWZlIHRvIGNoYW5nZSBjc3I2ICovCisgICAgb3V0bChuZXdjc3I2LCBpb2FkZHIgKyBDU1I2KTsKKyAgICByZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcmVhZF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGksIGo7CisJdW5zaWduZWQgY2hhciB0dXBsZSwgbGluaywgZGF0YV9pZCwgZGF0YV9jb3VudDsKKworCS8qIFhpcmNvbSBoYXMgaXRzIGFkZHJlc3Mgc3RvcmVkIGluIHRoZSBDSVM7CisJICogd2UgYWNjZXNzIGl0IHRocm91Z2ggdGhlIGJvb3Qgcm9tIGludGVyZmFjZSBmb3Igbm93CisJICogdGhpcyBtaWdodCBub3Qgd29yaywgYXMgdGhlIENJUyBpcyBub3QgcGFyc2VkIGJ1dCBJCisJICogKGRhbmlsbykgdXNlIHRoZSBvZmZzZXQgSSBmb3VuZCBvbiBteSBjYXJkJ3MgQ0lTICEhIQorCSAqCisJICogRG91ZyBMZWRmb3JkOiBJIGNoYW5nZWQgdGhpcyByb3V0aW5lIGFyb3VuZCBzbyB0aGF0IGl0CisJICogd2Fsa3MgdGhlIENJUyBtZW1vcnkgc3BhY2UsIHBhcnNpbmcgdGhlIGNvbmZpZyBpdGVtcywgYW5kCisJICogZmluZHMgdGhlIHByb3BlciBsYW5fbm9kZV9pZCB0dXBsZSBhbmQgdXNlcyB0aGUgZGF0YQorCSAqIHN0b3JlZCB0aGVyZS4KKwkgKi8KKwlvdXRsKDEgPDwgMTIsIGlvYWRkciArIENTUjkpOyAvKiBlbmFibGUgYm9vdCByb20gYWNjZXNzICovCisJZm9yIChpID0gMHgxMDA7IGkgPCAweDFmNzsgaSArPSBsaW5rKzIpIHsKKwkJb3V0bChpLCBpb2FkZHIgKyBDU1IxMCk7CisJCXR1cGxlID0gaW5sKGlvYWRkciArIENTUjkpICYgMHhmZjsKKwkJb3V0bChpICsgMSwgaW9hZGRyICsgQ1NSMTApOworCQlsaW5rID0gaW5sKGlvYWRkciArIENTUjkpICYgMHhmZjsKKwkJb3V0bChpICsgMiwgaW9hZGRyICsgQ1NSMTApOworCQlkYXRhX2lkID0gaW5sKGlvYWRkciArIENTUjkpICYgMHhmZjsKKwkJb3V0bChpICsgMywgaW9hZGRyICsgQ1NSMTApOworCQlkYXRhX2NvdW50ID0gaW5sKGlvYWRkciArIENTUjkpICYgMHhmZjsKKwkJaWYgKCAodHVwbGUgPT0gMHgyMikgJiYKKwkJCSAoZGF0YV9pZCA9PSAweDA0KSAmJiAoZGF0YV9jb3VudCA9PSAweDA2KSApIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGl0LiAgV2UgaGF2ZSB0aGUgZGF0YSB3ZSB3YW50LgorCQkJICovCisJCQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7CisJCQkJb3V0bChpICsgaiArIDQsIGlvYWRkciArIENTUjEwKTsKKwkJCQlkZXYtPmRldl9hZGRyW2pdID0gaW5sKGlvYWRkciArIENTUjkpICYgMHhmZjsKKwkJCX0KKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGxpbmsgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworLyoKKyAqIGxvY2F0ZSB0aGUgTUlJIGludGVyZmFjZXMgYW5kIGluaXRpYWxpemUgdGhlbS4KKyAqIHdlIGRpc2FibGUgZnVsbC1kdXBsZXggbW9kZXMgaGVyZSwKKyAqIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoZW0uCisgKi8KK3N0YXRpYyB2b2lkIGZpbmRfbWlpX3RyYW5zY2VpdmVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBwaHksIHBoeV9pZHg7CisKKwlpZiAobWVkaWFfY2FwW3RwLT5kZWZhdWx0X3BvcnRdICYgTWVkaWFJc01JSSkgeworCQl1MTYgbWVkaWEyYWR2ZXJ0W10gPSB7IDB4MjAsIDB4NDAsIDB4MDNlMCwgMHg2MCwgMHg4MCwgMHgxMDAsIDB4MjAwIH07CisJCXRwLT50b19hZHZlcnRpc2UgPSBtZWRpYTJhZHZlcnRbdHAtPmRlZmF1bHRfcG9ydCAtIDldOworCX0gZWxzZQorCQl0cC0+dG9fYWR2ZXJ0aXNlID0KKwkJCS8qQURWRVJUSVNFXzEwMEJBU0U0IHwgQURWRVJUSVNFXzEwMEZVTEwgfCovIEFEVkVSVElTRV8xMDBIQUxGIHwKKwkJCS8qQURWRVJUSVNFXzEwRlVMTCB8Ki8gQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV9DU01BOworCisJLyogRmluZCB0aGUgY29ubmVjdGVkIE1JSSB4Y3Zycy4KKwkgICBEb2luZyB0aGlzIGluIG9wZW4oKSB3b3VsZCBhbGxvdyBkZXRlY3RpbmcgZXh0ZXJuYWwgeGN2cnMgbGF0ZXIsCisJICAgYnV0IHRha2VzIG11Y2ggdGltZS4gKi8KKwlmb3IgKHBoeSA9IDAsIHBoeV9pZHggPSAwOyBwaHkgPCAzMiAmJiBwaHlfaWR4IDwgc2l6ZW9mKHRwLT5waHlzKTsgcGh5KyspIHsKKwkJaW50IG1paV9zdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9CTVNSKTsKKwkJaWYgKChtaWlfc3RhdHVzICYgKEJNU1JfMTAwQkFTRTQgfCBCTVNSXzEwMEhBTEYgfCBCTVNSXzEwSEFMRikpID09IEJNU1JfMTAwQkFTRTQgfHwKKwkJCSgobWlpX3N0YXR1cyAmIEJNU1JfMTAwQkFTRTQpID09IDAgJiYKKwkJCSAobWlpX3N0YXR1cyAmIChCTVNSXzEwMEZVTEwgfCBCTVNSXzEwMEhBTEYgfCBCTVNSXzEwRlVMTCB8IEJNU1JfMTBIQUxGKSkgIT0gMCkpIHsKKwkJCWludCBtaWlfcmVnMCA9IG1kaW9fcmVhZChkZXYsIHBoeSwgTUlJX0JNQ1IpOworCQkJaW50IG1paV9hZHZlcnQgPSBtZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9BRFZFUlRJU0UpOworCQkJaW50IHJlZzQgPSAoKG1paV9zdGF0dXMgPj4gNikgJiB0cC0+dG9fYWR2ZXJ0aXNlKSB8IEFEVkVSVElTRV9DU01BOworCQkJdHAtPnBoeXNbcGh5X2lkeF0gPSBwaHk7CisJCQl0cC0+YWR2ZXJ0aXNpbmdbcGh5X2lkeCsrXSA9IHJlZzQ7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogIE1JSSB0cmFuc2NlaXZlciAjJWQgIgorCQkJCSAgICJjb25maWcgJTQuNHggc3RhdHVzICU0LjR4IGFkdmVydGlzaW5nICU0LjR4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHBoeSwgbWlpX3JlZzAsIG1paV9zdGF0dXMsIG1paV9hZHZlcnQpOworCQl9CisJfQorCXRwLT5taWlfY250ID0gcGh5X2lkeDsKKwlpZiAocGh5X2lkeCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAqKipXQVJOSU5HKioqOiBObyBNSUkgdHJhbnNjZWl2ZXIgZm91bmQhXG4iLAorCQkJICAgZGV2LT5uYW1lKTsKKwkJdHAtPnBoeXNbMF0gPSAwOworCX0KK30KKworCisvKgorICogVG8gcXVvdGUgQXJqYW4gdmFuIGRlIFZlbjoKKyAqICAgdHJhbnNjZWl2ZXJfdm9vZG9vKCkgZW5hYmxlcyB0aGUgZXh0ZXJuYWwgVVRQIHBsdWcgdGhpbmd5LgorICogICBpdCdzIGNhbGxlZCB2b29kb28gYXMgSSBzdG9sZSB0aGlzIGNvZGUgYW5kIGNhbm5vdCBjcm9zcy1yZWZlcmVuY2UKKyAqICAgaXQgd2l0aCB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqIEFjdHVhbGx5IGl0IHNlZW1zIHRvIGdvIGxpa2UgdGhpczoKKyAqIC0gR1BJTzIgZW5hYmxlcyB0aGUgTUlJIGl0c2VsZiBzbyB3ZSBjYW4gdGFsayB0byBpdC4gVGhlIE1JSSBnZXRzIHJlc2V0CisgKiAgIHNvIGFueSBwcmlvciBNSUkgc2V0dGluZ3MgYXJlIGxvc3QuCisgKiAtIEdQSU8wIGVuYWJsZXMgdGhlIFRQIHBvcnQgc28gdGhlIE1JSSBjYW4gdGFsayB0byB0aGUgbmV0d29yay4KKyAqIC0gYSBzb2Z0d2FyZSByZXNldCB3aWxsIHJlc2V0IGJvdGggR1BJTyBwaW5zLgorICogSSBhbHNvIG1vdmVkIHRoZSBzb2Z0d2FyZSByZXNldCBoZXJlLCBiZWNhdXNlIGRvaW5nIGl0IGluIHhpcmNvbV91cCgpCisgKiByZXF1aXJlZCBlbmFibGluZyB0aGUgR1BJTyBwaW5zIGVhY2ggdGltZSwgd2hpY2ggcmVzZXQgdGhlIE1JSSBlYWNoIHRpbWUuCisgKiBUaHVzIHdlIGNvdWxkbid0IGNvbnRyb2wgdGhlIE1JSSAtLSB3aGljaCBzdWNrcyBiZWNhdXNlIHdlIGRvbid0IGtub3cKKyAqIGhvdyB0byBoYW5kbGUgZnVsbC1kdXBsZXggbW9kZXMgc28gd2UgKm11c3QqIGRpc2FibGUgdGhlbS4KKyAqLworc3RhdGljIHZvaWQgdHJhbnNjZWl2ZXJfdm9vZG9vKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8qIFJlc2V0IHRoZSBjaGlwLCBob2xkaW5nIGJpdCAwIHNldCBhdCBsZWFzdCA1MCBQQ0kgY3ljbGVzLiAqLworCW91dGwoU29mdHdhcmVSZXNldCwgaW9hZGRyICsgQ1NSMCk7CisJdWRlbGF5KDIpOworCisJLyogRGVhc3NlcnQgcmVzZXQuICovCisJb3V0bCh0cC0+Y3NyMCwgaW9hZGRyICsgQ1NSMCk7CisKKwkvKiBSZXNldCB0aGUgeGN2ciBpbnRlcmZhY2UgYW5kIHR1cm4gb24gaGVhcnRiZWF0LiAqLworCW91dGwoMHgwMDA4LCBpb2FkZHIgKyBDU1IxNSk7CisJdWRlbGF5KDUpOyAgLyogVGhlIGRlbGF5cyBhcmUgWGlyY29tLXJlY29tbWVuZGVkIHRvIGdpdmUgdGhlCisJCQkJICogY2hpcHNldCB0aW1lIHRvIHJlc2V0IHRoZSBhY3R1YWwgaGFyZHdhcmUKKwkJCQkgKiBvbiB0aGUgUENNQ0lBIGNhcmQKKwkJCQkgKi8KKwlvdXRsKDB4YTgwNTAwMDAsIGlvYWRkciArIENTUjE1KTsKKwl1ZGVsYXkoNSk7CisJb3V0bCgweGEwMGYwMDAwLCBpb2FkZHIgKyBDU1IxNSk7CisJdWRlbGF5KDUpOworCisJb3V0bF9DU1I2KDAsIGlvYWRkcik7CisJLy9vdXRsX0NTUjYoRnVsbER1cGxleEJpdCwgaW9hZGRyKTsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB4aXJjb21faW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHA7CisJc3RhdGljIGludCBib2FyZF9pZHggPSAtMTsKKwlpbnQgY2hpcF9pZHggPSBpZC0+ZHJpdmVyX2RhdGE7CisJbG9uZyBpb2FkZHI7CisJaW50IGk7CisJdTggY2hpcF9yZXY7CisKKy8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCisJLy9wcmludGsoS0VSTl9JTkZPICJ4aXJjb21faW5pdF9vbmUoJXMpXG4iLCBwY2lfbmFtZShwZGV2KSk7CisKKwlib2FyZF9pZHgrKzsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKnRwKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBEUlZfTkFNRSAiJWQ6IGNhbm5vdCBhbGxvYyBldGhlcmRldiwgYWJvcnRpbmdcbiIsIGJvYXJkX2lkeCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCWRldi0+aXJxID0gcGRldi0+aXJxOworCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgZGV2LT5uYW1lKSkgeworCQlwcmludGsgKEtFUk5fRVJSIERSVl9OQU1FICIgJWQ6IGNhbm5vdCByZXNlcnZlIFBDSSByZXNvdXJjZXMsIGFib3J0aW5nXG4iLCBib2FyZF9pZHgpOworCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CisJfQorCisJLyogQnJpbmcgdGhlIGNoaXAgb3V0IG9mIHNsZWVwIG1vZGUuCisJICAgQ2F1dGlvbjogU25vb3plIG1vZGUgZG9lcyBub3Qgd29yayB3aXRoIHNvbWUgYm9hcmRzISAqLworCWlmICh4aXJjb21fdGJsW2NoaXBfaWR4XS5mbGFncyAmIEhBU19BQ1BJKQorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9QT1dFUk1HTVQsIDApOworCisJLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisJb3V0bF9DU1I2KGlubChpb2FkZHIgKyBDU1I2KSAmIH5FbmFibGVUeFJ4LCBpb2FkZHIpOworCS8qIENsZWFyIHRoZSBtaXNzZWQtcGFja2V0IGNvdW50ZXIuICovCisJKHZvbGF0aWxlIGludClpbmwoaW9hZGRyICsgQ1NSOCk7CisKKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaW5pdCgmdHAtPmxvY2spOworCXRwLT5wZGV2ID0gcGRldjsKKwl0cC0+Y2hpcF9pZCA9IGNoaXBfaWR4OworCS8qIEJ1Z0ZpeGVzOiBUaGUgMjExNDMtVEQgaGFuZ3Mgd2l0aCBQQ0kgV3JpdGUtYW5kLUludmFsaWRhdGUgY3ljbGVzLiAqLworCS8qIFhYWDogaXMgdGhpcyBuZWNlc3NhcnkgZm9yIFhpcmNvbT8gKi8KKwl0cC0+Y3NyMCA9IGNzcjAgJiB+RW5hYmxlTVdJOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwkvKiBUaGUgbG93ZXIgZm91ciBiaXRzIGFyZSB0aGUgbWVkaWEgdHlwZS4gKi8KKwlpZiAoYm9hcmRfaWR4ID49IDAgJiYgYm9hcmRfaWR4IDwgTUFYX1VOSVRTKSB7CisJCXRwLT5kZWZhdWx0X3BvcnQgPSBvcHRpb25zW2JvYXJkX2lkeF0gJiAxNTsKKwkJaWYgKChvcHRpb25zW2JvYXJkX2lkeF0gJiAweDkwKSB8fCBmdWxsX2R1cGxleFtib2FyZF9pZHhdID4gMCkKKwkJCXRwLT5mdWxsX2R1cGxleCA9IDE7CisJCWlmIChtdHVbYm9hcmRfaWR4XSA+IDApCisJCQlkZXYtPm10dSA9IG10dVtib2FyZF9pZHhdOworCX0KKwlpZiAoZGV2LT5tZW1fc3RhcnQpCisJCXRwLT5kZWZhdWx0X3BvcnQgPSBkZXYtPm1lbV9zdGFydDsKKwlpZiAodHAtPmRlZmF1bHRfcG9ydCkgeworCQlpZiAobWVkaWFfY2FwW3RwLT5kZWZhdWx0X3BvcnRdICYgTWVkaWFBbHdheXNGRCkKKwkJCXRwLT5mdWxsX2R1cGxleCA9IDE7CisJfQorCWlmICh0cC0+ZnVsbF9kdXBsZXgpCisJCXRwLT5hdXRvbmVnID0gMDsKKwllbHNlCisJCXRwLT5hdXRvbmVnID0gMTsKKwl0cC0+c3BlZWQxMDAgPSAxOworCisJLyogVGhlIFhpcmNvbS1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZ4aXJjb21fb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ4aXJjb21fc3RhcnRfeG1pdDsKKwlkZXYtPnN0b3AgPSAmeGlyY29tX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJnhpcmNvbV9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9ICZ4aXJjb21faW9jdGw7CisjaWZkZWYgSEFWRV9NVUxUSUNBU1QKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKyNlbmRpZgorCWRldi0+dHhfdGltZW91dCA9IHhpcmNvbV90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCVNFVF9FVEhUT09MX09QUyhkZXYsICZvcHMpOworCisJdHJhbnNjZWl2ZXJfdm9vZG9vKGRldik7CisKKwlyZWFkX21hY19hZGRyZXNzKGRldik7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpCisJCWdvdG8gZXJyX291dF9jbGVhcmRldjsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmNoaXBfcmV2KTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgcmV2ICVkIGF0ICUjM2x4LCIsCisJICAgICAgIGRldi0+bmFtZSwgeGlyY29tX3RibFtjaGlwX2lkeF0uY2hpcF9uYW1lLCBjaGlwX3JldiwgaW9hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiVjJTIuMlgiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiwgSVJRICVkLlxuIiwgZGV2LT5pcnEpOworCisJaWYgKHhpcmNvbV90YmxbY2hpcF9pZHhdLmZsYWdzICYgSEFTX01JSSkgeworCQlmaW5kX21paV90cmFuc2NlaXZlcnMoZGV2KTsKKwkJY2hlY2tfZHVwbGV4KGRldik7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfY2xlYXJkZXY6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0X2ZyZWVfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKworLyogTUlJIHRyYW5zY2VpdmVyIGNvbnRyb2wgc2VjdGlvbi4KKyAgIFJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKyAgIE1ESU8gcHJvdG9jb2wuICBTZWUgdGhlIE1JSSBzcGVjaWZpY2F0aW9ucyBvciBEUDgzODQwQSBkYXRhIHNoZWV0CisgICBmb3IgZGV0YWlscy4gKi8KKworLyogVGhlIG1heGltdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICBUaGUgbWluaW11bSB0aW1pbmcgaXMgdXN1YWxseQorICAgbWV0IGJ5IGJhY2stdG8tYmFjayBQQ0kgSS9PIGN5Y2xlcywgYnV0IHdlIGluc2VydCBhIGRlbGF5IHRvIGF2b2lkCisgICAib3ZlcmNsb2NraW5nIiBpc3N1ZXMgb3IgZnV0dXJlIDY2TWh6IFBDSS4gKi8KKyNkZWZpbmUgbWRpb19kZWxheSgpIGlubChtZGlvX2FkZHIpCisKKy8qIFJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKyAgIE1ESU8gcHJvdG9jb2wuICBJdCBpcyBqdXN0IGRpZmZlcmVudCBlbm91Z2ggZnJvbSB0aGUgRUVQUk9NIHByb3RvY29sCisgICB0byBub3Qgc2hhcmUgY29kZS4gIFRoZSBtYXhpdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICovCisjZGVmaW5lIE1ESU9fU0hJRlRfQ0xLCTB4MTAwMDAKKyNkZWZpbmUgTURJT19EQVRBX1dSSVRFMCAweDAwMDAwCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTEgMHgyMDAwMAorI2RlZmluZSBNRElPX0VOQgkJMHgwMDAwMAkJLyogSWdub3JlIHRoZSAweDAyMDAwIGRhdGFib29rIHNldHRpbmcuICovCisjZGVmaW5lIE1ESU9fRU5CX0lOCQkweDQwMDAwCisjZGVmaW5lIE1ESU9fREFUQV9SRUFECTB4ODAwMDAKKworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCWludCBpOworCWludCByZWFkX2NtZCA9ICgweGY2IDw8IDEwKSB8IChwaHlfaWQgPDwgNSkgfCBsb2NhdGlvbjsKKwlpbnQgcmV0dmFsID0gMDsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWxvbmcgbWRpb19hZGRyID0gaW9hZGRyICsgQ1NSOTsKKworCS8qIEVzdGFibGlzaCBzeW5jIGJ5IHNlbmRpbmcgYXQgbGVhc3QgMzIgbG9naWMgb25lcy4gKi8KKwlmb3IgKGkgPSAzMjsgaSA+PSAwOyBpLS0pIHsKKwkJb3V0bChNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJb3V0bChNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiAwOworCisJCW91dGwoTURJT19FTkIgfCBkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCW91dGwoTURJT19FTkIgfCBkYXRhdmFsIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJLyogUmVhZCB0aGUgdHdvIHRyYW5zaXRpb24sIDE2IGRhdGEsIGFuZCB3aXJlLWlkbGUgYml0cy4gKi8KKwlmb3IgKGkgPSAxOTsgaSA+IDA7IGktLSkgeworCQlvdXRsKE1ESU9fRU5CX0lOLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlubChtZGlvX2FkZHIpICYgTURJT19EQVRBX1JFQUQpID8gMSA6IDApOworCQlvdXRsKE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJcmV0dXJuIChyZXR2YWw+PjEpICYgMHhmZmZmOworfQorCisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpCit7CisJaW50IGk7CisJaW50IGNtZCA9ICgweDUwMDIgPDwgMTYpIHwgKHBoeV9pZCA8PCAyMykgfCAobG9jYXRpb24gPDwgMTgpIHwgdmFsdWU7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlsb25nIG1kaW9fYWRkciA9IGlvYWRkciArIENTUjk7CisKKwkvKiBFc3RhYmxpc2ggc3luYyBieSBzZW5kaW5nIDMyIGxvZ2ljIG9uZXMuICovCisJZm9yIChpID0gMzI7IGkgPj0gMDsgaS0tKSB7CisJCW91dGwoTURJT19FTkIgfCBNRElPX0RBVEFfV1JJVEUxLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCW91dGwoTURJT19FTkIgfCBNRElPX0RBVEFfV1JJVEUxIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJLyogU2hpZnQgdGhlIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKGNtZCAmICgxIDw8IGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiAwOworCQlvdXRsKE1ESU9fRU5CIHwgZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXRsKE1ESU9fRU5CIHwgZGF0YXZhbCB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCS8qIENsZWFyIG91dCBleHRyYSBiaXRzLiAqLworCWZvciAoaSA9IDI7IGkgPiAwOyBpLS0pIHsKKwkJb3V0bChNRElPX0VOQl9JTiwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXRsKE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkCit4aXJjb21fdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCisJeGlyY29tX2luaXRfcmluZyhkZXYpOworCS8qIENsZWFyIHRoZSB0eCByaW5nICovCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXRwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQl0cC0+dHhfcmluZ1tpXS5zdGF0dXMgPSAwOworCX0KKworCWlmICh4aXJjb21fZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHhpcmNvbV91cCgpIGlycSAlZC5cbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCisJb3V0bCh2aXJ0X3RvX2J1cyh0cC0+cnhfcmluZyksIGlvYWRkciArIENTUjMpOworCW91dGwodmlydF90b19idXModHAtPnR4X3JpbmcpLCBpb2FkZHIgKyBDU1I0KTsKKworCXRwLT5zYXZlZF9pZl9wb3J0ID0gZGV2LT5pZl9wb3J0OworCWlmIChkZXYtPmlmX3BvcnQgPT0gMCkKKwkJZGV2LT5pZl9wb3J0ID0gdHAtPmRlZmF1bHRfcG9ydDsKKworCXRwLT5jc3I2ID0gVHhUaHJlc2gxMCAvKnwgRnVsbER1cGxleEJpdCovOwkJCQkJCS8qIFhYWDogd2h5IDEwIGFuZCBub3QgMTAwPyAqLworCisJc2V0X3J4X21vZGUoZGV2KTsKKworCS8qIFN0YXJ0IHRoZSBjaGlwJ3MgVHggdG8gcHJvY2VzcyBzZXR1cCBmcmFtZS4gKi8KKwlvdXRsX0NTUjYodHAtPmNzcjYsIGlvYWRkcik7CisJb3V0bF9DU1I2KHRwLT5jc3I2IHwgRW5hYmxlVHgsIGlvYWRkcik7CisKKwkvKiBBY2tub3dsZWRnZSBhbGwgb3V0c3RhbmRpbmcgaW50ZXJydXB0cyBzb3VyY2VzICovCisJb3V0bCh4aXJjb21fdGJsW3RwLT5jaGlwX2lkXS52YWxpZF9pbnRycywgaW9hZGRyICsgQ1NSNSk7CisJLyogRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJb3V0bCh4aXJjb21fdGJsW3RwLT5jaGlwX2lkXS52YWxpZF9pbnRycywgaW9hZGRyICsgQ1NSNyk7CisJLyogRW5hYmxlIFJ4ICovCisJb3V0bF9DU1I2KHRwLT5jc3I2IHwgRW5hYmxlVHhSeCwgaW9hZGRyKTsKKwkvKiBSeCBwb2xsIGRlbWFuZCAqLworCW91dGwoMCwgaW9hZGRyICsgQ1NSMik7CisKKwkvKiBUZWxsIHRoZSBuZXQgbGF5ZXIgd2UncmUgcmVhZHkgKi8KKwluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKworCS8qIENoZWNrIGN1cnJlbnQgbWVkaWEgc3RhdGUgKi8KKwl4aXJjb21fbWVkaWFfY2hhbmdlKGRldik7CisKKwlpZiAoeGlyY29tX2RlYnVnID4gMikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgeGlyY29tX3VwKCksIENTUjAgJTguOHgsIENTUjUgJTguOHggQ1NSNiAlOC44eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlubChpb2FkZHIgKyBDU1IwKSwgaW5sKGlvYWRkciArIENTUjUpLAorCQkJICAgaW5sKGlvYWRkciArIENTUjYpKTsKKwl9Cit9CisKKworc3RhdGljIGludAoreGlyY29tX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJnhpcmNvbV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldikpCisJCXJldHVybiAtRUFHQUlOOworCisJeGlyY29tX3VwKGRldik7CisJdHAtPm9wZW4gPSAxOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgeGlyY29tX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKG1lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworCQkvKiBEbyBub3RoaW5nIC0tIHRoZSBtZWRpYSBtb25pdG9yIHNob3VsZCBoYW5kbGUgdGhpcy4gKi8KKwkJaWYgKHhpcmNvbV9kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJhbnNtaXQgdGltZW91dCB1c2luZyBNSUkgZGV2aWNlLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUpOworCX0KKworI2lmIGRlZmluZWQod2F5X3Rvb19tYW55X21lc3NhZ2VzKQorCWlmICh4aXJjb21fZGVidWcgPiAzKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJCXU4ICpidWYgPSAodTggKikodHAtPnJ4X3JpbmdbaV0uYnVmZmVyMSk7CisJCQlpbnQgajsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlMmQ6ICU4Ljh4ICU4Ljh4ICU4Ljh4ICU4Ljh4ICAiCisJCQkJICAgIiUyLjJ4ICUyLjJ4ICUyLjJ4LlxuIiwKKwkJCQkgICBpLCAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLnN0YXR1cywKKwkJCQkgICAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLmxlbmd0aCwKKwkJCQkgICAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLmJ1ZmZlcjEsCisJCQkJICAgKHVuc2lnbmVkIGludCl0cC0+cnhfcmluZ1tpXS5idWZmZXIyLAorCQkJCSAgIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0pOworCQkJZm9yIChqID0gMDsgYnVmW2pdICE9IDB4ZWUgJiYgaiA8IDE2MDA7IGorKykKKwkJCQlpZiAoaiA8IDEwMCkgcHJpbnRrKCIgJTIuMngiLCBidWZbal0pOworCQkJcHJpbnRrKCIgaj0lZC5cbiIsIGopOworCQl9CisJCXByaW50ayhLRVJOX0RFQlVHICIgIFJ4IHJpbmcgJTguOHg6ICIsIChpbnQpdHAtPnJ4X3JpbmcpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAlOC44eCIsICh1bnNpZ25lZCBpbnQpdHAtPnJ4X3JpbmdbaV0uc3RhdHVzKTsKKwkJcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAiICBUeCByaW5nICU4Ljh4OiAiLCAoaW50KXRwLT50eF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKCIgJTguOHgiLCAodW5zaWduZWQgaW50KXRwLT50eF9yaW5nW2ldLnN0YXR1cyk7CisJCXByaW50aygiXG4iKTsKKwl9CisjZW5kaWYKKworCS8qIFN0b3AgYW5kIHJlc3RhcnQgdGhlIGNoaXAncyBUeC9SeCBwcm9jZXNzZXMgLiAqLworCW91dGxfQ1NSNih0cC0+Y3NyNiB8IEVuYWJsZVJ4LCBpb2FkZHIpOworCW91dGxfQ1NSNih0cC0+Y3NyNiB8IEVuYWJsZVR4UngsIGlvYWRkcik7CisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLworCW91dGwoMCwgaW9hZGRyICsgQ1NSMSk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCXRwLT5zdGF0cy50eF9lcnJvcnMrKzsKK30KKworCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQgeGlyY29tX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJdHAtPnR4X2Z1bGwgPSAwOworCXRwLT5jdXJfcnggPSB0cC0+Y3VyX3R4ID0gMDsKKwl0cC0+ZGlydHlfcnggPSB0cC0+ZGlydHlfdHggPSAwOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXRwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCXRwLT5yeF9yaW5nW2ldLmxlbmd0aCA9IFBLVF9CVUZfU1o7CisJCXRwLT5yeF9yaW5nW2ldLmJ1ZmZlcjIgPSB2aXJ0X3RvX2J1cygmdHAtPnJ4X3JpbmdbaSsxXSk7CisJCXRwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCX0KKwkvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IGFzIHdyYXBwaW5nIHRoZSByaW5nLiAqLworCXRwLT5yeF9yaW5nW2ktMV0ubGVuZ3RoID0gUEtUX0JVRl9TWiB8IFJ4MVJpbmdXcmFwOworCXRwLT5yeF9yaW5nW2ktMV0uYnVmZmVyMiA9IHZpcnRfdG9fYnVzKCZ0cC0+cnhfcmluZ1swXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJLyogTm90ZSB0aGUgcmVjZWl2ZSBidWZmZXIgbXVzdCBiZSBsb25nd29yZCBhbGlnbmVkLgorCQkgICBkZXZfYWxsb2Nfc2tiKCkgcHJvdmlkZXMgMTYgYnl0ZSBhbGlnbm1lbnQuICBCdXQgZG8gKm5vdCoKKwkJICAgdXNlIHNrYl9yZXNlcnZlKCkgdG8gYWxpZ24gdGhlIElQIGhlYWRlciEgKi8KKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7CisJCXRwLT5yeF9za2J1ZmZbaV0gPSBza2I7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCXRwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IFJ4MERlc2NPd25lZDsJLyogT3duZWQgYnkgWGlyY29tIGNoaXAgKi8KKwkJdHAtPnJ4X3JpbmdbaV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHNrYi0+dGFpbCk7CisJfQorCXRwLT5kaXJ0eV9yeCA9ICh1bnNpZ25lZCBpbnQpKGkgLSBSWF9SSU5HX1NJWkUpOworCisJLyogVGhlIFR4IGJ1ZmZlciBkZXNjcmlwdG9yIGlzIGZpbGxlZCBpbiBhcyBuZWVkZWQsIGJ1dCB3ZQorCSAgIGRvIG5lZWQgdG8gY2xlYXIgdGhlIG93bmVyc2hpcCBiaXQuICovCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXRwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQl0cC0+dHhfcmluZ1tpXS5zdGF0dXMgPSAwOworCQl0cC0+dHhfcmluZ1tpXS5idWZmZXIyID0gdmlydF90b19idXMoJnRwLT50eF9yaW5nW2krMV0pOworI2lmZGVmIENBUkRCVVMKKwkJaWYgKHRwLT5jaGlwX2lkID09IFgzMjAxXzMpCisJCQl0cC0+dHhfYWxpZ25lZF9za2J1ZmZbaV0gPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOworI2VuZGlmIC8qIENBUkRCVVMgKi8KKwl9CisJdHAtPnR4X3JpbmdbaS0xXS5idWZmZXIyID0gdmlydF90b19idXMoJnRwLT50eF9yaW5nWzBdKTsKK30KKworCitzdGF0aWMgaW50Cit4aXJjb21fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeTsKKwl1MzIgZmxhZzsKKworCS8qIENhdXRpb246IHRoZSB3cml0ZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgc2V0IHRoZSBiYXNlIGFkZHJlc3MKKwkgICB3aXRoIHRoZSAib3duZXJzaGlwIiBiaXRzIGxhc3QuICovCisKKwkvKiBDYWxjdWxhdGUgdGhlIG5leHQgVHggZGVzY3JpcHRvciBlbnRyeS4gKi8KKwllbnRyeSA9IHRwLT5jdXJfdHggJSBUWF9SSU5HX1NJWkU7CisKKwl0cC0+dHhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKyNpZmRlZiBDQVJEQlVTCisJaWYgKHRwLT5jaGlwX2lkID09IFgzMjAxXzMpIHsKKwkJbWVtY3B5KHRwLT50eF9hbGlnbmVkX3NrYnVmZltlbnRyeV0tPmRhdGEsc2tiLT5kYXRhLHNrYi0+bGVuKTsKKwkJdHAtPnR4X3JpbmdbZW50cnldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2J1cyh0cC0+dHhfYWxpZ25lZF9za2J1ZmZbZW50cnldLT5kYXRhKTsKKwl9IGVsc2UKKyNlbmRpZgorCQl0cC0+dHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHNrYi0+ZGF0YSk7CisKKwlpZiAodHAtPmN1cl90eCAtIHRwLT5kaXJ0eV90eCA8IFRYX1JJTkdfU0laRS8yKSB7LyogVHlwaWNhbCBwYXRoICovCisJCWZsYWcgPSBUeDFXaG9sZVBrdDsgLyogTm8gaW50ZXJydXB0ICovCisJfSBlbHNlIGlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4ID09IFRYX1JJTkdfU0laRS8yKSB7CisJCWZsYWcgPSBUeDFXaG9sZVBrdCB8IFR4MUNvbXBsSW50cjsgLyogVHgtZG9uZSBpbnRyLiAqLworCX0gZWxzZSBpZiAodHAtPmN1cl90eCAtIHRwLT5kaXJ0eV90eCA8IFRYX1JJTkdfU0laRSAtIDIpIHsKKwkJZmxhZyA9IFR4MVdob2xlUGt0OyAvKiBObyBUeC1kb25lIGludHIuICovCisJfSBlbHNlIHsKKwkJLyogTGVhdmUgcm9vbSBmb3Igc2V0X3J4X21vZGUoKSB0byBmaWxsIGVudHJpZXMuICovCisJCWZsYWcgPSBUeDFXaG9sZVBrdCB8IFR4MUNvbXBsSW50cjsgLyogVHgtZG9uZSBpbnRyLiAqLworCQl0cC0+dHhfZnVsbCA9IDE7CisJfQorCWlmIChlbnRyeSA9PSBUWF9SSU5HX1NJWkUgLSAxKQorCQlmbGFnIHw9IFR4MVdob2xlUGt0IHwgVHgxQ29tcGxJbnRyIHwgVHgxUmluZ1dyYXA7CisKKwl0cC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gc2tiLT5sZW4gfCBmbGFnOworCXRwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBUeDBEZXNjT3duZWQ7CS8qIFBhc3Mgb3duZXJzaGlwIHRvIHRoZSBjaGlwLiAqLworCXRwLT5jdXJfdHgrKzsKKwlpZiAodHAtPnR4X2Z1bGwpCisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJZWxzZQorCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLworCW91dGwoMCwgZGV2LT5iYXNlX2FkZHIgKyBDU1IxKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgeGlyY29tX21lZGlhX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTE2IHJlZzAsIHJlZzEsIHJlZzQsIHJlZzU7CisJdTMyIGNzcjYgPSBpbmwoaW9hZGRyICsgQ1NSNiksIG5ld2NzcjY7CisKKwkvKiByZXNldCBzdGF0dXMgZmlyc3QgKi8KKwltZGlvX3JlYWQoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0JNQ1IpOworCW1kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCBNSUlfQk1TUik7CisKKwlyZWcwID0gbWRpb19yZWFkKGRldiwgdHAtPnBoeXNbMF0sIE1JSV9CTUNSKTsKKwlyZWcxID0gbWRpb19yZWFkKGRldiwgdHAtPnBoeXNbMF0sIE1JSV9CTVNSKTsKKworCWlmIChyZWcxICYgQk1TUl9MU1RBVFVTKSB7CisJCS8qIGxpbmsgaXMgdXAgKi8KKwkJaWYgKHJlZzAgJiBCTUNSX0FORU5BQkxFKSB7CisJCQkvKiBhdXRvbmVnb3RpYXRpb24gaXMgZW5hYmxlZCAqLworCQkJcmVnNCA9IG1kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCBNSUlfQURWRVJUSVNFKTsKKwkJCXJlZzUgPSBtZGlvX3JlYWQoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0xQQSk7CisJCQlpZiAocmVnNCAmIEFEVkVSVElTRV8xMDBGVUxMICYmIHJlZzUgJiBMUEFfMTAwRlVMTCkgeworCQkJCXRwLT5zcGVlZDEwMCA9IDE7CisJCQkJdHAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJCX0gZWxzZSBpZiAocmVnNCAmIEFEVkVSVElTRV8xMDBIQUxGICYmIHJlZzUgJiBMUEFfMTAwSEFMRikgeworCQkJCXRwLT5zcGVlZDEwMCA9IDE7CisJCQkJdHAtPmZ1bGxfZHVwbGV4ID0gMDsKKwkJCX0gZWxzZSBpZiAocmVnNCAmIEFEVkVSVElTRV8xMEZVTEwgJiYgcmVnNSAmIExQQV8xMEZVTEwpIHsKKwkJCQl0cC0+c3BlZWQxMDAgPSAwOworCQkJCXRwLT5mdWxsX2R1cGxleCA9IDE7CisJCQl9IGVsc2UgeworCQkJCXRwLT5zcGVlZDEwMCA9IDA7CisJCQkJdHAtPmZ1bGxfZHVwbGV4ID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGF1dG9uZWdvdGlhdGlvbiBpcyBkaXNhYmxlZCAqLworCQkJaWYgKHJlZzAgJiBCTUNSX1NQRUVEMTAwKQorCQkJCXRwLT5zcGVlZDEwMCA9IDE7CisJCQllbHNlCisJCQkJdHAtPnNwZWVkMTAwID0gMDsKKwkJCWlmIChyZWcwICYgQk1DUl9GVUxMRFBMWCkKKwkJCQl0cC0+ZnVsbF9kdXBsZXggPSAxOworCQkJZWxzZQorCQkJCXRwLT5mdWxsX2R1cGxleCA9IDA7CisJCX0KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBMaW5rIGlzIHVwLCBydW5uaW5nIGF0ICVzTWJpdCAlcy1kdXBsZXhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsCisJCSAgICAgICB0cC0+c3BlZWQxMDAgPyAiMTAwIiA6ICIxMCIsCisJCSAgICAgICB0cC0+ZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIpOworCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCW5ld2NzcjYgPSBjc3I2ICYgfkZ1bGxEdXBsZXhCaXQ7CisJCWlmICh0cC0+ZnVsbF9kdXBsZXgpCisJCQluZXdjc3I2IHw9IEZ1bGxEdXBsZXhCaXQ7CisJCWlmIChuZXdjc3I2ICE9IGNzcjYpCisJCQlvdXRsX0NTUjYobmV3Y3NyNiwgaW9hZGRyICsgQ1NSNik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBMaW5rIGlzIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrX2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiByZWcwOworCisJbWRpb193cml0ZShkZXYsIHRwLT5waHlzWzBdLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisJdWRlbGF5KDUwMCk7CisJd2hpbGUgKG1kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCBNSUlfQk1DUikgJiBCTUNSX1JFU0VUKTsKKworCXJlZzAgPSBtZGlvX3JlYWQoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0JNQ1IpOworCW1kaW9fd3JpdGUoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0FEVkVSVElTRSwgdHAtPmFkdmVydGlzaW5nWzBdKTsKKworCWlmICh0cC0+YXV0b25lZykgeworCQlyZWcwICY9IH4oQk1DUl9TUEVFRDEwMCB8IEJNQ1JfRlVMTERQTFgpOworCQlyZWcwIHw9IEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVDsKKwl9IGVsc2UgeworCQlyZWcwICY9IH4oQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKwkJaWYgKHRwLT5zcGVlZDEwMCkKKwkJCXJlZzAgfD0gQk1DUl9TUEVFRDEwMDsKKwkJaWYgKHRwLT5mdWxsX2R1cGxleCkKKwkJCXJlZzAgfD0gQk1DUl9GVUxMRFBMWDsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBMaW5rIGZvcmNlZCB0byAlc01iaXQgJXMtZHVwbGV4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLAorCQkgICAgICAgdHAtPnNwZWVkMTAwID8gIjEwMCIgOiAiMTAiLAorCQkgICAgICAgdHAtPmZ1bGxfZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKTsKKwl9CisJbWRpb193cml0ZShkZXYsIHRwLT5waHlzWzBdLCBNSUlfQk1DUiwgcmVnMCk7Cit9CisKKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworc3RhdGljIGlycXJldHVybl90IHhpcmNvbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGNzcjUsIHdvcmtfYnVkZ2V0ID0gbWF4X2ludGVycnVwdF93b3JrOworCWludCBoYW5kbGVkID0gMDsKKworCXNwaW5fbG9jayAoJnRwLT5sb2NrKTsKKworCWRvIHsKKwkJY3NyNSA9IGlubChpb2FkZHIgKyBDU1I1KTsKKwkJLyogQWNrbm93bGVkZ2UgYWxsIG9mIHRoZSBjdXJyZW50IGludGVycnVwdCBzb3VyY2VzIEFTQVAuICovCisJCW91dGwoY3NyNSAmIDB4MDAwMWZmZmYsIGlvYWRkciArIENTUjUpOworCisJCWlmICh4aXJjb21fZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQgIGNzcjU9JSM4Ljh4IG5ldyBjc3I1PSUjOC44eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBjc3I1LCBpbmwoZGV2LT5iYXNlX2FkZHIgKyBDU1I1KSk7CisKKwkJaWYgKGNzcjUgPT0gMHhmZmZmZmZmZikKKwkJCWJyZWFrOwkvKiBhbGwgYml0cyBzZXQsIGFzc3VtZSBQQ01DSUEgY2FyZCByZW1vdmVkICovCisKKwkJaWYgKChjc3I1ICYgKE5vcm1hbEludHJ8QWJub3JtYWxJbnRyKSkgPT0gMCkKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisJCWlmIChjc3I1ICYgKFJ4SW50ciB8IFJ4Tm9CdWYpKQorCQkJd29ya19idWRnZXQgLT0geGlyY29tX3J4KGRldik7CisKKwkJaWYgKGNzcjUgJiAoVHhOb0J1ZiB8IFR4RGllZCB8IFR4SW50cikpIHsKKwkJCXVuc2lnbmVkIGludCBkaXJ0eV90eDsKKworCQkJZm9yIChkaXJ0eV90eCA9IHRwLT5kaXJ0eV90eDsgdHAtPmN1cl90eCAtIGRpcnR5X3R4ID4gMDsKKwkJCQkgZGlydHlfdHgrKykgeworCQkJCWludCBlbnRyeSA9IGRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQkJCWludCBzdGF0dXMgPSB0cC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzOworCisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWJyZWFrOwkJCS8qIEl0IHN0aWxsIGhhc24ndCBiZWVuIFR4ZWQgKi8KKwkJCQkvKiBDaGVjayBmb3IgUnggZmlsdGVyIHNldHVwIGZyYW1lcy4gKi8KKwkJCQlpZiAodHAtPnR4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkKKwkJCQkgIGNvbnRpbnVlOworCisJCQkJaWYgKHN0YXR1cyAmIFR4MERlc2NFcnJvcikgeworCQkJCQkvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJCQlpZiAoeGlyY29tX2RlYnVnID4gMSkKKwkJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJhbnNtaXQgZXJyb3IsIFR4IHN0YXR1cyAlOC44eC5cbiIsCisJCQkJCQkJICAgZGV2LT5uYW1lLCBzdGF0dXMpOworI2VuZGlmCisJCQkJCXRwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQkJaWYgKHN0YXR1cyAmIFR4ME1hbnlDb2xsKSB7CisJCQkJCQl0cC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJfQorCQkJCQlpZiAoc3RhdHVzICYgVHgwTm9DYXJyaWVyKSB0cC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQkJaWYgKHN0YXR1cyAmIFR4MExhdGVDb2xsKSB0cC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJCQlpZiAoc3RhdHVzICYgVHgwVW5kZXJmbG93KSB0cC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQl9IGVsc2UgeworCQkJCQl0cC0+c3RhdHMudHhfYnl0ZXMgKz0gdHAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCAmIDB4N2ZmOworCQkJCQl0cC0+c3RhdHMuY29sbGlzaW9ucyArPSAoc3RhdHVzID4+IDMpICYgMTU7CisJCQkJCXRwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJfQorCisJCQkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQkJCWRldl9rZnJlZV9za2JfaXJxKHRwLT50eF9za2J1ZmZbZW50cnldKTsKKwkJCQl0cC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQl9CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJaWYgKHRwLT5jdXJfdHggLSBkaXJ0eV90eCA+IFRYX1JJTkdfU0laRSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dC1vZi1zeW5jIGRpcnR5IHBvaW50ZXIsICVkIHZzLiAlZCwgZnVsbD0lZC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgZGlydHlfdHgsIHRwLT5jdXJfdHgsIHRwLT50eF9mdWxsKTsKKwkJCQlkaXJ0eV90eCArPSBUWF9SSU5HX1NJWkU7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKHRwLT50eF9mdWxsICYmCisJCQkgICAgdHAtPmN1cl90eCAtIGRpcnR5X3R4ICA8IFRYX1JJTkdfU0laRSAtIDIpCisJCQkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwgKi8KKwkJCQl0cC0+dHhfZnVsbCA9IDA7CisKKwkJCWlmICh0cC0+dHhfZnVsbCkKKwkJCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCQkJZWxzZQorCQkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisKKwkJCXRwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCQkJaWYgKGNzcjUgJiBUeERpZWQpIHsKKwkJCQlpZiAoeGlyY29tX2RlYnVnID4gMikKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRoZSB0cmFuc21pdHRlciBzdG9wcGVkLiIKKwkJCQkJCSAgICIgIENTUjUgaXMgJXgsIENTUjYgJXgsIG5ldyBDU1I2ICV4LlxuIiwKKwkJCQkJCSAgIGRldi0+bmFtZSwgY3NyNSwgaW5sKGlvYWRkciArIENTUjYpLCB0cC0+Y3NyNik7CisJCQkJb3V0bF9DU1I2KHRwLT5jc3I2IHwgRW5hYmxlUngsIGlvYWRkcik7CisJCQkJb3V0bF9DU1I2KHRwLT5jc3I2IHwgRW5hYmxlVHhSeCwgaW9hZGRyKTsKKwkJCX0KKwkJfQorCisJCS8qIExvZyBlcnJvcnMuICovCisJCWlmIChjc3I1ICYgQWJub3JtYWxJbnRyKSB7CS8qIEFibm9ybWFsIGVycm9yIHN1bW1hcnkgYml0LiAqLworCQkJaWYgKGNzcjUgJiBMaW5rQ2hhbmdlKQorCQkJCXhpcmNvbV9tZWRpYV9jaGFuZ2UoZGV2KTsKKwkJCWlmIChjc3I1ICYgVHhGSUZPVW5kZXJmbG93KSB7CisJCQkJaWYgKCh0cC0+Y3NyNiAmIFR4VGhyZXNoTWFzaykgIT0gVHhUaHJlc2hNYXNrKQorCQkJCQl0cC0+Y3NyNiArPSAoMSA8PCBUeFRocmVzaFNoaWZ0KTsJLyogQnVtcCB1cCB0aGUgVHggdGhyZXNob2xkICovCisJCQkJZWxzZQorCQkJCQl0cC0+Y3NyNiB8PSBUeFN0b3JlRm9ydzsgIC8qIFN0b3JlLW4tZm9yd2FyZC4gKi8KKwkJCQkvKiBSZXN0YXJ0IHRoZSB0cmFuc21pdCBwcm9jZXNzLiAqLworCQkJCW91dGxfQ1NSNih0cC0+Y3NyNiB8IEVuYWJsZVJ4LCBpb2FkZHIpOworCQkJCW91dGxfQ1NSNih0cC0+Y3NyNiB8IEVuYWJsZVR4UngsIGlvYWRkcik7CisJCQl9CisJCQlpZiAoY3NyNSAmIFJ4RGllZCkgewkJLyogTWlzc2VkIGEgUnggZnJhbWUuICovCisJCQkJdHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCXRwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlubChpb2FkZHIgKyBDU1I4KSAmIDB4ZmZmZjsKKwkJCQlvdXRsX0NTUjYodHAtPmNzcjYgfCBFbmFibGVUeFJ4LCBpb2FkZHIpOworCQkJfQorCQkJLyogQ2xlYXIgYWxsIGVycm9yIHNvdXJjZXMsIGluY2x1ZGVkIHVuZG9jdW1lbnRlZCBvbmVzISAqLworCQkJb3V0bCgweDA4MDBmN2JhLCBpb2FkZHIgKyBDU1I1KTsKKwkJfQorCQlpZiAoLS13b3JrX2J1ZGdldCA8IDApIHsKKwkJCWlmICh4aXJjb21fZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGR1cmluZyBhbiBpbnRlcnJ1cHQsICIKKwkJCQkJICAgImNzcjU9MHglOC44eC5cbiIsIGRldi0+bmFtZSwgY3NyNSk7CisJCQkvKiBBY2tub3dsZWRnZSBhbGwgaW50ZXJydXB0IHNvdXJjZXMuICovCisJCQlvdXRsKDB4ODAwMWZmZmYsIGlvYWRkciArIENTUjUpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgxKTsKKworCWlmICh4aXJjb21fZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBjc3I1PSUjNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlubChpb2FkZHIgKyBDU1I1KSk7CisKKwlzcGluX3VubG9jayAoJnRwLT5sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCitzdGF0aWMgaW50Cit4aXJjb21fcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnkgPSB0cC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCWludCByeF93b3JrX2xpbWl0ID0gdHAtPmRpcnR5X3J4ICsgUlhfUklOR19TSVpFIC0gdHAtPmN1cl9yeDsKKwlpbnQgd29ya19kb25lID0gMDsKKworCWlmICh4aXJjb21fZGVidWcgPiA0KQorCQlwcmludGsoS0VSTl9ERUJVRyAiIEluIHhpcmNvbV9yeCgpLCBlbnRyeSAlZCAlOC44eC5cbiIsIGVudHJ5LAorCQkJICAgdHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyk7CisJLyogSWYgd2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKwl3aGlsZSAodHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyA+PSAwKSB7CisJCXMzMiBzdGF0dXMgPSB0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzOworCisJCWlmICh4aXJjb21fZGVidWcgPiA1KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiBJbiB4aXJjb21fcngoKSwgZW50cnkgJWQgJTguOHguXG4iLCBlbnRyeSwKKwkJCQkgICB0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKKwkJaWYgKC0tcnhfd29ya19saW1pdCA8IDApCisJCQlicmVhazsKKwkJaWYgKChzdGF0dXMgJiAweDM4MDA4MzAwKSAhPSAweDAzMDApIHsKKwkJCWlmICgoc3RhdHVzICYgMHgzODAwMDMwMCkgIT0gMHgwMzAwKSB7CisJCQkJLyogSWdub3JlIGVhcmxpZXIgYnVmZmVycy4gKi8KKwkJCQlpZiAoKHN0YXR1cyAmIDB4ZmZmZikgIT0gMHg3ZmZmKSB7CisJCQkJCWlmICh4aXJjb21fZGVidWcgPiAxKQorCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCBmcmFtZSAiCisJCQkJCQkJICAgInNwYW5uZWQgbXVsdGlwbGUgYnVmZmVycywgc3RhdHVzICU4Ljh4IVxuIiwKKwkJCQkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQkJCXRwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJfQorCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBSeDBEZXNjRXJyb3IpIHsKKwkJCQkvKiBUaGVyZSB3YXMgYSBmYXRhbCBlcnJvci4gKi8KKwkJCQlpZiAoeGlyY29tX2RlYnVnID4gMikKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWNlaXZlIGVycm9yLCBSeCBzdGF0dXMgJTguOHguXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJCXRwLT5zdGF0cy5yeF9lcnJvcnMrKzsgLyogZW5kIG9mIGEgcGFja2V0LiovCisJCQkJaWYgKHN0YXR1cyAmIChSeDBSdW50IHwgUngwSHVnZUZyYW1lKSkgdHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgUngwQ1JDRXJyb3IpIHRwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBPbWl0IHRoZSBmb3VyIG9jdGV0IENSQyBmcm9tIHRoZSBsZW5ndGguICovCisJCQlzaG9ydCBwa3RfbGVuID0gKChzdGF0dXMgPj4gMTYpICYgMHg3ZmYpIC0gNDsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJaWYgKHBrdF9sZW4gPiAxNTE4KSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEJvZ3VzIHBhY2tldCBzaXplIG9mICVkICglI3gpLlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBwa3RfbGVuLCBwa3RfbGVuKTsKKwkJCQlwa3RfbGVuID0gMTUxODsKKwkJCQl0cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJfQorI2VuZGlmCisJCQkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGxvbmcgZW5vdWdoIHRvIGFjY2VwdCB3aXRob3V0IGNvcHlpbmcKKwkJCSAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KKwkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCisJCQkJJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisjaWYgISBkZWZpbmVkKF9fYWxwaGFfXykKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgYnVzX3RvX3ZpcnQodHAtPnJ4X3JpbmdbZW50cnldLmJ1ZmZlcjEpLAorCQkJCQkJCQkgcGt0X2xlbiwgMCk7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworI2Vsc2UKKwkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCQkgICBidXNfdG9fdmlydCh0cC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSksIHBrdF9sZW4pOworI2VuZGlmCisJCQkJd29ya19kb25lKys7CisJCQl9IGVsc2UgeyAJLyogUGFzcyB1cCB0aGUgc2tiIGFscmVhZHkgb24gdGhlIFJ4IHJpbmcuICovCisJCQkJc2tiX3B1dChza2IgPSB0cC0+cnhfc2tidWZmW2VudHJ5XSwgcGt0X2xlbik7CisJCQkJdHAtPnJ4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJdHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCXRwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisJCWVudHJ5ID0gKCsrdHAtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CisJfQorCisJLyogUmVmaWxsIHRoZSBSeCByaW5nIGJ1ZmZlcnMuICovCisJZm9yICg7IHRwLT5jdXJfcnggLSB0cC0+ZGlydHlfcnggPiAwOyB0cC0+ZGlydHlfcngrKykgeworCQllbnRyeSA9IHRwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwkJaWYgKHRwLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQlza2IgPSB0cC0+cnhfc2tidWZmW2VudHJ5XSA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCQl0cC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHNrYi0+dGFpbCk7CisJCQl3b3JrX2RvbmUrKzsKKwkJfQorCQl0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gUngwRGVzY093bmVkOworCX0KKworCXJldHVybiB3b3JrX2RvbmU7Cit9CisKKworc3RhdGljIHZvaWQKK3hpcmNvbV9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJb3V0bCgwLCBpb2FkZHIgKyBDU1I3KTsKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKwlvdXRsX0NTUjYoaW5sKGlvYWRkciArIENTUjYpICYgfkVuYWJsZVR4UngsIGlvYWRkcik7CisKKwlpZiAoaW5sKGlvYWRkciArIENTUjYpICE9IDB4ZmZmZmZmZmYpCisJCXRwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlubChpb2FkZHIgKyBDU1I4KSAmIDB4ZmZmZjsKKworCWRldi0+aWZfcG9ydCA9IHRwLT5zYXZlZF9pZl9wb3J0OworfQorCisKK3N0YXRpYyBpbnQKK3hpcmNvbV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlpZiAoeGlyY29tX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlMi4yeC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlubChpb2FkZHIgKyBDU1I1KSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJeGlyY29tX2Rvd24oZGV2KTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJLyogRnJlZSBhbGwgdGhlIHNrYnVmZnMgaW4gdGhlIFJ4IHF1ZXVlLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHAtPnJ4X3NrYnVmZltpXTsKKwkJdHAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJCXRwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CQkvKiBOb3Qgb3duZWQgYnkgWGlyY29tIGNoaXAuICovCisJCXRwLT5yeF9yaW5nW2ldLmxlbmd0aCA9IDA7CisJCXRwLT5yeF9yaW5nW2ldLmJ1ZmZlcjEgPSAweEJBREYwMEQwOyAvKiBBbiBpbnZhbGlkIGFkZHJlc3MuICovCisJCWlmIChza2IpIHsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKHRwLT50eF9za2J1ZmZbaV0pCisJCQlkZXZfa2ZyZWVfc2tiKHRwLT50eF9za2J1ZmZbaV0pOworCQl0cC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwl9CisKKwl0cC0+b3BlbiA9IDA7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp4aXJjb21fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQl0cC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpbmwoaW9hZGRyICsgQ1NSOCkgJiAweGZmZmY7CisKKwlyZXR1cm4gJnRwLT5zdGF0czsKK30KKworc3RhdGljIGludCB4aXJjb21fZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwllY21kLT5zdXBwb3J0ZWQgPQorCQkJU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8CisJCQlTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCVNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKKwkJCVNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCVNVUFBPUlRFRF9BdXRvbmVnIHwKKwkJCVNVUFBPUlRFRF9NSUk7CisKKwllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfTUlJOworCWlmICh0cC0+YWR2ZXJ0aXNpbmdbMF0gJiBBRFZFUlRJU0VfMTBIQUxGKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZjsKKwlpZiAodHAtPmFkdmVydGlzaW5nWzBdICYgQURWRVJUSVNFXzEwRlVMTCkKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGw7CisJaWYgKHRwLT5hZHZlcnRpc2luZ1swXSAmIEFEVkVSVElTRV8xMDBIQUxGKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGY7CisJaWYgKHRwLT5hZHZlcnRpc2luZ1swXSAmIEFEVkVSVElTRV8xMDBGVUxMKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7CisJaWYgKHRwLT5hdXRvbmVnKSB7CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKKwkJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCX0gZWxzZQorCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCisJZWNtZC0+cG9ydCA9IFBPUlRfTUlJOworCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKwllY21kLT5waHlfYWRkcmVzcyA9IHRwLT5waHlzWzBdOworCWVjbWQtPnNwZWVkID0gdHAtPnNwZWVkMTAwID8gU1BFRURfMTAwIDogU1BFRURfMTA7CisJZWNtZC0+ZHVwbGV4ID0gdHAtPmZ1bGxfZHVwbGV4ID8gRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKKwllY21kLT5tYXh0eHBrdCA9IFRYX1JJTkdfU0laRSAvIDI7CisJZWNtZC0+bWF4cnhwa3QgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhpcmNvbV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiBhdXRvbmVnLCBzcGVlZDEwMCwgZnVsbF9kdXBsZXg7CisKKwlhdXRvbmVnID0gKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpOworCXNwZWVkMTAwID0gKGVjbWQtPnNwZWVkID09IFNQRUVEXzEwMCk7CisJZnVsbF9kdXBsZXggPSAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKTsKKworCXRwLT5hdXRvbmVnID0gYXV0b25lZzsKKwlpZiAoc3BlZWQxMDAgIT0gdHAtPnNwZWVkMTAwIHx8CisJICAgIGZ1bGxfZHVwbGV4ICE9IHRwLT5mdWxsX2R1cGxleCkgeworCQl0cC0+c3BlZWQxMDAgPSBzcGVlZDEwMDsKKwkJdHAtPmZ1bGxfZHVwbGV4ID0gZnVsbF9kdXBsZXg7CisJCS8qIGNoYW5nZSBhZHZlcnRpc2luZyBiaXRzICovCisJCXRwLT5hZHZlcnRpc2luZ1swXSAmPSB+KEFEVkVSVElTRV8xMEhBTEYgfAorCQkJCSAgICAgQURWRVJUSVNFXzEwRlVMTCB8CisJCQkJICAgICBBRFZFUlRJU0VfMTAwSEFMRiB8CisJCQkJICAgICBBRFZFUlRJU0VfMTAwRlVMTCB8CisJCQkJICAgICBBRFZFUlRJU0VfMTAwQkFTRTQpOworCQlpZiAoc3BlZWQxMDApIHsKKwkJCWlmIChmdWxsX2R1cGxleCkKKwkJCQl0cC0+YWR2ZXJ0aXNpbmdbMF0gfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJCQllbHNlCisJCQkJdHAtPmFkdmVydGlzaW5nWzBdIHw9IEFEVkVSVElTRV8xMDBIQUxGOworCQl9IGVsc2UgeworCQkJaWYgKGZ1bGxfZHVwbGV4KQorCQkJCXRwLT5hZHZlcnRpc2luZ1swXSB8PSBBRFZFUlRJU0VfMTBGVUxMOworCQkJZWxzZQorCQkJCXRwLT5hZHZlcnRpc2luZ1swXSB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQl9CisJfQorCWNoZWNrX2R1cGxleChkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4aXJjb21fZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHRwLT5wZGV2KSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgb3BzID0geworCS5nZXRfc2V0dGluZ3MgPSB4aXJjb21fZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSB4aXJjb21fc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IHhpcmNvbV9nZXRfZHJ2aW5mbywKK307CisKKy8qIFByb3ZpZGUgaW9jdGwoKSBjYWxscyB0byBleGFtaW5lIHRoZSBNSUkgeGN2ciBzdGF0ZS4gKi8KK3N0YXRpYyBpbnQgeGlyY29tX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdTE2ICpkYXRhID0gKHUxNiAqKSZycS0+aWZyX2lmcnU7CisJaW50IHBoeSA9IHRwLT5waHlzWzBdICYgMHgxZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoKGNtZCkgeworCS8qIExlZ2FjeSBtaWktZGlhZyBpbnRlcmZhY2UgKi8KKwljYXNlIFNJT0NHTUlJUEhZOgkJLyogR2V0IGFkZHJlc3Mgb2YgTUlJIFBIWSBpbiB1c2UuICovCisJCWlmICh0cC0+bWlpX2NudCkKKwkJCWRhdGFbMF0gPSBwaHk7CisJCWVsc2UKKwkJCXJldHVybiAtRU5PREVWOworCQlyZXR1cm4gMDsKKwljYXNlIFNJT0NHTUlJUkVHOgkJLyogUmVhZCBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJY2xpKCk7CisJCWRhdGFbM10gPSBtZGlvX3JlYWQoZGV2LCBkYXRhWzBdICYgMHgxZiwgZGF0YVsxXSAmIDB4MWYpOworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKwkJaWYgKGRhdGFbMF0gPT0gdHAtPnBoeXNbMF0pIHsKKwkJCXUxNiB2YWx1ZSA9IGRhdGFbMl07CisJCQlzd2l0Y2ggKGRhdGFbMV0pIHsKKwkJCWNhc2UgMDoKKwkJCQlpZiAodmFsdWUgJiAoQk1DUl9SRVNFVCB8IEJNQ1JfQU5FTkFCTEUpKQorCQkJCQkvKiBBdXRvbmVnb3RpYXRpb24uICovCisJCQkJCXRwLT5hdXRvbmVnID0gMTsKKwkJCQllbHNlIHsKKwkJCQkJdHAtPmZ1bGxfZHVwbGV4ID0gKHZhbHVlICYgQk1DUl9GVUxMRFBMWCkgPyAxIDogMDsKKwkJCQkJdHAtPmF1dG9uZWcgPSAwOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQl0cC0+YWR2ZXJ0aXNpbmdbMF0gPSB2YWx1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNoZWNrX2R1cGxleChkZXYpOworCQl9CisJCW1kaW9fd3JpdGUoZGV2LCBkYXRhWzBdICYgMHgxZiwgZGF0YVsxXSAmIDB4MWYsIGRhdGFbMl0pOworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgICBOb3RlIHRoYXQgd2Ugb25seSB1c2UgZXhjbHVzaW9uIGFyb3VuZCBhY3R1YWxseSBxdWV1ZWluZyB0aGUKKyAgIG5ldyBmcmFtZSwgbm90IGFyb3VuZCBmaWxsaW5nIHRwLT5zZXR1cF9mcmFtZS4gIFRoaXMgaXMgbm9uLWRldGVybWluaXN0aWMKKyAgIHdoZW4gcmUtZW50ZXJlZCBidXQgc3RpbGwgY29ycmVjdC4gKi8KK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgY3NyNiA9IGlubChpb2FkZHIgKyBDU1I2KTsKKwl1MTYgKmVhZGRycywgKnNldHVwX2ZybTsKKwl1MzIgdHhfZmxhZ3M7CisJaW50IGk7CisKKwl0cC0+Y3NyNiAmPSB+KEFsbE11bHRpQml0IHwgUHJvbWlzY0JpdCB8IEhhc2hGaWx0ZXJCaXQpOworCWNzcjYgJj0gfihBbGxNdWx0aUJpdCB8IFByb21pc2NCaXQgfCBIYXNoRmlsdGVyQml0KTsKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CQkJLyogU2V0IHByb21pc2N1b3VzLiAqLworCQl0cC0+Y3NyNiB8PSBQcm9taXNjQml0OworCQljc3I2IHw9IFByb21pc2NCaXQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoZGV2LT5tY19jb3VudCA+IDEwMDApIHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBmaWx0ZXIgd2VsbCAtLSBhY2NlcHQgYWxsIG11bHRpY2FzdHMuICovCisJCXRwLT5jc3I2IHw9IEFsbE11bHRpQml0OworCQljc3I2IHw9IEFsbE11bHRpQml0OworCQlnb3RvIG91dDsKKwl9CisKKwl0eF9mbGFncyA9IFR4MVdob2xlUGt0IHwgVHgxU2V0dXBQa3QgfCBQS1RfU0VUVVBfU1o7CisKKwkvKiBOb3RlIHRoYXQgb25seSB0aGUgbG93LWFkZHJlc3Mgc2hvcnR3b3JkIG9mIHNldHVwX2ZyYW1lIGlzIHZhbGlkISAqLworCXNldHVwX2ZybSA9IHRwLT5zZXR1cF9mcmFtZTsKKwltY2xpc3QgPSBkZXYtPm1jX2xpc3Q7CisKKwkvKiBGaWxsIHRoZSBmaXJzdCBlbnRyeSB3aXRoIG91ciBwaHlzaWNhbCBhZGRyZXNzLiAqLworCWVhZGRycyA9ICh1MTYgKilkZXYtPmRldl9hZGRyOworCSpzZXR1cF9mcm0gPSBjcHVfdG9fbGUxNihlYWRkcnNbMF0pOyBzZXR1cF9mcm0gKz0gMjsKKwkqc2V0dXBfZnJtID0gY3B1X3RvX2xlMTYoZWFkZHJzWzFdKTsgc2V0dXBfZnJtICs9IDI7CisJKnNldHVwX2ZybSA9IGNwdV90b19sZTE2KGVhZGRyc1syXSk7IHNldHVwX2ZybSArPSAyOworCisJaWYgKGRldi0+bWNfY291bnQgPiAxNCkgeyAvKiBNdXN0IHVzZSBhIG11bHRpY2FzdCBoYXNoIHRhYmxlLiAqLworCQl1MzIgKmhhc2hfdGFibGUgPSAodTMyICopKHRwLT5zZXR1cF9mcmFtZSArIDQgKiAxMik7CisJCXUzMiBoYXNoLCBoYXNoMjsKKworCQl0eF9mbGFncyB8PSBUeDFIYXNoU2V0dXA7CisJCXRwLT5jc3I2IHw9IEhhc2hGaWx0ZXJCaXQ7CisJCWNzcjYgfD0gSGFzaEZpbHRlckJpdDsKKworCQkvKiBGaWxsIHRoZSB1bnVzZWQgMyBlbnRyaWVzIHdpdGggdGhlIGJyb2FkY2FzdCBhZGRyZXNzLgorCQkgICBBdCBsZWFzdCBvbmUgZW50cnkgKm11c3QqIGNvbnRhaW4gdGhlIGJyb2FkY2FzdCBhZGRyZXNzISEhKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJKnNldHVwX2ZybSA9IDB4ZmZmZjsgc2V0dXBfZnJtICs9IDI7CisJCQkqc2V0dXBfZnJtID0gMHhmZmZmOyBzZXR1cF9mcm0gKz0gMjsKKwkJCSpzZXR1cF9mcm0gPSAweGZmZmY7IHNldHVwX2ZybSArPSAyOworCQl9CisKKwkJLyogVHJ1bHkgYnJhaW4tZGFtYWdlZCBoYXNoIGZpbHRlciBsYXlvdXQgKi8KKwkJLyogWFhYOiBub3Qgc3VyZSBpZiBJIHNob3VsZCB0YWtlIHRoZSBsYXN0IG9yIHRoZSBmaXJzdCA5IGJpdHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQl1MzIgKmhwdHI7CisJCQloYXNoID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSAmIDB4MWZmOworCQkJaWYgKGhhc2ggPCAzODQpIHsKKwkJCQloYXNoMiA9IGhhc2ggKyAoKGhhc2ggPj4gNCkgPDwgNCkgKworCQkJCQkoKGhhc2ggPj4gNSkgPDwgNSk7CisJCQl9IGVsc2UgeworCQkJCWhhc2ggLT0gMzg0OworCQkJCWhhc2gyID0gNjQgKyBoYXNoICsgKGhhc2ggPj4gNCkgKiA4MDsKKwkJCX0KKwkJCWhwdHIgPSAmaGFzaF90YWJsZVtoYXNoMiAmIH4weDFmXTsKKwkJCSpocHRyIHw9IGNwdV90b19sZTMyKDEgPDwgKGhhc2gyICYgMHgxZikpOworCQl9CisJfSBlbHNlIHsKKwkJLyogV2UgaGF2ZSA8PSAxNCBtY2FzdCBhZGRyZXNzZXMgc28gd2UgY2FuIHVzZSBYaXJjb20ncworCQkgICB3b25kZXJmdWwgMTYtYWRkcmVzcyBwZXJmZWN0IGZpbHRlci4gKi8KKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQllYWRkcnMgPSAodTE2ICopbWNsaXN0LT5kbWlfYWRkcjsKKwkJCSpzZXR1cF9mcm0gPSBjcHVfdG9fbGUxNihlYWRkcnNbMF0pOyBzZXR1cF9mcm0gKz0gMjsKKwkJCSpzZXR1cF9mcm0gPSBjcHVfdG9fbGUxNihlYWRkcnNbMV0pOyBzZXR1cF9mcm0gKz0gMjsKKwkJCSpzZXR1cF9mcm0gPSBjcHVfdG9fbGUxNihlYWRkcnNbMl0pOyBzZXR1cF9mcm0gKz0gMjsKKwkJfQorCQkvKiBGaWxsIHRoZSB1bnVzZWQgZW50cmllcyB3aXRoIHRoZSBicm9hZGNhc3QgYWRkcmVzcy4KKwkJICAgQXQgbGVhc3Qgb25lIGVudHJ5ICptdXN0KiBjb250YWluIHRoZSBicm9hZGNhc3QgYWRkcmVzcyEhISovCisJCWZvciAoOyBpIDwgMTU7IGkrKykgeworCQkJKnNldHVwX2ZybSA9IDB4ZmZmZjsgc2V0dXBfZnJtICs9IDI7CisJCQkqc2V0dXBfZnJtID0gMHhmZmZmOyBzZXR1cF9mcm0gKz0gMjsKKwkJCSpzZXR1cF9mcm0gPSAweGZmZmY7IHNldHVwX2ZybSArPSAyOworCQl9CisJfQorCisJLyogTm93IGFkZCB0aGlzIGZyYW1lIHRvIHRoZSBUeCBsaXN0LiAqLworCWlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4ID4gVFhfUklOR19TSVpFIC0gMikgeworCQkvKiBTYW1lIHNldHVwIHJlY2VudGx5IHF1ZXVlZCwgd2UgbmVlZCBub3QgYWRkIGl0LiAqLworCQkvKiBYWFg6IEh1aD8gQWxsIGl0IG1lYW5zIGlzIHRoYXQgdGhlIFR4IGxpc3QgaXMgZnVsbC4uLiovCisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJdW5zaWduZWQgaW50IGVudHJ5OworCQlpbnQgZHVtbXkgPSAtMTsKKworCQlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJCWVudHJ5ID0gdHAtPmN1cl90eCsrICUgVFhfUklOR19TSVpFOworCisJCWlmIChlbnRyeSAhPSAwKSB7CisJCQkvKiBBdm9pZCBhIGNoaXAgZXJyYXRhIGJ5IHByZWZpeGluZyBhIGR1bW15IGVudHJ5LiAqLworCQkJdHAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJdHAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCA9CisJCQkJKGVudHJ5ID09IFRYX1JJTkdfU0laRSAtIDEpID8gVHgxUmluZ1dyYXAgOiAwOworCQkJdHAtPnR4X3JpbmdbZW50cnldLmJ1ZmZlcjEgPSAwOworCQkJLyogcmFjZSB3aXRoIGNoaXAsIHNldCBUeDBEZXNjT3duZWQgbGF0ZXIgKi8KKwkJCWR1bW15ID0gZW50cnk7CisJCQllbnRyeSA9IHRwLT5jdXJfdHgrKyAlIFRYX1JJTkdfU0laRTsKKwkJfQorCisJCXRwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJLyogUHV0IHRoZSBzZXR1cCBmcmFtZSBvbiB0aGUgVHggbGlzdC4gKi8KKwkJaWYgKGVudHJ5ID09IFRYX1JJTkdfU0laRSAtIDEpCisJCQl0eF9mbGFncyB8PSBUeDFSaW5nV3JhcDsJCS8qIFdyYXAgcmluZy4gKi8KKwkJdHAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCA9IHR4X2ZsYWdzOworCQl0cC0+dHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHRwLT5zZXR1cF9mcmFtZSk7CisJCXRwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBUeDBEZXNjT3duZWQ7CisJCWlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSAtIDIpIHsKKwkJCXRwLT50eF9mdWxsID0gMTsKKwkJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJCX0KKwkJaWYgKGR1bW15ID49IDApCisJCQl0cC0+dHhfcmluZ1tkdW1teV0uc3RhdHVzID0gVHgwRGVzY093bmVkOworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLworCQlvdXRsKDAsIGlvYWRkciArIENTUjEpOworCX0KKworb3V0OgorCW91dGxfQ1NSNihjc3I2LCBpb2FkZHIpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB4aXJjb21fcGNpX3RhYmxlW10gPSB7CisgIHsgMHgxMTVELCAweDAwMDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFgzMjAxXzMgfSwKKyAgezB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB4aXJjb21fcGNpX3RhYmxlKTsKKworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHhpcmNvbV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwcmludGsoS0VSTl9JTkZPICJ4aXJjb21fc3VzcGVuZCglcylcbiIsIGRldi0+bmFtZSk7CisJaWYgKHRwLT5vcGVuKQorCQl4aXJjb21fZG93bihkZXYpOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMyk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHhpcmNvbV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwcmludGsoS0VSTl9JTkZPICJ4aXJjb21fcmVzdW1lKCVzKVxuIiwgZGV2LT5uYW1lKTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwwKTsKKwlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCS8qIEJyaW5nIHRoZSBjaGlwIG91dCBvZiBzbGVlcCBtb2RlLgorCSAgIENhdXRpb246IFNub296ZSBtb2RlIGRvZXMgbm90IHdvcmsgd2l0aCBzb21lIGJvYXJkcyEgKi8KKwlpZiAoeGlyY29tX3RibFt0cC0+Y2hpcF9pZF0uZmxhZ3MgJiBIQVNfQUNQSSkKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgUENJX1BPV0VSTUdNVCwgMCk7CisKKwl0cmFuc2NlaXZlcl92b29kb28oZGV2KTsKKwlpZiAoeGlyY29tX3RibFt0cC0+Y2hpcF9pZF0uZmxhZ3MgJiBIQVNfTUlJKQorCQljaGVja19kdXBsZXgoZGV2KTsKKworCWlmICh0cC0+b3BlbikKKwkJeGlyY29tX3VwKGRldik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHhpcmNvbV9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICJ4aXJjb21fcmVtb3ZlX29uZSglcylcbiIsIGRldi0+bmFtZSk7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCWZyZWVfbmV0ZGV2KGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB4aXJjb21fZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IHhpcmNvbV9wY2lfdGFibGUsCisJLnByb2JlCQk9IHhpcmNvbV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHhpcmNvbV9yZW1vdmVfb25lKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHhpcmNvbV9zdXNwZW5kLAorCS5yZXN1bWUJCT0geGlyY29tX3Jlc3VtZQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworfTsKKworCitzdGF0aWMgaW50IF9faW5pdCB4aXJjb21faW5pdCh2b2lkKQoreworLyogd2hlbiBhIG1vZHVsZSwgdGhpcyBpcyBwcmludGVkIHdoZXRoZXIgb3Igbm90IGRldmljZXMgYXJlIGZvdW5kIGluIHByb2JlICovCisjaWZkZWYgTU9EVUxFCisJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmeGlyY29tX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHhpcmNvbV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ4aXJjb21fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoeGlyY29tX2luaXQpCittb2R1bGVfZXhpdCh4aXJjb21fZXhpdCkKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWluZGVudC1sZXZlbDogNAorICogIGMtYmFzaWMtb2Zmc2V0OiA0CisgKiAgdGFiLXdpZHRoOiA0CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bi5jIGIvZHJpdmVycy9uZXQvdHVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmZWUzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bi5jCkBAIC0wLDAgKzEsODgzIEBACisvKgorICogIFRVTiAtIFVuaXZlcnNhbCBUVU4vVEFQIGRldmljZSBkcml2ZXIuCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICRJZDogdHVuLmMsdiAxLjE1IDIwMDIvMDMvMDEgMDI6NDQ6MjQgbWF4ayBFeHAgJAorICovCisKKy8qCisgKiAgQ2hhbmdlczoKKyAqCisgKiAgTWFyayBTbWl0aCA8bWFya3p6enNtaXRoQHlhaG9vLmNvbS5hdT4KKyAqICAgVXNlIHJhbmRvbV9ldGhlcl9hZGRyKCkgZm9yIHRhcCBNQUMgYWRkcmVzcy4KKyAqCisgKiAgSGFyYWxkIFJvZWxsZSA8aGFyYWxkLnJvZWxsZUBpZmkubG11LmRlPiAgMjAwNC8wNC8yMAorICogICAgRml4ZXMgaW4gcGFja2V0IGRyb3BwaW5nLCBxdWV1ZSBsZW5ndGggc2V0dGluZyBhbmQgcXVldWUgd2FrZXVwLgorICogICAgSW5jcmVhc2VkIGRlZmF1bHQgdHggcXVldWUgbGVuZ3RoLgorICogICAgQWRkZWQgZXRodG9vbCBBUEkuCisgKiAgICBNaW5vciBjbGVhbnVwcworICoKKyAqICBEYW5pZWwgUG9kbGVqc2tpIDx1bmRlcmxleUB1bmRlcmxleS5ldS5vcmc+CisgKiAgICBNb2RpZmljYXRpb25zIGZvciAyLjMuOTktcHJlNSBrZXJuZWwuCisgKi8KKworI2RlZmluZSBEUlZfTkFNRQkidHVuIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS42IgorI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JIlVuaXZlcnNhbCBUVU4vVEFQIGRldmljZSBkcml2ZXIiCisjZGVmaW5lIERSVl9DT1BZUklHSFQJIihDKSAxOTk5LTIwMDQgTWF4IEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4iCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3R1bi5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIFRVTl9ERUJVRworc3RhdGljIGludCBkZWJ1ZzsKKyNlbmRpZgorCisvKiBOZXR3b3JrIGRldmljZSBwYXJ0IG9mIHRoZSBkcml2ZXIgKi8KKworc3RhdGljIExJU1RfSEVBRCh0dW5fZGV2X2xpc3QpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB0dW5fZXRodG9vbF9vcHM7CisKKy8qIE5ldCBkZXZpY2Ugb3Blbi4gKi8KK3N0YXRpYyBpbnQgdHVuX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogTmV0IGRldmljZSBjbG9zZS4gKi8KK3N0YXRpYyBpbnQgdHVuX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogTmV0IGRldmljZSBzdGFydCB4bWl0ICovCitzdGF0aWMgaW50IHR1bl9uZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBuZXRkZXZfcHJpdihkZXYpOworCisJREJHKEtFUk5fSU5GTyAiJXM6IHR1bl9uZXRfeG1pdCAlZFxuIiwgdHVuLT5kZXYtPm5hbWUsIHNrYi0+bGVuKTsKKworCS8qIERyb3AgcGFja2V0IGlmIGludGVyZmFjZSBpcyBub3QgYXR0YWNoZWQgKi8KKwlpZiAoIXR1bi0+YXR0YWNoZWQpCisJCWdvdG8gZHJvcDsKKworCS8qIFBhY2tldCBkcm9wcGluZyAqLworCWlmIChza2JfcXVldWVfbGVuKCZ0dW4tPnJlYWRxKSA+PSBkZXYtPnR4X3F1ZXVlX2xlbikgeworCQlpZiAoISh0dW4tPmZsYWdzICYgVFVOX09ORV9RVUVVRSkpIHsKKwkJCS8qIE5vcm1hbCBxdWV1ZWluZyBtb2RlLiAqLworCQkJLyogUGFja2V0IHNjaGVkdWxlciBoYW5kbGVzIGRyb3BwaW5nIG9mIGZ1cnRoZXIgcGFja2V0cy4gKi8KKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQkJLyogV2Ugd29uJ3Qgc2VlIGFsbCBkcm9wcGVkIHBhY2tldHMgaW5kaXZpZHVhbGx5LCBzbyBvdmVycnVuCisJCQkgKiBlcnJvciBpcyBtb3JlIGFwcHJvcHJpYXRlLiAqLworCQkJdHVuLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogU2luZ2xlIHF1ZXVlIG1vZGUuCisJCQkgKiBEcml2ZXIgaGFuZGxlcyBkcm9wcGluZyBvZiBhbGwgcGFja2V0cyBpdHNlbGYuICovCisJCQlnb3RvIGRyb3A7CisJCX0KKwl9CisKKwkvKiBRdWV1ZSBwYWNrZXQgKi8KKwlza2JfcXVldWVfdGFpbCgmdHVuLT5yZWFkcSwgc2tiKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIE5vdGlmeSBhbmQgd2FrZSB1cCByZWFkZXIgcHJvY2VzcyAqLworCWlmICh0dW4tPmZsYWdzICYgVFVOX0ZBU1lOQykKKwkJa2lsbF9mYXN5bmMoJnR1bi0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dW4tPnJlYWRfd2FpdCk7CisJcmV0dXJuIDA7CisKK2Ryb3A6CisJdHVuLT5zdGF0cy50eF9kcm9wcGVkKys7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qKiBBZGQgdGhlIHNwZWNpZmllZCBFdGhlcm5ldCBhZGRyZXNzIHRvIHRoaXMgbXVsdGljYXN0IGZpbHRlci4gKi8KK3N0YXRpYyB2b2lkCithZGRfbXVsdGkodTMyKiBmaWx0ZXIsIGNvbnN0IHU4KiBhZGRyKQoreworCWludCBiaXRfbnIgPSBldGhlcl9jcmMoRVRIX0FMRU4sIGFkZHIpID4+IDI2OworCWZpbHRlcltiaXRfbnIgPj4gNV0gfD0gMSA8PCAoYml0X25yICYgMzEpOworfQorCisvKiogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgRXRoZXJuZXQgYWRkcmVzIGZyb20gdGhpcyBtdWx0aWNhc3QgZmlsdGVyLiAqLworc3RhdGljIHZvaWQKK2RlbF9tdWx0aSh1MzIqIGZpbHRlciwgY29uc3QgdTgqIGFkZHIpCit7CisJaW50IGJpdF9uciA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgYWRkcikgPj4gMjY7CisJZmlsdGVyW2JpdF9uciA+PiA1XSAmPSB+KDEgPDwgKGJpdF9uciAmIDMxKSk7Cit9CisKKy8qKiBVcGRhdGUgdGhlIGxpc3Qgb2YgbXVsdGljYXN0IGdyb3VwcyB0byB3aGljaCB0aGUgbmV0d29yayBkZXZpY2UgYmVsb25ncy4KKyAqIFRoaXMgbGlzdCBpcyB1c2VkIHRvIGZpbHRlciBwYWNrZXRzIGJlaW5nIHNlbnQgZnJvbSB0aGUgY2hhcmFjdGVyIGRldmljZSB0bworICogdGhlIG5ldHdvcmsgZGV2aWNlLiAqLworc3RhdGljIHZvaWQKK3R1bl9uZXRfbWNsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IG5ldGRldl9wcml2KGRldik7CisJY29uc3Qgc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJaW50IGk7CisJREJHKEtFUk5fREVCVUcgIiVzOiB0dW5fbmV0X21jbGlzdDogbWNfY291bnQgJWRcbiIsCisJCQlkZXYtPm5hbWUsIGRldi0+bWNfY291bnQpOworCW1lbXNldCh0dW4tPmNocl9maWx0ZXIsIDAsIHNpemVvZiB0dW4tPmNocl9maWx0ZXIpOworCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgaSA8IGRldi0+bWNfY291bnQgJiYgbWNsaXN0ICE9IE5VTEw7CisJCQlpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQlhZGRfbXVsdGkodHVuLT5uZXRfZmlsdGVyLCBtY2xpc3QtPmRtaV9hZGRyKTsKKwkJREJHKEtFUk5fREVCVUcgIiVzOiB0dW5fbmV0X21jbGlzdDogJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCQkJZGV2LT5uYW1lLAorCQkJCW1jbGlzdC0+ZG1pX2FkZHJbMF0sIG1jbGlzdC0+ZG1pX2FkZHJbMV0sIG1jbGlzdC0+ZG1pX2FkZHJbMl0sCisJCQkJbWNsaXN0LT5kbWlfYWRkclszXSwgbWNsaXN0LT5kbWlfYWRkcls0XSwgbWNsaXN0LT5kbWlfYWRkcls1XSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnR1bl9uZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJnR1bi0+c3RhdHM7Cit9CisKKy8qIEluaXRpYWxpemUgbmV0IGRldmljZS4gKi8KK3N0YXRpYyB2b2lkIHR1bl9uZXRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBuZXRkZXZfcHJpdihkZXYpOworICAgCisJc3dpdGNoICh0dW4tPmZsYWdzICYgVFVOX1RZUEVfTUFTSykgeworCWNhc2UgVFVOX1RVTl9ERVY6CisJCS8qIFBvaW50LXRvLVBvaW50IFRVTiBEZXZpY2UgKi8KKwkJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSAwOworCQlkZXYtPmFkZHJfbGVuID0gMDsKKwkJZGV2LT5tdHUgPSAxNTAwOworCisJCS8qIFplcm8gaGVhZGVyIGxlbmd0aCAqLworCQlkZXYtPnR5cGUgPSBBUlBIUkRfTk9ORTsgCisJCWRldi0+ZmxhZ3MgPSBJRkZfUE9JTlRPUE9JTlQgfCBJRkZfTk9BUlAgfCBJRkZfTVVMVElDQVNUOworCQlkZXYtPnR4X3F1ZXVlX2xlbiA9IFRVTl9SRUFEUV9TSVpFOyAgLyogV2UgcHJlZmVyIG91ciBvd24gcXVldWUgbGVuZ3RoICovCisJCWJyZWFrOworCisJY2FzZSBUVU5fVEFQX0RFVjoKKwkJLyogRXRoZXJuZXQgVEFQIERldmljZSAqLworCQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHR1bl9uZXRfbWNsaXN0OworCisJCWV0aGVyX3NldHVwKGRldik7CisJCXJhbmRvbV9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpOworCQlkZXYtPnR4X3F1ZXVlX2xlbiA9IFRVTl9SRUFEUV9TSVpFOyAgLyogV2UgcHJlZmVyIG91ciBvd24gcXVldWUgbGVuZ3RoICovCisJCWJyZWFrOworCX0KK30KKworLyogQ2hhcmFjdGVyIGRldmljZSBwYXJ0ICovCisKKy8qIFBvbGwgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHVuX2Nocl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICogd2FpdCkKK3sgIAorCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2sgPSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCWlmICghdHVuKQorCQlyZXR1cm4gLUVCQURGRDsKKworCURCRyhLRVJOX0lORk8gIiVzOiB0dW5fY2hyX3BvbGxcbiIsIHR1bi0+ZGV2LT5uYW1lKTsKKworCXBvbGxfd2FpdChmaWxlLCAmdHVuLT5yZWFkX3dhaXQsIHdhaXQpOworIAorCWlmIChza2JfcXVldWVfbGVuKCZ0dW4tPnJlYWRxKSkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qIEdldCBwYWNrZXQgZnJvbSB1c2VyIHNwYWNlIGJ1ZmZlciAqLworc3RhdGljIF9faW5saW5lX18gc3NpemVfdCB0dW5fZ2V0X3VzZXIoc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biwgc3RydWN0IGlvdmVjICppdiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB0dW5fcGkgcGkgPSB7IDAsIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApIH07CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzaXplX3QgbGVuID0gY291bnQsIGFsaWduID0gMDsKKworCWlmICghKHR1bi0+ZmxhZ3MgJiBUVU5fTk9fUEkpKSB7CisJCWlmICgobGVuIC09IHNpemVvZihwaSkpID4gY291bnQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZihtZW1jcHlfZnJvbWlvdmVjKCh2b2lkICopJnBpLCBpdiwgc2l6ZW9mKHBpKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoKHR1bi0+ZmxhZ3MgJiBUVU5fVFlQRV9NQVNLKSA9PSBUVU5fVEFQX0RFVikKKwkJYWxpZ24gPSBORVRfSVBfQUxJR047CisgCisJaWYgKCEoc2tiID0gYWxsb2Nfc2tiKGxlbiArIGFsaWduLCBHRlBfS0VSTkVMKSkpIHsKKwkJdHVuLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChhbGlnbikKKwkJc2tiX3Jlc2VydmUoc2tiLCBhbGlnbik7CisJaWYgKG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsIGxlbiksIGl2LCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNrYi0+ZGV2ID0gdHVuLT5kZXY7CisJc3dpdGNoICh0dW4tPmZsYWdzICYgVFVOX1RZUEVfTUFTSykgeworCWNhc2UgVFVOX1RVTl9ERVY6CisJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5wcm90b2NvbCA9IHBpLnByb3RvOworCQlicmVhazsKKwljYXNlIFRVTl9UQVBfREVWOgorCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB0dW4tPmRldik7CisJCWJyZWFrOworCX07CisKKwlpZiAodHVuLT5mbGFncyAmIFRVTl9OT0NIRUNLU1VNKQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworIAorCW5ldGlmX3J4X25pKHNrYik7CisJdHVuLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworICAgCisJdHVuLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJdHVuLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisKKwlyZXR1cm4gY291bnQ7Cit9IAorCitzdGF0aWMgaW5saW5lIHNpemVfdCBpb3ZfdG90YWwoY29uc3Qgc3RydWN0IGlvdmVjICppdiwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJc2l6ZV90IGxlbjsKKworCWZvciAoaSA9IDAsIGxlbiA9IDA7IGkgPCBjb3VudDsgaSsrKSAKKwkJbGVuICs9IGl2W2ldLmlvdl9sZW47CisKKwlyZXR1cm4gbGVuOworfQorCisvKiBXcml0ZXYgKi8KK3N0YXRpYyBzc2l6ZV90IHR1bl9jaHJfd3JpdGV2KHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3Qgc3RydWN0IGlvdmVjICppdiwgCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCF0dW4pCisJCXJldHVybiAtRUJBREZEOworCisJREJHKEtFUk5fSU5GTyAiJXM6IHR1bl9jaHJfd3JpdGUgJWxkXG4iLCB0dW4tPmRldi0+bmFtZSwgY291bnQpOworCisJcmV0dXJuIHR1bl9nZXRfdXNlcih0dW4sIChzdHJ1Y3QgaW92ZWMgKikgaXYsIGlvdl90b3RhbChpdiwgY291bnQpKTsKK30KKworLyogV3JpdGUgKi8KK3N0YXRpYyBzc2l6ZV90IHR1bl9jaHJfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwgCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGlvdmVjIGl2ID0geyAodm9pZCBfX3VzZXIgKikgYnVmLCBjb3VudCB9OworCXJldHVybiB0dW5fY2hyX3dyaXRldihmaWxlLCAmaXYsIDEsIHBvcyk7Cit9CisKKy8qIFB1dCBwYWNrZXQgdG8gdGhlIHVzZXIgc3BhY2UgYnVmZmVyICovCitzdGF0aWMgX19pbmxpbmVfXyBzc2l6ZV90IHR1bl9wdXRfdXNlcihzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgICBzdHJ1Y3QgaW92ZWMgKml2LCBpbnQgbGVuKQoreworCXN0cnVjdCB0dW5fcGkgcGkgPSB7IDAsIHNrYi0+cHJvdG9jb2wgfTsKKwlzc2l6ZV90IHRvdGFsID0gMDsKKworCWlmICghKHR1bi0+ZmxhZ3MgJiBUVU5fTk9fUEkpKSB7CisJCWlmICgobGVuIC09IHNpemVvZihwaSkpIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChsZW4gPCBza2ItPmxlbikgeworCQkJLyogUGFja2V0IHdpbGwgYmUgc3RyaXBlZCAqLworCQkJcGkuZmxhZ3MgfD0gVFVOX1BLVF9TVFJJUDsKKwkJfQorIAorCQlpZiAobWVtY3B5X3RvaW92ZWMoaXYsICh2b2lkICopICZwaSwgc2l6ZW9mKHBpKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdG90YWwgKz0gc2l6ZW9mKHBpKTsKKwl9ICAgICAgIAorCisJbGVuID0gbWluX3QoaW50LCBza2ItPmxlbiwgbGVuKTsKKworCXNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgaXYsIGxlbik7CisJdG90YWwgKz0gbGVuOworCisJdHVuLT5zdGF0cy50eF9wYWNrZXRzKys7CisJdHVuLT5zdGF0cy50eF9ieXRlcyArPSBsZW47CisKKwlyZXR1cm4gdG90YWw7Cit9CisKKy8qIFJlYWR2ICovCitzdGF0aWMgc3NpemVfdCB0dW5fY2hyX3JlYWR2KHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKml2LAorCQkJICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzc2l6ZV90IGxlbiwgcmV0ID0gMDsKKworCWlmICghdHVuKQorCQlyZXR1cm4gLUVCQURGRDsKKworCURCRyhLRVJOX0lORk8gIiVzOiB0dW5fY2hyX3JlYWRcbiIsIHR1bi0+ZGV2LT5uYW1lKTsKKworCWxlbiA9IGlvdl90b3RhbChpdiwgY291bnQpOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFkZF93YWl0X3F1ZXVlKCZ0dW4tPnJlYWRfd2FpdCwgJndhaXQpOworCXdoaWxlIChsZW4pIHsKKwkJY29uc3QgdTggb25lc1sgRVRIX0FMRU5dID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CisJCXU4IGFkZHJbIEVUSF9BTEVOXTsKKwkJaW50IGJpdF9ucjsKKworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKworCQkvKiBSZWFkIGZyYW1lcyBmcm9tIHRoZSBxdWV1ZSAqLworCQlpZiAoIShza2I9c2tiX2RlcXVldWUoJnR1bi0+cmVhZHEpKSkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogTm90aGluZyB0byByZWFkLCBsZXQncyBzbGVlcCAqLworCQkJc2NoZWR1bGUoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW5ldGlmX3dha2VfcXVldWUodHVuLT5kZXYpOworCisJCS8qKiBEZWNpZGUgd2hldGhlciB0byBhY2NlcHQgdGhpcyBwYWNrZXQuIFRoaXMgY29kZSBpcyBkZXNpZ25lZCB0bworCQkgKiBiZWhhdmUgaWRlbnRpY2FsbHkgdG8gYW4gRXRoZXJuZXQgaW50ZXJmYWNlLiBBY2NlcHQgdGhlIHBhY2tldCBpZgorCQkgKiAtIHdlIGFyZSBwcm9taXNjdW91cy4KKwkJICogLSB0aGUgcGFja2V0IGlzIGFkZHJlc3NlZCB0byB1cy4KKwkJICogLSB0aGUgcGFja2V0IGlzIGJyb2FkY2FzdC4KKwkJICogLSB0aGUgcGFja2V0IGlzIG11bHRpY2FzdCBhbmQKKwkJICogICAtIHdlIGFyZSBtdWx0aWNhc3QgcHJvbWlzY291cy4KKwkJICogICAtIHdlIGJlbG9uZyB0byB0aGUgbXVsdGljYXN0IGdyb3VwLgorCQkgKi8KKwkJbWVtY3B5KGFkZHIsIHNrYi0+ZGF0YSwKKwkJICAgICAgIG1pbl90KHNpemVfdCwgc2l6ZW9mIGFkZHIsIHNrYi0+bGVuKSk7CisJCWJpdF9uciA9IGV0aGVyX2NyYyhzaXplb2YgYWRkciwgYWRkcikgPj4gMjY7CisJCWlmICgodHVuLT5pZl9mbGFncyAmIElGRl9QUk9NSVNDKSB8fAorCQkJCW1lbWNtcChhZGRyLCB0dW4tPmRldl9hZGRyLCBzaXplb2YgYWRkcikgPT0gMCB8fAorCQkJCW1lbWNtcChhZGRyLCBvbmVzLCBzaXplb2YgYWRkcikgPT0gMCB8fAorCQkJCSgoKGFkZHJbMF0gPT0gMSAmJiBhZGRyWzFdID09IDAgJiYgYWRkclsyXSA9PSAweDVlKSB8fAorCQkJCSAgKGFkZHJbMF0gPT0gMHgzMyAmJiBhZGRyWzFdID09IDB4MzMpKSAmJgorCQkJCSAoKHR1bi0+aWZfZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8CisJCQkJICAodHVuLT5jaHJfZmlsdGVyW2JpdF9uciA+PiA1XSAmICgxIDw8IChiaXRfbnIgJiAzMSkpKSkpKSB7CisJCQlEQkcoS0VSTl9ERUJVRyAiJXM6IHR1bl9jaHJfcmVhZHY6IGFjY2VwdGVkOiAleDoleDoleDoleDoleDoleFxuIiwKKwkJCQkJdHVuLT5kZXYtPm5hbWUsIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sCisJCQkJCWFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCQkJcmV0ID0gdHVuX3B1dF91c2VyKHR1biwgc2tiLCAoc3RydWN0IGlvdmVjICopIGl2LCBsZW4pOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCURCRyhLRVJOX0RFQlVHICIlczogdHVuX2Nocl9yZWFkdjogcmVqZWN0ZWQ6ICV4OiV4OiV4OiV4OiV4OiV4XG4iLAorCQkJCQl0dW4tPmRldi0+bmFtZSwgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwKKwkJCQkJYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnR1bi0+cmVhZF93YWl0LCAmd2FpdCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZWFkICovCitzdGF0aWMgc3NpemVfdCB0dW5fY2hyX3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwgCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaW92ZWMgaXYgPSB7IGJ1ZiwgY291bnQgfTsKKwlyZXR1cm4gdHVuX2Nocl9yZWFkdihmaWxlLCAmaXYsIDEsIHBvcyk7Cit9CisKK3N0YXRpYyB2b2lkIHR1bl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBuZXRkZXZfcHJpdihkZXYpOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdHVuLT5yZWFkcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdHVuLT5yZWFkX3dhaXQpOworCisJdHVuLT5vd25lciA9IC0xOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+b3BlbiA9IHR1bl9uZXRfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHR1bl9uZXRfeG1pdDsKKwlkZXYtPnN0b3AgPSB0dW5fbmV0X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gdHVuX25ldF9zdGF0czsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnR1bl9ldGh0b29sX29wczsKKwlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKK30KKworc3RhdGljIHN0cnVjdCB0dW5fc3RydWN0ICp0dW5fZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuOworCisJQVNTRVJUX1JUTkwoKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHR1biwgJnR1bl9kZXZfbGlzdCwgbGlzdCkgeworCQlpZiAoIXN0cm5jbXAodHVuLT5kZXYtPm5hbWUsIG5hbWUsIElGTkFNU0laKSkKKwkJICAgIHJldHVybiB0dW47CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgdHVuX3NldF9pZmYoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW47CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyOworCisJdHVuID0gdHVuX2dldF9ieV9uYW1lKGlmci0+aWZyX25hbWUpOworCWlmICh0dW4pIHsKKwkJaWYgKHR1bi0+YXR0YWNoZWQpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCS8qIENoZWNrIHBlcm1pc3Npb25zICovCisJCWlmICh0dW4tPm93bmVyICE9IC0xICYmCisJCSAgICBjdXJyZW50LT5ldWlkICE9IHR1bi0+b3duZXIgJiYgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCX0gCisJZWxzZSBpZiAoX19kZXZfZ2V0X2J5X25hbWUoaWZyLT5pZnJfbmFtZSkpIAorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIHsKKwkJY2hhciAqbmFtZTsKKwkJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwkJZXJyID0gLUVJTlZBTDsKKworCQkvKiBTZXQgZGV2IHR5cGUgKi8KKwkJaWYgKGlmci0+aWZyX2ZsYWdzICYgSUZGX1RVTikgeworCQkJLyogVFVOIGRldmljZSAqLworCQkJZmxhZ3MgfD0gVFVOX1RVTl9ERVY7CisJCQluYW1lID0gInR1biVkIjsKKwkJfSBlbHNlIGlmIChpZnItPmlmcl9mbGFncyAmIElGRl9UQVApIHsKKwkJCS8qIFRBUCBkZXZpY2UgKi8KKwkJCWZsYWdzIHw9IFRVTl9UQVBfREVWOworCQkJbmFtZSA9ICJ0YXAlZCI7CisJCX0gZWxzZSAKKwkJCWdvdG8gZmFpbGVkOworICAgCisJCWlmICgqaWZyLT5pZnJfbmFtZSkKKwkJCW5hbWUgPSBpZnItPmlmcl9uYW1lOworCisJCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHR1bl9zdHJ1Y3QpLCBuYW1lLAorCQkJCSAgIHR1bl9zZXR1cCk7CisJCWlmICghZGV2KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJdHVuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJdHVuLT5kZXYgPSBkZXY7CisJCXR1bi0+ZmxhZ3MgPSBmbGFnczsKKwkJLyogQmUgcHJvbWlzY3VvdXMgYnkgZGVmYXVsdCB0byBtYWludGFpbiBwcmV2aW91cyBiZWhhdmlvdXIuICovCisJCXR1bi0+aWZfZmxhZ3MgPSBJRkZfUFJPTUlTQzsKKwkJLyogR2VuZXJhdGUgcmFuZG9tIEV0aGVybmV0IGFkZHJlc3MuICovCisJCSoodTE2ICopdHVuLT5kZXZfYWRkciA9IGh0b25zKDB4MDBGRik7CisJCWdldF9yYW5kb21fYnl0ZXModHVuLT5kZXZfYWRkciArIHNpemVvZih1MTYpLCA0KTsKKwkJbWVtc2V0KHR1bi0+Y2hyX2ZpbHRlciwgMCwgc2l6ZW9mIHR1bi0+Y2hyX2ZpbHRlcik7CisKKwkJdHVuX25ldF9pbml0KGRldik7CisKKwkJaWYgKHN0cmNocihkZXYtPm5hbWUsICclJykpIHsKKwkJCWVyciA9IGRldl9hbGxvY19uYW1lKGRldiwgZGV2LT5uYW1lKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWdvdG8gZXJyX2ZyZWVfZGV2OworCQl9CisKKwkJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKHR1bi0+ZGV2KTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycl9mcmVlX2RldjsKKwkKKwkJbGlzdF9hZGQoJnR1bi0+bGlzdCwgJnR1bl9kZXZfbGlzdCk7CisJfQorCisJREJHKEtFUk5fSU5GTyAiJXM6IHR1bl9zZXRfaWZmXG4iLCB0dW4tPmRldi0+bmFtZSk7CisKKwlpZiAoaWZyLT5pZnJfZmxhZ3MgJiBJRkZfTk9fUEkpCisJCXR1bi0+ZmxhZ3MgfD0gVFVOX05PX1BJOworCisJaWYgKGlmci0+aWZyX2ZsYWdzICYgSUZGX09ORV9RVUVVRSkKKwkJdHVuLT5mbGFncyB8PSBUVU5fT05FX1FVRVVFOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gdHVuOworCXR1bi0+YXR0YWNoZWQgPSAxOworCisJc3RyY3B5KGlmci0+aWZyX25hbWUsIHR1bi0+ZGV2LT5uYW1lKTsKKwlyZXR1cm4gMDsKKworIGVycl9mcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworIGZhaWxlZDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHR1bl9jaHJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdm9pZCBfX3VzZXIqIGFyZ3AgPSAodm9pZCBfX3VzZXIqKWFyZzsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCisJaWYgKGNtZCA9PSBUVU5TRVRJRkYgfHwgX0lPQ19UWVBFKGNtZCkgPT0gMHg4OSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpZnIsIGFyZ3AsIHNpemVvZiBpZnIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY21kID09IFRVTlNFVElGRiAmJiAhdHVuKSB7CisJCWludCBlcnI7CisKKwkJaWZyLmlmcl9uYW1lW0lGTkFNU0laLTFdID0gJ1wwJzsKKworCQlydG5sX2xvY2soKTsKKwkJZXJyID0gdHVuX3NldF9pZmYoZmlsZSwgJmlmcik7CisJCXJ0bmxfdW5sb2NrKCk7CisKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaWZyLCBzaXplb2YoaWZyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF0dW4pCisJCXJldHVybiAtRUJBREZEOworCisJREJHKEtFUk5fSU5GTyAiJXM6IHR1bl9jaHJfaW9jdGwgY21kICVkXG4iLCB0dW4tPmRldi0+bmFtZSwgY21kKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUVU5TRVROT0NTVU06CisJCS8qIERpc2FibGUvRW5hYmxlIGNoZWNrc3VtICovCisJCWlmIChhcmcpCisJCQl0dW4tPmZsYWdzIHw9IFRVTl9OT0NIRUNLU1VNOworCQllbHNlCisJCQl0dW4tPmZsYWdzICY9IH5UVU5fTk9DSEVDS1NVTTsKKworCQlEQkcoS0VSTl9JTkZPICIlczogY2hlY2tzdW0gJXNcbiIsCisJCSAgICB0dW4tPmRldi0+bmFtZSwgYXJnID8gImRpc2FibGVkIiA6ICJlbmFibGVkIik7CisJCWJyZWFrOworCisJY2FzZSBUVU5TRVRQRVJTSVNUOgorCQkvKiBEaXNhYmxlL0VuYWJsZSBwZXJzaXN0IG1vZGUgKi8KKwkJaWYgKGFyZykKKwkJCXR1bi0+ZmxhZ3MgfD0gVFVOX1BFUlNJU1Q7CisJCWVsc2UKKwkJCXR1bi0+ZmxhZ3MgJj0gflRVTl9QRVJTSVNUOworCisJCURCRyhLRVJOX0lORk8gIiVzOiBwZXJzaXN0ICVzXG4iLAorCQkgICAgdHVuLT5kZXYtPm5hbWUsIGFyZyA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOworCQlicmVhazsKKworCWNhc2UgVFVOU0VUT1dORVI6CisJCS8qIFNldCBvd25lciBvZiB0aGUgZGV2aWNlICovCisJCXR1bi0+b3duZXIgPSAodWlkX3QpIGFyZzsKKworCQlEQkcoS0VSTl9JTkZPICIlczogb3duZXIgc2V0IHRvICVkXG4iLCB0dW4tPmRldi0+bmFtZSwgdHVuLT5vd25lcik7CisJCWJyZWFrOworCisjaWZkZWYgVFVOX0RFQlVHCisJY2FzZSBUVU5TRVRERUJVRzoKKwkJdHVuLT5kZWJ1ZyA9IGFyZzsKKwkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgU0lPQ0dJRkZMQUdTOgorCQlpZnIuaWZyX2ZsYWdzID0gdHVuLT5pZl9mbGFnczsKKwkJaWYgKGNvcHlfdG9fdXNlciggYXJncCwgJmlmciwgc2l6ZW9mIGlmcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNJT0NTSUZGTEFHUzoKKwkJLyoqIFNldCB0aGUgY2hhcmFjdGVyIGRldmljZSdzIGludGVyZmFjZSBmbGFncy4gQ3VycmVudGx5IG9ubHkKKwkJICogSUZGX1BST01JU0MgYW5kIElGRl9BTExNVUxUSSBhcmUgdXNlZC4gKi8KKwkJdHVuLT5pZl9mbGFncyA9IGlmci5pZnJfZmxhZ3M7CisJCURCRyhLRVJOX0lORk8gIiVzOiBpbnRlcmZhY2UgZmxhZ3MgMHglbHhcbiIsCisJCQkJdHVuLT5kZXYtPm5hbWUsIHR1bi0+aWZfZmxhZ3MpOworCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ0dJRkhXQUREUjoKKwkJbWVtY3B5KGlmci5pZnJfaHdhZGRyLnNhX2RhdGEsIHR1bi0+ZGV2X2FkZHIsCisJCQkJbWluKHNpemVvZiBpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCBzaXplb2YgdHVuLT5kZXZfYWRkcikpOworCQlpZiAoY29weV90b191c2VyKCBhcmdwLCAmaWZyLCBzaXplb2YgaWZyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ1NJRkhXQUREUjoKKwkJLyoqIFNldCB0aGUgY2hhcmFjdGVyIGRldmljZSdzIGhhcmR3YXJlIGFkZHJlc3MuIFRoaXMgaXMgdXNlZCB3aGVuCisJCSAqIGZpbHRlcmluZyBwYWNrZXRzIGJlaW5nIHNlbnQgZnJvbSB0aGUgbmV0d29yayBkZXZpY2UgdG8gdGhlIGNoYXJhY3RlcgorCQkgKiBkZXZpY2UuICovCisJCW1lbWNweSh0dW4tPmRldl9hZGRyLCBpZnIuaWZyX2h3YWRkci5zYV9kYXRhLAorCQkJCW1pbihzaXplb2YgaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgc2l6ZW9mIHR1bi0+ZGV2X2FkZHIpKTsKKwkJREJHKEtFUk5fREVCVUcgIiVzOiBzZXQgaGFyZHdhcmUgYWRkcmVzczogJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCQkJdHVuLT5kZXYtPm5hbWUsCisJCQkJdHVuLT5kZXZfYWRkclswXSwgdHVuLT5kZXZfYWRkclsxXSwgdHVuLT5kZXZfYWRkclsyXSwKKwkJCQl0dW4tPmRldl9hZGRyWzNdLCB0dW4tPmRldl9hZGRyWzRdLCB0dW4tPmRldl9hZGRyWzVdKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNJT0NBRERNVUxUSToKKwkJLyoqIEFkZCB0aGUgc3BlY2lmaWVkIGdyb3VwIHRvIHRoZSBjaGFyYWN0ZXIgZGV2aWNlJ3MgbXVsdGljYXN0IGZpbHRlcgorCQkgKiBsaXN0LiAqLworCQlhZGRfbXVsdGkodHVuLT5jaHJfZmlsdGVyLCBpZnIuaWZyX2h3YWRkci5zYV9kYXRhKTsKKwkJREJHKEtFUk5fREVCVUcgIiVzOiBhZGQgbXVsdGk6ICV4OiV4OiV4OiV4OiV4OiV4XG4iLAorCQkJCXR1bi0+ZGV2LT5uYW1lLAorCQkJCSh1OClpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzBdLCAodTgpaWZyLmlmcl9od2FkZHIuc2FfZGF0YVsxXSwKKwkJCQkodTgpaWZyLmlmcl9od2FkZHIuc2FfZGF0YVsyXSwgKHU4KWlmci5pZnJfaHdhZGRyLnNhX2RhdGFbM10sCisJCQkJKHU4KWlmci5pZnJfaHdhZGRyLnNhX2RhdGFbNF0sICh1OClpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzVdKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNJT0NERUxNVUxUSToKKwkJLyoqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGdyb3VwIGZyb20gdGhlIGNoYXJhY3RlciBkZXZpY2UncyBtdWx0aWNhc3QKKwkJICogZmlsdGVyIGxpc3QuICovCisJCWRlbF9tdWx0aSh0dW4tPmNocl9maWx0ZXIsIGlmci5pZnJfaHdhZGRyLnNhX2RhdGEpOworCQlEQkcoS0VSTl9ERUJVRyAiJXM6IGRlbCBtdWx0aTogJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCQkJdHVuLT5kZXYtPm5hbWUsCisJCQkJKHU4KWlmci5pZnJfaHdhZGRyLnNhX2RhdGFbMF0sICh1OClpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzFdLAorCQkJCSh1OClpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzJdLCAodTgpaWZyLmlmcl9od2FkZHIuc2FfZGF0YVszXSwKKwkJCQkodTgpaWZyLmlmcl9od2FkZHIuc2FfZGF0YVs0XSwgKHU4KWlmci5pZnJfaHdhZGRyLnNhX2RhdGFbNV0pOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dW5fY2hyX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgb24pCit7CisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKCF0dW4pCisJCXJldHVybiAtRUJBREZEOworCisJREJHKEtFUk5fSU5GTyAiJXM6IHR1bl9jaHJfZmFzeW5jICVkXG4iLCB0dW4tPmRldi0+bmFtZSwgb24pOworCisJaWYgKChyZXQgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJnR1bi0+ZmFzeW5jKSkgPCAwKQorCQlyZXR1cm4gcmV0OyAKKyAKKwlpZiAob24pIHsKKwkJcmV0ID0gZl9zZXRvd24oZmlsZSwgY3VycmVudC0+cGlkLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXR1bi0+ZmxhZ3MgfD0gVFVOX0ZBU1lOQzsKKwl9IGVsc2UgCisJCXR1bi0+ZmxhZ3MgJj0gflRVTl9GQVNZTkM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dW5fY2hyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCURCRzEoS0VSTl9JTkZPICJ0dW5YOiB0dW5fY2hyX29wZW5cbiIpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHVuX2Nocl9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCF0dW4pCisJCXJldHVybiAwOworCisJREJHKEtFUk5fSU5GTyAiJXM6IHR1bl9jaHJfY2xvc2VcbiIsIHR1bi0+ZGV2LT5uYW1lKTsKKworCXR1bl9jaHJfZmFzeW5jKC0xLCBmaWxlLCAwKTsKKworCXJ0bmxfbG9jaygpOworCisJLyogRGV0YWNoIGZyb20gbmV0IGRldmljZSAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJdHVuLT5hdHRhY2hlZCA9IDA7CisKKwkvKiBEcm9wIHJlYWQgcXVldWUgKi8KKwlza2JfcXVldWVfcHVyZ2UoJnR1bi0+cmVhZHEpOworCisJaWYgKCEodHVuLT5mbGFncyAmIFRVTl9QRVJTSVNUKSkgeworCQlsaXN0X2RlbCgmdHVuLT5saXN0KTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UodHVuLT5kZXYpOworCX0KKworCXJ0bmxfdW5sb2NrKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHVuX2ZvcHMgPSB7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCQorCS5sbHNlZWsgPSBub19sbHNlZWssCisJLnJlYWQJPSB0dW5fY2hyX3JlYWQsCisJLnJlYWR2CT0gdHVuX2Nocl9yZWFkdiwKKwkud3JpdGUJPSB0dW5fY2hyX3dyaXRlLAorCS53cml0ZXYgPSB0dW5fY2hyX3dyaXRldiwKKwkucG9sbAk9IHR1bl9jaHJfcG9sbCwKKwkuaW9jdGwJPSB0dW5fY2hyX2lvY3RsLAorCS5vcGVuCT0gdHVuX2Nocl9vcGVuLAorCS5yZWxlYXNlID0gdHVuX2Nocl9jbG9zZSwKKwkuZmFzeW5jID0gdHVuX2Nocl9mYXN5bmMJCQorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHR1bl9taXNjZGV2ID0geworCS5taW5vciA9IFRVTl9NSU5PUiwKKwkubmFtZSA9ICJ0dW4iLAorCS5mb3BzID0gJnR1bl9mb3BzLAorCS5kZXZmc19uYW1lID0gIm5ldC90dW4iLAorfTsKKworLyogZXRodG9vbCBpbnRlcmZhY2UgKi8KKworc3RhdGljIGludCB0dW5fZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCWNtZC0+c3VwcG9ydGVkCQk9IDA7CisJY21kLT5hZHZlcnRpc2luZwk9IDA7CisJY21kLT5zcGVlZAkJPSBTUEVFRF8xMDsKKwljbWQtPmR1cGxleAkJPSBEVVBMRVhfRlVMTDsKKwljbWQtPnBvcnQJCT0gUE9SVF9UUDsKKwljbWQtPnBoeV9hZGRyZXNzCT0gMDsKKwljbWQtPnRyYW5zY2VpdmVyCT0gWENWUl9JTlRFUk5BTDsKKwljbWQtPmF1dG9uZWcJCT0gQVVUT05FR19ESVNBQkxFOworCWNtZC0+bWF4dHhwa3QJCT0gMDsKKwljbWQtPm1heHJ4cGt0CQk9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHR1bl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmZ3X3ZlcnNpb24sICJOL0EiKTsKKworCXN3aXRjaCAodHVuLT5mbGFncyAmIFRVTl9UWVBFX01BU0spIHsKKwljYXNlIFRVTl9UVU5fREVWOgorCQlzdHJjcHkoaW5mby0+YnVzX2luZm8sICJ0dW4iKTsKKwkJYnJlYWs7CisJY2FzZSBUVU5fVEFQX0RFVjoKKwkJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCAidGFwIik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHUzMiB0dW5fZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisjaWZkZWYgVFVOX0RFQlVHCisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIHR1bi0+ZGVidWc7CisjZWxzZQorCXJldHVybiAtRU9QTk9UU1VQUDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB0dW5fc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKyNpZmRlZiBUVU5fREVCVUcKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl0dW4tPmRlYnVnID0gdmFsdWU7CisjZW5kaWYKK30KKworc3RhdGljIHUzMiB0dW5fZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gdHVuLT5hdHRhY2hlZDsKK30KKworc3RhdGljIHUzMiB0dW5fZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gKHR1bi0+ZmxhZ3MgJiBUVU5fTk9DSEVDS1NVTSkgPT0gMDsKK30KKworc3RhdGljIGludCB0dW5fc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IG5ldGRldl9wcml2KGRldik7CisJaWYgKGRhdGEpCisJCXR1bi0+ZmxhZ3MgJj0gflRVTl9OT0NIRUNLU1VNOworCWVsc2UKKwkJdHVuLT5mbGFncyB8PSBUVU5fTk9DSEVDS1NVTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB0dW5fZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwk9IHR1bl9nZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCT0gdHVuX2dldF9kcnZpbmZvLAorCS5nZXRfbXNnbGV2ZWwJPSB0dW5fZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJPSB0dW5fc2V0X21zZ2xldmVsLAorCS5nZXRfbGluawk9IHR1bl9nZXRfbGluaywKKwkuZ2V0X3J4X2NzdW0JPSB0dW5fZ2V0X3J4X2NzdW0sCisJLnNldF9yeF9jc3VtCT0gdHVuX3NldF9yeF9jc3VtCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0dW5faW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAidHVuOiAlcywgJXNcbiIsIERSVl9ERVNDUklQVElPTiwgRFJWX1ZFUlNJT04pOworCXByaW50ayhLRVJOX0lORk8gInR1bjogJXNcbiIsIERSVl9DT1BZUklHSFQpOworCisJcmV0ID0gbWlzY19yZWdpc3RlcigmdHVuX21pc2NkZXYpOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0VSUiAidHVuOiBDYW4ndCByZWdpc3RlciBtaXNjIGRldmljZSAlZFxuIiwgVFVOX01JTk9SKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0dW5fY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4sICpueHQ7CisKKwltaXNjX2RlcmVnaXN0ZXIoJnR1bl9taXNjZGV2KTsgIAorCisJcnRubF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHR1biwgbnh0LCAmdHVuX2Rldl9saXN0LCBsaXN0KSB7CisJCURCRyhLRVJOX0lORk8gIiVzIGNsZWFuZWQgdXBcbiIsIHR1bi0+ZGV2LT5uYW1lKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UodHVuLT5kZXYpOworCX0KKwlydG5sX3VubG9jaygpOworCQorfQorCittb2R1bGVfaW5pdCh0dW5faW5pdCk7Cittb2R1bGVfZXhpdCh0dW5fY2xlYW51cCk7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJWX0RFU0NSSVBUSU9OKTsKK01PRFVMRV9BVVRIT1IoRFJWX0NPUFlSSUdIVCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihUVU5fTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHlwaG9vbi1maXJtd2FyZS5oIGIvZHJpdmVycy9uZXQvdHlwaG9vbi1maXJtd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZjQ3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90eXBob29uLWZpcm13YXJlLmgKQEAgLTAsMCArMSwzNzc4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwNCAzQ29tIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBvZiB0aGUgM2M5OTBpbWcuaAorICogbWljcm9jb2RlIHNvZnR3YXJlIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbiBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbiBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgM0NvbSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgM0NPTSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBVU0VSIEFDS05PV0xFREdFUyBBTkQgQUdSRUVTIFRIQVQgUFVSQ0hBU0UgT1IgVVNFIE9GIFRIRSAzYzk5MGltZy5oCisgKiBNSUNST0NPREUgU09GVFdBUkUgV0lMTCBOT1QgQ1JFQVRFIE9SIEdJVkUgR1JPVU5EUyBGT1IgQSBMSUNFTlNFIEJZCisgKiBJTVBMSUNBVElPTiwgRVNUT1BQRUwsIE9SIE9USEVSV0lTRSBJTiBBTlkgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUworICogKFBBVEVOVCwgQ09QWVJJR0hULCBUUkFERSBTRUNSRVQsIE1BU0sgV09SSywgT1IgT1RIRVIgUFJPUFJJRVRBUlkgUklHSFQpCisgKiBFTUJPRElFRCBJTiBBTlkgT1RIRVIgM0NPTSBIQVJEV0FSRSBPUiBTT0ZUV0FSRSBFSVRIRVIgU09MRUxZIE9SIElOCisgKiBDT01CSU5BVElPTiBXSVRIIFRIRSAzYzk5MGltZy5oIE1JQ1JPQ09ERSBTT0ZUV0FSRQorICovIAorCisgLyogdmVyIDAzLjAwMS4wMDggKi8KK3N0YXRpYyBjb25zdCB1OCB0eXBob29uX2Zpcm13YXJlX2ltYWdlW10gPSB7CisweDU0LCAweDU5LCAweDUwLCAweDQ4LCAweDRmLCAweDRmLCAweDRlLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAKKzB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4Y2IsIDB4OTksIDB4YjEsIDB4ZDQsIAorMHg0YywgMHhiOCwgMHhkMCwgMHg0YiwgMHgzMiwgMHgwMiwgMHhkNCwgMHhlZSwgMHg3MywgMHg3ZSwgMHgwYiwgMHgxMywgCisweDliLCAweGMwLCAweGFlLCAweGY0LCAweDQwLCAweDAxLCAweDAwLCAweDAwLCAweGU4LCAweGZjLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MzksIDB4MDAsIDB4MDAsIDB4ZWEsIDB4MDUsIDB4MDAsIDB4MDAsIDB4ZWEsIAorMHgwNCwgMHgwMCwgMHgwMCwgMHhlYSwgMHgwMywgMHgwMCwgMHgwMCwgMHhlYSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhlYSwgCisweDAxLCAweDAwLCAweDAwLCAweGVhLCAweDMyLCAweDAyLCAweDAwLCAweGVhLCAweGM1LCAweDE0LCAweDAwLCAweGVhLCAKKzB4MDcsIDB4MDAsIDB4MmQsIDB4ZTksIDB4MGUsIDB4MDAsIDB4YTAsIDB4ZTEsIDB4MDAsIDB4MTAsIDB4MGYsIDB4ZTEsIAorMHhkMCwgMHgyMCwgMHg5ZiwgMHhlNSwgMHgxMiwgMHhmZiwgMHgyZiwgMHhlMSwgMHhmZSwgMHhmZiwgMHhmZiwgMHhlYSwgCisweDAxLCAweDAwLCAweDgwLCAweGUwLCAweDA0LCAweDIwLCAweDgxLCAweGU0LCAweDAxLCAweDAwLCAweDUwLCAweGUxLCAKKzB4ZmMsIDB4ZmYsIDB4ZmYsIDB4MWEsIDB4MGUsIDB4ZjAsIDB4YTAsIDB4ZTEsIDB4MDAsIDB4YTAsIDB4YTAsIDB4ZTEsIAorMHgwZSwgMHhiMCwgMHhhMCwgMHhlMSwgMHgwMCwgMHgwMCwgMHhhMCwgMHhlMywgMHhhOCwgMHgxMCwgMHg5ZiwgMHhlNSwgCisweDAwLCAweDAwLCAweDgxLCAweGU1LCAweGE0LCAweDEwLCAweDlmLCAweGU1LCAweDAwLCAweDAwLCAweDgxLCAweGU1LCAKKzB4MDEsIDB4MTYsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MDAsIDB4OTEsIDB4ZTUsIDB4MDEsIDB4MDAsIDB4ODAsIDB4ZTMsIAorMHgwMCwgMHgwMCwgMHg4MSwgMHhlNSwgMHhkNywgMHgwMCwgMHhhMCwgMHhlMywgMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgCisweDg4LCAweGQwLCAweDlmLCAweGU1LCAweGRiLCAweDAwLCAweGEwLCAweGUzLCAweDAwLCAweGYwLCAweDIxLCAweGUxLCAKKzB4N2MsIDB4ZDAsIDB4OWYsIDB4ZTUsIDB4ZDIsIDB4MDAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4ZjAsIDB4MjEsIDB4ZTEsIAorMHg3NCwgMHhkMCwgMHg5ZiwgMHhlNSwgMHhkMSwgMHgwMCwgMHhhMCwgMHhlMywgMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgCisweDZjLCAweGQwLCAweDlmLCAweGU1LCAweDliLCAweDE0LCAweDAwLCAweGViLCAweGQzLCAweDAwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4ZjAsIDB4MjEsIDB4ZTEsIDB4NjAsIDB4ZDAsIDB4OWYsIDB4ZTUsIDB4NjAsIDB4MDAsIDB4OWYsIDB4ZTUsIAorMHg2MCwgMHgxMCwgMHg5ZiwgMHhlNSwgMHg2MCwgMHgyMCwgMHg5ZiwgMHhlNSwgMHhkYiwgMHhmZiwgMHhmZiwgMHhlYiwgCisweDVjLCAweDAwLCAweDlmLCAweGU1LCAweDVjLCAweDEwLCAweDlmLCAweGU1LCAweDAwLCAweDIwLCAweGEwLCAweGUzLCAKKzB4ZDcsIDB4ZmYsIDB4ZmYsIDB4ZWIsIDB4NTQsIDB4MDAsIDB4OWYsIDB4ZTUsIDB4NTQsIDB4MTAsIDB4OWYsIDB4ZTUsIAorMHhkNCwgMHhmZiwgMHhmZiwgMHhlYiwgMHgwYSwgMHgwMCwgMHhhMCwgMHhlMSwgMHgwYiwgMHhmMCwgMHhhMCwgMHhlMSwgCisweGQzLCAweDEwLCAweGEwLCAweGUzLCAweDAxLCAweGYwLCAweDIxLCAweGUxLCAweGQ0LCAweGZmLCAweGZmLCAweGViLCAKKzB4M2MsIDB4YTAsIDB4OWYsIDB4ZTUsIDB4MWEsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4YzYsIDB4ZmYsIDB4ZmYsIDB4ZWEsIAorMHgxNSwgMHgyMSwgMHhmZiwgMHhmZiwgMHgwYywgMHgwMCwgMHgxMCwgMHgwMCwgMHgxYywgMHgwMCwgMHgxMCwgMHgwMCwgCisweDNjLCAweDM4LCAweDAwLCAweDgwLCAweGZjLCAweDM3LCAweDAwLCAweDgwLCAweGZjLCAweDNmLCAweDAwLCAweDgwLCAKKzB4N2MsIDB4MzQsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MGYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MzAsIDB4MDAsIDB4ODAsIAorMHhhZCwgMHhkZSwgMHhhZCwgMHhkZSwgMHhiMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgyNCwgMHhhYiwgMHgyMCwgMHg0MCwgCisweDQ4LCAweDI5LCAweDAwLCAweDAwLCAweDI4LCAweDA1LCAweDAwLCAweDgwLCAweGJkLCAweGJhLCAweDIxLCAweDQwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDU4LCAweDU3LCAweDAwLCAweDAwLCAweDg2LCAweDRiLCAweDAwLCAweDAwLCAweDYwLCAweDAxLCAweGZmLCAweGZmLCAKKzB4YjAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4MTIsIDB4NGQsIDB4MDAsIDB4MjQsIDB4MjgsIDB4NjgsIDB4MDAsIDB4MjgsIAorMHgxZSwgMHhkMCwgMHgzOCwgMHgxYywgMHgxMCwgMHg0OSwgMHgwNCwgMHhmMCwgMHg3YiwgMHhmZCwgMHgyOSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDAwLCAweDI4LCAweDE1LCAweGQwLCAweDM4LCAweDAxLCAweDBkLCAweDQ5LCAKKzB4NDAsIDB4MTgsIDB4MTksIDB4MjMsIDB4ZGIsIDB4MDEsIDB4YzAsIDB4MTgsIDB4NDEsIDB4NmIsIDB4ODAsIDB4MjksIAorMHgwYywgMHhkMiwgMHgwMSwgMHgzMSwgMHg0MSwgMHg2MywgMHgyOCwgMHg2OCwgMHhjMSwgMHg2OSwgMHhjMCwgMHg0NiwgCisweDI5LCAweDYwLCAweDM5LCAweDA3LCAweDQxLCAweDYwLCAweDA0LCAweDYyLCAweGM3LCAweDYyLCAweGIwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MjAsIDB4MWMsIDB4ZmEsIDB4ZTcsIDB4ZTgsIDB4MTcsIDB4MDAsIDB4ODAsIAorMHhlZSwgMHgwNSwgMHgwMCwgMHgwMCwgMHhhMCwgMHgxYywgMHgwMCwgMHg4MCwgMHgwMiwgMHg0OSwgMHgwYSwgMHg2OCwgCisweGMwLCAweDQ2LCAweGMyLCAweDYxLCAweDA4LCAweDYwLCAweDcwLCAweDQ3LCAKKzB4ZTgsIDB4MTcsIDB4MDAsIDB4ODAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHhlMSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMSwgCisweGMwLCAweDEwLCAweDgxLCAweGUzLCAweDAxLCAweGYwLCAweDIxLCAweGUxLCAweDFlLCAweGZmLCAweDJmLCAweGUxLCAKKzB4MDAsIDB4ZjAsIDB4MjEsIDB4ZTEsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4ZTEsIAorMHhjMCwgMHgwMCwgMHg4MCwgMHhlMywgMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgCisweDAwLCAweDAwLCAweDBmLCAweGUxLCAweGMwLCAweDAwLCAweGMwLCAweGUzLCAweDAwLCAweGYwLCAweDIxLCAweGUxLCAKKzB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4ZTEsIDB4NDAsIDB4MDAsIDB4ODAsIDB4ZTMsIAorMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHgwMCwgMHgwMCwgMHgwZiwgMHhlMSwgCisweDgwLCAweDAwLCAweDEwLCAweGUzLCAweDgwLCAweDAwLCAweDgwLCAweGUzLCAweDAwLCAweGYwLCAweDIxLCAweGUxLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MDAsIDB4MDAsIDB4NTAsIDB4ZTMsIAorMHgwMCwgMHgwMCwgMHgwZiwgMHhlMSwgMHg4MCwgMHgwMCwgMHhjMCwgMHgxMywgMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgCisweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDAwLCAweDAwLCAweDBmLCAweGUxLCAweDgwLCAweDAwLCAweGMwLCAweGUzLCAKKzB4MDAsIDB4ZjAsIDB4MjEsIDB4ZTEsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4OTEsIDB4MDAsIDB4MDAsIDB4ZTAsIAorMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHgwMSwgMHgyMCwgMHg4MCwgMHhlMCwgMHgwMSwgMHgwMCwgMHg4MCwgMHhlMCwgCisweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDgwLCAweGI1LCAweDA4LCAweDRmLCAweDY0LCAweDI4LCAweDA0LCAweGQzLCAKKzB4NjQsIDB4MjAsIDB4MzgsIDB4NjMsIDB4MDAsIDB4MjAsIDB4YzAsIDB4NDMsIDB4MDMsIDB4ZTAsIDB4MzgsIDB4NjMsIAorMHgwNCwgMHg0OSwgMHgwNSwgMHhmMCwgMHgwMSwgMHhmYiwgMHg3OCwgMHg2MywgMHhiOCwgMHg2MywgMHg4MCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDg4LCAweDEzLCAweDAwLCAweDAwLCAKKzB4ODAsIDB4YjQsIDB4MTAsIDB4NGIsIDB4MDAsIDB4MjIsIDB4MWYsIDB4NmIsIDB4NjQsIDB4MmYsIDB4MDMsIDB4ZDIsIAorMHgwOSwgMHg2OCwgMHgwOSwgMHg2OCwgMHg0OSwgMHgwOCwgMHgwMiwgMHhkMiwgMHgxMCwgMHgxYywgMHg4MCwgMHhiYywgCisweDcwLCAweDQ3LCAweDE5LCAweDFjLCAweGRiLCAweDZiLCAweDRmLCAweDZiLCAweGJiLCAweDQyLCAweDA1LCAweGQyLCAKKzB4NDAsIDB4NjgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4MTgsIDB4MTgsIDB4YzgsIDB4NjMsIDB4ZjEsIDB4ZTcsIAorMHg0MSwgMHg2OCwgMHgwNSwgMHg0YiwgMHgxOSwgMHg0MywgMHg0MSwgMHg2MCwgMHgwNCwgMHg0OCwgMHhjMSwgMHg2YiwgCisweDAxLCAweDMxLCAweGMxLCAweDYzLCAweDAyLCAweDIwLCAweGU4LCAweGU3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MGMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4OTAsIDB4YjUsIDB4MDcsIDB4MWMsIAorMHgxNSwgMHg0YywgMHgwMCwgMHgyMCwgMHgyMSwgMHg2YiwgMHg2NCwgMHgyOSwgMHgwYiwgMHhkMiwgMHhiOSwgMHg2ZSwgCisweDQ5LCAweDA4LCAweDA4LCAweGQzLCAweDIxLCAweDZjLCAweGEyLCAweDZiLCAweDkxLCAweDQyLCAweDA3LCAweGQyLCAKKzB4ZmEsIDB4MWQsIDB4MzksIDB4MzIsIDB4NTIsIDB4OGIsIDB4ODksIDB4MTgsIDB4MjEsIDB4NjQsIDB4OTAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg3OCwgMHg2YSwgMHgzOSwgMHg2YiwgMHhjMCwgMHg0NiwgMHg0OCwgMHg2MiwgCisweDM4LCAweDZiLCAweDAyLCAweGYwLCAweDJkLCAweGZlLCAweDM4LCAweDFjLCAweDAyLCAweGYwLCAweGU4LCAweGZhLCAKKzB4MDEsIDB4MjAsIDB4YmIsIDB4MjMsIDB4MWIsIDB4MDEsIDB4ZTEsIDB4MTgsIDB4YzgsIDB4NzMsIDB4MDUsIDB4NDksIAorMHgwYSwgMHg2YywgMHgxMiwgMHgxOCwgMHgwYSwgMHg2NCwgMHgwNCwgMHg0OSwgMHg4YSwgMHg2ZCwgMHgxMiwgMHgxOCwgCisweDhhLCAweDY1LCAweGU0LCAweGU3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAKKzB4YTQsIDB4MmEsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjQsIDB4MGEsIDB4NDgsIDB4YzAsIDB4NmQsIDB4MDIsIDB4MjMsIAorMHgxOCwgMHg0MCwgMHgwOSwgMHg0YSwgMHgwMCwgMHgyMSwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMCwgMHhkMSwgMHg2MywgCisweDExLCAweDY0LCAweDgwLCAweGJjLCAweDcwLCAweDQ3LCAweDA2LCAweDQ4LCAweDA3LCAweDY4LCAweDdiLCAweDFjLCAKKzB4MDMsIDB4NjAsIDB4MGEsIDB4MmYsIDB4ZjcsIDB4ZDMsIDB4MDEsIDB4NjAsIDB4ZjMsIDB4ZTcsIDB4MDAsIDB4MDAsIAorMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhlMCwgMHgwMSwgMHgwMCwgMHg4MCwgCisweDcwLCAweDQ3LCAweDAyLCAweDA0LCAweDEyLCAweDBjLCAweDAwLCAweDBjLCAweDEwLCAweDE4LCAweDBhLCAweDA0LCAKKzB4MTIsIDB4MGMsIDB4MDksIDB4MGMsIDB4NTEsIDB4MTgsIDB4MDgsIDB4MTgsIDB4MDEsIDB4MGMsIDB4MDUsIDB4ZDAsIAorMHgwMSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwMCwgMHgwYywgMHgwOCwgMHgxOCwgMHgwMSwgMHgwYywgMHhmOSwgMHhkMSwgCisweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDcwLCAweDQ3LCAweDgwLCAweGI0LCAweDAwLCAweDIyLCAweDAwLCAweDI5LCAKKzB4MTgsIDB4ZDAsIDB4NGYsIDB4MDgsIDB4N2IsIDB4MWUsIDB4MDAsIDB4MmYsIAorMHgwNiwgMHhkMCwgMHgwNywgMHg4OCwgMHhiYSwgMHgxOCwgMHgwMiwgMHgzMCwgMHgxZiwgMHgxYywgMHgwMSwgMHgzYiwgCisweDAwLCAweDJmLCAweGY4LCAweGQxLCAweDQ5LCAweDA4LCAweDAzLCAweGQzLCAweDAwLCAweDg4LCAweDAwLCAweDA2LCAKKzB4MDAsIDB4MGUsIDB4ODIsIDB4MTgsIDB4MTAsIDB4MGMsIDB4MDUsIDB4ZDAsIDB4MTAsIDB4MDQsIDB4MDAsIDB4MGMsIAorMHgxMSwgMHgwYywgMHg0MiwgMHgxOCwgMHgxMCwgMHgwYywgMHhmOSwgMHhkMSwgMHgxMCwgMHgwNCwgMHgwMCwgMHgwYywgCisweDgwLCAweGJjLCAweDcwLCAweDQ3LCAweDgwLCAweGI1LCAweDgzLCAweDg5LCAweGM3LCAweDg5LCAweGZiLCAweDE4LCAKKzB4MDcsIDB4OGEsIDB4ZmIsIDB4MTgsIDB4NDcsIDB4OGEsIDB4ZmIsIDB4MTgsIDB4NDAsIDB4N2EsIDB4MDAsIDB4MDIsIAorMHhjNywgMHgxOCwgMHgzOCwgMHgwYywgMHgwNSwgMHhkMCwgMHgzOCwgMHgwNCwgMHgwMCwgMHgwYywgMHgzYiwgMHgwYywgCisweGM3LCAweDE4LCAweDM4LCAweDBjLCAweGY5LCAweGQxLCAweDA4LCAweDFjLCAweDExLCAweDFjLCAweGZmLCAweGY3LCAKKzB4YzgsIDB4ZmYsIDB4MDEsIDB4MWMsIDB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4YjAsIDB4ZmYsIDB4ODAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg5MCwgMHhiNSwgMHgwMiwgMHgyMywgMHg4MiwgMHg2OCwgMHgxYSwgMHg0MCwgCisweDAwLCAweDI3LCAweDAwLCAweDJhLCAweDBmLCAweGQwLCAweDBhLCAweDRhLCAweDkzLCAweDY5LCAweDAxLCAweDMzLCAKKzB4OTMsIDB4NjEsIDB4MGEsIDB4NjgsIDB4OGIsIDB4NjgsIDB4OWEsIDB4MTgsIDB4MDAsIDB4NjgsIDB4MWMsIDB4MTgsIAorMHg1NywgMHg4MSwgMHgwOSwgMHg2OSwgMHgxMCwgMHgxYywgMHhmZiwgMHhmNywgMHhhYywgMHhmZiwgMHhjMCwgMHg0MywgCisweDYwLCAweDgxLCAweDM4LCAweDFjLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAKKzB4MGMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4OTAsIDB4YjUsIDB4MDQsIDB4MjMsIDB4ODIsIDB4NjgsIDB4MWEsIDB4NDAsIAorMHgwMCwgMHgyNywgMHgwMCwgMHgyYSwgMHgxMSwgMHhkMCwgMHg0YSwgMHg2OCwgMHg1MiwgMHgwOSwgMHgwZSwgMHhkMywgCisweDA5LCAweDRhLCAweDEzLCAweDZhLCAweDAxLCAweDMzLCAweDEzLCAweDYyLCAweGNiLCAweDY4LCAweDAyLCAweDY4LCAKKzB4OWMsIDB4MTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MDgsIDB4M2EsIDB4MWEsIDB4NDMsIDB4MTIsIDB4NjgsIAorMHgwMCwgMHhmMCwgMHgyZSwgMHhmOCwgMHgyMCwgMHg4MiwgMHgzOCwgMHgxYywgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAweDkwLCAweGI1LCAweDgwLCAweDIzLCAKKzB4ODIsIDB4NjgsIDB4MWEsIDB4NDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4MmEsIDB4MTUsIDB4ZDAsIDB4NGEsIDB4NjgsIAorMHg5MiwgMHgwOSwgMHgxMiwgMHhkMywgMHgwYiwgMHg0YSwgMHhkMywgMHg2OSwgMHgwMSwgMHgzMywgMHhkMywgMHg2MSwgCisweGNiLCAweDY4LCAweDAyLCAweDY4LCAweDlmLCAweDE4LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDA4LCAweDNhLCAKKzB4MWEsIDB4NDMsIDB4MTIsIDB4NjgsIDB4MDAsIDB4ZjAsIDB4MGUsIDB4ZjgsIDB4MDAsIDB4MjgsIDB4MDAsIDB4ZDEsIAorMHgwNCwgMHg0OCwgMHhjMCwgMHg0NiwgMHhmOCwgMHg4MCwgMHgyMCwgMHgxYywgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAKKzB4YjAsIDB4YjUsIDB4MTQsIDB4MWMsIDB4MDUsIDB4MWMsIDB4MGYsIDB4MWMsIDB4MzgsIDB4NjksIDB4YjksIDB4NjgsIAorMHg0MSwgMHgxOCwgMHgzOCwgMHg2OCwgMHhmZiwgMHhmNywgMHg1MywgMHhmZiwgMHhjMCwgMHg0MywgMHgwMSwgMHgwNCwgCisweDA5LCAweDBjLCAweDIwLCAweDFjLCAweGZmLCAweGY3LCAweDM5LCAweGZmLCAweDA0LCAweDFjLCAweGI4LCAweDY4LCAKKzB4NzksIDB4NjksIDB4NDAsIDB4MTgsIDB4NjksIDB4NjgsIDB4ODgsIDB4NDIsIDB4MGMsIDB4ZDIsIDB4MmEsIDB4NjgsIAorMHgxMiwgMHgxOCwgMHgwOSwgMHgxYSwgMHgxMCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwNSwgMHhmOSwgMHhjMCwgMHg0MywgCisweDAxLCAweDA0LCAweDA5LCAweDBjLCAweDIwLCAweDFjLCAweGZmLCAweGY3LCAweDI2LCAweGZmLCAweDA0LCAweDFjLCAKKzB4ZTAsIDB4NDMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4YjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHg4MCwgMHhiNSwgMHgwNywgMHgxYywgMHhiOCwgMHg2YiwgMHhjMCwgMHgwOCwgMHgxYSwgMHhkMywgMHhiOCwgMHg2YSwgCisweGY5LCAweDZiLCAweDQwLCAweDE4LCAweDc5LCAweDZjLCAweDAwLCAweGYwLCAweGVkLCAweGY4LCAweGMwLCAweDQzLCAKKzB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MGEsIDB4NDgsIDB4MDcsIDB4ZDAsIDB4MjAsIDB4MjMsIDB4YjksIDB4NjksIAorMHgxOSwgMHg0MywgMHhiOSwgMHg2MSwgMHgwMSwgMHg2YiwgMHgwMSwgMHgzMSwgMHgwMSwgMHg2MywgMHgwNywgMHhlMCwgCisweGZmLCAweDIzLCAweDAxLCAweDMzLCAweGI5LCAweDY5LCAweDE5LCAweDQzLCAweGI5LCAweDYxLCAweDQxLCAweDZhLCAKKzB4MDEsIDB4MzEsIDB4NDEsIDB4NjIsIDB4MDAsIDB4MjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgMHg4MCwgMHhiNSwgMHgwNywgMHgxYywgMHhiOCwgMHg2YiwgMHg0MSwgMHgwOSwgCisweDFjLCAweGQzLCAweGMwLCAweDA4LCAweDFhLCAweGQzLCAweGY4LCAweDFkLCAweDM5LCAweDMwLCAweDAwLCAweDdiLCAKKzB4MDYsIDB4MjgsIDB4MTUsIDB4ZDEsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4NTMsIDB4ZjgsIDB4MDEsIDB4MWMsIAorMHgwYSwgMHg0OCwgMHgwNywgMHhkMCwgMHg0MCwgMHgyMywgMHhiOSwgMHg2OSwgCisweDE5LCAweDQzLCAweGI5LCAweDYxLCAweDgxLCAweDZiLCAweDAxLCAweDMxLCAweDgxLCAweDYzLCAweDA3LCAweGUwLCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDIsIDB4YjksIDB4NjksIDB4MTksIDB4NDMsIDB4YjksIDB4NjEsIDB4YzEsIDB4NmEsIAorMHgwMSwgMHgzMSwgMHhjMSwgMHg2MiwgMHgwMCwgMHgyMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDBjLCAweDJiLCAweDAwLCAweDgwLCAweGIwLCAweGI1LCAweDA3LCAweDFjLCAweGI4LCAweDZiLCAweDgxLCAweDA5LCAKKzB4MmMsIDB4ZDMsIDB4YzAsIDB4MDgsIDB4MmEsIDB4ZDMsIDB4ZjgsIDB4MWQsIDB4MzksIDB4MzAsIDB4MDAsIDB4N2IsIAorMHgxMSwgMHgyOCwgMHgyNSwgMHhkMSwgMHhiOCwgMHg2YSwgMHgzOSwgMHg2YywgMHg0MCwgMHgxOCwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweDA2LCAweDMwLCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAweDA1LCAweDA0LCAweDJkLCAweDBjLCAKKzB4MGYsIDB4NGMsIDB4MTEsIDB4ZDAsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MWYsIDB4ZjgsIDB4MDAsIDB4MjgsIAorMHgwYywgMHhkMCwgMHhhOCwgMHg0MiwgMHgwMiwgMHhkMSwgMHgwYywgMHg0YiwgMHg5OCwgMHg0MiwgMHgwNywgMHhkMCwgCisweDgwLCAweDIzLCAweGI4LCAweDY5LCAweDE4LCAweDQzLCAweGI4LCAweDYxLCAweDYwLCAweDZiLCAweDAxLCAweDMwLCAKKzB4NjAsIDB4NjMsIDB4MDcsIDB4ZTAsIDB4MDEsIDB4MjMsIDB4NWIsIDB4MDIsIDB4YjgsIDB4NjksIDB4MTgsIDB4NDMsIAorMHhiOCwgMHg2MSwgMHhhMCwgMHg2YSwgMHgwMSwgMHgzMCwgMHhhMCwgMHg2MiwgMHgwMCwgMHgyMCwgMHhiMCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAKKzB4ZjAsIDB4YjUsIDB4ZmYsIDB4YjAsIDB4OTksIDB4YjAsIDB4MDQsIDB4MWMsIDB4ZTAsIDB4NmIsIDB4NjEsIDB4NmMsIAorMHgwOSwgMHgxOCwgMHgwMywgMHhhYSwgMHg4NSwgMHgxOCwgMHhhMywgMHg2YSwgMHgwMCwgMHgyMCwgMHg4YSwgMHgwOCwgCisweDAxLCAweDMyLCAweDk3LCAweDkyLCAweDA3LCAweGQwLCAweDgyLCAweDAwLCAweDlmLCAweDU4LCAweDAzLCAweGFlLCAKKzB4YjcsIDB4NTAsIDB4OTcsIDB4OWEsIDB4MDEsIDB4MzAsIDB4ODIsIDB4NDIsIDB4ZjcsIDB4ZDgsIDB4NjAsIDB4NmEsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwNCwgMHgzMCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDAyLCAweDkwLCAweDAyLCAweGFmLCAweDNmLCAweDg4LCAweDAzLCAweGE4LCAweGZmLCAweGY3LCAweDg3LCAweGZlLCAKKzB4YzAsIDB4NDMsIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4NmQsIDB4ZmUsIAorMHgwNywgMHgxYywgMHhlMCwgMHg2YiwgMHhhMSwgMHg2YywgMHg0MCwgMHgxOCwgMHg2MSwgMHg2YSwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweDA4LCAweDMxLCAweDE5LCAweDQzLCAweDA5LCAweDY4LCAweGMwLCAweDQ2LCAweDAxLCAweDkxLCAKKzB4MDEsIDB4YTksIDB4MDksIDB4ODgsIDB4MDEsIDB4MzEsIDB4ODgsIDB4NDIsIDB4MGMsIDB4ZDIsIDB4YTIsIDB4NmEsIAorMHgxMiwgMHgxOCwgMHgwOSwgMHgxYSwgMHgxMCwgMHgxYywgMHgwMCwgMHhmMCwgMHgyZiwgMHhmOCwgMHhjMCwgMHg0MywgCisweDAxLCAweDA0LCAweDA5LCAweDBjLCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDUwLCAweGZlLCAweDA3LCAweDFjLCAKKzB4YTgsIDB4ODksIDB4ZTksIDB4ODksIDB4MDgsIDB4MTgsIDB4MjksIDB4OGEsIDB4MDgsIDB4MTgsIDB4NjksIDB4OGEsIAorMHgwOCwgMHgxOCwgMHg2OSwgMHg3YSwgMHgwOSwgMHgwMiwgMHgwOCwgMHgxOCwgMHhhMSwgMHg2YywgMHg2MiwgMHg2YywgCisweDg5LCAweDFhLCAweDBhLCAweDA0LCAweDEyLCAweDBjLCAweDExLCAweDAyLCAweDEyLCAweDBhLCAweDExLCAweDQzLCAKKzB4MDksIDB4MDQsIDB4MDksIDB4MGMsIDB4MDksIDB4MTgsIDB4MDgsIDB4MGMsIDB4MDUsIDB4ZDAsIDB4MDgsIDB4MDQsIAorMHgwMCwgMHgwYywgMHgwOSwgMHgwYywgMHg0MSwgMHgxOCwgMHgwOCwgMHgwYywgMHhmOSwgMHhkMSwgMHgzOCwgMHgxYywgCisweGZmLCAweGY3LCAweDJmLCAweGZlLCAweGMwLCAweDQzLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDdmLCAweGIwLCAKKzB4MTksIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4YjAsIDB4YjQsIDB4MDAsIDB4MjIsIAorMHgwMCwgMHgyOSwgMHgyZSwgMHhkMCwgMHg4MywgMHgwNywgMHg5YiwgMHgwZiwgMHhkYywgMHgwMCwgMHg0NywgMHgxOCwgCisweDA0LCAweDI1LCAweGVmLCAweDFiLCAweGJmLCAweDA3LCAweGJmLCAweDBmLCAweGZmLCAweDAwLCAweDgwLCAweDA4LCAKKzB4ODAsIDB4MDAsIDB4NTksIDB4MTgsIDB4MDMsIDB4MzEsIDB4ODksIDB4MDgsIDB4NGQsIDB4MWUsIDB4MDIsIDB4YzgsIAorMHhlMSwgMHg0MCwgMHhhMSwgMHg0MCwgMHg2YiwgMHgxZSwgMHgwMCwgMHgyZCwgMHgwOSwgMHhkMCwgMHgwYywgMHgwNCwgCisweDI0LCAweDBjLCAweGEyLCAweDE4LCAweDA5LCAweDBjLCAweDhhLCAweDE4LCAweDAyLCAweGM4LCAweDFjLCAweDFjLCAKKzB4MDEsIDB4M2IsIDB4MDAsIDB4MmMsIDB4ZjUsIDB4ZDEsIDB4YjksIDB4NDAsIDB4MDgsIDB4MWMsIDB4ZjgsIDB4NDAsIAorMHgwMSwgMHgwNCwgMHgwOSwgMHgwYywgMHg4OSwgMHgxOCwgMHgwMCwgMHgwYywgMHg0MiwgMHgxOCwgMHgxMCwgMHgwYywgCisweDA1LCAweGQwLCAweDEwLCAweDA0LCAweDAwLCAweDBjLCAweDExLCAweDBjLCAweDQyLCAweDE4LCAweDEwLCAweDBjLCAKKzB4ZjksIDB4ZDEsIDB4MTAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4YjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg5MCwgMHhiNCwgMHgwMCwgMHgyMCwgMHgwMSwgMHgyNywgMHgxMSwgMHg0OSwgMHg0MiwgMHgwMCwgMHgxMiwgMHgxOCwgCisweGQyLCAweDAwLCAweDUzLCAweDE4LCAweDljLCAweDY4LCAweDAxLCAweDIzLCAKKzB4OWIsIDB4MDcsIDB4MjMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MWIsIDB4MDMsIDB4MWIsIDB4MGIsIDB4OGEsIDB4NTgsIAorMHgxMiwgMHgwMywgMHgxMiwgMHgwYiwgMHg5MywgMHg0MiwgMHgwYywgMHhkMSwgMHgwMSwgMHgzMCwgMHgwNCwgMHgyOCwgCisweGVjLCAweGQzLCAweDA4LCAweDQ4LCAweGMwLCAweDZhLCAweDAxLCAweDAzLCAweDA5LCAweDBiLCAweDA3LCAweDQ4LCAKKzB4MDAsIDB4NmYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MGIsIDB4ODEsIDB4NDIsIDB4MDIsIDB4ZDAsIDB4MzgsIDB4MWMsIAorMHg5MCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMCwgMHgyMCwgMHhmYiwgMHhlNywgMHhhOCwgMHgwMywgMHgwMCwgMHg4MCwgCisweDAwLCAweDQwLCAweDE0LCAweDQwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDk4LCAweGI0LCAweDE0LCAweDRhLCAKKzB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4ODMsIDB4MDAsIDB4MTMsIDB4NDgsIDB4YzAsIDB4NTgsIDB4MDcsIDB4MDMsIAorMHgzZiwgMHgwYiwgMHgxMiwgMHg0OCwgMHhjMCwgMHg1OCwgMHgwMiwgMHgwMywgMHgxMiwgMHgwYiwgMHgxMSwgMHg0OCwgCisweGMwLCAweDU4LCAweDAwLCAweDAzLCAweDAwLCAweDBiLCAweDEwLCAweDRjLCAweGU0LCAweDU4LCAweDAxLCAweDIzLCAKKzB4OWIsIDB4MDcsIDB4MjMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4OWIsIDB4MDAsIDB4Y2MsIDB4MDAsIDB4MDEsIDB4MjEsIAorMHg5OCwgMHg0MiwgMHgwMSwgMHhkMSwgMHgwOCwgMHgxYywgMHgwOSwgMHhlMCwgMHg5OCwgMHg0MiwgMHgwMywgMHhkOSwgCisweDEwLCAweDFhLCAweGRhLCAweDFiLCAweDgwLCAweDE4LCAweDAwLCAweGUwLCAweDE4LCAweDFhLCAweDg0LCAweDQyLCAKKzB4ZjQsIDB4ZDMsIDB4MDAsIDB4MjAsIDB4OTgsIDB4YmMsIDB4NzAsIDB4NDcsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIAorMHgyMCwgMHgwNCwgMHgwMCwgMHg4MCwgMHgyOCwgMHgwNCwgMHgwMCwgMHg4MCwgMHgwOCwgMHgwNCwgMHgwMCwgMHg4MCwgCisweDE4LCAweDA0LCAweDAwLCAweDgwLCAweDgwLCAweGI0LCAweDEzLCAweDA0LCAweDAwLCAweGQwLCAweDAxLCAweDNhLCAKKzB4ODAsIDB4MDAsIDB4MGIsIDB4MWMsIDB4MTMsIDB4NDksIDB4MGYsIDB4NTgsIDB4YzAsIDB4NDYsIDB4M2IsIDB4NjAsIAorMHgwYiwgMHg1OCwgMHhjMCwgMHg0NiwgMHg1YSwgMHg2MCwgMHgwYSwgMHg1OCwgMHgwOCwgMHgzMiwgMHgxMCwgMHg0YiwgCisweDFiLCAweDU4LCAweDlhLCAweDQyLCAweDAxLCAweGQzLCAweDBmLCAweDRhLCAweDEyLCAweDU4LCAweDBmLCAweDRiLCAKKzB4MWYsIDB4NTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4M2IsIDB4NDMsIDB4MWIsIDB4NjgsIDB4OWIsIDB4MDAsIAorMHgxNywgMHgwMywgMHgzZiwgMHgwYiwgMHg5ZiwgMHg0MiwgMHgwNiwgMHhkMSwgMHgwYSwgMHg0OCwgMHhjMSwgMHg2OCwgCisweDAxLCAweDMxLCAweGMxLCAweDYwLCAweDAxLCAweDIwLCAweDgwLCAweGJjLCAweDcwLCAweDQ3LCAweDA4LCAweDRiLCAKKzB4MWIsIDB4NTgsIDB4YzAsIDB4NDYsIDB4MWEsIDB4NjAsIDB4MGEsIDB4NTAsIDB4MDAsIDB4MjAsIDB4ZjYsIDB4ZTcsIAorMHgwOCwgMHgwNCwgMHgwMCwgMHg4MCwgMHgyOCwgMHgwNCwgMHgwMCwgMHg4MCwgMHgyMCwgMHgwNCwgMHgwMCwgMHg4MCwgCisweDE4LCAweDA0LCAweDAwLCAweDgwLCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAweDEwLCAweDA0LCAweDAwLCAweDgwLCAKKzB4ZmYsIDB4NWYsIDB4MmQsIDB4ZTksIDB4NDgsIDB4ZmUsIDB4ZmYsIDB4ZWIsIDB4MDEsIDB4YjYsIDB4YTAsIDB4ZTMsIAorMHgwMSwgMHhiMSwgMHg4YiwgMHhlMiwgMHgwMiwgMHg4YSwgMHhhMCwgMHhlMywgMHgwMSwgMHg3YSwgMHhhMCwgMHhlMywgCisweDAxLCAweGE5LCAweGEwLCAweGUzLCAweDAxLCAweDU2LCAweGEwLCAweGUzLCAweGM4LCAweDYwLCAweDlmLCAweGU1LCAKKzB4YzgsIDB4OTAsIDB4OWYsIDB4ZTUsIDB4MTQsIDB4NDAsIDB4OWIsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4NTQsIDB4ZTMsIAorMHgyYywgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMywgMHgwYSwgMHgxNCwgMHhlMywgMHgxMSwgMHgwMCwgMHgwMCwgMHgwYSwgCisweDBjLCAweDAwLCAweDk2LCAweGU1LCAweDAwLCAweDAwLCAweDUwLCAweGUzLCAweDIxLCAweDAwLCAweDAwLCAweDBhLCAKKzB4MDEsIDB4MGEsIDB4MTQsIDB4ZTMsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MWMsIDB4MDAsIDB4OTYsIDB4ZTUsIAorMHgwMSwgMHgwYSwgMHhjMCwgMHhlMywgMHgxYywgMHgwMCwgMHg4NiwgMHhlNSwgMHgxYywgMHgwMCwgMHg4NSwgMHhlNSwgCisweDE0LCAweDcwLCAweDg1LCAweGU1LCAweDA2LCAweDAwLCAweDAwLCAweGVhLCAweDAyLCAweDBhLCAweDE0LCAweGUzLCAKKzB4MDQsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MWMsIDB4MDAsIDB4OTYsIDB4ZTUsIDB4MDIsIDB4MGEsIDB4YzAsIDB4ZTMsIAorMHgxYywgMHgwMCwgMHg4NiwgMHhlNSwgMHgxYywgMHgwMCwgMHg4NSwgMHhlNSwgMHgxNCwgMHg4MCwgMHg4NSwgMHhlNSwgCisweDAxLCAweDA5LCAweDE0LCAweGUzLCAweDA0LCAweDAwLCAweDAwLCAweDBhLCAweDFjLCAweDAwLCAweDk2LCAweGU1LCAKKzB4MDEsIDB4MDksIDB4YzAsIDB4ZTMsIDB4MWMsIDB4MDAsIDB4ODYsIDB4ZTUsIDB4MWMsIDB4MDAsIDB4ODUsIDB4ZTUsIAorMHgxNCwgMHhhMCwgMHg4NSwgMHhlNSwgMHgwMiwgMHgwMCwgMHgxNCwgMHhlMywgMHg0MCwgMHgwMCwgMHgwMCwgMHgxYiwgCisweDAxLCAweDAwLCAweDE0LCAweGUzLCAweDU0LCAweDAwLCAweDAwLCAweDFiLCAweDAyLCAweDBiLCAweDE0LCAweGUzLCAKKzB4NjcsIDB4MDAsIDB4MDAsIDB4MWIsIDB4MDEsIDB4MGIsIDB4MTQsIDB4ZTMsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MWIsIAorMHgxOCwgMHgwMCwgMHg5OSwgMHhlNSwgMHgwMSwgMHgwMCwgMHg4MCwgMHhlMiwgMHgxOCwgMHgwMCwgMHg4OSwgMHhlNSwgCisweGQ1LCAweGZmLCAweGZmLCAweGVhLCAweDFjLCAweDAwLCAweDk2LCAweGU1LCAweDAxLCAweDBhLCAweGMwLCAweGUzLCAKKzB4MWMsIDB4MDAsIDB4ODYsIDB4ZTUsIDB4MWMsIDB4MDAsIDB4ODUsIDB4ZTUsIAorMHgxNCwgMHg3MCwgMHg4NSwgMHhlNSwgMHhlMSwgMHhmZiwgMHhmZiwgMHhlYSwgMHhmZiwgMHg1ZiwgMHhiZCwgMHhlOCwgCisweDA0LCAweGYwLCAweDVlLCAweGUyLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDA4LCAweDgzLCAweDIwLCAweDQwLCAKKzB4MTAsIDB4MTAsIDB4MWYsIDB4ZTUsIDB4MTQsIDB4MzAsIDB4OTEsIDB4ZTUsIDB4MDAsIDB4MjAsIDB4YzMsIDB4ZTEsIAorMHgxNCwgMHgyMCwgMHg4MSwgMHhlNSwgMHgwMSwgMHgxNiwgMHhhMCwgMHhlMywgMHgwYywgMHgyMCwgMHg4MSwgMHhlNSwgCisweDBiLCAweDEyLCAweGEwLCAweGUzLCAweDAwLCAweDAwLCAweDgxLCAweGU1LCAweDE4LCAweDEwLCAweDlmLCAweGU1LCAKKzB4YjAsIDB4MjQsIDB4ZDEsIDB4ZTEsIDB4MDEsIDB4MjAsIDB4ODIsIDB4ZTIsIDB4YjAsIDB4MjQsIDB4YzEsIDB4ZTEsIAorMHgzYywgMHgyMCwgMHg5MSwgMHhlNSwgMHgwMCwgMHgwMCwgMHg4MiwgMHhlMSwgMHgzYywgMHgwMCwgMHg4MSwgMHhlNSwgCisweDFlLCAweGZmLCAweDJmLCAweGUxLCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAweGZmLCAweGZmLCAweGZmLCAweGVhLCAKKzB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZWEsIDB4MDEsIDB4MGIsIDB4YTAsIDB4ZTMsIDB4MDEsIDB4MTYsIDB4YTAsIDB4ZTMsIAorMHgxNCwgMHgwMCwgMHg4MSwgMHhlNSwgMHgwMCwgMHgxYSwgMHg4MSwgMHhlMSwgMHgyNCwgMHgyMCwgMHg5MSwgMHhlNSwgCisweDcwLCAweDAwLCAweDFmLCAweGU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDI0LCAweDIwLCAweDgwLCAweGU1LCAKKzB4MjgsIDB4MTAsIDB4OTEsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MTAsIDB4ODAsIDB4ZTUsIAorMHgyYywgMHgyMCwgMHg5MCwgMHhlNSwgMHgwMSwgMHgyMCwgMHg4MiwgMHhlMiwgMHgyYywgMHgyMCwgMHg4MCwgMHhlNSwgCisweDNmLCAweDAwLCAweDAxLCAweGUyLCAweDNmLCAweDAwLCAweDUwLCAweGUzLCAweDFlLCAweGZmLCAweDJmLCAweDExLCAKKzB4MTgsIDB4MDAsIDB4OWYsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4OTAsIDB4ZTUsIDB4MDEsIDB4MTAsIDB4ODEsIDB4ZTIsIAorMHgwMCwgMHgxMCwgMHg4MCwgMHhlNSwgMHgwMiwgMHgxOCwgMHhhMCwgMHhlMywgMHgwYiwgMHgwMiwgMHhhMCwgMHhlMywgCisweDAwLCAweDEwLCAweDgwLCAweGU1LCAweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDMwLCAweDA0LCAweDAwLCAweDgwLCAKKzB4MDEsIDB4MDYsIDB4YTAsIDB4ZTMsIDB4MDEsIDB4MDEsIDB4ODAsIDB4ZTIsIDB4MDAsIDB4MTAsIDB4OTAsIDB4ZTUsIAorMHgwMSwgMHgwOCwgMHgxMSwgMHhlMywgMHgwYiwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMiwgMHgxOSwgMHg4MSwgMHhlMiwgCisweDA1LCAweDAwLCAweDAwLCAweDFhLCAweDAwLCAweDIwLCAweDkwLCAweGU1LCAweDQyLCAweDI4LCAweGIwLCAweGUxLCAKKzB4MDUsIDB4MDAsIDB4MDAsIDB4MWEsIDB4MDAsIDB4MDAsIDB4OTAsIDB4ZTUsIDB4MDIsIDB4MGMsIDB4MTAsIDB4ZTMsIAorMHgwMiwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwNiwgMHgwNywgMHhhMCwgMHhlMywgMHg0YywgMHgxMSwgMHg4MCwgMHhlNSwgCisweDAzLCAweDAwLCAweDAwLCAweGVhLCAweDBjLCAweDAwLCAweDlmLCAweGU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4NDAsIDB4MTAsIDB4ODAsIDB4ZTUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZWEsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZWEsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMSwgMHgwNiwgMHhhMCwgMHhlMywgMHgwMSwgMHgwMSwgMHg4MCwgMHhlMiwgCisweDAwLCAweDEwLCAweDkwLCAweGU1LCAweDAxLCAweDA4LCAweDExLCAweGUzLCAweDBjLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDIsIDB4MTksIDB4ODEsIDB4ZTIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MWEsIDB4MDAsIDB4MjAsIDB4OTAsIDB4ZTUsIAorMHg0MiwgMHgyOCwgMHhiMCwgMHhlMSwgMHgwNSwgMHgwMCwgMHgwMCwgMHgxYSwgMHgwMCwgMHgwMCwgMHg5MCwgMHhlNSwgCisweDAyLCAweDBjLCAweDEwLCAweGUzLCAweDAyLCAweDAwLCAweDAwLCAweDBhLCAweDA2LCAweDA3LCAweGEwLCAweGUzLCAKKzB4NGMsIDB4MTEsIDB4ODAsIDB4ZTUsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZWEsIDB4NGMsIDB4MDAsIDB4MWYsIDB4ZTUsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgxMCwgMHg4MCwgMHhlNSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhlYSwgCisweGZlLCAweGZmLCAweGZmLCAweGVhLCAweDAyLCAweDFiLCAweGEwLCAweGUzLCAweDAxLCAweDA2LCAweGEwLCAweGUzLCAKKzB4MTQsIDB4MTAsIDB4ODAsIDB4ZTUsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4ODAsIDB4MjEsIDB4MWYsIDB4ZTUsIAorMHgxNCwgMHgzMCwgMHg5MiwgMHhlNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMCwgMHg4MCwgMHhlNSwgCisweDFjLCAweDAwLCAweDkyLCAweGU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MTQsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDEsIDB4MDYsIDB4YTAsIDB4ZTMsIAorMHgxYywgMHgxMCwgMHg4MiwgMHhlNSwgMHgwYywgMHgxMCwgMHg4MCwgMHhlNSwgMHgxYywgMHgxMCwgMHg5MiwgMHhlNSwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDFjLCAweDEwLCAweDgwLCAweGU1LCAweDFlLCAweGZmLCAweDJmLCAweGUxLCAKKzB4YzAsIDB4MjEsIDB4MWYsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMSwgMHgxNiwgMHhhMCwgMHhlMywgMHgxNCwgMHgwMCwgMHg4MiwgMHhlNSwgMHgwYywgMHgwMCwgMHg4MSwgMHhlNSwgCisweDFjLCAweDAwLCAweDkyLCAweGU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDFjLCAweDAwLCAweDgxLCAweGU1LCAKKzB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4ODAsIDB4YjUsIDB4MGYsIDB4MWMsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHgxNywgMHhmOCwgMHgwMCwgMHgyOCwgMHgwMiwgMHhkMCwgMHgzOCwgMHgxYywgCisweDAwLCAweGYwLCAweDkyLCAweGY4LCAweDAwLCAweDIwLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4ODAsIDB4YjUsIDB4MGYsIDB4MWMsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MDksIDB4ZjgsIDB4MDAsIDB4MjgsIAorMHgwMiwgMHhkMCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHg4NCwgMHhmOCwgMHgwMCwgMHgyMCwgMHg4MCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGYwLCAweGI0LCAweDA3LCAweDY4LCAweDNhLCAweDc4LCAweGQyLCAweDA3LCAKKzB4ZDIsIDB4MGYsIDB4MDAsIDB4MjQsIDB4MDAsIDB4MmEsIDB4MDMsIDB4ZDAsIDB4ZmYsIDB4MjIsIDB4MDEsIDB4MzIsIAorMHg0MiwgMHg2MCwgMHgwMCwgMHhlMCwgMHg0NCwgMHg2MCwgMHgzYSwgMHg3YiwgMHg3YiwgMHg3YiwgMHgxYiwgMHgwMiwgCisweDFhLCAweDQzLCAweDgxLCAweDJhLCAweDA4LCAweGQxLCAweDAxLCAweDIzLCAweDViLCAweDAyLCAweDQyLCAweDY4LCAKKzB4MWEsIDB4NDMsIDB4NDIsIDB4NjAsIDB4MDQsIDB4MjIsIDB4YmYsIDB4MTgsIDB4ODIsIDB4NjAsIDB4MDAsIDB4ZTAsIAorMHg4NCwgMHg2MCwgMHgzYSwgMHg3YiwgMHg3YiwgMHg3YiwgMHgxYiwgMHgwMiwgMHgxYSwgMHg0MywgMHgwOCwgMHgyYSwgCisweDA2LCAweGQxLCAweDA2LCAweDIzLCAweDQxLCAweDY4LCAweDE5LCAweDQzLCAweDQxLCAweDYwLCAweDgxLCAweDY4LCAKKzB4MGUsIDB4MzEsIDB4M2MsIDB4ZTAsIDB4YzEsIDB4MjMsIDB4ZGIsIDB4MDAsIDB4OWEsIDB4NDIsIDB4MDMsIDB4ZDEsIAorMHg0MSwgMHg2OCwgMHgyNCwgMHg0YiwgMHgxOSwgMHg0MywgMHgzZSwgMHhlMCwgMHgyMywgMHg0YiwgMHg5YSwgMHg0MiwgCisweDA0LCAweGQxLCAweDAxLCAweDIzLCAweDFiLCAweDAzLCAweDQxLCAweDY4LCAweDE5LCAweDQzLCAweDM2LCAweGUwLCAKKzB4MTMsIDB4MDIsIDB4MTIsIDB4MGEsIDB4MTIsIDB4MDYsIDB4MTIsIDB4MGUsIDB4MWEsIDB4NDMsIDB4MTIsIDB4MDQsIAorMHgxMiwgMHgwYywgMHgyZSwgMHgzYSwgMHgxYywgMHg0YiwgMHg5YSwgMHg0MiwgMHgyZCwgMHhkOCwgMHgwMSwgMHgyNSwgCisweDQyLCAweDY4LCAweDE1LCAweDQzLCAweDQ1LCAweDYwLCAweGJhLCAweDdiLCAweGZiLCAweDdiLCAweDFiLCAweDAyLCAKKzB4MWEsIDB4NDMsIDB4MTgsIDB4NGIsIDB4OWEsIDB4NDIsIDB4MjIsIDB4ZDEsIDB4ZmIsIDB4MWQsIDB4MDksIDB4MzMsIAorMHg0NCwgMHhjYiwgMHg5YiwgMHgwNywgMHhkYiwgMHgwZSwgMHhkYSwgMHg0MCwgMHg1YiwgMHg0MiwgMHgyMCwgMHgzMywgCisweDllLCAweDQwLCAweDE2LCAweDQzLCAweDAzLCAweDJlLCAweDE4LCAweGQxLCAweDM5LCAweDdkLCAweDdiLCAweDdkLCAKKzB4MWIsIDB4MDIsIDB4MTksIDB4NDMsIDB4MDgsIDB4MjksIDB4MDcsIDB4ZDEsIDB4MDQsIDB4MjEsIDB4MjksIDB4NDMsIAorMHg0MSwgMHg2MCwgMHg4MSwgMHg2OCwgMHgxNiwgMHgzMSwgMHg4MSwgMHg2MCwgMHgwMSwgMHgyMSwgMHgwYSwgMHhlMCwgCisweGMxLCAweDIzLCAweGRiLCAweDAwLCAweDk5LCAweDQyLCAweDA0LCAweGQxLCAweDAxLCAweDIxLCAweDg5LCAweDAzLCAKKzB4MjksIDB4NDMsIDB4NDEsIDB4NjAsIDB4MDAsIDB4ZTAsIDB4ODQsIDB4NjAsIDB4MDAsIDB4MjEsIDB4MDgsIDB4MWMsIAorMHhmMCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMiwgMHg0MCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MCwgMHgwMCwgMHgwMCwgCisweGFlLCAweDA1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDgwLCAweGI0LCAweDQyLCAweDY4LCAKKzB4ZDEsIDB4MDgsIDB4M2YsIDB4ZDMsIDB4MDEsIDB4NjgsIDB4ODMsIDB4NjgsIDB4NTksIDB4MTgsIDB4MDIsIDB4MzksIAorMHg4ZiwgMHg3OCwgMHgzZiwgMHgwNywgMHgzZiwgMHgwZiwgMHgwNSwgMHgyZiwgMHgwMywgMHhkMSwgMHhkYSwgMHgxZCwgCisweDBkLCAweDMyLCAweGMyLCAweDYwLCAweDA1LCAweGUwLCAweGJmLCAweDAwLCAweGRiLCAweDE5LCAweGMzLCAweDYwLCAKKzB4MDgsIDB4MjMsIDB4MWEsIDB4NDMsIDB4NDIsIDB4NjAsIDB4OGEsIDB4NzgsIDB4MTIsIDB4MDcsIDB4MTIsIDB4MGYsIAorMHg5MiwgMHgwMCwgMHgwMiwgMHg2MSwgMHgwYSwgMHg3OSwgMHg0YiwgMHg3OSwgMHgxYiwgMHgwMiwgMHgxYSwgMHg0MywgCisweDEzLCAweDAyLCAweDEyLCAweDBhLCAweDEyLCAweDA2LCAweDEyLCAweDBlLCAweDFhLCAweDQzLCAweDEyLCAweDA0LCAKKzB4MTIsIDB4MGMsIDB4NDIsIDB4NjEsIDB4Y2EsIDB4N2EsIDB4MDYsIDB4MmEsIDB4MDMsIDB4ZDEsIDB4MTAsIDB4MjMsIAorMHg0MiwgMHg2OCwgMHgxYSwgMHg0MywgMHgxMCwgMHhlMCwgMHgxMSwgMHgyYSwgMHgwMywgMHhkMSwgMHgyMCwgMHgyMywgCisweDQyLCAweDY4LCAweDFhLCAweDQzLCAweDBhLCAweGUwLCAweDMzLCAweDJhLCAweDAzLCAweGQxLCAweDQwLCAweDIzLCAKKzB4NDIsIDB4NjgsIDB4MWEsIDB4NDMsIDB4MDQsIDB4ZTAsIDB4MzIsIDB4MmEsIDB4MDMsIDB4ZDEsIDB4ODAsIDB4MjMsIAorMHg0MiwgMHg2OCwgMHgxYSwgMHg0MywgMHg0MiwgMHg2MCwgMHhjOSwgMHg3YSwgMHhjMCwgMHg0NiwgMHgwMSwgMHg3NiwgCisweDgwLCAweGJjLCAweDcwLCAweDQ3LCAweDBhLCAweDc4LCAweGMwLCAweDQ2LCAweDAyLCAweDYwLCAweDRiLCAweDc4LCAKKzB4MWIsIDB4MDIsIDB4MWEsIDB4NDMsIDB4MDIsIDB4NjAsIDB4OGIsIDB4NzgsIDB4MWIsIDB4MDQsIDB4MWEsIDB4NDMsIAorMHgwMiwgMHg2MCwgMHhjOSwgMHg3OCwgMHgwOSwgMHgwNiwgMHgxMSwgMHg0MywgMHgwMSwgMHg2MCwgMHg3MCwgMHg0NywgCisweDgwLCAweGI1LCAweDA3LCAweDFjLCAweDQ4LCAweDY4LCAweDgwLCAweDA5LCAweDI2LCAweGQzLCAweGI4LCAweDZhLCAKKzB4YzksIDB4NjgsIDB4NDAsIDB4MTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MDIsIDB4MzAsIDB4MTgsIDB4NDMsIAorMHgwMCwgMHg2OCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgxMSwgMHgyMywgMHg5YiwgMHgwMiwgMHg5OCwgMHg0MiwgCisweDE4LCAweGQxLCAweDc4LCAweDZhLCAweDM5LCAweDZiLCAweGMwLCAweDQ2LCAKKzB4NDgsIDB4NjIsIDB4MzgsIDB4NmIsIDB4MDIsIDB4ZjAsIDB4ZGEsIDB4ZjgsIDB4MzgsIDB4MWMsIDB4MDEsIDB4ZjAsIAorMHg5NSwgMHhmZCwgMHgwMSwgMHgyMCwgMHgwNywgMHg0OSwgMHhjMCwgMHg0NiwgMHhjOCwgMHg3MywgMHgwNywgMHg0OSwgCisweDRhLCAweDZjLCAweDEyLCAweDE4LCAweDRhLCAweDY0LCAweDA2LCAweDQ5LCAweDhhLCAweDZkLCAweDEyLCAweDE4LCAKKzB4OGEsIDB4NjUsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MjAsIDB4ZmEsIDB4ZTcsIAorMHgxOCwgMHgxYSwgMHgwMCwgMHg4MCwgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgCisweDgxLCAweDA3LCAweDE5LCAweGQwLCAweDgwLCAweDA4LCAweDgwLCAweDAwLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4MDEsIDB4MWQsIDB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIDB4MDIsIDB4MDIsIAorMHgxMiwgMHgwZSwgMHgxMiwgMHgwNiwgMHgwMCwgMHgwYSwgMHhmZiwgMHgyMywgMHgxYiwgMHgwNCwgMHgxOCwgMHg0MCwgCisweDEwLCAweDQzLCAweDBhLCAweDBhLCAweDEyLCAweDA2LCAweDEyLCAweDBlLCAweDEwLCAweDQzLCAweDA5LCAweDAyLCAKKzB4MWIsIDB4MGEsIDB4MTksIDB4NDAsIDB4MDgsIDB4NDMsIDB4NzAsIDB4NDcsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHgwMSwgMHgwNiwgMHgwMiwgMHgwMiwgMHhmZiwgMHgyMywgMHgxYiwgMHgwNCwgCisweDFhLCAweDQwLCAweDExLCAweDQzLCAweDAyLCAweDBhLCAweDFiLCAweDBhLCAweDFhLCAweDQwLCAweDExLCAweDQzLCAKKzB4MDAsIDB4MGUsIDB4MDgsIDB4NDMsIDB4ZWQsIDB4ZTcsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4YjUsIDB4MDQsIDB4MjMsIAorMHg4MSwgMHg2YiwgMHgxOSwgMHg0MCwgMHgwMCwgMHgyMiwgMHgwMCwgMHgyOSwgMHg0NiwgMHhkMCwgMHhjNywgMHgxZCwgCisweDM5LCAweDM3LCAweDM5LCAweDdiLCAweDMzLCAweDI5LCAweDAxLCAweGQwLCAweDMyLCAweDI5LCAweDNmLCAweGQxLCAKKzB4MDEsIDB4NmIsIDB4YzAsIDB4NDYsIDB4NGEsIDB4NjUsIDB4YzQsIDB4MWQsIDB4MmQsIDB4MzQsIDB4Y2QsIDB4MWQsIAorMHgyZCwgMHgzNSwgMHgwMCwgMHgyMiwgMHg5MywgMHgwMCwgMHhlNiwgMHg1OCwgMHhjMCwgMHg0NiwgMHhlZSwgMHg1MCwgCisweDAxLCAweDMyLCAweDA3LCAweDJhLCAweGY4LCAweGQzLCAweDgyLCAweDZhLCAweGMwLCAweDQ2LCAweDRhLCAweDYzLCAKKzB4ODIsIDB4NmEsIDB4YzAsIDB4NDYsIDB4OGEsIDB4NjIsIDB4N2EsIDB4OGIsIDB4Y2IsIDB4MWQsIDB4MzksIDB4MzMsIAorMHg1YSwgMHg4MywgMHg0MCwgMHg2YSwgMHhjMCwgMHg0NiwgMHg0OCwgMHg2MiwgMHgxMiwgMHg0OCwgMHgwMSwgMHgyNywgCisweDQyLCAweDY4LCAweDAwLCAweDJhLCAweDEwLCAweGQxLCAweGMyLCAweDY4LCAweDAwLCAweDJhLCAweDEzLCAweGQxLCAKKzB4NDIsIDB4NjksIDB4MDAsIDB4MmEsIDB4MGQsIDB4ZDEsIDB4MDEsIDB4NjEsIDB4YzEsIDB4NjAsIDB4MDEsIDB4NmEsIAorMHgwMiwgMHgyOSwgMHgwMiwgMHhkMywgMHgyMCwgMHgzMCwgMHgwNywgMHg3MSwgMHgwYywgMHhlMCwgMHgwMCwgMHhmMCwgCisweDEzLCAweGY4LCAweDA5LCAweGUwLCAweGMyLCAweDY4LCAweDAwLCAweDJhLCAweDAyLCAweGQxLCAweDAxLCAweDYxLCAKKzB4YzEsIDB4NjAsIDB4MDMsIDB4ZTAsIDB4MDIsIDB4NjksIDB4YzAsIDB4NDYsIDB4NTEsIDB4NjUsIDB4MDEsIDB4NjEsIAorMHgzOCwgMHgxYywgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgxMCwgMHgxYywgMHhmYSwgMHhlNywgCisweDZjLCAweDA2LCAweDAwLCAweDgwLCAweDgwLCAweGI1LCAweDFlLCAweDQ5LCAweDAwLCAweDIyLCAweGNiLCAweDY4LCAKKzB4MDAsIDB4MmIsIDB4MzQsIDB4ZDAsIDB4YzgsIDB4MWQsIDB4ZjksIDB4MzAsIDB4ODMsIDB4NjIsIDB4Y2IsIDB4NjgsIAorMHg5YiwgMHg2YSwgMHhjMCwgMHg0NiwgMHhjMywgMHg2MiwgMHhjZiwgMHg2OSwgMHg3YiwgMHgwMCwgMHhkZiwgMHgxOSwgCisweDdmLCAweDAyLCAweDE3LCAweDRiLCAweGZmLCAweDE4LCAweGZmLCAweDM3LCAweDY1LCAweDM3LCAweDgzLCAweDYzLCAKKzB4MDcsIDB4NjMsIDB4Y2IsIDB4MWQsIDB4ZmYsIDB4MzMsIDB4NWEsIDB4MzMsIDB4MWEsIDB4NzIsIDB4Y2IsIDB4NjksIAorMHgwMCwgMHgyYiwgMHgwMSwgMHhkMCwgMHhjYSwgMHg2MSwgMHgwMSwgMHhlMCwgMHgwMSwgMHgyMywgMHhjYiwgMHg2MSwgCisweDBmLCAweDFjLCAweGM5LCAweDY4LCAweDQ5LCAweDZhLCAweDA5LCAweDg5LCAweDAxLCAweDMxLCAweDQxLCAweDYzLCAKKzB4ZjgsIDB4MWQsIDB4ZmYsIDB4MzAsIDB4M2EsIDB4MzAsIDB4NDIsIDB4NjAsIDB4MDIsIDB4ODIsIDB4ODIsIDB4NjAsIAorMHhjMiwgMHg2MCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHhjZSwgMHhmYSwgMHgzOCwgMHg2YSwgMHgwMSwgMHgzMCwgCisweDM4LCAweDYyLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDBhLCAweGY4LCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MTAsIDB4MWMsIDB4ZmEsIDB4ZTcsIDB4MDAsIDB4MDAsIDB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIAorMHhhYywgMHhhYiwgMHgyMCwgMHg0MCwgMHhmMCwgMHhiNSwgMHgwNywgMHgxYywgMHhmOSwgMHgxZCwgMHhmOSwgMHgzMSwgCisweDg4LCAweDZhLCAweGMyLCAweDFkLCAweDJkLCAweDMyLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDA4LCAweDMyLCAKKzB4MWEsIDB4NDMsIDB4YzgsIDB4NmEsIDB4MTIsIDB4NjgsIDB4MTIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4ODAsIDB4MTgsIAorMHg4MiwgMHg3OSwgMHhjMywgMHg3OSwgMHgxYiwgMHgwMiwgMHgxYSwgMHg0MywgMHgxMywgMHgwMiwgMHgxMiwgMHgwYSwgCisweDEyLCAweDA2LCAweDEyLCAweDBlLCAweDFhLCAweDQzLCAweDEyLCAweDA0LCAweDEyLCAweDBjLCAweDAyLCAweDM4LCAKKzB4OTIsIDB4MDQsIDB4OTIsIDB4MGMsIDB4MDAsIDB4MjYsIDB4MjUsIDB4NGQsIAorMHhlYywgMHgxZCwgMHhmZiwgMHgzNCwgMHgzYSwgMHgzNCwgMHgwMCwgMHgyYSwgMHgwNCwgMHhkMCwgMHgyMCwgMHg4YSwgCisweDAxLCAweDIzLCAweDliLCAweDAyLCAweDE4LCAweDQzLCAweDJiLCAweGUwLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4YzIsIDB4MWQsIDB4MGQsIDB4MzIsIDB4MWEsIDB4NDMsIDB4MTIsIDB4NjgsIDB4MTIsIDB4MDQsIDB4MTIsIDB4MzAsIAorMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgxMCwgMHg0MywgMHgwMywgMHgxYywgCisweGY4LCAweDFkLCAweGZmLCAweDMwLCAweDRhLCAweDMwLCAweDgyLCAweDc4LCAweGM4LCAweDZiLCAweDE5LCAweDFjLCAKKzB4MDIsIDB4ZjAsIDB4MDIsIDB4ZjgsIDB4MDAsIDB4MjgsIDB4MDQsIDB4ZGEsIDB4MjAsIDB4OGEsIDB4ZmYsIDB4MjMsIAorMHgwMSwgMHgzMywgMHgxOCwgMHg0MywgMHgwZSwgMHhlMCwgMHhmOSwgMHgxZCwgMHhmZiwgMHgzMSwgMHgzYSwgMHgzMSwgCisweDA4LCAweDYwLCAweDAxLCAweDA0LCAweDA5LCAweDBjLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDFjLCAweGY4LCAKKzB4MDAsIDB4MjgsIDB4MTQsIDB4ZDEsIDB4MjAsIDB4OGEsIDB4MDEsIDB4MjMsIDB4NWIsIDB4MDIsIDB4MTgsIDB4NDMsIAorMHgyMCwgMHg4MiwgMHgyMSwgMHg4YSwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHhhMiwgMHhmYiwgMHhlOCwgMHg2OCwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweDU0LCAweDMwLCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAweGMwLCAweDQ2LCAKKzB4ZTgsIDB4NjAsIDB4MzAsIDB4MWMsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDEsIDB4MjAsIAorMHhmYSwgMHhlNywgMHgwMCwgMHgwMCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgMHhmOCwgMHhiNSwgMHgwNywgMHgxYywgCisweGZjLCAweDFkLCAweGY5LCAweDM0LCAweGEwLCAweDZiLCAweGE2LCAweDZhLCAweGM1LCAweDFkLCAweDBkLCAweDM1LCAKKzB4MzgsIDB4NDgsIDB4YzAsIDB4NmEsIDB4NGIsIDB4MDAsIDB4NTksIDB4MTgsIDB4NDksIDB4MDEsIDB4NDIsIDB4MTgsIAorMHgwMSwgMHgyMCwgMHg4MCwgMHgwNywgMHgxMCwgMHg0MywgMHgwMCwgMHg2OCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgCisweDAwLCAweDkwLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweGQwLCAweDFkLCAweDA1LCAweDMwLCAweDE4LCAweDQzLCAKKzB4MDAsIDB4NjgsIDB4MzgsIDB4MWMsIDB4MjksIDB4MWMsIDB4MDAsIDB4ZjAsIDB4YzIsIDB4ZmEsIDB4YTgsIDB4ODgsIAorMHg0MSwgMHgwNywgMHgwMSwgMHhkMCwgMHgwMCwgMHgyMCwgMHg1MSwgMHhlMCwgMHgyOSwgMHg4OSwgMHgwOSwgMHgxOCwgCisweDYwLCAweDZiLCAweDgxLCAweDQyLCAweGY4LCAweGQ4LCAweDY5LCAweDg5LCAweGVhLCAweDg4LCAweDg5LCAweDE4LCAKKzB4ODEsIDB4NDIsIDB4ZjMsIDB4ZDgsIDB4MDAsIDB4OTgsIDB4MDEsIDB4MjgsIDB4MjUsIDB4ZDEsIDB4ZTAsIDB4NmEsIAorMHhmMSwgMHg2YiwgMHg0MCwgMHgxOCwgMHg3MSwgMHg2YywgMHhmYSwgMHgxZCwgMHhjZCwgMHgzMiwgMHgwMSwgMHhmMCwgCisweDMzLCAweGY5LCAweGZhLCAweDFkLCAweGZmLCAweDMyLCAweDNhLCAweDMyLCAweGUwLCAweDZhLCAweDUxLCAweDY5LCAKKzB4NDAsIDB4MTgsIDB4YzMsIDB4MWQsIDB4MDMsIDB4MzMsIDB4MDAsIDB4MjAsIDB4ODEsIDB4MDAsIDB4NWUsIDB4NTgsIAorMHhjOSwgMHgxOSwgMHhmZiwgMHgzMSwgMHgwMSwgMHgzMSwgMHg0ZSwgMHg2MSwgMHgwMSwgMHgzMCwgMHgwNCwgMHgyOCwgCisweGY2LCAweGQzLCAweGUwLCAweDZhLCAweDUxLCAweDY5LCAweDQwLCAweDE4LCAweGMxLCAweDFkLCAweDA1LCAweDMxLCAKKzB4MDAsIDB4MjAsIDB4MDAsIDB4MjIsIDB4NDMsIDB4MDAsIDB4Y2EsIDB4NTIsIDB4MDEsIDB4MzAsIDB4MDYsIDB4MjgsIAorMHhmYSwgMHhkMywgMHgyOSwgMHgxYywgMHgxMSwgMHg0YSwgMHgwMCwgMHgyMCwgMHhmZiwgMHhmNywgMHhhZSwgMHhmYiwgCisweDAxLCAweDIyLCAweDUyLCAweDA0LCAweDYwLCAweDZiLCAweDAyLCAweDQzLCAweDAxLCAweDIwLCAweDIxLCAweDZiLCAKKzB4ZmYsIDB4ZjcsIDB4YTYsIDB4ZmIsIDB4MDEsIDB4MjIsIDB4NTIsIDB4MDQsIDB4NjAsIDB4NmIsIDB4MDIsIDB4NDMsIAorMHgwMCwgMHgyMCwgMHhlMSwgMHg2YSwgMHhmZiwgMHhmNywgMHg5ZSwgMHhmYiwgMHhhMSwgMHg2YiwgMHgwOCwgMHg0YSwgCisweDAxLCAweDIwLCAweGZmLCAweGY3LCAweDk5LCAweGZiLCAweDAzLCAweDIwLCAweDA2LCAweDQ5LCAweGMwLCAweDQ2LCAKKzB4NDgsIDB4NjIsIDB4MDEsIDB4MjAsIDB4ZjgsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgMHg1NCwgMHgwMCwgMHgwMywgMHgwMCwgMHgxNCwgMHgwMCwgMHgwZiwgMHgwMCwgCisweDZjLCAweDA3LCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweDhkLCAweGIwLCAweDAwLCAweDIwLCAweGI1LCAweDRhLCAKKzB4ZDUsIDB4MWQsIDB4ZjksIDB4MzUsIDB4NjgsIDB4NjIsIDB4MDEsIDB4MjAsIDB4MDAsIDB4MDUsIDB4YjMsIDB4NDksIAorMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHhhOCwgMHg2YSwgMHhjNCwgMHgxZCwgMHgyZCwgMHgzNCwgMHhiMSwgMHg0OCwgCisweGMwLCAweDZhLCAweGQ3LCAweDFkLCAweGZmLCAweDM3LCAweDNhLCAweDM3LCAweDM5LCAweDY4LCAweDRiLCAweDAwLCAKKzB4NTksIDB4MTgsIDB4NDksIDB4MDEsIDB4NDAsIDB4MTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4YzEsIDB4MWQsIAorMHgwNSwgMHgzMSwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgMHgwOCwgMHgzMCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgCisweGMwLCAweDQ2LCAweDA5LCAweDkwLCAweGZmLCAweDIzLCAweDFiLCAweDAyLCAweDE4LCAweDQwLCAweDAwLCAweDBhLCAKKzB4MGEsIDB4OTAsIDB4MGEsIDB4OTgsIDB4YTQsIDB4NGUsIDB4MDEsIDB4MjgsIDB4NTksIDB4ZDEsIDB4MjgsIDB4NmIsIAorMHhhMiwgMHg2OCwgMHg4MCwgMHgxOCwgMHhhMiwgMHg0YSwgMHgyMSwgMHg2OSwgCisweDA5LCAweDA0LCAweDA5LCAweDBjLCAweDAxLCAweGYwLCAweDI2LCAweGY5LCAweDI4LCAweDZiLCAweDc5LCAweDY5LCAKKzB4NDAsIDB4MTgsIDB4YzEsIDB4MWQsIDB4MDUsIDB4MzEsIDB4MDAsIDB4MjAsIDB4ODIsIDB4MDAsIDB4OTgsIDB4NGIsIAorMHhkMywgMHgxOCwgMHhmZiwgMHgzMywgMHgwMSwgMHgzMywgMHg1YiwgMHg2OSwgMHhjMCwgMHg0NiwgMHg4YiwgMHg1MCwgCisweDAxLCAweDMwLCAweDA0LCAweDI4LCAweGY0LCAweGQzLCAweDAwLCAweDIwLCAweDMxLCAweDFjLCAweDgyLCAweDAwLCAKKzB4NTYsIDB4MTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MDQsIDB4YWUsIAorMHhiMywgMHg1MCwgMHgwMSwgMHgzMCwgMHgwMywgMHgyOCwgMHhmNCwgMHhkMywgMHgwMCwgMHgyMCwgMHgwOCwgMHg5MCwgCisweDkwLCAweDQ5LCAweDQyLCAweDAwLCAweDhiLCAweDVhLCAweGIyLCAweDVhLCAweDkzLCAweDQyLCAweDEzLCAweGQwLCAKKzB4OGUsIDB4NDgsIDB4YzEsIDB4ODksIDB4MDEsIDB4MzEsIDB4YzEsIDB4ODEsIDB4YjgsIDB4NjgsIDB4MDAsIDB4MjgsIAorMHgwMywgMHhkMSwgMHgzOCwgMHg4YSwgMHgxMCwgMHgyMywgMHgxOCwgMHg0MywgMHg3MSwgMHhlMCwgMHgzOCwgMHg4YSwgCisweDQwLCAweDIzLCAweDE4LCAweDQzLCAweDZkLCAweGUwLCAweDAwLCAweGYwLCAweDExLCAweGY5LCAweDAxLCAweGYwLCAKKzB4NjcsIDB4ZmYsIDB4ZjUsIDB4ZTAsIDB4MDEsIDB4MzAsIDB4MDYsIDB4MjgsIDB4ZTMsIDB4ZDMsIDB4MDgsIDB4OTgsIAorMHgwMCwgMHgyOCwgMHgwYywgMHhkMSwgMHhiOCwgMHg2OCwgMHg0MSwgMHgxYywgMHhiOSwgMHg2MCwgMHgwMCwgMHgyOCwgCisweDAzLCAweGQxLCAweDM4LCAweDhhLCAweDAxLCAweDIzLCAweDE4LCAweDQzLCAweDAyLCAweGUwLCAweDM4LCAweDhhLCAKKzB4MDQsIDB4MjMsIDB4MTgsIDB4NDMsIDB4MzgsIDB4ODIsIDB4NzgsIDB4NjgsIDB4MDEsIDB4MzAsIDB4NzgsIDB4NjAsIAorMHg2MiwgMHhlMCwgMHgwYSwgMHg5OCwgMHgwMiwgMHgyOCwgMHg1ZiwgMHhkMSwgMHgwOSwgMHg5OCwgMHg0MCwgMHgwYywgCisweDczLCAweGQzLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweGUwLCAweDFkLCAweDAxLCAweDMwLCAweDE4LCAweDQzLCAKKzB4MDAsIDB4NjgsIDB4ZTEsIDB4MWQsIDB4MGQsIDB4MzEsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIDB4NDAsIDB4MTgsIAorMHgwYywgMHgzOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgwMCwgMHgyMSwgMHg4YSwgMHgwMCwgMHg2YiwgMHg0YiwgCisweGQ2LCAweDE4LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDMzLCAweDQzLCAweDFiLCAweDY4LCAweDA0LCAweGFlLCAKKzB4YjMsIDB4NTAsIDB4MDEsIDB4MzEsIDB4MDMsIDB4MjksIDB4ZjMsIDB4ZDMsIDB4MDAsIDB4MjEsIDB4ODMsIDB4MWUsIAorMHgwYywgMHg5MywgMHg2OCwgMHg0YSwgMHgxNiwgMHg2YiwgMHhjMCwgMHg0NiwgMHgwYiwgMHg5NiwgMHg4YSwgMHgwMCwgCisweDBjLCAweDliLCAweDliLCAweDE4LCAweDBiLCAweDllLCAweDllLCAweDE5LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4NmUsIDB4NDYsIDB4YjMsIDB4NTAsIDB4MDEsIDB4MzEsIDB4MDQsIDB4MjksIAorMHhmMSwgMHhkMywgMHg2OSwgMHg0NiwgMHg4YiwgMHgxYywgMHgwNywgMHg5MywgMHgwMCwgMHgyMSwgMHgwOCwgMHg5MSwgCisweDA0LCAweGFlLCAweDRhLCAweDAwLCAweDA3LCAweDliLCAweDliLCAweDVhLCAweGIyLCAweDVhLCAweDkzLCAweDQyLCAKKzB4MTEsIDB4ZDAsIDB4NTgsIDB4NDgsIDB4YzEsIDB4ODksIDB4MDEsIDB4MzEsIDB4YzEsIDB4ODEsIDB4ZjgsIDB4NjgsIAorMHg0MSwgMHgxYywgMHhmOSwgMHg2MCwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMSwgMHgzOCwgMHg4YSwgMHgyMCwgMHgyMywgCisweDE4LCAweDQzLCAweDAyLCAweGUwLCAweDM4LCAweDhhLCAweDgwLCAweDIzLCAweDE4LCAweDQzLCAweDM4LCAweDgyLCAKKzB4OGYsIDB4ZTcsIDB4MDEsIDB4MzEsIDB4MDYsIDB4MjksIDB4ZTQsIDB4ZDMsIDB4MDgsIDB4OTksIDB4MDAsIDB4MjksIAorMHgwZCwgMHhkMSwgMHhmOSwgMHg2OCwgMHg0YSwgMHgxYywgMHhmYSwgMHg2MCwgMHgwMCwgMHgyOSwgMHgwNCwgMHhkMSwgCisweDM5LCAweDhhLCAweDAyLCAweDIzLCAweDE5LCAweDQzLCAweDAzLCAweGUwLCAweDBjLCAweGUwLCAweDM5LCAweDhhLCAKKzB4MDgsIDB4MjMsIDB4MTksIDB4NDMsIDB4MzksIDB4ODIsIDB4MjksIDB4NmIsIDB4MDgsIDB4MTgsIDB4MDEsIDB4MjMsIAorMHg5YiwgMHgwNywgMHgwMSwgMHgzOCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHhjMCwgMHg0NiwgMHgyMCwgMHg3NiwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweGUwLCAweDFkLCAweDExLCAweDMwLCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAKKzB4MDEsIDB4MDYsIDB4MDksIDB4MGUsIDB4MDAsIDB4ZTAsIDB4MTksIDB4ZTAsIDB4MzUsIDB4NDgsIDB4MmEsIDB4NmIsIAorMHhjMCwgMHg0NiwgMHhlYSwgMHg2MiwgMHgwNCwgMHgyOSwgMHg0ZiwgMHhkMSwgMHgwMSwgMHgyMSwgMHhjNiwgMHgxZCwgCisweGZmLCAweDM2LCAweDVhLCAweDM2LCAweDMxLCAweDcyLCAweDBhLCAweDk5LCAweDAyLCAweDI5LCAweDFlLCAweGQxLCAKKzB4MDksIDB4OTksIDB4MDksIDB4MGUsIDB4NDksIDB4MDYsIDB4MWEsIDB4ZDEsIDB4ZTEsIDB4MWQsIDB4MDUsIDB4MzEsIAorMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgMHgwOSwgMHgwNiwgMHgwOSwgMHgwZSwgMHgwOCwgMHgzOSwgMHgxYSwgMHhlMCwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweGUwLCAweDFkLCAweDAxLCAweDMwLCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAKKzB4ZTEsIDB4MWQsIDB4MGQsIDB4MzEsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIDB4NDAsIDB4MTgsIDB4MDAsIDB4MDQsIAorMHgwMCwgMHgwYywgMHhmOSwgMHg2OCwgMHg0YSwgMHgxYywgMHhmYSwgMHg2MCwgMHgwMCwgMHgyOSwgMHhiYywgMHhkMSwgCisweGI2LCAweGU3LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweGUxLCAweDFkLCAKKzB4MDUsIDB4MzEsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIDB4MDksIDB4MDYsIDB4MDksIDB4MGUsIDB4YTEsIDB4NjAsIAorMHhlOCwgMHg2YSwgMHhjMCwgMHg0NiwgMHgyMCwgMHg2MCwgMHgyMCwgMHgxYywgMHhmZiwgMHhmNywgMHg4OCwgMHhmYywgCisweDIwLCAweDdlLCAweDMzLCAweDI4LCAweDAxLCAweGQwLCAweDMyLCAweDI4LCAweDExLCAweGQxLCAweDAxLCAweDIxLCAKKzB4MTQsIDB4NGMsIDB4YzAsIDB4NDYsIDB4ZjksIDB4NjAsIDB4YjksIDB4NjAsIDB4MjAsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHg4NSwgMHhmOCwgMHgyOCwgMHg2YiwgMHhhOSwgMHg2YSwgMHhjMCwgMHg0NiwgMHg4OCwgMHg2MiwgMHgyMCwgMHgxYywgCisweGZmLCAweGY3LCAweGMwLCAweGZkLCAweDAwLCAweDI4LCAweDExLCAweGQxLCAweDBlLCAweGUwLCAweDAwLCAweDIwLCAKKzB4MzAsIDB4NzIsIDB4MTEsIDB4ZTAsIDB4MzMsIDB4MjksIDB4MDEsIDB4ZDAsIDB4MzIsIDB4MjksIDB4MGQsIDB4ZDEsIAorMHgwNywgMHgxYywgMHgwMCwgMHhmMCwgMHg3MSwgMHhmOCwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHhiMCwgMHhmZCwgCisweDAwLCAweDI4LCAweDAxLCAweGQxLCAweDAxLCAweGYwLCAweDcwLCAweGZlLCAweDBkLCAweGIwLCAweGYwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4ZjAsIDB4MTIsIDB4ZjgsIDB4ZjYsIDB4ZTcsIDB4MDAsIDB4MDAsIAorMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgCisweGFjLCAweGFiLCAweDIwLCAweDQwLCAweDQwLCAweDA3LCAweDAwLCAweDgwLCAweDgyLCAweDA3LCAweDAwLCAweDgwLCAKKzB4MGMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4NmMsIDB4MDcsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjUsIDB4MjUsIDB4NDgsIAorMHg0MSwgMHg2OCwgMHgwMSwgMHgzMSwgMHg0MSwgMHg2MCwgMHgyNCwgMHg0ZiwgMHhmOSwgMHgxZCwgMHhmOSwgMHgzMSwgCisweDAwLCAweDI0LCAweDg4LCAweDZhLCAweGZhLCAweDY4LCAweGMwLCAweDQ2LCAweDk0LCAweDYxLCAweDA0LCAweDIyLCAKKzB4ZmIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZGEsIDB4NjAsIDB4MTAsIDB4MjIsIDB4ZmIsIDB4NjgsIDB4YzAsIDB4NDYsIAorMHg5YSwgMHg2MSwgMHhmYSwgMHgxZCwgMHhmZiwgMHgzMiwgMHg1YSwgMHgzMiwgMHgxMywgMHg3YSwgMHgxYiwgMHg0YSwgCisweDAwLCAweDJiLCAweDBiLCAweGQwLCAweDE1LCAweDhhLCAweDJlLCAweDBhLCAweDM2LCAweDAyLCAweDMzLCAweDIzLCAKKzB4MmIsIDB4NDAsIDB4OWIsIDB4MDAsIDB4MWUsIDB4NDMsIDB4Y2MsIDB4MjMsIDB4MmIsIDB4NDAsIDB4OWIsIDB4MDgsIAorMHgzMywgMHg0MywgMHgxMywgMHg4MiwgMHgxMiwgMHg4YSwgMHhmYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHhkYSwgMHg4MywgCisweDRhLCAweDZiLCAweGZiLCAweDY4LCAweGMwLCAweDQ2LCAweGRhLCAweDgxLCAweDBhLCAweDZiLCAweGMwLCAweDQ2LCAKKzB4ODIsIDB4NjIsIDB4YzQsIDB4NjIsIDB4YzMsIDB4MWQsIDB4MzksIDB4MzMsIDB4NGEsIDB4NmIsIDB4YzAsIDB4NDYsIAorMHg1YSwgMHg4MywgMHgwNCwgMHgyMywgMHgwMiwgMHg2OCwgMHgxYSwgMHg0MywgMHgwMiwgMHg2MCwgMHg4OCwgMHg2YSwgCisweDAxLCAweGYwLCAweDMyLCAweGZhLCAweGY4LCAweDY4LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDU0LCAweDMwLCAKKzB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZjgsIDB4NjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgCisweGFjLCAweDA3LCAweDAwLCAweDgwLCAweDgwLCAweGI1LCAweGMxLCAweDFkLCAweGY5LCAweDMxLCAweDhhLCAweDZhLCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDEsIDB4MWQsIDB4NDUsIDB4MzEsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIAorMHgwYiwgMHgwNiwgMHgxYiwgMHgwZSwgMHgwMSwgMHgyNywgMHhjMSwgMHgxZCwgMHhmZiwgMHgzMSwgMHg0YSwgMHgzMSwgCisweDMzLCAweDJiLCAweDA1LCAweGQxLCAweDhiLCAweDcwLCAweDAxLCAweDFjLCAweDEwLCAweDFjLCAweDAwLCAweGYwLCAKKzB4MGYsIDB4ZjgsIDB4MDYsIDB4ZTAsIDB4MzIsIDB4MmIsIDB4MDgsIDB4ZDEsIDB4OGIsIDB4NzAsIDB4MDEsIDB4MWMsIAorMHgxMCwgMHgxYywgMHgwMCwgMHhmMCwgMHgzYywgMHhmOCwgMHgzOCwgMHgxYywgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDIwLCAweDg4LCAweDcwLCAweGY5LCAweGU3LCAweDkwLCAweGI0LCAweGNhLCAweDFkLCAKKzB4ZjksIDB4MzIsIDB4MzMsIDB4MjcsIDB4Y2MsIDB4MWQsIDB4ZmYsIDB4MzQsIDB4NGEsIDB4MzQsIDB4ZDMsIDB4NmEsIAorMHhjMCwgMHg0NiwgMHhhNywgMHg3MCwgMHhmZiwgMHgzMSwgMHg0MSwgMHgzMSwgMHgwNywgMHg2YywgMHhjMCwgMHg0NiwgCisweDRmLCAweDYxLCAweGZiLCAweDE4LCAweDM5LCAweDFjLCAweDlmLCAweDFlLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4ZmMsIDB4MWMsIDB4MjMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MWIsIDB4MDYsIDB4MWIsIDB4MGUsIDB4OWIsIDB4MDAsIAorMHgxYiwgMHgwNCwgMHgxYiwgMHgwYywgMHhjOSwgMHgxOCwgMHgwOCwgMHgzMSwgMHgwMSwgMHg2NCwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweGI5LCAweDFjLCAweDE5LCAweDQzLCAweDA5LCAweDY4LCAweDM0LCAweDMwLCAweDAxLCAweDc2LCAKKzB4ZjgsIDB4MWQsIDB4MDEsIDB4MzAsIDB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIDB4MDAsIDB4MDQsIDB4YjksIDB4MWQsIAorMHgxOSwgMHg0MywgMHhkMCwgMHg2MywgMHgwOSwgMHg2OCwgMHgwOSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwOCwgMHg0MywgCisweGQwLCAweDYzLCAweDkwLCAweGJjLCAweDcwLCAweDQ3LCAweGIwLCAweGI1LCAweGNhLCAweDFkLCAweGY5LCAweDMyLCAKKzB4YzUsIDB4MWQsIDB4MmQsIDB4MzUsIDB4MzIsIDB4MjAsIDB4Y2YsIDB4MWQsIAorMHhmZiwgMHgzNywgMHg0YSwgMHgzNywgMHhkMywgMHg2YSwgMHhjMCwgMHg0NiwgMHhiOCwgMHg3MCwgMHhjYywgMHgxZCwgCisweGZmLCAweDM0LCAweDNhLCAweDM0LCAweGU4LCAweDY4LCAweGMwLCAweDQ2LCAweDYwLCAweDYxLCAweDEwLCAweDMwLCAKKzB4ZTgsIDB4NjAsIDB4NjAsIDB4NjksIDB4YzAsIDB4MTgsIDB4ODcsIDB4MWUsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHgzOCwgMHgxZCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHgwMCwgMHgwNCwgMHhiOSwgMHgxYywgMHgxOSwgMHg0MywgCisweGQwLCAweDYzLCAweDA5LCAweDY4LCAweDA5LCAweDA0LCAweDA5LCAweDBjLCAweDA4LCAweDQzLCAweGQwLCAweDYzLCAKKzB4ZjgsIDB4MWQsIDB4MDMsIDB4MzAsIDB4ZmYsIDB4ZjcsIDB4ZmMsIDB4ZmIsIDB4MjAsIDB4NjIsIDB4ZjgsIDB4MWQsIAorMHgwNywgMHgzMCwgMHhmZiwgMHhmNywgMHhmNywgMHhmYiwgMHg2MCwgMHg2MiwgMHgwMCwgMHgyMCwgMHgyOCwgMHg3NiwgCisweGIwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGY3LCAweGI1LCAweDgxLCAweGIwLCAweDAxLCAweDk4LCAKKzB4YzcsIDB4MWQsIDB4ZjksIDB4MzcsIDB4YjgsIDB4NmEsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDQsIDB4MWQsIAorMHgwNSwgMHgzNCwgMHgyMywgMHg0MywgMHgxYywgMHg2OCwgMHhmZiwgMHgyMywgMHhmZSwgMHgzMywgMHgyMywgMHg0MCwgCisweDdmLCAweDZiLCAweDNmLCAweDA0LCAweDNiLCAweDQzLCAweDBiLCAweDYwLCAweDM0LCAweDMwLCAweDFjLCAweDFjLCAKKzB4ODAsIDB4MjMsIDB4MjMsIDB4NDAsIDB4MDEsIDB4OWYsIDB4ZmYsIDB4MzcsIDB4NDEsIDB4MzcsIDB4MDAsIDB4MmIsIAorMHgzYywgMHhkMCwgMHgwYywgMHgyMywgMHgwMCwgMHg5MywgMHgwMCwgMHgyMywgMHg5ZCwgMHgwMCwgMHhhZSwgMHgxOCwgCisweDM2LCAweDY5LCAweDZkLCAweDE4LCAweDZlLCAweDYxLCAweDAxLCAweDMzLCAweDA1LCAweDJiLCAweGY3LCAweGQzLCAKKzB4MDAsIDB4MjMsIDB4OWQsIDB4MDAsIDB4YWUsIDB4MTgsIDB4NzYsIDB4NmEsIDB4NmQsIDB4MTgsIDB4YWUsIDB4NjIsIAorMHgwMSwgMHgzMywgMHgwNSwgMHgyYiwgMHhmNywgMHhkMywgMHgwMSwgMHg5YiwgMHhmZiwgMHgzMywgMHg1MSwgMHgzMywgCisweDliLCAweDc4LCAweDMzLCAweDJiLCAweDBlLCAweGQxLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweGM1LCAweDFkLCAKKzB4MDEsIDB4MzUsIDB4MmIsIDB4NDMsIDB4MWIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4NGIsIDB4ODEsIDB4MDEsIDB4MjMsIAorMHg5YiwgMHgwNywgMHhjNSwgMHgxZCwgMHgwZCwgMHgzNSwgMHgyYiwgMHg0MywgMHgxYiwgMHg2OCwgMHgxNiwgMHhlMCwgCisweDdiLCAweDY5LCAweGMwLCAweDQ2LCAweDRiLCAweDgxLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweGM1LCAweDFkLCAKKzB4MGQsIDB4MzUsIDB4MmIsIDB4NDMsIDB4MWIsIDB4NjgsIDB4N2QsIDB4NjksIDB4NWQsIDB4MWIsIDB4MDEsIDB4MjMsIAorMHg5YiwgMHgwNywgMHhjNiwgMHgxZCwgMHgwMSwgMHgzNiwgMHgzMywgMHg0MywgMHgxYiwgMHg2OCwgMHhlYiwgMHgxOCwgCisweDBjLCAweDNiLCAweDAyLCAweGUwLCAweDAwLCAweDIzLCAweDAwLCAweDkzLCAweDRiLCAweDgxLCAweGNiLCAweDgwLCAKKzB4NjMsIDB4MDksIDB4NDksIDB4ZDMsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4YzQsIDB4MWQsIDB4MDUsIDB4MzQsIAorMHgyMywgMHg0MywgMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwYiwgMHg4MSwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgCisweGM0LCAweDFkLCAweDBkLCAweDM0LCAweDIzLCAweDQzLCAweDFiLCAweDY4LCAweDBjLCAweDg5LCAweDFiLCAweDFiLCAKKzB4MDAsIDB4OWMsIDB4MWMsIDB4MWIsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MDgsIDB4MzAsIDB4MTgsIDB4NDMsIAorMHgwMCwgMHg2OCwgMHgyMCwgMHgxOCwgMHg4OCwgMHg4MCwgMHgzOCwgMHg2YSwgMHgwNCwgMHgwZSwgMHhmZiwgMHgyMywgCisweDFiLCAweDA0LCAweDAzLCAweDQwLCAweDFiLCAweDBhLCAweDFjLCAweDQzLCAweGZmLCAweDIzLCAweDFiLCAweDAyLCAKKzB4MDMsIDB4NDAsIDB4MWIsIDB4MDIsIDB4MjMsIDB4NDMsIDB4MDAsIDB4MDYsIDB4MTgsIDB4NDMsIDB4YzgsIDB4NjAsIAorMHg3OCwgMHg2YSwgMHgwNywgMHgwZSwgMHhmZiwgMHgyMywgMHgxYiwgMHgwNCwgMHgwMywgMHg0MCwgMHgxYiwgMHgwYSwgCisweDFmLCAweDQzLCAweGZmLCAweDIzLCAweDFiLCAweDAyLCAweDAzLCAweDQwLCAweDFiLCAweDAyLCAweDNiLCAweDQzLCAKKzB4MDAsIDB4MDYsIDB4MTgsIDB4NDMsIDB4MDgsIDB4NjEsIDB4ZDAsIDB4NmIsIDB4YzAsIDB4NDYsIDB4YzgsIDB4NjMsIAorMHg5MCwgMHg2YiwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2NCwgMHg1MCwgMHg2YywgMHhjMCwgMHg0NiwgMHg0OCwgMHg2NCwgCisweDEwLCAweDZjLCAweGMwLCAweDQ2LCAweDg4LCAweDY0LCAweGQwLCAweDZjLCAweGMwLCAweDQ2LCAweGM4LCAweDY0LCAKKzB4OTAsIDB4NmMsIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjUsIDB4MDIsIDB4ZTAsIDB4MDAsIDB4MjMsIDB4MGIsIDB4ODEsIAorMHg4YiwgMHg4MCwgMHgwNCwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgCisweDBmLCAweDRhLCAweDkzLCAweDg5LCAweDAxLCAweDMzLCAweDkzLCAweDgxLCAweGMyLCAweDFkLCAweGY5LCAweDMyLCAKKzB4MDQsIDB4MjMsIDB4OTAsIDB4NmEsIDB4YzAsIDB4NDYsIDB4YzMsIDB4NjAsIDB4MTAsIDB4MjMsIDB4ODMsIDB4NjEsIAorMHhjYiwgMHgwYSwgMHgwMSwgMHhkMywgMHgxOCwgMHgyMywgMHg4MywgMHg2MSwgMHhjMSwgMHg4MywgMHg1MSwgMHg2YiwgCisweGMwLCAweDQ2LCAweGMxLCAweDgxLCAweDUxLCAweDZiLCAweGMyLCAweDFkLCAweDM5LCAweDMyLCAweDUxLCAweDgzLCAKKzB4MDQsIDB4MjMsIDB4MDEsIDB4NjgsIDB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4MDEsIDB4ZjAsIDB4YzIsIDB4ZjgsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgCisweGIwLCAweGI1LCAweDFiLCAweDRjLCAweDIwLCAweDZhLCAweDAyLCAweDI4LCAweDFiLCAweGQyLCAweDAwLCAweDIwLCAKKzB4ZTcsIDB4MWQsIDB4MTksIDB4MzcsIDB4MzgsIDB4NzEsIDB4ZTEsIDB4NjgsIDB4ZTAsIDB4MWQsIDB4ZjksIDB4MzAsIAorMHgwMCwgMHgyOSwgMHgxNSwgMHhkMCwgMHg0MiwgMHg2YSwgMHgwMCwgMHgyYSwgMHgxMiwgMHhkMSwgMHgwMSwgMHgyNSwgCisweDBhLCAweGUwLCAweGZmLCAweGY3LCAweDg5LCAweGZiLCAweDAwLCAweDI4LCAweDA5LCAweGQxLCAweDIwLCAweDZhLCAKKzB4MDIsIDB4MjgsIDB4MDAsIDB4ZDMsIDB4M2QsIDB4NzEsIDB4ZTAsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MDIsIDB4ZDAsIAorMHgzOCwgMHg3OSwgMHgwMCwgMHgyOCwgMHhmMSwgMHhkMCwgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDQwLCAweDZhLCAweDAwLCAweDI4LCAweGY5LCAweGQxLCAweDAwLCAweDI5LCAweGY3LCAweGQxLCAweDYwLCAweDY5LCAKKzB4MDAsIDB4MjgsIDB4MDQsIDB4ZDAsIDB4MDYsIDB4NDgsIDB4MDAsIDB4NjgsIDB4MDMsIDB4ZjAsIDB4YTgsIDB4ZmMsIAorMHhlZiwgMHhlNywgMHg2MCwgMHg2OCwgMHgwMCwgMHgyOCwgMHhlYywgMHhkMCwgMHgwMCwgMHhmMCwgMHg1YSwgMHhmOCwgCisweGU5LCAweGU3LCAweDAwLCAweDAwLCAweDZjLCAweDA2LCAweDAwLCAweDgwLCAweDM0LCAweDA0LCAweDAwLCAweDgwLCAKKzB4YjAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4MjAsIDB4MjMsIDB4YjgsIDB4NjgsIDB4MTgsIDB4NDAsIDB4MDEsIDB4MjQsIAorMHgwMCwgMHgyNSwgMHgwMCwgMHgyOCwgMHgwYiwgMHhkMSwgMHgzOCwgMHg2YSwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMSwgCisweDI4LCAweDFjLCAweGIwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDFmLCAweDQ4LCAweDAxLCAweDZlLCAKKzB4MDEsIDB4MzEsIDB4MDEsIDB4NjYsIDB4MDMsIDB4ZTAsIDB4NDgsIDB4NjgsIDB4YzQsIDB4MjMsIDB4MTgsIDB4NDAsIAorMHgwMywgMHhkMSwgMHgzOCwgMHg2YSwgMHgwMCwgMHhmMCwgMHgwYywgMHhmYywgMHgyZiwgMHhlMCwgMHgzOCwgMHgxYywgCisweDAwLCAweGYwLCAweDFjLCAweGZjLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDdiLCAweGZhLCAweGI4LCAweDY4LCAKKzB4YzAsIDB4MDgsIDB4MDIsIDB4ZDMsIDB4MzgsIDB4NmEsIDB4MDAsIDB4ZjAsIDB4ZDEsIDB4ZmIsIDB4YjgsIDB4NjgsIAorMHgzOSwgMHg2YSwgMHhjMCwgMHg0NiwgMHg4OCwgMHg2MCwgMHgzOCwgMHg2YSwgMHhjMCwgMHg0NiwgMHhjNSwgMHg2MCwgCisweDEwLCAweDQ4LCAweDQxLCAweDY4LCAweDAwLCAweDI5LCAweDExLCAweGQxLCAweGMxLCAweDY4LCAweDAwLCAweDI5LCAKKzB4MDksIDB4ZDEsIDB4NDEsIDB4NjksIDB4MDAsIDB4MjksIDB4MDYsIDB4ZDEsIDB4MzksIDB4NmEsIDB4YzAsIDB4NDYsIAorMHg4MSwgMHg2MCwgMHg0MSwgMHg2MCwgMHgwMCwgMHhmMCwgMHgxNCwgMHhmOCwgMHgwYiwgMHhlMCwgMHgzOSwgMHg2YSwgCisweGMwLCAweDQ2LCAweDgxLCAweDYwLCAweDQxLCAweDYwLCAweDA2LCAweGUwLCAweDM5LCAweDZhLCAweDgyLCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4ZDEsIDB4NjAsIDB4MzksIDB4NmEsIDB4YzAsIDB4NDYsIDB4ODEsIDB4NjAsIDB4MjAsIDB4MWMsIAorMHhiZCwgMHhlNywgMHgwMCwgMHgwMCwgMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgCisweDkwLCAweGI1LCAweDBiLCAweDRjLCAweDY3LCAweDY4LCAweDAwLCAweDJmLCAweDBmLCAweGQwLCAweDM4LCAweDFjLCAKKzB4MDAsIDB4ZjAsIDB4MTIsIDB4ZjgsIDB4MDAsIDB4MjgsIDB4MGEsIDB4ZDEsIDB4NjAsIDB4NjgsIDB4YzAsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHg2MCwgMHg2MCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHhjMywgMHhmYiwgMHgwMCwgMHgyMCwgCisweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAxLCAweDIwLCAweGZhLCAweGU3LCAweDAwLCAweDAwLCAKKzB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4ZmUsIDB4MWQsIDB4NDksIDB4MzYsIAorMHgzMCwgMHg3OCwgMHg0MCwgMHgwMCwgMHhjMCwgMHgxOSwgMHg4NSwgMHg4YiwgMHgzMywgMHg0YywgMHgzNCwgMHg0YiwgCisweDlkLCAweDQyLCAweDNjLCAweGQwLCAweDM4LCAweDFjLCAweDIxLCAweDFjLCAweDJhLCAweDFjLCAweDAwLCAweGYwLCAKKzB4MWQsIDB4ZjksIDB4MzEsIDB4NDgsIDB4ODAsIDB4NmEsIDB4NTgsIDB4MjEsIDB4NjksIDB4NDMsIDB4NDAsIDB4MTgsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgCisweDJjLCAweDRkLCAweDAxLCAweDI4LCAweDFhLCAweGQxLCAweDMwLCAweDc4LCAweGMwLCAweDE5LCAweGMxLCAweDFkLCAKKzB4MTksIDB4MzEsIDB4MDgsIDB4N2EsIDB4M2EsIDB4NjgsIDB4ODAsIDB4MTgsIDB4MDksIDB4N2IsIDB4ZWEsIDB4MWQsIAorMHgyMSwgMHgzMiwgMHgwMCwgMHhmMCwgMHhlMywgMHhmYywgMHgzMCwgMHg3OCwgMHhjMCwgMHgxOSwgMHgyMCwgMHgzMCwgCisweDAwLCAweDc5LCAweDM5LCAweDY4LCAweDQwLCAweDE4LCAweGMxLCAweDFkLCAweDA1LCAweDMxLCAweDAwLCAweDIwLCAKKzB4MDAsIDB4MjMsIDB4NDIsIDB4MDAsIDB4OGIsIDB4NTIsIDB4MDEsIDB4MzAsIDB4MDYsIDB4MjgsIDB4ZmEsIDB4ZDMsIAorMHhhMCwgMHg4OCwgMHg0MSwgMHgwNywgMHgwYiwgMHhkMSwgMHgyMSwgMHg4OSwgMHgwOSwgMHgxOCwgMHg3OCwgMHg2OCwgCisweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDgxLCAweDQyLCAweDA0LCAweGQ4LCAweDYxLCAweDg5LCAweGUyLCAweDg4LCAKKzB4ODksIDB4MTgsIDB4ODEsIDB4NDIsIDB4MDMsIDB4ZDksIDB4MDAsIDB4MjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgyMSwgMHgxYywgMHgxNCwgMHg0YSwgMHgwMCwgMHgyMCwgMHhmZSwgMHhmNywgMHg1YSwgMHhmZiwgCisweDAxLCAweDIyLCAweDUyLCAweDA0LCAweDc4LCAweDY4LCAweDAyLCAweDQzLCAKKzB4MDEsIDB4MjAsIDB4MzksIDB4NjgsIDB4ZmUsIDB4ZjcsIDB4NTIsIDB4ZmYsIDB4MDEsIDB4MjIsIDB4NTIsIDB4MDQsIAorMHg3OCwgMHg2OCwgMHgwMiwgMHg0MywgMHgwMCwgMHgyMCwgMHgzOSwgMHg2OCwgMHhmZSwgMHhmNywgMHg0YSwgMHhmZiwgCisweDBiLCAweDQ5LCAweDBjLCAweDRhLCAweDAxLCAweDIwLCAweGZlLCAweGY3LCAweDQ1LCAweGZmLCAweDAxLCAweDIwLCAKKzB4ZTksIDB4MWQsIDB4MTksIDB4MzEsIDB4NDgsIDB4NzEsIDB4MDIsIDB4MjEsIDB4ZWEsIDB4MWQsIDB4ZjksIDB4MzIsIAorMHg1MSwgMHg2MiwgMHhkOSwgMHhlNywgMHgyOCwgMHhhYywgMHgyMCwgMHg0MCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgCisweDRjLCAweDJhLCAweDAwLCAweDgwLCAweDZjLCAweDA2LCAweDAwLCAweDgwLCAweDU0LCAweDAwLCAweDAzLCAweDAwLCAKKzB4MTQsIDB4YWMsIDB4MjAsIDB4NDAsIDB4MTQsIDB4MDAsIDB4MDcsIDB4MDAsIDB4ZjAsIDB4YjUsIDB4ODMsIDB4YjAsIAorMHgwMCwgMHgyMSwgMHg0ZiwgMHg0OCwgMHhjMiwgMHgxZCwgMHhmOSwgMHgzMiwgMHg1MSwgMHg2MiwgMHgwMSwgMHgyMSwgCisweGM5LCAweDA0LCAweDRkLCAweDRhLCAweGMwLCAweDQ2LCAweDExLCAweDYwLCAweGMxLCAweDFkLCAweDE5LCAweDMxLCAKKzB4NDksIDB4NzksIDB4MDAsIDB4MjksIDB4MDQsIDB4ZDEsIDB4NGEsIDB4NDgsIDB4MDAsIDB4NjgsIDB4MDMsIDB4ZjAsIAorMHg5YiwgMHhmYiwgMHg4NywgMHhlMCwgMHg0NSwgMHg0OCwgMHg0NywgMHg2OCwgMHhmYywgMHgxZCwgMHg0OSwgMHgzNCwgCisweDIxLCAweDc4LCAweDQ4LCAweDAwLCAweGMwLCAweDE5LCAweDgwLCAweDhiLCAweDQ0LCAweDRhLCAweDkyLCAweDZhLCAKKzB4NTgsIDB4MjMsIDB4NTgsIDB4NDMsIDB4MTUsIDB4MTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZWEsIDB4MWQsIAorMHgwNSwgMHgzMiwgMHgxYSwgMHg0MywgMHgxMiwgMHg2OCwgMHgwOCwgMHgzNSwgMHgyYiwgMHg0MywgMHgxZCwgMHg2OCwgCisweGZmLCAweDIzLCAweDFiLCAweDAyLCAweDJiLCAweDQwLCAweDFiLCAweDBhLCAweDNjLCAweDRkLCAweDAxLCAweDJiLCAKKzB4MjQsIDB4ZDEsIDB4YzgsIDB4MTksIDB4YzEsIDB4MWQsIDB4MTksIDB4MzEsIDB4MDgsIDB4N2EsIDB4M2EsIDB4NjgsIAorMHg4MCwgMHgxOCwgMHgzOSwgMHg0YSwgMHgwOSwgMHg3YiwgMHgwMCwgMHhmMCwgMHhjNSwgMHhmYywgMHgyMCwgMHg3OCwgCisweGMwLCAweDE5LCAweDIwLCAweDMwLCAweDAwLCAweDc5LCAweDM5LCAweDY4LCAweDQxLCAweDE4LCAweDAwLCAweDIwLCAKKzB4ODIsIDB4MDAsIDB4NTMsIDB4MTksIDB4OWIsIDB4NmUsIDB4NmUsIDB4NDYsIDB4YjMsIDB4NTAsIDB4MDEsIDB4MzAsIAorMHgwMywgMHgyOCwgMHhmNywgMHhkMywgMHhjYSwgMHgxZCwgMHgwNSwgMHgzMiwgMHg2OSwgMHg0NiwgMHgwMCwgMHgyMCwgCisweDQzLCAweDAwLCAweGNkLCAweDVhLCAweGMwLCAweDQ2LCAweGQ1LCAweDUyLCAweDAxLCAweDMwLCAweDA2LCAweDI4LCAKKzB4ZjgsIDB4ZDMsIDB4MmQsIDB4ZTAsIDB4MDIsIDB4MmIsIDB4MmIsIDB4ZDEsIDB4MTEsIDB4MGEsIDB4MjksIDB4ZDMsIAorMHgwMCwgMHgyMSwgMHg4YSwgMHgwMCwgMHg1MywgMHgxOSwgMHg5YiwgMHg2ZSwgMHg2ZSwgMHg0NiwgMHhiMywgMHg1MCwgCisweDAxLCAweDMxLCAweDAzLCAweDI5LCAweGY3LCAweGQzLCAweDIxLCAweDc4LCAweDQ5LCAweDAwLCAweGM5LCAweDE5LCAKKzB4MDksIDB4OGYsIDB4M2EsIDB4NjgsIDB4OGIsIDB4MTgsIDB4NmEsIDB4NDYsIDB4MDAsIDB4MjEsIDB4NGQsIDB4MDAsIAorMHg1NiwgMHg1YiwgMHhjMCwgMHg0NiwgMHg1ZSwgMHg1MywgMHgwMSwgMHgzMSwgMHgwNiwgMHgyOSwgMHhmOCwgMHhkMywgCisweDE5LCAweDQ5LCAweDhhLCAweDZhLCAweDEzLCAweDE4LCAweDFhLCAweDZkLCAweDAwLCAweDlkLCAweDU1LCAweDQwLCAKKzB4MTksIDB4NGEsIDB4ZDYsIDB4NjgsIDB4NzUsIDB4NDAsIDB4MWQsIDB4NjUsIDB4ODksIDB4NmEsIDB4MDgsIDB4MTgsIAorMHg0MSwgMHg2ZCwgMHgwMiwgMHg5YiwgMHg1OSwgMHg0MCwgMHg5MiwgMHg2OSwgMHg1MSwgMHg0MCwgMHg0MSwgMHg2NSwgCisweDIwLCAweDc4LCAweDQxLCAweDFlLCAweDIxLCAweDcwLCAweDAwLCAweDI4LCAweDBkLCAweGQwLCAweDM4LCAweDFjLCAKKzB4ZmYsIDB4ZjcsIDB4ZjQsIDB4ZmUsIDB4MDAsIDB4MjgsIDB4MGQsIDB4ZDEsIDB4MDgsIDB4NGEsIDB4NTAsIDB4NjgsIAorMHhjMCwgMHg2OCwgMHhjMCwgMHg0NiwgMHg1MCwgMHg2MCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHhhNCwgMHhmYSwgCisweDAyLCAweGUwLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDczLCAweGZhLCAweDAxLCAweGYwLCAweGRlLCAweGZhLCAKKzB4MDMsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHgzOCwgMHgwNCwgMHgwMCwgMHg4MCwgMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgCisweGFjLCAweGFiLCAweDIwLCAweDQwLCAweDk0LCAweDA2LCAweDAwLCAweDgwLCAweDA4LCAweDgzLCAweDIwLCAweDQwLCAKKzB4ZjAsIDB4YjUsIDB4ODIsIDB4YjAsIDB4NjksIDB4NGIsIDB4OWYsIDB4NmEsIDB4NTgsIDB4MjMsIDB4NWEsIDB4NDMsIAorMHhiYSwgMHgxOCwgMHhjMywgMHgxZCwgMHg0OSwgMHgzMywgMHgxZiwgMHg3OCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgCisweGQ0LCAweDFkLCAweDAxLCAweDM0LCAweDIzLCAweDQzLCAweDFkLCAweDY4LCAweDQzLCAweDY4LCAweDFjLCAweDA0LCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDYsIDB4MWQsIDB4MDUsIDB4MzYsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIAorMHgxYywgMHg0MywgMHg0MiwgMHgyMywgMHgxYywgMHg0MywgMHgwYywgMHg2MCwgMHhmZiwgMHgyNiwgMHgzNiwgMHgwMiwgCisweDJlLCAweDQwLCAweDAxLCAweDIzLCAweDViLCAweDAyLCAweDllLCAweDQyLCAweDc0LCAweGQxLCAweDZiLCAweDBjLCAKKzB4MmIsIDB4ZDMsIDB4YzMsIDB4MTksIDB4MjAsIDB4MzMsIDB4MWIsIDB4NzksIAorMHhjMCwgMHg0NiwgMHg0YiwgMHg4MSwgMHg3YiwgMHgwMCwgMHgxYiwgMHgxOCwgMHgxYiwgMHg4ZiwgMHg0YywgMHg4OSwgCisweDFiLCAweDFiLCAweGNiLCAweDgwLCAweDAwLCAweDI0LCAweGE2LCAweDAwLCAweDAxLCAweDk2LCAweGIzLCAweDE4LCAKKzB4ZGUsIDB4MWQsIDB4MDksIDB4MzYsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIAorMHgwMSwgMHg5ZSwgMHg3NiwgMHgxOCwgMHg3MywgMHg2MSwgMHgwMSwgMHgzNCwgMHgwNSwgMHgyYywgMHhmMCwgMHhkMywgCisweDAwLCAweDI0LCAweGE2LCAweDAwLCAweDAwLCAweDk2LCAweGIzLCAweDE4LCAweGRlLCAweDFkLCAweDFkLCAweDM2LCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MDAsIDB4OWUsIDB4NzYsIDB4MTgsIAorMHhiMywgMHg2MiwgMHgwMSwgMHgzNCwgMHgwNSwgMHgyYywgMHhmMCwgMHhkMywgMHgwNiwgMHhlMCwgMHgwMCwgMHgyMywgCisweDRiLCAweDgxLCAweGNiLCAweDgwLCAweDQwLCAweDIzLCAweDljLCAweDQzLCAweDBjLCAweDYwLCAweDIzLCAweDFjLCAKKzB4NmIsIDB4MGUsIDB4NGEsIDB4ZDMsIDB4YzMsIDB4MTksIDB4MjAsIDB4MzMsIDB4MWIsIDB4NzksIDB4MTAsIDB4MzMsIAorMHgwYiwgMHg4MSwgMHg3YiwgMHgwMCwgMHgxYiwgMHgxOCwgMHgxYiwgMHg4ZiwgMHgwZiwgMHg4OSwgMHhkYiwgMHgxYiwgCisweDhiLCAweDgwLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweGQ0LCAweDFkLCAweDM1LCAweDM0LCAweDIzLCAweDQzLCAKKzB4MWIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4Y2IsIDB4NjMsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDQsIDB4MWQsIAorMHgzMSwgMHgzNCwgMHgyMywgMHg0MywgMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwYiwgMHg2NCwgMHhhYiwgMHgwZSwgCisweDIxLCAweGQyLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweGQ0LCAweDFkLCAweDNkLCAweDM0LCAweDIzLCAweDQzLCAKKzB4MWIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4NGIsIDB4NjQsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDQsIDB4MWQsIAorMHgzOSwgMHgzNCwgMHgyMywgMHg0MywgMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHg4YiwgMHg2NCwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweGQ0LCAweDFkLCAweDQ1LCAweDM0LCAweDIzLCAweDQzLCAweDFiLCAweDY4LCAweGMwLCAweDQ2LCAKKzB4Y2IsIDB4NjQsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDQsIDB4MWQsIDB4NDEsIDB4MzQsIDB4MjMsIDB4NDMsIAorMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwYiwgMHg2NSwgMHgwMCwgMHhlMCwgMHgwZiwgMHhlMCwgMHhmYiwgMHgxZiwgCisweDAxLCAweDNiLCAweDFiLCAweDA0LCAweDFiLCAweDBjLCAweDA3LCAweDY4LCAweGZmLCAweDE4LCAweDAzLCAweDY5LCAKKzB4MDgsIDB4MWMsIDB4MzksIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MzQsIDB4ZjgsIDB4MmMsIDB4ZTAsIDB4MDAsIDB4MjMsIAorMHgwYiwgMHg4MSwgMHg4YiwgMHg4MCwgMHgyOCwgMHhlMCwgMHgwMCwgMHgyMywgMHg4YiwgMHg4MCwgMHgwYiwgMHg4MSwgCisweGMzLCAweDE5LCAweDIwLCAweDMzLCAweDFiLCAweDdhLCAweGMwLCAweDQ2LCAweDRiLCAweDgxLCAweDdiLCAweDAwLCAKKzB4MTgsIDB4MTgsIDB4MDAsIDB4OGUsIDB4YzAsIDB4NDYsIDB4YzgsIDB4ODAsIDB4MDAsIDB4MjAsIDB4ODcsIDB4MDAsIAorMHhiYiwgMHgxOCwgMHhkYywgMHgxZCwgMHgwOSwgMHgzNCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgyMywgMHg0MywgCisweDFiLCAweDY4LCAweDdmLCAweDE4LCAweDdiLCAweDYxLCAweDAxLCAweDMwLCAweDA1LCAweDI4LCAweGYyLCAweGQzLCAKKzB4MDAsIDB4MjAsIDB4ODcsIDB4MDAsIDB4YmIsIDB4MTgsIDB4ZGMsIDB4MWQsIDB4MWQsIDB4MzQsIDB4MDEsIDB4MjMsIAorMHg5YiwgMHgwNywgMHgyMywgMHg0MywgMHgxYiwgMHg2OCwgMHg3ZiwgMHgxOCwgMHhiYiwgMHg2MiwgMHgwMSwgMHgzMCwgCisweDA1LCAweDI4LCAweGYyLCAweGQzLCAweDAyLCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4NGMsIDB4MmEsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjQsIDB4MWYsIDB4MWMsIDB4M2IsIDB4MGMsIDB4MTgsIDB4ZDIsIAorMHgxNywgMHg2ZCwgMHgxMSwgMHg0YiwgMHhjMCwgMHg0NiwgMHhkZiwgMHg2MCwgMHg1MiwgMHg2ZCwgMHhjMCwgMHg0NiwgCisweDFhLCAweDYxLCAweGM3LCAweDYwLCAweDFhLCAweDY5LCAweGMwLCAweDQ2LCAweDAyLCAweDYxLCAweGQ4LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDgsIDB4ODAsIDB4ZDgsIDB4NjgsIDB4MDAsIDB4MGMsIDB4NDgsIDB4ODAsIDB4MTgsIDB4NjksIAorMHhjMCwgMHg0NiwgMHg4OCwgMHg4MCwgMHgxOCwgMHg2OSwgMHgwMCwgMHgwYywgMHhjOCwgMHg4MCwgMHg4MCwgMHhiYywgCisweDcwLCAweDQ3LCAweDRhLCAweDg4LCAweDEyLCAweDA0LCAweDBiLCAweDg4LCAweDFhLCAweDQzLCAweGMyLCAweDYwLCAKKzB4OGEsIDB4ODgsIDB4YzksIDB4ODgsIDB4MDksIDB4MDQsIDB4MTEsIDB4NDMsIDB4MDEsIDB4NjEsIDB4ZjIsIDB4ZTcsIAorMHgyYywgMHgwNywgMHgwMCwgMHg4MCwgMHhmMSwgMHhiNSwgMHg4OCwgMHhiMCwgMHgwMCwgMHgyMiwgMHgwOCwgMHg5OCwgCisweDAwLCAweDZhLCAweDA4LCAweDliLCAweDk5LCAweDY4LCAweDQ5LCAweDBhLCAweDAyLCAweGQzLCAweDAxLCAweDI3LCAKKzB4ZmYsIDB4MDMsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4MjcsIDB4MDMsIDB4OGIsIDB4MDAsIDB4MmIsIDB4MTksIDB4ZDAsIAorMHhhMywgMHg0OSwgMHg4OSwgMHg2YSwgMHgxYywgMHgxYywgMHg1OCwgMHgyMywgMHg2MywgMHg0MywgMHhjOSwgMHgxOCwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweDU4LCAweDM5LCAweDE5LCAweDQzLCAweDA5LCAweDY4LCAweDA5LCAweDA0LCAKKzB4MDksIDB4MGMsIDB4MDIsIDB4MjksIDB4MDIsIDB4ZDEsIDB4MDgsIDB4MjMsIDB4MWYsIDB4NDMsIDB4MDcsIDB4ZTAsIAorMHg0MSwgMHg4YiwgMHgwMCwgMHgyOSwgMHgwMiwgMHhkMCwgMHgwYywgMHgyMywgCisweDFmLCAweDQzLCAweDAxLCAweGUwLCAweDA0LCAweDIzLCAweDFmLCAweDQzLCAweDgzLCAweDhhLCAweDAwLCAweDJiLCAKKzB4MTgsIDB4ZDAsIDB4OTUsIDB4NDksIDB4ODksIDB4NmEsIDB4MWMsIDB4MWMsIDB4NTgsIDB4MjMsIDB4NjMsIDB4NDMsIAorMHhjOSwgMHgxOCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHg1OCwgMHgzOSwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgCisweDA5LCAweDA0LCAweDA5LCAweDBjLCAweDAyLCAweDI5LCAweDAxLCAweGQxLCAweDBmLCAweDQzLCAweDA3LCAweGUwLCAKKzB4YzEsIDB4OGEsIDB4MDAsIDB4MjksIDB4MDIsIDB4ZDAsIDB4MDMsIDB4MjMsIDB4MWYsIDB4NDMsIDB4MDEsIDB4ZTAsIAorMHgwMSwgMHgyMywgMHgxZiwgMHg0MywgMHhjMSwgMHgxZCwgMHgzOSwgMHgzMSwgMHgwNywgMHg5MSwgMHg0YiwgMHg4OSwgCisweDBjLCAweDg5LCAweDFjLCAweDE5LCAweDI0LCAweDA0LCAweDI0LCAweDBjLCAweDA4LCAweDlkLCAweDJkLCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDEsIDB4OTUsIDB4YzksIDB4ODgsIDB4N2QsIDB4MDgsIDB4MWEsIDB4ZDMsIDB4MWEsIDB4MWMsIAorMHhjMywgMHgxZCwgMHgxOSwgMHgzMywgMHgxYSwgMHg3MiwgMHgwNywgMHg5YSwgMHg5MiwgMHg4OSwgMHhjMCwgMHg0NiwgCisweDFhLCAweDczLCAweDA3LCAweDlhLCAweDEyLCAweDg5LCAweGMwLCAweDQ2LCAweDAyLCAweDg2LCAweDA0LCAweDg3LCAKKzB4ODIsIDB4OGEsIDB4MDEsIDB4M2EsIDB4ODIsIDB4ODMsIDB4MDEsIDB4MjIsIDB4MTksIDB4NzEsIDB4MDgsIDB4OWIsIAorMHgxYiwgMHg2OCwgMHg1YiwgMHgxOCwgMHg1YiwgMHg3OCwgMHg5YiwgMHgwMCwgMHgxYiwgMHgwNCwgMHgxYiwgMHgwYywgCisweDA4LCAweDMzLCAweDU5LCAweDE4LCAweGJiLCAweDA4LCAweDQ3LCAweGQzLCAweDA3LCAweDliLCAweDViLCAweDg5LCAKKzB4ODUsIDB4MTgsIDB4MDYsIDB4OTUsIDB4MjAsIDB4MzUsIDB4MmIsIDB4NzIsIDB4MDcsIDB4OWIsIDB4OWIsIDB4ODksIAorMHhjMCwgMHg0NiwgMHgyYiwgMHg3MywgMHgwNywgMHg5YiwgMHgxYiwgMHg4OSwgMHgyZSwgMHgxYywgMHg1NSwgMHgwMCwgCisweDJkLCAweDE4LCAweDA1LCAweDk1LCAweDJiLCAweDg2LCAweDAwLCAweDJhLCAweDAxLCAweGQwLCAweGMzLCAweDhhLCAKKzB4MDAsIDB4ZTAsIDB4ODMsIDB4OGEsIDB4MDEsIDB4M2IsIDB4MDUsIDB4OWQsIDB4YzAsIDB4NDYsIDB4YWIsIDB4ODMsIAorMHgzMSwgMHg3MSwgMHg2NSwgMHg0YiwgMHg5ZCwgMHg2YSwgMHgwNSwgMHg5YiwgMHg5ZSwgMHg4YiwgMHg1OCwgMHgyMywgCisweDczLCAweDQzLCAweGViLCAweDE4LCAweGRkLCAweDFkLCAweDAxLCAweDM1LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4MmIsIDB4NDMsIDB4MWQsIDB4NjgsIDB4MmIsIDB4MGUsIDB4NWIsIDB4MDYsIDB4MDEsIDB4ZDEsIDB4MDgsIDB4MzEsIAorMHgwMCwgMHhlMCwgMHgxMCwgMHgzMSwgMHg4MSwgMHgyMywgMHg1YiwgMHgwMiwgMHgxZCwgMHg0MCwgMHg5ZCwgMHg0MiwgCisweDAzLCAweGQxLCAweGUzLCAweDFmLCAweDA1LCAweDNiLCAweDFjLCAweDA0LCAweDI0LCAweDBjLCAweDA1LCAweDliLCAKKzB4YzAsIDB4NDYsIDB4MWMsIDB4ODcsIDB4MDgsIDB4OWIsIDB4MWIsIDB4NjgsIDB4MWIsIDB4MTksIDB4MTAsIDB4M2IsIAorMHg5YiwgMHg3YiwgMHgwNiwgMHg5ZCwgMHg0MCwgMHgzNSwgMHgyYiwgMHg3MCwgMHgyYiwgMHg3OCwgMHgwMiwgMHgzMywgCisweGUzLCAweDFhLCAweDFjLCAweDA0LCAweDI0LCAweDBjLCAweDAxLCAweDMyLCAweGJiLCAweDA4LCAweDliLCAweDA3LCAKKzB4NmQsIDB4ZDAsIDB4ODMsIDB4MTgsIDB4MjAsIDB4MzMsIDB4MDQsIDB4OTMsIDB4MTksIDB4NzIsIDB4MDEsIDB4OWIsIAorMHg1ZCwgMHgxOCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgyYiwgMHg0MywgMHgxYiwgMHg2OCwgMHgxYiwgMHgwNywgCisweDFiLCAweDBmLCAweDliLCAweDAwLCAweDA0LCAweDllLCAweGMwLCAweDQ2LCAweDMzLCAweDczLCAweDAwLCAweDk1LCAKKzB4MmIsIDB4NzgsIDB4MWIsIDB4MDcsIDB4MWIsIDB4MGYsIDB4OWIsIDB4MDAsIDB4MDQsIDB4OWQsIDB4YzAsIDB4NDYsIAorMHgyYiwgMHg3MywgMHgwMCwgMHg5ZCwgMHhlYiwgMHg3OCwgMHhhZCwgMHg3OCwgMHgxYiwgMHgwMiwgMHgxZCwgMHg0MywgCisweDJiLCAweDAyLCAweDJkLCAweDBhLCAweDJkLCAweDA2LCAweDJkLCAweDBlLCAweDJiLCAweDQzLCAweDU1LCAweDAwLCAKKzB4MmQsIDB4MTgsIDB4MmIsIDB4ODYsIDB4MDQsIDB4OWIsIDB4YzAsIDB4NDYsIDB4NTksIDB4NzIsIDB4MDQsIDB4OWIsIAorMHgxYiwgMHg3YiwgMHgyZSwgMHgxYywgMHgwNCwgMHg5ZCwgMHhjMCwgMHg0NiwgMHg2YiwgMHg3MywgMHgzMywgMHg4ZSwgCisweGMwLCAweDQ2LCAweDczLCAweDg2LCAweDAwLCAweDlkLCAweDJiLCAweDc4LCAweDFiLCAweDA3LCAweDFiLCAweDBmLCAKKzB4OWIsIDB4MDAsIDB4MWIsIDB4MDQsIDB4MWIsIDB4MGMsIDB4NTksIDB4MTgsIDB4MDQsIDB4MjUsIDB4M2QsIDB4NDAsIAorMHgwZSwgMHhkMCwgMHgzNCwgMHg4NywgMHgwMywgMHg4YiwgMHgwMSwgMHgzYiwgMHhiMywgMHg4MywgMHgxMywgMHgxYywgCisweDFiLCAweDE4LCAweDIwLCAweDMzLCAweDE5LCAweDcxLCAweDAxLCAweDliLCAweDViLCAweDE4LCAweDViLCAweDc4LCAKKzB4OWIsIDB4MDAsIDB4NTksIDB4MTgsIDB4MDgsIDB4MzEsIDB4MDEsIDB4MzIsIDB4M2IsIDB4MDksIDB4MzcsIDB4ZDMsIAorMHgwMCwgMHgyZCwgMHgwMSwgMHhkMCwgMHg0MywgMHg4YiwgMHgwMCwgMHhlMCwgMHgwMywgMHg4YiwgMHg1NSwgMHgwMCwgCisweDJkLCAweDE4LCAweDAxLCAweDNiLCAweGFiLCAweDgzLCAweDgzLCAweDE4LCAweDAzLCAweDkzLCAweDIwLCAweDMzLCAKKzB4MTksIDB4NzEsIDB4MjAsIDB4NGIsIDB4OWQsIDB4NmEsIDB4NTMsIDB4MDAsIDB4MWIsIDB4MTgsIDB4MDIsIDB4OTMsIAorMHg5ZSwgMHg4YiwgMHg1OCwgMHgyMywgMHg3MywgMHg0MywgMHhlYiwgMHgxOCwgMHhkZCwgMHgxZCwgMHgwMSwgMHgzNSwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweDJiLCAweDQzLCAweDFkLCAweDY4LCAKKzB4MmIsIDB4MGUsIDB4NWIsIDB4MDYsIDB4MDIsIDB4ZDEsIDB4MDgsIDB4MzEsIDB4MDEsIDB4ZTAsIDB4MTUsIDB4ZTAsIAorMHgxMCwgMHgzMSwgMHg4MSwgMHgyMywgMHg1YiwgMHgwMiwgMHgxZCwgMHg0MCwgMHg5ZCwgMHg0MiwgMHgwMywgMHhkMSwgCisweGUzLCAweDFmLCAweDA1LCAweDNiLCAweDFjLCAweDA0LCAweDI0LCAweDBjLCAweDAyLCAweDliLCAweGMwLCAweDQ2LCAKKzB4MWMsIDB4ODcsIDB4MDgsIDB4OWIsIDB4MWIsIDB4NjgsIDB4MWIsIDB4MTksIDB4MTAsIDB4M2IsIDB4OWIsIDB4N2IsIAorMHgwMywgMHg5YywgMHg0MCwgMHgzNCwgMHgyMywgMHg3MCwgMHgwMSwgMHgzMiwgMHgwNywgMHg5YiwgMHhjMCwgMHg0NiwgCisweGQ5LCAweDgwLCAweDUxLCAweDFlLCAweGMzLCAweDFkLCAweDQ5LCAweDMzLCAweDE5LCAweDcwLCAweDA3LCAweDYxLCAKKzB4MDQsIDB4MmEsIDB4MDYsIDB4ZDIsIDB4MDYsIDB4NDksIDB4NTMsIDB4MDAsIDB4MWIsIDB4MTgsIDB4OTksIDB4ODMsIAorMHgwMSwgMHgzMiwgMHgwNCwgMHgyYSwgMHhmOSwgMHhkMywgMHgwOSwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDRjLCAweDJhLCAweDAwLCAweDgwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAKKzB4NzAsIDB4NDcsIDB4ODAsIDB4YjUsIDB4OGMsIDB4YjAsIDB4MDcsIDB4MWMsIDB4MTIsIDB4NDgsIDB4MDEsIDB4NjgsIAorMHgwMSwgMHgzMSwgMHgwMSwgMHg2MCwgMHgzOCwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MCwgMHg3OCwgMHg2OCwgCisweGMwLCAweDQ2LCAweDAxLCAweDkwLCAweGI4LCAweDY4LCAweGMwLCAweDQ2LCAweDAyLCAweDkwLCAweDBkLCAweDQ4LCAKKzB4NDEsIDB4NjgsIDB4YzksIDB4NjgsIDB4YzAsIDB4NDYsIDB4NDEsIDB4NjAsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHg0ZiwgMHhmOCwgMHhiOCwgMHg2OCwgMHg0MCwgMHgwOSwgMHgwNiwgMHhkMywgMHgxMCwgMHgyMywgMHgwMiwgMHg5OCwgCisweDE4LCAweDQzLCAweDAyLCAweDkwLCAweDY4LCAweDQ2LCAweDAyLCAweGYwLCAweGUxLCAweGZmLCAweDY4LCAweDQ2LCAKKzB4MDIsIDB4ZjAsIDB4OWEsIDB4ZmUsIDB4MGMsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHg4YywgMHhiMCwgCisweDAxLCAweDY4LCAweGMwLCAweDQ2LCAweDAwLCAweDkxLCAweDQxLCAweDY4LCAweDA1LCAweDRiLCAweDE5LCAweDQzLCAKKzB4MDEsIDB4OTEsIDB4MDAsIDB4ZjAsIDB4MmYsIDB4ZjgsIDB4NjgsIDB4NDYsIDB4MDIsIDB4ZjAsIDB4ODQsIDB4ZmUsIAorMHgwYywgMHhiMCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhMCwgCisweDAyLCAweDZhLCAweDAzLCAweDY4LCAweGMwLCAweDQ2LCAweDEzLCAweDYwLCAweDQwLCAweDY4LCAweGMwLCAweDQ2LCAKKzB4NTAsIDB4NjAsIDB4NDAsIDB4MzIsIDB4NDgsIDB4NjgsIDB4YzAsIDB4NDYsIDB4OTAsIDB4ODAsIDB4YzgsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHhkMCwgMHg4MCwgMHg0OCwgMHg2OSwgMHhjMCwgMHg0NiwgMHgxMCwgMHg4MSwgMHg4OCwgMHg2OCwgCisweGMwLCAweDQ2LCAweDUwLCAweDgxLCAweDA4LCAweDdlLCAweGMwLCAweDQ2LCAweDkwLCAweDczLCAweDA4LCAweDY5LCAKKzB4YzAsIDB4NDYsIDB4OTAsIDB4ODEsIDB4NzAsIDB4NDcsIDB4MDQsIDB4NDksIDB4MDgsIDB4NjgsIDB4MDAsIDB4MjgsIAorMHgwMCwgMHhkMSwgMHg3MCwgMHg0NywgMHhjMiwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwYSwgMHg2MCwgMHhmYSwgMHhlNywgCisweDZjLCAweDA2LCAweDAwLCAweDgwLCAweDAyLCAweDQ5LCAweDBhLCAweDY4LCAweGMwLCAweDQ2LCAweGMyLCAweDYwLCAKKzB4MDgsIDB4NjAsIDB4NzAsIDB4NDcsIDB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIDB4YjAsIDB4YjQsIDB4MDAsIDB4MjIsIAorMHgxMiwgMHg0ZiwgMHg3YywgMHg3ZiwgMHgwMSwgMHgzNCwgMHg3YywgMHg3NywgMHgwMywgMHgyMywgMHhmYywgMHgxZCwgCisweDE5LCAweDM0LCAweDM4LCAweDYyLCAweDc5LCAweDYyLCAweDIzLCAweDcyLCAweDBlLCAweDRjLCAweDI1LCAweDY4LCAKKzB4NmIsIDB4MGMsIDB4MDUsIDB4ZDIsIDB4MjMsIDB4NjgsIDB4MWIsIDB4MGMsIDB4MTAsIDB4ZDEsIDB4MjQsIDB4NjgsIAorMHhhMywgMHgwYSwgMHgwZCwgMHhkMywgMHgwMSwgMHgyMywgMHgwYSwgMHg0ZiwgMHhjMCwgMHg0NiwgMHhmYiwgMHg2MiwgCisweDA5LCAweDRmLCAweDBhLCAweDRiLCAweGMwLCAweDQ2LCAweGRmLCAweDYwLCAweDk5LCAweDYwLCAweDU4LCAweDYwLCAKKzB4MTAsIDB4MWMsIDB4MTgsIDB4NjAsIDB4MDEsIDB4MzIsIDB4ZmIsIDB4ZTcsIDB4MTAsIDB4MWMsIDB4MzgsIDB4NjQsIAorMHgwMSwgMHgzMiwgMHhmYiwgMHhlNywgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgCisweGMwLCAweDAwLCAweDE4LCAweDAwLCAweDAyLCAweDgxLCAweDAwLCAweDAwLCAweDQwLCAweDAxLCAweDE4LCAweDAwLCAKKzB4ZjAsIDB4YjUsIDB4NDcsIDB4NGYsIDB4MzgsIDB4NjgsIDB4NDcsIDB4NGUsIDB4NDcsIDB4NGQsIDB4MDcsIDB4MjMsIAorMHg1YiwgMHgwMiwgMHhlYywgMHgxOCwgMHgwMCwgMHgyOCwgMHgxZCwgMHhkMSwgMHgyMCwgMHg2YiwgMHgwMSwgMHgzMCwgCisweDIwLCAweDYzLCAweDQ0LCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDQzLCAweDQ4LCAweDQxLCAweDY5LCAKKzB4MDAsIDB4MjksIDB4MTMsIDB4ZDAsIDB4YzEsIDB4MWQsIDB4NjksIDB4MzEsIDB4MDksIDB4N2IsIDB4MDAsIDB4MjksIAorMHgwZSwgMHhkMCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwMSwgMHg2ZCwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDgxLCAweDYxLCAweGMyLCAweDY5LCAweDkxLCAweDQyLCAweDA0LCAweGQwLCAweGYxLCAweDZjLCAKKzB4MDEsIDB4MzEsIDB4ZjEsIDB4NjQsIDB4MDEsIDB4ZjAsIDB4NTAsIDB4ZmUsIAorMHgzOCwgMHg2OCwgMHgwMSwgMHgyOCwgMHgxNywgMHhkMSwgMHgzNywgMHg0OCwgMHg0MSwgMHg2OSwgMHgwMCwgMHgyOSwgCisweDEzLCAweGQwLCAweGMxLCAweDFkLCAweDY5LCAweDMxLCAweDA5LCAweDdiLCAweDAwLCAweDI5LCAweDBlLCAweGQwLCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MDEsIDB4NmQsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIDB4YzAsIDB4NDYsIAorMHg4MSwgMHg2MSwgMHhjMiwgMHg2OSwgMHg5MSwgMHg0MiwgMHgwNCwgMHhkMCwgMHhmMSwgMHg2YywgMHgwMSwgMHgzMSwgCisweGYxLCAweDY0LCAweDAxLCAweGYwLCAweDM1LCAweGZlLCAweDM4LCAweDY4LCAweDAyLCAweDI4LCAweDJmLCAweGQxLCAKKzB4YmIsIDB4MjMsIDB4MWIsIDB4MDEsIDB4ZWUsIDB4MTgsIDB4NzAsIDB4N2IsIDB4MDAsIDB4MjgsIDB4MDMsIDB4ZDAsIAorMHgwMCwgMHgyMCwgMHg3MCwgMHg3MywgMHgwMCwgMHhmMCwgMHg0YSwgMHhmZCwgMHgzMCwgMHg3YiwgMHgwMCwgMHgyOCwgCisweDAyLCAweGQwLCAweDc4LCAweDY4LCAweDAyLCAweGYwLCAweGFhLCAweGZmLCAweDFiLCAweDIzLCAweGRiLCAweDAxLCAKKzB4ZTgsIDB4MTgsIDB4YzAsIDB4OGIsIDB4MDQsIDB4MjYsIDB4MDYsIDB4NDAsIDB4ZTAsIDB4NmEsIDB4YjAsIDB4NDIsIAorMHgxNCwgMHhkMCwgMHhmOCwgMHg2OCwgMHgwMSwgMHgzMCwgMHhmOCwgMHg2MCwgMHgxOSwgMHgyOCwgMHgxMSwgMHhkMywgCisweDFiLCAweDQ4LCAweDAxLCAweDdiLCAweDAwLCAweDI5LCAweDBkLCAweGQxLCAweGZmLCAweDMwLCAweDQxLCAweDMwLCAKKzB4NDAsIDB4NzgsIDB4MDAsIDB4MjgsIDB4MDgsIDB4ZDEsIDB4YjgsIDB4NjgsIDB4MDIsIDB4ZjAsIDB4OTAsIDB4ZmYsIAorMHgwMCwgMHgyMCwgMHhmOCwgMHg2MCwgMHhlNiwgMHg2MiwgMHgwMSwgMHhlMCwgMHgwMCwgMHgyMCwgMHhmOCwgMHg2MCwgCisweDM4LCAweDY4LCAweDAzLCAweDI4LCAweDBiLCAweGQxLCAweGVjLCAweDFkLCAweDc5LCAweDM0LCAweGUwLCAweDZiLCAKKzB4ODAsIDB4MDgsIDB4MDIsIDB4ZDMsIDB4MDIsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4MDcsIDB4ZmMsIDB4MDIsIDB4MjMsIAorMHhlMCwgMHg2YiwgMHg5OCwgMHg0MywgMHhlMCwgMHg2MywgMHgzOCwgMHg2OCwgMHgwMSwgMHgzMCwgMHgzOCwgMHg2MCwgCisweDAzLCAweDI4LCAweDAxLCAweGQ5LCAweDAwLCAweDIwLCAweDM4LCAweDYwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4M2MsIDB4MDQsIDB4MDAsIDB4ODAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg0MCwgMHgwMSwgMHgxOCwgMHgwMCwgMHg2NCwgMHgyZCwgMHgwMCwgMHg4MCwgCisweGU0LCAweDJjLCAweDAwLCAweDgwLCAweDI4LCAweDA1LCAweDAwLCAweDgwLCAweGIwLCAweGI0LCAweDFkLCAweDQ4LCAKKzB4ODQsIDB4OGEsIDB4MWQsIDB4NGEsIDB4MTMsIDB4OGEsIDB4YzEsIDB4MWQsIDB4MDksIDB4MzEsIDB4MDEsIDB4MjcsIAorMHg5YywgMHg0MiwgMHgwMywgMHhkMSwgMHg0MywgMHg4YSwgMHg1NCwgMHg4YSwgMHhhMywgMHg0MiwgMHgxMCwgMHhkMCwgCisweDBiLCAweDc4LCAweDAwLCAweDJiLCAweDBkLCAweGQwLCAweDRiLCAweDc4LCAweDAwLCAweDJiLCAweDBhLCAweGQwLCAKKzB4NDQsIDB4OGIsIDB4OTMsIDB4OGEsIDB4OWMsIDB4NDIsIDB4MDQsIDB4ZGMsIDB4MTMsIDB4NGIsIDB4YzAsIDB4NDYsIAorMHg1ZiwgMHg2MCwgMHg5NywgMHg4MiwgMHgwMSwgMHhlMCwgMHgwMSwgMHgzMywgMHg5MywgMHg4MiwgMHhjMywgMHg4YiwgCisweDVjLCAweDFjLCAweGM0LCAweDgzLCAweDg0LCAweDhiLCAweGEzLCAweDQyLCAweDBlLCAweGRiLCAweDg0LCAweDhhLCAKKzB4MDUsIDB4OGIsIDB4MDAsIDB4MjMsIDB4YWMsIDB4NDIsIDB4MDUsIDB4ZGEsIDB4NDQsIDB4OGEsIDB4YzUsIDB4OGEsIAorMHhhYywgMHg0MiwgMHgwMSwgMHhkYSwgMHg0YiwgMHg3MCwgMHgwMCwgMHhlMCwgMHg0ZiwgMHg3MCwgMHg0MywgMHg4MiwgCisweDgzLCAweDgyLCAweGMzLCAweDgzLCAweDQxLCAweDhhLCAweGMwLCAweDQ2LCAweDUxLCAweDgyLCAweDgwLCAweDhhLCAKKzB4YzAsIDB4NDYsIDB4MTAsIDB4ODIsIDB4YjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4ZTgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHgzYywgMHgwNCwgMHgwMCwgMHg4MCwgMHg0MCwgMHgwMSwgMHgxOCwgMHgwMCwgMHhmNywgMHhiNSwgMHg5MSwgMHhiMCwgCisweDZiLCAweDQ2LCAweDg0LCAweDFlLCAweDEyLCAweDk5LCAweDE0LCAweDI5LCAweDFhLCAweGQ5LCAweDAwLCAweDIwLCAKKzB4ODEsIDB4MDAsIDB4NjcsIDB4NTgsIDB4YzAsIDB4NDYsIDB4NTcsIDB4NTAsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDYsIAorMHgwMCwgMHgwZSwgMHgxMCwgMHgyOCwgMHhmNiwgMHhkMywgMHgwMCwgMHgyMSwgMHgwNSwgMHgyMCwgMHg4NywgMHgwMCwgCisweGQ2LCAweDU5LCAweDRmLCAweDFjLCAweDNkLCAweDA2LCAweDJkLCAweDBlLCAweDBmLCAweDFjLCAweGJmLCAweDAwLCAKKzB4ZGUsIDB4NTEsIDB4MjksIDB4MWMsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MGUsIDB4MTAsIDB4MjgsIAorMHhmMSwgMHhkMywgMHgwOSwgMHhlMCwgMHgwMCwgMHgyMCwgMHg4MSwgMHgwMCwgMHg2MywgMHg1OCwgMHhjMCwgMHg0NiwgCisweDUzLCAweDUwLCAweDAxLCAweDMwLCAweDAwLCAweDA2LCAweDAwLCAweDBlLCAweDA2LCAweDI4LCAweGY2LCAweGQzLCAKKzB4MDAsIDB4MjAsIDB4ZTAsIDB4NzAsIDB4MjAsIDB4NzIsIDB4NjAsIDB4NzIsIDB4YTAsIDB4NzIsIDB4MjAsIDB4NzMsIAorMHg2MCwgMHg3MywgMHgxMiwgMHg5OSwgMHgxNCwgMHgyOSwgMHgzNywgMHhkOSwgMHg2OSwgMHg0NiwgMHg4ZSwgMHgxYywgCisweDkxLCAweDc4LCAweDA5LCAweDA3LCAweDA5LCAweDBmLCAweDg5LCAweDAwLCAweDE0LCAweDM5LCAweDBkLCAweDA2LCAKKzB4MmQsIDB4MTYsIDB4MDAsIDB4MjcsIDB4MDAsIDB4MmQsIDB4MWIsIDB4ZGQsIDB4ZjAsIDB4MTksIDB4MTAsIDB4YTksIAorMHgwMCwgMHhmMCwgMHgzZCwgMHhmOCwgMHgwMCwgMHgyOCwgMHgwZSwgMHhkMCwgCisweDAwLCAweDIwLCAweDEwLCAweGE5LCAweDA5LCAweDc4LCAweDAwLCAweDI5LCAweDA5LCAweGRkLCAweDAwLCAweDIyLCAKKzB4MzksIDB4MTgsIDB4NzIsIDB4NTQsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MGUsIDB4MTAsIDB4YTksIAorMHgwOSwgMHg3OCwgMHg4OCwgMHg0MiwgMHhmNiwgMHhkYiwgMHgxMCwgMHhhOCwgMHgwMCwgMHg3OCwgMHgzOCwgMHgxOCwgCisweDA3LCAweDA2LCAweDNmLCAweDBlLCAweGFmLCAweDQyLCAweGUzLCAweGRiLCAweDY4LCAweDQ2LCAweGUyLCAweDFkLCAKKzB4MGQsIDB4MzIsIDB4MDAsIDB4MjEsIDB4YWIsIDB4MDgsIDB4NWYsIDB4MWMsIDB4MDgsIDB4ZDAsIDB4OGIsIDB4MDAsIAorMHhjNCwgMHg1OCwgMHhjMCwgMHg0NiwgMHhkNCwgMHg1MCwgMHgwMSwgMHgzMSwgMHgwOSwgMHgwNiwgMHgwOSwgMHgwZSwgCisweDhmLCAweDQyLCAweGY2LCAweGQ4LCAweDE0LCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4OTAsIDB4YjQsIDB4ODcsIDB4MWUsIDB4MDAsIDB4MjAsIDB4ODksIDB4MDgsIDB4NGIsIDB4MWMsIDB4MDgsIDB4ZDAsIAorMHg4MSwgMHgwMCwgMHg1NCwgMHg1OCwgMHhjMCwgMHg0NiwgMHg3YywgMHg1MCwgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNiwgCisweDAwLCAweDBlLCAweDgzLCAweDQyLCAweGY2LCAweGQ4LCAweDkwLCAweGJjLCAweDcwLCAweDQ3LCAweDgwLCAweGI0LCAKKzB4MDIsIDB4NzgsIDB4ZDIsIDB4MDYsIDB4ZDIsIDB4MGUsIDB4MDAsIDB4MjMsIDB4MDEsIDB4MjcsIDB4MDEsIDB4MmEsIAorMHgwMSwgMHhkYywgMHgwZiwgMHg3MCwgMHgxMSwgMHhlMCwgMHg0MCwgMHg3OCwgMHhjMCwgMHg0NiwgMHgwOCwgMHg3MCwgCisweDE0LCAweDJhLCAweDA0LCAweGQxLCAweDA4LCAweDQ4LCAweDAxLCAweDdhLCAweDAxLCAweDMxLCAweDAxLCAweDcyLCAKKzB4MDcsIDB4ZTAsIDB4MDIsIDB4MmEsIDB4MDUsIDB4ZDAsIDB4MDUsIDB4MmEsIDB4MDMsIDB4ZDAsIDB4MDYsIDB4MmEsIAorMHgwMSwgMHhkMCwgMHgxNSwgMHgyYSwgMHgwMiwgMHhkMSwgMHgxOCwgMHgxYywgMHg4MCwgMHhiYywgMHg3MCwgMHg0NywgCisweDM4LCAweDFjLCAweGZiLCAweGU3LCAweGUwLCAweDgyLCAweDIwLCAweDQwLCAweDAwLCAweGI1LCAweDBmLCAweDQ4LCAKKzB4MDEsIDB4MjMsIDB4MWIsIDB4MDYsIDB4NDEsIDB4NjksIDB4OTksIDB4NDMsIDB4MWEsIDB4MDksIDB4NDEsIDB4NjEsIAorMHhkMSwgMHg2MCwgMHgwMCwgMHgyMSwgMHhhMSwgMHgyMiwgMHg1MiwgMHgwMywgMHg5MSwgMHg2MSwgMHgxOSwgMHgxYywgCisweDA5LCAweDRhLCAweGMwLCAweDQ2LCAweDExLCAweDYwLCAweDFiLCAweDIzLCAweGRiLCAweDAxLCAweGMwLCAweDE4LCAKKzB4ODAsIDB4NjksIDB4MDAsIDB4MjgsIDB4MDMsIDB4ZDAsIDB4MDIsIDB4ZjAsIDB4NjEsIDB4ZmUsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwNCwgMHg0OCwgMHg0MSwgMHg4OCwgMHgwMSwgMHgzMSwgMHg0MSwgMHg4MCwgMHhmOCwgMHhlNywgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAweGUwLCAweDgyLCAweDIwLCAweDQwLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4YjUsIDB4ODYsIDB4YjAsIDB4OTUsIDB4NGEsIDB4ZDAsIDB4NjgsIAorMHhkNywgMHgxZCwgMHg3OSwgMHgzNywgMHgwMSwgMHgyOCwgMHgwOSwgMHhkMSwgMHgzOCwgMHg4OSwgMHgwMCwgMHgyOCwgCisweDA2LCAweGQxLCAweGQwLCAweDZmLCAweDAyLCAweDIzLCAweDAxLCAweDY4LCAweDk5LCAweDQzLCAweDAxLCAweDYwLCAKKzB4MTQsIDB4MjAsIDB4MzgsIDB4ODEsIDB4OGUsIDB4NGMsIDB4NjEsIDB4NmEsIDB4OGUsIDB4NDgsIDB4YzMsIDB4NmIsIAorMHg1OSwgMHgxOCwgMHhjMSwgMHg2MywgMHhhMCwgMHg2YSwgMHgxOSwgMHgyMywgMHhkYiwgMHgwMSwgMHhkNCwgMHgxOCwgCisweGEwLCAweDYyLCAweDIxLCAweDZhLCAweDA5LCAweDAzLCAweDA5LCAweDBiLCAweDgxLCAweDQyLCAweDA1LCAweGQxLCAKKzB4MDEsIDB4MjAsIDB4NDAsIDB4MDQsIDB4ODcsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4ZjMsIDB4ZTAsIAorMHhiYiwgMHg4YSwgMHg1OCwgMHgxYywgMHhiOCwgMHg4MiwgMHgzZCwgMHg4YiwgMHgwMSwgMHgyMCwgMHgwMCwgMHgyMSwgCisweGFiLCAweDQyLCAweDA0LCAweGRiLCAweGQzLCAweDFkLCAweDg5LCAweDMzLCAweDU4LCAweDcwLCAweGI5LCAweDgyLCAKKzB4ZjksIDB4ODMsIDB4MzMsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZDMsIDB4MTgsIDB4MDUsIDB4OTMsIDB4NWIsIDB4NjksIAorMHgwZiwgMHgyYiwgMHg3MywgMHhkMiwgMHgwMCwgMHgyMSwgMHg3YywgMHg0ZiwgMHhjMCwgMHg0NiwgMHgzOSwgMHg2MSwgCisweDIxLCAweDZhLCAweDhhLCAweDY4LCAweDEyLCAweDA0LCAweDEyLCAweDBjLCAweDRiLCAweDY4LCAweDFlLCAweDBjLCAKKzB4MzYsIDB4MDQsIDB4ZmQsIDB4MWYsIDB4MDksIDB4M2QsIDB4MDAsIDB4MmUsIDB4MDUsIDB4ZDEsIDB4M2IsIDB4MmEsIAorMHgwMywgMHhkMywgMHgwMSwgMHgyMywgMHhkYiwgMHgwMiwgMHg5YSwgMHg0MiwgMHgwMSwgMHhkOSwgMHhhOCwgMHg3MywgCisweGM4LCAweGUwLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDA4LCAweDMxLCAweDE5LCAweDQzLCAweDA5LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDMsIDB4OTEsIDB4MDMsIDB4YTksIDB4MDksIDB4ODgsIDB4MDEsIDB4MzEsIDB4MDksIDB4MDQsIAorMHgwOSwgMHgwYywgMHg3OSwgMHg4MiwgMHg0OSwgMHgwOSwgMHgwNSwgMHgzMSwgMHgwOSwgMHgwNiwgMHgwOSwgMHgwZSwgCisweDY5LCAweDRlLCAweGMwLCAweDQ2LCAweDAyLCAweDk2LCAweDY5LCAweDQ4LCAweDQzLCAweDZhLCAweGMwLCAweDQ2LCAKKzB4MDEsIDB4OTMsIDB4ODMsIDB4NmEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTMsIDB4YzIsIDB4MWQsIDB4MTEsIDB4MzIsIAorMHg4MCwgMHg2OSwgMHgwMCwgMHgwMywgMHgwMCwgMHgwYiwgMHg5MiwgMHg2OCwgMHhiMywgMHgwNywgMHgxYSwgMHg0MywgCisweDEyLCAweDY4LCAweDkwLCAweDQyLCAweDAxLCAweGQxLCAweDAxLCAweDIwLCAKKzB4MGQsIDB4ZTAsIDB4OTAsIDB4NDIsIDB4MDUsIDB4ZDksIDB4MDAsIDB4OWIsIDB4MTgsIDB4MWEsIDB4MDEsIDB4OWIsIAorMHhkMiwgMHgxYSwgMHg4MiwgMHgxOCwgMHgwMCwgMHhlMCwgMHgxMiwgMHgxYSwgMHgwMSwgMHgyMCwgMHgwOSwgMHgwMSwgCisweDkxLCAweDQyLCAweDAwLCAweGQzLCAweDAwLCAweDIwLCAweDAxLCAweDI4LCAweDY1LCAweGQxLCAweDUxLCAweDQ5LCAKKzB4MjAsIDB4NjksIDB4MDAsIDB4MjgsIDB4NjIsIDB4ZDAsIDB4MDUsIDB4OTksIDB4NDgsIDB4NjksIDB4MDEsIDB4MzAsIAorMHg0OCwgMHg2MSwgMHgwMiwgMHgyMCwgMHgyMSwgMHg2YSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHgwMCwgMHhmMCwgCisweGE3LCAweGZjLCAweDc4LCAweDYzLCAweGJlLCAweDYwLCAweDQ5LCAweDQ5LCAweDIyLCAweDZhLCAweGEzLCAweDZiLCAKKzB4ZDMsIDB4MTgsIDB4NjYsIDB4NmIsIDB4YjMsIDB4NDIsIDB4MDAsIDB4ZDksIDB4MjIsIDB4NmIsIDB4YzAsIDB4NDYsIAorMHhiYSwgMHg2MiwgMHhiYSwgMHg2YSwgMHgwYywgMHgzMiwgMHhmYSwgMHg2MiwgMHgwMCwgMHgyMiwgMHhmYSwgMHg2MSwgCisweDAzLCAweGFhLCAweDUyLCAweDg4LCAweGQyLCAweDA5LCAweDAzLCAweGQzLCAweDAxLCAweDIyLCAweDAwLCAweGUwLCAKKzB4N2IsIDB4ZTAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4MjIsIDB4N2EsIDB4NjAsIDB4N2EsIDB4NjgsIDB4YzAsIDB4NDYsIAorMHgwMiwgMHg2MCwgMHg3OCwgMHg4YSwgMHg0MSwgMHg0ZSwgMHg2MCwgMHgyOCwgMHgwNCwgMHhkYywgMHhiMCwgMHg4MywgCisweDc4LCAweDhhLCAweGMwLCAweDQ2LCAweGYwLCAweDgzLCAweDA4LCAweGUwLCAweDYwLCAweDIwLCAweGIwLCAweDgzLCAKKzB4NzksIDB4OGEsIDB4ZjgsIDB4NmEsIDB4NDIsIDB4MTgsIDB4NjMsIDB4NmIsIDB4OWEsIDB4NDIsIDB4MDMsIDB4ZDgsIAorMHhmMSwgMHg4MywgMHgwMCwgMHgyMiwgMHgzYSwgMHg2MywgMHgwNSwgMHhlMCwgMHgyMSwgMHg2YiwgMHhjMCwgMHg0NiwgCisweDM5LCAweDYzLCAweDYxLCAweDZiLCAweDA4LCAweDFhLCAweGYwLCAweDgzLCAweDJkLCAweDQ5LCAweDc4LCAweDZiLCAKKzB4NDIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4YmEsIDB4NjAsIDB4ODIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZmEsIDB4NjAsIAorMHgwMiwgMHg2OSwgMHhjMCwgMHg0NiwgMHg3YSwgMHg2MSwgMHg0MCwgMHg2OSwgMHhjMCwgMHg0NiwgMHhiOCwgMHg2MSwgCisweDJlLCAweDRiLCAweGM4LCAweDE4LCAweDA0LCAweDkwLCAweDAwLCAweGYwLCAweDM3LCAweGY5LCAweDA0LCAweDk4LCAKKzB4MDAsIDB4ZjAsIDB4ODgsIDB4ZjgsIDB4MDAsIDB4ZjAsIDB4ZjYsIDB4ZmEsIDB4NzgsIDB4OGEsIDB4ZjEsIDB4OGIsIAorMHg4OCwgMHg0MiwgMHgwNCwgMHhkMSwgMHhmOSwgMHg2YSwgMHgwOCwgMHgxOCwgMHgwNCwgMHhlMCwgMHgzOCwgMHhlMCwgCisweDMyLCAweGUwLCAweDNhLCAweDZiLCAweDEwLCAweDE4LCAweDQwLCAweDFhLCAweDgxLCAweDA3LCAweDAyLCAweGQwLCAKKzB4ODAsIDB4MDgsIDB4ODAsIDB4MDAsIDB4MDQsIDB4MzAsIDB4NjEsIDB4NmIsIDB4MDksIDB4MWEsIDB4YTIsIDB4NmIsIAorMHg5MSwgMHg0MiwgMHgwMCwgMHhkMiwgMHgyMCwgMHg2YiwgMHhjMCwgMHg0NiwgMHgyMCwgMHg2MiwgMHhlOCwgMHg3YiwgCisweDAwLCAweDI4LCAweDA4LCAweGQwLCAweDAwLCAweDIyLCAweGVhLCAweDczLCAweDA1LCAweDk5LCAweDQ4LCAweDY5LCAKKzB4MDEsIDB4MzgsIDB4NDgsIDB4NjEsIDB4NzgsIDB4NmIsIDB4MDAsIDB4ZjAsIDB4NzMsIDB4ZmEsIDB4MTgsIDB4NDgsIAorMHg4MCwgMHg2YSwgMHg4MCwgMHgwNiwgMHg4MCwgMHgwZSwgMHgwMSwgMHgyOCwgMHgwYSwgMHhkMSwgMHgyMCwgMHg2YSwgCisweDAwLCAweDAzLCAweDAwLCAweDBiLCAweDBiLCAweDRjLCAweGExLCAweDZhLCAweDg4LCAweDQyLCAweDAzLCAweGQwLCAKKzB4MDYsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDEsIDB4MjAsIDB4NDAsIDB4MDQsIAorMHgwOCwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHgwNiwgMHhlMCwgMHhlMCwgMHg2OCwgMHgwMCwgMHgyOCwgCisweDAxLCAweGQwLCAweDAwLCAweGYwLCAweGI1LCAweGZhLCAweDAxLCAweDIwLCAweGE4LCAweDczLCAweGVkLCAweGU3LCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDAsIDB4NDAsIDB4MTQsIDB4NDAsIDB4YTQsIDB4MmEsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHgyOCwgMHgxYSwgMHgwMCwgMHg4MCwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgCisweGE4LCAweDAzLCAweDAwLCAweDgwLCAweDY4LCAweDFhLCAweDAwLCAweDgwLCAweGM0LCAweDBiLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4ODAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4NzgsIDB4NmEsIDB4NDAsIDB4ODksIAorMHhmZiwgMHgyMSwgMHgwMSwgMHgzMSwgMHgwMSwgMHg0MCwgMHgxMCwgMHg0OCwgMHgwMiwgMHhkMSwgMHg4MSwgMHg2YywgCisweDAxLCAweDMxLCAweDgxLCAweDY0LCAweDc5LCAweDZhLCAweDQ5LCAweDg5LCAweDQ5LCAweDBiLCAweDAyLCAweGQyLCAKKzB4NDEsIDB4NmMsIDB4MDEsIDB4MzEsIDB4NDEsIDB4NjQsIDB4MGIsIDB4NDgsIDB4NDEsIDB4NmEsIDB4MDEsIDB4MzEsIAorMHg0MSwgMHg2MiwgMHg3OCwgMHg2YSwgMHgzOSwgMHg2YiwgMHhjMCwgMHg0NiwgMHg0OCwgMHg2MiwgMHgzOCwgMHg2YiwgCisweDAwLCAweGYwLCAweGY4LCAweGZiLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweGIzLCAweGY4LCAweDAxLCAweDIwLCAKKzB4MDQsIDB4NDksIDB4YzAsIDB4NDYsIDB4YzgsIDB4NzMsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgMHgxOCwgMHgxYSwgMHgwMCwgMHg4MCwgCisweGY4LCAweGI1LCAweDA3LCAweDFjLCAweDAwLCAweDIyLCAweGY5LCAweDFkLCAweDYxLCAweDMxLCAweDBkLCAweDFjLCAKKzB4NzgsIDB4NmEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTAsIDB4NDAsIDB4ODksIAorMHgwMywgMHgwYywgMHgwMSwgMHhkMiwgMHg0MCwgMHgwYSwgMHgwMywgMHhkMiwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgCisweGMxLCAweGZmLCAweDY3LCAweGUwLCAweDM1LCAweDQ4LCAweGMwLCAweDZiLCAweDAwLCAweDA5LCAweDFmLCAweGQzLCAKKzB4MDgsIDB4NzgsIDB4NDAsIDB4MDgsIDB4MWMsIDB4ZDIsIDB4MDAsIDB4MjAsIDB4NDMsIDB4MDAsIDB4Y2MsIDB4NWEsIAorMHgzMSwgMHg0ZSwgMHg5ZSwgMHgxOSwgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhmMywgMHgxOCwgMHgxYiwgMHg4OCwgCisweDljLCAweDQyLCAweDBlLCAweGQwLCAweGI4LCAweDY5LCAweDM5LCAweDZiLCAweGMwLCAweDQ2LCAweDg4LCAweDYxLCAKKzB4ZjgsIDB4NjgsIDB4MzksIDB4NmIsIDB4YzAsIDB4NDYsIDB4YzgsIDB4NjAsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHgyNywgMHhmOSwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHg3NCwgMHhmOCwgMHg0NiwgMHhlMCwgMHgwMSwgMHgzMCwgCisweDAzLCAweDI4LCAweGUzLCAweGRiLCAweDAyLCAweDIwLCAweDQzLCAweDAwLCAweDVjLCAweDE4LCAweGU0LCAweDg4LCAKKzB4MjIsIDB4NGUsIDB4OWUsIDB4MTksIDB4MzMsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZjMsIDB4MTgsIDB4MWIsIDB4ODgsIAorMHg5YywgMHg0MiwgMHgwMywgMHhkMSwgMHgwMSwgMHgyMywgMHgwMSwgMHgzOCwgMHhkOCwgMHg0MiwgMHhmMCwgMHhkYywgCisweDAxLCAweDIzLCAweGQ4LCAweDQyLCAweGM0LCAweGQwLCAweDFiLCAweDRlLCAweDBiLCAweDIzLCAweDFiLCAweDAyLCAKKzB4ZjAsIDB4MTgsIDB4NDAsIDB4NjksIDB4MDAsIDB4MjgsIDB4MjQsIDB4ZDAsIDB4N2QsIDB4NjMsIDB4MDAsIDB4OTgsIAorMHg0MCwgMHg4OSwgMHgwMCwgMHgwYywgMHgxZiwgMHhkMiwgMHgwMCwgMHgyNCwgMHgyZCwgMHgyMywgMHg5YiwgMHgwMSwgCisweGYwLCAweDE4LCAweGMwLCAweDZiLCAweDM1LCAweDFjLCAweDAwLCAweDI4LCAweDE3LCAweGQwLCAweGZlLCAweDFkLCAKKzB4MmQsIDB4MzYsIDB4YTIsIDB4MDAsIDB4NTIsIDB4MTksIDB4MmQsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZDIsIDB4MTgsIAorMHhkMiwgMHg2YiwgMHgzOCwgMHgxYywgMHgzMSwgMHgxYywgMHgwMiwgMHhmMCwgMHg3YiwgMHhmYywgMHgwMSwgMHgyOCwgCisweDBlLCAweGQwLCAweDAxLCAweDM0LCAweGEwLCAweDAwLCAweDQwLCAweDE5LCAweDJkLCAweDIzLCAweDliLCAweDAxLCAKKzB4YzAsIDB4MTgsIDB4YzAsIDB4NmIsIDB4MDAsIDB4MjgsIDB4ZWEsIDB4ZDEsIDB4MDEsIDB4ZTAsIDB4MDEsIDB4MmEsIAorMHgwMiwgMHhkMCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwOCwgMHhmOCwgMHhmOCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweGU4LCAweDFhLCAweDAwLCAweDgwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4ODAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4YjgsIDB4NjksIDB4MzksIDB4NmIsIDB4YzAsIDB4NDYsIDB4ODgsIDB4NjEsIAorMHhmOCwgMHg2OCwgMHgzOSwgMHg2YiwgMHhjMCwgMHg0NiwgMHhjOCwgMHg2MCwgMHg3OCwgMHg2YSwgMHg0MCwgMHg4OSwgCisweDAxLCAweDBjLCAweDBlLCAweGQyLCAweDQwLCAweDBhLCAweDBjLCAweGQzLCAweDM4LCAweDY4LCAweDQwLCAweDA4LCAKKzB4MDIsIDB4ZDMsIDB4MzgsIDB4MWMsIDB4MDIsIDB4ZjAsIDB4MGMsIDB4ZmMsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHhiYiwgMHhmOCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwOCwgMHhmOCwgMHgwMiwgMHhlMCwgMHgzOCwgMHgxYywgCisweGZmLCAweGY3LCAweDMwLCAweGZmLCAweDAxLCAweDIwLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDEsIDB4MjEsIDB4MDAsIDB4NmIsIDB4NDAsIDB4NmEsIDB4YzAsIDB4NDYsIDB4MDEsIDB4NjAsIDB4NzAsIDB4NDcsIAorMHhiMCwgMHhiNCwgMHhjMSwgMHgxZCwgMHgzOSwgMHgzMSwgMHgwOSwgMHg4YiwgMHg4OSwgMHgwOCwgMHgwOSwgMHgwNCwgCisweDA5LCAweDBjLCAweDg0LCAweDZhLCAweGMyLCAweDFkLCAweDYxLCAweDMyLCAweDAwLCAweDIwLCAweDAwLCAweDI5LCAKKzB4MGMsIDB4ZGQsIDB4ODcsIDB4MDAsIDB4M2QsIDB4MTksIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MmIsIDB4NDMsIAorMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHhkMywgMHg1MSwgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgCisweDg4LCAweDQyLCAweGYyLCAweGRiLCAweGIwLCAweGJjLCAweDcwLCAweDQ3LCAweGYwLCAweGI1LCAweGEwLCAweGIwLCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4YzEsIDB4MWQsIDB4MjEsIDB4MzEsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIAorMHhjMCwgMHg0NiwgMHgwYiwgMHg5MSwgMHhjMSwgMHgxZCwgMHg1MywgMHgzMSwgMHgxOSwgMHg0MywgMHgxZiwgMHg5MSwgCisweDA5LCAweDY4LCAweDAxLCAweGFmLCAweGZhLCAweDFkLCAweDM5LCAweDMyLCAweDFlLCAweDkyLCAweDE3LCAweGFiLCAKKzB4NTksIDB4ODAsIDB4M2EsIDB4NDksIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MGEsIDB4NmEsIDB4MTMsIDB4NDMsIAorMHhjYywgMHgxZCwgMHgxMSwgMHgzNCwgMHg4OSwgMHg2OSwgMHgwOSwgMHgwMywgMHgwOSwgMHgwYiwgMHgyMiwgMHg2OSwgCisweGU1LCAweDY4LCAweGMwLCAweDQ2LCAweDFkLCAweDk1LCAweGZjLCAweDFkLCAweDM5LCAweDM0LCAweDY0LCAweDhiLCAKKzB4NjQsIDB4MDksIDB4MDUsIDB4MzQsIDB4MjQsIDB4MDYsIDB4MjQsIDB4MGUsIDB4MWMsIDB4OTQsIDB4NTYsIDB4MWEsIAorMHgxYiwgMHg5NiwgMHgxYywgMHg5YywgMHgyZSwgMHg0YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgMHgwMSwgMHgyNiwgCisweDFkLCAweDlkLCAweDFhLCAweDY4LCAweDkxLCAweDQyLCAweDAxLCAweGQxLCAweDMyLCAweDFjLCAweDBiLCAweGUwLCAKKzB4OTEsIDB4NDIsIDB4MDMsIDB4ZDksIDB4NTIsIDB4MWIsIDB4MWIsIDB4OWUsIDB4YjUsIDB4MTgsIDB4MDAsIDB4ZTAsIAorMHg1NSwgMHgxYSwgMHgwMSwgMHgyMiwgMHgyNCwgMHgwMSwgMHhhYywgMHg0MiwgCisweDAwLCAweGQzLCAweDAwLCAweDIyLCAweDAxLCAweDJhLCAweGU2LCAweGQxLCAweDkxLCAweDA3LCAweDAxLCAweDQzLCAKKzB4MDksIDB4NjgsIDB4YzAsIDB4NDYsIDB4MzksIDB4NjAsIDB4OTMsIDB4MDcsIDB4MDEsIDB4MWQsIDB4MTksIDB4NDMsIAorMHgwOSwgMHg2OCwgMHhjMCwgMHg0NiwgMHg3OSwgMHg2MCwgMHhjMSwgMHgxZCwgMHgwMSwgMHgzMSwgMHgxOSwgMHg0MywgCisweDA5LCAweDY4LCAweGMwLCAweDQ2LCAweGI5LCAweDYwLCAweDFmLCAweDk5LCAweDA5LCAweDY4LCAweDFlLCAweDlhLCAKKzB4YzAsIDB4NDYsIDB4NTEsIDB4ODMsIDB4YzEsIDB4MWQsIDB4MWQsIDB4MzEsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIAorMHhjMCwgMHg0NiwgMHgzOCwgMHg2MywgMHg3OSwgMHg2MiwgMHhjMSwgMHgxZCwgMHgxMSwgMHgzMSwgMHgxOSwgMHg0MywgCisweDA5LCAweDY4LCAweGMwLCAweDQ2LCAweGI5LCAweDYxLCAweGMxLCAweDFkLCAweDA1LCAweDMxLCAweDE5LCAweDQzLCAKKzB4MDksIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZjksIDB4NjAsIDB4YzEsIDB4MWQsIDB4MTcsIDB4MzEsIDB4MTksIDB4NDMsIAorMHgwOSwgMHg2OCwgMHhjMCwgMHg0NiwgMHhmOSwgMHg4MywgMHgwZSwgMHgzMCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgCisweGMwLCAweDQ2LCAweGY4LCAweDgxLCAweDM4LCAweDY4LCAweDQwLCAweDA4LCAweDAyLCAweGQzLCAweDM4LCAweDFjLCAKKzB4MDIsIDB4ZjAsIDB4NWMsIDB4ZmIsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MGIsIDB4ZjgsIDB4MzgsIDB4MWMsIAorMHhmZiwgMHhmNywgMHg1OCwgMHhmZiwgMHgyMCwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweGE4LCAweDAzLCAweDAwLCAweDgwLCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweGY4LCAweGI1LCAweDA3LCAweDFjLCAKKzB4ZjgsIDB4MWQsIDB4MzksIDB4MzAsIDB4NDEsIDB4OGIsIDB4MzksIDB4NGEsIDB4OTEsIDB4NDIsIDB4MDAsIDB4ZGQsIAorMHg0MiwgMHg4MywgMHg0MiwgMHg4YiwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgMHgwMSwgMHgyMCwgMHgzYSwgMHgxZCwgCisweDA2LCAweGNhLCAweGJiLCAweDZhLCAweDAyLCAweGYwLCAweDBlLCAweGZmLCAweDMzLCAweDRhLCAweGMwLCAweDQ2LCAKKzB4MDAsIDB4OTIsIDB4MzMsIDB4NGUsIDB4MzAsIDB4NmEsIDB4MzMsIDB4NGMsIDB4ZTEsIDB4NmQsIDB4NDEsIDB4MTgsIAorMHgzOCwgMHg2YiwgMHhjMywgMHgxZCwgMHgwNSwgMHgzMywgMHgwMSwgMHgyMCwgMHg3MiwgMHg2YSwgMHgwMiwgMHhmMCwgCisweGZiLCAweGZlLCAweGUwLCAweDZkLCAweDE4LCAweDMwLCAweDAwLCAweDI1LCAweGIxLCAweDZhLCAweDgxLCAweDQyLCAKKzB4MDEsIDB4ZDgsIDB4ZTUsIDB4NjUsIDB4MDAsIDB4ZTAsIDB4ZTAsIDB4NjUsIDB4MmYsIDB4MjMsIDB4OWIsIDB4MDEsIAorMHgyMCwgMHgxYywgMHhlMSwgMHg2ZCwgMHhlNCwgMHgxOCwgMHgyMiwgMHg2OCwgMHg5MiwgMHgwMCwgMHgyNywgMHg0YiwgCisweGMwLCAweDQ2LCAweDk5LCAweDUwLCAweDI2LCAweDQ4LCAweGMxLCAweDZiLCAweDRhLCAweDA4LCAweDA1LCAweGQzLCAKKzB4NDksIDB4MDgsIDB4NDksIDB4MDAsIDB4YzEsIDB4NjMsIDB4MDEsIDB4MjAsIDB4MDEsIDB4ZjAsIDB4ZDYsIDB4ZmYsIAorMHgyMiwgMHg0YSwgMHgxZiwgMHg0OCwgMHhjMSwgMHgxZCwgMHg4OSwgMHgzMSwgMHgwYiwgMHg3OCwgMHgwMCwgMHgyYiwgCisweDAyLCAweGQwLCAweDQ5LCAweDc4LCAweDAwLCAweDI5LCAweDAwLCAweGQxLCAweDFlLCAweDRhLCAweGMwLCAweDQ2LCAKKzB4MDAsIDB4OTIsIDB4MjAsIDB4NjgsIDB4ODAsIDB4MDAsIDB4MTksIDB4NGIsIDB4YzMsIDB4MTgsIDB4MDUsIDB4Y2UsIAorMHhjMSwgMHgxZCwgMHgxMSwgMHgzMSwgMHgwMSwgMHgyMCwgMHgwMiwgMHhmMCwgMHhjNywgMHhmZSwgMHgxNCwgMHg0OCwgCisweDIxLCAweDY4LCAweDAxLCAweDMxLCAweDIxLCAweDYwLCAweDE3LCAweDI5LCAweDAwLCAweGQzLCAweDI1LCAweDYwLCAKKzB4MzksIDB4NmIsIDB4YzAsIDB4NDYsIDB4MGQsIDB4NjUsIDB4NzksIDB4NmEsIDB4M2EsIDB4NmIsIDB4YzAsIDB4NDYsIAorMHg1MSwgMHg2MiwgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhjMCwgMHgxOCwgMHg4MSwgMHg2OCwgMHgwMCwgMHgyOSwgCisweDAzLCAweGQxLCAweDM5LCAweDZiLCAweGMwLCAweDQ2LCAweDgxLCAweDYwLCAweDA0LCAweGUwLCAweDM5LCAweDZiLCAKKzB4YzIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MTEsIDB4NjUsIDB4MzksIDB4NmIsIDB4YzAsIDB4NDYsIDB4YzEsIDB4NjAsIAorMHhmOCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHhlYSwgMHgwNSwgMHgwMCwgMHgwMCwgCisweDE4LCAweDAwLCAweDE0LCAweDAyLCAweDdjLCAweDI5LCAweDAwLCAweDgwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4NDQsIDB4ODIsIDB4MjAsIDB4NDAsIDB4ZTgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDIsIAorMHgwNCwgMHgwMCwgMHgwMCwgMHgwMywgMHhmMCwgMHhiNSwgMHgxMSwgMHg0ZSwgMHhmZiwgMHgyNSwgMHgwMSwgMHgzNSwgCisweDEwLCAweDRmLCAweGMwLCAweDQ2LCAweDM1LCAweDYwLCAweDc4LCAweDY5LCAweDAxLCAweDM4LCAweDc4LCAweDYxLCAKKzB4YmMsIDB4NjgsIDB4MDAsIDB4MmMsIDB4MTAsIDB4ZDAsIDB4MjAsIDB4NmQsIDB4YzAsIDB4NDYsIDB4YjgsIDB4NjAsIAorMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgMHgyMSwgMHhmOCwgMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwNCwgMHhmYSwgCisweDA4LCAweDQ4LCAweDgwLCAweDZhLCAweDAwLCAweDBjLCAweDAwLCAweDA3LCAweGU5LCAweGQxLCAweGYwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDUsIDB4NDgsIDB4YzEsIDB4NzksIDB4MDEsIDB4MzEsIDB4YzEsIDB4NzEsIAorMHhmNywgMHhlNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHgyOCwgMHgxYiwgMHgwMCwgMHg4MCwgCisweDAwLCAweDAwLCAweDEwLCAweDQwLCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAKKzB4MDEsIDB4MjAsIDB4ODAsIDB4MDMsIDB4MDEsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4NzAsIDB4NDcsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHg5MCwgMHhiNSwgMHgwNywgMHgxYywgMHgzOCwgMHg2OCwgMHhjMCwgMHgwOCwgCisweDA5LCAweGQzLCAweDFkLCAweDQ4LCAweDAxLCAweDZhLCAweDAxLCAweDM5LCAweDAxLCAweDYyLCAweDIwLCAweDMwLCAKKzB4MDAsIDB4NzksIDB4MDAsIDB4MjgsIDB4MDEsIDB4ZDAsIDB4ZmUsIDB4ZjcsIDB4ZTksIDB4ZmQsIDB4MDEsIDB4MjMsIAorMHg5YiwgMHgwNywgMHhmOCwgMHgxZCwgMHgxZCwgMHgzMCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHgxNiwgMHg0YywgCisweDYxLCAweDZhLCAweDgxLCAweDQyLCAweDIxLCAweGQxLCAweDAxLCAweDFjLCAweDE5LCAweDQzLCAweDA5LCAweDY4LCAKKzB4MDksIDB4MDQsIDB4MDksIDB4MGMsIDB4MDEsIDB4MjksIDB4MWEsIDB4ZDEsIDB4MDAsIDB4ZjAsIDB4MjIsIDB4ZjgsIAorMHg2MCwgMHg2MiwgMHg2MCwgMHg2YSwgMHgyMSwgMHg2YSwgMHg4OCwgMHg0MiwgMHgwNSwgMHhkMCwgMHgwMSwgMHgyMSwgCisweDg5LCAweDA3LCAweDAxLCAweDQzLCAweDA5LCAweDY4LCAweDA5LCAweDA0LCAweGYyLCAweGQwLCAweDUxLCAweDIxLCAKKzB4ODksIDB4MDMsIDB4NjIsIDB4NmEsIDB4MjMsIDB4NmIsIDB4OWEsIDB4NDIsIDB4MDIsIDB4ZDEsIDB4NjAsIDB4NmIsIAorMHhhMiwgMHg2YiwgMHg4MCwgMHgxYSwgMHgwNCwgMHgzOCwgMHhjOCwgMHg2MCwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDIwLCAweDc5LCAweDZhLCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweGY3LCAweGU3LCAKKzB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIDB4ZTgsIDB4MWEsIDB4MDAsIDB4ODAsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHhjMSwgMHgxZCwgMHgwMSwgMHgzMSwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgMHgwOSwgMHgwNCwgMHgwOSwgMHgwYywgCisweDA4LCAweDE4LCAweDBkLCAweDMwLCAweDgxLCAweDA3LCAweDAyLCAweGQwLCAweDgwLCAweDA4LCAweDgwLCAweDAwLCAKKzB4MDQsIDB4MzAsIDB4MDQsIDB4NDksIDB4OGEsIDB4NmIsIDB4MTIsIDB4MTgsIDB4NGIsIDB4NmIsIDB4OWEsIDB4NDIsIAorMHgwMCwgMHhkOSwgMHgwOCwgMHg2YiwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHhlOCwgMHgxYSwgMHgwMCwgMHg4MCwgCisweDAwLCAweGI1LCAweDA0LCAweDQ4LCAweGMwLCAweDY4LCAweDEwLCAweDI4LCAweDAxLCAweGQzLCAweDAwLCAweGYwLCAKKzB4MDUsIDB4ZjgsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4ZTgsIDB4MWEsIDB4MDAsIDB4ODAsIAorMHg4OCwgMHhiNSwgMHgwYywgMHg0ZiwgMHgzOCwgMHg3OSwgMHgwMCwgMHgyOCwgMHgxMSwgMHhkMSwgMHgwYiwgMHg0OSwgCisweDEwLCAweDIwLCAweDAyLCAweGYwLCAweGY1LCAweGZkLCAweDAwLCAweDI4LCAweDBiLCAweGQwLCAweDAxLCAweDIwLCAKKzB4MzgsIDB4NzEsIDB4MDgsIDB4NGEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4MDcsIDB4NDgsIDB4NDIsIDB4NjgsIAorMHgwNywgMHg0YiwgMHgwMSwgMHg2OCwgMHgwMCwgMHgyMCwgMHgwMiwgMHhmMCwgMHhkZiwgMHhmZCwgMHg4OCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGY4LCAweDFhLCAweDAwLCAweDgwLCAweGY1LCAweDJjLCAweGZmLCAweGZmLCAKKzB4MTAsIDB4MDAsIDB4MzUsIDB4MDIsIDB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIDB4NDQsIDB4ODAsIDB4MjAsIDB4NDAsIAorMHg5MCwgMHhiNSwgMHgwMSwgMHgyMCwgMHg0MCwgMHgwMiwgMHgxMCwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgCisweDBmLCAweDRmLCAweDEwLCAweDIxLCAweGY4LCAweDFkLCAweDNkLCAweDMwLCAweDAyLCAweGYwLCAweDRjLCAweGZjLCAKKzB4MTksIDB4MjMsIDB4ZGIsIDB4MDEsIDB4ZmMsIDB4MTgsIDB4ZTAsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MDEsIDB4ZDAsIAorMHgwMCwgMHhmMCwgMHgxNCwgMHhmOCwgMHgwMCwgMHgyMCwgMHhjOSwgMHgyMywgMHgxYiwgMHgwMSwgMHhmOSwgMHgxOCwgCisweDA4LCAweDcxLCAweGUwLCAweDY4LCAweDEwLCAweDI4LCAweDA0LCAweGQzLCAweDAxLCAweDIwLCAweGJiLCAweDIzLCAKKzB4MWIsIDB4MDEsIDB4ZjksIDB4MTgsIDB4NDgsIDB4NzMsIDB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhmOCwgMHhiNSwgMHgzNywgMHg0OCwgCisweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGMxLCAweDE4LCAweGM5LCAweDY4LCAweDM1LCAweDRkLCAweDEwLCAweDI5LCAKKzB4MDAsIDB4ZDksIDB4MTAsIDB4MjEsIDB4NjksIDB4NjIsIDB4MzIsIDB4NDgsIDB4YzEsIDB4NmMsIDB4MDAsIDB4NmUsIAorMHg4MSwgMHg0MiwgMHgwNywgMHhkOSwgMHgwOCwgMHgxYSwgMHgwNywgMHgwOSwgMHgwMCwgMHgyNCwgMHg2OCwgMHg2YSwgCisweGI4LCAweDQyLCAweDEyLCAweGQyLCAweDA3LCAweDFjLCAweDEwLCAweGUwLCAweDgxLCAweDQyLCAweDJhLCAweGQyLCAKKzB4MmMsIDB4NGEsIDB4NTIsIDB4NmIsIDB4MTAsIDB4MWEsIDB4MDcsIDB4MDksIDB4NjgsIDB4NmEsIDB4YjgsIDB4NDIsIAorMHgwNSwgMHhkOSwgMHgwYywgMHgwOSwgMHgzOSwgMHgxOSwgMHg4OCwgMHg0MiwgMHgwMywgMHhkMiwgMHhjNCwgMHgxYiwgCisweDAxLCAweGUwLCAweDAwLCAweDI0LCAweDA3LCAweDFjLCAweDNlLCAweDE5LCAweDMwLCAweDAxLCAweDI1LCAweDQ5LCAKKzB4MDIsIDB4ZjAsIDB4ODQsIDB4ZmQsIDB4MDAsIDB4MjgsIDB4M2QsIDB4ZDAsIDB4MjMsIDB4NDgsIDB4MDAsIDB4MmMsIAorMHgxYSwgMHhkMSwgMHgxZSwgMHg0OSwgMHgzYSwgMHgwMSwgMHg2ZiwgMHg2MiwgMHgwOSwgMHg2ZSwgMHg4YywgMHgxOCwgCisweDFkLCAweDRkLCAweDZiLCAweDZiLCAweGEzLCAweDQyLCAweDAwLCAweGQ4LCAweGU0LCAweDFhLCAweDFlLCAweDRiLCAKKzB4MWEsIDB4NDMsIDB4MDAsIDB4OTIsIDB4ZWEsIDB4NmEsIDB4NTEsIDB4MTgsIAorMHgyYSwgMHg2YiwgMHgwMywgMHgxYywgMHgyMCwgMHhlMCwgMHgxYiwgMHg0OCwgMHgwMSwgMHg2YiwgMHgwMSwgMHgzMSwgCisweDAxLCAweDYzLCAweDAwLCAweDIwLCAweDY4LCAweDYyLCAweGY4LCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MTAsIDB4NDksIDB4MjQsIDB4MDEsIDB4M2YsIDB4MDEsIDB4MTEsIDB4MjIsIDB4NTIsIDB4MDUsIDB4M2EsIDB4NDMsIAorMHg2ZSwgMHg2MiwgMHgwMCwgMHg5MiwgMHgwZSwgMHg0ZCwgMHhlYSwgMHg2YSwgMHgwOSwgMHg2ZSwgMHg1MSwgMHgxOCwgCisweDAzLCAweDFjLCAweDA2LCAweDFjLCAweDAwLCAweDIwLCAweDJhLCAweDZiLCAweDAyLCAweGYwLCAweDRhLCAweGZkLCAKKzB4MGMsIDB4NGEsIDB4MjIsIDB4NDMsIDB4MDAsIDB4OTIsIDB4YmIsIDB4MTksIDB4ZTksIDB4NmEsIDB4MmEsIDB4NmIsIAorMHgwMCwgMHgyMCwgMHgwMiwgMHhmMCwgMHg0MSwgMHhmZCwgMHgwMywgMHg0OCwgMHhjMCwgMHg0NiwgMHgwNCwgMHg2NiwgCisweDAwLCAweGYwLCAweDEwLCAweGY4LCAweDAxLCAweDIwLCAweGRhLCAweGU3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4MjgsIDB4MWIsIDB4MDAsIDB4ODAsIDB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIDB4NWQsIDB4MmUsIDB4ZmYsIDB4ZmYsIAorMHg0NCwgMHg4MCwgMHgyMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgzNiwgMHgwMiwgMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgCisweDA0LCAweDQ4LCAweDAxLCAweDZlLCAweDA0LCAweDRhLCAweDgwLCAweDMwLCAweGQxLCAweDYwLCAweDAyLCAweDIzLCAKKzB4YzEsIDB4NmIsIDB4MTksIDB4NDMsIDB4YzEsIDB4NjMsIDB4NzAsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg5MCwgMHhlZSwgMHgyMCwgMHg0MCwgMHhmMCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwMSwgMHgyMCwgMHg4MCwgMHgwMiwgCisweDFjLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDAwLCAweDI3LCAweDFiLCAweDRlLCAweDMzLCAweDIzLCAKKzB4OWIsIDB4MDEsIDB4ZjUsIDB4MTgsIDB4NjgsIDB4NmEsIDB4MDAsIDB4MjgsIDB4MWQsIDB4ZDksIDB4MTksIDB4NGMsIAorMHg2OCwgMHg0NiwgMHgxMCwgMHgyMSwgMHgwMiwgMHhmMCwgMHg5MCwgMHhmYiwgMHg2OCwgMHg0NiwgMHgwMCwgMHhmMCwgCisweDMzLCAweGY4LCAweDAwLCAweDI4LCAweDA0LCAweGQwLCAweDE1LCAweDQ5LCAweDQ4LCAweDY5LCAweDAxLCAweDMwLCAKKzB4NDgsIDB4NjEsIDB4MGEsIDB4ZTAsIDB4MTMsIDB4NDksIDB4NjAsIDB4N2IsIDB4MDEsIDB4MzAsIDB4NjAsIDB4NzMsIAorMHg4OCwgMHg3OSwgMHgwMSwgMHgzMCwgMHg4OCwgMHg3MSwgMHgxMSwgMHg0OCwgMHgwMCwgMHg2OCwgMHgwMiwgMHhmMCwgCisweDY1LCAweGY5LCAweDY4LCAweDZhLCAweDAxLCAweDM3LCAweGI4LCAweDQyLCAweGUyLCAweGQ4LCAweGJiLCAweDIzLCAKKzB4MWIsIDB4MDEsIDB4ZjAsIDB4MTgsIDB4ODEsIDB4N2IsIDB4MDAsIDB4MjksIDB4MDMsIDB4ZDAsIDB4MDAsIDB4MjEsIAorMHg4MSwgMHg3MywgMHhmZiwgMHhmNywgMHgwNSwgMHhmYiwgMHhmZiwgMHhmNywgMHhlMywgMHhmZSwgMHgwNCwgMHhiMCwgCisweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4YjAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4MDgsIDB4ODMsIDB4MjAsIDB4NDAsIAorMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgMHg1OCwgMHgwNCwgMHgwMCwgMHg4MCwgMHg5MCwgMHhiNCwgMHgxNywgMHg0ZiwgCisweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGY5LCAweDE4LCAweDAwLCAweDIyLCAweGNiLCAweDY4LCAweDAwLCAweDJiLCAKKzB4MjMsIDB4ZDAsIDB4MDEsIDB4M2IsIDB4Y2IsIDB4NjAsIDB4MzMsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZmYsIDB4MTgsIAorMHhiYiwgMHg2OSwgMHgxYywgMHg2ZCwgMHhjMCwgMHg0NiwgMHhiYywgMHg2MSwgMHgwNCwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDVjLCAweDYwLCAweDQ0LCAweDY4LCAweGMwLCAweDQ2LCAweDljLCAweDYwLCAweDg0LCAweDY4LCAweGMwLCAweDQ2LCAKKzB4MWMsIDB4NjEsIDB4YzAsIDB4NjgsIDB4YzAsIDB4NDYsIDB4NTgsIDB4NjEsIDB4MWEsIDB4NjUsIDB4MDgsIDB4NjksIAorMHg0MiwgMHgxYywgMHgwYSwgMHg2MSwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMCwgMHgzOCwgMHg2YSwgMHhjMCwgMHg0NiwgCisweDAzLCAweDY1LCAweDAwLCAweGUwLCAweGZiLCAweDYxLCAweDNiLCAweDYyLCAweDE4LCAweDFjLCAweDkwLCAweGJjLCAKKzB4NzAsIDB4NDcsIDB4MTAsIDB4MWMsIDB4ZmIsIDB4ZTcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHgwYSwgMHg0YSwgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhkMSwgMHgxOCwgMHhjOCwgMHg2OSwgMHgxOSwgMHgyMywgCisweGRiLCAweDAxLCAweGQyLCAweDE4LCAweDEzLCAweDY5LCAweDAwLCAweDJiLCAweDA2LCAweGQwLCAweDAxLCAweDNiLCAKKzB4MTMsIDB4NjEsIDB4Y2EsIDB4NjksIDB4MTIsIDB4NmQsIDB4YzAsIDB4NDYsIDB4Y2EsIDB4NjEsIDB4NzAsIDB4NDcsIAorMHgwMCwgMHgyMSwgMHgxMSwgMHg2MSwgMHhmYiwgMHhlNywgMHgwMCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDA2LCAweDRhLCAweDExLCAweDY5LCAweDRiLCAweDFjLCAweDEzLCAweDYxLCAweDQwLCAweDMyLCAweDAwLCAweDI5LCAKKzB4MDEsIDB4ZDAsIDB4ZDEsIDB4NjksIDB4MDAsIDB4ZTAsIDB4MDAsIDB4MjEsIDB4MDEsIDB4NjUsIDB4ZDAsIDB4NjEsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHhlOCwgMHgxYSwgMHgwMCwgMHg4MCwgMHgwNiwgMHg0YSwgMHhkMSwgMHg2OCwgCisweDRiLCAweDFjLCAweGQzLCAweDYwLCAweDQwLCAweDMyLCAweDAwLCAweDI5LCAweDAxLCAweGQwLCAweDkxLCAweDY5LCAKKzB4MDAsIDB4ZTAsIDB4MDAsIDB4MjEsIDB4MDEsIDB4NjUsIDB4OTAsIDB4NjEsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHhlOCwgMHgxYSwgMHgwMCwgMHg4MCwgMHg5MCwgMHhiNCwgMHgwMCwgMHgyMSwgCisweDBmLCAweDRhLCAweDk3LCAweDg5LCAweDkyLCAweDZhLCAweDRiLCAweDAwLCAweDFiLCAweDE4LCAweDliLCAweDhhLCAKKzB4MDAsIDB4MmIsIDB4MTIsIDB4ZDAsIDB4YmIsIDB4NDIsIDB4MTAsIDB4ZGMsIDB4MWMsIDB4MWMsIDB4NTgsIDB4MjMsIAorMHg2MywgMHg0MywgMHhkMywgMHgxOCwgMHhkYywgMHgxZiwgMHg0OSwgMHgzYywgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgCisweDIzLCAweDQzLCAweDFiLCAweDY4LCAweDFiLCAweDA2LCAweDFiLCAweDBlLCAweDAzLCAweDJiLCAweDAyLCAweGQwLCAKKzB4MDAsIDB4MjAsIDB4OTAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MDEsIDB4MzEsIDB4MDQsIDB4MjksIDB4ZTQsIDB4ZDMsIAorMHgwMSwgMHgyMCwgMHhmOCwgMHhlNywgMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgMHhmNywgMHhiNSwgMHg4NiwgMHhiMCwgCisweDNkLCAweDRhLCAweDA3LCAweDFjLCAweGQxLCAweDY5LCAweDhmLCAweDQwLCAweDAzLCAweDFjLCAweDE0LCAweDZhLCAKKzB4ZTMsIDB4NDAsIDB4NWYsIDB4NDAsIDB4MDcsIDB4OWUsIDB4OGUsIDB4NDAsIDB4NzcsIDB4NDAsIDB4Y2YsIDB4NDAsIAorMHg5NCwgMHg2OSwgMHhjMCwgMHg0NiwgMHgwNSwgMHg5NCwgMHgwMywgMHgxYywgMHhhMywgMHg0MCwgMHgwMCwgMHgyNSwgCisweDE0LCAweDY5LCAweGMwLCAweDQ2LCAweDA0LCAweDk0LCAweDAwLCAweDJjLCAweDVkLCAweGQ5LCAweDFjLCAweDFjLCAKKzB4MzIsIDB4NGUsIDB4MjYsIDB4NDMsIDB4OTQsIDB4NjksIDB4ZTYsIDB4NDAsIDB4MzMsIDB4MWMsIDB4MDMsIDB4OTYsIAorMHg1MywgMHg2YSwgMHhjMCwgMHg0NiwgMHgwMiwgMHg5MywgMHhkMiwgMHg2YSwgMHhjMCwgMHg0NiwgMHgwMSwgMHg5MiwgCisweGJiLCAweDAwLCAweDAyLCAweDlhLCAweGQyLCAweDU4LCAweDEzLCAweDFjLCAweDA1LCAweDljLCAweGUzLCAweDQwLCAKKzB4MDMsIDB4OWMsIDB4YTMsIDB4NDIsIDB4M2UsIDB4ZDEsIDB4OGEsIDB4NDAsIDB4Y2EsIDB4NDAsIDB4MTQsIDB4MWMsIAorMHg2MywgMHgwMCwgMHgxYiwgMHgxOSwgMHg1YiwgMHgwMSwgMHgwMSwgMHg5YSwgMHhkMiwgMHgxOCwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweGQ2LCAweDFkLCAweDAxLCAweDM2LCAweDMzLCAweDQzLCAweDFiLCAweDY4LCAweDFiLCAweDA2LCAKKzB4MWIsIDB4MGUsIDB4MDMsIDB4MmIsIDB4MmMsIDB4ZDEsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDYsIDB4MWQsIAorMHg1MSwgMHgzNiwgMHgzMywgMHg0MywgMHgxYiwgMHg2OCwgMHgwNywgMHg5ZSwgMHgxZSwgMHg0MCwgMHgwMCwgMHg5NiwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweGQ2LCAweDFkLCAweDQ5LCAweDM2LCAweDMzLCAweDQzLCAweDFiLCAweDY4LCAKKzB4ODMsIDB4NDIsIDB4MWIsIDB4ZDEsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDYsIDB4MWQsIDB4NGQsIDB4MzYsIAorMHgzMywgMHg0MywgMHgxYiwgMHg2OCwgMHgwMCwgMHg5ZSwgMHhiMywgMHg0MiwgMHgxMiwgMHhkMSwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweDFhLCAweDQzLCAweDEyLCAweDY4LCAweDEyLCAweDA0LCAweDEyLCAweDBjLCAweDA4LCAweDliLCAKKzB4MzIsIDB4MmIsIDB4MDQsIDB4ZDEsIDB4MDIsIDB4MmEsIDB4MDcsIDB4ZDEsIDB4MjAsIDB4MDQsIDB4MDAsIDB4MTQsIAorMHgwZiwgMHhlMCwgMHgwOCwgMHg5YiwgMHgzMywgMHgyYiwgMHgwMSwgMHhkMSwgMHgwMSwgMHgyYSwgMHhmNywgMHhkMCwgCisweDA0LCAweDlhLCAweDAxLCAweDM3LCAweDk3LCAweDQyLCAweDAwLCAweGQzLCAweDAwLCAweDI3LCAweDA0LCAweDlhLCAKKzB4MDEsIDB4MzUsIDB4YWEsIDB4NDIsIDB4YWUsIDB4ZDgsIDB4MDAsIDB4MjAsIDB4YzAsIDB4NDMsIDB4MDksIDB4YjAsIAorMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgCisweDAwLCAweDAwLCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweDI3LCAweDRkLCAweDY4LCAweDY5LCAweDAwLCAweDI4LCAKKzB4MDYsIDB4ZDAsIDB4MjYsIDB4NDgsIDB4MDAsIDB4NjgsIDB4MDIsIDB4ZjAsIDB4MmIsIDB4ZjgsIDB4ZjAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgyMywgMHg0YywgMHgwMCwgMHgyNiwgMHhhMCwgMHg2OCwgMHgyMywgMHg0ZiwgCisweDAwLCAweDI4LCAweDE2LCAweGQwLCAweDBmLCAweGUwLCAweDI4LCAweDZhLCAweDAyLCAweDI4LCAweDAyLCAweGQzLCAKKzB4MDEsIDB4MjAsIDB4MzgsIDB4NzEsIDB4MGYsIDB4ZTAsIDB4YTYsIDB4NjAsIDB4ZmQsIDB4ZjcsIDB4ZGUsIDB4ZmUsIAorMHgwMCwgMHgyOCwgMHhlYSwgMHhkMSwgMHgyOCwgMHg2YSwgMHgwMiwgMHgyOCwgMHgwMSwgMHhkMywgMHgwMSwgMHgyMCwgCisweDM4LCAweDcxLCAweGU4LCAweDY4LCAweDAwLCAweDI4LCAweDAyLCAweGQwLCAweDM4LCAweDc5LCAweDAwLCAweDI4LCAKKzB4ZTksIDB4ZDAsIDB4NjgsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MWIsIDB4ZDAsIDB4MDEsIDB4MjAsIDB4YTAsIDB4NjAsIAorMHhmZSwgMHhmNywgMHhiYywgMHhmYiwgMHgwMCwgMHgyOCwgMHhkNiwgMHhkMSwgMHg2OCwgMHg2OCwgMHgwMCwgMHgyOCwgCisweGY2LCAweGQxLCAweDExLCAweGUwLCAweDAwLCAweDI4LCAweGQwLCAweGQxLCAweDI4LCAweDZhLCAweDAyLCAweDI4LCAKKzB4MDIsIDB4ZDMsIDB4MDEsIDB4MjAsIDB4MzgsIDB4NzEsIDB4Y2EsIDB4ZTcsIDB4YTYsIDB4NjAsIDB4ZmQsIDB4ZjcsIAorMHhiOSwgMHhmZSwgMHgwMCwgMHgyOCwgMHhjNSwgMHhkMSwgMHgyOCwgMHg2YSwgMHgwMiwgMHgyOCwgMHgwMSwgMHhkMywgCisweDAxLCAweDIwLCAweDM4LCAweDcxLCAweGU4LCAweDY4LCAweDAwLCAweDI4LCAweGJkLCAweGQwLCAweDM4LCAweDc5LCAKKzB4MDAsIDB4MjgsIDB4ZTcsIDB4ZDAsIDB4YjksIDB4ZTcsIDB4MDAsIDB4MDAsIDB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIAorMHg1YywgMHgwNCwgMHgwMCwgMHg4MCwgMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgMHg4YywgMHgwNiwgMHgwMCwgMHg4MCwgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4OTAsIDB4YjUsIDB4NDAsIDB4MjAsIDB4MWQsIDB4NDksIDB4YzAsIDB4NDYsIAorMHgwOCwgMHg2MCwgMHgwMSwgMHhmMCwgMHg5ZCwgMHhmYywgMHgwMywgMHgyMywgMHgxYiwgMHgwNywgMHg0MSwgMHg2OCwgCisweDE5LCAweDQwLCAweDBjLCAweDBmLCAweDYxLCAweDAxLCAweDA5LCAweDFiLCAweDg5LCAweDAwLCAweDE4LCAweDRhLCAKKzB4OGYsIDB4MTgsIDB4MDEsIDB4MjEsIDB4MzksIDB4ODAsIDB4ODEsIDB4NmEsIDB4YzAsIDB4NDYsIDB4NzksIDB4NjUsIAorMHg0MSwgMHg2YSwgMHhjMCwgMHg0NiwgMHg3OSwgMHg2NywgMHhiOSwgMHg2YywgMHhmYSwgMHg2YywgMHg4OSwgMHgxOCwgCisweGI5LCAweDY0LCAweDAwLCAweDIxLCAweGY5LCAweDY0LCAweGJhLCAweDZiLCAweDNiLCAweDZkLCAweGQyLCAweDE4LCAKKzB4YmEsIDB4NjMsIDB4MzksIDB4NjUsIDB4NDIsIDB4NmEsIDB4MjAsIDB4MzIsIDB4NTEsIDB4NzEsIDB4NzksIDB4NmQsIAorMHg3YSwgMHg2ZiwgMHhkMiwgMHg2ZCwgMHhjMCwgMHg0NiwgMHgxMSwgMHg2MCwgMHhmYywgMHhmNywgMHhjYSwgMHhmZiwgCisweDIwLCAweDAxLCAweDA5LCAweDQ5LCAweDQwLCAweDE4LCAweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGMwLCAweDE4LCAKKzB4NDEsIDB4NmIsIDB4MDEsIDB4MzksIDB4NDEsIDB4NjMsIDB4NzgsIDB4NmYsIDB4MDEsIDB4ZjAsIDB4YzYsIDB4ZmIsIAorMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgCisweDVjLCAweDJiLCAweDAwLCAweDgwLCAweGEwLCAweDFjLCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweDQwLCAweDIwLCAKKzB4MTIsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4MDEsIDB4ZjAsIDB4NTksIDB4ZmMsIDB4MDcsIDB4MWMsIAorMHg0MCwgMHg2OCwgMHgwMywgMHgyMywgMHgxYiwgMHgwNywgMHgxOCwgMHg0MCwgMHgwNiwgMHgwZiwgMHg3MCwgMHgwMSwgCisweDgwLCAweDFiLCAweDgwLCAweDAwLCAweDBjLCAweDQ5LCAweDQ0LCAweDE4LCAweGI4LCAweDZhLCAweGMwLCAweDQ2LCAKKzB4NjAsIDB4NjUsIDB4NzgsIDB4NmEsIDB4YzAsIDB4NDYsIDB4NjAsIDB4NjcsIDB4ODAsIDB4NmYsIDB4MDUsIDB4MWQsIAorMHhlNSwgMHg2MywgMHhiOSwgMHg2OSwgMHgyOCwgMHgxYywgMHgwMiwgMHhmMCwgMHg4OSwgMHhmOSwgMHgzOCwgMHgxYywgCisweDIxLCAweDFjLCAweDMyLCAweDFjLCAweDJiLCAweDFjLCAweDAwLCAweGYwLCAweDIwLCAweGY4LCAweGYwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIDB4NWMsIDB4MmIsIDB4MDAsIDB4ODAsIAorMHhmMCwgMHhiNSwgMHg0YiwgMHg2ZiwgMHg5YiwgMHg2ZiwgMHgxZiwgMHgxZCwgMHhjZiwgMHg2MywgMHgwNSwgMHg2OCwgCisweDAwLCAweDIzLCAweDg0LCAweDY5LCAweGE0LCAweDA4LCAweDA4LCAweGQwLCAweDljLCAweDAwLCAweDJlLCAweDU5LCAKKzB4YzAsIDB4NDYsIDB4M2UsIDB4NTEsIDB4ODQsIDB4NjksIDB4YTQsIDB4MDgsIDB4MDEsIDB4MzMsIDB4OWMsIDB4NDIsIAorMHhmNiwgMHhkOCwgMHgzYiwgMHgxYywgMHgwMCwgMHhmMCwgMHgwMywgMHhmOCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweGZmLCAweGI1LCAweDgxLCAweGIwLCAweDA0LCAweDFjLCAweDFkLCAweDFjLCAweDBmLCAweDFjLCAKKzB4NDYsIDB4NDgsIDB4MDEsIDB4NjksIDB4MDEsIDB4MzEsIDB4MDEsIDB4NjEsIDB4ZjksIDB4MWQsIDB4NTEsIDB4MzEsIAorMHhiZCwgMHg2NSwgMHgwMCwgMHg5MSwgMHgyMCwgMHgxYywgMHhmZCwgMHhmNywgMHg1ZCwgMHhmYywgMHhmOCwgMHg2ZCwgCisweDQwLCAweDA5LCAweDM2LCAweGQyLCAweGI4LCAweDZkLCAweDA2LCAweDdiLCAweDQzLCAweDdiLCAweDFiLCAweDAyLCAKKzB4MWUsIDB4NDMsIDB4MTcsIDB4MjEsIDB4NDksIDB4MDIsIDB4MDEsIDB4NzMsIDB4MGIsIDB4MGEsIDB4NDMsIDB4NzMsIAorMHgwMCwgMHg5OSwgMHgyMCwgMHgxYywgMHhmZCwgMHhmNywgMHg0YywgMHhmYywgMHhiOCwgMHg2ZCwgMHhjMCwgMHg0NiwgCisweDA2LCAweDczLCAweDMzLCAweDBhLCAweDQzLCAweDczLCAweGY4LCAweDZkLCAweDQwLCAweDA5LCAweDIwLCAweGQyLCAKKzB4NjAsIDB4NjgsIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MDMsIDB4OTgsIDB4MDEsIDB4ZjAsIDB4Y2MsIDB4ZmMsIAorMHg2MCwgMHg2OCwgMHgzMiwgMHg0YiwgMHgxOCwgMHg0MywgMHg2MCwgMHg2MCwgMHgyMCwgMHgxYywgMHgwMSwgMHhmMCwgCisweDM1LCAweGZkLCAweDAwLCAweDI1LCAweDdkLCAweDYwLCAweGJkLCAweDYwLCAweDNkLCAweDY0LCAweDdkLCAweDY0LCAKKzB4MjAsIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4MzEsIDB4ZmYsIDB4MzgsIDB4ODgsIDB4NDAsIDB4MjMsIDB4MTgsIDB4NDMsIAorMHgzOCwgMHg4MCwgMHg3ZCwgMHg2MiwgMHgyOSwgMHg0OCwgMHhjMCwgMHg0NiwgMHhiOCwgMHg2MiwgMHgzOCwgMHgxYywgCisweDAwLCAweGYwLCAweGEwLCAweGZiLCAweDQ0LCAweGUwLCAweDIwLCAweDY4LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4MDgsIDB4MzgsIDB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIDB4YzAsIDB4NDYsIDB4NzgsIDB4NjQsIDB4NjAsIDB4NjgsIAorMHgwMiwgMHgwNCwgMHgxMiwgMHgwYywgMHg3OCwgMHg2ZSwgMHgwMSwgMHgyNiwgMHhjMSwgMHgxZCwgMHgwZCwgMHgzMSwgCisweDhhLCAweDQyLCAweDAyLCAweGQyLCAweDNhLCAweDY0LCAweDA4LCAweDFjLCAweDBlLCAweGUwLCAweDQxLCAweDE5LCAKKzB4ODksIDB4ODksIDB4ZjAsIDB4MjMsIDB4MTksIDB4NDAsIDB4MDksIDB4MDksIDB4ODksIDB4MDAsIDB4NDAsIDB4MTgsIAorMHhmOCwgMHg2MCwgMHhmOSwgMHg2MSwgMHg2MSwgMHg2OCwgMHgwOSwgMHgwNCwgMHgwOSwgMHgwYywgMHg4MSwgMHg0MiwgCisweDE2LCAweGQyLCAweDM5LCAweDY0LCAweDYzLCAweDY4LCAweDE5LCAweDA0LCAweDA5LCAweDBjLCAweDQwLCAweDFhLCAKKzB4MDMsIDB4MzAsIDB4ODAsIDB4MDgsIDB4ODIsIDB4MDAsIDB4YTAsIDB4NjEsIAorMHgyMCwgMHg2OCwgMHgwOSwgMHgxOCwgMHg5YiwgMHgxOCwgMHg2MywgMHg2MCwgMHhjMywgMHgxZiwgMHgwNSwgMHgzYiwgCisweDM4LCAweDFjLCAweDAwLCAweGYwLCAweGI2LCAweGZhLCAweDdlLCAweDgwLCAweDIwLCAweDFjLCAweDAwLCAweGYwLCAKKzB4YmYsIDB4ZmIsIDB4MGIsIDB4ZTAsIDB4YjksIDB4NjgsIDB4MDgsIDB4MWEsIDB4MDAsIDB4MjUsIDB4NzgsIDB4NjIsIAorMHhiZCwgMHg2MiwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgzYywgMHhmYywgMHgyMCwgMHgxYywgMHgzOSwgMHgxYywgCisweDAwLCAweGYwLCAweDY0LCAweGY4LCAweDA1LCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MGMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4YzAsIAorMHhmMCwgMHhiNSwgMHgwNCwgMHgxYywgMHgwZiwgMHgxYywgMHgzOCwgMHg2YywgMHhmOSwgMHg2YiwgMHgwZCwgMHgxOCwgCisweDIxLCAweDY4LCAweDQxLCAweDE4LCAweDAwLCAweDIwLCAweGEyLCAweDY5LCAweDAwLCAweDJhLCAweDBiLCAweGQ5LCAKKzB4ODIsIDB4MDAsIDB4NTYsIDB4MTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHhhYiwgMHg1MCwgMHhhMiwgMHg2OSwgMHgwMSwgMHgzMCwgMHg4MiwgMHg0MiwgMHhmMywgMHhkOCwgCisweDc4LCAweDZlLCAweGY5LCAweDZiLCAweDA5LCAweDE4LCAweDg5LCAweDg5LCAweGYwLCAweDIzLCAweDE5LCAweDQwLCAKKzB4MDksIDB4MDksIDB4ODksIDB4MDAsIDB4NDAsIDB4MTgsIDB4ZjgsIDB4NjAsIDB4ZjksIDB4NjEsIDB4MjAsIDB4NjgsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwOCwgMHgzOCwgMHgxOCwgMHg0MywgMHgwMSwgMHg2OCwgMHg3OCwgMHg2YywgCisweGZjLCAweGY3LCAweDk1LCAweGZmLCAweDc4LCAweDY0LCAweDYwLCAweDY4LCAweDAxLCAweDA0LCAweDA5LCAweDBjLCAKKzB4ZjgsIDB4NjgsIDB4ODEsIDB4NDIsIDB4MTksIDB4ZDIsIDB4MzksIDB4NjQsIDB4NjMsIDB4NjgsIDB4MTksIDB4MDQsIAorMHgwOSwgMHgwYywgMHg0MCwgMHgxYSwgMHgwMywgMHgzMCwgMHg4MCwgMHgwOCwgMHg4MiwgMHgwMCwgMHhhMCwgMHg2MSwgCisweDIwLCAweDY4LCAweDA5LCAweDE4LCAweDliLCAweDE4LCAweDYzLCAweDYwLCAweGMzLCAweDFmLCAweDA1LCAweDNiLCAKKzB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4NTYsIDB4ZmEsIDB4MDEsIDB4MjAsIDB4NzgsIDB4ODAsIDB4MjAsIDB4MWMsIAorMHgwMCwgMHhmMCwgMHg1ZSwgMHhmYiwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHhiOSwgMHg2OCwgCisweDA4LCAweDFhLCAweDc4LCAweDYyLCAweDAwLCAweDIwLCAweGI4LCAweDYyLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAKKzB4ZDksIDB4ZmIsIDB4MjAsIDB4MWMsIDB4MzksIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MDEsIDB4ZjgsIDB4ZWYsIDB4ZTcsIAorMHhmMCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwNCwgMHgxYywgMHgwZiwgMHgxYywgMHg4ZSwgMHg0OCwgMHg0MSwgMHg2OSwgCisweDAxLCAweDMxLCAweDQxLCAweDYxLCAweDAzLCAweDIwLCAweDAwLCAweDA3LCAweDYxLCAweDY4LCAweDA4LCAweDQwLCAKKzB4MDYsIDB4MGYsIDB4MGEsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MjAsIDB4NjgsIDB4MTEsIDB4MTgsIDB4ZmIsIDB4NjgsIAorMHhkMiwgMHgxYSwgMHg3YiwgMHg2OCwgMHg5ZCwgMHgxYSwgMHhjMywgMHgxZiwgMHgwNSwgMHgzYiwgMHgzOCwgMHgxYywgCisweDJhLCAweDFjLCAweDAwLCAweGYwLCAweDI2LCAweGZhLCAweDAwLCAweDIwLCAweDc4LCAweDgwLCAweDIwLCAweDFjLCAKKzB4MDAsIDB4ZjAsIDB4MmUsIDB4ZmIsIDB4NjAsIDB4NjgsIDB4NDAsIDB4MTksIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIAorMHg2MCwgMHg2MCwgMHgzMCwgMHgxYywgMHgwMSwgMHhmMCwgMHhlMCwgMHhmYiwgMHg3ZCwgMHg0ZSwgMHgwYiwgMHgyMywgCisweDFiLCAweDAyLCAweGYwLCAweDE4LCAweDAwLCAweDY5LCAweDAwLCAweDI4LCAweDE5LCAweGQwLCAweDAwLCAweDI1LCAKKzB4MmQsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZjAsIDB4MTgsIDB4YzAsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MTIsIDB4ZDAsIAorMHhhYSwgMHgwMCwgMHg5MiwgMHgxOSwgMHgyZCwgMHgyMywgMHg5YiwgMHgwMSwgMHhkMiwgMHgxOCwgMHhkMiwgMHg2OCwgCisweDIwLCAweDFjLCAweDM5LCAweDFjLCAweDAxLCAweGYwLCAweDFjLCAweGZlLCAweDAxLCAweDM1LCAweGE4LCAweDAwLCAKKzB4ODAsIDB4MTksIDB4MmQsIDB4MjMsIDB4OWIsIDB4MDEsIDB4YzAsIDB4MTgsIDB4YzAsIDB4NjgsIDB4MDAsIDB4MjgsIAorMHhlYywgMHhkMSwgMHhmOCwgMHg2YiwgMHgwMSwgMHgxZiwgMHg4YSwgMHgxYywgMHhmYSwgMHg2MywgMHhmYSwgMHg2OCwgCisweDdkLCAweDZjLCAweDAwLCAweGYwLCAweGJiLCAweGY5LCAweGMwLCAweDQzLCAweDAxLCAweDA0LCAweDA5LCAweDBjLCAKKzB4MjgsIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4MTAsIDB4ZmYsIDB4MDMsIDB4OTAsIDB4ZjksIDB4NmIsIDB4M2EsIDB4NmUsIAorMHg4ZSwgMHgxOCwgMHgyMCwgMHg2OCwgMHgxMiwgMHgxOCwgMHgwMSwgMHg5MiwgMHg3YSwgMHg2ZSwgMHg4ZCwgMHgxOCwgCisweDExLCAweDE4LCAweDAyLCAweDkxLCAweGM4LCAweDFkLCAweDA5LCAweDMwLCAweGUwLCAweDYwLCAweGIxLCAweDg4LCAKKzB4MDgsIDB4MDIsIDB4MDksIDB4MGEsIDB4MDksIDB4MDYsIDB4MDksIDB4MGUsIDB4MDgsIDB4NDMsIDB4MDAsIDB4MDQsIAorMHgwMCwgMHgwYywgMHg3OCwgMHg2MSwgMHg2OCwgMHg2OCwgMHgwMSwgMHgwZSwgMHhmZiwgMHgyMiwgMHgxMiwgMHgwNCwgCisweDAyLCAweDQwLCAweDEyLCAweDBhLCAweDExLCAweDQzLCAweGZmLCAweDIyLCAweDEyLCAweDAyLCAweDAyLCAweDQwLCAKKzB4MTIsIDB4MDIsIDB4MTEsIDB4NDMsIDB4MDAsIDB4MDYsIDB4MDgsIDB4NDMsIDB4MzgsIDB4NjEsIDB4YTgsIDB4ODksIAorMHgwOSwgMHgyMywgMHgxYiwgMHgwMiwgMHgxOCwgMHg0MCwgMHhiOCwgMHg2MSwgCisweGE4LCAweDg5LCAweDk4LCAweDQzLCAweGE4LCAweDgxLCAweGE4LCAweDg5LCAweDAyLCAweDk5LCAweGMwLCAweDQ2LCAKKzB4ODgsIDB4ODEsIDB4MDAsIDB4MjAsIDB4NzAsIDB4ODAsIDB4YjAsIDB4ODAsIDB4NzAsIDB4ODEsIDB4NjgsIDB4NjAsIAorMHgyOCwgMHg4MiwgMHhiOSwgMHg2ZSwgMHgzMCwgMHgxYywgMHhmYywgMHhmNywgMHhlOCwgMHhmZSwgMHgzOCwgMHg4NiwgCisweGZhLCAweDY5LCAweDMwLCAweDFjLCAweDI5LCAweDFjLCAweGZjLCAweGY3LCAweDAzLCAweGZmLCAweDc4LCAweDg2LCAKKzB4M2QsIDB4OGUsIDB4NzgsIDB4OGUsIDB4MDMsIDB4OTksIDB4ZmMsIDB4ZjcsIDB4YzgsIDB4ZmUsIDB4MDAsIDB4OTAsIAorMHg2MCwgMHg2OCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgzOSwgMHg2ZSwgMHg0MSwgMHgxYSwgMHgwOSwgMHgwNCwgCisweDA5LCAweDBjLCAweDdhLCAweDZlLCAweDgyLCAweDFhLCAweDEzLCAweDA0LCAweDFiLCAweDBjLCAweDFhLCAweDAyLCAKKzB4MWIsIDB4MGEsIDB4MWEsIDB4NDMsIDB4MTYsIDB4MDQsIDB4MzYsIDB4MGMsIDB4YmEsIDB4NjgsIDB4ODIsIDB4NDIsIAorMHgwMSwgMHhkMiwgMHgwMCwgMHgyMCwgMHgwMCwgMHhlMCwgMHgxMCwgMHgxYSwgMHhiOCwgMHg2MCwgMHgwOCwgMHgwMiwgCisweDA5LCAweDEyLCAweDA5LCAweDA2LCAweDA5LCAweDBlLCAweDA4LCAweDQzLCAweDAxLCAweDA0LCAweDA5LCAweDBjLCAKKzB4MDEsIDB4OTgsIDB4YzAsIDB4NDYsIDB4NDEsIDB4ODAsIDB4MjgsIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4YTMsIDB4ZmUsIAorMHgwNSwgMHgxYywgMHgwMCwgMHg5OCwgMHgzMSwgMHgxYywgMHhmYywgMHhmNywgMHg5ZSwgMHhmZSwgMHgwNiwgMHgxYywgCisweDc4LCAweDY5LCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDAxLCAweDAyLCAweDAwLCAweDBhLCAweDA4LCAweDQzLCAKKzB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MDEsIDB4OTgsIDB4YzAsIDB4NDYsIDB4ODEsIDB4ODAsIDB4MjgsIDB4MWMsIAorMHhmYywgMHhmNywgMHg4ZiwgMHhmZSwgMHg3OSwgMHg2OSwgMHgwMSwgMHgzMSwgMHhjMCwgMHg0MywgMHg3OSwgMHg2MSwgCisweDAxLCAweDlhLCAweGMwLCAweDQ2LCAweDUwLCAweDgxLCAweDM4LCAweDY5LCAweDAxLCAweDBlLCAweGZmLCAweDIyLCAKKzB4MTIsIDB4MDQsIDB4MDIsIDB4NDAsIDB4MTIsIDB4MGEsIDB4MTEsIDB4NDMsIDB4ZmYsIDB4MjIsIDB4MTIsIDB4MDIsIAorMHgwMiwgMHg0MCwgMHgxMiwgMHgwMiwgMHgxMSwgMHg0MywgMHgwMCwgMHgwNiwgMHgwMSwgMHg0MywgMHgzMCwgMHgxYywgCisweGZjLCAweGY3LCAweDc3LCAweGZlLCAweDM5LCAweDY5LCAweDdhLCAweDY4LCAweDg5LCAweDE4LCAweDM5LCAweDYxLCAKKzB4YjksIDB4NjgsIDB4MDAsIDB4MjksIDB4MDksIDB4ZDEsIDB4MDIsIDB4OTksIDB4ODksIDB4ODksIDB4YmEsIDB4NjksIAorMHgxMSwgMHg0MywgMHgwMiwgMHg5YSwgMHhjMCwgMHg0NiwgMHg5MSwgMHg4MSwgMHhiOSwgMHg2OSwgMHhmYywgMHhmNywgCisweDY2LCAweGZlLCAweDIwLCAweDgyLCAweDAwLCAweDIwLCAweDYwLCAweDgyLCAweGY4LCAweDZkLCAweDQxLCAweDA4LCAKKzB4MTYsIDB4ZDMsIDB4ODAsIDB4MGEsIDB4MGEsIDB4ZDMsIDB4NjAsIDB4NjgsIDB4MTAsIDB4MzgsIDB4MDEsIDB4MDQsIAorMHgwOSwgMHgwYywgMHgwOCwgMHgwMiwgMHgwOSwgMHgwYSwgMHgwOCwgMHg0MywgMHgyMSwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDA4LCAweDgyLCAweDA5LCAweGUwLCAweDYwLCAweDY4LCAweDBjLCAweDM4LCAweDAxLCAweDA0LCAweDA5LCAweDBjLCAKKzB4MDgsIDB4MDIsIDB4MDksIDB4MGEsIDB4MDgsIDB4NDMsIDB4MjEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4ODgsIDB4ODEsIAorMHgwNCwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGYxLCAweGI1LCAweDg0LCAweGIwLCAweDZlLCAweDRkLCAweDI4LCAweDY5LCAKKzB4MDEsIDB4MjIsIDB4MDQsIDB4OTksIDB4OGEsIDB4NDAsIDB4OTAsIDB4NDMsIDB4MjgsIDB4NjEsIDB4MDQsIDB4OTgsIAorMHg0MywgMHgwMSwgMHgxOCwgMHgxYSwgMHg4MCwgMHgwMCwgMHgxNiwgMHgxYywgMHg2OSwgMHg0OSwgMHg0NCwgMHgxOCwgCisweGUwLCAweDZiLCAweGMwLCAweDQ2LCAweDAwLCAweDkwLCAweGEwLCAweDY4LCAweDAwLCAweDI4LCAweDAxLCAweGQxLCAKKzB4MDAsIDB4MjYsIDB4MjYsIDB4ZTAsIDB4NjUsIDB4NDgsIDB4NDEsIDB4NjksIDB4MDEsIDB4MzEsIDB4NDEsIDB4NjEsIAorMHgwNCwgMHg5OCwgMHhmYywgMHhmNywgMHgwOSwgMHhmZCwgMHgwNywgMHgxYywgMHgwMywgMHhkMSwgMHgyOCwgMHg2OSwgCisweDMwLCAweDQzLCAweDI4LCAweDYxLCAweGI1LCAweGUwLCAweGEwLCAweDY4LCAweDY1LCAweDY4LCAweGE4LCAweDQyLCAKKzB4MDAsIDB4ZDIsIDB4MDUsIDB4MWMsIDB4YTEsIDB4NmMsIDB4YTksIDB4NDIsIDB4MTYsIDB4ZDIsIDB4NDAsIDB4MWEsIAorMHg2MiwgMHg2YSwgMHgxMCwgMHgxYSwgMHgwMCwgMHgyNiwgMHg2MCwgMHg2MiwgMHhhNiwgMHg2MCwgMHhhNiwgMHg2MiwgCisweDIwLCAweDg4LCAweDQ4LCAweDIzLCAweDE4LCAweDQzLCAweDIwLCAweDgwLCAweDBkLCAweDFjLCAweDA5LCAweGQxLCAKKzB4MzgsIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4MTksIDB4ZmQsIDB4MDMsIDB4MjAsIDB4NjAsIDB4ODAsIDB4NjYsIDB4NjAsIAorMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgMHg4ZCwgMHhmOSwgMHg5NiwgMHhlMCwgMHhlMSwgMHg2OCwgMHgzOCwgMHg2OCwgCisweDA5LCAweDE4LCAweGMzLCAweDFmLCAweDA1LCAweDNiLCAweDIwLCAweDFjLCAweDAyLCAweDM5LCAweDJhLCAweDFjLCAKKzB4MDAsIDB4ZjAsIDB4Y2QsIDB4ZjgsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4ZDcsIDB4ZjksIDB4ZTAsIDB4NjgsIAorMHg0NiwgMHgxOSwgMHg3OCwgMHg2OCwgMHgzMCwgMHg0MywgMHg3OCwgMHg2MCwgMHgwNCwgMHg5OCwgMHgzMSwgMHgxYywgCisweDAxLCAweGYwLCAweDg4LCAweGZhLCAweDIxLCAweDZlLCAweDAwLCAweDk4LCAKKzB4MDgsIDB4MTgsIDB4MDEsIDB4OTAsIDB4NzAsIDB4MWEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4NjEsIDB4NmUsIAorMHg3MSwgMHgxYSwgMHgwYSwgMHgwNCwgMHgxMiwgMHgwYywgMHgxMSwgMHgwMiwgMHgxMiwgMHgwYSwgMHgxMSwgMHg0MywgCisweDA5LCAweDA0LCAweDA5LCAweDBjLCAweDAyLCAweDkxLCAweDAxLCAweDAyLCAweDAwLCAweDBhLCAweDA4LCAweDQzLCAKKzB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MDEsIDB4OTgsIDB4YzAsIDB4NDYsIDB4NDEsIDB4ODAsIDB4MjAsIDB4OGUsIAorMHhmYywgMHhmNywgMHhjYiwgMHhmZCwgMHgwNiwgMHgxYywgMHg2MCwgMHg4ZSwgMHgwMiwgMHg5OSwgMHhmYywgMHhmNywgCisweGM2LCAweGZkLCAweDAzLCAweDkwLCAweDYwLCAweDY5LCAweDAxLCAweDA0LCAweDA5LCAweDBjLCAweDA4LCAweDAyLCAKKzB4MDksIDB4MGEsIDB4MDgsIDB4NDMsIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MDEsIDB4OTgsIDB4YzAsIDB4NDYsIAorMHg4MSwgMHg4MCwgMHgzMCwgMHgxYywgMHhmYywgMHhmNywgMHhiNywgMHhmZCwgMHg2MSwgMHg2OSwgMHgwMSwgMHgzMSwgCisweGMwLCAweDQzLCAweDYxLCAweDYxLCAweDAxLCAweDk5LCAweGMwLCAweDQ2LCAweDQ4LCAweDgxLCAweDYwLCAweDZlLCAKKzB4MDAsIDB4OTksIDB4NDYsIDB4MTgsIDB4MjAsIDB4NjksIDB4MDEsIDB4MGUsIDB4ZmYsIDB4MjIsIDB4MTIsIDB4MDQsIAorMHgwMiwgMHg0MCwgMHgxMiwgMHgwYSwgMHgxMSwgMHg0MywgMHhmZiwgMHgyMiwgMHgxMiwgMHgwMiwgMHgwMiwgMHg0MCwgCisweDEyLCAweDAyLCAweDExLCAweDQzLCAweDAwLCAweDA2LCAweDAxLCAweDQzLCAweDcxLCAweDYwLCAweDAzLCAweDk4LCAKKzB4ZmMsIDB4ZjcsIDB4OWIsIDB4ZmQsIDB4MjEsIDB4NjksIDB4NDksIDB4MTksIDB4MjEsIDB4NjEsIDB4YTEsIDB4NjgsIAorMHg0OSwgMHgxYiwgMHhhMSwgMHg2MCwgMHgwNiwgMHhkMSwgMHhiMSwgMHg4OSwgMHhhMiwgMHg2OSwgMHgxMSwgMHg0MywgCisweGIxLCAweDgxLCAweGExLCAweDY5LCAweGZjLCAweGY3LCAweDhkLCAweGZkLCAweDM4LCAweDgyLCAweDYxLCAweDZlLCAKKzB4MzgsIDB4NjgsIDB4MDksIDB4MTgsIDB4MGUsIDB4MzEsIDB4ZjksIDB4NjAsIDB4ZTIsIDB4NjgsIDB4MDAsIDB4OTksIAorMHgwNCwgMHgzOCwgMHgwMCwgMHhmMCwgMHg0YywgMHhmOCwgMHgwMiwgMHgyMCwgMHg3OCwgMHg4MiwgMHhlMCwgMHg2ZCwgCisweDQxLCAweDA4LCAweDE2LCAweGQzLCAweDgwLCAweDBhLCAweDBhLCAweGQzLCAweDc4LCAweDY4LCAweDEwLCAweDM4LCAKKzB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MDgsIDB4MDIsIDB4MDksIDB4MGEsIDB4MDgsIDB4NDMsIDB4MzksIDB4NjgsIAorMHhjMCwgMHg0NiwgMHhjOCwgMHg4MSwgMHgwOSwgMHhlMCwgMHg3OCwgMHg2OCwgMHgwYywgMHgzOCwgMHgwMSwgMHgwNCwgCisweDA5LCAweDBjLCAweDA4LCAweDAyLCAweDA5LCAweDBhLCAweDA4LCAweDQzLCAweDM5LCAweDY4LCAweGMwLCAweDQ2LCAKKzB4NDgsIDB4ODEsIDB4MDUsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHhkMCwgMHgyYywgMHgwMCwgMHg4MCwgMHg1YywgMHgyYiwgMHgwMCwgMHg4MCwgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgCisweGY3LCAweGI1LCAweDAzLCAweDFjLCAweDBmLCAweDFjLCAweDAwLCAweDIwLCAweDFjLCAweDY4LCAweDI2LCAweDA0LCAKKzB4MzEsIDB4MWMsIDB4MWQsIDB4MWQsIDB4ZmMsIDB4ZjcsIDB4NTEsIDB4ZmQsIDB4NDAsIDB4YzcsIDB4MDIsIDB4OWEsIAorMHhkMSwgMHgxYywgMHg4OSwgMHgwOCwgMHgwMSwgMHgzOSwgMHg0YSwgMHgxZSwgMHgwMiwgMHg5MiwgMHgwMCwgMHgyOSwgCisweDBkLCAweGQwLCAweDIxLCAweDBjLCAweDEwLCAweGNkLCAweDIyLCAweDA0LCAweDBhLCAweDQzLCAweDExLCAweDFjLCAKKzB4MTYsIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4NDAsIDB4ZmQsIDB4NDAsIDB4YzcsIDB4MDIsIDB4OTksIDB4NGEsIDB4MWUsIAorMHgwMiwgMHg5MiwgMHgwMCwgMHgyOSwgMHhmMSwgMHhkMSwgMHgwMywgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDgwLCAweDA4LCAweDgwLCAweDAwLCAweDg5LCAweDA4LCAweDg5LCAweDAwLCAweDAzLCAweDMyLCAKKzB4OTMsIDB4MDgsIDB4NWEsIDB4MWUsIDB4MDAsIDB4MmIsIDB4MDUsIDB4ZDAsIDB4MDgsIDB4YzksIDB4MDgsIDB4YzAsIAorMHgxMywgMHgxYywgMHgwMSwgMHgzYSwgMHgwMCwgMHgyYiwgMHhmOSwgMHhkMSwgMHg3MCwgMHg0NywgMHhmZiwgMHhiNSwgCisweDg2LCAweGIwLCAweDE3LCAweDFjLCAweDAwLCAweDI2LCAweDA2LCAweDk4LCAweDgwLCAweDZjLCAweGMwLCAweDFiLCAKKzB4MDYsIDB4OTksIDB4YzAsIDB4NDYsIDB4ODgsIDB4NjQsIDB4MDEsIDB4MjAsIDB4YzAsIDB4MDUsIDB4MDYsIDB4OTksIAorMHg4OSwgMHg2YiwgMHhjMCwgMHg0NiwgMHgwMSwgMHg5MSwgMHgwNiwgMHg5OSwgMHg0YywgMHg2YiwgMHg2NywgMHhlMCwgCisweDIxLCAweDY4LCAweGMwLCAweDQ2LCAweDAyLCAweDkxLCAweDYxLCAweDY4LCAweGMwLCAweDQ2LCAweDAzLCAweDkxLCAKKzB4YTEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDQsIDB4OTEsIDB4MDIsIDB4YTksIDB4NDksIDB4ODgsIDB4YjksIDB4NDIsIAorMHgwOCwgMHhkMiwgMHgwMiwgMHhhZCwgMHg2ZCwgMHg4OCwgMHgwMiwgMHhhOSwgMHg0OSwgMHg4OCwgMHg3ZiwgMHgxYSwgCisweDAwLCAweDIxLCAweDAyLCAweGFiLCAweDU5LCAweDgwLCAweDE5LCAweGUwLCAweDAyLCAweGE5LCAweDQ5LCAweDg4LCAKKzB4YzksIDB4MWIsIDB4MDIsIDB4YWIsIDB4NTksIDB4ODAsIDB4M2QsIDB4MWMsIDB4MDAsIDB4MjcsIDB4MDEsIDB4MjEsIAorMHg0OSwgMHgwNiwgMHgwNywgMHg5YiwgMHg5YSwgMHgwNywgMHg5MiwgMHgwZiwgMHgwZCwgMHhkMCwgMHhlYiwgMHgwNiwgCisweGRiLCAweDBlLCAweDA4LCAweGQwLCAweDFlLCAweDJiLCAweDA4LCAweGQzLCAweDFlLCAweDJiLCAweDAyLCAweGQxLCAKKzB4MDMsIDB4MmEsIDB4MDQsIDB4ZDEsIDB4MDEsIDB4ZTAsIDB4MDIsIDB4MmEsIAorMHgwMSwgMHhkMywgMHgwMSwgMHgyNiwgMHgwMCwgMHgyMSwgMHgyOSwgMHg0MywgMHgwMSwgMHg0MywgMHgwYSwgMHgxYywgCisweDAwLCAweDkxLCAweDAwLCAweDIwLCAweDAzLCAweDk5LCAweDA0LCAweDlhLCAweDA3LCAweDliLCAweDAxLCAweGYwLCAKKzB4NWIsIDB4ZmYsIDB4MDcsIDB4OTksIDB4NDksIDB4MTksIDB4MDcsIDB4OTEsIDB4MDAsIDB4MmUsIDB4MGEsIDB4ZDAsIAorMHgxZCwgMHg0YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgMHgxZCwgMHg0OCwgMHgwMSwgMHg2ZCwgMHg0MiwgMHg2ZCwgCisweDAwLCAweDIwLCAweDA3LCAweDliLCAweDAxLCAweGYwLCAweDRjLCAweGZmLCAweDAwLCAweDI2LCAweDAyLCAweGE4LCAKKzB4NDAsIDB4ODgsIDB4MDAsIDB4MjgsIDB4MGMsIDB4ZDAsIDB4MDMsIDB4OTgsIDB4NDAsIDB4MTksIDB4MDMsIDB4OTAsIAorMHgwMiwgMHg5OCwgMHhjMCwgMHg0NiwgMHgyMCwgMHg2MCwgMHgwMywgMHg5OCwgMHhjMCwgMHg0NiwgMHg2MCwgMHg2MCwgCisweDA0LCAweDk4LCAweGMwLCAweDQ2LCAweGEwLCAweDYwLCAweDAzLCAweGUwLCAweDAxLCAweDk4LCAweDAxLCAweDM4LCAKKzB4MDEsIDB4OTAsIDB4MTAsIDB4MzQsIDB4MDYsIDB4OTgsIDB4YzAsIDB4NDYsIDB4NDQsIDB4NjMsIDB4MDEsIDB4OTgsIAorMHgwNiwgMHg5OSwgMHhjMCwgMHg0NiwgMHg4OCwgMHg2MywgMHgwMCwgMHgyMCwgMHgwMCwgMHgyZiwgMHgwMiwgMHhkMCwgCisweDAxLCAweDk5LCAweDAwLCAweDI5LCAweDkyLCAweGQxLCAweDA5LCAweDRhLCAweGMwLCAweDQ2LCAweDAwLCAweDkyLCAKKzB4MDYsIDB4NDgsIDB4MDEsIDB4NmQsIDB4NDIsIDB4NmQsIDB4MDAsIDB4MjAsIDB4MDksIDB4OWIsIDB4MDEsIDB4ZjAsIAorMHgxZiwgMHhmZiwgMHgwYSwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDdjLCAweDI5LCAweDAwLCAweDgwLCAweDA0LCAweDAwLCAweDUzLCAweDAyLCAKKzB4OTAsIDB4YjUsIDB4MGMsIDB4MWMsIDB4MDcsIDB4MWMsIDB4MzgsIDB4NjgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHgwOCwgMHgzOCwgMHgxOCwgMHg0MywgMHgwMSwgMHg2OCwgMHgzOCwgMHg4YSwgMHhmYywgMHhmNywgMHg4NSwgMHhmYywgCisweGMwLCAweDQzLCAweGY5LCAweDY4LCAweGMwLCAweDQ2LCAweDA4LCAweDgwLCAweDc4LCAweDhhLCAweDM5LCAweDY4LCAKKzB4MDgsIDB4MWEsIDB4MzgsIDB4NjAsIDB4MzgsIDB4MWMsIDB4MDEsIDB4ZjAsIDB4OGIsIDB4ZjksIDB4MzgsIDB4MWMsIAorMHhmYywgMHhmNywgMHg4YywgMHhmYiwgMHgyMCwgMHgxYywgMHhmZiwgMHhmNywgMHgzMywgMHhmZSwgMHg5MCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDgwLCAweGI1LCAweDAxLCAweDg4LCAweDhhLCAweDA5LCAweDIxLCAweGQzLCAKKzB4Y2EsIDB4MDksIDB4MWYsIDB4ZDIsIDB4OGEsIDB4MDgsIDB4MWQsIDB4ZDMsIDB4MDAsIDB4MjEsIDB4MDEsIDB4ODAsIAorMHg0MSwgMHg4MCwgMHg0NywgMHg2ZiwgMHg0MCwgMHg2ZCwgMHhmYSwgMHgxZCwgMHgxOSwgMHgzMiwgMHg1MSwgMHg3MSwgCisweGZhLCAweDZkLCAweGMwLCAweDQ2LCAweDEwLCAweDYwLCAweDNhLCAweDZlLCAweGMwLCAweDQ2LCAweDEwLCAweDYwLCAKKzB4MGMsIDB4NDgsIDB4YzAsIDB4NDYsIDB4ODEsIDB4NjMsIDB4YzEsIDB4NmIsIDB4NDksIDB4MDgsIDB4NDksIDB4MDAsIAorMHhjMSwgMHg2MywgMHgwMSwgMHgyMCwgMHgwMCwgMHhmMCwgMHhjYywgMHhmZiwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgCisweDZiLCAweGZmLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDgwLCAweDIzLCAweDE5LCAweDQzLCAKKzB4MDEsIDB4ODAsIDB4MDEsIDB4ODgsIDB4NDksIDB4MDksIDB4ZjYsIDB4ZDIsIDB4MDAsIDB4ZjAsIDB4YjAsIDB4ZjgsIAorMHhmMywgMHhlNywgMHgwMCwgMHgwMCwgMHhlOCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhmMCwgMHhiNSwgMHgwNywgMHgxYywgCisweDEwLCAweDFjLCAweDBkLCAweDFjLCAweDAwLCAweDI0LCAweDVlLCAweDFlLCAweDAwLCAweDJiLCAweDE5LCAweGQwLCAKKzB4MDEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MzksIDB4NjAsIDB4NDEsIDB4ODgsIDB4MGMsIDB4MTksIDB4NDEsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHg3OSwgMHg2MCwgMHg4MSwgMHg2OCwgMHhjMCwgMHg0NiwgMHhiOSwgMHg2MCwgMHhjMSwgMHg2OCwgCisweGMwLCAweDQ2LCAweGY5LCAweDYwLCAweDEwLCAweDMwLCAweDEwLCAweDM3LCAweGU5LCAweDZhLCAweDgxLCAweDQyLCAKKzB4MDIsIDB4ZDgsIDB4MjgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4ZWMsIDB4ZmYsIDB4MzEsIDB4MWMsIDB4MDEsIDB4M2UsIAorMHgwMCwgMHgyOSwgMHhlNSwgMHhkMSwgMHgyMCwgMHgxYywgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDAwLCAweDIxLCAweGMxLCAweDYxLCAweDA1LCAweDQ5LCAweDBhLCAweDY4LCAweDAwLCAweDJhLCAweDAxLCAweGQxLCAKKzB4MDgsIDB4NjAsIDB4MDIsIDB4ZTAsIDB4NGEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZDAsIDB4NjEsIDB4NDgsIDB4NjAsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHhkMCwgMHgyYywgMHgwMCwgMHg4MCwgMHgwMywgMHg0OSwgMHgwOCwgMHg2OCwgCisweDAwLCAweDI4LCAweDAyLCAweGQwLCAweGMyLCAweDY5LCAweGMwLCAweDQ2LCAweDBhLCAweDYwLCAweDcwLCAweDQ3LCAKKzB4ZDAsIDB4MmMsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MjEsIDB4ODEsIDB4NjcsIDB4MDUsIDB4NDksIDB4OGEsIDB4NjgsIAorMHgwMCwgMHgyYSwgMHgwMSwgMHhkMSwgMHg4OCwgMHg2MCwgMHgwMiwgMHhlMCwgMHhjYSwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDkwLCAweDY3LCAweGM4LCAweDYwLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweGQwLCAweDJjLCAweDAwLCAweDgwLCAKKzB4MDMsIDB4NDksIDB4ODgsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MDIsIDB4ZDAsIDB4ODIsIDB4NmYsIDB4YzAsIDB4NDYsIAorMHg4YSwgMHg2MCwgMHg3MCwgMHg0NywgMHhkMCwgMHgyYywgMHgwMCwgMHg4MCwgCisweDAwLCAweGI1LCAweDgwLCAweDIwLCAweDEzLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweGZmLCAweGY3LCAKKzB4ZDUsIDB4ZmYsIDB4MDAsIDB4MjgsIDB4MWIsIDB4ZDAsIDB4MDMsIDB4MjMsIDB4MWIsIDB4MDcsIDB4NDEsIDB4NjgsIAorMHgxOSwgMHg0MCwgMHgwYSwgMHgwZiwgMHg1MSwgMHgwMSwgMHg4OSwgMHgxYSwgMHg4OSwgMHgwMCwgMHgwZCwgMHg0YiwgCisweGM5LCAweDE4LCAweDRiLCAweDg4LCAweDAwLCAweDJiLCAweDA0LCAweGQxLCAweDExLCAweDFjLCAweGZmLCAweGY3LCAKKzB4M2IsIDB4ZmYsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDEsIDB4MmIsIDB4MDIsIDB4ZDEsIDB4ZmYsIDB4ZjcsIAorMHgwNSwgMHhmYywgMHhmOCwgMHhlNywgMHgwMiwgMHgyYiwgMHhmNiwgMHhkMSwgMHhmZiwgMHhmNywgMHg0ZSwgMHhmYiwgCisweGYzLCAweGU3LCAweDA0LCAweDQ4LCAweDAxLCAweDZkLCAweDAxLCAweDMxLCAweDAxLCAweDY1LCAweGVlLCAweGU3LCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIDB4NWMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIAorMHgwMCwgMHhiNSwgMHgyMCwgMHgyMCwgMHgwZCwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHhmZiwgMHhmNywgCisweGJmLCAweGZmLCAweDAwLCAweDI4LCAweDBlLCAweGQwLCAweDAxLCAweDg4LCAweDIwLCAweDIzLCAweDE5LCAweDQzLCAKKzB4MDEsIDB4ODAsIDB4MDEsIDB4ODgsIDB4MTAsIDB4MjMsIDB4OTksIDB4NDMsIDB4MDEsIDB4ODAsIDB4MDEsIDB4ODgsIAorMHgwOSwgMHgwYSwgMHgwMSwgMHhkMywgMHhmZiwgMHhmNywgMHgyZSwgMHhmZiwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDAzLCAweDQ4LCAweDAxLCAweDZkLCAweDAxLCAweDMxLCAweDAxLCAweDY1LCAweGY4LCAweGU3LCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4OTgsIDB4YjUsIDB4MDcsIDB4MWMsIAorMHgyMiwgMHg0OCwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MCwgMHgyMiwgMHg0OCwgMHhjMywgMHgxZCwgMHg0MSwgMHgzMywgCisweDQxLCAweDZkLCAweDgyLCAweDZkLCAweDgwLCAweDZjLCAweDAwLCAweDAzLCAweDAwLCAweDBiLCAweDljLCAweDY4LCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MjMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4OTgsIDB4NDIsIDB4MDAsIDB4ZDEsIAorMHgwYywgMHhlMCwgMHg5OCwgMHg0MiwgMHgwMywgMHhkOSwgMHgxMCwgMHgxYSwgMHg1OSwgMHgxYSwgMHg0MSwgMHgxOCwgCisweDAwLCAweGUwLCAweDE5LCAweDFhLCAweDAxLCAweDIwLCAweDEwLCAweDI5LCAweDAwLCAweGQ4LCAweDAwLCAweDIwLCAKKzB4MDAsIDB4MjgsIDB4MWYsIDB4ZDAsIDB4NzgsIDB4NmEsIDB4ZjksIDB4NmEsIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIAorMHhiOCwgMHg2YSwgMHhmOSwgMHg2YSwgMHhjMCwgMHg0NiwgMHg0OCwgMHg2MCwgMHgxMCwgMHg0YSwgMHhjMCwgMHg0NiwgCisweDAwLCAweDkyLCAweGZiLCAweDZhLCAweDBmLCAweDQ4LCAweDQyLCAweDZkLCAweDAzLCAweDIwLCAweDM5LCAweDZhLCAKKzB4MDEsIDB4ZjAsIDB4ZTIsIDB4ZmQsIDB4MzgsIDB4ODgsIDB4MTAsIDB4MjMsIDB4MTgsIDB4NDMsIDB4MzgsIDB4ODAsIAorMHgzOCwgMHg4OCwgMHg0MCwgMHgyMywgMHg5OCwgMHg0MywgMHgzOCwgMHg4MCwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgCisweDU1LCAweGZmLCAweDk4LCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDM4LCAweDg4LCAweDQwLCAweDIzLCAKKzB4MTgsIDB4NDMsIDB4MzgsIDB4ODAsIDB4ZjcsIDB4ZTcsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIAorMHhhOCwgMHgwMywgMHgwMCwgMHg4MCwgMHgwOCwgMHgwMCwgMHgxMSwgMHgwMiwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgCisweGIwLCAweGI1LCAweDQwLCAweDIwLCAweDJjLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDAwLCAweGYwLCAKKzB4ZmQsIDB4ZmUsIDB4MDcsIDB4MWMsIDB4NDAsIDB4NjgsIDB4MDMsIDB4MjMsIDB4MWIsIDB4MDcsIDB4MTgsIDB4NDAsIAorMHgwNSwgMHgwZiwgMHg2OCwgMHgwMSwgMHg0MCwgMHgxYiwgMHg4MCwgMHgwMCwgMHgyNiwgMHg0OSwgMHg0NCwgMHgxOCwgCisweDIwLCAweDg4LCAweDAyLCAweDIzLCAweDE4LCAweDQzLCAweDIwLCAweDgwLCAweDIwLCAweDg4LCAweDQxLCAweDA4LCAKKzB4MzQsIDB4ZDMsIDB4NDAsIDB4MDgsIDB4NDAsIDB4MDAsIDB4MjAsIDB4ODAsIDB4YTAsIDB4NmMsIDB4ZTEsIDB4NmMsIAorMHg0MCwgMHgxOCwgMHhhMCwgMHg2NCwgMHgwMCwgMHgyMCwgMHhlMCwgMHg2NCwgMHhhMSwgMHg2YiwgMHgyMiwgMHg2ZCwgCisweDg5LCAweDE4LCAweGExLCAweDYzLCAweDIwLCAweDY1LCAweGI4LCAweDZhLCAweGMwLCAweDQ2LCAweDYwLCAweDY1LCAKKzB4MDMsIDB4MjMsIDB4MWIsIDB4MDcsIDB4NzgsIDB4NjgsIDB4MTgsIDB4NDAsIDB4NzgsIDB4NjAsIDB4NjEsIDB4NjgsIAorMHgzNiwgMHgzMSwgMHg5NCwgMHgyOSwgMHgwNCwgMHhkOCwgMHgzOCwgMHgyMywgMHgxOCwgMHg0MywgMHg3OCwgMHg2MCwgCisweDM4LCAweDIwLCAweDAzLCAweGUwLCAweDk0LCAweDIzLCAweDE4LCAweDQzLCAweDc4LCAweDYwLCAweDk0LCAweDIwLCAKKzB4YjgsIDB4NjEsIDB4MzksIDB4NjgsIDB4NzgsIDB4NjgsIDB4MDIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MjAsIDB4MWMsIAorMHhjYiwgMHgxZiwgMHgwNSwgMHgzYiwgMHhmZiwgMHhmNywgMHhkNywgMHhmZCwgMHgwMiwgMHgyMCwgMHg2MCwgMHg4MCwgCisweDM4LCAweDFjLCAweGZmLCAweGY3LCAweGRmLCAweGZlLCAweGIwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MzgsIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4MDcsIDB4ZmEsIDB4MjgsIDB4MDEsIDB4MDYsIDB4NDksIDB4NDAsIDB4MTgsIAorMHgxOSwgMHgyMywgMHhkYiwgMHgwMSwgMHhjMCwgMHgxOCwgMHg0MSwgMHg2YiwgMHgwMSwgMHgzOSwgMHg0MSwgMHg2MywgCisweGVmLCAweGU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAKKzB4NWMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4YTAsIDB4MWMsIDB4MDAsIDB4ODAsIDB4OTAsIDB4YjUsIDB4MDAsIDB4MjcsIAorMHgwZiwgMHg0YywgMHgwZCwgMHhlMCwgMHg0MiwgMHg2YiwgMHgwMSwgMHgzYSwgMHg0MiwgMHg2MywgMHgwMCwgMHgyYSwgCisweDA1LCAweGRjLCAweDAyLCAweDZiLCAweGMwLCAweDQ2LCAweDQyLCAweDYzLCAweGMwLCAweDZhLCAweDAxLCAweGYwLCAKKzB4YzYsIDB4ZjksIDB4MDEsIDB4MzcsIDB4MGIsIDB4MmYsIDB4MDcsIDB4ZDIsIDB4MzgsIDB4MDEsIDB4MDAsIDB4MTksIAorMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhjMCwgMHgxOCwgMHg4MSwgMHg2YSwgMHgwMCwgMHgyOSwgMHhlOSwgMHhkMSwgCisweDAxLCAweDIwLCAweDQwLCAweDA2LCAweDAzLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDkwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIAorMHgxMCwgMHg0OCwgMHhjMSwgMHg2OCwgMHgwMSwgMHgzMSwgMHhjMSwgMHg2MCwgMHgwZiwgMHg0OSwgMHhjOCwgMHg2OCwgCisweDAxLCAweDI4LCAweDE3LCAweGQxLCAweGM4LCAweDFkLCAweDc5LCAweDMwLCAweDAyLCAweDg5LCAweDAwLCAweDJhLCAKKzB4MTIsIDB4ZDAsIDB4MDEsIDB4M2EsIDB4MDIsIDB4ODEsIDB4MDIsIDB4ODksIDB4MDAsIDB4MmEsIDB4MGQsIDB4ZDEsIAorMHg0MiwgMHg4OSwgMHgwMCwgMHgyYSwgMHgwOCwgMHhkMSwgMHhjOSwgMHg2ZiwgMHgwMiwgMHgyMywgMHgwYSwgMHg2OCwgCisweDFhLCAweDQzLCAweDBhLCAweDYwLCAweDA0LCAweDIxLCAweDAxLCAweDgxLCAweDAxLCAweDIxLCAweDAwLCAweGUwLCAKKzB4MDAsIDB4MjEsIDB4NDEsIDB4ODEsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDgsIDB4ODMsIDB4MjAsIDB4NDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhiMCwgMHhiNSwgMHgwNywgMHgxYywgMHgwMSwgMHgyMywgMHhmOCwgMHgxZCwgCisweDY5LCAweDMwLCAweDAzLCAweDczLCAweDFlLCAweDQ4LCAweGMyLCAweDFkLCAweDc5LCAweDMyLCAweDU0LCAweDhhLCAKKzB4NjEsIDB4MWMsIDB4NTEsIDB4ODIsIDB4ZDUsIDB4OGEsIDB4MDAsIDB4MjEsIDB4YWMsIDB4NDIsIDB4MDQsIDB4ZGIsIAorMHhjNCwgMHgxZCwgMHg4OSwgMHgzNCwgMHg2MywgMHg3MCwgMHg1MSwgMHg4MiwgMHhkMSwgMHg4MywgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweDNhLCAweDZkLCAweDFhLCAweDQzLCAweDEyLCAweDY4LCAweGMwLCAweDQ2LCAweGJhLCAweDYxLCAKKzB4ZmIsIDB4NjksIDB4OWEsIDB4NDIsIDB4MDYsIDB4ZDEsIDB4ZjgsIDB4NmMsIDB4MTIsIDB4NDksIDB4YzAsIDB4NDYsIAorMHgwOCwgMHg2MCwgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg3OSwgMHg2MSwgMHg0MSwgMHg2OSwgCisweGZhLCAweDZjLCAweDkxLCAweDQzLCAweDQxLCAweDYxLCAweDAxLCAweDIwLCAweDAwLCAweDA1LCAweGMxLCAweDYwLCAKKzB4MzgsIDB4NjksIDB4MDIsIDB4MjgsIDB4ZjEsIDB4ZDAsIDB4YjgsIDB4NjksIDB4ZjksIDB4NjksIDB4NDEsIDB4MWEsIAorMHgwMSwgMHhkNSwgMHg3OCwgMHg2ZCwgMHg0MSwgMHgxOCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwZSwgMHhmOCwgCisweGY5LCAweDY5LCAweDA5LCAweDE4LCAweGY5LCAweDYxLCAweDc4LCAweDZkLCAweDgxLCAweDQyLCAweGUyLCAweGQzLCAKKzB4MDgsIDB4MWEsIDB4ZjgsIDB4NjEsIDB4ZGYsIDB4ZTcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHhmOCwgMHhiNSwgMHgwNCwgMHgxYywgMHgwZiwgMHgxYywgMHhmZiwgMHgyMywgCisweDIxLCAweDMzLCAweDlmLCAweDQyLCAweDAxLCAweGQ5LCAweGZmLCAweDI3LCAweDIxLCAweDM3LCAweGUxLCAweDZlLCAKKzB4MzgsIDB4MWMsIDB4MDEsIDB4ZjAsIDB4Y2IsIDB4ZmMsIDB4MmQsIDB4NGQsIDB4MDAsIDB4MjgsIDB4MTMsIDB4ZDEsIAorMHhlMCwgMHgxZCwgMHg0OSwgMHgzMCwgMHgwMSwgMHg3YSwgMHgwMSwgMHgyMywgMHgxOSwgMHg0MywgMHgwMSwgMHg3MiwgCisweDI5LCAweDRhLCAweGMwLCAweDQ2LCAweDAwLCAweDkyLCAweDI5LCAweDQ4LCAweDAxLCAweDZkLCAweDQyLCAweDZkLCAKKzB4MDAsIDB4MjAsIDB4MmIsIDB4MWMsIDB4MDEsIDB4ZjAsIDB4YjAsIDB4ZmMsIDB4MDAsIDB4MjAsIDB4ZjgsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgyMCwgMHg2OSwgMHgwMSwgMHgzMCwgMHgyMCwgMHg2MSwgMHgyMywgMHg0OSwgCisweGM4LCAweDFkLCAweGI5LCAweDMwLCAweDAyLCAweDZiLCAweDkyLCAweDAwLCAweDUxLCAweDE4LCAweGMwLCAweDMxLCAKKzB4MGYsIDB4NjEsIDB4MDEsIDB4NmIsIDB4MDEsIDB4MzEsIDB4ODksIDB4MDcsIDB4ODksIDB4MGYsIDB4MDEsIDB4NjMsIAorMHgyMCwgMHg2YiwgMHhjMiwgMHgxOSwgMHg2MSwgMHg2ZCwgMHg4YSwgMHg0MiwgMHgwMywgMHhkOCwgMHgyMywgMHgyMiwgCisweDEyLCAweDA1LCAweDNhLCAweDQzLCAweDA1LCAweGUwLCAweDA5LCAweDFhLCAweDdlLCAweDFhLCAweDA3LCAweGQxLCAKKzB4MjMsIDB4MjIsIDB4MTIsIDB4MDUsIDB4MGEsIDB4NDMsIDB4MDAsIDB4OTIsIDB4NjEsIDB4NmUsIDB4MDksIDB4MTgsIAorMHhhMiwgMHg2ZSwgMHgxMCwgMHhlMCwgMHgxMSwgMHgyMiwgMHg1MiwgMHgwNSwgMHgwYSwgMHg0MywgMHgwMCwgMHg5MiwgCisweDYxLCAweDZlLCAweDA5LCAweDE4LCAweDAwLCAweDIwLCAweGEyLCAweDZlLCAweDJiLCAweDFjLCAweDAxLCAweGYwLCAKKzB4N2QsIDB4ZmMsIDB4MjMsIDB4MjIsIDB4MTIsIDB4MDUsIDB4MzIsIDB4NDMsIDB4MDAsIDB4OTIsIDB4NjEsIDB4NmUsIAorMHhhMiwgMHg2ZSwgMHgwMCwgMHgyMCwgMHgyYiwgMHgxYywgMHgwMSwgMHhmMCwgMHg3MywgMHhmYywgMHgyMCwgMHg2YiwgCisweGMwLCAweDE5LCAweDAwLCAweDA5LCAweDAwLCAweDAxLCAweDYxLCAweDZkLCAweDgxLCAweDQyLCAweDAwLCAweGQ4LCAKKzB4NDAsIDB4MWEsIDB4MjAsIDB4NjMsIDB4MzgsIDB4MWMsIDB4YjgsIDB4ZTcsIAorMHg0NCwgMHg4MCwgMHgyMCwgMHg0MCwgMHgwNCwgMHgwMCwgMHgxYiwgMHgwMiwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDgwLCAweGI1LCAweDAxLCAweDIwLCAweGMwLCAweDAzLCAweDBkLCAweDQ5LCAKKzB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4MGMsIDB4NDksIDB4YzgsIDB4MWQsIDB4NDksIDB4MzAsIDB4MDIsIDB4N2EsIAorMHgwMCwgMHgyNywgMHgwMCwgMHgyYSwgMHgwMywgMHhkMCwgMHgwNywgMHg3MiwgMHgwOCwgMHgxYywgMHhmZiwgMHhmNywgCisweDM3LCAweGZmLCAweDA4LCAweDQ5LCAweGM4LCAweDFkLCAweDQ5LCAweDMwLCAweDAyLCAweDdhLCAweDAwLCAweDJhLCAKKzB4MDMsIDB4ZDAsIDB4MDcsIDB4NzIsIDB4MDgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4MmQsIDB4ZmYsIDB4ODAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHg2NCwgMHgyZCwgMHgwMCwgMHg4MCwgCisweGU0LCAweDJjLCAweDAwLCAweDgwLCAweDkwLCAweGI1LCAweDA3LCAweDFjLCAweDEwLCAweDIwLCAweDE4LCAweDQ5LCAKKzB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4ZjgsIDB4NjgsIDB4MDEsIDB4MzAsIDB4ZjgsIDB4NjAsIDB4MTYsIDB4NDgsIAorMHhjNCwgMHgxZCwgMHhiOSwgMHgzNCwgMHg2MSwgMHg2YiwgMHg4OSwgMHgwMCwgMHgwOSwgMHgxOCwgMHhjMCwgMHgzMSwgCisweDA5LCAweDY5LCAweDdhLCAweDY4LCAweDkyLCAweDAwLCAweGQyLCAweDE5LCAweDUxLCAweDY0LCAweDYxLCAweDZiLCAKKzB4ODksIDB4MDAsIDB4MDgsIDB4MTgsIDB4YzAsIDB4MzAsIDB4MDEsIDB4NjksIDB4NzgsIDB4NjgsIDB4ODAsIDB4MDAsIAorMHhjMCwgMHgxOSwgMHhjMCwgMHg2YiwgMHgwMSwgMHhmMCwgMHhhMiwgMHhmYSwgMHgwMSwgMHgyMywgMHg3OCwgMHg2OCwgCisweDU4LCAweDQwLCAweDc4LCAweDYwLCAweDYwLCAweDZiLCAweDAxLCAweDMwLCAweDgwLCAweDA3LCAweDgwLCAweDBmLCAKKzB4NjAsIDB4NjMsIDB4ZjgsIDB4MWQsIDB4MTksIDB4MzAsIDB4NDAsIDB4NzksIDB4MDAsIDB4MjgsIDB4MDIsIDB4ZDEsIAorMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwNywgMHhmOCwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDAwLCAweDAwLCAweDAwLCAweGIwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDkwLCAweGI1LCAweDA3LCAweDFjLCAKKzB4MzksIDB4NDgsIDB4YzAsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MDUsIDB4ZDAsIDB4YjgsIDB4NmEsIDB4YzAsIDB4NjgsIAorMHg4MCwgMHgwOSwgMHgwMSwgMHhkMywgMHgwMiwgMHgyMCwgMHgwMCwgMHhlMCwgMHg3OCwgMHg2ZiwgMHhmYywgMHhmNywgCisweDU5LCAweGY4LCAweDA0LCAweDFjLCAweDA2LCAweGQxLCAweDAxLCAweDIwLCAweGY5LCAweDFkLCAweDE5LCAweDMxLCAKKzB4MDgsIDB4NzEsIDB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ZjgsIDB4NmMsIDB4MmYsIDB4NDksIAorMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHhiYSwgMHg2YSwgMHgzOCwgMHgxYywgMHgyMSwgMHgxYywgMHgwMCwgMHhmMCwgCisweDU5LCAweGY4LCAweDY3LCAweDYyLCAweDAwLCAweDI4LCAweDAzLCAweGQxLCAweDIwLCAweDFjLCAweDAwLCAweGYwLCAKKzB4MGIsIDB4ZmQsIDB4ZWMsIDB4ZTcsIDB4ZjksIDB4NmQsIDB4MDksIDB4NjgsIDB4MDksIDB4MTgsIDB4MDksIDB4MDksIAorMHgwOSwgMHgwMSwgMHg3YSwgMHg2ZCwgMHg4YSwgMHg0MiwgMHgwMCwgMHhkOCwgMHg4OSwgMHgxYSwgMHhhMSwgMHg2MiwgCisweGI5LCAweDY4LCAweDg5LCAweDAwLCAweGM5LCAweDE5LCAweDRhLCAweDZjLCAweDAwLCAweDJhLCAweDA3LCAweGQwLCAKKzB4NGEsIDB4NmMsIDB4MTIsIDB4MWEsIDB4NGEsIDB4NjQsIDB4ODAsIDB4MDgsIDB4ODAsIDB4MDAsIDB4YjksIDB4NmEsIAorMHgwOCwgMHgxOCwgMHhiOCwgMHg2MiwgMHgzOCwgMHg2OCwgMHhiOSwgMHg2YSwgMHg4MCwgMHgwMCwgMHhjMCwgMHgxOSwgCisweDQyLCAweDZiLCAweDkxLCAweDQyLCAweDBlLCAweGQzLCAweDAwLCAweDIxLCAweDQxLCAweDY0LCAweGI4LCAweDZhLCAKKzB4MzksIDB4NjgsIDB4ODksIDB4MDAsIDB4YzksIDB4MTksIDB4NDksIDB4NmIsIDB4NDAsIDB4MWEsIDB4YjgsIDB4NjIsIAorMHhiOSwgMHg2OCwgMHg4OSwgMHgwMCwgMHhjOSwgMHgxOSwgMHhjOSwgMHg2YiwgMHg0MCwgMHgxOCwgMHhiOCwgMHg2MiwgCisweGI4LCAweDY4LCAweDgxLCAweDAwLCAweGM5LCAweDE5LCAweDQ5LCAweDZjLCAweDAwLCAweDI5LCAweGI4LCAweGQxLCAKKzB4YjksIDB4NmEsIDB4ZmEsIDB4NmIsIDB4OTEsIDB4NDIsIDB4YjQsIDB4ZDAsIDB4M2EsIDB4NmMsIDB4OTEsIDB4NDIsIAorMHhiMSwgMHhkMCwgMHgwMSwgMHgyMywgMHg1OCwgMHg0MCwgMHhiOCwgMHg2MCwgMHg4MCwgMHgwMCwgMHhjMCwgMHgxOSwgCisweGMwLCAweDZiLCAweGMwLCAweDQ2LCAweGI4LCAweDYyLCAweGY4LCAweDY4LCAweDAwLCAweDI4LCAweDAxLCAweGQwLCAKKzB4MDEsIDB4MzgsIDB4ZjgsIDB4NjAsIDB4MzgsIDB4NjksIDB4MDAsIDB4MjgsIDB4YTEsIDB4ZDAsIDB4MDEsIDB4MzgsIAorMHgzOCwgMHg2MSwgMHg5ZSwgMHhlNywgMHg2OCwgMHgxOSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgCisweGY3LCAweGI1LCAweDkwLCAweGIwLCAweDA0LCAweDFjLCAweDBkLCAweDFjLCAweDAwLCAweDIwLCAweDA1LCAweDkwLCAKKzB4MDIsIDB4OTAsIDB4MDAsIDB4MjIsIDB4MDEsIDB4OTIsIDB4ZjksIDB4NDgsIDB4YzAsIDB4NmEsIDB4YzAsIDB4NDYsIAorMHhhOCwgMHg2MSwgMHhhMCwgMHg2OCwgMHg4MSwgMHgwMCwgMHgwOSwgMHgxOSwgMHg0OSwgMHg2YiwgMHhjMCwgMHg0NiwgCisweDIwLCAweDYwLCAweGUxLCAweDYyLCAweDEyLCAweDlhLCAweGQwLCAweDY4LCAweGMwLCAweDQ2LCAweGE4LCAweDYwLCAKKzB4MTIsIDB4OWEsIDB4NTEsIDB4NzgsIDB4YzAsIDB4NDYsIDB4MGMsIDB4OTEsIDB4ZjAsIDB4NDgsIDB4YzAsIDB4NDYsIAorMHgwMywgMHg5MCwgMHhkNywgMHgxZCwgMHgwOSwgMHgzNywgMHhlMCwgMHg2YSwgCisweGMxLCAweDFiLCAweDA5LCAweDA5LCAweGUzLCAweDFkLCAweDE5LCAweDMzLCAweDBjLCAweDlhLCAweGMwLCAweDQ2LCAKKzB4MGYsIDB4OTMsIDB4ZWIsIDB4NGIsIDB4YzAsIDB4NDYsIDB4MGUsIDB4OTMsIDB4OTEsIDB4NDIsIDB4MDEsIDB4ZDMsIAorMHhiOCwgMHg0MiwgMHgyMSwgMHhkOCwgMHhlMSwgMHg2OCwgMHgwMiwgMHgyOSwgMHgxZSwgMHhkMiwgMHgwMSwgMHgyMCwgCisweDBmLCAweDk5LCAweGMwLCAweDQ2LCAweDQ4LCAweDcxLCAweDAwLCAweDIwLCAweDAzLCAweDk5LCAweDAxLCAweGYwLCAKKzB4NTcsIDB4ZmIsIDB4MDAsIDB4MjgsIDB4MDMsIDB4ZDEsIDB4MGUsIDB4OWIsIDB4ZDgsIDB4NmIsIDB4MDEsIDB4MzAsIAorMHhkOCwgMHg2MywgMHgwMSwgMHgyMCwgMHg4MCwgMHgwNiwgMHgwMCwgMHgyNywgMHg2OCwgMHg2MCwgMHhhZiwgMHg2MSwgCisweGRkLCAweDRhLCAweGMwLCAweDQ2LCAweDAwLCAweDkyLCAweGRkLCAweDQ4LCAweDAxLCAweDZkLCAweDQyLCAweDZkLCAKKzB4ZGMsIDB4NGIsIDB4MDAsIDB4MjAsIDB4MDEsIDB4ZjAsIDB4M2EsIDB4ZmIsIDB4MzgsIDB4MWMsIDB4NWMsIDB4ZTMsIAorMHhiOCwgMHg0MiwgMHgwMywgMHhkOCwgMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgMHg3YiwgMHhmYywgMHgwNywgMHgxYywgCisweGQ3LCAweDQ4LCAweGMwLCAweDY4LCAweDAwLCAweDI4LCAweDY0LCAweGQwLCAweDM4LCAweDc4LCAweDQwLCAweDA3LCAKKzB4NDAsIDB4MGYsIDB4MDMsIDB4MjgsIDB4NjAsIDB4ZDEsIDB4MDUsIDB4OTgsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDYsIAorMHgwMCwgMHgwZSwgMHgwNSwgMHg5MCwgMHgzOCwgMHg3OCwgMHhmMCwgMHgyMywgMHgxOCwgMHg0MCwgMHg1OCwgMHhkMSwgCisweGUwLCAweDZhLCAweGMwLCAweDFiLCAweDAwLCAweDA5LCAweDBjLCAweDk5LCAweDg4LCAweDQyLCAweDAyLCAweGQyLCAKKzB4ZTAsIDB4NjgsIDB4MDIsIDB4MjgsIDB4MDUsIDB4ZDMsIDB4Y2IsIDB4NDksIDB4ODgsIDB4NjgsIDB4MDAsIDB4ZjAsIAorMHg4MywgMHhmZiwgMHgwNiwgMHgxYywgMHgwNiwgMHhkMSwgMHgwMywgMHg5YiwgMHgyOCwgMHgxYywgMHgzOSwgMHgxYywgCisweDIyLCAweDFjLCAweDAwLCAweGYwLCAweDhiLCAweGZjLCAweDE2LCAweGUxLCAweDJlLCAweDYyLCAweGY4LCAweDY4LCAKKzB4MDAsIDB4MjgsIDB4MGQsIDB4ZDAsIDB4YjgsIDB4ODksIDB4MDAsIDB4MjgsIDB4MDMsIDB4ZDAsIDB4YzEsIDB4NDksIAorMHhjOSwgMHg2OCwgMHgwMCwgMHhmMCwgMHg3MCwgMHhmZiwgMHhmOCwgMHg4OSwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMCwgCisweGJkLCAweDQ5LCAweGM5LCAweDY4LCAweDAwLCAweGYwLCAweDY5LCAweGZmLCAweDdhLCAweDY4LCAweGMwLCAweDQ2LCAKKzB4NzIsIDB4NjEsIDB4YjksIDB4NjgsIDB4YzAsIDB4NDYsIDB4YjEsIDB4NjEsIDB4MzAsIDB4MWMsIDB4YjgsIDB4NDksIAorMHgwOSwgMHg2OCwgMHgwMCwgMHhmMCwgMHg1ZSwgMHhmZiwgMHgwMCwgMHgyOCwgMHgxNywgMHhkMSwgMHgzMCwgMHgxYywgCisweGI0LCAweDQ5LCAweDQ5LCAweDY4LCAweDAwLCAweGYwLCAweDU3LCAweGZmLCAweDEwLCAweDM3LCAweGUwLCAweDZhLCAKKzB4YjgsIDB4NDIsIDB4MDMsIDB4ZDgsIDB4MjAsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MjcsIDB4ZmMsIDB4MDcsIDB4MWMsIAorMHg2OCwgMHg2OCwgMHhhZiwgMHg0YiwgMHgxOCwgMHg0MywgMHg2OCwgMHg2MCwgMHgwMCwgMHgyMCwgMHhhOCwgMHg2MSwgCisweGFjLCAweDIzLCAweGE4LCAweDY4LCAweDk4LCAweDQzLCAweGE4LCAweDYwLCAweGIwLCAweGUwLCAweGE4LCAweDY5LCAKKzB4YTgsIDB4MjgsIDB4MDEsIDB4ZDIsIDB4YTgsIDB4MjAsIDB4YTgsIDB4NjEsIDB4MTAsIDB4MzcsIDB4ZTAsIDB4NmEsIAorMHhiOCwgMHg0MiwgMHg2YywgMHhkOCwgMHg5YywgMHhlMCwgMHhhNSwgMHhlMCwgMHhhNCwgMHhlMCwgMHgxMCwgMHgyOCwgCisweDY4LCAweGQxLCAweDAzLCAweDIzLCAweDFiLCAweDA3LCAweDY4LCAweDY4LCAweDE4LCAweDQwLCAweDAxLCAweDBmLCAKKzB4NDgsIDB4MDEsIDB4NDAsIDB4MWEsIDB4ODAsIDB4MDAsIDB4YTAsIDB4NGEsIDB4ODIsIDB4MTgsIDB4MDEsIDB4OTIsIAorMHg3OCwgMHg4OCwgMHg0MiwgMHgwYiwgMHgzMSwgMHhkMywgMHg4MiwgMHgwYiwgMHgyZiwgMHhkMywgMHg5ZCwgMHg0OCwgCisweGMwLCAweDQ2LCAweDAzLCAweDkwLCAweDAyLCAweDIwLCAweDAxLCAweDlhLCAweGMwLCAweDQ2LCAweDEwLCAweDgwLCAKKzB4NzgsIDB4ODgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MGQsIDB4MDEsIDB4OWEsIDB4YzAsIDB4NDYsIDB4NTAsIDB4NjAsIAorMHhiOCwgMHg2OCwgMHgwMSwgMHg5YSwgMHhjMCwgMHg0NiwgMHg5MCwgMHg2MCwgMHg3OCwgMHg2OCwgMHgwMSwgMHg5YSwgCisweGMwLCAweDQ2LCAweDEwLCAweDYyLCAweDAwLCAweDIwLCAweDAxLCAweDlhLCAweGMwLCAweDQ2LCAweDkwLCAweDY0LCAKKzB4MDEsIDB4OWEsIDB4YzAsIDB4NDYsIDB4OTAsIDB4NjMsIDB4ODgsIDB4MDIsIDB4OGYsIDB4NDksIDB4NDAsIDB4MTgsIAorMHgwMSwgMHg5YSwgMHhjMCwgMHg0NiwgMHg1MCwgMHg2MywgMHgwMSwgMHg5YSwgMHg1MCwgMHg2OCwgMHgzNiwgMHgzMCwgCisweDk0LCAweDI4LCAweDAxLCAweGQ4LCAweDM4LCAweDIwLCAweDAwLCAweGUwLCAweDk0LCAweDIwLCAweGE4LCAweDYxLCAKKzB4MTAsIDB4MzcsIDB4ZTAsIDB4NmEsIDB4YjgsIDB4NDIsIDB4MjgsIDB4ZDgsIDB4NTgsIDB4ZTAsIDB4N2EsIDB4ODgsIAorMHg5MiwgMHgwYiwgMHgwMywgMHhkMywgMHg4NSwgMHg0OCwgMHhjMCwgMHg0NiwgMHgwMywgMHg5MCwgMHgyMywgMHhlMCwgCisweDAxLCAweDIyLCAweDEyLCAweDAzLCAweDAyLCAweDQwLCAweDgzLCAweDRiLCAweDFkLCAweGQwLCAweDAzLCAweDkzLCAKKzB4MDAsIDB4MDUsIDB4MDAsIDB4MGQsIDB4MDEsIDB4OWEsIDB4YzAsIDB4NDYsIDB4NTAsIDB4NjAsIDB4YjgsIDB4NjgsIAorMHgwMSwgMHg5YSwgMHhjMCwgMHg0NiwgMHg5MCwgMHg2MCwgMHg3OCwgMHg2OCwgMHgwMSwgMHg5YSwgMHhjMCwgMHg0NiwgCisweDEwLCAweDYyLCAweDAwLCAweDIwLCAweDAxLCAweDlhLCAweGMwLCAweDQ2LCAKKzB4OTAsIDB4NjQsIDB4MDEsIDB4OWEsIDB4YzAsIDB4NDYsIDB4OTAsIDB4NjMsIDB4ODgsIDB4MDIsIDB4NzUsIDB4NDksIAorMHg0MCwgMHgxOCwgMHgwMSwgMHg5YSwgMHhjMCwgMHg0NiwgMHg1MCwgMHg2MywgMHgwMiwgMHhlMCwgMHgzMywgMHhlMCwgCisweDJhLCAweGUwLCAweDAzLCAweDkzLCAweDAxLCAweDIwLCAweDBmLCAweDk5LCAweGMwLCAweDQ2LCAweDQ4LCAweDcxLCAKKzB4MTIsIDB4OWEsIDB4NTAsIDB4NzgsIDB4MDUsIDB4OTksIDB4NDMsIDB4MWEsIDB4MGIsIDB4OTMsIDB4MTAsIDB4MzcsIAorMHhlMCwgMHg2YSwgMHhiOCwgMHg0MiwgMHgwMywgMHhkOCwgMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgMHg5MiwgMHhmYiwgCisweDA3LCAweDFjLCAweDAxLCAweDlhLCAweDUwLCAweDZiLCAweDkxLCAweDZiLCAweDA5LCAweDAxLCAweDQwLCAweDE4LCAKKzB4MGIsIDB4OWIsIDB4MjEsIDB4MWMsIDB4M2EsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4N2QsIDB4ZmIsIDB4MDEsIDB4OWEsIAorMHhjMCwgMHg0NiwgMHhkMCwgMHg2NCwgMHgwMSwgMHg5YSwgMHgwYiwgMHg5YiwgMHhjMCwgMHg0NiwgMHgxMywgMHg2NSwgCisweDAxLCAweDIzLCAweDViLCAweDA2LCAweDY4LCAweDY4LCAweDE4LCAweDQzLCAweDY4LCAweDYwLCAweDAwLCAweDIwLCAKKzB4YTgsIDB4NjEsIDB4MGQsIDB4ZTAsIDB4MTAsIDB4MzcsIDB4ZTAsIDB4NmEsIDB4YjgsIDB4NDIsIDB4MDMsIDB4ZDgsIAorMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgMHg3MSwgMHhmYiwgMHgwNywgMHgxYywgMHgzOCwgMHg3OCwgMHg0MCwgMHgwNywgCisweDQwLCAweDBmLCAweDAzLCAweDI4LCAweDAwLCAweGQxLCAweGY4LCAweGU2LCAweGE4LCAweDY5LCAweDAzLCAweDk5LCAKKzB4MDEsIDB4ZjAsIDB4MjYsIDB4ZmEsIDB4MDAsIDB4MjgsIDB4MmEsIDB4ZDEsIDB4MzgsIDB4MWMsIDB4MjEsIDB4MWMsIAorMHgwMCwgMHhmMCwgMHg3OSwgMHhmYiwgMHhhOCwgMHg2OCwgMHg4MCwgMHgwOSwgMHgwNCwgMHhkMywgMHgzMCwgMHgxYywgCisweDQ5LCAweDQ5LCAweDQ5LCAweDY4LCAweDAwLCAweGYwLCAweDgxLCAweGZlLCAweDQxLCAweDQ5LCAweDAwLCAweDIwLCAKKzB4MDEsIDB4ZjAsIDB4MTQsIDB4ZmEsIDB4MDAsIDB4MjgsIDB4MDQsIDB4ZDEsIDB4MGUsIDB4OWIsIDB4ZDgsIDB4NmIsIAorMHgwMSwgMHgzMCwgMHhkOCwgMHg2MywgMHgxMSwgMHhlMCwgMHgwMSwgMHgyMCwgMHgwZiwgMHg5OSwgMHhjMCwgMHg0NiwgCisweDQ4LCAweDcxLCAweDgwLCAweDA2LCAweDAwLCAweDI3LCAweDY4LCAweDYwLCAweGFmLCAweDYxLCAweDNhLCAweDRhLCAKKzB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4MzksIDB4NDgsIDB4MDEsIDB4NmQsIDB4NDIsIDB4NmQsIDB4MzksIDB4NGIsIAorMHgwMCwgMHgyMCwgMHgwMSwgMHhmMCwgMHhmMywgMHhmOSwgMHgwMCwgMHgyMCwgMHgxNSwgMHhlMiwgMHgwNSwgMHg5OCwgCisweDBjLCAweDk5LCAweDA4LCAweDFhLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDBjLCAweDkwLCAweDBiLCAweDkwLCAKKzB4MGMsIDB4OTgsIDB4MDAsIDB4MjgsIDB4MDMsIDB4ZDAsIDB4MDEsIDB4MjAsIDB4MGYsIDB4OTksIDB4YzAsIDB4NDYsIAorMHg0OCwgMHg3MSwgMHgyOCwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwNCwgMHg5MCwgMHgwMCwgMHgyNiwgMHgwMCwgMHgyMCwgCisweDA4LCAweDkwLCAweDAwLCAweDIyLCAweDBhLCAweDkyLCAweDBjLCAweDk4LCAweDAxLCAweDM4LCAweDBkLCAweDkwLCAKKzB4YTMsIDB4ZTAsIDB4NzgsIDB4ODgsIDB4OGEsIDB4MWIsIDB4MTIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4OTAsIDB4NDIsIAorMHgwNSwgMHhkZCwgMHgwNywgMHg5MiwgMHg4MCwgMHgxYSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgwOCwgMHg5MCwgCisweDAwLCAweGUwLCAweDA3LCAweDkwLCAweDA4LCAweDk4LCAweDAwLCAweDI4LCAweDA3LCAweGQxLCAweDBkLCAweDk4LCAKKzB4MGEsIDB4OWEsIDB4OTAsIDB4NDIsIDB4MDcsIDB4ZGQsIDB4MDcsIDB4OTgsIDB4MzAsIDB4MTgsIDB4ODgsIDB4NDIsIAorMHgwMywgMHhkOCwgMHgwMSwgMHgyMCwgMHg0MCwgMHgwNSwgMHgwNiwgMHg5MCwgMHgxYywgMHhlMCwgMHgxMSwgMHgyMCwgCisweDQwLCAweDA1LCAweDA2LCAweDkwLCAweGE4LCAweDY4LCAweDhjLCAweDIzLCAweDE4LCAweDQwLCAweDAyLCAweGQxLCAKKzB4MjAsIDB4NDgsIDB4YzAsIDB4NDYsIDB4MDYsIDB4OTAsIDB4YjEsIDB4MDcsIDB4ODksIDB4MGYsIDB4MGYsIDB4ZDAsIAorMHgwNywgMHg5OCwgMHhjMCwgMHgwNiwgMHhjMCwgMHgwZSwgMHgwOCwgMHhkMCwgMHgxZSwgMHgyOCwgMHgwOSwgMHhkYiwgCisweDFlLCAweDI4LCAweDAyLCAweGQxLCAweDAzLCAweDI5LCAweDA1LCAweGQxLCAweDAxLCAweGUwLCAweDAyLCAweDI5LCAKKzB4MDIsIDB4ZDMsIDB4MDEsIDB4MjAsIDB4MDIsIDB4OTAsIDB4ZGUsIDB4ZTcsIDB4MGEsIDB4OWEsIDB4MDAsIDB4MmEsIAorMHgwNCwgMHhkMSwgMHgwMSwgMHgyMywgMHhkYiwgMHgwNSwgMHgwNiwgMHg5OCwgMHgxOCwgMHg0MywgMHgwNiwgMHg5MCwgCisweDA3LCAweDk4LCAweDA2LCAweDk5LCAweDA4LCAweDQzLCAweDAyLCAweDFjLCAweDAwLCAweDkwLCAweDA0LCAweDk4LCAKKzB4ODMsIDB4MTksIDB4MWQsIDB4ZTAsIDB4ZTgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDEsIDB4NDksIDB4ZmYsIDB4ZmYsIAorMHgyOCwgMHgwZiwgMHgwMCwgMHg4MCwgMHgwNCwgMHgwMCwgMHgxMiwgMHgwMiwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgCisweDQ0LCAweDgwLCAweDIwLCAweDQwLCAweDY4LCAweDE5LCAweDAwLCAweDgwLCAweDYwLCAweDA0LCAweDAwLCAweDgwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4NWMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4NTUsIDB4MzIsIDB4ZmYsIDB4ZmYsIAorMHhhYywgMHg1ZSwgMHgyMSwgMHg0MCwgMHgwZCwgMHgzZCwgMHhmZiwgMHhmZiwgMHhjZCwgMHgzMSwgMHhmZiwgMHhmZiwgCisweDAwLCAweDAwLCAweDMyLCAweDAyLCAweDAwLCAweDIwLCAweDNhLCAweDFkLCAweDA2LCAweGNhLCAweDAxLCAweGYwLCAKKzB4NmIsIDB4ZjksIDB4MDcsIDB4OTgsIDB4MzYsIDB4MTgsIDB4MDIsIDB4OTgsIAorMHgwMCwgMHgyOCwgMHgxNiwgMHhkMCwgMHhhOCwgMHg2OCwgMHg4YywgMHgyMywgMHgxOCwgMHg0MCwgMHgwNCwgMHhkMSwgCisweDA5LCAweDIzLCAweDViLCAweDA0LCAweDA2LCAweDk4LCAweDE4LCAweDQzLCAweDA2LCAweDkwLCAweDA2LCAweDk4LCAKKzB4YzIsIDB4NGEsIDB4MDIsIDB4NDMsIDB4MDAsIDB4OTIsIDB4MDQsIDB4OTgsIDB4ODMsIDB4MTksIDB4YzEsIDB4NDgsIAorMHgwMSwgMHg2ZCwgMHg0MiwgMHg2ZCwgMHgwMCwgMHgyMCwgMHgwMSwgMHhmMCwgMHg1MSwgMHhmOSwgMHgwMCwgMHgyMCwgCisweDAyLCAweDkwLCAweDA4LCAweDk4LCAweDAwLCAweDI4LCAweDBiLCAweGQxLCAweDBiLCAweDliLCAweDAxLCAweDNiLCAKKzB4MGIsIDB4OTMsIDB4MTAsIDB4MzcsIDB4ZTAsIDB4NmEsIDB4YjgsIDB4NDIsIDB4MGMsIDB4ZDgsIDB4MjAsIDB4MWMsIAorMHgwMCwgMHhmMCwgMHg4YSwgMHhmYSwgMHgwNywgMHgxYywgMHgwNywgMHhlMCwgMHg3OCwgMHg2OCwgMHgwNywgMHg5YSwgCisweDgwLCAweDE4LCAweDc4LCAweDYwLCAweDc4LCAweDg4LCAweDA3LCAweDlhLCAweDgwLCAweDFhLCAweDc4LCAweDgwLCAKKzB4MGEsIDB4OWEsIDB4NTAsIDB4MWMsIDB4MDIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MGEsIDB4OTIsIDB4MGMsIDB4OTgsIAorMHgwYSwgMHg5YSwgMHg4MiwgMHg0MiwgMHgwMywgMHhkYSwgMHhhOSwgMHg2OSwgMHhiMSwgMHg0MiwgMHgwMCwgMHhkOSwgCisweDUzLCAweGU3LCAweGE4LCAweDY5LCAweGIwLCAweDQyLCAweDZiLCAweGQxLCAweGE4LCAweDY4LCAweDAxLCAweDA5LCAKKzB4NjksIDB4ZDIsIDB4MDgsIDB4OWEsIDB4MDAsIDB4MmEsIDB4NTYsIDB4ZDAsIDB4MGMsIDB4OTksIDB4MGEsIDB4OWEsIAorMHg4YSwgMHg0MiwgMHgzZSwgMHhkYiwgMHhiMSwgMHgwNywgMHg4OSwgMHgwZiwgMHgwYywgMHhkMCwgMHgwOCwgMHg5YSwgCisweGQyLCAweDA2LCAweGQyLCAweDBlLCAweDBiLCAweGQwLCAweDFlLCAweDJhLCAweDA2LCAweGRiLCAweDFlLCAweDJhLCAKKzB4MDIsIDB4ZDEsIDB4MDMsIDB4MjksIDB4MDUsIDB4ZDAsIDB4MDEsIDB4ZTAsIDB4MDIsIDB4MjksIDB4MDIsIDB4ZDIsIAorMHgwMiwgMHg5OSwgMHgwMCwgMHgyOSwgMHgyMSwgMHhkMCwgMHgwOCwgMHg5YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgCisweDA0LCAweDk4LCAweDgzLCAweDE5LCAweDAwLCAweDIwLCAweDNhLCAweDFkLCAweDA2LCAweGNhLCAweDAxLCAweGYwLCAKKzB4MDEsIDB4ZjksIDB4MDgsIDB4OTgsIDB4MzYsIDB4MTgsIDB4YTgsIDB4NjgsIDB4OGMsIDB4MjMsIDB4MTgsIDB4NDAsIAorMHgwMiwgMHhkMCwgMHgwMSwgMHgyMCwgMHg0MCwgMHgwNiwgMHgwMCwgMHhlMCwgMHg5MiwgMHg0OCwgMHgwMSwgMHgyMiwgCisweDAyLCAweDQzLCAweDAwLCAweDkyLCAweDA0LCAweDk4LCAweDgzLCAweDE5LCAweDhlLCAweDQ4LCAweDAxLCAweDZkLCAKKzB4NDIsIDB4NmQsIDB4MDAsIDB4MjAsIDB4MDEsIDB4ZjAsIDB4ZWMsIDB4ZjgsIDB4MDAsIDB4MjAsIDB4MDIsIDB4OTAsIAorMHgxNSwgMHhlMCwgMHg4YywgMHgyMywgMHgxOCwgMHg0MCwgMHgwMiwgMHhkMCwgMHgwMSwgMHgyMCwgMHg0MCwgMHgwNiwgCisweDAwLCAweGUwLCAweDg4LCAweDQ4LCAweDA4LCAweDlhLCAweDAyLCAweDQzLCAweDAwLCAweGUwLCAweDA4LCAweDlhLCAKKzB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4MDQsIDB4OTgsIDB4ODMsIDB4MTksIDB4MDAsIDB4MjAsIDB4M2EsIDB4MWQsIAorMHgwNiwgMHhjYSwgMHgwMSwgMHhmMCwgMHhkNSwgMHhmOCwgMHgwOCwgMHg5OCwgMHgzNiwgMHgxOCwgMHgxMCwgMHgzNywgCisweGUwLCAweDZhLCAweGI4LCAweDQyLCAweDAzLCAweGQ4LCAweDIwLCAweDFjLCAweDAwLCAweGYwLCAweDE0LCAweGZhLCAKKzB4MDcsIDB4MWMsIDB4NjgsIDB4NjgsIDB4ODAsIDB4MGUsIDB4NmIsIDB4ZDIsIDB4MGEsIDB4OTgsIDB4YzAsIDB4NDYsIAorMHgwOSwgMHg5MCwgMHgwYywgMHg5OSwgMHg4OCwgMHg0MiwgMHg1YywgMHhkYSwgMHgwZCwgMHg5OCwgMHgwOSwgMHg5OSwgCisweDg4LCAweDQyLCAweDAzLCAweGQwLCAweDdhLCAweDg4LCAweDFlLCAweGUwLCAweDVmLCAweGUwLCAweDVlLCAweGUwLCAKKzB4NzgsIDB4ODgsIDB4MDEsIDB4MjIsIDB4NTIsIDB4MDYsIDB4MDIsIDB4NDMsIDB4YTksIDB4NjgsIDB4OGMsIDB4MjMsIAorMHgxOSwgMHg0MCwgMHgwMiwgMHhkMSwgMHgwOSwgMHgyMywgMHg1YiwgMHgwNCwgMHgxYSwgMHg0MywgMHhiMSwgMHgwNywgCisweDg5LCAweDBmLCAweDBlLCAweGQwLCAweGMzLCAweDA2LCAweGRiLCAweDBlLCAweDA4LCAweGQwLCAweDFlLCAweDJiLCAKKzB4MDksIDB4ZGIsIDB4MWUsIDB4MmIsIDB4MDIsIDB4ZDEsIDB4MDMsIDB4MjksIDB4MDUsIDB4ZDEsIDB4MDEsIDB4ZTAsIAorMHgwMiwgMHgyOSwgMHgwMiwgMHhkMywgMHgwMSwgMHgyMSwgMHgwMiwgMHg5MSwgMHgwMiwgMHgxYywgMHgwOSwgMHg5OCwgCisweDAwLCAweDI4LCAweDAyLCAweGQxLCAweDAxLCAweDIzLCAweGRiLCAweDA1LCAweDFhLCAweDQzLCAweDAwLCAweDkyLCAKKzB4MDQsIDB4OTgsIDB4ODMsIDB4MTksIDB4MDAsIDB4MjAsIDB4M2EsIDB4MWQsIDB4MDYsIDB4Y2EsIDB4MDEsIDB4ZjAsIAorMHg4ZiwgMHhmOCwgMHg3OCwgMHg4OCwgMHg4NiwgMHgxOSwgMHgxMCwgMHgzNywgMHgwMiwgMHg5OCwgMHgwMCwgMHgyOCwgCisweDE0LCAweGQwLCAweGE4LCAweDY4LCAweDhjLCAweDIzLCAweDE4LCAweDQwLCAweDAyLCAweGQwLCAweDAxLCAweDIwLCAKKzB4NDAsIDB4MDYsIDB4MDAsIDB4ZTAsIDB4NTcsIDB4NDgsIDB4MDEsIDB4MjIsIDB4MDIsIDB4NDMsIDB4MDAsIDB4OTIsIAorMHgwNCwgMHg5OCwgMHg4MywgMHgxOSwgMHg1MywgMHg0OCwgMHgwMSwgMHg2ZCwgMHg0MiwgMHg2ZCwgMHgwMCwgMHgyMCwgCisweDAxLCAweGYwLCAweDc2LCAweGY4LCAweDAwLCAweDIwLCAweDAyLCAweDkwLCAweGUwLCAweDZhLCAweGI4LCAweDQyLCAKKzB4MDMsIDB4ZDgsIDB4MjAsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4YjYsIDB4ZjksIDB4MDcsIDB4MWMsIDB4MDksIDB4OTgsIAorMHgwMSwgMHgzMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgwOSwgMHg5MCwgCisweDBjLCAweDk5LCAweDg4LCAweDQyLCAweGEyLCAweGRiLCAweDY4LCAweDY4LCAweDMwLCAweDQzLCAweDAxLCAweDA0LCAKKzB4MDksIDB4MGMsIDB4NjgsIDB4NjAsIDB4ZTgsIDB4NmEsIDB4MDAsIDB4ZjAsIDB4N2IsIDB4ZmEsIDB4MjgsIDB4ZTAsIAorMHgyNywgMHhlMCwgMHhhOCwgMHg2OCwgMHgwMCwgMHgwOSwgMHgxNCwgMHhkMywgMHg2OCwgMHg2OCwgMHg4MCwgMHgwZSwgCisweDE1LCAweGQyLCAweDAxLCAweDlhLCAweDAwLCAweDJhLCAweDEyLCAweGQwLCAweDAxLCAweDlhLCAweDUwLCAweDZiLCAKKzB4MGIsIDB4OWIsIDB4MjEsIDB4MWMsIDB4M2EsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4ODksIDB4ZjksIDB4MDEsIDB4OWEsIAorMHhjMCwgMHg0NiwgMHg5MCwgMHg2NCwgMHgwMSwgMHg5YSwgMHgwYiwgMHg5YiwgMHhjMCwgMHg0NiwgMHg5MywgMHg2MywgCisweDAzLCAweGUwLCAweGU4LCAweDZhLCAweDMxLCAweDFjLCAweDAwLCAweGYwLCAweDVkLCAweGZhLCAweDY4LCAweDY4LCAKKzB4MzAsIDB4NDMsIDB4NjgsIDB4NjAsIDB4YTgsIDB4NjksIDB4YjAsIDB4NDIsIDB4MDUsIDB4ZDksIDB4MDAsIDB4MDQsIAorMHgwMCwgMHgwYywgMHg4MCwgMHgxYiwgMHgwMCwgMHhmMCwgMHhlZSwgMHhmOSwgMHhhZSwgMHg2MSwgMHhhOCwgMHg2OCwgCisweDhjLCAweDIzLCAweDE4LCAweDQwLCAweDBiLCAweGQwLCAweDJmLCAweDRhLCAweGMwLCAweDQ2LCAweDAwLCAweDkyLCAKKzB4MDQsIDB4OTgsIDB4YzMsIDB4MWYsIDB4MDUsIDB4M2IsIDB4MmEsIDB4NDgsIDB4MDEsIDB4NmQsIDB4NDIsIDB4NmQsIAorMHgwMCwgMHgyMCwgMHgwMSwgMHhmMCwgMHgyMywgMHhmOCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgyMCwgMHg2ZCwgCisweDE4LCAweDQzLCAweDAwLCAweDY4LCAweGMwLCAweDQ2LCAweGEwLCAweDYxLCAweGUxLCAweDY5LCAweDgxLCAweDQyLCAKKzB4MTIsIDB4ZDAsIDB4MjIsIDB4NjksIDB4MDIsIDB4MmEsIDB4MGYsIDB4ZDIsIDB4NDEsIDB4MWEsIDB4MDEsIDB4ZDUsIAorMHg2MCwgMHg2ZCwgMHg0MSwgMHgxOCwgMHgyMCwgMHgxYywgMHhmZiwgMHhmNywgMHgzZiwgMHhmYiwgMHhlMSwgMHg2OSwgCisweDQwLCAweDE4LCAweGUwLCAweDYxLCAweDYxLCAweDZkLCAweDg4LCAweDQyLCAweDI0LCAweGQzLCAweDQwLCAweDFhLCAKKzB4ZTAsIDB4NjEsIDB4MjEsIDB4ZTAsIDB4ODEsIDB4NDIsIDB4MWYsIDB4ZDEsIDB4MjAsIDB4NjksIDB4MDIsIDB4MjgsIAorMHgxYywgMHhkMiwgMHgwMSwgMHgyMCwgMHg2MCwgMHg2MSwgMHgxOCwgMHg0OCwgMHg0MSwgMHg2OSwgMHhlMiwgMHg2YywgCisweDBhLCAweDQzLCAweDQyLCAweDYxLCAweDgxLCAweDY5LCAweGUzLCAweDZjLCAweDk5LCAweDQzLCAweDgxLCAweDYxLCAKKzB4MDEsIDB4MjEsIDB4MDksIDB4MDUsIDB4Y2EsIDB4NjAsIDB4ODAsIDB4NjksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjEsIAorMHg4YiwgMHgwMiwgMHgyMCwgMHg2ZCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHhjMCwgMHg0NiwgMHhhMCwgMHg2MSwgCisweGUxLCAweDY5LCAweDgxLCAweDQyLCAweDAyLCAweGQwLCAweDIwLCAweDFjLCAweGZmLCAweGY3LCAweGNjLCAweGZhLCAKKzB4MjgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MGYsIDB4ZjksIDB4MGMsIDB4OTgsIDB4MDUsIDB4OTksIDB4NDAsIDB4MTgsIAorMHgwMCwgMHgwMSwgMHgxMCwgMHgzMCwgMHg2OCwgMHg2MSwgMHgxMywgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDdjLCAweDI5LCAweDAwLCAweDgwLCAKKzB4MDAsIDB4MDAsIDB4MTIsIDB4MDIsIDB4MDQsIDB4MDAsIDB4NTIsIDB4MDIsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHhmMCwgMHhiNSwgMHg0MCwgMHgyMCwgMHgyZCwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHgwMCwgMHhmMCwgCisweDAzLCAweGY5LCAweDA3LCAweDFjLCAweDgxLCAweDY5LCAweDQ0LCAweDZhLCAweGEwLCAweDZmLCAweDAwLCAweGYwLCAKKzB4NDUsIDB4ZmUsIDB4MDAsIDB4MjAsIDB4ZTEsIDB4MWQsIDB4MTksIDB4MzEsIDB4NDgsIDB4NzEsIDB4NzksIDB4NjgsIAorMHhjOSwgMHgwZSwgMHgwOSwgMHhkMywgMHhmOCwgMHg2YSwgMHgwMCwgMHgwMSwgMHgyNCwgMHg0OSwgMHg0MCwgMHgxOCwgCisweDI0LCAweDRiLCAweGMwLCAweDE4LCAweDAxLCAweDY4LCAweDAxLCAweDM5LCAweDAxLCAweDYwLCAweDM2LCAweGUwLCAKKzB4ZTEsIDB4NmQsIDB4MDksIDB4NjgsIDB4MjIsIDB4NmUsIDB4YzAsIDB4NDYsIDB4MTEsIDB4NjAsIDB4MjAsIDB4NGUsIAorMHhmNSwgMHgxZCwgMHg3OSwgMHgzNSwgMHgwMSwgMHgyMywgMHhlOSwgMHg2YiwgMHgxOSwgMHg0MywgMHhlOSwgMHg2MywgCisweGI5LCAweDZhLCAweGUyLCAweDZkLCAweGMwLCAweDQ2LCAweDExLCAweDYwLCAweGI5LCAweDZhLCAweDIyLCAweDZlLCAKKzB4YzAsIDB4NDYsIDB4MTEsIDB4NjAsIDB4NjEsIDB4NjksIDB4MDAsIDB4MjksIDB4MDQsIDB4ZDEsIDB4YTksIDB4NmIsIAorMHgwMSwgMHgzMSwgMHhhOSwgMHg2MywgMHgwOCwgMHgyOSwgMHgwNywgMHhkMywgMHhhOCwgMHg2MywgMHgwMSwgMHgyMCwgCisweDAwLCAweGYwLCAweDg2LCAweGY4LCAweGU4LCAweDZiLCAweDQwLCAweDA4LCAweDQwLCAweDAwLCAweGU4LCAweDYzLCAKKzB4NzgsIDB4NjgsIDB4ODEsIDB4MGUsIDB4MGYsIDB4ZDIsIDB4MGIsIDB4MjMsIDB4MWIsIDB4MDIsIDB4ZjEsIDB4MTgsIAorMHhjOSwgMHg2OCwgMHgwMCwgMHgyOSwgMHgwNiwgMHhkMCwgMHgwMCwgMHgwOCwgMHgwNCwgMHhkMiwgMHgyMCwgMHgxYywgCisweDM5LCAweDFjLCAweDAwLCAweGYwLCAweDQzLCAweGY4LCAweDAyLCAweGUwLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAKKzB4MDUsIDB4ZmEsIDB4MzgsIDB4MWMsIDB4ZmIsIDB4ZjcsIDB4MDYsIDB4ZmMsIDB4MjAsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHgwYiwgMHhmOCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgCisweGEwLCAweDFjLCAweDAwLCAweDgwLCAweGI0LCAweDBjLCAweDAwLCAweDAwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4ZjgsIDB4MWQsIDB4MTksIDB4MzAsIAorMHgwMSwgMHg3OSwgMHgwMCwgMHgyOSwgMHgwNCwgMHhkMCwgMHgwMCwgMHgyMSwgMHgwMSwgMHg3MSwgMHgzOCwgMHgxYywgCisweGZmLCAweGY3LCAweDU2LCAweGZiLCAweGY4LCAweDY4LCAweDAyLCAweDI4LCAweDBkLCAweGQwLCAweGI4LCAweDY4LCAKKzB4ODAsIDB4MDAsIDB4YzIsIDB4MTksIDB4NTAsIDB4NmMsIDB4MDAsIDB4MjgsIDB4MTEsIDB4ZDAsIDB4YjgsIDB4NmEsIAorMHg0MSwgMHg3OCwgMHgwOSwgMHgwMSwgMHgxMCwgMHgzMSwgMHg1MiwgMHg2YiwgMHgxMCwgMHgxYSwgMHg4OCwgMHg0MiwgCisweDA1LCAweGQzLCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDQyLCAweGZiLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4MjgsIDB4ZmEsIDB4ZjgsIDB4ZTcsIDB4NzgsIDB4NjgsIAorMHg4MCwgMHgwMCwgMHhjMCwgMHgxOSwgMHhjMCwgMHg2YiwgMHhjMCwgMHg0NiwgMHhiOCwgMHg2MiwgMHhmMSwgMHhlNywgCisweGIwLCAweGI1LCAweDg3LCAweGIwLCAweDBmLCAweDFjLCAweDgwLCAweDZmLCAweGMwLCAweDQ2LCAweDAwLCAweDkwLCAKKzB4MDAsIDB4MjQsIDB4MTMsIDB4NGQsIDB4MGIsIDB4MjMsIDB4MWIsIDB4MDIsIDB4ZTgsIDB4MTgsIDB4ODAsIDB4NjksIAorMHgwMCwgMHgyOCwgMHgxNywgMHhkMCwgMHg2OSwgMHg0NiwgMHhhMiwgMHgwMCwgMHg1MiwgMHgxOSwgMHgwYiwgMHgyMywgCisweDFiLCAweDAyLCAweGQyLCAweDE4LCAweDkyLCAweDY5LCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDkyLCAweGZiLCAKKzB4MDAsIDB4MjgsIDB4MDksIDB4ZDEsIDB4MDEsIDB4MzQsIDB4YTAsIDB4MDAsIDB4NDAsIDB4MTksIDB4MGIsIDB4MjMsIAorMHgxYiwgMHgwMiwgMHhjMCwgMHgxOCwgMHg4MCwgMHg2OSwgMHgwMCwgMHgyOCwgMHhlYSwgMHhkMSwgMHgwMSwgMHhlMCwgCisweDAxLCAweDI4LCAweDAyLCAweGQwLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDlkLCAweGY5LCAweDA3LCAweGIwLCAKKzB4YjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHhiOCwgMHhiNSwgMHhjMiwgMHgwNywgMHhkMiwgMHgwZiwgMHgxNiwgMHg0YywgMHgxNiwgMHg0OSwgMHgwMSwgMHhkMCwgCisweDA4LCAweDIyLCAweDA4LCAweGUwLCAweDgyLCAweDA4LCAweDA1LCAweGQzLCAweDBjLCAweDIyLCAweGE0LCAweDE4LCAKKzB4MGIsIDB4NjgsIDB4ZGYsIDB4MWQsIDB4MTUsIDB4MzcsIDB4MDMsIDB4ZTAsIDB4MWMsIDB4MjIsIDB4MGIsIDB4NjgsIAorMHhkZiwgMHgxZCwgMHgwOSwgMHgzNywgMHgwZiwgMHg0YiwgMHgxZCwgMHg3OCwgMHgwMCwgMHgyZCwgMHgxMywgMHhkMCwgCisweDViLCAweDc4LCAweDAwLCAweDJiLCAweDEwLCAweGQwLCAweDAxLCAweDIzLCAweDViLCAweDA2LCAweDFhLCAweDQzLCAKKzB4MDAsIDB4MjgsIDB4MDEsIDB4ZDEsIDB4NWIsIDB4MDgsIDB4MWEsIDB4NDMsIDB4MDAsIDB4OTIsIDB4NGEsIDB4NjgsIAorMHgwMSwgMHgyMCwgMHgzOSwgMHgxYywgMHgyMywgMHgxYywgMHgwMCwgMHhmMCwgMHhkZiwgMHhmZSwgMHhiOCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAzLCAweDIzLCAweDFiLCAweDA2LCAweDFhLCAweDQzLCAweGYxLCAweGU3LCAKKzB4OTAsIDB4ZWUsIDB4MjAsIDB4NDAsIDB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIDB4ZjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgyMSwgMHhjMSwgMHg2MSwgMHgwNSwgMHg0OSwgMHg4YSwgMHg2OCwgMHgwMCwgMHgyYSwgMHgwMSwgMHhkMSwgCisweDg4LCAweDYwLCAweDAyLCAweGUwLCAweGNhLCAweDY4LCAweGMwLCAweDQ2LCAweGQwLCAweDYxLCAweGM4LCAweDYwLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MGYsIDB4MDAsIDB4ODAsIDB4MDMsIDB4NDksIDB4ODgsIDB4NjgsIAorMHgwMCwgMHgyOCwgMHgwMiwgMHhkMCwgMHhjMiwgMHg2OSwgMHhjMCwgMHg0NiwgMHg4YSwgMHg2MCwgMHg3MCwgMHg0NywgCisweDI4LCAweDBmLCAweDAwLCAweDgwLCAweDAxLCAweDFjLCAweDAxLCAweDIzLCAweDg4LCAweDY4LCAweDU4LCAweDQwLCAKKzB4ODgsIDB4NjAsIDB4Y2EsIDB4NjgsIDB4MDEsIDB4M2EsIDB4Y2EsIDB4NjAsIDB4MGEsIDB4NjksIDB4MDEsIDB4M2EsIAorMHg4MCwgMHgwMCwgMHgwYSwgMHg2MSwgMHg0MiwgMHgxOCwgMHhkMCwgMHg2YiwgMHg1MywgMHg2YiwgMHhjMCwgMHg0NiwgCisweGNiLCAweDYyLCAweDBiLCAweDY4LCAweDliLCAweDAwLCAweDU5LCAweDE4LCAweDQ5LCAweDZjLCAweDUzLCAweDZjLCAKKzB4YzksIDB4MTgsIDB4NTEsIDB4NjQsIDB4NzAsIDB4NDcsIDB4OGEsIDB4NjgsIDB4OTIsIDB4MDAsIDB4NTIsIDB4MTgsIAorMHhkMywgMHg2YiwgMHg4MywgMHg0MiwgMHgxNywgMHhkMSwgMHhkMCwgMHgxZCwgMHgzZCwgMHgzMCwgMHgwYSwgMHg2OCwgCisweDkyLCAweDAwLCAweDUyLCAweDE4LCAweDUyLCAweDZjLCAweDAzLCAweDY4LCAweDlhLCAweDFhLCAweDAyLCAweDYwLCAKKzB4MDEsIDB4MjMsIDB4ODgsIDB4NjgsIDB4NTgsIDB4NDAsIDB4ODgsIDB4NjAsIDB4Y2EsIDB4NjgsIDB4MDEsIDB4MzIsIAorMHhjYSwgMHg2MCwgMHgwYSwgMHg2OSwgMHgwMSwgMHgzMiwgMHg4MCwgMHgwMCwgMHg0MCwgMHgxOCwgMHgwYSwgMHg2MSwgCisweDQwLCAweDZiLCAweGMwLCAweDQ2LCAweGM4LCAweDYyLCAweDcwLCAweDQ3LCAweGI4LCAweGI1LCAweDA0LCAweDFjLCAKKzB4MWQsIDB4MWMsIDB4MTcsIDB4MWMsIDB4MDgsIDB4MWMsIDB4MzksIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4ZDksIDB4ZmYsIAorMHgwMCwgMHgyMCwgMHgyOSwgMHgxYywgMHgwMCwgMHhmMCwgMHg3YywgMHhmZSwgMHgwMSwgMHgyMCwgMHhmOSwgMHgxZCwgCisweDE5LCAweDMxLCAweDQ4LCAweDcxLCAweDgwLCAweDA2LCAweDYwLCAweDYwLCAweDAwLCAweDIwLCAweGEwLCAweDYxLCAKKzB4MDYsIDB4NGEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4MDYsIDB4NDgsIAorMHgwMSwgMHg2ZCwgMHg0MiwgMHg2ZCwgMHgwNSwgMHg0YiwgMHgwMCwgMHgyMCwgMHgwMCwgMHhmMCwgMHg2MiwgMHhmZSwgCisweGI4LCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDEyLCAweDAyLCAKKzB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIDB4NDQsIDB4ODAsIDB4MjAsIDB4NDAsIDB4MDYsIDB4NDksIDB4MGEsIDB4NjgsIAorMHgxMCwgMHgxOCwgMHgwOCwgMHg2MCwgMHgwMSwgMHgyMywgMHg1YiwgMHgwMiwgMHg5OCwgMHg0MiwgMHgwMywgMHhkOSwgCisweDAzLCAweDQ5LCAweDBhLCAweDc5LCAweDAxLCAweDMyLCAweDBhLCAweDcxLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAKKzB4ZTQsIDB4MmQsIDB4MDAsIDB4ODAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MDgsIDB4ODAsIDB4MDAsIAorMHgwNiwgMHg0OSwgMHgwYSwgMHg2OCwgMHgxMCwgMHgxOCwgMHgwOCwgMHg2MCwgMHgwMSwgMHgyMywgMHg1YiwgMHgwMiwgCisweDk4LCAweDQyLCAweDAzLCAweGQ5LCAweDAzLCAweDQ5LCAweDBhLCAweDc5LCAweDAxLCAweDMyLCAweDBhLCAweDcxLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4ZTQsIDB4MmQsIDB4MDAsIDB4ODAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIAorMHgwMywgMHgzMCwgMHg4MCwgMHgwOCwgMHg4MCwgMHgwMCwgMHgwNiwgMHg0OSwgMHgwYSwgMHg2OCwgMHgxMCwgMHgxOCwgCisweDA4LCAweDYwLCAweDAxLCAweDIzLCAweDViLCAweDAyLCAweDk4LCAweDQyLCAweDAzLCAweGQ5LCAweDAzLCAweDQ5LCAKKzB4MGEsIDB4NzksIDB4MDEsIDB4MzIsIDB4MGEsIDB4NzEsIDB4NzAsIDB4NDcsIDB4ZTQsIDB4MmQsIDB4MDAsIDB4ODAsIAorMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgMHgwMiwgMHg0OCwgMHg0MSwgMHg3OSwgMHgwMSwgMHgzMSwgMHg0MSwgMHg3MSwgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAweDkwLCAweGI0LCAweDgyLCAweDAwLCAKKzB4MTcsIDB4NGIsIDB4OWEsIDB4NTgsIDB4OGIsIDB4MDcsIDB4MDIsIDB4ZDAsIDB4ODksIDB4MDgsIDB4MGIsIDB4MWQsIAorMHgwMSwgMHhlMCwgMHg4OSwgMHgwOCwgMHhjYiwgMHgxYywgMHgxMSwgMHg2OSwgMHhkNywgMHg2OCwgMHgxMiwgMHg0YywgCisweDgwLCAweDAwLCAweDIwLCAweDU4LCAweDQwLCAweDY4LCAweGI5LCAweDQyLCAweDAzLCAweGQxLCAweDgxLCAweDQyLCAKKzB4MTksIDB4ZDksIDB4MTEsIDB4NjgsIDB4MTcsIDB4ZTAsIDB4MDAsIDB4MjQsIDB4YjksIDB4NDIsIDB4MDksIDB4ZDksIAorMHg4MSwgMHg0MiwgMHgxMiwgMHhkOSwgMHgxMSwgMHg2OCwgMHg3OCwgMHgxYSwgMHgwMCwgMHhkNSwgMHgwMywgMHgzMCwgCisweDgwLCAweDEwLCAweDk4LCAweDQyLCAweDBiLCAweGQ4LCAweDA3LCAweGUwLCAweDgxLCAweDQyLCAweDA1LCAweGQ4LCAKKzB4NzgsIDB4MWEsIDB4MDAsIDB4ZDUsIDB4MDMsIDB4MzAsIDB4ODAsIDB4MTAsIDB4OTgsIDB4NDIsIDB4MDIsIDB4ZDgsIAorMHgyMCwgMHgxYywgMHg5MCwgMHhiYywgMHg3MCwgMHg0NywgMHhjOCwgMHgxZCwgMHgwNSwgMHgzMCwgMHhmYSwgMHhlNywgCisweDcwLCAweDA0LCAweDAwLCAweDgwLCAweDgwLCAweGI1LCAweDgwLCAweDAwLCAweDBmLCAweDRhLCAweDE3LCAweDU4LCAKKzB4ODgsIDB4MDcsIDB4MDIsIDB4ZDAsIDB4ODgsIDB4MDgsIDB4MDQsIDB4MzAsIDB4MDEsIDB4ZTAsIDB4ODgsIDB4MDgsIAorMHgwMywgMHgzMCwgMHgzOSwgMHg2OSwgMHg3YSwgMHg2OCwgMHg5MSwgMHg0MiwgMHgwOSwgMHhkOSwgMHgzOSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDM5LCAweDYxLCAweGY5LCAweDY4LCAweDdhLCAweDY4LCAweDkxLCAweDQyLCAweDAyLCAweGQ5LCAKKzB4MzksIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZjksIDB4NjAsIDB4ODEsIDB4MDAsIDB4MzgsIDB4NjksIDB4MDAsIDB4ZjAsIAorMHhkMSwgMHhmZCwgMHgzOCwgMHg2MSwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDcwLCAweDA0LCAweDAwLCAweDgwLCAweDkwLCAweGI1LCAweDAzLCAweDIxLCAweDA5LCAweDA3LCAweDAxLCAweDQwLCAKKzB4MGMsIDB4MGYsIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MDEsIDB4MjIsIDB4OTIsIDB4MDcsIDB4MDIsIDB4NDAsIAorMHhhMywgMHgwMCwgMHgxYywgMHg0ZiwgMHhmZiwgMHg1OCwgMHg4OSwgMHgwNywgMHg4OSwgMHgwZiwgMHgwMCwgMHgwNCwgCisweDAwLCAweDBjLCAweDgwLCAweDA4LCAweDAwLCAweDI5LCAweDAwLCAweGQwLCAweDAxLCAweDMwLCAweDAwLCAweDJhLCAKKzB4MDEsIDB4ZDAsIDB4MDIsIDB4MzAsIDB4MDAsIDB4ZTAsIDB4MDMsIDB4MzAsIDB4ZjksIDB4NjgsIDB4N2EsIDB4NjgsIAorMHg5MSwgMHg0MiwgMHgwMiwgMHhkOSwgMHgzOSwgMHg2OCwgMHhjMCwgMHg0NiwgMHhmOSwgMHg2MCwgMHg4MSwgMHgwMCwgCisweGY4LCAweDY4LCAweDAwLCAweGYwLCAweGE1LCAweGZkLCAweGY4LCAweDYwLCAweDBmLCAweDQ4LCAweDAwLCAweDY5LCAKKzB4MDAsIDB4MjgsIDB4MDUsIDB4ZDAsIDB4MDEsIDB4MjAsIDB4YTAsIDB4NDAsIDB4MDIsIDB4ZDAsIDB4MjAsIDB4MWMsIAorMHhmZSwgMHhmNywgMHhjYSwgMHhmYywgMHgwYiwgMHg0OSwgMHhjOCwgMHgxZCwgMHgxOSwgMHgzMCwgMHgwMywgMHg3OSwgCisweDAwLCAweDIyLCAweDAwLCAweDJiLCAweDA1LCAweGQxLCAweDA5LCAweDQ5LCAweGM4LCAweDFkLCAweDE5LCAweDMwLCAKKzB4MDMsIDB4NzksIDB4MDAsIDB4MmIsIDB4MDMsIDB4ZDAsIDB4MDIsIDB4NzEsIDB4MDgsIDB4MWMsIDB4ZmYsIDB4ZjcsIAorMHg3OSwgMHhmOSwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg3MCwgMHgwNCwgMHgwMCwgMHg4MCwgCisweGQwLCAweDJjLCAweDAwLCAweDgwLCAweDY0LCAweDJkLCAweDAwLCAweDgwLCAweGU0LCAweDJjLCAweDAwLCAweDgwLCAKKzB4YjAsIDB4YjUsIDB4MmIsIDB4NDksIDB4MDksIDB4NzksIDB4MDAsIDB4MjksIDB4MDMsIDB4ZDEsIDB4NDEsIDB4NjgsIAorMHgyOSwgMHg0YiwgMHgxOSwgMHg0MywgMHg0MSwgMHg2MCwgMHg4MSwgMHg2OCwgCisweDQ5LCAweDA4LCAweDAyLCAweGQzLCAweDA5LCAweDIxLCAweDA5LCAweDA0LCAweDAxLCAweGUwLCAweDBkLCAweDIxLCAKKzB4MDksIDB4MDQsIDB4MGMsIDB4YzgsIDB4MDgsIDB4MzgsIDB4MTksIDB4NDMsIDB4ODcsIDB4NjgsIDB4YmIsIDB4MGEsIAorMHgwMywgMHhkMywgMHg0MywgMHg2OCwgMHg1YiwgMHgwOCwgMHgwMCwgMHhkMywgMHgwMSwgMHgzMSwgMHg0MCwgMHg2OCwgCisweDAzLCAweDIzLCAweDFiLCAweDA3LCAweDE4LCAweDQwLCAweDA3LCAweDBmLCAweGY4LCAweDAwLCAweDFkLCAweDRjLCAKKzB4MDAsIDB4MTksIDB4MjMsIDB4NjgsIDB4YzAsIDB4MTgsIDB4NTAsIDB4MzAsIDB4MDAsIDB4NzksIDB4MDEsIDB4MjgsIAorMHgxMCwgMHhkMSwgMHg2MCwgMHg2OCwgMHgwMSwgMHgyOCwgMHgwZCwgMHhkMCwgMHgxMCwgMHgxYywgMHgwMCwgMHhmMCwgCisweDcxLCAweGY4LCAweDM4LCAweDAxLCAweDAwLCAweDE5LCAweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGMwLCAweDE4LCAKKzB4NDEsIDB4NmIsIDB4MDEsIDB4MzksIDB4NDEsIDB4NjMsIDB4YjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgzOCwgMHgwMSwgMHgwMCwgMHgxOSwgMHgxOSwgMHgyMywgMHhkYiwgMHgwMSwgMHhjMCwgMHgxOCwgMHgwMywgMHg2YiwgCisweDVkLCAweDFjLCAweDA1LCAweDYzLCAweGJkLCAweDAyLCAweDJkLCAweDE5LCAweGRiLCAweDAwLCAweGViLCAweDE4LCAKKzB4ODAsIDB4MzMsIDB4MTksIDB4NjMsIDB4ZGEsIDB4NjIsIDB4ODEsIDB4NmIsIDB4MDEsIDB4MzEsIDB4ODEsIDB4NjMsIAorMHgwMSwgMHgyMSwgMHhiOSwgMHg0MCwgMHgyMiwgMHg2OCwgMHgxMSwgMHg0MywgMHgyMSwgMHg2MCwgMHgwMSwgMHg2YiwgCisweDgwLCAweDI5LCAweGUyLCAweGQzLCAweDAwLCAweDIxLCAweDAxLCAweDYzLCAweGRmLCAweGU3LCAweDAwLCAweDAwLCAKKzB4MjgsIDB4MGYsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4YTAsIDB4MWMsIDB4MDAsIDB4ODAsIAorMHhmMCwgMHhiNSwgMHgxZiwgMHg0ZSwgMHg3MCwgMHg2OCwgMHgwMCwgMHgyOCwgMHgzNiwgMHhkMSwgMHgwMCwgMHgyNCwgCisweGIxLCAweDY4LCAweDQ4LCAweDFjLCAweGM5LCAweDAwLCAweDg5LCAweDE5LCAweGIwLCAweDYwLCAweDMyLCAweDY4LCAKKzB4ODksIDB4MTgsIDB4NjAsIDB4MzEsIDB4MGQsIDB4N2IsIDB4MDgsIDB4MjgsIDB4MDAsIDB4ZDMsIDB4YjQsIDB4NjAsIAorMHgyOCwgMHgwMSwgMHg4MCwgMHgxOSwgMHgxOSwgMHgyMywgMHhkYiwgMHgwMSwgMHhjMCwgMHgxOCwgMHg4NywgMHg2YiwgCisweDAwLCAweDJmLCAweDIxLCAweGQwLCAweGMxLCAweDZhLCAweDRiLCAweDFjLCAweGFhLCAweDAyLCAweDkyLCAweDE5LCAKKzB4YzksIDB4MDAsIDB4NTEsIDB4MTgsIDB4ODAsIDB4MzEsIDB4YzMsIDB4NjIsIDB4Y2EsIDB4NmEsIDB4MDksIDB4NmIsIAorMHgwMSwgMHgzZiwgMHg4NywgMHg2MywgMHg4MCwgMHgyYiwgMHgwMCwgMHhkMywgMHhjNCwgMHg2MiwgMHgwMCwgMHgyZiwgCisweDA2LCAweGQxLCAweDAxLCAweDI3LCAweGFmLCAweDQwLCAweDNiLCAweDFjLCAweGRiLCAweDQzLCAweDM3LCAweDY4LCAKKzB4M2IsIDB4NDAsIDB4MzMsIDB4NjAsIDB4NDMsIDB4NmIsIDB4MDEsIDB4M2IsIDB4NDMsIDB4NjMsIDB4MTAsIDB4MWMsIAorMHgzNywgMHgxYywgMHgwMCwgMHhmMCwgMHgwOSwgMHhmOCwgMHg3OCwgMHg2OCwgMHgwMCwgMHgyOCwgMHhjOSwgMHhkMCwgCisweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweGEwLCAweDFjLCAweDAwLCAweDgwLCAKKzB4ZjAsIDB4YjUsIDB4Y2QsIDB4MGYsIDB4ZWQsIDB4MDcsIDB4MDEsIDB4MjQsIDB4MDAsIDB4MjcsIDB4MmUsIDB4NGIsIAorMHgyZSwgMHg0YSwgMHgwMCwgMHgyZCwgMHgxZCwgMHhkMCwgMHhkOCwgMHg2YSwgMHgwMSwgMHgzMCwgMHhkOCwgMHg2MiwgCisweDEwLCAweDFjLCAweDUyLCAweDY5LCAweDAwLCAweDJhLCAweDEyLCAweGQwLCAweDAyLCAweDY5LCAweDUzLCAweDFjLCAKKzB4OTIsIDB4MDAsIDB4MTIsIDB4MTgsIDB4MDMsIDB4NjEsIDB4OTEsIDB4NjEsIDB4NDEsIDB4NjksIDB4MDEsIDB4MzEsIAorMHg0MSwgMHg2MSwgMHgwMiwgMHg2OSwgMHgwZiwgMHgyYSwgMHgwMCwgMHhkMywgMHgwNywgMHg2MSwgMHgwZiwgMHgyOSwgCisweDAwLCAweGQzLCAweDQ0LCAweDYwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDA4LCAweDFjLCAKKzB4ZmYsIDB4ZjcsIDB4ZWUsIDB4ZmUsIDB4ZjgsIDB4ZTcsIDB4MTUsIDB4NjksIDB4NmUsIDB4MWMsIDB4YWQsIDB4MDAsIAorMHhhZCwgMHgxOCwgMHgxNiwgMHg2MSwgMHhhOSwgMHg2MSwgMHg1NSwgMHg2OSwgMHgwMSwgMHgzNSwgMHg1NSwgMHg2MSwgCisweDE2LCAweDY5LCAweDBmLCAweDJlLCAweDAwLCAweGQzLCAweDE3LCAweDYxLCAweDBmLCAweDJkLCAweDAwLCAweGQzLCAKKzB4NTQsIDB4NjAsIDB4OGMsIDB4MDIsIDB4YTQsIDB4MGEsIDB4MTYsIDB4NGYsIDB4M2EsIDB4NmYsIDB4ZmQsIDB4NjgsIAorMHhmOSwgMHgxZCwgMHg3OSwgMHgzMSwgMHgwMSwgMHgyZCwgMHgwYywgMHhkMSwgMHhkYiwgMHg2ZCwgMHg1YiwgMHgwOCwgCisweDA5LCAweGQzLCAweDBiLCAweDg5LCAweDAwLCAweDJiLCAweDA2LCAweGQxLCAweGZkLCAweDZmLCAweDAzLCAweDNiLCAKKzB4MmUsIDB4NjgsIDB4MzMsIDB4NDAsIDB4MmIsIDB4NjAsIDB4MTQsIDB4MjMsIDB4MGIsIDB4ODEsIDB4MTAsIDB4NjAsIAorMHg4MCwgMHgwNywgMHg4MCwgMHgwYSwgMHgyMCwgMHg0MywgMHgwMywgMHgwNCwgMHgwMCwgMHhkMCwgMHgwMSwgMHgzOCwgCisweDUwLCAweDYwLCAweDA5LCAweDZhLCAweDA4LCAweDMyLCAweDkxLCAweDQyLCAweDAwLCAweGQ4LCAweDA3LCAweDRhLCAKKzB4MDAsIDB4MGQsIDB4MDIsIDB4ZDMsIDB4NTEsIDB4MjAsIDB4ODAsIDB4MDMsIDB4ODIsIDB4NjEsIDB4M2EsIDB4NjcsIAorMHhiZSwgMHhlNywgMHgwMCwgMHgwMCwgMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHhhMCwgMHgxYywgMHgwMCwgMHg4MCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDI0LCAweGE3LCAweDIwLCAweDQwLCAKKzB4YjAsIDB4YjUsIDB4MDAsIDB4MjgsIDB4MDQsIDB4ZDEsIDB4MDEsIDB4MjAsIDB4YzAsIDB4MDUsIDB4MTYsIDB4NDksIAorMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHgxNSwgMHg0YywgMHgwMCwgMHgyNSwgMHg2NywgMHg2OSwgMHgwMCwgMHgyZiwgCisweDE2LCAweGQwLCAweGUwLCAweDY4LCAweDQxLCAweDFjLCAweDgwLCAweDAwLCAweDAwLCAweDE5LCAweGUxLCAweDYwLCAKKzB4ODAsIDB4NjksIDB4MDEsIDB4M2YsIDB4ZmYsIDB4ZjcsIDB4OTQsIDB4ZmUsIDB4ZTAsIDB4NjgsIDB4MGYsIDB4MjgsIAorMHgwMCwgMHhkMywgMHhlNSwgMHg2MCwgMHhlMCwgMHg2OCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg4MCwgMHg2OSwgCisweDAwLCAweDA4LCAweDAxLCAweGQzLCAweDAwLCAweDJmLCAweGVhLCAweGQxLCAweDY3LCAweDYxLCAweDAzLCAweGUwLCAKKzB4MDgsIDB4NDgsIDB4MDEsIDB4NmQsIDB4MDEsIDB4MzEsIDB4MDEsIDB4NjUsIDB4NjUsIDB4NjAsIDB4MjAsIDB4NjgsIAorMHgwMCwgMHgyOCwgMHgwMSwgMHhkMCwgMHhmZiwgMHhmNywgMHgyNiwgMHhmZiwgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAweGEwLCAweDFjLCAweDAwLCAweDgwLCAKKzB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4YjAsIDB4YjQsIDB4MTAsIDB4MjMsIAorMHg4MiwgMHg2OCwgMHgxMywgMHg0MCwgMHgwMCwgMHgyMSwgMHgwMCwgMHgyYiwgMHgxNSwgMHhkMCwgMHgwYywgMHg0YiwgCisweDFhLCAweDQwLCAweDEyLCAweDAxLCAweDgxLCAweDI0LCAweDE0LCAweDQzLCAweDAyLCAweDY4LCAweDE1LCAweDY4LCAKKzB4MTMsIDB4MWQsIDB4ODAsIDB4Y2IsIDB4MWIsIDB4NjgsIDB4MDQsIDB4M2EsIDB4MDIsIDB4NjAsIDB4MjAsIDB4YzIsIAorMHg4MCwgMHhjMiwgMHgwOCwgMHhjMiwgMHgxNCwgMHg2MCwgMHg0MiwgMHg2OCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgCisweDA0LCAweDMyLCAweDFhLCAweDQzLCAweDQyLCAweDYwLCAweDA4LCAweDFjLCAweGIwLCAweGJjLCAweDcwLCAweDQ3LCAKKzB4MDAsIDB4ZjAsIDB4ZmYsIDB4MGYsIDB4ZjAsIDB4YjQsIDB4ODIsIDB4NjgsIDB4NTMsIDB4MDksIDB4MzQsIDB4ZDMsIAorMHgxYiwgMHg0YiwgMHgxYSwgMHg0MCwgMHgxMiwgMHgwMSwgMHg4MSwgMHgyNiwgMHgxNiwgMHg0MywgMHgwMywgMHg2OCwgCisweDFkLCAweDY4LCAweDFmLCAweDFkLCAweDEwLCAweGNmLCAweDNmLCAweDY4LCAweDA0LCAweDNiLCAweDAzLCAweDYwLCAKKzB4MjAsIDB4YzMsIDB4MTAsIDB4YzMsIDB4ODAsIDB4YzMsIDB4MWUsIDB4NjAsIDB4NDMsIDB4NjgsIDB4MWYsIDB4MWQsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgzYiwgMHg0MywgMHg0MywgMHg2MCwgMHhjYiwgMHg2YiwgMHgxOCwgMHgxZiwgCisweGM4LCAweDYzLCAweDgwLCAweGNiLCAweDgwLCAweGMwLCAweDFjLCAweDY4LCAweDFmLCAweDFkLCAweDAzLCAweDFkLCAKKzB4MDQsIDB4NjAsIDB4MzgsIDB4MWMsIDB4M2YsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MWYsIDB4NjAsIDB4MWYsIDB4MWQsIAorMHg0MywgMHg2OCwgMHgxYywgMHgwNCwgMHgyNCwgMHgwYywgMHg4MSwgMHgyMywgMHgyMywgMHg0MywgMHgzYiwgMHg2MCwgCisweDQwLCAweDY4LCAweDAwLCAweDBjLCAweDAwLCAweDA0LCAweDEwLCAweDQzLCAweDc4LCAweDYwLCAweDA4LCAweDZlLCAKKzB4MDQsIDB4MzAsIDB4MDgsIDB4NjYsIDB4NDgsIDB4NmUsIDB4MDQsIDB4MzAsIDB4NDgsIDB4NjYsIDB4MDAsIDB4MjAsIAorMHhmMCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMCwgMHhmMCwgMHhmZiwgMHgwZiwgMHg4MCwgMHhiNCwgMHg4MSwgMHg2YSwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweGNhLCAweDFkLCAweDA1LCAweDMyLCAweDFhLCAweDQzLCAweDEyLCAweDY4LCAKKzB4Y2YsIDB4MWQsIDB4MDEsIDB4MzcsIDB4M2IsIDB4NDMsIDB4MWIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4Y2IsIDB4NjAsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwZiwgMHgxZCwgMHgzYiwgMHg0MywgMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDhiLCAweDYwLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDBiLCAweDQzLCAweDFiLCAweDY4LCAweDBjLCAweGMxLCAKKzB4MDIsIDB4NjIsIDB4MDEsIDB4NmIsIDB4YzAsIDB4NDYsIDB4MGEsIDB4NjIsIDB4MDQsIDB4MjMsIDB4ODEsIDB4NjksIAorMHgxOSwgMHg0MywgMHg4MSwgMHg2MSwgMHgwMiwgMHg2YiwgMHhjMCwgMHg0NiwgMHg5MSwgMHg2MSwgMHg4MSwgMHg2YSwgCisweDA0LCAweDMxLCAweDgxLCAweDYyLCAweDAyLCAweDZiLCAweGMwLCAweDQ2LCAweDkxLCAweDYyLCAweGMxLCAweDFkLCAKKzB4MzksIDB4MzEsIDB4NGEsIDB4OGIsIDB4MDQsIDB4M2EsIDB4NGEsIDB4ODMsIDB4NDksIDB4OGIsIDB4MDIsIDB4NmIsIAorMHg0MCwgMHgzMiwgMHg1MSwgMHg4MywgMHhjMSwgMHg4OSwgMHgwNCwgMHgzOSwgMHhjMSwgMHg4MSwgMHhjMSwgMHg2OCwgCisweDAwLCAweDZiLCAweGMwLCAweDQ2LCAweGMxLCAweDYwLCAweDAwLCAweDIwLCAweDgwLCAweGJjLCAweDcwLCAweDQ3LCAKKzB4MDAsIDB4NDcsIDB4MDgsIDB4NDcsIDB4MTAsIDB4NDcsIDB4MTgsIDB4NDcsIDB4MjAsIDB4NDcsIDB4MjgsIDB4NDcsIAorMHgzMCwgMHg0NywgMHgzOCwgMHg0NywgMHgzMCwgMHg0MCwgMHgyZCwgMHhlOSwgMHgwYywgMHhjMCwgMHg5ZCwgMHhlNSwgCisweDBjLCAweDQ4LCAweGEwLCAweGUxLCAweDI0LCAweDQ4LCAweGIwLCAweGUxLCAweDFlLCAweDAwLCAweDAwLCAweDBhLCAKKzB4MDEsIDB4YzAsIDB4NGMsIDB4ZTIsIDB4MTgsIDB4NDAsIDB4YTAsIDB4ZTMsIDB4NjQsIDB4NTEsIDB4OWYsIDB4ZTUsIAorMHg5NCwgMHg1MCwgMHgyMCwgMHhlMCwgMHgwMCwgMHg1MCwgMHg5MCwgMHhlNSwgMHgxNCwgMHg0MCwgMHg5MCwgMHhlNSwgCisweDAwLCAweDMwLCAweDg1LCAweGU1LCAweDA0LCAweGMwLCAweDg1LCAweGU1LCAweDA4LCAweDEwLCAweDg1LCAweGU1LCAKKzB4MGMsIDB4MjAsIDB4ODUsIDB4ZTUsIDB4MTAsIDB4MTAsIDB4OTAsIDB4ZTUsIAorMHgxMCwgMHg1MCwgMHg4NSwgMHhlMiwgMHgwMSwgMHgwMCwgMHg1NSwgMHhlMSwgMHgwYywgMHg1MCwgMHg5MCwgMHg1NSwgCisweDA0LCAweDAwLCAweDU1LCAweGUxLCAweDA1LCAweDAwLCAweDAwLCAweDBhLCAweDA0LCAweDEwLCAweDkwLCAweGU1LCAKKzB4MDAsIDB4NTAsIDB4ODAsIDB4ZTUsIDB4MDAsIDB4NTAsIDB4ODEsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4YTAsIDB4ZTMsIAorMHgzMCwgMHg0MCwgMHhiZCwgMHhlOCwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHgwMCwgMHgzMCwgMHg5MywgMHhlNSwgCisweDA4LCAweDIwLCAweDkwLCAweGU1LCAweDAxLCAweDMxLCAweDgzLCAweGUzLCAweDAyLCAweDM2LCAweDgzLCAweGUzLCAKKzB4MDMsIDB4MDAsIDB4NTUsIDB4ZTEsIDB4MTQsIDB4MzAsIDB4ODAsIDB4ZTUsIDB4ZjIsIDB4ZmYsIDB4ZmYsIDB4MWEsIAorMHgwMSwgMHgwMCwgMHhhMCwgMHhlMywgMHhmNCwgMHhmZiwgMHhmZiwgMHhlYSwgMHgwMSwgMHgwNiwgMHgxYywgMHhlMywgCisweGYxLCAweGZmLCAweGZmLCAweDBhLCAweGVjLCAweDEwLCAweDlmLCAweGU1LCAweDAyLCAweGM2LCAweGNjLCAweGUzLCAKKzB4NTQsIDB4MjAsIDB4OTEsIDB4ZTUsIDB4ZTQsIDB4MzAsIDB4OWYsIDB4ZTUsIDB4NTAsIDB4MTAsIDB4OTEsIDB4ZTUsIAorMHhkOSwgMHhmZiwgMHhmZiwgMHhlYSwgMHhmMCwgMHg0NywgMHgyZCwgMHhlOSwgMHgyMCwgMHhjMCwgMHg5ZCwgMHhlNSwgCisweDBjLCAweDY4LCAweGEwLCAweGUxLCAweDI2LCAweDY4LCAweGIwLCAweGUxLCAweDI1LCAweDAwLCAweDAwLCAweDBhLCAKKzB4MTgsIDB4NDAsIDB4YTAsIDB4ZTMsIDB4YjgsIDB4NTAsIDB4OWYsIDB4ZTUsIDB4OTQsIDB4MDAsIDB4MDAsIDB4ZTAsIAorMHgwNSwgMHgwMCwgMHg4MCwgMHhlMCwgMHgwOCwgMHg0MCwgMHg5MCwgMHhlNSwgMHgwNCwgMHg4MCwgMHg5MCwgMHhlNSwgCisweDAwLCAweDcwLCAweGEwLCAweGUzLCAweDFmLCAweGMwLCAweGEwLCAweGUzLCAweDAyLCAweGM0LCAweDhjLCAweGUzLCAKKzB4MDAsIDB4NTAsIDB4OTAsIDB4ZTUsIDB4MTAsIDB4OTAsIDB4OTAsIDB4ZTUsIDB4MTQsIDB4YTAsIDB4OTAsIDB4ZTUsIAorMHgwMCwgMHgzMCwgMHg4NSwgMHhlNSwgMHgwNCwgMHhjMCwgMHg4NSwgMHhlNSwgMHgwOCwgMHgxMCwgMHg4NSwgMHhlNSwgCisweDBjLCAweDIwLCAweDg1LCAweGU1LCAweDEwLCAweDUwLCAweDg1LCAweGUyLCAweDA5LCAweDAwLCAweDU1LCAweGUxLCAKKzB4MGMsIDB4NTAsIDB4OTAsIDB4NTUsIDB4MGEsIDB4MDAsIDB4NTUsIDB4ZTEsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MGEsIAorMHgwMywgMHg3MCwgMHgxNywgMHhlMiwgMHgyMCwgMHgxMCwgMHg4MSwgMHhlMiwgMHgyMCwgMHgzMCwgMHg4MywgMHhlMiwgCisweDBhLCAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDYwLCAweDk2LCAweGUyLCAweDAxLCAweDcwLCAweDg3LCAweGUyLCAKKzB4MDksIDB4MDAsIDB4MDAsIDB4MGEsIDB4MjAsIDB4NjAsIDB4NDYsIDB4ZTIsIDB4MjAsIDB4MDAsIDB4NTYsIDB4ZTMsIAorMHhlYywgMHhmZiwgMHhmZiwgMHhjYSwgMHgwMCwgMHg3MCwgMHhhMCwgMHhlMywgMHgwMSwgMHhjMCwgMHg0NiwgMHhlMiwgCisweDAyLCAweGM0LCAweDhjLCAweGUzLCAweDAwLCAweDYwLCAweGEwLCAweGUzLCAweGU3LCAweGZmLCAweGZmLCAweGVhLCAKKzB4MDAsIDB4NTAsIDB4ODgsIDB4ZTUsIDB4ZjIsIDB4ZmYsIDB4ZmYsIDB4ZWEsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHgwMCwgMHg1MCwgMHg4MCwgMHhlNSwgMHgwMSwgMHgwMCwgMHhhMCwgMHhlMSwgMHhmMCwgMHg0NywgMHhiZCwgMHhlOCwgCisweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDAwLCAweGEwLCAweDk0LCAweGU1LCAweDBhLCAweDAwLCAweDU1LCAweGUxLCAKKzB4MTQsIDB4YTAsIDB4ODAsIDB4ZTUsIDB4ZTUsIDB4ZmYsIDB4ZmYsIDB4MWEsIDB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHhmNSwgMHhmZiwgMHhmZiwgMHhlYSwgMHhhOCwgMHgwMywgMHgwMCwgMHg4MCwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgCisweDAwLCAweDgwLCAweDIwLCAweDQwLCAweDY4LCAweDgyLCAweDlmLCAweGU1LCAweDBiLCAweDkyLCAweGEwLCAweGUzLCAKKzB4NjQsIDB4YTIsIDB4OWYsIDB4ZTUsIDB4NTgsIDB4YjAsIDB4OWEsIDB4ZTUsIDB4MGUsIDB4ZjAsIDB4YTAsIDB4ZTEsIAorMHg1NCwgMHhiMCwgMHg5YSwgMHhlNSwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHgzZiwgMHg0MCwgMHgyZCwgMHhlOSwgCisweDAwLCAweDAwLCAweDRmLCAweGUxLCAweDFmLCAweDAwLCAweDAwLCAweGUyLCAweDEyLCAweDAwLCAweDUwLCAweGUzLCAKKzB4NTQsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4ZTEsIDB4ODAsIDB4MDAsIDB4YzAsIDB4ZTMsIAorMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgMHgwNCwgMHg1MCwgMHhhMCwgMHhlMywgMHgwMCwgMHg0MCwgMHg5OSwgMHhlNSwgCisweDA5LCAweDAwLCAweDAwLCAweGVhLCAweDAyLCAweDAwLCAweDE0LCAweGUzLCAweDUzLCAweDAwLCAweDAwLCAweDFiLCAKKzB4ODAsIDB4MDAsIDB4MTQsIDB4ZTMsIDB4NTksIDB4MDAsIDB4MDAsIDB4MWIsIDB4MjAsIDB4MDAsIDB4MTQsIDB4ZTMsIAorMHg1OSwgMHgwMCwgMHgwMCwgMHgxYiwgMHgwMiwgMHgwNywgMHgxNCwgMHhlMywgMHg1OSwgMHgwMCwgMHgwMCwgMHgxYiwgCisweDAxLCAweDA2LCAweDE0LCAweGUzLCAweDU5LCAweDAwLCAweDAwLCAweDFiLCAweDA4LCAweDAwLCAweDE0LCAweGUzLCAKKzB4NDUsIDB4MDAsIDB4MDAsIDB4MWIsIDB4MDIsIDB4MDUsIDB4MTQsIDB4ZTMsIDB4NGEsIDB4MDAsIDB4MDAsIDB4MWIsIAorMHgwMiwgMHgwOCwgMHgxNCwgMHhlMywgMHg0YiwgMHgwMCwgMHgwMCwgMHgxYiwgMHhlNSwgMHgwZSwgMHgxNCwgMHhlMywgCisweDA3LCAweDAwLCAweDAwLCAweDBhLCAweDA0LCAweDIwLCAweDk4LCAweGU1LCAweDBjLCAweDEwLCAweDk4LCAweGU1LCAKKzB4MDQsIDB4MzAsIDB4NTIsIDB4ZTIsIDB4M2MsIDB4MzAsIDB4YTAsIDB4YjMsIDB4MDQsIDB4MzAsIDB4ODgsIDB4ZTUsIAorMHgwMiwgMHgwMCwgMHg5MSwgMHhlNywgMHgwZiwgMHhlMCwgMHhhMCwgMHhlMSwgCisweDEwLCAweGZmLCAweDJmLCAweGUxLCAweDAxLCAweDUwLCAweDU1LCAweGUyLCAweDAzLCAweDAwLCAweDAwLCAweDBhLCAKKzB4MDAsIDB4NDAsIDB4OTksIDB4ZTUsIDB4MGMsIDB4MDAsIDB4OWEsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4MTQsIDB4ZTEsIAorMHgxYiwgMHhmZiwgMHgyZiwgMHgxMSwgMHgwOCwgMHgwMCwgMHg5YSwgMHhlNSwgMHgwMCwgMHgwMCwgMHgxNCwgMHhlMSwgCisweDBiLCAweDAwLCAweDAwLCAweDBhLCAweDAxLCAweDBjLCAweDE0LCAweGUzLCAweDk4LCAweDAxLCAweDlmLCAweDE1LCAKKzB4MGYsIDB4ZTAsIDB4YTAsIDB4MTEsIDB4MTAsIDB4ZmYsIDB4MmYsIDB4MTEsIDB4MDIsIDB4MDQsIDB4MTQsIDB4ZTMsIAorMHg4YywgMHgwMSwgMHg5ZiwgMHgxNSwgMHgwZiwgMHhlMCwgMHhhMCwgMHgxMSwgMHgxMCwgMHhmZiwgMHgyZiwgMHgxMSwgCisweDAxLCAweDA5LCAweDE0LCAweGUzLCAweDgwLCAweDAxLCAweDlmLCAweDE1LCAweDBmLCAweGUwLCAweGEwLCAweDExLCAKKzB4MTAsIDB4ZmYsIDB4MmYsIDB4MTEsIDB4MDQsIDB4MDAsIDB4OWEsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4MTQsIDB4ZTEsIAorMHgxNiwgMHgwMCwgMHgwMCwgMHgwYSwgMHg1NCwgMHhlMCwgMHg4ZiwgMHhlMiwgMHgwNCwgMHgwMCwgMHgxNCwgMHhlMywgCisweDQwLCAweDAwLCAweDlhLCAweDE1LCAweDEwLCAweGZmLCAweDJmLCAweDExLCAweDAyLCAweDBhLCAweDE0LCAweGUzLCAKKzB4NDQsIDB4MDAsIDB4OWEsIDB4MTUsIDB4MTAsIDB4ZmYsIDB4MmYsIDB4MTEsIDB4MDIsIDB4MDksIDB4MTQsIDB4ZTMsIAorMHg0OCwgMHgwMCwgMHg5YSwgMHgxNSwgMHgxMCwgMHhmZiwgMHgyZiwgMHgxMSwgMHgwMSwgMHgwMiwgMHgxNCwgMHhlMywgCisweDRjLCAweDAwLCAweDlhLCAweDE1LCAweDEwLCAweGZmLCAweDJmLCAweDExLCAweDAxLCAweDA0LCAweDE0LCAweGUzLCAKKzB4NTAsIDB4MDAsIDB4OWEsIDB4MTUsIDB4MTAsIDB4ZmYsIDB4MmYsIDB4MTEsIDB4MDEsIDB4MGEsIDB4MTQsIDB4ZTMsIAorMHgyMSwgMHgwMCwgMHgwMCwgMHgxYiwgMHgwMiwgMHgwMCwgMHgxNCwgMHhlMywgMHgwZSwgMHgwMCwgMHgwMCwgMHgxYiwgCisweDEwLCAweDAwLCAweDlhLCAweGU1LCAweDAwLCAweDAwLCAweDE0LCAweGUxLCAweDFjLCAweDAwLCAweDAwLCAweDFiLCAKKzB4MDAsIDB4NDAsIDB4OTksIDB4ZTUsIDB4MDQsIDB4NTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4NDAsIDB4OTQsIDB4ZTIsIAorMHgxYiwgMHhmZiwgMHgyZiwgMHgxMSwgMHgzZiwgMHg0MCwgMHhiZCwgMHhlOCwgMHgwNCwgMHhmMCwgMHg1ZSwgMHhlMiwgCisweGMwLCAweDAwLCAweDgwLCAweGUzLCAweDAwLCAweGYwLCAweDYxLCAweGUxLCAweGZhLCAweGZmLCAweGZmLCAweGVhLCAKKzB4MTgsIDB4MDAsIDB4OWEsIDB4ZTUsIDB4MWMsIDB4MTAsIDB4OWEsIDB4ZTUsIDB4MTEsIDB4ZmYsIDB4MmYsIDB4ZTEsIAorMHg1NCwgMHhiMCwgMHg5YSwgMHhlNSwgMHgxYywgMHgxMCwgMHg5YSwgMHhlNSwgMHgxNCwgMHgwMCwgMHg5YSwgMHhlNSwgCisweDExLCAweGZmLCAweDJmLCAweGUxLCAweDIwLCAweDEwLCAweDlhLCAweGU1LCAweDAwLCAweDAwLCAweGEwLCAweGUzLCAKKzB4MTEsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MjQsIDB4MTAsIDB4OWEsIDB4ZTUsIDB4MTEsIDB4ZmYsIDB4MmYsIDB4ZTEsIAorMHgyOCwgMHgxMCwgMHg5YSwgMHhlNSwgMHgxMSwgMHhmZiwgMHgyZiwgMHhlMSwgMHgyYywgMHgxMCwgMHg5YSwgMHhlNSwgCisweDExLCAweGZmLCAweDJmLCAweGUxLCAweDMwLCAweDEwLCAweDlhLCAweGU1LCAweDExLCAweGZmLCAweDJmLCAweGUxLCAKKzB4MzQsIDB4MTAsIDB4OWEsIDB4ZTUsIDB4MTEsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZWEsIAorMHgzOCwgMHhlMCwgMHg5YSwgMHhlNSwgMHgzYywgMHgxMCwgMHg5YSwgMHhlNSwgMHgxOCwgMHgwMCwgMHg5YSwgMHhlNSwgCisweDExLCAweGZmLCAweDJmLCAweGUxLCAweDM4LCAweGUwLCAweDlhLCAweGU1LCAweDNjLCAweDEwLCAweDlhLCAweGU1LCAKKzB4MTQsIDB4MDAsIDB4OWEsIDB4ZTUsIDB4MTEsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4NjQsIDB4MjAsIDB4OWYsIDB4ZTUsIAorMHgwMCwgMHgzMCwgMHg5MiwgMHhlNSwgMHgwMCwgMHgzMCwgMHg1MywgMHhlMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHhiYSwgCisweDAwLCAweDMwLCAweDgyLCAweGU1LCAweDBjLCAweDAwLCAweDkyLCAweGU1LCAweDA4LCAweDMwLCAweDkyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4OTEsIDB4ZTIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDMsIDB4MTAsIDB4ODAsIDB4ZTcsIAorMHgwNCwgMHgzMCwgMHg1MywgMHhlMiwgMHgzYywgMHgzMCwgMHhhMCwgMHhiMywgMHgwOCwgMHgzMCwgMHg4MiwgMHhlNSwgCisweDAxLCAweDAwLCAweGEwLCAweGUzLCAweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDNjLCAweDEwLCAweDlmLCAweGU1LCAKKzB4MDAsIDB4MDAsIDB4OTEsIDB4ZTUsIDB4MDEsIDB4MDAsIDB4ODAsIDB4ZTIsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ZTUsIAorMHgwMCwgMHgwMCwgMHhhMCwgMHhlMywgMHhmOCwgMHhmZiwgMHhmZiwgMHhlYSwgMHgxMCwgMHgwMCwgMHg5ZiwgMHhlNSwgCisweDA4LCAweDEwLCAweDkwLCAweGU1LCAweDA0LCAweDEwLCAweDUxLCAweGUyLCAweDNjLCAweDEwLCAweGEwLCAweGIzLCAKKzB4MDgsIDB4MTAsIDB4ODAsIDB4ZTUsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4ZTQsIDB4MmQsIDB4MDAsIDB4ODAsIAorMHhjYywgMHgwNCwgMHgwMCwgMHg4MCwgMHg3MSwgMHgyYiwgMHhmZiwgMHhmZiwgMHhkMSwgMHgzZCwgMHhmZiwgMHhmZiwgCisweGM5LCAweDJiLCAweGZmLCAweGZmLCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAweGM5LCAweDFjLCAweDg5LCAweDA4LCAKKzB4ODksIDB4MDAsIDB4MDEsIDB4MjMsIDB4ODUsIDB4NGEsIDB4NWIsIDB4MDcsIDB4MTgsIDB4NDMsIDB4MTMsIDB4NjgsIAorMHg1YiwgMHgxOCwgMHgxMywgMHg2MCwgMHgwMCwgMHgxZiwgMHg4MSwgMHhhMywgMHg1YiwgMHgxYSwgMHgxOCwgMHg0NywgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4ZTQsIDB4MmQsIDB4MDAsIDB4ODAsIAorMHg5OCwgMHgwMCwgMHg5ZiwgMHhlNSwgMHg5OCwgMHgxMCwgMHg5ZiwgMHhlNSwgMHgwMSwgMHgyMCwgMHg0MCwgMHhlMCwgCisweDk0LCAweDMwLCAweDlmLCAweGU1LCAweDAwLCAweDAwLCAweDkxLCAweGU1LCAweDAzLCAweDAwLCAweDUwLCAweGUxLCAKKzB4MDMsIDB4MDAsIDB4MDAsIDB4MWEsIDB4MDQsIDB4MTAsIDB4ODEsIDB4ZTIsIDB4MDQsIDB4MjAsIDB4NTIsIDB4ZTIsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgMHhmOCwgMHhmZiwgMHhmZiwgMHhlYSwgMHg3OCwgMHgwMCwgMHg5ZiwgMHhlNSwgCisweDAwLCAweDIwLCAweDgwLCAweGU1LCAweDc0LCAweDAwLCAweDlmLCAweGU1LCAweDc0LCAweDEwLCAweDlmLCAweGU1LCAKKzB4MDEsIDB4MjAsIDB4NDAsIDB4ZTAsIDB4NjAsIDB4MzAsIDB4OWYsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4OTEsIDB4ZTUsIAorMHgwMywgMHgwMCwgMHg1MCwgMHhlMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgxYSwgMHgwNCwgMHgxMCwgMHg4MSwgMHhlMiwgCisweDA0LCAweDIwLCAweDUyLCAweGUyLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweGY4LCAweGZmLCAweGZmLCAweGVhLCAKKzB4NTAsIDB4MDAsIDB4OWYsIDB4ZTUsIDB4MDAsIDB4MjAsIDB4ODAsIDB4ZTUsIDB4NGMsIDB4MDAsIDB4OWYsIDB4ZTUsIAorMHg0YywgMHgxMCwgMHg5ZiwgMHhlNSwgMHgwMSwgMHgyMCwgMHg0MCwgMHhlMCwgMHgyYywgMHgzMCwgMHg5ZiwgMHhlNSwgCisweDAwLCAweDAwLCAweDkxLCAweGU1LCAweDAzLCAweDAwLCAweDUwLCAweGUxLCAweDAzLCAweDAwLCAweDAwLCAweDFhLCAKKzB4MDQsIDB4MTAsIDB4ODEsIDB4ZTIsIDB4MDQsIDB4MjAsIDB4NTIsIDB4ZTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsIAorMHhmOCwgMHhmZiwgMHhmZiwgMHhlYSwgMHgyOCwgMHgwMCwgMHg5ZiwgMHhlNSwgMHgwMCwgMHgyMCwgMHg4MCwgMHhlNSwgCisweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDdjLCAweDM0LCAweDAwLCAweDgwLCAweDgwLCAweDMwLCAweDAwLCAweDgwLCAKKzB4YWQsIDB4ZGUsIDB4YWQsIDB4ZGUsIDB4YzAsIDB4MDQsIDB4MDAsIDB4ODAsIDB4ZmMsIDB4MzcsIDB4MDAsIDB4ODAsIAorMHg4MCwgMHgzNCwgMHgwMCwgMHg4MCwgMHhjNCwgMHgwNCwgMHgwMCwgMHg4MCwgMHhmYywgMHgzZiwgMHgwMCwgMHg4MCwgCisweDQwLCAweDM4LCAweDAwLCAweDgwLCAweGM4LCAweDA0LCAweDAwLCAweDgwLCAweDc4LCAweDQ3LCAweDAwLCAweDAwLCAKKzB4NzEsIDB4ZWEsIDB4ZmYsIDB4ZWEsIDB4NzgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MzksIDB4ZmUsIDB4ZmYsIDB4ZWEsIAorMHg3OCwgMHg0NywgMHgwMCwgMHgwMCwgMHg2MywgMHhmZSwgMHhmZiwgMHhlYSwgMHg3OCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDFiLCAweGZmLCAweGZmLCAweGVhLCAweDc4LCAweDQ3LCAweDAwLCAweDAwLCAweDZiLCAweGVhLCAweGZmLCAweGVhLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIAorMHgyOCwgMHgwNCwgMHgwMCwgMHgwMCwgMHhmOCwgMHgzZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg4MCwgCisweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI5LCAweDBiLCAweGZmLCAweGZmLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDUsIDB4MGIsIDB4ZmYsIDB4ZmYsIDB4MDMsIDB4ZmYsIDB4MDYsIDB4NTQsIAorMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NSwgMHgwNCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweGExLCAweDA1LCAweGZmLCAweGZmLCAweDA0LCAweGZmLCAweDA3LCAweDU0LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAKKzB4YjUsIDB4MDQsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjEsIDB4MDUsIDB4ZmYsIDB4ZmYsIAorMHgwNSwgMHhmZiwgMHgwNSwgMHg1NCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgzOSwgMHgwNCwgMHhmZiwgMHhmZiwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU1LCAweDA1LCAweGZmLCAweGZmLCAweDAxLCAweGZmLCAweDA0LCAweDAwLCAKKzB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDEsIDB4MTgsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHg2MSwgMHgwZSwgMHhmZiwgMHhmZiwgMHgwMiwgMHhmZiwgMHgwMiwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweGExLCAweDAyLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGYxLCAweDAyLCAweGZmLCAweGZmLCAKKzB4ZmYsIDB4ZmYsIDB4MDEsIDB4NDQsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5ZCwgMHgwZCwgMHhmZiwgMHhmZiwgMHgwNiwgMHgwMCwgMHhmZiwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDNkLCAweDUwLCAweGZmLCAweGZmLCAweDgxLCAweDUwLCAweGZmLCAweGZmLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4NDgsIDB4MDUsIDB4MDAsIDB4ODAsIDB4MTEsIDB4NzUsIDB4MjEsIDB4NDAsIDB4MWIsIDB4NzUsIDB4MjEsIDB4NDAsIAorMHgzMSwgMHg3NSwgMHgyMSwgMHg0MCwgMHg0OSwgMHg3NSwgMHgyMSwgMHg0MCwgCisweDU1LCAweDc1LCAweDIxLCAweDQwLCAweDYzLCAweDc1LCAweDIxLCAweDQwLCAweDdkLCAweDc1LCAweDIxLCAweDQwLCAKKzB4YTksIDB4NzUsIDB4MjEsIDB4NDAsIDB4NmQsIDB4NzYsIDB4MjEsIDB4NDAsIDB4YzUsIDB4NzYsIDB4MjEsIDB4NDAsIAorMHhkMywgMHg3NiwgMHgyMSwgMHg0MCwgMHhkZCwgMHg3NiwgMHgyMSwgMHg0MCwgMHhlNywgMHg3NiwgMHgyMSwgMHg0MCwgCisweDk5LCAweDc3LCAweDIxLCAweDQwLCAweGE3LCAweDc3LCAweDIxLCAweDQwLCAweGI1LCAweDc3LCAweDIxLCAweDQwLCAKKzB4NjEsIDB4NzgsIDB4MjEsIDB4NDAsIDB4NWYsIDB4N2MsIDB4MjEsIDB4NDAsIDB4ZTksIDB4N2MsIDB4MjEsIDB4NDAsIAorMHg4OSwgMHg3ZCwgMHgyMSwgMHg0MCwgMHhiZCwgMHg3ZSwgMHgyMSwgMHg0MCwgMHhjOSwgMHg3ZSwgMHgyMSwgMHg0MCwgCisweDI5LCAweDdmLCAweDIxLCAweDQwLCAweDhkLCAweDdmLCAweDIxLCAweDQwLCAweGI5LCAweDdmLCAweDIxLCAweDQwLCAKKzB4ZGQsIDB4N2YsIDB4MjEsIDB4NDAsIDB4MWQsIDB4ODAsIDB4MjEsIDB4NDAsIDB4NDUsIDB4ODAsIDB4MjEsIDB4NDAsIAorMHg4ZCwgMHg4MCwgMHgyMSwgMHg0MCwgMHg5ZCwgMHg4MCwgMHgyMSwgMHg0MCwgMHhjNSwgMHg4MCwgMHgyMSwgMHg0MCwgCisweGQ1LCAweDgwLCAweDIxLCAweDQwLCAweDFkLCAweDgxLCAweDIxLCAweDQwLCAweDViLCAweDgxLCAweDIxLCAweDQwLCAKKzB4YjEsIDB4ODEsIDB4MjEsIDB4NDAsIDB4MTEsIDB4ODIsIDB4MjEsIDB4NDAsIDB4MWIsIDB4ODIsIDB4MjEsIDB4NDAsIAorMHgxZiwgMHg4MiwgMHgyMSwgMHg0MCwgMHg4ZCwgMHg4MiwgMHgyMSwgMHg0MCwgMHhkOSwgMHg4MiwgMHgyMSwgMHg0MCwgCisweDMxLCAweDgzLCAweDIxLCAweDQwLCAweDZkLCAweDgzLCAweDIxLCAweDQwLCAweGQxLCAweDgzLCAweDIxLCAweDQwLCAKKzB4MDksIDB4ODQsIDB4MjEsIDB4NDAsIDB4MTksIDB4ODQsIDB4MjEsIDB4NDAsIDB4NTEsIDB4ODQsIDB4MjEsIDB4NDAsIAorMHg2MSwgMHg4NCwgMHgyMSwgMHg0MCwgMHg3NSwgMHg4NCwgMHgyMSwgMHg0MCwgMHg5ZCwgMHg4NCwgMHgyMSwgMHg0MCwgCisweGE3LCAweDg0LCAweDIxLCAweDQwLCAweGIxLCAweDg0LCAweDIxLCAweDQwLCAweDE1LCAweDg1LCAweDIxLCAweDQwLCAKKzB4NDUsIDB4ODUsIDB4MjEsIDB4NDAsIDB4NTEsIDB4ODUsIDB4MjEsIDB4NDAsIDB4YzUsIDB4ODUsIDB4MjEsIDB4NDAsIAorMHhjZiwgMHg4NSwgMHgyMSwgMHg0MCwgMHhkOSwgMHg4NSwgMHgyMSwgMHg0MCwgMHhlMywgMHg4NSwgMHgyMSwgMHg0MCwgCisweGVkLCAweDg1LCAweDIxLCAweDQwLCAweGY3LCAweDg1LCAweDIxLCAweDQwLCAweDAxLCAweDg2LCAweDIxLCAweDQwLCAKKzB4MGIsIDB4ODYsIDB4MjEsIDB4NDAsIDB4MTUsIDB4ODYsIDB4MjEsIDB4NDAsIDB4MDEsIDB4ODksIDB4MjEsIDB4NDAsIAorMHgxZiwgMHg4NiwgMHgyMSwgMHg0MCwgMHgyOSwgMHg4NiwgMHgyMSwgMHg0MCwgMHgzMywgMHg4NiwgMHgyMSwgMHg0MCwgCisweDNkLCAweDg2LCAweDIxLCAweDQwLCAweDY1LCAweDg2LCAweDIxLCAweDQwLCAweDZmLCAweDg2LCAweDIxLCAweDQwLCAKKzB4ZDEsIDB4ODYsIDB4MjEsIDB4NDAsIDB4ZGIsIDB4ODYsIDB4MjEsIDB4NDAsIDB4ZTUsIDB4ODYsIDB4MjEsIDB4NDAsIAorMHhlZiwgMHg4NiwgMHgyMSwgMHg0MCwgMHhmOSwgMHg4NiwgMHgyMSwgMHg0MCwgMHg5ZCwgMHg3NCwgMHgyMSwgMHg0MCwgCisweDAzLCAweDg3LCAweDIxLCAweDQwLCAweDY5LCAweDg3LCAweDIxLCAweDQwLCAweGI1LCAweDg3LCAweDIxLCAweDQwLCAKKzB4ZjksIDB4ODcsIDB4MjEsIDB4NDAsIDB4MDksIDB4ODgsIDB4MjEsIDB4NDAsIDB4OWQsIDB4NzQsIDB4MjEsIDB4NDAsIAorMHg1NSwgMHg4OCwgMHgyMSwgMHg0MCwgMHg1OSwgMHg4OCwgMHgyMSwgMHg0MCwgMHg1ZCwgMHg4OCwgMHgyMSwgMHg0MCwgCisweGI1LCAweDg4LCAweDIxLCAweDQwLCAweGRkLCAweDg4LCAweDIxLCAweDQwLCAweGU5LCAweDg4LCAweDIxLCAweDQwLCAKKzB4ZWQsIDB4ODgsIDB4MjEsIDB4NDAsIDB4ZjEsIDB4ODgsIDB4MjEsIDB4NDAsIDB4ZjUsIDB4ODgsIDB4MjEsIDB4NDAsIAorMHhmOSwgMHg4OCwgMHgyMSwgMHg0MCwgMHhmZCwgMHg4OCwgMHgyMSwgMHg0MCwgMHgyZCwgMHg4NSwgMHgyMSwgMHg0MCwgCisweDg5LCAweDg1LCAweDIxLCAweDQwLCAweDlkLCAweDc0LCAweDIxLCAweDQwLCAweDlkLCAweDc0LCAweDIxLCAweDQwLCAKKzB4MGQsIDB4ODksIDB4MjEsIDB4NDAsIDB4OWQsIDB4NzQsIDB4MjEsIDB4NDAsIDB4ZTEsIDB4NzQsIDB4MjEsIDB4NDAsIAorMHg5ZCwgMHg3NCwgMHgyMSwgMHg0MCwgMHg5ZCwgMHg3NCwgMHgyMSwgMHg0MCwgMHg5ZCwgMHg3NCwgMHgyMSwgMHg0MCwgCisweDlkLCAweDc0LCAweDIxLCAweDQwLCAweDlkLCAweDc0LCAweDIxLCAweDQwLCAweDlkLCAweDc0LCAweDIxLCAweDQwLCAKKzB4NmIsIDB4NzgsIDB4MjEsIDB4NDAsIDB4ZjUsIDB4N2IsIDB4MjEsIDB4NDAsIDB4MzEsIDB4N2MsIDB4MjEsIDB4NDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDVjLCAweDAxLCAweDE4LCAweDQwLCAweDU4LCAweDAxLCAweDE4LCAweDQwLCAKKzB4MjQsIDB4YTMsIDB4MjAsIDB4NDAsIDB4MjQsIDB4YTcsIDB4MjAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2YywgMHgwMSwgMHgxOCwgMHg0MCwgMHg2OCwgMHgwMSwgMHgxOCwgMHg0MCwgCisweDI0LCAweDgzLCAweDIwLCAweDQwLCAweDI0LCAweGEzLCAweDIwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4MDEsIDB4MTgsIDB4NDAsIDB4NzgsIDB4MDEsIDB4MTgsIDB4NDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhjLCAweDAxLCAweDE4LCAweDQwLCAKKzB4ODgsIDB4MDEsIDB4MTgsIDB4NDAsIDB4MjQsIDB4YTksIDB4MjAsIDB4NDAsIDB4MjQsIDB4YWIsIDB4MjAsIDB4NDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDA4LCAweDAwLCAweDEyLCAweDAwLCAweDE4LCAweDAwLCAweDEyLCAweDAwLCAweDBjLCAweDAwLCAweDEyLCAweDAwLCAKKzB4MWMsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MjQsIDB4YTgsIDB4MjAsIDB4NDAsIDB4YTQsIDB4YTgsIDB4MjAsIDB4NDAsIAorMHhhNCwgMHhhOCwgMHgyMCwgMHg0MCwgMHgyNCwgMHhhOSwgMHgyMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweGQxLCAweGE4LCAweDIxLCAweDQwLCAweDJkLCAweGFhLCAweDIxLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4ODksIDB4NzAsIDB4MjEsIDB4NDAsIDB4YzksIDB4YTEsIDB4MjEsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDU3LCAweDg5LCAweDIxLCAweDQwLCAweGQxLCAweGE4LCAweDIxLCAweDQwLCAweGM1LCAweDJmLCAweGZmLCAweGZmLCAKKzB4MDUsIDB4MjEsIDB4ZmYsIDB4ZmYsIDB4ZWYsIDB4MjAsIDB4ZmYsIDB4ZmYsIDB4NTksIDB4YTcsIDB4MjEsIDB4NDAsIAorMHgzNCwgMHgyZSwgMHgwMCwgMHg4MCwgMHg0OCwgMHgyZSwgMHgwMCwgMHg4MCwgMHg1YywgMHgyZSwgMHgwMCwgMHg4MCwgCisweDMwLCAweDMzLCAweDNhLCAweDMxLCAweDMxLCAweDNhLCAweDMxLCAweDMxLCAweDAwLCAweDMwLCAweDM3LCAweDJmLCAKKzB4MzIsIDB4MzMsIDB4MmYsIDB4MzAsIDB4MzEsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzEsIDB4MzUsIAorMHgzNiwgMHgzOSwgMHgwMCwgMHg0MywgMHg2ZiwgMHg3MCwgMHg3OSwgMHg3MiwgMHg2OSwgMHg2NywgMHg2OCwgMHg3NCwgCisweDIwLCAweDI4LCAweDYzLCAweDI5LCAweDIwLCAweDMyLCAweDMwLCAweDMwLCAweDMxLCAweDIwLCAweDMzLCAweDQzLCAKKzB4NmYsIDB4NmQsIDB4MjAsIDB4NDMsIDB4NmYsIDB4NzIsIDB4NzAsIDB4NmYsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjksIAorMHg2ZiwgMHg2ZSwgMHgwYSwgMHgwMCwgMHgwOCwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhjLCAweDUzLCAweGZmLCAweGZmLCAKKzB4MjcsIDB4ZjAsIDB4N2QsIDB4ZmQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4ZGEsIDB4MGUsIDB4ODIsIDB4MDAsIAorMHgwMSwgMHg0MCwgMHg2NCwgMHgwNCwgMHg2NCwgMHgyZCwgMHgwMCwgMHg4MCwgMHhlNCwgMHgyYywgMHgwMCwgMHg4MCwgCisweDY5LCAweDNlLCAweGZmLCAweGZmLCAweGM5LCAweDRmLCAweGZmLCAweGZmLCAweGQ1LCAweDI0LCAweGZmLCAweGZmLCAKKzB4YzksIDB4M2IsIDB4ZmYsIDB4ZmYsIDB4MjksIDB4M2MsIDB4ZmYsIDB4ZmYsIDB4MTksIDB4MWEsIDB4ZmYsIDB4ZmYsIAorMHg2NSwgMHgxMSwgMHhmZiwgMHhmZiwgMHhjYywgMHg1MywgMHhmZiwgMHhmZiwgMHgyMSwgMHg0MCwgMHhmZiwgMHhmZiwgCisweDg5LCAweDcwLCAweDIxLCAweDQwLCAweDQ5LCAweDcyLCAweDIxLCAweDQwLCAweGQ5LCAweDNmLCAweGZmLCAweGZmLCAKKzB4MjEsIDB4OWEsIDB4MjEsIDB4NDAsIDB4ODUsIDB4MjQsIDB4ZmYsIDB4ZmYsIDB4NjQsIDB4NTMsIDB4ZmYsIDB4ZmYsIAorMHg4YywgMHg1MywgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgCisweDgwLCAweDMwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MjAsIDB4NDAsIDB4YjAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4N2IsIDB4MGUsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHg2ZSwgMHgyMSwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweGVkLCAweDg5LCAweDIxLCAweDQwLCAweDhiLCAweDg5LCAweDIxLCAweDQwLCAweGE1LCAweDhjLCAweDIxLCAweDQwLCAKKzB4MDUsIDB4OGQsIDB4MjEsIDB4NDAsIDB4Y2QsIDB4OGQsIDB4MjEsIDB4NDAsIDB4OGIsIDB4OGIsIDB4MjEsIDB4NDAsIAorMHhhOSwgMHg4ZSwgMHgyMSwgMHg0MCwgMHgxNSwgMHg4ZiwgMHgyMSwgMHg0MCwgMHg2OSwgMHg4YiwgMHgyMSwgMHg0MCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDU5LCAweGJkLCAweDIxLCAweDQwLCAweGMxLCAweGJkLCAweDIxLCAweDQwLCAweDJkLCAweGJlLCAweDIxLCAweDQwLCAKKzB4MDAsIDB4MjAsIDB4MGEsIDB4NGEsIDB4MGIsIDB4MjMsIDB4MWIsIDB4MDIsIDB4ZDEsIDB4MTgsIDB4MmQsIDB4MjMsIAorMHg5YiwgMHgwMSwgMHhkMywgMHgxOCwgMHg4OCwgMHg2MSwgMHhkOCwgMHg2MCwgMHhkOCwgMHg2MywgMHg4MCwgMHgzMiwgCisweGM4LCAweDYwLCAweDA4LCAweDYxLCAweDQ4LCAweDYxLCAweGQwLCAweDYyLCAweDAzLCAweDQ4LCAweGMwLCAweDQ2LCAKKzB4NDgsIDB4NjAsIDB4ODgsIDB4NjAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHhmZSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmMCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwYywgMHgxYywgMHgwNSwgMHgxYywgCisweDAwLCAweDIzLCAweDAwLCAweDkzLCAweGZmLCAweGY3LCAweGRlLCAweGZmLCAweDY4LCAweDQ5LCAweDBiLCAweDIzLCAKKzB4MWIsIDB4MDIsIDB4Y2YsIDB4MTgsIDB4NzgsIDB4NjgsIDB4MjgsIDB4NDAsIAorMHgwMCwgMHgyMiwgMHhmOCwgMHg2MCwgMHgzYSwgMHg2MSwgMHhiYSwgMHg2OCwgMHgyMiwgMHg0MCwgMHg3YSwgMHg2MSwgCisweDBjLCAweDFjLCAweDQxLCAweDA5LCAweDAzLCAweGQyLCAweDUxLCAweDA5LCAweDAxLCAweGQyLCAweDgwLCAweDBhLCAKKzB4MDIsIDB4ZDMsIDB4NjAsIDB4NDgsIDB4MDAsIDB4ZjAsIDB4YzIsIDB4ZjgsIDB4MDEsIDB4MjAsIDB4ZjksIDB4NjgsIAorMHg0OSwgMHgwOSwgMHgwMywgMHhkMiwgMHg3OSwgMHg2OSwgMHg0OSwgMHgwOSwgMHgwMCwgMHhkMiwgMHgwMCwgMHgyMCwgCisweDAwLCAweDA2LCAweDAwLCAweDBlLCAweDAzLCAweGYwLCAweGQ0LCAweGZhLCAweGY4LCAweDY4LCAweDAwLCAweDI4LCAKKzB4NzAsIDB4ZDAsIDB4MDAsIDB4MjMsIDB4MDIsIDB4OTMsIDB4MDEsIDB4OTMsIDB4NTQsIDB4NGEsIDB4MDEsIDB4MjMsIAorMHgxOCwgMHg0MywgMHhmOCwgMHg2MCwgMHgwMCwgMHgyMCwgMHhkNSwgMHgxZCwgMHg3OSwgMHgzNSwgMHgwMywgMHg5NSwgCisweDAxLCAweDI0LCAweDAwLCAweDIxLCAweDRmLCAweDRkLCAweGZhLCAweDY4LCAweDIyLCAweDQwLCAweDM5LCAweGQwLCAKKzB4OGEsIDB4MDAsIDB4NTIsIDB4MTgsIDB4OTIsIDB4MDAsIDB4NGUsIDB4NGIsIDB4OWIsIDB4NWMsIDB4MWUsIDB4MWMsIAorMHg4MywgMHg0MiwgMHgwNCwgMHhkMCwgMHg0YiwgMHg0YiwgMHhkMywgMHgxOCwgMHg1YiwgMHg3OCwgMHg4MywgMHg0MiwgCisweDJjLCAweGQxLCAweDQ5LCAweDRiLCAweGQyLCAweDE4LCAweGQzLCAweDc4LCAweDAzLCAweDlkLCAweGVkLCAweDZhLCAKKzB4YWIsIDB4NDIsIDB4MDIsIDB4ZDksIDB4MDMsIDB4OWQsIDB4YzAsIDB4NDYsIDB4ZWIsIDB4NjIsIDB4NTMsIDB4NjgsIAorMHg1YiwgMHgwOCwgMHgwMSwgMHhkMywgMHgwMSwgMHgyMywgMHgwMCwgMHg5MywgMHg4NiwgMHg0MiwgMHgwYSwgMHhkMSwgCisweDk1LCAweDY4LCAweDAyLCAweDliLCAweDVlLCAweDFjLCAweDAyLCAweDk2LCAweDliLCAweDAwLCAweDNjLCAweDRlLCAKKzB4OWUsIDB4MTksIDB4MGIsIDB4MjMsIDB4MWIsIDB4MDIsIDB4ZjMsIDB4MTgsIDB4OWQsIDB4NjEsIDB4NTMsIDB4NzgsIAorMHg4MywgMHg0MiwgMHgwZCwgMHhkMSwgMHhkMiwgMHg2OCwgMHgwMSwgMHg5YiwgMHg1ZCwgMHgxYywgMHgwMSwgMHg5NSwgCisweDliLCAweDAwLCAweDM1LCAweDRkLCAweDVkLCAweDE5LCAweDJkLCAweDIzLCAweDliLCAweDAxLCAweGViLCAweDE4LCAKKzB4ZGEsIDB4NjAsIDB4M2EsIDB4NjksIDB4MDEsIDB4MzIsIDB4M2EsIDB4NjEsIDB4NjQsIDB4MDAsIDB4MDEsIDB4MzEsIAorMHgwYiwgMHgyOSwgMHhiZCwgMHhkMywgMHgwMSwgMHgzMCwgMHgwOSwgMHgyOCwgMHhiOCwgMHhkMywgMHgwMCwgMHgyMCwgCisweDAyLCAweDliLCAweDk5LCAweDAwLCAweDJiLCAweDRhLCAweDg5LCAweDE4LCAweDBiLCAweDIzLCAweDFiLCAweDAyLCAKKzB4YzksIDB4MTgsIDB4ODgsIDB4NjEsIDB4MDEsIDB4OWIsIDB4OTksIDB4MDAsIDB4ODksIDB4MTgsIDB4MmQsIDB4MjMsIAorMHg5YiwgMHgwMSwgMHhjOSwgMHgxOCwgMHhjOCwgMHg2MCwgMHgwMCwgMHg5YiwgMHgwMCwgMHgyYiwgMHgwYywgMHhkMSwgCisweDgxLCAweDAwLCAweDg5LCAweDE4LCAweDBiLCAweDIzLCAweDFiLCAweDAyLCAweGM5LCAweDE4LCAweGNiLCAweDY5LCAKKzB4YzAsIDB4NDYsIDB4OGIsIDB4NjEsIDB4MDEsIDB4MzAsIDB4MGIsIDB4MjgsIDB4ZjQsIDB4ZDMsIDB4MDgsIDB4ZTAsIAorMHgwNywgMHhlMCwgMHgwMywgMHg5ZCwgMHhlOCwgMHg2YSwgMHgzMCwgMHgyOCwgMHgwMywgMHhkMiwgMHgzMCwgMHgyMCwgCisweDAzLCAweDlkLCAweGMwLCAweDQ2LCAweGU4LCAweDYyLCAweDE5LCAweDRhLCAweDc4LCAweDY5LCAweDAwLCAweDI4LCAKKzB4MmEsIDB4ZDAsIDB4MDAsIDB4MjEsIDB4MDEsIDB4MjMsIDB4MTgsIDB4NDMsIDB4NzgsIDB4NjEsIDB4MDAsIDB4MjAsIAorMHgwMSwgMHgyNCwgMHgwMCwgMHgyMiwgMHgxMywgMHg0ZSwgMHg3YiwgMHg2OSwgMHgyMywgMHg0MCwgMHgxMCwgMHhkMCwgCisweDkzLCAweDAwLCAweDliLCAweDE4LCAweDliLCAweDAwLCAweDEyLCAweDRkLCAweDViLCAweDE5LCAweDlkLCAweDc4LCAKKzB4ODUsIDB4NDIsIDB4MDgsIDB4ZDEsIDB4MWQsIDB4NjksIDB4MGIsIDB4MWMsIDB4OWIsIDB4MDAsIDB4OWUsIDB4MTksIAorMHgyZCwgMHgyMywgMHg5YiwgMHgwMSwgMHhmMywgMHgxOCwgMHhkZCwgMHg2MywgMHgwMSwgMHgzMSwgMHg2NCwgMHgwMCwgCisweDAxLCAweDMyLCAweDBiLCAweDJhLCAweGU2LCAweGQzLCAweDAxLCAweDMwLCAweDA5LCAweDI4LCAweGUxLCAweGQzLCAKKzB4MDAsIDB4MjAsIDB4ODksIDB4MDAsIDB4MDQsIDB4NGEsIDB4ODksIDB4MTgsIDB4MmQsIDB4MjMsIDB4OWIsIDB4MDEsIAorMHhjOSwgMHgxOCwgMHhjOCwgMHg2MywgMHgwNCwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDMwLCAweDUzLCAweGZmLCAweGZmLCAweDAwLCAweDAxLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4NDcsIDB4MDgsIDB4NDcsIDB4MTAsIDB4NDcsIDB4MTgsIDB4NDcsIDB4NzgsIDB4NDcsIDB4YzAsIDB4NDYsIAorMHgxOCwgMHhjMCwgMHg5ZiwgMHhlNSwgMHgxYywgMHhmZiwgMHgyZiwgMHhlMSwgMHg3OCwgMHg0NywgMHhjMCwgMHg0NiwgCisweDEwLCAweGMwLCAweDlmLCAweGU1LCAweDFjLCAweGZmLCAweDJmLCAweGUxLCAweDc4LCAweDQ3LCAweGMwLCAweDQ2LCAKKzB4MDgsIDB4YzAsIDB4OWYsIDB4ZTUsIDB4MWMsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MzgsIDB4NTIsIDB4ZmYsIDB4ZmYsIAorMHg4OCwgMHg1MSwgMHhmZiwgMHhmZiwgMHhkNSwgMHhiMCwgMHgyMSwgMHg0MCwgMHhmMCwgMHhiNSwgMHgwNCwgMHgyMCwgCisweDFhLCAweDQ5LCAweDAxLCAweDI1LCAweDA4LCAweDYwLCAweDFhLCAweDRmLCAweGJiLCAweDIzLCAweDFiLCAweDAxLCAKKzB4ZjgsIDB4MTgsIDB4MDUsIDB4NzMsIDB4MTgsIDB4NDgsIDB4NDEsIDB4NmIsIDB4MmMsIDB4MDUsIDB4MDAsIDB4MjAsIAorMHg3YSwgMHg2ZSwgMHgxNywgMHg0YiwgMHg4YSwgMHg0MiwgMHgxZCwgMHhkMCwgCisweDE5LCAweDdiLCAweDAwLCAweDI5LCAweDE3LCAweGQxLCAweGQ5LCAweDFkLCAweGZmLCAweDMxLCAweDNhLCAweDMxLCAKKzB4NDksIDB4NzgsIDB4MWUsIDB4MWMsIDB4MDAsIDB4MjksIDB4MTAsIDB4ZDEsIDB4YjAsIDB4NjAsIDB4MTAsIDB4MjAsIAorMHg3MCwgMHg2MCwgMHgxMCwgMHg0YSwgMHgxMCwgMHg0OSwgMHhmZiwgMHhmNywgMHhjMywgMHhmZiwgMHgwMCwgMHgyOCwgCisweDA3LCAweGQwLCAweDM1LCAweDczLCAweDA0LCAweDIzLCAweGI4LCAweDY5LCAweDE4LCAweDQzLCAweGI4LCAweDYxLCAKKzB4MjAsIDB4NjEsIDB4MDAsIDB4ZjAsIDB4MTcsIDB4ZjgsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgxOCwgMHg3MywgMHgwNCwgMHgyMywgMHhiOCwgMHg2OSwgMHg5OCwgMHg0MywgMHhiOCwgMHg2MSwgMHgyMCwgMHg2MSwgCisweGY1LCAweGU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4MDEsIDB4MTgsIDB4NDAsIDB4MjgsIDB4MDUsIDB4MDAsIDB4ODAsIDB4MjAsIDB4NTUsIDB4ZmYsIDB4ZmYsIAorMHg3ZCwgMHg3MSwgMHgyMSwgMHg0MCwgMHhmOCwgMHhiNSwgMHgxNSwgMHg0ZiwgMHgzOSwgMHg2YywgMHgxNSwgMHg0OCwgCisweDQwLCAweDZlLCAweDBjLCAweDFhLCAweDE0LCAweDRlLCAweDcxLCAweDY4LCAweDE0LCAweDRkLCAweGExLCAweDQyLCAKKzB4MDYsIDB4ZDgsIDB4MTQsIDB4NGEsIDB4MGEsIDB4NDMsIDB4MDAsIDB4OTIsIDB4YjksIDB4NmIsIDB4MDksIDB4MTgsIAorMHhmYSwgMHg2YiwgMHgxMSwgMHhlMCwgMHgxMSwgMHgyMiwgMHg1MiwgMHgwNSwgMHgyMiwgMHg0MywgMHgwMCwgMHg5MiwgCisweGI5LCAweDZiLCAweDA5LCAweDE4LCAweDAwLCAweDIwLCAweGZhLCAweDZiLCAweDJiLCAweDFjLCAweGZmLCAweGY3LCAKKzB4OGQsIDB4ZmYsIDB4NzAsIDB4NjgsIDB4MDAsIDB4MWIsIDB4MGEsIDB4NGEsIDB4MDIsIDB4NDMsIDB4MDAsIDB4OTIsIAorMHhiOSwgMHg2YiwgMHhmYSwgMHg2YiwgMHgwMCwgMHgyMCwgMHgyYiwgMHgxYywgMHhmZiwgMHhmNywgMHg4MiwgMHhmZiwgCisweGY4LCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDdjLCAweDI5LCAweDAwLCAweDgwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MjgsIDB4MDUsIDB4MDAsIDB4ODAsIDB4NDQsIDB4ODAsIDB4MjAsIDB4NDAsIAorMHgwMCwgMHgwMCwgMHgzNywgMHgwMiwgMHhmMCwgMHhiNSwgMHgyYiwgMHg0ZiwgMHhiOCwgMHg2OCwgMHg3OSwgMHg2OCwgCisweGMwLCAweDE5LCAweDIwLCAweDMwLCAweDI5LCAweDRhLCAweGZmLCAweGY3LCAweDYzLCAweGZmLCAweDAxLCAweDIwLCAKKzB4YzAsIDB4MDIsIDB4MjgsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4YjksIDB4NjgsIDB4MzgsIDB4MWMsIAorMHgyNiwgMHg0ZCwgMHgwMCwgMHgyNCwgMHgyNiwgMHg0ZSwgMHhlZiwgMHgxZCwgMHg3OSwgMHgzNywgMHgwMCwgMHgyOSwgCisweDMxLCAweGQxLCAweDMxLCAweDY4LCAweDBhLCAweDc4LCAweDEyLCAweDBhLCAweDAzLCAweGQyLCAweDA0LCAweDczLCAKKzB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NDksIDB4NzgsIDB4MDAsIDB4MjksIDB4MGMsIDB4ZDEsIAorMHgwNSwgMHgxYywgMHg0MCwgMHg2OCwgMHgwMCwgMHhmMCwgMHgzZSwgMHhmOSwgMHgzMCwgMHg2OCwgMHgwMCwgMHhmMCwgCisweDY3LCAweGY4LCAweDAwLCAweDI4LCAweDI2LCAweGQxLCAweDJjLCAweDczLCAweGZmLCAweGY3LCAweDU4LCAweGZmLCAKKzB4MjIsIDB4ZTAsIDB4MDksIDB4MDEsIDB4MDcsIDB4MWMsIDB4NDEsIDB4NjAsIDB4MDgsIDB4MWMsIDB4MTcsIDB4NGEsIAorMHgxNywgMHg0OSwgMHhmZiwgMHhmNywgMHgzNSwgMHhmZiwgMHgwMCwgMHgyOCwgMHgwNywgMHhkMSwgMHgzYywgMHg3MywgCisweDA0LCAweDIzLCAweGE4LCAweDY5LCAweDk4LCAweDQzLCAweDk5LCAweDA0LCAweGE4LCAweDYxLCAweDA4LCAweDYxLCAKKzB4ZGEsIDB4ZTcsIDB4MTAsIDB4MjAsIDB4MDAsIDB4ZjAsIDB4MjAsIDB4ZjksIDB4MTAsIDB4MjAsIDB4YjgsIDB4NjAsIAorMHhmZiwgMHhmNywgMHg4MiwgMHhmZiwgMHhkMiwgMHhlNywgMHgwNSwgMHgxYywgMHg0MCwgMHg2OCwgMHgwMCwgMHhmMCwgCisweDE3LCAweGY5LCAweDMwLCAweDY4LCAweDAwLCAweGYwLCAweDQwLCAweGY4LCAweDAwLCAweDI4LCAweGQ4LCAweGQwLCAKKzB4MDIsIDB4MjMsIDB4ZjgsIDB4NmIsIDB4MTgsIDB4NDMsIDB4ZjgsIDB4NjMsIDB4YzQsIDB4ZTcsIDB4MDAsIDB4MDAsIAorMHgyOCwgMHgwNSwgMHgwMCwgMHg4MCwgMHhhNSwgMHg1NSwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGU0LCAweDAxLCAweDAwLCAweDgwLCAweDIwLCAweDU1LCAweGZmLCAweGZmLCAKKzB4N2QsIDB4NzEsIDB4MjEsIDB4NDAsIDB4OTAsIDB4YjUsIDB4MDEsIDB4MjAsIDB4NDAsIDB4MDMsIDB4MTAsIDB4NDksIAorMHgwMCwgMHgyNywgMHgwOCwgMHg2MCwgMHgwZiwgMHg0YywgMHhlMCwgMHgxZCwgMHhmZiwgMHgzMCwgMHgzYSwgMHgzMCwgCisweDQ3LCAweDcwLCAweGUwLCAweDY5LCAweDgwLCAweDAwLCAweDAwLCAweDE5LCAweDAwLCAweDY5LCAweDAwLCAweGYwLCAKKzB4ZDcsIDB4ZjgsIDB4ZTAsIDB4NjksIDB4MDAsIDB4MjgsIDB4MDEsIDB4ZDAsIDB4ZTcsIDB4NjEsIDB4MDEsIDB4ZTAsIAorMHgwMSwgMHgyMCwgMHhlMCwgMHg2MSwgMHgwNywgMHg0OCwgMHgwMiwgMHgyMywgMHhjMSwgMHg2YiwgMHgxOSwgMHg0MywgCisweGMxLCAweDYzLCAweDI3LCAweDczLCAweGZmLCAweGY3LCAweDAwLCAweGZmLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIDB4MjgsIDB4MDUsIDB4MDAsIDB4ODAsIAorMHhlOCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwNywgMHgxYywgMHg3OCwgMHg4OCwgCisweDZkLCAweDI4LCAweDAzLCAweGRiLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAKKzB4ZjcsIDB4ZjgsIDB4MTcsIDB4ZTAsIDB4ODAsIDB4MDAsIDB4MGQsIDB4NDksIDB4MDksIDB4NTgsIDB4MzgsIDB4MWMsIAorMHhmZiwgMHhmNywgMHhjYiwgMHhmZSwgMHgwMCwgMHgyOCwgMHgwZiwgMHhkMSwgMHgzOSwgMHg3OCwgMHhjOSwgMHgwOSwgCisweDBjLCAweGQzLCAweDY5LCAweDQ2LCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweGNmLCAweGY4LCAweDY4LCAweDQ2LCAKKzB4MDAsIDB4MjEsIDB4MDAsIDB4ZjAsIDB4MGIsIDB4ZjgsIDB4MDAsIDB4MjgsIDB4MDEsIDB4ZDEsIDB4MDEsIDB4MjAsIAorMHgwMCwgMHhlMCwgMHgwMCwgMHgyMCwgMHgwNCwgMHhiMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweGU4LCAweDAxLCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweDgyLCAweGIwLCAweDAyLCAweDFjLCAweDQxLCAweDRiLCAKKzB4ZGQsIDB4MWQsIDB4ZmYsIDB4MzUsIDB4M2EsIDB4MzUsIDB4MmYsIDB4NzgsIDB4MDAsIDB4MmYsIDB4MDEsIDB4ZDAsIAorMHgwMCwgMHgyNywgMHgwMCwgMHhlMCwgMHgwMSwgMHgyNywgMHgyZiwgMHg3MCwgMHgyZiwgMHg3OCwgMHhmYiwgMHgwMCwgCisweGRiLCAweDE5LCAweDViLCAweDAxLCAweDNhLCAweDRmLCAweGRjLCAweDE5LCAweDQwLCAweDc4LCAweDAwLCAweDAxLCAKKzB4YzcsIDB4MWQsIDB4MDksIDB4MzcsIDB4MDAsIDB4MjAsIDB4ODMsIDB4MDAsIDB4ZDYsIDB4NTgsIDB4YzAsIDB4NDYsIAorMHhlNiwgMHg1MCwgMHgwMSwgMHgzMCwgMHgwNCwgMHgyOCwgMHhmOCwgMHhkMywgMHgwMCwgMHgyOSwgMHgwZiwgMHhkMCwgCisweDAwLCAweDIyLCAweGJiLCAweDA4LCAweDAxLCAweDkzLCAweDgzLCAweDQyLCAweDBiLCAweGQ5LCAweDEzLCAweDFjLCAKKzB4OWIsIDB4MDAsIDB4Y2IsIDB4NTgsIDB4ODYsIDB4MDAsIDB4YTMsIDB4NTEsIDB4MDEsIDB4OWIsIDB4MDEsIDB4MzAsIAorMHgwMSwgMHgzMiwgMHg4MywgMHg0MiwgMHhmNSwgMHhkOCwgMHgwMCwgMHhlMCwgMHgxMCwgMHgyNywgMHgyYiwgMHg0OCwgCisweDAyLCAweDZkLCAweDgwLCAweDZlLCAweDJhLCAweDQ5LCAweDgyLCAweDQyLCAweDAzLCAweGQ4LCAweDgyLCAweDFhLCAKKzB4Y2IsIDB4NmMsIDB4OWEsIDB4MWEsIDB4MDAsIDB4ZTAsIDB4MTIsIDB4MWEsIDB4YmEsIDB4NDIsIDB4MDUsIDB4ZDgsIAorMHgyNiwgMHg0OCwgMHg4MSwgMHg2YiwgMHgwMSwgMHgzMSwgMHg4MSwgMHg2MywgMHgwMSwgMHgyMCwgMHgzNywgMHhlMCwgCisweGMzLCAweDE5LCAweGNhLCAweDZjLCAweDkzLCAweDQyLCAweDA4LCAweGQ4LCAweDIyLCAweDRhLCAweDNhLCAweDQzLCAKKzB4MDAsIDB4OTIsIDB4MGEsIDB4MWMsIDB4NDksIDB4NmMsIDB4MDksIDB4MTgsIDB4OTIsIDB4NmMsIDB4MjMsIDB4MWMsIAorMHgxMiwgMHhlMCwgMHgxNiwgMHgxYSwgMHgwMCwgMHg5NiwgMHgxYiwgMHg0OSwgMHg0OSwgMHg2YywgMHgwOSwgMHgxOCwgCisweDE5LCAweDQ4LCAweDgyLCAweDZjLCAweDAzLCAweDIwLCAweDIzLCAweDFjLCAweGZmLCAweGY3LCAweDVlLCAweGZlLCAKKzB4YjgsIDB4MWIsIDB4MTgsIDB4NGEsIDB4MDIsIDB4NDMsIDB4MDAsIDB4OTIsIDB4YTMsIDB4MTksIDB4MTQsIDB4NDgsIAorMHg4MiwgMHg2YywgMHg0MSwgMHg2YywgMHgwMywgMHgyMCwgMHhmZiwgMHhmNywgMHg1MywgMHhmZSwgMHgwMSwgMHgyMCwgCisweDBkLCAweDQ5LCAweGMwLCAweDQ2LCAweDY4LCAweDcwLCAweDhhLCAweDY5LCAweDkyLCAweDAwLCAweDUyLCAweDE4LCAKKzB4MTcsIDB4NjEsIDB4OGEsIDB4NjksIDB4MDAsIDB4MmEsIDB4MDIsIDB4ZDAsIDB4MDAsIDB4MjcsIDB4OGYsIDB4NjEsIAorMHgwMCwgMHhlMCwgMHg4OCwgMHg2MSwgMHgwYywgMHg0OCwgMHgwMiwgMHgyMywgMHhjMSwgMHg2YiwgMHgxOSwgMHg0MywgCisweGMxLCAweDYzLCAweDAwLCAweDIwLCAweDAxLCAweDI3LCAweDBhLCAweDQ5LCAweGMwLCAweDQ2LCAweDRmLCAweDczLCAKKzB4MDIsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MjgsIDB4MDUsIDB4MDAsIDB4ODAsIAorMHg1MCwgMHhiYSwgMHgyMCwgMHg0MCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgCisweGEwLCAweDgyLCAweDIwLCAweDQwLCAweDAwLCAweDAwLCAweDE5LCAweDAyLCAweGU4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4MTgsIDB4MWEsIDB4MDAsIDB4ODAsIDB4MDcsIDB4NDksIDB4OGEsIDB4NmUsIDB4MTAsIDB4MTgsIDB4MDcsIDB4NGEsIAorMHhkMiwgMHg2YywgMHgxMywgMHgwNCwgMHgxYiwgMHgwYywgMHg4MywgMHg0MiwgMHgwMCwgMHhkOCwgMHg4MCwgMHgxYSwgCisweDg4LCAweDY2LCAweDg4LCAweDZlLCAweDAzLCAweDQ5LCAweGMwLCAweDQ2LCAweDQ4LCAweDYxLCAweDcwLCAweDQ3LCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIDB4OTAsIDB4ZWUsIDB4MjAsIDB4NDAsIAorMHgwNiwgMHg0OSwgMHg0YSwgMHg2ZSwgMHgxMCwgMHgxOCwgMHgwNiwgMHg0YSwgMHgxMiwgMHg2YywgMHg4MiwgMHg0MiwgCisweDAwLCAweGQ4LCAweDgwLCAweDFhLCAweDQ4LCAweDY2LCAweDQ4LCAweDZlLCAweDAzLCAweDQ5LCAweGMwLCAweDQ2LCAKKzB4MDgsIDB4NjEsIDB4NzAsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIAorMHg5MCwgMHhlZSwgMHgyMCwgMHg0MCwgMHgwNSwgMHgyMiwgMHgwYSwgMHg2MCwgMHg4MiwgMHg4OCwgMHhjMCwgMHg0NiwgCisweDhhLCAweDgwLCAweDAwLCAweDIyLCAweDRhLCAweDcwLCAweDQwLCAweDg4LCAweGMwLCAweDQ2LCAweDQ4LCAweDgwLCAKKzB4Y2EsIDB4ODAsIDB4OGEsIDB4NjAsIDB4Y2EsIDB4NjAsIDB4NzAsIDB4NDcsIDB4MDUsIDB4MjIsIDB4MDIsIDB4NjAsIAorMHgwMCwgMHgyMiwgMHg4MiwgMHg4MCwgMHg0MiwgMHg3MCwgMHg0MSwgMHg4MCwgMHhjMiwgMHg4MCwgMHg4MiwgMHg2MCwgCisweGMyLCAweDYwLCAweDcwLCAweDQ3LCAweDgwLCAweGI1LCAweDg0LCAweGIwLCAweDA3LCAweDFjLCAweDBlLCAweDQ4LCAKKzB4NDEsIDB4NmIsIDB4MDEsIDB4MzEsIDB4NDEsIDB4NjMsIDB4NjksIDB4NDYsIAorMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHhkZCwgMHhmZiwgMHgzOCwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MCwgCisweDQ1LCAweDIwLCAweDAwLCAweGFiLCAweDE4LCAweDcwLCAweDAxLCAweDI3LCAweGRmLCAweDgwLCAweDY4LCAweDQ2LCAKKzB4MDAsIDB4MjEsIDB4ZmYsIDB4ZjcsIDB4MTEsIDB4ZmYsIDB4MDAsIDB4MjgsIDB4MDEsIDB4ZDEsIDB4MzgsIDB4MWMsIAorMHgwMCwgMHhlMCwgMHgwMCwgMHgyMCwgMHgwNCwgMHhiMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweGEwLCAweDgyLCAweDIwLCAweDQwLCAweDAwLCAweGI1LCAweDg0LCAweGIwLCAweGMxLCAweDg4LCAweDA5LCAweDRhLCAKKzB4YzAsIDB4NDYsIDB4OTEsIDB4ODEsIDB4NjksIDB4NDYsIDB4ZmYsIDB4ZjcsIDB4YmQsIDB4ZmYsIDB4MDEsIDB4MjAsIAorMHg0MCwgMHgwMiwgMHgwMSwgMHhhYiwgMHg1OCwgMHg4MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHhmZiwgMHhmNywgCisweGY1LCAweGZlLCAweDAxLCAweDIwLCAweDA0LCAweGIwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAKKzB4ZTgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDAsIDB4YjUsIDB4ZmYsIDB4ZjcsIDB4YzMsIDB4ZmYsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwMSwgMHgyMCwgMHgwMywgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg3MSwgMHhhMSwgMHgyMSwgCisweDQ5LCAweDAzLCAweDg4LCAweDYwLCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAweDI4LCAweDBmLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4MjAsIDB4MDQsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NzEsIDB4ZmYsIDB4MjEsIDB4YTEsIDB4MjIsIAorMHg1MiwgMHgwMywgMHgwMSwgMHgzMSwgMHg5MSwgMHg2MCwgMHg3MCwgMHg0NywgMHgyOCwgMHgwZiwgMHgwMCwgMHg4MCwgCisweDAyLCAweDIwLCAweGExLCAweDIxLCAweDQ5LCAweDAzLCAweDg4LCAweDYwLCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAKKzB4MDEsIDB4MjAsIDB4NDAsIDB4MDIsIDB4YTEsIDB4MjEsIDB4NDksIDB4MDMsIDB4ODgsIDB4NjAsIDB4MDAsIDB4MjAsIAorMHg3MCwgMHg0NywgMHhjMCwgMHg4OCwgMHhjMCwgMHgwNiwgMHhjMCwgMHgwZSwgMHhhMSwgMHgyMSwgMHg0OSwgMHgwMywgCisweDQ4LCAweDYxLCAweDAyLCAweDQ5LCAweGMwLCAweDQ2LCAweGM4LCAweDYzLCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAKKzB4ZTgsIDB4MWEsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MDgsIDB4NDksIDB4MGYsIDB4NmIsIAorMHg2OSwgMHg0NiwgMHhmZiwgMHhmNywgMHg3MSwgMHhmZiwgMHhmOCwgMHgwNiwgMHhjMCwgMHgwZSwgMHgwMSwgMHhhYiwgCisweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZmLCAweGY3LCAweGE5LCAweGZlLCAweDAxLCAweDIwLCAKKzB4MDQsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ODAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHg4MCwgMHhiNSwgMHg4NSwgMHhiMCwgMHgwNywgMHgxYywgMHg2OSwgMHg0NiwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgCisweDViLCAweGZmLCAweGY4LCAweDg4LCAweDA0LCAweGE5LCAweDAzLCAweGYwLCAweGM5LCAweGZmLCAweDAxLCAweGFiLCAKKzB4NTgsIDB4ODAsIDB4MDEsIDB4YTgsIDB4NDAsIDB4ODgsIDB4MDAsIDB4MjgsIDB4MGYsIDB4ZDAsIDB4MDEsIDB4YTgsIAorMHg0MCwgMHg4OCwgMHg4MCwgMHgwOCwgMHgwMywgMHgzOCwgMHg4MCwgMHgwOCwgMHgwMSwgMHgzMCwgMHgwNCwgMHgzYiwgCisweDU4LCAweDcwLCAweDA0LCAweDk4LCAweDAxLCAweDY4LCAweGMwLCAweDQ2LCAweDAyLCAweDkxLCAweDQwLCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDMsIDB4OTAsIDB4MDUsIDB4ZTAsIDB4MDAsIDB4YTgsIDB4MDAsIDB4NzgsIDB4NDAsIDB4MjMsIAorMHgxOCwgMHg0MywgMHgwMCwgMHhhYiwgMHgxOCwgMHg3MCwgMHgwNCwgMHg5OCwgMHhjMSwgMHgxZCwgMHgwMSwgMHgzMSwgCisweDY4LCAweDQ2LCAweGZmLCAweGY3LCAweDc1LCAweGZlLCAweDAxLCAweDIwLCAweDA1LCAweGIwLCAweDgwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4OTAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MTQsIDB4NGYsIDB4MzksIDB4N2IsIAorMHgwMCwgMHgyOSwgMHgyMCwgMHhkMSwgMHhmOSwgMHgxZCwgMHhmZiwgMHgzMSwgMHgzYSwgMHgzMSwgMHg0OSwgMHg3OCwgCisweDAwLCAweDI5LCAweDFhLCAweGQxLCAweDEwLCAweDQ5LCAweDA1LCAweDIyLCAweDAwLCAweDkyLCAweDA4LCAweDIyLCAKKzB4MDAsIDB4YWIsIDB4NWEsIDB4ODAsIDB4OTgsIDB4ODAsIDB4MDYsIDB4MjAsIDB4MDAsIDB4YWIsIDB4NTgsIDB4NzAsIAorMHgwMCwgMHgyNCwgMHhkYywgMHg4MCwgMHgwOCwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwMiwgMHg5MCwgMHg0OCwgMHg2OCwgCisweGMwLCAweDQ2LCAweDAzLCAweDkwLCAweDAxLCAweDIwLCAweDM4LCAweDczLCAweDY4LCAweDQ2LCAweDA4LCAweDMxLCAKKzB4ZmYsIDB4ZjcsIDB4NGMsIDB4ZmUsIDB4MDAsIDB4MjgsIDB4MDAsIDB4ZDAsIDB4M2MsIDB4NzMsIDB4MDQsIDB4YjAsIAorMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgyOCwgMHgwNSwgMHgwMCwgMHg4MCwgCisweGE0LCAweDJhLCAweDAwLCAweDgwLCAweDkwLCAweGI1LCAweDg0LCAweGIwLCAweDA3LCAweDFjLCAweDY5LCAweDQ2LCAKKzB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4ZjksIDB4ZmUsIDB4YmEsIDB4NjgsIDB4MGQsIDB4NGMsIDB4MGUsIDB4NDgsIAorMHgwMCwgMHgyYSwgMHgwNSwgMHhkMSwgMHgwZCwgMHg0OSwgMHhmZiwgMHhmNywgMHhlNCwgMHhmYywgMHgwMCwgMHgyOCwgCisweDBjLCAweGRhLCAweDA1LCAweGUwLCAweGI5LCAweDg4LCAweDBiLCAweDRiLCAweGZmLCAweGY3LCAweGRmLCAweGZjLCAKKzB4MDAsIDB4MjgsIDB4MDUsIDB4ZGEsIDB4MDEsIDB4YWIsIDB4NWMsIDB4ODAsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIAorMHhmZiwgMHhmNywgMHgyMiwgMHhmZSwgMHgwMCwgMHgyMCwgMHgwNCwgMHhiMCwgCisweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAKKzB4MGQsIDB4NzYsIDB4MjEsIDB4NDAsIDB4YzEsIDB4YmQsIDB4MjEsIDB4NDAsIDB4NTksIDB4YmQsIDB4MjEsIDB4NDAsIAorMHgwMCwgMHhiNSwgMHhjMCwgMHg4OCwgMHgwMywgMHhmMCwgMHgyZSwgMHhmZiwgMHgwMCwgMHgyMCwgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZmLCAweGY3LCAweGUyLCAweGZlLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDAsIDB4YjUsIDB4ZmYsIDB4ZjcsIDB4ZGQsIDB4ZmUsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIAorMHgwMSwgMHgxYywgMHgwMiwgMHgyMCwgMHgwMCwgMHhmMCwgMHgwMiwgMHhmOCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweGIwLCAweGI1LCAweGM2LCAweGIwLCAweDA3LCAweDFjLCAweDA4LCAweDFjLCAweDY5LCAweDQ2LCAweGZmLCAweGY3LCAKKzB4YjUsIDB4ZmUsIDB4MjEsIDB4NDgsIDB4ZmYsIDB4ZjcsIDB4YTQsIDB4ZmMsIDB4MDQsIDB4MWMsIDB4MjAsIDB4NGEsIAorMHgwMCwgMHgyMSwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHhhMCwgMHhmYywgMHgwMCwgMHgyOCwgMHgyNywgMHhkMCwgCisweDA0LCAweGE5LCAweDFkLCAweDRhLCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDk5LCAweGZjLCAweDA0LCAweGE4LCAKKzB4MDAsIDB4MjMsIDB4MDEsIDB4MmYsIDB4MDYsIDB4ZDEsIDB4MGMsIDB4YWEsIDB4MDIsIDB4MzIsIDB4MDAsIDB4MjEsIAorMHgxMywgMHg2MCwgMHgwMSwgMHgzMSwgMHgxMCwgMHgyOSwgMHhmYiwgMHhkMywgMHgwMSwgMHg2OCwgMHgwNCwgMHgyOSwgCisweDA0LCAweGQ5LCAweDg5LCAweDA4LCAweDAzLCAweDM5LCAweDg5LCAweDA4LCAweDAxLCAweDMxLCAweDAwLCAweGUwLCAKKzB4MTksIDB4MWMsIDB4MDAsIDB4YWIsIDB4NTksIDB4NzAsIDB4MDYsIDB4YTksIDB4MDksIDB4NzgsIDB4YzAsIDB4NDYsIAorMHhkOSwgMHg4MCwgMHgwMCwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwMiwgMHg5MCwgMHgwNywgMHg5OCwgMHhjMCwgMHg0NiwgCisweDAzLCAweDkwLCAweDA0LCAweDMzLCAweDA4LCAweGFkLCAweDAyLCAweGUwLCAweDQ1LCAweDIwLCAweDAwLCAweGFiLCAKKzB4MTgsIDB4NzAsIDB4MDksIDB4NDksIDB4MjAsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4NmUsIDB4ZmMsIDB4NjgsIDB4NDYsIAorMHgyOSwgMHgxYywgMHhmZiwgMHhmNywgMHhiNywgMHhmZCwgMHgwMSwgMHgyMCwgMHg0NiwgMHhiMCwgMHhiMCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDI0LCAweDAyLCAweGZmLCAweGZmLCAweDU5LCAweGIxLCAweDIxLCAweDQwLCAKKzB4OWQsIDB4YWYsIDB4MjEsIDB4NDAsIDB4M2MsIDB4MDIsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4YjUsIDB4MDEsIDB4MWMsIAorMHgwMiwgMHgyMCwgMHgwMCwgMHhmMCwgMHgxMCwgMHhmOCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgCisweDAxLCAweDFjLCAweDAxLCAweDIwLCAweGZmLCAweGY3LCAweGEyLCAweGZmLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDAsIDB4YjUsIDB4MDEsIDB4MWMsIDB4MDEsIDB4MjAsIDB4MDAsIDB4ZjAsIDB4MDIsIDB4ZjgsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHhmMCwgMHhiNSwgMHhjNywgMHhiMCwgMHgwNCwgMHgxYywgMHgwZiwgMHgxYywgMHgzOCwgMHgxYywgCisweDAxLCAweGE5LCAweGZmLCAweGY3LCAweDRkLCAweGZlLCAweDIxLCAweDQ4LCAweGZmLCAweGY3LCAweDNjLCAweGZjLCAKKzB4MDAsIDB4OTAsIDB4NzgsIDB4NzgsIDB4MDAsIDB4MDEsIDB4YmEsIDB4NjgsIDB4MDQsIDB4MzAsIDB4ZmMsIDB4MmEsIAorMHgyNSwgMHhkOCwgMHhmZiwgMHgyMywgMHgwOSwgMHgzMywgMHg5OCwgMHg0MiwgMHgyMSwgMHhkOCwgMHgxOSwgMHgyYywgCisweDFmLCAweGQ4LCAweGZkLCAweDg4LCAweGY4LCAweDY4LCAweGMwLCAweDQ2LCAweDA1LCAweDkwLCAweGY5LCAweDFkLCAKKzB4MDksIDB4MzEsIDB4MDYsIDB4YWIsIDB4MDAsIDB4MjAsIDB4N2UsIDB4NzgsIDB4MDAsIDB4MmUsIDB4MGQsIDB4ZGQsIAorMHg0MCwgMHhjOSwgMHg0MCwgMHhjMywgMHg0MCwgMHhjOSwgMHg0MCwgMHhjMywgMHg0MCwgMHhjOSwgMHg0MCwgMHhjMywgCisweDQwLCAweGM5LCAweDQwLCAweGMzLCAweDAxLCAweDMwLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDdlLCAweDc4LCAKKzB4ODYsIDB4NDIsIDB4ZjEsIDB4ZGMsIDB4MjAsIDB4MWMsIDB4MDUsIDB4YTksIDB4MmIsIDB4MWMsIDB4ZmYsIDB4ZjcsIAorMHgyMSwgMHhmYywgMHgwMCwgMHgyOCwgMHgwNSwgMHhkMCwgMHgwMSwgMHhhOCwgMHgwMCwgMHg3OCwgMHg0MCwgMHgyMywgCisweDE4LCAweDQzLCAweDAxLCAweGFiLCAweDE4LCAweDcwLCAweDA3LCAweDQ5LCAweDAwLCAweDk4LCAweGZmLCAweGY3LCAKKzB4MDYsIDB4ZmMsIDB4MDAsIDB4MjEsIDB4MDEsIDB4YTgsIDB4ZmYsIDB4ZjcsIDB4NGYsIDB4ZmQsIDB4MDEsIDB4MjAsIAorMHg0NywgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgyNCwgMHgwMiwgMHhmZiwgMHhmZiwgCisweDNjLCAweDAyLCAweGZmLCAweGZmLCAweDAwLCAweGI1LCAweGZmLCAweGY3LCAweDFiLCAweGZlLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4ZjAsIDB4YjUsIDB4YzYsIDB4YjAsIDB4MDcsIDB4MWMsIDB4ZmMsIDB4ODgsIDB4MjUsIDB4NGQsIAorMHg2OCwgMHg2OCwgMHgwMSwgMHgzMCwgMHg2OSwgMHg0NiwgMHg2OCwgMHg2MCwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgCisweGY1LCAweGZkLCAweDEwLCAweDJjLCAweDA4LCAweGQzLCAweDAwLCAweGE4LCAweDAwLCAweDc4LCAweDQwLCAweDIzLCAKKzB4MTgsIDB4NDMsIDB4MDAsIDB4YWIsIDB4MTgsIDB4NzAsIDB4MDIsIDB4MjAsIDB4ZDgsIDB4ODAsIDB4MTcsIDB4ZTAsIAorMHg3OCwgMHg3OCwgMHg4MiwgMHgwMCwgMHhmYiwgMHgxZCwgMHgwOSwgMHgzMywgMHgwMCwgMHgyMCwgMHhiOSwgMHg2OCwgCisweDAwLCAweDJhLCAweDE1LCAweGQ5LCAweDQwLCAweGNiLCAweDBmLCAweDFjLCAKKzB4MDEsIDB4MzEsIDB4YmUsIDB4NDIsIDB4MGQsIDB4ZDAsIDB4MDAsIDB4YWEsIDB4MTIsIDB4NzgsIDB4NDAsIDB4MjMsIAorMHgxYSwgMHg0MywgMHgwMCwgMHhhYiwgMHgxYSwgMHg3MCwgMHgwNCwgMHgyMiwgMHhkYSwgMHg4MCwgMHgwMiwgMHg5MCwgCisweDAzLCAweDkxLCAweDA0LCAweDMzLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweDE1LCAweGUwLCAweDAxLCAweDMwLCAKKzB4OTAsIDB4NDIsIDB4ZTksIDB4ZDMsIDB4MDAsIDB4YWIsIDB4NWMsIDB4NzAsIDB4MDIsIDB4OTQsIDB4NjksIDB4NjgsIAorMHhjMCwgMHg0NiwgMHgwMywgMHg5MSwgMHhhMiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgxMCwgMHgzMywgMHgwMCwgMHgyYSwgCisweDA1LCAweGQ5LCAweDBmLCAweDFjLCAweDgwLCAweGMzLCAweDAxLCAweDMwLCAweDAxLCAweDMxLCAweDkwLCAweDQyLCAKKzB4ZjksIDB4ZDMsIDB4NjgsIDB4NDYsIDB4MDQsIDB4YTksIDB4ZmYsIDB4ZjcsIDB4ZjcsIDB4ZmMsIDB4MDEsIDB4MjAsIAorMHg0NiwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg5YywgMHgwMywgMHgwMCwgMHg4MCwgCisweDkwLCAweGI0LCAweDIzLCAweDQ4LCAweDAwLCAweDY4LCAweDAxLCAweDIxLCAweDQyLCAweDA5LCAweDAwLCAweGQzLCAKKzB4MDAsIDB4MjEsIDB4MDAsIDB4MjcsIDB4M2EsIDB4MWMsIDB4NDMsIDB4MGIsIDB4MDAsIDB4ZDIsIDB4MDIsIDB4MjIsIAorMHgxMSwgMHg0MywgMHgxZSwgMHg0YSwgMHgyMCwgMHgyNCwgMHhkMywgMHg2OCwgMHgwMSwgMHgyYiwgMHgyZSwgMHhkMSwgCisweDgwLCAweDBhLCAweDAwLCAweGQyLCAweDAwLCAweDI0LCAweDBjLCAweDQzLCAweDIwLCAweDFjLCAweDFiLCAweDIzLCAKKzB4ZGIsIDB4MDEsIDB4ZDEsIDB4MTgsIDB4ODksIDB4OGIsIDB4MDksIDB4MGIsIDB4MDAsIDB4ZDIsIDB4MDQsIDB4MjcsIAorMHgzOCwgMHg0MywgMHhkMSwgMHg2ZiwgMHgwOSwgMHg2OCwgMHgwOSwgMHgwYSwgMHgwNywgMHhkMiwgMHhkMSwgMHgxZCwgCisweDc5LCAweDMxLCAweDA5LCAweDY4LCAweDA5LCAweDY4LCAweDA5LCAweDBhLCAweDAxLCAweGQzLCAweDA4LCAweDIzLCAKKzB4MTgsIDB4NDMsIDB4ZTMsIDB4MjMsIDB4MWIsIDB4MDEsIDB4ZDEsIDB4MTgsIDB4ODksIDB4NzksIDB4MDMsIDB4MjksIAorMHgwMiwgMHhkMSwgMHhmZiwgMHgyMywgMHgwMSwgMHgzMywgMHgxOCwgMHg0MywgMHgwYiwgMHg0OSwgMHgwOSwgMHg2YSwgCisweDEwLCAweDIyLCAweDRiLCAweDBhLCAweDAwLCAweGQyLCAweDAwLCAweDIyLCAweDEwLCAweDQzLCAweDg5LCAweDA3LCAKKzB4ODksIDB4MGYsIDB4ODksIDB4MDEsIDB4MDgsIDB4NDMsIDB4OTAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4NDAsIDB4MGMsIAorMHgwMCwgMHhkMiwgMHgwMCwgMHgyNCwgMHgwYywgMHg0MywgMHgyMCwgMHgxYywgMHhlYywgMHhlNywgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDEwLCAweDQwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGMwLCAweDAwLCAweDE4LCAweDQwLCAKKzB4ZjAsIDB4YjUsIDB4M2EsIDB4NGMsIDB4MjAsIDB4MWMsIDB4MDQsIDB4ZjAsIDB4MDcsIDB4ZmEsIDB4MzksIDB4NDgsIAorMHhlMywgMHgyMywgMHgxYiwgMHgwMSwgMHhjNywgMHgxOCwgMHhiOSwgMHg3OSwgMHgzNywgMHg0ZSwgMHhjNSwgMHgxZCwgCisweDc5LCAweDM1LCAweDA2LCAweDI5LCAweDYyLCAweGQyLCAweDAyLCAweGEzLCAweDViLCAweDVjLCAweDViLCAweDAwLCAKKzB4OWYsIDB4NDQsIDB4MDAsIDB4MWMsIDB4MDMsIDB4MGUsIDB4MWUsIDB4MzcsIDB4NGUsIDB4NTUsIDB4MDEsIDB4MjAsIAorMHhiOCwgMHg3MSwgMHgwMCwgMHgyMCwgMHhiMCwgMHg2MCwgMHhmZiwgMHhmNywgMHg5NSwgMHhmZiwgMHgwNSwgMHgyMywgCisweDk4LCAweDQzLCAweDAwLCAweGYwLCAweDZmLCAweGY4LCAweDBjLCAweGUwLCAweGZmLCAweGY3LCAweDhlLCAweGZmLCAKKzB4YzAsIDB4MDgsIDB4MDYsIDB4ZDMsIDB4YjAsIDB4NjgsIDB4NDEsIDB4MWMsIDB4YjEsIDB4NjAsIDB4MGEsIDB4MjgsIAorMHgwMywgMHhkOSwgMHgwNCwgMHgyMCwgMHgwMCwgMHhlMCwgMHgwMiwgMHgyMCwgMHhiOCwgMHg3MSwgMHg2NCwgMHgyMiwgCisweDIwLCAweDFjLCAweDJiLCAweGUwLCAweDA2LCAweDFjLCAweGMwLCAweDZmLCAweDgwLCAweDIzLCAweDAxLCAweDY4LCAKKzB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4MDMsIDB4MjAsIDB4YjgsIDB4NzEsIDB4MjAsIDB4MWMsIDB4MjAsIDB4NGEsIAorMHgwMCwgMHgyMSwgMHgwNCwgMHhmMCwgMHg5OSwgMHhmOSwgMHhmMCwgMHg2ZiwgMHgwNCwgMHgyMywgMHgwMSwgMHg2OCwgCisweDk5LCAweDQzLCAweDAxLCAweDYwLCAweDI4LCAweDY4LCAweDAxLCAweDY4LCAweDE5LCAweDQzLCAweDAxLCAweDYwLCAKKzB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDUsIDB4MjEsIDB4YjksIDB4NzEsIDB4MjksIDB4NjgsIAorMHgwNCwgMHgyMywgMHgwYSwgMHg2OCwgMHg5YSwgMHg0MywgMHgwYSwgMHg2MCwgMHhjMCwgMHg2ZiwgMHgwMSwgMHg2OCwgCisweDE5LCAweDQzLCAweDAxLCAweDYwLCAweGZmLCAweGY3LCAweDVhLCAweGZmLCAweDA4LCAweDIzLCAweDE4LCAweDQzLCAKKzB4MDAsIDB4ZjAsIDB4MzQsIDB4ZjgsIDB4MjAsIDB4MWMsIDB4MTAsIDB4NGEsIDB4MDAsIDB4MjEsIDB4MDQsIDB4ZjAsIAorMHg3NywgMHhmOSwgMHhlNSwgMHhlNywgMHhmZiwgMHhmNywgMHg0ZSwgMHhmZiwgMHgwNCwgMHgyMywgMHgxOCwgMHg0MywgCisweDAwLCAweGYwLCAweDI4LCAweGY4LCAweGRlLCAweGU3LCAweDAwLCAweDIwLCAweDI5LCAweDY4LCAweDYwLCAweDIzLCAKKzB4MGEsIDB4NjgsIDB4OWEsIDB4NDMsIDB4MGEsIDB4NjAsIDB4ZmYsIDB4ZjcsIDB4ZTMsIDB4ZmEsIDB4ZDUsIDB4ZTcsIAorMHgwNiwgMHgyMCwgMHhiOCwgMHg3MSwgMHhkMiwgMHhlNywgMHgwMCwgMHgwMCwgMHhhOSwgMHg3OSwgMHgyMSwgMHg0MCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDljLCAweDAzLCAweDAwLCAweDgwLCAweDMwLCAweDc1LCAweDAwLCAweDAwLCAKKzB4MTAsIDB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjUsIDB4MDAsIDB4MjAsIAorMHgwNCwgMHg0OSwgMHhjMCwgMHg0NiwgMHg4OCwgMHg3MSwgMHgwNCwgMHg0OCwgMHgwMSwgMHgyMiwgMHgwMCwgMHgyMSwgCisweDA0LCAweGYwLCAweDRlLCAweGY5LCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDk4LCAweDFjLCAweDAwLCAweDgwLCAKKzB4YTksIDB4NzksIDB4MjEsIDB4NDAsIDB4OTAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4MzEsIDB4NDgsIDB4MDAsIDB4NjgsIAorMHg3OSwgMHgwOCwgMHgwMywgMHhkMywgMHgxMCwgMHgyMywgMHgwMSwgMHgxYywgMHg5OSwgMHg0MywgMHgwMSwgMHhlMCwgCisweDEwLCAweDIxLCAweDAxLCAweDQzLCAweDJkLCAweDRjLCAweGUyLCAweDY4LCAweDAxLCAweDJhLCAweDA1LCAweGQxLCAKKzB4MjIsIDB4NzksIDB4MDAsIDB4MmEsIDB4MDIsIDB4ZDAsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDIsIDB4MTksIDB4NDMsIAorMHg4MSwgMHg0MiwgMHgwMiwgMHhkMCwgMHgwMSwgMHgyMCwgMHgwMCwgMHgwNSwgMHgwMSwgMHg2MCwgMHhlMCwgMHg2OCwgCisweDAxLCAweDI4LCAweDIwLCAweGQxLCAweDFiLCAweDIzLCAweGRiLCAweDAxLCAweGUwLCAweDE4LCAweDgwLCAweDhiLCAKKzB4ZjksIDB4MDgsIDB4MDQsIDB4ZDMsIDB4MDEsIDB4MjMsIDB4ZGIsIDB4MDIsIDB4MDEsIDB4MWMsIDB4OTksIDB4NDMsIAorMHgwMSwgMHhlMCwgMHgwMSwgMHgyMSwgMHhjOSwgMHgwMiwgMHg4MSwgMHg0MiwgMHgwMiwgMHhkMCwgMHgwMCwgMHgyMCwgCisweDAyLCAweGYwLCAweDFhLCAweGZiLCAweDM4LCAweDA5LCAweDA3LCAweGQzLCAweGUwLCAweDZmLCAweDgwLCAweDIzLCAKKzB4MDEsIDB4NjgsIDB4OTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4ZTAsIDB4MTgsIDB4MDAsIDB4NjgsIDB4MDAsIDB4ZTAsIAorMHhlMCwgMHg2ZiwgMHg4MCwgMHgyMywgMHgwMSwgMHg2OCwgMHgxOSwgMHg0MywgMHgwMSwgMHg2MCwgMHgxNSwgMHg0OCwgCisweDAxLCAweDZhLCAweDc4LCAweDA5LCAweDAzLCAweGQzLCAweGZmLCAweDIwLCAweDAxLCAweDMwLCAweDA4LCAweDQzLCAKKzB4MDMsIDB4ZTAsIDB4ZmYsIDB4MjMsIDB4MDgsIDB4MWMsIDB4MDEsIDB4MzMsIDB4OTgsIDB4NDMsIDB4ODAsIDB4MDgsIAorMHg4MCwgMHgwMCwgMHhiYSwgMHgwOSwgMHg5MiwgMHgwNywgMHg5MiwgMHgwZiwgMHgxMCwgMHg0MywgMHg4OCwgMHg0MiwgCisweDAyLCAweGQwLCAweDBjLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYyLCAweGUxLCAweDY4LCAweDAxLCAweDI5LCAKKzB4MDgsIDB4ZDEsIDB4NzksIDB4MGEsIDB4MDYsIDB4ZDMsIDB4ZmYsIDB4MjMsIDB4MDQsIDB4MzMsIDB4MTgsIDB4NDAsIAorMHgwMywgMHgyOCwgMHgwMSwgMHhkMSwgMHhmZiwgMHhmNywgMHg4ZSwgMHhmZiwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4YzAsIDB4MDAsIDB4MTgsIDB4NDAsIDB4YzAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4ODAsIDB4YjUsIDB4ZmYsIDB4ZjcsIAorMHhiMSwgMHhmZSwgMHg4MCwgMHgwOSwgMHgxYiwgMHhkMiwgMHgwZiwgMHg0OCwgMHhlMywgMHgyMywgMHgxYiwgMHgwMSwgCisweGMxLCAweDE4LCAweDRhLCAweDc5LCAweDAwLCAweDJhLCAweDE0LCAweGQxLCAweDAxLCAweDIyLCAweDRhLCAweDcxLCAKKzB4MDAsIDB4MjcsIDB4ODAsIDB4MzAsIDB4MDAsIDB4NjgsIDB4NjAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4OTksIDB4NDMsIAorMHgwMSwgMHg2MCwgMHgwOCwgMHg0OCwgMHgwNiwgMHhlMCwgMHgwMiwgMHgyMCwgMHgwMiwgMHhmMCwgMHg4YywgMHhmYywgCisweDA3LCAweDIwLCAweDAyLCAweGYwLCAweDViLCAweGZjLCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDM2LCAweGZhLCAKKzB4ZjUsIDB4ZTcsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHhmNCwgMHgwMSwgMHhmZiwgMHhmZiwgMHgwMCwgMHhiNSwgMHg4NCwgMHhiMCwgMHg2OSwgMHg0NiwgMHhmZiwgMHhmNywgCisweDM3LCAweGZjLCAweGZmLCAweGY3LCAweDg1LCAweGZlLCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDA4LCAweDQ4LCAKKzB4MDAsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDIsIDB4OTAsIDB4MDcsIDB4NDgsIDB4MDAsIDB4NmEsIDB4YzAsIDB4NDYsIAorMHgwMywgMHg5MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHhmZiwgMHhmNywgMHg2NywgMHhmYiwgMHgwMSwgMHgyMCwgCisweDA0LCAweGIwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAKKzB4YzAsIDB4MDAsIDB4MTgsIDB4NDAsIDB4ODAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MDcsIDB4MWMsIDB4NjksIDB4NDYsIAorMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHgxNywgMHhmYywgMHhmOCwgMHg4OCwgMHhmZiwgMHhmNywgMHg0MiwgMHhmZiwgCisweGZmLCAweGY3LCAweDYyLCAweGZlLCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAKKzB4ZmYsIDB4ZjcsIDB4NGMsIDB4ZmIsIDB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHhiMCwgMHhiNSwgMHhjNiwgMHhiMCwgMHhjNywgMHg4OCwgMHg2OSwgMHg0NiwgMHhmZiwgMHhmNywgCisweDAxLCAweGZjLCAweDAxLCAweDI0LCAweDFhLCAweDRiLCAweDlmLCAweDQyLCAweDBhLCAweGQ5LCAweDAwLCAweGE4LCAKKzB4MDAsIDB4NzgsIDB4NDAsIDB4MjMsIDB4MTgsIDB4NDMsIDB4MDAsIDB4YWIsIDB4MTgsIDB4NzAsIDB4MDIsIDB4MjAsIAorMHhkOCwgMHg4MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHgyMCwgMHhlMCwgMHgxNCwgMHg0OCwgMHhmZiwgMHhmNywgCisweGUxLCAweGY5LCAweDA1LCAweDFjLCAweDEzLCAweDRhLCAweDM4LCAweDFjLCAweDA0LCAweGE5LCAweGZmLCAweGY3LCAKKzB4ZGQsIDB4ZjksIDB4MTIsIDB4NDksIDB4MjgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4ZDgsIDB4ZjksIDB4MDEsIDB4MmYsIAorMHgwNiwgMHhkMSwgMHgwYywgMHhhOSwgMHgwMCwgMHgyMCwgMHgwMCwgMHgyMiwgCisweDBhLCAweDYwLCAweDAxLCAweDMwLCAweDEwLCAweDI4LCAweGZiLCAweGQzLCAweDEwLCAweDIwLCAweDAwLCAweGFiLCAKKzB4NTgsIDB4NzAsIDB4MDQsIDB4OTgsIDB4YzAsIDB4NDYsIDB4MDIsIDB4OTAsIDB4MDUsIDB4OTgsIDB4YzAsIDB4NDYsIAorMHgwMywgMHg5MCwgMHg2OCwgMHg0NiwgMHgwNiwgMHhhOSwgMHhmZiwgMHhmNywgMHgwZiwgMHhmYiwgMHgyMCwgMHgxYywgCisweDQ2LCAweGIwLCAweGIwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGZmLCAweDAxLCAweDAwLCAweDAwLCAKKzB4MjQsIDB4MDIsIDB4ZmYsIDB4ZmYsIDB4OWQsIDB4YWYsIDB4MjEsIDB4NDAsIDB4M2MsIDB4MDIsIDB4ZmYsIDB4ZmYsIAorMHhmMCwgMHhiNSwgMHhjNiwgMHhiMCwgMHgwNywgMHgxYywgMHg2OSwgMHg0NiwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgCisweGJiLCAweGZiLCAweGZjLCAweDg4LCAweDc4LCAweDc4LCAweDAxLCAweDI1LCAweDEwLCAweDI4LCAweDAxLCAweGQxLCAKKzB4MTksIDB4MmMsIDB4MDksIDB4ZDksIDB4MDAsIDB4YTgsIDB4MDAsIDB4NzgsIDB4NDAsIDB4MjMsIDB4MTgsIDB4NDMsIAorMHgwMCwgMHhhYiwgMHgxOCwgMHg3MCwgMHgwMiwgMHgyMCwgMHhkOCwgMHg4MCwgMHgwNCwgMHgzMywgMHgyNywgMHhlMCwgCisweGI4LCAweDY4LCAweGMwLCAweDQ2LCAweDA0LCAweDkwLCAweGY4LCAweDY4LCAweGMwLCAweDQ2LCAweDA1LCAweDkwLCAKKzB4MDYsIDB4YWEsIDB4ZmIsIDB4MWQsIDB4MDksIDB4MzMsIDB4MDAsIDB4MjEsIDB4NzgsIDB4NzgsIDB4MDAsIDB4MjgsIAorMHgwZCwgMHhkZCwgMHgwMCwgMHgyMCwgMHg0MCwgMHhjYiwgMHg0MCwgMHhjMiwgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNCwgCisweDAwLCAweDBjLCAweDA0LCAweDI4LCAweGY4LCAweGRiLCAweDQ4LCAweDFjLCAweDAxLCAweDA0LCAweDA5LCAweDBjLCAKKzB4NzgsIDB4NzgsIDB4ODgsIDB4NDIsIDB4ZjEsIDB4ZGMsIDB4MGIsIDB4NDgsIDB4ZmYsIDB4ZjcsIDB4N2UsIDB4ZjksIAorMHgwNywgMHgxYywgMHgwYSwgMHg0YSwgMHgyMCwgMHgxYywgMHgwNCwgMHhhOSwgMHhmZiwgMHhmNywgMHg3YSwgMHhmOSwgCisweDA4LCAweDQ5LCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDc1LCAweGY5LCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAKKzB4ZmYsIDB4ZjcsIDB4YmUsIDB4ZmEsIDB4MjgsIDB4MWMsIDB4NDYsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMiwgMHhmZiwgMHhmZiwgMHhjNSwgMHhhZiwgMHgyMSwgMHg0MCwgCisweDNjLCAweDAyLCAweGZmLCAweGZmLCAweGYwLCAweGI1LCAweDg0LCAweGIwLCAweDA0LCAweDFjLCAweDAwLCAweDI3LCAKKzB4ZTYsIDB4ODgsIDB4YTIsIDB4NjgsIDB4NDcsIDB4NDksIDB4MDgsIDB4NzksIDB4MDAsIDB4MjgsIDB4MDgsIDB4ZDAsIAorMHgwMCwgMHgyZSwgMHgwMSwgMHhkMCwgMHgwMSwgMHgyZSwgMHgwMSwgMHhkMSwgMHgwMSwgMHgyNywgMHgwMSwgMHhlMCwgCisweDA0LCAweDJlLCAweDAwLCAweGQxLCAweDAzLCAweDI2LCAweDAxLCAweDI1LCAweDQxLCAweDQ4LCAweDA1LCAweDJlLCAKKzB4NjYsIDB4ZDIsIDB4MDIsIDB4YTMsIDB4OWIsIDB4NWQsIDB4NWIsIDB4MDAsIDB4OWYsIDB4NDQsIDB4MDAsIDB4MWMsIAorMHgwMywgMHgwNiwgMHgwOCwgMHgwYywgMHgxMCwgMHgwMCwgMHgwNSwgMHg4MCwgMHgwMCwgMHgyMywgMHgwMywgMHhlMCwgCisweDA1LCAweDgwLCAweDA1LCAweGUwLCAweDAwLCAweDIzLCAweDAzLCAweDgwLCAweDQzLCAweDgwLCAweDA2LCAweGUwLCAKKzB4MDAsIDB4MjMsIDB4MDMsIDB4ODAsIDB4NDUsIDB4ODAsIDB4MDIsIDB4ZTAsIDB4ZmYsIDB4MjMsIDB4MDEsIDB4MzMsIAorMHgwMywgMHg4MCwgMHhjYiwgMHgxZCwgMHg3OSwgMHgzMywgMHg5ZSwgMHg4OSwgMHgwMSwgMHgyMywgMHg1YiwgMHgwMiwgCisweDllLCAweDQyLCAweDAyLCAweGRiLCAweGQyLCAweDA3LCAweGQyLCAweDBmLCAweDAwLCAweGUwLCAweDAxLCAweDIyLCAKKzB4NmQsIDB4MjMsIDB4NWIsIDB4MDEsIDB4YzksIDB4MTgsIDB4ODksIDB4ODgsIDB4ZmYsIDB4MjMsIDB4ZTEsIDB4MzMsIAorMHg5OSwgMHg0MywgMHgwMSwgMHgyMywgMHgxOSwgMHg0MywgMHgwNiwgMHg4OCwgMHhmZiwgMHgzMywgMHg5ZSwgMHg0MiwgCisweDBkLCAweGQxLCAweGZmLCAweDIwLCAweGUxLCAweDMwLCAweDA4LCAweDQzLCAweDAwLCAweDJhLCAweDA0LCAweGQxLCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDIsIDB4OTgsIDB4NDMsIDB4MDEsIDB4MWMsIDB4MjAsIDB4ZTAsIDB4MDEsIDB4MjEsIAorMHg4OSwgMHgwMiwgMHgwMSwgMHg0MywgMHgxYywgMHhlMCwgMHgwMSwgMHgyZSwgMHgwYSwgMHhkMSwgMHg0MCwgMHg4OCwgCisweDAxLCAweDI4LCAweDA0LCAweGQxLCAweDYwLCAweDIzLCAweDE5LCAweDQzLCAweDAwLCAweDJhLCAweDEzLCAweGQwLCAKKzB4MGMsIDB4ZTAsIDB4MjAsIDB4MjMsIDB4MTksIDB4NDMsIDB4MGYsIDB4ZTAsIDB4MDAsIDB4MmUsIDB4MGQsIDB4ZDEsIAorMHg0MCwgMHg4OCwgMHgwMSwgMHgyOCwgMHgwOCwgMHhkMSwgMHhmZiwgMHgyMywgMHg4MSwgMHgzMywgMHgxOSwgMHg0MywgCisweDAwLCAweDJhLCAweDA1LCAweGQwLCAweDAxLCAweDIzLCAweDliLCAweDAyLCAweDE5LCAweDQzLCAweDAxLCAweGUwLCAKKzB4ODAsIDB4MjMsIDB4MTksIDB4NDMsIDB4MDQsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4NzUsIDB4ZjksIDB4MDksIDB4MjEsIAorMHg0OSwgMHgwMiwgMHgwMCwgMHgyMCwgMHgwMiwgMHhmMCwgMHg3MCwgMHhmOSwgMHgwMCwgMHgyZiwgMHgwMiwgMHhkMSwgCisweDAwLCAweDIwLCAweDEyLCAweGUwLCAweGZmLCAweGU3LCAweDY5LCAweDQ2LCAweDIwLCAweDFjLCAweGZmLCAweGY3LCAKKzB4ZWYsIDB4ZmEsIDB4MDAsIDB4YTgsIDB4MDAsIDB4NzgsIDB4NDAsIDB4MjMsIDB4MTgsIDB4NDMsIDB4MDAsIDB4YWIsIAorMHgxOCwgMHg3MCwgMHgwMiwgMHgyMCwgMHhkOCwgMHg4MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHgwNCwgMHgzMywgCisweGZmLCAweGY3LCAweDIyLCAweGZhLCAweDI4LCAweDFjLCAweDA0LCAweGIwLCAKKzB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg4OCwgMHgxYywgMHgwMCwgMHg4MCwgMHhjMCwgMHg4OCwgMHg1MSwgMHgyMSwgMHg4OSwgMHgwMywgMHgwOCwgMHg2MiwgCisweDAwLCAweDIwLCAweDcwLCAweDQ3LCAweDgwLCAweGI1LCAweDE2LCAweDRmLCAweGY4LCAweDY4LCAweDAxLCAweDI4LCAKKzB4MDcsIDB4ZDEsIDB4MzcsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZjgsIDB4MTgsIDB4NDAsIDB4OGEsIDB4ODAsIDB4MjEsIAorMHgwMSwgMHg0MywgMHgxYiwgMHgyMCwgMHgwNywgMHhlMCwgMHg2ZCwgMHgyMywgMHg1YiwgMHgwMSwgMHhmOCwgMHgxOCwgCisweDgwLCAweDhiLCAweDAxLCAweDIxLCAweDQ5LCAweDAzLCAweDAxLCAweDQzLCAweDEwLCAweDIwLCAweDAyLCAweGYwLCAKKzB4MzMsIDB4ZjksIDB4MDEsIDB4MjAsIDB4NzEsIDB4MjMsIDB4NWIsIDB4MDEsIDB4ZjksIDB4MTgsIDB4MDgsIDB4ODAsIAorMHg0OCwgMHg4MCwgMHgxYiwgMHgyMywgMHhkYiwgMHgwMSwgMHhmOCwgMHgxOCwgMHg4MCwgMHg4YiwgMHgwMSwgMHgyMywgCisweDFiLCAweDAzLCAweDk4LCAweDQzLCAweDQxLCAweDIxLCAweDA5LCAweDAyLCAweDAxLCAweDQzLCAweDAwLCAweDIwLCAKKzB4MDIsIDB4ZjAsIDB4MjAsIDB4ZjksIDB4MDAsIDB4MjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg4MCwgMHhiNSwgMHgxNywgMHg0ZiwgMHhmOCwgMHg2OCwgMHgwMSwgMHgyOCwgCisweDA4LCAweGQxLCAweDM3LCAweDIzLCAweDliLCAweDAxLCAweGY4LCAweDE4LCAweDQwLCAweDhhLCAweDgwLCAweDIzLCAKKzB4OTgsIDB4NDMsIDB4MDEsIDB4MWMsIDB4MWIsIDB4MjAsIDB4MDgsIDB4ZTAsIDB4NmQsIDB4MjMsIDB4NWIsIDB4MDEsIAorMHhmOCwgMHgxOCwgMHg4MCwgMHg4YiwgMHgwMSwgMHgyMywgMHg1YiwgMHgwMywgMHg5OCwgMHg0MywgMHgwMSwgMHgxYywgCisweDEwLCAweDIwLCAweDAyLCAweGYwLCAweDAxLCAweGY5LCAweGZmLCAweDIwLCAweDcxLCAweDIzLCAweDViLCAweDAxLCAKKzB4ZjksIDB4MTgsIDB4MDEsIDB4MzAsIDB4MDgsIDB4ODAsIDB4MWIsIDB4MjMsIDB4ZGIsIDB4MDEsIDB4ZjgsIDB4MTgsIAorMHg4MCwgMHg4YiwgMHg0MSwgMHgyMywgMHgxYiwgMHgwMiwgMHg5OCwgMHg0MywgMHgwOSwgMHgyMSwgMHg0OSwgMHgwMiwgCisweDAxLCAweDQzLCAweDAwLCAweDIwLCAweDAyLCAweGYwLCAweGVlLCAweGY4LCAweDAwLCAweDIwLCAweDgwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjUsIDB4ODQsIDB4YjAsIAorMHgwOCwgMHg0OSwgMHhjZiwgMHg2YSwgMHg2OSwgMHg0NiwgMHhmZiwgMHhmNywgMHg2OSwgMHhmYSwgMHhiOCwgMHgwNSwgCisweDgwLCAweDBkLCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZmLCAweGY3LCAKKzB4YTEsIDB4ZjksIDB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHg0MCwgMHgwMCwgMHgxNCwgMHg0MCwgMHhjMCwgMHg4OCwgMHg5ZiwgMHgyMywgMHgxOCwgMHg0MCwgMHgwNSwgMHg0OSwgCisweGM5LCAweDZhLCAweDFiLCAweDIzLCAweDViLCAweDAxLCAweDE5LCAweDQwLCAweDA4LCAweDQzLCAweDAzLCAweDQ5LCAKKzB4YzAsIDB4NDYsIDB4YzgsIDB4NjIsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4NDAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHg0MCwgMHgwMCwgMHgxNCwgMHgwMCwgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwZCwgMHg0OSwgMHgwZiwgMHg2YSwgCisweDAxLCAweDJmLCAweDAxLCAweGQxLCAweGZmLCAweDAzLCAweDA3LCAweGUwLCAweDAyLCAweDJmLCAweDAxLCAweGQxLCAKKzB4M2YsIDB4MDMsIDB4MDMsIDB4ZTAsIDB4MDAsIDB4MmYsIDB4MDEsIDB4ZDEsIDB4MDEsIDB4MjcsIDB4ZmYsIDB4MDIsIAorMHg2OSwgMHg0NiwgMHhmZiwgMHhmNywgMHgzNSwgMHhmYSwgMHgwMSwgMHhhYiwgMHg1ZiwgMHg4MCwgMHg2OCwgMHg0NiwgCisweDAwLCAweDIxLCAweGZmLCAweGY3LCAweDZmLCAweGY5LCAweDAxLCAweDIwLCAweDA0LCAweGIwLCAweDgwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MjAsIDB4MTQsIDB4NDAsIDB4YzIsIDB4ODgsIDB4YTEsIDB4MjAsIAorMHg0MCwgMHgwMywgMHgwMCwgMHgyMSwgMHgwMSwgMHgyMywgMHg1YiwgMHgwMywgMHg5YSwgMHg0MiwgMHgwMSwgMHhkMSwgCisweDAyLCAweDIyLCAweDA0LCAweGUwLCAweDAxLCAweDIzLCAweGRiLCAweDAzLCAweDlhLCAweDQyLCAweDAyLCAweGQxLCAKKzB4MDEsIDB4MjIsIDB4MDIsIDB4NjIsIDB4MDAsIDB4ZTAsIDB4MDEsIDB4NjIsIDB4MDgsIDB4MWMsIDB4NzAsIDB4NDcsIAorMHg5MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwNywgMHgxYywgMHgwMiwgMHhmMCwgMHg5ZiwgMHhmOCwgMHg2OSwgMHg0NiwgCisweDA0LCAweDFjLCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDBhLCAweGZhLCAweDAxLCAweGFiLCAweDVjLCAweDgwLCAKKzB4MDksIDB4NGYsIDB4ZjgsIDB4NmQsIDB4YzAsIDB4NDYsIDB4MDIsIDB4OTAsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIAorMHhmZiwgMHhmNywgMHg0MCwgMHhmOSwgMHhmOCwgMHg2ZCwgMHhjMCwgMHgwNywgMHhjMCwgMHgwZiwgMHgwNSwgMHg0OSwgCisweGMwLCAweDQ2LCAweGM4LCAweDYyLCAweDAxLCAweDIwLCAweDA0LCAweGIwLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MmEsIDB4MDAsIDB4ODAsIDB4NjgsIDB4MWMsIDB4MDAsIDB4ODAsIAorMHhjMCwgMHg4OCwgMHgwMiwgMHg0OSwgMHhjMCwgMHg0NiwgMHg0OCwgMHg2MSwgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgCisweDgwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweGI1LCAweDg0LCAweGIwLCAweDY5LCAweDQ2LCAweGZmLCAweGY3LCAKKzB4ZTMsIDB4ZjksIDB4MDYsIDB4NDgsIDB4YzAsIDB4NjgsIDB4MDEsIDB4YWIsIAorMHg1OCwgMHg4MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHhmZiwgMHhmNywgMHgxYiwgMHhmOSwgMHgwMSwgMHgyMCwgCisweDA0LCAweGIwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDE0LCAweDQwLCAKKzB4YzAsIDB4ODgsIDB4MDIsIDB4NDksIDB4YzAsIDB4NDYsIDB4YzgsIDB4NjAsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIAorMHg4MCwgMHgwMCwgMHgxNCwgMHgwMCwgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHg2OSwgMHg0NiwgMHg4NywgMHg2OCwgCisweGZmLCAweGY3LCAweGM2LCAweGY5LCAweDIwLCAweDJmLCAweDA3LCAweGQyLCAweDc4LCAweDAwLCAweDBjLCAweDQ5LCAKKzB4NDAsIDB4MTgsIDB4MWIsIDB4MjMsIDB4ZGIsIDB4MDEsIDB4YzAsIDB4MTgsIDB4ODAsIDB4OGIsIDB4MDYsIDB4ZTAsIAorMHgwMCwgMHhhOCwgMHgwMCwgMHg3OCwgMHg0MCwgMHgyMywgMHgxOCwgMHg0MywgMHgwMCwgMHhhYiwgMHgxOCwgMHg3MCwgCisweDAyLCAweDIwLCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZmLCAweGY3LCAKKzB4ZWYsIDB4ZjgsIDB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHg4NCwgMHhiMCwgMHhjMSwgMHg4OCwgMHg4MiwgMHg2OCwgCisweDIwLCAweDJhLCAweDA0LCAweGQyLCAweDEwLCAweDFjLCAweDAyLCAweGYwLCAweDE3LCAweGY4LCAweDAwLCAweDIwLCAKKzB4MTAsIDB4ZTAsIDB4NjksIDB4NDYsIDB4ZmYsIDB4ZjcsIDB4OWEsIDB4ZjksIDB4MDAsIDB4YTgsIDB4MDAsIDB4NzgsIAorMHg0MCwgMHgyMywgMHgxOCwgMHg0MywgMHgwMCwgMHhhYiwgMHgxOCwgMHg3MCwgMHgwMiwgMHgyMCwgMHhkOCwgMHg4MCwgCisweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweDA0LCAweDMzLCAweGZmLCAweGY3LCAweGNkLCAweGY4LCAweDAxLCAweDIwLCAKKzB4MDQsIDB4YjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4OTAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4YzcsIDB4ODgsIAorMHg2OSwgMHg0NiwgMHhmZiwgMHhmNywgMHg4MywgMHhmOSwgMHgxMCwgMHg0OCwgMHhmZSwgMHhmNywgMHg3MiwgMHhmZiwgCisweDAyLCAweDIwLCAweDM5LCAweDFjLCAweDAyLCAweGYwLCAweGYyLCAweGZmLCAweDAwLCAweDI4LCAweDA2LCAweGQwLCAKKzB4MDIsIDB4MjAsIDB4MzksIDB4MWMsIDB4MDIsIDB4ZjAsIDB4MzYsIDB4ZmYsIDB4MDEsIDB4YWIsIDB4NTgsIDB4ODAsIAorMHgwMiwgMHhlMCwgMHg0NSwgMHgyMCwgMHgwMCwgMHhhYiwgMHgxOCwgMHg3MCwgMHgwNywgMHg0OSwgMHgyMCwgMHgxYywgCisweGZlLCAweGY3LCAweDVmLCAweGZmLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZmLCAweGY3LCAweGE4LCAweGY4LCAKKzB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHgyNCwgMHgwMiwgMHhmZiwgMHhmZiwgMHgzYywgMHgwMiwgMHhmZiwgMHhmZiwgMHhiMCwgMHhiNSwgMHg4NCwgMHhiMCwgCisweGM3LCAweDg4LCAweDY5LCAweDQ2LCAweDg0LCAweDY4LCAweGZmLCAweGY3LCAweDU3LCAweGY5LCAweDEwLCAweDQ4LCAKKzB4ZmUsIDB4ZjcsIDB4NDYsIDB4ZmYsIDB4MGYsIDB4NGEsIDB4MDIsIDB4MjAsIDB4MzksIDB4MWMsIDB4ZmUsIDB4ZjcsIAorMHg0MywgMHhmZiwgMHgwMCwgMHgyOCwgMHgwNiwgMHhkMCwgMHgwZCwgMHg0YiwgMHgwMiwgMHgyMCwgMHgzOSwgMHgxYywgCisweDIyLCAweDFjLCAweGZlLCAweGY3LCAweDNjLCAweGZmLCAweDAyLCAweGUwLCAweDQ1LCAweDIwLCAweDAwLCAweGFiLCAKKzB4MTgsIDB4NzAsIDB4MDksIDB4NDksIDB4MjgsIDB4MWMsIDB4ZmUsIDB4ZjcsIDB4MzIsIDB4ZmYsIDB4NjgsIDB4NDYsIAorMHgwMCwgMHgyMSwgMHhmZiwgMHhmNywgMHg3YiwgMHhmOCwgMHgwMSwgMHgyMCwgMHgwNCwgMHhiMCwgMHhiMCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDI0LCAweDAyLCAweGZmLCAweGZmLCAweDU5LCAweGIxLCAweDIxLCAweDQwLCAKKzB4NTksIDB4YjAsIDB4MjEsIDB4NDAsIDB4M2MsIDB4MDIsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4YjUsIDB4ZmYsIDB4ZjcsIAorMHg0MywgMHhmOSwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgMHg4MCwgMHhiNCwgCisweGMyLCAweDg4LCAweDE5LCAweDRiLCAweGExLCAweDIxLCAweDQ5LCAweDAzLCAweDAwLCAweDJhLCAweDAzLCAweGQxLCAKKzB4MTgsIDB4NmIsIDB4MTAsIDB4MjMsIDB4OTgsIDB4NDMsIDB4MDQsIDB4ZTAsIDB4MDEsIDB4MmEsIDB4MDQsIDB4ZDEsIAorMHgxOCwgMHg2YiwgMHgxMCwgMHgyMywgMHgxOCwgMHg0MywgMHg0OCwgMHg2MSwgMHgxZiwgMHhlMCwgMHgwMiwgMHgyYSwgCisweDFkLCAweGQxLCAweGMyLCAweDY4LCAweDg3LCAweDY4LCAweDAwLCAweDIwLCAweDNiLCAweDFjLCAweGMzLCAweDQwLCAKKzB4ZGIsIDB4MDcsIDB4ZGIsIDB4MGYsIDB4OWIsIDB4MDIsIDB4MDMsIDB4NDMsIDB4MGIsIDB4NjEsIDB4MDEsIDB4MzAsIAorMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgyMCwgMHgyOCwgMHhmMywgMHhkYiwgMHgwMCwgMHgyMCwgMHgxMywgMHgxYywgCisweGMzLCAweDQwLCAweGRiLCAweDA3LCAweGRiLCAweDBmLCAweDliLCAweDAyLCAweGM3LCAweDFkLCAweDE5LCAweDM3LCAKKzB4M2IsIDB4NDMsIDB4MGIsIDB4NjEsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4MjAsIDB4MjgsIAorMHhmMSwgMHhkYiwgMHgwMCwgMHgyMCwgMHg4MCwgMHhiYywgMHg3MCwgMHg0NywgMHg4MCwgMHgwMCwgMHgxNCwgMHg0MCwgCisweDgwLCAweGI0LCAweGMyLCAweDg4LCAweDgxLCAweDY4LCAweDEwLCAweDAyLCAweDEyLCAweDBhLCAweDEwLCAweDQzLCAKKzB4MDIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MGMsIDB4NDgsIDB4YzAsIDB4NDYsIDB4MDIsIDB4NjAsIDB4MGMsIDB4NGIsIAorMHhjMCwgMHg0NiwgMHgxYSwgMHg4MCwgMHgwYSwgMHgwYywgMHgxNywgMHgwMiwgCisweDEyLCAweDEyLCAweDNhLCAweDQzLCAweDEyLCAweDA0LCAweDEyLCAweDBjLCAweDQyLCAweDYwLCAweDVhLCAweDgwLCAKKzB4MDksIDB4MDQsIDB4MDksIDB4MGMsIDB4MGEsIDB4MDIsIDB4MDksIDB4MGEsIDB4MTEsIDB4NDMsIDB4MDksIDB4MDQsIAorMHgwOSwgMHgwYywgMHg4MSwgMHg2MCwgMHg5OSwgMHg4MCwgMHgwMCwgMHgyMCwgMHg4MCwgMHhiYywgMHg3MCwgMHg0NywgCisweDQwLCAweDAwLCAweDE0LCAweDAwLCAweDI4LCAweDFiLCAweDAwLCAweDgwLCAweGIwLCAweGI1LCAweDg0LCAweGIwLCAKKzB4MTMsIDB4NDksIDB4MGEsIDB4NjgsIDB4MTIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MTMsIDB4MDIsIDB4MTIsIDB4MTIsIAorMHgxMywgMHg0MywgMHg0YSwgMHg2OCwgMHgxMiwgMHgwNCwgMHgxMiwgMHgwYywgMHgxZiwgMHgxYywgMHgxMywgMHgwMiwgCisweDEyLCAweDEyLCAweDEzLCAweDQzLCAweDg5LCAweDY4LCAweDA5LCAweDA0LCAweDA5LCAweDBjLCAweDBhLCAweDAyLCAKKzB4MDksIDB4MTIsIDB4MTEsIDB4NDMsIDB4MGMsIDB4MDQsIDB4MjQsIDB4MGMsIDB4NjksIDB4NDYsIDB4MWQsIDB4MWMsIAorMHhmZiwgMHhmNywgMHhhZSwgMHhmOCwgMHgwMSwgMHhhYiwgMHg1ZiwgMHg4MCwgMHgyOCwgMHgwNCwgMHgyMCwgMHg0MywgCisweDAyLCAweDkwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZlLCAweGY3LCAweGU1LCAweGZmLCAweDAxLCAweDIwLCAKKzB4MDQsIDB4YjAsIDB4YjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NDAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHhjMSwgMHg4OCwgMHg4MiwgMHg2OCwgMHgwOCwgMHgwMiwgMHgwOSwgMHgwYSwgMHgwOCwgMHg0MywgMHgwMCwgMHgwNCwgCisweDAwLCAweDBjLCAweDBhLCAweDQ5LCAweGMwLCAweDQ2LCAweGM4LCAweDYwLCAweDEwLCAweDBjLCAweDAzLCAweDAyLCAKKzB4MDAsIDB4MTIsIDB4MTgsIDB4NDMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4MDgsIDB4NjEsIDB4MTAsIDB4MDQsIAorMHgwMCwgMHgwYywgMHgwMiwgMHgwMiwgMHgwMCwgMHgwYSwgMHgxMCwgMHg0MywgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgCisweDQ4LCAweDYxLCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDE0LCAweDAwLCAKKzB4OTAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MTYsIDB4NGIsIDB4ZDksIDB4NjgsIDB4MDksIDB4MDQsIDB4MDksIDB4MGMsIAorMHgwYSwgMHgwMiwgMHgwOSwgMHgxMiwgMHgxMSwgMHg0MywgMHgxYSwgMHg2OSwgMHgxMiwgMHgwNCwgMHgxMiwgMHgwYywgCisweDE3LCAweDAyLCAweDEyLCAweDEyLCAweDNhLCAweDQzLCAweDViLCAweDY5LCAweDFiLCAweDA0LCAweDFiLCAweDBjLCAKKzB4MWYsIDB4MDIsIDB4MWIsIDB4MTIsIDB4M2IsIDB4NDMsIDB4MWYsIDB4MDQsIDB4M2YsIDB4MGMsIDB4MDUsIDB4MjMsIAorMHgwMCwgMHg5MywgMHg4NCwgMHg4OCwgMHgwMSwgMHhhYiwgMHgxYywgMHg4MCwgMHgwMCwgMHgyNCwgMHgwNCwgMHgzYiwgCisweDVjLCAweDcwLCAweDQwLCAweDg4LCAweDAwLCAweGFiLCAweDU4LCAweDgwLCAweGQ5LCAweDgwLCAweDEwLCAweDA0LCAKKzB4MzgsIDB4NDMsIDB4MDIsIDB4OTAsIDB4MDMsIDB4OTQsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmUsIDB4ZjcsIAorMHg5NSwgMHhmZiwgMHgwMSwgMHgyMCwgMHgwNCwgMHhiMCwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDQwLCAweDAwLCAweDE0LCAweDQwLCAweDAwLCAweGI1LCAweDg0LCAweGIwLCAweDBiLCAweDQ5LCAweDhhLCAweDZhLCAKKzB4MDUsIDB4MjEsIDB4MDAsIDB4OTEsIDB4ODEsIDB4ODgsIDB4MDEsIDB4YWIsIDB4MTksIDB4ODAsIDB4MDAsIDB4MjEsIAorMHgwNCwgMHgzYiwgMHg1OSwgMHg3MCwgMHg0MCwgMHg4OCwgMHgwMCwgMHhhYiwgMHg1OCwgMHg4MCwgMHhkYSwgMHg4MCwgCisweDAyLCAweDkxLCAweDAzLCAweDkxLCAweDY4LCAweDQ2LCAweGZlLCAweGY3LCAweDc5LCAweGZmLCAweDAxLCAweDIwLCAKKzB4MDQsIDB4YjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHhjMCwgMHg4OCwgMHgwMiwgMHg0OSwgMHhjMCwgMHg0NiwgMHg4OCwgMHg2MiwgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgCisweGMwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweGI1LCAweDg0LCAweGIwLCAweDBiLCAweDQ5LCAweDBhLCAweDZhLCAKKzB4MDUsIDB4MjEsIDB4MDAsIDB4OTEsIDB4ODEsIDB4ODgsIDB4MDEsIDB4YWIsIDB4MTksIDB4ODAsIDB4MDAsIDB4MjEsIAorMHgwNCwgMHgzYiwgMHg1OSwgMHg3MCwgMHg0MCwgMHg4OCwgMHgwMCwgMHhhYiwgMHg1OCwgMHg4MCwgMHhkYSwgMHg4MCwgCisweDAyLCAweDkxLCAweDAzLCAweDkxLCAweDY4LCAweDQ2LCAweGZlLCAweGY3LCAweDU1LCAweGZmLCAweDAxLCAweDIwLCAKKzB4MDQsIDB4YjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHhjMCwgMHg4OCwgMHgwMiwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MiwgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgCisweGMwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweGI1LCAweGMwLCAweDg4LCAweDAyLCAweDQ5LCAweGZlLCAweGY3LCAKKzB4ZjQsIDB4ZmQsIDB4MDAsIDB4MjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NzUsIDB4MDIsIDB4ZmYsIDB4ZmYsIAorMHgwMCwgMHhiNSwgMHg4NCwgMHhiMCwgMHg2OSwgMHg0NiwgMHhmZSwgMHhmNywgMHhmNywgMHhmZiwgMHgwNiwgMHg0OCwgCisweDAwLCAweDZiLCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZlLCAweGY3LCAKKzB4MmYsIDB4ZmYsIDB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHhmZCwgMHhmZiwgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAweGY4LCAweGZmLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4ZjMsIDB4ZmYsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHg4MCwgMHhiNSwgMHgwNywgMHgxYywgMHgxMCwgMHg0OCwgMHhmZSwgMHhmNywgMHhjNiwgMHhmZCwgCisweDAxLCAweDIwLCAweDQwLCAweDAyLCAweGExLCAweDIxLCAweDQ5LCAweDAzLCAweDg4LCAweDYwLCAweDAwLCAweDIxLCAKKzB4MGMsIDB4NDgsIDB4YzAsIDB4NDYsIDB4MDEsIDB4NzEsIDB4MGMsIDB4NDgsIDB4MDIsIDB4NjgsIDB4NTIsIDB4MGMsIAorMHgwNSwgMHhkMiwgMHgwMiwgMHg2OCwgMHgxMiwgMHgwYywgMHgwNiwgMHhkMSwgMHgwMCwgMHg2OCwgMHg4MCwgMHgwYSwgCisweDAzLCAweGQzLCAweDA4LCAweDQ4LCAweGMwLCAweDQ2LCAweGM3LCAweDYwLCAweDAyLCAweGUwLCAweDA3LCAweDQ4LCAKKzB4YzAsIDB4NDYsIDB4MDcsIDB4NjQsIDB4MDgsIDB4MWMsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHhkNSwgMHg5NCwgMHgyMSwgMHg0MCwgMHgyOCwgMHgwZiwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgCisweDQwLCAweDAxLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweDAxLCAweDIwLCAKKzB4MDMsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NzIsIDB4MTIsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4Y2IsIDB4ZmYsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg4OCwgMHgxYywgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHgwMSwgMHgyMCwgCisweDAzLCAweDQ5LCAweGMwLCAweDQ2LCAweDQ4LCAweDcyLCAweDE1LCAweDIwLCAweGZmLCAweGY3LCAweGJmLCAweGZmLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ODgsIDB4MWMsIDB4MDAsIDB4ODAsIDB4MDAsIDB4YjUsIDB4MDEsIDB4ZjAsIAorMHhmOSwgMHhmZiwgMHgwMSwgMHgyMCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgCisweDA3LCAweDFjLCAweGY4LCAweDg4LCAweDAyLCAweGYwLCAweGZlLCAweGY4LCAweDAwLCAweDI4LCAweDBjLCAweGQxLCAKKzB4NjksIDB4NDYsIDB4MzgsIDB4MWMsIDB4ZmUsIDB4ZjcsIDB4ODIsIDB4ZmYsIDB4MDYsIDB4NDgsIDB4MDEsIDB4YWIsIAorMHg1OCwgMHg4MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHhmZSwgMHhmNywgMHhiYiwgMHhmZSwgMHgwMSwgMHgyMCwgCisweDAwLCAweGUwLCAweDAwLCAweDIwLCAweDA0LCAweGIwLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4NjksIDB4NDYsIDB4ZmUsIDB4ZjcsIAorMHg2ZCwgMHhmZiwgMHgwMSwgMHgyNywgMHgwMSwgMHhhYiwgMHg1ZiwgMHg4MCwgMHgwOSwgMHg0OCwgMHg4MSwgMHg4OSwgCisweDA5LCAweDA0LCAweGMyLCAweDg5LCAweDExLCAweDQzLCAweDAyLCAweDkxLCAweDgxLCAweDg4LCAweDA5LCAweDA0LCAKKzB4YzAsIDB4ODgsIDB4MDgsIDB4NDMsIDB4MDMsIDB4OTAsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmUsIDB4ZjcsIAorMHg5YiwgMHhmZSwgMHgzOCwgMHgxYywgMHgwNCwgMHhiMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDRjLCAweDJhLCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAweDY5LCAweGZmLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4NjQsIDB4ZmYsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHg1ZiwgMHhmZiwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgCisweGZlLCAweGY3LCAweDVhLCAweGZmLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAKKzB4NTUsIDB4ZmYsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4NTAsIDB4ZmYsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHg0YiwgMHhmZiwgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAweDQ2LCAweGZmLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4NDEsIDB4ZmYsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIAorMHhmZSwgMHhmNywgMHgzYywgMHhmZiwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgCisweDM3LCAweGZmLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAweDMyLCAweGZmLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4OGMsIDB4YjAsIDB4MDgsIDB4YTksIDB4ZmUsIDB4ZjcsIAorMHgxMywgMHhmZiwgMHg2OSwgMHg0NiwgMHgwOCwgMHhhOCwgMHgwMiwgMHhmMCwgMHhhOSwgMHhmZiwgMHgwMiwgMHgyMCwgCisweDA4LCAweGFiLCAweDU4LCAweDcwLCAweDY5LCAweDQ2LCAweDA4LCAweGE4LCAweGZlLCAweGY3LCAweDQ4LCAweGZlLCAKKzB4MDEsIDB4MjAsIDB4MGMsIDB4YjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIAorMHgxOSwgMHhmZiwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg5MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwNywgMHgxYywgCisweDY5LCAweDQ2LCAweDM4LCAweDFjLCAweGZlLCAweGY3LCAweGY4LCAweGZlLCAweGZhLCAweDg4LCAweDEyLCAweDQ5LCAKKzB4MDEsIDB4MjQsIDB4YzgsIDB4MWQsIDB4ODksIDB4MzAsIDB4MDAsIDB4MmEsIDB4MGYsIDB4ZDAsIDB4MDQsIDB4NzAsIAorMHg0NCwgMHg3MCwgMHhiOCwgMHg2OCwgMHgwMCwgMHgwYywgMHg4MCwgMHgzMSwgMHhjOCwgMHg4MiwgMHhiOCwgMHg2OCwgCisweGMwLCAweDQ2LCAweDA4LCAweDgzLCAweGY4LCAweDY4LCAweDAwLCAweDBjLCAweDQ4LCAweDgzLCAweGY4LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4ODgsIDB4ODMsIDB4MDIsIDB4ZTAsIDB4MDAsIDB4MjEsIAorMHgwMSwgMHg3MCwgMHg0MSwgMHg3MCwgMHgwNiwgMHg0OCwgMHgwMSwgMHhhYiwgMHg1OCwgMHg4MCwgMHg2OCwgMHg0NiwgCisweDAwLCAweDIxLCAweGZlLCAweGY3LCAweDE3LCAweGZlLCAweDIwLCAweDFjLCAweDA0LCAweGIwLCAweDkwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHhlMywgMHhmZSwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgCisweGZlLCAweGY3LCAweGRlLCAweGZlLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAKKzB4ZDksIDB4ZmUsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4ZDQsIDB4ZmUsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHhjZiwgMHhmZSwgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDkwLCAweGI1LCAweDg0LCAweGIwLCAweDA3LCAweDFjLCAweDY5LCAweDQ2LCAweDM4LCAweDFjLCAKKzB4ZmUsIDB4ZjcsIDB4YWUsIDB4ZmUsIDB4ZjgsIDB4ODgsIDB4MDMsIDB4MjQsIDB4ZTQsIDB4MDQsIDB4MDQsIDB4NDMsIAorMHgwMywgMHgyMywgMHhkYiwgMHgwNCwgMHg5YywgMHg0MiwgMHgwMiwgMHhkMywgMHgwZiwgMHg0YiwgMHg5YywgMHg0MiwgCisweDA2LCAweGQ5LCAweDBmLCAweDQ4LCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAKKzB4ZmUsIDB4ZjcsIDB4ZGMsIDB4ZmQsIDB4MDEsIDB4MjAsIDB4ODAsIDB4MDcsIDB4MjAsIDB4NDMsIDB4MDAsIDB4NjgsIAorMHgwMCwgMHgyMSwgMHgwMCwgMHhhYiwgMHg1OSwgMHg3MCwgMHhmYSwgMHg4OCwgMHhjMCwgMHg0NiwgMHhkYSwgMHg4MCwgCisweDAyLCAweDkwLCAweDAzLCAweDkxLCAweDY4LCAweDQ2LCAweDA0LCAweDMzLCAweGZlLCAweGY3LCAweGNjLCAweGZkLCAKKzB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHhlMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgCisweDA3LCAweDFjLCAweDY5LCAweDQ2LCAweDM4LCAweDFjLCAweGZlLCAweGY3LCAweDdiLCAweGZlLCAweGY4LCAweDg4LCAKKzB4MDMsIDB4MjMsIDB4ZGIsIDB4MDQsIDB4MTgsIDB4NDMsIDB4OTgsIDB4NDIsIDB4MDIsIDB4ZDMsIDB4MGEsIDB4NGIsIAorMHg5OCwgMHg0MiwgMHgwOCwgMHhkOSwgMHgwOSwgMHg0OCwgMHgwMSwgMHhhYiwgMHg1OCwgMHg4MCwgMHg2OCwgMHg0NiwgCisweDAwLCAweDIxLCAweGZlLCAweGY3LCAweGFiLCAweGZkLCAweDAxLCAweDIwLCAweDAzLCAweGUwLCAweGI5LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDEsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDQsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHhlMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgCisweDgwLCAweGI1LCAweDg2LCAweGIwLCAweDAyLCAweGE5LCAweGZlLCAweGY3LCAweDU3LCAweGZlLCAweDAxLCAweDI3LCAKKzB4MDIsIDB4YWIsIDB4NWYsIDB4NzAsIDB4MDAsIDB4MjAsIDB4ZDgsIDB4ODAsIDB4MGEsIDB4NDgsIDB4NDEsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHgwNCwgMHg5MSwgMHg4MSwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwNSwgMHg5MSwgMHhjMSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDAwLCAweDkxLCAweDQwLCAweDY5LCAweGMwLCAweDQ2LCAweDAxLCAweDkwLCAweDY5LCAweDQ2LCAKKzB4MDIsIDB4YTgsIDB4ZmUsIDB4ZjcsIDB4ODEsIDB4ZmQsIDB4MzgsIDB4MWMsIDB4MDYsIDB4YjAsIDB4ODAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgxOSwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHhjMSwgMHg2OCwgCisweDgwLCAweDY4LCAweGZlLCAweGY3LCAweDQ3LCAweGZiLCAweDAwLCAweDIwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4OTAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MDQsIDB4MWMsIDB4MGYsIDB4MWMsIAorMHg2OCwgMHg0NiwgMHg1MCwgMHgyMSwgMHhmZSwgMHhmNywgMHgzNiwgMHhmZSwgMHgwMSwgMHhhYiwgMHg1YywgMHg4MCwgCisweDAyLCAweDk3LCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZlLCAweGY3LCAweDYxLCAweGZkLCAweDA0LCAweGIwLCAKKzB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ODAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MDcsIDB4MWMsIAorMHg2OCwgMHg0NiwgMHg1MSwgMHgyMSwgMHhmZSwgMHhmNywgMHgyNCwgMHhmZSwgMHgwMSwgMHhhYiwgMHg1ZiwgMHg4MCwgCisweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZlLCAweGY3LCAweDUwLCAweGZkLCAweDA0LCAweGIwLCAweDgwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIAorMHg5MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwMCwgMHgyNywgMHgxMiwgMHg0OSwgMHgwOSwgMHg2OCwgMHgxMiwgMHg0YSwgCisweDEyLCAweDZiLCAweDEwLCAweDIzLCAweDFhLCAweDQwLCAweDAxLCAweDI0LCAweDAwLCAweDJhLCAweDAwLCAweGQwLCAKKzB4MDEsIDB4MjcsIDB4OGEsIDB4MGMsIDB4MDMsIDB4ZDMsIDB4M2EsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MDIsIDB4MjcsIAorMHgxNywgMHg0MywgMHhjOSwgMHgwYywgMHgwMywgMHhkMywgMHgzOSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwNCwgMHgyNywgCisweDBmLCAweDQzLCAweDY5LCAweDQ2LCAweGZlLCAweGY3LCAweGVjLCAweGZkLCAweDAxLCAweGFiLCAweDVmLCAweDgwLCAKKzB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmUsIDB4ZjcsIDB4MjYsIDB4ZmQsIDB4MjAsIDB4MWMsIDB4MDQsIDB4YjAsIAorMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDEwLCAweDQwLCAweGMwLCAweDAwLCAweDE4LCAweDQwLCAweDAwLCAweGI1LCAweDg0LCAweGIwLCAKKzB4NjksIDB4NDYsIDB4ZmUsIDB4ZjcsIDB4ZDcsIDB4ZmQsIDB4MDYsIDB4NDgsIDB4YzAsIDB4NmQsIDB4MDEsIDB4YWIsIAorMHg1OCwgMHg4MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHhmZSwgMHhmNywgMHgwZiwgMHhmZCwgMHgwMSwgMHgyMCwgCisweDA0LCAweGIwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweGE0LCAweDJhLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4ZGQsIDB4ZmQsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NzAsIDB4NDcsIAorMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgCisweDAwLCAweDIwLCAweDcwLCAweDQ3LCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAKKzB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4Y2IsIDB4ZmQsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg4MCwgMHhiNSwgMHg4NSwgMHhiMCwgMHgwMSwgMHhhOSwgMHhmZSwgMHhmNywgMHhhYiwgMHhmZCwgMHgwMCwgMHgyMCwgCisweDAxLCAweGFiLCAweDU4LCAweDcwLCAweDBjLCAweDQ5LCAweGM5LCAweDY4LCAweDAxLCAweDI3LCAweDAxLCAweDI5LCAKKzB4MDIsIDB4ZDEsIDB4MDMsIDB4OTcsIDB4MDQsIDB4OTcsIDB4MDEsIDB4ZTAsIDB4MDMsIDB4OTcsIDB4MDQsIDB4OTAsIAorMHg2OCwgMHg0NiwgMHgwMSwgMHhmMCwgMHgzMywgMHhmZCwgMHgwMiwgMHhhYiwgMHgwMCwgMHg5OCwgMHhjMCwgMHg0NiwgCisweDU4LCAweDgwLCAweDAwLCAweDIxLCAweDAxLCAweGE4LCAweGZlLCAweGY3LCAweGQzLCAweGZjLCAweDM4LCAweDFjLCAKKzB4MDUsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg3MCwgMHg0NywgMHgwNCwgMHg0OSwgMHgwMCwgMHgyMCwgMHgwMCwgMHgyMiwgMHgwYSwgMHg3MCwgMHgwMSwgMHgzMCwgCisweDAxLCAweDMxLCAweDY4LCAweDI4LCAweGZhLCAweGQzLCAweDcwLCAweDQ3LCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAKKzB4MDAsIDB4MjIsIDB4ODgsIDB4NDIsIDB4MDMsIDB4ZDMsIDB4NDAsIDB4MWEsIDB4MDEsIDB4MzIsIDB4ODgsIDB4NDIsIAorMHhmYiwgMHhkMiwgMHgxMCwgMHgxYywgMHg3MCwgMHg0NywgMHg4OCwgMHg0MiwgMHgwMiwgMHhkMywgMHg0MCwgMHgxYSwgCisweDg4LCAweDQyLCAweGZjLCAweGQyLCAweDcwLCAweDQ3LCAweDkwLCAweGI0LCAweDAxLCAweDFjLCAweGZmLCAweDI3LCAKKzB4MDQsIDB4MjksIDB4MjcsIDB4ZGEsIDB4MDAsIDB4MjAsIDB4MTQsIDB4NGEsIDB4NDMsIDB4MDAsIDB4MWIsIDB4MTgsIAorMHhkYiwgMHgwMCwgMHhkNCwgMHg1OCwgMHg2MywgMHgwYywgMHgxYSwgMHhkMiwgMHg0YiwgMHgwMCwgMHg1OSwgMHgxOCwgCisweGM5LCAweDAwLCAweDU3LCAweDU4LCAweDQzLCAweDAwLCAweDFiLCAweDE4LCAweGRiLCAweDAwLCAweGQ3LCAweDUwLCAKKzB4ODksIDB4MTgsIDB4OWEsIDB4MTgsIDB4NGYsIDB4NjgsIDB4YzAsIDB4NDYsIDB4NTcsIDB4NjAsIDB4OGIsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHg5MywgMHg2MCwgMHgwYiwgMHg2OSwgMHhjMCwgMHg0NiwgMHgxMywgMHg2MSwgMHg0YiwgMHg2OSwgCisweGMwLCAweDQ2LCAweDUzLCAweDYxLCAweGM5LCAweDY4LCAweGMwLCAweDQ2LCAweGQxLCAweDYwLCAweDkwLCAweGJjLCAKKzB4NzAsIDB4NDcsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MGUsIDB4MDQsIDB4MjgsIDB4ZDksIDB4ZGIsIAorMHgzOCwgMHgxYywgMHhmNiwgMHhlNywgMHg0MCwgMHhhYiwgMHgyMCwgMHg0MCwgMHhmNywgMHhiNSwgMHhjNCwgMHhiMCwgCisweDA0LCAweDFjLCAweDAwLCAweDIwLCAweDQ2LCAweDlhLCAweDExLCAweDIxLCAweDExLCAweDQwLCAweDZlLCAweGQwLCAKKzB4MDAsIDB4MjcsIDB4NzksIDB4MDAsIDB4YzksIDB4MTksIDB4YzksIDB4MDAsIDB4NTcsIDB4NGEsIDB4NTEsIDB4NTgsIAorMHg0OSwgMHgwYywgMHgwMywgMHhkMiwgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwZSwgMHgwNCwgMHhlMCwgCisweDc5LCAweDFjLCAweDBmLCAweDA2LCAweDNmLCAweDBlLCAweDA0LCAweDJmLCAweGVmLCAweGRiLCAweDAwLCAweDI4LCAKKzB4NWIsIDB4ZDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4MjIsIDB4MDAsIDB4OTIsIDB4NDAsIDB4MjMsIDB4MDAsIDB4MjEsIAorMHgwMCwgMHgyMCwgMHgwMiwgMHhhYSwgMHgwMCwgMHhmMCwgMHg4OCwgMHhmYSwgMHgwNCwgMHhhOSwgMHgwMCwgMHgyMCwgCisweDgyLCAweDAwLCAweDhhLCAweDU4LCAweDEyLCAweDA2LCAweDEyLCAweDBlLCAweGEyLCAweDQyLCAweDAzLCAweGQxLCAKKzB4NzIsIDB4MWMsIDB4MTYsIDB4MDYsIDB4MzYsIDB4MGUsIDB4MDQsIDB4ZTAsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDYsIAorMHgwMCwgMHgwZSwgMHgxMCwgMHgyOCwgMHhmMCwgMHhkYiwgMHgwMCwgMHgyZSwgMHgzZCwgMHhkMCwgMHgwNCwgMHgyYywgCisweDNlLCAweGQxLCAweDgwLCAweDAwLCAweDA4LCAweDU4LCAweDQwLCAweDAxLCAweDgwLCAweDBkLCAweDAwLCAweDIyLCAKKzB4MDAsIDB4OTIsIDB4MTAsIDB4MjMsIDB4MDAsIDB4MjEsIDB4MDIsIDB4YWEsIDB4MDAsIDB4ZjAsIDB4NjgsIDB4ZmEsIAorMHgwMCwgMHgyMSwgMHgwMSwgMHg5MSwgMHgwMiwgMHhhOCwgMHgwNSwgMHg5OSwgMHg0OSwgMHgwYywgMHg4OSwgMHgwNSwgCisweDI5LCAweGQwLCAweGMxLCAweDY4LCAweDBhLCAweDA2LCAweDEyLCAweDBlLCAweDQ1LCAweDliLCAweDlhLCAweDQyLCAKKzB4MTEsIDB4ZDEsIDB4YzAsIDB4NjgsIDB4NDAsIDB4MDEsIDB4ODYsIDB4MGQsIDB4MDAsIDB4MjIsIDB4MDAsIDB4OTIsIAorMHgwYywgMHgyMywgMHgwMCwgMHgyMSwgMHgzMCwgMHgxYywgMHgwMiwgMHhhYSwgMHgwMCwgMHhmMCwgMHg1MCwgMHhmYSwgCisweDAxLCAweDk5LCAweDAyLCAweDlkLCAweDQ4LCAweDFjLCAweDAxLCAweDA2LCAKKzB4MDksIDB4MGUsIDB4MDEsIDB4OTEsIDB4MGUsIDB4ZTAsIDB4NDgsIDB4MDEsIDB4ODYsIDB4MGQsIDB4MDAsIDB4MjIsIAorMHgwMCwgMHg5MiwgMHgxMCwgMHgyMywgMHgwMCwgMHgyMSwgMHgzMCwgMHgxYywgMHgwMiwgMHhhYSwgMHgwMCwgMHhmMCwgCisweDNmLCAweGZhLCAweDAyLCAweGE4LCAweDA1LCAweDk5LCAweDQ5LCAweDBjLCAweDg5LCAweDA1LCAweGQ4LCAweGQxLCAKKzB4MDEsIDB4OTksIDB4MDAsIDB4MjksIDB4MGYsIDB4ZDEsIDB4ZmYsIDB4MjAsIDB4M2QsIDB4ZTAsIDB4NDAsIDB4ZTAsIAorMHg4MCwgMHgwMCwgMHgwOCwgMHg1OCwgMHg0MCwgMHgwMSwgMHg4NiwgMHgwZCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg5MiwgCisweDBjLCAweDIzLCAweDAwLCAweDIxLCAweDMwLCAweDFjLCAweDAyLCAweGFhLCAweDAwLCAweGYwLCAweDI4LCAweGZhLCAKKzB4MDIsIDB4OWQsIDB4MDEsIDB4MjAsIDB4MDAsIDB4MDQsIDB4NDYsIDB4OWEsIDB4MTAsIDB4NDMsIDB4NzksIDB4MDAsIAorMHhjOSwgMHgxOSwgMHhjOSwgMHgwMCwgMHgxNywgMHg0YSwgMHhjMCwgMHg0NiwgMHg1MCwgMHg1MCwgMHgzMCwgMHgxYywgCisweDhlLCAweDE4LCAweDcwLCAweDYwLCAweDEwLCAweDIwLCAweDA0LCAweDJjLCAweDAwLCAweGQwLCAweDBjLCAweDIwLCAKKzB4MDQsIDB4MWMsIDB4YjAsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjEsIDB4NDYsIDB4OWEsIDB4MTEsIDB4NDAsIAorMHgyMCwgMHgyOSwgMHgwMCwgMHhkMCwgMHgyOCwgMHgxYywgMHgzMCwgMHg2MSwgMHgyOCwgMHgxOSwgMHhmZiwgMHgyMSwgCisweGZmLCAweDMwLCAweDA4LCAweDMwLCAweDA5LCAweDMxLCAweGZmLCAweGY3LCAweDE5LCAweGZmLCAweDQzLCAweDAxLCAKKzB4MTgsIDB4MTgsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MWIsIDB4NzAsIDB4NjEsIDB4MDAsIDB4MjAsIDB4NTAsIDB4MjEsIAorMHg0NiwgMHg5YSwgMHgxMSwgMHg0MCwgMHg1MCwgMHgyOSwgMHgwMCwgMHhkMSwgMHgyOCwgMHgxYywgMHhmMCwgMHg2MCwgCisweDM4LCAweDFjLCAweDQ3LCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGZmLCAweDIwLCAKKzB4ZjksIDB4ZTcsIDB4MDAsIDB4MDAsIDB4NDAsIDB4YWIsIDB4MjAsIDB4NDAsIDB4ODAsIDB4YjQsIDB4MDAsIDB4MjMsIAorMHgwMCwgMHgyMiwgMHgwMCwgMHgyOSwgMHgwNiwgMHhkOSwgMHg4NywgMHg1YywgMHg3YiwgMHg0MCwgMHgxYiwgMHgwNiwgCisweDFiLCAweDBlLCAweDAxLCAweDMyLCAweDhhLCAweDQyLCAweGY4LCAweGQzLCAweGQ4LCAweDQzLCAweDAwLCAweDA2LCAKKzB4MDAsIDB4MGUsIDB4ODAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4ZjAsIDB4YjUsIDB4YzYsIDB4YjAsIDB4MDQsIDB4MjgsIAorMHgwNywgMHhkYSwgMHg0MSwgMHgwMCwgMHgwOSwgMHgxOCwgMHhjOSwgMHgwMCwgMHg0NSwgMHg5MSwgMHg0MSwgMHg0YSwgCisweDUxLCAweDU4LCAweDRiLCAweDBjLCAweDAyLCAweGQyLCAweDAwLCAweDIwLCAweGMwLCAweDQzLCAweDc2LCAweGUwLCAKKzB4MDEsIDB4MjMsIDB4NWIsIDB4MDQsIDB4MTksIDB4NDAsIDB4NDMsIDB4MDAsIDB4MTgsIDB4MTgsIDB4YzAsIDB4MDAsIAorMHgzYSwgMHg0YSwgMHgxNCwgMHgxOCwgMHgwMCwgMHgyOSwgMHg2MSwgMHhkMCwgMHgwMCwgMHgyMSwgMHgwMiwgMHg5MSwgCisweDIwLCAweDY5LCAweGExLCAweDY4LCAweDQ1LCAweDE4LCAweDMwLCAweGQwLCAweGZmLCAweDIxLCAweDY4LCAweDFlLCAKKzB4MDksIDB4MzEsIDB4ZmYsIDB4ZjcsIDB4Y2QsIDB4ZmUsIDB4NjEsIDB4NjgsIDB4NDAsIDB4MTgsIDB4MDEsIDB4OTAsIAorMHgwMSwgMHg5OCwgMHg4MSwgMHg0MiwgMHgwMiwgMHhkMSwgMHhhNiwgMHg2OCwgMHhhZiwgMHgxYiwgMHgwOSwgMHhlMCwgCisweDAwLCAweDI2LCAweGZmLCAweDIxLCAweDI4LCAweDFjLCAweDA5LCAweDMxLCAweGZmLCAweGY3LCAweGM3LCAweGZlLCAKKzB4MDcsIDB4MWMsIDB4MDEsIDB4ZDEsIDB4ZmYsIDB4MjcsIDB4MDksIDB4MzcsIDB4MDAsIDB4MjIsIDB4MDAsIDB4OTIsIAorMHgwMSwgMHg5OCwgMHgzMSwgMHgxYywgMHgwMywgMHhhYSwgMHgzYiwgMHgxYywgMHgwMCwgMHhmMCwgMHg5ZSwgMHhmOSwgCisweDAzLCAweGE4LCAweDM5LCAweDFjLCAweGZmLCAweGY3LCAweGFjLCAweGZmLCAweGMwLCAweDQzLCAweDAyLCAweDk5LCAKKzB4NDgsIDB4NDAsIDB4MDEsIDB4MDYsIDB4MDksIDB4MGUsIDB4MDIsIDB4OTEsIDB4ZWQsIDB4MWIsIDB4YTAsIDB4NjgsIAorMHhhOCwgMHg0MiwgMHgwMCwgMHhkMSwgMHgwMCwgMHgyNSwgMHgwMCwgMHgyZCwgMHhjZSwgMHhkOCwgMHgwMiwgMHg5OSwgCisweGNmLCAweDQzLCAweDAwLCAweDIyLCAweDAwLCAweDkyLCAweDBjLCAweDIzLCAweDAwLCAweDIxLCAweDYwLCAweDY4LCAKKzB4MDMsIDB4YWEsIDB4MDAsIDB4ZjAsIDB4ODMsIDB4ZjksIDB4MjAsIDB4NjksIDB4YzAsIDB4NDYsIDB4MDMsIDB4OTAsIAorMHgwNSwgMHg5OCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMiwgMHgzOSwgMHgwNiwgMHgwOSwgMHgwZSwgMHgwOCwgMHg0MywgCisweDA1LCAweDkwLCAweGZmLCAweDIzLCAweDFiLCAweDAyLCAweDk4LCAweDQzLCAweDA1LCAweDkwLCAweDBjLCAweDIxLCAKKzB4MDMsIDB4YTgsIDB4ZmYsIDB4ZjcsIDB4ODMsIDB4ZmYsIDB4ZmYsIDB4MjMsIDB4MWIsIDB4MDIsIDB4MDUsIDB4OTksIAorMHg5OSwgMHg0MywgMHgwMCwgMHgwNiwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwMiwgMHgwOCwgMHg0MywgMHgwNSwgMHg5MCwgCisweDBjLCAweDIzLCAweDAwLCAweDIxLCAweDYwLCAweDY4LCAweDAzLCAweGFhLCAweDAwLCAweGYwLCAweGNhLCAweGY5LCAKKzB4MDAsIDB4MjAsIDB4NDUsIDB4OTksIDB4MDYsIDB4NGEsIDB4YzAsIDB4NDYsIDB4NTAsIDB4NTAsIDB4YzEsIDB4NDMsIAorMHg2MSwgMHg2MCwgMHhhMSwgMHg2MCwgMHhlMSwgMHg2MCwgMHgyMSwgMHg2MSwgMHg2MSwgMHg2MSwgMHg0NiwgMHhiMCwgCisweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDQwLCAweGFiLCAweDIwLCAweDQwLCAKKzB4YjAsIDB4YjQsIDB4NGMsIDB4NDIsIDB4MDAsIDB4MjksIDB4MDAsIDB4ZGIsIAorMHgwYywgMHgxYywgMHgwMCwgMHgyNywgMHhmZiwgMHg0MywgMHgwNCwgMHgyOCwgMHgyMSwgMHhkYSwgMHgxMiwgMHg0ZCwgCisweDQzLCAweDAwLCAweDE4LCAweDE4LCAweGMwLCAweDAwLCAweDQwLCAweDE5LCAweDAxLCAweDJhLCAweDA1LCAweGQwLCAKKzB4MDIsIDB4MmEsIDB4MDksIDB4ZDAsIDB4MDMsIDB4MmEsIDB4MTYsIDB4ZDEsIDB4MDEsIDB4NjksIDB4MGIsIDB4ZTAsIAorMHgwMCwgMHgyOSwgMHgxMiwgMHhkYiwgMHgwMiwgMHg2OSwgMHg4YSwgMHg0MiwgMHgwZiwgMHhkMywgMHgwNSwgMHhlMCwgCisweDAwLCAweDI5LCAweDA3LCAweGRhLCAweGMxLCAweDY4LCAweGExLCAweDQyLCAweDA5LCAweGQzLCAweDA5LCAweDFiLCAKKzB4YzEsIDB4NjAsIDB4YzAsIDB4NjgsIDB4YjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4YzEsIDB4NjgsIDB4MDksIDB4MTksIAorMHgwMiwgMHg2OSwgMHg5MSwgMHg0MiwgMHhmNiwgMHhkOSwgMHgzOCwgMHgxYywgMHhmNiwgMHhlNywgMHgwMCwgMHgwMCwgCisweDQwLCAweGFiLCAweDIwLCAweDQwLCAweGYwLCAweGI1LCAweDg0LCAweGIwLCAweDE3LCAweDFjLCAweDBkLCAweDFjLCAKKzB4MDAsIDB4MjEsIDB4MDIsIDB4OTEsIDB4NDIsIDB4MDAsIDB4MTIsIDB4MTgsIDB4ZDIsIDB4MDAsIDB4MmMsIDB4NDksIAorMHg4YiwgMHg1OCwgMHgxYiwgMHgwNiwgMHgxYiwgMHgwZSwgMHgwMSwgMHg5MywgMHgwMCwgMHgyMywgMHhkYiwgMHg0MywgCisweDA0LCAweDI4LCAweDAyLCAweGRhLCAweDAxLCAweDk4LCAweDQwLCAweDA4LCAweDAxLCAweGQyLCAweDE4LCAweDFjLCAKKzB4NDYsIDB4ZTAsIDB4NTQsIDB4MTgsIDB4ZTAsIDB4NjgsIDB4YzIsIDB4MTksIDB4MjEsIDB4NjksIDB4OGEsIDB4NDIsIAorMHgwMCwgMHhkOSwgMHgwZiwgMHgxYSwgMHgwMCwgMHgyZiwgMHgzYywgMHhkOSwgMHhhMCwgMHg2OCwgMHhlMSwgMHg2OCwgCisweDQwLCAweDE4LCAweGZmLCAweDIxLCAweDA5LCAweDMxLCAweGZmLCAweGY3LCAweDBkLCAweGZlLCAweDYxLCAweDY4LCAKKzB4NDYsIDB4MTgsIDB4YTAsIDB4NjgsIDB4ZTEsIDB4NjgsIDB4NDAsIDB4MTgsIDB4ZmYsIDB4MjEsIDB4MDksIDB4MzEsIAorMHhmZiwgMHhmNywgMHgwZCwgMHhmZSwgMHhjMiwgMHgxOSwgMHhmZiwgMHgyMSwgMHgwOSwgMHgzMSwgMHg4YSwgMHg0MiwgCisweDE0LCAweGQ5LCAweDAxLCAweDlhLCAweGMwLCAweDQ2LCAweDAwLCAweDkyLCAweDBiLCAweDFhLCAweDAzLCAweDkzLCAKKzB4MDEsIDB4MWMsIDB4MzAsIDB4MWMsIDB4MmEsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4ZTEsIDB4ZjgsIDB4ZTAsIDB4NjgsIAorMHgwMywgMHg5YiwgMHhjMCwgMHgxOCwgMHhlMCwgMHg2MCwgMHgwMywgMHg5YiwgMHg1ZCwgMHgxOSwgMHhmZiwgMHgxYSwgCisweDAyLCAweDk4LCAweDE4LCAweDE4LCAweDAyLCAweDkwLCAweDEwLCAweGUwLCAweDAxLCAweDlhLCAweGMwLCAweDQ2LCAKKzB4MDAsIDB4OTIsIDB4MDEsIDB4MWMsIDB4MzAsIDB4MWMsIDB4MmEsIDB4MWMsIDB4M2IsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHhjZCwgMHhmOCwgMHhlMCwgMHg2OCwgMHhjMCwgMHgxOSwgMHhlZCwgMHgxOSwgMHhlMCwgMHg2MCwgMHgwMiwgMHg5OCwgCisweGMwLCAweDE5LCAweDAyLCAweDkwLCAweDAwLCAweDI3LCAweDAwLCAweDJmLCAweGMyLCAweGQ4LCAweDAyLCAweDk4LCAKKzB4MDQsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NDAsIDB4YWIsIDB4MjAsIDB4NDAsIAorMHhmMCwgMHhiNSwgMHg4MywgMHhiMCwgMHgxNywgMHgxYywgMHgwZCwgMHgxYywgMHgwMCwgMHgyMSwgMHgwMSwgMHg5MSwgCisweDQyLCAweDAwLCAweDEyLCAweDE4LCAweGQyLCAweDAwLCAweDAyLCAweDkyLCAweDMwLCAweDQ5LCAweDhhLCAweDU4LCAKKzB4MTIsIDB4MDYsIDB4MTIsIDB4MGUsIDB4MDAsIDB4MjQsIDB4ZTQsIDB4NDMsIDB4MDQsIDB4MjgsIDB4MDEsIDB4ZGEsIAorMHg1MCwgMHgwOSwgMHgwMSwgMHhkMiwgMHgyMCwgMHgxYywgMHg1MSwgMHhlMCwgMHgwMiwgMHg5YSwgMHg1NCwgMHgxOCwgCisweGUwLCAweDY4LCAweGMyLCAweDE5LCAweDYwLCAweDY5LCAweDgyLCAweDQyLCAweDAxLCAweGQ5LCAweDIyLCAweDY5LCAKKzB4ODcsIDB4MWEsIDB4MDAsIDB4MmYsIDB4NDUsIDB4ZDksIDB4MjUsIDB4NGUsIDB4YTAsIDB4NjgsIDB4ZTEsIDB4NjgsIAorMHg0MCwgMHgxOCwgMHhmZiwgMHgyMSwgMHgwOSwgMHgzMSwgMHhmZiwgMHhmNywgMHhhNywgMHhmZCwgMHg2MSwgMHg2OCwgCisweDQwLCAweDE4LCAweDAwLCAweDkwLCAweGEwLCAweDY4LCAweGUxLCAweDY4LCAweDQwLCAweDE4LCAweGZmLCAweDIxLCAKKzB4MDksIDB4MzEsIDB4ZmYsIDB4ZjcsIDB4YTYsIDB4ZmQsIDB4MDIsIDB4OWEsIDB4YjEsIDB4NTgsIDB4MDEsIDB4MjMsIAorMHg1YiwgMHgwNCwgMHgxOSwgMHg0MywgMHhiMSwgMHg1MCwgMHhjMSwgMHgxOSwgMHhmZiwgMHgyMiwgMHgwOSwgMHgzMiwgCisweDkxLCAweDQyLCAweDEzLCAweGQ5LCAweDEzLCAweDFhLCAweDAxLCAweDFjLCAweDAwLCAweDk4LCAweDJhLCAweDFjLCAKKzB4MWUsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4ZGYsIDB4ZjgsIDB4ZTAsIDB4NjgsIDB4ODAsIDB4MTksIDB4NzUsIDB4MTksIAorMHhlMCwgMHg2MCwgMHgyMSwgMHg2OSwgMHg4OCwgMHg0MiwgMHgwMCwgMHhkOSwgMHgyMCwgMHg2MSwgMHhiZiwgMHgxYiwgCisweDAxLCAweDk4LCAweDMwLCAweDE4LCAweDAxLCAweDkwLCAweDEyLCAweGUwLCAweDAxLCAweDFjLCAweDAwLCAweDllLCAKKzB4MzAsIDB4MWMsIDB4MmEsIDB4MWMsIDB4M2IsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4Y2IsIDB4ZjgsIDB4ZTAsIDB4NjgsIAorMHhjMCwgMHgxOSwgMHhlZCwgMHgxOSwgMHhlMCwgMHg2MCwgMHgyMSwgMHg2OSwgMHg4OCwgMHg0MiwgMHgwMCwgMHhkOSwgCisweDIwLCAweDYxLCAweDAxLCAweDk4LCAweGMwLCAweDE5LCAweDAxLCAweDkwLCAweDAwLCAweDI3LCAweDAwLCAweDJmLCAKKzB4YjksIDB4ZDgsIDB4MDEsIDB4OTgsIDB4MDMsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHg0MCwgMHhhYiwgMHgyMCwgMHg0MCwgMHhiMCwgMHhiNSwgMHhjMywgMHhiMCwgCisweDBjLCAweDFjLCAweDAwLCAweDI3LCAweGZhLCAweDQzLCAweDA0LCAweDI4LCAweDA2LCAweGRhLCAweDQxLCAweDAwLCAKKzB4MDksIDB4MTgsIDB4YzksIDB4MDAsIDB4MTQsIDB4NDgsIDB4NDUsIDB4NTgsIDB4NmIsIDB4MGMsIDB4MDQsIDB4ZDIsIAorMHgxMCwgMHgxYywgMHg0MywgMHhiMCwgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2MiwgMHgwOSwgCisweDFiLCAweGQzLCAweDAwLCAweDIyLCAweDAwLCAweDkyLCAweDA4LCAweDE4LCAweDQwLCAweDY4LCAweDBjLCAweDIzLCAKKzB4MDAsIDB4MjEsIDB4MDEsIDB4YWEsIDB4MDAsIDB4ZjAsIDB4MzAsIDB4ZjgsIDB4MTEsIDB4MmMsIDB4MGQsIDB4ZDAsIAorMHgxMiwgMHgyYywgMHgwZCwgMHhkMCwgMHgxMywgMHgyYywgMHgwNSwgMHhkMCwgMHgxNCwgMHgyYywgMHgwYSwgMHhkMSwgCisweDAzLCAweDk4LCAweDAwLCAweDA0LCAweDA3LCAweDBlLCAweDA2LCAweGUwLCAweDAzLCAweDk4LCAweDA3LCAweDA2LCAKKzB4M2YsIDB4MGUsIDB4MDIsIDB4ZTAsIDB4MDEsIDB4OWYsIDB4MDAsIDB4ZTAsIDB4MDIsIDB4OWYsIDB4MzgsIDB4MWMsIAorMHhkYiwgMHhlNywgMHgwMCwgMHgwMCwgMHg0MCwgMHhhYiwgMHgyMCwgMHg0MCwgMHgwMywgMHg0OSwgMHgwMCwgMHgyMCwgCisweDAwLCAweDIyLCAweDBhLCAweDU0LCAweDAxLCAweDMwLCAweDYwLCAweDI4LCAweGZiLCAweGQzLCAweDcwLCAweDQ3LCAKKzB4NDAsIDB4YWIsIDB4MjAsIDB4NDAsIDB4MDAsIDB4YjUsIDB4MDIsIDB4ZjAsIDB4NmYsIDB4ZmEsIDB4NTcsIDB4MjAsIAorMHgwMiwgMHhmMCwgMHhjYywgMHhmOSwgMHgwMiwgMHhmMCwgMHg0MCwgMHhmOSwgMHgwMCwgMHgwYSwgMHhmYiwgMHhkMywgCisweDAyLCAweGYwLCAweDRlLCAweGZhLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGYwLCAweGI1LCAweDgyLCAweGIwLCAKKzB4MDcsIDB4OWQsIDB4MTQsIDB4MWMsIDB4MWYsIDB4MWMsIDB4MzAsIDB4NGEsIDB4ZDIsIDB4NmYsIDB4MjAsIDB4MjMsIAorMHgxNiwgMHg2OCwgMHg5ZSwgMHg0MywgMHgxNiwgMHg2MCwgMHgzMywgMHgxYywgMHhmZiwgMHgyMiwgMHgwMSwgMHgzMiwgCisweDJhLCAweDQwLCAweDQwLCAweDAyLCAweDA4LCAweDQzLCAweDA1LCAweDBhLCAweDA2LCAweDFjLCAweDAwLCAweDBjLCAKKzB4MDEsIDB4OTAsIDB4MDAsIDB4MmEsIDB4MjAsIDB4ZDAsIDB4MDIsIDB4ZjAsIDB4NGIsIDB4ZmEsIDB4NTMsIDB4MjAsIAorMHgwMiwgMHhmMCwgMHhhOCwgMHhmOSwgMHgwMSwgMHg5OCwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MCwgMHgwMiwgMHhmMCwgCisweGEzLCAweGY5LCAweDI4LCAweDFjLCAweDAyLCAweGYwLCAweGEwLCAweGY5LCAweDMwLCAweDFjLCAweDAyLCAweGYwLCAKKzB4OWQsIDB4ZjksIDB4MDIsIDB4ZjAsIDB4MjMsIDB4ZmEsIDB4ZmYsIDB4ZjcsIDB4YzcsIDB4ZmYsIDB4MDIsIDB4ZjAsIAorMHgzNywgMHhmYSwgMHg1NCwgMHgyMCwgMHgwMiwgMHhmMCwgMHg5NCwgMHhmOSwgMHgwMCwgMHg5OCwgMHgwMiwgMHhmMCwgCisweDkxLCAweGY5LCAweDI4LCAweDFjLCAweDAyLCAweGYwLCAweDhlLCAweGY5LCAweDMwLCAweDFjLCAweDE0LCAweGUwLCAKKzB4MDIsIDB4ZjAsIDB4MmEsIDB4ZmEsIDB4NTIsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4ODcsIDB4ZjksIDB4MDEsIDB4OTgsIAorMHgwMiwgMHhmMCwgMHg4NCwgMHhmOSwgMHgyOCwgMHgxYywgMHgwMiwgMHhmMCwgMHg4MSwgMHhmOSwgMHgzMCwgMHgxYywgCisweDAyLCAweGYwLCAweDdlLCAweGY5LCAweDAwLCAweDIwLCAweDAyLCAweGYwLCAweDdiLCAweGY5LCAweDAwLCAweDIwLCAKKzB4MDIsIDB4ZjAsIDB4NzgsIDB4ZjksIDB4MDAsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4NzUsIDB4ZjksIDB4MDAsIDB4MjAsIAorMHgwMiwgMHhmMCwgMHg3MiwgMHhmOSwgMHgwMCwgMHgyZiwgMHgwNSwgMHhkOSwgMHgwMiwgMHhmMCwgMHhlNCwgMHhmOCwgCisweDIwLCAweDcwLCAweDAxLCAweDM0LCAweDAxLCAweDNmLCAweGY5LCAweGQxLCAweDAyLCAweGYwLCAweGYwLCAweGY5LCAKKzB4MDQsIDB4NGEsIDB4ZDAsIDB4NmYsIDB4MjAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIAorMHgwMiwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweGYwLCAweGI1LCAweDgyLCAweGIwLCAweDE0LCAweDFjLCAweDFmLCAweDFjLCAweDQyLCAweDAyLCAweDBhLCAweDQzLCAKKzB4MTUsIDB4MWMsIDB4MDEsIDB4MjgsIDB4NTQsIDB4ZDAsIDB4MmMsIDB4NDksIDB4YzgsIDB4NmYsIDB4MjAsIDB4MjMsIAorMHgwMiwgMHg2OCwgMHg5YSwgMHg0MywgMHgwMiwgMHg2MCwgMHhjOCwgMHg2ZiwgMHg0MCwgMHgyMywgMHgwMSwgMHg2OCwgCisweDE5LCAweDQzLCAweDAxLCAweDYwLCAweDAyLCAweGYwLCAweGU2LCAweGY5LCAweDUzLCAweDIwLCAweDAyLCAweGYwLCAKKzB4NDMsIDB4ZjksIDB4MjgsIDB4MGMsIDB4MDYsIDB4MWMsIDB4MDIsIDB4ZjAsIDB4M2YsIDB4ZjksIDB4MjgsIDB4MGEsIAorMHgwMSwgMHg5MCwgMHgwMCwgMHg5MCwgMHgwMiwgMHhmMCwgMHgzYSwgMHhmOSwgMHgyOCwgMHgxYywgMHgwMiwgMHhmMCwgCisweDM3LCAweGY5LCAweDAyLCAweGYwLCAweGJkLCAweGY5LCAweGZmLCAweGY3LCAweDYxLCAweGZmLCAweDAyLCAweGYwLCAKKzB4ZDEsIDB4ZjksIDB4ODQsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4MmUsIDB4ZjksIDB4MzAsIDB4MWMsIDB4MDIsIDB4ZjAsIAorMHgyYiwgMHhmOSwgMHgwMCwgMHg5OCwgMHgwMiwgMHhmMCwgMHgyOCwgMHhmOSwgMHgyOCwgMHgxYywgMHgwMiwgMHhmMCwgCisweDI1LCAweGY5LCAweDAwLCAweDJmLCAweDA1LCAweGQ5LCAweDIwLCAweDc4LCAweDAxLCAweDM0LCAweDAyLCAweGYwLCAKKzB4MWYsIDB4ZjksIDB4MDEsIDB4M2YsIDB4ZjksIDB4ZDEsIDB4MDIsIDB4ZjAsIDB4YTMsIDB4ZjksIDB4MDIsIDB4ZjAsIAorMHhiOSwgMHhmOSwgMHg4MywgMHgyMCwgMHgwMiwgMHhmMCwgMHgxNiwgMHhmOSwgMHgzMCwgMHgxYywgMHgwMiwgMHhmMCwgCisweDEzLCAweGY5LCAweDAxLCAweDk4LCAweDAyLCAweGYwLCAweDEwLCAweGY5LCAKKzB4MjgsIDB4MWMsIDB4MDIsIDB4ZjAsIDB4MGQsIDB4ZjksIDB4MDIsIDB4ZjAsIDB4OTMsIDB4ZjksIDB4ZmYsIDB4ZjcsIAorMHgzNywgMHhmZiwgMHgwNywgMHg0OSwgMHhjOCwgMHg2ZiwgMHg0MCwgMHgyMywgMHgwMiwgMHg2OCwgMHg5YSwgMHg0MywgCisweDAyLCAweDYwLCAweGM4LCAweDZmLCAweDIwLCAweDIzLCAweDAxLCAweDY4LCAweDE5LCAweDQzLCAweDAxLCAweDYwLCAKKzB4MDIsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg4MCwgMHhiNSwgMHgwMSwgMHhmMCwgMHg4ZiwgMHhmOCwgMHgwNiwgMHg0ZiwgCisweGMwLCAweDQ2LCAweGY4LCAweDYwLCAweDAxLCAweGYwLCAweGYyLCAweGY4LCAweDc4LCAweDgwLCAweDAxLCAweGYwLCAKKzB4YjEsIDB4ZjgsIDB4MzgsIDB4NzEsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHgwMSwgMHhmMCwgMHgwNSwgMHhmOSwgMHgwMiwgMHg0OSwgCisweGMwLCAweDQ2LCAweDA4LCAweDgwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4MGIsIDB4NDgsIDB4YzEsIDB4NjgsIDB4MDEsIDB4MjksIDB4MTEsIDB4ZDEsIDB4YzEsIDB4NmYsIDB4MDIsIDB4MjMsIAorMHgwYSwgMHg2OCwgMHgxYSwgMHg0MywgMHgwYSwgMHg2MCwgMHhjMSwgMHg2ZiwgMHg4MCwgMHgyMywgMHgwYSwgMHg2OCwgCisweDFhLCAweDQzLCAweDBhLCAweDYwLCAweGMxLCAweDE4LCAweDA4LCAweDY4LCAweDgyLCAweDIzLCAweDAyLCAweDY4LCAKKzB4MWEsIDB4NDMsIDB4MDIsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDgsIDB4ODEsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhmMCwgMHhiNCwgMHg0YSwgMHg0OSwgMHhjYSwgMHgxZCwgMHg5ZCwgMHgzMiwgCisweDAwLCAweDIwLCAweDAwLCAweDI3LCAweDgzLCAweDAwLCAweGQ3LCAweDUwLCAweDAxLCAweDMwLCAweDE3LCAweDI4LCAKKzB4ZmEsIDB4ZDMsIDB4NDYsIDB4NGMsIDB4MDAsIDB4MjAsIDB4ODIsIDB4MDAsIDB4YTcsIDB4NTAsIDB4MDEsIDB4MzAsIAorMHgyMCwgMHgyOCwgMHhmYSwgMHhkMywgMHg0MywgMHg0YSwgMHgwMCwgMHgyMCwgMHg4MywgMHgwMCwgMHhkNywgMHg1MCwgCisweDAxLCAweDMwLCAweDIwLCAweDI4LCAweGZhLCAweGQzLCAweGE3LCAweDYxLCAweDk3LCAweDYxLCAweDRmLCAweDY1LCAKKzB4OGYsIDB4NjUsIDB4M2YsIDB4NGQsIDB4YzAsIDB4NDYsIDB4MmYsIDB4NjAsIDB4NmYsIDB4NjAsIDB4YWYsIDB4NjAsIAorMHhhZiwgMHg2MSwgMHhlZiwgMHg2MCwgMHgyZiwgMHg2MSwgMHg2ZiwgMHg2MSwgMHgwMCwgMHgyMCwgMHhjMSwgMHgwMCwgCisweDA5LCAweDE4LCAweDQ5LCAweDAxLCAweDM1LCAweDRiLCAweGM5LCAweDE4LCAweDg2LCAweDAwLCAweGNiLCAweDFkLCAKKzB4ZjksIDB4MzMsIDB4MzQsIDB4NGMsIDB4MzQsIDB4MTksIDB4ZTMsIDB4NjMsIDB4MTEsIDB4MjMsIDB4NWIsIDB4MDEsIAorMHhjYiwgMHgxOCwgMHg2MywgMHg2MywgMHgwZCwgMHgyMywgMHg5YiwgMHgwMSwgMHhjYiwgMHgxOCwgMHhiNCwgMHgxOCwgCisweGUzLCAweDYzLCAweDIzLCAweDIzLCAweDViLCAweDAxLCAweGM5LCAweDE4LCAweDYxLCAweDYzLCAweDAxLCAweDMwLCAKKzB4MDIsIDB4MjgsIDB4ZTQsIDB4ZGIsIDB4MjksIDB4NDgsIDB4YzEsIDB4MWQsIDB4ZjksIDB4MzEsIDB4MjksIDB4NGMsIAorMHhjMCwgMHg0NiwgMHhhMSwgMHg2MiwgMHg2MSwgMHg2YiwgMHgwZCwgMHgyMywgMHg5YiwgMHgwMSwgMHhlMSwgMHg2MiwgCisweGMxLCAweDE4LCAweDkxLCAweDYyLCAweDUxLCAweDZiLCAweGMwLCAweDQ2LCAweGQxLCAweDYyLCAweDA4LCAweDIxLCAKKzB4ZTEsIDB4NjQsIDB4MjUsIDB4NDksIDB4YzAsIDB4NDYsIDB4MjEsIDB4NjUsIDB4MjQsIDB4NDksIDB4MGIsIDB4NjksIAorMHhjMCwgMHg0NiwgMHg2MywgMHg2NSwgMHhjMywgMHgxZCwgMHg0ZCwgMHgzMywgMHhlMywgMHg2NSwgMHgyNSwgMHg2NiwgCisweDhiLCAweDY4LCAweGMwLCAweDQ2LCAweDYzLCAweDY2LCAweGNiLCAweDY4LCAweGMwLCAweDQ2LCAweGEzLCAweDY2LCAKKzB4MWUsIDB4NGIsIDB4YzAsIDB4NDYsIDB4ZTMsIDB4NjYsIDB4MjcsIDB4NjcsIDB4MGIsIDB4MjMsIDB4ZGIsIDB4MDEsIAorMHhjMywgMHgxOCwgMHhhMywgMHg2NywgMHg2NywgMHg2NywgMHgwMSwgMHgyNiwgMHhlMywgMHgxZCwgMHg2OSwgMHgzMywgCisweDY2LCAweDYxLCAweGU3LCAweDYxLCAweDFmLCAweDczLCAweDAyLCAweDIzLCAweGQzLCAweDY0LCAweDE3LCAweDRiLCAKKzB4YzAsIDB4NDYsIDB4MTMsIDB4NjUsIDB4Y2IsIDB4NjksIDB4YzAsIDB4NDYsIDB4NTMsIDB4NjUsIDB4YzMsIDB4MWQsIAorMHg1MSwgMHgzMywgMHhkMywgMHg2NSwgMHgyYiwgMHgxZCwgMHgxMywgMHg2NiwgMHg0YiwgMHg2OSwgMHhjMCwgMHg0NiwgCisweDUzLCAweDY2LCAweDg5LCAweDY5LCAweGMwLCAweDQ2LCAweDkxLCAweDY2LCAweDBmLCAweDQ5LCAweGMwLCAweDQ2LCAKKzB4ZDEsIDB4NjYsIDB4MTYsIDB4NjcsIDB4MGYsIDB4MjMsIDB4ZGIsIDB4MDEsIDB4YzAsIDB4MTgsIDB4OTAsIDB4NjcsIAorMHg1NiwgMHg2NywgMHhkNywgMHg2MSwgMHhkMCwgMHgxZCwgMHg2OSwgMHgzMCwgMHg1NiwgMHg2MSwgMHgwNywgMHg3MywgCisweGYwLCAweGJjLCAweDcwLCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGU0LCAweDJjLCAweDAwLCAweDgwLCAKKzB4NjQsIDB4MmQsIDB4MDAsIDB4ODAsIDB4OTAsIDB4ZWUsIDB4MjAsIDB4NDAsIDB4MzAsIDB4MDEsIDB4MTgsIDB4MDAsIAorMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgMHgwMCwgMHg1NSwgMHhmZiwgMHhmZiwgMHgzOCwgMHgwMSwgMHgxOCwgMHgwMCwgCisweDEwLCAweDU1LCAweGZmLCAweGZmLCAweDkwLCAweGI0LCAweDAwLCAweDIxLCAweDFlLCAweDRhLCAweGJiLCAweDIzLCAKKzB4MWIsIDB4MDEsIDB4ZDcsIDB4MTgsIDB4ZjksIDB4NzMsIDB4MTksIDB4MjMsIAorMHhkYiwgMHgwMSwgMHhkMCwgMHgxOCwgMHgwMSwgMHgyNCwgMHhjZCwgMHgyMywgMHgxYiwgMHgwMSwgMHhkMywgMHgxOCwgCisweGMxLCAweDYxLCAweDFjLCAweDcwLCAweDMzLCAweDIzLCAweDliLCAweDAxLCAweGQzLCAweDE4LCAweDk5LCAweDYwLCAKKzB4YjksIDB4NzMsIDB4NTksIDB4NjEsIDB4MmYsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZDMsIDB4MTgsIDB4MTksIDB4NjAsIAorMHgxMywgMHg0YiwgMHg1MSwgMHgyNywgMHhiZiwgMHgwMywgMHgwMywgMHg2MywgMHgzYiwgMHg2MCwgMHg4NCwgMHg2OSwgCisweGU0LCAweDE4LCAweDQ0LCAweDYzLCAweDA0LCAweDNjLCAweDdjLCAweDYwLCAweDAxLCAweDI0LCAweGU0LCAweDAyLCAKKzB4ODQsIDB4NjMsIDB4MGUsIDB4NGMsIDB4YzAsIDB4NDYsIDB4YmMsIDB4NjAsIDB4MDQsIDB4NmIsIDB4YzAsIDB4NDYsIAorMHg0NCwgMHg2MiwgMHg4NCwgMHg2OSwgMHhlNCwgMHgxOCwgMHgwYiwgMHg0YiwgMHhlMywgMHgxOCwgMHhmYiwgMHg2MCwgCisweDAzLCAweDZiLCAweGMwLCAweDQ2LCAweDgzLCAweDYyLCAweDQzLCAweDZhLCAweGMwLCAweDQ2LCAweDAzLCAweDYyLCAKKzB4YzEsIDB4NjMsIDB4NTEsIDB4NjQsIDB4OTEsIDB4NjQsIDB4ZDEsIDB4NjUsIDB4ZDEsIDB4NjYsIDB4OTAsIDB4YmMsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgyMCwgMHg0MCwgCisweGZjLCAweDA3LCAweDAwLCAweDAwLCAweGZjLCAweGY3LCAweGZmLCAweGZmLCAweDkwLCAweGI0LCAweDAwLCAweDIyLCAKKzB4MWIsIDB4NDksIDB4YzksIDB4MjMsIDB4MWIsIDB4MDEsIDB4YzgsIDB4MTgsIDB4MDIsIDB4NzEsIDB4MDEsIDB4MjAsIAorMHhiYiwgMHgyMywgMHgxYiwgMHgwMSwgMHhjYiwgMHgxOCwgMHg1OCwgMHg3MywgMHgxNywgMHg0OCwgMHgwMywgMHgxYywgCisweDAwLCAweDI3LCAweGRjLCAweDFkLCAweGMxLCAweDM0LCAweDFjLCAweDY1LCAweDIzLCAweDFjLCAweDAxLCAweDM3LCAKKzB4M2YsIDB4MmYsIDB4ZjgsIDB4ZDMsIDB4MWEsIDB4NjUsIDB4MTksIDB4MjMsIDB4ZGIsIDB4MDEsIDB4Y2YsIDB4MTgsIAorMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhjYiwgMHgxOCwgMHgzYSwgMHg2MSwgMHg5OCwgMHg2MSwgMHg0MCwgMHgyMCwgCisweGY4LCAweDYwLCAweGRhLCAweDYxLCAweDFhLCAweDYyLCAweGNhLCAweDY0LCAweDBhLCAweDY2LCAweDBjLCAweDQ4LCAKKzB4YzAsIDB4NDYsIDB4YzIsIDB4NjAsIDB4MGIsIDB4NDgsIDB4MDAsIDB4NmIsIDB4YzAsIDB4MDYsIDB4YzAsIDB4MGUsIAorMHhmOCwgMHg2MywgMHgwYSwgMHg0OCwgMHgwMSwgMHg2OCwgMHhjMCwgMHg0NiwgMHgxOSwgMHg4MCwgMHg0MSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDU5LCAweDgwLCAweDgwLCAweDY4LCAweGMwLCAweDQ2LCAweDk4LCAweDgwLCAweDkwLCAweGJjLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4OTAsIDB4YmMsIDB4MjAsIDB4NDAsIAorMHg5MCwgMHhlZSwgMHgyMCwgMHg0MCwgMHg4MCwgMHgwMCwgMHgxNCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgxNCwgMHg0MCwgCisweDAwLCAweDIwLCAweDBhLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDczLCAweGNiLCAweDFkLCAweGZmLCAweDMzLCAKKzB4M2EsIDB4MzMsIDB4ODgsIDB4NjEsIDB4YzgsIDB4NjEsIDB4MTgsIDB4NzAsIDB4MDYsIDB4NGEsIDB4YzAsIDB4NDYsIAorMHgxMCwgMHg2NSwgMHg1MCwgMHg2NiwgMHg5MCwgMHg2NiwgMHgwOCwgMHg3MCwgMHg1OCwgMHg3MCwgMHhiYiwgMHgyMywgCisweDFiLCAweDAxLCAweGQxLCAweDE4LCAweDA4LCAweDczLCAweDcwLCAweDQ3LCAweDI4LCAweDA1LCAweDAwLCAweDgwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjQsIDB4MmYsIDB4NDksIDB4MmYsIDB4NGEsIDB4YzAsIDB4NDYsIAorMHgxMSwgMHg2MSwgMHgwMSwgMHgyMywgMHg5YiwgMHgwMiwgMHhjOCwgMHgxOCwgMHg1MCwgMHg2MSwgMHgyZCwgMHg0OCwgCisweGMwLCAweDQ2LCAweDEwLCAweDYyLCAweGRiLCAweDAwLCAweGMzLCAweDE4LCAweDUzLCAweDYyLCAweDAwLCAweDIzLCAKKzB4MTMsIDB4NjMsIDB4NTMsIDB4NjMsIDB4MjksIDB4NGEsIDB4MmEsIDB4NGYsIDB4ZDQsIDB4MWQsIDB4ZmYsIDB4MzQsIAorMHhmYSwgMHgzNCwgMHgxNCwgMHhjNywgMHgwOCwgMHgzZiwgMHgzYiwgMHg2MSwgMHgxYywgMHgxZiwgMHg3YywgMHg2MSwgCisweDI2LCAweDRmLCAweGMwLCAweDQ2LCAweDM5LCAweDYwLCAweGI4LCAweDYxLCAweDc5LCAweDYxLCAweGY4LCAweDYyLCAKKzB4M2IsIDB4NjMsIDB4N2IsIDB4NjQsIDB4YmEsIDB4NjQsIDB4ZmEsIDB4NjUsIDB4MjIsIDB4NGYsIDB4ZmUsIDB4MWQsIAorMHhmOSwgMHgzNiwgMHgyMiwgMHg0ZCwgMHhlYywgMHgxZCwgMHg3OSwgMHgzNCwgMHgyNiwgMHg2MiwgMHg1MSwgMHgyNiwgCisweGI2LCAweDAzLCAweDM3LCAweDYxLCAweDI0LCAweDZhLCAweGMwLCAweDQ2LCAweDc0LCAweDYxLCAweDJmLCAweDY3LCAKKzB4MWQsIDB4NGQsIDB4MDksIDB4MjcsIDB4N2YsIDB4MDQsIDB4ZWMsIDB4MWQsIDB4NzUsIDB4MzQsIDB4N2MsIDB4NjAsIAorMHgzZCwgMHg2MCwgMHgxYiwgMHg0YywgMHhjMCwgMHg0NiwgMHgzYywgMHg2MSwgMHhlNiwgMHgxZCwgMHg3NSwgMHgzNiwgCisweDdlLCAweDYxLCAweDE5LCAweDRmLCAweGMwLCAweDQ2LCAweDdjLCAweDYwLCAweDNkLCAweDYwLCAweDBmLCAweDFjLCAKKzB4MDAsIDB4MjEsIDB4ZmYsIDB4MjQsIDB4MDEsIDB4MzQsIDB4MWQsIDB4MWMsIDB4OGIsIDB4MDAsIDB4ZmQsIDB4NTAsIAorMHgwMSwgMHgzMSwgMHhhMSwgMHg0MiwgMHhmYSwgMHhkMywgMHgwMSwgMHgxYywgMHgwMCwgMHgyMCwgMHgwMSwgMHgyNywgCisweGZmLCAweDAyLCAweDgzLCAweDAwLCAweGNkLCAweDUwLCAweDAxLCAweDMwLCAweGI4LCAweDQyLCAweGZhLCAweGQzLCAKKzB4MDAsIDB4MjAsIDB4ODEsIDB4MDAsIDB4NTUsIDB4NTAsIDB4MDEsIDB4MzAsIDB4ODAsIDB4MjgsIDB4ZmEsIDB4ZDMsIAorMHhmMCwgMHhiYywgMHg3MCwgMHg0NywgMHgyNCwgMHhhMywgMHgyMCwgMHg0MCwgCisweDQwLCAweDAxLCAweDE4LCAweDAwLCAweDI0LCAweDgzLCAweDIwLCAweDQwLCAweDI0LCAweGE5LCAweDIwLCAweDQwLCAKKzB4ODAsIDB4MDEsIDB4MTgsIDB4MDAsIDB4YTgsIDB4MDMsIDB4MDAsIDB4ODAsIDB4MjQsIDB4YTcsIDB4MjAsIDB4NDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgyNCwgMHhhOCwgMHgyMCwgMHg0MCwgMHhhNCwgMHhhOCwgMHgyMCwgMHg0MCwgCisweDA4LCAweDA0LCAweDAwLCAweDgwLCAweGI4LCAweGI1LCAweDJjLCAweDQ4LCAweGZkLCAweGY3LCAweGJhLCAweGZkLCAKKzB4MDEsIDB4MjAsIDB4MmIsIDB4NDksIDB4MGEsIDB4NjgsIDB4NTIsIDB4MGMsIDB4MDYsIDB4ZDIsIDB4MGEsIDB4NjgsIAorMHgxMiwgMHgwYywgMHgwMiwgMHhkMSwgMHgwYSwgMHg2OCwgMHg5MiwgMHgwYSwgMHgwMCwgMHhkMiwgMHgwMCwgMHgyMCwgCisweDA0LCAweDA2LCAweDI0LCAweDBlLCAweDI1LCAweDRhLCAweGQ3LCAweDFkLCAweDBkLCAweDM3LCAweDAwLCAweDIzLCAKKzB4MDAsIDB4MjAsIDB4OWQsIDB4MDAsIDB4NzgsIDB4NTEsIDB4MDEsIDB4MzMsIDB4MDQsIDB4MmIsIDB4ZmEsIDB4ZDMsIAorMHgwMSwgMHgyNywgMHgzZiwgMHgwNSwgMHg1MCwgMHg2MSwgMHhmOCwgMHg2MCwgMHhkMCwgMHg2MSwgMHhmOCwgMHg2MSwgCisweDAwLCAweDIzLCAweGRiLCAweDQzLCAweDkzLCAweDYxLCAweDNiLCAweDYxLCAweDEzLCAweDYyLCAweDNiLCAweDYyLCAKKzB4MDAsIDB4MjcsIDB4MWIsIDB4NGIsIDB4OGQsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTUsIDB4OGQsIDB4NjksIAorMHhjMCwgMHg0NiwgMHgwMCwgMHg5NSwgMHgwMCwgMHgyYywgMHgwYiwgMHhkMCwgMHhkZCwgMHg2YiwgMHhjMCwgMHg0NiwgCisweDAwLCAweDk1LCAweDlkLCAweDZiLCAweGMwLCAweDQ2LCAweDAwLCAweDk1LCAweDVkLCAweDZiLCAweGMwLCAweDQ2LCAKKzB4MDAsIDB4OTUsIDB4MWQsIDB4NmIsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTUsIDB4MDEsIDB4MzcsIDB4NDAsIDB4MmYsIAorMHhlOCwgMHhkMywgMHgwMCwgMHgyNywgMHg2YywgMHg0NiwgMHgwMSwgMHgyMywgMHg1YiwgMHgwNywgMHgxYywgMHg0MywgCisweDAxLCAweGUwLCAweDIwLCAweDYwLCAweDAxLCAweDM3LCAweDBkLCAweDY4LCAweDJiLCAweDA5LCAweDAyLCAweGQyLCAKKzB4ODAsIDB4MmYsIDB4ZjgsIDB4ZDMsIDB4MDEsIDB4ZTAsIDB4ODAsIDB4MmYsIDB4MDMsIDB4ZDMsIDB4MDgsIDB4NDksIAorMHg0YiwgMHg2ZSwgMHgwMSwgMHgzMywgMHg0YiwgMHg2NiwgMHhkMCwgMHg2MiwgMHhiOCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweGY0LCAweDAxLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDEsIDB4MTgsIDB4NDAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIAorMHg5MCwgMHhiNCwgMHgwMCwgMHgyMSwgMHgwZSwgMHg0ZiwgMHgwZiwgMHg0YSwgMHgwMCwgMHgyMCwgMHg0YywgMHgwMSwgCisweDY0LCAweDFhLCAweGE0LCAweDAwLCAweGEzLCAweDE4LCAweDU4LCAweDYwLCAweDk4LCAweDYwLCAweDE4LCAweDY0LCAKKzB4NTgsIDB4NjQsIDB4MTAsIDB4NTMsIDB4NTgsIDB4ODAsIDB4Y2MsIDB4MDAsIDB4ZTQsIDB4MTksIDB4OTgsIDB4NjcsIAorMHhkYywgMHg2MiwgMHgwMSwgMHgzMSwgMHgwMywgMHgyOSwgMHhlZSwgMHhkMywgMHgwNiwgMHg0OSwgMHhjMCwgMHg0NiwgCisweDA4LCAweDYwLCAweDQ4LCAweDYwLCAweDg4LCAweDYwLCAweGM4LCAweDYwLCAweDA4LCAweDYxLCAweDkwLCAweGJjLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YWMsIDB4NjYsIDB4MjEsIDB4NDAsIDB4NWMsIDB4MmIsIDB4MDAsIDB4ODAsIAorMHhkMCwgMHgyYywgMHgwMCwgMHg4MCwgMHg2NCwgMHgyMSwgMHgwNSwgMHg0OCwgMHhjMCwgMHg0NiwgMHgwMSwgMHg2MywgCisweDAwLCAweDIxLCAweGM5LCAweDQzLCAweDQxLCAweDYzLCAweDgxLCAweDYzLCAweDAwLCAweDIxLCAweGMxLCAweDYzLCAKKzB4MDEsIDB4NjQsIDB4NzAsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjQsIDB4MDEsIDB4MjAsIAorMHg0MCwgMHgwMiwgMHgwYSwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHgzYywgMHgyMCwgMHg0OCwgMHg2MCwgCisweDg4LCAweDYwLCAweDA4LCAweDQ4LCAweGMwLCAweDQ2LCAweGM4LCAweDYwLCAweDAwLCAweDIwLCAweDA3LCAweDRhLCAKKzB4ODcsIDB4MDAsIDB4Y2IsIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZGEsIDB4NTEsIDB4MDEsIDB4MzAsIDB4MTAsIDB4MjgsIAorMHhmOCwgMHhkMywgMHg4MCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHhlNCwgMHgyZCwgMHgwMCwgMHg4MCwgCisweGY0LCAweDJkLCAweDAwLCAweDgwLCAweDVkLCAweDRjLCAweGZmLCAweGZmLCAweDEyLCAweDQ5LCAweDEzLCAweDQ4LCAKKzB4NjcsIDB4MjMsIDB4OWIsIDB4MDEsIDB4Y2EsIDB4MTgsIDB4MDYsIDB4YzAsIDB4MDgsIDB4MzgsIDB4MTEsIDB4NGIsIAorMHhjYSwgMHgxOCwgMHhjMSwgMHg2MCwgMHg4MiwgMHg2MCwgMHgwMSwgMHg2MSwgMHgwZiwgMHg0OSwgMHgxMCwgMHg0OCwgCisweGE3LCAweDIzLCAweDliLCAweDAxLCAweGNhLCAweDE4LCAweDA2LCAweGMwLCAweDA4LCAweDM4LCAweDBlLCAweDRiLCAKKzB4Y2EsIDB4MTgsIDB4YzEsIDB4NjAsIDB4ODIsIDB4NjAsIDB4MDEsIDB4NjEsIDB4MGMsIDB4NDgsIDB4MGQsIDB4NDksIAorMHg2NywgMHgyMywgMHg5YiwgMHgwMSwgMHhjMiwgMHgxOCwgMHgwNSwgMHhjMSwgMHgwOCwgMHgzOSwgMHgwNSwgMHg0YiwgCisweGMyLCAweDE4LCAweGM4LCAweDYwLCAweDhhLCAweDYwLCAweDA4LCAweDYxLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAKKzB4YWMsIDB4MWUsIDB4MjEsIDB4NDAsIDB4NDgsIDB4MmUsIDB4MDAsIDB4ODAsIDB4ZmMsIDB4MWYsIDB4MDAsIDB4MDAsIAorMHhhYywgMHhlZSwgMHgyMCwgMHg0MCwgMHgzNCwgMHgyZSwgMHgwMCwgMHg4MCwgMHhmYywgMHgyZiwgMHgwMCwgMHgwMCwgCisweGFjLCAweDNlLCAweDIxLCAweDQwLCAweDVjLCAweDJlLCAweDAwLCAweDgwLCAKKzB4OTAsIDB4YjQsIDB4MDAsIDB4MjEsIDB4NDAsIDB4NGMsIDB4MDAsIDB4MjAsIDB4MGEsIDB4MDEsIDB4MTIsIDB4MTksIAorMHgxOSwgMHgyMywgMHhkYiwgMHgwMSwgMHhkMiwgMHgxOCwgMHhkMCwgMHg2MiwgMHgxMCwgMHg2MywgMHg1MCwgMHg2MywgCisweDkwLCAweDYzLCAweDAxLCAweDMxLCAweDAzLCAweDI5LCAweGYzLCAweGQzLCAweDNhLCAweDQ5LCAweGMwLCAweDQ2LCAKKzB4MDgsIDB4NjMsIDB4NDgsIDB4NjMsIDB4ODgsIDB4NjMsIDB4MjAsIDB4NjAsIDB4MDEsIDB4MjEsIDB4ZTMsIDB4MWQsIAorMHg1OSwgMHgzMywgMHg2MCwgMHg2MCwgMHgxOSwgMHg3MSwgMHgxOCwgMHg3MiwgMHg5OCwgMHg3MSwgMHg5OCwgMHg3MiwgCisweDU5LCAweDcxLCAweDU4LCAweDcyLCAweGQ4LCAweDcxLCAweGQ4LCAweDcyLCAweGUyLCAweDFkLCAweDQ5LCAweDMyLCAKKzB4MTEsIDB4NzMsIDB4MTksIDB4NzAsIDB4OTAsIDB4NzMsIDB4OTgsIDB4NzAsIDB4NTEsIDB4NzMsIDB4NTksIDB4NzAsIAorMHhkMCwgMHg3MywgMHhkOCwgMHg3MCwgMHgxMSwgMHg3MSwgMHgxMSwgMHg3MiwgMHg5MCwgMHg3MSwgMHg5MCwgMHg3MiwgCisweDUwLCAweDcxLCAweDUwLCAweDcyLCAweGQwLCAweDcxLCAweGQwLCAweDcyLCAweDE4LCAweDczLCAweDAyLCAweDIyLCAKKzB4ZTcsIDB4MWQsIDB4NjksIDB4MzcsIDB4M2EsIDB4NzAsIDB4OTksIDB4NzMsIDB4YmEsIDB4NzAsIDB4NTgsIDB4NzMsIAorMHg3OCwgMHg3MCwgMHhkOCwgMHg3MywgMHhmOCwgMHg3MCwgMHgzOSwgMHg3MSwgMHgzYSwgMHg3MiwgMHhiOSwgMHg3MSwgCisweGI5LCAweDcyLCAweDc4LCAweDcxLCAweDdhLCAweDcyLCAweGY5LCAweDcxLCAweGY5LCAweDcyLCAweDM5LCAweDczLCAKKzB4ZTMsIDB4MWQsIDB4NzksIDB4MzMsIDB4MWEsIDB4NzAsIDB4YjksIDB4NzMsIDB4OTksIDB4NzAsIDB4NzgsIDB4NzMsIAorMHg1YSwgMHg3MCwgMHhmOSwgMHg3MywgMHhkOSwgMHg3MCwgMHgxYSwgMHg3MSwgMHgxYSwgMHg3MiwgMHg5OSwgMHg3MSwgCisweDlhLCAweDcyLCAweDU4LCAweDcxLCAweDVhLCAweDcyLCAweGQ5LCAweDcxLCAweGRhLCAweDcyLCAweDE5LCAweDczLCAKKzB4ZTcsIDB4MWQsIDB4ODksIDB4MzcsIDB4M2EsIDB4NzAsIDB4OTksIDB4NzMsIDB4YjksIDB4NzAsIDB4NTgsIDB4NzMsIAorMHg3YSwgMHg3MCwgMHhkOSwgMHg3MywgMHhmOSwgMHg3MCwgMHgzOSwgMHg3MSwgMHgzYSwgMHg3MiwgMHhiOSwgMHg3MSwgCisweGI5LCAweDcyLCAweDc4LCAweDcxLCAweDdhLCAweDcyLCAweGY5LCAweDcxLCAweGY5LCAweDcyLCAweDNhLCAweDczLCAKKzB4ZTMsIDB4MWQsIDB4OTksIDB4MzMsIDB4MWEsIDB4NzAsIDB4YjksIDB4NzMsIDB4OWEsIDB4NzAsIDB4NzgsIDB4NzMsIAorMHg1YSwgMHg3MCwgMHhmOSwgMHg3MywgMHhkYSwgMHg3MCwgMHgxOSwgMHg3MSwgMHgxYSwgMHg3MiwgMHg5OSwgMHg3MSwgCisweDk5LCAweDcyLCAweDU4LCAweDcxLCAweDVhLCAweDcyLCAweGQ5LCAweDcxLCAweGQ5LCAweDcyLCAweDIwLCAweDYxLCAKKzB4ZTAsIDB4NjAsIDB4NjAsIDB4NjEsIDB4YTAsIDB4NjAsIDB4OTAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHhhMCwgMHgxYywgMHgwMCwgMHg4MCwgMHhlOCwgMHgxOSwgMHgwMCwgMHg4MCwgMHg4MSwgMHgyMCwgMHgwMCwgMHgwMiwgCisweDAxLCAweDQ5LCAweGMwLCAweDQ2LCAweDg4LCAweDYyLCAweDcwLCAweDQ3LCAweGMwLCAweDAwLCAweDE0LCAweDAwLCAKKzB4MDksIDB4NDksIDB4MGEsIDB4NGIsIDB4YzgsIDB4MTgsIDB4MDQsIDB4M2IsIDB4YzksIDB4MTgsIDB4MDgsIDB4NjAsIAorMHgwMCwgMHgyMSwgMHhjMiwgMHgxZCwgMHgyOSwgMHgzMiwgMHhjMiwgMHg2MSwgMHgxMCwgMHgxYywgMHgwMSwgMHgzMSwgCisweDA4LCAweDI5LCAweGY4LCAweGQzLCAweGMxLCAweDFmLCAweDI5LCAweDM5LCAweDAwLCAweDIwLCAweGM4LCAweDYxLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ODQsIDB4MDksIDB4MDAsIDB4MDAsIAorMHgwNiwgMHg0OCwgMHgwNywgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg4MCwgMHg0OCwgMHg4MCwgMHgwMCwgMHgyMCwgCisweDg4LCAweDgwLCAweGM4LCAweDgwLCAweDg4LCAweDYwLCAweDA0LCAweDQ5LCAweGMwLCAweDQ2LCAweDQ4LCAweDYxLCAKKzB4ODgsIDB4NjEsIDB4NzAsIDB4NDcsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NGMsIDB4MmEsIDB4MDAsIDB4ODAsIAorMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgMHgwMCwgMHgyMSwgMHgwNiwgMHg0OCwgMHhjMiwgMHgxZCwgMHgxOSwgMHgzMiwgCisweGMxLCAweDYwLCAweDAxLCAweDYxLCAweGMxLCAweDYxLCAweDAxLCAweDYyLCAweDExLCAweDcxLCAweGZmLCAweDMwLCAKKzB4MDEsIDB4MzAsIDB4NDEsIDB4NjIsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIAorMHgwOSwgMHg0OCwgMHgwYSwgMHg0YiwgMHhjMCwgMHg0NiwgMHgxOCwgMHg2MCwgMHgwMCwgMHgyMSwgMHhjMiwgMHgxZCwgCisweDRkLCAweDMyLCAweGMyLCAweDYwLCAweDEwLCAweDFjLCAweDAxLCAweDMxLCAweDE0LCAweDI5LCAweGY4LCAweGQzLCAKKzB4YzEsIDB4MWYsIDB4NGQsIDB4MzksIDB4MDAsIDB4MjAsIDB4YzgsIDB4NjAsIDB4NTgsIDB4NjAsIDB4OTgsIDB4NjAsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHhkOCwgMHgwNywgMHgwMCwgMHg4MCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgCisweDAwLCAweGI1LCAweDBiLCAweDQ5LCAweDBiLCAweDQ4LCAweGZkLCAweGY3LCAweGVhLCAweGZiLCAweDBiLCAweDQ4LCAKKzB4MDAsIDB4NmEsIDB4MDEsIDB4MjMsIDB4ZGIsIDB4MDMsIDB4OTgsIDB4NDMsIDB4MDksIDB4NDksIDB4YzAsIDB4NDYsIAorMHgwOCwgMHg2MiwgMHgwOSwgMHg0OCwgMHhjMSwgMHg2OCwgMHgwMSwgMHgyOSwgMHgwNCwgMHhkMSwgMHhjMCwgMHg2ZiwgCisweDgwLCAweDIzLCAweDAxLCAweDY4LCAweDE5LCAweDQzLCAweDAxLCAweDYwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4YzEsIDB4YmQsIDB4MjEsIDB4NDAsIDB4NzUsIDB4OTgsIDB4MjEsIDB4NDAsIAorMHhjMCwgMHgwMCwgMHgxOCwgMHg0MCwgMHhjMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDAwLCAweGI1LCAweDBmLCAweDQ4LCAweGMxLCAweDY4LCAweDAxLCAweDI5LCAweDA0LCAweGQxLCAweGMwLCAweDZmLCAKKzB4ODAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4OTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4MGIsIDB4NGIsIDB4MGMsIDB4NDgsIAorMHgwYywgMHg0YSwgMHgwMCwgMHgyMSwgMHhmZCwgMHhmNywgMHhiZiwgMHhmYiwgMHgwYiwgMHg0OCwgMHg0MSwgMHg4ZCwgCisweDAxLCAweDMxLCAweDQxLCAweDg1LCAweDAwLCAweDIxLCAweGMxLCAweDg1LCAweDA5LCAweDQ4LCAweDAwLCAweDZhLCAKKzB4MDEsIDB4MjMsIDB4ZGIsIDB4MDMsIDB4MTgsIDB4NDMsIDB4MDgsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjIsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg1OSwgMHhiZCwgMHgyMSwgMHg0MCwgCisweDc1LCAweDk4LCAweDIxLCAweDQwLCAweGI4LCAweDBiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAKKzB4YzAsIDB4MDAsIDB4MTgsIDB4NDAsIDB4YzAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4ZjAsIDB4YjUsIDB4MWIsIDB4NGMsIAorMHgxMCwgMHgyNiwgMHhlMCwgMHg2OCwgMHgwMSwgMHgyOCwgMHgwOCwgMHhkMSwgMHg2MCwgMHg4OCwgMHgwMCwgMHgyOCwgCisweDA1LCAweGQxLCAweDIwLCAweDc5LCAweDAwLCAweDI4LCAweDAyLCAweGQxLCAweDE5LCAweDIwLCAweGEwLCAweDY3LCAKKzB4MDAsIDB4ZTAsIDB4YTYsIDB4NjcsIDB4MDAsIDB4MjAsIDB4MDcsIDB4MjMsIDB4NWIsIDB4MDIsIDB4ZTUsIDB4MTgsIAorMHhjMSwgMHg0MywgMHhlOCwgMHg2MSwgMHg2OSwgMHg2MiwgMHg1OSwgMHgwOCwgMHhhMSwgMHgyNywgMHg3ZiwgMHgwMywgCisweDc5LCAweDYwLCAweDBmLCAweDIxLCAweDc5LCAweDYwLCAweGUxLCAweDFkLCAweGI5LCAweDMxLCAweDA4LCAweDcxLCAKKzB4MDEsIDB4MjAsIDB4YjgsIDB4NjAsIDB4NDAsIDB4MDIsIDB4YjgsIDB4NjAsIDB4MDAsIDB4ZjAsIDB4NGMsIDB4ZmEsIAorMHgwMCwgMHhmMCwgMHhmMCwgMHhmYSwgMHgwNCwgMHgyMCwgMHhiOCwgMHg2MCwgMHgwNywgMHgyMCwgMHg3OCwgMHg2MSwgCisweDdlLCAweDYwLCAweDFiLCAweDIzLCAweGRiLCAweDAxLCAweGUwLCAweDE4LCAweGMwLCAweDhiLCAweDA0LCAweDIzLCAKKzB4MTgsIDB4NDAsIDB4ZTgsIDB4NjIsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg5MCwgMHhiNCwgMHgwMiwgMHgxYywgMHgwMCwgMHgyMCwgMHhmZiwgMHgyMywgCisweDAxLCAweDMzLCAweDlhLCAweDQyLCAweDA4LCAweGQwLCAweDAxLCAweDI5LCAweDAwLCAweGQxLCAweDAxLCAweDIwLCAKKzB4MDAsIDB4MmEsIDB4MDEsIDB4ZDEsIDB4MDIsIDB4MjMsIDB4MTgsIDB4NDMsIDB4OTAsIDB4YmMsIDB4NzAsIDB4NDcsIAorMHgxYiwgMHg0YSwgMHhkNywgMHg2OCwgMHgxYSwgMHg0YiwgMHgxOSwgMHg3OSwgMHgxYywgMHgxYywgMHgzNywgMHgyMywgCisweDliLCAweDAxLCAweGUzLCAweDE4LCAweDAxLCAweDJmLCAweDBkLCAweGQxLCAweDU3LCAweDg4LCAweDAwLCAweDJmLCAKKzB4MGEsIDB4ZDEsIDB4MDAsIDB4MjksIDB4MGEsIDB4ZDEsIDB4NTksIDB4OGIsIDB4MGEsIDB4MDksIDB4MDAsIDB4ZDMsIAorMHgwMiwgMHgyMCwgMHg0OSwgMHgwOSwgMHhlOCwgMHhkMywgMHgwMSwgMHgyMywgMHgxOCwgMHg0MywgMHhlNSwgMHhlNywgCisweDAwLCAweDI5LCAweDAzLCAweGQwLCAweDk4LCAweDhhLCAweDgwLCAweDA3LCAweDgwLCAweDBmLCAweGRmLCAweGU3LCAKKzB4NmQsIDB4MjMsIDB4NWIsIDB4MDEsIDB4ZDEsIDB4MTgsIDB4OGEsIDB4ODgsIDB4ZmYsIDB4MjcsIDB4MDEsIDB4MzcsIAorMHgxNywgMHg0MCwgMHgwYSwgMHg0OSwgMHhjOSwgMHg4OCwgMHgwMywgMHhkMCwgMHg0YiwgMHgwYSwgMHgwMSwgMHhkMywgCisweDAzLCAweDIwLCAweGQxLCAweGU3LCAweDEzLCAweDBhLCAweDAzLCAweGQzLCAweDBiLCAweDBhLCAweDAxLCAweGQzLCAKKzB4MDIsIDB4MjAsIDB4Y2IsIDB4ZTcsIDB4ZDIsIDB4MDksIDB4YzksIDB4ZDMsIDB4YzksIDB4MDksIDB4YzcsIDB4ZDMsIAorMHgwMSwgMHgyMCwgMHhjNSwgMHhlNywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwOCwgMHgxYywgMHgwMCwgMHg4MCwgCisweGYwLCAweGI1LCAweGMxLCAweGIwLCAweDAxLCAweDIwLCAweDAwLCAweDA3LCAweDUyLCAweDQ5LCAweGMwLCAweDQ2LCAKKzB4MDgsIDB4NjAsIDB4NTIsIDB4NDgsIDB4NDIsIDB4NjksIDB4NDAsIDB4MGQsIDB4YTEsIDB4MjEsIDB4NDksIDB4MDMsIAorMHg0OCwgMHg2MCwgMHg1MCwgMHg0OCwgMHhjMCwgMHg2YSwgMHg1MCwgMHg0YiwgMHgxOCwgMHg0MywgMHgwMCwgMHgyMSwgCisweDAzLCAweDAzLCAweDFiLCAweDBiLCAweDRlLCAweDRjLCAweDI3LCAweDZmLCAweDNkLCAweDAzLCAweDJkLCAweDBiLCAKKzB4ZTcsIDB4MWQsIDB4NzksIDB4MzcsIDB4YWIsIDB4NDIsIDB4MWMsIDB4ZDAsIDB4ZTMsIDB4MWQsIDB4NzksIDB4MzMsIAorMHgxYiwgMHg2YSwgMHhjMCwgMHg0NiwgMHg0MCwgMHg5MywgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwMywgMHg0MywgCisweDFiLCAweDY4LCAweGNjLCAweDAwLCAweDZlLCAweDQ2LCAweDMzLCAweDUxLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4MDYsIDB4MWQsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4NmMsIDB4NDQsIDB4NjMsIDB4NjAsIDB4MDgsIDB4MzAsIAorMHgwMSwgMHgzMSwgMHg0MCwgMHg5YiwgMHg4MywgMHg0MiwgMHgwMCwgMHhkOCwgMHgzZiwgMHg0OCwgMHgwMywgMHgwMywgCisweDFiLCAweDBiLCAweGFiLCAweDQyLCAweGU3LCAweGQxLCAweDAwLCAweDIwLCAweDAxLCAweDIzLCAweDFiLCAweDAzLCAKKzB4MTMsIDB4NDAsIDB4M2MsIDB4NGMsIDB4MDMsIDB4ZDAsIDB4NjMsIDB4NmEsIDB4MDEsIDB4MzMsIDB4NjMsIDB4NjIsIAorMHgwOSwgMHhlMCwgMHgxMywgMHgwYiwgMHgwMywgMHhkMywgMHgyMywgMHg2YSwgCisweDAxLCAweDMzLCAweDIzLCAweDYyLCAweDAzLCAweGUwLCAweDM3LCAweDRiLCAweDVjLCAweDZkLCAweDAxLCAweDM0LCAKKzB4NWMsIDB4NjUsIDB4MDAsIDB4MjksIDB4MDksIDB4ZDAsIDB4MDMsIDB4MWMsIDB4ZGMsIDB4MDAsIDB4MjMsIDB4MWMsIAorMHg2YiwgMHg0NCwgMHg1YywgMHg2OCwgMHgwMSwgMHgzMCwgMHgyMywgMHgwZCwgMHgwMSwgMHhkMiwgMHg4OCwgMHg0MiwgCisweGY1LCAweGQxLCAweDMwLCAweDRjLCAweDI1LCAweDY4LCAweDZiLCAweDBjLCAweDA1LCAweGQyLCAweDIzLCAweDY4LCAKKzB4MWIsIDB4MGMsIDB4MDgsIDB4ZDEsIDB4MjQsIDB4NjgsIDB4YTMsIDB4MGEsIDB4MDUsIDB4ZDMsIDB4MjAsIDB4MjQsIAorMHgyYiwgMHg0YiwgMHhjMCwgMHg0NiwgMHg1YywgMHg2MiwgMHgwMCwgMHgyNCwgMHg1YywgMHg2MiwgMHgyNSwgMHg0YiwgCisweDIzLCAweDRjLCAweDUxLCAweDI2LCAweGI2LCAweDAzLCAweDIzLCAweDY3LCAweDMzLCAweDYxLCAweDNkLCAweDZhLCAKKzB4YzAsIDB4NDYsIDB4NzUsIDB4NjEsIDB4MDIsIDB4MjUsIDB4YTEsIDB4MjYsIDB4NzYsIDB4MDMsIDB4NzUsIDB4NjAsIAorMHgwMSwgMHgyNSwgMHhiNSwgMHg2MCwgMHhlNiwgMHgxZCwgMHhiOSwgMHgzNiwgMHgzNSwgMHg3MSwgMHg4OCwgMHg0MiwgCisweDIxLCAweGQwLCAweDI1LCAweDFjLCAweGMzLCAweDAwLCAweDZjLCAweDQ2LCAweGU0LCAweDU4LCAweDJlLCAweDZmLCAKKzB4NmIsIDB4NDQsIDB4MzQsIDB4NjAsIDB4NWIsIDB4NjgsIDB4MmMsIDB4NmYsIDB4YzAsIDB4NDYsIDB4NjMsIDB4NjAsIAorMHgyYiwgMHg2ZiwgMHgwOCwgMHgzMywgMHgyYiwgMHg2NywgMHgzYywgMHg2YSwgMHhhMywgMHg0MiwgMHgwMiwgMHhkMywgCisweDEyLCAweDRiLCAweGMwLCAweDQ2LCAweDJiLCAweDY3LCAweDAzLCAweDFjLCAweGRiLCAweDAwLCAweDZiLCAweDQ0LCAKKzB4NWMsIDB4NjgsIDB4MDEsIDB4MzAsIDB4MjMsIDB4MGQsIDB4MDQsIDB4ZDMsIDB4NTEsIDB4MjQsIDB4YTQsIDB4MDMsIAorMHgyYiwgMHg2ZiwgMHhjMCwgMHg0NiwgMHhhMywgMHg2MSwgMHg4OCwgMHg0MiwgMHhkZSwgMHhkMSwgMHgxMCwgMHgwYiwgCisweDAzLCAweGQzLCAweDBlLCAweDQ5LCAweDAxLCAweDIwLCAweGZkLCAweGY3LCAweDc0LCAweGZhLCAweDQxLCAweGIwLCAKKzB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIAorMHgwMCwgMHgwMSwgMHgxNCwgMHg0MCwgMHgwMCwgMHg0MCwgMHgxNCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgyMCwgMHg0MCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDI0LCAweGE3LCAweDIwLCAweDQwLCAweGE0LCAweDJhLCAweDAwLCAweDgwLCAKKzB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4YzAsIDB4MDAsIDB4MTgsIDB4MDAsIAorMHhjOSwgMHg0ZiwgMHhmZiwgMHhmZiwgMHhmMCwgMHhiNCwgMHgwMCwgMHgyMSwgMHgwMCwgMHgyMywgMHgwNywgMHgyMiwgCisweDA2LCAweDI0LCAweDQ3LCAweDRmLCAweGMwLCAweDQ2LCAweDNjLCAweDYxLCAweDNhLCAweDYxLCAweDAxLCAweDMzLCAKKzB4MjAsIDB4MmIsIDB4ZjksIDB4ZDMsIDB4MDQsIDB4MjUsIDB4M2QsIDB4NjEsIDB4MDUsIDB4MjMsIDB4M2IsIDB4NjEsIAorMHgzYywgMHg2MSwgMHgzYSwgMHg2MSwgMHgzYywgMHg2MSwgMHgzYSwgMHg2MSwgMHgzZCwgMHg2MSwgMHgzYiwgMHg2MSwgCisweDNmLCAweDRkLCAweGFiLCAweDZmLCAweGRlLCAweDA4LCAweDAyLCAweDIzLCAweDFlLCAweDQwLCAweDA0LCAweDIzLCAKKzB4MzMsIDB4NDMsIDB4M2IsIDB4NjEsIDB4MDUsIDB4MjMsIDB4MzMsIDB4NDMsIDB4M2IsIDB4NjEsIDB4YWIsIDB4NmYsIAorMHg5ZSwgMHgwOCwgMHgwMiwgMHgyMywgMHgxZSwgMHg0MCwgMHgwNCwgMHgyMywgMHgzMywgMHg0MywgMHgzYiwgMHg2MSwgCisweDA1LCAweDIzLCAweDMzLCAweDQzLCAweDNiLCAweDYxLCAweGFiLCAweDZmLCAweDVlLCAweDA4LCAweDAyLCAweDIzLCAKKzB4MWUsIDB4NDAsIDB4MDQsIDB4MjMsIDB4MzMsIDB4NDMsIDB4M2IsIDB4NjEsIDB4MDUsIDB4MjMsIDB4MzMsIDB4NDMsIAorMHgzYiwgMHg2MSwgMHgwMiwgMHgyMywgMHhhZSwgMHg2ZiwgMHgxZSwgMHg0MCwgMHgwNCwgMHgyMywgMHgzMywgMHg0MywgCisweDNiLCAweDYxLCAweDA1LCAweDIzLCAweDMzLCAweDQzLCAweDNiLCAweDYxLCAweGFiLCAweDZmLCAweDVkLCAweDAwLCAKKzB4MDIsIDB4MjMsIDB4MWQsIDB4NDAsIDB4MDQsIDB4MjMsIDB4MmIsIDB4NDMsIDB4M2IsIDB4NjEsIDB4MDUsIDB4MjMsIAorMHgyYiwgMHg0MywgMHgzYiwgMHg2MSwgMHhjNSwgMHgwOCwgMHgwMiwgMHgyMywgMHgxZCwgMHg0MCwgMHgwNCwgMHgyMywgCisweDJiLCAweDQzLCAweDNiLCAweDYxLCAweDA1LCAweDIzLCAweDJiLCAweDQzLCAweDNiLCAweDYxLCAweDg1LCAweDA4LCAKKzB4MDIsIDB4MjMsIDB4MWQsIDB4NDAsIDB4MDQsIDB4MjMsIDB4MmIsIDB4NDMsIDB4M2IsIDB4NjEsIDB4MDUsIDB4MjMsIAorMHgyYiwgMHg0MywgMHgzYiwgMHg2MSwgMHg0NSwgMHgwOCwgMHgwMiwgMHgyMywgMHgxZCwgMHg0MCwgMHgwNCwgMHgyMywgCisweDJiLCAweDQzLCAweDNiLCAweDYxLCAweDA1LCAweDIzLCAweDJiLCAweDQzLCAweDNiLCAweDYxLCAweDAyLCAweDI1LCAKKzB4MDUsIDB4NDAsIDB4MDQsIDB4MjMsIDB4MmIsIDB4NDMsIDB4M2IsIDB4NjEsIDB4MDUsIDB4MjMsIDB4MmIsIDB4NDMsIAorMHgzYiwgMHg2MSwgMHg0MCwgMHgwMCwgMHgwMiwgMHgyMywgMHgxOCwgMHg0MCwgMHgwNCwgMHgyMywgMHgwMywgMHg0MywgCisweDNiLCAweDYxLCAweDA1LCAweDIzLCAweDE4LCAweDQzLCAweDM4LCAweDYxLCAweDAwLCAweDI1LCAweDNkLCAweDYxLCAKKzB4MDEsIDB4MjMsIDB4M2IsIDB4NjEsIDB4M2QsIDB4NjEsIDB4M2IsIDB4NjEsIDB4MDAsIDB4MjAsIDB4M2QsIDB4NjEsIAorMHgwZCwgMHg0YiwgMHgxYiwgMHg2OSwgMHg0OSwgMHgwMCwgMHgxZSwgMHgxYywgMHgwMiwgMHgyMywgMHgzMywgMHg0MCwgCisweDE5LCAweDQzLCAweDAxLCAweDIzLCAweDNiLCAweDYxLCAweDAxLCAweDMwLCAKKzB4MTAsIDB4MjgsIDB4ZjIsIDB4ZDMsIDB4MDIsIDB4MjAsIDB4MzgsIDB4NjEsIDB4MDMsIDB4MjAsIDB4MzgsIDB4NjEsIAorMHgzYywgMHg2MSwgMHgzYSwgMHg2MSwgMHgzYywgMHg2MSwgMHgzYSwgMHg2MSwgMHgzOCwgMHg2MSwgMHg0OCwgMHgwOCwgCisweGYwLCAweGJjLCAweDcwLCAweDQ3LCAweDgwLCAweDAwLCAweDE0LCAweDAwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4ODAsIDB4MDAsIDB4MTQsIDB4NDAsIDB4ZjAsIDB4YjQsIDB4MDAsIDB4MjQsIDB4MDcsIDB4MjMsIDB4MDYsIDB4MjcsIAorMHg0NCwgMHg0YSwgMHhjMCwgMHg0NiwgMHgxNywgMHg2MSwgMHgxMywgMHg2MSwgMHgwMSwgMHgzNCwgMHgyMCwgMHgyYywgCisweGY5LCAweGQzLCAweDA0LCAweDI2LCAweDE2LCAweDYxLCAweDA1LCAweDI0LCAweDE0LCAweDYxLCAweDE3LCAweDYxLCAKKzB4MDcsIDB4MjMsIDB4MTMsIDB4NjEsIDB4MTYsIDB4NjEsIDB4MTQsIDB4NjEsIDB4MTcsIDB4NjEsIDB4MTMsIDB4NjEsIAorMHgzYywgMHg0YiwgMHg5YiwgMHg2ZiwgMHhkZCwgMHgwOCwgMHgwMiwgMHgyMywgMHgxZCwgMHg0MCwgMHgyYiwgMHgxYywgCisweDMzLCAweDQzLCAweDEzLCAweDYxLCAweDI1LCAweDQzLCAweDE1LCAweDYxLCAweDM3LCAweDRiLCAweDliLCAweDZmLCAKKzB4OWQsIDB4MDgsIDB4MDIsIDB4MjMsIDB4MWQsIDB4NDAsIDB4MmIsIDB4MWMsIDB4MzMsIDB4NDMsIDB4MTMsIDB4NjEsIAorMHgyNSwgMHg0MywgMHgxNSwgMHg2MSwgMHgzMiwgMHg0YiwgMHg5YiwgMHg2ZiwgMHg1ZCwgMHgwOCwgMHgwMiwgMHgyMywgCisweDFkLCAweDQwLCAweDJiLCAweDFjLCAweDMzLCAweDQzLCAweDEzLCAweDYxLCAweDI1LCAweDQzLCAweDE1LCAweDYxLCAKKzB4MmQsIDB4NGIsIDB4OWQsIDB4NmYsIDB4MDIsIDB4MjMsIDB4MWQsIDB4NDAsIDB4MmIsIDB4MWMsIDB4MzMsIDB4NDMsIAorMHgxMywgMHg2MSwgMHgyNSwgMHg0MywgMHgxNSwgMHg2MSwgMHgyOSwgMHg0YiwgMHg5YiwgMHg2ZiwgMHg1ZCwgMHgwMCwgCisweDAyLCAweDIzLCAweDFkLCAweDQwLCAweDJiLCAweDFjLCAweDMzLCAweDQzLCAweDEzLCAweDYxLCAweDI1LCAweDQzLCAKKzB4MTUsIDB4NjEsIDB4YzUsIDB4MDgsIDB4MDIsIDB4MjMsIDB4MWQsIDB4NDAsIDB4MmIsIDB4MWMsIDB4MzMsIDB4NDMsIAorMHgxMywgMHg2MSwgMHgyNSwgMHg0MywgMHgxNSwgMHg2MSwgMHg4NSwgMHgwOCwgMHgwMiwgMHgyMywgMHgxZCwgMHg0MCwgCisweDJiLCAweDFjLCAweDMzLCAweDQzLCAweDEzLCAweDYxLCAweDI1LCAweDQzLCAweDE1LCAweDYxLCAweDQ1LCAweDA4LCAKKzB4MDIsIDB4MjMsIDB4MWQsIDB4NDAsIDB4MmIsIDB4MWMsIDB4MzMsIDB4NDMsIDB4MTMsIDB4NjEsIDB4MjUsIDB4NDMsIAorMHgxNSwgMHg2MSwgMHgwMiwgMHgyNSwgMHgwNSwgMHg0MCwgMHgyYiwgMHgxYywgMHgzMywgMHg0MywgMHgxMywgMHg2MSwgCisweDI1LCAweDQzLCAweDE1LCAweDYxLCAweDQwLCAweDAwLCAweDAyLCAweDIzLCAweDE4LCAweDQwLCAweDAzLCAweDFjLCAKKzB4MzMsIDB4NDMsIDB4MTMsIDB4NjEsIDB4MjAsIDB4NDMsIDB4MTAsIDB4NjEsIDB4MTcsIDB4NjEsIDB4MDcsIDB4MjMsIAorMHgxMywgMHg2MSwgMHgxNiwgMHg2MSwgMHgxNCwgMHg2MSwgMHg0YywgMHgwMCwgMHgwMCwgMHgyMCwgMHgwZiwgMHgyMSwgCisweDI1LCAweDFjLCAweGNkLCAweDQwLCAweDAyLCAweDIzLCAweDFkLCAweDQwLCAweDA0LCAweDIzLCAweDJiLCAweDQzLCAKKzB4MTMsIDB4NjEsIDB4MDUsIDB4MjMsIDB4MmIsIDB4NDMsIDB4MTMsIDB4NjEsIDB4MDEsIDB4MzAsIDB4MDEsIDB4MzksIAorMHgxMCwgMHgyOCwgMHhmMSwgMHhkMywgMHgxNywgMHg2MSwgMHgwNywgMHgyMywgMHgxMywgMHg2MSwgMHgxNywgMHg2MSwgCisweDEzLCAweDYxLCAweDAzLCAweDIwLCAweDEwLCAweDYxLCAweGYwLCAweGJjLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAKKzB4ODAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjUsIDB4NGYsIDB4NGQsIAorMHgwOCwgMHgyMSwgMHgwMiwgMHgyMCwgMHgyYSwgMHgxYywgMHhmZCwgMHhmNywgMHgyNywgMHhmOSwgMHg0ZCwgMHg0YywgCisweDcxLCAweDIzLCAweDViLCAweDAxLCAweGU3LCAweDE4LCAweDM4LCAweDgwLCAweDFhLCAweDIxLCAweDAyLCAweDIwLCAKKzB4MmEsIDB4MWMsIDB4ZmQsIDB4ZjcsIDB4MWQsIDB4ZjksIDB4NzgsIDB4ODAsIDB4MjAsIDB4NzksIDB4MDAsIDB4MjgsIAorMHgwYiwgMHhkMCwgMHgwMCwgMHgyMCwgMHgzOCwgMHg4MCwgMHhlMCwgMHg2OCwgMHgwMSwgMHgyOCwgMHgxMCwgMHhkMSwgCisweDQ0LCAweDQ4LCAweDAwLCAweDY4LCAweDAxLCAweDIzLCAweDliLCAweDAyLCAweDE4LCAweDQzLCAweDk5LCAweDAyLCAKKzB4MDgsIDB4NjAsIDB4ZTAsIDB4NjgsIDB4MDEsIDB4MjgsIDB4MDYsIDB4ZDEsIDB4NjAsIDB4ODgsIDB4MDAsIDB4MjgsIAorMHgwMywgMHhkMSwgMHhmOSwgMHgyMSwgMHgxMiwgMHgyMCwgMHhmZiwgMHhmNywgMHg0MywgMHhmZiwgMHgwMSwgMHgyMSwgCisweGM5LCAweDAzLCAweDAwLCAweDIwLCAweGZmLCAweGY3LCAweDNlLCAweGZmLCAweDAwLCAweDI1LCAweDdkLCAweDI2LCAKKzB4ZjYsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDEsIDB4MzUsIDB4MDAsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4OWMsIDB4ZmUsIAorMHgwMCwgMHgwYywgMHgwMSwgMHhkMywgMHhiNSwgMHg0MiwgMHhmNywgMHhkMywgMHgwMCwgMHgyNSwgMHgwNSwgMHhlMCwgCisweDAzLCAweDIxLCAweDA5LCAweDAzLCAweDAwLCAweDIwLCAweGZmLCAweGY3LCAweDJiLCAweGZmLCAweDAxLCAweDM1LCAKKzB4MDAsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4OGQsIDB4ZmUsIDB4NDAsIDB4MGIsIDB4MDEsIDB4ZDIsIDB4YjUsIDB4NDIsIAorMHhmMiwgMHhkMywgMHgwNCwgMHgyMCwgMHhmZiwgMHhmNywgMHg4NiwgMHhmZSwgMHhmZiwgMHgyMywgMHhlMSwgMHgzMywgCisweDk4LCAweDQzLCAweDAxLCAweDIxLCAweDAxLCAweDQzLCAweDM4LCAweDg4LCAweGZmLCAweDIzLCAweDAxLCAweDMzLCAKKzB4OTgsIDB4NDIsIDB4MDMsIDB4ZDEsIDB4MmYsIDB4MjMsIDB4NWIsIDB4MDEsIAorMHgxOSwgMHg0MywgMHgxNiwgMHhlMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHhkMSwgMHg3OCwgMHg4OCwgMHgwMSwgMHgyOCwgCisweDAzLCAweGQxLCAweDIzLCAweDIzLCAweDViLCAweDAxLCAweDE5LCAweDQzLCAweDBkLCAweGUwLCAweDIwLCAweDIzLCAKKzB4MTksIDB4NDMsIDB4MGEsIDB4ZTAsIDB4MDAsIDB4MjgsIDB4MDgsIDB4ZDEsIDB4NzgsIDB4ODgsIDB4MDEsIDB4MjgsIAorMHgwMywgMHhkMSwgMHgwYiwgMHgyMywgMHhkYiwgMHgwMSwgMHgxOSwgMHg0MywgMHgwMSwgMHhlMCwgMHg4MCwgMHgyMywgCisweDE5LCAweDQzLCAweDA0LCAweDIwLCAweGZmLCAweGY3LCAweGY4LCAweGZlLCAweDA5LCAweDIxLCAweDQ5LCAweDAyLCAKKzB4MDAsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4ZjMsIDB4ZmUsIDB4ZTAsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MGMsIDB4ZDEsIAorMHgwMCwgMHgyMSwgMHgxYiwgMHgyMCwgMHhmZiwgMHhmNywgMHhlYywgMHhmZSwgMHgxYSwgMHgyMCwgMHhmZiwgMHhmNywgCisweDRmLCAweGZlLCAweDAxLCAweDIxLCAweGM5LCAweDAzLCAweDAxLCAweDQzLCAweDFhLCAweDIwLCAweGZmLCAweGY3LCAKKzB4ZTMsIDB4ZmUsIDB4MDAsIDB4MjcsIDB4MDMsIDB4ZTAsIDB4MDgsIDB4MmYsIDB4MDEsIDB4ZDMsIDB4MGYsIDB4MmYsIAorMHgwOCwgMHhkOSwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHg0MCwgMHhmZSwgMHg3OSwgMHgwMCwgMHgwOSwgMHgxOSwgCisweDFiLCAweDIzLCAweGRiLCAweDAxLCAweGM5LCAweDE4LCAweDg4LCAweDgzLCAweDAxLCAweDM3LCAweDIwLCAweDJmLCAKKzB4ZWYsIDB4ZDMsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ZWQsIDB4YWYsIDB4MjEsIDB4NDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgMHg4MSwgMHhiMCwgMHgxMywgMHg0OCwgCisweDAxLCAweDY4LCAweGMwLCAweDQ2LCAweDAwLCAweDkxLCAweDQxLCAweDY4LCAweGMwLCAweDQ2LCAweDAwLCAweDkxLCAKKzB4ODEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTEsIDB4YzEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTEsIAorMHgwMSwgMHg2OSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MSwgMHg0MSwgMHg2OSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MSwgCisweDgxLCAweDY5LCAweGMwLCAweDQ2LCAweDAwLCAweDkxLCAweGMxLCAweDY5LCAweGMwLCAweDQ2LCAweDAwLCAweDkxLCAKKzB4MDEsIDB4NmEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTEsIDB4NDEsIDB4NmEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTEsIAorMHg4MSwgMHg2YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MSwgMHhjMCwgMHg2YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MCwgCisweDAxLCAweGIwLCAweDcwLCAweDQ3LCAweDAwLCAweDA4LCAweDE0LCAweDQwLCAweGYwLCAweGI1LCAweDgzLCAweGIwLCAKKzB4NjgsIDB4NGQsIDB4MWIsIDB4MjMsIDB4ZGIsIDB4MDEsIDB4ZWYsIDB4MTgsIDB4ZjgsIDB4OGIsIDB4MDQsIDB4MjIsIAorMHgwMiwgMHg0MCwgMHgwMiwgMHg5MiwgMHg3MSwgMHgyMywgMHg1YiwgMHgwMSwgMHhlOCwgMHgxOCwgMHgwMSwgMHg4OCwgCisweGMwLCAweDQ2LCAweDAxLCAweDkxLCAweDQwLCAweDg4LCAweGMwLCAweDQ2LCAweDAwLCAweDkwLCAweDAwLCAweDI0LCAKKzB4MDMsIDB4ZTAsIDB4MDgsIDB4MmMsIDB4MDEsIDB4ZDMsIDB4MGYsIDB4MmMsIDB4MDgsIDB4ZDksIDB4MjAsIDB4MWMsIAorMHhmZiwgMHhmNywgMHhlOCwgMHhmZCwgMHg2MSwgMHgwMCwgMHg0OSwgMHgxOSwgMHgxYiwgMHgyMywgMHhkYiwgMHgwMSwgCisweGM5LCAweDE4LCAweDg4LCAweDgzLCAweDAxLCAweDM0LCAweDIwLCAweDJjLCAweGVmLCAweGQzLCAweDU4LCAweDRjLCAKKzB4ZTAsIDB4NjksIDB4MDAsIDB4MjgsIDB4MTUsIDB4ZDAsIDB4NTcsIDB4NGUsIDB4MjAsIDB4MjUsIDB4MDEsIDB4M2QsIAorMHg1MywgMHg0OSwgMHhlMCwgMHg2OSwgMHgzMCwgMHg0MCwgMHgwYiwgMHhkMCwgMHg2OCwgMHgwMCwgMHg0MCwgMHgxOCwgCisweDM3LCAweDIzLCAweDliLCAweDAxLCAweGMwLCAweDE4LCAweDgxLCAweDhiLCAweDI4LCAweDFjLCAweGZmLCAweGY3LCAKKzB4NjUsIDB4ZmUsIDB4ZTAsIDB4NjksIDB4YjAsIDB4NDMsIDB4ZTAsIDB4NjEsIDB4NzYsIDB4MDgsIDB4MDAsIDB4MmQsIAorMHhlYiwgMHhkMSwgMHgwMSwgMHgyMCwgMHhmZiwgMHhmNywgMHhjMiwgMHhmZCwgMHg0OCwgMHg0OSwgMHhjMCwgMHg0NiwgCisweGY4LCAweDgzLCAweGY4LCAweDhiLCAweGMyLCAweDA4LCAweDI1LCAweGQzLCAweGNhLCAweDY4LCAweDAxLCAweDJhLCAKKzB4MTMsIDB4ZDEsIDB4MGEsIDB4NzksIDB4MDAsIDB4MmEsIDB4MWYsIDB4ZDEsIDB4NDksIDB4ODgsIDB4MDAsIDB4MjksIAorMHgxYywgMHhkMSwgMHgwMSwgMHg5OSwgMHg0MywgMHg0YSwgMHgwMCwgMHgyOSwgMHgwNSwgMHhkMCwgMHgwMSwgMHgyOSwgCisweDE2LCAweGQxLCAweDUxLCAweDhiLCAweGM5LCAweDA4LCAweDEzLCAweGQyLCAweDBmLCAweGUwLCAweDUxLCAweDhiLCAKKzB4MDksIDB4MDksIDB4MGYsIDB4ZDIsIDB4MGIsIDB4ZTAsIDB4MGEsIDB4NzksIDB4MDAsIDB4MmEsIDB4MGIsIDB4ZDEsIAorMHg2ZCwgMHgyMywgMHg1YiwgMHgwMSwgMHhjOSwgMHgxOCwgMHg4YSwgMHg4OCwgMHhjOSwgMHg4OCwgMHgxMSwgMHg0MCwgCisweDQ5LCAweDA5LCAweDA5LCAweDA3LCAweDAyLCAweGQxLCAweDA0LCAweDIzLCAweDk4LCAweDQzLCAweGY4LCAweDgzLCAKKzB4ZjgsIDB4OGIsIDB4MDQsIDB4MjEsIDB4MDEsIDB4NDAsIDB4MDIsIDB4OWEsIDB4MWYsIDB4ZDAsIDB4YjksIDB4OGIsIAorMHg0YSwgMHgwYiwgMHgyNywgMHhkMywgMHg4MCwgMHgwOSwgMHgyNSwgMHhkMywgMHhmZiwgMHgyMywgMHgwMSwgMHg5OCwgCisweDAxLCAweDMzLCAweDk4LCAweDQyLCAweDIwLCAweGQwLCAweDAwLCAweDI1LCAweDAwLCAweDk4LCAweDAxLCAweDI4LCAKKzB4MDAsIDB4ZDEsIDB4MDUsIDB4MDIsIDB4MDEsIDB4OTgsIDB4MDAsIDB4MjgsIDB4MDIsIDB4ZDEsIDB4MDEsIDB4MjMsIAorMHg1YiwgMHgwMywgMHgxZCwgMHg0MywgMHhhOSwgMHg0MiwgMHgxMywgMHhkMCwgCisweDAwLCAweDIwLCAweDI5LCAweDFjLCAweGZmLCAweGY3LCAweDEwLCAweGZlLCAweGJkLCAweDgzLCAweDAwLCAweDIwLCAKKzB4YzAsIDB4NDMsIDB4NjAsIDB4NjIsIDB4MGEsIDB4ZTAsIDB4YjgsIDB4OGIsIDB4NDAsIDB4MGIsIDB4MDcsIDB4ZDIsIAorMHgwOSwgMHgyMSwgMHg0OSwgMHgwMiwgMHgwMCwgMHgyMCwgMHhmZiwgMHhmNywgMHgwMywgMHhmZSwgMHgwOSwgMHgyMCwgCisweDQwLCAweDAyLCAweGI4LCAweDgzLCAweGY4LCAweDhiLCAweGMwLCAweDA4LCAweDJkLCAweGQzLCAweDFkLCAweDQ4LCAKKzB4YzcsIDB4NmEsIDB4MDEsIDB4OTgsIDB4MDAsIDB4OTksIDB4ZmYsIDB4ZjcsIDB4NTEsIDB4ZmMsIDB4YzIsIDB4MDcsIAorMHhkMiwgMHgwZiwgMHgxYSwgMHg0OSwgMHgwMywgMHhkMCwgMHgwNCwgMHgyMywgMHhjZCwgMHg2ZCwgMHgyYiwgMHg0MywgCisweDAzLCAweGUwLCAweDA0LCAweDIzLCAweGNkLCAweDZkLCAweDlkLCAweDQzLCAweDJiLCAweDFjLCAweGNiLCAweDY1LCAKKzB4ODMsIDB4MDgsIDB4MDMsIDB4ZDMsIDB4MDIsIDB4MjMsIDB4Y2QsIDB4NmQsIDB4MmIsIDB4NDMsIDB4MDMsIDB4ZTAsIAorMHgwMiwgMHgyMywgMHhjZCwgMHg2ZCwgMHg5ZCwgMHg0MywgMHgyYiwgMHgxYywgMHhjYiwgMHg2NSwgMHg2MSwgMHg2YSwgCisweDgxLCAweDQyLCAweDBjLCAweGQwLCAweDYwLCAweDYyLCAweDBlLCAweDQ4LCAweDAwLCAweDJhLCAweDAzLCAweGQwLCAKKzB4ZmYsIDB4MjEsIDB4MjEsIDB4MzEsIDB4MzksIDB4NDMsIDB4MDMsIDB4ZTAsIDB4ZmYsIDB4MjMsIDB4MjEsIDB4MzMsIAorMHg5ZiwgMHg0MywgMHgzOSwgMHgxYywgMHhjMSwgMHg2MiwgMHgwMywgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDY4LCAweDFjLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MjgsIDB4MWMsIDB4MDAsIDB4ODAsIDB4NDAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHg0MCwgMHgwMCwgMHgxNCwgMHgwMCwgMHg5MCwgMHhiNCwgMHgwMSwgMHgyMiwgCisweDIwLCAweDI4LCAweDBmLCAweGQyLCAweDQzLCAweDAwLCAweDBmLCAweDFjLCAweDA3LCAweDQ5LCAweDVjLCAweDE4LCAKKzB4MzcsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZTMsIDB4MTgsIDB4OWYsIDB4ODMsIDB4ODIsIDB4NDAsIDB4MDcsIDB4MjMsIAorMHg1YiwgMHgwMiwgMHhjOSwgMHgxOCwgMHgxMCwgMHgxYywgMHhjYSwgMHg2OSwgMHgxMCwgMHg0MywgMHhjOCwgMHg2MSwgCisweDkwLCAweGJjLCAweDcwLCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDBiLCAweDQ4LCAweDQwLCAweDY5LCAKKzB4MGIsIDB4NDksIDB4YzksIDB4OGIsIDB4MDQsIDB4MjIsIDB4MGEsIDB4NDAsIDB4MGEsIDB4NDksIDB4MDYsIDB4ZDAsIAorMHgwMSwgMHgyMywgMHhkYiwgMHgwMiwgMHg5OCwgMHg0MywgMHgwMSwgMHgyMywgMHhjYSwgMHg2ZCwgMHgxYSwgMHg0MywgCisweDA1LCAweGUwLCAweDAxLCAweDIzLCAweGRiLCAweDAyLCAweDE4LCAweDQzLCAweGNhLCAweDZkLCAweDUyLCAweDA4LCAKKzB4NTIsIDB4MDAsIDB4Y2EsIDB4NjUsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHhlOCwgMHgxYiwgMHgwMCwgMHg4MCwgMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHg4NCwgMHhiMCwgCisweGZmLCAweGY3LCAweGRlLCAweGZmLCAweDAxLCAweDFjLCAweDA1LCAweDIwLCAweDAwLCAweDkwLCAweDAwLCAweDIwLCAKKzB4MDEsIDB4YWIsIDB4MTgsIDB4ODAsIDB4MDQsIDB4M2IsIDB4NTgsIDB4NzAsIDB4MWIsIDB4MjIsIDB4MDAsIDB4YWIsIAorMHg1YSwgMHg4MCwgMHhkOSwgMHg4MCwgMHgwNSwgMHg0OSwgMHhjOSwgMHg2ZCwgMHhjMCwgMHg0NiwgMHgwMiwgMHg5MSwgCisweDAzLCAweDkwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZkLCAweGY3LCAweDc5LCAweGY4LCAweDA0LCAweGIwLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4YTQsIDB4MmEsIDB4MDAsIDB4ODAsIDB4MGYsIDB4NDgsIDB4MDEsIDB4NjgsIAorMHg0OSwgMHgwYywgMHgwNSwgMHhkMiwgMHgwMSwgMHg2OCwgMHgwOSwgMHgwYywgMHgwNiwgMHhkMSwgMHgwMCwgMHg2OCwgCisweDgwLCAweDBhLCAweDAzLCAweGQzLCAweDBiLCAweDQ4LCAweDAwLCAweDY4LCAweDAwLCAweDBjLCAweDAxLCAweGUwLCAKKzB4MGEsIDB4NDgsIDB4ODAsIDB4NmMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4MDksIDB4NGIsIDB4OTgsIDB4NDIsIAorMHgwNSwgMHhkMCwgMHgwMiwgMHgzMywgMHg5OCwgMHg0MiwgMHgwMiwgMHhkMCwgMHgwNywgMHg0YiwgMHg5OCwgMHg0MiwgCisweDAxLCAweGQxLCAweDAxLCAweDIwLCAweDcwLCAweDQ3LCAweDAwLCAweDIwLCAweGZjLCAweGU3LCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIAorMHgwNCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwNywgMHg5OSwgMHgwMCwgMHgwMCwgMHg5MCwgMHhiNCwgMHgwMSwgMHgyNCwgCisweDIxLCAweDFjLCAweDE4LCAweDQ4LCAweDAyLCAweDY4LCAweDUyLCAweDBjLCAweDA2LCAweGQyLCAweDAyLCAweDY4LCAKKzB4MTIsIDB4MGMsIDB4MDIsIDB4ZDEsIDB4MDAsIDB4NjgsIDB4ODAsIDB4MGEsIDB4MDAsIDB4ZDIsIDB4MDAsIDB4MjEsIAorMHgwOSwgMHgwNiwgMHgwOSwgMHgwZSwgMHgxMiwgMHg0ZiwgMHgxMywgMHg0YSwgMHgwMiwgMHhkMCwgMHgzOCwgMHg2OCwgCisweDAwLCAweDBjLCAweDAwLCAweGUwLCAweDkwLCAweDZjLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDEwLCAweDRiLCAKKzB4OTgsIDB4NDIsIDB4MDgsIDB4ZDAsIDB4MDIsIDB4MzMsIDB4OTgsIDB4NDIsIDB4MDUsIDB4ZDAsIDB4MGUsIDB4NGIsIAorMHg5OCwgMHg0MiwgMHgwMiwgMHhkMCwgMHgwMiwgMHgzYiwgMHg5OCwgMHg0MiwgMHgwYywgMHhkMSwgMHgwMCwgMHgyOSwgCisweDAyLCAweGQwLCAweGY4LCAweDZhLCAweDAwLCAweDBjLCAweDAwLCAweGUwLCAKKzB4ZDAsIDB4NmMsIDB4NDAsIDB4MGEsIDB4MDAsIDB4ZDIsIDB4MDAsIDB4MjQsIDB4MjAsIDB4MDYsIDB4MDAsIDB4MGUsIAorMHg5MCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMCwgMHgyMCwgMHhmYiwgMHhlNywgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgCisweDAwLCAweDAwLCAweDE4LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDA0LCAweDk5LCAweDAwLCAweDAwLCAKKzB4MDcsIDB4OTksIDB4MDAsIDB4MDAsIDB4MGMsIDB4NDgsIDB4MDEsIDB4NjgsIDB4NDksIDB4MGMsIDB4MDUsIDB4ZDIsIAorMHgwMSwgMHg2OCwgMHgwOSwgMHgwYywgMHgwNSwgMHhkMSwgMHgwMCwgMHg2OCwgMHg4MCwgMHgwYSwgMHgwMiwgMHhkMywgCisweDA4LCAweDQ4LCAweDgwLCAweDY4LCAweDAxLCAweGUwLCAweDA4LCAweDQ4LCAweDQwLCAweDZjLCAweDAwLCAweDA0LCAKKzB4MDAsIDB4MGMsIDB4MDAsIDB4MjEsIDB4MDMsIDB4MjgsIDB4MDMsIDB4ZDAsIDB4NDAsIDB4MDgsIDB4MDEsIDB4ZDMsIAorMHgwMSwgMHgyMCwgMHg3MCwgMHg0NywgMHgwOCwgMHgxYywgMHhmYywgMHhlNywgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgCisweDAwLCAweDAwLCAweDE4LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweDAxLCAweDI3LCAKKzB4MWEsIDB4NGMsIDB4MjUsIDB4NjgsIDB4ZmYsIDB4ZjcsIDB4NzIsIDB4ZmYsIDB4MDMsIDB4MWMsIDB4MTksIDB4NGEsIAorMHgwMiwgMHgyMSwgMHgwMSwgMHgyNiwgMHgxOCwgMHg0OCwgMHgwMSwgMHgyYiwgMHgxYiwgMHhkMSwgMHhjYiwgMHgwNCwgCisweDFlLCAweDYwLCAweDU1LCAweDIzLCAweDAzLCAweDYwLCAweDAwLCAweDIzLCAweDQzLCAweDYwLCAweDA2LCAweDY4LCAKKzB4NTUsIDB4MmUsIDB4MWIsIDB4ZDEsIDB4YWEsIDB4MjYsIDB4MDYsIDB4NjAsIDB4NDMsIDB4NjAsIDB4MDMsIDB4NjgsIAorMHhhYSwgMHgyYiwgMHgxNSwgMHhkMSwgMHgwOSwgMHgyMywgMHgwMywgMHg2MCwgMHgwNSwgMHgyMywgMHgwZiwgMHg0ZiwgCisweGMwLCAweDQ2LCAweDNiLCAweDYwLCAweDAzLCAweDIzLCAweDBlLCAweDRmLCAweGMwLCAweDQ2LCAweDNiLCAweDYwLCAKKzB4MTEsIDB4NjAsIDB4MDcsIDB4NjgsIDB4MDgsIDB4ZTAsIDB4MDgsIDB4MjMsIDB4MjMsIDB4NjAsIDB4MDQsIDB4MjMsIAorMHgwYSwgMHg0ZiwgMHhjMCwgMHg0NiwgMHgzYiwgMHg2MCwgMHgxMSwgMHg2MCwgMHgwNiwgMHg2MCwgMHgyNywgMHg2OCwgCisweGMwLCAweDQ2LCAweDI1LCAweDYwLCAweDM4LCAweDFjLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDAsIDB4MDAsIDB4MjAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4NDAsIAorMHgwMCwgMHgwMCwgMHgyYSwgMHg0MCwgMHgwMCwgMHgwMCwgMHgyNiwgMHg0MCwgMHgwMCwgMHgwMCwgMHgyOCwgMHg0MCwgCisweDgwLCAweGI1LCAweDA3LCAweDFjLCAweGZmLCAweGY3LCAweDMwLCAweGZmLCAweDAxLCAweDI4LCAweDA1LCAweGQxLCAKKzB4MTksIDB4NDgsIDB4MDAsIDB4NjgsIDB4MTksIDB4NDksIDB4NDksIDB4NmIsIDB4MDgsIDB4NDAsIDB4MjIsIDB4ZTAsIAorMHgxOCwgMHg0OCwgMHgwMSwgMHg2OCwgMHg0OSwgMHgwYywgMHgwNSwgMHhkMiwgMHgwMSwgMHg2OCwgMHgwOSwgMHgwYywgCisweDA2LCAweGQxLCAweDAwLCAweDY4LCAweDgwLCAweDBhLCAweDAzLCAweGQzLCAweDE0LCAweDQ4LCAweDAwLCAweDY4LCAKKzB4MDAsIDB4MGMsIDB4MDEsIDB4ZTAsIDB4MTMsIDB4NDgsIDB4ODAsIDB4NmMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIAorMHgxMiwgMHg0YiwgMHhjMCwgMHgxOCwgMHgwOCwgMHgyOCwgMHgwYiwgMHhkMiwgMHgwMSwgMHhhMywgMHgxYiwgMHg1YywgCisweDViLCAweDAwLCAweDlmLCAweDQ0LCAweDA1LCAweDAzLCAweDA3LCAweDAzLCAweDA3LCAweDA3LCAweDA1LCAweDAzLCAKKzB4MDMsIDB4MjAsIDB4MDIsIDB4ZTAsIDB4MDEsIDB4MjAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4MjAsIDB4MDEsIDB4MjEsIAorMHgzOCwgMHg2MCwgMHg4MCwgMHgwNywgMHgwMCwgMHhkMSwgMHgwMCwgMHgyMSwgMHgwOCwgMHgwNiwgMHgwMCwgMHgwZSwgCisweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDM0LCAweDZlLCAweDIxLCAweDQwLCAKKzB4MDAsIDB4MDAsIDB4MTEsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4NDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHhmZSwgMHg2NiwgMHhmZiwgMHhmZiwgMHhmMCwgMHhiNSwgMHg4MiwgMHhiMCwgCisweDA3LCAweDFjLCAweDAxLCAweDIwLCAweDAxLCAweDkwLCAweGZmLCAweGY3LCAweGU3LCAweGZlLCAweDAxLCAweDI4LCAKKzB4MTMsIDB4ZDEsIDB4MzgsIDB4MmYsIDB4MDEsIDB4ZDAsIDB4YTgsIDB4MmYsIDB4MDcsIDB4ZDEsIDB4MDAsIDB4MjYsIAorMHhmNiwgMHg0MywgMHgzNCwgMHgxYywgMHhhOCwgMHgyZiwgMHgwMiwgMHhkMSwgMHgzMCwgMHgxYywgMHgwMCwgMHg5NiwgCisweDM1LCAweDFjLCAweDExLCAweDIwLCAweDAwLCAweDA0LCAweDA2LCAweDYyLCAweDQ0LCAweDYyLCAweDg1LCAweDYyLCAKKzB4MDAsIDB4OTksIDB4YzAsIDB4NDYsIDB4YzEsIDB4NjIsIDB4MDAsIDB4MjEsIDB4MDgsIDB4NDgsIDB4YzAsIDB4NDYsIAorMHgwMSwgMHg2MCwgMHgzOCwgMHgyZiwgMHgwMSwgMHhkMCwgMHhhOCwgMHgyZiwgMHgwNSwgMHhkMSwgMHgwMSwgMHgyMSwgCisweDAxLCAweDYwLCAweGE4LCAweDJmLCAweDAxLCAweGQxLCAweDAzLCAweDIxLCAweDAxLCAweDYwLCAweDAxLCAweDk4LCAKKzB4MDIsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MzQsIDB4NmUsIDB4MjEsIDB4NDAsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg5MCwgMHhiNSwgMHgwNywgMHgxYywgCisweDEyLCAweDRjLCAweDIxLCAweDY4LCAweDEyLCAweDQ4LCAweDgxLCAweDQyLCAweDBiLCAweGQwLCAweDAwLCAweDIzLCAKKzB4MjEsIDB4MWMsIDB4ZTIsIDB4MWQsIDB4YzEsIDB4MzIsIDB4MDAsIDB4ZTAsIAorMHgwOCwgMHhjMSwgMHg5MSwgMHg0MiwgMHhmYywgMHhkMywgMHgyMCwgMHg2MCwgMHhjOCwgMHgyMCwgMHhhMCwgMHg4MCwgCisweDY3LCAweDcyLCAweDM4LCAweDAxLCAweDAwLCAweGYwLCAweDE4LCAweGY4LCAweDI3LCAweDcyLCAweDBhLCAweDQ4LCAKKzB4YzAsIDB4NDYsIDB4ZTAsIDB4NjAsIDB4MDksIDB4MmYsIDB4MDAsIDB4ZGIsIDB4MDAsIDB4MjcsIDB4ZTAsIDB4MTksIAorMHgwMSwgMHg3ZCwgMHgwMSwgMHgzMSwgMHgwMSwgMHg3NSwgMHhlMCwgMHg4OCwgMHgwMSwgMHgzMCwgMHhlMCwgMHg4MCwgCisweDAxLCAweDIwLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAKKzB4ZWUsIDB4ZmYsIDB4YzAsIDB4ZDAsIDB4MDgsIDB4MTAsIDB4MDAsIDB4MDMsIDB4ODAsIDB4YjQsIDB4MDgsIDB4NGEsIAorMHhkMSwgMHgxZCwgMHg4OSwgMHgzMSwgMHgwYiwgMHg3YSwgMHgyMCwgMHgyYiwgMHgwMSwgMHhkMywgMHgwMCwgMHgyMywgCisweDBiLCAweDcyLCAweDA3LCAweDFjLCAweDA4LCAweDdhLCAweDQzLCAweDFjLCAweDBiLCAweDcyLCAweDgwLCAweDE4LCAKKzB4OTAsIDB4MzAsIDB4NDcsIDB4NzIsIDB4ODAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIAorMHgwNywgMHg0OSwgMHgwMSwgMHgyMiwgMHgxMiwgMHgwNCwgMHgwOCwgMHg2OCwgMHgwMiwgMHg0MCwgMHgwMSwgMHgyMCwgCisweDAwLCAweDJhLCAweDA2LCAweGQxLCAweDBhLCAweDY4LCAweDEyLCAweDBjLCAweDAyLCAweGQxLCAweDA5LCAweDY4LCAKKzB4ODksIDB4MGEsIDB4MDAsIDB4ZDIsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIAorMHg5MCwgMHhiNSwgMHgwNywgMHgxYywgMHgwOSwgMHg0YywgMHgzOCwgMHgxYywgMHgyMSwgMHgxYywgMHhmYywgMHhmNywgCisweDkxLCAweGZmLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDBlLCAweGY4LCAweDAxLCAweDIzLCAweGQ4LCAweDQyLCAKKzB4MDEsIDB4ZDEsIDB4MDAsIDB4MGMsIDB4ZTAsIDB4ODAsIDB4MDAsIDB4MjEsIDB4MjAsIDB4MWMsIDB4ZmMsIDB4ZjcsIAorMHhjNSwgMHhmZSwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHhjNCwgMHg2NiwgMHgyMSwgMHg0MCwgCisweGY4LCAweGI1LCAweDA3LCAweDFjLCAweDc5LCAweDdhLCAweDc2LCAweDQ4LCAweDAwLCAweDIzLCAweDc2LCAweDRjLCAKKzB4MDEsIDB4MjksIDB4NWQsIDB4ZDEsIDB4YTIsIDB4ODgsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4YTEsIDB4ODksIAorMHg4YSwgMHg0MiwgMHg3NCwgMHhkYSwgMHhmYSwgMHg3YSwgMHgwMCwgMHgyYSwgMHgxNSwgMHhkMCwgMHg3YSwgMHg2YywgCisweDAwLCAweDJhLCAweDEyLCAweGQwLCAweDhhLCAweDQyLCAweDEwLCAweGQ4LCAweDAwLCAweDlhLCAweDUxLCAweDFjLCAKKzB4YTEsIDB4ODAsIDB4YTEsIDB4ODgsIDB4YzAsIDB4NDYsIDB4NDEsIDB4ODEsIDB4NzgsIDB4NmMsIDB4NmIsIDB4NGUsIAorMHhjMCwgMHg0NiwgMHhmMCwgMHg4MCwgMHhhMCwgMHg2YSwgMHg1OCwgMHgyMywgMHg3OSwgMHg2YywgMHg1OSwgMHg0MywgCisweDQwLCAweDE4LCAweGMxLCAweDFhLCAweDI4LCAweGUwLCAweDIyLCAweDg4LCAweDAxLCAweDMyLCAweDEyLCAweDA0LCAKKzB4MTIsIDB4MGMsIDB4MjIsIDB4ODAsIDB4OGEsIDB4NDIsIDB4MDAsIDB4ZGIsIDB4MjMsIDB4ODAsIDB4MDAsIDB4MjIsIAorMHgwMCwgMHgyOSwgMHg2OSwgMHhkZCwgMHg1ZiwgMHg0YywgMHhhNCwgMHg2YSwgMHg1ZSwgMHg0YiwgMHgxZCwgMHg4OCwgCisweDU4LCAweDIzLCAweDZiLCAweDQzLCAweGUzLCAweDE4LCAweGRlLCAweDFkLCAweDAxLCAweDM2LCAweDAxLCAweDIzLCAKKzB4OWIsIDB4MDcsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MWIsIDB4MDYsIDB4MTUsIDB4ZDEsIDB4NTgsIDB4NDksIAorMHgwMCwgMHg5YSwgMHgwMSwgMHgzMiwgMHg4YSwgMHg4MCwgMHg4YSwgMHg4OCwgMHhjMCwgMHg0NiwgMHg0MiwgMHg4MSwgCisweDA4LCAweDg4LCAweDAxLCAweDMwLCAweDU0LCAweDRlLCAweGMwLCAweDQ2LCAweGYwLCAweDgwLCAweDU4LCAweDIwLCAKKzB4NjgsIDB4NDMsIDB4MjEsIDB4MTgsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MzksIDB4ZmIsIDB4ZjAsIDB4ODgsIAorMHgwMCwgMHgwNCwgMHgwMCwgMHgxNCwgMHg5NSwgMHhlMCwgMHg0ZCwgMHg0YiwgMHgwMSwgMHgzNSwgMHgyZCwgMHgwNCwgCisweDJkLCAweDBjLCAweDFkLCAweDgwLCAweDhkLCAweDQyLCAweDAxLCAweGRiLCAweDAwLCAweDI1LCAweDFkLCAweDgwLCAKKzB4MDEsIDB4MzIsIDB4MTIsIDB4MDQsIDB4MTIsIDB4MTQsIDB4OTEsIDB4NDIsIDB4Y2UsIDB4ZGMsIDB4ODEsIDB4ZTAsIAorMHhlMSwgMHg4OCwgMHhlMiwgMHg4OSwgMHg5MSwgMHg0MiwgMHgxOCwgMHhkYSwgMHhmOSwgMHg3YSwgMHgwMCwgMHgyOSwgCisweDJmLCAweGQwLCAweDc5LCAweDZjLCAweDQ5LCAweDA0LCAweDQ5LCAweDBjLCAweDc5LCAweDY0LCAweDJhLCAweGQwLCAKKzB4ZTIsIDB4ODksIDB4OTEsIDB4NDIsIDB4MjcsIDB4ZDgsIDB4ZTEsIDB4ODgsIDB4MDEsIDB4MzEsIDB4ZTEsIDB4ODAsIAorMHhlMSwgMHg4OCwgMHhjMCwgMHg0NiwgMHg4MSwgMHg4MSwgMHgwMSwgMHgyMywgMHhkYiwgMHgwMywgMHg3OCwgMHg2YywgCisweDE4LCAweDQzLCAweDNhLCAweDRlLCAweGMwLCAweDQ2LCAweGYwLCAweDgwLCAweDAwLCAweGUwLCAweDYzLCAweGUwLCAKKzB4ZTAsIDB4NmEsIDB4NzksIDB4NmMsIDB4NGIsIDB4MDAsIDB4NTksIDB4MTgsIDB4NDksIDB4MDEsIDB4NDAsIDB4MTgsIAorMHhjMSwgMHgxZiwgMHg1OSwgMHgzOSwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwZiwgMHhmYiwgMHhlMCwgMHg2YSwgCisweDc5LCAweDZjLCAweDRhLCAweDAwLCAweDUyLCAweDE4LCAweDUyLCAweDAxLCAweDgwLCAweDE4LCAweDAxLCAweDM5LCAKKzB4MDksIDB4MDQsIDB4MDksIDB4MGMsIDB4NjAsIDB4MzgsIDB4MDAsIDB4ZjAsIDB4ODksIDB4ZmIsIDB4YjYsIDB4ZTcsIAorMHg0YSwgMHhlMCwgMHg2MSwgMHg4OCwgMHgwMSwgMHgzMSwgMHgwOSwgMHgwNCwgCisweDA5LCAweDBjLCAweDYxLCAweDgwLCAweGUyLCAweDg5LCAweDkxLCAweDQyLCAweDAwLCAweGRiLCAweDYzLCAweDgwLCAKKzB4MDAsIDB4MjEsIDB4MDAsIDB4MmEsIDB4M2UsIDB4ZGQsIDB4MjQsIDB4NGMsIDB4ZTQsIDB4NmEsIDB4MjMsIDB4NGIsIAorMHg1ZCwgMHg4OCwgMHg2YiwgMHgwMCwgMHg1YiwgMHgxOSwgMHg1YiwgMHgwMSwgMHhlMywgMHgxOCwgMHhkZSwgMHgxZCwgCisweDAxLCAweDM2LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDMzLCAweDQzLCAweDFiLCAweDY4LCAweDFiLCAweDA2LCAKKzB4MjAsIDB4ZDEsIDB4MWMsIDB4NGUsIDB4ZjEsIDB4ODgsIDB4MDEsIDB4MzEsIDB4ZjEsIDB4ODAsIDB4ZjEsIDB4ODgsIAorMHhjMCwgMHg0NiwgMHg4MSwgMHg4MSwgMHg3MCwgMHg4OCwgMHgwMSwgMHgyMywgMHhkYiwgMHgwMywgMHgwMSwgMHgzMCwgCisweDE4LCAweDQzLCAweDE3LCAweDQ5LCAweGMwLCAweDQ2LCAweGM4LCAweDgwLCAweDY4LCAweDAwLCAweDQwLCAweDE5LCAKKzB4NDAsIDB4MDEsIDB4MjEsIDB4MTgsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4Y2YsIDB4ZmEsIDB4NzEsIDB4ODgsIAorMHg0YSwgMHgwMCwgMHg1MiwgMHgxOCwgMHg1MiwgMHgwMSwgMHhmMCwgMHg2YSwgMHg4MCwgMHgxOCwgMHgwMCwgMHhmMCwgCisweDRkLCAweGZiLCAweDBlLCAweDQ5LCAweGM4LCAweDg4LCAweDc5LCAweGU3LCAweDBiLCAweDRiLCAweDAxLCAweDM1LCAKKzB4MmQsIDB4MDQsIDB4MmQsIDB4MGMsIDB4NWQsIDB4ODAsIDB4OTUsIDB4NDIsIDB4MDEsIDB4ZGIsIDB4MDAsIDB4MjUsIAorMHg1ZCwgMHg4MCwgMHgwMSwgMHgzMSwgMHgwOSwgMHgwNCwgMHgwOSwgMHgxNCwgMHg4YSwgMHg0MiwgMHhjMiwgMHhkYywgCisweDAxLCAweDg5LCAweDAxLCAweDMxLCAweDAxLCAweDgxLCAweDAwLCAweDIwLCAweGMwLCAweDQzLCAweGY4LCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NGMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4NGMsIDB4MmEsIDB4MDAsIDB4ODAsIAorMHhjNCwgMHg2NiwgMHgyMSwgMHg0MCwgMHhmMCwgMHhiNCwgMHgwNiwgMHgxYywgMHgwMSwgMHgyMywgMHhkYiwgMHgwMywgCisweDMzLCAweDQwLCAweDAxLCAweDI0LCAweDQ0LCAweDRmLCAweDAwLCAweDIwLCAweDQ0LCAweDRhLCAweDQ1LCAweDRkLCAKKzB4ZDEsIDB4MWQsIDB4MzksIDB4MzEsIDB4MDAsIDB4MmIsIDB4NDEsIDB4ZDAsIDB4ZTMsIDB4MDMsIDB4ZjMsIDB4MWEsIAorMHg3MywgMHhkMCwgMHhlZSwgMHg4OSwgMHg5ZSwgMHg0MiwgMHg3MSwgMHhkMywgMHhlZSwgMHg4OCwgMHgwMCwgMHgyZSwgCisweDZkLCAweGQwLCAweGVkLCAweDZhLCAweDVlLCAweDFlLCAweDczLCAweDAwLCAweDliLCAweDE5LCAweDViLCAweDAxLCAKKzB4ZWQsIDB4MTgsIDB4YWUsIDB4NjgsIDB4MzYsIDB4MDYsIDB4MzYsIDB4MGUsIDB4MDMsIDB4MmUsIDB4MDIsIDB4ZDAsIAorMHhjZSwgMHg4OSwgMHgwMSwgMHgzNiwgMHhjZSwgMHg4MSwgMHg0MCwgMHgzNSwgMHhhZCwgMHg4YiwgMHhhZCwgMHgwMCwgCisweDM1LCAweDRlLCAweDc2LCAweDZhLCAweGMwLCAweDQ2LCAweDcwLCAweDUxLCAweDU1LCAweDg5LCAweDAxLCAweDM1LCAKKzB4NTUsIDB4ODEsIDB4MzIsIDB4NGUsIDB4ZjIsIDB4NmEsIDB4ZDIsIDB4MTgsIDB4OTAsIDB4NjAsIDB4ZjIsIDB4NmEsIAorMHhkMiwgMHgxOCwgMHg5MCwgMHg2MywgMHhmMiwgMHg2YSwgMHhkMiwgMHgxOCwgMHhkMCwgMHg2MywgMHhmMiwgMHg2YSwgCisweGQyLCAweDE4LCAweDEwLCAweDY0LCAweGYyLCAweDZhLCAweGQyLCAweDE4LCAweDUwLCAweDY0LCAweGYyLCAweDZhLCAKKzB4ZDIsIDB4MTgsIDB4OTAsIDB4NjQsIDB4ZjIsIDB4NmEsIDB4ZDIsIDB4MTgsIDB4ZDAsIDB4NjQsIDB4ZjAsIDB4ODgsIAorMHgwMSwgMHgzOCwgMHhmMCwgMHg4MCwgMHhmMCwgMHg4OCwgMHhjMCwgMHg0NiwgMHg4OCwgMHg4MSwgMHgyNCwgMHg0OSwgCisweDAwLCAweDI4LCAweDM5LCAweGQxLCAweDRmLCAweDgwLCAweDM3LCAweGUwLCAweDAwLCAweDJlLCAweDM4LCAweGQ5LCAKKzB4YWIsIDB4ODksIDB4YjMsIDB4NDIsIDB4MzAsIDB4ZDMsIDB4YWIsIDB4ODgsIDB4MDAsIDB4MmIsIDB4MmMsIDB4ZDAsIAorMHg1MywgMHg4OSwgMHgwMSwgMHgzMywgMHg1MywgMHg4MSwgMHgyYSwgMHgxYywgMHhhZCwgMHg2YSwgMHg1OCwgMHgyMywgCisweDAxLCAweDNlLCAweDczLCAweDQzLCAweGVkLCAweDE4LCAweGFlLCAweDY4LCAweDM2LCAweDA2LCAweDM2LCAweDBlLCAKKzB4MDMsIDB4MmUsIDB4MDIsIDB4ZDAsIDB4Y2UsIDB4ODksIDB4MDEsIDB4MzYsIDB4Y2UsIDB4ODEsIDB4YTgsIDB4NjAsIAorMHg5NSwgMHg2YSwgMHhlZCwgMHgxOCwgMHhhOCwgMHg2MywgMHg5NSwgMHg2YSwgMHhlZCwgMHgxOCwgMHhlOCwgMHg2MywgCisweDk1LCAweDZhLCAweGVkLCAweDE4LCAweDI4LCAweDY0LCAweDk1LCAweDZhLCAweGVkLCAweDE4LCAweDY4LCAweDY0LCAKKzB4OTUsIDB4NmEsIDB4ZWQsIDB4MTgsIDB4YTgsIDB4NjQsIDB4OTUsIDB4NmEsIDB4ZWIsIDB4MTgsIDB4ZDgsIDB4NjQsIAorMHg5MCwgMHg4OCwgMHgwMSwgMHgzOCwgMHg5MCwgMHg4MCwgMHg5MCwgMHg4OCwgMHhjMCwgMHg0NiwgMHg0OCwgMHg4MSwgCisweDAwLCAweDI4LCAweDAzLCAweGQxLCAweDAxLCAweGUwLCAweDA0LCAweGUwLCAweDAzLCAweGUwLCAweDE3LCAweDgwLCAKKzB4MjAsIDB4MWMsIDB4ZjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4Y2EsIDB4ODksIDB4MDEsIDB4MzIsIDB4Y2EsIDB4ODEsIAorMHhmOSwgMHhlNywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgCisweDRjLCAweDJhLCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweDAwLCAweDIxLCAweDQxLCAweDYwLCAweDEwLCAweDQ5LCAKKzB4NGEsIDB4NjgsIDB4MDAsIDB4MmEsIDB4MTAsIDB4ZDEsIDB4Y2EsIDB4NjgsIDB4MDAsIDB4MmEsIDB4MDQsIDB4ZDAsIAorMHhjYSwgMHgxZCwgMHgxOSwgMHgzMiwgMHgxMiwgMHg3OSwgMHgwMCwgMHgyYSwgMHgwOCwgMHhkMCwgMHg0YSwgMHg2OSwgCisweDAwLCAweDJhLCAweDBiLCAweGQxLCAweDg4LCAweDYxLCAweDQ4LCAweDYxLCAKKzB4MDAsIDB4ZjAsIDB4MTAsIDB4ZjgsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NGEsIDB4NjksIDB4MDAsIDB4MmEsIAorMHgwMiwgMHhkMSwgMHg4OCwgMHg2MSwgMHg0OCwgMHg2MSwgMHhmNywgMHhlNywgMHg4YSwgMHg2OSwgMHhjMCwgMHg0NiwgCisweDUwLCAweDYwLCAweDg4LCAweDYxLCAweGYyLCAweGU3LCAweDAwLCAweDAwLCAweDZjLCAweDA2LCAweDAwLCAweDgwLCAKKzB4YjAsIDB4YjUsIDB4MmEsIDB4NDgsIDB4NDAsIDB4NjksIDB4MDAsIDB4MjgsIDB4NGMsIDB4ZDAsIDB4MDgsIDB4MjIsIAorMHhjMSwgMHg2OCwgMHgwYSwgMHg0MCwgMHgwMCwgMHgyNywgMHgyNywgMHg0YiwgMHhkOSwgMHgxZCwgMHhiOSwgMHgzMSwgCisweDAwLCAweDJhLCAweDExLCAweGQwLCAweDA0LCAweDIyLCAweDI1LCAweDRjLCAweGMwLCAweDQ2LCAweDBjLCAweDYxLCAKKzB4MjQsIDB4NGMsIDB4YzAsIDB4NDYsIDB4NGMsIDB4NjIsIDB4MjQsIDB4NGMsIDB4YzAsIDB4NDYsIDB4OGMsIDB4NjIsIAorMHgyMywgMHg0YywgMHhjMCwgMHg0NiwgMHhjYywgMHg2MiwgMHgyMywgMHg0YywgMHhjMCwgMHg0NiwgMHgwYywgMHg2MywgCisweDRmLCAweDYzLCAweDEyLCAweGUwLCAweDA1LCAweDIyLCAweDIxLCAweDRjLCAweGMwLCAweDQ2LCAweDBjLCAweDYxLCAKKzB4MjAsIDB4NGMsIDB4YzAsIDB4NDYsIDB4NGMsIDB4NjIsIDB4MjAsIDB4NGMsIDB4YzAsIDB4NDYsIDB4OGMsIDB4NjIsIAorMHgxZiwgMHg0YywgMHhjMCwgMHg0NiwgMHhjYywgMHg2MiwgMHgxZiwgMHg0YywgMHhjMCwgMHg0NiwgMHgwYywgMHg2MywgCisweDFlLCAweDRjLCAweGMwLCAweDQ2LCAweDRjLCAweDYzLCAweDQwLCAweDI0LCAweGNjLCAweDgyLCAweDRmLCAweDgzLCAKKzB4MWMsIDB4NGYsIDB4MDAsIDB4MjEsIDB4MDAsIDB4MmEsIDB4MGMsIDB4ZDksIDB4OGMsIDB4MDAsIDB4MDUsIDB4MTksIAorMHg2ZCwgMHg2YSwgMHg3ZCwgMHg0MCwgMHhlNCwgMHgxOCwgMHhmZiwgMHgzNCwgMHgwMSwgMHgzNCwgMHg2NSwgMHg2MiwgCisweDAxLCAweDMxLCAweDkxLCAweDQyLCAweGY0LCAweGQzLCAweDEwLCAweDI5LCAweDA3LCAweGQyLCAweDhhLCAweDAwLCAKKzB4ZDIsIDB4MTgsIDB4ZmYsIDB4MzIsIDB4MDEsIDB4MzIsIDB4NTcsIDB4NjIsIDB4MDEsIDB4MzEsIDB4MTAsIDB4MjksIAorMHhmNywgMHhkMywgMHgxMSwgMHg0OSwgMHgwMCwgMHhmMCwgMHgyMiwgMHhmOCwgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDZjLCAweDA2LCAweDAwLCAweDgwLCAweGFjLCAweGFiLCAweDIwLCAweDQwLCAKKzB4MjgsIDB4MDEsIDB4NDAsIDB4MDAsIDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsIAorMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCwgMHgyMCwgMHgwMSwgMHg0MCwgMHgwMCwgCisweDY3LCAweDQ1LCAweDIzLCAweDAxLCAweGVmLCAweGNkLCAweGFiLCAweDg5LCAweDk4LCAweGJhLCAweGRjLCAweGZlLCAKKzB4MTAsIDB4MzIsIDB4NTQsIDB4NzYsIDB4YzMsIDB4ZDIsIDB4ZTEsIDB4ZjAsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorMHgzMCwgMHg4MCwgMHgyMCwgMHg0MCwgMHhiMCwgMHhiNSwgMHgwZiwgMHgxYywgMHgxNSwgMHg0ZCwgMHhlOSwgMHgxZCwgCisweGM5LCAweDMxLCAweDE1LCAweDRjLCAweDIzLCAweDFjLCAweDE1LCAweDRhLCAweDAwLCAweDIwLCAweGZjLCAweGY3LCAKKzB4NDQsIDB4ZmIsIDB4ZTksIDB4MWQsIDB4ZmYsIDB4MzEsIDB4MWUsIDB4MzEsIDB4MjMsIDB4MWMsIDB4MGQsIDB4MWMsIAorMHgxMSwgMHg0YSwgMHgwMSwgMHgyMCwgMHhmYywgMHhmNywgMHgzYiwgMHhmYiwgMHgyOSwgMHgxYywgMHgyMywgMHgxYywgCisweDBlLCAweDRhLCAweDAwLCAweDIwLCAweGZjLCAweGY3LCAweDM1LCAweGZiLCAweDM5LCAweDFjLCAweDIzLCAweDFjLCAKKzB4MGMsIDB4NGEsIDB4MDEsIDB4MjAsIDB4ZmMsIDB4ZjcsIDB4MmYsIDB4ZmIsIDB4MDAsIDB4MjEsIDB4MGIsIDB4NDgsIAorMHhjMiwgMHgxZCwgMHgxOSwgMHgzMiwgMHg1MSwgMHg3MSwgMHgwMSwgMHgyMSwgMHhmZiwgMHgzMCwgMHgwMSwgMHgzMCwgCisweDQxLCAweDYyLCAweDA4LCAweDFjLCAweGIwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAKKzB4YWMsIDB4YWIsIDB4MjAsIDB4NDAsIDB4NzUsIDB4MDgsIDB4ZmYsIDB4ZmYsIDB4MjgsIDB4MDAsIDB4MDMsIDB4MDAsIAorMHg0MCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwNywgMHgwMCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgCisweGYwLCAweGI1LCAweDM3LCAweDRhLCAweDUwLCAweDY5LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDA4LCAweDMwLCAKKzB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIDB4MDEsIDB4MDYsIDB4MDksIDB4MGUsIDB4MzMsIDB4NGIsIDB4MDEsIDB4MjksIAorMHg0OSwgMHhkMSwgMHgxZiwgMHg2OCwgMHgxOSwgMHgxYywgMHgzMiwgMHg0YiwgMHg5ZiwgMHg0MiwgMHgwNCwgMHhkMSwgCisweGZmLCAweGY3LCAweDNlLCAweGZmLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDIzLCAKKzB4OWYsIDB4MDAsIDB4Y2MsIDB4NTksIDB4NTUsIDB4NjksIDB4ZWYsIDB4MTksIDB4M2MsIDB4NjEsIDB4MDEsIDB4MzMsIAorMHgwNSwgMHgyYiwgMHhmNywgMHhkMywgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMiwgMHgwMiwgMHgyMywgMHgxOCwgMHg0MywgCisweDUzLCAweDY5LCAweGMwLCAweDQ2LCAweDk4LCAweDYwLCAweDUwLCAweDY5LCAweDA4LCAweDIzLCAweGMyLCAweDY4LCAKKzB4MTMsIDB4NDAsIDB4MjUsIDB4NGYsIDB4ZmEsIDB4MWQsIDB4YjksIDB4MzIsIDB4MDAsIDB4MmIsIDB4MDIsIDB4ZDAsIAorMHgwNCwgMHgyMywgMHgyMywgMHg0YywgMHgwMSwgMHhlMCwgMHgwNSwgMHgyMywgMHgyMiwgMHg0YywgMHhjMCwgMHg0NiwgCisweDE0LCAweDYxLCAweDQwLCAweDI0LCAweGQ0LCAweDgyLCAweDAwLCAweDI0LCAweDU0LCAweDgzLCAweDIwLCAweDRjLCAKKzB4MDAsIDB4MjIsIDB4MDAsIDB4MmIsIDB4MGMsIDB4ZDksIDB4OTUsIDB4MDAsIAorMHg0NiwgMHgxOSwgMHg3NiwgMHg2YSwgMHg2NiwgMHg0MCwgMHhlZCwgMHgxOSwgMHhmZiwgMHgzNSwgMHgwMSwgMHgzNSwgCisweDZlLCAweDYyLCAweDAxLCAweDMyLCAweDlhLCAweDQyLCAweGY0LCAweGQzLCAweDEwLCAweDJhLCAweDA3LCAweGQyLCAKKzB4OTMsIDB4MDAsIDB4ZGIsIDB4MTksIDB4ZmYsIDB4MzMsIDB4MDEsIDB4MzMsIDB4NWMsIDB4NjIsIDB4MDEsIDB4MzIsIAorMHgxMCwgMHgyYSwgMHhmNywgMHhkMywgMHhmZiwgMHhmNywgMHg3MCwgMHhmZiwgMHhiYywgMHhlNywgMHgwMCwgMHgyMSwgCisweDhmLCAweDAwLCAweGRjLCAweDU5LCAweDU1LCAweDY5LCAweGVmLCAweDE5LCAweDdjLCAweDYyLCAweDAxLCAweDMxLCAKKzB4MDUsIDB4MjksIDB4ZjcsIDB4ZDMsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDIsIDB4MDMsIDB4MjMsIDB4MTgsIDB4NDMsIAorMHg1MSwgMHg2OSwgMHhjMCwgMHg0NiwgMHg4OCwgMHg2MCwgMHg1MCwgMHg2OSwgMHg0MCwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDUwLCAweDYxLCAweDA5LCAweDQ4LCAweGZjLCAweGY3LCAweGE0LCAweGZhLCAweGE0LCAweGU3LCAweDAwLCAweDAwLCAKKzB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIDB4MzAsIDB4ODAsIDB4MjAsIDB4NDAsIDB4NjcsIDB4NDUsIDB4MjMsIDB4MDEsIAorMHhhYywgMHhhYiwgMHgyMCwgMHg0MCwgMHgyOCwgMHgwMSwgMHg0MCwgMHgwMCwgMHgyMCwgMHgwMSwgMHg0MCwgMHgwMCwgCisweDVjLCAweDVjLCAweDVjLCAweDVjLCAweDExLCAweDMxLCAweGZmLCAweGZmLCAweGYwLCAweGI1LCAweDA3LCAweDFjLCAKKzB4M2IsIDB4NDgsIDB4M2MsIDB4NGMsIDB4MDgsIDB4MjEsIDB4MjAsIDB4NjAsIDB4YTEsIDB4ODAsIDB4MDAsIDB4MjAsIAorMHgyMCwgMHg4MSwgMHhlMSwgMHg4MCwgMHg2MCwgMHg4MSwgMHgzOSwgMHg0OCwgMHhjMCwgMHg0NiwgMHhlMCwgMHg2MCwgCisweDM4LCAweDQ4LCAweGMwLCAweDQ2LCAweDIwLCAweDYxLCAweDM4LCAweDQ4LCAweGMwLCAweDQ2LCAweDYwLCAweDYxLCAKKzB4MzcsIDB4NDgsIDB4YzAsIDB4NDYsIDB4YTAsIDB4NjEsIDB4MzcsIDB4NDgsIDB4YzAsIDB4NDYsIDB4ZTAsIDB4NjEsIAorMHgzNiwgMHg0OCwgMHhjMCwgMHg0NiwgMHgyMCwgMHg2MiwgMHgzNiwgMHg0OCwgMHhjMCwgMHg0NiwgMHg2MCwgMHg2MiwgCisweDM1LCAweDQ4LCAweGMwLCAweDQ2LCAweGEwLCAweDYyLCAweDM1LCAweDQ4LCAweGMwLCAweDQ2LCAweGUwLCAweDYyLCAKKzB4MzQsIDB4NDgsIDB4YzAsIDB4NDYsIDB4MjAsIDB4NjMsIDB4MzQsIDB4NDgsIDB4YzAsIDB4NDYsIDB4NjAsIDB4NjMsIAorMHgzMywgMHg0OCwgMHhjMCwgMHg0NiwgMHhhMCwgMHg2MywgMHgzMywgMHg0OCwgMHhjMCwgMHg0NiwgMHhlMCwgMHg2MywgCisweDMyLCAweDQ4LCAweGMwLCAweDQ2LCAweDIwLCAweDY0LCAweDMyLCAweDQ4LCAweGMwLCAweDQ2LCAweDYwLCAweDY0LCAKKzB4MzEsIDB4NDgsIDB4YzAsIDB4NDYsIDB4YTAsIDB4NjQsIDB4MzEsIDB4NDgsIDB4YzAsIDB4NDYsIDB4ZTAsIDB4NjQsIAorMHgzMCwgMHg0OCwgMHhjMCwgMHg0NiwgMHgyMCwgMHg2NSwgMHgzMCwgMHg0OSwgMHhjOCwgMHg2OCwgMHgwMiwgMHgwNCwgCisweDg5LCAweDY5LCAweDRhLCAweDQwLCAweGUzLCAweDFkLCAweDc5LCAweDMzLCAweDA5LCAweDA0LCAweGM5LCAweDQzLCAKKzB4YzAsIDB4NDMsIDB4NDgsIDB4NDAsIDB4ZTEsIDB4MWQsIDB4YjksIDB4MzEsIDB4ZGEsIDB4NjMsIDB4MDgsIDB4NjAsIAorMHgyOSwgMHg0ZCwgMHgyMSwgMHgxYywgMHgyYiwgMHgxYywgMHgyOSwgMHg0YSwgMHgwMCwgMHgyMCwgMHhmYywgMHhmNywgCisweDNlLCAweGZhLCAweDI4LCAweDRhLCAweGUxLCAweDFkLCAweGI1LCAweDMxLCAweDAxLCAweDIwLCAweDJiLCAweDFjLCAKKzB4MGUsIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4MzYsIDB4ZmEsIDB4MjQsIDB4NGEsIDB4MDAsIDB4MjAsIDB4MzEsIDB4MWMsIAorMHgyYiwgMHgxYywgMHhmYywgMHhmNywgMHgzMCwgMHhmYSwgMHhlMSwgMHgxZCwgMHg0ZCwgMHgzMSwgMHgyYiwgMHgxYywgCisweDIwLCAweDRhLCAweDAxLCAweDIwLCAweGZjLCAweGY3LCAweDI5LCAweGZhLCAweGUwLCAweDFkLCAweDVkLCAweDMwLCAKKzB4MDEsIDB4NjgsIDB4MDAsIDB4MjksIDB4ZmMsIDB4ZDAsIDB4NjAsIDB4NmQsIDB4YzAsIDB4NDYsIDB4MzgsIDB4NjUsIAorMHgyMCwgMHg2ZSwgMHhjMCwgMHg0NiwgMHg3OCwgMHg2NSwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDgwLCAweDAwLCAweDA4LCAweDAwLCAweDhjLCAweGI5LCAweDIwLCAweDQwLCAweDgxLCAweDgxLCAweDQ4LCAweGJkLCAKKzB4NzksIDB4NTYsIDB4MjMsIDB4OGMsIDB4OTMsIDB4MGMsIDB4ODIsIDB4OTUsIDB4MWQsIDB4MGUsIDB4MTIsIDB4Y2YsIAorMHg5YiwgMHgzYiwgMHhjMCwgMHhlOSwgMHhlNiwgMHg1NSwgMHg3YywgMHg4MiwgMHg5OSwgMHhmNiwgMHg3OCwgMHgwMiwgCisweGQxLCAweGQ3LCAweDI1LCAweDczLCAweDcyLCAweDhjLCAweDMzLCAweDEwLCAweGY3LCAweDAzLCAweGYxLCAweDQyLCAKKzB4NmMsIDB4OWIsIDB4NGEsIDB4YTcsIDB4ODIsIDB4OGUsIDB4MjMsIDB4YTksIDB4OTAsIDB4YjEsIDB4ODIsIDB4OGUsIAorMHhkYywgMHgzZiwgMHhmYiwgMHgyOSwgMHgwMCwgMHg2MiwgMHgyMiwgMHg0NSwgMHg4OCwgMHgyYiwgMHhmMSwgMHg4NSwgCisweDEyLCAweDYxLCAweGQxLCAweDczLCAweDZlLCAweGIxLCAweDExLCAweDE2LCAweDA4LCAweDgzLCAweDIwLCAweDQwLCAKKzB4NzUsIDB4MDgsIDB4ZmYsIDB4ZmYsIDB4NTQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDIsIDB4MDAsIAorMHgxNCwgMHgwMCwgMHgwMywgMHgwMCwgMHg4MCwgMHhiNSwgMHgwZiwgMHgxYywgMHgzOSwgMHgxYywgMHgwMCwgMHhmMCwgCisweDMzLCAweGY4LCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDRjLCAweGZmLCAweDAzLCAweDQ4LCAweDAxLCAweDg5LCAKKzB4MDEsIDB4MzEsIDB4MDEsIDB4ODEsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgMHg5MCwgMHhiNSwgMHgwNCwgMHgxYywgCisweDBmLCAweDFjLCAweDIwLCAweDFjLCAweDM5LCAweDFjLCAweDAwLCAweGYwLCAweDFmLCAweGY4LCAweGUwLCAweDY4LCAKKzB4MDEsIDB4MGUsIDB4ZmYsIDB4MjIsIDB4MTIsIDB4MDQsIDB4MDIsIDB4NDAsIDB4MTIsIDB4MGEsIDB4MTEsIDB4NDMsIAorMHhmZiwgMHgyMiwgMHgxMiwgMHgwMiwgMHgwMiwgMHg0MCwgMHgxMiwgMHgwMiwgMHgxMSwgMHg0MywgMHgwMCwgMHgwNiwgCisweDA4LCAweDQzLCAweDM4LCAweDY1LCAweDIwLCAweDY5LCAweGMwLCAweDQ2LCAweDc4LCAweDY1LCAweDYwLCAweDY5LCAKKzB4YzAsIDB4NDYsIDB4YjgsIDB4NjUsIDB4MDMsIDB4NDgsIDB4MDEsIDB4ODksIDB4MDEsIDB4MzEsIDB4MDEsIDB4ODEsIAorMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgCisweDkwLCAweGI1LCAweDAwLCAweDIyLCAweDkzLCAweDAwLCAweDFmLCAweDE4LCAweGJmLCAweDY5LCAweDViLCAweDE4LCAKKzB4NWYsIDB4NjIsIDB4MDEsIDB4MzIsIDB4MDUsIDB4MmEsIDB4ZjcsIDB4ZDMsIDB4MDcsIDB4N2EsIDB4ZmIsIDB4MDgsIAorMHgwMywgMHhkMywgMHgwMCwgMHgyMywgMHg5MiwgMHgwMCwgMHg1MiwgMHgxOCwgMHgxMywgMHg2MiwgMHgwNywgMHg2YiwgCisweGMwLCAweDQ2LCAweDhmLCAweDYzLCAweGM3LCAweDZhLCAweGMwLCAweDQ2LCAweGNmLCAweDYzLCAweDg3LCAweDZiLCAKKzB4YzAsIDB4NDYsIDB4MGYsIDB4NjQsIDB4NDcsIDB4NmIsIDB4YzAsIDB4NDYsIDB4NGYsIDB4NjQsIDB4MDcsIDB4NmMsIAorMHhjMCwgMHg0NiwgMHg4ZiwgMHg2NCwgMHhjMiwgMHg2YiwgMHhjMCwgMHg0NiwgMHhjYSwgMHg2NCwgMHhjMiwgMHg4OCwgCisweGMwLCAweDQ2LCAweDBhLCAweDgwLCAweDgyLCAweDdhLCAweDEyLCAweDA2LCAweDAzLCAweDdhLCAweDFiLCAweDA0LCAKKzB4MWEsIDB4NDMsIDB4YzMsIDB4ODgsIDB4MWIsIDB4MDIsIDB4MWEsIDB4NDMsIDB4NDMsIDB4N2EsIDB4ZGIsIDB4MDcsIAorMHgxYSwgMHg0MywgMHg4YSwgMHg2MCwgMHgxNywgMHgxYywgMHg4MywgMHg3YSwgMHg1YSwgMHgwOCwgMHgwNSwgMHhkMywgCisweDE0LCAweDIyLCAweDFjLCAweDFjLCAweGEzLCAweDA4LCAweDAyLCAweGQyLCAweDE1LCAweDIyLCAweDAwLCAweGUwLCAKKzB4MDAsIDB4MjIsIDB4MDAsIDB4N2EsIDB4NDMsIDB4MDgsIDB4MTAsIDB4ZDMsIDB4YzAsIDB4MDgsIDB4MDIsIDB4ZDMsIAorMHg4OCwgMHgyMCwgMHgxMCwgMHg0MywgMHgwMSwgMHhlMCwgMHg4MCwgMHgyMCwgMHgxMCwgMHg0MywgMHgzYSwgMHgwYSwgCisweDEyLCAweDAyLCAweDAxLCAweDIzLCAweDFhLCAweDQzLCAweGM4LCAweDYwLCAweDhhLCAweDYwLCAweDA4LCAweDFjLCAKKzB4ZmYsIDB4ZjcsIDB4NzgsIDB4ZmQsIDB4MDUsIDB4ZTAsIDB4MzgsIDB4MGEsIDB4MDAsIDB4MDIsIDB4MDMsIDB4MjMsIAorMHgxOCwgMHg0MywgMHg4OCwgMHg2MCwgMHhjYSwgMHg2MCwgMHgwMywgMHg0OCwgMHgwMSwgMHg4OSwgMHgwMSwgMHgzMSwgCisweDAxLCAweDgxLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAKKzB4ZjAsIDB4YjQsIDB4MDIsIDB4NmQsIDB4MTQsIDB4NGMsIDB4MTUsIDB4MWMsIDB4ZTcsIDB4NjksIDB4YmQsIDB4NDAsIAorMHgxMywgMHgxYywgMHgyNiwgMHg2YSwgMHhmMywgMHg0MCwgMHg1ZCwgMHg0MCwgMHgyZSwgMHgxYywgMHg0NSwgMHg2ZCwgCisweGJkLCAweDQwLCAweDZlLCAweDQwLCAweDJiLCAweDFjLCAweDM1LCAweDFjLCAweGZkLCAweDQwLCAweDJmLCAweDFjLCAKKzB4YmIsIDB4MDAsIDB4NjUsIDB4NmEsIDB4ZWIsIDB4NTgsIDB4MDAsIDB4MmIsIDB4MDgsIDB4ZDAsIDB4MjMsIDB4NjksIAorMHgwMSwgMHgzNywgMHg5ZiwgMHg0MiwgMHgwMCwgMHhkMywgMHgwMCwgMHgyNywgMHhiZSwgMHgwMCwgMHhhZSwgMHg1OSwgCisweDAwLCAweDJlLCAweGY3LCAweGQxLCAweGE0LCAweDY5LCAweGEyLCAweDQwLCAweDExLCAweDQzLCAweDA1LCAweDRiLCAKKzB4MTksIDB4NDMsIDB4YmEsIDB4MDAsIDB4YTksIDB4NTAsIDB4NDAsIDB4MzAsIDB4ODcsIDB4ODMsIDB4ZjAsIDB4YmMsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgCisweDgwLCAweGI0LCAweDAwLCAweDIyLCAweDAwLCAweDIzLCAweDAwLCAweDI5LCAweDA1LCAweGQ5LCAweDA3LCAweDc4LCAKKzB4N2EsIDB4NDAsIDB4MDEsIDB4MzAsIDB4MDEsIDB4MzMsIDB4OGIsIDB4NDIsIDB4ZjksIDB4ZDMsIDB4ZDAsIDB4NDMsIAorMHgwMCwgMHgwNiwgMHgwMCwgMHgwZSwgMHg4MCwgMHhiYywgMHg3MCwgMHg0NywgMHhmMCwgMHhiNSwgMHgwNywgMHgxYywgCisweDAwLCAweDI0LCAweGZmLCAweDI2LCAweDA5LCAweDM2LCAweDIwLCAweDFjLCAweDAwLCAweGYwLCAweDlhLCAweGY4LCAKKzB4MDAsIDB4ZjAsIDB4YjgsIDB4ZjksIDB4MDUsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4YzcsIDB4ZmEsIDB4M2QsIDB4NzAsIAorMHgyOCwgMHgxYywgMHgwMSwgMHgzNywgMHgwMSwgMHgzNCwgMHhiNCwgMHg0MiwgMHhmMSwgMHhkMywgMHhmMCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDgwLCAweGI1LCAweDAwLCAweGYwLCAweDkzLCAweGY4LCAweDAwLCAweGYwLCAKKzB4YTcsIDB4ZjksIDB4MDcsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4YjYsIDB4ZmEsIDB4MzgsIDB4MGEsIDB4ZjYsIDB4ZDMsIAorMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHhmMywgMHhiNSwgMHg4MiwgMHhiMCwgMHgwMiwgMHg5OCwgCisweDQxLCAweDAyLCAweDUzLCAweDIwLCAweDAwLCAweGYwLCAweDY0LCAweGY4LCAweDAwLCAweGYwLCAweGE4LCAweGZhLCAKKzB4ZmYsIDB4ZjcsIDB4ZTgsIDB4ZmYsIDB4MDAsIDB4MjQsIDB4MDAsIDB4MjAsIDB4MDEsIDB4OTAsIDB4MmUsIDB4MjAsIAorMHgwMCwgMHg5MCwgMHgwMCwgMHgyNSwgMHgwMCwgMHgyNywgMHgwMiwgMHg5OCwgMHgwMSwgMHgyOCwgMHgwNCwgMHhkMSwgCisweDAwLCAweDk4LCAweDg0LCAweDQyLCAweDAxLCAweGQzLCAweDAwLCAweDI2LCAKKzB4MDksIDB4ZTAsIDB4MDEsIDB4OTgsIDB4NDEsIDB4MWMsIDB4MDEsIDB4OTEsIDB4MDAsIDB4ZjAsIDB4NjAsIDB4ZjgsIAorMHgwMCwgMHhmMCwgMHg3ZSwgMHhmOSwgMHgwNiwgMHgxYywgMHgwMCwgMHhmMCwgMHg4ZCwgMHhmYSwgMHhmOCwgMHgwMCwgCisweDg2LCAweDQwLCAweDM1LCAweDQzLCAweDAxLCAweDM0LCAweDAxLCAweDM3LCAweDA0LCAweDJmLCAweGU2LCAweGQzLCAKKzB4MDMsIDB4OTksIDB4MjAsIDB4YzEsIDB4MDMsIDB4OTEsIDB4ZmYsIDB4MjMsIDB4MDksIDB4MzMsIDB4OWMsIDB4NDIsIAorMHhkZCwgMHhkMywgMHgwNCwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHhmMCwgMHhiNSwgCisweDA0LCAweDFjLCAweDBmLCAweDFjLCAweDAxLCAweDJjLCAweDJhLCAweGQwLCAweDE2LCAweDQ4LCAweGMwLCAweDZmLCAKKzB4NDAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4MDAsIDB4MjYsIDB4MjAsIDB4Y2YsIAorMHhiMSwgMHgwMCwgMHg4NCwgMHgyMCwgMHgwMCwgMHhmMCwgMHgyNCwgMHhmOCwgMHgyOCwgMHgxYywgMHgwMCwgMHhmMCwgCisweGRmLCAweGY5LCAweDI4LCAweDBhLCAweDAwLCAweGYwLCAweGRjLCAweGY5LCAweDI4LCAweDBjLCAweDAwLCAweGYwLCAKKzB4ZDksIDB4ZjksIDB4MjgsIDB4MGUsIDB4MDAsIDB4ZjAsIDB4ZDYsIDB4ZjksIDB4MDAsIDB4ZjAsIDB4NWMsIDB4ZmEsIAorMHgwMSwgMHgzNiwgMHg0MiwgMHgyZSwgMHhlOSwgMHhkMywgMHg2MSwgMHgwMiwgMHg4MywgMHgyMCwgMHgwMCwgMHhmMCwgCisweDBmLCAweGY4LCAweDAwLCAweGYwLCAweDUzLCAweGZhLCAweGZmLCAweGY3LCAweDkzLCAweGZmLCAweDA0LCAweDQ4LCAKKzB4YzAsIDB4NmYsIDB4NDAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4OTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4ZjAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg5MCwgMHhiNSwgMHgwNCwgMHgxYywgCisweDBmLCAweDFjLCAweDAwLCAweGYwLCAweDU5LCAweGZhLCAweDIwLCAweDFjLCAweDAwLCAweGYwLCAweGI2LCAweGY5LCAKKzB4MzgsIDB4MGMsIDB4MDAsIDB4ZjAsIDB4YjMsIDB4ZjksIDB4MzgsIDB4MGEsIDB4MDAsIDB4ZjAsIDB4YjAsIDB4ZjksIAorMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHhhZCwgMHhmOSwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDAwLCAweGI1LCAweDAxLCAweDFjLCAweDU0LCAweDIwLCAweGZmLCAweGY3LCAweGU3LCAweGZmLCAweDAwLCAweDIwLCAKKzB4MDAsIDB4ZjAsIDB4YTIsIDB4ZjksIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4MDAsIDB4ZjAsIAorMHgzZCwgMHhmYSwgMHg1NywgMHgyMCwgMHgwMCwgMHhmMCwgMHg5YSwgMHhmOSwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDkwLCAweGI1LCAweDA4LCAweDRmLCAweGZhLCAweDZmLCAweDIwLCAweDIzLCAweDE0LCAweDY4LCAweDljLCAweDQzLCAKKzB4MTQsIDB4NjAsIDB4MjMsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4NjUsIDB4ZmYsIDB4ZjgsIDB4NmYsIDB4MjAsIDB4MjMsIAorMHgwMSwgMHg2OCwgMHgxOSwgMHg0MywgMHgwMSwgMHg2MCwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDkwLCAweGI1LCAweDA4LCAweDRmLCAweGZhLCAweDZmLCAweDIwLCAweDIzLCAKKzB4MTQsIDB4NjgsIDB4OWMsIDB4NDMsIDB4MTQsIDB4NjAsIDB4MjMsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4ODcsIDB4ZmYsIAorMHhmOCwgMHg2ZiwgMHgyMCwgMHgyMywgMHgwMSwgMHg2OCwgMHgxOSwgMHg0MywgMHgwMSwgMHg2MCwgMHg5MCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweDA0LCAweDFjLCAKKzB4MGYsIDB4MWMsIDB4MTgsIDB4NGUsIDB4ZjAsIDB4NmYsIDB4MjAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4OTksIDB4NDMsIAorMHgwMSwgMHg2MCwgMHg2MSwgMHgwMiwgMHg1MywgMHgyMCwgMHhmZiwgMHhmNywgMHhhNSwgMHhmZiwgMHgwMCwgMHhmMCwgCisweGU5LCAweGY5LCAweGZmLCAweGY3LCAweDI5LCAweGZmLCAweGY4LCAweDFkLCAweDA1LCAweDMwLCAweDAxLCAweDJjLCAKKzB4MDMsIDB4ZDEsIDB4MjIsIDB4MmYsIDB4MDEsIDB4ZDMsIDB4MDAsIDB4MjcsIDB4MGYsIDB4ZTAsIDB4NDQsIDB4MWMsIAorMHhmZiwgMHhmNywgMHhhYSwgMHhmZiwgMHgwMCwgMHhmMCwgMHhjOCwgMHhmOCwgMHgwNywgMHgxYywgMHgwMCwgMHhmMCwgCisweGQ3LCAweGY5LCAweDIwLCAweDFjLCAweGZmLCAweGY3LCAweGEyLCAweGZmLCAweDAwLCAweGYwLCAweGMwLCAweGY4LCAKKzB4MDUsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4Y2YsIDB4ZjksIDB4ZjAsIDB4NmYsIDB4MjAsIDB4MjMsIDB4MDEsIDB4NjgsIAorMHgxOSwgMHg0MywgMHgwMSwgMHg2MCwgMHgyOCwgMHgwMiwgMHgzOCwgMHg0MywgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweGMyLCAweGIwLCAKKzB4MTQsIDB4MWMsIDB4MGQsIDB4MWMsIDB4MDcsIDB4MWMsIDB4MDEsIDB4MmYsIDB4MmYsIDB4ZDAsIDB4NzksIDB4MDIsIAorMHgxOSwgMHg0ZSwgMHhmMCwgMHg2ZiwgMHgyMCwgMHgyMywgMHgwMiwgMHg2OCwgMHg5YSwgMHg0MywgMHgwMiwgMHg2MCwgCisweDUzLCAweDIwLCAweGZmLCAweGY3LCAweDZiLCAweGZmLCAweDAwLCAweGYwLCAweGFmLCAweGY5LCAweGZmLCAweGY3LCAKKzB4ZWYsIDB4ZmUsIDB4NjgsIDB4NDYsIDB4ZmYsIDB4ZjcsIDB4ZDYsIDB4ZmUsIDB4NmEsIDB4NDYsIDB4ZTgsIDB4MWQsIAorMHgwNSwgMHgzMCwgMHgxNCwgMHg1NCwgMHgyMSwgMHgwYSwgMHg2OCwgMHg0NCwgMHg0MSwgMHg3MCwgMHg2OCwgMHg0NiwgCisweDAwLCAweDk5LCAweDBjLCAweDMwLCAweGZmLCAweGY3LCAweGJhLCAweGZlLCAweDAyLCAweGFiLCAweDE4LCAweDcwLCAKKzB4MDAsIDB4MjAsIDB4NTgsIDB4NzAsIDB4NjgsIDB4NDYsIDB4MGMsIDB4MjEsIAorMHhmZiwgMHhmNywgMHhiMiwgMHhmZSwgMHgwMiwgMHhhYiwgMHg1OCwgMHg3MCwgMHg2OSwgMHg0NiwgMHgzOCwgMHgxYywgCisweGZmLCAweGY3LCAweDE1LCAweGZmLCAweGYwLCAweDZmLCAweDIwLCAweDIzLCAweDAxLCAweDY4LCAweDE5LCAweDQzLCAKKzB4MDEsIDB4NjAsIDB4NDIsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhmZiwgMHhiNSwgMHhjMiwgMHhiMCwgMHgwNywgMHgxYywgMHgwMSwgMHgyZiwgCisweDAxLCAweGQxLCAweDAxLCAweDIwLCAweDM2LCAweGUwLCAweDZiLCAweDQ2LCAweDAwLCAweDIwLCAweGM0LCAweDQzLCAKKzB4MTAsIDB4YzMsIDB4MDEsIDB4MzAsIDB4NDIsIDB4MjgsIDB4ZmIsIDB4ZDMsIDB4NjgsIDB4NDYsIDB4MGMsIDB4MzAsIAorMHgwMywgMHgxYywgMHgwMCwgMHgyNCwgMHgwMCwgMHgyYSwgMHgwYSwgMHhkOSwgMHgwZSwgMHg4OCwgMHhjMCwgMHg0NiwgCisweDA2LCAweDcwLCAweDBlLCAweDg4LCAweDM2LCAweDEyLCAweDQ2LCAweDcwLCAweDAyLCAweDMwLCAweDAyLCAweDMxLCAKKzB4MDIsIDB4MzQsIDB4OTQsIDB4NDIsIDB4ZjQsIDB4ZDMsIDB4MDAsIDB4OTIsIDB4MTgsIDB4MWMsIDB4MTEsIDB4MWMsIAorMHhmZiwgMHhmNywgMHg3YywgMHhmZSwgMHgwNCwgMHgxYywgMHgwMCwgMHgyMCwgMHgwMSwgMHg5MCwgMHgwMiwgMHhhYiwgCisweDFjLCAweDcwLCAweDU4LCAweDcwLCAweDlkLCAweDcwLCAweDY4LCAweDQ2LCAweDBjLCAweDIxLCAweGZmLCAweGY3LCAKKzB4NzEsIDB4ZmUsIDB4MDIsIDB4YWIsIDB4NTgsIDB4NzAsIDB4NDUsIDB4OWIsIDB4MWQsIDB4MDYsIDB4MmQsIDB4MGUsIAorMHhhYywgMHg0MiwgMHgwMywgMHhkMSwgMHg2OSwgMHg0NiwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHgzZSwgMHhmZiwgCisweDAxLCAweDIwLCAweGFjLCAweDQyLCAweDAwLCAweGQxLCAweDAwLCAweDIwLCAweDQ2LCAweGIwLCAweGYwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4YjAsIDB4YjUsIDB4YzIsIDB4YjAsIDB4MGYsIDB4MWMsIDB4NDEsIDB4MDIsIAorMHgxNCwgMHg0YywgMHhlMCwgMHg2ZiwgMHgyMCwgMHgyMywgMHgwMiwgMHg2OCwgMHg5YSwgMHg0MywgMHgwMiwgMHg2MCwgCisweDUzLCAweDIwLCAweGZmLCAweGY3LCAweGVmLCAweGZlLCAweDAwLCAweGYwLCAweDMzLCAweGY5LCAweGZmLCAweGY3LCAKKzB4NzMsIDB4ZmUsIDB4NjgsIDB4NDYsIDB4ZmYsIDB4ZjcsIDB4NWEsIDB4ZmUsIDB4ZTAsIDB4NmYsIDB4MjAsIDB4MjMsIAorMHgwMSwgMHg2OCwgMHgxOSwgMHg0MywgMHgwMiwgMHhhZCwgMHgwMSwgMHg2MCwgMHg2ZCwgMHg3OCwgMHgwMCwgMHgyNCwgCisweDAyLCAweGFiLCAweDVjLCAweDcwLCAweDY4LCAweDQ2LCAweDBjLCAweDIxLCAweGZmLCAweGY3LCAweDNjLCAweGZlLCAKKzB4YTgsIDB4NDIsIDB4MDIsIDB4ZDEsIDB4MDAsIDB4OTgsIDB4ODcsIDB4NDIsIDB4MDEsIDB4ZDMsIDB4MjAsIDB4MWMsIAorMHgwMCwgMHhlMCwgMHgwMSwgMHgyMCwgMHg0MiwgMHhiMCwgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGZjLCAweDQ2LCAweDYwLCAweDQ3LCAweDAwLCAweDAwLCAweGEwLCAweGUzLCAKKzB4YjQsIDB4MjIsIDB4OWYsIDB4ZTUsIDB4YjQsIDB4MzIsIDB4OWYsIDB4ZTUsIDB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDkzLCAweGU1LCAKKzB4ODEsIDB4MDMsIDB4ODAsIDB4ZTEsIDB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDkzLCAweGU1LCAweDAxLCAweDAzLCAweDgwLCAweGUxLCAKKzB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweDkzLCAweGU1LCAweDgxLCAweDAyLCAweDgwLCAweGUxLCAweDAxLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg5MywgMHhlNSwgCisweDAxLCAweDAyLCAweDgwLCAweGUxLCAweDAxLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg5MywgMHhlNSwgMHg4MSwgMHgwMSwgMHg4MCwgMHhlMSwgCisweDAxLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg5MywgMHhlNSwgMHgwMSwgMHgwMSwgMHg4MCwgMHhlMSwgMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4OTMsIDB4ZTUsIAorMHg4MSwgMHgwMCwgMHg4MCwgMHhlMSwgMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4OTMsIDB4ZTUsIAorMHgwMSwgMHgwMCwgMHg4MCwgMHhlMSwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHhmYywgMHg0NiwgMHg2MCwgMHg0NywgCisweGE0LCAweDIxLCAweDlmLCAweGU1LCAweGE4LCAweDMxLCAweDlmLCAweGU1LCAweGEwLCAweDEzLCAweGEwLCAweGUxLCAKKzB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDIwLCAweDEzLCAweGEwLCAweGUxLCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAKKzB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweGEwLCAweDEyLCAweGEwLCAweGUxLCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAxLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgyMCwgMHgxMiwgMHhhMCwgMHhlMSwgCisweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAxLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHhhMCwgMHgxMSwgMHhhMCwgMHhlMSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgCisweDAxLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgyMCwgMHgxMSwgMHhhMCwgMHhlMSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4YTAsIDB4MTAsIDB4YTAsIDB4ZTEsIAorMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTEsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIAorMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4ZmMsIDB4NDYsIDB4NjAsIDB4NDcsIDB4YTAsIDB4MzAsIDB4OWYsIDB4ZTUsIAorMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgCisweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIAorMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHhmYywgMHg0NiwgMHg2MCwgMHg0NywgMHg3MCwgMHgzMCwgMHg5ZiwgMHhlNSwgCisweDAwLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgCisweDFlLCAweGZmLCAweDJmLCAweGUxLCAweGZjLCAweDQ2LCAweDYwLCAweDQ3LCAweDM0LCAweDIwLCAweDlmLCAweGU1LCAKKzB4M2MsIDB4MzAsIDB4OWYsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgCisweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHhmOCwgMHgwMCwgMHgxOCwgMHg0MCwgCisweDA0LCAweDAxLCAweDE4LCAweDQwLCAweDAwLCAweDAxLCAweDE4LCAweDQwLCAweGZjLCAweDAwLCAweDE4LCAweDQwLCAKKzB4ODAsIDB4YjUsIDB4MDAsIDB4ZjAsIDB4MGMsIDB4ZjgsIDB4MDAsIDB4MjcsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHg0NywgMHhmOCwgMHg3OCwgMHgxYywgMHgwNywgMHgwNCwgMHgzZiwgMHgwYywgMHgwYywgMHgyZiwgMHhmNywgMHhkZCwgCisweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDFkLCAweDQ4LCAKKzB4MDIsIDB4NjgsIDB4MWQsIDB4NDksIDB4OGIsIDB4NjksIDB4ZDIsIDB4MTgsIDB4MDIsIDB4NjAsIDB4MDIsIDB4NjYsIAorMHg4YSwgMHg2YSwgMHg0MywgMHg2OCwgMHg5YiwgMHgxOCwgMHg0MywgMHg2MCwgMHg5MywgMHg0MiwgMHgwMiwgMHhkMiwgCisweDgyLCAweDY4LCAweDAxLCAweDMyLCAweDgyLCAweDYwLCAweGMyLCAweDY4LCAweDBiLCAweDZhLCAweGQyLCAweDE4LCAKKzB4YzIsIDB4NjAsIDB4NDIsIDB4NjksIDB4Y2IsIDB4NjgsIDB4ZDIsIDB4MTgsIDB4NDIsIDB4NjEsIDB4YzIsIDB4NjksIAorMHg4YiwgMHg2OCwgMHhkMiwgMHgxOCwgMHhjMiwgMHg2MSwgMHgwMiwgMHg2OSwgMHgwYiwgMHg2OSwgMHhkMiwgMHgxOCwgCisweDAyLCAweDYxLCAweDgyLCAweDY5LCAweDBiLCAweDY4LCAweGQyLCAweDE4LCAweDgyLCAweDYxLCAweDAyLCAweDZiLCAKKzB4Y2IsIDB4NjksIDB4ZDIsIDB4MTgsIDB4MDIsIDB4NjMsIDB4NGEsIDB4NmEsIDB4NDMsIDB4NmIsIDB4OWIsIDB4MTgsIAorMHg0MywgMHg2MywgMHg5MywgMHg0MiwgMHgwMiwgMHhkMiwgMHg4MiwgMHg2YiwgMHgwMSwgMHgzMiwgMHg4MiwgMHg2MywgCisweGMyLCAweDZiLCAweDRiLCAweDY5LCAweGQyLCAweDE4LCAweGMyLCAweDYzLCAweDAyLCAweDZjLCAweGM5LCAweDZhLCAKKzB4NTEsIDB4MTgsIDB4MDEsIDB4NjQsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MmEsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgwOCwgMHgxNCwgMHg0MCwgMHg4OCwgMHhiNSwgMHg2OSwgMHg0NiwgMHgwMCwgMHhmMCwgMHgxNywgMHhmOCwgCisweDgxLCAweDA4LCAweDBhLCAweGQwLCAweDAwLCAweDIwLCAweDAwLCAweDI5LCAweDA3LCAweGQ5LCAweDAwLCAweDIyLCAKKzB4ODMsIDB4MDAsIDB4MDAsIDB4OWYsIDB4YzAsIDB4NDYsIDB4ZmEsIDB4NTAsIDB4MDEsIDB4MzAsIDB4ODgsIDB4NDIsIAorMHhmOCwgMHhkMywgMHg4OCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHgwMCwgMHhmMCwgCisweDA0LCAweGY4LCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDIyLCAKKzB4MDAsIDB4MjgsIDB4MGEsIDB4ZDAsIDB4MDEsIDB4MjgsIDB4MGEsIDB4ZDAsIDB4MDIsIDB4MjgsIDB4MGMsIDB4ZDAsIAorMHgwMywgMHgyOCwgMHgwMiwgMHhkMSwgMHgwNywgMHg0OCwgMHgxYywgMHgyMiwgMHgwOCwgMHg2MCwgMHgxMCwgMHgxYywgCisweDcwLCAweDQ3LCAweDA2LCAweDQ4LCAweDA0LCAweGUwLCAweDA2LCAweDQ4LCAweDUwLCAweDIyLCAweDA4LCAweDYwLCAKKzB4ZjcsIDB4ZTcsIDB4MDUsIDB4NDgsIDB4NjgsIDB4MjIsIDB4MDgsIDB4NjAsIDB4ZjMsIDB4ZTcsIDB4MDAsIDB4MDAsIAorMHgwOCwgMHg4MywgMHgyMCwgMHg0MCwgMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgCisweGEwLCAweDgyLCAweDIwLCAweDQwLCAweDgwLCAweGI0LCAweDAzLCAweDIyLCAweGMyLCAweDgwLCAweDE1LCAweDRhLCAKKzB4YzAsIDB4NDYsIDB4ODIsIDB4NjAsIDB4MTQsIDB4NGEsIDB4MTIsIDB4ODgsIDB4MDEsIDB4MzIsIDB4YzIsIDB4NjAsIAorMHgwMCwgMHgyMCwgMHgxMywgMHg0YSwgMHgxMywgMHg1YywgMHhjMCwgMHg0NiwgMHgwYiwgMHg3MCwgMHgwMSwgMHgzMCwgCisweDAxLCAweDMxLCAweDA4LCAweDI4LCAweGY4LCAweGQzLCAweDIwLCAweDIyLCAweDBhLCAweDcwLCAweDAxLCAweDMxLCAKKzB4MDAsIDB4MjAsIDB4MGUsIDB4NGIsIDB4MWYsIDB4NWMsIDB4YzAsIDB4NDYsIDB4MGYsIDB4NzAsIDB4MDEsIDB4MzAsIAorMHgwMSwgMHgzMSwgMHgwOCwgMHgyOCwgMHhmOCwgMHhkMywgMHgwYSwgMHg3MCwgMHgwMSwgMHgzMSwgMHgwMCwgMHgyMCwgCisweDA5LCAweDRhLCAweDEzLCAweDVjLCAweGMwLCAweDQ2LCAweDBiLCAweDcwLCAweDAxLCAweDMwLCAweDAxLCAweDMxLCAKKzB4MDgsIDB4MjgsIDB4ZjgsIDB4ZDMsIDB4MDAsIDB4MjAsIDB4MDgsIDB4NzAsIDB4ODAsIDB4YmMsIDB4NzAsIDB4NDcsIAorMHgwOCwgMHgxMCwgMHgwMCwgMHgwMywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg3YywgMHgwNCwgMHgwMCwgMHg4MCwgCisweDg1LCAweDA0LCAweDAwLCAweDgwLCAweDhlLCAweDA0LCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweDAxLCAweDIzLCAKKzB4MGEsIDB4NDgsIDB4YzEsIDB4MWQsIDB4ODksIDB4MzEsIDB4NGIsIDB4NzAsIDB4MDAsIDB4MjIsIDB4MGEsIDB4NzAsIAorMHg2NCwgMHgyMSwgMHg4MCwgMHgzMCwgMHhjMSwgMHg4MiwgMHgwMSwgMHg4MywgMHg0MywgMHg4MywgMHg3ZCwgMHgyMSwgCisweGM5LCAweDAwLCAweDgxLCAweDgzLCAweGMyLCAweDgzLCAweDA0LCAweDQ4LCAweDAxLCAweDIyLCAweDAwLCAweDIxLCAKKzB4MDAsIDB4ZjAsIDB4OGUsIDB4ZmIsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHhiNSwgMHgyMiwgMHhmZiwgMHhmZiwgMHgwMCwgMHhiNSwgMHhmZiwgMHhmNywgMHhlMSwgMHhmZiwgMHgxMywgMHg0OCwgCisweDAyLCAweDIyLCAweDAwLCAweDIxLCAweDAwLCAweGYwLCAweDgwLCAweGZiLCAweDAxLCAweDIzLCAweGQ4LCAweDQyLCAKKzB4MGEsIDB4ZDEsIDB4MTAsIDB4NDgsIDB4YzEsIDB4MWQsIDB4MzksIDB4MzEsIDB4Y2EsIDB4ODgsIDB4MDEsIDB4MzIsIAorMHhjYSwgMHg4MCwgMHg4MSwgMHg3OSwgMHgwMSwgMHgzMSwgMHg4MSwgMHg3MSwgMHhmZCwgMHhmNywgMHg3MCwgMHhmOSwgCisweDBiLCAweDQ4LCAweGMwLCAweDY4LCAweDAxLCAweDI4LCAweDA1LCAweGQxLCAweDBhLCAweDQ4LCAweDdkLCAweDIyLCAKKzB4ZDIsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4ZjAsIDB4NjgsIDB4ZmIsIDB4MDgsIDB4NDgsIDB4ZmIsIDB4ZjcsIAorMHhlMSwgMHhmYywgMHgwOCwgMHg0OCwgMHgyOCwgMHgyMiwgMHgwMCwgMHgyMSwgMHgwMCwgMHhmMCwgMHg2MCwgMHhmYiwgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDc5LCAweDIxLCAweGZmLCAweGZmLCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4YTUsIDB4N2IsIDB4MjEsIDB4NDAsIAorMHg5NSwgMHgyYywgMHhmZiwgMHhmZiwgMHg1OSwgMHgwMywgMHhmZiwgMHhmZiwgMHgwMCwgMHhiNSwgMHgxMCwgMHgyMCwgCisweDBmLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDBmLCAweDRhLCAweDBmLCAweDQ4LCAweDY0LCAweDIxLCAKKzB4ZmIsIDB4ZjcsIDB4YzYsIDB4ZmMsIDB4MGUsIDB4NDgsIDB4MDEsIDB4MjIsIDB4MTIsIDB4MDQsIDB4MDEsIDB4NjgsIAorMHgwYSwgMHg0MCwgMHgwOCwgMHgyMSwgMHgwMCwgMHgyYSwgMHgwNSwgMHhkMSwgMHgwMiwgMHg2OCwgMHgxMiwgMHgwYywgCisweDA3LCAweGQxLCAweDAwLCAweDY4LCAweDgwLCAweDBhLCAweDA0LCAweGQzLCAweDA4LCAweDQ4LCAweGMwLCAweDQ2LCAKKzB4YzEsIDB4NjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDcsIDB4NDgsIDB4YzAsIDB4NDYsIDB4MDEsIDB4NjQsIAorMHhmOSwgMHhlNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHhhNSwgMHg1NSwgMHhmZiwgMHhmZiwgCisweDdjLCAweDI5LCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAweDQwLCAweDAxLCAweDE4LCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ZjgsIDB4YjUsIDB4MjcsIDB4NDgsIDB4MDEsIDB4MjIsIDB4MTIsIDB4MDQsIAorMHgwMSwgMHg2OCwgMHgwYSwgMHg0MCwgMHgwNywgMHgyMSwgMHgwMCwgMHgyYSwgMHgwNSwgMHhkMSwgMHgwMiwgMHg2OCwgCisweDEyLCAweDBjLCAweDA2LCAweGQxLCAweDAwLCAweDY4LCAweDgwLCAweDBhLCAweDAzLCAweGQzLCAweDIxLCAweDQ4LCAKKzB4YzAsIDB4NDYsIDB4YzEsIDB4NjAsIDB4MDIsIDB4ZTAsIDB4MjAsIDB4NDgsIDB4YzAsIDB4NDYsIDB4MDEsIDB4NjQsIAorMHgxZiwgMHg0OCwgMHhmYiwgMHhmNywgMHg4NywgMHhmYywgMHgxZiwgMHg0OCwgMHhjMSwgMHg2YiwgMHhmZiwgMHgyOSwgCisweGZjLCAweGQxLCAweDgxLCAweDZiLCAweDQyLCAweDZiLCAweDE2LCAweDFjLCAweDBmLCAweDFjLCAweDFjLCAweDRjLCAKKzB4MTAsIDB4MjMsIDB4NjAsIDB4NjksIDB4MTgsIDB4NDMsIDB4NjAsIDB4NjEsIDB4YTEsIDB4NjksIDB4OTksIDB4NDMsIAorMHgxZCwgMHgwNCwgMHhhMSwgMHg2MSwgMHhlOCwgMHg2MCwgMHhhMCwgMHg2OSwgMHhjMCwgMHg0NiwgMHgyOCwgMHg2MSwgCisweDE2LCAweDRhLCAweDE3LCAweDQ5LCAweDY0LCAweDIwLCAweGZiLCAweGY3LCAweDZmLCAweGZjLCAweDE2LCAweDRhLCAKKzB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4MTUsIDB4NGIsIDB4MDAsIDB4MjAsIDB4MzksIDB4MWMsIDB4MzIsIDB4MWMsIAorMHhmYiwgMHhmNywgMHg2ZSwgMHhmYywgMHgxMywgMHg0OCwgMHhjMSwgMHg2OCwgMHgwOCwgMHgyOSwgMHhmYywgMHhkMSwgCisweDEyLCAweDQ4LCAweGZiLCAweGY3LCAweDVkLCAweGZjLCAweDEwLCAweDIzLCAweDYwLCAweDY5LCAweDk4LCAweDQzLCAKKzB4NjAsIDB4NjEsIDB4ZTgsIDB4NjAsIDB4MDEsIDB4MjAsIDB4ZTMsIDB4MjMsIDB4MWIsIDB4MDEsIDB4ZTEsIDB4MTgsIAorMHhjOCwgMHg3MSwgMHhmOCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgCisweDQwLCAweDAxLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDA0LCAweDAyLCAweGZmLCAweGZmLCAKKzB4MDAsIDB4MDEsIDB4MTgsIDB4NDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MjAsIDB4NTUsIDB4ZmYsIDB4ZmYsIAorMHhiNSwgMHhiNiwgMHgyMSwgMHg0MCwgMHg2NCwgMHgwMCwgMHgzMCwgMHgwMiwgMHg0NCwgMHg4MCwgMHgyMCwgMHg0MCwgCisweDQwLCAweDAxLCAweDE4LCAweDQwLCAweGY0LCAweDAxLCAweGZmLCAweGZmLCAweDAwLCAweGI1LCAweGZkLCAweGY3LCAKKzB4MDEsIDB4ZmYsIDB4MDYsIDB4NDgsIDB4ZmIsIDB4ZjcsIDB4MzIsIDB4ZmMsIDB4ZmQsIDB4ZjcsIDB4ZDYsIDB4ZmUsIAorMHhmZSwgMHhmNywgMHgwNCwgMHhmOCwgMHhmZSwgMHhmNywgMHgxNiwgMHhmOCwgMHhmZSwgMHhmNywgMHgyNCwgMHhmOCwgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDkxLCAweDAzLCAweGZmLCAweGZmLCAweDkwLCAweGI1LCAweGZkLCAweGY3LCAKKzB4NmIsIDB4ZmMsIDB4MzQsIDB4NGYsIDB4MDAsIDB4MjQsIDB4ZjksIDB4NjgsIDB4ZjgsIDB4MWQsIDB4NzksIDB4MzAsIAorMHgwMSwgMHgyOSwgMHgwZiwgMHhkMSwgMHgzMSwgMHg0OSwgMHhjMCwgMHg0NiwgMHhmOSwgMHg2NywgMHgzMSwgMHg0OSwgCisweGMwLCAweDQ2LCAweDAxLCAweDYwLCAweDMwLCAweDQ5LCAweGMwLCAweDQ2LCAweDBjLCAweDYwLCAweDRjLCAweDYwLCAKKzB4OGMsIDB4NjAsIDB4Y2MsIDB4NjAsIDB4MGMsIDB4NjEsIDB4NGMsIDB4NjEsIDB4OGMsIDB4NjEsIDB4MDQsIDB4ZTAsIAorMHhmOSwgMHgxZCwgMHg3ZCwgMHgzMSwgMHhmOSwgMHg2NywgMHgxMiwgMHhjMCwgMHgwOCwgMHgzOCwgMHgwMCwgMHg2OCwgCisweDYwLCAweDIzLCAweDAxLCAweDY4LCAweDE5LCAweDQzLCAweDAxLCAweDYwLCAweGY4LCAweDZmLCAweDIwLCAweDIzLCAKKzB4MDEsIDB4NjgsIDB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4ZjgsIDB4NmYsIDB4NDAsIDB4MjMsIDB4MDEsIDB4NjgsIAorMHg5OSwgMHg0MywgMHgwMSwgMHg2MCwgMHgwMCwgMHhmMCwgMHg1NCwgMHhmOCwgMHhmZCwgMHhmNywgMHg0ZSwgMHhmYywgCisweDAwLCAweGYwLCAweDVlLCAweGY5LCAweGZkLCAweGY3LCAweDczLCAweGY4LCAweGZmLCAweGY3LCAweDBjLCAweGZlLCAKKzB4ZmQsIDB4ZjcsIDB4MmUsIDB4ZmUsIDB4ZmQsIDB4ZjcsIDB4YjYsIDB4ZmQsIDB4ZmQsIDB4ZjcsIDB4YzIsIDB4ZmUsIAorMHhmZCwgMHhmNywgMHg1NCwgMHhmZCwgMHhmZCwgMHhmNywgMHgwYSwgMHhmZCwgMHhmZCwgMHhmNywgMHg5NCwgMHhmZCwgCisweDAwLCAweGYwLCAweDFhLCAweGZhLCAweGZkLCAweGY3LCAweDljLCAweGZmLCAweGZkLCAweGY3LCAweDBhLCAweGZmLCAKKzB4ZmQsIDB4ZjcsIDB4ZDIsIDB4ZmUsIDB4ZmQsIDB4ZjcsIDB4M2MsIDB4ZmMsIDB4ZmIsIDB4ZjcsIDB4ZGMsIDB4ZmEsIAorMHhmZiwgMHhmNywgMHg5YywgMHhmZiwgMHg3MSwgMHgyMywgMHg1YiwgMHgwMSwgCisweGY4LCAweDE4LCAweDA0LCAweDcyLCAweDQ0LCAweDcyLCAweDA3LCAweDIzLCAweDViLCAweDAyLCAweGY4LCAweDE4LCAKKzB4MDQsIDB4NjMsIDB4ZjgsIDB4NjgsIDB4MDEsIDB4MjgsIDB4MDIsIDB4ZDEsIDB4YTgsIDB4MjAsIDB4ZmUsIDB4ZjcsIAorMHhiMSwgMHhmZCwgMHgwOSwgMHg0OCwgMHhjMCwgMHg0NiwgMHg0NCwgMHg2MiwgMHgwMCwgMHhmMCwgMHgxOCwgMHhmYSwgCisweDA3LCAweDQ4LCAweGZiLCAweGY3LCAweGJkLCAweGZiLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDEsIDB4MTEsIDB4NDAsIDB4MDQsIDB4MDEsIDB4MTEsIDB4NDAsIAorMHgwMCwgMHgwMSwgMHgxMSwgMHgwMCwgMHhjMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgxNSwgMHg4ZiwgMHgyMSwgMHg0MCwgCisweDAwLCAweGI1LCAweDA0LCAweDQ4LCAweGZiLCAweGY3LCAweGFhLCAweGZiLCAweGZkLCAweGY3LCAweDVlLCAweGZmLCAKKzB4ZmQsIDB4ZjcsIDB4MjQsIDB4ZmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MTUsIDB4OTksIDB4MjEsIDB4NDAsIAorMHhmYSwgMHgyMSwgMHgwMywgMHg0OCwgMHhjMCwgMHg0NiwgMHg0MSwgMHg2MiwgMHg0MCwgMHgyMSwgMHg0MSwgMHg2MiwgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDE4LCAweDAwLCAweDA3LCAweDQ4LCAweDQxLCAweDY5LCAKKzB4MDcsIDB4NGIsIDB4MTksIDB4NDMsIDB4NDEsIDB4NjEsIDB4ODIsIDB4NjksIDB4OWEsIDB4NDMsIDB4ODIsIDB4NjEsIAorMHgwMSwgMHgyMiwgMHgxMiwgMHgwNSwgMHhkMSwgMHg2MCwgMHg4MCwgMHg2OSwgMHhjMCwgMHg0NiwgMHgxMCwgMHg2MSwgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGZlLCAweGFmLCAweDlhLCAweDEwLCAKKzB4MDAsIDB4YjUsIDB4MDIsIDB4NDgsIDB4ZmIsIDB4ZjcsIDB4ODAsIDB4ZmIsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHhjOCwgMHg1NywgMHhmZiwgMHhmZiwgMHhmMCwgMHhiNSwgMHgyNCwgMHg0YywgMHgwMSwgMHgyMSwgMHgwOSwgMHgwNCwgCisweDIwLCAweDY4LCAweDAxLCAweDQwLCAweDA5LCAweDIwLCAweDIyLCAweDRlLCAweDIyLCAweDRkLCAweDAwLCAweDI5LCAKKzB4MDUsIDB4ZDEsIDB4MjEsIDB4NjgsIDB4MDksIDB4MGMsIDB4MDQsIDB4ZDEsIDB4MjEsIDB4NjgsIDB4ODksIDB4MGEsIAorMHgwMSwgMHhkMywgMHhmMCwgMHg2MCwgMHgwMCwgMHhlMCwgMHgyOCwgMHg2NCwgMHgxZCwgMHg0OCwgMHhmYiwgMHhmNywgCisweDY1LCAweGZiLCAweDFkLCAweDRmLCAweDFkLCAweDQ5LCAweDg4LCAweDY5LCAweDAxLCAweDMwLCAweDg4LCAweDYxLCAKKzB4MzgsIDB4N2EsIDB4MDAsIDB4MjgsIDB4MDIsIDB4ZDEsIDB4NzgsIDB4N2EsIDB4MDAsIDB4MjgsIDB4MWYsIDB4ZDAsIAorMHgxOSwgMHg0OCwgMHhmYiwgMHhmNywgMHg1NywgMHhmYiwgMHgxOSwgMHg0OCwgMHhmYiwgMHhmNywgMHg1NCwgMHhmYiwgCisweDAwLCAweDI4LCAweGZhLCAweGQxLCAweDM4LCAweDdhLCAweDAwLCAweDI4LCAweDAyLCAweGQwLCAweDE2LCAweDQ4LCAKKzB4ZmIsIDB4ZjcsIDB4NGMsIDB4ZmIsIDB4MDEsIDB4MjEsIDB4MDksIDB4MDQsIDB4MjAsIDB4NjgsIDB4MDEsIDB4NDAsIAorMHgxNCwgMHgyMCwgMHgwMCwgMHgyOSwgMHgwNSwgMHhkMSwgMHgyMSwgMHg2OCwgMHgwOSwgMHgwYywgMHgwNCwgMHhkMSwgCisweDIxLCAweDY4LCAweDg5LCAweDBhLCAweDAxLCAweGQzLCAweGYwLCAweDYwLCAweDAxLCAweGUwLCAweDI4LCAweDY0LCAKKzB4ZmYsIDB4ZTcsIDB4ZmUsIDB4ZTcsIDB4ZmYsIDB4ZjcsIDB4NjUsIDB4ZmQsIDB4MGIsIDB4NDgsIDB4ZmIsIDB4ZjcsIAorMHgzNSwgMHhmYiwgMHhmZiwgMHhmNywgMHhhZiwgMHhmZiwgMHhjZCwgMHhlNywgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgCisweDQwLCAweDAxLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDA0LCAweDAyLCAweGZmLCAweGZmLCAKKzB4ODgsIDB4MWMsIDB4MDAsIDB4ODAsIDB4MDgsIDB4ODMsIDB4MjAsIDB4NDAsIDB4ZjQsIDB4MDEsIDB4ZmYsIDB4ZmYsIAorMHhiNSwgMHgwNywgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHg5OSwgMHg5ZiwgMHgyMSwgMHg0MCwgCisweDAwLCAweDIwLCAweDA3LCAweDRhLCAweDAxLCAweDIxLCAweDA5LCAweDA1LCAweDUwLCAweDYxLCAweGM4LCAweDYwLCAKKzB4ZDAsIDB4NjEsIDB4YzgsIDB4NjEsIDB4MDMsIDB4MjMsIDB4ZGIsIDB4MDQsIDB4MDMsIDB4NGEsIDB4MDEsIDB4MjEsIAorMHhkMSwgMHg2MywgMHg1OCwgMHg2MCwgMHhmYywgMHhlNywgMHgwMCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweGMwLCAweDAwLCAweDE4LCAweDAwLCAweDgwLCAweGI1LCAweGMwLCAweGIwLCAweDAxLCAweDIyLCAweDAwLCAweDIxLCAKKzB4MGEsIDB4MjAsIDB4ZmMsIDB4ZjcsIDB4ZDEsIDB4ZmYsIDB4MDcsIDB4MWMsIDB4ZmYsIDB4MmYsIDB4MjgsIDB4ZDAsIAorMHg2OSwgMHg0NiwgMHhmZiwgMHgyMiwgMHgzOCwgMHgxYywgMHgwMSwgMHgzMiwgMHhmZCwgMHhmNywgMHg1NCwgMHhmOSwgCisweGZmLCAweDIzLCAweDAxLCAweDMzLCAweDk4LCAweDQyLCAweDFiLCAweGQxLCAweDBkLCAweDk4LCAweDAwLCAweDA5LCAKKzB4MTgsIDB4ZDMsIDB4MzgsIDB4MWMsIDB4ZmQsIDB4ZjcsIDB4OGQsIDB4ZjgsIDB4MGUsIDB4NDksIDB4MDEsIDB4MjIsIAorMHgxMiwgMHgwNCwgMHgwOCwgMHg2OCwgMHgwMiwgMHg0MCwgMHgwZCwgMHg0OCwgMHgwNSwgMHhkMSwgMHgwYSwgMHg2OCwgCisweDEyLCAweDBjLCAweDA2LCAweGQxLCAweDA5LCAweDY4LCAweDg5LCAweDBhLCAweDAzLCAweGQzLCAweDBhLCAweDQ5LCAKKzB4YzAsIDB4NDYsIDB4YzgsIDB4NjAsIDB4MDIsIDB4ZTAsIDB4MDksIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjQsIAorMHhmZiwgMHhmNywgMHhiYywgMHhmZiwgMHgzOCwgMHgxYywgMHhmZCwgMHhmNywgMHg3NCwgMHhmOCwgMHg0MCwgMHhiMCwgCisweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4MDcsIDB4ODAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDEsIDB4MTgsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHgxNywgMHg0OSwgMHgwMSwgMHgyMiwgMHgxMiwgMHgwNCwgCisweDA4LCAweDY4LCAweDAyLCAweDQwLCAweDA2LCAweDIwLCAweDAwLCAweDJhLCAweDA1LCAweGQxLCAweDBhLCAweDY4LCAKKzB4MTIsIDB4MGMsIDB4MDYsIDB4ZDEsIDB4MDksIDB4NjgsIDB4ODksIDB4MGEsIDB4MDMsIDB4ZDMsIDB4MTEsIDB4NDksIAorMHhjMCwgMHg0NiwgMHhjOCwgMHg2MCwgMHgwMiwgMHhlMCwgMHgxMCwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2NCwgCisweDAzLCAweDIwLCAweGZlLCAweGY3LCAweGQzLCAweGZjLCAweGZiLCAweGY3LCAweDBkLCAweGZmLCAweDAxLCAweDIzLCAKKzB4MTgsIDB4NDMsIDB4ZmIsIDB4ZjcsIDB4ZTcsIDB4ZmYsIDB4ZmYsIDB4ZjcsIDB4ODMsIDB4ZmUsIDB4ZmYsIDB4ZjcsIAorMHg5ZCwgMHhmZiwgMHhmZiwgMHhmNywgMHgwNSwgMHhmZSwgMHhmZiwgMHhmNywgMHhmNSwgMHhmZSwgMHhmZiwgMHhmNywgCisweDA5LCAweGZmLCAweGZmLCAweGY3LCAweDliLCAweGZkLCAweGZmLCAweGY3LCAweDIxLCAweGZmLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4NDAsIDB4MDEsIDB4MTgsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHhmMCwgMHhiNCwgMHg0NiwgMHg0YSwgMHgwMSwgMHgyMSwgMHhjOSwgMHgwMywgCisweDQ1LCAweDRkLCAweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGVjLCAweDE4LCAweGExLCAweDYxLCAweDI4LCAweDg4LCAKKzB4NDAsIDB4MDQsIDB4NDMsIDB4NGIsIDB4YzAsIDB4MTgsIDB4ODcsIDB4MWEsIDB4MDQsIDB4MjAsIDB4YWYsIDB4NjAsIAorMHg0MSwgMHg0ZSwgMHhjMCwgMHg0NiwgMHhiMCwgMHg2MSwgMHgwOCwgMHgyMCwgMHhjOCwgMHgyMywgMHg0MywgMHg0MywgCisweGJiLCAweDQyLCAweDIxLCAweGQ5LCAweDQxLCAweDAwLCAweDNkLCAweDRlLCAweGMwLCAweDQ2LCAweDMxLCAweDYxLCAKKzB4YjYsIDB4NjksIDB4MjAsIDB4MjMsIDB4OWIsIDB4MWIsIDB4M2EsIDB4NGUsIDB4YzAsIDB4NDYsIDB4ZjMsIDB4NjEsIAorMHgxMCwgMHgzYiwgMHgzMywgMHg2MiwgMHg4YiwgMHgwMCwgMHhmZiwgMHgxYSwgMHg0MCwgMHgwOCwgMHg4MSwgMHg0MiwgCisweDE3LCAweGQzLCAweGI4LCAweDIzLCAweDQzLCAweDQzLCAweGJiLCAweDQyLCAweDA4LCAweGQ5LCAweDQxLCAweDFlLCAKKzB4MzIsIDB4NGIsIDB4YzAsIDB4NDYsIDB4OTksIDB4ODEsIDB4ZDksIDB4ODEsIDB4NDAsIDB4MDAsIDB4MDIsIDB4MzgsIAorMHg1OCwgMHg2MSwgMHgwYSwgMHhlMCwgMHgwMSwgMHgzMCwgMHg4MSwgMHg0MiwgMHhlZiwgMHhkMiwgMHgwNiwgMHhlMCwgCisweDJjLCAweDRlLCAweGIzLCAweDY5LCAweDAxLCAweDMzLCAweGIzLCAweDYxLCAweDQwLCAweDAwLCAweDg4LCAweDQyLCAKKzB4ZDIsIDB4ZDksIDB4MmEsIDB4NDksIDB4MDAsIDB4MjAsIDB4YTMsIDB4NjksIDB4OWIsIDB4MDgsIDB4MDcsIDB4ZDAsIAorMHgyOCwgMHg0YiwgMHg4NywgMHgwMCwgMHhjYiwgMHg1MSwgMHhhNywgMHg2OSwgMHhiZiwgMHgwOCwgMHgwMSwgMHgzMCwgCisweDg3LCAweDQyLCAweGY4LCAweGQ4LCAweDIyLCAweDQ5LCAweGMwLCAweDQ2LCAweDhhLCAweDYyLCAweDhjLCAweDg5LCAKKzB4NTgsIDB4MjAsIDB4NjAsIDB4NDMsIDB4ODcsIDB4MTgsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MmMsIAorMHgwYSwgMHhkZCwgMHg1OCwgMHgyMywgMHg0MywgMHg0MywgMHg4YywgMHg2YSwgMHhlMywgMHgxOCwgMHgwMSwgMHgzMCwgCisweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDlhLCAweDYwLCAweDhiLCAweDg5LCAweDgzLCAweDQyLCAweGY0LCAweGRjLCAKKzB4Y2YsIDB4NjIsIDB4Y2MsIDB4ODksIDB4NjAsIDB4MDAsIDB4MDAsIDB4MTksIDB4NDAsIDB4MDEsIDB4YzcsIDB4MTksIAorMHgwMCwgMHgyMCwgMHgwMCwgMHgyYywgMHgwYiwgMHhkZCwgMHg0MywgMHgwMCwgMHgxYiwgMHgxOCwgMHg1YiwgMHgwMSwgCisweGNjLCAweDZhLCAweGUzLCAweDE4LCAweDAxLCAweDMwLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDlhLCAweDYwLCAKKzB4Y2IsIDB4ODksIDB4ODMsIDB4NDIsIDB4ZjMsIDB4ZGMsIDB4NGYsIDB4NjIsIDB4MDAsIDB4MjAsIDB4MGIsIDB4NjksIAorMHgwMCwgMHgyYiwgMHgwNywgMHhkOSwgMHg4NywgMHgwMCwgMHg0YiwgMHg2YSwgMHhjMCwgMHg0NiwgMHhkYSwgMHg1MSwgCisweDBiLCAweDY5LCAweDAxLCAweDMwLCAweDgzLCAweDQyLCAweGY3LCAweGQ4LCAweDQ5LCAweDZhLCAweDgwLCAweDAwLCAKKzB4MDgsIDB4MTgsIDB4MDQsIDB4MzgsIDB4MjgsIDB4NjEsIDB4ZjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHhiMCwgMHhiZSwgMHgyMSwgMHg0MCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgyMCwgMHg0MCwgCisweDRjLCAweDJhLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDIwLCAweDQwLCAweDAwLCAweGFkLCAweGRlLCAweDAwLCAKKzB4MGEsIDB4NDgsIDB4MDEsIDB4MjMsIDB4MWIsIDB4MDYsIDB4NDEsIDB4NjksIDB4OTksIDB4NDMsIDB4MWEsIDB4MDksIAorMHg0MSwgMHg2MSwgMHhkMSwgMHg2MCwgMHgwMCwgMHgyMSwgMHhhMSwgMHgyMiwgMHg1MiwgMHgwMywgMHg5MSwgMHg2MSwgCisweDFiLCAweDIzLCAweGRiLCAweDAxLCAweGMwLCAweDE4LCAweDgxLCAweDYxLCAweDAxLCAweDIwLCAweDAwLCAweDA2LCAKKzB4NTksIDB4MDUsIDB4MDgsIDB4NjAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg4MCwgMHhiNCwgMHgwMiwgMHgxYywgMHgwYiwgMHg0OCwgMHgxYiwgMHgyMywgMHhkYiwgMHgwMSwgMHhjMywgMHgxOCwgCisweDlhLCAweDYxLCAweDAxLCAweDIzLCAweDFiLCAweDA2LCAweDQyLCAweDY5LCAweDFhLCAweDQzLCAweDQyLCAweDYxLCAKKzB4ODcsIDB4NjksIDB4OWYsIDB4NDMsIDB4MDEsIDB4MjMsIDB4MWIsIDB4MDUsIAorMHg4NywgMHg2MSwgMHhkYSwgMHg2MCwgMHg4MCwgMHg2OSwgMHhjMCwgMHg0NiwgMHgxOCwgMHg2MSwgMHhhMSwgMHgyMCwgCisweDQwLCAweDAzLCAweDgxLCAweDYxLCAweDgwLCAweGJjLCAweDcwLCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4ODAsIDB4YjUsIDB4ZmYsIDB4ZjcsIDB4YzksIDB4ZmYsIDB4MDAsIDB4MjAsIDB4MDAsIDB4ZjAsIDB4MjAsIDB4ZjgsIAorMHgwMCwgMHgyMCwgMHgwOSwgMHg0OSwgMHgwMCwgMHgyMiwgMHgwMywgMHgwMSwgMHg1ZiwgMHgxOCwgMHgzMywgMHgyMywgCisweDliLCAweDAxLCAweGZiLCAweDE4LCAweDlhLCAweDYyLCAweDAxLCAweDMwLCAweDBiLCAweDI4LCAweGY2LCAweGQzLCAKKzB4MDQsIDB4NDgsIDB4MDEsIDB4MjIsIDB4MDAsIDB4MjEsIDB4MDAsIDB4ZjAsIDB4MzMsIDB4ZjgsIDB4ODAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgxZCwgMHgzZSwgMHhmZiwgMHhmZiwgCisweDAwLCAweGI1LCAweDAyLCAweDQ4LCAweDAwLCAweGYwLCAweDA0LCAweGY4LCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4YTgsIDB4NjEsIDB4MDAsIDB4MDAsIDB4ODAsIDB4YjQsIDB4MDEsIDB4MjIsIDB4MTIsIDB4MDUsIDB4MGYsIDB4NGIsIAorMHhhMSwgMHgyMSwgMHg0OSwgMHgwMywgMHgwMCwgMHgyOCwgMHgwZSwgMHhkMCwgMHhjOCwgMHg2MSwgMHgxOCwgMHgxYywgCisweDU5LCAweDY5LCAweDUzLCAweDAxLCAweDE5LCAweDQzLCAweDQxLCAweDYxLCAweDg3LCAweDY5LCAweDlmLCAweDQzLCAKKzB4ODcsIDB4NjEsIDB4ZDEsIDB4NjAsIDB4ODAsIDB4NjksIDB4YzAsIDB4NDYsIDB4MTAsIDB4NjEsIDB4ODAsIDB4YmMsIAorMHg3MCwgMHg0NywgMHgxOCwgMHgxYywgMHg1ZiwgMHg2OSwgMHgwMSwgMHgyMywgMHg1YiwgMHgwNiwgMHg5ZiwgMHg0MywgCisweDQ3LCAweDYxLCAweGQ3LCAweDYwLCAweDAwLCAweDIwLCAweGM4LCAweDYxLCAweGYzLCAweGU3LCAweDAwLCAweDAwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4YjAsIDB4YjQsIDB4MDcsIDB4MWMsIDB4MDAsIDB4MjAsIDB4MTcsIDB4NGMsIAorMHgwMywgMHgwMSwgMHgxZCwgMHgxOSwgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhlYiwgMHgxOCwgMHg5ZCwgMHg2YSwgCisweGJkLCAweDQyLCAweDA1LCAweGQxLCAweDFkLCAweDZiLCAweDk1LCAweDQyLCAweDAyLCAweGQxLCAweGRiLCAweDZhLCAKKzB4OGIsIDB4NDIsIDB4MWMsIDB4ZDAsIDB4MDEsIDB4MzAsIDB4MGIsIDB4MjgsIDB4ZWUsIDB4ZDMsIDB4MDAsIDB4MjAsIAorMHgwMywgMHgwMSwgMHgxZCwgMHgxOSwgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhlYiwgMHgxOCwgMHg5YiwgMHg2YSwgCisweDAwLCAweDJiLCAweDA5LCAweGQxLCAweDAzLCAweDAxLCAweDFjLCAweDE5LCAweDMzLCAweDIzLCAweDliLCAweDAxLCAKKzB4ZTMsIDB4MTgsIDB4MWEsIDB4NjMsIDB4ZDksIDB4NjIsIDB4NWEsIDB4NjMsIDB4OWYsIDB4NjIsIDB4MDIsIDB4ZTAsIAorMHgwMSwgMHgzMCwgMHgwYiwgMHgyOCwgMHhlYSwgMHhkMywgMHgwYiwgMHgyOCwgMHgwMSwgMHhkMSwgMHgwMCwgMHgyMCwgCisweGMwLCAweDQzLCAweGIwLCAweGJjLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4OTAsIDB4YjQsIDB4MDEsIDB4MWMsIDB4MDAsIDB4MjIsIDB4MDEsIDB4MjAsIDB4MTYsIDB4NGYsIDB4MDEsIDB4ZTAsIAorMHgwMCwgMHgyYSwgMHgwNywgMHhkMSwgMHgwMywgMHgwMSwgMHhkYywgMHgxOSwgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgCisweGUzLCAweDE4LCAweDliLCAweDY5LCAweDhiLCAweDQyLCAweDExLCAweGQxLCAweDAyLCAweDAxLCAweGQyLCAweDE5LCAKKzB4MzMsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZDIsIDB4MTgsIDB4OTMsIDB4NmEsIDB4YzAsIDB4NDYsIDB4OTMsIDB4NjEsIAorMHhkMywgMHg2YSwgMHhjMCwgMHg0NiwgMHhkMywgMHg2MSwgMHgxMywgMHg2YiwgMHhjMCwgMHg0NiwgMHgxMywgMHg2MiwgCisweDUzLCAweDZiLCAweGMwLCAweDQ2LCAweDUzLCAweDYyLCAweDAxLCAweDIyLCAweDAxLCAweDMwLCAweDBiLCAweDI4LCAKKzB4ZTAsIDB4ZDMsIDB4MDcsIDB4NGIsIDB4MDAsIDB4MmEsIDB4MDIsIDB4ZDEsIDB4OWEsIDB4NjgsIDB4OGEsIDB4NDIsIAorMHgwMywgMHhkMSwgMHgwMCwgMHgyMSwgMHg5OSwgMHg2MCwgMHg5MCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMCwgMHgyMCwgCisweGMwLCAweDQzLCAweGZhLCAweGU3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGU4LCAweDFiLCAweDAwLCAweDgwLCAKKzB4MGIsIDB4MjgsIDB4MTcsIDB4ZGEsIDB4MGMsIDB4NDksIDB4MDEsIDB4MjMsIDB4NWIsIDB4MDYsIDB4OGEsIDB4NjksIAorMHgxMywgMHg0MywgMHgwMSwgMHgyMiwgMHgxMiwgMHgwNSwgMHg4YiwgMHg2MSwgMHgxMywgMHg2MSwgMHgwMCwgMHgwMSwgCisweDQwLCAweDE4LCAweDMzLCAweDIzLCAweDliLCAweDAxLCAweGMwLCAweDE4LCAweDAzLCAweDZiLCAweGMwLCAweDQ2LCAKKzB4NDMsIDB4NjMsIDB4NTMsIDB4MDEsIDB4ODgsIDB4NjksIDB4OTgsIDB4NDMsIDB4ODgsIDB4NjEsIDB4MTAsIDB4NjEsIAorMHgwMSwgMHgyMCwgMHg3MCwgMHg0NywgMHgwMCwgMHgyMCwgMHhmYywgMHhlNywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDkwLCAweGI0LCAweDA4LCAweDRhLCAweGQwLCAweDY5LCAweDAwLCAweDIxLCAweDA3LCAweDRmLCAweGQzLCAweDY5LCAKKzB4ODMsIDB4NDIsIDB4MDIsIDB4ZDksIDB4ZmMsIDB4MWEsIDB4MjAsIDB4MTgsIDB4MDAsIDB4ZTAsIDB4YzAsIDB4MWEsIAorMHgwOSwgMHgxOCwgMHgxOCwgMHgxYywgMHhiOSwgMHg0MiwgMHhmNCwgMHhkOSwgMHg5MCwgMHhiYywgMHg3MCwgMHg0NywgCisweDAwLCAweDIwLCAweDE0LCAweDQwLCAweGE4LCAweDYxLCAweDAwLCAweDAwLCAweDkwLCAweGI1LCAweDA3LCAweDFjLCAKKzB4MDAsIDB4MjQsIDB4MDAsIDB4MmYsIDB4MDQsIDB4ZDMsIDB4ZmYsIDB4ZjcsIDB4ZTMsIDB4ZmYsIDB4MDEsIDB4MzQsIAorMHhiYywgMHg0MiwgMHhmYSwgMHhkOSwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90eXBob29uLmMgYi9kcml2ZXJzL25ldC90eXBob29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkMzM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwpAQCAtMCwwICsxLDI2NzMgQEAKKy8qIHR5cGhvb24uYzogQSBMaW51eCBFdGhlcm5ldCBkZXZpY2UgZHJpdmVyIGZvciAzQ29tIDNDUjk5MCBmYW1pbHkgb2YgTklDcyAqLworLyoKKwlXcml0dGVuIDIwMDItMjAwNCBieSBEYXZpZCBEaWxsb3cgPGRhdmVAdGhlZGlsbG93cy5vcmc+CisJQmFzZWQgb24gY29kZSB3cml0dGVuIDE5OTgtMjAwMCBieSBEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPiBhbmQKKwlMaW51eCAyLjIueCBkcml2ZXIgYnkgRGF2aWQgUC4gTWNMZWFuIDxkYXZpZHBtY2xlYW5AeWFob28uY29tPi4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKwl0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCURyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKwlyZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90CisJYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKwlzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KKworCVRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIG9uIGEgcHVibGljIHdlYiBzaXRlLiBJdCBtYXkgZW5hYmxlCisJY3J5cHRvZ3JhcGhpYyBjYXBhYmlsaXRpZXMgb2YgdGhlIDNDb20gaGFyZHdhcmUsIGFuZCBtYXkgYmUKKwlleHBvcnRlZCBmcm9tIHRoZSBVbml0ZWQgU3RhdGVzIHVuZGVyIExpY2Vuc2UgRXhjZXB0aW9uICJUU1UiCisJcHVyc3VhbnQgdG8gMTUgQy5GLlIuIFNlY3Rpb24gNzQwLjEzKGUpLgorCisJVGhpcyB3b3JrIHdhcyBmdW5kZWQgYnkgdGhlIE5hdGlvbmFsIExpYnJhcnkgb2YgTWVkaWNpbmUgdW5kZXIKKwl0aGUgRGVwYXJ0bWVudCBvZiBFbmVyZ3kgcHJvamVjdCBudW1iZXIgMDI3NEREMDZEMSBhbmQgTkxNIHByb2plY3QKKwludW1iZXIgWTEtTE0tMjAxNS0wMS4KKworCVRoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgM0NvbSAzQ1I5OTAgRmFtaWx5IG9mIGNhcmRzIHdpdGggdGhlCisJM1hQIFByb2Nlc3Nvci4gSXQgaGFzIGJlZW4gdGVzdGVkIG9uIHg4NiBhbmQgc3BhcmM2NC4KKworCUtOT1dOIElTU1VFUzoKKwkqKSBUaGUgY3VycmVudCBmaXJtd2FyZSBhbHdheXMgc3RyaXBzIHRoZSBWTEFOIHRhZyBvZmYsIGV2ZW4gaWYKKwkJd2UgdGVsbCBpdCBub3QgdG8uIFlvdSBzaG91bGQgZmlsdGVyIFZMQU5zIGF0IHRoZSBzd2l0Y2gKKwkJYXMgYSB3b3JrYXJvdW5kIChnb29kIHByYWN0aWNlIGluIGFueSBldmVudCkgdW50aWwgd2UgY2FuCisJCWdldCB0aGlzIGZpeGVkLgorCSopIENhbm5vdCBETUEgUnggcGFja2V0cyB0byBhIDIgYnl0ZSBhbGlnbmVkIGFkZHJlc3MuIEFsc28gZmlybXdhcmUKKwkJaXNzdWUuIEhvcGVmdWxseSAzQ29tIHdpbGwgZml4IGl0LgorCSopIFdhaXRpbmcgZm9yIGEgY29tbWFuZCByZXNwb25zZSB0YWtlcyA4bXMgZHVlIHRvIG5vbi1wcmVlbXB0YWJsZQorCQlwb2xsaW5nLiBPbmx5IHNpZ25pZmljYW50IGZvciBnZXR0aW5nIHN0YXRzIGFuZCBjcmVhdGluZworCQlTQXMsIGJ1dCBhbiB1Z2x5IHdhcnQgbmV2ZXIgdGhlIGxlc3MuCisKKwlUT0RPOgorCSopIERvZXNuJ3QgZG8gSVBTRUMgb2ZmbG9hZGluZy4gWWV0LiBLZWVwIHllciBwYW50cyBvbiwgaXQncyBjb21pbmcuCisJKikgQWRkIG1vcmUgc3VwcG9ydCBmb3IgZXRodG9vbCAoZXNwZWNpYWxseSBmb3IgTklDIHN0YXRzKQorCSopIEFsbG93IGRpc2FibGluZyBvZiBSWCBjaGVja3N1bSBvZmZsb2FkaW5nCisJKikgRml4IE1BQyBjaGFuZ2luZyB0byB3b3JrIHdoaWxlIHRoZSBpbnRlcmZhY2UgaXMgdXAKKwkJKE5lZWQgdG8gcHV0IGNvbW1hbmRzIG9uIHRoZSBUWCByaW5nLCB3aGljaCBjaGFuZ2VzCisJCXRoZSBsb2NraW5nKQorCSopIEFkZCBpbiBGQ1MgdG8ge3J4LHR4fV9ieXRlcywgc2luY2UgdGhlIGhhcmR3YXJlIGRvZXNuJ3QuIFNlZQorCQlodHRwOi8vb3NzLnNnaS5jb20vY2dpLWJpbi9tZXNnLmNnaT9hPW5ldGRldiZpPTIwMDMxMjE1MTUyMjExLjcwMDNmZThlLnJkZHVubGFwJTQwb3NkbC5vcmcKKyovCisKKy8qIFNldCB0aGUgY29weSBicmVha3BvaW50IGZvciB0aGUgY29weS1vbmx5LXRpbnktZnJhbWVzIHNjaGVtZS4KKyAqIFNldHRpbmcgdG8gPiAxNTE4IGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoaXMgZmVhdHVyZS4KKyAqLworc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAyMDA7CisKKy8qIFNob3VsZCB3ZSB1c2UgTU1JTyBvciBQb3J0IElPPworICogMDogUG9ydCBJTworICogMTogTU1JTworICogMjogVHJ5IE1NSU8sIGZhbGxiYWNrIHRvIFBvcnQgSU8KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB1c2VfbW1pbyA9IDI7CisKKy8qIGVuZCB1c2VyLWNvbmZpZ3VyYWJsZSB2YWx1ZXMgKi8KKworLyogTWF4aW11bSBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBmaWx0ZXIgKHZzLiByeC1hbGwtbXVsdGljYXN0KS4KKyAqLworc3RhdGljIGNvbnN0IGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZS4gKi8KKworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgY29tcGlsZSBlZmZpY2llbmN5LgorICogVGhlIGNvbXBpbGVyIHdpbGwgY29udmVydCA8dW5zaWduZWQ+JyUnPDJeTj4gaW50byBhIGJpdCBtYXNrLgorICogTWFraW5nIHRoZSBUeCByaW5nIHRvbyBsYXJnZSBkZWNyZWFzZXMgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgY2hhbm5lbAorICogYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LgorICogVGhlcmUgYXJlIG5vIGlsbCBlZmZlY3RzIGZyb20gdG9vLWxhcmdlIHJlY2VpdmUgcmluZ3MuCisgKgorICogV2UgZG9uJ3QgY3VycmVudGx5IHVzZSB0aGUgSGkgVHggcmluZyBzbywgZG9uJ3QgbWFrZSBpdCB2ZXJ5IGJpZy4KKyAqCisgKiBCZXdhcmUgdGhhdCBpZiB3ZSBzdGFydCB1c2luZyB0aGUgSGkgVHggcmluZywgd2Ugd2lsbCBuZWVkIHRvIGNoYW5nZQorICogdHlwaG9vbl9udW1fZnJlZV90eCgpIGFuZCB0eXBob29uX3R4X2NvbXBsZXRlKCkgdG8gYWNjb3VudCBmb3IgdGhhdC4KKyAqLworI2RlZmluZSBUWEhJX0VOVFJJRVMJCTIKKyNkZWZpbmUgVFhMT19FTlRSSUVTCQkxMjgKKyNkZWZpbmUgUlhfRU5UUklFUwkJMzIKKyNkZWZpbmUgQ09NTUFORF9FTlRSSUVTCQkxNgorI2RlZmluZSBSRVNQT05TRV9FTlRSSUVTCTMyCisKKyNkZWZpbmUgQ09NTUFORF9SSU5HX1NJWkUJKENPTU1BTkRfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgY21kX2Rlc2MpKQorI2RlZmluZSBSRVNQT05TRV9SSU5HX1NJWkUJKFJFU1BPTlNFX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHJlc3BfZGVzYykpCisKKy8qIFRoZSAzWFAgd2lsbCBwcmVsb2FkIGFuZCByZW1vdmUgNjQgZW50cmllcyBmcm9tIHRoZSBmcmVlIGJ1ZmZlcgorICogbGlzdCwgYW5kIHdlIG5lZWQgb25lIGVudHJ5IHRvIGtlZXAgdGhlIHJpbmcgZnJvbSB3cmFwcGluZywgc28gCisgKiB0byBrZWVwIHRoaXMgYSBwb3dlciBvZiB0d28sIHdlIHVzZSAxMjggZW50cmllcy4KKyAqLworI2RlZmluZSBSWEZSRUVfRU5UUklFUwkJMTI4CisjZGVmaW5lIFJYRU5UX0VOVFJJRVMJCShSWEZSRUVfRU5UUklFUyAtIDEpCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoMipIWikKKworI2RlZmluZSBQS1RfQlVGX1NaCQkxNTM2CisKKyNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkidHlwaG9vbiIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OIAkiMS41LjciCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiMDUvMDEvMDciCisjZGVmaW5lIFBGWAkJCURSVl9NT0RVTEVfTkFNRSAiOiAiCisjZGVmaW5lIEVSUl9QRlgJCQlLRVJOX0VSUiBQRlgKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlICJ0eXBob29uLmgiCisjaW5jbHVkZSAidHlwaG9vbi1maXJtd2FyZS5oIgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisgICAgInR5cGhvb24uYzogdmVyc2lvbiAiIERSVl9NT0RVTEVfVkVSU0lPTiAiICgiIERSVl9NT0RVTEVfUkVMREFURSAiKVxuIjsKKworTU9EVUxFX0FVVEhPUigiRGF2aWQgRGlsbG93IDxkYXZlQHRoZWRpbGxvd3Mub3JnPiIpOworTU9EVUxFX1ZFUlNJT04oRFJWX01PRFVMRV9WRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiM0NvbSBUeXBob29uIEZhbWlseSAoM0M5OTAsIDNDUjk5MCwgYW5kIHZhcmlhbnRzKSIpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICJQYWNrZXRzIHNtYWxsZXIgdGhhbiB0aGlzIGFyZSBjb3BpZWQgYW5kICIKKwkJCSAgICAgICAidGhlIGJ1ZmZlciBnaXZlbiBiYWNrIHRvIHRoZSBOSUMuIERlZmF1bHQgIgorCQkJICAgICAgICJpcyAyMDAuIik7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9tbWlvLCAiVXNlIE1NSU8gKDEpIG9yIFBJTygwKSB0byBhY2Nlc3MgdGhlIE5JQy4gIgorCQkJICAgIkRlZmF1bHQgaXMgdG8gdHJ5IE1NSU8gYW5kIGZhbGxiYWNrIHRvIFBJTy4iKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW0odXNlX21taW8sIGludCwgMCk7CisKKyNpZiBkZWZpbmVkKE5FVElGX0ZfVFNPKSAmJiBNQVhfU0tCX0ZSQUdTID4gMzIKKyN3YXJuaW5nIFR5cGhvb24gb25seSBzdXBwb3J0cyAzMiBlbnRyaWVzIGluIGl0cyBTRyBsaXN0IGZvciBUU08sIGRpc2FibGluZyBUU08KKyN1bmRlZiBORVRJRl9GX1RTTworI2VuZGlmCisKKyNpZiBUWExPX0VOVFJJRVMgPD0gKDIgKiBNQVhfU0tCX0ZSQUdTKQorI2Vycm9yIFRYIHJpbmcgdG9vIHNtYWxsIQorI2VuZGlmCisKK3N0cnVjdCB0eXBob29uX2NhcmRfaW5mbyB7CisJY2hhciAqbmFtZTsKKwlpbnQgY2FwYWJpbGl0aWVzOworfTsKKworI2RlZmluZSBUWVBIT09OX0NSWVBUT19OT05FCQkweDAwCisjZGVmaW5lIFRZUEhPT05fQ1JZUFRPX0RFUwkJMHgwMQorI2RlZmluZSBUWVBIT09OX0NSWVBUT18zREVTCQkweDAyCisjZGVmaW5lCVRZUEhPT05fQ1JZUFRPX1ZBUklBQkxFCQkweDA0CisjZGVmaW5lIFRZUEhPT05fRklCRVIJCQkweDA4CisjZGVmaW5lIFRZUEhPT05fV0FLRVVQX05FRURTX1JFU0VUCTB4MTAKKworZW51bSB0eXBob29uX2NhcmRzIHsKKwlUWVBIT09OX1RYID0gMCwgVFlQSE9PTl9UWDk1LCBUWVBIT09OX1RYOTcsIFRZUEhPT05fU1ZSLAorCVRZUEhPT05fU1ZSOTUsIFRZUEhPT05fU1ZSOTcsIFRZUEhPT05fVFhNLCBUWVBIT09OX0JTVlIsCisJVFlQSE9PTl9GWDk1LCBUWVBIT09OX0ZYOTcsIFRZUEhPT05fRlg5NVNWUiwgVFlQSE9PTl9GWDk3U1ZSLAorCVRZUEhPT05fRlhNLAorfTsKKworLyogZGlyZWN0bHkgaW5kZXhlZCBieSBlbnVtIHR5cGhvb25fY2FyZHMsIGFib3ZlICovCitzdGF0aWMgc3RydWN0IHR5cGhvb25fY2FyZF9pbmZvIHR5cGhvb25fY2FyZF9pbmZvW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7ICIzQ29tIFR5cGhvb24gKDNDOTkwLVRYKSIsCisJCVRZUEhPT05fQ1JZUFRPX05PTkV9LAorCXsgIjNDb20gVHlwaG9vbiAoM0NSOTkwLVRYLTk1KSIsCisJCVRZUEhPT05fQ1JZUFRPX0RFU30sCisJeyAiM0NvbSBUeXBob29uICgzQ1I5OTAtVFgtOTcpIiwKKwkgCVRZUEhPT05fQ1JZUFRPX0RFUyB8IFRZUEhPT05fQ1JZUFRPXzNERVN9LAorCXsgIjNDb20gVHlwaG9vbiAoM0M5OTBTVlIpIiwKKwkJVFlQSE9PTl9DUllQVE9fTk9ORX0sCisJeyAiM0NvbSBUeXBob29uICgzQ1I5OTBTVlI5NSkiLAorCQlUWVBIT09OX0NSWVBUT19ERVN9LAorCXsgIjNDb20gVHlwaG9vbiAoM0NSOTkwU1ZSOTcpIiwKKwkgCVRZUEhPT05fQ1JZUFRPX0RFUyB8IFRZUEhPT05fQ1JZUFRPXzNERVN9LAorCXsgIjNDb20gVHlwaG9vbjIgKDNDOTkwQi1UWC1NKSIsCisJCVRZUEhPT05fQ1JZUFRPX1ZBUklBQkxFfSwKKwl7ICIzQ29tIFR5cGhvb24yICgzQzk5MEJTVlIpIiwKKwkJVFlQSE9PTl9DUllQVE9fVkFSSUFCTEV9LAorCXsgIjNDb20gVHlwaG9vbiAoM0NSOTkwLUZYLTk1KSIsCisJCVRZUEhPT05fQ1JZUFRPX0RFUyB8IFRZUEhPT05fRklCRVJ9LAorCXsgIjNDb20gVHlwaG9vbiAoM0NSOTkwLUZYLTk3KSIsCisJIAlUWVBIT09OX0NSWVBUT19ERVMgfCBUWVBIT09OX0NSWVBUT18zREVTIHwgVFlQSE9PTl9GSUJFUn0sCisJeyAiM0NvbSBUeXBob29uICgzQ1I5OTAtRlgtOTUgU2VydmVyKSIsCisJIAlUWVBIT09OX0NSWVBUT19ERVMgfCBUWVBIT09OX0ZJQkVSfSwKKwl7ICIzQ29tIFR5cGhvb24gKDNDUjk5MC1GWC05NyBTZXJ2ZXIpIiwKKwkgCVRZUEhPT05fQ1JZUFRPX0RFUyB8IFRZUEhPT05fQ1JZUFRPXzNERVMgfCBUWVBIT09OX0ZJQkVSfSwKKwl7ICIzQ29tIFR5cGhvb24yICgzQzk5MEItRlgtOTcpIiwKKwkJVFlQSE9PTl9DUllQVE9fVkFSSUFCTEUgfCBUWVBIT09OX0ZJQkVSfSwKK307CisKKy8qIE5vdGVzIG9uIHRoZSBuZXcgc3Vic3lzdGVtIG51bWJlcmluZyBzY2hlbWU6CisgKiBiaXRzIDAtMSBpbmRpY2F0ZSBjcnlwdG8gY2FwYWJpbGl0ZXM6ICgwKSB2YXJpYWJsZSwgKDEpIERFUywgb3IgKDIpIDNERVMKKyAqIGJpdCA0IGluZGljYXRlcyBpZiB0aGlzIGNhcmQgaGFzIHNlY3VyZWQgZmlybXdhcmUgKHdlIGRvbid0IHN1cHBvcnQgaXQpCisgKiBiaXQgOCBpbmRpY2F0ZXMgaWYgdGhpcyBpcyBhICgwKSBjb3BwZXIgb3IgKDEpIGZpYmVyIGNhcmQKKyAqIGJpdHMgMTItMTYgaW5kaWNhdGUgY2FyZCB0eXBlOiAoMCkgY2xpZW50IGFuZCAoMSkgc2VydmVyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0eXBob29uX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDUjk5MCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsVFlQSE9PTl9UWCB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0NSOTkwX1RYXzk1LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVFlQSE9PTl9UWDk1IH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1I5OTBfVFhfOTcsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBUWVBIT09OX1RYOTcgfSwKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDUjk5MEIsCisJICBQQ0lfQU5ZX0lELCAweDEwMDAsIDAsIDAsIFRZUEhPT05fVFhNIH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1I5OTBCLAorCSAgUENJX0FOWV9JRCwgMHgxMTAyLCAwLCAwLCBUWVBIT09OX0ZYTSB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0NSOTkwQiwKKwkgIFBDSV9BTllfSUQsIDB4MjAwMCwgMCwgMCwgVFlQSE9PTl9CU1ZSIH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1I5OTBfRlgsCisJICBQQ0lfQU5ZX0lELCAweDExMDEsIDAsIDAsIFRZUEhPT05fRlg5NSB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0NSOTkwX0ZYLAorCSAgUENJX0FOWV9JRCwgMHgxMTAyLCAwLCAwLCBUWVBIT09OX0ZYOTcgfSwKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDUjk5MF9GWCwKKwkgIFBDSV9BTllfSUQsIDB4MjEwMSwgMCwgMCwgVFlQSE9PTl9GWDk1U1ZSIH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1I5OTBfRlgsCisJICBQQ0lfQU5ZX0lELCAweDIxMDIsIDAsIDAsIFRZUEhPT05fRlg5N1NWUiB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0NSOTkwU1ZSOTUsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBUWVBIT09OX1NWUjk1IH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1I5OTBTVlI5NywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRZUEhPT05fU1ZSOTcgfSwKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDUjk5MFNWUiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRZUEhPT05fU1ZSIH0sCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHR5cGhvb25fcGNpX3RibCk7CisKKy8qIERlZmluZSB0aGUgc2hhcmVkIG1lbW9yeSBhcmVhCisgKiBBbGlnbiBldmVyeXRoaW5nIHRoZSAzWFAgd2lsbCBub3JtYWxseSBiZSB1c2luZy4KKyAqIFdlJ2xsIG5lZWQgdG8gbW92ZS9hbGlnbiB0eEhpIGlmIHdlIHN0YXJ0IHVzaW5nIHRoYXQgcmluZy4KKyAqLworI2RlZmluZSBfXzN4cF9hbGlnbmVkCV9fX19jYWNoZWxpbmVfYWxpZ25lZAorc3RydWN0IHR5cGhvb25fc2hhcmVkIHsKKwlzdHJ1Y3QgdHlwaG9vbl9pbnRlcmZhY2UJaWZhY2U7CisJc3RydWN0IHR5cGhvb25faW5kZXhlcwkJaW5kZXhlcwkJCV9fM3hwX2FsaWduZWQ7CisJc3RydWN0IHR4X2Rlc2MJCQl0eExvW1RYTE9fRU5UUklFU10gCV9fM3hwX2FsaWduZWQ7CisJc3RydWN0IHJ4X2Rlc2MJCQlyeExvW1JYX0VOVFJJRVNdCV9fM3hwX2FsaWduZWQ7CisJc3RydWN0IHJ4X2Rlc2MJCQlyeEhpW1JYX0VOVFJJRVNdCV9fM3hwX2FsaWduZWQ7CisJc3RydWN0IGNtZF9kZXNjCQkJY21kW0NPTU1BTkRfRU5UUklFU10JX18zeHBfYWxpZ25lZDsKKwlzdHJ1Y3QgcmVzcF9kZXNjCQlyZXNwW1JFU1BPTlNFX0VOVFJJRVNdCV9fM3hwX2FsaWduZWQ7CisJc3RydWN0IHJ4X2ZyZWUJCQlyeEJ1ZmZbUlhGUkVFX0VOVFJJRVNdCV9fM3hwX2FsaWduZWQ7CisJdTMyCQkJCXplcm9Xb3JkOworCXN0cnVjdCB0eF9kZXNjCQkJdHhIaVtUWEhJX0VOVFJJRVNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCByeGJ1ZmZfZW50IHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWRtYV9hZGRyX3QJZG1hX2FkZHI7Cit9OworCitzdHJ1Y3QgdHlwaG9vbiB7CisJLyogVHggY2FjaGUgbGluZSBzZWN0aW9uICovCisJc3RydWN0IHRyYW5zbWl0X3JpbmcgCXR4TG9SaW5nCV9fX19jYWNoZWxpbmVfYWxpZ25lZDsJCisJc3RydWN0IHBjaV9kZXYgKgl0eF9wZGV2OworCXZvaWQgX19pb21lbQkJKnR4X2lvYWRkcjsKKwl1MzIJCQl0eGxvX2RtYV9hZGRyOworCisJLyogSXJxL1J4IGNhY2hlIGxpbmUgc2VjdGlvbiAqLworCXZvaWQgX19pb21lbQkJKmlvYWRkcgkJX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXN0cnVjdCB0eXBob29uX2luZGV4ZXMgKmluZGV4ZXM7CisJdTgJCQlhd2FpdGluZ19yZXNwOworCXU4CQkJZHVwbGV4OworCXU4CQkJc3BlZWQ7CisJdTgJCQljYXJkX3N0YXRlOworCXN0cnVjdCBiYXNpY19yaW5nCXJ4TG9SaW5nOworCXN0cnVjdCBwY2lfZGV2ICoJcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqCWRldjsKKwlzcGlubG9ja190CQlzdGF0ZV9sb2NrOworCXN0cnVjdCB2bGFuX2dyb3VwICoJdmxncnA7CisJc3RydWN0IGJhc2ljX3JpbmcJcnhIaVJpbmc7CisJc3RydWN0IGJhc2ljX3JpbmcJcnhCdWZmUmluZzsKKwlzdHJ1Y3QgcnhidWZmX2VudAlyeGJ1ZmZlcnNbUlhFTlRfRU5UUklFU107CisKKwkvKiBnZW5lcmFsIHNlY3Rpb24gKi8KKwlzcGlubG9ja190CQljb21tYW5kX2xvY2sJX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXN0cnVjdCBiYXNpY19yaW5nCWNtZFJpbmc7CisJc3RydWN0IGJhc2ljX3JpbmcJcmVzcFJpbmc7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHNfc2F2ZWQ7CisJY29uc3QgY2hhciAqCQluYW1lOworCXN0cnVjdCB0eXBob29uX3NoYXJlZCAqCXNoYXJlZDsKKwlkbWFfYWRkcl90CQlzaGFyZWRfZG1hOworCXUxNgkJCXhjdnJfc2VsZWN0OworCXUxNgkJCXdvbF9ldmVudHM7CisJdTMyCQkJb2ZmbG9hZDsKKworCS8qIHVudXNlZCBzdHVmZiAoZnV0dXJlIHVzZSkgKi8KKwlpbnQJCQljYXBhYmlsaXRpZXM7CisJc3RydWN0IHRyYW5zbWl0X3JpbmcgCXR4SGlSaW5nOworfTsKKworZW51bSBjb21wbGV0aW9uX3dhaXRfdmFsdWVzIHsKKwlOb1dhaXQgPSAwLCBXYWl0Tm9TbGVlcCwgV2FpdFNsZWVwLAorfTsKKworLyogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgZm9yIHRoZSB0eXBob29uLmNhcmRfc3RhdGUgdmFyaWFibGUuCisgKiBUaGVzZSBkZXRlcm1pbmUgd2hlcmUgdGhlIHN0YXRpc3RpY3Mgd2lsbCBjb21lIGZyb20gaW4gZ2V0X3N0YXRzKCkuCisgKiBUaGUgc2xlZXAgaW1hZ2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3RhdGlzdGljcyB3ZSBuZWVkLgorICovCitlbnVtIHN0YXRlX3ZhbHVlcyB7CisJU2xlZXBpbmcgPSAwLCBSdW5uaW5nLAorfTsKKworLyogUENJIHdyaXRlcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgcG9zdGVkIGluIG9yZGVyLCBidXQgb3V0c3RhbmRpbmcgd3JpdGVzCisgKiBjYW5ub3QgcGFzcyBhIHJlYWQsIHNvIHRoaXMgZm9yY2VzIGN1cnJlbnQgd3JpdGVzIHRvIHBvc3QuCisgKi8KKyNkZWZpbmUgdHlwaG9vbl9wb3N0X3BjaV93cml0ZXMoeCkgXAorCWRvIHsgaWYobGlrZWx5KHVzZV9tbWlvKSkgaW9yZWFkMzIoeCtUWVBIT09OX1JFR19IRUFSVEJFQVQpOyB9IHdoaWxlKDApCisKKy8qIFdlJ2xsIHdhaXQgdXAgdG8gc2l4IHNlY29uZHMgZm9yIGEgcmVzZXQsIGFuZCBoYWxmIGEgc2Vjb25kIG5vcm1hbGx5LgorICovCisjZGVmaW5lIFRZUEhPT05fVURFTEFZCQkJNTAKKyNkZWZpbmUgVFlQSE9PTl9SRVNFVF9USU1FT1VUX1NMRUVQCSg2ICogSFopCisjZGVmaW5lIFRZUEhPT05fUkVTRVRfVElNRU9VVF9OT1NMRUVQCSgoNiAqIDEwMDAwMDApIC8gVFlQSE9PTl9VREVMQVkpCisjZGVmaW5lIFRZUEhPT05fV0FJVF9USU1FT1VUCQkoKDEwMDAwMDAgLyAyKSAvIFRZUEhPT05fVURFTEFZKQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNSwgMjgpCisjZGVmaW5lIHR5cGhvb25fc3luY2hyb25pemVfaXJxKHgpIHN5bmNocm9uaXplX2lycSgpCisjZWxzZQorI2RlZmluZSB0eXBob29uX3N5bmNocm9uaXplX2lycSh4KSBzeW5jaHJvbml6ZV9pcnEoeCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChORVRJRl9GX1RTTykKKyNkZWZpbmUgc2tiX3Rzb19zaXplKHgpCQkoc2tiX3NoaW5mbyh4KS0+dHNvX3NpemUpCisjZGVmaW5lIFRTT19OVU1fREVTQ1JJUFRPUlMJMgorI2RlZmluZSBUU09fT0ZGTE9BRF9PTgkJVFlQSE9PTl9PRkZMT0FEX1RDUF9TRUdNRU5UCisjZWxzZQorI2RlZmluZSBORVRJRl9GX1RTTyAJCTAKKyNkZWZpbmUgc2tiX3Rzb19zaXplKHgpIAkwCisjZGVmaW5lIFRTT19OVU1fREVTQ1JJUFRPUlMJMAorI2RlZmluZSBUU09fT0ZGTE9BRF9PTgkJMAorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZAordHlwaG9vbl9pbmNfaW5kZXgodTMyICppbmRleCwgY29uc3QgaW50IGNvdW50LCBjb25zdCBpbnQgbnVtX2VudHJpZXMpCit7CisJLyogSW5jcmVtZW50IGEgcmluZyBpbmRleCAtLSB3ZSBjYW4gdXNlIHRoaXMgZm9yIGFsbCByaW5ncyBleGVjZXB0CisJICogdGhlIFJ4IHJpbmdzLCBhcyB0aGV5IHVzZSBkaWZmZXJlbnQgc2l6ZSBkZXNjcmlwdG9ycworCSAqIG90aGVyd2lzZSwgZXZlcnl0aGluZyBpcyB0aGUgc2FtZSBzaXplIGFzIGEgY21kX2Rlc2MKKwkgKi8KKwkqaW5kZXggKz0gY291bnQgKiBzaXplb2Yoc3RydWN0IGNtZF9kZXNjKTsKKwkqaW5kZXggJT0gbnVtX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IGNtZF9kZXNjKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit0eXBob29uX2luY19jbWRfaW5kZXgodTMyICppbmRleCwgY29uc3QgaW50IGNvdW50KQoreworCXR5cGhvb25faW5jX2luZGV4KGluZGV4LCBjb3VudCwgQ09NTUFORF9FTlRSSUVTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit0eXBob29uX2luY19yZXNwX2luZGV4KHUzMiAqaW5kZXgsIGNvbnN0IGludCBjb3VudCkKK3sKKwl0eXBob29uX2luY19pbmRleChpbmRleCwgY291bnQsIFJFU1BPTlNFX0VOVFJJRVMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3R5cGhvb25faW5jX3J4ZnJlZV9pbmRleCh1MzIgKmluZGV4LCBjb25zdCBpbnQgY291bnQpCit7CisJdHlwaG9vbl9pbmNfaW5kZXgoaW5kZXgsIGNvdW50LCBSWEZSRUVfRU5UUklFUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordHlwaG9vbl9pbmNfdHhfaW5kZXgodTMyICppbmRleCwgY29uc3QgaW50IGNvdW50KQoreworCS8qIGlmIHdlIHN0YXJ0IHVzaW5nIHRoZSBIaSBUeCByaW5nLCB0aGlzIG5lZWRzIHVwZGF0ZWluZyAqLworCXR5cGhvb25faW5jX2luZGV4KGluZGV4LCBjb3VudCwgVFhMT19FTlRSSUVTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit0eXBob29uX2luY19yeF9pbmRleCh1MzIgKmluZGV4LCBjb25zdCBpbnQgY291bnQpCit7CisJLyogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSAhPSBzaXplb2Yoc3RydWN0IGNtZF9kZXNjKSAqLworCSppbmRleCArPSBjb3VudCAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYyk7CisJKmluZGV4ICU9IFJYX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX3Jlc2V0KHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgd2FpdF90eXBlKQoreworCWludCBpLCBlcnIgPSAwOworCWludCB0aW1lb3V0OworCisJaWYod2FpdF90eXBlID09IFdhaXROb1NsZWVwKQorCQl0aW1lb3V0ID0gVFlQSE9PTl9SRVNFVF9USU1FT1VUX05PU0xFRVA7CisJZWxzZQorCQl0aW1lb3V0ID0gVFlQSE9PTl9SRVNFVF9USU1FT1VUX1NMRUVQOworCisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfTUFTSyk7CisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKworCWlvd3JpdGUzMihUWVBIT09OX1JFU0VUX0FMTCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfU09GVF9SRVNFVCk7CisJdHlwaG9vbl9wb3N0X3BjaV93cml0ZXMoaW9hZGRyKTsKKwl1ZGVsYXkoMSk7CisJaW93cml0ZTMyKFRZUEhPT05fUkVTRVRfTk9ORSwgaW9hZGRyICsgVFlQSE9PTl9SRUdfU09GVF9SRVNFVCk7CisKKwlpZih3YWl0X3R5cGUgIT0gTm9XYWl0KSB7CisJCWZvcihpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgeworCQkJaWYoaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfU1RBVFVTKSA9PQorCQkJICAgVFlQSE9PTl9TVEFUVVNfV0FJVElOR19GT1JfSE9TVCkKKwkJCQlnb3RvIG91dDsKKworCQkJaWYod2FpdF90eXBlID09IFdhaXRTbGVlcCkgeworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQkJfSBlbHNlCisJCQkJdWRlbGF5KFRZUEhPT05fVURFTEFZKTsKKwkJfQorCisJCWVyciA9IC1FVElNRURPVVQ7CisJfQorCitvdXQ6CisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfTUFTSyk7CisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKworCS8qIFRoZSAzWFAgc2VlbXMgdG8gbmVlZCBhIGxpdHRsZSBleHRyYSB0aW1lIHRvIGNvbXBsZXRlIHRoZSBsb2FkCisJICogb2YgdGhlIHNsZWVwIGltYWdlIGJlZm9yZSB3ZSBjYW4gcmVsaWFibHkgYm9vdCBpdC4gRmFpbHVyZSB0bworCSAqIGRvIHRoaXMgb2NjYXNpb25hbGx5IHJlc3VsdHMgaW4gYSBodW5nIGFkYXB0ZXIgYWZ0ZXIgYm9vdCBpbgorCSAqIHR5cGhvb25faW5pdF9vbmUoKSB3aGlsZSB0cnlpbmcgdG8gcmVhZCB0aGUgTUFDIGFkZHJlc3Mgb3IKKwkgKiBwdXR0aW5nIHRoZSBjYXJkIHRvIHNsZWVwLiAzQ29tJ3MgZHJpdmVyIHdhaXRzIDVtcywgYnV0CisJICogdGhhdCBzZWVtcyB0byBiZSBvdmVya2lsbC4gSG93ZXZlciwgaWYgd2UgY2FuIHNsZWVwLCB3ZSBtaWdodAorCSAqIGFzIHdlbGwgZ2l2ZSBpdCB0aGF0IG11Y2ggdGltZS4gT3RoZXJ3aXNlLCB3ZSdsbCBnaXZlIGl0IDUwMHVzLAorCSAqIHdoaWNoIHNob3VsZCBiZSBlbm91Z2ggKEkndmUgc2VlIGl0IHdvcmsgd2VsbCBhdCAxMDB1cywgYnV0IHN0aWxsCisJICogc2F3IG9jY2FzaW9uYWwgcHJvYmxlbXMuKQorCSAqLworCWlmKHdhaXRfdHlwZSA9PSBXYWl0U2xlZXApCisJCW1zbGVlcCg1KTsKKwllbHNlCisJCXVkZWxheSg1MDApOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fd2FpdF9zdGF0dXModm9pZCBfX2lvbWVtICppb2FkZHIsIHUzMiB3YWl0X3ZhbHVlKQoreworCWludCBpLCBlcnIgPSAwOworCisJZm9yKGkgPSAwOyBpIDwgVFlQSE9PTl9XQUlUX1RJTUVPVVQ7IGkrKykgeworCQlpZihpb3JlYWQzMihpb2FkZHIgKyBUWVBIT09OX1JFR19TVEFUVVMpID09IHdhaXRfdmFsdWUpCisJCQlnb3RvIG91dDsKKwkJdWRlbGF5KFRZUEhPT05fVURFTEFZKTsKKwl9CisKKwllcnIgPSAtRVRJTUVET1VUOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit0eXBob29uX21lZGlhX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcmVzcF9kZXNjICpyZXNwKQoreworCWlmKHJlc3AtPnBhcm0xICYgVFlQSE9PTl9NRURJQV9TVEFUX05PX0xJTkspCisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJZWxzZQorCQluZXRpZl9jYXJyaWVyX29uKGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordHlwaG9vbl9oZWxsbyhzdHJ1Y3QgdHlwaG9vbiAqdHApCit7CisJc3RydWN0IGJhc2ljX3JpbmcgKnJpbmcgPSAmdHAtPmNtZFJpbmc7CisJc3RydWN0IGNtZF9kZXNjICpjbWQ7CisKKwkvKiBXZSBvbmx5IGdldCBhIGhlbGxvIHJlcXVlc3QgaWYgd2UndmUgbm90IHNlbnQgYW55dGhpbmcgdG8gdGhlCisJICogY2FyZCBpbiBhIGxvbmcgd2hpbGUuIElmIHRoZSBsb2NrIGlzIGhlbGQsIHRoZW4gd2UncmUgaW4gdGhlCisJICogcHJvY2VzcyBvZiBpc3N1aW5nIGEgY29tbWFuZCwgc28gd2UgZG9uJ3QgbmVlZCB0byByZXNwb25kLgorCSAqLworCWlmKHNwaW5fdHJ5bG9jaygmdHAtPmNvbW1hbmRfbG9jaykpIHsKKwkJY21kID0gKHN0cnVjdCBjbWRfZGVzYyAqKShyaW5nLT5yaW5nQmFzZSArIHJpbmctPmxhc3RXcml0ZSk7CisJCXR5cGhvb25faW5jX2NtZF9pbmRleCgmcmluZy0+bGFzdFdyaXRlLCAxKTsKKworCQlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoY21kLCBUWVBIT09OX0NNRF9IRUxMT19SRVNQKTsKKwkJc21wX3dtYigpOworCQlpb3dyaXRlMzIocmluZy0+bGFzdFdyaXRlLCB0cC0+aW9hZGRyICsgVFlQSE9PTl9SRUdfQ01EX1JFQURZKTsKKwkJc3Bpbl91bmxvY2soJnRwLT5jb21tYW5kX2xvY2spOworCX0KK30KKworc3RhdGljIGludAordHlwaG9vbl9wcm9jZXNzX3Jlc3BvbnNlKHN0cnVjdCB0eXBob29uICp0cCwgaW50IHJlc3Bfc2l6ZSwKKwkJCQlzdHJ1Y3QgcmVzcF9kZXNjICpyZXNwX3NhdmUpCit7CisJc3RydWN0IHR5cGhvb25faW5kZXhlcyAqaW5kZXhlcyA9IHRwLT5pbmRleGVzOworCXN0cnVjdCByZXNwX2Rlc2MgKnJlc3A7CisJdTggKmJhc2UgPSB0cC0+cmVzcFJpbmcucmluZ0Jhc2U7CisJaW50IGNvdW50LCBsZW4sIHdyYXBfbGVuOworCXUzMiBjbGVhcmVkOworCXUzMiByZWFkeTsKKworCWNsZWFyZWQgPSBsZTMyX3RvX2NwdShpbmRleGVzLT5yZXNwQ2xlYXJlZCk7CisJcmVhZHkgPSBsZTMyX3RvX2NwdShpbmRleGVzLT5yZXNwUmVhZHkpOworCXdoaWxlKGNsZWFyZWQgIT0gcmVhZHkpIHsKKwkJcmVzcCA9IChzdHJ1Y3QgcmVzcF9kZXNjICopKGJhc2UgKyBjbGVhcmVkKTsKKwkJY291bnQgPSByZXNwLT5udW1EZXNjICsgMTsKKwkJaWYocmVzcF9zYXZlICYmIHJlc3AtPnNlcU5vKSB7CisJCQlpZihjb3VudCA+IHJlc3Bfc2l6ZSkgeworCQkJCXJlc3Bfc2F2ZS0+ZmxhZ3MgPSBUWVBIT09OX1JFU1BfRVJST1I7CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCisJCQl3cmFwX2xlbiA9IDA7CisJCQlsZW4gPSBjb3VudCAqIHNpemVvZigqcmVzcCk7CisJCQlpZih1bmxpa2VseShjbGVhcmVkICsgbGVuID4gUkVTUE9OU0VfUklOR19TSVpFKSkgeworCQkJCXdyYXBfbGVuID0gY2xlYXJlZCArIGxlbiAtIFJFU1BPTlNFX1JJTkdfU0laRTsKKwkJCQlsZW4gPSBSRVNQT05TRV9SSU5HX1NJWkUgLSBjbGVhcmVkOworCQkJfQorCisJCQltZW1jcHkocmVzcF9zYXZlLCByZXNwLCBsZW4pOworCQkJaWYodW5saWtlbHkod3JhcF9sZW4pKSB7CisJCQkJcmVzcF9zYXZlICs9IGxlbiAvIHNpemVvZigqcmVzcCk7CisJCQkJbWVtY3B5KHJlc3Bfc2F2ZSwgYmFzZSwgd3JhcF9sZW4pOworCQkJfQorCisJCQlyZXNwX3NhdmUgPSBOVUxMOworCQl9IGVsc2UgaWYocmVzcC0+Y21kID09IFRZUEhPT05fQ01EX1JFQURfTUVESUFfU1RBVFVTKSB7CisJCQl0eXBob29uX21lZGlhX3N0YXR1cyh0cC0+ZGV2LCByZXNwKTsKKwkJfSBlbHNlIGlmKHJlc3AtPmNtZCA9PSBUWVBIT09OX0NNRF9IRUxMT19SRVNQKSB7CisJCQl0eXBob29uX2hlbGxvKHRwKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGR1bXBpbmcgdW5leHBlY3RlZCByZXNwb25zZSAiCisJCQkgICAgICAgIjB4JTA0eDolZDoweCUwMng6MHglMDR4OiUwOHg6JTA4eFxuIiwKKwkJCSAgICAgICB0cC0+bmFtZSwgbGUxNl90b19jcHUocmVzcC0+Y21kKSwKKwkJCSAgICAgICByZXNwLT5udW1EZXNjLCByZXNwLT5mbGFncywKKwkJCSAgICAgICBsZTE2X3RvX2NwdShyZXNwLT5wYXJtMSksCisJCQkgICAgICAgbGUzMl90b19jcHUocmVzcC0+cGFybTIpLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KHJlc3AtPnBhcm0zKSk7CisJCX0KKworY2xlYW51cDoKKwkJdHlwaG9vbl9pbmNfcmVzcF9pbmRleCgmY2xlYXJlZCwgY291bnQpOworCX0KKworCWluZGV4ZXMtPnJlc3BDbGVhcmVkID0gY3B1X3RvX2xlMzIoY2xlYXJlZCk7CisJd21iKCk7CisJcmV0dXJuIChyZXNwX3NhdmUgPT0gTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit0eXBob29uX251bV9mcmVlKGludCBsYXN0V3JpdGUsIGludCBsYXN0UmVhZCwgaW50IHJpbmdTaXplKQoreworCS8qIHRoaXMgd29ya3MgZm9yIGFsbCBkZXNjcmlwdG9ycyBidXQgcnhfZGVzYywgYXMgdGhleSBhcmUgYQorCSAqIGRpZmZlcmVudCBzaXplIHRoYW4gdGhlIGNtZF9kZXNjIC0tIGV2ZXJ5b25lIGVsc2UgaXMgdGhlIHNhbWUKKwkgKi8KKwlsYXN0V3JpdGUgLz0gc2l6ZW9mKHN0cnVjdCBjbWRfZGVzYyk7CisJbGFzdFJlYWQgLz0gc2l6ZW9mKHN0cnVjdCBjbWRfZGVzYyk7CisJcmV0dXJuIChyaW5nU2l6ZSArIGxhc3RSZWFkIC0gbGFzdFdyaXRlIC0gMSkgJSByaW5nU2l6ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3R5cGhvb25fbnVtX2ZyZWVfY21kKHN0cnVjdCB0eXBob29uICp0cCkKK3sKKwlpbnQgbGFzdFdyaXRlID0gdHAtPmNtZFJpbmcubGFzdFdyaXRlOworCWludCBjbWRDbGVhcmVkID0gbGUzMl90b19jcHUodHAtPmluZGV4ZXMtPmNtZENsZWFyZWQpOworCisJcmV0dXJuIHR5cGhvb25fbnVtX2ZyZWUobGFzdFdyaXRlLCBjbWRDbGVhcmVkLCBDT01NQU5EX0VOVFJJRVMpOworfQorCitzdGF0aWMgaW5saW5lIGludAordHlwaG9vbl9udW1fZnJlZV9yZXNwKHN0cnVjdCB0eXBob29uICp0cCkKK3sKKwlpbnQgcmVzcFJlYWR5ID0gbGUzMl90b19jcHUodHAtPmluZGV4ZXMtPnJlc3BSZWFkeSk7CisJaW50IHJlc3BDbGVhcmVkID0gbGUzMl90b19jcHUodHAtPmluZGV4ZXMtPnJlc3BDbGVhcmVkKTsKKworCXJldHVybiB0eXBob29uX251bV9mcmVlKHJlc3BSZWFkeSwgcmVzcENsZWFyZWQsIFJFU1BPTlNFX0VOVFJJRVMpOworfQorCitzdGF0aWMgaW5saW5lIGludAordHlwaG9vbl9udW1fZnJlZV90eChzdHJ1Y3QgdHJhbnNtaXRfcmluZyAqcmluZykKK3sKKwkvKiBpZiB3ZSBzdGFydCB1c2luZyB0aGUgSGkgVHggcmluZywgdGhpcyBuZWVkcyB1cGRhdGluZyAqLworCXJldHVybiB0eXBob29uX251bV9mcmVlKHJpbmctPmxhc3RXcml0ZSwgcmluZy0+bGFzdFJlYWQsIFRYTE9fRU5UUklFUyk7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25faXNzdWVfY29tbWFuZChzdHJ1Y3QgdHlwaG9vbiAqdHAsIGludCBudW1fY21kLCBzdHJ1Y3QgY21kX2Rlc2MgKmNtZCwKKwkJICAgICAgaW50IG51bV9yZXNwLCBzdHJ1Y3QgcmVzcF9kZXNjICpyZXNwKQoreworCXN0cnVjdCB0eXBob29uX2luZGV4ZXMgKmluZGV4ZXMgPSB0cC0+aW5kZXhlczsKKwlzdHJ1Y3QgYmFzaWNfcmluZyAqcmluZyA9ICZ0cC0+Y21kUmluZzsKKwlzdHJ1Y3QgcmVzcF9kZXNjIGxvY2FsX3Jlc3A7CisJaW50IGksIGVyciA9IDA7CisJaW50IGdvdF9yZXNwOworCWludCBmcmVlQ21kLCBmcmVlUmVzcDsKKwlpbnQgbGVuLCB3cmFwX2xlbjsKKworCXNwaW5fbG9jaygmdHAtPmNvbW1hbmRfbG9jayk7CisKKwlmcmVlQ21kID0gdHlwaG9vbl9udW1fZnJlZV9jbWQodHApOworCWZyZWVSZXNwID0gdHlwaG9vbl9udW1fZnJlZV9yZXNwKHRwKTsKKworCWlmKGZyZWVDbWQgPCBudW1fY21kIHx8IGZyZWVSZXNwIDwgbnVtX3Jlc3ApIHsKKwkJcHJpbnRrKCIlczogbm8gZGVzY3MgZm9yIGNtZCwgaGFkIChuZWVkZWQpICVkICglZCkgY21kLCAiCisJCQkiJWQgKCVkKSByZXNwXG4iLCB0cC0+bmFtZSwgZnJlZUNtZCwgbnVtX2NtZCwKKwkJCWZyZWVSZXNwLCBudW1fcmVzcCk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWlmKGNtZC0+ZmxhZ3MgJiBUWVBIT09OX0NNRF9SRVNQT05EKSB7CisJCS8qIElmIHdlJ3JlIGV4cGVjdGluZyBhIHJlc3BvbnNlLCBidXQgdGhlIGNhbGxlciBoYXNuJ3QgZ2l2ZW4KKwkJICogdXMgYSBwbGFjZSB0byBwdXQgaXQsIHdlJ2xsIHByb3ZpZGUgb25lLgorCQkgKi8KKwkJdHAtPmF3YWl0aW5nX3Jlc3AgPSAxOworCQlpZihyZXNwID09IE5VTEwpIHsKKwkJCXJlc3AgPSAmbG9jYWxfcmVzcDsKKwkJCW51bV9yZXNwID0gMTsKKwkJfQorCX0KKworCXdyYXBfbGVuID0gMDsKKwlsZW4gPSBudW1fY21kICogc2l6ZW9mKCpjbWQpOworCWlmKHVubGlrZWx5KHJpbmctPmxhc3RXcml0ZSArIGxlbiA+IENPTU1BTkRfUklOR19TSVpFKSkgeworCQl3cmFwX2xlbiA9IHJpbmctPmxhc3RXcml0ZSArIGxlbiAtIENPTU1BTkRfUklOR19TSVpFOworCQlsZW4gPSBDT01NQU5EX1JJTkdfU0laRSAtIHJpbmctPmxhc3RXcml0ZTsKKwl9CisKKwltZW1jcHkocmluZy0+cmluZ0Jhc2UgKyByaW5nLT5sYXN0V3JpdGUsIGNtZCwgbGVuKTsKKwlpZih1bmxpa2VseSh3cmFwX2xlbikpIHsKKwkJc3RydWN0IGNtZF9kZXNjICp3cmFwX3B0ciA9IGNtZDsKKwkJd3JhcF9wdHIgKz0gbGVuIC8gc2l6ZW9mKCpjbWQpOworCQltZW1jcHkocmluZy0+cmluZ0Jhc2UsIHdyYXBfcHRyLCB3cmFwX2xlbik7CisJfQorCisJdHlwaG9vbl9pbmNfY21kX2luZGV4KCZyaW5nLT5sYXN0V3JpdGUsIG51bV9jbWQpOworCisJLyogIkkgZmVlbCBhIHByZXNlbmNlLi4uIGFub3RoZXIgd2FycmlvciBpcyBvbiB0aGUgdGhlIG1lc2EuIgorCSAqLworCXdtYigpOworCWlvd3JpdGUzMihyaW5nLT5sYXN0V3JpdGUsIHRwLT5pb2FkZHIgKyBUWVBIT09OX1JFR19DTURfUkVBRFkpOworCXR5cGhvb25fcG9zdF9wY2lfd3JpdGVzKHRwLT5pb2FkZHIpOworCisJaWYoKGNtZC0+ZmxhZ3MgJiBUWVBIT09OX0NNRF9SRVNQT05EKSA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qIFVnaC4gV2UnbGwgYmUgaGVyZSBhYm91dCA4bXMsIHNwaW5uaW5nIG91ciB0aHVtYnMsIHVuYWJsZSB0bworCSAqIHByZWVtcHQgb3IgZG8gYW55dGhpbmcgb3RoZXIgdGhhbiB0YWtlIGludGVycnVwdHMuIFNvLCBkb24ndAorCSAqIHdhaXQgZm9yIGEgcmVzcG9uc2UgdW5sZXNzIHlvdSBoYXZlIHRvLgorCSAqCisJICogSSd2ZSB0aG91Z2h0IGFib3V0IHRyeWluZyB0byBzbGVlcCBoZXJlLCBidXQgd2UncmUgY2FsbGVkCisJICogZnJvbSBtYW55IGNvbnRleHRzIHRoYXQgZG9uJ3QgYWxsb3cgdGhhdC4gQWxzbywgZ2l2ZW4gdGhlIHdheQorCSAqIDNDb20gaGFzIGltcGxlbWVudGVkIGlycSBjb2FsZXNjaW5nLCB3ZSB3b3VsZCBsaWtlbHkgdGltZW91dCAtLQorCSAqIHRoaXMgaGFzIGJlZW4gb2JzZXJ2ZWQgaW4gcmVhbCBsaWZlIQorCSAqCisJICogVGhlIGJpZyBraWxsZXIgaXMgd2UgaGF2ZSB0byB3YWl0IHRvIGdldCBzdGF0cyBmcm9tIHRoZSBjYXJkLAorCSAqIHRob3VnaCB3ZSBjb3VsZCBnbyB0byBhIHBlcmlvZGljIHJlZnJlc2ggb2YgdGhvc2UgaWYgd2UgZG9uJ3QKKwkgKiBtaW5kIHRoZW0gZ2V0dGluZyBzb21ld2hhdCBzdGFsZS4gVGhlIHJlc3Qgb2YgdGhlIHdhaXRpbmcKKwkgKiBjb21tYW5kcyBvY2N1ciBkdXJpbmcgb3Blbi9jbG9zZS9zdXNwZW5kL3Jlc3VtZSwgc28gdGhleSBhcmVuJ3QKKwkgKiB0aW1lIGNyaXRpY2FsLiBDcmVhdGluZyBTQXMgaW4gdGhlIGZ1dHVyZSB3aWxsIGFsc28gaGF2ZSB0bworCSAqIHdhaXQgaGVyZS4KKwkgKi8KKwlnb3RfcmVzcCA9IDA7CisJZm9yKGkgPSAwOyBpIDwgVFlQSE9PTl9XQUlUX1RJTUVPVVQgJiYgIWdvdF9yZXNwOyBpKyspIHsKKwkJaWYoaW5kZXhlcy0+cmVzcENsZWFyZWQgIT0gaW5kZXhlcy0+cmVzcFJlYWR5KQorCQkJZ290X3Jlc3AgPSB0eXBob29uX3Byb2Nlc3NfcmVzcG9uc2UodHAsIG51bV9yZXNwLAorCQkJCQkJCQlyZXNwKTsKKwkJdWRlbGF5KFRZUEhPT05fVURFTEFZKTsKKwl9CisKKwlpZighZ290X3Jlc3ApIHsKKwkJZXJyID0gLUVUSU1FRE9VVDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ29sbGVjdCB0aGUgZXJyb3IgcmVzcG9uc2UgZXZlbiBpZiB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZQorCSAqIHJlc3Qgb2YgdGhlIHJlc3BvbnNlCisJICovCisJaWYocmVzcC0+ZmxhZ3MgJiBUWVBIT09OX1JFU1BfRVJST1IpCisJCWVyciA9IC1FSU87CisKK291dDoKKwlpZih0cC0+YXdhaXRpbmdfcmVzcCkgeworCQl0cC0+YXdhaXRpbmdfcmVzcCA9IDA7CisJCXNtcF93bWIoKTsKKworCQkvKiBVZ2guIElmIGEgcmVzcG9uc2Ugd2FzIGFkZGVkIHRvIHRoZSByaW5nIGJldHdlZW4KKwkJICogdGhlIGNhbGwgdG8gdHlwaG9vbl9wcm9jZXNzX3Jlc3BvbnNlKCkgYW5kIHRoZSBjbGVhcmluZworCQkgKiBvZiB0cC0+YXdhaXRpbmdfcmVzcCwgd2UgY291bGQgaGF2ZSBtaXNzZWQgdGhlIGludGVycnVwdAorCQkgKiBhbmQgaXQgY291bGQgaGFuZyBpbiB0aGUgcmluZyBhbiBpbmRldGVybWluYXRlIGFtb3VudCBvZgorCQkgKiB0aW1lLiBTbywgY2hlY2sgZm9yIGl0LCBhbmQgaW50ZXJydXB0IG91cnNlbHZlcyBpZiB0aGlzCisJCSAqIGlzIHRoZSBjYXNlLgorCQkgKi8KKwkJaWYoaW5kZXhlcy0+cmVzcENsZWFyZWQgIT0gaW5kZXhlcy0+cmVzcFJlYWR5KQorCQkJaW93cml0ZTMyKDEsIHRwLT5pb2FkZHIgKyBUWVBIT09OX1JFR19TRUxGX0lOVEVSUlVQVCk7CisJfQorCisJc3Bpbl91bmxvY2soJnRwLT5jb21tYW5kX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisJaW50IGVycjsKKworCXNwaW5fbG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCWlmKCF0cC0+dmxncnAgIT0gIWdycCkgeworCQkvKiBXZSd2ZSBlaXRoZXIgYmVlbiB0dXJuZWQgb24gZm9yIHRoZSBmaXJzdCB0aW1lLCBvciB3ZSd2ZQorCQkgKiBiZWVuIHR1cm5lZCBvZmYuIFVwZGF0ZSB0aGUgM1hQLgorCQkgKi8KKwkJaWYoZ3JwKQorCQkJdHAtPm9mZmxvYWQgfD0gVFlQSE9PTl9PRkZMT0FEX1ZMQU47CisJCWVsc2UKKwkJCXRwLT5vZmZsb2FkICY9IH5UWVBIT09OX09GRkxPQURfVkxBTjsKKworCQkvKiBJZiB0aGUgaW50ZXJmYWNlIGlzIHVwLCB0aGUgcnVudGltZSBpcyBydW5uaW5nIC0tIGFuZCB3ZQorCQkgKiBtdXN0IGJlIHVwIGZvciB0aGUgdmxhbiBjb3JlIHRvIGNhbGwgdXMuCisJCSAqCisJCSAqIERvIHRoZSBjb21tYW5kIG91dHNpZGUgb2YgdGhlIHNwaW4gbG9jaywgYXMgaXQgaXMgc2xvdy4KKwkJICovCisJCUlOSVRfQ09NTUFORF9XSVRIX1JFU1BPTlNFKCZ4cF9jbWQsCisJCQkJCVRZUEhPT05fQ01EX1NFVF9PRkZMT0FEX1RBU0tTKTsKKwkJeHBfY21kLnBhcm0yID0gdHAtPm9mZmxvYWQ7CisJCXhwX2NtZC5wYXJtMyA9IHRwLT5vZmZsb2FkOworCQlzcGluX3VubG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCQllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCQlpZihlcnIgPCAwKQorCQkJcHJpbnRrKCIlczogdmxhbiBvZmZsb2FkIGVycm9yICVkXG4iLCB0cC0+bmFtZSwgLWVycik7CisJCXNwaW5fbG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCX0KKworCS8qIG5vdyBtYWtlIHRoZSBjaGFuZ2UgdmlzaWJsZSAqLworCXRwLT52bGdycCA9IGdycDsKKwlzcGluX3VubG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworfQorCitzdGF0aWMgdm9pZAordHlwaG9vbl92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNwaW5fbG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCWlmKHRwLT52bGdycCkKKwkJdHAtPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSA9IE5VTEw7CisJc3Bpbl91bmxvY2tfYmgoJnRwLT5zdGF0ZV9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit0eXBob29uX3Rzb19maWxsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0cmFuc21pdF9yaW5nICp0eFJpbmcsCisJCQl1MzIgcmluZ19kbWEpCit7CisJc3RydWN0IHRjcG9wdF9kZXNjICp0Y3BkOworCXUzMiB0Y3BkX29mZnNldCA9IHJpbmdfZG1hOworCisJdGNwZCA9IChzdHJ1Y3QgdGNwb3B0X2Rlc2MgKikgKHR4UmluZy0+cmluZ0Jhc2UgKyB0eFJpbmctPmxhc3RXcml0ZSk7CisJdGNwZF9vZmZzZXQgKz0gdHhSaW5nLT5sYXN0V3JpdGU7CisJdGNwZF9vZmZzZXQgKz0gb2Zmc2V0b2Yoc3RydWN0IHRjcG9wdF9kZXNjLCBieXRlc1R4KTsKKwl0eXBob29uX2luY190eF9pbmRleCgmdHhSaW5nLT5sYXN0V3JpdGUsIDEpOworCisJdGNwZC0+ZmxhZ3MgPSBUWVBIT09OX09QVF9ERVNDIHwgVFlQSE9PTl9PUFRfVENQX1NFRzsKKwl0Y3BkLT5udW1EZXNjID0gMTsKKwl0Y3BkLT5tc3NfZmxhZ3MgPSBjcHVfdG9fbGUxNihza2JfdHNvX3NpemUoc2tiKSk7CisJdGNwZC0+bXNzX2ZsYWdzIHw9IFRZUEhPT05fVFNPX0ZJUlNUIHwgVFlQSE9PTl9UU09fTEFTVDsKKwl0Y3BkLT5yZXNwQWRkckxvID0gY3B1X3RvX2xlMzIodGNwZF9vZmZzZXQpOworCXRjcGQtPmJ5dGVzVHggPSBjcHVfdG9fbGUzMihza2ItPmxlbik7CisJdGNwZC0+c3RhdHVzID0gMDsKK30KKworc3RhdGljIGludAordHlwaG9vbl9zdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHRyYW5zbWl0X3JpbmcgKnR4UmluZzsKKwlzdHJ1Y3QgdHhfZGVzYyAqdHhkLCAqZmlyc3RfdHhkOworCWRtYV9hZGRyX3Qgc2tiX2RtYTsKKwlpbnQgbnVtRGVzYzsKKworCS8qIHdlIGhhdmUgdHdvIHJpbmdzIHRvIGNob29zZSBmcm9tLCBidXQgd2Ugb25seSB1c2UgdHhMbyBmb3Igbm93CisJICogSWYgd2Ugc3RhcnQgdXNpbmcgdGhlIEhpIHJpbmcgYXMgd2VsbCwgd2UnbGwgbmVlZCB0byB1cGRhdGUKKwkgKiB0eXBob29uX3N0b3BfcnVudGltZSgpLCB0eXBob29uX2ludGVycnVwdCgpLCB0eXBob29uX251bV9mcmVlX3R4KCksCisJICogYW5kIFRYSElfRU5USVJFUyB0byBtYXRjaCwgYXMgd2VsbCBhcyB1cGRhdGUgdGhlIFRTTyBjb2RlIGJlbG93CisJICogdG8gZ2V0IHRoZSByaWdodCBETUEgYWRkcmVzcworCSAqLworCXR4UmluZyA9ICZ0cC0+dHhMb1Jpbmc7CisKKwkvKiBXZSBuZWVkIG9uZSBkZXNjcmlwdG9yIGZvciBlYWNoIGZyYWdtZW50IG9mIHRoZSBza19idWZmLCBwbHVzIHRoZQorCSAqIG9uZSBmb3IgdGhlIC0+ZGF0YSBhcmVhIG9mIGl0LgorCSAqCisJICogVGhlIGRvY3Mgc2F5IGEgbWF4aW11bSBvZiAxNiBmcmFnbWVudCBkZXNjcmlwdG9ycyBwZXIgVENQIG9wdGlvbgorCSAqIGRlc2NyaXB0b3IsIHRoZW4gbWFrZSBhIG5ldyBwYWNrZXQgZGVzY3JpcHRvciBhbmQgb3B0aW9uIGRlc2NyaXB0b3IKKwkgKiBmb3IgdGhlIG5leHQgMTYgZnJhZ21lbnRzLiBUaGUgZW5naW5lZXJzIHNheSBqdXN0IGFuIG9wdGlvbgorCSAqIGRlc2NyaXB0b3IgaXMgbmVlZGVkLiBJJ3ZlIHRlc3RlZCB1cCB0byAyNiBmcmFnbWVudHMgd2l0aCBhIHNpbmdsZQorCSAqIHBhY2tldCBkZXNjcmlwdG9yL29wdGlvbiBkZXNjcmlwdG9yIGNvbWJvLCBzbyBJIHVzZSB0aGF0IGZvciBub3cuCisJICoKKwkgKiBJZiBwcm9ibGVtcyBkZXZlbG9wIHdpdGggVFNPLCBjaGVjayB0aGlzIGZpcnN0LgorCSAqLworCW51bURlc2MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMTsKKwlpZihza2JfdHNvX3NpemUoc2tiKSkKKwkJbnVtRGVzYysrOworCisJLyogV2hlbiBjaGVja2luZyBmb3IgZnJlZSBzcGFjZSBpbiB0aGUgcmluZywgd2UgbmVlZCB0byBhbHNvCisJICogYWNjb3VudCBmb3IgdGhlIGluaXRpYWwgVHggZGVzY3JpcHRvciwgYW5kIHdlIGFsd2F5cyBtdXN0IGxlYXZlCisJICogYXQgbGVhc3Qgb25lIGRlc2NyaXB0b3IgdW51c2VkIGluIHRoZSByaW5nIHNvIHRoYXQgaXQgZG9lc24ndAorCSAqIHdyYXAgYW5kIGxvb2sgZW1wdHkuCisJICoKKwkgKiBUaGUgb25seSB0aW1lIHdlIHNob3VsZCBsb29wIGhlcmUgaXMgd2hlbiB3ZSBoaXQgdGhlIHJhY2UKKwkgKiBiZXR3ZWVuIG1hcmtpbmcgdGhlIHF1ZXVlIGF3YWtlIGFuZCB1cGRhdGluZyB0aGUgY2xlYXJlZCBpbmRleC4KKwkgKiBKdXN0IGxvb3AgYW5kIGl0IHdpbGwgYXBwZWFyLiBUaGlzIGNvbWVzIGZyb20gdGhlIGFjZW5pYyBkcml2ZXIuCisJICovCisJd2hpbGUodW5saWtlbHkodHlwaG9vbl9udW1fZnJlZV90eCh0eFJpbmcpIDwgKG51bURlc2MgKyAyKSkpCisJCXNtcF9ybWIoKTsKKworCWZpcnN0X3R4ZCA9IChzdHJ1Y3QgdHhfZGVzYyAqKSAodHhSaW5nLT5yaW5nQmFzZSArIHR4UmluZy0+bGFzdFdyaXRlKTsKKwl0eXBob29uX2luY190eF9pbmRleCgmdHhSaW5nLT5sYXN0V3JpdGUsIDEpOworCisJZmlyc3RfdHhkLT5mbGFncyA9IFRZUEhPT05fVFhfREVTQyB8IFRZUEhPT05fREVTQ19WQUxJRDsKKwlmaXJzdF90eGQtPm51bURlc2MgPSAwOworCWZpcnN0X3R4ZC0+bGVuID0gMDsKKwlmaXJzdF90eGQtPmFkZHIgPSAodTY0KSgodW5zaWduZWQgbG9uZykgc2tiKSAmIDB4ZmZmZmZmZmY7CisJZmlyc3RfdHhkLT5hZGRySGkgPSAodTY0KSgodW5zaWduZWQgbG9uZykgc2tiKSA+PiAzMjsKKwlmaXJzdF90eGQtPnByb2Nlc3NGbGFncyA9IDA7CisKKwlpZihza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQkvKiBUaGUgM1hQIHdpbGwgZmlndXJlIG91dCBpZiB0aGlzIGlzIFVEUC9UQ1AgKi8KKwkJZmlyc3RfdHhkLT5wcm9jZXNzRmxhZ3MgfD0gVFlQSE9PTl9UWF9QRl9UQ1BfQ0hLU1VNOworCQlmaXJzdF90eGQtPnByb2Nlc3NGbGFncyB8PSBUWVBIT09OX1RYX1BGX1VEUF9DSEtTVU07CisJCWZpcnN0X3R4ZC0+cHJvY2Vzc0ZsYWdzIHw9IFRZUEhPT05fVFhfUEZfSVBfQ0hLU1VNOworCX0KKworCWlmKHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCQlmaXJzdF90eGQtPnByb2Nlc3NGbGFncyB8PQorCQkgICAgVFlQSE9PTl9UWF9QRl9JTlNFUlRfVkxBTiB8IFRZUEhPT05fVFhfUEZfVkxBTl9QUklPUklUWTsKKwkJZmlyc3RfdHhkLT5wcm9jZXNzRmxhZ3MgfD0KKwkJICAgIGNwdV90b19sZTMyKGh0b25zKHZsYW5fdHhfdGFnX2dldChza2IpKSA8PAorCQkJCVRZUEhPT05fVFhfUEZfVkxBTl9UQUdfU0hJRlQpOworCX0KKworCWlmKHNrYl90c29fc2l6ZShza2IpKSB7CisJCWZpcnN0X3R4ZC0+cHJvY2Vzc0ZsYWdzIHw9IFRZUEhPT05fVFhfUEZfVENQX1NFR01FTlQ7CisJCWZpcnN0X3R4ZC0+bnVtRGVzYysrOworCisJCXR5cGhvb25fdHNvX2ZpbGwoc2tiLCB0eFJpbmcsIHRwLT50eGxvX2RtYV9hZGRyKTsKKwl9CisKKwl0eGQgPSAoc3RydWN0IHR4X2Rlc2MgKikgKHR4UmluZy0+cmluZ0Jhc2UgKyB0eFJpbmctPmxhc3RXcml0ZSk7CisJdHlwaG9vbl9pbmNfdHhfaW5kZXgoJnR4UmluZy0+bGFzdFdyaXRlLCAxKTsKKworCS8qIE5vIG5lZWQgdG8gd29ycnkgYWJvdXQgcGFkZGluZyBwYWNrZXQgLS0gdGhlIGZpcm13YXJlIHBhZHMKKwkgKiBpdCB3aXRoIHplcm9zIHRvIEVUSF9aTEVOIGZvciB1cy4KKwkgKi8KKwlpZihza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID09IDApIHsKKwkJc2tiX2RtYSA9IHBjaV9tYXBfc2luZ2xlKHRwLT50eF9wZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJdHhkLT5mbGFncyA9IFRZUEhPT05fRlJBR19ERVNDIHwgVFlQSE9PTl9ERVNDX1ZBTElEOworCQl0eGQtPmxlbiA9IGNwdV90b19sZTE2KHNrYi0+bGVuKTsKKwkJdHhkLT5hZGRyID0gY3B1X3RvX2xlMzIoc2tiX2RtYSk7CisJCXR4ZC0+YWRkckhpID0gMDsKKwkJZmlyc3RfdHhkLT5udW1EZXNjKys7CisJfSBlbHNlIHsKKwkJaW50IGksIGxlbjsKKworCQlsZW4gPSBza2JfaGVhZGxlbihza2IpOworCQlza2JfZG1hID0gcGNpX21hcF9zaW5nbGUodHAtPnR4X3BkZXYsIHNrYi0+ZGF0YSwgbGVuLAorCQkJCSAgICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl0eGQtPmZsYWdzID0gVFlQSE9PTl9GUkFHX0RFU0MgfCBUWVBIT09OX0RFU0NfVkFMSUQ7CisJCXR4ZC0+bGVuID0gY3B1X3RvX2xlMTYobGVuKTsKKwkJdHhkLT5hZGRyID0gY3B1X3RvX2xlMzIoc2tiX2RtYSk7CisJCXR4ZC0+YWRkckhpID0gMDsKKwkJZmlyc3RfdHhkLT5udW1EZXNjKys7CisKKwkJZm9yKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7CisJCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCQl2b2lkICpmcmFnX2FkZHI7CisKKwkJCXR4ZCA9IChzdHJ1Y3QgdHhfZGVzYyAqKSAodHhSaW5nLT5yaW5nQmFzZSArCisJCQkJCQl0eFJpbmctPmxhc3RXcml0ZSk7CisJCQl0eXBob29uX2luY190eF9pbmRleCgmdHhSaW5nLT5sYXN0V3JpdGUsIDEpOworCisJCQlsZW4gPSBmcmFnLT5zaXplOworCQkJZnJhZ19hZGRyID0gKHZvaWQgKikgcGFnZV9hZGRyZXNzKGZyYWctPnBhZ2UpICsKKwkJCQkJCWZyYWctPnBhZ2Vfb2Zmc2V0OworCQkJc2tiX2RtYSA9IHBjaV9tYXBfc2luZ2xlKHRwLT50eF9wZGV2LCBmcmFnX2FkZHIsIGxlbiwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJdHhkLT5mbGFncyA9IFRZUEhPT05fRlJBR19ERVNDIHwgVFlQSE9PTl9ERVNDX1ZBTElEOworCQkJdHhkLT5sZW4gPSBjcHVfdG9fbGUxNihsZW4pOworCQkJdHhkLT5hZGRyID0gY3B1X3RvX2xlMzIoc2tiX2RtYSk7CisJCQl0eGQtPmFkZHJIaSA9IDA7CisJCQlmaXJzdF90eGQtPm51bURlc2MrKzsKKwkJfQorCX0KKworCS8qIEtpY2sgdGhlIDNYUAorCSAqLworCXdtYigpOworCWlvd3JpdGUzMih0eFJpbmctPmxhc3RXcml0ZSwgdHAtPnR4X2lvYWRkciArIHR4UmluZy0+d3JpdGVSZWdpc3Rlcik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIElmIHdlIGRvbid0IGhhdmUgcm9vbSB0byBwdXQgdGhlIHdvcnN0IGNhc2UgcGFja2V0IG9uIHRoZQorCSAqIHF1ZXVlLCB0aGVuIHdlIG11c3Qgc3RvcCB0aGUgcXVldWUuIFdlIG5lZWQgMiBleHRyYQorCSAqIGRlc2NyaXB0b3JzIC0tIG9uZSB0byBwcmV2ZW50IHJpbmcgd3JhcCwgYW5kIG9uZSBmb3IgdGhlCisJICogVHggaGVhZGVyLgorCSAqLworCW51bURlc2MgPSBNQVhfU0tCX0ZSQUdTICsgVFNPX05VTV9ERVNDUklQVE9SUyArIDE7CisKKwlpZih0eXBob29uX251bV9mcmVlX3R4KHR4UmluZykgPCAobnVtRGVzYyArIDIpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQkvKiBBIFR4IGNvbXBsZXRlIElSUSBjb3VsZCBoYXZlIGdvdHRlbiBpbmJldHdlZW4sIG1ha2luZworCQkgKiB0aGUgcmluZyBmcmVlIGFnYWluLiBPbmx5IG5lZWQgdG8gcmVjaGVjayBoZXJlLCBzaW5jZQorCQkgKiBUeCBpcyBzZXJpYWxpemVkLgorCQkgKi8KKwkJaWYodHlwaG9vbl9udW1fZnJlZV90eCh0eFJpbmcpID49IChudW1EZXNjICsgMikpCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR5cGhvb24gKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgY21kX2Rlc2MgeHBfY21kOworCXUzMiBtY19maWx0ZXJbMl07CisJdTE2IGZpbHRlcjsKKworCWZpbHRlciA9IFRZUEhPT05fUlhfRklMVEVSX0RJUkVDVEVEIHwgVFlQSE9PTl9SWF9GSUxURVJfQlJPQURDQVNUOworCWlmKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZmlsdGVyIHw9IFRZUEhPT05fUlhfRklMVEVSX1BST01JU0NPVVM7CisJfSBlbHNlIGlmKChkZXYtPm1jX2NvdW50ID4gbXVsdGljYXN0X2ZpbHRlcl9saW1pdCkgfHwKKwkJICAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJLyogVG9vIG1hbnkgdG8gbWF0Y2gsIG9yIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJZmlsdGVyIHw9IFRZUEhPT05fUlhfRklMVEVSX0FMTF9NQ0FTVDsKKwl9IGVsc2UgaWYoZGV2LT5tY19jb3VudCkgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJaW50IGk7CisKKwkJbWVtc2V0KG1jX2ZpbHRlciwgMCwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlmb3IoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWludCBiaXQgPSBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpICYgMHgzZjsKKwkJCW1jX2ZpbHRlcltiaXQgPj4gNV0gfD0gMSA8PCAoYml0ICYgMHgxZik7CisJCX0KKworCQlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoJnhwX2NtZCwKKwkJCQkJIFRZUEhPT05fQ01EX1NFVF9NVUxUSUNBU1RfSEFTSCk7CisJCXhwX2NtZC5wYXJtMSA9IFRZUEhPT05fTUNBU1RfSEFTSF9TRVQ7CisJCXhwX2NtZC5wYXJtMiA9IGNwdV90b19sZTMyKG1jX2ZpbHRlclswXSk7CisJCXhwX2NtZC5wYXJtMyA9IGNwdV90b19sZTMyKG1jX2ZpbHRlclsxXSk7CisJCXR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCk7CisKKwkJZmlsdGVyIHw9IFRZUEhPT05fUlhfRklMVEVSX01DQVNUX0hBU0g7CisJfQorCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1NFVF9SWF9GSUxURVIpOworCXhwX2NtZC5wYXJtMSA9IGZpbHRlcjsKKwl0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX2RvX2dldF9zdGF0cyhzdHJ1Y3QgdHlwaG9vbiAqdHApCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnRwLT5zdGF0czsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2F2ZWQgPSAmdHAtPnN0YXRzX3NhdmVkOworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisJc3RydWN0IHJlc3BfZGVzYyB4cF9yZXNwWzddOworCXN0cnVjdCBzdGF0c19yZXNwICpzID0gKHN0cnVjdCBzdGF0c19yZXNwICopIHhwX3Jlc3A7CisJaW50IGVycjsKKworCUlOSVRfQ09NTUFORF9XSVRIX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1JFQURfU1RBVFMpOworCWVyciA9IHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgNywgeHBfcmVzcCk7CisJaWYoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIDNDb20ncyBMaW51eCBkcml2ZXIgdXNlcyB0eE11bHRpcGxlQ29sbGlzaW9ucyBhcyBpdCdzCisJICogY29sbGlzaW9ucyB2YWx1ZSwgYnV0IHRoZXJlIGlzIHNvbWUgb3RoZXIgY29sbGlzaW9uIGluZm8gYXMgd2VsbC4uLgorCSAqCisJICogVGhlIGV4dHJhIHN0YXR1cyByZXBvcnRlZCB3b3VsZCBiZSBhIGdvb2QgY2FuZGlkYXRlIGZvcgorCSAqIGV0aHRvb2xfb3BzLT5nZXRfe3N0cmluZ3Msc3RhdHN9KCkKKwkgKi8KKwlzdGF0cy0+dHhfcGFja2V0cyA9IGxlMzJfdG9fY3B1KHMtPnR4UGFja2V0cyk7CisJc3RhdHMtPnR4X2J5dGVzID0gbGUzMl90b19jcHUocy0+dHhCeXRlcyk7CisJc3RhdHMtPnR4X2Vycm9ycyA9IGxlMzJfdG9fY3B1KHMtPnR4Q2Fycmllckxvc3QpOworCXN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycyA9IGxlMzJfdG9fY3B1KHMtPnR4Q2Fycmllckxvc3QpOworCXN0YXRzLT5jb2xsaXNpb25zID0gbGUzMl90b19jcHUocy0+dHhNdWx0aXBsZUNvbGxpc2lvbnMpOworCXN0YXRzLT5yeF9wYWNrZXRzID0gbGUzMl90b19jcHUocy0+cnhQYWNrZXRzR29vZCk7CisJc3RhdHMtPnJ4X2J5dGVzID0gbGUzMl90b19jcHUocy0+cnhCeXRlc0dvb2QpOworCXN0YXRzLT5yeF9maWZvX2Vycm9ycyA9IGxlMzJfdG9fY3B1KHMtPnJ4Rmlmb092ZXJydW5zKTsKKwlzdGF0cy0+cnhfZXJyb3JzID0gbGUzMl90b19jcHUocy0+cnhGaWZvT3ZlcnJ1bnMpICsKKwkJCWxlMzJfdG9fY3B1KHMtPkJhZFNTRCkgKyBsZTMyX3RvX2NwdShzLT5yeENyY0Vycm9ycyk7CisJc3RhdHMtPnJ4X2NyY19lcnJvcnMgPSBsZTMyX3RvX2NwdShzLT5yeENyY0Vycm9ycyk7CisJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgPSBsZTMyX3RvX2NwdShzLT5yeE92ZXJzaXplZCk7CisJdHAtPnNwZWVkID0gKHMtPmxpbmtTdGF0dXMgJiBUWVBIT09OX0xJTktfMTAwTUJQUykgPworCQkJU1BFRURfMTAwIDogU1BFRURfMTA7CisJdHAtPmR1cGxleCA9IChzLT5saW5rU3RhdHVzICYgVFlQSE9PTl9MSU5LX0ZVTExfRFVQTEVYKSA/CisJCQlEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOworCisJLyogYWRkIGluIHRoZSBzYXZlZCBzdGF0aXN0aWNzCisJICovCisJc3RhdHMtPnR4X3BhY2tldHMgKz0gc2F2ZWQtPnR4X3BhY2tldHM7CisJc3RhdHMtPnR4X2J5dGVzICs9IHNhdmVkLT50eF9ieXRlczsKKwlzdGF0cy0+dHhfZXJyb3JzICs9IHNhdmVkLT50eF9lcnJvcnM7CisJc3RhdHMtPmNvbGxpc2lvbnMgKz0gc2F2ZWQtPmNvbGxpc2lvbnM7CisJc3RhdHMtPnJ4X3BhY2tldHMgKz0gc2F2ZWQtPnJ4X3BhY2tldHM7CisJc3RhdHMtPnJ4X2J5dGVzICs9IHNhdmVkLT5yeF9ieXRlczsKKwlzdGF0cy0+cnhfZmlmb19lcnJvcnMgKz0gc2F2ZWQtPnJ4X2ZpZm9fZXJyb3JzOworCXN0YXRzLT5yeF9lcnJvcnMgKz0gc2F2ZWQtPnJ4X2Vycm9yczsKKwlzdGF0cy0+cnhfY3JjX2Vycm9ycyArPSBzYXZlZC0+cnhfY3JjX2Vycm9yczsKKwlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyArPSBzYXZlZC0+cnhfbGVuZ3RoX2Vycm9yczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgordHlwaG9vbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ0cC0+c3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNhdmVkID0gJnRwLT5zdGF0c19zYXZlZDsKKworCXNtcF9ybWIoKTsKKwlpZih0cC0+Y2FyZF9zdGF0ZSA9PSBTbGVlcGluZykKKwkJcmV0dXJuIHNhdmVkOworCisJaWYodHlwaG9vbl9kb19nZXRfc3RhdHModHApIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBnZXR0aW5nIHN0YXRzXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gc2F2ZWQ7CisJfQorCisJcmV0dXJuIHN0YXRzOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzb2NrYWRkciAqc2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopIGFkZHI7CisKKwlpZihuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUJVU1k7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2FkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordHlwaG9vbl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0cC0+cGRldjsKKwlzdHJ1Y3QgY21kX2Rlc2MgeHBfY21kOworCXN0cnVjdCByZXNwX2Rlc2MgeHBfcmVzcFszXTsKKworCXNtcF9ybWIoKTsKKwlpZih0cC0+Y2FyZF9zdGF0ZSA9PSBTbGVlcGluZykgeworCQlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgIlNsZWVwIGltYWdlIik7CisJfSBlbHNlIHsKKwkJSU5JVF9DT01NQU5EX1dJVEhfUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfUkVBRF9WRVJTSU9OUyk7CisJCWlmKHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMywgeHBfcmVzcCkgPCAwKSB7CisJCQlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgIlVua25vd24gcnVudGltZSIpOworCQl9IGVsc2UgeworCQkJdTMyIHNsZWVwX3ZlciA9IHhwX3Jlc3BbMF0ucGFybTI7CisJCQlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCAzMiwgIiUwMnguJTAzeC4lMDN4IiwKKwkJCQkgc2xlZXBfdmVyID4+IDI0LCAoc2xlZXBfdmVyID4+IDEyKSAmIDB4ZmZmLCAKKwkJCQkgc2xlZXBfdmVyICYgMHhmZmYpOworCQl9CisJfQorCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX01PRFVMRV9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX01PRFVMRV9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHBjaV9kZXYpKTsKK30KKworc3RhdGljIGludAordHlwaG9vbl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHR5cGhvb24gKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCQkJU1VQUE9SVEVEX0F1dG9uZWc7CisKKwlzd2l0Y2ggKHRwLT54Y3ZyX3NlbGVjdCkgeworCWNhc2UgVFlQSE9PTl9YQ1ZSXzEwSEFMRjoKKwkJY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOworCQlicmVhazsKKwljYXNlIFRZUEhPT05fWENWUl8xMEZVTEw6CisJCWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbDsKKwkJYnJlYWs7CisJY2FzZSBUWVBIT09OX1hDVlJfMTAwSEFMRjoKKwkJY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKKwkJYnJlYWs7CisJY2FzZSBUWVBIT09OX1hDVlJfMTAwRlVMTDoKKwkJY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbDsKKwkJYnJlYWs7CisJY2FzZSBUWVBIT09OX1hDVlJfQVVUT05FRzoKKwkJY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwKKwkJCQkJICAgIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKKwkJCQkJICAgIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8CisJCQkJCSAgICBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAorCQkJCQkgICAgQURWRVJUSVNFRF9BdXRvbmVnOworCQlicmVhazsKKwl9CisKKwlpZih0cC0+Y2FwYWJpbGl0aWVzICYgVFlQSE9PTl9GSUJFUikgeworCQljbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfRklCUkU7CisJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9GSUJSRTsKKwkJY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwl9IGVsc2UgeworCQljbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJICAgIAkJCVNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCQlTVVBQT1JURURfVFA7CisJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9UUDsKKwkJY21kLT5wb3J0ID0gUE9SVF9UUDsKKwl9CisKKwkvKiBuZWVkIHRvIGdldCBzdGF0cyB0byBtYWtlIHRoZXNlIGxpbmsgc3BlZWQvZHVwbGV4IHZhbGlkICovCisJdHlwaG9vbl9kb19nZXRfc3RhdHModHApOworCWNtZC0+c3BlZWQgPSB0cC0+c3BlZWQ7CisJY21kLT5kdXBsZXggPSB0cC0+ZHVwbGV4OworCWNtZC0+cGh5X2FkZHJlc3MgPSAwOworCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCWlmKHRwLT54Y3ZyX3NlbGVjdCA9PSBUWVBIT09OX1hDVlJfQVVUT05FRykKKwkJY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJZWxzZQorCQljbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJY21kLT5tYXh0eHBrdCA9IDE7CisJY21kLT5tYXhyeHBrdCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordHlwaG9vbl9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHR5cGhvb24gKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgY21kX2Rlc2MgeHBfY21kOworCWludCB4Y3ZyOworCWludCBlcnI7CisKKwllcnIgPSAtRUlOVkFMOworCWlmKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQl4Y3ZyID0gVFlQSE9PTl9YQ1ZSX0FVVE9ORUc7CisJfSBlbHNlIHsKKwkJaWYoY21kLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYpIHsKKwkJCWlmKGNtZC0+c3BlZWQgPT0gU1BFRURfMTApCisJCQkJeGN2ciA9IFRZUEhPT05fWENWUl8xMEhBTEY7CisJCQllbHNlIGlmKGNtZC0+c3BlZWQgPT0gU1BFRURfMTAwKQorCQkJCXhjdnIgPSBUWVBIT09OX1hDVlJfMTAwSEFMRjsKKwkJCWVsc2UKKwkJCQlnb3RvIG91dDsKKwkJfSBlbHNlIGlmKGNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKSB7CisJCQlpZihjbWQtPnNwZWVkID09IFNQRUVEXzEwKQorCQkJCXhjdnIgPSBUWVBIT09OX1hDVlJfMTBGVUxMOworCQkJZWxzZSBpZihjbWQtPnNwZWVkID09IFNQRUVEXzEwMCkKKwkJCQl4Y3ZyID0gVFlQSE9PTl9YQ1ZSXzEwMEZVTEw7CisJCQllbHNlCisJCQkJZ290byBvdXQ7CisJCX0gZWxzZQorCQkJZ290byBvdXQ7CisJfQorCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1hDVlJfU0VMRUNUKTsKKwl4cF9jbWQucGFybTEgPSBjcHVfdG9fbGUxNih4Y3ZyKTsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJdHAtPnhjdnJfc2VsZWN0ID0geGN2cjsKKwlpZihjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJdHAtPnNwZWVkID0gMHhmZjsJLyogaW52YWxpZCAqLworCQl0cC0+ZHVwbGV4ID0gMHhmZjsJLyogaW52YWxpZCAqLworCX0gZWxzZSB7CisJCXRwLT5zcGVlZCA9IGNtZC0+c3BlZWQ7CisJCXRwLT5kdXBsZXggPSBjbWQtPmR1cGxleDsKKwl9CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZAordHlwaG9vbl9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJd29sLT5zdXBwb3J0ZWQgPSBXQUtFX1BIWSB8IFdBS0VfTUFHSUM7CisJd29sLT53b2xvcHRzID0gMDsKKwlpZih0cC0+d29sX2V2ZW50cyAmIFRZUEhPT05fV0FLRV9MSU5LX0VWRU5UKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9QSFk7CisJaWYodHAtPndvbF9ldmVudHMgJiBUWVBIT09OX1dBS0VfTUFHSUNfUEtUKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9NQUdJQzsKKwltZW1zZXQoJndvbC0+c29wYXNzLCAwLCBzaXplb2Yod29sLT5zb3Bhc3MpKTsKK30KKworc3RhdGljIGludAordHlwaG9vbl9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYod29sLT53b2xvcHRzICYgfihXQUtFX1BIWSB8IFdBS0VfTUFHSUMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRwLT53b2xfZXZlbnRzID0gMDsKKwlpZih3b2wtPndvbG9wdHMgJiBXQUtFX1BIWSkKKwkJdHAtPndvbF9ldmVudHMgfD0gVFlQSE9PTl9XQUtFX0xJTktfRVZFTlQ7CisJaWYod29sLT53b2xvcHRzICYgV0FLRV9NQUdJQykKKwkJdHAtPndvbF9ldmVudHMgfD0gVFlQSE9PTl9XQUtFX01BR0lDX1BLVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyCit0eXBob29uX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogRm9yIG5vdywgd2UgZG9uJ3QgYWxsb3cgdHVybmluZyBvZmYgUlggY2hlY2tzdW1zLgorCSAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAordHlwaG9vbl9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqZXJpbmcpCit7CisJZXJpbmctPnJ4X21heF9wZW5kaW5nID0gUlhFTlRfRU5UUklFUzsKKwllcmluZy0+cnhfbWluaV9tYXhfcGVuZGluZyA9IDA7CisJZXJpbmctPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gMDsKKwllcmluZy0+dHhfbWF4X3BlbmRpbmcgPSBUWExPX0VOVFJJRVMgLSAxOworCisJZXJpbmctPnJ4X3BlbmRpbmcgPSBSWEVOVF9FTlRSSUVTOworCWVyaW5nLT5yeF9taW5pX3BlbmRpbmcgPSAwOworCWVyaW5nLT5yeF9qdW1ib19wZW5kaW5nID0gMDsKKwllcmluZy0+dHhfcGVuZGluZyA9IFRYTE9fRU5UUklFUyAtIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgdHlwaG9vbl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzCQk9IHR5cGhvb25fZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gdHlwaG9vbl9zZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCQk9IHR5cGhvb25fZ2V0X2RydmluZm8sCisJLmdldF93b2wJCT0gdHlwaG9vbl9nZXRfd29sLAorCS5zZXRfd29sCQk9IHR5cGhvb25fc2V0X3dvbCwKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3J4X2NzdW0JCT0gdHlwaG9vbl9nZXRfcnhfY3N1bSwKKwkuZ2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKKwkuc2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3RzbwkJPSBldGh0b29sX29wX2dldF90c28sCisJLnNldF90c28JCT0gZXRodG9vbF9vcF9zZXRfdHNvLAorCS5nZXRfcmluZ3BhcmFtCQk9IHR5cGhvb25fZ2V0X3JpbmdwYXJhbSwKK307CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fd2FpdF9pbnRlcnJ1cHQodm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJaW50IGksIGVyciA9IDA7CisKKwlmb3IoaSA9IDA7IGkgPCBUWVBIT09OX1dBSVRfVElNRU9VVDsgaSsrKSB7CisJCWlmKGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKSAmCisJCSAgIFRZUEhPT05fSU5UUl9CT09UQ01EKQorCQkJZ290byBvdXQ7CisJCXVkZWxheShUWVBIT09OX1VERUxBWSk7CisJfQorCisJZXJyID0gLUVUSU1FRE9VVDsKKworb3V0OgorCWlvd3JpdGUzMihUWVBIT09OX0lOVFJfQk9PVENNRCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9TVEFUVVMpOworCXJldHVybiBlcnI7Cit9CisKKyNkZWZpbmUgc2hhcmVkX29mZnNldCh4KQlvZmZzZXRvZihzdHJ1Y3QgdHlwaG9vbl9zaGFyZWQsIHgpCisKK3N0YXRpYyB2b2lkCit0eXBob29uX2luaXRfaW50ZXJmYWNlKHN0cnVjdCB0eXBob29uICp0cCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbl9pbnRlcmZhY2UgKmlmYWNlID0gJnRwLT5zaGFyZWQtPmlmYWNlOworCWRtYV9hZGRyX3Qgc2hhcmVkX2RtYTsKKworCW1lbXNldCh0cC0+c2hhcmVkLCAwLCBzaXplb2Yoc3RydWN0IHR5cGhvb25fc2hhcmVkKSk7CisKKwkvKiBUaGUgKkhpIG1lbWJlcnMgb2YgaWZhY2UgYXJlIGFsbCBpbml0J2QgdG8gemVybyBieSB0aGUgbWVtc2V0KCkuCisJICovCisJc2hhcmVkX2RtYSA9IHRwLT5zaGFyZWRfZG1hICsgc2hhcmVkX29mZnNldChpbmRleGVzKTsKKwlpZmFjZS0+cmluZ0luZGV4ID0gY3B1X3RvX2xlMzIoc2hhcmVkX2RtYSk7CisKKwlzaGFyZWRfZG1hID0gdHAtPnNoYXJlZF9kbWEgKyBzaGFyZWRfb2Zmc2V0KHR4TG8pOworCWlmYWNlLT50eExvQWRkciA9IGNwdV90b19sZTMyKHNoYXJlZF9kbWEpOworCWlmYWNlLT50eExvU2l6ZSA9IGNwdV90b19sZTMyKFRYTE9fRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykpOworCisJc2hhcmVkX2RtYSA9IHRwLT5zaGFyZWRfZG1hICsgc2hhcmVkX29mZnNldCh0eEhpKTsKKwlpZmFjZS0+dHhIaUFkZHIgPSBjcHVfdG9fbGUzMihzaGFyZWRfZG1hKTsKKwlpZmFjZS0+dHhIaVNpemUgPSBjcHVfdG9fbGUzMihUWEhJX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpKTsKKworCXNoYXJlZF9kbWEgPSB0cC0+c2hhcmVkX2RtYSArIHNoYXJlZF9vZmZzZXQocnhCdWZmKTsKKwlpZmFjZS0+cnhCdWZmQWRkciA9IGNwdV90b19sZTMyKHNoYXJlZF9kbWEpOworCWlmYWNlLT5yeEJ1ZmZTaXplID0gY3B1X3RvX2xlMzIoUlhGUkVFX0VOVFJJRVMgKgorCQkJCQlzaXplb2Yoc3RydWN0IHJ4X2ZyZWUpKTsKKworCXNoYXJlZF9kbWEgPSB0cC0+c2hhcmVkX2RtYSArIHNoYXJlZF9vZmZzZXQocnhMbyk7CisJaWZhY2UtPnJ4TG9BZGRyID0gY3B1X3RvX2xlMzIoc2hhcmVkX2RtYSk7CisJaWZhY2UtPnJ4TG9TaXplID0gY3B1X3RvX2xlMzIoUlhfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykpOworCisJc2hhcmVkX2RtYSA9IHRwLT5zaGFyZWRfZG1hICsgc2hhcmVkX29mZnNldChyeEhpKTsKKwlpZmFjZS0+cnhIaUFkZHIgPSBjcHVfdG9fbGUzMihzaGFyZWRfZG1hKTsKKwlpZmFjZS0+cnhIaVNpemUgPSBjcHVfdG9fbGUzMihSWF9FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSk7CisKKwlzaGFyZWRfZG1hID0gdHAtPnNoYXJlZF9kbWEgKyBzaGFyZWRfb2Zmc2V0KGNtZCk7CisJaWZhY2UtPmNtZEFkZHIgPSBjcHVfdG9fbGUzMihzaGFyZWRfZG1hKTsKKwlpZmFjZS0+Y21kU2l6ZSA9IGNwdV90b19sZTMyKENPTU1BTkRfUklOR19TSVpFKTsKKworCXNoYXJlZF9kbWEgPSB0cC0+c2hhcmVkX2RtYSArIHNoYXJlZF9vZmZzZXQocmVzcCk7CisJaWZhY2UtPnJlc3BBZGRyID0gY3B1X3RvX2xlMzIoc2hhcmVkX2RtYSk7CisJaWZhY2UtPnJlc3BTaXplID0gY3B1X3RvX2xlMzIoUkVTUE9OU0VfUklOR19TSVpFKTsKKworCXNoYXJlZF9kbWEgPSB0cC0+c2hhcmVkX2RtYSArIHNoYXJlZF9vZmZzZXQoemVyb1dvcmQpOworCWlmYWNlLT56ZXJvQWRkciA9IGNwdV90b19sZTMyKHNoYXJlZF9kbWEpOworCisJdHAtPmluZGV4ZXMgPSAmdHAtPnNoYXJlZC0+aW5kZXhlczsKKwl0cC0+dHhMb1JpbmcucmluZ0Jhc2UgPSAodTggKikgdHAtPnNoYXJlZC0+dHhMbzsKKwl0cC0+dHhIaVJpbmcucmluZ0Jhc2UgPSAodTggKikgdHAtPnNoYXJlZC0+dHhIaTsKKwl0cC0+cnhMb1JpbmcucmluZ0Jhc2UgPSAodTggKikgdHAtPnNoYXJlZC0+cnhMbzsKKwl0cC0+cnhIaVJpbmcucmluZ0Jhc2UgPSAodTggKikgdHAtPnNoYXJlZC0+cnhIaTsKKwl0cC0+cnhCdWZmUmluZy5yaW5nQmFzZSA9ICh1OCAqKSB0cC0+c2hhcmVkLT5yeEJ1ZmY7CisJdHAtPmNtZFJpbmcucmluZ0Jhc2UgPSAodTggKikgdHAtPnNoYXJlZC0+Y21kOworCXRwLT5yZXNwUmluZy5yaW5nQmFzZSA9ICh1OCAqKSB0cC0+c2hhcmVkLT5yZXNwOworCisJdHAtPnR4TG9SaW5nLndyaXRlUmVnaXN0ZXIgPSBUWVBIT09OX1JFR19UWF9MT19SRUFEWTsKKwl0cC0+dHhIaVJpbmcud3JpdGVSZWdpc3RlciA9IFRZUEhPT05fUkVHX1RYX0hJX1JFQURZOworCisJdHAtPnR4bG9fZG1hX2FkZHIgPSBpZmFjZS0+dHhMb0FkZHI7CisJdHAtPmNhcmRfc3RhdGUgPSBTbGVlcGluZzsKKwlzbXBfd21iKCk7CisKKwl0cC0+b2ZmbG9hZCA9IFRZUEhPT05fT0ZGTE9BRF9JUF9DSEtTVU0gfCBUWVBIT09OX09GRkxPQURfVENQX0NIS1NVTTsKKwl0cC0+b2ZmbG9hZCB8PSBUWVBIT09OX09GRkxPQURfVURQX0NIS1NVTSB8IFRTT19PRkZMT0FEX09OOworCisJc3Bpbl9sb2NrX2luaXQoJnRwLT5jb21tYW5kX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZ0cC0+c3RhdGVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX2luaXRfcmluZ3Moc3RydWN0IHR5cGhvb24gKnRwKQoreworCW1lbXNldCh0cC0+aW5kZXhlcywgMCwgc2l6ZW9mKHN0cnVjdCB0eXBob29uX2luZGV4ZXMpKTsKKworCXRwLT50eExvUmluZy5sYXN0V3JpdGUgPSAwOworCXRwLT50eEhpUmluZy5sYXN0V3JpdGUgPSAwOworCXRwLT5yeExvUmluZy5sYXN0V3JpdGUgPSAwOworCXRwLT5yeEhpUmluZy5sYXN0V3JpdGUgPSAwOworCXRwLT5yeEJ1ZmZSaW5nLmxhc3RXcml0ZSA9IDA7CisJdHAtPmNtZFJpbmcubGFzdFdyaXRlID0gMDsKKwl0cC0+Y21kUmluZy5sYXN0V3JpdGUgPSAwOworCisJdHAtPnR4TG9SaW5nLmxhc3RSZWFkID0gMDsKKwl0cC0+dHhIaVJpbmcubGFzdFJlYWQgPSAwOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCB0eXBob29uICp0cCkKK3sKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5pb2FkZHI7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGRldjsKKwlzdHJ1Y3QgdHlwaG9vbl9maWxlX2hlYWRlciAqZkhkcjsKKwlzdHJ1Y3QgdHlwaG9vbl9zZWN0aW9uX2hlYWRlciAqc0hkcjsKKwl1OCAqaW1hZ2VfZGF0YTsKKwl2b2lkICpkcGFnZTsKKwlkbWFfYWRkcl90IGRwYWdlX2RtYTsKKwl1bnNpZ25lZCBpbnQgY3N1bTsKKwl1MzIgaXJxRW5hYmxlZDsKKwl1MzIgaXJxTWFza2VkOworCXUzMiBudW1TZWN0aW9uczsKKwl1MzIgc2VjdGlvbl9sZW47CisJdTMyIGxlbjsKKwl1MzIgbG9hZF9hZGRyOworCXUzMiBobWFjOworCWludCBpOworCWludCBlcnI7CisKKwllcnIgPSAtRUlOVkFMOworCWZIZHIgPSAoc3RydWN0IHR5cGhvb25fZmlsZV9oZWFkZXIgKikgdHlwaG9vbl9maXJtd2FyZV9pbWFnZTsKKwlpbWFnZV9kYXRhID0gKHU4ICopIGZIZHI7CisKKwlpZihtZW1jbXAoZkhkci0+dGFnLCAiVFlQSE9PTiIsIDgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgZmlybXdhcmUgaW1hZ2UhXG4iLCB0cC0+bmFtZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBDYW5ub3QganVzdCBtYXAgdGhlIGZpcm13YXJlIGltYWdlIHVzaW5nIHBjaV9tYXBfc2luZ2xlKCkgYXMKKwkgKiB0aGUgZmlybXdhcmUgaXMgcGFydCBvZiB0aGUga2VybmVsL21vZHVsZSBpbWFnZSwgc28gd2UgYWxsb2NhdGUKKwkgKiBzb21lIGNvbnNpc3RlbnQgbWVtb3J5IHRvIGNvcHkgdGhlIHNlY3Rpb25zIGludG8sIGFzIGl0IGlzIHNpbXBsZXIsCisJICogYW5kIHNob3J0LWxpdmVkLiBJZiB3ZSBldmVyIHNwbGl0IG91dCBhbmQgcmVxdWlyZSBhIHVzZXJsYW5kCisJICogZmlybXdhcmUgbG9hZGVyLCB0aGVuIHdlIGNhbiByZXZpc2l0IHRoaXMuCisJICovCisJZXJyID0gLUVOT01FTTsKKwlkcGFnZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFBBR0VfU0laRSwgJmRwYWdlX2RtYSk7CisJaWYoIWRwYWdlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIERNQSBtZW0gZm9yIGZpcm13YXJlXG4iLCB0cC0+bmFtZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlpcnFFbmFibGVkID0gaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9FTkFCTEUpOworCWlvd3JpdGUzMihpcnFFbmFibGVkIHwgVFlQSE9PTl9JTlRSX0JPT1RDTUQsCisJICAgICAgIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfRU5BQkxFKTsKKwlpcnFNYXNrZWQgPSBpb3JlYWQzMihpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX01BU0spOworCWlvd3JpdGUzMihpcnFNYXNrZWQgfCBUWVBIT09OX0lOVFJfQk9PVENNRCwKKwkgICAgICAgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9NQVNLKTsKKworCWVyciA9IC1FVElNRURPVVQ7CisJaWYodHlwaG9vbl93YWl0X3N0YXR1cyhpb2FkZHIsIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX0hPU1QpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYXJkIHJlYWR5IHRpbWVvdXRcbiIsIHRwLT5uYW1lKTsKKwkJZ290byBlcnJfb3V0X2lycTsKKwl9CisKKwludW1TZWN0aW9ucyA9IGxlMzJfdG9fY3B1KGZIZHItPm51bVNlY3Rpb25zKTsKKwlsb2FkX2FkZHIgPSBsZTMyX3RvX2NwdShmSGRyLT5zdGFydEFkZHIpOworCisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9CT09UQ01ELCBpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX1NUQVRVUyk7CisJaW93cml0ZTMyKGxvYWRfYWRkciwgaW9hZGRyICsgVFlQSE9PTl9SRUdfRE9XTkxPQURfQk9PVF9BRERSKTsKKwlobWFjID0gbGUzMl90b19jcHUoZkhkci0+aG1hY0RpZ2VzdFswXSk7CisJaW93cml0ZTMyKGhtYWMsIGlvYWRkciArIFRZUEhPT05fUkVHX0RPV05MT0FEX0hNQUNfMCk7CisJaG1hYyA9IGxlMzJfdG9fY3B1KGZIZHItPmhtYWNEaWdlc3RbMV0pOworCWlvd3JpdGUzMihobWFjLCBpb2FkZHIgKyBUWVBIT09OX1JFR19ET1dOTE9BRF9ITUFDXzEpOworCWhtYWMgPSBsZTMyX3RvX2NwdShmSGRyLT5obWFjRGlnZXN0WzJdKTsKKwlpb3dyaXRlMzIoaG1hYywgaW9hZGRyICsgVFlQSE9PTl9SRUdfRE9XTkxPQURfSE1BQ18yKTsKKwlobWFjID0gbGUzMl90b19jcHUoZkhkci0+aG1hY0RpZ2VzdFszXSk7CisJaW93cml0ZTMyKGhtYWMsIGlvYWRkciArIFRZUEhPT05fUkVHX0RPV05MT0FEX0hNQUNfMyk7CisJaG1hYyA9IGxlMzJfdG9fY3B1KGZIZHItPmhtYWNEaWdlc3RbNF0pOworCWlvd3JpdGUzMihobWFjLCBpb2FkZHIgKyBUWVBIT09OX1JFR19ET1dOTE9BRF9ITUFDXzQpOworCXR5cGhvb25fcG9zdF9wY2lfd3JpdGVzKGlvYWRkcik7CisJaW93cml0ZTMyKFRZUEhPT05fQk9PVENNRF9SVU5USU1FX0lNQUdFLCBpb2FkZHIgKyBUWVBIT09OX1JFR19DT01NQU5EKTsKKworCWltYWdlX2RhdGEgKz0gc2l6ZW9mKHN0cnVjdCB0eXBob29uX2ZpbGVfaGVhZGVyKTsKKworCS8qIFRoZSBpb3JlYWQzMigpIGluIHR5cGhvb25fd2FpdF9pbnRlcnJ1cHQoKSB3aWxsIGZvcmNlIHRoZQorCSAqIGxhc3Qgd3JpdGUgdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdG8gcG9zdCwgc28KKwkgKiB3ZSBkb24ndCBuZWVkIGEgdHlwaG9vbl9wb3N0X3BjaV93cml0ZXMoKSBhZnRlciBpdC4KKwkgKi8KKwlmb3IoaSA9IDA7IGkgPCBudW1TZWN0aW9uczsgaSsrKSB7CisJCXNIZHIgPSAoc3RydWN0IHR5cGhvb25fc2VjdGlvbl9oZWFkZXIgKikgaW1hZ2VfZGF0YTsKKwkJaW1hZ2VfZGF0YSArPSBzaXplb2Yoc3RydWN0IHR5cGhvb25fc2VjdGlvbl9oZWFkZXIpOworCQlsb2FkX2FkZHIgPSBsZTMyX3RvX2NwdShzSGRyLT5zdGFydEFkZHIpOworCQlzZWN0aW9uX2xlbiA9IGxlMzJfdG9fY3B1KHNIZHItPmxlbik7CisKKwkJd2hpbGUoc2VjdGlvbl9sZW4pIHsKKwkJCWxlbiA9IG1pbl90KHUzMiwgc2VjdGlvbl9sZW4sIFBBR0VfU0laRSk7CisKKwkJCWlmKHR5cGhvb25fd2FpdF9pbnRlcnJ1cHQoaW9hZGRyKSA8IDAgfHwKKwkJCSAgIGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX1NUQVRVUykgIT0KKwkJCSAgIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX1NFR01FTlQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZWdtZW50IHJlYWR5IHRpbWVvdXRcbiIsCisJCQkJICAgICAgIHRwLT5uYW1lKTsKKwkJCQlnb3RvIGVycl9vdXRfaXJxOworCQkJfQorCisJCQkvKiBEbyBhbiBwc2V1ZG8gSVB2NCBjaGVja3N1bSBvbiB0aGUgZGF0YSAtLSBmaXJzdAorCQkJICogbmVlZCB0byBjb252ZXJ0IGVhY2ggdTE2IHRvIGNwdSBvcmRlciBiZWZvcmUKKwkJCSAqIHN1bW1pbmcuIEZvcnR1bmF0ZWx5LCBkdWUgdG8gdGhlIHByb3BlcnRpZXMgb2YKKwkJCSAqIHRoZSBjaGVja3N1bSwgd2UgY2FuIGRvIHRoaXMgb25jZSwgYXQgdGhlIGVuZC4KKwkJCSAqLworCQkJY3N1bSA9IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soaW1hZ2VfZGF0YSwgZHBhZ2UsCisJCQkJCQkJIGxlbiwgMCk7CisJCQljc3VtID0gY3N1bV9mb2xkKGNzdW0pOworCQkJY3N1bSA9IGxlMTZfdG9fY3B1KGNzdW0pOworCisJCQlpb3dyaXRlMzIobGVuLCBpb2FkZHIgKyBUWVBIT09OX1JFR19CT09UX0xFTkdUSCk7CisJCQlpb3dyaXRlMzIoY3N1bSwgaW9hZGRyICsgVFlQSE9PTl9SRUdfQk9PVF9DSEVDS1NVTSk7CisJCQlpb3dyaXRlMzIobG9hZF9hZGRyLAorCQkJCQlpb2FkZHIgKyBUWVBIT09OX1JFR19CT09UX0RFU1RfQUREUik7CisJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfQk9PVF9EQVRBX0hJKTsKKwkJCWlvd3JpdGUzMihkcGFnZV9kbWEsIGlvYWRkciArIFRZUEhPT05fUkVHX0JPT1RfREFUQV9MTyk7CisJCQl0eXBob29uX3Bvc3RfcGNpX3dyaXRlcyhpb2FkZHIpOworCQkJaW93cml0ZTMyKFRZUEhPT05fQk9PVENNRF9TRUdfQVZBSUxBQkxFLAorCQkJICAgICAgIGlvYWRkciArIFRZUEhPT05fUkVHX0NPTU1BTkQpOworCisJCQlpbWFnZV9kYXRhICs9IGxlbjsKKwkJCWxvYWRfYWRkciArPSBsZW47CisJCQlzZWN0aW9uX2xlbiAtPSBsZW47CisJCX0KKwl9CisKKwlpZih0eXBob29uX3dhaXRfaW50ZXJydXB0KGlvYWRkcikgPCAwIHx8CisJICAgaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfU1RBVFVTKSAhPQorCSAgIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX1NFR01FTlQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmluYWwgc2VnbWVudCByZWFkeSB0aW1lb3V0XG4iLCB0cC0+bmFtZSk7CisJCWdvdG8gZXJyX291dF9pcnE7CisJfQorCisJaW93cml0ZTMyKFRZUEhPT05fQk9PVENNRF9ETkxEX0NPTVBMRVRFLCBpb2FkZHIgKyBUWVBIT09OX1JFR19DT01NQU5EKTsKKworCWlmKHR5cGhvb25fd2FpdF9zdGF0dXMoaW9hZGRyLCBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9CT09UKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYm9vdCByZWFkeSB0aW1lb3V0LCBzdGF0dXMgMHglMHhcbiIsCisJCSAgICAgICB0cC0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfU1RBVFVTKSk7CisJCWdvdG8gZXJyX291dF9pcnE7CisJfQorCisJZXJyID0gMDsKKworZXJyX291dF9pcnE6CisJaW93cml0ZTMyKGlycU1hc2tlZCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9NQVNLKTsKKwlpb3dyaXRlMzIoaXJxRW5hYmxlZCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9FTkFCTEUpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBQQUdFX1NJWkUsIGRwYWdlLCBkcGFnZV9kbWEpOworCitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fYm9vdF8zWFAoc3RydWN0IHR5cGhvb24gKnRwLCB1MzIgaW5pdGlhbF9zdGF0dXMpCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+aW9hZGRyOworCisJaWYodHlwaG9vbl93YWl0X3N0YXR1cyhpb2FkZHIsIGluaXRpYWxfc3RhdHVzKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYm9vdCByZWFkeSB0aW1lb3V0XG4iLCB0cC0+bmFtZSk7CisJCWdvdG8gb3V0X3RpbWVvdXQ7CisJfQorCisJaW93cml0ZTMyKDAsIGlvYWRkciArIFRZUEhPT05fUkVHX0JPT1RfUkVDT1JEX0FERFJfSEkpOworCWlvd3JpdGUzMih0cC0+c2hhcmVkX2RtYSwgaW9hZGRyICsgVFlQSE9PTl9SRUdfQk9PVF9SRUNPUkRfQUREUl9MTyk7CisJdHlwaG9vbl9wb3N0X3BjaV93cml0ZXMoaW9hZGRyKTsKKwlpb3dyaXRlMzIoVFlQSE9PTl9CT09UQ01EX1JFR19CT09UX1JFQ09SRCwKKwkJCQlpb2FkZHIgKyBUWVBIT09OX1JFR19DT01NQU5EKTsKKworCWlmKHR5cGhvb25fd2FpdF9zdGF0dXMoaW9hZGRyLCBUWVBIT09OX1NUQVRVU19SVU5OSU5HKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYm9vdCBmaW5pc2ggdGltZW91dCAoc3RhdHVzIDB4JXgpXG4iLAorCQkgICAgICAgdHAtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX1NUQVRVUykpOworCQlnb3RvIG91dF90aW1lb3V0OworCX0KKworCS8qIENsZWFyIHRoZSBUcmFuc21pdCBhbmQgQ29tbWFuZCByZWFkeSByZWdpc3RlcnMKKwkgKi8KKwlpb3dyaXRlMzIoMCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfVFhfSElfUkVBRFkpOworCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBUWVBIT09OX1JFR19DTURfUkVBRFkpOworCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBUWVBIT09OX1JFR19UWF9MT19SRUFEWSk7CisJdHlwaG9vbl9wb3N0X3BjaV93cml0ZXMoaW9hZGRyKTsKKwlpb3dyaXRlMzIoVFlQSE9PTl9CT09UQ01EX0JPT1QsIGlvYWRkciArIFRZUEhPT05fUkVHX0NPTU1BTkQpOworCisJcmV0dXJuIDA7CisKK291dF90aW1lb3V0OgorCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgdTMyCit0eXBob29uX2NsZWFuX3R4KHN0cnVjdCB0eXBob29uICp0cCwgc3RydWN0IHRyYW5zbWl0X3JpbmcgKnR4UmluZywKKwkJCXZvbGF0aWxlIHUzMiAqIGluZGV4KQoreworCXUzMiBsYXN0UmVhZCA9IHR4UmluZy0+bGFzdFJlYWQ7CisJc3RydWN0IHR4X2Rlc2MgKnR4OworCWRtYV9hZGRyX3Qgc2tiX2RtYTsKKwlpbnQgZG1hX2xlbjsKKwlpbnQgdHlwZTsKKworCXdoaWxlKGxhc3RSZWFkICE9IGxlMzJfdG9fY3B1KCppbmRleCkpIHsKKwkJdHggPSAoc3RydWN0IHR4X2Rlc2MgKikgKHR4UmluZy0+cmluZ0Jhc2UgKyBsYXN0UmVhZCk7CisJCXR5cGUgPSB0eC0+ZmxhZ3MgJiBUWVBIT09OX1RZUEVfTUFTSzsKKworCQlpZih0eXBlID09IFRZUEhPT05fVFhfREVTQykgeworCQkJLyogVGhpcyB0eF9kZXNjIGRlc2NyaWJlcyBhIHBhY2tldC4KKwkJCSAqLworCQkJdW5zaWduZWQgbG9uZyBwdHIgPSB0eC0+YWRkciB8ICgodTY0KXR4LT5hZGRySGkgPDwgMzIpOworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBwdHI7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQl9IGVsc2UgaWYodHlwZSA9PSBUWVBIT09OX0ZSQUdfREVTQykgeworCQkJLyogVGhpcyB0eF9kZXNjIGRlc2NyaWJlcyBhIG1lbW9yeSBtYXBwaW5nLiBGcmVlIGl0LgorCQkJICovCisJCQlza2JfZG1hID0gKGRtYV9hZGRyX3QpIGxlMzJfdG9fY3B1KHR4LT5hZGRyKTsKKwkJCWRtYV9sZW4gPSBsZTE2X3RvX2NwdSh0eC0+bGVuKTsKKwkJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsIHNrYl9kbWEsIGRtYV9sZW4sCisJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl9CisKKwkJdHgtPmZsYWdzID0gMDsKKwkJdHlwaG9vbl9pbmNfdHhfaW5kZXgoJmxhc3RSZWFkLCAxKTsKKwl9CisKKwlyZXR1cm4gbGFzdFJlYWQ7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX3R4X2NvbXBsZXRlKHN0cnVjdCB0eXBob29uICp0cCwgc3RydWN0IHRyYW5zbWl0X3JpbmcgKnR4UmluZywKKwkJCXZvbGF0aWxlIHUzMiAqIGluZGV4KQoreworCXUzMiBsYXN0UmVhZDsKKwlpbnQgbnVtRGVzYyA9IE1BWF9TS0JfRlJBR1MgKyAxOworCisJLyogVGhpcyB3aWxsIG5lZWQgY2hhbmdpbmcgaWYgd2Ugc3RhcnQgdG8gdXNlIHRoZSBIaSBUeCByaW5nLiAqLworCWxhc3RSZWFkID0gdHlwaG9vbl9jbGVhbl90eCh0cCwgdHhSaW5nLCBpbmRleCk7CisJaWYobmV0aWZfcXVldWVfc3RvcHBlZCh0cC0+ZGV2KSAmJiB0eXBob29uX251bV9mcmVlKHR4UmluZy0+bGFzdFdyaXRlLAorCQkJCWxhc3RSZWFkLCBUWExPX0VOVFJJRVMpID4gKG51bURlc2MgKyAyKSkKKwkJbmV0aWZfd2FrZV9xdWV1ZSh0cC0+ZGV2KTsKKworCXR4UmluZy0+bGFzdFJlYWQgPSBsYXN0UmVhZDsKKwlzbXBfd21iKCk7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX3JlY3ljbGVfcnhfc2tiKHN0cnVjdCB0eXBob29uICp0cCwgdTMyIGlkeCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbl9pbmRleGVzICppbmRleGVzID0gdHAtPmluZGV4ZXM7CisJc3RydWN0IHJ4YnVmZl9lbnQgKnJ4YiA9ICZ0cC0+cnhidWZmZXJzW2lkeF07CisJc3RydWN0IGJhc2ljX3JpbmcgKnJpbmcgPSAmdHAtPnJ4QnVmZlJpbmc7CisJc3RydWN0IHJ4X2ZyZWUgKnI7CisKKwlpZigocmluZy0+bGFzdFdyaXRlICsgc2l6ZW9mKCpyKSkgJSAoUlhGUkVFX0VOVFJJRVMgKiBzaXplb2YoKnIpKSA9PQorCQkJCWluZGV4ZXMtPnJ4QnVmZkNsZWFyZWQpIHsKKwkJLyogbm8gcm9vbSBpbiByaW5nLCBqdXN0IGRyb3AgdGhlIHNrYgorCQkgKi8KKwkJZGV2X2tmcmVlX3NrYl9hbnkocnhiLT5za2IpOworCQlyeGItPnNrYiA9IE5VTEw7CisJCXJldHVybjsKKwl9CisKKwlyID0gKHN0cnVjdCByeF9mcmVlICopIChyaW5nLT5yaW5nQmFzZSArIHJpbmctPmxhc3RXcml0ZSk7CisJdHlwaG9vbl9pbmNfcnhmcmVlX2luZGV4KCZyaW5nLT5sYXN0V3JpdGUsIDEpOworCXItPnZpcnRBZGRyID0gaWR4OworCXItPnBoeXNBZGRyID0gY3B1X3RvX2xlMzIocnhiLT5kbWFfYWRkcik7CisKKwkvKiBUZWxsIHRoZSBjYXJkIGFib3V0IGl0ICovCisJd21iKCk7CisJaW5kZXhlcy0+cnhCdWZmUmVhZHkgPSBjcHVfdG9fbGUzMihyaW5nLT5sYXN0V3JpdGUpOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX2FsbG9jX3J4X3NrYihzdHJ1Y3QgdHlwaG9vbiAqdHAsIHUzMiBpZHgpCit7CisJc3RydWN0IHR5cGhvb25faW5kZXhlcyAqaW5kZXhlcyA9IHRwLT5pbmRleGVzOworCXN0cnVjdCByeGJ1ZmZfZW50ICpyeGIgPSAmdHAtPnJ4YnVmZmVyc1tpZHhdOworCXN0cnVjdCBiYXNpY19yaW5nICpyaW5nID0gJnRwLT5yeEJ1ZmZSaW5nOworCXN0cnVjdCByeF9mcmVlICpyOworCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCXJ4Yi0+c2tiID0gTlVMTDsKKworCWlmKChyaW5nLT5sYXN0V3JpdGUgKyBzaXplb2YoKnIpKSAlIChSWEZSRUVfRU5UUklFUyAqIHNpemVvZigqcikpID09CisJCQkJaW5kZXhlcy0+cnhCdWZmQ2xlYXJlZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOworCWlmKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisjaWYgMAorCS8qIFBsZWFzZSwgM2NvbSwgZml4IHRoZSBmaXJtd2FyZSB0byBhbGxvdyBETUEgdG8gYSB1bmFsaWduZWQKKwkgKiBhZGRyZXNzISBQcmV0dHkgcGxlYXNlPworCSAqLworCXNrYl9yZXNlcnZlKHNrYiwgMik7CisjZW5kaWYKKworCXNrYi0+ZGV2ID0gdHAtPmRldjsKKwlkbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBza2ItPnRhaWwsCisJCQkJICBQS1RfQlVGX1NaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJLyogU2luY2Ugbm8gY2FyZCBkb2VzIDY0IGJpdCBEQUMsIHRoZSBoaWdoIGJpdHMgd2lsbCBuZXZlcgorCSAqIGNoYW5nZSBmcm9tIHplcm8uCisJICovCisJciA9IChzdHJ1Y3QgcnhfZnJlZSAqKSAocmluZy0+cmluZ0Jhc2UgKyByaW5nLT5sYXN0V3JpdGUpOworCXR5cGhvb25faW5jX3J4ZnJlZV9pbmRleCgmcmluZy0+bGFzdFdyaXRlLCAxKTsKKwlyLT52aXJ0QWRkciA9IGlkeDsKKwlyLT5waHlzQWRkciA9IGNwdV90b19sZTMyKGRtYV9hZGRyKTsKKwlyeGItPnNrYiA9IHNrYjsKKwlyeGItPmRtYV9hZGRyID0gZG1hX2FkZHI7CisKKwkvKiBUZWxsIHRoZSBjYXJkIGFib3V0IGl0ICovCisJd21iKCk7CisJaW5kZXhlcy0+cnhCdWZmUmVhZHkgPSBjcHVfdG9fbGUzMihyaW5nLT5sYXN0V3JpdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX3J4KHN0cnVjdCB0eXBob29uICp0cCwgc3RydWN0IGJhc2ljX3JpbmcgKnJ4UmluZywgdm9sYXRpbGUgdTMyICogcmVhZHksCisJICAgdm9sYXRpbGUgdTMyICogY2xlYXJlZCwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgcnhfZGVzYyAqcng7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5ld19za2I7CisJc3RydWN0IHJ4YnVmZl9lbnQgKnJ4YjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXUzMiBsb2NhbF9yZWFkeTsKKwl1MzIgcnhhZGRyOworCWludCBwa3RfbGVuOworCXUzMiBpZHg7CisJdTMyIGNzdW1fYml0czsKKwlpbnQgcmVjZWl2ZWQ7CisKKwlyZWNlaXZlZCA9IDA7CisJbG9jYWxfcmVhZHkgPSBsZTMyX3RvX2NwdSgqcmVhZHkpOworCXJ4YWRkciA9IGxlMzJfdG9fY3B1KCpjbGVhcmVkKTsKKwl3aGlsZShyeGFkZHIgIT0gbG9jYWxfcmVhZHkgJiYgYnVkZ2V0ID4gMCkgeworCQlyeCA9IChzdHJ1Y3QgcnhfZGVzYyAqKSAocnhSaW5nLT5yaW5nQmFzZSArIHJ4YWRkcik7CisJCWlkeCA9IHJ4LT5hZGRyOworCQlyeGIgPSAmdHAtPnJ4YnVmZmVyc1tpZHhdOworCQlza2IgPSByeGItPnNrYjsKKwkJZG1hX2FkZHIgPSByeGItPmRtYV9hZGRyOworCisJCXR5cGhvb25faW5jX3J4X2luZGV4KCZyeGFkZHIsIDEpOworCisJCWlmKHJ4LT5mbGFncyAmIFRZUEhPT05fUlhfRVJST1IpIHsKKwkJCXR5cGhvb25fcmVjeWNsZV9yeF9za2IodHAsIGlkeCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBrdF9sZW4gPSBsZTE2X3RvX2NwdShyeC0+ZnJhbWVMZW4pOworCisJCWlmKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsgJiYKKwkJICAgKG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgeworCQkJbmV3X3NrYi0+ZGV2ID0gdHAtPmRldjsKKwkJCXNrYl9yZXNlcnZlKG5ld19za2IsIDIpOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHRwLT5wZGV2LCBkbWFfYWRkciwKKwkJCQkJCSAgICBQS1RfQlVGX1NaLAorCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlldGhfY29weV9hbmRfc3VtKG5ld19za2IsIHNrYi0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UodHAtPnBkZXYsIGRtYV9hZGRyLAorCQkJCQkJICAgICAgIFBLVF9CVUZfU1osCisJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNrYl9wdXQobmV3X3NrYiwgcGt0X2xlbik7CisJCQl0eXBob29uX3JlY3ljbGVfcnhfc2tiKHRwLCBpZHgpOworCQl9IGVsc2UgeworCQkJbmV3X3NrYiA9IHNrYjsKKwkJCXNrYl9wdXQobmV3X3NrYiwgcGt0X2xlbik7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCBkbWFfYWRkciwgUEtUX0JVRl9TWiwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXR5cGhvb25fYWxsb2Nfcnhfc2tiKHRwLCBpZHgpOworCQl9CisJCW5ld19za2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMobmV3X3NrYiwgdHAtPmRldik7CisJCWNzdW1fYml0cyA9IHJ4LT5yeFN0YXR1cyAmIChUWVBIT09OX1JYX0lQX0NIS19HT09EIHwKKwkJCVRZUEhPT05fUlhfVURQX0NIS19HT09EIHwgVFlQSE9PTl9SWF9UQ1BfQ0hLX0dPT0QpOworCQlpZihjc3VtX2JpdHMgPT0KKwkJICAgKFRZUEhPT05fUlhfSVBfQ0hLX0dPT0QgfCBUWVBIT09OX1JYX1RDUF9DSEtfR09PRCkKKwkJICAgfHwgY3N1bV9iaXRzID09CisJCSAgIChUWVBIT09OX1JYX0lQX0NIS19HT09EIHwgVFlQSE9PTl9SWF9VRFBfQ0hLX0dPT0QpKSB7CisJCQluZXdfc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJfSBlbHNlCisJCQluZXdfc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJCXNwaW5fbG9jaygmdHAtPnN0YXRlX2xvY2spOworCQlpZih0cC0+dmxncnAgIT0gTlVMTCAmJiByeC0+cnhTdGF0dXMgJiBUWVBIT09OX1JYX1ZMQU4pCisJCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2IobmV3X3NrYiwgdHAtPnZsZ3JwLAorCQkJCQkJIG50b2hsKHJ4LT52bGFuVGFnKSAmIDB4ZmZmZik7CisJCWVsc2UKKwkJCW5ldGlmX3JlY2VpdmVfc2tiKG5ld19za2IpOworCQlzcGluX3VubG9jaygmdHAtPnN0YXRlX2xvY2spOworCisJCXRwLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlyZWNlaXZlZCsrOworCQlidWRnZXQtLTsKKwl9CisJKmNsZWFyZWQgPSBjcHVfdG9fbGUzMihyeGFkZHIpOworCisJcmV0dXJuIHJlY2VpdmVkOworfQorCitzdGF0aWMgdm9pZAordHlwaG9vbl9maWxsX2ZyZWVfcmluZyhzdHJ1Y3QgdHlwaG9vbiAqdHApCit7CisJdTMyIGk7CisKKwlmb3IoaSA9IDA7IGkgPCBSWEVOVF9FTlRSSUVTOyBpKyspIHsKKwkJc3RydWN0IHJ4YnVmZl9lbnQgKnJ4YiA9ICZ0cC0+cnhidWZmZXJzW2ldOworCQlpZihyeGItPnNrYikKKwkJCWNvbnRpbnVlOworCQlpZih0eXBob29uX2FsbG9jX3J4X3NrYih0cCwgaSkgPCAwKQorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50Cit0eXBob29uX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICp0b3RhbF9idWRnZXQpCit7CisJc3RydWN0IHR5cGhvb24gKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdHlwaG9vbl9pbmRleGVzICppbmRleGVzID0gdHAtPmluZGV4ZXM7CisJaW50IG9yaWdfYnVkZ2V0ID0gKnRvdGFsX2J1ZGdldDsKKwlpbnQgYnVkZ2V0LCB3b3JrX2RvbmUsIGRvbmU7CisKKwlybWIoKTsKKwlpZighdHAtPmF3YWl0aW5nX3Jlc3AgJiYgaW5kZXhlcy0+cmVzcFJlYWR5ICE9IGluZGV4ZXMtPnJlc3BDbGVhcmVkKQorCQkJdHlwaG9vbl9wcm9jZXNzX3Jlc3BvbnNlKHRwLCAwLCBOVUxMKTsKKworCWlmKGxlMzJfdG9fY3B1KGluZGV4ZXMtPnR4TG9DbGVhcmVkKSAhPSB0cC0+dHhMb1JpbmcubGFzdFJlYWQpCisJCXR5cGhvb25fdHhfY29tcGxldGUodHAsICZ0cC0+dHhMb1JpbmcsICZpbmRleGVzLT50eExvQ2xlYXJlZCk7CisKKwlpZihvcmlnX2J1ZGdldCA+IGRldi0+cXVvdGEpCisJCW9yaWdfYnVkZ2V0ID0gZGV2LT5xdW90YTsKKworCWJ1ZGdldCA9IG9yaWdfYnVkZ2V0OworCXdvcmtfZG9uZSA9IDA7CisJZG9uZSA9IDE7CisKKwlpZihpbmRleGVzLT5yeEhpQ2xlYXJlZCAhPSBpbmRleGVzLT5yeEhpUmVhZHkpIHsKKwkJd29ya19kb25lID0gdHlwaG9vbl9yeCh0cCwgJnRwLT5yeEhpUmluZywgJmluZGV4ZXMtPnJ4SGlSZWFkeSwKKwkJCSAgIAkJJmluZGV4ZXMtPnJ4SGlDbGVhcmVkLCBidWRnZXQpOworCQlidWRnZXQgLT0gd29ya19kb25lOworCX0KKworCWlmKGluZGV4ZXMtPnJ4TG9DbGVhcmVkICE9IGluZGV4ZXMtPnJ4TG9SZWFkeSkgeworCQl3b3JrX2RvbmUgKz0gdHlwaG9vbl9yeCh0cCwgJnRwLT5yeExvUmluZywgJmluZGV4ZXMtPnJ4TG9SZWFkeSwKKwkJCSAgIAkJJmluZGV4ZXMtPnJ4TG9DbGVhcmVkLCBidWRnZXQpOworCX0KKworCWlmKHdvcmtfZG9uZSkgeworCQkqdG90YWxfYnVkZ2V0IC09IHdvcmtfZG9uZTsKKwkJZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisKKwkJaWYod29ya19kb25lID49IG9yaWdfYnVkZ2V0KQorCQkJZG9uZSA9IDA7CisJfQorCisJaWYobGUzMl90b19jcHUoaW5kZXhlcy0+cnhCdWZmQ2xlYXJlZCkgPT0gdHAtPnJ4QnVmZlJpbmcubGFzdFdyaXRlKSB7CisJCS8qIHJ4QnVmZiByaW5nIGlzIGVtcHR5LCB0cnkgdG8gZmlsbCBpdC4gKi8KKwkJdHlwaG9vbl9maWxsX2ZyZWVfcmluZyh0cCk7CisJfQorCisJaWYoZG9uZSkgeworCQluZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCQlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX05PTkUsCisJCQkJdHAtPmlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfTUFTSyk7CisJCXR5cGhvb25fcG9zdF9wY2lfd3JpdGVzKHRwLT5pb2FkZHIpOworCX0KKworCXJldHVybiAoZG9uZSA/IDAgOiAxKTsKK30KKworc3RhdGljIGlycXJldHVybl90Cit0eXBob29uX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IHR5cGhvb24gKnRwID0gZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmlvYWRkcjsKKwl1MzIgaW50cl9zdGF0dXM7CisKKwlpbnRyX3N0YXR1cyA9IGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKwlpZighKGludHJfc3RhdHVzICYgVFlQSE9PTl9JTlRSX0hPU1RfSU5UKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJaW93cml0ZTMyKGludHJfc3RhdHVzLCBpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX1NUQVRVUyk7CisKKwlpZihuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpIHsKKwkJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfTUFTSyk7CisJCXR5cGhvb25fcG9zdF9wY2lfd3JpdGVzKGlvYWRkcik7CisJCV9fbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciwgcG9sbCBhbHJlYWR5IHNjaGVkdWxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZAordHlwaG9vbl9mcmVlX3J4X3JpbmdzKHN0cnVjdCB0eXBob29uICp0cCkKK3sKKwl1MzIgaTsKKworCWZvcihpID0gMDsgaSA8IFJYRU5UX0VOVFJJRVM7IGkrKykgeworCQlzdHJ1Y3QgcnhidWZmX2VudCAqcnhiID0gJnRwLT5yeGJ1ZmZlcnNbaV07CisJCWlmKHJ4Yi0+c2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCByeGItPmRtYV9hZGRyLCBQS1RfQlVGX1NaLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihyeGItPnNrYik7CisJCQlyeGItPnNrYiA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fc2xlZXAoc3RydWN0IHR5cGhvb24gKnRwLCBwY2lfcG93ZXJfdCBzdGF0ZSwgdTE2IGV2ZW50cykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRwLT5wZGV2OworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmlvYWRkcjsKKwlzdHJ1Y3QgY21kX2Rlc2MgeHBfY21kOworCWludCBlcnI7CisKKwlJTklUX0NPTU1BTkRfV0lUSF9SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9FTkFCTEVfV0FLRV9FVkVOVFMpOworCXhwX2NtZC5wYXJtMSA9IGV2ZW50czsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdHlwaG9vbl9zbGVlcCgpOiB3YWtlIGV2ZW50cyBjbWQgZXJyICVkXG4iLAorCQkJCXRwLT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9HT1RPX1NMRUVQKTsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdHlwaG9vbl9zbGVlcCgpOiBzbGVlcCBjbWQgZXJyICVkXG4iLAorCQkJCXRwLT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmKHR5cGhvb25fd2FpdF9zdGF0dXMoaW9hZGRyLCBUWVBIT09OX1NUQVRVU19TTEVFUElORykgPCAwKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCS8qIFNpbmNlIHdlIGNhbm5vdCBtb25pdG9yIHRoZSBzdGF0dXMgb2YgdGhlIGxpbmsgd2hpbGUgc2xlZXBpbmcsCisJICogdGVsbCB0aGUgd29ybGQgaXQgd2VudCBhd2F5LgorCSAqLworCW5ldGlmX2NhcnJpZXJfb2ZmKHRwLT5kZXYpOworCisJcGNpX2VuYWJsZV93YWtlKHRwLT5wZGV2LCBzdGF0ZSwgMSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKK30KKworc3RhdGljIGludAordHlwaG9vbl93YWtldXAoc3RydWN0IHR5cGhvb24gKnRwLCBpbnQgd2FpdF90eXBlKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdHAtPnBkZXY7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+aW9hZGRyOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJLyogUG9zdCAyLngueCB2ZXJzaW9ucyBvZiB0aGUgU2xlZXAgSW1hZ2UgcmVxdWlyZSBhIHJlc2V0IGJlZm9yZQorCSAqIHdlIGNhbiBkb3dubG9hZCB0aGUgUnVudGltZSBJbWFnZS4gQnV0IGxldCdzIG5vdCBtYWtlIHVzZXJzIG9mCisJICogdGhlIG9sZCBmaXJtd2FyZSBwYXkgZm9yIHRoZSByZXNldC4KKwkgKi8KKwlpb3dyaXRlMzIoVFlQSE9PTl9CT09UQ01EX1dBS0VVUCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfQ09NTUFORCk7CisJaWYodHlwaG9vbl93YWl0X3N0YXR1cyhpb2FkZHIsIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX0hPU1QpIDwgMCB8fAorCQkJKHRwLT5jYXBhYmlsaXRpZXMgJiBUWVBIT09OX1dBS0VVUF9ORUVEU19SRVNFVCkpCisJCXJldHVybiB0eXBob29uX3Jlc2V0KGlvYWRkciwgd2FpdF90eXBlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX3N0YXJ0X3J1bnRpbWUoc3RydWN0IHR5cGhvb24gKnRwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0cC0+ZGV2OworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmlvYWRkcjsKKwlzdHJ1Y3QgY21kX2Rlc2MgeHBfY21kOworCWludCBlcnI7CisKKwl0eXBob29uX2luaXRfcmluZ3ModHApOworCXR5cGhvb25fZmlsbF9mcmVlX3JpbmcodHApOworCisJZXJyID0gdHlwaG9vbl9kb3dubG9hZF9maXJtd2FyZSh0cCk7CisJaWYoZXJyIDwgMCkgeworCQlwcmludGsoIiVzOiBjYW5ub3QgbG9hZCBydW50aW1lIG9uIDNYUFxuIiwgdHAtPm5hbWUpOworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwlpZih0eXBob29uX2Jvb3RfM1hQKHRwLCBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9CT09UKSA8IDApIHsKKwkJcHJpbnRrKCIlczogY2Fubm90IGJvb3QgM1hQXG4iLCB0cC0+bmFtZSk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9TRVRfTUFYX1BLVF9TSVpFKTsKKwl4cF9jbWQucGFybTEgPSBjcHVfdG9fbGUxNihQS1RfQlVGX1NaKTsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApCisJCWdvdG8gZXJyb3Jfb3V0OworCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1NFVF9NQUNfQUREUkVTUyk7CisJeHBfY21kLnBhcm0xID0gY3B1X3RvX2xlMTYobnRvaHMoKih1MTYgKikmZGV2LT5kZXZfYWRkclswXSkpOworCXhwX2NtZC5wYXJtMiA9IGNwdV90b19sZTMyKG50b2hsKCoodTMyICopJmRldi0+ZGV2X2FkZHJbMl0pKTsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApCisJCWdvdG8gZXJyb3Jfb3V0OworCisJLyogRGlzYWJsZSBJUlEgY29hbGVzY2luZyAtLSB3ZSBjYW4gcmVlbmFibGUgaXQgd2hlbiAzQ29tIGdpdmVzCisJICogdXMgc29tZSBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250cm9sIGl0LgorCSAqLworCUlOSVRfQ09NTUFORF9XSVRIX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX0lSUV9DT0FMRVNDRV9DVFJMKTsKKwl4cF9jbWQucGFybTEgPSAwOworCWVyciA9IHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCk7CisJaWYoZXJyIDwgMCkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfWENWUl9TRUxFQ1QpOworCXhwX2NtZC5wYXJtMSA9IHRwLT54Y3ZyX3NlbGVjdDsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApCisJCWdvdG8gZXJyb3Jfb3V0OworCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1ZMQU5fVFlQRV9XUklURSk7CisJeHBfY21kLnBhcm0xID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihFVEhfUF84MDIxUSk7CisJZXJyID0gdHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAwLCBOVUxMKTsKKwlpZihlcnIgPCAwKQorCQlnb3RvIGVycm9yX291dDsKKworCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9TRVRfT0ZGTE9BRF9UQVNLUyk7CisJc3Bpbl9sb2NrX2JoKCZ0cC0+c3RhdGVfbG9jayk7CisJeHBfY21kLnBhcm0yID0gdHAtPm9mZmxvYWQ7CisJeHBfY21kLnBhcm0zID0gdHAtPm9mZmxvYWQ7CisJZXJyID0gdHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAwLCBOVUxMKTsKKwlzcGluX3VubG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCWlmKGVyciA8IDApCisJCWdvdG8gZXJyb3Jfb3V0OworCisJdHlwaG9vbl9zZXRfcnhfbW9kZShkZXYpOworCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1RYX0VOQUJMRSk7CisJZXJyID0gdHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAwLCBOVUxMKTsKKwlpZihlcnIgPCAwKQorCQlnb3RvIGVycm9yX291dDsKKworCUlOSVRfQ09NTUFORF9XSVRIX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1JYX0VOQUJMRSk7CisJZXJyID0gdHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAwLCBOVUxMKTsKKwlpZihlcnIgPCAwKQorCQlnb3RvIGVycm9yX291dDsKKworCXRwLT5jYXJkX3N0YXRlID0gUnVubmluZzsKKwlzbXBfd21iKCk7CisKKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX0VOQUJMRV9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfRU5BQkxFKTsKKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX05PTkUsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfTUFTSyk7CisJdHlwaG9vbl9wb3N0X3BjaV93cml0ZXMoaW9hZGRyKTsKKworCXJldHVybiAwOworCitlcnJvcl9vdXQ6CisJdHlwaG9vbl9yZXNldChpb2FkZHIsIFdhaXROb1NsZWVwKTsKKwl0eXBob29uX2ZyZWVfcnhfcmluZ3ModHApOworCXR5cGhvb25faW5pdF9yaW5ncyh0cCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAordHlwaG9vbl9zdG9wX3J1bnRpbWUoc3RydWN0IHR5cGhvb24gKnRwLCBpbnQgd2FpdF90eXBlKQoreworCXN0cnVjdCB0eXBob29uX2luZGV4ZXMgKmluZGV4ZXMgPSB0cC0+aW5kZXhlczsKKwlzdHJ1Y3QgdHJhbnNtaXRfcmluZyAqdHhMbyA9ICZ0cC0+dHhMb1Jpbmc7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+aW9hZGRyOworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisJaW50IGk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgZWFybHksIHNpbmNlIHdlIGNhbid0IHNjaGVkdWxlIGEgcG9sbAorCSAqIHdoZW4gY2FsbGVkIHdpdGggIW5ldGlmX3J1bm5pbmcoKS4gVGhpcyB3aWxsIGJlIHBvc3RlZAorCSAqIHdoZW4gd2UgZm9yY2UgdGhlIHBvc3Rpbmcgb2YgdGhlIGNvbW1hbmQuCisJICovCisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9OT05FLCBpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX0VOQUJMRSk7CisKKwlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfUlhfRElTQUJMRSk7CisJdHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAwLCBOVUxMKTsKKworCS8qIFdhaXQgMS8yIHNlYyBmb3IgYW55IG91dHN0YW5kaW5nIHRyYW5zbWl0cyB0byBvY2N1cgorCSAqIFdlJ2xsIGNsZWFudXAgYWZ0ZXIgdGhlIHJlc2V0IGlmIHRoaXMgdGltZXMgb3V0LgorCSAqLworCWZvcihpID0gMDsgaSA8IFRZUEhPT05fV0FJVF9USU1FT1VUOyBpKyspIHsKKwkJaWYoaW5kZXhlcy0+dHhMb0NsZWFyZWQgPT0gY3B1X3RvX2xlMzIodHhMby0+bGFzdFdyaXRlKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoVFlQSE9PTl9VREVMQVkpOworCX0KKworCWlmKGkgPT0gVFlQSE9PTl9XQUlUX1RJTUVPVVQpCisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBoYWx0IHRpbWVkIG91dCB3YWl0aW5nIGZvciBUeCB0byBjb21wbGV0ZVxuIiwKKwkJICAgICAgIHRwLT5uYW1lKTsKKworCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9UWF9ESVNBQkxFKTsKKwl0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCisJLyogc2F2ZSB0aGUgc3RhdGlzdGljcyBzbyB3aGVuIHdlIGJyaW5nIHRoZSBpbnRlcmZhY2UgdXAgYWdhaW4sCisJICogdGhlIHZhbHVlcyByZXBvcnRlZCB0byB1c2Vyc3BhY2UgYXJlIGNvcnJlY3QuCisJICovCisJdHAtPmNhcmRfc3RhdGUgPSBTbGVlcGluZzsKKwlzbXBfd21iKCk7CisJdHlwaG9vbl9kb19nZXRfc3RhdHModHApOworCW1lbWNweSgmdHAtPnN0YXRzX3NhdmVkLCAmdHAtPnN0YXRzLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKworCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9IQUxUKTsKKwl0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCisJaWYodHlwaG9vbl93YWl0X3N0YXR1cyhpb2FkZHIsIFRZUEhPT05fU1RBVFVTX0hBTFRFRCkgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgM1hQIHRvIGhhbHRcbiIsCisJCSAgICAgICB0cC0+bmFtZSk7CisKKwlpZih0eXBob29uX3Jlc2V0KGlvYWRkciwgd2FpdF90eXBlKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHJlc2V0IDNYUFxuIiwgdHAtPm5hbWUpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwkvKiBjbGVhbnVwIGFueSBvdXRzdGFuZGluZyBUeCBwYWNrZXRzICovCisJaWYoaW5kZXhlcy0+dHhMb0NsZWFyZWQgIT0gY3B1X3RvX2xlMzIodHhMby0+bGFzdFdyaXRlKSkgeworCQlpbmRleGVzLT50eExvQ2xlYXJlZCA9IGNwdV90b19sZTMyKHR4TG8tPmxhc3RXcml0ZSk7CisJCXR5cGhvb25fY2xlYW5fdHgodHAsICZ0cC0+dHhMb1JpbmcsICZpbmRleGVzLT50eExvQ2xlYXJlZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYodHlwaG9vbl9yZXNldCh0cC0+aW9hZGRyLCBXYWl0Tm9TbGVlcCkgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgcmVzZXQgaW4gdHggdGltZW91dFxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJZ290byB0cnVlbHlfZGVhZDsKKwl9CisKKwkvKiBJZiB3ZSBldmVyIHN0YXJ0IHVzaW5nIHRoZSBIaSByaW5nLCBpdCB3aWxsIG5lZWQgY2xlYW5pbmcgdG9vICovCisJdHlwaG9vbl9jbGVhbl90eCh0cCwgJnRwLT50eExvUmluZywgJnRwLT5pbmRleGVzLT50eExvQ2xlYXJlZCk7CisJdHlwaG9vbl9mcmVlX3J4X3JpbmdzKHRwKTsKKworCWlmKHR5cGhvb25fc3RhcnRfcnVudGltZSh0cCkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBzdGFydCBydW50aW1lIGluIHR4IHRpbWVvdXRcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCWdvdG8gdHJ1ZWx5X2RlYWQ7CisgICAgICAgIH0KKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm47CisKK3RydWVseV9kZWFkOgorCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSwgYW5kIHR1cm4gb2ZmIGNhcnJpZXIgdG8gYXZvaWQgbW9yZSB0aW1lb3V0cyAqLworCXR5cGhvb25fcmVzZXQodHAtPmlvYWRkciwgTm9XYWl0KTsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwllcnIgPSB0eXBob29uX3dha2V1cCh0cCwgV2FpdFNsZWVwKTsKKwlpZihlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byB3YWtldXAgZGV2aWNlXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIG91dF9zbGVlcDsKKwl9CisKKwllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnR5cGhvb25faW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCQlkZXYtPm5hbWUsIGRldik7CisJaWYoZXJyIDwgMCkKKwkJZ290byBvdXRfc2xlZXA7CisKKwllcnIgPSB0eXBob29uX3N0YXJ0X3J1bnRpbWUodHApOworCWlmKGVyciA8IDApCisJCWdvdG8gb3V0X2lycTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7CisKK291dF9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKK291dF9zbGVlcDoKKwlpZih0eXBob29uX2Jvb3RfM1hQKHRwLCBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9IT1NUKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHJlYm9vdCBpbnRvIHNsZWVwIGltZ1xuIiwKKwkJCQlkZXYtPm5hbWUpOworCQl0eXBob29uX3Jlc2V0KHRwLT5pb2FkZHIsIE5vV2FpdCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmKHR5cGhvb25fc2xlZXAodHAsIFBDSV9EM2hvdCwgMCkgPCAwKSAKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdvIGJhY2sgdG8gc2xlZXBcbiIsIGRldi0+bmFtZSk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR5cGhvb24gKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmKHR5cGhvb25fc3RvcF9ydW50aW1lKHRwLCBXYWl0U2xlZXApIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHN0b3AgcnVudGltZVxuIiwgZGV2LT5uYW1lKTsKKworCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBpcnEgaGFuZGxlciBydW5uaW5nIG9uIGEgZGlmZmVyZW50IENQVS4gKi8KKwl0eXBob29uX3N5bmNocm9uaXplX2lycShkZXYtPmlycSk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwl0eXBob29uX2ZyZWVfcnhfcmluZ3ModHApOworCXR5cGhvb25faW5pdF9yaW5ncyh0cCk7CisKKwlpZih0eXBob29uX2Jvb3RfM1hQKHRwLCBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9IT1NUKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBib290IHNsZWVwIGltYWdlXG4iLCBkZXYtPm5hbWUpOworCisJaWYodHlwaG9vbl9zbGVlcCh0cCwgUENJX0QzaG90LCAwKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBwdXQgY2FyZCB0byBzbGVlcFxuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50Cit0eXBob29uX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBJZiB3ZSdyZSBkb3duLCByZXN1bWUgd2hlbiB3ZSBhcmUgdXBwZWQuCisJICovCisJaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwlpZih0eXBob29uX3dha2V1cCh0cCwgV2FpdE5vU2xlZXApIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjcml0aWNhbDogY291bGQgbm90IHdha2UgdXAgaW4gcmVzdW1lXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCWdvdG8gcmVzZXQ7CisJfQorCisJaWYodHlwaG9vbl9zdGFydF9ydW50aW1lKHRwKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY3JpdGljYWw6IGNvdWxkIG5vdCBzdGFydCBydW50aW1lIGluICIKKwkJCQkicmVzdW1lXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIHJlc2V0OworCX0KKworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworCityZXNldDoKKwl0eXBob29uX3Jlc2V0KHRwLT5pb2FkZHIsIE5vV2FpdCk7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludAordHlwaG9vbl9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisKKwkvKiBJZiB3ZSdyZSBkb3duLCB3ZSdyZSBhbHJlYWR5IHN1c3BlbmRlZC4KKwkgKi8KKwlpZighbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCWlmKHRwLT52bGdycCAmJiB0cC0+d29sX2V2ZW50cyAmIFRZUEhPT05fV0FLRV9NQUdJQ19QS1QpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnRwLT5zdGF0ZV9sb2NrKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGRvIFdBS0VfTUFHSUMgd2l0aCBWTEFOU1xuIiwKKwkJCQlkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlzcGluX3VubG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCisJaWYodHlwaG9vbl9zdG9wX3J1bnRpbWUodHAsIFdhaXROb1NsZWVwKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHN0b3AgcnVudGltZVxuIiwgZGV2LT5uYW1lKTsKKwkJZ290byBuZWVkX3Jlc3VtZTsKKwl9CisKKwl0eXBob29uX2ZyZWVfcnhfcmluZ3ModHApOworCXR5cGhvb25faW5pdF9yaW5ncyh0cCk7CisKKwlpZih0eXBob29uX2Jvb3RfM1hQKHRwLCBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9IT1NUKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGJvb3Qgc2xlZXAgaW1hZ2VcbiIsIGRldi0+bmFtZSk7CisJCWdvdG8gbmVlZF9yZXN1bWU7CisJfQorCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1NFVF9NQUNfQUREUkVTUyk7CisJeHBfY21kLnBhcm0xID0gY3B1X3RvX2xlMTYobnRvaHMoKih1MTYgKikmZGV2LT5kZXZfYWRkclswXSkpOworCXhwX2NtZC5wYXJtMiA9IGNwdV90b19sZTMyKG50b2hsKCoodTMyICopJmRldi0+ZGV2X2FkZHJbMl0pKTsKKwlpZih0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gc2V0IG1hYyBhZGRyZXNzIGluIHN1c3BlbmRcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJZ290byBuZWVkX3Jlc3VtZTsKKwl9CisKKwlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfU0VUX1JYX0ZJTFRFUik7CisJeHBfY21kLnBhcm0xID0gVFlQSE9PTl9SWF9GSUxURVJfRElSRUNURUQgfCBUWVBIT09OX1JYX0ZJTFRFUl9CUk9BRENBU1Q7CisJaWYodHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAwLCBOVUxMKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHNldCByeCBmaWx0ZXIgaW4gc3VzcGVuZFxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQlnb3RvIG5lZWRfcmVzdW1lOworCX0KKworCWlmKHR5cGhvb25fc2xlZXAodHAsIHN0YXRlLCB0cC0+d29sX2V2ZW50cykgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBwdXQgY2FyZCB0byBzbGVlcFxuIiwgZGV2LT5uYW1lKTsKKwkJZ290byBuZWVkX3Jlc3VtZTsKKwl9CisKKwlyZXR1cm4gMDsKKworbmVlZF9yZXN1bWU6CisJdHlwaG9vbl9yZXN1bWUocGRldik7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludAordHlwaG9vbl9lbmFibGVfd2FrZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBwY2lfZW5hYmxlX3dha2UocGRldiwgc3RhdGUsIGVuYWJsZSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQKK3R5cGhvb25fdGVzdF9tbWlvKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGNpX2lvbWFwKHBkZXYsIDEsIDEyOCk7CisJaW50IG1vZGUgPSAwOworCXUzMiB2YWw7CisKKwlpZighaW9hZGRyKQorCQlnb3RvIG91dDsKKworCWlmKGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX1NUQVRVUykgIT0KKwkJCQlUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9IT1NUKQorCQlnb3RvIG91dF91bm1hcDsKKworCWlvd3JpdGUzMihUWVBIT09OX0lOVFJfQUxMLCBpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX01BU0spOworCWlvd3JpdGUzMihUWVBIT09OX0lOVFJfQUxMLCBpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX1NUQVRVUyk7CisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfRU5BQkxFKTsKKworCS8qIE9rLCBzZWUgaWYgd2UgY2FuIGNoYW5nZSBvdXIgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBieQorCSAqIHNlbmRpbmcgb3Vyc2VsdmVzIGFuIGludGVycnVwdC4gSWYgc28sIHRoZW4gTU1JTyB3b3Jrcy4KKwkgKiBUaGUgNTB1c2VjIGRlbGF5IGlzIGFyYml0cmFyeSAtLSBpdCBjb3VsZCBwcm9iYWJseSBiZSBzbWFsbGVyLgorCSAqLworCXZhbCA9IGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKwlpZigodmFsICYgVFlQSE9PTl9JTlRSX1NFTEYpID09IDApIHsKKwkJaW93cml0ZTMyKDEsIGlvYWRkciArIFRZUEhPT05fUkVHX1NFTEZfSU5URVJSVVBUKTsKKwkJaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9TVEFUVVMpOworCQl1ZGVsYXkoNTApOworCQl2YWwgPSBpb3JlYWQzMihpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX1NUQVRVUyk7CisJCWlmKHZhbCAmIFRZUEhPT05fSU5UUl9TRUxGKQorCQkJbW9kZSA9IDE7CisJfQorCisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfTUFTSyk7CisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX05PTkUsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfRU5BQkxFKTsKKwlpb3JlYWQzMihpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX1NUQVRVUyk7CisKK291dF91bm1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCBpb2FkZHIpOworCitvdXQ6CisJaWYoIW1vZGUpCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJmYWxsaW5nIGJhY2sgdG8gcG9ydCBJT1xuIik7CisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0Cit0eXBob29uX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgZGlkX3ZlcnNpb24gPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHR5cGhvb24gKnRwOworCWludCBjYXJkX2lkID0gKGludCkgZW50LT5kcml2ZXJfZGF0YTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwl2b2lkICpzaGFyZWQ7CisJZG1hX2FkZHJfdCBzaGFyZWRfZG1hOworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisJc3RydWN0IHJlc3BfZGVzYyB4cF9yZXNwWzNdOworCWludCBpOworCWludCBlcnIgPSAwOworCisJaWYoIWRpZF92ZXJzaW9uKyspCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKnRwKSk7CisJaWYoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiB1bmFibGUgdG8gYWxsb2MgbmV3IG5ldCBkZXZpY2VcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmKGVyciA8IDApIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiB1bmFibGUgdG8gZW5hYmxlIGRldmljZVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJvcl9vdXRfZGV2OworCX0KKworCWVyciA9IHBjaV9zZXRfbXdpKHBkZXYpOworCWlmKGVyciA8IDApIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiB1bmFibGUgdG8gc2V0IE1XSVxuIiwgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycm9yX291dF9kaXNhYmxlOworCX0KKworCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCWlmKGVyciA8IDApIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiBObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb25cbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyb3Jfb3V0X213aTsKKwl9CisKKwkvKiBzYW5pdHkgY2hlY2tzIG9uIElPIGFuZCBNTUlPIEJBUnMKKwkgKi8KKwlpZighKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfSU8pKSB7CisJCXByaW50ayhFUlJfUEZYCisJCSAgICAgICAiJXM6IHJlZ2lvbiAjMSBub3QgYSBQQ0kgSU8gcmVzb3VyY2UsIGFib3J0aW5nXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycm9yX291dF9td2k7CisJfQorCWlmKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgPCAxMjgpIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiBJbnZhbGlkIFBDSSBJTyByZWdpb24gc2l6ZSwgYWJvcnRpbmdcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3Jfb3V0X213aTsKKwl9CisJaWYoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMSkgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJcHJpbnRrKEVSUl9QRlgKKwkJICAgICAgICIlczogcmVnaW9uICMxIG5vdCBhIFBDSSBNTUlPIHJlc291cmNlLCBhYm9ydGluZ1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl9vdXRfbXdpOworCX0KKwlpZihwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpIDwgMTI4KSB7CisJCXByaW50ayhFUlJfUEZYICIlczogSW52YWxpZCBQQ0kgTU1JTyByZWdpb24gc2l6ZSwgYWJvcnRpbmdcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3Jfb3V0X213aTsKKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJ0eXBob29uIik7CisJaWYoZXJyIDwgMCkgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IGNvdWxkIG5vdCByZXF1ZXN0IHJlZ2lvbnNcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyb3Jfb3V0X213aTsKKwl9CisKKwkvKiBtYXAgb3VyIHJlZ2lzdGVycworCSAqLworCWlmKHVzZV9tbWlvICE9IDAgJiYgdXNlX21taW8gIT0gMSkKKwkJdXNlX21taW8gPSB0eXBob29uX3Rlc3RfbW1pbyhwZGV2KTsKKworCWlvYWRkciA9IHBjaV9pb21hcChwZGV2LCB1c2VfbW1pbywgMTI4KTsKKwlpZiAoIWlvYWRkcikgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IGNhbm5vdCByZW1hcCByZWdpc3RlcnMsIGFib3J0aW5nXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycm9yX291dF9yZWdpb25zOworCX0KKworCS8qIGFsbG9jYXRlIHBjaSBkbWEgc3BhY2UgZm9yIHJ4IGFuZCB0eCBkZXNjcmlwdG9yIHJpbmdzCisJICovCisJc2hhcmVkID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCB0eXBob29uX3NoYXJlZCksCisJCQkJICAgICAgJnNoYXJlZF9kbWEpOworCWlmKCFzaGFyZWQpIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgRE1BIG1lbW9yeVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9vdXRfcmVtYXA7CisJfQorCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXRwLT5zaGFyZWQgPSAoc3RydWN0IHR5cGhvb25fc2hhcmVkICopIHNoYXJlZDsKKwl0cC0+c2hhcmVkX2RtYSA9IHNoYXJlZF9kbWE7CisJdHAtPnBkZXYgPSBwZGV2OworCXRwLT50eF9wZGV2ID0gcGRldjsKKwl0cC0+aW9hZGRyID0gaW9hZGRyOworCXRwLT50eF9pb2FkZHIgPSBpb2FkZHI7CisJdHAtPmRldiA9IGRldjsKKworCS8qIEluaXQgc2VxdWVuY2U6CisJICogMSkgUmVzZXQgdGhlIGFkYXB0ZXIgdG8gY2xlYXIgYW55IGJhZCBqdWp1CisJICogMikgUmVsb2FkIHRoZSBzbGVlcCBpbWFnZQorCSAqIDMpIEJvb3QgdGhlIHNsZWVwIGltYWdlCisJICogNCkgR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzLgorCSAqIDUpIFB1dCB0aGUgY2FyZCB0byBzbGVlcC4KKwkgKi8KKwlpZiAodHlwaG9vbl9yZXNldChpb2FkZHIsIFdhaXRTbGVlcCkgPCAwKSB7CisJCXByaW50ayhFUlJfUEZYICIlczogY291bGQgbm90IHJlc2V0IDNYUFxuIiwgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycm9yX291dF9kbWE7CisJfQorCisJLyogTm93IHRoYXQgd2UndmUgcmVzZXQgdGhlIDNYUCBhbmQgYXJlIHN1cmUgaXQncyBub3QgZ29pbmcgdG8KKwkgKiB3cml0ZSBhbGwgb3ZlciBtZW1vcnksIGVuYWJsZSBidXMgbWFzdGVyaW5nLCBhbmQgc2F2ZSBvdXIKKwkgKiBzdGF0ZSBmb3IgcmVzdW1pbmcgYWZ0ZXIgYSBzdXNwZW5kLgorCSAqLworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCisJLyogZGV2LT5uYW1lIGlzIG5vdCB2YWxpZCB1bnRpbCB3ZSByZWdpc3RlciwgYnV0IHdlIG5lZWQgdG8KKwkgKiB1c2Ugc29tZSBjb21tb24gcm91dGluZXMgdG8gaW5pdGlhbGl6ZSB0aGUgY2FyZC4gU28gdGhhdCB0aG9zZQorCSAqIHJvdXRpbmVzIHByaW50IHRoZSByaWdodCBuYW1lLCB3ZSBrZWVwIG91ciBvdW4gcG9pbnRlciB0byB0aGUgbmFtZQorCSAqLworCXRwLT5uYW1lID0gcGNpX25hbWUocGRldik7CisKKwl0eXBob29uX2luaXRfaW50ZXJmYWNlKHRwKTsKKwl0eXBob29uX2luaXRfcmluZ3ModHApOworCisJaWYodHlwaG9vbl9ib290XzNYUCh0cCwgVFlQSE9PTl9TVEFUVVNfV0FJVElOR19GT1JfSE9TVCkgPCAwKSB7CisJCXByaW50ayhFUlJfUEZYICIlczogY2Fubm90IGJvb3QgM1hQIHNsZWVwIGltYWdlXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycm9yX291dF9yZXNldDsKKwl9CisKKwlJTklUX0NPTU1BTkRfV0lUSF9SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9SRUFEX01BQ19BRERSRVNTKTsKKwlpZih0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDEsIHhwX3Jlc3ApIDwgMCkgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IGNhbm5vdCByZWFkIE1BQyBhZGRyZXNzXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycm9yX291dF9yZXNldDsKKwl9CisKKwkqKHUxNiAqKSZkZXYtPmRldl9hZGRyWzBdID0gaHRvbnMobGUxNl90b19jcHUoeHBfcmVzcFswXS5wYXJtMSkpOworCSoodTMyICopJmRldi0+ZGV2X2FkZHJbMl0gPSBodG9ubChsZTMyX3RvX2NwdSh4cF9yZXNwWzBdLnBhcm0yKSk7CisKKwlpZighaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IENvdWxkIG5vdCBvYnRhaW4gdmFsaWQgZXRoZXJuZXQgYWRkcmVzcywgIgorCQkgICAgICAgImFib3J0aW5nXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyb3Jfb3V0X3Jlc2V0OworCX0KKworCS8qIFJlYWQgdGhlIFNsZWVwIEltYWdlIHZlcnNpb24gbGFzdCwgc28gdGhlIHJlc3BvbnNlIGlzIHZhbGlkCisJICogbGF0ZXIgd2hlbiB3ZSBwcmludCBvdXQgdGhlIHZlcnNpb24gcmVwb3J0ZWQuCisJICovCisJSU5JVF9DT01NQU5EX1dJVEhfUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfUkVBRF9WRVJTSU9OUyk7CisJaWYodHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAzLCB4cF9yZXNwKSA8IDApIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiBDb3VsZCBub3QgZ2V0IFNsZWVwIEltYWdlIHZlcnNpb25cbiIsCisJCQlwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyb3Jfb3V0X3Jlc2V0OworCX0KKworCXRwLT5jYXBhYmlsaXRpZXMgPSB0eXBob29uX2NhcmRfaW5mb1tjYXJkX2lkXS5jYXBhYmlsaXRpZXM7CisJdHAtPnhjdnJfc2VsZWN0ID0gVFlQSE9PTl9YQ1ZSX0FVVE9ORUc7CisKKwkvKiBUeXBob29uIDEuMCBTbGVlcCBJbWFnZXMgcmV0dXJuIG9uZSByZXNwb25zZSBkZXNjcmlwdG9yIHRvIHRoZQorCSAqIFJFQURfVkVSU0lPTlMgY29tbWFuZC4gVGhvc2UgdmVyc2lvbnMgYXJlIE9LIGFmdGVyIHdha2luZyB1cAorCSAqIGZyb20gc2xlZXAgd2l0aG91dCBuZWVkaW5nIGEgcmVzZXQuIFR5cGhvb24gMS4xKyBTbGVlcCBJbWFnZXMKKwkgKiBzZWVtIHRvIG5lZWQgYSBsaXR0bGUgZXh0cmEgaGVscCB0byBnZXQgc3RhcnRlZC4gU2luY2Ugd2UgZG9uJ3QKKwkgKiBrbm93IGhvdyB0byBudWRnZSBpdCBhbG9uZywganVzdCBraWNrIGl0LgorCSAqLworCWlmKHhwX3Jlc3BbMF0ubnVtRGVzYyAhPSAwKQorCQl0cC0+Y2FwYWJpbGl0aWVzIHw9IFRZUEhPT05fV0FLRVVQX05FRURTX1JFU0VUOworCisJaWYodHlwaG9vbl9zbGVlcCh0cCwgUENJX0QzaG90LCAwKSA8IDApIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiBjYW5ub3QgcHV0IGFkYXB0ZXIgdG8gc2xlZXBcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyb3Jfb3V0X3Jlc2V0OworCX0KKworCS8qIFRoZSBjaGlwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuCQk9IHR5cGhvb25fb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHR5cGhvb25fc3RhcnRfdHg7CisJZGV2LT5zdG9wCQk9IHR5cGhvb25fY2xvc2U7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QJPSB0eXBob29uX3NldF9yeF9tb2RlOworCWRldi0+dHhfdGltZW91dAkJPSB0eXBob29uX3R4X3RpbWVvdXQ7CisJZGV2LT5wb2xsCQk9IHR5cGhvb25fcG9sbDsKKwlkZXYtPndlaWdodAkJPSAxNjsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gVFhfVElNRU9VVDsKKwlkZXYtPmdldF9zdGF0cwkJPSB0eXBob29uX2dldF9zdGF0czsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcwk9IHR5cGhvb25fc2V0X21hY19hZGRyZXNzOworCWRldi0+dmxhbl9yeF9yZWdpc3Rlcgk9IHR5cGhvb25fdmxhbl9yeF9yZWdpc3RlcjsKKwlkZXYtPnZsYW5fcnhfa2lsbF92aWQJPSB0eXBob29uX3ZsYW5fcnhfa2lsbF92aWQ7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJnR5cGhvb25fZXRodG9vbF9vcHMpOworCisJLyogV2UgY2FuIGhhbmRsZSBzY2F0dGVyIGdhdGhlciwgdXAgdG8gMTYgZW50cmllcywgYW5kCisJICogd2UgY2FuIGRvIElQIGNoZWNrc3VtbWluZyAob25seSB2ZXJzaW9uIDQsIGRvaC4uLikKKwkgKi8KKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU07CisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlg7CisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKKworCWlmKHJlZ2lzdGVyX25ldGRldihkZXYpIDwgMCkKKwkJZ290byBlcnJvcl9vdXRfcmVzZXQ7CisKKwkvKiBmaXh1cCBvdXIgbG9jYWwgbmFtZSAqLworCXRwLT5uYW1lID0gZGV2LT5uYW1lOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgYXQgJXMgMHglbHgsICIsCisJICAgICAgIGRldi0+bmFtZSwgdHlwaG9vbl9jYXJkX2luZm9bY2FyZF9pZF0ubmFtZSwKKwkgICAgICAgdXNlX21taW8gPyAiTU1JTyIgOiAiSU8iLCBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgdXNlX21taW8pKTsKKwlmb3IoaSA9IDA7IGkgPCA1OyBpKyspCisJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIlMi4yeFxuIiwgZGV2LT5kZXZfYWRkcltpXSk7CisKKwkvKiB4cF9yZXNwIHN0aWxsIGNvbnRhaW5zIHRoZSByZXNwb25zZSB0byB0aGUgUkVBRF9WRVJTSU9OUyBjb21tYW5kLgorCSAqIEZvciBkZWJ1Z2dpbmcsIGxldCB0aGUgdXNlciBrbm93IHdoYXQgdmVyc2lvbiBoZSBoYXMuCisJICovCisJaWYoeHBfcmVzcFswXS5udW1EZXNjID09IDApIHsKKwkJLyogVGhpcyBpcyB0aGUgVHlwaG9vbiAxLjAgdHlwZSBTbGVlcCBJbWFnZSwgbGFzdCAxNiBiaXRzCisJCSAqIG9mIHZlcnNpb24gaXMgTW9udGgvRGF5IG9mIGJ1aWxkLgorCQkgKi8KKwkJdTE2IG1vbnRoZGF5ID0gbGUzMl90b19jcHUoeHBfcmVzcFswXS5wYXJtMikgJiAweGZmZmY7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUeXBob29uIDEuMCBTbGVlcCBJbWFnZSBidWlsdCAiCisJCQkiJTAydS8lMDJ1LzIwMDBcbiIsIGRldi0+bmFtZSwgbW9udGhkYXkgPj4gOCwKKwkJCW1vbnRoZGF5ICYgMHhmZik7CisJfSBlbHNlIGlmKHhwX3Jlc3BbMF0ubnVtRGVzYyA9PSAyKSB7CisJCS8qIFRoaXMgaXMgdGhlIFR5cGhvb24gMS4xKyB0eXBlIFNsZWVwIEltYWdlCisJCSAqLworCQl1MzIgc2xlZXBfdmVyID0gbGUzMl90b19jcHUoeHBfcmVzcFswXS5wYXJtMik7CisJCXU4ICp2ZXJfc3RyaW5nID0gKHU4ICopICZ4cF9yZXNwWzFdOworCQl2ZXJfc3RyaW5nWzI1XSA9IDA7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUeXBob29uIDEuMSsgU2xlZXAgSW1hZ2UgdmVyc2lvbiAiCisJCQkiJTAyeC4lMDN4LiUwM3ggJXNcbiIsIGRldi0+bmFtZSwgc2xlZXBfdmVyID4+IDI0LAorCQkJKHNsZWVwX3ZlciA+PiAxMikgJiAweGZmZiwgc2xlZXBfdmVyICYgMHhmZmYsCisJCQl2ZXJfc3RyaW5nKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5rbm93biBTbGVlcCBJbWFnZSB2ZXJzaW9uICIKKwkJCSIoJXU6JTA0eClcbiIsIGRldi0+bmFtZSwgeHBfcmVzcFswXS5udW1EZXNjLAorCQkJbGUzMl90b19jcHUoeHBfcmVzcFswXS5wYXJtMikpOworCX0KKwkJCisJcmV0dXJuIDA7CisKK2Vycm9yX291dF9yZXNldDoKKwl0eXBob29uX3Jlc2V0KGlvYWRkciwgTm9XYWl0KTsKKworZXJyb3Jfb3V0X2RtYToKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZihzdHJ1Y3QgdHlwaG9vbl9zaGFyZWQpLAorCQkJICAgIHNoYXJlZCwgc2hhcmVkX2RtYSk7CitlcnJvcl9vdXRfcmVtYXA6CisJcGNpX2lvdW5tYXAocGRldiwgaW9hZGRyKTsKK2Vycm9yX291dF9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJvcl9vdXRfbXdpOgorCXBjaV9jbGVhcl9td2kocGRldik7CitlcnJvcl9vdXRfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJvcl9vdXRfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CitlcnJvcl9vdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0Cit0eXBob29uX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJdHlwaG9vbl9yZXNldCh0cC0+aW9hZGRyLCBOb1dhaXQpOworCXBjaV9pb3VubWFwKHBkZXYsIHRwLT5pb2FkZHIpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCB0eXBob29uX3NoYXJlZCksCisJCQkgICAgdHAtPnNoYXJlZCwgdHAtPnNoYXJlZF9kbWEpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2NsZWFyX213aShwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB0eXBob29uX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTU9EVUxFX05BTUUsCisJLmlkX3RhYmxlCT0gdHlwaG9vbl9wY2lfdGJsLAorCS5wcm9iZQkJPSB0eXBob29uX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodHlwaG9vbl9yZW1vdmVfb25lKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHR5cGhvb25fc3VzcGVuZCwKKwkucmVzdW1lCQk9IHR5cGhvb25fcmVzdW1lLAorCS5lbmFibGVfd2FrZQk9IHR5cGhvb25fZW5hYmxlX3dha2UsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0Cit0eXBob29uX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ0eXBob29uX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAordHlwaG9vbl9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0eXBob29uX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHR5cGhvb25faW5pdCk7Cittb2R1bGVfZXhpdCh0eXBob29uX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHlwaG9vbi5oIGIvZHJpdmVycy9uZXQvdHlwaG9vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOGVlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90eXBob29uLmgKQEAgLTAsMCArMSw2MTkgQEAKKy8qIHR5cGhvb24uaDoJY2hpcCBpbmZvIGZvciB0aGUgM0NvbSAzQ1I5OTAgZmFtaWx5IG9mIGNvbnRyb2xsZXJzICovCisvKgorCVdyaXR0ZW4gMjAwMi0yMDAzIGJ5IERhdmlkIERpbGxvdyA8ZGF2ZUB0aGVkaWxsb3dzLm9yZz4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKwl0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCURyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKwlyZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90CisJYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKwlzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KKworCVRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIG9uIGEgcHVibGljIHdlYiBzaXRlLiBJdCBtYXkgZW5hYmxlCisJY3J5cHRvZ3JhcGhpYyBjYXBhYmlsaXRpZXMgb2YgdGhlIDNDb20gaGFyZHdhcmUsIGFuZCBtYXkgYmUKKwlleHBvcnRlZCBmcm9tIHRoZSBVbml0ZWQgU3RhdGVzIHVuZGVyIExpY2Vuc2UgRXhjZXB0aW9uICJUU1UiCisJcHVyc3VhbnQgdG8gMTUgQy5GLlIuIFNlY3Rpb24gNzQwLjEzKGUpLgorCisJVGhpcyB3b3JrIHdhcyBmdW5kZWQgYnkgdGhlIE5hdGlvbmFsIExpYnJhcnkgb2YgTWVkaWNpbmUgdW5kZXIKKwl0aGUgRGVwYXJ0bWVudCBvZiBFbmVyZ3kgcHJvamVjdCBudW1iZXIgMDI3NEREMDZEMSBhbmQgTkxNIHByb2plY3QKKwludW1iZXIgWTEtTE0tMjAxNS0wMS4KKyovCisKKy8qIEFsbCBUeXBob29uIHJpbmcgcG9zaXRpb25zIGFyZSBzcGVjaWZpY2VkIGluIGJ5dGVzLCBhbmQgcG9pbnQgdG8gdGhlCisgKiBmaXJzdCAiY2xlYW4iIGVudHJ5IGluIHRoZSByaW5nIC0tIGllIHRoZSBuZXh0IGVudHJ5IHdlIHVzZSBmb3Igd2hhdGV2ZXIKKyAqIHB1cnBvc2UuCisgKi8KKworLyogVGhlIFR5cGhvb24gYmFzaWMgcmluZworICogcmluZ0Jhc2U6ICB3aGVyZSB0aGlzIHJpbmcgbGl2ZXMgKG91ciB2aXJ0dWFsIGFkZHJlc3MpCisgKiBsYXN0V3JpdGU6IHRoZSBuZXh0IGVudHJ5IHdlJ2xsIHVzZQorICovCitzdHJ1Y3QgYmFzaWNfcmluZyB7CisJdTggKnJpbmdCYXNlOworCXUzMiBsYXN0V3JpdGU7Cit9OworCisvKiBUaGUgVHlwb29uIHRyYW5zbWl0IHJpbmcgLS0gc2FtZSBhcyBhIGJhc2ljIHJpbmcsIHBsdXM6CisgKiBsYXN0UmVhZDogICAgICB3aGVyZSB3ZSdyZSBhdCBpbiByZWdhcmQgdG8gY2xlYW5pbmcgdXAgdGhlIHJpbmcKKyAqIHdyaXRlUmVnaXN0ZXI6IHJlZ2lzdGVyIHRvIHVzZSBmb3Igd3JpdGluZyAoZGlmZmVyZW50IGZvciBIaSAmIExvIHJpbmdzKQorICovCitzdHJ1Y3QgdHJhbnNtaXRfcmluZyB7CisJdTggKnJpbmdCYXNlOworCXUzMiBsYXN0V3JpdGU7CisJdTMyIGxhc3RSZWFkOworCWludCB3cml0ZVJlZ2lzdGVyOworfTsKKworLyogVGhlIGhvc3Q8LT5UeXBob29uIHJpbmcgaW5kZXggc3RydWN0dXJlCisgKiBUaGlzIGluZGljYXRlcyB0aGUgY3VycmVudCBwb3NpdGlvbnMgaW4gdGhlIHJpbmdzCisgKiAKKyAqIEFsbCB2YWx1ZXMgbXVzdCBiZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCBmb3IgdGhlIDNYUAorICoKKyAqIHJ4SGlDbGVhcmVkOiAgIGVudHJ5IHdlJ3ZlIGNsZWFyZWQgdG8gaW4gdGhlIEhpIHJlY2VpdmUgcmluZworICogcnhMb0NsZWFyZWQ6ICAgZW50cnkgd2UndmUgY2xlYXJlZCB0byBpbiB0aGUgTG8gcmVjZWl2ZSByaW5nCisgKiByeEJ1ZmZSZWFkeTogICBuZXh0IGVudHJ5IHdlJ2xsIHB1dCBhIGZyZWUgYnVmZmVyIGluCisgKiByZXNwQ2xlYXJlZDogICBlbnRyeSB3ZSd2ZSBjbGVhcmVkIHRvIGluIHRoZSByZXNwb25zZSByaW5nCisgKgorICogdHhMb0NsZWFyZWQ6ICAgZW50cnkgdGhlIE5JQyBoYXMgY2xlYXJlZCB0byBpbiB0aGUgTG8gdHJhbnNtaXQgcmluZworICogdHhIaUNsZWFyZWQ6ICAgZW50cnkgdGhlIE5JQyBoYXMgY2xlYXJlZCB0byBpbiB0aGUgSGkgdHJhbnNtaXQgcmluZworICogcnhMb1JlYWR5OiAgICAgZW50cnkgdGhlIE5JQyBoYXMgZmlsbGVkIHRvIGluIHRoZSBMbyByZWNlaXZlIHJpbmcKKyAqIHJ4QnVmZkNsZWFyZWQ6IGVudHJ5IHRoZSBOSUMgaGFzIGNsZWFyZWQgaW4gdGhlIGZyZWUgYnVmZmVyIHJpbmcKKyAqIGNtZENsZWFyZWQ6ICAgIGVudHJ5IHRoZSBOSUMgaGFzIGNsZWFyZWQgaW4gdGhlIGNvbW1hbmQgcmluZworICogcmVzcFJlYWR5OiAgICAgZW50cnkgdGhlIE5JQyBoYXMgZmlsbGVkIHRvIGluIHRoZSByZXNwb25zZSByaW5nCisgKiByeEhpUmVhZHk6ICAgICBlbnRyeSB0aGUgTklDIGhhcyBmaWxsZWQgdG8gaW4gdGhlIEhpIHJlY2VpdmUgcmluZworICovCitzdHJ1Y3QgdHlwaG9vbl9pbmRleGVzIHsKKwkvKiBUaGUgZmlyc3QgZm91ciBhcmUgd3JpdHRlbiBieSB0aGUgaG9zdCwgYW5kIHJlYWQgYnkgdGhlIE5JQyAqLworCXZvbGF0aWxlIHUzMiByeEhpQ2xlYXJlZDsKKwl2b2xhdGlsZSB1MzIgcnhMb0NsZWFyZWQ7CisJdm9sYXRpbGUgdTMyIHJ4QnVmZlJlYWR5OworCXZvbGF0aWxlIHUzMiByZXNwQ2xlYXJlZDsKKworCS8qIFRoZSByZW1haW5pbmcgYXJlIHdyaXR0ZW4gYnkgdGhlIE5JQywgYW5kIHJlYWQgYnkgdGhlIGhvc3QgKi8KKwl2b2xhdGlsZSB1MzIgdHhMb0NsZWFyZWQ7CisJdm9sYXRpbGUgdTMyIHR4SGlDbGVhcmVkOworCXZvbGF0aWxlIHUzMiByeExvUmVhZHk7CisJdm9sYXRpbGUgdTMyIHJ4QnVmZkNsZWFyZWQ7CisJdm9sYXRpbGUgdTMyIGNtZENsZWFyZWQ7CisJdm9sYXRpbGUgdTMyIHJlc3BSZWFkeTsKKwl2b2xhdGlsZSB1MzIgcnhIaVJlYWR5OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFRoZSBob3N0PC0+VHlwaG9vbiBpbnRlcmZhY2UKKyAqIE91ciBtZWFucyBvZiBjb21tdW5pY2F0aW5nIHdoZXJlIHRoaW5ncyBhcmUKKyAqCisgKiBBbGwgdmFsdWVzIG11c3QgYmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgZm9yIHRoZSAzWFAKKyAqCisgKiByaW5nSW5kZXg6ICAgNjQgYml0IGJ1cyBhZGRyZXNzIG9mIHRoZSBpbmRleCBzdHJ1Y3R1cmUKKyAqIHR4TG9BZGRyOiAgICA2NCBiaXQgYnVzIGFkZHJlc3Mgb2YgdGhlIExvIHRyYW5zbWl0IHJpbmcKKyAqIHR4TG9TaXplOiAgICBzaXplIChpbiBieXRlcykgb2YgdGhlIExvIHRyYW5zbWl0IHJpbmcKKyAqIHR4SGkqOiAgICAgICBhcyBhYm92ZSBmb3IgdGhlIEhpIHByaW9yaXR5IHRyYW5zbWl0IHJpbmcKKyAqIHJ4TG8qOiAgICAgICBhcyBhYm92ZSBmb3IgdGhlIExvIHByaW9yaXR5IHJlY2VpdmUgcmluZworICogcnhCdWZmKjogICAgIGFzIGFib3ZlIGZvciB0aGUgZnJlZSBidWZmZXIgcmluZworICogY21kKjogICAgICAgIGFzIGFib3ZlIGZvciB0aGUgY29tbWFuZCByaW5nCisgKiByZXNwKjogICAgICAgYXMgYWJvdmUgZm9yIHRoZSByZXNwb25zZSByaW5nCisgKiB6ZXJvQWRkcjogICAgNjQgYml0IGJ1cyBhZGRyZXNzIG9mIGEgemVybyB3b3JkIChmb3IgRE1BKQorICogcnhIaSo6ICAgICAgIGFzIGFib3ZlIGZvciB0aGUgSGkgUHJpb3JpdHkgcmVjZWl2ZSByaW5nCisgKgorICogV2hpbGUgdGhlcmUgaXMgcm9vbSBmb3IgNjQgYml0IGFkZHJlc3NlcywgY3VycmVudCB2ZXJzaW9ucyBvZiB0aGUgM1hQCisgKiBvbmx5IGRvIDMyIGJpdCBhZGRyZXNzZXMsIHNvIHRoZSAqSGkgZm9yIGVhY2ggb2YgdGhlIGFib3ZlIHdpbGwgYWx3YXlzCisgKiBiZSB6ZXJvLgorICovCitzdHJ1Y3QgdHlwaG9vbl9pbnRlcmZhY2UgeworCXUzMiByaW5nSW5kZXg7CisJdTMyIHJpbmdJbmRleEhpOworCXUzMiB0eExvQWRkcjsKKwl1MzIgdHhMb0FkZHJIaTsKKwl1MzIgdHhMb1NpemU7CisJdTMyIHR4SGlBZGRyOworCXUzMiB0eEhpQWRkckhpOworCXUzMiB0eEhpU2l6ZTsKKwl1MzIgcnhMb0FkZHI7CisJdTMyIHJ4TG9BZGRySGk7CisJdTMyIHJ4TG9TaXplOworCXUzMiByeEJ1ZmZBZGRyOworCXUzMiByeEJ1ZmZBZGRySGk7CisJdTMyIHJ4QnVmZlNpemU7CisJdTMyIGNtZEFkZHI7CisJdTMyIGNtZEFkZHJIaTsKKwl1MzIgY21kU2l6ZTsKKwl1MzIgcmVzcEFkZHI7CisJdTMyIHJlc3BBZGRySGk7CisJdTMyIHJlc3BTaXplOworCXUzMiB6ZXJvQWRkcjsKKwl1MzIgemVyb0FkZHJIaTsKKwl1MzIgcnhIaUFkZHI7CisJdTMyIHJ4SGlBZGRySGk7CisJdTMyIHJ4SGlTaXplOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFRoZSBUeXBob29uIHRyYW5zbWl0L2ZyYWdtZW50IGRlc2NyaXB0b3IKKyAqCisgKiBBIHBhY2tldCBpcyBkZXNjcmliZWQgYnkgYSBwYWNrZXQgZGVzY3JpcHRvciwgZm9sbG93ZWQgYnkgb3B0aW9uIGRlc2NyaXB0b3JzLAorICogaWYgYW55LCB0aGVuIG9uZSBvciBtb3JlIGZyYWdtZW50IGRlc2NyaXB0b3JzLgorICogCisgKiBQYWNrZXQgZGVzY3JpcHRvcjoKKyAqIGZsYWdzOglEZXNjcmlwdG9yIHR5cGUKKyAqIGxlbjppCXplcm8sIG9yIGxlbmd0aCBvZiB0aGlzIHBhY2tldAorICogYWRkcio6CTggYnl0ZXMgb2Ygb3BhcXVlIGRhdGEgdG8gdGhlIGZpcm13YXJlIC0tIGZvciBza2IgcG9pbnRlcgorICogcHJvY2Vzc0ZsYWdzOiBEZXRlcm1pbmUgb2ZmbG9hZCB0YXNrcyB0byBwZXJmb3JtIG9uIHRoaXMgcGFja2V0LgorICoKKyAqIEZyYWdtZW50IGRlc2NyaXB0b3I6CisgKiBmbGFnczoJRGVzY3JpcHRvciB0eXBlCisgKiBsZW46aQlsZW5ndGggb2YgdGhpcyBmcmFnbWVudAorICogYWRkcjoJbG93IGJ5dGVzIG9mIERNQSBhZGRyZXNzIGZvciB0aGlzIHBhcnQgb2YgdGhlIHBhY2tldAorICogYWRkckhpOgloaSBieXRlcyBvZiBETUEgYWRkcmVzcyBmb3IgdGhpcyBwYXJ0IG9mIHRoZSBwYWNrZXQKKyAqIHByb2Nlc3NGbGFnczogbXVzdCBiZSB6ZXJvCisgKgorICogVFlQSE9PTl9ERVNDX1ZBTElEIGlzIG5vdCBtZW50aW9uZWQgaW4gdGhlaXIgZG9jcywgYnV0IHRoZWlyIExpbnV4CisgKiBkcml2ZXIgdXNlcyBpdC4KKyAqLworc3RydWN0IHR4X2Rlc2MgeworCXU4ICBmbGFnczsKKyNkZWZpbmUgVFlQSE9PTl9UWVBFX01BU0sJMHgwNworI2RlZmluZSAJVFlQSE9PTl9GUkFHX0RFU0MJMHgwMAorI2RlZmluZSAJVFlQSE9PTl9UWF9ERVNDCQkweDAxCisjZGVmaW5lIAlUWVBIT09OX0NNRF9ERVNDCTB4MDIKKyNkZWZpbmUgCVRZUEhPT05fT1BUX0RFU0MJMHgwMworI2RlZmluZSAJVFlQSE9PTl9SWF9ERVNDCQkweDA0CisjZGVmaW5lIAlUWVBIT09OX1JFU1BfREVTQwkweDA1CisjZGVmaW5lIFRZUEhPT05fT1BUX1RZUEVfTUFTSwkweGYwCisjZGVmaW5lIAlUWVBIT09OX09QVF9JUFNFQwkweDAwCisjZGVmaW5lIAlUWVBIT09OX09QVF9UQ1BfU0VHCTB4MTAKKyNkZWZpbmUgVFlQSE9PTl9DTURfUkVTUE9ORAkweDQwCisjZGVmaW5lIFRZUEhPT05fUkVTUF9FUlJPUgkweDQwCisjZGVmaW5lIFRZUEhPT05fUlhfRVJST1IJMHg0MAorI2RlZmluZSBUWVBIT09OX0RFU0NfVkFMSUQJMHg4MAorCXU4ICBudW1EZXNjOworCXUxNiBsZW47CisJdTMyIGFkZHI7CisJdTMyIGFkZHJIaTsKKwl1MzIgcHJvY2Vzc0ZsYWdzOworI2RlZmluZSBUWVBIT09OX1RYX1BGX05PX0NSQwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKQorI2RlZmluZSBUWVBIT09OX1RYX1BGX0lQX0NIS1NVTQkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAyKQorI2RlZmluZSBUWVBIT09OX1RYX1BGX1RDUF9DSEtTVU0JX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDA0KQorI2RlZmluZSBUWVBIT09OX1RYX1BGX1RDUF9TRUdNRU5UCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwOCkKKyNkZWZpbmUgVFlQSE9PTl9UWF9QRl9JTlNFUlRfVkxBTglfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMTApCisjZGVmaW5lIFRZUEhPT05fVFhfUEZfSVBTRUMJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAyMCkKKyNkZWZpbmUgVFlQSE9PTl9UWF9QRl9WTEFOX1BSSU9SSVRZCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDA0MCkKKyNkZWZpbmUgVFlQSE9PTl9UWF9QRl9VRFBfQ0hLU1VNCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDA4MCkKKyNkZWZpbmUgVFlQSE9PTl9UWF9QRl9QQURfRlJBTUUJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDEwMCkKKyNkZWZpbmUgVFlQSE9PTl9UWF9QRl9SRVNFUlZFRAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwZTAwKQorI2RlZmluZSBUWVBIT09OX1RYX1BGX1ZMQU5fTUFTSwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDBmZmZmMDAwKQorI2RlZmluZSBUWVBIT09OX1RYX1BGX0lOVEVSTkFMCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4ZjAwMDAwMDApCisjZGVmaW5lIFRZUEhPT05fVFhfUEZfVkxBTl9UQUdfU0hJRlQJMTIKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUaGUgVENQIFNlZ21lbnRhdGlvbiBvZmZsb2FkIG9wdGlvbiBkZXNjcmlwdG9yCisgKgorICogZmxhZ3M6CWRlc2NyaXB0b3IgdHlwZQorICogbnVtRGVzYzoJbXVzdCBiZSAxCisgKiBtc3NfZmxhZ3M6CWJpdHMgMC0xMSAobGl0dGxlIGVuZGlhbikgYXJlIE1TUywgMTIgaXMgZmlyc3QgVFNPIGRlc2NyaXB0b3IKKyAqCQkJMTMgaXMgbGlzdCBUU08gZGVzY3JpcHRvciwgc2V0IGJvdGggaWYgb25seSBvbmUgVFNPCisgKiByZXNwQWRkckxvOglsb3cgYnl0ZXMgb2YgYWRkcmVzcyBvZiB0aGUgYnl0ZXNUeCBmaWVsZCBvZiB0aGlzIGRlc2NyaXB0b3IKKyAqIGJ5dGVzVHg6CXRvdGFsIG51bWJlciBvZiBieXRlcyBpbiB0aGlzIFRTTyByZXF1ZXN0CisgKiBzdGF0dXM6CTAgb24gY29tcGxldGlvbgorICovCitzdHJ1Y3QgdGNwb3B0X2Rlc2MgeworCXU4ICBmbGFnczsKKwl1OCAgbnVtRGVzYzsKKwl1MTYgbXNzX2ZsYWdzOworI2RlZmluZSBUWVBIT09OX1RTT19GSVJTVAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDEwMDApCisjZGVmaW5lIFRZUEhPT05fVFNPX0xBU1QJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgyMDAwKQorCXUzMiByZXNwQWRkckxvOworCXUzMiBieXRlc1R4OworCXUzMiBzdGF0dXM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGhlIElQU0VDIE9mZmxvYWQgZGVzY3JpcHRvcgorICoKKyAqIGZsYWdzOglkZXNjcmlwdG9yIHR5cGUKKyAqIG51bURlc2M6CW11c3QgYmUgMQorICogaXBzZWNGbGFnczoJYml0IDA6IDAgLS0gZ2VuZXJhdGUgSVYsIDEgLS0gdXNlIHN1cHBsaWVkIElWCisgKiBzYTEsIHNhMjoJU2VjdXJpdHkgQXNzb2NpYXRpb24gSURzIGZvciB0aGlzIHBhY2tldAorICogcmVzZXJ2ZWQ6CXNldCB0byAwCisgKi8KK3N0cnVjdCBpcHNlY19kZXNjIHsKKwl1OCAgZmxhZ3M7CisJdTggIG51bURlc2M7CisJdTE2IGlwc2VjRmxhZ3M7CisjZGVmaW5lIFRZUEhPT05fSVBTRUNfR0VOX0lWCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAwKQorI2RlZmluZSBUWVBIT09OX0lQU0VDX1VTRV9JVglfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMSkKKwl1MzIgc2ExOworCXUzMiBzYTI7CisJdTMyIHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFRoZSBUeXBob29uIHJlY2VpdmUgZGVzY3JpcHRvciAoVXBkYXRlZCBieSBOSUMpCisgKgorICogZmxhZ3M6ICAgICAgICAgRGVzY3JpcHRvciB0eXBlLCBlcnJvciBpbmRpY2F0aW9uCisgKiBudW1EZXNjOiAgICAgICBBbHdheXMgemVybworICogZnJhbWVMZW46ICAgICAgdGhlIHNpemUgb2YgdGhlIHBhY2tldCByZWNlaXZlZAorICogYWRkcjogICAgICAgICAgbG93IDMyIGJ5dGVzIG9mIHRoZSB2aXJ0dWFsIGFkZHIgcGFzc2VkIGluIGZvciB0aGlzIGJ1ZmZlcgorICogYWRkckhpOiAgICAgICAgaGlnaCAzMiBieXRlcyBvZiB0aGUgdmlydHVhbCBhZGRyIHBhc3NlZCBpbiBmb3IgdGhpcyBidWZmZXIKKyAqIHJ4U3RhdHVzOiAgICAgIEVycm9yIGlmIHNldCBpbiBmbGFncywgb3RoZXJ3aXNlIHJlc3VsdCBvZiBvZmZsb2FkIHByb2Nlc3NpbmcKKyAqIGZpbHRlclJlc3VsdHM6IHJlc3VsdHMgb2YgZmlsdGVyaW5nIG9uIHBhY2tldCwgbm90IHVzZWQKKyAqIGlwc2VjUmVzdWx0czogIFJlc3VsdHMgb2YgSVBTRUMgcHJvY2Vzc2luZworICogdmxhblRhZzogICAgICAgdGhlIDgwMS4ycSBUQ0kgZnJvbSB0aGUgcGFja2V0CisgKi8KK3N0cnVjdCByeF9kZXNjIHsKKwl1OCAgZmxhZ3M7CisJdTggIG51bURlc2M7CisJdTE2IGZyYW1lTGVuOworCXUzMiBhZGRyOworCXUzMiBhZGRySGk7CisJdTMyIHJ4U3RhdHVzOworI2RlZmluZSBUWVBIT09OX1JYX0VSUl9JTlRFUk5BTAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAwKQorI2RlZmluZSBUWVBIT09OX1JYX0VSUl9GSUZPX1VOREVSUlVOCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMSkKKyNkZWZpbmUgVFlQSE9PTl9SWF9FUlJfQkFEX1NTRAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAyKQorI2RlZmluZSBUWVBIT09OX1JYX0VSUl9SVU5UCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDMpCisjZGVmaW5lIFRZUEhPT05fUlhfRVJSX0NSQwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDA0KQorI2RlZmluZSBUWVBIT09OX1JYX0VSUl9PVkVSU0laRQkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDA1KQorI2RlZmluZSBUWVBIT09OX1JYX0VSUl9BTElHTgkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDA2KQorI2RlZmluZSBUWVBIT09OX1JYX0VSUl9EUklCQkxFCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDcpCisjZGVmaW5lIFRZUEhPT05fUlhfUFJPVE9fTUFTSwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAzKQorI2RlZmluZSBUWVBIT09OX1JYX1BST1RPX1VOS05PV04JX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAwKQorI2RlZmluZSBUWVBIT09OX1JYX1BST1RPX0lQCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDEpCisjZGVmaW5lIFRZUEhPT05fUlhfUFJPVE9fSVBYCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpCisjZGVmaW5lIFRZUEhPT05fUlhfVkxBTgkJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwNCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9JUF9GUkFHCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDgpCisjZGVmaW5lIFRZUEhPT05fUlhfSVBTRUMJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAxMCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9JUF9DSEtfRkFJTAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDIwKQorI2RlZmluZSBUWVBIT09OX1JYX1RDUF9DSEtfRkFJTAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDQwKQorI2RlZmluZSBUWVBIT09OX1JYX1VEUF9DSEtfRkFJTAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDgwKQorI2RlZmluZSBUWVBIT09OX1JYX0lQX0NIS19HT09ECQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAxMDApCisjZGVmaW5lIFRZUEhPT05fUlhfVENQX0NIS19HT09ECQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAyMDApCisjZGVmaW5lIFRZUEhPT05fUlhfVURQX0NIS19HT09ECQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDA0MDApCisJdTE2IGZpbHRlclJlc3VsdHM7CisjZGVmaW5lIFRZUEhPT05fUlhfRklMVEVSX01BU0sJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHg3ZmZmKQorI2RlZmluZSBUWVBIT09OX1JYX0ZJTFRFUkVECQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4ODAwMCkKKwl1MTYgaXBzZWNSZXN1bHRzOworI2RlZmluZSBUWVBIT09OX1JYX09VVEVSX0FIX0dPT0QJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDEpCisjZGVmaW5lIFRZUEhPT05fUlhfT1VURVJfRVNQX0dPT0QJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDIpCisjZGVmaW5lIFRZUEhPT05fUlhfSU5ORVJfQUhfR09PRAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwNCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9JTk5FUl9FU1BfR09PRAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwOCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9PVVRFUl9BSF9GQUlMCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDEwKQorI2RlZmluZSBUWVBIT09OX1JYX09VVEVSX0VTUF9GQUlMCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDIwKQorI2RlZmluZSBUWVBIT09OX1JYX0lOTkVSX0FIX0ZBSUwJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwNDApCisjZGVmaW5lIFRZUEhPT05fUlhfSU5ORVJfRVNQX0ZBSUwJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwODApCisjZGVmaW5lIFRZUEhPT05fUlhfVU5LTk9XTl9TQQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAxMDApCisjZGVmaW5lIFRZUEhPT05fUlhfRVNQX0ZPUk1BVF9FUlIJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAyMDApCisJdTMyIHZsYW5UYWc7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGhlIFR5cGhvb24gZnJlZSBidWZmZXIgZGVzY3JpcHRvciwgdXNlZCB0byBnaXZlIGEgYnVmZmVyIHRvIHRoZSBOSUMKKyAqCisgKiBwaHlzQWRkcjogICAgbG93IDMyIGJpdHMgb2YgdGhlIGJ1cyBhZGRyZXNzIG9mIHRoZSBidWZmZXIKKyAqIHBoeXNBZGRySGk6ICBoaWdoIDMyIGJpdHMgb2YgdGhlIGJ1cyBhZGRyZXNzIG9mIHRoZSBidWZmZXIsIGFsd2F5cyB6ZXJvCisgKiB2aXJ0QWRkcjogICAgbG93IDMyIGJpdHMgb2YgdGhlIHNrYiBhZGRyZXNzCisgKiB2aXJ0QWRkckhpOiAgaGlnaCAzMiBiaXRzIG9mIHRoZSBza2IgYWRkcmVzcywgYWx3YXlzIHplcm8KKyAqCisgKiB0aGUgdmlydCogYWRkcmVzcyBpcyBiYXNpY2FsbHkgdHdvIDMyIGJpdCBjb29raWVzLCBqdXN0IHBhc3NlZCBiYWNrCisgKiBmcm9tIHRoZSBOSUMKKyAqLworc3RydWN0IHJ4X2ZyZWUgeworCXUzMiBwaHlzQWRkcjsKKwl1MzIgcGh5c0FkZHJIaTsKKwl1MzIgdmlydEFkZHI7CisJdTMyIHZpcnRBZGRySGk7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGhlIFR5cGhvb24gY29tbWFuZCBkZXNjcmlwdG9yLCB1c2VkIGZvciBjb21tYW5kcyBhbmQgcmVzcG9uc2VzCisgKgorICogZmxhZ3M6ICAgZGVzY3JpcHRvciB0eXBlCisgKiBudW1EZXNjOiBudW1iZXIgb2YgZGVzY3JpcHRvcnMgZm9sbG93aW5nIGluIHRoaXMgY29tbWFuZC9yZXNwb25zZSwKKyAqCQkJCWllLCB6ZXJvIGZvciBhIG9uZSBkZXNjcmlwdG9yIGNvbW1hbmQKKyAqIGNtZDogICAgIHRoZSBjb21tYW5kCisgKiBzZXFObzogICBzZXF1ZW5jZSBudW1iZXIgKHVudXNlZCkKKyAqIHBhcm0xOiAgIHVzZSB2YXJpZXMgYnkgY29tbWFuZAorICogcGFybTI6ICAgdXNlIHZhcmllcyBieSBjb21tYW5kCisgKiBwYXJtMzogICB1c2UgdmFyaWVzIGJ5IGNvbW1hbmQKKyAqLworc3RydWN0IGNtZF9kZXNjIHsKKwl1OCAgZmxhZ3M7CisJdTggIG51bURlc2M7CisJdTE2IGNtZDsKKyNkZWZpbmUgVFlQSE9PTl9DTURfVFhfRU5BQkxFCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMSkKKyNkZWZpbmUgVFlQSE9PTl9DTURfVFhfRElTQUJMRQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDIpCisjZGVmaW5lIFRZUEhPT05fQ01EX1JYX0VOQUJMRQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDMpCisjZGVmaW5lIFRZUEhPT05fQ01EX1JYX0RJU0FCTEUJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDA0KQorI2RlZmluZSBUWVBIT09OX0NNRF9TRVRfUlhfRklMVEVSCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDA1KQorI2RlZmluZSBUWVBIT09OX0NNRF9SRUFEX1NUQVRTCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwNykKKyNkZWZpbmUgVFlQSE9PTl9DTURfWENWUl9TRUxFQ1QJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDEzKQorI2RlZmluZSBUWVBIT09OX0NNRF9TRVRfTUFYX1BLVF9TSVpFCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDFhKQorI2RlZmluZSBUWVBIT09OX0NNRF9SRUFEX01FRElBX1NUQVRVUwlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAxYikKKyNkZWZpbmUgVFlQSE9PTl9DTURfR09UT19TTEVFUAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMjMpCisjZGVmaW5lIFRZUEhPT05fQ01EX1NFVF9NVUxUSUNBU1RfSEFTSAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAyNSkKKyNkZWZpbmUgVFlQSE9PTl9DTURfU0VUX01BQ19BRERSRVNTCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDI2KQorI2RlZmluZSBUWVBIT09OX0NNRF9SRUFEX01BQ19BRERSRVNTCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDI3KQorI2RlZmluZSBUWVBIT09OX0NNRF9WTEFOX1RZUEVfV1JJVEUJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMmIpCisjZGVmaW5lIFRZUEhPT05fQ01EX0NSRUFURV9TQQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMzQpCisjZGVmaW5lIFRZUEhPT05fQ01EX0RFTEVURV9TQQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMzUpCisjZGVmaW5lIFRZUEhPT05fQ01EX1JFQURfVkVSU0lPTlMJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwNDMpCisjZGVmaW5lIFRZUEhPT05fQ01EX0lSUV9DT0FMRVNDRV9DVFJMCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDQ1KQorI2RlZmluZSBUWVBIT09OX0NNRF9FTkFCTEVfV0FLRV9FVkVOVFMJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwNDkpCisjZGVmaW5lIFRZUEhPT05fQ01EX1NFVF9PRkZMT0FEX1RBU0tTCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDRmKQorI2RlZmluZSBUWVBIT09OX0NNRF9IRUxMT19SRVNQCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDA1NykKKyNkZWZpbmUgVFlQSE9PTl9DTURfSEFMVAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwNWQpCisjZGVmaW5lIFRZUEhPT05fQ01EX1JFQURfSVBTRUNfSU5GTwlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDA1ZSkKKyNkZWZpbmUgVFlQSE9PTl9DTURfR0VUX0lQU0VDX0VOQUJMRQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDA2NykKKyNkZWZpbmUgVFlQSE9PTl9DTURfR0VUX0NNRF9MVkwJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDY5KQorCXUxNiBzZXFObzsKKwl1MTYgcGFybTE7CisJdTMyIHBhcm0yOworCXUzMiBwYXJtMzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUaGUgVHlwaG9vbiByZXNwb25zZSBkZXNjcmlwdG9yLCBzZWUgY29tbWFuZCBkZXNjcmlwdG9yIGZvciBkZXRhaWxzCisgKi8KK3N0cnVjdCByZXNwX2Rlc2MgeworCXU4ICBmbGFnczsKKwl1OCAgbnVtRGVzYzsKKwl1MTYgY21kOworCXUxNiBzZXFObzsKKwl1MTYgcGFybTE7CisJdTMyIHBhcm0yOworCXUzMiBwYXJtMzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIElOSVRfQ09NTUFORF9OT19SRVNQT05TRSh4LCBjb21tYW5kKQkJCQlcCisJZG8geyBzdHJ1Y3QgY21kX2Rlc2MgKl9wdHIgPSAoeCk7CQkJCVwKKwkJbWVtc2V0KF9wdHIsIDAsIHNpemVvZihzdHJ1Y3QgY21kX2Rlc2MpKTsJCVwKKwkJX3B0ci0+ZmxhZ3MgPSBUWVBIT09OX0NNRF9ERVNDIHwgVFlQSE9PTl9ERVNDX1ZBTElEOwlcCisJCV9wdHItPmNtZCA9IGNvbW1hbmQ7CQkJCQlcCisJfSB3aGlsZSgwKQorCisvKiBXZSBzZXQgc2VxTm8gdG8gMSBpZiB3ZSdyZSBleHBlY3RpbmcgYSByZXNwb25zZSBmcm9tIHRoaXMgY29tbWFuZCAqLworI2RlZmluZSBJTklUX0NPTU1BTkRfV0lUSF9SRVNQT05TRSh4LCBjb21tYW5kKQkJCQlcCisJZG8geyBzdHJ1Y3QgY21kX2Rlc2MgKl9wdHIgPSAoeCk7CQkJCVwKKwkJbWVtc2V0KF9wdHIsIDAsIHNpemVvZihzdHJ1Y3QgY21kX2Rlc2MpKTsJCVwKKwkJX3B0ci0+ZmxhZ3MgPSBUWVBIT09OX0NNRF9SRVNQT05EIHwgVFlQSE9PTl9DTURfREVTQzsJXAorCQlfcHRyLT5mbGFncyB8PSBUWVBIT09OX0RFU0NfVkFMSUQ7IAkJCVwKKwkJX3B0ci0+Y21kID0gY29tbWFuZDsJCQkJCVwKKwkJX3B0ci0+c2VxTm8gPSAxOwkJCQkJXAorCX0gd2hpbGUoMCkKKworLyogVFlQSE9PTl9DTURfU0VUX1JYX0ZJTFRFUiBmaWx0ZXIgYml0cyAoY21kLnBhcm0xKQorICovCisjZGVmaW5lIFRZUEhPT05fUlhfRklMVEVSX0RJUkVDVEVECV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAxKQorI2RlZmluZSBUWVBIT09OX1JYX0ZJTFRFUl9BTExfTUNBU1QJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDIpCisjZGVmaW5lIFRZUEhPT05fUlhfRklMVEVSX0JST0FEQ0FTVAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwNCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9GSUxURVJfUFJPTUlTQ09VUwlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwOCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9GSUxURVJfTUNBU1RfSEFTSAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAxMCkKKworLyogVFlQSE9PTl9DTURfUkVBRF9TVEFUUyByZXNwb25zZSBmb3JtYXQKKyAqLworc3RydWN0IHN0YXRzX3Jlc3AgeworCXU4ICBmbGFnczsKKwl1OCAgbnVtRGVzYzsKKwl1MTYgY21kOworCXUxNiBzZXFObzsKKwl1MTYgdW51c2VkOworCXUzMiB0eFBhY2tldHM7CisJdTY0IHR4Qnl0ZXM7CisJdTMyIHR4RGVmZXJyZWQ7CisJdTMyIHR4TGF0ZUNvbGxpc2lvbnM7CisJdTMyIHR4Q29sbGlzaW9uczsKKwl1MzIgdHhDYXJyaWVyTG9zdDsKKwl1MzIgdHhNdWx0aXBsZUNvbGxpc2lvbnM7CisJdTMyIHR4RXhjZXNzaXZlQ29sbGlzaW9uczsKKwl1MzIgdHhGaWZvVW5kZXJydW5zOworCXUzMiB0eE11bHRpY2FzdFR4T3ZlcmZsb3dzOworCXUzMiB0eEZpbHRlcmVkOworCXUzMiByeFBhY2tldHNHb29kOworCXU2NCByeEJ5dGVzR29vZDsKKwl1MzIgcnhGaWZvT3ZlcnJ1bnM7CisJdTMyIEJhZFNTRDsKKwl1MzIgcnhDcmNFcnJvcnM7CisJdTMyIHJ4T3ZlcnNpemVkOworCXUzMiByeEJyb2FkY2FzdDsKKwl1MzIgcnhNdWx0aWNhc3Q7CisJdTMyIHJ4T3ZlcmZsb3c7CisJdTMyIHJ4RmlsdGVyZWQ7CisJdTMyIGxpbmtTdGF0dXM7CisjZGVmaW5lIFRZUEhPT05fTElOS19TVEFUX01BU0sJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMSkKKyNkZWZpbmUgVFlQSE9PTl9MSU5LX0dPT0QJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMSkKKyNkZWZpbmUgVFlQSE9PTl9MSU5LX0JBRAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAwKQorI2RlZmluZSBUWVBIT09OX0xJTktfU1BFRURfTUFTSwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAyKQorI2RlZmluZSBUWVBIT09OX0xJTktfMTAwTUJQUwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAyKQorI2RlZmluZSBUWVBIT09OX0xJTktfMTBNQlBTCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDApCisjZGVmaW5lIFRZUEhPT05fTElOS19EVVBMRVhfTUFTSwlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDQpCisjZGVmaW5lIFRZUEhPT05fTElOS19GVUxMX0RVUExFWAlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDQpCisjZGVmaW5lIFRZUEhPT05fTElOS19IQUxGX0RVUExFWAlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDApCisJdTMyIHVudXNlZDI7CisJdTMyIHVudXNlZDM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVFlQSE9PTl9DTURfWENWUl9TRUxFQ1QgeGN2ciB2YWx1ZXMgKHJlc3AucGFybTEpCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9YQ1ZSXzEwSEFMRglfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMCkKKyNkZWZpbmUgVFlQSE9PTl9YQ1ZSXzEwRlVMTAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMSkKKyNkZWZpbmUgVFlQSE9PTl9YQ1ZSXzEwMEhBTEYJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDIpCisjZGVmaW5lIFRZUEhPT05fWENWUl8xMDBGVUxMCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAzKQorI2RlZmluZSBUWVBIT09OX1hDVlJfQVVUT05FRwlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwNCkKKworLyogVFlQSE9PTl9DTURfUkVBRF9NRURJQV9TVEFUVVMgKHJlc3AucGFybTEpCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9NRURJQV9TVEFUX0NSQ19TVFJJUF9ESVNBQkxFCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDA0KQorI2RlZmluZSBUWVBIT09OX01FRElBX1NUQVRfQ09MTElTSU9OX0RFVEVDVAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAxMCkKKyNkZWZpbmUgVFlQSE9PTl9NRURJQV9TVEFUX0NBUlJJRVJfU0VOU0UJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMjApCisjZGVmaW5lIFRZUEhPT05fTUVESUFfU1RBVF9QT0xBUklUWV9SRVYJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwNDAwKQorI2RlZmluZSBUWVBIT09OX01FRElBX1NUQVRfTk9fTElOSwkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDA4MDApCisKKy8qIFRZUEhPT05fQ01EX1NFVF9NVUxUSUNBU1RfSEFTSCBlbmFibGUgdmFsdWVzIChjbWQucGFybTEpCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9NQ0FTVF9IQVNIX0RJU0FCTEUJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDApCisjZGVmaW5lIFRZUEhPT05fTUNBU1RfSEFTSF9FTkFCTEUJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDEpCisjZGVmaW5lIFRZUEhPT05fTUNBU1RfSEFTSF9TRVQJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAyKQorCisvKiBUWVBIT09OX0NNRF9DUkVBVEVfU0EgZGVzY3JpcHRvciBhbmQgc2V0dGluZ3MKKyAqLworc3RydWN0IHNhX2Rlc2NyaXB0b3IgeworCXU4ICBmbGFnczsKKwl1OCAgbnVtRGVzYzsKKwl1MTYgY21kOworCXUxNiBzZXFObzsKKwl1MTYgbW9kZTsKKyNkZWZpbmUgVFlQSE9PTl9TQV9NT0RFX05VTEwJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAwKQorI2RlZmluZSBUWVBIT09OX1NBX01PREVfQUgJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAxKQorI2RlZmluZSBUWVBIT09OX1NBX01PREVfRVNQCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMikKKwl1OCAgaGFzaEZsYWdzOworI2RlZmluZSBUWVBIT09OX1NBX0hBU0hfRU5BQkxFCQkweDAxCisjZGVmaW5lIFRZUEhPT05fU0FfSEFTSF9TSEExCQkweDAyCisjZGVmaW5lIFRZUEhPT05fU0FfSEFTSF9NRDUJCTB4MDQKKwl1OCAgZGlyZWN0aW9uOworI2RlZmluZSBUWVBIT09OX1NBX0RJUl9SWAkJMHgwMAorI2RlZmluZSBUWVBIT09OX1NBX0RJUl9UWAkJMHgwMQorCXU4ICBlbmNyeXB0aW9uRmxhZ3M7CisjZGVmaW5lIFRZUEhPT05fU0FfRU5DUllQVF9FTkFCTEUJMHgwMQorI2RlZmluZSBUWVBIT09OX1NBX0VOQ1JZUFRfREVTCQkweDAyCisjZGVmaW5lIFRZUEhPT05fU0FfRU5DUllQVF8zREVTCQkweDAwCisjZGVmaW5lIFRZUEhPT05fU0FfRU5DUllQVF8zREVTXzJLRVkJMHgwMAorI2RlZmluZSBUWVBIT09OX1NBX0VOQ1JZUFRfM0RFU18zS0VZCTB4MDQKKyNkZWZpbmUgVFlQSE9PTl9TQV9FTkNSWVBUX0NCQwkJMHgwOAorI2RlZmluZSBUWVBIT09OX1NBX0VOQ1JZUFRfRUNCCQkweDAwCisJdTggIHNwZWNpZnlJbmRleDsKKyNkZWZpbmUgVFlQSE9PTl9TQV9TUEVDSUZZX0lOREVYCTB4MDEKKyNkZWZpbmUgVFlQSE9PTl9TQV9HRU5FUkFURV9JTkRFWAkweDAwCisJdTMyIFNQSTsKKwl1MzIgZGVzdEFkZHI7CisJdTMyIGRlc3RNYXNrOworCXU4ICBpbnRlZ0tleVsyMF07CisJdTggIGNvbmZLZXlbMjRdOworCXUzMiBpbmRleDsKKwl1MzIgdW51c2VkOworCXUzMiB1bnVzZWQyOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFRZUEhPT05fQ01EX1NFVF9PRkZMT0FEX1RBU0tTIGJpdHMgKGNtZC5wYXJtMiAoVHgpICYgY21kLnBhcm0zIChSeCkpCisgKiBUaGlzIGlzIGFsbCBmb3IgSVB2NC4KKyAqLworI2RlZmluZSBUWVBIT09OX09GRkxPQURfVENQX0NIS1NVTQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpCisjZGVmaW5lIFRZUEhPT05fT0ZGTE9BRF9VRFBfQ0hLU1VNCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwNCkKKyNkZWZpbmUgVFlQSE9PTl9PRkZMT0FEX0lQX0NIS1NVTQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDgpCisjZGVmaW5lIFRZUEhPT05fT0ZGTE9BRF9JUFNFQwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDEwKQorI2RlZmluZSBUWVBIT09OX09GRkxPQURfQkNBU1RfVEhST1RUTEUJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDIwKQorI2RlZmluZSBUWVBIT09OX09GRkxPQURfREhDUF9QUkVWRU5UCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDA0MCkKKyNkZWZpbmUgVFlQSE9PTl9PRkZMT0FEX1ZMQU4JCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDA4MCkKKyNkZWZpbmUgVFlQSE9PTl9PRkZMT0FEX0ZJTFRFUklORwlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAxMDApCisjZGVmaW5lIFRZUEhPT05fT0ZGTE9BRF9UQ1BfU0VHTUVOVAlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAyMDApCisKKy8qIFRZUEhPT05fQ01EX0VOQUJMRV9XQUtFX0VWRU5UUyBiaXRzIChjbWQucGFybTEpCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9XQUtFX01BR0lDX1BLVAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAxKQorI2RlZmluZSBUWVBIT09OX1dBS0VfTElOS19FVkVOVAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAyKQorI2RlZmluZSBUWVBIT09OX1dBS0VfSUNNUF9FQ0hPCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDQpCisjZGVmaW5lIFRZUEhPT05fV0FLRV9BUlAJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwOCkKKworLyogVGhlc2UgYXJlIHVzZWQgdG8gbG9hZCB0aGUgZmlybXdhcmUgaW1hZ2Ugb24gdGhlIE5JQworICovCitzdHJ1Y3QgdHlwaG9vbl9maWxlX2hlYWRlciB7CisJdTggIHRhZ1s4XTsKKwl1MzIgdmVyc2lvbjsKKwl1MzIgbnVtU2VjdGlvbnM7CisJdTMyIHN0YXJ0QWRkcjsKKwl1MzIgaG1hY0RpZ2VzdFs1XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgdHlwaG9vbl9zZWN0aW9uX2hlYWRlciB7CisJdTMyIGxlbjsKKwl1MTYgY2hlY2tzdW07CisJdTE2IHJlc2VydmVkOworCXUzMiBzdGFydEFkZHI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGhlIFR5cGhvb24gUmVnaXN0ZXIgb2Zmc2V0cworICovCisjZGVmaW5lIFRZUEhPT05fUkVHX1NPRlRfUkVTRVQJCQkweDAwCisjZGVmaW5lIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTCQkJMHgwNAorI2RlZmluZSBUWVBIT09OX1JFR19JTlRSX0VOQUJMRQkJCTB4MDgKKyNkZWZpbmUgVFlQSE9PTl9SRUdfSU5UUl9NQVNLCQkJMHgwYworI2RlZmluZSBUWVBIT09OX1JFR19TRUxGX0lOVEVSUlVQVAkJMHgxMAorI2RlZmluZSBUWVBIT09OX1JFR19IT1NUMkFSTTcJCQkweDE0CisjZGVmaW5lIFRZUEhPT05fUkVHX0hPU1QyQVJNNgkJCTB4MTgKKyNkZWZpbmUgVFlQSE9PTl9SRUdfSE9TVDJBUk01CQkJMHgxYworI2RlZmluZSBUWVBIT09OX1JFR19IT1NUMkFSTTQJCQkweDIwCisjZGVmaW5lIFRZUEhPT05fUkVHX0hPU1QyQVJNMwkJCTB4MjQKKyNkZWZpbmUgVFlQSE9PTl9SRUdfSE9TVDJBUk0yCQkJMHgyOAorI2RlZmluZSBUWVBIT09OX1JFR19IT1NUMkFSTTEJCQkweDJjCisjZGVmaW5lIFRZUEhPT05fUkVHX0hPU1QyQVJNMAkJCTB4MzAKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQVJNMkhPU1QzCQkJMHgzNAorI2RlZmluZSBUWVBIT09OX1JFR19BUk0ySE9TVDIJCQkweDM4CisjZGVmaW5lIFRZUEhPT05fUkVHX0FSTTJIT1NUMQkJCTB4M2MKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQVJNMkhPU1QwCQkJMHg0MAorCisjZGVmaW5lIFRZUEhPT05fUkVHX0JPT1RfREFUQV9MTwkJVFlQSE9PTl9SRUdfSE9TVDJBUk01CisjZGVmaW5lIFRZUEhPT05fUkVHX0JPT1RfREFUQV9ISQkJVFlQSE9PTl9SRUdfSE9TVDJBUk00CisjZGVmaW5lIFRZUEhPT05fUkVHX0JPT1RfREVTVF9BRERSCQlUWVBIT09OX1JFR19IT1NUMkFSTTMKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQk9PVF9DSEVDS1NVTQkJVFlQSE9PTl9SRUdfSE9TVDJBUk0yCisjZGVmaW5lIFRZUEhPT05fUkVHX0JPT1RfTEVOR1RICQkJVFlQSE9PTl9SRUdfSE9TVDJBUk0xCisKKyNkZWZpbmUgVFlQSE9PTl9SRUdfRE9XTkxPQURfQk9PVF9BRERSCQlUWVBIT09OX1JFR19IT1NUMkFSTTEKKyNkZWZpbmUgVFlQSE9PTl9SRUdfRE9XTkxPQURfSE1BQ18wCQlUWVBIT09OX1JFR19IT1NUMkFSTTIKKyNkZWZpbmUgVFlQSE9PTl9SRUdfRE9XTkxPQURfSE1BQ18xCQlUWVBIT09OX1JFR19IT1NUMkFSTTMKKyNkZWZpbmUgVFlQSE9PTl9SRUdfRE9XTkxPQURfSE1BQ18yCQlUWVBIT09OX1JFR19IT1NUMkFSTTQKKyNkZWZpbmUgVFlQSE9PTl9SRUdfRE9XTkxPQURfSE1BQ18zCQlUWVBIT09OX1JFR19IT1NUMkFSTTUKKyNkZWZpbmUgVFlQSE9PTl9SRUdfRE9XTkxPQURfSE1BQ180CQlUWVBIT09OX1JFR19IT1NUMkFSTTYKKworI2RlZmluZSBUWVBIT09OX1JFR19CT09UX1JFQ09SRF9BRERSX0hJCQlUWVBIT09OX1JFR19IT1NUMkFSTTIKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQk9PVF9SRUNPUkRfQUREUl9MTwkJVFlQSE9PTl9SRUdfSE9TVDJBUk0xCisKKyNkZWZpbmUgVFlQSE9PTl9SRUdfVFhfTE9fUkVBRFkJCQlUWVBIT09OX1JFR19IT1NUMkFSTTMKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQ01EX1JFQURZCQkJVFlQSE9PTl9SRUdfSE9TVDJBUk0yCisjZGVmaW5lIFRZUEhPT05fUkVHX1RYX0hJX1JFQURZCQkJVFlQSE9PTl9SRUdfSE9TVDJBUk0xCisKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQ09NTUFORAkJCVRZUEhPT05fUkVHX0hPU1QyQVJNMAorI2RlZmluZSBUWVBIT09OX1JFR19IRUFSVEJFQVQJCQlUWVBIT09OX1JFR19BUk0ySE9TVDMKKyNkZWZpbmUgVFlQSE9PTl9SRUdfU1RBVFVTCQkJVFlQSE9PTl9SRUdfQVJNMkhPU1QwCisKKy8qIDNYUCBSZXNldCB2YWx1ZXMgKFRZUEhPT05fUkVHX1NPRlRfUkVTRVQpCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9SRVNFVF9BTEwJMHg3ZgorI2RlZmluZSBUWVBIT09OX1JFU0VUX05PTkUJMHgwMAorCisvKiAzWFAgaXJxIGJpdHMgKFRZUEhPT05fUkVHX0lOVFJ7U1RBVFVTLEVOQUJMRSxNQVNLfSkKKyAqCisgKiBTb21lIG9mIHRoZXNlIGNhbWUgZnJvbSBPcGVuQlNELCBhcyB0aGUgM0NvbSBkb2NzIGhhdmUgaXQgd3JvbmcKKyAqIChJTlRSX1NFTEYpIG9yIGRvbid0IGxpc3QgaXQgYXQgYWxsIChJTlRSXypfQUJPUlQpCisgKgorICogRW5hYmxpbmcgaXJxcyBvbiB0aGUgSGVhcnRiZWF0IHJlZyAoQXJtVG9Ib3N0MykgZ2V0cyB5b3UgYW4gaXJxCisgKiBhYm91dCBldmVyeSA4bXMsIHNvIGRvbid0IGRvIGl0LgorICovCisjZGVmaW5lIFRZUEhPT05fSU5UUl9IT1NUX0lOVAkJMHgwMDAwMDAwMQorI2RlZmluZSBUWVBIT09OX0lOVFJfQVJNMkhPU1QwCQkweDAwMDAwMDAyCisjZGVmaW5lIFRZUEhPT05fSU5UUl9BUk0ySE9TVDEJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX0FSTTJIT1NUMgkJMHgwMDAwMDAwOAorI2RlZmluZSBUWVBIT09OX0lOVFJfQVJNMkhPU1QzCQkweDAwMDAwMDEwCisjZGVmaW5lIFRZUEhPT05fSU5UUl9ETUEwCQkweDAwMDAwMDIwCisjZGVmaW5lIFRZUEhPT05fSU5UUl9ETUExCQkweDAwMDAwMDQwCisjZGVmaW5lIFRZUEhPT05fSU5UUl9ETUEyCQkweDAwMDAwMDgwCisjZGVmaW5lIFRZUEhPT05fSU5UUl9ETUEzCQkweDAwMDAwMTAwCisjZGVmaW5lIFRZUEhPT05fSU5UUl9NQVNURVJfQUJPUlQJMHgwMDAwMDIwMAorI2RlZmluZSBUWVBIT09OX0lOVFJfVEFSR0VUX0FCT1JUCTB4MDAwMDA0MDAKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX1NFTEYJCTB4MDAwMDA4MDAKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX1JFU0VSVkVECQkweGZmZmZmMDAwCisKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX0JPT1RDTUQJCVRZUEhPT05fSU5UUl9BUk0ySE9TVDAKKworI2RlZmluZSBUWVBIT09OX0lOVFJfRU5BQkxFX0FMTAkJMHhmZmZmZmZlZgorI2RlZmluZSBUWVBIT09OX0lOVFJfQUxMCQkweGZmZmZmZmZmCisjZGVmaW5lIFRZUEhPT05fSU5UUl9OT05FCQkweDAwMDAwMDAwCisKKy8qIFRoZSBjb21tYW5kcyBmb3IgdGhlIDNYUCBjaGlwIChUWVBIT09OX1JFR19DT01NQU5EKQorICovCisjZGVmaW5lIFRZUEhPT05fQk9PVENNRF9CT09UCQkJMHgwMAorI2RlZmluZSBUWVBIT09OX0JPT1RDTURfV0FLRVVQCQkJMHhmYQorI2RlZmluZSBUWVBIT09OX0JPT1RDTURfRE5MRF9DT01QTEVURQkJMHhmYgorI2RlZmluZSBUWVBIT09OX0JPT1RDTURfU0VHX0FWQUlMQUJMRQkJMHhmYworI2RlZmluZSBUWVBIT09OX0JPT1RDTURfUlVOVElNRV9JTUFHRQkJMHhmZAorI2RlZmluZSBUWVBIT09OX0JPT1RDTURfUkVHX0JPT1RfUkVDT1JECQkweGZmCisKKy8qIDNYUCBTdGF0dXMgdmFsdWVzIChUWVBIT09OX1JFR19TVEFUVVMpCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9TVEFUVVNfV0FJVElOR19GT1JfQk9PVAkJMHgwNworI2RlZmluZSBUWVBIT09OX1NUQVRVU19TRUNPTkRfSU5JVAkJMHgwOAorI2RlZmluZSBUWVBIT09OX1NUQVRVU19SVU5OSU5HCQkJMHgwOQorI2RlZmluZSBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9IT1NUCQkweDBkCisjZGVmaW5lIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX1NFR01FTlQJMHgxMAorI2RlZmluZSBUWVBIT09OX1NUQVRVU19TTEVFUElORwkJCTB4MTEKKyNkZWZpbmUgVFlQSE9PTl9TVEFUVVNfSEFMVEVECQkJMHgxNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMgYi9kcml2ZXJzL25ldC92aWEtcmhpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjU3ZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMKQEAgLTAsMCArMSwyMDM1IEBACisvKiB2aWEtcmhpbmUuYzogQSBMaW51eCBFdGhlcm5ldCBkZXZpY2UgZHJpdmVyIGZvciBWSUEgUmhpbmUgZmFtaWx5IGNoaXBzLiAqLworLyoKKwlXcml0dGVuIDE5OTgtMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJQ3VycmVudCBNYWludGFpbmVyOiBSb2dlciBMdWV0aGkgPHJsQGhlbGxnYXRlLmNoPgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisJRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKwlhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJVGhpcyBkcml2ZXIgaXMgZGVzaWduZWQgZm9yIHRoZSBWSUEgVlQ4NkMxMDBBIFJoaW5lLUkuCisJSXQgYWxzbyB3b3JrcyB3aXRoIHRoZSBSaGluZS1JSSAoNjEwMikgYW5kIFJoaW5lLUlJSSAoNjEwNS82MTA1TC82MTA1TE9NCisJYW5kIG1hbmFnZW1lbnQgTklDIDYxMDVNKS4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCisJVGhpcyBkcml2ZXIgY29udGFpbnMgc29tZSBjaGFuZ2VzIGZyb20gdGhlIG9yaWdpbmFsIERvbmFsZCBCZWNrZXIKKwl2ZXJzaW9uLiBIZSBtYXkgb3IgbWF5IG5vdCBiZSBpbnRlcmVzdGVkIGluIGJ1ZyByZXBvcnRzIG9uIHRoaXMKKwljb2RlLiBZb3UgY2FuIGZpbmQgaGlzIHZlcnNpb25zIGF0OgorCWh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvdmlhLXJoaW5lLmh0bWwKKworCisJTGludXgga2VybmVsIHZlcnNpb24gaGlzdG9yeToKKworCUxLMS4xLjA6CisJLSBKZWZmIEdhcnppazogc29mdG5ldCAnbiBzdHVmZgorCisJTEsxLjEuMToKKwktIEp1c3RpbiBHdXlldHQ6IHNvZnRuZXQgYW5kIGxvY2tpbmcgZml4ZXMKKwktIEplZmYgR2FyemlrOiB1c2UgUENJIGludGVyZmFjZQorCisJTEsxLjEuMjoKKwktIFVyYmFuIFdpZG1hcms6IG1pbm9yIGNsZWFudXBzLCBtZXJnZXMgZnJvbSBCZWNrZXIgMS4wM2EvMS4wNCB2ZXJzaW9ucworCisJTEsxLjEuMzoKKwktIFVyYmFuIFdpZG1hcms6IHVzZSBQQ0kgRE1BIGludGVyZmFjZSAod2l0aCB0aGFua3MgdG8gdGhlIGVlcHJvMTAwLmMKKwkJCSBjb2RlKSB1cGRhdGUgIlRoZW9yeSBvZiBPcGVyYXRpb24iIHdpdGgKKwkJCSBzb2Z0bmV0L2xvY2tpbmcgY2hhbmdlcworCS0gRGF2ZSBNaWxsZXI6IFBDSSBETUEgYW5kIGVuZGlhbiBmaXh1cHMKKwktIEplZmYgR2FyemlrOiBNT0RfeHh4IHJhY2UgZml4ZXMsIHVwZGF0ZWQgUENJIHJlc291cmNlIGFsbG9jYXRpb24KKworCUxLMS4xLjQ6CisJLSBVcmJhbiBXaWRtYXJrOiBmaXggZ2NjIDIuOTUuMiBwcm9ibGVtIGFuZAorCSAgICAgICAgICAgICAgICAgcmVtb3ZlIHdyaXRlbCdzIHRvIGZpeGVkIGFkZHJlc3MgMHg3YworCisJTEsxLjEuNToKKwktIFVyYmFuIFdpZG1hcms6IG1kaW8gbG9ja2luZywgYm91bmNlIGJ1ZmZlciBjaGFuZ2VzCisJICAgICAgICAgICAgICAgICBtZXJnZXMgZnJvbSBCZWNrZXJzIDEuMDUgdmVyc2lvbgorCSAgICAgICAgICAgICAgICAgYWRkZWQgbmV0aWZfcnVubmluZ19vbi9vZmYgc3VwcG9ydAorCisJTEsxLjEuNjoKKwktIFVyYmFuIFdpZG1hcms6IG1lcmdlcyBmcm9tIEJlY2tlcnMgMS4wOGIgdmVyc2lvbiAoVlQ2MTAyICsgbWRpbykKKwkgICAgICAgICAgICAgICAgIHNldCBuZXRpZl9ydW5uaW5nX29uL29mZiBvbiBzdGFydHVwLCBkZWxfdGltZXJfc3luYworCisJTEsxLjEuNzoKKwktIE1hbmZyZWQgU3ByYXVsOiBhZGRlZCByZXNldCBpbnRvIHR4X3RpbWVvdXQKKworCUxLMS4xLjk6CisJLSBVcmJhbiBXaWRtYXJrOiBtZXJnZXMgZnJvbSBCZWNrZXJzIDEuMTAgdmVyc2lvbgorCSAgICAgICAgICAgICAgICAgKG1lZGlhIHNlbGVjdGlvbiArIGVlcHJvbSByZWxvYWQpCisJLSBEYXZpZCBWcmFiZWw6ICBtZXJnZXMgZnJvbSBELUxpbmsgIjEuMTEiIHZlcnNpb24KKwkgICAgICAgICAgICAgICAgIChkaXNhYmxlIFdPTCBhbmQgUE1FIG9uIHN0YXJ0dXApCisKKwlMSzEuMS4xMDoKKwktIE1hbmZyZWQgU3ByYXVsOiB1c2UgInNpbmdsZWNvcHkiIGZvciB1bmFsaWduZWQgYnVmZmVycworCSAgICAgICAgICAgICAgICAgIGRvbid0IGFsbG9jYXRlIGJvdW5jZSBidWZmZXJzIGZvciAhUmVxVHhBbGlnbiBjYXJkcworCisJTEsxLjEuMTE6CisJLSBEYXZpZCBXb29kaG91c2U6IFNldCBkZXYtPmJhc2VfYWRkciBiZWZvcmUgdGhlIGZpcnN0IHRpbWUgd2UgY2FsbAorCQkJICAgd2FpdF9mb3JfcmVzZXQoKS4gSXQncyBhIGxvdCBoYXBwaWVyIHRoYXQgd2F5LgorCQkJICAgRnJlZSBucC0+dHhfYnVmcyBvbmx5IGlmIHdlIGFjdHVhbGx5IGFsbG9jYXRlZCBpdC4KKworCUxLMS4xLjEyOgorCS0gTWFydGluIEVyaWtzc29uOiBBbGxvdyBNZW1vcnktTWFwcGVkIElPIHRvIGJlIGVuYWJsZWQuCisKKwlMSzEuMS4xMyAoamdhcnppayk6CisJLSBBZGQgZXRodG9vbCBzdXBwb3J0CisJLSBSZXBsYWNlIHNvbWUgTUlJLXJlbGF0ZWQgbWFnaWMgbnVtYmVycyB3aXRoIGNvbnN0YW50cworCisJTEsxLjEuMTQgKEl2YW4gRy4pOgorCS0gZml4ZXMgY29tbWVudHMgZm9yIFJoaW5lLUlJSQorCS0gcmVtb3ZlcyBXX01BWF9USU1FT1VUICh1bnVzZWQpCisJLSBhZGRzIEhhc0Rhdmljb21QaHkgZm9yIFJoaW5lLUkgKGJhc2lzOiBsaW51eGZldCBkcml2ZXI7IG15IGNhcmQKKwkgIGlzIFItSSBhbmQgaGFzIERhdmljb20gY2hpcCwgZmxhZyBpcyByZWZlcmVuY2VkIGluIGtlcm5lbCBkcml2ZXIpCisJLSBzZW5kcyBjaGlwX2lkIGFzIGEgcGFyYW1ldGVyIHRvIHdhaXRfZm9yX3Jlc2V0IHNpbmNlIG5wIGlzIG5vdAorCSAgaW5pdGlhbGl6ZWQgb24gZmlyc3QgY2FsbAorCS0gY2hhbmdlcyBtbWlvICJlbHNlIGlmIChjaGlwX2lkPT1WVDYxMDIpIiB0byAiZWxzZSIgc28gaXQgd2lsbCB3b3JrCisJICBmb3IgUmhpbmUtSUlJJ3MgKGRvY3VtZW50YXRpb24gc2F5cyBzYW1lIGJpdCBpcyBjb3JyZWN0KQorCS0gdHJhbnNtaXQgZnJhbWUgcXVldWUgbWVzc2FnZSBpcyBvZmYgYnkgb25lIC0gZml4ZWQKKwktIGFkZHMgSW50ck5vcm1hbFN1bW1hcnkgdG8gIlNvbWV0aGluZyBXaWNrZWQiIGV4Y2x1c2lvbiBsaXN0CisJICBzbyBub3JtYWwgaW50ZXJydXB0cyB3aWxsIG5vdCB0cmlnZ2VyIHRoZSBtZXNzYWdlIChzcmM6IERvbmFsZCBCZWNrZXIpCisJKFJvZ2VyIEx1ZXRoaSkKKwktIHNob3cgY29uZnVzZWQgY2hpcCB3aGVyZSB0byBjb250aW51ZSBhZnRlciBUeCBlcnJvcgorCS0gbG9jYXRpb24gb2YgY29sbGlzaW9uIGNvdW50ZXIgaXMgY2hpcCBzcGVjaWZpYworCS0gYWxsb3cgc2VsZWN0aW5nIGJhY2tvZmYgYWxnb3JpdGhtIChtb2R1bGUgcGFyYW1ldGVyKQorCisJTEsxLjEuMTUgKGpnYXJ6aWspOgorCS0gVXNlIG5ldyBNSUkgbGliIGhlbHBlciBnZW5lcmljX21paV9pb2N0bAorCisJTEsxLjEuMTYgKFJvZ2VyIEx1ZXRoaSkKKwktIEV0aGVybGVhayBmaXgKKwktIEhhbmRsZSBUeCBidWZmZXIgdW5kZXJydW4KKwktIEZpeCBidWdzIGluIGZ1bGwgZHVwbGV4IGhhbmRsaW5nCisJLSBOZXcgcmVzZXQgY29kZSB1c2VzICJmb3JjZSByZXNldCIgY21kIG9uIFJoaW5lLUlJCisJLSBWYXJpb3VzIGNsZWFuIHVwcworCisJTEsxLjEuMTcgKFJvZ2VyIEx1ZXRoaSkKKwktIEZpeCByYWNlIGluIHZpYV9yaGluZV9zdGFydF90eCgpCisJLSBPbiBlcnJvcnMsIHdhaXQgZm9yIFR4IGVuZ2luZSB0byB0dXJuIG9mZiBiZWZvcmUgc2NhdmVuZ2luZworCS0gSGFuZGxlIFR4IGRlc2NyaXB0b3Igd3JpdGUtYmFjayByYWNlIG9uIFJoaW5lLUlJCisJLSBGb3JjZSBmbHVzaGluZyBmb3IgUENJIHBvc3RlZCB3cml0ZXMKKwktIE1vcmUgcmVzZXQgY29kZSBjaGFuZ2VzCisKKwlMSzEuMS4xOCAoUm9nZXIgTHVldGhpKQorCS0gTm8gZmlsdGVyaW5nIG11bHRpY2FzdCBpbiBwcm9taXNjIG1vZGUgKEVkd2FyZCBQZW5nKQorCS0gRml4IGZvciBSaGluZS1JIFR4IHRpbWVvdXRzCisKKwlMSzEuMS4xOSAoUm9nZXIgTHVldGhpKQorCS0gSW5jcmVhc2UgVHggdGhyZXNob2xkIGZvciB1bnNwZWNpZmllZCBlcnJvcnMKKworCUxLMS4yLjAtMi42IChSb2dlciBMdWV0aGkpCisJLSBNYXNzaXZlIGNsZWFuLXVwCisJLSBSZXdyaXRlIFBIWSwgbWVkaWEgaGFuZGxpbmcgKHJlbW92ZSBvcHRpb25zLCBmdWxsX2R1cGxleCwgYmFja29mZikKKwktIEZpeCBUeCBlbmdpbmUgcmFjZSBmb3IgZ29vZAorCisqLworCisjZGVmaW5lIERSVl9OQU1FCSJ2aWEtcmhpbmUiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjIuMC0yLjYiCisjZGVmaW5lIERSVl9SRUxEQVRFCSJKdW5lLTEwLTIwMDQiCisKKworLyogQSBmZXcgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLgorICAgVGhlc2UgbWF5IGJlIG1vZGlmaWVkIHdoZW4gYSBkcml2ZXIgbW9kdWxlIGlzIGxvYWRlZC4gKi8KKworc3RhdGljIGludCBkZWJ1ZyA9IDE7CS8qIDEgbm9ybWFsIG1lc3NhZ2VzLCAwIHF1aWV0IC4uIDcgdmVyYm9zZS4gKi8KK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gMjA7CisKKy8qIFNldCB0aGUgY29weSBicmVha3BvaW50IGZvciB0aGUgY29weS1vbmx5LXRpbnktZnJhbWVzIHNjaGVtZS4KKyAgIFNldHRpbmcgdG8gPiAxNTE4IGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoaXMgZmVhdHVyZS4gKi8KK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrOworCisvKgorICogSW4gY2FzZSB5b3UgYXJlIGxvb2tpbmcgZm9yICdvcHRpb25zW10nIG9yICdmdWxsX2R1cGxleFtdJywgdGhleQorICogYXJlIGdvbmUuIFVzZSBldGh0b29sKDgpIGluc3RlYWQuCisgKi8KKworLyogTWF4aW11bSBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBmaWx0ZXIgKHZzLiByeC1hbGwtbXVsdGljYXN0KS4KKyAgIFRoZSBSaGluZSBoYXMgYSA2NCBlbGVtZW50IDgzOTAtbGlrZSBoYXNoIHRhYmxlLiAqLworc3RhdGljIGNvbnN0IGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CisKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IGFyZSBzZXQgYXQgY29tcGlsZSB0aW1lLiAqLworCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBjb21waWxlIGVmZmljaWVuY3kuCisgICBUaGUgY29tcGlsZXIgd2lsbCBjb252ZXJ0IDx1bnNpZ25lZD4nJSc8Ml5OPiBpbnRvIGEgYml0IG1hc2suCisgICBNYWtpbmcgdGhlIFR4IHJpbmcgdG9vIGxhcmdlIGRlY3JlYXNlcyB0aGUgZWZmZWN0aXZlbmVzcyBvZiBjaGFubmVsCisgICBib25kaW5nIGFuZCBwYWNrZXQgcHJpb3JpdHkuCisgICBUaGVyZSBhcmUgbm8gaWxsIGVmZmVjdHMgZnJvbSB0b28tbGFyZ2UgcmVjZWl2ZSByaW5ncy4gKi8KKyNkZWZpbmUgVFhfUklOR19TSVpFCTE2CisjZGVmaW5lIFRYX1FVRVVFX0xFTgkxMAkvKiBMaW1pdCByaW5nIGVudHJpZXMgYWN0dWFsbHkgdXNlZC4gKi8KKyNkZWZpbmUgUlhfUklOR19TSVpFCTE2CisKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQJKDIqSFopCisKKyNkZWZpbmUgUEtUX0JVRl9TWgkxNTM2CS8qIFNpemUgb2YgZWFjaCB0ZW1wb3JhcnkgUnggYnVmZmVyLiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CS8qIFByb2Nlc3NvciB0eXBlIGZvciBjYWNoZSBhbGlnbm1lbnQuICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIFRoZXNlIGlkZW50aWZ5IHRoZSBkcml2ZXIgYmFzZSB2ZXJzaW9uIGFuZCBtYXkgbm90IGJlIHJlbW92ZWQuICovCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gRFJWX05BTUUgIi5jOnYxLjEwLUxLIiBEUlZfVkVSU0lPTiAiICIgRFJWX1JFTERBVEUgIiBXcml0dGVuIGJ5IERvbmFsZCBCZWNrZXJcbiI7CisKKy8qIFRoaXMgZHJpdmVyIHdhcyB3cml0dGVuIHRvIHVzZSBQQ0kgbWVtb3J5IHNwYWNlLiBTb21lIGVhcmx5IHZlcnNpb25zCisgICBvZiB0aGUgUmhpbmUgbWF5IG9ubHkgd29yayBjb3JyZWN0bHkgd2l0aCBJL08gc3BhY2UgYWNjZXNzZXMuICovCisjaWZkZWYgQ09ORklHX1ZJQV9SSElORV9NTUlPCisjZGVmaW5lIFVTRV9NTUlPCisjZWxzZQorI2VuZGlmCisKK01PRFVMRV9BVVRIT1IoIkRvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSBSaGluZSBQQ0kgRmFzdCBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pbnRlcnJ1cHRfd29yaywgIlZJQSBSaGluZSBtYXhpbXVtIGV2ZW50cyBoYW5kbGVkIHBlciBpbnRlcnJ1cHQiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJWSUEgUmhpbmUgZGVidWcgbGV2ZWwgKDAtNykiKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfY29weWJyZWFrLCAiVklBIFJoaW5lIGNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7CisKKy8qCisJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworSS4gQm9hcmQgQ29tcGF0aWJpbGl0eQorCitUaGlzIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIFZJQSA4NmMxMDBBIFJoaW5lLUlJIFBDSSBGYXN0IEV0aGVybmV0Citjb250cm9sbGVyLgorCitJSS4gQm9hcmQtc3BlY2lmaWMgc2V0dGluZ3MKKworQm9hcmRzIHdpdGggdGhpcyBjaGlwIGFyZSBmdW5jdGlvbmFsIG9ubHkgaW4gYSBidXMtbWFzdGVyIFBDSSBzbG90LgorCitNYW55IG9wZXJhdGlvbmFsIHNldHRpbmdzIGFyZSBsb2FkZWQgZnJvbSB0aGUgRUVQUk9NIHRvIHRoZSBDb25maWcgd29yZCBhdAorb2Zmc2V0IDB4NzguIEZvciBtb3N0IG9mIHRoZXNlIHNldHRpbmdzLCB0aGlzIGRyaXZlciBhc3N1bWVzIHRoYXQgdGhleSBhcmUKK2NvcnJlY3QuCitJZiB0aGlzIGRyaXZlciBpcyBjb21waWxlZCB0byB1c2UgUENJIG1lbW9yeSBzcGFjZSBvcGVyYXRpb25zIHRoZSBFRVBST00KK211c3QgYmUgY29uZmlndXJlZCB0byBlbmFibGUgbWVtb3J5IG9wcy4KKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK0lJSWEuIFJpbmcgYnVmZmVycworCitUaGlzIGRyaXZlciB1c2VzIHR3byBzdGF0aWNhbGx5IGFsbG9jYXRlZCBmaXhlZC1zaXplIGRlc2NyaXB0b3IgbGlzdHMKK2Zvcm1lZCBpbnRvIHJpbmdzIGJ5IGEgYnJhbmNoIGZyb20gdGhlIGZpbmFsIGRlc2NyaXB0b3IgdG8gdGhlIGJlZ2lubmluZyBvZgordGhlIGxpc3QuIFRoZSByaW5nIHNpemVzIGFyZSBzZXQgYXQgY29tcGlsZSB0aW1lIGJ5IFJYL1RYX1JJTkdfU0laRS4KKworSUlJYi9jLiBUcmFuc21pdC9SZWNlaXZlIFN0cnVjdHVyZQorCitUaGlzIGRyaXZlciBhdHRlbXB0cyB0byB1c2UgYSB6ZXJvLWNvcHkgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgc2NoZW1lLgorCitBbGFzLCBhbGwgZGF0YSBidWZmZXJzIGFyZSByZXF1aXJlZCB0byBzdGFydCBvbiBhIDMyIGJpdCBib3VuZGFyeSwgc28KK3RoZSBkcml2ZXIgbXVzdCBvZnRlbiBjb3B5IHRyYW5zbWl0IHBhY2tldHMgaW50byBib3VuY2UgYnVmZmVycy4KKworVGhlIGRyaXZlciBhbGxvY2F0ZXMgZnVsbCBmcmFtZSBzaXplIHNrYnVmZnMgZm9yIHRoZSBSeCByaW5nIGJ1ZmZlcnMgYXQKK29wZW4oKSB0aW1lIGFuZCBwYXNzZXMgdGhlIHNrYi0+ZGF0YSBmaWVsZCB0byB0aGUgY2hpcCBhcyByZWNlaXZlIGRhdGEKK2J1ZmZlcnMuIFdoZW4gYW4gaW5jb21pbmcgZnJhbWUgaXMgbGVzcyB0aGFuIFJYX0NPUFlCUkVBSyBieXRlcyBsb25nLAorYSBmcmVzaCBza2J1ZmYgaXMgYWxsb2NhdGVkIGFuZCB0aGUgZnJhbWUgaXMgY29waWVkIHRvIHRoZSBuZXcgc2tidWZmLgorV2hlbiB0aGUgaW5jb21pbmcgZnJhbWUgaXMgbGFyZ2VyLCB0aGUgc2tidWZmIGlzIHBhc3NlZCBkaXJlY3RseSB1cCB0aGUKK3Byb3RvY29sIHN0YWNrLiBCdWZmZXJzIGNvbnN1bWVkIHRoaXMgd2F5IGFyZSByZXBsYWNlZCBieSBuZXdseSBhbGxvY2F0ZWQKK3NrYnVmZnMgaW4gdGhlIGxhc3QgcGhhc2Ugb2YgcmhpbmVfcngoKS4KKworVGhlIFJYX0NPUFlCUkVBSyB2YWx1ZSBpcyBjaG9zZW4gdG8gdHJhZGUtb2ZmIHRoZSBtZW1vcnkgd2FzdGVkIGJ5Cit1c2luZyBhIGZ1bGwtc2l6ZWQgc2tidWZmIGZvciBzbWFsbCBmcmFtZXMgdnMuIHRoZSBjb3B5aW5nIGNvc3RzIG9mIGxhcmdlcgorZnJhbWVzLiBOZXcgYm9hcmRzIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiBnZW5lcm91c2x5IGNvbmZpZ3VyZWQgbWFjaGluZXMKK2FuZCB0aGUgdW5kZXJmaWxsZWQgYnVmZmVycyBoYXZlIG5lZ2xpZ2libGUgaW1wYWN0IGNvbXBhcmVkIHRvIHRoZSBiZW5lZml0IG9mCithIHNpbmdsZSBhbGxvY2F0aW9uIHNpemUsIHNvIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHplcm8gcmVzdWx0cyBpbiBuZXZlcgorY29weWluZyBwYWNrZXRzLiBXaGVuIGNvcHlpbmcgaXMgZG9uZSwgdGhlIGNvc3QgaXMgdXN1YWxseSBtaXRpZ2F0ZWQgYnkgdXNpbmcKK2EgY29tYmluZWQgY29weS9jaGVja3N1bSByb3V0aW5lLiBDb3B5aW5nIGFsc28gcHJlbG9hZHMgdGhlIGNhY2hlLCB3aGljaCBpcworbW9zdCB1c2VmdWwgd2l0aCBzbWFsbCBmcmFtZXMuCisKK1NpbmNlIHRoZSBWSUEgY2hpcHMgYXJlIG9ubHkgYWJsZSB0byB0cmFuc2ZlciBkYXRhIHRvIGJ1ZmZlcnMgb24gMzIgYml0Citib3VuZGFyaWVzLCB0aGUgSVAgaGVhZGVyIGF0IG9mZnNldCAxNCBpbiBhbiBldGhlcm5ldCBmcmFtZSBpc24ndAorbG9uZ3dvcmQgYWxpZ25lZCBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiBDb3B5aW5nIHRoZXNlIHVuYWxpZ25lZCBidWZmZXJzCitoYXMgdGhlIGJlbmVmaWNpYWwgZWZmZWN0IG9mIDE2LWJ5dGUgYWxpZ25pbmcgdGhlIElQIGhlYWRlci4KKworSUlJZC4gU3luY2hyb25pemF0aW9uCisKK1RoZSBkcml2ZXIgcnVucyBhcyB0d28gaW5kZXBlbmRlbnQsIHNpbmdsZS10aHJlYWRlZCBmbG93cyBvZiBjb250cm9sLiBPbmUKK2lzIHRoZSBzZW5kLXBhY2tldCByb3V0aW5lLCB3aGljaCBlbmZvcmNlcyBzaW5nbGUtdGhyZWFkZWQgdXNlIGJ5IHRoZQorZGV2LT5wcml2LT5sb2NrIHNwaW5sb2NrLiBUaGUgb3RoZXIgdGhyZWFkIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgd2hpY2gKK2lzIHNpbmdsZSB0aHJlYWRlZCBieSB0aGUgaGFyZHdhcmUgYW5kIGludGVycnVwdCBoYW5kbGluZyBzb2Z0d2FyZS4KKworVGhlIHNlbmQgcGFja2V0IHRocmVhZCBoYXMgcGFydGlhbCBjb250cm9sIG92ZXIgdGhlIFR4IHJpbmcuIEl0IGxvY2tzIHRoZQorZGV2LT5wcml2LT5sb2NrIHdoZW5ldmVyIGl0J3MgcXVldWluZyBhIFR4IHBhY2tldC4gSWYgdGhlIG5leHQgc2xvdCBpbiB0aGUgcmluZworaXMgbm90IGF2YWlsYWJsZSBpdCBzdG9wcyB0aGUgdHJhbnNtaXQgcXVldWUgYnkgY2FsbGluZyBuZXRpZl9zdG9wX3F1ZXVlLgorCitUaGUgaW50ZXJydXB0IGhhbmRsZXIgaGFzIGV4Y2x1c2l2ZSBjb250cm9sIG92ZXIgdGhlIFJ4IHJpbmcgYW5kIHJlY29yZHMgc3RhdHMKK2Zyb20gdGhlIFR4IHJpbmcuIEFmdGVyIHJlYXBpbmcgdGhlIHN0YXRzLCBpdCBtYXJrcyB0aGUgVHggcXVldWUgZW50cnkgYXMKK2VtcHR5IGJ5IGluY3JlbWVudGluZyB0aGUgZGlydHlfdHggbWFyay4gSWYgYXQgbGVhc3QgaGFsZiBvZiB0aGUgZW50cmllcyBpbgordGhlIFJ4IHJpbmcgYXJlIGF2YWlsYWJsZSB0aGUgdHJhbnNtaXQgcXVldWUgaXMgd29rZW4gdXAgaWYgaXQgd2FzIHN0b3BwZWQuCisKK0lWLiBOb3RlcworCitJVmIuIFJlZmVyZW5jZXMKKworUHJlbGltaW5hcnkgVlQ4NkMxMDBBIG1hbnVhbCBmcm9tIGh0dHA6Ly93d3cudmlhLmNvbS50dy8KK2h0dHA6Ly93d3cuc2N5bGQuY29tL2V4cGVydC8xMDBtYnBzLmh0bWwKK2h0dHA6Ly93d3cuc2N5bGQuY29tL2V4cGVydC9OV2F5Lmh0bWwKK2Z0cDovL2Z0cC52aWEuY29tLnR3L3B1YmxpYy9sYW4vUHJvZHVjdHMvTklDL1ZUODZDMTAwQS9EYXRhc2hlZXQvVlQ4NkMxMDBBMDMucGRmCitmdHA6Ly9mdHAudmlhLmNvbS50dy9wdWJsaWMvbGFuL1Byb2R1Y3RzL05JQy9WVDYxMDIvRGF0YXNoZWV0L1ZUNjEwMl8wMjEuUERGCisKKworSVZjLiBFcnJhdGEKKworVGhlIFZUODZDMTAwQSBtYW51YWwgaXMgbm90IHJlbGlhYmxlIGluZm9ybWF0aW9uLgorVGhlIDMwNDMgY2hpcCBkb2VzIG5vdCBoYW5kbGUgdW5hbGlnbmVkIHRyYW5zbWl0IG9yIHJlY2VpdmUgYnVmZmVycywgcmVzdWx0aW5nCitpbiBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBmb3IgYm91bmNlIGJ1ZmZlciBjb3BpZXMgb24gdHJhbnNtaXQKK2FuZCB1bmFsaWduZWQgSVAgaGVhZGVycyBvbiByZWNlaXZlLgorVGhlIGNoaXAgZG9lcyBub3QgcGFkIHRvIG1pbmltdW0gdHJhbnNtaXQgbGVuZ3RoLgorCisqLworCisKKy8qIFRoaXMgdGFibGUgZHJpdmVzIHRoZSBQQ0kgcHJvYmUgcm91dGluZXMuIEl0J3MgbW9zdGx5IGJvaWxlcnBsYXRlIGluIGFsbAorICAgb2YgdGhlIGRyaXZlcnMsIGFuZCB3aWxsIGxpa2VseSBiZSBwcm92aWRlZCBieSBzb21lIGZ1dHVyZSBrZXJuZWwuCisgICBOb3RlIHRoZSBtYXRjaGluZyBjb2RlIC0tIHRoZSBmaXJzdCB0YWJsZSBlbnRyeSBtYXRjaHMgYWxsIDU2KiogY2FyZHMgYnV0CisgICBzZWNvbmQgb25seSB0aGUgMTIzNCBjYXJkLgorKi8KKworZW51bSByaGluZV9yZXZzIHsKKwlWVDg2QzEwMEEJPSAweDAwLAorCVZUdW5rbm93bjAJPSAweDIwLAorCVZUNjEwMgkJPSAweDQwLAorCVZUODIzMQkJPSAweDUwLAkvKiBJbnRlZ3JhdGVkIE1BQyAqLworCVZUODIzMwkJPSAweDYwLAkvKiBJbnRlZ3JhdGVkIE1BQyAqLworCVZUODIzNQkJPSAweDc0LAkvKiBJbnRlZ3JhdGVkIE1BQyAqLworCVZUODIzNwkJPSAweDc4LAkvKiBJbnRlZ3JhdGVkIE1BQyAqLworCVZUdW5rbm93bjEJPSAweDdDLAorCVZUNjEwNQkJPSAweDgwLAorCVZUNjEwNV9CMAk9IDB4ODMsCisJVlQ2MTA1TAkJPSAweDhBLAorCVZUNjEwNwkJPSAweDhDLAorCVZUdW5rbm93bjIJPSAweDhFLAorCVZUNjEwNU0JCT0gMHg5MCwJLyogTWFuYWdlbWVudCBhZGFwdGVyICovCit9OworCitlbnVtIHJoaW5lX3F1aXJrcyB7CisJcnFXT0wJCT0gMHgwMDAxLAkvKiBXYWtlLU9uLUxBTiBzdXBwb3J0ICovCisJcnFGb3JjZVJlc2V0CT0gMHgwMDAyLAorCXJxNnBhdHRlcm5zCT0gMHgwMDQwLAkvKiA2IGluc3RlYWQgb2YgNCBwYXR0ZXJucyBmb3IgV09MICovCisJcnFTdGF0dXNXQlJhY2UJPSAweDAwODAsCS8qIFR4IFN0YXR1cyBXcml0ZWJhY2sgRXJyb3IgcG9zc2libGUgKi8KKwlycVJoaW5lSQk9IDB4MDEwMCwJLyogU2VlIGNvbW1lbnQgYmVsb3cgKi8KK307CisvKgorICogcnFSaGluZUk6IFZUODZDMTAwQSAoYWthIFJoaW5lLUkpIHVzZXMgZGlmZmVyZW50IGJpdHMgdG8gZW5hYmxlCisgKiBNTUlPIGFzIHdlbGwgYXMgZm9yIHRoZSBjb2xsaXNpb24gY291bnRlciBhbmQgdGhlIFR4IEZJRk8gdW5kZXJmbG93CisgKiBpbmRpY2F0b3IuIEluIGFkZGl0aW9uLCBUeCBhbmQgUnggYnVmZmVycyBuZWVkIHRvIDQgYnl0ZSBhbGlnbmVkLgorICovCisKKy8qIEJld2FyZSBvZiBQQ0kgcG9zdGVkIHdyaXRlcyAqLworI2RlZmluZSBJT1NZTkMJZG8geyBpb3JlYWQ4KGlvYWRkciArIFN0YXRpb25BZGRyKTsgfSB3aGlsZSAoMCkKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJoaW5lX3BjaV90YmxbXSA9Cit7CisJezB4MTEwNiwgMHgzMDQzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCB9LCAvKiBWVDg2QzEwMEEgKi8KKwl7MHgxMTA2LCAweDMwNjUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIH0sIC8qIFZUNjEwMiAqLworCXsweDExMDYsIDB4MzEwNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgfSwgLyogNjEwNXssTCxMT019ICovCisJezB4MTEwNiwgMHgzMDUzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCB9LCAvKiBWVDYxMDVNICovCisJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJoaW5lX3BjaV90YmwpOworCisKKy8qIE9mZnNldHMgdG8gdGhlIGRldmljZSByZWdpc3RlcnMuICovCitlbnVtIHJlZ2lzdGVyX29mZnNldHMgeworCVN0YXRpb25BZGRyPTB4MDAsIFJ4Q29uZmlnPTB4MDYsIFR4Q29uZmlnPTB4MDcsIENoaXBDbWQ9MHgwOCwKKwlDaGlwQ21kMT0weDA5LAorCUludHJTdGF0dXM9MHgwQywgSW50ckVuYWJsZT0weDBFLAorCU11bHRpY2FzdEZpbHRlcjA9MHgxMCwgTXVsdGljYXN0RmlsdGVyMT0weDE0LAorCVJ4UmluZ1B0cj0weDE4LCBUeFJpbmdQdHI9MHgxQywgR0ZJRk9UZXN0PTB4NTQsCisJTUlJUGh5QWRkcj0weDZDLCBNSUlTdGF0dXM9MHg2RCwgUENJQnVzQ29uZmlnPTB4NkUsCisJTUlJQ21kPTB4NzAsIE1JSVJlZ0FkZHI9MHg3MSwgTUlJRGF0YT0weDcyLCBNQUNSZWdFRWNzcj0weDc0LAorCUNvbmZpZ0E9MHg3OCwgQ29uZmlnQj0weDc5LCBDb25maWdDPTB4N0EsIENvbmZpZ0Q9MHg3QiwKKwlSeE1pc3NlZD0weDdDLCBSeENSQ0VycnM9MHg3RSwgTWlzY0NtZD0weDgxLAorCVN0aWNreUhXPTB4ODMsIEludHJTdGF0dXMyPTB4ODQsCisJV09MY3JTZXQ9MHhBMCwgUHdjZmdTZXQ9MHhBMSwgV09MY2dTZXQ9MHhBMywgV09MY3JDbHI9MHhBNCwKKwlXT0xjckNscjE9MHhBNiwgV09MY2dDbHI9MHhBNywKKwlQd3Jjc3JTZXQ9MHhBOCwgUHdyY3NyU2V0MT0weEE5LCBQd3Jjc3JDbHI9MHhBQywgUHdyY3NyQ2xyMT0weEFELAorfTsKKworLyogQml0cyBpbiBDb25maWdEICovCitlbnVtIGJhY2tvZmZfYml0cyB7CisJQmFja09wdGlvbmFsPTB4MDEsIEJhY2tNb2RpZnk9MHgwMiwKKwlCYWNrQ2FwdHVyZUVmZmVjdD0weDA0LCBCYWNrUmFuZG9tPTB4MDgKK307CisKKyNpZmRlZiBVU0VfTU1JTworLyogUmVnaXN0ZXJzIHdlIGNoZWNrIHRoYXQgbW1pbyBhbmQgcmVnIGFyZSB0aGUgc2FtZS4gKi8KK3N0YXRpYyBjb25zdCBpbnQgbW1pb192ZXJpZnlfcmVnaXN0ZXJzW10gPSB7CisJUnhDb25maWcsIFR4Q29uZmlnLCBJbnRyRW5hYmxlLCBDb25maWdBLCBDb25maWdCLCBDb25maWdDLCBDb25maWdELAorCTAKK307CisjZW5kaWYKKworLyogQml0cyBpbiB0aGUgaW50ZXJydXB0IHN0YXR1cy9tYXNrIHJlZ2lzdGVycy4gKi8KK2VudW0gaW50cl9zdGF0dXNfYml0cyB7CisJSW50clJ4RG9uZT0weDAwMDEsIEludHJSeEVycj0weDAwMDQsIEludHJSeEVtcHR5PTB4MDAyMCwKKwlJbnRyVHhEb25lPTB4MDAwMiwgSW50clR4RXJyb3I9MHgwMDA4LCBJbnRyVHhVbmRlcnJ1bj0weDAyMTAsCisJSW50clBDSUVycj0weDAwNDAsCisJSW50clN0YXRzTWF4PTB4MDA4MCwgSW50clJ4RWFybHk9MHgwMTAwLAorCUludHJSeE92ZXJmbG93PTB4MDQwMCwgSW50clJ4RHJvcHBlZD0weDA4MDAsIEludHJSeE5vQnVmPTB4MTAwMCwKKwlJbnRyVHhBYm9ydGVkPTB4MjAwMCwgSW50ckxpbmtDaGFuZ2U9MHg0MDAwLAorCUludHJSeFdha2VVcD0weDgwMDAsCisJSW50ck5vcm1hbFN1bW1hcnk9MHgwMDAzLCBJbnRyQWJub3JtYWxTdW1tYXJ5PTB4QzI2MCwKKwlJbnRyVHhEZXNjUmFjZT0weDA4MDAwMCwJLyogbWFwcGVkIGZyb20gSW50clN0YXR1czIgKi8KKwlJbnRyVHhFcnJTdW1tYXJ5PTB4MDgyMjE4LAorfTsKKworLyogQml0cyBpbiBXT0xjclNldC9XT0xjckNsciBhbmQgUHdyY3NyU2V0L1B3cmNzckNsciAqLworZW51bSB3b2xfYml0cyB7CisJV09MdWNhc3QJPSAweDEwLAorCVdPTG1hZ2ljCT0gMHgyMCwKKwlXT0xibWNhc3QJPSAweDMwLAorCVdPTGxua29uCT0gMHg0MCwKKwlXT0xsbmtvZmYJPSAweDgwLAorfTsKKworLyogVGhlIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3QgcnhfZGVzYyB7CisJczMyIHJ4X3N0YXR1czsKKwl1MzIgZGVzY19sZW5ndGg7IC8qIENoYWluIGZsYWcsIEJ1ZmZlci9mcmFtZSBsZW5ndGggKi8KKwl1MzIgYWRkcjsKKwl1MzIgbmV4dF9kZXNjOworfTsKK3N0cnVjdCB0eF9kZXNjIHsKKwlzMzIgdHhfc3RhdHVzOworCXUzMiBkZXNjX2xlbmd0aDsgLyogQ2hhaW4gZmxhZywgVHggQ29uZmlnLCBGcmFtZSBsZW5ndGggKi8KKwl1MzIgYWRkcjsKKwl1MzIgbmV4dF9kZXNjOworfTsKKworLyogSW5pdGlhbCB2YWx1ZSBmb3IgdHhfZGVzYy5kZXNjX2xlbmd0aCwgQnVmZmVyIHNpemUgZ29lcyB0byBiaXRzIDAtMTAgKi8KKyNkZWZpbmUgVFhERVNDCQkweDAwZTA4MDAwCisKK2VudW0gcnhfc3RhdHVzX2JpdHMgeworCVJ4T0s9MHg4MDAwLCBSeFdob2xlUGt0PTB4MDMwMCwgUnhFcnI9MHgwMDhGCit9OworCisvKiBCaXRzIGluICpfZGVzYy4qX3N0YXR1cyAqLworZW51bSBkZXNjX3N0YXR1c19iaXRzIHsKKwlEZXNjT3duPTB4ODAwMDAwMDAKK307CisKKy8qIEJpdHMgaW4gQ2hpcENtZC4gKi8KK2VudW0gY2hpcF9jbWRfYml0cyB7CisJQ21kSW5pdD0weDAxLCBDbWRTdGFydD0weDAyLCBDbWRTdG9wPTB4MDQsIENtZFJ4T249MHgwOCwKKwlDbWRUeE9uPTB4MTAsIENtZDFUeERlbWFuZD0weDIwLCBDbWRSeERlbWFuZD0weDQwLAorCUNtZDFFYXJseVJ4PTB4MDEsIENtZDFFYXJseVR4PTB4MDIsIENtZDFGRHVwbGV4PTB4MDQsCisJQ21kMU5vVHhQb2xsPTB4MDgsIENtZDFSZXNldD0weDgwLAorfTsKKworc3RydWN0IHJoaW5lX3ByaXZhdGUgeworCS8qIERlc2NyaXB0b3IgcmluZ3MgKi8KKwlzdHJ1Y3QgcnhfZGVzYyAqcnhfcmluZzsKKwlzdHJ1Y3QgdHhfZGVzYyAqdHhfcmluZzsKKwlkbWFfYWRkcl90IHJ4X3JpbmdfZG1hOworCWRtYV9hZGRyX3QgdHhfcmluZ19kbWE7CisKKwkvKiBUaGUgYWRkcmVzc2VzIG9mIHJlY2VpdmUtaW4tcGxhY2Ugc2tidWZmcy4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJZG1hX2FkZHJfdCByeF9za2J1ZmZfZG1hW1JYX1JJTkdfU0laRV07CisKKwkvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQtaW4tcGxhY2UgcGFja2V0L2J1ZmZlciwgZm9yIGxhdGVyIGZyZWUoKS4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisJZG1hX2FkZHJfdCB0eF9za2J1ZmZfZG1hW1RYX1JJTkdfU0laRV07CisKKwkvKiBUeCBib3VuY2UgYnVmZmVycyAqLworCXVuc2lnbmVkIGNoYXIgKnR4X2J1ZltUWF9SSU5HX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgKnR4X2J1ZnM7CisJZG1hX2FkZHJfdCB0eF9idWZzX2RtYTsKKworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCWxvbmcgcGlvYWRkcjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzcGlubG9ja190IGxvY2s7CisKKwkvKiBGcmVxdWVudGx5IHVzZWQgdmFsdWVzOiBrZWVwIHNvbWUgYWRqYWNlbnQgZm9yIGNhY2hlIGVmZmVjdC4gKi8KKwl1MzIgcXVpcmtzOworCXN0cnVjdCByeF9kZXNjICpyeF9oZWFkX2Rlc2M7CisJdW5zaWduZWQgaW50IGN1cl9yeCwgZGlydHlfcng7CS8qIFByb2R1Y2VyL2NvbnN1bWVyIHJpbmcgaW5kaWNlcyAqLworCXVuc2lnbmVkIGludCBjdXJfdHgsIGRpcnR5X3R4OworCXVuc2lnbmVkIGludCByeF9idWZfc3o7CQkvKiBCYXNlZCBvbiBNVFUrc2xhY2suICovCisJdTggd29sb3B0czsKKworCXU4IHR4X3RocmVzaCwgcnhfdGhyZXNoOworCisJc3RydWN0IG1paV9pZl9pbmZvIG1paV9pZjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7Cit9OworCitzdGF0aWMgaW50ICBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworc3RhdGljIGludCAgcmhpbmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJoaW5lX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICByaGluZV9zdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCByaGluZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCByaGluZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJoaW5lX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcmhpbmVfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIHJoaW5lX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpyaGluZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworc3RhdGljIGludCAgcmhpbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByaGluZV9zaHV0ZG93biAoc3RydWN0IGRldmljZSAqZ2Rldik7CisKKyNkZWZpbmUgUkhJTkVfV0FJVF9GT1IoY29uZGl0aW9uKSBkbyB7CQkJCQlcCisJaW50IGk9MTAyNDsJCQkJCQkJXAorCXdoaWxlICghKGNvbmRpdGlvbikgJiYgLS1pKQkJCQkJXAorCQk7CQkJCQkJCVwKKwlpZiAoZGVidWcgPiAxICYmIGkgPCA1MTIpCQkJCQlcCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlNGQgY3ljbGVzIHVzZWQgQCAlczolZFxuIiwJXAorCQkJCURSVl9OQU1FLCAxMDI0LWksIF9fZnVuY19fLCBfX0xJTkVfXyk7CVwKK30gd2hpbGUoMCkKKworc3RhdGljIGlubGluZSB1MzIgZ2V0X2ludHJfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCXUzMiBpbnRyX3N0YXR1czsKKworCWludHJfc3RhdHVzID0gaW9yZWFkMTYoaW9hZGRyICsgSW50clN0YXR1cyk7CisJLyogT24gUmhpbmUtSUksIEJpdCAzIGluZGljYXRlcyBUeCBkZXNjcmlwdG9yIHdyaXRlLWJhY2sgcmFjZS4gKi8KKwlpZiAocnAtPnF1aXJrcyAmIHJxU3RhdHVzV0JSYWNlKQorCQlpbnRyX3N0YXR1cyB8PSBpb3JlYWQ4KGlvYWRkciArIEludHJTdGF0dXMyKSA8PCAxNjsKKwlyZXR1cm4gaW50cl9zdGF0dXM7Cit9CisKKy8qCisgKiBHZXQgcG93ZXIgcmVsYXRlZCByZWdpc3RlcnMgaW50byBzYW5lIHN0YXRlLgorICogTm90aWZ5IHVzZXIgYWJvdXQgcGFzdCBXT0wgZXZlbnQuCisgKi8KK3N0YXRpYyB2b2lkIHJoaW5lX3Bvd2VyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisJdTE2IHdvbHN0YXQ7CisKKwlpZiAocnAtPnF1aXJrcyAmIHJxV09MKSB7CisJCS8qIE1ha2Ugc3VyZSBjaGlwIGlzIGluIHBvd2VyIHN0YXRlIEQwICovCisJCWlvd3JpdGU4KGlvcmVhZDgoaW9hZGRyICsgU3RpY2t5SFcpICYgMHhGQywgaW9hZGRyICsgU3RpY2t5SFcpOworCisJCS8qIERpc2FibGUgImZvcmNlIFBNRS1lbmFibGUiICovCisJCWlvd3JpdGU4KDB4ODAsIGlvYWRkciArIFdPTGNnQ2xyKTsKKworCQkvKiBDbGVhciBwb3dlci1ldmVudCBjb25maWcgYml0cyAoV09MKSAqLworCQlpb3dyaXRlOCgweEZGLCBpb2FkZHIgKyBXT0xjckNscik7CisJCS8qIE1vcmUgcmVjZW50IGNhcmRzIGNhbiBtYW5hZ2UgdHdvIGFkZGl0aW9uYWwgcGF0dGVybnMgKi8KKwkJaWYgKHJwLT5xdWlya3MgJiBycTZwYXR0ZXJucykKKwkJCWlvd3JpdGU4KDB4MDMsIGlvYWRkciArIFdPTGNyQ2xyMSk7CisKKwkJLyogU2F2ZSBwb3dlci1ldmVudCBzdGF0dXMgYml0cyAqLworCQl3b2xzdGF0ID0gaW9yZWFkOChpb2FkZHIgKyBQd3Jjc3JTZXQpOworCQlpZiAocnAtPnF1aXJrcyAmIHJxNnBhdHRlcm5zKQorCQkJd29sc3RhdCB8PSAoaW9yZWFkOChpb2FkZHIgKyBQd3Jjc3JTZXQxKSAmIDB4MDMpIDw8IDg7CisKKwkJLyogQ2xlYXIgcG93ZXItZXZlbnQgc3RhdHVzIGJpdHMgKi8KKwkJaW93cml0ZTgoMHhGRiwgaW9hZGRyICsgUHdyY3NyQ2xyKTsKKwkJaWYgKHJwLT5xdWlya3MgJiBycTZwYXR0ZXJucykKKwkJCWlvd3JpdGU4KDB4MDMsIGlvYWRkciArIFB3cmNzckNscjEpOworCisJCWlmICh3b2xzdGF0KSB7CisJCQljaGFyICpyZWFzb247CisJCQlzd2l0Y2ggKHdvbHN0YXQpIHsKKwkJCWNhc2UgV09MbWFnaWM6CisJCQkJcmVhc29uID0gIk1hZ2ljIHBhY2tldCI7CisJCQkJYnJlYWs7CisJCQljYXNlIFdPTGxua29uOgorCQkJCXJlYXNvbiA9ICJMaW5rIHdlbnQgdXAiOworCQkJCWJyZWFrOworCQkJY2FzZSBXT0xsbmtvZmY6CisJCQkJcmVhc29uID0gIkxpbmsgd2VudCBkb3duIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgV09MdWNhc3Q6CisJCQkJcmVhc29uID0gIlVuaWNhc3QgcGFja2V0IjsKKwkJCQlicmVhazsKKwkJCWNhc2UgV09MYm1jYXN0OgorCQkJCXJlYXNvbiA9ICJNdWx0aWNhc3QvYnJvYWRjYXN0IHBhY2tldCI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJlYXNvbiA9ICJVbmtub3duIjsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBXb2tlIHN5c3RlbSB1cC4gUmVhc29uOiAlcy5cbiIsCisJCQkgICAgICAgRFJWX05BTUUsIHJlYXNvbik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJoaW5lX2NoaXBfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisKKwlpb3dyaXRlOChDbWQxUmVzZXQsIGlvYWRkciArIENoaXBDbWQxKTsKKwlJT1NZTkM7CisKKwlpZiAoaW9yZWFkOChpb2FkZHIgKyBDaGlwQ21kMSkgJiBDbWQxUmVzZXQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlc2V0IG5vdCBjb21wbGV0ZSB5ZXQuICIKKwkJCSJUcnlpbmcgaGFyZGVyLlxuIiwgRFJWX05BTUUpOworCisJCS8qIEZvcmNlIHJlc2V0ICovCisJCWlmIChycC0+cXVpcmtzICYgcnFGb3JjZVJlc2V0KQorCQkJaW93cml0ZTgoMHg0MCwgaW9hZGRyICsgTWlzY0NtZCk7CisKKwkJLyogUmVzZXQgY2FuIHRha2Ugc29tZXdoYXQgbG9uZ2VyIChyYXJlKSAqLworCQlSSElORV9XQUlUX0ZPUighKGlvcmVhZDgoaW9hZGRyICsgQ2hpcENtZDEpICYgQ21kMVJlc2V0KSk7CisJfQorCisJaWYgKGRlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlc2V0ICVzLlxuIiwgZGV2LT5uYW1lLAorCQkJKGlvcmVhZDgoaW9hZGRyICsgQ2hpcENtZDEpICYgQ21kMVJlc2V0KSA/CisJCQkiZmFpbGVkIiA6ICJzdWNjZWVkZWQiKTsKK30KKworI2lmZGVmIFVTRV9NTUlPCitzdGF0aWMgdm9pZCBlbmFibGVfbW1pbyhsb25nIHBpb2FkZHIsIHUzMiBxdWlya3MpCit7CisJaW50IG47CisJaWYgKHF1aXJrcyAmIHJxUmhpbmVJKSB7CisJCS8qIE1vcmUgcmVjZW50IGRvY3Mgc2F5IHRoYXQgdGhpcyBiaXQgaXMgcmVzZXJ2ZWQgLi4uICovCisJCW4gPSBpbmIocGlvYWRkciArIENvbmZpZ0EpIHwgMHgyMDsKKwkJb3V0YihuLCBwaW9hZGRyICsgQ29uZmlnQSk7CisJfSBlbHNlIHsKKwkJbiA9IGluYihwaW9hZGRyICsgQ29uZmlnRCkgfCAweDgwOworCQlvdXRiKG4sIHBpb2FkZHIgKyBDb25maWdEKTsKKwl9Cit9CisjZW5kaWYKKworLyoKKyAqIExvYWRzIGJ5dGVzIDB4MDAtMHgwNSwgMHg2RS0weDZGLCAweDc4LTB4N0IgZnJvbSBFRVBST00KKyAqIChwbHVzIDB4NkMgZm9yIFJoaW5lLUkvSUkpCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCByaGluZV9yZWxvYWRfZWVwcm9tKGxvbmcgcGlvYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisKKwlvdXRiKDB4MjAsIHBpb2FkZHIgKyBNQUNSZWdFRWNzcik7CisJUkhJTkVfV0FJVF9GT1IoIShpbmIocGlvYWRkciArIE1BQ1JlZ0VFY3NyKSAmIDB4MjApKTsKKworI2lmZGVmIFVTRV9NTUlPCisJLyoKKwkgKiBSZWxvYWRpbmcgZnJvbSBFRVBST00gb3ZlcndyaXRlcyBDb25maWdBLUQsIHNvIHdlIG11c3QgcmUtZW5hYmxlCisJICogTU1JTy4gSWYgcmVsb2FkaW5nIEVFUFJPTSB3YXMgZG9uZSBmaXJzdCB0aGlzIGNvdWxkIGJlIGF2b2lkZWQsIGJ1dAorCSAqIGl0IGlzIG5vdCBrbm93biBpZiB0aGF0IHN0aWxsIHdvcmtzIHdpdGggdGhlICJ3aW45OC1yZWJvb3QiIHByb2JsZW0uCisJICovCisJZW5hYmxlX21taW8ocGlvYWRkciwgcnAtPnF1aXJrcyk7CisjZW5kaWYKKworCS8qIFR1cm4gb2ZmIEVFUFJPTS1jb250cm9sbGVkIHdha2UtdXAgKG1hZ2ljIHBhY2tldCkgKi8KKwlpZiAocnAtPnF1aXJrcyAmIHJxV09MKQorCQlpb3dyaXRlOChpb3JlYWQ4KGlvYWRkciArIENvbmZpZ0EpICYgMHhGQywgaW9hZGRyICsgQ29uZmlnQSk7CisKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCByaGluZV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXJoaW5lX2ludGVycnVwdChkZXYtPmlycSwgKHZvaWQgKilkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJoaW5lX2h3X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbG9uZyBwaW9hZGRyKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBSZXNldCB0aGUgY2hpcCB0byBlcmFzZSBwcmV2aW91cyBtaXNjb25maWd1cmF0aW9uLiAqLworCXJoaW5lX2NoaXBfcmVzZXQoZGV2KTsKKworCS8qIFJoaW5lLUkgbmVlZHMgZXh0cmEgdGltZSB0byByZWN1cGVyYXRlIGJlZm9yZSBFRVBST00gcmVsb2FkICovCisJaWYgKHJwLT5xdWlya3MgJiBycVJoaW5lSSkKKwkJbXNsZWVwKDUpOworCisJLyogUmVsb2FkIEVFUFJPTSBjb250cm9sbGVkIGJ5dGVzIGNsZWFyZWQgYnkgc29mdCByZXNldCAqLworCXJoaW5lX3JlbG9hZF9lZXByb20ocGlvYWRkciwgZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcmhpbmVfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnA7CisJaW50IGksIHJjOworCXU4IHBjaV9yZXY7CisJdTMyIHF1aXJrczsKKwlsb25nIHBpb2FkZHI7CisJbG9uZyBtZW1hZGRyOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCWludCBpb19zaXplLCBwaHlfaWQ7CisJY29uc3QgY2hhciAqbmFtZTsKKyNpZmRlZiBVU0VfTU1JTworCWludCBiYXIgPSAxOworI2Vsc2UKKwlpbnQgYmFyID0gMDsKKyNlbmRpZgorCisvKiB3aGVuIGJ1aWx0IGludG8gdGhlIGtlcm5lbCwgd2Ugb25seSBwcmludCB2ZXJzaW9uIGlmIGRldmljZSBpcyBmb3VuZCAqLworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnBjaV9yZXYpOworCisJaW9fc2l6ZSA9IDI1NjsKKwlwaHlfaWQgPSAwOworCXF1aXJrcyA9IDA7CisJbmFtZSA9ICJSaGluZSI7CisJaWYgKHBjaV9yZXYgPCBWVHVua25vd24wKSB7CisJCXF1aXJrcyA9IHJxUmhpbmVJOworCQlpb19zaXplID0gMTI4OworCX0KKwllbHNlIGlmIChwY2lfcmV2ID49IFZUNjEwMikgeworCQlxdWlya3MgPSBycVdPTCB8IHJxRm9yY2VSZXNldDsKKwkJaWYgKHBjaV9yZXYgPCBWVDYxMDUpIHsKKwkJCW5hbWUgPSAiUmhpbmUgSUkiOworCQkJcXVpcmtzIHw9IHJxU3RhdHVzV0JSYWNlOwkvKiBSaGluZS1JSSBleGNsdXNpdmUgKi8KKwkJfQorCQllbHNlIHsKKwkJCXBoeV9pZCA9IDE7CS8qIEludGVncmF0ZWQgUEhZLCBwaHlfaWQgZml4ZWQgdG8gMSAqLworCQkJaWYgKHBjaV9yZXYgPj0gVlQ2MTA1X0IwKQorCQkJCXF1aXJrcyB8PSBycTZwYXR0ZXJuczsKKwkJCWlmIChwY2lfcmV2IDwgVlQ2MTA1TSkKKwkJCQluYW1lID0gIlJoaW5lIElJSSI7CisJCQllbHNlCisJCQkJbmFtZSA9ICJSaGluZSBJSUkgKE1hbmFnZW1lbnQgQWRhcHRlcikiOworCQl9CisJfQorCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKworCS8qIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBzdXBwb3J0ZWQgKi8KKwlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiMzItYml0IFBDSSBETUEgYWRkcmVzc2VzIG5vdCBzdXBwb3J0ZWQgYnkgIgorCQkgICAgICAgInRoZSBjYXJkIT9cbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApIDwgaW9fc2l6ZSkgfHwKKwkgICAgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkgPCBpb19zaXplKSkgeworCQlyYyA9IC1FSU87CisJCXByaW50ayhLRVJOX0VSUiAiSW5zdWZmaWNpZW50IFBDSSByZXNvdXJjZXMsIGFib3J0aW5nXG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXBpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJbWVtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCByaGluZV9wcml2YXRlKSk7CisJaWYgKCFkZXYpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlwcmludGsoS0VSTl9FUlIgImFsbG9jX2V0aGVyZGV2IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlycCA9IG5ldGRldl9wcml2KGRldik7CisJcnAtPnF1aXJrcyA9IHF1aXJrczsKKwlycC0+cGlvYWRkciA9IHBpb2FkZHI7CisJcnAtPnBkZXYgPSBwZGV2OworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKworCWlvYWRkciA9IHBjaV9pb21hcChwZGV2LCBiYXIsIGlvX3NpemUpOworCWlmICghaW9hZGRyKSB7CisJCXJjID0gLUVJTzsKKwkJcHJpbnRrKEtFUk5fRVJSICJpb3JlbWFwIGZhaWxlZCBmb3IgZGV2aWNlICVzLCByZWdpb24gMHglWCAiCisJCSAgICAgICAiQCAweCVsWFxuIiwgcGNpX25hbWUocGRldiksIGlvX3NpemUsIG1lbWFkZHIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisjaWZkZWYgVVNFX01NSU8KKwllbmFibGVfbW1pbyhwaW9hZGRyLCBxdWlya3MpOworCisJLyogQ2hlY2sgdGhhdCBzZWxlY3RlZCBNTUlPIHJlZ2lzdGVycyBtYXRjaCB0aGUgUElPIG9uZXMgKi8KKwlpID0gMDsKKwl3aGlsZSAobW1pb192ZXJpZnlfcmVnaXN0ZXJzW2ldKSB7CisJCWludCByZWcgPSBtbWlvX3ZlcmlmeV9yZWdpc3RlcnNbaSsrXTsKKwkJdW5zaWduZWQgY2hhciBhID0gaW5iKHBpb2FkZHIrcmVnKTsKKwkJdW5zaWduZWQgY2hhciBiID0gcmVhZGIoaW9hZGRyK3JlZyk7CisJCWlmIChhICE9IGIpIHsKKwkJCXJjID0gLUVJTzsKKwkJCXByaW50ayhLRVJOX0VSUiAiTU1JTyBkbyBub3QgbWF0Y2ggUElPIFslMDJ4XSAiCisJCQkgICAgICAgIiglMDJ4ICE9ICUwMngpXG4iLCByZWcsIGEsIGIpOworCQkJZ290byBlcnJfb3V0X3VubWFwOworCQl9CisJfQorI2VuZGlmIC8qIFVTRV9NTUlPICovCisKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvYWRkcjsKKwlycC0+YmFzZSA9IGlvYWRkcjsKKworCS8qIEdldCBjaGlwIHJlZ2lzdGVycyBpbnRvIGEgc2FuZSBzdGF0ZSAqLworCXJoaW5lX3Bvd2VyX2luaXQoZGV2KTsKKwlyaGluZV9od19pbml0KGRldiwgcGlvYWRkcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gaW9yZWFkOChpb2FkZHIgKyBTdGF0aW9uQWRkciArIGkpOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CisJCXJjID0gLUVJTzsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIE1BQyBhZGRyZXNzXG4iKTsKKwkJZ290byBlcnJfb3V0X3VubWFwOworCX0KKworCS8qIEZvciBSaGluZS1JL0lJLCBwaHlfaWQgaXMgbG9hZGVkIGZyb20gRUVQUk9NICovCisJaWYgKCFwaHlfaWQpCisJCXBoeV9pZCA9IGlvcmVhZDgoaW9hZGRyICsgMHg2Qyk7CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKworCXNwaW5fbG9ja19pbml0KCZycC0+bG9jayk7CisJcnAtPm1paV9pZi5kZXYgPSBkZXY7CisJcnAtPm1paV9pZi5tZGlvX3JlYWQgPSBtZGlvX3JlYWQ7CisJcnAtPm1paV9pZi5tZGlvX3dyaXRlID0gbWRpb193cml0ZTsKKwlycC0+bWlpX2lmLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlycC0+bWlpX2lmLnJlZ19udW1fbWFzayA9IDB4MWY7CisKKwkvKiBUaGUgY2hpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9IHJoaW5lX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSByaGluZV9zdGFydF90eDsKKwlkZXYtPnN0b3AgPSByaGluZV9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9IHJoaW5lX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHJoaW5lX3NldF9yeF9tb2RlOworCWRldi0+ZG9faW9jdGwgPSBuZXRkZXZfaW9jdGw7CisJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CisJZGV2LT50eF90aW1lb3V0ID0gcmhpbmVfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gcmhpbmVfcG9sbDsKKyNlbmRpZgorCWlmIChycC0+cXVpcmtzICYgcnFSaGluZUkpCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TR3xORVRJRl9GX0hXX0NTVU07CisKKwkvKiBkZXYtPm5hbWUgbm90IGRlZmluZWQgYmVmb3JlIHJlZ2lzdGVyX25ldGRldigpISAqLworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogVklBICVzIGF0IDB4JWx4LCAiLAorCSAgICAgICBkZXYtPm5hbWUsIG5hbWUsCisjaWZkZWYgVVNFX01NSU8KKwkJbWVtYWRkcgorI2Vsc2UKKwkJKGxvbmcpaW9hZGRyCisjZW5kaWYKKwkJICk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlwcmludGsoIiUyLjJ4OiIsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiJTIuMngsIElSUSAlZC5cbiIsIGRldi0+ZGV2X2FkZHJbaV0sIHBkZXYtPmlycSk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCXsKKwkJdTE2IG1paV9jbWQ7CisJCWludCBtaWlfc3RhdHVzID0gbWRpb19yZWFkKGRldiwgcGh5X2lkLCAxKTsKKwkJbWlpX2NtZCA9IG1kaW9fcmVhZChkZXYsIHBoeV9pZCwgTUlJX0JNQ1IpICYgfkJNQ1JfSVNPTEFURTsKKwkJbWRpb193cml0ZShkZXYsIHBoeV9pZCwgTUlJX0JNQ1IsIG1paV9jbWQpOworCQlpZiAobWlpX3N0YXR1cyAhPSAweGZmZmYgJiYgbWlpX3N0YXR1cyAhPSAweDAwMDApIHsKKwkJCXJwLT5taWlfaWYuYWR2ZXJ0aXNpbmcgPSBtZGlvX3JlYWQoZGV2LCBwaHlfaWQsIDQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSBQSFkgZm91bmQgYXQgYWRkcmVzcyAiCisJCQkgICAgICAgIiVkLCBzdGF0dXMgMHglNC40eCBhZHZlcnRpc2luZyAlNC40eCAiCisJCQkgICAgICAgIkxpbmsgJTQuNHguXG4iLCBkZXYtPm5hbWUsIHBoeV9pZCwKKwkJCSAgICAgICBtaWlfc3RhdHVzLCBycC0+bWlpX2lmLmFkdmVydGlzaW5nLAorCQkJICAgICAgIG1kaW9fcmVhZChkZXYsIHBoeV9pZCwgNSkpOworCisJCQkvKiBzZXQgSUZGX1JVTk5JTkcgKi8KKwkJCWlmIChtaWlfc3RhdHVzICYgQk1TUl9MU1RBVFVTKQorCQkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJCWVsc2UKKwkJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJCX0KKwl9CisJcnAtPm1paV9pZi5waHlfaWQgPSBwaHlfaWQ7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF91bm1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCBpb2FkZHIpOworZXJyX291dF9mcmVlX3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dF9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldihkZXYpOworZXJyX291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqcmluZzsKKwlkbWFfYWRkcl90IHJpbmdfZG1hOworCisJcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHJwLT5wZGV2LAorCQkJCSAgICBSWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpICsKKwkJCQkgICAgVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSwKKwkJCQkgICAgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgYWxsb2NhdGUgRE1BIG1lbW9yeS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKHJwLT5xdWlya3MgJiBycVJoaW5lSSkgeworCQlycC0+dHhfYnVmcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHJwLT5wZGV2LAorCQkJCQkJICAgUEtUX0JVRl9TWiAqIFRYX1JJTkdfU0laRSwKKwkJCQkJCSAgICZycC0+dHhfYnVmc19kbWEpOworCQlpZiAocnAtPnR4X2J1ZnMgPT0gTlVMTCkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChycC0+cGRldiwKKwkJCQkgICAgUlhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSArCisJCQkJICAgIFRYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYyksCisJCQkJICAgIHJpbmcsIHJpbmdfZG1hKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJcnAtPnJ4X3JpbmcgPSByaW5nOworCXJwLT50eF9yaW5nID0gcmluZyArIFJYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYyk7CisJcnAtPnJ4X3JpbmdfZG1hID0gcmluZ19kbWE7CisJcnAtPnR4X3JpbmdfZG1hID0gcmluZ19kbWEgKyBSWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHJwLT5wZGV2LAorCQkJICAgIFJYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKworCQkJICAgIFRYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYyksCisJCQkgICAgcnAtPnJ4X3JpbmcsIHJwLT5yeF9yaW5nX2RtYSk7CisJcnAtPnR4X3JpbmcgPSBOVUxMOworCisJaWYgKHJwLT50eF9idWZzKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHJwLT5wZGV2LCBQS1RfQlVGX1NaICogVFhfUklOR19TSVpFLAorCQkJCSAgICBycC0+dHhfYnVmcywgcnAtPnR4X2J1ZnNfZG1hKTsKKworCXJwLT50eF9idWZzID0gTlVMTDsKKworfQorCitzdGF0aWMgdm9pZCBhbGxvY19yYnVmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJZG1hX2FkZHJfdCBuZXh0OworCWludCBpOworCisJcnAtPmRpcnR5X3J4ID0gcnAtPmN1cl9yeCA9IDA7CisKKwlycC0+cnhfYnVmX3N6ID0gKGRldi0+bXR1IDw9IDE1MDAgPyBQS1RfQlVGX1NaIDogZGV2LT5tdHUgKyAzMik7CisJcnAtPnJ4X2hlYWRfZGVzYyA9ICZycC0+cnhfcmluZ1swXTsKKwluZXh0ID0gcnAtPnJ4X3JpbmdfZG1hOworCisJLyogSW5pdCB0aGUgcmluZyBlbnRyaWVzICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXJwLT5yeF9yaW5nW2ldLnJ4X3N0YXR1cyA9IDA7CisJCXJwLT5yeF9yaW5nW2ldLmRlc2NfbGVuZ3RoID0gY3B1X3RvX2xlMzIocnAtPnJ4X2J1Zl9zeik7CisJCW5leHQgKz0gc2l6ZW9mKHN0cnVjdCByeF9kZXNjKTsKKwkJcnAtPnJ4X3JpbmdbaV0ubmV4dF9kZXNjID0gY3B1X3RvX2xlMzIobmV4dCk7CisJCXJwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCX0KKwkvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IGFzIHdyYXBwaW5nIHRoZSByaW5nLiAqLworCXJwLT5yeF9yaW5nW2ktMV0ubmV4dF9kZXNjID0gY3B1X3RvX2xlMzIocnAtPnJ4X3JpbmdfZG1hKTsKKworCS8qIEZpbGwgaW4gdGhlIFJ4IGJ1ZmZlcnMuICBIYW5kbGUgYWxsb2NhdGlvbiBmYWlsdXJlIGdyYWNlZnVsbHkuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKHJwLT5yeF9idWZfc3opOworCQlycC0+cnhfc2tidWZmW2ldID0gc2tiOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlicmVhazsKKwkJc2tiLT5kZXYgPSBkZXY7ICAgICAgICAgICAgICAgICAvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisKKwkJcnAtPnJ4X3NrYnVmZl9kbWFbaV0gPQorCQkJcGNpX21hcF9zaW5nbGUocnAtPnBkZXYsIHNrYi0+dGFpbCwgcnAtPnJ4X2J1Zl9zeiwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQlycC0+cnhfcmluZ1tpXS5hZGRyID0gY3B1X3RvX2xlMzIocnAtPnJ4X3NrYnVmZl9kbWFbaV0pOworCQlycC0+cnhfcmluZ1tpXS5yeF9zdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duKTsKKwl9CisJcnAtPmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkoaSAtIFJYX1JJTkdfU0laRSk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcmJ1ZnMoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJLyogRnJlZSBhbGwgdGhlIHNrYnVmZnMgaW4gdGhlIFJ4IHF1ZXVlLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlycC0+cnhfcmluZ1tpXS5yeF9zdGF0dXMgPSAwOworCQlycC0+cnhfcmluZ1tpXS5hZGRyID0gY3B1X3RvX2xlMzIoMHhCQURGMDBEMCk7IC8qIEFuIGludmFsaWQgYWRkcmVzcy4gKi8KKwkJaWYgKHJwLT5yeF9za2J1ZmZbaV0pIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUocnAtPnBkZXYsCisJCQkJCSBycC0+cnhfc2tidWZmX2RtYVtpXSwKKwkJCQkJIHJwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHJwLT5yeF9za2J1ZmZbaV0pOworCQl9CisJCXJwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgYWxsb2NfdGJ1ZnMoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWRtYV9hZGRyX3QgbmV4dDsKKwlpbnQgaTsKKworCXJwLT5kaXJ0eV90eCA9IHJwLT5jdXJfdHggPSAwOworCW5leHQgPSBycC0+dHhfcmluZ19kbWE7CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXJwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQlycC0+dHhfcmluZ1tpXS50eF9zdGF0dXMgPSAwOworCQlycC0+dHhfcmluZ1tpXS5kZXNjX2xlbmd0aCA9IGNwdV90b19sZTMyKFRYREVTQyk7CisJCW5leHQgKz0gc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKTsKKwkJcnAtPnR4X3JpbmdbaV0ubmV4dF9kZXNjID0gY3B1X3RvX2xlMzIobmV4dCk7CisJCXJwLT50eF9idWZbaV0gPSAmcnAtPnR4X2J1ZnNbaSAqIFBLVF9CVUZfU1pdOworCX0KKwlycC0+dHhfcmluZ1tpLTFdLm5leHRfZGVzYyA9IGNwdV90b19sZTMyKHJwLT50eF9yaW5nX2RtYSk7CisKK30KKworc3RhdGljIHZvaWQgZnJlZV90YnVmcyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJcnAtPnR4X3JpbmdbaV0udHhfc3RhdHVzID0gMDsKKwkJcnAtPnR4X3JpbmdbaV0uZGVzY19sZW5ndGggPSBjcHVfdG9fbGUzMihUWERFU0MpOworCQlycC0+dHhfcmluZ1tpXS5hZGRyID0gY3B1X3RvX2xlMzIoMHhCQURGMDBEMCk7IC8qIEFuIGludmFsaWQgYWRkcmVzcy4gKi8KKwkJaWYgKHJwLT50eF9za2J1ZmZbaV0pIHsKKwkJCWlmIChycC0+dHhfc2tidWZmX2RtYVtpXSkgeworCQkJCXBjaV91bm1hcF9zaW5nbGUocnAtPnBkZXYsCisJCQkJCQkgcnAtPnR4X3NrYnVmZl9kbWFbaV0sCisJCQkJCQkgcnAtPnR4X3NrYnVmZltpXS0+bGVuLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJfQorCQkJZGV2X2tmcmVlX3NrYihycC0+dHhfc2tidWZmW2ldKTsKKwkJfQorCQlycC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJcnAtPnR4X2J1ZltpXSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCByaGluZV9jaGVja19tZWRpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaW5pdF9tZWRpYSkKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisKKwltaWlfY2hlY2tfbWVkaWEoJnJwLT5taWlfaWYsIGRlYnVnLCBpbml0X21lZGlhKTsKKworCWlmIChycC0+bWlpX2lmLmZ1bGxfZHVwbGV4KQorCSAgICBpb3dyaXRlOChpb3JlYWQ4KGlvYWRkciArIENoaXBDbWQxKSB8IENtZDFGRHVwbGV4LAorCQkgICBpb2FkZHIgKyBDaGlwQ21kMSk7CisJZWxzZQorCSAgICBpb3dyaXRlOChpb3JlYWQ4KGlvYWRkciArIENoaXBDbWQxKSAmIH5DbWQxRkR1cGxleCwKKwkJICAgaW9hZGRyICsgQ2hpcENtZDEpOworfQorCitzdGF0aWMgdm9pZCBpbml0X3JlZ2lzdGVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWlvd3JpdGU4KGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIFN0YXRpb25BZGRyICsgaSk7CisKKwkvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVycy4gKi8KKwlpb3dyaXRlMTYoMHgwMDA2LCBpb2FkZHIgKyBQQ0lCdXNDb25maWcpOwkvKiBUdW5lIGNvbmZpZ3VyYXRpb24/Pz8gKi8KKwkvKiBDb25maWd1cmUgaW5pdGlhbCBGSUZPIHRocmVzaG9sZHMuICovCisJaW93cml0ZTgoMHgyMCwgaW9hZGRyICsgVHhDb25maWcpOworCXJwLT50eF90aHJlc2ggPSAweDIwOworCXJwLT5yeF90aHJlc2ggPSAweDYwOwkJLyogV3JpdHRlbiBpbiByaGluZV9zZXRfcnhfbW9kZSgpLiAqLworCisJaW93cml0ZTMyKHJwLT5yeF9yaW5nX2RtYSwgaW9hZGRyICsgUnhSaW5nUHRyKTsKKwlpb3dyaXRlMzIocnAtPnR4X3JpbmdfZG1hLCBpb2FkZHIgKyBUeFJpbmdQdHIpOworCisJcmhpbmVfc2V0X3J4X21vZGUoZGV2KTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCWlvd3JpdGUxNihJbnRyUnhEb25lIHwgSW50clJ4RXJyIHwgSW50clJ4RW1wdHl8IEludHJSeE92ZXJmbG93IHwKKwkgICAgICAgSW50clJ4RHJvcHBlZCB8IEludHJSeE5vQnVmIHwgSW50clR4QWJvcnRlZCB8CisJICAgICAgIEludHJUeERvbmUgfCBJbnRyVHhFcnJvciB8IEludHJUeFVuZGVycnVuIHwKKwkgICAgICAgSW50clBDSUVyciB8IEludHJTdGF0c01heCB8IEludHJMaW5rQ2hhbmdlLAorCSAgICAgICBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKworCWlvd3JpdGUxNihDbWRTdGFydCB8IENtZFR4T24gfCBDbWRSeE9uIHwgKENtZDFOb1R4UG9sbCA8PCA4KSwKKwkgICAgICAgaW9hZGRyICsgQ2hpcENtZCk7CisJcmhpbmVfY2hlY2tfbWVkaWEoZGV2LCAxKTsKK30KKworLyogRW5hYmxlIE1JSSBsaW5rIHN0YXR1cyBhdXRvLXBvbGxpbmcgKHJlcXVpcmVkIGZvciBJbnRyTGlua0NoYW5nZSkgKi8KK3N0YXRpYyB2b2lkIHJoaW5lX2VuYWJsZV9saW5rbW9uKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCWlvd3JpdGU4KDAsIGlvYWRkciArIE1JSUNtZCk7CisJaW93cml0ZTgoTUlJX0JNU1IsIGlvYWRkciArIE1JSVJlZ0FkZHIpOworCWlvd3JpdGU4KDB4ODAsIGlvYWRkciArIE1JSUNtZCk7CisKKwlSSElORV9XQUlUX0ZPUigoaW9yZWFkOChpb2FkZHIgKyBNSUlSZWdBZGRyKSAmIDB4MjApKTsKKworCWlvd3JpdGU4KE1JSV9CTVNSIHwgMHg0MCwgaW9hZGRyICsgTUlJUmVnQWRkcik7Cit9CisKKy8qIERpc2FibGUgTUlJIGxpbmsgc3RhdHVzIGF1dG8tcG9sbGluZyAocmVxdWlyZWQgZm9yIE1ESU8gYWNjZXNzKSAqLworc3RhdGljIHZvaWQgcmhpbmVfZGlzYWJsZV9saW5rbW9uKHZvaWQgX19pb21lbSAqaW9hZGRyLCB1MzIgcXVpcmtzKQoreworCWlvd3JpdGU4KDAsIGlvYWRkciArIE1JSUNtZCk7CisKKwlpZiAocXVpcmtzICYgcnFSaGluZUkpIHsKKwkJaW93cml0ZTgoMHgwMSwgaW9hZGRyICsgTUlJUmVnQWRkcik7CS8vIE1JSV9CTVNSCisKKwkJLyogQ2FuIGJlIGNhbGxlZCBmcm9tIElTUi4gRXZpbC4gKi8KKwkJbWRlbGF5KDEpOworCisJCS8qIDB4ODAgbXVzdCBiZSBzZXQgaW1tZWRpYXRlbHkgYmVmb3JlIHR1cm5pbmcgaXQgb2ZmICovCisJCWlvd3JpdGU4KDB4ODAsIGlvYWRkciArIE1JSUNtZCk7CisKKwkJUkhJTkVfV0FJVF9GT1IoaW9yZWFkOChpb2FkZHIgKyBNSUlSZWdBZGRyKSAmIDB4MjApOworCisJCS8qIEhlaC4gTm93IGNsZWFyIDB4ODAgYWdhaW4uICovCisJCWlvd3JpdGU4KDAsIGlvYWRkciArIE1JSUNtZCk7CisJfQorCWVsc2UKKwkJUkhJTkVfV0FJVF9GT1IoaW9yZWFkOChpb2FkZHIgKyBNSUlSZWdBZGRyKSAmIDB4ODApOworfQorCisvKiBSZWFkIGFuZCB3cml0ZSBvdmVyIHRoZSBNSUkgTWFuYWdlbWVudCBEYXRhIEkvTyAoTURJTykgaW50ZXJmYWNlLiAqLworCitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnbnVtKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKwlpbnQgcmVzdWx0OworCisJcmhpbmVfZGlzYWJsZV9saW5rbW9uKGlvYWRkciwgcnAtPnF1aXJrcyk7CisKKwkvKiByaGluZV9kaXNhYmxlX2xpbmttb24gYWxyZWFkeSBjbGVhcmVkIE1JSUNtZCAqLworCWlvd3JpdGU4KHBoeV9pZCwgaW9hZGRyICsgTUlJUGh5QWRkcik7CisJaW93cml0ZTgocmVnbnVtLCBpb2FkZHIgKyBNSUlSZWdBZGRyKTsKKwlpb3dyaXRlOCgweDQwLCBpb2FkZHIgKyBNSUlDbWQpOwkJLyogVHJpZ2dlciByZWFkICovCisJUkhJTkVfV0FJVF9GT1IoIShpb3JlYWQ4KGlvYWRkciArIE1JSUNtZCkgJiAweDQwKSk7CisJcmVzdWx0ID0gaW9yZWFkMTYoaW9hZGRyICsgTUlJRGF0YSk7CisKKwlyaGluZV9lbmFibGVfbGlua21vbihpb2FkZHIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IHJlZ251bSwgaW50IHZhbHVlKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKworCXJoaW5lX2Rpc2FibGVfbGlua21vbihpb2FkZHIsIHJwLT5xdWlya3MpOworCisJLyogcmhpbmVfZGlzYWJsZV9saW5rbW9uIGFscmVhZHkgY2xlYXJlZCBNSUlDbWQgKi8KKwlpb3dyaXRlOChwaHlfaWQsIGlvYWRkciArIE1JSVBoeUFkZHIpOworCWlvd3JpdGU4KHJlZ251bSwgaW9hZGRyICsgTUlJUmVnQWRkcik7CisJaW93cml0ZTE2KHZhbHVlLCBpb2FkZHIgKyBNSUlEYXRhKTsKKwlpb3dyaXRlOCgweDIwLCBpb2FkZHIgKyBNSUlDbWQpOwkJLyogVHJpZ2dlciB3cml0ZSAqLworCVJISU5FX1dBSVRfRk9SKCEoaW9yZWFkOChpb2FkZHIgKyBNSUlDbWQpICYgMHgyMCkpOworCisJcmhpbmVfZW5hYmxlX2xpbmttb24oaW9hZGRyKTsKK30KKworc3RhdGljIGludCByaGluZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCWludCByYzsKKworCXJjID0gcmVxdWVzdF9pcnEocnAtPnBkZXYtPmlycSwgJnJoaW5lX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwKKwkJCWRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJoaW5lX29wZW4oKSBpcnEgJWQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBycC0+cGRldi0+aXJxKTsKKworCXJjID0gYWxsb2NfcmluZyhkZXYpOworCWlmIChyYykgeworCQlmcmVlX2lycShycC0+cGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gcmM7CisJfQorCWFsbG9jX3JidWZzKGRldik7CisJYWxsb2NfdGJ1ZnMoZGV2KTsKKwlyaGluZV9jaGlwX3Jlc2V0KGRldik7CisJaW5pdF9yZWdpc3RlcnMoZGV2KTsKKwlpZiAoZGVidWcgPiAyKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgcmhpbmVfb3BlbigpLCBzdGF0dXMgJTQuNHggIgorCQkgICAgICAgIk1JSSBzdGF0dXM6ICU0LjR4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgaW9yZWFkMTYoaW9hZGRyICsgQ2hpcENtZCksCisJCSAgICAgICBtZGlvX3JlYWQoZGV2LCBycC0+bWlpX2lmLnBoeV9pZCwgTUlJX0JNU1IpKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmhpbmVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlNC40eCwgUEhZIHN0YXR1cyAiCisJICAgICAgICIlNC40eCwgcmVzZXR0aW5nLi4uXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGlvcmVhZDE2KGlvYWRkciArIEludHJTdGF0dXMpLAorCSAgICAgICBtZGlvX3JlYWQoZGV2LCBycC0+bWlpX2lmLnBoeV9pZCwgTUlJX0JNU1IpKTsKKworCS8qIHByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHJ4IGludGVycnVwdHMgKi8KKwlkaXNhYmxlX2lycShycC0+cGRldi0+aXJxKTsKKworCXNwaW5fbG9jaygmcnAtPmxvY2spOworCisJLyogY2xlYXIgYWxsIGRlc2NyaXB0b3JzICovCisJZnJlZV90YnVmcyhkZXYpOworCWZyZWVfcmJ1ZnMoZGV2KTsKKwlhbGxvY190YnVmcyhkZXYpOworCWFsbG9jX3JidWZzKGRldik7CisKKwkvKiBSZWluaXRpYWxpemUgdGhlIGhhcmR3YXJlLiAqLworCXJoaW5lX2NoaXBfcmVzZXQoZGV2KTsKKwlpbml0X3JlZ2lzdGVycyhkZXYpOworCisJc3Bpbl91bmxvY2soJnJwLT5sb2NrKTsKKwllbmFibGVfaXJxKHJwLT5wZGV2LT5pcnEpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcnAtPnN0YXRzLnR4X2Vycm9ycysrOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCByaGluZV9zdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKwl1bnNpZ25lZCBlbnRyeTsKKworCS8qIENhdXRpb246IHRoZSB3cml0ZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgc2V0IHRoZSBmaWVsZAorCSAgIHdpdGggdGhlICJvd25lcnNoaXAiIGJpdHMgbGFzdC4gKi8KKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0gcnAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworCWlmIChza2ItPmxlbiA8IEVUSF9aTEVOKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJfQorCisJcnAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisKKwlpZiAoKHJwLT5xdWlya3MgJiBycVJoaW5lSSkgJiYKKwkgICAgKCgodW5zaWduZWQgbG9uZylza2ItPmRhdGEgJiAzKSB8fCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICE9IDAgfHwgc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpKSB7CisJCS8qIE11c3QgdXNlIGFsaWdubWVudCBidWZmZXIuICovCisJCWlmIChza2ItPmxlbiA+IFBLVF9CVUZfU1opIHsKKwkJCS8qIHBhY2tldCB0b28gbG9uZywgZHJvcCBpdCAqLworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcnAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJcnAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCXJldHVybiAwOworCQl9CisJCXNrYl9jb3B5X2FuZF9jc3VtX2Rldihza2IsIHJwLT50eF9idWZbZW50cnldKTsKKwkJcnAtPnR4X3NrYnVmZl9kbWFbZW50cnldID0gMDsKKwkJcnAtPnR4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihycC0+dHhfYnVmc19kbWEgKworCQkJCQkJICAgICAgKHJwLT50eF9idWZbZW50cnldIC0KKwkJCQkJCSAgICAgICBycC0+dHhfYnVmcykpOworCX0gZWxzZSB7CisJCXJwLT50eF9za2J1ZmZfZG1hW2VudHJ5XSA9CisJCQlwY2lfbWFwX3NpbmdsZShycC0+cGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJCXJwLT50eF9yaW5nW2VudHJ5XS5hZGRyID0gY3B1X3RvX2xlMzIocnAtPnR4X3NrYnVmZl9kbWFbZW50cnldKTsKKwl9CisKKwlycC0+dHhfcmluZ1tlbnRyeV0uZGVzY19sZW5ndGggPQorCQljcHVfdG9fbGUzMihUWERFU0MgfCAoc2tiLT5sZW4gPj0gRVRIX1pMRU4gPyBza2ItPmxlbiA6IEVUSF9aTEVOKSk7CisKKwkvKiBsb2NrIGV0aCBpcnEgKi8KKwlzcGluX2xvY2tfaXJxKCZycC0+bG9jayk7CisJd21iKCk7CisJcnAtPnR4X3JpbmdbZW50cnldLnR4X3N0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd24pOworCXdtYigpOworCisJcnAtPmN1cl90eCsrOworCisJLyogTm9uLXg4NiBUb2RvOiBleHBsaWNpdGx5IGZsdXNoIGNhY2hlIGxpbmVzIGhlcmUuICovCisKKwkvKiBXYWtlIHRoZSBwb3RlbnRpYWxseS1pZGxlIHRyYW5zbWl0IGNoYW5uZWwgKi8KKwlpb3dyaXRlOChpb3JlYWQ4KGlvYWRkciArIENoaXBDbWQxKSB8IENtZDFUeERlbWFuZCwKKwkgICAgICAgaW9hZGRyICsgQ2hpcENtZDEpOworCUlPU1lOQzsKKworCWlmIChycC0+Y3VyX3R4ID09IHJwLT5kaXJ0eV90eCArIFRYX1FVRVVFX0xFTikKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlzcGluX3VubG9ja19pcnEoJnJwLT5sb2NrKTsKKworCWlmIChkZWJ1ZyA+IDQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBmcmFtZSAjJWQgcXVldWVkIGluIHNsb3QgJWQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBycC0+Y3VyX3R4LTEsIGVudHJ5KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIGFsbCBvZiB0aGUgUnggdGhyZWFkIHdvcmsgYW5kIGNsZWFucyB1cAorICAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCByaGluZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCXUzMiBpbnRyX3N0YXR1czsKKwlpbnQgYm9ndXNjbnQgPSBtYXhfaW50ZXJydXB0X3dvcms7CisJaW50IGhhbmRsZWQgPSAwOworCisJd2hpbGUgKChpbnRyX3N0YXR1cyA9IGdldF9pbnRyX3N0YXR1cyhkZXYpKSkgeworCQloYW5kbGVkID0gMTsKKworCQkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKwkJaWYgKGludHJfc3RhdHVzICYgSW50clR4RGVzY1JhY2UpCisJCQlpb3dyaXRlOCgweDA4LCBpb2FkZHIgKyBJbnRyU3RhdHVzMik7CisJCWlvd3JpdGUxNihpbnRyX3N0YXR1cyAmIDB4ZmZmZiwgaW9hZGRyICsgSW50clN0YXR1cyk7CisJCUlPU1lOQzsKKworCQlpZiAoZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbnRlcnJ1cHQsIHN0YXR1cyAlOC44eC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisKKwkJaWYgKGludHJfc3RhdHVzICYgKEludHJSeERvbmUgfCBJbnRyUnhFcnIgfCBJbnRyUnhEcm9wcGVkIHwKKwkJICAgIEludHJSeFdha2VVcCB8IEludHJSeEVtcHR5IHwgSW50clJ4Tm9CdWYpKQorCQkJcmhpbmVfcngoZGV2KTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiAoSW50clR4RXJyU3VtbWFyeSB8IEludHJUeERvbmUpKSB7CisJCQlpZiAoaW50cl9zdGF0dXMgJiBJbnRyVHhFcnJTdW1tYXJ5KSB7CisJCQkJLyogQXZvaWQgc2NhdmVuZ2luZyBiZWZvcmUgVHggZW5naW5lIHR1cm5lZCBvZmYgKi8KKwkJCQlSSElORV9XQUlUX0ZPUighKGlvcmVhZDgoaW9hZGRyK0NoaXBDbWQpICYgQ21kVHhPbikpOworCQkJCWlmIChkZWJ1ZyA+IDIgJiYKKwkJCQkgICAgaW9yZWFkOChpb2FkZHIrQ2hpcENtZCkgJiBDbWRUeE9uKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogIgorCQkJCQkgICAgICAgInJoaW5lX2ludGVycnVwdCgpIFR4IGVuZ2luZSIKKwkJCQkJICAgICAgICJzdGlsbCBvbi5cbiIsIGRldi0+bmFtZSk7CisJCQl9CisJCQlyaGluZV90eChkZXYpOworCQl9CisKKwkJLyogQWJub3JtYWwgZXJyb3Igc3VtbWFyeS91bmNvbW1vbiBldmVudHMgaGFuZGxlcnMuICovCisJCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyUENJRXJyIHwgSW50ckxpbmtDaGFuZ2UgfAorCQkJCSAgIEludHJTdGF0c01heCB8IEludHJUeEVycm9yIHwgSW50clR4QWJvcnRlZCB8CisJCQkJICAgSW50clR4VW5kZXJydW4gfCBJbnRyVHhEZXNjUmFjZSkpCisJCQlyaGluZV9lcnJvcihkZXYsIGludHJfc3RhdHVzKTsKKworCQlpZiAoLS1ib2d1c2NudCA8IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCwgIgorCQkJICAgICAgICJzdGF0dXM9JSM4Ljh4LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGRlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzPSU4Ljh4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgaW9yZWFkMTYoaW9hZGRyICsgSW50clN0YXR1cykpOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgbG9naWNhbGx5IHBhcnQgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyLCBidXQgaXNvbGF0ZWQKKyAgIGZvciBjbGFyaXR5LiAqLworc3RhdGljIHZvaWQgcmhpbmVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB0eHN0YXR1cyA9IDAsIGVudHJ5ID0gcnAtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCisJc3Bpbl9sb2NrKCZycC0+bG9jayk7CisKKwkvKiBmaW5kIGFuZCBjbGVhbnVwIGRpcnR5IHR4IGRlc2NyaXB0b3JzICovCisJd2hpbGUgKHJwLT5kaXJ0eV90eCAhPSBycC0+Y3VyX3R4KSB7CisJCXR4c3RhdHVzID0gbGUzMl90b19jcHUocnAtPnR4X3JpbmdbZW50cnldLnR4X3N0YXR1cyk7CisJCWlmIChkZWJ1ZyA+IDYpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiIFR4IHNjYXZlbmdlICVkIHN0YXR1cyAlOC44eC5cbiIsCisJCQkgICAgICAgZW50cnksIHR4c3RhdHVzKTsKKwkJaWYgKHR4c3RhdHVzICYgRGVzY093bikKKwkJCWJyZWFrOworCQlpZiAodHhzdGF0dXMgJiAweDgwMDApIHsKKwkJCWlmIChkZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBlcnJvciwgIgorCQkJCSAgICAgICAiVHggc3RhdHVzICU4Ljh4LlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCB0eHN0YXR1cyk7CisJCQlycC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlpZiAodHhzdGF0dXMgJiAweDA0MDApIHJwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJaWYgKHR4c3RhdHVzICYgMHgwMjAwKSBycC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJaWYgKHR4c3RhdHVzICYgMHgwMTAwKSBycC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmICh0eHN0YXR1cyAmIDB4MDA4MCkgcnAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKwkJCWlmICgoKHJwLT5xdWlya3MgJiBycVJoaW5lSSkgJiYgdHhzdGF0dXMgJiAweDAwMDIpIHx8CisJCQkgICAgKHR4c3RhdHVzICYgMHgwODAwKSB8fCAodHhzdGF0dXMgJiAweDEwMDApKSB7CisJCQkJcnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJcnAtPnR4X3JpbmdbZW50cnldLnR4X3N0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd24pOworCQkJCWJyZWFrOyAvKiBLZWVwIHRoZSBza2IgLSB3ZSB0cnkgYWdhaW4gKi8KKwkJCX0KKwkJCS8qIFRyYW5zbWl0dGVyIHJlc3RhcnRlZCBpbiAnYWJub3JtYWwnIGhhbmRsZXIuICovCisJCX0gZWxzZSB7CisJCQlpZiAocnAtPnF1aXJrcyAmIHJxUmhpbmVJKQorCQkJCXJwLT5zdGF0cy5jb2xsaXNpb25zICs9ICh0eHN0YXR1cyA+PiAzKSAmIDB4MEY7CisJCQllbHNlCisJCQkJcnAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gdHhzdGF0dXMgJiAweDBGOworCQkJaWYgKGRlYnVnID4gNikKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiY29sbGlzaW9uczogJTEuMXg6JTEuMXhcbiIsCisJCQkJICAgICAgICh0eHN0YXR1cyA+PiAzKSAmIDB4RiwKKwkJCQkgICAgICAgdHhzdGF0dXMgJiAweEYpOworCQkJcnAtPnN0YXRzLnR4X2J5dGVzICs9IHJwLT50eF9za2J1ZmZbZW50cnldLT5sZW47CisJCQlycC0+c3RhdHMudHhfcGFja2V0cysrOworCQl9CisJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KKwkJaWYgKHJwLT50eF9za2J1ZmZfZG1hW2VudHJ5XSkgeworCQkJcGNpX3VubWFwX3NpbmdsZShycC0+cGRldiwKKwkJCQkJIHJwLT50eF9za2J1ZmZfZG1hW2VudHJ5XSwKKwkJCQkJIHJwLT50eF9za2J1ZmZbZW50cnldLT5sZW4sCisJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJfQorCQlkZXZfa2ZyZWVfc2tiX2lycShycC0+dHhfc2tidWZmW2VudHJ5XSk7CisJCXJwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJZW50cnkgPSAoKytycC0+ZGlydHlfdHgpICUgVFhfUklOR19TSVpFOworCX0KKwlpZiAoKHJwLT5jdXJfdHggLSBycC0+ZGlydHlfdHgpIDwgVFhfUVVFVUVfTEVOIC0gNCkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2soJnJwLT5sb2NrKTsKK30KKworLyogVGhpcyByb3V0aW5lIGlzIGxvZ2ljYWxseSBwYXJ0IG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgYnV0IGlzb2xhdGVkCisgICBmb3IgY2xhcml0eSBhbmQgYmV0dGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uICovCitzdGF0aWMgdm9pZCByaGluZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5ID0gcnAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlpbnQgYm9ndXNjbnQgPSBycC0+ZGlydHlfcnggKyBSWF9SSU5HX1NJWkUgLSBycC0+Y3VyX3J4OworCisJaWYgKGRlYnVnID4gNCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJoaW5lX3J4KCksIGVudHJ5ICVkIHN0YXR1cyAlOC44eC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVudHJ5LAorCQkgICAgICAgbGUzMl90b19jcHUocnAtPnJ4X2hlYWRfZGVzYy0+cnhfc3RhdHVzKSk7CisJfQorCisJLyogSWYgRU9QIGlzIHNldCBvbiB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKCEocnAtPnJ4X2hlYWRfZGVzYy0+cnhfc3RhdHVzICYgY3B1X3RvX2xlMzIoRGVzY093bikpKSB7CisJCXN0cnVjdCByeF9kZXNjICpkZXNjID0gcnAtPnJ4X2hlYWRfZGVzYzsKKwkJdTMyIGRlc2Nfc3RhdHVzID0gbGUzMl90b19jcHUoZGVzYy0+cnhfc3RhdHVzKTsKKwkJaW50IGRhdGFfc2l6ZSA9IGRlc2Nfc3RhdHVzID4+IDE2OworCisJCWlmIChkZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiIHJoaW5lX3J4KCkgc3RhdHVzIGlzICU4Ljh4LlxuIiwKKwkJCSAgICAgICBkZXNjX3N0YXR1cyk7CisJCWlmICgtLWJvZ3VzY250IDwgMCkKKwkJCWJyZWFrOworCQlpZiAoKGRlc2Nfc3RhdHVzICYgKFJ4V2hvbGVQa3QgfCBSeEVycikpICE9IFJ4V2hvbGVQa3QpIHsKKwkJCWlmICgoZGVzY19zdGF0dXMgJiBSeFdob2xlUGt0KSAhPSBSeFdob2xlUGt0KSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCAiCisJCQkJICAgICAgICJmcmFtZSBzcGFubmVkIG11bHRpcGxlIGJ1ZmZlcnMsIGVudHJ5ICIKKwkJCQkgICAgICAgIiUjeCBsZW5ndGggJWQgc3RhdHVzICU4Ljh4IVxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBlbnRyeSwgZGF0YV9zaXplLAorCQkJCSAgICAgICBkZXNjX3N0YXR1cyk7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCAiCisJCQkJICAgICAgICJmcmFtZSAlcCB2cyAlcC5cbiIsIGRldi0+bmFtZSwKKwkJCQkgICAgICAgcnAtPnJ4X2hlYWRfZGVzYywgJnJwLT5yeF9yaW5nW2VudHJ5XSk7CisJCQkJcnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCX0gZWxzZSBpZiAoZGVzY19zdGF0dXMgJiBSeEVycikgeworCQkJCS8qIFRoZXJlIHdhcyBhIGVycm9yLiAqLworCQkJCWlmIChkZWJ1ZyA+IDIpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIgcmhpbmVfcngoKSBSeCAiCisJCQkJCSAgICAgICAiZXJyb3Igd2FzICU4Ljh4LlxuIiwKKwkJCQkJICAgICAgIGRlc2Nfc3RhdHVzKTsKKwkJCQlycC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJaWYgKGRlc2Nfc3RhdHVzICYgMHgwMDMwKSBycC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCWlmIChkZXNjX3N0YXR1cyAmIDB4MDA0OCkgcnAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkJaWYgKGRlc2Nfc3RhdHVzICYgMHgwMDA0KSBycC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJaWYgKGRlc2Nfc3RhdHVzICYgMHgwMDAyKSB7CisJCQkJCS8qIHRoaXMgY2FuIGFsc28gYmUgdXBkYXRlZCBvdXRzaWRlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCQkJCQlzcGluX2xvY2soJnJwLT5sb2NrKTsKKwkJCQkJcnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQkJc3Bpbl91bmxvY2soJnJwLT5sb2NrKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJLyogTGVuZ3RoIHNob3VsZCBvbWl0IHRoZSBDUkMgKi8KKwkJCWludCBwa3RfbGVuID0gZGF0YV9zaXplIC0gNDsKKworCQkJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBhY2NlcHQgd2l0aG91dAorCQkJICAgY29weWluZyB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCisJCQlpZiAocGt0X2xlbiA8IHJ4X2NvcHlicmVhayAmJgorCQkJCShza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShycC0+cGRldiwKKwkJCQkJCQkgICAgcnAtPnJ4X3NrYnVmZl9kbWFbZW50cnldLAorCQkJCQkJCSAgICBycC0+cnhfYnVmX3N6LAorCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCisJCQkJCQkgcnAtPnJ4X3NrYnVmZltlbnRyeV0tPnRhaWwsCisJCQkJCQkgcGt0X2xlbiwgMCk7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShycC0+cGRldiwKKwkJCQkJCQkgICAgICAgcnAtPnJ4X3NrYnVmZl9kbWFbZW50cnldLAorCQkJCQkJCSAgICAgICBycC0+cnhfYnVmX3N6LAorCQkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJfSBlbHNlIHsKKwkJCQlza2IgPSBycC0+cnhfc2tidWZmW2VudHJ5XTsKKwkJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW5jb25zaXN0ZW50IFJ4ICIKKwkJCQkJICAgICAgICJkZXNjcmlwdG9yIGNoYWluLlxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlycC0+cnhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCXBjaV91bm1hcF9zaW5nbGUocnAtPnBkZXYsCisJCQkJCQkgcnAtPnJ4X3NrYnVmZl9kbWFbZW50cnldLAorCQkJCQkJIHJwLT5yeF9idWZfc3osCisJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCX0KKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXJwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQkJcnAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJfQorCQllbnRyeSA9ICgrK3JwLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworCQlycC0+cnhfaGVhZF9kZXNjID0gJnJwLT5yeF9yaW5nW2VudHJ5XTsKKwl9CisKKwkvKiBSZWZpbGwgdGhlIFJ4IHJpbmcgYnVmZmVycy4gKi8KKwlmb3IgKDsgcnAtPmN1cl9yeCAtIHJwLT5kaXJ0eV9yeCA+IDA7IHJwLT5kaXJ0eV9yeCsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWVudHJ5ID0gcnAtPmRpcnR5X3J4ICUgUlhfUklOR19TSVpFOworCQlpZiAocnAtPnJ4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkgeworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihycC0+cnhfYnVmX3N6KTsKKwkJCXJwLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWJyZWFrOwkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kLiAqLworCQkJc2tiLT5kZXYgPSBkZXY7CS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJCXJwLT5yeF9za2J1ZmZfZG1hW2VudHJ5XSA9CisJCQkJcGNpX21hcF9zaW5nbGUocnAtPnBkZXYsIHNrYi0+dGFpbCwKKwkJCQkJICAgICAgIHJwLT5yeF9idWZfc3osCisJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcnAtPnJ4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihycC0+cnhfc2tidWZmX2RtYVtlbnRyeV0pOworCQl9CisJCXJwLT5yeF9yaW5nW2VudHJ5XS5yeF9zdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duKTsKKwl9Cit9CisKKy8qCisgKiBDbGVhcnMgdGhlICJ0YWxseSBjb3VudGVycyIgZm9yIENSQyBlcnJvcnMgYW5kIG1pc3NlZCBmcmFtZXMoPykuCisgKiBJdCBoYXMgYmVlbiByZXBvcnRlZCB0aGF0IHNvbWUgY2hpcHMgbmVlZCBhIHdyaXRlIG9mIDAgdG8gY2xlYXIKKyAqIHRoZXNlLCBmb3Igb3RoZXJzIHRoZSBjb3VudGVycyBhcmUgc2V0IHRvIDEgd2hlbiB3cml0dGVuIHRvIGFuZAorICogaW5zdGVhZCBjbGVhcmVkIHdoZW4gcmVhZC4gU28gd2UgY2xlYXIgdGhlbSBib3RoIHdheXMgLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl90YWxseV9jb3VudGVycyh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlpb3dyaXRlMzIoMCwgaW9hZGRyICsgUnhNaXNzZWQpOworCWlvcmVhZDE2KGlvYWRkciArIFJ4Q1JDRXJycyk7CisJaW9yZWFkMTYoaW9hZGRyICsgUnhNaXNzZWQpOworfQorCitzdGF0aWMgdm9pZCByaGluZV9yZXN0YXJ0X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisJaW50IGVudHJ5ID0gcnAtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCXUzMiBpbnRyX3N0YXR1czsKKworCS8qCisJICogSWYgbmV3IGVycm9ycyBvY2N1cmVkLCB3ZSBuZWVkIHRvIHNvcnQgdGhlbSBvdXQgYmVmb3JlIGRvaW5nIFR4LgorCSAqIEluIHRoYXQgY2FzZSB0aGUgSVNSIHdpbGwgYmUgYmFjayBoZXJlIFJTTiBhbnl3YXkuCisJICovCisJaW50cl9zdGF0dXMgPSBnZXRfaW50cl9zdGF0dXMoZGV2KTsKKworCWlmICgoaW50cl9zdGF0dXMgJiBJbnRyVHhFcnJTdW1tYXJ5KSA9PSAwKSB7CisKKwkJLyogV2Uga25vdyBiZXR0ZXIgdGhhbiB0aGUgY2hpcCB3aGVyZSBpdCBzaG91bGQgY29udGludWUuICovCisJCWlvd3JpdGUzMihycC0+dHhfcmluZ19kbWEgKyBlbnRyeSAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYyksCisJCSAgICAgICBpb2FkZHIgKyBUeFJpbmdQdHIpOworCisJCWlvd3JpdGU4KGlvcmVhZDgoaW9hZGRyICsgQ2hpcENtZCkgfCBDbWRUeE9uLAorCQkgICAgICAgaW9hZGRyICsgQ2hpcENtZCk7CisJCWlvd3JpdGU4KGlvcmVhZDgoaW9hZGRyICsgQ2hpcENtZDEpIHwgQ21kMVR4RGVtYW5kLAorCQkgICAgICAgaW9hZGRyICsgQ2hpcENtZDEpOworCQlJT1NZTkM7CisJfQorCWVsc2UgeworCQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJaWYgKGRlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByaGluZV9yZXN0YXJ0X3R4KCkgIgorCQkJICAgICAgICJBbm90aGVyIGVycm9yIG9jY3VyZWQgJTguOHguXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOworCX0KKworfQorCitzdGF0aWMgdm9pZCByaGluZV9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCisJc3Bpbl9sb2NrKCZycC0+bG9jayk7CisKKwlpZiAoaW50cl9zdGF0dXMgJiBJbnRyTGlua0NoYW5nZSkKKwkJcmhpbmVfY2hlY2tfbWVkaWEoZGV2LCAwKTsKKwlpZiAoaW50cl9zdGF0dXMgJiBJbnRyU3RhdHNNYXgpIHsKKwkJcnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gaW9yZWFkMTYoaW9hZGRyICsgUnhDUkNFcnJzKTsKKwkJcnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW9yZWFkMTYoaW9hZGRyICsgUnhNaXNzZWQpOworCQljbGVhcl90YWxseV9jb3VudGVycyhpb2FkZHIpOworCX0KKwlpZiAoaW50cl9zdGF0dXMgJiBJbnRyVHhBYm9ydGVkKSB7CisJCWlmIChkZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQWJvcnQgJTguOHgsIGZyYW1lIGRyb3BwZWQuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOworCX0KKwlpZiAoaW50cl9zdGF0dXMgJiBJbnRyVHhVbmRlcnJ1bikgeworCQlpZiAocnAtPnR4X3RocmVzaCA8IDB4RTApCisJCQlpb3dyaXRlOChycC0+dHhfdGhyZXNoICs9IDB4MjAsIGlvYWRkciArIFR4Q29uZmlnKTsKKwkJaWYgKGRlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUcmFuc21pdHRlciB1bmRlcnJ1biwgVHggIgorCQkJICAgICAgICJ0aHJlc2hvbGQgbm93ICUyLjJ4LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHJwLT50eF90aHJlc2gpOworCX0KKwlpZiAoaW50cl9zdGF0dXMgJiBJbnRyVHhEZXNjUmFjZSkgeworCQlpZiAoZGVidWcgPiAyKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFR4IGRlc2NyaXB0b3Igd3JpdGUtYmFjayByYWNlLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCX0KKwlpZiAoKGludHJfc3RhdHVzICYgSW50clR4RXJyb3IpICYmCisJICAgIChpbnRyX3N0YXR1cyAmIChJbnRyVHhBYm9ydGVkIHwKKwkgICAgIEludHJUeFVuZGVycnVuIHwgSW50clR4RGVzY1JhY2UpKSA9PSAwKSB7CisJCWlmIChycC0+dHhfdGhyZXNoIDwgMHhFMCkgeworCQkJaW93cml0ZTgocnAtPnR4X3RocmVzaCArPSAweDIwLCBpb2FkZHIgKyBUeENvbmZpZyk7CisJCX0KKwkJaWYgKGRlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbnNwZWNpZmllZCBlcnJvci4gVHggIgorCQkJICAgICAgICJ0aHJlc2hvbGQgbm93ICUyLjJ4LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHJwLT50eF90aHJlc2gpOworCX0KKwlpZiAoaW50cl9zdGF0dXMgJiAoSW50clR4QWJvcnRlZCB8IEludHJUeFVuZGVycnVuIHwgSW50clR4RGVzY1JhY2UgfAorCQkJICAgSW50clR4RXJyb3IpKQorCQlyaGluZV9yZXN0YXJ0X3R4KGRldik7CisKKwlpZiAoaW50cl9zdGF0dXMgJiB+KEludHJMaW5rQ2hhbmdlIHwgSW50clN0YXRzTWF4IHwgSW50clR4VW5kZXJydW4gfAorCQkJICAgIEludHJUeEVycm9yIHwgSW50clR4QWJvcnRlZCB8IEludHJOb3JtYWxTdW1tYXJ5IHwKKwkJCSAgICBJbnRyVHhEZXNjUmFjZSkpIHsKKwkJaWYgKGRlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFNvbWV0aGluZyBXaWNrZWQgaGFwcGVuZWQhICIKKwkJCSAgICAgICAiJTguOHguXG4iLCBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKwl9CisKKwlzcGluX3VubG9jaygmcnAtPmxvY2spOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJoaW5lX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJwLT5sb2NrLCBmbGFncyk7CisJcnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gaW9yZWFkMTYoaW9hZGRyICsgUnhDUkNFcnJzKTsKKwlycC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpb3JlYWQxNihpb2FkZHIgKyBSeE1pc3NlZCk7CisJY2xlYXJfdGFsbHlfY291bnRlcnMoaW9hZGRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuICZycC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHJoaW5lX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCXUzMiBtY19maWx0ZXJbMl07CS8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworCXU4IHJ4X21vZGU7CQkvKiBOb3RlOiAweDAyPWFjY2VwdCBydW50LCAweDAxPWFjY2VwdCBlcnJzICovCisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CQkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyeF9tb2RlID0gMHgxQzsKKwkJaW93cml0ZTMyKDB4ZmZmZmZmZmYsIGlvYWRkciArIE11bHRpY2FzdEZpbHRlcjApOworCQlpb3dyaXRlMzIoMHhmZmZmZmZmZiwgaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMSk7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpCisJCSAgIHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBtYXRjaCwgb3IgYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQlpb3dyaXRlMzIoMHhmZmZmZmZmZiwgaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMCk7CisJCWlvd3JpdGUzMigweGZmZmZmZmZmLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIxKTsKKwkJcnhfbW9kZSA9IDB4MEM7CisJfSBlbHNlIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCWludCBpOworCQltZW1zZXQobWNfZmlsdGVyLCAwLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkgICAgIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQlpbnQgYml0X25yID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAyNjsKKworCQkJbWNfZmlsdGVyW2JpdF9uciA+PiA1XSB8PSAxIDw8IChiaXRfbnIgJiAzMSk7CisJCX0KKwkJaW93cml0ZTMyKG1jX2ZpbHRlclswXSwgaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMCk7CisJCWlvd3JpdGUzMihtY19maWx0ZXJbMV0sIGlvYWRkciArIE11bHRpY2FzdEZpbHRlcjEpOworCQlyeF9tb2RlID0gMHgwQzsKKwl9CisJaW93cml0ZTgocnAtPnJ4X3RocmVzaCB8IHJ4X21vZGUsIGlvYWRkciArIFJ4Q29uZmlnKTsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocnAtPnBkZXYpKTsKK30KKworc3RhdGljIGludCBuZXRkZXZfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmcnAtPmxvY2spOworCXJjID0gbWlpX2V0aHRvb2xfZ3NldCgmcnAtPm1paV9pZiwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJnJwLT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBuZXRkZXZfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmcnAtPmxvY2spOworCXJjID0gbWlpX2V0aHRvb2xfc3NldCgmcnAtPm1paV9pZiwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJnJwLT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBuZXRkZXZfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmcnAtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiBtaWlfbGlua19vaygmcnAtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBkZWJ1ZzsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCit7CisJZGVidWcgPSB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQgcmhpbmVfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghKHJwLT5xdWlya3MgJiBycVdPTCkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnEoJnJwLT5sb2NrKTsKKwl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfUEhZIHwgV0FLRV9NQUdJQyB8CisJCQkgV0FLRV9VQ0FTVCB8IFdBS0VfTUNBU1QgfCBXQUtFX0JDQVNUOwkvKiBVbnRlc3RlZCAqLworCXdvbC0+d29sb3B0cyA9IHJwLT53b2xvcHRzOworCXNwaW5fdW5sb2NrX2lycSgmcnAtPmxvY2spOworfQorCitzdGF0aWMgaW50IHJoaW5lX3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHN1cHBvcnQgPSBXQUtFX1BIWSB8IFdBS0VfTUFHSUMgfAorCQkgICAgICBXQUtFX1VDQVNUIHwgV0FLRV9NQ0FTVCB8IFdBS0VfQkNBU1Q7CS8qIFVudGVzdGVkICovCisKKwlpZiAoIShycC0+cXVpcmtzICYgcnFXT0wpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3b2wtPndvbG9wdHMgJiB+c3VwcG9ydCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxKCZycC0+bG9jayk7CisJcnAtPndvbG9wdHMgPSB3b2wtPndvbG9wdHM7CisJc3Bpbl91bmxvY2tfaXJxKCZycC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKKwkuZ2V0X3NldHRpbmdzCQk9IG5ldGRldl9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBuZXRkZXZfc2V0X3NldHRpbmdzLAorCS5ud2F5X3Jlc2V0CQk9IG5ldGRldl9ud2F5X3Jlc2V0LAorCS5nZXRfbGluawkJPSBuZXRkZXZfZ2V0X2xpbmssCisJLmdldF9tc2dsZXZlbAkJPSBuZXRkZXZfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X3NldF9tc2dsZXZlbCwKKwkuZ2V0X3dvbAkJPSByaGluZV9nZXRfd29sLAorCS5zZXRfd29sCQk9IHJoaW5lX3NldF93b2wsCisJLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLmdldF90eF9jc3VtCQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCit9OworCitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmcnAtPmxvY2spOworCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJnJwLT5taWlfaWYsIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZycC0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcmhpbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisKKwlzcGluX2xvY2tfaXJxKCZycC0+bG9jayk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCAiCisJCSAgICAgICAic3RhdHVzIHdhcyAlNC40eC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGlvcmVhZDE2KGlvYWRkciArIENoaXBDbWQpKTsKKworCS8qIFN3aXRjaCB0byBsb29wYmFjayBtb2RlIHRvIGF2b2lkIGhhcmR3YXJlIHJhY2VzLiAqLworCWlvd3JpdGU4KHJwLT50eF90aHJlc2ggfCAweDAyLCBpb2FkZHIgKyBUeENvbmZpZyk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCWlvd3JpdGUxNigweDAwMDAsIGlvYWRkciArIEludHJFbmFibGUpOworCisJLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisJaW93cml0ZTE2KENtZFN0b3AsIGlvYWRkciArIENoaXBDbWQpOworCisJc3Bpbl91bmxvY2tfaXJxKCZycC0+bG9jayk7CisKKwlmcmVlX2lycShycC0+cGRldi0+aXJxLCBkZXYpOworCWZyZWVfcmJ1ZnMoZGV2KTsKKwlmcmVlX3RidWZzKGRldik7CisJZnJlZV9yaW5nKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcmhpbmVfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJcGNpX2lvdW5tYXAocGRldiwgcnAtPmJhc2UpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKKwlmcmVlX25ldGRldihkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIHJoaW5lX3NodXRkb3duIChzdHJ1Y3QgZGV2aWNlICpnZW5kZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGdlbmRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisKKwlpZiAoIShycC0+cXVpcmtzICYgcnFXT0wpKQorCQlyZXR1cm47IC8qIE5vdGhpbmcgdG8gZG8gZm9yIG5vbi1XT0wgYWRhcHRlcnMgKi8KKworCXJoaW5lX3Bvd2VyX2luaXQoZGV2KTsKKworCS8qIE1ha2Ugc3VyZSB3ZSB1c2UgcGF0dGVybiAwLCAxIGFuZCBub3QgNCwgNSAqLworCWlmIChycC0+cXVpcmtzICYgcnE2cGF0dGVybnMpCisJCWlvd3JpdGU4KDB4MDQsIGlvYWRkciArIDB4QTcpOworCisJaWYgKHJwLT53b2xvcHRzICYgV0FLRV9NQUdJQykgeworCQlpb3dyaXRlOChXT0xtYWdpYywgaW9hZGRyICsgV09MY3JTZXQpOworCQkvKgorCQkgKiBUdXJuIEVFUFJPTS1jb250cm9sbGVkIHdha2UtdXAgYmFjayBvbiAtLSBzb21lIGhhcmR3YXJlIG1heQorCQkgKiBub3QgY29vcGVyYXRlIG90aGVyd2lzZS4KKwkJICovCisJCWlvd3JpdGU4KGlvcmVhZDgoaW9hZGRyICsgQ29uZmlnQSkgfCAweDAzLCBpb2FkZHIgKyBDb25maWdBKTsKKwl9CisKKwlpZiAocnAtPndvbG9wdHMgJiAoV0FLRV9CQ0FTVHxXQUtFX01DQVNUKSkKKwkJaW93cml0ZTgoV09MYm1jYXN0LCBpb2FkZHIgKyBXT0xjZ1NldCk7CisKKwlpZiAocnAtPndvbG9wdHMgJiBXQUtFX1BIWSkKKwkJaW93cml0ZTgoV09MbG5rb24gfCBXT0xsbmtvZmYsIGlvYWRkciArIFdPTGNyU2V0KTsKKworCWlmIChycC0+d29sb3B0cyAmIFdBS0VfVUNBU1QpCisJCWlvd3JpdGU4KFdPTHVjYXN0LCBpb2FkZHIgKyBXT0xjclNldCk7CisKKwlpZiAocnAtPndvbG9wdHMpIHsKKwkJLyogRW5hYmxlIGxlZ2FjeSBXT0wgKGZvciBvbGQgbW90aGVyYm9hcmRzKSAqLworCQlpb3dyaXRlOCgweDAxLCBpb2FkZHIgKyBQd2NmZ1NldCk7CisJCWlvd3JpdGU4KGlvcmVhZDgoaW9hZGRyICsgU3RpY2t5SFcpIHwgMHgwNCwgaW9hZGRyICsgU3RpY2t5SFcpOworCX0KKworCS8qIEhpdCBwb3dlciBzdGF0ZSBEMyAoc2xlZXApICovCisJaW93cml0ZTgoaW9yZWFkOChpb2FkZHIgKyBTdGlja3lIVykgfCAweDAzLCBpb2FkZHIgKyBTdGlja3lIVyk7CisKKwkvKiBUT0RPOiBDaGVjayB1c2Ugb2YgcGNpX2VuYWJsZV93YWtlKCkgKi8KKworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHJoaW5lX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZycC0+bG9jaywgZmxhZ3MpOworCXJoaW5lX3NodXRkb3duKCZwZGV2LT5kZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwLT5sb2NrLCBmbGFncyk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByaGluZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworICAgICAgICBpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIHJoaW5lX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSkKKwkJcHJpbnRrKEtFUk5fRVJSICJ2aWEtcmhpbmUgJXM6IHJlcXVlc3RfaXJxIGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKworCXJldCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogRW50ZXJpbmcgcG93ZXIgc3RhdGUgRDAgJXMgKCVkKS5cbiIsCisJCQlkZXYtPm5hbWUsIHJldCA/ICJmYWlsZWQiIDogInN1Y2NlZWRlZCIsIHJldCk7CisKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZycC0+bG9jaywgZmxhZ3MpOworI2lmZGVmIFVTRV9NTUlPCisJZW5hYmxlX21taW8ocnAtPnBpb2FkZHIsIHJwLT5xdWlya3MpOworI2VuZGlmCisJcmhpbmVfcG93ZXJfaW5pdChkZXYpOworCWZyZWVfdGJ1ZnMoZGV2KTsKKwlmcmVlX3JidWZzKGRldik7CisJYWxsb2NfdGJ1ZnMoZGV2KTsKKwlhbGxvY19yYnVmcyhkZXYpOworCWluaXRfcmVnaXN0ZXJzKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnAtPmxvY2ssIGZsYWdzKTsKKworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcmhpbmVfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IHJoaW5lX3BjaV90YmwsCisJLnByb2JlCQk9IHJoaW5lX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocmhpbmVfcmVtb3ZlX29uZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSByaGluZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gcmhpbmVfcmVzdW1lLAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCS5kcml2ZXIgPSB7CisJCS5zaHV0ZG93biA9IHJoaW5lX3NodXRkb3duLAorCX0KK307CisKKworc3RhdGljIGludCBfX2luaXQgcmhpbmVfaW5pdCh2b2lkKQoreworLyogd2hlbiBhIG1vZHVsZSwgdGhpcyBpcyBwcmludGVkIHdoZXRoZXIgb3Igbm90IGRldmljZXMgYXJlIGZvdW5kIGluIHByb2JlICovCisjaWZkZWYgTU9EVUxFCisJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcmhpbmVfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgcmhpbmVfY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcmhpbmVfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdChyaGluZV9pbml0KTsKK21vZHVsZV9leGl0KHJoaW5lX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWU3MTAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKQEAgLTAsMCArMSwzMzAzIEBACisvKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgVklBIHJlZmVyZW5jZSBkcml2ZXIgKGNvcHlyaWdodCBtZXNzYWdlCisgKiBiZWxvdykgcHJvdmlkZWQgdG8gUmVkIEhhdCBieSBWSUEgTmV0d29ya2luZyBUZWNobm9sb2dpZXMsIEluYy4gZm9yCisgKiBhZGRpdGlvbiB0byB0aGUgTGludXgga2VybmVsLgorICoKKyAqIFRoZSBjb2RlIGhhcyBiZWVuIG1lcmdlZCBpbnRvIG9uZSBzb3VyY2UgZmlsZSwgY2xlYW5lZCB1cCB0byBmb2xsb3cKKyAqIExpbnV4IGNvZGluZyBzdHlsZSwgIHBvcnRlZCB0byB0aGUgTGludXggMi42IGtlcm5lbCB0cmVlIGFuZCBjbGVhbmVkCisgKiBmb3IgNjRiaXQgaGFyZHdhcmUgcGxhdGZvcm1zLgorICoKKyAqIFRPRE8KKyAqCUJpZy1lbmRpYW4gc3VwcG9ydAorICoJcnhfY29weWJyZWFrL2FsaWdubWVudAorICoJU2NhdHRlciBnYXRoZXIKKyAqCU1vcmUgdGVzdGluZworICoKKyAqIFRoZSBjaGFuZ2VzIGFyZSAoYykgQ29weXJpZ2h0IDIwMDQsIFJlZCBIYXQgSW5jLiA8YWxhbkByZWRoYXQuY29tPgorICogQWRkaXRpb25hbCBmaXhlcyBhbmQgY2xlYW4gdXA6IEZyYW5jb2lzIFJvbWlldQorICoKKyAqIFRoaXMgc291cmNlIGhhcyBub3QgYmVlbiB2ZXJpZmllZCBmb3IgdXNlIGluIHNhZmV0eSBjcml0aWNhbCBzeXN0ZW1zLgorICoKKyAqIFBsZWFzZSBkaXJlY3QgcXVlcmllcyBhYm91dCB0aGUgcmV2YW1wZWQgZHJpdmVyIHRvIHRoZSBsaW51eC1rZXJuZWwKKyAqIGxpc3Qgbm90IFZJQS4KKyAqCisgKiBPcmlnaW5hbCBjb2RlOgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwgMjAwMyBWSUEgTmV0d29ya2luZyBUZWNobm9sb2dpZXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEF1dGhvcjogQ2h1YW5nIExpYW5nLVNoaW5nLCBBSiBKaWFuZworICoKKyAqIERhdGU6IEphbiAyNCwgMjAwMworICoKKyAqIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyAqCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvY3JjLWNjaXR0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgInZpYS12ZWxvY2l0eS5oIgorCisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfbmljcyA9IDA7CitzdGF0aWMgaW50IG1zZ2xldmVsID0gTVNHX0xFVkVMX0lORk87CisKKworc3RhdGljIGludCB2ZWxvY2l0eV9taWlfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB2ZWxvY2l0eV9ldGh0b29sX29wczsKKworLyoKKyAgICBEZWZpbmUgbW9kdWxlIG9wdGlvbnMKKyovCisKK01PRFVMRV9BVVRIT1IoIlZJQSBOZXR3b3JraW5nIFRlY2hub2xvZ2llcywgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJWSUEgTmV0d29ya2luZyBWZWxvY2l0eSBGYW1pbHkgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyIERyaXZlciIpOworCisjZGVmaW5lIFZFTE9DSVRZX1BBUkFNKE4sRCkgXAorICAgICAgICBzdGF0aWMgaW50IE5bTUFYX1VOSVRTXT1PUFRJT05fREVGQVVMVDtcCisJbW9kdWxlX3BhcmFtX2FycmF5KE4sIGludCwgTlVMTCwgMCk7IFwKKyAgICAgICAgTU9EVUxFX1BBUk1fREVTQyhOLCBEKTsKKworI2RlZmluZSBSWF9ERVNDX01JTiAgICAgNjQKKyNkZWZpbmUgUlhfREVTQ19NQVggICAgIDI1NQorI2RlZmluZSBSWF9ERVNDX0RFRiAgICAgNjQKK1ZFTE9DSVRZX1BBUkFNKFJ4RGVzY3JpcHRvcnMsICJOdW1iZXIgb2YgcmVjZWl2ZSBkZXNjcmlwdG9ycyIpOworCisjZGVmaW5lIFRYX0RFU0NfTUlOICAgICAxNgorI2RlZmluZSBUWF9ERVNDX01BWCAgICAgMjU2CisjZGVmaW5lIFRYX0RFU0NfREVGICAgICA2NAorVkVMT0NJVFlfUEFSQU0oVHhEZXNjcmlwdG9ycywgIk51bWJlciBvZiB0cmFuc21pdCBkZXNjcmlwdG9ycyIpOworCisjZGVmaW5lIFZMQU5fSURfTUlOICAgICAwCisjZGVmaW5lIFZMQU5fSURfTUFYICAgICA0MDk1CisjZGVmaW5lIFZMQU5fSURfREVGICAgICAwCisvKiBWSURfc2V0dGluZ1tdIGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlIFZJRCBvZiBOSUMuCisgICAwOiBkZWZhdWx0IFZJRC4KKyAgIDEtNDA5NDogb3RoZXIgVklEcy4KKyovCitWRUxPQ0lUWV9QQVJBTShWSURfc2V0dGluZywgIjgwMi4xUSBWTEFOIElEIik7CisKKyNkZWZpbmUgUlhfVEhSRVNIX01JTiAgIDAKKyNkZWZpbmUgUlhfVEhSRVNIX01BWCAgIDMKKyNkZWZpbmUgUlhfVEhSRVNIX0RFRiAgIDAKKy8qIHJ4X3RocmVzaFtdIGlzIHVzZWQgZm9yIGNvbnRyb2xsaW5nIHRoZSByZWNlaXZlIGZpZm8gdGhyZXNob2xkLgorICAgMDogaW5kaWNhdGUgdGhlIHJ4ZmlmbyB0aHJlc2hvbGQgaXMgMTI4IGJ5dGVzLgorICAgMTogaW5kaWNhdGUgdGhlIHJ4ZmlmbyB0aHJlc2hvbGQgaXMgNTEyIGJ5dGVzLgorICAgMjogaW5kaWNhdGUgdGhlIHJ4ZmlmbyB0aHJlc2hvbGQgaXMgMTAyNCBieXRlcy4KKyAgIDM6IGluZGljYXRlIHRoZSByeGZpZm8gdGhyZXNob2xkIGlzIHN0b3JlICYgZm9yd2FyZC4KKyovCitWRUxPQ0lUWV9QQVJBTShyeF90aHJlc2gsICJSZWNlaXZlIGZpZm8gdGhyZXNob2xkIik7CisKKyNkZWZpbmUgRE1BX0xFTkdUSF9NSU4gIDAKKyNkZWZpbmUgRE1BX0xFTkdUSF9NQVggIDcKKyNkZWZpbmUgRE1BX0xFTkdUSF9ERUYgIDAKKworLyogRE1BX2xlbmd0aFtdIGlzIHVzZWQgZm9yIGNvbnRyb2xsaW5nIHRoZSBETUEgbGVuZ3RoCisgICAwOiA4IERXT1JEcworICAgMTogMTYgRFdPUkRzCisgICAyOiAzMiBEV09SRHMKKyAgIDM6IDY0IERXT1JEcworICAgNDogMTI4IERXT1JEcworICAgNTogMjU2IERXT1JEcworICAgNjogU0YoZmx1c2ggdGlsbCBlbXBseSkKKyAgIDc6IFNGKGZsdXNoIHRpbGwgZW1wbHkpCisqLworVkVMT0NJVFlfUEFSQU0oRE1BX2xlbmd0aCwgIkRNQSBsZW5ndGgiKTsKKworI2RlZmluZSBUQUdHSU5HX0RFRiAgICAgMAorLyogZW5hYmxlX3RhZ2dpbmdbXSBpcyB1c2VkIGZvciBlbmFibGluZyA4MDIuMVEgVklEIHRhZ2dpbmcuCisgICAwOiBkaXNhYmxlIFZJRCBzZWV0aW5nKGRlZmF1bHQpLgorICAgMTogZW5hYmxlIFZJRCBzZXR0aW5nLgorKi8KK1ZFTE9DSVRZX1BBUkFNKGVuYWJsZV90YWdnaW5nLCAiRW5hYmxlIDgwMi4xUSB0YWdnaW5nIik7CisKKyNkZWZpbmUgSVBfQUxJR19ERUYgICAgIDAKKy8qIElQX2J5dGVfYWxpZ25bXSBpcyB1c2VkIGZvciBJUCBoZWFkZXIgRFdPUkQgYnl0ZSBhbGlnbmVkCisgICAwOiBpbmRpY2F0ZSB0aGUgSVAgaGVhZGVyIHdvbid0IGJlIERXT1JEIGJ5dGUgYWxpZ25lZC4oRGVmYXVsdCkgLgorICAgMTogaW5kaWNhdGUgdGhlIElQIGhlYWRlciB3aWxsIGJlIERXT1JEIGJ5dGUgYWxpZ25lZC4KKyAgICAgIEluIHNvbWUgZW52aXJvbWVudCwgdGhlIElQIGhlYWRlciBzaG91bGQgYmUgRFdPUkQgYnl0ZSBhbGlnbmVkLAorICAgICAgb3IgdGhlIHBhY2tldCB3aWxsIGJlIGRyb3BlZCB3aGVuIHdlIHJlY2VpdmUgaXQuIChlZzogSVBWUykKKyovCitWRUxPQ0lUWV9QQVJBTShJUF9ieXRlX2FsaWduLCAiRW5hYmxlIElQIGhlYWRlciBkd29yZCBhbGlnbmVkIik7CisKKyNkZWZpbmUgVFhfQ1NVTV9ERUYgICAgIDEKKy8qIHR4Y3N1bV9vZmZsb2FkW10gaXMgdXNlZCBmb3Igc2V0dGluZyB0aGUgY2hlY2tzdW0gb2ZmbG9hZCBhYmlsaXR5IG9mIE5JQy4KKyAgIChXZSBvbmx5IHN1cHBvcnQgUlggY2hlY2tzdW0gb2ZmbG9hZCBub3cpCisgICAwOiBkaXNhYmxlIGNzdW1fb2ZmbG9hZFtjaGVja3N1bSBvZmZsb2FkCisgICAxOiBlbmFibGUgY2hlY2tzdW0gb2ZmbG9hZC4gKERlZmF1bHQpCisqLworVkVMT0NJVFlfUEFSQU0odHhjc3VtX29mZmxvYWQsICJFbmFibGUgdHJhbnNtaXQgcGFja2V0IGNoZWNrc3VtIG9mZmxvYWQiKTsKKworI2RlZmluZSBGTE9XX0NOVExfREVGICAgMQorI2RlZmluZSBGTE9XX0NOVExfTUlOICAgMQorI2RlZmluZSBGTE9XX0NOVExfTUFYICAgNQorCisvKiBmbG93X2NvbnRyb2xbXSBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBmbG93IGNvbnRyb2wgYWJpbGl0eSBvZiBOSUMuCisgICAxOiBoYXJkd2FyZSBkZWFmdWx0IC0gQVVUTyAoZGVmYXVsdCkuIFVzZSBIYXJkd2FyZSBkZWZhdWx0IHZhbHVlIGluIEFOQVIuCisgICAyOiBlbmFibGUgVFggZmxvdyBjb250cm9sLgorICAgMzogZW5hYmxlIFJYIGZsb3cgY29udHJvbC4KKyAgIDQ6IGVuYWJsZSBSWC9UWCBmbG93IGNvbnRyb2wuCisgICA1OiBkaXNhYmxlCisqLworVkVMT0NJVFlfUEFSQU0oZmxvd19jb250cm9sLCAiRW5hYmxlIGZsb3cgY29udHJvbCBhYmlsaXR5Iik7CisKKyNkZWZpbmUgTUVEX0xOS19ERUYgMAorI2RlZmluZSBNRURfTE5LX01JTiAwCisjZGVmaW5lIE1FRF9MTktfTUFYIDQKKy8qIHNwZWVkX2R1cGxleFtdIGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlIHNwZWVkIGFuZCBkdXBsZXggbW9kZSBvZiBOSUMuCisgICAwOiBpbmRpY2F0ZSBhdXRvbmVnb3RpYXRpb24gZm9yIGJvdGggc3BlZWQgYW5kIGR1cGxleCBtb2RlCisgICAxOiBpbmRpY2F0ZSAxMDBNYnBzIGhhbGYgZHVwbGV4IG1vZGUKKyAgIDI6IGluZGljYXRlIDEwME1icHMgZnVsbCBkdXBsZXggbW9kZQorICAgMzogaW5kaWNhdGUgMTBNYnBzIGhhbGYgZHVwbGV4IG1vZGUKKyAgIDQ6IGluZGljYXRlIDEwTWJwcyBmdWxsIGR1cGxleCBtb2RlCisKKyAgIE5vdGU6CisgICAgICAgIGlmIEVFUFJPTSBoYXZlIGJlZW4gc2V0IHRvIHRoZSBmb3JjZSBtb2RlLCB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkCisgICAgICAgICAgICBieSBkcml2ZXIuCisqLworVkVMT0NJVFlfUEFSQU0oc3BlZWRfZHVwbGV4LCAiU2V0dGluZyB0aGUgc3BlZWQgYW5kIGR1cGxleCBtb2RlIik7CisKKyNkZWZpbmUgVkFMX1BLVF9MRU5fREVGICAgICAwCisvKiBWYWxQa3RMZW5bXSBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBjaGVja3N1bSBvZmZsb2FkIGFiaWxpdHkgb2YgTklDLgorICAgMDogUmVjZWl2ZSBmcmFtZSB3aXRoIGludmFsaWQgbGF5ZXIgMiBsZW5ndGggKERlZmF1bHQpCisgICAxOiBEcm9wIGZyYW1lIHdpdGggaW52YWxpZCBsYXllciAyIGxlbmd0aAorKi8KK1ZFTE9DSVRZX1BBUkFNKFZhbFBrdExlbiwgIlJlY2VpdmluZyBvciBEcm9wIGludmFsaWQgODAyLjMgZnJhbWUiKTsKKworI2RlZmluZSBXT0xfT1BUX0RFRiAgICAgMAorI2RlZmluZSBXT0xfT1BUX01JTiAgICAgMAorI2RlZmluZSBXT0xfT1BUX01BWCAgICAgNworLyogd29sX29wdHNbXSBpcyB1c2VkIGZvciBjb250cm9sbGluZyB3YWtlIG9uIGxhbiBiZWhhdmlvci4KKyAgIDA6IFdha2UgdXAgaWYgcmVjZXZpZWQgYSBtYWdpYyBwYWNrZXQuIChEZWZhdWx0KQorICAgMTogV2FrZSB1cCBpZiBsaW5rIHN0YXR1cyBpcyBvbi9vZmYuCisgICAyOiBXYWtlIHVwIGlmIHJlY2V2aWVkIGFuIGFycCBwYWNrZXQuCisgICA0OiBXYWtlIHVwIGlmIHJlY2V2aWVkIGFueSB1bmljYXN0IHBhY2tldC4KKyAgIFRob3NlIHZhbHVlIGNhbiBiZSBzdW1lZCB1cCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgb3B0aW9uLgorKi8KK1ZFTE9DSVRZX1BBUkFNKHdvbF9vcHRzLCAiV2FrZSBPbiBMYW4gb3B0aW9ucyIpOworCisjZGVmaW5lIElOVF9XT1JLU19ERUYgICAyMAorI2RlZmluZSBJTlRfV09SS1NfTUlOICAgMTAKKyNkZWZpbmUgSU5UX1dPUktTX01BWCAgIDY0CisKK1ZFTE9DSVRZX1BBUkFNKGludF93b3JrcywgIk51bWJlciBvZiBwYWNrZXRzIHBlciBpbnRlcnJ1cHQgc2VydmljZXMiKTsKKworc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAyMDA7Cittb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICJDb3B5IGJyZWFrcG9pbnQgZm9yIGNvcHktb25seS10aW55LWZyYW1lcyIpOworCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9pbml0X2luZm8oc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCBzdHJ1Y3QgdmVsb2NpdHlfaW5mb190YmwgKmluZm8pOworc3RhdGljIGludCB2ZWxvY2l0eV9nZXRfcGNpX2luZm8oc3RydWN0IHZlbG9jaXR5X2luZm8gKiwgc3RydWN0IHBjaV9kZXYgKnBkZXYpOworc3RhdGljIHZvaWQgdmVsb2NpdHlfcHJpbnRfaW5mbyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cik7CitzdGF0aWMgaW50IHZlbG9jaXR5X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHZlbG9jaXR5X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSk7CitzdGF0aWMgaW50IHZlbG9jaXR5X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHZlbG9jaXR5X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnZlbG9jaXR5X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdmVsb2NpdHlfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgaW50IHZlbG9jaXR5X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2ZWxvY2l0eV9yZWNlaXZlX2ZyYW1lKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICosIGludCBpZHgpOworc3RhdGljIGludCB2ZWxvY2l0eV9hbGxvY19yeF9idWYoc3RydWN0IHZlbG9jaXR5X2luZm8gKiwgaW50IGlkeCk7CitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9mcmVlX3JkX3Jpbmcoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpOworc3RhdGljIHZvaWQgdmVsb2NpdHlfZnJlZV90eF9idWYoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIHN0cnVjdCB2ZWxvY2l0eV90ZF9pbmZvICopOworc3RhdGljIGludCB2ZWxvY2l0eV9zb2Z0X3Jlc2V0KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKTsKK3N0YXRpYyB2b2lkIG1paV9pbml0KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCB1MzIgbWlpX3N0YXR1cyk7CitzdGF0aWMgdTMyIHZlbG9jaXR5X2dldF9vcHRfbWVkaWFfbW9kZShzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cik7CitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9wcmludF9saW5rX3N0YXR1cyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cik7CitzdGF0aWMgdm9pZCBzYWZlX2Rpc2FibGVfbWlpX2F1dG9wb2xsKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyk7CitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9zaHV0ZG93bihzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cik7CitzdGF0aWMgdm9pZCBlbmFibGVfZmxvd19jb250cm9sX2FiaWxpdHkoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpOworc3RhdGljIHZvaWQgZW5hYmxlX21paV9hdXRvcG9sbChzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MpOworc3RhdGljIGludCB2ZWxvY2l0eV9taWlfcmVhZChzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqLCB1OCBieUlkeCwgdTE2ICogcGRhdGEpOworc3RhdGljIGludCB2ZWxvY2l0eV9taWlfd3JpdGUoc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiwgdTggYnlNaWlBZGRyLCB1MTYgZGF0YSk7CitzdGF0aWMgdTMyIG1paV9jaGVja19tZWRpYV9tb2RlKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyk7CitzdGF0aWMgdTMyIGNoZWNrX2Nvbm5lY3Rpb25fdHlwZShzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MpOworc3RhdGljIGludCB2ZWxvY2l0eV9zZXRfbWVkaWFfbW9kZShzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgdTMyIG1paV9zdGF0dXMpOworCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3N0YXRpYyBpbnQgdmVsb2NpdHlfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworc3RhdGljIGludCB2ZWxvY2l0eV9uZXRkZXZfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBub3RpZmljYXRpb24sIHZvaWQgKnB0cik7CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdmVsb2NpdHlfaW5ldGFkZHJfbm90aWZpZXIgPSB7CisgICAgICAubm90aWZpZXJfY2FsbAk9IHZlbG9jaXR5X25ldGRldl9ldmVudCwKK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodmVsb2NpdHlfZGV2X2xpc3RfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKHZlbG9jaXR5X2Rldl9saXN0KTsKKworc3RhdGljIHZvaWQgdmVsb2NpdHlfcmVnaXN0ZXJfbm90aWZpZXIodm9pZCkKK3sKKwlyZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmdmVsb2NpdHlfaW5ldGFkZHJfbm90aWZpZXIpOworfQorCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV91bnJlZ2lzdGVyX25vdGlmaWVyKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmdmVsb2NpdHlfaW5ldGFkZHJfbm90aWZpZXIpOworfQorCisjZWxzZQkJCQkvKiBDT05GSUdfUE0gKi8KKworI2RlZmluZSB2ZWxvY2l0eV9yZWdpc3Rlcl9ub3RpZmllcigpCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSB2ZWxvY2l0eV91bnJlZ2lzdGVyX25vdGlmaWVyKCkJZG8ge30gd2hpbGUgKDApCisKKyNlbmRpZgkJCQkvKiAhQ09ORklHX1BNICovCisKKy8qCisgKglJbnRlcm5hbCBib2FyZCB2YXJpYW50cy4gQXQgdGhlIG1vbWVudCB3ZSBoYXZlIG9ubHkgb25lCisgKi8KKworc3RhdGljIHN0cnVjdCB2ZWxvY2l0eV9pbmZvX3RibCBjaGlwX2luZm9fdGFibGVbXSA9IHsKKwl7Q0hJUF9UWVBFX1ZUNjExMCwgIlZJQSBOZXR3b3JraW5nIFZlbG9jaXR5IEZhbWlseSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIiLCAyNTYsIDEsIDB4MDBGRkZGRkZVTH0sCisJezAsIE5VTEx9Cit9OworCisvKgorICoJRGVzY3JpYmUgdGhlIFBDSSBkZXZpY2UgaWRlbnRpZmllcnMgdGhhdCB3ZSBzdXBwb3J0IGluIHRoaXMKKyAqCWRldmljZSBkcml2ZXIuIFVzZWQgZm9yIGhvdHBsdWcgYXV0b2xvYWRpbmcuCisgKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZlbG9jaXR5X2lkX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzYxMlgsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICh1bnNpZ25lZCBsb25nKSBjaGlwX2luZm9fdGFibGV9LAorCXswLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdmVsb2NpdHlfaWRfdGFibGUpOworCisvKioKKyAqCWdldF9jaGlwX25hbWUJLSAJaWRlbnRpZmllciB0byBuYW1lCisgKglAaWQ6IGNoaXAgaWRlbnRpZmllcgorICoKKyAqCUdpdmVuIGEgY2hpcCBpZGVudGlmaWVyIHJldHVybiBhIHN1aXRhYmxlIGRlc2NyaXB0aW9uLiBSZXR1cm5zCisgKglhIHBvaW50ZXIgYSBzdGF0aWMgc3RyaW5nIHZhbGlkIHdoaWxlIHRoZSBkcml2ZXIgaXMgbG9hZGVkLgorICovCisKK3N0YXRpYyBjaGFyIF9fZGV2aW5pdCAqZ2V0X2NoaXBfbmFtZShlbnVtIGNoaXBfdHlwZSBjaGlwX2lkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGNoaXBfaW5mb190YWJsZVtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJaWYgKGNoaXBfaW5mb190YWJsZVtpXS5jaGlwX2lkID09IGNoaXBfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gY2hpcF9pbmZvX3RhYmxlW2ldLm5hbWU7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfcmVtb3ZlMQktCWRldmljZSB1bnBsdWcKKyAqCUBwZGV2OiBQQ0kgZGV2aWNlIGJlaW5nIHJlbW92ZWQKKyAqCisgKglEZXZpY2UgdW5sb2FkIGNhbGxiYWNrLiBDYWxsZWQgb24gYW4gdW5wbHVnIG9yIG9uIG1vZHVsZQorICoJdW5sb2FkIGZvciBlYWNoIGFjdGl2ZSBkZXZpY2UgdGhhdCBpcyBwcmVzZW50LiBEaXNjb25uZWN0cworICoJdGhlIGRldmljZSBmcm9tIHRoZSBuZXR3b3JrIGxheWVyIGFuZCBmcmVlcyBhbGwgdGhlIHJlc291cmNlcworICovCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2ZWxvY2l0eV9yZW1vdmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisKKyNpZmRlZiBDT05GSUdfUE0KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZlbG9jaXR5X2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnZlbG9jaXR5X2Rldl9saXN0KSkKKwkJbGlzdF9kZWwoJnZwdHItPmxpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZlbG9jaXR5X2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKKyNlbmRpZgorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaW91bm1hcCh2cHRyLT5tYWNfcmVncyk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KGRldik7CisKKwl2ZWxvY2l0eV9uaWNzLS07Cit9CisKKy8qKgorICoJdmVsb2NpdHlfc2V0X2ludF9vcHQJLQlwYXJzZXIgZm9yIGludGVnZXIgb3B0aW9ucworICoJQG9wdDogcG9pbnRlciB0byBvcHRpb24gdmFsdWUKKyAqCUB2YWw6IHZhbHVlIHRoZSB1c2VyIHJlcXVlc3RlZCAob3IgLTEgZm9yIGRlZmF1bHQpCisgKglAbWluOiBsb3dlc3QgdmFsdWUgYWxsb3dlZAorICoJQG1heDogaGlnaGVzdCB2YWx1ZSBhbGxvd2VkCisgKglAZGVmOiBkZWZhdWx0IHZhbHVlCisgKglAbmFtZTogcHJvcGVydHkgbmFtZQorICoJQGRldjogZGV2aWNlIG5hbWUKKyAqCisgKglTZXQgYW4gaW50ZWdlciBwcm9wZXJ0eSBpbiB0aGUgbW9kdWxlIG9wdGlvbnMuIFRoaXMgZnVuY3Rpb24gZG9lcworICoJYWxsIHRoZSB2ZXJpZmljYXRpb24gYW5kIGNoZWNraW5nIGFzIHdlbGwgYXMgcmVwb3J0aW5nIHNvIHRoYXQKKyAqCXdlIGRvbid0IGR1cGxpY2F0ZSBjb2RlIGZvciBlYWNoIG9wdGlvbi4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdmVsb2NpdHlfc2V0X2ludF9vcHQoaW50ICpvcHQsIGludCB2YWwsIGludCBtaW4sIGludCBtYXgsIGludCBkZWYsIGNoYXIgKm5hbWUsIGNoYXIgKmRldm5hbWUpCit7CisJaWYgKHZhbCA9PSAtMSkKKwkJKm9wdCA9IGRlZjsKKwllbHNlIGlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KSB7CisJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgS0VSTl9OT1RJQ0UgIiVzOiB0aGUgdmFsdWUgb2YgcGFyYW1ldGVyICVzIGlzIGludmFsaWQsIHRoZSB2YWxpZCByYW5nZSBpcyAoJWQtJWQpXG4iLAorCQkJCQlkZXZuYW1lLCBuYW1lLCBtaW4sIG1heCk7CisJCSpvcHQgPSBkZWY7CisJfSBlbHNlIHsKKwkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCBLRVJOX0lORk8gIiVzOiBzZXQgdmFsdWUgb2YgcGFyYW1ldGVyICVzIHRvICVkXG4iLAorCQkJCQlkZXZuYW1lLCBuYW1lLCB2YWwpOworCQkqb3B0ID0gdmFsOworCX0KK30KKworLyoqCisgKgl2ZWxvY2l0eV9zZXRfYm9vbF9vcHQJLQlwYXJzZXIgZm9yIGJvb2xlYW4gb3B0aW9ucworICoJQG9wdDogcG9pbnRlciB0byBvcHRpb24gdmFsdWUKKyAqCUB2YWw6IHZhbHVlIHRoZSB1c2VyIHJlcXVlc3RlZCAob3IgLTEgZm9yIGRlZmF1bHQpCisgKglAZGVmOiBkZWZhdWx0IHZhbHVlICh5ZXMvbm8pCisgKglAZmxhZzogbnVtZXJpYyB2YWx1ZSB0byBzZXQgZm9yIHRydWUuCisgKglAbmFtZTogcHJvcGVydHkgbmFtZQorICoJQGRldjogZGV2aWNlIG5hbWUKKyAqCisgKglTZXQgYSBib29sZWFuIHByb3BlcnR5IGluIHRoZSBtb2R1bGUgb3B0aW9ucy4gVGhpcyBmdW5jdGlvbiBkb2VzCisgKglhbGwgdGhlIHZlcmlmaWNhdGlvbiBhbmQgY2hlY2tpbmcgYXMgd2VsbCBhcyByZXBvcnRpbmcgc28gdGhhdAorICoJd2UgZG9uJ3QgZHVwbGljYXRlIGNvZGUgZm9yIGVhY2ggb3B0aW9uLgorICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB2ZWxvY2l0eV9zZXRfYm9vbF9vcHQodTMyICogb3B0LCBpbnQgdmFsLCBpbnQgZGVmLCB1MzIgZmxhZywgY2hhciAqbmFtZSwgY2hhciAqZGV2bmFtZSkKK3sKKwkoKm9wdCkgJj0gKH5mbGFnKTsKKwlpZiAodmFsID09IC0xKQorCQkqb3B0IHw9IChkZWYgPyBmbGFnIDogMCk7CisJZWxzZSBpZiAodmFsIDwgMCB8fCB2YWwgPiAxKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHRoZSB2YWx1ZSBvZiBwYXJhbWV0ZXIgJXMgaXMgaW52YWxpZCwgdGhlIHZhbGlkIHJhbmdlIGlzICgwLTEpXG4iLCAKKwkJCWRldm5hbWUsIG5hbWUpOworCQkqb3B0IHw9IChkZWYgPyBmbGFnIDogMCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNldCBwYXJhbWV0ZXIgJXMgdG8gJXNcbiIsIAorCQkJZGV2bmFtZSwgbmFtZSwgdmFsID8gIlRSVUUiIDogIkZBTFNFIik7CisJCSpvcHQgfD0gKHZhbCA/IGZsYWcgOiAwKTsKKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfZ2V0X29wdGlvbnMJLQlzZXQgb3B0aW9ucyBvbiBkZXZpY2UKKyAqCUBvcHRzOiBvcHRpb24gc3RydWN0dXJlIGZvciB0aGUgZGV2aWNlCisgKglAaW5kZXg6IGluZGV4IG9mIG9wdGlvbiB0byB1c2UgaW4gbW9kdWxlIG9wdGlvbnMgYXJyYXkKKyAqCUBkZXZuYW1lOiBkZXZpY2UgbmFtZQorICoKKyAqCVR1cm4gdGhlIG1vZHVsZSBhbmQgY29tbWFuZCBvcHRpb25zIGludG8gYSBzaW5nbGUgc3RydWN0dXJlCisgKglmb3IgdGhlIGN1cnJlbnQgZGV2aWNlCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHZlbG9jaXR5X2dldF9vcHRpb25zKHN0cnVjdCB2ZWxvY2l0eV9vcHQgKm9wdHMsIGludCBpbmRleCwgY2hhciAqZGV2bmFtZSkKK3sKKworCXZlbG9jaXR5X3NldF9pbnRfb3B0KCZvcHRzLT5yeF90aHJlc2gsIHJ4X3RocmVzaFtpbmRleF0sIFJYX1RIUkVTSF9NSU4sIFJYX1RIUkVTSF9NQVgsIFJYX1RIUkVTSF9ERUYsICJyeF90aHJlc2giLCBkZXZuYW1lKTsKKwl2ZWxvY2l0eV9zZXRfaW50X29wdCgmb3B0cy0+RE1BX2xlbmd0aCwgRE1BX2xlbmd0aFtpbmRleF0sIERNQV9MRU5HVEhfTUlOLCBETUFfTEVOR1RIX01BWCwgRE1BX0xFTkdUSF9ERUYsICJETUFfbGVuZ3RoIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2ludF9vcHQoJm9wdHMtPm51bXJ4LCBSeERlc2NyaXB0b3JzW2luZGV4XSwgUlhfREVTQ19NSU4sIFJYX0RFU0NfTUFYLCBSWF9ERVNDX0RFRiwgIlJ4RGVzY3JpcHRvcnMiLCBkZXZuYW1lKTsKKwl2ZWxvY2l0eV9zZXRfaW50X29wdCgmb3B0cy0+bnVtdHgsIFR4RGVzY3JpcHRvcnNbaW5kZXhdLCBUWF9ERVNDX01JTiwgVFhfREVTQ19NQVgsIFRYX0RFU0NfREVGLCAiVHhEZXNjcmlwdG9ycyIsIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9pbnRfb3B0KCZvcHRzLT52aWQsIFZJRF9zZXR0aW5nW2luZGV4XSwgVkxBTl9JRF9NSU4sIFZMQU5fSURfTUFYLCBWTEFOX0lEX0RFRiwgIlZJRF9zZXR0aW5nIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2Jvb2xfb3B0KCZvcHRzLT5mbGFncywgZW5hYmxlX3RhZ2dpbmdbaW5kZXhdLCBUQUdHSU5HX0RFRiwgVkVMT0NJVFlfRkxBR1NfVEFHR0lORywgImVuYWJsZV90YWdnaW5nIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2Jvb2xfb3B0KCZvcHRzLT5mbGFncywgdHhjc3VtX29mZmxvYWRbaW5kZXhdLCBUWF9DU1VNX0RFRiwgVkVMT0NJVFlfRkxBR1NfVFhfQ1NVTSwgInR4Y3N1bV9vZmZsb2FkIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2ludF9vcHQoJm9wdHMtPmZsb3dfY250bCwgZmxvd19jb250cm9sW2luZGV4XSwgRkxPV19DTlRMX01JTiwgRkxPV19DTlRMX01BWCwgRkxPV19DTlRMX0RFRiwgImZsb3dfY29udHJvbCIsIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9ib29sX29wdCgmb3B0cy0+ZmxhZ3MsIElQX2J5dGVfYWxpZ25baW5kZXhdLCBJUF9BTElHX0RFRiwgVkVMT0NJVFlfRkxBR1NfSVBfQUxJR04sICJJUF9ieXRlX2FsaWduIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2Jvb2xfb3B0KCZvcHRzLT5mbGFncywgVmFsUGt0TGVuW2luZGV4XSwgVkFMX1BLVF9MRU5fREVGLCBWRUxPQ0lUWV9GTEFHU19WQUxfUEtUX0xFTiwgIlZhbFBrdExlbiIsIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9pbnRfb3B0KChpbnQgKikgJm9wdHMtPnNwZF9kcHgsIHNwZWVkX2R1cGxleFtpbmRleF0sIE1FRF9MTktfTUlOLCBNRURfTE5LX01BWCwgTUVEX0xOS19ERUYsICJNZWRpYSBsaW5rIG1vZGUiLCBkZXZuYW1lKTsKKwl2ZWxvY2l0eV9zZXRfaW50X29wdCgoaW50ICopICZvcHRzLT53b2xfb3B0cywgd29sX29wdHNbaW5kZXhdLCBXT0xfT1BUX01JTiwgV09MX09QVF9NQVgsIFdPTF9PUFRfREVGLCAiV2FrZSBPbiBMYW4gb3B0aW9ucyIsIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9pbnRfb3B0KChpbnQgKikgJm9wdHMtPmludF93b3JrcywgaW50X3dvcmtzW2luZGV4XSwgSU5UX1dPUktTX01JTiwgSU5UX1dPUktTX01BWCwgSU5UX1dPUktTX0RFRiwgIkludGVycnVwdCBzZXJ2aWNlIHdvcmtzIiwgZGV2bmFtZSk7CisJb3B0cy0+bnVtcnggPSAob3B0cy0+bnVtcnggJiB+Myk7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfaW5pdF9jYW1fZmlsdGVyCS0JaW5pdGlhbGlzZSBDQU0KKyAqCUB2cHRyOiB2ZWxvY2l0eSB0byBwcm9ncmFtCisgKgorICoJSW5pdGlhbGl6ZSB0aGUgY29udGVudCBhZGRyZXNzYWJsZSBtZW1vcnkgdXNlZCBmb3IgZmlsdGVycy4gTG9hZAorICoJYXBwcm9wcmlhdGVseSBhY2NvcmRpbmcgdG8gdGhlIHByZXNlbmNlIG9mIFZMQU4KKyAqLworCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9pbml0X2NhbV9maWx0ZXIoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisKKwkvKiBUdXJuIG9uIE1DRkdfUFFFTiwgdHVybiBvZmYgTUNGR19SVEdPUFQgKi8KKwlXT1JEX1JFR19CSVRTX1NFVChNQ0ZHX1BRRU4sIE1DRkdfUlRHT1BULCAmcmVncy0+TUNGRyk7CisJV09SRF9SRUdfQklUU19PTihNQ0ZHX1ZJREZSLCAmcmVncy0+TUNGRyk7CisKKwkvKiBEaXNhYmxlIGFsbCBDQU1zICovCisJbWVtc2V0KHZwdHItPnZDQU1tYXNrLCAwLCBzaXplb2YodTgpICogOCk7CisJbWVtc2V0KHZwdHItPm1DQU1tYXNrLCAwLCBzaXplb2YodTgpICogOCk7CisJbWFjX3NldF9jYW1fbWFzayhyZWdzLCB2cHRyLT52Q0FNbWFzaywgVkVMT0NJVFlfVkxBTl9JRF9DQU0pOworCW1hY19zZXRfY2FtX21hc2socmVncywgdnB0ci0+bUNBTW1hc2ssIFZFTE9DSVRZX01VTFRJQ0FTVF9DQU0pOworCisJLyogRW5hYmxlIGZpcnN0IFZDQU0gKi8KKwlpZiAodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19UQUdHSU5HKSB7CisJCS8qIElmIFRhZ2dpbmcgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIFZMQU4gSUQgaXMgbm90IHplcm8sIHRoZW4KKwkJICAgdHVybiBvbiBNQ0ZHX1JUR09QVCBhbHNvICovCisJCWlmICh2cHRyLT5vcHRpb25zLnZpZCAhPSAwKQorCQkJV09SRF9SRUdfQklUU19PTihNQ0ZHX1JUR09QVCwgJnJlZ3MtPk1DRkcpOworCisJCW1hY19zZXRfY2FtKHJlZ3MsIDAsICh1OCAqKSAmICh2cHRyLT5vcHRpb25zLnZpZCksIFZFTE9DSVRZX1ZMQU5fSURfQ0FNKTsKKwkJdnB0ci0+dkNBTW1hc2tbMF0gfD0gMTsKKwkJbWFjX3NldF9jYW1fbWFzayhyZWdzLCB2cHRyLT52Q0FNbWFzaywgVkVMT0NJVFlfVkxBTl9JRF9DQU0pOworCX0gZWxzZSB7CisJCXUxNiB0ZW1wID0gMDsKKwkJbWFjX3NldF9jYW0ocmVncywgMCwgKHU4ICopICZ0ZW1wLCBWRUxPQ0lUWV9WTEFOX0lEX0NBTSk7CisJCXRlbXAgPSAxOworCQltYWNfc2V0X2NhbV9tYXNrKHJlZ3MsICh1OCAqKSAmdGVtcCwgVkVMT0NJVFlfVkxBTl9JRF9DQU0pOworCX0KK30KKworLyoqCisgKgl2ZWxvY2l0eV9yeF9yZXNldAktCWhhbmRsZSBhIHJlY2VpdmUgcmVzZXQKKyAqCUB2cHRyOiB2ZWxvY2l0eSB3ZSBhcmUgcmVzZXR0aW5nCisgKgorICoJUmVzZXQgdGhlIG93bmVyc2hpcCBhbmQgc3RhdHVzIGZvciB0aGUgcmVjZWl2ZSByaW5nIHNpZGUuCisgKglIYW5kIGFsbCB0aGUgcmVjZWl2ZSBxdWV1ZSB0byB0aGUgTklDLgorICovCisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X3J4X3Jlc2V0KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisJaW50IGk7CisKKwl2cHRyLT5yZF9kaXJ0eSA9IHZwdHItPnJkX2ZpbGxlZCA9IHZwdHItPnJkX2N1cnIgPSAwOworCisJLyoKKwkgKglJbml0IHN0YXRlLCBhbGwgUkQgZW50cmllcyBiZWxvbmcgdG8gdGhlIE5JQworCSAqLworCWZvciAoaSA9IDA7IGkgPCB2cHRyLT5vcHRpb25zLm51bXJ4OyArK2kpCisJCXZwdHItPnJkX3JpbmdbaV0ucmRlc2MwLm93bmVyID0gT1dORURfQllfTklDOworCisJd3JpdGV3KHZwdHItPm9wdGlvbnMubnVtcngsICZyZWdzLT5SQlJEVSk7CisJd3JpdGVsKHZwdHItPnJkX3Bvb2xfZG1hLCAmcmVncy0+UkRCYXNlTG8pOworCXdyaXRldygwLCAmcmVncy0+UkRJZHgpOworCXdyaXRldyh2cHRyLT5vcHRpb25zLm51bXJ4IC0gMSwgJnJlZ3MtPlJEQ1NpemUpOworfQorCisvKioKKyAqCXZlbG9jaXR5X2luaXRfcmVnaXN0ZXJzCS0JaW5pdGlhbGlzZSBNQUMgcmVnaXN0ZXJzCisgKglAdnB0cjogdmVsb2NpdHkgdG8gaW5pdAorICoJQHR5cGU6IHR5cGUgb2YgaW5pdGlhbGlzYXRpb24gKGhvdCBvciBjb2xkKQorICoKKyAqCUluaXRpYWxpc2UgdGhlIE1BQyBvbiBhIHJlc2V0IG9yIG9uIGZpcnN0IHNldCB1cCBvbiB0aGUKKyAqCWhhcmR3YXJlLgorICovCisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2luaXRfcmVnaXN0ZXJzKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCAKKwkJCQkgICAgZW51bSB2ZWxvY2l0eV9pbml0X3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwlpbnQgaSwgbWlpX3N0YXR1czsKKworCW1hY193b2xfcmVzZXQocmVncyk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFZFTE9DSVRZX0lOSVRfUkVTRVQ6CisJY2FzZSBWRUxPQ0lUWV9JTklUX1dPTDoKKworCQluZXRpZl9zdG9wX3F1ZXVlKHZwdHItPmRldik7CisKKwkJLyoKKwkJICoJUmVzZXQgUlggdG8gcHJldmVudCBSWCBwb2ludGVyIG5vdCBvbiB0aGUgNFggbG9jYXRpb24KKwkJICovCisJCXZlbG9jaXR5X3J4X3Jlc2V0KHZwdHIpOworCQltYWNfcnhfcXVldWVfcnVuKHJlZ3MpOworCQltYWNfcnhfcXVldWVfd2FrZShyZWdzKTsKKworCQltaWlfc3RhdHVzID0gdmVsb2NpdHlfZ2V0X29wdF9tZWRpYV9tb2RlKHZwdHIpOworCQlpZiAodmVsb2NpdHlfc2V0X21lZGlhX21vZGUodnB0ciwgbWlpX3N0YXR1cykgIT0gVkVMT0NJVFlfTElOS19DSEFOR0UpIHsKKwkJCXZlbG9jaXR5X3ByaW50X2xpbmtfc3RhdHVzKHZwdHIpOworCQkJaWYgKCEodnB0ci0+bWlpX3N0YXR1cyAmIFZFTE9DSVRZX0xJTktfRkFJTCkpCisJCQkJbmV0aWZfd2FrZV9xdWV1ZSh2cHRyLT5kZXYpOworCQl9CisKKwkJZW5hYmxlX2Zsb3dfY29udHJvbF9hYmlsaXR5KHZwdHIpOworCisJCW1hY19jbGVhcl9pc3IocmVncyk7CisJCXdyaXRlbChDUjBfU1RPUCwgJnJlZ3MtPkNSMENscik7CisJCXdyaXRlbCgoQ1IwX0RQT0xMIHwgQ1IwX1RYT04gfCBDUjBfUlhPTiB8IENSMF9TVFJUKSwgCisJCQkJCQkJJnJlZ3MtPkNSMFNldCk7CisKKwkJYnJlYWs7CisKKwljYXNlIFZFTE9DSVRZX0lOSVRfQ09MRDoKKwlkZWZhdWx0OgorCQkvKgorCQkgKglEbyByZXNldAorCQkgKi8KKwkJdmVsb2NpdHlfc29mdF9yZXNldCh2cHRyKTsKKwkJbWRlbGF5KDUpOworCisJCW1hY19lZXByb21fcmVsb2FkKHJlZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQl3cml0ZWIodnB0ci0+ZGV2LT5kZXZfYWRkcltpXSwgJihyZWdzLT5QQVJbaV0pKTsKKwkJfQorCQkvKgorCQkgKgljbGVhciBQcmVfQUNQSSBiaXQuCisJCSAqLworCQlCWVRFX1JFR19CSVRTX09GRihDRkdBX1BBQ1BJLCAmKHJlZ3MtPkNGR0EpKTsKKwkJbWFjX3NldF9yeF90aHJlc2gocmVncywgdnB0ci0+b3B0aW9ucy5yeF90aHJlc2gpOworCQltYWNfc2V0X2RtYV9sZW5ndGgocmVncywgdnB0ci0+b3B0aW9ucy5ETUFfbGVuZ3RoKTsKKworCQl3cml0ZWIoV09MQ0ZHX1NBTSB8IFdPTENGR19TQUIsICZyZWdzLT5XT0xDRkdTZXQpOworCQkvKgorCQkgKglCYWNrIG9mZiBhbGdvcml0aG0gdXNlIG9yaWdpbmFsIElFRUUgc3RhbmRhcmQKKwkJICovCisJCUJZVEVfUkVHX0JJVFNfU0VUKENGR0JfT0ZTRVQsIChDRkdCX0NSQU5ET00gfCBDRkdCX0NBUCB8IENGR0JfTUJBIHwgQ0ZHQl9CQUtPUFQpLCAmcmVncy0+Q0ZHQik7CisKKwkJLyoKKwkJICoJSW5pdCBDQU0gZmlsdGVyCisJCSAqLworCQl2ZWxvY2l0eV9pbml0X2NhbV9maWx0ZXIodnB0cik7CisKKwkJLyoKKwkJICoJU2V0IHBhY2tldCBmaWx0ZXI6IFJlY2VpdmUgZGlyZWN0ZWQgYW5kIGJyb2FkY2FzdCBhZGRyZXNzCisJCSAqLworCQl2ZWxvY2l0eV9zZXRfbXVsdGkodnB0ci0+ZGV2KTsKKworCQkvKgorCQkgKglFbmFibGUgTUlJIGF1dG8tcG9sbGluZworCQkgKi8KKwkJZW5hYmxlX21paV9hdXRvcG9sbChyZWdzKTsKKworCQl2cHRyLT5pbnRfbWFzayA9IElOVF9NQVNLX0RFRjsKKworCQl3cml0ZWwoY3B1X3RvX2xlMzIodnB0ci0+cmRfcG9vbF9kbWEpLCAmcmVncy0+UkRCYXNlTG8pOworCQl3cml0ZXcodnB0ci0+b3B0aW9ucy5udW1yeCAtIDEsICZyZWdzLT5SRENTaXplKTsKKwkJbWFjX3J4X3F1ZXVlX3J1bihyZWdzKTsKKwkJbWFjX3J4X3F1ZXVlX3dha2UocmVncyk7CisKKwkJd3JpdGV3KHZwdHItPm9wdGlvbnMubnVtdHggLSAxLCAmcmVncy0+VERDU2l6ZSk7CisKKwkJZm9yIChpID0gMDsgaSA8IHZwdHItPm51bV90eHE7IGkrKykgeworCQkJd3JpdGVsKGNwdV90b19sZTMyKHZwdHItPnRkX3Bvb2xfZG1hW2ldKSwgJihyZWdzLT5UREJhc2VMb1tpXSkpOworCQkJbWFjX3R4X3F1ZXVlX3J1bihyZWdzLCBpKTsKKwkJfQorCisJCWluaXRfZmxvd19jb250cm9sX3JlZ2lzdGVyKHZwdHIpOworCisJCXdyaXRlbChDUjBfU1RPUCwgJnJlZ3MtPkNSMENscik7CisJCXdyaXRlbCgoQ1IwX0RQT0xMIHwgQ1IwX1RYT04gfCBDUjBfUlhPTiB8IENSMF9TVFJUKSwgJnJlZ3MtPkNSMFNldCk7CisKKwkJbWlpX3N0YXR1cyA9IHZlbG9jaXR5X2dldF9vcHRfbWVkaWFfbW9kZSh2cHRyKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZSh2cHRyLT5kZXYpOworCisJCW1paV9pbml0KHZwdHIsIG1paV9zdGF0dXMpOworCisJCWlmICh2ZWxvY2l0eV9zZXRfbWVkaWFfbW9kZSh2cHRyLCBtaWlfc3RhdHVzKSAhPSBWRUxPQ0lUWV9MSU5LX0NIQU5HRSkgeworCQkJdmVsb2NpdHlfcHJpbnRfbGlua19zdGF0dXModnB0cik7CisJCQlpZiAoISh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfTElOS19GQUlMKSkKKwkJCQluZXRpZl93YWtlX3F1ZXVlKHZwdHItPmRldik7CisJCX0KKworCQllbmFibGVfZmxvd19jb250cm9sX2FiaWxpdHkodnB0cik7CisJCW1hY19od19taWJzX2luaXQocmVncyk7CisJCW1hY193cml0ZV9pbnRfbWFzayh2cHRyLT5pbnRfbWFzaywgcmVncyk7CisJCW1hY19jbGVhcl9pc3IocmVncyk7CisKKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfc29mdF9yZXNldAktCXNvZnQgcmVzZXQKKyAqCUB2cHRyOiB2ZWxvY2l0eSB0byByZXNldAorICoKKyAqCUtpY2sgb2ZmIGEgc29mdCByZXNldCBvZiB0aGUgdmVsb2NpdHkgYWRhcHRlciBhbmQgdGhlbiBwb2xsCisgKgl1bnRpbCB0aGUgcmVzZXQgc2VxdWVuY2UgaGFzIGNvbXBsZXRlZCBiZWZvcmUgcmV0dXJuaW5nLgorICovCisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfc29mdF9yZXNldChzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwlpbnQgaSA9IDA7CisKKwl3cml0ZWwoQ1IwX1NGUlNULCAmcmVncy0+Q1IwU2V0KTsKKworCWZvciAoaSA9IDA7IGkgPCBXX01BWF9USU1FT1VUOyBpKyspIHsKKwkJdWRlbGF5KDUpOworCQlpZiAoIURXT1JEX1JFR19CSVRTX0lTX09OKENSMF9TRlJTVCwgJnJlZ3MtPkNSMFNldCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBXX01BWF9USU1FT1VUKSB7CisJCXdyaXRlbChDUjBfRk9SU1JTVCwgJnJlZ3MtPkNSMFNldCk7CisJCS8qIEZJWE1FOiBQQ0kgUE9TVElORyAqLworCQkvKiBkZWxheSAybXMgKi8KKwkJbWRlbGF5KDIpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9mb3VuZDEJCS0Jc2V0IHVwIGRpc2NvdmVyZWQgdmVsb2NpdHkgY2FyZAorICoJQHBkZXY6IFBDSSBkZXZpY2UKKyAqCUBlbnQ6IFBDSSBkZXZpY2UgdGFibGUgZW50cnkgdGhhdCBtYXRjaGVkCisgKgorICoJQ29uZmlndXJlIGEgZGlzY292ZXJlZCBhZGFwdGVyIGZyb20gc2NyYXRjaC4gUmV0dXJuIGEgbmVnYXRpdmUKKyAqCWVycm5vIGVycm9yIGNvZGUgb24gZmFpbHVyZSBwYXRocy4KKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2ZWxvY2l0eV9mb3VuZDEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBmaXJzdCA9IDE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaTsKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mb190YmwgKmluZm8gPSAoc3RydWN0IHZlbG9jaXR5X2luZm9fdGJsICopIGVudC0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHI7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzOworCWludCByZXQgPSAtRU5PTUVNOworCisJaWYgKHZlbG9jaXR5X25pY3MgPj0gTUFYX1VOSVRTKSB7CisJCXByaW50ayhLRVJOX05PVElDRSBWRUxPQ0lUWV9OQU1FICI6IGFscmVhZHkgZm91bmQgJWQgTklDcy5cbiIsIAorCQkJCXZlbG9jaXR5X25pY3MpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHZlbG9jaXR5X2luZm8pKTsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgVkVMT0NJVFlfTkFNRSAiOiBhbGxvY2F0ZSBuZXQgZGV2aWNlIGZhaWxlZC5cbiIpOworCQlnb3RvIG91dDsKKwl9CisJCisJLyogQ2hhaW4gaXQgYWxsIHRvZ2V0aGVyICovCisJCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisJdnB0ciA9IGRldi0+cHJpdjsKKworCisJaWYgKGZpcnN0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIFZlci4gJXNcbiIsIAorCQkJVkVMT0NJVFlfRlVMTF9EUlZfTkFNLCBWRUxPQ0lUWV9WRVJTSU9OKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIFZJQSBOZXR3b3JraW5nIFRlY2hub2xvZ2llcywgSW5jLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIkNvcHlyaWdodCAoYykgMjAwNCBSZWQgSGF0IEluYy5cbiIpOworCQlmaXJzdCA9IDA7CisJfQorCisJdmVsb2NpdHlfaW5pdF9pbmZvKHBkZXYsIHZwdHIsIGluZm8pOworCisJdnB0ci0+ZGV2ID0gZGV2OworCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0IDwgMCkgCisJCWdvdG8gZXJyX2ZyZWVfZGV2OworCisJcmV0ID0gdmVsb2NpdHlfZ2V0X3BjaV9pbmZvKHZwdHIsIHBkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBWRUxPQ0lUWV9OQU1FICI6IEZhaWxlZCB0byBmaW5kIFBDSSBkZXZpY2UuXG4iKTsKKwkJZ290byBlcnJfZGlzYWJsZTsKKwl9CisKKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIFZFTE9DSVRZX05BTUUpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBWRUxPQ0lUWV9OQU1FICI6IEZhaWxlZCB0byBmaW5kIFBDSSBkZXZpY2UuXG4iKTsKKwkJZ290byBlcnJfZGlzYWJsZTsKKwl9CisKKwlyZWdzID0gaW9yZW1hcCh2cHRyLT5tZW1hZGRyLCB2cHRyLT5pb19zaXplKTsKKwlpZiAocmVncyA9PSBOVUxMKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX3JlbGVhc2VfcmVzOworCX0KKworCXZwdHItPm1hY19yZWdzID0gcmVnczsKKworCW1hY193b2xfcmVzZXQocmVncyk7CisKKwlkZXYtPmJhc2VfYWRkciA9IHZwdHItPmlvYWRkcjsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSByZWFkYigmcmVncy0+UEFSW2ldKTsKKworCisJdmVsb2NpdHlfZ2V0X29wdGlvbnMoJnZwdHItPm9wdGlvbnMsIHZlbG9jaXR5X25pY3MsIGRldi0+bmFtZSk7CisKKwkvKiAKKwkgKglNYXNrIG91dCB0aGUgb3B0aW9ucyBjYW5ub3QgYmUgc2V0IHRvIHRoZSBjaGlwCisJICovCisJIAorCXZwdHItPm9wdGlvbnMuZmxhZ3MgJj0gaW5mby0+ZmxhZ3M7CisKKwkvKgorCSAqCUVuYWJsZSB0aGUgY2hpcCBzcGVjaWZpZWQgY2FwYmlsaXRpZXMKKwkgKi8KKwkgCisJdnB0ci0+ZmxhZ3MgPSB2cHRyLT5vcHRpb25zLmZsYWdzIHwgKGluZm8tPmZsYWdzICYgMHhGRjAwMDAwMFVMKTsKKworCXZwdHItPndvbF9vcHRzID0gdnB0ci0+b3B0aW9ucy53b2xfb3B0czsKKwl2cHRyLT5mbGFncyB8PSBWRUxPQ0lUWV9GTEFHU19XT0xfRU5BQkxFRDsKKworCXZwdHItPnBoeV9pZCA9IE1JSV9HRVRfUEhZX0lEKHZwdHItPm1hY19yZWdzKTsKKworCWRldi0+aXJxID0gcGRldi0+aXJxOworCWRldi0+b3BlbiA9IHZlbG9jaXR5X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB2ZWxvY2l0eV94bWl0OworCWRldi0+c3RvcCA9IHZlbG9jaXR5X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gdmVsb2NpdHlfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gdmVsb2NpdHlfc2V0X211bHRpOworCWRldi0+ZG9faW9jdGwgPSB2ZWxvY2l0eV9pb2N0bDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnZlbG9jaXR5X2V0aHRvb2xfb3BzOworCWRldi0+Y2hhbmdlX210dSA9IHZlbG9jaXR5X2NoYW5nZV9tdHU7CisjaWZkZWYgIFZFTE9DSVRZX1pFUk9fQ09QWV9TVVBQT1JUCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHOworI2VuZGlmCisKKwlpZiAodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19UWF9DU1VNKSB7CisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19DU1VNOworCX0KKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9pb3VubWFwOworCisJdmVsb2NpdHlfcHJpbnRfaW5mbyh2cHRyKTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwkKKwkvKiBhbmQgbGVhdmUgdGhlIGNoaXAgcG93ZXJlZCBkb3duICovCisJCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDNob3QpOworI2lmZGVmIENPTkZJR19QTQorCXsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmVsb2NpdHlfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZCgmdnB0ci0+bGlzdCwgJnZlbG9jaXR5X2Rldl9saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmVsb2NpdHlfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOworCX0KKyNlbmRpZgorCXZlbG9jaXR5X25pY3MrKzsKK291dDoKKwlyZXR1cm4gcmV0OworCitlcnJfaW91bm1hcDoKKwlpb3VubWFwKHJlZ3MpOworZXJyX3JlbGVhc2VfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJfZnJlZV9kZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlnb3RvIG91dDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9wcmludF9pbmZvCS0JcGVyIGRyaXZlciBkYXRhCisgKglAdnB0cjogdmVsb2NpdHkKKyAqCisgKglQcmludCBwZXIgZHJpdmVyIGRhdGEgYXMgdGhlIGtlcm5lbCBkcml2ZXIgZmluZHMgVmVsb2NpdHkKKyAqCWhhcmR3YXJlCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHZlbG9jaXR5X3ByaW50X2luZm8oc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHZwdHItPmRldjsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBnZXRfY2hpcF9uYW1lKHZwdHItPmNoaXBfaWQpKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogRXRoZXJuZXQgQWRkcmVzczogJTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlhcbiIsIAorCQlkZXYtPm5hbWUsIAorCQlkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLCAKKwkJZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfaW5pdF9pbmZvCS0JaW5pdCBwcml2YXRlIGRhdGEKKyAqCUBwZGV2OiBQQ0kgZGV2aWNlCisgKglAdnB0cjogVmVsb2NpdHkgaW5mbworICoJQGluZm86IEJvYXJkIHR5cGUKKyAqCisgKglTZXQgdXAgdGhlIGluaXRpYWwgdmVsb2NpdHlfaW5mbyBzdHJ1Y3QgZm9yIHRoZSBkZXZpY2UgdGhhdCBoYXMgYmVlbgorICoJZGlzY292ZXJlZC4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdmVsb2NpdHlfaW5pdF9pbmZvKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgc3RydWN0IHZlbG9jaXR5X2luZm9fdGJsICppbmZvKQoreworCW1lbXNldCh2cHRyLCAwLCBzaXplb2Yoc3RydWN0IHZlbG9jaXR5X2luZm8pKTsKKworCXZwdHItPnBkZXYgPSBwZGV2OworCXZwdHItPmNoaXBfaWQgPSBpbmZvLT5jaGlwX2lkOworCXZwdHItPmlvX3NpemUgPSBpbmZvLT5pb19zaXplOworCXZwdHItPm51bV90eHEgPSBpbmZvLT50eHF1ZXVlOworCXZwdHItPm11bHRpY2FzdF9saW1pdCA9IE1DQU1fU0laRTsKKwlzcGluX2xvY2tfaW5pdCgmdnB0ci0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnZwdHItPmxpc3QpOworfQorCisvKioKKyAqCXZlbG9jaXR5X2dldF9wY2lfaW5mbwktCXJldHJpZXZlIFBDSSBpbmZvIGZvciBkZXZpY2UKKyAqCUB2cHRyOiB2ZWxvY2l0eSBkZXZpY2UKKyAqCUBwZGV2OiBQQ0kgZGV2aWNlIGl0IG1hdGNoZXMKKyAqCisgKglSZXRyaWV2ZSB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgZGF0YSB0aGF0IGludGVyZXN0cyB1cyBmcm9tCisgKgl0aGUga2VybmVsIFBDSSBsYXllcgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZlbG9jaXR5X2dldF9wY2lfaW5mbyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisKKwlpZihwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZ2cHRyLT5yZXZfaWQpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisJCQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJdnB0ci0+aW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCXZwdHItPm1lbWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJCisJaWYoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX0lPKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlZ2lvbiAjMCBpcyBub3QgYW4gSS9PIHJlc291cmNlLCBhYm9ydGluZy5cbiIsCisJCQkJcGNpX25hbWUocGRldikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZigocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDEpICYgSU9SRVNPVVJDRV9JTykpCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWdpb24gIzEgaXMgYW4gSS9PIHJlc291cmNlLCBhYm9ydGluZy5cbiIsCisJCQkJcGNpX25hbWUocGRldikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZihwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpIDwgMjU2KQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVnaW9uICMxIGlzIHRvbyBzbWFsbC5cbiIsIAorCQkJCXBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXZwdHItPnBkZXYgPSBwZGV2OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfaW5pdF9yaW5ncwktCXNldCB1cCBETUEgcmluZ3MKKyAqCUB2cHRyOiBWZWxvY2l0eSB0byBzZXQgdXAKKyAqCisgKglBbGxvY2F0ZSBQQ0kgbWFwcGVkIERNQSByaW5ncyBmb3IgdGhlIHJlY2VpdmUgYW5kIHRyYW5zbWl0IGxheWVyCisgKgl0byB1c2UuCisgKi8KKworc3RhdGljIGludCB2ZWxvY2l0eV9pbml0X3JpbmdzKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBwc2l6ZTsKKwl1bnNpZ25lZCBpbnQgdHNpemU7CisJZG1hX2FkZHJfdCBwb29sX2RtYTsKKwl1OCAqcG9vbDsKKworCS8qCisJICoJQWxsb2NhdGUgYWxsIFJEL1REIHJpbmdzIGEgc2luZ2xlIHBvb2wgCisJICovCisJIAorCXBzaXplID0gdnB0ci0+b3B0aW9ucy5udW1yeCAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKyAKKwkJdnB0ci0+b3B0aW9ucy5udW10eCAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiB2cHRyLT5udW1fdHhxOworCisJLyoKKwkgKiBwY2lfYWxsb2NfY29uc2lzdGVudCgpIGZ1bGZpbGxzIHRoZSByZXF1aXJlbWVudCBmb3IgNjQgYnl0ZXMKKwkgKiBhbGlnbm1lbnQKKwkgKi8KKwlwb29sID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodnB0ci0+cGRldiwgcHNpemUsICZwb29sX2RtYSk7CisKKwlpZiAocG9vbCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgOiBETUEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxuIiwgCisJCQkJCXZwdHItPmRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChwb29sLCAwLCBwc2l6ZSk7CisKKwl2cHRyLT5yZF9yaW5nID0gKHN0cnVjdCByeF9kZXNjICopIHBvb2w7CisKKwl2cHRyLT5yZF9wb29sX2RtYSA9IHBvb2xfZG1hOworCisJdHNpemUgPSB2cHRyLT5vcHRpb25zLm51bXR4ICogUEtUX0JVRl9TWiAqIHZwdHItPm51bV90eHE7CisJdnB0ci0+dHhfYnVmcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHZwdHItPnBkZXYsIHRzaXplLCAKKwkJCQkJCSZ2cHRyLT50eF9idWZzX2RtYSk7CisKKwlpZiAodnB0ci0+dHhfYnVmcyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IERNQSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iLCAKKwkJCQkJdnB0ci0+ZGV2LT5uYW1lKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh2cHRyLT5wZGV2LCBwc2l6ZSwgcG9vbCwgcG9vbF9kbWEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQodnB0ci0+dHhfYnVmcywgMCwgdnB0ci0+b3B0aW9ucy5udW10eCAqIFBLVF9CVUZfU1ogKiB2cHRyLT5udW1fdHhxKTsKKworCWkgPSB2cHRyLT5vcHRpb25zLm51bXJ4ICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKTsKKwlwb29sICs9IGk7CisJcG9vbF9kbWEgKz0gaTsKKwlmb3IgKGkgPSAwOyBpIDwgdnB0ci0+bnVtX3R4cTsgaSsrKSB7CisJCWludCBvZmZzZXQgPSB2cHRyLT5vcHRpb25zLm51bXR4ICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKTsKKworCQl2cHRyLT50ZF9wb29sX2RtYVtpXSA9IHBvb2xfZG1hOworCQl2cHRyLT50ZF9yaW5nc1tpXSA9IChzdHJ1Y3QgdHhfZGVzYyAqKSBwb29sOworCQlwb29sICs9IG9mZnNldDsKKwkJcG9vbF9kbWEgKz0gb2Zmc2V0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9mcmVlX3JpbmdzCS0JZnJlZSBQQ0kgcmluZyBwb2ludGVycworICoJQHZwdHI6IFZlbG9jaXR5IHRvIGZyZWUgZnJvbQorICoKKyAqCUNsZWFuIHVwIHRoZSBQQ0kgcmluZyBidWZmZXJzIGFsbG9jYXRlZCB0byB0aGlzIHZlbG9jaXR5LgorICovCisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2ZyZWVfcmluZ3Moc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJaW50IHNpemU7CisKKwlzaXplID0gdnB0ci0+b3B0aW9ucy5udW1yeCAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKyAKKwkgICAgICAgdnB0ci0+b3B0aW9ucy5udW10eCAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiB2cHRyLT5udW1fdHhxOworCisJcGNpX2ZyZWVfY29uc2lzdGVudCh2cHRyLT5wZGV2LCBzaXplLCB2cHRyLT5yZF9yaW5nLCB2cHRyLT5yZF9wb29sX2RtYSk7CisKKwlzaXplID0gdnB0ci0+b3B0aW9ucy5udW10eCAqIFBLVF9CVUZfU1ogKiB2cHRyLT5udW1fdHhxOworCisJcGNpX2ZyZWVfY29uc2lzdGVudCh2cHRyLT5wZGV2LCBzaXplLCB2cHRyLT50eF9idWZzLCB2cHRyLT50eF9idWZzX2RtYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZWxvY2l0eV9naXZlX21hbnlfcnhfZGVzY3Moc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKnJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwlpbnQgYXZhaWwsIGRpcnR5LCB1bnVzYWJsZTsKKworCS8qCisJICogUkQgbnVtYmVyIG11c3QgYmUgZXF1YWwgdG8gNFggcGVyIGhhcmR3YXJlIHNwZWMKKwkgKiAocHJvZ3JhbW1pbmcgZ3VpZGUgcmV2IDEuMjAsIHAuMTMpCisJICovCisJaWYgKHZwdHItPnJkX2ZpbGxlZCA8IDQpCisJCXJldHVybjsKKworCXdtYigpOworCisJdW51c2FibGUgPSB2cHRyLT5yZF9maWxsZWQgJiAweDAwMDM7CisJZGlydHkgPSB2cHRyLT5yZF9kaXJ0eSAtIHVudXNhYmxlOworCWZvciAoYXZhaWwgPSB2cHRyLT5yZF9maWxsZWQgJiAweGZmZmM7IGF2YWlsOyBhdmFpbC0tKSB7CisJCWRpcnR5ID0gKGRpcnR5ID4gMCkgPyBkaXJ0eSAtIDEgOiB2cHRyLT5vcHRpb25zLm51bXJ4IC0gMTsKKwkJdnB0ci0+cmRfcmluZ1tkaXJ0eV0ucmRlc2MwLm93bmVyID0gT1dORURfQllfTklDOworCX0KKworCXdyaXRldyh2cHRyLT5yZF9maWxsZWQgJiAweGZmZmMsICZyZWdzLT5SQlJEVSk7CisJdnB0ci0+cmRfZmlsbGVkID0gdW51c2FibGU7Cit9CisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfcnhfcmVmaWxsKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCWludCBkaXJ0eSA9IHZwdHItPnJkX2RpcnR5LCBkb25lID0gMCwgcmV0ID0gMDsKKworCWRvIHsKKwkJc3RydWN0IHJ4X2Rlc2MgKnJkID0gdnB0ci0+cmRfcmluZyArIGRpcnR5OworCisJCS8qIEZpbmUgZm9yIGFuIGFsbCB6ZXJvIFJ4IGRlc2MgYXQgaW5pdCB0aW1lIGFzIHdlbGwgKi8KKwkJaWYgKHJkLT5yZGVzYzAub3duZXIgPT0gT1dORURfQllfTklDKQorCQkJYnJlYWs7CisKKwkJaWYgKCF2cHRyLT5yZF9pbmZvW2RpcnR5XS5za2IpIHsKKwkJCXJldCA9IHZlbG9jaXR5X2FsbG9jX3J4X2J1Zih2cHRyLCBkaXJ0eSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQlkb25lKys7CisJCWRpcnR5ID0gKGRpcnR5IDwgdnB0ci0+b3B0aW9ucy5udW1yeCAtIDEpID8gZGlydHkgKyAxIDogMDsJCisJfSB3aGlsZSAoZGlydHkgIT0gdnB0ci0+cmRfY3Vycik7CisKKwlpZiAoZG9uZSkgeworCQl2cHRyLT5yZF9kaXJ0eSA9IGRpcnR5OworCQl2cHRyLT5yZF9maWxsZWQgKz0gZG9uZTsKKwkJdmVsb2NpdHlfZ2l2ZV9tYW55X3J4X2Rlc2NzKHZwdHIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfaW5pdF9yZF9yaW5nCS0Jc2V0IHVwIHJlY2VpdmUgcmluZworICoJQHZwdHI6IHZlbG9jaXR5IHRvIGNvbmZpZ3VyZQorICoKKyAqCUFsbG9jYXRlIGFuZCBzZXQgdXAgdGhlIHJlY2VpdmUgYnVmZmVycyBmb3IgZWFjaCByaW5nIHNsb3QgYW5kCisgKglhc3NpZ24gdGhlbSB0byB0aGUgbmV0d29yayBhZGFwdGVyLgorICovCisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfaW5pdF9yZF9yaW5nKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCWludCByZXQgPSAtRU5PTUVNOworCXVuc2lnbmVkIGludCByc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmVsb2NpdHlfcmRfaW5mbykgKiAKKwkJCQkJdnB0ci0+b3B0aW9ucy5udW1yeDsKKworCXZwdHItPnJkX2luZm8gPSBrbWFsbG9jKHJzaXplLCBHRlBfS0VSTkVMKTsKKwlpZih2cHRyLT5yZF9pbmZvID09IE5VTEwpCisJCWdvdG8gb3V0OworCW1lbXNldCh2cHRyLT5yZF9pbmZvLCAwLCByc2l6ZSk7CisKKwl2cHRyLT5yZF9maWxsZWQgPSB2cHRyLT5yZF9kaXJ0eSA9IHZwdHItPnJkX2N1cnIgPSAwOworCisJcmV0ID0gdmVsb2NpdHlfcnhfcmVmaWxsKHZwdHIpOworCWlmIChyZXQgPCAwKSB7CisJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfRVJSLCBLRVJOX0VSUgorCQkJIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgUlggYnVmZmVyLlxuIiwgdnB0ci0+ZGV2LT5uYW1lKTsKKwkJdmVsb2NpdHlfZnJlZV9yZF9yaW5nKHZwdHIpOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCXZlbG9jaXR5X2ZyZWVfcmRfcmluZwktCWZyZWUgcmVjZWl2ZSByaW5nCisgKglAdnB0cjogdmVsb2NpdHkgdG8gY2xlYW4gdXAKKyAqCisgKglGcmVlIHRoZSByZWNlaXZlIGJ1ZmZlcnMgZm9yIGVhY2ggcmluZyBzbG90IGFuZCBhbnkKKyAqCWF0dGFjaGVkIHNvY2tldCBidWZmZXJzIHRoYXQgbmVlZCB0byBnbyBhd2F5LgorICovCisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2ZyZWVfcmRfcmluZyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwlpbnQgaTsKKworCWlmICh2cHRyLT5yZF9pbmZvID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCB2cHRyLT5vcHRpb25zLm51bXJ4OyBpKyspIHsKKwkJc3RydWN0IHZlbG9jaXR5X3JkX2luZm8gKnJkX2luZm8gPSAmKHZwdHItPnJkX2luZm9baV0pOworCisJCWlmICghcmRfaW5mby0+c2tiKQorCQkJY29udGludWU7CisJCXBjaV91bm1hcF9zaW5nbGUodnB0ci0+cGRldiwgcmRfaW5mby0+c2tiX2RtYSwgdnB0ci0+cnhfYnVmX3N6LAorCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlyZF9pbmZvLT5za2JfZG1hID0gKGRtYV9hZGRyX3QpIE5VTEw7CisKKwkJZGV2X2tmcmVlX3NrYihyZF9pbmZvLT5za2IpOworCQlyZF9pbmZvLT5za2IgPSBOVUxMOworCX0KKworCWtmcmVlKHZwdHItPnJkX2luZm8pOworCXZwdHItPnJkX2luZm8gPSBOVUxMOworfQorCisvKioKKyAqCXZlbG9jaXR5X2luaXRfdGRfcmluZwktCXNldCB1cCB0cmFuc21pdCByaW5nCisgKglAdnB0cjoJdmVsb2NpdHkKKyAqCisgKglTZXQgdXAgdGhlIHRyYW5zbWl0IHJpbmcgYW5kIGNoYWluIHRoZSByaW5nIHBvaW50ZXJzIHRvZ2V0aGVyLgorICoJUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBwb3NpeCBlcnJubyBjb2RlIGZvcgorICoJZmFpbHVyZS4KKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV9pbml0X3RkX3Jpbmcoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJaW50IGksIGo7CisJZG1hX2FkZHJfdCBjdXJyOworCXN0cnVjdCB0eF9kZXNjICp0ZDsKKwlzdHJ1Y3QgdmVsb2NpdHlfdGRfaW5mbyAqdGRfaW5mbzsKKwl1bnNpZ25lZCBpbnQgdHNpemUgPSBzaXplb2Yoc3RydWN0IHZlbG9jaXR5X3RkX2luZm8pICogCisJCQkJCXZwdHItPm9wdGlvbnMubnVtdHg7CisKKwkvKiBJbml0IHRoZSBURCByaW5nIGVudHJpZXMgKi8KKwlmb3IgKGogPSAwOyBqIDwgdnB0ci0+bnVtX3R4cTsgaisrKSB7CisJCWN1cnIgPSB2cHRyLT50ZF9wb29sX2RtYVtqXTsKKworCQl2cHRyLT50ZF9pbmZvc1tqXSA9IGttYWxsb2ModHNpemUsIEdGUF9LRVJORUwpOworCQlpZih2cHRyLT50ZF9pbmZvc1tqXSA9PSBOVUxMKQorCQl7CisJCQl3aGlsZSgtLWogPj0gMCkKKwkJCQlrZnJlZSh2cHRyLT50ZF9pbmZvc1tqXSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1zZXQodnB0ci0+dGRfaW5mb3Nbal0sIDAsIHRzaXplKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgdnB0ci0+b3B0aW9ucy5udW10eDsgaSsrLCBjdXJyICs9IHNpemVvZihzdHJ1Y3QgdHhfZGVzYykpIHsKKwkJCXRkID0gJih2cHRyLT50ZF9yaW5nc1tqXVtpXSk7CisJCQl0ZF9pbmZvID0gJih2cHRyLT50ZF9pbmZvc1tqXVtpXSk7CisJCQl0ZF9pbmZvLT5idWYgPSB2cHRyLT50eF9idWZzICsKKwkJCQkoaiAqIHZwdHItPm9wdGlvbnMubnVtdHggKyBpKSAqIFBLVF9CVUZfU1o7CisJCQl0ZF9pbmZvLT5idWZfZG1hID0gdnB0ci0+dHhfYnVmc19kbWEgKworCQkJCShqICogdnB0ci0+b3B0aW9ucy5udW10eCArIGkpICogUEtUX0JVRl9TWjsKKwkJfQorCQl2cHRyLT50ZF90YWlsW2pdID0gdnB0ci0+dGRfY3VycltqXSA9IHZwdHItPnRkX3VzZWRbal0gPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUZJWE1FOiBjb3VsZCB3ZSBtZXJnZSB0aGlzIHdpdGggdmVsb2NpdHlfZnJlZV90eF9idWYgPworICovCisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2ZyZWVfdGRfcmluZ19lbnRyeShzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwKKwkJCQkJCQkgaW50IHEsIGludCBuKQoreworCXN0cnVjdCB2ZWxvY2l0eV90ZF9pbmZvICogdGRfaW5mbyA9ICYodnB0ci0+dGRfaW5mb3NbcV1bbl0pOworCWludCBpOworCQorCWlmICh0ZF9pbmZvID09IE5VTEwpCisJCXJldHVybjsKKwkJCisJaWYgKHRkX2luZm8tPnNrYikgeworCQlmb3IgKGkgPSAwOyBpIDwgdGRfaW5mby0+bnNrYl9kbWE7IGkrKykKKwkJeworCQkJaWYgKHRkX2luZm8tPnNrYl9kbWFbaV0pIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHZwdHItPnBkZXYsIHRkX2luZm8tPnNrYl9kbWFbaV0sIAorCQkJCQl0ZF9pbmZvLT5za2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJdGRfaW5mby0+c2tiX2RtYVtpXSA9IChkbWFfYWRkcl90KSBOVUxMOworCQkJfQorCQl9CisJCWRldl9rZnJlZV9za2IodGRfaW5mby0+c2tiKTsKKwkJdGRfaW5mby0+c2tiID0gTlVMTDsKKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfZnJlZV90ZF9yaW5nCS0JZnJlZSB0ZCByaW5nCisgKglAdnB0cjogdmVsb2NpdHkKKyAqCisgKglGcmVlIHVwIHRoZSB0cmFuc21pdCByaW5nIGZvciB0aGlzIHBhcnRpY3VsYXIgdmVsb2NpdHkgYWRhcHRlci4KKyAqCVdlIGZyZWUgdGhlIHJpbmcgY29udGVudHMgYnV0IG5vdCB0aGUgcmluZyBpdHNlbGYuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2ZyZWVfdGRfcmluZyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaiA9IDA7IGogPCB2cHRyLT5udW1fdHhxOyBqKyspIHsKKwkJaWYgKHZwdHItPnRkX2luZm9zW2pdID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJZm9yIChpID0gMDsgaSA8IHZwdHItPm9wdGlvbnMubnVtdHg7IGkrKykgeworCQkJdmVsb2NpdHlfZnJlZV90ZF9yaW5nX2VudHJ5KHZwdHIsIGosIGkpOworCisJCX0KKwkJaWYgKHZwdHItPnRkX2luZm9zW2pdKSB7CisJCQlrZnJlZSh2cHRyLT50ZF9pbmZvc1tqXSk7CisJCQl2cHRyLT50ZF9pbmZvc1tqXSA9IE5VTEw7CisJCX0KKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfcnhfc3J2CQktCXNlcnZpY2UgUlggaW50ZXJydXB0CisgKglAdnB0cjogdmVsb2NpdHkKKyAqCUBzdGF0dXM6IGFkYXB0ZXIgc3RhdHVzICh1bnVzZWQpCisgKgorICoJV2FsayB0aGUgcmVjZWl2ZSByaW5nIG9mIHRoZSB2ZWxvY2l0eSBhZGFwdGVyIGFuZCByZW1vdmUKKyAqCWFueSByZWNlaXZlZCBwYWNrZXRzIGZyb20gdGhlIHJlY2VpdmUgcXVldWUuIEhhbmQgdGhlIHJpbmcKKyAqCXNsb3RzIGJhY2sgdG8gdGhlIGFkYXB0ZXIgZm9yIHJldXNlLgorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X3J4X3NydihzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdnB0ci0+c3RhdHM7CisJaW50IHJkX2N1cnIgPSB2cHRyLT5yZF9jdXJyOworCWludCB3b3JrcyA9IDA7CisKKwlkbyB7CisJCXN0cnVjdCByeF9kZXNjICpyZCA9IHZwdHItPnJkX3JpbmcgKyByZF9jdXJyOworCisJCWlmICghdnB0ci0+cmRfaW5mb1tyZF9jdXJyXS5za2IpCisJCQlicmVhazsKKworCQlpZiAocmQtPnJkZXNjMC5vd25lciA9PSBPV05FRF9CWV9OSUMpCisJCQlicmVhazsKKworCQlybWIoKTsKKworCQkvKgorCQkgKglEb24ndCBkcm9wIENFIG9yIFJMIGVycm9yIGZyYW1lIGFsdGhvdWdoIFJYT0sgaXMgb2ZmCisJCSAqLworCQlpZiAoKHJkLT5yZGVzYzAuUlNSICYgUlNSX1JYT0spIHx8ICghKHJkLT5yZGVzYzAuUlNSICYgUlNSX1JYT0spICYmIChyZC0+cmRlc2MwLlJTUiAmIChSU1JfQ0UgfCBSU1JfUkwpKSkpIHsKKwkJCWlmICh2ZWxvY2l0eV9yZWNlaXZlX2ZyYW1lKHZwdHIsIHJkX2N1cnIpIDwgMCkKKwkJCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQl9IGVsc2UgeworCQkJaWYgKHJkLT5yZGVzYzAuUlNSICYgUlNSX0NSQykKKwkJCQlzdGF0cy0+cnhfY3JjX2Vycm9ycysrOworCQkJaWYgKHJkLT5yZGVzYzAuUlNSICYgUlNSX0ZBRSkKKwkJCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7CisKKwkJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCX0KKworCQlyZC0+aW50ZW4gPSAxOworCisJCXZwdHItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKwkJcmRfY3VycisrOworCQlpZiAocmRfY3VyciA+PSB2cHRyLT5vcHRpb25zLm51bXJ4KQorCQkJcmRfY3VyciA9IDA7CisJfSB3aGlsZSAoKyt3b3JrcyA8PSAxNSk7CisKKwl2cHRyLT5yZF9jdXJyID0gcmRfY3VycjsKKworCWlmICh3b3JrcyA+IDAgJiYgdmVsb2NpdHlfcnhfcmVmaWxsKHZwdHIpIDwgMCkgeworCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0VSUiwgS0VSTl9FUlIKKwkJCSIlczogcnggYnVmIGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgdnB0ci0+ZGV2LT5uYW1lKTsKKwl9CisKKwlWQVJfVVNFRChzdGF0cyk7CisJcmV0dXJuIHdvcmtzOworfQorCisvKioKKyAqCXZlbG9jaXR5X3J4X2NzdW0JLQljaGVja3N1bSBwcm9jZXNzCisgKglAcmQ6IHJlY2VpdmUgcGFja2V0IGRlc2NyaXB0b3IKKyAqCUBza2I6IG5ldHdvcmsgbGF5ZXIgcGFja2V0IGJ1ZmZlcgorICoKKyAqCVByb2Nlc3MgdGhlIHN0YXR1cyBiaXRzIGZvciB0aGUgcmVjZWl2ZWQgcGFja2V0IGFuZCBkZXRlcm1pbmUKKyAqCWlmIHRoZSBjaGVja3N1bSB3YXMgY29tcHV0ZWQgYW5kIHZlcmlmaWVkIGJ5IHRoZSBoYXJkd2FyZQorICovCisgCitzdGF0aWMgaW5saW5lIHZvaWQgdmVsb2NpdHlfcnhfY3N1bShzdHJ1Y3QgcnhfZGVzYyAqcmQsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJaWYgKHJkLT5yZGVzYzEuQ1NNICYgQ1NNX0lQS1QpIHsKKwkJaWYgKHJkLT5yZGVzYzEuQ1NNICYgQ1NNX0lQT0spIHsKKwkJCWlmICgocmQtPnJkZXNjMS5DU00gJiBDU01fVENQS1QpIHx8IAorCQkJCQkocmQtPnJkZXNjMS5DU00gJiBDU01fVURQS1QpKSB7CisJCQkJaWYgKCEocmQtPnJkZXNjMS5DU00gJiBDU01fVFVQT0spKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQl9CisJfQorfQorCisvKioKKyAqCXZlbG9jaXR5X3J4X2NvcHkJLQlpbiBwbGFjZSBSeCBjb3B5IGZvciBzbWFsbCBwYWNrZXRzCisgKglAcnhfc2tiOiBuZXR3b3JrIGxheWVyIHBhY2tldCBidWZmZXIgY2FuZGlkYXRlCisgKglAcGt0X3NpemU6IHJlY2VpdmVkIGRhdGEgc2l6ZQorICoJQHJkOiByZWNlaXZlIHBhY2tldCBkZXNjcmlwdG9yCisgKglAZGV2OiBuZXR3b3JrIGRldmljZQorICoKKyAqCVJlcGxhY2UgdGhlIGN1cnJlbnQgc2tiIHRoYXQgaXMgc2NoZWR1bGVkIGZvciBSeCBwcm9jZXNzaW5nIGJ5IGEKKyAqCXNob3J0ZXIsIGltbWVkaWF0bHkgYWxsb2NhdGVkIHNrYiwgaWYgdGhlIHJlY2VpdmVkIHBhY2tldCBpcyBzbWFsbAorICoJZW5vdWdoLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgcmVjZWl2ZWQKKyAqCXBhY2tldCBpcyB0b28gYmlnIG9yIGlmIG1lbW9yeSBpcyBleGhhdXN0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZlbG9jaXR5X3J4X2NvcHkoc3RydWN0IHNrX2J1ZmYgKipyeF9za2IsIGludCBwa3Rfc2l6ZSwKKwkJCQkgICBzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAocGt0X3NpemUgPCByeF9jb3B5YnJlYWspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisKKwkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IocGt0X3NpemUgKyAyKTsKKwkJaWYgKG5ld19za2IpIHsKKwkJCW5ld19za2ItPmRldiA9IHZwdHItPmRldjsKKwkJCW5ld19za2ItPmlwX3N1bW1lZCA9IHJ4X3NrYlswXS0+aXBfc3VtbWVkOworCisJCQlpZiAodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19JUF9BTElHTikKKwkJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCAyKTsKKworCQkJbWVtY3B5KG5ld19za2ItPmRhdGEsIHJ4X3NrYlswXS0+dGFpbCwgcGt0X3NpemUpOworCQkJKnJ4X3NrYiA9IG5ld19za2I7CisJCQlyZXQgPSAwOworCQl9CisJCQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCXZlbG9jaXR5X2lwaF9yZWFsaWduCS0JSVAgaGVhZGVyIGFsaWdubWVudAorICoJQHZwdHI6IHZlbG9jaXR5IHdlIGFyZSBoYW5kbGluZworICoJQHNrYjogbmV0d29yayBsYXllciBwYWNrZXQgYnVmZmVyCisgKglAcGt0X3NpemU6IHJlY2VpdmVkIGRhdGEgc2l6ZQorICoKKyAqCUFsaWduIElQIGhlYWRlciBvbiBhIDIgYnl0ZXMgYm91bmRhcnkuIFRoaXMgYmVoYXZpb3IgY2FuIGJlCisgKgljb25maWd1cmVkIGJ5IHRoZSB1c2VyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdmVsb2NpdHlfaXBoX3JlYWxpZ24oc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsCisJCQkJCXN0cnVjdCBza19idWZmICpza2IsIGludCBwa3Rfc2l6ZSkKK3sKKwkvKiBGSVhNRSAtIG1lbW1vdmUgPyAqLworCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX0lQX0FMSUdOKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IHBrdF9zaXplOyBpID49IDA7IGktLSkKKwkJCSooc2tiLT5kYXRhICsgaSArIDIpID0gKihza2ItPmRhdGEgKyBpKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfcmVjZWl2ZV9mcmFtZQktCXJlY2VpdmVkIHBhY2tldCBwcm9jZXNzb3IKKyAqCUB2cHRyOiB2ZWxvY2l0eSB3ZSBhcmUgaGFuZGxpbmcKKyAqCUBpZHg6IHJpbmcgaW5kZXgKKyAqCQorICoJQSBwYWNrZXQgaGFzIGFycml2ZWQuIFdlIHByb2Nlc3MgdGhlIHBhY2tldCBhbmQgaWYgYXBwcm9wcmlhdGUKKyAqCXBhc3MgdGhlIGZyYW1lIHVwIHRoZSBuZXR3b3JrIHN0YWNrCisgKi8KKyAKK3N0YXRpYyBpbnQgdmVsb2NpdHlfcmVjZWl2ZV9mcmFtZShzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgaW50IGlkeCkKK3sKKwl2b2lkICgqcGNpX2FjdGlvbikoc3RydWN0IHBjaV9kZXYgKiwgZG1hX2FkZHJfdCwgc2l6ZV90LCBpbnQpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ2cHRyLT5zdGF0czsKKwlzdHJ1Y3QgdmVsb2NpdHlfcmRfaW5mbyAqcmRfaW5mbyA9ICYodnB0ci0+cmRfaW5mb1tpZHhdKTsKKwlzdHJ1Y3QgcnhfZGVzYyAqcmQgPSAmKHZwdHItPnJkX3JpbmdbaWR4XSk7CisJaW50IHBrdF9sZW4gPSByZC0+cmRlc2MwLmxlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKHJkLT5yZGVzYzAuUlNSICYgKFJTUl9TVFAgfCBSU1JfRURQKSkgeworCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX1ZFUkJPU0UsIEtFUk5fRVJSICIgJXMgOiB0aGUgcmVjZWl2ZWQgZnJhbWUgc3BhbiBtdWx0cGxlIFJEcy5cbiIsIHZwdHItPmRldi0+bmFtZSk7CisJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChyZC0+cmRlc2MwLlJTUiAmIFJTUl9NQVIpCisJCXZwdHItPnN0YXRzLm11bHRpY2FzdCsrOworCisJc2tiID0gcmRfaW5mby0+c2tiOworCXNrYi0+ZGV2ID0gdnB0ci0+ZGV2OworCisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHZwdHItPnBkZXYsIHJkX2luZm8tPnNrYl9kbWEsCisJCQkJICAgIHZwdHItPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCS8qCisJICoJRHJvcCBmcmFtZSBub3QgbWVldGluZyBJRUVFIDgwMi4zCisJICovCisJIAorCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX1ZBTF9QS1RfTEVOKSB7CisJCWlmIChyZC0+cmRlc2MwLlJTUiAmIFJTUl9STCkgeworCQkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcGNpX2FjdGlvbiA9IHBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZTsKKworCXZlbG9jaXR5X3J4X2NzdW0ocmQsIHNrYik7CisKKwlpZiAodmVsb2NpdHlfcnhfY29weSgmc2tiLCBwa3RfbGVuLCB2cHRyKSA8IDApIHsKKwkJdmVsb2NpdHlfaXBoX3JlYWxpZ24odnB0ciwgc2tiLCBwa3RfbGVuKTsKKwkJcGNpX2FjdGlvbiA9IHBjaV91bm1hcF9zaW5nbGU7CisJCXJkX2luZm8tPnNrYiA9IE5VTEw7CisJfQorCisJcGNpX2FjdGlvbih2cHRyLT5wZGV2LCByZF9pbmZvLT5za2JfZG1hLCB2cHRyLT5yeF9idWZfc3osCisJCSAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwlza2JfcHV0KHNrYiwgcGt0X2xlbiAtIDQpOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsJCisKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwluZXRpZl9yeChza2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfYWxsb2NfcnhfYnVmCS0JYWxsb2NhdGUgYWxpZ25lZCByZWNlaXZlIGJ1ZmZlcgorICoJQHZwdHI6IHZlbG9jaXR5CisgKglAaWR4OiByaW5nIGluZGV4CisgKgorICoJQWxsb2NhdGUgYSBuZXcgZnVsbCBzaXplZCBidWZmZXIgZm9yIHRoZSByZWNlcHRpb24gb2YgYSBmcmFtZSBhbmQKKyAqCW1hcCBpdCBpbnRvIFBDSSBzcGFjZSBmb3IgdGhlIGhhcmR3YXJlIHRvIHVzZS4gVGhlIGhhcmR3YXJlCisgKglyZXF1aXJlcyAqNjQqIGJ5dGUgYWxpZ25tZW50IG9mIHRoZSBidWZmZXIgd2hpY2ggbWFrZXMgbGlmZQorICoJbGVzcyBmdW4gdGhhbiB3b3VsZCBiZSBpZGVhbC4KKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV9hbGxvY19yeF9idWYoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIGludCBpZHgpCit7CisJc3RydWN0IHJ4X2Rlc2MgKnJkID0gJih2cHRyLT5yZF9yaW5nW2lkeF0pOworCXN0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvICpyZF9pbmZvID0gJih2cHRyLT5yZF9pbmZvW2lkeF0pOworCisJcmRfaW5mby0+c2tiID0gZGV2X2FsbG9jX3NrYih2cHRyLT5yeF9idWZfc3ogKyA2NCk7CisJaWYgKHJkX2luZm8tPnNrYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICoJRG8gdGhlIGd5bW5hc3RpY3MgdG8gZ2V0IHRoZSBidWZmZXIgaGVhZCBmb3IgZGF0YSBhdAorCSAqCTY0Ynl0ZSBhbGlnbm1lbnQuCisJICovCisJc2tiX3Jlc2VydmUocmRfaW5mby0+c2tiLCAodW5zaWduZWQgbG9uZykgcmRfaW5mby0+c2tiLT50YWlsICYgNjMpOworCXJkX2luZm8tPnNrYi0+ZGV2ID0gdnB0ci0+ZGV2OworCXJkX2luZm8tPnNrYl9kbWEgPSBwY2lfbWFwX3NpbmdsZSh2cHRyLT5wZGV2LCByZF9pbmZvLT5za2ItPnRhaWwsIHZwdHItPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkKKwkvKgorCSAqCUZpbGwgaW4gdGhlIGRlc2NyaXB0b3IgdG8gbWF0Y2gKKyAJICovCQorIAkgCisJKigodTMyICopICYgKHJkLT5yZGVzYzApKSA9IDA7CisJcmQtPmxlbiA9IGNwdV90b19sZTMyKHZwdHItPnJ4X2J1Zl9zeik7CisJcmQtPmludGVuID0gMTsKKwlyZC0+cGFfbG93ID0gY3B1X3RvX2xlMzIocmRfaW5mby0+c2tiX2RtYSk7CisJcmQtPnBhX2hpZ2ggPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqCXR4X3NydgkJLQl0cmFuc21pdCBpbnRlcnJ1cHQgc2VydmljZQorICoJQHZwdHI7IFZlbG9jaXR5CisgKglAc3RhdHVzOgorICoKKyAqCVNjYW4gdGhlIHF1ZXVlcyBsb29raW5nIGZvciB0cmFuc21pdHRlZCBwYWNrZXRzIHRoYXQKKyAqCXdlIGNhbiBjb21wbGV0ZSBhbmQgY2xlYW4gdXAuIFVwZGF0ZSBhbnkgc3RhdGlzdGljcyBhcworICoJbmVjY2Vzc2FyeS8KKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV90eF9zcnYoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIHUzMiBzdGF0dXMpCit7CisJc3RydWN0IHR4X2Rlc2MgKnRkOworCWludCBxbnVtOworCWludCBmdWxsID0gMDsKKwlpbnQgaWR4OworCWludCB3b3JrcyA9IDA7CisJc3RydWN0IHZlbG9jaXR5X3RkX2luZm8gKnRkaW5mbzsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdnB0ci0+c3RhdHM7CisKKwlmb3IgKHFudW0gPSAwOyBxbnVtIDwgdnB0ci0+bnVtX3R4cTsgcW51bSsrKSB7CisJCWZvciAoaWR4ID0gdnB0ci0+dGRfdGFpbFtxbnVtXTsgdnB0ci0+dGRfdXNlZFtxbnVtXSA+IDA7IAorCQkJaWR4ID0gKGlkeCArIDEpICUgdnB0ci0+b3B0aW9ucy5udW10eCkgeworCisJCQkvKgorCQkJICoJR2V0IFR4IERlc2NyaXB0b3IKKwkJCSAqLworCQkJdGQgPSAmKHZwdHItPnRkX3JpbmdzW3FudW1dW2lkeF0pOworCQkJdGRpbmZvID0gJih2cHRyLT50ZF9pbmZvc1txbnVtXVtpZHhdKTsKKworCQkJaWYgKHRkLT50ZGVzYzAub3duZXIgPT0gT1dORURfQllfTklDKQorCQkJCWJyZWFrOworCisJCQlpZiAoKHdvcmtzKysgPiAxNSkpCisJCQkJYnJlYWs7CisKKwkJCWlmICh0ZC0+dGRlc2MwLlRTUiAmIFRTUjBfVEVSUikgeworCQkJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCQkJCWlmICh0ZC0+dGRlc2MwLlRTUiAmIFRTUjBfQ0RIKQorCQkJCQlzdGF0cy0+dHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQkJCWlmICh0ZC0+dGRlc2MwLlRTUiAmIFRTUjBfQ1JTKQorCQkJCQlzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQlpZiAodGQtPnRkZXNjMC5UU1IgJiBUU1IwX0FCVCkKKwkJCQkJc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJaWYgKHRkLT50ZGVzYzAuVFNSICYgVFNSMF9PV0MpCisJCQkJCXN0YXRzLT50eF93aW5kb3dfZXJyb3JzKys7CisJCQl9IGVsc2UgeworCQkJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCQkJc3RhdHMtPnR4X2J5dGVzICs9IHRkaW5mby0+c2tiLT5sZW47CisJCQl9CisJCQl2ZWxvY2l0eV9mcmVlX3R4X2J1Zih2cHRyLCB0ZGluZm8pOworCQkJdnB0ci0+dGRfdXNlZFtxbnVtXS0tOworCQl9CisJCXZwdHItPnRkX3RhaWxbcW51bV0gPSBpZHg7CisKKwkJaWYgKEFWQUlMX1REKHZwdHIsIHFudW0pIDwgMSkgeworCQkJZnVsbCA9IDE7CisJCX0KKwl9CisJLyoKKwkgKglMb29rIHRvIHNlZSBpZiB3ZSBzaG91bGQga2ljayB0aGUgdHJhbnNtaXQgbmV0d29yaworCSAqCWxheWVyIGZvciBtb3JlIHdvcmsuCisJICovCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQodnB0ci0+ZGV2KSAmJiAoZnVsbCA9PSAwKQorCSAgICAmJiAoISh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfTElOS19GQUlMKSkpIHsKKwkJbmV0aWZfd2FrZV9xdWV1ZSh2cHRyLT5kZXYpOworCX0KKwlyZXR1cm4gd29ya3M7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfcHJpbnRfbGlua19zdGF0dXMJLQlsaW5rIHN0YXR1cyByZXBvcnRpbmcKKyAqCUB2cHRyOiB2ZWxvY2l0eSB0byByZXBvcnQgb24KKyAqCisgKglUdXJuIHRoZSBsaW5rIHN0YXR1cyBvZiB0aGUgdmVsb2NpdHkgY2FyZCBpbnRvIGEga2VybmVsIGxvZworICoJZGVzY3JpcHRpb24gb2YgdGhlIG5ldyBsaW5rIHN0YXRlLCBkZXRhaWxpbmcgc3BlZWQgYW5kIGR1cGxleAorICoJc3RhdHVzCisgKi8KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfcHJpbnRfbGlua19zdGF0dXMoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisKKwlpZiAodnB0ci0+bWlpX3N0YXR1cyAmIFZFTE9DSVRZX0xJTktfRkFJTCkgeworCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sIEtFUk5fTk9USUNFICIlczogZmFpbGVkIHRvIGRldGVjdCBjYWJsZSBsaW5rXG4iLCB2cHRyLT5kZXYtPm5hbWUpOworCX0gZWxzZSBpZiAodnB0ci0+b3B0aW9ucy5zcGRfZHB4ID09IFNQRF9EUFhfQVVUTykgeworCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sIEtFUk5fTk9USUNFICIlczogTGluayBhdXRvbmVnYXRpb24iLCB2cHRyLT5kZXYtPm5hbWUpOworCisJCWlmICh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfU1BFRURfMTAwMCkKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIiBzcGVlZCAxMDAwTSBicHMiKTsKKwkJZWxzZSBpZiAodnB0ci0+bWlpX3N0YXR1cyAmIFZFTE9DSVRZX1NQRUVEXzEwMCkKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIiBzcGVlZCAxMDBNIGJwcyIpOworCQllbHNlCisJCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sICIgc3BlZWQgMTBNIGJwcyIpOworCisJCWlmICh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpCisJCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sICIgZnVsbCBkdXBsZXhcbiIpOworCQllbHNlCisJCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sICIgaGFsZiBkdXBsZXhcbiIpOworCX0gZWxzZSB7CisJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgS0VSTl9OT1RJQ0UgIiVzOiBMaW5rIGZvcmNlZCIsIHZwdHItPmRldi0+bmFtZSk7CisJCXN3aXRjaCAodnB0ci0+b3B0aW9ucy5zcGRfZHB4KSB7CisJCWNhc2UgU1BEX0RQWF8xMDBfSEFMRjoKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIiBzcGVlZCAxMDBNIGJwcyBoYWxmIGR1cGxleFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBTUERfRFBYXzEwMF9GVUxMOgorCQkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCAiIHNwZWVkIDEwME0gYnBzIGZ1bGwgZHVwbGV4XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNQRF9EUFhfMTBfSEFMRjoKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIiBzcGVlZCAxME0gYnBzIGhhbGYgZHVwbGV4XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNQRF9EUFhfMTBfRlVMTDoKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIiBzcGVlZCAxME0gYnBzIGZ1bGwgZHVwbGV4XG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfZXJyb3IJLQloYW5kbGUgZXJyb3IgZnJvbSBjb250cm9sbGVyCisgKglAdnB0cjogdmVsb2NpdHkKKyAqCUBzdGF0dXM6IGNhcmQgc3RhdHVzCisgKgorICoJUHJvY2VzcyBhbiBlcnJvciByZXBvcnQgZnJvbSB0aGUgaGFyZHdhcmUgYW5kIGF0dGVtcHQgdG8gcmVjb3ZlcgorICoJdGhlIGNhcmQgaXRzZWxmLiBBdCB0aGUgbW9tZW50IHdlIGNhbm5vdCByZWNvdmVyIGZyb20gc29tZSAKKyAqCXRoZW9yZXRpY2FsbHkgaW1wb3NzaWJsZSBlcnJvcnMgYnV0IHRoaXMgY291bGQgYmUgZml4ZWQgdXNpbmcKKyAqCXRoZSBwY2lfZGV2aWNlX2ZhaWxlZCBsb2dpYyB0byBib3VuY2UgdGhlIGhhcmR3YXJlCisgKgorICovCisgCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9lcnJvcihzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgaW50IHN0YXR1cykKK3sKKworCWlmIChzdGF0dXMgJiBJU1JfVFhTVExJKSB7CisJCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyA9IHZwdHItPm1hY19yZWdzOworCisJCXByaW50ayhLRVJOX0VSUiAiVEQgc3RydWN0dXJlIGVycnJvciBURGluZGV4PSVoeFxuIiwgcmVhZHcoJnJlZ3MtPlRESWR4WzBdKSk7CisJCUJZVEVfUkVHX0JJVFNfT04oVFhFU1JfVERTVFIsICZyZWdzLT5UWEVTUik7CisJCXdyaXRldyhUUkRDU1JfUlVOLCAmcmVncy0+VERDU1JDbHIpOworCQluZXRpZl9zdG9wX3F1ZXVlKHZwdHItPmRldik7CisJCQorCQkvKiBGSVhNRTogcG9ydCBvdmVyIHRoZSBwY2lfZGV2aWNlX2ZhaWxlZCBjb2RlIGFuZCB1c2UgaXQKKwkJICAgaGVyZSAqLworCX0KKworCWlmIChzdGF0dXMgJiBJU1JfU1JDSSkgeworCQlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwkJaW50IGxpbmtlZDsKKworCQlpZiAodnB0ci0+b3B0aW9ucy5zcGRfZHB4ID09IFNQRF9EUFhfQVVUTykgeworCQkJdnB0ci0+bWlpX3N0YXR1cyA9IGNoZWNrX2Nvbm5lY3Rpb25fdHlwZShyZWdzKTsKKworCQkJLyoKKwkJCSAqCUlmIGl0IGlzIGEgMzExOSwgZGlzYWJsZSBmcmFtZSBidXJzdGluZyBpbiAKKwkJCSAqCWhhbGZkdXBsZXggbW9kZSBhbmQgZW5hYmxlIGl0IGluIGZ1bGxkdXBsZXgKKwkJCSAqCSBtb2RlCisJCQkgKi8KKwkJCWlmICh2cHRyLT5yZXZfaWQgPCBSRVZfSURfVlQzMjE2X0EwKSB7CisJCQkJaWYgKHZwdHItPm1paV9zdGF0dXMgfCBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkKKwkJCQkJQllURV9SRUdfQklUU19PTihUQ1JfVEIyQkRJUywgJnJlZ3MtPlRDUik7CisJCQkJZWxzZQorCQkJCQlCWVRFX1JFR19CSVRTX09GRihUQ1JfVEIyQkRJUywgJnJlZ3MtPlRDUik7CisJCQl9CisJCQkvKgorCQkJICoJT25seSBlbmFibGUgQ0QgaGVhcnQgYmVhdCBjb3VudGVyIGluIDEwSEQgbW9kZQorCQkJICovCisJCQlpZiAoISh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpICYmICh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfU1BFRURfMTApKSB7CisJCQkJQllURV9SRUdfQklUU19PRkYoVEVTVENGR19IQkRJUywgJnJlZ3MtPlRFU1RDRkcpOworCQkJfSBlbHNlIHsKKwkJCQlCWVRFX1JFR19CSVRTX09OKFRFU1RDRkdfSEJESVMsICZyZWdzLT5URVNUQ0ZHKTsKKwkJCX0KKwkJfQorCQkvKgorCQkgKglHZXQgbGluayBzdGF0dXMgZnJvbSBQSFlTUjAKKwkJICovCisJCWxpbmtlZCA9IHJlYWRiKCZyZWdzLT5QSFlTUjApICYgUEhZU1IwX0xJTktHRDsKKworCQlpZiAobGlua2VkKSB7CisJCQl2cHRyLT5taWlfc3RhdHVzICY9IH5WRUxPQ0lUWV9MSU5LX0ZBSUw7CisJCX0gZWxzZSB7CisJCQl2cHRyLT5taWlfc3RhdHVzIHw9IFZFTE9DSVRZX0xJTktfRkFJTDsKKwkJfQorCisJCXZlbG9jaXR5X3ByaW50X2xpbmtfc3RhdHVzKHZwdHIpOworCQllbmFibGVfZmxvd19jb250cm9sX2FiaWxpdHkodnB0cik7CisKKwkJLyoKKwkJICoJUmUtZW5hYmxlIGF1dG8tcG9sbGluZyBiZWNhdXNlIFNSQ0kgd2lsbCBkaXNhYmxlIAorCQkgKglhdXRvLXBvbGxpbmcKKwkJICovCisJCSAKKwkJZW5hYmxlX21paV9hdXRvcG9sbChyZWdzKTsKKworCQlpZiAodnB0ci0+bWlpX3N0YXR1cyAmIFZFTE9DSVRZX0xJTktfRkFJTCkKKwkJCW5ldGlmX3N0b3BfcXVldWUodnB0ci0+ZGV2KTsKKwkJZWxzZQorCQkJbmV0aWZfd2FrZV9xdWV1ZSh2cHRyLT5kZXYpOworCisJfTsKKwlpZiAoc3RhdHVzICYgSVNSX01JQkZJKQorCQl2ZWxvY2l0eV91cGRhdGVfaHdfbWlicyh2cHRyKTsKKwlpZiAoc3RhdHVzICYgSVNSX0xTVEVJKQorCQltYWNfcnhfcXVldWVfd2FrZSh2cHRyLT5tYWNfcmVncyk7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfZnJlZV90eF9idWYJLQlmcmVlIHRyYW5zbWl0IGJ1ZmZlcgorICoJQHZwdHI6IHZlbG9jaXR5CisgKglAdGRpbmZvOiBidWZmZXIKKyAqCisgKglSZWxlYXNlIGFuIHRyYW5zbWl0IGJ1ZmZlci4gSWYgdGhlIGJ1ZmZlciB3YXMgcHJlYWxsb2NhdGVkIHRoZW4KKyAqCXJlY3ljbGUgaXQsIGlmIG5vdCB0aGVuIHVubWFwIHRoZSBidWZmZXIuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2ZyZWVfdHhfYnVmKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCBzdHJ1Y3QgdmVsb2NpdHlfdGRfaW5mbyAqdGRpbmZvKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSB0ZGluZm8tPnNrYjsKKwlpbnQgaTsKKworCS8qCisJICoJRG9uJ3QgdW5tYXAgdGhlIHByZS1hbGxvY2F0ZWQgdHhfYnVmcworCSAqLworCWlmICh0ZGluZm8tPnNrYl9kbWEgJiYgKHRkaW5mby0+c2tiX2RtYVswXSAhPSB0ZGluZm8tPmJ1Zl9kbWEpKSB7CisKKwkJZm9yIChpID0gMDsgaSA8IHRkaW5mby0+bnNrYl9kbWE7IGkrKykgeworI2lmZGVmIFZFTE9DSVRZX1pFUk9fQ09QWV9TVVBQT1JUCisJCQlwY2lfdW5tYXBfc2luZ2xlKHZwdHItPnBkZXYsIHRkaW5mby0+c2tiX2RtYVtpXSwgdGQtPnRkZXNjMS5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworI2Vsc2UKKwkJCXBjaV91bm1hcF9zaW5nbGUodnB0ci0+cGRldiwgdGRpbmZvLT5za2JfZG1hW2ldLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisjZW5kaWYKKwkJCXRkaW5mby0+c2tiX2RtYVtpXSA9IDA7CisJCX0KKwl9CisJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwl0ZGluZm8tPnNrYiA9IE5VTEw7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfb3BlbgkJLQlpbnRlcmZhY2UgYWN0aXZhdGlvbiBjYWxsYmFjaworICoJQGRldjogbmV0d29yayBsYXllciBkZXZpY2UgdG8gb3BlbgorICoKKyAqCUNhbGxlZCB3aGVuIHRoZSBuZXR3b3JrIGxheWVyIGJyaW5ncyB0aGUgaW50ZXJmYWNlIHVwLiBSZXR1cm5zCisgKglhIG5lZ2F0aXZlIHBvc2l4IGVycm9yIGNvZGUgb24gZmFpbHVyZSwgb3IgemVybyBvbiBzdWNjZXNzLgorICoKKyAqCUFsbCB0aGUgcmluZyBhbGxvY2F0aW9uIGFuZCBzZXQgdXAgaXMgZG9uZSBvbiBvcGVuIGZvciB0aGlzCisgKglhZGFwdGVyIHRvIG1pbmltaXNlIG1lbW9yeSB1c2FnZSB3aGVuIGluYWN0aXZlCisgKi8KKyAKK3N0YXRpYyBpbnQgdmVsb2NpdHlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyID0gZGV2LT5wcml2OworCWludCByZXQ7CisKKwl2cHRyLT5yeF9idWZfc3ogPSAoZGV2LT5tdHUgPD0gMTUwNCA/IFBLVF9CVUZfU1ogOiBkZXYtPm10dSArIDMyKTsKKworCXJldCA9IHZlbG9jaXR5X2luaXRfcmluZ3ModnB0cik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gdmVsb2NpdHlfaW5pdF9yZF9yaW5nKHZwdHIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9mcmVlX2Rlc2NfcmluZ3M7CisKKwlyZXQgPSB2ZWxvY2l0eV9pbml0X3RkX3JpbmcodnB0cik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2ZyZWVfcmRfcmluZzsKKwkKKwkvKiBFbnN1cmUgY2hpcCBpcyBydW5uaW5nICovCQorCXBjaV9zZXRfcG93ZXJfc3RhdGUodnB0ci0+cGRldiwgUENJX0QwKTsKKwkKKwl2ZWxvY2l0eV9pbml0X3JlZ2lzdGVycyh2cHRyLCBWRUxPQ0lUWV9JTklUX0NPTEQpOworCisJcmV0ID0gcmVxdWVzdF9pcnEodnB0ci0+cGRldi0+aXJxLCAmdmVsb2NpdHlfaW50ciwgU0FfU0hJUlEsCisJCQkgIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQkvKiBQb3dlciBkb3duIHRoZSBjaGlwICovCisJCXBjaV9zZXRfcG93ZXJfc3RhdGUodnB0ci0+cGRldiwgUENJX0QzaG90KTsKKwkJZ290byBlcnJfZnJlZV90ZF9yaW5nOworCX0KKworCW1hY19lbmFibGVfaW50KHZwdHItPm1hY19yZWdzKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXZwdHItPmZsYWdzIHw9IFZFTE9DSVRZX0ZMQUdTX09QRU5FRDsKK291dDoKKwlyZXR1cm4gcmV0OworCitlcnJfZnJlZV90ZF9yaW5nOgorCXZlbG9jaXR5X2ZyZWVfdGRfcmluZyh2cHRyKTsKK2Vycl9mcmVlX3JkX3Jpbmc6CisJdmVsb2NpdHlfZnJlZV9yZF9yaW5nKHZwdHIpOworZXJyX2ZyZWVfZGVzY19yaW5nczoKKwl2ZWxvY2l0eV9mcmVlX3JpbmdzKHZwdHIpOworCWdvdG8gb3V0OworfQorCisvKiogCisgKgl2ZWxvY2l0eV9jaGFuZ2VfbXR1CS0JTVRVIGNoYW5nZSBjYWxsYmFjaworICoJQGRldjogbmV0d29yayBkZXZpY2UKKyAqCUBuZXdfbXR1OiBkZXNpcmVkIE1UVQorICoKKyAqCUhhbmRsZSByZXF1ZXN0cyBmcm9tIHRoZSBuZXR3b3JraW5nIGxheWVyIGZvciBNVFUgY2hhbmdlIG9uCisgKgl0aGlzIGludGVyZmFjZS4gSXQgZ2V0cyBjYWxsZWQgb24gYSBjaGFuZ2UgYnkgdGhlIG5ldHdvcmsgbGF5ZXIuCisgKglSZXR1cm4gemVybyBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBwb3NpeCBlcnJvciBjb2RlLgorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgb2xkbXR1ID0gZGV2LT5tdHU7CisJaW50IHJldCA9IDA7CisKKwlpZiAoKG5ld19tdHUgPCBWRUxPQ0lUWV9NSU5fTVRVKSB8fCBuZXdfbXR1ID4gKFZFTE9DSVRZX01BWF9NVFUpKSB7CisJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfRVJSLCBLRVJOX05PVElDRSAiJXM6IEludmFsaWQgTVRVLlxuIiwgCisJCQkJdnB0ci0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5ld19tdHUgIT0gb2xkbXR1KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQl2ZWxvY2l0eV9zaHV0ZG93bih2cHRyKTsKKworCQl2ZWxvY2l0eV9mcmVlX3RkX3JpbmcodnB0cik7CisJCXZlbG9jaXR5X2ZyZWVfcmRfcmluZyh2cHRyKTsKKworCQlkZXYtPm10dSA9IG5ld19tdHU7CisJCWlmIChuZXdfbXR1ID4gODE5MikKKwkJCXZwdHItPnJ4X2J1Zl9zeiA9IDkgKiAxMDI0OworCQllbHNlIGlmIChuZXdfbXR1ID4gNDA5NikKKwkJCXZwdHItPnJ4X2J1Zl9zeiA9IDgxOTI7CisJCWVsc2UKKwkJCXZwdHItPnJ4X2J1Zl9zeiA9IDQgKiAxMDI0OworCisJCXJldCA9IHZlbG9jaXR5X2luaXRfcmRfcmluZyh2cHRyKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dF91bmxvY2s7CisKKwkJcmV0ID0gdmVsb2NpdHlfaW5pdF90ZF9yaW5nKHZwdHIpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0X3VubG9jazsKKworCQl2ZWxvY2l0eV9pbml0X3JlZ2lzdGVycyh2cHRyLCBWRUxPQ0lUWV9JTklUX0NPTEQpOworCisJCW1hY19lbmFibGVfaW50KHZwdHItPm1hY19yZWdzKTsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKK291dF91bmxvY2s6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwdHItPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCXZlbG9jaXR5X3NodXRkb3duCS0Jc2h1dCBkb3duIHRoZSBjaGlwCisgKglAdnB0cjogdmVsb2NpdHkgdG8gZGVhY3RpdmF0ZQorICoKKyAqCVNodXRzIGRvd24gdGhlIGludGVybmFsIG9wZXJhdGlvbnMgb2YgdGhlIHZlbG9jaXR5IGFuZAorICoJZGlzYWJsZXMgaW50ZXJydXB0cywgYXV0b3BvbGxpbmcsIHRyYW5zbWl0IGFuZCByZWNlaXZlCisgKi8KKyAKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X3NodXRkb3duKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyA9IHZwdHItPm1hY19yZWdzOworCW1hY19kaXNhYmxlX2ludChyZWdzKTsKKwl3cml0ZWwoQ1IwX1NUT1AsICZyZWdzLT5DUjBTZXQpOworCXdyaXRldygweEZGRkYsICZyZWdzLT5URENTUkNscik7CisJd3JpdGViKDB4RkYsICZyZWdzLT5SRENTUkNscik7CisJc2FmZV9kaXNhYmxlX21paV9hdXRvcG9sbChyZWdzKTsKKwltYWNfY2xlYXJfaXNyKHJlZ3MpOworfQorCisvKioKKyAqCXZlbG9jaXR5X2Nsb3NlCQktCWNsb3NlIGFkYXB0ZXIgY2FsbGJhY2sKKyAqCUBkZXY6IG5ldHdvcmsgZGV2aWNlCisgKgorICoJQ2FsbGJhY2sgZnJvbSB0aGUgbmV0d29yayBsYXllciB3aGVuIHRoZSB2ZWxvY2l0eSBpcyBiZWluZworICoJZGVhY3RpdmF0ZWQgYnkgdGhlIG5ldHdvcmsgbGF5ZXIKKyAqLworCitzdGF0aWMgaW50IHZlbG9jaXR5X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJdmVsb2NpdHlfc2h1dGRvd24odnB0cik7CisKKwlpZiAodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19XT0xfRU5BQkxFRCkKKwkJdmVsb2NpdHlfZ2V0X2lwKHZwdHIpOworCWlmIChkZXYtPmlycSAhPSAwKQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJCisJLyogUG93ZXIgZG93biB0aGUgY2hpcCAqLworCXBjaV9zZXRfcG93ZXJfc3RhdGUodnB0ci0+cGRldiwgUENJX0QzaG90KTsKKwkKKwkvKiBGcmVlIHRoZSByZXNvdXJjZXMgKi8KKwl2ZWxvY2l0eV9mcmVlX3RkX3JpbmcodnB0cik7CisJdmVsb2NpdHlfZnJlZV9yZF9yaW5nKHZwdHIpOworCXZlbG9jaXR5X2ZyZWVfcmluZ3ModnB0cik7CisKKwl2cHRyLT5mbGFncyAmPSAoflZFTE9DSVRZX0ZMQUdTX09QRU5FRCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfeG1pdAkJLQl0cmFuc21pdCBwYWNrZXQgY2FsbGJhY2sKKyAqCUBza2I6IGJ1ZmZlciB0byB0cmFuc21pdAorICoJQGRldjogbmV0d29yayBkZXZpY2UKKyAqCisgKglDYWxsZWQgYnkgdGhlIG5ldHdvciBsYXllciB0byByZXF1ZXN0IGEgcGFja2V0IGlzIHF1ZXVlZCB0bworICoJdGhlIHZlbG9jaXR5LiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcy4KKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJaW50IHFudW0gPSAwOworCXN0cnVjdCB0eF9kZXNjICp0ZF9wdHI7CisJc3RydWN0IHZlbG9jaXR5X3RkX2luZm8gKnRkaW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpbmRleDsKKworCWludCBwa3RsZW4gPSBza2ItPmxlbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisKKwlpbmRleCA9IHZwdHItPnRkX2N1cnJbcW51bV07CisJdGRfcHRyID0gJih2cHRyLT50ZF9yaW5nc1txbnVtXVtpbmRleF0pOworCXRkaW5mbyA9ICYodnB0ci0+dGRfaW5mb3NbcW51bV1baW5kZXhdKTsKKworCXRkX3B0ci0+dGRlc2MxLlRDUExTID0gVENQTFNfTk9STUFMOworCXRkX3B0ci0+dGRlc2MxLlRDUiA9IFRDUjBfVElDOworCXRkX3B0ci0+dGRfYnVmWzBdLnF1ZXVlID0gMDsKKworCS8qCisJICoJUGFkIHNob3J0IGZyYW1lcy4gCisJICovCisJaWYgKHBrdGxlbiA8IEVUSF9aTEVOKSB7CisJCS8qIENhbm5vdCBvY2N1ciB1bnRpbCBaQyBzdXBwb3J0ICovCisJCWlmKHNrYl9saW5lYXJpemUoc2tiLCBHRlBfQVRPTUlDKSkKKwkJCXJldHVybiAwOyAKKwkJcGt0bGVuID0gRVRIX1pMRU47CisJCW1lbWNweSh0ZGluZm8tPmJ1Ziwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCW1lbXNldCh0ZGluZm8tPmJ1ZiArIHNrYi0+bGVuLCAwLCBFVEhfWkxFTiAtIHNrYi0+bGVuKTsKKwkJdGRpbmZvLT5za2IgPSBza2I7CisJCXRkaW5mby0+c2tiX2RtYVswXSA9IHRkaW5mby0+YnVmX2RtYTsKKwkJdGRfcHRyLT50ZGVzYzAucGt0c2l6ZSA9IHBrdGxlbjsKKwkJdGRfcHRyLT50ZF9idWZbMF0ucGFfbG93ID0gY3B1X3RvX2xlMzIodGRpbmZvLT5za2JfZG1hWzBdKTsKKwkJdGRfcHRyLT50ZF9idWZbMF0ucGFfaGlnaCA9IDA7CisJCXRkX3B0ci0+dGRfYnVmWzBdLmJ1ZnNpemUgPSB0ZF9wdHItPnRkZXNjMC5wa3RzaXplOworCQl0ZGluZm8tPm5za2JfZG1hID0gMTsKKwkJdGRfcHRyLT50ZGVzYzEuQ01EWiA9IDI7CisJfSBlbHNlCisjaWZkZWYgVkVMT0NJVFlfWkVST19DT1BZX1NVUFBPUlQKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA+IDApIHsKKwkJaW50IG5mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJCXRkaW5mby0+c2tiID0gc2tiOworCQlpZiAobmZyYWdzID4gNikgeworCQkJc2tiX2xpbmVhcml6ZShza2IsIEdGUF9BVE9NSUMpOworCQkJbWVtY3B5KHRkaW5mby0+YnVmLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCXRkaW5mby0+c2tiX2RtYVswXSA9IHRkaW5mby0+YnVmX2RtYTsKKwkJCXRkX3B0ci0+dGRlc2MwLnBrdHNpemUgPSAKKwkJCXRkX3B0ci0+dGRfYnVmWzBdLnBhX2xvdyA9IGNwdV90b19sZTMyKHRkaW5mby0+c2tiX2RtYVswXSk7CisJCQl0ZF9wdHItPnRkX2J1ZlswXS5wYV9oaWdoID0gMDsKKwkJCXRkX3B0ci0+dGRfYnVmWzBdLmJ1ZnNpemUgPSB0ZF9wdHItPnRkZXNjMC5wa3RzaXplOworCQkJdGRpbmZvLT5uc2tiX2RtYSA9IDE7CisJCQl0ZF9wdHItPnRkZXNjMS5DTURaID0gMjsKKwkJfSBlbHNlIHsKKwkJCWludCBpID0gMDsKKwkJCXRkaW5mby0+bnNrYl9kbWEgPSAwOworCQkJdGRpbmZvLT5za2JfZG1hW2ldID0gcGNpX21hcF9zaW5nbGUodnB0ci0+cGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCQl0ZF9wdHItPnRkZXNjMC5wa3RzaXplID0gcGt0bGVuOworCisJCQkvKiBGSVhNRTogc3VwcG9ydCA0OGJpdCBETUEgbGF0ZXIgKi8KKwkJCXRkX3B0ci0+dGRfYnVmW2ldLnBhX2xvdyA9IGNwdV90b19sZTMyKHRkaW5mby0+c2tiX2RtYSk7CisJCQl0ZF9wdHItPnRkX2J1ZltpXS5wYV9oaWdoID0gMDsKKwkJCXRkX3B0ci0+dGRfYnVmW2ldLmJ1ZnNpemUgPSBza2ItPmxlbi0+c2tiLT5kYXRhX2xlbjsKKworCQkJZm9yIChpID0gMDsgaSA8IG5mcmFnczsgaSsrKSB7CisJCQkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQkJCXZvaWQgKmFkZHIgPSAoKHZvaWQgKikgcGFnZV9hZGRyZXNzKGZyYWctPnBhZ2UgKyBmcmFnLT5wYWdlX29mZnNldCkpOworCisJCQkJdGRpbmZvLT5za2JfZG1hW2kgKyAxXSA9IHBjaV9tYXBfc2luZ2xlKHZwdHItPnBkZXYsIGFkZHIsIGZyYWctPnNpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCQkJdGRfcHRyLT50ZF9idWZbaSArIDFdLnBhX2xvdyA9IGNwdV90b19sZTMyKHRkaW5mby0+c2tiX2RtYVtpICsgMV0pOworCQkJCXRkX3B0ci0+dGRfYnVmW2kgKyAxXS5wYV9oaWdoID0gMDsKKwkJCQl0ZF9wdHItPnRkX2J1ZltpICsgMV0uYnVmc2l6ZSA9IGZyYWctPnNpemU7CisJCQl9CisJCQl0ZGluZm8tPm5za2JfZG1hID0gaSAtIDE7CisJCQl0ZF9wdHItPnRkZXNjMS5DTURaID0gaTsKKwkJfQorCisJfSBlbHNlCisjZW5kaWYKKwl7CisJCS8qCisJCSAqCU1hcCB0aGUgbGluZWFyIG5ldHdvcmsgYnVmZmVyIGludG8gUENJIHNwYWNlIGFuZAorCQkgKglhZGQgaXQgdG8gdGhlIHRyYW5zbWl0IHJpbmcuCisJCSAqLworCQl0ZGluZm8tPnNrYiA9IHNrYjsKKwkJdGRpbmZvLT5za2JfZG1hWzBdID0gcGNpX21hcF9zaW5nbGUodnB0ci0+cGRldiwgc2tiLT5kYXRhLCBwa3RsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl0ZF9wdHItPnRkZXNjMC5wa3RzaXplID0gcGt0bGVuOworCQl0ZF9wdHItPnRkX2J1ZlswXS5wYV9sb3cgPSBjcHVfdG9fbGUzMih0ZGluZm8tPnNrYl9kbWFbMF0pOworCQl0ZF9wdHItPnRkX2J1ZlswXS5wYV9oaWdoID0gMDsKKwkJdGRfcHRyLT50ZF9idWZbMF0uYnVmc2l6ZSA9IHRkX3B0ci0+dGRlc2MwLnBrdHNpemU7CisJCXRkaW5mby0+bnNrYl9kbWEgPSAxOworCQl0ZF9wdHItPnRkZXNjMS5DTURaID0gMjsKKwl9CisKKwlpZiAodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19UQUdHSU5HKSB7CisJCXRkX3B0ci0+dGRlc2MxLnBxaW5mLlZJRCA9ICh2cHRyLT5vcHRpb25zLnZpZCAmIDB4ZmZmKTsKKwkJdGRfcHRyLT50ZGVzYzEucHFpbmYucHJpb3JpdHkgPSAwOworCQl0ZF9wdHItPnRkZXNjMS5wcWluZi5DRkkgPSAwOworCQl0ZF9wdHItPnRkZXNjMS5UQ1IgfD0gVENSMF9WRVRBRzsKKwl9CisKKwkvKgorCSAqCUhhbmRsZSBoYXJkd2FyZSBjaGVja3N1bQorCSAqLworCWlmICgodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19UWF9DU1VNKQorCQkJCSAmJiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpKSB7CisJCXN0cnVjdCBpcGhkciAqaXAgPSBza2ItPm5oLmlwaDsKKwkJaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKwkJCXRkX3B0ci0+dGRlc2MxLlRDUiB8PSBUQ1IwX1RDUENLOworCQllbHNlIGlmIChpcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCisJCQl0ZF9wdHItPnRkZXNjMS5UQ1IgfD0gKFRDUjBfVURQQ0spOworCQl0ZF9wdHItPnRkZXNjMS5UQ1IgfD0gVENSMF9JUENLOworCX0KKwl7CisKKwkJaW50IHByZXYgPSBpbmRleCAtIDE7CisKKwkJaWYgKHByZXYgPCAwKQorCQkJcHJldiA9IHZwdHItPm9wdGlvbnMubnVtdHggLSAxOworCQl0ZF9wdHItPnRkZXNjMC5vd25lciA9IE9XTkVEX0JZX05JQzsKKwkJdnB0ci0+dGRfdXNlZFtxbnVtXSsrOworCQl2cHRyLT50ZF9jdXJyW3FudW1dID0gKGluZGV4ICsgMSkgJSB2cHRyLT5vcHRpb25zLm51bXR4OworCisJCWlmIChBVkFJTF9URCh2cHRyLCBxbnVtKSA8IDEpCisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJdGRfcHRyID0gJih2cHRyLT50ZF9yaW5nc1txbnVtXVtwcmV2XSk7CisJCXRkX3B0ci0+dGRfYnVmWzBdLnF1ZXVlID0gMTsKKwkJbWFjX3R4X3F1ZXVlX3dha2UodnB0ci0+bWFjX3JlZ3MsIHFudW0pOworCX0KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfaW50cgkJLQlpbnRlcnJ1cHQgY2FsbGJhY2sKKyAqCUBpcnE6IGludGVycnVwdCBudW1iZXIKKyAqCUBkZXZfaW5zdGFuY2U6IGludGVycnVwdGluZyBkZXZpY2UKKyAqCUBwdF9yZWdzOiBDUFUgcmVnaXN0ZXIgc3RhdGUgYXQgaW50ZXJydXB0CisgKgorICoJQ2FsbGVkIHdoZW5ldmVyIGFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgYnkgdGhlIHZlbG9jaXR5CisgKglhZGFwdGVyIElSUSBsaW5lLiBXZSBtYXkgbm90IGJlIHRoZSBzb3VyY2Ugb2YgdGhlIGludGVycnVwdAorICoJYW5kIG5lZWQgdG8gaWRlbnRpZnkgaW5pdGlhbGx5IGlmIHdlIGFyZSwgYW5kIGlmIG5vdCBleGl0IGFzCisgKgllZmZpY2llbnRseSBhcyBwb3NzaWJsZS4KKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwl1MzIgaXNyX3N0YXR1czsKKwlpbnQgbWF4X2NvdW50ID0gMDsKKworCisJc3Bpbl9sb2NrKCZ2cHRyLT5sb2NrKTsKKwlpc3Jfc3RhdHVzID0gbWFjX3JlYWRfaXNyKHZwdHItPm1hY19yZWdzKTsKKworCS8qIE5vdCB1cyA/ICovCisJaWYgKGlzcl9zdGF0dXMgPT0gMCkgeworCQlzcGluX3VubG9jaygmdnB0ci0+bG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwltYWNfZGlzYWJsZV9pbnQodnB0ci0+bWFjX3JlZ3MpOworCisJLyoKKwkgKglLZWVwIHByb2Nlc3NpbmcgdGhlIElTUiB1bnRpbCB3ZSBoYXZlIGNvbXBsZXRlZAorCSAqCXByb2Nlc3NpbmcgYW5kIHRoZSBpc3Jfc3RhdHVzIGJlY29tZXMgemVybworCSAqLworCSAKKwl3aGlsZSAoaXNyX3N0YXR1cyAhPSAwKSB7CisJCW1hY193cml0ZV9pc3IodnB0ci0+bWFjX3JlZ3MsIGlzcl9zdGF0dXMpOworCQlpZiAoaXNyX3N0YXR1cyAmICh+KElTUl9QUlhJIHwgSVNSX1BQUlhJIHwgSVNSX1BUWEkgfCBJU1JfUFBUWEkpKSkKKwkJCXZlbG9jaXR5X2Vycm9yKHZwdHIsIGlzcl9zdGF0dXMpOworCQlpZiAoaXNyX3N0YXR1cyAmIChJU1JfUFJYSSB8IElTUl9QUFJYSSkpCisJCQltYXhfY291bnQgKz0gdmVsb2NpdHlfcnhfc3J2KHZwdHIsIGlzcl9zdGF0dXMpOworCQlpZiAoaXNyX3N0YXR1cyAmIChJU1JfUFRYSSB8IElTUl9QUFRYSSkpCisJCQltYXhfY291bnQgKz0gdmVsb2NpdHlfdHhfc3J2KHZwdHIsIGlzcl9zdGF0dXMpOworCQlpc3Jfc3RhdHVzID0gbWFjX3JlYWRfaXNyKHZwdHItPm1hY19yZWdzKTsKKwkJaWYgKG1heF9jb3VudCA+IHZwdHItPm9wdGlvbnMuaW50X3dvcmtzKQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZXhjZXNzaXZlIHdvcmsgYXQgaW50ZXJydXB0LlxuIiwgCisJCQkJZGV2LT5uYW1lKTsKKwkJCW1heF9jb3VudCA9IDA7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJnZwdHItPmxvY2spOworCW1hY19lbmFibGVfaW50KHZwdHItPm1hY19yZWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK30KKworCisvKioKKyAqCXZlbG9jaXR5X3NldF9tdWx0aQktCWZpbHRlciBsaXN0IGNoYW5nZSBjYWxsYmFjaworICoJQGRldjogbmV0d29yayBkZXZpY2UKKyAqCisgKglDYWxsZWQgYnkgdGhlIG5ldHdvcmsgbGF5ZXIgd2hlbiB0aGUgZmlsdGVyIGxpc3RzIG5lZWQgdG8gY2hhbmdlCisgKglmb3IgYSB2ZWxvY2l0eSBhZGFwdGVyLiBSZWxvYWQgdGhlIENBTXMgd2l0aCB0aGUgbmV3IGFkZHJlc3MKKyAqCWZpbHRlciBydWxlc2V0LgorICovCisgCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwl1OCByeF9tb2RlOworCWludCBpOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCXdyaXRlbCgweGZmZmZmZmZmLCAmcmVncy0+TUFSQ0FNWzBdKTsKKwkJd3JpdGVsKDB4ZmZmZmZmZmYsICZyZWdzLT5NQVJDQU1bNF0pOworCQlyeF9tb2RlID0gKFJDUl9BTSB8IFJDUl9BQiB8IFJDUl9QUk9NKTsKKwl9IGVsc2UgaWYgKChkZXYtPm1jX2NvdW50ID4gdnB0ci0+bXVsdGljYXN0X2xpbWl0KQorCQkgICB8fCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJd3JpdGVsKDB4ZmZmZmZmZmYsICZyZWdzLT5NQVJDQU1bMF0pOworCQl3cml0ZWwoMHhmZmZmZmZmZiwgJnJlZ3MtPk1BUkNBTVs0XSk7CisJCXJ4X21vZGUgPSAoUkNSX0FNIHwgUkNSX0FCKTsKKwl9IGVsc2UgeworCQlpbnQgb2Zmc2V0ID0gTUNBTV9TSVpFIC0gdnB0ci0+bXVsdGljYXN0X2xpbWl0OworCQltYWNfZ2V0X2NhbV9tYXNrKHJlZ3MsIHZwdHItPm1DQU1tYXNrLCBWRUxPQ0lUWV9NVUxUSUNBU1RfQ0FNKTsKKworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCW1hY19zZXRfY2FtKHJlZ3MsIGkgKyBvZmZzZXQsIG1jbGlzdC0+ZG1pX2FkZHIsIFZFTE9DSVRZX01VTFRJQ0FTVF9DQU0pOworCQkJdnB0ci0+bUNBTW1hc2tbKG9mZnNldCArIGkpIC8gOF0gfD0gMSA8PCAoKG9mZnNldCArIGkpICYgNyk7CisJCX0KKworCQltYWNfc2V0X2NhbV9tYXNrKHJlZ3MsIHZwdHItPm1DQU1tYXNrLCBWRUxPQ0lUWV9NVUxUSUNBU1RfQ0FNKTsKKwkJcnhfbW9kZSA9IChSQ1JfQU0gfCBSQ1JfQUIpOworCX0KKwlpZiAoZGV2LT5tdHUgPiAxNTAwKQorCQlyeF9tb2RlIHw9IFJDUl9BTDsKKworCUJZVEVfUkVHX0JJVFNfT04ocnhfbW9kZSwgJnJlZ3MtPlJDUik7CisKK30KKworLyoqCisgKgl2ZWxvY2l0eV9nZXRfc3RhdHVzCS0Jc3RhdGlzdGljcyBjYWxsYmFjaworICoJQGRldjogbmV0d29yayBkZXZpY2UKKyAqCisgKglDYWxsYmFjayBmcm9tIHRoZSBuZXR3b3JrIGxheWVyIHRvIGFsbG93IGRyaXZlciBzdGF0aXN0aWNzCisgKgl0byBiZSByZXN5bmNocm9uaXplZCB3aXRoIGhhcmR3YXJlIGNvbGxlY3RlZCBzdGF0ZS4gSW4gdGhlCisgKgljYXNlIG9mIHRoZSB2ZWxvY2l0eSB3ZSBuZWVkIHRvIHB1bGwgdGhlIE1JQiBjb3VudGVycyBmcm9tCisgKgl0aGUgaGFyZHdhcmUgaW50byB0aGUgY291bnRlcnMgYmVmb3JlIGxldHRpbmcgdGhlIG5ldHdvcmsKKyAqCWxheWVyIGRpc3BsYXkgdGhlbS4KKyAqLworIAorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp2ZWxvY2l0eV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwkKKwkvKiBJZiB0aGUgaGFyZHdhcmUgaXMgZG93biwgZG9uJ3QgdG91Y2ggTUlJICovCisJaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuICZ2cHRyLT5zdGF0czsKKworCXNwaW5fbG9ja19pcnEoJnZwdHItPmxvY2spOworCXZlbG9jaXR5X3VwZGF0ZV9od19taWJzKHZwdHIpOworCXNwaW5fdW5sb2NrX2lycSgmdnB0ci0+bG9jayk7CisKKwl2cHRyLT5zdGF0cy5yeF9wYWNrZXRzID0gdnB0ci0+bWliX2NvdW50ZXJbSFdfTUlCX2lmUnhBbGxQa3RzXTsKKwl2cHRyLT5zdGF0cy5yeF9lcnJvcnMgPSB2cHRyLT5taWJfY291bnRlcltIV19NSUJfaWZSeEVycm9yUGt0c107CisJdnB0ci0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IHZwdHItPm1pYl9jb3VudGVyW0hXX01JQl9pZkluUmFuZ2VMZW5ndGhFcnJvcnNdOworCisvLyAgdW5zaWduZWQgbG9uZyAgIHJ4X2Ryb3BwZWQ7ICAgICAvKiBubyBzcGFjZSBpbiBsaW51eCBidWZmZXJzICAgICovCisJdnB0ci0+c3RhdHMuY29sbGlzaW9ucyA9IHZwdHItPm1pYl9jb3VudGVyW0hXX01JQl9pZlR4RXRoZXJDb2xsaXNpb25zXTsKKwkvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisvLyAgdW5zaWduZWQgbG9uZyAgIHJ4X2xlbmd0aF9lcnJvcnM7CisvLyAgdW5zaWduZWQgbG9uZyAgIHJ4X292ZXJfZXJyb3JzOyAgICAgLyogcmVjZWl2ZXIgcmluZyBidWZmIG92ZXJmbG93ICAqLworCXZwdHItPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSB2cHRyLT5taWJfY291bnRlcltIV19NSUJfaWZSeFBrdENSQ0VdOworLy8gIHVuc2lnbmVkIGxvbmcgICByeF9mcmFtZV9lcnJvcnM7ICAgIC8qIHJlY3YnZCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IgKi8KKy8vICB1bnNpZ25lZCBsb25nICAgcnhfZmlmb19lcnJvcnM7ICAgICAvKiByZWN2J3IgZmlmbyBvdmVycnVuICAgICAgKi8KKy8vICB1bnNpZ25lZCBsb25nICAgcnhfbWlzc2VkX2Vycm9yczsgICAvKiByZWNlaXZlciBtaXNzZWQgcGFja2V0ICAgKi8KKworCS8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLworLy8gIHVuc2lnbmVkIGxvbmcgICB0eF9maWZvX2Vycm9yczsKKworCXJldHVybiAmdnB0ci0+c3RhdHM7Cit9CisKKworLyoqCisgKgl2ZWxvY2l0eV9pb2N0bAkJLQlpb2N0bCBlbnRyeSBwb2ludAorICoJQGRldjogbmV0d29yayBkZXZpY2UKKyAqCUBycTogaW50ZXJmYWNlIHJlcXVlc3QgaW9jdGwKKyAqCUBjbWQ6IGNvbW1hbmQgY29kZQorICoKKyAqCUNhbGxlZCB3aGVuIHRoZSB1c2VyIGlzc3VlcyBhbiBpb2N0bCByZXF1ZXN0IHRvIHRoZSBuZXR3b3JrCisgKglkZXZpY2UgaW4gcXVlc3Rpb24uIFRoZSB2ZWxvY2l0eSBpbnRlcmZhY2Ugc3VwcG9ydHMgTUlJLgorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJaW50IHJldDsKKworCS8qIElmIHdlIGFyZSBhc2tlZCBmb3IgaW5mb3JtYXRpb24gYW5kIHRoZSBkZXZpY2UgaXMgcG93ZXIKKwkgICBzYXZpbmcgdGhlbiB3ZSBuZWVkIHRvIGJyaW5nIHRoZSBkZXZpY2UgYmFjayB1cCB0byB0YWxrIHRvIGl0ICovCisJICAgCQorCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHZwdHItPnBkZXYsIFBDSV9EMCk7CisJCQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToJLyogR2V0IGFkZHJlc3Mgb2YgTUlJIFBIWSBpbiB1c2UuICovCisJY2FzZSBTSU9DR01JSVJFRzoJLyogUmVhZCBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCWNhc2UgU0lPQ1NNSUlSRUc6CS8qIFdyaXRlIHRvIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCXJldCA9IHZlbG9jaXR5X21paV9pb2N0bChkZXYsIHJxLCBjbWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcGNpX3NldF9wb3dlcl9zdGF0ZSh2cHRyLT5wZGV2LCBQQ0lfRDNob3QpOworCQkKKwkJCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqCURlZmluaXRpb24gZm9yIG91ciBkZXZpY2UgZHJpdmVyLiBUaGUgUENJIGxheWVyIGludGVyZmFjZQorICoJdXNlcyB0aGlzIHRvIGhhbmRsZSBhbGwgb3VyIGNhcmQgZGlzY292ZXIgYW5kIHBsdWdnaW5nCisgKi8KKyAKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2ZWxvY2l0eV9kcml2ZXIgPSB7CisgICAgICAubmFtZQk9IFZFTE9DSVRZX05BTUUsCisgICAgICAuaWRfdGFibGUJPSB2ZWxvY2l0eV9pZF90YWJsZSwKKyAgICAgIC5wcm9iZQk9IHZlbG9jaXR5X2ZvdW5kMSwKKyAgICAgIC5yZW1vdmUJPSBfX2RldmV4aXRfcCh2ZWxvY2l0eV9yZW1vdmUxKSwKKyNpZmRlZiBDT05GSUdfUE0KKyAgICAgIC5zdXNwZW5kCT0gdmVsb2NpdHlfc3VzcGVuZCwKKyAgICAgIC5yZXN1bWUJPSB2ZWxvY2l0eV9yZXN1bWUsCisjZW5kaWYKK307CisKKy8qKgorICoJdmVsb2NpdHlfaW5pdF9tb2R1bGUJLQlsb2FkIHRpbWUgZnVuY3Rpb24KKyAqCisgKglDYWxsZWQgd2hlbiB0aGUgdmVsb2NpdHkgbW9kdWxlIGlzIGxvYWRlZC4gVGhlIFBDSSBkcml2ZXIKKyAqCWlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgUENJIGxheWVyLCBhbmQgaW4gdHVybiB3aWxsIGNhbGwKKyAqCXRoZSBwcm9iZSBmdW5jdGlvbnMgZm9yIGVhY2ggdmVsb2NpdHkgYWRhcHRlciBpbnN0YWxsZWQKKyAqCWluIHRoZSBzeXN0ZW0uCisgKi8KKyAKK3N0YXRpYyBpbnQgX19pbml0IHZlbG9jaXR5X2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldDsKKworCXZlbG9jaXR5X3JlZ2lzdGVyX25vdGlmaWVyKCk7CisJcmV0ID0gcGNpX21vZHVsZV9pbml0KCZ2ZWxvY2l0eV9kcml2ZXIpOworCWlmIChyZXQgPCAwKQorCQl2ZWxvY2l0eV91bnJlZ2lzdGVyX25vdGlmaWVyKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9jbGVhbnVwCS0JbW9kdWxlIHVubG9hZAorICoKKyAqCVdoZW4gdGhlIHZlbG9jaXR5IGhhcmR3YXJlIGlzIHVubG9hZGVkIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoJSXQgd2lsbCBjbGVhbiB1cCB0aGUgbm90aWZpZXJzIGFuZCB0aGUgdW5yZWdpc3RlciB0aGUgUENJIAorICoJZHJpdmVyIGludGVyZmFjZSBmb3IgdGhpcyBoYXJkd2FyZS4gVGhpcyBpbiB0dXJuIGNsZWFucyB1cAorICoJYWxsIGRpc2NvdmVyZWQgaW50ZXJmYWNlcyBiZWZvcmUgcmV0dXJuaW5nIGZyb20gdGhlIGZ1bmN0aW9uCisgKi8KKyAKK3N0YXRpYyB2b2lkIF9fZXhpdCB2ZWxvY2l0eV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXZlbG9jaXR5X3VucmVnaXN0ZXJfbm90aWZpZXIoKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZlbG9jaXR5X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHZlbG9jaXR5X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHZlbG9jaXR5X2NsZWFudXBfbW9kdWxlKTsKKworCisvKgorICogTUlJIGFjY2VzcyAsIG1lZGlhIGxpbmsgbW9kZSBzZXR0aW5nIGZ1bmN0aW9ucworICovCisgCisgCisvKioKKyAqCW1paV9pbml0CS0Jc2V0IHVwIE1JSQorICoJQHZwdHI6IHZlbG9jaXR5IGFkYXB0ZXIKKyAqCUBtaWlfc3RhdHVzOiAgbGlua3MgdGF0dXMKKyAqCisgKglTZXQgdXAgdGhlIFBIWSBmb3IgdGhlIGN1cnJlbnQgbGluayBzdGF0ZS4KKyAqLworIAorc3RhdGljIHZvaWQgbWlpX2luaXQoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIHUzMiBtaWlfc3RhdHVzKQoreworCXUxNiBCTUNSOworCisJc3dpdGNoIChQSFlJRF9HRVRfUEhZX0lEKHZwdHItPnBoeV9pZCkpIHsKKwljYXNlIFBIWUlEX0NJQ0FEQV9DUzgyMDE6CisJCS8qCisJCSAqCVJlc2V0IHRvIGhhcmR3YXJlIGRlZmF1bHQKKwkJICovCisJCU1JSV9SRUdfQklUU19PRkYoKEFOQVJfQVNNRElSIHwgQU5BUl9QQVVTRSksIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQkvKgorCQkgKglUdXJuIG9uIEVDSE9ESVMgYml0IGluIE5XYXktZm9yY2VkIGZ1bGwgbW9kZSBhbmQgdHVybiBpdAorCQkgKglvZmYgaXQgaW4gTldheS1mb3JjZWQgaGFsZiBtb2RlIGZvciBOV2F5LWZvcmNlZCB2LnMuIAorCQkgKglsZWdhY3ktZm9yY2VkIGlzc3VlLgorCQkgKi8KKwkJaWYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkKKwkJCU1JSV9SRUdfQklUU19PTihUQ1NSX0VDSE9ESVMsIE1JSV9SRUdfVENTUiwgdnB0ci0+bWFjX3JlZ3MpOworCQllbHNlCisJCQlNSUlfUkVHX0JJVFNfT0ZGKFRDU1JfRUNIT0RJUywgTUlJX1JFR19UQ1NSLCB2cHRyLT5tYWNfcmVncyk7CisJCS8qCisJCSAqCVR1cm4gb24gTGluay9BY3Rpdml0eSBMRUQgZW5hYmxlIGJpdCBmb3IgQ0lTODIwMQorCQkgKi8KKwkJTUlJX1JFR19CSVRTX09OKFBMRURfTEFMQkUsIE1JSV9SRUdfUExFRCwgdnB0ci0+bWFjX3JlZ3MpOworCQlicmVhazsKKwljYXNlIFBIWUlEX1ZUMzIxNl8zMkJJVDoKKwljYXNlIFBIWUlEX1ZUMzIxNl82NEJJVDoKKwkJLyoKKwkJICoJUmVzZXQgdG8gaGFyZHdhcmUgZGVmYXVsdAorCQkgKi8KKwkJTUlJX1JFR19CSVRTX09OKChBTkFSX0FTTURJUiB8IEFOQVJfUEFVU0UpLCBNSUlfUkVHX0FOQVIsIHZwdHItPm1hY19yZWdzKTsKKwkJLyoKKwkJICoJVHVybiBvbiBFQ0hPRElTIGJpdCBpbiBOV2F5LWZvcmNlZCBmdWxsIG1vZGUgYW5kIHR1cm4gaXQKKwkJICoJb2ZmIGl0IGluIE5XYXktZm9yY2VkIGhhbGYgbW9kZSBmb3IgTldheS1mb3JjZWQgdi5zLiAKKwkJICoJbGVnYWN5LWZvcmNlZCBpc3N1ZQorCQkgKi8KKwkJaWYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkKKwkJCU1JSV9SRUdfQklUU19PTihUQ1NSX0VDSE9ESVMsIE1JSV9SRUdfVENTUiwgdnB0ci0+bWFjX3JlZ3MpOworCQllbHNlCisJCQlNSUlfUkVHX0JJVFNfT0ZGKFRDU1JfRUNIT0RJUywgTUlJX1JFR19UQ1NSLCB2cHRyLT5tYWNfcmVncyk7CisJCWJyZWFrOworCisJY2FzZSBQSFlJRF9NQVJWRUxMXzEwMDA6CisJY2FzZSBQSFlJRF9NQVJWRUxMXzEwMDBTOgorCQkvKgorCQkgKglBc3NlcnQgQ1JTIG9uIFRyYW5zbWl0IAorCQkgKi8KKwkJTUlJX1JFR19CSVRTX09OKFBTQ1JfQUNSU1RYLCBNSUlfUkVHX1BTQ1IsIHZwdHItPm1hY19yZWdzKTsKKwkJLyoKKwkJICoJUmVzZXQgdG8gaGFyZHdhcmUgZGVmYXVsdCAKKwkJICovCisJCU1JSV9SRUdfQklUU19PTigoQU5BUl9BU01ESVIgfCBBTkFSX1BBVVNFKSwgTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisJdmVsb2NpdHlfbWlpX3JlYWQodnB0ci0+bWFjX3JlZ3MsIE1JSV9SRUdfQk1DUiwgJkJNQ1IpOworCWlmIChCTUNSICYgQk1DUl9JU08pIHsKKwkJQk1DUiAmPSB+Qk1DUl9JU087CisJCXZlbG9jaXR5X21paV93cml0ZSh2cHRyLT5tYWNfcmVncywgTUlJX1JFR19CTUNSLCBCTUNSKTsKKwl9Cit9CisKKy8qKgorICoJc2FmZV9kaXNhYmxlX21paV9hdXRvcG9sbAktCWF1dG9wb2xsIG9mZgorICoJQHJlZ3M6IHZlbG9jaXR5IHJlZ2lzdGVycworICoKKyAqCVR1cm4gb2ZmIHRoZSBhdXRvcG9sbCBhbmQgd2FpdCBmb3IgaXQgdG8gZGlzYWJsZSBvbiB0aGUgY2hpcAorICovCisgCitzdGF0aWMgdm9pZCBzYWZlX2Rpc2FibGVfbWlpX2F1dG9wb2xsKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncykKK3sKKwl1MTYgd3c7CisKKwkvKiAgdHVybiBvZmYgTUFVVE8gKi8KKwl3cml0ZWIoMCwgJnJlZ3MtPk1JSUNSKTsKKwlmb3IgKHd3ID0gMDsgd3cgPCBXX01BWF9USU1FT1VUOyB3dysrKSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKEJZVEVfUkVHX0JJVFNfSVNfT04oTUlJU1JfTUlETEUsICZyZWdzLT5NSUlTUikpCisJCQlicmVhazsKKwl9Cit9CisKKy8qKgorICoJZW5hYmxlX21paV9hdXRvcG9sbAktCXR1cm4gb24gYXV0b3BvbGxpbmcKKyAqCUByZWdzOiB2ZWxvY2l0eSByZWdpc3RlcnMKKyAqCisgKglFbmFibGUgdGhlIE1JSSBsaW5rIHN0YXR1cyBhdXRvcG9sbCBmZWF0dXJlIG9uIHRoZSBWZWxvY2l0eQorICoJaGFyZHdhcmUuIFdhaXQgZm9yIGl0IHRvIGVuYWJsZS4KKyAqLworCitzdGF0aWMgdm9pZCBlbmFibGVfbWlpX2F1dG9wb2xsKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncykKK3sKKwlpbnQgaWk7CisKKwl3cml0ZWIoMCwgJihyZWdzLT5NSUlDUikpOworCXdyaXRlYihNSUlBRFJfU1dNUEwsICZyZWdzLT5NSUlBRFIpOworCisJZm9yIChpaSA9IDA7IGlpIDwgV19NQVhfVElNRU9VVDsgaWkrKykgeworCQl1ZGVsYXkoMSk7CisJCWlmIChCWVRFX1JFR19CSVRTX0lTX09OKE1JSVNSX01JRExFLCAmcmVncy0+TUlJU1IpKQorCQkJYnJlYWs7CisJfQorCisJd3JpdGViKE1JSUNSX01BVVRPLCAmcmVncy0+TUlJQ1IpOworCisJZm9yIChpaSA9IDA7IGlpIDwgV19NQVhfVElNRU9VVDsgaWkrKykgeworCQl1ZGVsYXkoMSk7CisJCWlmICghQllURV9SRUdfQklUU19JU19PTihNSUlTUl9NSURMRSwgJnJlZ3MtPk1JSVNSKSkKKwkJCWJyZWFrOworCX0KKworfQorCisvKioKKyAqCXZlbG9jaXR5X21paV9yZWFkCS0JcmVhZCBNSUkgZGF0YQorICoJQHJlZ3M6IHZlbG9jaXR5IHJlZ2lzdGVycworICoJQGluZGV4OiBNSUkgcmVnaXN0ZXIgaW5kZXgKKyAqCUBkYXRhOiBidWZmZXIgZm9yIHJlY2VpdmVkIGRhdGEKKyAqCisgKglQZXJmb3JtIGEgc2luZ2xlIHJlYWQgb2YgYW4gTUlJIDE2Yml0IHJlZ2lzdGVyLiBSZXR1cm5zIHplcm8KKyAqCW9uIHN1Y2Nlc3Mgb3IgLUVUSU1FRE9VVCBpZiB0aGUgUEhZIGRpZCBub3QgcmVzcG9uZC4KKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV9taWlfcmVhZChzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqcmVncywgdTggaW5kZXgsIHUxNiAqZGF0YSkKK3sKKwl1MTYgd3c7CisKKwkvKgorCSAqCURpc2FibGUgTUlJQ1JfTUFVVE8sIHNvIHRoYXQgbWlpIGFkZHIgY2FuIGJlIHNldCBub3JtYWxseQorCSAqLworCXNhZmVfZGlzYWJsZV9taWlfYXV0b3BvbGwocmVncyk7CisKKwl3cml0ZWIoaW5kZXgsICZyZWdzLT5NSUlBRFIpOworCisJQllURV9SRUdfQklUU19PTihNSUlDUl9SQ01ELCAmcmVncy0+TUlJQ1IpOworCisJZm9yICh3dyA9IDA7IHd3IDwgV19NQVhfVElNRU9VVDsgd3crKykgeworCQlpZiAoIShyZWFkYigmcmVncy0+TUlJQ1IpICYgTUlJQ1JfUkNNRCkpCisJCQlicmVhazsKKwl9CisKKwkqZGF0YSA9IHJlYWR3KCZyZWdzLT5NSUlEQVRBKTsKKworCWVuYWJsZV9taWlfYXV0b3BvbGwocmVncyk7CisJaWYgKHd3ID09IFdfTUFYX1RJTUVPVVQpCisJCXJldHVybiAtRVRJTUVET1VUOworCXJldHVybiAwOworfQorCisvKioKKyAqCXZlbG9jaXR5X21paV93cml0ZQktCXdyaXRlIE1JSSBkYXRhCisgKglAcmVnczogdmVsb2NpdHkgcmVnaXN0ZXJzCisgKglAaW5kZXg6IE1JSSByZWdpc3RlciBpbmRleAorICoJQGRhdGE6IDE2Yml0IGRhdGEgZm9yIHRoZSBNSUkgcmVnaXN0ZXIKKyAqCisgKglQZXJmb3JtIGEgc2luZ2xlIHdyaXRlIHRvIGFuIE1JSSAxNmJpdCByZWdpc3Rlci4gUmV0dXJucyB6ZXJvCisgKglvbiBzdWNjZXNzIG9yIC1FVElNRURPVVQgaWYgdGhlIFBIWSBkaWQgbm90IHJlc3BvbmQuCisgKi8KKyAKK3N0YXRpYyBpbnQgdmVsb2NpdHlfbWlpX3dyaXRlKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICpyZWdzLCB1OCBtaWlfYWRkciwgdTE2IGRhdGEpCit7CisJdTE2IHd3OworCisJLyoKKwkgKglEaXNhYmxlIE1JSUNSX01BVVRPLCBzbyB0aGF0IG1paSBhZGRyIGNhbiBiZSBzZXQgbm9ybWFsbHkKKwkgKi8KKwlzYWZlX2Rpc2FibGVfbWlpX2F1dG9wb2xsKHJlZ3MpOworCisJLyogTUlJIHJlZyBvZmZzZXQgKi8KKwl3cml0ZWIobWlpX2FkZHIsICZyZWdzLT5NSUlBRFIpOworCS8qIHNldCBNSUkgZGF0YSAqLworCXdyaXRldyhkYXRhLCAmcmVncy0+TUlJREFUQSk7CisKKwkvKiB0dXJuIG9uIE1JSUNSX1dDTUQgKi8KKwlCWVRFX1JFR19CSVRTX09OKE1JSUNSX1dDTUQsICZyZWdzLT5NSUlDUik7CisKKwkvKiBXX01BWF9USU1FT1VUIGlzIHRoZSB0aW1lb3V0IHBlcmlvZCAqLworCWZvciAod3cgPSAwOyB3dyA8IFdfTUFYX1RJTUVPVVQ7IHd3KyspIHsKKwkJdWRlbGF5KDUpOworCQlpZiAoIShyZWFkYigmcmVncy0+TUlJQ1IpICYgTUlJQ1JfV0NNRCkpCisJCQlicmVhazsKKwl9CisJZW5hYmxlX21paV9hdXRvcG9sbChyZWdzKTsKKworCWlmICh3dyA9PSBXX01BWF9USU1FT1VUKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9nZXRfb3B0X21lZGlhX21vZGUJLQlnZXQgbWVkaWEgc2VsZWN0aW9uCisgKglAdnB0cjogdmVsb2NpdHkgYWRhcHRlcgorICoKKyAqCUdldCB0aGUgbWVkaWEgbW9kZSBzdG9yZWQgaW4gRUVQUk9NIG9yIG1vZHVsZSBvcHRpb25zIGFuZCBsb2FkCisgKgltaWlfc3RhdHVzIGFjY29yZGluZ2x5LiBUaGUgcmVxdWVzdGVkIGxpbmsgc3RhdGUgaW5mb3JtYXRpb24KKyAqCWlzIGFsc28gcmV0dXJuZWQuCisgKi8KKyAKK3N0YXRpYyB1MzIgdmVsb2NpdHlfZ2V0X29wdF9tZWRpYV9tb2RlKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCXUzMiBzdGF0dXMgPSAwOworCisJc3dpdGNoICh2cHRyLT5vcHRpb25zLnNwZF9kcHgpIHsKKwljYXNlIFNQRF9EUFhfQVVUTzoKKwkJc3RhdHVzID0gVkVMT0NJVFlfQVVUT05FR19FTkFCTEU7CisJCWJyZWFrOworCWNhc2UgU1BEX0RQWF8xMDBfRlVMTDoKKwkJc3RhdHVzID0gVkVMT0NJVFlfU1BFRURfMTAwIHwgVkVMT0NJVFlfRFVQTEVYX0ZVTEw7CisJCWJyZWFrOworCWNhc2UgU1BEX0RQWF8xMF9GVUxMOgorCQlzdGF0dXMgPSBWRUxPQ0lUWV9TUEVFRF8xMCB8IFZFTE9DSVRZX0RVUExFWF9GVUxMOworCQlicmVhazsKKwljYXNlIFNQRF9EUFhfMTAwX0hBTEY6CisJCXN0YXR1cyA9IFZFTE9DSVRZX1NQRUVEXzEwMDsKKwkJYnJlYWs7CisJY2FzZSBTUERfRFBYXzEwX0hBTEY6CisJCXN0YXR1cyA9IFZFTE9DSVRZX1NQRUVEXzEwOworCQlicmVhazsKKwl9CisJdnB0ci0+bWlpX3N0YXR1cyA9IHN0YXR1czsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqCW1paV9zZXRfYXV0b19vbgkJLQlhdXRvbmVnb3RpYXRlIG9uCisgKglAdnB0cjogdmVsb2NpdHkKKyAqCisgKglFbmFibGUgYXV0b25lZ290YXRpb24gb24gdGhpcyBpbnRlcmZhY2UKKyAqLworIAorc3RhdGljIHZvaWQgbWlpX3NldF9hdXRvX29uKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCWlmIChNSUlfUkVHX0JJVFNfSVNfT04oQk1DUl9BVVRPLCBNSUlfUkVHX0JNQ1IsIHZwdHItPm1hY19yZWdzKSkKKwkJTUlJX1JFR19CSVRTX09OKEJNQ1JfUkVBVVRPLCBNSUlfUkVHX0JNQ1IsIHZwdHItPm1hY19yZWdzKTsKKwllbHNlCisJCU1JSV9SRUdfQklUU19PTihCTUNSX0FVVE8sIE1JSV9SRUdfQk1DUiwgdnB0ci0+bWFjX3JlZ3MpOworfQorCisKKy8qCitzdGF0aWMgdm9pZCBtaWlfc2V0X2F1dG9fb2ZmKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICogdnB0cikKK3sKKyAgICBNSUlfUkVHX0JJVFNfT0ZGKEJNQ1JfQVVUTywgTUlJX1JFR19CTUNSLCB2cHRyLT5tYWNfcmVncyk7Cit9CisqLworCisvKioKKyAqCXNldF9taWlfZmxvd19jb250cm9sCS0JZmxvdyBjb250cm9sIHNldHVwCisgKglAdnB0cjogdmVsb2NpdHkgaW50ZXJmYWNlCisgKgorICoJU2V0IHVwIHRoZSBmbG93IGNvbnRyb2wgb24gdGhpcyBpbnRlcmZhY2UgYWNjb3JkaW5nIHRvCisgKgl0aGUgc3VwcGxpZWQgdXNlci9lZXByb20gb3B0aW9ucy4KKyAqLworIAorc3RhdGljIHZvaWQgc2V0X21paV9mbG93X2NvbnRyb2woc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJLypFbmFibGUgb3IgRGlzYWJsZSBQQVVTRSBpbiBBTkFSICovCisJc3dpdGNoICh2cHRyLT5vcHRpb25zLmZsb3dfY250bCkgeworCWNhc2UgRkxPV19DTlRMX1RYOgorCQlNSUlfUkVHX0JJVFNfT0ZGKEFOQVJfUEFVU0UsIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlNSUlfUkVHX0JJVFNfT04oQU5BUl9BU01ESVIsIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlicmVhazsKKworCWNhc2UgRkxPV19DTlRMX1JYOgorCQlNSUlfUkVHX0JJVFNfT04oQU5BUl9QQVVTRSwgTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCU1JSV9SRUdfQklUU19PTihBTkFSX0FTTURJUiwgTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCWJyZWFrOworCisJY2FzZSBGTE9XX0NOVExfVFhfUlg6CisJCU1JSV9SRUdfQklUU19PTihBTkFSX1BBVVNFLCBNSUlfUkVHX0FOQVIsIHZwdHItPm1hY19yZWdzKTsKKwkJTUlJX1JFR19CSVRTX09OKEFOQVJfQVNNRElSLCBNSUlfUkVHX0FOQVIsIHZwdHItPm1hY19yZWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIEZMT1dfQ05UTF9ESVNBQkxFOgorCQlNSUlfUkVHX0JJVFNfT0ZGKEFOQVJfUEFVU0UsIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlNSUlfUkVHX0JJVFNfT0ZGKEFOQVJfQVNNRElSLCBNSUlfUkVHX0FOQVIsIHZwdHItPm1hY19yZWdzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqCXZlbG9jaXR5X3NldF9tZWRpYV9tb2RlCQktCXNldCBtZWRpYSBtb2RlCisgKglAbWlpX3N0YXR1czogb2xkIE1JSSBsaW5rIHN0YXRlCisgKgorICoJQ2hlY2sgdGhlIG1lZGlhIGxpbmsgc3RhdGUgYW5kIGNvbmZpZ3VyZSB0aGUgZmxvdyBjb250cm9sCisgKglQSFkgYW5kIGFsc28gdmVsb2NpdHkgaGFyZHdhcmUgc2V0dXAgYWNjb3JkaW5nbHkuIEluIHBhcnRpY3VsYXIKKyAqCXdlIG5lZWQgdG8gc2V0IHVwIENEIHBvbGxpbmcgYW5kIGZyYW1lIGJ1cnN0aW5nLgorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X3NldF9tZWRpYV9tb2RlKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCB1MzIgbWlpX3N0YXR1cykKK3sKKwl1MzIgY3Vycl9zdGF0dXM7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisKKwl2cHRyLT5taWlfc3RhdHVzID0gbWlpX2NoZWNrX21lZGlhX21vZGUodnB0ci0+bWFjX3JlZ3MpOworCWN1cnJfc3RhdHVzID0gdnB0ci0+bWlpX3N0YXR1cyAmICh+VkVMT0NJVFlfTElOS19GQUlMKTsKKworCS8qIFNldCBtaWkgbGluayBzdGF0dXMgKi8KKwlzZXRfbWlpX2Zsb3dfY29udHJvbCh2cHRyKTsKKworCS8qCisJICAgQ2hlY2sgaWYgbmV3IHN0YXR1cyBpcyBjb25zaXNlbnQgd2l0aCBjdXJyZW50IHN0YXR1cworCSAgIGlmICgoKG1paV9zdGF0dXMgJiBjdXJyX3N0YXR1cykgJiBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRSkKKwkgICB8fCAobWlpX3N0YXR1cz09Y3Vycl9zdGF0dXMpKSB7CisJICAgdnB0ci0+bWlpX3N0YXR1cz1taWlfY2hlY2tfbWVkaWFfbW9kZSh2cHRyLT5tYWNfcmVncyk7CisJICAgdnB0ci0+bWlpX3N0YXR1cz1jaGVja19jb25uZWN0aW9uX3R5cGUodnB0ci0+bWFjX3JlZ3MpOworCSAgIFZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIlZlbG9jaXR5IGxpbmsgbm8gY2hhbmdlXG4iKTsKKwkgICByZXR1cm4gMDsKKwkgICB9CisJICovCisKKwlpZiAoUEhZSURfR0VUX1BIWV9JRCh2cHRyLT5waHlfaWQpID09IFBIWUlEX0NJQ0FEQV9DUzgyMDEpIHsKKwkJTUlJX1JFR19CSVRTX09OKEFVWENSX01EUFBTLCBNSUlfUkVHX0FVWENSLCB2cHRyLT5tYWNfcmVncyk7CisJfQorCisJLyoKKwkgKglJZiBjb25uZWN0aW9uIHR5cGUgaXMgQVVUTworCSAqLworCWlmIChtaWlfc3RhdHVzICYgVkVMT0NJVFlfQVVUT05FR19FTkFCTEUpIHsKKwkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCAiVmVsb2NpdHkgaXMgQVVUTyBtb2RlXG4iKTsKKwkJLyogY2xlYXIgZm9yY2UgTUFDIG1vZGUgYml0ICovCisJCUJZVEVfUkVHX0JJVFNfT0ZGKENISVBHQ1JfRkNNT0RFLCAmcmVncy0+Q0hJUEdDUik7CisJCS8qIHNldCBkdXBsZXggbW9kZSBvZiBNQUMgYWNjb3JkaW5nIHRvIGR1cGxleCBtb2RlIG9mIE1JSSAqLworCQlNSUlfUkVHX0JJVFNfT04oQU5BUl9UWEZEIHwgQU5BUl9UWCB8IEFOQVJfMTBGRCB8IEFOQVJfMTAsIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlNSUlfUkVHX0JJVFNfT04oRzEwMDBDUl8xMDAwRkQgfCBHMTAwMENSXzEwMDAsIE1JSV9SRUdfRzEwMDBDUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlNSUlfUkVHX0JJVFNfT04oQk1DUl9TUEVFRDFHLCBNSUlfUkVHX0JNQ1IsIHZwdHItPm1hY19yZWdzKTsKKworCQkvKiBlbmFibGUgQVVUTy1ORUdPIG1vZGUgKi8KKwkJbWlpX3NldF9hdXRvX29uKHZwdHIpOworCX0gZWxzZSB7CisJCXUxNiBBTkFSOworCQl1OCBDSElQR0NSOworCisJCS8qCisJCSAqIDEuIGlmIGl0J3MgMzExOSwgZGlzYWJsZSBmcmFtZSBidXJzdGluZyBpbiBoYWxmZHVwbGV4IG1vZGUKKwkJICogICAgYW5kIGVuYWJsZSBpdCBpbiBmdWxsZHVwbGV4IG1vZGUKKwkJICogMi4gc2V0IGNvcnJlY3QgTUlJL0dNSUkgYW5kIGhhbGYvZnVsbCBkdXBsZXggbW9kZSBpbiBDSElQR0NSCisJCSAqIDMuIG9ubHkgZW5hYmxlIENEIGhlYXJ0IGJlYXQgY291bnRlciBpbiAxMEhEIG1vZGUKKwkJICovCisKKwkJLyogc2V0IGZvcmNlIE1BQyBtb2RlIGJpdCAqLworCQlCWVRFX1JFR19CSVRTX09OKENISVBHQ1JfRkNNT0RFLCAmcmVncy0+Q0hJUEdDUik7CisKKwkJQ0hJUEdDUiA9IHJlYWRiKCZyZWdzLT5DSElQR0NSKTsKKwkJQ0hJUEdDUiAmPSB+Q0hJUEdDUl9GQ0dNSUk7CisKKwkJaWYgKG1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkgeworCQkJQ0hJUEdDUiB8PSBDSElQR0NSX0ZDRkRYOworCQkJd3JpdGViKENISVBHQ1IsICZyZWdzLT5DSElQR0NSKTsKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgInNldCBWZWxvY2l0eSB0byBmb3JjZWQgZnVsbCBtb2RlXG4iKTsKKwkJCWlmICh2cHRyLT5yZXZfaWQgPCBSRVZfSURfVlQzMjE2X0EwKQorCQkJCUJZVEVfUkVHX0JJVFNfT0ZGKFRDUl9UQjJCRElTLCAmcmVncy0+VENSKTsKKwkJfSBlbHNlIHsKKwkJCUNISVBHQ1IgJj0gfkNISVBHQ1JfRkNGRFg7CisJCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sICJzZXQgVmVsb2NpdHkgdG8gZm9yY2VkIGhhbGYgbW9kZVxuIik7CisJCQl3cml0ZWIoQ0hJUEdDUiwgJnJlZ3MtPkNISVBHQ1IpOworCQkJaWYgKHZwdHItPnJldl9pZCA8IFJFVl9JRF9WVDMyMTZfQTApCisJCQkJQllURV9SRUdfQklUU19PTihUQ1JfVEIyQkRJUywgJnJlZ3MtPlRDUik7CisJCX0KKworCQlNSUlfUkVHX0JJVFNfT0ZGKEcxMDAwQ1JfMTAwMEZEIHwgRzEwMDBDUl8xMDAwLCBNSUlfUkVHX0cxMDAwQ1IsIHZwdHItPm1hY19yZWdzKTsKKworCQlpZiAoIShtaWlfc3RhdHVzICYgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpICYmIChtaWlfc3RhdHVzICYgVkVMT0NJVFlfU1BFRURfMTApKSB7CisJCQlCWVRFX1JFR19CSVRTX09GRihURVNUQ0ZHX0hCRElTLCAmcmVncy0+VEVTVENGRyk7CisJCX0gZWxzZSB7CisJCQlCWVRFX1JFR19CSVRTX09OKFRFU1RDRkdfSEJESVMsICZyZWdzLT5URVNUQ0ZHKTsKKwkJfQorCQkvKiBNSUlfUkVHX0JJVFNfT0ZGKEJNQ1JfU1BFRUQxRywgTUlJX1JFR19CTUNSLCB2cHRyLT5tYWNfcmVncyk7ICovCisJCXZlbG9jaXR5X21paV9yZWFkKHZwdHItPm1hY19yZWdzLCBNSUlfUkVHX0FOQVIsICZBTkFSKTsKKwkJQU5BUiAmPSAofihBTkFSX1RYRkQgfCBBTkFSX1RYIHwgQU5BUl8xMEZEIHwgQU5BUl8xMCkpOworCQlpZiAobWlpX3N0YXR1cyAmIFZFTE9DSVRZX1NQRUVEXzEwMCkgeworCQkJaWYgKG1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkKKwkJCQlBTkFSIHw9IEFOQVJfVFhGRDsKKwkJCWVsc2UKKwkJCQlBTkFSIHw9IEFOQVJfVFg7CisJCX0gZWxzZSB7CisJCQlpZiAobWlpX3N0YXR1cyAmIFZFTE9DSVRZX0RVUExFWF9GVUxMKQorCQkJCUFOQVIgfD0gQU5BUl8xMEZEOworCQkJZWxzZQorCQkJCUFOQVIgfD0gQU5BUl8xMDsKKwkJfQorCQl2ZWxvY2l0eV9taWlfd3JpdGUodnB0ci0+bWFjX3JlZ3MsIE1JSV9SRUdfQU5BUiwgQU5BUik7CisJCS8qIGVuYWJsZSBBVVRPLU5FR08gbW9kZSAqLworCQltaWlfc2V0X2F1dG9fb24odnB0cik7CisJCS8qIE1JSV9SRUdfQklUU19PTihCTUNSX0FVVE8sIE1JSV9SRUdfQk1DUiwgdnB0ci0+bWFjX3JlZ3MpOyAqLworCX0KKwkvKiB2cHRyLT5taWlfc3RhdHVzPW1paV9jaGVja19tZWRpYV9tb2RlKHZwdHItPm1hY19yZWdzKTsgKi8KKwkvKiB2cHRyLT5taWlfc3RhdHVzPWNoZWNrX2Nvbm5lY3Rpb25fdHlwZSh2cHRyLT5tYWNfcmVncyk7ICovCisJcmV0dXJuIFZFTE9DSVRZX0xJTktfQ0hBTkdFOworfQorCisvKioKKyAqCW1paV9jaGVja19tZWRpYV9tb2RlCS0JY2hlY2sgbWVkaWEgc3RhdGUKKyAqCUByZWdzOiB2ZWxvY2l0eSByZWdpc3RlcnMKKyAqCisgKglDaGVjayB0aGUgY3VycmVudCBNSUkgc3RhdHVzIGFuZCBkZXRlcm1pbmUgdGhlIGxpbmsgc3RhdHVzCisgKglhY2NvcmRpbmdseQorICovCisgCitzdGF0aWMgdTMyIG1paV9jaGVja19tZWRpYV9tb2RlKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncykKK3sKKwl1MzIgc3RhdHVzID0gMDsKKwl1MTYgQU5BUjsKKworCWlmICghTUlJX1JFR19CSVRTX0lTX09OKEJNU1JfTE5LLCBNSUlfUkVHX0JNU1IsIHJlZ3MpKQorCQlzdGF0dXMgfD0gVkVMT0NJVFlfTElOS19GQUlMOworCisJaWYgKE1JSV9SRUdfQklUU19JU19PTihHMTAwMENSXzEwMDBGRCwgTUlJX1JFR19HMTAwMENSLCByZWdzKSkKKwkJc3RhdHVzIHw9IFZFTE9DSVRZX1NQRUVEXzEwMDAgfCBWRUxPQ0lUWV9EVVBMRVhfRlVMTDsKKwllbHNlIGlmIChNSUlfUkVHX0JJVFNfSVNfT04oRzEwMDBDUl8xMDAwLCBNSUlfUkVHX0cxMDAwQ1IsIHJlZ3MpKQorCQlzdGF0dXMgfD0gKFZFTE9DSVRZX1NQRUVEXzEwMDApOworCWVsc2UgeworCQl2ZWxvY2l0eV9taWlfcmVhZChyZWdzLCBNSUlfUkVHX0FOQVIsICZBTkFSKTsKKwkJaWYgKEFOQVIgJiBBTkFSX1RYRkQpCisJCQlzdGF0dXMgfD0gKFZFTE9DSVRZX1NQRUVEXzEwMCB8IFZFTE9DSVRZX0RVUExFWF9GVUxMKTsKKwkJZWxzZSBpZiAoQU5BUiAmIEFOQVJfVFgpCisJCQlzdGF0dXMgfD0gVkVMT0NJVFlfU1BFRURfMTAwOworCQllbHNlIGlmIChBTkFSICYgQU5BUl8xMEZEKQorCQkJc3RhdHVzIHw9IChWRUxPQ0lUWV9TUEVFRF8xMCB8IFZFTE9DSVRZX0RVUExFWF9GVUxMKTsKKwkJZWxzZQorCQkJc3RhdHVzIHw9IChWRUxPQ0lUWV9TUEVFRF8xMCk7CisJfQorCisJaWYgKE1JSV9SRUdfQklUU19JU19PTihCTUNSX0FVVE8sIE1JSV9SRUdfQk1DUiwgcmVncykpIHsKKwkJdmVsb2NpdHlfbWlpX3JlYWQocmVncywgTUlJX1JFR19BTkFSLCAmQU5BUik7CisJCWlmICgoQU5BUiAmIChBTkFSX1RYRkQgfCBBTkFSX1RYIHwgQU5BUl8xMEZEIHwgQU5BUl8xMCkpCisJCSAgICA9PSAoQU5BUl9UWEZEIHwgQU5BUl9UWCB8IEFOQVJfMTBGRCB8IEFOQVJfMTApKSB7CisJCQlpZiAoTUlJX1JFR19CSVRTX0lTX09OKEcxMDAwQ1JfMTAwMCB8IEcxMDAwQ1JfMTAwMEZELCBNSUlfUkVHX0cxMDAwQ1IsIHJlZ3MpKQorCQkJCXN0YXR1cyB8PSBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRTsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB1MzIgY2hlY2tfY29ubmVjdGlvbl90eXBlKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncykKK3sKKwl1MzIgc3RhdHVzID0gMDsKKwl1OCBQSFlTUjA7CisJdTE2IEFOQVI7CisJUEhZU1IwID0gcmVhZGIoJnJlZ3MtPlBIWVNSMCk7CisKKwkvKgorCSAgIGlmICghKFBIWVNSMCAmIFBIWVNSMF9MSU5LR0QpKQorCSAgIHN0YXR1c3w9VkVMT0NJVFlfTElOS19GQUlMOworCSAqLworCisJaWYgKFBIWVNSMCAmIFBIWVNSMF9GRFBYKQorCQlzdGF0dXMgfD0gVkVMT0NJVFlfRFVQTEVYX0ZVTEw7CisKKwlpZiAoUEhZU1IwICYgUEhZU1IwX1NQREcpCisJCXN0YXR1cyB8PSBWRUxPQ0lUWV9TUEVFRF8xMDAwOworCWlmIChQSFlTUjAgJiBQSFlTUjBfU1BEMTApCisJCXN0YXR1cyB8PSBWRUxPQ0lUWV9TUEVFRF8xMDsKKwllbHNlCisJCXN0YXR1cyB8PSBWRUxPQ0lUWV9TUEVFRF8xMDA7CisKKwlpZiAoTUlJX1JFR19CSVRTX0lTX09OKEJNQ1JfQVVUTywgTUlJX1JFR19CTUNSLCByZWdzKSkgeworCQl2ZWxvY2l0eV9taWlfcmVhZChyZWdzLCBNSUlfUkVHX0FOQVIsICZBTkFSKTsKKwkJaWYgKChBTkFSICYgKEFOQVJfVFhGRCB8IEFOQVJfVFggfCBBTkFSXzEwRkQgfCBBTkFSXzEwKSkKKwkJICAgID09IChBTkFSX1RYRkQgfCBBTkFSX1RYIHwgQU5BUl8xMEZEIHwgQU5BUl8xMCkpIHsKKwkJCWlmIChNSUlfUkVHX0JJVFNfSVNfT04oRzEwMDBDUl8xMDAwIHwgRzEwMDBDUl8xMDAwRkQsIE1JSV9SRUdfRzEwMDBDUiwgcmVncykpCisJCQkJc3RhdHVzIHw9IFZFTE9DSVRZX0FVVE9ORUdfRU5BQkxFOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKgllbmFibGVfZmxvd19jb250cm9sX2FiaWxpdHkJLQlmbG93IGNvbnRyb2wKKyAqCUB2cHRyOiB2ZWxvaXR5IHRvIGNvbmZpZ3VyZQorICoKKyAqCVNldCB1cCBmbG93IGNvbnRyb2wgYWNjb3JkaW5nIHRvIHRoZSBmbG93IGNvbnRyb2wgb3B0aW9ucworICoJZGV0ZXJtaW5lZCBieSB0aGUgZWVwcm9tL2NvbmZpZ3VyYXRpb24uCisgKi8KKworc3RhdGljIHZvaWQgZW5hYmxlX2Zsb3dfY29udHJvbF9hYmlsaXR5KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisKKwlzd2l0Y2ggKHZwdHItPm9wdGlvbnMuZmxvd19jbnRsKSB7CisKKwljYXNlIEZMT1dfQ05UTF9ERUZBVUxUOgorCQlpZiAoQllURV9SRUdfQklUU19JU19PTihQSFlTUjBfUlhGTEMsICZyZWdzLT5QSFlTUjApKQorCQkJd3JpdGVsKENSMF9GRFhSRkNFTiwgJnJlZ3MtPkNSMFNldCk7CisJCWVsc2UKKwkJCXdyaXRlbChDUjBfRkRYUkZDRU4sICZyZWdzLT5DUjBDbHIpOworCisJCWlmIChCWVRFX1JFR19CSVRTX0lTX09OKFBIWVNSMF9UWEZMQywgJnJlZ3MtPlBIWVNSMCkpCisJCQl3cml0ZWwoQ1IwX0ZEWFRGQ0VOLCAmcmVncy0+Q1IwU2V0KTsKKwkJZWxzZQorCQkJd3JpdGVsKENSMF9GRFhURkNFTiwgJnJlZ3MtPkNSMENscik7CisJCWJyZWFrOworCisJY2FzZSBGTE9XX0NOVExfVFg6CisJCXdyaXRlbChDUjBfRkRYVEZDRU4sICZyZWdzLT5DUjBTZXQpOworCQl3cml0ZWwoQ1IwX0ZEWFJGQ0VOLCAmcmVncy0+Q1IwQ2xyKTsKKwkJYnJlYWs7CisKKwljYXNlIEZMT1dfQ05UTF9SWDoKKwkJd3JpdGVsKENSMF9GRFhSRkNFTiwgJnJlZ3MtPkNSMFNldCk7CisJCXdyaXRlbChDUjBfRkRYVEZDRU4sICZyZWdzLT5DUjBDbHIpOworCQlicmVhazsKKworCWNhc2UgRkxPV19DTlRMX1RYX1JYOgorCQl3cml0ZWwoQ1IwX0ZEWFRGQ0VOLCAmcmVncy0+Q1IwU2V0KTsKKwkJd3JpdGVsKENSMF9GRFhSRkNFTiwgJnJlZ3MtPkNSMFNldCk7CisJCWJyZWFrOworCisJY2FzZSBGTE9XX0NOVExfRElTQUJMRToKKwkJd3JpdGVsKENSMF9GRFhSRkNFTiwgJnJlZ3MtPkNSMENscik7CisJCXdyaXRlbChDUjBfRkRYVEZDRU4sICZyZWdzLT5DUjBDbHIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworfQorCisKKy8qKgorICoJdmVsb2NpdHlfZXRodG9vbF91cAktCXByZSBob29rIGZvciBldGh0b29sCisgKglAZGV2OiBuZXR3b3JrIGRldmljZQorICoKKyAqCUNhbGxlZCBiZWZvcmUgYW4gZXRodG9vbCBvcGVyYXRpb24uIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZQorICoJY2hpcCBpcyBvdXQgb2YgRDMgc3RhdGUgYmVmb3JlIHdlIHBva2UgYXQgaXQuCisgKi8KKyAKK3N0YXRpYyBpbnQgdmVsb2NpdHlfZXRodG9vbF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyID0gZGV2LT5wcml2OworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHZwdHItPnBkZXYsIFBDSV9EMCk7CisJcmV0dXJuIDA7Cit9CQorCisvKioKKyAqCXZlbG9jaXR5X2V0aHRvb2xfZG93bgktCXBvc3QgaG9vayBmb3IgZXRodG9vbAorICoJQGRldjogbmV0d29yayBkZXZpY2UKKyAqCisgKglDYWxsZWQgYWZ0ZXIgYW4gZXRodG9vbCBvcGVyYXRpb24uIFJlc3RvcmUgdGhlIGNoaXAgYmFjayB0byBEMworICoJc3RhdGUgaWYgaXQgaXNuJ3QgcnVubmluZy4KKyAqLworIAorc3RhdGljIHZvaWQgdmVsb2NpdHlfZXRodG9vbF9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXBjaV9zZXRfcG93ZXJfc3RhdGUodnB0ci0+cGRldiwgUENJX0QzaG90KTsKK30KKworc3RhdGljIGludCB2ZWxvY2l0eV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisJdTMyIHN0YXR1czsKKwlzdGF0dXMgPSBjaGVja19jb25uZWN0aW9uX3R5cGUodnB0ci0+bWFjX3JlZ3MpOworCisJY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfVFAgfCBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKKwlpZiAoc3RhdHVzICYgVkVMT0NJVFlfU1BFRURfMTAwKQorCQljbWQtPnNwZWVkID0gU1BFRURfMTAwOworCWVsc2UKKwkJY21kLT5zcGVlZCA9IFNQRUVEXzEwOworCWNtZC0+YXV0b25lZyA9IChzdGF0dXMgJiBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRSkgPyBBVVRPTkVHX0VOQUJMRSA6IEFVVE9ORUdfRElTQUJMRTsKKwljbWQtPnBvcnQgPSBQT1JUX1RQOworCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCWNtZC0+cGh5X2FkZHJlc3MgPSByZWFkYigmcmVncy0+TUlJQURSKSAmIDB4MUY7CisKKwlpZiAoc3RhdHVzICYgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpCisJCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJZWxzZQorCQljbWQtPmR1cGxleCA9IERVUExFWF9IQUxGOworCQkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZWxvY2l0eV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJdTMyIGN1cnJfc3RhdHVzOworCXUzMiBuZXdfc3RhdHVzID0gMDsKKwlpbnQgcmV0ID0gMDsKKwkKKwljdXJyX3N0YXR1cyA9IGNoZWNrX2Nvbm5lY3Rpb25fdHlwZSh2cHRyLT5tYWNfcmVncyk7CisJY3Vycl9zdGF0dXMgJj0gKH5WRUxPQ0lUWV9MSU5LX0ZBSUwpOworCisJbmV3X3N0YXR1cyB8PSAoKGNtZC0+YXV0b25lZykgPyBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRSA6IDApOworCW5ld19zdGF0dXMgfD0gKChjbWQtPnNwZWVkID09IFNQRUVEXzEwMCkgPyBWRUxPQ0lUWV9TUEVFRF8xMDAgOiAwKTsKKwluZXdfc3RhdHVzIHw9ICgoY21kLT5zcGVlZCA9PSBTUEVFRF8xMCkgPyBWRUxPQ0lUWV9TUEVFRF8xMCA6IDApOworCW5ld19zdGF0dXMgfD0gKChjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgPyBWRUxPQ0lUWV9EVVBMRVhfRlVMTCA6IDApOworCisJaWYgKChuZXdfc3RhdHVzICYgVkVMT0NJVFlfQVVUT05FR19FTkFCTEUpICYmIChuZXdfc3RhdHVzICE9IChjdXJyX3N0YXR1cyB8IFZFTE9DSVRZX0FVVE9ORUdfRU5BQkxFKSkpCisJCXJldCA9IC1FSU5WQUw7CisJZWxzZQorCQl2ZWxvY2l0eV9zZXRfbWVkaWFfbW9kZSh2cHRyLCBuZXdfc3RhdHVzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgdmVsb2NpdHlfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwlyZXR1cm4gQllURV9SRUdfQklUU19JU19PTihQSFlTUjBfTElOS0dELCAmcmVncy0+UEhZU1IwKSAgPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBWRUxPQ0lUWV9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgVkVMT0NJVFlfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZSh2cHRyLT5wZGV2KSk7Cit9CisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2V0aHRvb2xfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJd29sLT5zdXBwb3J0ZWQgPSBXQUtFX1BIWSB8IFdBS0VfTUFHSUMgfCBXQUtFX1VDQVNUIHwgV0FLRV9BUlA7CisJd29sLT53b2xvcHRzIHw9IFdBS0VfTUFHSUM7CisJLyoKKwkgICBpZiAodnB0ci0+d29sX29wdHMgJiBWRUxPQ0lUWV9XT0xfUEhZKQorCQkgICB3b2wud29sb3B0c3w9V0FLRV9QSFk7CisJCQkgKi8KKwlpZiAodnB0ci0+d29sX29wdHMgJiBWRUxPQ0lUWV9XT0xfVUNBU1QpCisJCXdvbC0+d29sb3B0cyB8PSBXQUtFX1VDQVNUOworCWlmICh2cHRyLT53b2xfb3B0cyAmIFZFTE9DSVRZX1dPTF9BUlApCisJCXdvbC0+d29sb3B0cyB8PSBXQUtFX0FSUDsKKwltZW1jcHkoJndvbC0+c29wYXNzLCB2cHRyLT53b2xfcGFzc3dkLCA2KTsKK30KKworc3RhdGljIGludCB2ZWxvY2l0eV9ldGh0b29sX3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyID0gZGV2LT5wcml2OworCisJaWYgKCEod29sLT53b2xvcHRzICYgKFdBS0VfUEhZIHwgV0FLRV9NQUdJQyB8IFdBS0VfVUNBU1QgfCBXQUtFX0FSUCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwl2cHRyLT53b2xfb3B0cyA9IFZFTE9DSVRZX1dPTF9NQUdJQzsKKworCS8qCisJICAgaWYgKHdvbC53b2xvcHRzICYgV0FLRV9QSFkpIHsKKwkgICB2cHRyLT53b2xfb3B0c3w9VkVMT0NJVFlfV09MX1BIWTsKKwkgICB2cHRyLT5mbGFncyB8PVZFTE9DSVRZX0ZMQUdTX1dPTF9FTkFCTEVEOworCSAgIH0KKwkgKi8KKworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01BR0lDKSB7CisJCXZwdHItPndvbF9vcHRzIHw9IFZFTE9DSVRZX1dPTF9NQUdJQzsKKwkJdnB0ci0+ZmxhZ3MgfD0gVkVMT0NJVFlfRkxBR1NfV09MX0VOQUJMRUQ7CisJfQorCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX1VDQVNUKSB7CisJCXZwdHItPndvbF9vcHRzIHw9IFZFTE9DSVRZX1dPTF9VQ0FTVDsKKwkJdnB0ci0+ZmxhZ3MgfD0gVkVMT0NJVFlfRkxBR1NfV09MX0VOQUJMRUQ7CisJfQorCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX0FSUCkgeworCQl2cHRyLT53b2xfb3B0cyB8PSBWRUxPQ0lUWV9XT0xfQVJQOworCQl2cHRyLT5mbGFncyB8PSBWRUxPQ0lUWV9GTEFHU19XT0xfRU5BQkxFRDsKKwl9CisJbWVtY3B5KHZwdHItPndvbF9wYXNzd2QsIHdvbC0+c29wYXNzLCA2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiB2ZWxvY2l0eV9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbXNnbGV2ZWw7Cit9CisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCit7CisJIG1zZ2xldmVsID0gdmFsdWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgdmVsb2NpdHlfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwk9CXZlbG9jaXR5X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCT0JdmVsb2NpdHlfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwk9CXZlbG9jaXR5X2dldF9kcnZpbmZvLAorCS5nZXRfd29sCT0JdmVsb2NpdHlfZXRodG9vbF9nZXRfd29sLAorCS5zZXRfd29sCT0JdmVsb2NpdHlfZXRodG9vbF9zZXRfd29sLAorCS5nZXRfbXNnbGV2ZWwJPQl2ZWxvY2l0eV9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAk9CXZlbG9jaXR5X3NldF9tc2dsZXZlbCwKKwkuZ2V0X2xpbmsJPQl2ZWxvY2l0eV9nZXRfbGluaywKKwkuYmVnaW4JCT0JdmVsb2NpdHlfZXRodG9vbF91cCwKKwkuY29tcGxldGUJPQl2ZWxvY2l0eV9ldGh0b29sX2Rvd24KK307CisKKy8qKgorICoJdmVsb2NpdHlfbWlpX2lvY3RsCQktCU1JSSBpb2N0bCBoYW5kbGVyCisgKglAZGV2OiBuZXR3b3JrIGRldmljZQorICoJQGlmcjogdGhlIGlmcmVxIGJsb2NrIGZvciB0aGUgaW9jdGwKKyAqCUBjbWQ6IHRoZSBjb21tYW5kCisgKgorICoJUHJvY2VzcyBNSUkgcmVxdWVzdHMgbWFkZSB2aWEgaW9jdGwgZnJvbSB0aGUgbmV0d29yayBsYXllci4gVGhlc2UKKyAqCWFyZSB1c2VkIGJ5IHRvb2xzIGxpa2Uga3VkenUgdG8gaW50ZXJyb2dhdGUgdGhlIGxpbmsgc3RhdGUgb2YgdGhlCisgKgloYXJkd2FyZQorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X21paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqbWlpZGF0YSA9IGlmX21paShpZnIpOworCWludCBlcnI7CisJCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCQltaWlkYXRhLT5waHlfaWQgPSByZWFkYigmcmVncy0+TUlJQURSKSAmIDB4MWY7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dNSUlSRUc6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmKHZlbG9jaXR5X21paV9yZWFkKHZwdHItPm1hY19yZWdzLCBtaWlkYXRhLT5yZWdfbnVtICYgMHgxZiwgJihtaWlkYXRhLT52YWxfb3V0KSkgPCAwKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NNSUlSRUc6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisJCWVyciA9IHZlbG9jaXR5X21paV93cml0ZSh2cHRyLT5tYWNfcmVncywgbWlpZGF0YS0+cmVnX251bSAmIDB4MWYsIG1paWRhdGEtPnZhbF9pbik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwdHItPmxvY2ssIGZsYWdzKTsKKwkJY2hlY2tfY29ubmVjdGlvbl90eXBlKHZwdHItPm1hY19yZWdzKTsKKwkJaWYoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorCisvKioKKyAqCXZlbG9jaXR5X3NhdmVfY29udGV4dAktCXNhdmUgcmVnaXN0ZXJzCisgKglAdnB0cjogdmVsb2NpdHkgCisgKglAY29udGV4dDogYnVmZmVyIGZvciBzdG9yZWQgY29udGV4dAorICoKKyAqCVJldHJpZXZlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgdmVsb2NpdHkgaGFyZHdhcmUKKyAqCWFuZCBzdGFzaCBpdCBpbiB0aGUgY29udGV4dCBzdHJ1Y3R1cmUsIGZvciB1c2UgYnkgdGhlIGNvbnRleHQKKyAqCXJlc3RvcmUgZnVuY3Rpb25zLiBUaGlzIGFsbG93cyB1cyB0byBzYXZlIHRoaW5ncyB3ZSBuZWVkIGFjcm9zcworICoJcG93ZXIgZG93biBzdGF0ZXMKKyAqLworIAorc3RhdGljIHZvaWQgdmVsb2NpdHlfc2F2ZV9jb250ZXh0KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCBzdHJ1Y3QgdmVsb2NpdHlfY29udGV4dCAqIGNvbnRleHQpCit7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisJdTE2IGk7CisJdTggX19pb21lbSAqcHRyID0gKHU4IF9faW9tZW0gKilyZWdzOworCisJZm9yIChpID0gTUFDX1JFR19QQVI7IGkgPCBNQUNfUkVHX0NSMF9DTFI7IGkgKz0gNCkKKwkJKigodTMyICopIChjb250ZXh0LT5tYWNfcmVnICsgaSkpID0gcmVhZGwocHRyICsgaSk7CisKKwlmb3IgKGkgPSBNQUNfUkVHX01BUjsgaSA8IE1BQ19SRUdfVERDU1JfQ0xSOyBpICs9IDQpCisJCSooKHUzMiAqKSAoY29udGV4dC0+bWFjX3JlZyArIGkpKSA9IHJlYWRsKHB0ciArIGkpOworCisJZm9yIChpID0gTUFDX1JFR19SREJBU0VfTE87IGkgPCBNQUNfUkVHX0ZJRk9fVEVTVDA7IGkgKz0gNCkKKwkJKigodTMyICopIChjb250ZXh0LT5tYWNfcmVnICsgaSkpID0gcmVhZGwocHRyICsgaSk7CisKK30KKworLyoqCisgKgl2ZWxvY2l0eV9yZXN0b3JlX2NvbnRleHQJLQlyZXN0b3JlIHJlZ2lzdGVycworICoJQHZwdHI6IHZlbG9jaXR5IAorICoJQGNvbnRleHQ6IGJ1ZmZlciBmb3Igc3RvcmVkIGNvbnRleHQKKyAqCisgKglSZWxvYWQgdGhlIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgdmVsb2NpdHkgY29udGV4dCAKKyAqCWNyZWF0ZWQgYnkgdmVsb2NpdHlfc2F2ZV9jb250ZXh0LgorICovCisgCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9yZXN0b3JlX2NvbnRleHQoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIHN0cnVjdCB2ZWxvY2l0eV9jb250ZXh0ICpjb250ZXh0KQoreworCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyA9IHZwdHItPm1hY19yZWdzOworCWludCBpOworCXU4IF9faW9tZW0gKnB0ciA9ICh1OCBfX2lvbWVtICopcmVnczsKKworCWZvciAoaSA9IE1BQ19SRUdfUEFSOyBpIDwgTUFDX1JFR19DUjBfU0VUOyBpICs9IDQpIHsKKwkJd3JpdGVsKCooKHUzMiAqKSAoY29udGV4dC0+bWFjX3JlZyArIGkpKSwgcHRyICsgaSk7CisJfQorCisJLyogSnVzdCBza2lwIGNyMCAqLworCWZvciAoaSA9IE1BQ19SRUdfQ1IxX1NFVDsgaSA8IE1BQ19SRUdfQ1IwX0NMUjsgaSsrKSB7CisJCS8qIENsZWFyICovCisJCXdyaXRlYih+KCooKHU4ICopIChjb250ZXh0LT5tYWNfcmVnICsgaSkpKSwgcHRyICsgaSArIDQpOworCQkvKiBTZXQgKi8KKwkJd3JpdGViKCooKHU4ICopIChjb250ZXh0LT5tYWNfcmVnICsgaSkpLCBwdHIgKyBpKTsKKwl9CisKKwlmb3IgKGkgPSBNQUNfUkVHX01BUjsgaSA8IE1BQ19SRUdfSU1SOyBpICs9IDQpIHsKKwkJd3JpdGVsKCooKHUzMiAqKSAoY29udGV4dC0+bWFjX3JlZyArIGkpKSwgcHRyICsgaSk7CisJfQorCisJZm9yIChpID0gTUFDX1JFR19SREJBU0VfTE87IGkgPCBNQUNfUkVHX0ZJRk9fVEVTVDA7IGkgKz0gNCkgeworCQl3cml0ZWwoKigodTMyICopIChjb250ZXh0LT5tYWNfcmVnICsgaSkpLCBwdHIgKyBpKTsKKwl9CisKKwlmb3IgKGkgPSBNQUNfUkVHX1REQ1NSX1NFVDsgaSA8PSBNQUNfUkVHX1JEQ1NSX1NFVDsgaSsrKSB7CisJCXdyaXRlYigqKCh1OCAqKSAoY29udGV4dC0+bWFjX3JlZyArIGkpKSwgcHRyICsgaSk7CisJfQorCit9CisKKy8qKgorICoJd29sX2NhbGNfY3JjCQktCVdPTCBDUkMKKyAqCUBwYXR0ZXJuOiBkYXRhIHBhdHRlcm4KKyAqCUBtYXNrX3BhdHRlcm46IG1hc2sKKyAqCisgKglDb21wdXRlIHRoZSB3YWtlIG9uIGxhbiBjcmMgaGFzaGVzIGZvciB0aGUgcGFja2V0IGhlYWRlcgorICoJd2UgYXJlIGludGVyZXN0ZWQgaW4uCisgKi8KKworc3RhdGljIHUxNiB3b2xfY2FsY19jcmMoaW50IHNpemUsIHU4ICogcGF0dGVybiwgdTggKm1hc2tfcGF0dGVybikKK3sKKwl1MTYgY3JjID0gMHhGRkZGOworCXU4IG1hc2s7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCW1hc2sgPSBtYXNrX3BhdHRlcm5baV07CisKKwkJLyogU2tpcCB0aGlzIGxvb3AgaWYgdGhlIG1hc2sgZXF1YWxzIHRvIHplcm8gKi8KKwkJaWYgKG1hc2sgPT0gMHgwMCkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCWlmICgobWFzayAmIDB4MDEpID09IDApIHsKKwkJCQltYXNrID4+PSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbWFzayA+Pj0gMTsKKwkJCWNyYyA9IGNyY19jY2l0dChjcmMsICYocGF0dGVybltpICogOCArIGpdKSwgMSk7CisJCX0KKwl9CisJLyoJRmluYWxseSwgaW52ZXJ0IHRoZSByZXN1bHQgb25jZSB0byBnZXQgdGhlIGNvcnJlY3QgZGF0YSAqLworCWNyYyA9IH5jcmM7CisJcmV0dXJuIGJpdHJldmVyc2UoY3JjKSA+PiAxNjsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9zZXRfd29sCS0Jc2V0IHVwIGZvciB3YWtlIG9uIGxhbgorICoJQHZwdHI6IHZlbG9jaXR5IHRvIHNldCBXT0wgc3RhdHVzIG9uCisgKgorICoJU2V0IGEgY2FyZCB1cCBmb3Igd2FrZSBvbiBsYW4gZWl0aGVyIGJ5IHVuaWNhc3Qgb3IgYnkKKyAqCUFSUCBwYWNrZXQuCisgKgorICoJRklYTUU6IGNoZWNrIHN0YXRpYyBidWZmZXIgaXMgc2FmZSBoZXJlCisgKi8KKworc3RhdGljIGludCB2ZWxvY2l0eV9zZXRfd29sKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyA9IHZwdHItPm1hY19yZWdzOworCXN0YXRpYyB1OCBidWZbMjU2XTsKKwlpbnQgaTsKKworCXN0YXRpYyB1MzIgbWFza19wYXR0ZXJuWzJdWzRdID0geworCQl7MHgwMDIwMzAwMCwgMHgwMDAwMDNDMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwfSwgLyogQVJQICovCisJCXsweGZmZmZmMDAwLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweDAwMGZmZmZ9CSAvKiBNYWdpYyBQYWNrZXQgKi8KKwl9OworCisJd3JpdGV3KDB4RkZGRiwgJnJlZ3MtPldPTENSQ2xyKTsKKwl3cml0ZWIoV09MQ0ZHX1NBQiB8IFdPTENGR19TQU0sICZyZWdzLT5XT0xDRkdTZXQpOworCXdyaXRldyhXT0xDUl9NQUdJQ19FTiwgJnJlZ3MtPldPTENSU2V0KTsKKworCS8qCisJICAgaWYgKHZwdHItPndvbF9vcHRzICYgVkVMT0NJVFlfV09MX1BIWSkKKwkgICB3cml0ZXcoKFdPTENSX0xJTktPTl9FTnxXT0xDUl9MSU5LT0ZGX0VOKSwgJnJlZ3MtPldPTENSU2V0KTsKKwkgKi8KKworCWlmICh2cHRyLT53b2xfb3B0cyAmIFZFTE9DSVRZX1dPTF9VQ0FTVCkgeworCQl3cml0ZXcoV09MQ1JfVU5JQ0FTVF9FTiwgJnJlZ3MtPldPTENSU2V0KTsKKwl9CisKKwlpZiAodnB0ci0+d29sX29wdHMgJiBWRUxPQ0lUWV9XT0xfQVJQKSB7CisJCXN0cnVjdCBhcnBfcGFja2V0ICphcnAgPSAoc3RydWN0IGFycF9wYWNrZXQgKikgYnVmOworCQl1MTYgY3JjOworCQltZW1zZXQoYnVmLCAwLCBzaXplb2Yoc3RydWN0IGFycF9wYWNrZXQpICsgNyk7CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCXdyaXRlbChtYXNrX3BhdHRlcm5bMF1baV0sICZyZWdzLT5CeXRlTWFza1swXVtpXSk7CisKKwkJYXJwLT50eXBlID0gaHRvbnMoRVRIX1BfQVJQKTsKKwkJYXJwLT5hcl9vcCA9IGh0b25zKDEpOworCisJCW1lbWNweShhcnAtPmFyX3RpcCwgdnB0ci0+aXBfYWRkciwgNCk7CisKKwkJY3JjID0gd29sX2NhbGNfY3JjKChzaXplb2Yoc3RydWN0IGFycF9wYWNrZXQpICsgNykgLyA4LCBidWYsCisJCQkJKHU4ICopICYgbWFza19wYXR0ZXJuWzBdWzBdKTsKKworCQl3cml0ZXcoY3JjLCAmcmVncy0+UGF0dGVybkNSQ1swXSk7CisJCXdyaXRldyhXT0xDUl9BUlBfRU4sICZyZWdzLT5XT0xDUlNldCk7CisJfQorCisJQllURV9SRUdfQklUU19PTihQV0NGR19XT0xUWVBFLCAmcmVncy0+UFdDRkdTZXQpOworCUJZVEVfUkVHX0JJVFNfT04oUFdDRkdfTEVHQUNZX1dPTEVOLCAmcmVncy0+UFdDRkdTZXQpOworCisJd3JpdGV3KDB4MEZGRiwgJnJlZ3MtPldPTFNSQ2xyKTsKKworCWlmICh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfQVVUT05FR19FTkFCTEUpIHsKKwkJaWYgKFBIWUlEX0dFVF9QSFlfSUQodnB0ci0+cGh5X2lkKSA9PSBQSFlJRF9DSUNBREFfQ1M4MjAxKQorCQkJTUlJX1JFR19CSVRTX09OKEFVWENSX01EUFBTLCBNSUlfUkVHX0FVWENSLCB2cHRyLT5tYWNfcmVncyk7CisKKwkJTUlJX1JFR19CSVRTX09GRihHMTAwMENSXzEwMDBGRCB8IEcxMDAwQ1JfMTAwMCwgTUlJX1JFR19HMTAwMENSLCB2cHRyLT5tYWNfcmVncyk7CisJfQorCisJaWYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9TUEVFRF8xMDAwKQorCQlNSUlfUkVHX0JJVFNfT04oQk1DUl9SRUFVVE8sIE1JSV9SRUdfQk1DUiwgdnB0ci0+bWFjX3JlZ3MpOworCisJQllURV9SRUdfQklUU19PTihDSElQR0NSX0ZDTU9ERSwgJnJlZ3MtPkNISVBHQ1IpOworCisJeworCQl1OCBHQ1I7CisJCUdDUiA9IHJlYWRiKCZyZWdzLT5DSElQR0NSKTsKKwkJR0NSID0gKEdDUiAmIH5DSElQR0NSX0ZDR01JSSkgfCBDSElQR0NSX0ZDRkRYOworCQl3cml0ZWIoR0NSLCAmcmVncy0+Q0hJUEdDUik7CisJfQorCisJQllURV9SRUdfQklUU19PRkYoSVNSX1BXRUksICZyZWdzLT5JU1IpOworCS8qIFR1cm4gb24gU1dQVEFHIGp1c3QgYmVmb3JlIGVudGVyaW5nIHBvd2VyIG1vZGUgKi8KKwlCWVRFX1JFR19CSVRTX09OKFNUSUNLSFdfU1dQVEFHLCAmcmVncy0+U1RJQ0tIVyk7CisJLyogR28gdG8gYmVkIC4uLi4uICovCisJQllURV9SRUdfQklUU19PTigoU1RJQ0tIV19EUzEgfCBTVElDS0hXX0RTMCksICZyZWdzLT5TVElDS0hXKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlbG9jaXR5X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYoIW5ldGlmX3J1bm5pbmcodnB0ci0+ZGV2KSkKKwkJcmV0dXJuIDA7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKHZwdHItPmRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdnB0ci0+bG9jaywgZmxhZ3MpOworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworI2lmZGVmIEVUSFRPT0xfR1dPTAorCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX1dPTF9FTkFCTEVEKSB7CisJCXZlbG9jaXR5X2dldF9pcCh2cHRyKTsKKwkJdmVsb2NpdHlfc2F2ZV9jb250ZXh0KHZwdHIsICZ2cHRyLT5jb250ZXh0KTsKKwkJdmVsb2NpdHlfc2h1dGRvd24odnB0cik7CisJCXZlbG9jaXR5X3NldF93b2wodnB0cik7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCAzLCAxKTsKKwkJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDNob3QpOworCX0gZWxzZSB7CisJCXZlbG9jaXR5X3NhdmVfY29udGV4dCh2cHRyLCAmdnB0ci0+Y29udGV4dCk7CisJCXZlbG9jaXR5X3NodXRkb3duKHZwdHIpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCX0KKyNlbHNlCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisjZW5kaWYKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlpZighbmV0aWZfcnVubmluZyh2cHRyLT5kZXYpKQorCQlyZXR1cm4gMDsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgMCwgMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKKwltYWNfd29sX3Jlc2V0KHZwdHItPm1hY19yZWdzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisJdmVsb2NpdHlfcmVzdG9yZV9jb250ZXh0KHZwdHIsICZ2cHRyLT5jb250ZXh0KTsKKwl2ZWxvY2l0eV9pbml0X3JlZ2lzdGVycyh2cHRyLCBWRUxPQ0lUWV9JTklUX1dPTCk7CisJbWFjX2Rpc2FibGVfaW50KHZwdHItPm1hY19yZWdzKTsKKworCXZlbG9jaXR5X3R4X3Nydih2cHRyLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCB2cHRyLT5udW1fdHhxOyBpKyspIHsKKwkJaWYgKHZwdHItPnRkX3VzZWRbaV0pIHsKKwkJCW1hY190eF9xdWV1ZV93YWtlKHZwdHItPm1hY19yZWdzLCBpKTsKKwkJfQorCX0KKworCW1hY19lbmFibGVfaW50KHZwdHItPm1hY19yZWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisJbmV0aWZfZGV2aWNlX2F0dGFjaCh2cHRyLT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfbmV0ZGV2X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgbm90aWZpY2F0aW9uLCB2b2lkICpwdHIpCit7CisJc3RydWN0IGluX2lmYWRkciAqaWZhID0gKHN0cnVjdCBpbl9pZmFkZHIgKikgcHRyOworCisJaWYgKGlmYSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWZhLT5pZmFfZGV2LT5kZXY7CisJCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZWxvY2l0eV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodnB0ciwgJnZlbG9jaXR5X2Rldl9saXN0LCBsaXN0KSB7CisJCQlpZiAodnB0ci0+ZGV2ID09IGRldikgeworCQkJCXZlbG9jaXR5X2dldF9pcCh2cHRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZWxvY2l0eV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmggYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjcwYjdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmgKQEAgLTAsMCArMSwxODc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDAzIFZJQSBOZXR3b3JraW5nIFRlY2hub2xvZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogRmlsZTogdmlhLXZlbG9jaXR5LmgKKyAqCisgKiBQdXJwb3NlOiBIZWFkZXIgZmlsZSB0byBkZWZpbmUgZHJpdmVyJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmVzLgorICoKKyAqIEF1dGhvcjogQ2h1YW5nIExpYW5nLVNoaW5nLCBBSiBKaWFuZworICoKKyAqIERhdGU6IEphbiAyNCwgMjAwMworICovCisKKworI2lmbmRlZiBWRUxPQ0lUWV9ICisjZGVmaW5lIFZFTE9DSVRZX0gKKworI2RlZmluZSBWRUxPQ0lUWV9UWF9DU1VNX1NVUFBPUlQKKworI2RlZmluZSBWRUxPQ0lUWV9OQU1FICAgICAgICAgICJ2aWEtdmVsb2NpdHkiCisjZGVmaW5lIFZFTE9DSVRZX0ZVTExfRFJWX05BTSAgIlZJQSBOZXR3b3JraW5nIFZlbG9jaXR5IEZhbWlseSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIgRHJpdmVyIgorI2RlZmluZSBWRUxPQ0lUWV9WRVJTSU9OICAgICAgICIxLjEzIgorCisjZGVmaW5lIFBLVF9CVUZfU1ogICAgICAgICAgMTU0MAorCisjZGVmaW5lIE1BWF9VTklUUyAgICAgICAgICAgOAorI2RlZmluZSBPUFRJT05fREVGQVVMVCAgICAgIHsgWzAgLi4uIE1BWF9VTklUUy0xXSA9IC0xfQorCisjZGVmaW5lIFJFVl9JRF9WVDYxMTAgICAgICAgKDApCisKKyNkZWZpbmUgQllURV9SRUdfQklUU19PTih4LHApICAgICAgIGRvIHsgd3JpdGViKHJlYWRiKChwKSl8KHgpLChwKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgV09SRF9SRUdfQklUU19PTih4LHApICAgICAgIGRvIHsgd3JpdGV3KHJlYWR3KChwKSl8KHgpLChwKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgRFdPUkRfUkVHX0JJVFNfT04oeCxwKSAgICAgIGRvIHsgd3JpdGVsKHJlYWRsKChwKSl8KHgpLChwKSk7fSB3aGlsZSAoMCkKKworI2RlZmluZSBCWVRFX1JFR19CSVRTX0lTX09OKHgscCkgICAgKHJlYWRiKChwKSkgJiAoeCkpCisjZGVmaW5lIFdPUkRfUkVHX0JJVFNfSVNfT04oeCxwKSAgICAocmVhZHcoKHApKSAmICh4KSkKKyNkZWZpbmUgRFdPUkRfUkVHX0JJVFNfSVNfT04oeCxwKSAgIChyZWFkbCgocCkpICYgKHgpKQorCisjZGVmaW5lIEJZVEVfUkVHX0JJVFNfT0ZGKHgscCkgICAgICBkbyB7IHdyaXRlYihyZWFkYigocCkpICYgKH4oeCkpLChwKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgV09SRF9SRUdfQklUU19PRkYoeCxwKSAgICAgIGRvIHsgd3JpdGV3KHJlYWR3KChwKSkgJiAofih4KSksKHApKTt9IHdoaWxlICgwKQorI2RlZmluZSBEV09SRF9SRUdfQklUU19PRkYoeCxwKSAgICAgZG8geyB3cml0ZWwocmVhZGwoKHApKSAmICh+KHgpKSwocCkpO30gd2hpbGUgKDApCisKKyNkZWZpbmUgQllURV9SRUdfQklUU19TRVQoeCxtLHApICAgIGRvIHsgd3JpdGViKCAocmVhZGIoKHApKSAmICh+KG0pKSkgfCh4KSwocCkpO30gd2hpbGUgKDApCisjZGVmaW5lIFdPUkRfUkVHX0JJVFNfU0VUKHgsbSxwKSAgICBkbyB7IHdyaXRldyggKHJlYWR3KChwKSkgJiAofihtKSkpIHwoeCksKHApKTt9IHdoaWxlICgwKQorI2RlZmluZSBEV09SRF9SRUdfQklUU19TRVQoeCxtLHApICAgZG8geyB3cml0ZWwoIChyZWFkbCgocCkpICYgKH4obSkpKXwoeCksKHApKTt9ICB3aGlsZSAoMCkKKworI2RlZmluZSBWQVJfVVNFRChwKSAgICAgZG8geyhwKT0ocCk7fSB3aGlsZSAoMCkKKworLyoKKyAqIFB1cnBvc2U6IFN0cnVjdHVyZXMgZm9yIE1BWCBSWC9UWCBkZXNjcmlwdG9ycy4KKyAqLworCisKKyNkZWZpbmUgQl9PV05FRF9CWV9DSElQICAgICAxCisjZGVmaW5lIEJfT1dORURfQllfSE9TVCAgICAgMAorCisvKgorICogQml0cyBpbiB0aGUgUlNSMCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgUlNSX0RFVEFHICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBSU1JfU05UQUcgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFJTUl9SWEVSICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgUlNSX1JMICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBSU1JfQ0UgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFJTUl9GQUUgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUlNSX0NSQyAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBSU1JfVklETSAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBCaXRzIGluIHRoZSBSU1IxIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBSU1JfUlhPSyAgICAgICAgICAgMHg4MDAwCS8vIHJ4IE9LCisjZGVmaW5lIFJTUl9QRlQgICAgICAgICAgICAweDQwMDAJLy8gUGVyZmVjdCBmaWx0ZXJpbmcgYWRkcmVzcyBtYXRjaAorI2RlZmluZSBSU1JfTUFSICAgICAgICAgICAgMHgyMDAwCS8vIE1BQyBhY2NlcHQgbXVsdGljYXN0IGFkZHJlc3MgcGFja2V0CisjZGVmaW5lIFJTUl9CQVIgICAgICAgICAgICAweDEwMDAJLy8gTUFDIGFjY2VwdCBicm9hZGNhc3QgYWRkcmVzcyBwYWNrZXQKKyNkZWZpbmUgUlNSX1BIWSAgICAgICAgICAgIDB4MDgwMAkvLyBNQUMgYWNjZXB0IHBoeXNpY2FsIGFkZHJlc3MgcGFja2V0CisjZGVmaW5lIFJTUl9WVEFHICAgICAgICAgICAweDA0MDAJLy8gODAyLjFwLzFxIHRhZ2dpbmcgcGFja2V0IGluZGljYXRvcgorI2RlZmluZSBSU1JfU1RQICAgICAgICAgICAgMHgwMjAwCS8vIHN0YXJ0IG9mIHBhY2tldAorI2RlZmluZSBSU1JfRURQICAgICAgICAgICAgMHgwMTAwCS8vIGVuZCBvZiBwYWNrZXQKKworLyoKKyAqIEJpdHMgaW4gdGhlIFJTUjEgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFJTUjFfUlhPSyAgICAgICAgICAgMHg4MAkvLyByeCBPSworI2RlZmluZSBSU1IxX1BGVCAgICAgICAgICAgIDB4NDAJLy8gUGVyZmVjdCBmaWx0ZXJpbmcgYWRkcmVzcyBtYXRjaAorI2RlZmluZSBSU1IxX01BUiAgICAgICAgICAgIDB4MjAJLy8gTUFDIGFjY2VwdCBtdWx0aWNhc3QgYWRkcmVzcyBwYWNrZXQKKyNkZWZpbmUgUlNSMV9CQVIgICAgICAgICAgICAweDEwCS8vIE1BQyBhY2NlcHQgYnJvYWRjYXN0IGFkZHJlc3MgcGFja2V0CisjZGVmaW5lIFJTUjFfUEhZICAgICAgICAgICAgMHgwOAkvLyBNQUMgYWNjZXB0IHBoeXNpY2FsIGFkZHJlc3MgcGFja2V0CisjZGVmaW5lIFJTUjFfVlRBRyAgICAgICAgICAgMHgwNAkvLyA4MDIuMXAvMXEgdGFnZ2luZyBwYWNrZXQgaW5kaWNhdG9yCisjZGVmaW5lIFJTUjFfU1RQICAgICAgICAgICAgMHgwMgkvLyBzdGFydCBvZiBwYWNrZXQKKyNkZWZpbmUgUlNSMV9FRFAgICAgICAgICAgICAweDAxCS8vIGVuZCBvZiBwYWNrZXQKKworLyoKKyAqIEJpdHMgaW4gdGhlIENTTSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ1NNX0lQT0sgICAgICAgICAgICAweDQwCS8vSVAgQ2hlY2t1c20gdmFsaWRhdGlhb24gb2sKKyNkZWZpbmUgQ1NNX1RVUE9LICAgICAgICAgICAweDIwCS8vVENQL1VEUCBDaGVja3VzbSB2YWxpZGF0aWFvbiBvaworI2RlZmluZSBDU01fRlJBRyAgICAgICAgICAgIDB4MTAJLy9GcmFnbWVudCBJUCBkYXRhZ3JhbQorI2RlZmluZSBDU01fSVBLVCAgICAgICAgICAgIDB4MDQJLy9SZWNlaXZlZCBhbiBJUCBwYWNrZXQKKyNkZWZpbmUgQ1NNX1RDUEtUICAgICAgICAgICAweDAyCS8vUmVjZWl2ZWQgYSBUQ1AgcGFja2V0CisjZGVmaW5lIENTTV9VRFBLVCAgICAgICAgICAgMHgwMQkvL1JlY2VpdmVkIGEgVURQIHBhY2tldAorCisvKgorICogQml0cyBpbiB0aGUgVFNSMCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgVFNSMF9BQlQgICAgICAgICAgICAweDAwODAJLy8gVHggYWJvcnQgYmVjYXVzZSBvZiBleGNlc3NpdmUgY29sbGlzaW9uCisjZGVmaW5lIFRTUjBfT1dUICAgICAgICAgICAgMHgwMDQwCS8vIEp1bWJvIGZyYW1lIFR4IGFib3J0CisjZGVmaW5lIFRTUjBfT1dDICAgICAgICAgICAgMHgwMDIwCS8vIE91dCBvZiB3aW5kb3cgY29sbGlzaW9uCisjZGVmaW5lIFRTUjBfQ09MUyAgICAgICAgICAgMHgwMDEwCS8vIGV4cGVyaWVuY2UgY29sbGlzaW9uIGluIHRoaXMgdHJhbnNtaXQgZXZlbnQKKyNkZWZpbmUgVFNSMF9OQ1IzICAgICAgICAgICAweDAwMDgJLy8gY29sbGlzaW9uIHJldHJ5IGNvdW50ZXJbM10KKyNkZWZpbmUgVFNSMF9OQ1IyICAgICAgICAgICAweDAwMDQJLy8gY29sbGlzaW9uIHJldHJ5IGNvdW50ZXJbMl0KKyNkZWZpbmUgVFNSMF9OQ1IxICAgICAgICAgICAweDAwMDIJLy8gY29sbGlzaW9uIHJldHJ5IGNvdW50ZXJbMV0KKyNkZWZpbmUgVFNSMF9OQ1IwICAgICAgICAgICAweDAwMDEJLy8gY29sbGlzaW9uIHJldHJ5IGNvdW50ZXJbMF0KKyNkZWZpbmUgVFNSMF9URVJSICAgICAgICAgICAweDgwMDAJLy8KKyNkZWZpbmUgVFNSMF9GRFggICAgICAgICAgICAweDQwMDAJLy8gY3VycmVudCB0cmFuc2FjdGlvbiBpcyBzZXJ2aWNlZCBieSBmdWxsIGR1cGxleCBtb2RlCisjZGVmaW5lIFRTUjBfR01JSSAgICAgICAgICAgMHgyMDAwCS8vIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgc2VydmljZWQgYnkgR01JSSBtb2RlCisjZGVmaW5lIFRTUjBfTE5LRkwgICAgICAgICAgMHgxMDAwCS8vIHBhY2tldCBzZXJ2aWNlZCBkdXJpbmcgbGluayBkb3duCisjZGVmaW5lIFRTUjBfU0hETiAgICAgICAgICAgMHgwNDAwCS8vIHNodXRkb3duIGNhc2UKKyNkZWZpbmUgVFNSMF9DUlMgICAgICAgICAgICAweDAyMDAJLy8gY2FycmllciBzZW5zZSBsb3N0CisjZGVmaW5lIFRTUjBfQ0RIICAgICAgICAgICAgMHgwMTAwCS8vIEFRRSB0ZXN0IGZhaWwgKENEIGhlYXJ0YmVhdCkKKworLyoKKyAqIEJpdHMgaW4gdGhlIFRTUjEgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFRTUjFfVEVSUiAgICAgICAgICAgMHg4MAkvLworI2RlZmluZSBUU1IxX0ZEWCAgICAgICAgICAgIDB4NDAJLy8gY3VycmVudCB0cmFuc2FjdGlvbiBpcyBzZXJ2aWNlZCBieSBmdWxsIGR1cGxleCBtb2RlCisjZGVmaW5lIFRTUjFfR01JSSAgICAgICAgICAgMHgyMAkvLyBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIHNlcnZpY2VkIGJ5IEdNSUkgbW9kZQorI2RlZmluZSBUU1IxX0xOS0ZMICAgICAgICAgIDB4MTAJLy8gcGFja2V0IHNlcnZpY2VkIGR1cmluZyBsaW5rIGRvd24KKyNkZWZpbmUgVFNSMV9TSEROICAgICAgICAgICAweDA0CS8vIHNodXRkb3duIGNhc2UKKyNkZWZpbmUgVFNSMV9DUlMgICAgICAgICAgICAweDAyCS8vIGNhcnJpZXIgc2Vuc2UgbG9zdAorI2RlZmluZSBUU1IxX0NESCAgICAgICAgICAgIDB4MDEJLy8gQVFFIHRlc3QgZmFpbCAoQ0QgaGVhcnRiZWF0KQorCisvLworLy8gQml0cyBpbiB0aGUgVENSMCByZWdpc3RlcgorLy8KKyNkZWZpbmUgVENSMF9USUMgICAgICAgICAgICAweDgwCS8vIGFzc2VydCBpbnRlcnJ1cHQgaW1tZWRpYXRlbHkgd2hpbGUgZGVzY3JpcHRvciBoYXMgYmVlbiBzZW5kIGNvbXBsZXRlCisjZGVmaW5lIFRDUjBfUElDICAgICAgICAgICAgMHg0MAkvLyBwcmlvcml0eSBpbnRlcnJ1cHQgcmVxdWVzdCwgSU5BIyBpcyBpc3N1ZWQgb3ZlciBhZGFwdGl2ZSBpbnRlcnJ1cHQgc2NoZW1lCisjZGVmaW5lIFRDUjBfVkVUQUcgICAgICAgICAgMHgyMAkvLyBlbmFibGUgVkxBTiB0YWcKKyNkZWZpbmUgVENSMF9JUENLICAgICAgICAgICAweDEwCS8vIHJlcXVlc3QgSVAgIGNoZWNrc3VtIGNhbGN1bGF0aW9uLgorI2RlZmluZSBUQ1IwX1VEUENLICAgICAgICAgIDB4MDgJLy8gcmVxdWVzdCBVRFAgY2hlY2tzdW0gY2FsY3VsYXRpb24uCisjZGVmaW5lIFRDUjBfVENQQ0sgICAgICAgICAgMHgwNAkvLyByZXF1ZXN0IFRDUCBjaGVja3N1bSBjYWxjdWxhdGlvbi4KKyNkZWZpbmUgVENSMF9KTUJPICAgICAgICAgICAweDAyCS8vIGluZGljYXRlIGEganVtYm8gcGFja2V0IGluIEdNQUMgc2lkZQorI2RlZmluZSBUQ1IwX0NSQyAgICAgICAgICAgIDB4MDEJLy8gZGlzYWJsZSBDUkMgZ2VuZXJhdGlvbgorCisjZGVmaW5lIFRDUExTX05PUk1BTCAgICAgICAgMworI2RlZmluZSBUQ1BMU19TVEFSVCAgICAgICAgIDIKKyNkZWZpbmUgVENQTFNfRU5EICAgICAgICAgICAxCisjZGVmaW5lIFRDUExTX01FRCAgICAgICAgICAgMAorCisKKy8vIG1heCB0cmFuc21pdCBvciByZWNlaXZlIGJ1ZmZlciBzaXplCisjZGVmaW5lIENCX1JYX0JVRl9TSVpFICAgICAyMDQ4VUwJLy8gbWF4IGJ1ZmZlciBzaXplCisJCQkJCS8vIE5PVEU6IG11c3QgYmUgbXVsdGlwbGUgb2YgNAorCisjZGVmaW5lIENCX01BWF9SRF9OVU0gICAgICAgNTEyCS8vIE1BWCAjIG9mIFJECisjZGVmaW5lIENCX01BWF9URF9OVU0gICAgICAgMjU2CS8vIE1BWCAjIG9mIFRECisKKyNkZWZpbmUgQ0JfSU5JVF9SRF9OVU1fMzExOSAxMjgJLy8gaW5pdCAjIG9mIFJELCBmb3Igc2V0dXAgVlQzMTE5CisjZGVmaW5lIENCX0lOSVRfVERfTlVNXzMxMTkgNjQJLy8gaW5pdCAjIG9mIFRELCBmb3Igc2V0dXAgVlQzMTE5CisKKyNkZWZpbmUgQ0JfSU5JVF9SRF9OVU0gICAgICAxMjgJLy8gaW5pdCAjIG9mIFJELCBmb3Igc2V0dXAgZGVmYXVsdAorI2RlZmluZSBDQl9JTklUX1REX05VTSAgICAgIDY0CS8vIGluaXQgIyBvZiBURCwgZm9yIHNldHVwIGRlZmF1bHQKKworLy8gZm9yIDMxMTkKKyNkZWZpbmUgQ0JfVERfUklOR19OVU0gICAgICA0CS8vICMgb2YgVEQgcmluZ3MuCisjZGVmaW5lIENCX01BWF9TRUdfUEVSX1BLVCAgNwkvLyBtYXggZGF0YSBzZWcgcGVyIHBhY2tldCAoVHgpCisKKworLyoKKyAqCUlmIGNvbGxpc2lvbnMgZXhjZXNzIDE1IHRpbWVzICwgdHggd2lsbCBhYm9ydCwgYW5kCisgKglpZiB0eCBmaWZvIHVuZGVyZmxvdywgdHggd2lsbCBmYWlsCisgKgl3ZSBzaG91bGQgdHJ5IHRvIHJlc2VuZCBpdAorICovCisKKyNkZWZpbmUgQ0JfTUFYX1RYX0FCT1JUX1JFVFJZICAgMworCisvKgorICoJUmVjZWl2ZSBkZXNjcmlwdG9yCisgKi8KKworc3RydWN0IHJkZXNjMCB7CisJdTE2IFJTUjsJCS8qIFJlY2VpdmUgc3RhdHVzICovCisJdTE2IGxlbjoxNDsJCS8qIFJlY2VpdmVkIHBhY2tldCBsZW5ndGggKi8KKwl1MTYgcmVzZXJ2ZWQ6MTsKKwl1MTYgb3duZXI6MTsJCS8qIFdobyBvd25zIHRoaXMgYnVmZmVyID8gKi8KK307CisKK3N0cnVjdCByZGVzYzEgeworCXUxNiBQUVRBRzsKKwl1OCBDU007CisJdTggSVBLVDsKK307CisKK3N0cnVjdCByeF9kZXNjIHsKKwlzdHJ1Y3QgcmRlc2MwIHJkZXNjMDsKKwlzdHJ1Y3QgcmRlc2MxIHJkZXNjMTsKKwl1MzIgcGFfbG93OwkJLyogTG93IDMyIGJpdCBQQ0kgYWRkcmVzcyAqLworCXUxNiBwYV9oaWdoOwkJLyogTmV4dCAxNiBiaXQgUENJIGFkZHJlc3MgKDQ4IHRvdGFsKSAqLworCXUxNiBsZW46MTU7CQkvKiBGcmFtZSBzaXplICovCisJdTE2IGludGVuOjE7CQkvKiBFbmFibGUgaW50ZXJydXB0ICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qCisgKglUcmFuc21pdCBkZXNjcmlwdG9yCisgKi8KKworc3RydWN0IHRkZXNjMCB7CisJdTE2IFRTUjsJCS8qIFRyYW5zbWl0IHN0YXR1cyByZWdpc3RlciAqLworCXUxNiBwa3RzaXplOjE0OwkJLyogU2l6ZSBvZiBmcmFtZSAqLworCXUxNiByZXNlcnZlZDoxOworCXUxNiBvd25lcjoxOwkJLyogV2hvIG93bnMgdGhlIGJ1ZmZlciAqLworfTsKKworc3RydWN0IHBxaW5mIHsJCQkvKiBQcmlvcml0eSBxdWV1ZSBpbmZvICovCisJdTE2IFZJRDoxMjsKKwl1MTYgQ0ZJOjE7CisJdTE2IHByaW9yaXR5OjM7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCB0ZGVzYzEgeworCXN0cnVjdCBwcWluZiBwcWluZjsKKwl1OCBUQ1I7CisJdTggVENQTFM6MjsKKwl1OCByZXNlcnZlZDoyOworCXU4IENNRFo6NDsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IHRkX2J1ZiB7CisJdTMyIHBhX2xvdzsKKwl1MTYgcGFfaGlnaDsKKwl1MTYgYnVmc2l6ZToxNDsJCisJdTE2IHJlc2VydmVkOjE7CisJdTE2IHF1ZXVlOjE7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCB0eF9kZXNjIHsKKwlzdHJ1Y3QgdGRlc2MwIHRkZXNjMDsKKwlzdHJ1Y3QgdGRlc2MxIHRkZXNjMTsKKwlzdHJ1Y3QgdGRfYnVmIHRkX2J1Zls3XTsKK307CisKK3N0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWRtYV9hZGRyX3Qgc2tiX2RtYTsKK307CisKKy8qKgorICoJYWxsb2NfcmRfaW5mbwkJLQlhbGxvY2F0ZSBhbiByZCBpbmZvIGJsb2NrCisgKgorICoJQWxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHJlY2VpdmUgaW5mbyBzdHJ1Y3R1cmUgdXNlZCBmb3Iga2VlcGluZworICoJdHJhY2sgb2Yga2VybmVsIHNpZGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBlYWNoIHJlY2VpdmUKKyAqCWRlc2NyaXB0b3Igd2UgYXJlIHVzaW5nCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdmVsb2NpdHlfcmRfaW5mbyAqYWxsb2NfcmRfaW5mbyh2b2lkKQoreworCXN0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvICpwdHI7CisJaWYgKChwdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmVsb2NpdHlfcmRfaW5mbyksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwllbHNlIHsKKwkJbWVtc2V0KHB0ciwgMCwgc2l6ZW9mKHN0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvKSk7CisJCXJldHVybiBwdHI7CisJfQorfQorCisvKgorICoJVXNlZCB0byB0cmFjayB0cmFuc21pdCBzaWRlIGJ1ZmZlcnMuCisgKi8KKworc3RydWN0IHZlbG9jaXR5X3RkX2luZm8geworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggKmJ1ZjsKKwlpbnQgbnNrYl9kbWE7CisJZG1hX2FkZHJfdCBza2JfZG1hWzddOworCWRtYV9hZGRyX3QgYnVmX2RtYTsKK307CisKK2VudW0gIHZlbG9jaXR5X293bmVyIHsKKwlPV05FRF9CWV9IT1NUID0gMCwKKwlPV05FRF9CWV9OSUMgPSAxCit9OworCisKKy8qCisgKglNQUMgcmVnaXN0ZXJzIGFuZCBtYWNyb3MuCisgKi8KKworCisjZGVmaW5lIE1DQU1fU0laRSAgICAgICAgICAgNjQKKyNkZWZpbmUgVkNBTV9TSVpFICAgICAgICAgICA2NAorI2RlZmluZSBUWF9RVUVVRV9OTyAgICAgICAgIDQKKworI2RlZmluZSBNQVhfSFdfTUlCX0NPVU5URVIgIDMyCisjZGVmaW5lIFZFTE9DSVRZX01JTl9NVFUgICAgKDE1MTQtMTQpCisjZGVmaW5lIFZFTE9DSVRZX01BWF9NVFUgICAgKDkwMDApCisKKy8qCisgKglSZWdpc3RlcnMgaW4gdGhlIE1BQworICovCisKKyNkZWZpbmUgTUFDX1JFR19QQVIgICAgICAgICAweDAwCS8vIHBoeXNpY2FsIGFkZHJlc3MKKyNkZWZpbmUgTUFDX1JFR19SQ1IgICAgICAgICAweDA2CisjZGVmaW5lIE1BQ19SRUdfVENSICAgICAgICAgMHgwNworI2RlZmluZSBNQUNfUkVHX0NSMF9TRVQgICAgIDB4MDgKKyNkZWZpbmUgTUFDX1JFR19DUjFfU0VUICAgICAweDA5CisjZGVmaW5lIE1BQ19SRUdfQ1IyX1NFVCAgICAgMHgwQQorI2RlZmluZSBNQUNfUkVHX0NSM19TRVQgICAgIDB4MEIKKyNkZWZpbmUgTUFDX1JFR19DUjBfQ0xSICAgICAweDBDCisjZGVmaW5lIE1BQ19SRUdfQ1IxX0NMUiAgICAgMHgwRAorI2RlZmluZSBNQUNfUkVHX0NSMl9DTFIgICAgIDB4MEUKKyNkZWZpbmUgTUFDX1JFR19DUjNfQ0xSICAgICAweDBGCisjZGVmaW5lIE1BQ19SRUdfTUFSICAgICAgICAgMHgxMAorI2RlZmluZSBNQUNfUkVHX0NBTSAgICAgICAgIDB4MTAKKyNkZWZpbmUgTUFDX1JFR19ERUNfQkFTRV9ISSAweDE4CisjZGVmaW5lIE1BQ19SRUdfREJGX0JBU0VfSEkgMHgxQworI2RlZmluZSBNQUNfUkVHX0lTUl9DVEwgICAgIDB4MjAKKyNkZWZpbmUgTUFDX1JFR19JU1JfSE9UTVIgICAweDIwCisjZGVmaW5lIE1BQ19SRUdfSVNSX1RTVVBUSFIgMHgyMAorI2RlZmluZSBNQUNfUkVHX0lTUl9SU1VQVEhSIDB4MjAKKyNkZWZpbmUgTUFDX1JFR19JU1JfQ1RMMSAgICAweDIxCisjZGVmaW5lIE1BQ19SRUdfVFhFX1NSICAgICAgMHgyMgorI2RlZmluZSBNQUNfUkVHX1JYRV9TUiAgICAgIDB4MjMKKyNkZWZpbmUgTUFDX1JFR19JU1IgICAgICAgICAweDI0CisjZGVmaW5lIE1BQ19SRUdfSVNSMCAgICAgICAgMHgyNAorI2RlZmluZSBNQUNfUkVHX0lTUjEgICAgICAgIDB4MjUKKyNkZWZpbmUgTUFDX1JFR19JU1IyICAgICAgICAweDI2CisjZGVmaW5lIE1BQ19SRUdfSVNSMyAgICAgICAgMHgyNworI2RlZmluZSBNQUNfUkVHX0lNUiAgICAgICAgIDB4MjgKKyNkZWZpbmUgTUFDX1JFR19JTVIwICAgICAgICAweDI4CisjZGVmaW5lIE1BQ19SRUdfSU1SMSAgICAgICAgMHgyOQorI2RlZmluZSBNQUNfUkVHX0lNUjIgICAgICAgIDB4MkEKKyNkZWZpbmUgTUFDX1JFR19JTVIzICAgICAgICAweDJCCisjZGVmaW5lIE1BQ19SRUdfVERDU1JfU0VUICAgMHgzMAorI2RlZmluZSBNQUNfUkVHX1JEQ1NSX1NFVCAgIDB4MzIKKyNkZWZpbmUgTUFDX1JFR19URENTUl9DTFIgICAweDM0CisjZGVmaW5lIE1BQ19SRUdfUkRDU1JfQ0xSICAgMHgzNgorI2RlZmluZSBNQUNfUkVHX1JEQkFTRV9MTyAgIDB4MzgKKyNkZWZpbmUgTUFDX1JFR19SRElORFggICAgICAweDNDCisjZGVmaW5lIE1BQ19SRUdfVERCQVNFX0xPICAgMHg0MAorI2RlZmluZSBNQUNfUkVHX1JEQ1NJWkUgICAgIDB4NTAKKyNkZWZpbmUgTUFDX1JFR19URENTSVpFICAgICAweDUyCisjZGVmaW5lIE1BQ19SRUdfVERJTkRYICAgICAgMHg1NAorI2RlZmluZSBNQUNfUkVHX1RESURYMCAgICAgIDB4NTQKKyNkZWZpbmUgTUFDX1JFR19URElEWDEgICAgICAweDU2CisjZGVmaW5lIE1BQ19SRUdfVERJRFgyICAgICAgMHg1OAorI2RlZmluZSBNQUNfUkVHX1RESURYMyAgICAgIDB4NUEKKyNkZWZpbmUgTUFDX1JFR19QQVVTRV9USU1FUiAweDVDCisjZGVmaW5lIE1BQ19SRUdfUkJSRFUgICAgICAgMHg1RQorI2RlZmluZSBNQUNfUkVHX0ZJRk9fVEVTVDAgIDB4NjAKKyNkZWZpbmUgTUFDX1JFR19GSUZPX1RFU1QxICAweDY0CisjZGVmaW5lIE1BQ19SRUdfQ0FNQUREUiAgICAgMHg2OAorI2RlZmluZSBNQUNfUkVHX0NBTUNSICAgICAgIDB4NjkKKyNkZWZpbmUgTUFDX1JFR19HRlRFU1QgICAgICAweDZBCisjZGVmaW5lIE1BQ19SRUdfRlRTVENNRCAgICAgMHg2QgorI2RlZmluZSBNQUNfUkVHX01JSUNGRyAgICAgIDB4NkMKKyNkZWZpbmUgTUFDX1JFR19NSUlTUiAgICAgICAweDZECisjZGVmaW5lIE1BQ19SRUdfUEhZU1IwICAgICAgMHg2RQorI2RlZmluZSBNQUNfUkVHX1BIWVNSMSAgICAgIDB4NkYKKyNkZWZpbmUgTUFDX1JFR19NSUlDUiAgICAgICAweDcwCisjZGVmaW5lIE1BQ19SRUdfTUlJQURSICAgICAgMHg3MQorI2RlZmluZSBNQUNfUkVHX01JSURBVEEgICAgIDB4NzIKKyNkZWZpbmUgTUFDX1JFR19TT0ZUX1RJTUVSMCAweDc0CisjZGVmaW5lIE1BQ19SRUdfU09GVF9USU1FUjEgMHg3NgorI2RlZmluZSBNQUNfUkVHX0NGR0EgICAgICAgIDB4NzgKKyNkZWZpbmUgTUFDX1JFR19DRkdCICAgICAgICAweDc5CisjZGVmaW5lIE1BQ19SRUdfQ0ZHQyAgICAgICAgMHg3QQorI2RlZmluZSBNQUNfUkVHX0NGR0QgICAgICAgIDB4N0IKKyNkZWZpbmUgTUFDX1JFR19EQ0ZHMCAgICAgICAweDdDCisjZGVmaW5lIE1BQ19SRUdfRENGRzEgICAgICAgMHg3RAorI2RlZmluZSBNQUNfUkVHX01DRkcwICAgICAgIDB4N0UKKyNkZWZpbmUgTUFDX1JFR19NQ0ZHMSAgICAgICAweDdGCisKKyNkZWZpbmUgTUFDX1JFR19UQklTVCAgICAgICAweDgwCisjZGVmaW5lIE1BQ19SRUdfUkJJU1QgICAgICAgMHg4MQorI2RlZmluZSBNQUNfUkVHX1BNQ0MgICAgICAgIDB4ODIKKyNkZWZpbmUgTUFDX1JFR19TVElDS0hXICAgICAweDgzCisjZGVmaW5lIE1BQ19SRUdfTUlCQ1IgICAgICAgMHg4NAorI2RlZmluZSBNQUNfUkVHX0VFUlNWICAgICAgIDB4ODUKKyNkZWZpbmUgTUFDX1JFR19SRVZJRCAgICAgICAweDg2CisjZGVmaW5lIE1BQ19SRUdfTUlCUkVBRCAgICAgMHg4OAorI2RlZmluZSBNQUNfUkVHX0JQTUEgICAgICAgIDB4OEMKKyNkZWZpbmUgTUFDX1JFR19FRVdSX0RBVEEgICAweDhDCisjZGVmaW5lIE1BQ19SRUdfQlBNRF9XUiAgICAgMHg4RgorI2RlZmluZSBNQUNfUkVHX0JQQ01EICAgICAgIDB4OTAKKyNkZWZpbmUgTUFDX1JFR19CUE1EX1JEICAgICAweDkxCisjZGVmaW5lIE1BQ19SRUdfRUVDSEtTVU0gICAgMHg5MgorI2RlZmluZSBNQUNfUkVHX0VFQ1NSICAgICAgIDB4OTMKKyNkZWZpbmUgTUFDX1JFR19FRVJEX0RBVEEgICAweDk0CisjZGVmaW5lIE1BQ19SRUdfRUFERFIgICAgICAgMHg5NgorI2RlZmluZSBNQUNfUkVHX0VNQkNNRCAgICAgIDB4OTcKKyNkZWZpbmUgTUFDX1JFR19KTVBTUjAgICAgICAweDk4CisjZGVmaW5lIE1BQ19SRUdfSk1QU1IxICAgICAgMHg5OQorI2RlZmluZSBNQUNfUkVHX0pNUFNSMiAgICAgIDB4OUEKKyNkZWZpbmUgTUFDX1JFR19KTVBTUjMgICAgICAweDlCCisjZGVmaW5lIE1BQ19SRUdfQ0hJUEdTUiAgICAgMHg5QworI2RlZmluZSBNQUNfUkVHX1RFU1RDRkcgICAgIDB4OUQKKyNkZWZpbmUgTUFDX1JFR19ERUJVRyAgICAgICAweDlFCisjZGVmaW5lIE1BQ19SRUdfQ0hJUEdDUiAgICAgMHg5RgorI2RlZmluZSBNQUNfUkVHX1dPTENSMF9TRVQgIDB4QTAKKyNkZWZpbmUgTUFDX1JFR19XT0xDUjFfU0VUICAweEExCisjZGVmaW5lIE1BQ19SRUdfUFdDRkdfU0VUICAgMHhBMgorI2RlZmluZSBNQUNfUkVHX1dPTENGR19TRVQgIDB4QTMKKyNkZWZpbmUgTUFDX1JFR19XT0xDUjBfQ0xSICAweEE0CisjZGVmaW5lIE1BQ19SRUdfV09MQ1IxX0NMUiAgMHhBNQorI2RlZmluZSBNQUNfUkVHX1BXQ0ZHX0NMUiAgIDB4QTYKKyNkZWZpbmUgTUFDX1JFR19XT0xDRkdfQ0xSICAweEE3CisjZGVmaW5lIE1BQ19SRUdfV09MU1IwX1NFVCAgMHhBOAorI2RlZmluZSBNQUNfUkVHX1dPTFNSMV9TRVQgIDB4QTkKKyNkZWZpbmUgTUFDX1JFR19XT0xTUjBfQ0xSICAweEFDCisjZGVmaW5lIE1BQ19SRUdfV09MU1IxX0NMUiAgMHhBRAorI2RlZmluZSBNQUNfUkVHX1BBVFJOX0NSQzAgIDB4QjAKKyNkZWZpbmUgTUFDX1JFR19QQVRSTl9DUkMxICAweEIyCisjZGVmaW5lIE1BQ19SRUdfUEFUUk5fQ1JDMiAgMHhCNAorI2RlZmluZSBNQUNfUkVHX1BBVFJOX0NSQzMgIDB4QjYKKyNkZWZpbmUgTUFDX1JFR19QQVRSTl9DUkM0ICAweEI4CisjZGVmaW5lIE1BQ19SRUdfUEFUUk5fQ1JDNSAgMHhCQQorI2RlZmluZSBNQUNfUkVHX1BBVFJOX0NSQzYgIDB4QkMKKyNkZWZpbmUgTUFDX1JFR19QQVRSTl9DUkM3ICAweEJFCisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzBfMCAgMHhDMAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0swXzEgIDB4QzQKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMF8yICAweEM4CisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzBfMyAgMHhDQworI2RlZmluZSBNQUNfUkVHX0JZVEVNU0sxXzAgIDB4RDAKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMV8xICAweEQ0CisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzFfMiAgMHhEOAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0sxXzMgIDB4REMKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMl8wICAweEUwCisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzJfMSAgMHhFNAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0syXzIgIDB4RTgKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMl8zICAweEVDCisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzNfMCAgMHhGMAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0szXzEgIDB4RjQKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLM18yICAweEY4CisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzNfMyAgMHhGQworCisvKgorICoJQml0cyBpbiB0aGUgUkNSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBSQ1JfQVMgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgUkNSX0FQICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIFJDUl9BTCAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBSQ1JfUFJPTSAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUkNSX0FCICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIFJDUl9BTSAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBSQ1JfQVIgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUkNSX1NFUCAgICAgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBUQ1IgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFRDUl9UQjJCRElTICAgICAgICAgMHg4MAorI2RlZmluZSBUQ1JfQ09MVE1DMSAgICAgICAgIDB4MDgKKyNkZWZpbmUgVENSX0NPTFRNQzAgICAgICAgICAweDA0CisjZGVmaW5lIFRDUl9MQjEgICAgICAgICAgICAgMHgwMgkvKiBsb29wYmFja1sxXSAqLworI2RlZmluZSBUQ1JfTEIwICAgICAgICAgICAgIDB4MDEJLyogbG9vcGJhY2tbMF0gKi8KKworLyoKKyAqCUJpdHMgaW4gdGhlIENSMCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ1IwX1RYT04gICAgICAgICAgICAweDAwMDAwMDA4VUwKKyNkZWZpbmUgQ1IwX1JYT04gICAgICAgICAgICAweDAwMDAwMDA0VUwKKyNkZWZpbmUgQ1IwX1NUT1AgICAgICAgICAgICAweDAwMDAwMDAyVUwJLyogc3RvcCBNQUMsIGRlZmF1bHQgPSAxICovCisjZGVmaW5lIENSMF9TVFJUICAgICAgICAgICAgMHgwMDAwMDAwMVVMCS8qIHN0YXJ0IE1BQyAqLworI2RlZmluZSBDUjBfU0ZSU1QgICAgICAgICAgIDB4MDAwMDgwMDBVTAkvKiBzb2Z0d2FyZSByZXNldCAqLworI2RlZmluZSBDUjBfVE0xRU4gICAgICAgICAgIDB4MDAwMDQwMDBVTAorI2RlZmluZSBDUjBfVE0wRU4gICAgICAgICAgIDB4MDAwMDIwMDBVTAorI2RlZmluZSBDUjBfRFBPTEwgICAgICAgICAgIDB4MDAwMDA4MDBVTAkvKiBkaXNhYmxlIHJ4L3R4IGF1dG8gcG9sbGluZyAqLworI2RlZmluZSBDUjBfRElTQVUgICAgICAgICAgIDB4MDAwMDAxMDBVTAorI2RlZmluZSBDUjBfWE9ORU4gICAgICAgICAgIDB4MDA4MDAwMDBVTAorI2RlZmluZSBDUjBfRkRYVEZDRU4gICAgICAgIDB4MDA0MDAwMDBVTAkvKiBmdWxsLWR1cGxleCBUWCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIENSMF9GRFhSRkNFTiAgICAgICAgMHgwMDIwMDAwMFVMCS8qIGZ1bGwtZHVwbGV4IFJYIGZsb3cgY29udHJvbCBlbmFibGUgKi8KKyNkZWZpbmUgQ1IwX0hEWEZDRU4gICAgICAgICAweDAwMTAwMDAwVUwJLyogaGFsZi1kdXBsZXggZmxvdyBjb250cm9sIGVuYWJsZSAqLworI2RlZmluZSBDUjBfWEhJVEgxICAgICAgICAgIDB4MDAwODAwMDBVTAkvKiBUWCBYT04gaGlnaCB0aHJlc2hvbGQgMSAqLworI2RlZmluZSBDUjBfWEhJVEgwICAgICAgICAgIDB4MDAwNDAwMDBVTAkvKiBUWCBYT04gaGlnaCB0aHJlc2hvbGQgMCAqLworI2RlZmluZSBDUjBfWExUSDEgICAgICAgICAgIDB4MDAwMjAwMDBVTAkvKiBUWCBwYXVzZSBmcmFtZSBsb3cgdGhyZXNob2xkIDEgKi8KKyNkZWZpbmUgQ1IwX1hMVEgwICAgICAgICAgICAweDAwMDEwMDAwVUwJLyogVFggcGF1c2UgZnJhbWUgbG93IHRocmVzaG9sZCAwICovCisjZGVmaW5lIENSMF9HU1BSU1QgICAgICAgICAgMHg4MDAwMDAwMFVMCisjZGVmaW5lIENSMF9GT1JTUlNUICAgICAgICAgMHg0MDAwMDAwMFVMCisjZGVmaW5lIENSMF9GUEhZUlNUICAgICAgICAgMHgyMDAwMDAwMFVMCisjZGVmaW5lIENSMF9ESUFHICAgICAgICAgICAgMHgxMDAwMDAwMFVMCisjZGVmaW5lIENSMF9JTlRQQ1RMICAgICAgICAgMHgwNDAwMDAwMFVMCisjZGVmaW5lIENSMF9HSU5UTVNLMSAgICAgICAgMHgwMjAwMDAwMFVMCisjZGVmaW5lIENSMF9HSU5UTVNLMCAgICAgICAgMHgwMTAwMDAwMFVMCisKKy8qCisgKglCaXRzIGluIHRoZSBDUjEgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIENSMV9TRlJTVCAgICAgICAgICAgMHg4MAkvKiBzb2Z0d2FyZSByZXNldCAqLworI2RlZmluZSBDUjFfVE0xRU4gICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQ1IxX1RNMEVOICAgICAgICAgICAweDIwCisjZGVmaW5lIENSMV9EUE9MTCAgICAgICAgICAgMHgwOAkvKiBkaXNhYmxlIHJ4L3R4IGF1dG8gcG9sbGluZyAqLworI2RlZmluZSBDUjFfRElTQVUgICAgICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIENSMiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ1IyX1hPTkVOICAgICAgICAgICAweDgwCisjZGVmaW5lIENSMl9GRFhURkNFTiAgICAgICAgMHg0MAkvKiBmdWxsLWR1cGxleCBUWCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIENSMl9GRFhSRkNFTiAgICAgICAgMHgyMAkvKiBmdWxsLWR1cGxleCBSWCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIENSMl9IRFhGQ0VOICAgICAgICAgMHgxMAkvKiBoYWxmLWR1cGxleCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIENSMl9YSElUSDEgICAgICAgICAgMHgwOAkvKiBUWCBYT04gaGlnaCB0aHJlc2hvbGQgMSAqLworI2RlZmluZSBDUjJfWEhJVEgwICAgICAgICAgIDB4MDQJLyogVFggWE9OIGhpZ2ggdGhyZXNob2xkIDAgKi8KKyNkZWZpbmUgQ1IyX1hMVEgxICAgICAgICAgICAweDAyCS8qIFRYIHBhdXNlIGZyYW1lIGxvdyB0aHJlc2hvbGQgMSAqLworI2RlZmluZSBDUjJfWExUSDAgICAgICAgICAgIDB4MDEJLyogVFggcGF1c2UgZnJhbWUgbG93IHRocmVzaG9sZCAwICovCisKKy8qCisgKglCaXRzIGluIHRoZSBDUjMgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIENSM19HU1BSU1QgICAgICAgICAgMHg4MAorI2RlZmluZSBDUjNfRk9SU1JTVCAgICAgICAgIDB4NDAKKyNkZWZpbmUgQ1IzX0ZQSFlSU1QgICAgICAgICAweDIwCisjZGVmaW5lIENSM19ESUFHICAgICAgICAgICAgMHgxMAorI2RlZmluZSBDUjNfSU5UUENUTCAgICAgICAgIDB4MDQKKyNkZWZpbmUgQ1IzX0dJTlRNU0sxICAgICAgICAweDAyCisjZGVmaW5lIENSM19HSU5UTVNLMCAgICAgICAgMHgwMQorCisjZGVmaW5lIElTUkNUTF9VRFBJTlQgICAgICAgMHg4MDAwCisjZGVmaW5lIElTUkNUTF9UU1VQRElTICAgICAgMHg0MDAwCisjZGVmaW5lIElTUkNUTF9SU1VQRElTICAgICAgMHgyMDAwCisjZGVmaW5lIElTUkNUTF9QTVNLMSAgICAgICAgMHgxMDAwCisjZGVmaW5lIElTUkNUTF9QTVNLMCAgICAgICAgMHgwODAwCisjZGVmaW5lIElTUkNUTF9JTlRQRCAgICAgICAgMHgwNDAwCisjZGVmaW5lIElTUkNUTF9IQ1JMRCAgICAgICAgMHgwMjAwCisjZGVmaW5lIElTUkNUTF9TQ1JMRCAgICAgICAgMHgwMTAwCisKKy8qCisgKglCaXRzIGluIHRoZSBJU1JfQ1RMMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgSVNSQ1RMMV9VRFBJTlQgICAgICAweDgwCisjZGVmaW5lIElTUkNUTDFfVFNVUERJUyAgICAgMHg0MAorI2RlZmluZSBJU1JDVEwxX1JTVVBESVMgICAgIDB4MjAKKyNkZWZpbmUgSVNSQ1RMMV9QTVNLMSAgICAgICAweDEwCisjZGVmaW5lIElTUkNUTDFfUE1TSzAgICAgICAgMHgwOAorI2RlZmluZSBJU1JDVEwxX0lOVFBEICAgICAgIDB4MDQKKyNkZWZpbmUgSVNSQ1RMMV9IQ1JMRCAgICAgICAweDAyCisjZGVmaW5lIElTUkNUTDFfU0NSTEQgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgVFhFX1NSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBUWEVTUl9URkRCUyAgICAgICAgIDB4MDgKKyNkZWZpbmUgVFhFU1JfVERXQlMgICAgICAgICAweDA0CisjZGVmaW5lIFRYRVNSX1REUkJTICAgICAgICAgMHgwMgorI2RlZmluZSBUWEVTUl9URFNUUiAgICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIFJYRV9TUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgUlhFU1JfUkZEQlMgICAgICAgICAweDA4CisjZGVmaW5lIFJYRVNSX1JEV0JTICAgICAgICAgMHgwNAorI2RlZmluZSBSWEVTUl9SRFJCUyAgICAgICAgIDB4MDIKKyNkZWZpbmUgUlhFU1JfUkRTVFIgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBJU1IgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIElTUl9JU1IzICAgICAgICAgICAgMHg4MDAwMDAwMFVMCisjZGVmaW5lIElTUl9JU1IyICAgICAgICAgICAgMHg0MDAwMDAwMFVMCisjZGVmaW5lIElTUl9JU1IxICAgICAgICAgICAgMHgyMDAwMDAwMFVMCisjZGVmaW5lIElTUl9JU1IwICAgICAgICAgICAgMHgxMDAwMDAwMFVMCisjZGVmaW5lIElTUl9UWFNUTEkgICAgICAgICAgMHgwMjAwMDAwMFVMCisjZGVmaW5lIElTUl9SWFNUTEkgICAgICAgICAgMHgwMTAwMDAwMFVMCisjZGVmaW5lIElTUl9IRkxEICAgICAgICAgICAgMHgwMDgwMDAwMFVMCisjZGVmaW5lIElTUl9VRFBJICAgICAgICAgICAgMHgwMDQwMDAwMFVMCisjZGVmaW5lIElTUl9NSUJGSSAgICAgICAgICAgMHgwMDIwMDAwMFVMCisjZGVmaW5lIElTUl9TSEROSSAgICAgICAgICAgMHgwMDEwMDAwMFVMCisjZGVmaW5lIElTUl9QSFlJICAgICAgICAgICAgMHgwMDA4MDAwMFVMCisjZGVmaW5lIElTUl9QV0VJICAgICAgICAgICAgMHgwMDA0MDAwMFVMCisjZGVmaW5lIElTUl9UTVIxSSAgICAgICAgICAgMHgwMDAyMDAwMFVMCisjZGVmaW5lIElTUl9UTVIwSSAgICAgICAgICAgMHgwMDAxMDAwMFVMCisjZGVmaW5lIElTUl9TUkNJICAgICAgICAgICAgMHgwMDAwODAwMFVMCisjZGVmaW5lIElTUl9MU1RQRUkgICAgICAgICAgMHgwMDAwNDAwMFVMCisjZGVmaW5lIElTUl9MU1RFSSAgICAgICAgICAgMHgwMDAwMjAwMFVMCisjZGVmaW5lIElTUl9PVkZJICAgICAgICAgICAgMHgwMDAwMTAwMFVMCisjZGVmaW5lIElTUl9GTE9OSSAgICAgICAgICAgMHgwMDAwMDgwMFVMCisjZGVmaW5lIElTUl9SQUNFSSAgICAgICAgICAgMHgwMDAwMDQwMFVMCisjZGVmaW5lIElTUl9UWFdCMUkgICAgICAgICAgMHgwMDAwMDIwMFVMCisjZGVmaW5lIElTUl9UWFdCMEkgICAgICAgICAgMHgwMDAwMDEwMFVMCisjZGVmaW5lIElTUl9QVFgzSSAgICAgICAgICAgMHgwMDAwMDA4MFVMCisjZGVmaW5lIElTUl9QVFgySSAgICAgICAgICAgMHgwMDAwMDA0MFVMCisjZGVmaW5lIElTUl9QVFgxSSAgICAgICAgICAgMHgwMDAwMDAyMFVMCisjZGVmaW5lIElTUl9QVFgwSSAgICAgICAgICAgMHgwMDAwMDAxMFVMCisjZGVmaW5lIElTUl9QVFhJICAgICAgICAgICAgMHgwMDAwMDAwOFVMCisjZGVmaW5lIElTUl9QUlhJICAgICAgICAgICAgMHgwMDAwMDAwNFVMCisjZGVmaW5lIElTUl9QUFRYSSAgICAgICAgICAgMHgwMDAwMDAwMlVMCisjZGVmaW5lIElTUl9QUFJYSSAgICAgICAgICAgMHgwMDAwMDAwMVVMCisKKy8qCisgKglCaXRzIGluIHRoZSBJTVIgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIElNUl9UWFNUTE0gICAgICAgICAgMHgwMjAwMDAwMFVMCisjZGVmaW5lIElNUl9VRFBJTSAgICAgICAgICAgMHgwMDQwMDAwMFVMCisjZGVmaW5lIElNUl9NSUJGSU0gICAgICAgICAgMHgwMDIwMDAwMFVMCisjZGVmaW5lIElNUl9TSEROSU0gICAgICAgICAgMHgwMDEwMDAwMFVMCisjZGVmaW5lIElNUl9QSFlJTSAgICAgICAgICAgMHgwMDA4MDAwMFVMCisjZGVmaW5lIElNUl9QV0VJTSAgICAgICAgICAgMHgwMDA0MDAwMFVMCisjZGVmaW5lIElNUl9UTVIxSU0gICAgICAgICAgMHgwMDAyMDAwMFVMCisjZGVmaW5lIElNUl9UTVIwSU0gICAgICAgICAgMHgwMDAxMDAwMFVMCisKKyNkZWZpbmUgSU1SX1NSQ0lNICAgICAgICAgICAweDAwMDA4MDAwVUwKKyNkZWZpbmUgSU1SX0xTVFBFSU0gICAgICAgICAweDAwMDA0MDAwVUwKKyNkZWZpbmUgSU1SX0xTVEVJTSAgICAgICAgICAweDAwMDAyMDAwVUwKKyNkZWZpbmUgSU1SX09WRklNICAgICAgICAgICAweDAwMDAxMDAwVUwKKyNkZWZpbmUgSU1SX0ZMT05JTSAgICAgICAgICAweDAwMDAwODAwVUwKKyNkZWZpbmUgSU1SX1JBQ0VJTSAgICAgICAgICAweDAwMDAwNDAwVUwKKyNkZWZpbmUgSU1SX1RYV0IxSU0gICAgICAgICAweDAwMDAwMjAwVUwKKyNkZWZpbmUgSU1SX1RYV0IwSU0gICAgICAgICAweDAwMDAwMTAwVUwKKworI2RlZmluZSBJTVJfUFRYM0lNICAgICAgICAgIDB4MDAwMDAwODBVTAorI2RlZmluZSBJTVJfUFRYMklNICAgICAgICAgIDB4MDAwMDAwNDBVTAorI2RlZmluZSBJTVJfUFRYMUlNICAgICAgICAgIDB4MDAwMDAwMjBVTAorI2RlZmluZSBJTVJfUFRYMElNICAgICAgICAgIDB4MDAwMDAwMTBVTAorI2RlZmluZSBJTVJfUFRYSU0gICAgICAgICAgIDB4MDAwMDAwMDhVTAorI2RlZmluZSBJTVJfUFJYSU0gICAgICAgICAgIDB4MDAwMDAwMDRVTAorI2RlZmluZSBJTVJfUFBUWElNICAgICAgICAgIDB4MDAwMDAwMDJVTAorI2RlZmluZSBJTVJfUFBSWElNICAgICAgICAgIDB4MDAwMDAwMDFVTAorCisvKiAweDAwMTNGQjBGVUwgID0gIGluaXRpYWwgdmFsdWUgb2YgSU1SICovCisKKyNkZWZpbmUgSU5UX01BU0tfREVGICAgICAgICAoSU1SX1BQVFhJTXxJTVJfUFBSWElNfElNUl9QVFhJTXxJTVJfUFJYSU18XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUl9QV0VJTXxJTVJfVFhXQjBJTXxJTVJfVFhXQjFJTXxJTVJfRkxPTklNfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVJfT1ZGSU18SU1SX0xTVEVJTXxJTVJfTFNUUEVJTXxJTVJfU1JDSU18SU1SX01JQkZJTXxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1SX1NIRE5JTXxJTVJfVE1SMUlNfElNUl9UTVIwSU18SU1SX1RYU1RMTSkKKworLyoKKyAqCUJpdHMgaW4gdGhlIFREQ1NSMC8xLCBSRENTUjAgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFRSRENTUl9ERUFEICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFRSRENTUl9XQUsgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFRSRENTUl9BQ1QgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFRSRENTUl9SVU4JICAgIDB4MDAwMQorCisvKgorICoJQml0cyBpbiB0aGUgQ0FNQUREUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0FNQUREUl9DQU1FTiAgICAgICAweDgwCisjZGVmaW5lIENBTUFERFJfVkNBTVNMICAgICAgMHg0MAorCisvKgorICoJQml0cyBpbiB0aGUgQ0FNQ1IgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIENBTUNSX1BTMSAgICAgICAgICAgMHg4MAorI2RlZmluZSBDQU1DUl9QUzAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQ0FNQ1JfQUlUUlBLVCAgICAgICAweDIwCisjZGVmaW5lIENBTUNSX0FJVFIxNiAgICAgICAgMHgxMAorI2RlZmluZSBDQU1DUl9DQU1SRCAgICAgICAgIDB4MDgKKyNkZWZpbmUgQ0FNQ1JfQ0FNV1IgICAgICAgICAweDA0CisjZGVmaW5lIENBTUNSX1BTX0NBTV9NQVNLICAgMHg0MAorI2RlZmluZSBDQU1DUl9QU19DQU1fREFUQSAgIDB4ODAKKyNkZWZpbmUgQ0FNQ1JfUFNfTUFSICAgICAgICAweDAwCisKKy8qCisgKglCaXRzIGluIHRoZSBNSUlDRkcgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIE1JSUNGR19NUE8xICAgICAgICAgMHg4MAorI2RlZmluZSBNSUlDRkdfTVBPMCAgICAgICAgIDB4NDAKKyNkZWZpbmUgTUlJQ0ZHX01GREMgICAgICAgICAweDIwCisKKy8qCisgKglCaXRzIGluIHRoZSBNSUlTUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTUlJU1JfTUlETEUgICAgICAgICAweDgwCisKKy8qCisgKgkgQml0cyBpbiB0aGUgUEhZU1IwIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBQSFlTUjBfUEhZUlNUICAgICAgIDB4ODAKKyNkZWZpbmUgUEhZU1IwX0xJTktHRCAgICAgICAweDQwCisjZGVmaW5lIFBIWVNSMF9GRFBYICAgICAgICAgMHgxMAorI2RlZmluZSBQSFlTUjBfU1BERyAgICAgICAgIDB4MDgKKyNkZWZpbmUgUEhZU1IwX1NQRDEwICAgICAgICAweDA0CisjZGVmaW5lIFBIWVNSMF9SWEZMQyAgICAgICAgMHgwMgorI2RlZmluZSBQSFlTUjBfVFhGTEMgICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIFBIWVNSMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgUEhZU1IxX1BIWVRCSSAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBNSUlDUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTUlJQ1JfTUFVVE8gICAgICAgICAweDgwCisjZGVmaW5lIE1JSUNSX1JDTUQgICAgICAgICAgMHg0MAorI2RlZmluZSBNSUlDUl9XQ01EICAgICAgICAgIDB4MjAKKyNkZWZpbmUgTUlJQ1JfTURQTSAgICAgICAgICAweDEwCisjZGVmaW5lIE1JSUNSX01PVVQgICAgICAgICAgMHgwOAorI2RlZmluZSBNSUlDUl9NRE8gICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTUlJQ1JfTURJICAgICAgICAgICAweDAyCisjZGVmaW5lIE1JSUNSX01EQyAgICAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgTUlJQURSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBNSUlBRFJfU1dNUEwgICAgICAgIDB4ODAKKworLyoKKyAqCUJpdHMgaW4gdGhlIENGR0EgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIENGR0FfUE1IQ1RHICAgICAgICAgMHgwOAorI2RlZmluZSBDRkdBX0dQSU8xUEQgICAgICAgIDB4MDQKKyNkZWZpbmUgQ0ZHQV9BQlNIRE4gICAgICAgICAweDAyCisjZGVmaW5lIENGR0FfUEFDUEkgICAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgQ0ZHQiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0ZHQl9HVENLT1BUICAgICAgICAweDgwCisjZGVmaW5lIENGR0JfTUlJT1BUICAgICAgICAgMHg0MAorI2RlZmluZSBDRkdCX0NSU0VPUFQgICAgICAgIDB4MjAKKyNkZWZpbmUgQ0ZHQl9PRlNFVCAgICAgICAgICAweDEwCisjZGVmaW5lIENGR0JfQ1JBTkRPTSAgICAgICAgMHgwOAorI2RlZmluZSBDRkdCX0NBUCAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQ0ZHQl9NQkEgICAgICAgICAgICAweDAyCisjZGVmaW5lIENGR0JfQkFLT1BUICAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgQ0ZHQyByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0ZHQ19FRUxPQUQgICAgICAgICAweDgwCisjZGVmaW5lIENGR0NfQlJPUFQgICAgICAgICAgMHg0MAorI2RlZmluZSBDRkdDX0RMWUVOICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQ0ZHQ19EVFNFTCAgICAgICAgICAweDEwCisjZGVmaW5lIENGR0NfQlRTRUwgICAgICAgICAgMHgwOAorI2RlZmluZSBDRkdDX0JQUzIgICAgICAgICAgIDB4MDQJLyogYm9vdHJvbSBzZWxlY3RbMl0gKi8KKyNkZWZpbmUgQ0ZHQ19CUFMxICAgICAgICAgICAweDAyCS8qIGJvb3Ryb20gc2VsZWN0WzFdICovCisjZGVmaW5lIENGR0NfQlBTMCAgICAgICAgICAgMHgwMQkvKiBib290cm9tIHNlbGVjdFswXSAqLworCisvKgorICogQml0cyBpbiB0aGUgQ0ZHRCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0ZHRF9JT0RJUyAgICAgICAgICAweDgwCisjZGVmaW5lIENGR0RfTVNMVkRBQ0VOICAgICAgMHg0MAorI2RlZmluZSBDRkdEX0NGR0RBQ0VOICAgICAgIDB4MjAKKyNkZWZpbmUgQ0ZHRF9QQ0k2NEVOICAgICAgICAweDEwCisjZGVmaW5lIENGR0RfSFRNUkw0ICAgICAgICAgMHgwOAorCisvKgorICoJQml0cyBpbiB0aGUgRENGRzEgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIERDRkdfWE1XSSAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIERDRkdfWE1STSAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIERDRkdfWE1STCAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIERDRkdfUEVSRElTICAgICAgICAgMHgxMDAwCisjZGVmaW5lIERDRkdfTVJXQUlUICAgICAgICAgMHgwNDAwCisjZGVmaW5lIERDRkdfTVdXQUlUICAgICAgICAgMHgwMjAwCisjZGVmaW5lIERDRkdfTEFUTUVOICAgICAgICAgMHgwMTAwCisKKy8qCisgKglCaXRzIGluIHRoZSBNQ0ZHMCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTUNGR19SWEFSQiAgICAgICAgICAweDAwODAKKyNkZWZpbmUgTUNGR19SRlQxICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgTUNGR19SRlQwICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgTUNGR19MT1dUSE9QVCAgICAgICAweDAwMDgKKyNkZWZpbmUgTUNGR19QUUVOICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgTUNGR19SVEdPUFQgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTUNGR19WSURGUiAgICAgICAgICAweDAwMDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIE1DRkcxIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBNQ0ZHX1RYQVJCICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBNQ0ZHX1RYUUJLMSAgICAgICAgIDB4MDgwMAorI2RlZmluZSBNQ0ZHX1RYUUJLMCAgICAgICAgIDB4MDQwMAorI2RlZmluZSBNQ0ZHX1RYUU5PQksgICAgICAgIDB4MDIwMAorI2RlZmluZSBNQ0ZHX1NOQVBPUFQgICAgICAgIDB4MDEwMAorCisvKgorICoJQml0cyBpbiB0aGUgUE1DQyAgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFBNQ0NfRFNJICAgICAgICAgICAgMHg4MAorI2RlZmluZSBQTUNDX0QyX0RJUyAgICAgICAgIDB4NDAKKyNkZWZpbmUgUE1DQ19EMV9ESVMgICAgICAgICAweDIwCisjZGVmaW5lIFBNQ0NfRDNDX0VOICAgICAgICAgMHgxMAorI2RlZmluZSBQTUNDX0QzSF9FTiAgICAgICAgIDB4MDgKKyNkZWZpbmUgUE1DQ19EMl9FTiAgICAgICAgICAweDA0CisjZGVmaW5lIFBNQ0NfRDFfRU4gICAgICAgICAgMHgwMgorI2RlZmluZSBQTUNDX0QwX0VOICAgICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gU1RJQ0tIVworICovCisKKyNkZWZpbmUgU1RJQ0tIV19TV1BUQUcgICAgICAweDEwCisjZGVmaW5lIFNUSUNLSFdfV09MU1IgICAgICAgMHgwOAorI2RlZmluZSBTVElDS0hXX1dPTEVOICAgICAgIDB4MDQKKyNkZWZpbmUgU1RJQ0tIV19EUzEgICAgICAgICAweDAyCS8qIFIvVyBieSBzb2Z0d2FyZS9jZmcgY3ljbGUgKi8KKyNkZWZpbmUgU1RJQ0tIV19EUzAgICAgICAgICAweDAxCS8qIHN1c3BlbmQgd2VsbCBEUyB3cml0ZSBwb3J0ICovCisKKy8qCisgKglCaXRzIGluIHRoZSBNSUJDUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTUlCQ1JfTUlCSVNUT0sgICAgICAweDgwCisjZGVmaW5lIE1JQkNSX01JQklTVEdPICAgICAgMHg0MAorI2RlZmluZSBNSUJDUl9NSUJJTkMgICAgICAgIDB4MjAKKyNkZWZpbmUgTUlCQ1JfTUlCSEkgICAgICAgICAweDEwCisjZGVmaW5lIE1JQkNSX01JQkZSWiAgICAgICAgMHgwOAorI2RlZmluZSBNSUJDUl9NSUJGTFNIICAgICAgIDB4MDQKKyNkZWZpbmUgTUlCQ1JfTVBUUklOSSAgICAgICAweDAyCisjZGVmaW5lIE1JQkNSX01JQkNMUiAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgRUVSU1YgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIEVFUlNWX0JPT1RfUlBMICAgICAgKCh1OCkgMHgwMSkJIC8qIEJvb3QgbWV0aG9kIHNlbGVjdGlvbiBmb3IgVlQ2MTEwICovCisKKyNkZWZpbmUgRUVSU1ZfQk9PVF9NQVNLICAgICAoKHU4KSAweDA2KQorI2RlZmluZSBFRVJTVl9CT09UX0lOVDE5ICAgICgodTgpIDB4MDApCisjZGVmaW5lIEVFUlNWX0JPT1RfSU5UMTggICAgKCh1OCkgMHgwMikKKyNkZWZpbmUgRUVSU1ZfQk9PVF9MT0NBTCAgICAoKHU4KSAweDA0KQorI2RlZmluZSBFRVJTVl9CT09UX0JFViAgICAgICgodTgpIDB4MDYpCisKKworLyoKKyAqCUJpdHMgaW4gQlBDTUQKKyAqLworCisjZGVmaW5lIEJQQ01EX0JQRE5FICAgICAgICAgMHg4MAorI2RlZmluZSBCUENNRF9FQlBXUiAgICAgICAgIDB4MDIKKyNkZWZpbmUgQlBDTURfRUJQUkQgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBFRUNTUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgRUVDU1JfRU1CUCAgICAgICAgICAweDQwCS8qIGVlcHJvbSBlbWJlZGVkIHByb2dyYW1taW5nICovCisjZGVmaW5lIEVFQ1NSX1JFTE9BRCAgICAgICAgMHgyMAkvKiBlZXByb20gY29udGVudCByZWxvYWQgKi8KKyNkZWZpbmUgRUVDU1JfRFBNICAgICAgICAgICAweDEwCS8qIGVlcHJvbSBkaXJlY3QgcHJvZ3JhbW1pbmcgKi8KKyNkZWZpbmUgRUVDU1JfRUNTICAgICAgICAgICAweDA4CS8qIGVlcHJvbSBDUyBwaW4gKi8KKyNkZWZpbmUgRUVDU1JfRUNLICAgICAgICAgICAweDA0CS8qIGVlcHJvbSBDSyBwaW4gKi8KKyNkZWZpbmUgRUVDU1JfRURJICAgICAgICAgICAweDAyCS8qIGVlcHJvbSBESSBwaW4gKi8KKyNkZWZpbmUgRUVDU1JfRURPICAgICAgICAgICAweDAxCS8qIGVlcHJvbSBETyBwaW4gKi8KKworLyoKKyAqCUJpdHMgaW4gdGhlIEVNQkNNRCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgRU1CQ01EX0VET05FICAgICAgICAweDgwCisjZGVmaW5lIEVNQkNNRF9FV0RJUyAgICAgICAgMHgwOAorI2RlZmluZSBFTUJDTURfRVdFTiAgICAgICAgIDB4MDQKKyNkZWZpbmUgRU1CQ01EX0VXUiAgICAgICAgICAweDAyCisjZGVmaW5lIEVNQkNNRF9FUkQgICAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiBURVNUQ0ZHIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBURVNUQ0ZHX0hCRElTICAgICAgIDB4ODAKKworLyoKKyAqCUJpdHMgaW4gQ0hJUEdDUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0hJUEdDUl9GQ0dNSUkgICAgICAweDgwCisjZGVmaW5lIENISVBHQ1JfRkNGRFggICAgICAgMHg0MAorI2RlZmluZSBDSElQR0NSX0ZDUkVTViAgICAgIDB4MjAKKyNkZWZpbmUgQ0hJUEdDUl9GQ01PREUgICAgICAweDEwCisjZGVmaW5lIENISVBHQ1JfTFBTT1BUICAgICAgMHgwOAorI2RlZmluZSBDSElQR0NSX1RNMVVTICAgICAgIDB4MDQKKyNkZWZpbmUgQ0hJUEdDUl9UTTBVUyAgICAgICAweDAyCisjZGVmaW5lIENISVBHQ1JfUEhZSU5URU4gICAgMHgwMQorCisvKgorICoJQml0cyBpbiBXT0xDUjAKKyAqLworCisjZGVmaW5lIFdPTENSX01TV09MRU43ICAgICAgMHgwMDgwCS8qIGVuYWJsZSBwYXR0ZXJuIG1hdGNoIGZpbHRlcmluZyAqLworI2RlZmluZSBXT0xDUl9NU1dPTEVONiAgICAgIDB4MDA0MAorI2RlZmluZSBXT0xDUl9NU1dPTEVONSAgICAgIDB4MDAyMAorI2RlZmluZSBXT0xDUl9NU1dPTEVONCAgICAgIDB4MDAxMAorI2RlZmluZSBXT0xDUl9NU1dPTEVOMyAgICAgIDB4MDAwOAorI2RlZmluZSBXT0xDUl9NU1dPTEVOMiAgICAgIDB4MDAwNAorI2RlZmluZSBXT0xDUl9NU1dPTEVOMSAgICAgIDB4MDAwMgorI2RlZmluZSBXT0xDUl9NU1dPTEVOMCAgICAgIDB4MDAwMQorI2RlZmluZSBXT0xDUl9BUlBfRU4gICAgICAgIDB4MDAwMQorCisvKgorICoJQml0cyBpbiBXT0xDUjEKKyAqLworCisjZGVmaW5lIFdPTENSX0xJTktPRkZfRU4gICAgICAweDA4MDAJLyogbGluayBvZmYgZGV0ZWN0ZWQgZW5hYmxlICovCisjZGVmaW5lIFdPTENSX0xJTktPTl9FTiAgICAgICAweDA0MDAJLyogbGluayBvbiBkZXRlY3RlZCBlbmFibGUgKi8KKyNkZWZpbmUgV09MQ1JfTUFHSUNfRU4gICAgICAgIDB4MDIwMAkvKiBtYWdpYyBwYWNrZXQgZmlsdGVyIGVuYWJsZSAqLworI2RlZmluZSBXT0xDUl9VTklDQVNUX0VOICAgICAgMHgwMTAwCS8qIHVuaWNhc3QgZmlsdGVyIGVuYWJsZSAqLworCisKKy8qCisgKglCaXRzIGluIFBXQ0ZHCisgKi8KKworI2RlZmluZSBQV0NGR19QSFlQV09QVCAgICAgICAgICAweDgwCS8qIGludGVybmFsIE1JSSBJL0YgdGltaW5nICovCisjZGVmaW5lIFBXQ0ZHX1BDSVNUSUNLICAgICAgICAgIDB4NDAJLyogUENJIHN0aWNreSBSL1cgZW5hYmxlICovCisjZGVmaW5lIFBXQ0ZHX1dPTFRZUEUgICAgICAgICAgIDB4MjAJLyogcHVsc2UoMSkgb3IgYnV0dG9uICgwKSAqLworI2RlZmluZSBQV0NGR19MRUdDWV9XT0wgICAgICAgICAweDEwCisjZGVmaW5lIFBXQ0ZHX1BNQ1NSX1BNRV9TUiAgICAgIDB4MDgKKyNkZWZpbmUgUFdDRkdfUE1DU1JfUE1FX0VOICAgICAgMHgwNAkvKiBjb250cm9sIGJ5IFBDSVNUSUNLICovCisjZGVmaW5lIFBXQ0ZHX0xFR0FDWV9XT0xTUiAgICAgIDB4MDIJLyogTGVnYWN5IFdPTF9TUiBzaGFkb3cgKi8KKyNkZWZpbmUgUFdDRkdfTEVHQUNZX1dPTEVOICAgICAgMHgwMQkvKiBMZWdhY3kgV09MX0VOIHNoYWRvdyAqLworCisvKgorICoJQml0cyBpbiBXT0xDRkcKKyAqLworCisjZGVmaW5lIFdPTENGR19QTUVPVlIgICAgICAgICAgIDB4ODAJLyogZm9yIGxlZ2FjeSB1c2UsIGZvcmNlIFBNRUVOIGFsd2F5cyAqLworI2RlZmluZSBXT0xDRkdfU0FNICAgICAgICAgICAgICAweDIwCS8qIGFjY2VwdCBtdWx0aWNhc3QgY2FzZSByZXNldCwgZGVmYXVsdD0wICovCisjZGVmaW5lIFdPTENGR19TQUIgICAgICAgICAgICAgIDB4MTAJLyogYWNjZXB0IGJyb2FkY2FzdCBjYXNlIHJlc2V0LCBkZWZhdWx0PTAgKi8KKyNkZWZpbmUgV09MQ0ZHX1NNSUlBQ0MgICAgICAgICAgMHgwOAkvKiA/PyAqLworI2RlZmluZSBXT0xDRkdfU0dFTldIICAgICAgICAgICAweDAyCisjZGVmaW5lIFdPTENGR19QSFlJTlRFTiAgICAgICAgIDB4MDEJLyogMDpQSFlJTlQgdHJpZ2dlciBlbmFibGUsIDE6dXNlIGludGVybmFsIE1JSQorCQkJCQkgIHRvIHJlcG9ydCBzdGF0dXMgY2hhbmdlICovCisvKgorICoJQml0cyBpbiBXT0xTUjEKKyAqLworCisjZGVmaW5lIFdPTFNSX0xJTktPRkZfSU5UICAgICAgMHgwODAwCisjZGVmaW5lIFdPTFNSX0xJTktPTl9JTlQgICAgICAgMHgwNDAwCisjZGVmaW5lIFdPTFNSX01BR0lDX0lOVCAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdPTFNSX1VOSUNBU1RfSU5UICAgICAgMHgwMTAwCisKKy8qCisgKglFdGhlcm5ldCBhZGRyZXNzIGZpbHRlciB0eXBlCisgKi8KKworI2RlZmluZSBQS1RfVFlQRV9OT05FICAgICAgICAgICAgICAgMHgwMDAwCS8qIFR1cm4gb2ZmIHJlY2VpdmVyICovCisjZGVmaW5lIFBLVF9UWVBFX0RJUkVDVEVEICAgICAgICAgICAweDAwMDEJLyogb2JzZWxldGUsIGRpcmVjdGVkIGFkZHJlc3MgaXMgYWx3YXlzIGFjY2VwdGVkICovCisjZGVmaW5lIFBLVF9UWVBFX01VTFRJQ0FTVCAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgUEtUX1RZUEVfQUxMX01VTFRJQ0FTVCAgICAgIDB4MDAwNAorI2RlZmluZSBQS1RfVFlQRV9CUk9BRENBU1QgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFBLVF9UWVBFX1BST01JU0NVT1VTICAgICAgICAweDAwMjAKKyNkZWZpbmUgUEtUX1RZUEVfTE9ORyAgICAgICAgICAgICAgIDB4MjAwMAkvKiBOT1RFLi4uLiB0aGUgZGVmaW5pdGlvbiBvZiBMT05HIGlzID4yMDQ4IGJ5dGVzIGluIG91ciBjaGlwICovCisjZGVmaW5lIFBLVF9UWVBFX1JVTlQgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgUEtUX1RZUEVfRVJST1IgICAgICAgICAgICAgIDB4ODAwMAkvKiBBY2NlcHQgZXJyb3IgcGFja2V0cywgZS5nLiBDUkMgZXJyb3IgKi8KKworLyoKKyAqCUxvb3BiYWNrIG1vZGUKKyAqLworCisjZGVmaW5lIE1BQ19MQl9OT05FICAgICAgICAgMHgwMAorI2RlZmluZSBNQUNfTEJfSU5URVJOQUwgICAgIDB4MDEKKyNkZWZpbmUgTUFDX0xCX0VYVEVSTkFMICAgICAweDAyCisKKy8qCisgKglFbmFibGVkIG1hc2sgdmFsdWUgb2YgaXJxCisgKi8KKworI2lmIGRlZmluZWQoX1NJTSkKKyNkZWZpbmUgSU1SX01BU0tfVkFMVUUgICAgICAweDAwMzNGRjBGVUwJLyogaW5pdGlhbCB2YWx1ZSBvZiBJTVIKKwkJCQkJCSAgIHNldCBJTVIwIHRvIDB4MEYgYWNjb3JkaW5nIHRvIHNwZWMgKi8KKworI2Vsc2UKKyNkZWZpbmUgSU1SX01BU0tfVkFMVUUgICAgICAweDAwMTNGQjBGVUwJLyogaW5pdGlhbCB2YWx1ZSBvZiBJTVIKKwkJCQkJCSAgIGlnbm9yZSBNSUJGSSxSQUNFSSB0bworCQkJCQkJICAgcmVkdWNlIGludHIuIGZyZXF1ZW5jeQorCQkJCQkJICAgTk9URS4uLi4gZG8gbm90IGVuYWJsZSBOb0J1ZiBpbnQgbWFzayBhdCBkcml2ZXIgZHJpdmVyCisJCQkJCQkgICAgICB3aGVuICgxKSBOb0J1ZiAtPiBSeFRocmVzaG9sZCA9IFNGCisJCQkJCQkJICAgKDIpIE9LICAgIC0+IFJ4VGhyZXNob2xkID0gb3JpZ2luYWwgdmFsdWUKKwkJCQkJCSAqLworI2VuZGlmCisKKy8qCisgKglSZXZpc2lvbiBpZAorICovCisKKyNkZWZpbmUgUkVWX0lEX1ZUMzExOV9BMAkweDAwCisjZGVmaW5lIFJFVl9JRF9WVDMxMTlfQTEJMHgwMQorI2RlZmluZSBSRVZfSURfVlQzMjE2X0EwCTB4MTAKKworLyoKKyAqCU1heCB0aW1lIG91dCBkZWxheSB0aW1lCisgKi8KKworI2RlZmluZSBXX01BWF9USU1FT1VUICAgICAgIDB4MEZGRlUKKworCisvKgorICoJTUFDIHJlZ2lzdGVycyBhcyBhIHN0cnVjdHVyZS4gQ2Fubm90IGJlIGRpcmVjdGx5IGFjY2Vzc2VkIHRoaXMKKyAqCXdheSBidXQgZ2VuZXJhdGVzIG9mZnNldHMgZm9yIHJlYWRsL3dyaXRlbCgpIGNhbGxzCisgKi8KKworc3RydWN0IG1hY19yZWdzIHsKKwl2b2xhdGlsZSB1OCBQQVJbNl07CQkvKiAweDAwICovCisJdm9sYXRpbGUgdTggUkNSOworCXZvbGF0aWxlIHU4IFRDUjsKKworCXZvbGF0aWxlIHUzMiBDUjBTZXQ7CQkvKiAweDA4ICovCisJdm9sYXRpbGUgdTMyIENSMENscjsJCS8qIDB4MEMgKi8KKworCXZvbGF0aWxlIHU4IE1BUkNBTVs4XTsJCS8qIDB4MTAgKi8KKworCXZvbGF0aWxlIHUzMiBEZWNCYXNlSGk7CQkvKiAweDE4ICovCisJdm9sYXRpbGUgdTE2IERiZkJhc2VIaTsJCS8qIDB4MUMgKi8KKwl2b2xhdGlsZSB1MTYgcmVzZXJ2ZWRfMUU7CisKKwl2b2xhdGlsZSB1MTYgSVNSQ1RMOwkJLyogMHgyMCAqLworCXZvbGF0aWxlIHU4IFRYRVNSOworCXZvbGF0aWxlIHU4IFJYRVNSOworCisJdm9sYXRpbGUgdTMyIElTUjsJCS8qIDB4MjQgKi8KKwl2b2xhdGlsZSB1MzIgSU1SOworCisJdm9sYXRpbGUgdTMyIFREU3RhdHVzUG9ydDsJLyogMHgyQyAqLworCisJdm9sYXRpbGUgdTE2IFREQ1NSU2V0OwkJLyogMHgzMCAqLworCXZvbGF0aWxlIHU4IFJEQ1NSU2V0OworCXZvbGF0aWxlIHU4IHJlc2VydmVkXzMzOworCXZvbGF0aWxlIHUxNiBURENTUkNscjsKKwl2b2xhdGlsZSB1OCBSRENTUkNscjsKKwl2b2xhdGlsZSB1OCByZXNlcnZlZF8zNzsKKworCXZvbGF0aWxlIHUzMiBSREJhc2VMbzsJCS8qIDB4MzggKi8KKwl2b2xhdGlsZSB1MTYgUkRJZHg7CQkvKiAweDNDICovCisJdm9sYXRpbGUgdTE2IHJlc2VydmVkXzNFOworCisJdm9sYXRpbGUgdTMyIFREQmFzZUxvWzRdOwkvKiAweDQwICovCisKKwl2b2xhdGlsZSB1MTYgUkRDU2l6ZTsJCS8qIDB4NTAgKi8KKwl2b2xhdGlsZSB1MTYgVERDU2l6ZTsJCS8qIDB4NTIgKi8KKwl2b2xhdGlsZSB1MTYgVERJZHhbNF07CQkvKiAweDU0ICovCisJdm9sYXRpbGUgdTE2IHR4X3BhdXNlX3RpbWVyOwkvKiAweDVDICovCisJdm9sYXRpbGUgdTE2IFJCUkRVOwkJLyogMHg1RSAqLworCisJdm9sYXRpbGUgdTMyIEZJRk9UZXN0MDsJCS8qIDB4NjAgKi8KKwl2b2xhdGlsZSB1MzIgRklGT1Rlc3QxOwkJLyogMHg2NCAqLworCisJdm9sYXRpbGUgdTggQ0FNQUREUjsJCS8qIDB4NjggKi8KKwl2b2xhdGlsZSB1OCBDQU1DUjsJCS8qIDB4NjkgKi8KKwl2b2xhdGlsZSB1OCBHRlRFU1Q7CQkvKiAweDZBICovCisJdm9sYXRpbGUgdTggRlRTVENNRDsJCS8qIDB4NkIgKi8KKworCXZvbGF0aWxlIHU4IE1JSUNGRzsJCS8qIDB4NkMgKi8KKwl2b2xhdGlsZSB1OCBNSUlTUjsKKwl2b2xhdGlsZSB1OCBQSFlTUjA7CisJdm9sYXRpbGUgdTggUEhZU1IxOworCXZvbGF0aWxlIHU4IE1JSUNSOworCXZvbGF0aWxlIHU4IE1JSUFEUjsKKwl2b2xhdGlsZSB1MTYgTUlJREFUQTsKKworCXZvbGF0aWxlIHUxNiBTb2Z0VGltZXIwOwkvKiAweDc0ICovCisJdm9sYXRpbGUgdTE2IFNvZnRUaW1lcjE7CisKKwl2b2xhdGlsZSB1OCBDRkdBOwkJLyogMHg3OCAqLworCXZvbGF0aWxlIHU4IENGR0I7CisJdm9sYXRpbGUgdTggQ0ZHQzsKKwl2b2xhdGlsZSB1OCBDRkdEOworCisJdm9sYXRpbGUgdTE2IERDRkc7CQkvKiAweDdDICovCisJdm9sYXRpbGUgdTE2IE1DRkc7CisKKwl2b2xhdGlsZSB1OCBUQklTVDsJCS8qIDB4ODAgKi8KKwl2b2xhdGlsZSB1OCBSQklTVDsKKwl2b2xhdGlsZSB1OCBQTUNQT1JUOworCXZvbGF0aWxlIHU4IFNUSUNLSFc7CisKKwl2b2xhdGlsZSB1OCBNSUJDUjsJCS8qIDB4ODQgKi8KKwl2b2xhdGlsZSB1OCByZXNlcnZlZF84NTsKKwl2b2xhdGlsZSB1OCByZXZfaWQ7CisJdm9sYXRpbGUgdTggUE9SU1RTOworCisJdm9sYXRpbGUgdTMyIE1JQkRhdGE7CQkvKiAweDg4ICovCisKKwl2b2xhdGlsZSB1MTYgRUVXckRhdGE7CisKKwl2b2xhdGlsZSB1OCByZXNlcnZlZF84RTsKKwl2b2xhdGlsZSB1OCBCUE1EV3I7CisJdm9sYXRpbGUgdTggQlBDTUQ7CisJdm9sYXRpbGUgdTggQlBNRFJkOworCisJdm9sYXRpbGUgdTggRUVDSEtTVU07CQkvKiAweDkyICovCisJdm9sYXRpbGUgdTggRUVDU1I7CisKKwl2b2xhdGlsZSB1MTYgRUVSZERhdGE7CQkvKiAweDk0ICovCisJdm9sYXRpbGUgdTggRUFERFI7CisJdm9sYXRpbGUgdTggRU1CQ01EOworCisKKwl2b2xhdGlsZSB1OCBKTVBTUjA7CQkvKiAweDk4ICovCisJdm9sYXRpbGUgdTggSk1QU1IxOworCXZvbGF0aWxlIHU4IEpNUFNSMjsKKwl2b2xhdGlsZSB1OCBKTVBTUjM7CisJdm9sYXRpbGUgdTggQ0hJUEdTUjsJCS8qIDB4OUMgKi8KKwl2b2xhdGlsZSB1OCBURVNUQ0ZHOworCXZvbGF0aWxlIHU4IERFQlVHOworCXZvbGF0aWxlIHU4IENISVBHQ1I7CisKKwl2b2xhdGlsZSB1MTYgV09MQ1JTZXQ7CQkvKiAweEEwICovCisJdm9sYXRpbGUgdTggUFdDRkdTZXQ7CisJdm9sYXRpbGUgdTggV09MQ0ZHU2V0OworCisJdm9sYXRpbGUgdTE2IFdPTENSQ2xyOwkJLyogMHhBNCAqLworCXZvbGF0aWxlIHU4IFBXQ0ZHQ0xSOworCXZvbGF0aWxlIHU4IFdPTENGR0NscjsKKworCXZvbGF0aWxlIHUxNiBXT0xTUlNldDsJCS8qIDB4QTggKi8KKwl2b2xhdGlsZSB1MTYgcmVzZXJ2ZWRfQUE7CisKKwl2b2xhdGlsZSB1MTYgV09MU1JDbHI7CQkvKiAweEFDICovCisJdm9sYXRpbGUgdTE2IHJlc2VydmVkX0FFOworCisJdm9sYXRpbGUgdTE2IFBhdHRlcm5DUkNbOF07CS8qIDB4QjAgKi8KKwl2b2xhdGlsZSB1MzIgQnl0ZU1hc2tbNF1bNF07CS8qIDB4QzAgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworCitlbnVtIGh3X21pYiB7CisJSFdfTUlCX2lmUnhBbGxQa3RzID0gMCwKKwlIV19NSUJfaWZSeE9rUGt0cywKKwlIV19NSUJfaWZUeE9rUGt0cywKKwlIV19NSUJfaWZSeEVycm9yUGt0cywKKwlIV19NSUJfaWZSeFJ1bnRPa1BrdCwKKwlIV19NSUJfaWZSeFJ1bnRFcnJQa3QsCisJSFdfTUlCX2lmUng2NFBrdHMsCisJSFdfTUlCX2lmVHg2NFBrdHMsCisJSFdfTUlCX2lmUng2NVRvMTI3UGt0cywKKwlIV19NSUJfaWZUeDY1VG8xMjdQa3RzLAorCUhXX01JQl9pZlJ4MTI4VG8yNTVQa3RzLAorCUhXX01JQl9pZlR4MTI4VG8yNTVQa3RzLAorCUhXX01JQl9pZlJ4MjU2VG81MTFQa3RzLAorCUhXX01JQl9pZlR4MjU2VG81MTFQa3RzLAorCUhXX01JQl9pZlJ4NTEyVG8xMDIzUGt0cywKKwlIV19NSUJfaWZUeDUxMlRvMTAyM1BrdHMsCisJSFdfTUlCX2lmUngxMDI0VG8xNTE4UGt0cywKKwlIV19NSUJfaWZUeDEwMjRUbzE1MThQa3RzLAorCUhXX01JQl9pZlR4RXRoZXJDb2xsaXNpb25zLAorCUhXX01JQl9pZlJ4UGt0Q1JDRSwKKwlIV19NSUJfaWZSeEp1bWJvUGt0cywKKwlIV19NSUJfaWZUeEp1bWJvUGt0cywKKwlIV19NSUJfaWZSeE1hY0NvbnRyb2xGcmFtZXMsCisJSFdfTUlCX2lmVHhNYWNDb250cm9sRnJhbWVzLAorCUhXX01JQl9pZlJ4UGt0RkFFLAorCUhXX01JQl9pZlJ4TG9uZ09rUGt0LAorCUhXX01JQl9pZlJ4TG9uZ1BrdEVyclBrdCwKKwlIV19NSUJfaWZUWFNRRUVycm9ycywKKwlIV19NSUJfaWZSeE5vYnVmLAorCUhXX01JQl9pZlJ4U3ltYm9sRXJyb3JzLAorCUhXX01JQl9pZkluUmFuZ2VMZW5ndGhFcnJvcnMsCisJSFdfTUlCX2lmTGF0ZUNvbGxpc2lvbnMsCisJSFdfTUlCX1NJWkUKK307CisKK2VudW0gY2hpcF90eXBlIHsKKwlDSElQX1RZUEVfVlQ2MTEwID0gMSwKK307CisKK3N0cnVjdCB2ZWxvY2l0eV9pbmZvX3RibCB7CisJZW51bSBjaGlwX3R5cGUgY2hpcF9pZDsKKwljaGFyICpuYW1lOworCWludCBpb19zaXplOworCWludCB0eHF1ZXVlOworCXUzMiBmbGFnczsKK307CisKKyNkZWZpbmUgbWFjX2h3X21pYnNfaW5pdChyZWdzKSB7XAorCUJZVEVfUkVHX0JJVFNfT04oTUlCQ1JfTUlCRlJaLCYoKHJlZ3MpLT5NSUJDUikpO1wKKwlCWVRFX1JFR19CSVRTX09OKE1JQkNSX01JQkNMUiwmKChyZWdzKS0+TUlCQ1IpKTtcCisJZG8ge31cCisJCXdoaWxlIChCWVRFX1JFR19CSVRTX0lTX09OKE1JQkNSX01JQkNMUiwmKChyZWdzKS0+TUlCQ1IpKSk7XAorCUJZVEVfUkVHX0JJVFNfT0ZGKE1JQkNSX01JQkZSWiwmKChyZWdzKS0+TUlCQ1IpKTtcCit9CisKKyNkZWZpbmUgbWFjX3JlYWRfaXNyKHJlZ3MpICAJCXJlYWRsKCYoKHJlZ3MpLT5JU1IpKQorI2RlZmluZSBtYWNfd3JpdGVfaXNyKHJlZ3MsIHgpICAJd3JpdGVsKCh4KSwmKChyZWdzKS0+SVNSKSkKKyNkZWZpbmUgbWFjX2NsZWFyX2lzcihyZWdzKSAJCXdyaXRlbCgweGZmZmZmZmZmTCwmKChyZWdzKS0+SVNSKSkKKworI2RlZmluZSBtYWNfd3JpdGVfaW50X21hc2sobWFzaywgcmVncykgCXdyaXRlbCgobWFzayksJigocmVncyktPklNUikpOworI2RlZmluZSBtYWNfZGlzYWJsZV9pbnQocmVncykgICAgICAgCXdyaXRlbChDUjBfR0lOVE1TSzEsJigocmVncyktPkNSMENscikpCisjZGVmaW5lIG1hY19lbmFibGVfaW50KHJlZ3MpICAgIAl3cml0ZWwoQ1IwX0dJTlRNU0sxLCYoKHJlZ3MpLT5DUjBTZXQpKQorCisjZGVmaW5lIG1hY19od19taWJzX3JlYWQocmVncywgTUlCcykge1wKKwlpbnQgaTtcCisJQllURV9SRUdfQklUU19PTihNSUJDUl9NUFRSSU5JLCYoKHJlZ3MpLT5NSUJDUikpO1wKKwlmb3IgKGk9MDtpPEhXX01JQl9TSVpFO2krKykge1wKKwkJKE1JQnMpW2ldPXJlYWRsKCYoKHJlZ3MpLT5NSUJEYXRhKSk7XAorCX1cCit9CisKKyNkZWZpbmUgbWFjX3NldF9kbWFfbGVuZ3RoKHJlZ3MsIG4pIHtcCisJQllURV9SRUdfQklUU19TRVQoKG4pLDB4MDcsJigocmVncyktPkRDRkcpKTtcCit9CisKKyNkZWZpbmUgbWFjX3NldF9yeF90aHJlc2gocmVncywgbikge1wKKwlCWVRFX1JFR19CSVRTX1NFVCgobiksKE1DRkdfUkZUMHxNQ0ZHX1JGVDEpLCYoKHJlZ3MpLT5NQ0ZHKSk7XAorfQorCisjZGVmaW5lIG1hY19yeF9xdWV1ZV9ydW4ocmVncykge1wKKwl3cml0ZWIoVFJEQ1NSX1JVTiwgJigocmVncyktPlJEQ1NSU2V0KSk7XAorfQorCisjZGVmaW5lIG1hY19yeF9xdWV1ZV93YWtlKHJlZ3MpIHtcCisJd3JpdGViKFRSRENTUl9XQUssICYoKHJlZ3MpLT5SRENTUlNldCkpO1wKK30KKworI2RlZmluZSBtYWNfdHhfcXVldWVfcnVuKHJlZ3MsIG4pIHtcCisJd3JpdGV3KFRSRENTUl9SVU48PCgobikqNCksJigocmVncyktPlREQ1NSU2V0KSk7XAorfQorCisjZGVmaW5lIG1hY190eF9xdWV1ZV93YWtlKHJlZ3MsIG4pIHtcCisJd3JpdGV3KFRSRENTUl9XQUs8PChuKjQpLCYoKHJlZ3MpLT5URENTUlNldCkpO1wKK30KKworI2RlZmluZSBtYWNfZWVwcm9tX3JlbG9hZChyZWdzKSB7XAorCWludCBpPTA7XAorCUJZVEVfUkVHX0JJVFNfT04oRUVDU1JfUkVMT0FELCYoKHJlZ3MpLT5FRUNTUikpO1wKKwlkbyB7XAorCQl1ZGVsYXkoMTApO1wKKwkJaWYgKGkrKz4weDEwMDApIHtcCisJCQlicmVhaztcCisJCX1cCisJfXdoaWxlIChCWVRFX1JFR19CSVRTX0lTX09OKEVFQ1NSX1JFTE9BRCwmKChyZWdzKS0+RUVDU1IpKSk7XAorfQorCitlbnVtIHZlbG9jaXR5X2NhbV90eXBlIHsKKwlWRUxPQ0lUWV9WTEFOX0lEX0NBTSA9IDAsCisJVkVMT0NJVFlfTVVMVElDQVNUX0NBTQorfTsKKworLyoqCisgKgltYWNfZ2V0X2NhbV9tYXNrCS0JUmVhZCBhIENBTSBtYXNrCisgKglAcmVnczogcmVnaXN0ZXIgYmxvY2sgZm9yIHRoaXMgdmVsb2NpdHkKKyAqCUBtYXNrOiBidWZmZXIgdG8gc3RvcmUgbWFzaworICoJQGNhbV90eXBlOiBDQU0gdG8gZmV0Y2gKKyAqCisgKglGZXRjaCB0aGUgbWFzayBiaXRzIG9mIHRoZSBzZWxlY3RlZCBDQU0gYW5kIHN0b3JlIHRoZW0gaW50byB0aGUKKyAqCXByb3ZpZGVkIG1hc2sgYnVmZmVyLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWNfZ2V0X2NhbV9tYXNrKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncywgdTggKiBtYXNrLCBlbnVtIHZlbG9jaXR5X2NhbV90eXBlIGNhbV90eXBlKQoreworCWludCBpOworCS8qIFNlbGVjdCBDQU0gbWFzayAqLworCUJZVEVfUkVHX0JJVFNfU0VUKENBTUNSX1BTX0NBTV9NQVNLLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsICZyZWdzLT5DQU1DUik7CisKKwlpZiAoY2FtX3R5cGUgPT0gVkVMT0NJVFlfVkxBTl9JRF9DQU0pCisJCXdyaXRlYihDQU1BRERSX1ZDQU1TTCwgJnJlZ3MtPkNBTUFERFIpOworCWVsc2UKKwkJd3JpdGViKDAsICZyZWdzLT5DQU1BRERSKTsKKworCS8qIHJlYWQgbWFzayAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCSptYXNrKysgPSByZWFkYigmKHJlZ3MtPk1BUkNBTVtpXSkpOworCisJLyogZGlzYWJsZSBDQU1FTiAqLworCXdyaXRlYigwLCAmcmVncy0+Q0FNQUREUik7CisKKwkvKiBTZWxlY3QgbWFyICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfTUFSLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsICZyZWdzLT5DQU1DUik7CisKK30KKworLyoqCisgKgltYWNfc2V0X2NhbV9tYXNrCS0JU2V0IGEgQ0FNIG1hc2sKKyAqCUByZWdzOiByZWdpc3RlciBibG9jayBmb3IgdGhpcyB2ZWxvY2l0eQorICoJQG1hc2s6IENBTSBtYXNrIHRvIGxvYWQKKyAqCUBjYW1fdHlwZTogQ0FNIHRvIHN0b3JlCisgKgorICoJU3RvcmUgYSBuZXcgbWFzayBpbnRvIGEgQ0FNCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIG1hY19zZXRfY2FtX21hc2soc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzLCB1OCAqIG1hc2ssIGVudW0gdmVsb2NpdHlfY2FtX3R5cGUgY2FtX3R5cGUpCit7CisJaW50IGk7CisJLyogU2VsZWN0IENBTSBtYXNrICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfQ0FNX01BU0ssIENBTUNSX1BTMSB8IENBTUNSX1BTMCwgJnJlZ3MtPkNBTUNSKTsKKworCWlmIChjYW1fdHlwZSA9PSBWRUxPQ0lUWV9WTEFOX0lEX0NBTSkKKwkJd3JpdGViKENBTUFERFJfQ0FNRU4gfCBDQU1BRERSX1ZDQU1TTCwgJnJlZ3MtPkNBTUFERFIpOworCWVsc2UKKwkJd3JpdGViKENBTUFERFJfQ0FNRU4sICZyZWdzLT5DQU1BRERSKTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJd3JpdGViKCptYXNrKyssICYocmVncy0+TUFSQ0FNW2ldKSk7CisJfQorCS8qIGRpc2FibGUgQ0FNRU4gKi8KKwl3cml0ZWIoMCwgJnJlZ3MtPkNBTUFERFIpOworCisJLyogU2VsZWN0IG1hciAqLworCUJZVEVfUkVHX0JJVFNfU0VUKENBTUNSX1BTX01BUiwgQ0FNQ1JfUFMxIHwgQ0FNQ1JfUFMwLCAmcmVncy0+Q0FNQ1IpOworfQorCisvKioKKyAqCW1hY19zZXRfY2FtCS0Jc2V0IENBTSBkYXRhCisgKglAcmVnczogcmVnaXN0ZXIgYmxvY2sgb2YgdGhpcyB2ZWxvY2l0eQorICoJQGlkeDogQ2FtIGluZGV4CisgKglAYWRkcjogMiBvciA2IGJ5dGVzIG9mIENBTSBkYXRhCisgKglAY2FtX3R5cGU6IENBTSB0byBsb2FkCisgKgorICoJTG9hZCBhbiBhZGRyZXNzIG9yIHZsYW4gdGFnIGludG8gYSBDQU0KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbWFjX3NldF9jYW0oc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzLCBpbnQgaWR4LCB1OCAqYWRkciwgZW51bSB2ZWxvY2l0eV9jYW1fdHlwZSBjYW1fdHlwZSkKK3sKKwlpbnQgaTsKKworCS8qIFNlbGVjdCBDQU0gbWFzayAqLworCUJZVEVfUkVHX0JJVFNfU0VUKENBTUNSX1BTX0NBTV9EQVRBLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsICZyZWdzLT5DQU1DUik7CisKKwlpZHggJj0gKDY0IC0gMSk7CisKKwlpZiAoY2FtX3R5cGUgPT0gVkVMT0NJVFlfVkxBTl9JRF9DQU0pCisJCXdyaXRlYihDQU1BRERSX0NBTUVOIHwgQ0FNQUREUl9WQ0FNU0wgfCBpZHgsICZyZWdzLT5DQU1BRERSKTsKKwllbHNlCisJCXdyaXRlYihDQU1BRERSX0NBTUVOIHwgaWR4LCAmcmVncy0+Q0FNQUREUik7CisKKwlpZiAoY2FtX3R5cGUgPT0gVkVMT0NJVFlfVkxBTl9JRF9DQU0pCisJCXdyaXRldygqKCh1MTYgKikgYWRkciksICZyZWdzLT5NQVJDQU1bMF0pOworCWVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQl3cml0ZWIoKmFkZHIrKywgJihyZWdzLT5NQVJDQU1baV0pKTsKKwkJfQorCX0KKwlCWVRFX1JFR19CSVRTX09OKENBTUNSX0NBTVdSLCAmcmVncy0+Q0FNQ1IpOworCisJdWRlbGF5KDEwKTsKKworCXdyaXRlYigwLCAmcmVncy0+Q0FNQUREUik7CisKKwkvKiBTZWxlY3QgbWFyICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfTUFSLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsICZyZWdzLT5DQU1DUik7Cit9CisKKy8qKgorICoJbWFjX2dldF9jYW0JLQlmZXRjaCBDQU0gZGF0YQorICoJQHJlZ3M6IHJlZ2lzdGVyIGJsb2NrIG9mIHRoaXMgdmVsb2NpdHkKKyAqCUBpZHg6IENhbSBpbmRleAorICoJQGFkZHI6IGJ1ZmZlciB0byBob2xkIHVwIHRvIDYgYnl0ZXMgb2YgQ0FNIGRhdGEKKyAqCUBjYW1fdHlwZTogQ0FNIHRvIGxvYWQKKyAqCisgKglMb2FkIGFuIGFkZHJlc3Mgb3IgdmxhbiB0YWcgZnJvbSBhIENBTSBpbnRvIHRoZSBidWZmZXIgcHJvdmlkZWQgYnkKKyAqCXRoZSBjYWxsZXIuIFZMQU4gdGFncyBhcmUgMiBieXRlcyB0aGUgYWRkcmVzcyBjYW0gZW50cmllcyBhcmUgNi4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbWFjX2dldF9jYW0oc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzLCBpbnQgaWR4LCB1OCAqYWRkciwgZW51bSB2ZWxvY2l0eV9jYW1fdHlwZSBjYW1fdHlwZSkKK3sKKwlpbnQgaTsKKworCS8qIFNlbGVjdCBDQU0gbWFzayAqLworCUJZVEVfUkVHX0JJVFNfU0VUKENBTUNSX1BTX0NBTV9EQVRBLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsICZyZWdzLT5DQU1DUik7CisKKwlpZHggJj0gKDY0IC0gMSk7CisKKwlpZiAoY2FtX3R5cGUgPT0gVkVMT0NJVFlfVkxBTl9JRF9DQU0pCisJCXdyaXRlYihDQU1BRERSX0NBTUVOIHwgQ0FNQUREUl9WQ0FNU0wgfCBpZHgsICZyZWdzLT5DQU1BRERSKTsKKwllbHNlCisJCXdyaXRlYihDQU1BRERSX0NBTUVOIHwgaWR4LCAmcmVncy0+Q0FNQUREUik7CisKKwlCWVRFX1JFR19CSVRTX09OKENBTUNSX0NBTVJELCAmcmVncy0+Q0FNQ1IpOworCisJdWRlbGF5KDEwKTsKKworCWlmIChjYW1fdHlwZSA9PSBWRUxPQ0lUWV9WTEFOX0lEX0NBTSkKKwkJKigodTE2ICopIGFkZHIpID0gcmVhZHcoJihyZWdzLT5NQVJDQU1bMF0pKTsKKwllbHNlCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyssIGFkZHIrKykKKwkJCSooKHU4ICopIGFkZHIpID0gcmVhZGIoJihyZWdzLT5NQVJDQU1baV0pKTsKKworCXdyaXRlYigwLCAmcmVncy0+Q0FNQUREUik7CisKKwkvKiBTZWxlY3QgbWFyICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfTUFSLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsICZyZWdzLT5DQU1DUik7Cit9CisKKy8qKgorICoJbWFjX3dvbF9yZXNldAktCXJlc2V0IFdPTCBhZnRlciBleGl0aW5nIGxvdyBwb3dlcgorICoJQHJlZ3M6IHJlZ2lzdGVyIGJsb2NrIG9mIHRoaXMgdmVsb2NpdHkKKyAqCisgKglDYWxsZWQgYWZ0ZXIgd2UgZHJvcCBvdXQgb2Ygd2FrZSBvbiBsYW4gbW9kZSBpbiBvcmRlciB0bworICoJcmVzZXQgdGhlIFdha2Ugb24gbGFuIGZlYXR1cmVzLiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmVzdG9yZQorICoJdGhlIHJlc3Qgb2YgdGhlIGxvZ2ljIGZyb20gdGhlIHJlc3VsdCBvZiBzbGVlcC93YWtldXAKKyAqLworCitpbmxpbmUgc3RhdGljIHZvaWQgbWFjX3dvbF9yZXNldChzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MpCit7CisKKwkvKiBUdXJuIG9mZiBTV1BUQUcgcmlnaHQgYWZ0ZXIgbGVhdmluZyBwb3dlciBtb2RlICovCisJQllURV9SRUdfQklUU19PRkYoU1RJQ0tIV19TV1BUQUcsICZyZWdzLT5TVElDS0hXKTsKKwkvKiBjbGVhciBzdGlja3kgYml0cyAqLworCUJZVEVfUkVHX0JJVFNfT0ZGKChTVElDS0hXX0RTMSB8IFNUSUNLSFdfRFMwKSwgJnJlZ3MtPlNUSUNLSFcpOworCisJQllURV9SRUdfQklUU19PRkYoQ0hJUEdDUl9GQ0dNSUksICZyZWdzLT5DSElQR0NSKTsKKwlCWVRFX1JFR19CSVRTX09GRihDSElQR0NSX0ZDTU9ERSwgJnJlZ3MtPkNISVBHQ1IpOworCS8qIGRpc2FibGUgZm9yY2UgUE1FLWVuYWJsZSAqLworCXdyaXRlYihXT0xDRkdfUE1FT1ZSLCAmcmVncy0+V09MQ0ZHQ2xyKTsKKwkvKiBkaXNhYmxlIHBvd2VyLWV2ZW50IGNvbmZpZyBiaXQgKi8KKwl3cml0ZXcoMHhGRkZGLCAmcmVncy0+V09MQ1JDbHIpOworCS8qIGNsZWFyIHBvd2VyIHN0YXR1cyAqLworCXdyaXRldygweEZGRkYsICZyZWdzLT5XT0xTUkNscik7Cit9CisKKworLyoKKyAqIEhlYWRlciBmb3IgV09MIGRlZmluaXRpb25zLiBVc2VkIHRvIGNvbXB1dGUgaGFzaGVzCisgKi8KKwordHlwZWRlZiB1OCBNQ0FNX0FERFJbRVRIX0FMRU5dOworCitzdHJ1Y3QgYXJwX3BhY2tldCB7CisJdTggZGVzdF9tYWNbRVRIX0FMRU5dOworCXU4IHNyY19tYWNbRVRIX0FMRU5dOworCXUxNiB0eXBlOworCXUxNiBhcl9ocmQ7CisJdTE2IGFyX3BybzsKKwl1OCBhcl9obG47CisJdTggYXJfcGxuOworCXUxNiBhcl9vcDsKKwl1OCBhcl9zaGFbRVRIX0FMRU5dOworCXU4IGFyX3NpcFs0XTsKKwl1OCBhcl90aGFbRVRIX0FMRU5dOworCXU4IGFyX3RpcFs0XTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IF9tYWdpY19wYWNrZXQgeworCXU4IGRlc3RfbWFjWzZdOworCXU4IHNyY19tYWNbNl07CisJdTE2IHR5cGU7CisJdTggTUFDWzE2XVs2XTsKKwl1OCBwYXNzd29yZFs2XTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworLyoKKyAqCVN0b3JlIGZvciBjaGlwIGNvbnRleHQgd2hlbiBzYXZpbmcgYW5kIHJlc3RvcmluZyBzdGF0dXMuIE5vdAorICoJYWxsIGZpZWxkcyBhcmUgc2F2ZWQvcmVzdG9yZWQgY3VycmVudGx5LgorICovCisKK3N0cnVjdCB2ZWxvY2l0eV9jb250ZXh0IHsKKwl1OCBtYWNfcmVnWzI1Nl07CisJTUNBTV9BRERSIGNhbV9hZGRyW01DQU1fU0laRV07CisJdTE2IHZjYW1bVkNBTV9TSVpFXTsKKwl1MzIgY2FtbWFza1syXTsKKwl1MzIgcGF0Y3JjWzJdOworCXUzMiBwYXR0ZXJuWzhdOworfTsKKworCisvKgorICoJTUlJIHJlZ2lzdGVycy4KKyAqLworCisKKy8qCisgKglSZWdpc3RlcnMgaW4gdGhlIE1JSSAob2Zmc2V0IHVuaXQgaXMgV09SRCkKKyAqLworCisjZGVmaW5lIE1JSV9SRUdfQk1DUiAgICAgICAgMHgwMAkvLyBwaHlzaWNhbCBhZGRyZXNzCisjZGVmaW5lIE1JSV9SRUdfQk1TUiAgICAgICAgMHgwMQkvLworI2RlZmluZSBNSUlfUkVHX1BIWUlEMSAgICAgIDB4MDIJLy8gT1VJCisjZGVmaW5lIE1JSV9SRUdfUEhZSUQyICAgICAgMHgwMwkvLyBPVUkgKyBNb2R1bGUgSUQgKyBSRVYgSUQKKyNkZWZpbmUgTUlJX1JFR19BTkFSICAgICAgICAweDA0CS8vCisjZGVmaW5lIE1JSV9SRUdfQU5MUEFSICAgICAgMHgwNQkvLworI2RlZmluZSBNSUlfUkVHX0cxMDAwQ1IgICAgIDB4MDkJLy8KKyNkZWZpbmUgTUlJX1JFR19HMTAwMFNSICAgICAweDBBCS8vCisjZGVmaW5lIE1JSV9SRUdfTU9EQ0ZHICAgICAgMHgxMAkvLworI2RlZmluZSBNSUlfUkVHX1RDU1IgICAgICAgIDB4MTYJLy8KKyNkZWZpbmUgTUlJX1JFR19QTEVEICAgICAgICAweDFCCS8vCisvLyBOUywgTVlTT04gb25seQorI2RlZmluZSBNSUlfUkVHX1BDUiAgICAgICAgIDB4MTcJLy8KKy8vIEVTSSBvbmx5CisjZGVmaW5lIE1JSV9SRUdfUENTUiAgICAgICAgMHgxNwkvLworI2RlZmluZSBNSUlfUkVHX0FVWENSICAgICAgIDB4MUMJLy8KKworLy8gTWFydmVsbCA4OEUxMDAwLzg4RTEwMDBTCisjZGVmaW5lIE1JSV9SRUdfUFNDUiAgICAgICAgMHgxMAkvLyBQSFkgc3BlY2lmaWMgY29udHJvbCByZWdpc3RlcgorCisvLworLy8gQml0cyBpbiB0aGUgQk1DUiByZWdpc3RlcgorLy8KKyNkZWZpbmUgQk1DUl9SRVNFVCAgICAgICAgICAweDgwMDAJLy8KKyNkZWZpbmUgQk1DUl9MQksgICAgICAgICAgICAweDQwMDAJLy8KKyNkZWZpbmUgQk1DUl9TUEVFRDEwMCAgICAgICAweDIwMDAJLy8KKyNkZWZpbmUgQk1DUl9BVVRPICAgICAgICAgICAweDEwMDAJLy8KKyNkZWZpbmUgQk1DUl9QRCAgICAgICAgICAgICAweDA4MDAJLy8KKyNkZWZpbmUgQk1DUl9JU08gICAgICAgICAgICAweDA0MDAJLy8KKyNkZWZpbmUgQk1DUl9SRUFVVE8gICAgICAgICAweDAyMDAJLy8KKyNkZWZpbmUgQk1DUl9GRFggICAgICAgICAgICAweDAxMDAJLy8KKyNkZWZpbmUgQk1DUl9TUEVFRDFHICAgICAgICAweDAwNDAJLy8KKy8vCisvLyBCaXRzIGluIHRoZSBCTVNSIHJlZ2lzdGVyCisvLworI2RlZmluZSBCTVNSX0FVVE9DTSAgICAgICAgIDB4MDAyMAkvLworI2RlZmluZSBCTVNSX0xOSyAgICAgICAgICAgIDB4MDAwNAkvLworCisvLworLy8gQml0cyBpbiB0aGUgQU5BUiByZWdpc3RlcgorLy8KKyNkZWZpbmUgQU5BUl9BU01ESVIgICAgICAgICAweDA4MDAJLy8gQXN5bW1ldHJpYyBQQVVTRSBzdXBwb3J0CisjZGVmaW5lIEFOQVJfUEFVU0UgICAgICAgICAgMHgwNDAwCS8vIFN5bW1ldHJpYyBQQVVTRSBTdXBwb3J0CisjZGVmaW5lIEFOQVJfVDQgICAgICAgICAgICAgMHgwMjAwCS8vCisjZGVmaW5lIEFOQVJfVFhGRCAgICAgICAgICAgMHgwMTAwCS8vCisjZGVmaW5lIEFOQVJfVFggICAgICAgICAgICAgMHgwMDgwCS8vCisjZGVmaW5lIEFOQVJfMTBGRCAgICAgICAgICAgMHgwMDQwCS8vCisjZGVmaW5lIEFOQVJfMTAgICAgICAgICAgICAgMHgwMDIwCS8vCisvLworLy8gQml0cyBpbiB0aGUgQU5MUEFSIHJlZ2lzdGVyCisvLworI2RlZmluZSBBTkxQQVJfQVNNRElSICAgICAgIDB4MDgwMAkvLyBBc3ltbWV0cmljIFBBVVNFIHN1cHBvcnQKKyNkZWZpbmUgQU5MUEFSX1BBVVNFICAgICAgICAweDA0MDAJLy8gU3ltbWV0cmljIFBBVVNFIFN1cHBvcnQKKyNkZWZpbmUgQU5MUEFSX1Q0ICAgICAgICAgICAweDAyMDAJLy8KKyNkZWZpbmUgQU5MUEFSX1RYRkQgICAgICAgICAweDAxMDAJLy8KKyNkZWZpbmUgQU5MUEFSX1RYICAgICAgICAgICAweDAwODAJLy8KKyNkZWZpbmUgQU5MUEFSXzEwRkQgICAgICAgICAweDAwNDAJLy8KKyNkZWZpbmUgQU5MUEFSXzEwICAgICAgICAgICAweDAwMjAJLy8KKworLy8KKy8vIEJpdHMgaW4gdGhlIEcxMDAwQ1IgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIEcxMDAwQ1JfMTAwMEZEICAgICAgMHgwMjAwCS8vIFBIWSBpcyAxMDAwLVQgRnVsbC1kdXBsZXggY2FwYWJsZQorI2RlZmluZSBHMTAwMENSXzEwMDAgICAgICAgIDB4MDEwMAkvLyBQSFkgaXMgMTAwMC1UIEhhbGYtZHVwbGV4IGNhcGFibGUKKworLy8KKy8vIEJpdHMgaW4gdGhlIEcxMDAwU1IgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIEcxMDAwU1JfMTAwMEZEICAgICAgMHgwODAwCS8vIExQIFBIWSBpcyAxMDAwLVQgRnVsbC1kdXBsZXggY2FwYWJsZQorI2RlZmluZSBHMTAwMFNSXzEwMDAgICAgICAgIDB4MDQwMAkvLyBMUCBQSFkgaXMgMTAwMC1UIEhhbGYtZHVwbGV4IGNhcGFibGUKKworI2RlZmluZSBUQ1NSX0VDSE9ESVMgICAgICAgIDB4MjAwMAkvLworI2RlZmluZSBBVVhDUl9NRFBQUyAgICAgICAgIDB4MDAwNAkvLworCisvLyBCaXRzIGluIHRoZSBQTEVEIHJlZ2lzdGVyCisjZGVmaW5lIFBMRURfTEFMQkUJCQkweDAwMDQJLy8KKworLy8gTWFydmVsbCA4OEUxMDAwLzg4RTEwMDBTIEJpdHMgaW4gdGhlIFBIWSBzcGVjaWZpYyBjb250cm9sIHJlZ2lzdGVyICgxMGgpCisjZGVmaW5lIFBTQ1JfQUNSU1RYICAgICAgICAgMHgwODAwCS8vIEFzc2VydCBDUlMgb24gVHJhbnNtaXQKKworI2RlZmluZSBQSFlJRF9DSUNBREFfQ1M4MjAxIDB4MDAwRkM0MTBVTAorI2RlZmluZSBQSFlJRF9WVDMyMTZfMzJCSVQgIDB4MDAwRkM2MTBVTAorI2RlZmluZSBQSFlJRF9WVDMyMTZfNjRCSVQgIDB4MDAwRkM2MDBVTAorI2RlZmluZSBQSFlJRF9NQVJWRUxMXzEwMDAgIDB4MDE0MTBDNTBVTAorI2RlZmluZSBQSFlJRF9NQVJWRUxMXzEwMDBTIDB4MDE0MTBDNDBVTAorCisjZGVmaW5lIFBIWUlEX1JFVl9JRF9NQVNLICAgMHgwMDAwMDAwRlVMCisKKyNkZWZpbmUgUEhZSURfR0VUX1BIWV9SRVZfSUQoaSkgICAgICgoaSkgJiBQSFlJRF9SRVZfSURfTUFTSykKKyNkZWZpbmUgUEhZSURfR0VUX1BIWV9JRChpKSAgICAgICAgICgoaSkgJiB+UEhZSURfUkVWX0lEX01BU0spCisKKyNkZWZpbmUgTUlJX1JFR19CSVRTX09OKHgsaSxwKSBkbyB7XAorICAgIHUxNiB3O1wKKyAgICB2ZWxvY2l0eV9taWlfcmVhZCgocCksKGkpLCYodykpO1wKKyAgICAodyl8PSh4KTtcCisgICAgdmVsb2NpdHlfbWlpX3dyaXRlKChwKSwoaSksKHcpKTtcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1JSV9SRUdfQklUU19PRkYoeCxpLHApIGRvIHtcCisgICAgdTE2IHc7XAorICAgIHZlbG9jaXR5X21paV9yZWFkKChwKSwoaSksJih3KSk7XAorICAgICh3KSY9KH4oeCkpO1wKKyAgICB2ZWxvY2l0eV9taWlfd3JpdGUoKHApLChpKSwodykpO1wKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTUlJX1JFR19CSVRTX0lTX09OKHgsaSxwKSAoe1wKKyAgICB1MTYgdztcCisgICAgdmVsb2NpdHlfbWlpX3JlYWQoKHApLChpKSwmKHcpKTtcCisgICAgKChpbnQpICgodykgJiAoeCkpKTt9KQorCisjZGVmaW5lIE1JSV9HRVRfUEhZX0lEKHApICh7XAorICAgIHUzMiBpZDtcCisgICAgdmVsb2NpdHlfbWlpX3JlYWQoKHApLE1JSV9SRUdfUEhZSUQyLCh1MTYgKikgJmlkKTtcCisgICAgdmVsb2NpdHlfbWlpX3JlYWQoKHApLE1JSV9SRUdfUEhZSUQxLCgodTE2ICopICZpZCkrMSk7XAorICAgIChpZCk7fSkKKworLyoKKyAqIElubGluZSBkZWJ1ZyByb3V0aW5lCisgKi8KKworCitlbnVtIHZlbG9jaXR5X21zZ19sZXZlbCB7CisJTVNHX0xFVkVMX0VSUiA9IDAsCS8vRXJyb3JzIHRoYXQgd2lsbCBjYXVzZSBhYm5vcm1hbCBvcGVyYXRpb24uCisJTVNHX0xFVkVMX05PVElDRSA9IDEsCS8vU29tZSBlcnJvcnMgbmVlZCB1c2VycyB0byBiZSBub3RpZmllZC4KKwlNU0dfTEVWRUxfSU5GTyA9IDIsCS8vTm9ybWFsIG1lc3NhZ2UuCisJTVNHX0xFVkVMX1ZFUkJPU0UgPSAzLAkvL1dpbGwgcmVwb3J0IGFsbCB0cml2YWwgZXJyb3JzLgorCU1TR19MRVZFTF9ERUJVRyA9IDQJLy9Pbmx5IGZvciBkZWJ1ZyBwdXJwb3NlLgorfTsKKworI2lmZGVmIFZFTE9DSVRZX0RFQlVHCisjZGVmaW5lIEFTU0VSVCh4KSB7IFwKKwlpZiAoISh4KSkgeyBcCisJCXByaW50ayhLRVJOX0VSUiAiYXNzZXJ0aW9uICVzIGZhaWxlZDogZmlsZSAlcyBsaW5lICVkXG4iLCAjeCxcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fKTtcCisJCUJVRygpOyBcCisJfVwKK30KKyNkZWZpbmUgVkVMT0NJVFlfREJHKHAsYXJncy4uLikgcHJpbnRrKHAsICMjYXJncykKKyNlbHNlCisjZGVmaW5lIEFTU0VSVCh4KQorI2RlZmluZSBWRUxPQ0lUWV9EQkcoeCkKKyNlbmRpZgorCisjZGVmaW5lIFZFTE9DSVRZX1BSVChsLCBwLCBhcmdzLi4uKSBkbyB7aWYgKGw8PW1zZ2xldmVsKSBwcmludGsoIHAgLCMjYXJncyk7fSB3aGlsZSAoMCkKKworI2RlZmluZSBWRUxPQ0lUWV9QUlRfQ0FNTUFTSyhwLHQpIHtcCisJaW50IGk7XAorCWlmICgodCk9PVZFTE9DSVRZX01VTFRJQ0FTVF9DQU0pIHtcCisgICAgICAgIAlmb3IgKGk9MDtpPChNQ0FNX1NJWkUvOCk7aSsrKVwKKwkJCXByaW50aygiJTAyWCIsKHApLT5tQ0FNbWFza1tpXSk7XAorCX1cCisJZWxzZSB7XAorCQlmb3IgKGk9MDtpPChWQ0FNX1NJWkUvOCk7aSsrKVwKKwkJCXByaW50aygiJTAyWCIsKHApLT52Q0FNbWFza1tpXSk7XAorCX1cCisJcHJpbnRrKCJcbiIpO1wKK30KKworCisKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1dPTF9NQUdJQyAgICAgICAgICAgICAweDAwMDAwMDAwVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1dPTF9QSFkgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1dPTF9BUlAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1dPTF9VQ0FTVCAgICAgICAgICAgICAweDAwMDAwMDA0VUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1dPTF9CQ0FTVCAgICAgICAgICAgICAweDAwMDAwMDEwVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1dPTF9NQ0FTVCAgICAgICAgICAgICAweDAwMDAwMDIwVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1dPTF9NQUdJQ19TRUMgICAgICAgICAweDAwMDAwMDQwVUwKKworLyoKKyAqCUZsYWdzIGZvciBvcHRpb25zCisgKi8KKworI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfVEFHR0lORyAgICAgICAgIDB4MDAwMDAwMDFVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfVFhfQ1NVTSAgICAgICAgIDB4MDAwMDAwMDJVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfUlhfQ1NVTSAgICAgICAgIDB4MDAwMDAwMDRVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfSVBfQUxJR04gICAgICAgIDB4MDAwMDAwMDhVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfVkFMX1BLVF9MRU4gICAgIDB4MDAwMDAwMTBVTAorCisjZGVmaW5lICAgICBWRUxPQ0lUWV9GTEFHU19GTE9XX0NUUkwgICAgICAgMHgwMTAwMDAwMFVMCisKKy8qCisgKglGbGFncyBmb3IgZHJpdmVyIHN0YXR1cworICovCisKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZMQUdTX09QRU5FRCAgICAgICAgICAweDAwMDEwMDAwVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZMQUdTX1ZNTlNfQ09OTkVDVEVEICAweDAwMDIwMDAwVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZMQUdTX1ZNTlNfQ09NTUlUVEVEICAweDAwMDQwMDAwVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZMQUdTX1dPTF9FTkFCTEVEICAgICAweDAwMDgwMDAwVUwKKworLyoKKyAqCUZsYWdzIGZvciBNSUkgc3RhdHVzCisgKi8KKworI2RlZmluZSAgICAgVkVMT0NJVFlfTElOS19GQUlMICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfU1BFRURfMTAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfU1BFRURfMTAwICAgICAgICAgICAgIDB4MDAwMDAwMDRVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfU1BFRURfMTAwMCAgICAgICAgICAgIDB4MDAwMDAwMDhVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRFVQTEVYX0ZVTEwgICAgICAgICAgIDB4MDAwMDAwMTBVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfQVVUT05FR19FTkFCTEUgICAgICAgIDB4MDAwMDAwMjBVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRk9SQ0VEX0JZX0VFUFJPTSAgICAgIDB4MDAwMDAwNDBVTAorCisvKgorICoJRm9yIHZlbG9jaXR5X3NldF9tZWRpYV9kdXBsZXgKKyAqLworCisjZGVmaW5lICAgICBWRUxPQ0lUWV9MSU5LX0NIQU5HRSAgICAgICAgICAgMHgwMDAwMDAwMVVMCisKK2VudW0gc3BlZWRfb3B0IHsKKwlTUERfRFBYX0FVVE8gPSAwLAorCVNQRF9EUFhfMTAwX0hBTEYgPSAxLAorCVNQRF9EUFhfMTAwX0ZVTEwgPSAyLAorCVNQRF9EUFhfMTBfSEFMRiA9IDMsCisJU1BEX0RQWF8xMF9GVUxMID0gNAorfTsKKworZW51bSB2ZWxvY2l0eV9pbml0X3R5cGUgeworCVZFTE9DSVRZX0lOSVRfQ09MRCA9IDAsCisJVkVMT0NJVFlfSU5JVF9SRVNFVCwKKwlWRUxPQ0lUWV9JTklUX1dPTAorfTsKKworZW51bSB2ZWxvY2l0eV9mbG93X2NudGxfdHlwZSB7CisJRkxPV19DTlRMX0RFRkFVTFQgPSAxLAorCUZMT1dfQ05UTF9UWCwKKwlGTE9XX0NOVExfUlgsCisJRkxPV19DTlRMX1RYX1JYLAorCUZMT1dfQ05UTF9ESVNBQkxFLAorfTsKKworc3RydWN0IHZlbG9jaXR5X29wdCB7CisJaW50IG51bXJ4OwkJCS8qIE51bWJlciBvZiBSWCBkZXNjcmlwdG9ycyAqLworCWludCBudW10eDsJCQkvKiBOdW1iZXIgb2YgVFggZGVzY3JpcHRvcnMgKi8KKwllbnVtIHNwZWVkX29wdCBzcGRfZHB4OwkJLyogTWVkaWEgbGluayBtb2RlICovCisJaW50IHZpZDsJCQkvKiB2bGFuIGlkICovCisJaW50IERNQV9sZW5ndGg7CQkJLyogRE1BIGxlbmd0aCAqLworCWludCByeF90aHJlc2g7CQkJLyogUlhfVEhSRVNIICovCisJaW50IGZsb3dfY250bDsKKwlpbnQgd29sX29wdHM7CQkJLyogV2FrZSBvbiBsYW4gb3B0aW9ucyAqLworCWludCB0ZF9pbnRfY291bnQ7CisJaW50IGludF93b3JrczsKKwlpbnQgcnhfYmFuZHdpZHRoX2hpOworCWludCByeF9iYW5kd2lkdGhfbG87CisJaW50IHJ4X2JhbmR3aWR0aF9lbjsKKwl1MzIgZmxhZ3M7Cit9OworCitzdHJ1Y3QgdmVsb2NpdHlfaW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCWRtYV9hZGRyX3QgcmRfcG9vbF9kbWE7CisJZG1hX2FkZHJfdCB0ZF9wb29sX2RtYVtUWF9RVUVVRV9OT107CisKKwlkbWFfYWRkcl90IHR4X2J1ZnNfZG1hOworCXU4ICp0eF9idWZzOworCisJdTggaXBfYWRkcls0XTsKKwllbnVtIGNoaXBfdHlwZSBjaGlwX2lkOworCisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiBtYWNfcmVnczsKKwl1bnNpZ25lZCBsb25nIG1lbWFkZHI7CisJdW5zaWduZWQgbG9uZyBpb2FkZHI7CisJdTMyIGlvX3NpemU7CisKKwl1OCByZXZfaWQ7CisKKyNkZWZpbmUgQVZBSUxfVEQocCxxKSAgICgocCktPm9wdGlvbnMubnVtdHgtKChwKS0+dGRfdXNlZFsocSldKSkKKworCWludCBudW1fdHhxOworCisJdm9sYXRpbGUgaW50IHRkX3VzZWRbVFhfUVVFVUVfTk9dOworCWludCB0ZF9jdXJyW1RYX1FVRVVFX05PXTsKKwlpbnQgdGRfdGFpbFtUWF9RVUVVRV9OT107CisJc3RydWN0IHR4X2Rlc2MgKnRkX3JpbmdzW1RYX1FVRVVFX05PXTsKKwlzdHJ1Y3QgdmVsb2NpdHlfdGRfaW5mbyAqdGRfaW5mb3NbVFhfUVVFVUVfTk9dOworCisJaW50IHJkX2N1cnI7CisJaW50IHJkX2RpcnR5OworCXUzMiByZF9maWxsZWQ7CisJc3RydWN0IHJ4X2Rlc2MgKnJkX3Jpbmc7CisJc3RydWN0IHZlbG9jaXR5X3JkX2luZm8gKnJkX2luZm87CS8qIEl0J3MgYW4gYXJyYXkgKi8KKworI2RlZmluZSBHRVRfUkRfQllfSURYKHZwdHIsIGlkeCkgICAodnB0ci0+cmRfcmluZ1tpZHhdKQorCXUzMiBtaWJfY291bnRlcltNQVhfSFdfTUlCX0NPVU5URVJdOworCXN0cnVjdCB2ZWxvY2l0eV9vcHQgb3B0aW9uczsKKworCXUzMiBpbnRfbWFzazsKKworCXUzMiBmbGFnczsKKworCWludCByeF9idWZfc3o7CisJdTMyIG1paV9zdGF0dXM7CisJdTMyIHBoeV9pZDsKKwlpbnQgbXVsdGljYXN0X2xpbWl0OworCisJdTggdkNBTW1hc2tbKFZDQU1fU0laRSAvIDgpXTsKKwl1OCBtQ0FNbWFza1soTUNBTV9TSVpFIC8gOCldOworCisJc3BpbmxvY2tfdCBsb2NrOworCisJaW50IHdvbF9vcHRzOworCXU4IHdvbF9wYXNzd2RbNl07CisKKwlzdHJ1Y3QgdmVsb2NpdHlfY29udGV4dCBjb250ZXh0OworCisJdTMyIHRpY2tzOworCXUzMiByeF9ieXRlczsKKworfTsKKworLyoqCisgKgl2ZWxvY2l0eV9nZXRfaXAJCS0JZmluZCBhbiBJUCBhZGRyZXNzIGZvciB0aGUgZGV2aWNlCisgKglAdnB0cjogVmVsb2NpdHkgdG8gcXVlcnkKKyAqCisgKglEaWcgb3V0IGFuIElQIGFkZHJlc3MgZm9yIHRoaXMgaW50ZXJmYWNlIHNvIHRoYXQgd2UgY2FuCisgKgljb25maWd1cmUgd2FrZXVwIHdpdGggV09MIGZvciBBUlAuIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBJUAorICoJYWRkcmVzc2VzIG9uIHRoaXMgY2hhaW4gdGhlbiB3ZSB1c2UgdGhlIGZpcnN0IC0gbXVsdGktSVAgV09MIGlzIG5vdAorICoJc3VwcG9ydGVkLgorICoKKyAqCUNIRUNLIE1FOiBsb2NraW5nCisgKi8KKworaW5saW5lIHN0YXRpYyBpbnQgdmVsb2NpdHlfZ2V0X2lwKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IChzdHJ1Y3QgaW5fZGV2aWNlICopIHZwdHItPmRldi0+aXBfcHRyOworCXN0cnVjdCBpbl9pZmFkZHIgKmlmYTsKKworCWlmIChpbl9kZXYgIT0gTlVMTCkgeworCQlpZmEgPSAoc3RydWN0IGluX2lmYWRkciAqKSBpbl9kZXYtPmlmYV9saXN0OworCQlpZiAoaWZhICE9IE5VTEwpIHsKKwkJCW1lbWNweSh2cHRyLT5pcF9hZGRyLCAmaWZhLT5pZmFfYWRkcmVzcywgNCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV91cGRhdGVfaHdfbWlicwktCWZldGNoIE1JQiBjb3VudGVycyBmcm9tIGNoaXAKKyAqCUB2cHRyOiB2ZWxvY2l0eSB0byB1cGRhdGUKKyAqCisgKglUaGUgdmVsb2NpdHkgaGFyZHdhcmUga2VlcHMgY2VydGFpbiBjb3VudGVycyBpbiB0aGUgaGFyZHdhcmUKKyAqIAlzaWRlLiBXZSBuZWVkIHRvIHJlYWQgdGhlc2Ugd2hlbiB0aGUgdXNlciBhc2tzIGZvciBzdGF0aXN0aWNzCisgKglvciB3aGVuIHRoZXkgb3ZlcmZsb3cgKGNhdXNpbmcgYW4gaW50ZXJydXB0KS4gVGhlIHJlYWQgb2YgdGhlCisgKglzdGF0aXN0aWMgY2xlYXJzIGl0LCBzbyB3ZSBrZWVwIHJ1bm5pbmcgbWFzdGVyIGNvdW50ZXJzIGluIHVzZXIKKyAqCXNwYWNlLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZWxvY2l0eV91cGRhdGVfaHdfbWlicyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwl1MzIgdG1wOworCWludCBpOworCUJZVEVfUkVHX0JJVFNfT04oTUlCQ1JfTUlCRkxTSCwgJih2cHRyLT5tYWNfcmVncy0+TUlCQ1IpKTsKKworCXdoaWxlIChCWVRFX1JFR19CSVRTX0lTX09OKE1JQkNSX01JQkZMU0gsICYodnB0ci0+bWFjX3JlZ3MtPk1JQkNSKSkpOworCisJQllURV9SRUdfQklUU19PTihNSUJDUl9NUFRSSU5JLCAmKHZwdHItPm1hY19yZWdzLT5NSUJDUikpOworCWZvciAoaSA9IDA7IGkgPCBIV19NSUJfU0laRTsgaSsrKSB7CisJCXRtcCA9IHJlYWRsKCYodnB0ci0+bWFjX3JlZ3MtPk1JQkRhdGEpKSAmIDB4MDBGRkZGRkZVTDsKKwkJdnB0ci0+bWliX2NvdW50ZXJbaV0gKz0gdG1wOworCX0KK30KKworLyoqCisgKglpbml0X2Zsb3dfY29udHJvbF9yZWdpc3RlciAJLQlzZXQgdXAgZmxvdyBjb250cm9sCisgKglAdnB0cjogdmVsb2NpdHkgdG8gY29uZmlndXJlCisgKgorICoJQ29uZmlndXJlIHRoZSBmbG93IGNvbnRyb2wgcmVnaXN0ZXJzIGZvciB0aGlzIHZlbG9jaXR5IGRldmljZS4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9mbG93X2NvbnRyb2xfcmVnaXN0ZXIoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisKKwkvKiBTZXQge1hISVRIMSwgWEhJVEgwLCBYTFRIMSwgWExUSDB9IGluIEZsb3dDUjEgdG8gezEsIDAsIDEsIDF9CisJICAgZGVwZW5kIG9uIFJEPTY0LCBhbmQgVHVybiBvbiBYTk9FTiBpbiBGbG93Q1IxICovCisJd3JpdGVsKChDUjBfWE9ORU4gfCBDUjBfWEhJVEgxIHwgQ1IwX1hMVEgxIHwgQ1IwX1hMVEgwKSwgJnJlZ3MtPkNSMFNldCk7CisJd3JpdGVsKChDUjBfRkRYVEZDRU4gfCBDUjBfRkRYUkZDRU4gfCBDUjBfSERYRkNFTiB8IENSMF9YSElUSDApLCAmcmVncy0+Q1IwQ2xyKTsKKworCS8qIFNldCBUeFBhdXNlVGltZXIgdG8gMHhGRkZGICovCisJd3JpdGV3KDB4RkZGRiwgJnJlZ3MtPnR4X3BhdXNlX3RpbWVyKTsKKworCS8qIEluaXRpYWxpemUgUkJSRFUgdG8gUnggYnVmZmVyIGNvdW50LiAqLworCXdyaXRldyh2cHRyLT5vcHRpb25zLm51bXJ4LCAmcmVncy0+UkJSRFUpOworfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL0tjb25maWcgYi9kcml2ZXJzL25ldC93YW4vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTc5MTkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKQEAgLTAsMCArMSw2MDcgQEAKKyMKKyMgd2FuIGRldmljZXMgY29uZmlndXJhdGlvbgorIworCittZW51ICJXYW4gaW50ZXJmYWNlcyIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMKKworY29uZmlnIFdBTgorCWJvb2wgIldhbiBpbnRlcmZhY2VzIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgV2lkZSBBcmVhIE5ldHdvcmtzIChXQU5zKSwgc3VjaCBhcyBYLjI1LCBGcmFtZSBSZWxheSBhbmQgbGVhc2VkCisJICBsaW5lcywgYXJlIHVzZWQgdG8gaW50ZXJjb25uZWN0IExvY2FsIEFyZWEgTmV0d29ya3MgKExBTnMpIG92ZXIgdmFzdAorCSAgZGlzdGFuY2VzIHdpdGggZGF0YSB0cmFuc2ZlciByYXRlcyBzaWduaWZpY2FudGx5IGhpZ2hlciB0aGFuIHRob3NlCisJICBhY2hpZXZhYmxlIHdpdGggY29tbW9ubHkgdXNlZCBhc3luY2hyb25vdXMgbW9kZW0gY29ubmVjdGlvbnMuCisKKwkgIFVzdWFsbHksIGEgcXVpdGUgZXhwZW5zaXZlIGV4dGVybmFsIGRldmljZSBjYWxsZWQgYSBgV0FOIHJvdXRlcicgaXMKKwkgIG5lZWRlZCB0byBjb25uZWN0IHRvIGEgV0FOLiBBcyBhbiBhbHRlcm5hdGl2ZSwgYSByZWxhdGl2ZWx5CisJICBpbmV4cGVuc2l2ZSBXQU4gaW50ZXJmYWNlIGNhcmQgY2FuIGFsbG93IHlvdXIgTGludXggYm94IHRvIGRpcmVjdGx5CisJICBjb25uZWN0IHRvIGEgV0FOLgorCisJICBJZiB5b3UgaGF2ZSBvbmUgb2YgdGhvc2UgY2FyZHMgYW5kIHdpc2ggdG8gdXNlIGl0IHVuZGVyIExpbnV4LAorCSAgc2F5IFkgaGVyZSBhbmQgYWxzbyB0byB0aGUgV0FOIGRyaXZlciBmb3IgeW91ciBjYXJkLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCisjIFRoZXJlIGlzIG5vIHdheSB0byBkZXRlY3QgYSBjb210cm9sIHN2MTEgLSBmb3JjZSBpdCBtb2R1bGFyIGZvciBub3cuCitjb25maWcgSE9TVEVTU19TVjExCisJdHJpc3RhdGUgIkNvbXRyb2wgSG9zdGVzcyBTVi0xMSBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0FOICYmIElTQSAmJiBtCisJaGVscAorCSAgRHJpdmVyIGZvciBDb210cm9sIEhvc3Rlc3MgU1YtMTEgbmV0d29yayBjYXJkIHdoaWNoCisJICBvcGVyYXRlcyBvbiBsb3cgc3BlZWQgc3luY2hyb25vdXMgc2VyaWFsIGxpbmtzIGF0IHVwIHRvCisJICAyNTZLYnBzLCBzdXBwb3J0aW5nIFBQUCBhbmQgQ2lzY28gSERMQy4KKworCSAgVGhlIGRyaXZlciB3aWxsIGJlIGNvbXBpbGVkIGFzIGEgbW9kdWxlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBob3N0ZXNzX3N2MTEuCisKKyMgVGhlIENPU0EvU1JQIGRyaXZlciBoYXMgbm90IGJlZW4gdGVzdGVkIGFzIG5vbi1tb2R1bGFyIHlldC4KK2NvbmZpZyBDT1NBCisJdHJpc3RhdGUgIkNPU0EvU1JQIHN5bmMgc2VyaWFsIGJvYXJkcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0FOICYmIElTQSAmJiBtCisJLS0taGVscC0tLQorCSAgRHJpdmVyIGZvciBDT1NBIGFuZCBTUlAgc3luY2hyb25vdXMgc2VyaWFsIGJvYXJkcy4KKworCSAgVGhlc2UgYm9hcmRzIGFsbG93IHRvIGNvbm5lY3Qgc3luY2hyb25vdXMgc2VyaWFsIGRldmljZXMgKGZvciBleGFtcGxlCisJICBiYXNlLWJhbmQgbW9kZW1zLCBvciBhbnkgb3RoZXIgZGV2aWNlIHdpdGggdGhlIFguMjEsIFYuMjQsIFYuMzUgb3IKKwkgIFYuMzYgaW50ZXJmYWNlKSB0byB5b3VyIExpbnV4IGJveC4gVGhlIGNhcmRzIGNhbiB3b3JrIGFzIHRoZQorCSAgY2hhcmFjdGVyIGRldmljZSwgc3luY2hyb25vdXMgUFBQIG5ldHdvcmsgZGV2aWNlLCBvciB0aGUgQ2lzY28gSERMQworCSAgbmV0d29yayBkZXZpY2UuCisKKwkgIFlvdSB3aWxsIG5lZWQgdXNlci1zcGFjZSB1dGlsaXRpZXMgQ09TQSBvciBTUlAgYm9hcmRzIGZvciBkb3dubG9hZGluZworIAkgIHRoZSBmaXJtd2FyZSB0byB0aGUgY2FyZHMgYW5kIHRvIHNldCB0aGVtIHVwLiBMb29rIGF0IHRoZQorCSAgPGh0dHA6Ly93d3cuZmkubXVuaS5jei9+a2FzL2Nvc2EvPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gWW91IGNhbiBhbHNvCisJICByZWFkIHRoZSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIDxmaWxlOmRyaXZlcnMvbmV0L3dhbi9jb3NhLmM+IGZvcgorCSAgZGV0YWlscyBhYm91dCB0aGUgY2FyZHMgYW5kIHRoZSBkcml2ZXIgaXRzZWxmLgorCisJICBUaGUgZHJpdmVyIHdpbGwgYmUgY29tcGlsZWQgYXMgYSBtb2R1bGU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGNvc2EuCisKK2NvbmZpZyBEU0NDNAorCXRyaXN0YXRlICJFdGluYyBQQ0lTWU5DIHNlcmlhbCBib2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0FOICYmIFBDSSAmJiBtCisJaGVscAorCSAgRHJpdmVyIGZvciBFdGluYyBQQ0lTWU5DIGJvYXJkcyBiYXNlZCBvbiB0aGUgSW5maW5lb24gKGV4LiBTaWVtZW5zKQorCSAgRFNDQzQgY2hpcHNldC4KKworCSAgVGhpcyBpcyBzdXBwb3NlZCB0byB3b3JrIHdpdGggdGhlIGZvdXIgcG9ydCBjYXJkLiBUYWtlIGEgbG9vayBhdAorCSAgPGh0dHA6Ly93d3cuY29nZW5pdC5mci9kc2NjNC8+IGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZQorCSAgZHJpdmVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkc2NjNC4KKworY29uZmlnIERTQ0M0X1BDSVNZTkMKKwlib29sICJFdGluYyBQQ0lTWU5DIGZlYXR1cmVzIgorCWRlcGVuZHMgb24gRFNDQzQKKwloZWxwCisJICBEdWUgdG8gRXRpbmMncyBkZXNpZ24gY2hvaWNlIGZvciBpdHMgUENJU1lOQyBjYXJkcywgc29tZSBvcGVyYXRpb25zCisJICBhcmUgb25seSBhbGxvd2VkIG9uIHNwZWNpZmljIHBvcnRzIG9mIHRoZSBEU0NDNC4gVGhpcyBvcHRpb24gaXMgdGhlCisJICBvbmx5IHdheSBmb3IgdGhlIGRyaXZlciB0byBrbm93IHRoYXQgaXQgc2hvdWxkbid0IHJldHVybiBhIHN1Y2Nlc3MKKwkgIGNvZGUgZm9yIHRoZXNlIG9wZXJhdGlvbnMuCisKKwkgIFBsZWFzZSBzYXkgWSBpZiB5b3VyIGNhcmQgaXMgYW4gRXRpbmMncyBQQ0lTWU5DLgorCitjb25maWcgRFNDQzRfUENJX1JTVAorCWJvb2wgIkhhcmQgcmVzZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERTQ0M0CisJaGVscAorCSAgVmFyaW91cyBEU0NDNCBidWdzIGZvcmJpZCBhbnkgcmVsaWFibGUgc29mdHdhcmUgcmVzZXQgb2YgdGhlIEFTSUMuCisJICBBcyBhIHJlcGxhY2VtZW50LCBzb21lIHZlbmRvcnMgcHJvdmlkZSBhIHdheSB0byBhc3NlcnQgdGhlIFBDSSAjUlNUCisJICBwaW4gb2YgRFNDQzQgdGhyb3VnaCB0aGUgR1BJTyBwb3J0IG9mIHRoZSBjYXJkLiBJZiB5b3UgY2hvb3NlIFksCisJICB0aGUgZHJpdmVyIHdpbGwgbWFrZSB1c2Ugb2YgdGhpcyBmZWF0dXJlIGJlZm9yZSBtb2R1bGUgcmVtb3ZhbAorCSAgKGkuZS4gcm1tb2QpLiBUaGUgZmVhdHVyZSBpcyBrbm93biB0byBiZSBhdmFpbGFibGUgb24gQ29tbXRlY2gncworCSAgY2FyZHMuIENvbnRhY3QgeW91ciBtYW51ZmFjdHVyZXIgZm9yIGRldGFpbHMuCisKKwkgIFNheSBZIGlmIHlvdXIgY2FyZCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuCisKKyMKKyMgTGFuIE1lZGlhJ3MgYm9hcmQuIEN1cnJlbnRseSAxMDAwLCAxMjAwLCA1MjAwLCA1MjQ1CisjCitjb25maWcgTEFOTUVESUEKKwl0cmlzdGF0ZSAiTGFuTWVkaWEgQ29ycC4gU1NJL1YuMzUsIFQxL0UxLCBIU1NJLCBUMyBib2FyZHMiCisJZGVwZW5kcyBvbiBXQU4gJiYgUENJCisJLS0taGVscC0tLQorCSAgRHJpdmVyIGZvciB0aGUgZm9sbG93aW5nIExhbiBNZWRpYSBmYW1pbHkgb2Ygc2VyaWFsIGJvYXJkczoKKworCSAgLSBMTUMgMTAwMCBib2FyZCBhbGxvd3MgeW91IHRvIGNvbm5lY3Qgc3luY2hyb25vdXMgc2VyaWFsIGRldmljZXMKKwkgIChmb3IgZXhhbXBsZSBiYXNlLWJhbmQgbW9kZW1zLCBvciBhbnkgb3RoZXIgZGV2aWNlIHdpdGggdGhlIFguMjEsCisJICBWLjI0LCBWLjM1IG9yIFYuMzYgaW50ZXJmYWNlKSB0byB5b3VyIExpbnV4IGJveC4KKworCSAgLSBMTUMgMTIwMCB3aXRoIG9uIGJvYXJkIERTVSBib2FyZCBhbGxvd3MgeW91IHRvIGNvbm5lY3QgeW91ciBMaW51eAorCSAgYm94IGRpcmVjdGx5IHRvIGEgVDEgb3IgRTEgY2lyY3VpdC4KKworCSAgLSBMTUMgNTIwMCBib2FyZCBwcm92aWRlcyBhIEhTU0kgaW50ZXJmYWNlIGNhcGFibGUgb2YgcnVubmluZyB1cCB0bworCSAgNTIgTWJpdHMgcGVyIHNlY29uZC4KKworCSAgLSBMTUMgNTI0NSBib2FyZCBjb25uZWN0cyBkaXJlY3RseSB0byBhIFQzIGNpcmN1aXQgc2F2aW5nIHRoZQorCSAgYWRkaXRpb25hbCBleHRlcm5hbCBoYXJkd2FyZS4KKworCSAgVG8gY2hhbmdlIHNldHRpbmcgc3VjaCBhcyBzeW5jUFBQIHZzIENpc2NvIEhETEMgb3IgY2xvY2sgc291cmNlIHlvdQorCSAgd2lsbCBuZWVkIGxtY2N0bC4gIEl0IGlzIGF2YWlsYWJsZSBhdCA8ZnRwOi8vZnRwLmxhbm1lZGlhLmNvbS8+CisJICAoYnJva2VuIGxpbmspLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBsbWMuCisKKyMgVGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCBhIFNlYWxldmVsIGJvYXJkLiBGb3JjZSBpdCBtb2R1bGFyCitjb25maWcgU0VBTEVWRUxfNDAyMQorCXRyaXN0YXRlICJTZWFsZXZlbCBTeXN0ZW1zIDQwMjEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFdBTiAmJiBJU0EgJiYgbQorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBTZWFsZXZlbCBTeXN0ZW1zIEFDQiA1NiBzZXJpYWwgSS9PIGFkYXB0ZXIuCisKKwkgIFRoZSBkcml2ZXIgd2lsbCBiZSBjb21waWxlZCBhcyBhIG1vZHVsZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2VhbGV2ZWwuCisKK2NvbmZpZyBTWU5DTElOS19TWU5DUFBQCisJdHJpc3RhdGUgIlN5bmNMaW5rIEhETEMvU1lOQ1BQUCBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0FOCisJaGVscAorCSAgRW5hYmxlcyBIRExDL1NZTkNQUFAgc3VwcG9ydCBmb3IgdGhlIFN5bmNMaW5rIFdBTiBkcml2ZXIuCisKKwkgIE5vcm1hbGx5IHRoZSBTeW5jTGluayBXQU4gZHJpdmVyIHdvcmtzIHdpdGggdGhlIG1haW4gUFBQIGRyaXZlcgorCSAgPGZpbGU6ZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYz4gYW5kIHBwcGQgcHJvZ3JhbS4KKwkgIEhETEMvU1lOQ1BQUCBzdXBwb3J0IGFsbG93cyB1c2Ugb2YgdGhlIENpc2NvIEhETEMvUFBQIGRyaXZlcgorCSAgPGZpbGU6ZHJpdmVycy9uZXQvd2FuL3N5bmNwcHAuYz4uIFRoZSBTeW5jTGluayBXQU4gZHJpdmVyIChpbgorCSAgY2hhcmFjdGVyIGRldmljZXMpIG11c3QgYWxzbyBiZSBlbmFibGVkLgorCisjIEdlbmVyaWMgSERMQworY29uZmlnIEhETEMKKwl0cmlzdGF0ZSAiR2VuZXJpYyBIRExDIGxheWVyIgorCWRlcGVuZHMgb24gV0FOCisJaGVscAorCSAgU2F5IFkgdG8gdGhpcyBvcHRpb24gaWYgeW91ciBMaW51eCBib3ggY29udGFpbnMgYSBXQU4gKFdpZGUgQXJlYQorCSAgTmV0d29yaykgY2FyZCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgYW5kIHlvdSBhcmUgcGxhbm5pbmcgdG8KKwkgIGNvbm5lY3QgdGhlIGJveCB0byBhIFdBTi4KKworCSAgWW91IHdpbGwgbmVlZCBzdXBwb3J0aW5nIHNvZnR3YXJlIGZyb20KKwkgIDxodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL25ldC9oZGxjLz4uCisJICBHZW5lcmljIEhETEMgZHJpdmVyIGN1cnJlbnRseSBzdXBwb3J0cyByYXcgSERMQywgQ2lzY28gSERMQywgRnJhbWUKKwkgIFJlbGF5LCBzeW5jaHJvbm91cyBQb2ludC10by1Qb2ludCBQcm90b2NvbCAoUFBQKSBhbmQgWC4yNS4KKworIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGhkbGMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIRExDX1JBVworCWJvb2wgIlJhdyBIRExDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIRExDCisJaGVscAorCSAgR2VuZXJpYyBIRExDIGRyaXZlciBzdXBwb3J0aW5nIHJhdyBIRExDIG92ZXIgV0FOIGNvbm5lY3Rpb25zLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSERMQ19SQVdfRVRICisJYm9vbCAiUmF3IEhETEMgRXRoZXJuZXQgZGV2aWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIRExDCisJaGVscAorCSAgR2VuZXJpYyBIRExDIGRyaXZlciBzdXBwb3J0aW5nIHJhdyBIRExDIEV0aGVybmV0IGRldmljZSBlbXVsYXRpb24KKwkgIG92ZXIgV0FOIGNvbm5lY3Rpb25zLgorCisJICBZb3Ugd2lsbCBuZWVkIGl0IGZvciBFdGhlcm5ldCBvdmVyIEhETEMgYnJpZGdlcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEhETENfQ0lTQ08KKwlib29sICJDaXNjbyBIRExDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIRExDCisJaGVscAorCSAgR2VuZXJpYyBIRExDIGRyaXZlciBzdXBwb3J0aW5nIENpc2NvIEhETEMgb3ZlciBXQU4gY29ubmVjdGlvbnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIRExDX0ZSCisJYm9vbCAiRnJhbWUgUmVsYXkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhETEMKKwloZWxwCisJICBHZW5lcmljIEhETEMgZHJpdmVyIHN1cHBvcnRpbmcgRnJhbWUgUmVsYXkgb3ZlciBXQU4gY29ubmVjdGlvbnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIRExDX1BQUAorCWJvb2wgIlN5bmNocm9ub3VzIFBvaW50LXRvLVBvaW50IFByb3RvY29sIChQUFApIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIRExDCisJaGVscAorCSAgR2VuZXJpYyBIRExDIGRyaXZlciBzdXBwb3J0aW5nIFBQUCBvdmVyIFdBTiBjb25uZWN0aW9ucy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEhETENfWDI1CisJYm9vbCAiWC4yNSBwcm90b2NvbCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSERMQyAmJiAoTEFQQj1tICYmIEhETEM9bSB8fCBMQVBCPXkpCisJaGVscAorCSAgR2VuZXJpYyBIRExDIGRyaXZlciBzdXBwb3J0aW5nIFguMjUgb3ZlciBXQU4gY29ubmVjdGlvbnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbW1lbnQgIlguMjUvTEFQQiBzdXBwb3J0IGlzIGRpc2FibGVkIgorCWRlcGVuZHMgb24gV0FOICYmIEhETEMgJiYgKExBUEIhPW0gfHwgSERMQyE9bSkgJiYgTEFQQiE9eQorCitjb25maWcgUENJMjAwU1lOCisJdHJpc3RhdGUgIkdvcmFtbyBQQ0kyMDBTWU4gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhETEMgJiYgUENJCisJaGVscAorCSAgRHJpdmVyIGZvciBQQ0kyMDBTWU4gY2FyZHMgYnkgR29yYW1vIHNwLiBqLgorCisJICBJZiB5b3UgaGF2ZSBzdWNoIGEgY2FyZCwgc2F5IFkgaGVyZSBhbmQgc2VlCisJICA8aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9uZXQvaGRsYy8+LgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBjaTIwMHN5bi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFdBTlhMCisJdHJpc3RhdGUgIlNCRSBJbmMuIHdhblhMIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIRExDICYmIFBDSQorCWhlbHAKKwkgIERyaXZlciBmb3Igd2FuWEwgUENJIGNhcmRzIGJ5IFNCRSBJbmMuCisKKwkgIElmIHlvdSBoYXZlIHN1Y2ggYSBjYXJkLCBzYXkgWSBoZXJlIGFuZCBzZWUKKwkgIDxodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL25ldC9oZGxjLz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgd2FueGwuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBXQU5YTF9CVUlMRF9GSVJNV0FSRQorCWJvb2wgInJlYnVpbGQgd2FuWEwgZmlybXdhcmUiCisJZGVwZW5kcyBvbiBXQU5YTCAmJiAhUFJFVkVOVF9GSVJNV0FSRV9CVUlMRAorCWhlbHAKKwkgIEFsbG93cyB5b3UgdG8gcmVidWlsZCBmaXJtd2FyZSBydW4gYnkgdGhlIFFVSUNDIHByb2Nlc3Nvci4KKwkgIEl0IHJlcXVpcmVzIGFzNjhrLCBsZDY4ayBhbmQgaGV4ZHVtcCBwcm9ncmFtcy4KKworCSAgWW91IHNob3VsZCBuZXZlciBuZWVkIHRoaXMgb3B0aW9uLCBzYXkgTi4KKworY29uZmlnIFBDMzAwCisJdHJpc3RhdGUgIkN5Y2xhZGVzLVBDMzAwIHN1cHBvcnQgKFJTLTIzMi9WLjM1LCBYLjIxLCBUMS9FMSBib2FyZHMpIgorCWRlcGVuZHMgb24gSERMQyAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBEcml2ZXIgZm9yIHRoZSBDeWNsYWRlcy1QQzMwMCBzeW5jaHJvbm91cyBjb21tdW5pY2F0aW9uIGJvYXJkcy4KKworCSAgVGhlc2UgYm9hcmRzIHByb3ZpZGUgc3luY2hyb25vdXMgc2VyaWFsIGludGVyZmFjZXMgdG8geW91cgorCSAgTGludXggYm94IChpbnRlcmZhY2VzIGN1cnJlbnRseSBhdmFpbGFibGUgYXJlIFJTLTIzMi9WLjM1LCBYLjIxIGFuZAorCSAgVDEvRTEpLiBJZiB5b3Ugd2lzaCB0byBzdXBwb3J0IE11bHRpbGluayBQUFAsIHBsZWFzZSBzZWxlY3QgdGhlCisJICBvcHRpb24gbGF0ZXIgYW5kIHJlYWQgdGhlIGZpbGUgUkVBRE1FLm1scHBwIHByb3ZpZGVkIGJ5IFBDMzAwCisJICBwYWNrYWdlLgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHBjMzAwLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUEMzMDBfTUxQUFAKKwlib29sICJDeWNsYWRlcy1QQzMwMCBNTFBQUCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUEMzMDAgJiYgUFBQX01VTFRJTElOSyAmJiBQUFBfU1lOQ19UVFkgJiYgSERMQ19QUFAKKwloZWxwCisJICBNdWx0aWxpbmsgUFBQIG92ZXIgdGhlIFBDMzAwIHN5bmNocm9ub3VzIGNvbW11bmljYXRpb24gYm9hcmRzLgorCitjb21tZW50ICJDeWNsYWRlcy1QQzMwMCBNTFBQUCBzdXBwb3J0IGlzIGRpc2FibGVkLiIKKwlkZXBlbmRzIG9uIFdBTiAmJiBIRExDICYmIFBDMzAwICYmIChQUFA9biB8fCAhUFBQX01VTFRJTElOSyB8fCBQUFBfU1lOQ19UVFk9biB8fCAhSERMQ19QUFApCisKK2NvbW1lbnQgIlJlZmVyIHRvIHRoZSBmaWxlIFJFQURNRS5tbHBwcCwgcHJvdmlkZWQgYnkgUEMzMDAgcGFja2FnZS4iCisJZGVwZW5kcyBvbiBXQU4gJiYgSERMQyAmJiBQQzMwMCAmJiAoUFBQPW4gfHwgIVBQUF9NVUxUSUxJTksgfHwgUFBQX1NZTkNfVFRZPW4gfHwgIUhETENfUFBQKQorCitjb25maWcgTjIKKwl0cmlzdGF0ZSAiU0RMIFJJU0NvbS9OMiBzdXBwb3J0IgorCWRlcGVuZHMgb24gSERMQyAmJiBJU0EKKwloZWxwCisJICBEcml2ZXIgZm9yIFJJU0NvbS9OMiBzaW5nbGUgb3IgZHVhbCBjaGFubmVsIElTQSBjYXJkcyBieQorCSAgU0RMIENvbW11bmljYXRpb25zIEluYy4KKworCSAgSWYgeW91IGhhdmUgc3VjaCBhIGNhcmQsIHNheSBZIGhlcmUgYW5kIHNlZQorCSAgPGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvbmV0L2hkbGMvPi4KKworCSAgTm90ZSB0aGF0IE4yY3N1IGFuZCBOMmRkcyBjYXJkcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbjIuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBDMTAxCisJdHJpc3RhdGUgIk1veGEgQzEwMSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSERMQyAmJiBJU0EKKwloZWxwCisJICBEcml2ZXIgZm9yIEMxMDEgU3VwZXJTeW5jIElTQSBjYXJkcyBieSBNb3hhIFRlY2hub2xvZ2llcyBDby4sIEx0ZC4KKworCSAgSWYgeW91IGhhdmUgc3VjaCBhIGNhcmQsIHNheSBZIGhlcmUgYW5kIHNlZQorCSAgPGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvbmV0L2hkbGMvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYzEwMS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEZBUlNZTkMKKwl0cmlzdGF0ZSAiRmFyU3luYyBULVNlcmllcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSERMQyAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB0aGUgRmFyU3luYyBULVNlcmllcyBYLjIxIChhbmQgVi4zNS9WLjI0KSBjYXJkcyBieQorCSAgRmFyU2l0ZSBDb21tdW5pY2F0aW9ucyBMdGQuCisKKwkgIFN5bmNocm9ub3VzIGNvbW11bmljYXRpb24gaXMgc3VwcG9ydGVkIG9uIGFsbCBwb3J0cyBhdCBzcGVlZHMgdXAgdG8KKwkgIDhNYi9zICgxMjhLIG9uIFYuMjQpIHVzaW5nIHN5bmNocm9ub3VzIFBQUCwgQ2lzY28gSERMQywgcmF3IEhETEMsCisJICBGcmFtZSBSZWxheSBvciBYLjI1L0xBUEIuCisKKwkgIElmIHlvdSB3YW50IHRoZSBtb2R1bGUgdG8gYmUgYXV0b21hdGljYWxseSBsb2FkZWQgd2hlbiB0aGUgaW50ZXJmYWNlCisJICBpcyByZWZlcmVuY2VkIHRoZW4geW91IHNob3VsZCBhZGQgImFsaWFzIGhkbGNYIGZhcnN5bmMiIHRvCisJICAvZXRjL21vZHByb2JlLmNvbmYgZm9yIGVhY2ggaW50ZXJmYWNlLCB3aGVyZSBYIGlzIDAsIDEsIDIsIC4uLiwgb3IKKwkgIHNpbXBseSB1c2UgImFsaWFzIGhkbGMqIGZhcnN5bmMiIHRvIGluZGljYXRlIGFsbCBvZiB0aGVtLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBmYXJzeW5jLgorCitjb25maWcgRExDSQorCXRyaXN0YXRlICJGcmFtZSBSZWxheSBETENJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBXQU4KKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB0aGUgRnJhbWUgUmVsYXkgcHJvdG9jb2wuCisKKwkgIEZyYW1lIFJlbGF5IGlzIGEgZmFzdCBsb3ctY29zdCB3YXkgdG8gY29ubmVjdCB0byBhIHJlbW90ZSBJbnRlcm5ldAorCSAgYWNjZXNzIHByb3ZpZGVyIG9yIHRvIGZvcm0gYSBwcml2YXRlIHdpZGUgYXJlYSBuZXR3b3JrLiBUaGUgb25lCisJICBwaHlzaWNhbCBsaW5lIGZyb20geW91ciBib3ggdG8gdGhlIGxvY2FsICJzd2l0Y2giIChpLmUuIHRoZSBlbnRyeQorCSAgcG9pbnQgdG8gdGhlIEZyYW1lIFJlbGF5IG5ldHdvcmssIHVzdWFsbHkgYXQgdGhlIHBob25lIGNvbXBhbnkpIGNhbgorCSAgY2Fycnkgc2V2ZXJhbCBsb2dpY2FsIHBvaW50LXRvLXBvaW50IGNvbm5lY3Rpb25zIHRvIG90aGVyIGNvbXB1dGVycworCSAgY29ubmVjdGVkIHRvIHRoZSBGcmFtZSBSZWxheSBuZXR3b3JrLiBGb3IgYSBnZW5lcmFsIGV4cGxhbmF0aW9uIG9mCisJICB0aGUgcHJvdG9jb2wsIGNoZWNrIG91dCA8aHR0cDovL3d3dy5tcGxzZm9ydW0ub3JnLz4uCisKKwkgIFRvIHVzZSBmcmFtZSByZWxheSwgeW91IG5lZWQgc3VwcG9ydGluZyBoYXJkd2FyZSAoY2FsbGVkIEZSQUQpIGFuZAorCSAgY2VydGFpbiBwcm9ncmFtcyBmcm9tIHRoZSBuZXQtdG9vbHMgcGFja2FnZSBhcyBleHBsYWluZWQgaW4KKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9mcmFtZXJlbGF5LnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGRsY2kuCisKK2NvbmZpZyBETENJX0NPVU5UCisJaW50ICJNYXggb3BlbiBETENJIgorCWRlcGVuZHMgb24gRExDSQorCWRlZmF1bHQgIjI0IgorCWhlbHAKKwkgIE1heGltYWwgbnVtYmVyIG9mIGxvZ2ljYWwgcG9pbnQtdG8tcG9pbnQgZnJhbWUgcmVsYXkgY29ubmVjdGlvbnMKKwkgICh0aGUgaWRlbnRpZmllcnMgb2Ygd2hpY2ggYXJlIGNhbGxlZCBEQ0xJcykgdGhhdCB0aGUgZHJpdmVyIGNhbgorCSAgaGFuZGxlLgorCisJICBUaGUgZGVmYXVsdCBpcyBwcm9iYWJseSBmaW5lLgorCitjb25maWcgRExDSV9NQVgKKwlpbnQgIk1heCBETENJIHBlciBkZXZpY2UiCisJZGVwZW5kcyBvbiBETENJCisJZGVmYXVsdCAiOCIKKwloZWxwCisJICBIb3cgbWFueSBsb2dpY2FsIHBvaW50LXRvLXBvaW50IGZyYW1lIHJlbGF5IGNvbm5lY3Rpb25zICh0aGUKKwkgIGlkZW50aWZpZXJzIG9mIHdoaWNoIGFyZSBjYWxsZWQgRENMSXMpIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGVhY2gKKwkgIG9mIHlvdXIgaGFyZHdhcmUgZnJhbWUgcmVsYXkgYWNjZXNzIGRldmljZXMuCisKKwkgIEdvIHdpdGggdGhlIGRlZmF1bHQuCisKK2NvbmZpZyBTRExBCisJdHJpc3RhdGUgIlNETEEgKFNhbmdvbWEgUzUwMi9TNTA4KSBzdXBwb3J0IgorCWRlcGVuZHMgb24gRExDSSAmJiBJU0EKKwloZWxwCisJICBEcml2ZXIgZm9yIHRoZSBTYW5nb21hIFM1MDJBLCBTNTAyRSwgYW5kIFM1MDggRnJhbWUgUmVsYXkgQWNjZXNzCisJICBEZXZpY2VzLgorCisJICBUaGVzZSBhcmUgbXVsdGktcHJvdG9jb2wgY2FyZHMsIGJ1dCBvbmx5IEZyYW1lIFJlbGF5IGlzIHN1cHBvcnRlZAorCSAgYnkgdGhlIGRyaXZlciBhdCB0aGlzIHRpbWUuIFBsZWFzZSByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZnJhbWVyZWxheS50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzZGxhLgorCisjIFdhbiByb3V0ZXIgY29yZS4KK2NvbmZpZyBXQU5fUk9VVEVSX0RSSVZFUlMKKwlib29sICJXQU4gcm91dGVyIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBXQU4gJiYgV0FOX1JPVVRFUgorCS0tLWhlbHAtLS0KKwkgIENvbm5lY3QgTEFOIHRvIFdBTiB2aWEgTGludXggYm94LgorCisJICBTZWxlY3QgZHJpdmVyIHlvdXIgY2FyZCBhbmQgcmVtZW1iZXIgdG8gc2F5IFkgdG8gIldhbiBSb3V0ZXIuIgorCSAgWW91IHdpbGwgbmVlZCB0aGUgd2FuLXRvb2xzIHBhY2thZ2Ugd2hpY2ggaXMgYXZhaWxhYmxlIGZyb20KKwkgIDxmdHA6Ly9mdHAuc2FuZ29tYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVhZDoKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy93YW4tcm91dGVyLnR4dD4uCisKKwkgIE5vdGUgdGhhdCB0aGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBXQU4gcm91dGVyIGRyaXZlcnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBWRU5ET1JfU0FOR09NQQorCXRyaXN0YXRlICJTYW5nb21hIFdBTlBJUEUodG0pIG11bHRpcHJvdG9jb2wgY2FyZHMiCisJZGVwZW5kcyBvbiBXQU5fUk9VVEVSX0RSSVZFUlMgJiYgV0FOX1JPVVRFUiAmJiAoUENJIHx8IElTQSkgJiYgQlJPS0VOCisJLS0taGVscC0tLQorCSAgRHJpdmVyIGZvciBTNTE0LVBDSS9JU0EgU3luY2hyb25vdXMgRGF0YSBMaW5rIEFkYXB0ZXJzIChTRExBKS4KKworCSAgV0FOUElQRSBmcm9tIFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4gPGh0dHA6Ly93d3cuc2FuZ29tYS5jb20vPgorCSAgaXMgYSBmYW1pbHkgb2YgaW50ZWxsaWdlbnQgbXVsdGlwcm90b2NvbCBXQU4gYWRhcHRlcnMgd2l0aCBkYXRhCisJICB0cmFuc2ZlciByYXRlcyB1cCB0byA0TWJwcy4gQ2FyZHMgc3VwcG9ydDoKKworCSAgLSBYLjI1LCBGcmFtZSBSZWxheSwgUFBQLCBDaXNjbyBIRExDIHByb3RvY29scy4KKworCSAgLSBBUEkgZm9yIHByb3RvY29scyBsaWtlIEhETEMgKExBUEIpLCBIRExDIFN0cmVhbWluZywgWC4yNSwKKwkgIEZyYW1lIFJlbGF5IGFuZCBCaVN5bmMuCisKKwkgIC0gRXRoZXJuZXQgQnJpZGdpbmcgb3ZlciBGcmFtZSBSZWxheSBwcm90b2NvbC4KKworCSAgLSBNVUxUSUxJTksgUFBQCisKKwkgIC0gQXN5bmMgUFBQIChNb2RlbSBEaWFsdXApCisKKwkgIFRoZSBuZXh0IHF1ZXN0aW9ucyB3aWxsIGFzayB5b3UgYWJvdXQgdGhlIHByb3RvY29scyB5b3Ugd2FudAorCSAgdGhlIGRyaXZlciB0byBzdXBwb3J0LgorCisJICBJZiB5b3UgaGF2ZSBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXJkcywgc2F5IE0gdG8gdGhpcyBvcHRpb247CisJICBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FucGlwZS50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3YW5waXBlLgorCitjb25maWcgV0FOUElQRV9DSERMQworCWJvb2wgIldBTlBJUEUgQ2lzY28gSERMQyBzdXBwb3J0IgorCWRlcGVuZHMgb24gVkVORE9SX1NBTkdPTUEKKwktLS1oZWxwLS0tCisJICBDb25uZWN0IGEgV0FOUElQRSBjYXJkIHRvIGEgbGVhc2VkIGxpbmUgdXNpbmcgdGhlIENpc2NvIEhETEMuCisKKwkgIC0gU3VwcG9ydHMgRHVhbCBQb3J0IENpc2NvIEhETEMgb24gdGhlIFM1MTQtUENJL1M1MDgtSVNBIGNhcmRzCisJICB3aGljaCBhbGxvd3MgdXNlciB0byBidWlsZCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIEhETEMgc3RyZWFtaW5nIEFQSS4KKworCSAgLSBDSERMQyBTdHJlYW1pbmcgTVVMVElMSU5LIFBQUCB0aGF0IGNhbiBiaW5kIG11bHRpcGxlIFdBTlBJUEUgVDEKKwkgIGNhcmRzIGludG8gYSBzaW5nbGUgbG9naWNhbCBjaGFubmVsLgorCisJICBTYXkgWSBhbmQgdGhlIENpc2NvIEhETEMgc3VwcG9ydCwgSERMQyBzdHJlYW1pbmcgQVBJIGFuZAorCSAgTVVMVElMSU5LIFBQUCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkcml2ZXIuCisKK2NvbmZpZyBXQU5QSVBFX0ZSCisJYm9vbCAiV0FOUElQRSBGcmFtZSBSZWxheSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVkVORE9SX1NBTkdPTUEKKwloZWxwCisJICBDb25uZWN0IGEgV0FOUElQRSBjYXJkIHRvIGEgRnJhbWUgUmVsYXkgbmV0d29yaywgb3IgdXNlIEZyYW1lIEZlbGF5CisJICBBUEkgdG8gZGV2ZWxvcCBjdXN0b20gYXBwbGljYXRpb25zLgorCisJICBDb250YWlucyB0aGUgRXRoZXJuZXQgQnJpZGdpbmcgb3ZlciBGcmFtZSBSZWxheSBmZWF0dXJlLCB3aGVyZQorCSAgYSBXQU5QSVBFIGZyYW1lIHJlbGF5IGxpbmsgY2FuIGJlIGRpcmVjdGx5IGNvbm5lY3RlZCB0byB0aGUgTGludXgKKwkgIGtlcm5lbCBicmlkZ2UuIFRoZSBGcmFtZSBSZWxheSBvcHRpb24gaXMgc3VwcG9ydGVkIG9uIFM1MTQtUENJCisJICBhbmQgUzUwOC1JU0EgY2FyZHMuCisKKwkgIFNheSBZIGFuZCB0aGUgRnJhbWUgUmVsYXkgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkcml2ZXIuCisKK2NvbmZpZyBXQU5QSVBFX1gyNQorCWJvb2wgIldBTlBJUEUgWC4yNSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVkVORE9SX1NBTkdPTUEKKwloZWxwCisJICBDb25uZWN0IGEgV0FOUElQRSBjYXJkIHRvIGFuIFguMjUgbmV0d29yay4KKworCSAgSW5jbHVkZXMgdGhlIFguMjUgQVBJIHN1cHBvcnQgZm9yIGN1c3RvbSBhcHBsaWNhdGlvbnMgb3ZlciB0aGUKKwkgIFguMjUgcHJvdG9jb2wuIFRoZSBYLjI1IG9wdGlvbiBpcyBzdXBwb3J0ZWQgb24gUzUxNC1QQ0kgYW5kCisJICBTNTA4LUlTQSBjYXJkcy4KKworCSAgU2F5IFkgYW5kIHRoZSBYLjI1IHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZHJpdmVyLgorCitjb25maWcgV0FOUElQRV9QUFAKKwlib29sICJXQU5QSVBFIFBQUCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVkVORE9SX1NBTkdPTUEKKwloZWxwCisJICBDb25uZWN0IGEgV0FOUElQRSBjYXJkIHRvIGEgbGVhc2VkIGxpbmUgdXNpbmcgUG9pbnQtdG8tUG9pbnQKKwkgIFByb3RvY29sIChQUFApLgorCisJICBUaGUgUFBQIG9wdGlvbiBpcyBzdXBwb3J0ZWQgb24gUzUxNC1QQ0kvUzUwOC1JU0EgY2FyZHMuCisKKwkgIFNheSBZIGFuZCB0aGUgUFBQIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZHJpdmVyLgorCitjb25maWcgV0FOUElQRV9NVUxUUFBQCisJYm9vbCAiV0FOUElQRSBNdWx0aS1Qb3J0IFBQUCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVkVORE9SX1NBTkdPTUEKKwloZWxwCisJICBDb25uZWN0IGEgV0FOUElQRSBjYXJkIHRvIGEgbGVhc2VkIGxpbmUgdXNpbmcgUG9pbnQtdG8tUG9pbnQKKwkgIFByb3RvY29sIChQUFApLgorCisJICBVc2VzIGluLWtlcm5lbCBTeW5jUFBQIHByb3RvY29sIG92ZXIgdGhlIFNhbmdvbWEgSERMQyBTdHJlYW1pbmcKKwkgIGFkYXB0ZXIuIEluIHRoaXMgY2FzZSBlYWNoIFNhbmdvbWEgYWRhcHRlciBwb3J0IGNhbiBzdXBwb3J0IGFuCisJICBpbmRlcGVuZGVudCBQUFAgY29ubmVjdGlvbi4gRm9yIGV4YW1wbGUsIGEgc2luZ2xlIFF1YWQtUG9ydCBQQ0kKKwkgIGFkYXB0ZXIgY2FuIHN1cHBvcnQgdXAgdG8gZm91ciBpbmRlcGVuZGVudCBQUFAgbGlua3MuIFRoZSBQUFAKKwkgIG9wdGlvbiBpcyBzdXBwb3J0ZWQgb24gUzUxNC1QQ0kvUzUwOC1JU0EgY2FyZHMuCisKKwkgIFNheSBZIGFuZCB0aGUgTXVsdGktUG9ydCBQUFAgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkcml2ZXIuCisKK2NvbmZpZyBDWUNMQURFU19TWU5DCisJdHJpc3RhdGUgIkN5Y2xvbSAyWCh0bSkgY2FyZHMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBXQU5fUk9VVEVSX0RSSVZFUlMgJiYgKFBDSSB8fCBJU0EpCisJLS0taGVscC0tLQorCSAgQ3ljbG9tIDJYIGZyb20gQ3ljbGFkZXMgQ29ycG9yYXRpb24gPGh0dHA6Ly93d3cuY3ljbGFkZXMuY29tLz4gaXMgYW4KKwkgIGludGVsbGlnZW50IG11bHRpcHJvdG9jb2wgV0FOIGFkYXB0ZXIgd2l0aCBkYXRhIHRyYW5zZmVyIHJhdGVzIHVwIHRvCisJICA1MTIgS2Jwcy4gVGhlc2UgY2FyZHMgc3VwcG9ydCB0aGUgWC4yNSBhbmQgU05BIHJlbGF0ZWQgcHJvdG9jb2xzLgorCisJICBXaGlsZSBubyBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBhdCB0aGlzIHRpbWUgcGxlYXNlIGdyYWIgdGhlCisJICB3YW5jb25maWcgdGFyYmFsbCBpbgorCSAgPGh0dHA6Ly93d3cuY29uZWN0aXZhLmNvbS5ici9+YWNtZS9jeWNzeW4tZGV2ZWwvPiAod2l0aCBtaW5vciBjaGFuZ2VzCisJICB0byBtYWtlIGl0IGNvbXBpbGUgd2l0aCB0aGUgY3VycmVudCB3YW5yb3V0ZXIgaW5jbHVkZSBmaWxlczsgZWZmb3J0cworCSAgYXJlIGJlaW5nIG1hZGUgdG8gdXNlIHRoZSBvcmlnaW5hbCBwYWNrYWdlIGF2YWlsYWJsZSBhdAorCSAgPGZ0cDovL2Z0cC5zYW5nb21hLmNvbS8+KS4KKworCSAgRmVlbCBmcmVlIHRvIGNvbnRhY3QgbWUgb3IgdGhlIGN5Y3N5bi1kZXZlbCBtYWlsaW5nIGxpc3QgYXQKKwkgIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+IGFuZCA8Y3ljc3luLWRldmVsQGJhemFyLmNvbmVjdGl2YS5jb20uYnI+IGZvcgorCSAgYWRkaXRpb25hbCBkZXRhaWxzLCBJIGhvcGUgdG8gaGF2ZSBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhcyBzb29uIGFzCisJICBwb3NzaWJsZS4gKEN5Y2xhZGVzIEJyYXppbCBpcyB3cml0aW5nIHRoZSBEb2N1bWVudGF0aW9uKS4KKworCSAgVGhlIG5leHQgcXVlc3Rpb25zIHdpbGwgYXNrIHlvdSBhYm91dCB0aGUgcHJvdG9jb2xzIHlvdSB3YW50IHRoZQorCSAgZHJpdmVyIHRvIHN1cHBvcnQgKGZvciBub3cgb25seSBYLjI1IGlzIHN1cHBvcnRlZCkuCisKKwkgIElmIHlvdSBoYXZlIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhcmRzLCBzYXkgWSB0byB0aGlzIG9wdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3ljbG9teC4KKworY29uZmlnIENZQ0xPTVhfWDI1CisJYm9vbCAiQ3ljbG9tIDJYIFguMjUgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIENZQ0xBREVTX1NZTkMKKwloZWxwCisJICBDb25uZWN0IGEgQ3ljbG9tIDJYIGNhcmQgdG8gYW4gWC4yNSBuZXR3b3JrLgorCisJICBFbmFibGluZyBYLjI1IHN1cHBvcnQgd2lsbCBlbmxhcmdlIHlvdXIga2VybmVsIGJ5IGFib3V0IDExIGtCLgorCisjIFguMjUgbmV0d29yayBkcml2ZXJzCitjb25maWcgTEFQQkVUSEVSCisJdHJpc3RhdGUgIkxBUEIgb3ZlciBFdGhlcm5ldCBkcml2ZXIgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBXQU4gJiYgTEFQQiAmJiBYMjUKKwktLS1oZWxwLS0tCisJICBEcml2ZXIgZm9yIGEgcHNldWRvIGRldmljZSAodHlwaWNhbGx5IGNhbGxlZCAvZGV2L2xhcGIwKSB3aGljaCBhbGxvd3MKKwkgIHlvdSB0byBvcGVuIGFuIExBUEIgcG9pbnQtdG8tcG9pbnQgY29ubmVjdGlvbiB0byBzb21lIG90aGVyIGNvbXB1dGVyCisJICBvbiB5b3VyIEV0aGVybmV0IG5ldHdvcmsuCisKKwkgIEluIG9yZGVyIHRvIGRvIHRoaXMsIHlvdSBuZWVkIHRvIHNheSBZIG9yIE0gdG8gdGhlIGRyaXZlciBmb3IgeW91cgorCSAgRXRoZXJuZXQgY2FyZCBhcyB3ZWxsIGFzIHRvICJMQVBCIERhdGEgTGluayBEcml2ZXIiLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBsYXBiZXRoZXIuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBYMjVfQVNZCisJdHJpc3RhdGUgIlguMjUgYXN5bmMgZHJpdmVyIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gV0FOICYmIExBUEIgJiYgWDI1CisJLS0taGVscC0tLQorCSAgU2VuZCBhbmQgcmVjZWl2ZSBYLjI1IGZyYW1lcyBvdmVyIHJlZ3VsYXIgYXN5bmNocm9ub3VzIHNlcmlhbAorCSAgbGluZXMgc3VjaCBhcyB0ZWxlcGhvbmUgbGluZXMgZXF1aXBwZWQgd2l0aCBvcmRpbmFyeSBtb2RlbXMuCisKKwkgIEV4cGVydHMgc2hvdWxkIG5vdGUgdGhhdCB0aGlzIGRyaXZlciBkb2Vzbid0IGN1cnJlbnRseSBjb21wbHkgd2l0aAorCSAgdGhlIGFzeW5jaHJvbm91cyBIRExTIGZyYW1pbmcgcHJvdG9jb2xzIGluIENDSVRUIHJlY29tbWVuZGF0aW9uIFguMjUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHgyNV9hc3kuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTQk5JCisJdHJpc3RhdGUgIkdyYW5jaCBTQk5JMTIgTGVhc2VkIExpbmUgYWRhcHRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0FOICYmIFg4NgorCS0tLWhlbHAtLS0KKwkgIERyaXZlciBmb3IgSVNBIFNCTkkxMi14eCBjYXJkcyB3aGljaCBhcmUgbG93IGNvc3QgYWx0ZXJuYXRpdmVzIHRvCisJICBsZWFzZWQgbGluZSBtb2RlbXMuCisKKwkgIFlvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIGFuZCBsYXN0IHZlcnNpb25zIG9mIGRyaXZlcnMgYW5kCisJICB1dGlsaXRpZXMgYXQgPGh0dHA6Ly93d3cuZ3JhbmNoLnJ1Lz4uIElmIHlvdSBoYXZlIGFueSBxdWVzdGlvbiB5b3UKKwkgIGNhbiBzZW5kIGVtYWlsIHRvIDxzYm5pQGdyYW5jaC5ydT4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNibmkuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTQk5JX01VTFRJTElORQorCWJvb2wgIk11bHRpcGxlIGxpbmUgZmVhdHVyZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0JOSQorCWhlbHAKKwkgIFNjaGVkdWxlIHRyYWZmaWMgZm9yIHNvbWUgcGFyYWxsZWwgbGluZXMsIHZpYSBTQk5JMTIgYWRhcHRlcnMuCisKKwkgIElmIHlvdSBoYXZlIHR3byBjb21wdXRlcnMgY29ubmVjdGVkIHdpdGggdHdvIHBhcmFsbGVsIGxpbmVzIGl0J3MKKwkgIHBvc3NpYmxlIHRvIGluY3JlYXNlIHRyYW5zZmVyIHJhdGUgbmVhcmx5IHR3aWNlLiBZb3Ugc2hvdWxkIGhhdmUKKwkgIGEgcHJvZ3JhbSBuYW1lZCAnc2JuaWNvbmZpZycgdG8gY29uZmlndXJlIGFkYXB0ZXJzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitlbmRtZW51CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dhbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTZjNTZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL01ha2VmaWxlCkBAIC0wLDAgKzEsODYgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBuZXR3b3JrICh3YW4pIGRldmljZSBkcml2ZXJzLgorIworIyAzIEF1ZyAyMDAwLCBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGluZnJhZGVhZC5vcmc+CisjIFJld3JpdHRlbiB0byB1c2UgbGlzdHMgaW5zdGVhZCBvZiBpZi1zdGF0ZW1lbnRzLgorIworCit3YW5waXBlLXkJCQk6PSBzZGxhbWFpbi5vIHNkbGFfZnQxLm8KK3dhbnBpcGUtJChDT05GSUdfV0FOUElQRV9YMjUpCSs9IHNkbGFfeDI1Lm8KK3dhbnBpcGUtJChDT05GSUdfV0FOUElQRV9GUikJKz0gc2RsYV9mci5vCit3YW5waXBlLSQoQ09ORklHX1dBTlBJUEVfQ0hETEMpCSs9IHNkbGFfY2hkbGMubword2FucGlwZS0kKENPTkZJR19XQU5QSVBFX1BQUCkJKz0gc2RsYV9wcHAubword2FucGlwZS0kKENPTkZJR19XQU5QSVBFX01VTFRQUFApICs9IHdhbnBpcGVfbXVsdHBwcC5vCit3YW5waXBlLW9ianMJCQk6PSAkKHdhbnBpcGUteSkKKworY3ljbG9teC15ICAgICAgICAgICAgICAgICAgICAgICA6PSBjeWN4X21haW4ubworY3ljbG9teC0kKENPTkZJR19DWUNMT01YX1gyNSkJKz0gY3ljeF94MjUubworY3ljbG9teC1vYmpzCQkJOj0gJChjeWNsb214LXkpICAKKworaGRsYy15CQkJCTo9IGhkbGNfZ2VuZXJpYy5vCitoZGxjLSQoQ09ORklHX0hETENfUkFXKQkJKz0gaGRsY19yYXcubworaGRsYy0kKENPTkZJR19IRExDX1JBV19FVEgpCSs9IGhkbGNfcmF3X2V0aC5vCitoZGxjLSQoQ09ORklHX0hETENfQ0lTQ08pCSs9IGhkbGNfY2lzY28ubworaGRsYy0kKENPTkZJR19IRExDX0ZSKQkJKz0gaGRsY19mci5vCitoZGxjLSQoQ09ORklHX0hETENfUFBQKQkJKz0gaGRsY19wcHAubworaGRsYy0kKENPTkZJR19IRExDX1gyNSkJCSs9IGhkbGNfeDI1Lm8KK2hkbGMtb2JqcwkJCTo9ICQoaGRsYy15KQorCitwYzMwMC15CQkJCTo9IHBjMzAwX2Rydi5vCitwYzMwMC0kKENPTkZJR19QQzMwMF9NTFBQUCkJKz0gcGMzMDBfdHR5Lm8KK3BjMzAwLW9ianMJCQk6PSAkKHBjMzAwLXkpCisKK29iai0kKENPTkZJR19IT1NURVNTX1NWMTEpCSs9IHo4NTIzMC5vCXN5bmNwcHAubwlob3N0ZXNzX3N2MTEubworb2JqLSQoQ09ORklHX1NFQUxFVkVMXzQwMjEpCSs9IHo4NTIzMC5vCXN5bmNwcHAubwlzZWFsZXZlbC5vCitvYmotJChDT05GSUdfQ09TQSkJCSs9CQlzeW5jcHBwLm8JY29zYS5vCitvYmotJChDT05GSUdfRkFSU1lOQykJCSs9CQlzeW5jcHBwLm8JZmFyc3luYy5vCitvYmotJChDT05GSUdfRFNDQzQpICAgICAgICAgICAgICs9CQkJCWRzY2M0Lm8KK29iai0kKENPTkZJR19MQU5NRURJQSkJCSs9CQlzeW5jcHBwLm8KK29iai0kKENPTkZJR19TWU5DTElOS19TWU5DUFBQKQkrPQkJc3luY3BwcC5vCitvYmotJChDT05GSUdfWDI1X0FTWSkJCSs9IHgyNV9hc3kubworCitvYmotJChDT05GSUdfTEFOTUVESUEpCQkrPSBsbWMvCisKK29iai0kKENPTkZJR19ETENJKQkJKz0gZGxjaS5vIAorb2JqLSQoQ09ORklHX1NETEEpCQkrPSBzZGxhLm8KK2lmZXEgKCQoQ09ORklHX1dBTlBJUEVfTVVMVFBQUCkseSkKKyAgb2JqLSQoQ09ORklHX1ZFTkRPUl9TQU5HT01BKSArPSBzZGxhZHJ2Lm8gd2FucGlwZS5vIHN5bmNwcHAubwkKK2Vsc2UKKyAgb2JqLSQoQ09ORklHX1ZFTkRPUl9TQU5HT01BKSArPSBzZGxhZHJ2Lm8gd2FucGlwZS5vCitlbmRpZgorb2JqLSQoQ09ORklHX0NZQ0xBREVTX1NZTkMpCSs9IGN5Y3hfZHJ2Lm8gY3ljbG9teC5vCitvYmotJChDT05GSUdfTEFQQkVUSEVSKQkJKz0gbGFwYmV0aGVyLm8KK29iai0kKENPTkZJR19TQk5JKQkJKz0gc2JuaS5vCitvYmotJChDT05GSUdfUEMzMDApCQkrPSBwYzMwMC5vCitvYmotJChDT05GSUdfSERMQykJCSs9IGhkbGMubworaWZlcSAoJChDT05GSUdfSERMQ19QUFApLHkpCisgIG9iai0kKENPTkZJR19IRExDKQkJKz0gc3luY3BwcC5vCitlbmRpZgorb2JqLSQoQ09ORklHX04yKQkJKz0gbjIubworb2JqLSQoQ09ORklHX0MxMDEpCQkrPSBjMTAxLm8KK29iai0kKENPTkZJR19XQU5YTCkJCSs9IHdhbnhsLm8KK29iai0kKENPTkZJR19QQ0kyMDBTWU4pCQkrPSBwY2kyMDBzeW4ubworCitjbGVhbi1maWxlcyA6PSB3YW54bGZ3LmluYworJChvYmopL3dhbnhsLm86CSQob2JqKS93YW54bGZ3LmluYworCitpZmVxICgkKENPTkZJR19XQU5YTF9CVUlMRF9GSVJNV0FSRSkseSkKK2lmZXEgKCQoQVJDSCksbTY4aykKKyAgQVM2OEsgPSAkKEFTKQorICBMRDY4SyA9ICQoTEQpCitlbHNlCisgIEFTNjhLID0gYXM2OGsKKyAgTEQ2OEsgPSBsZDY4aworZW5kaWYKKworcXVpZXRfY21kX2J1aWxkX3dhbnhsZncgPSBCTEQgRlcgICRACisgICAgICBjbWRfYnVpbGRfd2FueGxmdyA9IFwKKwkkKENQUCkgLVdwLC1NRCwkKGRlcGZpbGUpIC1JJChzcmN0cmVlKS9pbmNsdWRlICQ8IHwgJChBUzY4SykgLW02ODM2MCAtbyAkKG9iaikvd2FueGxmdy5vOyBcCisJJChMRDY4SykgLS1vZm9ybWF0IGJpbmFyeSAtVHRleHQgMHgxMDAwICQob2JqKS93YW54bGZ3Lm8gLW8gJChvYmopL3dhbnhsZncuYmluOyBcCisJaGV4ZHVtcCAtdmUgJyJcbiIgMTYvMSAiMHglMDJYLCInICQob2JqKS93YW54bGZ3LmJpbiB8IHNlZCAncy8weCAgLC8vZzsxcy9eL3N0YXRpYyB1OCBmaXJtd2FyZVtdPXsvOyQkcy8sJCQvXG59O1xuLycgPiQob2JqKS93YW54bGZ3LmluYzsgXAorCXJtIC1mICQob2JqKS93YW54bGZ3LmJpbiAkKG9iaikvd2FueGxmdy5vCisKKyQob2JqKS93YW54bGZ3LmluYzoJJChzcmMpL3dhbnhsZncuUworCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxidWlsZF93YW54bGZ3KQordGFyZ2V0cyArPSB3YW54bGZ3LmluYworZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9jMTAxLmMgYi9kcml2ZXJzL25ldC93YW4vYzEwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDg1NGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vYzEwMS5jCkBAIC0wLDAgKzEsNDQ2IEBACisvKgorICogTW94YSBDMTAxIHN5bmNocm9ub3VzIHNlcmlhbCBjYXJkIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogRm9yIGluZm9ybWF0aW9uIHNlZSBodHRwOi8vaHEucG0ud2F3LnBsL2hkbGMvCisgKgorICogU291cmNlcyBvZiBpbmZvcm1hdGlvbjoKKyAqICAgIEhpdGFjaGkgSEQ2NDU3MCBTQ0EgVXNlcidzIE1hbnVhbAorICogICAgTW94YSBDMTAxIFVzZXIncyBNYW51YWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgImhkNjQ1NzAuaCIKKworCitzdGF0aWMgY29uc3QgY2hhciogdmVyc2lvbiA9ICJNb3hhIEMxMDEgZHJpdmVyIHZlcnNpb246IDEuMTUiOworc3RhdGljIGNvbnN0IGNoYXIqIGRldm5hbWUgPSAiQzEwMSI7CisKKyN1bmRlZiBERUJVR19QS1QKKyNkZWZpbmUgREVCVUdfUklOR1MKKworI2RlZmluZSBDMTAxX1BBR0UgMHgxRDAwCisjZGVmaW5lIEMxMDFfRFRSIDB4MUUwMAorI2RlZmluZSBDMTAxX1NDQSAweDFGMDAKKyNkZWZpbmUgQzEwMV9XSU5ET1dfU0laRSAweDIwMDAKKyNkZWZpbmUgQzEwMV9NQVBQRURfUkFNX1NJWkUgMHg0MDAwCisKKyNkZWZpbmUgUkFNX1NJWkUgKDI1NiAqIDEwMjQpCisjZGVmaW5lIFRYX1JJTkdfQlVGRkVSUyAxMAorI2RlZmluZSBSWF9SSU5HX0JVRkZFUlMgKChSQU1fU0laRSAtIEMxMDFfV0lORE9XX1NJWkUpIC8JCVwKKwkJCSAoc2l6ZW9mKHBrdF9kZXNjKSArIEhETENfTUFYX01SVSkgLSBUWF9SSU5HX0JVRkZFUlMpCisKKyNkZWZpbmUgQ0xPQ0tfQkFTRSA5ODMwNDAwCS8qIDkuODMwNCBNSHogKi8KKyNkZWZpbmUgUEFHRTBfQUxXQVlTX01BUFBFRAorCitzdGF0aWMgY2hhciAqaHc7CQkvKiBwb2ludGVyIHRvIGh3PXh4eCBjb21tYW5kIGxpbmUgc3RyaW5nICovCisKKwordHlwZWRlZiBzdHJ1Y3QgY2FyZF9zIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXNwaW5sb2NrX3QgbG9jazsJLyogVFggbG9jayAqLworCXU4IF9faW9tZW0gKndpbjBiYXNlOwkvKiBJU0Egd2luZG93IGJhc2UgYWRkcmVzcyAqLworCXUzMiBwaHlfd2luYmFzZTsJLyogSVNBIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyAqLworCXN5bmNfc2VyaWFsX3NldHRpbmdzIHNldHRpbmdzOworCWludCByeHBhcnQ7CQkvKiBwYXJ0aWFsIGZyYW1lIHJlY2VpdmVkLCBuZXh0IGZyYW1lIGludmFsaWQqLworCXVuc2lnbmVkIHNob3J0IGVuY29kaW5nOworCXVuc2lnbmVkIHNob3J0IHBhcml0eTsKKwl1MTYgcnhfcmluZ19idWZmZXJzOwkvKiBudW1iZXIgb2YgYnVmZmVycyBpbiBhIHJpbmcgKi8KKwl1MTYgdHhfcmluZ19idWZmZXJzOworCXUxNiBidWZmX29mZnNldDsJLyogb2Zmc2V0IG9mIGZpcnN0IGJ1ZmZlciBvZiBmaXJzdCBjaGFubmVsICovCisJdTE2IHJ4aW47CQkvKiByeCByaW5nIGJ1ZmZlciAnaW4nIHBvaW50ZXIgKi8KKwl1MTYgdHhpbjsJCS8qIHR4IHJpbmcgYnVmZmVyICdpbicgYW5kICdsYXN0JyBwb2ludGVycyAqLworCXUxNiB0eGxhc3Q7CisJdTggcnhzLCB0eHMsIHRtYzsJLyogU0NBIHJlZ2lzdGVycyAqLworCXU4IGlycTsJCQkvKiBJUlEgKDMtMTUpICovCisJdTggcGFnZTsKKworCXN0cnVjdCBjYXJkX3MgKm5leHRfY2FyZDsKK31jYXJkX3Q7CisKK3R5cGVkZWYgY2FyZF90IHBvcnRfdDsKKworc3RhdGljIGNhcmRfdCAqZmlyc3RfY2FyZDsKK3N0YXRpYyBjYXJkX3QgKipuZXdfY2FyZCA9ICZmaXJzdF9jYXJkOworCisKKyNkZWZpbmUgc2NhX2luKHJlZywgY2FyZCkJICAgcmVhZGIoKGNhcmQpLT53aW4wYmFzZSArIEMxMDFfU0NBICsgKHJlZykpCisjZGVmaW5lIHNjYV9vdXQodmFsdWUsIHJlZywgY2FyZCkgIHdyaXRlYih2YWx1ZSwgKGNhcmQpLT53aW4wYmFzZSArIEMxMDFfU0NBICsgKHJlZykpCisjZGVmaW5lIHNjYV9pbncocmVnLCBjYXJkKQkgICByZWFkdygoY2FyZCktPndpbjBiYXNlICsgQzEwMV9TQ0EgKyAocmVnKSkKKworLyogRURBIGFkZHJlc3MgcmVnaXN0ZXIgbXVzdCBiZSBzZXQgaW4gRURBTCwgRURBSCBvcmRlciAtIDggYml0IElTQSBidXMgKi8KKyNkZWZpbmUgc2NhX291dHcodmFsdWUsIHJlZywgY2FyZCkgZG8geyBcCisJd3JpdGViKHZhbHVlICYgMHhGRiwgKGNhcmQpLT53aW4wYmFzZSArIEMxMDFfU0NBICsgKHJlZykpOyBcCisJd3JpdGViKCh2YWx1ZSA+PiA4ICkgJiAweEZGLCAoY2FyZCktPndpbjBiYXNlICsgQzEwMV9TQ0EgKyAocmVnKzEpKTtcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgcG9ydF90b19jYXJkKHBvcnQpCSAgIChwb3J0KQorI2RlZmluZSBsb2dfbm9kZShwb3J0KQkJICAgKDApCisjZGVmaW5lIHBoeV9ub2RlKHBvcnQpCQkgICAoMCkKKyNkZWZpbmUgd2luc2l6ZShjYXJkKQkJICAgKEMxMDFfV0lORE9XX1NJWkUpCisjZGVmaW5lIHdpbjBiYXNlKGNhcmQpCQkgICAoKGNhcmQpLT53aW4wYmFzZSkKKyNkZWZpbmUgd2luYmFzZShjYXJkKSAgICAgIAkgICAoKGNhcmQpLT53aW4wYmFzZSArIDB4MjAwMCkKKyNkZWZpbmUgZ2V0X3BvcnQoY2FyZCwgcG9ydCkJICAgKGNhcmQpCitzdGF0aWMgdm9pZCBzY2FfbXNjaV9pbnRyKHBvcnRfdCAqcG9ydCk7CisKKworc3RhdGljIGlubGluZSB1OCBzY2FfZ2V0X3BhZ2UoY2FyZF90ICpjYXJkKQoreworCXJldHVybiBjYXJkLT5wYWdlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3BlbndpbihjYXJkX3QgKmNhcmQsIHU4IHBhZ2UpCit7CisJY2FyZC0+cGFnZSA9IHBhZ2U7CisJd3JpdGViKHBhZ2UsIGNhcmQtPndpbjBiYXNlICsgQzEwMV9QQUdFKTsKK30KKworCisjaW5jbHVkZSAiaGQ2NDU3eC5jIgorCisKK3N0YXRpYyB2b2lkIHNjYV9tc2NpX2ludHIocG9ydF90ICpwb3J0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0X3RvX2Rldihwb3J0KTsKKwljYXJkX3QqIGNhcmQgPSBwb3J0X3RvX2NhcmQocG9ydCk7CisJdTggc3RhdCA9IHNjYV9pbihNU0NJMV9PRkZTRVQgKyBTVDEsIGNhcmQpOyAvKiByZWFkIE1TQ0kgU1QxIHN0YXR1cyAqLworCisJLyogUmVzZXQgTVNDSSBUWCB1bmRlcnJ1biBzdGF0dXMgYml0ICovCisJc2NhX291dChzdGF0ICYgU1QxX1VEUk4sIE1TQ0kwX09GRlNFVCArIFNUMSwgY2FyZCk7CisKKwlpZiAoc3RhdCAmIFNUMV9VRFJOKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOyAvKiBUWCBVbmRlcnJ1biBlcnJvciBkZXRlY3RlZCAqLworCQlzdGF0cy0+dHhfZmlmb19lcnJvcnMrKzsKKwl9CisKKwkvKiBSZXNldCBNU0NJIENEQ0Qgc3RhdHVzIGJpdCAtIHVzZXMgY2gjMiBEQ0QgaW5wdXQgKi8KKwlzY2Ffb3V0KHN0YXQgJiBTVDFfQ0RDRCwgTVNDSTFfT0ZGU0VUICsgU1QxLCBjYXJkKTsKKworCWlmIChzdGF0ICYgU1QxX0NEQ0QpCisJCWhkbGNfc2V0X2NhcnJpZXIoIShzY2FfaW4oTVNDSTFfT0ZGU0VUICsgU1QzLCBjYXJkKSAmIFNUM19EQ0QpLAorCQkJCSBkZXYpOworfQorCisKK3N0YXRpYyB2b2lkIGMxMDFfc2V0X2lmYWNlKHBvcnRfdCAqcG9ydCkKK3sKKwl1OCByeHMgPSBwb3J0LT5yeHMgJiBDTEtfQlJHX01BU0s7CisJdTggdHhzID0gcG9ydC0+dHhzICYgQ0xLX0JSR19NQVNLOworCisJc3dpdGNoKHBvcnQtPnNldHRpbmdzLmNsb2NrX3R5cGUpIHsKKwljYXNlIENMT0NLX0lOVDoKKwkJcnhzIHw9IENMS19CUkdfUlg7IC8qIFRYIGNsb2NrICovCisJCXR4cyB8PSBDTEtfUlhDTEtfVFg7IC8qIEJSRyBvdXRwdXQgKi8KKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX1RYSU5UOgorCQlyeHMgfD0gQ0xLX0xJTkVfUlg7IC8qIFJYQyBpbnB1dCAqLworCQl0eHMgfD0gQ0xLX0JSR19UWDsgLyogQlJHIG91dHB1dCAqLworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfVFhGUk9NUlg6CisJCXJ4cyB8PSBDTEtfTElORV9SWDsgLyogUlhDIGlucHV0ICovCisJCXR4cyB8PSBDTEtfUlhDTEtfVFg7IC8qIFJYIGNsb2NrICovCisJCWJyZWFrOworCisJZGVmYXVsdDoJLyogRVhUZXJuYWwgY2xvY2sgKi8KKwkJcnhzIHw9IENMS19MSU5FX1JYOyAvKiBSWEMgaW5wdXQgKi8KKwkJdHhzIHw9IENMS19MSU5FX1RYOyAvKiBUWEMgaW5wdXQgKi8KKwl9CisKKwlwb3J0LT5yeHMgPSByeHM7CisJcG9ydC0+dHhzID0gdHhzOworCXNjYV9vdXQocnhzLCBNU0NJMV9PRkZTRVQgKyBSWFMsIHBvcnQpOworCXNjYV9vdXQodHhzLCBNU0NJMV9PRkZTRVQgKyBUWFMsIHBvcnQpOworCXNjYV9zZXRfcG9ydChwb3J0KTsKK30KKworCitzdGF0aWMgaW50IGMxMDFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGhkbGNfb3BlbihkZXYpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwl3cml0ZWIoMSwgcG9ydC0+d2luMGJhc2UgKyBDMTAxX0RUUik7CisJc2NhX291dCgwLCBNU0NJMV9PRkZTRVQgKyBDVEwsIHBvcnQpOyAvKiBSVFMgdXNlcyBjaCMyIG91dHB1dCAqLworCXNjYV9vcGVuKGRldik7CisJLyogRENEIGlzIGNvbm5lY3RlZCB0byBwb3J0IDIgIUAjJCVeJiAtIGRpc2FibGUgTVNDSTAgQ0RDRCBpbnRlcnJ1cHQgKi8KKwlzY2Ffb3V0KElFMV9VRFJOLCBNU0NJMF9PRkZTRVQgKyBJRTEsIHBvcnQpOworCXNjYV9vdXQoSUUwX1RYSU5ULCBNU0NJMF9PRkZTRVQgKyBJRTAsIHBvcnQpOworCisJaGRsY19zZXRfY2FycmllcighKHNjYV9pbihNU0NJMV9PRkZTRVQgKyBTVDMsIHBvcnQpICYgU1QzX0RDRCksIGRldik7CisJcHJpbnRrKEtFUk5fREVCVUcgIjB4JVhcbiIsIHNjYV9pbihNU0NJMV9PRkZTRVQgKyBTVDMsIHBvcnQpKTsKKworCS8qIGVuYWJsZSBNU0NJMSBDRENEIGludGVycnVwdCAqLworCXNjYV9vdXQoSUUxX0NEQ0QsIE1TQ0kxX09GRlNFVCArIElFMSwgcG9ydCk7CisJc2NhX291dChJRTBfUlhJTlRBLCBNU0NJMV9PRkZTRVQgKyBJRTAsIHBvcnQpOworCXNjYV9vdXQoMHg0OCwgSUVSMCwgcG9ydCk7IC8qIFRYSU5UICMwIGFuZCBSWElOVCAjMSAqLworCWMxMDFfc2V0X2lmYWNlKHBvcnQpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYzEwMV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisKKwlzY2FfY2xvc2UoZGV2KTsKKwl3cml0ZWIoMCwgcG9ydC0+d2luMGJhc2UgKyBDMTAxX0RUUik7CisJc2NhX291dChDVExfTk9SVFMsIE1TQ0kxX09GRlNFVCArIENUTCwgcG9ydCk7CisJaGRsY19jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYzEwMV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihzeW5jX3NlcmlhbF9zZXR0aW5ncyk7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgbmV3X2xpbmU7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgX191c2VyICpsaW5lID0gaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYzsKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCisjaWZkZWYgREVCVUdfUklOR1MKKwlpZiAoY21kID09IFNJT0NERVZQUklWQVRFKSB7CisJCXNjYV9kdW1wX3JpbmdzKGRldik7CisJCXByaW50ayhLRVJOX0RFQlVHICJNU0NJMTogU1Q6ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCSAgICAgICBzY2FfaW4oTVNDSTFfT0ZGU0VUICsgU1QwLCBwb3J0KSwKKwkJICAgICAgIHNjYV9pbihNU0NJMV9PRkZTRVQgKyBTVDEsIHBvcnQpLAorCQkgICAgICAgc2NhX2luKE1TQ0kxX09GRlNFVCArIFNUMiwgcG9ydCksCisJCSAgICAgICBzY2FfaW4oTVNDSTFfT0ZGU0VUICsgU1QzLCBwb3J0KSk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCWlmIChjbWQgIT0gU0lPQ1dBTkRFVikKKwkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisKKwlzd2l0Y2goaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX0lGQUNFOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfU1lOQ19TRVJJQUw7CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGxpbmUsICZwb3J0LT5zZXR0aW5ncywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX0lGQUNFX1NZTkNfU0VSSUFMOgorCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfbGluZSwgbGluZSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAobmV3X2xpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19FWFQgJiYKKwkJICAgIG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfVFhGUk9NUlggJiYKKwkJICAgIG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfSU5UICYmCisJCSAgICBuZXdfbGluZS5jbG9ja190eXBlICE9IENMT0NLX1RYSU5UKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogTm8gc3VjaCBjbG9jayBzZXR0aW5nICovCisKKwkJaWYgKG5ld19saW5lLmxvb3BiYWNrICE9IDAgJiYgbmV3X2xpbmUubG9vcGJhY2sgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCW1lbWNweSgmcG9ydC0+c2V0dGluZ3MsICZuZXdfbGluZSwgc2l6ZSk7IC8qIFVwZGF0ZSBzZXR0aW5ncyAqLworCQljMTAxX3NldF9pZmFjZShwb3J0KTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKwl9Cit9CisKKworCitzdGF0aWMgdm9pZCBjMTAxX2Rlc3Ryb3lfY2FyZChjYXJkX3QgKmNhcmQpCit7CisJcmVhZGIoY2FyZC0+d2luMGJhc2UgKyBDMTAxX1BBR0UpOyAvKiBSZXNldHMgU0NBPyAqLworCisJaWYgKGNhcmQtPmlycSkKKwkJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKworCWlmIChjYXJkLT53aW4wYmFzZSkgeworCQlpb3VubWFwKGNhcmQtPndpbjBiYXNlKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPnBoeV93aW5iYXNlLCBDMTAxX01BUFBFRF9SQU1fU0laRSk7CisJfQorCisJZnJlZV9uZXRkZXYoY2FyZC0+ZGV2KTsKKworCWtmcmVlKGNhcmQpOworfQorCisKKworc3RhdGljIGludCBfX2luaXQgYzEwMV9ydW4odW5zaWduZWQgbG9uZyBpcnEsIHVuc2lnbmVkIGxvbmcgd2luYmFzZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWhkbGNfZGV2aWNlICpoZGxjOworCWNhcmRfdCAqY2FyZDsKKwlpbnQgcmVzdWx0OworCisJaWYgKGlycTwzIHx8IGlycT4xNSB8fCBpcnEgPT0gNikgLyogRklYTUUgKi8geworCQlwcmludGsoS0VSTl9FUlIgImMxMDE6IGludmFsaWQgSVJRIHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHdpbmJhc2UgPCAweEMwMDAwIHx8IHdpbmJhc2UgPiAweERGRkZGIHx8ICh3aW5iYXNlICYgMHgzRkZGKSAhPTApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjMTAxOiBpbnZhbGlkIFJBTSB2YWx1ZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNhcmQgPSBrbWFsbG9jKHNpemVvZihjYXJkX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FyZCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYzEwMTogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisJbWVtc2V0KGNhcmQsIDAsIHNpemVvZihjYXJkX3QpKTsKKworCWNhcmQtPmRldiA9IGFsbG9jX2hkbGNkZXYoY2FyZCk7CisJaWYgKCFjYXJkLT5kZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjMTAxOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBzY2FfaW50ciwgMCwgZGV2bmFtZSwgY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjMTAxOiBjb3VsZCBub3QgYWxsb2NhdGUgSVJRXG4iKTsKKwkJYzEwMV9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybigtRUJVU1kpOworCX0KKwljYXJkLT5pcnEgPSBpcnE7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbih3aW5iYXNlLCBDMTAxX01BUFBFRF9SQU1fU0laRSwgZGV2bmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjMTAxOiBjb3VsZCBub3QgcmVxdWVzdCBSQU0gd2luZG93XG4iKTsKKwkJYzEwMV9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybigtRUJVU1kpOworCX0KKwljYXJkLT5waHlfd2luYmFzZSA9IHdpbmJhc2U7CisJY2FyZC0+d2luMGJhc2UgPSBpb3JlbWFwKHdpbmJhc2UsIEMxMDFfTUFQUEVEX1JBTV9TSVpFKTsKKwlpZiAoIWNhcmQtPndpbjBiYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYzEwMTogY291bGQgbm90IG1hcCBJL08gYWRkcmVzc1xuIik7CisJCWMxMDFfZGVzdHJveV9jYXJkKGNhcmQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWNhcmQtPnR4X3JpbmdfYnVmZmVycyA9IFRYX1JJTkdfQlVGRkVSUzsKKwljYXJkLT5yeF9yaW5nX2J1ZmZlcnMgPSBSWF9SSU5HX0JVRkZFUlM7CisJY2FyZC0+YnVmZl9vZmZzZXQgPSBDMTAxX1dJTkRPV19TSVpFOyAvKiBCeXRlcyAxRDAwLTFGRkYgcmVzZXJ2ZWQgKi8KKworCXJlYWRiKGNhcmQtPndpbjBiYXNlICsgQzEwMV9QQUdFKTsgLyogUmVzZXRzIFNDQT8gKi8KKwl1ZGVsYXkoMTAwKTsKKwl3cml0ZWIoMCwgY2FyZC0+d2luMGJhc2UgKyBDMTAxX1BBR0UpOworCXdyaXRlYigwLCBjYXJkLT53aW4wYmFzZSArIEMxMDFfRFRSKTsgLyogUG93ZXItdXAgZm9yIFJBTT8gKi8KKworCXNjYV9pbml0KGNhcmQsIDApOworCisJZGV2ID0gcG9ydF90b19kZXYoY2FyZCk7CisJaGRsYyA9IGRldl90b19oZGxjKGRldik7CisKKwlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+aXJxID0gaXJxOworCWRldi0+bWVtX3N0YXJ0ID0gd2luYmFzZTsKKwlkZXYtPm1lbV9lbmQgPSB3aW5iYXNlICsgQzEwMV9NQVBQRURfUkFNX1NJWkUgLSAxOworCWRldi0+dHhfcXVldWVfbGVuID0gNTA7CisJZGV2LT5kb19pb2N0bCA9IGMxMDFfaW9jdGw7CisJZGV2LT5vcGVuID0gYzEwMV9vcGVuOworCWRldi0+c3RvcCA9IGMxMDFfY2xvc2U7CisJaGRsYy0+YXR0YWNoID0gc2NhX2F0dGFjaDsKKwloZGxjLT54bWl0ID0gc2NhX3htaXQ7CisJY2FyZC0+c2V0dGluZ3MuY2xvY2tfdHlwZSA9IENMT0NLX0VYVDsKKworCXJlc3VsdCA9IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjMTAxOiB1bmFibGUgdG8gcmVnaXN0ZXIgaGRsYyBkZXZpY2VcbiIpOworCQljMTAxX2Rlc3Ryb3lfY2FyZChjYXJkKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlzY2FfaW5pdF9zeW5jX3BvcnQoY2FyZCk7IC8qIFNldCB1cCBDMTAxIG1lbW9yeSAqLworCWhkbGNfc2V0X2NhcnJpZXIoIShzY2FfaW4oTVNDSTFfT0ZGU0VUICsgU1QzLCBjYXJkKSAmIFNUM19EQ0QpLCBkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1veGEgQzEwMSBvbiBJUlEldSwiCisJICAgICAgICIgdXNpbmcgJXUgVFggKyAldSBSWCBwYWNrZXRzIHJpbmdzXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGNhcmQtPmlycSwKKwkgICAgICAgY2FyZC0+dHhfcmluZ19idWZmZXJzLCBjYXJkLT5yeF9yaW5nX2J1ZmZlcnMpOworCisJKm5ld19jYXJkID0gY2FyZDsKKwluZXdfY2FyZCA9ICZjYXJkLT5uZXh0X2NhcmQ7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IF9faW5pdCBjMTAxX2luaXQodm9pZCkKK3sKKwlpZiAoaHcgPT0gTlVMTCkgeworI2lmZGVmIE1PRFVMRQorCQlwcmludGsoS0VSTl9JTkZPICJjMTAxOiBubyBjYXJkIGluaXRpYWxpemVkXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVOT1NZUzsJLyogbm8gcGFyYW1ldGVycyBzcGVjaWZpZWQsIGFib3J0ICovCisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHZlcnNpb24pOworCisJZG8geworCQl1bnNpZ25lZCBsb25nIGlycSwgcmFtOworCisJCWlycSA9IHNpbXBsZV9zdHJ0b3VsKGh3LCAmaHcsIDApOworCisJCWlmICgqaHcrKyAhPSAnLCcpCisJCQlicmVhazsKKwkJcmFtID0gc2ltcGxlX3N0cnRvdWwoaHcsICZodywgMCk7CisKKwkJaWYgKCpodyA9PSAnOicgfHwgKmh3ID09ICdceDAnKQorCQkJYzEwMV9ydW4oaXJxLCByYW0pOworCisJCWlmICgqaHcgPT0gJ1x4MCcpCisJCQlyZXR1cm4gZmlyc3RfY2FyZCA/IDAgOiAtRU5PU1lTOworCX13aGlsZSgqaHcrKyA9PSAnOicpOworCisJcHJpbnRrKEtFUk5fRVJSICJjMTAxOiBpbnZhbGlkIGhhcmR3YXJlIHBhcmFtZXRlcnNcbiIpOworCXJldHVybiBmaXJzdF9jYXJkID8gMCA6IC1FTk9TWVM7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGMxMDFfY2xlYW51cCh2b2lkKQoreworCWNhcmRfdCAqY2FyZCA9IGZpcnN0X2NhcmQ7CisKKwl3aGlsZSAoY2FyZCkgeworCQljYXJkX3QgKnB0ciA9IGNhcmQ7CisJCWNhcmQgPSBjYXJkLT5uZXh0X2NhcmQ7CisJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UocG9ydF90b19kZXYocHRyKSk7CisJCWMxMDFfZGVzdHJveV9jYXJkKHB0cik7CisJfQorfQorCisKK21vZHVsZV9pbml0KGMxMDFfaW5pdCk7Cittb2R1bGVfZXhpdChjMTAxX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNb3hhIEMxMDEgc2VyaWFsIHBvcnQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cittb2R1bGVfcGFyYW0oaHcsIGNoYXJwLCAwNDQ0KTsJLyogaHc9aXJxLHJhbTppcnEsLi4uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vY29zYS5jIGIvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjFhNTczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYwpAQCAtMCwwICsxLDIxMDAgQEAKKy8qICRJZDogY29zYS5jLHYgMS4zMSAyMDAwLzAzLzA4IDE3OjQ3OjE2IGthcyBFeHAgJCAqLworCisvKgorICogIENvcHlyaWdodCAoQykgMTk5NS0xOTk3ICBKYW4gIlllbnlhIiBLYXNwcnphayA8a2FzQGZpLm11bmkuY3o+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogVGhlIGRyaXZlciBmb3IgdGhlIFNSUCBhbmQgQ09TQSBzeW5jaHJvbm91cyBzZXJpYWwgY2FyZHMuCisgKgorICogSEFSRFdBUkUgSU5GTworICoKKyAqIEJvdGggY2FyZHMgYXJlIGRldmVsb3BlZCBhdCB0aGUgSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UsCisgKiBNYXNhcnlrIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuaWNzLm11bmkuY3ovKS4gVGhlIGhhcmR3YXJlIGlzCisgKiBkZXZlbG9wZWQgYnkgSmlyaSBOb3ZvdG55IDxub3ZvdG55QGljcy5tdW5pLmN6Pi4gTW9yZSBpbmZvcm1hdGlvbgorICogYW5kIHRoZSBwaG90byBvZiBib3RoIGNhcmRzIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5wYXZvdWNlay5jei9jb3NhLmh0bWwuIFRoZSBjYXJkIGRvY3VtZW50YXRpb24sIGZpcm13YXJlcworICogYW5kIG90aGVyIGdvb2RzIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gZnRwOi8vZnRwLmljcy5tdW5pLmN6L3B1Yi9jb3NhLy4KKyAqIEZvciBMaW51eC1zcGVjaWZpYyB1dGlsaXRpZXMsIHNlZSBiZWxvdyBpbiB0aGUgIlNvZnR3YXJlIGluZm8iIHNlY3Rpb24uCisgKiBJZiB5b3Ugd2FudCB0byBvcmRlciB0aGUgY2FyZCwgY29udGFjdCBKaXJpIE5vdm90bnkuCisgKgorICogVGhlIFNSUCAoc2VyaWFsIHBvcnQ/LCB0aGUgQ3plY2ggd29yZCAic3JwIiBtZWFucyAic2lja2xlIikgY2FyZAorICogaXMgYSAyLXBvcnQgaW50ZWxsaWdlbnQgKHdpdGggaXRzIG93biA4LWJpdCBDUFUpIHN5bmNocm9ub3VzIHNlcmlhbCBjYXJkCisgKiB3aXRoIFYuMjQgaW50ZXJmYWNlcyB1cCB0byA4MGtiL3MgZWFjaC4KKyAqCisgKiBUaGUgQ09TQSAoY29tbXVuaWNhdGlvbiBzZXJpYWwgYWRhcHRlcj8sIHRoZSBDemVjaCB3b3JkICJrb3NhIiBtZWFucworICogInNjeXRoZSIpIGlzIGEgbmV4dC1nZW5lcmF0aW9uIHN5bmMvYXN5bmMgYm9hcmQgd2l0aCB0d28gaW50ZXJmYWNlcworICogLSBjdXJyZW50bHkgYW55IG9mIFYuMjQsIFguMjEsIFYuMzUgYW5kIFYuMzYgY2FuIGJlIHNlbGVjdGVkLgorICogSXQgaGFzIGEgMTYtYml0IFNBQjgwMTY2IENQVSBhbmQgY2FuIGRvIHVwIHRvIDEwIE1iL3MgcGVyIGNoYW5uZWwuCisgKiBUaGUgOC1jaGFubmVscyB2ZXJzaW9uIGlzIGluIGRldmVsb3BtZW50LgorICoKKyAqIEJvdGggdHlwZXMgaGF2ZSBkb3dubG9hZGFibGUgZmlybXdhcmUgYW5kIGNvbW11bmljYXRlIHZpYSBJU0EgRE1BLgorICogQ09TQSBjYW4gYmUgYWxzbyBhIGJ1cy1tYXN0ZXJpbmcgZGV2aWNlLgorICoKKyAqIFNPRlRXQVJFIElORk8KKyAqCisgKiBUaGUgaG9tZXBhZ2Ugb2YgdGhlIExpbnV4IGRyaXZlciBpcyBhdCBodHRwOi8vd3d3LmZpLm11bmkuY3ovfmthcy9jb3NhLy4KKyAqIFRoZSBDVlMgdHJlZSBvZiBMaW51eCBkcml2ZXIgY2FuIGJlIHZpZXdlZCB0aGVyZSwgYXMgd2VsbCBhcyB0aGUKKyAqIGZpcm13YXJlIGJpbmFyaWVzIGFuZCB1c2VyLXNwYWNlIHV0aWxpdGllcyBmb3IgZG93bmxvYWRpbmcgdGhlIGZpcm13YXJlCisgKiBpbnRvIHRoZSBjYXJkIGFuZCBzZXR0aW5nIHVwIHRoZSBjYXJkLgorICoKKyAqIFRoZSBMaW51eCBkcml2ZXIgKHVubGlrZSB0aGUgcHJlc2VudCAqQlNEIGRyaXZlcnMgOi0pIGNhbiB3b3JrIGV2ZW4KKyAqIGZvciB0aGUgQ09TQSBhbmQgU1JQIGluIG9uZSBjb21wdXRlciBhbmQgYWxsb3dzIGVhY2ggY2hhbm5lbCB0byB3b3JrCisgKiBpbiBvbmUgb2YgdGhlIHRocmVlIG1vZGVzIChjaGFyYWN0ZXIgZGV2aWNlLCBDaXNjbyBIRExDLCBTeW5jIFBQUCkuCisgKgorICogQVVUSE9SCisgKgorICogVGhlIExpbnV4IGRyaXZlciB3YXMgd3JpdHRlbiBieSBKYW4gIlllbnlhIiBLYXNwcnphayA8a2FzQGZpLm11bmkuY3o+LgorICoKKyAqIFlvdSBjYW4gbWFpbCBtZSBidWdmaXhlcyBhbmQgZXZlbiBzdWNjZXNzIHJlcG9ydHMuIEkgYW0gZXNwZWNpYWxseQorICogaW50ZXJlc3RlZCBpbiB0aGUgU01QIGFuZC9vciBtdWxpdGktY2hhbm5lbCBzdWNjZXNzL2ZhaWx1cmUgcmVwb3J0cworICogKEkgd29uZGVyIGlmIEkgZGlkIHRoZSBsb2NraW5nIHByb3Blcmx5IDotKS4KKyAqCisgKiBUSEUgQVVUSE9SIFVTRUQgVEhFIEZPTExPV0lORyBTT1VSQ0VTIFdIRU4gUFJPR1JBTU1JTkcgVEhFIERSSVZFUgorICoKKyAqIFRoZSBDT1NBL1NSUCBOZXRCU0QgZHJpdmVyIGJ5IFpkZW5layBTYWx2ZXQgYW5kIEl2b3MgQ2Vybm9obGF2ZWsKKyAqIFRoZSBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIKKyAqIFRoZSBTREwgUmlzY29tL04yIGRyaXZlciBieSBNaWtlIE5hdGFsZQorICogVGhlIENvbXRyb2wgSG9zdGVzcyBTVjExIGRyaXZlciBieSBBbGFuIENveAorICogVGhlIFN5bmMgUFBQL0Npc2NvIEhETEMgbGF5ZXIgKHN5bmNwcHAuYykgcG9ydGVkIHRvIExpbnV4IGJ5IEFsYW4gQ294CisgKi8KKy8qCisgKiAgICAgNS8yNS8xOTk5IDogTWFyY2VsbyBUb3NhdHRpIDxtYXJjZWxvQGNvbmVjdGl2YS5jb20uYnI+CisgKiAgICAgICAgICAgICBmaXhlZCBhIGRlYWRsb2NrIGluIGNvc2Ffc3BwcF9vcGVuCisgKi8KKwwKKy8qIC0tLS0tLS0tLS0gSGVhZGVycywgbWFjcm9zLCBkYXRhIHN0cnVjdHVyZXMgLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyN1bmRlZiBDT1NBX1NMT1dfSU8JLyogZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSAqLworI3VuZGVmIFJFQUxMWV9TTE9XX0lPCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bmV0L3N5bmNwcHAuaD4KKyNpbmNsdWRlICJjb3NhLmgiCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBzdHJpbmcuICovCisjZGVmaW5lIENPU0FfTUFYX0lEX1NUUklORwkxMjgKKworLyogTWF4aW11bSBsZW5ndGggb2YgdGhlIGNoYW5uZWwgbmFtZSAqLworI2RlZmluZSBDT1NBX01BWF9OQU1FCQkoc2l6ZW9mKCJjb3NhWFhYY1hYWCIpKzEpCisKKy8qIFBlci1jaGFubmVsIGRhdGEgc3RydWN0dXJlICovCisKK3N0cnVjdCBjaGFubmVsX2RhdGEgeworCXZvaWQgKmlmX3B0cjsJLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIgKHVzZWQgYnkgU1BQUCkgKi8KKwlpbnQgdXNhZ2U7CS8qIFVzYWdlIGNvdW50OyA+MCBmb3IgY2hyZGV2LCAtMSBmb3IgbmV0ZGV2ICovCisJaW50IG51bTsJLyogTnVtYmVyIG9mIHRoZSBjaGFubmVsICovCisJc3RydWN0IGNvc2FfZGF0YSAqY29zYTsJLyogUG9pbnRlciB0byB0aGUgcGVyLWNhcmQgc3RydWN0dXJlICovCisJaW50IHR4c2l6ZTsJLyogU2l6ZSBvZiB0cmFuc21pdHRlZCBkYXRhICovCisJY2hhciAqdHhidWY7CS8qIFRyYW5zbWl0IGJ1ZmZlciAqLworCWNoYXIgbmFtZVtDT1NBX01BWF9OQU1FXTsJLyogY2hhbm5lbCBuYW1lICovCisKKwkvKiBUaGUgSFcgbGF5ZXIgaW50ZXJmYWNlICovCisJLyogcm91dGluZSBjYWxsZWQgZnJvbSB0aGUgUlggaW50ZXJydXB0ICovCisJY2hhciAqKCpzZXR1cF9yeCkoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCwgaW50IHNpemUpOworCS8qIHJvdXRpbmUgY2FsbGVkIHdoZW4gdGhlIFJYIGlzIGRvbmUgKGZyb20gdGhlIEVPVCBpbnRlcnJ1cHQpICovCisJaW50ICgqcnhfZG9uZSkoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCk7CisJLyogcm91dGluZSBjYWxsZWQgd2hlbiB0aGUgVFggaXMgZG9uZSAoZnJvbSB0aGUgRU9UIGludGVycnVwdCkgKi8KKwlpbnQgKCp0eF9kb25lKShzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFubmVsLCBpbnQgc2l6ZSk7CisKKwkvKiBDaGFyYWN0ZXIgZGV2aWNlIHBhcnRzICovCisJc3RydWN0IHNlbWFwaG9yZSByc2VtLCB3c2VtOworCWNoYXIgKnJ4ZGF0YTsKKwlpbnQgcnhzaXplOworCXdhaXRfcXVldWVfaGVhZF90IHR4d2FpdHEsIHJ4d2FpdHE7CisJaW50IHR4X3N0YXR1cywgcnhfc3RhdHVzOworCisJLyogU1BQUC9IRExDIGRldmljZSBwYXJ0cyAqLworCXN0cnVjdCBwcHBfZGV2aWNlIHBwcGRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiLCAqdHhfc2tiOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworfTsKKworLyogY29zYS0+ZmlybXdhcmVfc3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUgQ09TQV9GV19SRVNFVAkJKDE8PDApCS8qIElzIHRoZSBST00gbW9uaXRvciBhY3RpdmU/ICovCisjZGVmaW5lIENPU0FfRldfRE9XTkxPQUQJKDE8PDEpCS8qIElzIHRoZSBtaWNyb2NvZGUgZG93bmxvYWRlZD8gKi8KKyNkZWZpbmUgQ09TQV9GV19TVEFSVAkJKDE8PDIpCS8qIElzIHRoZSBtaWNyb2NvZGUgcnVubmluZz8gKi8KKworc3RydWN0IGNvc2FfZGF0YSB7CisJaW50IG51bTsJCQkvKiBDYXJkIG51bWJlciAqLworCWNoYXIgbmFtZVtDT1NBX01BWF9OQU1FXTsJLyogQ2FyZCBuYW1lIC0gZS5nICJjb3NhMCIgKi8KKwl1bnNpZ25lZCBpbnQgZGF0YXJlZywgc3RhdHVzcmVnOwkvKiBJL08gcG9ydHMgKi8KKwl1bnNpZ25lZCBzaG9ydCBpcnEsIGRtYTsJLyogSVJRIGFuZCBETUEgbnVtYmVyICovCisJdW5zaWduZWQgc2hvcnQgc3RhcnRhZGRyOwkvKiBGaXJtd2FyZSBzdGFydCBhZGRyZXNzICovCisJdW5zaWduZWQgc2hvcnQgYnVzbWFzdGVyOwkvKiBVc2UgYnVzbWFzdGVyaW5nPyAqLworCWludCBuY2hhbm5lbHM7CQkJLyogIyBvZiBjaGFubmVscyBvbiB0aGlzIGNhcmQgKi8KKwlpbnQgZHJpdmVyX3N0YXR1czsJCS8qIEZvciBjb21tdW5pY2F0aW5nIHdpdGggZmlybXdhcmUgKi8KKwlpbnQgZmlybXdhcmVfc3RhdHVzOwkJLyogRG93bmxvYWRlZCwgcmVzZXRlZCwgZXRjLiAqLworCWxvbmcgaW50IHJ4Yml0bWFwLCB0eGJpdG1hcDsJLyogQml0bWFwIG9mIGNoYW5uZWxzIHdobyBhcmUgd2lsbGluZyB0byBzZW5kL3JlY2VpdmUgZGF0YSAqLworCWxvbmcgaW50IHJ4dHg7CQkJLyogUlggb3IgVFggaW4gcHJvZ3Jlc3M/ICovCisJaW50IGVuYWJsZWQ7CisJaW50IHVzYWdlOwkJCQkvKiB1c2FnZSBjb3VudCAqLworCWludCB0eGNoYW4sIHR4c2l6ZSwgcnhzaXplOworCXN0cnVjdCBjaGFubmVsX2RhdGEgKnJ4Y2hhbjsKKwljaGFyICpib3VuY2VidWY7CisJY2hhciAqdHhidWYsICpyeGJ1ZjsKKwlzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuOworCXNwaW5sb2NrX3QgbG9jazsJLyogRm9yIGV4Y2x1c2l2ZSBvcGVyYXRpb25zIG9uIHRoaXMgc3RydWN0dXJlICovCisJY2hhciBpZF9zdHJpbmdbQ09TQV9NQVhfSURfU1RSSU5HXTsJLyogUk9NIG1vbml0b3IgSUQgc3RyaW5nICovCisJY2hhciAqdHlwZTsJCQkJLyogY2FyZCB0eXBlICovCit9OworCisvKgorICogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgYWxsIHRoZSBwb3NzaWJsZSBwb3J0cyB0byBiZSBhdXRvcHJvYmVkLgorICogSXQgaXMgaGVyZSBidXQgaXQgcHJvYmFibHkgaXMgbm90IGEgZ29vZCBpZGVhIHRvIHVzZSB0aGlzLgorICovCisvKiAjZGVmaW5lIENPU0FfSVNBX0FVVE9QUk9CRQkxICovCisKKy8qCisgKiBDaGFyYWN0ZXIgZGV2aWNlIG1ham9yIG51bWJlci4gMTE3IHdhcyBhbGxvY2F0ZWQgZm9yIHVzLgorICogVGhlIHZhbHVlIG9mIDAgbWVhbnMgdG8gYWxsb2NhdGUgYSBmaXJzdCBmcmVlIG9uZS4KKyAqLworc3RhdGljIGludCBjb3NhX21ham9yID0gMTE3OworCisvKgorICogRW5jb2Rpbmcgb2YgdGhlIG1pbm9yIG51bWJlcnM6CisgKiBUaGUgbG93ZXN0IENBUkRfTUlOT1JfQklUUyBiaXRzIG1lYW5zIHRoZSBjaGFubmVsIG9uIHRoZSBzaW5nbGUgY2FyZCwKKyAqIHRoZSBoaWdoZXN0IGJpdHMgbWVhbnMgdGhlIGNhcmQgbnVtYmVyLgorICovCisjZGVmaW5lIENBUkRfTUlOT1JfQklUUwk0CS8qIEhvdyBtYW55IGJpdHMgaW4gbWlub3IgbnVtYmVyIGFyZSByZXNlcnZlZAorCQkJCSAqIGZvciB0aGUgc2luZ2xlIGNhcmQgKi8KKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlcGVuZHMgb24gQ0FSRF9NSU5PUl9CSVRTLiBVbmZvcnR1bmF0ZWx5LCB0aGUgIk1PRFVMRV9TVFJJTkciCisgKiBtYWNybyBkb2Vzbid0IGxpa2UgYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUgcmF3IG51bWJlciBhcyBhbiBhcmd1bWVudCA6LSgKKyAqLworI2RlZmluZSBNQVhfQ0FSRFMJMTYKKy8qICNkZWZpbmUgTUFYX0NBUkRTCSgxIDw8ICg4LUNBUkRfTUlOT1JfQklUUykpICovCisKKyNkZWZpbmUgRFJJVkVSX1JYX1JFQURZCQkweDAwMDEKKyNkZWZpbmUgRFJJVkVSX1RYX1JFQURZCQkweDAwMDIKKyNkZWZpbmUgRFJJVkVSX1RYTUFQX1NISUZUCTIKKyNkZWZpbmUgRFJJVkVSX1RYTUFQX01BU0sJMHgwYwkvKiBGSVhNRTogMHhmYyBmb3IgOC1jaGFubmVsIHZlcnNpb24gKi8KKworLyoKKyAqIGZvciBjb3NhLT5yeHR4IC0gaW5kaWNhdGVzIHdoZXRoZXIgZWl0aGVyIHRyYW5zbWl0IG9yIHJlY2VpdmUgaXMKKyAqIGluIHByb2dyZXNzLiBUaGVzZSB2YWx1ZXMgYXJlIG1lYW4gbnVtYmVyIG9mIHRoZSBiaXQuCisgKi8KKyNkZWZpbmUgVFhCSVQgMAorI2RlZmluZSBSWEJJVCAxCisjZGVmaW5lIElSUUJJVCAyCisKKyNkZWZpbmUgQ09TQV9NVFUgMjAwMAkvKiBGSVhNRTogSSBkb24ndCBrbm93IHRoaXMgZXhhY3RseSAqLworCisjdW5kZWYgREVCVUdfREFUQSAvLzEJLyogRHVtcCB0aGUgZGF0YSByZWFkIG9yIHdyaXR0ZW4gdG8gdGhlIGNoYW5uZWwgKi8KKyN1bmRlZiBERUJVR19JUlFTIC8vMQkvKiBQcmludCB0aGUgbWVzc2FnZSB3aGVuIHRoZSBJUlEgaXMgcmVjZWl2ZWQgKi8KKyN1bmRlZiBERUJVR19JTyAgIC8vMQkvKiBEdW1wIHRoZSBJL08gdHJhZmZpYyAqLworCisjZGVmaW5lIFRYX1RJTUVPVVQJKDUqSFopCisKKy8qIE1heWJlIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGFsbG9jYXRlZCBkeW5hbWljYWxseSAqLworc3RhdGljIHN0cnVjdCBjb3NhX2RhdGEgY29zYV9jYXJkc1tNQVhfQ0FSRFNdOworc3RhdGljIGludCBucl9jYXJkczsKKworI2lmZGVmIENPU0FfSVNBX0FVVE9QUk9CRQorc3RhdGljIGludCBpb1tNQVhfQ0FSRFMrMV0gID0geyAweDIyMCwgMHgyMjgsIDB4MjEwLCAweDIxOCwgMCwgfTsKKy8qIE5PVEU6IERNQSBpcyBub3QgYXV0b3Byb2JlZCEhISAqLworc3RhdGljIGludCBkbWFbTUFYX0NBUkRTKzFdID0geyAxLCA3LCAxLCA3LCAxLCA3LCAxLCA3LCAwLCB9OworI2Vsc2UKK3N0YXRpYyBpbnQgaW9bTUFYX0NBUkRTKzFdOworc3RhdGljIGludCBkbWFbTUFYX0NBUkRTKzFdOworI2VuZGlmCisvKiBJUlEgY2FuIGJlIHNhZmVseSBhdXRvcHJvYmVkICovCitzdGF0aWMgaW50IGlycVtNQVhfQ0FSRFMrMV0gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIH07CisKKy8qIGZvciBjbGFzcyBzdHVmZiovCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqY29zYV9jbGFzczsKKworI2lmZGVmIE1PRFVMRQorbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIlRoZSBJL08gYmFzZXMgb2YgdGhlIENPU0Egb3IgU1JQIGNhcmRzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJUaGUgSVJRIGxpbmVzIG9mIHRoZSBDT1NBIG9yIFNSUCBjYXJkcyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGRtYSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hLCAiVGhlIERNQSBjaGFubmVscyBvZiB0aGUgQ09TQSBvciBTUlAgY2FyZHMiKTsKKworTU9EVUxFX0FVVEhPUigiSmFuIFwiWWVueWFcIiBLYXNwcnphaywgPGthc0BmaS5tdW5pLmN6PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNb2R1bGFyIGRyaXZlciBmb3IgdGhlIENPU0Egb3IgU1JQIHN5bmNocm9ub3VzIGNhcmQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNlbmRpZgorCisvKiBJIHVzZSB0aGlzIG1haW5seSBmb3IgdGVzdGluZyBwdXJwb3NlcyAqLworI2lmZGVmIENPU0FfU0xPV19JTworI2RlZmluZSBjb3NhX291dGIgb3V0Yl9wCisjZGVmaW5lIGNvc2Ffb3V0dyBvdXR3X3AKKyNkZWZpbmUgY29zYV9pbmIgIGluYl9wCisjZGVmaW5lIGNvc2FfaW53ICBpbndfcAorI2Vsc2UKKyNkZWZpbmUgY29zYV9vdXRiIG91dGIKKyNkZWZpbmUgY29zYV9vdXR3IG91dHcKKyNkZWZpbmUgY29zYV9pbmIgIGluYgorI2RlZmluZSBjb3NhX2ludyAgaW53CisjZW5kaWYKKworI2RlZmluZSBpc184Yml0KGNvc2EpCQkoIShjb3NhLT5kYXRhcmVnICYgMHgwOCkpCisKKyNkZWZpbmUgY29zYV9nZXRzdGF0dXMoY29zYSkJKGNvc2FfaW5iKGNvc2EtPnN0YXR1c3JlZykpCisjZGVmaW5lIGNvc2FfcHV0c3RhdHVzKGNvc2EsIHN0YXQpCShjb3NhX291dGIoc3RhdCwgY29zYS0+c3RhdHVzcmVnKSkKKyNkZWZpbmUgY29zYV9nZXRkYXRhMTYoY29zYSkJKGNvc2FfaW53KGNvc2EtPmRhdGFyZWcpKQorI2RlZmluZSBjb3NhX2dldGRhdGE4KGNvc2EpCShjb3NhX2luYihjb3NhLT5kYXRhcmVnKSkKKyNkZWZpbmUgY29zYV9wdXRkYXRhMTYoY29zYSwgZHQpCShjb3NhX291dHcoZHQsIGNvc2EtPmRhdGFyZWcpKQorI2RlZmluZSBjb3NhX3B1dGRhdGE4KGNvc2EsIGR0KQkoY29zYV9vdXRiKGR0LCBjb3NhLT5kYXRhcmVnKSkKKworLyogSW5pdGlhbGl6YXRpb24gc3R1ZmYgKi8KK3N0YXRpYyBpbnQgY29zYV9wcm9iZShpbnQgaW9hZGRyLCBpbnQgaXJxLCBpbnQgZG1hKTsKKworLyogSFcgaW50ZXJmYWNlICovCitzdGF0aWMgdm9pZCBjb3NhX2VuYWJsZV9yeChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKTsKK3N0YXRpYyB2b2lkIGNvc2FfZGlzYWJsZV9yeChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKTsKK3N0YXRpYyBpbnQgY29zYV9zdGFydF90eChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFubmVsLCBjaGFyICpidWYsIGludCBzaXplKTsKK3N0YXRpYyB2b2lkIGNvc2Ffa2ljayhzdHJ1Y3QgY29zYV9kYXRhICpjb3NhKTsKK3N0YXRpYyBpbnQgY29zYV9kbWFfYWJsZShzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuLCBjaGFyICpidWYsIGludCBkYXRhKTsKKworLyogU1BQUC9IRExDIHN0dWZmICovCitzdGF0aWMgdm9pZCBzcHBwX2NoYW5uZWxfaW5pdChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKTsKK3N0YXRpYyB2b2lkIHNwcHBfY2hhbm5lbF9kZWxldGUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbik7CitzdGF0aWMgaW50IGNvc2Ffc3BwcF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkKTsKK3N0YXRpYyBpbnQgY29zYV9zcHBwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkKTsKK3N0YXRpYyB2b2lkIGNvc2Ffc3BwcF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkKTsKK3N0YXRpYyBpbnQgY29zYV9zcHBwX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkKTsKK3N0YXRpYyBjaGFyICpzcHBwX3NldHVwX3J4KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW5uZWwsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgc3BwcF9yeF9kb25lKHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW5uZWwpOworc3RhdGljIGludCBzcHBwX3R4X2RvbmUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCwgaW50IHNpemUpOworc3RhdGljIGludCBjb3NhX3NwcHBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpjb3NhX25ldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogQ2hhcmFjdGVyIGRldmljZSAqLworc3RhdGljIHZvaWQgY2hhcmRldl9jaGFubmVsX2luaXQoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbik7CitzdGF0aWMgY2hhciAqY2hyZGV2X3NldHVwX3J4KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW5uZWwsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgY2hyZGV2X3J4X2RvbmUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCk7CitzdGF0aWMgaW50IGNocmRldl90eF9kb25lKHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW5uZWwsIGludCBzaXplKTsKK3N0YXRpYyBzc2l6ZV90IGNvc2FfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgc3NpemVfdCBjb3NhX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCWNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29zYV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICpwb2xsKTsKK3N0YXRpYyBpbnQgY29zYV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgY29zYV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgY29zYV9jaGFyZGV2X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKyNpZmRlZiBDT1NBX0ZBU1lOQ19XT1JLSU5HCitzdGF0aWMgaW50IGNvc2FfZmFzeW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgb24pOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvc2FfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gY29zYV9yZWFkLAorCS53cml0ZQkJPSBjb3NhX3dyaXRlLAorCS5wb2xsCQk9IGNvc2FfcG9sbCwKKwkuaW9jdGwJCT0gY29zYV9jaGFyZGV2X2lvY3RsLAorCS5vcGVuCQk9IGNvc2Ffb3BlbiwKKwkucmVsZWFzZQk9IGNvc2FfcmVsZWFzZSwKKyNpZmRlZiBDT1NBX0ZBU1lOQ19XT1JLSU5HCisJLmZhc3luYwkJPSBjb3NhX2Zhc3luYywKKyNlbmRpZgorfTsKKworLyogSW9jdGxzICovCitzdGF0aWMgaW50IGNvc2Ffc3RhcnQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IGFkZHJlc3MpOworc3RhdGljIGludCBjb3NhX3Jlc2V0KHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EpOworc3RhdGljIGludCBjb3NhX2Rvd25sb2FkKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIHZvaWQgX191c2VyICphKTsKK3N0YXRpYyBpbnQgY29zYV9yZWFkbWVtKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIHZvaWQgX191c2VyICphKTsKKworLyogQ09TQS9TUlAgUk9NIG1vbml0b3IgKi8KK3N0YXRpYyBpbnQgZG93bmxvYWQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsIGludCBhZGRyLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgc3RhcnRtaWNyb2NvZGUoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IGFkZHJlc3MpOworc3RhdGljIGludCByZWFkbWVtKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGNoYXIgX191c2VyICpkYXRhLCBpbnQgYWRkciwgaW50IGxlbik7CitzdGF0aWMgaW50IGNvc2FfcmVzZXRfYW5kX3JlYWRfaWQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgY2hhciAqaWQpOworCisvKiBBdXhpbGxpYXJ5IGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBnZXRfd2FpdF9kYXRhKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EpOworc3RhdGljIGludCBwdXRfd2FpdF9kYXRhKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBkYXRhKTsKK3N0YXRpYyBpbnQgcHV0aGV4bnVtYmVyKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBudW1iZXIpOworc3RhdGljIHZvaWQgcHV0X2RyaXZlcl9zdGF0dXMoc3RydWN0IGNvc2FfZGF0YSAqY29zYSk7CitzdGF0aWMgdm9pZCBwdXRfZHJpdmVyX3N0YXR1c19ub2xvY2soc3RydWN0IGNvc2FfZGF0YSAqY29zYSk7CisKKy8qIEludGVycnVwdCBoYW5kbGluZyAqLworc3RhdGljIGlycXJldHVybl90IGNvc2FfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmNvc2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworLyogSS9PIG9wcyBkZWJ1Z2dpbmcgKi8KKyNpZmRlZiBERUJVR19JTworc3RhdGljIHZvaWQgZGVidWdfZGF0YV9pbihzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgZGF0YSk7CitzdGF0aWMgdm9pZCBkZWJ1Z19kYXRhX291dChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgZGF0YSk7CitzdGF0aWMgdm9pZCBkZWJ1Z19kYXRhX2NtZChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgZGF0YSk7CitzdGF0aWMgdm9pZCBkZWJ1Z19zdGF0dXNfaW4oc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IHN0YXR1cyk7CitzdGF0aWMgdm9pZCBkZWJ1Z19zdGF0dXNfb3V0KHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBzdGF0dXMpOworI2VuZGlmCisKKwwKKy8qIC0tLS0tLS0tLS0gSW5pdGlhbGl6YXRpb24gc3R1ZmYgLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9faW5pdCBjb3NhX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgZXJyID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gImNvc2EgdjEuMDggKGMpIDE5OTctMjAwMCBKYW4gS2FzcHJ6YWsgPGthc0BmaS5tdW5pLmN6PlxuIik7CisjaWZkZWYgQ09ORklHX1NNUAorCXByaW50ayhLRVJOX0lORk8gImNvc2E6IFNNUCBmb3VuZC4gUGxlYXNlIG1haWwgYW55IHN1Y2Nlc3MvZmFpbHVyZSByZXBvcnRzIHRvIHRoZSBhdXRob3IuXG4iKTsKKyNlbmRpZgorCWlmIChjb3NhX21ham9yID4gMCkgeworCQlpZiAocmVnaXN0ZXJfY2hyZGV2KGNvc2FfbWFqb3IsICJjb3NhIiwgJmNvc2FfZm9wcykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNvc2E6IHVuYWJsZSB0byBnZXQgbWFqb3IgJWRcbiIsCisJCQkJY29zYV9tYWpvcik7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIShjb3NhX21ham9yPXJlZ2lzdGVyX2NocmRldigwLCAiY29zYSIsICZjb3NhX2ZvcHMpKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29zYTogdW5hYmxlIHRvIHJlZ2lzdGVyIGNoYXJkZXZcbiIpOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWZvciAoaT0wOyBpPE1BWF9DQVJEUzsgaSsrKQorCQljb3NhX2NhcmRzW2ldLm51bSA9IC0xOworCWZvciAoaT0wOyBpb1tpXSAhPSAwICYmIGkgPCBNQVhfQ0FSRFM7IGkrKykKKwkJY29zYV9wcm9iZShpb1tpXSwgaXJxW2ldLCBkbWFbaV0pOworCWlmICghbnJfY2FyZHMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29zYTogbm8gZGV2aWNlcyBmb3VuZC5cbiIpOworCQl1bnJlZ2lzdGVyX2NocmRldihjb3NhX21ham9yLCAiY29zYSIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisJZGV2ZnNfbWtfZGlyKCJjb3NhIik7CisJY29zYV9jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJjb3NhIik7CisJaWYgKElTX0VSUihjb3NhX2NsYXNzKSkgeworCQllcnIgPSBQVFJfRVJSKGNvc2FfY2xhc3MpOworCQlnb3RvIG91dF9jaHJkZXY7CisJfQorCWZvciAoaT0wOyBpPG5yX2NhcmRzOyBpKyspIHsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoY29zYV9jbGFzcywgTUtERVYoY29zYV9tYWpvciwgaSksCisJCQkJTlVMTCwgImNvc2ElZCIsIGkpOworCQllcnIgPSBkZXZmc19ta19jZGV2KE1LREVWKGNvc2FfbWFqb3IsIGkpLAorCQkJCVNfSUZDSFJ8U19JUlVTUnxTX0lXVVNSLAorCQkJCSJjb3NhLyVkIiwgaSk7CisJCWlmIChlcnIpIHsKKwkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKGNvc2FfbWFqb3IsIGkpKTsKKwkJCWdvdG8gb3V0X2NocmRldjsJCQorCQl9CisJfQorCWVyciA9IDA7CisJZ290byBvdXQ7CisJCitvdXRfY2hyZGV2OgorCXVucmVnaXN0ZXJfY2hyZGV2KGNvc2FfbWFqb3IsICJjb3NhIik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KK21vZHVsZV9pbml0KGNvc2FfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjb3NhX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhOworCWludCBpOworCXByaW50ayhLRVJOX0lORk8gIlVubG9hZGluZyB0aGUgY29zYSBtb2R1bGVcbiIpOworCisJZm9yIChpPTA7IGk8bnJfY2FyZHM7IGkrKykgeworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihjb3NhX21ham9yLCBpKSk7CisJCWRldmZzX3JlbW92ZSgiY29zYS8lZCIsIGkpOworCX0KKwljbGFzc19zaW1wbGVfZGVzdHJveShjb3NhX2NsYXNzKTsKKwlkZXZmc19yZW1vdmUoImNvc2EiKTsKKwlmb3IgKGNvc2E9Y29zYV9jYXJkczsgbnJfY2FyZHMtLTsgY29zYSsrKSB7CisJCS8qIENsZWFuIHVwIHRoZSBwZXItY2hhbm5lbCBkYXRhICovCisJCWZvciAoaT0wOyBpPGNvc2EtPm5jaGFubmVsczsgaSsrKSB7CisJCQkvKiBDaGFyZGV2IGRyaXZlciBoYXMgbm8gYWxsb2MnZCBwZXItY2hhbm5lbCBkYXRhICovCisJCQlzcHBwX2NoYW5uZWxfZGVsZXRlKGNvc2EtPmNoYW4raSk7CisJCX0KKwkJLyogQ2xlYW4gdXAgdGhlIHBlci1jYXJkIGRhdGEgKi8KKwkJa2ZyZWUoY29zYS0+Y2hhbik7CisJCWtmcmVlKGNvc2EtPmJvdW5jZWJ1Zik7CisJCWZyZWVfaXJxKGNvc2EtPmlycSwgY29zYSk7CisJCWZyZWVfZG1hKGNvc2EtPmRtYSk7CisJCXJlbGVhc2VfcmVnaW9uKGNvc2EtPmRhdGFyZWcsaXNfOGJpdChjb3NhKT8yOjQpOworCX0KKwl1bnJlZ2lzdGVyX2NocmRldihjb3NhX21ham9yLCAiY29zYSIpOworfQorbW9kdWxlX2V4aXQoY29zYV9leGl0KTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJlZ2lzdGVyIGFsbCB0aGUgbmV0IGRldmljZXMgbmVlZGVkIGZvciB0aGUKKyAqIHNpbmdsZSBjaGFubmVsLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGNoYW5uZWxfaW5pdChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKQoreworCXNwcmludGYoY2hhbi0+bmFtZSwgImNvc2ElZGMlZCIsIGNoYW4tPmNvc2EtPm51bSwgY2hhbi0+bnVtKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNoYXJkZXYgZGF0YSBzdHJ1Y3R1cmVzICovCisJY2hhcmRldl9jaGFubmVsX2luaXQoY2hhbik7CisKKwkvKiBSZWdpc3RlciB0aGUgc3BwcCBpbnRlcmZhY2UgKi8KKwlzcHBwX2NoYW5uZWxfaW5pdChjaGFuKTsKK30KKwkKK3N0YXRpYyBpbnQgY29zYV9wcm9iZShpbnQgYmFzZSwgaW50IGlycSwgaW50IGRtYSkKK3sKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhID0gY29zYV9jYXJkcytucl9jYXJkczsKKwlpbnQgaSwgZXJyID0gMDsKKworCW1lbXNldChjb3NhLCAwLCBzaXplb2Yoc3RydWN0IGNvc2FfZGF0YSkpOworCisJLyogQ2hlY2tpbmcgdmFsaWRpdHkgb2YgcGFyYW1ldGVyczogKi8KKwkvKiBJUlEgc2hvdWxkIGJlIDItNyBvciAxMC0xNTsgbmVnYXRpdmUgSVJRIG1lYW5zIGF1dG9wcm9iZSAqLworCWlmICgoaXJxID49IDAgICYmIGlycSA8IDIpIHx8IGlycSA+IDE1IHx8IChpcnEgPCAxMCAmJiBpcnEgPiA3KSkgeworCQlwcmludGsgKEtFUk5fSU5GTyAiY29zYV9wcm9iZTogaW52YWxpZCBJUlEgJWRcbiIsIGlycSk7CisJCXJldHVybiAtMTsKKwl9CisJLyogSS9PIGFkZHJlc3Mgc2hvdWxkIGJlIGJldHdlZW4gMHgxMDAgYW5kIDB4M2ZmIGFuZCBzaG91bGQgYmUKKwkgKiBtdWx0aXBsZSBvZiA4LiAqLworCWlmIChiYXNlIDwgMHgxMDAgfHwgYmFzZSA+IDB4M2ZmIHx8IGJhc2UgJiAweDcpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gImNvc2FfcHJvYmU6IGludmFsaWQgSS9PIGFkZHJlc3MgMHgleFxuIiwKKwkJCWJhc2UpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIERNQSBzaG91bGQgYmUgMCwxIG9yIDMtNyAqLworCWlmIChkbWEgPCAwIHx8IGRtYSA9PSA0IHx8IGRtYSA+IDcpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gImNvc2FfcHJvYmU6IGludmFsaWQgRE1BICVkXG4iLCBkbWEpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIGFuZCBmaW5hbGx5LCBvbiAxNi1iaXQgQ09TQSBETUEgc2hvdWxkIGJlIDQtNyBhbmQgCisJICogSS9PIGJhc2Ugc2hvdWxkIG5vdCBiZSBtdWx0aXBsZSBvZiAweDEwICovCisJaWYgKCgoYmFzZSAmIDB4OCkgJiYgZG1hIDwgNCkgfHwgKCEoYmFzZSAmIDB4OCkgJiYgZG1hID4gMykpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gImNvc2FfcHJvYmU6IDgvMTYgYml0IGJhc2UgYW5kIERNQSBtaXNtYXRjaCIKKwkJCSIgKGJhc2U9MHgleCwgZG1hPSVkKVxuIiwgYmFzZSwgZG1hKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNvc2EtPmRtYSA9IGRtYTsKKwljb3NhLT5kYXRhcmVnID0gYmFzZTsKKwljb3NhLT5zdGF0dXNyZWcgPSBpc184Yml0KGNvc2EpP2Jhc2UrMTpiYXNlKzI7CisJc3Bpbl9sb2NrX2luaXQoJmNvc2EtPmxvY2spOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihiYXNlLCBpc184Yml0KGNvc2EpPzI6NCwiY29zYSIpKQorCQlyZXR1cm4gLTE7CisJCisJaWYgKGNvc2FfcmVzZXRfYW5kX3JlYWRfaWQoY29zYSwgY29zYS0+aWRfc3RyaW5nKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImNvc2E6IHByb2JlIGF0IDB4JXggZmFpbGVkLlxuIiwgYmFzZSk7CisJCWVyciA9IC0xOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogVGVzdCB0aGUgdmFsaWRpdHkgb2YgaWRlbnRpZmljYXRpb24gc3RyaW5nICovCisJaWYgKCFzdHJuY21wKGNvc2EtPmlkX3N0cmluZywgIlNSUCIsIDMpKQorCQljb3NhLT50eXBlID0gInNycCI7CisJZWxzZSBpZiAoIXN0cm5jbXAoY29zYS0+aWRfc3RyaW5nLCAiQ09TQSIsIDQpKQorCQljb3NhLT50eXBlID0gaXNfOGJpdChjb3NhKT8gImNvc2E4IjogImNvc2ExNiI7CisJZWxzZSB7CisvKiBQcmludCBhIHdhcm5pbmcgb25seSBpZiB3ZSBhcmUgbm90IGF1dG9wcm9iaW5nICovCisjaWZuZGVmIENPU0FfSVNBX0FVVE9QUk9CRQorCQlwcmludGsoS0VSTl9JTkZPICJjb3NhOiB2YWxpZCBzaWduYXR1cmUgbm90IGZvdW5kIGF0IDB4JXguXG4iLAorCQkJYmFzZSk7CisjZW5kaWYKKwkJZXJyID0gLTE7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogVXBkYXRlIHRoZSBuYW1lIG9mIHRoZSByZWdpb24gbm93IHdlIGtub3cgdGhlIHR5cGUgb2YgY2FyZCAqLyAKKwlyZWxlYXNlX3JlZ2lvbihiYXNlLCBpc184Yml0KGNvc2EpPzI6NCk7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihiYXNlLCBpc184Yml0KGNvc2EpPzI6NCwgY29zYS0+dHlwZSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImNvc2E6IGNoYW5naW5nIG5hbWUgYXQgMHgleCBmYWlsZWQuXG4iLCBiYXNlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIE5vdyBkbyBJUlEgYXV0b3Byb2JlICovCisJaWYgKGlycSA8IDApIHsKKwkJdW5zaWduZWQgbG9uZyBpcnFzOworLyoJCXByaW50ayhLRVJOX0lORk8gIklSUSBhdXRvcHJvYmVcbiIpOyAqLworCQlpcnFzID0gcHJvYmVfaXJxX29uKCk7CisJCS8qIAorCQkgKiBFbmFibGUgaW50ZXJydXB0IG9uIHR4IGJ1ZmZlciBlbXB0eSAoaXQgc3VyZSBpcykgCisJCSAqIHJlYWxseSBzdXJlID8KKwkJICogRklYTUU6IFdoZW4gdGhpcyBjb2RlIGlzIG5vdCB1c2VkIGFzIG1vZHVsZSwgd2Ugc2hvdWxkCisJCSAqIHByb2JhYmx5IGNhbGwgdWRlbGF5KCkgaW5zdGVhZCBvZiB0aGUgaW50ZXJydXB0aWJsZSBzbGVlcC4KKwkJICovCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWNvc2FfcHV0c3RhdHVzKGNvc2EsIFNSX1RYX0lOVF9FTkEpOworCQlzY2hlZHVsZV90aW1lb3V0KDMwKTsKKwkJaXJxID0gcHJvYmVfaXJxX29mZihpcnFzKTsKKwkJLyogRGlzYWJsZSBhbGwgSVJRcyBmcm9tIHRoZSBjYXJkICovCisJCWNvc2FfcHV0c3RhdHVzKGNvc2EsIDApOworCQkvKiBFbXB0eSB0aGUgcmVjZWl2ZWQgZGF0YSByZWdpc3RlciAqLworCQljb3NhX2dldGRhdGE4KGNvc2EpOworCisJCWlmIChpcnEgPCAwKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiY29zYSBJUlEgYXV0b3Byb2JlOiBtdWx0aXBsZSBpbnRlcnJ1cHRzIG9idGFpbmVkICglZCwgYm9hcmQgYXQgMHgleClcbiIsCisJCQkJaXJxLCBjb3NhLT5kYXRhcmVnKTsKKwkJCWVyciA9IC0xOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCWlmIChpcnEgPT0gMCkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gImNvc2EgSVJRIGF1dG9wcm9iZTogbm8gaW50ZXJydXB0IG9idGFpbmVkIChib2FyZCBhdCAweCV4KVxuIiwKKwkJCQljb3NhLT5kYXRhcmVnKTsKKwkJLyoJcmV0dXJuIC0xOyAqLworCQl9CisJfQorCisJY29zYS0+aXJxID0gaXJxOworCWNvc2EtPm51bSA9IG5yX2NhcmRzOworCWNvc2EtPnVzYWdlID0gMDsKKwljb3NhLT5uY2hhbm5lbHMgPSAyOwkvKiBGSVhNRTogaG93IHRvIGRldGVybWluZSB0aGlzPyAqLworCisJaWYgKHJlcXVlc3RfaXJxKGNvc2EtPmlycSwgY29zYV9pbnRlcnJ1cHQsIDAsIGNvc2EtPnR5cGUsIGNvc2EpKSB7CisJCWVyciA9IC0xOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWlmIChyZXF1ZXN0X2RtYShjb3NhLT5kbWEsIGNvc2EtPnR5cGUpKSB7CisJCWVyciA9IC0xOworCQlnb3RvIGVycl9vdXQxOworCX0KKwkKKwljb3NhLT5ib3VuY2VidWYgPSBrbWFsbG9jKENPU0FfTVRVLCBHRlBfS0VSTkVMfEdGUF9ETUEpOworCWlmICghY29zYS0+Ym91bmNlYnVmKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDI7CisJfQorCXNwcmludGYoY29zYS0+bmFtZSwgImNvc2ElZCIsIGNvc2EtPm51bSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwZXItY2hhbm5lbCBkYXRhICovCisJY29zYS0+Y2hhbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2RhdGEpKmNvc2EtPm5jaGFubmVscywKKwkJCSAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb3NhLT5jaGFuKSB7CisJICAgICAgICBlcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQzOworCX0KKwltZW1zZXQoY29zYS0+Y2hhbiwgMCwgc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2RhdGEpKmNvc2EtPm5jaGFubmVscyk7CisJZm9yIChpPTA7IGk8Y29zYS0+bmNoYW5uZWxzOyBpKyspIHsKKwkJY29zYS0+Y2hhbltpXS5jb3NhID0gY29zYTsKKwkJY29zYS0+Y2hhbltpXS5udW0gPSBpOworCQljaGFubmVsX2luaXQoY29zYS0+Y2hhbitpKTsKKwl9CisKKwlwcmludGsgKEtFUk5fSU5GTyAiY29zYSVkOiAlcyAoJXMgYXQgMHgleCBpcnEgJWQgZG1hICVkKSwgJWQgY2hhbm5lbHNcbiIsCisJCWNvc2EtPm51bSwgY29zYS0+aWRfc3RyaW5nLCBjb3NhLT50eXBlLAorCQljb3NhLT5kYXRhcmVnLCBjb3NhLT5pcnEsIGNvc2EtPmRtYSwgY29zYS0+bmNoYW5uZWxzKTsKKworCXJldHVybiBucl9jYXJkcysrOworZXJyX291dDM6CisJa2ZyZWUoY29zYS0+Ym91bmNlYnVmKTsKK2Vycl9vdXQyOgorCWZyZWVfZG1hKGNvc2EtPmRtYSk7CitlcnJfb3V0MToKKwlmcmVlX2lycShjb3NhLT5pcnEsIGNvc2EpOworZXJyX291dDoJCisJcmVsZWFzZV9yZWdpb24oY29zYS0+ZGF0YXJlZyxpc184Yml0KGNvc2EpPzI6NCk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJjb3NhJWQ6IGFsbG9jYXRpbmcgcmVzb3VyY2VzIGZhaWxlZFxuIiwKKwkgICAgICAgY29zYS0+bnVtKTsKKwlyZXR1cm4gZXJyOworfQorCisMCisvKi0tLS0tLS0tLS0gU1BQUC9IRExDIG5ldGRldmljZSAtLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGNvc2Ffc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmQpCit7CisJZC0+b3BlbiA9IGNvc2Ffc3BwcF9vcGVuOworCWQtPnN0b3AgPSBjb3NhX3NwcHBfY2xvc2U7CisJZC0+aGFyZF9zdGFydF94bWl0ID0gY29zYV9zcHBwX3R4OworCWQtPmRvX2lvY3RsID0gY29zYV9zcHBwX2lvY3RsOworCWQtPmdldF9zdGF0cyA9IGNvc2FfbmV0X3N0YXRzOworCWQtPnR4X3RpbWVvdXQgPSBjb3NhX3NwcHBfdGltZW91dDsKKwlkLT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7Cit9CisKK3N0YXRpYyB2b2lkIHNwcHBfY2hhbm5lbF9pbml0KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmQ7CisJY2hhbi0+aWZfcHRyID0gJmNoYW4tPnBwcGRldjsKKwlkID0gYWxsb2NfbmV0ZGV2KDAsIGNoYW4tPm5hbWUsIGNvc2Ffc2V0dXApOworCWlmICghZCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogYWxsb2NfbmV0ZGV2IGZhaWxlZC5cbiIsIGNoYW4tPm5hbWUpOworCQlyZXR1cm47CisJfQorCWNoYW4tPnBwcGRldi5kZXYgPSBkOworCWQtPmJhc2VfYWRkciA9IGNoYW4tPmNvc2EtPmRhdGFyZWc7CisJZC0+aXJxID0gY2hhbi0+Y29zYS0+aXJxOworCWQtPmRtYSA9IGNoYW4tPmNvc2EtPmRtYTsKKwlkLT5wcml2ID0gY2hhbjsKKwlzcHBwX2F0dGFjaCgmY2hhbi0+cHBwZGV2KTsKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZWdpc3Rlcl9uZXRkZXYgZmFpbGVkLlxuIiwgZC0+bmFtZSk7CisJCXNwcHBfZGV0YWNoKGQpOworCQlmcmVlX25ldGRldihkKTsKKwkJY2hhbi0+cHBwZGV2LmRldiA9IE5VTEw7CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNwcHBfY2hhbm5lbF9kZWxldGUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbikKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihjaGFuLT5wcHBkZXYuZGV2KTsKKwlzcHBwX2RldGFjaChjaGFuLT5wcHBkZXYuZGV2KTsKKwlmcmVlX25ldGRldihjaGFuLT5wcHBkZXYuZGV2KTsKKwljaGFuLT5wcHBkZXYuZGV2ID0gTlVMTDsKK30KKworc3RhdGljIGludCBjb3NhX3NwcHBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuID0gZC0+cHJpdjsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIShjaGFuLT5jb3NhLT5maXJtd2FyZV9zdGF0dXMgJiBDT1NBX0ZXX1NUQVJUKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBzdGFydCB0aGUgZmlybXdhcmUgZmlyc3QgKHN0YXR1cyAlZClcbiIsCisJCQljaGFuLT5jb3NhLT5uYW1lLCBjaGFuLT5jb3NhLT5maXJtd2FyZV9zdGF0dXMpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+Y29zYS0+bG9jaywgZmxhZ3MpOworCWlmIChjaGFuLT51c2FnZSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBzcHBwX29wZW4gY2FsbGVkIHdpdGggdXNhZ2UgY291bnQgJWRcbiIsCisJCQljaGFuLT5uYW1lLCBjaGFuLT51c2FnZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmNvc2EtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY2hhbi0+c2V0dXBfcnggPSBzcHBwX3NldHVwX3J4OworCWNoYW4tPnR4X2RvbmUgPSBzcHBwX3R4X2RvbmU7CisJY2hhbi0+cnhfZG9uZSA9IHNwcHBfcnhfZG9uZTsKKwljaGFuLT51c2FnZT0tMTsKKwljaGFuLT5jb3NhLT51c2FnZSsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmNvc2EtPmxvY2ssIGZsYWdzKTsKKworCWVyciA9IHNwcHBfb3BlbihkKTsKKwlpZiAoZXJyKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5jb3NhLT5sb2NrLCBmbGFncyk7CisJCWNoYW4tPnVzYWdlPTA7CisJCWNoYW4tPmNvc2EtPnVzYWdlLS07CisJCQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5jb3NhLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBlcnI7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZCk7CisJY29zYV9lbmFibGVfcngoY2hhbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29zYV9zcHBwX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiA9IGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWNoYW4tPnR4X3NrYiA9IHNrYjsKKwljb3NhX3N0YXJ0X3R4KGNoYW4sIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb3NhX3NwcHBfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4gPSBkZXYtPnByaXY7CisKKwlpZiAodGVzdF9iaXQoUlhCSVQsICZjaGFuLT5jb3NhLT5yeHR4KSkgeworCQljaGFuLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJY2hhbi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworCX0gZWxzZSB7CisJCWNoYW4tPnN0YXRzLnR4X2Vycm9ycysrOworCQljaGFuLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCX0KKwljb3NhX2tpY2soY2hhbi0+Y29zYSk7CisJaWYgKGNoYW4tPnR4X3NrYikgeworCQlkZXZfa2ZyZWVfc2tiKGNoYW4tPnR4X3NrYik7CisJCWNoYW4tPnR4X3NrYiA9IE5VTEw7CisJfQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBjb3NhX3NwcHBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmQpCit7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiA9IGQtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW5ldGlmX3N0b3BfcXVldWUoZCk7CisJc3BwcF9jbG9zZShkKTsKKwljb3NhX2Rpc2FibGVfcngoY2hhbik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmNvc2EtPmxvY2ssIGZsYWdzKTsKKwlpZiAoY2hhbi0+cnhfc2tiKSB7CisJCWtmcmVlX3NrYihjaGFuLT5yeF9za2IpOworCQljaGFuLT5yeF9za2IgPSBOVUxMOworCX0KKwlpZiAoY2hhbi0+dHhfc2tiKSB7CisJCWtmcmVlX3NrYihjaGFuLT50eF9za2IpOworCQljaGFuLT50eF9za2IgPSBOVUxMOworCX0KKwljaGFuLT51c2FnZT0wOworCWNoYW4tPmNvc2EtPnVzYWdlLS07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+Y29zYS0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqc3BwcF9zZXR1cF9yeChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuLCBpbnQgc2l6ZSkKK3sKKwkvKgorCSAqIFdlIGNhbiBzYWZlbHkgZmFsbCBiYWNrIHRvIG5vbi1kbWEtYWJsZSBtZW1vcnksIGJlY2F1c2Ugd2UgaGF2ZQorCSAqIHRoZSBjb3NhLT5ib3VuY2VidWYgcHJlLWFsbG9jYXRlZC4KKwkgKi8KKwlpZiAoY2hhbi0+cnhfc2tiKQorCQlrZnJlZV9za2IoY2hhbi0+cnhfc2tiKTsKKwljaGFuLT5yeF9za2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUpOworCWlmIChjaGFuLT5yeF9za2IgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0XG4iLAorCQkJY2hhbi0+bmFtZSk7CisJCWNoYW4tPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWNoYW4tPnBwcGRldi5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyZXR1cm4gc2tiX3B1dChjaGFuLT5yeF9za2IsIHNpemUpOworfQorCitzdGF0aWMgaW50IHNwcHBfcnhfZG9uZShzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKQoreworCWlmICghY2hhbi0+cnhfc2tiKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByeF9kb25lIHdpdGggZW1wdHkgc2tiIVxuIiwKKwkJCWNoYW4tPm5hbWUpOworCQljaGFuLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJY2hhbi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCXJldHVybiAwOworCX0KKwljaGFuLT5yeF9za2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfV0FOX1BQUCk7CisJY2hhbi0+cnhfc2tiLT5kZXYgPSBjaGFuLT5wcHBkZXYuZGV2OworCWNoYW4tPnJ4X3NrYi0+bWFjLnJhdyA9IGNoYW4tPnJ4X3NrYi0+ZGF0YTsKKwljaGFuLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJY2hhbi0+c3RhdHMucnhfYnl0ZXMgKz0gY2hhbi0+Y29zYS0+cnhzaXplOworCW5ldGlmX3J4KGNoYW4tPnJ4X3NrYik7CisJY2hhbi0+cnhfc2tiID0gTlVMTDsKKwljaGFuLT5wcHBkZXYuZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlyZXR1cm4gMDsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyBpbnQgc3BwcF90eF9kb25lKHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4sIGludCBzaXplKQoreworCWlmICghY2hhbi0+dHhfc2tiKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0eF9kb25lIHdpdGggZW1wdHkgc2tiIVxuIiwKKwkJCWNoYW4tPm5hbWUpOworCQljaGFuLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJY2hhbi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJcmV0dXJuIDE7CisJfQorCWRldl9rZnJlZV9za2JfaXJxKGNoYW4tPnR4X3NrYik7CisJY2hhbi0+dHhfc2tiID0gTlVMTDsKKwljaGFuLT5zdGF0cy50eF9wYWNrZXRzKys7CisJY2hhbi0+c3RhdHMudHhfYnl0ZXMgKz0gc2l6ZTsKKwluZXRpZl93YWtlX3F1ZXVlKGNoYW4tPnBwcGRldi5kZXYpOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmNvc2FfbmV0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiA9IGRldi0+cHJpdjsKKwlyZXR1cm4gJmNoYW4tPnN0YXRzOworfQorCisMCisvKi0tLS0tLS0tLS0gQ2hhcmFjdGVyIGRldmljZSAtLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGNoYXJkZXZfY2hhbm5lbF9pbml0KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4pCit7CisJaW5pdF9NVVRFWCgmY2hhbi0+cnNlbSk7CisJaW5pdF9NVVRFWCgmY2hhbi0+d3NlbSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNvc2FfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNvc2FfZGF0YSAqY29zYSA9IGNoYW4tPmNvc2E7CisJY2hhciAqa2J1ZjsKKworCWlmICghKGNvc2EtPmZpcm13YXJlX3N0YXR1cyAmIENPU0FfRldfU1RBUlQpKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHN0YXJ0IHRoZSBmaXJtd2FyZSBmaXJzdCAoc3RhdHVzICVkKVxuIiwKKwkJCWNvc2EtPm5hbWUsIGNvc2EtPmZpcm13YXJlX3N0YXR1cyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmNoYW4tPnJzZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQorCWlmICgoY2hhbi0+cnhkYXRhID0ga21hbGxvYyhDT1NBX01UVSwgR0ZQX0RNQXxHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogY29zYV9yZWFkKCkgLSBPT01cbiIsIGNvc2EtPm5hbWUpOworCQl1cCgmY2hhbi0+cnNlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNoYW4tPnJ4X3N0YXR1cyA9IDA7CisJY29zYV9lbmFibGVfcngoY2hhbik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwlhZGRfd2FpdF9xdWV1ZSgmY2hhbi0+cnh3YWl0cSwgJndhaXQpOworCXdoaWxlKCFjaGFuLT5yeF9zdGF0dXMpIHsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwkJc2NoZWR1bGUoKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICYmIGNoYW4tPnJ4X3N0YXR1cyA9PSAwKSB7CisJCQljaGFuLT5yeF9zdGF0dXMgPSAxOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmNoYW4tPnJ4d2FpdHEsICZ3YWl0KTsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQkJdXAoJmNoYW4tPnJzZW0pOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hhbi0+cnh3YWl0cSwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCWtidWYgPSBjaGFuLT5yeGRhdGE7CisJY291bnQgPSBjaGFuLT5yeHNpemU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCXVwKCZjaGFuLT5yc2VtKTsKKworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBrYnVmLCBjb3VudCkpIHsKKwkJa2ZyZWUoa2J1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlrZnJlZShrYnVmKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjaGFyICpjaHJkZXZfc2V0dXBfcngoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiwgaW50IHNpemUpCit7CisJLyogRXhwZWN0IHNpemUgPD0gQ09TQV9NVFUgKi8KKwljaGFuLT5yeHNpemUgPSBzaXplOworCXJldHVybiBjaGFuLT5yeGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgY2hyZGV2X3J4X2RvbmUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbikKK3sKKwlpZiAoY2hhbi0+cnhfc3RhdHVzKSB7IC8qIFJlYWRlciBoYXMgZGllZCAqLworCQlrZnJlZShjaGFuLT5yeGRhdGEpOworCQl1cCgmY2hhbi0+d3NlbSk7CisJfQorCWNoYW4tPnJ4X3N0YXR1cyA9IDE7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaGFuLT5yeHdhaXRxKTsKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgc3NpemVfdCBjb3NhX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCWNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNvc2FfZGF0YSAqY29zYSA9IGNoYW4tPmNvc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyICprYnVmOworCisJaWYgKCEoY29zYS0+ZmlybXdhcmVfc3RhdHVzICYgQ09TQV9GV19TVEFSVCkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogc3RhcnQgdGhlIGZpcm13YXJlIGZpcnN0IChzdGF0dXMgJWQpXG4iLAorCQkJY29zYS0+bmFtZSwgY29zYS0+ZmlybXdhcmVfc3RhdHVzKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2hhbi0+d3NlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlpZiAoY291bnQgPiBDT1NBX01UVSkKKwkJY291bnQgPSBDT1NBX01UVTsKKwkKKwkvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCisJaWYgKChrYnVmID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTHxHRlBfRE1BKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBjb3NhX3dyaXRlKCkgT09NIC0gZHJvcHBpbmcgcGFja2V0XG4iLAorCQkJY29zYS0+bmFtZSk7CisJCXVwKCZjaGFuLT53c2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmIChjb3B5X2Zyb21fdXNlcihrYnVmLCBidWYsIGNvdW50KSkgeworCQl1cCgmY2hhbi0+d3NlbSk7CisJCWtmcmVlKGtidWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJY2hhbi0+dHhfc3RhdHVzPTA7CisJY29zYV9zdGFydF90eChjaGFuLCBrYnVmLCBjb3VudCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCWFkZF93YWl0X3F1ZXVlKCZjaGFuLT50eHdhaXRxLCAmd2FpdCk7CisJd2hpbGUoIWNoYW4tPnR4X3N0YXR1cykgeworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQlzY2hlZHVsZSgpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgY2hhbi0+dHhfc3RhdHVzID09IDApIHsKKwkJCWNoYW4tPnR4X3N0YXR1cyA9IDE7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hhbi0+dHh3YWl0cSwgJndhaXQpOworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCQljaGFuLT50eF9zdGF0dXMgPSAxOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hhbi0+dHh3YWl0cSwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXVwKCZjaGFuLT53c2VtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJa2ZyZWUoa2J1Zik7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGNocmRldl90eF9kb25lKHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4sIGludCBzaXplKQoreworCWlmIChjaGFuLT50eF9zdGF0dXMpIHsgLyogV3JpdGVyIHdhcyBpbnRlcnJ1cHRlZCAqLworCQlrZnJlZShjaGFuLT50eGJ1Zik7CisJCXVwKCZjaGFuLT53c2VtKTsKKwl9CisJY2hhbi0+dHhfc3RhdHVzID0gMTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoYW4tPnR4d2FpdHEpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNvc2FfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqcG9sbCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJjb3NhX3BvbGwgaXMgaGVyZVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29zYV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjb3NhX2RhdGEgKmNvc2E7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBuOworCisJaWYgKChuPWltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk+PkNBUkRfTUlOT1JfQklUUykKKwkJPj0gbnJfY2FyZHMpCisJCXJldHVybiAtRU5PREVWOworCWNvc2EgPSBjb3NhX2NhcmRzK247CisKKwlpZiAoKG49aW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKQorCQkmICgoMTw8Q0FSRF9NSU5PUl9CSVRTKS0xKSkgPj0gY29zYS0+bmNoYW5uZWxzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljaGFuID0gY29zYS0+Y2hhbiArIG47CisJCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2hhbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoY2hhbi0+dXNhZ2UgPCAwKSB7IC8qIGluIG5ldGRldiBtb2RlICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY29zYS0+dXNhZ2UrKzsKKwljaGFuLT51c2FnZSsrOworCisJY2hhbi0+dHhfZG9uZSA9IGNocmRldl90eF9kb25lOworCWNoYW4tPnNldHVwX3J4ID0gY2hyZGV2X3NldHVwX3J4OworCWNoYW4tPnJ4X2RvbmUgPSBjaHJkZXZfcnhfZG9uZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29zYV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW5uZWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNvc2FfZGF0YSAqY29zYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY29zYSA9IGNoYW5uZWwtPmNvc2E7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwljb3NhLT51c2FnZS0tOworCWNoYW5uZWwtPnVzYWdlLS07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09TQV9GQVNZTkNfV09SS0lORworc3RhdGljIHN0cnVjdCBmYXN5bmNfc3RydWN0ICpmYXN5bmNbMjU2XSA9IHsgTlVMTCwgfTsKKworLyogVG8gYmUgZG9uZSAuLi4gKi8KK3N0YXRpYyBpbnQgY29zYV9mYXN5bmMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKK3sKKyAgICAgICAgaW50IHBvcnQgPSBpbWlub3IoaW5vZGUpOworICAgICAgICBpbnQgcnYgPSBmYXN5bmNfaGVscGVyKGlub2RlLCBmaWxlLCBvbiwgJmZhc3luY1twb3J0XSk7CisgICAgICAgIHJldHVybiBydiA8IDAgPyBydiA6IDA7Cit9CisjZW5kaWYKKworDAorLyogLS0tLS0tLS0tLSBJb2N0bHMgLS0tLS0tLS0tLSAqLworCisvKgorICogSW9jdGwgc3Vicm91dGluZXMgY2FuIHNhZmVseSBiZSBtYWRlIGlubGluZSwgYmVjYXVzZSB0aGV5IGFyZSBjYWxsZWQKKyAqIG9ubHkgZnJvbSBjb3NhX2lvY3RsKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvc2FfcmVzZXQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSkKK3sKKwljaGFyIGlkc3RyaW5nW0NPU0FfTUFYX0lEX1NUUklOR107CisJaWYgKGNvc2EtPnVzYWdlID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBXQVJOSU5HOiByZXNldCByZXF1ZXN0ZWQgd2l0aCBjb3NhLT51c2FnZSA+IDEgKCVkKS4gT2RkIHRoaW5ncyBtYXkgaGFwcGVuLlxuIiwKKwkJCWNvc2EtPm51bSwgY29zYS0+dXNhZ2UpOworCWNvc2EtPmZpcm13YXJlX3N0YXR1cyAmPSB+KENPU0FfRldfUkVTRVR8Q09TQV9GV19TVEFSVCk7CisJaWYgKGNvc2FfcmVzZXRfYW5kX3JlYWRfaWQoY29zYSwgaWRzdHJpbmcpIDwgMCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImNvc2ElZDogcmVzZXQgZmFpbGVkXG4iLCBjb3NhLT5udW0pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiByZXNldHRpbmcgZGV2aWNlOiAlc1xuIiwgY29zYS0+bnVtLAorCQlpZHN0cmluZyk7CisJY29zYS0+ZmlybXdhcmVfc3RhdHVzIHw9IENPU0FfRldfUkVTRVQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIEhpZ2gtbGV2ZWwgZnVuY3Rpb24gdG8gZG93bmxvYWQgZGF0YSBpbnRvIENPU0EgbWVtb3J5LiBDYWxscyBkb3dubG9hZCgpICovCitzdGF0aWMgaW5saW5lIGludCBjb3NhX2Rvd25sb2FkKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGNvc2FfZG93bmxvYWQgZDsKKwlpbnQgaTsKKworCWlmIChjb3NhLT51c2FnZSA+IDEpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBXQVJOSU5HOiBkb3dubG9hZCBvZiBtaWNyb2NvZGUgcmVxdWVzdGVkIHdpdGggY29zYS0+dXNhZ2UgPiAxICglZCkuIE9kZCB0aGluZ3MgbWF5IGhhcHBlbi5cbiIsCisJCQljb3NhLT5uYW1lLCBjb3NhLT51c2FnZSk7CisJaWYgKCEoY29zYS0+ZmlybXdhcmVfc3RhdHVzICYgQ09TQV9GV19SRVNFVCkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogcmVzZXQgdGhlIGNhcmQgZmlyc3QgKHN0YXR1cyAlZCkuXG4iLAorCQkJY29zYS0+bmFtZSwgY29zYS0+ZmlybXdhcmVfc3RhdHVzKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkLCBhcmcsIHNpemVvZihkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGQuYWRkciA8IDAgfHwgZC5hZGRyID4gQ09TQV9NQVhfRklSTVdBUkVfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGQubGVuIDwgMCB8fCBkLmxlbiA+IENPU0FfTUFYX0ZJUk1XQVJFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisKKwkvKiBJZiBzb21ldGhpbmcgZmFpbHMsIGZvcmNlIHRoZSB1c2VyIHRvIHJlc2V0IHRoZSBjYXJkICovCisJY29zYS0+ZmlybXdhcmVfc3RhdHVzICY9IH4oQ09TQV9GV19SRVNFVHxDT1NBX0ZXX0RPV05MT0FEKTsKKworCWkgPSBkb3dubG9hZChjb3NhLCBkLmNvZGUsIGQubGVuLCBkLmFkZHIpOworCWlmIChpIDwgMCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImNvc2ElZDogbWljcm9jb2RlIGRvd25sb2FkIGZhaWxlZDogJWRcbiIsCisJCQljb3NhLT5udW0sIGkpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBkb3dubG9hZGluZyBtaWNyb2NvZGUgLSAweCUwNHggYnl0ZXMgYXQgMHglMDR4XG4iLAorCQljb3NhLT5udW0sIGQubGVuLCBkLmFkZHIpOworCWNvc2EtPmZpcm13YXJlX3N0YXR1cyB8PSBDT1NBX0ZXX1JFU0VUfENPU0FfRldfRE9XTkxPQUQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIEhpZ2gtbGV2ZWwgZnVuY3Rpb24gdG8gcmVhZCBDT1NBIG1lbW9yeS4gQ2FsbHMgcmVhZG1lbSgpICovCitzdGF0aWMgaW5saW5lIGludCBjb3NhX3JlYWRtZW0oc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgY29zYV9kb3dubG9hZCBkOworCWludCBpOworCisJaWYgKGNvc2EtPnVzYWdlID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBXQVJOSU5HOiByZWFkbWVtIHJlcXVlc3RlZCB3aXRoICIKKwkJCSJjb3NhLT51c2FnZSA+IDEgKCVkKS4gT2RkIHRoaW5ncyBtYXkgaGFwcGVuLlxuIiwKKwkJCWNvc2EtPm51bSwgY29zYS0+dXNhZ2UpOworCWlmICghKGNvc2EtPmZpcm13YXJlX3N0YXR1cyAmIENPU0FfRldfUkVTRVQpKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHJlc2V0IHRoZSBjYXJkIGZpcnN0IChzdGF0dXMgJWQpLlxuIiwKKwkJCWNvc2EtPm5hbWUsIGNvc2EtPmZpcm13YXJlX3N0YXR1cyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkLCBhcmcsIHNpemVvZihkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogSWYgc29tZXRoaW5nIGZhaWxzLCBmb3JjZSB0aGUgdXNlciB0byByZXNldCB0aGUgY2FyZCAqLworCWNvc2EtPmZpcm13YXJlX3N0YXR1cyAmPSB+Q09TQV9GV19SRVNFVDsKKworCWkgPSByZWFkbWVtKGNvc2EsIGQuY29kZSwgZC5sZW4sIGQuYWRkcik7CisJaWYgKGkgPCAwKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiY29zYSVkOiByZWFkaW5nIG1lbW9yeSBmYWlsZWQ6ICVkXG4iLAorCQkJY29zYS0+bnVtLCBpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogcmVhZGluZyBjYXJkIG1lbW9yeSAtIDB4JTA0eCBieXRlcyBhdCAweCUwNHhcbiIsCisJCWNvc2EtPm51bSwgZC5sZW4sIGQuYWRkcik7CisJY29zYS0+ZmlybXdhcmVfc3RhdHVzIHw9IENPU0FfRldfUkVTRVQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIEhpZ2gtbGV2ZWwgZnVuY3Rpb24gdG8gc3RhcnQgbWljcm9jb2RlLiBDYWxscyBzdGFydG1pY3JvY29kZSgpLiAqLworc3RhdGljIGlubGluZSBpbnQgY29zYV9zdGFydChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgYWRkcmVzcykKK3sKKwlpbnQgaTsKKworCWlmIChjb3NhLT51c2FnZSA+IDEpCisJCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogV0FSTklORzogc3RhcnQgbWljcm9jb2RlIHJlcXVlc3RlZCB3aXRoIGNvc2EtPnVzYWdlID4gMSAoJWQpLiBPZGQgdGhpbmdzIG1heSBoYXBwZW4uXG4iLAorCQkJY29zYS0+bnVtLCBjb3NhLT51c2FnZSk7CisKKwlpZiAoKGNvc2EtPmZpcm13YXJlX3N0YXR1cyAmIChDT1NBX0ZXX1JFU0VUfENPU0FfRldfRE9XTkxPQUQpKQorCQkhPSAoQ09TQV9GV19SRVNFVHxDT1NBX0ZXX0RPV05MT0FEKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBkb3dubG9hZCB0aGUgbWljcm9jb2RlIGFuZC9vciByZXNldCB0aGUgY2FyZCBmaXJzdCAoc3RhdHVzICVkKS5cbiIsCisJCQljb3NhLT5uYW1lLCBjb3NhLT5maXJtd2FyZV9zdGF0dXMpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwljb3NhLT5maXJtd2FyZV9zdGF0dXMgJj0gfkNPU0FfRldfUkVTRVQ7CisJaWYgKChpPXN0YXJ0bWljcm9jb2RlKGNvc2EsIGFkZHJlc3MpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJjb3NhJWQ6IHN0YXJ0IG1pY3JvY29kZSBhdCAweCUwNHggZmFpbGVkOiAlZFxuIiwKKwkJCWNvc2EtPm51bSwgYWRkcmVzcywgaSk7CisJCXJldHVybiAtRUlPOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJjb3NhJWQ6IHN0YXJ0aW5nIG1pY3JvY29kZSBhdCAweCUwNHhcbiIsCisJCWNvc2EtPm51bSwgYWRkcmVzcyk7CisJY29zYS0+c3RhcnRhZGRyID0gYWRkcmVzczsKKwljb3NhLT5maXJtd2FyZV9zdGF0dXMgfD0gQ09TQV9GV19TVEFSVDsKKwlyZXR1cm4gMDsKK30KKwkJCisvKiBCdWZmZXIgb2Ygc2l6ZSBhdCBsZWFzdCBDT1NBX01BWF9JRF9TVFJJTkcgaXMgZXhwZWN0ZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvc2FfZ2V0aWRzdHIoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgY2hhciBfX3VzZXIgKnN0cmluZykKK3sKKwlpbnQgbCA9IHN0cmxlbihjb3NhLT5pZF9zdHJpbmcpKzE7CisJaWYgKGNvcHlfdG9fdXNlcihzdHJpbmcsIGNvc2EtPmlkX3N0cmluZywgbCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiBsOworfQorCisvKiBCdWZmZXIgb2Ygc2l6ZSBhdCBsZWFzdCBDT1NBX01BWF9JRF9TVFJJTkcgaXMgZXhwZWN0ZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvc2FfZ2V0dHlwZShzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBjaGFyIF9fdXNlciAqc3RyaW5nKQoreworCWludCBsID0gc3RybGVuKGNvc2EtPnR5cGUpKzE7CisJaWYgKGNvcHlfdG9fdXNlcihzdHJpbmcsIGNvc2EtPnR5cGUsIGwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gbDsKK30KKworc3RhdGljIGludCBjb3NhX2lvY3RsX2NvbW1vbihzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLAorCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW5uZWwsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN3aXRjaChjbWQpIHsKKwljYXNlIENPU0FJT1JTRVQ6CS8qIFJlc2V0IHRoZSBkZXZpY2UgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCXJldHVybiBjb3NhX3Jlc2V0KGNvc2EpOworCWNhc2UgQ09TQUlPU1RSVDoJLyogU3RhcnQgdGhlIGZpcm13YXJlICovCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gY29zYV9zdGFydChjb3NhLCBhcmcpOworCWNhc2UgQ09TQUlPRE9XTkxEOgkvKiBEb3dubG9hZCB0aGUgZmlybXdhcmUgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCQorCQlyZXR1cm4gY29zYV9kb3dubG9hZChjb3NhLCBhcmdwKTsKKwljYXNlIENPU0FJT1JNRU06CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gY29zYV9yZWFkbWVtKGNvc2EsIGFyZ3ApOworCWNhc2UgQ09TQUlPUlRZUEU6CisJCXJldHVybiBjb3NhX2dldHR5cGUoY29zYSwgYXJncCk7CisJY2FzZSBDT1NBSU9SSURTVFI6CisJCXJldHVybiBjb3NhX2dldGlkc3RyKGNvc2EsIGFyZ3ApOworCWNhc2UgQ09TQUlPTlJDQVJEUzoKKwkJcmV0dXJuIG5yX2NhcmRzOworCWNhc2UgQ09TQUlPTlJDSEFOUzoKKwkJcmV0dXJuIGNvc2EtPm5jaGFubmVsczsKKwljYXNlIENPU0FJT0JNU0VUOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJaWYgKGlzXzhiaXQoY29zYSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGFyZyAhPSBDT1NBX0JNX09GRiAmJiBhcmcgIT0gQ09TQV9CTV9PTikKKwkJCXJldHVybiAtRUlOVkFMOworCQljb3NhLT5idXNtYXN0ZXIgPSBhcmc7CisJCXJldHVybiAwOworCWNhc2UgQ09TQUlPQk1HRVQ6CisJCXJldHVybiBjb3NhLT5idXNtYXN0ZXI7CisJfQorCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CisKK3N0YXRpYyBpbnQgY29zYV9zcHBwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLAorCWludCBjbWQpCit7CisJaW50IHJ2OworCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4gPSBkZXYtPnByaXY7CisJcnYgPSBjb3NhX2lvY3RsX2NvbW1vbihjaGFuLT5jb3NhLCBjaGFuLCBjbWQsICh1bnNpZ25lZCBsb25nKWlmci0+aWZyX2RhdGEpOworCWlmIChydiA9PSAtRU5PSU9DVExDTUQpIHsKKwkJcmV0dXJuIHNwcHBfZG9faW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJfQorCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBjb3NhX2NoYXJkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhID0gY2hhbm5lbC0+Y29zYTsKKwlyZXR1cm4gY29zYV9pb2N0bF9jb21tb24oY29zYSwgY2hhbm5lbCwgY21kLCBhcmcpOworfQorCisMCisvKi0tLS0tLS0tLS0gSFcgbGF5ZXIgaW50ZXJmYWNlIC0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRoZSBoaWdoZXIgbGF5ZXIgY2FuIGJpbmQgaXRzZWxmIHRvIHRoZSBIVyBsYXllciBieSBzZXR0aW5nIHRoZSBjYWxsYmFja3MKKyAqIGluIHRoZSBjaGFubmVsX2RhdGEgc3RydWN0dXJlIGFuZCBieSB1c2luZyB0aGVzZSByb3V0aW5lcy4KKyAqLworc3RhdGljIHZvaWQgY29zYV9lbmFibGVfcngoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbikKK3sKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhID0gY2hhbi0+Y29zYTsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChjaGFuLT5udW0sICZjb3NhLT5yeGJpdG1hcCkpCisJCXB1dF9kcml2ZXJfc3RhdHVzKGNvc2EpOworfQorCitzdGF0aWMgdm9pZCBjb3NhX2Rpc2FibGVfcngoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbikKK3sKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhID0gY2hhbi0+Y29zYTsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoY2hhbi0+bnVtLCAmY29zYS0+cnhiaXRtYXApKQorCQlwdXRfZHJpdmVyX3N0YXR1cyhjb3NhKTsKK30KKworLyoKKyAqIEZJWE1FOiBUaGlzIHJvdXRpbmUgcHJvYmFibHkgc2hvdWxkIGNoZWNrIGZvciBjb3NhX3N0YXJ0X3R4KCkgY2FsbGVkIHdoZW4KKyAqIHRoZSBwcmV2aW91cyB0cmFuc21pdCBpcyBzdGlsbCB1bmZpbmlzaGVkLiBJbiB0aGlzIGNhc2UgdGhlIG5vbi16ZXJvCisgKiByZXR1cm4gdmFsdWUgc2hvdWxkIGluZGljYXRlIHRvIHRoZSBjYWxsZXIgdGhhdCB0aGUgcXVldWluZyhzcD8pIHVwCisgKiB0aGUgdHJhbnNtaXQgaGFzIGZhaWxlZC4KKyAqLworc3RhdGljIGludCBjb3NhX3N0YXJ0X3R4KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4sIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhID0gY2hhbi0+Y29zYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIERFQlVHX0RBVEEKKwlpbnQgaTsKKworCXByaW50ayhLRVJOX0lORk8gImNvc2ElZGMlZDogc3RhcnRpbmcgdHgoMHgleCkiLCBjaGFuLT5jb3NhLT5udW0sCisJCWNoYW4tPm51bSwgbGVuKTsKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykKKwkJcHJpbnRrKCIgJTAyeCIsIGJ1ZltpXSYweGZmKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCWNoYW4tPnR4YnVmID0gYnVmOworCWNoYW4tPnR4c2l6ZSA9IGxlbjsKKwlpZiAobGVuID4gQ09TQV9NVFUpCisJCWNoYW4tPnR4c2l6ZSA9IENPU0FfTVRVOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKworCS8qIFRlbGwgdGhlIGZpcm13YXJlIHdlIGFyZSByZWFkeSAqLworCXNldF9iaXQoY2hhbi0+bnVtLCAmY29zYS0+dHhiaXRtYXApOworCXB1dF9kcml2ZXJfc3RhdHVzKGNvc2EpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9kcml2ZXJfc3RhdHVzKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKworCXN0YXR1cyA9IChjb3NhLT5yeGJpdG1hcCA/IERSSVZFUl9SWF9SRUFEWSA6IDApCisJCXwgKGNvc2EtPnR4Yml0bWFwID8gRFJJVkVSX1RYX1JFQURZIDogMCkKKwkJfCAoY29zYS0+dHhiaXRtYXA/IH4oY29zYS0+dHhiaXRtYXA8PERSSVZFUl9UWE1BUF9TSElGVCkKKwkJCSZEUklWRVJfVFhNQVBfTUFTSyA6IDApOworCWlmICghY29zYS0+cnh0eCkgeworCQlpZiAoY29zYS0+cnhiaXRtYXB8Y29zYS0+dHhiaXRtYXApIHsKKwkJCWlmICghY29zYS0+ZW5hYmxlZCkgeworCQkJCWNvc2FfcHV0c3RhdHVzKGNvc2EsIFNSX1JYX0lOVF9FTkEpOworI2lmZGVmIERFQlVHX0lPCisJCQkJZGVidWdfc3RhdHVzX291dChjb3NhLCBTUl9SWF9JTlRfRU5BKTsKKyNlbmRpZgorCQkJCWNvc2EtPmVuYWJsZWQgPSAxOworCQkJfQorCQl9IGVsc2UgaWYgKGNvc2EtPmVuYWJsZWQpIHsKKwkJCWNvc2EtPmVuYWJsZWQgPSAwOworCQkJY29zYV9wdXRzdGF0dXMoY29zYSwgMCk7CisjaWZkZWYgREVCVUdfSU8KKwkJCWRlYnVnX3N0YXR1c19vdXQoY29zYSwgMCk7CisjZW5kaWYKKwkJfQorCQljb3NhX3B1dGRhdGE4KGNvc2EsIHN0YXR1cyk7CisjaWZkZWYgREVCVUdfSU8KKwkJZGVidWdfZGF0YV9jbWQoY29zYSwgc3RhdHVzKTsKKyNlbmRpZgorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9kcml2ZXJfc3RhdHVzX25vbG9jayhzdHJ1Y3QgY29zYV9kYXRhICpjb3NhKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSAoY29zYS0+cnhiaXRtYXAgPyBEUklWRVJfUlhfUkVBRFkgOiAwKQorCQl8IChjb3NhLT50eGJpdG1hcCA/IERSSVZFUl9UWF9SRUFEWSA6IDApCisJCXwgKGNvc2EtPnR4Yml0bWFwPyB+KGNvc2EtPnR4Yml0bWFwPDxEUklWRVJfVFhNQVBfU0hJRlQpCisJCQkmRFJJVkVSX1RYTUFQX01BU0sgOiAwKTsKKworCWlmIChjb3NhLT5yeGJpdG1hcHxjb3NhLT50eGJpdG1hcCkgeworCQljb3NhX3B1dHN0YXR1cyhjb3NhLCBTUl9SWF9JTlRfRU5BKTsKKyNpZmRlZiBERUJVR19JTworCQlkZWJ1Z19zdGF0dXNfb3V0KGNvc2EsIFNSX1JYX0lOVF9FTkEpOworI2VuZGlmCisJCWNvc2EtPmVuYWJsZWQgPSAxOworCX0gZWxzZSB7CisJCWNvc2FfcHV0c3RhdHVzKGNvc2EsIDApOworI2lmZGVmIERFQlVHX0lPCisJCWRlYnVnX3N0YXR1c19vdXQoY29zYSwgMCk7CisjZW5kaWYKKwkJY29zYS0+ZW5hYmxlZCA9IDA7CisJfQorCWNvc2FfcHV0ZGF0YTgoY29zYSwgc3RhdHVzKTsKKyNpZmRlZiBERUJVR19JTworCWRlYnVnX2RhdGFfY21kKGNvc2EsIHN0YXR1cyk7CisjZW5kaWYKK30KKworLyoKKyAqIFRoZSAia2lja21lIiBmdW5jdGlvbjogV2hlbiB0aGUgRE1BIHRpbWVzIG91dCwgdGhpcyBpcyBjYWxsZWQgdG8KKyAqIGNsZWFuIHVwIHRoZSBkcml2ZXIgc3RhdHVzLgorICogRklYTUU6IFByZWxpbWluYXJ5IHN1cHBvcnQsIHRoZSBpbnRlcmZhY2UgaXMgcHJvYmFibHkgd3JvbmcuCisgKi8KK3N0YXRpYyB2b2lkIGNvc2Ffa2ljayhzdHJ1Y3QgY29zYV9kYXRhICpjb3NhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGZsYWdzMTsKKwljaGFyICpzID0gIihwcm9iYWJseSkgSVJRIjsKKworCWlmICh0ZXN0X2JpdChSWEJJVCwgJmNvc2EtPnJ4dHgpKQorCQlzID0gIlJYIERNQSI7CisJaWYgKHRlc3RfYml0KFRYQklULCAmY29zYS0+cnh0eCkpCisJCXMgPSAiVFggRE1BIjsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyB0aW1lb3V0IC0gcmVzdGFydGluZy5cbiIsIGNvc2EtPm5hbWUsIHMpOyAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCWNvc2EtPnJ4dHggPSAwOworCisJZmxhZ3MxID0gY2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYShjb3NhLT5kbWEpOworCWNsZWFyX2RtYV9mZihjb3NhLT5kbWEpOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MxKTsKKworCS8qIEZJWE1FOiBBbnl0aGluZyBlbHNlPyAqLworCXVkZWxheSgxMDApOworCWNvc2FfcHV0c3RhdHVzKGNvc2EsIDApOworCXVkZWxheSgxMDApOworCSh2b2lkKSBjb3NhX2dldGRhdGE4KGNvc2EpOworCXVkZWxheSgxMDApOworCWNvc2FfcHV0ZGF0YTgoY29zYSwgMCk7CisJdWRlbGF5KDEwMCk7CisJcHV0X2RyaXZlcl9zdGF0dXNfbm9sb2NrKGNvc2EpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSB3aG9sZSBidWZmZXIgaXMgRE1BLWFibGUuIEl0IG1lYW5zIGl0IGlzIGJlbG93IHRoZSAxNk0gb2YKKyAqIHBoeXNpY2FsIG1lbW9yeSBhbmQgZG9lc24ndCBzcGFuIHRoZSA2NGsgYm91bmRhcnkuIEZvciBub3cgaXQgc2VlbXMKKyAqIFNLQidzIG5ldmVyIGRvIHRoaXMsIGJ1dCB3ZSdsbCBjaGVjayB0aGlzIGFueXdheS4KKyAqLworc3RhdGljIGludCBjb3NhX2RtYV9hYmxlKHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4sIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdGF0aWMgaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgYiA9ICh1bnNpZ25lZCBsb25nKWJ1ZjsKKwlpZiAoYitsZW4gPj0gTUFYX0RNQV9BRERSRVNTKQorCQlyZXR1cm4gMDsKKwlpZiAoKGJeIChiK2xlbikpICYgMHgxMDAwMCkgeworCQlpZiAoY291bnQrKyA8IDUpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGFja2V0IHNwYW5uaW5nIGEgNjRrIGJvdW5kYXJ5XG4iLAorCQkJCWNoYW4tPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKwwKKy8qIC0tLS0tLS0tLS0gVGhlIFNSUC9DT1NBIFJPTSBtb25pdG9yIGZ1bmN0aW9ucyAtLS0tLS0tLS0tICovCisKKy8qCisgKiBEb3dubG9hZGluZyBTUlAgbWljcm9jb2RlOiBzYXkgInciIHRvIFNSUCBtb25pdG9yLCBpdCBhbnN3ZXJzIGJ5ICJ3PSIsCisgKiBkcml2ZXJzIG5lZWQgdG8gc2F5IDQtZGlnaXQgaGV4IG51bWJlciBtZWFuaW5nIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG1pY3JvY29kZQorICogc2VwYXJhdGVkIGJ5IGEgc2luZ2xlIHNwYWNlLiBNb25pdG9yIHJlcGxpZXMgYnkgc2F5aW5nICIgPSIuIE5vdyBkcml2ZXIKKyAqIGhhcyB0byB3cml0ZSA0LWRpZ2l0IGhleCBudW1iZXIgbWVhbmluZyB0aGUgbGFzdCBieXRlIGFkZHJlc3MgZW5kZWQKKyAqIGJ5IGEgc2luZ2xlIHNwYWNlLiBNb25pdG9yIGhhcyB0byByZXBseSB3aXRoIGEgc3BhY2UuIE5vdyB0aGUgZG93bmxvYWQKKyAqIGJlZ2lucy4gQWZ0ZXIgdGhlIGRvd25sb2FkIG1vbml0b3IgcmVwbGllcyB3aXRoICJcclxuLiIgKENSIExGIGRvdCkuCisgKi8KK3N0YXRpYyBpbnQgZG93bmxvYWQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgY29uc3QgY2hhciBfX3VzZXIgKm1pY3JvY29kZSwgaW50IGxlbmd0aCwgaW50IGFkZHJlc3MpCit7CisJaW50IGk7CisKKwlpZiAocHV0X3dhaXRfZGF0YShjb3NhLCAndycpID09IC0xKSByZXR1cm4gLTE7CisJaWYgKChpPWdldF93YWl0X2RhdGEoY29zYSkpICE9ICd3JykgeyBwcmludGsoImRubGQ6IDB4JTA0eFxuIixpKTsgcmV0dXJuIC0yO30KKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnPScpIHJldHVybiAtMzsKKworCWlmIChwdXRoZXhudW1iZXIoY29zYSwgYWRkcmVzcykgPCAwKSByZXR1cm4gLTQ7CisJaWYgKHB1dF93YWl0X2RhdGEoY29zYSwgJyAnKSA9PSAtMSkgcmV0dXJuIC0xMDsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnICcpIHJldHVybiAtMTE7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJz0nKSByZXR1cm4gLTEyOworCisJaWYgKHB1dGhleG51bWJlcihjb3NhLCBhZGRyZXNzK2xlbmd0aC0xKSA8IDApIHJldHVybiAtMTM7CisJaWYgKHB1dF93YWl0X2RhdGEoY29zYSwgJyAnKSA9PSAtMSkgcmV0dXJuIC0xODsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnICcpIHJldHVybiAtMTk7CisKKwl3aGlsZSAobGVuZ3RoLS0pIHsKKwkJY2hhciBjOworI2lmbmRlZiBTUlBfRE9XTkxPQURfQVRfQk9PVAorCQlpZiAoZ2V0X3VzZXIoYywgbWljcm9jb2RlKSkKKwkJCXJldHVybiAtMjM7IC8qID8/PyAqLworI2Vsc2UKKwkJYyA9ICptaWNyb2NvZGU7CisjZW5kaWYKKwkJaWYgKHB1dF93YWl0X2RhdGEoY29zYSwgYykgPT0gLTEpCisJCQlyZXR1cm4gLTIwOworCQltaWNyb2NvZGUrKzsKKwl9CisKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnXHInKSByZXR1cm4gLTIxOworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICdcbicpIHJldHVybiAtMjI7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJy4nKSByZXR1cm4gLTIzOworI2lmIDAKKwlwcmludGsoS0VSTl9ERUJVRyAiY29zYSVkOiBkb3dubG9hZCBjb21wbGV0ZWQuXG4iLCBjb3NhLT5udW0pOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFN0YXJ0aW5nIG1pY3JvY29kZSBpcyBkb25lIHZpYSB0aGUgImciIGNvbW1hbmQgb2YgdGhlIFNSUCBtb25pdG9yLgorICogVGhlIGNoYXQgc2hvdWxkIGJlIHRoZSBmb2xsb3dpbmc6ICJnIiAiZz0iICI8YWRkcj48Q1I+IgorICogIjxDUj48Q1I+PExGPjxDUj48TEY+Ii4KKyAqLworc3RhdGljIGludCBzdGFydG1pY3JvY29kZShzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgYWRkcmVzcykKK3sKKwlpZiAocHV0X3dhaXRfZGF0YShjb3NhLCAnZycpID09IC0xKSByZXR1cm4gLTE7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJ2cnKSByZXR1cm4gLTI7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJz0nKSByZXR1cm4gLTM7CisKKwlpZiAocHV0aGV4bnVtYmVyKGNvc2EsIGFkZHJlc3MpIDwgMCkgcmV0dXJuIC00OworCWlmIChwdXRfd2FpdF9kYXRhKGNvc2EsICdccicpID09IC0xKSByZXR1cm4gLTU7CisJCisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJ1xyJykgcmV0dXJuIC02OworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICdccicpIHJldHVybiAtNzsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnXG4nKSByZXR1cm4gLTg7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJ1xyJykgcmV0dXJuIC05OworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICdcbicpIHJldHVybiAtMTA7CisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICJjb3NhJWQ6IG1pY3JvY29kZSBzdGFydGVkXG4iLCBjb3NhLT5udW0pOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkaW5nIG1lbW9yeSBpcyBkb25lIHZpYSB0aGUgInIiIGNvbW1hbmQgb2YgdGhlIFNSUCBtb25pdG9yLgorICogVGhlIGNoYXQgaXMgdGhlIGZvbGxvd2luZyAiciIgInI9IiAiPGFkZHI+ICIgIiA9IiAiPGxhc3RfYnl0ZT4gIiAiICIKKyAqIFRoZW4gZHJpdmVyIGNhbiByZWFkIHRoZSBkYXRhIGFuZCB0aGUgY29udmVyc2F0aW9uIGlzIGZpbmlzaGVkCisgKiBieSBTUlAgbW9uaXRvciBzZW5kaW5nICI8Q1I+PExGPi4iIChkb3QgYXQgdGhlIGVuZCkuCisgKgorICogVGhpcyByb3V0aW5lIGlzIG5vdCBuZWVkZWQgZHVyaW5nIHRoZSBub3JtYWwgb3BlcmF0aW9uIGFuZCBzZXJ2ZXMKKyAqIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KKyAqLworc3RhdGljIGludCByZWFkbWVtKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGNoYXIgX191c2VyICptaWNyb2NvZGUsIGludCBsZW5ndGgsIGludCBhZGRyZXNzKQoreworCWlmIChwdXRfd2FpdF9kYXRhKGNvc2EsICdyJykgPT0gLTEpIHJldHVybiAtMTsKKwlpZiAoKGdldF93YWl0X2RhdGEoY29zYSkpICE9ICdyJykgcmV0dXJuIC0yOworCWlmICgoZ2V0X3dhaXRfZGF0YShjb3NhKSkgIT0gJz0nKSByZXR1cm4gLTM7CisKKwlpZiAocHV0aGV4bnVtYmVyKGNvc2EsIGFkZHJlc3MpIDwgMCkgcmV0dXJuIC00OworCWlmIChwdXRfd2FpdF9kYXRhKGNvc2EsICcgJykgPT0gLTEpIHJldHVybiAtNTsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnICcpIHJldHVybiAtNjsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnPScpIHJldHVybiAtNzsKKworCWlmIChwdXRoZXhudW1iZXIoY29zYSwgYWRkcmVzcytsZW5ndGgtMSkgPCAwKSByZXR1cm4gLTg7CisJaWYgKHB1dF93YWl0X2RhdGEoY29zYSwgJyAnKSA9PSAtMSkgcmV0dXJuIC05OworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICcgJykgcmV0dXJuIC0xMDsKKworCXdoaWxlIChsZW5ndGgtLSkgeworCQljaGFyIGM7CisJCWludCBpOworCQlpZiAoKGk9Z2V0X3dhaXRfZGF0YShjb3NhKSkgPT0gLTEpIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJjb3NhOiAweCUwNHggYnl0ZXMgcmVtYWluaW5nXG4iLAorCQkJCWxlbmd0aCk7CisJCQlyZXR1cm4gLTExOworCQl9CisJCWM9aTsKKyNpZiAxCisJCWlmIChwdXRfdXNlcihjLCBtaWNyb2NvZGUpKQorCQkJcmV0dXJuIC0yMzsgLyogPz8/ICovCisjZWxzZQorCQkqbWljcm9jb2RlID0gYzsKKyNlbmRpZgorCQltaWNyb2NvZGUrKzsKKwl9CisKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnXHInKSByZXR1cm4gLTIxOworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICdcbicpIHJldHVybiAtMjI7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJy4nKSByZXR1cm4gLTIzOworI2lmIDAKKwlwcmludGsoS0VSTl9ERUJVRyAiY29zYSVkOiByZWFkbWVtIGNvbXBsZXRlZC5cbiIsIGNvc2EtPm51bSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBkZXZpY2UgYW5kIHJlYWRzIHRoZSBpbml0aWFsIHByb21wdAorICogb2YgdGhlIGRldmljZSdzIFJPTSBtb25pdG9yLgorICovCitzdGF0aWMgaW50IGNvc2FfcmVzZXRfYW5kX3JlYWRfaWQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgY2hhciAqaWRzdHJpbmcpCit7CisJaW50IGk9MCwgaWQ9MCwgcHJldj0wLCBjdXJyPTA7CisKKwkvKiBSZXNldCB0aGUgY2FyZCAuLi4gKi8KKwljb3NhX3B1dHN0YXR1cyhjb3NhLCAwKTsKKwljb3NhX2dldGRhdGE4KGNvc2EpOworCWNvc2FfcHV0c3RhdHVzKGNvc2EsIFNSX1JTVCk7CisjaWZkZWYgTU9EVUxFCisJbXNsZWVwKDUwMCk7CisjZWxzZQorCXVkZWxheSg1KjEwMDAwMCk7CisjZW5kaWYKKwkvKiBEaXNhYmxlIGFsbCBJUlFzIGZyb20gdGhlIGNhcmQgKi8KKwljb3NhX3B1dHN0YXR1cyhjb3NhLCAwKTsKKworCS8qCisJICogVHJ5IHRvIHJlYWQgdGhlIElEIHN0cmluZy4gVGhlIGNhcmQgdGhlbiBwcmludHMgb3V0IHRoZQorCSAqIGlkZW50aWZpY2F0aW9uIHN0cmluZyBlbmRlZCBieSB0aGUgIlxuXHgyZSIuCisJICoKKwkgKiBUaGUgZm9sbG93aW5nIGxvb3AgaXMgaW5kZXhlZCB0aHJvdWdoIGkgKGluc3RlYWQgb2YgaWQpCisJICogdG8gYXZvaWQgbG9vcGluZyBmb3JldmVyIHdoZW4gZm9yIGFueSByZWFzb24KKwkgKiB0aGUgcG9ydCByZXR1cm5zICdccicsICdcbicgb3IgJ1x4MmUnIHBlcm1hbmVudGx5LgorCSAqLworCWZvciAoaT0wOyBpPENPU0FfTUFYX0lEX1NUUklORy0xOyBpKyssIHByZXY9Y3VycikgeworCQlpZiAoKGN1cnIgPSBnZXRfd2FpdF9kYXRhKGNvc2EpKSA9PSAtMSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCWN1cnIgJj0gMHhmZjsKKwkJaWYgKGN1cnIgIT0gJ1xyJyAmJiBjdXJyICE9ICdcbicgJiYgY3VyciAhPSAweDJlKQorCQkJaWRzdHJpbmdbaWQrK10gPSBjdXJyOworCQlpZiAoY3VyciA9PSAweDJlICYmIHByZXYgPT0gJ1xuJykKKwkJCWJyZWFrOworCX0KKwkvKiBQZXJoYXBzIHdlIHNob3VsZCBmYWlsIHdoZW4gaT09Q09TQV9NQVhfSURfU1RSSU5HLTEgPyAqLworCWlkc3RyaW5nW2lkXSA9ICdcMCc7CisJcmV0dXJuIGlkOworfQorCisMCisvKiAtLS0tLS0tLS0tIEF1eGlsaWFyeSByb3V0aW5lcyBmb3IgQ09TQS9TUlAgbW9uaXRvciAtLS0tLS0tLS0tICovCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgZ2V0cyB0aGUgZGF0YSBieXRlIGZyb20gdGhlIGNhcmQgd2FpdGluZyBmb3IgdGhlIFNSX1JYX1JEWQorICogYml0IHRvIGJlIHNldCBpbiBhIGxvb3AuIEl0IHNob3VsZCBiZSB1c2VkIGluIHRoZSBleGNlcHRpb25hbCBjYXNlcworICogb25seSAoZm9yIGV4YW1wbGUgd2hlbiByZXNldHRpbmcgdGhlIGNhcmQgb3IgZG93bmxvYWRpbmcgdGhlIGZpcm13YXJlLgorICovCitzdGF0aWMgaW50IGdldF93YWl0X2RhdGEoc3RydWN0IGNvc2FfZGF0YSAqY29zYSkKK3sKKwlpbnQgcmV0cmllcyA9IDEwMDA7CisKKwl3aGlsZSAoLS1yZXRyaWVzKSB7CisJCS8qIHJlYWQgZGF0YSBhbmQgcmV0dXJuIHRoZW0gKi8KKwkJaWYgKGNvc2FfZ2V0c3RhdHVzKGNvc2EpICYgU1JfUlhfUkRZKSB7CisJCQlzaG9ydCByOworCQkJciA9IGNvc2FfZ2V0ZGF0YTgoY29zYSk7CisjaWYgMAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYTogZ2V0X3dhaXRfZGF0YSByZXR1cm5pbmcgYWZ0ZXIgJWQgcmV0cmllc1xuIiwgOTk5LXJldHJpZXMpOworI2VuZGlmCisJCQlyZXR1cm4gcjsKKwkJfQorCQkvKiBzbGVlcCBpZiBub3QgcmVhZHkgdG8gcmVhZCAqLworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJjb3NhOiB0aW1lb3V0IGluIGdldF93YWl0X2RhdGEgKHN0YXR1cyAweCV4KVxuIiwKKwkJY29zYV9nZXRzdGF0dXMoY29zYSkpOworCXJldHVybiAtMTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBwdXRzIHRoZSBkYXRhIGJ5dGUgdG8gdGhlIGNhcmQgd2FpdGluZyBmb3IgdGhlIFNSX1RYX1JEWQorICogYml0IHRvIGJlIHNldCBpbiBhIGxvb3AuIEl0IHNob3VsZCBiZSB1c2VkIGluIHRoZSBleGNlcHRpb25hbCBjYXNlcworICogb25seSAoZm9yIGV4YW1wbGUgd2hlbiByZXNldHRpbmcgdGhlIGNhcmQgb3IgZG93bmxvYWRpbmcgdGhlIGZpcm13YXJlKS4KKyAqLworc3RhdGljIGludCBwdXRfd2FpdF9kYXRhKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBkYXRhKQoreworCWludCByZXRyaWVzID0gMTAwMDsKKwl3aGlsZSAoLS1yZXRyaWVzKSB7CisJCS8qIHJlYWQgZGF0YSBhbmQgcmV0dXJuIHRoZW0gKi8KKwkJaWYgKGNvc2FfZ2V0c3RhdHVzKGNvc2EpICYgU1JfVFhfUkRZKSB7CisJCQljb3NhX3B1dGRhdGE4KGNvc2EsIGRhdGEpOworI2lmIDAKKwkJCXByaW50ayhLRVJOX0lORk8gIlB1dGRhdGE6ICVkIHJldHJpZXNcbiIsIDk5OS1yZXRyaWVzKTsKKyNlbmRpZgorCQkJcmV0dXJuIDA7CisJCX0KKyNpZiAwCisJCS8qIHNsZWVwIGlmIG5vdCByZWFkeSB0byByZWFkICovCisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworI2VuZGlmCisJfQorCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogdGltZW91dCBpbiBwdXRfd2FpdF9kYXRhIChzdGF0dXMgMHgleClcbiIsCisJCWNvc2EtPm51bSwgY29zYV9nZXRzdGF0dXMoY29zYSkpOworCXJldHVybiAtMTsKK30KKwkKKy8qIAorICogVGhlIGZvbGxvd2luZyByb3V0aW5lIHB1dHMgdGhlIGhleGFkZWNpbWFsIG51bWJlciBpbnRvIHRoZSBTUlAgbW9uaXRvcgorICogYW5kIHZlcmlmaWVzIHRoZSBwcm9wZXIgZWNobyBvZiB0aGUgc2VudCBieXRlcy4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsCisgKiBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZSAoLTEsLTMsLTUsLTcpIG1lYW5zIHRoYXQgcHV0X3dhaXRfZGF0YSgpIGZhaWxlZCwKKyAqICgtMiwtNCwtNiwtOCkgbWVhbnMgdGhhdCByZWFkaW5nIGVjaG8gZmFpbGVkLgorICovCitzdGF0aWMgaW50IHB1dGhleG51bWJlcihzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgbnVtYmVyKQoreworCWNoYXIgdGVtcFs1XTsKKwlpbnQgaTsKKworCS8qIFdlbGwsIEkgc2hvdWxkIHByb2JhYmx5IHJlcGxhY2UgdGhpcyBieSBzb21ldGhpbmcgZmFzdGVyLiAqLworCXNwcmludGYodGVtcCwgIiUwNFgiLCBudW1iZXIpOworCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQlpZiAocHV0X3dhaXRfZGF0YShjb3NhLCB0ZW1wW2ldKSA9PSAtMSkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJjb3NhJWQ6IHB1dGhleG51bWJlciBmYWlsZWQgdG8gd3JpdGUgYnl0ZSAlZFxuIiwKKwkJCQljb3NhLT5udW0sIGkpOworCQkJcmV0dXJuIC0xLTIqaTsKKwkJfQorCQlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSB0ZW1wW2ldKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgImNvc2ElZDogcHV0aGV4aHVtYmVyIGZhaWxlZCB0byByZWFkIGVjaG8gb2YgYnl0ZSAlZFxuIiwKKwkJCQljb3NhLT5udW0sIGkpOworCQkJcmV0dXJuIC0yLTIqaTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworDAorLyogLS0tLS0tLS0tLSBJbnRlcnJ1cHQgcm91dGluZXMgLS0tLS0tLS0tLSAqLworCisvKgorICogVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIGludGVycnVwdDoKKyAqIEF0IHRoZSBiZWdpbm5pbmcgb2YgdHJhbnNtaXQgLSB0aGlzIGhhbmRsZWQgaXMgaW4gdHhfaW50ZXJydXB0KCksCisgKiBhdCB0aGUgYmVnaW5uaW5nIG9mIHJlY2VpdmUgLSBpdCBpcyBpbiByeF9pbnRlcnJ1cHQoKSBhbmQKKyAqIGF0IHRoZSBlbmQgb2YgdHJhbnNtaXQvcmVjZWl2ZSAtIGl0IGlzIHRoZSBlb3RfaW50ZXJydXB0KCkgZnVuY3Rpb24uCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG11bHRpcGxleGVkIGJ5IGNvc2FfaW50ZXJydXB0KCkgYWNjb3JkaW5nIHRvIHRoZQorICogQ09TQSBzdGF0dXMgYnl0ZS4gSSBoYXZlIG1vdmVkIHRoZSByeC90eC9lb3QgaW50ZXJydXB0IGhhbmRsaW5nIGludG8KKyAqIHNlcGFyYXRlIGZ1bmN0aW9ucyB0byBtYWtlIGl0IG1vcmUgcmVhZGFibGUuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW5saW5lLAorICogc28gdGhlcmUgc2hvdWxkIGJlIG5vIG92ZXJoZWFkIG9mIGZ1bmN0aW9uIGNhbGwuCisgKiAKKyAqIEluIHRoZSBDT1NBIGJ1cy1tYXN0ZXIgbW9kZSwgd2UgbmVlZCB0byB0ZWxsIHRoZSBjYXJkIHRoZSBhZGRyZXNzIG9mIGEKKyAqIGJ1ZmZlci4gVW5mb3J0dW5hdGVseSwgQ09TQSBtYXkgYmUgdG9vIHNsb3cgZm9yIHVzLCBzbyB3ZSBtdXN0IGJ1c3ktd2FpdC4KKyAqIEl0J3MgdGltZSB0byB1c2UgdGhlIGJvdHRvbSBoYWxmIDotKAorICovCisKKy8qCisgKiBUcmFuc21pdCBpbnRlcnJ1cHQgcm91dGluZSAtIGNhbGxlZCB3aGVuIENPU0EgaXMgd2lsbGluZyB0byBvYnRhaW4KKyAqIGRhdGEgZnJvbSB0aGUgT1MuIFRoZSBtb3N0IHRyaWNreSBwYXJ0IG9mIHRoZSByb3V0aW5lIGlzIHNlbGVjdGlvbgorICogb2YgY2hhbm5lbCB3ZSAoT1MpIHdhbnQgdG8gc2VuZCBwYWNrZXQgZm9yLiBGb3IgU1JQIHdlIHNob3VsZCBwcm9iYWJseQorICogdXNlIHRoZSByb3VuZC1yb2JpbiBhcHByb2FjaC4gVGhlIG5ld2VyIENPU0EgZmlybXdhcmVzIGhhdmUgYSBzaW1wbGUKKyAqIGZsb3ctY29udHJvbCAtIGluIHRoZSBzdGF0dXMgd29yZCBoYXMgYml0cyAyIGFuZCAzIHNldCB0byAxIG1lYW5zIHRoYXQgdGhlCisgKiBjaGFubmVsIDAgb3IgMSBkb2Vzbid0IHdhbnQgdG8gcmVjZWl2ZSBkYXRhLgorICoKKyAqIEl0IHNlZW1zIHRoZXJlIGlzIGEgYnVnIGluIENPU0EgZmlybXdhcmUgKG5lZWQgdG8gdHJhY2UgaXQgZnVydGhlcik6CisgKiBXaGVuIHRoZSBkcml2ZXIgc3RhdHVzIHNheXMgdGhhdCB0aGUga2VybmVsIGhhcyBubyBtb3JlIGRhdGEgZm9yIHRyYW5zbWl0CisgKiAoZS5nLiBhdCB0aGUgZW5kIG9mIFRYIERNQSkgYW5kIHRoZW4gdGhlIGtlcm5lbCBjaGFuZ2VzIGl0cyBtaW5kCisgKiAoZS5nLiBuZXcgcGFja2V0IGlzIHF1ZXVlZCB0byBoYXJkX3N0YXJ0X3htaXQoKSksIHRoZSBjYXJkIGlzc3VlcworICogdGhlIFRYIGludGVycnVwdCBidXQgZG9lcyBub3QgbWFyayB0aGUgY2hhbm5lbCBhcyByZWFkeS10by10cmFuc21pdC4KKyAqIFRoZSBmaXggc2VlbXMgdG8gYmUgdG8gcHVzaCB0aGUgcGFja2V0IHRvIENPU0EgZGVzcGl0ZSBpdHMgcmVxdWVzdC4KKyAqIFdlIGZpcnN0IHRyeSB0byBvYmV5IHRoZSBjYXJkJ3Mgb3BpbmlvbiwgYW5kIHRoZW4gZmFsbCBiYWNrIHRvIGZvcmNlZCBUWC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHR4X2ludGVycnVwdChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgc3RhdHVzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGZsYWdzMTsKKyNpZmRlZiBERUJVR19JUlFTCisJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBTUl9ET1dOX1JFUVVFU1Qgc3RhdHVzPTB4JTA0eFxuIiwKKwkJY29zYS0+bnVtLCBzdGF0dXMpOworI2VuZGlmCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwlzZXRfYml0KFRYQklULCAmY29zYS0+cnh0eCk7CisJaWYgKCF0ZXN0X2JpdChJUlFCSVQsICZjb3NhLT5yeHR4KSkgeworCQkvKiBmbG93IGNvbnRyb2wsIHNlZSB0aGUgY29tbWVudCBhYm92ZSAqLworCQlpbnQgaT0wOworCQlpZiAoIWNvc2EtPnR4Yml0bWFwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gY2hhbm5lbCB3YW50cyBkYXRhICIKKwkJCQkiaW4gVFggSVJRLiBFeHBlY3QgRE1BIHRpbWVvdXQuIiwKKwkJCQljb3NhLT5uYW1lKTsKKwkJCXB1dF9kcml2ZXJfc3RhdHVzX25vbG9jayhjb3NhKTsKKwkJCWNsZWFyX2JpdChUWEJJVCwgJmNvc2EtPnJ4dHgpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJCXdoaWxlKDEpIHsKKwkJCWNvc2EtPnR4Y2hhbisrOworCQkJaSsrOworCQkJaWYgKGNvc2EtPnR4Y2hhbiA+PSBjb3NhLT5uY2hhbm5lbHMpCisJCQkJY29zYS0+dHhjaGFuID0gMDsKKwkJCWlmICghKGNvc2EtPnR4Yml0bWFwICYgKDE8PGNvc2EtPnR4Y2hhbikpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKH5zdGF0dXMgJiAoMSA8PCAoY29zYS0+dHhjaGFuK0RSSVZFUl9UWE1BUF9TSElGVCkpKQorCQkJCWJyZWFrOworCQkJLyogaW4gc2Vjb25kIHBhc3MsIGFjY2VwdCBmaXJzdCByZWFkeS10by1UWCBjaGFubmVsICovCisJCQlpZiAoaSA+IGNvc2EtPm5jaGFubmVscykgeworCQkJCS8qIENhbiBiZSBzYWZlbHkgaWdub3JlZCAqLworI2lmZGVmIERFQlVHX0lSUVMKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEZvcmNpbmcgVFggIgorCQkJCQkidG8gbm90LXJlYWR5IGNoYW5uZWwgJWRcbiIsCisJCQkJCWNvc2EtPm5hbWUsIGNvc2EtPnR4Y2hhbik7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWNvc2EtPnR4c2l6ZSA9IGNvc2EtPmNoYW5bY29zYS0+dHhjaGFuXS50eHNpemU7CisJCWlmIChjb3NhX2RtYV9hYmxlKGNvc2EtPmNoYW4rY29zYS0+dHhjaGFuLAorCQkJY29zYS0+Y2hhbltjb3NhLT50eGNoYW5dLnR4YnVmLCBjb3NhLT50eHNpemUpKSB7CisJCQljb3NhLT50eGJ1ZiA9IGNvc2EtPmNoYW5bY29zYS0+dHhjaGFuXS50eGJ1ZjsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweShjb3NhLT5ib3VuY2VidWYsIGNvc2EtPmNoYW5bY29zYS0+dHhjaGFuXS50eGJ1ZiwKKwkJCQljb3NhLT50eHNpemUpOworCQkJY29zYS0+dHhidWYgPSBjb3NhLT5ib3VuY2VidWY7CisJCX0KKwl9CisKKwlpZiAoaXNfOGJpdChjb3NhKSkgeworCQlpZiAoIXRlc3RfYml0KElSUUJJVCwgJmNvc2EtPnJ4dHgpKSB7CisJCQljb3NhX3B1dHN0YXR1cyhjb3NhLCBTUl9UWF9JTlRfRU5BKTsKKwkJCWNvc2FfcHV0ZGF0YTgoY29zYSwgKChjb3NhLT50eGNoYW4gPDwgNSkgJiAweGUwKXwKKwkJCQkoKGNvc2EtPnR4c2l6ZSA+PiA4KSAmIDB4MWYpKTsKKyNpZmRlZiBERUJVR19JTworCQkJZGVidWdfc3RhdHVzX291dChjb3NhLCBTUl9UWF9JTlRfRU5BKTsKKwkJCWRlYnVnX2RhdGFfb3V0KGNvc2EsICgoY29zYS0+dHhjaGFuIDw8IDUpICYgMHhlMCl8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29zYS0+dHhzaXplID4+IDgpICYgMHgxZikpOworCQkJZGVidWdfZGF0YV9pbihjb3NhLCBjb3NhX2dldGRhdGE4KGNvc2EpKTsKKyNlbHNlCisJCQljb3NhX2dldGRhdGE4KGNvc2EpOworI2VuZGlmCisJCQlzZXRfYml0KElSUUJJVCwgJmNvc2EtPnJ4dHgpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJY2xlYXJfYml0KElSUUJJVCwgJmNvc2EtPnJ4dHgpOworCQkJY29zYV9wdXRzdGF0dXMoY29zYSwgMCk7CisJCQljb3NhX3B1dGRhdGE4KGNvc2EsIGNvc2EtPnR4c2l6ZSYweGZmKTsKKyNpZmRlZiBERUJVR19JTworCQkJZGVidWdfc3RhdHVzX291dChjb3NhLCAwKTsKKwkJCWRlYnVnX2RhdGFfb3V0KGNvc2EsIGNvc2EtPnR4c2l6ZSYweGZmKTsKKyNlbmRpZgorCQl9CisJfSBlbHNlIHsKKwkJY29zYV9wdXRzdGF0dXMoY29zYSwgU1JfVFhfSU5UX0VOQSk7CisJCWNvc2FfcHV0ZGF0YTE2KGNvc2EsICgoY29zYS0+dHhjaGFuPDwxMykgJiAweGUwMDApCisJCQl8IChjb3NhLT50eHNpemUgJiAweDFmZmYpKTsKKyNpZmRlZiBERUJVR19JTworCQlkZWJ1Z19zdGF0dXNfb3V0KGNvc2EsIFNSX1RYX0lOVF9FTkEpOworCQlkZWJ1Z19kYXRhX291dChjb3NhLCAoKGNvc2EtPnR4Y2hhbjw8MTMpICYgMHhlMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoY29zYS0+dHhzaXplICYgMHgxZmZmKSk7CisJCWRlYnVnX2RhdGFfaW4oY29zYSwgY29zYV9nZXRkYXRhOChjb3NhKSk7CisJCWRlYnVnX3N0YXR1c19vdXQoY29zYSwgMCk7CisjZWxzZQorCQljb3NhX2dldGRhdGE4KGNvc2EpOworI2VuZGlmCisJCWNvc2FfcHV0c3RhdHVzKGNvc2EsIDApOworCX0KKworCWlmIChjb3NhLT5idXNtYXN0ZXIpIHsKKwkJdW5zaWduZWQgbG9uZyBhZGRyID0gdmlydF90b19idXMoY29zYS0+dHhidWYpOworCQlpbnQgY291bnQ9MDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnVzbWFzdGVyIElSUVxuIik7CisJCXdoaWxlICghKGNvc2FfZ2V0c3RhdHVzKGNvc2EpJlNSX1RYX1JEWSkpIHsKKwkJCWNvdW50Kys7CisJCQl1ZGVsYXkoMTApOworCQkJaWYgKGNvdW50ID4gMTAwMCkgYnJlYWs7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAic3RhdHVzICV4XG4iLCBjb3NhX2dldHN0YXR1cyhjb3NhKSk7CisJCXByaW50ayhLRVJOX0lORk8gInJlYWR5IGFmdGVyICVkIGxvb3BzXG4iLCBjb3VudCk7CisJCWNvc2FfcHV0ZGF0YTE2KGNvc2EsIChhZGRyID4+IDE2KSYweGZmZmYpOworCisJCWNvdW50ID0gMDsKKwkJd2hpbGUgKCEoY29zYV9nZXRzdGF0dXMoY29zYSkmU1JfVFhfUkRZKSkgeworCQkJY291bnQrKzsKKwkJCWlmIChjb3VudCA+IDEwMDApIGJyZWFrOworCQkJdWRlbGF5KDEwKTsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJyZWFkeSBhZnRlciAlZCBsb29wc1xuIiwgY291bnQpOworCQljb3NhX3B1dGRhdGExNihjb3NhLCBhZGRyICYweGZmZmYpOworCQlmbGFnczEgPSBjbGFpbV9kbWFfbG9jaygpOworCQlzZXRfZG1hX21vZGUoY29zYS0+ZG1hLCBETUFfTU9ERV9DQVNDQURFKTsKKwkJZW5hYmxlX2RtYShjb3NhLT5kbWEpOworCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzMSk7CisJfSBlbHNlIHsKKwkJLyogc3RhcnQgdGhlIERNQSAqLworCQlmbGFnczEgPSBjbGFpbV9kbWFfbG9jaygpOworCQlkaXNhYmxlX2RtYShjb3NhLT5kbWEpOworCQljbGVhcl9kbWFfZmYoY29zYS0+ZG1hKTsKKwkJc2V0X2RtYV9tb2RlKGNvc2EtPmRtYSwgRE1BX01PREVfV1JJVEUpOworCQlzZXRfZG1hX2FkZHIoY29zYS0+ZG1hLCB2aXJ0X3RvX2J1cyhjb3NhLT50eGJ1ZikpOworCQlzZXRfZG1hX2NvdW50KGNvc2EtPmRtYSwgY29zYS0+dHhzaXplKTsKKwkJZW5hYmxlX2RtYShjb3NhLT5kbWEpOworCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzMSk7CisJfQorCWNvc2FfcHV0c3RhdHVzKGNvc2EsIFNSX1RYX0RNQV9FTkF8U1JfVVNSX0lOVF9FTkEpOworI2lmZGVmIERFQlVHX0lPCisJZGVidWdfc3RhdHVzX291dChjb3NhLCBTUl9UWF9ETUFfRU5BfFNSX1VTUl9JTlRfRU5BKTsKKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ4X2ludGVycnVwdChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgc3RhdHVzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWZkZWYgREVCVUdfSVJRUworCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogU1JfVVBfUkVRVUVTVFxuIiwgY29zYS0+bnVtKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwlzZXRfYml0KFJYQklULCAmY29zYS0+cnh0eCk7CisKKwlpZiAoaXNfOGJpdChjb3NhKSkgeworCQlpZiAoIXRlc3RfYml0KElSUUJJVCwgJmNvc2EtPnJ4dHgpKSB7CisJCQlzZXRfYml0KElSUUJJVCwgJmNvc2EtPnJ4dHgpOworCQkJcHV0X2RyaXZlcl9zdGF0dXNfbm9sb2NrKGNvc2EpOworCQkJY29zYS0+cnhzaXplID0gY29zYV9nZXRkYXRhOChjb3NhKSA8PDg7CisjaWZkZWYgREVCVUdfSU8KKwkJCWRlYnVnX2RhdGFfaW4oY29zYSwgY29zYS0+cnhzaXplID4+IDgpOworI2VuZGlmCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQljbGVhcl9iaXQoSVJRQklULCAmY29zYS0+cnh0eCk7CisJCQljb3NhLT5yeHNpemUgfD0gY29zYV9nZXRkYXRhOChjb3NhKSAmIDB4ZmY7CisjaWZkZWYgREVCVUdfSU8KKwkJCWRlYnVnX2RhdGFfaW4oY29zYSwgY29zYS0+cnhzaXplICYgMHhmZik7CisjZW5kaWYKKyNpZiAwCisJCQlwcmludGsoS0VSTl9JTkZPICJjb3NhJWQ6IHJlY2VpdmUgcnhzaXplID0gKDB4JTA0eCkuXG4iLAorCQkJCWNvc2EtPm51bSwgY29zYS0+cnhzaXplKTsKKyNlbmRpZgorCQl9CisJfSBlbHNlIHsKKwkJY29zYS0+cnhzaXplID0gY29zYV9nZXRkYXRhMTYoY29zYSk7CisjaWZkZWYgREVCVUdfSU8KKwkJZGVidWdfZGF0YV9pbihjb3NhLCBjb3NhLT5yeHNpemUpOworI2VuZGlmCisjaWYgMAorCQlwcmludGsoS0VSTl9JTkZPICJjb3NhJWQ6IHJlY2VpdmUgcnhzaXplID0gKDB4JTA0eCkuXG4iLAorCQkJY29zYS0+bnVtLCBjb3NhLT5yeHNpemUpOworI2VuZGlmCisJfQorCWlmICgoKGNvc2EtPnJ4c2l6ZSAmIDB4ZTAwMCkgPj4gMTMpID49IGNvc2EtPm5jaGFubmVscykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcnggZm9yIHVua25vd24gY2hhbm5lbCAoMHglMDR4KVxuIiwKKwkJCWNvc2EtPm5hbWUsIGNvc2EtPnJ4c2l6ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwkJZ290byByZWplY3Q7CisJfQorCWNvc2EtPnJ4Y2hhbiA9IGNvc2EtPmNoYW4gKyAoKGNvc2EtPnJ4c2l6ZSAmIDB4ZTAwMCkgPj4gMTMpOworCWNvc2EtPnJ4c2l6ZSAmPSAweDFmZmY7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCisJY29zYS0+cnhidWYgPSBOVUxMOworCWlmIChjb3NhLT5yeGNoYW4tPnNldHVwX3J4KQorCQljb3NhLT5yeGJ1ZiA9IGNvc2EtPnJ4Y2hhbi0+c2V0dXBfcngoY29zYS0+cnhjaGFuLCBjb3NhLT5yeHNpemUpOworCisJaWYgKCFjb3NhLT5yeGJ1ZikgeworcmVqZWN0OgkJLyogUmVqZWN0IHRoZSBwYWNrZXQgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiByZWplY3RpbmcgcGFja2V0IG9uIGNoYW5uZWwgJWRcbiIsCisJCQljb3NhLT5udW0sIGNvc2EtPnJ4Y2hhbi0+bnVtKTsKKwkJY29zYS0+cnhidWYgPSBjb3NhLT5ib3VuY2VidWY7CisJfQorCisJLyogc3RhcnQgdGhlIERNQSAqLworCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYShjb3NhLT5kbWEpOworCWNsZWFyX2RtYV9mZihjb3NhLT5kbWEpOworCXNldF9kbWFfbW9kZShjb3NhLT5kbWEsIERNQV9NT0RFX1JFQUQpOworCWlmIChjb3NhX2RtYV9hYmxlKGNvc2EtPnJ4Y2hhbiwgY29zYS0+cnhidWYsIGNvc2EtPnJ4c2l6ZSAmIDB4MWZmZikpIHsKKwkJc2V0X2RtYV9hZGRyKGNvc2EtPmRtYSwgdmlydF90b19idXMoY29zYS0+cnhidWYpKTsKKwl9IGVsc2UgeworCQlzZXRfZG1hX2FkZHIoY29zYS0+ZG1hLCB2aXJ0X3RvX2J1cyhjb3NhLT5ib3VuY2VidWYpKTsKKwl9CisJc2V0X2RtYV9jb3VudChjb3NhLT5kbWEsIChjb3NhLT5yeHNpemUmMHgxZmZmKSk7CisJZW5hYmxlX2RtYShjb3NhLT5kbWEpOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJY29zYV9wdXRzdGF0dXMoY29zYSwgU1JfUlhfRE1BX0VOQXxTUl9VU1JfSU5UX0VOQSk7CisJaWYgKCFpc184Yml0KGNvc2EpICYmIChzdGF0dXMgJiBTUl9UWF9SRFkpKQorCQljb3NhX3B1dGRhdGE4KGNvc2EsIERSSVZFUl9SWF9SRUFEWSk7CisjaWZkZWYgREVCVUdfSU8KKwlkZWJ1Z19zdGF0dXNfb3V0KGNvc2EsIFNSX1JYX0RNQV9FTkF8U1JfVVNSX0lOVF9FTkEpOworCWlmICghaXNfOGJpdChjb3NhKSAmJiAoc3RhdHVzICYgU1JfVFhfUkRZKSkKKwkJZGVidWdfZGF0YV9jbWQoY29zYSwgRFJJVkVSX1JYX1JFQURZKTsKKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVvdF9pbnRlcnJ1cHQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IHN0YXR1cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBmbGFnczE7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwlmbGFnczEgPSBjbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGNvc2EtPmRtYSk7CisJY2xlYXJfZG1hX2ZmKGNvc2EtPmRtYSk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFnczEpOworCWlmICh0ZXN0X2JpdChUWEJJVCwgJmNvc2EtPnJ4dHgpKSB7CisJCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4gPSBjb3NhLT5jaGFuK2Nvc2EtPnR4Y2hhbjsKKwkJaWYgKGNoYW4tPnR4X2RvbmUpCisJCQlpZiAoY2hhbi0+dHhfZG9uZShjaGFuLCBjb3NhLT50eHNpemUpKQorCQkJCWNsZWFyX2JpdChjaGFuLT5udW0sICZjb3NhLT50eGJpdG1hcCk7CisJfSBlbHNlIGlmICh0ZXN0X2JpdChSWEJJVCwgJmNvc2EtPnJ4dHgpKSB7CisjaWZkZWYgREVCVUdfREFUQQorCXsKKwkJaW50IGk7CisJCXByaW50ayhLRVJOX0lORk8gImNvc2ElZGMlZDogZG9uZSByeCgweCV4KSIsIGNvc2EtPm51bSwgCisJCQljb3NhLT5yeGNoYW4tPm51bSwgY29zYS0+cnhzaXplKTsKKwkJZm9yIChpPTA7IGk8Y29zYS0+cnhzaXplOyBpKyspCisJCQlwcmludGsgKCIgJTAyeCIsIGNvc2EtPnJ4YnVmW2ldJjB4ZmYpOworCQlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisJCS8qIFBhY2tldCBmb3IgdW5rbm93biBjaGFubmVsPyAqLworCQlpZiAoY29zYS0+cnhidWYgPT0gY29zYS0+Ym91bmNlYnVmKQorCQkJZ290byBvdXQ7CisJCWlmICghY29zYV9kbWFfYWJsZShjb3NhLT5yeGNoYW4sIGNvc2EtPnJ4YnVmLCBjb3NhLT5yeHNpemUpKQorCQkJbWVtY3B5KGNvc2EtPnJ4YnVmLCBjb3NhLT5ib3VuY2VidWYsIGNvc2EtPnJ4c2l6ZSk7CisJCWlmIChjb3NhLT5yeGNoYW4tPnJ4X2RvbmUpCisJCQlpZiAoY29zYS0+cnhjaGFuLT5yeF9kb25lKGNvc2EtPnJ4Y2hhbikpCisJCQkJY2xlYXJfYml0KGNvc2EtPnJ4Y2hhbi0+bnVtLCAmY29zYS0+cnhiaXRtYXApOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiY29zYSVkOiB1bmV4cGVjdGVkIEVPVCBpbnRlcnJ1cHRcbiIsCisJCQljb3NhLT5udW0pOworCX0KKwkvKgorCSAqIENsZWFyIHRoZSBSWEJJVCwgVFhCSVQgYW5kIElSUUJJVCAodGhlIGxhdGVzdCBzaG91bGQgYmUKKwkgKiBjbGVhcmVkIGFueXdheSkuIFdlIHNob3VsZCBkbyBpdCBhcyBzb29uIGFzIHBvc3NpYmxlCisJICogc28gdGhhdCB3ZSBjYW4gdGVsbCB0aGUgQ09TQSB3ZSBhcmUgZG9uZSBhbmQgdG8gZ2l2ZSBpdCBhIHRpbWUKKwkgKiBmb3IgcmVjb3ZlcnkuCisJICovCitvdXQ6CisJY29zYS0+cnh0eCA9IDA7CisJcHV0X2RyaXZlcl9zdGF0dXNfbm9sb2NrKGNvc2EpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGNvc2FfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmNvc2FfLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBzdGF0dXM7CisJaW50IGNvdW50ID0gMDsKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhID0gY29zYV87CithZ2FpbjoKKwlzdGF0dXMgPSBjb3NhX2dldHN0YXR1cyhjb3NhKTsKKyNpZmRlZiBERUJVR19JUlFTCisJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBnb3QgSVJRLCBzdGF0dXMgMHglMDJ4XG4iLCBjb3NhLT5udW0sCisJCXN0YXR1cyAmIDB4ZmYpOworI2VuZGlmCisjaWZkZWYgREVCVUdfSU8KKwlkZWJ1Z19zdGF0dXNfaW4oY29zYSwgc3RhdHVzKTsKKyNlbmRpZgorCXN3aXRjaCAoc3RhdHVzICYgU1JfQ01EX0ZST01fU1JQX01BU0spIHsKKwljYXNlIFNSX0RPV05fUkVRVUVTVDoKKwkJdHhfaW50ZXJydXB0KGNvc2EsIHN0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgU1JfVVBfUkVRVUVTVDoKKwkJcnhfaW50ZXJydXB0KGNvc2EsIHN0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgU1JfRU5EX09GX1RSQU5TRkVSOgorCQllb3RfaW50ZXJydXB0KGNvc2EsIHN0YXR1cyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFdlIG1heSBiZSB0b28gZmFzdCBmb3IgU1JQLiBUcnkgdG8gd2FpdCBhIGJpdCBtb3JlLiAqLworCQlpZiAoY291bnQrKyA8IDEwMCkgeworCQkJdWRlbGF5KDEwMCk7CisJCQlnb3RvIGFnYWluOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogdW5rbm93biBzdGF0dXMgMHglMDJ4IGluIElSUSBhZnRlciAlZCByZXRyaWVzXG4iLAorCQkJY29zYS0+bnVtLCBzdGF0dXMgJiAweGZmLCBjb3VudCk7CisJfQorI2lmZGVmIERFQlVHX0lSUVMKKwlpZiAoY291bnQpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlZC10aW1lcyBnb3QgdW5rbm93biBzdGF0dXMgaW4gSVJRXG4iLAorCQkJY29zYS0+bmFtZSwgY291bnQpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJldHVybmluZyBmcm9tIElSUVxuIiwgY29zYS0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKwwKKy8qIC0tLS0tLS0tLS0gSS9PIGRlYnVnZ2luZyByb3V0aW5lcyAtLS0tLS0tLS0tICovCisvKgorICogVGhlc2Ugcm91dGluZXMgY2FuIGJlIHVzZWQgdG8gbW9uaXRvciBDT1NBL1NSUCBJL08gYW5kIHRvIHByaW50aygpCisgKiB0aGUgZGF0YSBiZWluZyB0cmFuc2ZlcnJlZCBvbiB0aGUgZGF0YSBhbmQgc3RhdHVzIEkvTyBwb3J0IGluIGEKKyAqIHJlYWRhYmxlIHdheS4KKyAqLworCisjaWZkZWYgREVCVUdfSU8KK3N0YXRpYyB2b2lkIGRlYnVnX3N0YXR1c19pbihzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgc3RhdHVzKQoreworCWNoYXIgKnM7CisJc3dpdGNoKHN0YXR1cyAmIFNSX0NNRF9GUk9NX1NSUF9NQVNLKSB7CisJY2FzZSBTUl9VUF9SRVFVRVNUOgorCQlzID0gIlJYX1JFUSI7CisJCWJyZWFrOworCWNhc2UgU1JfRE9XTl9SRVFVRVNUOgorCQlzID0gIlRYX1JFUSI7CisJCWJyZWFrOworCWNhc2UgU1JfRU5EX09GX1RSQU5TRkVSOgorCQlzID0gIkVUX1JFUSI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXMgPSAiTk9fUkVRIjsKKwkJYnJlYWs7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBJTzogc3RhdHVzIC0+IDB4JTAyeCAoJXMlcyVzJXMpXG4iLAorCQljb3NhLT5uYW1lLAorCQlzdGF0dXMsCisJCXN0YXR1cyAmIFNSX1VTUl9SUSA/ICJVU1JfUlF8IjoiIiwKKwkJc3RhdHVzICYgU1JfVFhfUkRZID8gIlRYX1JEWXwiOiIiLAorCQlzdGF0dXMgJiBTUl9SWF9SRFkgPyAiUlhfUkRZfCI6IiIsCisJCXMpOworfQorCitzdGF0aWMgdm9pZCBkZWJ1Z19zdGF0dXNfb3V0KHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBzdGF0dXMpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElPOiBzdGF0dXMgPC0gMHglMDJ4ICglcyVzJXMlcyVzJXMpXG4iLAorCQljb3NhLT5uYW1lLAorCQlzdGF0dXMsCisJCXN0YXR1cyAmIFNSX1JYX0RNQV9FTkEgID8gIlJYRE1BfCI6IiFyeGRtYXwiLAorCQlzdGF0dXMgJiBTUl9UWF9ETUFfRU5BICA/ICJUWERNQXwiOiIhdHhkbWF8IiwKKwkJc3RhdHVzICYgU1JfUlNUICAgICAgICAgPyAiUkVTRVR8IjoiIiwKKwkJc3RhdHVzICYgU1JfVVNSX0lOVF9FTkEgPyAiVVNSSU5UfCI6IiF1c3JpbnR8IiwKKwkJc3RhdHVzICYgU1JfVFhfSU5UX0VOQSAgPyAiVFhJTlR8IjoiIXR4aW50fCIsCisJCXN0YXR1cyAmIFNSX1JYX0lOVF9FTkEgID8gIlJYSU5UIjoiIXJ4aW50Iik7Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVnX2RhdGFfaW4oc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IGRhdGEpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElPOiBkYXRhIC0+IDB4JTA0eFxuIiwgY29zYS0+bmFtZSwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVnX2RhdGFfb3V0KHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBkYXRhKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiBJTzogZGF0YSA8LSAweCUwNHhcbiIsIGNvc2EtPm5hbWUsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBkZWJ1Z19kYXRhX2NtZChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgZGF0YSkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogSU86IGRhdGEgPC0gMHglMDR4ICglc3wlcylcbiIsCisJCWNvc2EtPm5hbWUsIGRhdGEsCisJCWRhdGEgJiBTUl9SRFlfUkNWID8gIlJYX1JEWSIgOiAiIXJ4X3JkeSIsCisJCWRhdGEgJiBTUl9SRFlfU05EID8gIlRYX1JEWSIgOiAiIXR4X3JkeSIpOworfQorI2VuZGlmCisKKy8qIEVPRiAtLSB0aGlzIGZpbGUgaGFzIG5vdCBiZWVuIHRydW5jYXRlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2Nvc2EuaCBiL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4ZjNkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qICRJZDogY29zYS5oLHYgMS42IDE5OTkvMDEvMDYgMTQ6MDI6NDQga2FzIEV4cCAkICovCisKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgIEphbiAiWWVueWEiIEthc3ByemFrIDxrYXNAZmkubXVuaS5jej4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgQ09TQV9IX18KKyNkZWZpbmUgQ09TQV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKiBzdGF0dXMgcmVnaXN0ZXIgLSBvdXRwdXQgYml0cyAqLworI2RlZmluZSBTUl9SWF9ETUFfRU5BICAgMHgwNCAgICAvKiByZWNlaXZlciBETUEgZW5hYmxlIGJpdCAqLworI2RlZmluZSBTUl9UWF9ETUFfRU5BICAgMHgwOCAgICAvKiB0cmFuc21pdHRlciBETUEgZW5hYmxlIGJpdCAqLworI2RlZmluZSBTUl9SU1QgICAgICAgICAgMHgxMCAgICAvKiBTUlAgcmVzZXQgKi8KKyNkZWZpbmUgU1JfVVNSX0lOVF9FTkEgIDB4MjAgICAgLyogdXNlciBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLworI2RlZmluZSBTUl9UWF9JTlRfRU5BICAgMHg0MCAgICAvKiB0cmFuc21pdHRlciBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLworI2RlZmluZSBTUl9SWF9JTlRfRU5BICAgMHg4MCAgICAvKiByZWNlaXZlciBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLworCisvKiBzdGF0dXMgcmVnaXN0ZXIgLSBpbnB1dCBiaXRzICovCisjZGVmaW5lIFNSX1VTUl9SUSAgICAgICAweDIwICAgIC8qIHVzZXIgaW50ZXJydXB0IHJlcXVlc3QgcGVuZGluZyAqLworI2RlZmluZSBTUl9UWF9SRFkgICAgICAgMHg0MCAgICAvKiB0cmFuc21pdHRlciBlbXB0eSAocmVhZHkpICovCisjZGVmaW5lIFNSX1JYX1JEWSAgICAgICAweDgwICAgIC8qIHJlY2VpdmVyIGRhdGEgcmVhZHkgKi8KKworI2RlZmluZSBTUl9VUF9SRVFVRVNUICAgMHgwMiAgICAvKiByZXF1ZXN0IGZyb20gU1JQIHRvIHRyYW5zZmVyIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAgdG8gUEMgKi8KKyNkZWZpbmUgU1JfRE9XTl9SRVFVRVNUIDB4MDEgICAgLyogU1JQIGlzIGFibGUgdG8gdHJhbnNmZXIgZGF0YSBkb3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gUEMgdG8gU1JQICovCisjZGVmaW5lIFNSX0VORF9PRl9UUkFOU0ZFUiAgICAgIDB4MDMgICAgLyogU1JQIHNpZ25hbGl6ZSBlbmQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciAodXAgb3IgZG93bikgKi8KKworI2RlZmluZSBTUl9DTURfRlJPTV9TUlBfTUFTSyAgICAweDAzICAgIC8qIG1hc2sgdG8gZ2V0IFNSUCBjb21tYW5kICovCisKKy8qIGJpdHMgaW4gZHJpdmVyIHN0YXR1cyBieXRlIGRlZmluaXRpb25zIDogKi8KKyNkZWZpbmUgU1JfUkRZX1JDViAgICAgIDB4MDEgICAgLyogcmVhZHkgdG8gcmVjZWl2ZSBwYWNrZXQgKi8KKyNkZWZpbmUgU1JfUkRZX1NORCAgICAgIDB4MDIgICAgLyogcmVhZHkgdG8gc2VuZCBwYWNrZXQgKi8KKyNkZWZpbmUgU1JfQ01EX1BORCAgICAgIDB4MDQgICAgLyogY29tbWFuZCBwZW5kaW5nICovIC8qIG5vdCBjdXJyZW50bHkgdXNlZCAqLworCisvKiA/Pz8/ICovCisjZGVmaW5lIFNSX1BLVF9VUCAgICAgICAweDAxICAgIC8qIHRyYW5zZmVyIG9mIHBhY2tldCB1cCBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBTUl9QS1RfRE9XTiAgICAgMHgwMiAgICAvKiB0cmFuc2ZlciBvZiBwYWNrZXQgZG93biBpbiBwcm9ncmVzcyAqLworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZGVmaW5lIFNSX0xPQURfQUREUiAgICAweDQ0MDAgIC8qIFNSUCBtaWNyb2NvZGUgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIFNSX1NUQVJUX0FERFIgICAweDQ0MDAgIC8qIFNSUCBtaWNyb2NvZGUgc3RhcnQgYWRkcmVzcyAqLworCisjZGVmaW5lIENPU0FfTE9BRF9BRERSICAgIDB4NDAwICAvKiBTUlAgbWljcm9jb2RlIGxvYWQgYWRkcmVzcyAqLworI2RlZmluZSBDT1NBX01BWF9GSVJNV0FSRV9TSVpFCTB4MTAwMDAKKworLyogaW9jdGxzICovCitzdHJ1Y3QgY29zYV9kb3dubG9hZCB7CisJaW50IGFkZHIsIGxlbjsKKwljaGFyIF9fdXNlciAqY29kZTsKK307CisKKy8qIFJlc2V0IHRoZSBkZXZpY2UgKi8KKyNkZWZpbmUgQ09TQUlPUlNFVAlfSU8oJ0MnLDB4ZjApCisKKy8qIFN0YXJ0IG1pY3JvY29kZSBhdCBnaXZlbiBhZGRyZXNzICovCisjZGVmaW5lIENPU0FJT1NUUlQJX0lPVygnQycsMHhmMSwgaW50KQorCisvKiBSZWFkIHRoZSBibG9jayBmcm9tIHRoZSBkZXZpY2UgbWVtb3J5ICovCisjZGVmaW5lIENPU0FJT1JNRU0JX0lPV1IoJ0MnLDB4ZjIsIHN0cnVjdCBjb3NhX2Rvd25sb2FkICopCisJLyogYWN0dWFsbHkgdGhlIHN0cnVjdCBjb3NhX2Rvd25sb2FkIGl0c2VsZjsgdGhpcyBpcyB0byBrZWVwCisJICogdGhlIGlvY3RsIG51bWJlciBzYW1lIGFzIGluIDIuNCBpbiBvcmRlciB0byBrZWVwIHRoZSB1c2VyLXNwYWNlCisJICogdXRpbHMgY29tcGF0aWJsZS4gKi8KKworLyogV3JpdGUgdGhlIGJsb2NrIHRvIHRoZSBkZXZpY2UgbWVtb3J5IChpLmUuIGRvd25sb2FkIHRoZSBtaWNyb2NvZGUpICovCisjZGVmaW5lIENPU0FJT0RPV05MRAlfSU9XKCdDJywweGYyLCBzdHJ1Y3QgY29zYV9kb3dubG9hZCAqKQorCS8qIGFjdHVhbGx5IHRoZSBzdHJ1Y3QgY29zYV9kb3dubG9hZCBpdHNlbGY7IHRoaXMgaXMgdG8ga2VlcAorCSAqIHRoZSBpb2N0bCBudW1iZXIgc2FtZSBhcyBpbiAyLjQgaW4gb3JkZXIgdG8ga2VlcCB0aGUgdXNlci1zcGFjZQorCSAqIHV0aWxzIGNvbXBhdGlibGUuICovCisKKy8qIFJlYWQgdGhlIGRldmljZSB0eXBlIChvbmUgb2YgInNycCIsICJjb3NhIiwgYW5kICJjb3NhOCIgZm9yIG5vdykgKi8KKyNkZWZpbmUgQ09TQUlPUlRZUEUJX0lPUignQycsMHhmMywgY2hhciAqKQorCisvKiBSZWFkIHRoZSBkZXZpY2UgaWRlbnRpZmljYXRpb24gc3RyaW5nICovCisjZGVmaW5lIENPU0FJT1JJRFNUUglfSU9SKCdDJywweGY0LCBjaGFyICopCisvKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgaWRlbnRpZmljYXRpb24gc3RyaW5nLiAqLworI2RlZmluZSBDT1NBX01BWF9JRF9TVFJJTkcgMTI4CisKKy8qIEluY3JlbWVudC9kZWNyZW1lbnQgdGhlIG1vZHVsZSB1c2FnZSBjb3VudCA6LSkgKi8KKy8qICNkZWZpbmUgQ09TQUlPTUlOQwlfSU8oJ0MnLDB4ZjUpICovCisvKiAjZGVmaW5lIENPU0FJT01ERUMJX0lPKCdDJywweGY2KSAqLworCisvKiBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBjYXJkcyBpbnN0YWxsZWQgKi8KKyNkZWZpbmUgQ09TQUlPTlJDQVJEUwlfSU8oJ0MnLDB4ZjcpCisKKy8qIEdldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9uIHRoaXMgY2FyZCAqLworI2RlZmluZSBDT1NBSU9OUkNIQU5TCV9JTygnQycsMHhmOCkKKworLyogU2V0IHRoZSBkcml2ZXIgZm9yIHRoZSBidXMtbWFzdGVyIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgQ09TQUlPQk1TRVQJX0lPVygnQycsIDB4ZjksIHVuc2lnbmVkIHNob3J0KQorCisjZGVmaW5lIENPU0FfQk1fT0ZGCTAJLyogQnVzLW1hc3RlcmluZyBvZmYgLSB1c2UgSVNBIERNQSAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgQ09TQV9CTV9PTgkxCS8qIEJ1cy1tYXN0ZXJpbmcgb24gLSBmYXN0ZXIgYnV0IHVudGVzdGVkICovCisKKy8qIEdldHMgdGhlIGJ1c21hc3RlciBzdGF0dXMgKi8KKyNkZWZpbmUgQ09TQUlPQk1HRVQJX0lPKCdDJywgMHhmYSkKKworI2VuZGlmIC8qICFDT1NBX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2N5Y3hfZHJ2LmMgYi9kcml2ZXJzL25ldC93YW4vY3ljeF9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTc0YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2N5Y3hfZHJ2LmMKQEAgLTAsMCArMSw1ODYgQEAKKy8qCisqIGN5Y3hfZHJ2LmMJQ3ljbG9tIDJYIFN1cHBvcnQgTW9kdWxlLgorKgorKgkJVGhpcyBtb2R1bGUgaXMgYSBsaWJyYXJ5IG9mIGNvbW1vbiBoYXJkd2FyZSBzcGVjaWZpYworKgkJZnVuY3Rpb25zIHVzZWQgYnkgdGhlIEN5Y2xhZGVzIEN5Y2xvbSAyWCBzeW5jIGNhcmQuCisqCisqIEF1dGhvcjoJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisqCisqIENvcHlyaWdodDoJKGMpIDE5OTgtMjAwMyBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8KKyoKKyogQmFzZWQgb24gc2RsYWRydi5jIGJ5IEdlbmUgS296aW4gPGdlbmVrQGNvbXB1c2VydmUuY29tPgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiAxOTk5LzExLzExCWFjbWUJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSksIGNvZGUKKyoJCQkJY2xlYW51cAorKiAxOTk5LzExLzA4CWFjbWUJCWluaXRfY3ljMnggZGVsZXRlZCwgZG9pbmcgbm90aGluZworKiAxOTk5LzExLzA2CWFjbWUJCWJhY2sgdG8gcmVhZFtid10sIHdyaXRlW2J3XSBhbmQgbWVtY3B5X3RvIGFuZAorKgkJCQlmcm9taW8gdG8gdXNlIGRwbWJhc2UgaW9yZW1hcGVkCisqIDE5OTkvMTAvMjYJYWNtZQkJdXNlIGlzYV9yZWFkW2J3XSwgaXNhX3dyaXRlW2J3XSAmIGlzYV9tZW1jcHlfdG8KKyoJCQkJJiBmcm9taW8KKyogMTk5OS8xMC8yMwlhY21lCQljbGVhbnVwIHRvIG9ubHkgc3VwcG9ydHMgY3ljbG9tMng6IGFsbCB0aGUgb3RoZXIKKyoJCQkJYm9hcmRzIGFyZSBubyBsb25nZXIgbWFudWZhY3R1cmVkIGJ5IGN5Y2xhZGVzLAorKgkJCQlpZiBzb21lb25lIHdhbnRzIHRvIHN1cHBvcnQgdGhlbS4uLiBiZSBteSBndWVzdCEKKyogMTk5OS8wNS8yOCAgICBhY21lCQljeWN4X2ludGFjayAmIGN5Y3hfaW50ZGUgZ29uZSBmb3IgZ29vZAorKiAxOTk5LzA1LzE4CWFjbWUJCWxvdHMgb2YgdW5sb2dnZWQgd29yaywgc3VibWl0dGluZyB0byBMaW51cy4uLgorKiAxOTk5LzAxLzAzCWFjbWUJCW1vcmUganVkaWNpb3VzIHVzZSBvZiBkYXRhIHR5cGVzCisqIDE5OTkvMDEvMDMJYWNtZQkJanVkaWNpb3VzIHVzZSBvZiBkYXRhIHR5cGVzIDo+CisqCQkJCWN5Y3hfaW50ZW4gdHJ5aW5nIHRvIHJlc2V0IHBlbmRpbmcgaW50ZXJydXB0cworKgkJCQlmcm9tIGN5Y2xvbSAyeCAtIEkgdGhpbmsgdGhpcyBpc24ndCB0aGUgd2F5IHRvCisqCQkJCWdvLCBidXQgZm9yIG5vdy4uLgorKiAxOTk5LzAxLzAyCWFjbWUJCWN5Y3hfaW50YWNrIG9rLCBJIHRoaW5rIHRoZXJlJ3Mgbm90aGluZyB0byBkbworKgkJCQl0byBhY2sgYW4gaW50IGluIGN5Y3hfZHJ2LmMsIG9ubHkgaGFuZGxlIGl0IGluCisqCQkJCWN5eF9pc3IgKG9yIGluIHRoZSBvdGhlciBwcm90b2NvbHM6IGN5cF9pc3IsCisqCQkJCWN5Zl9pc3IsIHdoZW4gdGhleSBnZXQgaW1wbGVtZW50ZWQuCisqIERlYyAzMSwgMTk5OAlhY21lCQljeWN4X2RhdGFfYm9vdCAmIGN5Y3hfY29kZV9ib290IGZpeGVkLCBjcm9zc2luZworKgkJCQlmaW5nZXJzIHRvIHNlZSB4MjVfY29uZmlndXJlIGluIGN5Y3hfeDI1LmMKKyoJCQkJd29yay4uLiA6KQorKiBEZWMgMjYsIDE5OTgJYWNtZQkJbG9hZCBpbXBsZW1lbnRhdGlvbiBmaXhlZCwgc2VlbXMgdG8gd29yayEgOikKKyoJCQkJY3ljeF8yeF9kcG1iYXNlX29wdGlvbnMgd2l0aCBhbGwgdGhlIHBvc3NpYmxlCisqCQkJCURQTSBhZGRyZXNzZXMgKDIwKS4KKyoJCQkJY3ljeF9pbnRyIGltcGxlbWVudGVkICh0ZXN0IHRoaXMhKQorKgkJCQlnZW5lcmFsIGNvZGUgY2xlYW51cAorKiBEZWMgIDgsIDE5OTgJSXZhbiBQYXNzb3MJQ3ljbG9tLTJYIGZpcm13YXJlIGxvYWQgaW1wbGVtZW50YXRpb24uCisqIEF1ZyAgOCwgMTk5OAlhY21lCQlJbml0aWFsIHZlcnNpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogX19pbml0ICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpLCBhbmQgb3RoZXIgdXNlZnVsIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIG9mZnNldG9mKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBmb3IgamlmZmllcywgSFosIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9jeWN4X2Rydi5oPgkvKiBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9jeWN4X2NmbS5oPgkvKiBDWUNYIGZpcm13YXJlIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIHVkZWxheSAqLworI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogcmVhZFt3bF0sIHdyaXRlW3dsXSwgaW9yZW1hcCwgaW91bm1hcCAqLworCisjZGVmaW5lCU1PRF9WRVJTSU9OCTAKKyNkZWZpbmUJTU9EX1JFTEVBU0UJNgorCitNT0RVTEVfQVVUSE9SKCJBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ3ljbG9tIDJ4IFN5bmMgQ2FyZCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogSGFyZHdhcmUtc3BlY2lmaWMgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGxvYWRfY3ljMngoc3RydWN0IGN5Y3hfaHcgKmh3LCBzdHJ1Y3QgY3ljeF9maXJtd2FyZSAqY2ZtLCB1MzIgbGVuKTsKK3N0YXRpYyB2b2lkIGN5Y3hfYm9vdGNmZyhzdHJ1Y3QgY3ljeF9odyAqaHcpOworCitzdGF0aWMgaW50IHJlc2V0X2N5YzJ4KHZvaWQgX19pb21lbSAqYWRkcik7CitzdGF0aWMgaW50IGRldGVjdF9jeWMyeCh2b2lkIF9faW9tZW0gKmFkZHIpOworCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgZGVsYXlfY3ljeChpbnQgc2VjKTsKK3N0YXRpYyBpbnQgZ2V0X29wdGlvbl9pbmRleChsb25nICpvcHRsaXN0LCBsb25nIG9wdHZhbCk7CitzdGF0aWMgdTE2IGNoZWNrc3VtKHU4ICpidWYsIHUzMiBsZW4pOworCisjZGVmaW5lIHdhaXRfY3ljKGFkZHIpIGN5Y3hfZXhlYyhhZGRyICsgQ01EX09GRlNFVCkKKworLyogR2xvYmFsIERhdGEgKi8KKworLyogcHJpdmF0ZSBkYXRhICovCitzdGF0aWMgY2hhciBtb2RuYW1lW10gPSAiY3ljeF9kcnYiOworc3RhdGljIGNoYXIgZnVsbG5hbWVbXSA9ICJDeWNsb20gMlggU3VwcG9ydCBNb2R1bGUiOworc3RhdGljIGNoYXIgY29weXJpZ2h0W10gPSAiKGMpIDE5OTgtMjAwMyBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gIgorCQkJICAiPGFjbWVAY29uZWN0aXZhLmNvbS5icj4iOworCisvKiBIYXJkd2FyZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCisgKiBUaGVzZSBhcmUgYXJyYXlzIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkIGJ5IHZlcmlmaWNhdGlvbiByb3V0aW5lcy4KKyAqIFRoZSBmaXJzdCBlbGVtZW50IG9mIGVhY2ggYXJyYXkgaXMgaXRzIHNpemUgKGkuZS4gbnVtYmVyIG9mIG9wdGlvbnMpLgorICovCitzdGF0aWMgbG9uZyBjeWMyeF9kcG1iYXNlX29wdGlvbnNbXSA9IHsKKwkyMCwKKwkweEEwMDAwLCAweEE0MDAwLCAweEE4MDAwLCAweEFDMDAwLCAweEIwMDAwLCAweEI0MDAwLCAweEI4MDAwLAorCTB4QkMwMDAsIDB4QzAwMDAsIDB4QzQwMDAsIDB4QzgwMDAsIDB4Q0MwMDAsIDB4RDAwMDAsIDB4RDQwMDAsCisJMHhEODAwMCwgMHhEQzAwMCwgMHhFMDAwMCwgMHhFNDAwMCwgMHhFODAwMCwgMHhFQzAwMAorfTsKKworc3RhdGljIGxvbmcgY3ljeF8yeF9pcnFfb3B0aW9uc1tdICA9IHsgNywgMywgNSwgOSwgMTAsIDExLCAxMiwgMTUgfTsKKworLyogS2VybmVsIExvYWRhYmxlIE1vZHVsZSBFbnRyeSBQb2ludHMgKi8KKy8qIE1vZHVsZSAnaW5zZXJ0JyBlbnRyeSBwb2ludC4KKyAqIG8gcHJpbnQgYW5ub3VuY2VtZW50CisgKiBvIGluaXRpYWxpemUgc3RhdGljIGRhdGEKKyAqCisgKiBSZXR1cm46CTAJT2sKKyAqCQk8IDAJZXJyb3IuCisgKiBDb250ZXh0Oglwcm9jZXNzICovCisKK2ludCBfX2luaXQgY3ljeF9kcnZfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzIHYldS4ldSAlc1xuIiwgZnVsbG5hbWUsIE1PRF9WRVJTSU9OLCBNT0RfUkVMRUFTRSwKKwkJCSBjb3B5cmlnaHQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE1vZHVsZSAncmVtb3ZlJyBlbnRyeSBwb2ludC4KKyAqIG8gcmVsZWFzZSBhbGwgcmVtYWluaW5nIHN5c3RlbSByZXNvdXJjZXMgKi8KK3ZvaWQgY3ljeF9kcnZfY2xlYW51cCh2b2lkKQoreworfQorCisvKiBLZXJuZWwgQVBJcyAqLworLyogU2V0IHVwIGFkYXB0ZXIuCisgKiBvIGRldGVjdCBhZGFwdGVyIHR5cGUKKyAqIG8gdmVyaWZ5IGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworICogbyBjaGVjayBmb3IgaGFyZHdhcmUgY29uZmxpY3RzCisgKiBvIHNldCB1cCBhZGFwdGVyIHNoYXJlZCBtZW1vcnkKKyAqIG8gdGVzdCBhZGFwdGVyIG1lbW9yeQorICogbyBsb2FkIGZpcm13YXJlCisgKiBSZXR1cm46CTAJb2suCisgKgkJPCAwCWVycm9yICovCitFWFBPUlRfU1lNQk9MKGN5Y3hfc2V0dXApOworaW50IGN5Y3hfc2V0dXAoc3RydWN0IGN5Y3hfaHcgKmh3LCB2b2lkICpjZm0sIHUzMiBsZW4sIHVuc2lnbmVkIGxvbmcgZHBtYmFzZSkKK3sKKwlpbnQgZXJyOworCisJLyogVmVyaWZ5IElSUSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKwlpZiAoIWdldF9vcHRpb25faW5kZXgoY3ljeF8yeF9pcnFfb3B0aW9ucywgaHctPmlycSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSVJRICVkIGlzIGludmFsaWQhXG4iLCBtb2RuYW1lLCBody0+aXJxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0dXAgYWRhcHRlciBkdWFsLXBvcnQgbWVtb3J5IHdpbmRvdyBhbmQgdGVzdCBtZW1vcnkgKi8KKwlpZiAoIWRwbWJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogeW91IG11c3Qgc3BlY2lmeSB0aGUgZHBtIGFkZHJlc3MhXG4iLAorCQkJCW1vZG5hbWUpOworIAkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmICghZ2V0X29wdGlvbl9pbmRleChjeWMyeF9kcG1iYXNlX29wdGlvbnMsIGRwbWJhc2UpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG1lbW9yeSBhZGRyZXNzIDB4JWxYIGlzIGludmFsaWQhXG4iLAorCQkJCW1vZG5hbWUsIGRwbWJhc2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlody0+ZHBtYmFzZSA9IGlvcmVtYXAoZHBtYmFzZSwgQ1lDWF9XSU5ET1dTSVpFKTsKKwlody0+ZHBtc2l6ZSA9IENZQ1hfV0lORE9XU0laRTsKKworCWlmICghZGV0ZWN0X2N5YzJ4KGh3LT5kcG1iYXNlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhZGFwdGVyIEN5Y2xvbSAyWCBub3QgZm91bmQgYXQgIgorCQkJCSJhZGRyZXNzIDB4JWxYIVxuIiwgbW9kbmFtZSwgZHBtYmFzZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBmb3VuZCBDeWNsb20gMlggY2FyZCBhdCBhZGRyZXNzIDB4JWxYLlxuIiwKKwkJCSBtb2RuYW1lLCBkcG1iYXNlKTsKKworCS8qIExvYWQgZmlybXdhcmUuIElmIGxvYWRlciBmYWlscyB0aGVuIHNodXQgZG93biBhZGFwdGVyICovCisJZXJyID0gbG9hZF9jeWMyeChodywgY2ZtLCBsZW4pOworCisJaWYgKGVycikKKwkJY3ljeF9kb3duKGh3KTsgICAgICAgICAvKiBzaHV0ZG93biBhZGFwdGVyICovCisKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKGN5Y3hfZG93bik7CitpbnQgY3ljeF9kb3duKHN0cnVjdCBjeWN4X2h3ICpodykKK3sKKwlpb3VubWFwKGh3LT5kcG1iYXNlKTsKKwlyZXR1cm4gMDsKK30KKworLyogRW5hYmxlIGludGVycnVwdCBnZW5lcmF0aW9uLiAgKi8KK0VYUE9SVF9TWU1CT0woY3ljeF9pbnRlbik7Cit2b2lkIGN5Y3hfaW50ZW4oc3RydWN0IGN5Y3hfaHcgKmh3KQoreworCXdyaXRlYigwLCBody0+ZHBtYmFzZSk7Cit9CisKKy8qIEdlbmVyYXRlIGFuIGludGVycnVwdCB0byBhZGFwdGVyJ3MgQ1BVLiAqLworRVhQT1JUX1NZTUJPTChjeWN4X2ludHIpOwordm9pZCBjeWN4X2ludHIoc3RydWN0IGN5Y3hfaHcgKmh3KQoreworCXdyaXRldygwLCBody0+ZHBtYmFzZSArIEdFTl9DWUNYX0lOVFIpOworfQorCisvKiBFeGVjdXRlIEFkYXB0ZXIgQ29tbWFuZC4KKyAqIG8gU2V0IGV4ZWMgZmxhZy4KKyAqIG8gQnVzeS13YWl0IHVudGlsIGZsYWcgaXMgcmVzZXQuICovCitFWFBPUlRfU1lNQk9MKGN5Y3hfZXhlYyk7CitpbnQgY3ljeF9leGVjKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1MTYgaSA9IDA7CisJLyogd2FpdCB0aWxsIGFkZHIgY29udGVudCBpcyB6ZXJvZWQgKi8KKworCXdoaWxlIChyZWFkdyhhZGRyKSkgeworCQl1ZGVsYXkoMTAwMCk7CisKKwkJaWYgKCsraSA+IDUwKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKiBSZWFkIGFic29sdXRlIGFkYXB0ZXIgbWVtb3J5LgorICogVHJhbnNmZXIgZGF0YSBmcm9tIGFkYXB0ZXIncyBtZW1vcnkgdG8gZGF0YSBidWZmZXIuICovCitFWFBPUlRfU1lNQk9MKGN5Y3hfcGVlayk7CitpbnQgY3ljeF9wZWVrKHN0cnVjdCBjeWN4X2h3ICpodywgdTMyIGFkZHIsIHZvaWQgKmJ1ZiwgdTMyIGxlbikKK3sKKwlpZiAobGVuID09IDEpCisJCSoodTgqKWJ1ZiA9IHJlYWRiKGh3LT5kcG1iYXNlICsgYWRkcik7CisJZWxzZQorCQltZW1jcHlfZnJvbWlvKGJ1ZiwgaHctPmRwbWJhc2UgKyBhZGRyLCBsZW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFdyaXRlIEFic29sdXRlIEFkYXB0ZXIgTWVtb3J5LgorICogVHJhbnNmZXIgZGF0YSBmcm9tIGRhdGEgYnVmZmVyIHRvIGFkYXB0ZXIncyBtZW1vcnkuICovCitFWFBPUlRfU1lNQk9MKGN5Y3hfcG9rZSk7CitpbnQgY3ljeF9wb2tlKHN0cnVjdCBjeWN4X2h3ICpodywgdTMyIGFkZHIsIHZvaWQgKmJ1ZiwgdTMyIGxlbikKK3sKKwlpZiAobGVuID09IDEpCisJCXdyaXRlYigqKHU4KilidWYsIGh3LT5kcG1iYXNlICsgYWRkcik7CisJZWxzZQorCQltZW1jcHlfdG9pbyhody0+ZHBtYmFzZSArIGFkZHIsIGJ1ZiwgbGVuKTsKKworCXJldHVybiAwOworfQorCisvKiBIYXJkd2FyZS1TcGVjaWZpYyBGdW5jdGlvbnMgKi8KKworLyogTG9hZCBBdXggUm91dGluZXMgKi8KKy8qIFJlc2V0IGJvYXJkIGhhcmR3YXJlLgorICAgcmV0dXJuIDEgaWYgbWVtb3J5IGV4aXN0cyBhdCBhZGRyIGFuZCAwIGlmIG5vdC4gKi8KK3N0YXRpYyBpbnQgbWVtb3J5X2V4aXN0cyh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaW50IHRyaWVzID0gMDsKKworCWZvciAoOyB0cmllcyA8IDMgOyB0cmllcysrKSB7CisJCXdyaXRldyhURVNUX1BBVFRFUk4sIGFkZHIgKyAweDEwKTsKKworCQlpZiAocmVhZHcoYWRkciArIDB4MTApID09IFRFU1RfUEFUVEVSTikKKwkJCWlmIChyZWFkdyhhZGRyICsgMHgxMCkgPT0gVEVTVF9QQVRURVJOKQorCQkJCXJldHVybiAxOworCisJCWRlbGF5X2N5Y3goMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIExvYWQgcmVzZXQgY29kZS4gKi8KK3N0YXRpYyB2b2lkIHJlc2V0X2xvYWQodm9pZCBfX2lvbWVtICphZGRyLCB1OCAqYnVmZmVyLCB1MzIgY250KQoreworCXZvaWQgX19pb21lbSAqcHRfY29kZSA9IGFkZHIgKyBSRVNFVF9PRkZTRVQ7CisJdTE2IGk7IC8qLCBqOyAqLworCisJZm9yIChpID0gMCA7IGkgPCBjbnQgOyBpKyspIHsKKy8qCQlmb3IgKGogPSAwIDsgaiA8IDUwIDsgaisrKTsgRGVsYXkgLSBGSVhNRSBidXN5IHdhaXRpbmcuLi4gKi8KKwkJd3JpdGViKCpidWZmZXIrKywgcHRfY29kZSsrKTsKKwl9Cit9CisKKy8qIExvYWQgYnVmZmVyIHVzaW5nIGJvb3QgaW50ZXJmYWNlLgorICogbyBjb3B5IGRhdGEgZnJvbSBidWZmZXIgdG8gQ3ljbG9tLVggbWVtb3J5CisgKiBvIHdhaXQgZm9yIHJlc2V0IGNvZGUgdG8gY29weSBpdCB0byByaWdodCBwb3J0aW9uIG9mIG1lbW9yeSAqLworc3RhdGljIGludCBidWZmZXJfbG9hZCh2b2lkIF9faW9tZW0gKmFkZHIsIHU4ICpidWZmZXIsIHUzMiBjbnQpCit7CisJbWVtY3B5X3RvaW8oYWRkciArIERBVEFfT0ZGU0VULCBidWZmZXIsIGNudCk7CisJd3JpdGV3KEdFTl9CT09UX0RBVCwgYWRkciArIENNRF9PRkZTRVQpOworCisJcmV0dXJuIHdhaXRfY3ljKGFkZHIpOworfQorCisvKiBTZXQgdXAgZW50cnkgcG9pbnQgYW5kIGtpY2sgc3RhcnQgQ3ljbG9tLVggQ1BVLiAqLworc3RhdGljIHZvaWQgY3ljeF9zdGFydCh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJLyogcHV0IGluIDB4MzAgb2Zmc2V0IHRoZSBqdW1wIGluc3RydWN0aW9uIHRvIHRoZSBjb2RlIGVudHJ5IHBvaW50ICovCisJd3JpdGViKDB4ZWEsIGFkZHIgKyAweDMwKTsKKwl3cml0ZWIoMHgwMCwgYWRkciArIDB4MzEpOworCXdyaXRlYigweGM0LCBhZGRyICsgMHgzMik7CisJd3JpdGViKDB4MDAsIGFkZHIgKyAweDMzKTsKKwl3cml0ZWIoMHgwMCwgYWRkciArIDB4MzQpOworCisJLyogY21kIHRvIHN0YXJ0IGV4ZWN1dGluZyBjb2RlICovCisJd3JpdGV3KEdFTl9TVEFSVCwgYWRkciArIENNRF9PRkZTRVQpOworfQorCisvKiBMb2FkIGFuZCBib290IHJlc2V0IGNvZGUuICovCitzdGF0aWMgdm9pZCBjeWN4X3Jlc2V0X2Jvb3Qodm9pZCBfX2lvbWVtICphZGRyLCB1OCAqY29kZSwgdTMyIGxlbikKK3sKKwl2b2lkIF9faW9tZW0gKnB0X3N0YXJ0ID0gYWRkciArIFNUQVJUX09GRlNFVDsKKworCXdyaXRlYigweGVhLCBwdF9zdGFydCsrKTsgLyogam1wIHRvIGYwMDA6M2YwMCAqLworCXdyaXRlYigweDAwLCBwdF9zdGFydCsrKTsKKwl3cml0ZWIoMHhmYywgcHRfc3RhcnQrKyk7CisJd3JpdGViKDB4MDAsIHB0X3N0YXJ0KyspOworCXdyaXRlYigweGYwLCBwdF9zdGFydCk7CisJcmVzZXRfbG9hZChhZGRyLCBjb2RlLCBsZW4pOworCisJLyogODAxODYgd2FzIGluIGhvbGQsIGdvICovCisJd3JpdGViKDAsIGFkZHIgKyBTVEFSVF9DUFUpOworCWRlbGF5X2N5Y3goMSk7Cit9CisKKy8qIExvYWQgZGF0YS5iaW4gZmlsZSB0aHJvdWdoIGJvb3QgKHJlc2V0KSBpbnRlcmZhY2UuICovCitzdGF0aWMgaW50IGN5Y3hfZGF0YV9ib290KHZvaWQgX19pb21lbSAqYWRkciwgdTggKmNvZGUsIHUzMiBsZW4pCit7CisJdm9pZCBfX2lvbWVtICpwdF9ib290X2NtZCA9IGFkZHIgKyBDTURfT0ZGU0VUOworCXUzMiBpOworCisJLyogYm9vdCBidWZmZXIgbGVuZ2h0ICovCisJd3JpdGV3KENGTV9MT0FEX0JVRlNaLCBwdF9ib290X2NtZCArIHNpemVvZih1MTYpKTsKKwl3cml0ZXcoR0VOX0RFRlBBUiwgcHRfYm9vdF9jbWQpOworCisJaWYgKHdhaXRfY3ljKGFkZHIpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJd3JpdGV3KDAsIHB0X2Jvb3RfY21kICsgc2l6ZW9mKHUxNikpOworCXdyaXRldygweDQwMDAsIHB0X2Jvb3RfY21kICsgMiAqIHNpemVvZih1MTYpKTsKKwl3cml0ZXcoR0VOX1NFVF9TRUcsIHB0X2Jvb3RfY21kKTsKKworCWlmICh3YWl0X2N5YyhhZGRyKSA8IDApCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDAgOyBpIDwgbGVuIDsgaSArPSBDRk1fTE9BRF9CVUZTWikKKwkJaWYgKGJ1ZmZlcl9sb2FkKGFkZHIsIGNvZGUgKyBpLAorCQkJCW1pbl90KHUzMiwgQ0ZNX0xPQURfQlVGU1osIChsZW4gLSBpKSkpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgISFcbiIsIG1vZG5hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBMb2FkIGNvZGUuYmluIGZpbGUgdGhyb3VnaCBib290IChyZXNldCkgaW50ZXJmYWNlLiAqLworc3RhdGljIGludCBjeWN4X2NvZGVfYm9vdCh2b2lkIF9faW9tZW0gKmFkZHIsIHU4ICpjb2RlLCB1MzIgbGVuKQoreworCXZvaWQgX19pb21lbSAqcHRfYm9vdF9jbWQgPSBhZGRyICsgQ01EX09GRlNFVDsKKwl1MzIgaTsKKworCS8qIGJvb3QgYnVmZmVyIGxlbmdodCAqLworCXdyaXRldyhDRk1fTE9BRF9CVUZTWiwgcHRfYm9vdF9jbWQgKyBzaXplb2YodTE2KSk7CisJd3JpdGV3KEdFTl9ERUZQQVIsIHB0X2Jvb3RfY21kKTsKKworCWlmICh3YWl0X2N5YyhhZGRyKSA8IDApCisJCXJldHVybiAtMTsKKworCXdyaXRldygweDAwMDAsIHB0X2Jvb3RfY21kICsgc2l6ZW9mKHUxNikpOworCXdyaXRldygweGM0MDAsIHB0X2Jvb3RfY21kICsgMiAqIHNpemVvZih1MTYpKTsKKwl3cml0ZXcoR0VOX1NFVF9TRUcsIHB0X2Jvb3RfY21kKTsKKworCWlmICh3YWl0X2N5YyhhZGRyKSA8IDApCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDAgOyBpIDwgbGVuIDsgaSArPSBDRk1fTE9BRF9CVUZTWikKKwkJaWYgKGJ1ZmZlcl9sb2FkKGFkZHIsIGNvZGUgKyBpLAorCQkJCW1pbl90KHUzMiwgQ0ZNX0xPQURfQlVGU1osIChsZW4gLSBpKSkpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAhIVxuIiwgbW9kbmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCXJldHVybiAwOworfQorCisvKiBMb2FkIGFkYXB0ZXIgZnJvbSB0aGUgbWVtb3J5IGltYWdlIG9mIHRoZSBDWUNYIGZpcm13YXJlIG1vZHVsZS4KKyAqIG8gdmVyaWZ5IGZpcm13YXJlIGludGVncml0eSBhbmQgY29tcGF0aWJpbGl0eQorICogbyBzdGFydCBhZGFwdGVyIHVwICovCitzdGF0aWMgaW50IGxvYWRfY3ljMngoc3RydWN0IGN5Y3hfaHcgKmh3LCBzdHJ1Y3QgY3ljeF9maXJtd2FyZSAqY2ZtLCB1MzIgbGVuKQoreworCWludCBpLCBqOworCXN0cnVjdCBjeWN4X2Z3X2hlYWRlciAqaW1nX2hkcjsKKwl1OCAqcmVzZXRfaW1hZ2UsCisJICAgKmRhdGFfaW1hZ2UsCisJICAgKmNvZGVfaW1hZ2U7CisJdm9pZCBfX2lvbWVtICpwdF9jeWNsZCA9IGh3LT5kcG1iYXNlICsgMHg0MDA7CisJdTE2IGNrc3VtOworCisJLyogQW5ub3VuY2UgKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogZmlybXdhcmUgc2lnbmF0dXJlPVwiJXNcIlxuIiwgbW9kbmFtZSwKKwkJCQkJCQkgICAgY2ZtLT5zaWduYXR1cmUpOworCisJLyogVmVyaWZ5IGZpcm13YXJlIHNpZ25hdHVyZSAqLworCWlmIChzdHJjbXAoY2ZtLT5zaWduYXR1cmUsIENGTV9TSUdOQVRVUkUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6bG9hZF9jeWMyeDogbm90IEN5Y2xvbS0yWCBmaXJtd2FyZSFcbiIsCisJCQkJbW9kbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBmaXJtd2FyZSB2ZXJzaW9uPSV1XG4iLCBtb2RuYW1lLCBjZm0tPnZlcnNpb24pOworCisJLyogVmVyaWZ5IGZpcm13YXJlIG1vZHVsZSBmb3JtYXQgdmVyc2lvbiAqLworCWlmIChjZm0tPnZlcnNpb24gIT0gQ0ZNX1ZFUlNJT04pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczolczogZmlybXdhcmUgZm9ybWF0ICV1IHJlamVjdGVkISAiCisJCQkJIkV4cGVjdGluZyAldS5cbiIsCisJCQkJbW9kbmFtZSwgX19GVU5DVElPTl9fLCBjZm0tPnZlcnNpb24sIENGTV9WRVJTSU9OKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVmVyaWZ5IGZpcm13YXJlIG1vZHVsZSBsZW5ndGggYW5kIGNoZWNrc3VtICovCisJY2tzdW0gPSBjaGVja3N1bSgodTgqKSZjZm0tPmluZm8sIHNpemVvZihzdHJ1Y3QgY3ljeF9md19pbmZvKSArCisJCQkJCSAgY2ZtLT5pbmZvLmNvZGVzaXplKTsKKy8qCisJRklYTUUgY2ZtLT5pbmZvLmNvZGVzaXplIGlzIG9mZiBieSAyCisJaWYgKCgobGVuIC0gc2l6ZW9mKHN0cnVjdCBjeWN4X2Zpcm13YXJlKSAtIDEpICE9IGNmbS0+aW5mby5jb2Rlc2l6ZSkgfHwKKyovCisJaWYgKGNrc3VtICE9IGNmbS0+Y2hlY2tzdW0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczolczogZmlybXdhcmUgY29ycnVwdGVkIVxuIiwKKwkJCQltb2RuYW1lLCBfX0ZVTkNUSU9OX18pOworCQlwcmludGsoS0VSTl9FUlIgIiBjZHNpemUgPSAweCV4IChleHBlY3RlZCAweCVseClcbiIsCisJCQkJbGVuIC0gKGludClzaXplb2Yoc3RydWN0IGN5Y3hfZmlybXdhcmUpIC0gMSwKKwkJCQljZm0tPmluZm8uY29kZXNpemUpOworCQlwcmludGsoS0VSTl9FUlIgIiBjaGtzdW0gPSAweCV4IChleHBlY3RlZCAweCV4KVxuIiwKKwkJCQlja3N1bSwgY2ZtLT5jaGVja3N1bSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIElmIGV2ZXJ5dGhpbmcgaXMgb2ssIHNldCByZXNldCwgZGF0YSBhbmQgY29kZSBwb2ludGVycyAqLworCWltZ19oZHIgPSAoc3RydWN0IGN5Y3hfZndfaGVhZGVyICopJmNmbS0+aW1hZ2U7CisjaWZkZWYgRklSTVdBUkVfREVCVUcKKwlwcmludGsoS0VSTl9JTkZPICIlczolczogaW1hZ2Ugc2l6ZXNcbiIsIF9fRlVOQ1RJT05fXywgbW9kbmFtZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiIHJlc2V0PSVsdVxuIiwgaW1nX2hkci0+cmVzZXRfc2l6ZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiICBkYXRhPSVsdVxuIiwgaW1nX2hkci0+ZGF0YV9zaXplKTsKKwlwcmludGsoS0VSTl9JTkZPICIgIGNvZGU9JWx1XG4iLCBpbWdfaGRyLT5jb2RlX3NpemUpOworI2VuZGlmCisJcmVzZXRfaW1hZ2UgPSAoKHU4ICopaW1nX2hkcikgKyBzaXplb2Yoc3RydWN0IGN5Y3hfZndfaGVhZGVyKTsKKwlkYXRhX2ltYWdlID0gcmVzZXRfaW1hZ2UgKyBpbWdfaGRyLT5yZXNldF9zaXplOworCWNvZGVfaW1hZ2UgPSBkYXRhX2ltYWdlICsgaW1nX2hkci0+ZGF0YV9zaXplOworCisJLyotLS0tIFN0YXJ0IGxvYWQgLS0tLSovCisJLyogQW5ub3VuY2UgKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogbG9hZGluZyBmaXJtd2FyZSAlcyAoSUQ9JXUpLi4uXG4iLCBtb2RuYW1lLAorCQkJIGNmbS0+ZGVzY3JbMF0gPyBjZm0tPmRlc2NyIDogInVua25vd24gZmlybXdhcmUiLAorCQkJIGNmbS0+aW5mby5jb2RlaWQpOworCisJZm9yIChpID0gMCA7IGkgPCA1IDsgaSsrKSB7CisJCS8qIFJlc2V0IEN5Y2xvbSBoYXJkd2FyZSAqLworCQlpZiAoIXJlc2V0X2N5YzJ4KGh3LT5kcG1iYXNlKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZHBtIHByb2JsZW0gb3IgYm9hcmQgbm90IGZvdW5kXG4iLAorCQkJCQltb2RuYW1lKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogTG9hZCByZXNldC5iaW4gKi8KKwkJY3ljeF9yZXNldF9ib290KGh3LT5kcG1iYXNlLCByZXNldF9pbWFnZSwgaW1nX2hkci0+cmVzZXRfc2l6ZSk7CisJCS8qIHJlc2V0IGlzIHdhaXRpbmcgZm9yIGJvb3QgKi8KKwkJd3JpdGV3KEdFTl9QT1dFUl9PTiwgcHRfY3ljbGQpOworCQlkZWxheV9jeWN4KDEpOworCisJCWZvciAoaiA9IDAgOyBqIDwgMyA7IGorKykKKwkJCWlmICghcmVhZHcocHRfY3ljbGQpKQorCQkJCWdvdG8gcmVzZXRfbG9hZGVkOworCQkJZWxzZQorCQkJCWRlbGF5X2N5Y3goMSk7CisJfQorCisJcHJpbnRrKEtFUk5fRVJSICIlczogcmVzZXQgbm90IHN0YXJ0ZWQuXG4iLCBtb2RuYW1lKTsKKwlyZXR1cm4gLUVJTlZBTDsKKworcmVzZXRfbG9hZGVkOgorCS8qIExvYWQgZGF0YS5iaW4gKi8KKwlpZiAoY3ljeF9kYXRhX2Jvb3QoaHctPmRwbWJhc2UsIGRhdGFfaW1hZ2UsIGltZ19oZHItPmRhdGFfc2l6ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGxvYWQgZGF0YSBmaWxlLlxuIiwgbW9kbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIExvYWQgY29kZS5iaW4gKi8KKwlpZiAoY3ljeF9jb2RlX2Jvb3QoaHctPmRwbWJhc2UsIGNvZGVfaW1hZ2UsIGltZ19oZHItPmNvZGVfc2l6ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGxvYWQgY29kZSBmaWxlLlxuIiwgbW9kbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFByZXBhcmUgYm9vdC10aW1lIGNvbmZpZ3VyYXRpb24gZGF0YSAqLworCWN5Y3hfYm9vdGNmZyhodyk7CisKKwkvKiBraWNrLW9mZiBDUFUgKi8KKwljeWN4X3N0YXJ0KGh3LT5kcG1iYXNlKTsKKworCS8qIEFydGh1ciBHYW56ZXJ0J3MgdGlwOiB3YWl0IGEgd2hpbGUgYWZ0ZXIgdGhlIGZpcm13YXJlIGxvYWRpbmcuLi4KKwkgICBzZWcgYWJyIDI2IDE3OjE3OjEyIEVTVCAxOTk5IC0gYWNtZSAqLworCWRlbGF5X2N5Y3goNyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZpcm13YXJlIGxvYWRlZCFcbiIsIG1vZG5hbWUpOworCisJLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwljeWN4X2ludGVuKGh3KTsKKworCXJldHVybiAwOworfQorCisvKiBQcmVwYXJlIGJvb3QtdGltZSBmaXJtd2FyZSBjb25maWd1cmF0aW9uIGRhdGEuCisgKiBvIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiBkYXRhIGFyZWEKKyAgIEZyb20gYXN5bmMuZG9jIC0gVl8zLjQuMCAtIDA3LzE4LzE5OTQKKyAgIC0gQXMgb2Ygbm93LCBvbmx5IHN0YXRpYyBidWZmZXJzIGFyZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIuCisgICAgIFNvLCB0aGUgYml0IFZEX1JYRElSQyBtdXN0IGJlIHNldCBpbiAndmFsaWQnLiBUaGF0IG1lYW5zIHRoYXQgdXNlcgorICAgICB3YW50cyB0byB1c2UgdGhlIHN0YXRpYyB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbiBidWZmZXJzLiAqLworc3RhdGljIHZvaWQgY3ljeF9ib290Y2ZnKHN0cnVjdCBjeWN4X2h3ICpodykKK3sKKwkvKiB1c2UgZml4ZWQgYnVmZmVycyAqLworCXdyaXRlYihGSVhFRF9CVUZGRVJTLCBody0+ZHBtYmFzZSArIENPTkZfT0ZGU0VUKTsKK30KKworLyogRGV0ZWN0IEN5Y2xvbSAyeCBhZGFwdGVyLgorICoJRm9sbG93aW5nIHRlc3RzIGFyZSB1c2VkIHRvIGRldGVjdCBDeWNsb20gMnggYWRhcHRlcjoKKyAqICAgICAgIHRvIGJlIGNvbXBsZXRlZCBiYXNlZCBvbiB0aGUgdGVzdHMgZG9uZSBiZWxvdworICoJUmV0dXJuIDEgaWYgZGV0ZWN0ZWQgby5rLiBvciAwIGlmIGZhaWxlZC4KKyAqCU5vdGU6CVRoaXMgdGVzdCBpcyBkZXN0cnVjdGl2ZSEgQWRhcHRlciB3aWxsIGJlIGxlZnQgaW4gc2h1dGRvd24KKyAqCQlzdGF0ZSBhZnRlciB0aGUgdGVzdC4gKi8KK3N0YXRpYyBpbnQgZGV0ZWN0X2N5YzJ4KHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlyZXNldF9jeWMyeChhZGRyKTsKKworCXJldHVybiBtZW1vcnlfZXhpc3RzKGFkZHIpOworfQorCisvKiBNaXNjZWxsYW5lb3VzICovCisvKiBHZXQgb3B0aW9uJ3MgaW5kZXggaW50byB0aGUgb3B0aW9ucyBsaXN0LgorICoJUmV0dXJuIG9wdGlvbidzIGluZGV4ICgxIC4uIE4pIG9yIHplcm8gaWYgb3B0aW9uIGlzIGludmFsaWQuICovCitzdGF0aWMgaW50IGdldF9vcHRpb25faW5kZXgobG9uZyAqb3B0bGlzdCwgbG9uZyBvcHR2YWwpCit7CisJaW50IGkgPSAxOworCisJZm9yICg7IGkgPD0gb3B0bGlzdFswXTsgKytpKQorCQlpZiAob3B0bGlzdFtpXSA9PSBvcHR2YWwpCisJCQlyZXR1cm4gaTsKKworCXJldHVybiAwOworfQorCisvKiBSZXNldCBhZGFwdGVyJ3MgQ1BVLiAqLworc3RhdGljIGludCByZXNldF9jeWMyeCh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJd3JpdGViKDAsIGFkZHIgKyBSU1RfRU5BQkxFKTsKKwlkZWxheV9jeWN4KDIpOworCXdyaXRlYigwLCBhZGRyICsgUlNUX0RJU0FCTEUpOworCWRlbGF5X2N5Y3goMik7CisKKwlyZXR1cm4gbWVtb3J5X2V4aXN0cyhhZGRyKTsKK30KKworLyogRGVsYXkgKi8KK3N0YXRpYyB2b2lkIGRlbGF5X2N5Y3goaW50IHNlYykKK3sKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoc2VjICogSFopOworfQorCisvKiBDYWxjdWxhdGUgMTYtYml0IENSQyB1c2luZyBDQ0lUVCBwb2x5bm9taWFsLiAqLworc3RhdGljIHUxNiBjaGVja3N1bSh1OCAqYnVmLCB1MzIgbGVuKQoreworCXUxNiBjcmMgPSAwOworCXUxNiBtYXNrLCBmbGFnOworCisJZm9yICg7IGxlbjsgLS1sZW4sICsrYnVmKQorCQlmb3IgKG1hc2sgPSAweDgwOyBtYXNrOyBtYXNrID4+PSAxKSB7CisJCQlmbGFnID0gKGNyYyAmIDB4ODAwMCk7CisJCQljcmMgPDw9IDE7CisJCQljcmMgfD0gKCgqYnVmICYgbWFzaykgPyAxIDogMCk7CisKKwkJCWlmIChmbGFnKQorCQkJCWNyYyBePSAweDEwMjE7CisJCX0KKworCXJldHVybiBjcmM7Cit9CisKK21vZHVsZV9pbml0KGN5Y3hfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQoY3ljeF9kcnZfY2xlYW51cCk7CisKKy8qIEVuZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2N5Y3hfbWFpbi5jIGIvZHJpdmVycy9uZXQvd2FuL2N5Y3hfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNDgwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vY3ljeF9tYWluLmMKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisqIGN5Y3hfbWFpbi5jCUN5Y2xhZGVzIEN5Y2xvbSAyWCBXQU4gTGluayBEcml2ZXIuIE1haW4gbW9kdWxlLgorKgorKiBBdXRob3I6CUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk4LTIwMDMgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvCisqCisqIEJhc2VkIG9uIHNkbGFtYWluLmMgYnkgR2VuZSBLb3ppbiA8Z2VuZWtAY29tcHVzZXJ2ZS5jb20+ICYKKyoJCQkgSmFzcHJlZXQgU2luZ2gJPGphc3ByZWV0QHNhbmdvbWEuY29tPgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBQbGVhc2UgbG9vayBhdCB0aGUgYml0a2VlcGVyIGNoYW5nZWxvZyAob3IgYW55IG90aGVyIHNjbSB0b29sIHRoYXQgZW5kcyB1cAorKiBpbXBvcnRpbmcgYml0a2VlcGVyIGNoYW5nZWxvZyBvciB0aGF0IHJlcGxhY2VzIGJpdGtlZXBlciBpbiB0aGUgZnV0dXJlIGFzCisqIG1haW4gdG9vbCBmb3IgbGludXggZGV2ZWxvcG1lbnQpLgorKiAKKyogMjAwMS8wNS8wOQlhY21lCQlGaXggTU9EVUxFX0RFU0MgZm9yIGRlYnVnLCAuYnNzIG5pdHBpY2tzLAorKiAJCQkJc29tZSBjbGVhbnVwcworKiAyMDAwLzA3LzEzCWFjbWUJCXJlbW92ZSB1c2VsZXNzICNpZmRlZiBNT0RVTEUgYW5kIGNyYXAKKyoJCQkJI2lmIEtFUk5FTF9WRVJTSU9OID4gYmxhaAorKiAyMDAwLzA3LzA2CWFjbWUJCV9fZXhpdCBhdCBjeWNsb214X2NsZWFudXAKKyogMjAwMC8wNC8wMglhY21lCQlkcHJpbnRrIGFuZCBjeWN4X2RlYnVnCisqIAkJCQltb2R1bGVfaW5pdC9tb2R1bGVfZXhpdAorKiAyMDAwLzAxLzIxCWFjbWUJCXJlbmFtZSBjeWNsb214X29wZW4gdG8gY3ljbG9teF9tb2RfaW5jX3VzZV9jb3VudAorKgkJCQlhbmQgY3ljbG9teF9jbG9zZSB0byBjeWNsb214X21vZF9kZWNfdXNlX2NvdW50CisqIDIwMDAvMDEvMDgJYWNtZQkJY2xlYW51cAorKiAxOTk5LzExLzA2CWFjbWUJCWN5Y3hfZG93biBiYWNrIHRvIGxpZmUgKGl0IG5lZWRzIHRvIGJlCisqCQkJCWNhbGxlZCB0byBpb3VubWFwIHRoZSBkcG1iYXNlKQorKiAxOTk5LzA4LzA5CWFjbWUJCXJlbW92ZWQgcmVmZXJlbmNlcyB0byBlbmFibGVfdHhfaW50CisqCQkJCXVzZSBzcGlubG9ja3MgaW5zdGVhZCBvZiBjbGkvc3RpIGluCisqCQkJCWN5Y2xvbXhfc2V0X3N0YXRlCisqIDE5OTkvMDUvMTkJYWNtZQkJd29ya3MgZGlyZWN0bHkgbGlua2VkIGludG8gdGhlIGtlcm5lbAorKgkJCQlpbml0X3dhaXRxdWV1ZV9oZWFkIGZvciAyLjMuKiBrZXJuZWwKKyogMTk5OS8wNS8xOAlhY21lCQltYWpvciBjbGVhbnVwIChwb2xsaW5nIG5vdCBuZWVkZWQpLCBldGMKKyogMTk5OC8wOC8yOAlhY21lCQltaW5vciBjbGVhbnVwIChpb2N0bHMgZm9yIGZpcm13YXJlIGRlbGV0ZWQpCisqCQkJCXF1ZXVlX3Rhc2sgYWN0aXZhdGVkCisqIDE5OTgvMDgvMDgJYWNtZQkJSW5pdGlhbCB2ZXJzaW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgkvKiBPUyBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogb2Zmc2V0b2YoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIHJldHVybiBjb2RlcyAqLworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBpbmxpbmUgbWVtc2V0KCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrKCksIGFuZCBvdGhlciB1c2VmdWwgc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogc3VwcG9ydCBmb3IgbG9hZGFibGUgbW9kdWxlcyAqLworI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiByZXF1ZXN0X3JlZ2lvbigpLCByZWxlYXNlX3JlZ2lvbigpICovCisjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9jeWNsb214Lmg+CS8qIGN5Y2xvbXggY29tbW9uIHVzZXIgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPiAgICAgICAgIC8qIF9faW5pdCAod2hlbiBub3QgdXNpbmcgYXMgYSBtb2R1bGUpICovCisKK3Vuc2lnbmVkIGludCBjeWN4X2RlYnVnOworCitNT0RVTEVfQVVUSE9SKCJBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ3ljbG9tIDJYIFN5bmMgQ2FyZCBEcml2ZXIuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW0oY3ljeF9kZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY3ljeF9kZWJ1ZywgImN5Y2xvbXggZGVidWcgbGV2ZWwiKTsKKworLyogRGVmaW5lcyAmIE1hY3JvcyAqLworCisjZGVmaW5lCUNZQ1hfRFJWX1ZFUlNJT04JMAkvKiB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZQlDWUNYX0RSVl9SRUxFQVNFCTExCS8qIHJlbGVhc2UgKG1pbm9yIHZlcnNpb24pIG51bWJlciAqLworI2RlZmluZQlDWUNYX01BWF9DQVJEUwkJMQkvKiBtYXggbnVtYmVyIG9mIGFkYXB0ZXJzICovCisKKyNkZWZpbmUJQ09ORklHX0NZQ1hfQ0FSRFMgMQorCisvKiBGdW5jdGlvbiBQcm90b3R5cGVzICovCisKKy8qIFdBTiBsaW5rIGRyaXZlciBlbnRyeSBwb2ludHMgKi8KK3N0YXRpYyBpbnQgY3ljeF93YW5fc2V0dXAoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwgd2FuZGV2X2NvbmZfdCAqY29uZik7CitzdGF0aWMgaW50IGN5Y3hfd2FuX3NodXRkb3duKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYpOworCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworc3RhdGljIGlycXJldHVybl90IGN5Y3hfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisvKiBHbG9iYWwgRGF0YQorICogTm90ZTogQWxsIGRhdGEgbXVzdCBiZSBleHBsaWNpdGx5IGluaXRpYWxpemVkISEhCisgKi8KKworLyogcHJpdmF0ZSBkYXRhICovCitzdGF0aWMgY2hhciBjeWN4X2Rydm5hbWVbXSA9ICJjeWNsb214IjsKK3N0YXRpYyBjaGFyIGN5Y3hfZnVsbG5hbWVbXSA9ICJDWUNMT00gMlgodG0pIFN5bmMgQ2FyZCBEcml2ZXIiOworc3RhdGljIGNoYXIgY3ljeF9jb3B5cmlnaHRbXSA9ICIoYykgMTk5OC0yMDAzIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyAiCisJCQkgICI8YWNtZUBjb25lY3RpdmEuY29tLmJyPiI7CitzdGF0aWMgaW50IGN5Y3hfbmNhcmRzID0gQ09ORklHX0NZQ1hfQ0FSRFM7CitzdGF0aWMgc3RydWN0IGN5Y3hfZGV2aWNlICpjeWN4X2NhcmRfYXJyYXk7CS8qIGFkYXB0ZXIgZGF0YSBzcGFjZSAqLworCisvKiBLZXJuZWwgTG9hZGFibGUgTW9kdWxlIEVudHJ5IFBvaW50cyAqLworCisvKgorICogTW9kdWxlICdpbnNlcnQnIGVudHJ5IHBvaW50LgorICogbyBwcmludCBhbm5vdW5jZW1lbnQKKyAqIG8gYWxsb2NhdGUgYWRhcHRlciBkYXRhIHNwYWNlCisgKiBvIGluaXRpYWxpemUgc3RhdGljIGRhdGEKKyAqIG8gcmVnaXN0ZXIgYWxsIGNhcmRzIHdpdGggV0FOIHJvdXRlcgorICogbyBjYWxpYnJhdGUgQ3ljbG9tIDJYIHNoYXJlZCBtZW1vcnkgYWNjZXNzIGRlbGF5LgorICoKKyAqIFJldHVybjoJMAlPaworICoJCTwgMAllcnJvci4KKyAqIENvbnRleHQ6CXByb2Nlc3MKKyAqLworaW50IF9faW5pdCBjeWN4X2luaXQodm9pZCkKK3sKKwlpbnQgY250LCBlcnIgPSAtRU5PTUVNOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgdiV1LiV1ICVzXG4iLAorCQljeWN4X2Z1bGxuYW1lLCBDWUNYX0RSVl9WRVJTSU9OLCBDWUNYX0RSVl9SRUxFQVNFLAorCQljeWN4X2NvcHlyaWdodCk7CisKKwkvKiBWZXJpZnkgbnVtYmVyIG9mIGNhcmRzIGFuZCBhbGxvY2F0ZSBhZGFwdGVyIGRhdGEgc3BhY2UgKi8KKwljeWN4X25jYXJkcyA9IG1pbl90KGludCwgY3ljeF9uY2FyZHMsIENZQ1hfTUFYX0NBUkRTKTsKKwljeWN4X25jYXJkcyA9IG1heF90KGludCwgY3ljeF9uY2FyZHMsIDEpOworCWN5Y3hfY2FyZF9hcnJheSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjeWN4X2RldmljZSkgKiBjeWN4X25jYXJkcywKKwkJCQkgIEdGUF9LRVJORUwpOworCWlmICghY3ljeF9jYXJkX2FycmF5KQorCQlnb3RvIG91dDsKKworCW1lbXNldChjeWN4X2NhcmRfYXJyYXksIDAsIHNpemVvZihzdHJ1Y3QgY3ljeF9kZXZpY2UpICogY3ljeF9uY2FyZHMpOworCisJLyogUmVnaXN0ZXIgYWRhcHRlcnMgd2l0aCBXQU4gcm91dGVyICovCisJZm9yIChjbnQgPSAwOyBjbnQgPCBjeWN4X25jYXJkczsgKytjbnQpIHsKKwkJc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkID0gJmN5Y3hfY2FyZF9hcnJheVtjbnRdOworCQlzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKworCQlzcHJpbnRmKGNhcmQtPmRldm5hbWUsICIlcyVkIiwgY3ljeF9kcnZuYW1lLCBjbnQgKyAxKTsKKwkJd2FuZGV2LT5tYWdpYyAgICA9IFJPVVRFUl9NQUdJQzsKKwkJd2FuZGV2LT5uYW1lICAgICA9IGNhcmQtPmRldm5hbWU7CisJCXdhbmRldi0+cHJpdmF0ZSAgPSBjYXJkOworCQl3YW5kZXYtPnNldHVwICAgID0gY3ljeF93YW5fc2V0dXA7CisJCXdhbmRldi0+c2h1dGRvd24gPSBjeWN4X3dhbl9zaHV0ZG93bjsKKwkJZXJyID0gcmVnaXN0ZXJfd2FuX2RldmljZSh3YW5kZXYpOworCisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIHJlZ2lzdHJhdGlvbiBmYWlsZWQgd2l0aCAiCisJCQkJCSJlcnJvciAlZCFcbiIsCisJCQkJCWN5Y3hfZHJ2bmFtZSwgY2FyZC0+ZGV2bmFtZSwgZXJyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIWNudCkgeworCQlrZnJlZShjeWN4X2NhcmRfYXJyYXkpOworCQlnb3RvIG91dDsKKwl9CisJZXJyID0gMDsKKwljeWN4X25jYXJkcyA9IGNudDsJLyogYWRqdXN0IGFjdHVhbCBudW1iZXIgb2YgY2FyZHMgKi8KK291dDoJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIE1vZHVsZSAncmVtb3ZlJyBlbnRyeSBwb2ludC4KKyAqIG8gdW5yZWdpc3RlciBhbGwgYWRhcHRlcnMgZnJvbSB0aGUgV0FOIHJvdXRlcgorICogbyByZWxlYXNlIGFsbCByZW1haW5pbmcgc3lzdGVtIHJlc291cmNlcworICovCitzdGF0aWMgdm9pZCBfX2V4aXQgY3ljeF9leGl0KHZvaWQpCit7CisJaW50IGkgPSAwOworCisJZm9yICg7IGkgPCBjeWN4X25jYXJkczsgKytpKSB7CisJCXN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCA9ICZjeWN4X2NhcmRfYXJyYXlbaV07CisJCXVucmVnaXN0ZXJfd2FuX2RldmljZShjYXJkLT5kZXZuYW1lKTsKKwl9CisKKwlrZnJlZShjeWN4X2NhcmRfYXJyYXkpOworfQorCisvKiBXQU4gRGV2aWNlIERyaXZlciBFbnRyeSBQb2ludHMgKi8KKy8qCisgKiBTZXR1cC9jb25maWd1cmUgV0FOIGxpbmsgZHJpdmVyLgorICogbyBjaGVjayBhZGFwdGVyIHN0YXRlCisgKiBvIG1ha2Ugc3VyZSBmaXJtd2FyZSBpcyBwcmVzZW50IGluIGNvbmZpZ3VyYXRpb24KKyAqIG8gYWxsb2NhdGUgaW50ZXJydXB0IHZlY3RvcgorICogbyBzZXR1cCBDeWNsb20gMlggaGFyZHdhcmUKKyAqIG8gY2FsbCBhcHByb3ByaWF0ZSByb3V0aW5lIHRvIHBlcmZvcm0gcHJvdG9jb2wtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHJvdXRlciBoYW5kbGVzIFJPVVRFUl9TRVRVUCBJT0NUTC4gVGhlCisgKiBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBpcyBpbiBrZXJuZWwgbWVtb3J5IChpbmNsdWRpbmcgZXh0ZW5kZWQgZGF0YSwgaWYKKyAqIGFueSkuCisgKi8KK3N0YXRpYyBpbnQgY3ljeF93YW5fc2V0dXAoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwgd2FuZGV2X2NvbmZfdCAqY29uZikKK3sKKwlpbnQgcmMgPSAtRUZBVUxUOworCXN0cnVjdCBjeWN4X2RldmljZSAqY2FyZDsKKwlpbnQgaXJxOworCisJLyogU2FuaXR5IGNoZWNrcyAqLworCisJaWYgKCF3YW5kZXYgfHwgIXdhbmRldi0+cHJpdmF0ZSB8fCAhY29uZikKKwkJZ290byBvdXQ7CisKKwljYXJkID0gd2FuZGV2LT5wcml2YXRlOworCXJjID0gLUVCVVNZOworCWlmICh3YW5kZXYtPnN0YXRlICE9IFdBTl9VTkNPTkZJR1VSRUQpCisJCWdvdG8gb3V0OworCisJcmMgPSAtRUlOVkFMOworCWlmICghY29uZi0+ZGF0YV9zaXplIHx8ICFjb25mLT5kYXRhKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZpcm13YXJlIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uICIKKwkJCQkiZGF0YSFcbiIsIHdhbmRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjb25mLT5pcnEgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBjb25maWd1cmUgd2l0aG91dCBJUlEhXG4iLAorCQkJCXdhbmRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEFsbG9jYXRlIElSUSAqLworCWlycSA9IGNvbmYtPmlycSA9PSAyID8gOSA6IGNvbmYtPmlycTsJLyogSVJRMiAtPiBJUlE5ICovCisKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBjeWN4X2lzciwgMCwgd2FuZGV2LT5uYW1lLCBjYXJkKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCByZXNlcnZlIElSUSAlZCFcbiIsCisJCQkJd2FuZGV2LT5uYW1lLCBpcnEpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDb25maWd1cmUgaGFyZHdhcmUsIGxvYWQgZmlybXdhcmUsIGV0Yy4gKi8KKwltZW1zZXQoJmNhcmQtPmh3LCAwLCBzaXplb2YoY2FyZC0+aHcpKTsKKwljYXJkLT5ody5pcnEJID0gaXJxOworCWNhcmQtPmh3LmRwbXNpemUgPSBDWUNYX1dJTkRPV1NJWkU7CisJY2FyZC0+aHcuZndpZAkgPSBDRklEX1gyNV8yWDsKKwlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+d2FpdF9zdGF0cyk7CisKKwlyYyA9IGN5Y3hfc2V0dXAoJmNhcmQtPmh3LCBjb25mLT5kYXRhLCBjb25mLT5kYXRhX3NpemUsIGNvbmYtPm1hZGRyKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2lycTsKKworCS8qIEluaXRpYWxpemUgV0FOIGRldmljZSBkYXRhIHNwYWNlICovCisJd2FuZGV2LT5pcnEgICAgICAgPSBpcnE7CisJd2FuZGV2LT5kbWEgICAgICAgPSB3YW5kZXYtPmlvcG9ydCA9IDA7CisJd2FuZGV2LT5tYWRkciAgICAgPSAodW5zaWduZWQgbG9uZyljYXJkLT5ody5kcG1iYXNlOworCXdhbmRldi0+bXNpemUgICAgID0gY2FyZC0+aHcuZHBtc2l6ZTsKKwl3YW5kZXYtPmh3X29wdFsyXSA9IDA7CisJd2FuZGV2LT5od19vcHRbM10gPSBjYXJkLT5ody5md2lkOworCisJLyogUHJvdG9jb2wtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KKwlzd2l0Y2ggKGNhcmQtPmh3LmZ3aWQpIHsKKyNpZmRlZiBDT05GSUdfQ1lDTE9NWF9YMjUKKwljYXNlIENGSURfWDI1XzJYOgorCQlyYyA9IGN5Y3hfeDI1X3dhbl9pbml0KGNhcmQsIGNvbmYpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRoaXMgZmlybXdhcmUgaXMgbm90IHN1cHBvcnRlZCFcbiIsCisJCQkJd2FuZGV2LT5uYW1lKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKworCWlmIChyYykgeworCQljeWN4X2Rvd24oJmNhcmQtPmh3KTsKKwkJZ290byBvdXRfaXJxOworCX0KKworCXJjID0gMDsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfaXJxOgorCWZyZWVfaXJxKGlycSwgY2FyZCk7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiBTaHV0IGRvd24gV0FOIGxpbmsgZHJpdmVyLgorICogbyBzaHV0IGRvd24gYWRhcHRlciBoYXJkd2FyZQorICogbyByZWxlYXNlIHN5c3RlbSByZXNvdXJjZXMuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHJvdXRlciB3aGVuIGRldmljZSBpcyBiZWluZyB1bnJlZ2lzdGVyZWQgb3IKKyAqIHdoZW4gaXQgaGFuZGxlcyBST1VURVJfRE9XTiBJT0NUTC4KKyAqLworc3RhdGljIGludCBjeWN4X3dhbl9zaHV0ZG93bihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2KQoreworCWludCByZXQgPSAtRUZBVUxUOworCXN0cnVjdCBjeWN4X2RldmljZSAqY2FyZDsKKworCS8qIHNhbml0eSBjaGVja3MgKi8KKwlpZiAoIXdhbmRldiB8fCAhd2FuZGV2LT5wcml2YXRlKQorCQlnb3RvIG91dDsKKworCXJldCA9IDA7CisJaWYgKHdhbmRldi0+c3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCkKKwkJZ290byBvdXQ7CisKKwljYXJkID0gd2FuZGV2LT5wcml2YXRlOworCXdhbmRldi0+c3RhdGUgPSBXQU5fVU5DT05GSUdVUkVEOworCWN5Y3hfZG93bigmY2FyZC0+aHcpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBpcnEgJWQgYmVpbmcgZnJlZWQhXG4iLCB3YW5kZXYtPm5hbWUsCisJCQl3YW5kZXYtPmlycSk7CisJZnJlZV9pcnEod2FuZGV2LT5pcnEsIGNhcmQpOworb3V0OglyZXR1cm4gcmV0OworfQorCisvKiBNaXNjZWxsYW5lb3VzICovCisvKgorICogQ3ljbG9tIDJYIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUuCisgKiBvIGFja25vd2xlZGdlIEN5Y2xvbSAyWCBoYXJkd2FyZSBpbnRlcnJ1cHQuCisgKiBvIGNhbGwgcHJvdG9jb2wtc3BlY2lmaWMgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSwgaWYgYW55LgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgY3ljeF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQgPSAoc3RydWN0IGN5Y3hfZGV2aWNlICopZGV2X2lkOworCisJaWYgKCFjYXJkIHx8IGNhcmQtPndhbmRldi5zdGF0ZSA9PSBXQU5fVU5DT05GSUdVUkVEKQorCQlnb3RvIG91dDsKKworCWlmIChjYXJkLT5pbl9pc3IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludGVycnVwdCByZS1lbnRyYW5jeSBvbiBJUlEgJWQhXG4iLAorCQkJCSAgICBjYXJkLT5kZXZuYW1lLCBjYXJkLT53YW5kZXYuaXJxKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGNhcmQtPmlzcikKKwkJY2FyZC0+aXNyKGNhcmQpOworCXJldHVybiBJUlFfSEFORExFRDsKK291dDoKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKKy8qIFNldCBXQU4gZGV2aWNlIHN0YXRlLiAgKi8KK3ZvaWQgY3ljeF9zZXRfc3RhdGUoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLCBpbnQgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyICpzdHJpbmdfc3RhdGUgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChjYXJkLT53YW5kZXYuc3RhdGUgIT0gc3RhdGUpIHsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFdBTl9DT05ORUNURUQ6CisJCQlzdHJpbmdfc3RhdGUgPSAiY29ubmVjdGVkISI7CisJCQlicmVhazsKKwkJY2FzZSBXQU5fRElTQ09OTkVDVEVEOgorCQkJc3RyaW5nX3N0YXRlID0gImRpc2Nvbm5lY3RlZCEiOworCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgJXNcbiIsIGNhcmQtPmRldm5hbWUsIHN0cmluZ19zdGF0ZSk7CisJCWNhcmQtPndhbmRldi5zdGF0ZSA9IHN0YXRlOworCX0KKworCWNhcmQtPnN0YXRlX3RpY2sgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworbW9kdWxlX2luaXQoY3ljeF9pbml0KTsKK21vZHVsZV9leGl0KGN5Y3hfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vY3ljeF94MjUuYyBiL2RyaXZlcnMvbmV0L3dhbi9jeWN4X3gyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNDhjZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vY3ljeF94MjUuYwpAQCAtMCwwICsxLDE2MDkgQEAKKy8qCisqIGN5Y3hfeDI1LmMJQ3ljbG9tIDJYIFdBTiBMaW5rIERyaXZlci4gIFguMjUgbW9kdWxlLgorKgorKiBBdXRob3I6CUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk4LTIwMDMgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvCisqCisqIEJhc2VkIG9uIHNkbGFfeDI1LmMgYnkgR2VuZSBLb3ppbiA8Z2VuZWtAY29tcHVzZXJ2ZS5jb20+CisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIDIwMDEvMDEvMTIJYWNtZQkJdXNlIGRldl9rZnJlZV9za2JfaXJxIG9uIGludGVycnVwdCBjb250ZXh0CisqIDIwMDAvMDQvMDIJYWNtZQkJZHByaW50aywgY3ljeF9kZWJ1ZworKiAJCQkJZml4ZWQgdGhlIGJ1ZyBpbnRyb2R1Y2VkIGluIGdldF9kZXZfYnlfbGNuIGFuZAorKiAJCQkJZ2V0X2Rldl9ieV9kdGVfYWRkciBieSB0aGUgYW5vbnltb3VzIGhhY2tlcgorKiAJCQkJdGhhdCBjb252ZXJ0ZWQgdGhpcyBkcml2ZXIgdG8gc29mdG5ldAorKiAyMDAwLzAxLzA4CWFjbWUJCWNsZWFudXAKKyogMTk5OS8xMC8yNwlhY21lCQl1c2UgQVJQSFJEX0hXWDI1IHNvIHRoYXQgdGhlIFguMjUgc3RhY2sga25vdworKgkJCQl0aGF0IHdlIGhhdmUgYSBYLjI1IHN0YWNrIGltcGxlbWVudGVkIGluCisqCQkJCWZpcm13YXJlIG9uYm9hcmQKKyogMTk5OS8xMC8xOAlhY21lCQlzdXBwb3J0IGZvciBYLjI1IHNvY2tldHMgaW4gaWZfc2VuZCwKKyoJCQkJYmV3YXJlOiBzb2NrZXQoQUZfWDI1Li4uKSBJUyBXT1JLIElOIFBST0dSRVNTLAorKgkJCQlUQ1AvSVAgb3ZlciBYLjI1IHZpYSB3YW5yb3V0ZXIgbm90IGFmZmVjdGVkLAorKgkJCQl3b3JraW5nLgorKiAxOTk5LzEwLzA5CWFjbWUJCWNoYW5fZGlzYyByZW5hbWVkIHRvIGNoYW5fZGlzY29ubmVjdCwKKyogCQkJCWJlZ2FuIGFkZGluZyBzdXBwb3J0IGZvciBYLjI1IHNvY2tldHM6CisqIAkJCQljb25mLT5wcm90b2NvbCBpbiBuZXdfaWYKKyogMTk5OS8xMC8wNQlhY21lCQlmaXhlZCByZXR1cm4gRS4uLiB0byByZXR1cm4gLUUuLi4KKyogMTk5OS8wOC8xMAlhY21lCQlzZXJpYWxpemVkIGFjY2VzcyB0byB0aGUgY2FyZCB0aHJ1IGEgc3BpbmxvY2sKKyoJCQkJaW4geDI1X2V4ZWMKKyogMTk5OS8wOC8wOQlhY21lCQlyZW1vdmVkIHBlciBjaGFubmVsIHNwaW5sb2NrcworKgkJCQlyZW1vdmVkIHJlZmVyZW5jZXMgdG8gZW5hYmxlX3R4X2ludAorKiAxOTk5LzA1LzI4CWFjbWUJCWZpeGVkIG5pYmJsZV90b19ieXRlLCBhY2t2YyBub3cgcHJvcGVybHkgdHJlYXRlZAorKgkJCQlpZl9zZW5kIHNpbXBsaWZpZWQKKyogMTk5OS8wNS8yNQlhY21lCQlmaXhlZCB0MSwgdDIsIHQyMSAmIHQyMyBjb25maWd1cmF0aW9uCisqCQkJCXVzZSBzcGlubG9ja3MgaW5zdGVhZCBvZiBjbGkvc3RpIGluIHNvbWUgcG9pbnRzCisqIDE5OTkvMDUvMjQJYWNtZQkJZmluaXNoZWQgdGhlIHgyNV9nZXRfc3RhdCBmdW5jdGlvbgorKiAxOTk5LzA1LzIzCWFjbWUJCWRldi0+dHlwZSA9IEFSUEhSRF9YMjUgKHRjcGR1bXAgb25seSB3b3JrcywKKyoJCQkJQUZBSVQsIHdpdGggQVJQSFJEX0VUSEVSKS4gVGhpcyBzZWVtcyB0byBiZQorKgkJCQluZWVkZWQgdG8gdXNlIHNvY2tldChBRl9YMjUpLi4uCisqCQkJCU5vdyB0aGUgY29uZmlnIGZpbGUgbXVzdCBzcGVjaWZ5IGEgcGVlciBtZWRpYQorKgkJCQlhZGRyZXNzIGZvciBzdmMgY2hhbm5lbHMgb3ZlciBhIGNyb3Nzb3ZlciBjYWJsZS4KKyoJCQkJUmVtb3ZlZCBob2xkX3RpbWVvdXQgZnJvbSB4MjVfY2hhbm5lbF90LAorKgkJCQlub3QgdXNlZC4KKyoJCQkJQSBsaXR0bGUgZW5oYW5jZW1lbnQgaW4gdGhlIERFQlVHIHByb2Nlc3NpbmcKKyogMTk5OS8wNS8yMglhY21lCQlnbyB0byBESVNDT05ORUNURUQgaW4gZGlzY29ubmVjdF9jb25maXJtX2ludHIsCisqCQkJCWluc3RlYWQgb2YgY2hhbl9kaXNjLgorKiAxOTk5LzA1LzE2CW1hcmNlbG8JCWZpeGVkIHRpbWVyIGluaXRpYWxpemF0aW9uIGluIFNWQ3MKKyogMTk5OS8wMS8wNQlhY21lCQl4MjVfY29uZmlndXJlIG5vdyBnZXQgKG1vc3Qgb2YpIGFsbAorKgkJCQlwYXJhbWV0ZXJzLi4uCisqIDE5OTkvMDEvMDUJYWNtZQkJcGt0bGVuIG5vdyAoY29ycmVjdGx5KSB1c2VzIGxvZzIgKHZhbHVlCisqCQkJCWNvbmZpZ3VyZWQpCisqIDE5OTkvMDEvMDMJYWNtZQkJanVkaWNpb3VzIHVzZSBvZiBkYXRhIHR5cGVzICh1OCwgdTE2LCB1MzIsIGV0YykKKyogMTk5OS8wMS8wMwlhY21lCQljeXhfaXNyOiByZXNldCBkcG1iYXNlIHRvIGFja25vd2xlZGdlCisqCQkJCWluZGljYXRpb24gKGludGVycnVwdCBmcm9tIGN5Y2xvbSAyeCkKKyogMTk5OS8wMS8wMglhY21lCQljeXhfaXNyOiBmaXJzdCBoYWNraW5ncy4uLgorKiAxOTk5LzAxLzAyMDMgIGFjbWUgCQl3aGVuIGluaXRpYWxpemluZyBhbiBhcnJheSBkb24ndCBnaXZlIGxlc3MKKyoJCQkJZWxlbWVudHMgdGhhbiBkZWNsYXJlZC4uLgorKiAJCQkJZXhhbXBsZTogY2hhciBzZW5kX2NtZFs2XSA9ICI/XHhGRlx4MTAiOworKiAgICAgICAgICAJCQl5b3UnbGwgZ29ubmEgbG9zZSBhIGNvdXBsZSBob3VycywgJ2NhdXNlIHlvdXIKKyoJCQkJYnJhaW4gd29uJ3QgYWRtaXQgdGhhdCB0aGVyZSdzIGFuIGVycm9yIGluIHRoZQorKgkJCQlhYm92ZSBkZWNsYXJhdGlvbi4uLiAgdGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQKKyoJCQkJbWVtc2V0IGlzIHB1dCBpbnRvIHRoZSB1bnJlc29sdmVkIHN5bWJvbHMKKyoJCQkJaW5zdGVhZCBvZiB1c2luZyB0aGUgaW5saW5lIG1lbXNldCBmdW5jdGlvbnMuLi4KKyogMTk5OS8wMS8wMiAgICBhY21lIAkJYmVnYW4gY2hhbl9jb25uZWN0LCBjaGFuX3NlbmQsIHgyNV9zZW5kCisqIDE5OTgvMTIvMzEJYWNtZQkJeDI1X2NvbmZpZ3VyZQorKgkJCQl0aGlzIGNvZGUgY2FuIGJlIGNvbXBpbGVkIGFzIG5vbiBtb2R1bGUKKyogMTk5OC8xMi8yNwlhY21lCQljb2RlIGNsZWFudXAKKyoJCQkJSVBYIGNvZGUgd2lwZWQgb3V0ISBsZXQncyBkZWNyZWFzZSBjb2RlCisqCQkJCWNvbXBsZXhpdHkgZm9yIG5vdywgcmVtZW1iZXI6IEknbSBsZWFybmluZyEgOikKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBzX3RvX3NwZWVkX2NvZGUgT0sKKyogMTk5OC8xMi8yNglhY21lCQlNaW5pbWFsIGRlYnVnIGNvZGUgY2xlYW51cAorKiAxOTk4LzA4LzA4CWFjbWUJCUluaXRpYWwgdmVyc2lvbi4KKyovCisKKyNkZWZpbmUgQ1lDTE9NWF9YMjVfREVCVUcgMQorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogcmV0dXJuIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+ICAgICAgIC8qIEFSUEhSRF9IV1gyNSAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSwgYW5kIG90aGVyIHVzZWZ1bCBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBpbmxpbmUgbWVtc2V0KCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogb2Zmc2V0b2YoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3dhbnJvdXRlci5oPgkvKiBXQU4gcm91dGVyIGRlZmluaXRpb25zICovCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIGh0b25zKCksIGV0Yy4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2N5Y2xvbXguaD4JLyogQ3ljbG9tIDJYIGNvbW1vbiB1c2VyIEFQSSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L2N5Y3hfeDI1Lmg+CS8qIFguMjUgZmlybXdhcmUgQVBJIGRlZmluaXRpb25zICovCisKKyNpbmNsdWRlIDxuZXQveDI1ZGV2aWNlLmg+CisKKy8qIERlZmluZXMgJiBNYWNyb3MgKi8KKyNkZWZpbmUgQ1lDWF9YMjVfTUFYX0NNRF9SRVRSWSA1CisjZGVmaW5lIENZQ1hfWDI1X0NIQU5fTVRVIDIwNDgJLyogdW5mcmFnbWVudGVkIGxvZ2ljYWwgY2hhbm5lbCBNVFUgKi8KKworLyogRGF0YSBTdHJ1Y3R1cmVzICovCisvKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgJ3N0cnVjdCBuZXRfZGV2aWNlJyB3ZSBjcmVhdGUgZm9yIGVhY2ggbmV0d29yaworICAgaW50ZXJmYWNlIHRvIGtlZXAgdGhlIHJlc3Qgb2YgWC4yNSBjaGFubmVsLXNwZWNpZmljIGRhdGEuICovCitzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCB7CisJLyogVGhpcyBtZW1iZXIgbXVzdCBiZSBmaXJzdC4gKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmU7CS8qIFdBTiBzbGF2ZSAqLworCisJY2hhciBuYW1lW1dBTl9JRk5BTUVfU1orMV07CS8qIGludGVyZmFjZSBuYW1lLCBBU0NJSVogKi8KKwljaGFyIGFkZHJbV0FOX0FERFJFU1NfU1orMV07CS8qIG1lZGlhIGFkZHJlc3MsIEFTQ0lJWiAqLworCWNoYXIgKmxvY2FsX2FkZHI7CQkvKiBsb2NhbCBtZWRpYSBhZGRyZXNzLCBBU0NJSVogLQorCQkJCQkgICBzdmMgdGhydSBjcm9zc292ZXIgY2FibGUgKi8KKwlzMTYgbGNuOwkJCS8qIGxvZ2ljYWwgY2hhbm5lbCBudW1iZXIvY29ubi5yZXEua2V5Ki8KKwl1OCBsaW5rOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkvKiB0aW1lciB1c2VkIGZvciBzdmMgY2hhbm5lbCBkaXNjLiAqLworCXUxNiBwcm90b2NvbDsJCQkvKiBldGhlcnR5cGUsIDAgLSBtdWx0aXBsZXhlZCAqLworCXU4IHN2YzsJCQkJLyogMCAtIHBlcm1hbmVudCwgMSAtIHN3aXRjaGVkICovCisJdTggc3RhdGU7CQkJLyogY2hhbm5lbCBzdGF0ZSAqLworCXU4IGRyb3Bfc2VxdWVuY2U7CQkvKiBtYXJrIHNlcXVlbmNlIGZvciBkcm9wcGluZyAqLworCXUzMiBpZGxlX3Rtb3V0OwkJCS8qIHNlYywgYmVmb3JlIGRpc2Nvbm5lY3RpbmcgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOwkJLyogcmVjZWl2ZSBzb2NrZXQgYnVmZmVyICovCisJc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkOwkvKiAtPiBvd25lciAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIGlmc3RhdHM7LyogaW50ZXJmYWNlIHN0YXRpc3RpY3MgKi8KK307CisKKy8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgKi8KKy8qIFdBTiBsaW5rIGRyaXZlciBlbnRyeSBwb2ludHMuIFRoZXNlIGFyZSBjYWxsZWQgYnkgdGhlIFdBTiByb3V0ZXIgbW9kdWxlLiAqLworc3RhdGljIGludCBjeWN4X3dhbl91cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiksCisJICAgY3ljeF93YW5fbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICB3YW5pZl9jb25mX3QgKmNvbmYpLAorCSAgIGN5Y3hfd2FuX2RlbF9pZihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogTmV0d29yayBkZXZpY2UgaW50ZXJmYWNlICovCitzdGF0aWMgaW50IGN5Y3hfbmV0ZGV2aWNlX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiksCisJICAgY3ljeF9uZXRkZXZpY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSwKKwkgICBjeWN4X25ldGRldmljZV9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpLAorCSAgIGN5Y3hfbmV0ZGV2aWNlX2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgdHlwZSwKKwkJCQkgICAgIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKSwKKwkgICBjeWN4X25ldGRldmljZV9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSwKKwkgICBjeWN4X25ldGRldmljZV9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKKwkJCWN5Y3hfbmV0ZGV2aWNlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogSW50ZXJydXB0IGhhbmRsZXJzICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9pcnFfaGFuZGxlcihzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQpLAorCSAgICBjeWN4X3gyNV9pcnFfdHgoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLCBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpLAorCSAgICBjeWN4X3gyNV9pcnFfcngoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLCBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpLAorCSAgICBjeWN4X3gyNV9pcnFfbG9nKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCSAgICAgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKSwKKwkgICAgY3ljeF94MjVfaXJxX3N0YXQoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJICAgICAgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKSwKKwkgICAgY3ljeF94MjVfaXJxX2Nvbm5lY3RfY29uZmlybShzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkJCSBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpLAorCSAgICBjeWN4X3gyNV9pcnFfZGlzY29ubmVjdF9jb25maXJtKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCQkJICAgIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCksCisJICAgIGN5Y3hfeDI1X2lycV9jb25uZWN0KHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCQkgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKSwKKwkgICAgY3ljeF94MjVfaXJxX2Rpc2Nvbm5lY3Qoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJCSAgICBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpLAorCSAgICBjeWN4X3gyNV9pcnFfc3B1cmlvdXMoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJCSAgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKTsKKworLyogWC4yNSBmaXJtd2FyZSBpbnRlcmZhY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGN5Y3hfeDI1X2NvbmZpZ3VyZShzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkgICAgICBzdHJ1Y3QgY3ljeF94MjVfY29uZmlnICpjb25mKSwKKwkgICBjeWN4X3gyNV9nZXRfc3RhdHMoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkKSwKKwkgICBjeWN4X3gyNV9zZW5kKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwgdTggbGluaywgdTggbGNuLCB1OCBiaXRtLAorCQkJIGludCBsZW4sIHZvaWQgKmJ1ZiksCisJICAgY3ljeF94MjVfY29ubmVjdF9yZXNwb25zZShzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4pLAorCSAgIGN5Y3hfeDI1X2Rpc2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLCB1OCBsaW5rLAorCQkJICAgCQl1OCBsY24pOworCisvKiBjaGFubmVsIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBjeWN4X3gyNV9jaGFuX2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiksCisJICAgY3ljeF94MjVfY2hhbl9zZW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9jaGFuX2Rpc2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiksCisJICAgIGN5Y3hfeDI1X2NoYW5fc2VuZF9ldmVudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBldmVudCk7CisKKy8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9zZXRfY2hhbl9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBzdGF0ZSksCisJICAgIGN5Y3hfeDI1X2NoYW5fdGltZXIodW5zaWduZWQgbG9uZyBkKTsKKworc3RhdGljIHZvaWQgbmliYmxlX3RvX2J5dGUodTggKnMsIHU4ICpkLCB1OCBsZW4sIHU4IG5pYmJsZSksCisJICAgIHJlc2V0X3RpbWVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdTggYnBzX3RvX3NwZWVkX2NvZGUodTMyIGJwcyk7CitzdGF0aWMgdTggY3ljeF9sb2cyKHUzMiBuKTsKKworc3RhdGljIHVuc2lnbmVkIGRlY190b191aW50KHU4ICpzdHIsIGludCBsZW4pOworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmN5Y3hfeDI1X2dldF9kZXZfYnlfbGNuKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsCisJCQkJCQkgIHMxNiBsY24pOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICoKKwljeWN4X3gyNV9nZXRfZGV2X2J5X2R0ZV9hZGRyKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIGNoYXIgKmR0ZSk7CisKKyNpZmRlZiBDWUNMT01YX1gyNV9ERUJVRworc3RhdGljIHZvaWQgaGV4X2R1bXAoY2hhciAqbXNnLCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2R1bXBfY29uZmlnKHN0cnVjdCBjeWN4X3gyNV9jb25maWcgKmNvbmYpOworc3RhdGljIHZvaWQgY3ljeF94MjVfZHVtcF9zdGF0cyhzdHJ1Y3QgY3ljeF94MjVfc3RhdHMgKnN0YXRzKTsKK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2R1bXBfZGV2cyhzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2KTsKKyNlbHNlCisjZGVmaW5lIGhleF9kdW1wKG1zZywgcCwgbGVuKQorI2RlZmluZSBjeWN4X3gyNV9kdW1wX2NvbmZpZyhjb25mKQorI2RlZmluZSBjeWN4X3gyNV9kdW1wX3N0YXRzKHN0YXRzKQorI2RlZmluZSBjeWN4X3gyNV9kdW1wX2RldnMod2FuZGV2KQorI2VuZGlmCisvKiBQdWJsaWMgRnVuY3Rpb25zICovCisKKy8qIFguMjUgUHJvdG9jb2wgSW5pdGlhbGl6YXRpb24gcm91dGluZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBtYWluIEN5Y2xvbSAyWCBtb2R1bGUgZHVyaW5nIHNldHVwLiAgQXQgdGhpcworICogcG9pbnQgYWRhcHRlciBpcyBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGFuZCBYLjI1IGZpcm13YXJlIGlzIHJ1bm5pbmcuCisgKiAgbyBjb25maWd1cmUgYWRhcHRlcgorICogIG8gaW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgb2YgdGhlIGFkYXB0ZXIgZGF0YSBzcGFjZS4KKyAqCisgKiBSZXR1cm46CTAJby5rLgorICoJCTwgMAlmYWlsdXJlLiAgKi8KK2ludCBjeWN4X3gyNV93YW5faW5pdChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIHdhbmRldl9jb25mX3QgKmNvbmYpCit7CisJc3RydWN0IGN5Y3hfeDI1X2NvbmZpZyBjZmc7CisKKwkvKiBWZXJpZnkgY29uZmlndXJhdGlvbiBJRCAqLworCWlmIChjb25mLT5jb25maWdfaWQgIT0gV0FOQ09ORklHX1gyNSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCBjb25maWd1cmF0aW9uIElEICV1IVxuIiwKKwkJCQkgY2FyZC0+ZGV2bmFtZSwgY29uZi0+Y29uZmlnX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgKi8KKwljYXJkLT5tYm94ICA9IGNhcmQtPmh3LmRwbWJhc2UgKyBYMjVfTUJPWF9PRkZTOworCWNhcmQtPnUueC5jb25uZWN0aW9uX2tleXMgPSAwOworCXNwaW5fbG9ja19pbml0KCZjYXJkLT51LngubG9jayk7CisKKwkvKiBDb25maWd1cmUgYWRhcHRlci4gSGVyZSB3ZSBzZXQgcmVhc29uYWJsZSBkZWZhdWx0cywgdGhlbiBwYXJzZQorCSAqIGRldmljZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBhbmQgc2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKwkgKiBNb3N0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdmVyaWZpZWQgYW5kIGNvcnJlY3RlZCAoaWYKKwkgKiBuZWNlc3NhcnkpIHNpbmNlIHdlIGNhbid0IHJlbHkgb24gdGhlIGFkYXB0ZXIgdG8gZG8gc28gYW5kIGRvbid0CisJICogd2FudCBpdCB0byBmYWlsIGVpdGhlci4gKi8KKwltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOworCWNmZy5saW5rID0gMDsKKwljZmcuY2xvY2sgPSBjb25mLT5jbG9ja2luZyA9PSBXQU5PUFRfRVhURVJOQUwgPyA4IDogNTU7CisJY2ZnLnNwZWVkID0gYnBzX3RvX3NwZWVkX2NvZGUoY29uZi0+YnBzKTsKKwljZmcubjN3aW4gPSA3OworCWNmZy5uMndpbiA9IDI7CisJY2ZnLm4yID0gNTsKKwljZmcubnZjID0gMTsKKwljZmcubnB2YyA9IDE7CisJY2ZnLmZsYWdzID0gMHgwMjsgLyogZGVmYXVsdCA9IFYzNSAqLworCWNmZy50MSA9IDEwOyAgIC8qIGxpbmUgY2FycmllciB0aW1lb3V0ICovCisJY2ZnLnQyID0gMjk7ICAgLyogdHggdGltZW91dCAqLworCWNmZy50MjEgPSAxODA7IC8qIENBTEwgdGltZW91dCAqLworCWNmZy50MjMgPSAxODA7IC8qIENMRUFSIHRpbWVvdXQgKi8KKworCS8qIGFkanVzdCBNVFUgKi8KKwlpZiAoIWNvbmYtPm10dSB8fCBjb25mLT5tdHUgPj0gNTEyKQorCQljYXJkLT53YW5kZXYubXR1ID0gNTEyOworCWVsc2UgaWYgKGNvbmYtPm10dSA+PSAyNTYpCisJCWNhcmQtPndhbmRldi5tdHUgPSAyNTY7CisJZWxzZSBpZiAoY29uZi0+bXR1ID49IDEyOCkKKwkJY2FyZC0+d2FuZGV2Lm10dSA9IDEyODsKKwllbHNlCisJCWNhcmQtPndhbmRldi5tdHUgPSA2NDsKKworCWNmZy5wa3RsZW4gPSBjeWN4X2xvZzIoY2FyZC0+d2FuZGV2Lm10dSk7CisKKwlpZiAoY29uZi0+c3RhdGlvbiA9PSBXQU5PUFRfRFRFKSB7CisJCWNmZy5sb2NhZGRyID0gMzsgLyogRFRFICovCisJCWNmZy5yZW1hZGRyID0gMTsgLyogRENFICovCisJfSBlbHNlIHsKKwkJY2ZnLmxvY2FkZHIgPSAxOyAvKiBEQ0UgKi8KKwkJY2ZnLnJlbWFkZHIgPSAzOyAvKiBEVEUgKi8KKwl9CisKKwlpZiAoY29uZi0+aW50ZXJmYWNlID09IFdBTk9QVF9SUzIzMikKKwkgICAgICAgIGNmZy5mbGFncyA9IDA7ICAgICAgLyogRklYTUUganVzdCByZXNldCB0aGUgMm5kIGJpdCAqLworCisJaWYgKGNvbmYtPnUueDI1LmhpX3B2YykgeworCQljYXJkLT51LnguaGlfcHZjID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5oaV9wdmMsIDQwOTUpOworCQljYXJkLT51LngubG9fcHZjID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5sb19wdmMsIGNhcmQtPnUueC5oaV9wdmMpOworCX0KKworCWlmIChjb25mLT51LngyNS5oaV9zdmMpIHsKKwkJY2FyZC0+dS54LmhpX3N2YyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUuaGlfc3ZjLCA0MDk1KTsKKwkJY2FyZC0+dS54LmxvX3N2YyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUubG9fc3ZjLCBjYXJkLT51LnguaGlfc3ZjKTsKKwl9CisKKwlpZiAoY2FyZC0+dS54LmxvX3B2YyA9PSAyNTUpCisJCWNmZy5ucHZjID0gMDsKKwllbHNlCisJCWNmZy5ucHZjID0gY2FyZC0+dS54LmhpX3B2YyAtIGNhcmQtPnUueC5sb19wdmMgKyAxOworCisJY2ZnLm52YyA9IGNhcmQtPnUueC5oaV9zdmMgLSBjYXJkLT51LngubG9fc3ZjICsgMSArIGNmZy5ucHZjOworCisJaWYgKGNvbmYtPnUueDI1LmhkbGNfd2luZG93KQorCQljZmcubjJ3aW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LmhkbGNfd2luZG93LCA3KTsKKworCWlmIChjb25mLT51LngyNS5wa3Rfd2luZG93KQorCQljZmcubjN3aW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnBrdF93aW5kb3csIDcpOworCisJaWYgKGNvbmYtPnUueDI1LnQxKQorCQljZmcudDEgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnQxLCAzMCk7CisKKwlpZiAoY29uZi0+dS54MjUudDIpCisJCWNmZy50MiA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUudDIsIDMwKTsKKworCWlmIChjb25mLT51LngyNS50MTFfdDIxKQorCQljZmcudDIxID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS50MTFfdDIxLCAzMCk7CisKKwlpZiAoY29uZi0+dS54MjUudDEzX3QyMykKKwkJY2ZnLnQyMyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUudDEzX3QyMywgMzApOworCisJaWYgKGNvbmYtPnUueDI1Lm4yKQorCQljZmcubjIgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1Lm4yLCAzMCk7CisKKwkvKiBpbml0aWFsaXplIGFkYXB0ZXIgKi8KKwlpZiAoY3ljeF94MjVfY29uZmlndXJlKGNhcmQsICZjZmcpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIEluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIG9mIGFkYXB0ZXIgZGF0YSBzcGFjZSAqLworCWNhcmQtPndhbmRldi5icHMJPSBjb25mLT5icHM7CisJY2FyZC0+d2FuZGV2LmludGVyZmFjZQk9IGNvbmYtPmludGVyZmFjZTsKKwljYXJkLT53YW5kZXYuY2xvY2tpbmcJPSBjb25mLT5jbG9ja2luZzsKKwljYXJkLT53YW5kZXYuc3RhdGlvbgk9IGNvbmYtPnN0YXRpb247CisJY2FyZC0+aXNyCQk9IGN5Y3hfeDI1X2lycV9oYW5kbGVyOworCWNhcmQtPmV4ZWMJCT0gTlVMTDsKKwljYXJkLT53YW5kZXYudXBkYXRlCT0gY3ljeF93YW5fdXBkYXRlOworCWNhcmQtPndhbmRldi5uZXdfaWYJPSBjeWN4X3dhbl9uZXdfaWY7CisJY2FyZC0+d2FuZGV2LmRlbF9pZgk9IGN5Y3hfd2FuX2RlbF9pZjsKKwljYXJkLT53YW5kZXYuc3RhdGUJPSBXQU5fRElTQ09OTkVDVEVEOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFdBTiBEZXZpY2UgRHJpdmVyIEVudHJ5IFBvaW50cyAqLworLyogVXBkYXRlIGRldmljZSBzdGF0dXMgJiBzdGF0aXN0aWNzLiAqLworc3RhdGljIGludCBjeWN4X3dhbl91cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldikKK3sKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKCF3YW5kZXYgfHwgIXdhbmRldi0+cHJpdmF0ZSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAod2FuZGV2LT5zdGF0ZSA9PSBXQU5fVU5DT05GSUdVUkVEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWN5Y3hfeDI1X2dldF9zdGF0cyh3YW5kZXYtPnByaXZhdGUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBuZXcgbG9naWNhbCBjaGFubmVsLgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgcm91dGVyIHdoZW4gUk9VVEVSX0lGTkVXIElPQ1RMIGlzIGJlaW5nCisgKiBoYW5kbGVkLgorICogbyBwYXJzZSBtZWRpYS0gYW5kIGhhcmR3YXJlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAqIG8gbWFrZSBzdXJlIHRoYXQgYSBuZXcgY2hhbm5lbCBjYW4gYmUgY3JlYXRlZAorICogbyBhbGxvY2F0ZSByZXNvdXJjZXMsIGlmIG5lY2Vzc2FyeQorICogbyBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZSBmb3IgcmVnaXN0cmF0aW9uLgorICoKKyAqIFJldHVybjoJMAlvLmsuCisgKgkJPCAwCWZhaWx1cmUgKGNoYW5uZWwgd2lsbCBub3QgYmUgY3JlYXRlZCkgKi8KK3N0YXRpYyBpbnQgY3ljeF93YW5fbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICB3YW5pZl9jb25mX3QgKmNvbmYpCit7CisJc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkID0gd2FuZGV2LT5wcml2YXRlOworCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuOworCWludCBlcnIgPSAwOworCisJaWYgKCFjb25mLT5uYW1lWzBdIHx8IHN0cmxlbihjb25mLT5uYW1lKSA+IFdBTl9JRk5BTUVfU1opIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgaW50ZXJmYWNlIG5hbWUhXG4iLAorCQkgICAgICAgY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHByaXZhdGUgZGF0YSAqLworCWNoYW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCksIEdGUF9LRVJORUwpOworCWlmICghY2hhbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoY2hhbiwgMCwgc2l6ZW9mKCpjaGFuKSk7CisJc3RyY3B5KGNoYW4tPm5hbWUsIGNvbmYtPm5hbWUpOworCWNoYW4tPmNhcmQgPSBjYXJkOworCWNoYW4tPmxpbmsgPSBjb25mLT5wb3J0OworCWNoYW4tPnByb3RvY29sID0gY29uZi0+cHJvdG9jb2wgPyBFVEhfUF9YMjUgOiBFVEhfUF9JUDsKKwljaGFuLT5yeF9za2IgPSBOVUxMOworCS8qIG9ubHkgdXNlZCBpbiBzdmMgY29ubmVjdGVkIHRocnUgY3Jvc3NvdmVyIGNhYmxlICovCisJY2hhbi0+bG9jYWxfYWRkciA9IE5VTEw7CisKKwlpZiAoY29uZi0+YWRkclswXSA9PSAnQCcpIHsJLyogU1ZDICovCisJCWludCBsZW4gPSBzdHJsZW4oY29uZi0+bG9jYWxfYWRkcik7CisKKwkJaWYgKGxlbikgeworCQkJaWYgKGxlbiA+IFdBTl9BRERSRVNTX1NaKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgbG9jYWwgYWRkciB0b28gbG9uZyFcbiIsCisJCQkJCQl3YW5kZXYtPm5hbWUsIGNoYW4tPm5hbWUpOworCQkJCWtmcmVlKGNoYW4pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlIHsKKwkJCQljaGFuLT5sb2NhbF9hZGRyID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKworCQkJCWlmICghY2hhbi0+bG9jYWxfYWRkcikgeworCQkJCQlrZnJlZShjaGFuKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCQkJfQorCisJCQlzdHJuY3B5KGNoYW4tPmxvY2FsX2FkZHIsIGNvbmYtPmxvY2FsX2FkZHIsCisJCQkJV0FOX0FERFJFU1NfU1opOworCQl9CisKKwkJY2hhbi0+c3ZjID0gMTsKKwkJc3RybmNweShjaGFuLT5hZGRyLCAmY29uZi0+YWRkclsxXSwgV0FOX0FERFJFU1NfU1opOworCQlpbml0X3RpbWVyKCZjaGFuLT50aW1lcik7CisJCWNoYW4tPnRpbWVyLmZ1bmN0aW9uCT0gY3ljeF94MjVfY2hhbl90aW1lcjsKKwkJY2hhbi0+dGltZXIuZGF0YQk9ICh1bnNpZ25lZCBsb25nKWRldjsKKworCQkvKiBTZXQgY2hhbm5lbCB0aW1lb3V0cyAoZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkKSAqLworCQljaGFuLT5pZGxlX3Rtb3V0ID0gY29uZi0+aWRsZV90aW1lb3V0ID8gY29uZi0+aWRsZV90aW1lb3V0IDogOTA7CisJfSBlbHNlIGlmIChpc19kaWdpdChjb25mLT5hZGRyWzBdKSkgewkvKiBQVkMgKi8KKwkJczE2IGxjbiA9IGRlY190b191aW50KGNvbmYtPmFkZHIsIDApOworCisJCWlmIChsY24gPj0gY2FyZC0+dS54LmxvX3B2YyAmJiBsY24gPD0gY2FyZC0+dS54LmhpX3B2YykKKwkJCWNoYW4tPmxjbiA9IGxjbjsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiJXM6IFBWQyAldSBpcyBvdXQgb2YgcmFuZ2Ugb24gaW50ZXJmYWNlICVzIVxuIiwKKwkJCQl3YW5kZXYtPm5hbWUsIGxjbiwgY2hhbi0+bmFtZSk7CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBtZWRpYSBhZGRyZXNzIG9uIGludGVyZmFjZSAlcyFcbiIsCisJCQkJd2FuZGV2LT5uYW1lLCBjaGFuLT5uYW1lKTsKKwkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoZXJyKSB7CisJCWlmIChjaGFuLT5sb2NhbF9hZGRyKQorCQkJa2ZyZWUoY2hhbi0+bG9jYWxfYWRkcik7CisKKwkJa2ZyZWUoY2hhbik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogcHJlcGFyZSBuZXR3b3JrIGRldmljZSBkYXRhIHNwYWNlIGZvciByZWdpc3RyYXRpb24gKi8KKwlzdHJjcHkoZGV2LT5uYW1lLCBjaGFuLT5uYW1lKTsKKwlkZXYtPmluaXQgPSBjeWN4X25ldGRldmljZV9pbml0OworCWRldi0+cHJpdiA9IGNoYW47CisKKwlyZXR1cm4gMDsKK30KKworLyogRGVsZXRlIGxvZ2ljYWwgY2hhbm5lbC4gKi8KK3N0YXRpYyBpbnQgY3ljeF93YW5fZGVsX2lmKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+cHJpdikgeworCQlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKworCQlpZiAoY2hhbi0+c3ZjKSB7CisJCQlpZiAoY2hhbi0+bG9jYWxfYWRkcikKKwkJCQlrZnJlZShjaGFuLT5sb2NhbF9hZGRyKTsKKworCQkJaWYgKGNoYW4tPnN0YXRlID09IFdBTl9DT05ORUNURUQpCisJCQkJZGVsX3RpbWVyKCZjaGFuLT50aW1lcik7CisJCX0KKworCQlrZnJlZShjaGFuKTsKKwkJZGV2LT5wcml2ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogTmV0d29yayBEZXZpY2UgSW50ZXJmYWNlICovCisvKiBJbml0aWFsaXplIExpbnV4IG5ldHdvcmsgaW50ZXJmYWNlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgb25seSBvbmNlIGZvciBlYWNoIGludGVyZmFjZSwgZHVyaW5nIExpbnV4IG5ldHdvcmsKKyAqIGludGVyZmFjZSByZWdpc3RyYXRpb24uICBSZXR1cm5pbmcgYW55dGhpbmcgYnV0IHplcm8gd2lsbCBmYWlsIGludGVyZmFjZQorICogcmVnaXN0cmF0aW9uLiAqLworc3RhdGljIGludCBjeWN4X25ldGRldmljZV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4gPSBkZXYtPnByaXY7CisJc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkID0gY2hhbi0+Y2FyZDsKKwlzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKworCS8qIEluaXRpYWxpemUgZGV2aWNlIGRyaXZlciBlbnRyeSBwb2ludHMgKi8KKwlkZXYtPm9wZW4JCT0gY3ljeF9uZXRkZXZpY2Vfb3BlbjsKKwlkZXYtPnN0b3AJCT0gY3ljeF9uZXRkZXZpY2Vfc3RvcDsKKwlkZXYtPmhhcmRfaGVhZGVyCT0gY3ljeF9uZXRkZXZpY2VfaGFyZF9oZWFkZXI7CisJZGV2LT5yZWJ1aWxkX2hlYWRlcgk9IGN5Y3hfbmV0ZGV2aWNlX3JlYnVpbGRfaGVhZGVyOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gY3ljeF9uZXRkZXZpY2VfaGFyZF9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzCQk9IGN5Y3hfbmV0ZGV2aWNlX2dldF9zdGF0czsKKworCS8qIEluaXRpYWxpemUgbWVkaWEtc3BlY2lmaWMgcGFyYW1ldGVycyAqLworCWRldi0+bXR1CQk9IENZQ1hfWDI1X0NIQU5fTVRVOworCWRldi0+dHlwZQkJPSBBUlBIUkRfSFdYMjU7CS8qIEFSUCBoL3cgdHlwZSAqLworCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gMDsJCS8qIG1lZGlhIGhlYWRlciBsZW5ndGggKi8KKwlkZXYtPmFkZHJfbGVuCQk9IDA7CQkvKiBoYXJkd2FyZSBhZGRyZXNzIGxlbmd0aCAqLworCisJaWYgKCFjaGFuLT5zdmMpCisJCSoodTE2KilkZXYtPmRldl9hZGRyID0gaHRvbnMoY2hhbi0+bGNuKTsKKworCS8qIEluaXRpYWxpemUgaGFyZHdhcmUgcGFyYW1ldGVycyAoanVzdCBmb3IgcmVmZXJlbmNlKSAqLworCWRldi0+aXJxCQk9IHdhbmRldi0+aXJxOworCWRldi0+ZG1hCQk9IHdhbmRldi0+ZG1hOworCWRldi0+YmFzZV9hZGRyCQk9IHdhbmRldi0+aW9wb3J0OworCWRldi0+bWVtX3N0YXJ0CQk9ICh1bnNpZ25lZCBsb25nKXdhbmRldi0+bWFkZHI7CisJZGV2LT5tZW1fZW5kCQk9ICh1bnNpZ25lZCBsb25nKSh3YW5kZXYtPm1hZGRyICsKKwkJCQkJCSAgd2FuZGV2LT5tc2l6ZSAtIDEpOworCWRldi0+ZmxhZ3MJCXw9IElGRl9OT0FSUDsKKworCS8qIFNldCB0cmFuc21pdCBidWZmZXIgcXVldWUgbGVuZ3RoICovCisJZGV2LT50eF9xdWV1ZV9sZW4JPSAxMDsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBJbml0aWFsaXplIHNvY2tldCBidWZmZXJzICovCisJY3ljeF94MjVfc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fRElTQ09OTkVDVEVEKTsKKworCXJldHVybiAwOworfQorCisvKiBPcGVuIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBwcmV2ZW50IG1vZHVsZSBmcm9tIHVubG9hZGluZyBieSBpbmNyZW1lbnRpbmcgdXNlIGNvdW50CisgKiBvIGlmIGxpbmsgaXMgZGlzY29ubmVjdGVkIHRoZW4gaW5pdGlhdGUgY29ubmVjdGlvbgorICoKKyAqIFJldHVybiAwIGlmIE8uay4gb3IgZXJybm8uICAqLworc3RhdGljIGludCBjeWN4X25ldGRldmljZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsgLyogb25seSBvbmUgb3BlbiBpcyBhbGxvd2VkICovCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisvKiBDbG9zZSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIG8gcmVzZXQgZmxhZ3MuCisgKiBvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBvcGVuIGNoYW5uZWxzIHRoZW4gZGlzY29ubmVjdCBwaHlzaWNhbCBsaW5rLiAqLworc3RhdGljIGludCBjeWN4X25ldGRldmljZV9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4gPSBkZXYtPnByaXY7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoY2hhbi0+c3RhdGUgPT0gV0FOX0NPTk5FQ1RFRCB8fCBjaGFuLT5zdGF0ZSA9PSBXQU5fQ09OTkVDVElORykKKwkJY3ljeF94MjVfY2hhbl9kaXNjb25uZWN0KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyogQnVpbGQgbWVkaWEgaGVhZGVyLgorICogbyBlbmNhcHN1bGF0ZSBwYWNrZXQgYWNjb3JkaW5nIHRvIGVuY2Fwc3VsYXRpb24gdHlwZS4KKyAqCisgKiBUaGUgdHJpY2sgaGVyZSBpcyB0byBwdXQgcGFja2V0IHR5cGUgKEV0aGVydHlwZSkgaW50byAncHJvdG9jb2wnIGZpZWxkIG9mCisgKiB0aGUgc29ja2V0IGJ1ZmZlciwgc28gdGhhdCB3ZSBkb24ndCBmb3JnZXQgaXQuICBJZiBlbmNhcHN1bGF0aW9uIGZhaWxzLAorICogc2V0IHNrYi0+cHJvdG9jb2wgdG8gMCBhbmQgZGlzY2FyZCBwYWNrZXQgbGF0ZXIuCisgKgorICogUmV0dXJuOgltZWRpYSBoZWFkZXIgbGVuZ3RoLiAqLworc3RhdGljIGludCBjeWN4X25ldGRldmljZV9oYXJkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiB0eXBlLAorCQkJCSAgICAgIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKQoreworCXNrYi0+cHJvdG9jb2wgPSB0eXBlOworCisJcmV0dXJuIGRldi0+aGFyZF9oZWFkZXJfbGVuOworfQorCisvKiAqIFJlLWJ1aWxkIG1lZGlhIGhlYWRlci4KKyAqIFJldHVybjoJMQlwaHlzaWNhbCBhZGRyZXNzIHJlc29sdmVkLgorICoJCTAJcGh5c2ljYWwgYWRkcmVzcyBub3QgcmVzb2x2ZWQgKi8KK3N0YXRpYyBpbnQgY3ljeF9uZXRkZXZpY2VfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gMTsKK30KKworLyogU2VuZCBhIHBhY2tldCBvbiBhIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBzZXQgYnVzeSBmbGFnIChtYXJrcyBzdGFydCBvZiB0aGUgdHJhbnNtaXNzaW9uKS4KKyAqIG8gY2hlY2sgbGluayBzdGF0ZS4gSWYgbGluayBpcyBub3QgdXAsIHRoZW4gZHJvcCB0aGUgcGFja2V0LgorICogbyBjaGVjayBjaGFubmVsIHN0YXR1cy4gSWYgaXQncyBkb3duIHRoZW4gaW5pdGlhdGUgYSBjYWxsLgorICogbyBwYXNzIGEgcGFja2V0IHRvIGNvcnJlc3BvbmRpbmcgV0FOIGRldmljZS4KKyAqIG8gZnJlZSBzb2NrZXQgYnVmZmVyCisgKgorICogUmV0dXJuOgkwCWNvbXBsZXRlIChzb2NrZXQgYnVmZmVyIG11c3QgYmUgZnJlZWQpCisgKgkJbm9uLTAJcGFja2V0IG1heSBiZSByZS10cmFuc21pdHRlZCAodGJ1c3kgbXVzdCBiZSBzZXQpCisgKgorICogTm90ZXM6CisgKiAxLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGVpdGhlciBieSB0aGUgcHJvdG9jb2wgc3RhY2sgb3IgYnkgdGhlICJuZXQKKyAqICAgIGJvdHRvbSBoYWxmIiAod2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQpLgorICogMi4gU2V0dGluZyB0YnVzeSBmbGFnIHdpbGwgaW5oaWJpdCBmdXJ0aGVyIHRyYW5zbWl0IHJlcXVlc3RzIGZyb20gdGhlCisgKiAgICBwcm90b2NvbCBzdGFjayBhbmQgY2FuIGJlIHVzZWQgZm9yIGZsb3cgY29udHJvbCB3aXRoIHByb3RvY29sIGxheWVyLiAqLworc3RhdGljIGludCBjeWN4X25ldGRldmljZV9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuID0gZGV2LT5wcml2OworCXN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCA9IGNoYW4tPmNhcmQ7CisKKwlpZiAoIWNoYW4tPnN2YykKKwkJY2hhbi0+cHJvdG9jb2wgPSBza2ItPnByb3RvY29sOworCisJaWYgKGNhcmQtPndhbmRldi5zdGF0ZSAhPSBXQU5fQ09OTkVDVEVEKQorCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKwllbHNlIGlmIChjaGFuLT5zdmMgJiYgY2hhbi0+cHJvdG9jb2wgJiYKKwkJIGNoYW4tPnByb3RvY29sICE9IHNrYi0+cHJvdG9jb2wpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB1bnN1cHBvcnRlZCBFdGhlcnR5cGUgMHglMDRYIG9uIGludGVyZmFjZSAlcyFcbiIsCisJCSAgICAgICBjYXJkLT5kZXZuYW1lLCBza2ItPnByb3RvY29sLCBkZXYtPm5hbWUpOworCQkrK2NoYW4tPmlmc3RhdHMudHhfZXJyb3JzOworCX0gZWxzZSBpZiAoY2hhbi0+cHJvdG9jb2wgPT0gRVRIX1BfSVApIHsKKwkJc3dpdGNoIChjaGFuLT5zdGF0ZSkgeworCQljYXNlIFdBTl9ESVNDT05ORUNURUQ6CisJCQlpZiAoY3ljeF94MjVfY2hhbl9jb25uZWN0KGRldikpIHsKKwkJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJCS8qIGZhbGwgdGhydSAqLworCQljYXNlIFdBTl9DT05ORUNURUQ6CisJCQlyZXNldF90aW1lcihkZXYpOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJCWlmIChjeWN4X3gyNV9jaGFuX3NlbmQoZGV2LCBza2IpKQorCQkJCXJldHVybiAtRUJVU1k7CisKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCX0KKwl9IGVsc2UgeyAvKiBjaGFuLT5wcm90b2NvbCA9PSBFVEhfUF9YMjUgKi8KKwkJc3dpdGNoIChza2ItPmRhdGFbMF0pIHsKKwkJY2FzZSAwOiBicmVhazsKKwkJY2FzZSAxOiAvKiBDb25uZWN0IHJlcXVlc3QgKi8KKwkJCWN5Y3hfeDI1X2NoYW5fY29ubmVjdChkZXYpOworCQkJZ290byBmcmVlX3BhY2tldDsKKwkJY2FzZSAyOiAvKiBEaXNjb25uZWN0IHJlcXVlc3QgKi8KKwkJCWN5Y3hfeDI1X2NoYW5fZGlzY29ubmVjdChkZXYpOworCQkJZ290byBmcmVlX3BhY2tldDsKKwkgICAgICAgIGRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIiVzOiB1bmtub3duICVkIHgyNS1pZmFjZSByZXF1ZXN0IG9uICVzIVxuIiwKKwkJCSAgICAgICBjYXJkLT5kZXZuYW1lLCBza2ItPmRhdGFbMF0sIGRldi0+bmFtZSk7CisJCQkrK2NoYW4tPmlmc3RhdHMudHhfZXJyb3JzOworCQkJZ290byBmcmVlX3BhY2tldDsKKwkJfQorCisJCXNrYl9wdWxsKHNrYiwgMSk7IC8qIFJlbW92ZSBjb250cm9sIGJ5dGUgKi8KKwkJcmVzZXRfdGltZXIoZGV2KTsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQlpZiAoY3ljeF94MjVfY2hhbl9zZW5kKGRldiwgc2tiKSkgeworCQkJLyogcHJlcGFyZSBmb3IgZnV0dXJlIHJldHJhbnNtaXNzaW9ucyAqLworCQkJc2tiX3B1c2goc2tiLCAxKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKK2ZyZWVfcGFja2V0OgorCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisvKiBHZXQgRXRoZXJuZXQtc3R5bGUgaW50ZXJmYWNlIHN0YXRpc3RpY3MuCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmN5Y3hfbmV0ZGV2aWNlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuID0gZGV2LT5wcml2OworCisJcmV0dXJuIGNoYW4gPyAmY2hhbi0+aWZzdGF0cyA6IE5VTEw7Cit9CisKKy8qIEludGVycnVwdCBIYW5kbGVycyAqLworLyogWC4yNSBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lLiAqLworc3RhdGljIHZvaWQgY3ljeF94MjVfaXJxX2hhbmRsZXIoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkKQoreworCXN0cnVjdCBjeWN4X3gyNV9jbWQgY21kOworCXUxNiB6ID0gMDsKKworCWNhcmQtPmluX2lzciA9IDE7CisJY2FyZC0+YnVmZl9pbnRfbW9kZV91bmJ1c3kgPSAwOworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIFgyNV9SWE1CT1hfT0ZGUywgJmNtZCwgc2l6ZW9mKGNtZCkpOworCisJc3dpdGNoIChjbWQuY29tbWFuZCkgeworCWNhc2UgWDI1X0RBVEFfSU5ESUNBVElPTjoKKwkJY3ljeF94MjVfaXJxX3J4KGNhcmQsICZjbWQpOworCQlicmVhazsKKwljYXNlIFgyNV9BQ0tfRlJPTV9WQzoKKwkJY3ljeF94MjVfaXJxX3R4KGNhcmQsICZjbWQpOworCQlicmVhazsKKwljYXNlIFgyNV9MT0c6CisJCWN5Y3hfeDI1X2lycV9sb2coY2FyZCwgJmNtZCk7CisJCWJyZWFrOworCWNhc2UgWDI1X1NUQVRJU1RJQzoKKwkJY3ljeF94MjVfaXJxX3N0YXQoY2FyZCwgJmNtZCk7CisJCWJyZWFrOworCWNhc2UgWDI1X0NPTk5FQ1RfQ09ORklSTToKKwkJY3ljeF94MjVfaXJxX2Nvbm5lY3RfY29uZmlybShjYXJkLCAmY21kKTsKKwkJYnJlYWs7CisJY2FzZSBYMjVfQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQljeWN4X3gyNV9pcnFfY29ubmVjdChjYXJkLCAmY21kKTsKKwkJYnJlYWs7CisJY2FzZSBYMjVfRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQljeWN4X3gyNV9pcnFfZGlzY29ubmVjdChjYXJkLCAmY21kKTsKKwkJYnJlYWs7CisJY2FzZSBYMjVfRElTQ09OTkVDVF9DT05GSVJNOgorCQljeWN4X3gyNV9pcnFfZGlzY29ubmVjdF9jb25maXJtKGNhcmQsICZjbWQpOworCQlicmVhazsKKwljYXNlIFgyNV9MSU5FX09OOgorCQljeWN4X3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVEVEKTsKKwkJYnJlYWs7CisJY2FzZSBYMjVfTElORV9PRkY6CisJCWN5Y3hfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljeWN4X3gyNV9pcnFfc3B1cmlvdXMoY2FyZCwgJmNtZCk7CisJCWJyZWFrOworCX0KKworCWN5Y3hfcG9rZSgmY2FyZC0+aHcsIDAsICZ6LCBzaXplb2YoeikpOworCWN5Y3hfcG9rZSgmY2FyZC0+aHcsIFgyNV9SWE1CT1hfT0ZGUywgJnosIHNpemVvZih6KSk7CisJY2FyZC0+aW5faXNyID0gMDsKK30KKworLyogVHJhbnNtaXQgaW50ZXJydXB0IGhhbmRsZXIuCisgKglvIFJlbGVhc2Ugc29ja2V0IGJ1ZmZlcgorICoJbyBDbGVhciAndGJ1c3knIGZsYWcgKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV90eChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCXU4IGxjbjsKKworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmLCAmbGNuLCBzaXplb2YobGNuKSk7CisKKwkvKiB1bmJ1c3kgZGV2aWNlIGFuZCB0aGVuIGRldl90aW50KCk7ICovCisJZGV2ID0gY3ljeF94MjVfZ2V0X2Rldl9ieV9sY24od2FuZGV2LCBsY24pOworCWlmIChkZXYpIHsKKwkJY2FyZC0+YnVmZl9pbnRfbW9kZV91bmJ1c3kgPSAxOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiAiJXM6YWNrdmMgZm9yIGluZXhpc3RlbnQgbGNuICVkXG4iLAorCQkJCSBjYXJkLT5kZXZuYW1lLCBsY24pOworfQorCisvKiBSZWNlaXZlIGludGVycnVwdCBoYW5kbGVyLgorICogVGhpcyByb3V0aW5lIGhhbmRsZXMgZnJhZ21lbnRlZCBJUCBwYWNrZXRzIHVzaW5nIE0tYml0IGFjY29yZGluZyB0byB0aGUKKyAqIFJGQzEzNTYuCisgKiBvIG1hcCBsb2dpY2FsIGNoYW5uZWwgbnVtYmVyIHRvIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBhbGxvY2F0ZSBzb2NrZXQgYnVmZmVyIG9yIGFwcGVuZCByZWNlaXZlZCBwYWNrZXQgdG8gdGhlIGV4aXN0aW5nIG9uZS4KKyAqIG8gaWYgTS1iaXQgaXMgcmVzZXQgKGkuZS4gaXQncyB0aGUgbGFzdCBwYWNrZXQgaW4gYSBzZXF1ZW5jZSkgdGhlbgorICogICBkZWNhcHN1bGF0ZSBwYWNrZXQgYW5kIHBhc3Mgc29ja2V0IGJ1ZmZlciB0byB0aGUgcHJvdG9jb2wgc3RhY2suCisgKgorICogTm90ZXM6CisgKiAxLiBXaGVuIGFsbG9jYXRpbmcgYSBzb2NrZXQgYnVmZmVyLCBpZiBNLWJpdCBpcyBzZXQgdGhlbiBtb3JlIGRhdGEgaXMKKyAqICAgIGNvbWluZyBhbmQgd2UgaGF2ZSB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBtYXhpbXVtIElQIHBhY2tldCBzaXplCisgKiAgICBleHBlY3RlZCBvbiB0aGlzIGNoYW5uZWwuCisgKiAyLiBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZyBhbmQgWC4yNSBwYWNrZXQgaGFzIHRvIGJlIGRyb3BwZWQgKGUuZy4gbm8KKyAqICAgIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSkgdGhlIHdob2xlIHBhY2tldCBzZXF1ZW5jZSBtdXN0IGJlIGRpc2NhcmRlZC4gKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV9yeChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggYml0bSwgbGNuOworCWludCBwa3RsZW4gPSBjbWQtPmxlbiAtIDU7CisKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiwgJmxjbiwgc2l6ZW9mKGxjbikpOworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmICsgNCwgJmJpdG0sIHNpemVvZihiaXRtKSk7CisJYml0bSAmPSAweDEwOworCisJZGV2ID0gY3ljeF94MjVfZ2V0X2Rldl9ieV9sY24od2FuZGV2LCBsY24pOworCWlmICghZGV2KSB7CisJCS8qIEludmFsaWQgY2hhbm5lbCwgZGlzY2FyZCBwYWNrZXQgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlY2VpdmluZyBvbiBvcnBoYW5lZCBMQ04gJWQhXG4iLAorCQkJCSBjYXJkLT5kZXZuYW1lLCBsY24pOworCQlyZXR1cm47CisJfQorCisJY2hhbiA9IGRldi0+cHJpdjsKKwlyZXNldF90aW1lcihkZXYpOworCisJaWYgKGNoYW4tPmRyb3Bfc2VxdWVuY2UpIHsKKwkJaWYgKCFiaXRtKQorCQkJY2hhbi0+ZHJvcF9zZXF1ZW5jZSA9IDA7CisJCWVsc2UKKwkJCXJldHVybjsKKwl9CisKKwlpZiAoKHNrYiA9IGNoYW4tPnJ4X3NrYikgPT0gTlVMTCkgeworCQkvKiBBbGxvY2F0ZSBuZXcgc29ja2V0IGJ1ZmZlciAqLworCQlpbnQgYnVmc2l6ZSA9IGJpdG0gPyBkZXYtPm10dSA6IHBrdGxlbjsKKworCQlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoKGNoYW4tPnByb3RvY29sID09IEVUSF9QX1gyNSA/IDEgOiAwKSArCisJCQkJCSBidWZzaXplICsKKwkJCQkJIGRldi0+aGFyZF9oZWFkZXJfbGVuKSkgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSFcbiIsCisJCQkJCSBjYXJkLT5kZXZuYW1lKTsKKwkJCWNoYW4tPmRyb3Bfc2VxdWVuY2UgPSAxOworCQkJKytjaGFuLT5pZnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoY2hhbi0+cHJvdG9jb2wgPT0gRVRIX1BfWDI1KSAvKiBYLjI1IHNvY2tldCBsYXllciBjb250cm9sICovCisJCQkvKiAwID0gZGF0YSBwYWNrZXQgKGRldl9hbGxvY19za2IgemVyb2VkIHNrYi0+ZGF0YSkgKi8KKwkJCXNrYl9wdXQoc2tiLCAxKTsKKworCQlza2ItPmRldiA9IGRldjsKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKGNoYW4tPnByb3RvY29sKTsKKwkJY2hhbi0+cnhfc2tiID0gc2tiOworCX0KKworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IHBrdGxlbikgeworCQkvKiBObyByb29tIGZvciB0aGUgcGFja2V0LiBDYWxsIG9mZiB0aGUgd2hvbGUgdGhpbmchICovCisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCWNoYW4tPnJ4X3NrYiA9IE5VTEw7CisKKwkJaWYgKGJpdG0pCisJCQljaGFuLT5kcm9wX3NlcXVlbmNlID0gMTsKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogdW5leHBlY3RlZGx5IGxvbmcgcGFja2V0IHNlcXVlbmNlICIKKwkJCSJvbiBpbnRlcmZhY2UgJXMhXG4iLCBjYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUpOworCQkrK2NoYW4tPmlmc3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJcmV0dXJuOworCX0KKworCS8qIEFwcGVuZCBwYWNrZXQgdG8gdGhlIHNvY2tldCBidWZmZXIgICovCisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYgKyA1LCBza2JfcHV0KHNrYiwgcGt0bGVuKSwgcGt0bGVuKTsKKworCWlmIChiaXRtKQorCQlyZXR1cm47IC8qIG1vcmUgZGF0YSBpcyBjb21pbmcgKi8KKworCWNoYW4tPnJ4X3NrYiA9IE5VTEw7CQkvKiBkZXF1ZXVlIHBhY2tldCAqLworCisJKytjaGFuLT5pZnN0YXRzLnJ4X3BhY2tldHM7CisJY2hhbi0+aWZzdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47CisKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwkJLyogdGltZXN0YW1wICovCit9CisKKy8qIENvbm5lY3QgaW50ZXJydXB0IGhhbmRsZXIuICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9pcnFfY29ubmVjdChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkJIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbjsKKwl1OCBkWzMyXSwKKwkgICBsb2NbMjRdLAorCSAgIHJlbVsyNF07CisJdTggbGNuLCBzaXplbG9jLCBzaXplcmVtOworCisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYsICZsY24sIHNpemVvZihsY24pKTsKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiArIDUsICZzaXplbG9jLCBzaXplb2Yoc2l6ZWxvYykpOworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmICsgNiwgZCwgY21kLT5sZW4gLSA2KTsKKworCXNpemVyZW0gPSBzaXplbG9jID4+IDQ7CisJc2l6ZWxvYyAmPSAweDBGOworCisJbG9jWzBdID0gcmVtWzBdID0gJ1wwJzsKKworCWlmIChzaXplbG9jKQorCQluaWJibGVfdG9fYnl0ZShkLCBsb2MsIHNpemVsb2MsIDApOworCisJaWYgKHNpemVyZW0pCisJCW5pYmJsZV90b19ieXRlKGQgKyAoc2l6ZWxvYyA+PiAxKSwgcmVtLCBzaXplcmVtLCBzaXplbG9jICYgMSk7CisKKwlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6bGNuPSVkLCBsb2NhbD0lcywgcmVtb3RlPSVzXG4iLAorCQkJICBfX0ZVTkNUSU9OX18sIGxjbiwgbG9jLCByZW0pOworCisJZGV2ID0gY3ljeF94MjVfZ2V0X2Rldl9ieV9kdGVfYWRkcih3YW5kZXYsIHJlbSk7CisJaWYgKCFkZXYpIHsKKwkJLyogSW52YWxpZCBjaGFubmVsLCBkaXNjYXJkIHBhY2tldCAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogY29ubmVjdCBub3QgZXhwZWN0ZWQ6IHJlbW90ZSAlcyFcbiIsCisJCQkJIGNhcmQtPmRldm5hbWUsIHJlbSk7CisJCXJldHVybjsKKwl9CisKKwljaGFuID0gZGV2LT5wcml2OworCWNoYW4tPmxjbiA9IGxjbjsKKwljeWN4X3gyNV9jb25uZWN0X3Jlc3BvbnNlKGNhcmQsIGNoYW4pOworCWN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RFRCk7Cit9CisKKy8qIENvbm5lY3QgY29uZmlybSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV9jb25uZWN0X2NvbmZpcm0oc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJCQkgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKQoreworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW47CisJdTggbGNuLCBrZXk7CisKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiwgJmxjbiwgc2l6ZW9mKGxjbikpOworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmICsgMSwgJmtleSwgc2l6ZW9mKGtleSkpOworCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogJXM6bGNuPSVkLCBrZXk9JWRcbiIsCisJCQkgIGNhcmQtPmRldm5hbWUsIF9fRlVOQ1RJT05fXywgbGNuLCBrZXkpOworCisJZGV2ID0gY3ljeF94MjVfZ2V0X2Rldl9ieV9sY24od2FuZGV2LCAta2V5KTsKKwlpZiAoIWRldikgeworCQkvKiBJbnZhbGlkIGNoYW5uZWwsIGRpc2NhcmQgcGFja2V0ICovCisJCWNsZWFyX2JpdCgtLWtleSwgKHZvaWQqKSZjYXJkLT51LnguY29ubmVjdGlvbl9rZXlzKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbm5lY3QgY29uZmlybSBub3QgZXhwZWN0ZWQ6IGxjbiAlZCwgIgorCQkJCSAia2V5PSVkIVxuIiwgY2FyZC0+ZGV2bmFtZSwgbGNuLCBrZXkpOworCQlyZXR1cm47CisJfQorCisJY2xlYXJfYml0KC0ta2V5LCAodm9pZCopJmNhcmQtPnUueC5jb25uZWN0aW9uX2tleXMpOworCWNoYW4gPSBkZXYtPnByaXY7CisJY2hhbi0+bGNuID0gbGNuOworCWN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RFRCk7Cit9CisKKy8qIERpc2Nvbm5lY3QgY29uZmlybSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV9kaXNjb25uZWN0X2NvbmZpcm0oc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJCQkgICAgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKQoreworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdTggbGNuOworCisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYsICZsY24sIHNpemVvZihsY24pKTsKKwlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6ICVzOmxjbj0lZFxuIiwKKwkJCSAgY2FyZC0+ZGV2bmFtZSwgX19GVU5DVElPTl9fLCBsY24pOworCWRldiA9IGN5Y3hfeDI1X2dldF9kZXZfYnlfbGNuKHdhbmRldiwgbGNuKTsKKwlpZiAoIWRldikgeworCQkvKiBJbnZhbGlkIGNoYW5uZWwsIGRpc2NhcmQgcGFja2V0ICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOmRpc2Nvbm5lY3QgY29uZmlybSBub3QgZXhwZWN0ZWQhOmxjbiAlZFxuIiwKKwkJCQkgY2FyZC0+ZGV2bmFtZSwgbGNuKTsKKwkJcmV0dXJuOworCX0KKworCWN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7Cit9CisKKy8qIGRpc2Nvbm5lY3QgaW50ZXJydXB0IGhhbmRsZXIuICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9pcnFfZGlzY29ubmVjdChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkJICAgIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXU4IGxjbjsKKworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmLCAmbGNuLCBzaXplb2YobGNuKSk7CisJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOmxjbj0lZFxuIiwgX19GVU5DVElPTl9fLCBsY24pOworCisJZGV2ID0gY3ljeF94MjVfZ2V0X2Rldl9ieV9sY24od2FuZGV2LCBsY24pOworCWlmIChkZXYpIHsKKwkJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4gPSBkZXYtPnByaXY7CisKKwkJY3ljeF94MjVfZGlzY29ubmVjdF9yZXNwb25zZShjYXJkLCBjaGFuLT5saW5rLCBsY24pOworCQljeWN4X3gyNV9zZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworCX0gZWxzZQorCQljeWN4X3gyNV9kaXNjb25uZWN0X3Jlc3BvbnNlKGNhcmQsIDAsIGxjbik7Cit9CisKKy8qIExPRyBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV9sb2coc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLCBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpCit7CisjaWYgQ1lDTE9NWF9YMjVfREVCVUcKKwljaGFyIGJmWzIwXTsKKwl1MTYgc2l6ZSwgdG9yZWFkLCBsaW5rLCBtc2dfY29kZTsKKwl1OCBjb2RlLCByb3V0aW5lOworCisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYsICZtc2dfY29kZSwgc2l6ZW9mKG1zZ19jb2RlKSk7CisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYgKyAyLCAmbGluaywgc2l6ZW9mKGxpbmspKTsKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiArIDQsICZzaXplLCBzaXplb2Yoc2l6ZSkpOworCS8qIGF0IG1vc3QgMjAgYnl0ZXMgYXJlIGF2YWlsYWJsZS4uLiB0aGFua3MgdG8gRGFuaWVsYSA6KSAqLworCXRvcmVhZCA9IHNpemUgPCAyMCA/IHNpemUgOiAyMDsKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiArIDEwLCAmYmYsIHRvcmVhZCk7CisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYgKyAxMCArIHRvcmVhZCwgJmNvZGUsIDEpOworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmICsgMTAgKyB0b3JlYWQgKyAxLCAmcm91dGluZSwgMSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJjeWN4X3gyNV9pcnFfaGFuZGxlcjogWDI1X0xPRyAoMHg0NTAwKSBpbmRpYy46XG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJjbWQtPmJ1Zj0weCVYXG4iLCBjbWQtPmJ1Zik7CisJcHJpbnRrKEtFUk5fSU5GTyAiTG9nIG1lc3NhZ2UgY29kZT0weCVYXG4iLCBtc2dfY29kZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiTGluaz0lZFxuIiwgbGluayk7CisJcHJpbnRrKEtFUk5fSU5GTyAibG9nIGNvZGU9MHglWFxuIiwgY29kZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAibG9nIHJvdXRpbmU9MHglWFxuIiwgcm91dGluZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiTWVzc2FnZSBzaXplPSVkXG4iLCBzaXplKTsKKwloZXhfZHVtcCgiTWVzc2FnZSIsIGJmLCB0b3JlYWQpOworI2VuZGlmCit9CisKKy8qIFNUQVRJU1RJQyBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV9zdGF0KHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCSAgICAgIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCkKK3sKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiwgJmNhcmQtPnUueC5zdGF0cywKKwkJICBzaXplb2YoY2FyZC0+dS54LnN0YXRzKSk7CisJaGV4X2R1bXAoImN5Y3hfeDI1X2lycV9zdGF0IiwgKHVuc2lnbmVkIGNoYXIqKSZjYXJkLT51Lnguc3RhdHMsCisJCSBzaXplb2YoY2FyZC0+dS54LnN0YXRzKSk7CisJY3ljeF94MjVfZHVtcF9zdGF0cygmY2FyZC0+dS54LnN0YXRzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNhcmQtPndhaXRfc3RhdHMpOworfQorCisvKiBTcHVyaW91cyBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqIG8gcHJpbnQgYSB3YXJuaW5nCisgKiBJZiBudW1iZXIgb2Ygc3B1cmlvdXMgaW50ZXJydXB0cyBleGNlZWRlZCBzb21lIGxpbWl0LCB0aGVuID8/PyAqLworc3RhdGljIHZvaWQgY3ljeF94MjVfaXJxX3NwdXJpb3VzKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCQkgIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogc3B1cmlvdXMgaW50ZXJydXB0ICgweCVYKSFcbiIsCisJCQkgY2FyZC0+ZGV2bmFtZSwgY21kLT5jb21tYW5kKTsKK30KKyNpZmRlZiBDWUNMT01YX1gyNV9ERUJVRworc3RhdGljIHZvaWQgaGV4X2R1bXAoY2hhciAqbXNnLCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgaGV4WzEwMjRdLAorCSAgICAJKiBwaGV4ID0gaGV4OworCisJaWYgKGxlbiA+PSAoc2l6ZW9mKGhleCkgLyAyKSkKKwkJbGVuID0gKHNpemVvZihoZXgpIC8gMikgLSAxOworCisJd2hpbGUgKGxlbi0tKSB7CisJCXNwcmludGYocGhleCwgIiUwMngiLCAqcCsrKTsKKwkJcGhleCArPSAyOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlc1xuIiwgbXNnLCBoZXgpOworfQorI2VuZGlmCisKKy8qIEN5Y2xvbSAyWCBGaXJtd2FyZS1TcGVjaWZpYyBGdW5jdGlvbnMgKi8KKy8qIEV4ZWMgWC4yNSBjb21tYW5kLiAqLworc3RhdGljIGludCB4MjVfZXhlYyhzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIGludCBjb21tYW5kLCBpbnQgbGluaywKKwkJICAgIHZvaWQgKmQxLCBpbnQgbGVuMSwgdm9pZCAqZDIsIGludCBsZW4yKQoreworCXN0cnVjdCBjeWN4X3gyNV9jbWQgYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBhZGRyID0gMHgxMjAwICsgMHgyRTAgKiBsaW5rICsgMHgxRTI7CisJdTggcmV0cnkgPSBDWUNYX1gyNV9NQVhfQ01EX1JFVFJZOworCWludCBlcnIgPSAwOworCisJYy5jb21tYW5kID0gY29tbWFuZDsKKwljLmxpbmsgPSBsaW5rOworCWMubGVuID0gbGVuMSArIGxlbjI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dS54LmxvY2ssIGZsYWdzKTsKKworCS8qIHdyaXRlIGNvbW1hbmQgKi8KKwljeWN4X3Bva2UoJmNhcmQtPmh3LCBYMjVfTUJPWF9PRkZTLCAmYywgc2l6ZW9mKGMpIC0gc2l6ZW9mKGMuYnVmKSk7CisKKwkvKiB3cml0ZSBYLjI1IGRhdGEgKi8KKwlpZiAoZDEpIHsKKwkJY3ljeF9wb2tlKCZjYXJkLT5odywgYWRkciwgZDEsIGxlbjEpOworCisJCWlmIChkMikgeworCQkJaWYgKGxlbjIgPiAyNTQpIHsKKwkJCQl1MzIgYWRkcjEgPSAweEEwMCArIDB4NDAwICogbGluazsKKworCQkJCWN5Y3hfcG9rZSgmY2FyZC0+aHcsIGFkZHIgKyBsZW4xLCBkMiwgMjQ5KTsKKwkJCQljeWN4X3Bva2UoJmNhcmQtPmh3LCBhZGRyMSwgKCh1OCopZDIpICsgMjQ5LAorCQkJCQkgIGxlbjIgLSAyNDkpOworCQkJfSBlbHNlCisJCQkJY3ljeF9wb2tlKCZjYXJkLT5odywgYWRkciArIGxlbjEsIGQyLCBsZW4yKTsKKwkJfQorCX0KKworCS8qIGdlbmVyYXRlIGludGVycnVwdGlvbiwgZXhlY3V0aW5nIGNvbW1hbmQgKi8KKwljeWN4X2ludHIoJmNhcmQtPmh3KTsKKworCS8qIHdhaXQgdGlsbCBjYXJkLT5tYm94ID09IDAgKi8KKwlkbyB7CisJCWVyciA9IGN5Y3hfZXhlYyhjYXJkLT5tYm94KTsKKwl9IHdoaWxlIChyZXRyeS0tICYmIGVycik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT51LngubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworLyogQ29uZmlndXJlIGFkYXB0ZXIuICovCitzdGF0aWMgaW50IGN5Y3hfeDI1X2NvbmZpZ3VyZShzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkgICAgICBzdHJ1Y3QgY3ljeF94MjVfY29uZmlnICpjb25mKQoreworCXN0cnVjdCB7CisJCXUxNiBubGlua3M7CisJCXN0cnVjdCBjeWN4X3gyNV9jb25maWcgY29uZlsyXTsKKwl9IHgyNV9jbWRfY29uZjsKKworCW1lbXNldCgmeDI1X2NtZF9jb25mLCAwLCBzaXplb2YoeDI1X2NtZF9jb25mKSk7CisJeDI1X2NtZF9jb25mLm5saW5rcyA9IDI7CisJeDI1X2NtZF9jb25mLmNvbmZbMF0gPSAqY29uZjsKKwkvKiBGSVhNRTogd2UgbmVlZCB0byBmaW5kIGEgd2F5IGluIHRoZSB3YW5yb3V0ZXIgZnJhbWV3b3JrCisJCSAgdG8gY29uZmlndXJlIHRoZSBzZWNvbmQgbGluaywgZm9yIG5vdyBsZXRzIHVzZSBpdAorCQkgIHdpdGggdGhlIHNhbWUgY29uZmlnIGZyb20gdGhlIGZpcnN0IGxpbmssIGZpeGluZworCQkgIHRoZSBpbnRlcmZhY2UgdHlwZSB0byBSUzIzMiwgdGhlIHNwZWVkIGluIDM4NDAwIGFuZAorCQkgIHRoZSBjbG9jayB0byBleHRlcm5hbCAqLworCXgyNV9jbWRfY29uZi5jb25mWzFdID0gKmNvbmY7CisJeDI1X2NtZF9jb25mLmNvbmZbMV0ubGluayA9IDE7CisJeDI1X2NtZF9jb25mLmNvbmZbMV0uc3BlZWQgPSA1OyAvKiAzODQwMCAqLworCXgyNV9jbWRfY29uZi5jb25mWzFdLmNsb2NrID0gODsKKwl4MjVfY21kX2NvbmYuY29uZlsxXS5mbGFncyA9IDA7IC8qIGRlZmF1bHQgPSBSUzIzMiAqLworCisJY3ljeF94MjVfZHVtcF9jb25maWcoJngyNV9jbWRfY29uZi5jb25mWzBdKTsKKwljeWN4X3gyNV9kdW1wX2NvbmZpZygmeDI1X2NtZF9jb25mLmNvbmZbMV0pOworCisJcmV0dXJuIHgyNV9leGVjKGNhcmQsIFgyNV9DT05GSUcsIDAsCisJCQkmeDI1X2NtZF9jb25mLCBzaXplb2YoeDI1X2NtZF9jb25mKSwgTlVMTCwgMCk7Cit9CisKKy8qIEdldCBwcm90b2NvbCBzdGF0aXN0aWNzLiAqLworc3RhdGljIGludCBjeWN4X3gyNV9nZXRfc3RhdHMoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkKQoreworCS8qIHRoZSBmaXJtd2FyZSBleHBlY3RzIDIwIGluIHRoZSBzaXplIGZpZWxkISEhCisJICAgdGhhbmtzIHRvIERhbmllbGEgKi8KKwlpbnQgZXJyID0geDI1X2V4ZWMoY2FyZCwgWDI1X1NUQVRJU1RJQywgMCwgTlVMTCwgMjAsIE5VTEwsIDApOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWludGVycnVwdGlibGVfc2xlZXBfb24oJmNhcmQtPndhaXRfc3RhdHMpOworCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVJTlRSOworCisJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X3BhY2tldHMgPSBjYXJkLT51Lnguc3RhdHMubjJfcnhfZnJhbWVzOworCWNhcmQtPndhbmRldi5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IGNhcmQtPnUueC5zdGF0cy5yeF9vdmVyX2Vycm9yczsKKwljYXJkLT53YW5kZXYuc3RhdHMucnhfY3JjX2Vycm9ycyA9IGNhcmQtPnUueC5zdGF0cy5yeF9jcmNfZXJyb3JzOworCWNhcmQtPndhbmRldi5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gMDsgLyogbm90IGF2YWlsYWJsZSBmcm9tIGZ3ICovCisJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IDA7IC8qIG5vdCBhdmFpbGFibGUgZnJvbSBmdyAqLworCWNhcmQtPndhbmRldi5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gY2FyZC0+dS54LnN0YXRzLnJ4X2Fib3J0czsKKwljYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZCA9IDA7IC8qIG5vdCBhdmFpbGFibGUgZnJvbSBmdyAqLworCWNhcmQtPndhbmRldi5zdGF0cy5yeF9lcnJvcnMgPSAwOyAvKiBub3QgYXZhaWxhYmxlIGZyb20gZncgKi8KKwljYXJkLT53YW5kZXYuc3RhdHMudHhfcGFja2V0cyA9IGNhcmQtPnUueC5zdGF0cy5uMl90eF9mcmFtZXM7CisJY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gY2FyZC0+dS54LnN0YXRzLnR4X2Fib3J0czsKKwljYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZCA9IDA7IC8qIG5vdCBhdmFpbGFibGUgZnJvbSBmdyAqLworCWNhcmQtPndhbmRldi5zdGF0cy5jb2xsaXNpb25zID0gMDsgLyogbm90IGF2YWlsYWJsZSBmcm9tIGZ3ICovCisJY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Vycm9ycyA9IDA7IC8qIG5vdCBhdmFpbGFibGUgZnJvbSBmdyAqLworCisJY3ljeF94MjVfZHVtcF9kZXZzKCZjYXJkLT53YW5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybiB0aGUgbnVtYmVyIG9mIG5pYmJsZXMgKi8KK3N0YXRpYyBpbnQgYnl0ZV90b19uaWJibGUodTggKnMsIHU4ICpkLCBjaGFyICpuaWJibGUpCit7CisJaW50IGkgPSAwOworCisJaWYgKCpuaWJibGUgJiYgKnMpIHsKKwkJZFtpXSB8PSAqcysrIC0gJzAnOworCQkqbmliYmxlID0gMDsKKwkJKytpOworCX0KKworCXdoaWxlICgqcykgeworCQlkW2ldID0gKCpzIC0gJzAnKSA8PCA0OworCQlpZiAoKihzICsgMSkpCisJCQlkW2ldIHw9ICoocyArIDEpIC0gJzAnOworCQllbHNlIHsKKwkJCSpuaWJibGUgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJKytpOworCQlzICs9IDI7CisJfQorCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIG5pYmJsZV90b19ieXRlKHU4ICpzLCB1OCAqZCwgdTggbGVuLCB1OCBuaWJibGUpCit7CisJaWYgKG5pYmJsZSkgeworCQkqZCsrID0gJzAnICsgKCpzKysgJiAweDBGKTsKKwkJLS1sZW47CisJfQorCisJd2hpbGUgKGxlbikgeworCQkqZCsrID0gJzAnICsgKCpzID4+IDQpOworCisJCWlmICgtLWxlbikgeworCQkJKmQrKyA9ICcwJyArICgqcyAmIDB4MEYpOworCQkJLS1sZW47CisJCX0gZWxzZSBicmVhazsKKworCQkrK3M7CisJfQorCisJKmQgPSAnXDAnOworfQorCisvKiBQbGFjZSBYLjI1IGNhbGwuICovCitzdGF0aWMgaW50IHgyNV9wbGFjZV9jYWxsKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCSAgc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4pCit7CisJaW50IGVyciA9IDAsCisJICAgIGxlbjsKKwljaGFyIGRbNjRdLAorCSAgICAgbmliYmxlID0gMCwKKwkgICAgIG15bGVuID0gY2hhbi0+bG9jYWxfYWRkciA/IHN0cmxlbihjaGFuLT5sb2NhbF9hZGRyKSA6IDAsCisJICAgICByZW1vdGVsZW4gPSBzdHJsZW4oY2hhbi0+YWRkcik7CisJdTgga2V5OworCisJaWYgKGNhcmQtPnUueC5jb25uZWN0aW9uX2tleXMgPT0gfjBVKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB0b28gbWFueSBzaW11bHRhbmVvdXMgY29ubmVjdGlvbiAiCisJCQkJICJyZXF1ZXN0cyFcbiIsIGNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlrZXkgPSBmZnooY2FyZC0+dS54LmNvbm5lY3Rpb25fa2V5cyk7CisJc2V0X2JpdChrZXksICh2b2lkKikmY2FyZC0+dS54LmNvbm5lY3Rpb25fa2V5cyk7CisJKytrZXk7CisJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOngyNV9wbGFjZV9jYWxsOmtleT0lZFxuIiwgY2FyZC0+ZGV2bmFtZSwga2V5KTsKKwltZW1zZXQoZCwgMCwgc2l6ZW9mKGQpKTsKKwlkWzFdID0ga2V5OyAvKiB1c2VyIGtleSAqLworCWRbMl0gPSAweDEwOworCWRbNF0gPSAweDBCOworCisJbGVuID0gYnl0ZV90b19uaWJibGUoY2hhbi0+YWRkciwgZCArIDYsICZuaWJibGUpOworCisJaWYgKGNoYW4tPmxvY2FsX2FkZHIpCisJCWxlbiArPSBieXRlX3RvX25pYmJsZShjaGFuLT5sb2NhbF9hZGRyLCBkICsgNiArIGxlbiwgJm5pYmJsZSk7CisKKwlpZiAobmliYmxlKQorCQkrK2xlbjsKKworCWRbNV0gPSBteWxlbiA8PCA0IHwgcmVtb3RlbGVuOworCWRbNiArIGxlbiArIDFdID0gMHhDQzsgLyogVENQL0lQIG92ZXIgWC4yNSwgdGhhbmtzIHRvIERhbmllbGEgOikgKi8KKworCWlmICgoZXJyID0geDI1X2V4ZWMoY2FyZCwgWDI1X0NPTk5FQ1RfUkVRVUVTVCwgY2hhbi0+bGluaywKKwkJCSAgICAmZCwgNyArIGxlbiArIDEsIE5VTEwsIDApKSAhPSAwKQorCQljbGVhcl9iaXQoLS1rZXksICh2b2lkKikmY2FyZC0+dS54LmNvbm5lY3Rpb25fa2V5cyk7CisJZWxzZQorCQljaGFuLT5sY24gPSAta2V5OworCisJcmV0dXJuIGVycjsKK30KKworLyogUGxhY2UgWC4yNSBDT05ORUNUIFJFU1BPTlNFLiAqLworc3RhdGljIGludCBjeWN4X3gyNV9jb25uZWN0X3Jlc3BvbnNlKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCQkgICAgIHN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuKQoreworCXU4IGRbOF07CisKKwltZW1zZXQoZCwgMCwgc2l6ZW9mKGQpKTsKKwlkWzBdID0gZFszXSA9IGNoYW4tPmxjbjsKKwlkWzJdID0gMHgxMDsKKwlkWzRdID0gMHgwRjsKKwlkWzddID0gMHhDQzsgLyogVENQL0lQIG92ZXIgWC4yNSwgdGhhbmtzIERhbmllbGEgKi8KKworCXJldHVybiB4MjVfZXhlYyhjYXJkLCBYMjVfQ09OTkVDVF9SRVNQT05TRSwgY2hhbi0+bGluaywgJmQsIDgsIE5VTEwsIDApOworfQorCisvKiBQbGFjZSBYLjI1IERJU0NPTk5FQ1QgUkVTUE9OU0UuICAqLworc3RhdGljIGludCBjeWN4X3gyNV9kaXNjb25uZWN0X3Jlc3BvbnNlKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwgdTggbGluaywKKwkJCQkJdTggbGNuKQoreworCWNoYXIgZFs1XTsKKworCW1lbXNldChkLCAwLCBzaXplb2YoZCkpOworCWRbMF0gPSBkWzNdID0gbGNuOworCWRbMl0gPSAweDEwOworCWRbNF0gPSAweDE3OworCisJcmV0dXJuIHgyNV9leGVjKGNhcmQsIFgyNV9ESVNDT05ORUNUX1JFU1BPTlNFLCBsaW5rLCAmZCwgNSwgTlVMTCwgMCk7Cit9CisKKy8qIENsZWFyIFguMjUgY2FsbC4gICovCitzdGF0aWMgaW50IHgyNV9jbGVhcl9jYWxsKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwgdTggbGluaywgdTggbGNuLCB1OCBjYXVzZSwKKwkJCSAgdTggZGlhZ24pCit7CisJdTggZFs3XTsKKworCW1lbXNldChkLCAwLCBzaXplb2YoZCkpOworCWRbMF0gPSBkWzNdID0gbGNuOworCWRbMl0gPSAweDEwOworCWRbNF0gPSAweDEzOworCWRbNV0gPSBjYXVzZTsKKwlkWzZdID0gZGlhZ247CisKKwlyZXR1cm4geDI1X2V4ZWMoY2FyZCwgWDI1X0RJU0NPTk5FQ1RfUkVRVUVTVCwgbGluaywgZCwgNywgTlVMTCwgMCk7Cit9CisKKy8qIFNlbmQgWC4yNSBkYXRhIHBhY2tldC4gKi8KK3N0YXRpYyBpbnQgY3ljeF94MjVfc2VuZChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIHU4IGxpbmssIHU4IGxjbiwgdTggYml0bSwKKwkJCSBpbnQgbGVuLCB2b2lkICpidWYpCit7CisJdTggZFtdID0gIj9ceEZGXHgxMD8/IjsKKworCWRbMF0gPSBkWzNdID0gbGNuOworCWRbNF0gPSBiaXRtOworCisJcmV0dXJuIHgyNV9leGVjKGNhcmQsIFgyNV9EQVRBX1JFUVVFU1QsIGxpbmssICZkLCA1LCBidWYsIGxlbik7Cit9CisKKy8qIE1pc2NlbGxhbmVvdXMgKi8KKy8qIEZpbmQgbmV0d29yayBkZXZpY2UgYnkgaXRzIGNoYW5uZWwgbnVtYmVyLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqY3ljeF94MjVfZ2V0X2Rldl9ieV9sY24oc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwKKwkJCQkJCSAgczE2IGxjbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2FuZGV2LT5kZXY7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW47CisKKwl3aGlsZSAoZGV2KSB7CisJCWNoYW4gPSAoc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwqKWRldi0+cHJpdjsKKworCQlpZiAoY2hhbi0+bGNuID09IGxjbikKKwkJCWJyZWFrOworCQlkZXYgPSBjaGFuLT5zbGF2ZTsKKwl9CisJcmV0dXJuIGRldjsKK30KKworLyogRmluZCBuZXR3b3JrIGRldmljZSBieSBpdHMgcmVtb3RlIGR0ZSBhZGRyZXNzLiAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICoKKwljeWN4X3gyNV9nZXRfZGV2X2J5X2R0ZV9hZGRyKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIGNoYXIgKmR0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2FuZGV2LT5kZXY7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW47CisKKwl3aGlsZSAoZGV2KSB7CisJCWNoYW4gPSAoc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwqKWRldi0+cHJpdjsKKworCQlpZiAoIXN0cmNtcChjaGFuLT5hZGRyLCBkdGUpKQorCQkJYnJlYWs7CisJCWRldiA9IGNoYW4tPnNsYXZlOworCX0KKwlyZXR1cm4gZGV2OworfQorCisvKiBJbml0aWF0ZSBjb25uZWN0aW9uIG9uIHRoZSBsb2dpY2FsIGNoYW5uZWwuCisgKiBvIGZvciBQVkMgd2UganVzdCBnZXQgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgKiBvIGZvciBTVkNzIHBsYWNlIGFuIFguMjUgY2FsbAorICoKKyAqIFJldHVybjoJMAljb25uZWN0ZWQKKyAqCQk+MAljb25uZWN0aW9uIGluIHByb2dyZXNzCisgKgkJPDAJZmFpbHVyZSAqLworc3RhdGljIGludCBjeWN4X3gyNV9jaGFuX2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQgPSBjaGFuLT5jYXJkOworCisJaWYgKGNoYW4tPnN2YykgeworCQlpZiAoIWNoYW4tPmFkZHJbMF0pCisJCQlyZXR1cm4gLUVJTlZBTDsgLyogbm8gZGVzdGluYXRpb24gYWRkcmVzcyAqLworCisJCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogcGxhY2luZyBYLjI1IGNhbGwgdG8gJXMuLi5cbiIsCisJCQkJICBjYXJkLT5kZXZuYW1lLCBjaGFuLT5hZGRyKTsKKworCQlpZiAoeDI1X3BsYWNlX2NhbGwoY2FyZCwgY2hhbikpCisJCQlyZXR1cm4gLUVJTzsKKworCQljeWN4X3gyNV9zZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9DT05ORUNUSU5HKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlCisJCWN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RFRCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRGlzY29ubmVjdCBsb2dpY2FsIGNoYW5uZWwuCisgKiBvIGlmIFNWQyB0aGVuIGNsZWFyIFguMjUgY2FsbCAqLworc3RhdGljIHZvaWQgY3ljeF94MjVfY2hhbl9kaXNjb25uZWN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4gPSBkZXYtPnByaXY7CisKKwlpZiAoY2hhbi0+c3ZjKSB7CisJCXgyNV9jbGVhcl9jYWxsKGNoYW4tPmNhcmQsIGNoYW4tPmxpbmssIGNoYW4tPmxjbiwgMCwgMCk7CisJCWN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RJTkcpOworCX0gZWxzZQorCQljeWN4X3gyNV9zZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworfQorCisvKiBDYWxsZWQgYnkga2VybmVsIHRpbWVyICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9jaGFuX3RpbWVyKHVuc2lnbmVkIGxvbmcgZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZDsKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKworCWlmIChjaGFuLT5zdGF0ZSA9PSBXQU5fQ09OTkVDVEVEKQorCQljeWN4X3gyNV9jaGFuX2Rpc2Nvbm5lY3QoZGV2KTsKKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIGZvciBzdmMgKCVzKSBub3QgY29ubmVjdGVkIVxuIiwKKwkJCQljaGFuLT5jYXJkLT5kZXZuYW1lLCBfX0ZVTkNUSU9OX18sIGRldi0+bmFtZSk7Cit9CisKKy8qIFNldCBsb2dpY2FsIGNoYW5uZWwgc3RhdGUuICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9zZXRfY2hhbl9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQgPSBjaGFuLT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciAqc3RyaW5nX3N0YXRlID0gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoY2hhbi0+c3RhdGUgIT0gc3RhdGUpIHsKKwkJaWYgKGNoYW4tPnN2YyAmJiBjaGFuLT5zdGF0ZSA9PSBXQU5fQ09OTkVDVEVEKQorCQkJZGVsX3RpbWVyKCZjaGFuLT50aW1lcik7CisKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFdBTl9DT05ORUNURUQ6CisJCQlzdHJpbmdfc3RhdGUgPSAiY29ubmVjdGVkISI7CisJCQkqKHUxNiopZGV2LT5kZXZfYWRkciA9IGh0b25zKGNoYW4tPmxjbik7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQlyZXNldF90aW1lcihkZXYpOworCisJCQlpZiAoY2hhbi0+cHJvdG9jb2wgPT0gRVRIX1BfWDI1KQorCQkJCWN5Y3hfeDI1X2NoYW5fc2VuZF9ldmVudChkZXYsIDEpOworCisJCQlicmVhazsKKwkJY2FzZSBXQU5fQ09OTkVDVElORzoKKwkJCXN0cmluZ19zdGF0ZSA9ICJjb25uZWN0aW5nLi4uIjsKKwkJCWJyZWFrOworCQljYXNlIFdBTl9ESVNDT05ORUNUSU5HOgorCQkJc3RyaW5nX3N0YXRlID0gImRpc2Nvbm5lY3RpbmcuLi4iOworCQkJYnJlYWs7CisJCWNhc2UgV0FOX0RJU0NPTk5FQ1RFRDoKKwkJCXN0cmluZ19zdGF0ZSA9ICJkaXNjb25uZWN0ZWQhIjsKKworCQkJaWYgKGNoYW4tPnN2YykgeworCQkJCSoodW5zaWduZWQgc2hvcnQqKWRldi0+ZGV2X2FkZHIgPSAwOworCQkJCWNoYW4tPmxjbiA9IDA7CisJCQl9CisKKwkJCWlmIChjaGFuLT5wcm90b2NvbCA9PSBFVEhfUF9YMjUpCisJCQkJY3ljeF94MjVfY2hhbl9zZW5kX2V2ZW50KGRldiwgMik7CisKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludGVyZmFjZSAlcyAlc1xuIiwgY2FyZC0+ZGV2bmFtZSwKKwkJCQkgIGRldi0+bmFtZSwgc3RyaW5nX3N0YXRlKTsKKwkJY2hhbi0+c3RhdGUgPSBzdGF0ZTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIFNlbmQgcGFja2V0IG9uIGEgbG9naWNhbCBjaGFubmVsLgorICoJV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdHhfc2tiIGZpZWxkIG9mIHRoZSBjaGFubmVsIGRhdGEgc3BhY2UKKyAqCXBvaW50cyB0byB0aGUgdHJhbnNtaXQgc29ja2V0IGJ1ZmZlci4gIFdoZW4gdHJhbnNtaXNzaW9uIGlzIGNvbXBsZXRlLAorICoJcmVsZWFzZSBzb2NrZXQgYnVmZmVyIGFuZCByZXNldCAndGJ1c3knIGZsYWcuCisgKgorICogUmV0dXJuOgkwCS0gdHJhbnNtaXNzaW9uIGNvbXBsZXRlCisgKgkJMQktIGJ1c3kKKyAqCisgKiBOb3RlczoKKyAqIDEuIElmIHBhY2tldCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIE1UVSBmb3IgdGhpcyBjaGFubmVsLCB3ZSdsbCBmcmFnbWVudAorICogICAgdGhlIHBhY2tldCBpbnRvICdjb21wbGV0ZSBzZXF1ZW5jZScgdXNpbmcgTS1iaXQuCisgKiAyLiBXaGVuIHRyYW5zbWlzc2lvbiBpcyBjb21wbGV0ZSwgYW4gZXZlbnQgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBpc3N1ZWQKKyAqICAgIHRvIHRoZSByb3V0ZXIuICAqLworc3RhdGljIGludCBjeWN4X3gyNV9jaGFuX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQgPSBjaGFuLT5jYXJkOworCWludCBiaXRtID0gMDsJCS8qIGZpbmFsIHBhY2tldCAqLworCXVuc2lnbmVkIGxlbiA9IHNrYi0+bGVuOworCisJaWYgKHNrYi0+bGVuID4gY2FyZC0+d2FuZGV2Lm10dSkgeworCQlsZW4gPSBjYXJkLT53YW5kZXYubXR1OworCQliaXRtID0gMHgxMDsJCS8qIHNldCBNLWJpdCAobW9yZSBkYXRhKSAqLworCX0KKworCWlmIChjeWN4X3gyNV9zZW5kKGNhcmQsIGNoYW4tPmxpbmssIGNoYW4tPmxjbiwgYml0bSwgbGVuLCBza2ItPmRhdGEpKQorCQlyZXR1cm4gMTsKKworCWlmIChiaXRtKSB7CisJCXNrYl9wdWxsKHNrYiwgbGVuKTsKKwkJcmV0dXJuIDE7CisJfQorCisJKytjaGFuLT5pZnN0YXRzLnR4X3BhY2tldHM7CisJY2hhbi0+aWZzdGF0cy50eF9ieXRlcyArPSBsZW47CisKKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBldmVudCAoY29ubmVjdGlvbiwgZGlzY29ubmVjdGlvbiwgZXRjKSB0byBYLjI1IHNvY2tldCBsYXllciAqLworCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9jaGFuX3NlbmRfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggZXZlbnQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKKwlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoMSkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCXB0ciAgPSBza2JfcHV0KHNrYiwgMSk7CisJKnB0ciA9IGV2ZW50OworCisJc2tiLT5wcm90b2NvbCA9IHgyNV90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CQkvKiB0aW1lc3RhbXAgKi8KK30KKworLyogQ29udmVydCBsaW5lIHNwZWVkIGluIGJwcyB0byBhIG51bWJlciB1c2VkIGJ5IGN5Y2xvbSAyeCBjb2RlLiAqLworc3RhdGljIHU4IGJwc190b19zcGVlZF9jb2RlKHUzMiBicHMpCit7CisJdTggbnVtYmVyID0gMDsgLyogZGVmYXVsdHMgdG8gdGhlIGxvd2VzdCAoMTIwMCkgc3BlZWQgOz4gKi8KKworCSAgICAgaWYgKGJwcyA+PSA1MTIwMDApIG51bWJlciA9IDg7CisJZWxzZSBpZiAoYnBzID49IDI1NjAwMCkgbnVtYmVyID0gNzsKKwllbHNlIGlmIChicHMgPj0gNjQwMDApICBudW1iZXIgPSA2OworCWVsc2UgaWYgKGJwcyA+PSAzODQwMCkgIG51bWJlciA9IDU7CisJZWxzZSBpZiAoYnBzID49IDE5MjAwKSAgbnVtYmVyID0gNDsKKwllbHNlIGlmIChicHMgPj0gOTYwMCkgICBudW1iZXIgPSAzOworCWVsc2UgaWYgKGJwcyA+PSA0ODAwKSAgIG51bWJlciA9IDI7CisJZWxzZSBpZiAoYnBzID49IDI0MDApICAgbnVtYmVyID0gMTsKKworCXJldHVybiBudW1iZXI7Cit9CisKKy8qIGxvZyBiYXNlIDIgKi8KK3N0YXRpYyB1OCBjeWN4X2xvZzIodTMyIG4pCit7CisJdTggbG9nID0gMDsKKworCWlmICghbikKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAobiA+IDEpIHsKKwkJbiA+Pj0gMTsKKwkJKytsb2c7CisJfQorCisJcmV0dXJuIGxvZzsKK30KKworLyogQ29udmVydCBkZWNpbWFsIHN0cmluZyB0byB1bnNpZ25lZCBpbnRlZ2VyLgorICogSWYgbGVuICE9IDAgdGhlbiBvbmx5ICdsZW4nIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZyBhcmUgY29udmVydGVkLiAqLworc3RhdGljIHVuc2lnbmVkIGRlY190b191aW50KHU4ICpzdHIsIGludCBsZW4pCit7CisJdW5zaWduZWQgdmFsID0gMDsKKworCWlmICghbGVuKQorCQlsZW4gPSBzdHJsZW4oc3RyKTsKKworCWZvciAoOyBsZW4gJiYgaXNfZGlnaXQoKnN0cik7ICsrc3RyLCAtLWxlbikKKwkJdmFsID0gKHZhbCAqIDEwKSArICgqc3RyIC0gKHVuc2lnbmVkKSAnMCcpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfdGltZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKworCWlmIChjaGFuLT5zdmMpCisJCW1vZF90aW1lcigmY2hhbi0+dGltZXIsIGppZmZpZXMrY2hhbi0+aWRsZV90bW91dCpIWik7Cit9CisjaWZkZWYgQ1lDTE9NWF9YMjVfREVCVUcKK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2R1bXBfY29uZmlnKHN0cnVjdCBjeWN4X3gyNV9jb25maWcgKmNvbmYpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiWC4yNSBjb25maWd1cmF0aW9uXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICItLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAibGluayBudW1iZXI9JWRcbiIsIGNvbmYtPmxpbmspOworCXByaW50ayhLRVJOX0lORk8gImxpbmUgc3BlZWQ9JWRcbiIsIGNvbmYtPnNwZWVkKTsKKwlwcmludGsoS0VSTl9JTkZPICJjbG9jaz0lc3Rlcm5hbFxuIiwgY29uZi0+Y2xvY2sgPT0gOCA/ICJFeCIgOiAiSW4iKTsKKwlwcmludGsoS0VSTl9JTkZPICIjIGxldmVsIDIgcmV0cmFuc20uPSVkXG4iLCBjb25mLT5uMik7CisJcHJpbnRrKEtFUk5fSU5GTyAibGV2ZWwgMiB3aW5kb3c9JWRcbiIsIGNvbmYtPm4yd2luKTsKKwlwcmludGsoS0VSTl9JTkZPICJsZXZlbCAzIHdpbmRvdz0lZFxuIiwgY29uZi0+bjN3aW4pOworCXByaW50ayhLRVJOX0lORk8gIiMgbG9naWNhbCBjaGFubmVscz0lZFxuIiwgY29uZi0+bnZjKTsKKwlwcmludGsoS0VSTl9JTkZPICJsZXZlbCAzIHBrdCBsZW49JWRcbiIsIGNvbmYtPnBrdGxlbik7CisJcHJpbnRrKEtFUk5fSU5GTyAibXkgYWRkcmVzcz0lZFxuIiwgY29uZi0+bG9jYWRkcik7CisJcHJpbnRrKEtFUk5fSU5GTyAicmVtb3RlIGFkZHJlc3M9JWRcbiIsIGNvbmYtPnJlbWFkZHIpOworCXByaW50ayhLRVJOX0lORk8gInQxPSVkIHNlY29uZHNcbiIsIGNvbmYtPnQxKTsKKwlwcmludGsoS0VSTl9JTkZPICJ0Mj0lZCBzZWNvbmRzXG4iLCBjb25mLT50Mik7CisJcHJpbnRrKEtFUk5fSU5GTyAidDIxPSVkIHNlY29uZHNcbiIsIGNvbmYtPnQyMSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiIyBQVkNzPSVkXG4iLCBjb25mLT5ucHZjKTsKKwlwcmludGsoS0VSTl9JTkZPICJ0MjM9JWQgc2Vjb25kc1xuIiwgY29uZi0+dDIzKTsKKwlwcmludGsoS0VSTl9JTkZPICJmbGFncz0weCV4XG4iLCBjb25mLT5mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2R1bXBfc3RhdHMoc3RydWN0IGN5Y3hfeDI1X3N0YXRzICpzdGF0cykKK3sKKwlwcmludGsoS0VSTl9JTkZPICJYLjI1IHN0YXRpc3RpY3NcbiIpOworCXByaW50ayhLRVJOX0lORk8gIi0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJyeF9jcmNfZXJyb3JzPSVkXG4iLCBzdGF0cy0+cnhfY3JjX2Vycm9ycyk7CisJcHJpbnRrKEtFUk5fSU5GTyAicnhfb3Zlcl9lcnJvcnM9JWRcbiIsIHN0YXRzLT5yeF9vdmVyX2Vycm9ycyk7CisJcHJpbnRrKEtFUk5fSU5GTyAibjJfdHhfZnJhbWVzPSVkXG4iLCBzdGF0cy0+bjJfdHhfZnJhbWVzKTsKKwlwcmludGsoS0VSTl9JTkZPICJuMl9yeF9mcmFtZXM9JWRcbiIsIHN0YXRzLT5uMl9yeF9mcmFtZXMpOworCXByaW50ayhLRVJOX0lORk8gInR4X3RpbWVvdXRzPSVkXG4iLCBzdGF0cy0+dHhfdGltZW91dHMpOworCXByaW50ayhLRVJOX0lORk8gInJ4X3RpbWVvdXRzPSVkXG4iLCBzdGF0cy0+cnhfdGltZW91dHMpOworCXByaW50ayhLRVJOX0lORk8gIm4zX3R4X3BhY2tldHM9JWRcbiIsIHN0YXRzLT5uM190eF9wYWNrZXRzKTsKKwlwcmludGsoS0VSTl9JTkZPICJuM19yeF9wYWNrZXRzPSVkXG4iLCBzdGF0cy0+bjNfcnhfcGFja2V0cyk7CisJcHJpbnRrKEtFUk5fSU5GTyAidHhfYWJvcnRzPSVkXG4iLCBzdGF0cy0+dHhfYWJvcnRzKTsKKwlwcmludGsoS0VSTl9JTkZPICJyeF9hYm9ydHM9JWRcbiIsIHN0YXRzLT5yeF9hYm9ydHMpOworfQorCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9kdW1wX2RldnMoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2FuZGV2LT5kZXY7CisKKwlwcmludGsoS0VSTl9JTkZPICJYLjI1IGRldiBzdGF0ZXNcbiIpOworCXByaW50ayhLRVJOX0lORk8gIm5hbWU6IGFkZHI6ICAgICAgICAgICB0eG9mZjogIHByb3RvY29sOlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworCXdoaWxlKGRldikgeworCQlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKworCQlwcmludGsoS0VSTl9JTkZPICIlLTUuNXMgJS0xNS4xNXMgICAlZCAgICAgRVRIX1BfJXNcbiIsCisJCQkJIGNoYW4tPm5hbWUsIGNoYW4tPmFkZHIsIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSwKKwkJCQkgY2hhbi0+cHJvdG9jb2wgPT0gRVRIX1BfSVAgPyAiSVAiIDogIlgyNSIpOworCQlkZXYgPSBjaGFuLT5zbGF2ZTsKKwl9Cit9CisKKyNlbmRpZiAvKiBDWUNMT01YX1gyNV9ERUJVRyAqLworLyogRW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZGxjaS5jIGIvZHJpdmVycy9uZXQvd2FuL2RsY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFlYzViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2RsY2kuYwpAQCAtMCwwICsxLDU2NiBAQAorLyoKKyAqIERMQ0kJCUltcGxlbWVudGF0aW9uIG9mIEZyYW1lIFJlbGF5IHByb3RvY29sIGZvciBMaW51eCwgYWNjb3JkaW5nIHRvCisgKgkJUkZDIDE0OTAuICBUaGlzIGdlbmVyaWMgZGV2aWNlIHByb3ZpZGVzIGVuL2RlY2Fwc3VsYXRpb24gZm9yIGFuCisgKgkJdW5kZXJseWluZyBoYXJkd2FyZSBkcml2ZXIuICBSb3V0ZXMgJiBJUHMgYXJlIGFzc2lnbmVkIHRvIHRoZXNlCisgKgkJaW50ZXJmYWNlcy4gIFJlcXVpcmVzICdkbGNpY2ZnJyBwcm9ncmFtIHRvIGNyZWF0ZSB1c2FibGUgCisgKgkJaW50ZXJmYWNlcywgdGhlIGluaXRpYWwgb25lLCAnZGxjaScgaXMgZm9yIElPQ1RMIHVzZSBvbmx5LgorICoKKyAqIFZlcnNpb246CUAoIylkbGNpLmMJMC4zNQk0IEphbiAxOTk3CisgKgorICogQXV0aG9yOglNaWtlIE1jTGFnYW4gPG1pa2UubWNsYWdhbkBsaW51eC5vcmc+CisgKgorICogQ2hhbmdlczoKKyAqCisgKgkJMC4xNQlNaWtlIE1jbGFnYW4JUGFja2V0IGZyZWVpbmcsIGJ1ZyBpbiBrbWFsbG9jIGNhbGwKKyAqCQkJCQlETENJX1JFVCBoYW5kbGluZworICoJCTAuMjAJTWlrZSBNY0xhZ2FuCU1vcmUgY29uc2VydmF0aXZlIG9uIHdoaWNoIHBhY2tldHMKKyAqCQkJCQlhcmUgcmV0dXJuZWQgZm9yIHJldHJ5IGFuZCB3aGljaCBhcmUKKyAqCQkJCQlhcmUgZHJvcHBlZC4gIElmIERMQ0lfUkVUX0RST1AgaXMKKyAqCQkJCQlyZXR1cm5lZCBmcm9tIHRoZSBGUkFELCB0aGUgcGFja2V0IGlzCisgKgkJCQkgCXNlbnQgYmFjayB0byBMaW51eCBmb3IgcmUtdHJhbnNtaXNzaW9uCisgKgkJMC4yNQlNaWtlIE1jTGFnYW4JQ29udmVydGVkIHRvIHVzZSBTSU9DIElPQ1RMIGNhbGxzCisgKgkJMC4zMAlKaW0gRnJlZW1hbglGaXhlZCB0byBhbGxvdyBJUFggdHJhZmZpYworICoJCTAuMzUJTWljaGFlbCBFbGl6YWJldGgJRml4ZWQgaW5jb3JyZWN0IG1lbWNweV9mcm9tZnMKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+IC8qIGZvciBDT05GSUdfRExDSV9DT1VOVCAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9mcmFkLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPSAiRExDSSBkcml2ZXIgdjAuMzUsIDQgSmFuIDE5OTcsIG1pa2UubWNsYWdhbkBsaW51eC5vcmciOworCitzdGF0aWMgTElTVF9IRUFEKGRsY2lfZGV2cyk7CisKK3N0YXRpYyB2b2lkIGRsY2lfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKy8qIAorICogdGhlc2UgZW5jYXBzdWxhdGUgdGhlIFJGQyAxNDkwIHJlcXVpcmVtZW50cyBhcyB3ZWxsIGFzIAorICogZGVhbCB3aXRoIHBhY2tldCB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbiwgd29ya2luZyB3aXRoCisgKiB0aGUgdXBwZXIgbmV0d29yayBsYXllcnMgCisgKi8KKworc3RhdGljIGludCBkbGNpX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IGZyaGRyCQloZHI7CisJc3RydWN0IGRsY2lfbG9jYWwJKmRscDsKKwl1bnNpZ25lZCBpbnQJCWhsZW47CisJY2hhcgkJCSpkZXN0OworCisJZGxwID0gZGV2LT5wcml2OworCisJaGRyLmNvbnRyb2wgPSBGUkFEX0lfVUk7CisJc3dpdGNoKHR5cGUpCisJeworCQljYXNlIEVUSF9QX0lQOgorCQkJaGRyLklQX05MUElEID0gRlJBRF9QX0lQOworCQkJaGxlbiA9IHNpemVvZihoZHIuY29udHJvbCkgKyBzaXplb2YoaGRyLklQX05MUElEKTsKKwkJCWJyZWFrOworCisJCS8qIGZlZWwgZnJlZSB0byBhZGQgb3RoZXIgdHlwZXMsIGlmIG5lY2Vzc2FyeSAqLworCisJCWRlZmF1bHQ6CisJCQloZHIucGFkID0gRlJBRF9QX1BBRERJTkc7CisJCQloZHIuTkxQSUQgPSBGUkFEX1BfU05BUDsKKwkJCW1lbXNldChoZHIuT1VJLCAwLCBzaXplb2YoaGRyLk9VSSkpOworCQkJaGRyLlBJRCA9IGh0b25zKHR5cGUpOworCQkJaGxlbiA9IHNpemVvZihoZHIpOworCQkJYnJlYWs7CisJfQorCisJZGVzdCA9IHNrYl9wdXNoKHNrYiwgaGxlbik7CisJaWYgKCFkZXN0KQorCQlyZXR1cm4oMCk7CisKKwltZW1jcHkoZGVzdCwgJmhkciwgaGxlbik7CisKKwlyZXR1cm4oaGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGRsY2lfcmVjZWl2ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHA7CisJc3RydWN0IGZyaGRyCQkqaGRyOworCWludAkJCQkJcHJvY2VzcywgaGVhZGVyOworCisJZGxwID0gZGV2LT5wcml2OworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqaGRyKSkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogaW52YWxpZCBkYXRhIG5vIGhlYWRlclxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWRscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJaGRyID0gKHN0cnVjdCBmcmhkciAqKSBza2ItPmRhdGE7CisJcHJvY2VzcyA9IDA7CisJaGVhZGVyID0gMDsKKwlza2ItPmRldiA9IGRldjsKKworCWlmIChoZHItPmNvbnRyb2wgIT0gRlJBRF9JX1VJKQorCXsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogSW52YWxpZCBoZWFkZXIgZmxhZyAweCUwMlguXG4iLCBkZXYtPm5hbWUsIGhkci0+Y29udHJvbCk7CisJCWRscC0+c3RhdHMucnhfZXJyb3JzKys7CisJfQorCWVsc2UKKwkJc3dpdGNoKGhkci0+SVBfTkxQSUQpCisJCXsKKwkJCWNhc2UgRlJBRF9QX1BBRERJTkc6CisJCQkJaWYgKGhkci0+TkxQSUQgIT0gRlJBRF9QX1NOQVApCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBVbnN1cHBvcnRlZCBOTFBJRCAweCUwMlguXG4iLCBkZXYtPm5hbWUsIGhkci0+TkxQSUQpOworCQkJCQlkbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQlicmVhazsKKwkJCQl9CisJIAorCQkJCWlmIChoZHItPk9VSVswXSArIGhkci0+T1VJWzFdICsgaGRyLT5PVUlbMl0gIT0gMCkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFVuc3VwcG9ydGVkIG9yZ2FuaXphdGlvbmFsbHkgdW5pcXVlIGlkZW50aWZpZXIgMHglMDJYLSUwMlgtJTAyWC5cbiIsIGRldi0+bmFtZSwgaGRyLT5PVUlbMF0sIGhkci0+T1VJWzFdLCBoZHItPk9VSVsyXSk7CisJCQkJCWRscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIGF0IHRoaXMgcG9pbnQsIGl0J3MgYW4gRXRoZXJUeXBlIGZyYW1lICovCisJCQkJaGVhZGVyID0gc2l6ZW9mKHN0cnVjdCBmcmhkcik7CisJCQkJLyogQWxyZWFkeSBpbiBuZXR3b3JrIG9yZGVyICEgKi8KKwkJCQlza2ItPnByb3RvY29sID0gaGRyLT5QSUQ7CisJCQkJcHJvY2VzcyA9IDE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRlJBRF9QX0lQOgorCQkJCWhlYWRlciA9IHNpemVvZihoZHItPmNvbnRyb2wpICsgc2l6ZW9mKGhkci0+SVBfTkxQSUQpOworCQkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJCQkJcHJvY2VzcyA9IDE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRlJBRF9QX1NOQVA6CisJCQljYXNlIEZSQURfUF9ROTMzOgorCQkJY2FzZSBGUkFEX1BfQ0xOUDoKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBVbnN1cHBvcnRlZCBOTFBJRCAweCUwMlguXG4iLCBkZXYtPm5hbWUsIGhkci0+cGFkKTsKKwkJCQlkbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IEludmFsaWQgcGFkIGJ5dGUgMHglMDJYLlxuIiwgZGV2LT5uYW1lLCBoZHItPnBhZCk7CisJCQkJZGxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlicmVhazsJCQkJCisJCX0KKworCWlmIChwcm9jZXNzKQorCXsKKwkJLyogd2UndmUgc2V0IHVwIHRoZSBwcm90b2NvbCwgc28gZGlzY2FyZCB0aGUgaGVhZGVyICovCisJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsgCisJCXNrYl9wdWxsKHNrYiwgaGVhZGVyKTsKKwkJZGxwLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbmV0aWZfcngoc2tiKTsKKwkJZGxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJfQorCWVsc2UKKwkJZGV2X2tmcmVlX3NrYihza2IpOworfQorCitzdGF0aWMgaW50IGRsY2lfdHJhbnNtaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGxjaV9sb2NhbCAqZGxwOworCWludAkJCQkJcmV0OworCisJcmV0ID0gMDsKKworCWlmICghc2tiIHx8ICFkZXYpCisJCXJldHVybigwKTsKKworCWRscCA9IGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlyZXQgPSBkbHAtPnNsYXZlLT5oYXJkX3N0YXJ0X3htaXQoc2tiLCBkbHAtPnNsYXZlKTsKKwlzd2l0Y2ggKHJldCkKKwl7CisJCWNhc2UgRExDSV9SRVRfT0s6CisJCQlkbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJCWNhc2UgRExDSV9SRVRfRVJSOgorCQkJZGxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJCWNhc2UgRExDSV9SRVRfRFJPUDoKKwkJCWRscC0+c3RhdHMudHhfZHJvcHBlZCsrOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCX0KKwkvKiBBbGFuIENveCByZWNvbW1lbmRzIGFsd2F5cyByZXR1cm5pbmcgMCwgYW5kIGFsd2F5cyBmcmVlaW5nIHRoZSBwYWNrZXQgKi8KKwkvKiBleHBlcmllbmNlIHN1Z2dlc3QgYSBzbGlnaHRseSBtb3JlIGNvbnNlcnZhdGl2ZSBhcHByb2FjaCAqLworCisJaWYgKCFyZXQpCisJeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJcmV0dXJuKHJldCk7Cit9CisKK3N0YXRpYyBpbnQgZGxjaV9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGRsY2lfY29uZiBfX3VzZXIgKmNvbmYsIGludCBnZXQpCit7CisJc3RydWN0IGRsY2lfY29uZgljb25maWc7CisJc3RydWN0IGRsY2lfbG9jYWwJKmRscDsKKwlzdHJ1Y3QgZnJhZF9sb2NhbAkqZmxwOworCWludAkJCWVycjsKKworCWRscCA9IGRldi0+cHJpdjsKKworCWZscCA9IGRscC0+c2xhdmUtPnByaXY7CisKKwlpZiAoIWdldCkKKwl7CisJCWlmKGNvcHlfZnJvbV91c2VyKCZjb25maWcsIGNvbmYsIHNpemVvZihzdHJ1Y3QgZGxjaV9jb25mKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvbmZpZy5mbGFncyAmIH5ETENJX1ZBTElEX0ZMQUdTKQorCQkJcmV0dXJuKC1FSU5WQUwpOworCQltZW1jcHkoJmRscC0+Y29uZmlnLCAmY29uZmlnLCBzaXplb2Yoc3RydWN0IGRsY2lfY29uZikpOworCQlkbHAtPmNvbmZpZ3VyZWQgPSAxOworCX0KKworCWVyciA9ICgqZmxwLT5kbGNpX2NvbmYpKGRscC0+c2xhdmUsIGRldiwgZ2V0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4oZXJyKTsKKworCWlmIChnZXQpCisJeworCQlpZihjb3B5X3RvX3VzZXIoY29uZiwgJmRscC0+Y29uZmlnLCBzaXplb2Yoc3RydWN0IGRsY2lfY29uZikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IGRsY2lfZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHA7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybigtRVBFUk0pOworCisJZGxwID0gZGV2LT5wcml2OworCisJc3dpdGNoKGNtZCkKKwl7CisJCWNhc2UgRExDSV9HRVRfU0xBVkU6CisJCQlpZiAoISooc2hvcnQgKikoZGV2LT5kZXZfYWRkcikpCisJCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCQlzdHJuY3B5KGlmci0+aWZyX3NsYXZlLCBkbHAtPnNsYXZlLT5uYW1lLCBzaXplb2YoaWZyLT5pZnJfc2xhdmUpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRExDSV9HRVRfQ09ORjoKKwkJY2FzZSBETENJX1NFVF9DT05GOgorCQkJaWYgKCEqKHNob3J0ICopKGRldi0+ZGV2X2FkZHIpKQorCQkJCXJldHVybigtRUlOVkFMKTsKKworCQkJcmV0dXJuKGRsY2lfY29uZmlnKGRldiwgaWZyLT5pZnJfZGF0YSwgY21kID09IERMQ0lfR0VUX0NPTkYpKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6IAorCQkJcmV0dXJuKC1FT1BOT1RTVVBQKTsKKwl9CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IGRsY2lfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgZGxjaV9sb2NhbCAqZGxwOworCisJZGxwID0gZGV2LT5wcml2OworCisJcmV0dXJuKCgqZGxwLT5zbGF2ZS0+Y2hhbmdlX210dSkoZGxwLT5zbGF2ZSwgbmV3X210dSkpOworfQorCitzdGF0aWMgaW50IGRsY2lfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkbGNpX2xvY2FsCSpkbHA7CisJc3RydWN0IGZyYWRfbG9jYWwJKmZscDsKKwlpbnQJCQllcnI7CisKKwlkbHAgPSBkZXYtPnByaXY7CisKKwlpZiAoISooc2hvcnQgKikoZGV2LT5kZXZfYWRkcikpCisJCXJldHVybigtRUlOVkFMKTsKKworCWlmICghbmV0aWZfcnVubmluZyhkbHAtPnNsYXZlKSkKKwkJcmV0dXJuKC1FTk9UQ09OTik7CisKKwlmbHAgPSBkbHAtPnNsYXZlLT5wcml2OworCWVyciA9ICgqZmxwLT5hY3RpdmF0ZSkoZGxwLT5zbGF2ZSwgZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4oZXJyKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbGNpX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRsY2lfbG9jYWwJKmRscDsKKwlzdHJ1Y3QgZnJhZF9sb2NhbAkqZmxwOworCWludAkJCWVycjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWRscCA9IGRldi0+cHJpdjsKKworCWZscCA9IGRscC0+c2xhdmUtPnByaXY7CisJZXJyID0gKCpmbHAtPmRlYWN0aXZhdGUpKGRscC0+c2xhdmUsIGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpkbGNpX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHA7CisKKwlkbHAgPSBkZXYtPnByaXY7CisKKwlyZXR1cm4oJmRscC0+c3RhdHMpOworfQorCitzdGF0aWMgaW50IGRsY2lfYWRkKHN0cnVjdCBkbGNpX2FkZCAqZGxjaSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkqbWFzdGVyLCAqc2xhdmU7CisJc3RydWN0IGRsY2lfbG9jYWwJKmRscDsKKwlzdHJ1Y3QgZnJhZF9sb2NhbAkqZmxwOworCWludAkJCWVyciA9IC1FSU5WQUw7CisKKworCS8qIHZhbGlkYXRlIHNsYXZlIGRldmljZSAqLworCXNsYXZlID0gZGV2X2dldF9ieV9uYW1lKGRsY2ktPmRldm5hbWUpOworCWlmICghc2xhdmUpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHNsYXZlLT50eXBlICE9IEFSUEhSRF9GUkFEIHx8IHNsYXZlLT5wcml2ID09IE5VTEwpCisJCWdvdG8gZXJyMTsKKworCS8qIGNyZWF0ZSBkZXZpY2UgbmFtZSAqLworCW1hc3RlciA9IGFsbG9jX25ldGRldiggc2l6ZW9mKHN0cnVjdCBkbGNpX2xvY2FsKSwgImRsY2klZCIsCisJCQkgICAgICBkbGNpX3NldHVwKTsKKwlpZiAoIW1hc3RlcikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycjE7CisJfQorCisJLyogbWFrZSBzdXJlIHNhbWUgc2xhdmUgbm90IGFscmVhZHkgcmVnaXN0ZXJlZCAqLworCXJ0bmxfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGxwLCAmZGxjaV9kZXZzLCBsaXN0KSB7CisJCWlmIChkbHAtPnNsYXZlID09IHNsYXZlKSB7CisJCQllcnIgPSAtRUJVU1k7CisJCQlnb3RvIGVycjI7CisJCX0KKwl9CisKKwllcnIgPSBkZXZfYWxsb2NfbmFtZShtYXN0ZXIsIG1hc3Rlci0+bmFtZSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyMjsKKworCSooc2hvcnQgKikobWFzdGVyLT5kZXZfYWRkcikgPSBkbGNpLT5kbGNpOworCisJZGxwID0gKHN0cnVjdCBkbGNpX2xvY2FsICopIG1hc3Rlci0+cHJpdjsKKwlkbHAtPnNsYXZlID0gc2xhdmU7CisJZGxwLT5tYXN0ZXIgPSBtYXN0ZXI7CisKKwlmbHAgPSBzbGF2ZS0+cHJpdjsKKwllcnIgPSAoKmZscC0+YXNzb2MpKHNsYXZlLCBtYXN0ZXIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycjI7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2UobWFzdGVyKTsKKwlpZiAoZXJyIDwgMCkgCisJCWdvdG8gZXJyMjsKKworCXN0cmNweShkbGNpLT5kZXZuYW1lLCBtYXN0ZXItPm5hbWUpOworCisJbGlzdF9hZGQoJmRscC0+bGlzdCwgJmRsY2lfZGV2cyk7CisJcnRubF91bmxvY2soKTsKKworCXJldHVybigwKTsKKworIGVycjI6CisJcnRubF91bmxvY2soKTsKKwlmcmVlX25ldGRldihtYXN0ZXIpOworIGVycjE6CisJZGV2X3B1dChzbGF2ZSk7CisJcmV0dXJuKGVycik7Cit9CisKK3N0YXRpYyBpbnQgZGxjaV9kZWwoc3RydWN0IGRsY2lfYWRkICpkbGNpKQoreworCXN0cnVjdCBkbGNpX2xvY2FsCSpkbHA7CisJc3RydWN0IGZyYWRfbG9jYWwJKmZscDsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqbWFzdGVyLCAqc2xhdmU7CisJaW50CQkJZXJyOworCisJLyogdmFsaWRhdGUgc2xhdmUgZGV2aWNlICovCisJbWFzdGVyID0gX19kZXZfZ2V0X2J5X25hbWUoZGxjaS0+ZGV2bmFtZSk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybigtRU5PREVWKTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG1hc3RlcikpIHsKKwkJcmV0dXJuKC1FQlVTWSk7CisJfQorCisJZGxwID0gbWFzdGVyLT5wcml2OworCXNsYXZlID0gZGxwLT5zbGF2ZTsKKwlmbHAgPSBzbGF2ZS0+cHJpdjsKKworCXJ0bmxfbG9jaygpOworCWVyciA9ICgqZmxwLT5kZWFzc29jKShzbGF2ZSwgbWFzdGVyKTsKKwlpZiAoIWVycikgeworCQlsaXN0X2RlbCgmZGxwLT5saXN0KTsKKworCQl1bnJlZ2lzdGVyX25ldGRldmljZShtYXN0ZXIpOworCisJCWRldl9wdXQoc2xhdmUpOworCX0KKwlydG5sX3VubG9jaygpOworCisJcmV0dXJuKGVycik7Cit9CisKK3N0YXRpYyBpbnQgZGxjaV9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBkbGNpX2FkZCBhZGQ7CisJaW50IGVycjsKKwkKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybigtRVBFUk0pOworCisJaWYoY29weV9mcm9tX3VzZXIoJmFkZCwgYXJnLCBzaXplb2Yoc3RydWN0IGRsY2lfYWRkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIFNJT0NBRERETENJOgorCQkJZXJyID0gZGxjaV9hZGQoJmFkZCk7CisKKwkJCWlmICghZXJyKQorCQkJCWlmKGNvcHlfdG9fdXNlcihhcmcsICZhZGQsIHNpemVvZihzdHJ1Y3QgZGxjaV9hZGQpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKworCQljYXNlIFNJT0NERUxETENJOgorCQkJZXJyID0gZGxjaV9kZWwoJmFkZCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4oZXJyKTsKK30KKworc3RhdGljIHZvaWQgZGxjaV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHAgPSBkZXYtPnByaXY7CisKKwlkZXYtPmZsYWdzCQk9IDA7CisJZGV2LT5vcGVuCQk9IGRsY2lfb3BlbjsKKwlkZXYtPnN0b3AJCT0gZGxjaV9jbG9zZTsKKwlkZXYtPmRvX2lvY3RsCQk9IGRsY2lfZGV2X2lvY3RsOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gZGxjaV90cmFuc21pdDsKKwlkZXYtPmhhcmRfaGVhZGVyCT0gZGxjaV9oZWFkZXI7CisJZGV2LT5nZXRfc3RhdHMJCT0gZGxjaV9nZXRfc3RhdHM7CisJZGV2LT5jaGFuZ2VfbXR1CQk9IGRsY2lfY2hhbmdlX210dTsKKwlkZXYtPmRlc3RydWN0b3IJCT0gZnJlZV9uZXRkZXY7CisKKwlkbHAtPnJlY2VpdmUJCT0gZGxjaV9yZWNlaXZlOworCisJZGV2LT50eXBlCQk9IEFSUEhSRF9ETENJOworCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gc2l6ZW9mKHN0cnVjdCBmcmhkcik7CisJZGV2LT5hZGRyX2xlbgkJPSBzaXplb2Yoc2hvcnQpOworCit9CisKKy8qIGlmIHNsYXZlIGlzIHVucmVnaXN0ZXJpbmcsIHRoZW4gY2xlYW51cCBtYXN0ZXIgKi8KK3N0YXRpYyBpbnQgZGxjaV9kZXZfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp1bnVzZWQsCisJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHB0cjsKKworCWlmIChldmVudCA9PSBORVRERVZfVU5SRUdJU1RFUikgeworCQlzdHJ1Y3QgZGxjaV9sb2NhbCAqZGxwOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGxwLCAmZGxjaV9kZXZzLCBsaXN0KSB7CisJCQlpZiAoZGxwLT5zbGF2ZSA9PSBkZXYpIHsKKwkJCQlsaXN0X2RlbCgmZGxwLT5saXN0KTsKKwkJCQl1bnJlZ2lzdGVyX25ldGRldmljZShkbHAtPm1hc3Rlcik7CisJCQkJZGV2X3B1dChkbHAtPnNsYXZlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZGxjaV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGRsY2lfZGV2X2V2ZW50LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9kbGNpKHZvaWQpCit7CisJZGxjaV9pb2N0bF9zZXQoZGxjaV9pb2N0bCk7CisJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZkbGNpX25vdGlmaWVyKTsKKworCXByaW50aygiJXMuXG4iLCB2ZXJzaW9uKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZGxjaV9leGl0KHZvaWQpCit7CisJc3RydWN0IGRsY2lfbG9jYWwJKmRscCwgKm54dDsKKwkKKwlkbGNpX2lvY3RsX3NldChOVUxMKTsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmZGxjaV9ub3RpZmllcik7CisKKwlydG5sX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGxwLCBueHQsICZkbGNpX2RldnMsIGxpc3QpIHsKKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGxwLT5tYXN0ZXIpOworCQlkZXZfcHV0KGRscC0+c2xhdmUpOworCX0KKwlydG5sX3VubG9jaygpOworfQorCittb2R1bGVfaW5pdChpbml0X2RsY2kpOworbW9kdWxlX2V4aXQoZGxjaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWlrZSBNY0xhZ2FuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZyYW1lIFJlbGF5IERMQ0kgbGF5ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jIGIvZHJpdmVycy9uZXQvd2FuL2RzY2M0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwYTc3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jCkBAIC0wLDAgKzEsMjA3NCBAQAorLyoKKyAqIGRyaXZlcnMvbmV0L3dhbi9kc2NjNC9kc2NjNC5jOiBhIERTQ0M0IEhETEMgZHJpdmVyIGZvciBMaW51eAorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIHJvbWlldUBjb2dlbml0LmZyLgorICogU3BlY2lmaWMgYnVnIHJlcG9ydHMvYXNpYW4gZm9vZCB3aWxsIGJlIHdlbGNvbWUuCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gdGhlIG5pY2UgcGVvcGxlIGF0IENTLVRlbGVjb20gZm9yIHRoZSBoYXJkd2FyZSBhbmQgdGhlCisgKiBhY2Nlc3MgdG8gdGhlIHRlc3QvbWVhc3VyZSB0b29scy4KKyAqCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW9yeSBvZiBPcGVyYXRpb24KKyAqCisgKiBJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisgKgorICogVGhpcyBkZXZpY2UgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgU2llbWVucyBQRUIyMDUzNCA0IHBvcnRzIHNlcmlhbAorICogY29udHJvbGxlciBhcyBmb3VuZCBvbiBFdGluYyBQQ0lTWU5DIGNhcmRzLiBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCisgKiBjaGlwc2V0IGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmluZmluZW9uLmNvbToKKyAqIC0gRGF0YSBTaGVldCAiRFNDQzQsIERNQSBTdXBwb3J0ZWQgU2VyaWFsIENvbW11bmljYXRpb24gQ29udHJvbGxlciB3aXRoCisgKiA0IENoYW5uZWxzLCBQRUIgMjA1MzQgVmVyc2lvbiAyLjEsIFBFRiAyMDUzNCBWZXJzaW9uIDIuMSI7CisgKiAtIEFwcGxpY2F0aW9uIEhpbnQgIk1hbmFnZW1lbnQgb2YgRFNDQzQgb24tY2hpcCBGSUZPIHJlc291cmNlcyIuCisgKiAtIEVycmF0YSBzaGVldCBEUzUgKGNvdXJ0ZXN5IG9mIE1pY2hhZWwgU2tlcnJpdHQpLgorICogSmVucyBEYXZpZCBoYXMgYnVpbHQgYW4gYWRhcHRlciBiYXNlZCBvbiB0aGUgc2FtZSBjaGlwc2V0LiBUYWtlIGEgbG9vaworICogYXQgaHR0cDovL3d3dy5hZnRoZC50dS1kYXJtc3RhZHQuZGUvfmRnMWtqZC9wY2lzY2M0IGZvciBhIHNwZWNpZmljCisgKiBkcml2ZXIuCisgKiBTYW1wbGUgY29kZSAoMiByZXZpc2lvbnMpIGlzIGF2YWlsYWJsZSBhdCBJbmZpbmVvbi4KKyAqCisgKiBJSS4gQm9hcmQtc3BlY2lmaWMgc2V0dGluZ3MKKyAqCisgKiBQY2lzeW5jIGNhbiB0cmFuc21pdCBzb21lIGNsb2NrIHNpZ25hbCB0byB0aGUgb3V0c2lkZSB3b3JsZCBvbiB0aGUKKyAqICpmaXJzdCB0d28qIHBvcnRzIHByb3ZpZGVkIHlvdSBwdXQgYSBxdWFydHogYW5kIGEgbGluZSBkcml2ZXIgb24gaXQgYW5kCisgKiByZW1vdmUgdGhlIGp1bXBlcnMuIFRoZSBvcGVyYXRpb24gaXMgZGVzY3JpYmVkIG9uIEV0aW5jIHdlYiBzaXRlLiBJZiB5b3UKKyAqIGdvIERDRSBvbiB0aGVzZSBwb3J0cywgZG9uJ3QgZm9yZ2V0IHRvIHVzZSBhbiBhZGVxdWF0ZSBjYWJsZS4KKyAqCisgKiBTaGFyaW5nIG9mIHRoZSBQQ0kgaW50ZXJydXB0IGxpbmUgZm9yIHRoaXMgYm9hcmQgaXMgcG9zc2libGUuCisgKgorICogSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisgKgorICogVGhlIHJ4L3R4IG9wZXJhdGlvbnMgYXJlIGJhc2VkIG9uIGEgbGlua2VkIGxpc3Qgb2YgZGVzY3JpcHRvcnMuIFRoZSBkcml2ZXIKKyAqIGRvZXNuJ3QgdXNlIEhPTEQgbW9kZSBhbnkgbW9yZS4gSE9MRCBtb2RlIGlzIGRlZmluaXRlbHkgYnVnZ3kgYW5kIHRoZSBtb3JlCisgKiBJIHRyaWVkIHRvIGZpeCBpdCwgdGhlIG1vcmUgaXQgc3RhcnRlZCB0byBsb29rIGxpa2UgKGNvbnZvbHV0ZWQpIHNvZnR3YXJlCisgKiBtdXRhdGlvbiBvZiBMeERBIG1ldGhvZC4gRXJyYXRhIHNoZWV0IERTNSBzdWdnZXN0cyB0byB1c2UgTHhEQTogY29uc2lkZXIKKyAqIHRoaXMgYSByZmMyMTE5IE1VU1QuCisgKgorICogVHggZGlyZWN0aW9uCisgKiBXaGVuIHRoZSB0eCByaW5nIGlzIGZ1bGwsIHRoZSB4bWl0IHJvdXRpbmUgaXNzdWVzIGEgY2FsbCB0byBuZXRkZXZfc3RvcC4KKyAqIFRoZSBkZXZpY2UgaXMgc3VwcG9zZWQgdG8gYmUgZW5hYmxlZCBhZ2FpbiBkdXJpbmcgYW4gQUxMUyBpcnEgKHdlIGNvdWxkCisgKiB1c2UgSEkgYnV0IGFzIGl0J3MgZWFzeSB0byBsb3NlIGV2ZW50cywgaXQncyBmc2NrZWQpLgorICoKKyAqIFJ4IGRpcmVjdGlvbgorICogVGhlIHJlY2VpdmVkIGZyYW1lcyBhcmVuJ3Qgc3VwcG9zZWQgdG8gc3BhbiBvdmVyIG11bHRpcGxlIHJlY2VpdmluZyBhcmVhcy4KKyAqIEkgbWF5IGltcGxlbWVudCBpdCBzb21lIGRheSBidXQgaXQgaXNuJ3QgdGhlIGhpZ2hlc3QgcmFua2VkIGl0ZW0uCisgKgorICogSVYuIE5vdGVzCisgKiBUaGUgY3VycmVudCBlcnJvciAoWERVLCBSRk8pIHJlY292ZXJ5IGNvZGUgaXMgdW50ZXN0ZWQuCisgKiBTbyBmYXIsIFJETyB0YWtlcyBoaXMgUlggY2hhbm5lbCBkb3duIGFuZCB0aGUgcmlnaHQgc2VxdWVuY2UgdG8gZW5hYmxlIGl0CisgKiBhZ2FpbiBpcyBzdGlsbCBhIG1pc3RlcnkuIElmIFJETyBoYXBwZW5zLCBwbGFuIGEgcmVib290LiBNb3JlIGRldGFpbHMKKyAqIGluIHRoZSBjb2RlIChOQjogYXMgdGhpcyBoYXBwZW5zLCBUWCBzdGlsbCB3b3JrcykuCisgKiBEb24ndCBtZXNzIHRoZSBjYWJsZXMgZHVyaW5nIG9wZXJhdGlvbiwgZXNwZWNpYWxseSBvbiBEVEUgcG9ydHMuIEkgZG9uJ3QKKyAqIHN1Z2dlc3QgaXQgZm9yIERDRSBlaXRoZXIgYnV0IGF0IGxlYXN0IG9uZSBjYW4gZ2V0IHNvbWUgbWVzc2FnZXMgaW5zdGVhZAorICogb2YgYSBjb21wbGV0ZSBpbnN0YW50IGZyZWV6ZS4KKyAqIFRlc3RzIGFyZSBkb25lIG9uIFJldi4gMjAgb2YgdGhlIHNpbGljaXVtLiBUaGUgUkRPIGhhbmRsaW5nIGNoYW5nZXMgd2l0aAorICogdGhlIGRvY3VtZW50YXRpb24vY2hpcHNldCByZWxlYXNlcy4KKyAqCisgKiBUT0RPOgorICogLSB0ZXN0IFgyNS4KKyAqIC0gdXNlIHBvbGxpbmcgYXQgaGlnaCBpcnEvcywKKyAqIC0gcGVyZm9ybWFuY2UgYW5hbHlzaXMsCisgKiAtIGVuZGlhbm5lc3MuCisgKgorICogMjAwMS8xMi8xMAlEYW5pZWxhIFNxdWFzc29uaSAgPGRhbmllbGFAY3ljbGFkZXMuY29tPgorICogLSBDb250cmlidXRpb24gdG8gc3VwcG9ydCB0aGUgbmV3IGdlbmVyaWMgSERMQyBsYXllci4KKyAqCisgKiAyMDAyLzAxCVVlaW1vcgorICogLSBvbGQgc3R5bGUgaW50ZXJmYWNlIHJlbW92YWwKKyAqIC0gZHNjYzRfcmVsZWFzZV9yaW5nIGZpeCAocmVsYXRlZCB0byBETUEgbWFwcGluZykKKyAqIC0gaGFyZF9zdGFydF94bWl0IGZpeCAoaGludDogVHhTaXplTWF4KQorICogLSBtaXNjIGNyYXBlY3RvbXkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPG5ldC9zeW5jcHBwLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisvKiBWZXJzaW9uICovCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPSAiJElkOiBkc2NjNC5jLHYgMS4xNzMgMjAwMy8wOS8yMCAyMzo1NTozNCByb21pZXUgRXhwICQgZm9yIExpbnV4XG4iOworc3RhdGljIGludCBkZWJ1ZzsKK3N0YXRpYyBpbnQgcXVhcnR6OworCisjaWZkZWYgQ09ORklHX0RTQ0M0X1BDSV9SU1QKK3N0YXRpYyBERUNMQVJFX01VVEVYKGRzY2M0X3NlbSk7CitzdGF0aWMgdTMyIGRzY2M0X3BjaV9jb25maWdfc3RvcmVbMTZdOworI2VuZGlmCisKKyNkZWZpbmUJRFJWX05BTUUJImRzY2M0IgorCisjdW5kZWYgRFNDQzRfUE9MTElORworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCitNT0RVTEVfQVVUSE9SKCJNYWludGFpbmVyOiBGcmFuY29pcyBSb21pZXUgPHJvbWlldUBjb2dlbml0LmZyPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTaWVtZW5zIFBFQjIwNTM0IFBDSSBDb250cm9sZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsIkVuYWJsZS9kaXNhYmxlIGV4dHJhIG1lc3NhZ2VzIik7Cittb2R1bGVfcGFyYW0ocXVhcnR6LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhxdWFydHosIklmIHByZXNlbnQsIG9uLWJvYXJkIHF1YXJ0eiBmcmVxdWVuY3kgKEh6KSIpOworCisvKiBTdHJ1Y3R1cmVzICovCisKK3N0cnVjdCB0aGluZ2llIHsKKwlpbnQgZGVmaW5lOworCXUzMiBiaXRzOworfTsKKworc3RydWN0IFR4RkQgeworCXUzMiBzdGF0ZTsKKwl1MzIgbmV4dDsKKwl1MzIgZGF0YTsKKwl1MzIgY29tcGxldGU7CisJdTMyIGppZmZpZXM7IC8qIEFsbG93cyBzaXplb2YoVHhGRCkgPT0gc2l6ZW9mKFJ4RkQpICsgZXh0cmEgaGFjayAqLworfTsKKworc3RydWN0IFJ4RkQgeworCXUzMiBzdGF0ZTE7CisJdTMyIG5leHQ7CisJdTMyIGRhdGE7CisJdTMyIHN0YXRlMjsKKwl1MzIgZW5kOworfTsKKworI2RlZmluZSBEVU1NWV9TS0JfU0laRQkJNjQKKyNkZWZpbmUgVFhfTE9XCQkJOAorI2RlZmluZSBUWF9SSU5HX1NJWkUJCTMyCisjZGVmaW5lIFJYX1JJTkdfU0laRQkJMzIKKyNkZWZpbmUgVFhfVE9UQUxfU0laRQkJVFhfUklOR19TSVpFKnNpemVvZihzdHJ1Y3QgVHhGRCkKKyNkZWZpbmUgUlhfVE9UQUxfU0laRQkJUlhfUklOR19TSVpFKnNpemVvZihzdHJ1Y3QgUnhGRCkKKyNkZWZpbmUgSVJRX1JJTkdfU0laRQkJNjQJCS8qIEtlZXAgaXQgYSBtdWx0aXBsZSBvZiAzMiAqLworI2RlZmluZSBUWF9USU1FT1VUCQkoSFovMTApCisjZGVmaW5lIERTQ0M0X0haX01BWAkJMzMwMDAwMDAKKyNkZWZpbmUgQlJSX0RJVklERVJfTUFYCQk2NCoweDAwMDA0MDAwCS8qIENmIGVycmF0YSBEUzUgcC4xMCAqLworI2RlZmluZSBkZXZfcGVyX2NhcmQJCTQKKyNkZWZpbmUgU0NDX1JFR0lTVEVSU19NQVgJMjMJCS8qIENmIGVycmF0YSBEUzUgcC40ICovCisKKyNkZWZpbmUgU09VUkNFX0lEKGZsYWdzKQkoKChmbGFncykgPj4gMjgpICYgMHgwMykKKyNkZWZpbmUgVE9fU0laRShzdGF0ZSkJCSgoKHN0YXRlKSA+PiAxNikgJiAweDFmZmYpCisKKy8qCisgKiBHaXZlbiB0aGUgb3BlcmF0aW5nIHJhbmdlIG9mIExpbnV4IEhETEMsIHRoZSAyIGRlZmluZXMgYmVsb3cgY291bGQgYmUKKyAqIG1hZGUgc2ltcGxlci4gSG93ZXZlciB0aGV5IGFyZSBhIGZpbmUgcmVtaW5kZXIgZm9yIHRoZSBsaW1pdGF0aW9ucyBvZgorICogdGhlIGRyaXZlcjogaXQncyBiZXR0ZXIgdG8gc3RheSA8IFR4U2l6ZU1heCBhbmQgPCBSeFNpemVNYXguCisgKi8KKyNkZWZpbmUgVE9fU1RBVEVfVFgobGVuKQljcHVfdG9fbGUzMigoKGxlbikgJiBUeFNpemVNYXgpIDw8IDE2KQorI2RlZmluZSBUT19TVEFURV9SWChsZW4pCWNwdV90b19sZTMyKChSWF9NQVgobGVuKSAlIFJ4U2l6ZU1heCkgPDwgMTYpCisjZGVmaW5lIFJYX01BWChsZW4pCQkoKCgobGVuKSA+PiA1KSArIDEpIDw8IDUpCS8qIENmIFJMQ1IgKi8KKyNkZWZpbmUgU0NDX1JFR19TVEFSVChkcHJpdikJKFNDQ19TVEFSVCsoZHByaXYtPmRldl9pZCkqU0NDX09GRlNFVCkKKworc3RydWN0IGRzY2M0X3BjaV9wcml2IHsKKyAgICAgICAgdTMyICppcWNmZzsKKyAgICAgICAgaW50IGNmZ19jdXI7CisgICAgICAgIHNwaW5sb2NrX3QgbG9jazsKKyAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKyAgICAgICAgc3RydWN0IGRzY2M0X2Rldl9wcml2ICpyb290OworICAgICAgICBkbWFfYWRkcl90IGlxY2ZnX2RtYTsKKwl1MzIgeHRhbF9oejsKK307CisKK3N0cnVjdCBkc2NjNF9kZXZfcHJpdiB7CisgICAgICAgIHN0cnVjdCBza19idWZmICpyeF9za2J1ZmZbUlhfUklOR19TSVpFXTsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworCisgICAgICAgIHN0cnVjdCBSeEZEICpyeF9mZDsKKyAgICAgICAgc3RydWN0IFR4RkQgKnR4X2ZkOworICAgICAgICB1MzIgKmlxcng7CisgICAgICAgIHUzMiAqaXF0eDsKKworCS8qIEZJWE1FOiBjaGVjayBhbGwgdGhlIHZvbGF0aWxlIGFyZSByZXF1aXJlZCAqLworICAgICAgICB2b2xhdGlsZSB1MzIgdHhfY3VycmVudDsKKyAgICAgICAgdTMyIHJ4X2N1cnJlbnQ7CisgICAgICAgIHUzMiBpcXR4X2N1cnJlbnQ7CisgICAgICAgIHUzMiBpcXJ4X2N1cnJlbnQ7CisKKyAgICAgICAgdm9sYXRpbGUgdTMyIHR4X2RpcnR5OworICAgICAgICB2b2xhdGlsZSB1MzIgbHRkYTsKKyAgICAgICAgdTMyIHJ4X2RpcnR5OworICAgICAgICB1MzIgbHJkYTsKKworICAgICAgICBkbWFfYWRkcl90IHR4X2ZkX2RtYTsKKyAgICAgICAgZG1hX2FkZHJfdCByeF9mZF9kbWE7CisgICAgICAgIGRtYV9hZGRyX3QgaXF0eF9kbWE7CisgICAgICAgIGRtYV9hZGRyX3QgaXFyeF9kbWE7CisKKwl1MzIgc2NjX3JlZ3NbU0NDX1JFR0lTVEVSU19NQVhdOyAvKiBDZiBlcnJhdGEgRFM1IHAuNCAqLworCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKKyAgICAgICAgc3RydWN0IGRzY2M0X3BjaV9wcml2ICpwY2lfcHJpdjsKKyAgICAgICAgc3BpbmxvY2tfdCBsb2NrOworCisgICAgICAgIGludCBkZXZfaWQ7CisJdm9sYXRpbGUgdTMyIGZsYWdzOworCXUzMiB0aW1lcl9oZWxwOworCisJdW5zaWduZWQgc2hvcnQgZW5jb2Rpbmc7CisJdW5zaWduZWQgc2hvcnQgcGFyaXR5OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3luY19zZXJpYWxfc2V0dGluZ3Mgc2V0dGluZ3M7CisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisJdTMyIF9fcGFkIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpOworfTsKKworLyogR0xPQkFMIHJlZ2lzdGVycyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBHQ01EUiAgIDB4MDAKKyNkZWZpbmUgR1NUQVIgICAweDA0CisjZGVmaW5lIEdNT0RFICAgMHgwOAorI2RlZmluZSBJUUxFTlIwIDB4MEMKKyNkZWZpbmUgSVFMRU5SMSAweDEwCisjZGVmaW5lIElRUlgwICAgMHgxNAorI2RlZmluZSBJUVRYMCAgIDB4MjQKKyNkZWZpbmUgSVFDRkcgICAweDNjCisjZGVmaW5lIEZJRk9DUjEgMHg0NAorI2RlZmluZSBGSUZPQ1IyIDB4NDgKKyNkZWZpbmUgRklGT0NSMyAweDRjCisjZGVmaW5lIEZJRk9DUjQgMHgzNAorI2RlZmluZSBDSDBDRkcgIDB4NTAKKyNkZWZpbmUgQ0gwQlJEQSAweDU0CisjZGVmaW5lIENIMEJUREEgMHg1OAorI2RlZmluZSBDSDBGUkRBIDB4OTgKKyNkZWZpbmUgQ0gwRlREQSAweGIwCisjZGVmaW5lIENIMExSREEgMHhjOAorI2RlZmluZSBDSDBMVERBIDB4ZTAKKworLyogU0NDIHJlZ2lzdGVycyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTQ0NfU1RBUlQJMHgwMTAwCisjZGVmaW5lIFNDQ19PRkZTRVQgICAgICAweDgwCisjZGVmaW5lIENNRFIgICAgMHgwMAorI2RlZmluZSBTVEFSICAgIDB4MDQKKyNkZWZpbmUgQ0NSMCAgICAweDA4CisjZGVmaW5lIENDUjEgICAgMHgwYworI2RlZmluZSBDQ1IyICAgIDB4MTAKKyNkZWZpbmUgQlJSICAgICAweDJDCisjZGVmaW5lIFJMQ1IgICAgMHg0MAorI2RlZmluZSBJTVIgICAgIDB4NTQKKyNkZWZpbmUgSVNSICAgICAweDU4CisKKyNkZWZpbmUgR1BESVIJMHgwNDAwCisjZGVmaW5lIEdQREFUQQkweDA0MDQKKyNkZWZpbmUgR1BJTQkweDA0MDgKKworLyogQml0IG1hc2tzICovCisjZGVmaW5lIEVuY29kaW5nTWFzawkweDAwNzAwMDAwCisjZGVmaW5lIENyY01hc2sJCTB4MDAwMDAwMDMKKworI2RlZmluZSBJbnRSeFNjYzAJMHgxMDAwMDAwMAorI2RlZmluZSBJbnRUeFNjYzAJMHgwMTAwMDAwMAorCisjZGVmaW5lIFR4UG9sbENtZAkweDAwMDAwNDAwCisjZGVmaW5lIFJ4QWN0aXZhdGUJMHgwODAwMDAwMAorI2RlZmluZSBNVEZpCQkweDA0MDAwMDAwCisjZGVmaW5lIFJkcgkJMHgwMDQwMDAwMAorI2RlZmluZSBSZHQJCTB4MDAyMDAwMDAKKyNkZWZpbmUgSWRyCQkweDAwMTAwMDAwCisjZGVmaW5lIElkdAkJMHgwMDA4MDAwMAorI2RlZmluZSBUeFNjY1JlcwkweDAxMDAwMDAwCisjZGVmaW5lIFJ4U2NjUmVzCTB4MDAwMTAwMDAKKyNkZWZpbmUgVHhTaXplTWF4CTB4MWZmZgkJLyogRGF0YXNoZWV0IERTMSAtIDExLjEuMS4xICovCisjZGVmaW5lIFJ4U2l6ZU1heAkweDFmZmMJCS8qIERhdGFzaGVldCBEUzEgLSAxMS4xLjIuMSAqLworCisjZGVmaW5lIENjcjBDbG9ja01hc2sJMHgwMDAwMDAzZgorI2RlZmluZSBDY3IxTG9vcE1hc2sJMHgwMDAwMDIwMAorI2RlZmluZSBJc3JNYXNrCQkweDAwMGZmZmZmCisjZGVmaW5lIEJyckV4cE1hc2sJMHgwMDAwMGYwMAorI2RlZmluZSBCcnJNdWx0TWFzawkweDAwMDAwMDNmCisjZGVmaW5lIEVuY29kaW5nTWFzawkweDAwNzAwMDAwCisjZGVmaW5lIEhvbGQJCTB4NDAwMDAwMDAKKyNkZWZpbmUgU2NjQnVzeQkJMHgxMDAwMDAwMAorI2RlZmluZSBQb3dlclVwCQkweDgwMDAwMDAwCisjZGVmaW5lIFZpcwkJMHgwMDAwMTAwMAorI2RlZmluZSBGcmFtZU9rCQkoRnJhbWVWZnIgfCBGcmFtZUNyYykKKyNkZWZpbmUgRnJhbWVWZnIJMHg4MAorI2RlZmluZSBGcmFtZVJkbwkweDQwCisjZGVmaW5lIEZyYW1lQ3JjCTB4MjAKKyNkZWZpbmUgRnJhbWVSYWIJMHgxMAorI2RlZmluZSBGcmFtZUFib3J0ZWQJMHgwMDAwMDIwMAorI2RlZmluZSBGcmFtZUVuZAkweDgwMDAwMDAwCisjZGVmaW5lIERhdGFDb21wbGV0ZQkweDQwMDAwMDAwCisjZGVmaW5lIExlbmd0aENoZWNrCTB4MDAwMDgwMDAKKyNkZWZpbmUgU2NjRXZ0CQkweDAyMDAwMDAwCisjZGVmaW5lIE5vQWNrCQkweDAwMDAwMjAwCisjZGVmaW5lIEFjdGlvbgkJMHgwMDAwMDAwMQorI2RlZmluZSBIaURlc2MJCTB4MjAwMDAwMDAKKworLyogU0NDIGV2ZW50cyAqLworI2RlZmluZSBSeEV2dAkJMHhmMDAwMDAwMAorI2RlZmluZSBUeEV2dAkJMHgwZjAwMDAwMAorI2RlZmluZSBBbGxzCQkweDAwMDQwMDAwCisjZGVmaW5lIFhkdQkJMHgwMDAxMDAwMAorI2RlZmluZSBDdHMJCTB4MDAwMDQwMDAKKyNkZWZpbmUgWG1yCQkweDAwMDAyMDAwCisjZGVmaW5lIFhwcgkJMHgwMDAwMTAwMAorI2RlZmluZSBSZG8JCTB4MDAwMDAwODAKKyNkZWZpbmUgUmZzCQkweDAwMDAwMDQwCisjZGVmaW5lIENkCQkweDAwMDAwMDA0CisjZGVmaW5lIFJmbwkJMHgwMDAwMDAwMgorI2RlZmluZSBGbGV4CQkweDAwMDAwMDAxCisKKy8qIERNQSBjb3JlIGV2ZW50cyAqLworI2RlZmluZSBDZmcJCTB4MDAyMDAwMDAKKyNkZWZpbmUgSGkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgRmkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgRXJyCQkweDAwMDEwMDAwCisjZGVmaW5lIEFyZgkJMHgwMDAwMDAwMgorI2RlZmluZSBBckFjawkJMHgwMDAwMDAwMQorCisvKiBTdGF0ZSBmbGFncyAqLworI2RlZmluZSBSZWFkeQkJMHgwMDAwMDAwMAorI2RlZmluZSBOZWVkSURSCQkweDAwMDAwMDAxCisjZGVmaW5lIE5lZWRJRFQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUmRvU2V0CQkweDAwMDAwMDA0CisjZGVmaW5lIEZha2VSZXNldAkweDAwMDAwMDA4CisKKy8qIERvbid0IG1hc2sgUkRPLiBFdmVyLiAqLworI2lmZGVmIERTQ0M0X1BPTExJTkcKKyNkZWZpbmUgRXZlbnRzTWFzawkweGZmZmVlZjdmCisjZWxzZQorI2RlZmluZSBFdmVudHNNYXNrCTB4ZmZmYThmN2EKKyNlbmRpZgorCisvKiBGdW5jdGlvbnMgcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgZHNjYzRfcnhfaXJxKHN0cnVjdCBkc2NjNF9wY2lfcHJpdiAqLCBzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKik7CitzdGF0aWMgdm9pZCBkc2NjNF90eF9pcnEoc3RydWN0IGRzY2M0X3BjaV9wcml2ICosIHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqKTsKK3N0YXRpYyBpbnQgZHNjYzRfZm91bmQxKHN0cnVjdCBwY2lfZGV2ICosIHZvaWQgX19pb21lbSAqaW9hZGRyKTsKK3N0YXRpYyBpbnQgZHNjYzRfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgaW50IGRzY2M0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IGRzY2M0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IGRzY2M0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBkc2NjNF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgZHNjYzRfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQgZHNjYzRfcmVsZWFzZV9yaW5nKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqKTsKK3N0YXRpYyB2b2lkIGRzY2M0X3RpbWVyKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgZHNjYzRfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBkc2NjNF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzKTsKK3N0YXRpYyBpbnQgZHNjYzRfaGRsY19hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKiwgdW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KTsKK3N0YXRpYyBpbnQgZHNjYzRfc2V0X2lmYWNlKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKyNpZmRlZiBEU0NDNF9QT0xMSU5HCitzdGF0aWMgaW50IGRzY2M0X3R4X3BvbGwoc3RydWN0IGRzY2M0X2Rldl9wcml2ICosIHN0cnVjdCBuZXRfZGV2aWNlICopOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkc2NjNF9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldl90b19oZGxjKGRldiktPnByaXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UgKmRzY2M0X3RvX2RldihzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKnApCit7CisJcmV0dXJuIHAtPmRldjsKK30KKworc3RhdGljIHZvaWQgc2NjX3BhdGNobCh1MzIgbWFzaywgdTMyIHZhbHVlLCBzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LAorCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9mZnNldCkKK3sKKwl1MzIgc3RhdGU7CisKKwkvKiBDZiBzY2Nfd3JpdGVsIGZvciBjb25jZXJuIHJlZ2FyZGluZyB0aHJlYWQtc2FmZXR5ICovCisJc3RhdGUgPSBkcHJpdi0+c2NjX3JlZ3Nbb2Zmc2V0ID4+IDJdOworCXN0YXRlICY9IH5tYXNrOworCXN0YXRlIHw9IHZhbHVlOworCWRwcml2LT5zY2NfcmVnc1tvZmZzZXQgPj4gMl0gPSBzdGF0ZTsKKwl3cml0ZWwoc3RhdGUsIGRwcml2LT5iYXNlX2FkZHIgKyBTQ0NfUkVHX1NUQVJUKGRwcml2KSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjY193cml0ZWwodTMyIGJpdHMsIHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsCisJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgb2Zmc2V0KQoreworCS8qCisJICogVGhyZWFkLVVOc2FmZS4KKwkgKiBBcyBvZiAyMDAyLzAyLzE2LCB0aGVyZSBhcmUgbm8gdGhyZWFkIHJhY2luZyBmb3IgYWNjZXNzLgorCSAqLworCWRwcml2LT5zY2NfcmVnc1tvZmZzZXQgPj4gMl0gPSBiaXRzOworCXdyaXRlbChiaXRzLCBkcHJpdi0+YmFzZV9hZGRyICsgU0NDX1JFR19TVEFSVChkcHJpdikgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBzY2NfcmVhZGwoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gZHByaXYtPnNjY19yZWdzW29mZnNldCA+PiAyXTsKK30KKworc3RhdGljIHUzMiBzY2NfcmVhZGxfc3RhcihzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIENmIGVycmF0YSBEUzUgcC40ICovCisJcmVhZGwoZHByaXYtPmJhc2VfYWRkciArIFNDQ19SRUdfU1RBUlQoZHByaXYpICsgU1RBUik7CisJcmV0dXJuIHJlYWRsKGRwcml2LT5iYXNlX2FkZHIgKyBTQ0NfUkVHX1NUQVJUKGRwcml2KSArIFNUQVIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHNjYzRfZG9fdHgoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRwcml2LT5sdGRhID0gZHByaXYtPnR4X2ZkX2RtYSArCisgICAgICAgICAgICAgICAgICAgICAgKChkcHJpdi0+dHhfY3VycmVudC0xKSVUWF9SSU5HX1NJWkUpKnNpemVvZihzdHJ1Y3QgVHhGRCk7CisJd3JpdGVsKGRwcml2LT5sdGRhLCBkcHJpdi0+YmFzZV9hZGRyICsgQ0gwTFREQSArIGRwcml2LT5kZXZfaWQqNCk7CisJLyogRmx1c2ggcG9zdGVkIHdyaXRlcyAqTk9XKiAqLworCXJlYWRsKGRwcml2LT5iYXNlX2FkZHIgKyBDSDBMVERBICsgZHByaXYtPmRldl9pZCo0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRzY2M0X3J4X3VwZGF0ZShzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LAorCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZHByaXYtPmxyZGEgPSBkcHJpdi0+cnhfZmRfZG1hICsKKwkJICAgICAgKChkcHJpdi0+cnhfZGlydHkgLSAxKSVSWF9SSU5HX1NJWkUpKnNpemVvZihzdHJ1Y3QgUnhGRCk7CisJd3JpdGVsKGRwcml2LT5scmRhLCBkcHJpdi0+YmFzZV9hZGRyICsgQ0gwTFJEQSArIGRwcml2LT5kZXZfaWQqNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRzY2M0X3R4X2RvbmUoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdikKK3sKKwlyZXR1cm4gZHByaXYtPnR4X2N1cnJlbnQgPT0gZHByaXYtPnR4X2RpcnR5OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkc2NjNF90eF9xdWllc2NlbnQoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gcmVhZGwoZHByaXYtPmJhc2VfYWRkciArIENIMEZUREEgKyBkcHJpdi0+ZGV2X2lkKjQpID09IGRwcml2LT5sdGRhOworfQorCitpbnQgc3RhdGVfY2hlY2sodTMyIHN0YXRlLCBzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQljb25zdCBjaGFyICptc2cpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGVidWcgPiAxKSB7CisJaWYgKFNPVVJDRV9JRChzdGF0ZSkgIT0gZHByaXYtPmRldl9pZCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKCVzKTogU291cmNlIElkPSVkLCBzdGF0ZT0lMDh4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBtc2csIFNPVVJDRV9JRChzdGF0ZSksIHN0YXRlICk7CisJCQlyZXQgPSAtMTsKKwl9CisJaWYgKHN0YXRlICYgMHgwZGY4MGMwMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKCVzKTogc3RhdGU9JTA4eCAoVUZPIGFsZXJ0KVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbXNnLCBzdGF0ZSk7CisJCQlyZXQgPSAtMTsKKwl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZHNjYzRfdHhfcHJpbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJICAgIGNoYXIgKm1zZykKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4X2N1cnJlbnQ9JTAyZCB0eF9kaXJ0eT0lMDJkICglcylcbiIsCisJICAgICAgIGRldi0+bmFtZSwgZHByaXYtPnR4X2N1cnJlbnQsIGRwcml2LT50eF9kaXJ0eSwgbXNnKTsKK30KKworc3RhdGljIHZvaWQgZHNjYzRfcmVsZWFzZV9yaW5nKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkcHJpdi0+cGNpX3ByaXYtPnBkZXY7CisJc3RydWN0IFR4RkQgKnR4X2ZkID0gZHByaXYtPnR4X2ZkOworCXN0cnVjdCBSeEZEICpyeF9mZCA9IGRwcml2LT5yeF9mZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqKnNrYnVmZjsKKwlpbnQgaTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgdHhfZmQsIGRwcml2LT50eF9mZF9kbWEpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgcnhfZmQsIGRwcml2LT5yeF9mZF9kbWEpOworCisJc2tidWZmID0gZHByaXYtPnR4X3NrYnVmZjsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKCpza2J1ZmYpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUocGRldiwgdHhfZmQtPmRhdGEsICgqc2tidWZmKS0+bGVuLAorCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYigqc2tidWZmKTsKKwkJfQorCQlza2J1ZmYrKzsKKwkJdHhfZmQrKzsKKwl9CisKKwlza2J1ZmYgPSBkcHJpdi0+cnhfc2tidWZmOworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoKnNrYnVmZikgeworCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCByeF9mZC0+ZGF0YSwKKwkJCQlSWF9NQVgoSERMQ19NQVhfTVJVKSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IoKnNrYnVmZik7CisJCX0KKwkJc2tidWZmKys7CisJCXJ4X2ZkKys7CisJfQorfQorCitpbmxpbmUgaW50IHRyeV9nZXRfcnhfc2tiKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IGRpcnR5ID0gZHByaXYtPnJ4X2RpcnR5JVJYX1JJTkdfU0laRTsKKwlzdHJ1Y3QgUnhGRCAqcnhfZmQgPSBkcHJpdi0+cnhfZmQgKyBkaXJ0eTsKKwljb25zdCBpbnQgbGVuID0gUlhfTUFYKEhETENfTUFYX01SVSk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcmV0ID0gMDsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKwlkcHJpdi0+cnhfc2tidWZmW2RpcnR5XSA9IHNrYjsKKwlpZiAoc2tiKSB7CisJCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQlyeF9mZC0+ZGF0YSA9IHBjaV9tYXBfc2luZ2xlKGRwcml2LT5wY2lfcHJpdi0+cGRldiwgc2tiLT5kYXRhLAorCQkJCQkgICAgIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwl9IGVsc2UgeworCQlyeF9mZC0+ZGF0YSA9ICh1MzIpIE5VTEw7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogSVJRL3RocmVhZC93aGF0ZXZlciBzYWZlCisgKi8KK3N0YXRpYyBpbnQgZHNjYzRfd2FpdF9hY2tfY2VjKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsCisJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICptc2cpCit7CisJczggaSA9IDA7CisKKwlkbyB7CisJCWlmICghKHNjY19yZWFkbF9zdGFyKGRwcml2LCBkZXYpICYgU2NjQnVzeSkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgYWNrICglZCB0cnkpXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgbXNnLCBpKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMTApOworCQlybWIoKTsKKwl9IHdoaWxlICgrK2kgPiAwKTsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyB0aW1lb3V0XG4iLCBkZXYtPm5hbWUsIG1zZyk7Citkb25lOgorCXJldHVybiAoaSA+PSAwKSA/IGkgOiAtRUFHQUlOOworfQorCitzdGF0aWMgaW50IGRzY2M0X2RvX2FjdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICptc2cpCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBkc2NjNF9wcml2KGRldiktPmJhc2VfYWRkcjsKKwlzMTYgaSA9IDA7CisKKwl3cml0ZWwoQWN0aW9uLCBpb2FkZHIgKyBHQ01EUik7CisJaW9hZGRyICs9IEdTVEFSOworCWRvIHsKKwkJdTMyIHN0YXRlID0gcmVhZGwoaW9hZGRyKTsKKworCQlpZiAoc3RhdGUgJiBBckFjaykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyBhY2tcbiIsIGRldi0+bmFtZSwgbXNnKTsKKwkJCXdyaXRlbChBckFjaywgaW9hZGRyKTsKKwkJCWdvdG8gZG9uZTsKKwkJfSBlbHNlIGlmIChzdGF0ZSAmIEFyZikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgZmFpbGVkXG4iLCBkZXYtPm5hbWUsIG1zZyk7CisJCQl3cml0ZWwoQXJmLCBpb2FkZHIpOworCQkJaSA9IC0xOworCQkJZ290byBkb25lOworCX0KKwkJcm1iKCk7CisJfSB3aGlsZSAoKytpID4gMCk7CisJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgdGltZW91dFxuIiwgZGV2LT5uYW1lLCBtc2cpOworZG9uZToKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHNjYzRfeHByX2FjayhzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2KQoreworCWludCBjdXIgPSBkcHJpdi0+aXF0eF9jdXJyZW50JUlSUV9SSU5HX1NJWkU7CisJczggaSA9IDA7CisKKwlkbyB7CisJCWlmICghKGRwcml2LT5mbGFncyAmIChOZWVkSURSIHwgTmVlZElEVCkpIHx8CisJCSAgICAoZHByaXYtPmlxdHhbY3VyXSAmIFhwcikpCisJCQlicmVhazsKKwkJc21wX3JtYigpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMTApOworCX0gd2hpbGUgKCsraSA+IDApOworCisJcmV0dXJuIChpID49IDAgKSA/IGkgOiAtRUFHQUlOOworfQorCisjaWYgMCAvKiBkc2NjNF97cngvdHh9X3Jlc2V0IGFyZSBib3RoIHVucmVsaWFibGUgLSBtb3JlIHR3ZWFrIG5lZWRlZCAqLworc3RhdGljIHZvaWQgZHNjYzRfcnhfcmVzZXQoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRwcml2LT5wY2lfcHJpdi0+bG9jaywgZmxhZ3MpOworCS8qIENmIGVycmF0YSBEUzUgcC42ICovCisJd3JpdGVsKDB4MDAwMDAwMDAsIGRwcml2LT5iYXNlX2FkZHIgKyBDSDBMUkRBICsgZHByaXYtPmRldl9pZCo0KTsKKwlzY2NfcGF0Y2hsKFBvd2VyVXAsIDAsIGRwcml2LCBkZXYsIENDUjApOworCXJlYWRsKGRwcml2LT5iYXNlX2FkZHIgKyBDSDBMUkRBICsgZHByaXYtPmRldl9pZCo0KTsKKwl3cml0ZWwoTVRGaXxSZHIsIGRwcml2LT5iYXNlX2FkZHIgKyBkcHJpdi0+ZGV2X2lkKjB4MGMgKyBDSDBDRkcpOworCXdyaXRlbChBY3Rpb24sIGRwcml2LT5iYXNlX2FkZHIgKyBHQ01EUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHByaXYtPnBjaV9wcml2LT5sb2NrLCBmbGFncyk7Cit9CisKKyNlbmRpZgorCisjaWYgMAorc3RhdGljIHZvaWQgZHNjYzRfdHhfcmVzZXQoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MTYgaSA9IDA7CisKKwkvKiBDZiBlcnJhdGEgRFM1IHAuNyAqLworCXNjY19wYXRjaGwoUG93ZXJVcCwgMCwgZHByaXYsIGRldiwgQ0NSMCk7CisJc2NjX3dyaXRlbCgweDAwMDUwMDAwLCBkcHJpdiwgZGV2LCBDQ1IyKTsKKwkvKgorCSAqIE11c3QgYmUgbG9uZ2VyIHRoYW4gdGhlIHRpbWUgcmVxdWlyZWQgdG8gZmlsbCB0aGUgZmlmby4KKwkgKi8KKwl3aGlsZSAoIWRzY2M0X3R4X3F1aWVzY2VudChkcHJpdiwgZGV2KSAmJiArK2kpIHsKKwkJdWRlbGF5KDEpOworCQl3bWIoKTsKKwl9CisKKwl3cml0ZWwoTVRGaXxSZHQsIGRwcml2LT5iYXNlX2FkZHIgKyBkcHJpdi0+ZGV2X2lkKjB4MGMgKyBDSDBDRkcpOworCWlmIChkc2NjNF9kb19hY3Rpb24oZGV2LCAiUmR0IikgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUeCByZXNldCBmYWlsZWRcbiIsIGRldi0+bmFtZSk7Cit9CisjZW5kaWYKKworLyogVE9ETzogKGFiKXVzZSB0aGlzIGZ1bmN0aW9uIHRvIHJlZmlsbCBhIGNvbXBsZXRlbHkgZGVwbGV0ZWQgUlggcmluZy4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkc2NjNF9yeF9za2Ioc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBSeEZEICpyeF9mZCA9IGRwcml2LT5yeF9mZCArIGRwcml2LT5yeF9jdXJyZW50JVJYX1JJTkdfU0laRTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkcHJpdi0+cGNpX3ByaXYtPnBkZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcGt0X2xlbjsKKworCXNrYiA9IGRwcml2LT5yeF9za2J1ZmZbZHByaXYtPnJ4X2N1cnJlbnQrKyVSWF9SSU5HX1NJWkVdOworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2tiPTAgKCVzKVxuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIHJlZmlsbDsKKwl9CisJcGt0X2xlbiA9IFRPX1NJWkUocnhfZmQtPnN0YXRlMik7CisJcGNpX3VubWFwX3NpbmdsZShwZGV2LCByeF9mZC0+ZGF0YSwgUlhfTUFYKEhETENfTUFYX01SVSksIFBDSV9ETUFfRlJPTURFVklDRSk7CisJaWYgKChza2ItPmRhdGFbLS1wa3RfbGVuXSAmIEZyYW1lT2spID09IEZyYW1lT2spIHsKKwkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwkJc3RhdHMtPnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW5ldGlmX3J4KHNrYik7CisJfSBlbHNlIHsKKwkJaWYgKHNrYi0+ZGF0YVtwa3RfbGVuXSAmIEZyYW1lUmRvKQorCQkJc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzKys7CisJCWVsc2UgaWYgKCEoc2tiLT5kYXRhW3BrdF9sZW5dIHwgfkZyYW1lQ3JjKSkKKwkJCXN0YXRzLT5yeF9jcmNfZXJyb3JzKys7CisJCWVsc2UgaWYgKCEoc2tiLT5kYXRhW3BrdF9sZW5dIHwgfihGcmFtZVZmciB8IEZyYW1lUmFiKSkpCisJCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQllbHNlCisJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJfQorcmVmaWxsOgorCXdoaWxlICgoZHByaXYtPnJ4X2RpcnR5IC0gZHByaXYtPnJ4X2N1cnJlbnQpICUgUlhfUklOR19TSVpFKSB7CisJCWlmICh0cnlfZ2V0X3J4X3NrYihkcHJpdiwgZGV2KSA8IDApCisJCQlicmVhazsKKwkJZHByaXYtPnJ4X2RpcnR5Kys7CisJfQorCWRzY2M0X3J4X3VwZGF0ZShkcHJpdiwgZGV2KTsKKwlyeF9mZC0+c3RhdGUyID0gMHgwMDAwMDAwMDsKKwlyeF9mZC0+ZW5kID0gMHhiYWJlZmFjZTsKK30KKworc3RhdGljIHZvaWQgZHNjYzRfZnJlZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGRzY2M0X3BjaV9wcml2ICpwcHJpdjsKKwlzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKnJvb3Q7CisJaW50IGk7CisKKwlwcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlyb290ID0gcHByaXYtPnJvb3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3Blcl9jYXJkOyBpKyspCisJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UoZHNjYzRfdG9fZGV2KHJvb3QgKyBpKSk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3Blcl9jYXJkOyBpKyspCisJCWZyZWVfbmV0ZGV2KHJvb3RbaV0uZGV2KTsKKwlrZnJlZShyb290KTsKKwlrZnJlZShwcHJpdik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRzY2M0X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgZHNjYzRfcGNpX3ByaXYgKnByaXY7CisJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwlpbnQgaSwgcmM7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMiLCB2ZXJzaW9uKTsKKworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXQ7CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCAwLCAicmVnaXN0ZXJzIik7CisJaWYgKHJjIDwgMCkgeworCSAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgcmVzZXJ2ZSBNTUlPIHJlZ2lvbiAocmVncylcbiIsCisJCQlEUlZfTkFNRSk7CisJICAgICAgICBnb3RvIGVycl9kaXNhYmxlXzA7CisJfQorCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDEsICJMQkkgaW50ZXJmYWNlIik7CisJaWYgKHJjIDwgMCkgeworCSAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgcmVzZXJ2ZSBNTUlPIHJlZ2lvbiAobGJpKVxuIiwKKwkJCURSVl9OQU1FKTsKKwkgICAgICAgIGdvdG8gZXJyX2ZyZWVfbW1pb19yZWdpb25fMTsKKwl9CisKKwlpb2FkZHIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKKwkJCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJaWYgKCFpb2FkZHIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IHJlbWFwIE1NSU8gcmVnaW9uICVseCBAICVseFxuIiwKKwkJCURSVl9OQU1FLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApLAorCQkJcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9mcmVlX21taW9fcmVnaW9uc18yOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiU2llbWVucyBEU0NDNCwgTU1JTyBhdCAlI2x4IChyZWdzKSwgJSNseCAobGJpKSwgSVJRICVkXG4iLAorCSAgICAgICAgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAorCSAgICAgICAgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpLCBwZGV2LT5pcnEpOworCisJLyogQ2YgZXJyYXRhIERTNSBwLjIgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4ZjgpOworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmMgPSBkc2NjNF9mb3VuZDEocGRldiwgaW9hZGRyKTsKKwlpZiAocmMgPCAwKQorCSAgICAgICAgZ290byBlcnJfaW91bm1hcF8zOworCisJcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJjID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBkc2NjNF9pcnEsIFNBX1NISVJRLCBEUlZfTkFNRSwgcHJpdi0+cm9vdCk7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSVJRICVkIGJ1c3lcbiIsIERSVl9OQU1FLCBwZGV2LT5pcnEpOworCQlnb3RvIGVycl9yZWxlYXNlXzQ7CisJfQorCisJLyogcG93ZXIgdXAvbGl0dGxlIGVuZGlhbi9kbWEgY29yZSBjb250cm9sbGVkIHZpYSBscmRhL2x0ZGEgKi8KKwl3cml0ZWwoMHgwMDAwMDAwMSwgaW9hZGRyICsgR01PREUpOworCS8qIFNoYXJlZCBpbnRlcnJ1cHQgcXVldWUgKi8KKwl7CisJCXUzMiBiaXRzOworCisJCWJpdHMgPSAoSVJRX1JJTkdfU0laRSA+PiA1KSAtIDE7CisJCWJpdHMgfD0gYml0cyA8PCA0OworCQliaXRzIHw9IGJpdHMgPDwgODsKKwkJYml0cyB8PSBiaXRzIDw8IDE2OworCQl3cml0ZWwoYml0cywgaW9hZGRyICsgSVFMRU5SMCk7CisJfQorCS8qIEdsb2JhbCBpbnRlcnJ1cHQgcXVldWUgKi8KKwl3cml0ZWwoKHUzMikoKChJUlFfUklOR19TSVpFID4+IDUpIC0gMSkgPDwgMjApLCBpb2FkZHIgKyBJUUxFTlIxKTsKKwlwcml2LT5pcWNmZyA9ICh1MzIgKikgcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwKKwkJSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwgJnByaXYtPmlxY2ZnX2RtYSk7CisJaWYgKCFwcml2LT5pcWNmZykKKwkJZ290byBlcnJfZnJlZV9pcnFfNTsKKwl3cml0ZWwocHJpdi0+aXFjZmdfZG1hLCBpb2FkZHIgKyBJUUNGRyk7CisKKwlyYyA9IC1FTk9NRU07CisKKwkvKgorCSAqIFNDQyAwLTMgcHJpdmF0ZSByeC90eCBpcnEgc3RydWN0dXJlcworCSAqIElRUlgvVFhpIG5lZWRzIHRvIGJlIHNldCBzb29uLiBMZWFybmVkIGl0IHRoZSBoYXJkIHdheS4uLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBkZXZfcGVyX2NhcmQ7IGkrKykgeworCQlkcHJpdiA9IHByaXYtPnJvb3QgKyBpOworCQlkcHJpdi0+aXF0eCA9ICh1MzIgKikgcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwKKwkJCUlSUV9SSU5HX1NJWkUqc2l6ZW9mKHUzMiksICZkcHJpdi0+aXF0eF9kbWEpOworCQlpZiAoIWRwcml2LT5pcXR4KQorCQkJZ290byBlcnJfZnJlZV9pcXR4XzY7CisJCXdyaXRlbChkcHJpdi0+aXF0eF9kbWEsIGlvYWRkciArIElRVFgwICsgaSo0KTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGRldl9wZXJfY2FyZDsgaSsrKSB7CisJCWRwcml2ID0gcHJpdi0+cm9vdCArIGk7CisJCWRwcml2LT5pcXJ4ID0gKHUzMiAqKSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LAorCQkJSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwgJmRwcml2LT5pcXJ4X2RtYSk7CisJCWlmICghZHByaXYtPmlxcngpCisJCQlnb3RvIGVycl9mcmVlX2lxcnhfNzsKKwkJd3JpdGVsKGRwcml2LT5pcXJ4X2RtYSwgaW9hZGRyICsgSVFSWDAgKyBpKjQpOworCX0KKworCS8qIENmIGFwcGxpY2F0aW9uIGhpbnQuIEJld2FyZSBvZiBoYXJkLWxvY2sgY29uZGl0aW9uIG9uIHRocmVzaG9sZC4gKi8KKwl3cml0ZWwoMHg0MjEwNDAwMCwgaW9hZGRyICsgRklGT0NSMSk7CisJLy93cml0ZWwoMHg5Y2U2OTgwMCwgaW9hZGRyICsgRklGT0NSMik7CisJd3JpdGVsKDB4ZGVmNmQ4MDAsIGlvYWRkciArIEZJRk9DUjIpOworCS8vd3JpdGVsKDB4MTExMTExMTEsIGlvYWRkciArIEZJRk9DUjQpOworCXdyaXRlbCgweDE4MTgxODE4LCBpb2FkZHIgKyBGSUZPQ1I0KTsKKwkvLyBGSVhNRTogc2hvdWxkIGRlcGVuZCBvbiB0aGUgY2hpcHNldCByZXZpc2lvbgorCXdyaXRlbCgweDAwMDAwMDBlLCBpb2FkZHIgKyBGSUZPQ1IzKTsKKworCXdyaXRlbCgweGZmMjAwMDAxLCBpb2FkZHIgKyBHQ01EUik7CisKKwlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworCitlcnJfZnJlZV9pcXJ4Xzc6CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCWRwcml2ID0gcHJpdi0+cm9vdCArIGk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwKKwkJCQkgICAgZHByaXYtPmlxcngsIGRwcml2LT5pcXJ4X2RtYSk7CisJfQorCWkgPSBkZXZfcGVyX2NhcmQ7CitlcnJfZnJlZV9pcXR4XzY6CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCWRwcml2ID0gcHJpdi0+cm9vdCArIGk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwKKwkJCQkgICAgZHByaXYtPmlxdHgsIGRwcml2LT5pcXR4X2RtYSk7CisJfQorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwgcHJpdi0+aXFjZmcsCisJCQkgICAgcHJpdi0+aXFjZmdfZG1hKTsKK2Vycl9mcmVlX2lycV81OgorCWZyZWVfaXJxKHBkZXYtPmlycSwgcHJpdi0+cm9vdCk7CitlcnJfcmVsZWFzZV80OgorCWRzY2M0X2ZyZWUxKHBkZXYpOworZXJyX2lvdW5tYXBfMzoKKwlpb3VubWFwIChpb2FkZHIpOworZXJyX2ZyZWVfbW1pb19yZWdpb25zXzI6CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDEpOworZXJyX2ZyZWVfbW1pb19yZWdpb25fMToKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CitlcnJfZGlzYWJsZV8wOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlnb3RvIG91dDsKK307CisKKy8qCisgKiBMZXQncyBob3BlIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgZGVjZW50IGVub3VnaCB0byBwcm90ZWN0IG15CisgKiBmZWV0IGZyb20gdGhlIHVzZXIncyBndW4gLSBVZWltb3IKKyAqLworc3RhdGljIHZvaWQgZHNjYzRfaW5pdF9yZWdpc3RlcnMoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBObyBpbnRlcnJ1cHRzLCBTQ0MgY29yZSBkaXNhYmxlZC4gTGV0J3MgcmVsYXggKi8KKwlzY2Nfd3JpdGVsKDB4MDAwMDAwMDAsIGRwcml2LCBkZXYsIENDUjApOworCisJc2NjX3dyaXRlbChMZW5ndGhDaGVjayB8IChIRExDX01BWF9NUlUgPj4gNSksIGRwcml2LCBkZXYsIFJMQ1IpOworCisJLyoKKwkgKiBObyBhZGRyZXNzIHJlY29nbml0aW9uL2NyYy1DQ0lUVC9jdHMgZW5hYmxlZAorCSAqIFNoYXJlZCBmbGFncyB0cmFuc21pc3Npb24gZGlzYWJsZWQgLSBjZiBlcnJhdGEgRFM1IHAuMTEKKwkgKiBDYXJyaWVyIGRldGVjdCBkaXNhYmxlZCAtIGNmIGVycmF0YSBwLjE0CisJICogRklYTUU6IGNhcnJpZXIgZGV0ZWN0aW9uL3BvbGFyaXR5IG1heSBiZSBoYW5kbGVkIG1vcmUgZ3JhY2VmdWxseS4KKwkgKi8KKwlzY2Nfd3JpdGVsKDB4MDI0MDgwMDAsIGRwcml2LCBkZXYsIENDUjEpOworCisJLyogY3JjIG5vdCBmb3J3YXJkZWQgLSBDZiBlcnJhdGEgRFM1IHAuMTEgKi8KKwlzY2Nfd3JpdGVsKDB4MDAwNTAwMDggJiB+UnhBY3RpdmF0ZSwgZHByaXYsIGRldiwgQ0NSMik7CisJLy8gY3JjIGZvcndhcmRlZAorCS8vc2NjX3dyaXRlbCgweDAwMjUwMDA4ICYgflJ4QWN0aXZhdGUsIGRwcml2LCBkZXYsIENDUjIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkc2NjNF9zZXRfcXVhcnR6KHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsIGludCBoeikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICgoaHogPCAwKSB8fCAoaHogPiBEU0NDNF9IWl9NQVgpKQorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwllbHNlCisJCWRwcml2LT5wY2lfcHJpdi0+eHRhbF9oeiA9IGh6OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkc2NjNF9mb3VuZDEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXN0cnVjdCBkc2NjNF9wY2lfcHJpdiAqcHByaXY7CisJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpyb290OworCWludCBpLCByZXQgPSAtRU5PTUVNOworCisJcm9vdCA9IGttYWxsb2MoZGV2X3Blcl9jYXJkKnNpemVvZigqcm9vdCksIEdGUF9LRVJORUwpOworCWlmICghcm9vdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBhbGxvY2F0ZSBkYXRhXG4iLCBEUlZfTkFNRSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJbWVtc2V0KHJvb3QsIDAsIGRldl9wZXJfY2FyZCpzaXplb2YoKnJvb3QpKTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZfcGVyX2NhcmQ7IGkrKykgeworCQlyb290W2ldLmRldiA9IGFsbG9jX2hkbGNkZXYocm9vdCArIGkpOworCQlpZiAoIXJvb3RbaV0uZGV2KQorCQkJZ290byBlcnJfZnJlZV9kZXY7CisJfQorCisJcHByaXYgPSBrbWFsbG9jKHNpemVvZigqcHByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBwcml2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGFsbG9jYXRlIHByaXZhdGUgZGF0YVxuIiwgRFJWX05BTUUpOworCQlnb3RvIGVycl9mcmVlX2RldjsKKwl9CisJbWVtc2V0KHBwcml2LCAwLCBzaXplb2Yoc3RydWN0IGRzY2M0X3BjaV9wcml2KSk7CisKKwlwcHJpdi0+cm9vdCA9IHJvb3Q7CisJc3Bpbl9sb2NrX2luaXQoJnBwcml2LT5sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZfcGVyX2NhcmQ7IGkrKykgeworCQlzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2ID0gcm9vdCArIGk7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkID0gZHNjYzRfdG9fZGV2KGRwcml2KTsKKwkJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkKTsKKworCSAgICAgICAgZC0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9hZGRyOworCQlkLT5pbml0ID0gTlVMTDsKKwkgICAgICAgIGQtPmlycSA9IHBkZXYtPmlycTsKKwkgICAgICAgIGQtPm9wZW4gPSBkc2NjNF9vcGVuOworCSAgICAgICAgZC0+c3RvcCA9IGRzY2M0X2Nsb3NlOworCQlkLT5zZXRfbXVsdGljYXN0X2xpc3QgPSBOVUxMOworCSAgICAgICAgZC0+ZG9faW9jdGwgPSBkc2NjNF9pb2N0bDsKKwkJZC0+dHhfdGltZW91dCA9IGRzY2M0X3R4X3RpbWVvdXQ7CisJCWQtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKwkJU0VUX01PRFVMRV9PV05FUihkKTsKKwkJU0VUX05FVERFVl9ERVYoZCwgJnBkZXYtPmRldik7CisKKwkJZHByaXYtPmRldl9pZCA9IGk7CisJCWRwcml2LT5wY2lfcHJpdiA9IHBwcml2OworCQlkcHJpdi0+YmFzZV9hZGRyID0gaW9hZGRyOworCQlzcGluX2xvY2tfaW5pdCgmZHByaXYtPmxvY2spOworCisJCWhkbGMtPnhtaXQgPSBkc2NjNF9zdGFydF94bWl0OworCQloZGxjLT5hdHRhY2ggPSBkc2NjNF9oZGxjX2F0dGFjaDsKKworCQlkc2NjNF9pbml0X3JlZ2lzdGVycyhkcHJpdiwgZCk7CisJCWRwcml2LT5wYXJpdHkgPSBQQVJJVFlfQ1JDMTZfUFIwX0NDSVRUOworCQlkcHJpdi0+ZW5jb2RpbmcgPSBFTkNPRElOR19OUlo7CisJCisJCXJldCA9IGRzY2M0X2luaXRfcmluZyhkKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycl91bnJlZ2lzdGVyOworCisJCXJldCA9IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGQpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHJlZ2lzdGVyXG4iLCBEUlZfTkFNRSk7CisJCQlkc2NjNF9yZWxlYXNlX3JpbmcoZHByaXYpOworCQkJZ290byBlcnJfdW5yZWdpc3RlcjsKKwkgICAgICAgIH0KKwl9CisKKwlyZXQgPSBkc2NjNF9zZXRfcXVhcnR6KHJvb3QsIHF1YXJ0eik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VucmVnaXN0ZXI7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgcHByaXYpOworCXJldHVybiByZXQ7CisKK2Vycl91bnJlZ2lzdGVyOgorCXdoaWxlIChpLS0gPiAwKSB7CisJCWRzY2M0X3JlbGVhc2VfcmluZyhyb290ICsgaSk7CisJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UoZHNjYzRfdG9fZGV2KHJvb3QgKyBpKSk7CisJfQorCWtmcmVlKHBwcml2KTsKKwlpID0gZGV2X3Blcl9jYXJkOworZXJyX2ZyZWVfZGV2OgorCXdoaWxlIChpLS0gPiAwKQorCQlmcmVlX25ldGRldihyb290W2ldLmRldik7CisJa2ZyZWUocm9vdCk7CitlcnJfb3V0OgorCXJldHVybiByZXQ7Cit9OworCisvKiBGSVhNRTogZ2V0IHJpZCBvZiB0aGUgdW5uZWVkZWQgY29kZSAqLworc3RhdGljIHZvaWQgZHNjYzRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYgPSBkc2NjNF9wcml2KGRldik7CisvLwlzdHJ1Y3QgZHNjYzRfcGNpX3ByaXYgKnBwcml2OworCisJZ290byBkb25lOworZG9uZToKKyAgICAgICAgZHByaXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgVFhfVElNRU9VVDsKKyAgICAgICAgYWRkX3RpbWVyKCZkcHJpdi0+dGltZXIpOworfQorCitzdGF0aWMgdm9pZCBkc2NjNF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogRklYTUU6IHNvbWV0aGluZyBpcyBtaXNzaW5nIHRoZXJlICovCit9CisKK3N0YXRpYyBpbnQgZHNjYzRfbG9vcGJhY2tfY2hlY2soc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdikKK3sKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyAqc2V0dGluZ3MgPSAmZHByaXYtPnNldHRpbmdzOworCisJaWYgKHNldHRpbmdzLT5sb29wYmFjayAmJiAoc2V0dGluZ3MtPmNsb2NrX3R5cGUgIT0gQ0xPQ0tfSU5UKSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHNjYzRfdG9fZGV2KGRwcml2KTsKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogbG9vcGJhY2sgcmVxdWlyZXMgY2xvY2tcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfRFNDQzRfUENJX1JTVAorLyoKKyAqIFNvbWUgRFNDQzQtYmFzZWQgY2FyZHMgd2lyZXMgdGhlIEdQSU8gcG9ydCBhbmQgdGhlIFBDSSAjUlNUIHBpbiB0b2dldGhlcgorICogc28gYXMgdG8gcHJvdmlkZSBhIHNhZmUgd2F5IHRvIHJlc2V0IHRoZSBhc2ljIHdoaWxlIG5vdCB0aGUgd2hvbGUgbWFjaGluZQorICogcmVib290aW5nLgorICoKKyAqIFRoaXMgY29kZSBkb2Vzbid0IG5lZWQgdG8gYmUgZWZmaWNpZW50LiBLZWVwIEl0IFNpbXBsZQorICovCitzdGF0aWMgdm9pZCBkc2NjNF9wY2lfcmVzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCWludCBpOworCisJZG93bigmZHNjYzRfc2VtKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGkgPDwgMiwgZHNjYzRfcGNpX2NvbmZpZ19zdG9yZSArIGkpOworCisJLyogTWF4aW1hbCBMQkkgY2xvY2sgZGl2aWRlciAod2hvIGNhcmVzID8pIGFuZCB3aG9sZSBHUElPIHJhbmdlLiAqLworCXdyaXRlbCgweDAwMWMwMDAwLCBpb2FkZHIgKyBHTU9ERSk7CisJLyogQ29uZmlndXJlIEdQSU8gcG9ydCBhcyBvdXRwdXQgKi8KKwl3cml0ZWwoMHgwMDAwZmZmZiwgaW9hZGRyICsgR1BESVIpOworCS8qIERpc2FibGUgaW50ZXJydXB0aW9uICovCisJd3JpdGVsKDB4MDAwMGZmZmYsIGlvYWRkciArIEdQSU0pOworCisJd3JpdGVsKDB4MDAwMGZmZmYsIGlvYWRkciArIEdQREFUQSk7CisJd3JpdGVsKDB4MDAwMDAwMDAsIGlvYWRkciArIEdQREFUQSk7CisKKwkvKiBGbHVzaCBwb3N0ZWQgd3JpdGVzICovCisJcmVhZGwoaW9hZGRyICsgR1NUQVIpOworCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoMTApOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgaSA8PCAyLCBkc2NjNF9wY2lfY29uZmlnX3N0b3JlW2ldKTsKKwl1cCgmZHNjYzRfc2VtKTsKK30KKyNlbHNlCisjZGVmaW5lIGRzY2M0X3BjaV9yZXNldChwZGV2LGlvYWRkcikJZG8ge30gd2hpbGUgKDApCisjZW5kaWYgLyogQ09ORklHX0RTQ0M0X1BDSV9SU1QgKi8KKworc3RhdGljIGludCBkc2NjNF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiA9IGRzY2M0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZHNjYzRfcGNpX3ByaXYgKnBwcml2OworCWludCByZXQgPSAtRUFHQUlOOworCisJaWYgKChkc2NjNF9sb29wYmFja19jaGVjayhkcHJpdikgPCAwKSB8fCAhZGV2LT5oYXJkX3N0YXJ0X3htaXQpCisJCWdvdG8gZXJyOworCisJaWYgKChyZXQgPSBoZGxjX29wZW4oZGV2KSkpCisJCWdvdG8gZXJyOworCisJcHByaXYgPSBkcHJpdi0+cGNpX3ByaXY7CisKKwkvKgorCSAqIER1ZSB0byB2YXJpb3VzIGJ1Z3MsIHRoZXJlIGlzIG5vIHdheSB0byByZWxpYWJseSByZXNldCBhCisJICogc3BlY2lmaWMgcG9ydCAobWFudWZhY3R1cmVyJ3MgZGVwZW5kYW50IHNwZWNpYWwgUENJICNSU1Qgd2lyaW5nCisJICogYXBhcnQ6IGl0IGFmZmVjdHMgYWxsIHBvcnRzKS4gVGh1cyB0aGUgZGV2aWNlIGdvZXMgaW4gdGhlIGJlc3QKKwkgKiBzaWxlbnQgbW9kZSBwb3NzaWJsZSBhdCBkc2NjNF9jbG9zZSgpIHRpbWUgYW5kIHNpbXBseSBjbGFpbXMgdG8KKwkgKiBiZSB1cCBpZiBpdCdzIG9wZW5lZCBhZ2Fpbi4gSXQgc3RpbGwgaXNuJ3QgcG9zc2libGUgdG8gY2hhbmdlCisJICogdGhlIEhETEMgY29uZmlndXJhdGlvbiB3aXRob3V0IHJlYm9vdGluZyBidXQgYXQgbGVhc3QgdGhlIHBvcnRzCisJICogY2FuIGJlIHVwL2Rvd24gaWZjb25maWcnZWQgd2l0aG91dCBraWxsaW5nIHRoZSBob3N0LgorCSAqLworCWlmIChkcHJpdi0+ZmxhZ3MgJiBGYWtlUmVzZXQpIHsKKwkJZHByaXYtPmZsYWdzICY9IH5GYWtlUmVzZXQ7CisJCXNjY19wYXRjaGwoMCwgUG93ZXJVcCwgZHByaXYsIGRldiwgQ0NSMCk7CisJCXNjY19wYXRjaGwoMCwgMHgwMDA1MDAwMCwgZHByaXYsIGRldiwgQ0NSMik7CisJCXNjY193cml0ZWwoRXZlbnRzTWFzaywgZHByaXYsIGRldiwgSU1SKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVwIGFnYWluLlxuIiwgZGV2LT5uYW1lKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIElEVCtJRFIgZHVyaW5nIFhQUiAqLworCWRwcml2LT5mbGFncyA9IE5lZWRJRFIgfCBOZWVkSURUOworCisJc2NjX3BhdGNobCgwLCBQb3dlclVwIHwgVmlzLCBkcHJpdiwgZGV2LCBDQ1IwKTsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBpcyBhIGJpdCBwYXJhbm9pZC4uLgorCSAqCisJICogTkI6IHRoZSBkYXRhc2hlZXQgIi4uLkNFQyB3aWxsIHN0YXkgYWN0aXZlIGlmIHRoZSBTQ0MgaXMgaW4KKwkgKiBwb3dlci1kb3duIG1vZGUgb3IuLi4iIGFuZCBDQ1IyLlJBQyA9IDEgYXJlIHR3byBkaWZmZXJlbnQKKwkgKiBzaXR1YXRpb25zLgorCSAqLworCWlmIChzY2NfcmVhZGxfc3RhcihkcHJpdiwgZGV2KSAmIFNjY0J1c3kpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyBidXN5LiBUcnkgbGF0ZXJcbiIsIGRldi0+bmFtZSk7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gZXJyX291dDsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGF2YWlsYWJsZS4gR29vZFxuIiwgZGV2LT5uYW1lKTsKKworCXNjY193cml0ZWwoRXZlbnRzTWFzaywgZHByaXYsIGRldiwgSU1SKTsKKworCS8qIFBvc3RlZCB3cml0ZSBpcyBmbHVzaGVkIGluIHRoZSB3YWl0X2FjayBsb29wICovCisJc2NjX3dyaXRlbChUeFNjY1JlcyB8IFJ4U2NjUmVzLCBkcHJpdiwgZGV2LCBDTURSKTsKKworCWlmICgocmV0ID0gZHNjYzRfd2FpdF9hY2tfY2VjKGRwcml2LCBkZXYsICJDZWMiKSkgPCAwKQorCQlnb3RvIGVycl9kaXNhYmxlX3NjY19ldmVudHM7CisKKwkvKgorCSAqIEkgd291bGQgZXhwZWN0IFhQUiBuZWFyIENFIGNvbXBsZXRpb24gKGJlZm9yZSA/IGFmdGVyID8pLgorCSAqIEF0IHdvcnN0LCB0aGlzIGNvZGUgd29uJ3Qgc2VlIGEgbGF0ZSBYUFIgYW5kIHBlb3BsZQorCSAqIHdpbGwgaGF2ZSB0byByZS1pc3N1ZSBhbiBpZmNvbmZpZyAodGhpcyBpcyBoYXJtbGVzcykuCisJICogV0FSTklORywgYSByZWFsbHkgbWlzc2luZyBYUFIgdXN1YWxseSBtZWFucyBhIGhhcmR3YXJlCisJICogcmVzZXQgaXMgbmVlZGVkLiBTdWdnZXN0aW9ucyBhbnlvbmUgPworCSAqLworCWlmICgocmV0ID0gZHNjYzRfeHByX2FjayhkcHJpdikpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyB0aW1lb3V0XG4iLCBEUlZfTkFNRSwgIlhQUiIpOworCQlnb3RvIGVycl9kaXNhYmxlX3NjY19ldmVudHM7CisJfQorCQorCWlmIChkZWJ1ZyA+IDIpCisJCWRzY2M0X3R4X3ByaW50KGRldiwgZHByaXYsICJPcGVuIik7CisKK2RvbmU6CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworICAgICAgICBpbml0X3RpbWVyKCZkcHJpdi0+dGltZXIpOworICAgICAgICBkcHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxMCpIWjsKKyAgICAgICAgZHByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisgICAgICAgIGRwcml2LT50aW1lci5mdW5jdGlvbiA9ICZkc2NjNF90aW1lcjsKKyAgICAgICAgYWRkX3RpbWVyKCZkcHJpdi0+dGltZXIpOworCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKworCXJldHVybiAwOworCitlcnJfZGlzYWJsZV9zY2NfZXZlbnRzOgorCXNjY193cml0ZWwoMHhmZmZmZmZmZiwgZHByaXYsIGRldiwgSU1SKTsKKwlzY2NfcGF0Y2hsKFBvd2VyVXAgfCBWaXMsIDAsIGRwcml2LCBkZXYsIENDUjApOworZXJyX291dDoKKwloZGxjX2Nsb3NlKGRldik7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIERTQ0M0X1BPTExJTkcKK3N0YXRpYyBpbnQgZHNjYzRfdHhfcG9sbChzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIEZJWE1FOiBpdCdzIGdvbm5hIGJlIGVhc3kgKFRNKSwgZm9yIHN1cmUgKi8KK30KKyNlbmRpZiAvKiBEU0NDNF9QT0xMSU5HICovCisKK3N0YXRpYyBpbnQgZHNjYzRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYgPSBkc2NjNF9wcml2KGRldik7CisJc3RydWN0IGRzY2M0X3BjaV9wcml2ICpwcHJpdiA9IGRwcml2LT5wY2lfcHJpdjsKKwlzdHJ1Y3QgVHhGRCAqdHhfZmQ7CisJaW50IG5leHQ7CisKKwluZXh0ID0gZHByaXYtPnR4X2N1cnJlbnQlVFhfUklOR19TSVpFOworCWRwcml2LT50eF9za2J1ZmZbbmV4dF0gPSBza2I7CisJdHhfZmQgPSBkcHJpdi0+dHhfZmQgKyBuZXh0OworCXR4X2ZkLT5zdGF0ZSA9IEZyYW1lRW5kIHwgVE9fU1RBVEVfVFgoc2tiLT5sZW4pOworCXR4X2ZkLT5kYXRhID0gcGNpX21hcF9zaW5nbGUocHByaXYtPnBkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCisJCQkJICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwl0eF9mZC0+Y29tcGxldGUgPSAweDAwMDAwMDAwOworCXR4X2ZkLT5qaWZmaWVzID0gamlmZmllczsKKwltYigpOworCisjaWZkZWYgRFNDQzRfUE9MTElORworCXNwaW5fbG9jaygmZHByaXYtPmxvY2spOworCXdoaWxlIChkc2NjNF90eF9wb2xsKGRwcml2LCBkZXYpKTsKKwlzcGluX3VubG9jaygmZHByaXYtPmxvY2spOworI2VuZGlmCisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWlmIChkZWJ1ZyA+IDIpCisJCWRzY2M0X3R4X3ByaW50KGRldiwgZHByaXYsICJYbWl0Iik7CisJLyogVG8gYmUgY2xlYW5lZCh1bnNpZ25lZCBpbnQpL29wdGltaXplZC4gTGF0ZXIsIG9rID8gKi8KKwlpZiAoISgoKytkcHJpdi0+dHhfY3VycmVudCAtIGRwcml2LT50eF9kaXJ0eSklVFhfUklOR19TSVpFKSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKGRzY2M0X3R4X3F1aWVzY2VudChkcHJpdiwgZGV2KSkKKwkJZHNjYzRfZG9fdHgoZHByaXYsIGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc2NjNF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYgPSBkc2NjNF9wcml2KGRldik7CisKKwlkZWxfdGltZXJfc3luYygmZHByaXYtPnRpbWVyKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlzY2NfcGF0Y2hsKFBvd2VyVXAgfCBWaXMsIDAsIGRwcml2LCBkZXYsIENDUjApOworCXNjY19wYXRjaGwoMHgwMDA1MDAwMCwgMCwgZHByaXYsIGRldiwgQ0NSMik7CisJc2NjX3dyaXRlbCgweGZmZmZmZmZmLCBkcHJpdiwgZGV2LCBJTVIpOworCisJZHByaXYtPmZsYWdzIHw9IEZha2VSZXNldDsKKworCWhkbGNfY2xvc2UoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkc2NjNF9jaGVja19jbG9ja19hYmlsaXR5KGludCBwb3J0KQoreworCWludCByZXQgPSAwOworCisjaWZkZWYgQ09ORklHX0RTQ0M0X1BDSVNZTkMKKwlpZiAocG9ydCA+PSAyKQorCQlyZXQgPSAtMTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBEUzEgcC4xMzc6ICJUaGVyZSBhcmUgYSB0b3RhbCBvZiAxMyBkaWZmZXJlbnQgY2xvY2tpbmcgbW9kZXMuLi4iCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXgorICogRGVzaWduIGNob2ljZXM6CisgKiAtIGJ5IGRlZmF1bHQsIGFzc3VtZSBhIGNsb2NrIGlzIHByb3ZpZGVkIG9uIHBpbiBSeENsay9UeENsayAoY2xvY2sgbW9kZSAwYSkuCisgKiAgIENsb2NrIG1vZGUgM2IgX3Nob3VsZF8gd29yayBidXQgdGhlIHRlc3Rpbmcgc2VlbXMgdG8gbWFrZSB0aGlzIHBvaW50CisgKiAgIGR1YmlvdXMgKERJWSB0ZXN0aW5nIHJlcXVpcmVzIHNldHRpbmcgQ0NSMCBhdCAweDAwMDAwMDMzKS4KKyAqICAgVGhpcyBpcyBzdXBwb3NlZCB0byBwcm92aWRlIGxlYXN0IHN1cnByaXNlICJEVEUgbGlrZSIgYmVoYXZpb3IuCisgKiAtIGlmIGxpbmUgcmF0ZSBpcyBzcGVjaWZpZWQsIGNsb2NrcyBhcmUgYXNzdW1lZCB0byBiZSBsb2NhbGx5IGdlbmVyYXRlZC4KKyAqICAgQSBxdWFydHogbXVzdCBiZSBhdmFpbGFibGUgKG9uIHBpbiBYVEFMMSkuIE1vZGVzIDZiLzdiIGFyZSB1c2VkLiBDaG9vc2luZworICogICBiZXR3ZWVuIHRoZXNlIGl0IGF1dG9tYWdpY2FsbHkgZG9uZSBhY2NvcmRpbmcgb24gdGhlIHJlcXVpcmVkIGZyZXF1ZW5jeQorICogICBzY2FsaW5nLiBPZiBjb3Vyc2Ugc29tZSByb3VuZGluZyBtYXkgdGFrZSBwbGFjZS4KKyAqIC0gbm8gaGlnaCBzcGVlZCBtb2RlICg0ME1iL3MpLiBNYXkgYmUgdHJpdmlhbCB0byBkbyBidXQgSSBkb24ndCBoYXZlIGFuCisgKiAgIGFwcHJvcHJpYXRlIGV4dGVybmFsIGNsb2NraW5nIGRldmljZSBmb3IgdGVzdGluZy4KKyAqIC0gbm8gdGltZS1zbG90L2Nsb2NrIG1vZGUgNTogc2hhbWVsZXNzIGxhenluZXNzLgorICoKKyAqIFRoZSBjbG9jayBzaWduYWxzIHdpcmluZyBjYW4gYmUgKGlzID8pIG1hbnVmYWN0dXJlciBkZXBlbmRhbnQuIEdvb2QgbHVjay4KKyAqCisgKiBCSUcgRkFUIFdBUk5JTkc6IGlmIHRoZSBkZXZpY2UgaXNuJ3QgcHJvdmlkZWQgZW5vdWdoIGNsb2NraW5nIHNpZ25hbCwgaXQKKyAqIHdvbid0IHBhc3MgdGhlIGluaXQgc2VxdWVuY2UuIEZvciBleGFtcGxlLCBzdHJhaWdodCBiYWNrLXRvLWJhY2sgRFRFIHdpdGhvdXQKKyAqIGV4dGVybmFsIGNsb2NrIHdpbGwgZmFpbCB3aGVuIGRzY2M0X29wZW4oKSAoPC0gJ2lmY29uZmlnIGhkbGN4IHh4eCcpIGlzCisgKiBjYWxsZWQuCisgKgorICogVHlwb3MgbHVyayBpbiBkYXRhc2hlZXQgKG1pc3NpbmcgZGl2aWVyIGluIGNsb2NrIG1vZGUgN2EgZmlndXJlIDUxIHAuMTUzCisgKiBEUzAgZm9yIGV4YW1wbGUpCisgKgorICogQ2xvY2sgbW9kZSByZWxhdGVkIGJpdHMgb2YgQ0NSMDoKKyAqICAgICArLS0tLS0tLS0tLS0tIFRPRTogb3V0cHV0IFR4Q2xrICgwYi8yYi8zYS8zYi82Yi83YS83YiBvbmx5KQorICogICAgIHwgKy0tLS0tLS0tLS0gU1NFTDogc3ViLW1vZGUgc2VsZWN0IDAgLT4gYSwgMSAtPiBiCisgKiAgICAgfCB8ICstLS0tLS0tLSBIaWdoIFNwZWVkOiBzYXkgMAorICogICAgIHwgfCB8ICstKy0rLS0gQ2xvY2sgTW9kZTogMC4uNworICogICAgIHwgfCB8IHwgfCB8CisgKiAtKy0rLSstKy0rLSstKy0rCisgKiB4fHh8NXw0fDN8MnwxfDB8IGxvd2VyIGJpdHMKKyAqCisgKiBEaXZpc2lvbiBmYWN0b3Igb2YgQlJSOiBrID0gKE4rMSl4Ml5NICh0b3RhbCBkaXZpZGVyID0gMTZ4ayBpbiBtb2RlIDZiKQorICogICAgICAgICAgICArLSstKy0rLS0tLS0tLS0tLS0tLS0tLS0tIE0gKDAuLjE1KQorICogICAgICAgICAgICB8IHwgfCB8ICAgICArLSstKy0rLSstKy0tIE4gKDAuLjYzKQorICogICAgMCAwIDAgMCB8IHwgfCB8IDAgMCB8IHwgfCB8IHwgfAorICogLi4uLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgIGZ8ZXxkfGN8YnxhfDl8OHw3fDZ8NXw0fDN8MnwxfDB8IGxvd2VyIGJpdHMKKyAqCisgKi8KK3N0YXRpYyBpbnQgZHNjYzRfc2V0X2Nsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiAqYnBzLCB1MzIgKnN0YXRlKQoreworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYgPSBkc2NjNF9wcml2KGRldik7CisJaW50IHJldCA9IC0xOworCXUzMiBicnI7CisKKwkqc3RhdGUgJj0gfkNjcjBDbG9ja01hc2s7CisJaWYgKCpicHMpIHsgLyogQ2xvY2sgZ2VuZXJhdGVkIC0gcmVxdWlyZWQgZm9yIERDRSAqLworCQl1MzIgbiA9IDAsIG0gPSAwLCBkaXZpZGVyOworCQlpbnQgeHRhbDsKKworCQl4dGFsID0gZHByaXYtPnBjaV9wcml2LT54dGFsX2h6OworCQlpZiAoIXh0YWwpCisJCQlnb3RvIGRvbmU7CisJCWlmIChkc2NjNF9jaGVja19jbG9ja19hYmlsaXR5KGRwcml2LT5kZXZfaWQpIDwgMCkKKwkJCWdvdG8gZG9uZTsKKwkJZGl2aWRlciA9IHh0YWwgLyAqYnBzOworCQlpZiAoZGl2aWRlciA+IEJSUl9ESVZJREVSX01BWCkgeworCQkJZGl2aWRlciA+Pj0gNDsKKwkJCSpzdGF0ZSB8PSAweDAwMDAwMDM2OyAvKiBDbG9jayBtb2RlIDZiIChCUkcvMTYpICovCisJCX0gZWxzZQorCQkJKnN0YXRlIHw9IDB4MDAwMDAwMzc7IC8qIENsb2NrIG1vZGUgN2IgKEJSRykgKi8KKwkJaWYgKGRpdmlkZXIgPj4gMjIpIHsKKwkJCW4gPSA2MzsKKwkJCW0gPSAxNTsKKwkJfSBlbHNlIGlmIChkaXZpZGVyKSB7CisJCQkvKiBFeHRyYWN0aW9uIG9mIHRoZSA2IGhpZ2hlc3Qgd2VpZ2h0ZWQgYml0cyAqLworCQkJbSA9IDA7CisJCQl3aGlsZSAoMHhmZmZmZmZjMCAmIGRpdmlkZXIpIHsKKwkJCQltKys7CisJCQkJZGl2aWRlciA+Pj0gMTsKKwkJCX0KKwkJCW4gPSBkaXZpZGVyOworCQl9CisJCWJyciA9IChtIDw8IDgpIHwgbjsKKwkJZGl2aWRlciA9IG4gPDwgbTsKKwkJaWYgKCEoKnN0YXRlICYgMHgwMDAwMDAwMSkpIC8qID9iIG1vZGUgbWFzayA9PiBjbG9jayBtb2RlIDZiICovCisJCQlkaXZpZGVyIDw8PSA0OworCQkqYnBzID0geHRhbCAvIGRpdmlkZXI7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRXh0ZXJuYWwgY2xvY2sgLSBEVEUKKwkJICogInN0YXRlIiBhbHJlYWR5IHJlZmxlY3RzIENsb2NrIG1vZGUgMGEgKENDUjAgPSAweHp6enp6ejAwKS4KKwkJICogTm90aGluZyBtb3JlIHRvIGJlIGRvbmUKKwkJICovCisJCWJyciA9IDA7CisJfQorCXNjY193cml0ZWwoYnJyLCBkcHJpdiwgZGV2LCBCUlIpOworCXJldCA9IDA7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHNjYzRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgX191c2VyICpsaW5lID0gaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYzsKKwlzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2ID0gZHNjYzRfcHJpdihkZXYpOworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKGRwcml2LT5zZXR0aW5ncyk7CisJaW50IHJldCA9IDA7CisKKyAgICAgICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKworCWlmIChjbWQgIT0gU0lPQ1dBTkRFVikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc3dpdGNoKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX0dFVF9JRkFDRToKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX0lGQUNFX1NZTkNfU0VSSUFMOworCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemUpIHsKKwkJCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplOyAvKiBkYXRhIHNpemUgd2FudGVkICovCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihsaW5lLCAmZHByaXYtPnNldHRpbmdzLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgSUZfSUZBQ0VfU1lOQ19TRVJJQUw6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGRwcml2LT5mbGFncyAmIEZha2VSZXNldCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBsZWFzZSByZXNldCB0aGUgZGV2aWNlIgorCQkJICAgICAgICIgYmVmb3JlIHRoaXMgY29tbWFuZFxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkcHJpdi0+c2V0dGluZ3MsIGxpbmUsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldCA9IGRzY2M0X3NldF9pZmFjZShkcHJpdiwgZGV2KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzY2M0X21hdGNoKHN0cnVjdCB0aGluZ2llICpwLCBpbnQgdmFsdWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBwW2ldLmRlZmluZSAhPSAtMTsgaSsrKSB7CisJCWlmICh2YWx1ZSA9PSBwW2ldLmRlZmluZSkKKwkJCWJyZWFrOworCX0KKwlpZiAocFtpXS5kZWZpbmUgPT0gLTEpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGRzY2M0X2Nsb2NrX3NldHRpbmcoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN5bmNfc2VyaWFsX3NldHRpbmdzICpzZXR0aW5ncyA9ICZkcHJpdi0+c2V0dGluZ3M7CisJaW50IHJldCA9IC1FT1BOT1RTVVBQOworCXUzMiBicHMsIHN0YXRlOworCisJYnBzID0gc2V0dGluZ3MtPmNsb2NrX3JhdGU7CisJc3RhdGUgPSBzY2NfcmVhZGwoZHByaXYsIENDUjApOworCWlmIChkc2NjNF9zZXRfY2xvY2soZGV2LCAmYnBzLCAmc3RhdGUpIDwgMCkKKwkJZ290byBkb25lOworCWlmIChicHMpIHsgLyogRENFICovCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZ2VuZXJhdGVkIFJ4Q2xrIChEQ0UpXG4iLCBkZXYtPm5hbWUpOworCQlpZiAoc2V0dGluZ3MtPmNsb2NrX3JhdGUgIT0gYnBzKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNsb2NrIGFkanVzdGVkICglMDhkIC0+ICUwOGQpXG4iLAorCQkJCWRldi0+bmFtZSwgc2V0dGluZ3MtPmNsb2NrX3JhdGUsIGJwcyk7CisJCQlzZXR0aW5ncy0+Y2xvY2tfcmF0ZSA9IGJwczsKKwkJfQorCX0gZWxzZSB7IC8qIERURSAqLworCQlzdGF0ZSB8PSBQb3dlclVwIHwgVmlzOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4dGVybmFsIFJ4Q2xrIChEVEUpXG4iLCBkZXYtPm5hbWUpOworCX0KKwlzY2Nfd3JpdGVsKHN0YXRlLCBkcHJpdiwgZGV2LCBDQ1IwKTsKKwlyZXQgPSAwOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzY2M0X2VuY29kaW5nX3NldHRpbmcoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRoaW5naWUgZW5jb2RpbmdbXSA9IHsKKwkJeyBFTkNPRElOR19OUlosCQkweDAwMDAwMDAwIH0sCisJCXsgRU5DT0RJTkdfTlJaSSwJMHgwMDIwMDAwMCB9LAorCQl7IEVOQ09ESU5HX0ZNX01BUkssCTB4MDA0MDAwMDAgfSwKKwkJeyBFTkNPRElOR19GTV9TUEFDRSwJMHgwMDUwMDAwMCB9LAorCQl7IEVOQ09ESU5HX01BTkNIRVNURVIsCTB4MDA2MDAwMDAgfSwKKwkJeyAtMSwJCQkwfQorCX07CisJaW50IGksIHJldCA9IDA7CisKKwlpID0gZHNjYzRfbWF0Y2goZW5jb2RpbmcsIGRwcml2LT5lbmNvZGluZyk7CisJaWYgKGkgPj0gMCkKKwkJc2NjX3BhdGNobChFbmNvZGluZ01hc2ssIGVuY29kaW5nW2ldLmJpdHMsIGRwcml2LCBkZXYsIENDUjApOworCWVsc2UKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkc2NjNF9sb29wYmFja19zZXR0aW5nKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsCisJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN5bmNfc2VyaWFsX3NldHRpbmdzICpzZXR0aW5ncyA9ICZkcHJpdi0+c2V0dGluZ3M7CisJdTMyIHN0YXRlOworCisJc3RhdGUgPSBzY2NfcmVhZGwoZHByaXYsIENDUjEpOworCWlmIChzZXR0aW5ncy0+bG9vcGJhY2spIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBsb29wYmFja1xuIiwgZGV2LT5uYW1lKTsKKwkJc3RhdGUgfD0gMHgwMDAwMDEwMDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5vcm1hbFxuIiwgZGV2LT5uYW1lKTsKKwkJc3RhdGUgJj0gfjB4MDAwMDAxMDA7CisJfQorCXNjY193cml0ZWwoc3RhdGUsIGRwcml2LCBkZXYsIENDUjEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzY2M0X2NyY19zZXR0aW5nKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsCisJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRoaW5naWUgY3JjW10gPSB7CisJCXsgUEFSSVRZX0NSQzE2X1BSMF9DQ0lUVCwJMHgwMDAwMDAxMCB9LAorCQl7IFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQsCTB4MDAwMDAwMDAgfSwKKwkJeyBQQVJJVFlfQ1JDMzJfUFIwX0NDSVRULAkweDAwMDAwMDExIH0sCisJCXsgUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVCwJMHgwMDAwMDAwMSB9CisJfTsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWkgPSBkc2NjNF9tYXRjaChjcmMsIGRwcml2LT5wYXJpdHkpOworCWlmIChpID49IDApCisJCXNjY19wYXRjaGwoQ3JjTWFzaywgY3JjW2ldLmJpdHMsIGRwcml2LCBkZXYsIENDUjEpOworCWVsc2UKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkc2NjNF9zZXRfaWZhY2Uoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeworCQlpbnQgKCphY3Rpb24pKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKwl9ICpwLCBkb19zZXR0aW5nW10gPSB7CisJCXsgZHNjYzRfZW5jb2Rpbmdfc2V0dGluZyB9LAorCQl7IGRzY2M0X2Nsb2NrX3NldHRpbmcgfSwKKwkJeyBkc2NjNF9sb29wYmFja19zZXR0aW5nIH0sCisJCXsgZHNjYzRfY3JjX3NldHRpbmcgfSwKKwkJeyBOVUxMIH0KKwl9OworCWludCByZXQgPSAwOworCisJZm9yIChwID0gZG9fc2V0dGluZzsgcC0+YWN0aW9uOyBwKyspIHsKKwkJaWYgKChyZXQgPSBwLT5hY3Rpb24oZHByaXYsIGRldikpIDwgMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZHNjYzRfaXJxKGludCBpcnEsIHZvaWQgKnRva2VuLCBzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzKQoreworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqcm9vdCA9IHRva2VuOworCXN0cnVjdCBkc2NjNF9wY2lfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCXUzMiBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLCBoYW5kbGVkID0gMTsKKworCXByaXYgPSByb290LT5wY2lfcHJpdjsKKwlkZXYgPSBkc2NjNF90b19kZXYocm9vdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJaW9hZGRyID0gcm9vdC0+YmFzZV9hZGRyOworCisJc3RhdGUgPSByZWFkbChpb2FkZHIgKyBHU1RBUik7CisJaWYgKCFzdGF0ZSkgeworCQloYW5kbGVkID0gMDsKKwkJZ290byBvdXQ7CisJfQorCWlmIChkZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogR1NUQVIgPSAweCUwOHhcbiIsIERSVl9OQU1FLCBzdGF0ZSk7CisJd3JpdGVsKHN0YXRlLCBpb2FkZHIgKyBHU1RBUik7CisKKwlpZiAoc3RhdGUgJiBBcmYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbHVyZSAoQXJmKS4gSGFyYXNzIHRoZSBtYWludGVuZXJcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisJc3RhdGUgJj0gfkFyQWNrOworCWlmIChzdGF0ZSAmIENmZykgeworCQlpZiAoZGVidWcgPiAwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDZmdJVlxuIiwgRFJWX05BTUUpOworCQlpZiAocHJpdi0+aXFjZmdbcHJpdi0+Y2ZnX2N1cisrJUlSUV9SSU5HX1NJWkVdICYgQXJmKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgZmFpbGVkXG4iLCBkZXYtPm5hbWUsICJDRkciKTsKKwkJaWYgKCEoc3RhdGUgJj0gfkNmZykpCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKHN0YXRlICYgUnhFdnQpIHsKKwkJaSA9IGRldl9wZXJfY2FyZCAtIDE7CisJCWRvIHsKKwkJCWRzY2M0X3J4X2lycShwcml2LCByb290ICsgaSk7CisJCX0gd2hpbGUgKC0taSA+PSAwKTsKKwkJc3RhdGUgJj0gflJ4RXZ0OworCX0KKwlpZiAoc3RhdGUgJiBUeEV2dCkgeworCQlpID0gZGV2X3Blcl9jYXJkIC0gMTsKKwkJZG8geworCQkJZHNjYzRfdHhfaXJxKHByaXYsIHJvb3QgKyBpKTsKKwkJfSB3aGlsZSAoLS1pID49IDApOworCQlzdGF0ZSAmPSB+VHhFdnQ7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIHZvaWQgZHNjYzRfdHhfaXJxKHN0cnVjdCBkc2NjNF9wY2lfcHJpdiAqcHByaXYsCisJCQkJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHNjYzRfdG9fZGV2KGRwcml2KTsKKwl1MzIgc3RhdGU7CisJaW50IGN1ciwgbG9vcCA9IDA7CisKK3RyeToKKwljdXIgPSBkcHJpdi0+aXF0eF9jdXJyZW50JUlSUV9SSU5HX1NJWkU7CisJc3RhdGUgPSBkcHJpdi0+aXF0eFtjdXJdOworCWlmICghc3RhdGUpIHsKKwkJaWYgKGRlYnVnID4gNCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHggSVNSID0gMHglMDh4XG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgc3RhdGUpOworCQlpZiAoKGRlYnVnID4gMSkgJiYgKGxvb3AgPiAxKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHggaXJxIGxvb3A9JWRcbiIsIGRldi0+bmFtZSwgbG9vcCk7CisJCWlmIChsb29wICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJCWlmICgoZHByaXYtPnR4X2N1cnJlbnQgLSBkcHJpdi0+dHhfZGlydHkpJVRYX1JJTkdfU0laRSkKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiBkc2NjNF90eF9xdWllc2NlbnQoZHByaXYsIGRldikgJiYKKwkJICAgICFkc2NjNF90eF9kb25lKGRwcml2KSkKKwkJCQlkc2NjNF9kb190eChkcHJpdiwgZGV2KTsKKwkJcmV0dXJuOworCX0KKwlsb29wKys7CisJZHByaXYtPmlxdHhbY3VyXSA9IDA7CisJZHByaXYtPmlxdHhfY3VycmVudCsrOworCisJaWYgKHN0YXRlX2NoZWNrKHN0YXRlLCBkcHJpdiwgZGV2LCAiVHgiKSA8IDApCisJCXJldHVybjsKKworCWlmIChzdGF0ZSAmIFNjY0V2dCkgeworCQlpZiAoc3RhdGUgJiBBbGxzKSB7CisJCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJc3RydWN0IFR4RkQgKnR4X2ZkOworCisJCQlpZiAoZGVidWcgPiAyKQorCQkJCWRzY2M0X3R4X3ByaW50KGRldiwgZHByaXYsICJBbGxzIik7CisJCQkvKgorCQkJICogRGF0YUNvbXBsZXRlIGNhbid0IGJlIHRydXN0ZWQgZm9yIFR4IGNvbXBsZXRpb24uCisJCQkgKiBDZiBlcnJhdGEgRFM1IHAuOAorCQkJICovCisJCQljdXIgPSBkcHJpdi0+dHhfZGlydHklVFhfUklOR19TSVpFOworCQkJdHhfZmQgPSBkcHJpdi0+dHhfZmQgKyBjdXI7CisJCQlza2IgPSBkcHJpdi0+dHhfc2tidWZmW2N1cl07CisJCQlpZiAoc2tiKSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShwcHJpdi0+cGRldiwgdHhfZmQtPmRhdGEsCisJCQkJCQkgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCWlmICh0eF9mZC0+c3RhdGUgJiBGcmFtZUVuZCkgeworCQkJCQlzdGF0cy0+dHhfcGFja2V0cysrOworCQkJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJfQorCQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQkJZHByaXYtPnR4X3NrYnVmZltjdXJdID0gTlVMTDsKKwkJCQkrK2Rwcml2LT50eF9kaXJ0eTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRlYnVnID4gMSkKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBUeDogTlVMTCBza2IgJWRcbiIsCisJCQkJCQlkZXYtPm5hbWUsIGN1cik7CisJCQl9CisJCQkvKgorCQkJICogSWYgdGhlIGRyaXZlciBlbmRzIHNlbmRpbmcgY3JhcCBvbiB0aGUgd2lyZSwgaXQKKwkJCSAqIHdpbGwgYmUgd2F5IGVhc2llciB0byBkaWFnbm9zZSB0aGFuIHRoZSAobm90IHNvKQorCQkJICogcmFuZG9tIGZyZWV6ZSBpbmR1Y2VkIGJ5IG51bGwgc2l6ZWQgdHggZnJhbWVzLgorCQkJICovCisJCQl0eF9mZC0+ZGF0YSA9IHR4X2ZkLT5uZXh0OworCQkJdHhfZmQtPnN0YXRlID0gRnJhbWVFbmQgfCBUT19TVEFURV9UWCgyKkRVTU1ZX1NLQl9TSVpFKTsKKwkJCXR4X2ZkLT5jb21wbGV0ZSA9IDB4MDAwMDAwMDA7CisJCQl0eF9mZC0+amlmZmllcyA9IDA7CisKKwkJCWlmICghKHN0YXRlICY9IH5BbGxzKSkKKwkJCQlnb3RvIHRyeTsKKwkJfQorCQkvKgorCQkgKiBUcmFuc21pdCBEYXRhIFVuZGVycnVuCisJCSAqLworCQlpZiAoc3RhdGUgJiBYZHUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFhEVS4gQXNrIG1haW50YWluZXJcbiIsIERSVl9OQU1FKTsKKwkJCWRwcml2LT5mbGFncyA9IE5lZWRJRFQ7CisJCQkvKiBUeCByZXNldCAqLworCQkJd3JpdGVsKE1URmkgfCBSZHQsCisJCQkgICAgICAgZHByaXYtPmJhc2VfYWRkciArIDB4MGMqZHByaXYtPmRldl9pZCArIENIMENGRyk7CisJCQl3cml0ZWwoQWN0aW9uLCBkcHJpdi0+YmFzZV9hZGRyICsgR0NNRFIpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChzdGF0ZSAmIEN0cykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENUUyB0cmFuc2l0aW9uXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKCEoc3RhdGUgJj0gfkN0cykpIC8qIERFQlVHICovCisJCQkJZ290byB0cnk7CisJCX0KKwkJaWYgKHN0YXRlICYgWG1yKSB7CisJCQkvKiBGcmFtZSBuZWVkcyB0byBiZSBzZW50IGFnYWluIC0gRklYTUUgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFhtci4gQXNrIG1haW50YWluZXJcbiIsIERSVl9OQU1FKTsKKwkJCWlmICghKHN0YXRlICY9IH5YbXIpKSAvKiBERUJVRyAqLworCQkJCWdvdG8gdHJ5OworCQl9CisJCWlmIChzdGF0ZSAmIFhwcikgeworCQkJdm9pZCBfX2lvbWVtICpzY2NfYWRkcjsKKwkJCXVuc2lnbmVkIGxvbmcgcmluZzsKKwkJCWludCBpOworCisJCQkvKgorCQkJICogLSB0aGUgYnVzeSBjb25kaXRpb24gaGFwcGVucyAoc29tZXRpbWVzKTsKKwkJCSAqIC0gaXQgZG9lc24ndCBzZWVtIHRvIG1ha2UgdGhlIGhhbmRsZXIgdW5yZWxpYWJsZS4KKwkJCSAqLworCQkJZm9yIChpID0gMTsgaTsgaSA8PD0gMSkgeworCQkJCWlmICghKHNjY19yZWFkbF9zdGFyKGRwcml2LCBkZXYpICYgU2NjQnVzeSkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFpKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzIGJ1c3kgaW4gaXJxXG4iLCBkZXYtPm5hbWUpOworCisJCQlzY2NfYWRkciA9IGRwcml2LT5iYXNlX2FkZHIgKyAweDBjKmRwcml2LT5kZXZfaWQ7CisJCQkvKiBLZWVwIHRoaXMgb3JkZXI6IElEVCBiZWZvcmUgSURSICovCisJCQlpZiAoZHByaXYtPmZsYWdzICYgTmVlZElEVCkgeworCQkJCWlmIChkZWJ1ZyA+IDIpCisJCQkJCWRzY2M0X3R4X3ByaW50KGRldiwgZHByaXYsICJYcHIiKTsKKwkJCQlyaW5nID0gZHByaXYtPnR4X2ZkX2RtYSArCisJCQkJICAgICAgIChkcHJpdi0+dHhfZGlydHklVFhfUklOR19TSVpFKSoKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBUeEZEKTsKKwkJCQl3cml0ZWwocmluZywgc2NjX2FkZHIgKyBDSDBCVERBKTsKKwkJCQlkc2NjNF9kb190eChkcHJpdiwgZGV2KTsKKwkJCQl3cml0ZWwoTVRGaSB8IElkdCwgc2NjX2FkZHIgKyBDSDBDRkcpOworCQkJCWlmIChkc2NjNF9kb19hY3Rpb24oZGV2LCAiSURUIikgPCAwKQorCQkJCQlnb3RvIGVycl94cHI7CisJCQkJZHByaXYtPmZsYWdzICY9IH5OZWVkSURUOworCQkJfQorCQkJaWYgKGRwcml2LT5mbGFncyAmIE5lZWRJRFIpIHsKKwkJCQlyaW5nID0gZHByaXYtPnJ4X2ZkX2RtYSArCisJCQkJICAgICAgIChkcHJpdi0+cnhfY3VycmVudCVSWF9SSU5HX1NJWkUpKgorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IFJ4RkQpOworCQkJCXdyaXRlbChyaW5nLCBzY2NfYWRkciArIENIMEJSREEpOworCQkJCWRzY2M0X3J4X3VwZGF0ZShkcHJpdiwgZGV2KTsKKwkJCQl3cml0ZWwoTVRGaSB8IElkciwgc2NjX2FkZHIgKyBDSDBDRkcpOworCQkJCWlmIChkc2NjNF9kb19hY3Rpb24oZGV2LCAiSURSIikgPCAwKQorCQkJCQlnb3RvIGVycl94cHI7CisJCQkJZHByaXYtPmZsYWdzICY9IH5OZWVkSURSOworCQkJCXNtcF93bWIoKTsKKwkJCQkvKiBBY3RpdmF0ZSByZWNlaXZlciBhbmQgbWlzYyAqLworCQkJCXNjY193cml0ZWwoMHgwODA1MDAwOCwgZHByaXYsIGRldiwgQ0NSMik7CisJCQl9CisJCWVycl94cHI6CisJCQlpZiAoIShzdGF0ZSAmPSB+WHByKSkKKwkJCQlnb3RvIHRyeTsKKwkJfQorCQlpZiAoc3RhdGUgJiBDZCkgeworCQkJaWYgKGRlYnVnID4gMCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ0QgdHJhbnNpdGlvblxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmICghKHN0YXRlICY9IH5DZCkpIC8qIERFQlVHICovCisJCQkJZ290byB0cnk7CisJCX0KKwl9IGVsc2UgeyAvKiAhIFNjY0V2dCAqLworCQlpZiAoc3RhdGUgJiBIaSkgeworI2lmZGVmIERTQ0M0X1BPTExJTkcKKwkJCXdoaWxlICghZHNjYzRfdHhfcG9sbChkcHJpdiwgZGV2KSk7CisjZW5kaWYKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUeCBIaVxuIiwgZGV2LT5uYW1lKTsKKwkJCXN0YXRlICY9IH5IaTsKKwkJfQorCQlpZiAoc3RhdGUgJiBFcnIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUeCBFUlJcbiIsIGRldi0+bmFtZSk7CisJCQloZGxjX3N0YXRzKGRldiktPnR4X2Vycm9ycysrOworCQkJc3RhdGUgJj0gfkVycjsKKwkJfQorCX0KKwlnb3RvIHRyeTsKK30KKworc3RhdGljIHZvaWQgZHNjYzRfcnhfaXJxKHN0cnVjdCBkc2NjNF9wY2lfcHJpdiAqcHJpdiwKKwkJCQkgICAgc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHNjYzRfdG9fZGV2KGRwcml2KTsKKwl1MzIgc3RhdGU7CisJaW50IGN1cjsKKwordHJ5OgorCWN1ciA9IGRwcml2LT5pcXJ4X2N1cnJlbnQlSVJRX1JJTkdfU0laRTsKKwlzdGF0ZSA9IGRwcml2LT5pcXJ4W2N1cl07CisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuOworCWRwcml2LT5pcXJ4W2N1cl0gPSAwOworCWRwcml2LT5pcXJ4X2N1cnJlbnQrKzsKKworCWlmIChzdGF0ZV9jaGVjayhzdGF0ZSwgZHByaXYsIGRldiwgIlJ4IikgPCAwKQorCQlyZXR1cm47CisKKwlpZiAoIShzdGF0ZSAmIFNjY0V2dCkpeworCQlzdHJ1Y3QgUnhGRCAqcnhfZmQ7CisKKwkJaWYgKGRlYnVnID4gNCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUnggSVNSID0gMHglMDh4XG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgc3RhdGUpOworCQlzdGF0ZSAmPSAweDAwZmZmZmZmOworCQlpZiAoc3RhdGUgJiBFcnIpIHsgLyogSG9sZCBvciByZXNldCAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSeCBFUlJcbiIsIGRldi0+bmFtZSk7CisJCQljdXIgPSBkcHJpdi0+cnhfY3VycmVudCVSWF9SSU5HX1NJWkU7CisJCQlyeF9mZCA9IGRwcml2LT5yeF9mZCArIGN1cjsKKwkJCS8qCisJCQkgKiBQcmVzdW1lIHdlJ3JlIG5vdCBmYWNpbmcgYSBETUFDIHJlY2VpdmVyIHJlc2V0LgorCQkJICogQXMgV2UgdXNlIHRoZSByeCBzaXplLWZpbHRlcmluZyBmZWF0dXJlIG9mIHRoZQorCQkJICogRFNDQzQsIHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgZnJhbWUgaXMgd2FpdGluZyBpbgorCQkJICogdGhlIHJ4IGZpZm8uIEkgYmV0IGEgUmVjZWl2ZSBEYXRhIE92ZXJmbG93IHdpbGwKKwkJCSAqIGhhcHBlbiBtb3N0IG9mIHRpbWUgYnV0IGxldCdzIHRyeSBhbmQgYXZvaWQgaXQuCisJCQkgKiBCdHcgKGFzIGZvciBSRE8pIGlmIG9uZSBleHBlcmllbmNlcyBFUlIgd2hlcmVhcworCQkJICogdGhlIHN5c3RlbSBsb29rcyByYXRoZXIgaWRsZSwgdGhlcmUgbWF5IGJlIGEKKwkJCSAqIHByb2JsZW0gd2l0aCBsYXRlbmN5LiBJbiB0aGlzIGNhc2UsIGluY3JlYXNpbmcKKwkJCSAqIFJYX1JJTkdfU0laRSBtYXkgaGVscC4KKwkJCSAqLworCQkJLy93aGlsZSAoZHByaXYtPnJ4X25lZWRzX3JlZmlsbCkgeworCQkJCXdoaWxlICghKHJ4X2ZkLT5zdGF0ZTEgJiBIb2xkKSkgeworCQkJCQlyeF9mZCsrOworCQkJCQljdXIrKzsKKwkJCQkJaWYgKCEoY3VyID0gY3VyJVJYX1JJTkdfU0laRSkpCisJCQkJCQlyeF9mZCA9IGRwcml2LT5yeF9mZDsKKwkJCQl9CisJCQkJLy9kcHJpdi0+cnhfbmVlZHNfcmVmaWxsLS07CisJCQkJdHJ5X2dldF9yeF9za2IoZHByaXYsIGRldik7CisJCQkJaWYgKCFyeF9mZC0+ZGF0YSkKKwkJCQkJZ290byB0cnk7CisJCQkJcnhfZmQtPnN0YXRlMSAmPSB+SG9sZDsKKwkJCQlyeF9mZC0+c3RhdGUyID0gMHgwMDAwMDAwMDsKKwkJCQlyeF9mZC0+ZW5kID0gMHhiYWJlZmFjZTsKKwkJCS8vfQorCQkJZ290byB0cnk7CisJCX0KKwkJaWYgKHN0YXRlICYgRmkpIHsKKwkJCWRzY2M0X3J4X3NrYihkcHJpdiwgZGV2KTsKKwkJCWdvdG8gdHJ5OworCQl9CisJCWlmIChzdGF0ZSAmIEhpICkgeyAvKiBISSBiaXQgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSeCBIaVxuIiwgZGV2LT5uYW1lKTsKKwkJCXN0YXRlICY9IH5IaTsKKwkJCWdvdG8gdHJ5OworCQl9CisJfSBlbHNlIHsgLyogU2NjRXZ0ICovCisJCWlmIChkZWJ1ZyA+IDEpIHsKKwkJCS8vRklYTUU6IHZlcmlmaWVyIGxhIHByZXNlbmNlIGRlIHRvdXMgbGVzIGV2ZW5lbWVudHMKKwkJc3RhdGljIHN0cnVjdCB7CisJCQl1MzIgbWFzazsKKwkJCWNvbnN0IGNoYXIgKmlycV9uYW1lOworCQl9IGV2dHNbXSA9IHsKKwkJCXsgMHgwMDAwODAwMCwgIlRJTiJ9LAorCQkJeyAweDAwMDAwMDIwLCAiUlNDIn0sCisJCQl7IDB4MDAwMDAwMTAsICJQQ0UifSwKKwkJCXsgMHgwMDAwMDAwOCwgIlBMTEEifSwKKwkJCXsgMCwgTlVMTH0KKwkJfSwgKmV2dDsKKworCQlmb3IgKGV2dCA9IGV2dHM7IGV2dC0+aXJxX25hbWU7IGV2dCsrKSB7CisJCQlpZiAoc3RhdGUgJiBldnQtPm1hc2spIHsKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlc1xuIiwKKwkJCQkJCWRldi0+bmFtZSwgZXZ0LT5pcnFfbmFtZSk7CisJCQkJaWYgKCEoc3RhdGUgJj0gfmV2dC0+bWFzaykpCisJCQkJCWdvdG8gdHJ5OworCQkJfQorCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIShzdGF0ZSAmPSB+MHgwMDAwYzAzYykpCisJCQkJZ290byB0cnk7CisJCX0KKwkJaWYgKHN0YXRlICYgQ3RzKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ1RTIHRyYW5zaXRpb25cbiIsIGRldi0+bmFtZSk7CisJCQlpZiAoIShzdGF0ZSAmPSB+Q3RzKSkgLyogREVCVUcgKi8KKwkJCQlnb3RvIHRyeTsKKwkJfQorCQkvKgorCQkgKiBSZWNlaXZlIERhdGEgT3ZlcmZsb3cgKEZJWE1FOiBmc2NrZWQpCisJCSAqLworCQlpZiAoc3RhdGUgJiBSZG8pIHsKKwkJCXN0cnVjdCBSeEZEICpyeF9mZDsKKwkJCXZvaWQgX19pb21lbSAqc2NjX2FkZHI7CisJCQlpbnQgY3VyOworCisJCQkvL2lmIChkZWJ1ZykKKwkJCS8vCWRzY2M0X3J4X2R1bXAoZHByaXYpOworCQkJc2NjX2FkZHIgPSBkcHJpdi0+YmFzZV9hZGRyICsgMHgwYypkcHJpdi0+ZGV2X2lkOworCisJCQlzY2NfcGF0Y2hsKFJ4QWN0aXZhdGUsIDAsIGRwcml2LCBkZXYsIENDUjIpOworCQkJLyoKKwkJCSAqIFRoaXMgaGFzIG5vIGVmZmVjdC4gV2h5ID8KKwkJCSAqIE9SZWQgd2l0aCBUeFNjY1Jlcywgb25lIHNlZXMgdGhlIENGRyBhY2sgKGZvcgorCQkJICogdGhlIFRYIHBhcnQgb25seSkuCisJCQkgKi8KKwkJCXNjY193cml0ZWwoUnhTY2NSZXMsIGRwcml2LCBkZXYsIENNRFIpOworCQkJZHByaXYtPmZsYWdzIHw9IFJkb1NldDsKKworCQkJLyoKKwkJCSAqIExldCdzIHRyeSBhbmQgc2F2ZSBzb21ldGhpbmcgaW4gdGhlIHJlY2VpdmVkIGRhdGEuCisJCQkgKiByeF9jdXJyZW50IG11c3QgYmUgaW5jcmVtZW50ZWQgYXQgbGVhc3Qgb25jZSB0bworCQkJICogYXZvaWQgSE9MRCBpbiB0aGUgQlJEQS10by1iZS1wb2ludGVkIGRlc2MuCisJCQkgKi8KKwkJCWRvIHsKKwkJCQljdXIgPSBkcHJpdi0+cnhfY3VycmVudCsrJVJYX1JJTkdfU0laRTsKKwkJCQlyeF9mZCA9IGRwcml2LT5yeF9mZCArIGN1cjsKKwkJCQlpZiAoIShyeF9mZC0+c3RhdGUyICYgRGF0YUNvbXBsZXRlKSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKHJ4X2ZkLT5zdGF0ZTIgJiBGcmFtZUFib3J0ZWQpIHsKKwkJCQkJaGRsY19zdGF0cyhkZXYpLT5yeF9vdmVyX2Vycm9ycysrOworCQkJCQlyeF9mZC0+c3RhdGUxIHw9IEhvbGQ7CisJCQkJCXJ4X2ZkLT5zdGF0ZTIgPSAweDAwMDAwMDAwOworCQkJCQlyeF9mZC0+ZW5kID0gMHhiYWJlZmFjZTsKKwkJCQl9IGVsc2UKKwkJCQkJZHNjYzRfcnhfc2tiKGRwcml2LCBkZXYpOworCQkJfSB3aGlsZSAoMSk7CisKKwkJCWlmIChkZWJ1ZyA+IDApIHsKKwkJCQlpZiAoZHByaXYtPmZsYWdzICYgUmRvU2V0KQorCQkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCQkgICAgICAgIiVzOiBubyBSRE8gaW4gUnggZGF0YVxuIiwgRFJWX05BTUUpOworCQkJfQorI2lmZGVmIERTQ0M0X1JET19FWFBFUklNRU5UQUxfUkVDT1ZFUlkKKwkJCS8qCisJCQkgKiBGSVhNRTogbXVzdCB0aGUgcmVzZXQgYmUgdGhpcyB2aW9sZW50ID8KKwkJCSAqLworI3dhcm5pbmcgIkZJWE1FOiBDSDBCUkRBIgorCQkJd3JpdGVsKGRwcml2LT5yeF9mZF9kbWEgKworCQkJICAgICAgIChkcHJpdi0+cnhfY3VycmVudCVSWF9SSU5HX1NJWkUpKgorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgUnhGRCksIHNjY19hZGRyICsgQ0gwQlJEQSk7CisJCQl3cml0ZWwoTVRGaXxSZHJ8SWRyLCBzY2NfYWRkciArIENIMENGRyk7CisJCQlpZiAoZHNjYzRfZG9fYWN0aW9uKGRldiwgIlJEUiIpIDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJETyByZWNvdmVyeSBmYWlsZWQoJXMpXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsICJSRFIiKTsKKwkJCQlnb3RvIHJkb19lbmQ7CisJCQl9CisJCQl3cml0ZWwoTVRGaXxJZHIsIHNjY19hZGRyICsgQ0gwQ0ZHKTsKKwkJCWlmIChkc2NjNF9kb19hY3Rpb24oZGV2LCAiSURSIikgPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUkRPIHJlY292ZXJ5IGZhaWxlZCglcylcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgIklEUiIpOworCQkJCWdvdG8gcmRvX2VuZDsKKwkJCX0KKwkJcmRvX2VuZDoKKyNlbmRpZgorCQkJc2NjX3BhdGNobCgwLCBSeEFjdGl2YXRlLCBkcHJpdiwgZGV2LCBDQ1IyKTsKKwkJCWdvdG8gdHJ5OworCQl9CisJCWlmIChzdGF0ZSAmIENkKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ0QgdHJhbnNpdGlvblxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmICghKHN0YXRlICY9IH5DZCkpIC8qIERFQlVHICovCisJCQkJZ290byB0cnk7CisJCX0KKwkJaWYgKHN0YXRlICYgRmxleCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBGbGV4LiBUdHR0dC4uLlxuIiwgRFJWX05BTUUpOworCQkJaWYgKCEoc3RhdGUgJj0gfkZsZXgpKQorCQkJCWdvdG8gdHJ5OworCQl9CisJfQorfQorCisvKgorICogSSBoYWQgZXhwZWN0ZWQgdGhlIGZvbGxvd2luZyB0byB3b3JrIGZvciB0aGUgZmlyc3QgZGVzY3JpcHRvcgorICogKHR4X2ZkLT5zdGF0ZSA9IDB4YzAwMDAwMDApCisgKiAtIEhvbGQ9MSAoZG9uJ3QgdHJ5IGFuZCBicmFuY2ggdG8gdGhlIG5leHQgZGVzY3JpcHRvKTsKKyAqIC0gTm89MCAoSSB3YW50IGFuIGVtcHR5IGRhdGEgc2VjdGlvbiwgaS5lLiBzaXplPTApOworICogLSBGZT0xIChyZXF1aXJlZCBieSBObz0wIG9yIHdlIGdvdCBhbiBFcnIgaXJxIGFuZCBtdXN0IHJlc2V0KS4KKyAqIEl0IGZhaWxlZCBhbmQgbG9ja2VkIHNvbGlkLiBUaHVzIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYSBkdW1teSBza2IuCisgKiBQcm9ibGVtIGlzIGFja25vd2xlZGdlZCBpbiBlcnJhdGEgc2hlZXQgRFM1LiBKb3kgOm8vCisgKi8KK3N0cnVjdCBza19idWZmICpkc2NjNF9pbml0X2R1bW15X3NrYihzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKERVTU1ZX1NLQl9TSVpFKTsKKwlpZiAoc2tiKSB7CisJCWludCBsYXN0ID0gZHByaXYtPnR4X2RpcnR5JVRYX1JJTkdfU0laRTsKKwkJc3RydWN0IFR4RkQgKnR4X2ZkID0gZHByaXYtPnR4X2ZkICsgbGFzdDsKKworCQlza2ItPmxlbiA9IERVTU1ZX1NLQl9TSVpFOworCQltZW1jcHkoc2tiLT5kYXRhLCB2ZXJzaW9uLCBzdHJsZW4odmVyc2lvbiklRFVNTVlfU0tCX1NJWkUpOworCQl0eF9mZC0+c3RhdGUgPSBGcmFtZUVuZCB8IFRPX1NUQVRFX1RYKERVTU1ZX1NLQl9TSVpFKTsKKwkJdHhfZmQtPmRhdGEgPSBwY2lfbWFwX3NpbmdsZShkcHJpdi0+cGNpX3ByaXYtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJICAgICBEVU1NWV9TS0JfU0laRSwgUENJX0RNQV9UT0RFVklDRSk7CisJCWRwcml2LT50eF9za2J1ZmZbbGFzdF0gPSBza2I7CisJfQorCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbnQgZHNjYzRfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiA9IGRzY2M0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRwcml2LT5wY2lfcHJpdi0+cGRldjsKKwlzdHJ1Y3QgVHhGRCAqdHhfZmQ7CisJc3RydWN0IFJ4RkQgKnJ4X2ZkOworCXZvaWQgKnJpbmc7CisJaW50IGk7CisKKwlyaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgJmRwcml2LT5yeF9mZF9kbWEpOworCWlmICghcmluZykKKwkJZ290byBlcnJfb3V0OworCWRwcml2LT5yeF9mZCA9IHJ4X2ZkID0gKHN0cnVjdCBSeEZEICopIHJpbmc7CisKKwlyaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgJmRwcml2LT50eF9mZF9kbWEpOworCWlmICghcmluZykKKwkJZ290byBlcnJfZnJlZV9kbWFfcng7CisJZHByaXYtPnR4X2ZkID0gdHhfZmQgPSAoc3RydWN0IFR4RkQgKikgcmluZzsKKworCW1lbXNldChkcHJpdi0+dHhfc2tidWZmLCAwLCBzaXplb2Yoc3RydWN0IHNrX2J1ZmYgKikqVFhfUklOR19TSVpFKTsKKwlkcHJpdi0+dHhfZGlydHkgPSAweGZmZmZmZmZmOworCWkgPSBkcHJpdi0+dHhfY3VycmVudCA9IDA7CisJZG8geworCQl0eF9mZC0+c3RhdGUgPSBGcmFtZUVuZCB8IFRPX1NUQVRFX1RYKDIqRFVNTVlfU0tCX1NJWkUpOworCQl0eF9mZC0+Y29tcGxldGUgPSAweDAwMDAwMDAwOworCSAgICAgICAgLyogRklYTUU6IE5VTEwgc2hvdWxkIGJlIG9rIC0gdG8gYmUgdHJpZWQgKi8KKwkgICAgICAgIHR4X2ZkLT5kYXRhID0gZHByaXYtPnR4X2ZkX2RtYTsKKwkJKHR4X2ZkKyspLT5uZXh0ID0gKHUzMikoZHByaXYtPnR4X2ZkX2RtYSArCisJCQkJCSgrK2klVFhfUklOR19TSVpFKSpzaXplb2YoKnR4X2ZkKSk7CisJfSB3aGlsZSAoaSA8IFRYX1JJTkdfU0laRSk7CisKKwlpZiAoZHNjYzRfaW5pdF9kdW1teV9za2IoZHByaXYpIDwgMCkKKwkJZ290byBlcnJfZnJlZV9kbWFfdHg7CisKKwltZW1zZXQoZHByaXYtPnJ4X3NrYnVmZiwgMCwgc2l6ZW9mKHN0cnVjdCBza19idWZmICopKlJYX1JJTkdfU0laRSk7CisJaSA9IGRwcml2LT5yeF9kaXJ0eSA9IGRwcml2LT5yeF9jdXJyZW50ID0gMDsKKwlkbyB7CisJCS8qIHNpemUgc2V0IGJ5IHRoZSBob3N0LiBNdWx0aXBsZSBvZiA0IGJ5dGVzIHBsZWFzZSAqLworCSAgICAgICAgcnhfZmQtPnN0YXRlMSA9IEhpRGVzYzsKKwkgICAgICAgIHJ4X2ZkLT5zdGF0ZTIgPSAweDAwMDAwMDAwOworCSAgICAgICAgcnhfZmQtPmVuZCA9IDB4YmFiZWZhY2U7CisJICAgICAgICByeF9mZC0+c3RhdGUxIHw9IFRPX1NUQVRFX1JYKEhETENfTUFYX01SVSk7CisJCS8vIEZJWE1FOiByZXR1cm4gdmFsdWUgdmVyaWZpZWUgbWFpcyB0cmFpdGVtZW50IHN1c3BlY3QKKwkJaWYgKHRyeV9nZXRfcnhfc2tiKGRwcml2LCBkZXYpID49IDApCisJCQlkcHJpdi0+cnhfZGlydHkrKzsKKwkJKHJ4X2ZkKyspLT5uZXh0ID0gKHUzMikoZHByaXYtPnJ4X2ZkX2RtYSArCisJCQkJCSgrK2klUlhfUklOR19TSVpFKSpzaXplb2YoKnJ4X2ZkKSk7CisJfSB3aGlsZSAoaSA8IFJYX1JJTkdfU0laRSk7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfZG1hX3R4OgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgcmluZywgZHByaXYtPnR4X2ZkX2RtYSk7CitlcnJfZnJlZV9kbWFfcng6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCByeF9mZCwgZHByaXYtPnJ4X2ZkX2RtYSk7CitlcnJfb3V0OgorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZHNjYzRfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZHNjYzRfcGNpX3ByaXYgKnBwcml2OworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqcm9vdDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwlpbnQgaTsKKworCXBwcml2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXJvb3QgPSBwcHJpdi0+cm9vdDsKKworCWlvYWRkciA9IHJvb3QtPmJhc2VfYWRkcjsKKworCWRzY2M0X3BjaV9yZXNldChwZGV2LCBpb2FkZHIpOworCisJZnJlZV9pcnEocGRldi0+aXJxLCByb290KTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIElSUV9SSU5HX1NJWkUqc2l6ZW9mKHUzMiksIHBwcml2LT5pcWNmZywKKwkJCSAgICBwcHJpdi0+aXFjZmdfZG1hKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3Blcl9jYXJkOyBpKyspIHsKKwkJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiA9IHJvb3QgKyBpOworCisJCWRzY2M0X3JlbGVhc2VfcmluZyhkcHJpdik7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwKKwkJCQkgICAgZHByaXYtPmlxcngsIGRwcml2LT5pcXJ4X2RtYSk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwKKwkJCQkgICAgZHByaXYtPmlxdHgsIGRwcml2LT5pcXR4X2RtYSk7CisJfQorCisJZHNjYzRfZnJlZTEocGRldik7CisKKwlpb3VubWFwKGlvYWRkcik7CisKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMSk7CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCitzdGF0aWMgaW50IGRzY2M0X2hkbGNfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IGVuY29kaW5nLAorCXVuc2lnbmVkIHNob3J0IHBhcml0eSkKK3sKKwlzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2ID0gZHNjYzRfcHJpdihkZXYpOworCisJaWYgKGVuY29kaW5nICE9IEVOQ09ESU5HX05SWiAmJgorCSAgICBlbmNvZGluZyAhPSBFTkNPRElOR19OUlpJICYmCisJICAgIGVuY29kaW5nICE9IEVOQ09ESU5HX0ZNX01BUksgJiYKKwkgICAgZW5jb2RpbmcgIT0gRU5DT0RJTkdfRk1fU1BBQ0UgJiYKKwkgICAgZW5jb2RpbmcgIT0gRU5DT0RJTkdfTUFOQ0hFU1RFUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGFyaXR5ICE9IFBBUklUWV9OT05FICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMTZfUFIwX0NDSVRUICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMzJfUFIwX0NDSVRUICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMzJfUFIxX0NDSVRUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBkcHJpdi0+ZW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICAgICAgZHByaXYtPnBhcml0eSA9IHBhcml0eTsKKwlyZXR1cm4gMDsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IGRzY2M0X3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgKmFyZ3NbXSA9IHsgJmRlYnVnLCAmcXVhcnR6LCBOVUxMIH0sICoqcCA9IGFyZ3M7CisKKwl3aGlsZSAoKnAgJiYgKGdldF9vcHRpb24oJnN0ciwgKnApID09IDIpKQorCQlwKys7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImRzY2M0LnNldHVwPSIsIGRzY2M0X3NldHVwKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZHNjYzRfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9TSUVNRU5TLCBQQ0lfREVWSUNFX0lEX1NJRU1FTlNfRFNDQzQsCisJICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGRzY2M0X3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHNjYzRfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IGRzY2M0X3BjaV90YmwsCisJLnByb2JlCQk9IGRzY2M0X2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZHNjYzRfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkc2NjNF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRzY2M0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkc2NjNF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHNjYzRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZHNjYzRfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHNjYzRfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYyBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3NWI3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKQEAgLTAsMCArMSwyNzEyIEBACisvKgorICogICAgICBGYXJTeW5jIFdBTiBkcml2ZXIgZm9yIExpbnV4ICgyLjYueCBrZXJuZWwgdmVyc2lvbikKKyAqCisgKiAgICAgIEFjdHVhbGx5IHN5bmMgZHJpdmVyIGZvciBYLjIxLCBWLjM1IGFuZCBWLjI0IG9uIEZhclN5bmMgVC1zZXJpZXMgY2FyZHMKKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IEZhclNpdGUgQ29tbXVuaWNhdGlvbnMgTHRkLgorICogICAgICB3d3cuZmFyc2l0ZS5jby51aworICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIEF1dGhvcjogICAgICBSLkouRHVubG9wICAgIDxib2IuZHVubG9wQGZhcnNpdGUuY28udWs+CisgKiAgICAgIE1haW50YWluZXI6ICBLZXZpbiBDdXJ0aXMgIDxrZXZpbi5jdXJ0aXNAZmFyc2l0ZS5jby51az4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiZmFyc3luYy5oIgorCisvKgorICogICAgICBNb2R1bGUgaW5mbworICovCitNT0RVTEVfQVVUSE9SKCJSLkouRHVubG9wIDxib2IuZHVubG9wQGZhcnNpdGUuY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZhclN5bmMgVC1TZXJpZXMgV0FOIGRyaXZlci4gRmFyU2l0ZSBDb21tdW5pY2F0aW9ucyBMdGQuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qICAgICAgRHJpdmVyIGNvbmZpZ3VyYXRpb24gYW5kIGdsb2JhbCBwYXJhbWV0ZXJzCisgKiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qICAgICAgTnVtYmVyIG9mIHBvcnRzIChwZXIgY2FyZCkgYW5kIGNhcmRzIHN1cHBvcnRlZAorICovCisjZGVmaW5lIEZTVF9NQVhfUE9SVFMgICAgICAgICAgIDQKKyNkZWZpbmUgRlNUX01BWF9DQVJEUyAgICAgICAgICAgMzIKKworLyogICAgICBEZWZhdWx0IHBhcmFtZXRlcnMgZm9yIHRoZSBsaW5rCisgKi8KKyNkZWZpbmUgRlNUX1RYX1FVRVVFX0xFTiAgICAgICAgMTAwCS8qIEF0IDhNYnBzIGEgbG9uZ2VyIHF1ZXVlIGxlbmd0aCBpcworCQkJCQkgKiB1c2VmdWwsIHRoZSBzeW5jcHBwIG1vZHVsZSBmb3JjZXMKKwkJCQkJICogdGhpcyBkb3duIGFzc3VtaW5nIGEgc2xvd2VyIGxpbmUgSQorCQkJCQkgKiBndWVzcy4KKwkJCQkJICovCisjZGVmaW5lIEZTVF9UWFFfREVQVEggICAgICAgICAgIDE2CS8qIFRoaXMgb25lIGlzIGZvciB0aGUgYnVmZmVyaW5nCisJCQkJCSAqIG9mIGZyYW1lcyBvbiB0aGUgd2F5IGRvd24gdG8gdGhlIGNhcmQKKwkJCQkJICogc28gdGhhdCB3ZSBjYW4ga2VlcCB0aGUgY2FyZCBidXN5CisJCQkJCSAqIGFuZCBtYXhpbWlzZSB0aHJvdWdocHV0CisJCQkJCSAqLworI2RlZmluZSBGU1RfSElHSF9XQVRFUl9NQVJLICAgICAxMgkvKiBQb2ludCBhdCB3aGljaCB3ZSBmbG93IGNvbnRyb2wKKwkJCQkJICogbmV0d29yayBsYXllciAqLworI2RlZmluZSBGU1RfTE9XX1dBVEVSX01BUksgICAgICA4CS8qIFBvaW50IGF0IHdoaWNoIHdlIHJlbW92ZSBmbG93CisJCQkJCSAqIGNvbnRyb2wgZnJvbSBuZXR3b3JrIGxheWVyICovCisjZGVmaW5lIEZTVF9NQVhfTVRVICAgICAgICAgICAgIDgwMDAJLyogSHVnZSBidXQgcG9zc2libGUgKi8KKyNkZWZpbmUgRlNUX0RFRl9NVFUgICAgICAgICAgICAgMTUwMAkvKiBDb21tb24gc2FuZSB2YWx1ZSAqLworCisjZGVmaW5lIEZTVF9UWF9USU1FT1VUICAgICAgICAgICgyKkhaKQorCisjaWZkZWYgQVJQSFJEX1JBV0hETEMKKyNkZWZpbmUgQVJQSFJEX01ZVFlQRSAgIEFSUEhSRF9SQVdIRExDCS8qIFJhdyBmcmFtZXMgKi8KKyNlbHNlCisjZGVmaW5lIEFSUEhSRF9NWVRZUEUgICBBUlBIUkRfSERMQwkvKiBDaXNjby1IRExDIChrZWVwYWxpdmVzIGV0YykgKi8KKyNlbmRpZgorCisvKgorICogTW9kdWxlcyBwYXJhbWV0ZXJzIGFuZCBhc3NvY2lhdGVkIHZhcmFpYmxlcworICovCitpbnQgZnN0X3R4cV9sb3cgPSBGU1RfTE9XX1dBVEVSX01BUks7CitpbnQgZnN0X3R4cV9oaWdoID0gRlNUX0hJR0hfV0FURVJfTUFSSzsKK2ludCBmc3RfbWF4X3JlYWRzID0gNzsKK2ludCBmc3RfZXhjbHVkZWRfY2FyZHMgPSAwOworaW50IGZzdF9leGNsdWRlZF9saXN0W0ZTVF9NQVhfQ0FSRFNdOworCittb2R1bGVfcGFyYW0oZnN0X3R4cV9sb3csIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZnN0X3R4cV9oaWdoLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGZzdF9tYXhfcmVhZHMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZnN0X2V4Y2x1ZGVkX2NhcmRzLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGZzdF9leGNsdWRlZF9saXN0LCBpbnQsIE5VTEwsIDApOworCisvKiAgICAgIENhcmQgc2hhcmVkIG1lbW9yeSBsYXlvdXQKKyAqICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisjcHJhZ21hIHBhY2soMSkKKworLyogICAgICBUaGlzIGluZm9ybWF0aW9uIGlzIGRlcml2ZWQgaW4gcGFydCBmcm9tIHRoZSBGYXJTaXRlIEZhclN5bmMgU21jLmgKKyAqICAgICAgZmlsZS4gVW5mb3J0dW5hdGVseSB2YXJpb3VzIG5hbWUgY2xhc2hlcyBhbmQgdGhlIG5vbi1wb3J0YWJpbGl0eSBvZiB0aGUKKyAqICAgICAgYml0IGZpZWxkIGRlY2xhcmF0aW9ucyBpbiB0aGF0IGZpbGUgaGF2ZSBtZWFudCB0aGF0IEkgaGF2ZSBjaG9zZW4gdG8KKyAqICAgICAgcmVjcmVhdGUgdGhlIGluZm9ybWF0aW9uIGhlcmUuCisgKgorICogICAgICBUaGUgU01DIChTaGFyZWQgTWVtb3J5IENvbmZpZ3VyYXRpb24pIGhhcyBhIHZlcnNpb24gbnVtYmVyIHRoYXQgaXMKKyAqICAgICAgaW5jcmVtZW50ZWQgZXZlcnkgdGltZSB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGNoYW5nZS4gVGhpcyBudW1iZXIgY2FuCisgKiAgICAgIGJlIHVzZWQgdG8gY2hlY2sgdGhhdCB3ZSBoYXZlIG5vdCBnb3Qgb3V0IG9mIHN0ZXAgd2l0aCB0aGUgZmlybXdhcmUKKyAqICAgICAgY29udGFpbmVkIGluIHRoZSAuQ0RFIGZpbGVzLgorICovCisjZGVmaW5lIFNNQ19WRVJTSU9OIDI0CisKKyNkZWZpbmUgRlNUX01FTVNJWkUgMHgxMDAwMDAJLyogU2l6ZSBvZiBjYXJkIG1lbW9yeSAoMU1iKSAqLworCisjZGVmaW5lIFNNQ19CQVNFIDB4MDAwMDIwMDBMCS8qIEJhc2Ugb2Zmc2V0IG9mIHRoZSBzaGFyZWQgbWVtb3J5IHdpbmRvdyBtYWluCisJCQkJICogY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgQkZNX0JBU0UgMHgwMDAxMDAwMEwJLyogQmFzZSBvZmZzZXQgb2YgdGhlIHNoYXJlZCBtZW1vcnkgd2luZG93IERNQQorCQkJCSAqIGJ1ZmZlcnMgKi8KKworI2RlZmluZSBMRU5fVFhfQlVGRkVSIDgxOTIJLyogU2l6ZSBvZiBwYWNrZXQgYnVmZmVycyAqLworI2RlZmluZSBMRU5fUlhfQlVGRkVSIDgxOTIKKworI2RlZmluZSBMRU5fU01BTExfVFhfQlVGRkVSIDI1NgkvKiBTaXplIG9mIG9ic29sZXRlIGJ1ZmZzIHVzZWQgZm9yIERPUyBkaWFncyAqLworI2RlZmluZSBMRU5fU01BTExfUlhfQlVGRkVSIDI1NgorCisjZGVmaW5lIE5VTV9UWF9CVUZGRVIgMgkJLyogTXVzdCBiZSBwb3dlciBvZiAyLiBGaXhlZCBieSBmaXJtd2FyZSAqLworI2RlZmluZSBOVU1fUlhfQlVGRkVSIDgKKworLyogSW50ZXJydXB0IHJldHJ5IHRpbWUgaW4gbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIElOVF9SRVRSWV9USU1FIDIKKworLyogICAgICBUaGUgQW0xODZDSC9DQyBwcm9jZXNzb3JzIHN1cHBvcnQgYSBTbWFydERNQSBtb2RlIHVzaW5nIGNpcmN1bGFyIHBvb2xzCisgKiAgICAgIG9mIGJ1ZmZlciBkZXNjcmlwdG9ycy4gVGhlIHN0cnVjdHVyZSBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoYXQgdXNlZAorICogICAgICBpbiB0aGUgTEFOQ0UgRXRoZXJuZXQgY29udHJvbGxlcnMuIERldGFpbHMgYXZhaWxhYmxlIGFzIFBERiBmcm9tIHRoZQorICogICAgICBBTUQgd2ViIHNpdGU6IGh0dHA6Ly93d3cuYW1kLmNvbS9wcm9kdWN0cy9lcGQvcHJvY2Vzc29ycy9cCisgKiAgICAgICAgICAgICAgICAgICAgMi4xNmJpdGNvbnQvMy5hbTE4NmN4ZmEvYTIxOTE0LzIxOTE0LnBkZgorICovCitzdHJ1Y3QgdHhkZXNjIHsJCQkvKiBUcmFuc21pdCBkZXNjcmlwdG9yICovCisJdm9sYXRpbGUgdTE2IGxhZHI7CS8qIExvdyBvcmRlciBhZGRyZXNzIG9mIHBhY2tldC4gVGhpcyBpcyBhCisJCQkJICogbGluZWFyIGFkZHJlc3MgaW4gdGhlIEFtMTg2IG1lbW9yeSBzcGFjZQorCQkJCSAqLworCXZvbGF0aWxlIHU4IGhhZHI7CS8qIEhpZ2ggb3JkZXIgYWRkcmVzcy4gTG93IDQgYml0cyBvbmx5LCBoaWdoIDQKKwkJCQkgKiBiaXRzIG11c3QgYmUgemVybworCQkJCSAqLworCXZvbGF0aWxlIHU4IGJpdHM7CS8qIFN0YXR1cyBhbmQgY29uZmlnICovCisJdm9sYXRpbGUgdTE2IGJjbnQ7CS8qIDJzIGNvbXBsZW1lbnQgb2YgcGFja2V0IHNpemUgaW4gbG93IDE1IGJpdHMuCisJCQkJICogVHJhbnNtaXQgdGVybWluYWwgY291bnQgaW50ZXJydXB0IGVuYWJsZSBpbgorCQkJCSAqIHRvcCBiaXQuCisJCQkJICovCisJdTE2IHVudXNlZDsJCS8qIE5vdCB1c2VkIGluIFR4ICovCit9OworCitzdHJ1Y3QgcnhkZXNjIHsJCQkvKiBSZWNlaXZlIGRlc2NyaXB0b3IgKi8KKwl2b2xhdGlsZSB1MTYgbGFkcjsJLyogTG93IG9yZGVyIGFkZHJlc3Mgb2YgcGFja2V0ICovCisJdm9sYXRpbGUgdTggaGFkcjsJLyogSGlnaCBvcmRlciBhZGRyZXNzICovCisJdm9sYXRpbGUgdTggYml0czsJLyogU3RhdHVzIGFuZCBjb25maWcgKi8KKwl2b2xhdGlsZSB1MTYgYmNudDsJLyogMnMgY29tcGxlbWVudCBvZiBidWZmZXIgc2l6ZSBpbiBsb3cgMTUgYml0cy4KKwkJCQkgKiBSZWNlaXZlIHRlcm1pbmFsIGNvdW50IGludGVycnVwdCBlbmFibGUgaW4KKwkJCQkgKiB0b3AgYml0LgorCQkJCSAqLworCXZvbGF0aWxlIHUxNiBtY250OwkvKiBNZXNzYWdlIGJ5dGUgY291bnQgKDE1IGJpdHMpICovCit9OworCisvKiBDb252ZXJ0IGEgbGVuZ3RoIGludG8gdGhlIDE1IGJpdCAyJ3MgY29tcGxlbWVudCAqLworLyogI2RlZmluZSBjbnZfYmNudChsZW4pICAgKCggfihsZW4pICsgMSApICYgMHg3RkZGICkgKi8KKy8qIFNpbmNlIHdlIG5lZWQgdG8gc2V0IHRoZSBoaWdoIGJpdCB0byBlbmFibGUgdGhlIGNvbXBsZXRpb24gaW50ZXJydXB0IHRoaXMKKyAqIGNhbiBiZSBtYWRlIGEgbG90IHNpbXBsZXIKKyAqLworI2RlZmluZSBjbnZfYmNudChsZW4pICAgKC0obGVuKSkKKworLyogU3RhdHVzIGFuZCBjb25maWcgYml0cyBmb3IgdGhlIGFib3ZlICovCisjZGVmaW5lIERNQV9PV04gICAgICAgICAweDgwCS8qIFNtYXJ0RE1BIG93bnMgdGhlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgVFhfU1RQICAgICAgICAgIDB4MDIJLyogVHg6IHN0YXJ0IG9mIHBhY2tldCAqLworI2RlZmluZSBUWF9FTlAgICAgICAgICAgMHgwMQkvKiBUeDogZW5kIG9mIHBhY2tldCAqLworI2RlZmluZSBSWF9FUlIgICAgICAgICAgMHg0MAkvKiBSeDogZXJyb3IgKE9SIG9mIG5leHQgNCBiaXRzKSAqLworI2RlZmluZSBSWF9GUkFNICAgICAgICAgMHgyMAkvKiBSeDogZnJhbWluZyBlcnJvciAqLworI2RlZmluZSBSWF9PRkxPICAgICAgICAgMHgxMAkvKiBSeDogb3ZlcmZsb3cgZXJyb3IgKi8KKyNkZWZpbmUgUlhfQ1JDICAgICAgICAgIDB4MDgJLyogUng6IENSQyBlcnJvciAqLworI2RlZmluZSBSWF9IQlVGICAgICAgICAgMHgwNAkvKiBSeDogYnVmZmVyIGVycm9yICovCisjZGVmaW5lIFJYX1NUUCAgICAgICAgICAweDAyCS8qIFJ4OiBzdGFydCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgUlhfRU5QICAgICAgICAgIDB4MDEJLyogUng6IGVuZCBvZiBwYWNrZXQgKi8KKworLyogSW50ZXJydXB0cyBmcm9tIHRoZSBjYXJkIGFyZSBjYXVzZWQgYnkgdmFyaW91cyBldmVudHMgd2hpY2ggYXJlIHByZXNlbnRlZAorICogaW4gYSBjaXJjdWxhciBidWZmZXIgYXMgc2V2ZXJhbCBldmVudHMgbWF5IGJlIHByb2Nlc3NlZCBvbiBvbmUgcGh5c2ljYWwgaW50CisgKi8KKyNkZWZpbmUgTUFYX0NJUkJVRkYgICAgIDMyCisKK3N0cnVjdCBjaXJidWZmIHsKKwl1OCByZGluZGV4OwkJLyogcmVhZCwgdGhlbiBpbmNyZW1lbnQgYW5kIHdyYXAgKi8KKwl1OCB3cmluZGV4OwkJLyogd3JpdGUsIHRoZW4gaW5jcmVtZW50IGFuZCB3cmFwICovCisJdTggZXZudGJ1ZmZbTUFYX0NJUkJVRkZdOworfTsKKworLyogSW50ZXJydXB0IGV2ZW50IGNvZGVzLgorICogV2hlcmUgYXBwcm9wcmlhdGUgdGhlIHR3byBsb3cgb3JkZXIgYml0cyBpbmRpY2F0ZSB0aGUgcG9ydCBudW1iZXIKKyAqLworI2RlZmluZSBDVExBX0NIRyAgICAgICAgMHgxOAkvKiBDb250cm9sIHNpZ25hbCBjaGFuZ2VkICovCisjZGVmaW5lIENUTEJfQ0hHICAgICAgICAweDE5CisjZGVmaW5lIENUTENfQ0hHICAgICAgICAweDFBCisjZGVmaW5lIENUTERfQ0hHICAgICAgICAweDFCCisKKyNkZWZpbmUgSU5JVF9DUExUICAgICAgIDB4MjAJLyogSW5pdGlhbGlzYXRpb24gY29tcGxldGUgKi8KKyNkZWZpbmUgSU5JVF9GQUlMICAgICAgIDB4MjEJLyogSW5pdGlhbGlzYXRpb24gZmFpbGVkICovCisKKyNkZWZpbmUgQUJUQV9TRU5UICAgICAgIDB4MjQJLyogQWJvcnQgc2VudCAqLworI2RlZmluZSBBQlRCX1NFTlQgICAgICAgMHgyNQorI2RlZmluZSBBQlRDX1NFTlQgICAgICAgMHgyNgorI2RlZmluZSBBQlREX1NFTlQgICAgICAgMHgyNworCisjZGVmaW5lIFRYQV9VTkRGICAgICAgICAweDI4CS8qIFRyYW5zbWlzc2lvbiB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgVFhCX1VOREYgICAgICAgIDB4MjkKKyNkZWZpbmUgVFhDX1VOREYgICAgICAgIDB4MkEKKyNkZWZpbmUgVFhEX1VOREYgICAgICAgIDB4MkIKKworI2RlZmluZSBGNTZfSU5UICAgICAgICAgMHgyQworI2RlZmluZSBNMzJfSU5UICAgICAgICAgMHgyRAorCisjZGVmaW5lIFRFMV9BTE1BICAgICAgICAweDMwCisKKy8qIFBvcnQgcGh5c2ljYWwgY29uZmlndXJhdGlvbi4gU2VlIGZhcnN5bmMuaCBmb3IgZmllbGQgdmFsdWVzICovCitzdHJ1Y3QgcG9ydF9jZmcgeworCXUxNiBsaW5lSW50ZXJmYWNlOwkvKiBQaHlzaWNhbCBpbnRlcmZhY2UgdHlwZSAqLworCXU4IHgyNW9wOwkJLyogVW51c2VkIGF0IHByZXNlbnQgKi8KKwl1OCBpbnRlcm5hbENsb2NrOwkvKiAxID0+IGludGVybmFsIGNsb2NrLCAwID0+IGV4dGVybmFsICovCisJdTggdHJhbnNwYXJlbnRNb2RlOwkvKiAxID0+IG9uLCAwID0+IG9mZiAqLworCXU4IGludmVydENsb2NrOwkJLyogMCA9PiBub3JtYWwsIDEgPT4gaW52ZXJ0ZWQgKi8KKwl1OCBwYWRCeXRlc1s2XTsJCS8qIFBhZGRpbmcgKi8KKwl1MzIgbGluZVNwZWVkOwkJLyogU3BlZWQgaW4gYnBzICovCit9OworCisvKiBURTEgcG9ydCBwaHlzaWNhbCBjb25maWd1cmF0aW9uICovCitzdHJ1Y3Qgc3VfY29uZmlnIHsKKwl1MzIgZGF0YVJhdGU7CisJdTggY2xvY2tpbmc7CisJdTggZnJhbWluZzsKKwl1OCBzdHJ1Y3R1cmU7CisJdTggaW50ZXJmYWNlOworCXU4IGNvZGluZzsKKwl1OCBsaW5lQnVpbGRPdXQ7CisJdTggZXF1YWxpemVyOworCXU4IHRyYW5zcGFyZW50TW9kZTsKKwl1OCBsb29wTW9kZTsKKwl1OCByYW5nZTsKKwl1OCB0eEJ1ZmZlck1vZGU7CisJdTggcnhCdWZmZXJNb2RlOworCXU4IHN0YXJ0aW5nU2xvdDsKKwl1OCBsb3NUaHJlc2hvbGQ7CisJdTggZW5hYmxlSWRsZUNvZGU7CisJdTggaWRsZUNvZGU7CisJdTggc3BhcmVbNDRdOworfTsKKworLyogVEUxIFN0YXR1cyAqLworc3RydWN0IHN1X3N0YXR1cyB7CisJdTMyIHJlY2VpdmVCdWZmZXJEZWxheTsKKwl1MzIgZnJhbWluZ0Vycm9yQ291bnQ7CisJdTMyIGNvZGVWaW9sYXRpb25Db3VudDsKKwl1MzIgY3JjRXJyb3JDb3VudDsKKwl1MzIgbGluZUF0dGVudWF0aW9uOworCXU4IHBvcnRTdGFydGVkOworCXU4IGxvc3NPZlNpZ25hbDsKKwl1OCByZWNlaXZlUmVtb3RlQWxhcm07CisJdTggYWxhcm1JbmRpY2F0aW9uU2lnbmFsOworCXU4IHNwYXJlWzQwXTsKK307CisKKy8qIEZpbmFsbHkgc2xpbmcgYWxsIHRoZSBhYm92ZSB0b2dldGhlciBpbnRvIHRoZSBzaGFyZWQgbWVtb3J5IHN0cnVjdHVyZS4KKyAqIFNvcnJ5IGl0J3MgYSBob2RnZSBwb2RnZSBvZiBhcnJheXMsIHN0cnVjdHVyZXMgYW5kIHVudXNlZCBiaXRzLCBpdCdzIGJlZW4KKyAqIGV2b2x2aW5nIHVuZGVyIE5UIGZvciBzb21lIHRpbWUgc28gSSBndWVzcyB3ZSdyZSBzdHVjayB3aXRoIGl0LgorICogVGhlIHN0cnVjdHVyZSBzdGFydHMgYXQgb2Zmc2V0IFNNQ19CQVNFLgorICogU2VlIGZhcnN5bmMuaCBmb3Igc29tZSBmaWVsZCB2YWx1ZXMuCisgKi8KK3N0cnVjdCBmc3Rfc2hhcmVkIHsKKwkvKiBETUEgZGVzY3JpcHRvciByaW5ncyAqLworCXN0cnVjdCByeGRlc2MgcnhEZXNjclJpbmdbRlNUX01BWF9QT1JUU11bTlVNX1JYX0JVRkZFUl07CisJc3RydWN0IHR4ZGVzYyB0eERlc2NyUmluZ1tGU1RfTUFYX1BPUlRTXVtOVU1fVFhfQlVGRkVSXTsKKworCS8qIE9ic29sZXRlIHNtYWxsIGJ1ZmZlcnMgKi8KKwl1OCBzbWFsbFJ4QnVmZmVyW0ZTVF9NQVhfUE9SVFNdW05VTV9SWF9CVUZGRVJdW0xFTl9TTUFMTF9SWF9CVUZGRVJdOworCXU4IHNtYWxsVHhCdWZmZXJbRlNUX01BWF9QT1JUU11bTlVNX1RYX0JVRkZFUl1bTEVOX1NNQUxMX1RYX0JVRkZFUl07CisKKwl1OCB0YXNrU3RhdHVzOwkJLyogMHgwMCA9PiBpbml0aWFsaXNpbmcsIDB4MDEgPT4gcnVubmluZywKKwkJCQkgKiAweEZGID0+IGhhbHRlZAorCQkJCSAqLworCisJdTggaW50ZXJydXB0SGFuZHNoYWtlOwkvKiBTZXQgdG8gMHgwMSBieSBhZGFwdGVyIHRvIHNpZ25hbCBpbnRlcnJ1cHQsCisJCQkJICogc2V0IHRvIDB4RUUgYnkgaG9zdCB0byBhY2tub3dsZWRnZSBpbnRlcnJ1cHQKKwkJCQkgKi8KKworCXUxNiBzbWNWZXJzaW9uOwkJLyogTXVzdCBtYXRjaCBTTUNfVkVSU0lPTiAqLworCisJdTMyIHNtY0Zpcm13YXJlVmVyc2lvbjsJLyogMHhJSVZWUlJCQiB3aGVyZSBJSSA9IHByb2R1Y3QgSUQsIFZWID0gbWFqb3IKKwkJCQkgKiB2ZXJzaW9uLCBSUiA9IHJldmlzaW9uIGFuZCBCQiA9IGJ1aWxkCisJCQkJICovCisKKwl1MTYgdHhhX2RvbmU7CQkvKiBPYnNvbGV0ZSBjb21wbGV0aW9uIGZsYWdzICovCisJdTE2IHJ4YV9kb25lOworCXUxNiB0eGJfZG9uZTsKKwl1MTYgcnhiX2RvbmU7CisJdTE2IHR4Y19kb25lOworCXUxNiByeGNfZG9uZTsKKwl1MTYgdHhkX2RvbmU7CisJdTE2IHJ4ZF9kb25lOworCisJdTE2IG1haWxib3hbNF07CQkvKiBEaWFnbm9zdGljcyBtYWlsYm94LiBOb3QgdXNlZCAqLworCisJc3RydWN0IGNpcmJ1ZmYgaW50ZXJydXB0RXZlbnQ7CS8qIGludGVycnVwdCBjYXVzZXMgKi8KKworCXUzMiB2MjRJcFN0c1tGU1RfTUFYX1BPUlRTXTsJLyogVi4yNCBjb250cm9sIGlucHV0IHN0YXR1cyAqLworCXUzMiB2MjRPcFN0c1tGU1RfTUFYX1BPUlRTXTsJLyogVi4yNCBjb250cm9sIG91dHB1dCBzdGF0dXMgKi8KKworCXN0cnVjdCBwb3J0X2NmZyBwb3J0Q29uZmlnW0ZTVF9NQVhfUE9SVFNdOworCisJdTE2IGNsb2NrU3RhdHVzW0ZTVF9NQVhfUE9SVFNdOwkvKiBsc2I6IDA9PiBwcmVzZW50LCAxPT4gYWJzZW50ICovCisKKwl1MTYgY2FibGVTdGF0dXM7CS8qIGxzYjogMD0+IHByZXNlbnQsIDE9PiBhYnNlbnQgKi8KKworCXUxNiB0eERlc2NySW5kZXhbRlNUX01BWF9QT1JUU107CS8qIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZyBpbmRleCAqLworCXUxNiByeERlc2NySW5kZXhbRlNUX01BWF9QT1JUU107CS8qIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nIGluZGV4ICovCisKKwl1MTYgcG9ydE1haWxib3hbRlNUX01BWF9QT1JUU11bMl07CS8qIGNvbW1hbmQsIG1vZGlmaWVyICovCisJdTE2IGNhcmRNYWlsYm94WzRdOwkvKiBOb3QgdXNlZCAqLworCisJLyogTnVtYmVyIG9mIHRpbWVzIHRoZSBjYXJkIHRoaW5rcyB0aGUgaG9zdCBoYXMKKwkgKiBtaXNzZWQgYW4gaW50ZXJydXB0IGJ5IG5vdCBhY2tub3dsZWRnaW5nCisJICogd2l0aGluIDJtUyAoSSBndWVzcyBOVCBoYXMgcHJvYmxlbXMpCisJICovCisJdTMyIGludGVycnVwdFJldHJ5Q291bnQ7CisKKwkvKiBEcml2ZXIgcHJpdmF0ZSBkYXRhIHVzZWQgYXMgYW4gSUQuIFdlJ2xsIG5vdAorCSAqIHVzZSB0aGlzIGFzIEknZCByYXRoZXIga2VlcCBzdWNoIHRoaW5ncworCSAqIGluIG1haW4gbWVtb3J5IHJhdGhlciB0aGFuIG9uIHRoZSBQQ0kgYnVzCisJICovCisJdTMyIHBvcnRIYW5kbGVbRlNUX01BWF9QT1JUU107CisKKwkvKiBDb3VudCBvZiBUeCB1bmRlcmZsb3dzIGZvciBzdGF0cyAqLworCXUzMiB0cmFuc21pdEJ1ZmZlclVuZGVyZmxvd1tGU1RfTUFYX1BPUlRTXTsKKworCS8qIERlYm91bmNlZCBWLjI0IGNvbnRyb2wgaW5wdXQgc3RhdHVzICovCisJdTMyIHYyNERlYm91bmNlZFN0c1tGU1RfTUFYX1BPUlRTXTsKKworCS8qIEFkYXB0ZXIgZGVib3VuY2UgdGltZXJzLiBEb24ndCB0b3VjaCAqLworCXUzMiBjdHNUaW1lcltGU1RfTUFYX1BPUlRTXTsKKwl1MzIgY3RzVGltZXJSdW5bRlNUX01BWF9QT1JUU107CisJdTMyIGRjZFRpbWVyW0ZTVF9NQVhfUE9SVFNdOworCXUzMiBkY2RUaW1lclJ1bltGU1RfTUFYX1BPUlRTXTsKKworCXUzMiBudW1iZXJPZlBvcnRzOwkvKiBOdW1iZXIgb2YgcG9ydHMgZGV0ZWN0ZWQgYXQgc3RhcnR1cCAqLworCisJdTE2IF9yZXNlcnZlZFs2NF07CisKKwl1MTYgY2FyZE1vZGU7CQkvKiBCaXQtbWFzayB0byBlbmFibGUgZmVhdHVyZXM6CisJCQkJICogQml0IDA6IDEgZW5hYmxlcyBMRUQgaWRlbnRpZnkgbW9kZQorCQkJCSAqLworCisJdTE2IHBvcnRTY2hlZHVsZU9mZnNldDsKKworCXN0cnVjdCBzdV9jb25maWcgc3VDb25maWc7CS8qIFRFMSBCaXRzICovCisJc3RydWN0IHN1X3N0YXR1cyBzdVN0YXR1czsKKworCXUzMiBlbmRPZlNtY1NpZ25hdHVyZTsJLyogZW5kT2ZTbWNTaWduYXR1cmUgTVVTVCBiZSB0aGUgbGFzdCBtZW1iZXIgb2YKKwkJCQkgKiB0aGUgc3RydWN0dXJlIGFuZCBtYXJrcyB0aGUgZW5kIG9mIHNoYXJlZAorCQkJCSAqIG1lbW9yeS4gQWRhcHRlciBjb2RlIGluaXRpYWxpemVzIGl0IGFzCisJCQkJICogRU5EX1NJRy4KKwkJCQkgKi8KK307CisKKy8qIGVuZE9mU21jU2lnbmF0dXJlIHZhbHVlICovCisjZGVmaW5lIEVORF9TSUcgICAgICAgICAgICAgICAgIDB4MTIzNDU2NzgKKworLyogTWFpbGJveCB2YWx1ZXMuIChwb3J0TWFpbGJveCkgKi8KKyNkZWZpbmUgTk9QICAgICAgICAgICAgIDAJLyogTm8gb3BlcmF0aW9uICovCisjZGVmaW5lIEFDSyAgICAgICAgICAgICAxCS8qIFBvc2l0aXZlIGFja25vd2xlZGdlbWVudCB0byBQQyBkcml2ZXIgKi8KKyNkZWZpbmUgTkFLICAgICAgICAgICAgIDIJLyogTmVnYXRpdmUgYWNrbm93bGVkZ2VtZW50IHRvIFBDIGRyaXZlciAqLworI2RlZmluZSBTVEFSVFBPUlQgICAgICAgMwkvKiBTdGFydCBhbiBIRExDIHBvcnQgKi8KKyNkZWZpbmUgU1RPUFBPUlQgICAgICAgIDQJLyogU3RvcCBhbiBIRExDIHBvcnQgKi8KKyNkZWZpbmUgQUJPUlRUWCAgICAgICAgIDUJLyogQWJvcnQgdGhlIHRyYW5zbWl0dGVyIGZvciBhIHBvcnQgKi8KKyNkZWZpbmUgU0VUVjI0TyAgICAgICAgIDYJLyogU2V0IFYyNCBvdXRwdXRzICovCisKKy8qIFBMWCBDaGlwIFJlZ2lzdGVyIE9mZnNldHMgKi8KKyNkZWZpbmUgQ05UUkxfOTA1MiAgICAgIDB4NTAJLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBDTlRSTF85MDU0ICAgICAgMHg2YwkvKiBDb250cm9sIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgSU5UQ1NSXzkwNTIgICAgIDB4NGMJLyogSW50ZXJydXB0IGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIElOVENTUl85MDU0ICAgICAweDY4CS8qIEludGVycnVwdCBjb250cm9sL3N0YXR1cyByZWdpc3RlciAqLworCisvKiA5MDU0IERNQSBSZWdpc3RlcnMgKi8KKy8qCisgKiBOb3RlIHRoYXQgd2Ugd2lsbCBiZSB1c2luZyBETUEgQ2hhbm5lbCAwIGZvciBjb3B5aW5nIHJ4IGRhdGEKKyAqIGFuZCBDaGFubmVsIDEgZm9yIGNvcHlpbmcgdHggZGF0YQorICovCisjZGVmaW5lIERNQU1PREUwICAgICAgICAweDgwCisjZGVmaW5lIERNQVBBRFIwICAgICAgICAweDg0CisjZGVmaW5lIERNQUxBRFIwICAgICAgICAweDg4CisjZGVmaW5lIERNQVNJWjAgICAgICAgICAweDhjCisjZGVmaW5lIERNQURQUjAgICAgICAgICAweDkwCisjZGVmaW5lIERNQU1PREUxICAgICAgICAweDk0CisjZGVmaW5lIERNQVBBRFIxICAgICAgICAweDk4CisjZGVmaW5lIERNQUxBRFIxICAgICAgICAweDljCisjZGVmaW5lIERNQVNJWjEgICAgICAgICAweGEwCisjZGVmaW5lIERNQURQUjEgICAgICAgICAweGE0CisjZGVmaW5lIERNQUNTUjAgICAgICAgICAweGE4CisjZGVmaW5lIERNQUNTUjEgICAgICAgICAweGE5CisjZGVmaW5lIERNQUFSQiAgICAgICAgICAweGFjCisjZGVmaW5lIERNQVRIUiAgICAgICAgICAweGIwCisjZGVmaW5lIERNQURBQzAgICAgICAgICAweGI0CisjZGVmaW5lIERNQURBQzEgICAgICAgICAweGI4CisjZGVmaW5lIERNQU1BUkJSICAgICAgICAweGFjCisKKyNkZWZpbmUgRlNUX01JTl9ETUFfTEVOIDY0CisjZGVmaW5lIEZTVF9SWF9ETUFfSU5UICAweDAxCisjZGVmaW5lIEZTVF9UWF9ETUFfSU5UICAweDAyCisjZGVmaW5lIEZTVF9DQVJEX0lOVCAgICAweDA0CisKKy8qIExhcmdlciBidWZmZXJzIGFyZSBwb3NpdGlvbmVkIGluIG1lbW9yeSBhdCBvZmZzZXQgQkZNX0JBU0UgKi8KK3N0cnVjdCBidWZfd2luZG93IHsKKwl1OCB0eEJ1ZmZlcltGU1RfTUFYX1BPUlRTXVtOVU1fVFhfQlVGRkVSXVtMRU5fVFhfQlVGRkVSXTsKKwl1OCByeEJ1ZmZlcltGU1RfTUFYX1BPUlRTXVtOVU1fUlhfQlVGRkVSXVtMRU5fUlhfQlVGRkVSXTsKK307CisKKy8qIENhbGN1bGF0ZSBvZmZzZXQgb2YgYSBidWZmZXIgb2JqZWN0IHdpdGhpbiB0aGUgc2hhcmVkIG1lbW9yeSB3aW5kb3cgKi8KKyNkZWZpbmUgQlVGX09GRlNFVChYKSAgIChCRk1fQkFTRSArIG9mZnNldG9mKHN0cnVjdCBidWZfd2luZG93LCBYKSkKKworI3ByYWdtYSBwYWNrKCkKKworLyogICAgICBEZXZpY2UgZHJpdmVyIHByaXZhdGUgaW5mb3JtYXRpb24KKyAqICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qICAgICAgUGVyIHBvcnQgKGxpbmUgb3IgY2hhbm5lbCkgaW5mb3JtYXRpb24KKyAqLworc3RydWN0IGZzdF9wb3J0X2luZm8geworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OyAvKiBEZXZpY2Ugc3RydWN0IC0gbXVzdCBiZSBmaXJzdCAqLworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOwkvKiBDYXJkIHdlJ3JlIGFzc29jaWF0ZWQgd2l0aCAqLworCWludCBpbmRleDsJCS8qIFBvcnQgaW5kZXggb24gdGhlIGNhcmQgKi8KKwlpbnQgaHdpZjsJCS8qIExpbmUgaGFyZHdhcmUgKGxpbmVJbnRlcmZhY2UgY29weSkgKi8KKwlpbnQgcnVuOwkJLyogUG9ydCBpcyBydW5uaW5nICovCisJaW50IG1vZGU7CQkvKiBOb3JtYWwgb3IgRmFyU3luYyByYXcgKi8KKwlpbnQgcnhwb3M7CQkvKiBOZXh0IFJ4IGJ1ZmZlciB0byB1c2UgKi8KKwlpbnQgdHhwb3M7CQkvKiBOZXh0IFR4IGJ1ZmZlciB0byB1c2UgKi8KKwlpbnQgdHhpcG9zOwkJLyogTmV4dCBUeCBidWZmZXIgdG8gY2hlY2sgZm9yIGZyZWUgKi8KKwlpbnQgc3RhcnQ7CQkvKiBJbmRpY2F0aW9uIG9mIHN0YXJ0L3N0b3AgdG8gbmV0d29yayAqLworCS8qCisJICogQSBzaXh0ZWVuIGVudHJ5IHRyYW5zbWl0IHF1ZXVlCisJICovCisJaW50IHR4cXM7CQkvKiBpbmRleCB0byBnZXQgbmV4dCBidWZmZXIgdG8gdHggKi8KKwlpbnQgdHhxZTsJCS8qIGluZGV4IHRvIHF1ZXVlIG5leHQgcGFja2V0ICovCisJc3RydWN0IHNrX2J1ZmYgKnR4cVtGU1RfVFhRX0RFUFRIXTsJLyogVGhlIHF1ZXVlICovCisJaW50IHJ4cWRlcHRoOworfTsKKworLyogICAgICBQZXIgY2FyZCBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgZnN0X2NhcmRfaW5mbyB7CisJY2hhciBfX2lvbWVtICptZW07CS8qIENhcmQgbWVtb3J5IG1hcHBlZCB0byBrZXJuZWwgc3BhY2UgKi8KKwljaGFyIF9faW9tZW0gKmN0bG1lbTsJLyogQ29udHJvbCBtZW1vcnkgZm9yIFBDSSBjYXJkcyAqLworCXVuc2lnbmVkIGludCBwaHlzX21lbTsJLyogUGh5c2ljYWwgbWVtb3J5IHdpbmRvdyBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IHBoeXNfY3RsbWVtOwkvKiBQaHlzaWNhbCBjb250cm9sIG1lbW9yeSBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IGlycTsJLyogSW50ZXJydXB0IHJlcXVlc3QgbGluZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgbnBvcnRzOwkvKiBOdW1iZXIgb2Ygc2VyaWFsIHBvcnRzICovCisJdW5zaWduZWQgaW50IHR5cGU7CS8qIFR5cGUgaW5kZXggb2YgY2FyZCAqLworCXVuc2lnbmVkIGludCBzdGF0ZTsJLyogU3RhdGUgb2YgY2FyZCAqLworCXNwaW5sb2NrX3QgY2FyZF9sb2NrOwkvKiBMb2NrIGZvciBTTVAgYWNjZXNzICovCisJdW5zaWduZWQgc2hvcnQgcGNpX2NvbmY7CS8qIFBDSSBjYXJkIGNvbmZpZyBpbiBJL08gc3BhY2UgKi8KKwkvKiBQZXIgcG9ydCBpbmZvICovCisJc3RydWN0IGZzdF9wb3J0X2luZm8gcG9ydHNbRlNUX01BWF9QT1JUU107CisJc3RydWN0IHBjaV9kZXYgKmRldmljZTsJLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHBjaSBkZXZpY2UgKi8KKwlpbnQgY2FyZF9ubzsJCS8qIEluc3Qgb2YgdGhlIGNhcmQgb24gdGhlIHN5c3RlbSAqLworCWludCBmYW1pbHk7CQkvKiBUeFAgb3IgVHhVICovCisJaW50IGRtYXJ4X2luX3Byb2dyZXNzOworCWludCBkbWF0eF9pbl9wcm9ncmVzczsKKwl1bnNpZ25lZCBsb25nIGludF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGludF90aW1lX2F2ZTsKKwl2b2lkICpyeF9kbWFfaGFuZGxlX2hvc3Q7CisJZG1hX2FkZHJfdCByeF9kbWFfaGFuZGxlX2NhcmQ7CisJdm9pZCAqdHhfZG1hX2hhbmRsZV9ob3N0OworCWRtYV9hZGRyX3QgdHhfZG1hX2hhbmRsZV9jYXJkOworCXN0cnVjdCBza19idWZmICpkbWFfc2tiX3J4OworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpkbWFfcG9ydF9yeDsKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqZG1hX3BvcnRfdHg7CisJaW50IGRtYV9sZW5fcng7CisJaW50IGRtYV9sZW5fdHg7CisJaW50IGRtYV90eHBvczsKKwlpbnQgZG1hX3J4cG9zOworfTsKKworLyogQ29udmVydCBhbiBIRExDIGRldmljZSBwb2ludGVyIGludG8gYSBwb3J0IGluZm8gcG9pbnRlciBhbmQgc2ltaWxhciAqLworI2RlZmluZSBkZXZfdG9fcG9ydChEKSAgKGRldl90b19oZGxjKEQpLT5wcml2KQorI2RlZmluZSBwb3J0X3RvX2RldihQKSAgKChQKS0+ZGV2KQorCisKKy8qCisgKiAgICAgIFNoYXJlZCBtZW1vcnkgd2luZG93IGFjY2VzcyBtYWNyb3MKKyAqCisgKiAgICAgIFdlIGhhdmUgYSBuaWNlIG1lbW9yeSBiYXNlZCBzdHJ1Y3R1cmUgYWJvdmUsIHdoaWNoIGNvdWxkIGJlIGRpcmVjdGx5CisgKiAgICAgIG1hcHBlZCBvbiBpMzg2IGJ1dCBtaWdodCBub3Qgd29yayBvbiBvdGhlciBhcmNoaXRlY3R1cmVzIHVubGVzcyB3ZSB1c2UKKyAqICAgICAgdGhlIHJlYWRiLHcsbCBhbmQgd3JpdGViLHcsbCBtYWNyb3MuIFVuZm9ydHVuYXRlbHkgdGhlc2UgbWFjcm9zIHRha2UKKyAqICAgICAgcGh5c2ljYWwgb2Zmc2V0cyBzbyB3ZSBoYXZlIHRvIGNvbnZlcnQuIFRoZSBvbmx5IHNhdmluZyBncmFjZSBpcyB0aGF0CisgKiAgICAgIHRoaXMgc2hvdWxkIGFsbCBjb2xsYXBzZSBiYWNrIHRvIGEgc2ltcGxlIGluZGlyZWN0aW9uIGV2ZW50dWFsbHkuCisgKi8KKyNkZWZpbmUgV0lOX09GRlNFVChYKSAgICgobG9uZykmKCgoc3RydWN0IGZzdF9zaGFyZWQgKilTTUNfQkFTRSktPlgpKQorCisjZGVmaW5lIEZTVF9SREIoQyxFKSAgICByZWFkYiAoKEMpLT5tZW0gKyBXSU5fT0ZGU0VUKEUpKQorI2RlZmluZSBGU1RfUkRXKEMsRSkgICAgcmVhZHcgKChDKS0+bWVtICsgV0lOX09GRlNFVChFKSkKKyNkZWZpbmUgRlNUX1JETChDLEUpICAgIHJlYWRsICgoQyktPm1lbSArIFdJTl9PRkZTRVQoRSkpCisKKyNkZWZpbmUgRlNUX1dSQihDLEUsQikgIHdyaXRlYiAoKEIpLCAoQyktPm1lbSArIFdJTl9PRkZTRVQoRSkpCisjZGVmaW5lIEZTVF9XUlcoQyxFLFcpICB3cml0ZXcgKChXKSwgKEMpLT5tZW0gKyBXSU5fT0ZGU0VUKEUpKQorI2RlZmluZSBGU1RfV1JMKEMsRSxMKSAgd3JpdGVsICgoTCksIChDKS0+bWVtICsgV0lOX09GRlNFVChFKSkKKworLyoKKyAqICAgICAgRGVidWcgc3VwcG9ydAorICovCisjaWYgRlNUX0RFQlVHCisKK3N0YXRpYyBpbnQgZnN0X2RlYnVnX21hc2sgPSB7IEZTVF9ERUJVRyB9OworCisvKiBNb3N0IGNvbW1vbiBkZWJ1ZyBhY3Rpdml0eSBpcyB0byBwcmludCBzb21ldGhpbmcgaWYgdGhlIGNvcnJlc3BvbmRpbmcgYml0CisgKiBpcyBzZXQgaW4gdGhlIGRlYnVnIG1hc2suIE5vdGU6IHRoaXMgdXNlcyBhIG5vbi1BTlNJIGV4dGVuc2lvbiBpbiBHQ0MgdG8KKyAqIHN1cHBvcnQgdmFyaWFibGUgbnVtYmVycyBvZiBtYWNybyBwYXJhbWV0ZXJzLiBUaGUgaW52ZXJ0ZWQgaWYgcHJldmVudHMgdXMKKyAqIGVhdGluZyBzb21lb25lIGVsc2UncyBlbHNlIGNsYXVzZS4KKyAqLworI2RlZmluZSBkYmcoRixmbXQsQS4uLikgaWYgKCAhICggZnN0X2RlYnVnX21hc2sgJiAoRikpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoIEtFUk5fREVCVUcgRlNUX05BTUUgIjogIiBmbXQsICMjIEEgKQorCisjZWxzZQorI2RlZmluZSBkYmcoWC4uLikJCS8qIE5PUCAqLworI2VuZGlmCisKKy8qICAgICAgUHJpbnRpbmcgc2hvcnQgY3V0cworICovCisjZGVmaW5lIHByaW50a19lcnIoZm10LEEuLi4pICAgIHByaW50ayAoIEtFUk5fRVJSICAgICBGU1RfTkFNRSAiOiAiIGZtdCwgIyMgQSApCisjZGVmaW5lIHByaW50a193YXJuKGZtdCxBLi4uKSAgIHByaW50ayAoIEtFUk5fV0FSTklORyBGU1RfTkFNRSAiOiAiIGZtdCwgIyMgQSApCisjZGVmaW5lIHByaW50a19pbmZvKGZtdCxBLi4uKSAgIHByaW50ayAoIEtFUk5fSU5GTyAgICBGU1RfTkFNRSAiOiAiIGZtdCwgIyMgQSApCisKKy8qCisgKiAgICAgIFBDSSBJRCBsb29rdXAgdGFibGUKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGZzdF9wY2lfZGV2X2lkW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9GQVJTSVRFLCBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVDJQLCBQQ0lfQU5ZX0lELCAKKwkgUENJX0FOWV9JRCwgMCwgMCwgRlNUX1RZUEVfVDJQfSwKKworCXtQQ0lfVkVORE9SX0lEX0ZBUlNJVEUsIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UNFAsIFBDSV9BTllfSUQsIAorCSBQQ0lfQU5ZX0lELCAwLCAwLCBGU1RfVFlQRV9UNFB9LAorCisJe1BDSV9WRU5ET1JfSURfRkFSU0lURSwgUENJX0RFVklDRV9JRF9GQVJTSVRFX1QxVSwgUENJX0FOWV9JRCwgCisJIFBDSV9BTllfSUQsIDAsIDAsIEZTVF9UWVBFX1QxVX0sCisKKwl7UENJX1ZFTkRPUl9JRF9GQVJTSVRFLCBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVDJVLCBQQ0lfQU5ZX0lELCAKKwkgUENJX0FOWV9JRCwgMCwgMCwgRlNUX1RZUEVfVDJVfSwKKworCXtQQ0lfVkVORE9SX0lEX0ZBUlNJVEUsIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UNFUsIFBDSV9BTllfSUQsIAorCSBQQ0lfQU5ZX0lELCAwLCAwLCBGU1RfVFlQRV9UNFV9LAorCisJe1BDSV9WRU5ET1JfSURfRkFSU0lURSwgUENJX0RFVklDRV9JRF9GQVJTSVRFX1RFMSwgUENJX0FOWV9JRCwgCisJIFBDSV9BTllfSUQsIDAsIDAsIEZTVF9UWVBFX1RFMX0sCisKKwl7UENJX1ZFTkRPUl9JRF9GQVJTSVRFLCBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVEUxQywgUENJX0FOWV9JRCwgCisJIFBDSV9BTllfSUQsIDAsIDAsIEZTVF9UWVBFX1RFMX0sCisJezAsfQkJCS8qIEVuZCAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGZzdF9wY2lfZGV2X2lkKTsKKworLyoKKyAqICAgICAgRGV2aWNlIERyaXZlciBXb3JrIFF1ZXVlcworICoKKyAqICAgICAgU28gdGhhdCB3ZSBkb24ndCBzcGVuZCB0b28gbXVjaCB0aW1lIHByb2Nlc3NpbmcgZXZlbnRzIGluIHRoZSAKKyAqICAgICAgSW50ZXJydXB0IFNlcnZpY2Ugcm91dGluZSwgd2Ugd2lsbCBkZWNsYXJlIGEgd29yayBxdWV1ZSBwZXIgQ2FyZCAKKyAqICAgICAgYW5kIG1ha2UgdGhlIElTUiBzY2hlZHVsZSBhIHRhc2sgaW4gdGhlIHF1ZXVlIGZvciBsYXRlciBleGVjdXRpb24uCisgKiAgICAgIEluIHRoZSAyLjQgS2VybmVsIHdlIHVzZWQgdG8gdXNlIHRoZSBpbW1lZGlhdGUgcXVldWUgZm9yIEJIJ3MKKyAqICAgICAgTm93IHRoYXQgdGhleSBhcmUgZ29uZSwgdGFza2xldHMgc2VlbSB0byBiZSBtdWNoIGJldHRlciB0aGFuIHdvcmsgCisgKiAgICAgIHF1ZXVlcy4KKyAqLworCitzdGF0aWMgdm9pZCBkb19ib3R0b21faGFsZl90eChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCk7CitzdGF0aWMgdm9pZCBkb19ib3R0b21faGFsZl9yeChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCk7CitzdGF0aWMgdm9pZCBmc3RfcHJvY2Vzc190eF93b3JrX3EodW5zaWduZWQgbG9uZyB3b3JrX3EpOworc3RhdGljIHZvaWQgZnN0X3Byb2Nlc3NfaW50X3dvcmtfcSh1bnNpZ25lZCBsb25nIHdvcmtfcSk7CisKK0RFQ0xBUkVfVEFTS0xFVChmc3RfdHhfdGFzaywgZnN0X3Byb2Nlc3NfdHhfd29ya19xLCAwKTsKK0RFQ0xBUkVfVEFTS0xFVChmc3RfaW50X3Rhc2ssIGZzdF9wcm9jZXNzX2ludF93b3JrX3EsIDApOworCitzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqZnN0X2NhcmRfYXJyYXlbRlNUX01BWF9DQVJEU107CitzcGlubG9ja190IGZzdF93b3JrX3FfbG9jazsKK3U2NCBmc3Rfd29ya190eHE7Cit1NjQgZnN0X3dvcmtfaW50cTsKKworc3RhdGljIHZvaWQKK2ZzdF9xX3dvcmtfaXRlbSh1NjQgKiBxdWV1ZSwgaW50IGNhcmRfaW5kZXgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1NjQgbWFzazsKKworCS8qCisJICogR3JhYiB0aGUgcXVldWUgZXhjbHVzaXZlbHkKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnN0X3dvcmtfcV9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIE1ha2luZyBhbiBlbnRyeSBpbiB0aGUgcXVldWUgaXMgc2ltcGx5IGEgbWF0dGVyIG9mIHNldHRpbmcKKwkgKiBhIGJpdCBmb3IgdGhlIGNhcmQgaW5kaWNhdGluZyB0aGF0IHRoZXJlIGlzIHdvcmsgdG8gZG8gaW4gdGhlCisJICogYm90dG9tIGhhbGYgZm9yIHRoZSBjYXJkLiAgTm90ZSB0aGUgbGltaXRhdGlvbiBvZiA2NCBjYXJkcy4KKwkgKiBUaGF0IG91Z2h0IHRvIGJlIGVub3VnaAorCSAqLworCW1hc2sgPSAxIDw8IGNhcmRfaW5kZXg7CisJKnF1ZXVlIHw9IG1hc2s7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnN0X3dvcmtfcV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitmc3RfcHJvY2Vzc190eF93b3JrX3EodW5zaWduZWQgbG9uZyAvKnZvaWQgKiovd29ya19xKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTY0IHdvcmtfdHhxOworCWludCBpOworCisJLyoKKwkgKiBHcmFiIHRoZSBxdWV1ZSBleGNsdXNpdmVseQorCSAqLworCWRiZyhEQkdfVFgsICJmc3RfcHJvY2Vzc190eF93b3JrX3FcbiIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZmc3Rfd29ya19xX2xvY2ssIGZsYWdzKTsKKwl3b3JrX3R4cSA9IGZzdF93b3JrX3R4cTsKKwlmc3Rfd29ya190eHEgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZzdF93b3JrX3FfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBDYWxsIHRoZSBib3R0b20gaGFsZiBmb3IgZWFjaCBjYXJkIHdpdGggd29yayB3YWl0aW5nCisJICovCisJZm9yIChpID0gMDsgaSA8IEZTVF9NQVhfQ0FSRFM7IGkrKykgeworCQlpZiAod29ya190eHEgJiAweDAxKSB7CisJCQlpZiAoZnN0X2NhcmRfYXJyYXlbaV0gIT0gTlVMTCkgeworCQkJCWRiZyhEQkdfVFgsICJDYWxsaW5nIHR4IGJoIGZvciBjYXJkICVkXG4iLCBpKTsKKwkJCQlkb19ib3R0b21faGFsZl90eChmc3RfY2FyZF9hcnJheVtpXSk7CisJCQl9CisJCX0KKwkJd29ya190eHEgPSB3b3JrX3R4cSA+PiAxOworCX0KK30KKworc3RhdGljIHZvaWQKK2ZzdF9wcm9jZXNzX2ludF93b3JrX3EodW5zaWduZWQgbG9uZyAvKnZvaWQgKiovd29ya19xKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTY0IHdvcmtfaW50cTsKKwlpbnQgaTsKKworCS8qCisJICogR3JhYiB0aGUgcXVldWUgZXhjbHVzaXZlbHkKKwkgKi8KKwlkYmcoREJHX0lOVFIsICJmc3RfcHJvY2Vzc19pbnRfd29ya19xXG4iKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnN0X3dvcmtfcV9sb2NrLCBmbGFncyk7CisJd29ya19pbnRxID0gZnN0X3dvcmtfaW50cTsKKwlmc3Rfd29ya19pbnRxID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmc3Rfd29ya19xX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogQ2FsbCB0aGUgYm90dG9tIGhhbGYgZm9yIGVhY2ggY2FyZCB3aXRoIHdvcmsgd2FpdGluZworCSAqLworCWZvciAoaSA9IDA7IGkgPCBGU1RfTUFYX0NBUkRTOyBpKyspIHsKKwkJaWYgKHdvcmtfaW50cSAmIDB4MDEpIHsKKwkJCWlmIChmc3RfY2FyZF9hcnJheVtpXSAhPSBOVUxMKSB7CisJCQkJZGJnKERCR19JTlRSLAorCQkJCSAgICAiQ2FsbGluZyByeCAmIHR4IGJoIGZvciBjYXJkICVkXG4iLCBpKTsKKwkJCQlkb19ib3R0b21faGFsZl9yeChmc3RfY2FyZF9hcnJheVtpXSk7CisJCQkJZG9fYm90dG9tX2hhbGZfdHgoZnN0X2NhcmRfYXJyYXlbaV0pOworCQkJfQorCQl9CisJCXdvcmtfaW50cSA9IHdvcmtfaW50cSA+PiAxOworCX0KK30KKworLyogICAgICBDYXJkIGNvbnRyb2wgZnVuY3Rpb25zCisgKiAgICAgID09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyogICAgICBQbGFjZSB0aGUgcHJvY2Vzc29yIGluIHJlc2V0IHN0YXRlCisgKgorICogVXNlZCB0byBiZSBhIHNpbXBsZSB3cml0ZSB0byBjYXJkIGNvbnRyb2wgc3BhY2UgYnV0IGEgZ2xpdGNoIGluIHRoZSBsYXRlc3QKKyAqIEFNRCBBbTE4NkNIIHByb2Nlc3NvciBtZWFucyB0aGF0IHdlIG5vdyBoYXZlIHRvIGRvIGl0IGJ5IGFzc2VydGluZyBhbmQgZGUtCisgKiBhc3NlcnRpbmcgdGhlIFBMWCBjaGlwIFBDSSBBZGFwdGVyIFNvZnR3YXJlIFJlc2V0LiBCaXQgMzAgaW4gQ05UUkwgcmVnaXN0ZXIKKyAqIGF0IG9mZnNldCA5MDUyX0NOVFJMLiAgTm90ZSB0aGUgdXBkYXRlcyBmb3IgdGhlIFRYVS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3RfY3B1cmVzZXQoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQpCit7CisJdW5zaWduZWQgY2hhciBpbnRlcnJ1cHRfbGluZV9yZWdpc3RlcjsKKwl1bnNpZ25lZCBsb25nIGogPSBqaWZmaWVzICsgMTsKKwl1bnNpZ25lZCBpbnQgcmVndmFsOworCisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUKKwkJICAgIChjYXJkLT5kZXZpY2UsIFBDSV9JTlRFUlJVUFRfTElORSwgJmludGVycnVwdF9saW5lX3JlZ2lzdGVyKSkgeworCQkJZGJnKERCR19BU1MsCisJCQkgICAgIkVycm9yIGluIHJlYWRpbmcgaW50ZXJydXB0IGxpbmUgcmVnaXN0ZXJcbiIpOworCQl9CisJCS8qCisJCSAqIEFzc2VydCBQTFggc29mdHdhcmUgcmVzZXQgYW5kIEFtMTg2IGhhcmR3YXJlIHJlc2V0CisJCSAqIGFuZCB0aGVuIGRlYXNzZXJ0IHRoZSBQTFggc29mdHdhcmUgcmVzZXQgYnV0IDE4NiBzdGlsbCBpbiByZXNldAorCQkgKi8KKwkJb3V0dygweDQ0MGYsIGNhcmQtPnBjaV9jb25mICsgQ05UUkxfOTA1NCArIDIpOworCQlvdXR3KDB4MDQwZiwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0ICsgMik7CisJCS8qCisJCSAqIFdlIGFyZSBkZWxheWluZyBoZXJlIHRvIGFsbG93IHRoZSA5MDU0IHRvIHJlc2V0IGl0c2VsZgorCQkgKi8KKwkJaiA9IGppZmZpZXMgKyAxOworCQl3aGlsZSAoamlmZmllcyA8IGopCisJCQkvKiBEbyBub3RoaW5nICovIDsKKwkJb3V0dygweDI0MGYsIGNhcmQtPnBjaV9jb25mICsgQ05UUkxfOTA1NCArIDIpOworCQkvKgorCQkgKiBXZSBhcmUgZGVsYXlpbmcgaGVyZSB0byBhbGxvdyB0aGUgOTA1NCB0byByZWxvYWQgaXRzIGVlcHJvbQorCQkgKi8KKwkJaiA9IGppZmZpZXMgKyAxOworCQl3aGlsZSAoamlmZmllcyA8IGopCisJCQkvKiBEbyBub3RoaW5nICovIDsKKwkJb3V0dygweDA0MGYsIGNhcmQtPnBjaV9jb25mICsgQ05UUkxfOTA1NCArIDIpOworCisJCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUKKwkJICAgIChjYXJkLT5kZXZpY2UsIFBDSV9JTlRFUlJVUFRfTElORSwgaW50ZXJydXB0X2xpbmVfcmVnaXN0ZXIpKSB7CisJCQlkYmcoREJHX0FTUywKKwkJCSAgICAiRXJyb3IgaW4gd3JpdGluZyBpbnRlcnJ1cHQgbGluZSByZWdpc3RlclxuIik7CisJCX0KKworCX0gZWxzZSB7CisJCXJlZ3ZhbCA9IGlubChjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTIpOworCisJCW91dGwocmVndmFsIHwgMHg0MDAwMDAwMCwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDUyKTsKKwkJb3V0bChyZWd2YWwgJiB+MHg0MDAwMDAwMCwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDUyKTsKKwl9Cit9CisKKy8qICAgICAgUmVsZWFzZSB0aGUgcHJvY2Vzc29yIGZyb20gcmVzZXQKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3RfY3B1cmVsZWFzZShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwlpZiAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCS8qCisJCSAqIEZvcmNlIHBvc3RlZCB3cml0ZXMgdG8gY29tcGxldGUKKwkJICovCisJCSh2b2lkKSByZWFkYihjYXJkLT5tZW0pOworCisJCS8qCisJCSAqIFJlbGVhc2UgTFJFU0VUIERPID0gMQorCQkgKiBUaGVuIHJlbGVhc2UgTG9jYWwgSG9sZCwgRE8gPSAxCisJCSAqLworCQlvdXR3KDB4MDQwZSwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0ICsgMik7CisJCW91dHcoMHgwNDBmLCBjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTQgKyAyKTsKKwl9IGVsc2UgeworCQkodm9pZCkgcmVhZGIoY2FyZC0+Y3RsbWVtKTsKKwl9Cit9CisKKy8qICAgICAgQ2xlYXIgdGhlIGNhcmRzIGludGVycnVwdCBmbGFnCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZnN0X2NsZWFyX2ludHIoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQpCit7CisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQkodm9pZCkgcmVhZGIoY2FyZC0+Y3RsbWVtKTsKKwl9IGVsc2UgeworCQkvKiBQb2tlIHRoZSBhcHByb3ByaWF0ZSBQTFggY2hpcCByZWdpc3RlciAoc2FtZSBhcyBlbmFibGluZyBpbnRlcnJ1cHRzKQorCQkgKi8KKwkJb3V0dygweDA1NDMsIGNhcmQtPnBjaV9jb25mICsgSU5UQ1NSXzkwNTIpOworCX0KK30KKworLyogICAgICBFbmFibGUgY2FyZCBpbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZnN0X2VuYWJsZV9pbnRyKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQoreworCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9UWFUpIHsKKwkJb3V0bCgweDBmMGMwOTAwLCBjYXJkLT5wY2lfY29uZiArIElOVENTUl85MDU0KTsKKwl9IGVsc2UgeworCQlvdXR3KDB4MDU0MywgY2FyZC0+cGNpX2NvbmYgKyBJTlRDU1JfOTA1Mik7CisJfQorfQorCisvKiAgICAgIERpc2FibGUgY2FyZCBpbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZnN0X2Rpc2FibGVfaW50cihzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwlpZiAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCW91dGwoMHgwMDAwMDAwMCwgY2FyZC0+cGNpX2NvbmYgKyBJTlRDU1JfOTA1NCk7CisJfSBlbHNlIHsKKwkJb3V0dygweDAwMDAsIGNhcmQtPnBjaV9jb25mICsgSU5UQ1NSXzkwNTIpOworCX0KK30KKworLyogICAgICBQcm9jZXNzIHRoZSByZXN1bHQgb2YgdHJ5aW5nIHRvIHBhc3MgYSByZWNlaXZlZCBmcmFtZSB1cCB0aGUgc3RhY2sKKyAqLworc3RhdGljIHZvaWQKK2ZzdF9wcm9jZXNzX3J4X3N0YXR1cyhpbnQgcnhfc3RhdHVzLCBjaGFyICpuYW1lKQoreworCXN3aXRjaCAocnhfc3RhdHVzKSB7CisJY2FzZSBORVRfUlhfU1VDQ0VTUzoKKwkJeworCQkJLyoKKwkJCSAqIE5vdGhpbmcgdG8gZG8gaGVyZQorCQkJICovCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBORVRfUlhfQ05fTE9XOgorCQl7CisJCQlkYmcoREJHX0FTUywgIiVzOiBSZWNlaXZlIExvdyBDb25nZXN0aW9uXG4iLCBuYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIE5FVF9SWF9DTl9NT0Q6CisJCXsKKwkJCWRiZyhEQkdfQVNTLCAiJXM6IFJlY2VpdmUgTW9kZXJhdGUgQ29uZ2VzdGlvblxuIiwgbmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBORVRfUlhfQ05fSElHSDoKKwkJeworCQkJZGJnKERCR19BU1MsICIlczogUmVjZWl2ZSBIaWdoIENvbmdlc3Rpb25cbiIsIG5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgTkVUX1JYX0RST1A6CisJCXsKKwkJCWRiZyhEQkdfQVNTLCAiJXM6IFJlY2VpdmVkIHBhY2tldCBkcm9wcGVkXG4iLCBuYW1lKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiAgICAgIEluaXRpbGFpc2UgRE1BIGZvciBQTFggOTA1NAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzdF9pbml0X2RtYShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwkvKgorCSAqIFRoaXMgaXMgb25seSByZXF1aXJlZCBmb3IgdGhlIFBMWCA5MDU0CisJICovCisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCSAgICAgICAgcGNpX3NldF9tYXN0ZXIoY2FyZC0+ZGV2aWNlKTsKKwkJb3V0bCgweDAwMDIwNDQxLCBjYXJkLT5wY2lfY29uZiArIERNQU1PREUwKTsKKwkJb3V0bCgweDAwMDIwNDQxLCBjYXJkLT5wY2lfY29uZiArIERNQU1PREUxKTsKKwkJb3V0bCgweDAsIGNhcmQtPnBjaV9jb25mICsgRE1BVEhSKTsKKwl9Cit9CisKKy8qICAgICAgVHggZG1hIGNvbXBsZXRlIGludGVycnVwdAorICovCitzdGF0aWMgdm9pZAorZnN0X3R4X2RtYV9jb21wbGV0ZShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCisJCSAgICBpbnQgbGVuLCBpbnQgdHhwb3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKworCS8qCisJICogRXZlcnl0aGluZyBpcyBub3cgc2V0LCBqdXN0IHRlbGwgdGhlIGNhcmQgdG8gZ28KKwkgKi8KKwlkYmcoREJHX1RYLCAiZnN0X3R4X2RtYV9jb21wbGV0ZVxuIik7CisJRlNUX1dSQihjYXJkLCB0eERlc2NyUmluZ1twb3J0LT5pbmRleF1bdHhwb3NdLmJpdHMsCisJCURNQV9PV04gfCBUWF9TVFAgfCBUWF9FTlApOworCXN0YXRzLT50eF9wYWNrZXRzKys7CisJc3RhdHMtPnR4X2J5dGVzICs9IGxlbjsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKK30KKworLyoKKyAqIE1hcmsgaXQgZm9yIG91ciBvd24gcmF3IHNvY2tldHMgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmYXJzeW5jX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2tiLT5kZXYgPSBkZXY7CisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKwlyZXR1cm4gaHRvbnMoRVRIX1BfQ1VTVCk7Cit9CisKKy8qICAgICAgUnggZG1hIGNvbXBsZXRlIGludGVycnVwdAorICovCitzdGF0aWMgdm9pZAorZnN0X3J4X2RtYV9jb21wbGV0ZShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCisJCSAgICBpbnQgbGVuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcnhwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0X3RvX2Rldihwb3J0KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJaW50IHBpOworCWludCByeF9zdGF0dXM7CisKKwlkYmcoREJHX1RYLCAiZnN0X3J4X2RtYV9jb21wbGV0ZVxuIik7CisJcGkgPSBwb3J0LT5pbmRleDsKKwltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIGNhcmQtPnJ4X2RtYV9oYW5kbGVfaG9zdCwgbGVuKTsKKworCS8qIFJlc2V0IGJ1ZmZlciBkZXNjcmlwdG9yICovCisJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOKTsKKworCS8qIFVwZGF0ZSBzdGF0cyAqLworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IGxlbjsKKworCS8qIFB1c2ggdXBzdHJlYW0gKi8KKwlkYmcoREJHX1JYLCAiUHVzaGluZyB0aGUgZnJhbWUgdXAgdGhlIHN0YWNrXG4iKTsKKwlpZiAocG9ydC0+bW9kZSA9PSBGU1RfUkFXKQorCQlza2ItPnByb3RvY29sID0gZmFyc3luY190eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwllbHNlCisJCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCXJ4X3N0YXR1cyA9IG5ldGlmX3J4KHNrYik7CisJZnN0X3Byb2Nlc3Nfcnhfc3RhdHVzKHJ4X3N0YXR1cywgcG9ydF90b19kZXYocG9ydCktPm5hbWUpOworCWlmIChyeF9zdGF0dXMgPT0gTkVUX1JYX0RST1ApCisJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK30KKworLyoKKyAqICAgICAgUmVjZWl2ZSBhIGZyYW1lIHRocm91Z2ggdGhlIERNQQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzdF9yeF9kbWEoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHVuc2lnbmVkIGNoYXIgKnNrYiwKKwkgICB1bnNpZ25lZCBjaGFyICptZW0sIGludCBsZW4pCit7CisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgd2lsbCBzZXR1cCB0aGUgRE1BIGFuZCBzdGFydCBpdAorCSAqLworCisJZGJnKERCR19SWCwgIkluIGZzdF9yeF9kbWEgJXAgJXAgJWRcbiIsIHNrYiwgbWVtLCBsZW4pOworCWlmIChjYXJkLT5kbWFyeF9pbl9wcm9ncmVzcykgeworCQlkYmcoREJHX0FTUywgIkluIGZzdF9yeF9kbWEgd2hpbGUgZG1hIGluIHByb2dyZXNzXG4iKTsKKwl9CisKKwlvdXRsKCh1bnNpZ25lZCBsb25nKSBza2IsIGNhcmQtPnBjaV9jb25mICsgRE1BUEFEUjApOwkvKiBDb3B5IHRvIGhlcmUgKi8KKwlvdXRsKCh1bnNpZ25lZCBsb25nKSBtZW0sIGNhcmQtPnBjaV9jb25mICsgRE1BTEFEUjApOwkvKiBmcm9tIGhlcmUgKi8KKwlvdXRsKGxlbiwgY2FyZC0+cGNpX2NvbmYgKyBETUFTSVowKTsJLyogZm9yIHRoaXMgbGVuZ3RoICovCisJb3V0bCgweDAwMDAwMDAwYywgY2FyZC0+cGNpX2NvbmYgKyBETUFEUFIwKTsJLyogSW4gdGhpcyBkaXJlY3Rpb24gKi8KKworCS8qCisJICogV2UgdXNlIHRoZSBkbWFyeF9pbl9wcm9ncmVzcyBmbGFnIHRvIGZsYWcgdGhlIGNoYW5uZWwgYXMgYnVzeQorCSAqLworCWNhcmQtPmRtYXJ4X2luX3Byb2dyZXNzID0gMTsKKwlvdXRiKDB4MDMsIGNhcmQtPnBjaV9jb25mICsgRE1BQ1NSMCk7CS8qIFN0YXJ0IHRoZSB0cmFuc2ZlciAqLworfQorCisvKgorICogICAgICBTZW5kIGEgZnJhbWUgdGhyb3VnaCB0aGUgRE1BCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZnN0X3R4X2RtYShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgdW5zaWduZWQgY2hhciAqc2tiLAorCSAgIHVuc2lnbmVkIGNoYXIgKm1lbSwgaW50IGxlbikKK3sKKwkvKgorCSAqIFRoaXMgcm91dGluZSB3aWxsIHNldHVwIHRoZSBETUEgYW5kIHN0YXJ0IGl0LgorCSAqLworCisJZGJnKERCR19UWCwgIkluIGZzdF90eF9kbWEgJXAgJXAgJWRcbiIsIHNrYiwgbWVtLCBsZW4pOworCWlmIChjYXJkLT5kbWF0eF9pbl9wcm9ncmVzcykgeworCQlkYmcoREJHX0FTUywgIkluIGZzdF90eF9kbWEgd2hpbGUgZG1hIGluIHByb2dyZXNzXG4iKTsKKwl9CisKKwlvdXRsKCh1bnNpZ25lZCBsb25nKSBza2IsIGNhcmQtPnBjaV9jb25mICsgRE1BUEFEUjEpOwkvKiBDb3B5IGZyb20gaGVyZSAqLworCW91dGwoKHVuc2lnbmVkIGxvbmcpIG1lbSwgY2FyZC0+cGNpX2NvbmYgKyBETUFMQURSMSk7CS8qIHRvIGhlcmUgKi8KKwlvdXRsKGxlbiwgY2FyZC0+cGNpX2NvbmYgKyBETUFTSVoxKTsJLyogZm9yIHRoaXMgbGVuZ3RoICovCisJb3V0bCgweDAwMDAwMDAwNCwgY2FyZC0+cGNpX2NvbmYgKyBETUFEUFIxKTsJLyogSW4gdGhpcyBkaXJlY3Rpb24gKi8KKworCS8qCisJICogV2UgdXNlIHRoZSBkbWF0eF9pbl9wcm9ncmVzcyB0byBmbGFnIHRoZSBjaGFubmVsIGFzIGJ1c3kKKwkgKi8KKwljYXJkLT5kbWF0eF9pbl9wcm9ncmVzcyA9IDE7CisJb3V0YigweDAzLCBjYXJkLT5wY2lfY29uZiArIERNQUNTUjEpOwkvKiBTdGFydCB0aGUgdHJhbnNmZXIgKi8KK30KKworLyogICAgICBJc3N1ZSBhIE1haWxib3ggY29tbWFuZCBmb3IgYSBwb3J0LgorICogICAgICBOb3RlIHdlIGlzc3VlIHRoZW0gb24gYSBmaXJlIGFuZCBmb3JnZXQgYmFzaXMsIG5vdCBleHBlY3RpbmcgdG8gc2VlIGFuCisgKiAgICAgIGVycm9yIGFuZCBub3Qgd2FpdGluZyBmb3IgY29tcGxldGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2ZzdF9pc3N1ZV9jbWQoc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsIHVuc2lnbmVkIHNob3J0IGNtZCkKK3sKKwlzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsKKwl1bnNpZ25lZCBzaG9ydCBtYnZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzYWZldHk7CisKKwljYXJkID0gcG9ydC0+Y2FyZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJbWJ2YWwgPSBGU1RfUkRXKGNhcmQsIHBvcnRNYWlsYm94W3BvcnQtPmluZGV4XVswXSk7CisKKwlzYWZldHkgPSAwOworCS8qIFdhaXQgZm9yIGFueSBwcmV2aW91cyBjb21tYW5kIHRvIGNvbXBsZXRlICovCisJd2hpbGUgKG1idmFsID4gTkFLKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisKKwkJaWYgKCsrc2FmZXR5ID4gMjAwMCkgeworCQkJcHJpbnRrX2VycigiTWFpbGJveCBzYWZldHkgdGltZW91dFxuIik7CisJCQlicmVhazsKKwkJfQorCisJCW1idmFsID0gRlNUX1JEVyhjYXJkLCBwb3J0TWFpbGJveFtwb3J0LT5pbmRleF1bMF0pOworCX0KKwlpZiAoc2FmZXR5ID4gMCkgeworCQlkYmcoREJHX0NNRCwgIk1haWxib3ggY2xlYXIgYWZ0ZXIgJWQgamlmZmllc1xuIiwgc2FmZXR5KTsKKwl9CisJaWYgKG1idmFsID09IE5BSykgeworCQlkYmcoREJHX0NNRCwgImlzc3VlX2NtZDogcHJldmlvdXMgY29tbWFuZCB3YXMgTkFLJ2RcbiIpOworCX0KKworCUZTVF9XUlcoY2FyZCwgcG9ydE1haWxib3hbcG9ydC0+aW5kZXhdWzBdLCBjbWQpOworCisJaWYgKGNtZCA9PSBBQk9SVFRYIHx8IGNtZCA9PSBTVEFSVFBPUlQpIHsKKwkJcG9ydC0+dHhwb3MgPSAwOworCQlwb3J0LT50eGlwb3MgPSAwOworCQlwb3J0LT5zdGFydCA9IDA7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Cit9CisKKy8qICAgICAgUG9ydCBvdXRwdXQgc2lnbmFscyBjb250cm9sCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZnN0X29wX3JhaXNlKHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LCB1bnNpZ25lZCBpbnQgb3V0cHV0cykKK3sKKwlvdXRwdXRzIHw9IEZTVF9SREwocG9ydC0+Y2FyZCwgdjI0T3BTdHNbcG9ydC0+aW5kZXhdKTsKKwlGU1RfV1JMKHBvcnQtPmNhcmQsIHYyNE9wU3RzW3BvcnQtPmluZGV4XSwgb3V0cHV0cyk7CisKKwlpZiAocG9ydC0+cnVuKQorCQlmc3RfaXNzdWVfY21kKHBvcnQsIFNFVFYyNE8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzdF9vcF9sb3dlcihzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwgdW5zaWduZWQgaW50IG91dHB1dHMpCit7CisJb3V0cHV0cyA9IH5vdXRwdXRzICYgRlNUX1JETChwb3J0LT5jYXJkLCB2MjRPcFN0c1twb3J0LT5pbmRleF0pOworCUZTVF9XUkwocG9ydC0+Y2FyZCwgdjI0T3BTdHNbcG9ydC0+aW5kZXhdLCBvdXRwdXRzKTsKKworCWlmIChwb3J0LT5ydW4pCisJCWZzdF9pc3N1ZV9jbWQocG9ydCwgU0VUVjI0Tyk7Cit9CisKKy8qCisgKiAgICAgIFNldHVwIHBvcnQgUnggYnVmZmVycworICovCitzdGF0aWMgdm9pZAorZnN0X3J4X2NvbmZpZyhzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCkKK3sKKwlpbnQgaTsKKwlpbnQgcGk7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCisJcGkgPSBwb3J0LT5pbmRleDsKKwljYXJkID0gcG9ydC0+Y2FyZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9CVUZGRVI7IGkrKykgeworCQlvZmZzZXQgPSBCVUZfT0ZGU0VUKHJ4QnVmZmVyW3BpXVtpXVswXSk7CisKKwkJRlNUX1dSVyhjYXJkLCByeERlc2NyUmluZ1twaV1baV0ubGFkciwgKHUxNikgb2Zmc2V0KTsKKwkJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1baV0uaGFkciwgKHU4KSAob2Zmc2V0ID4+IDE2KSk7CisJCUZTVF9XUlcoY2FyZCwgcnhEZXNjclJpbmdbcGldW2ldLmJjbnQsIGNudl9iY250KExFTl9SWF9CVUZGRVIpKTsKKwkJRlNUX1dSVyhjYXJkLCByeERlc2NyUmluZ1twaV1baV0ubWNudCwgTEVOX1JYX0JVRkZFUik7CisJCUZTVF9XUkIoY2FyZCwgcnhEZXNjclJpbmdbcGldW2ldLmJpdHMsIERNQV9PV04pOworCX0KKwlwb3J0LT5yeHBvcyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiAgICAgIFNldHVwIHBvcnQgVHggYnVmZmVycworICovCitzdGF0aWMgdm9pZAorZnN0X3R4X2NvbmZpZyhzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCkKK3sKKwlpbnQgaTsKKwlpbnQgcGk7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCisJcGkgPSBwb3J0LT5pbmRleDsKKwljYXJkID0gcG9ydC0+Y2FyZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9CVUZGRVI7IGkrKykgeworCQlvZmZzZXQgPSBCVUZfT0ZGU0VUKHR4QnVmZmVyW3BpXVtpXVswXSk7CisKKwkJRlNUX1dSVyhjYXJkLCB0eERlc2NyUmluZ1twaV1baV0ubGFkciwgKHUxNikgb2Zmc2V0KTsKKwkJRlNUX1dSQihjYXJkLCB0eERlc2NyUmluZ1twaV1baV0uaGFkciwgKHU4KSAob2Zmc2V0ID4+IDE2KSk7CisJCUZTVF9XUlcoY2FyZCwgdHhEZXNjclJpbmdbcGldW2ldLmJjbnQsIDApOworCQlGU1RfV1JCKGNhcmQsIHR4RGVzY3JSaW5nW3BpXVtpXS5iaXRzLCAwKTsKKwl9CisJcG9ydC0+dHhwb3MgPSAwOworCXBvcnQtPnR4aXBvcyA9IDA7CisJcG9ydC0+c3RhcnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworfQorCisvKiAgICAgIFRFMSBBbGFybSBjaGFuZ2UgaW50ZXJydXB0IGV2ZW50CisgKi8KK3N0YXRpYyB2b2lkCitmc3RfaW50cl90ZTFfYWxhcm0oc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0KQoreworCXU4IGxvczsKKwl1OCBycmE7CisJdTggYWlzOworCisJbG9zID0gRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5sb3NzT2ZTaWduYWwpOworCXJyYSA9IEZTVF9SREIoY2FyZCwgc3VTdGF0dXMucmVjZWl2ZVJlbW90ZUFsYXJtKTsKKwlhaXMgPSBGU1RfUkRCKGNhcmQsIHN1U3RhdHVzLmFsYXJtSW5kaWNhdGlvblNpZ25hbCk7CisKKwlpZiAobG9zKSB7CisJCS8qCisJCSAqIExvc3QgdGhlIGxpbmsKKwkJICovCisJCWlmIChuZXRpZl9jYXJyaWVyX29rKHBvcnRfdG9fZGV2KHBvcnQpKSkgeworCQkJZGJnKERCR19JTlRSLCAiTmV0IGNhcnJpZXIgb2ZmXG4iKTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKHBvcnRfdG9fZGV2KHBvcnQpKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIExpbmsgYXZhaWxhYmxlCisJCSAqLworCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2socG9ydF90b19kZXYocG9ydCkpKSB7CisJCQlkYmcoREJHX0lOVFIsICJOZXQgY2FycmllciBvblxuIik7CisJCQluZXRpZl9jYXJyaWVyX29uKHBvcnRfdG9fZGV2KHBvcnQpKTsKKwkJfQorCX0KKworCWlmIChsb3MpCisJCWRiZyhEQkdfSU5UUiwgIkFzc2VydCBMT1MgQWxhcm1cbiIpOworCWVsc2UKKwkJZGJnKERCR19JTlRSLCAiRGUtYXNzZXJ0IExPUyBBbGFybVxuIik7CisJaWYgKHJyYSkKKwkJZGJnKERCR19JTlRSLCAiQXNzZXJ0IFJSQSBBbGFybVxuIik7CisJZWxzZQorCQlkYmcoREJHX0lOVFIsICJEZS1hc3NlcnQgUlJBIEFsYXJtXG4iKTsKKworCWlmIChhaXMpCisJCWRiZyhEQkdfSU5UUiwgIkFzc2VydCBBSVMgQWxhcm1cbiIpOworCWVsc2UKKwkJZGJnKERCR19JTlRSLCAiRGUtYXNzZXJ0IEFJUyBBbGFybVxuIik7Cit9CisKKy8qICAgICAgQ29udHJvbCBzaWduYWwgY2hhbmdlIGludGVycnVwdCBldmVudAorICovCitzdGF0aWMgdm9pZAorZnN0X2ludHJfY3RsY2hnKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCkKK3sKKwlpbnQgc2lnbmFsczsKKworCXNpZ25hbHMgPSBGU1RfUkRMKGNhcmQsIHYyNERlYm91bmNlZFN0c1twb3J0LT5pbmRleF0pOworCisJaWYgKHNpZ25hbHMgJiAoKChwb3J0LT5od2lmID09IFgyMSkgfHwgKHBvcnQtPmh3aWYgPT0gWDIxRCkpCisJCSAgICAgICA/IElQU1RTX0lORElDQVRFIDogSVBTVFNfRENEKSkgeworCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2socG9ydF90b19kZXYocG9ydCkpKSB7CisJCQlkYmcoREJHX0lOVFIsICJEQ0QgYWN0aXZlXG4iKTsKKwkJCW5ldGlmX2NhcnJpZXJfb24ocG9ydF90b19kZXYocG9ydCkpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2socG9ydF90b19kZXYocG9ydCkpKSB7CisJCQlkYmcoREJHX0lOVFIsICJEQ0QgbG9zdFxuIik7CisJCQluZXRpZl9jYXJyaWVyX29mZihwb3J0X3RvX2Rldihwb3J0KSk7CisJCX0KKwl9Cit9CisKKy8qICAgICAgTG9nIFJ4IEVycm9ycworICovCitzdGF0aWMgdm9pZAorZnN0X2xvZ19yeF9lcnJvcihzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCisJCSB1bnNpZ25lZCBjaGFyIGRtYWJpdHMsIGludCByeHAsIHVuc2lnbmVkIHNob3J0IGxlbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydF90b19kZXYocG9ydCk7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCisJLyogCisJICogSW5jcmVtZW50IHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb3VudGVyCisJICovCisJc3RhdHMtPnJ4X2Vycm9ycysrOworCWlmIChkbWFiaXRzICYgUlhfT0ZMTykgeworCQlzdGF0cy0+cnhfZmlmb19lcnJvcnMrKzsKKwkJZGJnKERCR19BU1MsICJSeCBmaWZvIGVycm9yIG9uIGNhcmQgJWQgcG9ydCAlZCBidWZmZXIgJWRcbiIsCisJCSAgICBjYXJkLT5jYXJkX25vLCBwb3J0LT5pbmRleCwgcnhwKTsKKwl9CisJaWYgKGRtYWJpdHMgJiBSWF9DUkMpIHsKKwkJc3RhdHMtPnJ4X2NyY19lcnJvcnMrKzsKKwkJZGJnKERCR19BU1MsICJSeCBjcmMgZXJyb3Igb24gY2FyZCAlZCBwb3J0ICVkXG4iLAorCQkgICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgpOworCX0KKwlpZiAoZG1hYml0cyAmIFJYX0ZSQU0pIHsKKwkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycysrOworCQlkYmcoREJHX0FTUywgIlJ4IGZyYW1lIGVycm9yIG9uIGNhcmQgJWQgcG9ydCAlZFxuIiwKKwkJICAgIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKKwl9CisJaWYgKGRtYWJpdHMgPT0gKFJYX1NUUCB8IFJYX0VOUCkpIHsKKwkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJZGJnKERCR19BU1MsICJSeCBsZW5ndGggZXJyb3IgKCVkKSBvbiBjYXJkICVkIHBvcnQgJWRcbiIsCisJCSAgICBsZW4sIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKKwl9Cit9CisKKy8qICAgICAgUnggRXJyb3IgUmVjb3ZlcnkKKyAqLworc3RhdGljIHZvaWQKK2ZzdF9yZWNvdmVyX3J4X2Vycm9yKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwKKwkJICAgICB1bnNpZ25lZCBjaGFyIGRtYWJpdHMsIGludCByeHAsIHVuc2lnbmVkIHNob3J0IGxlbikKK3sKKwlpbnQgaTsKKwlpbnQgcGk7CisKKwlwaSA9IHBvcnQtPmluZGV4OworCS8qIAorCSAqIERpc2NhcmQgYnVmZmVyIGRlc2NyaXB0b3JzIHVudGlsIHdlIHNlZSB0aGUgc3RhcnQgb2YgdGhlCisJICogbmV4dCBmcmFtZS4gIE5vdGUgdGhhdCBmb3IgbG9uZyBmcmFtZXMgdGhpcyBjb3VsZCBiZSBpbgorCSAqIGEgc3Vic2VxdWVudCBpbnRlcnJ1cHQuIAorCSAqLworCWkgPSAwOworCXdoaWxlICgoZG1hYml0cyAmIChETUFfT1dOIHwgUlhfU1RQKSkgPT0gMCkgeworCQlGU1RfV1JCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMsIERNQV9PV04pOworCQlyeHAgPSAocnhwKzEpICUgTlVNX1JYX0JVRkZFUjsKKwkJaWYgKCsraSA+IE5VTV9SWF9CVUZGRVIpIHsKKwkJCWRiZyhEQkdfQVNTLCAiaW50cl9yeDogRGlzY2FyZGluZyBtb3JlIGJ1ZnMiCisJCQkgICAgIiB0aGFuIHdlIGhhdmVcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJZG1hYml0cyA9IEZTVF9SREIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cyk7CisJCWRiZyhEQkdfQVNTLCAiRE1BIEJpdHMgb2YgbmV4dCBidWZmZXIgd2FzICV4XG4iLCBkbWFiaXRzKTsKKwl9CisJZGJnKERCR19BU1MsICJUaGVyZSB3ZXJlICVkIHN1YnNlcXVlbnQgYnVmZmVycyBpbiBlcnJvclxuIiwgaSk7CisKKwkvKiBEaXNjYXJkIHRoZSB0ZXJtaW5hbCBidWZmZXIgKi8KKwlpZiAoIShkbWFiaXRzICYgRE1BX09XTikpIHsKKwkJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOKTsKKwkJcnhwID0gKHJ4cCsxKSAlIE5VTV9SWF9CVUZGRVI7CisJfQorCXBvcnQtPnJ4cG9zID0gcnhwOworCXJldHVybjsKKworfQorCisvKiAgICAgIFJ4IGNvbXBsZXRlIGludGVycnVwdAorICovCitzdGF0aWMgdm9pZAorZnN0X2ludHJfcngoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0KQoreworCXVuc2lnbmVkIGNoYXIgZG1hYml0czsKKwlpbnQgcGk7CisJaW50IHJ4cDsKKwlpbnQgcnhfc3RhdHVzOworCXVuc2lnbmVkIHNob3J0IGxlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0X3RvX2Rldihwb3J0KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisKKwkvKiBDaGVjayB3ZSBoYXZlIGEgYnVmZmVyIHRvIHByb2Nlc3MgKi8KKwlwaSA9IHBvcnQtPmluZGV4OworCXJ4cCA9IHBvcnQtPnJ4cG9zOworCWRtYWJpdHMgPSBGU1RfUkRCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMpOworCWlmIChkbWFiaXRzICYgRE1BX09XTikgeworCQlkYmcoREJHX1JYIHwgREJHX0lOVFIsICJpbnRyX3J4OiBObyBidWZmZXIgcG9ydCAlZCBwb3MgJWRcbiIsCisJCSAgICBwaSwgcnhwKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoY2FyZC0+ZG1hcnhfaW5fcHJvZ3Jlc3MpIHsKKwkJcmV0dXJuOworCX0KKworCS8qIEdldCBidWZmZXIgbGVuZ3RoICovCisJbGVuID0gRlNUX1JEVyhjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5tY250KTsKKwkvKiBEaXNjYXJkIHRoZSBDUkMgKi8KKwlsZW4gLT0gMjsKKwlpZiAobGVuID09IDApIHsKKwkJLyoKKwkJICogVGhpcyBzZWVtcyB0byBoYXBwZW4gb24gdGhlIFRFMSBpbnRlcmZhY2Ugc29tZXRpbWVzCisJCSAqIHNvIHRocm93IHRoZSBmcmFtZSBhd2F5IGFuZCBsb2cgdGhlIGV2ZW50LgorCQkgKi8KKwkJcHJpbnRrX2VycigiRnJhbWUgcmVjZWl2ZWQgd2l0aCAwIGxlbmd0aC4gQ2FyZCAlZCBQb3J0ICVkXG4iLAorCQkJICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgpOworCQkvKiBSZXR1cm4gZGVzY3JpcHRvciB0byBjYXJkICovCisJCUZTVF9XUkIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cywgRE1BX09XTik7CisKKwkJcnhwID0gKHJ4cCsxKSAlIE5VTV9SWF9CVUZGRVI7CisJCXBvcnQtPnJ4cG9zID0gcnhwOworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgYnVmZmVyIGxlbmd0aCBhbmQgZm9yIG90aGVyIGVycm9ycy4gV2UgaW5zaXN0IG9uIG9uZSBwYWNrZXQKKwkgKiBpbiBvbmUgYnVmZmVyLiBUaGlzIHNpbXBsaWZpZXMgdGhpbmdzIGdyZWF0bHkgYW5kIHNpbmNlIHdlJ3ZlCisJICogYWxsb2NhdGVkIDhLIGl0IHNob3VsZG4ndCBiZSBhIHJlYWwgd29ybGQgbGltaXRhdGlvbgorCSAqLworCWRiZyhEQkdfUlgsICJpbnRyX3J4OiAlZCwlZDogZmxhZ3MgJXggbGVuICVkXG4iLCBwaSwgcnhwLCBkbWFiaXRzLCBsZW4pOworCWlmIChkbWFiaXRzICE9IChSWF9TVFAgfCBSWF9FTlApIHx8IGxlbiA+IExFTl9SWF9CVUZGRVIgLSAyKSB7CisJCWZzdF9sb2dfcnhfZXJyb3IoY2FyZCwgcG9ydCwgZG1hYml0cywgcnhwLCBsZW4pOworCQlmc3RfcmVjb3Zlcl9yeF9lcnJvcihjYXJkLCBwb3J0LCBkbWFiaXRzLCByeHAsIGxlbik7CisJCXJldHVybjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBTS0IgKi8KKwlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IobGVuKSkgPT0gTlVMTCkgeworCQlkYmcoREJHX1JYLCAiaW50cl9yeDogY2FuJ3QgYWxsb2NhdGUgYnVmZmVyXG4iKTsKKworCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCisJCS8qIFJldHVybiBkZXNjcmlwdG9yIHRvIGNhcmQgKi8KKwkJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOKTsKKworCQlyeHAgPSAocnhwKzEpICUgTlVNX1JYX0JVRkZFUjsKKwkJcG9ydC0+cnhwb3MgPSByeHA7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFdlIGtub3cgdGhlIGxlbmd0aCB3ZSBuZWVkIHRvIHJlY2VpdmUsIGxlbi4KKwkgKiBJdCdzIG5vdCB3b3J0aCB1c2luZyB0aGUgRE1BIGZvciByZWFkcyBvZiBsZXNzIHRoYW4KKwkgKiBGU1RfTUlOX0RNQV9MRU4KKwkgKi8KKworCWlmICgobGVuIDwgRlNUX01JTl9ETUFfTEVOKSB8fCAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhQKSkgeworCQltZW1jcHlfZnJvbWlvKHNrYl9wdXQoc2tiLCBsZW4pLAorCQkJICAgICAgY2FyZC0+bWVtICsgQlVGX09GRlNFVChyeEJ1ZmZlcltwaV1bcnhwXVswXSksCisJCQkgICAgICBsZW4pOworCisJCS8qIFJlc2V0IGJ1ZmZlciBkZXNjcmlwdG9yICovCisJCUZTVF9XUkIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cywgRE1BX09XTik7CisKKwkJLyogVXBkYXRlIHN0YXRzICovCisJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCXN0YXRzLT5yeF9ieXRlcyArPSBsZW47CisKKwkJLyogUHVzaCB1cHN0cmVhbSAqLworCQlkYmcoREJHX1JYLCAiUHVzaGluZyBmcmFtZSB1cCB0aGUgc3RhY2tcbiIpOworCQlpZiAocG9ydC0+bW9kZSA9PSBGU1RfUkFXKQorCQkJc2tiLT5wcm90b2NvbCA9IGZhcnN5bmNfdHlwZV90cmFucyhza2IsIGRldik7CisJCWVsc2UKKwkJCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQlyeF9zdGF0dXMgPSBuZXRpZl9yeChza2IpOworCQlmc3RfcHJvY2Vzc19yeF9zdGF0dXMocnhfc3RhdHVzLCBwb3J0X3RvX2Rldihwb3J0KS0+bmFtZSk7CisJCWlmIChyeF9zdGF0dXMgPT0gTkVUX1JYX0RST1ApIHsKKwkJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCX0KKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwl9IGVsc2UgeworCQljYXJkLT5kbWFfc2tiX3J4ID0gc2tiOworCQljYXJkLT5kbWFfcG9ydF9yeCA9IHBvcnQ7CisJCWNhcmQtPmRtYV9sZW5fcnggPSBsZW47CisJCWNhcmQtPmRtYV9yeHBvcyA9IHJ4cDsKKwkJZnN0X3J4X2RtYShjYXJkLCAoY2hhciAqKSBjYXJkLT5yeF9kbWFfaGFuZGxlX2NhcmQsCisJCQkgICAoY2hhciAqKSBCVUZfT0ZGU0VUKHJ4QnVmZmVyW3BpXVtyeHBdWzBdKSwgbGVuKTsKKwl9CisJaWYgKHJ4cCAhPSBwb3J0LT5yeHBvcykgeworCQlkYmcoREJHX0FTUywgIkFib3V0IHRvIGluY3JlbWVudCByeHBvcyBieSBtb3JlIHRoYW4gMVxuIik7CisJCWRiZyhEQkdfQVNTLCAicnhwID0gJWQgcnhwb3MgPSAlZFxuIiwgcnhwLCBwb3J0LT5yeHBvcyk7CisJfQorCXJ4cCA9IChyeHArMSkgJSBOVU1fUlhfQlVGRkVSOworCXBvcnQtPnJ4cG9zID0gcnhwOworfQorCisvKgorICogICAgICBUaGUgYm90dG9tIGhhbGZzIHRvIHRoZSBJU1IKKyAqCisgKi8KKworc3RhdGljIHZvaWQKK2RvX2JvdHRvbV9oYWxmX3R4KHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQoreworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0OworCWludCBwaTsKKwlpbnQgdHhxX2xlbmd0aDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisKKwkvKgorCSAqICBGaW5kIGEgZnJlZSBidWZmZXIgZm9yIHRoZSB0cmFuc21pdAorCSAqICBTdGVwIHRocm91Z2ggZWFjaCBwb3J0IG9uIHRoaXMgY2FyZAorCSAqLworCisJZGJnKERCR19UWCwgImRvX2JvdHRvbV9oYWxmX3R4XG4iKTsKKwlmb3IgKHBpID0gMCwgcG9ydCA9IGNhcmQtPnBvcnRzOyBwaSA8IGNhcmQtPm5wb3J0czsgcGkrKywgcG9ydCsrKSB7CisJCWlmICghcG9ydC0+cnVuKQorCQkJY29udGludWU7CisKKyAgICAgICAgICAgICAgICBkZXYgPSBwb3J0X3RvX2Rldihwb3J0KTsKKyAgICAgICAgICAgICAgICBzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwkJd2hpbGUgKCEKKwkJICAgICAgIChGU1RfUkRCKGNhcmQsIHR4RGVzY3JSaW5nW3BpXVtwb3J0LT50eHBvc10uYml0cykgJgorCQkJRE1BX09XTikKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgIShjYXJkLT5kbWF0eF9pbl9wcm9ncmVzcykpIHsKKwkJCS8qCisJCQkgKiBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSB0eGRvbmUgZXZlbnQgcGVyLXNlCisJCQkgKiBXZSBzZWVtIHRvIGhhdmUgdG8gZGVkdWNlIGl0LCBieSBjaGVja2luZyB0aGUgRE1BX09XTgorCQkJICogYml0IG9uIHRoZSBuZXh0IGJ1ZmZlciB3ZSB0aGluayB3ZSBjYW4gdXNlCisJCQkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJCWlmICgodHhxX2xlbmd0aCA9IHBvcnQtPnR4cWUgLSBwb3J0LT50eHFzKSA8IDApIHsKKwkJCQkvKgorCQkJCSAqIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgb25lIGhhcyB3cmFwcGVkIGFuZCB0aGUKKwkJCQkgKiBtYXRocyBnaXZlcyB1cyBhIG5lZ2F0aXZlIG51bWJlcgorCQkJCSAqLworCQkJCXR4cV9sZW5ndGggPSB0eHFfbGVuZ3RoICsgRlNUX1RYUV9ERVBUSDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQkJaWYgKHR4cV9sZW5ndGggPiAwKSB7CisJCQkJLyoKKwkJCQkgKiBUaGVyZSBpcyBzb21ldGhpbmcgdG8gc2VuZAorCQkJCSAqLworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJCQlza2IgPSBwb3J0LT50eHFbcG9ydC0+dHhxc107CisJCQkJcG9ydC0+dHhxcysrOworCQkJCWlmIChwb3J0LT50eHFzID09IEZTVF9UWFFfREVQVEgpIHsKKwkJCQkJcG9ydC0+dHhxcyA9IDA7CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQkJCS8qCisJCQkJICogY29weSB0aGUgZGF0YSBhbmQgc2V0IHRoZSByZXF1aXJlZCBpbmRpY2F0b3JzIG9uIHRoZQorCQkJCSAqIGNhcmQuCisJCQkJICovCisJCQkJRlNUX1dSVyhjYXJkLCB0eERlc2NyUmluZ1twaV1bcG9ydC0+dHhwb3NdLmJjbnQsCisJCQkJCWNudl9iY250KHNrYi0+bGVuKSk7CisJCQkJaWYgKChza2ItPmxlbiA8IEZTVF9NSU5fRE1BX0xFTikKKwkJCQkgICAgfHwgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYUCkpIHsKKwkJCQkJLyogRW5xdWV1ZSB0aGUgcGFja2V0IHdpdGggbm9ybWFsIGlvICovCisJCQkJCW1lbWNweV90b2lvKGNhcmQtPm1lbSArCisJCQkJCQkgICAgQlVGX09GRlNFVCh0eEJ1ZmZlcltwaV0KKwkJCQkJCQkgICAgICAgW3BvcnQtPgorCQkJCQkJCQl0eHBvc11bMF0pLAorCQkJCQkJICAgIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJCQlGU1RfV1JCKGNhcmQsCisJCQkJCQl0eERlc2NyUmluZ1twaV1bcG9ydC0+dHhwb3NdLgorCQkJCQkJYml0cywKKwkJCQkJCURNQV9PV04gfCBUWF9TVFAgfCBUWF9FTlApOworCQkJCQlzdGF0cy0+dHhfcGFja2V0cysrOworCQkJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIE9yIGRvIGl0IHRocm91Z2ggZG1hICovCisJCQkJCW1lbWNweShjYXJkLT50eF9kbWFfaGFuZGxlX2hvc3QsCisJCQkJCSAgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCQkJY2FyZC0+ZG1hX3BvcnRfdHggPSBwb3J0OworCQkJCQljYXJkLT5kbWFfbGVuX3R4ID0gc2tiLT5sZW47CisJCQkJCWNhcmQtPmRtYV90eHBvcyA9IHBvcnQtPnR4cG9zOworCQkJCQlmc3RfdHhfZG1hKGNhcmQsCisJCQkJCQkgICAoY2hhciAqKSBjYXJkLT4KKwkJCQkJCSAgIHR4X2RtYV9oYW5kbGVfY2FyZCwKKwkJCQkJCSAgIChjaGFyICopCisJCQkJCQkgICBCVUZfT0ZGU0VUKHR4QnVmZmVyW3BpXQorCQkJCQkJCSAgICAgIFtwb3J0LT50eHBvc11bMF0pLAorCQkJCQkJICAgc2tiLT5sZW4pOworCQkJCX0KKwkJCQlpZiAoKytwb3J0LT50eHBvcyA+PSBOVU1fVFhfQlVGRkVSKQorCQkJCQlwb3J0LT50eHBvcyA9IDA7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBoYXZlIGZsb3cgY29udHJvbCBvbiwgY2FuIHdlIG5vdyByZWxlYXNlIGl0PworCQkJCSAqLworCQkJCWlmIChwb3J0LT5zdGFydCkgeworCQkJCQlpZiAodHhxX2xlbmd0aCA8IGZzdF90eHFfbG93KSB7CisJCQkJCQluZXRpZl93YWtlX3F1ZXVlKHBvcnRfdG9fZGV2CisJCQkJCQkJCSAocG9ydCkpOworCQkJCQkJcG9ydC0+c3RhcnQgPSAwOworCQkJCQl9CisJCQkJfQorCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBOb3RoaW5nIHRvIHNlbmQgc28gYnJlYWsgb3V0IG9mIHRoZSB3aGlsZSBsb29wCisJCQkJICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitkb19ib3R0b21faGFsZl9yeChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsKKwlpbnQgcGk7CisJaW50IHJ4X2NvdW50ID0gMDsKKworCS8qIENoZWNrIGZvciByeCBjb21wbGV0aW9ucyBvbiBhbGwgcG9ydHMgb24gdGhpcyBjYXJkICovCisJZGJnKERCR19SWCwgImRvX2JvdHRvbV9oYWxmX3J4XG4iKTsKKwlmb3IgKHBpID0gMCwgcG9ydCA9IGNhcmQtPnBvcnRzOyBwaSA8IGNhcmQtPm5wb3J0czsgcGkrKywgcG9ydCsrKSB7CisJCWlmICghcG9ydC0+cnVuKQorCQkJY29udGludWU7CisKKwkJd2hpbGUgKCEoRlNUX1JEQihjYXJkLCByeERlc2NyUmluZ1twaV1bcG9ydC0+cnhwb3NdLmJpdHMpCisJCQkgJiBETUFfT1dOKSAmJiAhKGNhcmQtPmRtYXJ4X2luX3Byb2dyZXNzKSkgeworCQkJaWYgKHJ4X2NvdW50ID4gZnN0X21heF9yZWFkcykgeworCQkJCS8qCisJCQkJICogRG9uJ3Qgc3BlbmQgZm9yZXZlciBpbiByZWNlaXZlIHByb2Nlc3NpbmcKKwkJCQkgKiBTY2hlZHVsZSBhbm90aGVyIGV2ZW50CisJCQkJICovCisJCQkJZnN0X3Ffd29ya19pdGVtKCZmc3Rfd29ya19pbnRxLCBjYXJkLT5jYXJkX25vKTsKKwkJCQl0YXNrbGV0X3NjaGVkdWxlKCZmc3RfaW50X3Rhc2spOworCQkJCWJyZWFrOwkvKiBMZWF2ZSB0aGUgbG9vcCAqLworCQkJfQorCQkJZnN0X2ludHJfcngoY2FyZCwgcG9ydCk7CisJCQlyeF9jb3VudCsrOworCQl9CisJfQorfQorCisvKgorICogICAgICBUaGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQorICogICAgICBEZXZfaWQgaXMgb3VyIGZzdF9jYXJkX2luZm8gcG9pbnRlcgorICovCitpcnFyZXR1cm5fdAorZnN0X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsKKwlpbnQgcmRpZHg7CQkvKiBFdmVudCBidWZmZXIgaW5kaWNlcyAqLworCWludCB3cmlkeDsKKwlpbnQgZXZlbnQ7CQkvKiBBY3R1YWwgZXZlbnQgZm9yIHByb2Nlc3NpbmcgKi8KKwl1bnNpZ25lZCBpbnQgZG1hX2ludGNzciA9IDA7CisJdW5zaWduZWQgaW50IGRvX2NhcmRfaW50ZXJydXB0OworCXVuc2lnbmVkIGludCBpbnRfcmV0cnlfY291bnQ7CisKKwlpZiAoKGNhcmQgPSBkZXZfaWQpID09IE5VTEwpIHsKKwkJZGJnKERCR19JTlRSLCAiaW50cjogc3B1cmlvdXMgJWRcbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgaW50ZXJydXB0IHdhcyBmb3IgdGhpcyBjYXJkCisJICogcmV0dXJuIGlmIG5vdAorCSAqIE5vdGUgdGhhdCB0aGUgY2FsbCB0byBjbGVhciB0aGUgaW50ZXJydXB0IGlzIGltcG9ydGFudAorCSAqLworCWRiZyhEQkdfSU5UUiwgImludHI6ICVkICVwXG4iLCBpcnEsIGNhcmQpOworCWlmIChjYXJkLT5zdGF0ZSAhPSBGU1RfUlVOTklORykgeworCQlwcmludGtfZXJyCisJCSAgICAoIkludGVycnVwdCByZWNlaXZlZCBmb3IgY2FyZCAlZCBpbiBhIG5vbiBydW5uaW5nIHN0YXRlICglZClcbiIsCisJCSAgICAgY2FyZC0+Y2FyZF9ubywgY2FyZC0+c3RhdGUpOworCisJCS8qIAorCQkgKiBJdCBpcyBwb3NzaWJsZSB0byByZWFsbHkgYmUgcnVubmluZywgaS5lLiB3ZSBoYXZlIHJlLWxvYWRlZAorCQkgKiBhIHJ1bm5pbmcgY2FyZAorCQkgKiBDbGVhciBhbmQgcmVwcmltZSB0aGUgaW50ZXJydXB0IHNvdXJjZSAKKwkJICovCisJCWZzdF9jbGVhcl9pbnRyKGNhcmQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJLyogQ2xlYXIgYW5kIHJlcHJpbWUgdGhlIGludGVycnVwdCBzb3VyY2UgKi8KKwlmc3RfY2xlYXJfaW50cihjYXJkKTsKKworCS8qCisJICogSXMgdGhlIGludGVycnVwdCBmb3IgdGhpcyBjYXJkIChoYW5kc2hha2UgPT0gMSkKKwkgKi8KKwlkb19jYXJkX2ludGVycnVwdCA9IDA7CisJaWYgKEZTVF9SREIoY2FyZCwgaW50ZXJydXB0SGFuZHNoYWtlKSA9PSAxKSB7CisJCWRvX2NhcmRfaW50ZXJydXB0ICs9IEZTVF9DQVJEX0lOVDsKKwkJLyogU2V0IHRoZSBzb2Z0d2FyZSBhY2tub3dsZWRnZSAqLworCQlGU1RfV1JCKGNhcmQsIGludGVycnVwdEhhbmRzaGFrZSwgMHhFRSk7CisJfQorCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9UWFUpIHsKKwkJLyoKKwkJICogSXMgaXQgYSBETUEgSW50ZXJydXB0CisJCSAqLworCQlkbWFfaW50Y3NyID0gaW5sKGNhcmQtPnBjaV9jb25mICsgSU5UQ1NSXzkwNTQpOworCQlpZiAoZG1hX2ludGNzciAmIDB4MDAyMDAwMDApIHsKKwkJCS8qCisJCQkgKiBETUEgQ2hhbm5lbCAwIChSeCB0cmFuc2ZlciBjb21wbGV0ZSkKKwkJCSAqLworCQkJZGJnKERCR19SWCwgIkRNQSBSeCB4ZmVyIGNvbXBsZXRlXG4iKTsKKwkJCW91dGIoMHg4LCBjYXJkLT5wY2lfY29uZiArIERNQUNTUjApOworCQkJZnN0X3J4X2RtYV9jb21wbGV0ZShjYXJkLCBjYXJkLT5kbWFfcG9ydF9yeCwKKwkJCQkJICAgIGNhcmQtPmRtYV9sZW5fcngsIGNhcmQtPmRtYV9za2JfcngsCisJCQkJCSAgICBjYXJkLT5kbWFfcnhwb3MpOworCQkJY2FyZC0+ZG1hcnhfaW5fcHJvZ3Jlc3MgPSAwOworCQkJZG9fY2FyZF9pbnRlcnJ1cHQgKz0gRlNUX1JYX0RNQV9JTlQ7CisJCX0KKwkJaWYgKGRtYV9pbnRjc3IgJiAweDAwNDAwMDAwKSB7CisJCQkvKgorCQkJICogRE1BIENoYW5uZWwgMSAoVHggdHJhbnNmZXIgY29tcGxldGUpCisJCQkgKi8KKwkJCWRiZyhEQkdfVFgsICJETUEgVHggeGZlciBjb21wbGV0ZVxuIik7CisJCQlvdXRiKDB4OCwgY2FyZC0+cGNpX2NvbmYgKyBETUFDU1IxKTsKKwkJCWZzdF90eF9kbWFfY29tcGxldGUoY2FyZCwgY2FyZC0+ZG1hX3BvcnRfdHgsCisJCQkJCSAgICBjYXJkLT5kbWFfbGVuX3R4LCBjYXJkLT5kbWFfdHhwb3MpOworCQkJY2FyZC0+ZG1hdHhfaW5fcHJvZ3Jlc3MgPSAwOworCQkJZG9fY2FyZF9pbnRlcnJ1cHQgKz0gRlNUX1RYX0RNQV9JTlQ7CisJCX0KKwl9CisKKwkvKgorCSAqIEhhdmUgd2UgYmVlbiBtaXNzaW5nIEludGVycnVwdHMKKwkgKi8KKwlpbnRfcmV0cnlfY291bnQgPSBGU1RfUkRMKGNhcmQsIGludGVycnVwdFJldHJ5Q291bnQpOworCWlmIChpbnRfcmV0cnlfY291bnQpIHsKKwkJZGJnKERCR19BU1MsICJDYXJkICVkIGludF9yZXRyeV9jb3VudCBpcyAgJWRcbiIsCisJCSAgICBjYXJkLT5jYXJkX25vLCBpbnRfcmV0cnlfY291bnQpOworCQlGU1RfV1JMKGNhcmQsIGludGVycnVwdFJldHJ5Q291bnQsIDApOworCX0KKworCWlmICghZG9fY2FyZF9pbnRlcnJ1cHQpIHsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qIFNjZWhkdWxlIHRoZSBib3R0b20gaGFsZiBvZiB0aGUgSVNSICovCisJZnN0X3Ffd29ya19pdGVtKCZmc3Rfd29ya19pbnRxLCBjYXJkLT5jYXJkX25vKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZmc3RfaW50X3Rhc2spOworCisJLyogRHJhaW4gdGhlIGV2ZW50IHF1ZXVlICovCisJcmRpZHggPSBGU1RfUkRCKGNhcmQsIGludGVycnVwdEV2ZW50LnJkaW5kZXgpICYgMHgxZjsKKwl3cmlkeCA9IEZTVF9SREIoY2FyZCwgaW50ZXJydXB0RXZlbnQud3JpbmRleCkgJiAweDFmOworCXdoaWxlIChyZGlkeCAhPSB3cmlkeCkgeworCQlldmVudCA9IEZTVF9SREIoY2FyZCwgaW50ZXJydXB0RXZlbnQuZXZudGJ1ZmZbcmRpZHhdKTsKKwkJcG9ydCA9ICZjYXJkLT5wb3J0c1tldmVudCAmIDB4MDNdOworCisJCWRiZyhEQkdfSU5UUiwgIlByb2Nlc3NpbmcgSW50ZXJydXB0IGV2ZW50OiAleFxuIiwgZXZlbnQpOworCisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBURTFfQUxNQToKKwkJCWRiZyhEQkdfSU5UUiwgIlRFMSBBbGFybSBpbnRyXG4iKTsKKwkJCWlmIChwb3J0LT5ydW4pCisJCQkJZnN0X2ludHJfdGUxX2FsYXJtKGNhcmQsIHBvcnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBDVExBX0NIRzoKKwkJY2FzZSBDVExCX0NIRzoKKwkJY2FzZSBDVExDX0NIRzoKKwkJY2FzZSBDVExEX0NIRzoKKwkJCWlmIChwb3J0LT5ydW4pCisJCQkJZnN0X2ludHJfY3RsY2hnKGNhcmQsIHBvcnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQlRBX1NFTlQ6CisJCWNhc2UgQUJUQl9TRU5UOgorCQljYXNlIEFCVENfU0VOVDoKKwkJY2FzZSBBQlREX1NFTlQ6CisJCQlkYmcoREJHX1RYLCAiQWJvcnQgY29tcGxldGUgcG9ydCAlZFxuIiwgcG9ydC0+aW5kZXgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUWEFfVU5ERjoKKwkJY2FzZSBUWEJfVU5ERjoKKwkJY2FzZSBUWENfVU5ERjoKKwkJY2FzZSBUWERfVU5ERjoKKwkJCS8qIERpZmZpY3VsdCB0byBzZWUgaG93IHdlJ2QgZ2V0IHRoaXMgZ2l2ZW4gdGhhdCB3ZQorCQkJICogYWx3YXlzIGxvYWQgdXAgdGhlIGVudGlyZSBwYWNrZXQgZm9yIERNQS4KKwkJCSAqLworCQkJZGJnKERCR19UWCwgIlR4IHVuZGVyZmxvdyBwb3J0ICVkXG4iLCBwb3J0LT5pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZGxjX3N0YXRzKHBvcnRfdG9fZGV2KHBvcnQpKS0+dHhfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBoZGxjX3N0YXRzKHBvcnRfdG9fZGV2KHBvcnQpKS0+dHhfZmlmb19lcnJvcnMrKzsKKwkJCWRiZyhEQkdfQVNTLCAiVHggdW5kZXJmbG93IG9uIGNhcmQgJWQgcG9ydCAlZFxuIiwKKwkJCSAgICBjYXJkLT5jYXJkX25vLCBwb3J0LT5pbmRleCk7CisJCQlicmVhazsKKworCQljYXNlIElOSVRfQ1BMVDoKKwkJCWRiZyhEQkdfSU5JVCwgIkNhcmQgaW5pdCBPSyBpbnRyXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSU5JVF9GQUlMOgorCQkJZGJnKERCR19JTklULCAiQ2FyZCBpbml0IEZBSUxFRCBpbnRyXG4iKTsKKwkJCWNhcmQtPnN0YXRlID0gRlNUX0lGQUlMRUQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrX2VycigiaW50cjogdW5rbm93biBjYXJkIGV2ZW50ICVkLiBpZ25vcmVkXG4iLAorCQkJCSAgIGV2ZW50KTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQnVtcCBhbmQgd3JhcCB0aGUgaW5kZXggKi8KKwkJaWYgKCsrcmRpZHggPj0gTUFYX0NJUkJVRkYpCisJCQlyZGlkeCA9IDA7CisJfQorCUZTVF9XUkIoY2FyZCwgaW50ZXJydXB0RXZlbnQucmRpbmRleCwgcmRpZHgpOworICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qICAgICAgQ2hlY2sgdGhhdCB0aGUgc2hhcmVkIG1lbW9yeSBjb25maWd1cmF0aW9uIGlzIG9uZSB0aGF0IHdlIGNhbiBoYW5kbGUKKyAqICAgICAgYW5kIHRoYXQgc29tZSBiYXNpYyBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0CisgKi8KK3N0YXRpYyB2b2lkCitjaGVja19zdGFydGVkX29rKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQoreworCWludCBpOworCisJLyogQ2hlY2sgc3RydWN0dXJlIHZlcnNpb24gYW5kIGVuZCBtYXJrZXIgKi8KKwlpZiAoRlNUX1JEVyhjYXJkLCBzbWNWZXJzaW9uKSAhPSBTTUNfVkVSU0lPTikgeworCQlwcmludGtfZXJyKCJCYWQgc2hhcmVkIG1lbW9yeSB2ZXJzaW9uICVkIGV4cGVjdGVkICVkXG4iLAorCQkJICAgRlNUX1JEVyhjYXJkLCBzbWNWZXJzaW9uKSwgU01DX1ZFUlNJT04pOworCQljYXJkLT5zdGF0ZSA9IEZTVF9CQURWRVJTSU9OOworCQlyZXR1cm47CisJfQorCWlmIChGU1RfUkRMKGNhcmQsIGVuZE9mU21jU2lnbmF0dXJlKSAhPSBFTkRfU0lHKSB7CisJCXByaW50a19lcnIoIk1pc3Npbmcgc2hhcmVkIG1lbW9yeSBzaWduYXR1cmVcbiIpOworCQljYXJkLT5zdGF0ZSA9IEZTVF9CQURWRVJTSU9OOworCQlyZXR1cm47CisJfQorCS8qIEZpcm13YXJlIHN0YXR1cyBmbGFnLCAweDAwID0gaW5pdGlhbGlzaW5nLCAweDAxID0gT0ssIDB4RkYgPSBmYWlsICovCisJaWYgKChpID0gRlNUX1JEQihjYXJkLCB0YXNrU3RhdHVzKSkgPT0gMHgwMSkgeworCQljYXJkLT5zdGF0ZSA9IEZTVF9SVU5OSU5HOworCX0gZWxzZSBpZiAoaSA9PSAweEZGKSB7CisJCXByaW50a19lcnIoIkZpcm13YXJlIGluaXRpYWxpc2F0aW9uIGZhaWxlZC4gQ2FyZCBoYWx0ZWRcbiIpOworCQljYXJkLT5zdGF0ZSA9IEZTVF9IQUxURUQ7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGkgIT0gMHgwMCkgeworCQlwcmludGtfZXJyKCJVbmtub3duIGZpcm13YXJlIHN0YXR1cyAweCV4XG4iLCBpKTsKKwkJY2FyZC0+c3RhdGUgPSBGU1RfSEFMVEVEOworCQlyZXR1cm47CisJfQorCisJLyogRmluYWxseSBjaGVjayB0aGUgbnVtYmVyIG9mIHBvcnRzIHJlcG9ydGVkIGJ5IGZpcm13YXJlIGFnYWluc3QgdGhlCisJICogbnVtYmVyIHdlIGFzc3VtZWQgYXQgY2FyZCBkZXRlY3Rpb24uIFNob3VsZCBuZXZlciBoYXBwZW4gd2l0aAorCSAqIGV4aXN0aW5nIGZpcm13YXJlIGV0YyBzbyB3ZSBqdXN0IHJlcG9ydCBpdCBmb3IgdGhlIG1vbWVudC4KKwkgKi8KKwlpZiAoRlNUX1JETChjYXJkLCBudW1iZXJPZlBvcnRzKSAhPSBjYXJkLT5ucG9ydHMpIHsKKwkJcHJpbnRrX3dhcm4oIlBvcnQgY291bnQgbWlzbWF0Y2ggb24gY2FyZCAlZC4iCisJCQkgICAgIiBGaXJtd2FyZSB0aGlua3MgJWQgd2Ugc2F5ICVkXG4iLCBjYXJkLT5jYXJkX25vLAorCQkJICAgIEZTVF9SREwoY2FyZCwgbnVtYmVyT2ZQb3J0cyksIGNhcmQtPm5wb3J0cyk7CisJfQorfQorCitzdGF0aWMgaW50CitzZXRfY29uZl9mcm9tX2luZm8oc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCQkgICBzdHJ1Y3QgZnN0aW9jX2luZm8gKmluZm8pCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBjaGFyIG15X2ZyYW1pbmc7CisKKwkvKiBTZXQgdGhpbmdzIGFjY29yZGluZyB0byB0aGUgdXNlciBzZXQgdmFsaWQgZmxhZ3MgCisJICogU2V2ZXJhbCBvZiB0aGUgb2xkIG9wdGlvbnMgaGF2ZSBiZWVuIGludmFsaWRhdGVkL3JlcGxhY2VkIGJ5IHRoZSAKKwkgKiBnZW5lcmljIGhkbGMgcGFja2FnZS4KKwkgKi8KKwllcnIgPSAwOworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9QUk9UTykgeworCQlpZiAoaW5mby0+cHJvdG8gPT0gRlNUX1JBVykKKwkJCXBvcnQtPm1vZGUgPSBGU1RfUkFXOworCQllbHNlCisJCQlwb3J0LT5tb2RlID0gRlNUX0dFTl9IRExDOworCX0KKworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9DQUJMRSkKKwkJZXJyID0gLUVJTlZBTDsKKworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9TUEVFRCkKKwkJZXJyID0gLUVJTlZBTDsKKworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9QSEFTRSkKKwkJRlNUX1dSQihjYXJkLCBwb3J0Q29uZmlnW3BvcnQtPmluZGV4XS5pbnZlcnRDbG9jaywKKwkJCWluZm8tPmludmVydENsb2NrKTsKKwlpZiAoaW5mby0+dmFsaWQgJiBGU1RWQUxfTU9ERSkKKwkJRlNUX1dSVyhjYXJkLCBjYXJkTW9kZSwgaW5mby0+Y2FyZE1vZGUpOworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9URTEpIHsKKwkJRlNUX1dSTChjYXJkLCBzdUNvbmZpZy5kYXRhUmF0ZSwgaW5mby0+bGluZVNwZWVkKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5jbG9ja2luZywgaW5mby0+Y2xvY2tTb3VyY2UpOworCQlteV9mcmFtaW5nID0gRlJBTUlOR19FMTsKKwkJaWYgKGluZm8tPmZyYW1pbmcgPT0gRTEpCisJCQlteV9mcmFtaW5nID0gRlJBTUlOR19FMTsKKwkJaWYgKGluZm8tPmZyYW1pbmcgPT0gVDEpCisJCQlteV9mcmFtaW5nID0gRlJBTUlOR19UMTsKKwkJaWYgKGluZm8tPmZyYW1pbmcgPT0gSjEpCisJCQlteV9mcmFtaW5nID0gRlJBTUlOR19KMTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5mcmFtaW5nLCBteV9mcmFtaW5nKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5zdHJ1Y3R1cmUsIGluZm8tPnN0cnVjdHVyZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcuaW50ZXJmYWNlLCBpbmZvLT5pbnRlcmZhY2UpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmNvZGluZywgaW5mby0+Y29kaW5nKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5saW5lQnVpbGRPdXQsIGluZm8tPmxpbmVCdWlsZE91dCk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcuZXF1YWxpemVyLCBpbmZvLT5lcXVhbGl6ZXIpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLnRyYW5zcGFyZW50TW9kZSwgaW5mby0+dHJhbnNwYXJlbnRNb2RlKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5sb29wTW9kZSwgaW5mby0+bG9vcE1vZGUpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLnJhbmdlLCBpbmZvLT5yYW5nZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcudHhCdWZmZXJNb2RlLCBpbmZvLT50eEJ1ZmZlck1vZGUpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLnJ4QnVmZmVyTW9kZSwgaW5mby0+cnhCdWZmZXJNb2RlKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5zdGFydGluZ1Nsb3QsIGluZm8tPnN0YXJ0aW5nU2xvdCk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcubG9zVGhyZXNob2xkLCBpbmZvLT5sb3NUaHJlc2hvbGQpOworCQlpZiAoaW5mby0+aWRsZUNvZGUpCisJCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmVuYWJsZUlkbGVDb2RlLCAxKTsKKwkJZWxzZQorCQkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5lbmFibGVJZGxlQ29kZSwgMCk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcuaWRsZUNvZGUsIGluZm8tPmlkbGVDb2RlKTsKKyNpZiBGU1RfREVCVUcKKwkJaWYgKGluZm8tPnZhbGlkICYgRlNUVkFMX1RFMSkgeworCQkJcHJpbnRrKCJTZXR0aW5nIFRFMSBkYXRhXG4iKTsKKwkJCXByaW50aygiTGluZSBTcGVlZCA9ICVkXG4iLCBpbmZvLT5saW5lU3BlZWQpOworCQkJcHJpbnRrKCJTdGFydCBzbG90ID0gJWRcbiIsIGluZm8tPnN0YXJ0aW5nU2xvdCk7CisJCQlwcmludGsoIkNsb2NrIHNvdXJjZSA9ICVkXG4iLCBpbmZvLT5jbG9ja1NvdXJjZSk7CisJCQlwcmludGsoIkZyYW1pbmcgPSAlZFxuIiwgbXlfZnJhbWluZyk7CisJCQlwcmludGsoIlN0cnVjdHVyZSA9ICVkXG4iLCBpbmZvLT5zdHJ1Y3R1cmUpOworCQkJcHJpbnRrKCJpbnRlcmZhY2UgPSAlZFxuIiwgaW5mby0+aW50ZXJmYWNlKTsKKwkJCXByaW50aygiQ29kaW5nID0gJWRcbiIsIGluZm8tPmNvZGluZyk7CisJCQlwcmludGsoIkxpbmUgYnVpbGQgb3V0ID0gJWRcbiIsIGluZm8tPmxpbmVCdWlsZE91dCk7CisJCQlwcmludGsoIkVxdWFsaXNlciA9ICVkXG4iLCBpbmZvLT5lcXVhbGl6ZXIpOworCQkJcHJpbnRrKCJUcmFuc3BhcmVudCBtb2RlID0gJWRcbiIsCisJCQkgICAgICAgaW5mby0+dHJhbnNwYXJlbnRNb2RlKTsKKwkJCXByaW50aygiTG9vcCBtb2RlID0gJWRcbiIsIGluZm8tPmxvb3BNb2RlKTsKKwkJCXByaW50aygiUmFuZ2UgPSAlZFxuIiwgaW5mby0+cmFuZ2UpOworCQkJcHJpbnRrKCJUeCBCdWZmZXIgbW9kZSA9ICVkXG4iLCBpbmZvLT50eEJ1ZmZlck1vZGUpOworCQkJcHJpbnRrKCJSeCBCdWZmZXIgbW9kZSA9ICVkXG4iLCBpbmZvLT5yeEJ1ZmZlck1vZGUpOworCQkJcHJpbnRrKCJMT1MgVGhyZXNob2xkID0gJWRcbiIsIGluZm8tPmxvc1RocmVzaG9sZCk7CisJCQlwcmludGsoIklkbGUgQ29kZSA9ICVkXG4iLCBpbmZvLT5pZGxlQ29kZSk7CisJCX0KKyNlbmRpZgorCX0KKyNpZiBGU1RfREVCVUcKKwlpZiAoaW5mby0+dmFsaWQgJiBGU1RWQUxfREVCVUcpIHsKKwkJZnN0X2RlYnVnX21hc2sgPSBpbmZvLT5kZWJ1ZzsKKwl9CisjZW5kaWYKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkCitnYXRoZXJfY29uZl9pbmZvKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwKKwkJIHN0cnVjdCBmc3Rpb2NfaW5mbyAqaW5mbykKK3sKKwlpbnQgaTsKKworCW1lbXNldChpbmZvLCAwLCBzaXplb2YgKHN0cnVjdCBmc3Rpb2NfaW5mbykpOworCisJaSA9IHBvcnQtPmluZGV4OworCWluZm8tPmtlcm5lbFZlcnNpb24gPSBMSU5VWF9WRVJTSU9OX0NPREU7CisJaW5mby0+bnBvcnRzID0gY2FyZC0+bnBvcnRzOworCWluZm8tPnR5cGUgPSBjYXJkLT50eXBlOworCWluZm8tPnN0YXRlID0gY2FyZC0+c3RhdGU7CisJaW5mby0+cHJvdG8gPSBGU1RfR0VOX0hETEM7CisJaW5mby0+aW5kZXggPSBpOworI2lmIEZTVF9ERUJVRworCWluZm8tPmRlYnVnID0gZnN0X2RlYnVnX21hc2s7CisjZW5kaWYKKworCS8qIE9ubHkgbWFyayBpbmZvcm1hdGlvbiBhcyB2YWxpZCBpZiBjYXJkIGlzIHJ1bm5pbmcuCisJICogQ29weSB0aGUgZGF0YSBhbnl3YXkgaW4gY2FzZSBpdCBpcyB1c2VmdWwgZm9yIGRpYWdub3N0aWNzCisJICovCisJaW5mby0+dmFsaWQgPSAoKGNhcmQtPnN0YXRlID09IEZTVF9SVU5OSU5HKSA/IEZTVFZBTF9BTEwgOiBGU1RWQUxfQ0FSRCkKKyNpZiBGU1RfREVCVUcKKwkgICAgfCBGU1RWQUxfREVCVUcKKyNlbmRpZgorCSAgICA7CisKKwlpbmZvLT5saW5lSW50ZXJmYWNlID0gRlNUX1JEVyhjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2UpOworCWluZm8tPmludGVybmFsQ2xvY2sgPSBGU1RfUkRCKGNhcmQsIHBvcnRDb25maWdbaV0uaW50ZXJuYWxDbG9jayk7CisJaW5mby0+bGluZVNwZWVkID0gRlNUX1JETChjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVTcGVlZCk7CisJaW5mby0+aW52ZXJ0Q2xvY2sgPSBGU1RfUkRCKGNhcmQsIHBvcnRDb25maWdbaV0uaW52ZXJ0Q2xvY2spOworCWluZm8tPnYyNElwU3RzID0gRlNUX1JETChjYXJkLCB2MjRJcFN0c1tpXSk7CisJaW5mby0+djI0T3BTdHMgPSBGU1RfUkRMKGNhcmQsIHYyNE9wU3RzW2ldKTsKKwlpbmZvLT5jbG9ja1N0YXR1cyA9IEZTVF9SRFcoY2FyZCwgY2xvY2tTdGF0dXNbaV0pOworCWluZm8tPmNhYmxlU3RhdHVzID0gRlNUX1JEVyhjYXJkLCBjYWJsZVN0YXR1cyk7CisJaW5mby0+Y2FyZE1vZGUgPSBGU1RfUkRXKGNhcmQsIGNhcmRNb2RlKTsKKwlpbmZvLT5zbWNGaXJtd2FyZVZlcnNpb24gPSBGU1RfUkRMKGNhcmQsIHNtY0Zpcm13YXJlVmVyc2lvbik7CisKKwkvKgorCSAqIFRoZSBUMlUgY2FuIHJlcG9ydCBjYWJsZSBwcmVzZW5jZSBmb3IgYm90aCBBIG9yIEIKKwkgKiBpbiBiaXRzIDAgYW5kIDEgb2YgY2FibGVTdGF0dXMuICBTZWUgd2hpY2ggcG9ydCB3ZSBhcmUgYW5kIAorCSAqIGRvIHRoZSBtYXBwaW5nLgorCSAqLworCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9UWFUpIHsKKwkJaWYgKHBvcnQtPmluZGV4ID09IDApIHsKKwkJCS8qCisJCQkgKiBQb3J0IEEKKwkJCSAqLworCQkJaW5mby0+Y2FibGVTdGF0dXMgPSBpbmZvLT5jYWJsZVN0YXR1cyAmIDE7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogUG9ydCBCCisJCQkgKi8KKwkJCWluZm8tPmNhYmxlU3RhdHVzID0gaW5mby0+Y2FibGVTdGF0dXMgPj4gMTsKKwkJCWluZm8tPmNhYmxlU3RhdHVzID0gaW5mby0+Y2FibGVTdGF0dXMgJiAxOworCQl9CisJfQorCS8qCisJICogU29tZSBhZGRpdGlvbmFsIGJpdHMgaWYgd2UgYXJlIFRFMQorCSAqLworCWlmIChjYXJkLT50eXBlID09IEZTVF9UWVBFX1RFMSkgeworCQlpbmZvLT5saW5lU3BlZWQgPSBGU1RfUkRMKGNhcmQsIHN1Q29uZmlnLmRhdGFSYXRlKTsKKwkJaW5mby0+Y2xvY2tTb3VyY2UgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmNsb2NraW5nKTsKKwkJaW5mby0+ZnJhbWluZyA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcuZnJhbWluZyk7CisJCWluZm8tPnN0cnVjdHVyZSA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcuc3RydWN0dXJlKTsKKwkJaW5mby0+aW50ZXJmYWNlID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5pbnRlcmZhY2UpOworCQlpbmZvLT5jb2RpbmcgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmNvZGluZyk7CisJCWluZm8tPmxpbmVCdWlsZE91dCA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcubGluZUJ1aWxkT3V0KTsKKwkJaW5mby0+ZXF1YWxpemVyID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5lcXVhbGl6ZXIpOworCQlpbmZvLT5sb29wTW9kZSA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcubG9vcE1vZGUpOworCQlpbmZvLT5yYW5nZSA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcucmFuZ2UpOworCQlpbmZvLT50eEJ1ZmZlck1vZGUgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLnR4QnVmZmVyTW9kZSk7CisJCWluZm8tPnJ4QnVmZmVyTW9kZSA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcucnhCdWZmZXJNb2RlKTsKKwkJaW5mby0+c3RhcnRpbmdTbG90ID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5zdGFydGluZ1Nsb3QpOworCQlpbmZvLT5sb3NUaHJlc2hvbGQgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmxvc1RocmVzaG9sZCk7CisJCWlmIChGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmVuYWJsZUlkbGVDb2RlKSkKKwkJCWluZm8tPmlkbGVDb2RlID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5pZGxlQ29kZSk7CisJCWVsc2UKKwkJCWluZm8tPmlkbGVDb2RlID0gMDsKKwkJaW5mby0+cmVjZWl2ZUJ1ZmZlckRlbGF5ID0KKwkJICAgIEZTVF9SREwoY2FyZCwgc3VTdGF0dXMucmVjZWl2ZUJ1ZmZlckRlbGF5KTsKKwkJaW5mby0+ZnJhbWluZ0Vycm9yQ291bnQgPQorCQkgICAgRlNUX1JETChjYXJkLCBzdVN0YXR1cy5mcmFtaW5nRXJyb3JDb3VudCk7CisJCWluZm8tPmNvZGVWaW9sYXRpb25Db3VudCA9CisJCSAgICBGU1RfUkRMKGNhcmQsIHN1U3RhdHVzLmNvZGVWaW9sYXRpb25Db3VudCk7CisJCWluZm8tPmNyY0Vycm9yQ291bnQgPSBGU1RfUkRMKGNhcmQsIHN1U3RhdHVzLmNyY0Vycm9yQ291bnQpOworCQlpbmZvLT5saW5lQXR0ZW51YXRpb24gPSBGU1RfUkRMKGNhcmQsIHN1U3RhdHVzLmxpbmVBdHRlbnVhdGlvbik7CisJCWluZm8tPmxvc3NPZlNpZ25hbCA9IEZTVF9SREIoY2FyZCwgc3VTdGF0dXMubG9zc09mU2lnbmFsKTsKKwkJaW5mby0+cmVjZWl2ZVJlbW90ZUFsYXJtID0KKwkJICAgIEZTVF9SREIoY2FyZCwgc3VTdGF0dXMucmVjZWl2ZVJlbW90ZUFsYXJtKTsKKwkJaW5mby0+YWxhcm1JbmRpY2F0aW9uU2lnbmFsID0KKwkJICAgIEZTVF9SREIoY2FyZCwgc3VTdGF0dXMuYWxhcm1JbmRpY2F0aW9uU2lnbmFsKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2ZzdF9zZXRfaWZhY2Uoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCSAgICAgIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCXN5bmNfc2VyaWFsX3NldHRpbmdzIHN5bmM7CisJaW50IGk7CisKKwlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSAhPSBzaXplb2YgKHN5bmMpKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcgorCSAgICAoJnN5bmMsIGlmci0+aWZyX3NldHRpbmdzLmlmc19pZnN1LnN5bmMsIHNpemVvZiAoc3luYykpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChzeW5jLmxvb3BiYWNrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWkgPSBwb3J0LT5pbmRleDsKKworCXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfSUZBQ0VfVjM1OgorCQlGU1RfV1JXKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUludGVyZmFjZSwgVjM1KTsKKwkJcG9ydC0+aHdpZiA9IFYzNTsKKwkJYnJlYWs7CisKKwljYXNlIElGX0lGQUNFX1YyNDoKKwkJRlNUX1dSVyhjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2UsIFYyNCk7CisJCXBvcnQtPmh3aWYgPSBWMjQ7CisJCWJyZWFrOworCisJY2FzZSBJRl9JRkFDRV9YMjE6CisJCUZTVF9XUlcoY2FyZCwgcG9ydENvbmZpZ1tpXS5saW5lSW50ZXJmYWNlLCBYMjEpOworCQlwb3J0LT5od2lmID0gWDIxOworCQlicmVhazsKKworCWNhc2UgSUZfSUZBQ0VfWDIxRDoKKwkJRlNUX1dSVyhjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2UsIFgyMUQpOworCQlwb3J0LT5od2lmID0gWDIxRDsKKwkJYnJlYWs7CisKKwljYXNlIElGX0lGQUNFX1QxOgorCQlGU1RfV1JXKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUludGVyZmFjZSwgVDEpOworCQlwb3J0LT5od2lmID0gVDE7CisJCWJyZWFrOworCisJY2FzZSBJRl9JRkFDRV9FMToKKwkJRlNUX1dSVyhjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2UsIEUxKTsKKwkJcG9ydC0+aHdpZiA9IEUxOworCQlicmVhazsKKworCWNhc2UgSUZfSUZBQ0VfU1lOQ19TRVJJQUw6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChzeW5jLmNsb2NrX3R5cGUpIHsKKwljYXNlIENMT0NLX0VYVDoKKwkJRlNUX1dSQihjYXJkLCBwb3J0Q29uZmlnW2ldLmludGVybmFsQ2xvY2ssIEVYVENMSyk7CisJCWJyZWFrOworCisJY2FzZSBDTE9DS19JTlQ6CisJCUZTVF9XUkIoY2FyZCwgcG9ydENvbmZpZ1tpXS5pbnRlcm5hbENsb2NrLCBJTlRDTEspOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlGU1RfV1JMKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZVNwZWVkLCBzeW5jLmNsb2NrX3JhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citmc3RfZ2V0X2lmYWNlKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwKKwkgICAgICBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBzeW5jOworCWludCBpOworCisJLyogRmlyc3QgY2hlY2sgd2hhdCBsaW5lIHR5cGUgaXMgc2V0LCB3ZSdsbCBkZWZhdWx0IHRvIHJlcG9ydGluZyBYLjIxCisJICogaWYgbm90aGluZyBpcyBzZXQgYXMgSUZfSUZBQ0VfU1lOQ19TRVJJQUwgaW1wbGllcyBpdCBjYW4ndCBiZQorCSAqIGNoYW5nZWQKKwkgKi8KKwlzd2l0Y2ggKHBvcnQtPmh3aWYpIHsKKwljYXNlIEUxOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfRTE7CisJCWJyZWFrOworCWNhc2UgVDE6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9UMTsKKwkJYnJlYWs7CisJY2FzZSBWMzU6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9WMzU7CisJCWJyZWFrOworCWNhc2UgVjI0OgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfVjI0OworCQlicmVhazsKKwljYXNlIFgyMUQ6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9YMjFEOworCQlicmVhazsKKwljYXNlIFgyMToKKwlkZWZhdWx0OgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfWDIxOworCQlicmVhazsKKwl9CisJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPT0gMCkgeworCQlyZXR1cm4gMDsJLyogb25seSB0eXBlIHJlcXVlc3RlZCAqLworCX0KKwlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemVvZiAoc3luYykpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaSA9IHBvcnQtPmluZGV4OworCXN5bmMuY2xvY2tfcmF0ZSA9IEZTVF9SREwoY2FyZCwgcG9ydENvbmZpZ1tpXS5saW5lU3BlZWQpOworCS8qIEx1Y2t5IGNhcmQgYW5kIGxpbnV4IHVzZSBzYW1lIGVuY29kaW5nIGhlcmUgKi8KKwlzeW5jLmNsb2NrX3R5cGUgPSBGU1RfUkRCKGNhcmQsIHBvcnRDb25maWdbaV0uaW50ZXJuYWxDbG9jaykgPT0KKwkgICAgSU5UQ0xLID8gQ0xPQ0tfSU5UIDogQ0xPQ0tfRVhUOworCXN5bmMubG9vcGJhY2sgPSAwOworCisJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jLCAmc3luYywgc2l6ZW9mIChzeW5jKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemVvZiAoc3luYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ZzdF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsKKwlzdHJ1Y3QgZnN0aW9jX3dyaXRlIHdydGhkcjsKKwlzdHJ1Y3QgZnN0aW9jX2luZm8gaW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGJnKERCR19JT0NUTCwgImlvY3RsOiAleCwgJXBcbiIsIGNtZCwgaWZyLT5pZnJfZGF0YSk7CisKKwlwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwljYXJkID0gcG9ydC0+Y2FyZDsKKworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBGU1RDUFVSRVNFVDoKKwkJZnN0X2NwdXJlc2V0KGNhcmQpOworCQljYXJkLT5zdGF0ZSA9IEZTVF9SRVNFVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEZTVENQVVJFTEVBU0U6CisJCWZzdF9jcHVyZWxlYXNlKGNhcmQpOworCQljYXJkLT5zdGF0ZSA9IEZTVF9TVEFSVElORzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEZTVFdSSVRFOgkJLyogQ29kZSB3cml0ZSAoZG93bmxvYWQpICovCisKKwkJLyogRmlyc3QgY29weSBpbiB0aGUgaGVhZGVyIHdpdGggdGhlIGxlbmd0aCBhbmQgb2Zmc2V0IG9mIGRhdGEKKwkJICogdG8gd3JpdGUKKwkJICovCisJCWlmIChpZnItPmlmcl9kYXRhID09IE5VTEwpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmd3J0aGRyLCBpZnItPmlmcl9kYXRhLAorCQkJCSAgIHNpemVvZiAoc3RydWN0IGZzdGlvY193cml0ZSkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCS8qIFNhbml0eSBjaGVjayB0aGUgcGFyYW1ldGVycy4gV2UgZG9uJ3Qgc3VwcG9ydCBwYXJ0aWFsIHdyaXRlcworCQkgKiB3aGVuIGdvaW5nIG92ZXIgdGhlIHRvcAorCQkgKi8KKwkJaWYgKHdydGhkci5zaXplID4gRlNUX01FTVNJWkUgfHwgd3J0aGRyLm9mZnNldCA+IEZTVF9NRU1TSVpFCisJCSAgICB8fCB3cnRoZHIuc2l6ZSArIHdydGhkci5vZmZzZXQgPiBGU1RfTUVNU0laRSkgeworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCisJCS8qIE5vdyBjb3B5IHRoZSBkYXRhIHRvIHRoZSBjYXJkLgorCQkgKiBUaGlzIHdpbGwgcHJvYmFibHkgYnJlYWsgb24gc29tZSBhcmNoaXRlY3R1cmVzLgorCQkgKiBJJ2xsIGZpeCBpdCB3aGVuIEkgaGF2ZSBzb21ldGhpbmcgdG8gdGVzdCBvbi4KKwkJICovCisJCWlmIChjb3B5X2Zyb21fdXNlcihjYXJkLT5tZW0gKyB3cnRoZHIub2Zmc2V0LAorCQkJCSAgIGlmci0+aWZyX2RhdGEgKyBzaXplb2YgKHN0cnVjdCBmc3Rpb2Nfd3JpdGUpLAorCQkJCSAgIHdydGhkci5zaXplKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQkvKiBXcml0ZXMgdG8gdGhlIG1lbW9yeSBvZiBhIGNhcmQgaW4gdGhlIHJlc2V0IHN0YXRlIGNvbnN0aXR1dGUKKwkJICogYSBkb3dubG9hZAorCQkgKi8KKwkJaWYgKGNhcmQtPnN0YXRlID09IEZTVF9SRVNFVCkgeworCQkJY2FyZC0+c3RhdGUgPSBGU1RfRE9XTkxPQUQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIEZTVEdFVENPTkY6CisKKwkJLyogSWYgY2FyZCBoYXMganVzdCBiZWVuIHN0YXJ0ZWQgY2hlY2sgdGhlIHNoYXJlZCBtZW1vcnkgY29uZmlnCisJCSAqIHZlcnNpb24gYW5kIG1hcmtlcgorCQkgKi8KKwkJaWYgKGNhcmQtPnN0YXRlID09IEZTVF9TVEFSVElORykgeworCQkJY2hlY2tfc3RhcnRlZF9vayhjYXJkKTsKKworCQkJLyogSWYgZXZlcnl0aGluZyBjaGVja2VkIG91dCBlbmFibGUgY2FyZCBpbnRlcnJ1cHRzICovCisJCQlpZiAoY2FyZC0+c3RhdGUgPT0gRlNUX1JVTk5JTkcpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCQkJZnN0X2VuYWJsZV9pbnRyKGNhcmQpOworCQkJCUZTVF9XUkIoY2FyZCwgaW50ZXJydXB0SGFuZHNoYWtlLCAweEVFKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQorCisJCWlmIChpZnItPmlmcl9kYXRhID09IE5VTEwpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZ2F0aGVyX2NvbmZfaW5mbyhjYXJkLCBwb3J0LCAmaW5mbyk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmaW5mbywgc2l6ZW9mIChpbmZvKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBGU1RTRVRDT05GOgorCisJCS8qCisJCSAqIE1vc3Qgb2YgdGhlIHNldHRpbmdzIGhhdmUgYmVlbiBtb3ZlZCB0byB0aGUgZ2VuZXJpYyBpb2N0bHMKKwkJICogdGhpcyBqdXN0IGNvdmVycyBkZWJ1ZyBhbmQgYm9hcmQgaWRlbnQgbm93CisJCSAqLworCisJCWlmIChjYXJkLT5zdGF0ZSAhPSBGU1RfUlVOTklORykgeworCQkJcHJpbnRrX2VycgorCQkJICAgICgiQXR0ZW1wdCB0byBjb25maWd1cmUgY2FyZCAlZCBpbiBub24tcnVubmluZyBzdGF0ZSAoJWQpXG4iLAorCQkJICAgICBjYXJkLT5jYXJkX25vLCBjYXJkLT5zdGF0ZSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGlmci0+aWZyX2RhdGEsIHNpemVvZiAoaW5mbykpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJldHVybiBzZXRfY29uZl9mcm9tX2luZm8oY2FyZCwgcG9ydCwgJmluZm8pOworCisJY2FzZSBTSU9DV0FOREVWOgorCQlzd2l0Y2ggKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwkJY2FzZSBJRl9HRVRfSUZBQ0U6CisJCQlyZXR1cm4gZnN0X2dldF9pZmFjZShjYXJkLCBwb3J0LCBpZnIpOworCisJCWNhc2UgSUZfSUZBQ0VfU1lOQ19TRVJJQUw6CisJCWNhc2UgSUZfSUZBQ0VfVjM1OgorCQljYXNlIElGX0lGQUNFX1YyNDoKKwkJY2FzZSBJRl9JRkFDRV9YMjE6CisJCWNhc2UgSUZfSUZBQ0VfWDIxRDoKKwkJY2FzZSBJRl9JRkFDRV9UMToKKwkJY2FzZSBJRl9JRkFDRV9FMToKKwkJCXJldHVybiBmc3Rfc2V0X2lmYWNlKGNhcmQsIHBvcnQsIGlmcik7CisKKwkJY2FzZSBJRl9QUk9UT19SQVc6CisJCQlwb3J0LT5tb2RlID0gRlNUX1JBVzsKKwkJCXJldHVybiAwOworCisJCWNhc2UgSUZfR0VUX1BST1RPOgorCQkJaWYgKHBvcnQtPm1vZGUgPT0gRlNUX1JBVykgeworCQkJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9QUk9UT19SQVc7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKworCQlkZWZhdWx0OgorCQkJcG9ydC0+bW9kZSA9IEZTVF9HRU5fSERMQzsKKwkJCWRiZyhEQkdfSU9DVEwsICJQYXNzaW5nIHRoaXMgdHlwZSB0byBoZGxjICV4XG4iLAorCQkJICAgIGlmci0+aWZyX3NldHRpbmdzLnR5cGUpOworCQkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJCX0KKworCWRlZmF1bHQ6CisJCS8qIE5vdCBvbmUgb2Ygb3Vycy4gUGFzcyB0aHJvdWdoIHRvIEhETEMgcGFja2FnZSAqLworCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitmc3Rfb3BlbnBvcnQoc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQpCit7CisJaW50IHNpZ25hbHM7CisJaW50IHR4cV9sZW5ndGg7CisKKwkvKiBPbmx5IGluaXQgdGhpbmdzIGlmIGNhcmQgaXMgYWN0dWFsbHkgcnVubmluZy4gVGhpcyBhbGxvd3Mgb3BlbiB0bworCSAqIHN1Y2NlZWQgZm9yIGRvd25sb2FkcyBldGMuCisJICovCisJaWYgKHBvcnQtPmNhcmQtPnN0YXRlID09IEZTVF9SVU5OSU5HKSB7CisJCWlmIChwb3J0LT5ydW4pIHsKKwkJCWRiZyhEQkdfT1BFTiwgIm9wZW46IGZvdW5kIHBvcnQgYWxyZWFkeSBydW5uaW5nXG4iKTsKKworCQkJZnN0X2lzc3VlX2NtZChwb3J0LCBTVE9QUE9SVCk7CisJCQlwb3J0LT5ydW4gPSAwOworCQl9CisKKwkJZnN0X3J4X2NvbmZpZyhwb3J0KTsKKwkJZnN0X3R4X2NvbmZpZyhwb3J0KTsKKwkJZnN0X29wX3JhaXNlKHBvcnQsIE9QU1RTX1JUUyB8IE9QU1RTX0RUUik7CisKKwkJZnN0X2lzc3VlX2NtZChwb3J0LCBTVEFSVFBPUlQpOworCQlwb3J0LT5ydW4gPSAxOworCisJCXNpZ25hbHMgPSBGU1RfUkRMKHBvcnQtPmNhcmQsIHYyNERlYm91bmNlZFN0c1twb3J0LT5pbmRleF0pOworCQlpZiAoc2lnbmFscyAmICgoKHBvcnQtPmh3aWYgPT0gWDIxKSB8fCAocG9ydC0+aHdpZiA9PSBYMjFEKSkKKwkJCSAgICAgICA/IElQU1RTX0lORElDQVRFIDogSVBTVFNfRENEKSkKKwkJCW5ldGlmX2NhcnJpZXJfb24ocG9ydF90b19kZXYocG9ydCkpOworCQllbHNlCisJCQluZXRpZl9jYXJyaWVyX29mZihwb3J0X3RvX2Rldihwb3J0KSk7CisKKwkJdHhxX2xlbmd0aCA9IHBvcnQtPnR4cWUgLSBwb3J0LT50eHFzOworCQlwb3J0LT50eHFlID0gMDsKKwkJcG9ydC0+dHhxcyA9IDA7CisJfQorCit9CisKK3N0YXRpYyB2b2lkCitmc3RfY2xvc2Vwb3J0KHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0KQoreworCWlmIChwb3J0LT5jYXJkLT5zdGF0ZSA9PSBGU1RfUlVOTklORykgeworCQlpZiAocG9ydC0+cnVuKSB7CisJCQlwb3J0LT5ydW4gPSAwOworCQkJZnN0X29wX2xvd2VyKHBvcnQsIE9QU1RTX1JUUyB8IE9QU1RTX0RUUik7CisKKwkJCWZzdF9pc3N1ZV9jbWQocG9ydCwgU1RPUFBPUlQpOworCQl9IGVsc2UgeworCQkJZGJnKERCR19PUEVOLCAiY2xvc2U6IHBvcnQgbm90IHJ1bm5pbmdcbiIpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50Citmc3Rfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBlcnI7CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisKKwlwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKKyAgICAgICAgICByZXR1cm4gLUVCVVNZOworCisJaWYgKHBvcnQtPm1vZGUgIT0gRlNUX1JBVykgeworCQllcnIgPSBoZGxjX29wZW4oZGV2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJZnN0X29wZW5wb3J0KHBvcnQpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZnN0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisJdW5zaWduZWQgY2hhciB0eF9kbWFfZG9uZTsKKwl1bnNpZ25lZCBjaGFyIHJ4X2RtYV9kb25lOworCisJcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJY2FyZCA9IHBvcnQtPmNhcmQ7CisKKwl0eF9kbWFfZG9uZSA9IGluYihjYXJkLT5wY2lfY29uZiArIERNQUNTUjEpOworCXJ4X2RtYV9kb25lID0gaW5iKGNhcmQtPnBjaV9jb25mICsgRE1BQ1NSMCk7CisJZGJnKERCR19PUEVOLAorCSAgICAiUG9ydCBDbG9zZTogdHhfZG1hX2luX3Byb2dyZXNzID0gJWQgKCV4KSByeF9kbWFfaW5fcHJvZ3Jlc3MgPSAlZCAoJXgpXG4iLAorCSAgICBjYXJkLT5kbWF0eF9pbl9wcm9ncmVzcywgdHhfZG1hX2RvbmUsIGNhcmQtPmRtYXJ4X2luX3Byb2dyZXNzLAorCSAgICByeF9kbWFfZG9uZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJZnN0X2Nsb3NlcG9ydChkZXZfdG9fcG9ydChkZXYpKTsKKwlpZiAocG9ydC0+bW9kZSAhPSBGU1RfUkFXKSB7CisJCWhkbGNfY2xvc2UoZGV2KTsKKwl9CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ZzdF9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgZW5jb2RpbmcsIHVuc2lnbmVkIHNob3J0IHBhcml0eSkKK3sKKwkvKgorCSAqIFNldHRpbmcgY3VycmVudGx5IGZpeGVkIGluIEZhclN5bmMgY2FyZCBzbyB3ZSBjaGVjayBhbmQgZm9yZ2V0CisJICovCisJaWYgKGVuY29kaW5nICE9IEVOQ09ESU5HX05SWiB8fCBwYXJpdHkgIT0gUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitmc3RfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0OworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKworCXBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCWNhcmQgPSBwb3J0LT5jYXJkOworCXN0YXRzLT50eF9lcnJvcnMrKzsKKwlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMrKzsKKwlkYmcoREJHX0FTUywgIlR4IHRpbWVvdXQgY2FyZCAlZCBwb3J0ICVkXG4iLAorCSAgICBjYXJkLT5jYXJkX25vLCBwb3J0LT5pbmRleCk7CisJZnN0X2lzc3VlX2NtZChwb3J0LCBBQk9SVFRYKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlwb3J0LT5zdGFydCA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK2ZzdF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHR4cV9sZW5ndGg7CisKKwlwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwljYXJkID0gcG9ydC0+Y2FyZDsKKwlkYmcoREJHX1RYLCAiZnN0X3N0YXJ0X3htaXQ6IGxlbmd0aCA9ICVkXG4iLCBza2ItPmxlbik7CisKKwkvKiBEcm9wIHBhY2tldCB3aXRoIGVycm9yIGlmIHdlIGRvbid0IGhhdmUgY2FycmllciAqLworCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJZGJnKERCR19BU1MsCisJCSAgICAiVHJpZWQgdG8gdHJhbnNtaXQgYnV0IG5vIGNhcnJpZXIgb24gY2FyZCAlZCBwb3J0ICVkXG4iLAorCQkgICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBEcm9wIGl0IGlmIGl0J3MgdG9vIGJpZyEgTVRVIGZhaWx1cmUgPyAqLworCWlmIChza2ItPmxlbiA+IExFTl9UWF9CVUZGRVIpIHsKKwkJZGJnKERCR19BU1MsICJQYWNrZXQgdG9vIGxhcmdlICVkIHZzICVkXG4iLCBza2ItPmxlbiwKKwkJICAgIExFTl9UWF9CVUZGRVIpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBXZSBhcmUgYWx3YXlzIGdvaW5nIHRvIHF1ZXVlIHRoZSBwYWNrZXQKKwkgKiBzbyB0aGF0IHRoZSBib3R0b20gaGFsZiBpcyB0aGUgb25seSBwbGFjZSB3ZSB0eCBmcm9tCisJICogQ2hlY2sgdGhlcmUgaXMgcm9vbSBpbiB0aGUgcG9ydCB0eHEKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKCh0eHFfbGVuZ3RoID0gcG9ydC0+dHhxZSAtIHBvcnQtPnR4cXMpIDwgMCkgeworCQkvKgorCQkgKiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZSBuZXh0IGZyZWUgaGFzIHdyYXBwZWQgYnV0IHRoZQorCQkgKiBsYXN0IHVzZWQgaGFzbid0CisJCSAqLworCQl0eHFfbGVuZ3RoID0gdHhxX2xlbmd0aCArIEZTVF9UWFFfREVQVEg7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCWlmICh0eHFfbGVuZ3RoID4gZnN0X3R4cV9oaWdoKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgZ290IGVub3VnaCBidWZmZXJzIGluIHRoZSBwaXBlbGluZS4gIEFzayB0aGUgbmV0d29yaworCQkgKiBsYXllciB0byBzdG9wIHNlbmRpbmcgZnJhbWVzIGRvd24KKwkJICovCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcG9ydC0+c3RhcnQgPSAxOwkvKiBJJ20gdXNpbmcgdGhpcyB0byBzaWduYWwgc3RvcCBzZW50IHVwICovCisJfQorCisJaWYgKHR4cV9sZW5ndGggPT0gRlNUX1RYUV9ERVBUSCAtIDEpIHsKKwkJLyoKKwkJICogVGhpcyBzaG91bGRuJ3QgaGF2ZSBoYXBwZW5lZCBidXQgc3VjaCBpcyBsaWZlCisJCSAqLworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJZGJnKERCR19BU1MsICJUeCBxdWV1ZSBvdmVyZmxvdyBjYXJkICVkIHBvcnQgJWRcbiIsCisJCSAgICBjYXJkLT5jYXJkX25vLCBwb3J0LT5pbmRleCk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogcXVldWUgdGhlIGJ1ZmZlcgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlwb3J0LT50eHFbcG9ydC0+dHhxZV0gPSBza2I7CisJcG9ydC0+dHhxZSsrOworCWlmIChwb3J0LT50eHFlID09IEZTVF9UWFFfREVQVEgpCisJCXBvcnQtPnR4cWUgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCisJLyogU2NlaGR1bGUgdGhlIGJvdHRvbSBoYWxmIHdoaWNoIG5vdyBkb2VzIHRyYW5zbWl0IHByb2Nlc3NpbmcgKi8KKwlmc3RfcV93b3JrX2l0ZW0oJmZzdF93b3JrX3R4cSwgY2FyZC0+Y2FyZF9ubyk7CisJdGFza2xldF9zY2hlZHVsZSgmZnN0X3R4X3Rhc2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgICAgIENhcmQgc2V0dXAgaGF2aW5nIGNoZWNrZWQgaGFyZHdhcmUgcmVzb3VyY2VzLgorICogICAgICBTaG91bGQgYmUgcHJldHR5IGJpemFycmUgaWYgd2UgZ2V0IGFuIGVycm9yIGhlcmUgKGtlcm5lbCBtZW1vcnkKKyAqICAgICAgZXhoYXVzdGlvbiBpcyBvbmUgcG9zc2liaWxpdHkpLiBJZiB3ZSBkbyBzZWUgYSBwcm9ibGVtIHdlIHJlcG9ydCBpdAorICogICAgICB2aWEgYSBwcmludGsgYW5kIGxlYXZlIHRoZSBjb3JyZXNwb25kaW5nIGludGVyZmFjZSBhbmQgYWxsIHRoYXQgZm9sbG93CisgKiAgICAgIGRpc2FibGVkLgorICovCitzdGF0aWMgY2hhciAqdHlwZV9zdHJpbmdzW10gX19kZXZpbml0ZGF0YSA9IHsKKwkibm8gaGFyZHdhcmUiLAkJLyogU2hvdWxkIG5ldmVyIGJlIHNlZW4gKi8KKwkiRmFyU3luYyBUMlAiLAorCSJGYXJTeW5jIFQ0UCIsCisJIkZhclN5bmMgVDFVIiwKKwkiRmFyU3luYyBUMlUiLAorCSJGYXJTeW5jIFQ0VSIsCisJIkZhclN5bmMgVEUxIgorfTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0Citmc3RfaW5pdF9jYXJkKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQoreworCWludCBpOworCWludCBlcnI7CisKKwkvKiBXZSdyZSB3b3JraW5nIG9uIGEgbnVtYmVyIG9mIHBvcnRzIGJhc2VkIG9uIHRoZSBjYXJkIElELiBJZiB0aGUKKwkgKiBmaXJtd2FyZSBkZXRlY3RzIHNvbWV0aGluZyBkaWZmZXJlbnQgbGF0ZXIgKHNob3VsZCBuZXZlciBoYXBwZW4pCisJICogd2UnbGwgaGF2ZSB0byByZXZpc2UgaXQgaW4gc29tZSB3YXkgdGhlbi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnBvcnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBlcnIgPSByZWdpc3Rlcl9oZGxjX2RldmljZShjYXJkLT5wb3J0c1tpXS5kZXYpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKSB7CisJCQlpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50a19lcnIgKCJDYW5ub3QgcmVnaXN0ZXIgSERMQyBkZXZpY2UgZm9yIHBvcnQgJWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIChlcnJubyAlZClcbiIsIGksIC1lcnIgKTsKKwkJCWZvciAoaiA9IGk7IGogPCBjYXJkLT5ucG9ydHM7IGorKykgeworCQkJCWZyZWVfbmV0ZGV2KGNhcmQtPnBvcnRzW2pdLmRldik7CisJCQkJY2FyZC0+cG9ydHNbal0uZGV2ID0gTlVMTDsKKwkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPm5wb3J0cyA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisJfQorCisJcHJpbnRrX2luZm8oIiVzLSVzOiAlcyBJUlElZCwgJWQgcG9ydHNcbiIsCisJICAgICAgIHBvcnRfdG9fZGV2KCZjYXJkLT5wb3J0c1swXSktPm5hbWUsCisJICAgICAgIHBvcnRfdG9fZGV2KCZjYXJkLT5wb3J0c1tjYXJkLT5ucG9ydHMgLSAxXSktPm5hbWUsCisJICAgICAgIHR5cGVfc3RyaW5nc1tjYXJkLT50eXBlXSwgY2FyZC0+aXJxLCBjYXJkLT5ucG9ydHMpOworfQorCisvKgorICogICAgICBJbml0aWFsaXNlIGNhcmQgd2hlbiBkZXRlY3RlZC4KKyAqICAgICAgUmV0dXJucyAwIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG9yIGVycm5vIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQKK2ZzdF9hZGRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgZmlyc3R0aW1lX2RvbmUgPSAwOworCXN0YXRpYyBpbnQgbm9fb2ZfY2FyZHNfYWRkZWQgPSAwOworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCWludCBlcnIgPSAwOworCWludCBpOworCisJaWYgKCFmaXJzdHRpbWVfZG9uZSkgeworCQlwcmludGtfaW5mbygiRmFyU3luYyBXQU4gZHJpdmVyICIgRlNUX1VTRVJfVkVSU0lPTgorCQkgICAgICAgIiAoYykgMjAwMS0yMDA0IEZhclNpdGUgQ29tbXVuaWNhdGlvbnMgTHRkLlxuIik7CisJCWZpcnN0dGltZV9kb25lID0gMTsKKwkJZGJnKERCR19BU1MsICJUaGUgdmFsdWUgb2YgZGVidWcgbWFzayBpcyAleFxuIiwgZnN0X2RlYnVnX21hc2spOworCX0KKworCS8qCisJICogV2UgYXJlIGdvaW5nIHRvIGJlIGNsZXZlciBhbmQgYWxsb3cgY2VydGFpbiBjYXJkcyBub3QgdG8gYmUKKwkgKiBjb25maWd1cmVkLiAgQW4gZXhjbHVkZSBsaXN0IGNhbiBiZSBwcm92aWRlZCBpbiAvZXRjL21vZHVsZXMuY29uZgorCSAqLworCWlmIChmc3RfZXhjbHVkZWRfY2FyZHMgIT0gMCkgeworCQkvKgorCQkgKiBUaGVyZSBhcmUgY2FyZHMgdG8gZXhjbHVkZQorCQkgKgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IGZzdF9leGNsdWRlZF9jYXJkczsgaSsrKSB7CisJCQlpZiAoKHBkZXYtPmRldmZuKSA+PiAzID09IGZzdF9leGNsdWRlZF9saXN0W2ldKSB7CisJCQkJcHJpbnRrX2luZm8oIkZhclN5bmMgUENJIGRldmljZSAlZCBub3QgYXNzaWduZWRcbiIsCisJCQkJICAgICAgIChwZGV2LT5kZXZmbikgPj4gMyk7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJfQorCX0KKworCS8qIEFsbG9jYXRlIGRyaXZlciBwcml2YXRlIGRhdGEgKi8KKwljYXJkID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBmc3RfY2FyZF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcmQgPT0gTlVMTCkgeworCQlwcmludGtfZXJyKCJGYXJTeW5jIGNhcmQgZm91bmQgYnV0IGluc3VmZmljaWVudCBtZW1vcnkgZm9yIgorCQkJICAgIiBkcml2ZXIgc3RvcmFnZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mIChzdHJ1Y3QgZnN0X2NhcmRfaW5mbykpOworCisJLyogVHJ5IHRvIGVuYWJsZSB0aGUgZGV2aWNlICovCisJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgIT0gMCkgeworCQlwcmludGtfZXJyKCJGYWlsZWQgdG8gZW5hYmxlIGNhcmQuIEVyciAlZFxuIiwgLWVycik7CisJCWtmcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiRmFyU3luYyIpKSAhPTApIHsKKwkgICAgICAgIHByaW50a19lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdpb25zLiBFcnIgJWRcbiIsIC1lcnIpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCWtmcmVlKGNhcmQpOworCSAgICAgICAgcmV0dXJuIGVycjsKKwl9CisKKwkvKiBHZXQgdmlydHVhbCBhZGRyZXNzZXMgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KKwljYXJkLT5wY2lfY29uZiA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwljYXJkLT5waHlzX21lbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwljYXJkLT5waHlzX2N0bG1lbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKKwlpZiAoKGNhcmQtPm1lbSA9IGlvcmVtYXAoY2FyZC0+cGh5c19tZW0sIEZTVF9NRU1TSVpFKSkgPT0gTlVMTCkgeworCQlwcmludGtfZXJyKCJQaHlzaWNhbCBtZW1vcnkgcmVtYXAgZmFpbGVkXG4iKTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlrZnJlZShjYXJkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICgoY2FyZC0+Y3RsbWVtID0gaW9yZW1hcChjYXJkLT5waHlzX2N0bG1lbSwgMHgxMCkpID09IE5VTEwpIHsKKwkJcHJpbnRrX2VycigiQ29udHJvbCBtZW1vcnkgcmVtYXAgZmFpbGVkXG4iKTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlrZnJlZShjYXJkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWRiZyhEQkdfUENJLCAia2VybmVsIG1lbSAlcCwgY3RsbWVtICVwXG4iLCBjYXJkLT5tZW0sIGNhcmQtPmN0bG1lbSk7CisKKwkvKiBSZWdpc3RlciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlpZiAocmVxdWVzdF9pcnEocGRldi0+aXJxLCBmc3RfaW50ciwgU0FfU0hJUlEsIEZTVF9ERVZfTkFNRSwgY2FyZCkpIHsKKwkJcHJpbnRrX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIGludGVycnVwdCAlZFxuIiwgY2FyZC0+aXJxKTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlpb3VubWFwKGNhcmQtPmN0bG1lbSk7CisJCWlvdW5tYXAoY2FyZC0+bWVtKTsKKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFJlY29yZCBpbmZvIHdlIG5lZWQgKi8KKwljYXJkLT5pcnEgPSBwZGV2LT5pcnE7CisJY2FyZC0+dHlwZSA9IGVudC0+ZHJpdmVyX2RhdGE7CisJY2FyZC0+ZmFtaWx5ID0gKChlbnQtPmRyaXZlcl9kYXRhID09IEZTVF9UWVBFX1QyUCkgfHwKKwkJCShlbnQtPmRyaXZlcl9kYXRhID09IEZTVF9UWVBFX1Q0UCkpCisJICAgID8gRlNUX0ZBTUlMWV9UWFAgOiBGU1RfRkFNSUxZX1RYVTsKKwlpZiAoKGVudC0+ZHJpdmVyX2RhdGEgPT0gRlNUX1RZUEVfVDFVKSB8fAorCSAgICAoZW50LT5kcml2ZXJfZGF0YSA9PSBGU1RfVFlQRV9URTEpKQorCQljYXJkLT5ucG9ydHMgPSAxOworCWVsc2UKKwkJY2FyZC0+bnBvcnRzID0gKChlbnQtPmRyaXZlcl9kYXRhID09IEZTVF9UWVBFX1QyUCkgfHwKKwkJCQkoZW50LT5kcml2ZXJfZGF0YSA9PSBGU1RfVFlQRV9UMlUpKSA/IDIgOiA0OworCisJY2FyZC0+c3RhdGUgPSBGU1RfVU5JTklUOworICAgICAgICBzcGluX2xvY2tfaW5pdCAoICZjYXJkLT5jYXJkX2xvY2sgKTsKKworICAgICAgICBmb3IgKCBpID0gMCA7IGkgPCBjYXJkLT5ucG9ydHMgOyBpKysgKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19oZGxjZGV2KCZjYXJkLT5wb3J0c1tpXSk7CisJCWhkbGNfZGV2aWNlICpoZGxjOworCQlpZiAoIWRldikgeworCQkJd2hpbGUgKGktLSkKKwkJCQlmcmVlX25ldGRldihjYXJkLT5wb3J0c1tpXS5kZXYpOworCQkJcHJpbnRrX2VyciAoIkZhclN5bmM6IG91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICBpb3VubWFwKGNhcmQtPmN0bG1lbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpb3VubWFwKGNhcmQtPm1lbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShjYXJkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworCQl9CisJCWNhcmQtPnBvcnRzW2ldLmRldiAgICA9IGRldjsKKyAgICAgICAgICAgICAgICBjYXJkLT5wb3J0c1tpXS5jYXJkICAgPSBjYXJkOworICAgICAgICAgICAgICAgIGNhcmQtPnBvcnRzW2ldLmluZGV4ICA9IGk7CisgICAgICAgICAgICAgICAgY2FyZC0+cG9ydHNbaV0ucnVuICAgID0gMDsKKworCQloZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKworICAgICAgICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIG5ldCBkZXZpY2UgaW5mbyAqLworCQkvKiBTaW5jZSB0aGlzIGlzIGEgUENJIHNldHVwIHRoaXMgaXMgcHVyZWx5CisJCSAqIGluZm9ybWF0aW9uYWwuIEdpdmUgdGhlbSB0aGUgYnVmZmVyIGFkZHJlc3NlcworCQkgKiBhbmQgYmFzaWMgY2FyZCBJL08uCisJCSAqLworICAgICAgICAgICAgICAgIGRldi0+bWVtX3N0YXJ0ICAgPSBjYXJkLT5waHlzX21lbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBCVUZfT0ZGU0VUICggdHhCdWZmZXJbaV1bMF1bMF0pOworICAgICAgICAgICAgICAgIGRldi0+bWVtX2VuZCAgICAgPSBjYXJkLT5waHlzX21lbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBCVUZfT0ZGU0VUICggdHhCdWZmZXJbaV1bTlVNX1RYX0JVRkZFUl1bMF0pOworICAgICAgICAgICAgICAgIGRldi0+YmFzZV9hZGRyICAgPSBjYXJkLT5wY2lfY29uZjsKKyAgICAgICAgICAgICAgICBkZXYtPmlycSAgICAgICAgID0gY2FyZC0+aXJxOworCisgICAgICAgICAgICAgICAgZGV2LT50eF9xdWV1ZV9sZW4gICAgICAgICAgPSBGU1RfVFhfUVVFVUVfTEVOOworICAgICAgICAgICAgICAgIGRldi0+b3BlbiAgICAgICAgICAgICAgICAgID0gZnN0X29wZW47CisgICAgICAgICAgICAgICAgZGV2LT5zdG9wICAgICAgICAgICAgICAgICAgPSBmc3RfY2xvc2U7CisgICAgICAgICAgICAgICAgZGV2LT5kb19pb2N0bCAgICAgICAgICAgICAgPSBmc3RfaW9jdGw7CisgICAgICAgICAgICAgICAgZGV2LT53YXRjaGRvZ190aW1lbyAgICAgICAgPSBGU1RfVFhfVElNRU9VVDsKKyAgICAgICAgICAgICAgICBkZXYtPnR4X3RpbWVvdXQgICAgICAgICAgICA9IGZzdF90eF90aW1lb3V0OworICAgICAgICAgICAgICAgIGhkbGMtPmF0dGFjaCA9IGZzdF9hdHRhY2g7CisgICAgICAgICAgICAgICAgaGRsYy0+eG1pdCAgID0gZnN0X3N0YXJ0X3htaXQ7CisJfQorCisJY2FyZC0+ZGV2aWNlID0gcGRldjsKKworCWRiZyhEQkdfUENJLCAidHlwZSAlZCBucG9ydHMgJWQgaXJxICVkXG4iLCBjYXJkLT50eXBlLAorCSAgICBjYXJkLT5ucG9ydHMsIGNhcmQtPmlycSk7CisJZGJnKERCR19QQ0ksICJjb25mICUwNHggbWVtICUwOHggY3RsbWVtICUwOHhcbiIsCisJICAgIGNhcmQtPnBjaV9jb25mLCBjYXJkLT5waHlzX21lbSwgY2FyZC0+cGh5c19jdGxtZW0pOworCisJLyogUmVzZXQgdGhlIGNhcmQncyBwcm9jZXNzb3IgKi8KKwlmc3RfY3B1cmVzZXQoY2FyZCk7CisJY2FyZC0+c3RhdGUgPSBGU1RfUkVTRVQ7CisKKwkvKiBJbml0aWFsaXNlIERNQSAoaWYgcmVxdWlyZWQpICovCisJZnN0X2luaXRfZG1hKGNhcmQpOworCisJLyogUmVjb3JkIGRyaXZlciBkYXRhIGZvciBsYXRlciB1c2UgKi8KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CisKKwkvKiBSZW1haW5kZXIgb2YgY2FyZCBzZXR1cCAqLworCWZzdF9jYXJkX2FycmF5W25vX29mX2NhcmRzX2FkZGVkXSA9IGNhcmQ7CisJY2FyZC0+Y2FyZF9ubyA9IG5vX29mX2NhcmRzX2FkZGVkKys7CS8qIFJlY29yZCBpbnN0YW5jZSBhbmQgYnVtcCBpdCAqLworCWZzdF9pbml0X2NhcmQoY2FyZCk7CisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQkvKgorCQkgKiBBbGxvY2F0ZSBhIGRtYSBidWZmZXIgZm9yIHRyYW5zbWl0IGFuZCByZWNlaXZlcworCQkgKi8KKwkJY2FyZC0+cnhfZG1hX2hhbmRsZV9ob3N0ID0KKwkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPmRldmljZSwgRlNUX01BWF9NVFUsCisJCQkJCSAmY2FyZC0+cnhfZG1hX2hhbmRsZV9jYXJkKTsKKwkJaWYgKGNhcmQtPnJ4X2RtYV9oYW5kbGVfaG9zdCA9PSBOVUxMKSB7CisJCQlwcmludGtfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgcnggZG1hIGJ1ZmZlclxuIik7CisJCQlmc3RfZGlzYWJsZV9pbnRyKGNhcmQpOworCQkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJCWlvdW5tYXAoY2FyZC0+Y3RsbWVtKTsKKwkJCWlvdW5tYXAoY2FyZC0+bWVtKTsKKwkJCWtmcmVlKGNhcmQpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJY2FyZC0+dHhfZG1hX2hhbmRsZV9ob3N0ID0KKwkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPmRldmljZSwgRlNUX01BWF9NVFUsCisJCQkJCSAmY2FyZC0+dHhfZG1hX2hhbmRsZV9jYXJkKTsKKwkJaWYgKGNhcmQtPnR4X2RtYV9oYW5kbGVfaG9zdCA9PSBOVUxMKSB7CisJCQlwcmludGtfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgdHggZG1hIGJ1ZmZlclxuIik7CisJCQlmc3RfZGlzYWJsZV9pbnRyKGNhcmQpOworCQkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJCWlvdW5tYXAoY2FyZC0+Y3RsbWVtKTsKKwkJCWlvdW5tYXAoY2FyZC0+bWVtKTsKKwkJCWtmcmVlKGNhcmQpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJcmV0dXJuIDA7CQkvKiBTdWNjZXNzICovCit9CisKKy8qCisgKiAgICAgIENsZWFudXAgYW5kIGNsb3NlIGRvd24gYSBjYXJkCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorZnN0X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisJaW50IGk7CisKKwljYXJkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJZm9yIChpID0gMDsgaSA8IGNhcmQtPm5wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0X3RvX2RldigmY2FyZC0+cG9ydHNbaV0pOworCQl1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldik7CisJfQorCisJZnN0X2Rpc2FibGVfaW50cihjYXJkKTsKKwlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworCisJaW91bm1hcChjYXJkLT5jdGxtZW0pOworCWlvdW5tYXAoY2FyZC0+bWVtKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9UWFUpIHsKKwkJLyoKKwkJICogRnJlZSBkbWEgYnVmZmVycworCQkgKi8KKwkJcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5kZXZpY2UsIEZTVF9NQVhfTVRVLAorCQkJCSAgICBjYXJkLT5yeF9kbWFfaGFuZGxlX2hvc3QsCisJCQkJICAgIGNhcmQtPnJ4X2RtYV9oYW5kbGVfY2FyZCk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+ZGV2aWNlLCBGU1RfTUFYX01UVSwKKwkJCQkgICAgY2FyZC0+dHhfZG1hX2hhbmRsZV9ob3N0LAorCQkJCSAgICBjYXJkLT50eF9kbWFfaGFuZGxlX2NhcmQpOworCX0KKwlmc3RfY2FyZF9hcnJheVtjYXJkLT5jYXJkX25vXSA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBmc3RfZHJpdmVyID0geworICAgICAgICAubmFtZQkJPSBGU1RfTkFNRSwKKyAgICAgICAgLmlkX3RhYmxlCT0gZnN0X3BjaV9kZXZfaWQsCisgICAgICAgIC5wcm9iZQkJPSBmc3RfYWRkX29uZSwKKyAgICAgICAgLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGZzdF9yZW1vdmVfb25lKSwKKyAgICAgICAgLnN1c3BlbmQJPSBOVUxMLAorICAgICAgICAucmVzdW1lCT0gTlVMTCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0Citmc3RfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEZTVF9NQVhfQ0FSRFM7IGkrKykKKwkJZnN0X2NhcmRfYXJyYXlbaV0gPSBOVUxMOworCXNwaW5fbG9ja19pbml0KCZmc3Rfd29ya19xX2xvY2spOworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmZzdF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2ZzdF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXByaW50a19pbmZvKCJGYXJTeW5jIFdBTiBkcml2ZXIgdW5sb2FkaW5nXG4iKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmZzdF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChmc3RfaW5pdCk7Cittb2R1bGVfZXhpdChmc3RfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuaCBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3MWRhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmgKQEAgLTAsMCArMSwzNTcgQEAKKy8qCisgKiAgICAgIEZhclN5bmMgWDIxIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiAgICAgIEFjdHVhbGx5IHN5bmMgZHJpdmVyIGZvciBYLjIxLCBWLjM1IGFuZCBWLjI0IG9uIEZhclN5bmMgVC1zZXJpZXMgY2FyZHMKKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwMSBGYXJTaXRlIENvbW11bmljYXRpb25zIEx0ZC4KKyAqICAgICAgd3d3LmZhcnNpdGUuY28udWsKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBBdXRob3I6IFIuSi5EdW5sb3AgICAgICA8Ym9iLmR1bmxvcEBmYXJzaXRlLmNvLnVrPgorICoKKyAqICAgICAgRm9yIHRoZSBtb3N0IHBhcnQgdGhpcyBmaWxlIG9ubHkgY29udGFpbnMgc3RydWN0dXJlcyBhbmQgaW5mb3JtYXRpb24KKyAqICAgICAgdGhhdCBpcyB2aXNpYmxlIHRvIGFwcGxpY2F0aW9ucyBvdXRzaWRlIHRoZSBkcml2ZXIuIFNoYXJlZCBtZW1vcnkKKyAqICAgICAgbGF5b3V0IGV0YyBpcyBpbnRlcm5hbCB0byB0aGUgZHJpdmVyIGFuZCBkZXNjcmliZWQgd2l0aGluIGZhcnN5bmMuYy4KKyAqICAgICAgT3ZlcmxhcCBleGlzdHMgaW4gdGhhdCB0aGUgdmFsdWVzIHVzZWQgZm9yIHNvbWUgZmllbGRzIHdpdGhpbiB0aGUKKyAqICAgICAgaW9jdGwgaW50ZXJmYWNlIGV4dGVuZCBpbnRvIHRoZSBjYXJkcyBmaXJtd2FyZSBpbnRlcmZhY2Ugc28gdmFsdWVzIGluCisgKiAgICAgIHRoaXMgZmlsZSBtYXkgbm90IGJlIGNoYW5nZWQgYXJiaXRyYXJpbHkuCisgKi8KKworLyogICAgICBXaGF0J3MgaW4gYSBuYW1lCisgKgorICogICAgICBUaGUgcHJvamVjdCBuYW1lIGZvciB0aGlzIGRyaXZlciBpcyBPc2Nhci4gVGhlIGRyaXZlciBpcyBpbnRlbmRlZCB0byBiZQorICogICAgICB1c2VkIHdpdGggdGhlIEZhclNpdGUgVC1TZXJpZXMgY2FyZHMgKFQyUCAmIFQ0UCkgcnVubmluZyBpbiB0aGUgaGlnaAorICogICAgICBzcGVlZCBmcmFtZSBzaGlmdGVyIG1vZGUuIFRoaXMgaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIFguMjEgbW9kZQorICogICAgICB3aGljaCBpcyBhIGNvbXBsZXRlIG1pc25vbWVyIGFzIHRoZSBjYXJkIGNvbnRpbnVlcyB0byBzdXBwb3J0IFYuMjQgYW5kCisgKiAgICAgIFYuMzUgYXMgd2VsbCBhcyBYLjIxLgorICoKKyAqICAgICAgQSBzaG9ydCBjb21tb24gcHJlZml4IGlzIHVzZWZ1bCBmb3Igcm91dGluZXMgd2l0aGluIHRoZSBkcml2ZXIgdG8gYXZvaWQKKyAqICAgICAgY29uZmxpY3Qgd2l0aCBvdGhlciBzaW1pbGFyIGRyaXZlcnMgYW5kIEkgY2hvc2VuIHRvIHVzZSAiZnN0XyIgZm9yIHRoaXMKKyAqICAgICAgcHVycG9zZSAoRmFyU2l0ZSBULXNlcmllcykuCisgKgorICogICAgICBGaW5hbGx5IHRoZSBkZXZpY2UgZHJpdmVyIG5lZWRzIGEgc2hvcnQgbmV0d29yayBpbnRlcmZhY2UgbmFtZS4gU2luY2UKKyAqICAgICAgImhkbGMiIGlzIGFscmVhZHkgaW4gdXNlIEkndmUgY2hvc2VuIHRoZSBldmVuIGxlc3MgaW5mb3JtYXRpdmUgInN5bmMiCisgKiAgICAgIGZvciB0aGUgcHJlc2VudC4KKyAqLworI2RlZmluZSBGU1RfTkFNRSAgICAgICAgICAgICAgICAiZnN0IiAgICAgICAgICAgLyogSW4gZGVidWcvaW5mbyBldGMgKi8KKyNkZWZpbmUgRlNUX05ERVZfTkFNRSAgICAgICAgICAgInN5bmMiICAgICAgICAgIC8qIEZvciBuZXQgaW50ZXJmYWNlICovCisjZGVmaW5lIEZTVF9ERVZfTkFNRSAgICAgICAgICAgICJmYXJzeW5jIiAgICAgICAvKiBGb3IgbWlzYyBpbnRlcmZhY2VzICovCisKKworLyogICAgICBVc2VyIHZlcnNpb24gbnVtYmVyCisgKgorICogICAgICBUaGlzIHZlcnNpb24gbnVtYmVyIGlzIGluY3JlbWVudGVkIHdpdGggZWFjaCBvZmZpY2lhbCByZWxlYXNlIG9mIHRoZQorICogICAgICBwYWNrYWdlIGFuZCBpcyBhIHNpbXBsaWZpZWQgbnVtYmVyIGZvciBub3JtYWwgdXNlciByZWZlcmVuY2UuCisgKiAgICAgIEluZGl2aWR1YWwgZmlsZXMgYXJlIHRyYWNrZWQgYnkgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gYW5kIG1heQorICogICAgICBoYXZlIGluZGl2aWR1YWwgdmVyc2lvbnMgKG9yIElEcykgdGhhdCBtb3ZlIG11Y2ggZmFzdGVyIHRoYW4gdGhlCisgKiAgICAgIHRoZSByZWxlYXNlIHZlcnNpb24gYXMgaW5kaXZpZHVhbCB1cGRhdGVzIGFyZSB0cmFja2VkLgorICovCisjZGVmaW5lIEZTVF9VU0VSX1ZFUlNJT04gICAgICAgICIxLjA0IgorCisKKy8qICAgICAgSW9jdGwgY2FsbCBjb21tYW5kIHZhbHVlcworICoKKyAqICAgICAgVGhlIGZpcnN0IHRocmVlIHByaXZhdGUgaW9jdGxzIGFyZSB1c2VkIGJ5IHRoZSBzeW5jLVBQUCBtb2R1bGUsCisgKiAgICAgIGFsbG93aW5nIGEgbGl0dGxlIHJvb20gZm9yIGV4cGFuc2lvbiB3ZSBzdGFydCBvdXIgbnVtYmVyaW5nIGF0IDEwLgorICovCisjZGVmaW5lIEZTVFdSSVRFICAgICAgICAoU0lPQ0RFVlBSSVZBVEUrMTApCisjZGVmaW5lIEZTVENQVVJFU0VUICAgICAoU0lPQ0RFVlBSSVZBVEUrMTEpCisjZGVmaW5lIEZTVENQVVJFTEVBU0UgICAoU0lPQ0RFVlBSSVZBVEUrMTIpCisjZGVmaW5lIEZTVEdFVENPTkYgICAgICAoU0lPQ0RFVlBSSVZBVEUrMTMpCisjZGVmaW5lIEZTVFNFVENPTkYgICAgICAoU0lPQ0RFVlBSSVZBVEUrMTQpCisKKworLyogICAgICBGU1RXUklURQorICoKKyAqICAgICAgVXNlZCB0byB3cml0ZSBhIGJsb2NrIG9mIGRhdGEgKGZpcm13YXJlIGV0YykgYmVmb3JlIHRoZSBjYXJkIGlzIHJ1bm5pbmcKKyAqLworc3RydWN0IGZzdGlvY193cml0ZSB7CisgICAgICAgIHVuc2lnbmVkIGludCAgc2l6ZTsKKyAgICAgICAgdW5zaWduZWQgaW50ICBvZmZzZXQ7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgZGF0YVswXTsKK307CisKKworLyogICAgICBGU1RDUFVSRVNFVCBhbmQgRlNUQ1BVUkVMRUFTRQorICoKKyAqICAgICAgVGhlc2UgdGFrZSBubyBhZGRpdGlvbmFsIGRhdGEuCisgKiAgICAgIEZTVENQVVJFU0VUIGZvcmNlcyB0aGUgY2FyZHMgQ1BVIGludG8gYSByZXNldCBzdGF0ZSBhbmQgaG9sZHMgaXQgdGhlcmUuCisgKiAgICAgIEZTVENQVVJFTEVBU0UgcmVsZWFzZXMgdGhlIENQVSBmcm9tIHRoaXMgcmVzZXQgc3RhdGUgYWxsb3dpbmcgaXQgdG8gcnVuLAorICogICAgICB0aGUgcmVzZXQgdmVjdG9yIHNob3VsZCBiZSBzZXR1cCBiZWZvcmUgdGhpcyBpb2N0bCBpcyBydW4uCisgKi8KKworLyogICAgICBGU1RHRVRDT05GIGFuZCBGU1RTRVRDT05GCisgKgorICogICAgICBHZXQgYW5kIHNldCBhIGNhcmQvcG9ydHMgY29uZmlndXJhdGlvbi4KKyAqICAgICAgSW4gb3JkZXIgdG8gYWxsb3cgc2VsZWN0aXZlIHNldHRpbmcgb2YgaXRlbXMgYW5kIGZvciB0aGUga2VybmVsIHRvCisgKiAgICAgIGluZGljYXRlIGEgcGFydGlhbCBzdGF0dXMgcmVzcG9uc2UgdGhlIGZpcnN0IGZpZWxkICJ2YWxpZCIgaXMgYSBiaXRtYXNrCisgKiAgICAgIGluZGljYXRpbmcgd2hpY2ggb3RoZXIgZmllbGRzIGluIHRoZSBzdHJ1Y3R1cmUgYXJlIHZhbGlkLgorICogICAgICBNYW55IG9mIHRoZSBmaWVsZCBuYW1lcyBpbiB0aGlzIHN0cnVjdHVyZSBtYXRjaCB0aG9zZSB1c2VkIGluIHRoZQorICogICAgICBmaXJtd2FyZSBzaGFyZWQgbWVtb3J5IGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGFuZCBjb21lIG9yaWdpbmFsbHkgZnJvbQorICogICAgICB0aGUgTlQgaGVhZGVyIGZpbGUgU21jLmgKKyAqCisgKiAgICAgIFdoZW4gdXNlZCB3aXRoIEZTVEdFVENPTkYgdGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHplcm9lZCBiZWZvcmUgdXNlLgorICogICAgICBUaGlzIGlzIHRvIGFsbG93IGZvciBwb3NzaWJsZSBmdXR1cmUgZXhwYW5zaW9uIHdoZW4gc29tZSBvZiB0aGUgZmllbGRzCisgKiAgICAgIG1pZ2h0IGJlIHVzZWQgdG8gaW5kaWNhdGUgYSBkaWZmZXJlbnQgKGV4cGFuZGVkKSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBmc3Rpb2NfaW5mbyB7CisgICAgICAgIHVuc2lnbmVkIGludCAgIHZhbGlkOyAgICAgICAgICAgLyogQml0cyBvZiBzdHJ1Y3R1cmUgdGhhdCBhcmUgdmFsaWQgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgbnBvcnRzOyAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2VyaWFsIHBvcnRzICovCisgICAgICAgIHVuc2lnbmVkIGludCAgIHR5cGU7ICAgICAgICAgICAgLyogVHlwZSBpbmRleCBvZiBjYXJkICovCisgICAgICAgIHVuc2lnbmVkIGludCAgIHN0YXRlOyAgICAgICAgICAgLyogU3RhdGUgb2YgY2FyZCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICBpbmRleDsgICAgICAgICAgIC8qIEluZGV4IG9mIHBvcnQgaW9jdGwgd2FzIGlzc3VlZCBvbiAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICBzbWNGaXJtd2FyZVZlcnNpb247CisgICAgICAgIHVuc2lnbmVkIGxvbmcgIGtlcm5lbFZlcnNpb247ICAgLyogV2hhdCBLZXJuZWwgdmVyc2lvbiB3ZSBhcmUgd29ya2luZyB3aXRoICovCisgICAgICAgIHVuc2lnbmVkIHNob3J0IGxpbmVJbnRlcmZhY2U7ICAgLyogUGh5c2ljYWwgaW50ZXJmYWNlIHR5cGUgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgcHJvdG87ICAgICAgICAgICAvKiBMaW5lIHByb3RvY29sICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgIGludGVybmFsQ2xvY2s7ICAgLyogMSA9PiBpbnRlcm5hbCBjbG9jaywgMCA9PiBleHRlcm5hbCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICBsaW5lU3BlZWQ7ICAgICAgIC8qIFNwZWVkIGluIGJwcyAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICB2MjRJcFN0czsgICAgICAgIC8qIFYuMjQgY29udHJvbCBpbnB1dCBzdGF0dXMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgdjI0T3BTdHM7ICAgICAgICAvKiBWLjI0IGNvbnRyb2wgb3V0cHV0IHN0YXR1cyAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBjbG9ja1N0YXR1czsgICAgIC8qIGxzYjogMD0+IHByZXNlbnQsIDE9PiBhYnNlbnQgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgY2FibGVTdGF0dXM7ICAgICAvKiBsc2I6IDA9PiBwcmVzZW50LCAxPT4gYWJzZW50ICovCisgICAgICAgIHVuc2lnbmVkIHNob3J0IGNhcmRNb2RlOyAgICAgICAgLyogbHNiOiBMRUQgaWQgbW9kZSAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZWJ1ZzsgICAgICAgICAgIC8qIERlYnVnIGZsYWdzICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgIHRyYW5zcGFyZW50TW9kZTsgLyogTm90IHVzZWQgYWx3YXlzIDAgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgaW52ZXJ0Q2xvY2s7ICAgICAvKiBJbnZlcnQgY2xvY2sgZmVhdHVyZSBmb3Igc3luY2luZyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBzdGFydGluZ1Nsb3Q7ICAgIC8qIFRpbWUgc2xvdCB0byB1c2UgZm9yIHN0YXJ0IG9mIHR4ICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgIGNsb2NrU291cmNlOyAgICAgLyogRXh0ZXJuYWwgb3IgaW50ZXJuYWwgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgZnJhbWluZzsgICAgICAgICAvKiBFMSwgVDEgb3IgSjEgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgc3RydWN0dXJlOyAgICAgICAvKiB1bmZyYW1lZCwgZG91YmxlLCBjcmM0LCBmNCwgZjEyLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGYyNCBmNzIgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgaW50ZXJmYWNlOyAgICAgICAvKiByajQ4YyBvciBibmMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgY29kaW5nOyAgICAgICAgICAvKiBoZGIzIGI4enMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgbGluZUJ1aWxkT3V0OyAgICAvKiAwLCAtNy41LCAtMTUsIC0yMiAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBlcXVhbGl6ZXI7ICAgICAgIC8qIHNob3J0IG9yIGxvbiBoYXVsIHNldHRpbmdzICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgIGxvb3BNb2RlOyAgICAgICAgLyogdmFyaW91cyBsb29wYmFja3MgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgcmFuZ2U7ICAgICAgICAgICAvKiBjYWJsZSBsZW5ndGhzICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgIHR4QnVmZmVyTW9kZTsgICAgLyogdHggZWxhc3RpYyBidWZmZXIgZGVwdGggKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgcnhCdWZmZXJNb2RlOyAgICAvKiByeCBlbGFzdGljIGJ1ZmZlciBkZXB0aCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBsb3NUaHJlc2hvbGQ7ICAgIC8qIEF0dGVudWF0aW9uIG9uIExPUyBzaWduYWwgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgaWRsZUNvZGU7ICAgICAgICAvKiBWYWx1ZSB0byBzZW5kIGFzIGlkbGUgdGltZXNsb3QgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgcmVjZWl2ZUJ1ZmZlckRlbGF5OyAvKiBkZWxheSB0aHJvIHJ4IGJ1ZmZlciB0aW1lc2xvdHMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgZnJhbWluZ0Vycm9yQ291bnQ7IC8qIGZyYW1pbmcgZXJyb3JzICovCisgICAgICAgIHVuc2lnbmVkIGludCAgIGNvZGVWaW9sYXRpb25Db3VudDsgLyogY29kZSB2aW9sYXRpb25zICovCisgICAgICAgIHVuc2lnbmVkIGludCAgIGNyY0Vycm9yQ291bnQ7ICAgLyogQ1JDIGVycm9ycyAqLworICAgICAgICBpbnQgICAgICAgICAgICBsaW5lQXR0ZW51YXRpb247IC8qIGluIGRCKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbG9zc09mU2lnbmFsOworICAgICAgICB1bnNpZ25lZCBzaG9ydCByZWNlaXZlUmVtb3RlQWxhcm07CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGFsYXJtSW5kaWNhdGlvblNpZ25hbDsKK307CisKKy8qICJ2YWxpZCIgYml0bWFzayAqLworI2RlZmluZSBGU1RWQUxfTk9ORSAgICAgMHgwMDAwMDAwMCAgICAgIC8qIE5vdGhpbmcgdmFsaWQgKGZpcm13YXJlIG5vdCBydW5uaW5nKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTbGlnaHQgbWlzbm9tZXIuIEluIGZhY3QgbnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHR5cGUsIHN0YXRlIGFuZCBpbmRleCB3aWxsIGJlIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJhc2VkIG9uIGhhcmR3YXJlIGRldGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGU1RWQUxfT01PREVNICAgMHgwMDAwMDAxRiAgICAgIC8qIEZpcnN0IDUgYml0cyBjb3JyZXNwb25kIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG91dHB1dCBzdGF0dXMgYml0cyBkZWZpbmVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHYyNE9wU3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZTVFZBTF9TUEVFRCAgICAweDAwMDAwMDIwICAgICAgLyogaW50ZXJuYWxDbG9jaywgbGluZVNwZWVkLCBjbG9ja1N0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGU1RWQUxfQ0FCTEUgICAgMHgwMDAwMDA0MCAgICAgIC8qIGxpbmVJbnRlcmZhY2UsIGNhYmxlU3RhdHVzICovCisjZGVmaW5lIEZTVFZBTF9JTU9ERU0gICAweDAwMDAwMDgwICAgICAgLyogdjI0SXBTdHMgKi8KKyNkZWZpbmUgRlNUVkFMX0NBUkQgICAgIDB4MDAwMDAxMDAgICAgICAvKiBucG9ydHMsIHR5cGUsIHN0YXRlLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzbWNGaXJtd2FyZVZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlNUVkFMX1BST1RPICAgIDB4MDAwMDAyMDAgICAgICAvKiBwcm90byAqLworI2RlZmluZSBGU1RWQUxfTU9ERSAgICAgMHgwMDAwMDQwMCAgICAgIC8qIGNhcmRNb2RlICovCisjZGVmaW5lIEZTVFZBTF9QSEFTRSAgICAweDAwMDAwODAwICAgICAgLyogQ2xvY2sgcGhhc2UgKi8KKyNkZWZpbmUgRlNUVkFMX1RFMSAgICAgIDB4MDAwMDEwMDAgICAgICAvKiBUMUUxIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgRlNUVkFMX0RFQlVHICAgIDB4ODAwMDAwMDAgICAgICAvKiBkZWJ1ZyAqLworI2RlZmluZSBGU1RWQUxfQUxMICAgICAgMHgwMDAwMUZGRiAgICAgIC8qIE5vdGU6IGRvZXMgbm90IGluY2x1ZGUgREVCVUcgZmxhZyAqLworCisvKiAidHlwZSIgKi8KKyNkZWZpbmUgRlNUX1RZUEVfTk9ORSAgIDAgICAgICAgICAgICAgICAvKiBQcm9iYWJseSBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisjZGVmaW5lIEZTVF9UWVBFX1QyUCAgICAxICAgICAgICAgICAgICAgLyogVDJQIFgyMSAyIHBvcnQgY2FyZCAqLworI2RlZmluZSBGU1RfVFlQRV9UNFAgICAgMiAgICAgICAgICAgICAgIC8qIFQ0UCBYMjEgNCBwb3J0IGNhcmQgKi8KKyNkZWZpbmUgRlNUX1RZUEVfVDFVICAgIDMgICAgICAgICAgICAgICAvKiBUMVUgWDIxIDEgcG9ydCBjYXJkICovCisjZGVmaW5lIEZTVF9UWVBFX1QyVSAgICA0ICAgICAgICAgICAgICAgLyogVDJVIFgyMSAyIHBvcnQgY2FyZCAqLworI2RlZmluZSBGU1RfVFlQRV9UNFUgICAgNSAgICAgICAgICAgICAgIC8qIFQ0VSBYMjEgNCBwb3J0IGNhcmQgKi8KKyNkZWZpbmUgRlNUX1RZUEVfVEUxICAgIDYgICAgICAgICAgICAgICAvKiBUMUUxIFgyMSAxIHBvcnQgY2FyZCAqLworCisvKiAiZmFtaWx5IiAqLworI2RlZmluZSBGU1RfRkFNSUxZX1RYUCAgMCAgICAgICAgICAgICAgIC8qIFQyUCBvciBUNFAgKi8KKyNkZWZpbmUgRlNUX0ZBTUlMWV9UWFUgIDEgICAgICAgICAgICAgICAvKiBUMVUgb3IgVDJVIG9yIFQ0VSAqLworCisvKiAic3RhdGUiICovCisjZGVmaW5lIEZTVF9VTklOSVQgICAgICAwICAgICAgICAgICAgICAgLyogUmF3IHVuaW5pdGlhbGlzZWQgc3RhdGUgZm9sbG93aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3lzdGVtIHN0YXJ0dXAgKi8KKyNkZWZpbmUgRlNUX1JFU0VUICAgICAgIDEgICAgICAgICAgICAgICAvKiBQcm9jZXNzb3IgaGVsZCBpbiByZXNldCBzdGF0ZSAqLworI2RlZmluZSBGU1RfRE9XTkxPQUQgICAgMiAgICAgICAgICAgICAgIC8qIENhcmQgYmVpbmcgZG93bmxvYWRlZCAqLworI2RlZmluZSBGU1RfU1RBUlRJTkcgICAgMyAgICAgICAgICAgICAgIC8qIFJlbGVhc2VkIGZvbGxvd2luZyBkb3dubG9hZCAqLworI2RlZmluZSBGU1RfUlVOTklORyAgICAgNCAgICAgICAgICAgICAgIC8qIFByb2Nlc3NvciBydW5uaW5nICovCisjZGVmaW5lIEZTVF9CQURWRVJTSU9OICA1ICAgICAgICAgICAgICAgLyogQmFkIHNoYXJlZCBtZW1vcnkgdmVyc2lvbiBkZXRlY3RlZCAqLworI2RlZmluZSBGU1RfSEFMVEVEICAgICAgNiAgICAgICAgICAgICAgIC8qIFByb2Nlc3NvciBmbGFnZ2VkIGEgaGFsdCAqLworI2RlZmluZSBGU1RfSUZBSUxFRCAgICAgNyAgICAgICAgICAgICAgIC8qIEZpcm13YXJlIGlzc3VlZCBpbml0aWFsaXNhdGlvbiBmYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICJsaW5lSW50ZXJmYWNlIiAqLworI2RlZmluZSBWMjQgICAgICAgICAgICAgMQorI2RlZmluZSBYMjEgICAgICAgICAgICAgMgorI2RlZmluZSBWMzUgICAgICAgICAgICAgMworI2RlZmluZSBYMjFEICAgICAgICAgICAgNAorI2RlZmluZSBUMSAgICAgICAgICAgICAgNQorI2RlZmluZSBFMSAgICAgICAgICAgICAgNgorI2RlZmluZSBKMSAgICAgICAgICAgICAgNworCisvKiAicHJvdG8iICovCisjZGVmaW5lIEZTVF9IRExDICAgICAgICAxICAgICAgICAgICAgICAgLyogQ2lzY28gY29tcGF0aWJsZSBIRExDICovCisjZGVmaW5lIEZTVF9QUFAgICAgICAgICAyICAgICAgICAgICAgICAgLyogU3luYyBQUFAgKi8KKyNkZWZpbmUgRlNUX01PTklUT1IgICAgIDMgICAgICAgICAgICAgICAvKiBNb25pdG9yIG9ubHkgKHJhdyBwYWNrZXQgcmVjZXB0aW9uKSAqLworI2RlZmluZSBGU1RfUkFXICAgICAgICAgNCAgICAgICAgICAgICAgIC8qIFR3byB3YXkgcmF3IHBhY2tldHMgKi8KKyNkZWZpbmUgRlNUX0dFTl9IRExDICAgIDUgICAgICAgICAgICAgICAvKiBVc2luZyAiR2VuZXJpYyBIRExDIiBtb2R1bGUgKi8KKworLyogImludGVybmFsQ2xvY2siICovCisjZGVmaW5lIElOVENMSyAgICAgICAgICAxCisjZGVmaW5lIEVYVENMSyAgICAgICAgICAwCisKKy8qICJ2MjRJcFN0cyIgYml0bWFzayAqLworI2RlZmluZSBJUFNUU19DVFMgICAgICAgMHgwMDAwMDAwMSAgICAgIC8qIENsZWFyIFRvIFNlbmQgKEluZGljYXRlIGZvciBYLjIxKSAqLworI2RlZmluZSBJUFNUU19JTkRJQ0FURSAgSVBTVFNfQ1RTCisjZGVmaW5lIElQU1RTX0RTUiAgICAgICAweDAwMDAwMDAyICAgICAgLyogRGF0YSBTZXQgUmVhZHkgKFQyUCBQb3J0IEEpICovCisjZGVmaW5lIElQU1RTX0RDRCAgICAgICAweDAwMDAwMDA0ICAgICAgLyogRGF0YSBDYXJyaWVyIERldGVjdCAqLworI2RlZmluZSBJUFNUU19SSSAgICAgICAgMHgwMDAwMDAwOCAgICAgIC8qIFJpbmcgSW5kaWNhdG9yIChUMlAgUG9ydCBBKSAqLworI2RlZmluZSBJUFNUU19UTUkgICAgICAgMHgwMDAwMDAxMCAgICAgIC8qIFRlc3QgTW9kZSBJbmRpY2F0b3IgKE5vdCBTdXBwb3J0ZWQpKi8KKworLyogInYyNE9wU3RzIiBiaXRtYXNrICovCisjZGVmaW5lIE9QU1RTX1JUUyAgICAgICAweDAwMDAwMDAxICAgICAgLyogUmVxdWVzdCBUbyBTZW5kIChDb250cm9sIGZvciBYLjIxKSAqLworI2RlZmluZSBPUFNUU19DT05UUk9MICAgT1BTVFNfUlRTCisjZGVmaW5lIE9QU1RTX0RUUiAgICAgICAweDAwMDAwMDAyICAgICAgLyogRGF0YSBUZXJtaW5hbCBSZWFkeSAqLworI2RlZmluZSBPUFNUU19EU1JTICAgICAgMHgwMDAwMDAwNCAgICAgIC8qIERhdGEgU2lnbmFsbGluZyBSYXRlIFNlbGVjdCAoTm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU3VwcG9ydGVkKSAqLworI2RlZmluZSBPUFNUU19TUyAgICAgICAgMHgwMDAwMDAwOCAgICAgIC8qIFNlbGVjdCBTdGFuZGJ5IChOb3QgU3VwcG9ydGVkKSAqLworI2RlZmluZSBPUFNUU19MTCAgICAgICAgMHgwMDAwMDAxMCAgICAgIC8qIE1haW50ZW5hbmNlIFRlc3QgKE5vdCBTdXBwb3J0ZWQpICovCisKKy8qICJjYXJkTW9kZSIgYml0bWFzayAqLworI2RlZmluZSBDQVJEX01PREVfSURFTlRJRlkgICAgICAweDAwMDEKKworLyogCisgKiBDb25zdGFudHMgZm9yIFQxL0UxIGNvbmZpZ3VyYXRpb24KKyAqLworCisvKgorICogQ2xvY2sgc291cmNlCisgKi8KKyNkZWZpbmUgQ0xPQ0tJTkdfU0xBVkUgICAgICAgMAorI2RlZmluZSBDTE9DS0lOR19NQVNURVIgICAgICAxCisKKy8qCisgKiBGcmFtaW5nCisgKi8KKyNkZWZpbmUgRlJBTUlOR19FMSAgICAgICAgICAgMAorI2RlZmluZSBGUkFNSU5HX0oxICAgICAgICAgICAxCisjZGVmaW5lIEZSQU1JTkdfVDEgICAgICAgICAgIDIKKworLyoKKyAqIFN0cnVjdHVyZQorICovCisjZGVmaW5lIFNUUlVDVFVSRV9VTkZSQU1FRCAgIDAKKyNkZWZpbmUgU1RSVUNUVVJFX0UxX0RPVUJMRSAgMQorI2RlZmluZSBTVFJVQ1RVUkVfRTFfQ1JDNCAgICAyCisjZGVmaW5lIFNUUlVDVFVSRV9FMV9DUkM0TSAgIDMKKyNkZWZpbmUgU1RSVUNUVVJFX1QxXzQgICAgICAgNAorI2RlZmluZSBTVFJVQ1RVUkVfVDFfMTIgICAgICA1CisjZGVmaW5lIFNUUlVDVFVSRV9UMV8yNCAgICAgIDYKKyNkZWZpbmUgU1RSVUNUVVJFX1QxXzcyICAgICAgNworCisvKgorICogSW50ZXJmYWNlCisgKi8KKyNkZWZpbmUgSU5URVJGQUNFX1JKNDhDICAgICAgMAorI2RlZmluZSBJTlRFUkZBQ0VfQk5DICAgICAgICAxCisKKy8qCisgKiBDb2RpbmcKKyAqLworCisjZGVmaW5lIENPRElOR19IREIzICAgICAgICAgIDAKKyNkZWZpbmUgQ09ESU5HX05SWiAgICAgICAgICAgMQorI2RlZmluZSBDT0RJTkdfQ01JICAgICAgICAgICAyCisjZGVmaW5lIENPRElOR19DTUlfSERCMyAgICAgIDMKKyNkZWZpbmUgQ09ESU5HX0NNSV9COFpTICAgICAgNAorI2RlZmluZSBDT0RJTkdfQU1JICAgICAgICAgICA1CisjZGVmaW5lIENPRElOR19BTUlfWkNTICAgICAgIDYKKyNkZWZpbmUgQ09ESU5HX0I4WlMgICAgICAgICAgNworCisvKgorICogTGluZSBCdWlsZCBPdXQKKyAqLworI2RlZmluZSBMQk9fMGRCICAgICAgICAgICAgICAwCisjZGVmaW5lIExCT183ZEI1ICAgICAgICAgICAgIDEKKyNkZWZpbmUgTEJPXzE1ZEIgICAgICAgICAgICAgMgorI2RlZmluZSBMQk9fMjJkQjUgICAgICAgICAgICAzCisKKy8qCisgKiBSYW5nZSBmb3IgbG9uZyBoYXVsIHQxID4gNjU1ZnQKKyAqLworI2RlZmluZSBSQU5HRV8wXzEzM19GVCAgICAgICAwCisjZGVmaW5lIFJBTkdFXzBfNDBfTSAgICAgICAgIFJBTkdFXzBfMTMzX0ZUCisjZGVmaW5lIFJBTkdFXzEzM18yNjZfRlQgICAgIDEKKyNkZWZpbmUgUkFOR0VfNDBfODFfTSAgICAgICAgUkFOR0VfMTMzXzI2Nl9GVAorI2RlZmluZSBSQU5HRV8yNjZfMzk5X0ZUICAgICAyCisjZGVmaW5lIFJBTkdFXzgxXzEyMl9NICAgICAgIFJBTkdFXzI2Nl8zOTlfRlQKKyNkZWZpbmUgUkFOR0VfMzk5XzUzM19GVCAgICAgMworI2RlZmluZSBSQU5HRV8xMjJfMTYyX00gICAgICAgUkFOR0VfMzk5XzUzM19GVAorI2RlZmluZSBSQU5HRV81MzNfNjU1X0ZUICAgICA0CisjZGVmaW5lIFJBTkdFXzE2Ml8yMDBfTSAgICAgIFJBTkdFXzUzM182NTVfRlQKKy8qCisgKiBSZWNlaXZlIEVxdWFsaXNlcgorICovCisjZGVmaW5lIEVRVUFMSVpFUl9TSE9SVCAgICAgIDAKKyNkZWZpbmUgRVFVQUxJWkVSX0xPTkcgICAgICAgMQorCisvKgorICogTG9vcCBtb2RlcworICovCisjZGVmaW5lIExPT1BfTk9ORSAgICAgICAgICAgIDAKKyNkZWZpbmUgTE9PUF9MT0NBTCAgICAgICAgICAgMQorI2RlZmluZSBMT09QX1BBWUxPQURfRVhDX1RTMCAyCisjZGVmaW5lIExPT1BfUEFZTE9BRF9JTkNfVFMwIDMKKyNkZWZpbmUgTE9PUF9SRU1PVEUgICAgICAgICAgNAorCisvKgorICogQnVmZmVyIG1vZGVzCisgKi8KKyNkZWZpbmUgQlVGRkVSXzJfRlJBTUUgICAgICAgMAorI2RlZmluZSBCVUZGRVJfMV9GUkFNRSAgICAgICAxCisjZGVmaW5lIEJVRkZFUl85Nl9CSVQgICAgICAgIDIKKyNkZWZpbmUgQlVGRkVSX05PTkUgICAgICAgICAgMworCisvKiAgICAgIERlYnVnIHN1cHBvcnQKKyAqCisgKiAgICAgIFRoZXNlIHNob3VsZCBvbmx5IGJlIGVuYWJsZWQgZm9yIGRldmVsb3BtZW50IGtlcm5lbHMsIHByb2R1Y3Rpb24gY29kZQorICogICAgICBzaG91bGQgZGVmaW5lIEZTVF9ERUJVRz0wIGluIG9yZGVyIHRvIGV4Y2x1ZGUgdGhlIGNvZGUuCisgKiAgICAgIFNldHRpbmcgRlNUX0RFQlVHPTEgd2lsbCBpbmNsdWRlIGFsbCB0aGUgZGVidWcgY29kZSBidXQgaW4gYSBkaXNhYmxlZAorICogICAgICBzdGF0ZSwgdXNlIHRoZSBGU1RTRVRDT05GIGlvY3RsIHRvIGVuYWJsZSBzcGVjaWZpYyBkZWJ1ZyBhY3Rpb25zLCBvcgorICogICAgICBGU1RfREVCVUcgY2FuIGJlIHNldCB0byBwcmltZSB0aGUgZGVidWcgc2VsZWN0aW9uLgorICovCisjZGVmaW5lIEZTVF9ERUJVRyAgICAgICAweDAwMDAKKyNpZiBGU1RfREVCVUcKKworZXh0ZXJuIGludCBmc3RfZGVidWdfbWFzazsgICAgICAgICAgICAgIC8qIEJpdCBtYXNrIG9mIGFjdGlvbnMgdG8gZGVidWcsIGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBsaXN0ZWQgYmVsb3cuIE5vdGU6IEJpdCAwIGlzIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0byB0cmlnZ2VyIHRoZSBpbmNsdXNpb24gb2YgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvZGUsIHdpdGhvdXQgZW5hYmxpbmcgYW55IGFjdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERCR19JTklUICAgICAgICAweDAwMDIgICAgICAgICAgLyogQ2FyZCBkZXRlY3Rpb24gYW5kIGluaXRpYWxpc2F0aW9uICovCisjZGVmaW5lIERCR19PUEVOICAgICAgICAweDAwMDQgICAgICAgICAgLyogT3BlbiBhbmQgY2xvc2Ugc2VxdWVuY2VzICovCisjZGVmaW5lIERCR19QQ0kgICAgICAgICAweDAwMDggICAgICAgICAgLyogUENJIGNvbmZpZyBvcGVyYXRpb25zICovCisjZGVmaW5lIERCR19JT0NUTCAgICAgICAweDAwMTAgICAgICAgICAgLyogSW9jdGxzIGFuZCBvdGhlciBjb25maWcgKi8KKyNkZWZpbmUgREJHX0lOVFIgICAgICAgIDB4MDAyMCAgICAgICAgICAvKiBJbnRlcnJ1cHQgcm91dGluZXMgKGJlIGNhcmVmdWwpICovCisjZGVmaW5lIERCR19UWCAgICAgICAgICAweDAwNDAgICAgICAgICAgLyogUGFja2V0IHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBEQkdfUlggICAgICAgICAgMHgwMDgwICAgICAgICAgIC8qIFBhY2tldCByZWNlcHRpb24gKi8KKyNkZWZpbmUgREJHX0NNRCAgICAgICAgIDB4MDEwMCAgICAgICAgICAvKiBQb3J0IGNvbW1hbmQgaXNzdWluZyAqLworCisjZGVmaW5lIERCR19BU1MgICAgICAgICAweEZGRkYgICAgICAgICAgLyogQXNzZXJ0IGxpa2Ugc3RhdGVtZW50cy4gQ29kZSB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQsIGlmIHlvdSBzZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvbmUgb2YgdGhlc2UgdGhlbiBJJ3ZlIGJlZW4gYW4gYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZW5kaWYgIC8qIEZTVF9ERUJVRyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGQ2NDU3MC5oIGIvZHJpdmVycy9uZXQvd2FuL2hkNjQ1NzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODM5NjYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkNjQ1NzAuaApAQCAtMCwwICsxLDI0MSBAQAorI2lmbmRlZiBfX0hENjQ1NzBfSAorI2RlZmluZSBfX0hENjQ1NzBfSAorCisvKiBTQ0EgSEQ2NDU3MCByZWdpc3RlciBkZWZpbml0aW9ucyAtIGFsbCBhZGRyZXNzZXMgZm9yIG1vZGUgMCAoODA4NiBNUFUpCisgICBhbmQgMSAoNjQxODAgTVBVKS4gRm9yIG1vZGVzIDIgYW5kIDMsIFhPUiB0aGUgYWRkcmVzcyB3aXRoIDB4MDEuCisKKyAgIFNvdXJjZTogSEQ2NDU3MCBTQ0EgVXNlcidzIE1hbnVhbAorKi8KKworCisKKy8qIFNDQSBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBMUFIgICAgMHgwMAkJLyogTG93IFBvd2VyICovCisKKy8qIFdhaXQgY29udHJvbGxlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUEFCUjAgIDB4MDIJCS8qIFBoeXNpY2FsIEFkZHJlc3MgQm91bmRhcnkgMCAqLworI2RlZmluZSBQQUJSMSAgMHgwMwkJLyogUGh5c2ljYWwgQWRkcmVzcyBCb3VuZGFyeSAxICovCisjZGVmaW5lIFdDUkwgICAweDA0CQkvKiBXYWl0IENvbnRyb2wgTCAqLworI2RlZmluZSBXQ1JNICAgMHgwNQkJLyogV2FpdCBDb250cm9sIE0gKi8KKyNkZWZpbmUgV0NSSCAgIDB4MDYJCS8qIFdhaXQgQ29udHJvbCBIICovCisKKyNkZWZpbmUgUENSICAgIDB4MDgJCS8qIERNQSBQcmlvcml0eSBDb250cm9sICovCisjZGVmaW5lIERNRVIgICAweDA5CQkvKiBETUEgTWFzdGVyIEVuYWJsZSAqLworCisKKy8qIEludGVycnVwdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSVNSMCAgIDB4MTAJCS8qIEludGVycnVwdCBTdGF0dXMgMCAgKi8KKyNkZWZpbmUgSVNSMSAgIDB4MTEJCS8qIEludGVycnVwdCBTdGF0dXMgMSAgKi8KKyNkZWZpbmUgSVNSMiAgIDB4MTIJCS8qIEludGVycnVwdCBTdGF0dXMgMiAgKi8KKworI2RlZmluZSBJRVIwICAgMHgxNAkJLyogSW50ZXJydXB0IEVuYWJsZSAwICAqLworI2RlZmluZSBJRVIxICAgMHgxNQkJLyogSW50ZXJydXB0IEVuYWJsZSAxICAqLworI2RlZmluZSBJRVIyICAgMHgxNgkJLyogSW50ZXJydXB0IEVuYWJsZSAyICAqLworCisjZGVmaW5lIElUQ1IgICAweDE4CQkvKiBJbnRlcnJ1cHQgQ29udHJvbCAqLworI2RlZmluZSBJVlIgICAgMHgxQQkJLyogSW50ZXJydXB0IFZlY3RvciAqLworI2RlZmluZSBJTVZSICAgMHgxQwkJLyogSW50ZXJydXB0IE1vZGlmaWVkIFZlY3RvciAqLworCisKKworLyogTVNDSSBjaGFubmVsIChwb3J0KSAwIHJlZ2lzdGVycyAtIG9mZnNldCAweDIwCisgICBNU0NJIGNoYW5uZWwgKHBvcnQpIDEgcmVnaXN0ZXJzIC0gb2Zmc2V0IDB4NDAgKi8KKworI2RlZmluZSBNU0NJMF9PRkZTRVQgMHgyMAorI2RlZmluZSBNU0NJMV9PRkZTRVQgMHg0MAorCisjZGVmaW5lIFRSQkwgICAweDAwCQkvKiBUWC9SWCBidWZmZXIgTCAqLyAKKyNkZWZpbmUgVFJCSCAgIDB4MDEJCS8qIFRYL1JYIGJ1ZmZlciBIICovIAorI2RlZmluZSBTVDAgICAgMHgwMgkJLyogU3RhdHVzIDAgKi8KKyNkZWZpbmUgU1QxICAgIDB4MDMJCS8qIFN0YXR1cyAxICovCisjZGVmaW5lIFNUMiAgICAweDA0CQkvKiBTdGF0dXMgMiAqLworI2RlZmluZSBTVDMgICAgMHgwNQkJLyogU3RhdHVzIDMgKi8KKyNkZWZpbmUgRlNUICAgIDB4MDYJCS8qIEZyYW1lIFN0YXR1cyAgKi8KKyNkZWZpbmUgSUUwICAgIDB4MDgJCS8qIEludGVycnVwdCBFbmFibGUgMCAqLworI2RlZmluZSBJRTEgICAgMHgwOQkJLyogSW50ZXJydXB0IEVuYWJsZSAxICovCisjZGVmaW5lIElFMiAgICAweDBBCQkvKiBJbnRlcnJ1cHQgRW5hYmxlIDIgKi8KKyNkZWZpbmUgRklFICAgIDB4MEIJCS8qIEZyYW1lIEludGVycnVwdCBFbmFibGUgICovCisjZGVmaW5lIENNRCAgICAweDBDCQkvKiBDb21tYW5kICovCisjZGVmaW5lIE1EMCAgICAweDBFCQkvKiBNb2RlIDAgKi8KKyNkZWZpbmUgTUQxICAgIDB4MEYJCS8qIE1vZGUgMSAqLworI2RlZmluZSBNRDIgICAgMHgxMAkJLyogTW9kZSAyICovCisjZGVmaW5lIENUTCAgICAweDExCQkvKiBDb250cm9sICovCisjZGVmaW5lIFNBMCAgICAweDEyCQkvKiBTeW5jL0FkZHJlc3MgMCAqLworI2RlZmluZSBTQTEgICAgMHgxMwkJLyogU3luYy9BZGRyZXNzIDEgKi8KKyNkZWZpbmUgSURMICAgIDB4MTQJCS8qIElkbGUgUGF0dGVybiAqLworI2RlZmluZSBUTUMgICAgMHgxNQkJLyogVGltZSBDb25zdGFudCAqLworI2RlZmluZSBSWFMgICAgMHgxNgkJLyogUlggQ2xvY2sgU291cmNlICovCisjZGVmaW5lIFRYUyAgICAweDE3CQkvKiBUWCBDbG9jayBTb3VyY2UgKi8KKyNkZWZpbmUgVFJDMCAgIDB4MTgJCS8qIFRYIFJlYWR5IENvbnRyb2wgMCAqLyAKKyNkZWZpbmUgVFJDMSAgIDB4MTkJCS8qIFRYIFJlYWR5IENvbnRyb2wgMSAqLyAKKyNkZWZpbmUgUlJDICAgIDB4MUEJCS8qIFJYIFJlYWR5IENvbnRyb2wgKi8gCisjZGVmaW5lIENTVDAgICAweDFDCQkvKiBDdXJyZW50IFN0YXR1cyAwICovCisjZGVmaW5lIENTVDEgICAweDFECQkvKiBDdXJyZW50IFN0YXR1cyAxICovCisKKworLyogVGltZXIgY2hhbm5lbCAwIChwb3J0IDAgUlgpIHJlZ2lzdGVycyAtIG9mZnNldCAweDYwCisgICBUaW1lciBjaGFubmVsIDEgKHBvcnQgMCBUWCkgcmVnaXN0ZXJzIC0gb2Zmc2V0IDB4NjgKKyAgIFRpbWVyIGNoYW5uZWwgMiAocG9ydCAxIFJYKSByZWdpc3RlcnMgLSBvZmZzZXQgMHg3MAorICAgVGltZXIgY2hhbm5lbCAzIChwb3J0IDEgVFgpIHJlZ2lzdGVycyAtIG9mZnNldCAweDc4CisqLworCisjZGVmaW5lIFRJTUVSMFJYX09GRlNFVCAweDYwCisjZGVmaW5lIFRJTUVSMFRYX09GRlNFVCAweDY4CisjZGVmaW5lIFRJTUVSMVJYX09GRlNFVCAweDcwCisjZGVmaW5lIFRJTUVSMVRYX09GRlNFVCAweDc4CisKKyNkZWZpbmUgVENOVEwgIDB4MDAJCS8qIFVwLWNvdW50ZXIgTCAqLworI2RlZmluZSBUQ05USCAgMHgwMQkJLyogVXAtY291bnRlciBIICovCisjZGVmaW5lIFRDT05STCAweDAyCQkvKiBDb25zdGFudCBMICovCisjZGVmaW5lIFRDT05SSCAweDAzCQkvKiBDb25zdGFudCBIICovCisjZGVmaW5lIFRDU1IgICAweDA0CQkvKiBDb250cm9sL1N0YXR1cyAqLworI2RlZmluZSBURVBSICAgMHgwNQkJLyogRXhwYW5kIFByZXNjYWxlICovCisKKworCisvKiBETUEgY2hhbm5lbCAwIChwb3J0IDAgUlgpIHJlZ2lzdGVycyAtIG9mZnNldCAweDgwCisgICBETUEgY2hhbm5lbCAxIChwb3J0IDAgVFgpIHJlZ2lzdGVycyAtIG9mZnNldCAweEEwCisgICBETUEgY2hhbm5lbCAyIChwb3J0IDEgUlgpIHJlZ2lzdGVycyAtIG9mZnNldCAweEMwCisgICBETUEgY2hhbm5lbCAzIChwb3J0IDEgVFgpIHJlZ2lzdGVycyAtIG9mZnNldCAweEUwCisqLworCisjZGVmaW5lIERNQUMwUlhfT0ZGU0VUIDB4ODAKKyNkZWZpbmUgRE1BQzBUWF9PRkZTRVQgMHhBMAorI2RlZmluZSBETUFDMVJYX09GRlNFVCAweEMwCisjZGVmaW5lIERNQUMxVFhfT0ZGU0VUIDB4RTAKKworI2RlZmluZSBCQVJMICAgMHgwMAkJLyogQnVmZmVyIEFkZHJlc3MgTCAoY2hhaW5lZCBibG9jaykgKi8KKyNkZWZpbmUgQkFSSCAgIDB4MDEJCS8qIEJ1ZmZlciBBZGRyZXNzIEggKGNoYWluZWQgYmxvY2spICovCisjZGVmaW5lIEJBUkIgICAweDAyCQkvKiBCdWZmZXIgQWRkcmVzcyBCIChjaGFpbmVkIGJsb2NrKSAqLworCisjZGVmaW5lIERBUkwgICAweDAwCQkvKiBSWCBEZXN0aW5hdGlvbiBBZGRyIEwgKHNpbmdsZSBibG9jaykgKi8KKyNkZWZpbmUgREFSSCAgIDB4MDEJCS8qIFJYIERlc3RpbmF0aW9uIEFkZHIgSCAoc2luZ2xlIGJsb2NrKSAqLworI2RlZmluZSBEQVJCICAgMHgwMgkJLyogUlggRGVzdGluYXRpb24gQWRkciBCIChzaW5nbGUgYmxvY2spICovCisKKyNkZWZpbmUgU0FSTCAgIDB4MDQJCS8qIFRYIFNvdXJjZSBBZGRyZXNzIEwgKHNpbmdsZSBibG9jaykgKi8KKyNkZWZpbmUgU0FSSCAgIDB4MDUJCS8qIFRYIFNvdXJjZSBBZGRyZXNzIEggKHNpbmdsZSBibG9jaykgKi8KKyNkZWZpbmUgU0FSQiAgIDB4MDYJCS8qIFRYIFNvdXJjZSBBZGRyZXNzIEIgKHNpbmdsZSBibG9jaykgKi8KKworI2RlZmluZSBDUEIgICAgMHgwNgkJLyogQ2hhaW4gUG9pbnRlciBCYXNlIChjaGFpbmVkIGJsb2NrKSAqLworCisjZGVmaW5lIENEQUwgICAweDA4CQkvKiBDdXJyZW50IERlc2NyaXB0b3IgQWRkciBMIChjaGFpbmVkIGJsb2NrKSAqLworI2RlZmluZSBDREFIICAgMHgwOQkJLyogQ3VycmVudCBEZXNjcmlwdG9yIEFkZHIgSCAoY2hhaW5lZCBibG9jaykgKi8KKyNkZWZpbmUgRURBTCAgIDB4MEEJCS8qIEVycm9yIERlc2NyaXB0b3IgQWRkciBMIChjaGFpbmVkIGJsb2NrKSAqLworI2RlZmluZSBFREFIICAgMHgwQgkJLyogRXJyb3IgRGVzY3JpcHRvciBBZGRyIEggKGNoYWluZWQgYmxvY2spICovCisjZGVmaW5lIEJGTEwgICAweDBDCQkvKiBSWCBSZWNlaXZlIEJ1ZmZlciBMZW5ndGggTCAoY2hhaW5lZCBibG9jaykqLworI2RlZmluZSBCRkxIICAgMHgwRAkJLyogUlggUmVjZWl2ZSBCdWZmZXIgTGVuZ3RoIEggKGNoYWluZWQgYmxvY2spKi8KKyNkZWZpbmUgQkNSTCAgIDB4MEUJCS8qIEJ5dGUgQ291bnQgTCAqLworI2RlZmluZSBCQ1JIICAgMHgwRgkJLyogQnl0ZSBDb3VudCBIICovCisjZGVmaW5lIERTUiAgICAweDEwCQkvKiBETUEgU3RhdHVzICovCisjZGVmaW5lIERTUl9SWChub2RlKSAoRFNSICsgKG5vZGUgPyBETUFDMVJYX09GRlNFVCA6IERNQUMwUlhfT0ZGU0VUKSkKKyNkZWZpbmUgRFNSX1RYKG5vZGUpIChEU1IgKyAobm9kZSA/IERNQUMxVFhfT0ZGU0VUIDogRE1BQzBUWF9PRkZTRVQpKQorI2RlZmluZSBETVIgICAgMHgxMQkJLyogRE1BIE1vZGUgKi8KKyNkZWZpbmUgRE1SX1JYKG5vZGUpIChETVIgKyAobm9kZSA/IERNQUMxUlhfT0ZGU0VUIDogRE1BQzBSWF9PRkZTRVQpKQorI2RlZmluZSBETVJfVFgobm9kZSkgKERNUiArIChub2RlID8gRE1BQzFUWF9PRkZTRVQgOiBETUFDMFRYX09GRlNFVCkpCisjZGVmaW5lIEZDVCAgICAweDEzCQkvKiBGcmFtZSBFbmQgSW50ZXJydXB0IENvdW50ZXIgKi8KKyNkZWZpbmUgRkNUX1JYKG5vZGUpIChGQ1QgKyAobm9kZSA/IERNQUMxUlhfT0ZGU0VUIDogRE1BQzBSWF9PRkZTRVQpKQorI2RlZmluZSBGQ1RfVFgobm9kZSkgKEZDVCArIChub2RlID8gRE1BQzFUWF9PRkZTRVQgOiBETUFDMFRYX09GRlNFVCkpCisjZGVmaW5lIERJUiAgICAweDE0CQkvKiBETUEgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBESVJfUlgobm9kZSkgKERJUiArIChub2RlID8gRE1BQzFSWF9PRkZTRVQgOiBETUFDMFJYX09GRlNFVCkpCisjZGVmaW5lIERJUl9UWChub2RlKSAoRElSICsgKG5vZGUgPyBETUFDMVRYX09GRlNFVCA6IERNQUMwVFhfT0ZGU0VUKSkKKyNkZWZpbmUgRENSICAgIDB4MTUJCS8qIERNQSBDb21tYW5kICAqLworI2RlZmluZSBEQ1JfUlgobm9kZSkgKERDUiArIChub2RlID8gRE1BQzFSWF9PRkZTRVQgOiBETUFDMFJYX09GRlNFVCkpCisjZGVmaW5lIERDUl9UWChub2RlKSAoRENSICsgKG5vZGUgPyBETUFDMVRYX09GRlNFVCA6IERNQUMwVFhfT0ZGU0VUKSkKKworCisKKworLyogRGVzY3JpcHRvciBTdHJ1Y3R1cmUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBjcDsJCQkvKiBDaGFpbiBQb2ludGVyICovCisJdTMyIGJwOwkJCS8qIEJ1ZmZlciBQb2ludGVyICgyNCBiaXRzKSAqLworCXUxNiBsZW47CQkvKiBEYXRhIExlbmd0aCAqLworCXU4IHN0YXQ7CQkvKiBTdGF0dXMgKi8KKwl1OCB1bnVzZWQ7CQkvKiBwYWRzIHRvIDItYnl0ZSBib3VuZGFyeSAqLworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwa3RfZGVzYzsKKworCisvKiBQYWNrZXQgRGVzY3JpcHRvciBTdGF0dXMgYml0cyAqLworCisjZGVmaW5lIFNUX1RYX0VPTSAgICAgMHg4MAkvKiBFbmQgb2YgZnJhbWUgKi8KKyNkZWZpbmUgU1RfVFhfRU9UICAgICAweDAxCS8qIEVuZCBvZiB0cmFuc21pdGlvbiAqLworCisjZGVmaW5lIFNUX1JYX0VPTSAgICAgMHg4MAkvKiBFbmQgb2YgZnJhbWUgKi8KKyNkZWZpbmUgU1RfUlhfU0hPUlQgICAweDQwCS8qIFNob3J0IGZyYW1lICovCisjZGVmaW5lIFNUX1JYX0FCT1JUICAgMHgyMAkvKiBBYm9ydCAqLworI2RlZmluZSBTVF9SWF9SRVNCSVQgIDB4MTAJLyogUmVzaWR1YWwgYml0ICovCisjZGVmaW5lIFNUX1JYX09WRVJSVU4gMHgwOAkvKiBPdmVycnVuICovCisjZGVmaW5lIFNUX1JYX0NSQyAgICAgMHgwNAkvKiBDUkMgKi8KKworI2RlZmluZSBTVF9FUlJPUl9NQVNLIDB4N0MKKworI2RlZmluZSBESVJfRU9URSAgICAgIDB4ODAgICAgICAvKiBUcmFuc2ZlciBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgRElSX0VPTUUgICAgICAweDQwICAgICAgLyogRnJhbWUgVHJhbnNmZXIgQ29tcGxldGVkIChjaGFpbmVkLWJsb2NrKSAqLworI2RlZmluZSBESVJfQk9GRSAgICAgIDB4MjAgICAgICAvKiBCdWZmZXIgT3ZlcmZsb3cvVW5kZXJmbG93IChjaGFpbmVkLWJsb2NrKSovCisjZGVmaW5lIERJUl9DT0ZFICAgICAgMHgxMCAgICAgIC8qIENvdW50ZXIgT3ZlcmZsb3cgKGNoYWluZWQtYmxvY2spICovCisKKworI2RlZmluZSBEU1JfRU9UICAgICAgIDB4ODAgICAgICAvKiBUcmFuc2ZlciBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgRFNSX0VPTSAgICAgICAweDQwICAgICAgLyogRnJhbWUgVHJhbnNmZXIgQ29tcGxldGVkIChjaGFpbmVkLWJsb2NrKSAqLworI2RlZmluZSBEU1JfQk9GICAgICAgIDB4MjAgICAgICAvKiBCdWZmZXIgT3ZlcmZsb3cvVW5kZXJmbG93IChjaGFpbmVkLWJsb2NrKSovCisjZGVmaW5lIERTUl9DT0YgICAgICAgMHgxMCAgICAgIC8qIENvdW50ZXIgT3ZlcmZsb3cgKGNoYWluZWQtYmxvY2spICovCisjZGVmaW5lIERTUl9ERSAgICAgICAgMHgwMgkvKiBETUEgRW5hYmxlICovCisjZGVmaW5lIERTUl9EV0UgICAgICAgMHgwMSAgICAgIC8qIERNQSBXcml0ZSBEaXNhYmxlICovCisKKy8qIERNQSBNYXN0ZXIgRW5hYmxlIFJlZ2lzdGVyIChETUVSKSBiaXRzICovCisjZGVmaW5lIERNRVJfRE1FICAgICAgMHg4MAkvKiBETUEgTWFzdGVyIEVuYWJsZSAqLworCisKKyNkZWZpbmUgQ01EX1JFU0VUICAgICAweDIxCS8qIFJlc2V0IENoYW5uZWwgKi8KKyNkZWZpbmUgQ01EX1RYX0VOQUJMRSAweDAyCS8qIFN0YXJ0IHRyYW5zbWl0dGVyICovCisjZGVmaW5lIENNRF9SWF9FTkFCTEUgMHgxMgkvKiBTdGFydCByZWNlaXZlciAqLworCisjZGVmaW5lIE1EMF9IRExDICAgICAgMHg4MAkvKiBCaXQtc3luYyBIRExDIG1vZGUgKi8KKyNkZWZpbmUgTUQwX0NSQ19FTkEgICAweDA0CS8qIEVuYWJsZSBDUkMgY29kZSBjYWxjdWxhdGlvbiAqLworI2RlZmluZSBNRDBfQ1JDX0NDSVRUIDB4MDIJLyogQ0NJVFQgQ1JDIGluc3RlYWQgb2YgQ1JDLTE2ICovCisjZGVmaW5lIE1EMF9DUkNfUFIxICAgMHgwMQkvKiBJbml0aWFsIGFsbC1vbmVzIGluc3RlYWQgb2YgYWxsLXplcm9zICovCisKKyNkZWZpbmUgTUQwX0NSQ19OT05FICAweDAwCisjZGVmaW5lIE1EMF9DUkNfMTZfMCAgMHgwNAorI2RlZmluZSBNRDBfQ1JDXzE2ICAgIDB4MDUKKyNkZWZpbmUgTUQwX0NSQ19JVFVfMCAweDA2CisjZGVmaW5lIE1EMF9DUkNfSVRVICAgMHgwNworCisjZGVmaW5lIE1EMl9OUloJICAgICAgMHgwMAorI2RlZmluZSBNRDJfTlJaSSAgICAgIDB4MjAKKyNkZWZpbmUgTUQyX01BTkNIRVNURVIgMHg4MAorI2RlZmluZSBNRDJfRk1fTUFSSyAgIDB4QTAKKyNkZWZpbmUgTUQyX0ZNX1NQQUNFICAweEMwCisjZGVmaW5lIE1EMl9MT09QQkFDSyAgMHgwMyAgICAgIC8qIExvY2FsIGRhdGEgTG9vcGJhY2sgKi8KKworI2RlZmluZSBDVExfTk9SVFMgICAgIDB4MDEKKyNkZWZpbmUgQ1RMX0lETEUgICAgICAweDEwCS8qIFRyYW5zbWl0IGFuIGlkbGUgcGF0dGVybiAqLworI2RlZmluZSBDVExfVURSTkMgICAgIDB4MjAJLyogSWRsZSBhZnRlciBDUkMgb3IgRkNTK2ZsYWcgdHJhbnNtaXRpb24gKi8KKworI2RlZmluZSBTVDBfVFhSRFkgICAgIDB4MDIJLyogVFggcmVhZHkgKi8KKyNkZWZpbmUgU1QwX1JYUkRZICAgICAweDAxCS8qIFJYIHJlYWR5ICovCisKKyNkZWZpbmUgU1QxX1VEUk4gICAgICAweDgwCS8qIE1TQ0kgVFggdW5kZXJydW4gKi8KKyNkZWZpbmUgU1QxX0NEQ0QgICAgICAweDA0CS8qIERDRCBsZXZlbCBjaGFuZ2VkICovCisKKyNkZWZpbmUgU1QzX0NUUyAgICAgICAweDA4CS8qIG1vZGVtIGlucHV0IC0gL0NUUyAqLworI2RlZmluZSBTVDNfRENEICAgICAgIDB4MDQJLyogbW9kZW0gaW5wdXQgLSAvRENEICovCisKKyNkZWZpbmUgSUUwX1RYSU5UICAgICAweDgwCS8qIFRYIElOVCBNU0NJIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSUUwX1JYSU5UQSAgICAweDQwCS8qIFJYIElOVCBBIE1TQ0kgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBJRTFfVURSTiAgICAgIDB4ODAJLyogVFggdW5kZXJydW4gTVNDSSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIElFMV9DRENEICAgICAgMHgwNAkvKiBEQ0QgbGV2ZWwgY2hhbmdlZCAqLworCisjZGVmaW5lIERDUl9BQk9SVCAgICAgMHgwMQkvKiBTb2Z0d2FyZSBhYm9ydCBjb21tYW5kICovCisjZGVmaW5lIERDUl9DTEVBUl9FT0YgMHgwMgkvKiBDbGVhciBFT0YgaW50ZXJydXB0ICovCisKKy8qIFRYIGFuZCBSWCBDbG9jayBTb3VyY2UgLSBSWFMgYW5kIFRYUyAqLworI2RlZmluZSBDTEtfQlJHX01BU0sgIDB4MEYKKyNkZWZpbmUgQ0xLX0xJTkVfUlggICAweDAwCS8qIFRYL1JYIGNsb2NrIGxpbmUgaW5wdXQgKi8KKyNkZWZpbmUgQ0xLX0xJTkVfVFggICAweDAwCS8qIFRYL1JYIGxpbmUgaW5wdXQgKi8KKyNkZWZpbmUgQ0xLX0JSR19SWCAgICAweDQwCS8qIGludGVybmFsIGJhdWQgcmF0ZSBnZW5lcmF0b3IgKi8KKyNkZWZpbmUgQ0xLX0JSR19UWCAgICAweDQwCS8qIGludGVybmFsIGJhdWQgcmF0ZSBnZW5lcmF0b3IgKi8KKyNkZWZpbmUgQ0xLX1JYQ0xLX1RYICAweDYwCS8qIFRYIGNsb2NrIGZyb20gUlggY2xvY2sgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGQ2NDU3Mi5oIGIvZHJpdmVycy9uZXQvd2FuL2hkNjQ1NzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU2N2MyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkNjQ1NzIuaApAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqIGhkNjQ1NzIuaAlEZXNjcmlwdGlvbiBvZiB0aGUgSGl0YWNoaSBIRDY0NTcyIChTQ0EtSUkpLCB2YWxpZCBmb3IgCisgKiAJCUNQVSBtb2RlcyAwICYgMi4KKyAqCisgKiBBdXRob3I6CUl2YW4gUGFzc29zIDxpdmFuQGN5Y2xhZGVzLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQ6ICAgKGMpIDIwMDAtMjAwMSBDeWNsYWRlcyBDb3JwLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogJExvZzogaGQ2NDU3Mi5oLHYgJAorICogUmV2aXNpb24gMy4xICAyMDAxLzA2LzE1IDEyOjQxOjEwICByZWdpbmEKKyAqIHVwcGluZyBtYWpvciB2ZXJzaW9uIG51bWJlcgorICoKKyAqIFJldmlzaW9uIDEuMS4xLjEgIDIwMDEvMDYvMTMgMjA6MjQ6NDkgIGRhbmllbGEKKyAqIFBDMzAwIGluaXRpYWwgQ1ZTIHZlcnNpb24gKDMuNC4wLXByZTEpCisgKgorICogUmV2aXNpb24gMS4wIDIwMDAvMDEvMjUgaXZhbgorICogSW5pdGlhbCB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fSEQ2NDU3Ml9ICisjZGVmaW5lIF9fSEQ2NDU3Ml9ICisKKy8qIElsbGVnYWwgQWNjZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCUlMQVIJMHgwMAorCisvKiBXYWl0IENvbnRyb2xsZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIFBBQlIwTAkweDIwCS8qIFBoeXNpY2FsIEFkZHIgQm91bmRhcnkgUmVnaXN0ZXIgMCBMICovCisjZGVmaW5lIFBBQlIwSAkweDIxCS8qIFBoeXNpY2FsIEFkZHIgQm91bmRhcnkgUmVnaXN0ZXIgMCBIICovCisjZGVmaW5lIFBBQlIxTAkweDIyCS8qIFBoeXNpY2FsIEFkZHIgQm91bmRhcnkgUmVnaXN0ZXIgMSBMICovCisjZGVmaW5lIFBBQlIxSAkweDIzCS8qIFBoeXNpY2FsIEFkZHIgQm91bmRhcnkgUmVnaXN0ZXIgMSBIICovCisjZGVmaW5lIFdDUkwJMHgyNAkvKiBXYWl0IENvbnRyb2wgUmVnaXN0ZXIgTCAqLworI2RlZmluZSBXQ1JNCTB4MjUJLyogV2FpdCBDb250cm9sIFJlZ2lzdGVyIE0gKi8KKyNkZWZpbmUgV0NSSAkweDI2CS8qIFdhaXQgQ29udHJvbCBSZWdpc3RlciBIICovCisKKy8qIEludGVycnVwdCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgSVZSCTB4NjAJLyogSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAqLworI2RlZmluZSBJTVZSCTB4NjQJLyogSW50ZXJydXB0IE1vZGlmaWVkIFZlY3RvciBSZWdpc3RlciAqLworI2RlZmluZSBJVENSCTB4NjgJLyogSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVNSMAkweDZjCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBJU1IxCTB4NzAJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAxICovCisjZGVmaW5lIElFUjAJMHg3NAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgSUVSMQkweDc4CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMSAqLworCisvKiBSZWdpc3RlciBBY2Nlc3MgTWFjcm9zIChjaGFuIGlzIDAgb3IgMSBpbiBfYW55XyBjYXNlKSAqLworI2RlZmluZQlNX1JFRyhyZWcsIGNoYW4pCShyZWcgKyAweDgwKmNoYW4pCQkvKiBNU0NJICovCisjZGVmaW5lCURSWF9SRUcocmVnLCBjaGFuKQkocmVnICsgMHg0MCpjaGFuKQkJLyogRE1BIFJ4ICovCisjZGVmaW5lCURUWF9SRUcocmVnLCBjaGFuKQkocmVnICsgMHgyMCooMipjaGFuICsgMSkpCS8qIERNQSBUeCAqLworI2RlZmluZQlUUlhfUkVHKHJlZywgY2hhbikJKHJlZyArIDB4MjAqY2hhbikJCS8qIFRpbWVyIFJ4ICovCisjZGVmaW5lCVRUWF9SRUcocmVnLCBjaGFuKQkocmVnICsgMHgxMCooMipjaGFuICsgMSkpCS8qIFRpbWVyIFR4ICovCisjZGVmaW5lCVNUX1JFRyhyZWcsIGNoYW4pCShyZWcgKyAweDgwKmNoYW4pCQkvKiBTdGF0dXMgQ250ICovCisjZGVmaW5lIElSMF9EUlgodmFsLCBjaGFuKQkoKHZhbCk8PCg4KihjaGFuKSkpCQkvKiBJbnQgRE1BIFJ4ICovCisjZGVmaW5lIElSMF9EVFgodmFsLCBjaGFuKQkoKHZhbCk8PCg0KigyKmNoYW4gKyAxKSkpCS8qIEludCBETUEgVHggKi8KKyNkZWZpbmUgSVIwX00odmFsLCBjaGFuKQkoKHZhbCk8PCg4KihjaGFuKSkpCQkvKiBJbnQgTVNDSSAqLworCisvKiBNU0NJIENoYW5uZWwgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1TQ0kwX09GRlNFVCAweDAwCisjZGVmaW5lIE1TQ0kxX09GRlNFVCAweDgwCisKKyNkZWZpbmUgTUQwCTB4MTM4CS8qIE1vZGUgcmVnIDAgKi8KKyNkZWZpbmUgTUQxCTB4MTM5CS8qIE1vZGUgcmVnIDEgKi8KKyNkZWZpbmUgTUQyCTB4MTNhCS8qIE1vZGUgcmVnIDIgKi8KKyNkZWZpbmUgTUQzCTB4MTNiCS8qIE1vZGUgcmVnIDMgKi8KKyNkZWZpbmUgQ1RMCTB4MTMwCS8qIENvbnRyb2wgcmVnICovCisjZGVmaW5lIFJYUwkweDEzYwkvKiBSWCBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgVFhTCTB4MTNkCS8qIFRYIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBFWFMJMHgxM2UJLyogRXh0ZXJuYWwgY2xvY2sgaW5wdXQgc2VsZWN0aW9uICovCisjZGVmaW5lIFRNQ1QJMHgxNDQJLyogVGltZSBjb25zdGFudCAoVHgpICovCisjZGVmaW5lIFRNQ1IJMHgxNDUJLyogVGltZSBjb25zdGFudCAoUngpICovCisjZGVmaW5lIENNRAkweDEyOAkvKiBDb21tYW5kIHJlZyAqLworI2RlZmluZSBTVDAJMHgxMTgJLyogU3RhdHVzIHJlZyAwICovCisjZGVmaW5lIFNUMQkweDExOQkvKiBTdGF0dXMgcmVnIDEgKi8KKyNkZWZpbmUgU1QyCTB4MTFhCS8qIFN0YXR1cyByZWcgMiAqLworI2RlZmluZSBTVDMJMHgxMWIJLyogU3RhdHVzIHJlZyAzICovCisjZGVmaW5lIFNUNAkweDExYwkvKiBTdGF0dXMgcmVnIDQgKi8KKyNkZWZpbmUgRlNUCTB4MTFkCS8qIGZyYW1lIFN0YXR1cyByZWcgICovCisjZGVmaW5lIElFMAkweDEyMAkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZyAwICovCisjZGVmaW5lIElFMQkweDEyMQkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZyAxICovCisjZGVmaW5lIElFMgkweDEyMgkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZyAyICovCisjZGVmaW5lIElFNAkweDEyNAkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZyA0ICovCisjZGVmaW5lIEZJRQkweDEyNQkvKiBGcmFtZSBJbnRlcnJ1cHQgZW5hYmxlIHJlZyAgKi8KKyNkZWZpbmUgU0EwCTB4MTQwCS8qIFN5biBBZGRyZXNzIHJlZyAwICovCisjZGVmaW5lIFNBMQkweDE0MQkvKiBTeW4gQWRkcmVzcyByZWcgMSAqLworI2RlZmluZSBJREwJMHgxNDIJLyogSWRsZSByZWdpc3RlciAqLworI2RlZmluZSBUUkJMCTB4MTAwCS8qIFRYL1JYIGJ1ZmZlciByZWcgTCAqLyAKKyNkZWZpbmUgVFJCSwkweDEwMQkvKiBUWC9SWCBidWZmZXIgcmVnIEsgKi8gCisjZGVmaW5lIFRSQkoJMHgxMDIJLyogVFgvUlggYnVmZmVyIHJlZyBKICovIAorI2RlZmluZSBUUkJICTB4MTAzCS8qIFRYL1JYIGJ1ZmZlciByZWcgSCAqLyAKKyNkZWZpbmUgVFJDMAkweDE0OAkvKiBUWCBSZWFkeSBjb250cm9sIHJlZyAwICovIAorI2RlZmluZSBUUkMxCTB4MTQ5CS8qIFRYIFJlYWR5IGNvbnRyb2wgcmVnIDEgKi8gCisjZGVmaW5lIFJSQwkweDE0YQkvKiBSWCBSZWFkeSBjb250cm9sIHJlZyAqLyAKKyNkZWZpbmUgQ1NUMAkweDEwOAkvKiBDdXJyZW50IFN0YXR1cyBSZWdpc3RlciAwICovIAorI2RlZmluZSBDU1QxCTB4MTA5CS8qIEN1cnJlbnQgU3RhdHVzIFJlZ2lzdGVyIDEgKi8gCisjZGVmaW5lIENTVDIJMHgxMGEJLyogQ3VycmVudCBTdGF0dXMgUmVnaXN0ZXIgMiAqLyAKKyNkZWZpbmUgQ1NUMwkweDEwYgkvKiBDdXJyZW50IFN0YXR1cyBSZWdpc3RlciAzICovIAorI2RlZmluZSBHUE8JMHgxMzEJLyogR2VuZXJhbCBQdXJwb3NlIE91dHB1dCBQaW4gQ3RsIFJlZyAqLworI2RlZmluZSBURlMJMHgxNGIJLyogVHggU3RhcnQgVGhyZXNob2xkIEN0bCBSZWcgKi8KKyNkZWZpbmUgVEZOCTB4MTQzCS8qIEludGVyLXRyYW5zbWl0LWZyYW1lIFRpbWUgRmlsbCBDdGwgUmVnICovCisjZGVmaW5lIFRCTgkweDExMAkvKiBUeCBCdWZmZXIgTnVtYmVyIFJlZyAqLworI2RlZmluZSBSQk4JMHgxMTEJLyogUnggQnVmZmVyIE51bWJlciBSZWcgKi8KKyNkZWZpbmUgVE5SMAkweDE1MAkvKiBUeCBETUEgUmVxdWVzdCBDdGwgUmVnIDAgKi8KKyNkZWZpbmUgVE5SMQkweDE1MQkvKiBUeCBETUEgUmVxdWVzdCBDdGwgUmVnIDEgKi8KKyNkZWZpbmUgVENSCTB4MTUyCS8qIFR4IERNQSBDcml0aWNhbCBSZXF1ZXN0IFJlZyAqLworI2RlZmluZSBSTlIJMHgxNTQJLyogUnggRE1BIFJlcXVlc3QgQ3RsIFJlZyAqLworI2RlZmluZSBSQ1IJMHgxNTYJLyogUnggRE1BIENyaXRpY2FsIFJlcXVlc3QgUmVnICovCisKKy8qIFRpbWVyIFJlZ2lzdGVycyAqLworI2RlZmluZSBUSU1FUjBSWF9PRkZTRVQgMHgwMAorI2RlZmluZSBUSU1FUjBUWF9PRkZTRVQgMHgxMAorI2RlZmluZSBUSU1FUjFSWF9PRkZTRVQgMHgyMAorI2RlZmluZSBUSU1FUjFUWF9PRkZTRVQgMHgzMAorCisjZGVmaW5lIFRDTlRMCTB4MjAwCS8qIFRpbWVyIFVwY291bnRlciBMICovCisjZGVmaW5lIFRDTlRICTB4MjAxCS8qIFRpbWVyIFVwY291bnRlciBIICovCisjZGVmaW5lIFRDT05STAkweDIwNAkvKiBUaW1lciBDb25zdGFudCBSZWdpc3RlciBMICovCisjZGVmaW5lIFRDT05SSAkweDIwNQkvKiBUaW1lciBDb25zdGFudCBSZWdpc3RlciBIICovCisjZGVmaW5lIFRDU1IJMHgyMDYJLyogVGltZXIgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVEVQUgkweDIwNwkvKiBUaW1lciBFeHBhbmQgUHJlc2NhbGUgUmVnaXN0ZXIgKi8KKworLyogRE1BIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQ1IJCTB4NDAJCS8qIERNQSBwcmlvcml0eSBjb250cm9sIHJlZyAqLworI2RlZmluZSBEUlIJCTB4NDQJCS8qIERNQSByZXNldCByZWcgKi8KKyNkZWZpbmUgRE1FUgkJMHgwNwkJLyogRE1BIE1hc3RlciBFbmFibGUgcmVnICovCisjZGVmaW5lIEJUQ1IJCTB4MDgJCS8qIEJ1cnN0IFR4IEN0bCBSZWcgKi8KKyNkZWZpbmUgQk9MUgkJMHgwYwkJLyogQmFjay1vZmYgTGVuZ3RoIFJlZyAqLworI2RlZmluZSBEU1JfUlgoY2hhbikJKDB4NDggKyAyKmNoYW4pCS8qIERNQSBTdGF0dXMgUmVnIChSeCkgKi8KKyNkZWZpbmUgRFNSX1RYKGNoYW4pCSgweDQ5ICsgMipjaGFuKQkvKiBETUEgU3RhdHVzIFJlZyAoVHgpICovCisjZGVmaW5lIERJUl9SWChjaGFuKQkoMHg0YyArIDIqY2hhbikJLyogRE1BIEludGVycnVwdCBFbmFibGUgUmVnIChSeCkgKi8KKyNkZWZpbmUgRElSX1RYKGNoYW4pCSgweDRkICsgMipjaGFuKQkvKiBETUEgSW50ZXJydXB0IEVuYWJsZSBSZWcgKFR4KSAqLworI2RlZmluZSBGQ1RfUlgoY2hhbikJKDB4NTAgKyAyKmNoYW4pCS8qIEZyYW1lIEVuZCBJbnRlcnJ1cHQgQ291bnRlciAoUngpICovCisjZGVmaW5lIEZDVF9UWChjaGFuKQkoMHg1MSArIDIqY2hhbikJLyogRnJhbWUgRW5kIEludGVycnVwdCBDb3VudGVyIChUeCkgKi8KKyNkZWZpbmUgRE1SX1JYKGNoYW4pCSgweDU0ICsgMipjaGFuKQkvKiBETUEgTW9kZSBSZWcgKFJ4KSAqLworI2RlZmluZSBETVJfVFgoY2hhbikJKDB4NTUgKyAyKmNoYW4pCS8qIERNQSBNb2RlIFJlZyAoVHgpICovCisjZGVmaW5lIERDUl9SWChjaGFuKQkoMHg1OCArIDIqY2hhbikJLyogRE1BIENvbW1hbmQgUmVnIChSeCkgKi8KKyNkZWZpbmUgRENSX1RYKGNoYW4pCSgweDU5ICsgMipjaGFuKQkvKiBETUEgQ29tbWFuZCBSZWcgKFR4KSAqLworCisvKiBETUEgQ2hhbm5lbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRE1BQzBSWF9PRkZTRVQgMHgwMAorI2RlZmluZSBETUFDMFRYX09GRlNFVCAweDIwCisjZGVmaW5lIERNQUMxUlhfT0ZGU0VUIDB4NDAKKyNkZWZpbmUgRE1BQzFUWF9PRkZTRVQgMHg2MAorCisjZGVmaW5lIERBUkwJMHg4MAkvKiBEZXN0IEFkZHIgUmVnaXN0ZXIgTCAoc2luZ2xlLWJsb2NrLCBSWCBvbmx5KSAqLworI2RlZmluZSBEQVJICTB4ODEJLyogRGVzdCBBZGRyIFJlZ2lzdGVyIEggKHNpbmdsZS1ibG9jaywgUlggb25seSkgKi8KKyNkZWZpbmUgREFSQgkweDgyCS8qIERlc3QgQWRkciBSZWdpc3RlciBCIChzaW5nbGUtYmxvY2ssIFJYIG9ubHkpICovCisjZGVmaW5lIERBUkJICTB4ODMJLyogRGVzdCBBZGRyIFJlZ2lzdGVyIEJIIChzaW5nbGUtYmxvY2ssIFJYIG9ubHkpICovCisjZGVmaW5lIFNBUkwJMHg4MAkvKiBTb3VyY2UgQWRkciBSZWdpc3RlciBMIChzaW5nbGUtYmxvY2ssIFRYIG9ubHkpICovCisjZGVmaW5lIFNBUkgJMHg4MQkvKiBTb3VyY2UgQWRkciBSZWdpc3RlciBIIChzaW5nbGUtYmxvY2ssIFRYIG9ubHkpICovCisjZGVmaW5lIFNBUkIJMHg4MgkvKiBTb3VyY2UgQWRkciBSZWdpc3RlciBCIChzaW5nbGUtYmxvY2ssIFRYIG9ubHkpICovCisjZGVmaW5lIERBUkJICTB4ODMJLyogU291cmNlIEFkZHIgUmVnaXN0ZXIgQkggKHNpbmdsZS1ibG9jaywgVFggb25seSkgKi8KKyNkZWZpbmUgQkFSTAkweDgwCS8qIEJ1ZmZlciBBZGRyIFJlZ2lzdGVyIEwgKGNoYWluZWQtYmxvY2spICovCisjZGVmaW5lIEJBUkgJMHg4MQkvKiBCdWZmZXIgQWRkciBSZWdpc3RlciBIIChjaGFpbmVkLWJsb2NrKSAqLworI2RlZmluZSBCQVJCCTB4ODIJLyogQnVmZmVyIEFkZHIgUmVnaXN0ZXIgQiAoY2hhaW5lZC1ibG9jaykgKi8KKyNkZWZpbmUgQkFSQkgJMHg4MwkvKiBCdWZmZXIgQWRkciBSZWdpc3RlciBCSCAoY2hhaW5lZC1ibG9jaykgKi8KKyNkZWZpbmUgQ0RBTAkweDg0CS8qIEN1cnJlbnQgRGVzY3JpcHRvciBBZGRyIFJlZ2lzdGVyIEwgKi8KKyNkZWZpbmUgQ0RBSAkweDg1CS8qIEN1cnJlbnQgRGVzY3JpcHRvciBBZGRyIFJlZ2lzdGVyIEggKi8KKyNkZWZpbmUgQ0RBQgkweDg2CS8qIEN1cnJlbnQgRGVzY3JpcHRvciBBZGRyIFJlZ2lzdGVyIEIgKi8KKyNkZWZpbmUgQ0RBQkgJMHg4NwkvKiBDdXJyZW50IERlc2NyaXB0b3IgQWRkciBSZWdpc3RlciBCSCAqLworI2RlZmluZSBFREFMCTB4ODgJLyogRXJyb3IgRGVzY3JpcHRvciBBZGRyIFJlZ2lzdGVyIEwgKi8KKyNkZWZpbmUgRURBSAkweDg5CS8qIEVycm9yIERlc2NyaXB0b3IgQWRkciBSZWdpc3RlciBIICovCisjZGVmaW5lIEVEQUIJMHg4YQkvKiBFcnJvciBEZXNjcmlwdG9yIEFkZHIgUmVnaXN0ZXIgQiAqLworI2RlZmluZSBFREFCSAkweDhiCS8qIEVycm9yIERlc2NyaXB0b3IgQWRkciBSZWdpc3RlciBCSCAqLworI2RlZmluZSBCRkxMCTB4OTAJLyogUlggQnVmZmVyIExlbmd0aCBMIChvbmx5IFJYKSAqLworI2RlZmluZSBCRkxICTB4OTEJLyogUlggQnVmZmVyIExlbmd0aCBIIChvbmx5IFJYKSAqLworI2RlZmluZSBCQ1JMCTB4OGMJLyogQnl0ZSBDb3VudCBSZWdpc3RlciBMICovCisjZGVmaW5lIEJDUkgJMHg4ZAkvKiBCeXRlIENvdW50IFJlZ2lzdGVyIEggKi8KKworLyogQmxvY2sgRGVzY3JpcHRvciBTdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nCW5leHQ7CQkvKiBwb2ludGVyIHRvIG5leHQgYmxvY2sgZGVzY3JpcHRvciAqLworCXVuc2lnbmVkIGxvbmcJcHRidWY7CQkvKiBidWZmZXIgcG9pbnRlciAqLworCXVuc2lnbmVkIHNob3J0CWxlbjsJCS8qIGRhdGEgbGVuZ3RoICovCisJdW5zaWduZWQgY2hhcglzdGF0dXM7CQkvKiBzdGF0dXMgKi8KKwl1bnNpZ25lZCBjaGFyCWZpbGxlcls1XTsJLyogYWxpZ25tZW50IGZpbGxlciAoMTYgYnl0ZXMpICovIAorfSBwY3NjYV9iZF90OworCisvKiBCbG9jayBEZXNjcmlwdG9yIFN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBjcDsJCQkvKiBwb2ludGVyIHRvIG5leHQgYmxvY2sgZGVzY3JpcHRvciAqLworCXUzMiBicDsJCQkvKiBidWZmZXIgcG9pbnRlciAqLworCXUxNiBsZW47CQkvKiBkYXRhIGxlbmd0aCAqLworCXU4IHN0YXQ7CQkvKiBzdGF0dXMgKi8KKwl1OCB1bnVzZWQ7CQkvKiBwYWRzIHRvIDQtYnl0ZSBib3VuZGFyeSAqLworfXBrdF9kZXNjOworCisKKy8qCisJRGVzY3JpcHRvciBTdGF0dXMgZGVmaW5pdGlvbnM6CisKKwlCaXQJVHJhbnNtaXNzaW9uCVJlY2VwdGlvbgorCisJNwlFT00JCUVPTQorCTYJLQkJU2hvcnQgRnJhbWUKKwk1CS0JCUFib3J0CisJNAktCQlSZXNpZHVhbCBiaXQKKwkzCVVuZGVycnVuCU92ZXJydW4JCisJMgktCQlDUkMKKwkxCU93bmVyc2hpcAlPd25lcnNoaXAKKwkwCUVPVAkJLQorKi8KKyNkZWZpbmUgRFNUX0VPVAkJMHgwMQkvKiBFbmQgb2YgdHJhbnNtaXQgY29tbWFuZCAqLworI2RlZmluZSBEU1RfT1NCCQkweDAyCS8qIE93bmVyc2hpcCBiaXQgKi8KKyNkZWZpbmUgRFNUX0NSQwkJMHgwNAkvKiBDUkMgRXJyb3IgKi8KKyNkZWZpbmUgRFNUX09WUgkJMHgwOAkvKiBPdmVycnVuICovCisjZGVmaW5lIERTVF9VRFIJCTB4MDgJLyogVW5kZXJydW4gKi8KKyNkZWZpbmUgRFNUX1JCSVQJMHgxMAkvKiBSZXNpZHVhbCBiaXQgKi8KKyNkZWZpbmUgRFNUX0FCVAkJMHgyMAkvKiBBYm9ydCAqLworI2RlZmluZSBEU1RfU0hSVAkweDQwCS8qIFNob3J0IEZyYW1lICAqLworI2RlZmluZSBEU1RfRU9NCQkweDgwCS8qIEVuZCBvZiBNZXNzYWdlICAqLworCisvKiBQYWNrZXQgRGVzY3JpcHRvciBTdGF0dXMgYml0cyAqLworCisjZGVmaW5lIFNUX1RYX0VPTSAgICAgMHg4MAkvKiBFbmQgb2YgZnJhbWUgKi8KKyNkZWZpbmUgU1RfVFhfVU5EUlJVTiAweDA4CisjZGVmaW5lIFNUX1RYX09XTlJTSFAgMHgwMgorI2RlZmluZSBTVF9UWF9FT1QgICAgIDB4MDEJLyogRW5kIG9mIHRyYW5zbWl0aW9uICovCisKKyNkZWZpbmUgU1RfUlhfRU9NICAgICAweDgwCS8qIEVuZCBvZiBmcmFtZSAqLworI2RlZmluZSBTVF9SWF9TSE9SVCAgIDB4NDAJLyogU2hvcnQgZnJhbWUgKi8KKyNkZWZpbmUgU1RfUlhfQUJPUlQgICAweDIwCS8qIEFib3J0ICovCisjZGVmaW5lIFNUX1JYX1JFU0JJVCAgMHgxMAkvKiBSZXNpZHVhbCBiaXQgKi8KKyNkZWZpbmUgU1RfUlhfT1ZFUlJVTiAweDA4CS8qIE92ZXJydW4gKi8KKyNkZWZpbmUgU1RfUlhfQ1JDICAgICAweDA0CS8qIENSQyAqLworI2RlZmluZSBTVF9SWF9PV05SU0hQIDB4MDIKKworI2RlZmluZSBTVF9FUlJPUl9NQVNLIDB4N0MKKworLyogU3RhdHVzIENvdW50ZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIENNQ1IJMHgxNTgJLyogQ291bnRlciBNYXN0ZXIgQ3RsIFJlZyAqLworI2RlZmluZSBURUNOVEwJMHgxNjAJLyogVHggRU9NIENvdW50ZXIgTCAqLworI2RlZmluZSBURUNOVE0JMHgxNjEJLyogVHggRU9NIENvdW50ZXIgTSAqLworI2RlZmluZSBURUNOVEgJMHgxNjIJLyogVHggRU9NIENvdW50ZXIgSCAqLworI2RlZmluZSBURUNDUgkweDE2MwkvKiBUeCBFT00gQ291bnRlciBDdGwgUmVnICovCisjZGVmaW5lIFVSQ05UTAkweDE2NAkvKiBVbmRlcnJ1biBDb3VudGVyIEwgKi8KKyNkZWZpbmUgVVJDTlRICTB4MTY1CS8qIFVuZGVycnVuIENvdW50ZXIgSCAqLworI2RlZmluZSBVUkNDUgkweDE2NwkvKiBVbmRlcnJ1biBDb3VudGVyIEN0bCBSZWcgKi8KKyNkZWZpbmUgUkVDTlRMCTB4MTY4CS8qIFJ4IEVPTSBDb3VudGVyIEwgKi8KKyNkZWZpbmUgUkVDTlRNCTB4MTY5CS8qIFJ4IEVPTSBDb3VudGVyIE0gKi8KKyNkZWZpbmUgUkVDTlRICTB4MTZhCS8qIFJ4IEVPTSBDb3VudGVyIEggKi8KKyNkZWZpbmUgUkVDQ1IJMHgxNmIJLyogUnggRU9NIENvdW50ZXIgQ3RsIFJlZyAqLworI2RlZmluZSBPUkNOVEwJMHgxNmMJLyogT3ZlcnJ1biBDb3VudGVyIEwgKi8KKyNkZWZpbmUgT1JDTlRICTB4MTZkCS8qIE92ZXJydW4gQ291bnRlciBIICovCisjZGVmaW5lIE9SQ0NSCTB4MTZmCS8qIE92ZXJydW4gQ291bnRlciBDdGwgUmVnICovCisjZGVmaW5lIENFQ05UTAkweDE3MAkvKiBDUkMgQ291bnRlciBMICovCisjZGVmaW5lIENFQ05USAkweDE3MQkvKiBDUkMgQ291bnRlciBIICovCisjZGVmaW5lIENFQ0NSCTB4MTczCS8qIENSQyBDb3VudGVyIEN0bCBSZWcgKi8KKyNkZWZpbmUgQUJDTlRMCTB4MTc0CS8qIEFib3J0IGZyYW1lIENvdW50ZXIgTCAqLworI2RlZmluZSBBQkNOVEgJMHgxNzUJLyogQWJvcnQgZnJhbWUgQ291bnRlciBIICovCisjZGVmaW5lIEFCQ0NSCTB4MTc3CS8qIEFib3J0IGZyYW1lIENvdW50ZXIgQ3RsIFJlZyAqLworI2RlZmluZSBTSENOVEwJMHgxNzgJLyogU2hvcnQgZnJhbWUgQ291bnRlciBMICovCisjZGVmaW5lIFNIQ05USAkweDE3OQkvKiBTaG9ydCBmcmFtZSBDb3VudGVyIEggKi8KKyNkZWZpbmUgU0hDQ1IJMHgxN2IJLyogU2hvcnQgZnJhbWUgQ291bnRlciBDdGwgUmVnICovCisjZGVmaW5lIFJTQ05UTAkweDE3YwkvKiBSZXNpZHVhbCBiaXQgQ291bnRlciBMICovCisjZGVmaW5lIFJTQ05USAkweDE3ZAkvKiBSZXNpZHVhbCBiaXQgQ291bnRlciBIICovCisjZGVmaW5lIFJTQ0NSCTB4MTdmCS8qIFJlc2lkdWFsIGJpdCBDb3VudGVyIEN0bCBSZWcgKi8KKworLyogUmVnaXN0ZXIgUHJvZ3JhbW1pbmcgQ29uc3RhbnRzICovCisKKyNkZWZpbmUgSVIwX0RNSUMJMHgwMDAwMDAwMQorI2RlZmluZSBJUjBfRE1JQgkweDAwMDAwMDAyCisjZGVmaW5lIElSMF9ETUlBCTB4MDAwMDAwMDQKKyNkZWZpbmUgSVIwX0VGVAkJMHgwMDAwMDAwOAorI2RlZmluZSBJUjBfRE1BUkVRCTB4MDAwMTAwMDAKKyNkZWZpbmUgSVIwX1RYSU5UCTB4MDAwMjAwMDAKKyNkZWZpbmUgSVIwX1JYSU5UQgkweDAwMDQwMDAwCisjZGVmaW5lIElSMF9SWElOVEEJMHgwMDA4MDAwMAorI2RlZmluZSBJUjBfVFhSRFkJMHgwMDEwMDAwMAorI2RlZmluZSBJUjBfUlhSRFkJMHgwMDIwMDAwMAorCisjZGVmaW5lIE1EMF9DUkMxNl8wCTB4MDAKKyNkZWZpbmUgTUQwX0NSQzE2XzEJMHgwMQorI2RlZmluZSBNRDBfQ1JDMzIJMHgwMgorI2RlZmluZSBNRDBfQ1JDX0NDSVRUCTB4MDMKKyNkZWZpbmUgTUQwX0NSQ0MwCTB4MDQKKyNkZWZpbmUgTUQwX0NSQ0MxCTB4MDgKKyNkZWZpbmUgTUQwX0FVVE9fRU5BCTB4MTAKKyNkZWZpbmUgTUQwX0FTWU5DCTB4MDAKKyNkZWZpbmUgTUQwX0JZX01TWU5DCTB4MjAKKyNkZWZpbmUgTUQwX0JZX0JJU1lOQwkweDQwCisjZGVmaW5lIE1EMF9CWV9FWFQJMHg2MAorI2RlZmluZSBNRDBfQklUX1NZTkMJMHg4MAorI2RlZmluZSBNRDBfVFJBTlNQCTB4YzAKKworI2RlZmluZSBNRDBfSERMQyAgICAgICAgMHg4MAkvKiBCaXQtc3luYyBIRExDIG1vZGUgKi8KKworI2RlZmluZSBNRDBfQ1JDX05PTkUJMHgwMAorI2RlZmluZSBNRDBfQ1JDXzE2XzAJMHgwNAorI2RlZmluZSBNRDBfQ1JDXzE2CTB4MDUKKyNkZWZpbmUgTUQwX0NSQ19JVFUzMgkweDA2CisjZGVmaW5lIE1EMF9DUkNfSVRVCTB4MDcKKworI2RlZmluZSBNRDFfTk9BRERSCTB4MDAKKyNkZWZpbmUgTUQxX1NBRERSMQkweDQwCisjZGVmaW5lIE1EMV9TQUREUjIJMHg4MAorI2RlZmluZSBNRDFfREFERFIJMHhjMAorCisjZGVmaW5lIE1EMl9OUlpJX0lFRUUJMHg0MAorI2RlZmluZSBNRDJfTUFOQ0hFU1RFUgkweDgwCisjZGVmaW5lIE1EMl9GTV9NQVJLCTB4QTAKKyNkZWZpbmUgTUQyX0ZNX1NQQUNFCTB4QzAKKyNkZWZpbmUgTUQyX0xPT1BCQUNLCTB4MDMJLyogTG9jYWwgZGF0YSBMb29wYmFjayAqLworCisjZGVmaW5lIE1EMl9GX0RVUExFWAkweDAwCisjZGVmaW5lIE1EMl9BVVRPX0VDSE8JMHgwMQorI2RlZmluZSBNRDJfTE9PUF9ISV9aCTB4MDIKKyNkZWZpbmUgTUQyX0xPT1BfTUlSCTB4MDMKKyNkZWZpbmUgTUQyX0FEUExMX1g4CTB4MDAKKyNkZWZpbmUgTUQyX0FEUExMX1gxNgkweDA4CisjZGVmaW5lIE1EMl9BRFBMTF9YMzIJMHgxMAorI2RlZmluZSBNRDJfTlJaCQkweDAwCisjZGVmaW5lIE1EMl9OUlpJCTB4MjAKKyNkZWZpbmUgTUQyX05SWl9JRUVFCTB4NDAKKyNkZWZpbmUgTUQyX01BTkNICTB4MDAKKyNkZWZpbmUgTUQyX0ZNMQkJMHgyMAorI2RlZmluZSBNRDJfRk0wCQkweDQwCisjZGVmaW5lIE1EMl9GTQkJMHg4MAorCisjZGVmaW5lIENUTF9SVFMJCTB4MDEKKyNkZWZpbmUgQ1RMX0RUUgkJMHgwMgorI2RlZmluZSBDVExfU1lOCQkweDA0CisjZGVmaW5lIENUTF9JRExDCTB4MTAKKyNkZWZpbmUgQ1RMX1VEUk5DCTB4MjAKKyNkZWZpbmUgQ1RMX1VSU0tQCTB4NDAKKyNkZWZpbmUgQ1RMX1VSQ1QJMHg4MAorCisjZGVmaW5lIENUTF9OT1JUUwkweDAxCisjZGVmaW5lIENUTF9OT0RUUgkweDAyCisjZGVmaW5lIENUTF9JRExFCTB4MTAKKworI2RlZmluZQlSWFNfQlIwCQkweDAxCisjZGVmaW5lCVJYU19CUjEJCTB4MDIKKyNkZWZpbmUJUlhTX0JSMgkJMHgwNAorI2RlZmluZQlSWFNfQlIzCQkweDA4CisjZGVmaW5lCVJYU19FQ0xLCTB4MDAKKyNkZWZpbmUJUlhTX0VDTEtfTlMJMHgyMAorI2RlZmluZQlSWFNfSUJSRwkweDQwCisjZGVmaW5lCVJYU19QTEwxCTB4NTAKKyNkZWZpbmUJUlhTX1BMTDIJMHg2MAorI2RlZmluZQlSWFNfUExMMwkweDcwCisjZGVmaW5lCVJYU19EUlRYQwkweDgwCisKKyNkZWZpbmUJVFhTX0JSMAkJMHgwMQorI2RlZmluZQlUWFNfQlIxCQkweDAyCisjZGVmaW5lCVRYU19CUjIJCTB4MDQKKyNkZWZpbmUJVFhTX0JSMwkJMHgwOAorI2RlZmluZQlUWFNfRUNMSwkweDAwCisjZGVmaW5lCVRYU19JQlJHCTB4NDAKKyNkZWZpbmUJVFhTX1JDTEsJMHg2MAorI2RlZmluZQlUWFNfRFRSWEMJMHg4MAorCisjZGVmaW5lCUVYU19SRVMwCTB4MDEKKyNkZWZpbmUJRVhTX1JFUzEJMHgwMgorI2RlZmluZQlFWFNfUkVTMgkweDA0CisjZGVmaW5lCUVYU19URVMwCTB4MTAKKyNkZWZpbmUJRVhTX1RFUzEJMHgyMAorI2RlZmluZQlFWFNfVEVTMgkweDQwCisKKyNkZWZpbmUgQ0xLX0JSR19NQVNLCTB4MEYKKyNkZWZpbmUgQ0xLX1BJTl9PVVQJMHg4MAorI2RlZmluZSBDTEtfTElORSAgICAJMHgwMAkvKiBjbG9jayBsaW5lIGlucHV0ICovCisjZGVmaW5lIENMS19CUkcgICAgIAkweDQwCS8qIGludGVybmFsIGJhdWQgcmF0ZSBnZW5lcmF0b3IgKi8KKyNkZWZpbmUgQ0xLX1RYX1JYQ0xLCTB4NjAJLyogVFggY2xvY2sgZnJvbSBSWCBjbG9jayAqLworCisjZGVmaW5lIENNRF9SWF9SU1QJMHgxMQorI2RlZmluZSBDTURfUlhfRU5BCTB4MTIKKyNkZWZpbmUgQ01EX1JYX0RJUwkweDEzCisjZGVmaW5lIENNRF9SWF9DUkNfSU5JVAkweDE0CisjZGVmaW5lIENNRF9SWF9NU0dfUkVKCTB4MTUKKyNkZWZpbmUgQ01EX1JYX01QX1NSQ0gJMHgxNgorI2RlZmluZSBDTURfUlhfQ1JDX0VYQwkweDE3CisjZGVmaW5lIENNRF9SWF9DUkNfRlJDCTB4MTgKKyNkZWZpbmUgQ01EX1RYX1JTVAkweDAxCisjZGVmaW5lIENNRF9UWF9FTkEJMHgwMgorI2RlZmluZSBDTURfVFhfRElTQQkweDAzCisjZGVmaW5lIENNRF9UWF9DUkNfSU5JVAkweDA0CisjZGVmaW5lIENNRF9UWF9DUkNfRVhDCTB4MDUKKyNkZWZpbmUgQ01EX1RYX0VPTQkweDA2CisjZGVmaW5lIENNRF9UWF9BQk9SVAkweDA3CisjZGVmaW5lIENNRF9UWF9NUF9PTgkweDA4CisjZGVmaW5lIENNRF9UWF9CVUZfQ0xSCTB4MDkKKyNkZWZpbmUgQ01EX1RYX0RJU0IJMHgwYgorI2RlZmluZSBDTURfQ0hfUlNUCTB4MjEKKyNkZWZpbmUgQ01EX1NSQ0hfTU9ERQkweDMxCisjZGVmaW5lIENNRF9OT1AJCTB4MDAKKworI2RlZmluZSBDTURfUkVTRVQJMHgyMQorI2RlZmluZSBDTURfVFhfRU5BQkxFCTB4MDIKKyNkZWZpbmUgQ01EX1JYX0VOQUJMRQkweDEyCisKKyNkZWZpbmUgU1QwX1JYUkRZCTB4MDEKKyNkZWZpbmUgU1QwX1RYUkRZCTB4MDIKKyNkZWZpbmUgU1QwX1JYSU5UQgkweDIwCisjZGVmaW5lIFNUMF9SWElOVEEJMHg0MAorI2RlZmluZSBTVDBfVFhJTlQJMHg4MAorCisjZGVmaW5lIFNUMV9JRExFCTB4MDEKKyNkZWZpbmUgU1QxX0FCT1JUCTB4MDIKKyNkZWZpbmUgU1QxX0NEQ0QJMHgwNAorI2RlZmluZSBTVDFfQ0NUUwkweDA4CisjZGVmaW5lIFNUMV9TWU5fRkxBRwkweDEwCisjZGVmaW5lIFNUMV9DTE1ECTB4MjAKKyNkZWZpbmUgU1QxX1RYSURMRQkweDQwCisjZGVmaW5lIFNUMV9VRFJOCTB4ODAKKworI2RlZmluZSBTVDJfQ1JDRQkweDA0CisjZGVmaW5lIFNUMl9PTlJOCTB4MDgKKyNkZWZpbmUgU1QyX1JCSVQJMHgxMAorI2RlZmluZSBTVDJfQUJPUlQJMHgyMAorI2RlZmluZSBTVDJfU0hPUlQJMHg0MAorI2RlZmluZSBTVDJfRU9NCQkweDgwCisKKyNkZWZpbmUgU1QzX1JYX0VOQQkweDAxCisjZGVmaW5lIFNUM19UWF9FTkEJMHgwMgorI2RlZmluZSBTVDNfRENECQkweDA0CisjZGVmaW5lIFNUM19DVFMJCTB4MDgKKyNkZWZpbmUgU1QzX1NSQ0hfTU9ERQkweDEwCisjZGVmaW5lIFNUM19TTE9PUAkweDIwCisjZGVmaW5lIFNUM19HUEkJCTB4ODAKKworI2RlZmluZSBTVDRfUkROUgkweDAxCisjZGVmaW5lIFNUNF9SRENSCTB4MDIKKyNkZWZpbmUgU1Q0X1RETlIJMHgwNAorI2RlZmluZSBTVDRfVERDUgkweDA4CisjZGVmaW5lIFNUNF9PQ0xNCTB4MjAKKyNkZWZpbmUgU1Q0X0NGVAkJMHg0MAorI2RlZmluZSBTVDRfQ0dQSQkweDgwCisKKyNkZWZpbmUgRlNUX0NSQ0VGCTB4MDQKKyNkZWZpbmUgRlNUX09WUk5GCTB4MDgKKyNkZWZpbmUgRlNUX1JCSUYJMHgxMAorI2RlZmluZSBGU1RfQUJURgkweDIwCisjZGVmaW5lIEZTVF9TSFJURgkweDQwCisjZGVmaW5lIEZTVF9FT01GCTB4ODAKKworI2RlZmluZSBJRTBfUlhSRFkJMHgwMQorI2RlZmluZSBJRTBfVFhSRFkJMHgwMgorI2RlZmluZSBJRTBfUlhJTlRCCTB4MjAKKyNkZWZpbmUgSUUwX1JYSU5UQQkweDQwCisjZGVmaW5lIElFMF9UWElOVAkweDgwCisjZGVmaW5lIElFMF9VRFJOCTB4MDAwMDgwMDAgLyogVFggdW5kZXJydW4gTVNDSSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIElFMF9DRENECTB4MDAwMDA0MDAgLyogQ0QgbGV2ZWwgY2hhbmdlIGludGVycnVwdCBlbmFibGUgKi8KKworI2RlZmluZSBJRTFfSURMRAkweDAxCisjZGVmaW5lIElFMV9BQlRECTB4MDIKKyNkZWZpbmUgSUUxX0NEQ0QJMHgwNAorI2RlZmluZSBJRTFfQ0NUUwkweDA4CisjZGVmaW5lIElFMV9TWU5DRAkweDEwCisjZGVmaW5lIElFMV9DTE1ECTB4MjAKKyNkZWZpbmUgSUUxX0lETAkJMHg0MAorI2RlZmluZSBJRTFfVURSTgkweDgwCisKKyNkZWZpbmUgSUUyX0NSQ0UJMHgwNAorI2RlZmluZSBJRTJfT1ZSTgkweDA4CisjZGVmaW5lIElFMl9SQklUCTB4MTAKKyNkZWZpbmUgSUUyX0FCVAkJMHgyMAorI2RlZmluZSBJRTJfU0hSVAkweDQwCisjZGVmaW5lIElFMl9FT00JCTB4ODAKKworI2RlZmluZSBJRTRfUkROUgkweDAxCisjZGVmaW5lIElFNF9SRENSCTB4MDIKKyNkZWZpbmUgSUU0X1RETlIJMHgwNAorI2RlZmluZSBJRTRfVERDUgkweDA4CisjZGVmaW5lIElFNF9PQ0xNCTB4MjAKKyNkZWZpbmUgSUU0X0NGVAkJMHg0MAorI2RlZmluZSBJRTRfQ0dQSQkweDgwCisKKyNkZWZpbmUgRklFX0NSQ0VGCTB4MDQKKyNkZWZpbmUgRklFX09WUk5GCTB4MDgKKyNkZWZpbmUgRklFX1JCSUYJMHgxMAorI2RlZmluZSBGSUVfQUJURgkweDIwCisjZGVmaW5lIEZJRV9TSFJURgkweDQwCisjZGVmaW5lIEZJRV9FT01GCTB4ODAKKworI2RlZmluZSBEU1JfRFdFCQkweDAxCisjZGVmaW5lIERTUl9ERQkJMHgwMgorI2RlZmluZSBEU1JfUkVGCQkweDA0CisjZGVmaW5lIERTUl9VRFJGCTB4MDQKKyNkZWZpbmUgRFNSX0NPQQkJMHgwOAorI2RlZmluZSBEU1JfQ09GCQkweDEwCisjZGVmaW5lIERTUl9CT0YJCTB4MjAKKyNkZWZpbmUgRFNSX0VPTQkJMHg0MAorI2RlZmluZSBEU1JfRU9UCQkweDgwCisKKyNkZWZpbmUgRElSX1JFRgkJMHgwNAorI2RlZmluZSBESVJfVURSRgkweDA0CisjZGVmaW5lIERJUl9DT0EJCTB4MDgKKyNkZWZpbmUgRElSX0NPRgkJMHgxMAorI2RlZmluZSBESVJfQk9GCQkweDIwCisjZGVmaW5lIERJUl9FT00JCTB4NDAKKyNkZWZpbmUgRElSX0VPVAkJMHg4MAorCisjZGVmaW5lIERJUl9SRUZFCTB4MDQKKyNkZWZpbmUgRElSX1VEUkZFCTB4MDQKKyNkZWZpbmUgRElSX0NPQUUJMHgwOAorI2RlZmluZSBESVJfQ09GRQkweDEwCisjZGVmaW5lIERJUl9CT0ZFCTB4MjAKKyNkZWZpbmUgRElSX0VPTUUJMHg0MAorI2RlZmluZSBESVJfRU9URQkweDgwCisKKyNkZWZpbmUgRE1SX0NOVEUJMHgwMgorI2RlZmluZSBETVJfTkYJCTB4MDQKKyNkZWZpbmUgRE1SX1NFT01FCTB4MDgKKyNkZWZpbmUgRE1SX1RNT0QJMHgxMAorCisjZGVmaW5lIERNRVJfRE1FICAgICAgICAweDgwCS8qIERNQSBNYXN0ZXIgRW5hYmxlICovCisKKyNkZWZpbmUgRENSX1NXX0FCVAkweDAxCisjZGVmaW5lIERDUl9GQ1RfQ0xSCTB4MDIKKworI2RlZmluZSBEQ1JfQUJPUlQJMHgwMQorI2RlZmluZSBEQ1JfQ0xFQVJfRU9GCTB4MDIKKworI2RlZmluZSBQQ1JfQ09URQkweDgwCisjZGVmaW5lIFBDUl9QUjAJCTB4MDEKKyNkZWZpbmUgUENSX1BSMQkJMHgwMgorI2RlZmluZSBQQ1JfUFIyCQkweDA0CisjZGVmaW5lIFBDUl9DQ0MJCTB4MDgKKyNkZWZpbmUgUENSX0JSQwkJMHgxMAorI2RlZmluZSBQQ1JfT1NCCQkweDQwCisjZGVmaW5lIFBDUl9CVVJTVAkweDgwCisKKyNlbmRpZiAvKiAoX19IRDY0NTcyX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGQ2NDU3eC5jIGIvZHJpdmVycy9uZXQvd2FuL2hkNjQ1N3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzc0MzMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkNjQ1N3guYwpAQCAtMCwwICsxLDg1MyBAQAorLyoKKyAqIEhpdGFjaGkgU0NBIEhENjQ1NzAgYW5kIEhENjQ1NzIgY29tbW9uIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogU291cmNlcyBvZiBpbmZvcm1hdGlvbjoKKyAqICAgIEhpdGFjaGkgSEQ2NDU3MCBTQ0EgVXNlcidzIE1hbnVhbAorICogICAgSGl0YWNoaSBIRDY0NTcyIFNDQS1JSSBVc2VyJ3MgTWFudWFsCisgKgorICogV2UgdXNlIHRoZSBmb2xsb3dpbmcgU0NBIG1lbW9yeSBtYXA6CisgKgorICogUGFja2V0IGJ1ZmZlciBkZXNjcmlwdG9yIHJpbmdzIC0gc3RhcnRpbmcgZnJvbSB3aW5iYXNlIG9yIHdpbjBiYXNlOgorICogcnhfcmluZ19idWZmZXJzICogc2l6ZW9mKHBrdF9kZXNjKSA9IGxvZ2ljYWwgY2hhbm5lbCAjMCBSWCByaW5nCisgKiB0eF9yaW5nX2J1ZmZlcnMgKiBzaXplb2YocGt0X2Rlc2MpID0gbG9naWNhbCBjaGFubmVsICMwIFRYIHJpbmcKKyAqIHJ4X3JpbmdfYnVmZmVycyAqIHNpemVvZihwa3RfZGVzYykgPSBsb2dpY2FsIGNoYW5uZWwgIzEgUlggcmluZyAoaWYgdXNlZCkKKyAqIHR4X3JpbmdfYnVmZmVycyAqIHNpemVvZihwa3RfZGVzYykgPSBsb2dpY2FsIGNoYW5uZWwgIzEgVFggcmluZyAoaWYgdXNlZCkKKyAqCisgKiBQYWNrZXQgZGF0YSBidWZmZXJzIC0gc3RhcnRpbmcgZnJvbSB3aW5iYXNlICsgYnVmZl9vZmZzZXQ6CisgKiByeF9yaW5nX2J1ZmZlcnMgKiBIRExDX01BWF9NUlUgICAgID0gbG9naWNhbCBjaGFubmVsICMwIFJYIGJ1ZmZlcnMKKyAqIHR4X3JpbmdfYnVmZmVycyAqIEhETENfTUFYX01SVSAgICAgPSBsb2dpY2FsIGNoYW5uZWwgIzAgVFggYnVmZmVycworICogcnhfcmluZ19idWZmZXJzICogSERMQ19NQVhfTVJVICAgICA9IGxvZ2ljYWwgY2hhbm5lbCAjMCBSWCBidWZmZXJzIChpZiB1c2VkKQorICogdHhfcmluZ19idWZmZXJzICogSERMQ19NQVhfTVJVICAgICA9IGxvZ2ljYWwgY2hhbm5lbCAjMCBUWCBidWZmZXJzIChpZiB1c2VkKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKworI2lmICghZGVmaW5lZCAoX19IRDY0NTcwX0gpICYmICFkZWZpbmVkIChfX0hENjQ1NzJfSCkpIHx8IFwKKyAgICAoZGVmaW5lZCAoX19IRDY0NTcwX0gpICYmIGRlZmluZWQgKF9fSEQ2NDU3Ml9IKSkKKyNlcnJvciBFaXRoZXIgaGQ2NDU3MC5oIG9yIGhkNjQ1NzIuaCBtdXN0IGJlIGluY2x1ZGVkCisjZW5kaWYKKworI2RlZmluZSBnZXRfbXNjaShwb3J0KQkgIChwaHlfbm9kZShwb3J0KSA/ICAgTVNDSTFfT0ZGU0VUIDogICBNU0NJMF9PRkZTRVQpCisjZGVmaW5lIGdldF9kbWFjX3J4KHBvcnQpIChwaHlfbm9kZShwb3J0KSA/IERNQUMxUlhfT0ZGU0VUIDogRE1BQzBSWF9PRkZTRVQpCisjZGVmaW5lIGdldF9kbWFjX3R4KHBvcnQpIChwaHlfbm9kZShwb3J0KSA/IERNQUMxVFhfT0ZGU0VUIDogRE1BQzBUWF9PRkZTRVQpCisKKyNkZWZpbmUgU0NBX0lOVFJfTVNDSShub2RlKSAgICAobm9kZSA/IDB4MTAgOiAweDAxKQorI2RlZmluZSBTQ0FfSU5UUl9ETUFDX1JYKG5vZGUpIChub2RlID8gMHgyMCA6IDB4MDIpCisjZGVmaW5lIFNDQV9JTlRSX0RNQUNfVFgobm9kZSkgKG5vZGUgPyAweDQwIDogMHgwNCkKKworI2lmZGVmIF9fSEQ2NDU3MF9IIC8qIEhENjQ1NzAgKi8KKyNkZWZpbmUgc2NhX291dGEodmFsdWUsIHJlZywgY2FyZCkJc2NhX291dHcodmFsdWUsIHJlZywgY2FyZCkKKyNkZWZpbmUgc2NhX2luYShyZWcsIGNhcmQpCQlzY2FfaW53KHJlZywgY2FyZCkKKyNkZWZpbmUgd3JpdGVhKHZhbHVlLCBwdHIpCQl3cml0ZXcodmFsdWUsIHB0cikKKworI2Vsc2UgLyogSEQ2NDU3MiAqLworI2RlZmluZSBzY2Ffb3V0YSh2YWx1ZSwgcmVnLCBjYXJkKQlzY2Ffb3V0bCh2YWx1ZSwgcmVnLCBjYXJkKQorI2RlZmluZSBzY2FfaW5hKHJlZywgY2FyZCkJCXNjYV9pbmwocmVnLCBjYXJkKQorI2RlZmluZSB3cml0ZWEodmFsdWUsIHB0cikJCXdyaXRlbCh2YWx1ZSwgcHRyKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UgKnBvcnRfdG9fZGV2KHBvcnRfdCAqcG9ydCkKK3sKKwlyZXR1cm4gcG9ydC0+ZGV2OworfQorCitzdGF0aWMgaW5saW5lIGludCBzY2FfaW50cl9zdGF0dXMoY2FyZF90ICpjYXJkKQoreworCXU4IHJlc3VsdCA9IDA7CisKKyNpZmRlZiBfX0hENjQ1NzBfSCAvKiBIRDY0NTcwICovCisJdTggaXNyMCA9IHNjYV9pbihJU1IwLCBjYXJkKTsKKwl1OCBpc3IxID0gc2NhX2luKElTUjEsIGNhcmQpOworCisJaWYgKGlzcjEgJiAweDAzKSByZXN1bHQgfD0gU0NBX0lOVFJfRE1BQ19SWCgwKTsKKwlpZiAoaXNyMSAmIDB4MEMpIHJlc3VsdCB8PSBTQ0FfSU5UUl9ETUFDX1RYKDApOworCWlmIChpc3IxICYgMHgzMCkgcmVzdWx0IHw9IFNDQV9JTlRSX0RNQUNfUlgoMSk7CisJaWYgKGlzcjEgJiAweEMwKSByZXN1bHQgfD0gU0NBX0lOVFJfRE1BQ19UWCgxKTsKKwlpZiAoaXNyMCAmIDB4MEYpIHJlc3VsdCB8PSBTQ0FfSU5UUl9NU0NJKDApOworCWlmIChpc3IwICYgMHhGMCkgcmVzdWx0IHw9IFNDQV9JTlRSX01TQ0koMSk7CisKKyNlbHNlIC8qIEhENjQ1NzIgKi8KKwl1MzIgaXNyMCA9IHNjYV9pbmwoSVNSMCwgY2FyZCk7CisKKwlpZiAoaXNyMCAmIDB4MDAwMDAwMEYpIHJlc3VsdCB8PSBTQ0FfSU5UUl9ETUFDX1JYKDApOworCWlmIChpc3IwICYgMHgwMDAwMDBGMCkgcmVzdWx0IHw9IFNDQV9JTlRSX0RNQUNfVFgoMCk7CisJaWYgKGlzcjAgJiAweDAwMDAwRjAwKSByZXN1bHQgfD0gU0NBX0lOVFJfRE1BQ19SWCgxKTsKKwlpZiAoaXNyMCAmIDB4MDAwMEYwMDApIHJlc3VsdCB8PSBTQ0FfSU5UUl9ETUFDX1RYKDEpOworCWlmIChpc3IwICYgMHgwMDNFMDAwMCkgcmVzdWx0IHw9IFNDQV9JTlRSX01TQ0koMCk7CisJaWYgKGlzcjAgJiAweDNFMDAwMDAwKSByZXN1bHQgfD0gU0NBX0lOVFJfTVNDSSgxKTsKKworI2VuZGlmIC8qIEhENjQ1NzAgdnMgSEQ2NDU3MiAqLworCisJaWYgKCEocmVzdWx0ICYgU0NBX0lOVFJfRE1BQ19UWCgwKSkpCisJCWlmIChzY2FfaW4oRFNSX1RYKDApLCBjYXJkKSAmIERTUl9FT00pCisJCQlyZXN1bHQgfD0gU0NBX0lOVFJfRE1BQ19UWCgwKTsKKwlpZiAoIShyZXN1bHQgJiBTQ0FfSU5UUl9ETUFDX1RYKDEpKSkKKwkJaWYgKHNjYV9pbihEU1JfVFgoMSksIGNhcmQpICYgRFNSX0VPTSkKKwkJCXJlc3VsdCB8PSBTQ0FfSU5UUl9ETUFDX1RYKDEpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBwb3J0X3QqIGRldl90b19wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldl90b19oZGxjKGRldiktPnByaXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IG5leHRfZGVzYyhwb3J0X3QgKnBvcnQsIHUxNiBkZXNjLCBpbnQgdHJhbnNtaXQpCit7CisJcmV0dXJuIChkZXNjICsgMSkgJSAodHJhbnNtaXQgPyBwb3J0X3RvX2NhcmQocG9ydCktPnR4X3JpbmdfYnVmZmVycworCQkJICAgICA6IHBvcnRfdG9fY2FyZChwb3J0KS0+cnhfcmluZ19idWZmZXJzKTsKK30KKworCisKK3N0YXRpYyBpbmxpbmUgdTE2IGRlc2NfYWJzX251bWJlcihwb3J0X3QgKnBvcnQsIHUxNiBkZXNjLCBpbnQgdHJhbnNtaXQpCit7CisJdTE2IHJ4X2J1ZmZzID0gcG9ydF90b19jYXJkKHBvcnQpLT5yeF9yaW5nX2J1ZmZlcnM7CisJdTE2IHR4X2J1ZmZzID0gcG9ydF90b19jYXJkKHBvcnQpLT50eF9yaW5nX2J1ZmZlcnM7CisKKwlkZXNjICU9ICh0cmFuc21pdCA/IHR4X2J1ZmZzIDogcnhfYnVmZnMpOyAvLyBjYWxsZWQgd2l0aCAiWCArIDEiIGV0Yy4KKwlyZXR1cm4gbG9nX25vZGUocG9ydCkgKiAocnhfYnVmZnMgKyB0eF9idWZmcykgKworCQl0cmFuc21pdCAqIHJ4X2J1ZmZzICsgZGVzYzsKK30KKworCisKK3N0YXRpYyBpbmxpbmUgdTE2IGRlc2Nfb2Zmc2V0KHBvcnRfdCAqcG9ydCwgdTE2IGRlc2MsIGludCB0cmFuc21pdCkKK3sKKwkvKiBEZXNjcmlwdG9yIG9mZnNldCBhbHdheXMgZml0cyBpbiAxNiBieXRlcyAqLworCXJldHVybiBkZXNjX2Fic19udW1iZXIocG9ydCwgZGVzYywgdHJhbnNtaXQpICogc2l6ZW9mKHBrdF9kZXNjKTsKK30KKworCisKK3N0YXRpYyBpbmxpbmUgcGt0X2Rlc2MgX19pb21lbSAqZGVzY19hZGRyZXNzKHBvcnRfdCAqcG9ydCwgdTE2IGRlc2MsIGludCB0cmFuc21pdCkKK3sKKyNpZmRlZiBQQUdFMF9BTFdBWVNfTUFQUEVECisJcmV0dXJuIChwa3RfZGVzYyBfX2lvbWVtICopKHdpbjBiYXNlKHBvcnRfdG9fY2FyZChwb3J0KSkKKwkJCSAgICsgZGVzY19vZmZzZXQocG9ydCwgZGVzYywgdHJhbnNtaXQpKTsKKyNlbHNlCisJcmV0dXJuIChwa3RfZGVzYyBfX2lvbWVtICopKHdpbmJhc2UocG9ydF90b19jYXJkKHBvcnQpKQorCQkJICAgKyBkZXNjX29mZnNldChwb3J0LCBkZXNjLCB0cmFuc21pdCkpOworI2VuZGlmCit9CisKKworCitzdGF0aWMgaW5saW5lIHUzMiBidWZmZXJfb2Zmc2V0KHBvcnRfdCAqcG9ydCwgdTE2IGRlc2MsIGludCB0cmFuc21pdCkKK3sKKwlyZXR1cm4gcG9ydF90b19jYXJkKHBvcnQpLT5idWZmX29mZnNldCArCisJCWRlc2NfYWJzX251bWJlcihwb3J0LCBkZXNjLCB0cmFuc21pdCkgKiAodTMyKUhETENfTUFYX01SVTsKK30KKworCisKK3N0YXRpYyB2b2lkIHNjYV9pbml0X3N5bmNfcG9ydChwb3J0X3QgKnBvcnQpCit7CisJY2FyZF90ICpjYXJkID0gcG9ydF90b19jYXJkKHBvcnQpOworCWludCB0cmFuc21pdCwgaTsKKworCXBvcnQtPnJ4aW4gPSAwOworCXBvcnQtPnR4aW4gPSAwOworCXBvcnQtPnR4bGFzdCA9IDA7CisKKyNpZiAhZGVmaW5lZChQQUdFMF9BTFdBWVNfTUFQUEVEKSAmJiAhZGVmaW5lZChBTExfUEFHRVNfQUxXQVlTX01BUFBFRCkKKwlvcGVud2luKGNhcmQsIDApOworI2VuZGlmCisKKwlmb3IgKHRyYW5zbWl0ID0gMDsgdHJhbnNtaXQgPCAyOyB0cmFuc21pdCsrKSB7CisJCXUxNiBkbWFjID0gdHJhbnNtaXQgPyBnZXRfZG1hY190eChwb3J0KSA6IGdldF9kbWFjX3J4KHBvcnQpOworCQl1MTYgYnVmZnMgPSB0cmFuc21pdCA/IGNhcmQtPnR4X3JpbmdfYnVmZmVycworCQkJOiBjYXJkLT5yeF9yaW5nX2J1ZmZlcnM7CisKKwkJZm9yIChpID0gMDsgaSA8IGJ1ZmZzOyBpKyspIHsKKwkJCXBrdF9kZXNjIF9faW9tZW0gKmRlc2MgPSBkZXNjX2FkZHJlc3MocG9ydCwgaSwgdHJhbnNtaXQpOworCQkJdTE2IGNoYWluX29mZiA9IGRlc2Nfb2Zmc2V0KHBvcnQsIGkgKyAxLCB0cmFuc21pdCk7CisJCQl1MzIgYnVmZl9vZmYgPSBidWZmZXJfb2Zmc2V0KHBvcnQsIGksIHRyYW5zbWl0KTsKKworCQkJd3JpdGVhKGNoYWluX29mZiwgJmRlc2MtPmNwKTsKKwkJCXdyaXRlbChidWZmX29mZiwgJmRlc2MtPmJwKTsKKwkJCXdyaXRldygwLCAmZGVzYy0+bGVuKTsKKwkJCXdyaXRlYigwLCAmZGVzYy0+c3RhdCk7CisJCX0KKworCQkvKiBETUEgZGlzYWJsZSAtIHRvIGhhbHQgc3RhdGUgKi8KKwkJc2NhX291dCgwLCB0cmFuc21pdCA/IERTUl9UWChwaHlfbm9kZShwb3J0KSkgOgorCQkJRFNSX1JYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCk7CisJCS8qIHNvZnR3YXJlIEFCT1JUIC0gdG8gaW5pdGlhbCBzdGF0ZSAqLworCQlzY2Ffb3V0KERDUl9BQk9SVCwgdHJhbnNtaXQgPyBEQ1JfVFgocGh5X25vZGUocG9ydCkpIDoKKwkJCURDUl9SWChwaHlfbm9kZShwb3J0KSksIGNhcmQpOworCisjaWZkZWYgX19IRDY0NTcwX0gKKwkJc2NhX291dCgwLCBkbWFjICsgQ1BCLCBjYXJkKTsgLyogcG9pbnRlciBiYXNlICovCisjZW5kaWYKKwkJLyogY3VycmVudCBkZXNjIGFkZHIgKi8KKwkJc2NhX291dGEoZGVzY19vZmZzZXQocG9ydCwgMCwgdHJhbnNtaXQpLCBkbWFjICsgQ0RBTCwgY2FyZCk7CisJCWlmICghdHJhbnNtaXQpCisJCQlzY2Ffb3V0YShkZXNjX29mZnNldChwb3J0LCBidWZmcyAtIDEsIHRyYW5zbWl0KSwKKwkJCQkgZG1hYyArIEVEQUwsIGNhcmQpOworCQllbHNlCisJCQlzY2Ffb3V0YShkZXNjX29mZnNldChwb3J0LCAwLCB0cmFuc21pdCksIGRtYWMgKyBFREFMLAorCQkJCSBjYXJkKTsKKworCQkvKiBjbGVhciBmcmFtZSBlbmQgaW50ZXJydXB0IGNvdW50ZXIgKi8KKwkJc2NhX291dChEQ1JfQ0xFQVJfRU9GLCB0cmFuc21pdCA/IERDUl9UWChwaHlfbm9kZShwb3J0KSkgOgorCQkJRENSX1JYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCk7CisKKwkJaWYgKCF0cmFuc21pdCkgeyAvKiBSZWNlaXZlICovCisJCQkvKiBzZXQgYnVmZmVyIGxlbmd0aCAqLworCQkJc2NhX291dHcoSERMQ19NQVhfTVJVLCBkbWFjICsgQkZMTCwgY2FyZCk7CisJCQkvKiBDaGFpbiBtb2RlLCBNdWx0aS1mcmFtZSAqLworCQkJc2NhX291dCgweDE0LCBETVJfUlgocGh5X25vZGUocG9ydCkpLCBjYXJkKTsKKwkJCXNjYV9vdXQoRElSX0VPTUUgfCBESVJfQk9GRSwgRElSX1JYKHBoeV9ub2RlKHBvcnQpKSwKKwkJCQljYXJkKTsKKwkJCS8qIERNQSBlbmFibGUgKi8KKwkJCXNjYV9vdXQoRFNSX0RFLCBEU1JfUlgocGh5X25vZGUocG9ydCkpLCBjYXJkKTsKKwkJfSBlbHNlIHsJLyogVHJhbnNtaXQgKi8KKwkJCS8qIENoYWluIG1vZGUsIE11bHRpLWZyYW1lICovCisJCQlzY2Ffb3V0KDB4MTQsIERNUl9UWChwaHlfbm9kZShwb3J0KSksIGNhcmQpOworCQkJLyogZW5hYmxlIHVuZGVyZmxvdyBpbnRlcnJ1cHRzICovCisJCQlzY2Ffb3V0KERJUl9CT0ZFLCBESVJfVFgocGh5X25vZGUocG9ydCkpLCBjYXJkKTsKKwkJfQorCX0KKworCWhkbGNfc2V0X2NhcnJpZXIoIShzY2FfaW4oZ2V0X21zY2kocG9ydCkgKyBTVDMsIGNhcmQpICYgU1QzX0RDRCksCisJCQkgcG9ydF90b19kZXYocG9ydCkpOworfQorCisKKworI2lmZGVmIE5FRURfU0NBX01TQ0lfSU5UUgorLyogTVNDSSBpbnRlcnJ1cHQgc2VydmljZSAqLworc3RhdGljIGlubGluZSB2b2lkIHNjYV9tc2NpX2ludHIocG9ydF90ICpwb3J0KQoreworCXUxNiBtc2NpID0gZ2V0X21zY2kocG9ydCk7CisJY2FyZF90KiBjYXJkID0gcG9ydF90b19jYXJkKHBvcnQpOworCXU4IHN0YXQgPSBzY2FfaW4obXNjaSArIFNUMSwgY2FyZCk7IC8qIHJlYWQgTVNDSSBTVDEgc3RhdHVzICovCisKKwkvKiBSZXNldCBNU0NJIFRYIHVuZGVycnVuIGFuZCBDRENEIHN0YXR1cyBiaXQgKi8KKwlzY2Ffb3V0KHN0YXQgJiAoU1QxX1VEUk4gfCBTVDFfQ0RDRCksIG1zY2kgKyBTVDEsIGNhcmQpOworCisJaWYgKHN0YXQgJiBTVDFfVURSTikgeworCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKHBvcnRfdG9fZGV2KHBvcnQpKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOyAvKiBUWCBVbmRlcnJ1biBlcnJvciBkZXRlY3RlZCAqLworCQlzdGF0cy0+dHhfZmlmb19lcnJvcnMrKzsKKwl9CisKKwlpZiAoc3RhdCAmIFNUMV9DRENEKQorCQloZGxjX3NldF9jYXJyaWVyKCEoc2NhX2luKG1zY2kgKyBTVDMsIGNhcmQpICYgU1QzX0RDRCksCisJCQkJIHBvcnRfdG9fZGV2KHBvcnQpKTsKK30KKyNlbmRpZgorCisKKworc3RhdGljIGlubGluZSB2b2lkIHNjYV9yeChjYXJkX3QgKmNhcmQsIHBvcnRfdCAqcG9ydCwgcGt0X2Rlc2MgX19pb21lbSAqZGVzYywgdTE2IHJ4aW4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUxNiBsZW47CisJdTMyIGJ1ZmY7CisjaWZuZGVmIEFMTF9QQUdFU19BTFdBWVNfTUFQUEVECisJdTMyIG1heGxlbjsKKwl1OCBwYWdlOworI2VuZGlmCisKKwlsZW4gPSByZWFkdygmZGVzYy0+bGVuKTsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisJaWYgKCFza2IpIHsKKwkJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKworCWJ1ZmYgPSBidWZmZXJfb2Zmc2V0KHBvcnQsIHJ4aW4sIDApOworI2lmbmRlZiBBTExfUEFHRVNfQUxXQVlTX01BUFBFRAorCXBhZ2UgPSBidWZmIC8gd2luc2l6ZShjYXJkKTsKKwlidWZmID0gYnVmZiAlIHdpbnNpemUoY2FyZCk7CisJbWF4bGVuID0gd2luc2l6ZShjYXJkKSAtIGJ1ZmY7CisKKwlvcGVud2luKGNhcmQsIHBhZ2UpOworCisJaWYgKGxlbiA+IG1heGxlbikgeworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgd2luYmFzZShjYXJkKSArIGJ1ZmYsIG1heGxlbik7CisJCW9wZW53aW4oY2FyZCwgcGFnZSArIDEpOworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSArIG1heGxlbiwgd2luYmFzZShjYXJkKSwgbGVuIC0gbWF4bGVuKTsKKwl9IGVsc2UKKyNlbmRpZgorCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCB3aW5iYXNlKGNhcmQpICsgYnVmZiwgbGVuKTsKKworI2lmICFkZWZpbmVkKFBBR0UwX0FMV0FZU19NQVBQRUQpICYmICFkZWZpbmVkKEFMTF9QQUdFU19BTFdBWVNfTUFQUEVEKQorCS8qIHNlbGVjdCBwa3RfZGVzYyB0YWJsZSBwYWdlIGJhY2sgKi8KKwlvcGVud2luKGNhcmQsIDApOworI2VuZGlmCisJc2tiX3B1dChza2IsIGxlbik7CisjaWZkZWYgREVCVUdfUEtUCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIFJYKCVpKToiLCBkZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwlkZWJ1Z19mcmFtZShza2IpOworI2VuZGlmCisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlza2ItPnByb3RvY29sID0gaGRsY190eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwluZXRpZl9yeChza2IpOworfQorCisKKworLyogUmVjZWl2ZSBETUEgaW50ZXJydXB0IHNlcnZpY2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2FfcnhfaW50cihwb3J0X3QgKnBvcnQpCit7CisJdTE2IGRtYWMgPSBnZXRfZG1hY19yeChwb3J0KTsKKwljYXJkX3QgKmNhcmQgPSBwb3J0X3RvX2NhcmQocG9ydCk7CisJdTggc3RhdCA9IHNjYV9pbihEU1JfUlgocGh5X25vZGUocG9ydCkpLCBjYXJkKTsgLyogcmVhZCBETUEgU3RhdHVzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhwb3J0X3RvX2Rldihwb3J0KSk7CisKKwkvKiBSZXNldCBEU1Igc3RhdHVzIGJpdHMgKi8KKwlzY2Ffb3V0KChzdGF0ICYgKERTUl9FT1QgfCBEU1JfRU9NIHwgRFNSX0JPRiB8IERTUl9DT0YpKSB8IERTUl9EV0UsCisJCURTUl9SWChwaHlfbm9kZShwb3J0KSksIGNhcmQpOworCisJaWYgKHN0YXQgJiBEU1JfQk9GKQorCQlzdGF0cy0+cnhfb3Zlcl9lcnJvcnMrKzsgLyogRHJvcHBlZCBvbmUgb3IgbW9yZSBmcmFtZXMgKi8KKworCXdoaWxlICgxKSB7CisJCXUzMiBkZXNjX29mZiA9IGRlc2Nfb2Zmc2V0KHBvcnQsIHBvcnQtPnJ4aW4sIDApOworCQlwa3RfZGVzYyBfX2lvbWVtICpkZXNjOworCQl1MzIgY2RhID0gc2NhX2luYShkbWFjICsgQ0RBTCwgY2FyZCk7CisKKwkJaWYgKChjZGEgPj0gZGVzY19vZmYpICYmIChjZGEgPCBkZXNjX29mZiArIHNpemVvZihwa3RfZGVzYykpKQorCQkJYnJlYWs7CS8qIE5vIGZyYW1lIHJlY2VpdmVkICovCisKKwkJZGVzYyA9IGRlc2NfYWRkcmVzcyhwb3J0LCBwb3J0LT5yeGluLCAwKTsKKwkJc3RhdCA9IHJlYWRiKCZkZXNjLT5zdGF0KTsKKwkJaWYgKCEoc3RhdCAmIFNUX1JYX0VPTSkpCisJCQlwb3J0LT5yeHBhcnQgPSAxOyAvKiBwYXJ0aWFsIGZyYW1lIHJlY2VpdmVkICovCisJCWVsc2UgaWYgKChzdGF0ICYgU1RfRVJST1JfTUFTSykgfHwgcG9ydC0+cnhwYXJ0KSB7CisJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQlpZiAoc3RhdCAmIFNUX1JYX09WRVJSVU4pIHN0YXRzLT5yeF9maWZvX2Vycm9ycysrOworCQkJZWxzZSBpZiAoKHN0YXQgJiAoU1RfUlhfU0hPUlQgfCBTVF9SWF9BQk9SVCB8CisJCQkJCSAgU1RfUlhfUkVTQklUKSkgfHwgcG9ydC0+cnhwYXJ0KQorCQkJCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWVsc2UgaWYgKHN0YXQgJiBTVF9SWF9DUkMpIHN0YXRzLT5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoc3RhdCAmIFNUX1JYX0VPTSkKKwkJCQlwb3J0LT5yeHBhcnQgPSAwOyAvKiByZWNlaXZlZCBsYXN0IGZyYWdtZW50ICovCisJCX0gZWxzZQorCQkJc2NhX3J4KGNhcmQsIHBvcnQsIGRlc2MsIHBvcnQtPnJ4aW4pOworCisJCS8qIFNldCBuZXcgZXJyb3IgZGVzY3JpcHRvciBhZGRyZXNzICovCisJCXNjYV9vdXRhKGRlc2Nfb2ZmLCBkbWFjICsgRURBTCwgY2FyZCk7CisJCXBvcnQtPnJ4aW4gPSBuZXh0X2Rlc2MocG9ydCwgcG9ydC0+cnhpbiwgMCk7CisJfQorCisJLyogbWFrZSBzdXJlIFJYIERNQSBpcyBlbmFibGVkICovCisJc2NhX291dChEU1JfREUsIERTUl9SWChwaHlfbm9kZShwb3J0KSksIGNhcmQpOworfQorCisKKworLyogVHJhbnNtaXQgRE1BIGludGVycnVwdCBzZXJ2aWNlICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NhX3R4X2ludHIocG9ydF90ICpwb3J0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0X3RvX2Rldihwb3J0KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJdTE2IGRtYWMgPSBnZXRfZG1hY190eChwb3J0KTsKKwljYXJkX3QqIGNhcmQgPSBwb3J0X3RvX2NhcmQocG9ydCk7CisJdTggc3RhdDsKKworCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CisKKwlzdGF0ID0gc2NhX2luKERTUl9UWChwaHlfbm9kZShwb3J0KSksIGNhcmQpOyAvKiByZWFkIERNQSBTdGF0dXMgKi8KKworCS8qIFJlc2V0IERTUiBzdGF0dXMgYml0cyAqLworCXNjYV9vdXQoKHN0YXQgJiAoRFNSX0VPVCB8IERTUl9FT00gfCBEU1JfQk9GIHwgRFNSX0NPRikpIHwgRFNSX0RXRSwKKwkJRFNSX1RYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCk7CisKKwl3aGlsZSAoMSkgeworCQlwa3RfZGVzYyBfX2lvbWVtICpkZXNjOworCisJCXUzMiBkZXNjX29mZiA9IGRlc2Nfb2Zmc2V0KHBvcnQsIHBvcnQtPnR4bGFzdCwgMSk7CisJCXUzMiBjZGEgPSBzY2FfaW5hKGRtYWMgKyBDREFMLCBjYXJkKTsKKwkJaWYgKChjZGEgPj0gZGVzY19vZmYpICYmIChjZGEgPCBkZXNjX29mZiArIHNpemVvZihwa3RfZGVzYykpKQorCQkJYnJlYWs7CS8qIFRyYW5zbWl0dGVyIGlzL3dpbGxfYmUgc2VuZGluZyB0aGlzIGZyYW1lICovCisKKwkJZGVzYyA9IGRlc2NfYWRkcmVzcyhwb3J0LCBwb3J0LT50eGxhc3QsIDEpOworCQlzdGF0cy0+dHhfcGFja2V0cysrOworCQlzdGF0cy0+dHhfYnl0ZXMgKz0gcmVhZHcoJmRlc2MtPmxlbik7CisJCXdyaXRlYigwLCAmZGVzYy0+c3RhdCk7CS8qIEZyZWUgZGVzY3JpcHRvciAqLworCQlwb3J0LT50eGxhc3QgPSBuZXh0X2Rlc2MocG9ydCwgcG9ydC0+dHhsYXN0LCAxKTsKKwl9CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOworfQorCisKKworc3RhdGljIGlycXJldHVybl90IHNjYV9pbnRyKGludCBpcnEsIHZvaWQqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY2FyZF90ICpjYXJkID0gZGV2X2lkOworCWludCBpOworCXU4IHN0YXQ7CisJaW50IGhhbmRsZWQgPSAwOworCisjaWZuZGVmIEFMTF9QQUdFU19BTFdBWVNfTUFQUEVECisJdTggcGFnZSA9IHNjYV9nZXRfcGFnZShjYXJkKTsKKyNlbmRpZgorCisJd2hpbGUoKHN0YXQgPSBzY2FfaW50cl9zdGF0dXMoY2FyZCkpICE9IDApIHsKKwkJaGFuZGxlZCA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCXBvcnRfdCAqcG9ydCA9IGdldF9wb3J0KGNhcmQsIGkpOworCQkJaWYgKHBvcnQpIHsKKwkJCQlpZiAoc3RhdCAmIFNDQV9JTlRSX01TQ0koaSkpCisJCQkJCXNjYV9tc2NpX2ludHIocG9ydCk7CisKKwkJCQlpZiAoc3RhdCAmIFNDQV9JTlRSX0RNQUNfUlgoaSkpCisJCQkJCXNjYV9yeF9pbnRyKHBvcnQpOworCisJCQkJaWYgKHN0YXQgJiBTQ0FfSU5UUl9ETUFDX1RYKGkpKQorCQkJCQlzY2FfdHhfaW50cihwb3J0KTsKKwkJCX0KKwkJfQorCX0KKworI2lmbmRlZiBBTExfUEFHRVNfQUxXQVlTX01BUFBFRAorCW9wZW53aW4oY2FyZCwgcGFnZSk7CQkvKiBSZXN0b3JlIG9yaWdpbmFsIHBhZ2UgKi8KKyNlbmRpZgorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKKworc3RhdGljIHZvaWQgc2NhX3NldF9wb3J0KHBvcnRfdCAqcG9ydCkKK3sKKwljYXJkX3QqIGNhcmQgPSBwb3J0X3RvX2NhcmQocG9ydCk7CisJdTE2IG1zY2kgPSBnZXRfbXNjaShwb3J0KTsKKwl1OCBtZDIgPSBzY2FfaW4obXNjaSArIE1EMiwgY2FyZCk7CisJdW5zaWduZWQgaW50IHRtYywgYnIgPSAxMCwgYnJ2ID0gMTAyNDsKKworCisJaWYgKHBvcnQtPnNldHRpbmdzLmNsb2NrX3JhdGUgPiAwKSB7CisJCS8qIFRyeSBsb3dlciBiciBmb3IgYmV0dGVyIGFjY3VyYWN5Ki8KKwkJZG8geworCQkJYnItLTsKKwkJCWJydiA+Pj0gMTsgLyogYnJ2ID0gMl45ID0gNTEyIG1heCBpbiBzcGVjcyAqLworCisJCQkvKiBCYXVkIFJhdGUgPSBDTE9DS19CQVNFIC8gVE1DIC8gMl5CUiAqLworCQkJdG1jID0gQ0xPQ0tfQkFTRSAvIGJydiAvIHBvcnQtPnNldHRpbmdzLmNsb2NrX3JhdGU7CisJCX13aGlsZSAoYnIgPiAxICYmIHRtYyA8PSAxMjgpOworCisJCWlmICh0bWMgPCAxKSB7CisJCQl0bWMgPSAxOworCQkJYnIgPSAwOwkvKiBGb3IgYmF1ZD1DTE9DS19CQVNFIHdlIHVzZSB0bWM9MSBicj0wICovCisJCQlicnYgPSAxOworCQl9IGVsc2UgaWYgKHRtYyA+IDI1NSkKKwkJCXRtYyA9IDI1NjsgLyogdG1jPTAgbWVhbnMgMjU2IC0gbG93IGJhdWQgcmF0ZXMgKi8KKworCQlwb3J0LT5zZXR0aW5ncy5jbG9ja19yYXRlID0gQ0xPQ0tfQkFTRSAvIGJydiAvIHRtYzsKKwl9IGVsc2UgeworCQliciA9IDk7IC8qIE1pbmltdW0gY2xvY2sgcmF0ZSAqLworCQl0bWMgPSAyNTY7CS8qIDhiaXQgPSAwICovCisJCXBvcnQtPnNldHRpbmdzLmNsb2NrX3JhdGUgPSBDTE9DS19CQVNFIC8gKDI1NiAqIDUxMik7CisJfQorCisJcG9ydC0+cnhzID0gKHBvcnQtPnJ4cyAmIH5DTEtfQlJHX01BU0spIHwgYnI7CisJcG9ydC0+dHhzID0gKHBvcnQtPnR4cyAmIH5DTEtfQlJHX01BU0spIHwgYnI7CisJcG9ydC0+dG1jID0gdG1jOworCisJLyogYmF1ZCBkaXZpc29yIC0gdGltZSBjb25zdGFudCovCisjaWZkZWYgX19IRDY0NTcwX0gKKwlzY2Ffb3V0KHBvcnQtPnRtYywgbXNjaSArIFRNQywgY2FyZCk7CisjZWxzZQorCXNjYV9vdXQocG9ydC0+dG1jLCBtc2NpICsgVE1DUiwgY2FyZCk7CisJc2NhX291dChwb3J0LT50bWMsIG1zY2kgKyBUTUNULCBjYXJkKTsKKyNlbmRpZgorCisJLyogU2V0IEJSRyBiaXRzICovCisJc2NhX291dChwb3J0LT5yeHMsIG1zY2kgKyBSWFMsIGNhcmQpOworCXNjYV9vdXQocG9ydC0+dHhzLCBtc2NpICsgVFhTLCBjYXJkKTsKKworCWlmIChwb3J0LT5zZXR0aW5ncy5sb29wYmFjaykKKwkJbWQyIHw9IE1EMl9MT09QQkFDSzsKKwllbHNlCisJCW1kMiAmPSB+TUQyX0xPT1BCQUNLOworCisJc2NhX291dChtZDIsIG1zY2kgKyBNRDIsIGNhcmQpOworCit9CisKKworCitzdGF0aWMgdm9pZCBzY2Ffb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJY2FyZF90KiBjYXJkID0gcG9ydF90b19jYXJkKHBvcnQpOworCXUxNiBtc2NpID0gZ2V0X21zY2kocG9ydCk7CisJdTggbWQwLCBtZDI7CisKKwlzd2l0Y2gocG9ydC0+ZW5jb2RpbmcpIHsKKwljYXNlIEVOQ09ESU5HX05SWjoJbWQyID0gTUQyX05SWjsJCWJyZWFrOworCWNhc2UgRU5DT0RJTkdfTlJaSToJbWQyID0gTUQyX05SWkk7CQlicmVhazsKKwljYXNlIEVOQ09ESU5HX0ZNX01BUks6CW1kMiA9IE1EMl9GTV9NQVJLOwlicmVhazsKKwljYXNlIEVOQ09ESU5HX0ZNX1NQQUNFOgltZDIgPSBNRDJfRk1fU1BBQ0U7CWJyZWFrOworCWRlZmF1bHQ6CQltZDIgPSBNRDJfTUFOQ0hFU1RFUjsKKwl9CisKKwlpZiAocG9ydC0+c2V0dGluZ3MubG9vcGJhY2spCisJCW1kMiB8PSBNRDJfTE9PUEJBQ0s7CisKKwlzd2l0Y2gocG9ydC0+cGFyaXR5KSB7CisJY2FzZSBQQVJJVFlfQ1JDMTZfUFIwOgkgICAgIG1kMCA9IE1EMF9IRExDIHwgTUQwX0NSQ18xNl8wOyAgYnJlYWs7CisJY2FzZSBQQVJJVFlfQ1JDMTZfUFIxOgkgICAgIG1kMCA9IE1EMF9IRExDIHwgTUQwX0NSQ18xNjsgICAgYnJlYWs7CisjaWZkZWYgX19IRDY0NTcwX0gKKwljYXNlIFBBUklUWV9DUkMxNl9QUjBfQ0NJVFQ6IG1kMCA9IE1EMF9IRExDIHwgTUQwX0NSQ19JVFVfMDsgYnJlYWs7CisjZWxzZQorCWNhc2UgUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVDogbWQwID0gTUQwX0hETEMgfCBNRDBfQ1JDX0lUVTMyOyBicmVhazsKKyNlbmRpZgorCWNhc2UgUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVDogbWQwID0gTUQwX0hETEMgfCBNRDBfQ1JDX0lUVTsgICBicmVhazsKKwlkZWZhdWx0OgkJICAgICBtZDAgPSBNRDBfSERMQyB8IE1EMF9DUkNfTk9ORTsKKwl9CisKKwlzY2Ffb3V0KENNRF9SRVNFVCwgbXNjaSArIENNRCwgY2FyZCk7CisJc2NhX291dChtZDAsIG1zY2kgKyBNRDAsIGNhcmQpOworCXNjYV9vdXQoMHgwMCwgbXNjaSArIE1EMSwgY2FyZCk7IC8qIG5vIGFkZHJlc3MgZmllbGQgY2hlY2sgKi8KKwlzY2Ffb3V0KG1kMiwgbXNjaSArIE1EMiwgY2FyZCk7CisJc2NhX291dCgweDdFLCBtc2NpICsgSURMLCBjYXJkKTsgLyogZmxhZyBjaGFyYWN0ZXIgMHg3RSAqLworI2lmZGVmIF9fSEQ2NDU3MF9ICisJc2NhX291dChDVExfSURMRSwgbXNjaSArIENUTCwgY2FyZCk7CisjZWxzZQorCS8qIFNraXAgdGhlIHJlc3Qgb2YgdW5kZXJydW4gZnJhbWUgKi8KKwlzY2Ffb3V0KENUTF9JRExFIHwgQ1RMX1VSQ1QgfCBDVExfVVJTS1AsIG1zY2kgKyBDVEwsIGNhcmQpOworI2VuZGlmCisKKyNpZmRlZiBfX0hENjQ1NzBfSAorCS8qIEFsbG93IGF0IGxlYXN0IDggYnl0ZXMgYmVmb3JlIHJlcXVlc3RpbmcgUlggRE1BIG9wZXJhdGlvbiAqLworCS8qIFRYIHdpdGggaGlnaGVyIHByaW9yaXR5IGFuZCBwb3NzaWJseSB3aXRoIHNob3J0ZXIgdHJhbnNmZXJzICovCisJc2NhX291dCgweDA3LCBtc2NpICsgUlJDLCBjYXJkKTsgLyogKzE9UlhSRFkvRE1BIGFjdGl2YXRpb24gY29uZGl0aW9uKi8KKwlzY2Ffb3V0KDB4MTAsIG1zY2kgKyBUUkMwLCBjYXJkKTsgLyogPSBUWFJEWS9ETUEgYWN0aXZhdGlvbiBjb25kaXRpb24qLworCXNjYV9vdXQoMHgxNCwgbXNjaSArIFRSQzEsIGNhcmQpOyAvKiArMT1UWFJEWS9ETUEgZGVhY3RpdiBjb25kaXRpb24gKi8KKyNlbHNlCisJc2NhX291dCgweDBGLCBtc2NpICsgUk5SLCBjYXJkKTsgLyogKzE9UlggRE1BIGFjdGl2YXRpb24gY29uZGl0aW9uICovCisJc2NhX291dCgweDNDLCBtc2NpICsgVEZTLCBjYXJkKTsgLyogKzEgPSBUWCBzdGFydCAqLworCXNjYV9vdXQoMHgzOCwgbXNjaSArIFRDUiwgY2FyZCk7IC8qID1Dcml0aWNhbCBUWCBETUEgYWN0aXYgY29uZGl0aW9uICovCisJc2NhX291dCgweDM4LCBtc2NpICsgVE5SMCwgY2FyZCk7IC8qID1UWCBETUEgYWN0aXZhdGlvbiBjb25kaXRpb24gKi8KKwlzY2Ffb3V0KDB4M0YsIG1zY2kgKyBUTlIxLCBjYXJkKTsgLyogKzE9VFggRE1BIGRlYWN0aXZhdGlvbiBjb25kaXRpb24qLworI2VuZGlmCisKKy8qIFdlJ3JlIHVzaW5nIHRoZSBmb2xsb3dpbmcgaW50ZXJydXB0czoKKyAgIC0gVFhJTlQgKERNQUMgY29tcGxldGVkIGFsbCB0cmFuc21pc2lvbnMsIHVuZGVycnVuIG9yIERDRCBjaGFuZ2UpCisgICAtIGFsbCBETUEgaW50ZXJydXB0cworKi8KKworCWhkbGNfc2V0X2NhcnJpZXIoIShzY2FfaW4obXNjaSArIFNUMywgY2FyZCkgJiBTVDNfRENEKSwgZGV2KTsKKworI2lmZGVmIF9fSEQ2NDU3MF9ICisJLyogTVNDSSBUWCBJTlQgYW5kIFJYIElOVCBBIElSUSBlbmFibGUgKi8KKwlzY2Ffb3V0KElFMF9UWElOVCB8IElFMF9SWElOVEEsIG1zY2kgKyBJRTAsIGNhcmQpOworCXNjYV9vdXQoSUUxX1VEUk4gfCBJRTFfQ0RDRCwgbXNjaSArIElFMSwgY2FyZCk7CisJc2NhX291dChzY2FfaW4oSUVSMCwgY2FyZCkgfCAocGh5X25vZGUocG9ydCkgPyAweEMwIDogMHgwQyksCisJCUlFUjAsIGNhcmQpOyAvKiBUWElOVCBhbmQgUlhJTlQgKi8KKwkvKiBlbmFibGUgRE1BIElSUSAqLworCXNjYV9vdXQoc2NhX2luKElFUjEsIGNhcmQpIHwgKHBoeV9ub2RlKHBvcnQpID8gMHhGMCA6IDB4MEYpLAorCQlJRVIxLCBjYXJkKTsKKyNlbHNlCisJLyogTVNDSSBUWElOVCBhbmQgUlhJTlRBIGludGVycnVwdCBlbmFibGUgKi8KKwlzY2Ffb3V0bChJRTBfVFhJTlQgfCBJRTBfUlhJTlRBIHwgSUUwX1VEUk4gfCBJRTBfQ0RDRCwgbXNjaSArIElFMCwKKwkJIGNhcmQpOworCS8qIERNQSAmIE1TQ0kgSVJRIGVuYWJsZSAqLworCXNjYV9vdXRsKHNjYV9pbmwoSUVSMCwgY2FyZCkgfAorCQkgKHBoeV9ub2RlKHBvcnQpID8gMHgwQTAwNjYwMCA6IDB4MDAwQTAwNjYpLCBJRVIwLCBjYXJkKTsKKyNlbmRpZgorCisjaWZkZWYgX19IRDY0NTcwX0gKKwlzY2Ffb3V0KHBvcnQtPnRtYywgbXNjaSArIFRNQywgY2FyZCk7IC8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCisjZWxzZQorCXNjYV9vdXQocG9ydC0+dG1jLCBtc2NpICsgVE1DUiwgY2FyZCk7CisJc2NhX291dChwb3J0LT50bWMsIG1zY2kgKyBUTUNULCBjYXJkKTsKKyNlbmRpZgorCXNjYV9vdXQocG9ydC0+cnhzLCBtc2NpICsgUlhTLCBjYXJkKTsKKwlzY2Ffb3V0KHBvcnQtPnR4cywgbXNjaSArIFRYUywgY2FyZCk7CisJc2NhX291dChDTURfVFhfRU5BQkxFLCBtc2NpICsgQ01ELCBjYXJkKTsKKwlzY2Ffb3V0KENNRF9SWF9FTkFCTEUsIG1zY2kgKyBDTUQsIGNhcmQpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKK30KKworCisKK3N0YXRpYyB2b2lkIHNjYV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJY2FyZF90KiBjYXJkID0gcG9ydF90b19jYXJkKHBvcnQpOworCisJLyogcmVzZXQgY2hhbm5lbCAqLworCXNjYV9vdXQoQ01EX1JFU0VULCBnZXRfbXNjaShwb3J0KSArIENNRCwgcG9ydF90b19jYXJkKHBvcnQpKTsKKyNpZmRlZiBfX0hENjQ1NzBfSAorCS8qIGRpc2FibGUgTVNDSSBpbnRlcnJ1cHRzICovCisJc2NhX291dChzY2FfaW4oSUVSMCwgY2FyZCkgJiAocGh5X25vZGUocG9ydCkgPyAweDBGIDogMHhGMCksCisJCUlFUjAsIGNhcmQpOworCS8qIGRpc2FibGUgRE1BIGludGVycnVwdHMgKi8KKwlzY2Ffb3V0KHNjYV9pbihJRVIxLCBjYXJkKSAmIChwaHlfbm9kZShwb3J0KSA/IDB4MEYgOiAweEYwKSwKKwkJSUVSMSwgY2FyZCk7CisjZWxzZQorCS8qIGRpc2FibGUgRE1BICYgTVNDSSBJUlEgKi8KKwlzY2Ffb3V0bChzY2FfaW5sKElFUjAsIGNhcmQpICYKKwkJIChwaHlfbm9kZShwb3J0KSA/IDB4MDBGRjAwRkYgOiAweEZGMDBGRjAwKSwgSUVSMCwgY2FyZCk7CisjZW5kaWYKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7Cit9CisKKworCitzdGF0aWMgaW50IHNjYV9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgZW5jb2RpbmcsCisJCSAgICAgIHVuc2lnbmVkIHNob3J0IHBhcml0eSkKK3sKKwlpZiAoZW5jb2RpbmcgIT0gRU5DT0RJTkdfTlJaICYmCisJICAgIGVuY29kaW5nICE9IEVOQ09ESU5HX05SWkkgJiYKKwkgICAgZW5jb2RpbmcgIT0gRU5DT0RJTkdfRk1fTUFSSyAmJgorCSAgICBlbmNvZGluZyAhPSBFTkNPRElOR19GTV9TUEFDRSAmJgorCSAgICBlbmNvZGluZyAhPSBFTkNPRElOR19NQU5DSEVTVEVSKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwYXJpdHkgIT0gUEFSSVRZX05PTkUgJiYKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMxNl9QUjAgJiYKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMxNl9QUjEgJiYKKyNpZmRlZiBfX0hENjQ1NzBfSAorCSAgICBwYXJpdHkgIT0gUEFSSVRZX0NSQzE2X1BSMF9DQ0lUVCAmJgorI2Vsc2UKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMzMl9QUjFfQ0NJVFQgJiYKKyNlbmRpZgorCSAgICBwYXJpdHkgIT0gUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfdG9fcG9ydChkZXYpLT5lbmNvZGluZyA9IGVuY29kaW5nOworCWRldl90b19wb3J0KGRldiktPnBhcml0eSA9IHBhcml0eTsKKwlyZXR1cm4gMDsKK30KKworCisKKyNpZmRlZiBERUJVR19SSU5HUworc3RhdGljIHZvaWQgc2NhX2R1bXBfcmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCWNhcmRfdCAqY2FyZCA9IHBvcnRfdG9fY2FyZChwb3J0KTsKKwl1MTYgY250OworI2lmICFkZWZpbmVkKFBBR0UwX0FMV0FZU19NQVBQRUQpICYmICFkZWZpbmVkKEFMTF9QQUdFU19BTFdBWVNfTUFQUEVEKQorCXU4IHBhZ2U7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFBBR0UwX0FMV0FZU19NQVBQRUQpICYmICFkZWZpbmVkKEFMTF9QQUdFU19BTFdBWVNfTUFQUEVEKQorCXBhZ2UgPSBzY2FfZ2V0X3BhZ2UoY2FyZCk7CisJb3BlbndpbihjYXJkLCAwKTsKKyNlbmRpZgorCisJcHJpbnRrKEtFUk5fREVCVUcgIlJYIHJpbmc6IENEQT0ldSBFREE9JXUgRFNSPSUwMlggaW49JXUgJXNhY3RpdmUiLAorCSAgICAgICBzY2FfaW5hKGdldF9kbWFjX3J4KHBvcnQpICsgQ0RBTCwgY2FyZCksCisJICAgICAgIHNjYV9pbmEoZ2V0X2RtYWNfcngocG9ydCkgKyBFREFMLCBjYXJkKSwKKwkgICAgICAgc2NhX2luKERTUl9SWChwaHlfbm9kZShwb3J0KSksIGNhcmQpLCBwb3J0LT5yeGluLAorCSAgICAgICBzY2FfaW4oRFNSX1JYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCkgJiBEU1JfREU/IiI6ImluIik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBwb3J0X3RvX2NhcmQocG9ydCktPnJ4X3JpbmdfYnVmZmVyczsgY250KyspCisJCXByaW50aygiICUwMlgiLCByZWFkYigmKGRlc2NfYWRkcmVzcyhwb3J0LCBjbnQsIDApLT5zdGF0KSkpOworCisJcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAiVFggcmluZzogQ0RBPSV1IEVEQT0ldSBEU1I9JTAyWCBpbj0ldSAiCisJICAgICAgICJsYXN0PSV1ICVzYWN0aXZlIiwKKwkgICAgICAgc2NhX2luYShnZXRfZG1hY190eChwb3J0KSArIENEQUwsIGNhcmQpLAorCSAgICAgICBzY2FfaW5hKGdldF9kbWFjX3R4KHBvcnQpICsgRURBTCwgY2FyZCksCisJICAgICAgIHNjYV9pbihEU1JfVFgocGh5X25vZGUocG9ydCkpLCBjYXJkKSwgcG9ydC0+dHhpbiwgcG9ydC0+dHhsYXN0LAorCSAgICAgICBzY2FfaW4oRFNSX1RYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCkgJiBEU1JfREUgPyAiIiA6ICJpbiIpOworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBwb3J0X3RvX2NhcmQocG9ydCktPnR4X3JpbmdfYnVmZmVyczsgY250KyspCisJCXByaW50aygiICUwMlgiLCByZWFkYigmKGRlc2NfYWRkcmVzcyhwb3J0LCBjbnQsIDEpLT5zdGF0KSkpOworCXByaW50aygiXG4iKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJNU0NJOiBNRDogJTAyeCAlMDJ4ICUwMngsICIKKwkgICAgICAgIlNUOiAlMDJ4ICUwMnggJTAyeCAlMDJ4IgorI2lmZGVmIF9fSEQ2NDU3Ml9ICisJICAgICAgICIgJTAyeCIKKyNlbmRpZgorCSAgICAgICAiLCBGU1Q6ICUwMnggQ1NUOiAlMDJ4ICUwMnhcbiIsCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIE1EMCwgY2FyZCksCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIE1EMSwgY2FyZCksCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIE1EMiwgY2FyZCksCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIFNUMCwgY2FyZCksCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIFNUMSwgY2FyZCksCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIFNUMiwgY2FyZCksCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIFNUMywgY2FyZCksCisjaWZkZWYgX19IRDY0NTcyX0gKKwkgICAgICAgc2NhX2luKGdldF9tc2NpKHBvcnQpICsgU1Q0LCBjYXJkKSwKKyNlbmRpZgorCSAgICAgICBzY2FfaW4oZ2V0X21zY2kocG9ydCkgKyBGU1QsIGNhcmQpLAorCSAgICAgICBzY2FfaW4oZ2V0X21zY2kocG9ydCkgKyBDU1QwLCBjYXJkKSwKKwkgICAgICAgc2NhX2luKGdldF9tc2NpKHBvcnQpICsgQ1NUMSwgY2FyZCkpOworCisjaWZkZWYgX19IRDY0NTcyX0gKKwlwcmludGsoS0VSTl9ERUJVRyAiSUxBUjogJTAyeCBJU1I6ICUwOHggJTA4eFxuIiwgc2NhX2luKElMQVIsIGNhcmQpLAorCSAgICAgICBzY2FfaW5sKElTUjAsIGNhcmQpLCBzY2FfaW5sKElTUjEsIGNhcmQpKTsKKyNlbHNlCisJcHJpbnRrKEtFUk5fREVCVUcgIklTUjogJTAyeCAlMDJ4ICUwMnhcbiIsIHNjYV9pbihJU1IwLCBjYXJkKSwKKwkgICAgICAgc2NhX2luKElTUjEsIGNhcmQpLCBzY2FfaW4oSVNSMiwgY2FyZCkpOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChQQUdFMF9BTFdBWVNfTUFQUEVEKSAmJiAhZGVmaW5lZChBTExfUEFHRVNfQUxXQVlTX01BUFBFRCkKKwlvcGVud2luKGNhcmQsIHBhZ2UpOyAvKiBSZXN0b3JlIG9yaWdpbmFsIHBhZ2UgKi8KKyNlbmRpZgorfQorI2VuZGlmIC8qIERFQlVHX1JJTkdTICovCisKKworCitzdGF0aWMgaW50IHNjYV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwljYXJkX3QgKmNhcmQgPSBwb3J0X3RvX2NhcmQocG9ydCk7CisJcGt0X2Rlc2MgX19pb21lbSAqZGVzYzsKKwl1MzIgYnVmZiwgbGVuOworI2lmbmRlZiBBTExfUEFHRVNfQUxXQVlTX01BUFBFRAorCXU4IHBhZ2U7CisJdTMyIG1heGxlbjsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7CisKKwlkZXNjID0gZGVzY19hZGRyZXNzKHBvcnQsIHBvcnQtPnR4aW4gKyAxLCAxKTsKKwlpZiAocmVhZGIoJmRlc2MtPnN0YXQpKSB7IC8qIGFsbG93IDEgcGFja2V0IGdhcCAqLworCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuIC0gcHJldmlvdXMgeG1pdCBzaG91bGQgc3RvcCBxdWV1ZSAqLworI2lmZGVmIERFQlVHX1BLVAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRyYW5zbWl0dGVyIGJ1ZmZlciBmdWxsXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKKwkJcmV0dXJuIDE7CS8qIHJlcXVlc3QgcGFja2V0IHRvIGJlIHF1ZXVlZCAqLworCX0KKworI2lmZGVmIERFQlVHX1BLVAorCXByaW50ayhLRVJOX0RFQlVHICIlcyBUWCglaSk6IiwgZGV2LT5uYW1lLCBza2ItPmxlbik7CisJZGVidWdfZnJhbWUoc2tiKTsKKyNlbmRpZgorCisJZGVzYyA9IGRlc2NfYWRkcmVzcyhwb3J0LCBwb3J0LT50eGluLCAxKTsKKwlidWZmID0gYnVmZmVyX29mZnNldChwb3J0LCBwb3J0LT50eGluLCAxKTsKKwlsZW4gPSBza2ItPmxlbjsKKyNpZm5kZWYgQUxMX1BBR0VTX0FMV0FZU19NQVBQRUQKKwlwYWdlID0gYnVmZiAvIHdpbnNpemUoY2FyZCk7CisJYnVmZiA9IGJ1ZmYgJSB3aW5zaXplKGNhcmQpOworCW1heGxlbiA9IHdpbnNpemUoY2FyZCkgLSBidWZmOworCisJb3BlbndpbihjYXJkLCBwYWdlKTsKKwlpZiAobGVuID4gbWF4bGVuKSB7CisJCW1lbWNweV90b2lvKHdpbmJhc2UoY2FyZCkgKyBidWZmLCBza2ItPmRhdGEsIG1heGxlbik7CisJCW9wZW53aW4oY2FyZCwgcGFnZSArIDEpOworCQltZW1jcHlfdG9pbyh3aW5iYXNlKGNhcmQpLCBza2ItPmRhdGEgKyBtYXhsZW4sIGxlbiAtIG1heGxlbik7CisJfQorCWVsc2UKKyNlbmRpZgorCQltZW1jcHlfdG9pbyh3aW5iYXNlKGNhcmQpICsgYnVmZiwgc2tiLT5kYXRhLCBsZW4pOworCisjaWYgIWRlZmluZWQoUEFHRTBfQUxXQVlTX01BUFBFRCkgJiYgIWRlZmluZWQoQUxMX1BBR0VTX0FMV0FZU19NQVBQRUQpCisJb3BlbndpbihjYXJkLCAwKTsJLyogc2VsZWN0IHBrdF9kZXNjIHRhYmxlIHBhZ2UgYmFjayAqLworI2VuZGlmCisJd3JpdGV3KGxlbiwgJmRlc2MtPmxlbik7CisJd3JpdGViKFNUX1RYX0VPTSwgJmRlc2MtPnN0YXQpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcG9ydC0+dHhpbiA9IG5leHRfZGVzYyhwb3J0LCBwb3J0LT50eGluLCAxKTsKKwlzY2Ffb3V0YShkZXNjX29mZnNldChwb3J0LCBwb3J0LT50eGluLCAxKSwKKwkJIGdldF9kbWFjX3R4KHBvcnQpICsgRURBTCwgY2FyZCk7CisKKwlzY2Ffb3V0KERTUl9ERSwgRFNSX1RYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCk7IC8qIEVuYWJsZSBUWCBETUEgKi8KKworCWRlc2MgPSBkZXNjX2FkZHJlc3MocG9ydCwgcG9ydC0+dHhpbiArIDEsIDEpOworCWlmIChyZWFkYigmZGVzYy0+c3RhdCkpIC8qIGFsbG93IDEgcGFja2V0IGdhcCAqLworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisKKworI2lmZGVmIE5FRURfREVURUNUX1JBTQorc3RhdGljIHUzMiBfX2RldmluaXQgc2NhX2RldGVjdF9yYW0oY2FyZF90ICpjYXJkLCB1OCBfX2lvbWVtICpyYW1iYXNlLCB1MzIgcmFtc2l6ZSkKK3sKKwkvKiBSb3VuZCBSQU0gc2l6ZSB0byAzMiBiaXRzLCBmaWxsIGZyb20gZW5kIHRvIHN0YXJ0ICovCisJdTMyIGkgPSByYW1zaXplICY9IH4zOworCisjaWZuZGVmIEFMTF9QQUdFU19BTFdBWVNfTUFQUEVECisJdTMyIHNpemUgPSB3aW5zaXplKGNhcmQpOworCisJb3BlbndpbihjYXJkLCAoaSAtIDQpIC8gc2l6ZSk7IC8qIHNlbGVjdCBsYXN0IHdpbmRvdyAqLworI2VuZGlmCisJZG8geworCQlpIC09IDQ7CisjaWZuZGVmIEFMTF9QQUdFU19BTFdBWVNfTUFQUEVECisJCWlmICgoaSArIDQpICUgc2l6ZSA9PSAwKQorCQkJb3BlbndpbihjYXJkLCBpIC8gc2l6ZSk7CisJCXdyaXRlbChpIF4gMHgxMjM0NTY3OCwgcmFtYmFzZSArIGkgJSBzaXplKTsKKyNlbHNlCisJCXdyaXRlbChpIF4gMHgxMjM0NTY3OCwgcmFtYmFzZSArIGkpOworI2VuZGlmCisJfXdoaWxlIChpID4gMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmFtc2l6ZSA7IGkgKz0gNCkgeworI2lmbmRlZiBBTExfUEFHRVNfQUxXQVlTX01BUFBFRAorCQlpZiAoaSAlIHNpemUgPT0gMCkKKwkJCW9wZW53aW4oY2FyZCwgaSAvIHNpemUpOworCisJCWlmIChyZWFkbChyYW1iYXNlICsgaSAlIHNpemUpICE9IChpIF4gMHgxMjM0NTY3OCkpCisJCQlicmVhazsKKyNlbHNlCisJCWlmIChyZWFkbChyYW1iYXNlICsgaSkgIT0gKGkgXiAweDEyMzQ1Njc4KSkKKwkJCWJyZWFrOworI2VuZGlmCisJfQorCisJcmV0dXJuIGk7Cit9CisjZW5kaWYgLyogTkVFRF9ERVRFQ1RfUkFNICovCisKKworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc2NhX2luaXQoY2FyZF90ICpjYXJkLCBpbnQgd2FpdF9zdGF0ZXMpCit7CisJc2NhX291dCh3YWl0X3N0YXRlcywgV0NSTCwgY2FyZCk7IC8qIFdhaXQgQ29udHJvbCAqLworCXNjYV9vdXQod2FpdF9zdGF0ZXMsIFdDUk0sIGNhcmQpOworCXNjYV9vdXQod2FpdF9zdGF0ZXMsIFdDUkgsIGNhcmQpOworCisJc2NhX291dCgwLCBETUVSLCBjYXJkKTsJLyogRE1BIE1hc3RlciBkaXNhYmxlICovCisJc2NhX291dCgweDAzLCBQQ1IsIGNhcmQpOyAvKiBETUEgcHJpb3JpdHkgKi8KKwlzY2Ffb3V0KDAsIERTUl9SWCgwKSwgY2FyZCk7IC8qIERNQSBkaXNhYmxlIC0gdG8gaGFsdCBzdGF0ZSAqLworCXNjYV9vdXQoMCwgRFNSX1RYKDApLCBjYXJkKTsKKwlzY2Ffb3V0KDAsIERTUl9SWCgxKSwgY2FyZCk7CisJc2NhX291dCgwLCBEU1JfVFgoMSksIGNhcmQpOworCXNjYV9vdXQoRE1FUl9ETUUsIERNRVIsIGNhcmQpOyAvKiBETUEgTWFzdGVyIGVuYWJsZSAqLworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2Npc2NvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiNjg5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2Npc2NvLmMKQEAgLTAsMCArMSwzMzAgQEAKKy8qCisgKiBHZW5lcmljIEhETEMgc3VwcG9ydCByb3V0aW5lcyBmb3IgTGludXgKKyAqIENpc2NvIEhETEMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDMgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9sYXBiLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisjdW5kZWYgREVCVUdfSEFSRF9IRUFERVIKKworI2RlZmluZSBDSVNDT19NVUxUSUNBU1QJCTB4OEYJLyogQ2lzY28gbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0lTQ09fVU5JQ0FTVAkJMHgwRgkvKiBDaXNjbyB1bmljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0lTQ09fS0VFUEFMSVZFCQkweDgwMzUJLyogQ2lzY28ga2VlcGFsaXZlIHByb3RvY29sICovCisjZGVmaW5lIENJU0NPX1NZU19JTkZPCQkweDIwMDAJLyogQ2lzY28gaW50ZXJmYWNlL3N5c3RlbSBpbmZvICovCisjZGVmaW5lIENJU0NPX0FERFJfUkVRCQkwCS8qIENpc2NvIGFkZHJlc3MgcmVxdWVzdCAqLworI2RlZmluZSBDSVNDT19BRERSX1JFUExZCTEJLyogQ2lzY28gYWRkcmVzcyByZXBseSAqLworI2RlZmluZSBDSVNDT19LRUVQQUxJVkVfUkVRCTIJLyogQ2lzY28ga2VlcGFsaXZlIHJlcXVlc3QgKi8KKworCitzdGF0aWMgaW50IGNpc2NvX2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHUxNiB0eXBlLCB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsCisJCQkgICAgIHVuc2lnbmVkIGludCBsZW4pCit7CisJaGRsY19oZWFkZXIgKmRhdGE7CisjaWZkZWYgREVCVUdfSEFSRF9IRUFERVIKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNpc2NvX2hhcmRfaGVhZGVyIGNhbGxlZFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJc2tiX3B1c2goc2tiLCBzaXplb2YoaGRsY19oZWFkZXIpKTsKKwlkYXRhID0gKGhkbGNfaGVhZGVyKilza2ItPmRhdGE7CisJaWYgKHR5cGUgPT0gQ0lTQ09fS0VFUEFMSVZFKQorCQlkYXRhLT5hZGRyZXNzID0gQ0lTQ09fTVVMVElDQVNUOworCWVsc2UKKwkJZGF0YS0+YWRkcmVzcyA9IENJU0NPX1VOSUNBU1Q7CisJZGF0YS0+Y29udHJvbCA9IDA7CisJZGF0YS0+cHJvdG9jb2wgPSBodG9ucyh0eXBlKTsKKworCXJldHVybiBzaXplb2YoaGRsY19oZWFkZXIpOworfQorCisKKworc3RhdGljIHZvaWQgY2lzY29fa2VlcGFsaXZlX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHR5cGUsCisJCQkJIHUzMiBwYXIxLCB1MzIgcGFyMikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWNpc2NvX3BhY2tldCAqZGF0YTsKKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKGhkbGNfaGVhZGVyKSArIHNpemVvZihjaXNjb19wYWNrZXQpKTsKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IE1lbW9yeSBzcXVlZXplIG9uIGNpc2NvX2tlZXBhbGl2ZV9zZW5kKClcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCXNrYl9yZXNlcnZlKHNrYiwgNCk7CisJY2lzY29faGFyZF9oZWFkZXIoc2tiLCBkZXYsIENJU0NPX0tFRVBBTElWRSwgTlVMTCwgTlVMTCwgMCk7CisJZGF0YSA9IChjaXNjb19wYWNrZXQqKXNrYi0+dGFpbDsKKworCWRhdGEtPnR5cGUgPSBodG9ubCh0eXBlKTsKKwlkYXRhLT5wYXIxID0gaHRvbmwocGFyMSk7CisJZGF0YS0+cGFyMiA9IGh0b25sKHBhcjIpOworCWRhdGEtPnJlbCA9IDB4RkZGRjsKKwkvKiB3ZSB3aWxsIG5lZWQgZG9fZGl2IGhlcmUgaWYgMTAwMCAlIEhaICE9IDAgKi8KKwlkYXRhLT50aW1lID0gaHRvbmwoKGppZmZpZXMgLSBJTklUSUFMX0pJRkZJRVMpICogKDEwMDAgLyBIWikpOworCisJc2tiX3B1dChza2IsIHNpemVvZihjaXNjb19wYWNrZXQpKTsKKwlza2ItPnByaW9yaXR5ID0gVENfUFJJT19DT05UUk9MOworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCisJZGV2X3F1ZXVlX3htaXQoc2tiKTsKK30KKworCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjaXNjb190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19oZWFkZXIgKmRhdGEgPSAoaGRsY19oZWFkZXIqKXNrYi0+ZGF0YTsKKworCWlmIChza2ItPmxlbiA8IHNpemVvZihoZGxjX2hlYWRlcikpCisJCXJldHVybiBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0hETEMpOworCisJaWYgKGRhdGEtPmFkZHJlc3MgIT0gQ0lTQ09fTVVMVElDQVNUICYmCisJICAgIGRhdGEtPmFkZHJlc3MgIT0gQ0lTQ09fVU5JQ0FTVCkKKwkJcmV0dXJuIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSERMQyk7CisKKwlzd2l0Y2goZGF0YS0+cHJvdG9jb2wpIHsKKwljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOgorCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFgpOgorCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KToKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2YoaGRsY19oZWFkZXIpKTsKKwkJcmV0dXJuIGRhdGEtPnByb3RvY29sOworCWRlZmF1bHQ6CisJCXJldHVybiBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0hETEMpOworCX0KK30KKworCitzdGF0aWMgaW50IGNpc2NvX3J4KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwloZGxjX2hlYWRlciAqZGF0YSA9IChoZGxjX2hlYWRlciopc2tiLT5kYXRhOworCWNpc2NvX3BhY2tldCAqY2lzY29fZGF0YTsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisJdTMyIGFkZHIsIG1hc2s7CisKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2YoaGRsY19oZWFkZXIpKQorCQlnb3RvIHJ4X2Vycm9yOworCisJaWYgKGRhdGEtPmFkZHJlc3MgIT0gQ0lTQ09fTVVMVElDQVNUICYmCisJICAgIGRhdGEtPmFkZHJlc3MgIT0gQ0lTQ09fVU5JQ0FTVCkKKwkJZ290byByeF9lcnJvcjsKKworCXN3aXRjaChudG9ocyhkYXRhLT5wcm90b2NvbCkpIHsKKwljYXNlIENJU0NPX1NZU19JTkZPOgorCQkvKiBQYWNrZXQgaXMgbm90IG5lZWRlZCwgZHJvcCBpdC4gKi8KKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOworCisJY2FzZSBDSVNDT19LRUVQQUxJVkU6CisJCWlmIChza2ItPmxlbiAhPSBzaXplb2YoaGRsY19oZWFkZXIpICsgQ0lTQ09fUEFDS0VUX0xFTiAmJgorCQkgICAgc2tiLT5sZW4gIT0gc2l6ZW9mKGhkbGNfaGVhZGVyKSArIENJU0NPX0JJR19QQUNLRVRfTEVOKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW52YWxpZCBsZW5ndGggb2YgQ2lzY28gIgorCQkJICAgICAgICJjb250cm9sIHBhY2tldCAoJWQgYnl0ZXMpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc2tiLT5sZW4pOworCQkJZ290byByeF9lcnJvcjsKKwkJfQorCisJCWNpc2NvX2RhdGEgPSAoY2lzY29fcGFja2V0Kikoc2tiLT5kYXRhICsgc2l6ZW9mKGhkbGNfaGVhZGVyKSk7CisKKwkJc3dpdGNoKG50b2hsIChjaXNjb19kYXRhLT50eXBlKSkgeworCQljYXNlIENJU0NPX0FERFJfUkVROiAvKiBTdG9sZW4gZnJvbSBzeW5jcHBwLmMgOi0pICovCisJCQlpbl9kZXYgPSBkZXYtPmlwX3B0cjsKKwkJCWFkZHIgPSAwOworCQkJbWFzayA9IH4wOyAvKiBpcyB0aGUgbWFzayBjb3JyZWN0PyAqLworCisJCQlpZiAoaW5fZGV2ICE9IE5VTEwpIHsKKwkJCQlzdHJ1Y3QgaW5faWZhZGRyICoqaWZhcCA9ICZpbl9kZXYtPmlmYV9saXN0OworCisJCQkJd2hpbGUgKCppZmFwICE9IE5VTEwpIHsKKwkJCQkJaWYgKHN0cmNtcChkZXYtPm5hbWUsCisJCQkJCQkgICAoKmlmYXApLT5pZmFfbGFiZWwpID09IDApIHsKKwkJCQkJCWFkZHIgPSAoKmlmYXApLT5pZmFfbG9jYWw7CisJCQkJCQltYXNrID0gKCppZmFwKS0+aWZhX21hc2s7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZmFwID0gJigqaWZhcCktPmlmYV9uZXh0OworCQkJCX0KKworCQkJCWNpc2NvX2tlZXBhbGl2ZV9zZW5kKGRldiwgQ0lTQ09fQUREUl9SRVBMWSwKKwkJCQkJCSAgICAgYWRkciwgbWFzayk7CisJCQl9CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOworCisJCWNhc2UgQ0lTQ09fQUREUl9SRVBMWToKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmV4cGVjdGVkIENpc2NvIElQIGFkZHJlc3MgIgorCQkJICAgICAgICJyZXBseVxuIiwgZGV2LT5uYW1lKTsKKwkJCWdvdG8gcnhfZXJyb3I7CisKKwkJY2FzZSBDSVNDT19LRUVQQUxJVkVfUkVROgorCQkJaGRsYy0+c3RhdGUuY2lzY28ucnhzZXEgPSBudG9obChjaXNjb19kYXRhLT5wYXIxKTsKKwkJCWlmIChoZGxjLT5zdGF0ZS5jaXNjby5yZXF1ZXN0X3NlbnQgJiYKKwkJCSAgICBudG9obChjaXNjb19kYXRhLT5wYXIyKT09aGRsYy0+c3RhdGUuY2lzY28udHhzZXEpIHsKKwkJCQloZGxjLT5zdGF0ZS5jaXNjby5sYXN0X3BvbGwgPSBqaWZmaWVzOworCQkJCWlmICghaGRsYy0+c3RhdGUuY2lzY28udXApIHsKKwkJCQkJdTMyIHNlYywgbWluLCBocnMsIGRheXM7CisJCQkJCXNlYyA9IG50b2hsKGNpc2NvX2RhdGEtPnRpbWUpIC8gMTAwMDsKKwkJCQkJbWluID0gc2VjIC8gNjA7IHNlYyAtPSBtaW4gKiA2MDsKKwkJCQkJaHJzID0gbWluIC8gNjA7IG1pbiAtPSBocnMgKiA2MDsKKwkJCQkJZGF5cyA9IGhycyAvIDI0OyBocnMgLT0gZGF5cyAqIDI0OworCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayB1cCAocGVlciAiCisJCQkJCSAgICAgICAidXB0aW1lICV1ZCV1aCV1bSV1cylcbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsIGRheXMsIGhycywKKwkJCQkJICAgICAgIG1pbiwgc2VjKTsKKwkJCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJCQloZGxjLT5zdGF0ZS5jaXNjby51cCA9IDE7CisJCQkJfQorCQkJfQorCisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOworCQl9IC8qIHN3aXRjaChrZWVwYWxpdmUgdHlwZSkgKi8KKwl9IC8qIHN3aXRjaChwcm90b2NvbCkgKi8KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbnN1cHBvcnRlZCBwcm90b2NvbCAleFxuIiwgZGV2LT5uYW1lLAorCSAgICAgICBkYXRhLT5wcm90b2NvbCk7CisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlyZXR1cm4gTkVUX1JYX0RST1A7CisKKyByeF9lcnJvcjoKKwloZGxjLT5zdGF0cy5yeF9lcnJvcnMrKzsgLyogTWFyayBlcnJvciAqLworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIE5FVF9SWF9EUk9QOworfQorCisKKworc3RhdGljIHZvaWQgY2lzY29fdGltZXIodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWFyZzsKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisKKwlpZiAoaGRsYy0+c3RhdGUuY2lzY28udXAgJiYKKwkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBoZGxjLT5zdGF0ZS5jaXNjby5sYXN0X3BvbGwgKworCQkgICAgICAgaGRsYy0+c3RhdGUuY2lzY28uc2V0dGluZ3MudGltZW91dCAqIEhaKSkgeworCQloZGxjLT5zdGF0ZS5jaXNjby51cCA9IDA7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJfQorCisJY2lzY29fa2VlcGFsaXZlX3NlbmQoZGV2LCBDSVNDT19LRUVQQUxJVkVfUkVRLAorCQkJICAgICArK2hkbGMtPnN0YXRlLmNpc2NvLnR4c2VxLAorCQkJICAgICBoZGxjLT5zdGF0ZS5jaXNjby5yeHNlcSk7CisJaGRsYy0+c3RhdGUuY2lzY28ucmVxdWVzdF9zZW50ID0gMTsKKwloZGxjLT5zdGF0ZS5jaXNjby50aW1lci5leHBpcmVzID0gamlmZmllcyArCisJCWhkbGMtPnN0YXRlLmNpc2NvLnNldHRpbmdzLmludGVydmFsICogSFo7CisJaGRsYy0+c3RhdGUuY2lzY28udGltZXIuZnVuY3Rpb24gPSBjaXNjb190aW1lcjsKKwloZGxjLT5zdGF0ZS5jaXNjby50aW1lci5kYXRhID0gYXJnOworCWFkZF90aW1lcigmaGRsYy0+c3RhdGUuY2lzY28udGltZXIpOworfQorCisKKworc3RhdGljIHZvaWQgY2lzY29fc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJaGRsYy0+c3RhdGUuY2lzY28udXAgPSAwOworCWhkbGMtPnN0YXRlLmNpc2NvLnJlcXVlc3Rfc2VudCA9IDA7CisJaGRsYy0+c3RhdGUuY2lzY28udHhzZXEgPSBoZGxjLT5zdGF0ZS5jaXNjby5yeHNlcSA9IDA7CisKKwlpbml0X3RpbWVyKCZoZGxjLT5zdGF0ZS5jaXNjby50aW1lcik7CisJaGRsYy0+c3RhdGUuY2lzY28udGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsgLypGaXJzdCBwb2xsIGFmdGVyIDFzKi8KKwloZGxjLT5zdGF0ZS5jaXNjby50aW1lci5mdW5jdGlvbiA9IGNpc2NvX3RpbWVyOworCWhkbGMtPnN0YXRlLmNpc2NvLnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJYWRkX3RpbWVyKCZoZGxjLT5zdGF0ZS5jaXNjby50aW1lcik7Cit9CisKKworCitzdGF0aWMgdm9pZCBjaXNjb19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWRlbF90aW1lcl9zeW5jKCZoZGxjLT5zdGF0ZS5jaXNjby50aW1lcik7CisJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkKKwkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwloZGxjLT5zdGF0ZS5jaXNjby51cCA9IDA7CisJaGRsYy0+c3RhdGUuY2lzY28ucmVxdWVzdF9zZW50ID0gMDsKK30KKworCisKK2ludCBoZGxjX2Npc2NvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCWNpc2NvX3Byb3RvIF9fdXNlciAqY2lzY29fcyA9IGlmci0+aWZyX3NldHRpbmdzLmlmc19pZnN1LmNpc2NvOworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKGNpc2NvX3Byb3RvKTsKKwljaXNjb19wcm90byBuZXdfc2V0dGluZ3M7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWludCByZXN1bHQ7CisKKwlzd2l0Y2ggKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX0dFVF9QUk9UTzoKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX1BST1RPX0NJU0NPOworCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemUpIHsKKwkJCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplOyAvKiBkYXRhIHNpemUgd2FudGVkICovCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihjaXNjb19zLCAmaGRsYy0+c3RhdGUuY2lzY28uc2V0dGluZ3MsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBJRl9QUk9UT19DSVNDTzoKKwkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NldHRpbmdzLCBjaXNjb19zLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChuZXdfc2V0dGluZ3MuaW50ZXJ2YWwgPCAxIHx8CisJCSAgICBuZXdfc2V0dGluZ3MudGltZW91dCA8IDIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXN1bHQ9aGRsYy0+YXR0YWNoKGRldiwgRU5DT0RJTkdfTlJaLFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQpOworCisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCWhkbGNfcHJvdG9fZGV0YWNoKGhkbGMpOworCQltZW1jcHkoJmhkbGMtPnN0YXRlLmNpc2NvLnNldHRpbmdzLCAmbmV3X3NldHRpbmdzLCBzaXplKTsKKwkJbWVtc2V0KCZoZGxjLT5wcm90bywgMCwgc2l6ZW9mKGhkbGMtPnByb3RvKSk7CisKKwkJaGRsYy0+cHJvdG8uc3RhcnQgPSBjaXNjb19zdGFydDsKKwkJaGRsYy0+cHJvdG8uc3RvcCA9IGNpc2NvX3N0b3A7CisJCWhkbGMtPnByb3RvLm5ldGlmX3J4ID0gY2lzY29fcng7CisJCWhkbGMtPnByb3RvLnR5cGVfdHJhbnMgPSBjaXNjb190eXBlX3RyYW5zOworCQloZGxjLT5wcm90by5pZCA9IElGX1BST1RPX0NJU0NPOworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGhkbGMtPnhtaXQ7CisJCWRldi0+aGFyZF9oZWFkZXIgPSBjaXNjb19oYXJkX2hlYWRlcjsKKwkJZGV2LT5oYXJkX2hlYWRlcl9jYWNoZSA9IE5VTEw7CisJCWRldi0+dHlwZSA9IEFSUEhSRF9DSVNDTzsKKwkJZGV2LT5mbGFncyA9IElGRl9QT0lOVE9QT0lOVCB8IElGRl9OT0FSUDsKKwkJZGV2LT5hZGRyX2xlbiA9IDA7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfZnIuYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2ZyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0NTBiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2ZyLmMKQEAgLTAsMCArMSwxMjM3IEBACisvKgorICogR2VuZXJpYyBIRExDIHN1cHBvcnQgcm91dGluZXMgZm9yIExpbnV4CisgKiBGcmFtZSBSZWxheSBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IC0gMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorCisgICAgICAgICAgICBUaGVvcnkgb2YgUFZDIHN0YXRlCisKKyBEQ0UgbW9kZToKKworIChleGlzdCxuZXcpIC0+IDAsMCB3aGVuICJQVkMgY3JlYXRlIiBvciBpZiAibGluayB1bnJlbGlhYmxlIgorICAgICAgICAgMCx4IC0+IDEsMSBpZiAibGluayByZWxpYWJsZSIgd2hlbiBzZW5kaW5nIEZVTEwgU1RBVFVTCisgICAgICAgICAxLDEgLT4gMSwwIGlmIHJlY2VpdmVkIEZVTEwgU1RBVFVTIEFDSworCisgKGFjdGl2ZSkgICAgLT4gMCB3aGVuICJpZmNvbmZpZyBQVkMgZG93biIgb3IgImxpbmsgdW5yZWxpYWJsZSIgb3IgIlBWQyBjcmVhdGUiCisgICAgICAgICAgICAgLT4gMSB3aGVuICJQVkMgdXAiIGFuZCAoZXhpc3QsbmV3KSA9IDEsMAorCisgRFRFIG1vZGU6CisgKGV4aXN0LG5ldyxhY3RpdmUpID0gRlVMTCBTVEFUVVMgaWYgImxpbmsgcmVsaWFibGUiCisJCSAgICA9IDAsIDAsIDAgaWYgImxpbmsgdW5yZWxpYWJsZSIKKyBObyBMTUk6CisgYWN0aXZlID0gb3BlbiBhbmQgImxpbmsgcmVsaWFibGUiCisgZXhpc3QgPSBuZXcgPSBub3QgdXNlZAorCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGFwYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisjdW5kZWYgREVCVUdfUEtUCisjdW5kZWYgREVCVUdfRUNOCisjdW5kZWYgREVCVUdfTElOSworCisjZGVmaW5lIE1BWExFTl9MTUlTVEFUICAyMAkvKiBtYXggc2l6ZSBvZiBzdGF0dXMgZW5xdWlyeSBmcmFtZSAqLworCisjZGVmaW5lIFBWQ19TVEFURV9ORVcJIDB4MDEKKyNkZWZpbmUgUFZDX1NUQVRFX0FDVElWRSAweDAyCisjZGVmaW5lIFBWQ19TVEFURV9GRUNOCSAweDA4IC8qIEZFQ04gY29uZGl0aW9uICovCisjZGVmaW5lIFBWQ19TVEFURV9CRUNOCSAweDEwIC8qIEJFQ04gY29uZGl0aW9uICovCisKKworI2RlZmluZSBGUl9VSQkJIDB4MDMKKyNkZWZpbmUgRlJfUEFECQkgMHgwMAorCisjZGVmaW5lIE5MUElEX0lQCSAweENDCisjZGVmaW5lIE5MUElEX0lQVjYJIDB4OEUKKyNkZWZpbmUgTkxQSURfU05BUAkgMHg4MAorI2RlZmluZSBOTFBJRF9QQUQJIDB4MDAKKyNkZWZpbmUgTkxQSURfUTkzMwkgMHgwOAorCisKKyNkZWZpbmUgTE1JX0RMQ0kgICAgICAgICAgICAgICAgICAgMCAvKiBMTUkgRExDSSAqLworI2RlZmluZSBMTUlfUFJPVE8gICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIExNSV9DQUxMUkVGICAgICAgICAgICAgIDB4MDAgLyogQ2FsbCBSZWZlcmVuY2UgKi8KKyNkZWZpbmUgTE1JX0FOU0lfTE9DS1NISUZUICAgICAgMHg5NSAvKiBBTlNJIGxvY2tzaGlmdCAqLworI2RlZmluZSBMTUlfUkVQVFlQRSAgICAgICAgICAgICAgICAxIC8qIHJlcG9ydCB0eXBlICovCisjZGVmaW5lIExNSV9DQ0lUVF9SRVBUWVBFICAgICAgIDB4NTEKKyNkZWZpbmUgTE1JX0FMSVZFICAgICAgICAgICAgICAgICAgMyAvKiBrZWVwIGFsaXZlICovCisjZGVmaW5lIExNSV9DQ0lUVF9BTElWRSAgICAgICAgIDB4NTMKKyNkZWZpbmUgTE1JX1BWQ1NUQVQgICAgICAgICAgICAgICAgNyAvKiBwdmMgc3RhdHVzICovCisjZGVmaW5lIExNSV9DQ0lUVF9QVkNTVEFUICAgICAgIDB4NTcKKyNkZWZpbmUgTE1JX0ZVTExSRVAgICAgICAgICAgICAgICAgMCAvKiBmdWxsIHJlcG9ydCAgKi8KKyNkZWZpbmUgTE1JX0lOVEVHUklUWSAgICAgICAgICAgICAgMSAvKiBsaW5rIGludGVncml0eSByZXBvcnQgKi8KKyNkZWZpbmUgTE1JX1NJTkdMRSAgICAgICAgICAgICAgICAgMiAvKiBzaW5nbGUgcHZjIHJlcG9ydCAqLworI2RlZmluZSBMTUlfU1RBVFVTX0VOUVVJUlkgICAgICAweDc1CisjZGVmaW5lIExNSV9TVEFUVVMgICAgICAgICAgICAgIDB4N0QgLyogcmVwbHkgKi8KKworI2RlZmluZSBMTUlfUkVQVF9MRU4gICAgICAgICAgICAgICAxIC8qIHJlcG9ydCB0eXBlIGVsZW1lbnQgbGVuZ3RoICovCisjZGVmaW5lIExNSV9JTlRFR19MRU4gICAgICAgICAgICAgIDIgLyogbGluayBpbnRlZ3JpdHkgZWxlbWVudCBsZW5ndGggKi8KKworI2RlZmluZSBMTUlfTEVOR1RIICAgICAgICAgICAgICAgIDEzIC8qIHN0YW5kYXJkIExNSSBmcmFtZSBsZW5ndGggKi8KKyNkZWZpbmUgTE1JX0FOU0lfTEVOR1RIICAgICAgICAgICAxNAorCisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwl1bnNpZ25lZCBlYTE6CTE7CisJdW5zaWduZWQgY3I6CTE7CisJdW5zaWduZWQgZGxjaWg6CTY7CisgIAorCXVuc2lnbmVkIGVhMjoJMTsKKwl1bnNpZ25lZCBkZToJMTsKKwl1bnNpZ25lZCBiZWNuOgkxOworCXVuc2lnbmVkIGZlY246CTE7CisJdW5zaWduZWQgZGxjaWw6CTQ7CisjZWxzZQorCXVuc2lnbmVkIGRsY2loOgk2OworCXVuc2lnbmVkIGNyOgkxOworCXVuc2lnbmVkIGVhMToJMTsKKworCXVuc2lnbmVkIGRsY2lsOgk0OworCXVuc2lnbmVkIGZlY246CTE7CisJdW5zaWduZWQgYmVjbjoJMTsKKwl1bnNpZ25lZCBkZToJMTsKKwl1bnNpZ25lZCBlYTI6CTE7CisjZW5kaWYKK31fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZnJfaGRyOworCisKK3N0YXRpYyBpbmxpbmUgdTE2IHE5MjJfdG9fZGxjaSh1OCAqaGRyKQoreworCXJldHVybiAoKGhkclswXSAmIDB4RkMpIDw8IDIpIHwgKChoZHJbMV0gJiAweEYwKSA+PiA0KTsKK30KKworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbGNpX3RvX3E5MjIodTggKmhkciwgdTE2IGRsY2kpCit7CisJaGRyWzBdID0gKGRsY2kgPj4gMikgJiAweEZDOworCWhkclsxXSA9ICgoZGxjaSA8PCA0KSAmIDB4RjApIHwgMHgwMTsKK30KKworCisKK3N0YXRpYyBpbmxpbmUgcHZjX2RldmljZSogZmluZF9wdmMoaGRsY19kZXZpY2UgKmhkbGMsIHUxNiBkbGNpKQoreworCXB2Y19kZXZpY2UgKnB2YyA9IGhkbGMtPnN0YXRlLmZyLmZpcnN0X3B2YzsKKworCXdoaWxlIChwdmMpIHsKKwkJaWYgKHB2Yy0+ZGxjaSA9PSBkbGNpKQorCQkJcmV0dXJuIHB2YzsKKwkJaWYgKHB2Yy0+ZGxjaSA+IGRsY2kpCisJCQlyZXR1cm4gTlVMTDsgLyogdGhlIGxpc3RlZCBpcyBzb3J0ZWQgKi8KKwkJcHZjID0gcHZjLT5uZXh0OworCX0KKworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyBpbmxpbmUgcHZjX2RldmljZSogYWRkX3B2YyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgZGxjaSkKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJcHZjX2RldmljZSAqcHZjLCAqKnB2Y19wID0gJmhkbGMtPnN0YXRlLmZyLmZpcnN0X3B2YzsKKworCXdoaWxlICgqcHZjX3ApIHsKKwkJaWYgKCgqcHZjX3ApLT5kbGNpID09IGRsY2kpCisJCQlyZXR1cm4gKnB2Y19wOworCQlpZiAoKCpwdmNfcCktPmRsY2kgPiBkbGNpKQorCQkJYnJlYWs7CS8qIHRoZSBsaXN0IGlzIHNvcnRlZCAqLworCQlwdmNfcCA9ICYoKnB2Y19wKS0+bmV4dDsKKwl9CisKKwlwdmMgPSBrbWFsbG9jKHNpemVvZihwdmNfZGV2aWNlKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFwdmMpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KHB2YywgMCwgc2l6ZW9mKHB2Y19kZXZpY2UpKTsKKwlwdmMtPmRsY2kgPSBkbGNpOworCXB2Yy0+bWFzdGVyID0gZGV2OworCXB2Yy0+bmV4dCA9ICpwdmNfcDsJLyogUHV0IGl0IGluIHRoZSBjaGFpbiAqLworCSpwdmNfcCA9IHB2YzsKKwlyZXR1cm4gcHZjOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHB2Y19pc191c2VkKHB2Y19kZXZpY2UgKnB2YykKK3sKKwlyZXR1cm4gcHZjLT5tYWluICE9IE5VTEwgfHwgcHZjLT5ldGhlciAhPSBOVUxMOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdmNfY2FycmllcihpbnQgb24sIHB2Y19kZXZpY2UgKnB2YykKK3sKKwlpZiAob24pIHsKKwkJaWYgKHB2Yy0+bWFpbikKKwkJCWlmICghbmV0aWZfY2Fycmllcl9vayhwdmMtPm1haW4pKQorCQkJCW5ldGlmX2NhcnJpZXJfb24ocHZjLT5tYWluKTsKKwkJaWYgKHB2Yy0+ZXRoZXIpCisJCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2socHZjLT5ldGhlcikpCisJCQkJbmV0aWZfY2Fycmllcl9vbihwdmMtPmV0aGVyKTsKKwl9IGVsc2UgeworCQlpZiAocHZjLT5tYWluKQorCQkJaWYgKG5ldGlmX2NhcnJpZXJfb2socHZjLT5tYWluKSkKKwkJCQluZXRpZl9jYXJyaWVyX29mZihwdmMtPm1haW4pOworCQlpZiAocHZjLT5ldGhlcikKKwkJCWlmIChuZXRpZl9jYXJyaWVyX29rKHB2Yy0+ZXRoZXIpKQorCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKHB2Yy0+ZXRoZXIpOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsZXRlX3VudXNlZF9wdmNzKGhkbGNfZGV2aWNlICpoZGxjKQoreworCXB2Y19kZXZpY2UgKipwdmNfcCA9ICZoZGxjLT5zdGF0ZS5mci5maXJzdF9wdmM7CisKKwl3aGlsZSAoKnB2Y19wKSB7CisJCWlmICghcHZjX2lzX3VzZWQoKnB2Y19wKSkgeworCQkJcHZjX2RldmljZSAqcHZjID0gKnB2Y19wOworCQkJKnB2Y19wID0gcHZjLT5uZXh0OworCQkJa2ZyZWUocHZjKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXB2Y19wID0gJigqcHZjX3ApLT5uZXh0OworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlKiogZ2V0X2Rldl9wKHB2Y19kZXZpY2UgKnB2YywgaW50IHR5cGUpCit7CisJaWYgKHR5cGUgPT0gQVJQSFJEX0VUSEVSKQorCQlyZXR1cm4gJnB2Yy0+ZXRoZXI7CisJZWxzZQorCQlyZXR1cm4gJnB2Yy0+bWFpbjsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBzdGF0dXNfdG9fZGxjaSh1OCAqc3RhdHVzLCBpbnQgKmFjdGl2ZSwgaW50ICpuZXcpCit7CisJKm5ldyA9IChzdGF0dXNbMl0gJiAweDA4KSA/IDEgOiAwOworCSphY3RpdmUgPSAoc3RhdHVzWzJdICYgMHgwMikgPyAxIDogMDsKKworCXJldHVybiAoKHN0YXR1c1swXSAmIDB4M0YpIDw8IDQpIHwgKChzdGF0dXNbMV0gJiAweDc4KSA+PiAzKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgZGxjaV90b19zdGF0dXModTE2IGRsY2ksIHU4ICpzdGF0dXMsIGludCBhY3RpdmUsIGludCBuZXcpCit7CisJc3RhdHVzWzBdID0gKGRsY2kgPj4gNCkgJiAweDNGOworCXN0YXR1c1sxXSA9ICgoZGxjaSA8PCAzKSAmIDB4NzgpIHwgMHg4MDsKKwlzdGF0dXNbMl0gPSAweDgwOworCisJaWYgKG5ldykKKwkJc3RhdHVzWzJdIHw9IDB4MDg7CisJZWxzZSBpZiAoYWN0aXZlKQorCQlzdGF0dXNbMl0gfD0gMHgwMjsKK30KKworCisKK3N0YXRpYyBpbnQgZnJfaGFyZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKipza2JfcCwgdTE2IGRsY2kpCit7CisJdTE2IGhlYWRfbGVuOworCXN0cnVjdCBza19idWZmICpza2IgPSAqc2tiX3A7CisKKwlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKKwljYXNlIF9fY29uc3RhbnRfbnRvaHMoRVRIX1BfSVApOgorCQloZWFkX2xlbiA9IDQ7CisJCXNrYl9wdXNoKHNrYiwgaGVhZF9sZW4pOworCQlza2ItPmRhdGFbM10gPSBOTFBJRF9JUDsKKwkJYnJlYWs7CisKKwljYXNlIF9fY29uc3RhbnRfbnRvaHMoRVRIX1BfSVBWNik6CisJCWhlYWRfbGVuID0gNDsKKwkJc2tiX3B1c2goc2tiLCBoZWFkX2xlbik7CisJCXNrYi0+ZGF0YVszXSA9IE5MUElEX0lQVjY7CisJCWJyZWFrOworCisJY2FzZSBfX2NvbnN0YW50X250b2hzKExNSV9QUk9UTyk6CisJCWhlYWRfbGVuID0gNDsKKwkJc2tiX3B1c2goc2tiLCBoZWFkX2xlbik7CisJCXNrYi0+ZGF0YVszXSA9IExNSV9QUk9UTzsKKwkJYnJlYWs7CisKKwljYXNlIF9fY29uc3RhbnRfbnRvaHMoRVRIX1BfODAyXzMpOgorCQloZWFkX2xlbiA9IDEwOworCQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBoZWFkX2xlbikgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsCisJCQkJCQkJCSAgICBoZWFkX2xlbik7CisJCQlpZiAoIXNrYjIpCisJCQkJcmV0dXJuIC1FTk9CVUZTOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJc2tiID0gKnNrYl9wID0gc2tiMjsKKwkJfQorCQlza2JfcHVzaChza2IsIGhlYWRfbGVuKTsKKwkJc2tiLT5kYXRhWzNdID0gRlJfUEFEOworCQlza2ItPmRhdGFbNF0gPSBOTFBJRF9TTkFQOworCQlza2ItPmRhdGFbNV0gPSBGUl9QQUQ7CisJCXNrYi0+ZGF0YVs2XSA9IDB4ODA7CisJCXNrYi0+ZGF0YVs3XSA9IDB4QzI7CisJCXNrYi0+ZGF0YVs4XSA9IDB4MDA7CisJCXNrYi0+ZGF0YVs5XSA9IDB4MDc7IC8qIGJyaWRnZWQgRXRoZXJuZXQgZnJhbWUgdy9vdXQgRkNTICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaGVhZF9sZW4gPSAxMDsKKwkJc2tiX3B1c2goc2tiLCBoZWFkX2xlbik7CisJCXNrYi0+ZGF0YVszXSA9IEZSX1BBRDsKKwkJc2tiLT5kYXRhWzRdID0gTkxQSURfU05BUDsKKwkJc2tiLT5kYXRhWzVdID0gRlJfUEFEOworCQlza2ItPmRhdGFbNl0gPSBGUl9QQUQ7CisJCXNrYi0+ZGF0YVs3XSA9IEZSX1BBRDsKKwkJKih1MTYqKShza2ItPmRhdGEgKyA4KSA9IHNrYi0+cHJvdG9jb2w7CisJfQorCisJZGxjaV90b19xOTIyKHNrYi0+ZGF0YSwgZGxjaSk7CisJc2tiLT5kYXRhWzJdID0gRlJfVUk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IHB2Y19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHZjX2RldmljZSAqcHZjID0gZGV2X3RvX3B2YyhkZXYpOworCisJaWYgKChwdmMtPm1hc3Rlci0+ZmxhZ3MgJiBJRkZfVVApID09IDApCisJCXJldHVybiAtRUlPOyAgLyogTWFzdGVyIG11c3QgYmUgVVAgaW4gb3JkZXIgdG8gYWN0aXZhdGUgUFZDICovCisKKwlpZiAocHZjLT5vcGVuX2NvdW50KysgPT0gMCkgeworCQloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKHB2Yy0+bWFzdGVyKTsKKwkJaWYgKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmxtaSA9PSBMTUlfTk9ORSkKKwkJCXB2Yy0+c3RhdGUuYWN0aXZlID0gaGRsYy0+Y2FycmllcjsKKworCQlwdmNfY2FycmllcihwdmMtPnN0YXRlLmFjdGl2ZSwgcHZjKTsKKwkJaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQgPSAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgcHZjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHZjX2RldmljZSAqcHZjID0gZGV2X3RvX3B2YyhkZXYpOworCisJaWYgKC0tcHZjLT5vcGVuX2NvdW50ID09IDApIHsKKwkJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhwdmMtPm1hc3Rlcik7CisJCWlmIChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgPT0gTE1JX05PTkUpCisJCQlwdmMtPnN0YXRlLmFjdGl2ZSA9IDA7CisKKwkJaWYgKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmRjZSkgeworCQkJaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQgPSAxOworCQkJcHZjLT5zdGF0ZS5hY3RpdmUgPSAwOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKKworaW50IHB2Y19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlwdmNfZGV2aWNlICpwdmMgPSBkZXZfdG9fcHZjKGRldik7CisJZnJfcHJvdG9fcHZjX2luZm8gaW5mbzsKKworCWlmIChpZnItPmlmcl9zZXR0aW5ncy50eXBlID09IElGX0dFVF9QUk9UTykgeworCQlpZiAoZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUikKKwkJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9QUk9UT19GUl9FVEhfUFZDOworCQllbHNlCisJCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfUFJPVE9fRlJfUFZDOworCisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZW9mKGluZm8pKSB7CisJCQkvKiBkYXRhIHNpemUgd2FudGVkICovCisJCQlpZnItPmlmcl9zZXR0aW5ncy5zaXplID0gc2l6ZW9mKGluZm8pOworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisKKwkJaW5mby5kbGNpID0gcHZjLT5kbGNpOworCQltZW1jcHkoaW5mby5tYXN0ZXIsIHB2Yy0+bWFzdGVyLT5uYW1lLCBJRk5BTVNJWik7CisJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3UuZnJfcHZjX2luZm8sCisJCQkJICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnB2Y19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbmV0ZGV2X3ByaXYoZGV2KTsKK30KKworCisKK3N0YXRpYyBpbnQgcHZjX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwdmNfZGV2aWNlICpwdmMgPSBkZXZfdG9fcHZjKGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gcHZjX2dldF9zdGF0cyhkZXYpOworCisJaWYgKHB2Yy0+c3RhdGUuYWN0aXZlKSB7CisJCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0VUSEVSKSB7CisJCQlpbnQgcGFkID0gRVRIX1pMRU4gLSBza2ItPmxlbjsKKwkJCWlmIChwYWQgPiAwKSB7IC8qIFBhZCB0aGUgZnJhbWUgd2l0aCB6ZXJvcyAqLworCQkJCWludCBsZW4gPSBza2ItPmxlbjsKKwkJCQlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBwYWQpCisJCQkJCWlmIChwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgcGFkLAorCQkJCQkJCSAgICAgR0ZQX0FUT01JQykpIHsKKwkJCQkJCXN0YXRzLT50eF9kcm9wcGVkKys7CisJCQkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCXNrYl9wdXQoc2tiLCBwYWQpOworCQkJCW1lbXNldChza2ItPmRhdGEgKyBsZW4sIDAsIHBhZCk7CisJCQl9CisJCQlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDJfMyk7CisJCX0KKwkJaWYgKCFmcl9oYXJkX2hlYWRlcigmc2tiLCBwdmMtPmRsY2kpKSB7CisJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQlzdGF0cy0+dHhfcGFja2V0cysrOworCQkJaWYgKHB2Yy0+c3RhdGUuZmVjbikgLyogVFggQ29uZ2VzdGlvbiBjb3VudGVyICovCisJCQkJc3RhdHMtPnR4X2NvbXByZXNzZWQrKzsKKwkJCXNrYi0+ZGV2ID0gcHZjLT5tYXN0ZXI7CisJCQlkZXZfcXVldWVfeG1pdChza2IpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlzdGF0cy0+dHhfZHJvcHBlZCsrOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgcHZjX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKChuZXdfbXR1IDwgNjgpIHx8IChuZXdfbXR1ID4gSERMQ19NQVhfTVRVKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGlubGluZSB2b2lkIGZyX2xvZ19kbGNpX2FjdGl2ZShwdmNfZGV2aWNlICpwdmMpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERMQ0kgJWQgWyVzJXMlc10lcyAlc1xuIiwKKwkgICAgICAgcHZjLT5tYXN0ZXItPm5hbWUsCisJICAgICAgIHB2Yy0+ZGxjaSwKKwkgICAgICAgcHZjLT5tYWluID8gcHZjLT5tYWluLT5uYW1lIDogIiIsCisJICAgICAgIHB2Yy0+bWFpbiAmJiBwdmMtPmV0aGVyID8gIiAiIDogIiIsCisJICAgICAgIHB2Yy0+ZXRoZXIgPyBwdmMtPmV0aGVyLT5uYW1lIDogIiIsCisJICAgICAgIHB2Yy0+c3RhdGUubmV3ID8gIiBuZXciIDogIiIsCisJICAgICAgICFwdmMtPnN0YXRlLmV4aXN0ID8gImRlbGV0ZWQiIDoKKwkgICAgICAgcHZjLT5zdGF0ZS5hY3RpdmUgPyAiYWN0aXZlIiA6ICJpbmFjdGl2ZSIpOworfQorCisKKworc3RhdGljIGlubGluZSB1OCBmcl9sbWlfbmV4dHNlcSh1OCB4KQoreworCXgrKzsKKwlyZXR1cm4geCA/IHggOiAxOworfQorCisKKworc3RhdGljIHZvaWQgZnJfbG1pX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZ1bGxyZXApCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCXN0cnVjdCBza19idWZmICpza2I7CisJcHZjX2RldmljZSAqcHZjID0gaGRsYy0+c3RhdGUuZnIuZmlyc3RfcHZjOworCWludCBsZW4gPSAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9BTlNJKSA/IExNSV9BTlNJX0xFTkdUSAorCQk6IExNSV9MRU5HVEg7CisJaW50IHN0YXRfbGVuID0gMzsKKwl1OCAqZGF0YTsKKwlpbnQgaSA9IDA7CisKKwlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MuZGNlICYmIGZ1bGxyZXApIHsKKwkJbGVuICs9IGhkbGMtPnN0YXRlLmZyLmRjZV9wdmNfY291bnQgKiAoMiArIHN0YXRfbGVuKTsKKwkJaWYgKGxlbiA+IEhETENfTUFYX01SVSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtYW55IFBWQ3Mgd2hpbGUgc2VuZGluZyAiCisJCQkgICAgICAgIkxNSSBmdWxsIHJlcG9ydFxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUgb24gZnJfbG1pX3NlbmQoKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KHNrYi0+ZGF0YSwgMCwgbGVuKTsKKwlza2JfcmVzZXJ2ZShza2IsIDQpOworCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKExNSV9QUk9UTyk7CisJZnJfaGFyZF9oZWFkZXIoJnNrYiwgTE1JX0RMQ0kpOworCWRhdGEgPSBza2ItPnRhaWw7CisJZGF0YVtpKytdID0gTE1JX0NBTExSRUY7CisJZGF0YVtpKytdID0gaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MuZGNlCisJCT8gTE1JX1NUQVRVUyA6IExNSV9TVEFUVVNfRU5RVUlSWTsKKwlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9BTlNJKQorCQlkYXRhW2krK10gPSBMTUlfQU5TSV9MT0NLU0hJRlQ7CisJZGF0YVtpKytdID0gKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmxtaSA9PSBMTUlfQ0NJVFQpCisJCT8gTE1JX0NDSVRUX1JFUFRZUEUgOiBMTUlfUkVQVFlQRTsKKwlkYXRhW2krK10gPSBMTUlfUkVQVF9MRU47CisJZGF0YVtpKytdID0gZnVsbHJlcCA/IExNSV9GVUxMUkVQIDogTE1JX0lOVEVHUklUWTsKKworCWRhdGFbaSsrXSA9IChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgPT0gTE1JX0NDSVRUKQorCQk/IExNSV9DQ0lUVF9BTElWRSA6IExNSV9BTElWRTsKKwlkYXRhW2krK10gPSBMTUlfSU5URUdfTEVOOworCWRhdGFbaSsrXSA9IGhkbGMtPnN0YXRlLmZyLnR4c2VxID1mcl9sbWlfbmV4dHNlcShoZGxjLT5zdGF0ZS5mci50eHNlcSk7CisJZGF0YVtpKytdID0gaGRsYy0+c3RhdGUuZnIucnhzZXE7CisKKwlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MuZGNlICYmIGZ1bGxyZXApIHsKKwkJd2hpbGUgKHB2YykgeworCQkJZGF0YVtpKytdID0gKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmxtaSA9PSBMTUlfQ0NJVFQpCisJCQkJPyBMTUlfQ0NJVFRfUFZDU1RBVCA6IExNSV9QVkNTVEFUOworCQkJZGF0YVtpKytdID0gc3RhdF9sZW47CisKKwkJCS8qIExNSSBzdGFydC9yZXN0YXJ0ICovCisJCQlpZiAoaGRsYy0+c3RhdGUuZnIucmVsaWFibGUgJiYgIXB2Yy0+c3RhdGUuZXhpc3QpIHsKKwkJCQlwdmMtPnN0YXRlLmV4aXN0ID0gcHZjLT5zdGF0ZS5uZXcgPSAxOworCQkJCWZyX2xvZ19kbGNpX2FjdGl2ZShwdmMpOworCQkJfQorCisJCQkvKiBpZmNvbmZpZyBQVkMgdXAgKi8KKwkJCWlmIChwdmMtPm9wZW5fY291bnQgJiYgIXB2Yy0+c3RhdGUuYWN0aXZlICYmCisJCQkgICAgcHZjLT5zdGF0ZS5leGlzdCAmJiAhcHZjLT5zdGF0ZS5uZXcpIHsKKwkJCQlwdmNfY2FycmllcigxLCBwdmMpOworCQkJCXB2Yy0+c3RhdGUuYWN0aXZlID0gMTsKKwkJCQlmcl9sb2dfZGxjaV9hY3RpdmUocHZjKTsKKwkJCX0KKworCQkJZGxjaV90b19zdGF0dXMocHZjLT5kbGNpLCBkYXRhICsgaSwKKwkJCQkgICAgICAgcHZjLT5zdGF0ZS5hY3RpdmUsIHB2Yy0+c3RhdGUubmV3KTsKKwkJCWkgKz0gc3RhdF9sZW47CisJCQlwdmMgPSBwdmMtPm5leHQ7CisJCX0KKwl9CisKKwlza2JfcHV0KHNrYiwgaSk7CisJc2tiLT5wcmlvcml0eSA9IFRDX1BSSU9fQ09OVFJPTDsKKwlza2ItPmRldiA9IGRldjsKKwlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKworCWRldl9xdWV1ZV94bWl0KHNrYik7Cit9CisKKworCitzdGF0aWMgdm9pZCBmcl9zZXRfbGlua19zdGF0ZShpbnQgcmVsaWFibGUsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCXB2Y19kZXZpY2UgKnB2YyA9IGhkbGMtPnN0YXRlLmZyLmZpcnN0X3B2YzsKKworCWhkbGMtPnN0YXRlLmZyLnJlbGlhYmxlID0gcmVsaWFibGU7CisJaWYgKHJlbGlhYmxlKSB7CisJCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCisJCWhkbGMtPnN0YXRlLmZyLm4zOTFjbnQgPSAwOyAvKiBSZXF1ZXN0IGZ1bGwgc3RhdHVzICovCisJCWhkbGMtPnN0YXRlLmZyLmRjZV9jaGFuZ2VkID0gMTsKKworCQlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9OT05FKSB7CisJCQl3aGlsZSAocHZjKSB7CS8qIEFjdGl2YXRlIGFsbCBQVkNzICovCisJCQkJcHZjX2NhcnJpZXIoMSwgcHZjKTsKKwkJCQlwdmMtPnN0YXRlLmV4aXN0ID0gcHZjLT5zdGF0ZS5hY3RpdmUgPSAxOworCQkJCXB2Yy0+c3RhdGUubmV3ID0gMDsKKwkJCQlwdmMgPSBwdmMtPm5leHQ7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCQl3aGlsZSAocHZjKSB7CQkvKiBEZWFjdGl2YXRlIGFsbCBQVkNzICovCisJCQlwdmNfY2FycmllcigwLCBwdmMpOworCQkJcHZjLT5zdGF0ZS5leGlzdCA9IHB2Yy0+c3RhdGUuYWN0aXZlID0gMDsKKwkJCXB2Yy0+c3RhdGUubmV3ID0gMDsKKwkJCXB2YyA9IHB2Yy0+bmV4dDsKKwkJfQorCX0KK30KKworCisKK3N0YXRpYyB2b2lkIGZyX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilhcmc7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWludCBpLCBjbnQgPSAwLCByZWxpYWJsZTsKKwl1MzIgbGlzdDsKKworCWlmIChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5kY2UpCisJCXJlbGlhYmxlID0gaGRsYy0+c3RhdGUuZnIucmVxdWVzdCAmJgorCQkJdGltZV9iZWZvcmUoamlmZmllcywgaGRsYy0+c3RhdGUuZnIubGFzdF9wb2xsICsKKwkJCQkgICAgaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MudDM5MiAqIEhaKTsKKwllbHNlIHsKKwkJaGRsYy0+c3RhdGUuZnIubGFzdF9lcnJvcnMgPDw9IDE7IC8qIFNoaWZ0IHRoZSBsaXN0ICovCisJCWlmIChoZGxjLT5zdGF0ZS5mci5yZXF1ZXN0KSB7CisJCQlpZiAoaGRsYy0+c3RhdGUuZnIucmVsaWFibGUpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIExNSSBzdGF0dXMgcmVwbHkgIgorCQkJCSAgICAgICAicmVjZWl2ZWRcbiIsIGRldi0+bmFtZSk7CisJCQloZGxjLT5zdGF0ZS5mci5sYXN0X2Vycm9ycyB8PSAxOworCQl9CisKKwkJbGlzdCA9IGhkbGMtPnN0YXRlLmZyLmxhc3RfZXJyb3JzOworCQlmb3IgKGkgPSAwOyBpIDwgaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubjM5MzsgaSsrLCBsaXN0ID4+PSAxKQorCQkJY250ICs9IChsaXN0ICYgMSk7CS8qIGVycm9ycyBjb3VudCAqLworCisJCXJlbGlhYmxlID0gKGNudCA8IGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLm4zOTIpOworCX0KKworCWlmIChoZGxjLT5zdGF0ZS5mci5yZWxpYWJsZSAhPSByZWxpYWJsZSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayAlc3JlbGlhYmxlXG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICByZWxpYWJsZSA/ICIiIDogInVuIik7CisJCWZyX3NldF9saW5rX3N0YXRlKHJlbGlhYmxlLCBkZXYpOworCX0KKworCWlmIChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5kY2UpCisJCWhkbGMtPnN0YXRlLmZyLnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKwkJCWhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLnQzOTIgKiBIWjsKKwllbHNlIHsKKwkJaWYgKGhkbGMtPnN0YXRlLmZyLm4zOTFjbnQpCisJCQloZGxjLT5zdGF0ZS5mci5uMzkxY250LS07CisKKwkJZnJfbG1pX3NlbmQoZGV2LCBoZGxjLT5zdGF0ZS5mci5uMzkxY250ID09IDApOworCisJCWhkbGMtPnN0YXRlLmZyLmxhc3RfcG9sbCA9IGppZmZpZXM7CisJCWhkbGMtPnN0YXRlLmZyLnJlcXVlc3QgPSAxOworCQloZGxjLT5zdGF0ZS5mci50aW1lci5leHBpcmVzID0gamlmZmllcyArCisJCQloZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy50MzkxICogSFo7CisJfQorCisJaGRsYy0+c3RhdGUuZnIudGltZXIuZnVuY3Rpb24gPSBmcl90aW1lcjsKKwloZGxjLT5zdGF0ZS5mci50aW1lci5kYXRhID0gYXJnOworCWFkZF90aW1lcigmaGRsYy0+c3RhdGUuZnIudGltZXIpOworfQorCisKKworc3RhdGljIGludCBmcl9sbWlfcmVjdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlpbnQgc3RhdF9sZW47CisJcHZjX2RldmljZSAqcHZjOworCWludCByZXB0eXBlID0gLTEsIGVycm9yLCBub19yYW07CisJdTggcnhzZXEsIHR4c2VxOworCWludCBpOworCisJaWYgKHNrYi0+bGVuIDwgKChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgPT0gTE1JX0FOU0kpCisJCQk/IExNSV9BTlNJX0xFTkdUSCA6IExNSV9MRU5HVEgpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTaG9ydCBMTUkgZnJhbWVcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChza2ItPmRhdGFbNV0gIT0gKCFoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5kY2UgPworCQkJICAgICBMTUlfU1RBVFVTIDogTE1JX1NUQVRVU19FTlFVSVJZKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTE1JIG1zZ3R5cGU9JXgsIE5vdCBMTUkgc3RhdHVzICVzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBza2ItPmRhdGFbMl0sCisJCSAgICAgICBoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5kY2UgPyAiZW5xdWlyeSIgOiAicmVwbHkiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaSA9IChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgPT0gTE1JX0FOU0kpID8gNyA6IDY7CisKKwlpZiAoc2tiLT5kYXRhW2ldICE9CisJICAgICgoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9DQ0lUVCkKKwkgICAgID8gTE1JX0NDSVRUX1JFUFRZUEUgOiBMTUlfUkVQVFlQRSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vdCBhIHJlcG9ydCB0eXBlPSV4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBza2ItPmRhdGFbaV0pOworCQlyZXR1cm4gMTsKKwl9CisJaSsrOworCisJaSsrOwkJCQkvKiBTa2lwIGxlbmd0aCBmaWVsZCAqLworCisJcmVwdHlwZSA9IHNrYi0+ZGF0YVtpKytdOworCisJaWYgKHNrYi0+ZGF0YVtpXSE9CisJICAgICgoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9DQ0lUVCkKKwkgICAgID8gTE1JX0NDSVRUX0FMSVZFIDogTE1JX0FMSVZFKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5zdXBwb3J0ZWQgc3RhdHVzIGVsZW1lbnQ9JXhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHNrYi0+ZGF0YVtpXSk7CisJCXJldHVybiAxOworCX0KKwlpKys7CisKKwlpKys7CQkJLyogU2tpcCBsZW5ndGggZmllbGQgKi8KKworCWhkbGMtPnN0YXRlLmZyLnJ4c2VxID0gc2tiLT5kYXRhW2krK107IC8qIFRYIHNlcXVlbmNlIGZyb20gcGVlciAqLworCXJ4c2VxID0gc2tiLT5kYXRhW2krK107CS8qIFNob3VsZCBjb25maXJtIG91ciBzZXF1ZW5jZSAqLworCisJdHhzZXEgPSBoZGxjLT5zdGF0ZS5mci50eHNlcTsKKworCWlmIChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5kY2UpIHsKKwkJaWYgKHJlcHR5cGUgIT0gTE1JX0ZVTExSRVAgJiYgcmVwdHlwZSAhPSBMTUlfSU5URUdSSVRZKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5zdXBwb3J0ZWQgcmVwb3J0IHR5cGU9JXhcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCByZXB0eXBlKTsKKwkJCXJldHVybiAxOworCQl9CisJCWhkbGMtPnN0YXRlLmZyLmxhc3RfcG9sbCA9IGppZmZpZXM7CisJfQorCisJZXJyb3IgPSAwOworCWlmICghaGRsYy0+c3RhdGUuZnIucmVsaWFibGUpCisJCWVycm9yID0gMTsKKworCWlmIChyeHNlcSA9PSAwIHx8IHJ4c2VxICE9IHR4c2VxKSB7CisJCWhkbGMtPnN0YXRlLmZyLm4zOTFjbnQgPSAwOyAvKiBBc2sgZm9yIGZ1bGwgcmVwb3J0IG5leHQgdGltZSAqLworCQllcnJvciA9IDE7CisJfQorCisJaWYgKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmRjZSkgeworCQlpZiAoaGRsYy0+c3RhdGUuZnIuZnVsbHJlcF9zZW50ICYmICFlcnJvcikgeworLyogU3RvcCBzZW5kaW5nIGZ1bGwgcmVwb3J0IC0gdGhlIGxhc3Qgb25lIGhhcyBiZWVuIGNvbmZpcm1lZCBieSBEVEUgKi8KKwkJCWhkbGMtPnN0YXRlLmZyLmZ1bGxyZXBfc2VudCA9IDA7CisJCQlwdmMgPSBoZGxjLT5zdGF0ZS5mci5maXJzdF9wdmM7CisJCQl3aGlsZSAocHZjKSB7CisJCQkJaWYgKHB2Yy0+c3RhdGUubmV3KSB7CisJCQkJCXB2Yy0+c3RhdGUubmV3ID0gMDsKKworLyogVGVsbCBEVEUgdGhhdCBuZXcgUFZDIGlzIG5vdyBhY3RpdmUgKi8KKwkJCQkJaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQgPSAxOworCQkJCX0KKwkJCQlwdmMgPSBwdmMtPm5leHQ7CisJCQl9CisJCX0KKworCQlpZiAoaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQpIHsKKwkJCXJlcHR5cGUgPSBMTUlfRlVMTFJFUDsKKwkJCWhkbGMtPnN0YXRlLmZyLmZ1bGxyZXBfc2VudCA9IDE7CisJCQloZGxjLT5zdGF0ZS5mci5kY2VfY2hhbmdlZCA9IDA7CisJCX0KKworCQlmcl9sbWlfc2VuZChkZXYsIHJlcHR5cGUgPT0gTE1JX0ZVTExSRVAgPyAxIDogMCk7CisJCXJldHVybiAwOworCX0KKworCS8qIERURSAqLworCisJaGRsYy0+c3RhdGUuZnIucmVxdWVzdCA9IDA7IC8qIGdvdCByZXNwb25zZSwgbm8gcmVxdWVzdCBwZW5kaW5nICovCisKKwlpZiAoZXJyb3IpCisJCXJldHVybiAwOworCisJaWYgKHJlcHR5cGUgIT0gTE1JX0ZVTExSRVApCisJCXJldHVybiAwOworCisJc3RhdF9sZW4gPSAzOworCXB2YyA9IGhkbGMtPnN0YXRlLmZyLmZpcnN0X3B2YzsKKworCXdoaWxlIChwdmMpIHsKKwkJcHZjLT5zdGF0ZS5kZWxldGVkID0gMTsKKwkJcHZjID0gcHZjLT5uZXh0OworCX0KKworCW5vX3JhbSA9IDA7CisJd2hpbGUgKHNrYi0+bGVuID49IGkgKyAyICsgc3RhdF9sZW4pIHsKKwkJdTE2IGRsY2k7CisJCXVuc2lnbmVkIGludCBhY3RpdmUsIG5ldzsKKworCQlpZiAoc2tiLT5kYXRhW2ldICE9ICgoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9DQ0lUVCkKKwkJCQkgICAgID8gTE1JX0NDSVRUX1BWQ1NUQVQgOiBMTUlfUFZDU1RBVCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnZhbGlkIFBWQ1NUQVQgSUQ6ICV4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc2tiLT5kYXRhW2ldKTsKKwkJCXJldHVybiAxOworCQl9CisJCWkrKzsKKworCQlpZiAoc2tiLT5kYXRhW2ldICE9IHN0YXRfbGVuKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW52YWxpZCBQVkNTVEFUIGxlbmd0aDogJXhcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBza2ItPmRhdGFbaV0pOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaSsrOworCisJCWRsY2kgPSBzdGF0dXNfdG9fZGxjaShza2ItPmRhdGEgKyBpLCAmYWN0aXZlLCAmbmV3KTsKKworCQlwdmMgPSBhZGRfcHZjKGRldiwgZGxjaSk7CisKKwkJaWYgKCFwdmMgJiYgIW5vX3JhbSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogTWVtb3J5IHNxdWVlemUgb24gZnJfbG1pX3JlY3YoKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJbm9fcmFtID0gMTsKKwkJfQorCisJCWlmIChwdmMpIHsKKwkJCXB2Yy0+c3RhdGUuZXhpc3QgPSAxOworCQkJcHZjLT5zdGF0ZS5kZWxldGVkID0gMDsKKwkJCWlmIChhY3RpdmUgIT0gcHZjLT5zdGF0ZS5hY3RpdmUgfHwKKwkJCSAgICBuZXcgIT0gcHZjLT5zdGF0ZS5uZXcgfHwKKwkJCSAgICAhcHZjLT5zdGF0ZS5leGlzdCkgeworCQkJCXB2Yy0+c3RhdGUubmV3ID0gbmV3OworCQkJCXB2Yy0+c3RhdGUuYWN0aXZlID0gYWN0aXZlOworCQkJCXB2Y19jYXJyaWVyKGFjdGl2ZSwgcHZjKTsKKwkJCQlmcl9sb2dfZGxjaV9hY3RpdmUocHZjKTsKKwkJCX0KKwkJfQorCisJCWkgKz0gc3RhdF9sZW47CisJfQorCisJcHZjID0gaGRsYy0+c3RhdGUuZnIuZmlyc3RfcHZjOworCisJd2hpbGUgKHB2YykgeworCQlpZiAocHZjLT5zdGF0ZS5kZWxldGVkICYmIHB2Yy0+c3RhdGUuZXhpc3QpIHsKKwkJCXB2Y19jYXJyaWVyKDAsIHB2Yyk7CisJCQlwdmMtPnN0YXRlLmFjdGl2ZSA9IHB2Yy0+c3RhdGUubmV3ID0gMDsKKwkJCXB2Yy0+c3RhdGUuZXhpc3QgPSAwOworCQkJZnJfbG9nX2RsY2lfYWN0aXZlKHB2Yyk7CisJCX0KKwkJcHZjID0gcHZjLT5uZXh0OworCX0KKworCS8qIE5leHQgZnVsbCByZXBvcnQgYWZ0ZXIgTjM5MSBwb2xscyAqLworCWhkbGMtPnN0YXRlLmZyLm4zOTFjbnQgPSBoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5uMzkxOworCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IGZyX3J4KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBza2ItPmRldjsKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKG5kZXYpOworCWZyX2hkciAqZmggPSAoZnJfaGRyKilza2ItPmRhdGE7CisJdTggKmRhdGEgPSBza2ItPmRhdGE7CisJdTE2IGRsY2k7CisJcHZjX2RldmljZSAqcHZjOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCisJaWYgKHNrYi0+bGVuIDw9IDQgfHwgZmgtPmVhMSB8fCBkYXRhWzJdICE9IEZSX1VJKQorCQlnb3RvIHJ4X2Vycm9yOworCisJZGxjaSA9IHE5MjJfdG9fZGxjaShza2ItPmRhdGEpOworCisJaWYgKGRsY2kgPT0gTE1JX0RMQ0kpIHsKKwkJaWYgKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmxtaSA9PSBMTUlfTk9ORSkKKwkJCWdvdG8gcnhfZXJyb3I7IC8qIExNSSBwYWNrZXQgd2l0aCBubyBMTUk/ICovCisKKwkJaWYgKGRhdGFbM10gPT0gTE1JX1BST1RPKSB7CisJCQlpZiAoZnJfbG1pX3JlY3YobmRldiwgc2tiKSkKKwkJCQlnb3RvIHJ4X2Vycm9yOworCQkJZWxzZSB7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CisJCQl9CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjZWl2ZWQgbm9uLUxNSSBmcmFtZSB3aXRoIExNSSBETENJXG4iLAorCQkgICAgICAgbmRldi0+bmFtZSk7CisJCWdvdG8gcnhfZXJyb3I7CisJfQorCisJcHZjID0gZmluZF9wdmMoaGRsYywgZGxjaSk7CisJaWYgKCFwdmMpIHsKKyNpZmRlZiBERUJVR19QS1QKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIFBWQyBmb3IgcmVjZWl2ZWQgZnJhbWUncyBETENJICVkXG4iLAorCQkgICAgICAgbmRldi0+bmFtZSwgZGxjaSk7CisjZW5kaWYKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIE5FVF9SWF9EUk9QOworCX0KKworCWlmIChwdmMtPnN0YXRlLmZlY24gIT0gZmgtPmZlY24pIHsKKyNpZmRlZiBERUJVR19FQ04KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBETENJICVkIEZFQ04gTyVzXG4iLCBuZGV2LT5uYW1lLAorCQkgICAgICAgZGxjaSwgZmgtPmZlY24gPyAiTiIgOiAiRkYiKTsKKyNlbmRpZgorCQlwdmMtPnN0YXRlLmZlY24gXj0gMTsKKwl9CisKKwlpZiAocHZjLT5zdGF0ZS5iZWNuICE9IGZoLT5iZWNuKSB7CisjaWZkZWYgREVCVUdfRUNOCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRExDSSAlZCBCRUNOIE8lc1xuIiwgbmRldi0+bmFtZSwKKwkJICAgICAgIGRsY2ksIGZoLT5iZWNuID8gIk4iIDogIkZGIik7CisjZW5kaWYKKwkJcHZjLT5zdGF0ZS5iZWNuIF49IDE7CisJfQorCisKKwlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCWhkbGMtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuIE5FVF9SWF9EUk9QOworCX0KKworCWlmIChkYXRhWzNdID09IE5MUElEX0lQKSB7CisJCXNrYl9wdWxsKHNrYiwgNCk7IC8qIFJlbW92ZSA0LWJ5dGUgaGVhZGVyIChoZHIsIFVJLCBOTFBJRCkgKi8KKwkJZGV2ID0gcHZjLT5tYWluOworCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCisJfSBlbHNlIGlmIChkYXRhWzNdID09IE5MUElEX0lQVjYpIHsKKwkJc2tiX3B1bGwoc2tiLCA0KTsgLyogUmVtb3ZlIDQtYnl0ZSBoZWFkZXIgKGhkciwgVUksIE5MUElEKSAqLworCQlkZXYgPSBwdmMtPm1haW47CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKKworCX0gZWxzZSBpZiAoc2tiLT5sZW4gPiAxMCAmJiBkYXRhWzNdID09IEZSX1BBRCAmJgorCQkgICBkYXRhWzRdID09IE5MUElEX1NOQVAgJiYgZGF0YVs1XSA9PSBGUl9QQUQpIHsKKwkJdTE2IG91aSA9IG50b2hzKCoodTE2KikoZGF0YSArIDYpKTsKKwkJdTE2IHBpZCA9IG50b2hzKCoodTE2KikoZGF0YSArIDgpKTsKKwkJc2tiX3B1bGwoc2tiLCAxMCk7CisKKwkJc3dpdGNoICgoKCh1MzIpb3VpKSA8PCAxNikgfCBwaWQpIHsKKwkJY2FzZSBFVEhfUF9BUlA6IC8qIHJvdXRlZCBmcmFtZSB3aXRoIFNOQVAgKi8KKwkJY2FzZSBFVEhfUF9JUFg6CisJCWNhc2UgRVRIX1BfSVA6CS8qIGEgbG9uZyB2YXJpYW50ICovCisJCWNhc2UgRVRIX1BfSVBWNjoKKwkJCWRldiA9IHB2Yy0+bWFpbjsKKwkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhwaWQpOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDgwQzIwMDA3OiAvKiBicmlkZ2VkIEV0aGVybmV0IGZyYW1lICovCisJCQlpZiAoKGRldiA9IHB2Yy0+ZXRoZXIpICE9IE5VTEwpCisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5zdXBwb3J0ZWQgcHJvdG9jb2wsIE9VST0leCAiCisJCQkgICAgICAgIlBJRD0leFxuIiwgbmRldi0+bmFtZSwgb3VpLCBwaWQpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCXJldHVybiBORVRfUlhfRFJPUDsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbnN1cHBvcnRlZCBwcm90b2NvbCwgTkxQSUQ9JXggIgorCQkgICAgICAgImxlbmd0aCA9ICVpXG4iLCBuZGV2LT5uYW1lLCBkYXRhWzNdLCBza2ItPmxlbik7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiBORVRfUlhfRFJPUDsKKwl9CisKKwlpZiAoZGV2KSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IHB2Y19nZXRfc3RhdHMoZGV2KTsKKwkJc3RhdHMtPnJ4X3BhY2tldHMrKzsgLyogUFZDIHRyYWZmaWMgKi8KKwkJc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlpZiAocHZjLT5zdGF0ZS5iZWNuKQorCQkJc3RhdHMtPnJ4X2NvbXByZXNzZWQrKzsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCW5ldGlmX3J4KHNrYik7CisJCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gTkVUX1JYX0RST1A7CisJfQorCisgcnhfZXJyb3I6CisJaGRsYy0+c3RhdHMucnhfZXJyb3JzKys7IC8qIE1hcmsgZXJyb3IgKi8KKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXJldHVybiBORVRfUlhfRFJPUDsKK30KKworCisKK3N0YXRpYyB2b2lkIGZyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworI2lmZGVmIERFQlVHX0xJTksKKwlwcmludGsoS0VSTl9ERUJVRyAiZnJfc3RhcnRcbiIpOworI2VuZGlmCisJaWYgKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmxtaSAhPSBMTUlfTk9ORSkgeworCQloZGxjLT5zdGF0ZS5mci5yZWxpYWJsZSA9IDA7CisJCWhkbGMtPnN0YXRlLmZyLmRjZV9jaGFuZ2VkID0gMTsKKwkJaGRsYy0+c3RhdGUuZnIucmVxdWVzdCA9IDA7CisJCWhkbGMtPnN0YXRlLmZyLmZ1bGxyZXBfc2VudCA9IDA7CisJCWhkbGMtPnN0YXRlLmZyLmxhc3RfZXJyb3JzID0gMHhGRkZGRkZGRjsKKwkJaGRsYy0+c3RhdGUuZnIubjM5MWNudCA9IDA7CisJCWhkbGMtPnN0YXRlLmZyLnR4c2VxID0gaGRsYy0+c3RhdGUuZnIucnhzZXEgPSAwOworCisJCWluaXRfdGltZXIoJmhkbGMtPnN0YXRlLmZyLnRpbWVyKTsKKwkJLyogRmlyc3QgcG9sbCBhZnRlciAxIHMgKi8KKwkJaGRsYy0+c3RhdGUuZnIudGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwkJaGRsYy0+c3RhdGUuZnIudGltZXIuZnVuY3Rpb24gPSBmcl90aW1lcjsKKwkJaGRsYy0+c3RhdGUuZnIudGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwkJYWRkX3RpbWVyKCZoZGxjLT5zdGF0ZS5mci50aW1lcik7CisJfSBlbHNlCisJCWZyX3NldF9saW5rX3N0YXRlKDEsIGRldik7Cit9CisKKworCitzdGF0aWMgdm9pZCBmcl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworI2lmZGVmIERFQlVHX0xJTksKKwlwcmludGsoS0VSTl9ERUJVRyAiZnJfc3RvcFxuIik7CisjZW5kaWYKKwlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pICE9IExNSV9OT05FKQorCQlkZWxfdGltZXJfc3luYygmaGRsYy0+c3RhdGUuZnIudGltZXIpOworCWZyX3NldF9saW5rX3N0YXRlKDAsIGRldik7Cit9CisKKworCitzdGF0aWMgdm9pZCBmcl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlwdmNfZGV2aWNlICpwdmMgPSBoZGxjLT5zdGF0ZS5mci5maXJzdF9wdmM7CisKKwl3aGlsZSAocHZjKSB7CQkvKiBTaHV0ZG93biBhbGwgUFZDcyBmb3IgdGhpcyBGUkFEICovCisJCWlmIChwdmMtPm1haW4pCisJCQlkZXZfY2xvc2UocHZjLT5tYWluKTsKKwkJaWYgKHB2Yy0+ZXRoZXIpCisJCQlkZXZfY2xvc2UocHZjLT5ldGhlcik7CisJCXB2YyA9IHB2Yy0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRsY2lfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkZXYtPnR5cGUgPSBBUlBIUkRfRExDSTsKKwlkZXYtPmZsYWdzID0gSUZGX1BPSU5UT1BPSU5UOworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gMTA7CisJZGV2LT5hZGRyX2xlbiA9IDI7Cit9CisKK3N0YXRpYyBpbnQgZnJfYWRkX3B2YyhzdHJ1Y3QgbmV0X2RldmljZSAqbWFzdGVyLCB1bnNpZ25lZCBpbnQgZGxjaSwgaW50IHR5cGUpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhtYXN0ZXIpOworCXB2Y19kZXZpY2UgKnB2YyA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgcmVzdWx0LCB1c2VkOworCWNoYXIgKiBwcmVmaXggPSAicHZjJWQiOworCisJaWYgKHR5cGUgPT0gQVJQSFJEX0VUSEVSKQorCQlwcmVmaXggPSAicHZjZXRoJWQiOworCisJaWYgKChwdmMgPSBhZGRfcHZjKG1hc3RlciwgZGxjaSkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplIG9uIGZyX2FkZF9wdmMoKVxuIiwKKwkJICAgICAgIG1hc3Rlci0+bmFtZSk7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwlpZiAoKmdldF9kZXZfcChwdmMsIHR5cGUpKQorCQlyZXR1cm4gLUVFWElTVDsKKworCXVzZWQgPSBwdmNfaXNfdXNlZChwdmMpOworCisJaWYgKHR5cGUgPT0gQVJQSFJEX0VUSEVSKQorCQlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSwKKwkJCQkgICAicHZjZXRoJWQiLCBldGhlcl9zZXR1cCk7CisJZWxzZQorCQlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSwKKwkJCQkgICAicHZjJWQiLCBkbGNpX3NldHVwKTsKKworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNZW1vcnkgc3F1ZWV6ZSBvbiBmcl9wdmMoKVxuIiwKKwkJICAgICAgIG1hc3Rlci0+bmFtZSk7CisJCWRlbGV0ZV91bnVzZWRfcHZjcyhoZGxjKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCWlmICh0eXBlID09IEFSUEhSRF9FVEhFUikgeworCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgIlx4MDBceDAxIiwgMik7CisgICAgICAgICAgICAgICAgZ2V0X3JhbmRvbV9ieXRlcyhkZXYtPmRldl9hZGRyICsgMiwgRVRIX0FMRU4gLSAyKTsKKwl9IGVsc2UgeworCQkqKHUxNiopZGV2LT5kZXZfYWRkciA9IGh0b25zKGRsY2kpOworCQlkbGNpX3RvX3E5MjIoZGV2LT5icm9hZGNhc3QsIGRsY2kpOworCX0KKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHB2Y194bWl0OworCWRldi0+Z2V0X3N0YXRzID0gcHZjX2dldF9zdGF0czsKKwlkZXYtPm9wZW4gPSBwdmNfb3BlbjsKKwlkZXYtPnN0b3AgPSBwdmNfY2xvc2U7CisJZGV2LT5kb19pb2N0bCA9IHB2Y19pb2N0bDsKKwlkZXYtPmNoYW5nZV9tdHUgPSBwdmNfY2hhbmdlX210dTsKKwlkZXYtPm10dSA9IEhETENfTUFYX01UVTsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDA7CisJZGV2LT5wcml2ID0gcHZjOworCisJcmVzdWx0ID0gZGV2X2FsbG9jX25hbWUoZGV2LCBkZXYtPm5hbWUpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCWRlbGV0ZV91bnVzZWRfcHZjcyhoZGxjKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2aWNlKGRldikgIT0gMCkgeworCQlmcmVlX25ldGRldihkZXYpOworCQlkZWxldGVfdW51c2VkX3B2Y3MoaGRsYyk7CisJCXJldHVybiAtRUlPOworCX0KKworCWRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OworCSpnZXRfZGV2X3AocHZjLCB0eXBlKSA9IGRldjsKKwlpZiAoIXVzZWQpIHsKKwkJaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQgPSAxOworCQloZGxjLT5zdGF0ZS5mci5kY2VfcHZjX2NvdW50Kys7CisJfQorCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBmcl9kZWxfcHZjKGhkbGNfZGV2aWNlICpoZGxjLCB1bnNpZ25lZCBpbnQgZGxjaSwgaW50IHR5cGUpCit7CisJcHZjX2RldmljZSAqcHZjOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlpZiAoKHB2YyA9IGZpbmRfcHZjKGhkbGMsIGRsY2kpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWlmICgoZGV2ID0gKmdldF9kZXZfcChwdmMsIHR5cGUpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKQorCQlyZXR1cm4gLUVCVVNZOwkJLyogUFZDIGluIHVzZSAqLworCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsgLyogdGhlIGRlc3RydWN0b3Igd2lsbCBmcmVlX25ldGRldihkZXYpICovCisJKmdldF9kZXZfcChwdmMsIHR5cGUpID0gTlVMTDsKKworCWlmICghcHZjX2lzX3VzZWQocHZjKSkgeworCQloZGxjLT5zdGF0ZS5mci5kY2VfcHZjX2NvdW50LS07CisJCWhkbGMtPnN0YXRlLmZyLmRjZV9jaGFuZ2VkID0gMTsKKwl9CisJZGVsZXRlX3VudXNlZF9wdmNzKGhkbGMpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHZvaWQgZnJfZGVzdHJveShoZGxjX2RldmljZSAqaGRsYykKK3sKKwlwdmNfZGV2aWNlICpwdmM7CisKKwlwdmMgPSBoZGxjLT5zdGF0ZS5mci5maXJzdF9wdmM7CisJaGRsYy0+c3RhdGUuZnIuZmlyc3RfcHZjID0gTlVMTDsgLyogQWxsIFBWQ3MgZGVzdHJveWVkICovCisJaGRsYy0+c3RhdGUuZnIuZGNlX3B2Y19jb3VudCA9IDA7CisJaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQgPSAxOworCisJd2hpbGUgKHB2YykgeworCQlwdmNfZGV2aWNlICpuZXh0ID0gcHZjLT5uZXh0OworCQkvKiBkZXN0cnVjdG9ycyB3aWxsIGZyZWVfbmV0ZGV2KCkgbWFpbiBhbmQgZXRoZXIgKi8KKwkJaWYgKHB2Yy0+bWFpbikKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHB2Yy0+bWFpbik7CisKKwkJaWYgKHB2Yy0+ZXRoZXIpCisJCQl1bnJlZ2lzdGVyX25ldGRldmljZShwdmMtPmV0aGVyKTsKKworCQlrZnJlZShwdmMpOworCQlwdmMgPSBuZXh0OworCX0KK30KKworCisKK2ludCBoZGxjX2ZyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCWZyX3Byb3RvIF9fdXNlciAqZnJfcyA9IGlmci0+aWZyX3NldHRpbmdzLmlmc19pZnN1LmZyOworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKGZyX3Byb3RvKTsKKwlmcl9wcm90byBuZXdfc2V0dGluZ3M7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWZyX3Byb3RvX3B2YyBwdmM7CisJaW50IHJlc3VsdDsKKworCXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX1BST1RPOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfUFJPVE9fRlI7CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGZyX3MsICZoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX1BST1RPX0ZSOgorCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYoZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfc2V0dGluZ3MsIGZyX3MsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKG5ld19zZXR0aW5ncy5sbWkgPT0gTE1JX0RFRkFVTFQpCisJCQluZXdfc2V0dGluZ3MubG1pID0gTE1JX0FOU0k7CisKKwkJaWYgKChuZXdfc2V0dGluZ3MubG1pICE9IExNSV9OT05FICYmCisJCSAgICAgbmV3X3NldHRpbmdzLmxtaSAhPSBMTUlfQU5TSSAmJgorCQkgICAgIG5ld19zZXR0aW5ncy5sbWkgIT0gTE1JX0NDSVRUKSB8fAorCQkgICAgbmV3X3NldHRpbmdzLnQzOTEgPCAxIHx8CisJCSAgICBuZXdfc2V0dGluZ3MudDM5MiA8IDIgfHwKKwkJICAgIG5ld19zZXR0aW5ncy5uMzkxIDwgMSB8fAorCQkgICAgbmV3X3NldHRpbmdzLm4zOTIgPCAxIHx8CisJCSAgICBuZXdfc2V0dGluZ3MubjM5MyA8IG5ld19zZXR0aW5ncy5uMzkyIHx8CisJCSAgICBuZXdfc2V0dGluZ3MubjM5MyA+IDMyIHx8CisJCSAgICAobmV3X3NldHRpbmdzLmRjZSAhPSAwICYmCisJCSAgICAgbmV3X3NldHRpbmdzLmRjZSAhPSAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJlc3VsdD1oZGxjLT5hdHRhY2goZGV2LCBFTkNPRElOR19OUlosUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVCk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCWlmIChoZGxjLT5wcm90by5pZCAhPSBJRl9QUk9UT19GUikgeworCQkJaGRsY19wcm90b19kZXRhY2goaGRsYyk7CisJCQloZGxjLT5zdGF0ZS5mci5maXJzdF9wdmMgPSBOVUxMOworCQkJaGRsYy0+c3RhdGUuZnIuZGNlX3B2Y19jb3VudCA9IDA7CisJCX0KKwkJbWVtY3B5KCZoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncywgJm5ld19zZXR0aW5ncywgc2l6ZSk7CisJCW1lbXNldCgmaGRsYy0+cHJvdG8sIDAsIHNpemVvZihoZGxjLT5wcm90bykpOworCisJCWhkbGMtPnByb3RvLmNsb3NlID0gZnJfY2xvc2U7CisJCWhkbGMtPnByb3RvLnN0YXJ0ID0gZnJfc3RhcnQ7CisJCWhkbGMtPnByb3RvLnN0b3AgPSBmcl9zdG9wOworCQloZGxjLT5wcm90by5kZXRhY2ggPSBmcl9kZXN0cm95OworCQloZGxjLT5wcm90by5uZXRpZl9yeCA9IGZyX3J4OworCQloZGxjLT5wcm90by5pZCA9IElGX1BST1RPX0ZSOworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGhkbGMtPnhtaXQ7CisJCWRldi0+aGFyZF9oZWFkZXIgPSBOVUxMOworCQlkZXYtPnR5cGUgPSBBUlBIUkRfRlJBRDsKKwkJZGV2LT5mbGFncyA9IElGRl9QT0lOVE9QT0lOVCB8IElGRl9OT0FSUDsKKwkJZGV2LT5hZGRyX2xlbiA9IDA7CisJCXJldHVybiAwOworCisJY2FzZSBJRl9QUk9UT19GUl9BRERfUFZDOgorCWNhc2UgSUZfUFJPVE9fRlJfREVMX1BWQzoKKwljYXNlIElGX1BST1RPX0ZSX0FERF9FVEhfUFZDOgorCWNhc2UgSUZfUFJPVE9fRlJfREVMX0VUSF9QVkM6CisJCWlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnB2YywgaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3UuZnJfcHZjLAorCQkJCSAgIHNpemVvZihmcl9wcm90b19wdmMpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChwdmMuZGxjaSA8PSAwIHx8IHB2Yy5kbGNpID49IDEwMjQpCisJCQlyZXR1cm4gLUVJTlZBTDsJLyogT25seSAxMCBiaXRzLCBETENJIDAgcmVzZXJ2ZWQgKi8KKworCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9PSBJRl9QUk9UT19GUl9BRERfRVRIX1BWQyB8fAorCQkgICAgaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9PSBJRl9QUk9UT19GUl9ERUxfRVRIX1BWQykKKwkJCXJlc3VsdCA9IEFSUEhSRF9FVEhFUjsgLyogYnJpZGdlZCBFdGhlcm5ldCBkZXZpY2UgKi8KKwkJZWxzZQorCQkJcmVzdWx0ID0gQVJQSFJEX0RMQ0k7CisKKwkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnR5cGUgPT0gSUZfUFJPVE9fRlJfQUREX1BWQyB8fAorCQkgICAgaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9PSBJRl9QUk9UT19GUl9BRERfRVRIX1BWQykKKwkJCXJldHVybiBmcl9hZGRfcHZjKGRldiwgcHZjLmRsY2ksIHJlc3VsdCk7CisJCWVsc2UKKwkJCXJldHVybiBmcl9kZWxfcHZjKGhkbGMsIHB2Yy5kbGNpLCByZXN1bHQpOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfZ2VuZXJpYy5jIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDA2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19nZW5lcmljLmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBHZW5lcmljIEhETEMgc3VwcG9ydCByb3V0aW5lcyBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDdXJyZW50bHkgc3VwcG9ydGVkOgorICoJKiByYXcgSVAtaW4tSERMQworICoJKiBDaXNjbyBIRExDCisgKgkqIEZyYW1lIFJlbGF5IHdpdGggQU5TSSBvciBDQ0lUVCBMTUkgKGJvdGggdXNlciBhbmQgbmV0d29yayBzaWRlKQorICoJKiBQUFAKKyAqCSogWC4yNQorICoKKyAqIFVzZSBzZXRoZGxjIHV0aWxpdHkgdG8gc2V0IGxpbmUgcGFyYW1ldGVycywgcHJvdG9jb2wgYW5kIFBWQ3MKKyAqCisgKiBIb3cgZG9lcyBpdCB3b3JrOgorICogLSBwcm90by5vcGVuKCksIGNsb3NlKCksIHN0YXJ0KCksIHN0b3AoKSBjYWxscyBhcmUgc2VyaWFsaXplZC4KKyAqICAgVGhlIG9yZGVyIGlzOiBvcGVuLCBbIHN0YXJ0LCBzdG9wIC4uLiBdIGNsb3NlIC4uLgorICogLSBwcm90by5zdGFydCgpIGFuZCBzdG9wKCkgYXJlIGNhbGxlZCB3aXRoIHNwaW5fbG9ja19pcnEgaGVsZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGFwYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKworCitzdGF0aWMgY29uc3QgY2hhciogdmVyc2lvbiA9ICJIRExDIHN1cHBvcnQgbW9kdWxlIHJldmlzaW9uIDEuMTciOworCisjdW5kZWYgREVCVUdfTElOSworCisKK3N0YXRpYyBpbnQgaGRsY19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCWlmICgobmV3X210dSA8IDY4KSB8fCAobmV3X210dSA+IEhETENfTUFYX01UVSkpCisJCXJldHVybiAtRUlOVkFMOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaGRsY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gaGRsY19zdGF0cyhkZXYpOworfQorCisKKworc3RhdGljIGludCBoZGxjX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgc3RydWN0IHBhY2tldF90eXBlICpwKQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlpZiAoaGRsYy0+cHJvdG8ubmV0aWZfcngpCisJCXJldHVybiBoZGxjLT5wcm90by5uZXRpZl9yeChza2IpOworCisJaGRsYy0+c3RhdHMucnhfZHJvcHBlZCsrOyAvKiBTaG91bGRuJ3QgaGFwcGVuICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiBORVRfUlhfRFJPUDsKK30KKworCisKK3N0YXRpYyB2b2lkIF9faGRsY19zZXRfY2Fycmllcl9vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlpZiAoaGRsYy0+cHJvdG8uc3RhcnQpCisJCXJldHVybiBoZGxjLT5wcm90by5zdGFydChkZXYpOworI2lmZGVmIERFQlVHX0xJTksKKwlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQlwcmludGsoS0VSTl9FUlIgImhkbGNfc2V0X2NhcnJpZXJfb24oKTogYWxyZWFkeSBvblxuIik7CisjZW5kaWYKKwluZXRpZl9jYXJyaWVyX29uKGRldik7Cit9CisKKworCitzdGF0aWMgdm9pZCBfX2hkbGNfc2V0X2NhcnJpZXJfb2ZmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWlmIChoZGxjLT5wcm90by5zdG9wKQorCQlyZXR1cm4gaGRsYy0+cHJvdG8uc3RvcChkZXYpOworCisjaWZkZWYgREVCVUdfTElOSworCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQlwcmludGsoS0VSTl9FUlIgImhkbGNfc2V0X2NhcnJpZXJfb2ZmKCk6IGFscmVhZHkgb2ZmXG4iKTsKKyNlbmRpZgorCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7Cit9CisKKworCit2b2lkIGhkbGNfc2V0X2NhcnJpZXIoaW50IG9uLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCW9uID0gb24gPyAxIDogMDsKKworI2lmZGVmIERFQlVHX0xJTksKKwlwcmludGsoS0VSTl9ERUJVRyAiaGRsY19zZXRfY2FycmllciAlaVxuIiwgb24pOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGRsYy0+c3RhdGVfbG9jaywgZmxhZ3MpOworCisJaWYgKGhkbGMtPmNhcnJpZXIgPT0gb24pCisJCWdvdG8gY2Fycmllcl9leGl0OyAvKiBubyBjaGFuZ2UgaW4gRENEIGxpbmUgbGV2ZWwgKi8KKworI2lmZGVmIERFQlVHX0xJTksKKwlwcmludGsoS0VSTl9JTkZPICIlczogY2FycmllciAlc1xuIiwgZGV2LT5uYW1lLCBvbiA/ICJPTiIgOiAib2ZmIik7CisjZW5kaWYKKwloZGxjLT5jYXJyaWVyID0gb247CisKKwlpZiAoIWhkbGMtPm9wZW4pCisJCWdvdG8gY2Fycmllcl9leGl0OworCisJaWYgKGhkbGMtPmNhcnJpZXIpCisJCV9faGRsY19zZXRfY2Fycmllcl9vbihkZXYpOworCWVsc2UKKwkJX19oZGxjX3NldF9jYXJyaWVyX29mZihkZXYpOworCitjYXJyaWVyX2V4aXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGRsYy0+c3RhdGVfbG9jaywgZmxhZ3MpOworfQorCisKKworLyogTXVzdCBiZSBjYWxsZWQgYnkgaGFyZHdhcmUgZHJpdmVyIHdoZW4gSERMQyBkZXZpY2UgaXMgYmVpbmcgb3BlbmVkICovCitpbnQgaGRsY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworI2lmZGVmIERFQlVHX0xJTksKKwlwcmludGsoS0VSTl9ERUJVRyAiaGRsY19vcGVuKCkgY2FycmllciAlaSBvcGVuICVpXG4iLAorCSAgICAgICBoZGxjLT5jYXJyaWVyLCBoZGxjLT5vcGVuKTsKKyNlbmRpZgorCisJaWYgKGhkbGMtPnByb3RvLmlkID09IC0xKQorCQlyZXR1cm4gLUVOT1NZUzsJLyogbm8gcHJvdG9jb2wgYXR0YWNoZWQgKi8KKworCWlmIChoZGxjLT5wcm90by5vcGVuKSB7CisJCWludCByZXN1bHQgPSBoZGxjLT5wcm90by5vcGVuKGRldik7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXNwaW5fbG9ja19pcnEoJmhkbGMtPnN0YXRlX2xvY2spOworCisJaWYgKGhkbGMtPmNhcnJpZXIpCisJCV9faGRsY19zZXRfY2Fycmllcl9vbihkZXYpOworCisJaGRsYy0+b3BlbiA9IDE7CisKKwlzcGluX3VubG9ja19pcnEoJmhkbGMtPnN0YXRlX2xvY2spOworCXJldHVybiAwOworfQorCisKKworLyogTXVzdCBiZSBjYWxsZWQgYnkgaGFyZHdhcmUgZHJpdmVyIHdoZW4gSERMQyBkZXZpY2UgaXMgYmVpbmcgY2xvc2VkICovCit2b2lkIGhkbGNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisjaWZkZWYgREVCVUdfTElOSworCXByaW50ayhLRVJOX0RFQlVHICJoZGxjX2Nsb3NlKCkgY2FycmllciAlaSBvcGVuICVpXG4iLAorCSAgICAgICBoZGxjLT5jYXJyaWVyLCBoZGxjLT5vcGVuKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycSgmaGRsYy0+c3RhdGVfbG9jayk7CisKKwloZGxjLT5vcGVuID0gMDsKKwlpZiAoaGRsYy0+Y2FycmllcikKKwkJX19oZGxjX3NldF9jYXJyaWVyX29mZihkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZoZGxjLT5zdGF0ZV9sb2NrKTsKKworCWlmIChoZGxjLT5wcm90by5jbG9zZSkKKwkJaGRsYy0+cHJvdG8uY2xvc2UoZGV2KTsKK30KKworCisKKyNpZm5kZWYgQ09ORklHX0hETENfUkFXCisjZGVmaW5lIGhkbGNfcmF3X2lvY3RsKGRldiwgaWZyKQktRU5PU1lTCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfSERMQ19SQVdfRVRICisjZGVmaW5lIGhkbGNfcmF3X2V0aF9pb2N0bChkZXYsIGlmcikJLUVOT1NZUworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX0hETENfUFBQCisjZGVmaW5lIGhkbGNfcHBwX2lvY3RsKGRldiwgaWZyKQktRU5PU1lTCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfSERMQ19DSVNDTworI2RlZmluZSBoZGxjX2Npc2NvX2lvY3RsKGRldiwgaWZyKQktRU5PU1lTCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfSERMQ19GUgorI2RlZmluZSBoZGxjX2ZyX2lvY3RsKGRldiwgaWZyKQkJLUVOT1NZUworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX0hETENfWDI1CisjZGVmaW5lIGhkbGNfeDI1X2lvY3RsKGRldiwgaWZyKQktRU5PU1lTCisjZW5kaWYKKworCitpbnQgaGRsY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJdW5zaWduZWQgaW50IHByb3RvOworCisJaWYgKGNtZCAhPSBTSU9DV0FOREVWKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9QUk9UT19IRExDOgorCWNhc2UgSUZfUFJPVE9fSERMQ19FVEg6CisJY2FzZSBJRl9QUk9UT19QUFA6CisJY2FzZSBJRl9QUk9UT19DSVNDTzoKKwljYXNlIElGX1BST1RPX0ZSOgorCWNhc2UgSUZfUFJPVE9fWDI1OgorCQlwcm90byA9IGlmci0+aWZyX3NldHRpbmdzLnR5cGU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJvdG8gPSBoZGxjLT5wcm90by5pZDsKKwl9CisKKwlzd2l0Y2gocHJvdG8pIHsKKwljYXNlIElGX1BST1RPX0hETEM6CXJldHVybiBoZGxjX3Jhd19pb2N0bChkZXYsIGlmcik7CisJY2FzZSBJRl9QUk9UT19IRExDX0VUSDoJcmV0dXJuIGhkbGNfcmF3X2V0aF9pb2N0bChkZXYsIGlmcik7CisJY2FzZSBJRl9QUk9UT19QUFA6CXJldHVybiBoZGxjX3BwcF9pb2N0bChkZXYsIGlmcik7CisJY2FzZSBJRl9QUk9UT19DSVNDTzoJcmV0dXJuIGhkbGNfY2lzY29faW9jdGwoZGV2LCBpZnIpOworCWNhc2UgSUZfUFJPVE9fRlI6CXJldHVybiBoZGxjX2ZyX2lvY3RsKGRldiwgaWZyKTsKKwljYXNlIElGX1BST1RPX1gyNToJcmV0dXJuIGhkbGNfeDI1X2lvY3RsKGRldiwgaWZyKTsKKwlkZWZhdWx0OgkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdm9pZCBoZGxjX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCisJZGV2LT5nZXRfc3RhdHMgPSBoZGxjX2dldF9zdGF0czsKKwlkZXYtPmNoYW5nZV9tdHUgPSBoZGxjX2NoYW5nZV9tdHU7CisJZGV2LT5tdHUgPSBIRExDX01BWF9NVFU7CisKKwlkZXYtPnR5cGUgPSBBUlBIUkRfUkFXSERMQzsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IDE2OworCisJZGV2LT5mbGFncyA9IElGRl9QT0lOVE9QT0lOVCB8IElGRl9OT0FSUDsKKworCWhkbGMtPnByb3RvLmlkID0gLTE7CisJaGRsYy0+cHJvdG8uZGV0YWNoID0gTlVMTDsKKwloZGxjLT5jYXJyaWVyID0gMTsKKwloZGxjLT5vcGVuID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmaGRsYy0+c3RhdGVfbG9jayk7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19oZGxjZGV2KHZvaWQgKnByaXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKGhkbGNfZGV2aWNlKSwgImhkbGMlZCIsIGhkbGNfc2V0dXApOworCWlmIChkZXYpCisJCWRldl90b19oZGxjKGRldiktPnByaXYgPSBwcml2OworCXJldHVybiBkZXY7Cit9CisKK2ludCByZWdpc3Rlcl9oZGxjX2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXN1bHQgPSBkZXZfYWxsb2NfbmFtZShkZXYsICJoZGxjJWQiKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXJlc3VsdCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXN1bHQgIT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOyAvKiBubyBjYXJyaWVyIHVudGlsIERDRCBnb2VzIHVwICovCisKKwlyZXR1cm4gMDsKK30KKworCisKK3ZvaWQgdW5yZWdpc3Rlcl9oZGxjX2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJ0bmxfbG9jaygpOworCWhkbGNfcHJvdG9fZGV0YWNoKGRldl90b19oZGxjKGRldikpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7CisJcnRubF91bmxvY2soKTsKK30KKworCisKK01PRFVMRV9BVVRIT1IoIktyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhETEMgc3VwcG9ydCBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworRVhQT1JUX1NZTUJPTChoZGxjX29wZW4pOworRVhQT1JUX1NZTUJPTChoZGxjX2Nsb3NlKTsKK0VYUE9SVF9TWU1CT0woaGRsY19zZXRfY2Fycmllcik7CitFWFBPUlRfU1lNQk9MKGhkbGNfaW9jdGwpOworRVhQT1JUX1NZTUJPTChhbGxvY19oZGxjZGV2KTsKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfaGRsY19kZXZpY2UpOworRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlKTsKKworc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBoZGxjX3BhY2tldF90eXBlID0geworCS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9IRExDKSwKKwkuZnVuYyA9IGhkbGNfcmN2LAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBoZGxjX21vZHVsZV9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHZlcnNpb24pOworICAgICAgICBkZXZfYWRkX3BhY2soJmhkbGNfcGFja2V0X3R5cGUpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHZvaWQgX19leGl0IGhkbGNfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlkZXZfcmVtb3ZlX3BhY2soJmhkbGNfcGFja2V0X3R5cGUpOworfQorCisKK21vZHVsZV9pbml0KGhkbGNfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoaGRsY19tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGRsY19wcHAuYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3BwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZDYxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19wcHAuYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIEdlbmVyaWMgSERMQyBzdXBwb3J0IHJvdXRpbmVzIGZvciBMaW51eAorICogUG9pbnQtdG8tcG9pbnQgcHJvdG9jb2wgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDMgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9sYXBiLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisKK3N0YXRpYyBpbnQgcHBwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJdm9pZCAqb2xkX2lvY3RsOworCWludCByZXN1bHQ7CisKKwlkZXYtPnByaXYgPSAmaGRsYy0+c3RhdGUucHBwLnN5bmNwcHBfcHRyOworCWhkbGMtPnN0YXRlLnBwcC5zeW5jcHBwX3B0ciA9ICZoZGxjLT5zdGF0ZS5wcHAucHBwZGV2OworCWhkbGMtPnN0YXRlLnBwcC5wcHBkZXYuZGV2ID0gZGV2OworCisJb2xkX2lvY3RsID0gZGV2LT5kb19pb2N0bDsKKwloZGxjLT5zdGF0ZS5wcHAub2xkX2NoYW5nZV9tdHUgPSBkZXYtPmNoYW5nZV9tdHU7CisJc3BwcF9hdHRhY2goJmhkbGMtPnN0YXRlLnBwcC5wcHBkZXYpOworCS8qIHNwcHBfYXR0YWNoIG51a2VzIHRoZW0uIFdlIGRvbid0IG5lZWQgc3luY3BwcCdzIGlvY3RsICovCisJZGV2LT5kb19pb2N0bCA9IG9sZF9pb2N0bDsKKwloZGxjLT5zdGF0ZS5wcHAucHBwZGV2LnNwcHAucHBfZmxhZ3MgJj0gflBQX0NJU0NPOworCWRldi0+dHlwZSA9IEFSUEhSRF9QUFA7CisJcmVzdWx0ID0gc3BwcF9vcGVuKGRldik7CisJaWYgKHJlc3VsdCkgeworCQlzcHBwX2RldGFjaChkZXYpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHZvaWQgcHBwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCisJc3BwcF9jbG9zZShkZXYpOworCXNwcHBfZGV0YWNoKGRldik7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciA9IE5VTEw7CisJZGV2LT5jaGFuZ2VfbXR1ID0gaGRsYy0+c3RhdGUucHBwLm9sZF9jaGFuZ2VfbXR1OworCWRldi0+bXR1ID0gSERMQ19NQVhfTVRVOworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gMTY7Cit9CisKKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcHBwX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfV0FOX1BQUCk7Cit9CisKKworCitpbnQgaGRsY19wcHBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWludCByZXN1bHQ7CisKKwlzd2l0Y2ggKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX0dFVF9QUk9UTzoKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX1BST1RPX1BQUDsKKwkJcmV0dXJuIDA7IC8qIHJldHVybiBwcm90b2NvbCBvbmx5LCBubyBzZXR0YWJsZSBwYXJhbWV0ZXJzICovCisKKwljYXNlIElGX1BST1RPX1BQUDoKKwkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCQlyZXR1cm4gLUVCVVNZOworCisJCS8qIG5vIHNldHRhYmxlIHBhcmFtZXRlcnMgKi8KKworCQlyZXN1bHQ9aGRsYy0+YXR0YWNoKGRldiwgRU5DT0RJTkdfTlJaLFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQloZGxjX3Byb3RvX2RldGFjaChoZGxjKTsKKwkJbWVtc2V0KCZoZGxjLT5wcm90bywgMCwgc2l6ZW9mKGhkbGMtPnByb3RvKSk7CisKKwkJaGRsYy0+cHJvdG8ub3BlbiA9IHBwcF9vcGVuOworCQloZGxjLT5wcm90by5jbG9zZSA9IHBwcF9jbG9zZTsKKwkJaGRsYy0+cHJvdG8udHlwZV90cmFucyA9IHBwcF90eXBlX3RyYW5zOworCQloZGxjLT5wcm90by5pZCA9IElGX1BST1RPX1BQUDsKKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBoZGxjLT54bWl0OworCQlkZXYtPmhhcmRfaGVhZGVyID0gTlVMTDsKKwkJZGV2LT50eXBlID0gQVJQSFJEX1BQUDsKKwkJZGV2LT5hZGRyX2xlbiA9IDA7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfcmF3LmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19yYXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDFmYjcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfcmF3LmMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIEdlbmVyaWMgSERMQyBzdXBwb3J0IHJvdXRpbmVzIGZvciBMaW51eAorICogSERMQyBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IC0gMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xhcGIuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJhd190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKTsKK30KKworCisKK2ludCBoZGxjX3Jhd19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlyYXdfaGRsY19wcm90byBfX3VzZXIgKnJhd19zID0gaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3UucmF3X2hkbGM7CisJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2YocmF3X2hkbGNfcHJvdG8pOworCXJhd19oZGxjX3Byb3RvIG5ld19zZXR0aW5nczsKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJaW50IHJlc3VsdDsKKworCXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX1BST1RPOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfUFJPVE9fSERMQzsKKwkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPCBzaXplKSB7CisJCQlpZnItPmlmcl9zZXR0aW5ncy5zaXplID0gc2l6ZTsgLyogZGF0YSBzaXplIHdhbnRlZCAqLworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIocmF3X3MsICZoZGxjLT5zdGF0ZS5yYXdfaGRsYy5zZXR0aW5ncywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX1BST1RPX0hETEM6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NldHRpbmdzLCByYXdfcywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAobmV3X3NldHRpbmdzLmVuY29kaW5nID09IEVOQ09ESU5HX0RFRkFVTFQpCisJCQluZXdfc2V0dGluZ3MuZW5jb2RpbmcgPSBFTkNPRElOR19OUlo7CisKKwkJaWYgKG5ld19zZXR0aW5ncy5wYXJpdHkgPT0gUEFSSVRZX0RFRkFVTFQpCisJCQluZXdfc2V0dGluZ3MucGFyaXR5ID0gUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVDsKKworCQlyZXN1bHQgPSBoZGxjLT5hdHRhY2goZGV2LCBuZXdfc2V0dGluZ3MuZW5jb2RpbmcsCisJCQkJICAgICAgbmV3X3NldHRpbmdzLnBhcml0eSk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCWhkbGNfcHJvdG9fZGV0YWNoKGhkbGMpOworCQltZW1jcHkoJmhkbGMtPnN0YXRlLnJhd19oZGxjLnNldHRpbmdzLCAmbmV3X3NldHRpbmdzLCBzaXplKTsKKwkJbWVtc2V0KCZoZGxjLT5wcm90bywgMCwgc2l6ZW9mKGhkbGMtPnByb3RvKSk7CisKKwkJaGRsYy0+cHJvdG8udHlwZV90cmFucyA9IHJhd190eXBlX3RyYW5zOworCQloZGxjLT5wcm90by5pZCA9IElGX1BST1RPX0hETEM7CisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaGRsYy0+eG1pdDsKKwkJZGV2LT5oYXJkX2hlYWRlciA9IE5VTEw7CisJCWRldi0+dHlwZSA9IEFSUEhSRF9SQVdIRExDOworCQlkZXYtPmZsYWdzID0gSUZGX1BPSU5UT1BPSU5UIHwgSUZGX05PQVJQOworCQlkZXYtPmFkZHJfbGVuID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGRsY19yYXdfZXRoLmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19yYXdfZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEyODVjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3Jhd19ldGguYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIEdlbmVyaWMgSERMQyBzdXBwb3J0IHJvdXRpbmVzIGZvciBMaW51eAorICogSERMQyBFdGhlcm5ldCBlbXVsYXRpb24gc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGFwYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisKK3N0YXRpYyBpbnQgZXRoX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHBhZCA9IEVUSF9aTEVOIC0gc2tiLT5sZW47CisJaWYgKHBhZCA+IDApIHsJCS8qIFBhZCB0aGUgZnJhbWUgd2l0aCB6ZXJvcyAqLworCQlpbnQgbGVuID0gc2tiLT5sZW47CisJCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IHBhZCkKKwkJCWlmIChwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgcGFkLCBHRlBfQVRPTUlDKSkgeworCQkJCWhkbGNfc3RhdHMoZGV2KS0+dHhfZHJvcHBlZCsrOworCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJc2tiX3B1dChza2IsIHBhZCk7CisJCW1lbXNldChza2ItPmRhdGEgKyBsZW4sIDAsIHBhZCk7CisJfQorCXJldHVybiBkZXZfdG9faGRsYyhkZXYpLT54bWl0KHNrYiwgZGV2KTsKK30KKworCitpbnQgaGRsY19yYXdfZXRoX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCXJhd19oZGxjX3Byb3RvIF9fdXNlciAqcmF3X3MgPSBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5yYXdfaGRsYzsKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihyYXdfaGRsY19wcm90byk7CisJcmF3X2hkbGNfcHJvdG8gbmV3X3NldHRpbmdzOworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlpbnQgcmVzdWx0OworCXZvaWQgKm9sZF9jaF9tdHU7CisJaW50IG9sZF9xbGVuOworCisJc3dpdGNoIChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9HRVRfUFJPVE86CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9QUk9UT19IRExDX0VUSDsKKwkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPCBzaXplKSB7CisJCQlpZnItPmlmcl9zZXR0aW5ncy5zaXplID0gc2l6ZTsgLyogZGF0YSBzaXplIHdhbnRlZCAqLworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIocmF3X3MsICZoZGxjLT5zdGF0ZS5yYXdfaGRsYy5zZXR0aW5ncywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX1BST1RPX0hETENfRVRIOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXR0aW5ncywgcmF3X3MsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKG5ld19zZXR0aW5ncy5lbmNvZGluZyA9PSBFTkNPRElOR19ERUZBVUxUKQorCQkJbmV3X3NldHRpbmdzLmVuY29kaW5nID0gRU5DT0RJTkdfTlJaOworCisJCWlmIChuZXdfc2V0dGluZ3MucGFyaXR5ID09IFBBUklUWV9ERUZBVUxUKQorCQkJbmV3X3NldHRpbmdzLnBhcml0eSA9IFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQ7CisKKwkJcmVzdWx0ID0gaGRsYy0+YXR0YWNoKGRldiwgbmV3X3NldHRpbmdzLmVuY29kaW5nLAorCQkJCSAgICAgIG5ld19zZXR0aW5ncy5wYXJpdHkpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQloZGxjX3Byb3RvX2RldGFjaChoZGxjKTsKKwkJbWVtY3B5KCZoZGxjLT5zdGF0ZS5yYXdfaGRsYy5zZXR0aW5ncywgJm5ld19zZXR0aW5ncywgc2l6ZSk7CisJCW1lbXNldCgmaGRsYy0+cHJvdG8sIDAsIHNpemVvZihoZGxjLT5wcm90bykpOworCisJCWhkbGMtPnByb3RvLnR5cGVfdHJhbnMgPSBldGhfdHlwZV90cmFuczsKKwkJaGRsYy0+cHJvdG8uaWQgPSBJRl9QUk9UT19IRExDX0VUSDsKKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBldGhfdHg7CisJCW9sZF9jaF9tdHUgPSBkZXYtPmNoYW5nZV9tdHU7CisJCW9sZF9xbGVuID0gZGV2LT50eF9xdWV1ZV9sZW47CisJCWV0aGVyX3NldHVwKGRldik7CisJCWRldi0+Y2hhbmdlX210dSA9IG9sZF9jaF9tdHU7CisJCWRldi0+dHhfcXVldWVfbGVuID0gb2xkX3FsZW47CisJCW1lbWNweShkZXYtPmRldl9hZGRyLCAiXHgwMFx4MDEiLCAyKTsKKyAgICAgICAgICAgICAgICBnZXRfcmFuZG9tX2J5dGVzKGRldi0+ZGV2X2FkZHIgKyAyLCBFVEhfQUxFTiAtIDIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3gyNS5jIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfeDI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlNWVlZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3gyNS5jCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogR2VuZXJpYyBIRExDIHN1cHBvcnQgcm91dGluZXMgZm9yIExpbnV4CisgKiBYLjI1IHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGFwYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKworI2luY2x1ZGUgPG5ldC94MjVkZXZpY2UuaD4KKworLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsYmFja3MgY2FsbGVkIGJ5IExBUEIgbGF5ZXIgKi8KKworc3RhdGljIHZvaWQgeDI1X2Nvbm5lY3RfZGlzY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhc29uLCBpbnQgY29kZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYigxKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJcHRyID0gc2tiX3B1dChza2IsIDEpOworCSpwdHIgPSBjb2RlOworCisJc2tiLT5wcm90b2NvbCA9IHgyNV90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwluZXRpZl9yeChza2IpOworfQorCisKKworc3RhdGljIHZvaWQgeDI1X2Nvbm5lY3RlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhc29uKQoreworCXgyNV9jb25uZWN0X2Rpc2Nvbm5lY3QoZGV2LCByZWFzb24sIDEpOworfQorCisKKworc3RhdGljIHZvaWQgeDI1X2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhc29uKQoreworCXgyNV9jb25uZWN0X2Rpc2Nvbm5lY3QoZGV2LCByZWFzb24sIDIpOworfQorCisKKworc3RhdGljIGludCB4MjVfZGF0YV9pbmRpY2F0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgY2hhciAqcHRyOworCisJc2tiX3B1c2goc2tiLCAxKTsKKworCWlmIChza2JfY293KHNrYiwgMSkpCisJCXJldHVybiBORVRfUlhfRFJPUDsKKworCXB0ciAgPSBza2ItPmRhdGE7CisJKnB0ciA9IDA7CisKKwlza2ItPnByb3RvY29sID0geDI1X3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCXJldHVybiBuZXRpZl9yeChza2IpOworfQorCisKKworc3RhdGljIHZvaWQgeDI1X2RhdGFfdHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJaGRsYy0+eG1pdChza2IsIGRldik7IC8qIElnbm9yZSByZXR1cm4gdmFsdWUgOi0oICovCit9CisKKworCitzdGF0aWMgaW50IHgyNV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKworCisJLyogWC4yNSB0byBMQVBCICovCisJc3dpdGNoIChza2ItPmRhdGFbMF0pIHsKKwljYXNlIDA6CQkvKiBEYXRhIHRvIGJlIHRyYW5zbWl0dGVkICovCisJCXNrYl9wdWxsKHNrYiwgMSk7CisJCWlmICgocmVzdWx0ID0gbGFwYl9kYXRhX3JlcXVlc3QoZGV2LCBza2IpKSAhPSBMQVBCX09LKQorCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKworCWNhc2UgMToKKwkJaWYgKChyZXN1bHQgPSBsYXBiX2Nvbm5lY3RfcmVxdWVzdChkZXYpKSE9IExBUEJfT0spIHsKKwkJCWlmIChyZXN1bHQgPT0gTEFQQl9DT05ORUNURUQpCisJCQkJLyogU2VuZCBjb25uZWN0IGNvbmZpcm0uIG1zZyB0byBsZXZlbCAzICovCisJCQkJeDI1X2Nvbm5lY3RlZChkZXYsIDApOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IExBUEIgY29ubmVjdCByZXF1ZXN0ICIKKwkJCQkgICAgICAgImZhaWxlZCwgZXJyb3IgY29kZSA9ICVpXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIHJlc3VsdCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCWlmICgocmVzdWx0ID0gbGFwYl9kaXNjb25uZWN0X3JlcXVlc3QoZGV2KSkgIT0gTEFQQl9PSykgeworCQkJaWYgKHJlc3VsdCA9PSBMQVBCX05PVENPTk5FQ1RFRCkKKwkJCQkvKiBTZW5kIGRpc2Nvbm5lY3QgY29uZmlybS4gbXNnIHRvIGxldmVsIDMgKi8KKwkJCQl4MjVfZGlzY29ubmVjdGVkKGRldiwgMCk7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTEFQQiBkaXNjb25uZWN0IHJlcXVlc3QgIgorCQkJCSAgICAgICAiZmFpbGVkLCBlcnJvciBjb2RlID0gJWlcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgcmVzdWx0KTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CQkvKiB0byBiZSBkZWZpbmVkICovCisJCWJyZWFrOworCX0KKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgeDI1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFwYl9yZWdpc3Rlcl9zdHJ1Y3QgY2I7CisJaW50IHJlc3VsdDsKKworCWNiLmNvbm5lY3RfY29uZmlybWF0aW9uID0geDI1X2Nvbm5lY3RlZDsKKwljYi5jb25uZWN0X2luZGljYXRpb24gPSB4MjVfY29ubmVjdGVkOworCWNiLmRpc2Nvbm5lY3RfY29uZmlybWF0aW9uID0geDI1X2Rpc2Nvbm5lY3RlZDsKKwljYi5kaXNjb25uZWN0X2luZGljYXRpb24gPSB4MjVfZGlzY29ubmVjdGVkOworCWNiLmRhdGFfaW5kaWNhdGlvbiA9IHgyNV9kYXRhX2luZGljYXRpb247CisJY2IuZGF0YV90cmFuc21pdCA9IHgyNV9kYXRhX3RyYW5zbWl0OworCisJcmVzdWx0ID0gbGFwYl9yZWdpc3RlcihkZXYsICZjYik7CisJaWYgKHJlc3VsdCAhPSBMQVBCX09LKQorCQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHZvaWQgeDI1X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbGFwYl91bnJlZ2lzdGVyKGRldik7Cit9CisKKworCitzdGF0aWMgaW50IHgyNV9yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoc2tiLT5kZXYpOworCisJaWYgKChza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQloZGxjLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybiBORVRfUlhfRFJPUDsKKwl9CisKKwlpZiAobGFwYl9kYXRhX3JlY2VpdmVkKHNrYi0+ZGV2LCBza2IpID09IExBUEJfT0spCisJCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKKworCWhkbGMtPnN0YXRzLnJ4X2Vycm9ycysrOworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIE5FVF9SWF9EUk9QOworfQorCisKKworaW50IGhkbGNfeDI1X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlpbnQgcmVzdWx0OworCisJc3dpdGNoIChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9HRVRfUFJPVE86CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9QUk9UT19YMjU7CisJCXJldHVybiAwOyAvKiByZXR1cm4gcHJvdG9jb2wgb25seSwgbm8gc2V0dGFibGUgcGFyYW1ldGVycyAqLworCisJY2FzZSBJRl9QUk9UT19YMjU6CisJCWlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZihkZXYtPmZsYWdzICYgSUZGX1VQKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlyZXN1bHQ9aGRsYy0+YXR0YWNoKGRldiwgRU5DT0RJTkdfTlJaLFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQloZGxjX3Byb3RvX2RldGFjaChoZGxjKTsKKwkJbWVtc2V0KCZoZGxjLT5wcm90bywgMCwgc2l6ZW9mKGhkbGMtPnByb3RvKSk7CisKKwkJaGRsYy0+cHJvdG8ub3BlbiA9IHgyNV9vcGVuOworCQloZGxjLT5wcm90by5jbG9zZSA9IHgyNV9jbG9zZTsKKwkJaGRsYy0+cHJvdG8ubmV0aWZfcnggPSB4MjVfcng7CisJCWhkbGMtPnByb3RvLnR5cGVfdHJhbnMgPSBOVUxMOworCQloZGxjLT5wcm90by5pZCA9IElGX1BST1RPX1gyNTsKKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB4MjVfeG1pdDsKKwkJZGV2LT5oYXJkX2hlYWRlciA9IE5VTEw7CisJCWRldi0+dHlwZSA9IEFSUEhSRF9YMjU7CisJCWRldi0+YWRkcl9sZW4gPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9ob3N0ZXNzX3N2MTEuYyBiL2RyaXZlcnMvbmV0L3dhbi9ob3N0ZXNzX3N2MTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGIxZDFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hvc3Rlc3Nfc3YxMS5jCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICoJQ29tdHJvbCBTVjExIGNhcmQgZHJpdmVyCisgKgorICoJVGhpcyBpcyBhIHNsaWdodGx5IG9kZCBaODUyMzAgc3luY2hyb25vdXMgZHJpdmVyLiBBbGwgeW91IG5lZWQgdG8KKyAqCWtub3cgYmFzaWNhbGx5IGlzCisgKgorICoJSXRzIGEgZ2VudWluZSBaODUyMzAKKyAqCisgKglJdCBzdXBwb3J0cyBETUEgdXNpbmcgdHdvIERNQSBjaGFubmVscyBpbiBTWU5DIG1vZGUuIFRoZSBkcml2ZXIgZG9lc24ndAorICoJdXNlIHRoZXNlIGZhY2lsaXRpZXMKKyAqCQorICoJVGhlIGNvbnRyb2wgcG9ydCBpcyBhdCBpbysxLCB0aGUgZGF0YSBhdCBpbyszIGFuZCB0dXJuaW5nIG9mZiB0aGUgRE1BCisgKglpcyBkb25lIGJ5IHdyaXRpbmcgMCB0byBpbys0CisgKgorICoJVGhlIGhhcmR3YXJlIGRvZXMgdGhlIGJ1cyBoYW5kbGluZyB0byBhdm9pZCB0aGUgbmVlZCBmb3IgZGVsYXlzIGJldHdlZW4KKyAqCXRvdWNoaW5nIGNvbnRyb2wgcmVnaXN0ZXJzLgorICoKKyAqCVBvcnQgQiBpc250IHdpcmVkICh3aHkgLSBiZWF0cyBtZSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bmV0L3N5bmNwcHAuaD4KKyNpbmNsdWRlICJ6ODUyMzAuaCIKKworc3RhdGljIGludCBkbWE7CisKK3N0cnVjdCBzdjExX2RldmljZQoreworCXZvaWQgKmlmX3B0cjsJLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIgKHVzZWQgYnkgU1BQUCkgKi8KKwlzdHJ1Y3Qgejg1MzBfZGV2IHN5bmM7CisJc3RydWN0IHBwcF9kZXZpY2UgbmV0ZGV2OworfTsKKworLyoKKyAqCU5ldHdvcmsgZHJpdmVyIHN1cHBvcnQgcm91dGluZXMKKyAqLworCisvKgorICoJRnJhbWUgcmVjZWl2ZS4gU2ltcGxlIGZvciBvdXIgY2FyZCBhcyB3ZSBkbyBzeW5jIHBwcCBhbmQgdGhlcmUKKyAqCWlzIG5vIGZ1bm55IGdhcmJhZ2UgaW52b2x2ZWQKKyAqLworIAorc3RhdGljIHZvaWQgaG9zdGVzc19pbnB1dChzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBEcm9wIHRoZSBDUkMgLSBpdCdzIG5vdCBhIGdvb2QgaWRlYSB0byB0cnkgYW5kIG5lZ290aWF0ZSBpdCA7KSAqLworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4tMik7CisJc2tiLT5wcm90b2NvbD1fX2NvbnN0YW50X2h0b25zKEVUSF9QX1dBTl9QUFApOworCXNrYi0+bWFjLnJhdz1za2ItPmRhdGE7CisJc2tiLT5kZXY9Yy0+bmV0ZGV2aWNlOworCS8qCisJICoJU2VuZCBpdCB0byB0aGUgUFBQIGxheWVyLiBXZSBkb24ndCBoYXZlIHRpbWUgdG8gcHJvY2VzcworCSAqCWl0IHJpZ2h0IG5vdy4KKwkgKi8KKwluZXRpZl9yeChza2IpOworCWMtPm5ldGRldmljZS0+bGFzdF9yeCA9IGppZmZpZXM7Cit9CisgCisvKgorICoJV2UndmUgYmVlbiBwbGFjZWQgaW4gdGhlIFVQIHN0YXRlCisgKi8gCisgCitzdGF0aWMgaW50IGhvc3Rlc3Nfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlzdHJ1Y3Qgc3YxMV9kZXZpY2UgKnN2MTE9ZC0+cHJpdjsKKwlpbnQgZXJyID0gLTE7CisJCisJLyoKKwkgKglMaW5rIGxheWVyIHVwCisJICovCisJc3dpdGNoKGRtYSkKKwl7CisJCWNhc2UgMDoKKwkJCWVycj16ODUzMF9zeW5jX29wZW4oZCwgJnN2MTEtPnN5bmMuY2hhbkEpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWVycj16ODUzMF9zeW5jX2RtYV9vcGVuKGQsICZzdjExLT5zeW5jLmNoYW5BKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQllcnI9ejg1MzBfc3luY190eGRtYV9vcGVuKGQsICZzdjExLT5zeW5jLmNoYW5BKTsKKwkJCWJyZWFrOworCX0KKwkKKwlpZihlcnIpCisJCXJldHVybiBlcnI7CisJLyoKKwkgKglCZWdpbiBQUFAKKwkgKi8KKwllcnI9c3BwcF9vcGVuKGQpOworCWlmKGVycikKKwl7CisJCXN3aXRjaChkbWEpCisJCXsKKwkJCWNhc2UgMDoKKwkJCQl6ODUzMF9zeW5jX2Nsb3NlKGQsICZzdjExLT5zeW5jLmNoYW5BKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQl6ODUzMF9zeW5jX2RtYV9jbG9zZShkLCAmc3YxMS0+c3luYy5jaGFuQSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJejg1MzBfc3luY190eGRtYV9jbG9zZShkLCAmc3YxMS0+c3luYy5jaGFuQSk7CisJCQkJYnJlYWs7CisJCX0JCQkJCisJCXJldHVybiBlcnI7CisJfQorCXN2MTEtPnN5bmMuY2hhbkEucnhfZnVuY3Rpb249aG9zdGVzc19pbnB1dDsKKwkKKwkvKgorCSAqCUdvIGdvIGdvCisJICovCisKKwluZXRpZl9zdGFydF9xdWV1ZShkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBob3N0ZXNzX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkKQoreworCXN0cnVjdCBzdjExX2RldmljZSAqc3YxMT1kLT5wcml2OworCS8qCisJICoJRGlzY2FyZCBuZXcgZnJhbWVzCisJICovCisJc3YxMS0+c3luYy5jaGFuQS5yeF9mdW5jdGlvbj16ODUzMF9udWxsX3J4OworCS8qCisJICoJUFBQIG9mZgorCSAqLworCXNwcHBfY2xvc2UoZCk7CisJLyoKKwkgKglMaW5rIGxheWVyIGRvd24KKwkgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGQpOworCQkKKwlzd2l0Y2goZG1hKQorCXsKKwkJY2FzZSAwOgorCQkJejg1MzBfc3luY19jbG9zZShkLCAmc3YxMS0+c3luYy5jaGFuQSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJejg1MzBfc3luY19kbWFfY2xvc2UoZCwgJnN2MTEtPnN5bmMuY2hhbkEpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXo4NTMwX3N5bmNfdHhkbWFfY2xvc2UoZCwgJnN2MTEtPnN5bmMuY2hhbkEpOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhvc3Rlc3NfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmQsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCS8qIHN0cnVjdCBzdjExX2RldmljZSAqc3YxMT1kLT5wcml2OworCSAgIHo4NTMwX2lvY3RsKGQsJnN2MTEtPnN5bmMuY2hhbkEsaWZyLGNtZCkgKi8KKwlyZXR1cm4gc3BwcF9kb19pb2N0bChkLCBpZnIsY21kKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpob3N0ZXNzX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlzdHJ1Y3Qgc3YxMV9kZXZpY2UgKnN2MTE9ZC0+cHJpdjsKKwlpZihzdjExKQorCQlyZXR1cm4gejg1MzBfZ2V0X3N0YXRzKCZzdjExLT5zeW5jLmNoYW5BKTsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCisvKgorICoJUGFzc2VkIFBQUCBmcmFtZXMsIGZpcmUgdGhlbSBkb3dud2luZC4KKyAqLworIAorc3RhdGljIGludCBob3N0ZXNzX3F1ZXVlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmQpCit7CisJc3RydWN0IHN2MTFfZGV2aWNlICpzdjExPWQtPnByaXY7CisJcmV0dXJuIHo4NTMwX3F1ZXVlX3htaXQoJnN2MTEtPnN5bmMuY2hhbkEsIHNrYik7Cit9CisKK3N0YXRpYyBpbnQgaG9zdGVzc19uZWlnaF9zZXR1cChzdHJ1Y3QgbmVpZ2hib3VyICpuKQoreworCWlmIChuLT5udWRfc3RhdGUgPT0gTlVEX05PTkUpIHsKKwkJbi0+b3BzID0gJmFycF9icm9rZW5fb3BzOworCQluLT5vdXRwdXQgPSBuLT5vcHMtPm91dHB1dDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaG9zdGVzc19uZWlnaF9zZXR1cF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5laWdoX3Bhcm1zICpwKQoreworCWlmIChwLT50YmwtPmZhbWlseSA9PSBBRl9JTkVUKSB7CisJCXAtPm5laWdoX3NldHVwID0gaG9zdGVzc19uZWlnaF9zZXR1cDsKKwkJcC0+dWNhc3RfcHJvYmVzID0gMDsKKwkJcC0+bWNhc3RfcHJvYmVzID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN2MTFfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sJCisJZGV2LT5vcGVuID0gaG9zdGVzc19vcGVuOworCWRldi0+c3RvcCA9IGhvc3Rlc3NfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBob3N0ZXNzX3F1ZXVlX3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBob3N0ZXNzX2dldF9zdGF0czsKKwlkZXYtPmRvX2lvY3RsID0gaG9zdGVzc19pb2N0bDsKKwlkZXYtPm5laWdoX3NldHVwID0gaG9zdGVzc19uZWlnaF9zZXR1cF9kZXY7Cit9CisKKy8qCisgKglEZXNjcmlwdGlvbiBibG9jayBmb3IgYSBDb210cm9sIEhvc3Rlc3MgU1YxMSBjYXJkCisgKi8KKyAKK3N0YXRpYyBzdHJ1Y3Qgc3YxMV9kZXZpY2UgKnN2MTFfaW5pdChpbnQgaW9iYXNlLCBpbnQgaXJxKQoreworCXN0cnVjdCB6ODUzMF9kZXYgKmRldjsKKwlzdHJ1Y3Qgc3YxMV9kZXZpY2UgKnN2OworCQorCS8qCisJICoJR2V0IHRoZSBuZWVkZWQgSS9PIHNwYWNlCisJICovCisJIAorCWlmKCFyZXF1ZXN0X3JlZ2lvbihpb2Jhc2UsIDgsICJDb210cm9sIFNWMTEiKSkKKwl7CQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJob3N0ZXNzOiBJL08gMHglWCBhbHJlYWR5IGluIHVzZS5cbiIsIGlvYmFzZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwlzdj0oc3RydWN0IHN2MTFfZGV2aWNlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHN2MTFfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYoIXN2KQorCQlnb3RvIGZhaWwzOworCQkJCisJbWVtc2V0KHN2LCAwLCBzaXplb2YoKnN2KSk7CisJc3YtPmlmX3B0cj0mc3YtPm5ldGRldjsKKwkKKwlzdi0+bmV0ZGV2LmRldiA9IGFsbG9jX25ldGRldigwLCAiaGRsYyVkIiwgc3YxMV9zZXR1cCk7CisJaWYoIXN2LT5uZXRkZXYuZGV2KQorCQlnb3RvIGZhaWwyOworCisJU0VUX01PRFVMRV9PV05FUihzdi0+bmV0ZGV2LmRldik7CisKKwlkZXY9JnN2LT5zeW5jOworCQorCS8qCisJICoJU3R1ZmYgaW4gdGhlIEkvTyBhZGRyZXNzaW5nCisJICovCisJIAorCWRldi0+YWN0aXZlID0gMDsKKwkKKwlkZXYtPmNoYW5BLmN0cmxpbz1pb2Jhc2UrMTsKKwlkZXYtPmNoYW5BLmRhdGFpbz1pb2Jhc2UrMzsKKwlkZXYtPmNoYW5CLmN0cmxpbz0tMTsKKwlkZXYtPmNoYW5CLmRhdGFpbz0tMTsKKwlkZXYtPmNoYW5BLmlycXM9Jno4NTMwX25vcDsKKwlkZXYtPmNoYW5CLmlycXM9Jno4NTMwX25vcDsKKwkKKwlvdXRiKDAsIGlvYmFzZSs0KTsJCS8qIERNQSBvZmYgKi8KKwkKKwkvKiBXZSB3YW50IGEgZmFzdCBJUlEgZm9yIHRoaXMgZGV2aWNlLiBBY3R1YWxseSB3ZSdkIGxpa2UgYW4gZXZlbiBmYXN0ZXIKKwkgICBJUlEgOykgLSBUaGlzIGlzIG9uZSBkcml2ZXIgUnRMaW51eCBpcyBtYWRlIGZvciAqLworCSAgIAorCWlmKHJlcXVlc3RfaXJxKGlycSwgJno4NTMwX2ludGVycnVwdCwgU0FfSU5URVJSVVBULCAiSG9zdGVzcyBTVjExIiwgZGV2KTwwKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaG9zdGVzczogSVJRICVkIGFscmVhZHkgaW4gdXNlLlxuIiwgaXJxKTsKKwkJZ290byBmYWlsMTsKKwl9CisJCisJZGV2LT5pcnE9aXJxOworCWRldi0+Y2hhbkEucHJpdmF0ZT1zdjsKKwlkZXYtPmNoYW5BLm5ldGRldmljZT1zdi0+bmV0ZGV2LmRldjsKKwlkZXYtPmNoYW5BLmRldj1kZXY7CisJZGV2LT5jaGFuQi5kZXY9ZGV2OworCQorCWlmKGRtYSkKKwl7CisJCS8qCisJCSAqCVlvdSBjYW4gaGF2ZSBETUEgb2ZmIG9yIDEgYW5kIDMgdGhhdHMgdGhlIGxvdAorCQkgKglvbiB0aGUgQ29tdHJvbC4KKwkJICovCisJCWRldi0+Y2hhbkEudHhkbWE9MzsKKwkJZGV2LT5jaGFuQS5yeGRtYT0xOworCQlvdXRiKDB4MDN8MHgwOCwgaW9iYXNlKzQpOwkJLyogRE1BIG9uICovCisJCWlmKHJlcXVlc3RfZG1hKGRldi0+Y2hhbkEudHhkbWEsICJIb3N0ZXNzIFNWLzExIChUWCkiKSE9MCkKKwkJCWdvdG8gZmFpbDsKKwkJCQorCQlpZihkbWE9PTEpCisJCXsKKwkJCWlmKHJlcXVlc3RfZG1hKGRldi0+Y2hhbkEucnhkbWEsICJIb3N0ZXNzIFNWLzExIChSWCkiKSE9MCkKKwkJCQlnb3RvIGRtYWZhaWw7CisJCX0KKwl9CisKKwkvKiBLaWxsIG91ciBwcml2YXRlIElSUSBsaW5lIHRoZSBob3N0ZXNzIGNhbiBlbmQgdXAgY2hhdHRlcmluZworCSAgIHVudGlsIHRoZSBjb25maWd1cmF0aW9uIGlzIHNldCAqLworCWRpc2FibGVfaXJxKGlycSk7CisJCQorCS8qCisJICoJQmVnaW4gbm9ybWFsIGluaXRpYWxpc2UKKwkgKi8KKwkgCisJaWYoejg1MzBfaW5pdChkZXYpIT0wKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJaODUzMCBzZXJpZXMgZGV2aWNlIG5vdCBmb3VuZC5cbiIpOworCQllbmFibGVfaXJxKGlycSk7CisJCWdvdG8gZG1hZmFpbDI7CisJfQorCXo4NTMwX2NoYW5uZWxfbG9hZCgmZGV2LT5jaGFuQiwgejg1MzBfZGVhZF9wb3J0KTsKKwlpZihkZXYtPnR5cGU9PVo4NUMzMCkKKwkJejg1MzBfY2hhbm5lbF9sb2FkKCZkZXYtPmNoYW5BLCB6ODUzMF9oZGxjX2tpbG9zdHJlYW0pOworCWVsc2UKKwkJejg1MzBfY2hhbm5lbF9sb2FkKCZkZXYtPmNoYW5BLCB6ODUzMF9oZGxjX2tpbG9zdHJlYW1fODUyMzApOworCQorCWVuYWJsZV9pcnEoaXJxKTsKKwkKKworCS8qCisJICoJTm93IHdlIGNhbiB0YWtlIHRoZSBJUlEKKwkgKi8KKwlpZihkZXZfYWxsb2NfbmFtZShkZXYtPmNoYW5BLm5ldGRldmljZSwiaGRsYyVkIik+PTApCisJeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZD1kZXYtPmNoYW5BLm5ldGRldmljZTsKKworCQkvKiAKKwkJICoJSW5pdGlhbGlzZSB0aGUgUFBQIGNvbXBvbmVudHMKKwkJICovCisJCXNwcHBfYXR0YWNoKCZzdi0+bmV0ZGV2KTsKKwkJCisJCS8qCisJCSAqCUxvY2FsIGZpZWxkcworCQkgKi8JCisJCQorCQlkLT5iYXNlX2FkZHIgPSBpb2Jhc2U7CisJCWQtPmlycSA9IGlycTsKKwkJZC0+cHJpdiA9IHN2OworCQkKKwkJaWYocmVnaXN0ZXJfbmV0ZGV2KGQpKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gcmVnaXN0ZXIgZGV2aWNlLlxuIiwKKwkJCQlkLT5uYW1lKTsKKwkJCXNwcHBfZGV0YWNoKGQpOworCQkJZ290byBkbWFmYWlsMjsKKwkJfQorCisJCXo4NTMwX2Rlc2NyaWJlKGRldiwgIkkvTyIsIGlvYmFzZSk7CisJCWRldi0+YWN0aXZlPTE7CisJCXJldHVybiBzdjsJCisJfQorZG1hZmFpbDI6CisJaWYoZG1hPT0xKQorCQlmcmVlX2RtYShkZXYtPmNoYW5BLnJ4ZG1hKTsKK2RtYWZhaWw6CisJaWYoZG1hKQorCQlmcmVlX2RtYShkZXYtPmNoYW5BLnR4ZG1hKTsKK2ZhaWw6CisJZnJlZV9pcnEoaXJxLCBkZXYpOworZmFpbDE6CisJZnJlZV9uZXRkZXYoc3YtPm5ldGRldi5kZXYpOworZmFpbDI6CisJa2ZyZWUoc3YpOworZmFpbDM6CisJcmVsZWFzZV9yZWdpb24oaW9iYXNlLDgpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzdjExX3NodXRkb3duKHN0cnVjdCBzdjExX2RldmljZSAqZGV2KQoreworCXNwcHBfZGV0YWNoKGRldi0+bmV0ZGV2LmRldik7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2LT5uZXRkZXYuZGV2KTsKKwl6ODUzMF9zaHV0ZG93bigmZGV2LT5zeW5jKTsKKwlmcmVlX2lycShkZXYtPnN5bmMuaXJxLCBkZXYpOworCWlmKGRtYSkKKwl7CisJCWlmKGRtYT09MSkKKwkJCWZyZWVfZG1hKGRldi0+c3luYy5jaGFuQS5yeGRtYSk7CisJCWZyZWVfZG1hKGRldi0+c3luYy5jaGFuQS50eGRtYSk7CisJfQorCXJlbGVhc2VfcmVnaW9uKGRldi0+c3luYy5jaGFuQS5jdHJsaW8tMSwgOCk7CisJZnJlZV9uZXRkZXYoZGV2LT5uZXRkZXYuZGV2KTsKKwlrZnJlZShkZXYpOworfQorCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyBpbnQgaW89MHgyMDA7CitzdGF0aWMgaW50IGlycT05OworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiVGhlIEkvTyBiYXNlIG9mIHRoZSBDb210cm9sIEhvc3Rlc3MgU1YxMSBjYXJkIik7Cittb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbWEsICJTZXQgdGhpcyB0byAxIHRvIHVzZSBETUExL0RNQTMgZm9yIFRYL1JYIik7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJUaGUgaW50ZXJydXB0IGxpbmUgc2V0dGluZyBmb3IgdGhlIENvbXRyb2wgSG9zdGVzcyBTVjExIGNhcmQiKTsKKworTU9EVUxFX0FVVEhPUigiQWxhbiBDb3giKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTW9kdWxhciBkcml2ZXIgZm9yIHRoZSBDb210cm9sIEhvc3Rlc3MgU1YxMSIpOworCitzdGF0aWMgc3RydWN0IHN2MTFfZGV2aWNlICpzdjExX3VuaXQ7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlNWLTExIFo4NTIzMCBTeW5jaHJvbm91cyBEcml2ZXIgdiAwLjAzLlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiKGMpIENvcHlyaWdodCAyMDAxLCBSZWQgSGF0IEluYy5cbiIpOwkKKwlpZigoc3YxMV91bml0PXN2MTFfaW5pdChpbyxpcnEpKT09TlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpZihzdjExX3VuaXQpCisJCXN2MTFfc2h1dGRvd24oc3YxMV91bml0KTsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sYXBiZXRoZXIuYyBiL2RyaXZlcnMvbmV0L3dhbi9sYXBiZXRoZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjJlMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2xhcGJldGhlci5jCkBAIC0wLDAgKzEsNDY1IEBACisvKgorICoJIkxBUEIgdmlhIGV0aGVybmV0IiBkcml2ZXIgcmVsZWFzZSAwMDEKKyAqCisgKglUaGlzIGNvZGUgUkVRVUlSRVMgMi4xLjE1IG9yIGhpZ2hlci8gTkVUMy4wMzgKKyAqCisgKglUaGlzIG1vZHVsZToKKyAqCQlUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBpcyBhICJwc2V1ZG8iIG5ldHdvcmsgZHJpdmVyIHRvIGFsbG93IExBUEIgb3ZlciBFdGhlcm5ldC4KKyAqCisgKglUaGlzIGRyaXZlciBjYW4gdXNlIGFueSBldGhlcm5ldCBkZXN0aW5hdGlvbiBhZGRyZXNzLCBhbmQgY2FuIGJlIAorICoJbGltaXRlZCB0byBhY2NlcHQgZnJhbWVzIGZyb20gb25lIGRlZGljYXRlZCBldGhlcm5ldCBjYXJkIG9ubHkuCisgKgorICoJSGlzdG9yeQorICoJTEFQQkVUSCAwMDEJSm9uYXRoYW4gTmF5bG9yCQlDbG9uZWQgZnJvbSBicHFldGhlci5jCisgKgkyMDAwLTEwLTI5CUhlbm5lciBFaXNlbglsYXBiX2RhdGFfaW5kaWNhdGlvbigpIHJldHVybiBzdGF0dXMuCisgKgkyMDAwLTExLTE0CUhlbm5lciBFaXNlbglkZXZfaG9sZC9wdXQsIE5FVERFVl9HT0lOR19ET1dOIHN1cHBvcnQKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9sYXBiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L3gyNWRldmljZS5oPgorCitzdGF0aWMgY2hhciBiY2FzdF9hZGRyWzZdID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CisKKy8qIElmIHRoaXMgbnVtYmVyIGlzIG1hZGUgbGFyZ2VyLCBjaGVjayB0aGF0IHRoZSB0ZW1wb3Jhcnkgc3RyaW5nIGJ1ZmZlcgorICogaW4gbGFwYmV0aF9uZXdfZGV2aWNlIGlzIGxhcmdlIGVub3VnaCB0byBzdG9yZSB0aGUgcHJvYmUgZGV2aWNlIG5hbWUuKi8KKyNkZWZpbmUgTUFYTEFQQkRFViAxMDAKKworc3RydWN0IGxhcGJldGhkZXYgeworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZXRoZGV2OwkvKiBsaW5rIHRvIGV0aGVybmV0IGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlCSpheGRldjsJCS8qIGxhcGJldGggZGV2aWNlIChsYXBiIykgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJCS8qIHNvbWUgc3RhdGlzdGljcyAqLworfTsKKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgbGFwYmV0aF9kZXZpY2VzID0gTElTVF9IRUFEX0lOSVQobGFwYmV0aF9kZXZpY2VzKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKglHZXQgdGhlIExBUEIgZGV2aWNlIGZvciB0aGUgZXRoZXJuZXQgZGV2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGFwYmV0aGRldiAqbGFwYmV0aF9nZXRfeDI1X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYXBiZXRoZGV2ICpsYXBiZXRoOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobGFwYmV0aCwgJmxhcGJldGhfZGV2aWNlcywgbm9kZSkgeworCQlpZiAobGFwYmV0aC0+ZXRoZGV2ID09IGRldikgCisJCQlyZXR1cm4gbGFwYmV0aDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBkZXZfaXNfZXRoZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIgJiYgc3RybmNtcChkZXYtPm5hbWUsICJkdW1teSIsIDUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqCVJlY2VpdmUgYSBMQVBCIGZyYW1lIHZpYSBhbiBldGhlcm5ldCBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyBpbnQgbGFwYmV0aF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHBhY2tldF90eXBlICpwdHlwZSkKK3sKKwlpbnQgbGVuLCBlcnI7CisJc3RydWN0IGxhcGJldGhkZXYgKmxhcGJldGg7CisKKwlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gTkVUX1JYX0RST1A7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAyKSkKKwkJZ290byBkcm9wOworCisJcmN1X3JlYWRfbG9jaygpOworCWxhcGJldGggPSBsYXBiZXRoX2dldF94MjVfZGV2KGRldik7CisJaWYgKCFsYXBiZXRoKQorCQlnb3RvIGRyb3BfdW5sb2NrOworCWlmICghbmV0aWZfcnVubmluZyhsYXBiZXRoLT5heGRldikpCisJCWdvdG8gZHJvcF91bmxvY2s7CisKKwlsYXBiZXRoLT5zdGF0cy5yeF9wYWNrZXRzKys7CisKKwlsZW4gPSBza2ItPmRhdGFbMF0gKyBza2ItPmRhdGFbMV0gKiAyNTY7CisJbGFwYmV0aC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCisJc2tiX3B1bGwoc2tiLCAyKTsJLyogUmVtb3ZlIHRoZSBsZW5ndGggYnl0ZXMgKi8KKwlza2JfdHJpbShza2IsIGxlbik7CS8qIFNldCB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhICovCisKKwlpZiAoKGVyciA9IGxhcGJfZGF0YV9yZWNlaXZlZChsYXBiZXRoLT5heGRldiwgc2tiKSkgIT0gTEFQQl9PSykgeworCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYmV0aGVyOiBsYXBiX2RhdGFfcmVjZWl2ZWQgZXJyIC0gJWRcbiIsIGVycik7CisJCWdvdG8gZHJvcF91bmxvY2s7CisJfQorb3V0OgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiAwOworZHJvcF91bmxvY2s6CisJa2ZyZWVfc2tiKHNrYik7CisJZ290byBvdXQ7Citkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhcGJldGhfZGF0YV9pbmRpY2F0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgY2hhciAqcHRyOworCisJc2tiX3B1c2goc2tiLCAxKTsKKworCWlmIChza2JfY293KHNrYiwgMSkpCisJCXJldHVybiBORVRfUlhfRFJPUDsKKworCXB0ciAgPSBza2ItPmRhdGE7CisJKnB0ciA9IDB4MDA7CisKKwlza2ItPnByb3RvY29sID0geDI1X3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlyZXR1cm4gbmV0aWZfcngoc2tiKTsKK30KKworLyoKKyAqCVNlbmQgYSBMQVBCIGZyYW1lIHZpYSBhbiBldGhlcm5ldCBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBsYXBiZXRoX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCS8qCisJICogSnVzdCB0byBiZSAqcmVhbGx5KiBzdXJlIG5vdCB0byBzZW5kIGFueXRoaW5nIGlmIHRoZSBpbnRlcmZhY2UKKwkgKiBpcyBkb3duLCB0aGUgZXRoZXJuZXQgZGV2aWNlIG1heSBoYXZlIGdvbmUuCisJICovCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJZ290byBkcm9wOworCX0KKworCXN3aXRjaCAoc2tiLT5kYXRhWzBdKSB7CisJY2FzZSAweDAwOgorCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIDB4MDE6CisJCWlmICgoZXJyID0gbGFwYl9jb25uZWN0X3JlcXVlc3QoZGV2KSkgIT0gTEFQQl9PSykKKwkJCXByaW50ayhLRVJOX0VSUiAibGFwYmV0aDogbGFwYl9jb25uZWN0X3JlcXVlc3QgIgorCQkJICAgICAgICJlcnJvcjogJWRcbiIsIGVycik7CisJCWdvdG8gZHJvcF9vazsKKwljYXNlIDB4MDI6CisJCWlmICgoZXJyID0gbGFwYl9kaXNjb25uZWN0X3JlcXVlc3QoZGV2KSkgIT0gTEFQQl9PSykKKwkJCXByaW50ayhLRVJOX0VSUiAibGFwYmV0aDogbGFwYl9kaXNjb25uZWN0X3JlcXVlc3QgIgorCQkJICAgICAgICJlcnI6ICVkXG4iLCBlcnIpOworCQkvKiBGYWxsIHRocnUgKi8KKwlkZWZhdWx0OgorCQlnb3RvIGRyb3Bfb2s7CisJfQorCisJc2tiX3B1bGwoc2tiLCAxKTsKKworCWlmICgoZXJyID0gbGFwYl9kYXRhX3JlcXVlc3QoZGV2LCBza2IpKSAhPSBMQVBCX09LKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGFwYmV0aDogbGFwYl9kYXRhX3JlcXVlc3QgZXJyb3IgLSAlZFxuIiwgZXJyKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBkcm9wOworCX0KKwllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7Citkcm9wX29rOgorCWVyciA9IDA7Citkcm9wOgorCWtmcmVlX3NrYihza2IpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBsYXBiZXRoX2RhdGFfdHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxhcGJldGhkZXYgKmxhcGJldGggPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgc2l6ZSA9IHNrYi0+bGVuOworCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX1gyNSk7CisKKwlwdHIgPSBza2JfcHVzaChza2IsIDIpOworCisJKnB0cisrID0gc2l6ZSAlIDI1NjsKKwkqcHRyKysgPSBzaXplIC8gMjU2OworCisJbGFwYmV0aC0+c3RhdHMudHhfcGFja2V0cysrOworCWxhcGJldGgtPnN0YXRzLnR4X2J5dGVzICs9IHNpemU7CisKKwlza2ItPmRldiA9IGRldiA9IGxhcGJldGgtPmV0aGRldjsKKworCWRldi0+aGFyZF9oZWFkZXIoc2tiLCBkZXYsIEVUSF9QX0RFQywgYmNhc3RfYWRkciwgTlVMTCwgMCk7CisKKwlkZXZfcXVldWVfeG1pdChza2IpOworfQorCitzdGF0aWMgdm9pZCBsYXBiZXRoX2Nvbm5lY3RlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhc29uKQoreworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYigxKTsKKworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGFwYmV0aDogb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybjsKKwl9CisKKwlwdHIgID0gc2tiX3B1dChza2IsIDEpOworCSpwdHIgPSAweDAxOworCisJc2tiLT5wcm90b2NvbCA9IHgyNV90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJbmV0aWZfcngoc2tiKTsKK30KKworc3RhdGljIHZvaWQgbGFwYmV0aF9kaXNjb25uZWN0ZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJlYXNvbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoMSk7CisKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9FUlIgImxhcGJldGg6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm47CisJfQorCisJcHRyICA9IHNrYl9wdXQoc2tiLCAxKTsKKwkqcHRyID0gMHgwMjsKKworCXNrYi0+cHJvdG9jb2wgPSB4MjVfdHlwZV90cmFucyhza2IsIGRldik7CisJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCW5ldGlmX3J4KHNrYik7Cit9CisKKy8qCisgKglTdGF0aXN0aWNzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbGFwYmV0aF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFwYmV0aGRldiAqbGFwYmV0aCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZsYXBiZXRoLT5zdGF0czsKK30KKworLyoKKyAqCVNldCBBWC4yNSBjYWxsc2lnbgorICovCitzdGF0aWMgaW50IGxhcGJldGhfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IGFkZHI7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHNhLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGxhcGJfcmVnaXN0ZXJfc3RydWN0IGxhcGJldGhfY2FsbGJhY2tzID0geworCS5jb25uZWN0X2NvbmZpcm1hdGlvbiAgICA9IGxhcGJldGhfY29ubmVjdGVkLAorCS5jb25uZWN0X2luZGljYXRpb24gICAgICA9IGxhcGJldGhfY29ubmVjdGVkLAorCS5kaXNjb25uZWN0X2NvbmZpcm1hdGlvbiA9IGxhcGJldGhfZGlzY29ubmVjdGVkLAorCS5kaXNjb25uZWN0X2luZGljYXRpb24gICA9IGxhcGJldGhfZGlzY29ubmVjdGVkLAorCS5kYXRhX2luZGljYXRpb24gICAgICAgICA9IGxhcGJldGhfZGF0YV9pbmRpY2F0aW9uLAorCS5kYXRhX3RyYW5zbWl0ICAgICAgICAgICA9IGxhcGJldGhfZGF0YV90cmFuc21pdCwKKworfTsKKworLyoKKyAqIG9wZW4vY2xvc2UgYSBkZXZpY2UKKyAqLworc3RhdGljIGludCBsYXBiZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBsYXBiX3JlZ2lzdGVyKGRldiwgJmxhcGJldGhfY2FsbGJhY2tzKSkgIT0gTEFQQl9PSykgeworCQlwcmludGsoS0VSTl9FUlIgImxhcGJldGg6IGxhcGJfcmVnaXN0ZXIgZXJyb3IgLSAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYXBiZXRoX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGVycjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmICgoZXJyID0gbGFwYl91bnJlZ2lzdGVyKGRldikpICE9IExBUEJfT0spCisJCXByaW50ayhLRVJOX0VSUiAibGFwYmV0aDogbGFwYl91bnJlZ2lzdGVyIGVycm9yIC0gJWRcbiIsIGVycik7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGxhcGJldGhfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGxhcGJldGhfeG1pdDsKKwlkZXYtPm9wZW4JICAgICA9IGxhcGJldGhfb3BlbjsKKwlkZXYtPnN0b3AJICAgICA9IGxhcGJldGhfY2xvc2U7CisJZGV2LT5kZXN0cnVjdG9yCSAgICAgPSBmcmVlX25ldGRldjsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGxhcGJldGhfc2V0X21hY19hZGRyZXNzOworCWRldi0+Z2V0X3N0YXRzCSAgICAgPSBsYXBiZXRoX2dldF9zdGF0czsKKwlkZXYtPnR5cGUgICAgICAgICAgICA9IEFSUEhSRF9YMjU7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSAzOworCWRldi0+bXR1ICAgICAgICAgICAgID0gMTAwMDsKKwlkZXYtPmFkZHJfbGVuICAgICAgICA9IDA7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworfQorCisvKgorICoJU2V0dXAgYSBuZXcgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGxhcGJldGhfbmV3X2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCBsYXBiZXRoZGV2ICpsYXBiZXRoOworCWludCByYyA9IC1FTk9NRU07CisKKwlBU1NFUlRfUlROTCgpOworCisJbmRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKmxhcGJldGgpLCAibGFwYiVkIiwgCisJCQkgICBsYXBiZXRoX3NldHVwKTsKKwlpZiAoIW5kZXYpCisJCWdvdG8gb3V0OworCisJbGFwYmV0aCA9IG5ldGRldl9wcml2KG5kZXYpOworCWxhcGJldGgtPmF4ZGV2ID0gbmRldjsKKworCWRldl9ob2xkKGRldik7CisJbGFwYmV0aC0+ZXRoZGV2ID0gZGV2OworCisJcmMgPSBkZXZfYWxsb2NfbmFtZShuZGV2LCBuZGV2LT5uYW1lKTsKKwlpZiAocmMgPCAwKSAKKwkJZ290byBmYWlsOworCisJcmMgPSAtRUlPOworCWlmIChyZWdpc3Rlcl9uZXRkZXZpY2UobmRldikpCisJCWdvdG8gZmFpbDsKKworCWxpc3RfYWRkX3JjdSgmbGFwYmV0aC0+bm9kZSwgJmxhcGJldGhfZGV2aWNlcyk7CisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK2ZhaWw6CisJZGV2X3B1dChkZXYpOworCWZyZWVfbmV0ZGV2KG5kZXYpOworCWtmcmVlKGxhcGJldGgpOworCWdvdG8gb3V0OworfQorCisvKgorICoJRnJlZSBhIGxhcGIgbmV0d29yayBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkIGxhcGJldGhfZnJlZV9kZXZpY2Uoc3RydWN0IGxhcGJldGhkZXYgKmxhcGJldGgpCit7CisJZGV2X3B1dChsYXBiZXRoLT5ldGhkZXYpOworCWxpc3RfZGVsX3JjdSgmbGFwYmV0aC0+bm9kZSk7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2UobGFwYmV0aC0+YXhkZXYpOworfQorCisvKgorICoJSGFuZGxlIGRldmljZSBzdGF0dXMgY2hhbmdlcy4KKyAqCisgKiBDYWxsZWQgZnJvbSBub3RpZmllciB3aXRoIFJUTkwgaGVsZC4KKyAqLworc3RhdGljIGludCBsYXBiZXRoX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkJdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBsYXBiZXRoZGV2ICpsYXBiZXRoOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwdHI7CisKKwlpZiAoIWRldl9pc19ldGhkZXYoZGV2KSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX1VQOgorCQkvKiBOZXcgZXRoZXJuZXQgZGV2aWNlIC0+IG5ldyBMQVBCIGludGVyZmFjZQkgKi8KKwkJaWYgKGxhcGJldGhfZ2V0X3gyNV9kZXYoZGV2KSA9PSBOVUxMKQorCQkJbGFwYmV0aF9uZXdfZGV2aWNlKGRldik7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX0RPV046CQorCQkvKiBldGhlcm5ldCBkZXZpY2UgY2xvc2VkIC0+IGNsb3NlIExBUEIgaW50ZXJmYWNlICovCisJCWxhcGJldGggPSBsYXBiZXRoX2dldF94MjVfZGV2KGRldik7CisJCWlmIChsYXBiZXRoKSAKKwkJCWRldl9jbG9zZShsYXBiZXRoLT5heGRldik7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CisJCS8qIGV0aGVybmV0IGRldmljZSBkaXNhcHBlYXJzIC0+IHJlbW92ZSBMQVBCIGludGVyZmFjZSAqLworCQlsYXBiZXRoID0gbGFwYmV0aF9nZXRfeDI1X2RldihkZXYpOworCQlpZiAobGFwYmV0aCkKKwkJCWxhcGJldGhfZnJlZV9kZXZpY2UobGFwYmV0aCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgbGFwYmV0aF9wYWNrZXRfdHlwZSA9IHsKKwkudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfREVDKSwKKwkuZnVuYyA9IGxhcGJldGhfcmN2LAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBsYXBiZXRoX2Rldl9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGxhcGJldGhfZGV2aWNlX2V2ZW50LAorfTsKKworc3RhdGljIGNoYXIgYmFubmVyW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAiTEFQQiBFdGhlcm5ldCBkcml2ZXIgdmVyc2lvbiAwLjAyXG4iOworCitzdGF0aWMgaW50IF9faW5pdCBsYXBiZXRoX2luaXRfZHJpdmVyKHZvaWQpCit7CisJZGV2X2FkZF9wYWNrKCZsYXBiZXRoX3BhY2tldF90eXBlKTsKKworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbGFwYmV0aF9kZXZfbm90aWZpZXIpOworCisJcHJpbnRrKGJhbm5lcik7CisKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGxhcGJldGhfaW5pdF9kcml2ZXIpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbGFwYmV0aF9jbGVhbnVwX2RyaXZlcih2b2lkKQoreworCXN0cnVjdCBsYXBiZXRoZGV2ICpsYXBiZXRoOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCisJZGV2X3JlbW92ZV9wYWNrKCZsYXBiZXRoX3BhY2tldF90eXBlKTsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbGFwYmV0aF9kZXZfbm90aWZpZXIpOworCisJcnRubF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsICZsYXBiZXRoX2RldmljZXMpIHsKKwkJbGFwYmV0aCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBsYXBiZXRoZGV2LCBub2RlKTsKKworCQl1bnJlZ2lzdGVyX25ldGRldmljZShsYXBiZXRoLT5heGRldik7CisJfQorCXJ0bmxfdW5sb2NrKCk7Cit9Cittb2R1bGVfZXhpdChsYXBiZXRoX2NsZWFudXBfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSm9uYXRoYW4gTmF5bG9yIDxnNGtseEBnNGtseC5kZW1vbi5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGhlIHVub2ZmaWNpYWwgTEFQQiBvdmVyIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiZGNmZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvTWFrZWZpbGUKQEAgLTAsMCArMSwxNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExhbiBNZWRpYSAyMTE0MCBiYXNlZCBXQU4gY2FyZHMKKyMgU3BlY2lmaWNhbGx5IHRoZSAxMDAwLDEyMDAsNTIwMCw1MjQ1CisjCisKK29iai0kKENPTkZJR19MQU5NRURJQSkgKz0gbG1jLm8KKworbG1jLW9ianMgOj0gbG1jX2RlYnVnLm8gbG1jX21lZGlhLm8gbG1jX21haW4ubyBsbWNfcHJvdG8ubworCisjIExpa2UgYWJvdmUgZXhjZXB0IGV2ZXJ5IHBhY2tldCBnZXRzIGVjaG9lZCB0byBLRVJOX0RFQlVHCisjIGluIGhleAorIworIyBEQkRFRiA9IFwKKyMgLURERUJVRyBcCisjIC1ETE1DX1BBQ0tFVF9MT0cKKworRVhUUkFfQ0ZMQUdTICs9IC1JLiAkKERCR0RFRikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jLmggYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmU1OGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtYy5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgX0xNQ19IXworI2RlZmluZSBfTE1DX0hfCisKKyNpbmNsdWRlICJsbWNfdmFyLmgiCisKKy8qCisgKiBwcm90b3R5cGVzIGZvciBldmVyeW9uZQorICovCitpbnQgbG1jX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KTsKK3Vuc2lnbmVkIGxtY19taWlfcmVhZHJlZyhsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCB1bnNpZ25lZAorICAgICAgCQkJICBkZXZhZGRyLCB1bnNpZ25lZCByZWdubyk7Cit2b2lkIGxtY19taWlfd3JpdGVyZWcobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgdW5zaWduZWQgZGV2YWRkciwKKwkJCSAgICAgICB1bnNpZ25lZCByZWdubywgdW5zaWduZWQgZGF0YSk7Cit2b2lkIGxtY19sZWRfb24obG1jX3NvZnRjX3QgKiBjb25zdCwgdV9pbnQzMl90KTsKK3ZvaWQgbG1jX2xlZF9vZmYobG1jX3NvZnRjX3QgKiBjb25zdCwgdV9pbnQzMl90KTsKK3Vuc2lnbmVkIGxtY19taWlfcmVhZHJlZyhsbWNfc29mdGNfdCAqIGNvbnN0LCB1bnNpZ25lZCwgdW5zaWduZWQpOwordm9pZCBsbWNfbWlpX3dyaXRlcmVnKGxtY19zb2Z0Y190ICogY29uc3QsIHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQpOwordm9pZCBsbWNfZ3Bpb19ta2lucHV0KGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIHVfaW50MzJfdCBiaXRzKTsKK3ZvaWQgbG1jX2dwaW9fbWtvdXRwdXQobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgdV9pbnQzMl90IGJpdHMpOworCitpbnQgbG1jX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKKworZXh0ZXJuIGxtY19tZWRpYV90IGxtY19kczNfbWVkaWE7CitleHRlcm4gbG1jX21lZGlhX3QgbG1jX3NzaV9tZWRpYTsKK2V4dGVybiBsbWNfbWVkaWFfdCBsbWNfdDFfbWVkaWE7CitleHRlcm4gbG1jX21lZGlhX3QgbG1jX2hzc2lfbWVkaWE7CisKKyNpZmRlZiBfREJHX0VWRU5UTE9HCitzdGF0aWMgdm9pZCBsbWNFdmVudExvZyggdV9pbnQzMl90IEV2ZW50TnVtLCB1X2ludDMyX3QgYXJnMiwgdV9pbnQzMl90IGFyZzMgKTsKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfZGVidWcuYyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjY2Q5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX2RlYnVnLmMKQEAgLTAsMCArMSw4NSBAQAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgImxtY19kZWJ1Zy5oIgorCisvKgorICogUHJpbnRzIG91dCBsZW4sIG1heCB0byA4MCBvY3RldHMgdXNpbmcgcHJpbnRrLCAyMCBwZXIgbGluZQorICovCit2b2lkIGxtY0NvbnNvbGVMb2coY2hhciAqdHlwZSwgdW5zaWduZWQgY2hhciAqdWNEYXRhLCBpbnQgaUxlbikKK3sKKyNpZmRlZiBERUJVRworI2lmZGVmIExNQ19QQUNLRVRfTE9HCisgIGludCBpTmV3TGluZSA9IDE7CisgIGNoYXIgc3RyWzgwXSwgKnBzdHI7CisgIAorICBzcHJpbnRmKHN0ciwgS0VSTl9ERUJVRyAibG1jOiAlczogIiwgdHlwZSk7CisgIHBzdHIgPSBzdHIrc3RybGVuKHN0cik7CisgIAorICBpZihpTGVuID4gMjQwKXsKKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICJsbWM6IFByaW50aW5nIDI0MCBjaGFycy4uLiBvdXQgb2Y6ICVkXG4iLCBpTGVuKTsKKyAgICBpTGVuID0gMjQwOworICB9CisgIGVsc2V7CisgICAgICBwcmludGsoS0VSTl9ERUJVRyAibG1jOiBQcmludGluZyAlZCBjaGFyc1xuIiwgaUxlbik7CisgIH0KKworICB3aGlsZShpTGVuID4gMCkgCisgICAgeworICAgICAgc3ByaW50Zihwc3RyLCAiJTAyeCAiLCAqdWNEYXRhKTsKKyAgICAgIHBzdHIrPTM7CisgICAgICB1Y0RhdGErKzsKKyAgICAgIGlmKCAhKGlOZXdMaW5lICUgMjApKQorCXsKKwkgIHNwcmludGYocHN0ciwgIlxuIik7CisJICBwcmludGsoc3RyKTsKKwkgIHNwcmludGYoc3RyLCBLRVJOX0RFQlVHICJsbWM6ICVzOiAiLCB0eXBlKTsKKwkgIHBzdHI9c3RyK3N0cmxlbihzdHIpOworCX0KKyAgICAgIGlOZXdMaW5lKys7CisgICAgICBpTGVuLS07CisgICAgfQorICBzcHJpbnRmKHBzdHIsICJcbiIpOworICBwcmludGsoc3RyKTsKKyNlbmRpZgorI2VuZGlmCit9CisKKyNpZmRlZiBERUJVRwordV9pbnQzMl90IGxtY0V2ZW50TG9nSW5kZXggPSAwOwordV9pbnQzMl90IGxtY0V2ZW50TG9nQnVmW0xNQ19FVkVOVExPR1NJWkUgKiBMTUNfRVZFTlRMT0dBUkdTXTsKKyNlbmRpZgorCit2b2lkIGxtY0V2ZW50TG9nICh1X2ludDMyX3QgRXZlbnROdW0sIHVfaW50MzJfdCBhcmcyLCB1X2ludDMyX3QgYXJnMykKK3sKKyNpZmRlZiBERUJVRworICBsbWNFdmVudExvZ0J1ZltsbWNFdmVudExvZ0luZGV4KytdID0gRXZlbnROdW07CisgIGxtY0V2ZW50TG9nQnVmW2xtY0V2ZW50TG9nSW5kZXgrK10gPSBhcmcyOworICBsbWNFdmVudExvZ0J1ZltsbWNFdmVudExvZ0luZGV4KytdID0gYXJnMzsKKyAgbG1jRXZlbnRMb2dCdWZbbG1jRXZlbnRMb2dJbmRleCsrXSA9IGppZmZpZXM7CisKKyAgbG1jRXZlbnRMb2dJbmRleCAmPSAoTE1DX0VWRU5UTE9HU0laRSAqIExNQ19FVkVOVExPR0FSR1MpIC0gMTsKKyNlbmRpZgorfQorCit2b2lkIGxtY190cmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICptc2cpeworI2lmZGVmIExNQ19UUkFDRQorICAgIHVuc2lnbmVkIGxvbmcgaiA9IGppZmZpZXMgKyAzOyAvKiBXYWl0IGZvciA1MCBtcyAqLworCisgICAgaWYoaW5faW50ZXJydXB0KCkpeworICAgICAgICBwcmludGsoIiVzOiAqICVzXG4iLCBkZXYtPm5hbWUsIG1zZyk7CisvLyAgICAgICAgd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgaisxMCkpCisvLyAgICAgICAgICAgIDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByaW50aygiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIG1zZyk7CisgICAgICAgIHdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIGopKQorICAgICAgICAgICAgc2NoZWR1bGUoKTsKKyAgICB9CisjZW5kaWYKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZW5kIGlmX2xtY19saW51eC5jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfZGVidWcuaCBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YzNTYzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX2RlYnVnLmgKQEAgLTAsMCArMSw1MiBAQAorI2lmbmRlZiBfTE1DX0RFQlVHX0hfCisjZGVmaW5lIF9MTUNfREVCVUdfSF8KKworI2lmZGVmIERFQlVHCisjaWZkZWYgTE1DX1BBQ0tFVF9MT0cKKyNkZWZpbmUgTE1DX0NPTlNPTEVfTE9HKHgseSx6KSBsbWNDb25zb2xlTG9nKCh4KSwgKHkpLCAoeikpCisjZWxzZQorI2RlZmluZSBMTUNfQ09OU09MRV9MT0coeCx5LHopCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIExNQ19DT05TT0xFX0xPRyh4LHkseikKKyNlbmRpZgorCisKKworLyogRGVidWcgLS0tIEV2ZW50IGxvZyBkZWZpbml0aW9ucyAtLS0gKi8KKy8qIEVWRU5UTE9HU0laRSpFVkVOVExPR0FSR1MgbmVlZHMgdG8gYmUgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIExNQ19FVkVOVExPR1NJWkUgMTAyNAkvKiBudW1iZXIgb2YgZXZlbnRzIGluIGV2ZW50bG9nICovCisjZGVmaW5lIExNQ19FVkVOVExPR0FSR1MgNAkJLyogbnVtYmVyIG9mIGFyZ3MgZm9yIGVhY2ggZXZlbnQgKi8KKworLyogZXZlbnQgaW5kaWNhdG9ycyAqLworI2RlZmluZSBMTUNfRVZFTlRfWE1UICAgICAgICAgICAxCisjZGVmaW5lIExNQ19FVkVOVF9YTVRFTkQgICAgICAgIDIKKyNkZWZpbmUgTE1DX0VWRU5UX1hNVElOVCAgICAgICAgMworI2RlZmluZSBMTUNfRVZFTlRfUkNWSU5UICAgICAgICA0CisjZGVmaW5lIExNQ19FVkVOVF9SQ1ZFTkQgICAgICAgIDUKKyNkZWZpbmUgTE1DX0VWRU5UX0lOVCAgICAgICAgICAgNgorI2RlZmluZSBMTUNfRVZFTlRfWE1USU5UVE1PICAgICA3CisjZGVmaW5lIExNQ19FVkVOVF9YTVRQUkNUTU8gICAgIDgKKyNkZWZpbmUgTE1DX0VWRU5UX0lOVEVORCAgICAgICAgOQorI2RlZmluZSBMTUNfRVZFTlRfUkVTRVQxICAgICAgIDEwCisjZGVmaW5lIExNQ19FVkVOVF9SRVNFVDIgICAgICAgMTEKKyNkZWZpbmUgTE1DX0VWRU5UX0ZPUkNFRFJFU0VUICAxMgorI2RlZmluZSBMTUNfRVZFTlRfV0FUQ0hET0cgICAgIDEzCisjZGVmaW5lIExNQ19FVkVOVF9CQURQS1RTVVJHRSAgMTQKKyNkZWZpbmUgTE1DX0VWRU5UX1RCVVNZMCAgICAgICAxNQorI2RlZmluZSBMTUNfRVZFTlRfVEJVU1kxICAgICAgIDE2CisKKworI2lmZGVmIERFQlVHCitleHRlcm4gdV9pbnQzMl90IGxtY0V2ZW50TG9nSW5kZXg7CitleHRlcm4gdV9pbnQzMl90IGxtY0V2ZW50TG9nQnVmW0xNQ19FVkVOVExPR1NJWkUgKiBMTUNfRVZFTlRMT0dBUkdTXTsKKyNkZWZpbmUgTE1DX0VWRU5UX0xPRyh4LCB5LCB6KSBsbWNFdmVudExvZygoeCksICh5KSwgKHopKQorI2Vsc2UKKyNkZWZpbmUgTE1DX0VWRU5UX0xPRyh4LHkseikKKyNlbmRpZiAvKiBlbmQgaWZkZWYgX0RCR19FVkVOVExPRyAqLworCit2b2lkIGxtY0NvbnNvbGVMb2coY2hhciAqdHlwZSwgdW5zaWduZWQgY2hhciAqdWNEYXRhLCBpbnQgaUxlbik7Cit2b2lkIGxtY0V2ZW50TG9nICh1X2ludDMyX3QgRXZlbnROdW0sIHVfaW50MzJfdCBhcmcyLCB1X2ludDMyX3QgYXJnMyk7Cit2b2lkIGxtY190cmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICptc2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX2lvY3RsLmggYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZGQ4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19pb2N0bC5oCkBAIC0wLDAgKzEsMjU3IEBACisjaWZuZGVmIF9MTUNfSU9DVExfSF8KKyNkZWZpbmUgX0xNQ19JT0NUTF9IXworLyoJJElkOiBsbWNfaW9jdGwuaCx2IDEuMTUgMjAwMC8wNC8wNiAxMjoxNjo0MyBhc2ogRXhwICQJKi8KKworIC8qCisgICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDAgTEFOIE1lZGlhIENvcnBvcmF0aW9uIChMTUMpCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gIHd3dy5sYW5tZWRpYS5jb20KKyAgKgorICAqIFRoaXMgY29kZSBpcyB3cml0dGVuIGJ5OgorICAqIEFuZHJldyBTdGFubGV5LUpvbmVzIChhc2pAY2Jhbi5jb20pCisgICogUm9iIEJyYXVuIChiYnJhdW5Adml4LmNvbSksCisgICogTWljaGFlbCBHcmFmZiAoZXhwbG9yZXJAdml4LmNvbSkgYW5kCisgICogTWF0dCBUaG9tYXMgKG1hdHRAM2FtLXNvZnR3YXJlLmNvbSkuCisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgICovCisKKyNkZWZpbmUgTE1DSU9DR0lORk8gICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMyAvKiBnZXQgY3VycmVudCBzdGF0ZSAqLworI2RlZmluZSBMTUNJT0NTSU5GTyAgICAgICAgICAgICBTSU9DREVWUFJJVkFURSs0IC8qIHNldCBzdGF0ZSB0byB1c2VyIHZhbHVlcyAqLworI2RlZmluZSBMTUNJT0NHRVRMTUNTVEFUUyAgICAgICBTSU9DREVWUFJJVkFURSs1CisjZGVmaW5lIExNQ0lPQ0NMRUFSTE1DU1RBVFMgICAgIFNJT0NERVZQUklWQVRFKzYKKyNkZWZpbmUgTE1DSU9DRFVNUEVWRU5UTE9HICAgICAgU0lPQ0RFVlBSSVZBVEUrNworI2RlZmluZSBMTUNJT0NHRVRYSU5GTyAgICAgICAgICBTSU9DREVWUFJJVkFURSs4CisjZGVmaW5lIExNQ0lPQ1NFVENJUkNVSVQgICAgICAgIFNJT0NERVZQUklWQVRFKzkKKyNkZWZpbmUgTE1DSU9DVU5VU0VEQVRNICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMTAKKyNkZWZpbmUgTE1DSU9DUkVTRVQgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMTEKKyNkZWZpbmUgTE1DSU9DVDFDT05UUk9MICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMTIKKyNkZWZpbmUgTE1DSU9DSUZUWVBFICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMTMKKyNkZWZpbmUgTE1DSU9DWElMSU5YICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMTQKKworI2RlZmluZSBMTUNfQ0FSRFRZUEVfVU5LTk9XTiAgICAgICAgICAgIC0xCisjZGVmaW5lIExNQ19DQVJEVFlQRV9IU1NJICAgICAgICAgICAgICAgMSAgICAgICAvKiBwcm9iZWQgY2FyZCBpcyBhIEhTU0kgY2FyZCAqLworI2RlZmluZSBMTUNfQ0FSRFRZUEVfRFMzICAgICAgICAgICAgICAgIDIgICAgICAgLyogcHJvYmVkIGNhcmQgaXMgYSBEUzMgY2FyZCAqLworI2RlZmluZSBMTUNfQ0FSRFRZUEVfU1NJICAgICAgICAgICAgICAgIDMgICAgICAgLyogcHJvYmVkIGNhcmQgaXMgYSBTU0kgY2FyZCAqLworI2RlZmluZSBMTUNfQ0FSRFRZUEVfVDEgICAgICAgICAgICAgICAgIDQgICAgICAgLyogcHJvYmVkIGNhcmQgaXMgYSBUMSBjYXJkICovCisKKyNkZWZpbmUgTE1DX0NUTF9DQVJEVFlQRV9MTUM1MjAwCTAJLyogSFNTSSAqLworI2RlZmluZSBMTUNfQ1RMX0NBUkRUWVBFX0xNQzUyNDUJMQkvKiBEUzMgKi8KKyNkZWZpbmUgTE1DX0NUTF9DQVJEVFlQRV9MTUMxMDAwCTIJLyogU1NJLCBWLjM1ICovCisjZGVmaW5lIExNQ19DVExfQ0FSRFRZUEVfTE1DMTIwMCAgICAgICAgMyAgICAgICAvKiBEUzEgKi8KKworI2RlZmluZSBMTUNfQ1RMX09GRgkJCTAJLyogZ2VuZXJpYyBPRkYgdmFsdWUgKi8KKyNkZWZpbmUgTE1DX0NUTF9PTgkJCTEJLyogZ2VuZXJpYyBPTiB2YWx1ZSAqLworCisjZGVmaW5lIExNQ19DVExfQ0xPQ0tfU09VUkNFX0VYVAkwCS8qIGNsb2NrIG9mZiBsaW5lICovCisjZGVmaW5lIExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVAkxCS8qIGludGVybmFsIGNsb2NrICovCisKKyNkZWZpbmUgTE1DX0NUTF9DUkNfTEVOR1RIXzE2CQkxNgorI2RlZmluZSBMTUNfQ1RMX0NSQ19MRU5HVEhfMzIJCTMyCisjZGVmaW5lIExNQ19DVExfQ1JDX0JZVEVTSVpFXzIgICAgICAgICAgMgorI2RlZmluZSBMTUNfQ1RMX0NSQ19CWVRFU0laRV80ICAgICAgICAgIDQKKworCisjZGVmaW5lIExNQ19DVExfQ0FCTEVfTEVOR1RIX0xUXzEwMEZUCTAJLyogRFMzIGNhYmxlIDwgMTAwIGZlZXQgKi8KKyNkZWZpbmUgTE1DX0NUTF9DQUJMRV9MRU5HVEhfR1RfMTAwRlQJMQkvKiBEUzMgY2FibGUgPj0gMTAwIGZlZXQgKi8KKworI2RlZmluZSBMTUNfQ1RMX0NJUkNVSVRfVFlQRV9FMSAwCisjZGVmaW5lIExNQ19DVExfQ0lSQ1VJVF9UWVBFX1QxIDEKKworLyoKKyAqIElGVFlQRSBkZWZpbmVzCisgKi8KKyNkZWZpbmUgTE1DX1BQUCAgICAgICAgIDEgICAgICAgICAgICAgICAvKiB1c2Ugc3BwcCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgTE1DX05FVCAgICAgICAgIDIgICAgICAgICAgICAgICAvKiB1c2UgZGlyZWN0IG5ldCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgTE1DX1JBVyAgICAgICAgIDMgICAgICAgICAgICAgICAvKiB1c2UgZGlyZWN0IG5ldCBpbnRlcmZhY2UgKi8KKworLyoKKyAqIFRoZXNlIGFyZSBub3QgaW4gdGhlIGxlYXN0IElPQ1RMIHJlbGF0ZWQsIGJ1dCBJIHdhbnQgdGhlbSBjb21tb24uCisgKi8KKy8qCisgKiBhc3NpZ25tZW50cyBmb3IgdGhlIEdQSU8gcmVnaXN0ZXIgb24gdGhlIERFQyBjaGlwIChjb21tb24pCisgKi8KKyNkZWZpbmUgTE1DX0dFUF9JTklUCQkweDAxIC8qIDA6ICovCisjZGVmaW5lIExNQ19HRVBfUkVTRVQJCTB4MDIgLyogMTogKi8KKyNkZWZpbmUgTE1DX0dFUF9NT0RFCQkweDEwIC8qIDQ6ICovCisjZGVmaW5lIExNQ19HRVBfRFAJCTB4MjAgLyogNTogKi8KKyNkZWZpbmUgTE1DX0dFUF9EQVRBCQkweDQwIC8qIDY6IHNlcmlhbCBvdXQgKi8KKyNkZWZpbmUgTE1DX0dFUF9DTEsJICAgICAgICAweDgwIC8qIDc6IHNlcmlhbCBjbG9jayAqLworCisvKgorICogSFNTSSBHUElPIGFzc2lnbm1lbnRzCisgKi8KKyNkZWZpbmUgTE1DX0dFUF9IU1NJX1NUCQkweDA0IC8qIDI6IHJlY2VpdmUgdGltaW5nIHNlbnNlIChkZXByZWNhdGVkKSAqLworI2RlZmluZSBMTUNfR0VQX0hTU0lfQ0xPQ0sJMHgwOCAvKiAzOiBjbG9jayBzb3VyY2UgKi8KKworLyoKKyAqIFQxIEdQSU8gYXNzaWdubWVudHMKKyAqLworI2RlZmluZSBMTUNfR0VQX1NTSV9HRU5FUkFUT1IJMHgwNCAvKiAyOiBlbmFibGUgcHJvZyBmcmVxIGdlbiBzZXJpYWwgaS9mICovCisjZGVmaW5lIExNQ19HRVBfU1NJX1RYQ0xPQ0sJMHgwOCAvKiAzOiBwcm92aWRlIGNsb2NrIG9uIFRYQ0xPQ0sgb3V0cHV0ICovCisKKy8qCisgKiBDb21tb24gTUlJMTYgYml0cworICovCisjZGVmaW5lIExNQ19NSUkxNl9MRUQwICAgICAgICAgMHgwMDgwCisjZGVmaW5lIExNQ19NSUkxNl9MRUQxICAgICAgICAgMHgwMTAwCisjZGVmaW5lIExNQ19NSUkxNl9MRUQyICAgICAgICAgMHgwMjAwCisjZGVmaW5lIExNQ19NSUkxNl9MRUQzICAgICAgICAgMHgwNDAwICAvKiBFcnJvciwgYW5kIHRoZSByZWQgb25lICovCisjZGVmaW5lIExNQ19NSUkxNl9MRURfQUxMICAgICAgMHgwNzgwICAvKiBMRUQgYml0IG1hc2sgKi8KKyNkZWZpbmUgTE1DX01JSTE2X0ZJRk9fUkVTRVQgICAweDA4MDAKKworLyoKKyAqIGRlZmluaXRpb25zIGZvciBIU1NJCisgKi8KKyNkZWZpbmUgTE1DX01JSTE2X0hTU0lfVEEgICAgICAweDAwMDEKKyNkZWZpbmUgTE1DX01JSTE2X0hTU0lfQ0EgICAgICAweDAwMDIKKyNkZWZpbmUgTE1DX01JSTE2X0hTU0lfTEEgICAgICAweDAwMDQKKyNkZWZpbmUgTE1DX01JSTE2X0hTU0lfTEIgICAgICAweDAwMDgKKyNkZWZpbmUgTE1DX01JSTE2X0hTU0lfTEMgICAgICAweDAwMTAKKyNkZWZpbmUgTE1DX01JSTE2X0hTU0lfVE0gICAgICAweDAwMjAKKyNkZWZpbmUgTE1DX01JSTE2X0hTU0lfQ1JDICAgICAweDAwNDAKKworLyoKKyAqIGFzc2lnbm1lbnRzIGZvciB0aGUgTUlJIHJlZ2lzdGVyIDE2IChEUzMpCisgKi8KKyNkZWZpbmUgTE1DX01JSTE2X0RTM19aRVJPCTB4MDAwMQorI2RlZmluZSBMTUNfTUlJMTZfRFMzX1RSTEJLCTB4MDAwMgorI2RlZmluZSBMTUNfTUlJMTZfRFMzX0xOTEJLCTB4MDAwNAorI2RlZmluZSBMTUNfTUlJMTZfRFMzX1JBSVMJMHgwMDA4CisjZGVmaW5lIExNQ19NSUkxNl9EUzNfVEFJUwkweDAwMTAKKyNkZWZpbmUgTE1DX01JSTE2X0RTM19CSVNUCTB4MDAyMAorI2RlZmluZSBMTUNfTUlJMTZfRFMzX0RMT1MJMHgwMDQwCisjZGVmaW5lIExNQ19NSUkxNl9EUzNfQ1JDCTB4MTAwMAorI2RlZmluZSBMTUNfTUlJMTZfRFMzX1NDUkFNCTB4MjAwMAorI2RlZmluZSBMTUNfTUlJMTZfRFMzX1NDUkFNX0xBUlMgMHg0MDAwCisKKy8qIE5vdGU6IDIgcGFpcnMgb2YgTEVEcyB3aGVyZSBzd2FwcGVkIGJ5IG1pc3Rha2UKKyAqIGluIFhpbGlueCBjb2RlIGZvciBEUzMgJiBEUzEgYWRhcHRlcnMgKi8KKyNkZWZpbmUgTE1DX0RTM19MRUQwICAgIDB4MDEwMCAgICAgICAgICAvKiBiaXQgMDggIHllbGxvdyAqLworI2RlZmluZSBMTUNfRFMzX0xFRDEgICAgMHgwMDgwICAgICAgICAgIC8qIGJpdCAwNyAgYmx1ZSAgICovCisjZGVmaW5lIExNQ19EUzNfTEVEMiAgICAweDA0MDAgICAgICAgICAgLyogYml0IDEwICBncmVlbiAgKi8KKyNkZWZpbmUgTE1DX0RTM19MRUQzICAgIDB4MDIwMCAgICAgICAgICAvKiBiaXQgMDkgIHJlZCAgICAqLworCisvKgorICogZnJhbWVyIHJlZ2lzdGVyIDAgYW5kIDcgKDcgaXMgbGF0Y2hlZCBhbmQgcmVzZXQgb24gcmVhZCkKKyAqLworI2RlZmluZSBMTUNfRlJBTUVSX1JFRzBfRExPUyAgICAgICAgICAgIDB4ODAgICAgLyogZGlnaXRhbCBsb3NzIG9mIHNlcnZpY2UgKi8KKyNkZWZpbmUgTE1DX0ZSQU1FUl9SRUcwX09PRlMgICAgICAgICAgICAweDQwICAgIC8qIG91dCBvZiBmcmFtZSBzeW5jICovCisjZGVmaW5lIExNQ19GUkFNRVJfUkVHMF9BSVMgICAgICAgICAgICAgMHgyMCAgICAvKiBhbGFybSBpbmRpY2F0aW9uIHNpZ25hbCAqLworI2RlZmluZSBMTUNfRlJBTUVSX1JFRzBfQ0lTICAgICAgICAgICAgIDB4MTAgICAgLyogY2hhbm5lbCBpZGxlICovCisjZGVmaW5lIExNQ19GUkFNRVJfUkVHMF9MT0MgICAgICAgICAgICAgMHgwOCAgICAvKiBsb3NzIG9mIGNsb2NrICovCisKKy8qCisgKiBGcmFtZXIgcmVnaXN0ZXIgOSBjb250YWlucyB0aGUgYmx1ZSBhbGFybSBzaWduYWwKKyAqLworI2RlZmluZSBMTUNfRlJBTUVSX1JFRzlfUkJMVUUgICAgICAgICAgMHgwMiAgICAgLyogQmx1ZSBhbGFybSBmYWlsdXJlICovCisKKy8qCisgKiBGcmFtZXIgcmVnaXN0ZXIgMHgxMCBjb250YWlucyB4Yml0IGVycm9yCisgKi8KKyNkZWZpbmUgTE1DX0ZSQU1FUl9SRUcxMF9YQklUICAgICAgICAgIDB4MDEgICAgIC8qIFggYml0IGVycm9yIGFsYXJtIGZhaWx1cmUgKi8KKworLyoKKyAqIEFuZCBTU0ksIExNQzEwMDAKKyAqLworI2RlZmluZSBMTUNfTUlJMTZfU1NJX0RUUgkweDAwMDEJLyogRFRSIG91dHB1dCBSVyAqLworI2RlZmluZSBMTUNfTUlJMTZfU1NJX0RTUgkweDAwMDIJLyogRFNSIGlucHV0IFJPICovCisjZGVmaW5lIExNQ19NSUkxNl9TU0lfUlRTCTB4MDAwNAkvKiBSVFMgb3V0cHV0IFJXICovCisjZGVmaW5lIExNQ19NSUkxNl9TU0lfQ1RTCTB4MDAwOAkvKiBDVFMgaW5wdXQgUk8gKi8KKyNkZWZpbmUgTE1DX01JSTE2X1NTSV9EQ0QJMHgwMDEwCS8qIERDRCBpbnB1dCBSTyAqLworI2RlZmluZSBMTUNfTUlJMTZfU1NJX1JJCQkweDAwMjAJLyogUkkgaW5wdXQgUk8gKi8KKyNkZWZpbmUgTE1DX01JSTE2X1NTSV9DUkMgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBDUkMgc2VsZWN0IC0gUlcgKi8KKworLyoKKyAqIGJpdHMgMHgwMDgwIHRocm91Z2ggMHgwODAwIGFyZSBnZW5lcmljLCBhbmQgZGVzY3JpYmVkCisgKiBhYm92ZSB3aXRoIExNQ19NSUkxNl9MRURbMDEyM10gX0xFRF9BTEwsIGFuZCBfRklGT19SRVNFVAorICovCisjZGVmaW5lIExNQ19NSUkxNl9TU0lfTEwJCTB4MTAwMAkvKiBMTCBvdXRwdXQgUlcgKi8KKyNkZWZpbmUgTE1DX01JSTE2X1NTSV9STAkJMHgyMDAwCS8qIFJMIG91dHB1dCBSVyAqLworI2RlZmluZSBMTUNfTUlJMTZfU1NJX1RNCQkweDQwMDAJLyogVE0gaW5wdXQgUk8gKi8KKyNkZWZpbmUgTE1DX01JSTE2X1NTSV9MT09QCTB4ODAwMAkvKiBsb29wYmFjayBlbmFibGUgUlcgKi8KKworLyoKKyAqIFNvbWUgb2YgdGhlIE1JSTE2IGJpdHMgYXJlIG1pcnJvcmVkIGluIHRoZSBNSUkxNyByZWdpc3RlciBhcyB3ZWxsLAorICogYnV0IGxldCdzIGtlZXAgdGhpbmcgc2VwYXJhdGUgZm9yIG5vdywgYW5kIGdldCBvbmx5IHRoZSBjYWJsZSBmcm9tCisgKiB0aGUgTUlJMTcuCisgKi8KKyNkZWZpbmUgTE1DX01JSTE3X1NTSV9DQUJMRV9NQVNLCTB4MDAzOAkvKiBtYXNrIHRvIGV4dHJhY3QgdGhlIGNhYmxlIHR5cGUgKi8KKyNkZWZpbmUgTE1DX01JSTE3X1NTSV9DQUJMRV9TSElGVCAzCS8qIHNoaWZ0IHRvIGV4dHJhY3QgdGhlIGNhYmxlIHR5cGUgKi8KKworLyoKKyAqIEFuZCBUMSwgTE1DMTIwMAorICovCisjZGVmaW5lIExNQ19NSUkxNl9UMV9VTlVTRUQxICAgIDB4MDAwMworI2RlZmluZSBMTUNfTUlJMTZfVDFfWE9FICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBMTUNfTUlJMTZfVDFfUlNUICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogVDEgY2hpcCByZXNldCAtIFJXICovCisjZGVmaW5lIExNQ19NSUkxNl9UMV9aICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBvdXRwdXQgaW1wZWRhbmNlIFQxPTEsIEUxPTAgb3V0cHV0IC0gUlcgKi8KKyNkZWZpbmUgTE1DX01JSTE2X1QxX0lOVFIgICAgICAgICAgICAgICAweDAwMjAgIC8qIGludGVycnVwdCBmcm9tIDgzNzAgLSBSTyAqLworI2RlZmluZSBMTUNfTUlJMTZfVDFfT05FU0VDICAgICAgICAgICAgIDB4MDA0MCAgLyogb25lIHNlY29uZCBzcXVhcmUgd2F2ZSAtIHJvICovCisKKyNkZWZpbmUgTE1DX01JSTE2X1QxX0xFRDAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgTE1DX01JSTE2X1QxX0xFRDEgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgTE1DX01JSTE2X1QxX0xFRDIgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgTE1DX01JSTE2X1QxX0xFRDMgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgTE1DX01JSTE2X1QxX0ZJRk9fUkVTRVQgMHgwODAwCisKKyNkZWZpbmUgTE1DX01JSTE2X1QxX0NSQyAgICAgICAgICAgICAgICAweDEwMDAgIC8qIENSQyBzZWxlY3QgLSBSVyAqLworI2RlZmluZSBMTUNfTUlJMTZfVDFfVU5VU0VEMiAgICAweGUwMDAKKworCisvKiA4MzcwIGZyYW1lciByZWdpc3RlcnMgICovCisKKyNkZWZpbmUgVDFGUkFNRVJfQUxBUk0xX1NUQVRVUyAgMHg0NworI2RlZmluZSBUMUZSQU1FUl9BTEFSTTJfU1RBVFVTICAweDQ4CisjZGVmaW5lIFQxRlJBTUVSX0ZFUlJfTFNCICAgICAgICAgICAgICAgMHg1MAorI2RlZmluZSBUMUZSQU1FUl9GRVJSX01TQiAgICAgICAgICAgICAgIDB4NTEgICAgLyogZnJhbWluZyBiaXQgZXJyb3IgY291bnRlciAqLworI2RlZmluZSBUMUZSQU1FUl9MQ1ZfTFNCICAgICAgICAgICAgICAgIDB4NTQKKyNkZWZpbmUgVDFGUkFNRVJfTENWX01TQiAgICAgICAgICAgICAgICAweDU1ICAgIC8qIGxpbmUgY29kZSB2aW9sYXRpb24gY291bnRlciAqLworI2RlZmluZSBUMUZSQU1FUl9BRVJSICAgICAgICAgICAgICAgICAgIDB4NUEKKworLyogbWFzayBmb3IgdGhlIGFib3ZlIEFFUlIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVDFGUkFNRVJfTE9GX01BU0sgICAgICAgICAgICAgICAoMHgwZjApIC8qIHJlY2VpdmUgbG9zcyBvZiBmcmFtZSAqLworI2RlZmluZSBUMUZSQU1FUl9DT0ZBX01BU0sgICAgICAgICAgICAgICgweDBjMCkgLyogY2hhbmdlIG9mIGZyYW1lIGFsaWdubWVudCAqLworI2RlZmluZSBUMUZSQU1FUl9TRUZfTUFTSyAgICAgICAgICAgICAgICgweDAzKSAgLyogc2V2ZXJlbHkgZXJyb3JlZCBmcmFtZSAgKi8KKworLyogODM3MCBmcmFtZXIgcmVnaXN0ZXIgQUxNMSAoMHg0NykgdmFsdWVzCisgKiB1c2VkIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cworICovCisKKyNkZWZpbmUgVDFGX1NJR0ZSWiAgICAgIDB4MDEgICAgLyogc2lnbmFsaW5nIGZyZWV6ZSAqLworI2RlZmluZSBUMUZfUkxPRiAgICAgICAgMHgwMiAgICAvKiByZWNlaXZlIGxvc3Mgb2YgZnJhbWUgYWxpZ25tZW50ICovCisjZGVmaW5lIFQxRl9STE9TICAgICAgICAweDA0ICAgIC8qIHJlY2VpdmUgbG9zcyBvZiBzaWduYWwgKi8KKyNkZWZpbmUgVDFGX1JBTE9TICAgICAgIDB4MDggICAgLyogcmVjZWl2ZSBhbmFsb2cgbG9zcyBvZiBzaWduYWwgb3IgUkNLSSBsb3NzIG9mIGNsb2NrICovCisjZGVmaW5lIFQxRl9SQUlTICAgICAgICAweDEwICAgIC8qIHJlY2VpdmUgYWxhcm0gaW5kaWNhdGlvbiBzaWduYWwgKi8KKyNkZWZpbmUgVDFGX1VOVVNFRCAgICAgIDB4MjAKKyNkZWZpbmUgVDFGX1JZRUwgICAgICAgIDB4NDAgICAgLyogcmVjZWl2ZSB5ZWxsb3cgYWxhcm0gKi8KKyNkZWZpbmUgVDFGX1JNWUVMICAgICAgIDB4ODAgICAgLyogcmVjZWl2ZSBtdWx0aWZyYW1lIHllbGxvdyBhbGFybSAqLworCisjZGVmaW5lIExNQ19UMUZfV1JJVEUgICAgICAgMAorI2RlZmluZSBMTUNfVDFGX1JFQUQgICAgICAgIDEKKwordHlwZWRlZiBzdHJ1Y3QgbG1jX3N0MWZfY29udHJvbCB7CisgIGludCBjb21tYW5kOworICBpbnQgYWRkcmVzczsKKyAgaW50IHZhbHVlOworICBjaGFyIF9fdXNlciAqZGF0YTsKK30gbG1jX3QxZl9jb250cm9sOworCitlbnVtIGxtY194aWxpbnhfYyB7CisgICAgbG1jX3hpbGlueF9yZXNldCA9IDEsCisgICAgbG1jX3hpbGlueF9sb2FkX3Byb20gPSAyLAorICAgIGxtY194aWxpbnhfbG9hZCA9IDMKK307CisKK3N0cnVjdCBsbWNfeGlsaW54X2NvbnRyb2wgeworICAgIGVudW0gbG1jX3hpbGlueF9jIGNvbW1hbmQ7CisgICAgaW50IGxlbjsKKyAgICBjaGFyIF9fdXNlciAqZGF0YTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBlbmQgVDEgZGVmcyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTE1DX01JSV9MZWRNYXNrICAgICAgICAgICAgICAgICAweDA3ODAKKyNkZWZpbmUgTE1DX01JSV9MZWRCaXRQb3MgICAgICAgICAgICAgICA3CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTU0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tYWluLmMKQEAgLTAsMCArMSwyMjAxIEBACisgLyoKKyAgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMCBMQU4gTWVkaWEgQ29ycG9yYXRpb24gKExNQykKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgd3d3Lmxhbm1lZGlhLmNvbQorICAqCisgICogVGhpcyBjb2RlIGlzIHdyaXR0ZW4gYnk6CisgICogQW5kcmV3IFN0YW5sZXktSm9uZXMgKGFzakBjYmFuLmNvbSkKKyAgKiBSb2IgQnJhdW4gKGJicmF1bkB2aXguY29tKSwKKyAgKiBNaWNoYWVsIEdyYWZmIChleHBsb3JlckB2aXguY29tKSBhbmQKKyAgKiBNYXR0IFRob21hcyAobWF0dEAzYW0tc29mdHdhcmUuY29tKS4KKyAgKgorICAqIFdpdGggSGVscCBCeToKKyAgKiBEYXZpZCBCb2dncworICAqIFJvbiBDcmFuZQorICAqIEFsYW4gQ294CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgICoKKyAgKiBEcml2ZXIgZm9yIHRoZSBMYW5NZWRpYSBMTUM1MjAwLCBMTUM1MjQ1LCBMTUMxMDAwLCBMTUMxMjAwIGNhcmRzLgorICAqCisgICogVG8gY29udHJvbCBsaW5rIHNwZWNpZmljIG9wdGlvbnMgbG1jY3RsIGlzIHJlcXVpcmVkLgorICAqIEl0IGNhbiBiZSBvYnRhaW5lZCBmcm9tIGZ0cC5sYW5tZWRpYS5jb20uCisgICoKKyAgKiBMaW51eCBkcml2ZXIgbm90ZXM6CisgICogTGludXggdXNlcyB0aGUgZGV2aWNlIHN0cnVjdCBsbWNfcHJpdmF0ZSB0byBwYXNzIHByaXZhdGUgaW5mb3JtYXRpb24KKyAgKiBhcnJvdW5kLgorICAqCisgICogVGhlIGluaXRpYWxpemF0aW9uIHBvcnRpb24gb2YgdGhpcyBkcml2ZXIgKHRoZSBsbWNfcmVzZXQoKSBhbmQgdGhlCisgICogbG1jX2RlY19yZXNldCgpIGZ1bmN0aW9ucywgYXMgd2VsbCBhcyB0aGUgbGVkIGNvbnRyb2xzIGFuZCB0aGUKKyAgKiBsbWNfaW5pdGNzcnMoKSBmdW5jdGlvbnMuCisgICoKKyAgKiBUaGUgd2F0Y2hkb2cgZnVuY3Rpb24gcnVucyBldmVyeSBzZWNvbmQgYW5kIGNoZWNrcyB0byBzZWUgaWYKKyAgKiB3ZSBzdGlsbCBoYXZlIGxpbmssIGFuZCB0aGF0IHRoZSB0aW1pbmcgc291cmNlIGlzIHdoYXQgd2UgZXhwZWN0ZWQKKyAgKiBpdCB0byBiZS4gIElmIGxpbmsgaXMgbG9zdCwgdGhlIGludGVyZmFjZSBpcyBtYXJrZWQgZG93biwgYW5kCisgICogd2Ugbm8gbG9uZ2VyIGNhbiB0cmFuc21pdC4KKyAgKgorICAqLworCisvKiAkSWQ6IGxtY19tYWluLmMsdiAxLjM2IDIwMDAvMDQvMTEgMDU6MjU6MjUgYXNqIEV4cCAkICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvc3luY3BwcC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPiAgICAgICAgICAgICAvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorLy8jaW5jbHVkZSA8YXNtL3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgRFJJVkVSX01BSk9SX1ZFUlNJT04gICAgIDEKKyNkZWZpbmUgRFJJVkVSX01JTk9SX1ZFUlNJT04gICAgMzQKKyNkZWZpbmUgRFJJVkVSX1NVQl9WRVJTSU9OICAgICAgIDAKKworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAgKChEUklWRVJfTUFKT1JfVkVSU0lPTiA8PCA4KSArIERSSVZFUl9NSU5PUl9WRVJTSU9OKQorCisjaW5jbHVkZSAibG1jLmgiCisjaW5jbHVkZSAibG1jX3Zhci5oIgorI2luY2x1ZGUgImxtY19pb2N0bC5oIgorI2luY2x1ZGUgImxtY19kZWJ1Zy5oIgorI2luY2x1ZGUgImxtY19wcm90by5oIgorCitzdGF0aWMgaW50IGxtY19maXJzdF9sb2FkID0gMDsKKworc3RhdGljIGludCBMTUNfUEtUX0JVRl9TWiA9IDE1NDI7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBsbWNfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX0ZBU1QsCisJICBQQ0lfVkVORE9SX0lEX0xNQywgUENJX0FOWV9JRCB9LAorCXsgUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX0ZBU1QsCisJICBQQ0lfQU5ZX0lELCBQQ0lfVkVORE9SX0lEX0xNQyB9LAorCXsgMCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbG1jX3BjaV90YmwpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKK3N0YXRpYyBpbnQgbG1jX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGxtY19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBsbWNfcnggKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBsbWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbG1jX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsbWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGxtY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBsbWNfaW5pdGNzcnMobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgbG1jX2NzcnB0cl90IGNzcl9iYXNlLCBzaXplX3QgY3NyX3NpemUpOworc3RhdGljIHZvaWQgbG1jX3NvZnRyZXNldChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY19ydW5uaW5nX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBsbWNfaWZkb3duKHN0cnVjdCBuZXRfZGV2aWNlICogY29uc3QpOworc3RhdGljIHZvaWQgbG1jX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBsbWNfcmVzZXQobG1jX3NvZnRjX3QgKiBjb25zdCBzYyk7CitzdGF0aWMgdm9pZCBsbWNfZGVjX3Jlc2V0KGxtY19zb2Z0Y190ICogY29uc3Qgc2MpOworc3RhdGljIHZvaWQgbG1jX2RyaXZlcl90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKgorICogbGludXggcmVzZXJ2ZXMgMTYgZGV2aWNlIHNwZWNpZmljIElPQ1RMcy4gIFdlIGNhbGwgdGhlbQorICogTE1DSU9DKiB0byBjb250cm9sIHZhcmlvdXMgYml0cyBvZiBvdXIgd29ybGQuCisgKi8KK2ludCBsbWNfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKSAvKmZvbGQwMCovCit7CisgICAgbG1jX3NvZnRjX3QgKnNjOworICAgIGxtY19jdGxfdCBjdGw7CisgICAgaW50IHJldDsKKyAgICB1X2ludDE2X3QgcmVnVmFsOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBzdHJ1Y3Qgc3BwcCAqc3A7CisKKyAgICByZXQgPSAtRU9QTk9UU1VQUDsKKworICAgIHNjID0gZGV2LT5wcml2OworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19pb2N0bCBpbiIpOworCisgICAgLyoKKyAgICAgKiBNb3N0IGZ1bmN0aW9ucyBtZXNzIHdpdGggdGhlIHN0cnVjdHVyZQorICAgICAqIERpc2FibGUgaW50ZXJydXB0cyB3aGlsZSB3ZSBkbyB0aGUgcG9sbGluZworICAgICAqLworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzYy0+bG1jX2xvY2ssIGZsYWdzKTsKKworICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFJldHVybiBjdXJyZW50IGRyaXZlciBzdGF0ZS4gIFNpbmNlIHdlIGtlZXAgdGhpcyB1cAorICAgICAgICAgKiBUbyBkYXRlIGludGVybmFsbHksIGp1c3QgY29weSB0aGlzIG91dCB0byB0aGUgdXNlci4KKyAgICAgICAgICovCisgICAgY2FzZSBMTUNJT0NHSU5GTzogLypmb2xkMDEqLworICAgICAgICBpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsICZzYy0+aWN0bCwgc2l6ZW9mIChsbWNfY3RsX3QpKSkKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICByZXQgPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTE1DSU9DU0lORk86IC8qZm9sZDAxKi8KKyAgICAgICAgc3AgPSAmKChzdHJ1Y3QgcHBwX2RldmljZSAqKSBkZXYpLT5zcHBwOworICAgICAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKyAgICAgICAgICAgIHJldCA9IC1FUEVSTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYoZGV2LT5mbGFncyAmIElGRl9VUCl7CisgICAgICAgICAgICByZXQgPSAtRUJVU1k7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmY3RsLCBpZnItPmlmcl9kYXRhLCBzaXplb2YgKGxtY19jdGxfdCkpKQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X3N0YXR1cyAoc2MsICZjdGwpOworCisgICAgICAgIGlmKGN0bC5jcmNfbGVuZ3RoICE9IHNjLT5pY3RsLmNyY19sZW5ndGgpIHsKKyAgICAgICAgICAgIHNjLT5sbWNfbWVkaWEtPnNldF9jcmNfbGVuZ3RoKHNjLCBjdGwuY3JjX2xlbmd0aCk7CisJICAgIGlmIChzYy0+aWN0bC5jcmNfbGVuZ3RoID09IExNQ19DVExfQ1JDX0xFTkdUSF8xNikKKwkJc2MtPlR4RGVzY3JpcHRDb250cm9sSW5pdCB8PSAgTE1DX1RERVNfQUREX0NSQ19ESVNBQkxFOworCSAgICBlbHNlCisJCXNjLT5UeERlc2NyaXB0Q29udHJvbEluaXQgJj0gfkxNQ19UREVTX0FERF9DUkNfRElTQUJMRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdGwua2VlcGFsaXZlX29ub2ZmID09IExNQ19DVExfT0ZGKQorICAgICAgICAgICAgc3AtPnBwX2ZsYWdzICY9IH5QUF9LRUVQQUxJVkU7CS8qIFR1cm4gb2ZmICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNwLT5wcF9mbGFncyB8PSBQUF9LRUVQQUxJVkU7CS8qIFR1cm4gb24gKi8KKworICAgICAgICByZXQgPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTE1DSU9DSUZUWVBFOiAvKmZvbGQwMSovCisgICAgICAgIHsKKyAgICAgICAgICAgIHVfaW50MTZfdAlvbGRfdHlwZSA9IHNjLT5pZl90eXBlOworICAgICAgICAgICAgdV9pbnQxNl90CW5ld190eXBlOworCisJICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQlyZXQgPSAtRVBFUk07CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfdHlwZSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKHVfaW50MTZfdCkpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCisgICAgICAgICAgICAKKwkgICAgaWYgKG5ld190eXBlID09IG9sZF90eXBlKQorCSAgICB7CisJCXJldCA9IDAgOworCQlicmVhazsJCQkJLyogbm8gY2hhbmdlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxtY19wcm90b19jbG9zZShzYyk7CisgICAgICAgICAgICBsbWNfcHJvdG9fZGV0YWNoKHNjKTsKKworICAgICAgICAgICAgc2MtPmlmX3R5cGUgPSBuZXdfdHlwZTsKKy8vICAgICAgICAgICAgbG1jX3Byb3RvX2luaXQoc2MpOworICAgICAgICAgICAgbG1jX3Byb3RvX2F0dGFjaChzYyk7CisgICAgICAgICAgICBsbWNfcHJvdG9fb3BlbihzYyk7CisKKwkgICAgcmV0ID0gMCA7CisJICAgIGJyZWFrIDsKKwl9CisKKyAgICBjYXNlIExNQ0lPQ0dFVFhJTkZPOiAvKmZvbGQwMSovCisgICAgICAgIHNjLT5sbWNfeGluZm8uTWFnaWMwID0gMHhCRUVGQ0FGRTsKKworICAgICAgICBzYy0+bG1jX3hpbmZvLlBjaUNhcmRUeXBlID0gc2MtPmxtY19jYXJkdHlwZTsKKyAgICAgICAgc2MtPmxtY194aW5mby5QY2lTbG90TnVtYmVyID0gMDsKKyAgICAgICAgc2MtPmxtY194aW5mby5Ecml2ZXJNYWpvclZlcnNpb24gPSBEUklWRVJfTUFKT1JfVkVSU0lPTjsKKyAgICAgICAgc2MtPmxtY194aW5mby5Ecml2ZXJNaW5vclZlcnNpb24gPSBEUklWRVJfTUlOT1JfVkVSU0lPTjsKKyAgICAgICAgc2MtPmxtY194aW5mby5Ecml2ZXJTdWJWZXJzaW9uID0gRFJJVkVSX1NVQl9WRVJTSU9OOworICAgICAgICBzYy0+bG1jX3hpbmZvLlhpbGlueFJldmlzaW9uTnVtYmVyID0KKyAgICAgICAgICAgIGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDMpICYgMHhmOworICAgICAgICBzYy0+bG1jX3hpbmZvLk1heEZyYW1lU2l6ZSA9IExNQ19QS1RfQlVGX1NaOworICAgICAgICBzYy0+bG1jX3hpbmZvLmxpbmtfc3RhdHVzID0gc2MtPmxtY19tZWRpYS0+Z2V0X2xpbmtfc3RhdHVzIChzYyk7CisgICAgICAgIHNjLT5sbWNfeGluZm8ubWlpX3JlZzE2ID0gbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTYpOworCisgICAgICAgIHNjLT5sbWNfeGluZm8uTWFnaWMxID0gMHhERUFEQkVFRjsKKworICAgICAgICBpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsICZzYy0+bG1jX3hpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGxtY194aW5mbykpKQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIHJldCA9IDA7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExNQ0lPQ0dFVExNQ1NUQVRTOiAvKmZvbGQwMSovCisgICAgICAgIGlmIChzYy0+bG1jX2NhcmR0eXBlID09IExNQ19DQVJEVFlQRV9UMSl7CisgICAgICAgICAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIFQxRlJBTUVSX0ZFUlJfTFNCKTsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5mcmFtaW5nQml0RXJyb3JDb3VudCArPQorICAgICAgICAgICAgICAgIGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE4KSAmIDB4ZmY7CisgICAgICAgICAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIFQxRlJBTUVSX0ZFUlJfTVNCKTsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5mcmFtaW5nQml0RXJyb3JDb3VudCArPQorICAgICAgICAgICAgICAgIChsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxOCkgJiAweGZmKSA8PCA4OworICAgICAgICAgICAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCBUMUZSQU1FUl9MQ1ZfTFNCKTsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5saW5lQ29kZVZpb2xhdGlvbkNvdW50ICs9CisgICAgICAgICAgICAgICAgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTgpICYgMHhmZjsKKyAgICAgICAgICAgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgVDFGUkFNRVJfTENWX01TQik7CisgICAgICAgICAgICBzYy0+c3RhdHMubGluZUNvZGVWaW9sYXRpb25Db3VudCArPQorICAgICAgICAgICAgICAgIChsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxOCkgJiAweGZmKSA8PCA4OworICAgICAgICAgICAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCBUMUZSQU1FUl9BRVJSKTsKKyAgICAgICAgICAgIHJlZ1ZhbCA9IGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE4KSAmIDB4ZmY7CisKKyAgICAgICAgICAgIHNjLT5zdGF0cy5sb3NzT2ZGcmFtZUNvdW50ICs9CisgICAgICAgICAgICAgICAgKHJlZ1ZhbCAmIFQxRlJBTUVSX0xPRl9NQVNLKSA+PiA0OworICAgICAgICAgICAgc2MtPnN0YXRzLmNoYW5nZU9mRnJhbWVBbGlnbm1lbnRDb3VudCArPQorICAgICAgICAgICAgICAgIChyZWdWYWwgJiBUMUZSQU1FUl9DT0ZBX01BU0spID4+IDI7CisgICAgICAgICAgICBzYy0+c3RhdHMuc2V2ZXJlbHlFcnJvcmVkRnJhbWVDb3VudCArPQorICAgICAgICAgICAgICAgIHJlZ1ZhbCAmIFQxRlJBTUVSX1NFRl9NQVNLOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmc2MtPnN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGxtY19zdGF0aXN0aWNzKSkpCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgICAgICByZXQgPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTE1DSU9DQ0xFQVJMTUNTVEFUUzogLypmb2xkMDEqLworICAgICAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpeworICAgICAgICAgICAgcmV0ID0gLUVQRVJNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQgKCZzYy0+c3RhdHMsIDAsIHNpemVvZiAoc3RydWN0IGxtY19zdGF0aXN0aWNzKSk7CisgICAgICAgIHNjLT5zdGF0cy5jaGVjayA9IFNUQVRDSEVDSzsKKyAgICAgICAgc2MtPnN0YXRzLnZlcnNpb25fc2l6ZSA9IChEUklWRVJfVkVSU0lPTiA8PCAxNikgKworICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgbG1jX3N0YXRpc3RpY3MpOworICAgICAgICBzYy0+c3RhdHMubG1jX2NhcmR0eXBlID0gc2MtPmxtY19jYXJkdHlwZTsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExNQ0lPQ1NFVENJUkNVSVQ6IC8qZm9sZDAxKi8KKyAgICAgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKXsKKyAgICAgICAgICAgIHJldCA9IC1FUEVSTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYoZGV2LT5mbGFncyAmIElGRl9VUCl7CisgICAgICAgICAgICByZXQgPSAtRUJVU1k7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmY3RsLCBpZnItPmlmcl9kYXRhLCBzaXplb2YgKGxtY19jdGxfdCkpKQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIHNjLT5sbWNfbWVkaWEtPnNldF9jaXJjdWl0X3R5cGUoc2MsIGN0bC5jaXJjdWl0X3R5cGUpOworICAgICAgICBzYy0+aWN0bC5jaXJjdWl0X3R5cGUgPSBjdGwuY2lyY3VpdF90eXBlOworICAgICAgICByZXQgPSAwOworCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTUNJT0NSRVNFVDogLypmb2xkMDEqLworICAgICAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpeworICAgICAgICAgICAgcmV0ID0gLUVQRVJNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZXNldCBkcml2ZXIgYW5kIGJyaW5nIGJhY2sgdG8gY3VycmVudCBzdGF0ZSAqLworICAgICAgICBwcmludGsgKCIgUkVHMTYgYmVmb3JlIHJlc2V0ICslMDR4XG4iLCBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNikpOworICAgICAgICBsbWNfcnVubmluZ19yZXNldCAoZGV2KTsKKyAgICAgICAgcHJpbnRrICgiIFJFRzE2IGFmdGVyIHJlc2V0ICslMDR4XG4iLCBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNikpOworCisgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX0ZPUkNFRFJFU0VULCBMTUNfQ1NSX1JFQUQgKHNjLCBjc3Jfc3RhdHVzKSwgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTYpKTsKKworICAgICAgICByZXQgPSAwOworICAgICAgICBicmVhazsKKworI2lmZGVmIERFQlVHCisgICAgY2FzZSBMTUNJT0NEVU1QRVZFTlRMT0c6CisgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJmxtY0V2ZW50TG9nSW5kZXgsIHNpemVvZiAodTMyKSkpCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhICsgc2l6ZW9mICh1MzIpLCBsbWNFdmVudExvZ0J1Ziwgc2l6ZW9mIChsbWNFdmVudExvZ0J1ZikpKQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogZW5kIGlmZGVmIF9EQkdfRVZFTlRMT0cgKi8KKyAgICBjYXNlIExNQ0lPQ1QxQ09OVFJPTDogLypmb2xkMDEqLworICAgICAgICBpZiAoc2MtPmxtY19jYXJkdHlwZSAhPSBMTUNfQ0FSRFRZUEVfVDEpeworICAgICAgICAgICAgcmV0ID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIExNQ0lPQ1hJTElOWDogLypmb2xkMDEqLworICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgbG1jX3hpbGlueF9jb250cm9sIHhjOyAvKmZvbGQwMiovCisKKyAgICAgICAgICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSl7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU3RvcCB0aGUgeHdpdHRlciB3aGxpZSB3ZSByZXN0YXJ0IHRoZSBoYXJkd2FyZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmeGMsIGlmci0+aWZyX2RhdGEsIHNpemVvZiAoc3RydWN0IGxtY194aWxpbnhfY29udHJvbCkpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgc3dpdGNoKHhjLmNvbW1hbmQpeworICAgICAgICAgICAgY2FzZSBsbWNfeGlsaW54X3Jlc2V0OiAvKmZvbGQwMiovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1MTYgbWlpOworICAgICAgICAgICAgICAgICAgICBtaWkgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNik7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogTWFrZSBhbGwgb2YgdGhlbSAwIGFuZCBtYWtlIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBsbWNfZ3Bpb19ta2lucHV0KHNjLCAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBtYWtlIHRoZSByZXNldCBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGxtY19ncGlvX21rb3V0cHV0KHNjLCBMTUNfR0VQX1JFU0VUKTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBSRVNFVCBsb3cgdG8gZm9yY2UgY29uZmlndXJhdGlvbi4gIFRoaXMgYWxzbyBmb3JjZXMKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIHRyYW5zbWl0dGVyIGNsb2NrIHRvIGJlIGludGVybmFsLCBidXQgd2UgZXhwZWN0IHRvIHJlc2V0CisgICAgICAgICAgICAgICAgICAgICAqIHRoYXQgbGF0ZXIgYW55d2F5LgorICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX2dwaW8gJj0gfkxNQ19HRVBfUkVTRVQ7CisgICAgICAgICAgICAgICAgICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIGhvbGQgZm9yIG1vcmUgdGhhbiAxMCBtaWNyb3NlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHVkZWxheSg1MCk7CisKKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvIHw9IExNQ19HRVBfUkVTRVQ7CisgICAgICAgICAgICAgICAgICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIHN0b3AgZHJpdmluZyBYaWxpbngtcmVsYXRlZCBzaWduYWxzCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBsbWNfZ3Bpb19ta2lucHV0KHNjLCAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCB0aGUgZnJhbW1lciBoYXJkd2FyZSAqLworICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfbGlua19zdGF0dXMgKHNjLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X3N0YXR1cyAoc2MsIE5VTEwpOworLy8gICAgICAgICAgICAgICAgICAgIGxtY19zb2Z0cmVzZXQoc2MpOworCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgNTsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kZWxheSgxMDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtY19sZWRfb24oc2MsIExNQ19EUzNfTEVEMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRlbGF5KDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1jX2xlZF9vZmYoc2MsIExNQ19EUzNfTEVEMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1jX2xlZF9vbihzYywgTE1DX0RTM19MRUQzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGVsYXkoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbWNfbGVkX29mZihzYywgTE1DX0RTM19MRUQzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kZWxheSgxMDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICByZXQgPSAweDA7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgbG1jX3hpbGlueF9sb2FkX3Byb206IC8qZm9sZDAyKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHUxNiBtaWk7CisgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0ID0gNTAwMDAwOworICAgICAgICAgICAgICAgICAgICBtaWkgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNik7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogTWFrZSBhbGwgb2YgdGhlbSAwIGFuZCBtYWtlIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBsbWNfZ3Bpb19ta2lucHV0KHNjLCAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBtYWtlIHRoZSByZXNldCBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGxtY19ncGlvX21rb3V0cHV0KHNjLCAgTE1DX0dFUF9EUCB8IExNQ19HRVBfUkVTRVQpOworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFJFU0VUIGxvdyB0byBmb3JjZSBjb25maWd1cmF0aW9uLiAgVGhpcyBhbHNvIGZvcmNlcworICAgICAgICAgICAgICAgICAgICAgKiB0aGUgdHJhbnNtaXR0ZXIgY2xvY2sgdG8gYmUgaW50ZXJuYWwsIGJ1dCB3ZSBleHBlY3QgdG8gcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICogdGhhdCBsYXRlciBhbnl3YXkuCisgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyAmPSB+KExNQ19HRVBfUkVTRVQgfCBMTUNfR0VQX0RQKTsKKyAgICAgICAgICAgICAgICAgICAgTE1DX0NTUl9XUklURShzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworCisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogaG9sZCBmb3IgbW9yZSB0aGFuIDEwIG1pY3Jvc2Vjb25kcworICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDUwKTsKKworICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX2dwaW8gfD0gTE1DX0dFUF9EUCB8IExNQ19HRVBfUkVTRVQ7CisgICAgICAgICAgICAgICAgICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBidXN5IHdhaXQgZm9yIHRoZSBjaGlwIHRvIHJlc2V0CisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICB3aGlsZSggKExNQ19DU1JfUkVBRChzYywgY3NyX2dwKSAmIExNQ19HRVBfSU5JVCkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWVvdXQtLSA+IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgOworCisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogc3RvcCBkcml2aW5nIFhpbGlueC1yZWxhdGVkIHNpZ25hbHMKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGxtY19ncGlvX21raW5wdXQoc2MsIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIHJldCA9IDB4MDsKKyAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgbG1jX3hpbGlueF9sb2FkOiAvKmZvbGQwMiovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhOworICAgICAgICAgICAgICAgICAgICBpbnQgcG9zOworICAgICAgICAgICAgICAgICAgICBpbnQgdGltZW91dCA9IDUwMDAwMDsKKworICAgICAgICAgICAgICAgICAgICBpZih4Yy5kYXRhID09IDB4MCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBrbWFsbG9jKHhjLmxlbiwgR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEgPT0gMHgwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY29weVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcihkYXRhLCB4Yy5kYXRhLCB4Yy5sZW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIAlrZnJlZShkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgCXJldCA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgICAgIAlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByaW50aygiJXM6IFN0YXJ0aW5nIGxvYWQgb2YgZGF0YSBMZW46ICVkIGF0IDB4JXAgPT0gMHglcFxuIiwgZGV2LT5uYW1lLCB4Yy5sZW4sIHhjLmRhdGEsIGRhdGEpOworCisgICAgICAgICAgICAgICAgICAgIGxtY19ncGlvX21raW5wdXQoc2MsIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIENsZWFyIHRoZSBYaWxpbnggYW5kIHN0YXJ0IHByZ3JhbW1pbmcgZnJvbSB0aGUgREVDCisgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFNldCBvdXB1dCBhczoKKyAgICAgICAgICAgICAgICAgICAgICogUmVzZXQ6IDAgKGFjdGl2ZSkKKyAgICAgICAgICAgICAgICAgICAgICogRFA6ICAgIDAgKGFjdGl2ZSkKKyAgICAgICAgICAgICAgICAgICAgICogTW9kZTogIDEKKyAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyAmPSB+TE1DX0dFUF9EUDsKKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvICY9IH5MTUNfR0VQX1JFU0VUOworICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX2dwaW8gfD0gIExNQ19HRVBfTU9ERTsKKyAgICAgICAgICAgICAgICAgICAgTE1DX0NTUl9XUklURShzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworCisgICAgICAgICAgICAgICAgICAgIGxtY19ncGlvX21rb3V0cHV0KHNjLCBMTUNfR0VQX01PREUgfCBMTUNfR0VQX0RQIHwgTE1DX0dFUF9SRVNFVCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogV2FpdCBhdCBsZWFzdCAxMCB1cyAyMCB0byBiZSBzYWZlCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoNTApOworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIENsZWFyIHJlc2V0IGFuZCBhY3RpdmF0ZSBwcm9ncmFtbWluZyBsaW5lcworICAgICAgICAgICAgICAgICAgICAgKiBSZXNldDogSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICogRFA6ICAgIElucHV0CisgICAgICAgICAgICAgICAgICAgICAqIENsb2NrOiBPdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICogRGF0YTogIE91dHB1dAorICAgICAgICAgICAgICAgICAgICAgKiBNb2RlOiAgT3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBsbWNfZ3Bpb19ta2lucHV0KHNjLCBMTUNfR0VQX0RQIHwgTE1DX0dFUF9SRVNFVCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2V0IExPQUQsIERBVEEsIENsb2NrIHRvIDEKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX01PREU7CisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0RBVEE7CisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0NMSzsKKyAgICAgICAgICAgICAgICAgICAgTE1DX0NTUl9XUklURShzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgbG1jX2dwaW9fbWtvdXRwdXQoc2MsIExNQ19HRVBfREFUQSB8IExNQ19HRVBfQ0xLIHwgTE1DX0dFUF9NT0RFICk7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogYnVzeSB3YWl0IGZvciB0aGUgY2hpcCB0byByZXNldAorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIChMTUNfQ1NSX1JFQUQoc2MsIGNzcl9ncCkgJiBMTUNfR0VQX0lOSVQpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aW1lb3V0LS0gPiAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IFdhaXRlZCAlZCBmb3IgdGhlIFhpbGlueCB0byBjbGVhciBpdCdzIG1lbW9yeVxuIiwgZGV2LT5uYW1lLCA1MDAwMDAtdGltZW91dCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKHBvcyA9IDA7IHBvcyA8IHhjLmxlbjsgcG9zKyspeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGRhdGFbcG9zXSl7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvICY9IH5MTUNfR0VQX0RBVEE7IC8qIERhdGEgaXMgMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0RBVEE7IC8qIERhdGEgaXMgMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlcyBCYWQgZGF0YSBpbiB4aWxpbnggcHJvZ3JhbW1pbmcgZGF0YSBhdCAlZCwgZ290ICVkIHdhbnRlZCAwIG9yIDFcbiIsIGRldi0+bmFtZSwgcG9zLCBkYXRhW3Bvc10pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0RBVEE7IC8qIEFzc3VtZSBpdCdzIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyAmPSB+TE1DX0dFUF9DTEs7IC8qIENsb2NrIHRvIHplcm8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX01PREU7CisgICAgICAgICAgICAgICAgICAgICAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisgICAgICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0NMSzsgLyogUHV0IHRoZSBjbGFjayBiYWNrIHRvIG9uZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvIHw9IExNQ19HRVBfTU9ERTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZigoTE1DX0NTUl9SRUFEKHNjLCBjc3JfZ3ApICYgTE1DX0dFUF9JTklUKSA9PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXByb2dyYW1taW5nIEZBSUxFRC4gTmVlZHMgdG8gYmUgcmVwcm9ncmFtbWVkLiAoY29ycnVwdGVkIGRhdGEpXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoKExNQ19DU1JfUkVBRChzYywgY3NyX2dwKSAmIExNQ19HRVBfRFApID09IDApeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlcHJvZ3JhbW1pbmcgRkFJTEVELiBOZWVkcyB0byBiZSByZXByb2dyYW1tZWQuIChkb25lKVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogRG9uZSByZXByb2dyYW1taW5nIFhpbGlueCwgJWQgYml0cywgZ29vZCBsdWNrIVxuIiwgZGV2LT5uYW1lLCBwb3MpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbG1jX2dwaW9fbWtpbnB1dChzYywgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX21paXJlZzE2IHw9IExNQ19NSUkxNl9GSUZPX1JFU0VUOworICAgICAgICAgICAgICAgICAgICBsbWNfbWlpX3dyaXRlcmVnKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7CisKKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19taWlyZWcxNiAmPSB+TE1DX01JSTE2X0ZJRk9fUkVTRVQ7CisgICAgICAgICAgICAgICAgICAgIGxtY19taWlfd3JpdGVyZWcoc2MsIDAsIDE2LCBzYy0+bG1jX21paXJlZzE2KTsKKworICAgICAgICAgICAgICAgICAgICBrZnJlZShkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OiAvKmZvbGQwMiovCisgICAgICAgICAgICAgICAgcmV0ID0gLUVCQURFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisgICAgICAgICAgICBzYy0+bG1jX3R4ZnVsbCA9IDA7CisKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAvKmZvbGQwMSovCisgICAgICAgIC8qIElmIHdlIGRvbid0IGtub3cgd2hhdCB0byBkbywgZ2l2ZSB0aGUgcHJvdG9jb2wgYSBzaG90LiAqLworICAgICAgICByZXQgPSBsbWNfcHJvdG9faW9jdGwgKHNjLCBpZnIsIGNtZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5sbWNfbG9jaywgZmxhZ3MpOyAvKmZvbGQwMSovCisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2lvY3RsIG91dCIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCisvKiB0aGUgd2F0Y2hkb2cgcHJvY2VzcyB0aGF0IGNydWlzZXMgYXJvdW5kICovCitzdGF0aWMgdm9pZCBsbWNfd2F0Y2hkb2cgKHVuc2lnbmVkIGxvbmcgZGF0YSkgLypmb2xkMDAqLworeworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKyAgICBsbWNfc29mdGNfdCAqc2M7CisgICAgaW50IGxpbmtfc3RhdHVzOworICAgIHVfaW50MzJfdCB0aWNrczsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgc2MgPSBkZXYtPnByaXY7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX3dhdGNoZG9nIGluIik7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7CisKKyAgICBpZihzYy0+Y2hlY2sgIT0gMHhCRUFGQ0FGRSl7CisgICAgICAgIHByaW50aygiTE1DOiBDb3JydXB0IG5ldF9kZXZpY2Ugc3R1Y3QsIGJyZWFraW5nIG91dFxuIik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8qIE1ha2Ugc3VyZSB0aGUgdHggamFiYmVyIGFuZCByeCB3YXRjaGRvZyBhcmUgb2ZmLAorICAgICAqIGFuZCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcHJvY2Vzc2VzIGFyZSBydW5uaW5nLgorICAgICAqLworCisgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl8xNSwgMHgwMDAwMDAxMSk7CisgICAgc2MtPmxtY19jbWRtb2RlIHw9IFRVTElQX0NNRF9UWFJVTiB8IFRVTElQX0NNRF9SWFJVTjsKKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2NvbW1hbmQsIHNjLT5sbWNfY21kbW9kZSk7CisKKyAgICBpZiAoc2MtPmxtY19vayA9PSAwKQorICAgICAgICBnb3RvIGtpY2tfdGltZXI7CisKKyAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9XQVRDSERPRywgTE1DX0NTUl9SRUFEIChzYywgY3NyX3N0YXR1cyksIGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE2KSk7CisKKyAgICAvKiAtLS0gYmVnaW4gdGltZSBvdXQgY2hlY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBjaGVjayBmb3IgYSB0cmFuc21pdCBpbnRlcnJ1cHQgdGltZW91dAorICAgICAqIEhhcyB0aGUgcGFja2V0IHhtdCB2cyB4bXQgc2VydmljZWQgdGhyZXNob2xkIGJlZW4gZXhjZWVkZWQgKi8KKyAgICBpZiAoc2MtPmxtY190YWludF90eCA9PSBzYy0+bGFzdGxtY190YWludF90eCAmJgorICAgICAgICBzYy0+c3RhdHMudHhfcGFja2V0cyA+IHNjLT5sYXN0dHhfcGFja2V0cyAmJgorICAgICAgICBzYy0+dHhfVGltZW91dEluZCA9PSAwKQorICAgIHsKKworICAgICAgICAvKiB3YWl0IGZvciB0aGUgd2F0Y2hkb2cgdG8gY29tZSBhcm91bmQgYWdhaW4gKi8KKyAgICAgICAgc2MtPnR4X1RpbWVvdXRJbmQgPSAxOworICAgIH0KKyAgICBlbHNlIGlmIChzYy0+bG1jX3RhaW50X3R4ID09IHNjLT5sYXN0bG1jX3RhaW50X3R4ICYmCisgICAgICAgICAgICAgc2MtPnN0YXRzLnR4X3BhY2tldHMgPiBzYy0+bGFzdHR4X3BhY2tldHMgJiYKKyAgICAgICAgICAgICBzYy0+dHhfVGltZW91dEluZCkKKyAgICB7CisKKyAgICAgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfWE1USU5UVE1PLCBMTUNfQ1NSX1JFQUQgKHNjLCBjc3Jfc3RhdHVzKSwgMCk7CisKKyAgICAgICAgc2MtPnR4X1RpbWVvdXREaXNwbGF5ID0gMTsKKyAgICAgICAgc2MtPnN0YXRzLnR4X1RpbWVvdXRDbnQrKzsKKworICAgICAgICAvKiBERUMgY2hpcCBpcyBzdHVjaywgaGl0IGl0IHdpdGggYSBSRVNFVCEhISEgKi8KKyAgICAgICAgbG1jX3J1bm5pbmdfcmVzZXQgKGRldik7CisKKworICAgICAgICAvKiBsb29rIGF0IHJlY2VpdmUgJiB0cmFuc21pdCBwcm9jZXNzIHN0YXRlIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBydW5uaW5nICovCisgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1JFU0VUMSwgTE1DX0NTUl9SRUFEIChzYywgY3NyX3N0YXR1cyksIDApOworCisgICAgICAgIC8qIGxvb2sgYXQ6IERTUiAtIDAyICBmb3IgUmVnIDE2CisgICAgICAgICAqICAgICAgICAgICAgICAgICAgQ1RTIC0gMDgKKyAgICAgICAgICogICAgICAgICAgICAgICAgICBEQ0QgLSAxMAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgIFJJICAtIDIwCisgICAgICAgICAqIGZvciBSZWcgMTcKKyAgICAgICAgICovCisgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1JFU0VUMiwgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTYpLCBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNykpOworCisgICAgICAgIC8qIHJlc2V0IHRoZSB0cmFuc21pdCB0aW1lb3V0IGRldGVjdGlvbiBmbGFnICovCisgICAgICAgIHNjLT50eF9UaW1lb3V0SW5kID0gMDsKKyAgICAgICAgc2MtPmxhc3RsbWNfdGFpbnRfdHggPSBzYy0+bG1jX3RhaW50X3R4OworICAgICAgICBzYy0+bGFzdHR4X3BhY2tldHMgPSBzYy0+c3RhdHMudHhfcGFja2V0czsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2MtPnR4X1RpbWVvdXRJbmQgPSAwOworICAgICAgICBzYy0+bGFzdGxtY190YWludF90eCA9IHNjLT5sbWNfdGFpbnRfdHg7CisgICAgICAgIHNjLT5sYXN0dHhfcGFja2V0cyA9IHNjLT5zdGF0cy50eF9wYWNrZXRzOworICAgIH0KKworICAgIC8qIC0tLSBlbmQgdGltZSBvdXQgY2hlY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisgICAgbGlua19zdGF0dXMgPSBzYy0+bG1jX21lZGlhLT5nZXRfbGlua19zdGF0dXMgKHNjKTsKKworICAgIC8qCisgICAgICogaGFyZHdhcmUgbGV2ZWwgbGluayBsb3N0LCBidXQgdGhlIGludGVyZmFjZSBpcyBtYXJrZWQgYXMgdXAuCisgICAgICogTWFyayBpdCBhcyBkb3duLgorICAgICAqLworICAgIGlmICgobGlua19zdGF0dXMgPT0gMCkgJiYgKHNjLT5sYXN0X2xpbmtfc3RhdHVzICE9IDApKSB7CisgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBoYXJkd2FyZS9waHlzaWNhbCBsaW5rIGRvd25cbiIsIGRldi0+bmFtZSk7CisgICAgICAgIHNjLT5sYXN0X2xpbmtfc3RhdHVzID0gMDsKKyAgICAgICAgLyogbG1jX3Jlc2V0IChzYyk7IFdoeSByZXNldD8/PyBUaGUgbGluayBjYW4gZ28gZG93biBvayAqLworCisgICAgICAgIC8qIEluZm9ybSB0aGUgd29ybGQgdGhhdCBsaW5rIGhhcyBiZWVuIGxvc3QgKi8KKyAgICAgICAgZGV2LT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBoYXJkd2FyZSBsaW5rIGlzIHVwLCBidXQgdGhlIGludGVyZmFjZSBpcyBtYXJrZWQgYXMgZG93bi4KKyAgICAgKiBCcmluZyBpdCBiYWNrIHVwIGFnYWluLgorICAgICAqLworICAgICBpZiAobGlua19zdGF0dXMgIT0gMCAmJiBzYy0+bGFzdF9saW5rX3N0YXR1cyA9PSAwKSB7CisgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogaGFyZHdhcmUvcGh5c2ljYWwgbGluayB1cFxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgIHNjLT5sYXN0X2xpbmtfc3RhdHVzID0gMTsKKyAgICAgICAgIC8qIGxtY19yZXNldCAoc2MpOyBBZ2FpbiB3aHkgcmVzZXQ/Pz8gKi8KKworICAgICAgICAgLyogSW5mb3JtIHRoZSB3b3JsZCB0aGF0IGxpbmsgcHJvdG9jb2wgaXMgYmFjayB1cC4gKi8KKyAgICAgICAgIGRldi0+ZmxhZ3MgfD0gSUZGX1JVTk5JTkc7CisKKyAgICAgICAgIC8qIE5vdyB3ZSBoYXZlIHRvIHRlbGwgdGhlIHN5bmNwcHAgdGhhdCB3ZSBoYWQgYW4gb3V0YWdlCisgICAgICAgICAgKiBhbmQgdGhhdCBpdCBzaG91bGQgZGVhbC4gIENhbGxpbmcgc3BwcF9yZW9wZW4gaGVyZQorICAgICAgICAgICogc2hvdWxkIGRvIHRoZSB0cmljaywgYnV0IHdlIG1heSBoYXZlIHRvIGNhbGwgc3BwcF9jbG9zZQorICAgICAgICAgICogd2hlbiB0aGUgbGluayBnb2VzIGRvd24sIGFuZCBjYWxsIHNwcHBfb3BlbiBoZXJlLgorICAgICAgICAgICogU3ViamVjdCB0byBtb3JlIHRlc3RpbmcuCisgICAgICAgICAgKiAtLWJicmF1bgorICAgICAgICAgICovCisKKyAgICAgICAgIGxtY19wcm90b19yZW9wZW4oc2MpOworCisgICAgIH0KKworICAgIC8qIENhbGwgbWVkaWEgc3BlY2lmaWMgd2F0Y2hkb2cgZnVuY3Rpb25zICovCisgICAgc2MtPmxtY19tZWRpYS0+d2F0Y2hkb2coc2MpOworCisgICAgLyoKKyAgICAgKiBQb2tlIHRoZSB0cmFuc21pdHRlciB0byBtYWtlIHN1cmUgaXQKKyAgICAgKiBuZXZlciBzdG9wcywgZXZlbiBpZiB3ZSBydW4gb3V0IG9mIG1lbQorICAgICAqLworICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9yeHBvbGwsIDApOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgY29kZSB0aGF0IGZhaWxlZAorICAgICAqIGFuZCB0cnkgYW5kIGZpeCBpdCBhcyBhcHByb3ByaWF0ZQorICAgICAqLworICAgIGlmKHNjLT5mYWlsZWRfcmluZyA9PSAxKXsKKyAgICAgICAgLyoKKyAgICAgICAgICogRmFpbGVkIHRvIHNldHVwIHRoZSByZWN2L3htaXQgcmluCisgICAgICAgICAqIFRyeSBhZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgc2MtPmZhaWxlZF9yaW5nID0gMDsKKyAgICAgICAgbG1jX3NvZnRyZXNldChzYyk7CisgICAgfQorICAgIGlmKHNjLT5mYWlsZWRfcmVjdl9hbGxvYyA9PSAxKXsKKyAgICAgICAgLyoKKyAgICAgICAgICogV2UgZmFpbGVkIHRvIGFsbG9jIG1lbSBpbiB0aGUKKyAgICAgICAgICogaW50ZXJydXB0IGhhbmRsZXIsIGdvIHRocm91Z2ggdGhlIHJpbmdzCisgICAgICAgICAqIGFuZCByZWJ1aWxkIHRoZW0KKyAgICAgICAgICovCisgICAgICAgIHNjLT5mYWlsZWRfcmVjdl9hbGxvYyA9IDA7CisgICAgICAgIGxtY19zb2Z0cmVzZXQoc2MpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiByZW1lbWJlciB0aGUgdGltZXIgdmFsdWUKKyAgICAgKi8KK2tpY2tfdGltZXI6CisKKyAgICB0aWNrcyA9IExNQ19DU1JfUkVBRCAoc2MsIGNzcl9ncF90aW1lcik7CisgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncF90aW1lciwgMHhmZmZmZmZmZlVMKTsKKyAgICBzYy0+aWN0bC50aWNrcyA9IDB4MDAwMGZmZmYgLSAodGlja3MgJiAweDAwMDBmZmZmKTsKKworICAgIC8qCisgICAgICogcmVzdGFydCB0aGlzIHRpbWVyLgorICAgICAqLworICAgIHNjLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWik7CisgICAgYWRkX3RpbWVyICgmc2MtPnRpbWVyKTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5sbWNfbG9jaywgZmxhZ3MpOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY193YXRjaGRvZyBvdXQiKTsKKworfQorCitzdGF0aWMgdm9pZCBsbWNfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKiBjb25zdCBkZXYpIC8qZm9sZDAwKi8KK3sKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX3NldHVwIGluIik7CisKKyAgICBkZXYtPnR5cGUgPSBBUlBIUkRfSERMQzsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGxtY19zdGFydF94bWl0OworICAgIGRldi0+b3BlbiA9IGxtY19vcGVuOworICAgIGRldi0+c3RvcCA9IGxtY19jbG9zZTsKKyAgICBkZXYtPmdldF9zdGF0cyA9IGxtY19nZXRfc3RhdHM7CisgICAgZGV2LT5kb19pb2N0bCA9IGxtY19pb2N0bDsKKyAgICBkZXYtPnR4X3RpbWVvdXQgPSBsbWNfZHJpdmVyX3RpbWVvdXQ7CisgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IChIWik7IC8qIDEgc2Vjb25kICovCisgICAgCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19zZXR1cCBvdXQiKTsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBsbWNfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgbG1jX3NvZnRjX3QgKnNjOworICAgIHUxNiBzdWJkZXZpY2U7CisgICAgdV9pbnQxNl90IEFkYXBNb2RlbE51bTsKKyAgICBpbnQgZXJyID0gLUVOT01FTTsKKyAgICBzdGF0aWMgaW50IGNhcmRzX2ZvdW5kOworI2lmbmRlZiBHQ09NCisgICAgLyogV2UgbmFtZSBieSB0eXBlIG5vdCBieSB2ZW5kb3IgKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciBsbWNuYW1lW10gPSAiaGRsYyVkIjsKKyNlbHNlCisgICAgLyogCisgICAgICogR0NPTSB1c2VzIExNQyB2ZW5kb3IgbmFtZSBzbyB0aGF0IGNsaWVudHMgY2FuIGtub3cgd2hpY2ggY2FyZAorICAgICAqIHRvIGF0dGFjaCB0by4KKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciBsbWNuYW1lW10gPSAibG1jJWQiOworI2VuZGlmCisKKworICAgIC8qCisgICAgICogQWxsb2NhdGUgb3VyIG93biBkZXZpY2Ugc3RydWN0dXJlCisgICAgICovCisgICAgZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihsbWNfc29mdGNfdCksIGxtY25hbWUsIGxtY19zZXR1cCk7CisgICAgaWYgKCFkZXYpIHsKKyAgICAgICAgcHJpbnRrIChLRVJOX0VSUiAibG1jOmFsbG9jX25ldGRldiBmb3IgZGV2aWNlIGZhaWxlZFxuIik7CisJZ290byBvdXQxOworICAgIH0KKyAKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2luaXRfb25lIGluIik7CisKKyAgICBlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKyAgICBpZiAoZXJyKSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAibG1jOiBwY2kgZW5hYmxlIGZhaWxlZDolZFxuIiwgZXJyKTsKKwkgICAgZ290byBvdXQyOworICAgIH0KKyAgICAKKyAgICBpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAibG1jIikpIHsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJsbWM6IHBjaV9yZXF1ZXN0X3JlZ2lvbiBmYWlsZWRcbiIpOworCSAgICBlcnIgPSAtRUlPOworCSAgICBnb3RvIG91dDM7CisgICAgfQorCisgICAgcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKyAgICBpZihsbWNfZmlyc3RfbG9hZCA9PSAwKXsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiTGFuIE1lZGlhIENvcnBvcmF0aW9uIFdBTiBEcml2ZXIgVmVyc2lvbiAlZC4lZC4lZFxuIiwKKwkgICAgICAgRFJJVkVSX01BSk9SX1ZFUlNJT04sIERSSVZFUl9NSU5PUl9WRVJTSU9OLERSSVZFUl9TVUJfVkVSU0lPTik7CisgICAgICAgIGxtY19maXJzdF9sb2FkID0gMTsKKyAgICB9CisgICAgCisgICAgc2MgPSBkZXYtPnByaXY7CisgICAgc2MtPmxtY19kZXZpY2UgPSBkZXY7CisgICAgc2MtPm5hbWUgPSBkZXYtPm5hbWU7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBzcHBwIGxheWVyICovCisgICAgLyogQW4gaW9jdGwgY2FuIGNhdXNlIGEgc3Vic2VxdWVudCBkZXRhY2ggZm9yIHJhdyBmcmFtZSBpbnRlcmZhY2UgKi8KKyAgICBzYy0+aWZfdHlwZSA9IExNQ19QUFA7CisgICAgc2MtPmNoZWNrID0gMHhCRUFGQ0FGRTsKKyAgICBkZXYtPmJhc2VfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKyAgICBkZXYtPmlycSA9IHBkZXYtPmlycTsKKworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisgICAgLyoKKyAgICAgKiBUaGlzIHdpbGwgZ2V0IHRoZSBwcm90b2NvbCBsYXllciByZWFkeSBhbmQgZG8gYW55IDEgdGltZSBpbml0J3MKKyAgICAgKiBNdXN0IGhhdmUgYSB2YWxpZCBzYyBhbmQgZGV2IHN0cnVjdHVyZQorICAgICAqLworICAgIGxtY19wcm90b19pbml0KHNjKTsKKworICAgIGxtY19wcm90b19hdHRhY2goc2MpOworCisgICAgLyoKKyAgICAgKiBXaHkgd2VyZSB3ZSBjaGFuZ2luZyB0aGlzPz8/CisgICAgIGRldi0+dHhfcXVldWVfbGVuID0gMTAwOworICAgICAqLworCisgICAgLyogSW5pdCB0aGUgc3BpbiBsb2NrIHNvIGNhbiBjYWxsIGl0IGxhdHRlciAqLworCisgICAgc3Bpbl9sb2NrX2luaXQoJnNjLT5sbWNfbG9jayk7CisgICAgcGNpX3NldF9tYXN0ZXIocGRldik7CisKKyAgICBwcmludGsgKCIlczogZGV0ZWN0ZWQgYXQgJWx4LCBpcnEgJWRcbiIsIGRldi0+bmFtZSwKKwkgICAgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKworICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYgKGRldikgIT0gMCkgeworICAgICAgICBwcmludGsgKEtFUk5fRVJSICIlczogcmVnaXN0ZXJfbmV0ZGV2IGZhaWxlZC5cbiIsIGRldi0+bmFtZSk7CisJZ290byBvdXQ0OworICAgIH0KKworICAgIHNjLT5sbWNfY2FyZHR5cGUgPSBMTUNfQ0FSRFRZUEVfVU5LTk9XTjsKKyAgICBzYy0+bG1jX3RpbWluZyA9IExNQ19DVExfQ0xPQ0tfU09VUkNFX0VYVDsKKworICAgIC8qCisgICAgICoKKyAgICAgKiBDaGVjayBlaXRoZXIgdGhlIHN1YnZlbmRvciBvciB0aGUgc3ViZGV2aWNlLCBzb21lIHN5c3RlbXMgcmV2ZXJzZQorICAgICAqIHRoZSBzZXR0aW5nIGluIHRoZSBib2lzLCBzZWVtcyB0byBiZSB2ZXJzaW9uIGFuZCBhcmNoIGRlcGVuZGVudD8KKyAgICAgKiBGaXggdGhlIGVycm9yLCBleGNoYW5nZSB0aGUgdHdvIHZhbHVlcyAKKyAgICAgKi8KKyAgICBpZiAoKHN1YmRldmljZSA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpID09IFBDSV9WRU5ET1JfSURfTE1DKQorCSAgICBzdWJkZXZpY2UgPSBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCisgICAgc3dpdGNoIChzdWJkZXZpY2UpIHsKKyAgICBjYXNlIFBDSV9ERVZJQ0VfSURfTE1DX0hTU0k6CisgICAgICAgIHByaW50ayAoIiVzOiBMTUMgSFNTSVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgc2MtPmxtY19jYXJkdHlwZSA9IExNQ19DQVJEVFlQRV9IU1NJOworICAgICAgICBzYy0+bG1jX21lZGlhID0gJmxtY19oc3NpX21lZGlhOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBDSV9ERVZJQ0VfSURfTE1DX0RTMzoKKyAgICAgICAgcHJpbnRrICgiJXM6IExNQyBEUzNcbiIsIGRldi0+bmFtZSk7CisgICAgICAgIHNjLT5sbWNfY2FyZHR5cGUgPSBMTUNfQ0FSRFRZUEVfRFMzOworICAgICAgICBzYy0+bG1jX21lZGlhID0gJmxtY19kczNfbWVkaWE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUENJX0RFVklDRV9JRF9MTUNfU1NJOgorICAgICAgICBwcmludGsgKCIlczogTE1DIFNTSVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgc2MtPmxtY19jYXJkdHlwZSA9IExNQ19DQVJEVFlQRV9TU0k7CisgICAgICAgIHNjLT5sbWNfbWVkaWEgPSAmbG1jX3NzaV9tZWRpYTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0xNQ19UMToKKyAgICAgICAgcHJpbnRrICgiJXM6IExNQyBUMVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgc2MtPmxtY19jYXJkdHlwZSA9IExNQ19DQVJEVFlQRV9UMTsKKyAgICAgICAgc2MtPmxtY19tZWRpYSA9ICZsbWNfdDFfbWVkaWE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ayAoS0VSTl9XQVJOSU5HICIlczogTE1DIFVOS09XTiBDQVJEIVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbG1jX2luaXRjc3JzIChzYywgZGV2LT5iYXNlX2FkZHIsIDgpOworCisgICAgbG1jX2dwaW9fbWtpbnB1dCAoc2MsIDB4ZmYpOworICAgIHNjLT5sbWNfZ3BpbyA9IDA7CQkvKiBkcml2ZSBubyBzaWduYWxzIHlldCAqLworCisgICAgc2MtPmxtY19tZWRpYS0+ZGVmYXVsdHMgKHNjKTsKKworICAgIHNjLT5sbWNfbWVkaWEtPnNldF9saW5rX3N0YXR1cyAoc2MsIExNQ19MSU5LX1VQKTsKKworICAgIC8qIHZlcmlmeSB0aGF0IHRoZSBQQ0kgU3ViIFN5c3RlbSBJRCBtYXRjaGVzIHRoZSBBZGFwdGVyIE1vZGVsIG51bWJlcgorICAgICAqIGZyb20gdGhlIE1JSSByZWdpc3RlcgorICAgICAqLworICAgIEFkYXBNb2RlbE51bSA9IChsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAzKSAmIDB4M2YwKSA+PiA0OworCisgICAgaWYgKChBZGFwTW9kZWxOdW0gPT0gTE1DX0FEQVBfVDEKKyAgICAgICAgICYmIHN1YmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xNQ19UMSkgfHwJLyogZGV0ZWN0IExNQzEyMDAgKi8KKyAgICAgICAgKEFkYXBNb2RlbE51bSA9PSBMTUNfQURBUF9TU0kKKyAgICAgICAgICYmIHN1YmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xNQ19TU0kpIHx8CS8qIGRldGVjdCBMTUMxMDAwICovCisgICAgICAgIChBZGFwTW9kZWxOdW0gPT0gTE1DX0FEQVBfRFMzCisgICAgICAgICAmJiBzdWJkZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MTUNfRFMzKSB8fAkvKiBkZXRlY3QgTE1DNTI0NSAqLworICAgICAgICAoQWRhcE1vZGVsTnVtID09IExNQ19BREFQX0hTU0kKKyAgICAgICAgICYmIHN1YmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xNQ19IU1NJKSkKKyAgICB7CQkJCS8qIGRldGVjdCBMTUM1MjAwICovCisKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByaW50ayAoIiVzOiBNb2RlbCBudW1iZXIgKCVkKSBtaXNjb21wYXJlIGZvciBQQ0kgU3Vic3lzdGVtIElEID0gMHglMDR4XG4iLAorICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgQWRhcE1vZGVsTnVtLCBzdWJkZXZpY2UpOworLy8gICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgfQorICAgIC8qCisgICAgICogcmVzZXQgY2xvY2sKKyAgICAgKi8KKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2dwX3RpbWVyLCAweEZGRkZGRkZGVUwpOworCisgICAgc2MtPmJvYXJkX2lkeCA9IGNhcmRzX2ZvdW5kKys7CisgICAgc2MtPnN0YXRzLmNoZWNrID0gU1RBVENIRUNLOworICAgIHNjLT5zdGF0cy52ZXJzaW9uX3NpemUgPSAoRFJJVkVSX1ZFUlNJT04gPDwgMTYpICsKKyAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgbG1jX3N0YXRpc3RpY3MpOworICAgIHNjLT5zdGF0cy5sbWNfY2FyZHR5cGUgPSBzYy0+bG1jX2NhcmR0eXBlOworCisgICAgc2MtPmxtY19vayA9IDA7CisgICAgc2MtPmxhc3RfbGlua19zdGF0dXMgPSAwOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19pbml0X29uZSBvdXQiKTsKKyAgICByZXR1cm4gMDsKKworIG91dDQ6CisgICAgbG1jX3Byb3RvX2RldGFjaChzYyk7Cisgb3V0MzoKKyAgICBpZiAocGRldikgeworCSAgICBwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCSAgICBwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisgICAgfQorIG91dDI6CisgICAgZnJlZV9uZXRkZXYoZGV2KTsKKyBvdXQxOgorICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSBwY2kgd2hlbiByZW1vdmluZyBtb2R1bGUuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBsbWNfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKyAgICAKKyAgICBpZiAoZGV2KSB7CisJICAgIGxtY19zb2Z0Y190ICpzYyA9IGRldi0+cHJpdjsKKwkgICAgCisJICAgIHByaW50aygiJXM6IHJlbW92aW5nLi4uXG4iLCBkZXYtPm5hbWUpOworCSAgICBsbWNfcHJvdG9fZGV0YWNoKHNjKTsKKwkgICAgdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkgICAgZnJlZV9uZXRkZXYoZGV2KTsKKwkgICAgcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkgICAgcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCSAgICBwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisgICAgfQorfQorCisvKiBBZnRlciB0aGlzIGlzIGNhbGxlZCwgcGFja2V0cyBjYW4gYmUgc2VudC4KKyAqIERvZXMgbm90IGluaXRpYWxpemUgdGhlIGFkZHJlc3NlcworICovCitzdGF0aWMgaW50IGxtY19vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAvKmZvbGQwMCovCit7CisgICAgbG1jX3NvZnRjX3QgKnNjID0gZGV2LT5wcml2OworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19vcGVuIGluIik7CisKKyAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDApOworCisgICAgbG1jX2RlY19yZXNldCAoc2MpOworICAgIGxtY19yZXNldCAoc2MpOworCisgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfUkVTRVQxLCBMTUNfQ1NSX1JFQUQgKHNjLCBjc3Jfc3RhdHVzKSwgMCk7CisgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfUkVTRVQyLAorICAgICAgICAgICAgICAgICAgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTYpLAorICAgICAgICAgICAgICAgICAgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTcpKTsKKworCisgICAgaWYgKHNjLT5sbWNfb2speworICAgICAgICBsbWNfdHJhY2UoZGV2LCAibG1jX29wZW4gbG1jX29rIG91dCIpOworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKworICAgIGxtY19zb2Z0cmVzZXQgKHNjKTsKKworICAgIC8qIFNpbmNlIHdlIGhhdmUgdG8gdXNlIFBDSSBidXMsIHRoaXMgc2hvdWxkIHdvcmsgb24geDg2LGFscGhhLHBwYyAqLworICAgIGlmIChyZXF1ZXN0X2lycSAoZGV2LT5pcnEsICZsbWNfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKXsKKyAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvdWxkIG5vdCBnZXQgaXJxOiAlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisgICAgICAgIGxtY190cmFjZShkZXYsICJsbWNfb3BlbiBpcnEgZmFpbGVkIG91dCIpOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisgICAgc2MtPmdvdF9pcnEgPSAxOworCisgICAgLyogQXNzZXJ0IFRlcm1pbmFsIEFjdGl2ZSAqLworICAgIHNjLT5sbWNfbWlpcmVnMTYgfD0gTE1DX01JSTE2X0xFRF9BTEw7CisgICAgc2MtPmxtY19tZWRpYS0+c2V0X2xpbmtfc3RhdHVzIChzYywgTE1DX0xJTktfVVApOworCisgICAgLyoKKyAgICAgKiByZXNldCB0byBsYXN0IHN0YXRlLgorICAgICAqLworICAgIHNjLT5sbWNfbWVkaWEtPnNldF9zdGF0dXMgKHNjLCBOVUxMKTsKKworICAgIC8qIHNldHVwIGRlZmF1bHQgYml0cyB0byBiZSB1c2VkIGluIHR1bGlwX2Rlc2NfdCB0cmFuc21pdCBkZXNjcmlwdG9yCisgICAgICogLWJheiAqLworICAgIHNjLT5UeERlc2NyaXB0Q29udHJvbEluaXQgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTUNfVERFU19JTlRFUlJVUFRfT05fQ09NUExFVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTUNfVERFU19GSVJTVF9TRUdNRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExNQ19UREVTX0xBU1RfU0VHTUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTUNfVERFU19TRUNPTkRfQUREUl9DSEFJTkVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExNQ19UREVTX0RJU0FCTEVfUEFERElORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgaWYgKHNjLT5pY3RsLmNyY19sZW5ndGggPT0gTE1DX0NUTF9DUkNfTEVOR1RIXzE2KSB7CisgICAgICAgIC8qIGRpc2FibGUgMzIgYml0IENSQyBnZW5lcmF0ZWQgYnkgQVNJQyAqLworICAgICAgICBzYy0+VHhEZXNjcmlwdENvbnRyb2xJbml0IHw9IExNQ19UREVTX0FERF9DUkNfRElTQUJMRTsKKyAgICB9CisgICAgc2MtPmxtY19tZWRpYS0+c2V0X2NyY19sZW5ndGgoc2MsIHNjLT5pY3RsLmNyY19sZW5ndGgpOworICAgIC8qIEFja25vbGVkZ2UgdGhlIFRlcm1pbmFsIEFjdGl2ZSBhbmQgbGlnaHQgTEVEcyAqLworCisgICAgLyogZGV2LT5mbGFncyB8PSBJRkZfVVA7ICovCisKKyAgICBsbWNfcHJvdG9fb3BlbihzYyk7CisKKyAgICBkZXYtPmRvX2lvY3RsID0gbG1jX2lvY3RsOworCisKKyAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICAgIAorICAgIHNjLT5zdGF0cy50eF90YnVzeTArKyA7CisKKyAgICAvKgorICAgICAqIHNlbGVjdCB3aGF0IGludGVycnVwdHMgd2Ugd2FudCB0byBnZXQKKyAgICAgKi8KKyAgICBzYy0+bG1jX2ludHJtYXNrID0gMDsKKyAgICAvKiBTaG91bGQgYmUgdXNpbmcgdGhlIGRlZmF1bHQgaW50ZXJydXB0IG1hc2sgZGVmaW5lZCBpbiB0aGUgLmggZmlsZS4gKi8KKyAgICBzYy0+bG1jX2ludHJtYXNrIHw9IChUVUxJUF9TVFNfTk9STUFMSU5UUgorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfU1RTX1JYSU5UUgorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfU1RTX1RYSU5UUgorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfU1RTX0FCTlJNTElOVFIKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IFRVTElQX1NUU19TWVNFUlJPUgorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfU1RTX1RYU1RPUFBFRAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfU1RTX1RYVU5ERVJGTE9XCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVUxJUF9TVFNfUlhTVE9QUEVECisJCSAgICAgICAgIHwgVFVMSVBfU1RTX1JYTk9CVUYKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9pbnRyLCBzYy0+bG1jX2ludHJtYXNrKTsKKworICAgIHNjLT5sbWNfY21kbW9kZSB8PSBUVUxJUF9DTURfVFhSVU47CisgICAgc2MtPmxtY19jbWRtb2RlIHw9IFRVTElQX0NNRF9SWFJVTjsKKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2NvbW1hbmQsIHNjLT5sbWNfY21kbW9kZSk7CisKKyAgICBzYy0+bG1jX29rID0gMTsgLyogUnVuIHdhdGNoZG9nICovCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgaWYgdXAgbm93IC0gcGZiCisgICAgICovCisKKyAgICBzYy0+bGFzdF9saW5rX3N0YXR1cyA9IDE7CisKKyAgICAvKgorICAgICAqIFNldHVwIGEgdGltZXIgZm9yIHRoZSB3YXRjaGRvZyBvbiBwcm9iZSwgYW5kIHN0YXJ0IGl0IHJ1bm5pbmcuCisgICAgICogU2luY2UgbG1jX29rID09IDAsIGl0IHdpbGwgYmUgYSBOT1AgZm9yIG5vdy4KKyAgICAgKi8KKyAgICBpbml0X3RpbWVyICgmc2MtPnRpbWVyKTsKKyAgICBzYy0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKyAgICBzYy0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisgICAgc2MtPnRpbWVyLmZ1bmN0aW9uID0gJmxtY193YXRjaGRvZzsKKyAgICBhZGRfdGltZXIgKCZzYy0+dGltZXIpOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19vcGVuIG91dCIpOworCisgICAgcmV0dXJuICgwKTsKK30KKworLyogVG90YWwgcmVzZXQgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIEFkVHJhbiBEU1UgZG9pbmcgYmFkIHRoaW5ncworICogIHVuZGVyIGhlYXZ5IGxvYWQKKyAqLworCitzdGF0aWMgdm9pZCBsbWNfcnVubmluZ19yZXNldCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgLypmb2xkMDAqLworeworCisgICAgbG1jX3NvZnRjX3QgKnNjID0gKGxtY19zb2Z0Y190ICopIGRldi0+cHJpdjsKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfcnVubmlnX3Jlc2V0IGluIik7CisKKyAgICAvKiBzdG9wIGludGVycnVwdHMgKi8KKyAgICAvKiBDbGVhciB0aGUgaW50ZXJydXB0IG1hc2sgKi8KKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2ludHIsIDB4MDAwMDAwMDApOworCisgICAgbG1jX2RlY19yZXNldCAoc2MpOworICAgIGxtY19yZXNldCAoc2MpOworICAgIGxtY19zb2Z0cmVzZXQgKHNjKTsKKyAgICAvKiBzYy0+bG1jX21paXJlZzE2IHw9IExNQ19NSUkxNl9MRURfQUxMOyAqLworICAgIHNjLT5sbWNfbWVkaWEtPnNldF9saW5rX3N0YXR1cyAoc2MsIDEpOworICAgIHNjLT5sbWNfbWVkaWEtPnNldF9zdGF0dXMgKHNjLCBOVUxMKTsKKworICAgIC8vZGV2LT5mbGFncyB8PSBJRkZfUlVOTklORzsKKyAgICAKKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKyAgICBzYy0+bG1jX3R4ZnVsbCA9IDA7CisgICAgc2MtPnN0YXRzLnR4X3RidXN5MCsrIDsKKworICAgIHNjLT5sbWNfaW50cm1hc2sgPSBUVUxJUF9ERUZBVUxUX0lOVFJfTUFTSzsKKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2ludHIsIHNjLT5sbWNfaW50cm1hc2spOworCisgICAgc2MtPmxtY19jbWRtb2RlIHw9IChUVUxJUF9DTURfVFhSVU4gfCBUVUxJUF9DTURfUlhSVU4pOworICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfY29tbWFuZCwgc2MtPmxtY19jbWRtb2RlKTsKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfcnVubmluX3Jlc2V0X291dCIpOworfQorCisKKy8qIFRoaXMgaXMgd2hhdCBpcyBjYWxsZWQgd2hlbiB5b3UgaWZjb25maWcgZG93biBhIGRldmljZS4KKyAqIFRoaXMgZGlzYWJsZXMgdGhlIHRpbWVyIGZvciB0aGUgd2F0Y2hkb2cgYW5kIGtlZXBhbGl2ZXMsCisgKiBhbmQgZGlzYWJsZXMgdGhlIGlycSBmb3IgZGV2LgorICovCitzdGF0aWMgaW50IGxtY19jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgLypmb2xkMDAqLworeworICAgIC8qIG5vdCBjYWxsaW5nIHJlbGVhc2VfcmVnaW9uKCkgYXMgd2Ugc2hvdWxkICovCisgICAgbG1jX3NvZnRjX3QgKnNjOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19jbG9zZSBpbiIpOworICAgIAorICAgIHNjID0gZGV2LT5wcml2OworICAgIHNjLT5sbWNfb2sgPSAwOworICAgIHNjLT5sbWNfbWVkaWEtPnNldF9saW5rX3N0YXR1cyAoc2MsIDApOworICAgIGRlbF90aW1lciAoJnNjLT50aW1lcik7CisgICAgbG1jX3Byb3RvX2Nsb3NlKHNjKTsKKyAgICBsbWNfaWZkb3duIChkZXYpOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19jbG9zZSBvdXQiKTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworLyogRW5kcyB0aGUgdHJhbnNmZXIgb2YgcGFja2V0cyAqLworLyogV2hlbiB0aGUgaW50ZXJmYWNlIGdvZXMgZG93biwgdGhpcyBpcyBjYWxsZWQgKi8KK3N0YXRpYyBpbnQgbG1jX2lmZG93biAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgLypmb2xkMDAqLworeworICAgIGxtY19zb2Z0Y190ICpzYyA9IGRldi0+cHJpdjsKKyAgICB1MzIgY3NyNjsKKyAgICBpbnQgaTsKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfaWZkb3duIGluIik7CisgICAgCisgICAgLyogRG9uJ3QgbGV0IGFueXRoaW5nIGVsc2UgZ28gb24gcmlnaHQgbm93ICovCisgICAgLy8gICAgZGV2LT5zdGFydCA9IDA7CisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgIHNjLT5zdGF0cy50eF90YnVzeTErKyA7CisKKyAgICAvKiBzdG9wIGludGVycnVwdHMgKi8KKyAgICAvKiBDbGVhciB0aGUgaW50ZXJydXB0IG1hc2sgKi8KKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2ludHIsIDB4MDAwMDAwMDApOworCisgICAgLyogU3RvcCBUeCBhbmQgUnggb24gdGhlIGNoaXAgKi8KKyAgICBjc3I2ID0gTE1DX0NTUl9SRUFEIChzYywgY3NyX2NvbW1hbmQpOworICAgIGNzcjYgJj0gfkxNQ19ERUNfU1Q7CQkvKiBUdXJuIG9mZiB0aGUgVHJhbnNtaXNzaW9uIGJpdCAqLworICAgIGNzcjYgJj0gfkxNQ19ERUNfU1I7CQkvKiBUdXJuIG9mZiB0aGUgUmVjZWl2ZSBiaXQgKi8KKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2NvbW1hbmQsIGNzcjYpOworCisgICAgZGV2LT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7CisKKyAgICBzYy0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPQorICAgICAgICBMTUNfQ1NSX1JFQUQgKHNjLCBjc3JfbWlzc2VkX2ZyYW1lcykgJiAweGZmZmY7CisKKyAgICAvKiByZWxlYXNlIHRoZSBpbnRlcnJ1cHQgKi8KKyAgICBpZihzYy0+Z290X2lycSA9PSAxKXsKKyAgICAgICAgZnJlZV9pcnEgKGRldi0+aXJxLCBkZXYpOworICAgICAgICBzYy0+Z290X2lycSA9IDA7CisgICAgfQorCisgICAgLyogZnJlZSBza2J1ZmZzIGluIHRoZSBSeCBxdWV1ZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMTUNfUlhERVNDUzsgaSsrKQorICAgIHsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNjLT5sbWNfcnhxW2ldOworICAgICAgICBzYy0+bG1jX3J4cVtpXSA9IE5VTEw7CisgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLnN0YXR1cyA9IDA7CisgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLmxlbmd0aCA9IDA7CisgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLmJ1ZmZlcjEgPSAweERFQURCRUVGOworICAgICAgICBpZiAoc2tiICE9IE5VTEwpCisgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CisgICAgICAgIHNjLT5sbWNfcnhxW2ldID0gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE1DX1RYREVTQ1M7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChzYy0+bG1jX3R4cVtpXSAhPSBOVUxMKQorICAgICAgICAgICAgZGV2X2tmcmVlX3NrYihzYy0+bG1jX3R4cVtpXSk7CisgICAgICAgIHNjLT5sbWNfdHhxW2ldID0gTlVMTDsKKyAgICB9CisKKyAgICBsbWNfbGVkX29mZiAoc2MsIExNQ19NSUkxNl9MRURfQUxMKTsKKworICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICBzYy0+c3RhdHMudHhfdGJ1c3kwKysgOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19pZmRvd24gb3V0Iik7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogSW50ZXJydXB0IGhhbmRsaW5nIHJvdXRpbmUuICBUaGlzIHdpbGwgdGFrZSBhbiBpbmNvbWluZyBwYWNrZXQsIG9yIGNsZWFuCisgKiB1cCBhZnRlciBhIHRyYXNtaXQuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBsbWNfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSAvKmZvbGQwMCovCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaW5zdGFuY2U7CisgICAgbG1jX3NvZnRjX3QgKnNjOworICAgIHUzMiBjc3I7CisgICAgaW50IGk7CisgICAgczMyIHN0YXQ7CisgICAgdW5zaWduZWQgaW50IGJhZHR4OworICAgIHUzMiBmaXJzdGNzcjsKKyAgICBpbnQgbWF4X3dvcmsgPSBMTUNfUlhERVNDUzsKKyAgICBpbnQgaGFuZGxlZCA9IDA7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2ludGVycnVwdCBpbiIpOworCisgICAgc2MgPSBkZXYtPnByaXY7CisgICAgCisgICAgc3Bpbl9sb2NrKCZzYy0+bG1jX2xvY2spOworCisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSBjc3IgdG8gZmluZCB3aGF0IGludGVycnVwdHMgd2UgaGF2ZSAoaWYgYW55KQorICAgICAqLworICAgIGNzciA9IExNQ19DU1JfUkVBRCAoc2MsIGNzcl9zdGF0dXMpOworCisgICAgLyoKKyAgICAgKiBNYWtlIHN1cmUgdGhpcyBpcyBvdXIgaW50ZXJydXB0CisgICAgICovCisgICAgaWYgKCAhIChjc3IgJiBzYy0+bG1jX2ludHJtYXNrKSkgeworICAgICAgICBnb3RvIGxtY19pbnRfZmFpbF9vdXQ7CisgICAgfQorCisgICAgZmlyc3Rjc3IgPSBjc3I7CisKKyAgICAvKiBhbHdheXMgZ28gdGhyb3VnaCB0aGlzIGxvb3AgYXQgbGVhc3Qgb25jZSAqLworICAgIHdoaWxlIChjc3IgJiBzYy0+bG1jX2ludHJtYXNrKSB7CisJaGFuZGxlZCA9IDE7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2xlYXIgaW50ZXJydXB0IGJpdHMsIHdlIGhhbmRsZSBhbGwgY2FzZSBiZWxvdworICAgICAgICAgKi8KKyAgICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9zdGF0dXMsIGNzcik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogT25lIG9mCisgICAgICAgICAqICAtIFRyYW5zbWl0IHByb2Nlc3MgdGltZWQgb3V0IENTUjU8MT4KKyAgICAgICAgICogIC0gVHJhbnNtaXQgamFiYmVyIHRpbWVvdXQgICAgQ1NSNTwzPgorICAgICAgICAgKiAgLSBUcmFuc21pdCB1bmRlcmZsb3cgICAgICAgICBDU1I1PDU+CisgICAgICAgICAqICAtIFRyYW5zbWl0IFJlY2VpdmVyIGJ1ZmZlciB1bmF2YWlsYWJsZSBDU1I1PDc+CisgICAgICAgICAqICAtIFJlY2VpdmUgcHJvY2VzcyBzdG9wcGVkICAgIENTUjU8OD4KKyAgICAgICAgICogIC0gUmVjZWl2ZSB3YXRjaGRvZyB0aW1lb3V0ICAgQ1NSNTw5PgorICAgICAgICAgKiAgLSBFYXJseSB0cmFuc21pdCBpbnRlcnJ1cHQgICBDU1I1PDEwPgorICAgICAgICAgKgorICAgICAgICAgKiBJcyB0aGlzIHJlYWxseSByaWdodD8gU2hvdWxkIHdlIGRvIGEgcnVubmluZyByZXNldCBmb3IgamFiYmVyPworICAgICAgICAgKiAoYmVpbmcgYSBXQU4gY2FyZCBhbmQgYWxsKQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGNzciAmIFRVTElQX1NUU19BQk5STUxJTlRSKXsKKyAgICAgICAgICAgIGxtY19ydW5uaW5nX3Jlc2V0IChkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChjc3IgJiBUVUxJUF9TVFNfUlhJTlRSKXsKKyAgICAgICAgICAgIGxtY190cmFjZShkZXYsICJyeCBpbnRlcnJ1cHQiKTsKKyAgICAgICAgICAgIGxtY19yeCAoZGV2KTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGlmIChjc3IgJiAoVFVMSVBfU1RTX1RYSU5UUiB8IFRVTElQX1NUU19UWE5PQlVGIHwgVFVMSVBfU1RTX1RYU1RPUFBFRCkpIHsKKworCSAgICBpbnQJCW5fY29tcGwgPSAwIDsKKyAgICAgICAgICAgIC8qIHJlc2V0IHRoZSB0cmFuc21pdCB0aW1lb3V0IGRldGVjdGlvbiBmbGFnIC1iYXogKi8KKyAgICAgICAgICAgIHNjLT5zdGF0cy50eF9Ob0NvbXBsZXRlQ250ID0gMDsKKworICAgICAgICAgICAgYmFkdHggPSBzYy0+bG1jX3RhaW50X3R4OworICAgICAgICAgICAgaSA9IGJhZHR4ICUgTE1DX1RYREVTQ1M7CisKKyAgICAgICAgICAgIHdoaWxlICgoYmFkdHggPCBzYy0+bG1jX25leHRfdHgpKSB7CisgICAgICAgICAgICAgICAgc3RhdCA9IHNjLT5sbWNfdHhyaW5nW2ldLnN0YXR1czsKKworICAgICAgICAgICAgICAgIExNQ19FVkVOVF9MT0cgKExNQ19FVkVOVF9YTVRJTlQsIHN0YXQsCisJCQkJCQkgc2MtPmxtY190eHJpbmdbaV0ubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIElmIGJpdCAzMSBpcyAxIHRoZSB0dWxpcCBvd25zIGl0IGJyZWFrIG91dCBvZiB0aGUgbG9vcAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChzdGF0ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJbl9jb21wbCsrIDsJCS8qIGkuZS4sIGhhdmUgYW4gZW1wdHkgc2xvdCBpbiByaW5nICovCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBJZiB3ZSBoYXZlIG5vIHNrYnVmZiBvciBoYXZlIGNsZWFyZWQgaXQKKyAgICAgICAgICAgICAgICAgKiBBbHJlYWR5IGNvbnRpbnVlIHRvIHRoZSBuZXh0IGJ1ZmZlcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChzYy0+bG1jX3R4cVtpXSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2hlY2sgdGhlIHRvdGFsIGVycm9yIHN1bW1hcnkgdG8gbG9vayBmb3IgYW55IGVycm9ycworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChzdGF0ICYgMHg4MDAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNjLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXQgJiAweDQxMDQpCisgICAgICAgICAgICAgICAgICAgICAgICBzYy0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXQgJiAweDBDMDApCisgICAgICAgICAgICAgICAgICAgICAgICBzYy0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXQgJiAweDAyMDApCisgICAgICAgICAgICAgICAgICAgICAgICBzYy0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdCAmIDB4MDAwMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNjLT5zdGF0cy50eF9ieXRlcyArPSBzYy0+bG1jX3R4cmluZ1tpXS5sZW5ndGggJiAweDdmZjsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNjLT5zdGF0cy50eF9wYWNrZXRzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2MtPmxtY190eHFbaV0pOworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfaXJxKHNjLT5sbWNfdHhxW2ldKTsKKyAgICAgICAgICAgICAgICBzYy0+bG1jX3R4cVtpXSA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBiYWR0eCsrOworICAgICAgICAgICAgICAgIGkgPSBiYWR0eCAlIExNQ19UWERFU0NTOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2MtPmxtY19uZXh0X3R4IC0gYmFkdHggPiBMTUNfVFhERVNDUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsgKCIlczogb3V0IG9mIHN5bmMgcG9pbnRlclxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICBiYWR0eCArPSBMTUNfVFhERVNDUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1RCVVNZMCwgbl9jb21wbCwgMCk7CisgICAgICAgICAgICBzYy0+bG1jX3R4ZnVsbCA9IDA7CisgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisgICAgICAgICAgICBzYy0+c3RhdHMudHhfdGJ1c3kwKysgOworCisKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgc2MtPnN0YXRzLmRpcnR5VHggPSBiYWR0eDsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5sbWNfbmV4dF90eCA9IHNjLT5sbWNfbmV4dF90eDsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5sbWNfdHhmdWxsID0gc2MtPmxtY190eGZ1bGw7CisjZW5kaWYKKyAgICAgICAgICAgIHNjLT5sbWNfdGFpbnRfdHggPSBiYWR0eDsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdoeSB3YXMgdGhlcmUgYSBicmVhayBoZXJlPz8/CisgICAgICAgICAgICAgKi8KKyAgICAgICAgfQkJCS8qIGVuZCBoYW5kbGUgdHJhbnNtaXQgaW50ZXJydXB0ICovCisKKyAgICAgICAgaWYgKGNzciAmIFRVTElQX1NUU19TWVNFUlJPUikgeworICAgICAgICAgICAgdTMyIGVycm9yOworICAgICAgICAgICAgcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBzeXN0ZW0gYnVzIGVycm9yIGNzcjogJSM4Ljh4XG4iLCBkZXYtPm5hbWUsIGNzcik7CisgICAgICAgICAgICBlcnJvciA9IGNzcj4+MjMgJiAweDc7CisgICAgICAgICAgICBzd2l0Y2goZXJyb3IpeworICAgICAgICAgICAgY2FzZSAweDAwMDoKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogUGFyaXR5IEZhdWx0IChiYWQpXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDAwMToKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWFzdGVyIEFib3J0IChuYXVnaHR5KVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwMTA6CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRhcmdldCBBYm9ydCAobm90IHNvIG5hdWdodHkpXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogVGhpcyBidXMgZXJyb3IgY29kZSB3YXMgc3VwcG9zZWQgdG8gYmUgcmVzZXJ2ZWQhXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG1jX2RlY19yZXNldCAoc2MpOworICAgICAgICAgICAgbG1jX3Jlc2V0IChzYyk7CisgICAgICAgICAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9SRVNFVDEsIExNQ19DU1JfUkVBRCAoc2MsIGNzcl9zdGF0dXMpLCAwKTsKKyAgICAgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1JFU0VUMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNykpOworCisgICAgICAgIH0KKworICAgICAgICAKKyAgICAgICAgaWYobWF4X3dvcmstLSA8PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgICAvKgorICAgICAgICAgKiBHZXQgY3VycmVudCBjc3Igc3RhdHVzIHRvIG1ha2Ugc3VyZQorICAgICAgICAgKiB3ZSd2ZSBjbGVhcmVkIGFsbCBpbnRlcnJ1cHRzCisgICAgICAgICAqLworICAgICAgICBjc3IgPSBMTUNfQ1NSX1JFQUQgKHNjLCBjc3Jfc3RhdHVzKTsKKyAgICB9CQkJCS8qIGVuZCBpbnRlcnJ1cHQgbG9vcCAqLworICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX0lOVCwgZmlyc3Rjc3IsIGNzcik7CisKK2xtY19pbnRfZmFpbF9vdXQ6CisKKyAgICBzcGluX3VubG9jaygmc2MtPmxtY19sb2NrKTsKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfaW50ZXJydXB0IG91dCIpOworICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgaW50IGxtY19zdGFydF94bWl0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAvKmZvbGQwMCovCit7CisgICAgbG1jX3NvZnRjX3QgKnNjOworICAgIHUzMiBmbGFnOworICAgIGludCBlbnRyeTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19zdGFydF94bWl0IGluIik7CisKKyAgICBzYyA9IGRldi0+cHJpdjsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzYy0+bG1jX2xvY2ssIGZsYWdzKTsKKworICAgIC8qIG5vcm1hbCBwYXRoLCB0YnVzeSBrbm93biB0byBiZSB6ZXJvICovCisKKyAgICBlbnRyeSA9IHNjLT5sbWNfbmV4dF90eCAlIExNQ19UWERFU0NTOworCisgICAgc2MtPmxtY190eHFbZW50cnldID0gc2tiOworICAgIHNjLT5sbWNfdHhyaW5nW2VudHJ5XS5idWZmZXIxID0gdmlydF90b19idXMgKHNrYi0+ZGF0YSk7CisKKyAgICBMTUNfQ09OU09MRV9MT0coInhtaXQiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworI2lmbmRlZiBHQ09NCisgICAgLyogSWYgdGhlIHF1ZXVlIGlzIGxlc3MgdGhhbiBoYWxmIGZ1bGwsIGRvbid0IGludGVycnVwdCAqLworICAgIGlmIChzYy0+bG1jX25leHRfdHggLSBzYy0+bG1jX3RhaW50X3R4IDwgTE1DX1RYREVTQ1MgLyAyKQorICAgIHsKKyAgICAgICAgLyogRG8gbm90IGludGVycnVwdCBvbiBjb21wbGV0aW9uIG9mIHRoaXMgcGFja2V0ICovCisgICAgICAgIGZsYWcgPSAweDYwMDAwMDAwOworICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisgICAgfQorICAgIGVsc2UgaWYgKHNjLT5sbWNfbmV4dF90eCAtIHNjLT5sbWNfdGFpbnRfdHggPT0gTE1DX1RYREVTQ1MgLyAyKQorICAgIHsKKyAgICAgICAgLyogVGhpcyBnZW5lcmF0ZXMgYW4gaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gb2YgdGhpcyBwYWNrZXQgKi8KKyAgICAgICAgZmxhZyA9IDB4ZTAwMDAwMDA7CisgICAgICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2MtPmxtY19uZXh0X3R4IC0gc2MtPmxtY190YWludF90eCA8IExNQ19UWERFU0NTIC0gMSkKKyAgICB7CisgICAgICAgIC8qIERvIG5vdCBpbnRlcnJ1cHQgb24gY29tcGxldGlvbiBvZiB0aGlzIHBhY2tldCAqLworICAgICAgICBmbGFnID0gMHg2MDAwMDAwMDsKKyAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBUaGlzIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQgb24gY29tcGxldGlvbiBvZiB0aGlzIHBhY2tldCAqLworICAgICAgICBmbGFnID0gMHhlMDAwMDAwMDsKKyAgICAgICAgc2MtPmxtY190eGZ1bGwgPSAxOworICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgfQorI2Vsc2UKKyAgICBmbGFnID0gTE1DX1RERVNfSU5URVJSVVBUX09OX0NPTVBMRVRJT047CisKKyAgICBpZiAoc2MtPmxtY19uZXh0X3R4IC0gc2MtPmxtY190YWludF90eCA+PSBMTUNfVFhERVNDUyAtIDEpCisgICAgewkJCQkvKiByaW5nIGZ1bGwsIGdvIGJ1c3kgKi8KKyAgICAgICAgc2MtPmxtY190eGZ1bGwgPSAxOworICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgIHNjLT5zdGF0cy50eF90YnVzeTErKyA7CisgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1RCVVNZMSwgZW50cnksIDApOworICAgIH0KKyNlbmRpZgorCisKKyAgICBpZiAoZW50cnkgPT0gTE1DX1RYREVTQ1MgLSAxKQkvKiBsYXN0IGRlc2NyaXB0b3IgaW4gcmluZyAqLworCWZsYWcgfD0gTE1DX1RERVNfRU5EX09GX1JJTkc7CS8qIGZsYWcgYXMgc3VjaCBmb3IgVHVsaXAgKi8KKworICAgIC8qIGRvbid0IHBhZCBzbWFsbCBwYWNrZXRzIGVpdGhlciAqLworICAgIGZsYWcgPSBzYy0+bG1jX3R4cmluZ1tlbnRyeV0ubGVuZ3RoID0gKHNrYi0+bGVuKSB8IGZsYWcgfAorCQkJCQkJc2MtPlR4RGVzY3JpcHRDb250cm9sSW5pdDsKKworICAgIC8qIHNldCB0aGUgdHJhbnNtaXQgdGltZW91dCBmbGFnIHRvIGJlIGNoZWNrZWQgaW4KKyAgICAgKiB0aGUgd2F0Y2hkb2cgdGltZXIgaGFuZGxlci4gLWJhegorICAgICAqLworCisgICAgc2MtPnN0YXRzLnR4X05vQ29tcGxldGVDbnQrKzsKKyAgICBzYy0+bG1jX25leHRfdHgrKzsKKworICAgIC8qIGdpdmUgb3duZXJzaGlwIHRvIHRoZSBjaGlwICovCisgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfWE1ULCBmbGFnLCBlbnRyeSk7CisgICAgc2MtPmxtY190eHJpbmdbZW50cnldLnN0YXR1cyA9IDB4ODAwMDAwMDA7CisKKyAgICAvKiBzZW5kIG5vdyEgKi8KKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX3R4cG9sbCwgMCk7CisKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5sbWNfbG9jaywgZmxhZ3MpOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19zdGFydF94bWl0X291dCIpOworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBsbWNfcnggKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIC8qZm9sZDAwKi8KK3sKKyAgICBsbWNfc29mdGNfdCAqc2M7CisgICAgaW50IGk7CisgICAgaW50IHJ4X3dvcmtfbGltaXQgPSBMTUNfUlhERVNDUzsKKyAgICB1bnNpZ25lZCBpbnQgbmV4dF9yeDsKKyAgICBpbnQgcnhJbnRMb29wQ250OwkJLyogZGVidWcgLWJheiAqLworICAgIGludCBsb2NhbExlbmd0aEVyckNudCA9IDA7CisgICAgbG9uZyBzdGF0OworICAgIHN0cnVjdCBza19idWZmICpza2IsICpuc2I7CisgICAgdTE2IGxlbjsKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfcnggaW4iKTsKKworICAgIHNjID0gZGV2LT5wcml2OworCisgICAgbG1jX2xlZF9vbihzYywgTE1DX0RTM19MRUQzKTsKKworICAgIHJ4SW50TG9vcENudCA9IDA7CQkvKiBkZWJ1ZyAtYmF6ICovCisKKyAgICBpID0gc2MtPmxtY19uZXh0X3J4ICUgTE1DX1JYREVTQ1M7CisgICAgbmV4dF9yeCA9IHNjLT5sbWNfbmV4dF9yeDsKKworICAgIHdoaWxlICgoKHN0YXQgPSBzYy0+bG1jX3J4cmluZ1tpXS5zdGF0dXMpICYgTE1DX1JERVNfT1dOX0JJVCkgIT0gREVTQ19PV05FRF9CWV9EQzIxWDQpCisgICAgeworICAgICAgICByeEludExvb3BDbnQrKzsJCS8qIGRlYnVnIC1iYXogKi8KKyAgICAgICAgbGVuID0gKChzdGF0ICYgTE1DX1JERVNfRlJBTUVfTEVOR1RIKSA+PiBSREVTX0ZSQU1FX0xFTkdUSF9CSVRfTlVNQkVSKTsKKyAgICAgICAgaWYgKChzdGF0ICYgMHgwMzAwKSAhPSAweDAzMDApIHsgIC8qIENoZWNrIGZpcnN0IHNlZ21lbnQgYW5kIGxhc3Qgc2VnbWVudCAqLworICAgICAgICAgICAgaWYgKChzdGF0ICYgMHgwMDAwZmZmZikgIT0gMHg3ZmZmKSB7CisgICAgICAgICAgICAgICAgLyogT3ZlcnNpemVkIGZyYW1lICovCisgICAgICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICBnb3RvIHNraXBfcGFja2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoc3RhdCAmIDB4MDAwMDAwMDgpeyAvKiBDYXRjaCBhIGRyaWJibGluZyBiaXQgZXJyb3IgKi8KKyAgICAgICAgICAgIHNjLT5zdGF0cy5yeF9lcnJvcnMrKzsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKyAgICAgICAgICAgIGdvdG8gc2tpcF9wYWNrZXQ7CisgICAgICAgIH0KKworCisgICAgICAgIGlmKHN0YXQgJiAweDAwMDAwMDA0KXsgLyogQ2F0Y2ggYSBDUkMgZXJyb3IgYnkgdGhlIFhpbGlueCAqLworICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X2Vycm9ycysrOworICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKyAgICAgICAgICAgIGdvdG8gc2tpcF9wYWNrZXQ7CisgICAgICAgIH0KKworCisgICAgICAgIGlmIChsZW4gPiBMTUNfUEtUX0JVRl9TWil7CisgICAgICAgICAgICBzYy0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworICAgICAgICAgICAgbG9jYWxMZW5ndGhFcnJDbnQrKzsKKyAgICAgICAgICAgIGdvdG8gc2tpcF9wYWNrZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGVuIDwgc2MtPmxtY19jcmNTaXplICsgMikgeworICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5yeF9TbWFsbFBrdENudCsrOworICAgICAgICAgICAgbG9jYWxMZW5ndGhFcnJDbnQrKzsKKyAgICAgICAgICAgIGdvdG8gc2tpcF9wYWNrZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZihzdGF0ICYgMHgwMDAwNDAwMCl7CisgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZXIgZGVzY3JpcHRvciBlcnJvciwgcmVjZWl2ZXIgb3V0IG9mIHN5bmM/XG4iLCBkZXYtPm5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgbGVuIC09IHNjLT5sbWNfY3JjU2l6ZTsKKworICAgICAgICBza2IgPSBzYy0+bG1jX3J4cVtpXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBXZSByYW4gb3V0IG9mIG1lbW9yeSBhdCBzb21lIHBvaW50CisgICAgICAgICAqIGp1c3QgYWxsb2NhdGUgYW4gc2tiIGJ1ZmYgYW5kIGNvbnRpbnVlLgorICAgICAgICAgKi8KKyAgICAgICAgCisgICAgICAgIGlmKHNrYiA9PSAweDApeworICAgICAgICAgICAgbnNiID0gZGV2X2FsbG9jX3NrYiAoTE1DX1BLVF9CVUZfU1ogKyAyKTsKKyAgICAgICAgICAgIGlmIChuc2IpIHsKKyAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cVtpXSA9IG5zYjsKKyAgICAgICAgICAgICAgICBuc2ItPmRldiA9IGRldjsKKyAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5idWZmZXIxID0gdmlydF90b19idXMgKG5zYi0+dGFpbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYy0+ZmFpbGVkX3JlY3ZfYWxsb2MgPSAxOworICAgICAgICAgICAgZ290byBza2lwX3BhY2tldDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKyAgICAgICAgc2MtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKyAgICAgICAgc2MtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworICAgICAgICBMTUNfQ09OU09MRV9MT0coInJlY3YiLCBza2ItPmRhdGEsIGxlbik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSSdtIG5vdCBzdXJlIG9mIHRoZSBzYW5pdHkgb2YgdGhpcworICAgICAgICAgKiBQYWNrZXRzIGNvdWxkIGJlIGFycml2aW5nIGF0IGEgY29uc3RhbnQKKyAgICAgICAgICogNDQuMjEwbWJpdHMvc2VjIGFuZCB3ZSdyZSBnb2luZyB0byBjb3B5CisgICAgICAgICAqIHRoZW0gaW50byBhIG5ldyBidWZmZXI/PworICAgICAgICAgKi8KKyAgICAgICAgCisgICAgICAgIGlmKGxlbiA+IChMTUNfTVRVIC0gKExNQ19NVFU+PjIpKSl7IC8qIGxlbiA+IExNQ19NVFUgKiAwLjc1ICovCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgaXQncyBhIGxhcmdlIHBhY2tldCBkb24ndCBjb3B5IGl0IGp1c3QgaGFuZCBpdCB1cAorICAgICAgICAgICAgICovCisgICAgICAgIGdpdmVfaXRfYW55d2F5czoKKworICAgICAgICAgICAgc2MtPmxtY19yeHFbaV0gPSBOVUxMOworICAgICAgICAgICAgc2MtPmxtY19yeHJpbmdbaV0uYnVmZmVyMSA9IDB4MDsKKworICAgICAgICAgICAgc2tiX3B1dCAoc2tiLCBsZW4pOworICAgICAgICAgICAgc2tiLT5wcm90b2NvbCA9IGxtY19wcm90b190eXBlKHNjLCBza2IpOworICAgICAgICAgICAgc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX1dBTl9QUFApOworICAgICAgICAgICAgc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworLy8gICAgICAgICAgICBza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKyAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgbG1jX3Byb3RvX25ldGlmKHNjLCBza2IpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhpcyBza2Igd2lsbCBiZSBkZXN0cm95ZWQgYnkgdGhlIHVwcGVyIGxheWVycywgbWFrZSBhIG5ldyBvbmUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbnNiID0gZGV2X2FsbG9jX3NrYiAoTE1DX1BLVF9CVUZfU1ogKyAyKTsKKyAgICAgICAgICAgIGlmIChuc2IpIHsKKyAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cVtpXSA9IG5zYjsKKyAgICAgICAgICAgICAgICBuc2ItPmRldiA9IGRldjsKKyAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5idWZmZXIxID0gdmlydF90b19idXMgKG5zYi0+dGFpbCk7CisgICAgICAgICAgICAgICAgLyogVHJhbnNmZXJyZWQgdG8gMjExNDAgYmVsb3cgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogV2UndmUgcnVuIG91dCBvZiBtZW1vcnksIHN0b3AgdHJ5aW5nIHRvIGFsbG9jYXRlCisgICAgICAgICAgICAgICAgICogbWVtb3J5IGFuZCBleGl0IHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogVGhlIGNoaXAgbWF5IHJ1biBvdXQgb2YgcmVjZWl2ZXJzIGFuZCBzdG9wCisgICAgICAgICAgICAgICAgICogaW4gd2hpY2ggY2FyZSB3ZSdsbCB0cnkgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAqIGFnYWluLiAgKG9uY2UgYSBzZWNvbmQpCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X0J1ZmZBbGxvY0VycisrOworICAgICAgICAgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1JDVklOVCwgc3RhdCwgbGVuKTsKKyAgICAgICAgICAgICAgICBzYy0+ZmFpbGVkX3JlY3ZfYWxsb2MgPSAxOworICAgICAgICAgICAgICAgIGdvdG8gc2tpcF9vdXRfb2ZfbWVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbnNiID0gZGV2X2FsbG9jX3NrYihsZW4pOworICAgICAgICAgICAgaWYoIW5zYikgeworICAgICAgICAgICAgICAgIGdvdG8gZ2l2ZV9pdF9hbnl3YXlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KHNrYl9wdXQobnNiLCBsZW4pLCBza2ItPmRhdGEsIGxlbik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG5zYi0+cHJvdG9jb2wgPSBsbWNfcHJvdG9fdHlwZShzYywgc2tiKTsKKyAgICAgICAgICAgIG5zYi0+bWFjLnJhdyA9IG5zYi0+ZGF0YTsKKy8vICAgICAgICAgICAgbnNiLT5uaC5yYXcgPSBuc2ItPmRhdGE7CisgICAgICAgICAgICBuc2ItPmRldiA9IGRldjsKKyAgICAgICAgICAgIGxtY19wcm90b19uZXRpZihzYywgbnNiKTsKKyAgICAgICAgfQorCisgICAgc2tpcF9wYWNrZXQ6CisgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1JDVklOVCwgc3RhdCwgbGVuKTsKKyAgICAgICAgc2MtPmxtY19yeHJpbmdbaV0uc3RhdHVzID0gREVTQ19PV05FRF9CWV9EQzIxWDQ7CisKKyAgICAgICAgc2MtPmxtY19uZXh0X3J4Kys7CisgICAgICAgIGkgPSBzYy0+bG1jX25leHRfcnggJSBMTUNfUlhERVNDUzsKKyAgICAgICAgcnhfd29ya19saW1pdC0tOworICAgICAgICBpZiAocnhfd29ya19saW1pdCA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBkZXRlY3QgY29uZGl0aW9uIGZvciBMTUMxMDAwIHdoZXJlIERTVSBjYWJsZSBhdHRhY2hlcyBhbmQgZmlsbHMKKyAgICAgKiBkZXNjcmlwdG9ycyB3aXRoIGJvZ3VzIHBhY2tldHMKKyAgICAgKgorICAgIGlmIChsb2NhbExlbmd0aEVyckNudCA+IExNQ19SWERFU0NTIC0gMykgeworICAgICAgICBzYy0+c3RhdHMucnhfQmFkUGt0U3VyZ2VDbnQrKzsKKyAgICAgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfQkFEUEtUU1VSR0UsCisgICAgICAgICAgICAgICAgICAgICAgbG9jYWxMZW5ndGhFcnJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X0JhZFBrdFN1cmdlQ250KTsKKyAgICB9ICovCisKKyAgICAvKiBzYXZlIG1heCBjb3VudCBvZiByZWNlaXZlIGRlc2NyaXB0b3JzIHNlcnZpY2VkICovCisgICAgaWYgKHJ4SW50TG9vcENudCA+IHNjLT5zdGF0cy5yeEludExvb3BDbnQpIHsKKyAgICAgICAgc2MtPnN0YXRzLnJ4SW50TG9vcENudCA9IHJ4SW50TG9vcENudDsJLyogZGVidWcgLWJheiAqLworICAgIH0KKworI2lmZGVmIERFQlVHCisgICAgaWYgKHJ4SW50TG9vcENudCA9PSAwKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IExNQ19SWERFU0NTOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoc2MtPmxtY19yeHJpbmdbaV0uc3RhdHVzICYgTE1DX1JERVNfT1dOX0JJVCkKKyAgICAgICAgICAgICAgICAhPSBERVNDX09XTkVEX0JZX0RDMjFYNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByeEludExvb3BDbnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9SQ1ZFTkQsIHJ4SW50TG9vcENudCwgMCk7CisgICAgfQorI2VuZGlmCisKKworICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDMpOworCitza2lwX291dF9vZl9tZW06CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX3J4IG91dCIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbG1jX2dldF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgLypmb2xkMDAqLworeworICAgIGxtY19zb2Z0Y190ICpzYyA9IGRldi0+cHJpdjsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19nZXRfc3RhdHMgaW4iKTsKKworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnNjLT5sbWNfbG9jaywgZmxhZ3MpOworCisgICAgc2MtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gTE1DX0NTUl9SRUFEIChzYywgY3NyX21pc3NlZF9mcmFtZXMpICYgMHhmZmZmOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2dldF9zdGF0cyBvdXQiKTsKKworICAgIHJldHVybiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgJnNjLT5zdGF0czsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGxtY19kcml2ZXIgPSB7CisJLm5hbWUJCT0gImxtYyIsCisJLmlkX3RhYmxlCT0gbG1jX3BjaV90YmwsCisJLnByb2JlCQk9IGxtY19pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGxtY19yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbG1jKHZvaWQpCit7CisgICAgcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmbG1jX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2xtYyh2b2lkKQoreworICAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbG1jX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbG1jKTsKK21vZHVsZV9leGl0KGV4aXRfbG1jKTsKKwordW5zaWduZWQgbG1jX21paV9yZWFkcmVnIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCB1bnNpZ25lZCBkZXZhZGRyLCB1bnNpZ25lZCByZWdubykgLypmb2xkMDAqLworeworICAgIGludCBpOworICAgIGludCBjb21tYW5kID0gKDB4ZjYgPDwgMTApIHwgKGRldmFkZHIgPDwgNSkgfCByZWdubzsKKyAgICBpbnQgcmV0dmFsID0gMDsKKworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19taWlfcmVhZHJlZyBpbiIpOworCisgICAgTE1DX01JSV9TWU5DIChzYyk7CisKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfbWlpX3JlYWRyZWc6IGRvbmUgc3luYyIpOworCisgICAgZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgICAgaW50IGRhdGF2YWwgPSAoY29tbWFuZCAmICgxIDw8IGkpKSA/IDB4MjAwMDAgOiAwOworCisgICAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfOSwgZGF0YXZhbCk7CisgICAgICAgIGxtY19kZWxheSAoKTsKKyAgICAgICAgLyogX19TTE9XX0RPV05fSU87ICovCisgICAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfOSwgZGF0YXZhbCB8IDB4MTAwMDApOworICAgICAgICBsbWNfZGVsYXkgKCk7CisgICAgICAgIC8qIF9fU0xPV19ET1dOX0lPOyAqLworICAgIH0KKworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19taWlfcmVhZHJlZzogZG9uZTEiKTsKKworICAgIGZvciAoaSA9IDE5OyBpID4gMDsgaS0tKQorICAgIHsKKyAgICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl85LCAweDQwMDAwKTsKKyAgICAgICAgbG1jX2RlbGF5ICgpOworICAgICAgICAvKiBfX1NMT1dfRE9XTl9JTzsgKi8KKyAgICAgICAgcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoTE1DX0NTUl9SRUFEIChzYywgY3NyXzkpICYgMHg4MDAwMCkgPyAxIDogMCk7CisgICAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfOSwgMHg0MDAwMCB8IDB4MTAwMDApOworICAgICAgICBsbWNfZGVsYXkgKCk7CisgICAgICAgIC8qIF9fU0xPV19ET1dOX0lPOyAqLworICAgIH0KKworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19taWlfcmVhZHJlZyBvdXQiKTsKKworICAgIHJldHVybiAocmV0dmFsID4+IDEpICYgMHhmZmZmOworfQorCit2b2lkIGxtY19taWlfd3JpdGVyZWcgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIHVuc2lnbmVkIGRldmFkZHIsIHVuc2lnbmVkIHJlZ25vLCB1bnNpZ25lZCBkYXRhKSAvKmZvbGQwMCovCit7CisgICAgaW50IGkgPSAzMjsKKyAgICBpbnQgY29tbWFuZCA9ICgweDUwMDIgPDwgMTYpIHwgKGRldmFkZHIgPDwgMjMpIHwgKHJlZ25vIDw8IDE4KSB8IGRhdGE7CisKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfbWlpX3dyaXRlcmVnIGluIik7CisKKyAgICBMTUNfTUlJX1NZTkMgKHNjKTsKKworICAgIGkgPSAzMTsKKyAgICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgICAgaW50IGRhdGF2OworCisgICAgICAgIGlmIChjb21tYW5kICYgKDEgPDwgaSkpCisgICAgICAgICAgICBkYXRhdiA9IDB4MjAwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRhdGF2ID0gMHgwMDAwMDsKKworICAgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyXzksIGRhdGF2KTsKKyAgICAgICAgbG1jX2RlbGF5ICgpOworICAgICAgICAvKiBfX1NMT1dfRE9XTl9JTzsgKi8KKyAgICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl85LCAoZGF0YXYgfCAweDEwMDAwKSk7CisgICAgICAgIGxtY19kZWxheSAoKTsKKyAgICAgICAgLyogX19TTE9XX0RPV05fSU87ICovCisgICAgICAgIGktLTsKKyAgICB9CisKKyAgICBpID0gMjsKKyAgICB3aGlsZSAoaSA+IDApCisgICAgeworICAgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyXzksIDB4NDAwMDApOworICAgICAgICBsbWNfZGVsYXkgKCk7CisgICAgICAgIC8qIF9fU0xPV19ET1dOX0lPOyAqLworICAgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyXzksIDB4NTAwMDApOworICAgICAgICBsbWNfZGVsYXkgKCk7CisgICAgICAgIC8qIF9fU0xPV19ET1dOX0lPOyAqLworICAgICAgICBpLS07CisgICAgfQorCisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX21paV93cml0ZXJlZyBvdXQiKTsKK30KKworc3RhdGljIHZvaWQgbG1jX3NvZnRyZXNldCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykgLypmb2xkMDAqLworeworICAgIGludCBpOworCisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3NvZnRyZXNldCBpbiIpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZSByaW5ncyBhbmQgYnVmZmVycy4gKi8KKyAgICBzYy0+bG1jX3R4ZnVsbCA9IDA7CisgICAgc2MtPmxtY19uZXh0X3J4ID0gMDsKKyAgICBzYy0+bG1jX25leHRfdHggPSAwOworICAgIHNjLT5sbWNfdGFpbnRfcnggPSAwOworICAgIHNjLT5sbWNfdGFpbnRfdHggPSAwOworCisgICAgLyoKKyAgICAgKiBTZXR1cCBlYWNoIG9uZSBvZiB0aGUgcmVjZWl2ZXIgYnVmZmVycworICAgICAqIGFsbG9jYXRlIGFuIHNrYnVmZiBmb3IgZWFjaCBvbmUsIHNldHVwIHRoZSBkZXNjcmlwdG9yIHRhYmxlCisgICAgICogYW5kIHBvaW50IGVhY2ggYnVmZmVyIGF0IHRoZSBuZXh0IG9uZQorICAgICAqLworCisgICAgZm9yIChpID0gMDsgaSA8IExNQ19SWERFU0NTOyBpKyspCisgICAgeworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisgICAgICAgIGlmIChzYy0+bG1jX3J4cVtpXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2IgPSBkZXZfYWxsb2Nfc2tiIChMTUNfUEtUX0JVRl9TWiArIDIpOworICAgICAgICAgICAgaWYoc2tiID09IE5VTEwpeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgcmVjZWl2ZXIgcmluZywgd2lsbCB0cnkgYWdhaW5cbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgICAgICAgICBzYy0+ZmFpbGVkX3JpbmcgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cVtpXSA9IHNrYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNrYiA9IHNjLT5sbWNfcnhxW2ldOworICAgICAgICB9CisKKyAgICAgICAgc2tiLT5kZXYgPSBzYy0+bG1jX2RldmljZTsKKworICAgICAgICAvKiBvd25lZCBieSAyMTE0MCAqLworICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5zdGF0dXMgPSAweDgwMDAwMDAwOworCisgICAgICAgIC8qIHVzZWQgdG8gYmUgUEtUX0JVRl9TWiBub3cgdXNlcyBza2Igc2luY2Ugd2UgbG9zZSBzb21lIHRvIGhlYWQgcm9vbSAqLworICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5sZW5ndGggPSBza2ItPmVuZCAtIHNrYi0+ZGF0YTsKKworICAgICAgICAvKiB1c2UgdG8gYmUgdGFpbCB3aGljaCBpcyBkdW1iIHNpbmNlIHlvdSdyZSB0aGlua2luZyB3aHkgd3JpdGUKKyAgICAgICAgICogdG8gdGhlIGVuZCBvZiB0aGUgcGFja2osZXQgYnV0IHNpbmNlIHRoZXJlJ3Mgbm90aGluZyB0aGVyZSB0YWlsID09IGRhdGEKKyAgICAgICAgICovCisgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2J1cyAoc2tiLT5kYXRhKTsKKworICAgICAgICAvKiBUaGlzIGlzIGZhaXIgc2luY2UgdGhlIHN0cnVjdHVyZSBpcyBzdGF0aWMgYW5kIHdlIGhhdmUgdGhlIG5leHQgYWRkcmVzcyAqLworICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5idWZmZXIyID0gdmlydF90b19idXMgKCZzYy0+bG1jX3J4cmluZ1tpICsgMV0pOworCisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXRzIGVuZCBvZiByaW5nCisgICAgICovCisgICAgc2MtPmxtY19yeHJpbmdbaSAtIDFdLmxlbmd0aCB8PSAweDAyMDAwMDAwOyAvKiBTZXQgZW5kIG9mIGJ1ZmZlcnMgZmxhZyAqLworICAgIHNjLT5sbWNfcnhyaW5nW2kgLSAxXS5idWZmZXIyID0gdmlydF90b19idXMgKCZzYy0+bG1jX3J4cmluZ1swXSk7IC8qIFBvaW50IGJhY2sgdG8gdGhlIHN0YXJ0ICovCisgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9yeGxpc3QsIHZpcnRfdG9fYnVzIChzYy0+bG1jX3J4cmluZykpOyAvKiB3cml0ZSBiYXNlIGFkZHJlc3MgKi8KKworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgdHJhbnNtaXQgcmluZ3MgYW5kIGJ1ZmZlcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTE1DX1RYREVTQ1M7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChzYy0+bG1jX3R4cVtpXSAhPSBOVUxMKXsJCS8qIGhhdmUgYnVmZmVyICovCisgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHNjLT5sbWNfdHhxW2ldKTsJLyogZnJlZSBpdCAqLworICAgICAgICAgICAgc2MtPnN0YXRzLnR4X2Ryb3BwZWQrKzsgICAgICAvKiBXZSBqdXN0IGRyb3BwZWQgYSBwYWNrZXQgKi8KKyAgICAgICAgfQorICAgICAgICBzYy0+bG1jX3R4cVtpXSA9IE5VTEw7CisgICAgICAgIHNjLT5sbWNfdHhyaW5nW2ldLnN0YXR1cyA9IDB4MDAwMDAwMDA7CisgICAgICAgIHNjLT5sbWNfdHhyaW5nW2ldLmJ1ZmZlcjIgPSB2aXJ0X3RvX2J1cyAoJnNjLT5sbWNfdHhyaW5nW2kgKyAxXSk7CisgICAgfQorICAgIHNjLT5sbWNfdHhyaW5nW2kgLSAxXS5idWZmZXIyID0gdmlydF90b19idXMgKCZzYy0+bG1jX3R4cmluZ1swXSk7CisgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl90eGxpc3QsIHZpcnRfdG9fYnVzIChzYy0+bG1jX3R4cmluZykpOworCisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3NvZnRyZXNldCBvdXQiKTsKK30KKwordm9pZCBsbWNfZ3Bpb19ta2lucHV0KGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIHVfaW50MzJfdCBiaXRzKSAvKmZvbGQwMCovCit7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2dwaW9fbWtpbnB1dCBpbiIpOworICAgIHNjLT5sbWNfZ3Bpb19pbyAmPSB+Yml0czsKKyAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfZ3AsIFRVTElQX0dQX1BJTlNFVCB8IChzYy0+bG1jX2dwaW9faW8pKTsKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfZ3Bpb19ta2lucHV0IG91dCIpOworfQorCit2b2lkIGxtY19ncGlvX21rb3V0cHV0KGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIHVfaW50MzJfdCBiaXRzKSAvKmZvbGQwMCovCit7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2dwaW9fbWtvdXRwdXQgaW4iKTsKKyAgICBzYy0+bG1jX2dwaW9faW8gfD0gYml0czsKKyAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfZ3AsIFRVTElQX0dQX1BJTlNFVCB8IChzYy0+bG1jX2dwaW9faW8pKTsKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfZ3Bpb19ta291dHB1dCBvdXQiKTsKK30KKwordm9pZCBsbWNfbGVkX29uKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIHVfaW50MzJfdCBsZWQpIC8qZm9sZDAwKi8KK3sKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfbGVkX29uIGluIik7CisgICAgaWYoKH5zYy0+bG1jX21paXJlZzE2KSAmIGxlZCl7IC8qIEFscmVhZHkgb24hICovCisgICAgICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19sZWRfb24gYW9uIG91dCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIHNjLT5sbWNfbWlpcmVnMTYgJj0gfmxlZDsKKyAgICBsbWNfbWlpX3dyaXRlcmVnKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2xlZF9vbiBvdXQiKTsKK30KKwordm9pZCBsbWNfbGVkX29mZihsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCB1X2ludDMyX3QgbGVkKSAvKmZvbGQwMCovCit7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2xlZF9vZmYgaW4iKTsKKyAgICBpZihzYy0+bG1jX21paXJlZzE2ICYgbGVkKXsgLyogQWxyZWFkeSBzZXQgZG9uJ3QgZG8gYW55dGhpbmcgKi8KKyAgICAgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2xlZF9vZmYgYW9mZiBvdXQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBzYy0+bG1jX21paXJlZzE2IHw9IGxlZDsKKyAgICBsbWNfbWlpX3dyaXRlcmVnKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2xlZF9vZmYgb3V0Iik7Cit9CisKK3N0YXRpYyB2b2lkIGxtY19yZXNldChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKSAvKmZvbGQwMCovCit7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3Jlc2V0IGluIik7CisgICAgc2MtPmxtY19taWlyZWcxNiB8PSBMTUNfTUlJMTZfRklGT19SRVNFVDsKKyAgICBsbWNfbWlpX3dyaXRlcmVnKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7CisKKyAgICBzYy0+bG1jX21paXJlZzE2ICY9IH5MTUNfTUlJMTZfRklGT19SRVNFVDsKKyAgICBsbWNfbWlpX3dyaXRlcmVnKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7CisKKyAgICAvKgorICAgICAqIG1ha2Ugc29tZSBvZiB0aGUgR1BJTyBwaW5zIGJlIG91dHB1dHMKKyAgICAgKi8KKyAgICBsbWNfZ3Bpb19ta291dHB1dChzYywgTE1DX0dFUF9SRVNFVCk7CisKKyAgICAvKgorICAgICAqIFJFU0VUIGxvdyB0byBmb3JjZSBzdGF0ZSByZXNldC4gIFRoaXMgYWxzbyBmb3JjZXMKKyAgICAgKiB0aGUgdHJhbnNtaXR0ZXIgY2xvY2sgdG8gYmUgaW50ZXJuYWwsIGJ1dCB3ZSBleHBlY3QgdG8gcmVzZXQKKyAgICAgKiB0aGF0IGxhdGVyIGFueXdheS4KKyAgICAgKi8KKyAgICBzYy0+bG1jX2dwaW8gJj0gfihMTUNfR0VQX1JFU0VUKTsKKyAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisKKyAgICAvKgorICAgICAqIGhvbGQgZm9yIG1vcmUgdGhhbiAxMCBtaWNyb3NlY29uZHMKKyAgICAgKi8KKyAgICB1ZGVsYXkoNTApOworCisgICAgLyoKKyAgICAgKiBzdG9wIGRyaXZpbmcgWGlsaW54LXJlbGF0ZWQgc2lnbmFscworICAgICAqLworICAgIGxtY19ncGlvX21raW5wdXQoc2MsIExNQ19HRVBfUkVTRVQpOworCisgICAgLyoKKyAgICAgKiBDYWxsIG1lZGlhIHNwZWNpZmljIGluaXQgcm91dGluZQorICAgICAqLworICAgIHNjLT5sbWNfbWVkaWEtPmluaXQoc2MpOworCisgICAgc2MtPnN0YXRzLnJlc2V0Q291bnQrKzsKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcmVzZXQgb3V0Iik7Cit9CisKK3N0YXRpYyB2b2lkIGxtY19kZWNfcmVzZXQobG1jX3NvZnRjX3QgKiBjb25zdCBzYykgLypmb2xkMDAqLworeworICAgIHVfaW50MzJfdCB2YWw7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2RlY19yZXNldCBpbiIpOworCisgICAgLyoKKyAgICAgKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzCisgICAgICovCisgICAgc2MtPmxtY19pbnRybWFzayA9IDA7CisgICAgTE1DX0NTUl9XUklURShzYywgY3NyX2ludHIsIHNjLT5sbWNfaW50cm1hc2spOworCisgICAgLyoKKyAgICAgKiBSZXNldCB0aGUgY2hpcCB3aXRoIGEgc29mdHdhcmUgcmVzZXQgY29tbWFuZC4KKyAgICAgKiBXYWl0IDEwIG1pY3Jvc2Vjb25kcyAoYWN0dWFsbHkgNTAgUENJIGN5Y2xlcyBidXQgYXQKKyAgICAgKiAzM01IeiB0aGF0IGNvbWVzIHRvIHR3byBtaWNyb3NlY29uZHMgYnV0IHdhaXQgYQorICAgICAqIGJpdCBsb25nZXIgYW55d2F5cykKKyAgICAgKi8KKyAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfYnVzbW9kZSwgVFVMSVBfQlVTTU9ERV9TV1JFU0VUKTsKKyAgICB1ZGVsYXkoMjUpOworI2lmZGVmIF9fc3BhcmNfXworICAgIHNjLT5sbWNfYnVzbW9kZSA9IExNQ19DU1JfUkVBRChzYywgY3NyX2J1c21vZGUpOworICAgIHNjLT5sbWNfYnVzbW9kZSA9IDB4MDAxMDAwMDA7CisgICAgc2MtPmxtY19idXNtb2RlICY9IH5UVUxJUF9CVVNNT0RFX1NXUkVTRVQ7CisgICAgTE1DX0NTUl9XUklURShzYywgY3NyX2J1c21vZGUsIHNjLT5sbWNfYnVzbW9kZSk7CisjZW5kaWYKKyAgICBzYy0+bG1jX2NtZG1vZGUgPSBMTUNfQ1NSX1JFQUQoc2MsIGNzcl9jb21tYW5kKTsKKworICAgIC8qCisgICAgICogV2Ugd2FudDoKKyAgICAgKiAgIG5vIGV0aGVybmV0IGFkZHJlc3MgaW4gZnJhbWVzIHdlIHdyaXRlCisgICAgICogICBkaXNhYmxlIHBhZGRpbmcgKHR4ZGVzYywgcGFkZGluZyBkaXNhYmxlKQorICAgICAqICAgaWdub3JlIHJ1bnQgZnJhbWVzIChyZGVzMCBiaXQgMTUpCisgICAgICogICBubyByZWNlaXZlciB3YXRjaGRvZyBvciB0cmFuc21pdHRlciBqYWJiZXIgdGltZXIKKyAgICAgKiAgICAgICAoY3NyMTUgYml0IDAsMTQgPT0gMSkKKyAgICAgKiAgIGlmIHVzaW5nIDE2LWJpdCBDUkMsIHR1cm4gb2ZmIENSQyAodHJhbnMgZGVzYywgY3JjIGRpc2FibGUpCisgICAgICovCisKKyAgICBzYy0+bG1jX2NtZG1vZGUgfD0gKCBUVUxJUF9DTURfUFJPTUlTQ1VPVVMKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IFRVTElQX0NNRF9GVUxMRFVQTEVYCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVUxJUF9DTURfUEFTU0JBRFBLVAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfQ01EX05PSEVBUlRCRUFUCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVUxJUF9DTURfUE9SVFNFTEVDVAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfQ01EX1JFQ0VJVkVBTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IFRVTElQX0NNRF9NVVNUQkVPTkUKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBzYy0+bG1jX2NtZG1vZGUgJj0gfiggVFVMSVBfQ01EX09QRVJNT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfQ01EX1RIUkVTSE9MRENUTAorICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRVTElQX0NNRF9TVE9SRUZXRAorICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRVTElQX0NNRF9UWFRIUlNITERDVEwKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfY29tbWFuZCwgc2MtPmxtY19jbWRtb2RlKTsKKworICAgIC8qCisgICAgICogZGlzYWJsZSByZWNlaXZlciB3YXRjaGRvZyBhbmQgdHJhbnNtaXQgamFiYmVyCisgICAgICovCisgICAgdmFsID0gTE1DX0NTUl9SRUFEKHNjLCBjc3Jfc2lhX2dlbmVyYWwpOworICAgIHZhbCB8PSAoVFVMSVBfV0FUQ0hET0dfVFhESVNBQkxFIHwgVFVMSVBfV0FUQ0hET0dfUlhESVNBQkxFKTsKKyAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3Jfc2lhX2dlbmVyYWwsIHZhbCk7CisKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfZGVjX3Jlc2V0IG91dCIpOworfQorCitzdGF0aWMgdm9pZCBsbWNfaW5pdGNzcnMobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgbG1jX2NzcnB0cl90IGNzcl9iYXNlLCAvKmZvbGQwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNzcl9zaXplKQoreworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19pbml0Y3NycyBpbiIpOworICAgIHNjLT5sbWNfY3Nycy5jc3JfYnVzbW9kZQkgICAgICAgID0gY3NyX2Jhc2UgKyAgMCAqIGNzcl9zaXplOworICAgIHNjLT5sbWNfY3Nycy5jc3JfdHhwb2xsCQk9IGNzcl9iYXNlICsgIDEgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyX3J4cG9sbAkJPSBjc3JfYmFzZSArICAyICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl9yeGxpc3QJCT0gY3NyX2Jhc2UgKyAgMyAqIGNzcl9zaXplOworICAgIHNjLT5sbWNfY3Nycy5jc3JfdHhsaXN0CQk9IGNzcl9iYXNlICsgIDQgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyX3N0YXR1cwkJPSBjc3JfYmFzZSArICA1ICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl9jb21tYW5kCSAgICAgICAgPSBjc3JfYmFzZSArICA2ICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl9pbnRyCQk9IGNzcl9iYXNlICsgIDcgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyX21pc3NlZF9mcmFtZXMJPSBjc3JfYmFzZSArICA4ICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl85CQkgICAgICAgID0gY3NyX2Jhc2UgKyAgOSAqIGNzcl9zaXplOworICAgIHNjLT5sbWNfY3Nycy5jc3JfMTAJCSAgICAgICAgPSBjc3JfYmFzZSArIDEwICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl8xMQkJICAgICAgICA9IGNzcl9iYXNlICsgMTEgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyXzEyCQkgICAgICAgID0gY3NyX2Jhc2UgKyAxMiAqIGNzcl9zaXplOworICAgIHNjLT5sbWNfY3Nycy5jc3JfMTMJCSAgICAgICAgPSBjc3JfYmFzZSArIDEzICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl8xNAkJICAgICAgICA9IGNzcl9iYXNlICsgMTQgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyXzE1CQkgICAgICAgID0gY3NyX2Jhc2UgKyAxNSAqIGNzcl9zaXplOworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19pbml0Y3NycyBvdXQiKTsKK30KKworc3RhdGljIHZvaWQgbG1jX2RyaXZlcl90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsgLypmb2xkMDAqLworICAgIGxtY19zb2Z0Y190ICpzYzsKKyAgICB1MzIgY3NyNjsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19kcml2ZXJfdGltZW91dCBpbiIpOworCisgICAgc2MgPSBkZXYtPnByaXY7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7CisKKyAgICBwcmludGsoIiVzOiBYbWl0dGVyIGJ1c3l8XG4iLCBkZXYtPm5hbWUpOworCisgICAgc2MtPnN0YXRzLnR4X3RidXN5X2NhbGxzKysgOworICAgIGlmIChqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydCA8IFRYX1RJTUVPVVQpIHsKKyAgICAgICAgZ290byBidWdfb3V0OworICAgIH0KKworICAgIC8qCisgICAgICogQ2hpcCBzZWVtcyB0byBoYXZlIGxvY2tlZCB1cAorICAgICAqIFJlc2V0IGl0CisgICAgICogVGhpcyB3aGlwcyBvdXQgYWxsIG91ciBkZWNyaXB0b3IKKyAgICAgKiB0YWJsZSBhbmQgc3RhcnRzIGZyb20gc2NhcnRjaAorICAgICAqLworCisgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfWE1UUFJDVE1PLAorICAgICAgICAgICAgICAgICAgTE1DX0NTUl9SRUFEIChzYywgY3NyX3N0YXR1cyksCisgICAgICAgICAgICAgICAgICBzYy0+c3RhdHMudHhfUHJvY1RpbWVvdXQpOworCisgICAgbG1jX3J1bm5pbmdfcmVzZXQgKGRldik7CisKKyAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9SRVNFVDEsIExNQ19DU1JfUkVBRCAoc2MsIGNzcl9zdGF0dXMpLCAwKTsKKyAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9SRVNFVDIsCisgICAgICAgICAgICAgICAgICBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNiksCisgICAgICAgICAgICAgICAgICBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNykpOworCisgICAgLyogcmVzdGFydCB0aGUgdHggcHJvY2Vzc2VzICovCisgICAgY3NyNiA9IExNQ19DU1JfUkVBRCAoc2MsIGNzcl9jb21tYW5kKTsKKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2NvbW1hbmQsIGNzcjYgfCAweDAwMDIpOworICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfY29tbWFuZCwgY3NyNiB8IDB4MjAwMik7CisKKyAgICAvKiBpbW1lZGlhdGUgdHJhbnNtaXQgKi8KKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX3R4cG9sbCwgMCk7CisKKyAgICBzYy0+c3RhdHMudHhfZXJyb3JzKys7CisgICAgc2MtPnN0YXRzLnR4X1Byb2NUaW1lb3V0Kys7CS8qIC1iYXogKi8KKworICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCitidWdfb3V0OgorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2RyaXZlcl90aW1vdXQgb3V0Iik7CisKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWVkaWEuYyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21lZGlhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1Y2U3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21lZGlhLmMKQEAgLTAsMCArMSwxMjQ2IEBACisvKiAkSWQ6IGxtY19tZWRpYS5jLHYgMS4xMyAyMDAwLzA0LzExIDA1OjI1OjI2IGFzaiBFeHAgJCAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8bmV0L3N5bmNwcHAuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4gICAgICAgICAgICAgLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAibG1jLmgiCisjaW5jbHVkZSAibG1jX3Zhci5oIgorI2luY2x1ZGUgImxtY19pb2N0bC5oIgorI2luY2x1ZGUgImxtY19kZWJ1Zy5oIgorCisjZGVmaW5lIENPTkZJR19MTUNfSUdOT1JFX0hBUkRXQVJFX0hBTkRTSEFLRSAxCisKKyAvKgorICAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAwIExBTiBNZWRpYSBDb3Jwb3JhdGlvbiAoTE1DKQorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICB3d3cubGFubWVkaWEuY29tCisgICoKKyAgKiBUaGlzIGNvZGUgaXMgd3JpdHRlbiBieToKKyAgKiBBbmRyZXcgU3RhbmxleS1Kb25lcyAoYXNqQGNiYW4uY29tKQorICAqIFJvYiBCcmF1biAoYmJyYXVuQHZpeC5jb20pLAorICAqIE1pY2hhZWwgR3JhZmYgKGV4cGxvcmVyQHZpeC5jb20pIGFuZAorICAqIE1hdHQgVGhvbWFzIChtYXR0QDNhbS1zb2Z0d2FyZS5jb20pLgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAqLworCisvKgorICogRm9yIGxhY2sgb2YgYSBiZXR0ZXIgcGxhY2UsIHB1dCB0aGUgU1NJIGNhYmxlIHN0dWZmIGhlcmUuCisgKi8KK2NoYXIgKmxtY190MV9jYWJsZXNbXSA9IHsKKyAgIlYuMTAvUlM0MjMiLCAiRUlBNTMwQSIsICJyZXNlcnZlZCIsICJYLjIxIiwgIlYuMzUiLAorICAiRUlBNDQ5L0VJQTUzMC9WLjM2IiwgIlYuMjgvRUlBMjMyIiwgIm5vbmUiLCBOVUxMCit9OworCisvKgorICogcHJvdG9jb2wgaW5kZXBlbmRlbnQgbWV0aG9kLgorICovCitzdGF0aWMgdm9pZCBsbWNfc2V0X3Byb3RvY29sIChsbWNfc29mdGNfdCAqIGNvbnN0LCBsbWNfY3RsX3QgKik7CisKKy8qCisgKiBtZWRpYSBpbmRlcGVuZGVudCBtZXRob2RzIHRvIGNoZWNrIG9uIG1lZGlhIHN0YXR1cywgbGluaywgbGlnaHQgTEVEcywKKyAqIGV0Yy4KKyAqLworc3RhdGljIHZvaWQgbG1jX2RzM19pbml0IChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY19kczNfZGVmYXVsdCAobG1jX3NvZnRjX3QgKiBjb25zdCk7CitzdGF0aWMgdm9pZCBsbWNfZHMzX3NldF9zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3QsIGxtY19jdGxfdCAqKTsKK3N0YXRpYyB2b2lkIGxtY19kczNfc2V0XzEwMGZ0IChsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworc3RhdGljIGludCBsbWNfZHMzX2dldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCk7CitzdGF0aWMgdm9pZCBsbWNfZHMzX3NldF9jcmNfbGVuZ3RoIChsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworc3RhdGljIHZvaWQgbG1jX2RzM19zZXRfc2NyYW0gKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CitzdGF0aWMgdm9pZCBsbWNfZHMzX3dhdGNoZG9nIChsbWNfc29mdGNfdCAqIGNvbnN0KTsKKworc3RhdGljIHZvaWQgbG1jX2hzc2lfaW5pdCAobG1jX3NvZnRjX3QgKiBjb25zdCk7CitzdGF0aWMgdm9pZCBsbWNfaHNzaV9kZWZhdWx0IChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY19oc3NpX3NldF9zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3QsIGxtY19jdGxfdCAqKTsKK3N0YXRpYyB2b2lkIGxtY19oc3NpX3NldF9jbG9jayAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyBpbnQgbG1jX2hzc2lfZ2V0X2xpbmtfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY19oc3NpX3NldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyB2b2lkIGxtY19oc3NpX3NldF9jcmNfbGVuZ3RoIChsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworc3RhdGljIHZvaWQgbG1jX2hzc2lfd2F0Y2hkb2cgKGxtY19zb2Z0Y190ICogY29uc3QpOworCitzdGF0aWMgdm9pZCBsbWNfc3NpX2luaXQgKGxtY19zb2Z0Y190ICogY29uc3QpOworc3RhdGljIHZvaWQgbG1jX3NzaV9kZWZhdWx0IChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY19zc2lfc2V0X3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCwgbG1jX2N0bF90ICopOworc3RhdGljIHZvaWQgbG1jX3NzaV9zZXRfY2xvY2sgKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CitzdGF0aWMgdm9pZCBsbWNfc3NpX3NldF9zcGVlZCAobG1jX3NvZnRjX3QgKiBjb25zdCwgbG1jX2N0bF90ICopOworc3RhdGljIGludCBsbWNfc3NpX2dldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCk7CitzdGF0aWMgdm9pZCBsbWNfc3NpX3NldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyB2b2lkIGxtY19zc2lfc2V0X2NyY19sZW5ndGggKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CitzdGF0aWMgdm9pZCBsbWNfc3NpX3dhdGNoZG9nIChsbWNfc29mdGNfdCAqIGNvbnN0KTsKKworc3RhdGljIHZvaWQgbG1jX3QxX2luaXQgKGxtY19zb2Z0Y190ICogY29uc3QpOworc3RhdGljIHZvaWQgbG1jX3QxX2RlZmF1bHQgKGxtY19zb2Z0Y190ICogY29uc3QpOworc3RhdGljIHZvaWQgbG1jX3QxX3NldF9zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3QsIGxtY19jdGxfdCAqKTsKK3N0YXRpYyBpbnQgbG1jX3QxX2dldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCk7CitzdGF0aWMgdm9pZCBsbWNfdDFfc2V0X2NpcmN1aXRfdHlwZSAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyB2b2lkIGxtY190MV9zZXRfY3JjX2xlbmd0aCAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyB2b2lkIGxtY190MV9zZXRfY2xvY2sgKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CitzdGF0aWMgdm9pZCBsbWNfdDFfd2F0Y2hkb2cgKGxtY19zb2Z0Y190ICogY29uc3QpOworCitzdGF0aWMgdm9pZCBsbWNfZHVtbXlfc2V0XzEgKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CitzdGF0aWMgdm9pZCBsbWNfZHVtbXlfc2V0Ml8xIChsbWNfc29mdGNfdCAqIGNvbnN0LCBsbWNfY3RsX3QgKik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9hdjkxMTBfYml0IChsbWNfc29mdGNfdCAqLCBpbnQpOworc3RhdGljIHZvaWQgd3JpdGVfYXY5MTEwIChsbWNfc29mdGNfdCAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCwgdV9pbnQzMl90LAorCQkJICB1X2ludDMyX3QsIHVfaW50MzJfdCk7CisKK2xtY19tZWRpYV90IGxtY19kczNfbWVkaWEgPSB7CisgIGxtY19kczNfaW5pdCwJCQkvKiBzcGVjaWFsIG1lZGlhIGluaXQgc3R1ZmYgKi8KKyAgbG1jX2RzM19kZWZhdWx0LAkJLyogcmVzZXQgdG8gZGVmYXVsdCBzdGF0ZSAqLworICBsbWNfZHMzX3NldF9zdGF0dXMsCQkvKiByZXNldCBzdGF0dXMgdG8gc3RhdGUgcHJvdmlkZWQgKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IGNsb2NrIHNvdXJjZSAqLworICBsbWNfZHVtbXlfc2V0Ml8xLAkJLyogc2V0IGxpbmUgc3BlZWQgKi8KKyAgbG1jX2RzM19zZXRfMTAwZnQsCQkvKiBzZXQgY2FibGUgbGVuZ3RoICovCisgIGxtY19kczNfc2V0X3NjcmFtLAkJLyogc2V0IHNjcmFtYmxlciAqLworICBsbWNfZHMzX2dldF9saW5rX3N0YXR1cywJLyogZ2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBsaW5rIHN0YXR1cyAqLworICBsbWNfZHMzX3NldF9jcmNfbGVuZ3RoLAkvKiBzZXQgQ1JDIGxlbmd0aCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgVDEgb3IgRTEgY2lyY3VpdCB0eXBlICovCisgIGxtY19kczNfd2F0Y2hkb2cKK307CisKK2xtY19tZWRpYV90IGxtY19oc3NpX21lZGlhID0geworICBsbWNfaHNzaV9pbml0LAkJLyogc3BlY2lhbCBtZWRpYSBpbml0IHN0dWZmICovCisgIGxtY19oc3NpX2RlZmF1bHQsCQkvKiByZXNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIGxtY19oc3NpX3NldF9zdGF0dXMsCQkvKiByZXNldCBzdGF0dXMgdG8gc3RhdGUgcHJvdmlkZWQgKi8KKyAgbG1jX2hzc2lfc2V0X2Nsb2NrLAkJLyogc2V0IGNsb2NrIHNvdXJjZSAqLworICBsbWNfZHVtbXlfc2V0Ml8xLAkJLyogc2V0IGxpbmUgc3BlZWQgKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IGNhYmxlIGxlbmd0aCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgc2NyYW1ibGVyICovCisgIGxtY19oc3NpX2dldF9saW5rX3N0YXR1cywJLyogZ2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19oc3NpX3NldF9saW5rX3N0YXR1cywJLyogc2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19oc3NpX3NldF9jcmNfbGVuZ3RoLAkvKiBzZXQgQ1JDIGxlbmd0aCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgVDEgb3IgRTEgY2lyY3VpdCB0eXBlICovCisgIGxtY19oc3NpX3dhdGNoZG9nCit9OworCitsbWNfbWVkaWFfdCBsbWNfc3NpX21lZGlhID0geyBsbWNfc3NpX2luaXQsCS8qIHNwZWNpYWwgbWVkaWEgaW5pdCBzdHVmZiAqLworICBsbWNfc3NpX2RlZmF1bHQsCQkvKiByZXNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIGxtY19zc2lfc2V0X3N0YXR1cywJCS8qIHJlc2V0IHN0YXR1cyB0byBzdGF0ZSBwcm92aWRlZCAqLworICBsbWNfc3NpX3NldF9jbG9jaywJCS8qIHNldCBjbG9jayBzb3VyY2UgKi8KKyAgbG1jX3NzaV9zZXRfc3BlZWQsCQkvKiBzZXQgbGluZSBzcGVlZCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgY2FibGUgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBzY3JhbWJsZXIgKi8KKyAgbG1jX3NzaV9nZXRfbGlua19zdGF0dXMsCS8qIGdldCBsaW5rIHN0YXR1cyAqLworICBsbWNfc3NpX3NldF9saW5rX3N0YXR1cywJLyogc2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19zc2lfc2V0X2NyY19sZW5ndGgsCS8qIHNldCBDUkMgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBUMSBvciBFMSBjaXJjdWl0IHR5cGUgKi8KKyAgbG1jX3NzaV93YXRjaGRvZworfTsKKworbG1jX21lZGlhX3QgbG1jX3QxX21lZGlhID0geworICBsbWNfdDFfaW5pdCwJCQkvKiBzcGVjaWFsIG1lZGlhIGluaXQgc3R1ZmYgKi8KKyAgbG1jX3QxX2RlZmF1bHQsCQkvKiByZXNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIGxtY190MV9zZXRfc3RhdHVzLAkJLyogcmVzZXQgc3RhdHVzIHRvIHN0YXRlIHByb3ZpZGVkICovCisgIGxtY190MV9zZXRfY2xvY2ssCQkvKiBzZXQgY2xvY2sgc291cmNlICovCisgIGxtY19kdW1teV9zZXQyXzEsCQkvKiBzZXQgbGluZSBzcGVlZCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgY2FibGUgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBzY3JhbWJsZXIgKi8KKyAgbG1jX3QxX2dldF9saW5rX3N0YXR1cywJLyogZ2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBsaW5rIHN0YXR1cyAqLworICBsbWNfdDFfc2V0X2NyY19sZW5ndGgsCS8qIHNldCBDUkMgbGVuZ3RoICovCisgIGxtY190MV9zZXRfY2lyY3VpdF90eXBlLAkvKiBzZXQgVDEgb3IgRTEgY2lyY3VpdCB0eXBlICovCisgIGxtY190MV93YXRjaGRvZworfTsKKworc3RhdGljIHZvaWQKK2xtY19kdW1teV9zZXRfMSAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IGEpCit7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfZHVtbXlfc2V0Ml8xIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBsbWNfY3RsX3QgKiBhKQoreworfQorCisvKgorICogIEhTU0kgbWV0aG9kcworICovCisKK3N0YXRpYyB2b2lkCitsbWNfaHNzaV9pbml0IChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworICBzYy0+aWN0bC5jYXJkdHlwZSA9IExNQ19DVExfQ0FSRFRZUEVfTE1DNTIwMDsKKworICBsbWNfZ3Bpb19ta291dHB1dCAoc2MsIExNQ19HRVBfSFNTSV9DTE9DSyk7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfaHNzaV9kZWZhdWx0IChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworICBzYy0+bG1jX21paXJlZzE2ID0gTE1DX01JSTE2X0xFRF9BTEw7CisKKyAgc2MtPmxtY19tZWRpYS0+c2V0X2xpbmtfc3RhdHVzIChzYywgTE1DX0xJTktfRE9XTik7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9jbG9ja19zb3VyY2UgKHNjLCBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9FWFQpOworICBzYy0+bG1jX21lZGlhLT5zZXRfY3JjX2xlbmd0aCAoc2MsIExNQ19DVExfQ1JDX0xFTkdUSF8xNik7Cit9CisKKy8qCisgKiBHaXZlbiBhIHVzZXIgcHJvdmlkZWQgc3RhdGUsIHNldCBvdXJzZWx2ZXMgdXAgdG8gbWF0Y2ggaXQuICBUaGlzIHdpbGwKKyAqIGFsd2F5cyByZXNldCB0aGUgY2FyZCBpZiBuZWVkZWQuCisgKi8KK3N0YXRpYyB2b2lkCitsbWNfaHNzaV9zZXRfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBsbWNfY3RsX3QgKiBjdGwpCit7CisgIGlmIChjdGwgPT0gTlVMTCkKKyAgICB7CisgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfY2xvY2tfc291cmNlIChzYywgc2MtPmljdGwuY2xvY2tfc291cmNlKTsKKyAgICAgIGxtY19zZXRfcHJvdG9jb2wgKHNjLCBOVUxMKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKgorICAgKiBjaGVjayBmb3IgY2hhbmdlIGluIGNsb2NrIHNvdXJjZQorICAgKi8KKyAgaWYgKGN0bC0+Y2xvY2tfc291cmNlICYmICFzYy0+aWN0bC5jbG9ja19zb3VyY2UpCisgICAgeworICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X2Nsb2NrX3NvdXJjZSAoc2MsIExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVCk7CisgICAgICBzYy0+bG1jX3RpbWluZyA9IExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVDsKKyAgICB9CisgIGVsc2UgaWYgKCFjdGwtPmNsb2NrX3NvdXJjZSAmJiBzYy0+aWN0bC5jbG9ja19zb3VyY2UpCisgICAgeworICAgICAgc2MtPmxtY190aW1pbmcgPSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9FWFQ7CisgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfY2xvY2tfc291cmNlIChzYywgTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUKTsKKyAgICB9CisKKyAgbG1jX3NldF9wcm90b2NvbCAoc2MsIGN0bCk7Cit9CisKKy8qCisgKiAxID09IGludGVybmFsLCAwID09IGV4dGVybmFsCisgKi8KK3N0YXRpYyB2b2lkCitsbWNfaHNzaV9zZXRfY2xvY2sgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGludCBpZSkKK3sKKyAgaW50IG9sZDsKKyAgb2xkID0gc2MtPmljdGwuY2xvY2tfc291cmNlOworICBpZiAoaWUgPT0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUKQorICAgIHsKKyAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0hTU0lfQ0xPQ0s7CisgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworICAgICAgc2MtPmljdGwuY2xvY2tfc291cmNlID0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUOworICAgICAgaWYob2xkICE9IGllKQorICAgICAgICBwcmludGsgKExNQ19QUklOVEZfRk1UICI6IGNsb2NrIGV4dGVybmFsXG4iLCBMTUNfUFJJTlRGX0FSR1MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNjLT5sbWNfZ3BpbyAmPSB+KExNQ19HRVBfSFNTSV9DTE9DSyk7CisgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworICAgICAgc2MtPmljdGwuY2xvY2tfc291cmNlID0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfSU5UOworICAgICAgaWYob2xkICE9IGllKQorICAgICAgICBwcmludGsgKExNQ19QUklOVEZfRk1UICI6IGNsb2NrIGludGVybmFsXG4iLCBMTUNfUFJJTlRGX0FSR1MpOworICAgIH0KK30KKworLyoKKyAqIHJldHVybiBoYXJkd2FyZSBsaW5rIHN0YXR1cy4KKyAqIDAgPT0gbGluayBpcyBkb3duLCAxID09IGxpbmsgaXMgdXAuCisgKi8KK3N0YXRpYyBpbnQKK2xtY19oc3NpX2dldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykKK3sKKyAgICAvKgorICAgICAqIFdlJ3JlIHVzaW5nIHRoZSBzYW1lIGNvZGUgYXMgU1NJIHNpbmNlCisgICAgICogdGhleSdyZSBwcmFjdGljYWxseSB0aGUgc2FtZQorICAgICAqLworICAgIHJldHVybiBsbWNfc3NpX2dldF9saW5rX3N0YXR1cyhzYyk7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfaHNzaV9zZXRfbGlua19zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGludCBzdGF0ZSkKK3sKKyAgaWYgKHN0YXRlID09IExNQ19MSU5LX1VQKQorICAgIHNjLT5sbWNfbWlpcmVnMTYgfD0gTE1DX01JSTE2X0hTU0lfVEE7CisgIGVsc2UKKyAgICBzYy0+bG1jX21paXJlZzE2ICY9IH5MTUNfTUlJMTZfSFNTSV9UQTsKKworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTYsIHNjLT5sbWNfbWlpcmVnMTYpOworfQorCisvKgorICogMCA9PSAxNmJpdCwgMSA9PSAzMmJpdAorICovCitzdGF0aWMgdm9pZAorbG1jX2hzc2lfc2V0X2NyY19sZW5ndGggKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGludCBzdGF0ZSkKK3sKKyAgaWYgKHN0YXRlID09IExNQ19DVExfQ1JDX0xFTkdUSF8zMikKKyAgICB7CisgICAgICAvKiAzMiBiaXQgKi8KKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgfD0gTE1DX01JSTE2X0hTU0lfQ1JDOworICAgICAgc2MtPmljdGwuY3JjX2xlbmd0aCA9IExNQ19DVExfQ1JDX0xFTkdUSF8zMjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiAxNiBiaXQgKi8KKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgJj0gfkxNQ19NSUkxNl9IU1NJX0NSQzsKKyAgICAgIHNjLT5pY3RsLmNyY19sZW5ndGggPSBMTUNfQ1RMX0NSQ19MRU5HVEhfMTY7CisgICAgfQorCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfaHNzaV93YXRjaGRvZyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykKK3sKKyAgLyogSFNTSSBpcyBibGFuayAqLworfQorCisvKgorICogIERTMyBtZXRob2RzCisgKi8KKworLyoKKyAqIFNldCBjYWJsZSBsZW5ndGgKKyAqLworc3RhdGljIHZvaWQKK2xtY19kczNfc2V0XzEwMGZ0IChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgaWUpCit7CisgIGlmIChpZSA9PSBMTUNfQ1RMX0NBQkxFX0xFTkdUSF9HVF8xMDBGVCkKKyAgICB7CisgICAgICBzYy0+bG1jX21paXJlZzE2ICY9IH5MTUNfTUlJMTZfRFMzX1pFUk87CisgICAgICBzYy0+aWN0bC5jYWJsZV9sZW5ndGggPSBMTUNfQ1RMX0NBQkxFX0xFTkdUSF9HVF8xMDBGVDsKKyAgICB9CisgIGVsc2UgaWYgKGllID09IExNQ19DVExfQ0FCTEVfTEVOR1RIX0xUXzEwMEZUKQorICAgIHsKKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgfD0gTE1DX01JSTE2X0RTM19aRVJPOworICAgICAgc2MtPmljdGwuY2FibGVfbGVuZ3RoID0gTE1DX0NUTF9DQUJMRV9MRU5HVEhfTFRfMTAwRlQ7CisgICAgfQorICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTYsIHNjLT5sbWNfbWlpcmVnMTYpOworfQorCitzdGF0aWMgdm9pZAorbG1jX2RzM19kZWZhdWx0IChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworICBzYy0+bG1jX21paXJlZzE2ID0gTE1DX01JSTE2X0xFRF9BTEw7CisKKyAgc2MtPmxtY19tZWRpYS0+c2V0X2xpbmtfc3RhdHVzIChzYywgTE1DX0xJTktfRE9XTik7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9jYWJsZV9sZW5ndGggKHNjLCBMTUNfQ1RMX0NBQkxFX0xFTkdUSF9MVF8xMDBGVCk7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9zY3JhbWJsZXIgKHNjLCBMTUNfQ1RMX09GRik7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9jcmNfbGVuZ3RoIChzYywgTE1DX0NUTF9DUkNfTEVOR1RIXzE2KTsKK30KKworLyoKKyAqIEdpdmVuIGEgdXNlciBwcm92aWRlZCBzdGF0ZSwgc2V0IG91cnNlbHZlcyB1cCB0byBtYXRjaCBpdC4gIFRoaXMgd2lsbAorICogYWx3YXlzIHJlc2V0IHRoZSBjYXJkIGlmIG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQKK2xtY19kczNfc2V0X3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgbG1jX2N0bF90ICogY3RsKQoreworICBpZiAoY3RsID09IE5VTEwpCisgICAgeworICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X2NhYmxlX2xlbmd0aCAoc2MsIHNjLT5pY3RsLmNhYmxlX2xlbmd0aCk7CisgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfc2NyYW1ibGVyIChzYywgc2MtPmljdGwuc2NyYW1ibGVyX29ub2ZmKTsKKyAgICAgIGxtY19zZXRfcHJvdG9jb2wgKHNjLCBOVUxMKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKgorICAgKiBjaGVjayBmb3IgY2hhbmdlIGluIGNhYmxlIGxlbmd0aCBzZXR0aW5nCisgICAqLworICBpZiAoY3RsLT5jYWJsZV9sZW5ndGggJiYgIXNjLT5pY3RsLmNhYmxlX2xlbmd0aCkKKyAgICBsbWNfZHMzX3NldF8xMDBmdCAoc2MsIExNQ19DVExfQ0FCTEVfTEVOR1RIX0dUXzEwMEZUKTsKKyAgZWxzZSBpZiAoIWN0bC0+Y2FibGVfbGVuZ3RoICYmIHNjLT5pY3RsLmNhYmxlX2xlbmd0aCkKKyAgICBsbWNfZHMzX3NldF8xMDBmdCAoc2MsIExNQ19DVExfQ0FCTEVfTEVOR1RIX0xUXzEwMEZUKTsKKworICAvKgorICAgKiBDaGVjayBmb3IgY2hhbmdlIGluIHNjcmFtYmxlciBzZXR0aW5nIChyZXF1aXJlcyByZXNldCkKKyAgICovCisgIGlmIChjdGwtPnNjcmFtYmxlcl9vbm9mZiAmJiAhc2MtPmljdGwuc2NyYW1ibGVyX29ub2ZmKQorICAgIGxtY19kczNfc2V0X3NjcmFtIChzYywgTE1DX0NUTF9PTik7CisgIGVsc2UgaWYgKCFjdGwtPnNjcmFtYmxlcl9vbm9mZiAmJiBzYy0+aWN0bC5zY3JhbWJsZXJfb25vZmYpCisgICAgbG1jX2RzM19zZXRfc2NyYW0gKHNjLCBMTUNfQ1RMX09GRik7CisKKyAgbG1jX3NldF9wcm90b2NvbCAoc2MsIGN0bCk7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfZHMzX2luaXQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgIGludCBpOworCisgIHNjLT5pY3RsLmNhcmR0eXBlID0gTE1DX0NUTF9DQVJEVFlQRV9MTUM1MjQ1OworCisgIC8qIHdyaXRlcyB6ZXJvcyBldmVyeXdoZXJlICovCisgIGZvciAoaSA9IDA7IGkgPCAyMTsgaSsrKQorICAgIHsKKyAgICAgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgaSk7CisgICAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTgsIDApOworICAgIH0KKworICAvKiBzZXQgc29tZSBlc3NlbnRpYWwgYml0cyAqLworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIDEpOworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTgsIDB4MjUpOwkvKiBzZXIsIHh0eCAqLworCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgNSk7CisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxOCwgMHg4MCk7CS8qIGVtb2RlICovCisKKyAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCAxNCk7CisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxOCwgMHgzMCk7CS8qIHJjZ2VuLCB0Y2dlbiAqLworCisgIC8qIGNsZWFyIGNvdW50ZXJzIGFuZCBsYXRjaGVkIGJpdHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IDIxOyBpKyspCisgICAgeworICAgICAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCBpKTsKKyAgICAgIGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE4KTsKKyAgICB9Cit9CisKKy8qCisgKiAxID09IERTMyBwYXlsb2FkIHNjcmFtYmxlZCwgMCA9PSBub3Qgc2NyYW1ibGVkCisgKi8KK3N0YXRpYyB2b2lkCitsbWNfZHMzX3NldF9zY3JhbSAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IGllKQoreworICBpZiAoaWUgPT0gTE1DX0NUTF9PTikKKyAgICB7CisgICAgICBzYy0+bG1jX21paXJlZzE2IHw9IExNQ19NSUkxNl9EUzNfU0NSQU07CisgICAgICBzYy0+aWN0bC5zY3JhbWJsZXJfb25vZmYgPSBMTUNfQ1RMX09OOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgJj0gfkxNQ19NSUkxNl9EUzNfU0NSQU07CisgICAgICBzYy0+aWN0bC5zY3JhbWJsZXJfb25vZmYgPSBMTUNfQ1RMX09GRjsKKyAgICB9CisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7Cit9CisKKy8qCisgKiByZXR1cm4gaGFyZHdhcmUgbGluayBzdGF0dXMuCisgKiAwID09IGxpbmsgaXMgZG93biwgMSA9PSBsaW5rIGlzIHVwLgorICovCitzdGF0aWMgaW50CitsbWNfZHMzX2dldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykKK3sKKyAgICB1X2ludDE2X3QgbGlua19zdGF0dXMsIGxpbmtfc3RhdHVzXzExOworICAgIGludCByZXQgPSAxOworCisgICAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCA3KTsKKyAgICBsaW5rX3N0YXR1cyA9IGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE4KTsKKworICAgIC8qIExNQzUyNDUgKERTMykgJiBMTUMxMjAwIChEUzEpIExFRCBkZWZpbml0aW9ucworICAgICAqIGxlZDAgeWVsbG93ID0gZmFyLWVuZCBhZGFwdGVyIGlzIGluIFJlZCBhbGFybSBjb25kaXRpb24KKyAgICAgKiBsZWQxIGJsdWUgICA9IHJlY2VpdmVkIGFuIEFsYXJtIEluZGljYXRpb24gc2lnbmFsCisgICAgICogICAgICAgICAgICAgICAodXBzdHJlYW0gZmFpbHVyZSkKKyAgICAgKiBsZWQyIEdyZWVuICA9IHBvd2VyIHRvIGFkYXB0ZXIsIEdhdGUgQXJyYXkgbG9hZGVkICYgZHJpdmVyCisgICAgICogICAgICAgICAgICAgICBhdHRhY2hlZAorICAgICAqIGxlZDMgcmVkICAgID0gTG9zcyBvZiBTaWduYWwgKExPUykgb3Igb3V0IG9mIGZyYW1lIChPT0YpCisgICAgICogICAgICAgICAgICAgICBjb25kaXRpb25zIGRldGVjdGVkIG9uIFQzIHJlY2VpdmUgc2lnbmFsCisgICAgICovCisKKyAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDIpOworCisgICAgaWYgKChsaW5rX3N0YXR1cyAmIExNQ19GUkFNRVJfUkVHMF9ETE9TKSB8fAorICAgICAgICAobGlua19zdGF0dXMgJiBMTUNfRlJBTUVSX1JFRzBfT09GUykpeworICAgICAgICByZXQgPSAwOworICAgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzNdICE9IDEpeworICAgICAgICAgICAgdTE2IHIxOworICAgICAgICAgICAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCAwMSk7IC8qIFR1cm4gb24gWGJpdCBlcnJvciBhcyBvdXIgY2lzY28gZG9lcyAqLworICAgICAgICAgICAgcjEgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxOCk7CisgICAgICAgICAgICByMSAmPSAweGZlOworICAgICAgICAgICAgbG1jX21paV93cml0ZXJlZyhzYywgMCwgMTgsIHIxKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWQgQWxhcm0gLSBMb3NzIG9mIFNpZ25hbCBvciBMb3NzIG9mIEZyYW1pbmdcbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDMpOwkvKiB0dXJuIG9uIHJlZCBMRUQgKi8KKyAgICAgICAgc2MtPmxhc3RfbGVkX2VyclszXSA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsbWNfbGVkX29mZihzYywgTE1DX0RTM19MRUQzKTsJLyogdHVybiBvbiByZWQgTEVEICovCisgICAgICAgIGlmKHNjLT5sYXN0X2xlZF9lcnJbM10gPT0gMSl7CisgICAgICAgICAgICB1MTYgcjE7CisgICAgICAgICAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIDAxKTsgLyogVHVybiBvZmYgWGJpdCBlcnJvciAqLworICAgICAgICAgICAgcjEgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxOCk7CisgICAgICAgICAgICByMSB8PSAweDAxOworICAgICAgICAgICAgbG1jX21paV93cml0ZXJlZyhzYywgMCwgMTgsIHIxKTsKKyAgICAgICAgfQorICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzNdID0gMDsKKyAgICB9CisKKyAgICBsbWNfbWlpX3dyaXRlcmVnKHNjLCAwLCAxNywgMHgxMCk7CisgICAgbGlua19zdGF0dXNfMTEgPSBsbWNfbWlpX3JlYWRyZWcoc2MsIDAsIDE4KTsKKyAgICBpZigobGlua19zdGF0dXMgJiBMTUNfRlJBTUVSX1JFRzBfQUlTKSB8fAorICAgICAgIChsaW5rX3N0YXR1c18xMSAmIExNQ19GUkFNRVJfUkVHMTBfWEJJVCkpIHsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclswXSAhPSAxKXsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBSVMgQWxhcm0gb3IgWEJpdCBFcnJvclxuIiwgc2MtPm5hbWUpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlbW90ZSBlbmQgaGFzIGxvc3Mgb2Ygc2lnbmFsIG9yIGZyYW1pbmdcbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDApOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzBdID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDApOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzBdID0gMDsKKyAgICB9CisKKyAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIDkpOworICAgIGxpbmtfc3RhdHVzID0gbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTgpOworICAgIAorICAgIGlmKGxpbmtfc3RhdHVzICYgTE1DX0ZSQU1FUl9SRUc5X1JCTFVFKXsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclsxXSAhPSAxKXsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCbHVlIEFsYXJtIC0gUmVjZWl2aW5nIGFsbCAxJ3NcbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDEpOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzFdID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDEpOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzFdID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogMCA9PSAxNmJpdCwgMSA9PSAzMmJpdAorICovCitzdGF0aWMgdm9pZAorbG1jX2RzM19zZXRfY3JjX2xlbmd0aCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IHN0YXRlKQoreworICBpZiAoc3RhdGUgPT0gTE1DX0NUTF9DUkNfTEVOR1RIXzMyKQorICAgIHsKKyAgICAgIC8qIDMyIGJpdCAqLworICAgICAgc2MtPmxtY19taWlyZWcxNiB8PSBMTUNfTUlJMTZfRFMzX0NSQzsKKyAgICAgIHNjLT5pY3RsLmNyY19sZW5ndGggPSBMTUNfQ1RMX0NSQ19MRU5HVEhfMzI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogMTYgYml0ICovCisgICAgICBzYy0+bG1jX21paXJlZzE2ICY9IH5MTUNfTUlJMTZfRFMzX0NSQzsKKyAgICAgIHNjLT5pY3RsLmNyY19sZW5ndGggPSBMTUNfQ1RMX0NSQ19MRU5HVEhfMTY7CisgICAgfQorCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfZHMzX3dhdGNoZG9nIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworICAgIAorfQorCisKKy8qCisgKiAgU1NJIG1ldGhvZHMKKyAqLworCitzdGF0aWMgdm9pZAorbG1jX3NzaV9pbml0IChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworICB1X2ludDE2X3QgbWlpMTc7CisgIGludCBjYWJsZTsKKworICBzYy0+aWN0bC5jYXJkdHlwZSA9IExNQ19DVExfQ0FSRFRZUEVfTE1DMTAwMDsKKworICBtaWkxNyA9IGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE3KTsKKworICBjYWJsZSA9IChtaWkxNyAmIExNQ19NSUkxN19TU0lfQ0FCTEVfTUFTSykgPj4gTE1DX01JSTE3X1NTSV9DQUJMRV9TSElGVDsKKyAgc2MtPmljdGwuY2FibGVfdHlwZSA9IGNhYmxlOworCisgIGxtY19ncGlvX21rb3V0cHV0IChzYywgTE1DX0dFUF9TU0lfVFhDTE9DSyk7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfc3NpX2RlZmF1bHQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgIHNjLT5sbWNfbWlpcmVnMTYgPSBMTUNfTUlJMTZfTEVEX0FMTDsKKworICAvKgorICAgKiBtYWtlIFRYQ0xPQ0sgYWx3YXlzIGJlIGFuIG91dHB1dAorICAgKi8KKyAgbG1jX2dwaW9fbWtvdXRwdXQgKHNjLCBMTUNfR0VQX1NTSV9UWENMT0NLKTsKKworICBzYy0+bG1jX21lZGlhLT5zZXRfbGlua19zdGF0dXMgKHNjLCBMTUNfTElOS19ET1dOKTsKKyAgc2MtPmxtY19tZWRpYS0+c2V0X2Nsb2NrX3NvdXJjZSAoc2MsIExNQ19DVExfQ0xPQ0tfU09VUkNFX0VYVCk7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9zcGVlZCAoc2MsIE5VTEwpOworICBzYy0+bG1jX21lZGlhLT5zZXRfY3JjX2xlbmd0aCAoc2MsIExNQ19DVExfQ1JDX0xFTkdUSF8xNik7Cit9CisKKy8qCisgKiBHaXZlbiBhIHVzZXIgcHJvdmlkZWQgc3RhdGUsIHNldCBvdXJzZWx2ZXMgdXAgdG8gbWF0Y2ggaXQuICBUaGlzIHdpbGwKKyAqIGFsd2F5cyByZXNldCB0aGUgY2FyZCBpZiBuZWVkZWQuCisgKi8KK3N0YXRpYyB2b2lkCitsbWNfc3NpX3NldF9zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGxtY19jdGxfdCAqIGN0bCkKK3sKKyAgaWYgKGN0bCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHNjLT5sbWNfbWVkaWEtPnNldF9jbG9ja19zb3VyY2UgKHNjLCBzYy0+aWN0bC5jbG9ja19zb3VyY2UpOworICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X3NwZWVkIChzYywgJnNjLT5pY3RsKTsKKyAgICAgIGxtY19zZXRfcHJvdG9jb2wgKHNjLCBOVUxMKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKgorICAgKiBjaGVjayBmb3IgY2hhbmdlIGluIGNsb2NrIHNvdXJjZQorICAgKi8KKyAgaWYgKGN0bC0+Y2xvY2tfc291cmNlID09IExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVAorICAgICAgJiYgc2MtPmljdGwuY2xvY2tfc291cmNlID09IExNQ19DVExfQ0xPQ0tfU09VUkNFX0VYVCkKKyAgICB7CisgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfY2xvY2tfc291cmNlIChzYywgTE1DX0NUTF9DTE9DS19TT1VSQ0VfSU5UKTsKKyAgICAgIHNjLT5sbWNfdGltaW5nID0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfSU5UOworICAgIH0KKyAgZWxzZSBpZiAoY3RsLT5jbG9ja19zb3VyY2UgPT0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUCisJICAgJiYgc2MtPmljdGwuY2xvY2tfc291cmNlID09IExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVCkKKyAgICB7CisgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfY2xvY2tfc291cmNlIChzYywgTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUKTsKKyAgICAgIHNjLT5sbWNfdGltaW5nID0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUOworICAgIH0KKworICBpZiAoY3RsLT5jbG9ja19yYXRlICE9IHNjLT5pY3RsLmNsb2NrX3JhdGUpCisgICAgc2MtPmxtY19tZWRpYS0+c2V0X3NwZWVkIChzYywgY3RsKTsKKworICBsbWNfc2V0X3Byb3RvY29sIChzYywgY3RsKTsKK30KKworLyoKKyAqIDEgPT0gaW50ZXJuYWwsIDAgPT0gZXh0ZXJuYWwKKyAqLworc3RhdGljIHZvaWQKK2xtY19zc2lfc2V0X2Nsb2NrIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgaWUpCit7CisgIGludCBvbGQ7CisgIG9sZCA9IGllOworICBpZiAoaWUgPT0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUKQorICAgIHsKKyAgICAgIHNjLT5sbWNfZ3BpbyAmPSB+KExNQ19HRVBfU1NJX1RYQ0xPQ0spOworICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKyAgICAgIHNjLT5pY3RsLmNsb2NrX3NvdXJjZSA9IExNQ19DVExfQ0xPQ0tfU09VUkNFX0VYVDsKKyAgICAgIGlmKGllICE9IG9sZCkKKyAgICAgICAgcHJpbnRrIChMTUNfUFJJTlRGX0ZNVCAiOiBjbG9jayBleHRlcm5hbFxuIiwgTE1DX1BSSU5URl9BUkdTKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzYy0+bG1jX2dwaW8gfD0gTE1DX0dFUF9TU0lfVFhDTE9DSzsKKyAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisgICAgICBzYy0+aWN0bC5jbG9ja19zb3VyY2UgPSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9JTlQ7CisgICAgICBpZihpZSAhPSBvbGQpCisgICAgICAgIHByaW50ayAoTE1DX1BSSU5URl9GTVQgIjogY2xvY2sgaW50ZXJuYWxcbiIsIExNQ19QUklOVEZfQVJHUyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorbG1jX3NzaV9zZXRfc3BlZWQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGxtY19jdGxfdCAqIGN0bCkKK3sKKyAgbG1jX2N0bF90ICppY3RsID0gJnNjLT5pY3RsOworICBsbWNfYXY5MTEwX3QgKmF2OworCisgIC8qIG9yaWdpbmFsIHNldHRpbmdzIGZvciBjbG9jayByYXRlIG9mOgorICAgKiAgMTAwIEtoeiAoOCwyNSwwLDAsMikgd2VyZSBpbmNvcnJlY3QKKyAgICogIHRoZXkgc2hvdWxkIGhhdmUgYmVlbiA4MCwxMjUsMSwzLDMKKyAgICogIFRoZXJlIGFyZSAxNyBwYXJhbSBjb21iaW5hdGlvbnMgdG8gcHJvZHVjZSB0aGlzIGZyZXEuCisgICAqICBGb3IgMS41IE1oeiB1c2UgMTIwLDEwMCwxLDEsMiAoMjI2IHBhcmFtLiBjb21iaW5hdGlvbnMpCisgICAqLworICBpZiAoY3RsID09IE5VTEwpCisgICAgeworICAgICAgYXYgPSAmaWN0bC0+Y2FyZHNwZWMuc3NpOworICAgICAgaWN0bC0+Y2xvY2tfcmF0ZSA9IDE1MDAwMDA7CisgICAgICBhdi0+ZiA9IGljdGwtPmNsb2NrX3JhdGU7CisgICAgICBhdi0+biA9IDEyMDsKKyAgICAgIGF2LT5tID0gMTAwOworICAgICAgYXYtPnYgPSAxOworICAgICAgYXYtPnggPSAxOworICAgICAgYXYtPnIgPSAyOworCisgICAgICB3cml0ZV9hdjkxMTAgKHNjLCBhdi0+biwgYXYtPm0sIGF2LT52LCBhdi0+eCwgYXYtPnIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBhdiA9ICZjdGwtPmNhcmRzcGVjLnNzaTsKKworICBpZiAoYXYtPmYgPT0gMCkKKyAgICByZXR1cm47CisKKyAgaWN0bC0+Y2xvY2tfcmF0ZSA9IGF2LT5mOwkvKiByZWFsbHksIHRoaXMgaXMgdGhlIHJhdGUgd2UgYXJlICovCisgIGljdGwtPmNhcmRzcGVjLnNzaSA9ICphdjsKKworICB3cml0ZV9hdjkxMTAgKHNjLCBhdi0+biwgYXYtPm0sIGF2LT52LCBhdi0+eCwgYXYtPnIpOworfQorCisvKgorICogcmV0dXJuIGhhcmR3YXJlIGxpbmsgc3RhdHVzLgorICogMCA9PSBsaW5rIGlzIGRvd24sIDEgPT0gbGluayBpcyB1cC4KKyAqLworc3RhdGljIGludAorbG1jX3NzaV9nZXRfbGlua19zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgIHVfaW50MTZfdCBsaW5rX3N0YXR1czsKKyAgdV9pbnQzMl90IHRpY2tzOworICBpbnQgcmV0ID0gMTsKKyAgaW50IGh3X2hkc2sgPSAxOworICAKKyAgLyoKKyAgICogbWlzc2luZyBDVFM/ICBIbW0uICBJZiB3ZSByZXF1aXJlIENUUyBvbiwgd2UgbWF5IG5ldmVyIGdldCB0aGUKKyAgICogbGluayB0byBjb21lIHVwLCBzbyBvbWl0IGl0IGluIHRoaXMgdGVzdC4KKyAgICoKKyAgICogQWxzbywgaXQgc2VlbXMgdGhhdCB3aXRoIGEgbG9vcGJhY2sgY2FibGUsIERDRCBpc24ndCBhc3NlcnRlZCwKKyAgICogc28ganVzdCBjaGVjayBmb3IgdGhpbmdzIGxpa2UgdGhpczoKKyAgICogICAgICBEU1IgX211c3RfIGJlIGFzc2VydGVkLgorICAgKiAgICAgIE9uZSBvZiBEQ0Qgb3IgQ1RTIG11c3QgYmUgYXNzZXJ0ZWQuCisgICAqLworCisgIC8qIExNQyAxMDAwIChTU0kpIExFRCBkZWZpbml0aW9ucworICAgKiBsZWQwIEdyZWVuID0gcG93ZXIgdG8gYWRhcHRlciwgR2F0ZSBBcnJheSBsb2FkZWQgJgorICAgKiAgICAgICAgICAgICAgZHJpdmVyIGF0dGFjaGVkCisgICAqIGxlZDEgR3JlZW4gPSBEU1IgYW5kIERUUiBhbmQgUlRTIGFuZCBDVFMgYXJlIHNldAorICAgKiBsZWQyIEdyZWVuID0gQ2FibGUgZGV0ZWN0ZWQKKyAgICogbGVkMyByZWQgICA9IE5vIHRpbWluZyBpcyBhdmFpbGFibGUgZnJvbSB0aGUKKyAgICogICAgICAgICAgICAgIGNhYmxlIG9yIHRoZSBvbi1ib2FyZCBmcmVxdWVuY3kKKyAgICogICAgICAgICAgICAgIGdlbmVyYXRvci4KKyAgICovCisKKyAgbGlua19zdGF0dXMgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNik7CisKKyAgLyogSXMgdGhlIHRyYW5zbWl0IGNsb2NrIHN0aWxsIGF2YWlsYWJsZSAqLworICB0aWNrcyA9IExNQ19DU1JfUkVBRCAoc2MsIGNzcl9ncF90aW1lcik7CisgIHRpY2tzID0gMHgwMDAwZmZmZiAtICh0aWNrcyAmIDB4MDAwMGZmZmYpOworCisgIGxtY19sZWRfb24gKHNjLCBMTUNfTUlJMTZfTEVEMCk7CisKKyAgLyogPT09PT09IHRyYW5zbWl0IGNsb2NrIGRldGVybWluYXRpb24gPT09PT0gKi8KKyAgaWYgKHNjLT5sbWNfdGltaW5nID09IExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVCkgeworICAgICAgbG1jX2xlZF9vZmYoc2MsIExNQ19NSUkxNl9MRUQzKTsKKyAgfQorICBlbHNlIGlmICh0aWNrcyA9PSAwICkgewkJCQkvKiBubyBjbG9jayBmb3VuZCA/ICovCisgICAgICByZXQgPSAwOworICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclszXSAhPSAxKXsKKyAgICAgICAgICBzYy0+c3RhdHMudHhfbG9zc09mQ2xvY2tDbnQrKzsKKyAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogTG9zdCBDbG9jaywgTGluayBEb3duXG4iLCBzYy0+bmFtZSk7CisgICAgICB9CisgICAgICBzYy0+bGFzdF9sZWRfZXJyWzNdID0gMTsKKyAgICAgIGxtY19sZWRfb24gKHNjLCBMTUNfTUlJMTZfTEVEMyk7CS8qIHR1cm4gT04gcmVkIExFRCAqLworICB9CisgIGVsc2UgeworICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclszXSA9PSAxKQorICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDbG9jayBSZXR1cm5lZFxuIiwgc2MtPm5hbWUpOworICAgICAgc2MtPmxhc3RfbGVkX2VyclszXSA9IDA7CisgICAgICBsbWNfbGVkX29mZiAoc2MsIExNQ19NSUkxNl9MRUQzKTsJCS8qIHR1cm4gT0ZGIHJlZCBMRUQgKi8KKyAgfQorCisgIGlmICgobGlua19zdGF0dXMgJiBMTUNfTUlJMTZfU1NJX0RTUikgPT0gMCkgeyAvKiBBbHNvIEhTU0kgQ0EgKi8KKyAgICAgIHJldCA9IDA7CisgICAgICBod19oZHNrID0gMDsKKyAgfQorCisjaWZkZWYgQ09ORklHX0xNQ19JR05PUkVfSEFSRFdBUkVfSEFORFNIQUtFCisgIGlmICgobGlua19zdGF0dXMgJiAoTE1DX01JSTE2X1NTSV9DVFMgfCBMTUNfTUlJMTZfU1NJX0RDRCkpID09IDApeworICAgICAgcmV0ID0gMDsKKyAgICAgIGh3X2hkc2sgPSAwOworICB9CisjZW5kaWYKKworICBpZihod19oZHNrID09IDApeworICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclsxXSAhPSAxKQorICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBEU1Igbm90IGFzc2VydGVkXG4iLCBzYy0+bmFtZSk7CisgICAgICBzYy0+bGFzdF9sZWRfZXJyWzFdID0gMTsKKyAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfTUlJMTZfTEVEMSk7CisgIH0KKyAgZWxzZSB7CisgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzFdICE9IDApCisgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IERTUiBub3cgYXNzZXJ0ZWRcbiIsIHNjLT5uYW1lKTsKKyAgICAgIHNjLT5sYXN0X2xlZF9lcnJbMV0gPSAwOworICAgICAgbG1jX2xlZF9vbihzYywgTE1DX01JSTE2X0xFRDEpOworICB9CisKKyAgaWYocmV0ID09IDEpIHsKKyAgICAgIGxtY19sZWRfb24oc2MsIExNQ19NSUkxNl9MRUQyKTsgLyogT3ZlciBhbGwgZ29vZCBzdGF0dXM/ICovCisgIH0KKyAgCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfc3NpX3NldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IHN0YXRlKQoreworICBpZiAoc3RhdGUgPT0gTE1DX0xJTktfVVApCisgICAgeworICAgICAgc2MtPmxtY19taWlyZWcxNiB8PSAoTE1DX01JSTE2X1NTSV9EVFIgfCBMTUNfTUlJMTZfU1NJX1JUUyk7CisgICAgICBwcmludGsgKExNQ19QUklOVEZfRk1UICI6IGFzc2VydGluZyBEVFIgYW5kIFJUU1xuIiwgTE1DX1BSSU5URl9BUkdTKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzYy0+bG1jX21paXJlZzE2ICY9IH4oTE1DX01JSTE2X1NTSV9EVFIgfCBMTUNfTUlJMTZfU1NJX1JUUyk7CisgICAgICBwcmludGsgKExNQ19QUklOVEZfRk1UICI6IGRlYXNzZXJ0aW5nIERUUiBhbmQgUlRTXG4iLCBMTUNfUFJJTlRGX0FSR1MpOworICAgIH0KKworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTYsIHNjLT5sbWNfbWlpcmVnMTYpOworCit9CisKKy8qCisgKiAwID09IDE2Yml0LCAxID09IDMyYml0CisgKi8KK3N0YXRpYyB2b2lkCitsbWNfc3NpX3NldF9jcmNfbGVuZ3RoIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgc3RhdGUpCit7CisgIGlmIChzdGF0ZSA9PSBMTUNfQ1RMX0NSQ19MRU5HVEhfMzIpCisgICAgeworICAgICAgLyogMzIgYml0ICovCisgICAgICBzYy0+bG1jX21paXJlZzE2IHw9IExNQ19NSUkxNl9TU0lfQ1JDOworICAgICAgc2MtPmljdGwuY3JjX2xlbmd0aCA9IExNQ19DVExfQ1JDX0xFTkdUSF8zMjsKKyAgICAgIHNjLT5sbWNfY3JjU2l6ZSA9IExNQ19DVExfQ1JDX0JZVEVTSVpFXzQ7CisKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiAxNiBiaXQgKi8KKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgJj0gfkxNQ19NSUkxNl9TU0lfQ1JDOworICAgICAgc2MtPmljdGwuY3JjX2xlbmd0aCA9IExNQ19DVExfQ1JDX0xFTkdUSF8xNjsKKyAgICAgIHNjLT5sbWNfY3JjU2l6ZSA9IExNQ19DVExfQ1JDX0JZVEVTSVpFXzI7CisgICAgfQorCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgYml0cyB0byBwcm9ncmFtIHRoZSBzc2kgZnJlcXVlbmN5IGdlbmVyYXRvcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3dyaXRlX2F2OTExMF9iaXQgKGxtY19zb2Z0Y190ICogc2MsIGludCBjKQoreworICAvKgorICAgKiBzZXQgdGhlIGRhdGEgYml0IGFzIHdlIG5lZWQgaXQuCisgICAqLworICBzYy0+bG1jX2dwaW8gJj0gfihMTUNfR0VQX0NMSyk7CisgIGlmIChjICYgMHgwMSkKKyAgICBzYy0+bG1jX2dwaW8gfD0gTE1DX0dFUF9EQVRBOworICBlbHNlCisgICAgc2MtPmxtY19ncGlvICY9IH4oTE1DX0dFUF9EQVRBKTsKKyAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKworICAvKgorICAgKiBzZXQgdGhlIGNsb2NrIHRvIGhpZ2gKKyAgICovCisgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0NMSzsKKyAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKworICAvKgorICAgKiBzZXQgdGhlIGNsb2NrIHRvIGxvdyBhZ2Fpbi4KKyAgICovCisgIHNjLT5sbWNfZ3BpbyAmPSB+KExNQ19HRVBfQ0xLKTsKKyAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX2F2OTExMCAobG1jX3NvZnRjX3QgKiBzYywgdV9pbnQzMl90IG4sIHVfaW50MzJfdCBtLCB1X2ludDMyX3QgdiwKKwkgICAgICB1X2ludDMyX3QgeCwgdV9pbnQzMl90IHIpCit7CisgIGludCBpOworCisjaWYgMAorICBwcmludGsgKExNQ19QUklOVEZfRk1UICI6IHNwZWVkICV1LCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkgIExNQ19QUklOVEZfQVJHUywgc2MtPmljdGwuY2xvY2tfcmF0ZSwgbiwgbSwgdiwgeCwgcik7CisjZW5kaWYKKworICBzYy0+bG1jX2dwaW8gfD0gTE1DX0dFUF9TU0lfR0VORVJBVE9SOworICBzYy0+bG1jX2dwaW8gJj0gfihMTUNfR0VQX0RBVEEgfCBMTUNfR0VQX0NMSyk7CisgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisKKyAgLyoKKyAgICogU2V0IHRoZSBUWENMT0NLLCBHRU5FUkFUT1IsIFNFUklBTCwgYW5kIFNFUklBTENMSworICAgKiBhcyBvdXRwdXRzLgorICAgKi8KKyAgbG1jX2dwaW9fbWtvdXRwdXQgKHNjLCAoTE1DX0dFUF9EQVRBIHwgTE1DX0dFUF9DTEsKKwkJCSAgfCBMTUNfR0VQX1NTSV9HRU5FUkFUT1IpKTsKKworICBzYy0+bG1jX2dwaW8gJj0gfihMTUNfR0VQX1NTSV9HRU5FUkFUT1IpOworICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworCisgIC8qCisgICAqIGEgc2hpZnRpbmcgd2Ugd2lsbCBnby4uLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKyAgICB3cml0ZV9hdjkxMTBfYml0IChzYywgbiA+PiBpKTsKKyAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKyAgICB3cml0ZV9hdjkxMTBfYml0IChzYywgbSA+PiBpKTsKKyAgZm9yIChpID0gMDsgaSA8IDE7IGkrKykKKyAgICB3cml0ZV9hdjkxMTBfYml0IChzYywgdiA+PiBpKTsKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB3cml0ZV9hdjkxMTBfYml0IChzYywgeCA+PiBpKTsKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB3cml0ZV9hdjkxMTBfYml0IChzYywgciA+PiBpKTsKKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICB3cml0ZV9hdjkxMTBfYml0IChzYywgMHgxNyA+PiBpKTsKKworICAvKgorICAgKiBzdG9wIGRyaXZpbmcgc2VyaWFsLXJlbGF0ZWQgc2lnbmFscworICAgKi8KKyAgbG1jX2dwaW9fbWtpbnB1dCAoc2MsCisJCSAgICAoTE1DX0dFUF9EQVRBIHwgTE1DX0dFUF9DTEsKKwkJICAgICB8IExNQ19HRVBfU1NJX0dFTkVSQVRPUikpOworfQorCitzdGF0aWMgdm9pZAorbG1jX3NzaV93YXRjaGRvZyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykKK3sKKyAgdV9pbnQxNl90IG1paTE3OworICBzdHJ1Y3Qgc3NpY3NyMgorICB7CisgICAgdW5zaWduZWQgc2hvcnQgZHRyOjEsIGRzcjoxLCBydHM6MSwgY2FibGU6MywgY3JjOjEsIGxlZDA6MSwgbGVkMToxLAorICAgICAgbGVkMjoxLCBsZWQzOjEsIGZpZm86MSwgbGw6MSwgcmw6MSwgdG06MSwgbG9vcDoxOworICB9OworICBzdHJ1Y3Qgc3NpY3NyMiAqc3NpY3NyOworICBtaWkxNyA9IGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE3KTsKKyAgc3NpY3NyID0gKHN0cnVjdCBzc2ljc3IyICopICZtaWkxNzsKKyAgaWYgKHNzaWNzci0+Y2FibGUgPT0gNykKKyAgICB7CisgICAgICBsbWNfbGVkX29mZiAoc2MsIExNQ19NSUkxNl9MRUQyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsbWNfbGVkX29uIChzYywgTE1DX01JSTE2X0xFRDIpOworICAgIH0KKworfQorCisvKgorICogIFQxIG1ldGhvZHMKKyAqLworCisvKgorICogVGhlIGZyYW1lciByZWdzIGFyZSBtdWx0aXBsZXhlZCB0aHJvdWdoIE1JSSByZWdzIDE3ICYgMTgKKyAqICB3cml0ZSB0aGUgcmVnaXN0ZXIgYWRkcmVzcyB0byBNSUkgcmVnIDE3IGFuZCB0aGUgKiAgZGF0YSB0byBNSUkgcmVnIDE4LiAqLworc3RhdGljIHZvaWQKK2xtY190MV93cml0ZSAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IGEsIGludCBkKQoreworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIGEpOworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTgsIGQpOworfQorCisvKiBTYXZlIGEgd2FybmluZworc3RhdGljIGludAorbG1jX3QxX3JlYWQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGludCBhKQoreworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIGEpOworICByZXR1cm4gbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTgpOworfQorKi8KKworCitzdGF0aWMgdm9pZAorbG1jX3QxX2luaXQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgIHVfaW50MTZfdCBtaWkxNjsKKyAgaW50IGk7CisKKyAgc2MtPmljdGwuY2FyZHR5cGUgPSBMTUNfQ1RMX0NBUkRUWVBFX0xNQzEyMDA7CisgIG1paTE2ID0gbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTYpOworCisgIC8qIHJlc2V0IDgzNzAgKi8KKyAgbWlpMTYgJj0gfkxNQ19NSUkxNl9UMV9SU1Q7CisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgbWlpMTYgfCBMTUNfTUlJMTZfVDFfUlNUKTsKKyAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE2LCBtaWkxNik7CisKKyAgLyogc2V0IFQxIG9yIEUxIGxpbmUuICBVc2VzIHNjLT5sbWNtaWkxNiByZWcgaW4gZnVuY3Rpb24gc28gdXBkYXRlIGl0ICovCisgIHNjLT5sbWNfbWlpcmVnMTYgPSBtaWkxNjsKKyAgbG1jX3QxX3NldF9jaXJjdWl0X3R5cGUoc2MsIExNQ19DVExfQ0lSQ1VJVF9UWVBFX1QxKTsKKyAgbWlpMTYgPSBzYy0+bG1jX21paXJlZzE2OworCisgIGxtY190MV93cml0ZSAoc2MsIDB4MDEsIDB4MUIpOwkvKiBDUjAgICAgIC0gcHJpbWFyeSBjb250cm9sICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MDIsIDB4NDIpOwkvKiBKQVRfQ1IgIC0gaml0dGVyIGF0dGVuIGNvbmZpZyAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MTQsIDB4MDApOwkvKiBMT09QICAgIC0gbG9vcGJhY2sgY29uZmlnICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MTUsIDB4MDApOwkvKiBETDNfVFMgIC0gZXh0ZXJuYWwgZGF0YSBsaW5rIHRpbWVzbG90ICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MTgsIDB4RkYpOwkvKiBQSU8gICAgIC0gcHJvZ3JhbW1hYmxlIEkvTyAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MTksIDB4MzApOwkvKiBQT0UgICAgIC0gcHJvZ3JhbW1hYmxlIE9FICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MUEsIDB4MEYpOwkvKiBDTVVYICAgIC0gY2xvY2sgaW5wdXQgbXV4ICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MjAsIDB4NDEpOwkvKiBMSVVfQ1IgIC0gUlggTElVIGNvbmZpZyAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MjIsIDB4NzYpOwkvKiBSTElVX0NSIC0gUlggTElVIGNvbmZpZyAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NDAsIDB4MDMpOwkvKiBSQ1IwICAgIC0gUlggY29uZmlnICAgICAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NDUsIDB4MDApOwkvKiBSQUxNICAgIC0gUlggYWxhcm0gY29uZmlnICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NDYsIDB4MDUpOwkvKiBMQVRDSCAgIC0gUlggYWxhcm0vZXJyL2NudHIgbGF0Y2ggICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NjgsIDB4NDApOwkvKiBUTElVX0NSIC0gVFggTElVIGNvbmZpZyAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzAsIDB4MEQpOwkvKiBUQ1IwICAgIC0gVFggZnJhbWVyIGNvbmZpZyAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzEsIDB4MDUpOwkvKiBUQ1IxICAgIC0gVFggY29uZmlnICAgICAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzIsIDB4MEIpOwkvKiBURlJNICAgIC0gVFggZnJhbWUgZm9ybWF0ICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzMsIDB4MDApOwkvKiBURVJST1IgIC0gVFggZXJyb3IgaW5zZXJ0ICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzQsIDB4MDApOwkvKiBUTUFOICAgIC0gVFggbWFudWFsIFNhL0ZFQkUgY29uZmlnICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzUsIDB4MDApOwkvKiBUQUxNICAgIC0gVFggYWxhcm0gc2lnbmFsIGNvbmZpZyAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzYsIDB4MDApOwkvKiBUUEFUVCAgIC0gVFggdGVzdCBwYXR0ZXJuIGNvbmZpZyAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzcsIDB4MDApOwkvKiBUTEIgICAgIC0gVFggaW5iYW5kIGxvb3BiYWNrIGNvbmZpZyAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4OTAsIDB4MDUpOwkvKiBDTEFEX0NSIC0gY2xvY2sgcmF0ZSBhZGFwdGVyIGNvbmZpZyAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4OTEsIDB4MDUpOwkvKiBDU0VMICAgIC0gY2xhZCBmcmVxIHNlbCAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4QTYsIDB4MDApOwkvKiBETDFfQ1RMIC0gREwxIGNvbnRyb2wgICAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4QjEsIDB4MDApOwkvKiBETDJfQ1RMIC0gREwyIGNvbnRyb2wgICAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4RDAsIDB4NDcpOwkvKiBTQklfQ1IgIC0gc3lzIGJ1cyBpZmFjZSBjb25maWcgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4RDEsIDB4NzApOwkvKiBSU0JfQ1IgIC0gUlggc3lzIGJ1cyBjb25maWcgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4RDQsIDB4MzApOwkvKiBUU0JfQ1IgIC0gVFggc3lzIGJ1cyBjb25maWcgICAgICAgICAgICovCisgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgIHsKKyAgICAgIGxtY190MV93cml0ZSAoc2MsIDB4MEUwICsgaSwgMHgwMCk7CS8qIFNCQ24gLSBzeXMgYnVzIHBlci1jaGFubmVsIGN0bCAgICAqLworICAgICAgbG1jX3QxX3dyaXRlIChzYywgMHgxMDAgKyBpLCAweDAwKTsJLyogVFBDbiAtIFRYIHBlci1jaGFubmVsIGN0bCAgICAgICAgICovCisgICAgICBsbWNfdDFfd3JpdGUgKHNjLCAweDE4MCArIGksIDB4MDApOwkvKiBSUENuIC0gUlggcGVyLWNoYW5uZWwgY3RsICAgICAgICAgKi8KKyAgICB9CisgIGZvciAoaSA9IDE7IGkgPCAyNTsgaSsrKQorICAgIHsKKyAgICAgIGxtY190MV93cml0ZSAoc2MsIDB4MEUwICsgaSwgMHgwRCk7CS8qIFNCQ24gLSBzeXMgYnVzIHBlci1jaGFubmVsIGN0bCAgICAqLworICAgIH0KKworICBtaWkxNiB8PSBMTUNfTUlJMTZfVDFfWE9FOworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTYsIG1paTE2KTsKKyAgc2MtPmxtY19taWlyZWcxNiA9IG1paTE2OworfQorCitzdGF0aWMgdm9pZAorbG1jX3QxX2RlZmF1bHQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgIHNjLT5sbWNfbWlpcmVnMTYgPSBMTUNfTUlJMTZfTEVEX0FMTDsKKyAgc2MtPmxtY19tZWRpYS0+c2V0X2xpbmtfc3RhdHVzIChzYywgTE1DX0xJTktfRE9XTik7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9jaXJjdWl0X3R5cGUgKHNjLCBMTUNfQ1RMX0NJUkNVSVRfVFlQRV9UMSk7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9jcmNfbGVuZ3RoIChzYywgTE1DX0NUTF9DUkNfTEVOR1RIXzE2KTsKKyAgLyogUmlnaHQgbm93IHdlIGNhbiBvbmx5IGNsb2NrIGZyb20gb3V0IGludGVybmFsIHNvdXJjZSAqLworICBzYy0+aWN0bC5jbG9ja19zb3VyY2UgPSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9JTlQ7Cit9CisvKiAqIEdpdmVuIGEgdXNlciBwcm92aWRlZCBzdGF0ZSwgc2V0IG91cnNlbHZlcyB1cCB0byBtYXRjaCBpdC4gIFRoaXMgd2lsbCAqIGFsd2F5cyByZXNldCB0aGUgY2FyZCBpZiBuZWVkZWQuCisgKi8KK3N0YXRpYyB2b2lkCitsbWNfdDFfc2V0X3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgbG1jX2N0bF90ICogY3RsKQoreworICBpZiAoY3RsID09IE5VTEwpCisgICAgeworICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X2NpcmN1aXRfdHlwZSAoc2MsIHNjLT5pY3RsLmNpcmN1aXRfdHlwZSk7CisgICAgICBsbWNfc2V0X3Byb3RvY29sIChzYywgTlVMTCk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisgIC8qCisgICAqIGNoZWNrIGZvciBjaGFuZ2UgaW4gY2lyY3VpdCB0eXBlICAgICAgICAgKi8KKyAgaWYgKGN0bC0+Y2lyY3VpdF90eXBlID09IExNQ19DVExfQ0lSQ1VJVF9UWVBFX1QxCisgICAgICAmJiBzYy0+aWN0bC5jaXJjdWl0X3R5cGUgPT0KKyAgICAgIExNQ19DVExfQ0lSQ1VJVF9UWVBFX0UxKSBzYy0+bG1jX21lZGlhLT5zZXRfY2lyY3VpdF90eXBlIChzYywKKwkJCQkJCQkJTE1DX0NUTF9DSVJDVUlUX1RZUEVfRTEpOworICBlbHNlIGlmIChjdGwtPmNpcmN1aXRfdHlwZSA9PSBMTUNfQ1RMX0NJUkNVSVRfVFlQRV9FMQorCSAgICYmIHNjLT5pY3RsLmNpcmN1aXRfdHlwZSA9PSBMTUNfQ1RMX0NJUkNVSVRfVFlQRV9UMSkKKyAgICBzYy0+bG1jX21lZGlhLT5zZXRfY2lyY3VpdF90eXBlIChzYywgTE1DX0NUTF9DSVJDVUlUX1RZUEVfVDEpOworICBsbWNfc2V0X3Byb3RvY29sIChzYywgY3RsKTsKK30KKy8qCisgKiByZXR1cm4gaGFyZHdhcmUgbGluayBzdGF0dXMuCisgKiAwID09IGxpbmsgaXMgZG93biwgMSA9PSBsaW5rIGlzIHVwLgorICovIHN0YXRpYyBpbnQKK2xtY190MV9nZXRfbGlua19zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgICAgdV9pbnQxNl90IGxpbmtfc3RhdHVzOworICAgIGludCByZXQgPSAxOworCisgIC8qIExNQzUyNDUgKERTMykgJiBMTUMxMjAwIChEUzEpIExFRCBkZWZpbml0aW9ucworICAgKiBsZWQwIHllbGxvdyA9IGZhci1lbmQgYWRhcHRlciBpcyBpbiBSZWQgYWxhcm0gY29uZGl0aW9uCisgICAqIGxlZDEgYmx1ZSAgID0gcmVjZWl2ZWQgYW4gQWxhcm0gSW5kaWNhdGlvbiBzaWduYWwKKyAgICogICAgICAgICAgICAgICAodXBzdHJlYW0gZmFpbHVyZSkKKyAgICogbGVkMiBHcmVlbiAgPSBwb3dlciB0byBhZGFwdGVyLCBHYXRlIEFycmF5IGxvYWRlZCAmIGRyaXZlcgorICAgKiAgICAgICAgICAgICAgIGF0dGFjaGVkCisgICAqIGxlZDMgcmVkICAgID0gTG9zcyBvZiBTaWduYWwgKExPUykgb3Igb3V0IG9mIGZyYW1lIChPT0YpCisgICAqICAgICAgICAgICAgICAgY29uZGl0aW9ucyBkZXRlY3RlZCBvbiBUMyByZWNlaXZlIHNpZ25hbAorICAgKi8KKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfdDFfZ2V0X2xpbmtfc3RhdHVzIGluIik7CisgICAgbG1jX2xlZF9vbihzYywgTE1DX0RTM19MRUQyKTsKKworICAgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgVDFGUkFNRVJfQUxBUk0xX1NUQVRVUyk7CisgICAgbGlua19zdGF0dXMgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxOCk7CisKKworICAgIGlmIChsaW5rX3N0YXR1cyAmIFQxRl9SQUlTKSB7CQkJLyogdHVybiBvbiBibHVlIExFRCAqLworICAgICAgICByZXQgPSAwOworICAgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzFdICE9IDEpeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmUgQUlTL0JsdWUgQWxhcm0uIEZhciBlbmQgaW4gUkVEIGFsYXJtXG4iLCBzYy0+bmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbG1jX2xlZF9vbihzYywgTE1DX0RTM19MRUQxKTsKKyAgICAgICAgc2MtPmxhc3RfbGVkX2VyclsxXSA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzFdICE9IDApeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVuZCBBSVMvQmx1ZSBBbGFybVxuIiwgc2MtPm5hbWUpOworICAgICAgICB9CisgICAgICAgIGxtY19sZWRfb2ZmIChzYywgTE1DX0RTM19MRUQxKTsKKyAgICAgICAgc2MtPmxhc3RfbGVkX2VyclsxXSA9IDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBZZWxsb3cgQWxhcm0gaXMgbmFzdHkgZXZpbCBzdHVmZiwgbG9va3MgYXQgZGF0YSBwYXR0ZXJucworICAgICAqIGluc2lkZSB0aGUgY2hhbm5lbCBhbmQgY29uZnVzZXMgaXQgd2l0aCBIRExDIGZyYW1pbmcKKyAgICAgKiBpZ25vcmUgYWxsIHllbGxvdyBhbGFybXMuCisgICAgICoKKyAgICAgKiBEbyBsaXN0ZW4gdG8gTXVsdGlGcmFtZSBZZWxsb3cgYWxhcm0gd2hpY2ggd2hpbGUgaW1wbGVtZW50ZWQKKyAgICAgKiBkaWZmZXJlbnQgd2F5cyBpc24ndCBpbiB0aGUgY2hhbm5lbCBhbmQgaGVuY2Ugc29tZXdoYXQKKyAgICAgKiBtb3JlIHJlbGlhYmxlCisgICAgICovCisKKyAgICBpZiAobGlua19zdGF0dXMgJiBUMUZfUk1ZRUwpIHsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclswXSAhPSAxKXsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlIFllbGxvdyBBSVMgQWxhcm1cbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDApOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzBdID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmKHNjLT5sYXN0X2xlZF9lcnJbMF0gIT0gMCl7CisgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogRW5kIG9mIFllbGxvdyBBSVMgQWxhcm1cbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsbWNfbGVkX29mZihzYywgTE1DX0RTM19MRUQwKTsKKyAgICAgICAgc2MtPmxhc3RfbGVkX2VyclswXSA9IDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBMb3NzIG9mIHNpZ25hbCBhbmQgbG9zIG9mIGZyYW1lCisgICAgICogVXNlIHRoZSBncmVlbiBiaXQgdG8gaWRlbnRpZnkgd2hpY2ggb25lIGxpdCB0aGUgbGVkCisgICAgICovCisgICAgaWYobGlua19zdGF0dXMgJiBUMUZfUkxPRil7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGlmKHNjLT5sYXN0X2xlZF9lcnJbM10gIT0gMSl7CisgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogTG9jYWwgUmVkIEFsYXJtOiBMb3NzIG9mIEZyYW1pbmdcbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDMpOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzNdID0gMTsKKworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclszXSAhPSAwKXsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFbmQgUmVkIEFsYXJtIChMT0YpXG4iLCBzYy0+bmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoICEgKGxpbmtfc3RhdHVzICYgVDFGX1JMT1MpKQorICAgICAgICAgICAgbG1jX2xlZF9vZmYoc2MsIExNQ19EUzNfTEVEMyk7CisgICAgICAgIHNjLT5sYXN0X2xlZF9lcnJbM10gPSAwOworICAgIH0KKyAgICAKKyAgICBpZihsaW5rX3N0YXR1cyAmIFQxRl9STE9TKXsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclsyXSAhPSAxKXsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBMb2NhbCBSZWQgQWxhcm06IExvc3Mgb2YgU2lnbmFsXG4iLCBzYy0+bmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbG1jX2xlZF9vbihzYywgTE1DX0RTM19MRUQzKTsKKyAgICAgICAgc2MtPmxhc3RfbGVkX2VyclsyXSA9IDE7CisKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmKHNjLT5sYXN0X2xlZF9lcnJbMl0gIT0gMCl7CisgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogRW5kIFJlZCBBbGFybSAoTE9TKVxuIiwgc2MtPm5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmKCAhIChsaW5rX3N0YXR1cyAmIFQxRl9STE9GKSkKKyAgICAgICAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDMpOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzJdID0gMDsKKyAgICB9CisKKyAgICBzYy0+bG1jX3hpbmZvLnQxX2FsYXJtMV9zdGF0dXMgPSBsaW5rX3N0YXR1czsKKworICAgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgVDFGUkFNRVJfQUxBUk0yX1NUQVRVUyk7CisgICAgc2MtPmxtY194aW5mby50MV9hbGFybTJfc3RhdHVzID0gbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTgpOworCisgICAgCisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3QxX2dldF9saW5rX3N0YXR1cyBvdXQiKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiAxID09IFQxIENpcmN1aXQgVHlwZSAsIDAgPT0gRTEgQ2lyY3VpdCBUeXBlCisgKi8KK3N0YXRpYyB2b2lkCitsbWNfdDFfc2V0X2NpcmN1aXRfdHlwZSAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IGllKQoreworICBpZiAoaWUgPT0gTE1DX0NUTF9DSVJDVUlUX1RZUEVfVDEpIHsKKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgfD0gTE1DX01JSTE2X1QxX1o7CisgICAgICBzYy0+aWN0bC5jaXJjdWl0X3R5cGUgPSBMTUNfQ1RMX0NJUkNVSVRfVFlQRV9UMTsKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBJbiBUMSBNb2RlXG4iLCBzYy0+bmFtZSk7CisgIH0KKyAgZWxzZSB7CisgICAgICBzYy0+bG1jX21paXJlZzE2ICY9IH5MTUNfTUlJMTZfVDFfWjsKKyAgICAgIHNjLT5pY3RsLmNpcmN1aXRfdHlwZSA9IExNQ19DVExfQ0lSQ1VJVF9UWVBFX0UxOworICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluIEUxIE1vZGVcbiIsIHNjLT5uYW1lKTsKKyAgfQorCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7CisgIAorfQorCisvKgorICogMCA9PSAxNmJpdCwgMSA9PSAzMmJpdCAqLworc3RhdGljIHZvaWQKK2xtY190MV9zZXRfY3JjX2xlbmd0aCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IHN0YXRlKQoreworICBpZiAoc3RhdGUgPT0gTE1DX0NUTF9DUkNfTEVOR1RIXzMyKQorICAgIHsKKyAgICAgIC8qIDMyIGJpdCAqLworICAgICAgc2MtPmxtY19taWlyZWcxNiB8PSBMTUNfTUlJMTZfVDFfQ1JDOworICAgICAgc2MtPmljdGwuY3JjX2xlbmd0aCA9IExNQ19DVExfQ1JDX0xFTkdUSF8zMjsKKyAgICAgIHNjLT5sbWNfY3JjU2l6ZSA9IExNQ19DVExfQ1JDX0JZVEVTSVpFXzQ7CisKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiAxNiBiaXQgKi8gc2MtPmxtY19taWlyZWcxNiAmPSB+TE1DX01JSTE2X1QxX0NSQzsKKyAgICAgIHNjLT5pY3RsLmNyY19sZW5ndGggPSBMTUNfQ1RMX0NSQ19MRU5HVEhfMTY7CisgICAgICBzYy0+bG1jX2NyY1NpemUgPSBMTUNfQ1RMX0NSQ19CWVRFU0laRV8yOworCisgICAgfQorCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7Cit9CisKKy8qCisgKiAxID09IGludGVybmFsLCAwID09IGV4dGVybmFsCisgKi8KK3N0YXRpYyB2b2lkCitsbWNfdDFfc2V0X2Nsb2NrIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgaWUpCit7CisgIGludCBvbGQ7CisgIG9sZCA9IGllOworICBpZiAoaWUgPT0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUKQorICAgIHsKKyAgICAgIHNjLT5sbWNfZ3BpbyAmPSB+KExNQ19HRVBfU1NJX1RYQ0xPQ0spOworICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKyAgICAgIHNjLT5pY3RsLmNsb2NrX3NvdXJjZSA9IExNQ19DVExfQ0xPQ0tfU09VUkNFX0VYVDsKKyAgICAgIGlmKG9sZCAhPSBpZSkKKyAgICAgICAgcHJpbnRrIChMTUNfUFJJTlRGX0ZNVCAiOiBjbG9jayBleHRlcm5hbFxuIiwgTE1DX1BSSU5URl9BUkdTKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzYy0+bG1jX2dwaW8gfD0gTE1DX0dFUF9TU0lfVFhDTE9DSzsKKyAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisgICAgICBzYy0+aWN0bC5jbG9ja19zb3VyY2UgPSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9JTlQ7CisgICAgICBpZihvbGQgIT0gaWUpCisgICAgICAgIHByaW50ayAoTE1DX1BSSU5URl9GTVQgIjogY2xvY2sgaW50ZXJuYWxcbiIsIExNQ19QUklOVEZfQVJHUyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorbG1jX3QxX3dhdGNoZG9nIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworfQorCitzdGF0aWMgdm9pZAorbG1jX3NldF9wcm90b2NvbCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgbG1jX2N0bF90ICogY3RsKQoreworICBpZiAoY3RsID09IDApCisgICAgeworICAgICAgc2MtPmljdGwua2VlcGFsaXZlX29ub2ZmID0gTE1DX0NUTF9PTjsKKworICAgICAgcmV0dXJuOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21lZGlhLmggYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tZWRpYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkY2MwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tZWRpYS5oCkBAIC0wLDAgKzEsNjUgQEAKKyNpZm5kZWYgX0xNQ19NRURJQV9IXworI2RlZmluZSBfTE1DX01FRElBX0hfCisKK2xtY19tZWRpYV90IGxtY19kczNfbWVkaWEgPSB7CisgIGxtY19kczNfaW5pdCwJCQkvKiBzcGVjaWFsIG1lZGlhIGluaXQgc3R1ZmYgKi8KKyAgbG1jX2RzM19kZWZhdWx0LAkJLyogcmVzZXQgdG8gZGVmYXVsdCBzdGF0ZSAqLworICBsbWNfZHMzX3NldF9zdGF0dXMsCQkvKiByZXNldCBzdGF0dXMgdG8gc3RhdGUgcHJvdmlkZWQgKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IGNsb2NrIHNvdXJjZSAqLworICBsbWNfZHVtbXlfc2V0Ml8xLAkJLyogc2V0IGxpbmUgc3BlZWQgKi8KKyAgbG1jX2RzM19zZXRfMTAwZnQsCQkvKiBzZXQgY2FibGUgbGVuZ3RoICovCisgIGxtY19kczNfc2V0X3NjcmFtLAkJLyogc2V0IHNjcmFtYmxlciAqLworICBsbWNfZHMzX2dldF9saW5rX3N0YXR1cywJLyogZ2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBsaW5rIHN0YXR1cyAqLworICBsbWNfZHMzX3NldF9jcmNfbGVuZ3RoLAkvKiBzZXQgQ1JDIGxlbmd0aCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgVDEgb3IgRTEgY2lyY3VpdCB0eXBlICovCisgIGxtY19kczNfd2F0Y2hkb2cKK307CisKK2xtY19tZWRpYV90IGxtY19oc3NpX21lZGlhID0geworICBsbWNfaHNzaV9pbml0LAkJLyogc3BlY2lhbCBtZWRpYSBpbml0IHN0dWZmICovCisgIGxtY19oc3NpX2RlZmF1bHQsCQkvKiByZXNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIGxtY19oc3NpX3NldF9zdGF0dXMsCQkvKiByZXNldCBzdGF0dXMgdG8gc3RhdGUgcHJvdmlkZWQgKi8KKyAgbG1jX2hzc2lfc2V0X2Nsb2NrLAkJLyogc2V0IGNsb2NrIHNvdXJjZSAqLworICBsbWNfZHVtbXlfc2V0Ml8xLAkJLyogc2V0IGxpbmUgc3BlZWQgKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IGNhYmxlIGxlbmd0aCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgc2NyYW1ibGVyICovCisgIGxtY19oc3NpX2dldF9saW5rX3N0YXR1cywJLyogZ2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19oc3NpX3NldF9saW5rX3N0YXR1cywJLyogc2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19oc3NpX3NldF9jcmNfbGVuZ3RoLAkvKiBzZXQgQ1JDIGxlbmd0aCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgVDEgb3IgRTEgY2lyY3VpdCB0eXBlICovCisgIGxtY19oc3NpX3dhdGNoZG9nCit9OworCitsbWNfbWVkaWFfdCBsbWNfc3NpX21lZGlhID0geyBsbWNfc3NpX2luaXQsCS8qIHNwZWNpYWwgbWVkaWEgaW5pdCBzdHVmZiAqLworICBsbWNfc3NpX2RlZmF1bHQsCQkvKiByZXNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIGxtY19zc2lfc2V0X3N0YXR1cywJCS8qIHJlc2V0IHN0YXR1cyB0byBzdGF0ZSBwcm92aWRlZCAqLworICBsbWNfc3NpX3NldF9jbG9jaywJCS8qIHNldCBjbG9jayBzb3VyY2UgKi8KKyAgbG1jX3NzaV9zZXRfc3BlZWQsCQkvKiBzZXQgbGluZSBzcGVlZCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgY2FibGUgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBzY3JhbWJsZXIgKi8KKyAgbG1jX3NzaV9nZXRfbGlua19zdGF0dXMsCS8qIGdldCBsaW5rIHN0YXR1cyAqLworICBsbWNfc3NpX3NldF9saW5rX3N0YXR1cywJLyogc2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19zc2lfc2V0X2NyY19sZW5ndGgsCS8qIHNldCBDUkMgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBUMSBvciBFMSBjaXJjdWl0IHR5cGUgKi8KKyAgbG1jX3NzaV93YXRjaGRvZworfTsKKworbG1jX21lZGlhX3QgbG1jX3QxX21lZGlhID0geworICBsbWNfdDFfaW5pdCwJCQkvKiBzcGVjaWFsIG1lZGlhIGluaXQgc3R1ZmYgKi8KKyAgbG1jX3QxX2RlZmF1bHQsCQkvKiByZXNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIGxtY190MV9zZXRfc3RhdHVzLAkJLyogcmVzZXQgc3RhdHVzIHRvIHN0YXRlIHByb3ZpZGVkICovCisgIGxtY190MV9zZXRfY2xvY2ssCQkvKiBzZXQgY2xvY2sgc291cmNlICovCisgIGxtY19kdW1teV9zZXQyXzEsCQkvKiBzZXQgbGluZSBzcGVlZCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgY2FibGUgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBzY3JhbWJsZXIgKi8KKyAgbG1jX3QxX2dldF9saW5rX3N0YXR1cywJLyogZ2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBsaW5rIHN0YXR1cyAqLworICBsbWNfdDFfc2V0X2NyY19sZW5ndGgsCS8qIHNldCBDUkMgbGVuZ3RoICovCisgIGxtY190MV9zZXRfY2lyY3VpdF90eXBlLAkvKiBzZXQgVDEgb3IgRTEgY2lyY3VpdCB0eXBlICovCisgIGxtY190MV93YXRjaGRvZworfTsKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfcHJvdC5oIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfcHJvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYjFkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19wcm90LmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfTE1DX1BST1RPX0hfCisjZGVmaW5lIF9MTUNfUFJPVE9fSF8KKwordm9pZCBsbWNfcHJvdG9faW5pdChsbWNfc29mdGNfdCAqIGNvbnN0KQordm9pZCBsbWNfcHJvdG9fYXR0YWNoKGxtY19zb2Z0Y190ICpzYyBjb25zdCkKK3ZvaWQgbG1jX3Byb3RvX2RldGFjaChsbWNfc29mdGMgKnNjIGNvbnN0KQordm9pZCBsbWNfcHJvdG9fcmVvcGVuKGxtY19zb2Z0Y190ICpzYyBjb25zdCkKK2ludCBsbWNfcHJvdG9faW9jdGwobG1jX3NvZnRjX3QgKnNjIGNvbnN0LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3ZvaWQgbG1jX3Byb3RvX29wZW4obG1jX3NvZnRjX3QgKnNjIGNvbnN0KQordm9pZCBsbWNfcHJvdG9fY2xvc2UobG1jX3NvZnRjX3QgKnNjIGNvbnN0KQordW5zaWduZWQgc2hvcnQgbG1jX3Byb3RvX3R5cGUobG1jX3NvZnRjX3QgKnNjIGNvbnN0LCBzdHJ1Y3Qgc2tidWZmICpza2IpCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX3Byb3RvLmMgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19wcm90by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ODc2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19wcm90by5jCkBAIC0wLDAgKzEsMjQ5IEBACisgLyoKKyAgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMCBMQU4gTWVkaWEgQ29ycG9yYXRpb24gKExNQykKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgd3d3Lmxhbm1lZGlhLmNvbQorICAqCisgICogVGhpcyBjb2RlIGlzIHdyaXR0ZW4gYnk6CisgICogQW5kcmV3IFN0YW5sZXktSm9uZXMgKGFzakBjYmFuLmNvbSkKKyAgKiBSb2IgQnJhdW4gKGJicmF1bkB2aXguY29tKSwKKyAgKiBNaWNoYWVsIEdyYWZmIChleHBsb3JlckB2aXguY29tKSBhbmQKKyAgKiBNYXR0IFRob21hcyAobWF0dEAzYW0tc29mdHdhcmUuY29tKS4KKyAgKgorICAqIFdpdGggSGVscCBCeToKKyAgKiBEYXZpZCBCb2dncworICAqIFJvbiBDcmFuZQorICAqIEFsbGFuIENveAorICAqCisgICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAqCisgICogRHJpdmVyIGZvciB0aGUgTGFuTWVkaWEgTE1DNTIwMCwgTE1DNTI0NSwgTE1DMTAwMCwgTE1DMTIwMCBjYXJkcy4KKyAgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvc3luY3BwcC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPiAgICAgICAgICAgICAvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKworI2luY2x1ZGUgImxtYy5oIgorI2luY2x1ZGUgImxtY192YXIuaCIKKyNpbmNsdWRlICJsbWNfZGVidWcuaCIKKyNpbmNsdWRlICJsbWNfaW9jdGwuaCIKKyNpbmNsdWRlICJsbWNfcHJvdG8uaCIKKworLyoKKyAqIFRoZSBjb21waWxlLXRpbWUgdmFyaWFibGUgU1BQUFNUVVAgY2F1c2VzIHRoZSBtb2R1bGUgdG8gYmUKKyAqIGNvbXBpbGVkIHdpdGhvdXQgcmVmZXJlbmNpbmcgYW55IG9mIHRoZSBzeW5jIHBwcCByb3V0aW5lcy4KKyAqLworI2lmZGVmIFNQUFBTVFVCCisjZGVmaW5lIFNQUFBfZGV0YWNoKGQpCSh2b2lkKTAKKyNkZWZpbmUgU1BQUF9vcGVuKGQpCTAKKyNkZWZpbmUgU1BQUF9yZW9wZW4oZCkJKHZvaWQpMAorI2RlZmluZSBTUFBQX2Nsb3NlKGQpCSh2b2lkKTAKKyNkZWZpbmUgU1BQUF9hdHRhY2goZCkJKHZvaWQpMAorI2RlZmluZSBTUFBQX2RvX2lvY3RsKGQsaSxjKQktRU9QTk9UU1VQUAorI2Vsc2UKKyNkZWZpbmUgU1BQUF9hdHRhY2goeCkJc3BwcF9hdHRhY2goKHgpLT5wZCkKKyNkZWZpbmUgU1BQUF9kZXRhY2goeCkJc3BwcF9kZXRhY2goKHgpLT5wZC0+ZGV2KQorI2RlZmluZSBTUFBQX29wZW4oeCkJc3BwcF9vcGVuKCh4KS0+cGQtPmRldikKKyNkZWZpbmUgU1BQUF9yZW9wZW4oeCkJc3BwcF9yZW9wZW4oKHgpLT5wZC0+ZGV2KQorI2RlZmluZSBTUFBQX2Nsb3NlKHgpCXNwcHBfY2xvc2UoKHgpLT5wZC0+ZGV2KQorI2RlZmluZSBTUFBQX2RvX2lvY3RsKHgsIHksIHopCXNwcHBfZG9faW9jdGwoKHgpLT5wZC0+ZGV2LCAoeSksICh6KSkKKyNlbmRpZgorCisvLyBpbml0Cit2b2lkIGxtY19wcm90b19pbml0KGxtY19zb2Z0Y190ICpzYykgLypGT0xEMDAqLworeworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19pbml0IGluIik7CisgICAgc3dpdGNoKHNjLT5pZl90eXBlKXsKKyAgICBjYXNlIExNQ19QUFA6CisgICAgICAgIHNjLT5wZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcHBfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYy0+cGQpIHsKKwkJcHJpbnRrKCJsbWNfcHJvdG9faW5pdCgpOiBrbWFsbG9jIGZhaWx1cmUhXG4iKTsKKwkJcmV0dXJuOworCX0KKyAgICAgICAgc2MtPnBkLT5kZXYgPSBzYy0+bG1jX2RldmljZTsKKyAgICAgICAgc2MtPmlmX3B0ciA9IHNjLT5wZDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMTUNfUkFXOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3Byb3RvX2luaXQgb3V0Iik7Cit9CisKKy8vIGF0dGFjaAordm9pZCBsbWNfcHJvdG9fYXR0YWNoKGxtY19zb2Z0Y190ICpzYykgLypGT0xEMDAqLworeworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19hdHRhY2ggaW4iKTsKKyAgICBzd2l0Y2goc2MtPmlmX3R5cGUpeworICAgIGNhc2UgTE1DX1BQUDoKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNjLT5sbWNfZGV2aWNlOworICAgICAgICAgICAgU1BQUF9hdHRhY2goc2MpOworICAgICAgICAgICAgZGV2LT5kb19pb2N0bCA9IGxtY19pb2N0bDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIExNQ19ORVQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzYy0+bG1jX2RldmljZTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGV5IHNldCBhIGZldyBiYXNpY3MgYmVjYXVzZSB0aGV5IGRvbid0IHVzZSBzeW5jX3BwcAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkZXYtPmZsYWdzIHw9IElGRl9QT0lOVE9QT0lOVDsKKyAgICAgICAgICAgIGRldi0+aGFyZF9oZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSAwOworICAgICAgICAgICAgZGV2LT5hZGRyX2xlbiA9IDA7CisgICAgICAgIH0KKyAgICBjYXNlIExNQ19SQVc6IC8qIFNldHVwIHRoZSB0YXNrIHF1ZXVlLCBtYXliZSB3ZSBzaG91bGQgbm90aWZ5IHNvbWVvbmU/ICovCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9fYXR0YWNoIG91dCIpOworfQorCisvLyBkZXRhY2gKK3ZvaWQgbG1jX3Byb3RvX2RldGFjaChsbWNfc29mdGNfdCAqc2MpIC8qRk9MRDAwKi8KK3sKKyAgICBzd2l0Y2goc2MtPmlmX3R5cGUpeworICAgIGNhc2UgTE1DX1BQUDoKKyAgICAgICAgU1BQUF9kZXRhY2goc2MpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExNQ19SQVc6IC8qIFRlbGwgc29tZW9uZSB3ZSdyZSBkZXRhY2hpbmc/ICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworfQorCisvLyByZW9wZW4KK3ZvaWQgbG1jX3Byb3RvX3Jlb3BlbihsbWNfc29mdGNfdCAqc2MpIC8qRk9MRDAwKi8KK3sKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9fcmVvcGVuIGluIik7CisgICAgc3dpdGNoKHNjLT5pZl90eXBlKXsKKyAgICBjYXNlIExNQ19QUFA6CisgICAgICAgIFNQUFBfcmVvcGVuKHNjKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMTUNfUkFXOiAvKiBSZXNldCB0aGUgaW50ZXJmYWNlIGFmdGVyIGJlaW5nIGRvd24sIHByZXJhcGUgdG8gcmVjZWl2ZSBwYWNrZXRzIGFnYWluICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9fcmVvcGVuIG91dCIpOworfQorCisKKy8vIGlvY3RsCitpbnQgbG1jX3Byb3RvX2lvY3RsKGxtY19zb2Z0Y190ICpzYywgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpIC8qRk9MRDAwKi8KK3sKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9faW9jdGwgb3V0Iik7CisgICAgc3dpdGNoKHNjLT5pZl90eXBlKXsKKyAgICBjYXNlIExNQ19QUFA6CisgICAgICAgIHJldHVybiBTUFBQX2RvX2lvY3RsIChzYywgaWZyLCBjbWQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9faW9jdGwgb3V0Iik7Cit9CisKKy8vIG9wZW4KK3ZvaWQgbG1jX3Byb3RvX29wZW4obG1jX3NvZnRjX3QgKnNjKSAvKkZPTEQwMCovCit7CisgICAgaW50IHJldDsKKworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19vcGVuIGluIik7CisgICAgc3dpdGNoKHNjLT5pZl90eXBlKXsKKyAgICBjYXNlIExNQ19QUFA6CisgICAgICAgIHJldCA9IFNQUFBfb3BlbihzYyk7CisgICAgICAgIGlmKHJldCA8IDApCisgICAgICAgICAgICBwcmludGsoIiVzOiBzeW5jUFBQIG9wZW4gZmFpbGVkOiAlZFxuIiwgc2MtPm5hbWUsIHJldCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE1DX1JBVzogLyogV2UncmUgYWJvdXQgdG8gc3RhcnQgZ2V0dGluZyBwYWNrZXRzISAqLworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3Byb3RvX29wZW4gb3V0Iik7Cit9CisKKy8vIGNsb3NlCisKK3ZvaWQgbG1jX3Byb3RvX2Nsb3NlKGxtY19zb2Z0Y190ICpzYykgLypGT0xEMDAqLworeworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19jbG9zZSBpbiIpOworICAgIHN3aXRjaChzYy0+aWZfdHlwZSl7CisgICAgY2FzZSBMTUNfUFBQOgorICAgICAgICBTUFBQX2Nsb3NlKHNjKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMTUNfUkFXOiAvKiBJbnRlcmZhY2UgZ29pbmcgZG93biAqLworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3Byb3RvX2Nsb3NlIG91dCIpOworfQorCit1bnNpZ25lZCBzaG9ydCBsbWNfcHJvdG9fdHlwZShsbWNfc29mdGNfdCAqc2MsIHN0cnVjdCBza19idWZmICpza2IpIC8qRk9MRDAwKi8KK3sKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9fdHlwZSBpbiIpOworICAgIHN3aXRjaChzYy0+aWZfdHlwZSl7CisgICAgY2FzZSBMTUNfUFBQOgorICAgICAgICByZXR1cm4gaHRvbnMoRVRIX1BfV0FOX1BQUCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE1DX05FVDoKKyAgICAgICAgcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8yKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMTUNfUkFXOiAvKiBQYWNrZXQgdHlwZSBmb3Igc2tidWZmIGtpbmQgb2YgdXNlbGVzcyAqLworICAgICAgICByZXR1cm4gaHRvbnMoRVRIX1BfODAyXzIpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gcHJvdG9jb2wgc2V0IGZvciB0aGlzIGludGVyZmFjZSwgYXNzdW1pbmcgODAyLjIgKHdoaWNoIGlzIHdyb25nISEpXG4iLCBzYy0+bmFtZSk7CisgICAgICAgIHJldHVybiBodG9ucyhFVEhfUF84MDJfMik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9fdHllIG91dCIpOworCit9CisKK3ZvaWQgbG1jX3Byb3RvX25ldGlmKGxtY19zb2Z0Y190ICpzYywgc3RydWN0IHNrX2J1ZmYgKnNrYikgLypGT0xEMDAqLworeworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19uZXRpZiBpbiIpOworICAgIHN3aXRjaChzYy0+aWZfdHlwZSl7CisgICAgY2FzZSBMTUNfUFBQOgorICAgIGNhc2UgTE1DX05FVDoKKyAgICBkZWZhdWx0OgorICAgICAgICBza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisgICAgICAgIG5ldGlmX3J4KHNrYik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE1DX1JBVzoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19uZXRpZiBvdXQiKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfcHJvdG8uaCBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwYTU1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX3Byb3RvLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfTE1DX1BST1RPX0hfCisjZGVmaW5lIF9MTUNfUFJPVE9fSF8KKwordm9pZCBsbWNfcHJvdG9faW5pdChsbWNfc29mdGNfdCAqc2MpOwordm9pZCBsbWNfcHJvdG9fYXR0YWNoKGxtY19zb2Z0Y190ICpzYyk7Cit2b2lkIGxtY19wcm90b19kZXRhY2gobG1jX3NvZnRjX3QgKnNjKTsKK3ZvaWQgbG1jX3Byb3RvX3Jlb3BlbihsbWNfc29mdGNfdCAqc2MpOworaW50IGxtY19wcm90b19pb2N0bChsbWNfc29mdGNfdCAqc2MsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKK3ZvaWQgbG1jX3Byb3RvX29wZW4obG1jX3NvZnRjX3QgKnNjKTsKK3ZvaWQgbG1jX3Byb3RvX2Nsb3NlKGxtY19zb2Z0Y190ICpzYyk7Cit1bnNpZ25lZCBzaG9ydCBsbWNfcHJvdG9fdHlwZShsbWNfc29mdGNfdCAqc2MsIHN0cnVjdCBza19idWZmICpza2IpOwordm9pZCBsbWNfcHJvdG9fbmV0aWYobG1jX3NvZnRjX3QgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBsbWNfc2tiX3Jhd3BhY2tldHMoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwgaW50IHVudXNlZCk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vbG1jL2xtY192YXIuaCBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX3Zhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMDAzYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY192YXIuaApAQCAtMCwwICsxLDU3MCBAQAorI2lmbmRlZiBfTE1DX1ZBUl9IXworI2RlZmluZSBfTE1DX1ZBUl9IXworCisvKiAkSWQ6IGxtY192YXIuaCx2IDEuMTcgMjAwMC8wNC8wNiAxMjoxNjo0NyBhc2ogRXhwICQgKi8KKworIC8qCisgICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDAgTEFOIE1lZGlhIENvcnBvcmF0aW9uIChMTUMpCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gIHd3dy5sYW5tZWRpYS5jb20KKyAgKgorICAqIFRoaXMgY29kZSBpcyB3cml0dGVuIGJ5OgorICAqIEFuZHJldyBTdGFubGV5LUpvbmVzIChhc2pAY2Jhbi5jb20pCisgICogUm9iIEJyYXVuIChiYnJhdW5Adml4LmNvbSksCisgICogTWljaGFlbCBHcmFmZiAoZXhwbG9yZXJAdml4LmNvbSkgYW5kCisgICogTWF0dCBUaG9tYXMgKG1hdHRAM2FtLXNvZnR3YXJlLmNvbSkuCisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorCisjaWZuZGVmIF9fS0VSTkVMX18KK3R5cGVkZWYgc2lnbmVkIGNoYXIgczg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdTg7CisKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OworCit0eXBlZGVmIHNpZ25lZCBpbnQgczMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOworCit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgczY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdTY0OworCisjZGVmaW5lIEJJVFNfUEVSX0xPTkcgMzIgCisKKyNlbmRpZgorCisvKgorICogYmFzaWMgZGVmaW5pdGlvbnMgdXNlZCBpbiBsbWMgaW5jbHVkZSBmaWxlcworICovCisKK3R5cGVkZWYgc3RydWN0IGxtY19fX3NvZnRjIGxtY19zb2Z0Y190OwordHlwZWRlZiBzdHJ1Y3QgbG1jX19fbWVkaWEgbG1jX21lZGlhX3Q7Cit0eXBlZGVmIHN0cnVjdCBsbWNfX19jdGwgbG1jX2N0bF90OworCisjZGVmaW5lIGxtY19jc3JwdHJfdCAgICB1bnNpZ25lZCBsb25nCisjZGVmaW5lIHVfaW50MTZfdAl1MTYKKyNkZWZpbmUgdV9pbnQ4X3QJdTgKKyNkZWZpbmUgdHVsaXBfdWludDMyX3QJdTMyCisKKyNkZWZpbmUgTE1DX1JFR19SQU5HRSAweDgwCisKKyNkZWZpbmUgTE1DX1BSSU5URl9GTVQgICIlcyIKKyNkZWZpbmUgTE1DX1BSSU5URl9BUkdTCShzYy0+bG1jX2RldmljZS0+bmFtZSkKKworI2RlZmluZSBUWF9USU1FT1VUICgyKkhaKQorCisjZGVmaW5lIExNQ19UWERFU0NTICAgICAgICAgICAgMzIKKyNkZWZpbmUgTE1DX1JYREVTQ1MgICAgICAgICAgICAzMgorCisjZGVmaW5lIExNQ19MSU5LX1VQICAgICAgICAgICAgMQorI2RlZmluZSBMTUNfTElOS19ET1dOICAgICAgICAgIDAKKworLyogVGhlc2UgbWFjcm9zIGZvciBnZW5lcmljIHJlYWQgYW5kIHdyaXRlIHRvIGFuZCBmcm9tIHRoZSBkZWMgY2hpcCAqLworI2RlZmluZSBMTUNfQ1NSX1JFQUQoc2MsIGNzcikgXAorCWlubCgoc2MpLT5sbWNfY3Nycy5jc3IpCisjZGVmaW5lIExNQ19DU1JfV1JJVEUoc2MsIHJlZywgdmFsKSBcCisJb3V0bCgodmFsKSwgKHNjKS0+bG1jX2NzcnMucmVnKQorCisvLyNpZmRlZiBfTElOVVhfREVMQVlfSAorLy8JI2RlZmluZSBTTE9XX0RPV05fSU8gdWRlbGF5KDIpOworLy8JI3VuZGVmIF9fU0xPV19ET1dOX0lPCisvLwkjZGVmaW5lIF9fU0xPV19ET1dOX0lPIHVkZWxheSgyKTsKKy8vI2VuZGlmCisKKyNkZWZpbmUgREVMQVkobikgU0xPV19ET1dOX0lPCisKKyNkZWZpbmUgbG1jX2RlbGF5KCkgaW5sKHNjLT5sbWNfY3Nycy5jc3JfOSkKKworLyogVGhpcyBtYWNybyBzeW5jJ3MgdXAgd2l0aCB0aGUgbWlpIHNvIHRoYXQgcmVhZHMgYW5kIHdyaXRlcyBjYW4gdGFrZSBwbGFjZSAqLworI2RlZmluZSBMTUNfTUlJX1NZTkMoc2MpIGRvIHtpbnQgbj0zMjsgd2hpbGUoIG4gPj0gMCApIHsgXAorICAgICAgICAgICAgICAgIExNQ19DU1JfV1JJVEUoKHNjKSwgY3NyXzksIDB4MjAwMDApOyBcCisJCWxtY19kZWxheSgpOyBcCisJCUxNQ19DU1JfV1JJVEUoKHNjKSwgY3NyXzksIDB4MzAwMDApOyBcCisgICAgICAgICAgICAgICAgbG1jX2RlbGF5KCk7IFwKKwkJbi0tOyB9fSB3aGlsZSgwKQorCitzdHJ1Y3QgbG1jX3JlZ2ZpbGVfdCB7CisgICAgbG1jX2NzcnB0cl90IGNzcl9idXNtb2RlOyAgICAgICAgICAgICAgICAgIC8qIENTUjAgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyX3R4cG9sbDsgICAgICAgICAgICAgICAgICAgLyogQ1NSMSAqLworICAgIGxtY19jc3JwdHJfdCBjc3Jfcnhwb2xsOyAgICAgICAgICAgICAgICAgICAvKiBDU1IyICovCisgICAgbG1jX2NzcnB0cl90IGNzcl9yeGxpc3Q7ICAgICAgICAgICAgICAgICAgIC8qIENTUjMgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyX3R4bGlzdDsgICAgICAgICAgICAgICAgICAgLyogQ1NSNCAqLworICAgIGxtY19jc3JwdHJfdCBjc3Jfc3RhdHVzOyAgICAgICAgICAgICAgICAgICAvKiBDU1I1ICovCisgICAgbG1jX2NzcnB0cl90IGNzcl9jb21tYW5kOyAgICAgICAgICAgICAgICAgIC8qIENTUjYgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyX2ludHI7ICAgICAgICAgICAgICAgICAgICAgLyogQ1NSNyAqLworICAgIGxtY19jc3JwdHJfdCBjc3JfbWlzc2VkX2ZyYW1lczsgICAgICAgICAgICAvKiBDU1I4ICovCisgICAgbG1jX2NzcnB0cl90IGNzcl85OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENTUjkgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyXzEwOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1NSMTAgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyXzExOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1NSMTEgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyXzEyOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1NSMTIgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyXzEzOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1NSMTMgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyXzE0OyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1NSMTQgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyXzE1OyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1NSMTUgKi8KK307CisKKyNkZWZpbmUgY3NyX2VuZXRyb20gICAgICAgICAgICAgY3NyXzkgICAvKiAyMTA0MCAqLworI2RlZmluZSBjc3JfcmVzZXJ2ZWQgICAgICAgICAgICBjc3JfMTAgIC8qIDIxMDQwICovCisjZGVmaW5lIGNzcl9mdWxsX2R1cGxleCAgICAgICAgIGNzcl8xMSAgLyogMjEwNDAgKi8KKyNkZWZpbmUgY3NyX2Jvb3Ryb20gICAgICAgICAgICAgY3NyXzEwICAvKiAyMTA0MS8yMTE0MEEvPz8gKi8KKyNkZWZpbmUgY3NyX2dwICAgICAgICAgICAgICAgICAgY3NyXzEyICAvKiAyMTE0MCogKi8KKyNkZWZpbmUgY3NyX3dhdGNoZG9nICAgICAgICAgICAgY3NyXzE1ICAvKiAyMTE0MCogKi8KKyNkZWZpbmUgY3NyX2dwX3RpbWVyICAgICAgICAgICAgY3NyXzExICAvKiAyMTA0MS8yMTE0MCogKi8KKyNkZWZpbmUgY3NyX3Nyb21fbWlpICAgICAgICAgICAgY3NyXzkgICAvKiAyMTA0MS8yMTE0MCogKi8KKyNkZWZpbmUgY3NyX3NpYV9zdGF0dXMgICAgICAgICAgY3NyXzEyICAvKiAyMTA0eCAqLworI2RlZmluZSBjc3Jfc2lhX2Nvbm5lY3Rpdml0eSAgICBjc3JfMTMgIC8qIDIxMDR4ICovCisjZGVmaW5lIGNzcl9zaWFfdHhfcnggICAgICAgICAgIGNzcl8xNCAgLyogMjEwNHggKi8KKyNkZWZpbmUgY3NyX3NpYV9nZW5lcmFsICAgICAgICAgY3NyXzE1ICAvKiAyMTA0eCAqLworCisvKiB0dWxpcCBsZW5ndGgvY29udHJvbCB0cmFuc21pdCBkZXNjcmlwdG9yIGRlZmluaXRpb25zCisgKiAgdXNlZCB0byBkZWZpbmUgYml0cyBpbiB0aGUgc2Vjb25kIHR1bGlwX2Rlc2NfdCBmaWVsZCAobGVuZ3RoKQorICogIGZvciB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciAtYmF6ICovCisKKyNkZWZpbmUgTE1DX1RERVNfRklSU1RfQlVGRkVSX1NJWkUgICAgICAgKCh1X2ludDMyX3QpKDB4MDAwMDA3RkYpKQorI2RlZmluZSBMTUNfVERFU19TRUNPTkRfQlVGRkVSX1NJWkUgICAgICAoKHVfaW50MzJfdCkoMHgwMDNGRjgwMCkpCisjZGVmaW5lIExNQ19UREVTX0hBU0hfRklMVEVSSU5HICAgICAgICAgICgodV9pbnQzMl90KSgweDAwNDAwMDAwKSkKKyNkZWZpbmUgTE1DX1RERVNfRElTQUJMRV9QQURESU5HICAgICAgICAgKCh1X2ludDMyX3QpKDB4MDA4MDAwMDApKQorI2RlZmluZSBMTUNfVERFU19TRUNPTkRfQUREUl9DSEFJTkVEICAgICAoKHVfaW50MzJfdCkoMHgwMTAwMDAwMCkpCisjZGVmaW5lIExNQ19UREVTX0VORF9PRl9SSU5HICAgICAgICAgICAgICgodV9pbnQzMl90KSgweDAyMDAwMDAwKSkKKyNkZWZpbmUgTE1DX1RERVNfQUREX0NSQ19ESVNBQkxFICAgICAgICAgKCh1X2ludDMyX3QpKDB4MDQwMDAwMDApKQorI2RlZmluZSBMTUNfVERFU19TRVRVUF9QQUNLRVQgICAgICAgICAgICAoKHVfaW50MzJfdCkoMHgwODAwMDAwMCkpCisjZGVmaW5lIExNQ19UREVTX0lOVkVSU0VfRklMVEVSSU5HICAgICAgICgodV9pbnQzMl90KSgweDEwMDAwMDAwKSkKKyNkZWZpbmUgTE1DX1RERVNfRklSU1RfU0VHTUVOVCAgICAgICAgICAgKCh1X2ludDMyX3QpKDB4MjAwMDAwMDApKQorI2RlZmluZSBMTUNfVERFU19MQVNUX1NFR01FTlQgICAgICAgICAgICAoKHVfaW50MzJfdCkoMHg0MDAwMDAwMCkpCisjZGVmaW5lIExNQ19UREVTX0lOVEVSUlVQVF9PTl9DT01QTEVUSU9OICgodV9pbnQzMl90KSgweDgwMDAwMDAwKSkKKworI2RlZmluZSBUREVTX1NFQ09ORF9CVUZGRVJfU0laRV9CSVRfTlVNQkVSICAxMQorI2RlZmluZSBUREVTX0NPTExJU0lPTl9DT1VOVF9CSVRfTlVNQkVSICAgICAzCisKKy8qIENvbnN0YW50cyBmb3IgdGhlIFJDViBkZXNjcmlwdG9yIFJERVMgKi8KKworI2RlZmluZSBMTUNfUkRFU19PVkVSRkxPVyAgICAgICAgICAgICAoKHVfaW50MzJfdCkoMHgwMDAwMDAwMSkpCisjZGVmaW5lIExNQ19SREVTX0NSQ19FUlJPUiAgICAgICAgICAgICgodV9pbnQzMl90KSgweDAwMDAwMDAyKSkKKyNkZWZpbmUgTE1DX1JERVNfRFJJQkJMSU5HX0JJVCAgICAgICAgICAgICgodV9pbnQzMl90KSgweDAwMDAwMDA0KSkKKyNkZWZpbmUgTE1DX1JERVNfUkVQT1JUX09OX01JSV9FUlIgICAgKCh1X2ludDMyX3QpKDB4MDAwMDAwMDgpKQorI2RlZmluZSBMTUNfUkRFU19SQ1ZfV0FUQ0hET0dfVElNRU9VVCAoKHVfaW50MzJfdCkoMHgwMDAwMDAxMCkpCisjZGVmaW5lIExNQ19SREVTX0ZSQU1FX1RZUEUgICAgICAgICAgICgodV9pbnQzMl90KSgweDAwMDAwMDIwKSkKKyNkZWZpbmUgTE1DX1JERVNfQ09MTElTSU9OX1NFRU4gICAgICAgKCh1X2ludDMyX3QpKDB4MDAwMDAwNDApKQorI2RlZmluZSBMTUNfUkRFU19GUkFNRV9UT09fTE9ORyAgICAgICAoKHVfaW50MzJfdCkoMHgwMDAwMDA4MCkpCisjZGVmaW5lIExNQ19SREVTX0xBU1RfREVTQ1JJUFRPUiAgICAgICgodV9pbnQzMl90KSgweDAwMDAwMTAwKSkKKyNkZWZpbmUgTE1DX1JERVNfRklSU1RfREVTQ1JJUFRPUiAgICAgKCh1X2ludDMyX3QpKDB4MDAwMDAyMDApKQorI2RlZmluZSBMTUNfUkRFU19NVUxUSUNBU1RfRlJBTUUgICAgICAoKHVfaW50MzJfdCkoMHgwMDAwMDQwMCkpCisjZGVmaW5lIExNQ19SREVTX1JVTlRfRlJBTUUgICAgICAgICAgICgodV9pbnQzMl90KSgweDAwMDAwODAwKSkKKyNkZWZpbmUgTE1DX1JERVNfREFUQV9UWVBFICAgICAgICAgICAgKCh1X2ludDMyX3QpKDB4MDAwMDMwMDApKQorI2RlZmluZSBMTUNfUkRFU19MRU5HVEhfRVJST1IgICAgICAgICAoKHVfaW50MzJfdCkoMHgwMDAwNDAwMCkpCisjZGVmaW5lIExNQ19SREVTX0VSUk9SX1NVTU1BUlkgICAgICAgICgodV9pbnQzMl90KSgweDAwMDA4MDAwKSkKKyNkZWZpbmUgTE1DX1JERVNfRlJBTUVfTEVOR1RIICAgICAgICAgKCh1X2ludDMyX3QpKDB4M0ZGRjAwMDApKQorI2RlZmluZSBMTUNfUkRFU19PV05fQklUICAgICAgICAgICAgICAoKHVfaW50MzJfdCkoMHg4MDAwMDAwMCkpCisKKyNkZWZpbmUgUkRFU19GUkFNRV9MRU5HVEhfQklUX05VTUJFUiAgICAgICAxNgorCisjZGVmaW5lIExNQ19SREVTX0VSUk9SX01BU0sgKCAodV9pbnQzMl90KSggXAorCSAgTE1DX1JERVNfT1ZFUkZMT1cgXAorCXwgTE1DX1JERVNfRFJJQkJMSU5HX0JJVCBcCisJfCBMTUNfUkRFU19SRVBPUlRfT05fTUlJX0VSUiBcCisgICAgICAgIHwgTE1DX1JERVNfQ09MTElTSU9OX1NFRU4gKSApCisKKworLyoKKyAqIElvY3RsIGluZm8KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQzMl90CW47CisJdV9pbnQzMl90CW07CisJdV9pbnQzMl90CXY7CisJdV9pbnQzMl90CXg7CisJdV9pbnQzMl90CXI7CisJdV9pbnQzMl90CWY7CisJdV9pbnQzMl90CWV4YWN0OworfSBsbWNfYXY5MTEwX3Q7CisKKy8qCisgKiBDb21tb24gc3RydWN0dXJlIHBhc3NlZCB0byB0aGUgaW9jdGwgY29kZS4KKyAqLworc3RydWN0IGxtY19fX2N0bCB7CisJdV9pbnQzMl90CWNhcmR0eXBlOworCXVfaW50MzJfdAljbG9ja19zb3VyY2U7CQkvKiBIU1NJLCBUMSAqLworCXVfaW50MzJfdAljbG9ja19yYXRlOwkJLyogVDEgKi8KKwl1X2ludDMyX3QJY3JjX2xlbmd0aDsKKwl1X2ludDMyX3QJY2FibGVfbGVuZ3RoOwkJLyogRFMzICovCisJdV9pbnQzMl90CXNjcmFtYmxlcl9vbm9mZjsJLyogRFMzICovCisJdV9pbnQzMl90CWNhYmxlX3R5cGU7CQkvKiBUMSAqLworCXVfaW50MzJfdAlrZWVwYWxpdmVfb25vZmY7CS8qIHByb3RvY29sICovCisJdV9pbnQzMl90CXRpY2tzOwkJCS8qIHRpY2tzL3NlYyAqLworCXVuaW9uIHsKKwkJbG1jX2F2OTExMF90CXNzaTsKKwl9IGNhcmRzcGVjOworCXVfaW50MzJfdCAgICAgICBjaXJjdWl0X3R5cGU7ICAgLyogVDEgb3IgRTEgKi8KK307CisKKworLyoKKyAqIENhcmVmdWxsLCBsb29rIGF0IHRoZSBkYXRhIHNoZWV0LCB0aGVyZSdzIG1vcmUgdG8gdGhpcworICogc3RydWN0dXJlIHRoYW4gbWVldHMgdGhlIGV5ZS4gIEl0IHNob3VsZCBwcm9iYWJseSBiZToKKyAqCisgKiBzdHJ1Y3QgdHVsaXBfZGVzY190IHsKKyAqICAgICAgICAgdTggIG93bjoxOworICogICAgICAgICB1MzIgc3RhdHVzOjMxOworICogICAgICAgICB1MzIgY29udHJvbDoxMDsKKyAqICAgICAgICAgdTMyIGJ1ZmZlcjE7CisgKiAgICAgICAgIHUzMiBidWZmZXIyOworICogfTsKKyAqIFlvdSBjb3VsZCBhbHNvIGV4cGFuZCBzdGF0dXMgY29udHJvbCB0byBwcm92aWRlIG1vcmUgYml0IGluZm9ybWF0aW9uCisgKi8KKworc3RydWN0IHR1bGlwX2Rlc2NfdCB7CisJczMyIHN0YXR1czsKKwlzMzIgbGVuZ3RoOworCXUzMiBidWZmZXIxOworCXUzMiBidWZmZXIyOworfTsKKworLyoKKyAqIG1lZGlhIGluZGVwZW5kZW50IG1ldGhvZHMgdG8gY2hlY2sgb24gbWVkaWEgc3RhdHVzLCBsaW5rLCBsaWdodCBMRURzLAorICogZXRjLgorICovCitzdHJ1Y3QgbG1jX19fbWVkaWEgeworCXZvaWQJKCogaW5pdCkobG1jX3NvZnRjX3QgKiBjb25zdCk7CisJdm9pZAkoKiBkZWZhdWx0cykobG1jX3NvZnRjX3QgKiBjb25zdCk7CisJdm9pZAkoKiBzZXRfc3RhdHVzKShsbWNfc29mdGNfdCAqIGNvbnN0LCBsbWNfY3RsX3QgKik7CisJdm9pZAkoKiBzZXRfY2xvY2tfc291cmNlKShsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworCXZvaWQJKCogc2V0X3NwZWVkKShsbWNfc29mdGNfdCAqIGNvbnN0LCBsbWNfY3RsX3QgKik7CisJdm9pZAkoKiBzZXRfY2FibGVfbGVuZ3RoKShsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworCXZvaWQJKCogc2V0X3NjcmFtYmxlcikobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKKwlpbnQJKCogZ2V0X2xpbmtfc3RhdHVzKShsbWNfc29mdGNfdCAqIGNvbnN0KTsKKwl2b2lkCSgqIHNldF9saW5rX3N0YXR1cykobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKKwl2b2lkCSgqIHNldF9jcmNfbGVuZ3RoKShsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworICAgICAgICB2b2lkICAgICgqIHNldF9jaXJjdWl0X3R5cGUpKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CisgICAgICAgIHZvaWQJKCogd2F0Y2hkb2cpKGxtY19zb2Z0Y190ICogY29uc3QpOworfTsKKworCisjZGVmaW5lIFNUQVRDSEVDSyAgICAgMHhCRUVGQ0FGRQorCisvKiAgSW5jbHVkZWQgaW4gdGhpcyBzdHJ1Y3R1cmUgYXJlIGZpcnN0CisgKiAgIC0gc3RhbmRhcmQgbmV0X2RldmljZV9zdGF0cworICogICAtIHNvbWUgb3RoZXIgY291bnRlcnMgdXNlZCBmb3IgZGVidWcgYW5kIGRyaXZlciBwZXJmb3JtYW5jZQorICogIGV2YWx1YXRpb24gLWJhegorICovCitzdHJ1Y3QgbG1jX3N0YXRpc3RpY3MKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgcnhfcGFja2V0czsgICAgICAgICAgICAgLyogdG90YWwgcGFja2V0cyByZWNlaXZlZCAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgICB0eF9wYWNrZXRzOyAgICAgICAgICAgICAvKiB0b3RhbCBwYWNrZXRzIHRyYW5zbWl0dGVkICAgICovCisJdW5zaWduZWQgbG9uZyAgICAgcnhfYnl0ZXM7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHR4X2J5dGVzOworICAgICAgICAKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgcnhfZXJyb3JzOyAgICAgICAgICAgICAgLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgICB0eF9lcnJvcnM7ICAgICAgICAgICAgICAvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMgICAgICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHJ4X2Ryb3BwZWQ7ICAgICAgICAgICAgIC8qIG5vIHNwYWNlIGluIGxpbnV4IGJ1ZmZlcnMgICAgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgdHhfZHJvcHBlZDsgICAgICAgICAgICAgLyogbm8gc3BhY2UgYXZhaWxhYmxlIGluIGxpbnV4ICAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgICBtdWx0aWNhc3Q7ICAgICAgICAgICAgICAvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZCAgICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIGNvbGxpc2lvbnM7CisKKyAgICAgICAgLyogZGV0YWlsZWQgcnhfZXJyb3JzOiAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgICByeF9sZW5ndGhfZXJyb3JzOworICAgICAgICB1bnNpZ25lZCBsb25nICAgICByeF9vdmVyX2Vycm9yczsgICAgICAgICAvKiByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cgICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHJ4X2NyY19lcnJvcnM7ICAgICAgICAgIC8qIHJlY3ZlZCBwa3Qgd2l0aCBjcmMgZXJyb3IgICAgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgcnhfZnJhbWVfZXJyb3JzOyAgICAgICAgLyogcmVjdidkIGZyYW1lIGFsaWdubWVudCBlcnJvciAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgICByeF9maWZvX2Vycm9yczsgICAgICAgICAvKiByZWN2J3IgZmlmbyBvdmVycnVuICAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHJ4X21pc3NlZF9lcnJvcnM7ICAgICAgIC8qIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQgICAgICAgKi8KKworICAgICAgICAvKiBkZXRhaWxlZCB0eF9lcnJvcnMgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgdHhfYWJvcnRlZF9lcnJvcnM7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHR4X2NhcnJpZXJfZXJyb3JzOworICAgICAgICB1bnNpZ25lZCBsb25nICAgICB0eF9maWZvX2Vycm9yczsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgdHhfaGVhcnRiZWF0X2Vycm9yczsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgdHhfd2luZG93X2Vycm9yczsKKworICAgICAgICAvKiBmb3IgY3NsaXAgZXRjICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgcnhfY29tcHJlc3NlZDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB0eF9jb21wcmVzc2VkOworCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICogQ3VzdG9tIHN0YXRzICYgY291bnRlcnMgZm9sbG93IC1iYXogKi8KKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHZlcnNpb25fc2l6ZTsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIGxtY19jYXJkdHlwZTsKKworICAgICAgICB1X2ludDMyX3QgICAgICAgdHhfUHJvY1RpbWVvdXQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eF9JbnRUaW1lb3V0OworICAgICAgICB1X2ludDMyX3QgICAgICAgdHhfTm9Db21wbGV0ZUNudDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHR4X01heFhtdHNCNEludDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHR4X1RpbWVvdXRDbnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eF9PdXRPZlN5bmNQdHI7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eF90YnVzeTA7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eF90YnVzeTE7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eF90YnVzeV9jYWxsczsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHJlc2V0Q291bnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBsbWNfdHhmdWxsOworICAgICAgICB1X2ludDMyX3QgICAgICAgdGJ1c3k7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBkaXJ0eVR4OworICAgICAgICB1X2ludDMyX3QgICAgICAgbG1jX25leHRfdHg7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBvdGhlclR5cGVDbnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBsYXN0VHlwZTsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIGxhc3RUeXBlT0s7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eExvb3BDbnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB1c2VkWG10RGVzY3JpcENudDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHR4SW5kZXhDbnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICByeEludExvb3BDbnQ7CisKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHJ4X1NtYWxsUGt0Q250OworICAgICAgICB1X2ludDMyX3QgICAgICAgcnhfQmFkUGt0U3VyZ2VDbnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICByeF9CdWZmQWxsb2NFcnI7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eF9sb3NzT2ZDbG9ja0NudDsKKworICAgICAgICAvKiBUMSBlcnJvciBjb3VudGVycyAqLworICAgICAgICB1X2ludDMyX3QgICAgICAgZnJhbWluZ0JpdEVycm9yQ291bnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBsaW5lQ29kZVZpb2xhdGlvbkNvdW50OworCisgICAgICAgIHVfaW50MzJfdCAgICAgICBsb3NzT2ZGcmFtZUNvdW50OworICAgICAgICB1X2ludDMyX3QgICAgICAgY2hhbmdlT2ZGcmFtZUFsaWdubWVudENvdW50OworICAgICAgICB1X2ludDMyX3QgICAgICAgc2V2ZXJlbHlFcnJvcmVkRnJhbWVDb3VudDsKKworICAgICAgICB1X2ludDMyX3QgICAgICAgY2hlY2s7Cit9OworCisKK3R5cGVkZWYgc3RydWN0IGxtY194aW5mbyB7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBNYWdpYzA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJFRUZDQUZFICovCisKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIFBjaUNhcmRUeXBlOworICAgICAgICB1X2ludDMyX3QgICAgICAgUGNpU2xvdE51bWJlcjsgICAgICAgICAgLyogUENJIHNsb3QgbnVtYmVyICAgICAgICovCisKKyAgICAgICAgdV9pbnQxNl90ICAgICAgIERyaXZlck1ham9yVmVyc2lvbjsKKyAgICAgICAgdV9pbnQxNl90ICAgICAgIERyaXZlck1pbm9yVmVyc2lvbjsKKyAgICAgICAgdV9pbnQxNl90ICAgICAgIERyaXZlclN1YlZlcnNpb247CisKKyAgICAgICAgdV9pbnQxNl90ICAgICAgIFhpbGlueFJldmlzaW9uTnVtYmVyOworICAgICAgICB1X2ludDE2X3QgICAgICAgTWF4RnJhbWVTaXplOworCisgICAgICAgIHVfaW50MTZfdCAgICAgICB0MV9hbGFybTFfc3RhdHVzOworICAgICAgICB1X2ludDE2X3QgICAgICAgdDFfYWxhcm0yX3N0YXR1czsKKworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBsaW5rX3N0YXR1czsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIG1paV9yZWcxNjsKKworICAgICAgICB1X2ludDMyX3QgICAgICAgTWFnaWMxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBERUFEQkVFRiAqLworfSBMTUNfWElORk87CisKKworLyoKKyAqIGZvcndhcmQgZGVjbAorICovCitzdHJ1Y3QgbG1jX19fc29mdGMgeworICAgICAgICB2b2lkICppZl9wdHI7ICAgLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIgKHVzZWQgYnkgU1BQUCkgKi8KKwljaGFyICAgICAgICAgICAgICAgICAgICpuYW1lOworCXU4CQkJYm9hcmRfaWR4OworCXN0cnVjdCBsbWNfc3RhdGlzdGljcyAgIHN0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICAgICpsbWNfZGV2aWNlOworCisJaW50ICAgICAgICAgICAgICAgICAgICAgaGFuZywgcnhkZXNjLCBiYWRfcGFja2V0LCBzb21lX2NvdW50ZXI7CisJdV9pbnQzMl90ICAgICAgICAgICAgICAgdHhnbzsKKwlzdHJ1Y3QgbG1jX3JlZ2ZpbGVfdAlsbWNfY3NyczsKKwl2b2xhdGlsZSB1X2ludDMyX3QJbG1jX3R4dGljazsKKwl2b2xhdGlsZSB1X2ludDMyX3QJbG1jX3J4dGljazsKKwl1X2ludDMyX3QJCWxtY19mbGFnczsKKwl1X2ludDMyX3QJCWxtY19pbnRybWFzazsJLyogb3VyIGNvcHkgb2YgY3NyX2ludHIgKi8KKwl1X2ludDMyX3QJCWxtY19jbWRtb2RlOwkvKiBvdXIgY29weSBvZiBjc3JfY21kbW9kZSAqLworCXVfaW50MzJfdAkJbG1jX2J1c21vZGU7CS8qIG91ciBjb3B5IG9mIGNzcl9idXNtb2RlICovCisJdV9pbnQzMl90CQlsbWNfZ3Bpb19pbzsJLyogc3RhdGUgb2YgaW4vb3V0IHNldHRpbmdzICovCisJdV9pbnQzMl90CQlsbWNfZ3BpbzsJLyogc3RhdGUgb2Ygb3V0cHV0cyAqLworCXN0cnVjdCBza19idWZmKgkJbG1jX3R4cVtMTUNfVFhERVNDU107CisJc3RydWN0IHNrX2J1ZmYqCQlsbWNfcnhxW0xNQ19SWERFU0NTXTsKKwl2b2xhdGlsZQorCXN0cnVjdCB0dWxpcF9kZXNjX3QJbG1jX3J4cmluZ1tMTUNfUlhERVNDU107CisJdm9sYXRpbGUKKwlzdHJ1Y3QgdHVsaXBfZGVzY190CWxtY190eHJpbmdbTE1DX1RYREVTQ1NdOworCXVuc2lnbmVkIGludAkJbG1jX25leHRfcngsIGxtY19uZXh0X3R4OworCXZvbGF0aWxlCisJdW5zaWduZWQgaW50CQlsbWNfdGFpbnRfdHgsIGxtY190YWludF9yeDsKKwlpbnQJCQlsbWNfdHhfc3RhcnQsIGxtY190eGZ1bGw7CisJaW50CQkJbG1jX3R4YnVzeTsKKwl1X2ludDE2X3QJCWxtY19taWlyZWcxNjsKKwlpbnQJCQlsbWNfb2s7CisJaW50CQkJbGFzdF9saW5rX3N0YXR1czsKKwlpbnQJCQlsbWNfY2FyZHR5cGU7CisJdV9pbnQzMl90ICAgICAgICAgICAgICAgbGFzdF9mcmFtZWVycjsKKwlsbWNfbWVkaWFfdAkgICAgICAgKmxtY19tZWRpYTsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKwlsbWNfY3RsX3QJCWljdGw7CisJdV9pbnQzMl90CQlUeERlc2NyaXB0Q29udHJvbEluaXQ7ICAKKworCWludCAgICAgICAgICAgICAgICAgICAgIHR4X1RpbWVvdXRJbmQ7IC8qIGFkZGl0aW9uYWwgZHJpdmVyIHN0YXRlICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgdHhfVGltZW91dERpc3BsYXk7CisJdW5zaWduZWQgaW50CQlsYXN0bG1jX3RhaW50X3R4OworCWludCAgICAgICAgICAgICAgICAgICAgIGxhc3R0eF9wYWNrZXRzOworCXVfaW50MzJfdAkJdHhfY2xvY2tTdGF0ZTsKKwl1X2ludDMyX3QJCWxtY19jcmNTaXplOworCUxNQ19YSU5GTwkJbG1jX3hpbmZvOyAKKwljaGFyICAgICAgICAgICAgICAgICAgICBsbWNfeWVsLCBsbWNfYmx1ZSwgbG1jX3JlZDsgLyogZm9yIFQxIGFuZCBEUzMgKi8KKyAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgbG1jX3RpbWluZzsgLyogZm9yIEhTU0kgYW5kIFNTSSAqLworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBnb3RfaXJxOworCisgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIGxhc3RfbGVkX2Vycls0XTsKKworICAgICAgICB1MzIgICAgICAgICAgICAgICAgICAgICBsYXN0X2ludDsKKyAgICAgICAgdTMyICAgICAgICAgICAgICAgICAgICAgbnVtX2ludDsKKworCXNwaW5sb2NrX3QgICAgICAgICAgICAgIGxtY19sb2NrOworICAgICAgICB1X2ludDE2X3QgICAgICAgICAgICAgICBpZl90eXBlOyAgICAgICAvKiBQUFAgb3IgTkVUICovCisgICAgICAgIHN0cnVjdCBwcHBfZGV2aWNlICAgICAgICpwZDsKKworICAgICAgICAvKiBGYWlsdXJlIGNhc2VzICovCisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRfcmluZzsKKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZF9yZWN2X2FsbG9jOworCisgICAgICAgIC8qIFN0cnVjdHVyZSBjaGVjayAqLworICAgICAgICB1MzIgICAgICAgICAgICAgICAgICAgICBjaGVjazsKK307CisKKyNkZWZpbmUgTE1DX1BDSV9USU1FIDEKKyNkZWZpbmUgTE1DX0VYVF9USU1FIDAKKworI2RlZmluZSBQS1RfQlVGX1NaICAgICAgICAgICAgICAxNTQyICAvKiB3YXMgMTUzNiAqLworCisvKiBDU1I1IHNldHRpbmdzICovCisjZGVmaW5lIFRJTUVSX0lOVCAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBUUF9MSU5LX0ZBSUwgIDB4MDAwMDEwMDAKKyNkZWZpbmUgVFBfTElOS19QQVNTICAweDAwMDAwMDEwCisjZGVmaW5lIE5PUk1BTF9JTlQgICAgMHgwMDAxMDAwMAorI2RlZmluZSBBQk5PUk1BTF9JTlQgIDB4MDAwMDgwMDAKKyNkZWZpbmUgUlhfSkFCQkVSX0lOVCAweDAwMDAwMjAwCisjZGVmaW5lIFJYX0RJRUQgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBSWF9OT0JVRkYgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgUlhfSU5UICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFRYX0ZJRk9fVU5ERVIgMHgwMDAwMDAyMAorI2RlZmluZSBUWF9KQUJCRVIgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgVFhfTk9CVUZGICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFRYX0RJRUQgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBUWF9JTlQgICAgICAgIDB4MDAwMDAwMDEKKworLyogQ1NSNiBzZXR0aW5ncyAqLworI2RlZmluZSBPUEVSQVRJT05fTU9ERSAgMHgwMDAwMDIwMCAvKiBGdWxsIER1cGxleCAgICAgICovCisjZGVmaW5lIFBST01JU0NfTU9ERSAgICAweDAwMDAwMDQwIC8qIFByb21pc2N1b3VzIE1vZGUgKi8KKyNkZWZpbmUgUkVDSUVWRV9BTEwgICAgIDB4NDAwMDAwMDAgLyogUmVjaWV2ZSBBbGwgICAgICAqLworI2RlZmluZSBQQVNTX0JBRF9GUkFNRVMgMHgwMDAwMDAwOCAvKiBQYXNzIEJhZCBGcmFtZXMgICovCisKKy8qIERlYyBjb250cm9sIHJlZ2lzdGVycyAgQ1NSNiBhcyB3ZWxsICovCisjZGVmaW5lIExNQ19ERUNfU1QgMHgwMDAwMjAwMAorI2RlZmluZSBMTUNfREVDX1NSIDB4MDAwMDAwMDIKKworLyogQ1NSMTUgc2V0dGluZ3MgKi8KKyNkZWZpbmUgUkVDVl9XQVRDSERPR19ESVNBQkxFIDB4MDAwMDAwMTAKKyNkZWZpbmUgSkFCQkVSX0RJU0FCTEUgICAgICAgIDB4MDAwMDAwMDEKKworLyogTW9yZSBzZXR0aW5ncyAqLworLyoKKyAqIGFTUjYgLS0gQ29tbWFuZCAoT3BlcmF0aW9uIE1vZGUpIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgVFVMSVBfQ01EX1JFQ0VJVkVBTEwgICAgMHg0MDAwMDAwMEwgLyogKFJXKSAgUmVjZWl2ZWwgYWxsIGZyYW1lcz8gKi8KKyNkZWZpbmUgVFVMSVBfQ01EX01VU1RCRU9ORSAgICAgMHgwMjAwMDAwMEwgLyogKFJXKSAgTXVzdCBCZSBPbmUgKDIxMTQwKSAqLworI2RlZmluZSBUVUxJUF9DTURfVFhUSFJTSExEQ1RMICAweDAwNDAwMDAwTCAvKiAoUlcpICBUcmFuc21pdCBUaHJlc2hvbGQgTW9kZSAoMjExNDApICovCisjZGVmaW5lIFRVTElQX0NNRF9TVE9SRUZXRCAgICAgIDB4MDAyMDAwMDBMIC8qIChSVykgIFN0b3JlIGFuZCBGb3dhcmQgKDIxMTQwKSAqLworI2RlZmluZSBUVUxJUF9DTURfTk9IRUFSVEJFQVQgICAweDAwMDgwMDAwTCAvKiAoUlcpICBObyBIZWFydGJlYXQgKDIxMTQwKSAqLworI2RlZmluZSBUVUxJUF9DTURfUE9SVFNFTEVDVCAgICAweDAwMDQwMDAwTCAvKiAoUlcpICBQb3N0IFNlbGVjdCAoMTAwTWIpICgyMTE0MCkgKi8KKyNkZWZpbmUgVFVMSVBfQ01EX0ZVTExEVVBMRVggICAgMHgwMDAwMDIwMEwgLyogKFJXKSAgRnVsbCBEdXBsZXggTW9kZSAqLworI2RlZmluZSBUVUxJUF9DTURfT1BFUk1PREUgICAgICAweDAwMDAwQzAwTCAvKiAoUlcpICBPcGVyYXRpbmcgTW9kZSAqLworI2RlZmluZSBUVUxJUF9DTURfUFJPTUlTQ1VPVVMgICAweDAwMDAwMDQxTCAvKiAoUlcpICBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIFRVTElQX0NNRF9QQVNTQkFEUEtUICAgIDB4MDAwMDAwMDhMIC8qIChSVykgIFBhc3MgQmFkIEZyYW1lcyAqLworI2RlZmluZSBUVUxJUF9DTURfVEhSRVNIT0xEQ1RMICAweDAwMDBDMDAwTCAvKiAoUlcpICBUaHJlc2hvbGQgQ29udHJvbCAqLworCisjZGVmaW5lIFRVTElQX0dQX1BJTlNFVCAgICAgICAgIDB4MDAwMDAxMDBMCisjZGVmaW5lIFRVTElQX0JVU01PREVfU1dSRVNFVCAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIFRVTElQX1dBVENIRE9HX1RYRElTQUJMRSAweDAwMDAwMDAxTAorI2RlZmluZSBUVUxJUF9XQVRDSERPR19SWERJU0FCTEUgMHgwMDAwMDAxMEwKKworI2RlZmluZSBUVUxJUF9TVFNfTk9STUFMSU5UUiAgICAweDAwMDEwMDAwTCAvKiAoUlcpICBOb3JtYWwgSW50ZXJydXB0ICovCisjZGVmaW5lIFRVTElQX1NUU19BQk5STUxJTlRSICAgIDB4MDAwMDgwMDBMIC8qIChSVykgIEFibm9ybWFsIEludGVycnVwdCAqLworI2RlZmluZSBUVUxJUF9TVFNfRVJJICAgICAgICAgICAweDAwMDA0MDAwTCAvKiAoUlcpICBFYXJseSBSZWNlaXZlIEludGVycnVwdCAqLworI2RlZmluZSBUVUxJUF9TVFNfU1lTRVJST1IgICAgICAweDAwMDAyMDAwTCAvKiAoUlcpICBTeXN0ZW0gRXJyb3IgKi8KKyNkZWZpbmUgVFVMSVBfU1RTX0dURSAgICAgICAgICAgMHgwMDAwMDgwMEwgLyogKFJXKSAgR2VuZXJhbCBQdXBvc2UgVGltZXIgRXhwICovCisjZGVmaW5lIFRVTElQX1NUU19FVEkgICAgICAgICAgIDB4MDAwMDA0MDBMIC8qIChSVykgIEVhcmx5IFRyYW5zbWl0IEludGVycnVwdCAqLworI2RlZmluZSBUVUxJUF9TVFNfUlhXVCAgICAgICAgICAweDAwMDAwMjAwTCAvKiAoUlcpICBSZWNlaXZlciBXYXRjaGRvZyBUaW1lb3V0ICovCisjZGVmaW5lIFRVTElQX1NUU19SWFNUT1BQRUQgICAgIDB4MDAwMDAxMDBMIC8qIChSVykgIFJlY2VpdmVyIFByb2Nlc3MgU3RvcHBlZCAqLworI2RlZmluZSBUVUxJUF9TVFNfUlhOT0JVRiAgICAgICAweDAwMDAwMDgwTCAvKiAoUlcpICBSZWNlaXZlIEJ1ZiBVbmF2YWlsICovCisjZGVmaW5lIFRVTElQX1NUU19SWElOVFIgICAgICAgIDB4MDAwMDAwNDBMIC8qIChSVykgIFJlY2VpdmUgSW50ZXJydXB0ICovCisjZGVmaW5lIFRVTElQX1NUU19UWFVOREVSRkxPVyAgIDB4MDAwMDAwMjBMIC8qIChSVykgIFRyYW5zbWl0IFVuZGVyZmxvdyAqLworI2RlZmluZSBUVUxJUF9TVFNfVFhKQUJFUiAgICAgICAweDAwMDAwMDA4TCAvKiAoUlcpICBKYWJiZXIgdGltZW91dCAqLworI2RlZmluZSBUVUxJUF9TVFNfVFhOT0JVRiAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBUVUxJUF9TVFNfVFhTVE9QUEVEICAgICAweDAwMDAwMDAyTCAvKiAoUlcpICBUcmFuc21pdCBQcm9jZXNzIFN0b3BwZWQgKi8KKyNkZWZpbmUgVFVMSVBfU1RTX1RYSU5UUiAgICAgICAgMHgwMDAwMDAwMUwgLyogKFJXKSAgVHJhbnNtaXQgSW50ZXJydXB0ICovCisKKyNkZWZpbmUgVFVMSVBfU1RTX1JYU19TVE9QUEVEICAgMHgwMDAwMDAwMEwgLyogICAgICAgIDAwMCAtIFN0b3BwZWQgKi8KKworI2RlZmluZSBUVUxJUF9TVFNfUlhTVE9QUEVEICAgICAweDAwMDAwMTAwTCAgICAgICAgICAgICAvKiAoUlcpICBSZWNlaXZlIFByb2Nlc3MgU3RvcHBlZCAqLworI2RlZmluZSBUVUxJUF9TVFNfUlhOT0JVRiAgICAgICAweDAwMDAwMDgwTAorCisjZGVmaW5lIFRVTElQX0NNRF9UWFJVTiAgICAgICAgIDB4MDAwMDIwMDBMIC8qIChSVykgIFN0YXJ0L1N0b3AgVHJhbnNtaXR0ZXIgKi8KKyNkZWZpbmUgVFVMSVBfQ01EX1JYUlVOICAgICAgICAgMHgwMDAwMDAwMkwgLyogKFJXKSAgU3RhcnQvU3RvcCBSZWNlaXZlIEZpbHRlcmluZyAqLworI2RlZmluZSBUVUxJUF9EU1RTX1R4REVGRVJSRUQgICAweDAwMDAwMDAxICAgICAgLyogSW5pdGlhbGx5IERlZmVycmVkICovCisjZGVmaW5lIFRVTElQX0RTVFNfT1dORVIgICAgICAgIDB4ODAwMDAwMDAgICAgICAvKiBPd25lciAoMSA9IDIxMDQwKSAqLworI2RlZmluZSBUVUxJUF9EU1RTX1J4TUlJRVJSICAgICAweDAwMDAwMDA4CisjZGVmaW5lIExNQ19EU1RTX0VSUlNVTSAgICAgICAgIChUVUxJUF9EU1RTX1J4TUlJRVJSKQorCisjZGVmaW5lIFRVTElQX0RFRkFVTFRfSU5UUl9NQVNLICAoVFVMSVBfU1RTX05PUk1BTElOVFIgXAorICB8IFRVTElQX1NUU19SWElOVFIgICAgICAgXAorICB8IFRVTElQX1NUU19UWElOVFIgICAgIFwKKyAgfCBUVUxJUF9TVFNfQUJOUk1MSU5UUiBcCisgIHwgVFVMSVBfU1RTX1NZU0VSUk9SICAgXAorICB8IFRVTElQX1NUU19UWFNUT1BQRUQgIFwKKyAgfCBUVUxJUF9TVFNfVFhVTkRFUkZMT1dcCisgIHwgVFVMSVBfU1RTX1JYU1RPUFBFRCApCisKKyNkZWZpbmUgREVTQ19PV05FRF9CWV9TWVNURU0gICAoKHVfaW50MzJfdCkoMHgwMDAwMDAwMCkpCisjZGVmaW5lIERFU0NfT1dORURfQllfREMyMVg0ICAgKCh1X2ludDMyX3QpKDB4ODAwMDAwMDApKQorCisjaWZuZGVmIFRVTElQX0NNRF9SRUNFSVZFQUxMCisjZGVmaW5lIFRVTElQX0NNRF9SRUNFSVZFQUxMIDB4NDAwMDAwMDBMCisjZW5kaWYKKworLyogQWRhcHRlciBtb2R1bGUgbnVtYmVyICovCisjZGVmaW5lIExNQ19BREFQX0hTU0kgICAgICAgICAgIDIKKyNkZWZpbmUgTE1DX0FEQVBfRFMzICAgICAgICAgICAgMworI2RlZmluZSBMTUNfQURBUF9TU0kgICAgICAgICAgICA0CisjZGVmaW5lIExNQ19BREFQX1QxICAgICAgICAgICAgIDUKKworI2RlZmluZSBIRExDX0hEUl9MRU4gIDQKKyNkZWZpbmUgSERMQ19BRERSX0xFTiAxCisjZGVmaW5lIEhETENfU0xBUlAgICAgMHg4MDM1CisjZGVmaW5lIExNQ19NVFUgMTUwMAorI2RlZmluZSBTTEFSUF9MSU5FQ0hFQ0sgMgorCisjZGVmaW5lIExNQ19DUkNfTEVOXzE2IDIgIC8qIDE2LWJpdCBDUkMgKi8KKyNkZWZpbmUgTE1DX0NSQ19MRU5fMzIgNAorCisjaWZkZWYgTE1DX0hETEMKKy8qIGRlZmluaXRpb24gb2YgYW4gaGRsYyBoZWFkZXIuICovCitzdHJ1Y3QgaGRsY19oZHIKK3sKKwl1OCAgYWRkcmVzczsKKwl1OCAgY29udHJvbDsKKwl1MTYgdHlwZTsKK307CisKKy8qIGRlZmluaXRpb24gb2YgYSBzbGFycCBoZWFkZXIuICovCitzdHJ1Y3Qgc2xhcnAKK3sKKwlsb25nIGNvZGU7CisJdW5pb24gc2wKKwl7CisJCXN0cnVjdAorCQl7CisJCQl1bG9uZyBhZGRyZXNzOworCQkJdWxvbmcgbWFzazsKKwkJCXVzaG9ydCB1bnVzZWQ7CisJCX0gYWRkOworCQlzdHJ1Y3QKKwkJeworCQkJdWxvbmcgbXlzZXF1ZW5jZTsKKwkJCXVsb25nIHlvdXJzZXF1ZW5jZTsKKwkJCXVzaG9ydCByZWxpYWJpbGl0eTsKKwkJCXVsb25nIHRpbWU7CisJCX0gY2hrOworCX0gdDsKK307CisjZW5kaWYgLyogTE1DX0hETEMgKi8KKworCisjZW5kaWYgLyogX0xNQ19WQVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9uMi5jIGIvZHJpdmVycy9uZXQvd2FuL24yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzMjc1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9uMi5jCkBAIC0wLDAgKzEsNTYyIEBACisvKgorICogU0RMIEluYy4gUklTQ29tL04yIHN5bmNocm9ub3VzIHNlcmlhbCBjYXJkIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogRm9yIGluZm9ybWF0aW9uIHNlZSBodHRwOi8vaHEucG0ud2F3LnBsL2hkbGMvCisgKgorICogTm90ZTogaW50ZWdyYXRlZCBDU1UvRFNVL0REUyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcgorICoKKyAqIFNvdXJjZXMgb2YgaW5mb3JtYXRpb246CisgKiAgICBIaXRhY2hpIEhENjQ1NzAgU0NBIFVzZXIncyBNYW51YWwKKyAqICAgIFNETCBJbmMuIFBQUC9IRExDL0NJU0NPIGRyaXZlcgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAiaGQ2NDU3MC5oIgorCisKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZXJzaW9uID0gIlNETCBSSVNDb20vTjIgZHJpdmVyIHZlcnNpb246IDEuMTUiOworc3RhdGljIGNvbnN0IGNoYXIqIGRldm5hbWUgPSAiUklTQ29tL04yIjsKKworI3VuZGVmIERFQlVHX1BLVAorI2RlZmluZSBERUJVR19SSU5HUworCisjZGVmaW5lIFVTRV9XSU5ET1dTSVpFIDE2Mzg0CisjZGVmaW5lIFVTRV9CVVMxNkJJVFMgMQorI2RlZmluZSBDTE9DS19CQVNFIDk4MzA0MDAJLyogOS44MzA0IE1IeiAqLworI2RlZmluZSBNQVhfUEFHRVMgICAgICAxNgkvKiAxNiBSQU0gcGFnZXMgYXQgbWF4ICovCisjZGVmaW5lIE1BWF9SQU1fU0laRSAweDgwMDAwCS8qIDUxMiBLQiAqLworI2lmIE1BWF9SQU1fU0laRSA+IE1BWF9QQUdFUyAqIFVTRV9XSU5ET1dTSVpFCisjdW5kZWYgTUFYX1JBTV9TSVpFCisjZGVmaW5lIE1BWF9SQU1fU0laRSAoTUFYX1BBR0VTICogVVNFX1dJTkRPV1NJWkUpCisjZW5kaWYKKyNkZWZpbmUgTjJfSU9QT1JUUyAweDEwCisjZGVmaW5lIE5FRURfREVURUNUX1JBTQorI2RlZmluZSBORUVEX1NDQV9NU0NJX0lOVFIKKyNkZWZpbmUgTUFYX1RYX0JVRkZFUlMgMTAKKworc3RhdGljIGNoYXIgKmh3ID0gTlVMTDsJLyogcG9pbnRlciB0byBodz14eHggY29tbWFuZCBsaW5lIHN0cmluZyAqLworCisvKiBSSVNDb20vTjIgQm9hcmQgUmVnaXN0ZXJzICovCisKKy8qIFBDIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTjJfUENSIDAKKyNkZWZpbmUgUENSX1JVTlNDQSAxICAgICAvKiBSdW4gNjQ1NzAgKi8KKyNkZWZpbmUgUENSX1ZQTSAgICAyICAgICAvKiBFbmFibGUgVlBNIC0gbmVlZGVkIGlmIHVzaW5nIFJBTSBhYm92ZSAxIE1CICovCisjZGVmaW5lIFBDUl9FTldJTiAgNCAgICAgLyogT3BlbiB3aW5kb3cgKi8KKyNkZWZpbmUgUENSX0JVUzE2ICA4ICAgICAvKiAxNi1iaXQgYnVzICovCisKKworLyogTWVtb3J5IEJhc2UgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBOMl9CQVIgMgorCisKKy8qIFBhZ2UgU2NhbiBSZWdpc3RlciAgKi8KKyNkZWZpbmUgTjJfUFNSIDQKKyNkZWZpbmUgV0lOMTZLICAgICAgIDB4MDAKKyNkZWZpbmUgV0lOMzJLICAgICAgIDB4MjAKKyNkZWZpbmUgV0lONjRLICAgICAgIDB4NDAKKyNkZWZpbmUgUFNSX1dJTkJJVFMgIDB4NjAKKyNkZWZpbmUgUFNSX0RNQUVOICAgIDB4ODAKKyNkZWZpbmUgUFNSX1BBR0VCSVRTIDB4MEYKKworCisvKiBNb2RlbSBDb250cm9sIFJlZyAqLworI2RlZmluZSBOMl9NQ1IgNgorI2RlZmluZSBDTE9DS19PVVRfUE9SVDEgMHg4MAorI2RlZmluZSBDTE9DS19PVVRfUE9SVDAgMHg0MAorI2RlZmluZSBUWDQyMl9QT1JUMSAgICAgMHgyMAorI2RlZmluZSBUWDQyMl9QT1JUMCAgICAgMHgxMAorI2RlZmluZSBEU1JfUE9SVDEgICAgICAgMHgwOAorI2RlZmluZSBEU1JfUE9SVDAgICAgICAgMHgwNAorI2RlZmluZSBEVFJfUE9SVDEgICAgICAgMHgwMgorI2RlZmluZSBEVFJfUE9SVDAgICAgICAgMHgwMQorCisKK3R5cGVkZWYgc3RydWN0IHBvcnRfcyB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY2FyZF9zICpjYXJkOworCXNwaW5sb2NrX3QgbG9jazsJLyogVFggbG9jayAqLworCXN5bmNfc2VyaWFsX3NldHRpbmdzIHNldHRpbmdzOworCWludCB2YWxpZDsJCS8qIHBvcnQgZW5hYmxlZCAqLworCWludCByeHBhcnQ7CQkvKiBwYXJ0aWFsIGZyYW1lIHJlY2VpdmVkLCBuZXh0IGZyYW1lIGludmFsaWQqLworCXVuc2lnbmVkIHNob3J0IGVuY29kaW5nOworCXVuc2lnbmVkIHNob3J0IHBhcml0eTsKKwl1MTYgcnhpbjsJCS8qIHJ4IHJpbmcgYnVmZmVyICdpbicgcG9pbnRlciAqLworCXUxNiB0eGluOwkJLyogdHggcmluZyBidWZmZXIgJ2luJyBhbmQgJ2xhc3QnIHBvaW50ZXJzICovCisJdTE2IHR4bGFzdDsKKwl1OCByeHMsIHR4cywgdG1jOwkvKiBTQ0EgcmVnaXN0ZXJzICovCisJdTggcGh5X25vZGU7CQkvKiBwaHlzaWNhbCBwb3J0ICMgLSAwIG9yIDEgKi8KKwl1OCBsb2dfbm9kZTsJCS8qIGxvZ2ljYWwgcG9ydCAjICovCit9cG9ydF90OworCisKKwordHlwZWRlZiBzdHJ1Y3QgY2FyZF9zIHsKKwl1OCBfX2lvbWVtICp3aW5iYXNlOwkJLyogSVNBIHdpbmRvdyBiYXNlIGFkZHJlc3MgKi8KKwl1MzIgcGh5X3dpbmJhc2U7CS8qIElTQSBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgKi8KKwl1MzIgcmFtX3NpemU7CQkvKiBudW1iZXIgb2YgYnl0ZXMgKi8KKwl1MTYgaW87CQkJLyogSU8gQmFzZSBhZGRyZXNzICovCisJdTE2IGJ1ZmZfb2Zmc2V0OwkvKiBvZmZzZXQgb2YgZmlyc3QgYnVmZmVyIG9mIGZpcnN0IGNoYW5uZWwgKi8KKwl1MTYgcnhfcmluZ19idWZmZXJzOwkvKiBudW1iZXIgb2YgYnVmZmVycyBpbiBhIHJpbmcgKi8KKwl1MTYgdHhfcmluZ19idWZmZXJzOworCXU4IGlycTsJCQkvKiBJUlEgKDMtMTUpICovCisKKwlwb3J0X3QgcG9ydHNbMl07CisJc3RydWN0IGNhcmRfcyAqbmV4dF9jYXJkOworfWNhcmRfdDsKKworCitzdGF0aWMgY2FyZF90ICpmaXJzdF9jYXJkOworc3RhdGljIGNhcmRfdCAqKm5ld19jYXJkID0gJmZpcnN0X2NhcmQ7CisKKworI2RlZmluZSBzY2FfcmVnKHJlZywgY2FyZCkgKDB4ODAwMCB8IChjYXJkKS0+aW8gfCBcCisJCQkgICAgKChyZWcpICYgMHgwRikgfCAoKChyZWcpICYgMHhGMCkgPDwgNikpCisjZGVmaW5lIHNjYV9pbihyZWcsIGNhcmQpCQlpbmIoc2NhX3JlZyhyZWcsIGNhcmQpKQorI2RlZmluZSBzY2Ffb3V0KHZhbHVlLCByZWcsIGNhcmQpCW91dGIodmFsdWUsIHNjYV9yZWcocmVnLCBjYXJkKSkKKyNkZWZpbmUgc2NhX2ludyhyZWcsIGNhcmQpCQlpbncoc2NhX3JlZyhyZWcsIGNhcmQpKQorI2RlZmluZSBzY2Ffb3V0dyh2YWx1ZSwgcmVnLCBjYXJkKQlvdXR3KHZhbHVlLCBzY2FfcmVnKHJlZywgY2FyZCkpCisKKyNkZWZpbmUgcG9ydF90b19jYXJkKHBvcnQpCQkoKHBvcnQpLT5jYXJkKQorI2RlZmluZSBsb2dfbm9kZShwb3J0KQkJCSgocG9ydCktPmxvZ19ub2RlKQorI2RlZmluZSBwaHlfbm9kZShwb3J0KQkJCSgocG9ydCktPnBoeV9ub2RlKQorI2RlZmluZSB3aW5zaXplKGNhcmQpCQkJKFVTRV9XSU5ET1dTSVpFKQorI2RlZmluZSB3aW5iYXNlKGNhcmQpICAgICAgCSAgICAgCSgoY2FyZCktPndpbmJhc2UpCisjZGVmaW5lIGdldF9wb3J0KGNhcmQsIHBvcnQpCQkoKGNhcmQpLT5wb3J0c1twb3J0XS52YWxpZCA/IFwKKwkJCQkJICYoY2FyZCktPnBvcnRzW3BvcnRdIDogTlVMTCkKKworCisKK3N0YXRpYyBfX2lubGluZV9fIHU4IHNjYV9nZXRfcGFnZShjYXJkX3QgKmNhcmQpCit7CisJcmV0dXJuIGluYihjYXJkLT5pbyArIE4yX1BTUikgJiBQU1JfUEFHRUJJVFM7Cit9CisKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBvcGVud2luKGNhcmRfdCAqY2FyZCwgdTggcGFnZSkKK3sKKwl1OCBwc3IgPSBpbmIoY2FyZC0+aW8gKyBOMl9QU1IpOworCW91dGIoKHBzciAmIH5QU1JfUEFHRUJJVFMpIHwgcGFnZSwgY2FyZC0+aW8gKyBOMl9QU1IpOworfQorCisKKworI2luY2x1ZGUgImhkNjQ1N3guYyIKKworCisKK3N0YXRpYyB2b2lkIG4yX3NldF9pZmFjZShwb3J0X3QgKnBvcnQpCit7CisJY2FyZF90ICpjYXJkID0gcG9ydC0+Y2FyZDsKKwlpbnQgaW8gPSBjYXJkLT5pbzsKKwl1OCBtY3IgPSBpbmIoaW8gKyBOMl9NQ1IpOworCXU4IG1zY2kgPSBnZXRfbXNjaShwb3J0KTsKKwl1OCByeHMgPSBwb3J0LT5yeHMgJiBDTEtfQlJHX01BU0s7CisJdTggdHhzID0gcG9ydC0+dHhzICYgQ0xLX0JSR19NQVNLOworCisJc3dpdGNoKHBvcnQtPnNldHRpbmdzLmNsb2NrX3R5cGUpIHsKKwljYXNlIENMT0NLX0lOVDoKKwkJbWNyIHw9IHBvcnQtPnBoeV9ub2RlID8gQ0xPQ0tfT1VUX1BPUlQxIDogQ0xPQ0tfT1VUX1BPUlQwOworCQlyeHMgfD0gQ0xLX0JSR19SWDsgLyogQlJHIG91dHB1dCAqLworCQl0eHMgfD0gQ0xLX1JYQ0xLX1RYOyAvKiBSWCBjbG9jayAqLworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfVFhJTlQ6CisJCW1jciB8PSBwb3J0LT5waHlfbm9kZSA/IENMT0NLX09VVF9QT1JUMSA6IENMT0NLX09VVF9QT1JUMDsKKwkJcnhzIHw9IENMS19MSU5FX1JYOyAvKiBSWEMgaW5wdXQgKi8KKwkJdHhzIHw9IENMS19CUkdfVFg7IC8qIEJSRyBvdXRwdXQgKi8KKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX1RYRlJPTVJYOgorCQltY3IgfD0gcG9ydC0+cGh5X25vZGUgPyBDTE9DS19PVVRfUE9SVDEgOiBDTE9DS19PVVRfUE9SVDA7CisJCXJ4cyB8PSBDTEtfTElORV9SWDsgLyogUlhDIGlucHV0ICovCisJCXR4cyB8PSBDTEtfUlhDTEtfVFg7IC8qIFJYIGNsb2NrICovCisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8qIENsb2NrIEVYVGVybmFsICovCisJCW1jciAmPSBwb3J0LT5waHlfbm9kZSA/IH5DTE9DS19PVVRfUE9SVDEgOiB+Q0xPQ0tfT1VUX1BPUlQwOworCQlyeHMgfD0gQ0xLX0xJTkVfUlg7IC8qIFJYQyBpbnB1dCAqLworCQl0eHMgfD0gQ0xLX0xJTkVfVFg7IC8qIFRYQyBpbnB1dCAqLworCX0KKworCW91dGIobWNyLCBpbyArIE4yX01DUik7CisJcG9ydC0+cnhzID0gcnhzOworCXBvcnQtPnR4cyA9IHR4czsKKwlzY2Ffb3V0KHJ4cywgbXNjaSArIFJYUywgY2FyZCk7CisJc2NhX291dCh0eHMsIG1zY2kgKyBUWFMsIGNhcmQpOworCXNjYV9zZXRfcG9ydChwb3J0KTsKK30KKworCisKK3N0YXRpYyBpbnQgbjJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJaW50IGlvID0gcG9ydC0+Y2FyZC0+aW87CisJdTggbWNyID0gaW5iKGlvICsgTjJfTUNSKSB8IChwb3J0LT5waHlfbm9kZSA/IFRYNDIyX1BPUlQxOlRYNDIyX1BPUlQwKTsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gaGRsY19vcGVuKGRldik7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCW1jciAmPSBwb3J0LT5waHlfbm9kZSA/IH5EVFJfUE9SVDEgOiB+RFRSX1BPUlQwOyAvKiBzZXQgRFRSIE9OICovCisJb3V0YihtY3IsIGlvICsgTjJfTUNSKTsKKworCW91dGIoaW5iKGlvICsgTjJfUENSKSB8IFBDUl9FTldJTiwgaW8gKyBOMl9QQ1IpOyAvKiBvcGVuIHdpbmRvdyAqLworCW91dGIoaW5iKGlvICsgTjJfUFNSKSB8IFBTUl9ETUFFTiwgaW8gKyBOMl9QU1IpOyAvKiBlbmFibGUgZG1hICovCisJc2NhX29wZW4oZGV2KTsKKwluMl9zZXRfaWZhY2UocG9ydCk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IG4yX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlpbnQgaW8gPSBwb3J0LT5jYXJkLT5pbzsKKwl1OCBtY3IgPSBpbmIoaW8rTjJfTUNSKSB8IChwb3J0LT5waHlfbm9kZSA/IFRYNDIyX1BPUlQxIDogVFg0MjJfUE9SVDApOworCisJc2NhX2Nsb3NlKGRldik7CisJbWNyIHw9IHBvcnQtPnBoeV9ub2RlID8gRFRSX1BPUlQxIDogRFRSX1BPUlQwOyAvKiBzZXQgRFRSIE9GRiAqLworCW91dGIobWNyLCBpbyArIE4yX01DUik7CisJaGRsY19jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBuMl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihzeW5jX3NlcmlhbF9zZXR0aW5ncyk7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgbmV3X2xpbmU7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgX191c2VyICpsaW5lID0gaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYzsKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCisjaWZkZWYgREVCVUdfUklOR1MKKwlpZiAoY21kID09IFNJT0NERVZQUklWQVRFKSB7CisJCXNjYV9kdW1wX3JpbmdzKGRldik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCWlmIChjbWQgIT0gU0lPQ1dBTkRFVikKKwkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisKKwlzd2l0Y2goaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX0lGQUNFOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfU1lOQ19TRVJJQUw7CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGxpbmUsICZwb3J0LT5zZXR0aW5ncywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX0lGQUNFX1NZTkNfU0VSSUFMOgorCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfbGluZSwgbGluZSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAobmV3X2xpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19FWFQgJiYKKwkJICAgIG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfVFhGUk9NUlggJiYKKwkJICAgIG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfSU5UICYmCisJCSAgICBuZXdfbGluZS5jbG9ja190eXBlICE9IENMT0NLX1RYSU5UKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogTm8gc3VjaCBjbG9jayBzZXR0aW5nICovCisKKwkJaWYgKG5ld19saW5lLmxvb3BiYWNrICE9IDAgJiYgbmV3X2xpbmUubG9vcGJhY2sgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCW1lbWNweSgmcG9ydC0+c2V0dGluZ3MsICZuZXdfbGluZSwgc2l6ZSk7IC8qIFVwZGF0ZSBzZXR0aW5ncyAqLworCQluMl9zZXRfaWZhY2UocG9ydCk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJfQorfQorCisKKworc3RhdGljIHZvaWQgbjJfZGVzdHJveV9jYXJkKGNhcmRfdCAqY2FyZCkKK3sKKwlpbnQgY250OworCisJZm9yIChjbnQgPSAwOyBjbnQgPCAyOyBjbnQrKykKKwkJaWYgKGNhcmQtPnBvcnRzW2NudF0uY2FyZCkgeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KCZjYXJkLT5wb3J0c1tjbnRdKTsKKwkJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KTsKKwkJfQorCisJaWYgKGNhcmQtPmlycSkKKwkJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKworCWlmIChjYXJkLT53aW5iYXNlKSB7CisJCWlvdW5tYXAoY2FyZC0+d2luYmFzZSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5waHlfd2luYmFzZSwgVVNFX1dJTkRPV1NJWkUpOworCX0KKworCWlmIChjYXJkLT5pbykKKwkJcmVsZWFzZV9yZWdpb24oY2FyZC0+aW8sIE4yX0lPUE9SVFMpOworCWlmIChjYXJkLT5wb3J0c1swXS5kZXYpCisJCWZyZWVfbmV0ZGV2KGNhcmQtPnBvcnRzWzBdLmRldik7CisJaWYgKGNhcmQtPnBvcnRzWzFdLmRldikKKwkJZnJlZV9uZXRkZXYoY2FyZC0+cG9ydHNbMV0uZGV2KTsKKwlrZnJlZShjYXJkKTsKK30KKworCisKK3N0YXRpYyBpbnQgX19pbml0IG4yX3J1bih1bnNpZ25lZCBsb25nIGlvLCB1bnNpZ25lZCBsb25nIGlycSwKKwkJCSB1bnNpZ25lZCBsb25nIHdpbmJhc2UsIGxvbmcgdmFsaWQwLCBsb25nIHZhbGlkMSkKK3sKKwljYXJkX3QgKmNhcmQ7CisJdTggY250LCBwY3I7CisJaW50IGk7CisKKwlpZiAoaW8gPCAweDIwMCB8fCBpbyA+IDB4M0ZGIHx8IChpbyAlIE4yX0lPUE9SVFMpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJuMjogaW52YWxpZCBJL08gcG9ydCB2YWx1ZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChpcnEgPCAzIHx8IGlycSA+IDE1IHx8IGlycSA9PSA2KSAvKiBGSVhNRSAqLyB7CisJCXByaW50ayhLRVJOX0VSUiAibjI6IGludmFsaWQgSVJRIHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHdpbmJhc2UgPCAweEEwMDAwIHx8IHdpbmJhc2UgPiAweEZGRkZGIHx8ICh3aW5iYXNlICYgMHhGRkYpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJuMjogaW52YWxpZCBSQU0gdmFsdWVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljYXJkID0ga21hbGxvYyhzaXplb2YoY2FyZF90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcmQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm4yOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mKGNhcmRfdCkpOworCisJY2FyZC0+cG9ydHNbMF0uZGV2ID0gYWxsb2NfaGRsY2RldigmY2FyZC0+cG9ydHNbMF0pOworCWNhcmQtPnBvcnRzWzFdLmRldiA9IGFsbG9jX2hkbGNkZXYoJmNhcmQtPnBvcnRzWzFdKTsKKwlpZiAoIWNhcmQtPnBvcnRzWzBdLmRldiB8fCAhY2FyZC0+cG9ydHNbMV0uZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAibjI6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIE4yX0lPUE9SVFMsIGRldm5hbWUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibjI6IEkvTyBwb3J0IHJlZ2lvbiBpbiB1c2VcbiIpOworCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWNhcmQtPmlvID0gaW87CisKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCAmc2NhX2ludHIsIDAsIGRldm5hbWUsIGNhcmQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibjI6IGNvdWxkIG5vdCBhbGxvY2F0ZSBJUlFcbiIpOworCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybigtRUJVU1kpOworCX0KKwljYXJkLT5pcnEgPSBpcnE7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbih3aW5iYXNlLCBVU0VfV0lORE9XU0laRSwgZGV2bmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJuMjogY291bGQgbm90IHJlcXVlc3QgUkFNIHdpbmRvd1xuIik7CisJCW4yX2Rlc3Ryb3lfY2FyZChjYXJkKTsKKwkJcmV0dXJuKC1FQlVTWSk7CisJfQorCWNhcmQtPnBoeV93aW5iYXNlID0gd2luYmFzZTsKKwljYXJkLT53aW5iYXNlID0gaW9yZW1hcCh3aW5iYXNlLCBVU0VfV0lORE9XU0laRSk7CisKKwlvdXRiKDAsIGlvICsgTjJfUENSKTsKKwlvdXRiKHdpbmJhc2UgPj4gMTIsIGlvICsgTjJfQkFSKTsKKworCXN3aXRjaCAoVVNFX1dJTkRPV1NJWkUpIHsKKwljYXNlIDE2Mzg0OgorCQlvdXRiKFdJTjE2SywgaW8gKyBOMl9QU1IpOworCQlicmVhazsKKworCWNhc2UgMzI3Njg6CisJCW91dGIoV0lOMzJLLCBpbyArIE4yX1BTUik7CisJCWJyZWFrOworCisJY2FzZSA2NTUzNjoKKwkJb3V0YihXSU42NEssIGlvICsgTjJfUFNSKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIm4yOiBpbnZhbGlkIHdpbmRvdyBzaXplXG4iKTsKKwkJbjJfZGVzdHJveV9jYXJkKGNhcmQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwY3IgPSBQQ1JfRU5XSU4gfCBQQ1JfVlBNIHwgKFVTRV9CVVMxNkJJVFMgPyBQQ1JfQlVTMTYgOiAwKTsKKwlvdXRiKHBjciwgaW8gKyBOMl9QQ1IpOworCisJY2FyZC0+cmFtX3NpemUgPSBzY2FfZGV0ZWN0X3JhbShjYXJkLCBjYXJkLT53aW5iYXNlLCBNQVhfUkFNX1NJWkUpOworCisJLyogbnVtYmVyIG9mIFRYICsgUlggYnVmZmVycyBmb3Igb25lIHBvcnQgKi8KKwlpID0gY2FyZC0+cmFtX3NpemUgLyAoKHZhbGlkMCArIHZhbGlkMSkgKiAoc2l6ZW9mKHBrdF9kZXNjKSArCisJCQkJCQkgICBIRExDX01BWF9NUlUpKTsKKworCWNhcmQtPnR4X3JpbmdfYnVmZmVycyA9IG1pbihpIC8gMiwgTUFYX1RYX0JVRkZFUlMpOworCWNhcmQtPnJ4X3JpbmdfYnVmZmVycyA9IGkgLSBjYXJkLT50eF9yaW5nX2J1ZmZlcnM7CisKKwljYXJkLT5idWZmX29mZnNldCA9ICh2YWxpZDAgKyB2YWxpZDEpICogc2l6ZW9mKHBrdF9kZXNjKSAqCisJCShjYXJkLT50eF9yaW5nX2J1ZmZlcnMgKyBjYXJkLT5yeF9yaW5nX2J1ZmZlcnMpOworCisJcHJpbnRrKEtFUk5fSU5GTyAibjI6IFJJU0NvbS9OMiAldSBLQiBSQU0sIElSUSV1LCAiCisJICAgICAgICJ1c2luZyAldSBUWCArICV1IFJYIHBhY2tldHMgcmluZ3NcbiIsIGNhcmQtPnJhbV9zaXplIC8gMTAyNCwKKwkgICAgICAgY2FyZC0+aXJxLCBjYXJkLT50eF9yaW5nX2J1ZmZlcnMsIGNhcmQtPnJ4X3JpbmdfYnVmZmVycyk7CisKKwlpZiAoY2FyZC0+dHhfcmluZ19idWZmZXJzIDwgMSkgeworCQlwcmludGsoS0VSTl9FUlIgIm4yOiBSQU0gdGVzdCBmYWlsZWRcbiIpOworCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXBjciB8PSBQQ1JfUlVOU0NBOwkJLyogcnVuIFNDQSAqLworCW91dGIocGNyLCBpbyArIE4yX1BDUik7CisJb3V0YigwLCBpbyArIE4yX01DUik7CisKKwlzY2FfaW5pdChjYXJkLCAwKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IDI7IGNudCsrKSB7CisJCXBvcnRfdCAqcG9ydCA9ICZjYXJkLT5wb3J0c1tjbnRdOworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydF90b19kZXYocG9ydCk7CisJCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKworCQlpZiAoKGNudCA9PSAwICYmICF2YWxpZDApIHx8IChjbnQgPT0gMSAmJiAhdmFsaWQxKSkKKwkJCWNvbnRpbnVlOworCisJCXBvcnQtPnBoeV9ub2RlID0gY250OworCQlwb3J0LT52YWxpZCA9IDE7CisKKwkJaWYgKChjbnQgPT0gMSkgJiYgdmFsaWQwKQorCQkJcG9ydC0+bG9nX25vZGUgPSAxOworCisJCXNwaW5fbG9ja19pbml0KCZwb3J0LT5sb2NrKTsKKwkJU0VUX01PRFVMRV9PV05FUihkZXYpOworCQlkZXYtPmlycSA9IGlycTsKKwkJZGV2LT5tZW1fc3RhcnQgPSB3aW5iYXNlOworCQlkZXYtPm1lbV9lbmQgPSB3aW5iYXNlICsgVVNFX1dJTkRPV1NJWkUgLSAxOworCQlkZXYtPnR4X3F1ZXVlX2xlbiA9IDUwOworCQlkZXYtPmRvX2lvY3RsID0gbjJfaW9jdGw7CisJCWRldi0+b3BlbiA9IG4yX29wZW47CisJCWRldi0+c3RvcCA9IG4yX2Nsb3NlOworCQloZGxjLT5hdHRhY2ggPSBzY2FfYXR0YWNoOworCQloZGxjLT54bWl0ID0gc2NhX3htaXQ7CisJCXBvcnQtPnNldHRpbmdzLmNsb2NrX3R5cGUgPSBDTE9DS19FWFQ7CisJCXBvcnQtPmNhcmQgPSBjYXJkOworCisJCWlmIChyZWdpc3Rlcl9oZGxjX2RldmljZShkZXYpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJuMjogdW5hYmxlIHRvIHJlZ2lzdGVyIGhkbGMgIgorCQkJICAgICAgICJkZXZpY2VcbiIpOworCQkJcG9ydC0+Y2FyZCA9IE5VTEw7CisJCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKwkJc2NhX2luaXRfc3luY19wb3J0KHBvcnQpOyAvKiBTZXQgdXAgU0NBIG1lbW9yeSAqLworCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSSVNDb20vTjIgbm9kZSAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcG9ydC0+cGh5X25vZGUpOworCX0KKworCSpuZXdfY2FyZCA9IGNhcmQ7CisJbmV3X2NhcmQgPSAmY2FyZC0+bmV4dF9jYXJkOworCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IF9faW5pdCBuMl9pbml0KHZvaWQpCit7CisJaWYgKGh3PT1OVUxMKSB7CisjaWZkZWYgTU9EVUxFCisJCXByaW50ayhLRVJOX0lORk8gIm4yOiBubyBjYXJkIGluaXRpYWxpemVkXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVOT1NZUzsJLyogbm8gcGFyYW1ldGVycyBzcGVjaWZpZWQsIGFib3J0ICovCisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHZlcnNpb24pOworCisJZG8geworCQl1bnNpZ25lZCBsb25nIGlvLCBpcnEsIHJhbTsKKwkJbG9uZyB2YWxpZFsyXSA9IHsgMCwgMCB9OyAvKiBEZWZhdWx0ID0gYm90aCBwb3J0cyBkaXNhYmxlZCAqLworCisJCWlvID0gc2ltcGxlX3N0cnRvdWwoaHcsICZodywgMCk7CisKKwkJaWYgKCpodysrICE9ICcsJykKKwkJCWJyZWFrOworCQlpcnEgPSBzaW1wbGVfc3RydG91bChodywgJmh3LCAwKTsKKworCQlpZiAoKmh3KysgIT0gJywnKQorCQkJYnJlYWs7CisJCXJhbSA9IHNpbXBsZV9zdHJ0b3VsKGh3LCAmaHcsIDApOworCisJCWlmICgqaHcrKyAhPSAnLCcpCisJCQlicmVhazsKKwkJd2hpbGUoMSkgeworCQkJaWYgKCpodyA9PSAnMCcgJiYgIXZhbGlkWzBdKQorCQkJCXZhbGlkWzBdID0gMTsgLyogUG9ydCAwIGVuYWJsZWQgKi8KKwkJCWVsc2UgaWYgKCpodyA9PSAnMScgJiYgIXZhbGlkWzFdKQorCQkJCXZhbGlkWzFdID0gMTsgLyogUG9ydCAxIGVuYWJsZWQgKi8KKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJCWh3Kys7CisJCX0KKworCQlpZiAoIXZhbGlkWzBdICYmICF2YWxpZFsxXSkKKwkJCWJyZWFrOwkvKiBhdCBsZWFzdCBvbmUgcG9ydCBtdXN0IGJlIHVzZWQgKi8KKworCQlpZiAoKmh3ID09ICc6JyB8fCAqaHcgPT0gJ1x4MCcpCisJCQluMl9ydW4oaW8sIGlycSwgcmFtLCB2YWxpZFswXSwgdmFsaWRbMV0pOworCisJCWlmICgqaHcgPT0gJ1x4MCcpCisJCQlyZXR1cm4gZmlyc3RfY2FyZCA/IDAgOiAtRU5PU1lTOworCX13aGlsZSgqaHcrKyA9PSAnOicpOworCisJcHJpbnRrKEtFUk5fRVJSICJuMjogaW52YWxpZCBoYXJkd2FyZSBwYXJhbWV0ZXJzXG4iKTsKKwlyZXR1cm4gZmlyc3RfY2FyZCA/IDAgOiAtRU5PU1lTOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuMl9jbGVhbnVwKHZvaWQpCit7CisJY2FyZF90ICpjYXJkID0gZmlyc3RfY2FyZDsKKworCXdoaWxlIChjYXJkKSB7CisJCWNhcmRfdCAqcHRyID0gY2FyZDsKKwkJY2FyZCA9IGNhcmQtPm5leHRfY2FyZDsKKwkJbjJfZGVzdHJveV9jYXJkKHB0cik7CisJfQorfQorCisKK21vZHVsZV9pbml0KG4yX2luaXQpOworbW9kdWxlX2V4aXQobjJfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIktyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJJU0NvbS9OMiBzZXJpYWwgcG9ydCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK21vZHVsZV9wYXJhbShodywgY2hhcnAsIDA0NDQpOwkvKiBodz1pbyxpcnEscmFtLHBvcnRzOmlvLGlycSwuLi4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMC1mYWxjLWxoLmggYi9kcml2ZXJzL25ldC93YW4vcGMzMDAtZmFsYy1saC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZWQyM2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vcGMzMDAtZmFsYy1saC5oCkBAIC0wLDAgKzEsMTIzOCBAQAorLyoKKyAqIGZhbGMuaAlEZXNjcmlwdGlvbiBvZiB0aGUgU2llbWVucyBGQUxDIFQxL0UxIGZyYW1lci4KKyAqCisgKiBBdXRob3I6CUl2YW4gUGFzc29zIDxpdmFuQGN5Y2xhZGVzLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQ6CShjKSAyMDAwLTIwMDEgQ3ljbGFkZXMgQ29ycC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICRMb2c6IGZhbGMtbGguaCx2ICQKKyAqIFJldmlzaW9uIDMuMSAgMjAwMS8wNi8xNSAxMjo0MToxMCAgcmVnaW5hCisgKiB1cHBpbmcgbWFqb3IgdmVyc2lvbiBudW1iZXIKKyAqCisgKiBSZXZpc2lvbiAxLjEuMS4xICAyMDAxLzA2LzEzIDIwOjI0OjQ3ICBkYW5pZWxhCisgKiBQQzMwMCBpbml0aWFsIENWUyB2ZXJzaW9uICgzLjQuMC1wcmUxKQorICoKKyAqIFJldmlzaW9uIDEuMSAyMDAwLzA1LzE1IGl2YW4KKyAqIEluY2x1ZGVkIERKQSBiaXRzIGZvciB0aGUgTElNMiByZWdpc3Rlci4KKyAqCisgKiBSZXZpc2lvbiAxLjAgMjAwMC8wMi8yMiBpdmFuCisgKiBJbml0aWFsIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX0ZBTENfTEhfSAorI2RlZmluZSBfRkFMQ19MSF9ICisKKyNkZWZpbmUgTlVNX09GX1QxX0NIQU5ORUxTCTI0CisjZGVmaW5lIE5VTV9PRl9FMV9DSEFOTkVMUwkzMgorCisvKj4+Pj4+Pj4+Pj4+Pj4+Pj4+ICBGQUxDIFJlZ2lzdGVyIEJpdHMgKFRyYW5zbWl0IE1vZGUpICA8PDw8PDw8PDw8PDw8PDw8PDw8ICovCisKKy8qIENNRFIgKENvbW1hbmQgUmVnaXN0ZXIpCisgICAtLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIENNRFJfUk1DCTB4ODAKKyNkZWZpbmUgQ01EUl9SUkVTCTB4NDAKKyNkZWZpbmUgQ01EUl9YUkVQCTB4MjAKKyNkZWZpbmUgQ01EUl9YUkVTCTB4MTAKKyNkZWZpbmUgQ01EUl9YSEYJMHgwOAorI2RlZmluZSBDTURSX1hURgkweDA0CisjZGVmaW5lIENNRFJfWE1FCTB4MDIKKyNkZWZpbmUgQ01EUl9TUkVTCTB4MDEKKworLyogTU9ERSAoTW9kZSBSZWdpc3RlcikKKyAgIC0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgTU9ERV9NRFMyCTB4ODAKKyNkZWZpbmUgTU9ERV9NRFMxCTB4NDAKKyNkZWZpbmUgTU9ERV9NRFMwCTB4MjAKKyNkZWZpbmUgTU9ERV9CUkFDCTB4MTAKKyNkZWZpbmUgTU9ERV9IUkFDCTB4MDgKKworLyogSVBDIChJbnRlcnJ1cHQgUG9ydCBDb25maWd1cmF0aW9uKQorICAgLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBJUENfVklTCQkweDgwCisjZGVmaW5lIElQQ19TQ0kJCTB4MDQKKyNkZWZpbmUgSVBDX0lDMQkJMHgwMgorI2RlZmluZSBJUENfSUMwCQkweDAxCisKKy8qIENDUjEgKENvbW1vbiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEpCisgICAtLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIENDUjFfU0ZMRyAgICAgICAweDgwCisjZGVmaW5lIENDUjFfWFRTMTZSQSAgICAweDQwCisjZGVmaW5lIENDUjFfQlJNICAgICAgICAweDQwCisjZGVmaW5lIENDUjFfQ0FTU1lNICAgICAweDIwCisjZGVmaW5lIENDUjFfRURMWCAgICAgICAweDIwCisjZGVmaW5lIENDUjFfRUlUUyAgICAgICAweDEwCisjZGVmaW5lIENDUjFfSVRGICAgICAgICAweDA4CisjZGVmaW5lIENDUjFfUkZUMSAgICAgICAweDAyCisjZGVmaW5lIENDUjFfUkZUMCAgICAgICAweDAxCisKKy8qIENDUjMgKENvbW1vbiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDMpCisgICAtLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQ0NSM19QUkUxICAgICAgIDB4ODAKKyNkZWZpbmUgQ0NSM19QUkUwICAgICAgIDB4NDAKKyNkZWZpbmUgQ0NSM19FUFQgICAgICAgIDB4MjAKKyNkZWZpbmUgQ0NSM19SQUREICAgICAgIDB4MTAKKyNkZWZpbmUgQ0NSM19SQ1JDICAgICAgIDB4MDQKKyNkZWZpbmUgQ0NSM19YQ1JDICAgICAgIDB4MDIKKworCisvKiBSVFIxLTQgKFJlY2VpdmUgVGltZXNsb3QgUmVnaXN0ZXIgMS00KQorICAgLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJUUjFfVFMwICAgICAgICAweDgwCisjZGVmaW5lIFJUUjFfVFMxICAgICAgICAweDQwCisjZGVmaW5lIFJUUjFfVFMyICAgICAgICAweDIwCisjZGVmaW5lIFJUUjFfVFMzICAgICAgICAweDEwCisjZGVmaW5lIFJUUjFfVFM0ICAgICAgICAweDA4CisjZGVmaW5lIFJUUjFfVFM1ICAgICAgICAweDA0CisjZGVmaW5lIFJUUjFfVFM2ICAgICAgICAweDAyCisjZGVmaW5lIFJUUjFfVFM3ICAgICAgICAweDAxCisKKyNkZWZpbmUgUlRSMl9UUzggICAgICAgIDB4ODAKKyNkZWZpbmUgUlRSMl9UUzkgICAgICAgIDB4NDAKKyNkZWZpbmUgUlRSMl9UUzEwICAgICAgIDB4MjAKKyNkZWZpbmUgUlRSMl9UUzExICAgICAgIDB4MTAKKyNkZWZpbmUgUlRSMl9UUzEyICAgICAgIDB4MDgKKyNkZWZpbmUgUlRSMl9UUzEzICAgICAgIDB4MDQKKyNkZWZpbmUgUlRSMl9UUzE0ICAgICAgIDB4MDIKKyNkZWZpbmUgUlRSMl9UUzE1ICAgICAgIDB4MDEKKworI2RlZmluZSBSVFIzX1RTMTYgICAgICAgMHg4MAorI2RlZmluZSBSVFIzX1RTMTcgICAgICAgMHg0MAorI2RlZmluZSBSVFIzX1RTMTggICAgICAgMHgyMAorI2RlZmluZSBSVFIzX1RTMTkgICAgICAgMHgxMAorI2RlZmluZSBSVFIzX1RTMjAgICAgICAgMHgwOAorI2RlZmluZSBSVFIzX1RTMjEgICAgICAgMHgwNAorI2RlZmluZSBSVFIzX1RTMjIgICAgICAgMHgwMgorI2RlZmluZSBSVFIzX1RTMjMgICAgICAgMHgwMQorCisjZGVmaW5lIFJUUjRfVFMyNCAgICAgICAweDgwCisjZGVmaW5lIFJUUjRfVFMyNSAgICAgICAweDQwCisjZGVmaW5lIFJUUjRfVFMyNiAgICAgICAweDIwCisjZGVmaW5lIFJUUjRfVFMyNyAgICAgICAweDEwCisjZGVmaW5lIFJUUjRfVFMyOCAgICAgICAweDA4CisjZGVmaW5lIFJUUjRfVFMyOSAgICAgICAweDA0CisjZGVmaW5lIFJUUjRfVFMzMCAgICAgICAweDAyCisjZGVmaW5lIFJUUjRfVFMzMSAgICAgICAweDAxCisKKworLyogVFRSMS00IChUcmFuc21pdCBUaW1lc2xvdCBSZWdpc3RlciAxLTQpCisgICAtLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVFRSMV9UUzAgICAgICAgIDB4ODAKKyNkZWZpbmUgVFRSMV9UUzEgICAgICAgIDB4NDAKKyNkZWZpbmUgVFRSMV9UUzIgICAgICAgIDB4MjAKKyNkZWZpbmUgVFRSMV9UUzMgICAgICAgIDB4MTAKKyNkZWZpbmUgVFRSMV9UUzQgICAgICAgIDB4MDgKKyNkZWZpbmUgVFRSMV9UUzUgICAgICAgIDB4MDQKKyNkZWZpbmUgVFRSMV9UUzYgICAgICAgIDB4MDIKKyNkZWZpbmUgVFRSMV9UUzcgICAgICAgIDB4MDEKKworI2RlZmluZSBUVFIyX1RTOCAgICAgICAgMHg4MAorI2RlZmluZSBUVFIyX1RTOSAgICAgICAgMHg0MAorI2RlZmluZSBUVFIyX1RTMTAgICAgICAgMHgyMAorI2RlZmluZSBUVFIyX1RTMTEgICAgICAgMHgxMAorI2RlZmluZSBUVFIyX1RTMTIgICAgICAgMHgwOAorI2RlZmluZSBUVFIyX1RTMTMgICAgICAgMHgwNAorI2RlZmluZSBUVFIyX1RTMTQgICAgICAgMHgwMgorI2RlZmluZSBUVFIyX1RTMTUgICAgICAgMHgwMQorCisjZGVmaW5lIFRUUjNfVFMxNiAgICAgICAweDgwCisjZGVmaW5lIFRUUjNfVFMxNyAgICAgICAweDQwCisjZGVmaW5lIFRUUjNfVFMxOCAgICAgICAweDIwCisjZGVmaW5lIFRUUjNfVFMxOSAgICAgICAweDEwCisjZGVmaW5lIFRUUjNfVFMyMCAgICAgICAweDA4CisjZGVmaW5lIFRUUjNfVFMyMSAgICAgICAweDA0CisjZGVmaW5lIFRUUjNfVFMyMiAgICAgICAweDAyCisjZGVmaW5lIFRUUjNfVFMyMyAgICAgICAweDAxCisKKyNkZWZpbmUgVFRSNF9UUzI0ICAgICAgIDB4ODAKKyNkZWZpbmUgVFRSNF9UUzI1ICAgICAgIDB4NDAKKyNkZWZpbmUgVFRSNF9UUzI2ICAgICAgIDB4MjAKKyNkZWZpbmUgVFRSNF9UUzI3ICAgICAgIDB4MTAKKyNkZWZpbmUgVFRSNF9UUzI4ICAgICAgIDB4MDgKKyNkZWZpbmUgVFRSNF9UUzI5ICAgICAgIDB4MDQKKyNkZWZpbmUgVFRSNF9UUzMwICAgICAgIDB4MDIKKyNkZWZpbmUgVFRSNF9UUzMxICAgICAgIDB4MDEKKworCisKKy8qIElNUjAtNCAoSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgMC00KQorCisgICAtLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgSU1SMF9STUUgICAgICAgIDB4ODAKKyNkZWZpbmUgSU1SMF9SRlMgICAgICAgIDB4NDAKKyNkZWZpbmUgSU1SMF9UOE1TICAgICAgIDB4MjAKKyNkZWZpbmUgSU1SMF9JU0YgICAgICAgIDB4MjAKKyNkZWZpbmUgSU1SMF9STUIgICAgICAgIDB4MTAKKyNkZWZpbmUgSU1SMF9DQVNDICAgICAgIDB4MDgKKyNkZWZpbmUgSU1SMF9SU0MgICAgICAgIDB4MDgKKyNkZWZpbmUgSU1SMF9DUkM2ICAgICAgIDB4MDQKKyNkZWZpbmUgSU1SMF9DUkM0ICAgICAgIDB4MDQKKyNkZWZpbmUgSU1SMF9QREVOCTB4MDIKKyNkZWZpbmUgSU1SMF9SUEYgICAgICAgIDB4MDEKKworI2RlZmluZSBJTVIxX0NBU0UgICAgICAgMHg4MAorI2RlZmluZSBJTVIxX1JETyAgICAgICAgMHg0MAorI2RlZmluZSBJTVIxX0FMTFMgICAgICAgMHgyMAorI2RlZmluZSBJTVIxX1hEVSAgICAgICAgMHgxMAorI2RlZmluZSBJTVIxX1hNQiAgICAgICAgMHgwOAorI2RlZmluZSBJTVIxX1hMU0MgICAgICAgMHgwMgorI2RlZmluZSBJTVIxX1hQUiAgICAgICAgMHgwMQorI2RlZmluZSBJTVIxX0xMQlNDCTB4ODAKKworI2RlZmluZSBJTVIyX0ZBUiAgICAgICAgMHg4MAorI2RlZmluZSBJTVIyX0xGQSAgICAgICAgMHg0MAorI2RlZmluZSBJTVIyX01GQVIgICAgICAgMHgyMAorI2RlZmluZSBJTVIyX1Q0MDBNUyAgICAgMHgxMAorI2RlZmluZSBJTVIyX0xNRkEgICAgICAgMHgxMAorI2RlZmluZSBJTVIyX0FJUyAgICAgICAgMHgwOAorI2RlZmluZSBJTVIyX0xPUyAgICAgICAgMHgwNAorI2RlZmluZSBJTVIyX1JBUiAgICAgICAgMHgwMgorI2RlZmluZSBJTVIyX1JBICAgICAgICAgMHgwMQorCisjZGVmaW5lIElNUjNfRVMgICAgICAgICAweDgwCisjZGVmaW5lIElNUjNfU0VDICAgICAgICAweDQwCisjZGVmaW5lIElNUjNfTE1GQTE2ICAgICAweDIwCisjZGVmaW5lIElNUjNfQUlTMTYgICAgICAweDEwCisjZGVmaW5lIElNUjNfUkExNiAgICAgICAweDA4CisjZGVmaW5lIElNUjNfQVBJICAgICAgICAweDA0CisjZGVmaW5lIElNUjNfWFNMUCAgICAgICAweDIwCisjZGVmaW5lIElNUjNfWFNMTiAgICAgICAweDEwCisjZGVmaW5lIElNUjNfTExCU0MgICAgICAweDA4CisjZGVmaW5lIElNUjNfWFJTICAgICAgICAweDA0CisjZGVmaW5lIElNUjNfU0xOICAgICAgICAweDAyCisjZGVmaW5lIElNUjNfU0xQICAgICAgICAweDAxCisKKyNkZWZpbmUgSU1SNF9MRkEgICAgICAgIDB4ODAKKyNkZWZpbmUgSU1SNF9GRVIgICAgICAgIDB4NDAKKyNkZWZpbmUgSU1SNF9DRVIgICAgICAgIDB4MjAKKyNkZWZpbmUgSU1SNF9BSVMgICAgICAgIDB4MTAKKyNkZWZpbmUgSU1SNF9MT1MgICAgICAgIDB4MDgKKyNkZWZpbmUgSU1SNF9DVkUgICAgICAgIDB4MDQKKyNkZWZpbmUgSU1SNF9TTElQICAgICAgIDB4MDIKKyNkZWZpbmUgSU1SNF9FQkUgICAgICAgIDB4MDEKKworLyogRk1SMC01IGZvciBFMSBhbmQgVDEgIChGcmFtZXIgTW9kZSBSZWdpc3RlciApICovCisKKyNkZWZpbmUgRk1SMF9YQzEgICAgICAgIDB4ODAKKyNkZWZpbmUgRk1SMF9YQzAgICAgICAgIDB4NDAKKyNkZWZpbmUgRk1SMF9SQzEgICAgICAgIDB4MjAKKyNkZWZpbmUgRk1SMF9SQzAgICAgICAgIDB4MTAKKyNkZWZpbmUgRk1SMF9FWFREICAgICAgIDB4MDgKKyNkZWZpbmUgRk1SMF9BTE0gICAgICAgIDB4MDQKKyNkZWZpbmUgRTFfRk1SMF9GUlMgICAgIDB4MDIKKyNkZWZpbmUgVDFfRk1SMF9GUlMgICAgIDB4MDgKKyNkZWZpbmUgRk1SMF9TUkFGICAgICAgIDB4MDQKKyNkZWZpbmUgRk1SMF9FWExTICAgICAgIDB4MDIKKyNkZWZpbmUgRk1SMF9TSU0gICAgICAgIDB4MDEKKworI2RlZmluZSBGTVIxX01GQ1MgICAgICAgMHg4MAorI2RlZmluZSBGTVIxX0FGUiAgICAgICAgMHg0MAorI2RlZmluZSBGTVIxX0VOU0EgICAgICAgMHgyMAorI2RlZmluZSBGTVIxX0NUTSAgICAgICAgMHg4MAorI2RlZmluZSBGTVIxX1NJR00gICAgICAgMHg0MAorI2RlZmluZSBGTVIxX0VETCAgICAgICAgMHgyMAorI2RlZmluZSBGTVIxX1BNT0QgICAgICAgMHgxMAorI2RlZmluZSBGTVIxX1hGUyAgICAgICAgMHgwOAorI2RlZmluZSBGTVIxX0NSQyAgICAgICAgMHgwOAorI2RlZmluZSBGTVIxX0VDTSAgICAgICAgMHgwNAorI2RlZmluZSBGTVIxX0lNT0QgICAgICAgMHgwMgorI2RlZmluZSBGTVIxX1hBSVMgICAgICAgMHgwMQorCisjZGVmaW5lIEZNUjJfUkZTMSAgICAgICAweDgwCisjZGVmaW5lIEZNUjJfUkZTMCAgICAgICAweDQwCisjZGVmaW5lIEZNUjJfTUNTUAkweDQwCisjZGVmaW5lIEZNUjJfUlRNICAgICAgICAweDIwCisjZGVmaW5lIEZNUjJfU1NQICAgICAgICAweDIwCisjZGVmaW5lIEZNUjJfREFJUyAgICAgICAweDEwCisjZGVmaW5lIEZNUjJfU0FJUyAgICAgICAweDA4CisjZGVmaW5lIEZNUjJfUExCICAgICAgICAweDA0CisjZGVmaW5lIEZNUjJfQVhSQSAgICAgICAweDAyCisjZGVmaW5lIEZNUjJfQUxNRiAgICAgICAweDAxCisjZGVmaW5lIEZNUjJfRVhaRSAgICAgICAweDAxCisKKyNkZWZpbmUgTE9PUF9SVE0JMHg0MAorI2RlZmluZSBMT09QX1NGTQkweDQwCisjZGVmaW5lIExPT1BfRUNMQgkweDIwCisjZGVmaW5lIExPT1BfQ0xBCTB4MWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIEZNUjNfWExECTB4MjAKKyNkZWZpbmUgRk1SM19YTFUJMHgxMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgRk1SNF9BSVMzICAgICAgIDB4ODAKKyNkZWZpbmUgRk1SNF9UTSAgICAgICAgIDB4NDAKKyNkZWZpbmUgRk1SNF9YUkEgICAgICAgIDB4MjAKKyNkZWZpbmUgRk1SNF9TU0MxICAgICAgIDB4MTAKKyNkZWZpbmUgRk1SNF9TU0MwICAgICAgIDB4MDgKKyNkZWZpbmUgRk1SNF9BVVRPICAgICAgIDB4MDQKKyNkZWZpbmUgRk1SNF9GTTEgICAgICAgIDB4MDIKKyNkZWZpbmUgRk1SNF9GTTAgICAgICAgIDB4MDEKKworI2RlZmluZSBGTVI1X1NSUyAgICAgICAgMHg4MAorI2RlZmluZSBGTVI1X0VJQlIgICAgICAgMHg0MAorI2RlZmluZSBGTVI1X1hMRCAgICAgICAgMHgyMAorI2RlZmluZSBGTVI1X1hMVSAgICAgICAgMHgxMAorCisKKy8qIExPT1AgKENoYW5uZWwgTG9vcCBCYWNrKQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTE9PUF9TRk0gICAgICAgIDB4NDAKKyNkZWZpbmUgTE9PUF9FQ0xCICAgICAgIDB4MjAKKyNkZWZpbmUgTE9PUF9DTEE0ICAgICAgIDB4MTAKKyNkZWZpbmUgTE9PUF9DTEEzICAgICAgIDB4MDgKKyNkZWZpbmUgTE9PUF9DTEEyICAgICAgIDB4MDQKKyNkZWZpbmUgTE9PUF9DTEExICAgICAgIDB4MDIKKyNkZWZpbmUgTE9PUF9DTEEwICAgICAgIDB4MDEKKworCisKKy8qIFhTVyAoVHJhbnNtaXQgU2VydmljZSBXb3JkIFB1bHNlZnJhbWUpCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgWFNXX1hTSVMgICAgICAgIDB4ODAKKyNkZWZpbmUgWFNXX1hUTSAgICAgICAgIDB4NDAKKyNkZWZpbmUgWFNXX1hSQSAgICAgICAgIDB4MjAKKyNkZWZpbmUgWFNXX1hZMCAgICAgICAgIDB4MTAKKyNkZWZpbmUgWFNXX1hZMSAgICAgICAgIDB4MDgKKyNkZWZpbmUgWFNXX1hZMiAgICAgICAgIDB4MDQKKyNkZWZpbmUgWFNXX1hZMyAgICAgICAgIDB4MDIKKyNkZWZpbmUgWFNXX1hZNCAgICAgICAgIDB4MDEKKworCisvKiBYU1AgKFRyYW5zbWl0IFNwYXJlIEJpdHMpCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgWFNQX1hBUCAgICAgICAgIDB4ODAKKyNkZWZpbmUgWFNQX0NBU0VOICAgICAgIDB4NDAKKyNkZWZpbmUgWFNQX1RUMCAgICAgICAgIDB4MjAKKyNkZWZpbmUgWFNQX0VCUCAgICAgICAgIDB4MTAKKyNkZWZpbmUgWFNQX0FYUyAgICAgICAgIDB4MDgKKyNkZWZpbmUgWFNQX1hTSUYgICAgICAgIDB4MDQKKyNkZWZpbmUgWFNQX1hTMTMgICAgICAgIDB4MDIKKyNkZWZpbmUgWFNQX1hTMTUgICAgICAgIDB4MDEKKworCisvKiBYQzAvMSAoVHJhbnNtaXQgQ29udHJvbCAwLzEpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgWEMwX1NBOEUgICAgICAgIDB4ODAKKyNkZWZpbmUgWEMwX1NBN0UgICAgICAgIDB4NDAKKyNkZWZpbmUgWEMwX1NBNkUgICAgICAgIDB4MjAKKyNkZWZpbmUgWEMwX1NBNUUgICAgICAgIDB4MTAKKyNkZWZpbmUgWEMwX1NBNEUgICAgICAgIDB4MDgKKyNkZWZpbmUgWEMwX0JSTSAgICAgICAgIDB4ODAKKyNkZWZpbmUgWEMwX01GQlMgICAgICAgIDB4NDAKKyNkZWZpbmUgWEMwX1NGUlogICAgICAgIDB4MTAKKyNkZWZpbmUgWEMwX1hDTzIgICAgICAgIDB4MDQKKyNkZWZpbmUgWEMwX1hDTzEgICAgICAgIDB4MDIKKyNkZWZpbmUgWEMwX1hDTzAgICAgICAgIDB4MDEKKworI2RlZmluZSBYQzFfWFRPNSAgICAgICAgMHgyMAorI2RlZmluZSBYQzFfWFRPNCAgICAgICAgMHgxMAorI2RlZmluZSBYQzFfWFRPMyAgICAgICAgMHgwOAorI2RlZmluZSBYQzFfWFRPMiAgICAgICAgMHgwNAorI2RlZmluZSBYQzFfWFRPMSAgICAgICAgMHgwMgorI2RlZmluZSBYQzFfWFRPMCAgICAgICAgMHgwMQorCisKKy8qIFJDMC8xIChSZWNlaXZlIENvbnRyb2wgMC8xKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJDMF9TSUNTICAgICAgICAweDQwCisjZGVmaW5lIFJDMF9DUkNJICAgICAgICAweDIwCisjZGVmaW5lIFJDMF9YQ1JDSSAgICAgICAweDEwCisjZGVmaW5lIFJDMF9SRElTICAgICAgICAweDA4CisjZGVmaW5lIFJDMF9SQ08yICAgICAgICAweDA0CisjZGVmaW5lIFJDMF9SQ08xICAgICAgICAweDAyCisjZGVmaW5lIFJDMF9SQ08wICAgICAgICAweDAxCisKKyNkZWZpbmUgUkMxX1NXRCAgICAgICAgIDB4ODAKKyNkZWZpbmUgUkMxX0FTWTQgICAgICAgIDB4NDAKKyNkZWZpbmUgUkMxX1JSQU0gICAgICAgIDB4NDAKKyNkZWZpbmUgUkMxX1JUTzUgICAgICAgIDB4MjAKKyNkZWZpbmUgUkMxX1JUTzQgICAgICAgIDB4MTAKKyNkZWZpbmUgUkMxX1JUTzMgICAgICAgIDB4MDgKKyNkZWZpbmUgUkMxX1JUTzIgICAgICAgIDB4MDQKKyNkZWZpbmUgUkMxX1JUTzEgICAgICAgIDB4MDIKKyNkZWZpbmUgUkMxX1JUTzAgICAgICAgIDB4MDEKKworCisKKy8qIFhQTTAtMiAoVHJhbnNtaXQgUHVsc2UgTWFzayAwLTIpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgWFBNMF9YUDEyICAgICAgIDB4ODAKKyNkZWZpbmUgWFBNMF9YUDExICAgICAgIDB4NDAKKyNkZWZpbmUgWFBNMF9YUDEwICAgICAgIDB4MjAKKyNkZWZpbmUgWFBNMF9YUDA0ICAgICAgIDB4MTAKKyNkZWZpbmUgWFBNMF9YUDAzICAgICAgIDB4MDgKKyNkZWZpbmUgWFBNMF9YUDAyICAgICAgIDB4MDQKKyNkZWZpbmUgWFBNMF9YUDAxICAgICAgIDB4MDIKKyNkZWZpbmUgWFBNMF9YUDAwICAgICAgIDB4MDEKKworI2RlZmluZSBYUE0xX1hQMzAgICAgICAgMHg4MAorI2RlZmluZSBYUE0xX1hQMjQgICAgICAgMHg0MAorI2RlZmluZSBYUE0xX1hQMjMgICAgICAgMHgyMAorI2RlZmluZSBYUE0xX1hQMjIgICAgICAgMHgxMAorI2RlZmluZSBYUE0xX1hQMjEgICAgICAgMHgwOAorI2RlZmluZSBYUE0xX1hQMjAgICAgICAgMHgwNAorI2RlZmluZSBYUE0xX1hQMTQgICAgICAgMHgwMgorI2RlZmluZSBYUE0xX1hQMTMgICAgICAgMHgwMQorCisjZGVmaW5lIFhQTTJfWExIUCAgICAgICAweDgwCisjZGVmaW5lIFhQTTJfWExUICAgICAgICAweDQwCisjZGVmaW5lIFhQTTJfREFYTFQgICAgICAweDIwCisjZGVmaW5lIFhQTTJfWFAzNCAgICAgICAweDA4CisjZGVmaW5lIFhQTTJfWFAzMyAgICAgICAweDA0CisjZGVmaW5lIFhQTTJfWFAzMiAgICAgICAweDAyCisjZGVmaW5lIFhQTTJfWFAzMSAgICAgICAweDAxCisKKworLyogVFNXTSAoVHJhbnNwYXJlbnQgU2VydmljZSBXb3JkIE1hc2spCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFRTV01fVFNJUyAgICAgICAweDgwCisjZGVmaW5lIFRTV01fVFNJRiAgICAgICAweDQwCisjZGVmaW5lIFRTV01fVFJBICAgICAgICAweDIwCisjZGVmaW5lIFRTV01fVFNBNCAgICAgICAweDEwCisjZGVmaW5lIFRTV01fVFNBNSAgICAgICAweDA4CisjZGVmaW5lIFRTV01fVFNBNiAgICAgICAweDA0CisjZGVmaW5lIFRTV01fVFNBNyAgICAgICAweDAyCisjZGVmaW5lIFRTV01fVFNBOCAgICAgICAweDAxCisKKy8qIElETEUgPElkbGUgQ2hhbm5lbCBDb2RlIFJlZ2lzdGVyPgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIElETEVfSURMNyAgICAgICAweDgwCisjZGVmaW5lIElETEVfSURMNiAgICAgICAweDQwCisjZGVmaW5lIElETEVfSURMNSAgICAgICAweDIwCisjZGVmaW5lIElETEVfSURMNCAgICAgICAweDEwCisjZGVmaW5lIElETEVfSURMMyAgICAgICAweDA4CisjZGVmaW5lIElETEVfSURMMiAgICAgICAweDA0CisjZGVmaW5lIElETEVfSURMMSAgICAgICAweDAyCisjZGVmaW5lIElETEVfSURMMCAgICAgICAweDAxCisKKworLyogWFNBNC04IDxUcmFuc21pdCBTQTQtOCBSZWdpc3RlcihSZWFkL1dyaXRlKSA+CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBYU0E0X1hTNDcgICAgICAgMHg4MAorI2RlZmluZSBYU0E0X1hTNDYgICAgICAgMHg0MAorI2RlZmluZSBYU0E0X1hTNDUgICAgICAgMHgyMAorI2RlZmluZSBYU0E0X1hTNDQgICAgICAgMHgxMAorI2RlZmluZSBYU0E0X1hTNDMgICAgICAgMHgwOAorI2RlZmluZSBYU0E0X1hTNDIgICAgICAgMHgwNAorI2RlZmluZSBYU0E0X1hTNDEgICAgICAgMHgwMgorI2RlZmluZSBYU0E0X1hTNDAgICAgICAgMHgwMQorCisjZGVmaW5lIFhTQTVfWFM1NyAgICAgICAweDgwCisjZGVmaW5lIFhTQTVfWFM1NiAgICAgICAweDQwCisjZGVmaW5lIFhTQTVfWFM1NSAgICAgICAweDIwCisjZGVmaW5lIFhTQTVfWFM1NCAgICAgICAweDEwCisjZGVmaW5lIFhTQTVfWFM1MyAgICAgICAweDA4CisjZGVmaW5lIFhTQTVfWFM1MiAgICAgICAweDA0CisjZGVmaW5lIFhTQTVfWFM1MSAgICAgICAweDAyCisjZGVmaW5lIFhTQTVfWFM1MCAgICAgICAweDAxCisKKyNkZWZpbmUgWFNBNl9YUzY3ICAgICAgIDB4ODAKKyNkZWZpbmUgWFNBNl9YUzY2ICAgICAgIDB4NDAKKyNkZWZpbmUgWFNBNl9YUzY1ICAgICAgIDB4MjAKKyNkZWZpbmUgWFNBNl9YUzY0ICAgICAgIDB4MTAKKyNkZWZpbmUgWFNBNl9YUzYzICAgICAgIDB4MDgKKyNkZWZpbmUgWFNBNl9YUzYyICAgICAgIDB4MDQKKyNkZWZpbmUgWFNBNl9YUzYxICAgICAgIDB4MDIKKyNkZWZpbmUgWFNBNl9YUzYwICAgICAgIDB4MDEKKworI2RlZmluZSBYU0E3X1hTNzcgICAgICAgMHg4MAorI2RlZmluZSBYU0E3X1hTNzYgICAgICAgMHg0MAorI2RlZmluZSBYU0E3X1hTNzUgICAgICAgMHgyMAorI2RlZmluZSBYU0E3X1hTNzQgICAgICAgMHgxMAorI2RlZmluZSBYU0E3X1hTNzMgICAgICAgMHgwOAorI2RlZmluZSBYU0E3X1hTNzIgICAgICAgMHgwNAorI2RlZmluZSBYU0E3X1hTNzEgICAgICAgMHgwMgorI2RlZmluZSBYU0E3X1hTNzAgICAgICAgMHgwMQorCisjZGVmaW5lIFhTQThfWFM4NyAgICAgICAweDgwCisjZGVmaW5lIFhTQThfWFM4NiAgICAgICAweDQwCisjZGVmaW5lIFhTQThfWFM4NSAgICAgICAweDIwCisjZGVmaW5lIFhTQThfWFM4NCAgICAgICAweDEwCisjZGVmaW5lIFhTQThfWFM4MyAgICAgICAweDA4CisjZGVmaW5lIFhTQThfWFM4MiAgICAgICAweDA0CisjZGVmaW5lIFhTQThfWFM4MSAgICAgICAweDAyCisjZGVmaW5lIFhTQThfWFM4MCAgICAgICAweDAxCisKKworLyogWERMMS0zIChUcmFuc21pdCBETC1CaXQgUmVnaXN0ZXIxLTMgKHJlYWQvd3JpdGUpKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgWERMMV9YREwxNyAgICAgIDB4ODAKKyNkZWZpbmUgWERMMV9YREwxNiAgICAgIDB4NDAKKyNkZWZpbmUgWERMMV9YREwxNSAgICAgIDB4MjAKKyNkZWZpbmUgWERMMV9YREwxNCAgICAgIDB4MTAKKyNkZWZpbmUgWERMMV9YREwxMyAgICAgIDB4MDgKKyNkZWZpbmUgWERMMV9YREwxMiAgICAgIDB4MDQKKyNkZWZpbmUgWERMMV9YREwxMSAgICAgIDB4MDIKKyNkZWZpbmUgWERMMV9YREwxMCAgICAgIDB4MDEKKworI2RlZmluZSBYREwyX1hETDI3ICAgICAgMHg4MAorI2RlZmluZSBYREwyX1hETDI2ICAgICAgMHg0MAorI2RlZmluZSBYREwyX1hETDI1ICAgICAgMHgyMAorI2RlZmluZSBYREwyX1hETDI0ICAgICAgMHgxMAorI2RlZmluZSBYREwyX1hETDIzICAgICAgMHgwOAorI2RlZmluZSBYREwyX1hETDIyICAgICAgMHgwNAorI2RlZmluZSBYREwyX1hETDIxICAgICAgMHgwMgorI2RlZmluZSBYREwyX1hETDIwICAgICAgMHgwMQorCisjZGVmaW5lIFhETDNfWERMMzcgICAgICAweDgwCisjZGVmaW5lIFhETDNfWERMMzYgICAgICAweDQwCisjZGVmaW5lIFhETDNfWERMMzUgICAgICAweDIwCisjZGVmaW5lIFhETDNfWERMMzQgICAgICAweDEwCisjZGVmaW5lIFhETDNfWERMMzMgICAgICAweDA4CisjZGVmaW5lIFhETDNfWERMMzIgICAgICAweDA0CisjZGVmaW5lIFhETDNfWERMMzEgICAgICAweDAyCisjZGVmaW5lIFhETDNfWERMMzAgICAgICAweDAxCisKKworLyogSUNCMS00IChJZGxlIENoYW5uZWwgUmVnaXN0ZXIgMS00KQorICAgLS0tLS0tLS0tLS0tLS0tLS0tIEUxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBFMV9JQ0IxX0lDMAkweDgwCisjZGVmaW5lIEUxX0lDQjFfSUMxCTB4NDAKKyNkZWZpbmUgRTFfSUNCMV9JQzIJMHgyMAorI2RlZmluZSBFMV9JQ0IxX0lDMwkweDEwCisjZGVmaW5lIEUxX0lDQjFfSUM0CTB4MDgKKyNkZWZpbmUgRTFfSUNCMV9JQzUJMHgwNAorI2RlZmluZSBFMV9JQ0IxX0lDNgkweDAyCisjZGVmaW5lIEUxX0lDQjFfSUM3CTB4MDEKKworI2RlZmluZSBFMV9JQ0IyX0lDOAkweDgwCisjZGVmaW5lIEUxX0lDQjJfSUM5CTB4NDAKKyNkZWZpbmUgRTFfSUNCMl9JQzEwCTB4MjAKKyNkZWZpbmUgRTFfSUNCMl9JQzExCTB4MTAKKyNkZWZpbmUgRTFfSUNCMl9JQzEyCTB4MDgKKyNkZWZpbmUgRTFfSUNCMl9JQzEzCTB4MDQKKyNkZWZpbmUgRTFfSUNCMl9JQzE0CTB4MDIKKyNkZWZpbmUgRTFfSUNCMl9JQzE1CTB4MDEKKworI2RlZmluZSBFMV9JQ0IzX0lDMTYJMHg4MAorI2RlZmluZSBFMV9JQ0IzX0lDMTcJMHg0MAorI2RlZmluZSBFMV9JQ0IzX0lDMTgJMHgyMAorI2RlZmluZSBFMV9JQ0IzX0lDMTkJMHgxMAorI2RlZmluZSBFMV9JQ0IzX0lDMjAJMHgwOAorI2RlZmluZSBFMV9JQ0IzX0lDMjEJMHgwNAorI2RlZmluZSBFMV9JQ0IzX0lDMjIJMHgwMgorI2RlZmluZSBFMV9JQ0IzX0lDMjMJMHgwMQorCisjZGVmaW5lIEUxX0lDQjRfSUMyNAkweDgwCisjZGVmaW5lIEUxX0lDQjRfSUMyNQkweDQwCisjZGVmaW5lIEUxX0lDQjRfSUMyNgkweDIwCisjZGVmaW5lIEUxX0lDQjRfSUMyNwkweDEwCisjZGVmaW5lIEUxX0lDQjRfSUMyOAkweDA4CisjZGVmaW5lIEUxX0lDQjRfSUMyOQkweDA0CisjZGVmaW5lIEUxX0lDQjRfSUMzMAkweDAyCisjZGVmaW5lIEUxX0lDQjRfSUMzMQkweDAxCisKKy8qIElDQjEtNCAoSWRsZSBDaGFubmVsIFJlZ2lzdGVyIDEtNCkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLSBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVDFfSUNCMV9JQzEJMHg4MAorI2RlZmluZSBUMV9JQ0IxX0lDMgkweDQwCisjZGVmaW5lIFQxX0lDQjFfSUMzCTB4MjAKKyNkZWZpbmUgVDFfSUNCMV9JQzQJMHgxMAorI2RlZmluZSBUMV9JQ0IxX0lDNQkweDA4CisjZGVmaW5lIFQxX0lDQjFfSUM2CTB4MDQKKyNkZWZpbmUgVDFfSUNCMV9JQzcJMHgwMgorI2RlZmluZSBUMV9JQ0IxX0lDOAkweDAxCisKKyNkZWZpbmUgVDFfSUNCMl9JQzkJMHg4MAorI2RlZmluZSBUMV9JQ0IyX0lDMTAJMHg0MAorI2RlZmluZSBUMV9JQ0IyX0lDMTEJMHgyMAorI2RlZmluZSBUMV9JQ0IyX0lDMTIJMHgxMAorI2RlZmluZSBUMV9JQ0IyX0lDMTMJMHgwOAorI2RlZmluZSBUMV9JQ0IyX0lDMTQJMHgwNAorI2RlZmluZSBUMV9JQ0IyX0lDMTUJMHgwMgorI2RlZmluZSBUMV9JQ0IyX0lDMTYJMHgwMQorCisjZGVmaW5lIFQxX0lDQjNfSUMxNwkweDgwCisjZGVmaW5lIFQxX0lDQjNfSUMxOAkweDQwCisjZGVmaW5lIFQxX0lDQjNfSUMxOQkweDIwCisjZGVmaW5lIFQxX0lDQjNfSUMyMAkweDEwCisjZGVmaW5lIFQxX0lDQjNfSUMyMQkweDA4CisjZGVmaW5lIFQxX0lDQjNfSUMyMgkweDA0CisjZGVmaW5lIFQxX0lDQjNfSUMyMwkweDAyCisjZGVmaW5lIFQxX0lDQjNfSUMyNAkweDAxCisKKy8qIEZNUjMgKEZyYW1lciBNb2RlIFJlZ2lzdGVyIDMpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLUUxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRk1SM19DTUkgICAgICAgIDB4MDgKKyNkZWZpbmUgRk1SM19TWU5TQSAgICAgIDB4MDQKKyNkZWZpbmUgRk1SM19DRlJaICAgICAgIDB4MDIKKyNkZWZpbmUgRk1SM19FWFRJVyAgICAgIDB4MDEKKworCisKKy8qIENDQjEtMyAoQ2xlYXIgQ2hhbm5lbCBSZWdpc3RlcikKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0gVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBDQ0IxX0NIMSAgICAgICAgMHg4MAorI2RlZmluZSBDQ0IxX0NIMiAgICAgICAgMHg0MAorI2RlZmluZSBDQ0IxX0NIMyAgICAgICAgMHgyMAorI2RlZmluZSBDQ0IxX0NINCAgICAgICAgMHgxMAorI2RlZmluZSBDQ0IxX0NINSAgICAgICAgMHgwOAorI2RlZmluZSBDQ0IxX0NINiAgICAgICAgMHgwNAorI2RlZmluZSBDQ0IxX0NINyAgICAgICAgMHgwMgorI2RlZmluZSBDQ0IxX0NIOCAgICAgICAgMHgwMQorCisjZGVmaW5lIENDQjJfQ0g5ICAgICAgICAweDgwCisjZGVmaW5lIENDQjJfQ0gxMCAgICAgICAweDQwCisjZGVmaW5lIENDQjJfQ0gxMSAgICAgICAweDIwCisjZGVmaW5lIENDQjJfQ0gxMiAgICAgICAweDEwCisjZGVmaW5lIENDQjJfQ0gxMyAgICAgICAweDA4CisjZGVmaW5lIENDQjJfQ0gxNCAgICAgICAweDA0CisjZGVmaW5lIENDQjJfQ0gxNSAgICAgICAweDAyCisjZGVmaW5lIENDQjJfQ0gxNiAgICAgICAweDAxCisKKyNkZWZpbmUgQ0NCM19DSDE3ICAgICAgIDB4ODAKKyNkZWZpbmUgQ0NCM19DSDE4ICAgICAgIDB4NDAKKyNkZWZpbmUgQ0NCM19DSDE5ICAgICAgIDB4MjAKKyNkZWZpbmUgQ0NCM19DSDIwICAgICAgIDB4MTAKKyNkZWZpbmUgQ0NCM19DSDIxICAgICAgIDB4MDgKKyNkZWZpbmUgQ0NCM19DSDIyICAgICAgIDB4MDQKKyNkZWZpbmUgQ0NCM19DSDIzICAgICAgIDB4MDIKKyNkZWZpbmUgQ0NCM19DSDI0ICAgICAgIDB4MDEKKworCisvKiBMSU0wLzEgKExpbmUgSW50ZXJmYWNlIE1vZGUgMC8xKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExJTTBfWEZCICAgICAgICAweDgwCisjZGVmaW5lIExJTTBfWERPUyAgICAgICAweDQwCisjZGVmaW5lIExJTTBfU0NMMSAgICAgICAweDIwCisjZGVmaW5lIExJTTBfU0NMMCAgICAgICAweDEwCisjZGVmaW5lIExJTTBfRVFPTiAgICAgICAweDA4CisjZGVmaW5lIExJTTBfRUxPUyAgICAgICAweDA0CisjZGVmaW5lIExJTTBfTEwgICAgICAgICAweDAyCisjZGVmaW5lIExJTTBfTUFTICAgICAgICAweDAxCisKKyNkZWZpbmUgTElNMV9FRlNDICAgICAgIDB4ODAKKyNkZWZpbmUgTElNMV9SSUwyICAgICAgIDB4NDAKKyNkZWZpbmUgTElNMV9SSUwxICAgICAgIDB4MjAKKyNkZWZpbmUgTElNMV9SSUwwICAgICAgIDB4MTAKKyNkZWZpbmUgTElNMV9EQ09DICAgICAgIDB4MDgKKyNkZWZpbmUgTElNMV9KQVRUICAgICAgIDB4MDQKKyNkZWZpbmUgTElNMV9STCAgICAgICAgIDB4MDIKKyNkZWZpbmUgTElNMV9EUlMgICAgICAgIDB4MDEKKworCisvKiBQQ0RSIChQdWxzZSBDb3VudCBEZXRlY3Rpb24gUmVnaXN0ZXIoUmVhZC9Xcml0ZSkpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUENEUl9QQ0Q3CTB4ODAKKyNkZWZpbmUgUENEUl9QQ0Q2CTB4NDAKKyNkZWZpbmUgUENEUl9QQ0Q1CTB4MjAKKyNkZWZpbmUgUENEUl9QQ0Q0CTB4MTAKKyNkZWZpbmUgUENEUl9QQ0QzCTB4MDgKKyNkZWZpbmUgUENEUl9QQ0QyCTB4MDQKKyNkZWZpbmUgUENEUl9QQ0QxCTB4MDIKKyNkZWZpbmUgUENEUl9QQ0QwCTB4MDEKKworI2RlZmluZSBQQ1JSX1BDUjcJMHg4MAorI2RlZmluZSBQQ1JSX1BDUjYJMHg0MAorI2RlZmluZSBQQ1JSX1BDUjUJMHgyMAorI2RlZmluZSBQQ1JSX1BDUjQJMHgxMAorI2RlZmluZSBQQ1JSX1BDUjMJMHgwOAorI2RlZmluZSBQQ1JSX1BDUjIJMHgwNAorI2RlZmluZSBQQ1JSX1BDUjEJMHgwMgorI2RlZmluZSBQQ1JSX1BDUjAJMHgwMQorCisKKy8qIExJTTIgKExpbmUgSW50ZXJmYWNlIE1vZGUgMikKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExJTTJfREpBMgkweDIwCisjZGVmaW5lIExJTTJfREpBMQkweDEwCisjZGVmaW5lIExJTTJfTE9TMgkweDAyCisjZGVmaW5lIExJTTJfTE9TMQkweDAxCisKKy8qIExDUjEgKExvb3AgQ29kZSBSZWdpc3RlciAxKSAqLworCisjZGVmaW5lIExDUjFfRVBSTQkweDgwCisjZGVmaW5lCUxDUjFfWFBSQlMJMHg0MAorCisvKiBTSUMxIChTeXN0ZW0gSW50ZXJmYWNlIENvbnRyb2wgMSkgKi8KKyNkZWZpbmUgU0lDMV9TUlNDCTB4ODAKKyNkZWZpbmUgU0lDMV9SQlMxCTB4MjAKKyNkZWZpbmUgU0lDMV9SQlMwCTB4MTAKKyNkZWZpbmUgU0lDMV9TWFNDCTB4MDgKKyNkZWZpbmUgU0lDMV9YQlMxCTB4MDIKKyNkZWZpbmUgU0lDMV9YQlMwCTB4MDEKKworLyogREVDIChEaXNhYmxlIEVycm9yIENvdW50ZXIpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgREVDX0RDRUMzICAgICAgIDB4MjAKKyNkZWZpbmUgREVDX0RCRUMgICAgICAgIDB4MTAKKyNkZWZpbmUgREVDX0RDRUMxICAgICAgIDB4MDgKKyNkZWZpbmUgREVDX0RDRUMgICAgICAgIDB4MDgKKyNkZWZpbmUgREVDX0RFQkMgICAgICAgIDB4MDQKKyNkZWZpbmUgREVDX0RDVkMgICAgICAgIDB4MDIKKyNkZWZpbmUgREVDX0RGRUMgICAgICAgIDB4MDEKKworCisvKiBGQUxDIFJlZ2lzdGVyIEJpdHMgKFJlY2VpdmUgTW9kZSkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiBGUlMwLzEgKEZyYW1lciBSZWNlaXZlIFN0YXR1cyBSZWdpc3RlciAwLzEpCisgICAtLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBGUlMwX0xPUyAgICAgICAgMHg4MAorI2RlZmluZSBGUlMwX0FJUyAgICAgICAgMHg0MAorI2RlZmluZSBGUlMwX0xGQSAgICAgICAgMHgyMAorI2RlZmluZSBGUlMwX1JSQSAgICAgICAgMHgxMAorI2RlZmluZSBGUlMwX0FQSSAgICAgICAgMHgwOAorI2RlZmluZSBGUlMwX05NRiAgICAgICAgMHgwNAorI2RlZmluZSBGUlMwX0xNRkEgICAgICAgMHgwMgorI2RlZmluZSBGUlMwX0ZTUkYgICAgICAgMHgwMQorCisjZGVmaW5lIEZSUzFfVFMxNlJBICAgICAweDQwCisjZGVmaW5lIEZSUzFfVFMxNkxPUyAgICAweDIwCisjZGVmaW5lIEZSUzFfVFMxNkFJUyAgICAweDEwCisjZGVmaW5lIEZSUzFfVFMxNkxGQSAgICAweDA4CisjZGVmaW5lIEZSUzFfRVhaRCAgICAgICAweDgwCisjZGVmaW5lIEZSUzFfTExCREQgICAgICAweDEwCisjZGVmaW5lIEZSUzFfTExCQUQgICAgICAweDA4CisjZGVmaW5lIEZSUzFfWExTICAgICAgICAweDAyCisjZGVmaW5lIEZSUzFfWExPICAgICAgICAweDAxCisjZGVmaW5lIEZSUzFfUERFTgkweDQwCisKKy8qIEZSUzIvMyAoRnJhbWVyIFJlY2VpdmUgU3RhdHVzIFJlZ2lzdGVyIDIvMykKKyAgIC0tLS0tLS0tLS0tLS0tLS0tIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBGUlMyX0VTQzIgICAgICAgMHg4MAorI2RlZmluZSBGUlMyX0VTQzEgICAgICAgMHg0MAorI2RlZmluZSBGUlMyX0VTQzAgICAgICAgMHgyMAorCisjZGVmaW5lIEZSUzNfRkVINSAgICAgICAweDIwCisjZGVmaW5lIEZSUzNfRkVINCAgICAgICAweDEwCisjZGVmaW5lIEZSUzNfRkVIMyAgICAgICAweDA4CisjZGVmaW5lIEZSUzNfRkVIMiAgICAgICAweDA0CisjZGVmaW5lIEZSUzNfRkVIMSAgICAgICAweDAyCisjZGVmaW5lIEZSUzNfRkVIMCAgICAgICAweDAxCisKKworLyogUlNXIChSZWNlaXZlIFNlcnZpY2UgV29yZCBQdWxzZWZyYW1lKQorICAgLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUlNXX1JTSSAgICAgICAgIDB4ODAKKyNkZWZpbmUgUlNXX1JSQSAgICAgICAgIDB4MjAKKyNkZWZpbmUgUlNXX1JZTyAgICAgICAgIDB4MTAKKyNkZWZpbmUgUlNXX1JZMSAgICAgICAgIDB4MDgKKyNkZWZpbmUgUlNXX1JZMiAgICAgICAgIDB4MDQKKyNkZWZpbmUgUlNXX1JZMyAgICAgICAgIDB4MDIKKyNkZWZpbmUgUlNXX1JZNCAgICAgICAgIDB4MDEKKworCisvKiBSU1AgKFJlY2VpdmUgU3BhcmUgQml0cyAvIEFkZGl0aW9uYWwgU3RhdHVzKQorICAgLS0tLS0tLS0tLS0tLS0tLSBFMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUlNQX1NJMSAgICAgICAgIDB4ODAKKyNkZWZpbmUgUlNQX1NJMiAgICAgICAgIDB4NDAKKyNkZWZpbmUgUlNQX0xMQkRECTB4MTAKKyNkZWZpbmUgUlNQX0xMQkFECTB4MDgKKyNkZWZpbmUgUlNQX1JTSUYgICAgICAgIDB4MDQKKyNkZWZpbmUgUlNQX1JTMTMgICAgICAgIDB4MDIKKyNkZWZpbmUgUlNQX1JTMTUgICAgICAgIDB4MDEKKworCisvKiBGRUNMIChGcmFtaW5nIEVycm9yIENvdW50ZXIpCisgICAtLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBGRUNMX0ZFNyAgICAgICAgMHg4MAorI2RlZmluZSBGRUNMX0ZFNiAgICAgICAgMHg0MAorI2RlZmluZSBGRUNMX0ZFNSAgICAgICAgMHgyMAorI2RlZmluZSBGRUNMX0ZFNCAgICAgICAgMHgxMAorI2RlZmluZSBGRUNMX0ZFMyAgICAgICAgMHgwOAorI2RlZmluZSBGRUNMX0ZFMiAgICAgICAgMHgwNAorI2RlZmluZSBGRUNMX0ZFMSAgICAgICAgMHgwMgorI2RlZmluZSBGRUNMX0ZFMCAgICAgICAgMHgwMQorCisjZGVmaW5lIEZFQ0hfRkUxNSAgICAgICAweDgwCisjZGVmaW5lIEZFQ0hfRkUxNCAgICAgICAweDQwCisjZGVmaW5lIEZFQ0hfRkUxMyAgICAgICAweDIwCisjZGVmaW5lIEZFQ0hfRkUxMiAgICAgICAweDEwCisjZGVmaW5lIEZFQ0hfRkUxMSAgICAgICAweDA4CisjZGVmaW5lIEZFQ0hfRkUxMCAgICAgICAweDA0CisjZGVmaW5lIEZFQ0hfRkU5ICAgICAgICAweDAyCisjZGVmaW5lIEZFQ0hfRkU4ICAgICAgICAweDAxCisKKworLyogQ1ZDbCAoQ29kZSBWaW9sYXRpb24gQ291bnRlcikKKyAgIC0tLS0tLS0tLS0tLS0tLS0tIEUxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBDVkNMX0NWNyAgICAgICAgMHg4MAorI2RlZmluZSBDVkNMX0NWNiAgICAgICAgMHg0MAorI2RlZmluZSBDVkNMX0NWNSAgICAgICAgMHgyMAorI2RlZmluZSBDVkNMX0NWNCAgICAgICAgMHgxMAorI2RlZmluZSBDVkNMX0NWMyAgICAgICAgMHgwOAorI2RlZmluZSBDVkNMX0NWMiAgICAgICAgMHgwNAorI2RlZmluZSBDVkNMX0NWMSAgICAgICAgMHgwMgorI2RlZmluZSBDVkNMX0NWMCAgICAgICAgMHgwMQorCisjZGVmaW5lIENWQ0hfQ1YxNSAgICAgICAweDgwCisjZGVmaW5lIENWQ0hfQ1YxNCAgICAgICAweDQwCisjZGVmaW5lIENWQ0hfQ1YxMyAgICAgICAweDIwCisjZGVmaW5lIENWQ0hfQ1YxMiAgICAgICAweDEwCisjZGVmaW5lIENWQ0hfQ1YxMSAgICAgICAweDA4CisjZGVmaW5lIENWQ0hfQ1YxMCAgICAgICAweDA0CisjZGVmaW5lIENWQ0hfQ1Y5ICAgICAgICAweDAyCisjZGVmaW5lIENWQ0hfQ1Y4ICAgICAgICAweDAxCisKKworLyogQ0VDMS0zTCAoQ1JDIEVycm9yIENvdW50ZXIpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBDRUMxTF9DUjcgICAgICAgMHg4MAorI2RlZmluZSBDRUMxTF9DUjYgICAgICAgMHg0MAorI2RlZmluZSBDRUMxTF9DUjUgICAgICAgMHgyMAorI2RlZmluZSBDRUMxTF9DUjQgICAgICAgMHgxMAorI2RlZmluZSBDRUMxTF9DUjMgICAgICAgMHgwOAorI2RlZmluZSBDRUMxTF9DUjIgICAgICAgMHgwNAorI2RlZmluZSBDRUMxTF9DUjEgICAgICAgMHgwMgorI2RlZmluZSBDRUMxTF9DUjAgICAgICAgMHgwMQorCisjZGVmaW5lIENFQzFIX0NSMTUgICAgICAweDgwCisjZGVmaW5lIENFQzFIX0NSMTQgICAgICAweDQwCisjZGVmaW5lIENFQzFIX0NSMTMgICAgICAweDIwCisjZGVmaW5lIENFQzFIX0NSMTIgICAgICAweDEwCisjZGVmaW5lIENFQzFIX0NSMTEgICAgICAweDA4CisjZGVmaW5lIENFQzFIX0NSMTAgICAgICAweDA0CisjZGVmaW5lIENFQzFIX0NSOSAgICAgICAweDAyCisjZGVmaW5lIENFQzFIX0NSOCAgICAgICAweDAxCisKKyNkZWZpbmUgQ0VDMkxfQ1I3ICAgICAgIDB4ODAKKyNkZWZpbmUgQ0VDMkxfQ1I2ICAgICAgIDB4NDAKKyNkZWZpbmUgQ0VDMkxfQ1I1ICAgICAgIDB4MjAKKyNkZWZpbmUgQ0VDMkxfQ1I0ICAgICAgIDB4MTAKKyNkZWZpbmUgQ0VDMkxfQ1IzICAgICAgIDB4MDgKKyNkZWZpbmUgQ0VDMkxfQ1IyICAgICAgIDB4MDQKKyNkZWZpbmUgQ0VDMkxfQ1IxICAgICAgIDB4MDIKKyNkZWZpbmUgQ0VDMkxfQ1IwICAgICAgIDB4MDEKKworI2RlZmluZSBDRUMySF9DUjE1ICAgICAgMHg4MAorI2RlZmluZSBDRUMySF9DUjE0ICAgICAgMHg0MAorI2RlZmluZSBDRUMySF9DUjEzICAgICAgMHgyMAorI2RlZmluZSBDRUMySF9DUjEyICAgICAgMHgxMAorI2RlZmluZSBDRUMySF9DUjExICAgICAgMHgwOAorI2RlZmluZSBDRUMySF9DUjEwICAgICAgMHgwNAorI2RlZmluZSBDRUMySF9DUjkgICAgICAgMHgwMgorI2RlZmluZSBDRUMySF9DUjggICAgICAgMHgwMQorCisjZGVmaW5lIENFQzNMX0NSNyAgICAgICAweDgwCisjZGVmaW5lIENFQzNMX0NSNiAgICAgICAweDQwCisjZGVmaW5lIENFQzNMX0NSNSAgICAgICAweDIwCisjZGVmaW5lIENFQzNMX0NSNCAgICAgICAweDEwCisjZGVmaW5lIENFQzNMX0NSMyAgICAgICAweDA4CisjZGVmaW5lIENFQzNMX0NSMiAgICAgICAweDA0CisjZGVmaW5lIENFQzNMX0NSMSAgICAgICAweDAyCisjZGVmaW5lIENFQzNMX0NSMCAgICAgICAweDAxCisKKyNkZWZpbmUgQ0VDM0hfQ1IxNSAgICAgIDB4ODAKKyNkZWZpbmUgQ0VDM0hfQ1IxNCAgICAgIDB4NDAKKyNkZWZpbmUgQ0VDM0hfQ1IxMyAgICAgIDB4MjAKKyNkZWZpbmUgQ0VDM0hfQ1IxMiAgICAgIDB4MTAKKyNkZWZpbmUgQ0VDM0hfQ1IxMSAgICAgIDB4MDgKKyNkZWZpbmUgQ0VDM0hfQ1IxMCAgICAgIDB4MDQKKyNkZWZpbmUgQ0VDM0hfQ1I5ICAgICAgIDB4MDIKKyNkZWZpbmUgQ0VDM0hfQ1I4ICAgICAgIDB4MDEKKworCisvKiBDRUNMIChDUkMgRXJyb3IgQ291bnRlcikKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQ0VDTF9DUjcgICAgICAgIDB4ODAKKyNkZWZpbmUgQ0VDTF9DUjYgICAgICAgIDB4NDAKKyNkZWZpbmUgQ0VDTF9DUjUgICAgICAgIDB4MjAKKyNkZWZpbmUgQ0VDTF9DUjQgICAgICAgIDB4MTAKKyNkZWZpbmUgQ0VDTF9DUjMgICAgICAgIDB4MDgKKyNkZWZpbmUgQ0VDTF9DUjIgICAgICAgIDB4MDQKKyNkZWZpbmUgQ0VDTF9DUjEgICAgICAgIDB4MDIKKyNkZWZpbmUgQ0VDTF9DUjAgICAgICAgIDB4MDEKKworI2RlZmluZSBDRUNIX0NSMTUgICAgICAgMHg4MAorI2RlZmluZSBDRUNIX0NSMTQgICAgICAgMHg0MAorI2RlZmluZSBDRUNIX0NSMTMgICAgICAgMHgyMAorI2RlZmluZSBDRUNIX0NSMTIgICAgICAgMHgxMAorI2RlZmluZSBDRUNIX0NSMTEgICAgICAgMHgwOAorI2RlZmluZSBDRUNIX0NSMTAgICAgICAgMHgwNAorI2RlZmluZSBDRUNIX0NSOSAgICAgICAgMHgwMgorI2RlZmluZSBDRUNIX0NSOCAgICAgICAgMHgwMQorCisvKiBFQkNMIChFIEJpdCBFcnJvciBDb3VudGVyKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBFQkNMX0VCNyAgICAgICAgMHg4MAorI2RlZmluZSBFQkNMX0VCNiAgICAgICAgMHg0MAorI2RlZmluZSBFQkNMX0VCNSAgICAgICAgMHgyMAorI2RlZmluZSBFQkNMX0VCNCAgICAgICAgMHgxMAorI2RlZmluZSBFQkNMX0VCMyAgICAgICAgMHgwOAorI2RlZmluZSBFQkNMX0VCMiAgICAgICAgMHgwNAorI2RlZmluZSBFQkNMX0VCMSAgICAgICAgMHgwMgorI2RlZmluZSBFQkNMX0VCMCAgICAgICAgMHgwMQorCisjZGVmaW5lIEVCQ0hfRUIxNSAgICAgICAweDgwCisjZGVmaW5lIEVCQ0hfRUIxNCAgICAgICAweDQwCisjZGVmaW5lIEVCQ0hfRUIxMyAgICAgICAweDIwCisjZGVmaW5lIEVCQ0hfRUIxMiAgICAgICAweDEwCisjZGVmaW5lIEVCQ0hfRUIxMSAgICAgICAweDA4CisjZGVmaW5lIEVCQ0hfRUIxMCAgICAgICAweDA0CisjZGVmaW5lIEVCQ0hfRUI5ICAgICAgICAweDAyCisjZGVmaW5lIEVCQ0hfRUI4ICAgICAgICAweDAxCisKKworLyogUlNBNC04IChSZWNlaXZlIFNhNC04LUJpdCBSZWdpc3RlcikKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEUxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJTQTRfUlM0NyAgICAgICAweDgwCisjZGVmaW5lIFJTQTRfUlM0NiAgICAgICAweDQwCisjZGVmaW5lIFJTQTRfUlM0NSAgICAgICAweDIwCisjZGVmaW5lIFJTQTRfUlM0NCAgICAgICAweDEwCisjZGVmaW5lIFJTQTRfUlM0MyAgICAgICAweDA4CisjZGVmaW5lIFJTQTRfUlM0MiAgICAgICAweDA0CisjZGVmaW5lIFJTQTRfUlM0MSAgICAgICAweDAyCisjZGVmaW5lIFJTQTRfUlM0MCAgICAgICAweDAxCisKKyNkZWZpbmUgUlNBNV9SUzU3ICAgICAgIDB4ODAKKyNkZWZpbmUgUlNBNV9SUzU2ICAgICAgIDB4NDAKKyNkZWZpbmUgUlNBNV9SUzU1ICAgICAgIDB4MjAKKyNkZWZpbmUgUlNBNV9SUzU0ICAgICAgIDB4MTAKKyNkZWZpbmUgUlNBNV9SUzUzICAgICAgIDB4MDgKKyNkZWZpbmUgUlNBNV9SUzUyICAgICAgIDB4MDQKKyNkZWZpbmUgUlNBNV9SUzUxICAgICAgIDB4MDIKKyNkZWZpbmUgUlNBNV9SUzUwICAgICAgIDB4MDEKKworI2RlZmluZSBSU0E2X1JTNjcgICAgICAgMHg4MAorI2RlZmluZSBSU0E2X1JTNjYgICAgICAgMHg0MAorI2RlZmluZSBSU0E2X1JTNjUgICAgICAgMHgyMAorI2RlZmluZSBSU0E2X1JTNjQgICAgICAgMHgxMAorI2RlZmluZSBSU0E2X1JTNjMgICAgICAgMHgwOAorI2RlZmluZSBSU0E2X1JTNjIgICAgICAgMHgwNAorI2RlZmluZSBSU0E2X1JTNjEgICAgICAgMHgwMgorI2RlZmluZSBSU0E2X1JTNjAgICAgICAgMHgwMQorCisjZGVmaW5lIFJTQTdfUlM3NyAgICAgICAweDgwCisjZGVmaW5lIFJTQTdfUlM3NiAgICAgICAweDQwCisjZGVmaW5lIFJTQTdfUlM3NSAgICAgICAweDIwCisjZGVmaW5lIFJTQTdfUlM3NCAgICAgICAweDEwCisjZGVmaW5lIFJTQTdfUlM3MyAgICAgICAweDA4CisjZGVmaW5lIFJTQTdfUlM3MiAgICAgICAweDA0CisjZGVmaW5lIFJTQTdfUlM3MSAgICAgICAweDAyCisjZGVmaW5lIFJTQTdfUlM3MCAgICAgICAweDAxCisKKyNkZWZpbmUgUlNBOF9SUzg3ICAgICAgIDB4ODAKKyNkZWZpbmUgUlNBOF9SUzg2ICAgICAgIDB4NDAKKyNkZWZpbmUgUlNBOF9SUzg1ICAgICAgIDB4MjAKKyNkZWZpbmUgUlNBOF9SUzg0ICAgICAgIDB4MTAKKyNkZWZpbmUgUlNBOF9SUzgzICAgICAgIDB4MDgKKyNkZWZpbmUgUlNBOF9SUzgyICAgICAgIDB4MDQKKyNkZWZpbmUgUlNBOF9SUzgxICAgICAgIDB4MDIKKyNkZWZpbmUgUlNBOF9SUzgwICAgICAgIDB4MDEKKworLyogUlNBNlMgKFJlY2VpdmUgU2E2IEJpdCBTdGF0dXMgUmVnaXN0ZXIpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJTQTZTX1NYICAgICAgICAweDIwCisjZGVmaW5lIFJTQTZTX1NGICAgICAgICAweDEwCisjZGVmaW5lIFJTQTZTX1NFICAgICAgICAweDA4CisjZGVmaW5lIFJTQTZTX1NDICAgICAgICAweDA0CisjZGVmaW5lIFJTQTZTX1NBICAgICAgICAweDAyCisjZGVmaW5lIFJTQTZTX1M4ICAgICAgICAweDAxCisKKworLyogUkRMMS0zIFJlY2VpdmUgREwtQml0IFJlZ2lzdGVyMS0zKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBSREwxX1JETDE3ICAgICAgMHg4MAorI2RlZmluZSBSREwxX1JETDE2ICAgICAgMHg0MAorI2RlZmluZSBSREwxX1JETDE1ICAgICAgMHgyMAorI2RlZmluZSBSREwxX1JETDE0ICAgICAgMHgxMAorI2RlZmluZSBSREwxX1JETDEzICAgICAgMHgwOAorI2RlZmluZSBSREwxX1JETDEyICAgICAgMHgwNAorI2RlZmluZSBSREwxX1JETDExICAgICAgMHgwMgorI2RlZmluZSBSREwxX1JETDEwICAgICAgMHgwMQorCisjZGVmaW5lIFJETDJfUkRMMjcgICAgICAweDgwCisjZGVmaW5lIFJETDJfUkRMMjYgICAgICAweDQwCisjZGVmaW5lIFJETDJfUkRMMjUgICAgICAweDIwCisjZGVmaW5lIFJETDJfUkRMMjQgICAgICAweDEwCisjZGVmaW5lIFJETDJfUkRMMjMgICAgICAweDA4CisjZGVmaW5lIFJETDJfUkRMMjIgICAgICAweDA0CisjZGVmaW5lIFJETDJfUkRMMjEgICAgICAweDAyCisjZGVmaW5lIFJETDJfUkRMMjAgICAgICAweDAxCisKKyNkZWZpbmUgUkRMM19SREwzNyAgICAgIDB4ODAKKyNkZWZpbmUgUkRMM19SREwzNiAgICAgIDB4NDAKKyNkZWZpbmUgUkRMM19SREwzNSAgICAgIDB4MjAKKyNkZWZpbmUgUkRMM19SREwzNCAgICAgIDB4MTAKKyNkZWZpbmUgUkRMM19SREwzMyAgICAgIDB4MDgKKyNkZWZpbmUgUkRMM19SREwzMiAgICAgIDB4MDQKKyNkZWZpbmUgUkRMM19SREwzMSAgICAgIDB4MDIKKyNkZWZpbmUgUkRMM19SREwzMCAgICAgIDB4MDEKKworCisvKiBTSVMgKFNpZ25hbGluZyBTdGF0dXMgUmVnaXN0ZXIpCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBTSVNfWERPViAgICAgICAgMHg4MAorI2RlZmluZSBTSVNfWEZXICAgICAgICAgMHg0MAorI2RlZmluZSBTSVNfWFJFUCAgICAgICAgMHgyMAorI2RlZmluZSBTSVNfUkxJICAgICAgICAgMHgwOAorI2RlZmluZSBTSVNfQ0VDICAgICAgICAgMHgwNAorI2RlZmluZSBTSVNfQk9NICAgICAgICAgMHgwMQorCisKKy8qIFJTSVMgKFJlY2VpdmUgU2lnbmFsaW5nIFN0YXR1cyBSZWdpc3RlcikKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBSU0lTX1ZGUiAgICAgICAgMHg4MAorI2RlZmluZSBSU0lTX1JETyAgICAgICAgMHg0MAorI2RlZmluZSBSU0lTX0NSQzE2ICAgICAgMHgyMAorI2RlZmluZSBSU0lTX1JBQiAgICAgICAgMHgxMAorI2RlZmluZSBSU0lTX0hBMSAgICAgICAgMHgwOAorI2RlZmluZSBSU0lTX0hBMCAgICAgICAgMHgwNAorI2RlZmluZSBSU0lTX0hGUiAgICAgICAgMHgwMgorI2RlZmluZSBSU0lTX0xBICAgICAgICAgMHgwMQorCisKKy8qIFJCQ0wvSCAoUmVjZWl2ZSBCeXRlIENvdW50IExvdy9IaWdoKQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBSQkNMX1JCQzcgICAgICAgMHg4MAorI2RlZmluZSBSQkNMX1JCQzYgICAgICAgMHg0MAorI2RlZmluZSBSQkNMX1JCQzUgICAgICAgMHgyMAorI2RlZmluZSBSQkNMX1JCQzQgICAgICAgMHgxMAorI2RlZmluZSBSQkNMX1JCQzMgICAgICAgMHgwOAorI2RlZmluZSBSQkNMX1JCQzIgICAgICAgMHgwNAorI2RlZmluZSBSQkNMX1JCQzEgICAgICAgMHgwMgorI2RlZmluZSBSQkNMX1JCQzAgICAgICAgMHgwMQorCisjZGVmaW5lIFJCQ0hfT1YgICAgICAgICAweDEwCisjZGVmaW5lIFJCQ0hfUkJDMTEgICAgICAweDA4CisjZGVmaW5lIFJCQ0hfUkJDMTAgICAgICAweDA0CisjZGVmaW5lIFJCQ0hfUkJDOSAgICAgICAweDAyCisjZGVmaW5lIFJCQ0hfUkJDOCAgICAgICAweDAxCisKKworLyogSVNSMS0zICAoSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAxLTMpCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lICBGSVNSMF9STUUJMHg4MAorI2RlZmluZSAgRklTUjBfUkZTCTB4NDAKKyNkZWZpbmUgIEZJU1IwX1Q4TVMJMHgyMAorI2RlZmluZSAgRklTUjBfSVNGCTB4MjAKKyNkZWZpbmUgIEZJU1IwX1JNQgkweDEwCisjZGVmaW5lICBGSVNSMF9DQVNDCTB4MDgKKyNkZWZpbmUgIEZJU1IwX1JTQwkweDA4CisjZGVmaW5lICBGSVNSMF9DUkM2CTB4MDQKKyNkZWZpbmUgIEZJU1IwX0NSQzQJMHgwNAorI2RlZmluZSAgRklTUjBfUERFTgkweDAyCisjZGVmaW5lICBGSVNSMF9SUEYJMHgwMQorCisjZGVmaW5lICBGSVNSMV9DQVNFCTB4ODAKKyNkZWZpbmUgIEZJU1IxX0xMQlNDCTB4ODAKKyNkZWZpbmUgIEZJU1IxX1JETwkweDQwCisjZGVmaW5lICBGSVNSMV9BTExTCTB4MjAKKyNkZWZpbmUgIEZJU1IxX1hEVQkweDEwCisjZGVmaW5lICBGSVNSMV9YTUIJMHgwOAorI2RlZmluZSAgRklTUjFfWExTQwkweDAyCisjZGVmaW5lICBGSVNSMV9YUFIJMHgwMQorCisjZGVmaW5lICBGSVNSMl9GQVIJMHg4MAorI2RlZmluZSAgRklTUjJfTEZBCTB4NDAKKyNkZWZpbmUgIEZJU1IyX01GQVIJMHgyMAorI2RlZmluZSAgRklTUjJfVDQwME1TCTB4MTAKKyNkZWZpbmUgIEZJU1IyX0xNRkEJMHgxMAorI2RlZmluZSAgRklTUjJfQUlTCTB4MDgKKyNkZWZpbmUgIEZJU1IyX0xPUwkweDA0CisjZGVmaW5lICBGSVNSMl9SQVIJMHgwMgorI2RlZmluZSAgRklTUjJfUkEJMHgwMQorCisjZGVmaW5lICBGSVNSM19FUwkweDgwCisjZGVmaW5lICBGSVNSM19TRUMJMHg0MAorI2RlZmluZSAgRklTUjNfTE1GQTE2CTB4MjAKKyNkZWZpbmUgIEZJU1IzX0FJUzE2CTB4MTAKKyNkZWZpbmUgIEZJU1IzX1JBMTYJMHgwOAorI2RlZmluZSAgRklTUjNfQVBJCTB4MDQKKyNkZWZpbmUgIEZJU1IzX1hTTFAJMHgyMAorI2RlZmluZSAgRklTUjNfWFNMTgkweDEwCisjZGVmaW5lICBGSVNSM19MTEJTQwkweDA4CisjZGVmaW5lICBGSVNSM19YUlMJMHgwNAorI2RlZmluZSAgRklTUjNfU0xOCTB4MDIKKyNkZWZpbmUgIEZJU1IzX1NMUAkweDAxCisKKworLyogR0lTICAoR2xvYmFsIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIpCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lICBHSVNfSVNSMwkweDA4CisjZGVmaW5lICBHSVNfSVNSMgkweDA0CisjZGVmaW5lICBHSVNfSVNSMQkweDAyCisjZGVmaW5lICBHSVNfSVNSMAkweDAxCisKKworLyogVlNUUiAgKFZlcnNpb24gU3RhdHVzIFJlZ2lzdGVyKQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSAgVlNUUl9WTjMJMHgwOAorI2RlZmluZSAgVlNUUl9WTjIJMHgwNAorI2RlZmluZSAgVlNUUl9WTjEJMHgwMgorI2RlZmluZSAgVlNUUl9WTjAJMHgwMQorCisKKy8qPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+ICBMb2NhbCBDb250cm9sIFN0cnVjdHVyZXMgIDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwgKi8KKworLyogV3JpdGUtb25seSBSZWdpc3RlcnMgKEUxL1QxIGNvbnRyb2wgbW9kZSB3cml0ZSByZWdpc3RlcnMpICovCisjZGVmaW5lIFhGSUZPSAkweDAwCQkvKiBUeCBGSUZPIEhpZ2ggQnl0ZSAqLworI2RlZmluZSBYRklGT0wJMHgwMQkJLyogVHggRklGTyBMb3cgQnl0ZSAqLworI2RlZmluZSBDTURSCTB4MDIJCS8qIENvbW1hbmQgUmVnICovCisjZGVmaW5lIERFQwkweDYwCQkvKiBEaXNhYmxlIEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgVEVTVDIJMHg2MgkJLyogTWFudWYuIFRlc3QgUmVnIDIgKi8KKyNkZWZpbmUgWFMobmJyKQkoMHg3MCArIChuYnIpKQkvKiBUeCBDQVMgUmVnICgwIHRvIDE1KSAqLworCisvKiBSZWFkLXdyaXRlIFJlZ2lzdGVycyAoRTEvVDEgc3RhdHVzIG1vZGUgcmVhZCByZWdpc3RlcnMpICovCisjZGVmaW5lIE1PREUJMHgwMwkvKiBNb2RlIFJlZyAqLworI2RlZmluZSBSQUgxCTB4MDQJLyogUmVjZWl2ZSBBZGRyZXNzIEhpZ2ggMSAqLworI2RlZmluZSBSQUgyCTB4MDUJLyogUmVjZWl2ZSBBZGRyZXNzIEhpZ2ggMiAqLworI2RlZmluZSBSQUwxCTB4MDYJLyogUmVjZWl2ZSBBZGRyZXNzIExvdyAxICovCisjZGVmaW5lIFJBTDIJMHgwNwkvKiBSZWNlaXZlIEFkZHJlc3MgTG93IDIgKi8KKyNkZWZpbmUgSVBDCTB4MDgJLyogSW50ZXJydXB0IFBvcnQgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDQ1IxCTB4MDkJLyogQ29tbW9uIENvbmZpZ3VyYXRpb24gUmVnIDEgKi8KKyNkZWZpbmUgQ0NSMwkweDBBCS8qIENvbW1vbiBDb25maWd1cmF0aW9uIFJlZyAzICovCisjZGVmaW5lIFBSRQkweDBCCS8qIFByZWFtYmxlIFJlZyAqLworI2RlZmluZSBSVFIxCTB4MEMJLyogUmVjZWl2ZSBUaW1lc2xvdCBSZWcgMSAqLworI2RlZmluZSBSVFIyCTB4MEQJLyogUmVjZWl2ZSBUaW1lc2xvdCBSZWcgMiAqLworI2RlZmluZSBSVFIzCTB4MEUJLyogUmVjZWl2ZSBUaW1lc2xvdCBSZWcgMyAqLworI2RlZmluZSBSVFI0CTB4MEYJLyogUmVjZWl2ZSBUaW1lc2xvdCBSZWcgNCAqLworI2RlZmluZSBUVFIxCTB4MTAJLyogVHJhbnNtaXQgVGltZXNsb3QgUmVnIDEgKi8KKyNkZWZpbmUgVFRSMgkweDExCS8qIFRyYW5zbWl0IFRpbWVzbG90IFJlZyAyICovCisjZGVmaW5lIFRUUjMJMHgxMgkvKiBUcmFuc21pdCBUaW1lc2xvdCBSZWcgMyAqLworI2RlZmluZSBUVFI0CTB4MTMJLyogVHJhbnNtaXQgVGltZXNsb3QgUmVnIDQgKi8KKyNkZWZpbmUgSU1SMAkweDE0CS8qIEludGVycnVwdCBNYXNrIFJlZyAwICovCisjZGVmaW5lIElNUjEJMHgxNQkvKiBJbnRlcnJ1cHQgTWFzayBSZWcgMSAqLworI2RlZmluZSBJTVIyCTB4MTYJLyogSW50ZXJydXB0IE1hc2sgUmVnIDIgKi8KKyNkZWZpbmUgSU1SMwkweDE3CS8qIEludGVycnVwdCBNYXNrIFJlZyAzICovCisjZGVmaW5lIElNUjQJMHgxOAkvKiBJbnRlcnJ1cHQgTWFzayBSZWcgNCAqLworI2RlZmluZSBJTVI1CTB4MTkJLyogSW50ZXJydXB0IE1hc2sgUmVnIDUgKi8KKyNkZWZpbmUgRk1SMAkweDFBCS8qIEZyYW1lciBNb2RlIFJlaWdzdGVyIDAgKi8KKyNkZWZpbmUgRk1SMQkweDFCCS8qIEZyYW1lciBNb2RlIFJlaWdzdGVyIDEgKi8KKyNkZWZpbmUgRk1SMgkweDFDCS8qIEZyYW1lciBNb2RlIFJlaWdzdGVyIDIgKi8KKyNkZWZpbmUgTE9PUAkweDFECS8qIENoYW5uZWwgTG9vcCBCYWNrICovCisjZGVmaW5lIFhTVwkweDFFCS8qIFRyYW5zbWl0IFNlcnZpY2UgV29yZCAqLworI2RlZmluZSBGTVI0CTB4MUUJLyogRnJhbWVyIE1vZGUgUmVnIDQgKi8KKyNkZWZpbmUgWFNQCTB4MUYJLyogVHJhbnNtaXQgU3BhcmUgQml0cyAqLworI2RlZmluZSBGTVI1CTB4MUYJLyogRnJhbWVyIE1vZGUgUmVnIDUgKi8KKyNkZWZpbmUgWEMwCTB4MjAJLyogVHJhbnNtaXQgQ29udHJvbCAwICovCisjZGVmaW5lIFhDMQkweDIxCS8qIFRyYW5zbWl0IENvbnRyb2wgMSAqLworI2RlZmluZSBSQzAJMHgyMgkvKiBSZWNlaXZlIENvbnRyb2wgMCAqLworI2RlZmluZSBSQzEJMHgyMwkvKiBSZWNlaXZlIENvbnRyb2wgMSAqLworI2RlZmluZSBYUE0wCTB4MjQJLyogVHJhbnNtaXQgUHVsc2UgTWFzayAwICovCisjZGVmaW5lIFhQTTEJMHgyNQkvKiBUcmFuc21pdCBQdWxzZSBNYXNrIDEgKi8KKyNkZWZpbmUgWFBNMgkweDI2CS8qIFRyYW5zbWl0IFB1bHNlIE1hc2sgMiAqLworI2RlZmluZSBUU1dNCTB4MjcJLyogVHJhbnNwYXJlbnQgU2VydmljZSBXb3JkIE1hc2sgKi8KKyNkZWZpbmUgVEVTVDEJMHgyOAkvKiBNYW51Zi4gVGVzdCBSZWcgMSAqLworI2RlZmluZSBJRExFCTB4MjkJLyogSWRsZSBDaGFubmVsIENvZGUgKi8KKyNkZWZpbmUgWFNBNCAgICAweDJBCS8qIFRyYW5zbWl0IFNBNCBCaXQgUmVnICovCisjZGVmaW5lIFhETDEJMHgyQQkvKiBUcmFuc21pdCBETC1CaXQgUmVnIDIgKi8KKyNkZWZpbmUgWFNBNSAgICAweDJCCS8qIFRyYW5zbWl0IFNBNCBCaXQgUmVnICovCisjZGVmaW5lIFhETDIJMHgyQgkvKiBUcmFuc21pdCBETC1CaXQgUmVnIDIgKi8KKyNkZWZpbmUgWFNBNiAgICAweDJDCS8qIFRyYW5zbWl0IFNBNCBCaXQgUmVnICovCisjZGVmaW5lIFhETDMJMHgyQwkvKiBUcmFuc21pdCBETC1CaXQgUmVnIDIgKi8KKyNkZWZpbmUgWFNBNyAgICAweDJECS8qIFRyYW5zbWl0IFNBNCBCaXQgUmVnICovCisjZGVmaW5lIENDQjEJMHgyRAkvKiBDbGVhciBDaGFubmVsIFJlZyAxICovCisjZGVmaW5lIFhTQTggICAgMHgyRQkvKiBUcmFuc21pdCBTQTQgQml0IFJlZyAqLworI2RlZmluZSBDQ0IyCTB4MkUJLyogQ2xlYXIgQ2hhbm5lbCBSZWcgMiAqLworI2RlZmluZSBGTVIzCTB4MkYJLyogRnJhbWVyIE1vZGUgUmVnLiAzICovCisjZGVmaW5lIENDQjMJMHgyRgkvKiBDbGVhciBDaGFubmVsIFJlZyAzICovCisjZGVmaW5lIElDQjEJMHgzMAkvKiBJZGxlIENoYW5uZWwgUmVnIDEgKi8KKyNkZWZpbmUgSUNCMgkweDMxCS8qIElkbGUgQ2hhbm5lbCBSZWcgMiAqLworI2RlZmluZSBJQ0IzCTB4MzIJLyogSWRsZSBDaGFubmVsIFJlZyAzICovCisjZGVmaW5lIElDQjQJMHgzMwkvKiBJZGxlIENoYW5uZWwgUmVnIDQgKi8KKyNkZWZpbmUgTElNMAkweDM0CS8qIExpbmUgSW50ZXJmYWNlIE1vZGUgMCAqLworI2RlZmluZSBMSU0xCTB4MzUJLyogTGluZSBJbnRlcmZhY2UgTW9kZSAxICovCisjZGVmaW5lIFBDRFIJMHgzNgkvKiBQdWxzZSBDb3VudCBEZXRlY3Rpb24gKi8KKyNkZWZpbmUgUENSUgkweDM3CS8qIFB1bHNlIENvdW50IFJlY292ZXJ5ICovCisjZGVmaW5lIExJTTIJMHgzOAkvKiBMaW5lIEludGVyZmFjZSBNb2RlIFJlZyAyICovCisjZGVmaW5lIExDUjEJMHgzOQkvKiBMb29wIENvZGUgUmVnIDEgKi8KKyNkZWZpbmUgTENSMgkweDNBCS8qIExvb3AgQ29kZSBSZWcgMiAqLworI2RlZmluZSBMQ1IzCTB4M0IJLyogTG9vcCBDb2RlIFJlZyAzICovCisjZGVmaW5lIFNJQzEJMHgzQwkvKiBTeXN0ZW0gSW50ZXJmYWNlIENvbnRyb2wgMSAqLworCisvKiBSZWFkLW9ubHkgUmVnaXN0ZXJzIChFMS9UMSBjb250cm9sIG1vZGUgcmVhZCByZWdpc3RlcnMpICovCisjZGVmaW5lIFJGSUZPSAkweDAwCQkvKiBSZWNlaXZlIEZJRk8gKi8KKyNkZWZpbmUgUkZJRk9MCTB4MDEJCS8qIFJlY2VpdmUgRklGTyAqLworI2RlZmluZSBGUlMwCTB4NEMJCS8qIEZyYW1lciBSZWNlaXZlIFN0YXR1cyAwICovCisjZGVmaW5lIEZSUzEJMHg0RAkJLyogRnJhbWVyIFJlY2VpdmUgU3RhdHVzIDEgKi8KKyNkZWZpbmUgUlNXCTB4NEUJCS8qIFJlY2VpdmUgU2VydmljZSBXb3JkICovCisjZGVmaW5lIEZSUzIJMHg0RQkJLyogRnJhbWVyIFJlY2VpdmUgU3RhdHVzIDIgKi8KKyNkZWZpbmUgUlNQCTB4NEYJCS8qIFJlY2VpdmUgU3BhcmUgQml0cyAqLworI2RlZmluZSBGUlMzCTB4NEYJCS8qIEZyYW1lciBSZWNlaXZlIFN0YXR1cyAzICovCisjZGVmaW5lIEZFQ0wJMHg1MAkJLyogRnJhbWluZyBFcnJvciBDb3VudGVyICovCisjZGVmaW5lIEZFQ0gJMHg1MQkJLyogRnJhbWluZyBFcnJvciBDb3VudGVyICovCisjZGVmaW5lIENWQ0wJMHg1MgkJLyogQ29kZSBWaW9sYXRpb24gQ291bnRlciAqLworI2RlZmluZSBDVkNICTB4NTMJCS8qIENvZGUgVmlvbGF0aW9uIENvdW50ZXIgKi8KKyNkZWZpbmUgQ0VDTAkweDU0CQkvKiBDUkMgRXJyb3IgQ291bnRlciAxICovCisjZGVmaW5lIENFQ0gJMHg1NQkJLyogQ1JDIEVycm9yIENvdW50ZXIgMSAqLworI2RlZmluZSBFQkNMCTB4NTYJCS8qIEUtQml0IEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgRUJDSAkweDU3CQkvKiBFLUJpdCBFcnJvciBDb3VudGVyICovCisjZGVmaW5lIEJFQ0wJMHg1OAkJLyogQml0IEVycm9yIENvdW50ZXIgTG93ICovCisjZGVmaW5lIEJFQ0gJMHg1OQkJLyogQml0IEVycm9yIENvdW50ZXIgTG93ICovCisjZGVmaW5lIENFQzMJMHg1QQkJLyogQ1JDIEVycm9yIENvdW50ZXIgMyAoMTYtYml0KSAqLworI2RlZmluZSBSU0E0CTB4NUMJCS8qIFJlY2VpdmUgU0E0IEJpdCBSZWcgKi8KKyNkZWZpbmUgUkRMMQkweDVDCQkvKiBSZWNlaXZlIERMLUJpdCBSZWcgMSAqLworI2RlZmluZSBSU0E1CTB4NUQJCS8qIFJlY2VpdmUgU0E1IEJpdCBSZWcgKi8KKyNkZWZpbmUgUkRMMgkweDVECQkvKiBSZWNlaXZlIERMLUJpdCBSZWcgMiAqLworI2RlZmluZSBSU0E2CTB4NUUJCS8qIFJlY2VpdmUgU0E2IEJpdCBSZWcgKi8KKyNkZWZpbmUgUkRMMwkweDVFCQkvKiBSZWNlaXZlIERMLUJpdCBSZWcgMyAqLworI2RlZmluZSBSU0E3CTB4NUYJCS8qIFJlY2VpdmUgU0E3IEJpdCBSZWcgKi8KKyNkZWZpbmUgUlNBOAkweDYwCQkvKiBSZWNlaXZlIFNBOCBCaXQgUmVnICovCisjZGVmaW5lIFJTQTZTCTB4NjEJCS8qIFJlY2VpdmUgU0E2IEJpdCBTdGF0dXMgUmVnICovCisjZGVmaW5lIFRTUjAJMHg2MgkJLyogTWFudWYuIFRlc3QgUmVnIDAgKi8KKyNkZWZpbmUgVFNSMQkweDYzCQkvKiBNYW51Zi4gVGVzdCBSZWcgMSAqLworI2RlZmluZSBTSVMJMHg2NAkJLyogU2lnbmFsaW5nIFN0YXR1cyBSZWcgKi8KKyNkZWZpbmUgUlNJUwkweDY1CQkvKiBSZWNlaXZlIFNpZ25hbGluZyBTdGF0dXMgUmVnICovCisjZGVmaW5lIFJCQ0wJMHg2NgkJLyogUmVjZWl2ZSBCeXRlIENvbnRyb2wgKi8KKyNkZWZpbmUgUkJDSAkweDY3CQkvKiBSZWNlaXZlIEJ5dGUgQ29udHJvbCAqLworI2RlZmluZSBGSVNSMAkweDY4CQkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZyAwICovCisjZGVmaW5lIEZJU1IxCTB4NjkJCS8qIEludGVycnVwdCBTdGF0dXMgUmVnIDEgKi8KKyNkZWZpbmUgRklTUjIJMHg2QQkJLyogSW50ZXJydXB0IFN0YXR1cyBSZWcgMiAqLworI2RlZmluZSBGSVNSMwkweDZCCQkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZyAzICovCisjZGVmaW5lIEdJUwkweDZFCQkvKiBHbG9iYWwgSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSBWU1RSCTB4NkYJCS8qIFZlcnNpb24gU3RhdHVzICovCisjZGVmaW5lIFJTKG5icikJKDB4NzAgKyAobmJyKSkJLyogUnggQ0FTIFJlZyAoMCB0byAxNSkgKi8KKworI2VuZGlmCS8qIF9GQUxDX0xIX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjMzAwLmggYi9kcml2ZXJzL25ldC93YW4vcGMzMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzQwMWIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwLmgKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBwYzMwMC5oCUN5Y2xhZGVzLVBDMzAwKHRtKSBLZXJuZWwgQVBJIERlZmluaXRpb25zLgorICoKKyAqIEF1dGhvcjoJSXZhbiBQYXNzb3MgPGl2YW5AY3ljbGFkZXMuY29tPgorICoKKyAqIENvcHlyaWdodDoJKGMpIDE5OTktMjAwMiBDeWNsYWRlcyBDb3JwLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogJExvZzogcGMzMDAuaCx2ICQKKyAqIFJldmlzaW9uIDMuMTIgIDIwMDIvMDMvMDcgMTQ6MTc6MDkgIGhlbnJpcXVlCisgKiBMaWNlbnNlIGRhdGEgZml4ZWQKKyAqCisgKiBSZXZpc2lvbiAzLjExICAyMDAyLzAxLzI4IDIxOjA5OjM5ICBkYW5pZWxhCisgKiBJbmNsdWRlZCAnOycgYWZ0ZXIgcGMzMDBody5idXMuCisgKgorICogUmV2aXNpb24gMy4xMCAgMjAwMi8wMS8xNyAxNzo1ODo1MiAgaXZhbgorICogU3VwcG9ydCBmb3IgUEMzMDAtVEUvTSAoUE1DKS4KKyAqCisgKiBSZXZpc2lvbiAzLjkgIDIwMDEvMDkvMjggMTM6MzA6NTMgIGRhbmllbGEKKyAqIFJlbmFtZWQgZG1hX3N0YXJ0IHJvdXRpbmUgdG8gcnhfZG1hX3N0YXJ0LgorICoKKyAqIFJldmlzaW9uIDMuOCAgMjAwMS8wOS8yNCAxMzowMzo0NSAgZGFuaWVsYQorICogRml4ZWQgQk9GIGludGVycnVwdCB0cmVhdG1lbnQuIENyZWF0ZWQgZG1hX3N0YXJ0IHJvdXRpbmUuCisgKgorICogUmV2aXNpb24gMy43ICAyMDAxLzA4LzEwIDE3OjE5OjU4ICBkYW5pZWxhCisgKiBGaXhlZCBJT0NUTHMgZGVmaW5lcy4KKyAqCisgKiBSZXZpc2lvbiAzLjYgIDIwMDEvMDcvMTggMTk6MjQ6NDIgIGRhbmllbGEKKyAqIEluY2x1ZGVkIGtlcm5lbCB2ZXJzaW9uLgorICoKKyAqIFJldmlzaW9uIDMuNSAgMjAwMS8wNy8wNSAxODozODowOCAgZGFuaWVsYQorICogRE1BIHRyYW5zbWlzc2lvbiBidWcgZml4LgorICoKKyAqIFJldmlzaW9uIDMuNCAgMjAwMS8wNi8yNiAxNzoxMDo0MCAgZGFuaWVsYQorICogTmV3IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAobGluZSBjb2RlLCBDUkMgY2FsY3VsYXRpb24gYW5kIGNsb2NrKS4KKyAqCisgKiBSZXZpc2lvbiAzLjMgIDIwMDEvMDYvMjIgMTM6MTM6MDIgIHJlZ2luYQorICogTUxQUFAgaW1wbGVtZW50YXRpb24KKyAqCisgKiBSZXZpc2lvbiAzLjIgIDIwMDEvMDYvMTggMTc6NTY6MDkgIGRhbmllbGEKKyAqIEluY3JlYXNlZCBERUZfTVRVIGFuZCBUWF9RVUVVRV9MRU4uCisgKgorICogUmV2aXNpb24gMy4xICAyMDAxLzA2LzE1IDEyOjQxOjEwICByZWdpbmEKKyAqIHVwcGluZyBtYWpvciB2ZXJzaW9uIG51bWJlcgorICoKKyAqIFJldmlzaW9uIDEuMS4xLjEgIDIwMDEvMDYvMTMgMjA6MjU6MDYgIGRhbmllbGEKKyAqIFBDMzAwIGluaXRpYWwgQ1ZTIHZlcnNpb24gKDMuNC4wLXByZTEpCisgKgorICogUmV2aXNpb24gMi4zIDIwMDEvMDMvMDUgZGFuaWVsYQorICogQ3JlYXRlZCBzdHJ1Y3QgcGMzMDBjb25mLCB0byBwcm92aWRlIHRoZSBoYXJkd2FyZSBpbmZvcm1hdGlvbiB0byBwYzMwMHV0aWwuCisgKiBJbmNsdXNpb24gb2YgJ2FsbG9jX3JhbXNpemUnIGZpZWxkIG9uIHN0cnVjdHVyZSAncGMzMDBodycuCisgKiAKKyAqIFJldmlzaW9uIDIuMiAyMDAwLzEyLzIyIGRhbmllbGEKKyAqIFN0cnVjdHVyZXMgYW5kIGRlZmluZXMgdG8gc3VwcG9ydCBwYzMwMHV0aWw6IHN0YXRpc3RpY3MsIHN0YXR1cywgCisgKiBsb29wYmFjayB0ZXN0cywgdHJhY2UuCisgKiAKKyAqIFJldmlzaW9uIDIuMSAyMDAwLzA5LzI4IGl2YW4KKyAqIEluY2x1c2lvbiBvZiAnaW9waHlzJyBhbmQgJ2lvc2l6ZScgZmllbGRzIG9uIHN0cnVjdHVyZSAncGMzMDBodycsIHRvIAorICogYWxsb3cgcmVsZWFzZSBvZiBJL08gcmVnaW9uIGF0IG1vZHVsZSB1bmxvYWQuCisgKiBDaGFuZ2VkIGxvY2F0aW9uIG9mIGluY2x1ZGUgZmlsZXMuCisgKgorICogUmV2aXNpb24gMi4wIDIwMDAvMDMvMjcgaXZhbgorICogQWRkZWQgc3VwcG9ydCBmb3IgdGhlIFBDMzAwL1RFIGNhcmRzLgorICoKKyAqIFJldmlzaW9uIDEuMSAyMDAwLzAxLzMxIGl2YW4KKyAqIFJlcGxhY2VkICdwYzMwMFtkcnZ8c2NhXS5oJyBmb3JtZXIgUEMzMDAgZHJpdmVyIGluY2x1ZGUgZmlsZXMuCisgKgorICogUmV2aXNpb24gMS4wIDE5OTkvMTIvMTYgaXZhbgorICogRmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZS4KKyAqIEluY2x1c2lvbiBvZiAnbmNoYW4nIGZpZWxkIG9uIHN0cnVjdHVyZSAncGMzMDBodycsIHRvIGFsbG93IHZhcmlhYmxlIAorICogbnVtYmVyIG9mIHBvcnRzIHBlciBjYXJkLgorICogSW5jbHVzaW9uIG9mICdpZl9wdHInIGZpZWxkIG9uIHN0cnVjdHVyZSAncGMzMDBkZXYnLgorICoKKyAqIFJldmlzaW9uIDAuNiAxOTk5LzExLzE3IGl2YW4KKyAqIENoYW5nZWQgWC4yNS1zcGVjaWZpYyBmdW5jdGlvbiBuYW1lcyB0byBjb21wbHkgd2l0aCBhZG9wdGVkIGNvbnZlbnRpb24uCisgKgorICogUmV2aXNpb24gMC41IDE5OTkvMTEvMTYgRGFuaWVsYSBTcXVhc3NvbmkKKyAqIFguMjUgc3VwcG9ydC4KKyAqCisgKiBSZXZpc2lvbiAwLjQgMTk5OS8xMS8xNSBpdmFuCisgKiBJbmNsdXNpb24gb2YgJ2Nsb2NrJyBmaWVsZCBvbiBzdHJ1Y3R1cmUgJ3BjMzAwaHcnLgorICoKKyAqIFJldmlzaW9uIDAuMyAxOTk5LzExLzEwIGl2YW4KKyAqIElPQ1RMIG5hbWUgY2hhbmdpbmcuCisgKiBJbmNsdXNpb24gb2YgZHJpdmVyIGZ1bmN0aW9uIHByb3RvdHlwZXMuCisgKgorICogUmV2aXNpb24gMC4yIDE5OTkvMTEvMDMgaXZhbgorICogSW5jbHVzaW9uIG9mICd0eF9za2InIGFuZCB1bmlvbiAnaWZ1JyBvbiBzdHJ1Y3R1cmUgJ3BjMzAwZGV2Jy4KKyAqCisgKiBSZXZpc2lvbiAwLjEgMTk5OS8wMS8xNSBpdmFuCisgKiBJbml0aWFsIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYJX1BDMzAwX0gKKyNkZWZpbmUJX1BDMzAwX0gKKworI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKyNpbmNsdWRlICJoZDY0NTcyLmgiCisjaW5jbHVkZSAicGMzMDAtZmFsYy1saC5oIgorCisjaWZuZGVmIENZX1RZUEVTCisjZGVmaW5lIENZX1RZUEVTCit0eXBlZGVmCV9fdTY0CXVjZG91YmxlOwkvKiA2NCBiaXRzLCB1bnNpZ25lZCAqLwordHlwZWRlZglfX3UzMgl1Y2xvbmc7CQkvKiAzMiBiaXRzLCB1bnNpZ25lZCAqLwordHlwZWRlZglfX3UxNgl1Y3Nob3J0OwkvKiAxNiBiaXRzLCB1bnNpZ25lZCAqLwordHlwZWRlZglfX3U4CXVjY2hhcjsJCS8qIDggYml0cywgdW5zaWduZWQgKi8KKyNlbmRpZiAvKiBDWV9UWVBFUyAqLworCisjZGVmaW5lIFBDMzAwX1BST1RPX01MUFBQIDEJCQorCisjZGVmaW5lIFBDMzAwX0tFUk5FTAkiMi40LngiCS8qIEtlcm5lbCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKi8KKworI2RlZmluZQlQQzMwMF9ERVZOQU1FCSJoZGxjIgkvKiBEZXYuIG5hbWUgYmFzZSAoZm9yIGhkbGMwLCBoZGxjMSwgZXRjLikgKi8KKyNkZWZpbmUgUEMzMDBfTUFYSU5ERVgJMTAwCS8qIE1heCBkZXYuIG5hbWUgaW5kZXggKHRoZSAnMCcgaW4gaGRsYzApICovCisKKyNkZWZpbmUJUEMzMDBfTUFYQ0FSRFMJNAkvKiBNYXggbnVtYmVyIG9mIGNhcmRzIHBlciBzeXN0ZW0gKi8KKyNkZWZpbmUJUEMzMDBfTUFYQ0hBTgkyCS8qIE51bWJlciBvZiBjaGFubmVscyBwZXIgY2FyZCAqLworCisjZGVmaW5lCVBDMzAwX1BMWF9XSU4JMHg4MCAgICAvKiBQTFggY29udHJvbCB3aW5kb3cgc2l6ZSAoMTI4YikgKi8KKyNkZWZpbmUJUEMzMDBfUkFNU0laRQkweDQwMDAwIC8qIFJBTSB3aW5kb3cgc2l6ZSAoMjU2S2IpICovCisjZGVmaW5lCVBDMzAwX1NDQVNJWkUJMHg0MDAgICAvKiBTQ0Egd2luZG93IHNpemUgKDFLYikgKi8KKyNkZWZpbmUJUEMzMDBfRkFMQ1NJWkUJMHg0MDAJLyogRkFMQyB3aW5kb3cgc2l6ZSAoMUtiKSAqLworCisjZGVmaW5lIFBDMzAwX09TQ19DTE9DSwkyNDU3NjAwMAorI2RlZmluZSBQQzMwMF9QQ0lfQ0xPQ0sJMzMwMDAwMDAKKworI2RlZmluZSBCRF9ERUZfTEVOCTB4MDgwMAkvKiBETUEgYnVmZmVyIGxlbmd0aCAoMktCKSAqLworI2RlZmluZSBETUFfVFhfTUVNU1oJMHg4MDAwCS8qIFRvdGFsIERNQSBUeCBtZW1vcnkgc2l6ZSAoMzJLQi9jaCkgKi8KKyNkZWZpbmUgRE1BX1JYX01FTVNaCTB4MTAwMDAJLyogVG90YWwgRE1BIFJ4IG1lbW9yeSBzaXplICg2NEtCL2NoKSAqLworCisjZGVmaW5lIE5fRE1BX1RYX0JVRgkoRE1BX1RYX01FTVNaIC8gQkRfREVGX0xFTikJLyogRE1BIFR4IGJ1ZmZlcnMgKi8KKyNkZWZpbmUgTl9ETUFfUlhfQlVGCShETUFfUlhfTUVNU1ogLyBCRF9ERUZfTEVOKQkvKiBETUEgUnggYnVmZmVycyAqLworCisvKiBETUEgQnVmZmVyIE9mZnNldHMgKi8KKyNkZWZpbmUgRE1BX1RYX0JBU0UJKChOX0RNQV9UWF9CVUYgKyBOX0RNQV9SWF9CVUYpICoJXAorCQkJIFBDMzAwX01BWENIQU4gKiBzaXplb2YocGNzY2FfYmRfdCkpCisjZGVmaW5lIERNQV9SWF9CQVNFCShETUFfVFhfQkFTRSArIFBDMzAwX01BWENIQU4qRE1BX1RYX01FTVNaKQorCisvKiBETUEgRGVzY3JpcHRvciBPZmZzZXRzICovCisjZGVmaW5lIERNQV9UWF9CRF9CQVNFCTB4MDAwMAorI2RlZmluZSBETUFfUlhfQkRfQkFTRQkoRE1BX1RYX0JEX0JBU0UgKyAoKFBDMzAwX01BWENIQU4qRE1BX1RYX01FTVNaIC8gXAorCQkJCUJEX0RFRl9MRU4pICogc2l6ZW9mKHBjc2NhX2JkX3QpKSkKKworLyogRE1BIERlc2NyaXB0b3IgTWFjcm9zICovCisjZGVmaW5lIFRYX0JEX0FERFIoY2hhbiwgbikJKERNQV9UWF9CRF9CQVNFICsgXAorCQkJCSAoKE5fRE1BX1RYX0JVRipjaGFuKSArIG4pICogc2l6ZW9mKHBjc2NhX2JkX3QpKQorI2RlZmluZSBSWF9CRF9BRERSKGNoYW4sIG4pCShETUFfUlhfQkRfQkFTRSArIFwKKwkJCQkgKChOX0RNQV9SWF9CVUYqY2hhbikgKyBuKSAqIHNpemVvZihwY3NjYV9iZF90KSkKKworLyogTWFjcm8gdG8gYWNjZXNzIHRoZSBGQUxDIHJlZ2lzdGVycyAoVEUgb25seSkgKi8KKyNkZWZpbmUgRl9SRUcocmVnLCBjaGFuKQkoMHgyMDAqKGNoYW4pICsgKChyZWcpPDwyKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWVtb3J5IGFjY2VzcyBmdW5jdGlvbnMvbWFjcm9zICAgICAgKgorICogKHJlcXVpcmVkIHRvIHN1cHBvcnQgQWxwaGEgc3lzdGVtcykgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIGNwY193cml0ZWIocG9ydCx2YWwpCXt3cml0ZWIoKHVjY2hhcikodmFsKSwocG9ydCkpOyBtYigpO30KKyNkZWZpbmUgY3BjX3dyaXRldyhwb3J0LHZhbCkJe3dyaXRldygodXNob3J0KSh2YWwpLChwb3J0KSk7IG1iKCk7fQorI2RlZmluZSBjcGNfd3JpdGVsKHBvcnQsdmFsKQl7d3JpdGVsKCh1Y2xvbmcpKHZhbCksKHBvcnQpKTsgbWIoKTt9CisKKyNkZWZpbmUgY3BjX3JlYWRiKHBvcnQpCQlyZWFkYihwb3J0KQorI2RlZmluZSBjcGNfcmVhZHcocG9ydCkJCXJlYWR3KHBvcnQpCisjZGVmaW5lIGNwY19yZWFkbChwb3J0KQkJcmVhZGwocG9ydCkKKworI2Vsc2UgLyogX19LRVJORUxfXyAqLworI2RlZmluZSBjcGNfd3JpdGViKHBvcnQsdmFsKQkoKih2b2xhdGlsZSB1Y2NoYXIgKikocG9ydCkgPSAodWNjaGFyKSh2YWwpKQorI2RlZmluZSBjcGNfd3JpdGV3KHBvcnQsdmFsKQkoKih2b2xhdGlsZSB1Y3Nob3J0ICopKHBvcnQpID0gKHVjc2hvcnQpKHZhbCkpCisjZGVmaW5lIGNwY193cml0ZWwocG9ydCx2YWwpCSgqKHZvbGF0aWxlIHVjbG9uZyAqKShwb3J0KSA9ICh1Y2xvbmcpKHZhbCkpCisKKyNkZWZpbmUgY3BjX3JlYWRiKHBvcnQpCQkoKih2b2xhdGlsZSB1Y2NoYXIgKikocG9ydCkpCisjZGVmaW5lIGNwY19yZWFkdyhwb3J0KQkJKCoodm9sYXRpbGUgdWNzaG9ydCAqKShwb3J0KSkKKyNkZWZpbmUgY3BjX3JlYWRsKHBvcnQpCQkoKih2b2xhdGlsZSB1Y2xvbmcgKikocG9ydCkpCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKy8qKioqKiogRGF0YSBTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogICAgICBSVU5USU1FXzkwNTAgLSBQTFggUENJOTA1MC0xIGxvY2FsIGNvbmZpZ3VyYXRpb24gYW5kIHNoYXJlZCBydW50aW1lCisgKiAgICAgIHJlZ2lzdGVycy4gVGhpcyBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSA5MDUwIHJlZ2lzdGVycworICogICAgICAobWVtb3J5IG1hcHBlZCkuCisgKi8KK3N0cnVjdCBSVU5USU1FXzkwNTAgeworCXVjbG9uZwlsb2NfYWRkcl9yYW5nZVs0XTsJLyogMDAtMENoIDogTG9jYWwgQWRkcmVzcyBSYW5nZXMgKi8KKwl1Y2xvbmcJbG9jX3JvbV9yYW5nZTsJCS8qIDEwaCA6IExvY2FsIFJPTSBSYW5nZSAqLworCXVjbG9uZwlsb2NfYWRkcl9iYXNlWzRdOwkvKiAxNC0yMGggOiBMb2NhbCBBZGRyZXNzIEJhc2UgQWRkcnMgKi8KKwl1Y2xvbmcJbG9jX3JvbV9iYXNlOwkJLyogMjRoIDogTG9jYWwgUk9NIEJhc2UgKi8KKwl1Y2xvbmcJbG9jX2J1c19kZXNjcls0XTsJLyogMjgtMzRoIDogTG9jYWwgQnVzIERlc2NyaXB0b3JzICovCisJdWNsb25nCXJvbV9idXNfZGVzY3I7CQkvKiAzOGggOiBST00gQnVzIERlc2NyaXB0b3IgKi8KKwl1Y2xvbmcJY3NfYmFzZVs0XTsJCS8qIDNDLTQ4aCA6IENoaXAgU2VsZWN0IEJhc2UgQWRkcnMgKi8KKwl1Y2xvbmcJaW50cl9jdHJsX3N0YXQ7CQkvKiA0Q2ggOiBJbnRlcnJ1cHQgQ29udHJvbC9TdGF0dXMgKi8KKwl1Y2xvbmcJaW5pdF9jdHJsOwkJLyogNTBoIDogRUVQUk9NIGN0cmwsIEluaXQgQ3RybCwgZXRjICovCit9OworCisjZGVmaW5lIFBMWF85MDUwX0xJTlQxX0VOQUJMRQkweDAxCisjZGVmaW5lIFBMWF85MDUwX0xJTlQxX1BPTAkweDAyCisjZGVmaW5lIFBMWF85MDUwX0xJTlQxX1NUQVRVUwkweDA0CisjZGVmaW5lIFBMWF85MDUwX0xJTlQyX0VOQUJMRQkweDA4CisjZGVmaW5lIFBMWF85MDUwX0xJTlQyX1BPTAkweDEwCisjZGVmaW5lIFBMWF85MDUwX0xJTlQyX1NUQVRVUwkweDIwCisjZGVmaW5lIFBMWF85MDUwX0lOVFJfRU5BQkxFCTB4NDAKKyNkZWZpbmUgUExYXzkwNTBfU1dfSU5UUgkweDgwCisKKy8qIE1hc2tzIHRvIGFjY2VzcyB0aGUgaW5pdF9jdHJsIFBMWCByZWdpc3RlciAqLworI2RlZmluZQlQQzMwMF9DTEtTRUxfTUFTSwkJKDB4MDAwMDAwMDRVTCkKKyNkZWZpbmUJUEMzMDBfQ0hNRURJQV9NQVNLKGNoYW4pCSgweDAwMDAwMDIwVUw8PChjaGFuKjMpKQorI2RlZmluZQlQQzMwMF9DVFlQRV9NQVNLCQkoMHgwMDAwMDgwMFVMKQorCisvKiBDUExEIFJlZ2lzdGVycyAoYmFzZSBhZGRyID0gZmFsY2Jhc2UsIFRFIG9ubHkpICovCisvKiBDUExEIHYuIDAgKi8KKyNkZWZpbmUgQ1BMRF9SRUcxCTB4MTQwCS8qIENoaXAgcmVzZXRzLCBEQ0QvQ1RTIHN0YXR1cyAqLworI2RlZmluZSBDUExEX1JFRzIJMHgxNDQJLyogQ2xvY2sgZW5hYmxlICwgTEVEIGNvbnRyb2wgKi8KKy8qIENQTEQgdi4gMiBvciBoaWdoZXIgKi8KKyNkZWZpbmUgQ1BMRF9WMl9SRUcxCTB4MTAwCS8qIENoaXAgcmVzZXRzLCBEQ0QvQ1RTIHN0YXR1cyAqLworI2RlZmluZSBDUExEX1YyX1JFRzIJMHgxMDQJLyogQ2xvY2sgZW5hYmxlICwgTEVEIGNvbnRyb2wgKi8KKyNkZWZpbmUgQ1BMRF9JRF9SRUcJMHgxMDgJLyogQ1BMRCB2ZXJzaW9uICovCisKKy8qIENQTEQgUmVnaXN0ZXIgYml0IGRlc2NyaXB0aW9uOiBmb3IgdGhlIEZBTEMgYml0cywgdGhleSBzaG91bGQgYWx3YXlzIGJlIAorICAgc2V0IGJhc2VkIG9uIHRoZSBjaGFubmVsICh1c2UgKGJpdDw8KDIqY2gpKSB0byBhY2Nlc3MgdGhlIGNvcnJlY3QgYml0IGZvciAKKyAgIHRoYXQgY2hhbm5lbCkgKi8KKyNkZWZpbmUgQ1BMRF9SRUcxX0ZBTENfUkVTRVQJMHgwMQorI2RlZmluZSBDUExEX1JFRzFfU0NBX1JFU0VUCTB4MDIKKyNkZWZpbmUgQ1BMRF9SRUcxX0dMT0JBTF9DTEsJMHgwOAorI2RlZmluZSBDUExEX1JFRzFfRkFMQ19EQ0QJMHgxMAorI2RlZmluZSBDUExEX1JFRzFfRkFMQ19DVFMJMHgyMAorCisjZGVmaW5lIENQTERfUkVHMl9GQUxDX1RYX0NMSwkweDAxCisjZGVmaW5lIENQTERfUkVHMl9GQUxDX1JYX0NMSwkweDAyCisjZGVmaW5lIENQTERfUkVHMl9GQUxDX0xFRDEJMHgxMAorI2RlZmluZSBDUExEX1JFRzJfRkFMQ19MRUQyCTB4MjAKKworLyogU3RydWN0dXJlIHdpdGggRkFMQy1yZWxhdGVkIGZpZWxkcyAoVEUgb25seSkgKi8KKyNkZWZpbmUgUEMzMDBfRkFMQ19NQVhMT09QCTB4MDAwMGZmZmYJLyogZm9yIGZhbGNfaXNzdWVfY21kKCkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZmFsYyB7CisJdWNjaGFyIHN5bmM7CQkvKiBJZiB0cnVlIEZBTEMgaXMgc3luY2hyb25pemVkICovCisJdWNjaGFyIGFjdGl2ZTsJCS8qIGlmIFRSVUUgdGhlbiBhbHJlYWR5IGFjdGl2ZSAqLworCXVjY2hhciBsb29wX2FjdGl2ZTsJLyogaWYgVFJVRSBhIGxpbmUgbG9vcGJhY2sgVVAgd2FzIHJlY2VpdmVkICovCisJdWNjaGFyIGxvb3BfZ2VuOwkvKiBpZiBUUlVFIGEgbGluZSBsb29wYmFjayBVUCB3YXMgaXNzdWVkICovCisKKwl1Y2NoYXIgbnVtX2NoYW5uZWxzOworCXVjY2hhciBvZmZzZXQ7CQkvKiAxIGZvciBUMSwgMCBmb3IgRTEgKi8KKwl1Y2NoYXIgZnVsbF9iYW5kd2lkdGg7CisKKwl1Y2NoYXIgeG1iX2NhdXNlOworCXVjY2hhciBtdWx0aWZyYW1lX21vZGU7CisKKwkvKiBTdGF0aXN0aWNzICovCisJdWNzaG9ydCBwZGVuOwkvKiBQdWxzZSBEZW5zaXR5IHZpb2xhdGlvbiBjb3VudCAqLworCXVjc2hvcnQgbG9zOwkvKiBMb3NzIG9mIFNpZ25hbCBjb3VudCAqLworCXVjc2hvcnQgbG9zcjsJLyogTG9zcyBvZiBTaWduYWwgcmVjb3ZlcnkgY291bnQgKi8KKwl1Y3Nob3J0IGxmYTsJLyogTG9zcyBvZiBmcmFtZSBhbGlnbm1lbnQgY291bnQgKi8KKwl1Y3Nob3J0IGZhcmVjOwkvKiBGcmFtZSBBbGlnbm1lbnQgUmVjb3ZlcnkgY291bnQgKi8KKwl1Y3Nob3J0IGxtZmE7CS8qIExvc3Mgb2YgbXVsdGlmcmFtZSBhbGlnbm1lbnQgY291bnQgKi8KKwl1Y3Nob3J0IGFpczsJLyogUmVtb3RlIEFsYXJtIGluZGljYXRpb24gU2lnbmFsIGNvdW50ICovCisJdWNzaG9ydCBzZWM7CS8qIE9uZS1zZWNvbmQgdGltZXIgKi8KKwl1Y3Nob3J0IGVzOwkvKiBFcnJvcmVkIHNlY29uZCAqLworCXVjc2hvcnQgcmFpOwkvKiByZW1vdGUgYWxhcm0gcmVjZWl2ZWQgKi8KKwl1Y3Nob3J0IGJlYzsKKwl1Y3Nob3J0IGZlYzsKKwl1Y3Nob3J0IGN2YzsKKwl1Y3Nob3J0IGNlYzsKKwl1Y3Nob3J0IGViYzsKKworCS8qIFN0YXR1cyAqLworCXVjY2hhciByZWRfYWxhcm07CisJdWNjaGFyIGJsdWVfYWxhcm07CisJdWNjaGFyIGxvc3NfZmE7CisJdWNjaGFyIHllbGxvd19hbGFybTsKKwl1Y2NoYXIgbG9zc19tZmE7CisJdWNjaGFyIHByYnM7Cit9IGZhbGNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZmFsY19zdGF0dXMgeworCXVjY2hhciBzeW5jOyAgLyogSWYgdHJ1ZSBGQUxDIGlzIHN5bmNocm9uaXplZCAqLworCXVjY2hhciByZWRfYWxhcm07CisJdWNjaGFyIGJsdWVfYWxhcm07CisJdWNjaGFyIGxvc3NfZmE7CisJdWNjaGFyIHllbGxvd19hbGFybTsKKwl1Y2NoYXIgbG9zc19tZmE7CisJdWNjaGFyIHByYnM7Cit9IGZhbGNfc3RhdHVzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHJzdl94MjFfc3RhdHVzIHsKKwl1Y2NoYXIgZGNkOworCXVjY2hhciBkc3I7CisJdWNjaGFyIGN0czsKKwl1Y2NoYXIgcnRzOworCXVjY2hhciBkdHI7Cit9IHJzdl94MjFfc3RhdHVzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHBjMzAwc3RhdHMgeworCWludCBod190eXBlOworCXVjbG9uZyBsaW5lX29uOworCXVjbG9uZyBsaW5lX29mZjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBnZW5fc3RhdHM7CisJZmFsY190IHRlX3N0YXRzOworfSBwYzMwMHN0YXRzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHBjMzAwc3RhdHVzIHsKKwlpbnQgaHdfdHlwZTsKKwlyc3ZfeDIxX3N0YXR1c190IGdlbl9zdGF0dXM7CisJZmFsY19zdGF0dXNfdCB0ZV9zdGF0dXM7Cit9IHBjMzAwc3RhdHVzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHBjMzAwbG9vcGJhY2sgeworCWNoYXIgbG9vcF90eXBlOworCWNoYXIgbG9vcF9vbjsKK30gcGMzMDBsb29wYmFja190OworCit0eXBlZGVmIHN0cnVjdCBwYzMwMHBhdHRlcm50c3QgeworCWNoYXIgcGF0cm50c3Rfb247ICAgICAgIC8qIDAgLSBvZmY7IDEgLSBvbjsgMiAtIHJlYWQgbnVtX2Vycm9ycyAqLworCXVjc2hvcnQgbnVtX2Vycm9yczsKK30gcGMzMDBwYXR0ZXJudHN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHBjMzAwZGV2IHsKKwl2b2lkICppZl9wdHI7CQkvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlciAqLworCXN0cnVjdCBwYzMwMGNoICpjaGFuOworCXVjY2hhciB0cmFjZV9vbjsKKwl1Y2xvbmcgbGluZV9vbjsJCS8qIERDRChYLjIxLCBSU1YpIC8gc3luYyhURSkgY2hhbmdlIGNvdW50ZXJzICovCisJdWNsb25nIGxpbmVfb2ZmOworI2lmZGVmIF9fS0VSTkVMX18KKwljaGFyIG5hbWVbMTZdOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwl2b2lkICpwcml2YXRlOworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisJdW5pb24gewkvKiBUaGlzIHVuaW9uIGhhcyBhbGwgdGhlIHByb3RvY29sLXNwZWNpZmljIHN0cnVjdHVyZXMgKi8KKwkJc3RydWN0IHBwcF9kZXZpY2UgcHBwZGV2OworCX1pZnU7CisjaWZkZWYgQ09ORklHX1BDMzAwX01MUFBQCisJdm9pZCAqY3BjX3R0eTsJLyogaW5mb3JtYXRpb24gdG8gUEMzMDAgVFRZIGRyaXZlciAqLworI2VuZGlmCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworfXBjMzAwZGV2X3Q7CisKK3R5cGVkZWYgc3RydWN0IHBjMzAwaHcgeworCWludCB0eXBlOwkJLyogUlNWLCBYMjEsIGV0Yy4gKi8KKwlpbnQgYnVzOwkJLyogQnVzIChQQ0ksIFBNQywgZXRjLikgKi8KKwlpbnQgbmNoYW47CQkvKiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKwlpbnQgaXJxOwkJLyogaW50ZXJydXB0IHJlcXVlc3QgbGV2ZWwgKi8KKwl1Y2xvbmcgY2xvY2s7CQkvKiBCb2FyZCBjbG9jayAqLworCXVjY2hhciBjcGxkX2lkOwkJLyogQ1BMRCBJRCAoVEUgb25seSkgKi8KKwl1Y3Nob3J0IGNwbGRfcmVnMTsJLyogQ1BMRCByZWcgMSAoVEUgb25seSkgKi8KKwl1Y3Nob3J0IGNwbGRfcmVnMjsJLyogQ1BMRCByZWcgMiAoVEUgb25seSkgKi8KKwl1Y3Nob3J0IGdwaW9jX3JlZzsJLyogUExYIEdQSU9DIHJlZyAqLworCXVjc2hvcnQgaW50Y3RsX3JlZzsJLyogUExYIEludCBDdHJsL1N0YXR1cyByZWcgKi8KKwl1Y2xvbmcgaW9waHlzOwkJLyogUExYIHJlZ2lzdGVycyBJL08gYmFzZSAqLworCXVjbG9uZyBpb3NpemU7CQkvKiBQTFggcmVnaXN0ZXJzIEkvTyBzaXplICovCisJdWNsb25nIHBseHBoeXM7CQkvKiBQTFggcmVnaXN0ZXJzIE1NSU8gYmFzZSAocGh5c2ljYWwpICovCisJdm9pZCBfX2lvbWVtICogcGx4YmFzZTsJLyogUExYIHJlZ2lzdGVycyBNTUlPIGJhc2UgKHZpcnR1YWwpICovCisJdWNsb25nIHBseHNpemU7CQkvKiBQTFggcmVnaXN0ZXJzIE1NSU8gc2l6ZSAqLworCXVjbG9uZyBzY2FwaHlzOwkJLyogU0NBIHJlZ2lzdGVycyBNTUlPIGJhc2UgKHBoeXNpY2FsKSAqLworCXZvaWQgX19pb21lbSAqIHNjYWJhc2U7CS8qIFNDQSByZWdpc3RlcnMgTU1JTyBiYXNlICh2aXJ0dWFsKSAqLworCXVjbG9uZyBzY2FzaXplOwkJLyogU0NBIHJlZ2lzdGVycyBNTUlPIHNpemUgKi8KKwl1Y2xvbmcgcmFtcGh5czsJCS8qIE9uLWJvYXJkIFJBTSBNTUlPIGJhc2UgKHBoeXNpY2FsKSAqLworCXZvaWQgX19pb21lbSAqIHJhbWJhc2U7CS8qIE9uLWJvYXJkIFJBTSBNTUlPIGJhc2UgKHZpcnR1YWwpICovCisJdWNsb25nIGFsbG9jX3JhbXNpemU7CS8qIFJBTSBNTUlPIHNpemUgYWxsb2NhdGVkIGJ5IHRoZSBQQ0kgYnJpZGdlICovCisJdWNsb25nIHJhbXNpemU7CQkvKiBPbi1ib2FyZCBSQU0gTU1JTyBzaXplICovCisJdWNsb25nIGZhbGNwaHlzOwkvKiBGQUxDIHJlZ2lzdGVycyBNTUlPIGJhc2UgKHBoeXNpY2FsKSAqLworCXZvaWQgX19pb21lbSAqIGZhbGNiYXNlOy8qIEZBTEMgcmVnaXN0ZXJzIE1NSU8gYmFzZSAodmlydHVhbCkgKi8KKwl1Y2xvbmcgZmFsY3NpemU7CS8qIEZBTEMgcmVnaXN0ZXJzIE1NSU8gc2l6ZSAqLworfSBwYzMwMGh3X3Q7CisKK3R5cGVkZWYgc3RydWN0IHBjMzAwY2hjb25mIHsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncwlwaHlzX3NldHRpbmdzOwkvKiBDbG9jayB0eXBlL3JhdGUgKGluIGJwcyksIAorCQkJCQkJICAgbG9vcGJhY2sgbW9kZSAqLworCXJhd19oZGxjX3Byb3RvCQlwcm90b19zZXR0aW5nczsJLyogRW5jb2RpbmcsIHBhcml0eSAoQ1JDKSAqLworCXVjbG9uZyBtZWRpYTsJCS8qIEhXIG1lZGlhIChSUzIzMiwgVi4zNSwgZXRjLikgKi8KKwl1Y2xvbmcgcHJvdG87CQkvKiBQcm90b2NvbCAoUFBQLCBYLjI1LCBldGMuKSAqLworCXVjY2hhciBtb25pdG9yOwkJLyogTW9uaXRvciBtb2RlICgwID0gb2ZmLCAhMCA9IG9uKSAqLworCisJLyogVEUtc3BlY2lmaWMgcGFyYW1ldGVycyAqLworCXVjY2hhciBsY29kZTsJCS8qIExpbmUgQ29kZSAoQU1JLCBCOFpTLCBldGMuKSAqLworCXVjY2hhciBmcl9tb2RlOwkJLyogRnJhbWUgTW9kZSAoRVNGLCBENCwgZXRjLikgKi8KKwl1Y2NoYXIgbGJvOwkJLyogTGluZSBCdWlsZCBPdXQgKi8KKwl1Y2NoYXIgcnhfc2VuczsJCS8qIFJ4IFNlbnNpdGl2aXR5IChsb25nLSBvciBzaG9ydC1oYXVsKSAqLworCXVjbG9uZyB0c2xvdF9iaXRtYXA7CS8qIGJpdFtpXT0xICA9PiAgdGltZXNsb3QgX2lfIGlzIGFjdGl2ZSAqLworfSBwYzMwMGNoY29uZl90OworCit0eXBlZGVmIHN0cnVjdCBwYzMwMGNoIHsKKwlzdHJ1Y3QgcGMzMDAgKmNhcmQ7CisJaW50IGNoYW5uZWw7CisJcGMzMDBkZXZfdCBkOworCXBjMzAwY2hjb25mX3QgY29uZjsKKwl1Y2NoYXIgdHhfZmlyc3RfYmQ7CS8qIEZpcnN0IFRYIERNQSBibG9jayBkZXNjci4gdy8gZGF0YSAqLworCXVjY2hhciB0eF9uZXh0X2JkOwkvKiBOZXh0IGZyZWUgVFggRE1BIGJsb2NrIGRlc2NyaXB0b3IgKi8KKwl1Y2NoYXIgcnhfZmlyc3RfYmQ7CS8qIEZpcnN0IGZyZWUgUlggRE1BIGJsb2NrIGRlc2NyaXB0b3IgKi8KKwl1Y2NoYXIgcnhfbGFzdF9iZDsJLyogTGFzdCBmcmVlIFJYIERNQSBibG9jayBkZXNjcmlwdG9yICovCisJdWNjaGFyIG5mcmVlX3R4X2JkOwkvKiBOdW1iZXIgb2YgZnJlZSBUWCBETUEgYmxvY2sgZGVzY3JpcHRvcnMgKi8KKwlmYWxjX3QgZmFsYzsJCS8qIEZBTEMgc3RydWN0dXJlIChURSBvbmx5KSAqLworfSBwYzMwMGNoX3Q7CisKK3R5cGVkZWYgc3RydWN0IHBjMzAwIHsKKwlwYzMwMGh3X3QgaHc7CQkJLyogaGFyZHdhcmUgY29uZmlnLiAqLworCXBjMzAwY2hfdCBjaGFuW1BDMzAwX01BWENIQU5dOworI2lmZGVmIF9fS0VSTkVMX18KKwlzcGlubG9ja190IGNhcmRfbG9jazsKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCit9IHBjMzAwX3Q7CisKK3R5cGVkZWYgc3RydWN0IHBjMzAwY29uZiB7CisJcGMzMDBod190IGh3OworCXBjMzAwY2hjb25mX3QgY29uZjsKK30gcGMzMDBjb25mX3Q7CisKKy8qIERFViBpb2N0bCgpIGNvbW1hbmRzICovCisjZGVmaW5lCU5fU1BQUF9JT0NUTFMJMgorCitlbnVtIHBjMzAwX2lvY3RsX2NtZHMgeworCVNJT0NDUENSRVNFUlZFRCA9IChTSU9DREVWUFJJVkFURSArIE5fU1BQUF9JT0NUTFMpLAorCVNJT0NHUEMzMDBDT05GLAorCVNJT0NTUEMzMDBDT05GLAorCVNJT0NHUEMzMDBTVEFUVVMsCisJU0lPQ0dQQzMwMEZBTENTVEFUVVMsCisJU0lPQ0dQQzMwMFVUSUxTVEFUUywKKwlTSU9DR1BDMzAwVVRJTFNUQVRVUywKKwlTSU9DU1BDMzAwVFJBQ0UsCisJU0lPQ1NQQzMwMExPT1BCQUNLLAorCVNJT0NTUEMzMDBQQVRURVJOVEVTVCwKK307CisKKy8qIExvb3BiYWNrIHR5cGVzIC0gUEMzMDAvVEUgYm9hcmRzICovCitlbnVtIHBjMzAwX2xvb3BiYWNrX2NtZHMgeworCVBDMzAwTE9DTE9PUCA9IDEsCisJUEMzMDBSRU1MT09QLAorCVBDMzAwUEFZTE9BRExPT1AsCisJUEMzMDBHRU5MT09QVVAsCisJUEMzMDBHRU5MT09QRE9XTiwKK307CisKKy8qIENvbnRyb2wgQ29uc3RhbnQgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJUEMzMDBfUlNWCTB4MDEKKyNkZWZpbmUJUEMzMDBfWDIxCTB4MDIKKyNkZWZpbmUJUEMzMDBfVEUJMHgwMworCisjZGVmaW5lCVBDMzAwX1BDSQkweDAwCisjZGVmaW5lCVBDMzAwX1BNQwkweDAxCisKKyNkZWZpbmUgUEMzMDBfTENfQU1JCTB4MDEKKyNkZWZpbmUgUEMzMDBfTENfQjhaUwkweDAyCisjZGVmaW5lIFBDMzAwX0xDX05SWgkweDAzCisjZGVmaW5lIFBDMzAwX0xDX0hEQjMJMHgwNAorCisvKiBGcmFtaW5nIChUMSkgKi8KKyNkZWZpbmUgUEMzMDBfRlJfRVNGCQkweDAxCisjZGVmaW5lIFBDMzAwX0ZSX0Q0CQkweDAyCisjZGVmaW5lIFBDMzAwX0ZSX0VTRl9KQVBBTgkweDAzCisKKy8qIEZyYW1pbmcgKEUxKSAqLworI2RlZmluZSBQQzMwMF9GUl9NRl9DUkM0CTB4MDQKKyNkZWZpbmUgUEMzMDBfRlJfTUZfTk9OX0NSQzQJMHgwNQorI2RlZmluZSBQQzMwMF9GUl9VTkZSQU1FRAkweDA2CisKKyNkZWZpbmUgUEMzMDBfTEJPXzBfREIJCTB4MDAKKyNkZWZpbmUgUEMzMDBfTEJPXzdfNV9EQgkweDAxCisjZGVmaW5lIFBDMzAwX0xCT18xNV9EQgkJMHgwMgorI2RlZmluZSBQQzMwMF9MQk9fMjJfNV9EQgkweDAzCisKKyNkZWZpbmUgUEMzMDBfUlhfU0VOU19TSAkweDAxCisjZGVmaW5lIFBDMzAwX1JYX1NFTlNfTEgJMHgwMgorCisjZGVmaW5lIFBDMzAwX1RYX1RJTUVPVVQJKDIqSFopCisjZGVmaW5lIFBDMzAwX1RYX1FVRVVFX0xFTgkxMDAKKyNkZWZpbmUJUEMzMDBfREVGX01UVQkJMTYwMAorCisjaWZkZWYgX19LRVJORUxfXworLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLworaW50IGRtYV9idWZfd3JpdGUocGMzMDBfdCAqLCBpbnQsIHVjY2hhciAqLCBpbnQpOworaW50IGRtYV9idWZfcmVhZChwYzMwMF90ICosIGludCwgc3RydWN0IHNrX2J1ZmYgKik7Cit2b2lkIHR4X2RtYV9zdGFydChwYzMwMF90ICosIGludCk7Cit2b2lkIHJ4X2RtYV9zdGFydChwYzMwMF90ICosIGludCk7Cit2b2lkIHR4X2RtYV9zdG9wKHBjMzAwX3QgKiwgaW50KTsKK3ZvaWQgcnhfZG1hX3N0b3AocGMzMDBfdCAqLCBpbnQpOworaW50IGNwY19xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBjcGNfbmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBjcGNfc2NhX3N0YXR1cyhwYzMwMF90ICosIGludCk7CitpbnQgY3BjX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50KTsKK2ludCBjcGNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCk7CitpbnQgY2hfY29uZmlnKHBjMzAwZGV2X3QgKik7CitpbnQgcnhfY29uZmlnKHBjMzAwZGV2X3QgKik7CitpbnQgdHhfY29uZmlnKHBjMzAwZGV2X3QgKik7Cit2b2lkIGNwY19vcGVuY2gocGMzMDBkZXZfdCAqKTsKK3ZvaWQgY3BjX2Nsb3NlY2gocGMzMDBkZXZfdCAqKTsKK2ludCBjcGNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBjcGNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgY3BjX3NldF9tZWRpYShoZGxjX2RldmljZSAqLCBpbnQpOworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9QQzMwMF9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF9kcnYuYyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjdiZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX2Rydi5jCkBAIC0wLDAgKzEsMzY5MiBAQAorI2RlZmluZQlVU0VfUENJX0NMT0NLCitzdGF0aWMgY2hhciByY3NpZFtdID0gCisiUmV2aXNpb246IDMuNC41IERhdGU6IDIwMDIvMDMvMDcgIjsKKworLyoKKyAqIHBjMzAwLmMJQ3ljbGFkZXMtUEMzMDAodG0pIERyaXZlci4KKyAqCisgKiBBdXRob3I6CUl2YW4gUGFzc29zIDxpdmFuQGN5Y2xhZGVzLmNvbT4KKyAqIE1haW50YWluZXI6CVBDMzAwIE1haW50YWluZXIgPHBjMzAwQGN5Y2xhZGVzLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQ6CShjKSAxOTk5LTIwMDMgQ3ljbGFkZXMgQ29ycC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoJCisgKglVc2luZyB0YWJzdG9wID0gNC4KKyAqIAorICogJExvZzogcGMzMDBfZHJ2LmMsdiAkCisgKiBSZXZpc2lvbiAzLjIzICAyMDAyLzAzLzIwIDEzOjU4OjQwICBoZW5yaXF1ZQorICogRml4ZWQgb3J0b2dyYXBoaWMgbWlzdGFrZXMKKyAqCisgKiBSZXZpc2lvbiAzLjIyICAyMDAyLzAzLzEzIDE2OjU2OjU2ICBoZW5yaXF1ZQorICogVGFrZSBvdXQgdGhlIGRlYnVnIG1lc3NhZ2VzCisgKgorICogUmV2aXNpb24gMy4yMSAgMjAwMi8wMy8wNyAxNDoxNzowOSAgaGVucmlxdWUKKyAqIExpY2Vuc2UgZGF0YSBmaXhlZAorICoKKyAqIFJldmlzaW9uIDMuMjAgIDIwMDIvMDEvMTcgMTc6NTg6NTIgIGl2YW4KKyAqIFN1cHBvcnQgZm9yIFBDMzAwLVRFL00gKFBNQykuCisgKgorICogUmV2aXNpb24gMy4xOSAgMjAwMi8wMS8wMyAxNzowODo0NyAgZGFuaWVsYQorICogRW5hYmxlcyBETUEgcmVjZXB0aW9uIHdoZW4gdGhlIFNDQS1JSSBkaXNhYmxlcyBpdCBpbXByb3Blcmx5LgorICoKKyAqIFJldmlzaW9uIDMuMTggIDIwMDEvMTIvMDMgMTg6NDc6NTAgIGRhbmllbGEKKyAqIEVzdGhldGljIGNoYW5nZXMuCisgKgorICogUmV2aXNpb24gMy4xNyAgMjAwMS8xMC8xOSAxNjo1MDoxMyAgaGVucmlxdWUKKyAqIFBhdGNoIHRvIGtlcm5lbCAyLjQuMTIgYW5kIG5ldyBnZW5lcmljIGhkbGMuCisgKgorICogUmV2aXNpb24gMy4xNiAgMjAwMS8xMC8xNiAxNToxMjozMSAgcmVnaW5hCisgKiBjbGVhciBzdGF0aXN0aWNzCisgKgorICogUmV2aXNpb24gMy4xMSB0byAzLjE1ICAyMDAxLzEwLzExIDIwOjI2OjA0ICBkYW5pZWxhCisgKiBNb3JlIERNQSBmaXhlcyBmb3Igbm9pc3kgbGluZXMuCisgKiBSZXR1cm4gdGhlIHNpemUgb2YgYmFkIGZyYW1lcyBpbiBkbWFfZ2V0X3J4X2ZyYW1lX3NpemUsIHNvIHRoYXQgdGhlIFJ4IGJ1ZmZlcgorICogZGVzY3JpcHRvcnMgY2FuIGJlIGNsZWFuZWQgYnkgZG1hX2J1Zl9yZWFkIChjYWxsZWQgaW4gY3BjX25ldF9yeCkuCisgKiBSZW5hbWVkIGRtYV9zdGFydCByb3V0aW5lIHRvIHJ4X2RtYV9zdGFydC4gSW1wcm92ZWQgUnggc3RhdGlzdGljcy4KKyAqIEZpeGVkIEJPRiBpbnRlcnJ1cHQgdHJlYXRtZW50LiBDcmVhdGVkIGRtYV9zdGFydCByb3V0aW5lLgorICogQ2hhbmdlZCBtaW4gYW5kIG1heCB0byBjcGNfbWluIGFuZCBjcGNfbWF4LgorICoKKyAqIFJldmlzaW9uIDMuMTAgIDIwMDEvMDgvMDYgMTI6MDE6NTEgIHJlZ2luYQorICogRml4ZWQgcHJvYmxlbSBpbiBEU1JfREUgYml0LgorICoKKyAqIFJldmlzaW9uIDMuOSAgMjAwMS8wNy8xOCAxOToyNzoyNiAgZGFuaWVsYQorICogQWRkZWQgc29tZSBoaXN0b3J5IGNvbW1lbnRzLgorICoKKyAqIFJldmlzaW9uIDMuOCAgMjAwMS8wNy8xMiAxMzoxMToxOSAgcmVnaW5hCisgKiBidWcgZml4IC0gRENELU9GRiBpbiBwYzMwMCB0dHkgZHJpdmVyCisgKgorICogUmV2aXNpb24gMy4zIHRvIDMuNyAgMjAwMS8wNy8wNiAxNTowMDoyMCAgZGFuaWVsYQorICogUmVtb3Zpbmcga2VybmVsIDIuNC4zIGFuZCBwcmV2aW91cyBzdXBwb3J0LgorICogRE1BIHRyYW5zbWlzc2lvbiBidWcgZml4LgorICogTVRVIGNoZWNrIGluIGNwY19uZXRfcnggZml4ZWQuCisgKiBCb290IG1lc3NhZ2VzIHJldmlld2VkLgorICogTmV3IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAobGluZSBjb2RlLCBDUkMgY2FsY3VsYXRpb24gYW5kIGNsb2NrKS4KKyAqCisgKiBSZXZpc2lvbiAzLjIgMjAwMS8wNi8yMiAxMzoxMzowMiAgcmVnaW5hCisgKiBNTFBQUCBpbXBsZW1lbnRhdGlvbi4gQ2hhbmdlZCB0aGUgaGVhZGVyIG9mIG1lc3NhZ2UgdHJhY2UgdG8gaW5jbHVkZQorICogdGhlIGRldmljZSBuYW1lLiBOZXcgZm9ybWF0IDogImhkbGNYW1IvVF06ICIuCisgKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gY2hhbmdlZC4KKyAqCisgKiBSZXZpc2lvbiAzLjEgMjAwMS8wNi8xNSByZWdpbmEKKyAqIGluIGNwY19xdWV1ZV94bWl0LCBuZXRpZl9zdG9wX3F1ZXVlIGlzIGNhbGxlZCBpZiBkb24ndCBoYXZlIGZyZWUgZGVzY3JpcHRvcgorICogdXBwaW5nIG1ham9yIHZlcnNpb24gbnVtYmVyCisgKgorICogUmV2aXNpb24gMS4xLjEuMSAgMjAwMS8wNi8xMyAyMDoyNTowNCAgZGFuaWVsYQorICogUEMzMDAgaW5pdGlhbCBDVlMgdmVyc2lvbiAoMy40LjAtcHJlMSkKKyAqCisgKiBSZXZpc2lvbiAzLjAuMS4yIDIwMDEvMDYvMDggZGFuaWVsYQorICogRGlkIHNvbWUgY2hhbmdlcyBpbiB0aGUgRE1BIHByb2dyYW1taW5nIGltcGxlbWVudGF0aW9uIHRvIGF2b2lkIHRoZSAKKyAqIG9jY3VycmVuY2Ugb2YgYSBTQ0EtSUkgYnVnIHdoZW4gQ0RBIGlzIGFjY2Vzc2VkIGR1cmluZyBhIERNQSB0cmFuc2Zlci4KKyAqCisgKiBSZXZpc2lvbiAzLjAuMS4xIDIwMDEvMDUvMDIgZGFuaWVsYQorICogQWRkZWQga2VybmVsIDIuNC4zIHN1cHBvcnQuCisgKiAKKyAqIFJldmlzaW9uIDMuMC4xLjAgMjAwMS8wMy8xMyBkYW5pZWxhLCBoZW5yaXF1ZQorICogQWRkZWQgRnJhbWUgUmVsYXkgU3VwcG9ydC4KKyAqIERyaXZlciBub3cgdXNlcyBIRExDIGdlbmVyaWMgZHJpdmVyIHRvIHByb3ZpZGUgcHJvdG9jb2wgc3VwcG9ydC4KKyAqIAorICogUmV2aXNpb24gMy4wLjAuOCAyMDAxLzAzLzAyIGRhbmllbGEKKyAqIEZpeGVkIHJhbSBzaXplIGRldGVjdGlvbi4gCisgKiBDaGFuZ2VkIFNJT0NHUEMzMDBDT05GIGlvY3RsLCB0byBnaXZlIGh3IGluZm9ybWF0aW9uIHRvIHBjMzAwdXRpbC4KKyAqIAorICogUmV2aXNpb24gMy4wLjAuNyAyMDAxLzAyLzIzIGRhbmllbGEKKyAqIG5ldGlmX3N0b3BfcXVldWUgY2FsbGVkIGJlZm9yZSB0aGUgU0NBLUlJIHRyYW5zbWl0aW9uIGNvbW1hbmRzIGluIAorICogY3BjX3F1ZXVlX3htaXQsIGFuZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdpdGggCisgKiB0cmFuc21pdGlvbiBpbnRlcnJ1cHRzLgorICogRml4ZWQgZmFsY19jaGVja19zdGF0dXMgZm9yIFVuZnJhbWVkIEUxLgorICogCisgKiBSZXZpc2lvbiAzLjAuMC42IDIwMDAvMTIvMTMgZGFuaWVsYQorICogSW1wbGVtZW50ZWQgcGMzMDB1dGlsIHN1cHBvcnQ6IHRyYWNlLCBzdGF0aXN0aWNzLCBzdGF0dXMgYW5kIGxvb3BiYWNrCisgKiB0ZXN0cyBmb3IgdGhlIFBDMzAwIFRFIGJvYXJkcy4KKyAqIAorICogUmV2aXNpb24gMy4wLjAuNSAyMDAwLzEyLzEyIGl2YW4KKyAqIEFkZGVkIHN1cHBvcnQgZm9yIFVuZnJhbWVkIEUxLgorICogSW1wbGVtZW50ZWQgbW9uaXRvciBtb2RlLgorICogRml4ZWQgRENEIHNlbnNpdGl2aXR5IG9uIHRoZSBzZWNvbmQgY2hhbm5lbC4KKyAqIERyaXZlciBub3cgY29tcGxpZXMgd2l0aCBuZXcgUENJIGtlcm5lbCBhcmNoaXRlY3R1cmUuCisgKgorICogUmV2aXNpb24gMy4wLjAuNCAyMDAwLzA5LzI4IGl2YW4KKyAqIEltcGxlbWVudGVkIERDRCBzZW5zaXRpdml0eS4KKyAqIE1vdmVkIGhhcmR3YXJlLXNwZWNpZmljIG9wZW4gdG8gdGhlIGVuZCBvZiBjcGNfb3BlbiwgdG8gYXZvaWQgcmFjZQorICogY29uZGl0aW9ucyB3aXRoIGVhcmx5IHJlY2VwdGlvbiBpbnRlcnJ1cHRzLgorICogSW5jbHVkZWQgY29kZSBmb3IgW3JlcXVlc3R8cmVsZWFzZV1fbWVtX3JlZ2lvbigpLgorICogQ2hhbmdlZCBsb2NhdGlvbiBvZiBwYzMwMC5oIC4KKyAqIE1pbm9yIGNvZGUgcmV2aXNpb24gKGNvbnRyaWIuIG9mIEplZmYgR2FyemlrKS4KKyAqCisgKiBSZXZpc2lvbiAzLjAuMC4zIDIwMDAvMDcvMDMgaXZhbgorICogUHJldmlvdXMgYnVnZml4IGZvciB0aGUgZnJhbWluZyBlcnJvcnMgd2l0aCBleHRlcm5hbCBjbG9jayBtYWRlIFgyMQorICogYm9hcmRzIHN0b3Agd29ya2luZy4gVGhpcyB2ZXJzaW9uIGZpeGVzIGl0LgorICoKKyAqIFJldmlzaW9uIDMuMC4wLjIgMjAwMC8wNi8yMyBpdmFuCisgKiBSZXZpc2l0ZWQgY3BjX3F1ZXVlX3htaXQgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgb24gVHggRE1BIGJ1ZmZlcgorICogaGFuZGxpbmcgd2hlbiBUeCB0aW1lb3V0cyBvY2N1ci4KKyAqIFJldmlzaXRlZCBSeCBzdGF0aXN0aWNzLgorICogRml4ZWQgYSBidWcgaW4gdGhlIFNDQS1JSSBwcm9ncmFtbWluZyB0aGF0IHdvdWxkIGNhdXNlIGZyYW1pbmcgZXJyb3JzCisgKiB3aGVuIGV4dGVybmFsIGNsb2NrIHdhcyBjb25maWd1cmVkLgorICoKKyAqIFJldmlzaW9uIDMuMC4wLjEgMjAwMC8wNS8yNiBpdmFuCisgKiBBZGRlZCBsb2dpYyBpbiB0aGUgU0NBIGludGVycnVwdCBoYW5kbGVyIHNvIHRoYXQgbm8gYm9hcmQgY2FuIG1vbm9wb2xpemUKKyAqIHRoZSBkcml2ZXIuCisgKiBSZXF1ZXN0IFBMWCBJL08gcmVnaW9uLCBhbHRob3VnaCBkcml2ZXIgZG9lc24ndCB1c2UgaXQsIHRvIGF2b2lkCisgKiBwcm9ibGVtcyB3aXRoIG90aGVyIGRyaXZlcnMgYWNjZXNzaW5nIGl0LgorICoKKyAqIFJldmlzaW9uIDMuMC4wLjAgMjAwMC8wNS8xNSBpdmFuCisgKiBEaWQgc29tZSBjaGFuZ2VzIGluIHRoZSBETUEgcHJvZ3JhbW1pbmcgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgdGhlCisgKiBvY2N1cnJlbmNlIG9mIGEgU0NBLUlJIGJ1ZyBpbiB0aGUgc2Vjb25kIGNoYW5uZWwuCisgKiBJbXBsZW1lbnRlZCB3b3JrYXJvdW5kIGZvciBQTFg5MDUwIGJ1ZyB0aGF0IHdvdWxkIGNhdXNlIGEgc3lzdGVtIGxvY2t1cAorICogaW4gY2VydGFpbiBzeXN0ZW1zLCBkZXBlbmRpbmcgb24gdGhlIE1NSU8gYWRkcmVzc2VzIGFsbG9jYXRlZCB0byB0aGUKKyAqIGJvYXJkLgorICogRml4ZWQgdGhlIEZBTEMgY2hpcCBwcm9ncmFtbWluZyB0byBhdm9pZCBzeW5jaHJvbml6YXRpb24gcHJvYmxlbXMgaW4gdGhlCisgKiBzZWNvbmQgY2hhbm5lbCAoVEUgb25seSkuCisgKiBJbXBsZW1lbnRlZCBhIGNsZWFuZXIgYW5kIGZhc3RlciBUeCBETUEgZGVzY3JpcHRvciBjbGVhbnVwIHByb2NlZHVyZSBpbgorICogY3BjX3F1ZXVlX3htaXQoKS4KKyAqIENoYW5nZWQgdGhlIGJ1aWx0LWluIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBzbyB0aGF0IHRoZSBkcml2ZXIgY2FuIHVzZSB0aGUKKyAqIGdlbmVyYWwgJ2hkbGNOJyBuYW1pbmcgY29udmVudGlvbiBpbnN0ZWFkIG9mIHByb3ByaWV0YXJ5IGRldmljZSBuYW1lcy4KKyAqIERyaXZlciBsb2FkIG1lc3NhZ2VzIGFyZSBub3cgZGV2aWNlLWNlbnRyaWMsIGluc3RlYWQgb2YgYm9hcmQtY2VudHJpYy4KKyAqIER5bmFtaWMgYWxsb2NhdGlvbiBvZiBuZXRfZGV2aWNlIHN0cnVjdHVyZXMuCisgKiBDb2RlIGlzIG5vdyBjb21wbGlhbnQgd2l0aCB0aGUgbmV3IG1vZHVsZSBpbnRlcmZhY2UgKG1vZHVsZV9baW5pdHxleGl0XSkuCisgKiBNYWtlIHVzZSBvZiB0aGUgUENJIGhlbHBlciBmdW5jdGlvbnMgdG8gYWNjZXNzIFBDSSByZXNvdXJjZXMuCisgKgorICogUmV2aXNpb24gMi4wLjAuMCAyMDAwLzA0LzE1IGl2YW4KKyAqIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBQQzMwMC9URSBib2FyZHMgKFQxL0ZUMS9FMS9GRTEpLgorICoKKyAqIFJldmlzaW9uIDEuMS4wLjAgMjAwMC8wMi8yOCBpdmFuCisgKiBNYWpvciBjaGFuZ2VzIGluIHRoZSBkcml2ZXIgYXJjaGl0ZWN0dXJlLgorICogU29mdG5ldCBjb21wbGlhbmN5IGltcGxlbWVudGVkLgorICogRHJpdmVyIG5vdyByZXBvcnRzIHBoeXNpY2FsIGluc3RlYWQgb2YgdmlydHVhbCBtZW1vcnkgYWRkcmVzc2VzLgorICogQWRkZWQgY3BjX2NoYW5nZV9tdHUgZnVuY3Rpb24uCisgKgorICogUmV2aXNpb24gMS4wLjAuMCAxOTk5LzEyLzE2IGl2YW4KKyAqIEZpcnN0IG9mZmljaWFsIHJlbGVhc2UuCisgKiBTdXBwb3J0IGZvciAxLSBhbmQgMi1jaGFubmVsIGJvYXJkcyAod2hpY2ggdXNlIGRpc3RpbmN0IFBDSSBEZXZpY2UgSUQncykuCisgKiBTdXBwb3J0IGZvciBtb25vbHl0aGljIGluc3RhbGxhdGlvbiAoaS5lLiwgZHJ2IGJ1aWx0IGludG8gdGhlIGtlcm5lbCkuCisgKiBYLjI1IGFkZGl0aW9uYWwgY2hlY2tpbmcgd2hlbiBsYXBiX1tkaXNdY29ubmVjdF9yZXF1ZXN0IHJldHVybnMgYW4gZXJyb3IuCisgKiBTQ0EgcHJvZ3JhbW1pbmcgbm93IGNvdmVycyBYLjIxIGFzIHdlbGwuCisgKgorICogUmV2aXNpb24gMC4zLjEuMCAxOTk5LzExLzE4IGl2YW4KKyAqIE1hZGUgWC4yNSBzdXBwb3J0IGNvbmZpZ3VyYXRpb24tZGVwZW5kZW50IChhcyBpdCBkZXBlbmRzIG9uIGV4dGVybmFsIAorICogbW9kdWxlcyB0byB3b3JrKS4KKyAqIENoYW5nZWQgWC4yNS1zcGVjaWZpYyBmdW5jdGlvbiBuYW1lcyB0byBjb21wbHkgd2l0aCBhZG9wdGVkIGNvbnZlbnRpb24uCisgKiBGaXhlZCB0eXBvcyBpbiBYLjI1IGZ1bmN0aW9ucyB0aGF0IHdvdWxkIGNhdXNlIGNvbXBpbGUgZXJyb3JzIChEYW5pZWxhKS4KKyAqIEZpeGVkIGJ1ZyBpbiBjaF9jb25maWcgdGhhdCB3b3VsZCBkaXNhYmxlIGludGVycnVwdHMgb24gYSBwcmV2aW91c2x5IAorICogZW5hYmxlZCBjaGFubmVsIGlmIHRoZSBvdGhlciBjaGFubmVsIG9uIHRoZSBzYW1lIGJvYXJkIHdhcyBlbmFibGVkIGxhdGVyLgorICoKKyAqIFJldmlzaW9uIDAuMy4wLjAgMTk5OS8xMS8xNiBkYW5pZWxhCisgKiBYLjI1IHN1cHBvcnQuCisgKgorICogUmV2aXNpb24gMC4yLjMuMCAxOTk5LzExLzE1IGl2YW4KKyAqIEZ1bmN0aW9uIGNwY19jaF9zdGF0dXMgbm93IHByb3ZpZGVzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24uCisgKiBBZGRlZCBzdXBwb3J0IGZvciBYLjIxIGNsb2NrIGNvbmZpZ3VyYXRpb24uCisgKiBDaGFuZ2VkIFROUjEgc2V0dGluZyBpbiBvcmRlciB0byBwcmV2ZW50IFR4IEZJRk8gb3ZlcmFjY2Vzc2VzIGJ5IHRoZSBTQ0EuCisgKiBOb3cgdXNpbmcgUENJIGNsb2NrIGluc3RlYWQgb2YgaW50ZXJuYWwgb3NjaWxsYXRvciBjbG9jayBmb3IgdGhlIFNDQS4KKyAqCisgKiBSZXZpc2lvbiAwLjIuMi4wIDE5OTkvMTEvMTAgaXZhbgorICogQ2hhbmdlZCB0aGUgKl9kbWFfYnVmX2NoZWNrIGZ1bmN0aW9ucyBzbyB0aGF0IHRoZXkgd291bGQgcHJpbnQgb25seSAKKyAqIHRoZSB1c2VmdWwgaW5mbyBpbnN0ZWFkIG9mIHRoZSB3aG9sZSBidWZmZXIgZGVzY3JpcHRvciBiYW5rLgorICogRml4ZWQgYnVnIGluIGNwY19xdWV1ZV94bWl0IHRoYXQgd291bGQgZXZlbnR1YWxseSBjcmFzaCB0aGUgc3lzdGVtIAorICogaW4gY2FzZSBvZiBhIHBhY2tldCBkcm9wLgorICogSW1wbGVtZW50ZWQgVFggdW5kZXJydW4gaGFuZGxpbmcuCisgKiBJbXByb3ZlZCBTQ0EgZmluZSB0dW5pbmcgdG8gYm9vc3QgdXAgaXRzIHBlcmZvcm1hbmNlLgorICoKKyAqIFJldmlzaW9uIDAuMi4xLjAgMTk5OS8xMS8wMyBpdmFuCisgKiBBZGRlZCBmdW5jdGlvbnMgKmRtYV9idWZfcHRfaW5pdCB0byBhbGxvdyBpbmRlcGVuZGVudCBpbml0aWFsaXphdGlvbiAKKyAqIG9mIHRoZSBuZXh0LWRlc2NyLiBhbmQgRE1BIGJ1ZmZlciBwb2ludGVycyBvbiB0aGUgRE1BIGRlc2NyaXB0b3JzLgorICogS2VybmVsIGJ1ZmZlciByZWxlYXNlIGFuZCB0YnVzeSBjbGVhcmluZyBpcyBub3cgZG9uZSBpbiB0aGUgaW50ZXJydXB0IAorICogaGFuZGxlci4KKyAqIEZpeGVkIGJ1ZyBpbiBjcGNfb3BlbiB0aGF0IHdvdWxkIGNhdXNlIGFuIGludGVyZmFjZSByZW9wZW4gdG8gZmFpbC4KKyAqIEFkZGVkIGEgcHJvdG9jb2wtc3BlY2lmaWMgY29kZSBzZWN0aW9uIGluIGNwY19uZXRfcnguCisgKiBSZW1vdmVkIHByaW50ayBsZXZlbCBkZWZzICh0aGV5IG1pZ2h0IGJlIGFkZGVkIGJhY2sgYWZ0ZXIgdGhlIGJldGEgcGhhc2UpLgorICoKKyAqIFJldmlzaW9uIDAuMi4wLjAgMTk5OS8xMC8yOCBpdmFuCisgKiBSZXZpc2l0ZWQgdGhlIGNvZGUgc28gdGhhdCBuZXcgcHJvdG9jb2xzIGNhbiBiZSBlYXNpbHkgYWRkZWQgLyBzdXBwb3J0ZWQuIAorICoKKyAqIFJldmlzaW9uIDAuMS4wLjEgMTk5OS8xMC8yMCBpdmFuCisgKiBNb3N0bHkgImVzdGhldGljIiBjaGFuZ2VzLgorICoKKyAqIFJldmlzaW9uIDAuMS4wLjAgMTk5OS8xMC8xMSBpdmFuCisgKiBJbml0aWFsIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorCisjaW5jbHVkZSA8bmV0L3N5bmNwcHAuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAicGMzMDAuaCIKKworI2RlZmluZQlDUENfTE9DSyhjYXJkLGZsYWdzKQkJXAorCQlkbyB7CQkJCQkJXAorCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CVwKKwkJfSB3aGlsZSAoMCkKKworI2RlZmluZSBDUENfVU5MT0NLKGNhcmQsZmxhZ3MpCQkJXAorCQlkbyB7CQkJCQkJCVwKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CVwKKwkJfSB3aGlsZSAoMCkKKworI3VuZGVmCVBDMzAwX0RFQlVHX1BDSQorI3VuZGVmCVBDMzAwX0RFQlVHX0lOVFIKKyN1bmRlZglQQzMwMF9ERUJVR19UWAorI3VuZGVmCVBDMzAwX0RFQlVHX1JYCisjdW5kZWYJUEMzMDBfREVCVUdfT1RIRVIKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNwY19wY2lfZGV2X2lkW10gX19kZXZpbml0ZGF0YSA9IHsKKwkvKiBQQzMwMC9SU1Ygb3IgUEMzMDAvWDIxLCAyIGNoYW4gKi8KKwl7MHgxMjBlLCAweDMwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMHgzMDB9LAorCS8qIFBDMzAwL1JTViBvciBQQzMwMC9YMjEsIDEgY2hhbiAqLworCXsweDEyMGUsIDB4MzAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAweDMwMX0sCisJLyogUEMzMDAvVEUsIDIgY2hhbiAqLworCXsweDEyMGUsIDB4MzEwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAweDMxMH0sCisJLyogUEMzMDAvVEUsIDEgY2hhbiAqLworCXsweDEyMGUsIDB4MzExLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAweDMxMX0sCisJLyogUEMzMDAvVEUtTSwgMiBjaGFuICovCisJezB4MTIwZSwgMHgzMjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB4MzIwfSwKKwkvKiBQQzMwMC9URS1NLCAxIGNoYW4gKi8KKwl7MHgxMjBlLCAweDMyMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMHgzMjF9LAorCS8qIEVuZCBvZiB0YWJsZSAqLworCXswLH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNwY19wY2lfZGV2X2lkKTsKKworI2lmbmRlZiBjcGNfbWluCisjZGVmaW5lCWNwY19taW4oYSxiKQkoKChhKTwoYikpPyhhKTooYikpCisjZW5kaWYKKyNpZm5kZWYgY3BjX21heAorI2RlZmluZQljcGNfbWF4KGEsYikJKCgoYSk+KGIpKT8oYSk6KGIpKQorI2VuZGlmCisKKy8qIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIHR4X2RtYV9idWZfcHRfaW5pdChwYzMwMF90ICosIGludCk7CitzdGF0aWMgdm9pZCB0eF9kbWFfYnVmX2luaXQocGMzMDBfdCAqLCBpbnQpOworc3RhdGljIHZvaWQgcnhfZG1hX2J1Zl9wdF9pbml0KHBjMzAwX3QgKiwgaW50KTsKK3N0YXRpYyB2b2lkIHJ4X2RtYV9idWZfaW5pdChwYzMwMF90ICosIGludCk7CitzdGF0aWMgdm9pZCB0eF9kbWFfYnVmX2NoZWNrKHBjMzAwX3QgKiwgaW50KTsKK3N0YXRpYyB2b2lkIHJ4X2RtYV9idWZfY2hlY2socGMzMDBfdCAqLCBpbnQpOworc3RhdGljIGlycXJldHVybl90IGNwY19pbnRyKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqY3BjX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgY2xvY2tfcmF0ZV9jYWxjKHVjbG9uZywgdWNsb25nLCBpbnQgKik7CitzdGF0aWMgdWNsb25nIGRldGVjdF9yYW0ocGMzMDBfdCAqKTsKK3N0YXRpYyB2b2lkIHBseF9pbml0KHBjMzAwX3QgKik7CitzdGF0aWMgdm9pZCBjcGNfdHJhY2Uoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IHNrX2J1ZmYgKiwgY2hhcik7CitzdGF0aWMgaW50IGNwY19hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKiwgdW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KTsKKworI2lmZGVmIENPTkZJR19QQzMwMF9NTFBQUAordm9pZCBjcGNfdHR5X2luaXQocGMzMDBkZXZfdCAqIGRldik7Cit2b2lkIGNwY190dHlfdW5yZWdpc3Rlcl9zZXJ2aWNlKHBjMzAwZGV2X3QgKiBwYzMwMGRldik7Cit2b2lkIGNwY190dHlfcmVjZWl2ZShwYzMwMGRldl90ICogcGMzMDBkZXYpOwordm9pZCBjcGNfdHR5X3RyaWdnZXJfcG9sbChwYzMwMGRldl90ICogcGMzMDBkZXYpOwordm9pZCBjcGNfdHR5X3Jlc2V0X3Zhcih2b2lkKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgIERNQSBSb3V0aW5lcyAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB0eF9kbWFfYnVmX3B0X2luaXQocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlpbnQgaTsKKwlpbnQgY2hfZmFjdG9yID0gY2ggKiBOX0RNQV9UWF9CVUY7CisJdm9sYXRpbGUgcGNzY2FfYmRfdCBfX2lvbWVtICpwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UKKwkJCSAgICAgICAgICAgICAgICsgRE1BX1RYX0JEX0JBU0UgKyBjaF9mYWN0b3IgKiBzaXplb2YocGNzY2FfYmRfdCkpOworCisJZm9yIChpID0gMDsgaSA8IE5fRE1BX1RYX0JVRjsgaSsrLCBwdGRlc2NyKyspIHsKKwkJY3BjX3dyaXRlbCgmcHRkZXNjci0+bmV4dCwgKHVjbG9uZykgKERNQV9UWF9CRF9CQVNFICsKKwkJCShjaF9mYWN0b3IgKyAoKGkgKyAxKSAmIChOX0RNQV9UWF9CVUYgLSAxKSkpICogc2l6ZW9mKHBjc2NhX2JkX3QpKSk7CisJCWNwY193cml0ZWwoJnB0ZGVzY3ItPnB0YnVmLCAKKwkJCQkJCSh1Y2xvbmcpIChETUFfVFhfQkFTRSArIChjaF9mYWN0b3IgKyBpKSAqIEJEX0RFRl9MRU4pKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHR4X2RtYV9idWZfaW5pdChwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCWludCBpOworCWludCBjaF9mYWN0b3IgPSBjaCAqIE5fRE1BX1RYX0JVRjsKKwl2b2xhdGlsZSBwY3NjYV9iZF90IF9faW9tZW0gKnB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZQorCQkJICAgICAgICsgRE1BX1RYX0JEX0JBU0UgKyBjaF9mYWN0b3IgKiBzaXplb2YocGNzY2FfYmRfdCkpOworCisJZm9yIChpID0gMDsgaSA8IE5fRE1BX1RYX0JVRjsgaSsrLCBwdGRlc2NyKyspIHsKKwkJbWVtc2V0X2lvKHB0ZGVzY3IsIDAsIHNpemVvZihwY3NjYV9iZF90KSk7CisJCWNwY193cml0ZXcoJnB0ZGVzY3ItPmxlbiwgMCk7CisJCWNwY193cml0ZWIoJnB0ZGVzY3ItPnN0YXR1cywgRFNUX09TQik7CisJfQorCXR4X2RtYV9idWZfcHRfaW5pdChjYXJkLCBjaCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ4X2RtYV9idWZfcHRfaW5pdChwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCWludCBpOworCWludCBjaF9mYWN0b3IgPSBjaCAqIE5fRE1BX1JYX0JVRjsKKwl2b2xhdGlsZSBwY3NjYV9iZF90IF9faW9tZW0gKnB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZQorCQkJCSAgICAgICArIERNQV9SWF9CRF9CQVNFICsgY2hfZmFjdG9yICogc2l6ZW9mKHBjc2NhX2JkX3QpKTsKKworCWZvciAoaSA9IDA7IGkgPCBOX0RNQV9SWF9CVUY7IGkrKywgcHRkZXNjcisrKSB7CisJCWNwY193cml0ZWwoJnB0ZGVzY3ItPm5leHQsICh1Y2xvbmcpIChETUFfUlhfQkRfQkFTRSArCisJICAgICAJKGNoX2ZhY3RvciArICgoaSArIDEpICYgKE5fRE1BX1JYX0JVRiAtIDEpKSkgKiBzaXplb2YocGNzY2FfYmRfdCkpKTsKKwkJY3BjX3dyaXRlbCgmcHRkZXNjci0+cHRidWYsCisJCQkgICAodWNsb25nKSAoRE1BX1JYX0JBU0UgKyAoY2hfZmFjdG9yICsgaSkgKiBCRF9ERUZfTEVOKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCByeF9kbWFfYnVmX2luaXQocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlpbnQgaTsKKwlpbnQgY2hfZmFjdG9yID0gY2ggKiBOX0RNQV9SWF9CVUY7CisJdm9sYXRpbGUgcGNzY2FfYmRfdCBfX2lvbWVtICpwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UKKwkJCQkgICAgICAgKyBETUFfUlhfQkRfQkFTRSArIGNoX2ZhY3RvciAqIHNpemVvZihwY3NjYV9iZF90KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTl9ETUFfUlhfQlVGOyBpKyssIHB0ZGVzY3IrKykgeworCQltZW1zZXRfaW8ocHRkZXNjciwgMCwgc2l6ZW9mKHBjc2NhX2JkX3QpKTsKKwkJY3BjX3dyaXRldygmcHRkZXNjci0+bGVuLCAwKTsKKwkJY3BjX3dyaXRlYigmcHRkZXNjci0+c3RhdHVzLCAwKTsKKwl9CisJcnhfZG1hX2J1Zl9wdF9pbml0KGNhcmQsIGNoKTsKK30KKworc3RhdGljIHZvaWQgdHhfZG1hX2J1Zl9jaGVjayhwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXZvbGF0aWxlIHBjc2NhX2JkX3QgX19pb21lbSAqcHRkZXNjcjsKKwlpbnQgaTsKKwl1Y3Nob3J0IGZpcnN0X2JkID0gY2FyZC0+Y2hhbltjaF0udHhfZmlyc3RfYmQ7CisJdWNzaG9ydCBuZXh0X2JkID0gY2FyZC0+Y2hhbltjaF0udHhfbmV4dF9iZDsKKworCXByaW50aygiI0NIJWQ6IGZfYmQgPSAlZCgweCUwOHp4KSwgbl9iZCA9ICVkKDB4JTA4engpXG4iLCBjaCwKKwkgICAgICAgZmlyc3RfYmQsIFRYX0JEX0FERFIoY2gsIGZpcnN0X2JkKSwKKwkgICAgICAgbmV4dF9iZCwgVFhfQkRfQUREUihjaCwgbmV4dF9iZCkpOworCWZvciAoaSA9IGZpcnN0X2JkLAorCSAgICAgcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlICsgVFhfQkRfQUREUihjaCwgZmlyc3RfYmQpKTsKKwkgICAgIGkgIT0gKChuZXh0X2JkICsgMSkgJiAoTl9ETUFfVFhfQlVGIC0gMSkpOworCSAgICAgaSA9IChpICsgMSkgJiAoTl9ETUFfVFhfQlVGIC0gMSksIAorCQkgcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlICsgVFhfQkRfQUREUihjaCwgaSkpKSB7CisJCXByaW50aygiXG4gQ0glZCBUWCVkOiBuZXh0PTB4JXgsIHB0YnVmPTB4JXgsIFNUPTB4JXgsIGxlbj0lZCIsCisJCSAgICAgICBjaCwgaSwgY3BjX3JlYWRsKCZwdGRlc2NyLT5uZXh0KSwKKwkJICAgICAgIGNwY19yZWFkbCgmcHRkZXNjci0+cHRidWYpLAorCQkgICAgICAgY3BjX3JlYWRiKCZwdGRlc2NyLT5zdGF0dXMpLCBjcGNfcmVhZHcoJnB0ZGVzY3ItPmxlbikpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKKyNpZmRlZglQQzMwMF9ERUJVR19PVEhFUgorLyogU2hvdyBhbGwgVFggYnVmZmVyIGRlc2NyaXB0b3JzICovCitzdGF0aWMgdm9pZCB0eDFfZG1hX2J1Zl9jaGVjayhwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXZvbGF0aWxlIHBjc2NhX2JkX3QgX19pb21lbSAqcHRkZXNjcjsKKwlpbnQgaTsKKwl1Y3Nob3J0IGZpcnN0X2JkID0gY2FyZC0+Y2hhbltjaF0udHhfZmlyc3RfYmQ7CisJdWNzaG9ydCBuZXh0X2JkID0gY2FyZC0+Y2hhbltjaF0udHhfbmV4dF9iZDsKKwl1Y2xvbmcgc2NhYmFzZSA9IGNhcmQtPmh3LnNjYWJhc2U7CisKKwlwcmludGsgKCJcbm5mcmVlX3R4X2JkID0gJWQgXG4iLCBjYXJkLT5jaGFuW2NoXS5uZnJlZV90eF9iZCk7CisJcHJpbnRrKCIjQ0glZDogZl9iZCA9ICVkKDB4JTA4eCksIG5fYmQgPSAlZCgweCUwOHgpXG4iLCBjaCwKKwkgICAgICAgZmlyc3RfYmQsIFRYX0JEX0FERFIoY2gsIGZpcnN0X2JkKSwKKwkgICAgICAgbmV4dF9iZCwgVFhfQkRfQUREUihjaCwgbmV4dF9iZCkpOworCXByaW50aygiVFhfQ0RBPTB4JTA4eCwgVFhfRURBPTB4JTA4eFxuIiwKKwkgICAgICAgY3BjX3JlYWRsKHNjYWJhc2UgKyBEVFhfUkVHKENEQUwsIGNoKSksCisJICAgICAgIGNwY19yZWFkbChzY2FiYXNlICsgRFRYX1JFRyhFREFMLCBjaCkpKTsKKwlmb3IgKGkgPSAwOyBpIDwgTl9ETUFfVFhfQlVGOyBpKyspIHsKKwkJcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlICsgVFhfQkRfQUREUihjaCwgaSkpOworCQlwcmludGsoIlxuIENIJWQgVFglZDogbmV4dD0weCV4LCBwdGJ1Zj0weCV4LCBTVD0weCV4LCBsZW49JWQiLAorCQkgICAgICAgY2gsIGksIGNwY19yZWFkbCgmcHRkZXNjci0+bmV4dCksCisJCSAgICAgICBjcGNfcmVhZGwoJnB0ZGVzY3ItPnB0YnVmKSwKKwkJICAgICAgIGNwY19yZWFkYigmcHRkZXNjci0+c3RhdHVzKSwgY3BjX3JlYWR3KCZwdGRlc2NyLT5sZW4pKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCisJCQkgCitzdGF0aWMgdm9pZCByeF9kbWFfYnVmX2NoZWNrKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJdm9sYXRpbGUgcGNzY2FfYmRfdCBfX2lvbWVtICpwdGRlc2NyOworCWludCBpOworCXVjc2hvcnQgZmlyc3RfYmQgPSBjYXJkLT5jaGFuW2NoXS5yeF9maXJzdF9iZDsKKwl1Y3Nob3J0IGxhc3RfYmQgPSBjYXJkLT5jaGFuW2NoXS5yeF9sYXN0X2JkOworCWludCBjaF9mYWN0b3I7CisKKwljaF9mYWN0b3IgPSBjaCAqIE5fRE1BX1JYX0JVRjsKKwlwcmludGsoIiNDSCVkOiBmX2JkID0gJWQsIGxfYmQgPSAlZFxuIiwgY2gsIGZpcnN0X2JkLCBsYXN0X2JkKTsKKwlmb3IgKGkgPSAwLCBwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UgKworCQkJCQkgICAgICBETUFfUlhfQkRfQkFTRSArIGNoX2ZhY3RvciAqIHNpemVvZihwY3NjYV9iZF90KSk7CisJICAgICBpIDwgTl9ETUFfUlhfQlVGOyBpKyssIHB0ZGVzY3IrKykgeworCQlpZiAoY3BjX3JlYWRiKCZwdGRlc2NyLT5zdGF0dXMpICYgRFNUX09TQikKKwkJCXByaW50ayAoIlxuIENIJWQgUlglZDogbmV4dD0weCV4LCBwdGJ1Zj0weCV4LCBTVD0weCV4LCBsZW49JWQiLAorCQkJCSBjaCwgaSwgY3BjX3JlYWRsKCZwdGRlc2NyLT5uZXh0KSwKKwkJCQkgY3BjX3JlYWRsKCZwdGRlc2NyLT5wdGJ1ZiksCisJCQkJIGNwY19yZWFkYigmcHRkZXNjci0+c3RhdHVzKSwKKwkJCQkgY3BjX3JlYWR3KCZwdGRlc2NyLT5sZW4pKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCitpbnQgZG1hX2dldF9yeF9mcmFtZV9zaXplKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJdm9sYXRpbGUgcGNzY2FfYmRfdCBfX2lvbWVtICpwdGRlc2NyOworCXVjc2hvcnQgZmlyc3RfYmQgPSBjYXJkLT5jaGFuW2NoXS5yeF9maXJzdF9iZDsKKwlpbnQgcmN2ZCA9IDA7CisJdm9sYXRpbGUgdWNjaGFyIHN0YXR1czsKKworCXB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZSArIFJYX0JEX0FERFIoY2gsIGZpcnN0X2JkKSk7CisJd2hpbGUgKChzdGF0dXMgPSBjcGNfcmVhZGIoJnB0ZGVzY3ItPnN0YXR1cykpICYgRFNUX09TQikgeworCQlyY3ZkICs9IGNwY19yZWFkdygmcHRkZXNjci0+bGVuKTsKKwkJZmlyc3RfYmQgPSAoZmlyc3RfYmQgKyAxKSAmIChOX0RNQV9SWF9CVUYgLSAxKTsKKwkJaWYgKChzdGF0dXMgJiBEU1RfRU9NKSB8fCAoZmlyc3RfYmQgPT0gY2FyZC0+Y2hhbltjaF0ucnhfbGFzdF9iZCkpIHsKKwkJCS8qIFJldHVybiB0aGUgc2l6ZSBvZiBhIGdvb2QgZnJhbWUgb3IgaW5jb21wbGV0ZSBiYWQgZnJhbWUgCisJCQkqIChkbWFfYnVmX3JlYWQgd2lsbCBjbGVhbiB0aGUgYnVmZmVyIGRlc2NyaXB0b3JzIGluIHRoaXMgY2FzZSkuICovCisJCQlyZXR1cm4gKHJjdmQpOworCQl9CisJCXB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZSArIGNwY19yZWFkbCgmcHRkZXNjci0+bmV4dCkpOworCX0KKwlyZXR1cm4gKC0xKTsKK30KKworLyoKKyAqIGRtYV9idWZfd3JpdGU6IHdyaXRlcyBhIGZyYW1lIHRvIHRoZSBUeCBETUEgYnVmZmVycworICogTk9URTogdGhpcyBmdW5jdGlvbiB3cml0ZXMgb25lIGZyYW1lIGF0IGEgdGltZS4KKyAqLworaW50IGRtYV9idWZfd3JpdGUocGMzMDBfdCAqIGNhcmQsIGludCBjaCwgdWNjaGFyICogcHRkYXRhLCBpbnQgbGVuKQoreworCWludCBpLCBuY2hhcjsKKwl2b2xhdGlsZSBwY3NjYV9iZF90IF9faW9tZW0gKnB0ZGVzY3I7CisJaW50IHRvc2VuZCA9IGxlbjsKKwl1Y2NoYXIgbmJ1ZiA9ICgobGVuIC0gMSkgLyBCRF9ERUZfTEVOKSArIDE7CisKKwlpZiAobmJ1ZiA+PSBjYXJkLT5jaGFuW2NoXS5uZnJlZV90eF9iZCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJ1ZjsgaSsrKSB7CisJCXB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZSArCisJCQkJCSAgVFhfQkRfQUREUihjaCwgY2FyZC0+Y2hhbltjaF0udHhfbmV4dF9iZCkpOworCQluY2hhciA9IGNwY19taW4oQkRfREVGX0xFTiwgdG9zZW5kKTsKKwkJaWYgKGNwY19yZWFkYigmcHRkZXNjci0+c3RhdHVzKSAmIERTVF9PU0IpIHsKKwkJCW1lbWNweV90b2lvKChjYXJkLT5ody5yYW1iYXNlICsgY3BjX3JlYWRsKCZwdGRlc2NyLT5wdGJ1ZikpLAorCQkJCSAgICAmcHRkYXRhW2xlbiAtIHRvc2VuZF0sIG5jaGFyKTsKKwkJCWNwY193cml0ZXcoJnB0ZGVzY3ItPmxlbiwgbmNoYXIpOworCQkJY2FyZC0+Y2hhbltjaF0ubmZyZWVfdHhfYmQtLTsKKwkJCWlmICgoaSArIDEpID09IG5idWYpIHsKKwkJCQkvKiBUaGlzIG11c3QgYmUgdGhlIGxhc3QgQkQgdG8gYmUgdXNlZCAqLworCQkJCWNwY193cml0ZWIoJnB0ZGVzY3ItPnN0YXR1cywgRFNUX0VPTSk7CisJCQl9IGVsc2UgeworCQkJCWNwY193cml0ZWIoJnB0ZGVzY3ItPnN0YXR1cywgMCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl0b3NlbmQgLT0gbmNoYXI7CisJCWNhcmQtPmNoYW5bY2hdLnR4X25leHRfYmQgPQorCQkJKGNhcmQtPmNoYW5bY2hdLnR4X25leHRfYmQgKyAxKSAmIChOX0RNQV9UWF9CVUYgLSAxKTsKKwl9CisJLyogSWYgaXQgZ2V0cyB0byBoZXJlLCBpdCBtZWFucyB3ZSBoYXZlIHNlbnQgdGhlIHdob2xlIGZyYW1lICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkbWFfYnVmX3JlYWQ6IHJlYWRzIGEgZnJhbWUgZnJvbSB0aGUgUnggRE1BIGJ1ZmZlcnMKKyAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gcmVhZHMgb25lIGZyYW1lIGF0IGEgdGltZS4KKyAqLworaW50IGRtYV9idWZfcmVhZChwYzMwMF90ICogY2FyZCwgaW50IGNoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBuY2hhcjsKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJdm9sYXRpbGUgcGNzY2FfYmRfdCBfX2lvbWVtICpwdGRlc2NyOworCWludCByY3ZkID0gMDsKKwl2b2xhdGlsZSB1Y2NoYXIgc3RhdHVzOworCisJcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlICsKKwkJCQkgIFJYX0JEX0FERFIoY2gsIGNoYW4tPnJ4X2ZpcnN0X2JkKSk7CisJd2hpbGUgKChzdGF0dXMgPSBjcGNfcmVhZGIoJnB0ZGVzY3ItPnN0YXR1cykpICYgRFNUX09TQikgeworCQluY2hhciA9IGNwY19yZWFkdygmcHRkZXNjci0+bGVuKTsKKwkJaWYgKChzdGF0dXMgJiAoRFNUX09WUiB8IERTVF9DUkMgfCBEU1RfUkJJVCB8IERTVF9TSFJUIHwgRFNUX0FCVCkpCisJCSAgICB8fCAobmNoYXIgPiBCRF9ERUZfTEVOKSkgeworCisJCQlpZiAobmNoYXIgPiBCRF9ERUZfTEVOKQorCQkJCXN0YXR1cyB8PSBEU1RfUkJJVDsKKwkJCXJjdmQgPSAtc3RhdHVzOworCQkJLyogRGlzY2FyZCByZW1haW5pbmcgZGVzY3JpcHRvcnMgdXNlZCBieSB0aGUgYmFkIGZyYW1lICovCisJCQl3aGlsZSAoY2hhbi0+cnhfZmlyc3RfYmQgIT0gY2hhbi0+cnhfbGFzdF9iZCkgeworCQkJCWNwY193cml0ZWIoJnB0ZGVzY3ItPnN0YXR1cywgMCk7CisJCQkJY2hhbi0+cnhfZmlyc3RfYmQgPSAoY2hhbi0+cnhfZmlyc3RfYmQrMSkgJiAoTl9ETUFfUlhfQlVGLTEpOworCQkJCWlmIChzdGF0dXMgJiBEU1RfRU9NKQorCQkJCQlicmVhazsKKwkJCQlwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UgKworCQkJCQkJCSAgY3BjX3JlYWRsKCZwdGRlc2NyLT5uZXh0KSk7CisJCQkJc3RhdHVzID0gY3BjX3JlYWRiKCZwdGRlc2NyLT5zdGF0dXMpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKG5jaGFyICE9IDApIHsKKwkJCWlmIChza2IpIHsKKwkJCQltZW1jcHlfZnJvbWlvKHNrYl9wdXQoc2tiLCBuY2hhciksCisJCQkJIChjYXJkLT5ody5yYW1iYXNlK2NwY19yZWFkbCgmcHRkZXNjci0+cHRidWYpKSxuY2hhcik7CisJCQl9CisJCQlyY3ZkICs9IG5jaGFyOworCQl9CisJCWNwY193cml0ZWIoJnB0ZGVzY3ItPnN0YXR1cywgMCk7CisJCWNwY193cml0ZWIoJnB0ZGVzY3ItPmxlbiwgMCk7CisJCWNoYW4tPnJ4X2ZpcnN0X2JkID0gKGNoYW4tPnJ4X2ZpcnN0X2JkICsgMSkgJiAoTl9ETUFfUlhfQlVGIC0gMSk7CisKKwkJaWYgKHN0YXR1cyAmIERTVF9FT00pCisJCQlicmVhazsKKworCQlwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UgKyBjcGNfcmVhZGwoJnB0ZGVzY3ItPm5leHQpKTsKKwl9CisKKwlpZiAocmN2ZCAhPSAwKSB7CisJCS8qIFVwZGF0ZSBwb2ludGVyICovCisJCWNoYW4tPnJ4X2xhc3RfYmQgPSAoY2hhbi0+cnhfZmlyc3RfYmQgLSAxKSAmIChOX0RNQV9SWF9CVUYgLSAxKTsKKwkJLyogVXBkYXRlIEVEQSAqLworCQljcGNfd3JpdGVsKGNhcmQtPmh3LnNjYWJhc2UgKyBEUlhfUkVHKEVEQUwsIGNoKSwKKwkJCSAgIFJYX0JEX0FERFIoY2gsIGNoYW4tPnJ4X2xhc3RfYmQpKTsKKwl9CisJcmV0dXJuIChyY3ZkKTsKK30KKwordm9pZCB0eF9kbWFfc3RvcChwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXZvaWQgX19pb21lbSAqc2NhYmFzZSA9IGNhcmQtPmh3LnNjYWJhc2U7CisJdWNjaGFyIGRycl9lbmFfYml0ID0gMSA8PCAoNSArIDIgKiBjaCk7CisJdWNjaGFyIGRycl9yc3RfYml0ID0gMSA8PCAoMSArIDIgKiBjaCk7CisKKwkvKiBEaXNhYmxlIERNQSAqLworCWNwY193cml0ZWIoc2NhYmFzZSArIERSUiwgZHJyX2VuYV9iaXQpOworCWNwY193cml0ZWIoc2NhYmFzZSArIERSUiwgZHJyX3JzdF9iaXQgJiB+ZHJyX2VuYV9iaXQpOworfQorCit2b2lkIHJ4X2RtYV9zdG9wKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJdm9pZCBfX2lvbWVtICpzY2FiYXNlID0gY2FyZC0+aHcuc2NhYmFzZTsKKwl1Y2NoYXIgZHJyX2VuYV9iaXQgPSAxIDw8ICg0ICsgMiAqIGNoKTsKKwl1Y2NoYXIgZHJyX3JzdF9iaXQgPSAxIDw8ICgyICogY2gpOworCisJLyogRGlzYWJsZSBETUEgKi8KKwljcGNfd3JpdGViKHNjYWJhc2UgKyBEUlIsIGRycl9lbmFfYml0KTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBEUlIsIGRycl9yc3RfYml0ICYgfmRycl9lbmFfYml0KTsKK30KKwordm9pZCByeF9kbWFfc3RhcnQocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwl2b2lkIF9faW9tZW0gKnNjYWJhc2UgPSBjYXJkLT5ody5zY2FiYXNlOworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwkKKwkvKiBTdGFydCBETUEgKi8KKwljcGNfd3JpdGVsKHNjYWJhc2UgKyBEUlhfUkVHKENEQUwsIGNoKSwKKwkJICAgUlhfQkRfQUREUihjaCwgY2hhbi0+cnhfZmlyc3RfYmQpKTsKKwlpZiAoY3BjX3JlYWRsKHNjYWJhc2UgKyBEUlhfUkVHKENEQUwsY2gpKSAhPQorCQkJCSAgUlhfQkRfQUREUihjaCwgY2hhbi0+cnhfZmlyc3RfYmQpKSB7CisJCWNwY193cml0ZWwoc2NhYmFzZSArIERSWF9SRUcoQ0RBTCwgY2gpLAorCQkJCSAgIFJYX0JEX0FERFIoY2gsIGNoYW4tPnJ4X2ZpcnN0X2JkKSk7CisJfQorCWNwY193cml0ZWwoc2NhYmFzZSArIERSWF9SRUcoRURBTCwgY2gpLAorCQkgICBSWF9CRF9BRERSKGNoLCBjaGFuLT5yeF9sYXN0X2JkKSk7CisJY3BjX3dyaXRldyhzY2FiYXNlICsgRFJYX1JFRyhCRkxMLCBjaCksIEJEX0RFRl9MRU4pOworCWNwY193cml0ZWIoc2NhYmFzZSArIERTUl9SWChjaCksIERTUl9ERSk7CisJaWYgKCEoY3BjX3JlYWRiKHNjYWJhc2UgKyBEU1JfUlgoY2gpKSAmIERTUl9ERSkpIHsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBEU1JfUlgoY2gpLCBEU1JfREUpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgRkFMQyBSb3V0aW5lcyAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBmYWxjX2lzc3VlX2NtZChwYzMwMF90ICogY2FyZCwgaW50IGNoLCB1Y2NoYXIgY21kKQoreworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKwl1bnNpZ25lZCBsb25nIGkgPSAwOworCisJd2hpbGUgKGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFNJUywgY2gpKSAmIFNJU19DRUMpIHsKKwkJaWYgKGkrKyA+PSBQQzMwMF9GQUxDX01BWExPT1ApIHsKKwkJCXByaW50aygiJXM6IEZBTEMgY29tbWFuZCBsb2NrZWQoY21kPTB4JXgpLlxuIiwKKwkJCSAgICAgICBjYXJkLT5jaGFuW2NoXS5kLm5hbWUsIGNtZCk7CisJCQlicmVhazsKKwkJfQorCX0KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoQ01EUiwgY2gpLCBjbWQpOworfQorCit2b2lkIGZhbGNfaW50cl9lbmFibGUocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCisJLyogSW50ZXJydXB0IHBpbnMgYXJlIG9wZW4tZHJhaW4gKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSVBDLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElQQywgY2gpKSAmIH5JUENfSUMwKTsKKwkvKiBDb250ZXJzIHVwZGF0ZWQgZWFjaCBzZWNvbmQgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCkpIHwgRk1SMV9FQ00pOworCS8qIEVuYWJsZSBTRUMgYW5kIEVTIGludGVycnVwdHMgICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjMsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMywgY2gpKSAmIH4oSU1SM19TRUMgfCBJTVIzX0VTKSk7CisJaWYgKGNvbmYtPmZyX21vZGUgPT0gUEMzMDBfRlJfVU5GUkFNRUQpIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjQsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjQsIGNoKSkgJiB+KElNUjRfTE9TKSk7CisJfSBlbHNlIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjQsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjQsIGNoKSkgJgorCQkJICAgfihJTVI0X0xGQSB8IElNUjRfQUlTIHwgSU1SNF9MT1MgfCBJTVI0X1NMSVApKTsKKwl9CisJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIzLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIzLCBjaCkpICYgfklNUjNfTExCU0MpOworCX0gZWxzZSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJUEMsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElQQywgY2gpKSB8IElQQ19TQ0kpOworCQlpZiAoY29uZi0+ZnJfbW9kZSA9PSBQQzMwMF9GUl9VTkZSQU1FRCkgeworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjIsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIyLCBjaCkpICYgfihJTVIyX0xPUykpOworCQl9IGVsc2UgeworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjIsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIyLCBjaCkpICYKKwkJCQkgICB+KElNUjJfRkFSIHwgSU1SMl9MRkEgfCBJTVIyX0FJUyB8IElNUjJfTE9TKSk7CisJCQlpZiAocGZhbGMtPm11bHRpZnJhbWVfbW9kZSkgeworCQkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIyLCBjaCksCisJCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjIsIGNoKSkgJiAKKwkJCQkJICAgfihJTVIyX1Q0MDBNUyB8IElNUjJfTUZBUikpOworCQkJfSBlbHNlIHsKKwkJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMiwgY2gpLAorCQkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIyLCBjaCkpIHwgCisJCQkJCSAgIElNUjJfVDQwME1TIHwgSU1SMl9NRkFSKTsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBmYWxjX29wZW5fdGltZXNsb3QocGMzMDBfdCAqIGNhcmQsIGludCBjaCwgaW50IHRpbWVzbG90KQoreworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKwl1Y2NoYXIgdHNoZiA9IGNhcmQtPmNoYW5bY2hdLmZhbGMub2Zmc2V0OworCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKChJQ0IxICsgKHRpbWVzbG90IC0gdHNoZikgLyA4KSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRygoSUNCMSArICh0aW1lc2xvdCAtIHRzaGYpIC8gOCksIGNoKSkgJiAKKwkJICAgCX4oMHg4MCA+PiAoKHRpbWVzbG90IC0gdHNoZikgJiAweDA3KSkpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRygoVFRSMSArIHRpbWVzbG90IC8gOCksIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoKFRUUjEgKyB0aW1lc2xvdCAvIDgpLCBjaCkpIHwgCisgICAJCQkoMHg4MCA+PiAodGltZXNsb3QgJiAweDA3KSkpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRygoUlRSMSArIHRpbWVzbG90IC8gOCksIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoKFJUUjEgKyB0aW1lc2xvdCAvIDgpLCBjaCkpIHwgCisJCQkoMHg4MCA+PiAodGltZXNsb3QgJiAweDA3KSkpOworfQorCit2b2lkIGZhbGNfY2xvc2VfdGltZXNsb3QocGMzMDBfdCAqIGNhcmQsIGludCBjaCwgaW50IHRpbWVzbG90KQoreworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKwl1Y2NoYXIgdHNoZiA9IGNhcmQtPmNoYW5bY2hdLmZhbGMub2Zmc2V0OworCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKChJQ0IxICsgKHRpbWVzbG90IC0gdHNoZikgLyA4KSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRygoSUNCMSArICh0aW1lc2xvdCAtIHRzaGYpIC8gOCksIGNoKSkgfCAKKwkJICAgKDB4ODAgPj4gKCh0aW1lc2xvdCAtIHRzaGYpICYgMHgwNykpKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoKFRUUjEgKyB0aW1lc2xvdCAvIDgpLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKChUVFIxICsgdGltZXNsb3QgLyA4KSwgY2gpKSAmIAorCQkgICB+KDB4ODAgPj4gKHRpbWVzbG90ICYgMHgwNykpKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoKFJUUjEgKyB0aW1lc2xvdCAvIDgpLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKChSVFIxICsgdGltZXNsb3QgLyA4KSwgY2gpKSAmIAorCQkgICB+KDB4ODAgPj4gKHRpbWVzbG90ICYgMHgwNykpKTsKK30KKwordm9pZCBmYWxjX2Nsb3NlX2FsbF90aW1lc2xvdHMocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSUNCMSwgY2gpLCAweGZmKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoVFRSMSwgY2gpLCAwKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUlRSMSwgY2gpLCAwKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSUNCMiwgY2gpLCAweGZmKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoVFRSMiwgY2gpLCAwKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUlRSMiwgY2gpLCAwKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSUNCMywgY2gpLCAweGZmKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoVFRSMywgY2gpLCAwKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUlRSMywgY2gpLCAwKTsKKwlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfRTEpIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElDQjQsIGNoKSwgMHhmZik7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhUVFI0LCBjaCksIDApOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUlRSNCwgY2gpLCAwKTsKKwl9Cit9CisKK3ZvaWQgZmFsY19vcGVuX2FsbF90aW1lc2xvdHMocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSUNCMSwgY2gpLCAwKTsKKwlpZiAoY29uZi0+ZnJfbW9kZSA9PSBQQzMwMF9GUl9VTkZSQU1FRCkgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoVFRSMSwgY2gpLCAweGZmKTsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJUUjEsIGNoKSwgMHhmZik7CisJfSBlbHNlIHsKKwkJLyogVGltZXNsb3QgMCBpcyBuZXZlciBlbmFibGVkICovCisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhUVFIxLCBjaCksIDB4N2YpOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUlRSMSwgY2gpLCAweDdmKTsKKwl9CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElDQjIsIGNoKSwgMCk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFRUUjIsIGNoKSwgMHhmZik7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJUUjIsIGNoKSwgMHhmZik7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElDQjMsIGNoKSwgMCk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFRUUjMsIGNoKSwgMHhmZik7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJUUjMsIGNoKSwgMHhmZik7CisJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX0UxKSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJQ0I0LCBjaCksIDApOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoVFRSNCwgY2gpLCAweGZmKTsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJUUjQsIGNoKSwgMHhmZik7CisJfSBlbHNlIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElDQjQsIGNoKSwgMHhmZik7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhUVFI0LCBjaCksIDB4ODApOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUlRSNCwgY2gpLCAweDgwKTsKKwl9Cit9CisKK3ZvaWQgZmFsY19pbml0X3RpbWVzbG90KHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCWludCB0c2xvdDsKKworCWZvciAodHNsb3QgPSAwOyB0c2xvdCA8IHBmYWxjLT5udW1fY2hhbm5lbHM7IHRzbG90KyspIHsKKwkJaWYgKGNvbmYtPnRzbG90X2JpdG1hcCAmICgxIDw8IHRzbG90KSkgeworCQkJLy8gQ2hhbm5lbCBlbmFibGVkCisJCQlmYWxjX29wZW5fdGltZXNsb3QoY2FyZCwgY2gsIHRzbG90ICsgMSk7CisJCX0gZWxzZSB7CisJCQkvLyBDaGFubmVsIGRpc2FibGVkCisJCQlmYWxjX2Nsb3NlX3RpbWVzbG90KGNhcmQsIGNoLCB0c2xvdCArIDEpOworCQl9CisJfQorfQorCit2b2lkIGZhbGNfZW5hYmxlX2NvbW0ocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCisJaWYgKHBmYWxjLT5mdWxsX2JhbmR3aWR0aCkgeworCQlmYWxjX29wZW5fYWxsX3RpbWVzbG90cyhjYXJkLCBjaCk7CisJfSBlbHNlIHsKKwkJZmFsY19pbml0X3RpbWVzbG90KGNhcmQsIGNoKTsKKwl9CisJLy8gQ1RTL0RDRCBPTgorCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzEsCisJCSAgIGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMSkgJgorCQkgICB+KChDUExEX1JFRzFfRkFMQ19EQ0QgfCBDUExEX1JFRzFfRkFMQ19DVFMpIDw8ICgyICogY2gpKSk7Cit9CisKK3ZvaWQgZmFsY19kaXNhYmxlX2NvbW0ocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCisJaWYgKHBmYWxjLT5sb29wX2FjdGl2ZSAhPSAyKSB7CisJCWZhbGNfY2xvc2VfYWxsX3RpbWVzbG90cyhjYXJkLCBjaCk7CisJfQorCS8vIENUUy9EQ0QgT0ZGCisJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMSwKKwkJICAgY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcxKSB8CisJCSAgICgoQ1BMRF9SRUcxX0ZBTENfRENEIHwgQ1BMRF9SRUcxX0ZBTENfQ1RTKSA8PCAoMiAqIGNoKSkpOworfQorCit2b2lkIGZhbGNfaW5pdF90MShwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisJdWNjaGFyIGRqYSA9IChjaCA/IChMSU0yX0RKQTIgfCBMSU0yX0RKQTEpIDogMCk7CisKKwkvKiBTd2l0Y2ggdG8gVDEgbW9kZSAoUENNIDI0KSAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksIEZNUjFfUE1PRCk7CisKKwkvKiBXYWl0IDIwIHVzIGZvciBzZXR1cCAqLworCXVkZWxheSgyMCk7CisKKwkvKiBUcmFuc21pdCBCdWZmZXIgU2l6ZSAoMSBmcmFtZSkgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoU0lDMSwgY2gpLCBTSUMxX1hCUzApOworCisJLyogQ2xvY2sgbW9kZSAqLworCWlmIChjb25mLT5waHlzX3NldHRpbmdzLmNsb2NrX3R5cGUgPT0gQ0xPQ0tfSU5UKSB7IC8qIE1hc3RlciBtb2RlICovCisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCkpIHwgTElNMF9NQVMpOworCX0gZWxzZSB7IC8qIFNsYXZlIG1vZGUgKi8KKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSkgJiB+TElNMF9NQVMpOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTE9PUCwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTE9PUCwgY2gpKSAmIH5MT09QX1JUTSk7CisJfQorCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElQQywgY2gpLCBJUENfU0NJKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCkpICYKKwkJICAgfihGTVIwX1hDMCB8IEZNUjBfWEMxIHwgRk1SMF9SQzAgfCBGTVIwX1JDMSkpOworCisJc3dpdGNoIChjb25mLT5sY29kZSkgeworCQljYXNlIFBDMzAwX0xDX0FNSToKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpKSB8CisJCQkJICAgRk1SMF9YQzEgfCBGTVIwX1JDMSk7CisJCQkvKiBDbGVhciBDaGFubmVsIHJlZ2lzdGVyIHRvIE9OIGZvciBhbGwgY2hhbm5lbHMgKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhDQ0IxLCBjaCksIDB4ZmYpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKENDQjIsIGNoKSwgMHhmZik7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoQ0NCMywgY2gpLCAweGZmKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUEMzMDBfTENfQjhaUzoKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpKSB8CisJCQkJICAgRk1SMF9YQzAgfCBGTVIwX1hDMSB8IEZNUjBfUkMwIHwgRk1SMF9SQzEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQQzMwMF9MQ19OUlo6CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSkgfCAweDAwKTsKKwkJCWJyZWFrOworCX0KKworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSkgfCBMSU0wX0VMT1MpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSkgJiB+KExJTTBfU0NMMSB8IExJTTBfU0NMMCkpOworCS8qIFNldCBpbnRlcmZhY2UgbW9kZSB0byAyIE1CUFMgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCkpIHwgRk1SMV9JTU9EKTsKKworCXN3aXRjaCAoY29uZi0+ZnJfbW9kZSkgeworCQljYXNlIFBDMzAwX0ZSX0VTRjoKKwkJCXBmYWxjLT5tdWx0aWZyYW1lX21vZGUgPSAwOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjQsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI0LCBjaCkpIHwgRk1SNF9GTTEpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCkpIHwgCisJCQkJICAgRk1SMV9DUkMgfCBGTVIxX0VETCk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWERMMSwgY2gpLCAwKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYREwyLCBjaCksIDApOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhETDMsIGNoKSwgMCk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSkgJiB+Rk1SMF9TUkFGKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMixjaCkpIHwgRk1SMl9NQ1NQIHwgRk1SMl9TU1ApOworCQkJYnJlYWs7CisKKwkJY2FzZSBQQzMwMF9GUl9ENDoKKwkJCXBmYWxjLT5tdWx0aWZyYW1lX21vZGUgPSAxOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjQsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI0LCBjaCkpICYKKwkJCQkgICB+KEZNUjRfRk0xIHwgRk1SNF9GTTApKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpKSB8IEZNUjBfU1JBRik7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSkgJiB+Rk1SMl9TU1ApOworCQkJYnJlYWs7CisJfQorCisJLyogRW5hYmxlIEF1dG9tYXRpYyBSZXN5bmNocm9uaXphdGlvbiAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI0LCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjQsIGNoKSkgfCBGTVI0X0FVVE8pOworCisJLyogVHJhbnNtaXQgQXV0b21hdGljIFJlbW90ZSBBbGFybSAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSkgfCBGTVIyX0FYUkEpOworCisJLyogQ2hhbm5lbCB0cmFuc2xhdGlvbiBtb2RlIDEgOiBvbmUgdG8gb25lICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpKSB8IEZNUjFfQ1RNKTsKKworCS8qIE5vIHNpZ25hbGluZyAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSkgJiB+Rk1SMV9TSUdNKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SNSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI1LCBjaCkpICYKKwkJICAgfihGTVI1X0VJQlIgfCBGTVI1X1NSUykpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhDQ1IxLCBjaCksIDApOworCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTEsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMSwgY2gpKSB8IExJTTFfUklMMCB8IExJTTFfUklMMSk7CisKKwlzd2l0Y2ggKGNvbmYtPmxibykgeworCQkJLyogUHJvdmlkZXMgcHJvcGVyIExpbmUgQnVpbGQgT3V0ICovCisJCWNhc2UgUEMzMDBfTEJPXzBfREI6CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMiwgY2gpLCAoTElNMl9MT1MxIHwgZGphKSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMCwgY2gpLCAweDVhKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0xLCBjaCksIDB4OGYpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTIsIGNoKSwgMHgyMCk7CisJCQlicmVhazsKKwkJY2FzZSBQQzMwMF9MQk9fN181X0RCOgorCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTIsIGNoKSwgKDB4NDAgfCBMSU0yX0xPUzEgfCBkamEpKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0wLCBjaCksIDB4MTEpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTEsIGNoKSwgMHgwMik7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMiwgY2gpLCAweDIwKTsKKwkJCWJyZWFrOworCQljYXNlIFBDMzAwX0xCT18xNV9EQjoKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0yLCBjaCksICgweDgwIHwgTElNMl9MT1MxIHwgZGphKSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMCwgY2gpLCAweDhlKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0xLCBjaCksIDB4MDEpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTIsIGNoKSwgMHgyMCk7CisJCQlicmVhazsKKwkJY2FzZSBQQzMwMF9MQk9fMjJfNV9EQjoKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0yLCBjaCksICgweGMwIHwgTElNMl9MT1MxIHwgZGphKSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMCwgY2gpLCAweDA5KTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0xLCBjaCksIDB4MDEpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTIsIGNoKSwgMHgyMCk7CisJCQlicmVhazsKKwl9CisKKwkvKiBUcmFuc21pdCBDbG9jay1TbG90IE9mZnNldCAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYQzAsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWEMwLCBjaCkpIHwgMHgwMSk7CisJLyogVHJhbnNtaXQgVGltZS1zbG90IE9mZnNldCAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYQzEsIGNoKSwgMHgzZSk7CisJLyogUmVjZWl2ZSAgQ2xvY2stU2xvdCBvZmZzZXQgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUkMwLCBjaCksIDB4MDUpOworCS8qIFJlY2VpdmUgIFRpbWUtc2xvdCBvZmZzZXQgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUkMxLCBjaCksIDB4MDApOworCisJLyogTE9TIERldGVjdGlvbiBhZnRlciAxNzYgY29uc2VjdXRpdmUgMHMgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUENEUiwgY2gpLCAweDBhKTsKKwkvKiBMT1MgUmVjb3ZlcnkgYWZ0ZXIgMjIgb25lcyBpbiB0aGUgdGltZSB3aW5kb3cgb2YgUENEICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFBDUlIsIGNoKSwgMHgxNSk7CisKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSURMRSwgY2gpLCAweDdmKTsKKworCWlmIChjb25mLT5mcl9tb2RlID09IFBDMzAwX0ZSX0VTRl9KQVBBTikgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUkMxLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhSQzEsIGNoKSkgfCAweDgwKTsKKwl9CisKKwlmYWxjX2Nsb3NlX2FsbF90aW1lc2xvdHMoY2FyZCwgY2gpOworfQorCit2b2lkIGZhbGNfaW5pdF9lMShwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisJdWNjaGFyIGRqYSA9IChjaCA/IChMSU0yX0RKQTIgfCBMSU0yX0RKQTEpIDogMCk7CisKKwkvKiBTd2l0Y2ggdG8gRTEgbW9kZSAoUENNIDMwKSAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSkgJiB+Rk1SMV9QTU9EKTsKKworCS8qIENsb2NrIG1vZGUgKi8KKwlpZiAoY29uZi0+cGh5c19zZXR0aW5ncy5jbG9ja190eXBlID09IENMT0NLX0lOVCkgeyAvKiBNYXN0ZXIgbW9kZSAqLworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpKSB8IExJTTBfTUFTKTsKKwl9IGVsc2UgeyAvKiBTbGF2ZSBtb2RlICovCisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCkpICYgfkxJTTBfTUFTKTsKKwl9CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExPT1AsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTE9PUCwgY2gpKSAmIH5MT09QX1NGTSk7CisKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSVBDLCBjaCksIElQQ19TQ0kpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSkgJgorCQkgICB+KEZNUjBfWEMwIHwgRk1SMF9YQzEgfCBGTVIwX1JDMCB8IEZNUjBfUkMxKSk7CisKKwlzd2l0Y2ggKGNvbmYtPmxjb2RlKSB7CisJCWNhc2UgUEMzMDBfTENfQU1JOgorCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCkpIHwKKwkJCQkgICBGTVIwX1hDMSB8IEZNUjBfUkMxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUEMzMDBfTENfSERCMzoKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpKSB8CisJCQkJICAgRk1SMF9YQzAgfCBGTVIwX1hDMSB8IEZNUjBfUkMwIHwgRk1SMF9SQzEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQQzMwMF9MQ19OUlo6CisJCQlicmVhazsKKwl9CisKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCkpICYgfihMSU0wX1NDTDEgfCBMSU0wX1NDTDApKTsKKwkvKiBTZXQgaW50ZXJmYWNlIG1vZGUgdG8gMiBNQlBTICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpKSB8IEZNUjFfSU1PRCk7CisKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMCwgY2gpLCAweDE4KTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMSwgY2gpLCAweDAzKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMiwgY2gpLCAweDAwKTsKKworCXN3aXRjaCAoY29uZi0+ZnJfbW9kZSkgeworCQljYXNlIFBDMzAwX0ZSX01GX0NSQzQ6CisJCQlwZmFsYy0+bXVsdGlmcmFtZV9tb2RlID0gMTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpKSB8IEZNUjFfWEZTKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpKSB8IEZNUjJfUkZTMSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSkgJiB+Rk1SMl9SRlMwKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIzLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMywgY2gpKSAmIH5GTVIzX0VYVElXKTsKKworCQkJLyogTXVsdGlGcmFtZSBSZXN5bmNocm9uaXphdGlvbiAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCkpIHwgRk1SMV9NRkNTKTsKKworCQkJLyogQXV0b21hdGljIExvc3Mgb2YgTXVsdGlmcmFtZSA+IDkxNCBDUkMgZXJyb3JzICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSkgfCBGTVIyX0FMTUYpOworCisJCQkvKiBTMSBhbmQgU0kxL1NJMiBzcGFyZSBCaXRzIHNldCB0byAxICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCkpICYgflhTUF9BWFMpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpKSB8IFhTUF9FQlApOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpKSB8IFhTUF9YUzEzIHwgWFNQX1hTMTUpOworCisJCQkvKiBBdXRvbWF0aWMgRm9yY2UgUmVzeW5jaHJvbml6YXRpb24gKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpKSB8IEZNUjFfQUZSKTsKKworCQkJLyogVHJhbnNtaXQgQXV0b21hdGljIFJlbW90ZSBBbGFybSAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCkpIHwgRk1SMl9BWFJBKTsKKworCQkJLyogVHJhbnNtaXQgU3BhcmUgQml0cyBmb3IgTmF0aW9uYWwgVXNlIChZLCBTbiwgU2EpICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFNXLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWFNXLCBjaCkpIHwKKwkJCQkgICBYU1dfWFkwIHwgWFNXX1hZMSB8IFhTV19YWTIgfCBYU1dfWFkzIHwgWFNXX1hZNCk7CisJCQlicmVhazsKKworCQljYXNlIFBDMzAwX0ZSX01GX05PTl9DUkM0OgorCQljYXNlIFBDMzAwX0ZSX0Q0OgorCQkJcGZhbGMtPm11bHRpZnJhbWVfbW9kZSA9IDA7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSkgJiB+Rk1SMV9YRlMpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCkpICYgCisJCQkJICAgfihGTVIyX1JGUzEgfCBGTVIyX1JGUzApKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYU1csIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYU1csIGNoKSkgfCBYU1dfWFNJUyk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCkpIHwgWFNQX1hTSUYpOworCisJCQkvKiBBdXRvbWF0aWMgRm9yY2UgUmVzeW5jaHJvbml6YXRpb24gKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpKSB8IEZNUjFfQUZSKTsKKworCQkJLyogVHJhbnNtaXQgQXV0b21hdGljIFJlbW90ZSBBbGFybSAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCkpIHwgRk1SMl9BWFJBKTsKKworCQkJLyogVHJhbnNtaXQgU3BhcmUgQml0cyBmb3IgTmF0aW9uYWwgVXNlIChZLCBTbiwgU2EpICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFNXLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWFNXLCBjaCkpIHwKKwkJCQkgICBYU1dfWFkwIHwgWFNXX1hZMSB8IFhTV19YWTIgfCBYU1dfWFkzIHwgWFNXX1hZNCk7CisJCQlicmVhazsKKworCQljYXNlIFBDMzAwX0ZSX1VORlJBTUVEOgorCQkJcGZhbGMtPm11bHRpZnJhbWVfbW9kZSA9IDA7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSkgJiB+Rk1SMV9YRlMpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCkpICYgCisJCQkJICAgfihGTVIyX1JGUzEgfCBGTVIyX1JGUzApKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSkgfCBYU1BfVFQwKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYU1csIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYU1csIGNoKSkgJiAKKwkJCQkgICB+KFhTV19YVE18WFNXX1hZMHxYU1dfWFkxfFhTV19YWTJ8WFNXX1hZM3xYU1dfWFk0KSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoVFNXTSwgY2gpLCAweGZmKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpKSB8CisJCQkJICAgKEZNUjJfUlRNIHwgRk1SMl9EQUlTKSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSkgJiB+Rk1SMl9BWFJBKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpKSAmIH5GTVIxX0FGUik7CisJCQlwZmFsYy0+c3luYyA9IDE7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMikgfAorCQkJCSAgIChDUExEX1JFRzJfRkFMQ19MRUQyIDw8ICgyICogY2gpKSk7CisJCQlicmVhazsKKwl9CisKKwkvKiBObyBzaWduYWxpbmcgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpKSAmIH5YU1BfQ0FTRU4pOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhDQ1IxLCBjaCksIDApOworCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTEsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMSwgY2gpKSB8IExJTTFfUklMMCB8IExJTTFfUklMMSk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTIsIGNoKSwgKExJTTJfTE9TMSB8IGRqYSkpOworCisJLyogVHJhbnNtaXQgQ2xvY2stU2xvdCBPZmZzZXQgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWEMwLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhDMCwgY2gpKSB8IDB4MDEpOworCS8qIFRyYW5zbWl0IFRpbWUtc2xvdCBPZmZzZXQgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWEMxLCBjaCksIDB4M2UpOworCS8qIFJlY2VpdmUgIENsb2NrLVNsb3Qgb2Zmc2V0ICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJDMCwgY2gpLCAweDA1KTsKKwkvKiBSZWNlaXZlICBUaW1lLXNsb3Qgb2Zmc2V0ICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJDMSwgY2gpLCAweDAwKTsKKworCS8qIExPUyBEZXRlY3Rpb24gYWZ0ZXIgMTc2IGNvbnNlY3V0aXZlIDBzICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFBDRFIsIGNoKSwgMHgwYSk7CisJLyogTE9TIFJlY292ZXJ5IGFmdGVyIDIyIG9uZXMgaW4gdGhlIHRpbWUgd2luZG93IG9mIFBDRCAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhQQ1JSLCBjaCksIDB4MTUpOworCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElETEUsIGNoKSwgMHg3Zik7CisKKwlmYWxjX2Nsb3NlX2FsbF90aW1lc2xvdHMoY2FyZCwgY2gpOworfQorCit2b2lkIGZhbGNfaW5pdF9oZGxjKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCisJLyogRW5hYmxlIHRyYW5zcGFyZW50IGRhdGEgdHJhbnNmZXIgKi8KKwlpZiAoY29uZi0+ZnJfbW9kZSA9PSBQQzMwMF9GUl9VTkZSQU1FRCkgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTU9ERSwgY2gpLCAwKTsKKwl9IGVsc2UgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTU9ERSwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTU9ERSwgY2gpKSB8CisJCQkgICAoTU9ERV9IUkFDIHwgTU9ERV9NRFMyKSk7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSQUgyLCBjaCksIDB4ZmYpOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUkFIMSwgY2gpLCAweGZmKTsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJBTDIsIGNoKSwgMHhmZik7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSQUwxLCBjaCksIDB4ZmYpOworCX0KKworCS8qIFR4L1J4IHJlc2V0ICAqLworCWZhbGNfaXNzdWVfY21kKGNhcmQsIGNoLCBDTURSX1JSRVMgfCBDTURSX1hSRVMgfCBDTURSX1NSRVMpOworCisJLyogRW5hYmxlIGludGVycnVwdCBzb3VyY2VzICovCisJZmFsY19pbnRyX2VuYWJsZShjYXJkLCBjaCk7Cit9CisKK3ZvaWQgdGVfY29uZmlnKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKwl1Y2NoYXIgZHVtbXk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW1lbXNldChwZmFsYywgMCwgc2l6ZW9mKGZhbGNfdCkpOworCXN3aXRjaCAoY29uZi0+bWVkaWEpIHsKKwkJY2FzZSBJRl9JRkFDRV9UMToKKwkJCXBmYWxjLT5udW1fY2hhbm5lbHMgPSBOVU1fT0ZfVDFfQ0hBTk5FTFM7CisJCQlwZmFsYy0+b2Zmc2V0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIElGX0lGQUNFX0UxOgorCQkJcGZhbGMtPm51bV9jaGFubmVscyA9IE5VTV9PRl9FMV9DSEFOTkVMUzsKKwkJCXBmYWxjLT5vZmZzZXQgPSAwOworCQkJYnJlYWs7CisJfQorCWlmIChjb25mLT50c2xvdF9iaXRtYXAgPT0gMHhmZmZmZmZmZlVMKQorCQlwZmFsYy0+ZnVsbF9iYW5kd2lkdGggPSAxOworCWVsc2UKKwkJcGZhbGMtPmZ1bGxfYmFuZHdpZHRoID0gMDsKKworCUNQQ19MT0NLKGNhcmQsIGZsYWdzKTsKKwkvKiBSZXNldCB0aGUgRkFMQyBjaGlwICovCisJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMSwKKwkJICAgY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcxKSB8CisJCSAgIChDUExEX1JFRzFfRkFMQ19SRVNFVCA8PCAoMiAqIGNoKSkpOworCXVkZWxheSgxMDAwMCk7CisJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMSwKKwkJICAgY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcxKSAmCisJCSAgIH4oQ1BMRF9SRUcxX0ZBTENfUkVTRVQgPDwgKDIgKiBjaCkpKTsKKworCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQlmYWxjX2luaXRfdDEoY2FyZCwgY2gpOworCX0gZWxzZSB7CisJCWZhbGNfaW5pdF9lMShjYXJkLCBjaCk7CisJfQorCWZhbGNfaW5pdF9oZGxjKGNhcmQsIGNoKTsKKwlpZiAoY29uZi0+cnhfc2VucyA9PSBQQzMwMF9SWF9TRU5TX1NIKSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCkpICYgfkxJTTBfRVFPTik7CisJfSBlbHNlIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSkgfCBMSU0wX0VRT04pOworCX0KKwljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkgICBjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIpIHwKKwkJICAgKChDUExEX1JFRzJfRkFMQ19UWF9DTEsgfCBDUExEX1JFRzJfRkFMQ19SWF9DTEspIDw8ICgyICogY2gpKSk7CisKKwkvKiBDbGVhciBhbGwgaW50ZXJydXB0IHJlZ2lzdGVycyAqLworCWR1bW15ID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRklTUjAsIGNoKSkgKworCQljcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGSVNSMSwgY2gpKSArCisJCWNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZJU1IyLCBjaCkpICsKKwkJY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRklTUjMsIGNoKSk7CisJQ1BDX1VOTE9DSyhjYXJkLCBmbGFncyk7Cit9CisKK3ZvaWQgZmFsY19jaGVja19zdGF0dXMocGMzMDBfdCAqIGNhcmQsIGludCBjaCwgdW5zaWduZWQgY2hhciBmcnMwKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisKKwkvKiBWZXJpZnkgTE9TICovCisJaWYgKGZyczAgJiBGUlMwX0xPUykgeworCQlpZiAoIXBmYWxjLT5yZWRfYWxhcm0pIHsKKwkJCXBmYWxjLT5yZWRfYWxhcm0gPSAxOworCQkJcGZhbGMtPmxvcysrOworCQkJaWYgKCFwZmFsYy0+Ymx1ZV9hbGFybSkgeworCQkJCS8vIEVWRU5UX0ZBTENfQUJOT1JNQUwKKwkJCQlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJCQkJLyogRGlzYWJsZSB0aGlzIGludGVycnVwdCBhcyBpdCBtYXkgb3RoZXJ3aXNlIGludGVyZmVyZSAKKwkJCQkJICogd2l0aCBvdGhlciB3b3JraW5nIGJvYXJkcy4gKi8KKwkJCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSwgCisJCQkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCkpCisJCQkJCQkgICB8IElNUjBfUERFTik7CisJCQkJfQorCQkJCWZhbGNfZGlzYWJsZV9jb21tKGNhcmQsIGNoKTsKKwkJCQkvLyBFVkVOVF9GQUxDX0FCTk9STUFMCisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAocGZhbGMtPnJlZF9hbGFybSkgeworCQkJcGZhbGMtPnJlZF9hbGFybSA9IDA7CisJCQlwZmFsYy0+bG9zcisrOworCQl9CisJfQorCisJaWYgKGNvbmYtPmZyX21vZGUgIT0gUEMzMDBfRlJfVU5GUkFNRUQpIHsKKwkJLyogVmVyaWZ5IEFJUyBhbGFybSAqLworCQlpZiAoZnJzMCAmIEZSUzBfQUlTKSB7CisJCQlpZiAoIXBmYWxjLT5ibHVlX2FsYXJtKSB7CisJCQkJcGZhbGMtPmJsdWVfYWxhcm0gPSAxOworCQkJCXBmYWxjLT5haXMrKzsKKwkJCQkvLyBFVkVOVF9BSVMKKwkJCQlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJCQkJLyogRGlzYWJsZSB0aGlzIGludGVycnVwdCBhcyBpdCBtYXkgb3RoZXJ3aXNlIGludGVyZmVyZSB3aXRoICAgICAgICAgICAgICAgICAgICAgICBvdGhlciB3b3JraW5nIGJvYXJkcy4gKi8KKwkJCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSwKKwkJCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSkgfCBJTVIwX1BERU4pOworCQkJCX0KKwkJCQlmYWxjX2Rpc2FibGVfY29tbShjYXJkLCBjaCk7CisJCQkJLy8gRVZFTlRfQUlTCisJCQl9CisJCX0gZWxzZSB7CisJCQlwZmFsYy0+Ymx1ZV9hbGFybSA9IDA7CisJCX0KKworCQkvKiBWZXJpZnkgTEZBICovCisJCWlmIChmcnMwICYgRlJTMF9MRkEpIHsKKwkJCWlmICghcGZhbGMtPmxvc3NfZmEpIHsKKwkJCQlwZmFsYy0+bG9zc19mYSA9IDE7CisJCQkJcGZhbGMtPmxmYSsrOworCQkJCWlmICghcGZhbGMtPmJsdWVfYWxhcm0gJiYgIXBmYWxjLT5yZWRfYWxhcm0pIHsKKwkJCQkJLy8gRVZFTlRfRkFMQ19BQk5PUk1BTAorCQkJCQlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJCQkJCS8qIERpc2FibGUgdGhpcyBpbnRlcnJ1cHQgYXMgaXQgbWF5IG90aGVyd2lzZSAKKwkJCQkJCSAqIGludGVyZmVyZSB3aXRoIG90aGVyIHdvcmtpbmcgYm9hcmRzLiAqLworCQkJCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSwKKwkJCQkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCkpCisJCQkJCQkJICAgfCBJTVIwX1BERU4pOworCQkJCQl9CisJCQkJCWZhbGNfZGlzYWJsZV9jb21tKGNhcmQsIGNoKTsKKwkJCQkJLy8gRVZFTlRfRkFMQ19BQk5PUk1BTAorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwZmFsYy0+bG9zc19mYSkgeworCQkJCXBmYWxjLT5sb3NzX2ZhID0gMDsKKwkJCQlwZmFsYy0+ZmFyZWMrKzsKKwkJCX0KKwkJfQorCisJCS8qIFZlcmlmeSBMTUZBICovCisJCWlmIChwZmFsYy0+bXVsdGlmcmFtZV9tb2RlICYmIChmcnMwICYgRlJTMF9MTUZBKSkgeworCQkJLyogRDQgb3IgQ1JDNCBmcmFtZSBtb2RlICovCisJCQlpZiAoIXBmYWxjLT5sb3NzX21mYSkgeworCQkJCXBmYWxjLT5sb3NzX21mYSA9IDE7CisJCQkJcGZhbGMtPmxtZmErKzsKKwkJCQlpZiAoIXBmYWxjLT5ibHVlX2FsYXJtICYmICFwZmFsYy0+cmVkX2FsYXJtICYmCisJCQkJICAgICFwZmFsYy0+bG9zc19mYSkgeworCQkJCQkvLyBFVkVOVF9GQUxDX0FCTk9STUFMCisJCQkJCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQkJCQkJLyogRGlzYWJsZSB0aGlzIGludGVycnVwdCBhcyBpdCBtYXkgb3RoZXJ3aXNlIAorCQkJCQkJICogaW50ZXJmZXJlIHdpdGggb3RoZXIgd29ya2luZyBib2FyZHMuICovCisJCQkJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpLAorCQkJCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSkKKwkJCQkJCQkgICB8IElNUjBfUERFTik7CisJCQkJCX0KKwkJCQkJZmFsY19kaXNhYmxlX2NvbW0oY2FyZCwgY2gpOworCQkJCQkvLyBFVkVOVF9GQUxDX0FCTk9STUFMCisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJcGZhbGMtPmxvc3NfbWZhID0gMDsKKwkJfQorCisJCS8qIFZlcmlmeSBSZW1vdGUgQWxhcm0gKi8KKwkJaWYgKGZyczAgJiBGUlMwX1JSQSkgeworCQkJaWYgKCFwZmFsYy0+eWVsbG93X2FsYXJtKSB7CisJCQkJcGZhbGMtPnllbGxvd19hbGFybSA9IDE7CisJCQkJcGZhbGMtPnJhaSsrOworCQkJCWlmIChwZmFsYy0+c3luYykgeworCQkJCQkvLyBFVkVOVF9SQUkKKwkJCQkJZmFsY19kaXNhYmxlX2NvbW0oY2FyZCwgY2gpOworCQkJCQkvLyBFVkVOVF9SQUkKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlwZmFsYy0+eWVsbG93X2FsYXJtID0gMDsKKwkJfQorCX0gLyogaWYgIVBDMzAwX1VORlJBTUVEICovCisKKwlpZiAocGZhbGMtPnJlZF9hbGFybSB8fCBwZmFsYy0+bG9zc19mYSB8fAorCSAgICBwZmFsYy0+bG9zc19tZmEgfHwgcGZhbGMtPmJsdWVfYWxhcm0pIHsKKwkJaWYgKHBmYWxjLT5zeW5jKSB7CisJCQlwZmFsYy0+c3luYyA9IDA7CisJCQljaGFuLT5kLmxpbmVfb2ZmKys7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMikgJgorCQkJCSAgIH4oQ1BMRF9SRUcyX0ZBTENfTEVEMiA8PCAoMiAqIGNoKSkpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCFwZmFsYy0+c3luYykgeworCQkJcGZhbGMtPnN5bmMgPSAxOworCQkJY2hhbi0+ZC5saW5lX29uKys7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMikgfAorCQkJCSAgIChDUExEX1JFRzJfRkFMQ19MRUQyIDw8ICgyICogY2gpKSk7CisJCX0KKwl9CisKKwlpZiAocGZhbGMtPnN5bmMgJiYgIXBmYWxjLT55ZWxsb3dfYWxhcm0pIHsKKwkJaWYgKCFwZmFsYy0+YWN0aXZlKSB7CisJCQkvLyBFVkVOVF9GQUxDX05PUk1BTAorCQkJaWYgKHBmYWxjLT5sb29wX2FjdGl2ZSkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCksCisJCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSkgJiB+SU1SMF9QREVOKTsKKwkJCX0KKwkJCWZhbGNfZW5hYmxlX2NvbW0oY2FyZCwgY2gpOworCQkJLy8gRVZFTlRfRkFMQ19OT1JNQUwKKwkJCXBmYWxjLT5hY3RpdmUgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHBmYWxjLT5hY3RpdmUpIHsKKwkJCXBmYWxjLT5hY3RpdmUgPSAwOworCQl9CisJfQorfQorCit2b2lkIGZhbGNfdXBkYXRlX3N0YXRzKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKwl1Y3Nob3J0IGNvdW50ZXI7CisKKwljb3VudGVyID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRkVDTCwgY2gpKTsKKwljb3VudGVyIHw9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZFQ0gsIGNoKSkgPDwgODsKKwlwZmFsYy0+ZmVjICs9IGNvdW50ZXI7CisKKwljb3VudGVyID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoQ1ZDTCwgY2gpKTsKKwljb3VudGVyIHw9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKENWQ0gsIGNoKSkgPDwgODsKKwlwZmFsYy0+Y3ZjICs9IGNvdW50ZXI7CisKKwljb3VudGVyID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoQ0VDTCwgY2gpKTsKKwljb3VudGVyIHw9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKENFQ0gsIGNoKSkgPDwgODsKKwlwZmFsYy0+Y2VjICs9IGNvdW50ZXI7CisKKwljb3VudGVyID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRUJDTCwgY2gpKTsKKwljb3VudGVyIHw9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEVCQ0gsIGNoKSkgPDwgODsKKwlwZmFsYy0+ZWJjICs9IGNvdW50ZXI7CisKKwlpZiAoY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTENSMSwgY2gpKSAmIExDUjFfRVBSTSkgeworCQltZGVsYXkoMTApOworCQljb3VudGVyID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoQkVDTCwgY2gpKTsKKwkJY291bnRlciB8PSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhCRUNILCBjaCkpIDw8IDg7CisJCXBmYWxjLT5iZWMgKz0gY291bnRlcjsKKworCQlpZiAoKChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgJiYKKwkJICAgICAoY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRlJTMSwgY2gpKSAmIEZSUzFfTExCQUQpICYmCisJCSAgICAgKCEoY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRlJTMSwgY2gpKSAmIEZSUzFfUERFTikpKQorCQkgICAgfHwKKwkJICAgICgoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfRTEpICYmCisJCSAgICAgKGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFJTUCwgY2gpKSAmIFJTUF9MTEJBRCkpKSB7CisJCQlwZmFsYy0+cHJicyA9IDI7CisJCX0gZWxzZSB7CisJCQlwZmFsYy0+cHJicyA9IDE7CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZmFsY19yZW1vdGVfbG9vcAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZXNjcmlwdGlvbjoJSW4gdGhlIHJlbW90ZSBsb29wYmFjayBtb2RlIHRoZSBjbG9jayBhbmQgZGF0YSByZWNvdmVyZWQKKyAqCQlmcm9tIHRoZSBsaW5lIGlucHV0cyBSTDEvMiBvciBSRElQL1JESU4gYXJlIHJvdXRlZCBiYWNrCisgKgkJdG8gdGhlIGxpbmUgb3V0cHV0cyBYTDEvMiBvciBYRE9QL1hET04gdmlhIHRoZSBhbmFsb2cKKyAqCQl0cmFuc21pdHRlci4gQXMgaW4gbm9ybWFsIG1vZGUgdGhleSBhcmUgcHJvY2Vzc3NlZCBieQorICoJCXRoZSBzeW5jaHJvbml6ZXIgYW5kIHRoZW4gc2VudCB0byB0aGUgc3lzdGVtIGludGVyZmFjZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZhbGNfcmVtb3RlX2xvb3AocGMzMDBfdCAqIGNhcmQsIGludCBjaCwgaW50IGxvb3Bfb24pCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKworCWlmIChsb29wX29uKSB7CisJCS8vIEVWRU5UX0ZBTENfQUJOT1JNQUwKKwkJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCQkvKiBEaXNhYmxlIHRoaXMgaW50ZXJydXB0IGFzIGl0IG1heSBvdGhlcndpc2UgaW50ZXJmZXJlIHdpdGggCisJCQkgKiBvdGhlciB3b3JraW5nIGJvYXJkcy4gKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpKSB8IElNUjBfUERFTik7CisJCX0KKwkJZmFsY19kaXNhYmxlX2NvbW0oY2FyZCwgY2gpOworCQkvLyBFVkVOVF9GQUxDX0FCTk9STUFMCisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0xLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0xLCBjaCkpIHwgTElNMV9STCk7CisJCXBmYWxjLT5sb29wX2FjdGl2ZSA9IDE7CisJfSBlbHNlIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTEsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTEsIGNoKSkgJiB+TElNMV9STCk7CisJCXBmYWxjLT5zeW5jID0gMDsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMikgJgorCQkJICAgfihDUExEX1JFRzJfRkFMQ19MRUQyIDw8ICgyICogY2gpKSk7CisJCXBmYWxjLT5hY3RpdmUgPSAwOworCQlmYWxjX2lzc3VlX2NtZChjYXJkLCBjaCwgQ01EUl9YUkVTKTsKKwkJcGZhbGMtPmxvb3BfYWN0aXZlID0gMDsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZmFsY19sb2NhbF9sb29wCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlc2NyaXB0aW9uOiBUaGUgbG9jYWwgbG9vcGJhY2sgbW9kZSBkaXNjb25uZWN0cyB0aGUgcmVjZWl2ZSBsaW5lcyAKKyAqCQlSTDEvUkwyIHJlc3AuIFJESVAvUkRJTiBmcm9tIHRoZSByZWNlaXZlci4gSW5zdGVhZCBvZiB0aGUKKyAqCQlzaWduYWxzIGNvbWluZyBmcm9tIHRoZSBsaW5lIHRoZSBkYXRhIHByb3ZpZGVkIGJ5IHN5c3RlbQorICoJCWludGVyZmFjZSBhcmUgcm91dGVkIHRocm91Z2ggdGhlIGFuYWxvZyByZWNlaXZlciBiYWNrIHRvCisgKgkJdGhlIHN5c3RlbSBpbnRlcmZhY2UuIFRoZSB1bmlwb2xhciBiaXQgc3RyZWFtIHdpbGwgYmUKKyAqCQl1bmRpc3R1cmJlZCB0cmFuc21pdHRlZCBvbiB0aGUgbGluZS4gUmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyCisgKgkJY29kaW5nIG11c3QgYmUgaWRlbnRpY2FsLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgZmFsY19sb2NhbF9sb29wKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gsIGludCBsb29wX29uKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCisJaWYgKGxvb3Bfb24pIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSkgfCBMSU0wX0xMKTsKKwkJcGZhbGMtPmxvb3BfYWN0aXZlID0gMTsKKwl9IGVsc2UgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpKSAmIH5MSU0wX0xMKTsKKwkJcGZhbGMtPmxvb3BfYWN0aXZlID0gMDsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZmFsY19wYXlsb2FkX2xvb3AKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSBhbGxvd3MgdG8gZW5hYmxlL2Rpc2FibGUgcGF5bG9hZCBsb29wYmFjay4KKyAqCQlXaGVuIHRoZSBwYXlsb2FkIGxvb3AgaXMgYWN0aXZhdGVkLCB0aGUgcmVjZWl2ZWQgMTkyIGJpdHMKKyAqCQlvZiBwYXlsb2FkIGRhdGEgd2lsbCBiZSBsb29wZWQgYmFjayB0byB0aGUgdHJhbnNtaXQKKyAqCQlkaXJlY3Rpb24uIFRoZSBmcmFtaW5nIGJpdHMsIENSQzYgYW5kIERMIGJpdHMgYXJlIG5vdCAKKyAqCQlsb29wZWQuIFRoZXkgYXJlIG9yaWdpbmF0ZWQgYnkgdGhlIEZBTEMtTEggdHJhbnNtaXR0ZXIuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBmYWxjX3BheWxvYWRfbG9vcChwYzMwMF90ICogY2FyZCwgaW50IGNoLCBpbnQgbG9vcF9vbikKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCisJaWYgKGxvb3Bfb24pIHsKKwkJLy8gRVZFTlRfRkFMQ19BQk5PUk1BTAorCQlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJCS8qIERpc2FibGUgdGhpcyBpbnRlcnJ1cHQgYXMgaXQgbWF5IG90aGVyd2lzZSBpbnRlcmZlcmUgd2l0aCAKKwkJCSAqIG90aGVyIHdvcmtpbmcgYm9hcmRzLiAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCkpIHwgSU1SMF9QREVOKTsKKwkJfQorCQlmYWxjX2Rpc2FibGVfY29tbShjYXJkLCBjaCk7CisJCS8vIEVWRU5UX0ZBTENfQUJOT1JNQUwKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSkgfCBGTVIyX1BMQik7CisJCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjQsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI0LCBjaCkpIHwgRk1SNF9UTSk7CisJCX0gZWxzZSB7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SNSwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjUsIGNoKSkgfCBYU1BfVFQwKTsKKwkJfQorCQlmYWxjX29wZW5fYWxsX3RpbWVzbG90cyhjYXJkLCBjaCk7CisJCXBmYWxjLT5sb29wX2FjdGl2ZSA9IDI7CisJfSBlbHNlIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSkgJiB+Rk1SMl9QTEIpOworCQlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI0LCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SNCwgY2gpKSAmIH5GTVI0X1RNKTsKKwkJfSBlbHNlIHsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI1LCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SNSwgY2gpKSAmIH5YU1BfVFQwKTsKKwkJfQorCQlwZmFsYy0+c3luYyA9IDA7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIpICYKKwkJCSAgIH4oQ1BMRF9SRUcyX0ZBTENfTEVEMiA8PCAoMiAqIGNoKSkpOworCQlwZmFsYy0+YWN0aXZlID0gMDsKKwkJZmFsY19pc3N1ZV9jbWQoY2FyZCwgY2gsIENNRFJfWFJFUyk7CisJCXBmYWxjLT5sb29wX2FjdGl2ZSA9IDA7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHR1cm5fb2ZmX3hsdQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZXNjcmlwdGlvbjoJVHVybnMgWExVIGJpdCBvZmYgaW4gdGhlIHByb3BlciByZWdpc3RlcgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgdHVybl9vZmZfeGx1KHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCisJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI1LCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI1LCBjaCkpICYgfkZNUjVfWExVKTsKKwl9IGVsc2UgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMywgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMywgY2gpKSAmIH5GTVIzX1hMVSk7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHR1cm5fb2ZmX3hsZAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZXNjcmlwdGlvbjogVHVybnMgWExEIGJpdCBvZmYgaW4gdGhlIHByb3BlciByZWdpc3RlcgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgdHVybl9vZmZfeGxkKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCisJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI1LCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI1LCBjaCkpICYgfkZNUjVfWExEKTsKKwl9IGVsc2UgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMywgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMywgY2gpKSAmIH5GTVIzX1hMRCk7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZhbGNfZ2VuZXJhdGVfbG9vcF91cF9jb2RlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlc2NyaXB0aW9uOglUaGlzIHJvdXRpbmUgd3JpdGVzIHRoZSBwcm9wZXIgRkFMQyBjaGlwIHJlZ2lzdGVyIGluIG9yZGVyCisgKgkJdG8gZ2VuZXJhdGUgYSBMT09QIGFjdGl2YXRpb24gY29kZSBvdmVyIGEgVDEvRTEgbGluZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZhbGNfZ2VuZXJhdGVfbG9vcF91cF9jb2RlKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKworCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SNSwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SNSwgY2gpKSB8IEZNUjVfWExVKTsKKwl9IGVsc2UgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMywgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMywgY2gpKSB8IEZNUjNfWExVKTsKKwl9CisJLy8gRVZFTlRfRkFMQ19BQk5PUk1BTAorCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQkvKiBEaXNhYmxlIHRoaXMgaW50ZXJydXB0IGFzIGl0IG1heSBvdGhlcndpc2UgaW50ZXJmZXJlIHdpdGggCisJCSAqIG90aGVyIHdvcmtpbmcgYm9hcmRzLiAqLworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpKSB8IElNUjBfUERFTik7CisJfQorCWZhbGNfZGlzYWJsZV9jb21tKGNhcmQsIGNoKTsKKwkvLyBFVkVOVF9GQUxDX0FCTk9STUFMCisJcGZhbGMtPmxvb3BfZ2VuID0gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmYWxjX2dlbmVyYXRlX2xvb3BfZG93bl9jb2RlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlc2NyaXB0aW9uOglUaGlzIHJvdXRpbmUgd3JpdGVzIHRoZSBwcm9wZXIgRkFMQyBjaGlwIHJlZ2lzdGVyIGluIG9yZGVyCisgKgkJdG8gZ2VuZXJhdGUgYSBMT09QIGRlYWN0aXZhdGlvbiBjb2RlIG92ZXIgYSBUMS9FMSBsaW5lLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgZmFsY19nZW5lcmF0ZV9sb29wX2Rvd25fY29kZShwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisKKwlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjUsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjUsIGNoKSkgfCBGTVI1X1hMRCk7CisJfSBlbHNlIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjMsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjMsIGNoKSkgfCBGTVIzX1hMRCk7CisJfQorCXBmYWxjLT5zeW5jID0gMDsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIpICYKKwkJICAgfihDUExEX1JFRzJfRkFMQ19MRUQyIDw8ICgyICogY2gpKSk7CisJcGZhbGMtPmFjdGl2ZSA9IDA7CisvLz8gICAgZmFsY19pc3N1ZV9jbWQoY2FyZCwgY2gsIENNRFJfWFJFUyk7CisJcGZhbGMtPmxvb3BfZ2VuID0gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmYWxjX3BhdHRlcm5fdGVzdAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZXNjcmlwdGlvbjoJVGhpcyByb3V0aW5lIGdlbmVyYXRlcyBhIHBhdHRlcm4gY29kZSBhbmQgY2hlY2tzCisgKgkJaXQgb24gdGhlIHJlY2VwdGlvbiBzaWRlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgZmFsY19wYXR0ZXJuX3Rlc3QocGMzMDBfdCAqIGNhcmQsIGludCBjaCwgdW5zaWduZWQgaW50IGFjdGl2YXRlKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisKKwlpZiAoYWN0aXZhdGUpIHsKKwkJcGZhbGMtPnByYnMgPSAxOworCQlwZmFsYy0+YmVjID0gMDsKKwkJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCQkvKiBEaXNhYmxlIGxvY2FsIGxvb3AgYWN0aXZhdGlvbi9kZWFjdGl2YXRpb24gZGV0ZWN0ICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMywgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjMsIGNoKSkgfCBJTVIzX0xMQlNDKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERpc2FibGUgbG9jYWwgbG9vcCBhY3RpdmF0aW9uL2RlYWN0aXZhdGlvbiBkZXRlY3QgKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIxLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMSwgY2gpKSB8IElNUjFfTExCU0MpOworCQl9CisJCS8qIEFjdGl2YXRlcyBnZW5lcmF0aW9uIGFuZCBtb25pdG9yaW5nIG9mIFBSQlMgCisJCSAqIChQc2V1ZG8gUmFuZG9tIEJpdCBTZXF1ZW5jZSkgKi8KKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExDUjEsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExDUjEsIGNoKSkgfCBMQ1IxX0VQUk0gfCBMQ1IxX1hQUkJTKTsKKwl9IGVsc2UgeworCQlwZmFsYy0+cHJicyA9IDA7CisJCS8qIERlYWN0aXZhdGVzIGdlbmVyYXRpb24gYW5kIG1vbml0b3Jpbmcgb2YgUFJCUyAKKwkJICogKFBzZXVkbyBSYW5kb20gQml0IFNlcXVlbmNlKSAqLworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTENSMSwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlK0ZfUkVHKExDUjEsY2gpKSAmIH4oTENSMV9FUFJNIHwgTENSMV9YUFJCUykpOworCQlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJCS8qIEVuYWJsZSBsb2NhbCBsb29wIGFjdGl2YXRpb24vZGVhY3RpdmF0aW9uIGRldGVjdCAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjMsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIzLCBjaCkpICYgfklNUjNfTExCU0MpOworCQl9IGVsc2UgeworCQkJLyogRW5hYmxlIGxvY2FsIGxvb3AgYWN0aXZhdGlvbi9kZWFjdGl2YXRpb24gZGV0ZWN0ICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMSwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjEsIGNoKSkgJiB+SU1SMV9MTEJTQyk7CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZmFsY19wYXR0ZXJuX3Rlc3RfZXJyb3IKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVzY3JpcHRpb246CVRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBiaXQgZXJyb3IgY291bnRlciB2YWx1ZQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3Vjc2hvcnQgZmFsY19wYXR0ZXJuX3Rlc3RfZXJyb3IocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCisJcmV0dXJuIChwZmFsYy0+YmVjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgTmV0IEludGVyZmFjZSBSb3V0aW5lcyAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorY3BjX3RyYWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2JfbWFpbiwgY2hhciByeF90eCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKDEwICsgc2tiX21haW4tPmxlbikpID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlczogb3V0IG9mIG1lbW9yeVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlza2JfcHV0KHNrYiwgMTAgKyBza2JfbWFpbi0+bGVuKTsKKworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9DVVNUKTsKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOworCXNrYi0+bGVuID0gMTAgKyBza2JfbWFpbi0+bGVuOworCisJbWVtY3B5KHNrYi0+ZGF0YSwgZGV2LT5uYW1lLCA1KTsKKwlza2ItPmRhdGFbNV0gPSAnWyc7CisJc2tiLT5kYXRhWzZdID0gcnhfdHg7CisJc2tiLT5kYXRhWzddID0gJ10nOworCXNrYi0+ZGF0YVs4XSA9ICc6JzsKKwlza2ItPmRhdGFbOV0gPSAnICc7CisJbWVtY3B5KCZza2ItPmRhdGFbMTBdLCBza2JfbWFpbi0+ZGF0YSwgc2tiX21haW4tPmxlbik7CisKKwluZXRpZl9yeChza2IpOworfQorCit2b2lkIGNwY190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcGMzMDBkZXZfdCAqZCA9IChwYzMwMGRldl90ICopIGRldi0+cHJpdjsKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopIGQtPmNoYW47CisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopIGNoYW4tPmNhcmQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCWludCBjaCA9IGNoYW4tPmNoYW5uZWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1Y2NoYXIgaWxhcjsKKworCXN0YXRzLT50eF9lcnJvcnMrKzsKKwlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMrKzsKKwlDUENfTE9DSyhjYXJkLCBmbGFncyk7CisJaWYgKChpbGFyID0gY3BjX3JlYWRiKGNhcmQtPmh3LnNjYWJhc2UgKyBJTEFSKSkgIT0gMCkgeworCQlwcmludGsoIiVzOiBJTEFSPTB4JXhcbiIsIGRldi0+bmFtZSwgaWxhcik7CisJCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIElMQVIsIGlsYXIpOworCQljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBETUVSLCAweDgwKTsKKwl9CisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsKKwkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJCSAgIGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMikgJgorCQkJICAgfihDUExEX1JFRzJfRkFMQ19MRUQxIDw8ICgyICogY2gpKSk7CisJfQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCUNQQ19VTkxPQ0soY2FyZCwgZmxhZ3MpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworaW50IGNwY19xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcGMzMDBkZXZfdCAqZCA9IChwYzMwMGRldl90ICopIGRldi0+cHJpdjsKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopIGQtPmNoYW47CisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopIGNoYW4tPmNhcmQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCWludCBjaCA9IGNoYW4tPmNoYW5uZWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBQQzMwMF9ERUJVR19UWAorCWludCBpOworI2VuZGlmCisKKwlpZiAoY2hhbi0+Y29uZi5tb25pdG9yKSB7CisJCS8qIEluIG1vbml0b3IgbW9kZSBubyBUeCBpcyBkb25lOiBpZ25vcmUgcGFja2V0ICovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCS8qIERDRCBtdXN0IGJlIE9GRjogZHJvcCBwYWNrZXQgKi8KKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCXN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycysrOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGNwY19yZWFkYihjYXJkLT5ody5zY2FiYXNlICsgTV9SRUcoU1QzLCBjaCkpICYgU1QzX0RDRCkgeworCQlwcmludGsoIiVzOiBEQ0QgaXMgT0ZGLiBHb2luZyBhZG1pbmlzdHJhdGl2ZSBkb3duLlxuIiwgZGV2LT5uYW1lKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQlDUENfTE9DSyhjYXJkLCBmbGFncyk7CisJCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIE1fUkVHKENNRCwgY2gpLCBDTURfVFhfQlVGX0NMUik7CisJCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7CisJCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkJCSAgIGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMikgJiAKKwkJCQkgICAJCQl+KENQTERfUkVHMl9GQUxDX0xFRDEgPDwgKDIgKiBjaCkpKTsKKwkJfQorCQlDUENfVU5MT0NLKGNhcmQsIGZsYWdzKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBXcml0ZSBidWZmZXIgdG8gRE1BIGJ1ZmZlcnMgKi8KKwlpZiAoZG1hX2J1Zl93cml0ZShjYXJkLCBjaCwgKHVjY2hhciAqKSBza2ItPmRhdGEsIHNrYi0+bGVuKSAhPSAwKSB7CisvLwkJcHJpbnRrKCIlczogd3JpdGUgZXJyb3IuIERyb3BwaW5nIFRYIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCXN0YXRzLT50eF9kcm9wcGVkKys7CisJCXJldHVybiAwOworCX0KKyNpZmRlZiBQQzMwMF9ERUJVR19UWAorCXByaW50aygiJXMgVDoiLCBkZXYtPm5hbWUpOworCWZvciAoaSA9IDA7IGkgPCBza2ItPmxlbjsgaSsrKQorCQlwcmludGsoIiAlMDJ4IiwgKihza2ItPmRhdGEgKyBpKSk7CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKwlpZiAoZC0+dHJhY2Vfb24pIHsKKwkJY3BjX3RyYWNlKGRldiwgc2tiLCAnVCcpOworCX0KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIFN0YXJ0IHRyYW5zbWlzc2lvbiAqLworCUNQQ19MT0NLKGNhcmQsIGZsYWdzKTsKKwkvKiB2ZXJpZnkgaWYgaXQgaGFzIG1vcmUgdGhhbiBvbmUgZnJlZSBkZXNjcmlwdG9yICovCisJaWYgKGNhcmQtPmNoYW5bY2hdLm5mcmVlX3R4X2JkIDw9IDEpIHsKKwkJLyogZG9uJ3QgaGF2ZSBzbyBzdG9wIHRoZSBxdWV1ZSAqLworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCWNwY193cml0ZWwoY2FyZC0+aHcuc2NhYmFzZSArIERUWF9SRUcoRURBTCwgY2gpLAorCQkgICBUWF9CRF9BRERSKGNoLCBjaGFuLT50eF9uZXh0X2JkKSk7CisJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgTV9SRUcoQ01ELCBjaCksIENNRF9UWF9FTkEpOworCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIERTUl9UWChjaCksIERTUl9ERSk7CisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsKKwkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJCSAgIGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMikgfAorCQkJICAgKENQTERfUkVHMl9GQUxDX0xFRDEgPDwgKDIgKiBjaCkpKTsKKwl9CisJQ1BDX1VOTE9DSyhjYXJkLCBmbGFncyk7CisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY3BjX25ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBjMzAwZGV2X3QgKmQgPSAocGMzMDBkZXZfdCAqKSBkZXYtPnByaXY7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSBkLT5jaGFuOworCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKSBjaGFuLT5jYXJkOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwlpbnQgY2ggPSBjaGFuLT5jaGFubmVsOworI2lmZGVmIFBDMzAwX0RFQlVHX1JYCisJaW50IGk7CisjZW5kaWYKKwlpbnQgcnhiOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoKHJ4YiA9IGRtYV9nZXRfcnhfZnJhbWVfc2l6ZShjYXJkLCBjaCkpID09IC0xKQorCQkJcmV0dXJuOworCisJCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCQkvKiBEQ0QgbXVzdCBiZSBPRkY6IGRyb3AgcGFja2V0ICovCisJCSAgICBwcmludGsoIiVzIDogRENEIGlzIE9GRiAtIGRyb3AgJWQgcnggYnl0ZXNcbiIsIGRldi0+bmFtZSwgcnhiKTsgCisJCQlza2IgPSBOVUxMOworCQl9IGVsc2UgeworCQkJaWYgKHJ4YiA+IChkZXYtPm10dSArIDQwKSkgeyAvKiBhZGQgaGVhZGVycyAqLworCQkJCXByaW50aygiJXMgOiBNVFUgZXhjZWVkZWQgJWRcbiIsIGRldi0+bmFtZSwgcnhiKTsgCisJCQkJc2tiID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJc2tiID0gZGV2X2FsbG9jX3NrYihyeGIpOworCQkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSEhXG4iLCBkZXYtPm5hbWUpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJfQorCQl9CisKKwkJaWYgKCgocnhiID0gZG1hX2J1Zl9yZWFkKGNhcmQsIGNoLCBza2IpKSA8PSAwKSB8fCAoc2tiID09IE5VTEwpKSB7CisjaWZkZWYgUEMzMDBfREVCVUdfUlgKKwkJCXByaW50aygiJXM6IHJ4YiA9ICV4XG4iLCBkZXYtPm5hbWUsIHJ4Yik7CisjZW5kaWYKKwkJCWlmICgoc2tiID09IE5VTEwpICYmIChyeGIgPiAwKSkgeworCQkJCS8qIHJ4YiA+IGRldi0+bXR1ICovCisJCQkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQkJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChyeGIgPCAwKSB7CS8qIEludmFsaWQgZnJhbWUgKi8KKwkJCQlyeGIgPSAtcnhiOworCQkJCWlmIChyeGIgJiBEU1RfT1ZSKSB7CisJCQkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJCQkJc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkJfQorCQkJCWlmIChyeGIgJiBEU1RfQ1JDKSB7CisJCQkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJCQkJc3RhdHMtPnJ4X2NyY19lcnJvcnMrKzsKKwkJCQl9CisJCQkJaWYgKHJ4YiAmIChEU1RfUkJJVCB8IERTVF9TSFJUIHwgRFNUX0FCVCkpIHsKKwkJCQkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQkJCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7CisJCQkJfQorCQkJfQorCQkJaWYgKHNrYikgeworCQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCXN0YXRzLT5yeF9ieXRlcyArPSByeGI7CisKKyNpZmRlZiBQQzMwMF9ERUJVR19SWAorCQlwcmludGsoIiVzIFI6IiwgZGV2LT5uYW1lKTsKKwkJZm9yIChpID0gMDsgaSA8IHNrYi0+bGVuOyBpKyspCisJCQlwcmludGsoIiAlMDJ4IiwgKihza2ItPmRhdGEgKyBpKSk7CisJCXByaW50aygiXG4iKTsKKyNlbmRpZgorCQlpZiAoZC0+dHJhY2Vfb24pIHsKKwkJCWNwY190cmFjZShkZXYsIHNrYiwgJ1InKTsKKwkJfQorCQlzdGF0cy0+cnhfcGFja2V0cysrOworCQlza2ItPnByb3RvY29sID0gaGRsY190eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJbmV0aWZfcngoc2tiKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgUEMzMDAgSW50ZXJydXB0IFJvdXRpbmVzICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHNjYV90eF9pbnRyKHBjMzAwZGV2X3QgKmRldikKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopZGV2LT5jaGFuOyAKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKiljaGFuLT5jYXJkOyAKKwlpbnQgY2ggPSBjaGFuLT5jaGFubmVsOyAKKwl2b2xhdGlsZSBwY3NjYV9iZF90IF9faW9tZW0gKiBwdGRlc2NyOyAKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldi0+ZGV2KTsKKworICAgIC8qIENsZWFuIHVwIGRlc2NyaXB0b3JzIGZyb20gcHJldmlvdXMgdHJhbnNtaXNzaW9uICovCisJcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlICsKKwkJCQkJCVRYX0JEX0FERFIoY2gsY2hhbi0+dHhfZmlyc3RfYmQpKTsKKwl3aGlsZSAoKGNwY19yZWFkbChjYXJkLT5ody5zY2FiYXNlICsgRFRYX1JFRyhDREFMLGNoKSkgIT0gCisJCQkJCQkJVFhfQkRfQUREUihjaCxjaGFuLT50eF9maXJzdF9iZCkpICYmIAorCQkJKGNwY19yZWFkYigmcHRkZXNjci0+c3RhdHVzKSAmIERTVF9PU0IpKSB7CisJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCXN0YXRzLT50eF9ieXRlcyArPSBjcGNfcmVhZHcoJnB0ZGVzY3ItPmxlbik7CisJCWNwY193cml0ZWIoJnB0ZGVzY3ItPnN0YXR1cywgRFNUX09TQik7CisJCWNwY193cml0ZXcoJnB0ZGVzY3ItPmxlbiwgMCk7CisJCWNoYW4tPm5mcmVlX3R4X2JkKys7CisJCWNoYW4tPnR4X2ZpcnN0X2JkID0gKGNoYW4tPnR4X2ZpcnN0X2JkICsgMSkgJiAoTl9ETUFfVFhfQlVGIC0gMSk7CisJCXB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZSArIFRYX0JEX0FERFIoY2gsY2hhbi0+dHhfZmlyc3RfYmQpKTsKKyAgICB9CisKKyNpZmRlZiBDT05GSUdfUEMzMDBfTUxQUFAKKwlpZiAoY2hhbi0+Y29uZi5wcm90byA9PSBQQzMwMF9QUk9UT19NTFBQUCkgeworCQkJY3BjX3R0eV90cmlnZ2VyX3BvbGwoZGV2KTsKKwl9IGVsc2UgeworI2VuZGlmCisJLyogVGVsbCB0aGUgdXBwZXIgbGF5ZXIgd2UgYXJlIHJlYWR5IHRvIHRyYW5zbWl0IG1vcmUgcGFja2V0cyAqLworCQluZXRpZl93YWtlX3F1ZXVlKGRldi0+ZGV2KTsKKyNpZmRlZiBDT05GSUdfUEMzMDBfTUxQUFAKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgc2NhX2ludHIocGMzMDBfdCAqIGNhcmQpCit7CisJdm9pZCBfX2lvbWVtICpzY2FiYXNlID0gY2FyZC0+aHcuc2NhYmFzZTsKKwl2b2xhdGlsZSB1Y2xvbmcgc3RhdHVzOworCWludCBjaDsKKwlpbnQgaW50cl9jb3VudCA9IDA7CisJdW5zaWduZWQgY2hhciBkc3Jfcng7CisKKwl3aGlsZSAoKHN0YXR1cyA9IGNwY19yZWFkbChzY2FiYXNlICsgSVNSMCkpICE9IDApIHsKKwkJZm9yIChjaCA9IDA7IGNoIDwgY2FyZC0+aHcubmNoYW47IGNoKyspIHsKKwkJCXBjMzAwY2hfdCAqY2hhbiA9ICZjYXJkLT5jaGFuW2NoXTsKKwkJCXBjMzAwZGV2X3QgKmQgPSAmY2hhbi0+ZDsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkLT5kZXY7CisJCQloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisKKwkJCXNwaW5fbG9jaygmY2FyZC0+Y2FyZF9sb2NrKTsKKworCSAgICAvKioqKiBSZWNlcHRpb24gKioqKi8KKwkJCWlmIChzdGF0dXMgJiBJUjBfRFJYKChJUjBfRE1JQSB8IElSMF9ETUlCKSwgY2gpKSB7CisJCQkJdWNjaGFyIGRyeF9zdGF0ID0gY3BjX3JlYWRiKHNjYWJhc2UgKyBEU1JfUlgoY2gpKTsKKworCQkJCS8qIENsZWFyIFJYIGludGVycnVwdHMgKi8KKwkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBEU1JfUlgoY2gpLCBkcnhfc3RhdCB8IERTUl9EV0UpOworCisjaWZkZWYgUEMzMDBfREVCVUdfSU5UUgorCQkJCXByaW50ayAoInNjYV9pbnRyOiBSWCBpbnRyIGNoYW5bJWRdIChzdD0weCUwOGx4LCBkc3I9MHglMDJ4KVxuIiwKKwkJCQkJIGNoLCBzdGF0dXMsIGRyeF9zdGF0KTsKKyNlbmRpZgorCQkJCWlmIChzdGF0dXMgJiBJUjBfRFJYKElSMF9ETUlBLCBjaCkpIHsKKwkJCQkJaWYgKGRyeF9zdGF0ICYgRFNSX0JPRikgeworI2lmZGVmIENPTkZJR19QQzMwMF9NTFBQUAorCQkJCQkJaWYgKGNoYW4tPmNvbmYucHJvdG8gPT0gUEMzMDBfUFJPVE9fTUxQUFApIHsKKwkJCQkJCQkvKiB2ZXJpZnkgaWYgZHJpdmVyIGlzIFRUWSAqLworCQkJCQkJCWlmICgoY3BjX3JlYWRiKHNjYWJhc2UgKyBEU1JfUlgoY2gpKSAmIERTUl9ERSkpIHsKKwkJCQkJCQkJcnhfZG1hX3N0b3AoY2FyZCwgY2gpOworCQkJCQkJCX0KKwkJCQkJCQljcGNfdHR5X3JlY2VpdmUoZCk7CisJCQkJCQkJcnhfZG1hX3N0YXJ0KGNhcmQsIGNoKTsKKwkJCQkJCX0gZWxzZSAKKyNlbmRpZgorCQkJCQkJeworCQkJCQkJCWlmICgoY3BjX3JlYWRiKHNjYWJhc2UgKyBEU1JfUlgoY2gpKSAmIERTUl9ERSkpIHsKKwkJCQkJCQkJcnhfZG1hX3N0b3AoY2FyZCwgY2gpOworCQkJCQkJCX0KKwkJCQkJCQljcGNfbmV0X3J4KGRldik7CisJCQkJCQkJLyogRGlzY2FyZCBpbnZhbGlkIGZyYW1lcyAqLworCQkJCQkJCWhkbGMtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQkJCWhkbGMtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQkJCQkJY2hhbi0+cnhfZmlyc3RfYmQgPSAwOworCQkJCQkJCWNoYW4tPnJ4X2xhc3RfYmQgPSBOX0RNQV9SWF9CVUYgLSAxOworCQkJCQkJCXJ4X2RtYV9zdGFydChjYXJkLCBjaCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHN0YXR1cyAmIElSMF9EUlgoSVIwX0RNSUIsIGNoKSkgeworCQkJCQlpZiAoZHJ4X3N0YXQgJiBEU1JfRU9NKSB7CisJCQkJCQlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeworCQkJCQkJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKworCQkJCQkJCQkgICBjYXJkLT5ody5jcGxkX3JlZzIsCisJCQkJCQkJCSAgIGNwY19yZWFkYiAoY2FyZC0+aHcuZmFsY2Jhc2UgKworCQkJCQkJCQkgICAgCWNhcmQtPmh3LmNwbGRfcmVnMikgfAorCQkJCQkJCQkgICAoQ1BMRF9SRUcyX0ZBTENfTEVEMSA8PCAoMiAqIGNoKSkpOworCQkJCQkJfQorI2lmZGVmIENPTkZJR19QQzMwMF9NTFBQUAorCQkJCQkJaWYgKGNoYW4tPmNvbmYucHJvdG8gPT0gUEMzMDBfUFJPVE9fTUxQUFApIHsKKwkJCQkJCQkvKiB2ZXJpZnkgaWYgZHJpdmVyIGlzIFRUWSAqLworCQkJCQkJCWNwY190dHlfcmVjZWl2ZShkKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY3BjX25ldF9yeChkZXYpOworCQkJCQkJfQorI2Vsc2UKKwkJCQkJCWNwY19uZXRfcngoZGV2KTsKKyNlbmRpZgorCQkJCQkJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsKKwkJCQkJCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsKKwkJCQkJCQkJICAgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkJCQkJCQkgICBjcGNfcmVhZGIgKGNhcmQtPmh3LmZhbGNiYXNlICsKKwkJCQkJCQkJICAgIAkJY2FyZC0+aHcuY3BsZF9yZWcyKSAmCisJCQkJCQkJCSAgIH4gKENQTERfUkVHMl9GQUxDX0xFRDEgPDwgKDIgKiBjaCkpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIShkc3JfcnggPSBjcGNfcmVhZGIoc2NhYmFzZSArIERTUl9SWChjaCkpICYgRFNSX0RFKSkgeworI2lmZGVmIFBDMzAwX0RFQlVHX0lOVFIKKwkJcHJpbnRrKCIlczogUlggaW50ciBjaGFuWyVkXSAoc3Q9MHglMDhseCwgZHNyPTB4JTAyeCwgZHNyMj0weCUwMngpXG4iLAorCQkJZGV2LT5uYW1lLCBjaCwgc3RhdHVzLCBkcnhfc3RhdCwgZHNyX3J4KTsKKyNlbmRpZgorCQkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBEU1JfUlgoY2gpLCAoZHNyX3J4IHwgRFNSX0RFKSAmIDB4ZmUpOworCQkJCX0KKwkJCX0KKworCSAgICAvKioqKiBUcmFuc21pc3Npb24gKioqKi8KKwkJCWlmIChzdGF0dXMgJiBJUjBfRFRYKChJUjBfRUZUIHwgSVIwX0RNSUEgfCBJUjBfRE1JQiksIGNoKSkgeworCQkJCXVjY2hhciBkdHhfc3RhdCA9IGNwY19yZWFkYihzY2FiYXNlICsgRFNSX1RYKGNoKSk7CisKKwkJCQkvKiBDbGVhciBUWCBpbnRlcnJ1cHRzICovCisJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgRFNSX1RYKGNoKSwgZHR4X3N0YXQgfCBEU1JfRFdFKTsKKworI2lmZGVmIFBDMzAwX0RFQlVHX0lOVFIKKwkJCQlwcmludGsgKCJzY2FfaW50cjogVFggaW50ciBjaGFuWyVkXSAoc3Q9MHglMDhseCwgZHNyPTB4JTAyeClcbiIsCisJCQkJCSBjaCwgc3RhdHVzLCBkdHhfc3RhdCk7CisjZW5kaWYKKwkJCQlpZiAoc3RhdHVzICYgSVIwX0RUWChJUjBfRUZULCBjaCkpIHsKKwkJCQkJaWYgKGR0eF9zdGF0ICYgRFNSX1VEUkYpIHsKKwkJCQkJCWlmIChjcGNfcmVhZGIgKHNjYWJhc2UgKyBNX1JFRyhUQk4sIGNoKSkgIT0gMCkgeworCQkJCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKENNRCxjaCksIENNRF9UWF9CVUZfQ0xSKTsKKwkJCQkJCX0KKwkJCQkJCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7CisJCQkJCQkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJCQkJCQkJICAgY3BjX3JlYWRiIChjYXJkLT5ody5mYWxjYmFzZSArIAorCQkJCQkJCQkJCSAgIGNhcmQtPmh3LmNwbGRfcmVnMikgJgorCQkJCQkJCQkgICB+IChDUExEX1JFRzJfRkFMQ19MRUQxIDw8ICgyICogY2gpKSk7CisJCQkJCQl9CisJCQkJCQloZGxjLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQkJCWhkbGMtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJCQlzY2FfdHhfaW50cihkKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoc3RhdHVzICYgSVIwX0RUWChJUjBfRE1JQSwgY2gpKSB7CisJCQkJCWlmIChkdHhfc3RhdCAmIERTUl9CT0YpIHsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoc3RhdHVzICYgSVIwX0RUWChJUjBfRE1JQiwgY2gpKSB7CisJCQkJCWlmIChkdHhfc3RhdCAmIERTUl9FT00pIHsKKwkJCQkJCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7CisJCQkJCQkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJCQkJCQkJICAgY3BjX3JlYWRiIChjYXJkLT5ody5mYWxjYmFzZSArCisJCQkJCQkJCSAgICAJCQljYXJkLT5ody5jcGxkX3JlZzIpICYKKwkJCQkJCQkJICAgfiAoQ1BMRF9SRUcyX0ZBTENfTEVEMSA8PCAoMiAqIGNoKSkpOworCQkJCQkJfQorCQkJCQkJc2NhX3R4X2ludHIoZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkgICAgLyoqKiogTVNDSSAqKioqLworCQkJaWYgKHN0YXR1cyAmIElSMF9NKElSMF9SWElOVEEsIGNoKSkgeworCQkJCXVjY2hhciBzdDEgPSBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFNUMSwgY2gpKTsKKworCQkJCS8qIENsZWFyIE1TQ0kgaW50ZXJydXB0cyAqLworCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFNUMSwgY2gpLCBzdDEpOworCisjaWZkZWYgUEMzMDBfREVCVUdfSU5UUgorCQkJCXByaW50aygic2NhX2ludHI6IE1TQ0kgaW50ciBjaGFuWyVkXSAoc3Q9MHglMDhseCwgc3QxPTB4JTAyeClcbiIsCisJCQkJCSBjaCwgc3RhdHVzLCBzdDEpOworI2VuZGlmCisJCQkJaWYgKHN0MSAmIFNUMV9DRENEKSB7CS8qIERDRCBjaGFuZ2VkICovCisJCQkJCWlmIChjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFNUMywgY2gpKSAmIFNUM19EQ0QpIHsKKwkJCQkJCXByaW50ayAoIiVzOiBEQ0QgaXMgT0ZGLiBHb2luZyBhZG1pbmlzdHJhdGl2ZSBkb3duLlxuIiwKKwkJCQkJCQkgZGV2LT5uYW1lKTsKKyNpZmRlZiBDT05GSUdfUEMzMDBfTUxQUFAKKwkJCQkJCWlmIChjaGFuLT5jb25mLnByb3RvICE9IFBDMzAwX1BST1RPX01MUFBQKSB7CisJCQkJCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJCQkJCX0KKyNlbHNlCisJCQkJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisjZW5kaWYKKwkJCQkJCWNhcmQtPmNoYW5bY2hdLmQubGluZV9vZmYrKzsKKwkJCQkJfSBlbHNlIHsJLyogRENEID0gMSAqLworCQkJCQkJcHJpbnRrICgiJXM6IERDRCBpcyBPTi4gR29pbmcgYWRtaW5pc3RyYXRpdmUgdXAuXG4iLAorCQkJCQkJCSBkZXYtPm5hbWUpOworI2lmZGVmIENPTkZJR19QQzMwMF9NTFBQUAorCQkJCQkJaWYgKGNoYW4tPmNvbmYucHJvdG8gIT0gUEMzMDBfUFJPVE9fTUxQUFApCisJCQkJCQkJLyogdmVyaWZ5IGlmIGRyaXZlciBpcyBub3QgVFRZICovCisjZW5kaWYKKwkJCQkJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCQkJCQljYXJkLT5jaGFuW2NoXS5kLmxpbmVfb24rKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZjYXJkLT5jYXJkX2xvY2spOworCQl9CisJCWlmICgrK2ludHJfY291bnQgPT0gMTApCisJCQkvKiBUb28gbXVjaCB3b3JrIGF0IHRoaXMgYm9hcmQuIEZvcmNlIGV4aXQgKi8KKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgZmFsY190MV9sb29wX2RldGVjdGlvbihwYzMwMF90ICogY2FyZCwgaW50IGNoLCB1Y2NoYXIgZnJzMSkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKworCWlmICgoKGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExDUjEsIGNoKSkgJiBMQ1IxX1hQUkJTKSA9PSAwKSAmJgorCSAgICAhcGZhbGMtPmxvb3BfZ2VuKSB7CisJCWlmIChmcnMxICYgRlJTMV9MTEJERCkgeworCQkJLy8gQSBMaW5lIExvb3AgQmFjayBEZWFjdGl2YXRpb24gc2lnbmFsIGRldGVjdGVkCisJCQlpZiAocGZhbGMtPmxvb3BfYWN0aXZlKSB7CisJCQkJZmFsY19yZW1vdGVfbG9vcChjYXJkLCBjaCwgMCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKGZyczEgJiBGUlMxX0xMQkFEKSAmJgorCQkJICAgICgoY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTENSMSwgY2gpKSAmIExDUjFfRVBSTSkgPT0gMCkpIHsKKwkJCQkvLyBBIExpbmUgTG9vcCBCYWNrIEFjdGl2YXRpb24gc2lnbmFsIGRldGVjdGVkICAKKwkJCQlpZiAoIXBmYWxjLT5sb29wX2FjdGl2ZSkgeworCQkJCQlmYWxjX3JlbW90ZV9sb29wKGNhcmQsIGNoLCAxKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZhbGNfZTFfbG9vcF9kZXRlY3Rpb24ocGMzMDBfdCAqIGNhcmQsIGludCBjaCwgdWNjaGFyIHJzcCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKworCWlmICgoKGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExDUjEsIGNoKSkgJiBMQ1IxX1hQUkJTKSA9PSAwKSAmJgorCSAgICAhcGZhbGMtPmxvb3BfZ2VuKSB7CisJCWlmIChyc3AgJiBSU1BfTExCREQpIHsKKwkJCS8vIEEgTGluZSBMb29wIEJhY2sgRGVhY3RpdmF0aW9uIHNpZ25hbCBkZXRlY3RlZAorCQkJaWYgKHBmYWxjLT5sb29wX2FjdGl2ZSkgeworCQkJCWZhbGNfcmVtb3RlX2xvb3AoY2FyZCwgY2gsIDApOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChyc3AgJiBSU1BfTExCQUQpICYmCisJCQkgICAgKChjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMQ1IxLCBjaCkpICYgTENSMV9FUFJNKSA9PSAwKSkgeworCQkJCS8vIEEgTGluZSBMb29wIEJhY2sgQWN0aXZhdGlvbiBzaWduYWwgZGV0ZWN0ZWQgIAorCQkJCWlmICghcGZhbGMtPmxvb3BfYWN0aXZlKSB7CisJCQkJCWZhbGNfcmVtb3RlX2xvb3AoY2FyZCwgY2gsIDEpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZmFsY190MV9pbnRyKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisJdWNjaGFyIGlzcjAsIGlzcjMsIGdpczsKKwl1Y2NoYXIgZHVtbXk7CisKKwl3aGlsZSAoKGdpcyA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEdJUywgY2gpKSkgIT0gMCkgeworCQlpZiAoZ2lzICYgR0lTX0lTUjApIHsKKwkJCWlzcjAgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGSVNSMCwgY2gpKTsKKwkJCWlmIChpc3IwICYgRklTUjBfUERFTikgeworCQkJCS8qIFJlYWQgdGhlIGJpdCB0byBjbGVhciB0aGUgc2l0dWF0aW9uICovCisJCQkJaWYgKGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZSUzEsIGNoKSkgJgorCQkJCSAgICBGUlMxX1BERU4pIHsKKwkJCQkJcGZhbGMtPnBkZW4rKzsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoZ2lzICYgR0lTX0lTUjEpIHsKKwkJCWR1bW15ID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRklTUjEsIGNoKSk7CisJCX0KKworCQlpZiAoZ2lzICYgR0lTX0lTUjIpIHsKKwkJCWR1bW15ID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRklTUjIsIGNoKSk7CisJCX0KKworCQlpZiAoZ2lzICYgR0lTX0lTUjMpIHsKKwkJCWlzcjMgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGSVNSMywgY2gpKTsKKwkJCWlmIChpc3IzICYgRklTUjNfU0VDKSB7CisJCQkJcGZhbGMtPnNlYysrOworCQkJCWZhbGNfdXBkYXRlX3N0YXRzKGNhcmQsIGNoKTsKKwkJCQlmYWxjX2NoZWNrX3N0YXR1cyhjYXJkLCBjaCwKKwkJCQkJCSAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRlJTMCwgY2gpKSk7CisJCQl9CisJCQlpZiAoaXNyMyAmIEZJU1IzX0VTKSB7CisJCQkJcGZhbGMtPmVzKys7CisJCQl9CisJCQlpZiAoaXNyMyAmIEZJU1IzX0xMQlNDKSB7CisJCQkJZmFsY190MV9sb29wX2RldGVjdGlvbihjYXJkLCBjaCwKKwkJCQkJCSAgICAgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGUlMxLCBjaCkpKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZmFsY19lMV9pbnRyKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisJdWNjaGFyIGlzcjEsIGlzcjIsIGlzcjMsIGdpcywgcnNwOworCXVjY2hhciBkdW1teTsKKworCXdoaWxlICgoZ2lzID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoR0lTLCBjaCkpKSAhPSAwKSB7CisJCXJzcCA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFJTUCwgY2gpKTsKKworCQlpZiAoZ2lzICYgR0lTX0lTUjApIHsKKwkJCWR1bW15ID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRklTUjAsIGNoKSk7CisJCX0KKwkJaWYgKGdpcyAmIEdJU19JU1IxKSB7CisJCQlpc3IxID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRklTUjEsIGNoKSk7CisJCQlpZiAoaXNyMSAmIEZJU1IxX1hNQikgeworCQkJCWlmICgocGZhbGMtPnhtYl9jYXVzZSAmIDIpCisJCQkJICAgICYmIHBmYWxjLT5tdWx0aWZyYW1lX21vZGUpIHsKKwkJCQkJaWYgKGNwY19yZWFkYiAoZmFsY2Jhc2UgKyBGX1JFRyhGUlMwLCBjaCkpICYgCisJCQkJCQkJCQkoRlJTMF9MT1MgfCBGUlMwX0FJUyB8IEZSUzBfTEZBKSkgeworCQkJCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpLAorCQkJCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpKQorCQkJCQkJCSAgICYgflhTUF9BWFMpOworCQkJCQl9IGVsc2UgeworCQkJCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpLAorCQkJCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpKQorCQkJCQkJCSAgIHwgWFNQX0FYUyk7CisJCQkJCX0KKwkJCQl9CisJCQkJcGZhbGMtPnhtYl9jYXVzZSA9IDA7CisJCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjEsIGNoKSwKKwkJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMSwgY2gpKSB8IElNUjFfWE1CKTsKKwkJCX0KKwkJCWlmIChpc3IxICYgRklTUjFfTExCU0MpIHsKKwkJCQlmYWxjX2UxX2xvb3BfZGV0ZWN0aW9uKGNhcmQsIGNoLCByc3ApOworCQkJfQorCQl9CisJCWlmIChnaXMgJiBHSVNfSVNSMikgeworCQkJaXNyMiA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZJU1IyLCBjaCkpOworCQkJaWYgKGlzcjIgJiBGSVNSMl9UNDAwTVMpIHsKKwkJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFNXLCBjaCksCisJCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhTVywgY2gpKSB8IFhTV19YUkEpOworCQkJfQorCQkJaWYgKGlzcjIgJiBGSVNSMl9NRkFSKSB7CisJCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhTVywgY2gpLAorCQkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYU1csIGNoKSkgJiB+WFNXX1hSQSk7CisJCQl9CisJCQlpZiAoaXNyMiAmIChGSVNSMl9GQVIgfCBGSVNSMl9MRkEgfCBGSVNSMl9BSVMgfCBGSVNSMl9MT1MpKSB7CisJCQkJcGZhbGMtPnhtYl9jYXVzZSB8PSAyOworCQkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIxLCBjaCksCisJCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjEsIGNoKSkgJiB+SU1SMV9YTUIpOworCQkJfQorCQl9CisJCWlmIChnaXMgJiBHSVNfSVNSMykgeworCQkJaXNyMyA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZJU1IzLCBjaCkpOworCQkJaWYgKGlzcjMgJiBGSVNSM19TRUMpIHsKKwkJCQlwZmFsYy0+c2VjKys7CisJCQkJZmFsY191cGRhdGVfc3RhdHMoY2FyZCwgY2gpOworCQkJCWZhbGNfY2hlY2tfc3RhdHVzKGNhcmQsIGNoLAorCQkJCQkJICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGUlMwLCBjaCkpKTsKKwkJCX0KKwkJCWlmIChpc3IzICYgRklTUjNfRVMpIHsKKwkJCQlwZmFsYy0+ZXMrKzsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZmFsY19pbnRyKHBjMzAwX3QgKiBjYXJkKQoreworCWludCBjaDsKKworCWZvciAoY2ggPSAwOyBjaCA8IGNhcmQtPmh3Lm5jaGFuOyBjaCsrKSB7CisJCXBjMzAwY2hfdCAqY2hhbiA9ICZjYXJkLT5jaGFuW2NoXTsKKwkJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKworCQlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJCWZhbGNfdDFfaW50cihjYXJkLCBjaCk7CisJCX0gZWxzZSB7CisJCQlmYWxjX2UxX2ludHIoY2FyZCwgY2gpOworCQl9CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgY3BjX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwYzMwMF90ICpjYXJkOworCXZvbGF0aWxlIHVjY2hhciBwbHhfc3RhdHVzOworCisJaWYgKChjYXJkID0gKHBjMzAwX3QgKikgZGV2X2lkKSA9PSAwKSB7CisjaWZkZWYgUEMzMDBfREVCVUdfSU5UUgorCQlwcmludGsoImNwY19pbnRyOiBzcHVyaW91cyBpbnRyICVkXG4iLCBpcnEpOworI2VuZGlmCisJCXJldHVybiBJUlFfTk9ORTsJCS8qIHNwdXJpb3VzIGludHIgKi8KKwl9CisKKwlpZiAoY2FyZC0+aHcucmFtYmFzZSA9PSAwKSB7CisjaWZkZWYgUEMzMDBfREVCVUdfSU5UUgorCQlwcmludGsoImNwY19pbnRyOiBzcHVyaW91cyBpbnRyMiAlZFxuIiwgaXJxKTsKKyNlbmRpZgorCQlyZXR1cm4gSVJRX05PTkU7CQkvKiBzcHVyaW91cyBpbnRyICovCisJfQorCisJc3dpdGNoIChjYXJkLT5ody50eXBlKSB7CisJCWNhc2UgUEMzMDBfUlNWOgorCQljYXNlIFBDMzAwX1gyMToKKwkJCXNjYV9pbnRyKGNhcmQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQQzMwMF9URToKKwkJCXdoaWxlICggKHBseF9zdGF0dXMgPSAoY3BjX3JlYWRiKGNhcmQtPmh3LnBseGJhc2UgKyBjYXJkLT5ody5pbnRjdGxfcmVnKSAmCisJCQkJIChQTFhfOTA1MF9MSU5UMV9TVEFUVVMgfCBQTFhfOTA1MF9MSU5UMl9TVEFUVVMpKSkgIT0gMCkgeworCQkJCWlmIChwbHhfc3RhdHVzICYgUExYXzkwNTBfTElOVDFfU1RBVFVTKSB7CS8qIFNDQSBJbnRlcnJ1cHQgKi8KKwkJCQkJc2NhX2ludHIoY2FyZCk7CisJCQkJfQorCQkJCWlmIChwbHhfc3RhdHVzICYgUExYXzkwNTBfTElOVDJfU1RBVFVTKSB7CS8qIEZBTEMgSW50ZXJydXB0ICovCisJCQkJCWZhbGNfaW50cihjYXJkKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCit2b2lkIGNwY19zY2Ffc3RhdHVzKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJdWNjaGFyIGlsYXI7CisJdm9pZCBfX2lvbWVtICpzY2FiYXNlID0gY2FyZC0+aHcuc2NhYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdHhfZG1hX2J1Zl9jaGVjayhjYXJkLCBjaCk7CisJcnhfZG1hX2J1Zl9jaGVjayhjYXJkLCBjaCk7CisJaWxhciA9IGNwY19yZWFkYihzY2FiYXNlICsgSUxBUik7CisJcHJpbnRrICgiSUxBUj0weCUwMngsIFdDUkw9MHglMDJ4LCBQQ1I9MHglMDJ4LCBCVENSPTB4JTAyeCwgQk9MUj0weCUwMnhcbiIsCisJCSBpbGFyLCBjcGNfcmVhZGIoc2NhYmFzZSArIFdDUkwpLCBjcGNfcmVhZGIoc2NhYmFzZSArIFBDUiksCisJCSBjcGNfcmVhZGIoc2NhYmFzZSArIEJUQ1IpLCBjcGNfcmVhZGIoc2NhYmFzZSArIEJPTFIpKTsKKwlwcmludGsoIlRYX0NEQT0weCUwOHgsIFRYX0VEQT0weCUwOHhcbiIsCisJICAgICAgIGNwY19yZWFkbChzY2FiYXNlICsgRFRYX1JFRyhDREFMLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGwoc2NhYmFzZSArIERUWF9SRUcoRURBTCwgY2gpKSk7CisJcHJpbnRrKCJSWF9DREE9MHglMDh4LCBSWF9FREE9MHglMDh4LCBCRkw9MHglMDR4XG4iLAorCSAgICAgICBjcGNfcmVhZGwoc2NhYmFzZSArIERSWF9SRUcoQ0RBTCwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRsKHNjYWJhc2UgKyBEUlhfUkVHKEVEQUwsIGNoKSksCisJICAgICAgIGNwY19yZWFkdyhzY2FiYXNlICsgRFJYX1JFRyhCRkxMLCBjaCkpKTsKKwlwcmludGsoIkRNRVI9MHglMDJ4LCBEU1JfVFg9MHglMDJ4LCBEU1JfUlg9MHglMDJ4XG4iLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIERNRVIpLCBjcGNfcmVhZGIoc2NhYmFzZSArIERTUl9UWChjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIERTUl9SWChjaCkpKTsKKwlwcmludGsoIkRNUl9UWD0weCUwMngsIERNUl9SWD0weCUwMngsIERJUl9UWD0weCUwMngsIERJUl9SWD0weCUwMnhcbiIsCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgRE1SX1RYKGNoKSksIGNwY19yZWFkYihzY2FiYXNlICsgRE1SX1JYKGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgRElSX1RYKGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgRElSX1JYKGNoKSkpOworCXByaW50aygiRENSX1RYPTB4JTAyeCwgRENSX1JYPTB4JTAyeCwgRkNUX1RYPTB4JTAyeCwgRkNUX1JYPTB4JTAyeFxuIiwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBEQ1JfVFgoY2gpKSwgY3BjX3JlYWRiKHNjYWJhc2UgKyBEQ1JfUlgoY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBGQ1RfVFgoY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBGQ1RfUlgoY2gpKSk7CisJcHJpbnRrKCJNRDA9MHglMDJ4LCBNRDE9MHglMDJ4LCBNRDI9MHglMDJ4LCBNRDM9MHglMDJ4LCBJREw9MHglMDJ4XG4iLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKE1EMCwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhNRDEsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoTUQyLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKE1EMywgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhJREwsIGNoKSkpOworCXByaW50aygiQ01EPTB4JTAyeCwgU0EwPTB4JTAyeCwgU0ExPTB4JTAyeCwgVEZOPTB4JTAyeCwgQ1RMPTB4JTAyeFxuIiwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhDTUQsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoU0EwLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFNBMSwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhURk4sIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoQ1RMLCBjaCkpKTsKKwlwcmludGsoIlNUMD0weCUwMngsIFNUMT0weCUwMngsIFNUMj0weCUwMngsIFNUMz0weCUwMngsIFNUND0weCUwMnhcbiIsCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoU1QwLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFNUMSwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhTVDIsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoU1QzLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFNUNCwgY2gpKSk7CisJcHJpbnRrICgiQ1NUMD0weCUwMngsIENTVDE9MHglMDJ4LCBDU1QyPTB4JTAyeCwgQ1NUMz0weCUwMngsIEZTVD0weCUwMnhcbiIsCisJCSBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKENTVDAsIGNoKSksCisJCSBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKENTVDEsIGNoKSksCisJCSBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKENTVDIsIGNoKSksCisJCSBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKENTVDMsIGNoKSksCisJCSBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKEZTVCwgY2gpKSk7CisJcHJpbnRrKCJUUkMwPTB4JTAyeCwgVFJDMT0weCUwMngsIFJSQz0weCUwMngsIFRCTj0weCUwMngsIFJCTj0weCUwMnhcbiIsCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoVFJDMCwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhUUkMxLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFJSQywgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhUQk4sIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoUkJOLCBjaCkpKTsKKwlwcmludGsoIlRGUz0weCUwMngsIFROUjA9MHglMDJ4LCBUTlIxPTB4JTAyeCwgUk5SPTB4JTAyeFxuIiwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhURlMsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoVE5SMCwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhUTlIxLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFJOUiwgY2gpKSk7CisJcHJpbnRrKCJUQ1I9MHglMDJ4LCBSQ1I9MHglMDJ4LCBUTlIxPTB4JTAyeCwgUk5SPTB4JTAyeFxuIiwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhUQ1IsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoUkNSLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFROUjEsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoUk5SLCBjaCkpKTsKKwlwcmludGsoIlRYUz0weCUwMngsIFJYUz0weCUwMngsIEVYUz0weCUwMngsIFRNQ1Q9MHglMDJ4LCBUTUNSPTB4JTAyeFxuIiwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhUWFMsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoUlhTLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKEVYUywgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhUTUNULCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFRNQ1IsIGNoKSkpOworCXByaW50aygiSUUwPTB4JTAyeCwgSUUxPTB4JTAyeCwgSUUyPTB4JTAyeCwgSUU0PTB4JTAyeCwgRklFPTB4JTAyeFxuIiwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhJRTAsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoSUUxLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKElFMiwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhJRTQsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoRklFLCBjaCkpKTsKKwlwcmludGsoIklFUjA9MHglMDh4XG4iLCBjcGNfcmVhZGwoc2NhYmFzZSArIElFUjApKTsKKworCWlmIChpbGFyICE9IDApIHsKKwkJQ1BDX0xPQ0soY2FyZCwgZmxhZ3MpOworCQljcGNfd3JpdGViKHNjYWJhc2UgKyBJTEFSLCBpbGFyKTsKKwkJY3BjX3dyaXRlYihzY2FiYXNlICsgRE1FUiwgMHg4MCk7CisJCUNQQ19VTkxPQ0soY2FyZCwgZmxhZ3MpOworCX0KK30KKwordm9pZCBjcGNfZmFsY19zdGF0dXMocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAmY2FyZC0+Y2hhbltjaF07CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlDUENfTE9DSyhjYXJkLCBmbGFncyk7CisJcHJpbnRrKCJDSCVkOiAgICVzICVzICAlZCBjaGFubmVsc1xuIiwKKwkgICAgICAgY2gsIChwZmFsYy0+c3luYyA/ICJTWU5DIiA6ICIiKSwgKHBmYWxjLT5hY3RpdmUgPyAiQUNUSVZFIiA6ICIiKSwKKwkgICAgICAgcGZhbGMtPm51bV9jaGFubmVscyk7CisKKwlwcmludGsoIiAgICAgICAgcGRlbj0lZCwgIGxvcz0lZCwgIGxvc3I9JWQsICBsZmE9JWQsICBmYXJlYz0lZFxuIiwKKwkgICAgICAgcGZhbGMtPnBkZW4sIHBmYWxjLT5sb3MsIHBmYWxjLT5sb3NyLCBwZmFsYy0+bGZhLCBwZmFsYy0+ZmFyZWMpOworCXByaW50aygiICAgICAgICBsbWZhPSVkLCAgYWlzPSVkLCAgc2VjPSVkLCAgZXM9JWQsICByYWk9JWRcbiIsCisJICAgICAgIHBmYWxjLT5sbWZhLCBwZmFsYy0+YWlzLCBwZmFsYy0+c2VjLCBwZmFsYy0+ZXMsIHBmYWxjLT5yYWkpOworCXByaW50aygiICAgICAgICBiZWM9JWQsICBmZWM9JWQsICBjdmM9JWQsICBjZWM9JWQsICBlYmM9JWRcbiIsCisJICAgICAgIHBmYWxjLT5iZWMsIHBmYWxjLT5mZWMsIHBmYWxjLT5jdmMsIHBmYWxjLT5jZWMsIHBmYWxjLT5lYmMpOworCisJcHJpbnRrKCJcbiIpOworCXByaW50aygiICAgICAgICBTVEFUVVM6ICVzICAlcyAgJXMgICVzICAlcyAgJXNcbiIsCisJICAgICAgIChwZmFsYy0+cmVkX2FsYXJtID8gIlJFRCIgOiAiIiksCisJICAgICAgIChwZmFsYy0+Ymx1ZV9hbGFybSA/ICJCTFUiIDogIiIpLAorCSAgICAgICAocGZhbGMtPnllbGxvd19hbGFybSA/ICJZRUwiIDogIiIpLAorCSAgICAgICAocGZhbGMtPmxvc3NfZmEgPyAiTEZBIiA6ICIiKSwKKwkgICAgICAgKHBmYWxjLT5sb3NzX21mYSA/ICJMTUYiIDogIiIpLCAocGZhbGMtPnByYnMgPyAiUFJCIiA6ICIiKSk7CisJQ1BDX1VOTE9DSyhjYXJkLCBmbGFncyk7Cit9CisKK2ludCBjcGNfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAoKG5ld19tdHUgPCAxMjgpIHx8IChuZXdfbXR1ID4gUEMzMDBfREVGX01UVSkpCisJCXJldHVybiAtRUlOVkFMOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNwY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJcGMzMDBkZXZfdCAqZCA9IChwYzMwMGRldl90ICopIGRldi0+cHJpdjsKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopIGQtPmNoYW47CisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopIGNoYW4tPmNhcmQ7CisJcGMzMDBjb25mX3QgY29uZl9hdXg7CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwlpbnQgY2ggPSBjaGFuLT5jaGFubmVsOworCXZvaWQgX191c2VyICphcmcgPSBpZnItPmlmcl9kYXRhOworCXN0cnVjdCBpZl9zZXR0aW5ncyAqc2V0dGluZ3MgPSAmaWZyLT5pZnJfc2V0dGluZ3M7CisJdm9pZCBfX2lvbWVtICpzY2FiYXNlID0gY2FyZC0+aHcuc2NhYmFzZTsKKworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgU0lPQ0dQQzMwMENPTkY6CisjaWZkZWYgQ09ORklHX1BDMzAwX01MUFBQCisJCQlpZiAoY29uZi0+cHJvdG8gIT0gUEMzMDBfUFJPVE9fTUxQUFApIHsKKwkJCQljb25mLT5wcm90byA9IGhkbGMtPnByb3RvLmlkOworCQkJfQorI2Vsc2UKKwkJCWNvbmYtPnByb3RvID0gaGRsYy0+cHJvdG8uaWQ7CisjZW5kaWYKKwkJCW1lbWNweSgmY29uZl9hdXguY29uZiwgY29uZiwgc2l6ZW9mKHBjMzAwY2hjb25mX3QpKTsKKwkJCW1lbWNweSgmY29uZl9hdXguaHcsICZjYXJkLT5odywgc2l6ZW9mKHBjMzAwaHdfdCkpOworCQkJaWYgKCFhcmcgfHwgCisJCQkJY29weV90b191c2VyKGFyZywgJmNvbmZfYXV4LCBzaXplb2YocGMzMDBjb25mX3QpKSkgCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBTSU9DU1BDMzAwQ09ORjoKKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJaWYgKCFhcmcgfHwgCisJCQkJY29weV9mcm9tX3VzZXIoJmNvbmZfYXV4LmNvbmYsIGFyZywgc2l6ZW9mKHBjMzAwY2hjb25mX3QpKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChjYXJkLT5ody5jcGxkX2lkIDwgMHgwMiAmJgorCQkJICAgIGNvbmZfYXV4LmNvbmYuZnJfbW9kZSA9PSBQQzMwMF9GUl9VTkZSQU1FRCkgeworCQkJCS8qIENQTERfSUQgPCAweDAyIGRvZXNuJ3Qgc3VwcG9ydCBVbmZyYW1lZCBFMSAqLworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorI2lmZGVmIENPTkZJR19QQzMwMF9NTFBQUAorCQkJaWYgKGNvbmZfYXV4LmNvbmYucHJvdG8gPT0gUEMzMDBfUFJPVE9fTUxQUFApIHsKKwkJCQlpZiAoY29uZi0+cHJvdG8gIT0gUEMzMDBfUFJPVE9fTUxQUFApIHsKKwkJCQkJbWVtY3B5KGNvbmYsICZjb25mX2F1eC5jb25mLCBzaXplb2YocGMzMDBjaGNvbmZfdCkpOworCQkJCQljcGNfdHR5X2luaXQoZCk7CS8qIGluaXQgVFRZIGRyaXZlciAqLworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNvbmZfYXV4LmNvbmYucHJvdG8gPT0gMHhmZmZmKSB7CisJCQkJCWlmIChjb25mLT5wcm90byA9PSBQQzMwMF9QUk9UT19NTFBQUCl7IAorCQkJCQkJLyogaWZkb3duIGludGVyZmFjZSAqLworCQkJCQkJY3BjX2Nsb3NlKGRldik7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQltZW1jcHkoY29uZiwgJmNvbmZfYXV4LmNvbmYsIHNpemVvZihwYzMwMGNoY29uZl90KSk7CisJCQkJCWhkbGMtPnByb3RvLmlkID0gY29uZi0+cHJvdG87CisJCQkJfQorCQkJfQorI2Vsc2UKKwkJCW1lbWNweShjb25mLCAmY29uZl9hdXguY29uZiwgc2l6ZW9mKHBjMzAwY2hjb25mX3QpKTsKKwkJCWhkbGMtPnByb3RvLmlkID0gY29uZi0+cHJvdG87CisjZW5kaWYKKwkJCXJldHVybiAwOworCQljYXNlIFNJT0NHUEMzMDBTVEFUVVM6CisJCQljcGNfc2NhX3N0YXR1cyhjYXJkLCBjaCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBTSU9DR1BDMzAwRkFMQ1NUQVRVUzoKKwkJCWNwY19mYWxjX3N0YXR1cyhjYXJkLCBjaCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNJT0NHUEMzMDBVVElMU1RBVFM6CisJCQl7CisJCQkJaWYgKCFhcmcpIHsJLyogY2xlYXIgc3RhdGlzdGljcyAqLworCQkJCQltZW1zZXQoJmhkbGMtPnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKwkJCQkJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsKKwkJCQkJCW1lbXNldCgmY2hhbi0+ZmFsYywgMCwgc2l6ZW9mKGZhbGNfdCkpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcGMzMDBzdGF0c190IHBjMzAwc3RhdHM7CisKKwkJCQkJbWVtc2V0KCZwYzMwMHN0YXRzLCAwLCBzaXplb2YocGMzMDBzdGF0c190KSk7CisJCQkJCXBjMzAwc3RhdHMuaHdfdHlwZSA9IGNhcmQtPmh3LnR5cGU7CisJCQkJCXBjMzAwc3RhdHMubGluZV9vbiA9IGNhcmQtPmNoYW5bY2hdLmQubGluZV9vbjsKKwkJCQkJcGMzMDBzdGF0cy5saW5lX29mZiA9IGNhcmQtPmNoYW5bY2hdLmQubGluZV9vZmY7CisJCQkJCW1lbWNweSgmcGMzMDBzdGF0cy5nZW5fc3RhdHMsICZoZGxjLT5zdGF0cywKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCQkJCQlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkKKwkJCQkJCW1lbWNweSgmcGMzMDBzdGF0cy50ZV9zdGF0cywmY2hhbi0+ZmFsYyxzaXplb2YoZmFsY190KSk7CisJCQkJICAgIAlpZiAoY29weV90b191c2VyKGFyZywgJnBjMzAwc3RhdHMsIHNpemVvZihwYzMwMHN0YXRzX3QpKSkKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQljYXNlIFNJT0NHUEMzMDBVVElMU1RBVFVTOgorCQkJeworCQkJCXN0cnVjdCBwYzMwMHN0YXR1cyBwYzMwMHN0YXR1czsKKworCQkJCXBjMzAwc3RhdHVzLmh3X3R5cGUgPSBjYXJkLT5ody50eXBlOworCQkJCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7CisJCQkJCXBjMzAwc3RhdHVzLnRlX3N0YXR1cy5zeW5jID0gY2hhbi0+ZmFsYy5zeW5jOworCQkJCQlwYzMwMHN0YXR1cy50ZV9zdGF0dXMucmVkX2FsYXJtID0gY2hhbi0+ZmFsYy5yZWRfYWxhcm07CisJCQkJCXBjMzAwc3RhdHVzLnRlX3N0YXR1cy5ibHVlX2FsYXJtID0gY2hhbi0+ZmFsYy5ibHVlX2FsYXJtOworCQkJCQlwYzMwMHN0YXR1cy50ZV9zdGF0dXMubG9zc19mYSA9IGNoYW4tPmZhbGMubG9zc19mYTsKKwkJCQkJcGMzMDBzdGF0dXMudGVfc3RhdHVzLnllbGxvd19hbGFybSA9Y2hhbi0+ZmFsYy55ZWxsb3dfYWxhcm07CisJCQkJCXBjMzAwc3RhdHVzLnRlX3N0YXR1cy5sb3NzX21mYSA9IGNoYW4tPmZhbGMubG9zc19tZmE7CisJCQkJCXBjMzAwc3RhdHVzLnRlX3N0YXR1cy5wcmJzID0gY2hhbi0+ZmFsYy5wcmJzOworCQkJCX0gZWxzZSB7CisJCQkJCXBjMzAwc3RhdHVzLmdlbl9zdGF0dXMuZGNkID0KKwkJCQkJCSEoY3BjX3JlYWRiIChzY2FiYXNlICsgTV9SRUcoU1QzLCBjaCkpICYgU1QzX0RDRCk7CisJCQkJCXBjMzAwc3RhdHVzLmdlbl9zdGF0dXMuY3RzID0KKwkJCQkJCSEoY3BjX3JlYWRiIChzY2FiYXNlICsgTV9SRUcoU1QzLCBjaCkpICYgU1QzX0NUUyk7CisJCQkJCXBjMzAwc3RhdHVzLmdlbl9zdGF0dXMucnRzID0KKwkJCQkJCSEoY3BjX3JlYWRiIChzY2FiYXNlICsgTV9SRUcoQ1RMLCBjaCkpICYgQ1RMX1JUUyk7CisJCQkJCXBjMzAwc3RhdHVzLmdlbl9zdGF0dXMuZHRyID0KKwkJCQkJCSEoY3BjX3JlYWRiIChzY2FiYXNlICsgTV9SRUcoQ1RMLCBjaCkpICYgQ1RMX0RUUik7CisJCQkJCS8qIFRoZXJlIGlzIG5vIERTUiBpbiBIRDY0NTcyICovCisJCQkJfQorCQkJCWlmICghYXJnCisJCQkJICAgIHx8IGNvcHlfdG9fdXNlcihhcmcsICZwYzMwMHN0YXR1cywgc2l6ZW9mKHBjMzAwc3RhdHVzX3QpKSkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCXJldHVybiAwOworCQkJfQorCisJCWNhc2UgU0lPQ1NQQzMwMFRSQUNFOgorCQkJLyogU2V0cy9yZXNldHMgYSB0cmFjZV9mbGFnIGZvciB0aGUgcmVzcGVjdGl2ZSBkZXZpY2UgKi8KKwkJCWlmICghYXJnIHx8IGNvcHlfZnJvbV91c2VyKCZkLT50cmFjZV9vbiwgYXJnLHNpemVvZih1bnNpZ25lZCBjaGFyKSkpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTSU9DU1BDMzAwTE9PUEJBQ0s6CisJCQl7CisJCQkJc3RydWN0IHBjMzAwbG9vcGJhY2sgcGMzMDBsb29wOworCisJCQkJLyogVEUgYm9hcmRzIG9ubHkgKi8KKwkJCQlpZiAoY2FyZC0+aHcudHlwZSAhPSBQQzMwMF9URSkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCQlpZiAoIWFyZyB8fCAKKwkJCQkJY29weV9mcm9tX3VzZXIoJnBjMzAwbG9vcCwgYXJnLCBzaXplb2YocGMzMDBsb29wYmFja190KSkpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlzd2l0Y2ggKHBjMzAwbG9vcC5sb29wX3R5cGUpIHsKKwkJCQkJY2FzZSBQQzMwMExPQ0xPT1A6CS8qIFR1cm4gdGhlIGxvY2FsIGxvb3Agb24vb2ZmICovCisJCQkJCQlmYWxjX2xvY2FsX2xvb3AoY2FyZCwgY2gsIHBjMzAwbG9vcC5sb29wX29uKTsKKwkJCQkJCXJldHVybiAwOworCisJCQkJCWNhc2UgUEMzMDBSRU1MT09QOgkvKiBUdXJuIHRoZSByZW1vdGUgbG9vcCBvbi9vZmYgKi8KKwkJCQkJCWZhbGNfcmVtb3RlX2xvb3AoY2FyZCwgY2gsIHBjMzAwbG9vcC5sb29wX29uKTsKKwkJCQkJCXJldHVybiAwOworCisJCQkJCWNhc2UgUEMzMDBQQVlMT0FETE9PUDoJLyogVHVybiB0aGUgcGF5bG9hZCBsb29wIG9uL29mZiAqLworCQkJCQkJZmFsY19wYXlsb2FkX2xvb3AoY2FyZCwgY2gsIHBjMzAwbG9vcC5sb29wX29uKTsKKwkJCQkJCXJldHVybiAwOworCisJCQkJCWNhc2UgUEMzMDBHRU5MT09QVVA6CS8qIEdlbmVyYXRlIGxvb3AgVVAgKi8KKwkJCQkJCWlmIChwYzMwMGxvb3AubG9vcF9vbikgeworCQkJCQkJCWZhbGNfZ2VuZXJhdGVfbG9vcF91cF9jb2RlIChjYXJkLCBjaCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXR1cm5fb2ZmX3hsdShjYXJkLCBjaCk7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gMDsKKworCQkJCQljYXNlIFBDMzAwR0VOTE9PUERPV046CS8qIEdlbmVyYXRlIGxvb3AgRE9XTiAqLworCQkJCQkJaWYgKHBjMzAwbG9vcC5sb29wX29uKSB7CisJCQkJCQkJZmFsY19nZW5lcmF0ZV9sb29wX2Rvd25fY29kZSAoY2FyZCwgY2gpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0dXJuX29mZl94bGQoY2FyZCwgY2gpOworCQkJCQkJfQorCQkJCQkJcmV0dXJuIDA7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0KKworCQljYXNlIFNJT0NTUEMzMDBQQVRURVJOVEVTVDoKKwkJCS8qIFR1cm4gdGhlIHBhdHRlcm4gdGVzdCBvbi9vZmYgYW5kIHNob3cgdGhlIGVycm9ycyBjb3VudGVyICovCisJCQl7CisJCQkJc3RydWN0IHBjMzAwcGF0dGVybnRzdCBwYzMwMHBhdHJudHN0OworCisJCQkJLyogVEUgYm9hcmRzIG9ubHkgKi8KKwkJCQlpZiAoY2FyZC0+aHcudHlwZSAhPSBQQzMwMF9URSkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCQlpZiAoY2FyZC0+aHcuY3BsZF9pZCA8IDB4MDIpIHsKKwkJCQkJLyogQ1BMRF9JRCA8IDB4MDIgZG9lc24ndCBzdXBwb3J0IHBhdHRlcm4gdGVzdCAqLworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQlpZiAoIWFyZyB8fCAKKwkJCQkJY29weV9mcm9tX3VzZXIoJnBjMzAwcGF0cm50c3QsYXJnLHNpemVvZihwYzMwMHBhdHRlcm50c3RfdCkpKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJaWYgKHBjMzAwcGF0cm50c3QucGF0cm50c3Rfb24gPT0gMikgeworCQkJCQlpZiAoY2hhbi0+ZmFsYy5wcmJzID09IDApIHsKKwkJCQkJCWZhbGNfcGF0dGVybl90ZXN0KGNhcmQsIGNoLCAxKTsKKwkJCQkJfQorCQkJCQlwYzMwMHBhdHJudHN0Lm51bV9lcnJvcnMgPQorCQkJCQkJZmFsY19wYXR0ZXJuX3Rlc3RfZXJyb3IoY2FyZCwgY2gpOworCQkJCQlpZiAoIWFyZworCQkJCQkgICAgfHwgY29weV90b191c2VyKGFyZywgJnBjMzAwcGF0cm50c3QsCisJCQkJCQkJICAgIHNpemVvZiAocGMzMDBwYXR0ZXJudHN0X3QpKSkKKwkJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9IGVsc2UgeworCQkJCQlmYWxjX3BhdHRlcm5fdGVzdChjYXJkLCBjaCwgcGMzMDBwYXRybnRzdC5wYXRybnRzdF9vbik7CisJCQkJfQorCQkJCXJldHVybiAwOworCQkJfQorCisJCWNhc2UgU0lPQ1dBTkRFVjoKKwkJCXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCQkJCWNhc2UgSUZfR0VUX0lGQUNFOgorCQkJCXsKKwkJCQkJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2Yoc3luY19zZXJpYWxfc2V0dGluZ3MpOworCQkJCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gY29uZi0+bWVkaWE7CisJCQkJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJCQkJLyogZGF0YSBzaXplIHdhbnRlZCAqLworCQkJCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7CisJCQkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCQkJCX0KKwkKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcihzZXR0aW5ncy0+aWZzX2lmc3Uuc3luYywKKwkJCQkJCQkgJmNvbmYtPnBoeXNfc2V0dGluZ3MsIHNpemUpKSB7CisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJfQorCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisKKwkJCQljYXNlIElGX0lGQUNFX1YzNToKKwkJCQljYXNlIElGX0lGQUNFX1YyNDoKKwkJCQljYXNlIElGX0lGQUNFX1gyMToKKwkJCQl7CisJCQkJCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKHN5bmNfc2VyaWFsX3NldHRpbmdzKTsKKworCQkJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCQkJCXJldHVybiAtRVBFUk07CisJCQkJCX0KKwkJCQkJLyogaW5jb3JyZWN0IGRhdGEgbGVuPyAqLworCQkJCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSAhPSBzaXplKSB7CisJCQkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCQkJCX0KKworCQkJCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbmYtPnBoeXNfc2V0dGluZ3MsIAorCQkJCQkJCSAgIHNldHRpbmdzLT5pZnNfaWZzdS5zeW5jLCBzaXplKSkgeworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKworCQkJCQlpZiAoY29uZi0+cGh5c19zZXR0aW5ncy5sb29wYmFjaykgeworCQkJCQkJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgTV9SRUcoTUQyLCBjaCksCisJCQkJCQkJY3BjX3JlYWRiKGNhcmQtPmh3LnNjYWJhc2UgKyBNX1JFRyhNRDIsIGNoKSkgfCAKKwkJCQkJCQlNRDJfTE9PUF9NSVIpOworCQkJCQl9CisJCQkJCWNvbmYtPm1lZGlhID0gaWZyLT5pZnJfc2V0dGluZ3MudHlwZTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCisJCQkJY2FzZSBJRl9JRkFDRV9UMToKKwkJCQljYXNlIElGX0lGQUNFX0UxOgorCQkJCXsKKwkJCQkJY29uc3Qgc2l6ZV90IHRlX3NpemUgPSBzaXplb2YodGUxX3NldHRpbmdzKTsKKwkJCQkJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2Yoc3luY19zZXJpYWxfc2V0dGluZ3MpOworCisJCQkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCQkJfQorCisJCQkJCS8qIGluY29ycmVjdCBkYXRhIGxlbj8gKi8KKwkJCQkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgIT0gdGVfc2l6ZSkgeworCQkJCQkJcmV0dXJuIC1FTk9CVUZTOworCQkJCQl9CisKKwkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb25mLT5waHlzX3NldHRpbmdzLCAKKwkJCQkJCQkgICBzZXR0aW5ncy0+aWZzX2lmc3UudGUxLCBzaXplKSkgeworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0vKiBJZ25vcmluZyBIRExDIHNsb3RfbWFwIGZvciBhIHdoaWxlICovCisJCQkJCQorCQkJCQlpZiAoY29uZi0+cGh5c19zZXR0aW5ncy5sb29wYmFjaykgeworCQkJCQkJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgTV9SRUcoTUQyLCBjaCksCisJCQkJCQkJY3BjX3JlYWRiKGNhcmQtPmh3LnNjYWJhc2UgKyBNX1JFRyhNRDIsIGNoKSkgfCAKKwkJCQkJCQlNRDJfTE9PUF9NSVIpOworCQkJCQl9CisJCQkJCWNvbmYtPm1lZGlhID0gaWZyLT5pZnJfc2V0dGluZ3MudHlwZTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCQkJfQorCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqY3BjX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBoZGxjX3N0YXRzKGRldik7Cit9CisKK3N0YXRpYyBpbnQgY2xvY2tfcmF0ZV9jYWxjKHVjbG9uZyByYXRlLCB1Y2xvbmcgY2xvY2ssIGludCAqYnJfaW8pCit7CisJaW50IGJyLCB0YzsKKwlpbnQgYnJfcHdyLCBlcnJvcjsKKworCWlmIChyYXRlID09IDApCisJCXJldHVybiAoMCk7CisKKwlmb3IgKGJyID0gMCwgYnJfcHdyID0gMTsgYnIgPD0gOTsgYnIrKywgYnJfcHdyIDw8PSAxKSB7CisJCWlmICgodGMgPSBjbG9jayAvIGJyX3B3ciAvIHJhdGUpIDw9IDB4ZmYpIHsKKwkJCSpicl9pbyA9IGJyOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAodGMgPD0gMHhmZikgeworCQllcnJvciA9ICgocmF0ZSAtIChjbG9jayAvIGJyX3B3ciAvIHJhdGUpKSAvIHJhdGUpICogMTAwMDsKKwkJLyogRXJyb3JzIGJpZ2dlciB0aGFuICsvLSAxJSB3b24ndCBiZSB0b2xlcmF0ZWQgKi8KKwkJaWYgKGVycm9yIDwgLTEwIHx8IGVycm9yID4gMTApCisJCQlyZXR1cm4gKC0xKTsKKwkJZWxzZQorCQkJcmV0dXJuICh0Yyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuICgtMSk7CisJfQorfQorCitpbnQgY2hfY29uZmlnKHBjMzAwZGV2X3QgKiBkKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgZC0+Y2hhbjsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKSBjaGFuLT5jYXJkOworCXZvaWQgX19pb21lbSAqc2NhYmFzZSA9IGNhcmQtPmh3LnNjYWJhc2U7CisJdm9pZCBfX2lvbWVtICpwbHhiYXNlID0gY2FyZC0+aHcucGx4YmFzZTsKKwlpbnQgY2ggPSBjaGFuLT5jaGFubmVsOworCXVjbG9uZyBjbGtyYXRlID0gY2hhbi0+Y29uZi5waHlzX3NldHRpbmdzLmNsb2NrX3JhdGU7CisJdWNsb25nIGNsa3R5cGUgPSBjaGFuLT5jb25mLnBoeXNfc2V0dGluZ3MuY2xvY2tfdHlwZTsKKwl1Y3Nob3J0IGVuY29kaW5nID0gY2hhbi0+Y29uZi5wcm90b19zZXR0aW5ncy5lbmNvZGluZzsKKwl1Y3Nob3J0IHBhcml0eSA9IGNoYW4tPmNvbmYucHJvdG9fc2V0dGluZ3MucGFyaXR5OyAgIAorCWludCB0bWMsIGJyOworCXVjY2hhciBtZDAsIG1kMjsKKyAgICAKKwkvKiBSZXNldCB0aGUgY2hhbm5lbCAqLworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKENNRCwgY2gpLCBDTURfQ0hfUlNUKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgU0NBIHJlZ2lzdGVycyAqLworCXN3aXRjaCAocGFyaXR5KSB7CisJCWNhc2UgUEFSSVRZX05PTkU6CisJCQltZDAgPSBNRDBfQklUX1NZTkM7CisJCQlicmVhazsKKwkJY2FzZSBQQVJJVFlfQ1JDMTZfUFIwOgorCQkJbWQwID0gTUQwX0NSQzE2XzB8TUQwX0NSQ0MwfE1EMF9CSVRfU1lOQzsKKwkJCWJyZWFrOworCQljYXNlIFBBUklUWV9DUkMxNl9QUjE6CisJCQltZDAgPSBNRDBfQ1JDMTZfMXxNRDBfQ1JDQzB8TUQwX0JJVF9TWU5DOworCQkJYnJlYWs7CisJCWNhc2UgUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVDoKKwkJCW1kMCA9IE1EMF9DUkMzMnxNRDBfQ1JDQzB8TUQwX0JJVF9TWU5DOworCQkJYnJlYWs7CisJCWNhc2UgUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVDoKKwkJZGVmYXVsdDoKKwkJCW1kMCA9IE1EMF9DUkNfQ0NJVFR8TUQwX0NSQ0MwfE1EMF9CSVRfU1lOQzsKKwkJCWJyZWFrOworCX0KKwlzd2l0Y2ggKGVuY29kaW5nKSB7CisJCWNhc2UgRU5DT0RJTkdfTlJaSToKKwkJCW1kMiA9IE1EMl9GX0RVUExFWHxNRDJfQURQTExfWDh8TUQyX05SWkk7CisJCQlicmVhazsKKwkJY2FzZSBFTkNPRElOR19GTV9NQVJLOgkvKiBGTTEgKi8KKwkJCW1kMiA9IE1EMl9GX0RVUExFWHxNRDJfQURQTExfWDh8TUQyX0ZNfE1EMl9GTTE7CisJCQlicmVhazsKKwkJY2FzZSBFTkNPRElOR19GTV9TUEFDRToJLyogRk0wICovCisJCQltZDIgPSBNRDJfRl9EVVBMRVh8TUQyX0FEUExMX1g4fE1EMl9GTXxNRDJfRk0wOworCQkJYnJlYWs7CisJCWNhc2UgRU5DT0RJTkdfTUFOQ0hFU1RFUjogLyogSXQncyBub3Qgd29ya2luZy4uLiAqLworCQkJbWQyID0gTUQyX0ZfRFVQTEVYfE1EMl9BRFBMTF9YOHxNRDJfRk18TUQyX01BTkNIOworCQkJYnJlYWs7CisJCWNhc2UgRU5DT0RJTkdfTlJaOgorCQlkZWZhdWx0OgorCQkJbWQyID0gTUQyX0ZfRFVQTEVYfE1EMl9BRFBMTF9YOHxNRDJfTlJaOworCQkJYnJlYWs7CisJfQorCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKE1EMCwgY2gpLCBtZDApOworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKE1EMSwgY2gpLCAwKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhNRDIsIGNoKSwgbWQyKTsKKyAJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoSURMLCBjaCksIDB4N2UpOworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKENUTCwgY2gpLCBDVExfVVJTS1AgfCBDVExfSURMQyk7CisKKwkvKiBDb25maWd1cmUgSFcgbWVkaWEgKi8KKwlzd2l0Y2ggKGNhcmQtPmh3LnR5cGUpIHsKKwkJY2FzZSBQQzMwMF9SU1Y6CisJCQlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVjM1KSB7CisJCQkJY3BjX3dyaXRlbCgocGx4YmFzZSArIGNhcmQtPmh3LmdwaW9jX3JlZyksCisJCQkJCSAgIGNwY19yZWFkbChwbHhiYXNlICsgY2FyZC0+aHcuZ3Bpb2NfcmVnKSB8IFBDMzAwX0NITUVESUFfTUFTSyhjaCkpOworCQkJfSBlbHNlIHsKKwkJCQljcGNfd3JpdGVsKChwbHhiYXNlICsgY2FyZC0+aHcuZ3Bpb2NfcmVnKSwKKwkJCQkJICAgY3BjX3JlYWRsKHBseGJhc2UgKyBjYXJkLT5ody5ncGlvY19yZWcpICYgflBDMzAwX0NITUVESUFfTUFTSyhjaCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBQQzMwMF9YMjE6CisJCQlicmVhazsKKworCQljYXNlIFBDMzAwX1RFOgorCQkJdGVfY29uZmlnKGNhcmQsIGNoKTsKKwkJCWJyZWFrOworCX0KKworCXN3aXRjaCAoY2FyZC0+aHcudHlwZSkgeworCQljYXNlIFBDMzAwX1JTVjoKKwkJY2FzZSBQQzMwMF9YMjE6CisJCQlpZiAoY2xrdHlwZSA9PSBDTE9DS19JTlQgfHwgY2xrdHlwZSA9PSBDTE9DS19UWElOVCkgeworCQkJCS8qIENhbGN1bGF0ZSB0aGUgY2xrcmF0ZSBwYXJhbWV0ZXJzICovCisJCQkJdG1jID0gY2xvY2tfcmF0ZV9jYWxjKGNsa3JhdGUsIGNhcmQtPmh3LmNsb2NrLCAmYnIpOworCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRNQ1QsIGNoKSwgdG1jKTsKKwkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUWFMsIGNoKSwKKwkJCQkJICAgKFRYU19EVFJYQyB8IFRYU19JQlJHIHwgYnIpKTsKKwkJCQlpZiAoY2xrdHlwZSA9PSBDTE9DS19JTlQpIHsKKwkJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVE1DUiwgY2gpLCB0bWMpOworCQkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhSWFMsIGNoKSwgCisJCQkJCQkgICAoUlhTX0lCUkcgfCBicikpOworCQkJCX0gZWxzZSB7CisJCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRNQ1IsIGNoKSwgMSk7CisJCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFJYUywgY2gpLCAwKTsKKwkJCQl9CisJICAgIAkJCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1gyMSkgeworCQkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhHUE8sIGNoKSwgMSk7CisJCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKEVYUywgY2gpLCBFWFNfVEVTMSB8IEVYU19SRVMxKTsKKwkJCQl9IGVsc2UgeworCQkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhFWFMsIGNoKSwgRVhTX1RFUzEpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVE1DVCwgY2gpLCAxKTsKKwkJCQlpZiAoY2xrdHlwZSA9PSBDTE9DS19FWFQpIHsKKwkJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVFhTLCBjaCksIAorCQkJCQkJICAgVFhTX0RUUlhDKTsKKwkJCQl9IGVsc2UgeworCQkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUWFMsIGNoKSwgCisJCQkJCQkgICBUWFNfRFRSWEN8VFhTX1JDTEspOworCQkJCX0KKwkgICAgCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVE1DUiwgY2gpLCAxKTsKKwkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhSWFMsIGNoKSwgMCk7CisJCQkJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfWDIxKSB7CisJCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKEdQTywgY2gpLCAwKTsKKwkJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoRVhTLCBjaCksIEVYU19URVMxIHwgRVhTX1JFUzEpOworCQkJCX0gZWxzZSB7CisJCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKEVYUywgY2gpLCBFWFNfVEVTMSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBQQzMwMF9URToKKwkJCS8qIFNDQSBhbHdheXMgcmVjZWl2ZXMgY2xvY2sgZnJvbSB0aGUgRkFMQyBjaGlwICovCisJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUTUNULCBjaCksIDEpOworCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVFhTLCBjaCksIDApOworCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVE1DUiwgY2gpLCAxKTsKKwkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFJYUywgY2gpLCAwKTsKKwkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKEVYUywgY2gpLCAwKTsKKwkJCWJyZWFrOworCX0KKworCS8qIEVuYWJsZSBJbnRlcnJ1cHRzICovCisJY3BjX3dyaXRlbChzY2FiYXNlICsgSUVSMCwKKwkJICAgY3BjX3JlYWRsKHNjYWJhc2UgKyBJRVIwKSB8CisJCSAgIElSMF9NKElSMF9SWElOVEEsIGNoKSB8CisJCSAgIElSMF9EUlgoSVIwX0VGVCB8IElSMF9ETUlBIHwgSVIwX0RNSUIsIGNoKSB8CisJCSAgIElSMF9EVFgoSVIwX0VGVCB8IElSMF9ETUlBIHwgSVIwX0RNSUIsIGNoKSk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoSUUwLCBjaCksCisJCSAgIGNwY19yZWFkbChzY2FiYXNlICsgTV9SRUcoSUUwLCBjaCkpIHwgSUUwX1JYSU5UQSk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoSUUxLCBjaCksCisJCSAgIGNwY19yZWFkbChzY2FiYXNlICsgTV9SRUcoSUUxLCBjaCkpIHwgSUUxX0NEQ0QpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCByeF9jb25maWcocGMzMDBkZXZfdCAqIGQpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSBkLT5jaGFuOworCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKSBjaGFuLT5jYXJkOworCXZvaWQgX19pb21lbSAqc2NhYmFzZSA9IGNhcmQtPmh3LnNjYWJhc2U7CisJaW50IGNoID0gY2hhbi0+Y2hhbm5lbDsKKworCWNwY193cml0ZWIoc2NhYmFzZSArIERTUl9SWChjaCksIDApOworCisJLyogR2VuZXJhbCBSWCBzZXR0aW5ncyAqLworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFJSQywgY2gpLCAwKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhSTlIsIGNoKSwgMTYpOworCisJLyogRW5hYmxlIHJlY2VwdGlvbiAqLworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKENNRCwgY2gpLCBDTURfUlhfQ1JDX0lOSVQpOworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKENNRCwgY2gpLCBDTURfUlhfRU5BKTsKKworCS8qIEluaXRpYWxpemUgRE1BIHN0dWZmICovCisJY2hhbi0+cnhfZmlyc3RfYmQgPSAwOworCWNoYW4tPnJ4X2xhc3RfYmQgPSBOX0RNQV9SWF9CVUYgLSAxOworCXJ4X2RtYV9idWZfaW5pdChjYXJkLCBjaCk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgRENSX1JYKGNoKSwgRENSX0ZDVF9DTFIpOworCWNwY193cml0ZWIoc2NhYmFzZSArIERNUl9SWChjaCksIChETVJfVE1PRCB8IERNUl9ORikpOworCWNwY193cml0ZWIoc2NhYmFzZSArIERJUl9SWChjaCksIChESVJfRU9NIHwgRElSX0JPRikpOworCisJLyogU3RhcnQgRE1BICovCisJcnhfZG1hX3N0YXJ0KGNhcmQsIGNoKTsKKworCXJldHVybiAwOworfQorCitpbnQgdHhfY29uZmlnKHBjMzAwZGV2X3QgKiBkKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgZC0+Y2hhbjsKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKikgY2hhbi0+Y2FyZDsKKwl2b2lkIF9faW9tZW0gKnNjYWJhc2UgPSBjYXJkLT5ody5zY2FiYXNlOworCWludCBjaCA9IGNoYW4tPmNoYW5uZWw7CisKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBEU1JfVFgoY2gpLCAwKTsKKworCS8qIEdlbmVyYWwgVFggc2V0dGluZ3MgKi8KKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUUkMwLCBjaCksIDApOworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRGUywgY2gpLCAzMik7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVE5SMCwgY2gpLCAyMCk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVE5SMSwgY2gpLCA0OCk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVENSLCBjaCksIDgpOworCisJLyogRW5hYmxlIHRyYW5zbWlzc2lvbiAqLworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKENNRCwgY2gpLCBDTURfVFhfQ1JDX0lOSVQpOworCisJLyogSW5pdGlhbGl6ZSBETUEgc3R1ZmYgKi8KKwljaGFuLT50eF9maXJzdF9iZCA9IDA7CisJY2hhbi0+dHhfbmV4dF9iZCA9IDA7CisJdHhfZG1hX2J1Zl9pbml0KGNhcmQsIGNoKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBEQ1JfVFgoY2gpLCBEQ1JfRkNUX0NMUik7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgRE1SX1RYKGNoKSwgKERNUl9UTU9EIHwgRE1SX05GKSk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgRElSX1RYKGNoKSwgKERJUl9FT00gfCBESVJfQk9GIHwgRElSX1VEUkYpKTsKKwljcGNfd3JpdGVsKHNjYWJhc2UgKyBEVFhfUkVHKENEQUwsIGNoKSwgVFhfQkRfQUREUihjaCwgY2hhbi0+dHhfZmlyc3RfYmQpKTsKKwljcGNfd3JpdGVsKHNjYWJhc2UgKyBEVFhfUkVHKEVEQUwsIGNoKSwgVFhfQkRfQUREUihjaCwgY2hhbi0+dHhfbmV4dF9iZCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3BjX2F0dGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBlbmNvZGluZywKKwkJICAgICAgdW5zaWduZWQgc2hvcnQgcGFyaXR5KQoreworCXBjMzAwZGV2X3QgKmQgPSAocGMzMDBkZXZfdCAqKWRldi0+cHJpdjsKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopZC0+Y2hhbjsKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKiljaGFuLT5jYXJkOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSZjaGFuLT5jb25mOworCisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsKKwkJaWYgKGVuY29kaW5nICE9IEVOQ09ESU5HX05SWiAmJiBlbmNvZGluZyAhPSBFTkNPRElOR19OUlpJKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChlbmNvZGluZyAhPSBFTkNPRElOR19OUlogJiYgZW5jb2RpbmcgIT0gRU5DT0RJTkdfTlJaSSAmJgorCQkgICAgZW5jb2RpbmcgIT0gRU5DT0RJTkdfRk1fTUFSSyAmJiBlbmNvZGluZyAhPSBFTkNPRElOR19GTV9TUEFDRSkgeworCQkJLyogRHJpdmVyIGRvZXNuJ3Qgc3VwcG9ydCBFTkNPRElOR19NQU5DSEVTVEVSIHlldCAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAocGFyaXR5ICE9IFBBUklUWV9OT05FICYmIHBhcml0eSAhPSBQQVJJVFlfQ1JDMTZfUFIwICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMTZfUFIxICYmIHBhcml0eSAhPSBQQVJJVFlfQ1JDMzJfUFIxX0NDSVRUICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvbmYtPnByb3RvX3NldHRpbmdzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisJY29uZi0+cHJvdG9fc2V0dGluZ3MucGFyaXR5ID0gcGFyaXR5OworCXJldHVybiAwOworfQorCit2b2lkIGNwY19vcGVuY2gocGMzMDBkZXZfdCAqIGQpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSBkLT5jaGFuOworCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKSBjaGFuLT5jYXJkOworCWludCBjaCA9IGNoYW4tPmNoYW5uZWw7CisJdm9pZCBfX2lvbWVtICpzY2FiYXNlID0gY2FyZC0+aHcuc2NhYmFzZTsKKworCWNoX2NvbmZpZyhkKTsKKworCXJ4X2NvbmZpZyhkKTsKKworCXR4X2NvbmZpZyhkKTsKKworCS8qIEFzc2VydCBSVFMgYW5kIERUUiAqLworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKENUTCwgY2gpLAorCQkgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKENUTCwgY2gpKSAmIH4oQ1RMX1JUUyB8IENUTF9EVFIpKTsKK30KKwordm9pZCBjcGNfY2xvc2VjaChwYzMwMGRldl90ICogZCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopIGQtPmNoYW47CisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopIGNoYW4tPmNhcmQ7CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCWludCBjaCA9IGNoYW4tPmNoYW5uZWw7CisKKwljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBNX1JFRyhDTUQsIGNoKSwgQ01EX0NIX1JTVCk7CisJcnhfZG1hX3N0b3AoY2FyZCwgY2gpOworCXR4X2RtYV9zdG9wKGNhcmQsIGNoKTsKKworCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7CisJCW1lbXNldChwZmFsYywgMCwgc2l6ZW9mKGZhbGNfdCkpOworCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkJICAgY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyKSAmCisJCQkgICB+KChDUExEX1JFRzJfRkFMQ19UWF9DTEsgfCBDUExEX1JFRzJfRkFMQ19SWF9DTEsgfAorCQkJICAgICAgQ1BMRF9SRUcyX0ZBTENfTEVEMikgPDwgKDIgKiBjaCkpKTsKKwkJLyogUmVzZXQgdGhlIEZBTEMgY2hpcCAqLworCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcxLAorCQkJICAgY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcxKSB8CisJCQkgICAoQ1BMRF9SRUcxX0ZBTENfUkVTRVQgPDwgKDIgKiBjaCkpKTsKKwkJdWRlbGF5KDEwMDAwKTsKKwkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMSwKKwkJCSAgIGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMSkgJgorCQkJICAgfihDUExEX1JFRzFfRkFMQ19SRVNFVCA8PCAoMiAqIGNoKSkpOworCX0KK30KKworaW50IGNwY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCXBjMzAwZGV2X3QgKmQgPSAocGMzMDBkZXZfdCAqKSBkZXYtPnByaXY7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgcmVzdWx0OworCisjaWZkZWYJUEMzMDBfREVCVUdfT1RIRVIKKwlwcmludGsoInBjMzAwOiBjcGNfb3BlbiIpOworI2VuZGlmCisKKwlpZiAoaGRsYy0+cHJvdG8uaWQgPT0gSUZfUFJPVE9fUFBQKSB7CisJCWQtPmlmX3B0ciA9ICZoZGxjLT5zdGF0ZS5wcHAucHBwZGV2OworCX0KKworCXJlc3VsdCA9IGhkbGNfb3BlbihkZXYpOworCWlmIChoZGxjLT5wcm90by5pZCA9PSBJRl9QUk9UT19QUFApIHsKKwkJZGV2LT5wcml2ID0gZDsKKwl9CisJaWYgKHJlc3VsdCkgeworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXNwcmludGYoaWZyLmlmcl9uYW1lLCAiJXMiLCBkZXYtPm5hbWUpOworCWNwY19vcGVuY2goZCk7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNwY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlwYzMwMGRldl90ICpkID0gKHBjMzAwZGV2X3QgKikgZGV2LT5wcml2OworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgZC0+Y2hhbjsKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKikgY2hhbi0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYJUEMzMDBfREVCVUdfT1RIRVIKKwlwcmludGsoInBjMzAwOiBjcGNfY2xvc2UiKTsKKyNlbmRpZgorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJQ1BDX0xPQ0soY2FyZCwgZmxhZ3MpOworCWNwY19jbG9zZWNoKGQpOworCUNQQ19VTkxPQ0soY2FyZCwgZmxhZ3MpOworCisJaGRsY19jbG9zZShkZXYpOworCWlmIChoZGxjLT5wcm90by5pZCA9PSBJRl9QUk9UT19QUFApIHsKKwkJZC0+aWZfcHRyID0gTlVMTDsKKwl9CisjaWZkZWYgQ09ORklHX1BDMzAwX01MUFBQCisJaWYgKGNoYW4tPmNvbmYucHJvdG8gPT0gUEMzMDBfUFJPVE9fTUxQUFApIHsKKwkJY3BjX3R0eV91bnJlZ2lzdGVyX3NlcnZpY2UoZCk7CisJCWNoYW4tPmNvbmYucHJvdG8gPSAweGZmZmY7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVjbG9uZyBkZXRlY3RfcmFtKHBjMzAwX3QgKiBjYXJkKQoreworCXVjbG9uZyBpOworCXVjY2hhciBkYXRhOworCXZvaWQgX19pb21lbSAqcmFtYmFzZSA9IGNhcmQtPmh3LnJhbWJhc2U7CisKKwljYXJkLT5ody5yYW1zaXplID0gUEMzMDBfUkFNU0laRTsKKwkvKiBMZXQncyBmaW5kIG91dCBob3cgbXVjaCBSQU0gaXMgcHJlc2VudCBvbiB0aGlzIGJvYXJkICovCisJZm9yIChpID0gMDsgaSA8IGNhcmQtPmh3LnJhbXNpemU7IGkrKykgeworCQlkYXRhID0gKHVjY2hhcikgKGkgJiAweGZmKTsKKwkJY3BjX3dyaXRlYihyYW1iYXNlICsgaSwgZGF0YSk7CisJCWlmIChjcGNfcmVhZGIocmFtYmFzZSArIGkpICE9IGRhdGEpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAoaSk7Cit9CisKK3N0YXRpYyB2b2lkIHBseF9pbml0KHBjMzAwX3QgKiBjYXJkKQoreworCXN0cnVjdCBSVU5USU1FXzkwNTAgX19pb21lbSAqcGx4X2N0bCA9IGNhcmQtPmh3LnBseGJhc2U7CisKKwkvKiBSZXNldCBQTFggKi8KKwljcGNfd3JpdGVsKCZwbHhfY3RsLT5pbml0X2N0cmwsCisJCSAgIGNwY19yZWFkbCgmcGx4X2N0bC0+aW5pdF9jdHJsKSB8IDB4NDAwMDAwMDApOworCXVkZWxheSgxMDAwMEwpOworCWNwY193cml0ZWwoJnBseF9jdGwtPmluaXRfY3RybCwKKwkJICAgY3BjX3JlYWRsKCZwbHhfY3RsLT5pbml0X2N0cmwpICYgfjB4NDAwMDAwMDApOworCisJLyogUmVsb2FkIENvbmZpZy4gUmVnaXN0ZXJzIGZyb20gRUVQUk9NICovCisJY3BjX3dyaXRlbCgmcGx4X2N0bC0+aW5pdF9jdHJsLAorCQkgICBjcGNfcmVhZGwoJnBseF9jdGwtPmluaXRfY3RybCkgfCAweDIwMDAwMDAwKTsKKwl1ZGVsYXkoMTAwMDBMKTsKKwljcGNfd3JpdGVsKCZwbHhfY3RsLT5pbml0X2N0cmwsCisJCSAgIGNwY19yZWFkbCgmcGx4X2N0bC0+aW5pdF9jdHJsKSAmIH4weDIwMDAwMDAwKTsKKworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2hvd192ZXJzaW9uKHZvaWQpCit7CisJY2hhciAqcmNzdmVycywgKnJjc2RhdGUsICp0bXA7CisKKwlyY3N2ZXJzID0gc3RyY2hyKHJjc2lkLCAnICcpOworCXJjc3ZlcnMrKzsKKwl0bXAgPSBzdHJjaHIocmNzdmVycywgJyAnKTsKKwkqdG1wKysgPSAnXDAnOworCXJjc2RhdGUgPSBzdHJjaHIodG1wLCAnICcpOworCXJjc2RhdGUrKzsKKwl0bXAgPSBzdHJyY2hyKHJjc2RhdGUsICcgJyk7CisJKnRtcCA9ICdcMCc7CisJcHJpbnRrKEtFUk5fSU5GTyAiQ3ljbGFkZXMtUEMzMDAgZHJpdmVyICVzICVzIChidWlsdCAlcyAlcylcbiIsIAorCQlyY3N2ZXJzLCByY3NkYXRlLCBfX0RBVEVfXywgX19USU1FX18pOworfQkJCQkvKiBzaG93X3ZlcnNpb24gKi8KKworc3RhdGljIHZvaWQgY3BjX2luaXRfY2FyZChwYzMwMF90ICogY2FyZCkKK3sKKwlpbnQgaSwgZGV2Y291bnQgPSAwOworCXN0YXRpYyBpbnQgYm9hcmRfbmJyID0gMTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBQQ0kgYnJpZGdlICovCisJcGx4X2luaXQoY2FyZCk7CisJY3BjX3dyaXRldyhjYXJkLT5ody5wbHhiYXNlICsgY2FyZC0+aHcuaW50Y3RsX3JlZywKKwkJICAgY3BjX3JlYWR3KGNhcmQtPmh3LnBseGJhc2UgKyBjYXJkLT5ody5pbnRjdGxfcmVnKSB8IDB4MDA0MCk7CisKKyNpZmRlZiBVU0VfUENJX0NMT0NLCisJLyogU2V0IGJvYXJkIGNsb2NrIHRvIFBDSSBjbG9jayAqLworCWNwY193cml0ZWwoY2FyZC0+aHcucGx4YmFzZSArIGNhcmQtPmh3LmdwaW9jX3JlZywKKwkJICAgY3BjX3JlYWRsKGNhcmQtPmh3LnBseGJhc2UgKyBjYXJkLT5ody5ncGlvY19yZWcpIHwgMHgwMDAwMDAwNFVMKTsKKwljYXJkLT5ody5jbG9jayA9IFBDMzAwX1BDSV9DTE9DSzsKKyNlbHNlCisJLyogU2V0IGJvYXJkIGNsb2NrIHRvIGludGVybmFsIG9zY2lsbGF0b3IgY2xvY2sgKi8KKwljcGNfd3JpdGVsKGNhcmQtPmh3LnBseGJhc2UgKyBjYXJkLT5ody5ncGlvY19yZWcsCisJCSAgIGNwY19yZWFkbChjYXJkLT5ody5wbHhiYXNlICsgY2FyZC0+aHcuZ3Bpb2NfcmVnKSAmIH4weDAwMDAwMDA0VUwpOworCWNhcmQtPmh3LmNsb2NrID0gUEMzMDBfT1NDX0NMT0NLOworI2VuZGlmCisKKwkvKiBEZXRlY3QgYWN0dWFsIG9uLWJvYXJkIFJBTSBzaXplICovCisJY2FyZC0+aHcucmFtc2l6ZSA9IGRldGVjdF9yYW0oY2FyZCk7CisKKwkvKiBTZXQgR2xvYmFsIFNDQS1JSSByZWdpc3RlcnMgKi8KKwljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBQQ1IsIFBDUl9QUjIpOworCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIEJUQ1IsIDB4MTApOworCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIFdDUkwsIDApOworCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIERNRVIsIDB4ODApOworCisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsKKwkJdWNjaGFyIHJlZzE7CisKKwkJLyogQ2hlY2sgQ1BMRCB2ZXJzaW9uICovCisJCXJlZzEgPSBjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBDUExEX1JFRzEpOworCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgQ1BMRF9SRUcxLCAocmVnMSArIDB4NWEpKTsKKwkJaWYgKGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIENQTERfUkVHMSkgPT0gcmVnMSkgeworCQkJLyogTmV3IENQTEQgKi8KKwkJCWNhcmQtPmh3LmNwbGRfaWQgPSBjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBDUExEX0lEX1JFRyk7CisJCQljYXJkLT5ody5jcGxkX3JlZzEgPSBDUExEX1YyX1JFRzE7CisJCQljYXJkLT5ody5jcGxkX3JlZzIgPSBDUExEX1YyX1JFRzI7CisJCX0gZWxzZSB7CisJCQkvKiBvbGQgQ1BMRCAqLworCQkJY2FyZC0+aHcuY3BsZF9pZCA9IDA7CisJCQljYXJkLT5ody5jcGxkX3JlZzEgPSBDUExEX1JFRzE7CisJCQljYXJkLT5ody5jcGxkX3JlZzIgPSBDUExEX1JFRzI7CisJCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgQ1BMRF9SRUcxLCByZWcxKTsKKwkJfQorCisJCS8qIEVuYWJsZSB0aGUgYm9hcmQncyBnbG9iYWwgY2xvY2sgKi8KKwkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMSwKKwkJCSAgIGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMSkgfAorCQkJICAgQ1BMRF9SRUcxX0dMT0JBTF9DTEspOworCisJfQorCisJZm9yIChpID0gMDsgaSA8IGNhcmQtPmh3Lm5jaGFuOyBpKyspIHsKKwkJcGMzMDBjaF90ICpjaGFuID0gJmNhcmQtPmNoYW5baV07CisJCXBjMzAwZGV2X3QgKmQgPSAmY2hhbi0+ZDsKKwkJaGRsY19kZXZpY2UgKmhkbGM7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkJY2hhbi0+Y2FyZCA9IGNhcmQ7CisJCWNoYW4tPmNoYW5uZWwgPSBpOworCQljaGFuLT5jb25mLnBoeXNfc2V0dGluZ3MuY2xvY2tfcmF0ZSA9IDA7CisJCWNoYW4tPmNvbmYucGh5c19zZXR0aW5ncy5jbG9ja190eXBlID0gQ0xPQ0tfRVhUOworCQljaGFuLT5jb25mLnByb3RvX3NldHRpbmdzLmVuY29kaW5nID0gRU5DT0RJTkdfTlJaOworCQljaGFuLT5jb25mLnByb3RvX3NldHRpbmdzLnBhcml0eSA9IFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQ7CisJCXN3aXRjaCAoY2FyZC0+aHcudHlwZSkgeworCQkJY2FzZSBQQzMwMF9URToKKwkJCQljaGFuLT5jb25mLm1lZGlhID0gSUZfSUZBQ0VfVDE7CisJCQkJY2hhbi0+Y29uZi5sY29kZSA9IFBDMzAwX0xDX0I4WlM7CisJCQkJY2hhbi0+Y29uZi5mcl9tb2RlID0gUEMzMDBfRlJfRVNGOworCQkJCWNoYW4tPmNvbmYubGJvID0gUEMzMDBfTEJPXzBfREI7CisJCQkJY2hhbi0+Y29uZi5yeF9zZW5zID0gUEMzMDBfUlhfU0VOU19TSDsKKwkJCQljaGFuLT5jb25mLnRzbG90X2JpdG1hcCA9IDB4ZmZmZmZmZmZVTDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQQzMwMF9YMjE6CisJCQkJY2hhbi0+Y29uZi5tZWRpYSA9IElGX0lGQUNFX1gyMTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQQzMwMF9SU1Y6CisJCQlkZWZhdWx0OgorCQkJCWNoYW4tPmNvbmYubWVkaWEgPSBJRl9JRkFDRV9WMzU7CisJCQkJYnJlYWs7CisJCX0KKwkJY2hhbi0+Y29uZi5wcm90byA9IElGX1BST1RPX1BQUDsKKwkJY2hhbi0+dHhfZmlyc3RfYmQgPSAwOworCQljaGFuLT50eF9uZXh0X2JkID0gMDsKKwkJY2hhbi0+cnhfZmlyc3RfYmQgPSAwOworCQljaGFuLT5yeF9sYXN0X2JkID0gTl9ETUFfUlhfQlVGIC0gMTsKKwkJY2hhbi0+bmZyZWVfdHhfYmQgPSBOX0RNQV9UWF9CVUY7CisKKwkJZC0+Y2hhbiA9IGNoYW47CisJCWQtPnR4X3NrYiA9IE5VTEw7CisJCWQtPnRyYWNlX29uID0gMDsKKwkJZC0+bGluZV9vbiA9IDA7CisJCWQtPmxpbmVfb2ZmID0gMDsKKworCQlkZXYgPSBhbGxvY19oZGxjZGV2KE5VTEwpOworCQlpZiAoZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQloZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwkJaGRsYy0+eG1pdCA9IGNwY19xdWV1ZV94bWl0OworCQloZGxjLT5hdHRhY2ggPSBjcGNfYXR0YWNoOworCQlkLT5kZXYgPSBkZXY7CisJCWRldi0+bWVtX3N0YXJ0ID0gY2FyZC0+aHcucmFtcGh5czsKKwkJZGV2LT5tZW1fZW5kID0gY2FyZC0+aHcucmFtcGh5cyArIGNhcmQtPmh3LnJhbXNpemUgLSAxOworCQlkZXYtPmlycSA9IGNhcmQtPmh3LmlycTsKKwkJZGV2LT5pbml0ID0gTlVMTDsKKwkJZGV2LT50eF9xdWV1ZV9sZW4gPSBQQzMwMF9UWF9RVUVVRV9MRU47CisJCWRldi0+bXR1ID0gUEMzMDBfREVGX01UVTsKKworCQlkZXYtPm9wZW4gPSBjcGNfb3BlbjsKKwkJZGV2LT5zdG9wID0gY3BjX2Nsb3NlOworCQlkZXYtPnR4X3RpbWVvdXQgPSBjcGNfdHhfdGltZW91dDsKKwkJZGV2LT53YXRjaGRvZ190aW1lbyA9IFBDMzAwX1RYX1RJTUVPVVQ7CisJCWRldi0+Z2V0X3N0YXRzID0gY3BjX2dldF9zdGF0czsKKwkJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBOVUxMOworCQlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IE5VTEw7CisJCWRldi0+Y2hhbmdlX210dSA9IGNwY19jaGFuZ2VfbXR1OworCQlkZXYtPmRvX2lvY3RsID0gY3BjX2lvY3RsOworCisJCWlmIChyZWdpc3Rlcl9oZGxjX2RldmljZShkZXYpID09IDApIHsKKwkJCWRldi0+cHJpdiA9IGQ7CS8qIFdlIG5lZWQgJ3ByaXYnLCBoZGxjIGRvZXNuJ3QgKi8KKwkJCXByaW50aygiJXM6IEN5Y2xhZGVzLVBDMzAwLyIsIGRldi0+bmFtZSk7CisJCQlzd2l0Y2ggKGNhcmQtPmh3LnR5cGUpIHsKKwkJCQljYXNlIFBDMzAwX1RFOgorCQkJCQlpZiAoY2FyZC0+aHcuYnVzID09IFBDMzAwX1BNQykgeworCQkJCQkJcHJpbnRrKCJURS1NIik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGsoIlRFICAiKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgUEMzMDBfWDIxOgorCQkJCQlwcmludGsoIlgyMSAiKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFBDMzAwX1JTVjoKKwkJCQlkZWZhdWx0OgorCQkJCQlwcmludGsoIlJTViAiKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlwcmludGsgKCIgIyVkLCAlZEtCIG9mIFJBTSBhdCAweCUwOHgsIElSUSVkLCBjaGFubmVsICVkLlxuIiwKKwkJCQkgYm9hcmRfbmJyLCBjYXJkLT5ody5yYW1zaXplIC8gMTAyNCwKKwkJCQkgY2FyZC0+aHcucmFtcGh5cywgY2FyZC0+aHcuaXJxLCBpICsgMSk7CisJCQlkZXZjb3VudCsrOworCQl9IGVsc2UgeworCQkJcHJpbnRrICgiRGV2JWQgb24gY2FyZCgweCUwOHgpOiB1bmFibGUgdG8gYWxsb2NhdGUgaS9mIG5hbWUuXG4iLAorCQkJCSBpICsgMSwgY2FyZC0+aHcucmFtcGh5cyk7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJY29udGludWU7CisJCX0KKwl9CisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmNhcmRfbG9jayk7CisKKwlib2FyZF9uYnIrKzsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK2NwY19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdGF0aWMgaW50IGZpcnN0X3RpbWUgPSAxOworCXVjY2hhciBjcGNfcmV2X2lkOworCWludCBlcnIgPSAwLCBlZXByb21fb3V0ZGF0ZWQgPSAwOworCXVjc2hvcnQgZGV2aWNlX2lkOworCXBjMzAwX3QgKmNhcmQ7CisKKwlpZiAoZmlyc3RfdGltZSkgeworCQlmaXJzdF90aW1lID0gMDsKKwkJc2hvd192ZXJzaW9uKCk7CisjaWZkZWYgQ09ORklHX1BDMzAwX01MUFBQCisJCWNwY190dHlfcmVzZXRfdmFyKCk7CisjZW5kaWYKKwl9CisKKwljYXJkID0gKHBjMzAwX3QgKikga21hbGxvYyhzaXplb2YocGMzMDBfdCksIEdGUF9LRVJORUwpOworCWlmIChjYXJkID09IE5VTEwpIHsKKwkJcHJpbnRrKCJQQzMwMCBmb3VuZCBhdCBSQU0gMHglMDhseCwgIgorCQkgICAgICAgImJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgY2FyZCBzdHJ1Y3R1cmUuXG4iLAorCQkgICAgICAgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChjYXJkLCAwLCBzaXplb2YocGMzMDBfdCkpOworCisJLyogcmVhZCBQQ0kgY29uZmlndXJhdGlvbiBhcmVhICovCisJZGV2aWNlX2lkID0gZW50LT5kZXZpY2U7CisJY2FyZC0+aHcuaXJxID0gcGRldi0+aXJxOworCWNhcmQtPmh3LmlvcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwljYXJkLT5ody5pb3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpOworCWNhcmQtPmh3LnNjYXBoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CisJY2FyZC0+aHcuc2Nhc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMik7CisJY2FyZC0+aHcucmFtcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKKwljYXJkLT5ody5hbGxvY19yYW1zaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAzKTsKKwljYXJkLT5ody5mYWxjcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KTsKKwljYXJkLT5ody5mYWxjc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgNCk7CisJY2FyZC0+aHcucGx4cGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA1KTsKKwljYXJkLT5ody5wbHhzaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCA1KTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZjcGNfcmV2X2lkKTsKKworCXN3aXRjaCAoZGV2aWNlX2lkKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9SWF8xOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFX01fMToKKwkJCWNhcmQtPmh3Lm5jaGFuID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9SWF8yOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfMjoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFX01fMjoKKwkJZGVmYXVsdDoKKwkJCWNhcmQtPmh3Lm5jaGFuID0gUEMzMDBfTUFYQ0hBTjsKKwkJCWJyZWFrOworCX0KKyNpZmRlZiBQQzMwMF9ERUJVR19QQ0kKKwlwcmludGsoImNwYyAoYnVzPTB4MCV4LHBjaV9pZD0weCV4LCIsIHBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbik7CisJcHJpbnRrKCJyZXZfaWQ9JWQpIElSUSVkXG4iLCBjcGNfcmV2X2lkLCBjYXJkLT5ody5pcnEpOworCXByaW50aygiY3BjOmZvdW5kICByYW1hZGRyPTB4JTA4bHggcGx4YWRkcj0weCUwOGx4ICIKKwkgICAgICAgImN0bGFkZHI9MHglMDhseCBmYWxjYWRkcj0weCUwOGx4XG4iLAorCSAgICAgICBjYXJkLT5ody5yYW1waHlzLCBjYXJkLT5ody5wbHhwaHlzLCBjYXJkLT5ody5zY2FwaHlzLAorCSAgICAgICBjYXJkLT5ody5mYWxjcGh5cyk7CisjZW5kaWYKKwkvKiBBbHRob3VnaCB3ZSBkb24ndCB1c2UgdGhpcyBJL08gcmVnaW9uLCB3ZSBzaG91bGQKKwkgKiByZXF1ZXN0IGl0IGZyb20gdGhlIGtlcm5lbCBhbnl3YXksIHRvIGF2b2lkIHByb2JsZW1zCisJICogd2l0aCBvdGhlciBkcml2ZXJzIGFjY2Vzc2luZyBpdC4gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGNhcmQtPmh3LmlvcGh5cywgY2FyZC0+aHcuaW9zaXplLCAiUExYIFJlZ2lzdGVycyIpKSB7CisJCS8qIEluIGNhc2Ugd2UgY2FuJ3QgYWxsb2NhdGUgaXQsIHdhcm4gdXNlciAqLworCQlwcmludGsoIldBUk5JTkc6IGNvdWxkbid0IGFsbG9jYXRlIEkvTyByZWdpb24gZm9yIFBDMzAwIGJvYXJkICIKKwkJICAgICAgICJhdCAweCUwOHghXG4iLCBjYXJkLT5ody5yYW1waHlzKTsKKwl9CisKKwlpZiAoY2FyZC0+aHcucGx4cGh5cykgeworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgY2FyZC0+aHcucGx4cGh5cyk7CisJfSBlbHNlIHsKKwkJZWVwcm9tX291dGRhdGVkID0gMTsKKwkJY2FyZC0+aHcucGx4cGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwkJY2FyZC0+aHcucGx4c2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisJfQorCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oY2FyZC0+aHcucGx4cGh5cywgY2FyZC0+aHcucGx4c2l6ZSwKKwkJCQkiUExYIFJlZ2lzdGVycyIpKSB7CisJCXByaW50aygiUEMzMDAgZm91bmQgYXQgUkFNIDB4JTA4eCwgIgorCQkgICAgICAgImJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgUExYIG1lbSByZWdpb24uXG4iLAorCQkgICAgICAgY2FyZC0+aHcucmFtcGh5cyk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3JlbGVhc2VfaW87CisJfQorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGNhcmQtPmh3LnJhbXBoeXMsIGNhcmQtPmh3LmFsbG9jX3JhbXNpemUsCisJCQkJIk9uLWJvYXJkIFJBTSIpKSB7CisJCXByaW50aygiUEMzMDAgZm91bmQgYXQgUkFNIDB4JTA4eCwgIgorCQkgICAgICAgImJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgUkFNIG1lbSByZWdpb24uXG4iLAorCQkgICAgICAgY2FyZC0+aHcucmFtcGh5cyk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3JlbGVhc2VfcGx4OworCX0KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihjYXJkLT5ody5zY2FwaHlzLCBjYXJkLT5ody5zY2FzaXplLAorCQkJCSJTQ0EtSUkgUmVnaXN0ZXJzIikpIHsKKwkJcHJpbnRrKCJQQzMwMCBmb3VuZCBhdCBSQU0gMHglMDh4LCAiCisJCSAgICAgICAiYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBTQ0EgbWVtIHJlZ2lvbi5cbiIsCisJCSAgICAgICBjYXJkLT5ody5yYW1waHlzKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfcmVsZWFzZV9yYW07CisJfQorCisJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgIT0gMCkKKwkJZ290byBlcnJfcmVsZWFzZV9zY2E7CisKKwljYXJkLT5ody5wbHhiYXNlID0gaW9yZW1hcChjYXJkLT5ody5wbHhwaHlzLCBjYXJkLT5ody5wbHhzaXplKTsKKwljYXJkLT5ody5yYW1iYXNlID0gaW9yZW1hcChjYXJkLT5ody5yYW1waHlzLCBjYXJkLT5ody5hbGxvY19yYW1zaXplKTsKKwljYXJkLT5ody5zY2FiYXNlID0gaW9yZW1hcChjYXJkLT5ody5zY2FwaHlzLCBjYXJkLT5ody5zY2FzaXplKTsKKwlzd2l0Y2ggKGRldmljZV9pZCkgeworCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFXzI6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9URV9NXzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9URV9NXzI6CisJCQlyZXF1ZXN0X21lbV9yZWdpb24oY2FyZC0+aHcuZmFsY3BoeXMsIGNhcmQtPmh3LmZhbGNzaXplLAorCQkJCQkgICAiRkFMQyBSZWdpc3RlcnMiKTsKKwkJCWNhcmQtPmh3LmZhbGNiYXNlID0gaW9yZW1hcChjYXJkLT5ody5mYWxjcGh5cywgY2FyZC0+aHcuZmFsY3NpemUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1JYXzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9SWF8yOgorCQlkZWZhdWx0OgorCQkJY2FyZC0+aHcuZmFsY2Jhc2UgPSBOVUxMOworCQkJYnJlYWs7CisJfQorCisjaWZkZWYgUEMzMDBfREVCVUdfUENJCisJcHJpbnRrKCJjcGM6IHJlbG9jYXRlIHJhbWFkZHI9MHglMDhseCBwbHhhZGRyPTB4JTA4bHggIgorCSAgICAgICAiY3RsYWRkcj0weCUwOGx4IGZhbGNhZGRyPTB4JTA4bHhcbiIsCisJICAgICAgIGNhcmQtPmh3LnJhbWJhc2UsIGNhcmQtPmh3LnBseGJhc2UsIGNhcmQtPmh3LnNjYWJhc2UsCisJICAgICAgIGNhcmQtPmh3LmZhbGNiYXNlKTsKKyNlbmRpZgorCisJLyogU2V0IFBDSSBkcnYgcG9pbnRlciB0byB0aGUgY2FyZCBzdHJ1Y3R1cmUgKi8KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CisKKwkvKiBTZXQgYm9hcmQgdHlwZSAqLworCXN3aXRjaCAoZGV2aWNlX2lkKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9URV8xOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfMjoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFX01fMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFX01fMjoKKwkJCWNhcmQtPmh3LnR5cGUgPSBQQzMwMF9URTsKKworCQkJaWYgKChkZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9QQzMwMF9URV9NXzEpIHx8CisJCQkgICAgKGRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFX01fMikpIHsKKwkJCQljYXJkLT5ody5idXMgPSBQQzMwMF9QTUM7CisJCQkJLyogU2V0IFBMWCByZWdpc3RlciBvZmZzZXRzICovCisJCQkJY2FyZC0+aHcuZ3Bpb2NfcmVnID0gMHg1NDsKKwkJCQljYXJkLT5ody5pbnRjdGxfcmVnID0gMHg0YzsKKwkJCX0gZWxzZSB7CisJCQkJY2FyZC0+aHcuYnVzID0gUEMzMDBfUENJOworCQkJCS8qIFNldCBQTFggcmVnaXN0ZXIgb2Zmc2V0cyAqLworCQkJCWNhcmQtPmh3LmdwaW9jX3JlZyA9IDB4NTA7CisJCQkJY2FyZC0+aHcuaW50Y3RsX3JlZyA9IDB4NGM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfUlhfMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1JYXzI6CisJCWRlZmF1bHQ6CisJCQljYXJkLT5ody5idXMgPSBQQzMwMF9QQ0k7CisJCQkvKiBTZXQgUExYIHJlZ2lzdGVyIG9mZnNldHMgKi8KKwkJCWNhcmQtPmh3LmdwaW9jX3JlZyA9IDB4NTA7CisJCQljYXJkLT5ody5pbnRjdGxfcmVnID0gMHg0YzsKKworCQkJaWYgKChjcGNfcmVhZGwoY2FyZC0+aHcucGx4YmFzZSArIGNhcmQtPmh3LmdwaW9jX3JlZykgJiBQQzMwMF9DVFlQRV9NQVNLKSkgeworCQkJCWNhcmQtPmh3LnR5cGUgPSBQQzMwMF9YMjE7CisJCQl9IGVsc2UgeworCQkJCWNhcmQtPmh3LnR5cGUgPSBQQzMwMF9SU1Y7CisJCQl9CisJCQlicmVhazsKKwl9CisKKwkvKiBBbGxvY2F0ZSBJUlEgKi8KKwlpZiAocmVxdWVzdF9pcnEoY2FyZC0+aHcuaXJxLCBjcGNfaW50ciwgU0FfU0hJUlEsICJDeWNsYWRlcy1QQzMwMCIsIGNhcmQpKSB7CisJCXByaW50ayAoIlBDMzAwIGZvdW5kIGF0IFJBTSAweCUwOHgsIGJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgSVJRJWQuXG4iLAorCQkJIGNhcmQtPmh3LnJhbXBoeXMsIGNhcmQtPmh3LmlycSk7CisJCWdvdG8gZXJyX2lvX3VubWFwOworCX0KKworCWNwY19pbml0X2NhcmQoY2FyZCk7CisKKwlpZiAoZWVwcm9tX291dGRhdGVkKQorCQlwcmludGsoIldBUk5JTkc6IFBDMzAwIHdpdGggb3V0ZGF0ZWQgRUVQUk9NLlxuIik7CisJcmV0dXJuIDA7CisKK2Vycl9pb191bm1hcDoKKwlpb3VubWFwKGNhcmQtPmh3LnBseGJhc2UpOworCWlvdW5tYXAoY2FyZC0+aHcuc2NhYmFzZSk7CisJaW91bm1hcChjYXJkLT5ody5yYW1iYXNlKTsKKwlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeworCQlpb3VubWFwKGNhcmQtPmh3LmZhbGNiYXNlKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmh3LmZhbGNwaHlzLCBjYXJkLT5ody5mYWxjc2l6ZSk7CisJfQorZXJyX3JlbGVhc2Vfc2NhOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5ody5zY2FwaHlzLCBjYXJkLT5ody5zY2FzaXplKTsKK2Vycl9yZWxlYXNlX3JhbToKKwlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+aHcucmFtcGh5cywgY2FyZC0+aHcuYWxsb2NfcmFtc2l6ZSk7CitlcnJfcmVsZWFzZV9wbHg6CisJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmh3LnBseHBoeXMsIGNhcmQtPmh3LnBseHNpemUpOworZXJyX3JlbGVhc2VfaW86CisJcmVsZWFzZV9yZWdpb24oY2FyZC0+aHcuaW9waHlzLCBjYXJkLT5ody5pb3NpemUpOworCWtmcmVlKGNhcmQpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgY3BjX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcGMzMDBfdCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChjYXJkLT5ody5yYW1iYXNlICE9IDApIHsKKwkJaW50IGk7CisKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBQQ0kgYnJpZGdlICovCisJCWNwY193cml0ZXcoY2FyZC0+aHcucGx4YmFzZSArIGNhcmQtPmh3LmludGN0bF9yZWcsCisJCQkgICBjcGNfcmVhZHcoY2FyZC0+aHcucGx4YmFzZSArIGNhcmQtPmh3LmludGN0bF9yZWcpICYgfigweDAwNDApKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+aHcubmNoYW47IGkrKykgeworCQkJdW5yZWdpc3Rlcl9oZGxjX2RldmljZShjYXJkLT5jaGFuW2ldLmQuZGV2KTsKKwkJfQorCQlpb3VubWFwKGNhcmQtPmh3LnBseGJhc2UpOworCQlpb3VubWFwKGNhcmQtPmh3LnNjYWJhc2UpOworCQlpb3VubWFwKGNhcmQtPmh3LnJhbWJhc2UpOworCQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+aHcucGx4cGh5cywgY2FyZC0+aHcucGx4c2l6ZSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5ody5yYW1waHlzLCBjYXJkLT5ody5hbGxvY19yYW1zaXplKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmh3LnNjYXBoeXMsIGNhcmQtPmh3LnNjYXNpemUpOworCQlyZWxlYXNlX3JlZ2lvbihjYXJkLT5ody5pb3BoeXMsIGNhcmQtPmh3Lmlvc2l6ZSk7CisJCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7CisJCQlpb3VubWFwKGNhcmQtPmh3LmZhbGNiYXNlKTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5ody5mYWxjcGh5cywgY2FyZC0+aHcuZmFsY3NpemUpOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5ody5uY2hhbjsgaSsrKQorCQkJaWYgKGNhcmQtPmNoYW5baV0uZC5kZXYpCisJCQkJZnJlZV9uZXRkZXYoY2FyZC0+Y2hhbltpXS5kLmRldik7CisJCWlmIChjYXJkLT5ody5pcnEpCisJCQlmcmVlX2lycShjYXJkLT5ody5pcnEsIGNhcmQpOworCQlrZnJlZShjYXJkKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjcGNfZHJpdmVyID0geworCS5uYW1lICAgICAgICAgICA9ICJwYzMwMCIsCisJLmlkX3RhYmxlICAgICAgID0gY3BjX3BjaV9kZXZfaWQsCisJLnByb2JlICAgICAgICAgID0gY3BjX2luaXRfb25lLAorCS5yZW1vdmUgICAgICAgICA9IF9fZGV2ZXhpdF9wKGNwY19yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNwY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmY3BjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjcGNfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNwY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjcGNfaW5pdCk7Cittb2R1bGVfZXhpdChjcGNfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkN5Y2xhZGVzLVBDMzAwIGNhcmRzIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUiggICJBdXRob3I6IEl2YW4gUGFzc29zIDxpdmFuQGN5Y2xhZGVzLmNvbT5cclxuIgorICAgICAgICAgICAgICAgICJNYWludGFpbmVyOiBQQzMwMCBNYWludGFpbmVyIDxwYzMwMEBjeWNsYWRlcy5jb20iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjMzAwX3R0eS5jIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX3R0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5Zjg0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vcGMzMDBfdHR5LmMKQEAgLTAsMCArMSwxMDk1IEBACisvKgorICogcGMzMDBfdHR5LmMJQ3ljbGFkZXMtUEMzMDAodG0pIFRUWSBEcml2ZXIuCisgKgorICogQXV0aG9yOglSZWdpbmEgS29kYXRvIDxyZWdpbmFrQGN5Y2xhZGVzLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQ6CShjKSAxOTk5LTIwMDIgQ3ljbGFkZXMgQ29ycC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogICAKKyAqICAkTG9nOiBwYzMwMF90dHkuYyx2ICQKKyAqICBSZXZpc2lvbiAzLjcgIDIwMDIvMDMvMDcgMTQ6MTc6MDkgIGhlbnJpcXVlCisgKiAgTGljZW5zZSBkYXRhIGZpeGVkCisgKgorICogIFJldmlzaW9uIDMuNiAgMjAwMS8xMi8xMCAxMjoyOTo0MiAgcmVnaW5hCisgKiAgRml4IHRoZSBNTFBQUCBidWcKKyAqCisgKiAgUmV2aXNpb24gMy41ICAyMDAxLzEwLzMxIDExOjIwOjA1ICByZWdpbmEKKyAqICBhdXRvbWF0aWMgcHBwZCBzdGFydHMKKyAqCisgKiAgUmV2aXNpb24gMy40ICAyMDAxLzA4LzA2IDEyOjAxOjUxICByZWdpbmEKKyAqICBwcm9ibGVtIGluIERTUl9ERSBiaXQKKyAqCisgKiAgUmV2aXNpb24gMy4zICAyMDAxLzA3LzI2IDIyOjU4OjQxICByZWdpbmEKKyAqICB1cGRhdGUgRURBIHZhbHVlCisgKgorICogIFJldmlzaW9uIDMuMiAgMjAwMS8wNy8xMiAxMzoxMToyMCAgcmVnaW5hCisgKiAgYnVnIGZpeCAtIERDRC1PRkYgaW4gcGMzMDAgdHR5IGRyaXZlcgorICoKKyAqCURNQSB0cmFuc21pc3Npb24gYnVnIGZpeAorICogIAorICogIFJldmlzaW9uIDMuMSAgMjAwMS8wNi8yMiAxMzoxMzowMiAgcmVnaW5hCisgKiAgTUxQUFAgaW1wbGVtZW50YXRpb24KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisvKiBUVFkgaW5jbHVkZXMgKi8KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInBjMzAwLmgiCisKKy8qIGRlZmluZXMgYW5kIG1hY3JvcyAqLworLyogVFRZIEdsb2JhbCBkZWZpbml0aW9ucyAqLworI2RlZmluZQlDUENfVFRZX05QT1JUUwk4CS8qIG1heGltdW0gbnVtYmVyIG9mIHRoZSBzeW5jIHR0eSBjb25uZWN0aW9ucyAqLworI2RlZmluZQlDUENfVFRZX01BSk9SCUNZQ0xBREVTX01BSk9SCQorI2RlZmluZSBDUENfVFRZX01JTk9SX1NUQVJUCTI0MAkvKiBtaW5vciBvZiB0aGUgZmlyc3QgUEMzMDAgaW50ZXJmYWNlICovCisKKyNkZWZpbmUgQ1BDX1RUWV9NQVhfTVRVCTIwMDAJCisKKy8qIHR0eSBpbnRlcmZhY2Ugc3RhdGUgKi8KKyNkZWZpbmUJQ1BDX1RUWV9TVF9JRExFCTAKKyNkZWZpbmUgQ1BDX1RUWV9TVF9JTklUCTEJLyogY29uZmlndXJlZCB3aXRoIE1MUFBQIGFuZCB1cCAqLworI2RlZmluZSBDUENfVFRZX1NUX09QRU4JMgkvKiBvcGVuZWQgYnkgYXBwbGljYXRpb24gKi8KKworI2RlZmluZQlDUENfVFRZX0xPQ0soY2FyZCxmbGFncylcCisJZG8ge1wKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBDUENfVFRZX1VOTE9DSyhjYXJkLGZsYWdzKQlcCisJZG8ge1wKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CVwKKwl9IHdoaWxlICgwKQorCisvLyNkZWZpbmUJQ1BDX1RUWV9EQkcoZm9ybWF0LGEuLi4pCXByaW50ayhmb3JtYXQsIyNhKQorI2RlZmluZQlDUENfVFRZX0RCRyhmb3JtYXQsYS4uLikKKworLyogZGF0YSBzdHJ1Y3R1cmVzICovCit0eXBlZGVmIHN0cnVjdCBfc3RfY3BjX3J4X2J1ZiB7CisJc3RydWN0IF9zdF9jcGNfcnhfYnVmCSpuZXh0OworCWludAkJc2l6ZTsKKwl1bnNpZ25lZCBjaGFyCWRhdGFbMV07Cit9IHN0X2NwY19yeF9idWY7CisKK3N0cnVjdCBzdF9jcGNfcnhfbGlzdCB7CisJc3RfY3BjX3J4X2J1ZgkqZmlyc3Q7CisJc3RfY3BjX3J4X2J1ZgkqbGFzdDsKK307CisKK3R5cGVkZWYJc3RydWN0IF9zdF9jcGNfdHR5X2FyZWEgeworCWludAkJc3RhdGU7CQkvKiBzdGF0ZSBvZiB0aGUgVFRZIGludGVyZmFjZSAqLworCWludAkJbnVtX29wZW47CQorCXVuc2lnbmVkIGludCAJdHR5X21pbm9yOwkvKiBtaW5vciB0aGlzIGludGVyZmFjZSAqLworCXZvbGF0aWxlIHN0cnVjdCBzdF9jcGNfcnhfbGlzdCBidWZfcng7CS8qIHB0ci4gdG8gcmVjZXB0aW9uIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIqCWJ1Zl90eDsJCS8qIHB0ci4gdG8gdHJhbnNtaXNzaW9uIGJ1ZmZlciAqLworCXBjMzAwZGV2X3QqCXBjMzAwZGV2OwkvKiBwdHIuIHRvIGluZm8gc3RydWN0IGluIFBDMzAwIGRyaXZlciAqLworCXVuc2lnbmVkIGNoYXIJbmFtZVsyMF07CS8qIGludGVyZi4gbmFtZSArICItdHR5IiAqLworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CQkKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHR5X3R4X3dvcms7IC8qIHR4IHdvcmsgLSB0eCBpbnRlcnJ1cHQgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHR5X3J4X3dvcms7IC8qIHJ4IHdvcmsgLSByeCBpbnRlcnJ1cHQgKi8KKwl9IHN0X2NwY190dHlfYXJlYTsKKworLyogVFRZIGRhdGEgc3RydWN0dXJlcyAqLworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyIHNlcmlhbF9kcnY7CisKKy8qIGxvY2FsIHZhcmlhYmxlcyAqLworc3RfY3BjX3R0eV9hcmVhCWNwY190dHlfYXJlYVtDUENfVFRZX05QT1JUU107CisKK2ludCBjcGNfdHR5X2NudD0wOwkvKiBudW1iZXIgb2YgaW50cmZhY2VzIGNvbmZpZ3VyZWQgd2l0aCBNTFBQUCAqLworaW50IGNwY190dHlfdW5yZWdfZmxhZyA9IDA7CisKKy8qIFRUWSBmdW5jdGlvbnMgcHJvdG90eXBlICovCitzdGF0aWMgaW50IGNwY190dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmxpcCk7CitzdGF0aWMgdm9pZCBjcGNfdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmbGlwKTsKK3N0YXRpYyBpbnQgY3BjX3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CitzdGF0aWMgaW50IGNwY190dHlfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyBpbnQgY3BjX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBjcGNfdHR5X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGNwY190dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgY3BjX3R0eV9yeF93b3JrKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgY3BjX3R0eV90eF93b3JrKHZvaWQgKmRhdGEpOworc3RhdGljIGludCBjcGNfdHR5X3NlbmRfdG9fY2FyZChwYzMwMGRldl90ICpkZXYsdm9pZCAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIGNwY190dHlfdHJhY2UocGMzMDBkZXZfdCAqZGV2LCBjaGFyKiBidWYsIGludCBsZW4sIGNoYXIgcnh0eCk7CitzdGF0aWMgdm9pZCBjcGNfdHR5X3NpZ25hbF9vZmYocGMzMDBkZXZfdCAqcGMzMDBkZXYsIHVuc2lnbmVkIGNoYXIpOworc3RhdGljIHZvaWQgY3BjX3R0eV9zaWduYWxfb24ocGMzMDBkZXZfdCAqcGMzMDBkZXYsIHVuc2lnbmVkIGNoYXIpOworCitpbnQgcGMzMDBfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwKKwkJCXVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK2ludCBwYzMwMF90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqKTsKKworLyogZnVuY3Rpb25zIGNhbGxlZCBieSBQQzMwMCBkcml2ZXIgKi8KK3ZvaWQgY3BjX3R0eV9pbml0KHBjMzAwZGV2X3QgKmRldik7Cit2b2lkIGNwY190dHlfdW5yZWdpc3Rlcl9zZXJ2aWNlKHBjMzAwZGV2X3QgKnBjMzAwZGV2KTsKK3ZvaWQgY3BjX3R0eV9yZWNlaXZlKHBjMzAwZGV2X3QgKnBjMzAwZGV2KTsKK3ZvaWQgY3BjX3R0eV90cmlnZ2VyX3BvbGwocGMzMDBkZXZfdCAqcGMzMDBkZXYpOwordm9pZCBjcGNfdHR5X3Jlc2V0X3Zhcih2b2lkKTsKKworLyoKKyAqIFBDMzAwIFRUWSBjbGVhciAic2lnbmFsIgorICovCitzdGF0aWMgdm9pZCBjcGNfdHR5X3NpZ25hbF9vZmYocGMzMDBkZXZfdCAqcGMzMDBkZXYsIHVuc2lnbmVkIGNoYXIgc2lnbmFsKQoreworCXBjMzAwY2hfdCAqcGMzMDBjaGFuID0gKHBjMzAwY2hfdCAqKXBjMzAwZGV2LT5jaGFuOyAKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKikgcGMzMDBjaGFuLT5jYXJkOyAKKwlpbnQgY2ggPSBwYzMwMGNoYW4tPmNoYW5uZWw7IAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IAorCisJQ1BDX1RUWV9EQkcoIiVzLXR0eTogQ2xlYXIgc2lnbmFsICV4XG4iLAorCQlwYzMwMGRldi0+ZGV2LT5uYW1lLCBzaWduYWwpOworCUNQQ19UVFlfTE9DSyhjYXJkLCBmbGFncyk7IAorCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIE1fUkVHKENUTCxjaCksIAorCQljcGNfcmVhZGIoY2FyZC0+aHcuc2NhYmFzZStNX1JFRyhDVEwsY2gpKSYgc2lnbmFsKTsKKwlDUENfVFRZX1VOTE9DSyhjYXJkLGZsYWdzKTsgCit9CisKKy8qCisgKiBQQzMwMCBUVFkgc2V0ICJzaWduYWwiIHRvIE9OCisgKi8KK3N0YXRpYyB2b2lkIGNwY190dHlfc2lnbmFsX29uKHBjMzAwZGV2X3QgKnBjMzAwZGV2LCB1bnNpZ25lZCBjaGFyIHNpZ25hbCkKK3sKKwlwYzMwMGNoX3QgKnBjMzAwY2hhbiA9IChwYzMwMGNoX3QgKilwYzMwMGRldi0+Y2hhbjsgCisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopIHBjMzAwY2hhbi0+Y2FyZDsgCisJaW50IGNoID0gcGMzMDBjaGFuLT5jaGFubmVsOyAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOyAKKworCUNQQ19UVFlfREJHKCIlcy10dHk6IFNldCBzaWduYWwgJXhcbiIsCisJCXBjMzAwZGV2LT5kZXYtPm5hbWUsIHNpZ25hbCk7CisJQ1BDX1RUWV9MT0NLKGNhcmQsIGZsYWdzKTsgCisJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgTV9SRUcoQ1RMLGNoKSwgCisJCWNwY19yZWFkYihjYXJkLT5ody5zY2FiYXNlK01fUkVHKENUTCxjaCkpJiB+c2lnbmFsKTsKKwlDUENfVFRZX1VOTE9DSyhjYXJkLGZsYWdzKTsgCit9CisKKy8qCisgKiBQQzMwMCBUVFkgaW5pdGlhbGl6YXRpb24gcm91dGluZQorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIFBDMzAwIGRyaXZlciBkdXJpbmcgYm9hcmQgY29uZmlndXJhdGlvbiAKKyAqIChpb2N0bD1TSU9DU1AzMDBDT05GKS4gQXQgdGhpcyBwb2ludCB0aGUgYWRhcHRlciBpcyBjb21wbGV0ZWx5CisgKiBpbml0aWFsaXplZC4KKyAqIG8gdmVyaWZ5IGtlcm5lbCB2ZXJzaW9uIChvbmx5IDIuNC54KQorICogbyByZWdpc3RlciBUVFkgZHJpdmVyCisgKiBvIGluaXQgY3BjX3R0eV9hcmVhIHN0cnVjdAorICovCit2b2lkIGNwY190dHlfaW5pdChwYzMwMGRldl90ICpwYzMwMGRldikKK3sKKwl1bnNpZ25lZCBsb25nIHBvcnQ7CisJaW50IGF1eDsKKwlzdF9jcGNfdHR5X2FyZWEgKiBjcGNfdHR5OworCisJLyogaGRsY1ggLSBYPWludGVyZmFjZSBudW1iZXIgKi8KKwlwb3J0ID0gcGMzMDBkZXYtPmRldi0+bmFtZVs0XSAtICcwJzsKKwlpZiAocG9ydCA+PSBDUENfVFRZX05QT1JUUykgeworCQlwcmludGsoIiVzLXR0eTogaW52YWxpZCBpbnRlcmZhY2Ugc2VsZWN0ZWQgKDAtJWkpOiAlbGkiLAorCQkJcGMzMDBkZXYtPmRldi0+bmFtZSwKKwkJCUNQQ19UVFlfTlBPUlRTLTEscG9ydCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY3BjX3R0eV9jbnQgPT0gMCkgeyAvKiBmaXJzdCBUVFkgY29ubmVjdGlvbiAtPiByZWdpc3RlciBkcml2ZXIgKi8KKwkJQ1BDX1RUWV9EQkcoIiVzLXR0eTogZHJpdmVyIGluaXQsIG1ham9yOiVpLCBtaW5vciByYW5nZTolaT0laVxuIiwKKwkJCXBjMzAwZGV2LT5kZXYtPm5hbWUsCisJCQlDUENfVFRZX01BSk9SLCBDUENfVFRZX01JTk9SX1NUQVJULAorCQkJQ1BDX1RUWV9NSU5PUl9TVEFSVCtDUENfVFRZX05QT1JUUyk7CisJCS8qIGluaXRpYWxpemUgdHR5IGRyaXZlciBzdHJ1Y3QgKi8KKwkJbWVtc2V0KCZzZXJpYWxfZHJ2LDAsc2l6ZW9mKHN0cnVjdCB0dHlfZHJpdmVyKSk7CisJCXNlcmlhbF9kcnYubWFnaWMgPSBUVFlfRFJJVkVSX01BR0lDOworCQlzZXJpYWxfZHJ2Lm93bmVyID0gVEhJU19NT0RVTEU7CisJCXNlcmlhbF9kcnYuZHJpdmVyX25hbWUgPSAicGMzMDBfdHR5IjsKKwkJc2VyaWFsX2Rydi5uYW1lID0gInR0eUNQIjsKKwkJc2VyaWFsX2Rydi5tYWpvciA9IENQQ19UVFlfTUFKT1I7CisJCXNlcmlhbF9kcnYubWlub3Jfc3RhcnQgPSBDUENfVFRZX01JTk9SX1NUQVJUOworCQlzZXJpYWxfZHJ2Lm51bSA9IENQQ19UVFlfTlBPUlRTOworCQlzZXJpYWxfZHJ2LnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCQlzZXJpYWxfZHJ2LnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisKKwkJc2VyaWFsX2Rydi5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJCXNlcmlhbF9kcnYuaW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMHxDUzh8Q1JFQUR8SFVQQ0x8Q0xPQ0FMOworCQlzZXJpYWxfZHJ2LmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKworCQkvKiBpbnRlcmZhY2Ugcm91dGluZXMgZnJvbSB0aGUgdXBwZXIgdHR5IGxheWVyIHRvIHRoZSB0dHkgZHJpdmVyICovCisJCXNlcmlhbF9kcnYub3BlbiA9IGNwY190dHlfb3BlbjsKKwkJc2VyaWFsX2Rydi5jbG9zZSA9IGNwY190dHlfY2xvc2U7CisJCXNlcmlhbF9kcnYud3JpdGUgPSBjcGNfdHR5X3dyaXRlOyAKKwkJc2VyaWFsX2Rydi53cml0ZV9yb29tID0gY3BjX3R0eV93cml0ZV9yb29tOyAKKwkJc2VyaWFsX2Rydi5jaGFyc19pbl9idWZmZXIgPSBjcGNfdHR5X2NoYXJzX2luX2J1ZmZlcjsgCisJCXNlcmlhbF9kcnYudGlvY21zZXQgPSBwYzMwMF90aW9jbXNldDsKKwkJc2VyaWFsX2Rydi50aW9jbWdldCA9IHBjMzAwX3Rpb2NtZ2V0OworCQlzZXJpYWxfZHJ2LmZsdXNoX2J1ZmZlciA9IGNwY190dHlfZmx1c2hfYnVmZmVyOyAKKwkJc2VyaWFsX2Rydi5oYW5ndXAgPSBjcGNfdHR5X2hhbmd1cDsKKworCQkvKiByZWdpc3RlciB0aGUgVFRZIGRyaXZlciAqLworCQlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcigmc2VyaWFsX2RydikpIHsgCisJCQlwcmludGsoIiVzLXR0eTogRmFpbGVkIHRvIHJlZ2lzdGVyIHNlcmlhbCBkcml2ZXIhICIsCisJCQkJcGMzMDBkZXYtPmRldi0+bmFtZSk7CisJCSAgIAlyZXR1cm47CisJCX0gCisKKwkJbWVtc2V0KCh2b2lkICopY3BjX3R0eV9hcmVhLCAwLAorCQkJCQkJCQlzaXplb2Yoc3RfY3BjX3R0eV9hcmVhKSAqIENQQ19UVFlfTlBPUlRTKTsKKwl9CisKKwljcGNfdHR5ID0gJmNwY190dHlfYXJlYVtwb3J0XTsKKwkKKwlpZiAoY3BjX3R0eS0+c3RhdGUgIT0gQ1BDX1RUWV9TVF9JRExFKSB7CisJCUNQQ19UVFlfREJHKCIlcy10dHk6IFRUWSBwb3J0ICVpLCBhbHJlYWR5IGluIHVzZS5cbiIsCisJCQkJcGMzMDBkZXYtPmRldi0+bmFtZSwgcG9ydCk7CisJCXJldHVybjsKKwl9CisKKwljcGNfdHR5X2NudCsrOworCWNwY190dHktPnN0YXRlID0gQ1BDX1RUWV9TVF9JTklUOyAKKwljcGNfdHR5LT5udW1fb3Blbj0gMDsKKwljcGNfdHR5LT50dHlfbWlub3IgPSBwb3J0ICsgQ1BDX1RUWV9NSU5PUl9TVEFSVDsKKwljcGNfdHR5LT5wYzMwMGRldiA9IHBjMzAwZGV2OyAKKworCUlOSVRfV09SSygmY3BjX3R0eS0+dHR5X3R4X3dvcmssIGNwY190dHlfdHhfd29yaywgKHZvaWQgKiljcGNfdHR5KTsKKwlJTklUX1dPUksoJmNwY190dHktPnR0eV9yeF93b3JrLCBjcGNfdHR5X3J4X3dvcmssICh2b2lkICopcG9ydCk7CisJCisJY3BjX3R0eS0+YnVmX3J4LmZpcnN0ID0gY3BjX3R0eS0+YnVmX3J4Lmxhc3QgPSBOVUxMOworCisJcGMzMDBkZXYtPmNwY190dHkgPSAodm9pZCAqKWNwY190dHk7IAorCQorCWF1eCA9IHN0cmxlbihwYzMwMGRldi0+ZGV2LT5uYW1lKTsKKwltZW1jcHkoY3BjX3R0eS0+bmFtZSwgcGMzMDBkZXYtPmRldi0+bmFtZSwgYXV4KTsKKwltZW1jcHkoJmNwY190dHktPm5hbWVbYXV4XSwgIi10dHkiLCA1KTsKKwkKKwljcGNfb3BlbihwYzMwMGRldi0+ZGV2KTsKKwljcGNfdHR5X3NpZ25hbF9vZmYocGMzMDBkZXYsIENUTF9EVFIpOworCisJQ1BDX1RUWV9EQkcoIiVzOiBJbml0aWFsaXppbmcgVFRZIFN5bmMgRHJpdmVyLCB0dHkgbWFqb3IjJWQgbWlub3IjJWlcbiIsCisJCQljcGNfdHR5LT5uYW1lLENQQ19UVFlfTUFKT1IsY3BjX3R0eS0+dHR5X21pbm9yKTsgCisJcmV0dXJuOyAKK30gCisKKy8qCisgKiBQQzMwMCBUVFkgT1BFTiByb3V0aW5lCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgdHR5IGRyaXZlciB0byBvcGVuIHRoZSBpbnRlcmZhY2UgCisgKiBvIHZlcmlmeSBtaW5vcgorICogbyBhbGxvY2F0ZSBidWZmZXIgdG8gUnggYW5kIFR4CisgKi8KK3N0YXRpYyBpbnQgY3BjX3R0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmbGlwKQoreworCWludCBwb3J0IDsKKwlzdF9jcGNfdHR5X2FyZWEgKmNwY190dHk7CisKKwlpZiAoIXR0eSkgeyAKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSAKKworCXBvcnQgPSB0dHktPmluZGV4OworCisJaWYgKChwb3J0IDwgMCkgfHwgKHBvcnQgPj0gQ1BDX1RUWV9OUE9SVFMpKXsgCisJCUNQQ19UVFlfREJHKCJwYzMwMF90dHk6IG9wZW4gaW52YWxpZCBwb3J0ICVkXG4iLCBwb3J0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSAKKworCWNwY190dHkgPSAmY3BjX3R0eV9hcmVhW3BvcnRdOworCQorCWlmIChjcGNfdHR5LT5zdGF0ZSA9PSBDUENfVFRZX1NUX0lETEUpeworCQlDUENfVFRZX0RCRygiJXM6IG9wZW4gLSBpbnZhbGlkIGludGVyZmFjZSwgcG9ydD0lZFxuIiwKKwkJCQkJY3BjX3R0eS0+bmFtZSwgdHR5LT5pbmRleCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChjcGNfdHR5LT5udW1fb3BlbiA9PSAwKSB7IC8qIGZpcnN0IG9wZW4gb2YgdGhpcyB0dHkgKi8KKwkJaWYgKCFjcGNfdHR5X2FyZWFbcG9ydF0uYnVmX3R4KXsKKwkJCWNwY190dHlfYXJlYVtwb3J0XS5idWZfdHggPSBrbWFsbG9jKENQQ19UVFlfTUFYX01UVSxHRlBfS0VSTkVMKTsKKwkJCWlmIChjcGNfdHR5X2FyZWFbcG9ydF0uYnVmX3R4ID09IDApeworCQkJCUNQQ19UVFlfREJHKCIlczogZXJyb3IgaW4gbWVtb3J5IGFsbG9jYXRpb25cbiIsY3BjX3R0eS0+bmFtZSk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCX0gCisKKwkJaWYgKGNwY190dHlfYXJlYVtwb3J0XS5idWZfcnguZmlyc3QpIHsKKwkJCXVuc2lnbmVkIGNoYXIgKiBhdXg7CisJCQl3aGlsZSAoY3BjX3R0eV9hcmVhW3BvcnRdLmJ1Zl9yeC5maXJzdCkgeworCQkJCWF1eCA9ICh1bnNpZ25lZCBjaGFyICopY3BjX3R0eV9hcmVhW3BvcnRdLmJ1Zl9yeC5maXJzdDsKKwkJCQljcGNfdHR5X2FyZWFbcG9ydF0uYnVmX3J4LmZpcnN0ID0gY3BjX3R0eV9hcmVhW3BvcnRdLmJ1Zl9yeC5maXJzdC0+bmV4dDsKKwkJCQlrZnJlZShhdXgpOworCQkJfQorCQkJY3BjX3R0eV9hcmVhW3BvcnRdLmJ1Zl9yeC5maXJzdCA9IE5VTEw7CisJCQljcGNfdHR5X2FyZWFbcG9ydF0uYnVmX3J4Lmxhc3QgPSBOVUxMOworCQl9CisKKwkJY3BjX3R0eV9hcmVhW3BvcnRdLnN0YXRlID0gQ1BDX1RUWV9TVF9PUEVOOworCQljcGNfdHR5X2FyZWFbcG9ydF0udHR5ID0gdHR5OworCQl0dHktPmRyaXZlcl9kYXRhID0gJmNwY190dHlfYXJlYVtwb3J0XTsKKworCQljcGNfdHR5X3NpZ25hbF9vbihjcGNfdHR5LT5wYzMwMGRldiwgQ1RMX0RUUik7CisJfSAKKworCWNwY190dHktPm51bV9vcGVuKys7CisKKwlDUENfVFRZX0RCRygiJXM6IG9wZW5pbmcgVFRZIGRyaXZlclxuIiwgY3BjX3R0eS0+bmFtZSk7CisJCisJLyogYXZpc2FyIGRyaXZlciBQQzMwMCAqLyAKKwlyZXR1cm4gMDsgCit9CisKKy8qCisgKiBQQzMwMCBUVFkgQ0xPU0Ugcm91dGluZQorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHR0eSBkcml2ZXIgdG8gY2xvc2UgdGhlIGludGVyZmFjZSAKKyAqIG8gY2FsbCBjbG9zZSBjaGFubmVsIGluIFBDMzAwIGRyaXZlciAoY3BjX2Nsb3NlY2gpCisgKiBvIGZyZWUgUnggYW5kIFR4IGJ1ZmZlcnMKKyAqLworCitzdGF0aWMgdm9pZCBjcGNfdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmbGlwKQoreworCXN0X2NwY190dHlfYXJlYSAgICAqY3BjX3R0eTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXM7CisKKwlpZiAoIXR0eSB8fCAhdHR5LT5kcml2ZXJfZGF0YSApIHsKKwkJQ1BDX1RUWV9EQkcoImhkbHgtdHR5OiBubyBUVFkgaW4gY2xvc2UgXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWNwY190dHkgPSAoc3RfY3BjX3R0eV9hcmVhICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoKGNwY190dHktPnR0eSAhPSB0dHkpfHwgKGNwY190dHktPnN0YXRlICE9IENQQ19UVFlfU1RfT1BFTikpIHsKKwkJQ1BDX1RUWV9EQkcoIiVzOiBUVFkgaXMgbm90IG9wZW5lZFxuIixjcGNfdHR5LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKyAgIAkKKwlpZiAoIWNwY190dHktPm51bV9vcGVuKSB7CisJCUNQQ19UVFlfREJHKCIlczogVFRZIGlzIGNsb3NlZFxuIixjcGNfdHR5LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgtLWNwY190dHktPm51bV9vcGVuID4gMCkgeworCQlDUENfVFRZX0RCRygiJXM6IFRUWSBjbG9zZWRcbiIsY3BjX3R0eS0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwljcGNfdHR5X3NpZ25hbF9vZmYoY3BjX3R0eS0+cGMzMDBkZXYsIENUTF9EVFIpOworCisJQ1BDX1RUWV9MT0NLKGNwY190dHktPnBjMzAwZGV2LT5jaGFuLT5jYXJkLCBmbGFncyk7ICAvKiBsb2NrIGlycSAqLyAKKwljcGNfdHR5LT50dHkgPSBOVUxMOworCWNwY190dHktPnN0YXRlID0gQ1BDX1RUWV9TVF9JTklUOworCUNQQ19UVFlfVU5MT0NLKGNwY190dHktPnBjMzAwZGV2LT5jaGFuLT5jYXJkLCBmbGFncyk7IC8qIHVubG9jayBpcnEgKi8gCisJCisJaWYgKGNwY190dHktPmJ1Zl9yeC5maXJzdCkgeworCQl1bnNpZ25lZCBjaGFyICogYXV4OworCQl3aGlsZSAoY3BjX3R0eS0+YnVmX3J4LmZpcnN0KSB7CisJCQlhdXggPSAodW5zaWduZWQgY2hhciAqKWNwY190dHktPmJ1Zl9yeC5maXJzdDsKKwkJCWNwY190dHktPmJ1Zl9yeC5maXJzdCA9IGNwY190dHktPmJ1Zl9yeC5maXJzdC0+bmV4dDsKKwkJCWtmcmVlKGF1eCk7CisJCX0KKwkJY3BjX3R0eS0+YnVmX3J4LmZpcnN0ID0gTlVMTDsKKwkJY3BjX3R0eS0+YnVmX3J4Lmxhc3QgPSBOVUxMOworCX0KKwkKKwlpZiAoY3BjX3R0eS0+YnVmX3R4KSB7CisJCWtmcmVlKGNwY190dHktPmJ1Zl90eCk7CisJCWNwY190dHktPmJ1Zl90eCA9IE5VTEw7CisJfQorCisJQ1BDX1RUWV9EQkcoIiVzOiBUVFkgY2xvc2VkXG4iLGNwY190dHktPm5hbWUpOworCQorCWlmICghc2VyaWFsX2Rydi5yZWZjb3VudCAmJiBjcGNfdHR5X3VucmVnX2ZsYWcpIHsKKwkJY3BjX3R0eV91bnJlZ19mbGFnID0gMDsKKwkJQ1BDX1RUWV9EQkcoIiVzOiB1bnJlZ2lzdGVyIHRoZSB0dHkgZHJpdmVyXG4iLCBjcGNfdHR5LT5uYW1lKTsKKwkJaWYgKChyZXM9dHR5X3VucmVnaXN0ZXJfZHJpdmVyKCZzZXJpYWxfZHJ2KSkpIHsgCisJCQlDUENfVFRZX0RCRygiJXM6IEVSUk9SIC0+dW5yZWdpc3RlciB0aGUgdHR5IGRyaXZlciBlcnJvcj0lZFxuIiwKKwkJCQkJCQljcGNfdHR5LT5uYW1lLHJlcyk7CisJCX0KKwl9CisJcmV0dXJuOyAKK30gCisKKy8qCisgKiBQQzMwMCBUVFkgV1JJVEUgcm91dGluZQorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHR0eSBkcml2ZXIgdG8gd3JpdGUgYSBzZXJpZXMgb2YgY2hhcmFjdGVycworICogdG8gdGhlIHR0eSBkZXZpY2UuIFRoZSBjaGFyYWN0ZXJzIG1heSBjb21lIGZyb20gdXNlciBvciBrZXJuZWwgc3BhY2UuCisgKiBvIHZlcmlmeSB0aGUgRENEIHNpZ25hbAorICogbyBzZW5kIGNoYXJhY3RlcnMgdG8gYm9hcmQgYW5kIHN0YXJ0IHRoZSB0cmFuc21pc3Npb24KKyAqLworc3RhdGljIGludCBjcGNfdHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0X2NwY190dHlfYXJlYSAgICAqY3BjX3R0eTsgCisJcGMzMDBjaF90ICpwYzMwMGNoYW47IAorCXBjMzAwX3QgKmNhcmQ7IAorCWludCBjaDsgCisJdW5zaWduZWQgbG9uZyBmbGFnczsgCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOyAKKworCWlmICghdHR5IHx8ICF0dHktPmRyaXZlcl9kYXRhICkgeyAKKwkJQ1BDX1RUWV9EQkcoImhkbGNYLXR0eTogbm8gVFRZIGluIHdyaXRlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSAKKworCWNwY190dHkgPSAoc3RfY3BjX3R0eV9hcmVhICopIHR0eS0+ZHJpdmVyX2RhdGE7IAorCisJaWYgKChjcGNfdHR5LT50dHkgIT0gdHR5KSB8fCAgKGNwY190dHktPnN0YXRlICE9IENQQ19UVFlfU1RfT1BFTikpIHsgCisJCUNQQ19UVFlfREJHKCIlczogVFRZIGlzIG5vdCBvcGVuZWRcbiIsIGNwY190dHktPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsgCisJfQorCisJaWYgKGNvdW50ID4gQ1BDX1RUWV9NQVhfTVRVKSB7IAorCQlDUENfVFRZX0RCRygiJXM6IGNvdW50IGlzIGludmFsaWRcbiIsY3BjX3R0eS0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOyAgICAgICAgLyogZnJhbWUgdG9vIGJpZyAqLyAKKwl9CisKKwlDUENfVFRZX0RCRygiJXM6IGNwY190dHlfd3JpdGUgZGF0YSBsZW49JWlcbiIsY3BjX3R0eS0+bmFtZSxjb3VudCk7CisJCisJcGMzMDBjaGFuID0gKHBjMzAwY2hfdCAqKSgocGMzMDBkZXZfdCopY3BjX3R0eS0+cGMzMDBkZXYpLT5jaGFuOyAKKwlzdGF0cyA9IGhkbGNfc3RhdHMoKChwYzMwMGRldl90KiljcGNfdHR5LT5wYzMwMGRldiktPmRldik7CisJY2FyZCA9IChwYzMwMF90ICopIHBjMzAwY2hhbi0+Y2FyZDsKKwljaCA9IHBjMzAwY2hhbi0+Y2hhbm5lbDsgCisKKwkvKiB2ZXJpZnkgRENEIHNpZ25hbCovIAorCWlmIChjcGNfcmVhZGIoY2FyZC0+aHcuc2NhYmFzZSArIE1fUkVHKFNUMyxjaCkpICYgU1QzX0RDRCkgeyAKKwkJLyogRENEIGlzIE9GRiAqLyAKKwkJQ1BDX1RUWV9EQkcoIiVzIDogRENEIGlzIE9GRlxuIiwgY3BjX3R0eS0+bmFtZSk7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCUNQQ19UVFlfTE9DSyhjYXJkLCBmbGFncyk7IAorCQljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBNX1JFRyhDTUQsIGNoKSwgQ01EX1RYX0JVRl9DTFIpOyAKKwkJCisJCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7IAorCQkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwgCisJCQkJY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyKSAmIAorCQkJCX4oQ1BMRF9SRUcyX0ZBTENfTEVEMSA8PCAoMiAqY2gpKSk7IAorCQl9CisKKwkJQ1BDX1RUWV9VTkxPQ0soY2FyZCwgZmxhZ3MpOyAKKworCQlyZXR1cm4gLUVJTlZBTDsgCisJfQorCisJaWYgKGNwY190dHlfc2VuZF90b19jYXJkKGNwY190dHktPnBjMzAwZGV2LCAodm9pZCopYnVmLCBjb3VudCkpIHsgCisJICAgLyogZmFpbGVkIHRvIHNlbmQgKi8KKwkgICBDUENfVFRZX0RCRygiJXM6IHRyYXNtaXRpb24gZXJyb3JcbiIsIGNwY190dHktPm5hbWUpOworCSAgIHJldHVybiAwOworCX0KKwlyZXR1cm4gY291bnQ7IAorfSAKKworLyoKKyAqIFBDMzAwIFRUWSBXcml0ZSBSb29tIHJvdXRpbmUKKyAqIAorICogVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIG51bWJlcnMgb2YgY2hhcmFjdGVyZXMgdGhlIHR0eSBkcml2ZXIgd2lsbCBhY2NlcHQKKyAqIGZvciBxdWV1aW5nIHRvIGJlIHdyaXR0ZW4uIAorICogbyByZXR1cm4gTVRVCisgKi8KK3N0YXRpYyBpbnQgY3BjX3R0eV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RfY3BjX3R0eV9hcmVhICAgICpjcGNfdHR5OyAKKworCWlmICghdHR5IHx8ICF0dHktPmRyaXZlcl9kYXRhICkgeyAKKwkJQ1BDX1RUWV9EQkcoImhkbGNYLXR0eTogbm8gVFRZIHRvIHdyaXRlIHJvb21cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljcGNfdHR5ID0gKHN0X2NwY190dHlfYXJlYSAqKSB0dHktPmRyaXZlcl9kYXRhOyAKKworCWlmICgoY3BjX3R0eS0+dHR5ICE9IHR0eSkgfHwgIChjcGNfdHR5LT5zdGF0ZSAhPSBDUENfVFRZX1NUX09QRU4pKSB7IAorCQlDUENfVFRZX0RCRygiJXM6IFRUWSBpcyBub3Qgb3BlbmVkXG4iLGNwY190dHktPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsgCisJfQorICAgCQorCUNQQ19UVFlfREJHKCIlczogd3JpdGUgcm9vbVxuIixjcGNfdHR5LT5uYW1lKTsKKwkKKwlyZXR1cm4gQ1BDX1RUWV9NQVhfTVRVOworfSAKKworLyoKKyAqIFBDMzAwIFRUWSBjaGFycyBpbiBidWZmZXIgcm91dGluZQorICogCisgKiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgY2hhcnMgbnVtYmVyIGluIHRoZSB0cmFuc21pc3Npb24gYnVmZmVyIAorICogbyByZXR1cm5zIDAKKyAqLworc3RhdGljIGludCBjcGNfdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0X2NwY190dHlfYXJlYSAgICAqY3BjX3R0eTsgCisKKwlpZiAoIXR0eSB8fCAhdHR5LT5kcml2ZXJfZGF0YSApIHsKKwkJQ1BDX1RUWV9EQkcoImhkbGNYLXR0eTogbm8gVFRZIHRvIGNoYXJzIGluIGJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PREVWOyAKKwl9CisKKwljcGNfdHR5ID0gKHN0X2NwY190dHlfYXJlYSAqKSB0dHktPmRyaXZlcl9kYXRhOyAKKworCWlmICgoY3BjX3R0eS0+dHR5ICE9IHR0eSkgfHwgKGNwY190dHktPnN0YXRlICE9IENQQ19UVFlfU1RfT1BFTikpIHsgCisJCUNQQ19UVFlfREJHKCIlczogVFRZIGlzIG5vdCBvcGVuZWRcbiIsY3BjX3R0eS0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOyAKKwl9CisgICAKKwlyZXR1cm4oMCk7IAorfSAKKworaW50IHBjMzAwX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0X2NwY190dHlfYXJlYSAgICAqY3BjX3R0eTsgCisKKwlDUENfVFRZX0RCRygiJXM6IHNldDoleCBjbGVhcjoleFxuIiwgX19GVU5DVElPTl9fLCBzZXQsIGNsZWFyKTsKKworCWlmICghdHR5IHx8ICF0dHktPmRyaXZlcl9kYXRhICkgeworCSAgIAlDUENfVFRZX0RCRygiaGRsY1gtdHR5OiBubyBUVFkgdG8gY2hhcnMgaW4gYnVmZmVyXG4iKTsJCisJCXJldHVybiAtRU5PREVWOyAKKwl9CisKKwljcGNfdHR5ID0gKHN0X2NwY190dHlfYXJlYSAqKSB0dHktPmRyaXZlcl9kYXRhOyAKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCWNwY190dHlfc2lnbmFsX29uKGNwY190dHktPnBjMzAwZGV2LCBDVExfUlRTKTsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQljcGNfdHR5X3NpZ25hbF9vbihjcGNfdHR5LT5wYzMwMGRldiwgQ1RMX0RUUik7CisKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCWNwY190dHlfc2lnbmFsX29mZihjcGNfdHR5LT5wYzMwMGRldiwgQ1RMX1JUUyk7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQljcGNfdHR5X3NpZ25hbF9vZmYoY3BjX3R0eS0+cGMzMDBkZXYsIENUTF9EVFIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBwYzMwMF90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RfY3BjX3R0eV9hcmVhICAqY3BjX3R0eSA9IChzdF9jcGNfdHR5X2FyZWEgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlwYzMwMGRldl90ICpwYzMwMGRldiA9IGNwY190dHktPnBjMzAwZGV2OworCXBjMzAwY2hfdCAqcGMzMDBjaGFuID0gKHBjMzAwY2hfdCAqKXBjMzAwZGV2LT5jaGFuOworCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKSBwYzMwMGNoYW4tPmNhcmQ7CisJaW50IGNoID0gcGMzMDBjaGFuLT5jaGFubmVsOworCisJY3BjX3R0eSA9IChzdF9jcGNfdHR5X2FyZWEgKikgdHR5LT5kcml2ZXJfZGF0YTsKKworCUNQQ19UVFlfREJHKCIlcy10dHk6IHRpb2NtZ2V0XG4iLAorCQkoKHN0cnVjdCBuZXRfZGV2aWNlKikocGMzMDBkZXYtPmhkbGMpKS0+bmFtZSk7CisKKwlDUENfVFRZX0xPQ0soY2FyZCwgZmxhZ3MpOworCXN0YXR1cyA9IGNwY19yZWFkYihjYXJkLT5ody5zY2FiYXNlK01fUkVHKENUTCxjaCkpOworCUNQQ19UVFlfVU5MT0NLKGNhcmQsZmxhZ3MpOworCisJcmVzdWx0ID0gKChzdGF0dXMgJiBDVExfRFRSKSA/IFRJT0NNX0RUUiA6IDApIHwKKwkJICgoc3RhdHVzICYgQ1RMX1JUUykgPyBUSU9DTV9SVFMgOiAwKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBQQzMwMCBUVFkgRmx1c2ggQnVmZmVyIHJvdXRpbmUKKyAqCisgKiBUaGlzIHJvdXRpbmUgcmVzZXRzIHRoZSB0cmFuc21pc3Npb24gYnVmZmVyIAorICovCitzdGF0aWMgdm9pZCBjcGNfdHR5X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAKKwlzdF9jcGNfdHR5X2FyZWEgICAgKmNwY190dHk7IAorCQorCWlmICghdHR5IHx8ICF0dHktPmRyaXZlcl9kYXRhICkgeworCSAgIAlDUENfVFRZX0RCRygiaGRsY1gtdHR5OiBubyBUVFkgdG8gZmx1c2ggYnVmZmVyXG4iKTsJCisJCXJldHVybjsgCisJfQorCisJY3BjX3R0eSA9IChzdF9jcGNfdHR5X2FyZWEgKikgdHR5LT5kcml2ZXJfZGF0YTsgCisKKwlpZiAoKGNwY190dHktPnR0eSAhPSB0dHkpIHx8ICAoY3BjX3R0eS0+c3RhdGUgIT0gQ1BDX1RUWV9TVF9PUEVOKSkgeyAKKwkJQ1BDX1RUWV9EQkcoIiVzOiBUVFkgaXMgbm90IG9wZW5lZFxuIixjcGNfdHR5LT5uYW1lKTsKKwkJcmV0dXJuOyAKKwl9CisKKwlDUENfVFRZX0RCRygiJXM6IGNhbGwgd2FrZV91cF9pbnRlcnJ1cHRpYmxlXG4iLGNwY190dHktPm5hbWUpOworCisJdHR5X3dha2V1cCh0dHkpOwkKKwlyZXR1cm47IAorfSAKKworLyoKKyAqIFBDMzAwIFRUWSBIYW5ndXAgcm91dGluZQorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHR0eSBkcml2ZXIgdG8gaGFuZ3VwIHRoZSBpbnRlcmZhY2UgCisgKiBvIGNsZWFyIERUUiBzaWduYWwKKyAqLworCitzdGF0aWMgdm9pZCBjcGNfdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreyAKKwlzdF9jcGNfdHR5X2FyZWEgICAgKmNwY190dHk7IAorCWludCByZXM7CisKKwlpZiAoIXR0eSB8fCAhdHR5LT5kcml2ZXJfZGF0YSApIHsKKwkJQ1BDX1RUWV9EQkcoImhkbGNYLXR0eTogbm8gVFRZIHRvIGhhbmd1cFxuIik7CQorCQlyZXR1cm4gOyAKKwl9CisKKwljcGNfdHR5ID0gKHN0X2NwY190dHlfYXJlYSAqKSB0dHktPmRyaXZlcl9kYXRhOyAKKworCWlmICgoY3BjX3R0eS0+dHR5ICE9IHR0eSkgfHwgKGNwY190dHktPnN0YXRlICE9IENQQ19UVFlfU1RfT1BFTikpIHsKKwkJQ1BDX1RUWV9EQkcoIiVzOiBUVFkgaXMgbm90IG9wZW5lZFxuIixjcGNfdHR5LT5uYW1lKTsKKwkJcmV0dXJuIDsKKwl9CisJaWYgKCFzZXJpYWxfZHJ2LnJlZmNvdW50ICYmIGNwY190dHlfdW5yZWdfZmxhZykgeworCQljcGNfdHR5X3VucmVnX2ZsYWcgPSAwOworCQlDUENfVFRZX0RCRygiJXM6IHVucmVnaXN0ZXIgdGhlIHR0eSBkcml2ZXJcbiIsIGNwY190dHktPm5hbWUpOworCQlpZiAoKHJlcz10dHlfdW5yZWdpc3Rlcl9kcml2ZXIoJnNlcmlhbF9kcnYpKSkgeyAKKwkJCUNQQ19UVFlfREJHKCIlczogRVJST1IgLT51bnJlZ2lzdGVyIHRoZSB0dHkgZHJpdmVyIGVycm9yPSVkXG4iLAorCQkJCQkJCWNwY190dHktPm5hbWUscmVzKTsKKwkJfQorCX0KKwljcGNfdHR5X3NpZ25hbF9vZmYoY3BjX3R0eS0+cGMzMDBkZXYsIENUTF9EVFIpOworfQorCisvKgorICogUEMzMDAgVFRZIFJYIHdvcmsgcm91dGluZQorICogVGhpcyByb3V0aW5lIHRyZWF0cyBSWCB3b3JrCisgKiBvIHZlcmlmeSByZWFkIGJ1ZmZlcgorICogbyBjYWxsIHRoZSBsaW5lIGRpc2MuIHJlYWQKKyAqIG8gZnJlZSBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQgY3BjX3R0eV9yeF93b3JrKHZvaWQgKiBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgcG9ydDsKKwlpbnQgaSwgajsKKwlzdF9jcGNfdHR5X2FyZWEgKmNwY190dHk7IAorCXZvbGF0aWxlIHN0X2NwY19yeF9idWYgKiBidWY7CisJY2hhciBmbGFncz0wLGZsZ19yeD0xOyAKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKworCWlmIChjcGNfdHR5X2NudCA9PSAwKSByZXR1cm47CisKKwkKKwlmb3IgKGk9MDsgKGkgPCA0KSAmJiBmbGdfcnggOyBpKyspIHsKKwkJZmxnX3J4ID0gMDsKKwkJcG9ydCA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJCWZvciAoaj0wOyBqIDwgQ1BDX1RUWV9OUE9SVFM7IGorKykgeworCQkJY3BjX3R0eSA9ICZjcGNfdHR5X2FyZWFbcG9ydF07CisJCQorCQkJaWYgKChidWY9Y3BjX3R0eS0+YnVmX3J4LmZpcnN0KSAhPSAwKSB7CisJCQkJaWYoY3BjX3R0eS0+dHR5KSB7CisJCQkJCWxkID0gdHR5X2xkaXNjX3JlZihjcGNfdHR5LT50dHkpOworCQkJCQlpZihsZCkgeworCQkJCQkJaWYgKGxkLT5yZWNlaXZlX2J1ZikgeworCQkJCQkJCUNQQ19UVFlfREJHKCIlczogY2FsbCBsaW5lIGRpc2MuIHJlY2VpdmVfYnVmXG4iLGNwY190dHktPm5hbWUpOworCQkJCQkJCWxkLT5yZWNlaXZlX2J1ZihjcGNfdHR5LT50dHksIChjaGFyICopKGJ1Zi0+ZGF0YSksICZmbGFncywgYnVmLT5zaXplKTsKKwkJCQkJCX0KKwkJCQkJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJCQkJCX0KKwkJCQl9CQorCQkJCWNwY190dHktPmJ1Zl9yeC5maXJzdCA9IGNwY190dHktPmJ1Zl9yeC5maXJzdC0+bmV4dDsKKwkJCQlrZnJlZSgodW5zaWduZWQgY2hhciAqKWJ1Zik7CisJCQkJYnVmID0gY3BjX3R0eS0+YnVmX3J4LmZpcnN0OworCQkJCWZsZ19yeCA9IDE7CisJCQl9CisJCQlpZiAoKytwb3J0ID09IENQQ19UVFlfTlBPUlRTKSBwb3J0ID0gMDsKKwkJfQorCX0KK30gCisKKy8qCisgKiBQQzMwMCBUVFkgUlggd29yayByb3V0aW5lCisgKgorICogVGhpcyByb3V0aW5lIHRyZWF0cyBSWCBpbnRlcnJ1cHQuIAorICogbyByZWFkIGFsbCBmcmFtZXMgaW4gY2FyZAorICogbyB2ZXJpZnkgdGhlIGZyYW1lIHNpemUKKyAqIG8gcmVhZCB0aGUgZnJhbWUgaW4gcnggYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIGNwY190dHlfcnhfZGlzY19mcmFtZShwYzMwMGNoX3QgKnBjMzAwY2hhbikKK3sKKwl2b2xhdGlsZSBwY3NjYV9iZF90IF9faW9tZW0gKiBwdGRlc2NyOyAKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHN0YXR1czsgCisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopcGMzMDBjaGFuLT5jYXJkOyAKKwlpbnQgY2ggPSBwYzMwMGNoYW4tPmNoYW5uZWw7IAorCisJLyogZG1hIGJ1ZiByZWFkICovIAorCXB0ZGVzY3IgPSAocGNzY2FfYmRfdCBfX2lvbWVtICopKGNhcmQtPmh3LnJhbWJhc2UgKyAKKwkJCQlSWF9CRF9BRERSKGNoLCBwYzMwMGNoYW4tPnJ4X2ZpcnN0X2JkKSk7IAorCXdoaWxlIChwYzMwMGNoYW4tPnJ4X2ZpcnN0X2JkICE9IHBjMzAwY2hhbi0+cnhfbGFzdF9iZCkgeyAKKwkJc3RhdHVzID0gY3BjX3JlYWRiKCZwdGRlc2NyLT5zdGF0dXMpOyAKKwkJY3BjX3dyaXRlYigmcHRkZXNjci0+c3RhdHVzLCAwKTsgCisJCWNwY193cml0ZWIoJnB0ZGVzY3ItPmxlbiwgMCk7IAorCQlwYzMwMGNoYW4tPnJ4X2ZpcnN0X2JkID0gKHBjMzAwY2hhbi0+cnhfZmlyc3RfYmQgKyAxKSAmIAorCQkJCQkoTl9ETUFfUlhfQlVGIC0gMSk7IAorCQlpZiAoc3RhdHVzICYgRFNUX0VPTSkgeyAKKwkJCWJyZWFrOyAvKiBlbmQgb2YgbWVzc2FnZSAqLworCQl9CisJCXB0ZGVzY3IgPSAocGNzY2FfYmRfdCBfX2lvbWVtICopKGNhcmQtPmh3LnJhbWJhc2UgKyBjcGNfcmVhZGwoJnB0ZGVzY3ItPm5leHQpKTsgCisJfQorfQorCit2b2lkIGNwY190dHlfcmVjZWl2ZShwYzMwMGRldl90ICpwYzMwMGRldikKK3sKKwlzdF9jcGNfdHR5X2FyZWEgICAgKmNwY190dHk7IAorCXBjMzAwY2hfdCAqcGMzMDBjaGFuID0gKHBjMzAwY2hfdCAqKXBjMzAwZGV2LT5jaGFuOyAKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKilwYzMwMGNoYW4tPmNhcmQ7IAorCWludCBjaCA9IHBjMzAwY2hhbi0+Y2hhbm5lbDsgCisJdm9sYXRpbGUgcGNzY2FfYmRfdCAgX19pb21lbSAqIHB0ZGVzY3I7IAorCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMocGMzMDBkZXYtPmRldik7CisJaW50IHJ4X2xlbiwgcnhfYXV4OyAKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHN0YXR1czsgCisJdW5zaWduZWQgc2hvcnQgZmlyc3RfYmQgPSBwYzMwMGNoYW4tPnJ4X2ZpcnN0X2JkOworCXN0X2NwY19yeF9idWYJKm5ldz1OVUxMOworCXVuc2lnbmVkIGNoYXIgZHNyX3J4OworCisJaWYgKHBjMzAwZGV2LT5jcGNfdHR5ID09IE5VTEwpIHsgCisJCXJldHVybjsgCisJfQorCisJZHNyX3J4ID0gY3BjX3JlYWRiKGNhcmQtPmh3LnNjYWJhc2UgKyBEU1JfUlgoY2gpKTsKKworCWNwY190dHkgPSAoc3RfY3BjX3R0eV9hcmVhICopcGMzMDBkZXYtPmNwY190dHk7IAorCisJd2hpbGUgKDEpIHsgCisJCXJ4X2xlbiA9IDA7CisJCXB0ZGVzY3IgPSAocGNzY2FfYmRfdCAgX19pb21lbSAqKShjYXJkLT5ody5yYW1iYXNlICsgUlhfQkRfQUREUihjaCwgZmlyc3RfYmQpKTsKKwkJd2hpbGUgKChzdGF0dXMgPSBjcGNfcmVhZGIoJnB0ZGVzY3ItPnN0YXR1cykpICYgRFNUX09TQikgeworCQkJcnhfbGVuICs9IGNwY19yZWFkdygmcHRkZXNjci0+bGVuKTsKKwkJCWZpcnN0X2JkID0gKGZpcnN0X2JkICsgMSkgJiAoTl9ETUFfUlhfQlVGIC0gMSk7CisJCQlpZiAoc3RhdHVzICYgRFNUX0VPTSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJcHRkZXNjcj0ocGNzY2FfYmRfdCBfX2lvbWVtICopKGNhcmQtPmh3LnJhbWJhc2UrY3BjX3JlYWRsKCZwdGRlc2NyLT5uZXh0KSk7CisJCX0KKwkJCQorCQlpZiAoIXJ4X2xlbikgeyAKKwkJCWlmIChkc3JfcnggJiBEU1JfQk9GKSB7CisJCQkJLyogdXBkYXRlIEVEQSAqLyAKKwkJCQljcGNfd3JpdGVsKGNhcmQtPmh3LnNjYWJhc2UgKyBEUlhfUkVHKEVEQUwsIGNoKSwgCisJCQkJCQlSWF9CRF9BRERSKGNoLCBwYzMwMGNoYW4tPnJ4X2xhc3RfYmQpKTsgCisJCQl9CisJCQlpZiAobmV3KSB7CisJCQkJa2ZyZWUobmV3KTsKKwkJCQluZXcgPSBOVUxMOworCQkJfQorCQkJcmV0dXJuOyAKKwkJfQorCQkKKwkJaWYgKHJ4X2xlbiA+IENQQ19UVFlfTUFYX01UVSkgeyAKKwkJCS8qIEZyZWUgUlggZGVzY3JpcHRvcnMgKi8gCisJCQlDUENfVFRZX0RCRygiJXM6IGZyYW1lIHNpemUgaXMgaW52YWxpZC5cbiIsY3BjX3R0eS0+bmFtZSk7CisJCQlzdGF0cy0+cnhfZXJyb3JzKys7IAorCQkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycysrOyAKKwkJCWNwY190dHlfcnhfZGlzY19mcmFtZShwYzMwMGNoYW4pOworCQkJY29udGludWU7CisJCX0gCisJCQorCQluZXcgPSAoc3RfY3BjX3J4X2J1ZiAqKSBrbWFsbG9jKHJ4X2xlbiArIHNpemVvZihzdF9jcGNfcnhfYnVmKSwgR0ZQX0FUT01JQyk7CisJCWlmIChuZXcgPT0gMCkgeworCQkJY3BjX3R0eV9yeF9kaXNjX2ZyYW1lKHBjMzAwY2hhbik7CisJCQljb250aW51ZTsKKwkJfQorCQkKKwkJLyogZG1hIGJ1ZiByZWFkICovIAorCQlwdGRlc2NyID0gKHBjc2NhX2JkX3QgX19pb21lbSAqKShjYXJkLT5ody5yYW1iYXNlICsgCisJCQkJUlhfQkRfQUREUihjaCwgcGMzMDBjaGFuLT5yeF9maXJzdF9iZCkpOyAKKworCQlyeF9sZW4gPSAwOwkvKiBjb3VudGVyIGZyYW1lIHNpemUgKi8KKwkJCisJCXdoaWxlICgoc3RhdHVzID0gY3BjX3JlYWRiKCZwdGRlc2NyLT5zdGF0dXMpKSAmIERTVF9PU0IpIHsKKwkJCXJ4X2F1eCA9IGNwY19yZWFkdygmcHRkZXNjci0+bGVuKTsKKwkJCWlmICgoc3RhdHVzICYgKERTVF9PVlIgfCBEU1RfQ1JDIHwgRFNUX1JCSVQgfCAgRFNUX1NIUlQgfCBEU1RfQUJUKSkKKwkJCQl8fCAocnhfYXV4ID4gQkRfREVGX0xFTikpIHsKKwkJCQlDUENfVFRZX0RCRygiJXM6IHJlY2VwdGlvbiBlcnJvclxuIiwgY3BjX3R0eS0+bmFtZSk7CisJCQkJc3RhdHMtPnJ4X2Vycm9ycysrOyAKKwkJCQlpZiAoc3RhdHVzICYgRFNUX09WUikgeyAKKwkJCQkJc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzKys7IAorCQkJCX0KKwkJCQlpZiAoc3RhdHVzICYgRFNUX0NSQykgeyAKKwkJCQkJc3RhdHMtPnJ4X2NyY19lcnJvcnMrKzsgCisJCQkJfQorCQkJCWlmICgoc3RhdHVzICYgKERTVF9SQklUIHwgRFNUX1NIUlQgfCBEU1RfQUJUKSkgfHwKKwkJCQkJKHJ4X2F1eCA+IEJEX0RFRl9MRU4pKQl7IAorCQkJCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7IAorCQkJCX0gCisJCQkJLyogZGlzY2FyZCByZW1haW5pZyBkZXNjcmlwdG9ycyB1c2VkIGJ5IHRoZSBiYWQgZnJhbWUgKi8gCisJCQkJQ1BDX1RUWV9EQkcoIiVzOiByZWNlcHRpb24gZXJyb3IgLSBkaXNjYXJkIGRlc2NyaXB0b3JzIiwKKwkJCQkJCWNwY190dHktPm5hbWUpOworCQkJCWNwY190dHlfcnhfZGlzY19mcmFtZShwYzMwMGNoYW4pOworCQkJCXJ4X2xlbiA9IDA7CisJCQkJa2ZyZWUobmV3KTsKKwkJCQluZXcgPSBOVUxMOworCQkJCWJyZWFrOyAvKiByZWFkIG5leHQgZnJhbWUgLSB3aGlsZSgxKSAqLworCQkJfQorCisJCQlpZiAoY3BjX3R0eS0+c3RhdGUgIT0gQ1BDX1RUWV9TVF9PUEVOKSB7CisJCQkJLyogRnJlZSBSWCBkZXNjcmlwdG9ycyAqLyAKKwkJCQljcGNfdHR5X3J4X2Rpc2NfZnJhbWUocGMzMDBjaGFuKTsKKwkJCQlzdGF0cy0+cnhfZHJvcHBlZCsrOyAKKwkJCQlyeF9sZW4gPSAwOyAKKwkJCQlrZnJlZShuZXcpOworCQkJCW5ldyA9IE5VTEw7CisJCQkJYnJlYWs7IC8qIHJlYWQgbmV4dCBmcmFtZSAtIHdoaWxlKDEpICovCisJCQl9CisKKwkJCS8qIHJlYWQgdGhlIHNlZ21lbnQgb2YgdGhlIGZyYW1lICovCisJCQlpZiAocnhfYXV4ICE9IDApIHsKKwkJCQltZW1jcHlfZnJvbWlvKChuZXctPmRhdGEgKyByeF9sZW4pLCAKKwkJCQkJKHZvaWQgX19pb21lbSAqKShjYXJkLT5ody5yYW1iYXNlICsgCisJCQkJCSBjcGNfcmVhZGwoJnB0ZGVzY3ItPnB0YnVmKSksIHJ4X2F1eCk7CisJCQkJcnhfbGVuICs9IHJ4X2F1eDsgCisJCQl9CisJCQljcGNfd3JpdGViKCZwdGRlc2NyLT5zdGF0dXMsMCk7IAorCQkJY3BjX3dyaXRlYigmcHRkZXNjci0+bGVuLCAwKTsgCisJCQlwYzMwMGNoYW4tPnJ4X2ZpcnN0X2JkID0gKHBjMzAwY2hhbi0+cnhfZmlyc3RfYmQgKyAxKSAmIAorCQkJCQkoTl9ETUFfUlhfQlVGIC0xKTsgCisJCQlpZiAoc3RhdHVzICYgRFNUX0VPTSlicmVhazsKKwkJCQorCQkJcHRkZXNjciA9IChwY3NjYV9iZF90IF9faW9tZW0gKikgKGNhcmQtPmh3LnJhbWJhc2UgKyAKKwkJCQkJY3BjX3JlYWRsKCZwdGRlc2NyLT5uZXh0KSk7IAorCQl9CisJCS8qIHVwZGF0ZSBwb2ludGVyICovIAorCQlwYzMwMGNoYW4tPnJ4X2xhc3RfYmQgPSAocGMzMDBjaGFuLT5yeF9maXJzdF9iZCAtIDEpICYgCisJCQkJCShOX0RNQV9SWF9CVUYgLSAxKSA7IAorCQlpZiAoIShkc3JfcnggJiBEU1JfQk9GKSkgeworCQkJLyogdXBkYXRlIEVEQSAqLyAKKwkJCWNwY193cml0ZWwoY2FyZC0+aHcuc2NhYmFzZSArIERSWF9SRUcoRURBTCwgY2gpLCAKKwkJCQkJUlhfQkRfQUREUihjaCwgcGMzMDBjaGFuLT5yeF9sYXN0X2JkKSk7IAorCQl9CisJCWlmIChyeF9sZW4gIT0gMCkgeyAKKwkJCXN0YXRzLT5yeF9ieXRlcyArPSByeF9sZW47IAorCQkKKwkJCWlmIChwYzMwMGRldi0+dHJhY2Vfb24pIHsgCisJCQkJY3BjX3R0eV90cmFjZShwYzMwMGRldiwgbmV3LT5kYXRhLHJ4X2xlbiwgJ1InKTsgCisJCQl9IAorCQkJbmV3LT5zaXplID0gcnhfbGVuOworCQkJbmV3LT5uZXh0ID0gTlVMTDsKKwkJCWlmIChjcGNfdHR5LT5idWZfcnguZmlyc3QgPT0gMCkgeworCQkJCWNwY190dHktPmJ1Zl9yeC5maXJzdCA9IG5ldzsKKwkJCQljcGNfdHR5LT5idWZfcngubGFzdCA9IG5ldzsKKwkJCX0gZWxzZSB7CisJCQkJY3BjX3R0eS0+YnVmX3J4Lmxhc3QtPm5leHQgPSBuZXc7CisJCQkJY3BjX3R0eS0+YnVmX3J4Lmxhc3QgPSBuZXc7CisJCQl9CisJCQlzY2hlZHVsZV93b3JrKCYoY3BjX3R0eS0+dHR5X3J4X3dvcmspKTsKKwkJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCX0KKwl9IAorfSAKKworLyoKKyAqIFBDMzAwIFRUWSBUWCB3b3JrIHJvdXRpbmUKKyAqIAorICogVGhpcyByb3V0aW5lIHRyZWF0cyBUWCBpbnRlcnJ1cHQuIAorICogbyBpZiBuZWVkIGNhbGwgbGluZSBkaXNjaXBsaW5lIHdha2V1cAorICogbyBjYWxsIHdha2VfdXBfaW50ZXJydXB0aWJsZQorICovCitzdGF0aWMgdm9pZCBjcGNfdHR5X3R4X3dvcmsodm9pZCAqZGF0YSkKK3sKKwlzdF9jcGNfdHR5X2FyZWEgKmNwY190dHkgPSAoc3RfY3BjX3R0eV9hcmVhICopIGRhdGE7IAorCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7IAorCisJQ1BDX1RUWV9EQkcoIiVzOiBjcGNfdHR5X3R4X3dvcmsgaW5pdFxuIixjcGNfdHR5LT5uYW1lKTsKKwkKKwlpZiAoKHR0eSA9IGNwY190dHktPnR0eSkgPT0gMCkgeyAKKwkJQ1BDX1RUWV9EQkcoIiVzOiB0aGUgaW50ZXJmYWNlIGlzIG5vdCBvcGVuZWRcbiIsY3BjX3R0eS0+bmFtZSk7CisJCXJldHVybjsgCisJfQorCXR0eV93YWtldXAodHR5KTsKK30KKworLyoKKyAqIFBDMzAwIFRUWSBzZW5kIHRvIGNhcmQgcm91dGluZQorICogCisgKiBUaGlzIHJvdXRpbmUgc2VuZCBkYXRhIHRvIGNhcmQuIAorICogbyBjbGVhciBkZXNjcmlwdG9ycworICogbyB3cml0ZSBkYXRhIHRvIERNQSBidWZmZXJzCisgKiBvIHN0YXJ0IHRoZSB0cmFuc21pc3Npb24KKyAqLworc3RhdGljIGludCBjcGNfdHR5X3NlbmRfdG9fY2FyZChwYzMwMGRldl90ICpkZXYsdm9pZCogYnVmLCBpbnQgbGVuKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKilkZXYtPmNoYW47IAorCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKWNoYW4tPmNhcmQ7IAorCWludCBjaCA9IGNoYW4tPmNoYW5uZWw7IAorCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2LT5kZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IAorCXZvbGF0aWxlIHBjc2NhX2JkX3QgX19pb21lbSAqcHRkZXNjcjsgCisJaW50IGksIG5jaGFyOworCWludCB0b3NlbmQgPSBsZW47CisJaW50IG5idWYgPSAoKGxlbiAtIDEpL0JEX0RFRl9MRU4pICsgMTsKKwl1bnNpZ25lZCBjaGFyICpwZGF0YT1idWY7CisKKwlDUENfVFRZX0RCRygiJXM6Y3BjX3R0eV9zZW5kX3RvX2NhcnMgbGVuPSVpIiwgCisJCQkoc3RfY3BjX3R0eV9hcmVhICopZGV2LT5jcGNfdHR5LT5uYW1lLGxlbik7CQorCisJaWYgKG5idWYgPj0gY2FyZC0+Y2hhbltjaF0ubmZyZWVfdHhfYmQpIHsKKwkJcmV0dXJuIDE7CisJfQorCQorCS8qIHdyaXRlIGJ1ZmZlciB0byBETUEgYnVmZmVycyAqLyAKKwlDUENfVFRZX0RCRygiJXM6IGNhbGwgZG1hX2J1Zl93cml0ZVxuIiwKKwkJCShzdF9jcGNfdHR5X2FyZWEgKilkZXYtPmNwY190dHktPm5hbWUpOwkKKwlmb3IgKGkgPSAwIDsgaSA8IG5idWYgOyBpKyspIHsKKwkJcHRkZXNjciA9IChwY3NjYV9iZF90IF9faW9tZW0gKikoY2FyZC0+aHcucmFtYmFzZSArIAorCQkJVFhfQkRfQUREUihjaCwgY2FyZC0+Y2hhbltjaF0udHhfbmV4dF9iZCkpOworCQluY2hhciA9IChCRF9ERUZfTEVOID4gdG9zZW5kKSA/IHRvc2VuZCA6IEJEX0RFRl9MRU47CisJCWlmIChjcGNfcmVhZGIoJnB0ZGVzY3ItPnN0YXR1cykgJiBEU1RfT1NCKSB7CisJCQltZW1jcHlfdG9pbygodm9pZCBfX2lvbWVtICopKGNhcmQtPmh3LnJhbWJhc2UgKyAKKwkJCQljcGNfcmVhZGwoJnB0ZGVzY3ItPnB0YnVmKSksIAorCQkJCSZwZGF0YVtsZW4gLSB0b3NlbmRdLCAKKwkJCQluY2hhcik7CisJCQljYXJkLT5jaGFuW2NoXS5uZnJlZV90eF9iZC0tOworCQkJaWYgKChpICsgMSkgPT0gbmJ1ZikgeworCQkJCS8qIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBCRCB0byBiZSB1c2VkICovCisJCQkJY3BjX3dyaXRlYigmcHRkZXNjci0+c3RhdHVzLCBEU1RfRU9NKTsKKwkJCX0gZWxzZSB7CisJCQkJY3BjX3dyaXRlYigmcHRkZXNjci0+c3RhdHVzLCAwKTsKKwkJCX0KKwkJCWNwY193cml0ZXcoJnB0ZGVzY3ItPmxlbiwgbmNoYXIpOworCQl9IGVsc2UgeworCQkJQ1BDX1RUWV9EQkcoIiVzOiBlcnJvciBpbiBkbWFfYnVmX3dyaXRlXG4iLAorCQkJCQkoc3RfY3BjX3R0eV9hcmVhICopZGV2LT5jcGNfdHR5LT5uYW1lKTsJCisJCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCQkJcmV0dXJuIDE7IAorCQl9CisJCXRvc2VuZCAtPSBuY2hhcjsKKwkJY2FyZC0+Y2hhbltjaF0udHhfbmV4dF9iZCA9IAorCQkJKGNhcmQtPmNoYW5bY2hdLnR4X25leHRfYmQgKyAxKSAmIChOX0RNQV9UWF9CVUYgLSAxKTsKKwl9CisKKwlpZiAoZGV2LT50cmFjZV9vbikgeyAKKwkJY3BjX3R0eV90cmFjZShkZXYsIGJ1ZiwgbGVuLCdUJyk7IAorCX0KKworCS8qIHN0YXJ0IHRyYW5zbWlzc2lvbiAqLyAKKwlDUENfVFRZX0RCRygiJXM6IHN0YXJ0IHRyYW5zbWlzc2lvblxuIiwKKwkJKHN0X2NwY190dHlfYXJlYSAqKWRldi0+Y3BjX3R0eS0+bmFtZSk7CQorCQorCUNQQ19UVFlfTE9DSyhjYXJkLCBmbGFncyk7IAorCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIERUWF9SRUcoRURBTCwgY2gpLCAKKwkJCVRYX0JEX0FERFIoY2gsIGNoYW4tPnR4X25leHRfYmQpKTsgCisJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgTV9SRUcoQ01ELCBjaCksIENNRF9UWF9FTkEpOyAKKwljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBEU1JfVFgoY2gpLCBEU1JfREUpOyAKKworCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7IAorCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLCAKKwkJCWNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMikgfAorCQkJKENQTERfUkVHMl9GQUxDX0xFRDEgPDwgKDIgKiBjaCkpKTsgCisJfQorCUNQQ19UVFlfVU5MT0NLKGNhcmQsIGZsYWdzKTsgCisJcmV0dXJuIDA7IAorfSAKKworLyoKKyAqCVBDMzAwIFRUWSB0cmFjZSByb3V0aW5lCisgKgorICogIFRoaXMgcm91dGluZSBzZW5kIHRyYWNlIG9mIGNvbm5lY3Rpb24gdG8gYXBwbGljYXRpb24uIAorICogIG8gY2xlYXIgZGVzY3JpcHRvcnMKKyAqICBvIHdyaXRlIGRhdGEgdG8gRE1BIGJ1ZmZlcnMKKyAqICBvIHN0YXJ0IHRoZSB0cmFuc21pc3Npb24KKyAqLworCitzdGF0aWMgdm9pZCBjcGNfdHR5X3RyYWNlKHBjMzAwZGV2X3QgKmRldiwgY2hhciogYnVmLCBpbnQgbGVuLCBjaGFyIHJ4dHgpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsgCisKKwlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoMTAgKyBsZW4pKSA9PSBOVUxMKSB7IAorCQkvKiBvdXQgb2YgbWVtb3J5ICovIAorCQlDUENfVFRZX0RCRygiJXM6IHR0eV90cmFjZSAtIG91dCBvZiBtZW1vcnlcbiIsIGRldi0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOyAKKwl9CisKKwlza2JfcHV0IChza2IsIDEwICsgbGVuKTsgCisJc2tiLT5kZXYgPSBkZXYtPmRldjsgCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0NVU1QpOyAKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7IAorCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsgCisJc2tiLT5sZW4gPSAxMCArIGxlbjsgCisKKwltZW1jcHkoc2tiLT5kYXRhLGRldi0+ZGV2LT5uYW1lLDUpOworCXNrYi0+ZGF0YVs1XSA9ICdbJzsgCisJc2tiLT5kYXRhWzZdID0gcnh0eDsgCisJc2tiLT5kYXRhWzddID0gJ10nOyAKKwlza2ItPmRhdGFbOF0gPSAnOic7IAorCXNrYi0+ZGF0YVs5XSA9ICcgJzsgCisJbWVtY3B5KCZza2ItPmRhdGFbMTBdLCBidWYsIGxlbik7IAorCW5ldGlmX3J4KHNrYik7IAorfSAJCisKKy8qCisgKglQQzMwMCBUVFkgdW5yZWdpc3RlciBzZXJ2aWNlIHJvdXRpbmUKKyAqCisgKglUaGlzIHJvdXRpbmUgdW5yZWdpc3RlciBvbmUgaW50ZXJmYWNlLiAKKyAqLwordm9pZCBjcGNfdHR5X3VucmVnaXN0ZXJfc2VydmljZShwYzMwMGRldl90ICpwYzMwMGRldikKK3sKKwlzdF9jcGNfdHR5X2FyZWEgKmNwY190dHk7IAorCXVsb25nIGZsYWdzOworCWludCByZXM7CisKKwlpZiAoKGNwY190dHk9IChzdF9jcGNfdHR5X2FyZWEgKikgcGMzMDBkZXYtPmNwY190dHkpID09IDApIHsgCisJCUNQQ19UVFlfREJHKCIlczogaW50ZXJmYWNlIGlzIG5vdCBUVFlcbiIsIHBjMzAwZGV2LT5kZXYtPm5hbWUpOworCQlyZXR1cm47IAorCX0KKwlDUENfVFRZX0RCRygiJXM6IGNwY190dHlfdW5yZWdpc3Rlcl9zZXJ2aWNlIiwgY3BjX3R0eS0+bmFtZSk7CisKKwlpZiAoY3BjX3R0eS0+cGMzMDBkZXYgIT0gcGMzMDBkZXYpIHsgCisJCUNQQ19UVFlfREJHKCIlczogaW52YWxpZCB0dHkgcHRyPSVzXG4iLCAKKwkJcGMzMDBkZXYtPmRldi0+bmFtZSwgY3BjX3R0eS0+bmFtZSk7CisJCXJldHVybjsgCisJfQorCisJaWYgKC0tY3BjX3R0eV9jbnQgPT0gMCkgeyAKKwkJaWYgKHNlcmlhbF9kcnYucmVmY291bnQpIHsKKwkJCUNQQ19UVFlfREJHKCIlczogdW5yZWdpc3RlciBpcyBub3QgcG9zc2libGUsIHJlZmNvdW50PSVkIiwKKwkJCQkJCQljcGNfdHR5LT5uYW1lLCBzZXJpYWxfZHJ2LnJlZmNvdW50KTsKKwkJCWNwY190dHlfY250Kys7CisJCQljcGNfdHR5X3VucmVnX2ZsYWcgPSAxOworCQkJcmV0dXJuOworCQl9IGVsc2UgeyAKKwkJCUNQQ19UVFlfREJHKCIlczogdW5yZWdpc3RlciB0aGUgdHR5IGRyaXZlclxuIiwgY3BjX3R0eS0+bmFtZSk7CisJCQlpZiAoKHJlcz10dHlfdW5yZWdpc3Rlcl9kcml2ZXIoJnNlcmlhbF9kcnYpKSkgeyAKKwkJCQlDUENfVFRZX0RCRygiJXM6IEVSUk9SIC0+dW5yZWdpc3RlciB0aGUgdHR5IGRyaXZlciBlcnJvcj0lZFxuIiwKKwkJCQkJCQkJY3BjX3R0eS0+bmFtZSxyZXMpOworCQkJfQorCQl9CisJfQorCUNQQ19UVFlfTE9DSyhwYzMwMGRldi0+Y2hhbi0+Y2FyZCxmbGFncyk7CisJY3BjX3R0eS0+dHR5ID0gTlVMTDsgCisJQ1BDX1RUWV9VTkxPQ0socGMzMDBkZXYtPmNoYW4tPmNhcmQsIGZsYWdzKTsKKwljcGNfdHR5LT50dHlfbWlub3IgPSAwOyAKKwljcGNfdHR5LT5zdGF0ZSA9IENQQ19UVFlfU1RfSURMRTsgCit9IAorCisvKgorICogUEMzMDAgVFRZIHRyaWdnZXIgcG9sbCByb3V0aW5lCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHBjMzAwZHJpdmVyIHRvIHRyZWF0cyBUeCBpbnRlcnJ1cHQuIAorICovCit2b2lkIGNwY190dHlfdHJpZ2dlcl9wb2xsKHBjMzAwZGV2X3QgKnBjMzAwZGV2KQoreworCXN0X2NwY190dHlfYXJlYSAqY3BjX3R0eSA9IChzdF9jcGNfdHR5X2FyZWEgKilwYzMwMGRldi0+Y3BjX3R0eTsgCisJaWYgKCFjcGNfdHR5KSB7CisJCXJldHVybjsKKwl9CisJc2NoZWR1bGVfd29yaygmKGNwY190dHktPnR0eV90eF93b3JrKSk7IAorfSAKKworLyoKKyAqIFBDMzAwIFRUWSByZXNldCB2YXIgcm91dGluZQorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBwYzMwMGRyaXZlciB0byBpbml0IHRoZSBUVFkgYXJlYS4gCisgKi8KKwordm9pZCBjcGNfdHR5X3Jlc2V0X3Zhcih2b2lkKQoreworCWludCBpIDsgCisKKwlDUENfVFRZX0RCRygiaGRsY1gtdHR5OiByZXNldCB2YXJpYWJsZXNcbiIpOworCS8qIHJlc2V0ICB0aGUgdHR5X2RyaXZlciBzdHJ1Y3R1cmUgLSBzZXJpYWxfZHJ2ICovIAorCW1lbXNldCgmc2VyaWFsX2RydiwgMCwgc2l6ZW9mKHN0cnVjdCB0dHlfZHJpdmVyKSk7CisJZm9yIChpPTA7IGkgPCBDUENfVFRZX05QT1JUUzsgaSsrKXsKKwkJbWVtc2V0KCZjcGNfdHR5X2FyZWFbaV0sMCwgc2l6ZW9mKHN0X2NwY190dHlfYXJlYSkpOyAKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vcGNpMjAwc3luLmMgYi9kcml2ZXJzL25ldC93YW4vcGNpMjAwc3luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlYTA3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9wY2kyMDBzeW4uYwpAQCAtMCwwICsxLDQ4OCBAQAorLyoKKyAqIEdvcmFtbyBQQ0kyMDBTWU4gc3luY2hyb25vdXMgc2VyaWFsIGNhcmQgZHJpdmVyIGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBGb3IgaW5mb3JtYXRpb24gc2VlIGh0dHA6Ly9ocS5wbS53YXcucGwvaGRsYy8KKyAqCisgKiBTb3VyY2VzIG9mIGluZm9ybWF0aW9uOgorICogICAgSGl0YWNoaSBIRDY0NTcyIFNDQS1JSSBVc2VyJ3MgTWFudWFsCisgKiAgICBQTFggVGVjaG5vbG9neSBJbmMuIFBDSTkwNTIgRGF0YSBCb29rCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiaGQ2NDU3Mi5oIgorCitzdGF0aWMgY29uc3QgY2hhciogdmVyc2lvbiA9ICJHb3JhbW8gUENJMjAwU1lOIGRyaXZlciB2ZXJzaW9uOiAxLjE2IjsKK3N0YXRpYyBjb25zdCBjaGFyKiBkZXZuYW1lID0gIlBDSTIwMFNZTiI7CisKKyN1bmRlZiBERUJVR19QS1QKKyNkZWZpbmUgREVCVUdfUklOR1MKKworI2RlZmluZSBQQ0kyMDBTWU5fUExYX1NJWkUJMHg4MAkvKiBQTFggY29udHJvbCB3aW5kb3cgc2l6ZSAoMTI4YikgKi8KKyNkZWZpbmUgUENJMjAwU1lOX1NDQV9TSVpFCTB4NDAwCS8qIFNDQSB3aW5kb3cgc2l6ZSAoMUtiKSAqLworI2RlZmluZSBBTExfUEFHRVNfQUxXQVlTX01BUFBFRAorI2RlZmluZSBORUVEX0RFVEVDVF9SQU0KKyNkZWZpbmUgTkVFRF9TQ0FfTVNDSV9JTlRSCisjZGVmaW5lIE1BWF9UWF9CVUZGRVJTCQkxMAorCitzdGF0aWMgaW50IHBjaV9jbG9ja19mcmVxID0gMzMwMDAwMDA7CisjZGVmaW5lIENMT0NLX0JBU0UgcGNpX2Nsb2NrX2ZyZXEKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0dPUkFNTwkweDEwQjUJLyogdXNlcyBQTFg6OTA1MCBJRCAtIHRoaXMgY2FyZAkqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BDSTIwMFNZTgkweDkwNTAJLyogZG9lc24ndCBoYXZlIGl0cyBvd24gSUQJKi8KKworCisvKgorICogICAgICBQTFggUENJOTA1MiBsb2NhbCBjb25maWd1cmF0aW9uIGFuZCBzaGFyZWQgcnVudGltZSByZWdpc3RlcnMuCisgKiAgICAgIFRoaXMgc3RydWN0dXJlIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyA5MDUyIHJlZ2lzdGVycyAobWVtb3J5IG1hcHBlZCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgbG9jX2FkZHJfcmFuZ2VbNF07CS8qIDAwLTBDaCA6IExvY2FsIEFkZHJlc3MgUmFuZ2VzICovCisJdTMyIGxvY19yb21fcmFuZ2U7CS8qIDEwaCA6IExvY2FsIFJPTSBSYW5nZSAqLworCXUzMiBsb2NfYWRkcl9iYXNlWzRdOwkvKiAxNC0yMGggOiBMb2NhbCBBZGRyZXNzIEJhc2UgQWRkcnMgKi8KKwl1MzIgbG9jX3JvbV9iYXNlOwkvKiAyNGggOiBMb2NhbCBST00gQmFzZSAqLworCXUzMiBsb2NfYnVzX2Rlc2NyWzRdOwkvKiAyOC0zNGggOiBMb2NhbCBCdXMgRGVzY3JpcHRvcnMgKi8KKwl1MzIgcm9tX2J1c19kZXNjcjsJLyogMzhoIDogUk9NIEJ1cyBEZXNjcmlwdG9yICovCisJdTMyIGNzX2Jhc2VbNF07CQkvKiAzQy00OGggOiBDaGlwIFNlbGVjdCBCYXNlIEFkZHJzICovCisJdTMyIGludHJfY3RybF9zdGF0OwkvKiA0Q2ggOiBJbnRlcnJ1cHQgQ29udHJvbC9TdGF0dXMgKi8KKwl1MzIgaW5pdF9jdHJsOwkJLyogNTBoIDogRUVQUk9NIGN0cmwsIEluaXQgQ3RybCwgZXRjICovCit9cGx4OTA1MjsKKworCisKK3R5cGVkZWYgc3RydWN0IHBvcnRfcyB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY2FyZF9zICpjYXJkOworCXNwaW5sb2NrX3QgbG9jazsJLyogVFggbG9jayAqLworCXN5bmNfc2VyaWFsX3NldHRpbmdzIHNldHRpbmdzOworCWludCByeHBhcnQ7CQkvKiBwYXJ0aWFsIGZyYW1lIHJlY2VpdmVkLCBuZXh0IGZyYW1lIGludmFsaWQqLworCXVuc2lnbmVkIHNob3J0IGVuY29kaW5nOworCXVuc2lnbmVkIHNob3J0IHBhcml0eTsKKwl1MTYgcnhpbjsJCS8qIHJ4IHJpbmcgYnVmZmVyICdpbicgcG9pbnRlciAqLworCXUxNiB0eGluOwkJLyogdHggcmluZyBidWZmZXIgJ2luJyBhbmQgJ2xhc3QnIHBvaW50ZXJzICovCisJdTE2IHR4bGFzdDsKKwl1OCByeHMsIHR4cywgdG1jOwkvKiBTQ0EgcmVnaXN0ZXJzICovCisJdTggcGh5X25vZGU7CQkvKiBwaHlzaWNhbCBwb3J0ICMgLSAwIG9yIDEgKi8KK31wb3J0X3Q7CisKKworCit0eXBlZGVmIHN0cnVjdCBjYXJkX3MgeworCXU4IF9faW9tZW0gKnJhbWJhc2U7CS8qIGJ1ZmZlciBtZW1vcnkgYmFzZSAodmlydHVhbCkgKi8KKwl1OCBfX2lvbWVtICpzY2FiYXNlOwkvKiBTQ0EgbWVtb3J5IGJhc2UgKHZpcnR1YWwpICovCisJcGx4OTA1MiBfX2lvbWVtICpwbHhiYXNlOy8qIFBMWCByZWdpc3RlcnMgbWVtb3J5IGJhc2UgKHZpcnR1YWwpICovCisJdTE2IHJ4X3JpbmdfYnVmZmVyczsJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gYSByaW5nICovCisJdTE2IHR4X3JpbmdfYnVmZmVyczsKKwl1MTYgYnVmZl9vZmZzZXQ7CS8qIG9mZnNldCBvZiBmaXJzdCBidWZmZXIgb2YgZmlyc3QgY2hhbm5lbCAqLworCXU4IGlycTsJCQkvKiBpbnRlcnJ1cHQgcmVxdWVzdCBsZXZlbCAqLworCisJcG9ydF90IHBvcnRzWzJdOworfWNhcmRfdDsKKworCisjZGVmaW5lIHNjYV9pbihyZWcsIGNhcmQpCSAgICAgcmVhZGIoY2FyZC0+c2NhYmFzZSArIChyZWcpKQorI2RlZmluZSBzY2Ffb3V0KHZhbHVlLCByZWcsIGNhcmQpICAgIHdyaXRlYih2YWx1ZSwgY2FyZC0+c2NhYmFzZSArIChyZWcpKQorI2RlZmluZSBzY2FfaW53KHJlZywgY2FyZCkJICAgICByZWFkdyhjYXJkLT5zY2FiYXNlICsgKHJlZykpCisjZGVmaW5lIHNjYV9vdXR3KHZhbHVlLCByZWcsIGNhcmQpICAgd3JpdGV3KHZhbHVlLCBjYXJkLT5zY2FiYXNlICsgKHJlZykpCisjZGVmaW5lIHNjYV9pbmwocmVnLCBjYXJkKQkgICAgIHJlYWRsKGNhcmQtPnNjYWJhc2UgKyAocmVnKSkKKyNkZWZpbmUgc2NhX291dGwodmFsdWUsIHJlZywgY2FyZCkgICB3cml0ZWwodmFsdWUsIGNhcmQtPnNjYWJhc2UgKyAocmVnKSkKKworI2RlZmluZSBwb3J0X3RvX2NhcmQocG9ydCkJICAgICAocG9ydC0+Y2FyZCkKKyNkZWZpbmUgbG9nX25vZGUocG9ydCkJCSAgICAgKHBvcnQtPnBoeV9ub2RlKQorI2RlZmluZSBwaHlfbm9kZShwb3J0KQkJICAgICAocG9ydC0+cGh5X25vZGUpCisjZGVmaW5lIHdpbmJhc2UoY2FyZCkJCSAgICAgKGNhcmQtPnJhbWJhc2UpCisjZGVmaW5lIGdldF9wb3J0KGNhcmQsIHBvcnQpCSAgICAgKCZjYXJkLT5wb3J0c1twb3J0XSkKKyNkZWZpbmUgc2NhX2ZsdXNoKGNhcmQpCQkgICAgIChzY2FfaW4oSUVSMCwgY2FyZCkpOworCitzdGF0aWMgaW5saW5lIHZvaWQgbmV3X21lbWNweV90b2lvKGNoYXIgX19pb21lbSAqZGVzdCwgY2hhciAqc3JjLCBpbnQgbGVuZ3RoKQoreworCWludCBsZW47CisJZG8geworCQlsZW4gPSBsZW5ndGggPiAyNTYgPyAyNTYgOiBsZW5ndGg7CisJCW1lbWNweV90b2lvKGRlc3QsIHNyYywgbGVuKTsKKwkJZGVzdCArPSBsZW47CisJCXNyYyArPSBsZW47CisJCWxlbmd0aCAtPSBsZW47CisJCXJlYWRiKGRlc3QpOworCX0gd2hpbGUgKGxlbik7Cit9CisKKyN1bmRlZiBtZW1jcHlfdG9pbworI2RlZmluZSBtZW1jcHlfdG9pbyBuZXdfbWVtY3B5X3RvaW8KKworI2luY2x1ZGUgImhkNjQ1N3guYyIKKworCitzdGF0aWMgdm9pZCBwY2kyMDBfc2V0X2lmYWNlKHBvcnRfdCAqcG9ydCkKK3sKKwljYXJkX3QgKmNhcmQgPSBwb3J0LT5jYXJkOworCXUxNiBtc2NpID0gZ2V0X21zY2kocG9ydCk7CisJdTggcnhzID0gcG9ydC0+cnhzICYgQ0xLX0JSR19NQVNLOworCXU4IHR4cyA9IHBvcnQtPnR4cyAmIENMS19CUkdfTUFTSzsKKworCXNjYV9vdXQoRVhTX1RFUzEsIChwaHlfbm9kZShwb3J0KSA/IE1TQ0kxX09GRlNFVCA6IE1TQ0kwX09GRlNFVCkgKyBFWFMsCisJCXBvcnRfdG9fY2FyZChwb3J0KSk7CisJc3dpdGNoKHBvcnQtPnNldHRpbmdzLmNsb2NrX3R5cGUpIHsKKwljYXNlIENMT0NLX0lOVDoKKwkJcnhzIHw9IENMS19CUkc7IC8qIEJSRyBvdXRwdXQgKi8KKwkJdHhzIHw9IENMS19QSU5fT1VUIHwgQ0xLX1RYX1JYQ0xLOyAvKiBSWCBjbG9jayAqLworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfVFhJTlQ6CisJCXJ4cyB8PSBDTEtfTElORTsgLyogUlhDIGlucHV0ICovCisJCXR4cyB8PSBDTEtfUElOX09VVCB8IENMS19CUkc7IC8qIEJSRyBvdXRwdXQgKi8KKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX1RYRlJPTVJYOgorCQlyeHMgfD0gQ0xLX0xJTkU7IC8qIFJYQyBpbnB1dCAqLworCQl0eHMgfD0gQ0xLX1BJTl9PVVQgfCBDTEtfVFhfUlhDTEs7IC8qIFJYIGNsb2NrICovCisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8qIEVYVGVybmFsIGNsb2NrICovCisJCXJ4cyB8PSBDTEtfTElORTsgLyogUlhDIGlucHV0ICovCisJCXR4cyB8PSBDTEtfUElOX09VVCB8IENMS19MSU5FOyAvKiBUWEMgaW5wdXQgKi8KKwkJYnJlYWs7CisJfQorCisJcG9ydC0+cnhzID0gcnhzOworCXBvcnQtPnR4cyA9IHR4czsKKwlzY2Ffb3V0KHJ4cywgbXNjaSArIFJYUywgY2FyZCk7CisJc2NhX291dCh0eHMsIG1zY2kgKyBUWFMsIGNhcmQpOworCXNjYV9zZXRfcG9ydChwb3J0KTsKK30KKworCisKK3N0YXRpYyBpbnQgcGNpMjAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCisJaW50IHJlc3VsdCA9IGhkbGNfb3BlbihkZXYpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwlzY2Ffb3BlbihkZXYpOworCXBjaTIwMF9zZXRfaWZhY2UocG9ydCk7CisJc2NhX2ZsdXNoKHBvcnRfdG9fY2FyZChwb3J0KSk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IHBjaTIwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNjYV9jbG9zZShkZXYpOworCXNjYV9mbHVzaChwb3J0X3RvX2NhcmQoZGV2X3RvX3BvcnQoZGV2KSkpOworCWhkbGNfY2xvc2UoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgcGNpMjAwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKHN5bmNfc2VyaWFsX3NldHRpbmdzKTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBuZXdfbGluZTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBfX3VzZXIgKmxpbmUgPSBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jOworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisKKyNpZmRlZiBERUJVR19SSU5HUworCWlmIChjbWQgPT0gU0lPQ0RFVlBSSVZBVEUpIHsKKwkJc2NhX2R1bXBfcmluZ3MoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJaWYgKGNtZCAhPSBTSU9DV0FOREVWKQorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKworCXN3aXRjaChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9HRVRfSUZBQ0U6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9WMzU7CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGxpbmUsICZwb3J0LT5zZXR0aW5ncywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX0lGQUNFX1YzNToKKwljYXNlIElGX0lGQUNFX1NZTkNfU0VSSUFMOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X2xpbmUsIGxpbmUsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfRVhUICYmCisJCSAgICBuZXdfbGluZS5jbG9ja190eXBlICE9IENMT0NLX1RYRlJPTVJYICYmCisJCSAgICBuZXdfbGluZS5jbG9ja190eXBlICE9IENMT0NLX0lOVCAmJgorCQkgICAgbmV3X2xpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19UWElOVCkKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIE5vIHN1Y2ggY2xvY2sgc2V0dGluZyAqLworCisJCWlmIChuZXdfbGluZS5sb29wYmFjayAhPSAwICYmIG5ld19saW5lLmxvb3BiYWNrICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQltZW1jcHkoJnBvcnQtPnNldHRpbmdzLCAmbmV3X2xpbmUsIHNpemUpOyAvKiBVcGRhdGUgc2V0dGluZ3MgKi8KKwkJcGNpMjAwX3NldF9pZmFjZShwb3J0KTsKKwkJc2NhX2ZsdXNoKHBvcnRfdG9fY2FyZChwb3J0KSk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJfQorfQorCisKKworc3RhdGljIHZvaWQgcGNpMjAwX3BjaV9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCBpOworCWNhcmRfdCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZvcihpID0gMDsgaSA8IDI7IGkrKykKKwkJaWYgKGNhcmQtPnBvcnRzW2ldLmNhcmQpIHsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0X3RvX2RldigmY2FyZC0+cG9ydHNbaV0pOworCQkJdW5yZWdpc3Rlcl9oZGxjX2RldmljZShkZXYpOworCQl9CisKKwlpZiAoY2FyZC0+aXJxKQorCQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworCisJaWYgKGNhcmQtPnJhbWJhc2UpCisJCWlvdW5tYXAoY2FyZC0+cmFtYmFzZSk7CisJaWYgKGNhcmQtPnNjYWJhc2UpCisJCWlvdW5tYXAoY2FyZC0+c2NhYmFzZSk7CisJaWYgKGNhcmQtPnBseGJhc2UpCisJCWlvdW5tYXAoY2FyZC0+cGx4YmFzZSk7CisKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJaWYgKGNhcmQtPnBvcnRzWzBdLmRldikKKwkJZnJlZV9uZXRkZXYoY2FyZC0+cG9ydHNbMF0uZGV2KTsKKwlpZiAoY2FyZC0+cG9ydHNbMV0uZGV2KQorCQlmcmVlX25ldGRldihjYXJkLT5wb3J0c1sxXS5kZXYpOworCWtmcmVlKGNhcmQpOworfQorCisKKworc3RhdGljIGludCBfX2RldmluaXQgcGNpMjAwX3BjaV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJY2FyZF90ICpjYXJkOworCXU4IHJldl9pZDsKKwl1MzIgX19pb21lbSAqcDsKKwlpbnQgaTsKKwl1MzIgcmFtc2l6ZTsKKwl1MzIgcmFtcGh5czsJCS8qIGJ1ZmZlciBtZW1vcnkgYmFzZSAqLworCXUzMiBzY2FwaHlzOwkJLyogU0NBIG1lbW9yeSBiYXNlICovCisJdTMyIHBseHBoeXM7CQkvKiBQTFggcmVnaXN0ZXJzIG1lbW9yeSBiYXNlICovCisKKyNpZm5kZWYgTU9EVUxFCisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHZlcnNpb24pOworI2VuZGlmCisKKwlpID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCisJaSA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgIlBDSTIwMFNZTiIpOworCWlmIChpKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcmV0dXJuIGk7CisJfQorCisJY2FyZCA9IGttYWxsb2Moc2l6ZW9mKGNhcmRfdCksIEdGUF9LRVJORUwpOworCWlmIChjYXJkID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwY2kyMDBzeW46IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisJbWVtc2V0KGNhcmQsIDAsIHNpemVvZihjYXJkX3QpKTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CisJY2FyZC0+cG9ydHNbMF0uZGV2ID0gYWxsb2NfaGRsY2RldigmY2FyZC0+cG9ydHNbMF0pOworCWNhcmQtPnBvcnRzWzFdLmRldiA9IGFsbG9jX2hkbGNkZXYoJmNhcmQtPnBvcnRzWzFdKTsKKwlpZiAoIWNhcmQtPnBvcnRzWzBdLmRldiB8fCAhY2FyZC0+cG9ydHNbMV0uZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAicGNpMjAwc3luOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcGNpMjAwX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZyZXZfaWQpOworCWlmIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApICE9IFBDSTIwMFNZTl9QTFhfU0laRSB8fAorCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpICE9IFBDSTIwMFNZTl9TQ0FfU0laRSB8fAorCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDMpIDwgMTYzODQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwY2kyMDBzeW46IGludmFsaWQgY2FyZCBFRVBST00gcGFyYW1ldGVyc1xuIik7CisJCXBjaTIwMF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcGx4cGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDApICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwljYXJkLT5wbHhiYXNlID0gaW9yZW1hcChwbHhwaHlzLCBQQ0kyMDBTWU5fUExYX1NJWkUpOworCisJc2NhcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDIpICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwljYXJkLT5zY2FiYXNlID0gaW9yZW1hcChzY2FwaHlzLCBQQ0kyMDBTWU5fU0NBX1NJWkUpOworCisJcmFtcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDMpICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwljYXJkLT5yYW1iYXNlID0gaW9yZW1hcChyYW1waHlzLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsMykpOworCisJaWYgKGNhcmQtPnBseGJhc2UgPT0gTlVMTCB8fAorCSAgICBjYXJkLT5zY2FiYXNlID09IE5VTEwgfHwKKwkgICAgY2FyZC0+cmFtYmFzZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAicGNpMjAwc3luOiBpb3JlbWFwKCkgZmFpbGVkXG4iKTsKKwkJcGNpMjAwX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCX0KKworCS8qIFJlc2V0IFBMWCAqLworCXAgPSAmY2FyZC0+cGx4YmFzZS0+aW5pdF9jdHJsOworCXdyaXRlbChyZWFkbChwKSB8IDB4NDAwMDAwMDAsIHApOworCXJlYWRsKHApOwkJLyogRmx1c2ggdGhlIHdyaXRlIC0gZG8gbm90IHVzZSBzY2FfZmx1c2ggKi8KKwl1ZGVsYXkoMSk7CisKKwl3cml0ZWwocmVhZGwocCkgJiB+MHg0MDAwMDAwMCwgcCk7CisJcmVhZGwocCk7CQkvKiBGbHVzaCB0aGUgd3JpdGUgLSBkbyBub3QgdXNlIHNjYV9mbHVzaCAqLworCXVkZWxheSgxKTsKKworCXJhbXNpemUgPSBzY2FfZGV0ZWN0X3JhbShjYXJkLCBjYXJkLT5yYW1iYXNlLAorCQkJCSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDMpKTsKKworCS8qIG51bWJlciBvZiBUWCArIFJYIGJ1ZmZlcnMgZm9yIG9uZSBwb3J0IC0gdGhpcyBpcyBkdWFsIHBvcnQgY2FyZCAqLworCWkgPSByYW1zaXplIC8gKDIgKiAoc2l6ZW9mKHBrdF9kZXNjKSArIEhETENfTUFYX01SVSkpOworCWNhcmQtPnR4X3JpbmdfYnVmZmVycyA9IG1pbihpIC8gMiwgTUFYX1RYX0JVRkZFUlMpOworCWNhcmQtPnJ4X3JpbmdfYnVmZmVycyA9IGkgLSBjYXJkLT50eF9yaW5nX2J1ZmZlcnM7CisKKwljYXJkLT5idWZmX29mZnNldCA9IDIgKiBzaXplb2YocGt0X2Rlc2MpICogKGNhcmQtPnR4X3JpbmdfYnVmZmVycyArCisJCQkJCQkgICAgY2FyZC0+cnhfcmluZ19idWZmZXJzKTsKKworCXByaW50ayhLRVJOX0lORk8gInBjaTIwMHN5bjogJXUgS0IgUkFNIGF0IDB4JXgsIElSUSV1LCB1c2luZyAldSBUWCArIgorCSAgICAgICAiICV1IFJYIHBhY2tldHMgcmluZ3NcbiIsIHJhbXNpemUgLyAxMDI0LCByYW1waHlzLAorCSAgICAgICBwZGV2LT5pcnEsIGNhcmQtPnR4X3JpbmdfYnVmZmVycywgY2FyZC0+cnhfcmluZ19idWZmZXJzKTsKKworCWlmIChjYXJkLT50eF9yaW5nX2J1ZmZlcnMgPCAxKSB7CisJCXByaW50ayhLRVJOX0VSUiAicGNpMjAwc3luOiBSQU0gdGVzdCBmYWlsZWRcbiIpOworCQlwY2kyMDBfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBQQ0kgYnJpZGdlICovCisJcCA9ICZjYXJkLT5wbHhiYXNlLT5pbnRyX2N0cmxfc3RhdDsKKwl3cml0ZXcocmVhZHcocCkgfCAweDAwNDAsIHApOworCisJLyogQWxsb2NhdGUgSVJRICovCisJaWYocmVxdWVzdF9pcnEocGRldi0+aXJxLCBzY2FfaW50ciwgU0FfU0hJUlEsIGRldm5hbWUsIGNhcmQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBjaTIwMHN5bjogY291bGQgbm90IGFsbG9jYXRlIElSUSVkLlxuIiwKKwkJICAgICAgIHBkZXYtPmlycSk7CisJCXBjaTIwMF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY2FyZC0+aXJxID0gcGRldi0+aXJxOworCisJc2NhX2luaXQoY2FyZCwgMCk7CisKKwlmb3IoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJcG9ydF90ICpwb3J0ID0gJmNhcmQtPnBvcnRzW2ldOworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydF90b19kZXYocG9ydCk7CisJCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwkJcG9ydC0+cGh5X25vZGUgPSBpOworCisJCXNwaW5fbG9ja19pbml0KCZwb3J0LT5sb2NrKTsKKwkJU0VUX01PRFVMRV9PV05FUihkZXYpOworCQlkZXYtPmlycSA9IGNhcmQtPmlycTsKKwkJZGV2LT5tZW1fc3RhcnQgPSByYW1waHlzOworCQlkZXYtPm1lbV9lbmQgPSByYW1waHlzICsgcmFtc2l6ZSAtIDE7CisJCWRldi0+dHhfcXVldWVfbGVuID0gNTA7CisJCWRldi0+ZG9faW9jdGwgPSBwY2kyMDBfaW9jdGw7CisJCWRldi0+b3BlbiA9IHBjaTIwMF9vcGVuOworCQlkZXYtPnN0b3AgPSBwY2kyMDBfY2xvc2U7CisJCWhkbGMtPmF0dGFjaCA9IHNjYV9hdHRhY2g7CisJCWhkbGMtPnhtaXQgPSBzY2FfeG1pdDsKKwkJcG9ydC0+c2V0dGluZ3MuY2xvY2tfdHlwZSA9IENMT0NLX0VYVDsKKwkJcG9ydC0+Y2FyZCA9IGNhcmQ7CisJCWlmKHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAicGNpMjAwc3luOiB1bmFibGUgdG8gcmVnaXN0ZXIgaGRsYyAiCisJCQkgICAgICAgImRldmljZVxuIik7CisJCQlwb3J0LT5jYXJkID0gTlVMTDsKKwkJCXBjaTIwMF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlzY2FfaW5pdF9zeW5jX3BvcnQocG9ydCk7CS8qIFNldCB1cCBTQ0EgbWVtb3J5ICovCisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBDSTIwMFNZTiBub2RlICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBwb3J0LT5waHlfbm9kZSk7CisJfQorCisJc2NhX2ZsdXNoKGNhcmQpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaTIwMF9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfR09SQU1PLCBQQ0lfREVWSUNFX0lEX1BDSTIwMFNZTiwgUENJX0FOWV9JRCwKKwkgIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDAsIH0KK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBjaTIwMF9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJQQ0kyMDBTWU4iLAorCS5pZF90YWJsZQk9IHBjaTIwMF9wY2lfdGJsLAorCS5wcm9iZQkJPSBwY2kyMDBfcGNpX2luaXRfb25lLAorCS5yZW1vdmUJCT0gcGNpMjAwX3BjaV9yZW1vdmVfb25lLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBwY2kyMDBfaW5pdF9tb2R1bGUodm9pZCkKK3sKKyNpZmRlZiBNT0RVTEUKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CisjZW5kaWYKKwlpZiAocGNpX2Nsb2NrX2ZyZXEgPCAxMDAwMDAwIHx8IHBjaV9jbG9ja19mcmVxID4gODAwMDAwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwY2kyMDBzeW46IEludmFsaWQgUENJIGNsb2NrIGZyZXF1ZW5jeVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZwY2kyMDBfcGNpX2RyaXZlcik7Cit9CisKKworCitzdGF0aWMgdm9pZCBfX2V4aXQgcGNpMjAwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwY2kyMDBfcGNpX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIktyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdvcmFtbyBQQ0kyMDBTWU4gc2VyaWFsIHBvcnQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNpMjAwX3BjaV90YmwpOworbW9kdWxlX3BhcmFtKHBjaV9jbG9ja19mcmVxLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhwY2lfY2xvY2tfZnJlcSwgIlN5c3RlbSBQQ0kgY2xvY2sgZnJlcXVlbmN5IGluIEh6Iik7Cittb2R1bGVfaW5pdChwY2kyMDBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocGNpMjAwX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmMgYi9kcml2ZXJzL25ldC93YW4vc2JuaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMmM3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vc2JuaS5jCkBAIC0wLDAgKzEsMTczNSBAQAorLyogc2JuaS5jOiAgR3JhbmNoIFNCTkkxMiBsZWFzZWQgbGluZSBhZGFwdGVycyBkcml2ZXIgZm9yIGxpbnV4CisgKgorICoJV3JpdHRlbiAyMDAxIGJ5IERlbmlzIEkuVGltb2ZlZXYgKHRpbW9mZWV2QGdyYW5jaC5ydSkKKyAqCisgKglQcmV2aW91cyB2ZXJzaW9ucyB3ZXJlIHdyaXR0ZW4gYnkgWWFyb3NsYXYgUG9seWFrb3YsCisgKglBbGV4ZXkgWnZlcmV2IGFuZCBNYXggS2hvbi4KKyAqCisgKglEcml2ZXIgc3VwcG9ydHMgU0JOSTEyLTAyLC0wNCwtMDUsLTEwLC0xMSBjYXJkcywgc2luZ2xlIGFuZAorICoJZG91YmxlLWNoYW5uZWwsIFBDSSBhbmQgSVNBIG1vZGlmaWNhdGlvbnMuCisgKglNb3JlIGluZm8gYW5kIHVzZWZ1bCB1dGlsaXRpZXMgdG8gd29yayB3aXRoIFNCTkkxMiBjYXJkcyB5b3UgY2FuIGZpbmQKKyAqCWF0IGh0dHA6Ly93d3cuZ3JhbmNoLmNvbSAoRW5nbGlzaCkgb3IgaHR0cDovL3d3dy5ncmFuY2gucnUgKFJ1c3NpYW4pCisgKgorICoJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICoJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqCisgKiAgNS4wLjEJSnVuIDIyIDIwMDEKKyAqCSAgLSBGaXhlZCBidWcgaW4gcHJvYmUKKyAqICA1LjAuMAlKdW4gMDYgMjAwMQorICoJICAtIERyaXZlciB3YXMgY29tcGxldGVseSByZWRlc2lnbmVkIGJ5IERlbmlzIEkuVGltb2ZlZXYsCisgKgkgIC0gbm93IFBDSS9EdWFsLCBJU0EvRHVhbCAod2l0aCBzaW5nbGUgaW50ZXJydXB0IGxpbmUpIG1vZGVscyBhcmUKKyAqCSAgLSBzdXBwb3J0ZWQKKyAqICAzLjMuMAlUaHUgRmViIDI0IDIxOjMwOjI4IE5PVlQgMjAwMCAKKyAqICAgICAgICAtIFBDSSBjYXJkcyBzdXBwb3J0CisgKiAgMy4yLjAJTW9uIERlYyAxMyAyMjoyNjo1MyBOT1ZUIDE5OTkKKyAqIAkgIC0gQ29tcGxldGVseSByZWJ1aWx0IGFsbCB0aGUgcGFja2V0IHN0b3JhZ2Ugc3lzdGVtCisgKiAJICAtICAgIHRvIHdvcmsgaW4gRXRoZXJuZXQtbGlrZSBzdHlsZS4KKyAqICAzLjEuMQlqdXN0IGZpeGVkIHNvbWUgYnVncyAoNSBhdWcgMTk5OSkKKyAqICAzLjEuMAlhZGRlZCBiYWxhbmNpbmcgZmVhdHVyZQkoMjYgYXByIDE5OTkpCisgKiAgMy4wLjEJanVzdCBmaXhlZCBzb21lIGJ1Z3MgKDE0IGFwciAxOTk5KS4KKyAqICAzLjAuMAlJbml0aWFsIFJldmlzaW9uLCBZYXJvc2xhdiBQb2x5YWtvdiAoMjQgRmViIDE5OTkpCisgKiAgICAgICAgLSBhZGRlZCBwcmUtY2FsY3VsYXRpb24gZm9yIENSQywgZml4ZWQgYnVnIHdpdGggImxlbi0yIiBmcmFtZXMsIAorICogICAgICAgIC0gcmVtb3ZlZCBvdXRib3VuZCBmcmFnbWVudGF0aW9uIChNVFU9MTAwMCksIHdyaXR0ZW4gQ1JDLWNhbGN1bGF0aW9uIAorICogICAgICAgIC0gb24gYXNtLCBhZGRlZCB3b3JrIHdpdGggaGFyZF9oZWFkZXJzIGFuZCBub3cgd2UgaGF2ZSBvdXIgb3duIGNhY2hlIAorICogICAgICAgIC0gZm9yIHRoZW0sIG9wdGlvbmFsbHkgc3VwcG9ydGVkIHdvcmQtaW50ZXJjaGFuZ2Ugb24gc29tZSBjaGlwc2V0cywKKyAqIAorICoJS25vd24gcHJvYmxlbTogdGhpcyBkcml2ZXIgd2Fzbid0IHRlc3RlZCBvbiBtdWx0aXByb2Nlc3NvciBtYWNoaW5lLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPG5ldC9hcnAuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInNibmkuaCIKKworLyogZGV2aWNlIHByaXZhdGUgZGF0YSAqLworCitzdHJ1Y3QgbmV0X2xvY2FsIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl3YXRjaGRvZzsKKworCXNwaW5sb2NrX3QJbG9jazsKKwlzdHJ1Y3Qgc2tfYnVmZiAgKnJ4X2J1Zl9wOwkJLyogcmVjZWl2ZSBidWZmZXIgcHRyICovCisJc3RydWN0IHNrX2J1ZmYgICp0eF9idWZfcDsJCS8qIHRyYW5zbWl0IGJ1ZmZlciBwdHIgKi8KKwkKKwl1bnNpZ25lZCBpbnQJZnJhbWVsZW47CQkvKiBjdXJyZW50IGZyYW1lIGxlbmd0aCAqLworCXVuc2lnbmVkIGludAltYXhmcmFtZTsJCS8qIG1heGltdW0gdmFsaWQgZnJhbWUgbGVuZ3RoICovCisJdW5zaWduZWQgaW50CXN0YXRlOworCXVuc2lnbmVkIGludAlpbnBwb3MsIG91dHBvczsJCS8qIHBvc2l0aW9ucyBpbiByeC90eCBidWZmZXJzICovCisKKwkvKiB0cmFuc21pdHRpbmcgZnJhbWUgbnVtYmVyIC0gZnJvbSBmcmFtZXMgcXR5IHRvIDEgKi8KKwl1bnNpZ25lZCBpbnQJdHhfZnJhbWVubzsKKworCS8qIGV4cGVjdGVkIG51bWJlciBvZiBuZXh0IHJlY2VpdmluZyBmcmFtZSAqLworCXVuc2lnbmVkIGludAl3YWl0X2ZyYW1lbm87CisKKwkvKiBjb3VudCBvZiBmYWlsZWQgYXR0ZW1wdHMgdG8gZnJhbWUgc2VuZCAtIDMyIGF0dGVtcHRzIGRvIGJlZm9yZQorCSAgIGVycm9yIC0gd2hpbGUgcmVjZWl2ZXIgdHVuZXMgb24gb3Bwb3NpdGUgc2lkZSBvZiB3aXJlICovCisJdW5zaWduZWQgaW50CXRyYW5zX2Vycm9yczsKKworCS8qIGlkbGUgdGltZTsgc2VuZCBwb25nIHdoZW4gbGltaXQgZXhjZWVkZWQgKi8KKwl1bnNpZ25lZCBpbnQJdGltZXJfdGlja3M7CisKKwkvKiBmaWVsZHMgdXNlZCBmb3IgcmVjZWl2ZSBsZXZlbCBhdXRvc2VsZWN0aW9uICovCisJaW50CWRlbHRhX3J4bDsKKwl1bnNpZ25lZCBpbnQJY3VyX3J4bF9pbmRleCwgdGltZW91dF9yeGw7CisJdW5zaWduZWQgbG9uZwljdXJfcnhsX3JjdmQsIHByZXZfcnhsX3JjdmQ7CisKKwlzdHJ1Y3Qgc2JuaV9jc3IxCWNzcjE7CQkvKiBjdXJyZW50IHZhbHVlIG9mIENTUjEgKi8KKwlzdHJ1Y3Qgc2JuaV9pbl9zdGF0cwlpbl9zdGF0czsgCS8qIGludGVybmFsIHN0YXRpc3RpY3MgKi8gCisKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKnNlY29uZDsJLyogZm9yIElTQS9kdWFsIGNhcmRzICovCisKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKm1hc3RlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKmxpbms7CisjZW5kaWYKK307CisKKworc3RhdGljIGludCAgc2JuaV9jYXJkX3Byb2JlKCB1bnNpZ25lZCBsb25nICk7CitzdGF0aWMgaW50ICBzYm5pX3BjaV9wcm9iZSggc3RydWN0IG5ldF9kZXZpY2UgICogKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAgKnNibmlfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcsIGludCk7CitzdGF0aWMgaW50ICBzYm5pX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQgIHNibmlfY2xvc2UoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQgIHNibmlfc3RhcnRfeG1pdCggc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludCAgc2JuaV9pb2N0bCggc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCApOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICAqc2JuaV9nZXRfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkICBzZXRfbXVsdGljYXN0X2xpc3QoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKKworc3RhdGljIGlycXJldHVybl90IHNibmlfaW50ZXJydXB0KCBpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiApOworc3RhdGljIHZvaWQgIGhhbmRsZV9jaGFubmVsKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgaW50ICAgcmVjdl9mcmFtZSggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQgIHNlbmRfZnJhbWUoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQgICB1cGxvYWRfZGF0YSggc3RydWN0IG5ldF9kZXZpY2UgKiwKKwkJCSAgdW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCwgdTMyICk7CitzdGF0aWMgdm9pZCAgZG93bmxvYWRfZGF0YSggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTMyICogKTsKK3N0YXRpYyB2b2lkICBzYm5pX3dhdGNoZG9nKCB1bnNpZ25lZCBsb25nICk7CitzdGF0aWMgdm9pZCAgaW50ZXJwcmV0X2Fjayggc3RydWN0IG5ldF9kZXZpY2UgKiwgdW5zaWduZWQgKTsKK3N0YXRpYyBpbnQgICBhcHBlbmRfZnJhbWVfdG9fcGt0KCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCwgdTMyICk7CitzdGF0aWMgdm9pZCAgaW5kaWNhdGVfcGt0KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZCAgY2FyZF9zdGFydCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQgIHByZXBhcmVfdG9fc2VuZCggc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQgIGRyb3BfeG1pdF9xdWV1ZSggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQgIHNlbmRfZnJhbWVfaGVhZGVyKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIgKiApOworc3RhdGljIGludCAgIHNraXBfdGFpbCggdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHUzMiApOworc3RhdGljIGludCAgIGNoZWNrX2ZoZHIoIHUzMiwgdTMyICosIHUzMiAqLCB1MzIgKiwgdTMyICosIHUzMiAqICk7CitzdGF0aWMgdm9pZCAgY2hhbmdlX2xldmVsKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZCAgdGltZW91dF9jaGFuZ2VfbGV2ZWwoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB1MzIgICBjYWxjX2NyYzMyKCB1MzIsIHU4ICosIHUzMiApOworc3RhdGljIHN0cnVjdCBza19idWZmICogIGdldF9yeF9idWYoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQgIHNibmlfaW5pdCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCitzdGF0aWMgaW50ICBlbnNsYXZlKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgaW50ICBlbWFuY2lwYXRlKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CisjZW5kaWYKKworI2lmZGVmIF9faTM4Nl9fCisjZGVmaW5lIEFTTV9DUkMgMQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICB2ZXJzaW9uW10gPQorCSJHcmFuY2ggU0JOSTEyIGRyaXZlciB2ZXIgNS4wLjEgIEp1biAyMiAyMDAxICBEZW5pcyBJLlRpbW9mZWV2LlxuIjsKKworc3RhdGljIGludCAgc2tpcF9wY2lfcHJvYmUJX19pbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50ICBzY2FuZG9uZQlfX2luaXRkYXRhID0gMDsKK3N0YXRpYyBpbnQgIG51bQkJX19pbml0ZGF0YSA9IDA7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICByeGxfdGFiW107CitzdGF0aWMgdTMyICBjcmMzMnRhYltdOworCisvKiBBIGxpc3Qgb2YgYWxsIGluc3RhbGxlZCBkZXZpY2VzLCBmb3IgcmVtb3ZpbmcgdGhlIGRyaXZlciBtb2R1bGUuICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgICpzYm5pX2NhcmRzWyBTQk5JX01BWF9OVU1fQ0FSRFMgXTsKKworLyogTGlzdHMgb2YgZGV2aWNlJ3MgcGFyYW1ldGVycyAqLworc3RhdGljIHUzMglpb1sgICBTQk5JX01BWF9OVU1fQ0FSRFMgXSBfX2luaXRkYXRhID0KKwl7IFswIC4uLiBTQk5JX01BWF9OVU1fQ0FSRFMtMV0gPSAtMSB9Oworc3RhdGljIHUzMglpcnFbICBTQk5JX01BWF9OVU1fQ0FSRFMgXSBfX2luaXRkYXRhOworc3RhdGljIHUzMgliYXVkWyBTQk5JX01BWF9OVU1fQ0FSRFMgXSBfX2luaXRkYXRhOworc3RhdGljIHUzMglyeGxbICBTQk5JX01BWF9OVU1fQ0FSRFMgXSBfX2luaXRkYXRhID0KKwl7IFswIC4uLiBTQk5JX01BWF9OVU1fQ0FSRFMtMV0gPSAtMSB9Oworc3RhdGljIHUzMgltYWNbICBTQk5JX01BWF9OVU1fQ0FSRFMgXSBfX2luaXRkYXRhOworCisjaWZuZGVmIE1PRFVMRQordHlwZWRlZiB1MzIgIGlhcnJbXTsKK3N0YXRpYyBpYXJyIF9faW5pdGRhdGEgKmRlc3RbNV0gPSB7ICZpbywgJmlycSwgJmJhdWQsICZyeGwsICZtYWMgfTsKKyNlbmRpZgorCisvKiBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIEkvTyBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkIG9uIElTQSBidXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgIG5ldGNhcmRfcG9ydGxpc3RbIF0gX19pbml0ZGF0YSA9IHsgCisJMHgyMTAsIDB4MjE0LCAweDIyMCwgMHgyMjQsIDB4MjMwLCAweDIzNCwgMHgyNDAsIDB4MjQ0LCAweDI1MCwgMHgyNTQsCisJMHgyNjAsIDB4MjY0LCAweDI3MCwgMHgyNzQsIDB4MjgwLCAweDI4NCwgMHgyOTAsIDB4Mjk0LCAweDJhMCwgMHgyYTQsCisJMHgyYjAsIDB4MmI0LCAweDJjMCwgMHgyYzQsIDB4MmQwLCAweDJkNCwgMHgyZTAsIDB4MmU0LCAweDJmMCwgMHgyZjQsCisJMCB9OworCisKKy8qCisgKiBMb29rIGZvciBTQk5JIGNhcmQgd2hpY2ggYWRkciBzdG9yZWQgaW4gZGV2LT5iYXNlX2FkZHIsIGlmIG5vbnplcm8uCisgKiBPdGhlcndpc2UsIGxvb2sgdGhyb3VnaCBQQ0kgYnVzLiBJZiBub25lIFBDSS1jYXJkIHdhcyBmb3VuZCwgc2NhbiBJU0EuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgX19pbml0CitzYm5pX2lzYV9wcm9iZSggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCWlmKCBkZXYtPmJhc2VfYWRkciA+IDB4MWZmCisJICAgICYmICByZXF1ZXN0X3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIFNCTklfSU9fRVhURU5ULCBkZXYtPm5hbWUgKQorCSAgICAmJiAgc2JuaV9wcm9iZTEoIGRldiwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxICkgKQorCisJCXJldHVybiAgMDsKKwllbHNlIHsKKwkJcHJpbnRrKCBLRVJOX0VSUiAic2JuaTogYmFzZSBhZGRyZXNzIDB4JWx4IGlzIGJ1c3ksIG9yIGFkYXB0ZXIgIgorCQkJImlzIG1hbGZ1bmN0aW9uYWwhXG4iLCBkZXYtPmJhc2VfYWRkciApOworCQlyZXR1cm4gIC1FTk9ERVY7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc2JuaV9kZXZzZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWV0aGVyX3NldHVwKCBkZXYgKTsKKwlkZXYtPm9wZW4JCT0gJnNibmlfb3BlbjsKKwlkZXYtPnN0b3AJCT0gJnNibmlfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSAmc2JuaV9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzCQk9ICZzYm5pX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdAk9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5kb19pb2N0bAkJPSAmc2JuaV9pb2N0bDsKKworCVNFVF9NT0RVTEVfT1dORVIoIGRldiApOworfQorCitpbnQgX19pbml0IHNibmlfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdGF0aWMgdW5zaWduZWQgIHZlcnNpb25fcHJpbnRlZCBfX2luaXRkYXRhID0gMDsKKwlpbnQgZXJyOworCisJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSwgInNibmkiLCBzYm5pX2RldnNldHVwKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgInNibmklZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwllcnIgPSBzYm5pX2luaXQoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlyZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIFNCTklfSU9fRVhURU5UICk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBlcnI7CisJfQorCWlmKCB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwICkKKwkJcHJpbnRrKCBLRVJOX0lORk8gIiVzIiwgdmVyc2lvbiApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzYm5pX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgIGk7CisJaWYoIGRldi0+YmFzZV9hZGRyICkKKwkJcmV0dXJuICBzYm5pX2lzYV9wcm9iZSggZGV2ICk7CisJLyogb3RoZXJ3aXNlIHdlIGhhdmUgdG8gcGVyZm9ybSBzZWFyY2ggb3VyIGFkYXB0ZXIgKi8KKworCWlmKCBpb1sgbnVtIF0gIT0gLTEgKQorCQlkZXYtPmJhc2VfYWRkcgk9IGlvWyBudW0gXSwKKwkJZGV2LT5pcnEJPSBpcnFbIG51bSBdOworCWVsc2UgaWYoIHNjYW5kb25lICB8fCAgaW9bIDAgXSAhPSAtMSApCisJCXJldHVybiAgLUVOT0RFVjsKKworCS8qIGlmIGlvWyBudW0gXSBjb250YWlucyBub24temVybyBhZGRyZXNzLCB0aGVuIHRoYXQgaXMgb24gSVNBIGJ1cyAqLworCWlmKCBkZXYtPmJhc2VfYWRkciApCisJCXJldHVybiAgc2JuaV9pc2FfcHJvYmUoIGRldiApOworCisJLyogLi4ub3RoZXJ3aXNlIC0gc2NhbiBQQ0kgZmlyc3QgKi8KKwlpZiggIXNraXBfcGNpX3Byb2JlICAmJiAgIXNibmlfcGNpX3Byb2JlKCBkZXYgKSApCisJCXJldHVybiAgMDsKKworCWlmKCBpb1sgbnVtIF0gPT0gLTEgKSB7CisJCS8qIEF1dG8tc2NhbiB3aWxsIGJlIHN0b3BwZWQgd2hlbiBmaXJzdCBJU0EgY2FyZCB3ZXJlIGZvdW5kICovCisJCXNjYW5kb25lID0gMTsKKwkJaWYoIG51bSA+IDAgKQorCQkJcmV0dXJuICAtRU5PREVWOworCX0KKworCWZvciggaSA9IDA7ICBuZXRjYXJkX3BvcnRsaXN0WyBpIF07ICArK2kgKSB7CisJCWludCAgaW9hZGRyID0gbmV0Y2FyZF9wb3J0bGlzdFsgaSBdOworCQlpZiggcmVxdWVzdF9yZWdpb24oIGlvYWRkciwgU0JOSV9JT19FWFRFTlQsIGRldi0+bmFtZSApCisJCSAgICAmJiAgc2JuaV9wcm9iZTEoIGRldiwgaW9hZGRyLCAwICkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gIC1FTk9ERVY7Cit9CisKKworaW50IF9faW5pdAorc2JuaV9wY2lfcHJvYmUoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAgKnBkZXYgPSBOVUxMOworCisJd2hpbGUoIChwZGV2ID0gcGNpX2dldF9jbGFzcyggUENJX0NMQVNTX05FVFdPUktfT1RIRVIgPDwgOCwgcGRldiApKQorCSAgICAgICAhPSBOVUxMICkgeworCQlpbnQgIHBjaV9pcnFfbGluZTsKKwkJdW5zaWduZWQgbG9uZyAgcGNpX2lvYWRkcjsKKwkJdTE2ICBzdWJzeXM7CisKKwkJaWYoIHBkZXYtPnZlbmRvciAhPSBTQk5JX1BDSV9WRU5ET1IKKwkJICAgICYmICBwZGV2LT5kZXZpY2UgIT0gU0JOSV9QQ0lfREVWSUNFICkKKwkJCQljb250aW51ZTsKKworCQlwY2lfaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KCBwZGV2LCAwICk7CisJCXBjaV9pcnFfbGluZSA9IHBkZXYtPmlycTsKKworCQkvKiBBdm9pZCBhbHJlYWR5IGZvdW5kIGNhcmRzIGZyb20gcHJldmlvdXMgY2FsbHMgKi8KKwkJaWYoICFyZXF1ZXN0X3JlZ2lvbiggcGNpX2lvYWRkciwgU0JOSV9JT19FWFRFTlQsIGRldi0+bmFtZSApICkgeworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoIHBkZXYsIFBDSV9TVUJTWVNURU1fSUQsICZzdWJzeXMgKTsKKworCQkJaWYgKHN1YnN5cyAhPSAyKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBEdWFsIGFkYXB0ZXIgaXMgcHJlc2VudCAqLworCQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwY2lfaW9hZGRyICs9IDQsIFNCTklfSU9fRVhURU5ULAorCQkJCQkJCWRldi0+bmFtZSApICkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmKCBwY2lfaXJxX2xpbmUgPD0gMCAgfHwgIHBjaV9pcnFfbGluZSA+PSBOUl9JUlFTICkKKwkJCXByaW50ayggS0VSTl9XQVJOSU5HICIgIFdBUk5JTkc6IFRoZSBQQ0kgQklPUyBhc3NpZ25lZCAiCisJCQkJInRoaXMgUENJIGNhcmQgdG8gSVJRICVkLCB3aGljaCBpcyB1bmxpa2VseSAiCisJCQkJInRvIHdvcmshLlxuIgorCQkJCUtFUk5fV0FSTklORyAiIFlvdSBzaG91bGQgdXNlIHRoZSBQQ0kgQklPUyAiCisJCQkJInNldHVwIHRvIGFzc2lnbiBhIHZhbGlkIElSUSBsaW5lLlxuIiwKKwkJCQlwY2lfaXJxX2xpbmUgKTsKKworCQkvKiBhdm9pZGluZyByZS1lbmFibGUgZHVhbCBhZGFwdGVycyAqLworCQlpZiggKHBjaV9pb2FkZHIgJiA3KSA9PSAwICAmJiAgcGNpX2VuYWJsZV9kZXZpY2UoIHBkZXYgKSApIHsKKwkJCXJlbGVhc2VfcmVnaW9uKCBwY2lfaW9hZGRyLCBTQk5JX0lPX0VYVEVOVCApOworCQkJcGNpX2Rldl9wdXQoIHBkZXYgKTsKKwkJCXJldHVybiAgLUVJTzsKKwkJfQorCQlpZiggc2JuaV9wcm9iZTEoIGRldiwgcGNpX2lvYWRkciwgcGNpX2lycV9saW5lICkgKSB7CisJCQlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCQkJLyogbm90IHRoZSBiZXN0IHRoaW5nIHRvIGRvLCBidXQgdGhpcyBpcyBhbGwgbWVzc2VkIHVwIAorCQkJICAgZm9yIGhvdHBsdWcgc3lzdGVtcyBhbnl3YXkuLi4gKi8KKwkJCXBjaV9kZXZfcHV0KCBwZGV2ICk7CisJCQlyZXR1cm4gIDA7CisJCX0KKwl9CisJcmV0dXJuICAtRU5PREVWOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdAorc2JuaV9wcm9iZTEoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2LCAgdW5zaWduZWQgbG9uZyAgaW9hZGRyLCAgaW50ICBpcnEgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubDsKKworCWlmKCBzYm5pX2NhcmRfcHJvYmUoIGlvYWRkciApICkgeworCQlyZWxlYXNlX3JlZ2lvbiggaW9hZGRyLCBTQk5JX0lPX0VYVEVOVCApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlvdXRiKCAwLCBpb2FkZHIgKyBDU1IwICk7CisKKwlpZiggaXJxIDwgMiApIHsKKwkJdW5zaWduZWQgbG9uZyBpcnFfbWFzazsKKworCQlpcnFfbWFzayA9IHByb2JlX2lycV9vbigpOworCQlvdXRiKCBFTl9JTlQgfCBUUl9SRVEsIGlvYWRkciArIENTUjAgKTsKKwkJb3V0YiggUFJfUkVTLCBpb2FkZHIgKyBDU1IxICk7CisJCW1kZWxheSg1MCk7CisJCWlycSA9IHByb2JlX2lycV9vZmYoaXJxX21hc2spOworCQlvdXRiKCAwLCBpb2FkZHIgKyBDU1IwICk7CisKKwkJaWYoICFpcnEgKSB7CisJCQlwcmludGsoIEtFUk5fRVJSICIlczogY2FuJ3QgZGV0ZWN0IGRldmljZSBpcnEhXG4iLAorCQkJCWRldi0+bmFtZSApOworCQkJcmVsZWFzZV9yZWdpb24oIGlvYWRkciwgU0JOSV9JT19FWFRFTlQgKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfSBlbHNlIGlmKCBpcnEgPT0gMiApCisJCWlycSA9IDk7CisKKwlkZXYtPmlycSA9IGlycTsKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworCS8qIEFsbG9jYXRlIGRldi0+cHJpdiBhbmQgZmlsbCBpbiBzYm5pLXNwZWNpZmljIGRldiBmaWVsZHMuICovCisJbmwgPSBkZXYtPnByaXY7CisJaWYoICFubCApIHsKKwkJcHJpbnRrKCBLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgbWVtb3J5IVxuIiwgZGV2LT5uYW1lICk7CisJCXJlbGVhc2VfcmVnaW9uKCBpb2FkZHIsIFNCTklfSU9fRVhURU5UICk7CisJCXJldHVybiBOVUxMOworCX0KKworCWRldi0+cHJpdiA9IG5sOworCW1lbXNldCggbmwsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSApOworCXNwaW5fbG9ja19pbml0KCAmbmwtPmxvY2sgKTsKKworCS8qIHN0b3JlIE1BQyBhZGRyZXNzIChnZW5lcmF0ZSBpZiB0aGF0IGlzbid0IGtub3duKSAqLworCSoodTE2ICopZGV2LT5kZXZfYWRkciA9IGh0b25zKCAweDAwZmYgKTsKKwkqKHUzMiAqKShkZXYtPmRldl9hZGRyICsgMikgPSBodG9ubCggMHgwMTAwMDAwMCB8CisJCSggKG1hY1tudW1dICA/ICBtYWNbbnVtXSAgOiAgKHUzMikoKGxvbmcpZGV2LT5wcml2KSkgJiAweDAwZmZmZmZmKSApOworCisJLyogc3RvcmUgbGluayBzZXR0aW5ncyAoc3BlZWQsIHJlY2VpdmUgbGV2ZWwgKSAqLworCW5sLT5tYXhmcmFtZSAgPSBERUZBVUxUX0ZSQU1FX0xFTjsKKwlubC0+Y3NyMS5yYXRlID0gYmF1ZFsgbnVtIF07CisKKwlpZiggKG5sLT5jdXJfcnhsX2luZGV4ID0gcnhsWyBudW0gXSkgPT0gLTEgKQorCQkvKiBhdXRvdHVuZSByeGwgKi8KKwkJbmwtPmN1cl9yeGxfaW5kZXggPSBERUZfUlhMLAorCQlubC0+ZGVsdGFfcnhsID0gREVGX1JYTF9ERUxUQTsKKwllbHNlCisJCW5sLT5kZWx0YV9yeGwgPSAwOworCW5sLT5jc3IxLnJ4bCAgPSByeGxfdGFiWyBubC0+Y3VyX3J4bF9pbmRleCBdOworCWlmKCBpbmIoIGlvYWRkciArIENTUjAgKSAmIDB4MDEgKQorCQlubC0+c3RhdGUgfD0gRkxfU0xPV19NT0RFOworCisJcHJpbnRrKCBLRVJOX05PVElDRSAiJXM6IGlvYWRkciAlI2x4LCBpcnEgJWQsICIKKwkJIk1BQzogMDA6ZmY6MDE6JTAyeDolMDJ4OiUwMnhcbiIsIAorCQlkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwKKwkJKCh1OCAqKSBkZXYtPmRldl9hZGRyKSBbM10sCisJCSgodTggKikgZGV2LT5kZXZfYWRkcikgWzRdLAorCQkoKHU4ICopIGRldi0+ZGV2X2FkZHIpIFs1XSApOworCisJcHJpbnRrKCBLRVJOX05PVElDRSAiJXM6IHNwZWVkICVkLCByZWNlaXZlIGxldmVsICIsIGRldi0+bmFtZSwKKwkJKCAobmwtPnN0YXRlICYgRkxfU0xPV19NT0RFKSAgPyAgNTAwMDAwIDogMjAwMDAwMCkKKwkJLyAoMSA8PCBubC0+Y3NyMS5yYXRlKSApOworCisJaWYoIG5sLT5kZWx0YV9yeGwgPT0gMCApCisJCXByaW50ayggIjB4JXggKGZpeGVkKVxuIiwgbmwtPmN1cl9yeGxfaW5kZXggKTsgCisJZWxzZQorCQlwcmludGsoICIoYXV0bylcbiIpOworCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJbmwtPm1hc3RlciA9IGRldjsKKwlubC0+bGluayAgID0gTlVMTDsKKyNlbmRpZgorICAgCisJc2JuaV9jYXJkc1sgbnVtKysgXSA9IGRldjsKKwlyZXR1cm4gIGRldjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCitzdGF0aWMgaW50CitzYm5pX3N0YXJ0X3htaXQoIHN0cnVjdCBza19idWZmICAqc2tiLCAgc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICAqcDsKKworCW5ldGlmX3N0b3BfcXVldWUoIGRldiApOworCisJLyogTG9va2luZyBmb3IgaWRsZSBkZXZpY2UgaW4gdGhlIGxpc3QgKi8KKwlmb3IoIHAgPSBkZXY7ICBwOyApIHsKKwkJc3RydWN0IG5ldF9sb2NhbCAgKm5sID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgcC0+cHJpdjsKKwkJc3Bpbl9sb2NrKCAmbmwtPmxvY2sgKTsKKwkJaWYoIG5sLT50eF9idWZfcCAgfHwgIChubC0+c3RhdGUgJiBGTF9MSU5FX0RPV04pICkgeworCQkJcCA9IG5sLT5saW5rOworCQkJc3Bpbl91bmxvY2soICZubC0+bG9jayApOworCQl9IGVsc2UgeworCQkJLyogSWRsZSBkZXYgaXMgZm91bmQgKi8KKwkJCXByZXBhcmVfdG9fc2VuZCggc2tiLCBwICk7CisJCQlzcGluX3VubG9jayggJm5sLT5sb2NrICk7CisJCQluZXRpZl9zdGFydF9xdWV1ZSggZGV2ICk7CisJCQlyZXR1cm4gIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gIDE7Cit9CisKKyNlbHNlCS8qIENPTkZJR19TQk5JX01VTFRJTElORSAqLworCitzdGF0aWMgaW50CitzYm5pX3N0YXJ0X3htaXQoIHN0cnVjdCBza19idWZmICAqc2tiLCAgc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwluZXRpZl9zdG9wX3F1ZXVlKCBkZXYgKTsKKwlzcGluX2xvY2soICZubC0+bG9jayApOworCisJcHJlcGFyZV90b19zZW5kKCBza2IsIGRldiApOworCisJc3Bpbl91bmxvY2soICZubC0+bG9jayApOworCXJldHVybiAgMDsKK30KKworI2VuZGlmCS8qIENPTkZJR19TQk5JX01VTFRJTElORSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBpbnRlcnJ1cHQgaGFuZGxlciAqLworCisvKgorICogCVNCTkkxMkQtMTAsIC0xMS9JU0EgYm9hcmRzIHdpdGhpbiAiY29tbW9uIGludGVycnVwdCIgbW9kZSBjb3VsZCBub3QKKyAqIGJlIGxvb2tlZCBhcyB0d28gaW5kZXBlbmRlbnQgc2luZ2xlLWNoYW5uZWwgZGV2aWNlcy4gRXZlcnkgY2hhbm5lbCBzZWVtcworICogYXMgRXRoZXJuZXQgaW50ZXJmYWNlIGJ1dCBpbnRlcnJ1cHQgaGFuZGxlciBtdXN0IGJlIGNvbW1vbi4gUmVhbGx5LCBmaXJzdAorICogY2hhbm5lbCAoIm1hc3RlciIpIGRyaXZlciBvbmx5IHJlZ2lzdGVycyB0aGUgaGFuZGxlci4gSW4gaXRzIHN0cnVjdCBuZXRfbG9jYWwKKyAqIGl0IGhhcyBnb3QgcG9pbnRlciB0byAic2xhdmUiIGNoYW5uZWwncyBzdHJ1Y3QgbmV0X2xvY2FsIGFuZCBoYW5kbGVzIHRoYXQncworICogaW50ZXJydXB0cyB0b28uCisgKglkZXYgb2Ygc3VjY2Vzc2Z1bGx5IGF0dGFjaGVkIElTQSBTQk5JIGJvYXJkcyBpcyBsaW5rZWQgdG8gbGlzdC4KKyAqIFdoaWxlIG5leHQgYm9hcmQgZHJpdmVyIGlzIGluaXRpYWxpemVkLCBpdCBzY2FucyB0aGlzIGxpc3QuIElmIG9uZQorICogaGFzIGZvdW5kIGRldiB3aXRoIHNhbWUgaXJxIGFuZCBpb2FkZHIgZGlmZmVyZW50IGJ5IDQgdGhlbiBpdCBhc3N1bWVzCisgKiB0aGlzIGJvYXJkIHRvIGJlICJtYXN0ZXIiLgorICovIAorCitzdGF0aWMgaXJxcmV0dXJuX3QKK3NibmlfaW50ZXJydXB0KCBpbnQgIGlycSwgIHZvaWQgICpkZXZfaWQsICBzdHJ1Y3QgcHRfcmVncyAgKnJlZ3MgKQoreworCXN0cnVjdCBuZXRfZGV2aWNlCSAgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwlpbnQJcmVwZWF0OworCisJc3Bpbl9sb2NrKCAmbmwtPmxvY2sgKTsKKwlpZiggbmwtPnNlY29uZCApCisJCXNwaW5fbG9jayggJigoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+c2Vjb25kLT5wcml2KS0+bG9jayApOworCisJZG8geworCQlyZXBlYXQgPSAwOworCQlpZiggaW5iKCBkZXYtPmJhc2VfYWRkciArIENTUjAgKSAmIChSQ19SRFkgfCBUUl9SRFkpICkKKwkJCWhhbmRsZV9jaGFubmVsKCBkZXYgKSwKKwkJCXJlcGVhdCA9IDE7CisJCWlmKCBubC0+c2Vjb25kICAmJiAJLyogc2Vjb25kIGNoYW5uZWwgcHJlc2VudCAqLworCQkgICAgKGluYiggbmwtPnNlY29uZC0+YmFzZV9hZGRyK0NTUjAgKSAmIChSQ19SRFkgfCBUUl9SRFkpKSApCisJCQloYW5kbGVfY2hhbm5lbCggbmwtPnNlY29uZCApLAorCQkJcmVwZWF0ID0gMTsKKwl9IHdoaWxlKCByZXBlYXQgKTsKKworCWlmKCBubC0+c2Vjb25kICkKKwkJc3Bpbl91bmxvY2soICYoKHN0cnVjdCBuZXRfbG9jYWwgKilubC0+c2Vjb25kLT5wcml2KS0+bG9jayApOworCXNwaW5fdW5sb2NrKCAmbmwtPmxvY2sgKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworc3RhdGljIHZvaWQKK2hhbmRsZV9jaGFubmVsKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9sb2NhbAkqbmwgICAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZwkJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpbnQgIHJlcV9hbnM7CisJdW5zaWduZWQgY2hhciAgY3NyMDsKKworI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCS8qIExvY2sgdGhlIG1hc3RlciBkZXZpY2UgYmVjYXVzZSB3ZSBnb2luZyB0byBjaGFuZ2UgaXRzIGxvY2FsIGRhdGEgKi8KKwlpZiggbmwtPnN0YXRlICYgRkxfU0xBVkUgKQorCQlzcGluX2xvY2soICYoKHN0cnVjdCBuZXRfbG9jYWwgKikgbmwtPm1hc3Rlci0+cHJpdiktPmxvY2sgKTsKKyNlbmRpZgorCisJb3V0YiggKGluYiggaW9hZGRyICsgQ1NSMCApICYgfkVOX0lOVCkgfCBUUl9SRVEsIGlvYWRkciArIENTUjAgKTsKKworCW5sLT50aW1lcl90aWNrcyA9IENIQU5HRV9MRVZFTF9TVEFSVF9USUNLUzsKKwlmb3IoOzspIHsKKwkJY3NyMCA9IGluYiggaW9hZGRyICsgQ1NSMCApOworCQlpZiggKCBjc3IwICYgKFJDX1JEWSB8IFRSX1JEWSkgKSA9PSAwICkKKwkJCWJyZWFrOworCisJCXJlcV9hbnMgPSAhKG5sLT5zdGF0ZSAmIEZMX1BSRVZfT0spOworCisJCWlmKCBjc3IwICYgUkNfUkRZICkKKwkJCXJlcV9hbnMgPSByZWN2X2ZyYW1lKCBkZXYgKTsKKworCQkvKgorCQkgKiBUUl9SRFkgYWx3YXlzIGVxdWFscyAxIGhlcmUgYmVjYXVzZSB3ZSBoYXZlIG93bmVkIHRoZSBtYXJrZXIsCisJCSAqIGFuZCB3ZSBzZXQgVFJfUkVRIHdoZW4gZGlzYWJsZWQgaW50ZXJydXB0cworCQkgKi8KKwkJY3NyMCA9IGluYiggaW9hZGRyICsgQ1NSMCApOworCQlpZiggIShjc3IwICYgVFJfUkRZKSAgfHwgIChjc3IwICYgUkNfUkRZKSApCisJCQlwcmludGsoIEtFUk5fRVJSICIlczogaW50ZXJuYWwgZXJyb3IhXG4iLCBkZXYtPm5hbWUgKTsKKworCQkvKiBpZiBzdGF0ZSAmIEZMX05FRURfUkVTRU5EICE9IDAgdGhlbiB0eF9mcmFtZW5vICE9IDAgKi8KKwkJaWYoIHJlcV9hbnMgIHx8ICBubC0+dHhfZnJhbWVubyAhPSAwICkKKwkJCXNlbmRfZnJhbWUoIGRldiApOworCQllbHNlCisJCQkvKiBzZW5kIG1hcmtlciB3aXRob3V0IGFueSBkYXRhICovCisJCQlvdXRiKCBpbmIoIGlvYWRkciArIENTUjAgKSAmIH5UUl9SRVEsIGlvYWRkciArIENTUjAgKTsKKwl9CisKKwlvdXRiKCBpbmIoIGlvYWRkciArIENTUjAgKSB8IEVOX0lOVCwgaW9hZGRyICsgQ1NSMCApOworCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJaWYoIG5sLT5zdGF0ZSAmIEZMX1NMQVZFICkKKwkJc3Bpbl91bmxvY2soICYoKHN0cnVjdCBuZXRfbG9jYWwgKikgbmwtPm1hc3Rlci0+cHJpdiktPmxvY2sgKTsKKyNlbmRpZgorfQorCisKKy8qCisgKiBSb3V0aW5lIHJldHVybnMgMSBpZiBpdCBuZWVkIHRvIGFja25vd2VsZWRnZSByZWNlaXZlZCBmcmFtZS4KKyAqIEVtcHR5IGZyYW1lIHJlY2VpdmVkIHdpdGhvdXQgZXJyb3JzIHdvbid0IGJlIGFja25vd2VsZWRnZWQuCisgKi8KKworc3RhdGljIGludAorcmVjdl9mcmFtZSggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCAgID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgIGlvYWRkcgk9IGRldi0+YmFzZV9hZGRyOworCisJdTMyICBjcmMgPSBDUkMzMl9JTklUSUFMOworCisJdW5zaWduZWQgIGZyYW1lbGVuLCBmcmFtZW5vLCBhY2s7CisJdW5zaWduZWQgIGlzX2ZpcnN0LCBmcmFtZV9vazsKKworCWlmKCBjaGVja19maGRyKCBpb2FkZHIsICZmcmFtZWxlbiwgJmZyYW1lbm8sICZhY2ssICZpc19maXJzdCwgJmNyYyApICkgeworCQlmcmFtZV9vayA9IGZyYW1lbGVuID4gNAorCQkJPyAgdXBsb2FkX2RhdGEoIGRldiwgZnJhbWVsZW4sIGZyYW1lbm8sIGlzX2ZpcnN0LCBjcmMgKQorCQkJOiAgc2tpcF90YWlsKCBpb2FkZHIsIGZyYW1lbGVuLCBjcmMgKTsKKwkJaWYoIGZyYW1lX29rICkKKwkJCWludGVycHJldF9hY2soIGRldiwgYWNrICk7CisJfSBlbHNlCisJCWZyYW1lX29rID0gMDsKKworCW91dGIoIGluYiggaW9hZGRyICsgQ1NSMCApIF4gQ1RfWkVSLCBpb2FkZHIgKyBDU1IwICk7CisJaWYoIGZyYW1lX29rICkgeworCQlubC0+c3RhdGUgfD0gRkxfUFJFVl9PSzsKKwkJaWYoIGZyYW1lbGVuID4gNCApCisJCQlubC0+aW5fc3RhdHMuYWxsX3J4X251bWJlcisrOworCX0gZWxzZQorCQlubC0+c3RhdGUgJj0gfkZMX1BSRVZfT0ssCisJCWNoYW5nZV9sZXZlbCggZGV2ICksCisJCW5sLT5pbl9zdGF0cy5hbGxfcnhfbnVtYmVyKyssCisJCW5sLT5pbl9zdGF0cy5iYWRfcnhfbnVtYmVyKys7CisKKwlyZXR1cm4gICFmcmFtZV9vayAgfHwgIGZyYW1lbGVuID4gNDsKK30KKworCitzdGF0aWMgdm9pZAorc2VuZF9mcmFtZSggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCAgICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCXUzMiAgY3JjID0gQ1JDMzJfSU5JVElBTDsKKworCWlmKCBubC0+c3RhdGUgJiBGTF9ORUVEX1JFU0VORCApIHsKKworCQkvKiBpZiBmcmFtZSB3YXMgc2VuZGVkIGJ1dCBub3QgQUNLJ2VkIC0gcmVzZW5kIGl0ICovCisJCWlmKCBubC0+dHJhbnNfZXJyb3JzICkgeworCQkJLS1ubC0+dHJhbnNfZXJyb3JzOworCQkJaWYoIG5sLT5mcmFtZWxlbiAhPSAwICkKKwkJCQlubC0+aW5fc3RhdHMucmVzZW5kX3R4X251bWJlcisrOworCQl9IGVsc2UgeworCQkJLyogY2Fubm90IHhtaXQgd2l0aCBtYW55IGF0dGVtcHRzICovCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJCQlpZiggKG5sLT5zdGF0ZSAmIEZMX1NMQVZFKSAgfHwgIG5sLT5saW5rICkKKyNlbmRpZgorCQkJbmwtPnN0YXRlIHw9IEZMX0xJTkVfRE9XTjsKKwkJCWRyb3BfeG1pdF9xdWV1ZSggZGV2ICk7CisJCQlnb3RvICBkb19zZW5kOworCQl9CisJfSBlbHNlCisJCW5sLT50cmFuc19lcnJvcnMgPSBUUl9FUlJPUl9DT1VOVDsKKworCXNlbmRfZnJhbWVfaGVhZGVyKCBkZXYsICZjcmMgKTsKKwlubC0+c3RhdGUgfD0gRkxfTkVFRF9SRVNFTkQ7CisJLyoKKwkgKiBGTF9ORUVEX1JFU0VORCB3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgQUNLLCBidXQgaWYgZW1wdHkKKwkgKiBmcmFtZSBzZW5kZWQgdGhlbiBpbiBwcmVwYXJlX3RvX3NlbmQgbmV4dCBmcmFtZQorCSAqLworCisKKwlpZiggbmwtPmZyYW1lbGVuICkgeworCQlkb3dubG9hZF9kYXRhKCBkZXYsICZjcmMgKTsKKwkJbmwtPmluX3N0YXRzLmFsbF90eF9udW1iZXIrKzsKKwkJbmwtPnN0YXRlIHw9IEZMX1dBSVRfQUNLOworCX0KKworCW91dHNiKCBkZXYtPmJhc2VfYWRkciArIERBVCwgKHU4ICopJmNyYywgc2l6ZW9mIGNyYyApOworCitkb19zZW5kOgorCW91dGIoIGluYiggZGV2LT5iYXNlX2FkZHIgKyBDU1IwICkgJiB+VFJfUkVRLCBkZXYtPmJhc2VfYWRkciArIENTUjAgKTsKKworCWlmKCBubC0+dHhfZnJhbWVubyApCisJCS8qIG5leHQgZnJhbWUgZXhpc3RzIC0gd2UgcmVxdWVzdCBjYXJkIHRvIHNlbmQgaXQgKi8KKwkJb3V0YiggaW5iKCBkZXYtPmJhc2VfYWRkciArIENTUjAgKSB8IFRSX1JFUSwKKwkJICAgICAgZGV2LT5iYXNlX2FkZHIgKyBDU1IwICk7Cit9CisKKworLyoKKyAqIFdyaXRlIHRoZSBmcmFtZSBkYXRhIGludG8gYWRhcHRlcidzIGJ1ZmZlciBtZW1vcnksIGFuZCBjYWxjdWxhdGUgQ1JDLgorICogRG8gcGFkZGluZyBpZiBuZWNlc3NhcnkuCisgKi8KKworc3RhdGljIHZvaWQKK2Rvd25sb2FkX2RhdGEoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2LCAgdTMyICAqY3JjX3AgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCAgICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAgICAqc2tiCSA9IG5sLT50eF9idWZfcDsKKworCXVuc2lnbmVkICBsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNrYi0+bGVuIC0gbmwtPm91dHBvcywgbmwtPmZyYW1lbGVuKTsKKworCW91dHNiKCBkZXYtPmJhc2VfYWRkciArIERBVCwgc2tiLT5kYXRhICsgbmwtPm91dHBvcywgbGVuICk7CisJKmNyY19wID0gY2FsY19jcmMzMiggKmNyY19wLCBza2ItPmRhdGEgKyBubC0+b3V0cG9zLCBsZW4gKTsKKworCS8qIGlmIHBhY2tldCB0b28gc2hvcnQgd2Ugc2hvdWxkIHdyaXRlIHNvbWUgbW9yZSBieXRlcyB0byBwYWQgKi8KKwlmb3IoIGxlbiA9IG5sLT5mcmFtZWxlbiAtIGxlbjsgIGxlbi0tOyApCisJCW91dGIoIDAsIGRldi0+YmFzZV9hZGRyICsgREFUICksCisJCSpjcmNfcCA9IENSQzMyKCAwLCAqY3JjX3AgKTsKK30KKworCitzdGF0aWMgaW50Cit1cGxvYWRfZGF0YSggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYsICB1bnNpZ25lZCAgZnJhbWVsZW4sICB1bnNpZ25lZCAgZnJhbWVubywKKwkgICAgIHVuc2lnbmVkICBpc19maXJzdCwgIHUzMiAgY3JjICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwlpbnQgIGZyYW1lX29rOworCisJaWYoIGlzX2ZpcnN0ICkKKwkJbmwtPndhaXRfZnJhbWVubyA9IGZyYW1lbm8sCisJCW5sLT5pbnBwb3MgPSAwOworCisJaWYoIG5sLT53YWl0X2ZyYW1lbm8gPT0gZnJhbWVubyApIHsKKworCQlpZiggbmwtPmlucHBvcyArIGZyYW1lbGVuICA8PSAgRVRIRVJfTUFYX0xFTiApCisJCQlmcmFtZV9vayA9IGFwcGVuZF9mcmFtZV90b19wa3QoIGRldiwgZnJhbWVsZW4sIGNyYyApOworCisJCS8qCisJCSAqIGlmIENSQyBpcyByaWdodCBidXQgZnJhbWVsZW4gaW5jb3JyZWN0IHRoZW4gdHJhbnNtaXR0ZXIKKwkJICogZXJyb3Igd2FzIG9jY3VycmVkLi4uIGRyb3AgZW50aXJlIHBhY2tldAorCQkgKi8KKwkJZWxzZSBpZiggKGZyYW1lX29rID0gc2tpcF90YWlsKCBkZXYtPmJhc2VfYWRkciwgZnJhbWVsZW4sIGNyYyApKQorCQkJICE9IDAgKQorCQkJbmwtPndhaXRfZnJhbWVubyA9IDAsCisJCQlubC0+aW5wcG9zID0gMCwKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwkJCSgoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KQorCQkJCS0+c3RhdHMucnhfZXJyb3JzKyssCisJCQkoKHN0cnVjdCBuZXRfbG9jYWwgKikgbmwtPm1hc3Rlci0+cHJpdikKKwkJCQktPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKKyNlbHNlCisJCQlubC0+c3RhdHMucnhfZXJyb3JzKyssCisJCQlubC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworI2VuZGlmCisJCQkvKiBub3cgc2tpcCBhbGwgZnJhbWVzIHVudGlsIGlzX2ZpcnN0ICE9IDAgKi8KKwl9IGVsc2UKKwkJZnJhbWVfb2sgPSBza2lwX3RhaWwoIGRldi0+YmFzZV9hZGRyLCBmcmFtZWxlbiwgY3JjICk7CisKKwlpZiggaXNfZmlyc3QgICYmICAhZnJhbWVfb2sgKQorCQkvKgorCQkgKiBGcmFtZSBoYXMgYmVlbiBicm9rZW4sIGJ1dCB3ZSBoYWQgYWxyZWFkeSBzdG9yZWQKKwkJICogaXNfZmlyc3QuLi4gRHJvcCBlbnRpcmUgcGFja2V0LgorCQkgKi8KKwkJbmwtPndhaXRfZnJhbWVubyA9IDAsCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJCSgoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KS0+c3RhdHMucnhfZXJyb3JzKyssCisJCSgoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KS0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworI2Vsc2UKKwkJbmwtPnN0YXRzLnJ4X2Vycm9ycysrLAorCQlubC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworI2VuZGlmCisKKwlyZXR1cm4gIGZyYW1lX29rOworfQorCisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitzZW5kX2NvbXBsZXRlKCBzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgKQoreworI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCSgoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KS0+c3RhdHMudHhfcGFja2V0cysrOworCSgoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KS0+c3RhdHMudHhfYnl0ZXMKKwkJKz0gbmwtPnR4X2J1Zl9wLT5sZW47CisjZWxzZQorCW5sLT5zdGF0cy50eF9wYWNrZXRzKys7CisJbmwtPnN0YXRzLnR4X2J5dGVzICs9IG5sLT50eF9idWZfcC0+bGVuOworI2VuZGlmCisJZGV2X2tmcmVlX3NrYl9pcnEoIG5sLT50eF9idWZfcCApOworCisJbmwtPnR4X2J1Zl9wID0gTlVMTDsKKworCW5sLT5vdXRwb3MgPSAwOworCW5sLT5zdGF0ZSAmPSB+KEZMX1dBSVRfQUNLIHwgRkxfTkVFRF9SRVNFTkQpOworCW5sLT5mcmFtZWxlbiAgID0gMDsKK30KKworCitzdGF0aWMgdm9pZAoraW50ZXJwcmV0X2Fjayggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYsICB1bnNpZ25lZCAgYWNrICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwlpZiggYWNrID09IEZSQU1FX1NFTlRfT0sgKSB7CisJCW5sLT5zdGF0ZSAmPSB+RkxfTkVFRF9SRVNFTkQ7CisKKwkJaWYoIG5sLT5zdGF0ZSAmIEZMX1dBSVRfQUNLICkgeworCQkJbmwtPm91dHBvcyArPSBubC0+ZnJhbWVsZW47CisKKwkJCWlmKCAtLW5sLT50eF9mcmFtZW5vICkKKwkJCQlubC0+ZnJhbWVsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQkgICBubC0+bWF4ZnJhbWUsCisJCQkJCQkgICBubC0+dHhfYnVmX3AtPmxlbiAtIG5sLT5vdXRwb3MpOworCQkJZWxzZQorCQkJCXNlbmRfY29tcGxldGUoIG5sICksCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJCQkJbmV0aWZfd2FrZV9xdWV1ZSggbmwtPm1hc3RlciApOworI2Vsc2UKKwkJCQluZXRpZl93YWtlX3F1ZXVlKCBkZXYgKTsKKyNlbmRpZgorCQl9CisJfQorCisJbmwtPnN0YXRlICY9IH5GTF9XQUlUX0FDSzsKK30KKworCisvKgorICogR2x1ZSByZWNlaXZlZCBmcmFtZSB3aXRoIHByZXZpb3VzIGZyYWdtZW50cyBvZiBwYWNrZXQuCisgKiBJbmRpY2F0ZSBwYWNrZXQgd2hlbiBsYXN0IGZyYW1lIHdvdWxkIGJlIGFjY2VwdGVkLgorICovCisKK3N0YXRpYyBpbnQKK2FwcGVuZF9mcmFtZV90b19wa3QoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2LCAgdW5zaWduZWQgIGZyYW1lbGVuLCAgdTMyICBjcmMgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCXU4ICAqcDsKKworCWlmKCBubC0+aW5wcG9zICsgZnJhbWVsZW4gID4gIEVUSEVSX01BWF9MRU4gKQorCQlyZXR1cm4gIDA7CisKKwlpZiggIW5sLT5yeF9idWZfcCAgJiYgICEobmwtPnJ4X2J1Zl9wID0gZ2V0X3J4X2J1ZiggZGV2ICkpICkKKwkJcmV0dXJuICAwOworCisJcCA9IG5sLT5yeF9idWZfcC0+ZGF0YSArIG5sLT5pbnBwb3M7CisJaW5zYiggZGV2LT5iYXNlX2FkZHIgKyBEQVQsIHAsIGZyYW1lbGVuICk7CisJaWYoIGNhbGNfY3JjMzIoIGNyYywgcCwgZnJhbWVsZW4gKSAhPSBDUkMzMl9SRU1BSU5ERVIgKQorCQlyZXR1cm4gIDA7CisKKwlubC0+aW5wcG9zICs9IGZyYW1lbGVuIC0gNDsKKwlpZiggLS1ubC0+d2FpdF9mcmFtZW5vID09IDAgKQkJLyogbGFzdCBmcmFtZSByZWNlaXZlZCAqLworCQlpbmRpY2F0ZV9wa3QoIGRldiApOworCisJcmV0dXJuICAxOworfQorCisKKy8qCisgKiBQcmVwYXJlIHRvIHN0YXJ0IG91dHB1dCBvbiBhZGFwdGVyLgorICogVHJhbnNtaXR0ZXIgd2lsbCBiZSBhY3R1YWxseSBhY3RpdmF0ZWQgd2hlbiBtYXJrZXIgaXMgYWNjZXB0ZWQuCisgKi8KKworc3RhdGljIHZvaWQKK3ByZXBhcmVfdG9fc2VuZCggc3RydWN0IHNrX2J1ZmYgICpza2IsICBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCisJdW5zaWduZWQgaW50ICBsZW47CisKKwkvKiBubC0+dHhfYnVmX3AgPT0gTlVMTCBoZXJlISAqLworCWlmKCBubC0+dHhfYnVmX3AgKQorCQlwcmludGsoIEtFUk5fRVJSICIlczogbWVtb3J5IGxlYWshXG4iLCBkZXYtPm5hbWUgKTsKKworCW5sLT5vdXRwb3MgPSAwOworCW5sLT5zdGF0ZSAmPSB+KEZMX1dBSVRfQUNLIHwgRkxfTkVFRF9SRVNFTkQpOworCisJbGVuID0gc2tiLT5sZW47CisJaWYoIGxlbiA8IFNCTklfTUlOX0xFTiApCisJCWxlbiA9IFNCTklfTUlOX0xFTjsKKworCW5sLT50eF9idWZfcAk9IHNrYjsKKwlubC0+dHhfZnJhbWVubwk9IChsZW4gKyBubC0+bWF4ZnJhbWUgLSAxKSAvIG5sLT5tYXhmcmFtZTsKKwlubC0+ZnJhbWVsZW4JPSBsZW4gPCBubC0+bWF4ZnJhbWUgID8gIGxlbiAgOiAgbmwtPm1heGZyYW1lOworCisJb3V0YiggaW5iKCBkZXYtPmJhc2VfYWRkciArIENTUjAgKSB8IFRSX1JFUSwgIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApOworI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCW5sLT5tYXN0ZXItPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyNlbHNlCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZAorZHJvcF94bWl0X3F1ZXVlKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCisJaWYoIG5sLT50eF9idWZfcCApCisJCWRldl9rZnJlZV9za2JfYW55KCBubC0+dHhfYnVmX3AgKSwKKwkJbmwtPnR4X2J1Zl9wID0gTlVMTCwKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwkJKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5tYXN0ZXItPnByaXYpCisJCQktPnN0YXRzLnR4X2Vycm9ycysrLAorCQkoKHN0cnVjdCBuZXRfbG9jYWwgKikgbmwtPm1hc3Rlci0+cHJpdikKKwkJCS0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKyNlbHNlCisJCW5sLT5zdGF0cy50eF9lcnJvcnMrKywKKwkJbmwtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisjZW5kaWYKKworCW5sLT50eF9mcmFtZW5vCT0gMDsKKwlubC0+ZnJhbWVsZW4JPSAwOworCW5sLT5vdXRwb3MJPSAwOworCW5sLT5zdGF0ZSAmPSB+KEZMX1dBSVRfQUNLIHwgRkxfTkVFRF9SRVNFTkQpOworI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCW5ldGlmX3N0YXJ0X3F1ZXVlKCBubC0+bWFzdGVyICk7CisJbmwtPm1hc3Rlci0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworI2Vsc2UKKwluZXRpZl9zdGFydF9xdWV1ZSggZGV2ICk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZAorc2VuZF9mcmFtZV9oZWFkZXIoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2LCAgdTMyICAqY3JjX3AgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwl1MzIgIGNyYyA9ICpjcmNfcDsKKwl1MzIgIGxlbl9maWVsZCA9IG5sLT5mcmFtZWxlbiArIDY7CS8qIENSQyArIGZyYW1lbm8gKyByZXNlcnZlZCAqLworCXU4ICAgdmFsdWU7CisKKwlpZiggbmwtPnN0YXRlICYgRkxfTkVFRF9SRVNFTkQgKQorCQlsZW5fZmllbGQgfD0gRlJBTUVfUkVUUlk7CS8qIG5vbi1maXJzdCBhdHRlbXB0Li4uICovCisKKwlpZiggbmwtPm91dHBvcyA9PSAwICkKKwkJbGVuX2ZpZWxkIHw9IEZSQU1FX0ZJUlNUOworCisJbGVuX2ZpZWxkIHw9IChubC0+c3RhdGUgJiBGTF9QUkVWX09LKSA/IEZSQU1FX1NFTlRfT0sgOiBGUkFNRV9TRU5UX0JBRDsKKwlvdXRiKCBTQk5JX1NJRywgZGV2LT5iYXNlX2FkZHIgKyBEQVQgKTsKKworCXZhbHVlID0gKHU4KSBsZW5fZmllbGQ7CisJb3V0YiggdmFsdWUsIGRldi0+YmFzZV9hZGRyICsgREFUICk7CisJY3JjID0gQ1JDMzIoIHZhbHVlLCBjcmMgKTsKKwl2YWx1ZSA9ICh1OCkgKGxlbl9maWVsZCA+PiA4KTsKKwlvdXRiKCB2YWx1ZSwgZGV2LT5iYXNlX2FkZHIgKyBEQVQgKTsKKwljcmMgPSBDUkMzMiggdmFsdWUsIGNyYyApOworCisJb3V0YiggbmwtPnR4X2ZyYW1lbm8sIGRldi0+YmFzZV9hZGRyICsgREFUICk7CisJY3JjID0gQ1JDMzIoIG5sLT50eF9mcmFtZW5vLCBjcmMgKTsKKwlvdXRiKCAwLCBkZXYtPmJhc2VfYWRkciArIERBVCApOworCWNyYyA9IENSQzMyKCAwLCBjcmMgKTsKKwkqY3JjX3AgPSBjcmM7Cit9CisKKworLyoKKyAqIGlmIGZyYW1lIHRhaWwgbm90IG5lZWRlZCAoaW5jb3JyZWN0IG51bWJlciBvciByZWNlaXZlZCB0d2ljZSksCisgKiBpdCB3b24ndCBzdG9yZSwgYnV0IENSQyB3aWxsIGJlIGNhbGN1bGF0ZWQKKyAqLworCitzdGF0aWMgaW50Citza2lwX3RhaWwoIHVuc2lnbmVkIGludCAgaW9hZGRyLCAgdW5zaWduZWQgaW50ICB0YWlsX2xlbiwgIHUzMiBjcmMgKQoreworCXdoaWxlKCB0YWlsX2xlbi0tICkKKwkJY3JjID0gQ1JDMzIoIGluYiggaW9hZGRyICsgREFUICksIGNyYyApOworCisJcmV0dXJuICBjcmMgPT0gQ1JDMzJfUkVNQUlOREVSOworfQorCisKKy8qCisgKiBQcmVsaW1pbmFyeSBjaGVja3MgaWYgZnJhbWUgaGVhZGVyIGlzIGNvcnJlY3QsIGNhbGN1bGF0ZXMgaXRzIENSQworICogYW5kIHNwbGl0IGl0IHRvIHNpbXBsZSBmaWVsZHMKKyAqLworCitzdGF0aWMgaW50CitjaGVja19maGRyKCB1MzIgIGlvYWRkciwgIHUzMiAgKmZyYW1lbGVuLCAgdTMyICAqZnJhbWVubywgIHUzMiAgKmFjaywKKwkgICAgdTMyICAqaXNfZmlyc3QsICB1MzIgICpjcmNfcCApCit7CisJdTMyICBjcmMgPSAqY3JjX3A7CisJdTggICB2YWx1ZTsKKworCWlmKCBpbmIoIGlvYWRkciArIERBVCApICE9IFNCTklfU0lHICkKKwkJcmV0dXJuICAwOworCisJdmFsdWUgPSBpbmIoIGlvYWRkciArIERBVCApOworCSpmcmFtZWxlbiA9ICh1MzIpdmFsdWU7CisJY3JjID0gQ1JDMzIoIHZhbHVlLCBjcmMgKTsKKwl2YWx1ZSA9IGluYiggaW9hZGRyICsgREFUICk7CisJKmZyYW1lbGVuIHw9ICgodTMyKXZhbHVlKSA8PCA4OworCWNyYyA9IENSQzMyKCB2YWx1ZSwgY3JjICk7CisKKwkqYWNrID0gKmZyYW1lbGVuICYgRlJBTUVfQUNLX01BU0s7CisJKmlzX2ZpcnN0ID0gKCpmcmFtZWxlbiAmIEZSQU1FX0ZJUlNUKSAhPSAwOworCisJaWYoICgqZnJhbWVsZW4gJj0gRlJBTUVfTEVOX01BU0spIDwgNgorCSAgICB8fCAgKmZyYW1lbGVuID4gU0JOSV9NQVhfRlJBTUUgLSAzICkKKwkJcmV0dXJuICAwOworCisJdmFsdWUgPSBpbmIoIGlvYWRkciArIERBVCApOworCSpmcmFtZW5vID0gKHUzMil2YWx1ZTsKKwljcmMgPSBDUkMzMiggdmFsdWUsIGNyYyApOworCisJY3JjID0gQ1JDMzIoIGluYiggaW9hZGRyICsgREFUICksIGNyYyApOwkvKiByZXNlcnZlZCBieXRlICovCisJKmZyYW1lbGVuIC09IDI7CisKKwkqY3JjX3AgPSBjcmM7CisJcmV0dXJuICAxOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitnZXRfcnhfYnVmKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJLyogKzIgaXMgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGFsaWdubWVudCBmaXh1cCBiZWxvdyAqLworCXN0cnVjdCBza19idWZmICAqc2tiID0gZGV2X2FsbG9jX3NrYiggRVRIRVJfTUFYX0xFTiArIDIgKTsKKwlpZiggIXNrYiApCisJCXJldHVybiAgTlVMTDsKKworI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCXNrYi0+ZGV2ID0gKChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdiktPm1hc3RlcjsKKyNlbHNlCisJc2tiLT5kZXYgPSBkZXY7CisjZW5kaWYKKwlza2JfcmVzZXJ2ZSggc2tiLCAyICk7CQkvKiBBbGlnbiBJUCBvbiBsb25nd29yZCBib3VuZGFyaWVzICovCisJcmV0dXJuICBza2I7Cit9CisKKworc3RhdGljIHZvaWQKK2luZGljYXRlX3BrdCggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgICAgKnNrYiA9IG5sLT5yeF9idWZfcDsKKworCXNrYl9wdXQoIHNrYiwgbmwtPmlucHBvcyApOworCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIG5sLT5tYXN0ZXIgKTsKKwluZXRpZl9yeCggc2tiICk7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkrKygoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KS0+c3RhdHMucnhfcGFja2V0czsKKwkoKHN0cnVjdCBuZXRfbG9jYWwgKikgbmwtPm1hc3Rlci0+cHJpdiktPnN0YXRzLnJ4X2J5dGVzICs9IG5sLT5pbnBwb3M7CisjZWxzZQorCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyggc2tiLCBkZXYgKTsKKwluZXRpZl9yeCggc2tiICk7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkrK25sLT5zdGF0cy5yeF9wYWNrZXRzOworCW5sLT5zdGF0cy5yeF9ieXRlcyArPSBubC0+aW5wcG9zOworI2VuZGlmCisJbmwtPnJ4X2J1Zl9wID0gTlVMTDsJLyogcHJvdG9jb2wgZHJpdmVyIHdpbGwgY2xlYXIgdGhpcyBza19idWZmICovCit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFJvdXRpbmUgY2hlY2tzIHBlcmlvZGljYWxseSB3aXJlIGFjdGl2aXR5IGFuZCByZWdlbmVyYXRlcyBtYXJrZXIgaWYKKyAqIGNvbm5lY3Qgd2FzIGluYWN0aXZlIGZvciBhIGxvbmcgdGltZS4KKyAqLworCitzdGF0aWMgdm9pZAorc2JuaV93YXRjaGRvZyggdW5zaWduZWQgbG9uZyAgYXJnICkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBhcmc7CisJc3RydWN0IG5ldF9sb2NhbCAgICpubCAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJc3RydWN0IHRpbWVyX2xpc3QgICp3ICAgPSAmbmwtPndhdGNoZG9nOyAKKwl1bnNpZ25lZCBsb25nCSAgIGZsYWdzOworCXVuc2lnbmVkIGNoYXIJICAgY3NyMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCAmbmwtPmxvY2ssIGZsYWdzICk7CisKKwljc3IwID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIENTUjAgKTsKKwlpZiggY3NyMCAmIFJDX0NISyApIHsKKworCQlpZiggbmwtPnRpbWVyX3RpY2tzICkgeworCQkJaWYoIGNzcjAgJiAoUkNfUkRZIHwgQlVfRU1QKSApCisJCQkJLyogcmVjZWl2aW5nIG5vdCBhY3RpdmUgKi8KKwkJCQlubC0+dGltZXJfdGlja3MtLTsKKwkJfSBlbHNlIHsKKwkJCW5sLT5pbl9zdGF0cy50aW1lb3V0X251bWJlcisrOworCQkJaWYoIG5sLT5kZWx0YV9yeGwgKQorCQkJCXRpbWVvdXRfY2hhbmdlX2xldmVsKCBkZXYgKTsKKworCQkJb3V0YiggKih1X2NoYXIgKikmbmwtPmNzcjEgfCBQUl9SRVMsCisJCQkgICAgICBkZXYtPmJhc2VfYWRkciArIENTUjEgKTsKKwkJCWNzcjAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApOworCQl9CisJfSBlbHNlCisJCW5sLT5zdGF0ZSAmPSB+RkxfTElORV9ET1dOOworCisJb3V0YiggY3NyMCB8IFJDX0NISywgZGV2LT5iYXNlX2FkZHIgKyBDU1IwICk7IAorCisJaW5pdF90aW1lciggdyApOworCXctPmV4cGlyZXMJPSBqaWZmaWVzICsgU0JOSV9USU1FT1VUOworCXctPmRhdGEJCT0gYXJnOworCXctPmZ1bmN0aW9uCT0gc2JuaV93YXRjaGRvZzsKKwlhZGRfdGltZXIoIHcgKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoICZubC0+bG9jaywgZmxhZ3MgKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgY2hhciAgcnhsX3RhYltdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDgsCisJMHgwYSwgMHgwYywgMHgwZiwgMHgxNiwgMHgxOCwgMHgxYSwgMHgxYywgMHgxZgorfTsKKworI2RlZmluZSBTSVpFX09GX1RJTUVPVVRfUlhMX1RBQiA0CitzdGF0aWMgdW5zaWduZWQgY2hhciAgdGltZW91dF9yeGxfdGFiW10gPSB7CisJMHgwMywgMHgwNSwgMHgwOCwgMHgwYgorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQKK2NhcmRfc3RhcnQoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwlubC0+dGltZXJfdGlja3MgPSBDSEFOR0VfTEVWRUxfU1RBUlRfVElDS1M7CisJbmwtPnN0YXRlICY9IH4oRkxfV0FJVF9BQ0sgfCBGTF9ORUVEX1JFU0VORCk7CisJbmwtPnN0YXRlIHw9IEZMX1BSRVZfT0s7CisKKwlubC0+aW5wcG9zID0gbmwtPm91dHBvcyA9IDA7CisJbmwtPndhaXRfZnJhbWVubyA9IDA7CisJbmwtPnR4X2ZyYW1lbm8JID0gMDsKKwlubC0+ZnJhbWVsZW4JID0gMDsKKworCW91dGIoICoodV9jaGFyICopJm5sLT5jc3IxIHwgUFJfUkVTLCBkZXYtPmJhc2VfYWRkciArIENTUjEgKTsKKwlvdXRiKCBFTl9JTlQsIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBSZWNlaXZlIGxldmVsIGF1dG8tc2VsZWN0aW9uICovCisKK3N0YXRpYyB2b2lkCitjaGFuZ2VfbGV2ZWwoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwlpZiggbmwtPmRlbHRhX3J4bCA9PSAwICkJLyogZG8gbm90IGF1dG8tbmVnb3RpYXRlIFJ4TCAqLworCQlyZXR1cm47CisKKwlpZiggbmwtPmN1cl9yeGxfaW5kZXggPT0gMCApCisJCW5sLT5kZWx0YV9yeGwgPSAxOworCWVsc2UgaWYoIG5sLT5jdXJfcnhsX2luZGV4ID09IDE1ICkKKwkJbmwtPmRlbHRhX3J4bCA9IC0xOworCWVsc2UgaWYoIG5sLT5jdXJfcnhsX3JjdmQgPCBubC0+cHJldl9yeGxfcmN2ZCApCisJCW5sLT5kZWx0YV9yeGwgPSAtbmwtPmRlbHRhX3J4bDsKKworCW5sLT5jc3IxLnJ4bCA9IHJ4bF90YWJbIG5sLT5jdXJfcnhsX2luZGV4ICs9IG5sLT5kZWx0YV9yeGwgXTsKKwlpbmIoIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApOwkvKiBuZWVkcyBmb3IgUENJIGNhcmRzICovCisJb3V0YiggKih1OCAqKSZubC0+Y3NyMSwgZGV2LT5iYXNlX2FkZHIgKyBDU1IxICk7CisKKwlubC0+cHJldl9yeGxfcmN2ZCA9IG5sLT5jdXJfcnhsX3JjdmQ7CisJbmwtPmN1cl9yeGxfcmN2ZCAgPSAwOworfQorCisKK3N0YXRpYyB2b2lkCit0aW1lb3V0X2NoYW5nZV9sZXZlbCggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCW5sLT5jdXJfcnhsX2luZGV4ID0gdGltZW91dF9yeGxfdGFiWyBubC0+dGltZW91dF9yeGwgXTsKKwlpZiggKytubC0+dGltZW91dF9yeGwgPj0gNCApCisJCW5sLT50aW1lb3V0X3J4bCA9IDA7CisKKwlubC0+Y3NyMS5yeGwgPSByeGxfdGFiWyBubC0+Y3VyX3J4bF9pbmRleCBdOworCWluYiggZGV2LT5iYXNlX2FkZHIgKyBDU1IwICk7CisJb3V0YiggKih1bnNpZ25lZCBjaGFyICopJm5sLT5jc3IxLCBkZXYtPmJhc2VfYWRkciArIENTUjEgKTsKKworCW5sLT5wcmV2X3J4bF9yY3ZkID0gbmwtPmN1cl9yeGxfcmN2ZDsKKwlubC0+Y3VyX3J4bF9yY3ZkICA9IDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKglPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAKKyAqLworCitzdGF0aWMgaW50CitzYm5pX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsCSpubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkqdyAgPSAmbmwtPndhdGNoZG9nOworCisJLyoKKwkgKiBGb3IgZG91YmxlIElTQSBhZGFwdGVycyB3aXRoaW4gImNvbW1vbiBpcnEiIG1vZGUsIHdlIGhhdmUgdG8KKwkgKiBkZXRlcm1pbmUgd2hldGhlciBwcmltYXJ5IG9yIHNlY29uZGFyeSBjaGFubmVsIGlzIGluaXRpYWxpemVkLAorCSAqIGFuZCBzZXQgdGhlIGlycSBoYW5kbGVyIG9ubHkgaW4gZmlyc3QgY2FzZS4KKwkgKi8KKwlpZiggZGV2LT5iYXNlX2FkZHIgPCAweDQwMCApIHsJCS8qIElTQSBvbmx5ICovCisJCXN0cnVjdCBuZXRfZGV2aWNlICAqKnAgPSBzYm5pX2NhcmRzOworCQlmb3IoIDsgICpwICAmJiAgcCA8IHNibmlfY2FyZHMgKyBTQk5JX01BWF9OVU1fQ0FSRFM7ICArK3AgKQorCQkJaWYoICgqcCktPmlycSA9PSBkZXYtPmlycQorCQkJICAgICYmICAoKCpwKS0+YmFzZV9hZGRyID09IGRldi0+YmFzZV9hZGRyICsgNAorCQkJCSB8fCAgKCpwKS0+YmFzZV9hZGRyID09IGRldi0+YmFzZV9hZGRyIC0gNCkKKwkJCSAgICAmJiAgKCpwKS0+ZmxhZ3MgJiBJRkZfVVAgKSB7CisKKwkJCQkoKHN0cnVjdCBuZXRfbG9jYWwgKikgKCgqcCktPnByaXYpKQorCQkJCQktPnNlY29uZCA9IGRldjsKKwkJCQlwcmludGsoIEtFUk5fTk9USUNFICIlczogdXNpbmcgc2hhcmVkIGlycSAiCisJCQkJCSJ3aXRoICVzXG4iLCBkZXYtPm5hbWUsICgqcCktPm5hbWUgKTsKKwkJCQlubC0+c3RhdGUgfD0gRkxfU0VDT05EQVJZOworCQkJCWdvdG8gIGhhbmRsZXJfYXR0YWNoZWQ7CisJCQl9CisJfQorCisJaWYoIHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzYm5pX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSApIHsKKwkJcHJpbnRrKCBLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwKKwkJCWRldi0+bmFtZSwgZGV2LT5pcnEgKTsKKwkJcmV0dXJuICAtRUFHQUlOOworCX0KKworaGFuZGxlcl9hdHRhY2hlZDoKKworCXNwaW5fbG9jayggJm5sLT5sb2NrICk7CisJbWVtc2V0KCAmbmwtPnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpICk7CisJbWVtc2V0KCAmbmwtPmluX3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHNibmlfaW5fc3RhdHMpICk7CisKKwljYXJkX3N0YXJ0KCBkZXYgKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKCBkZXYgKTsKKworCS8qIHNldCB0aW1lciB3YXRjaGRvZyAqLworCWluaXRfdGltZXIoIHcgKTsKKwl3LT5leHBpcmVzCT0gamlmZmllcyArIFNCTklfVElNRU9VVDsKKwl3LT5kYXRhCQk9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJdy0+ZnVuY3Rpb24JPSBzYm5pX3dhdGNoZG9nOworCWFkZF90aW1lciggdyApOworICAgCisJc3Bpbl91bmxvY2soICZubC0+bG9jayApOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3NibmlfY2xvc2UoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwlpZiggbmwtPnNlY29uZCAgJiYgIG5sLT5zZWNvbmQtPmZsYWdzICYgSUZGX1VQICkgeworCQlwcmludGsoIEtFUk5fTk9USUNFICJTZWNvbmRhcnkgY2hhbm5lbCAoJXMpIGlzIGFjdGl2ZSFcbiIsCisJCQlubC0+c2Vjb25kLT5uYW1lICk7CisJCXJldHVybiAgLUVCVVNZOworCX0KKworI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCWlmKCBubC0+c3RhdGUgJiBGTF9TTEFWRSApCisJCWVtYW5jaXBhdGUoIGRldiApOworCWVsc2UKKwkJd2hpbGUoIG5sLT5saW5rICkJLyogaXQncyBtYXN0ZXIgZGV2aWNlISAqLworCQkJZW1hbmNpcGF0ZSggbmwtPmxpbmsgKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrKCAmbmwtPmxvY2sgKTsKKworCW5sLT5zZWNvbmQgPSBOVUxMOworCWRyb3BfeG1pdF9xdWV1ZSggZGV2ICk7CQorCW5ldGlmX3N0b3BfcXVldWUoIGRldiApOworICAgCisJZGVsX3RpbWVyKCAmbmwtPndhdGNoZG9nICk7CisKKwlvdXRiKCAwLCBkZXYtPmJhc2VfYWRkciArIENTUjAgKTsKKworCWlmKCAhKG5sLT5zdGF0ZSAmIEZMX1NFQ09OREFSWSkgKQorCQlmcmVlX2lycSggZGV2LT5pcnEsIGRldiApOworCW5sLT5zdGF0ZSAmPSBGTF9TRUNPTkRBUlk7CisKKwlzcGluX3VubG9jayggJm5sLT5sb2NrICk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKwlWYWxpZCBjb21iaW5hdGlvbnMgaW4gQ1NSMCAoZm9yIHByb2JpbmcpOgorCisJVkFMSURfREVDT0RFUgkwMDAwLDAwMTEsMTAxMSwxMDEwCisKKwkJCQkgICAgCTsgMCAgIDsgLQorCQkJCVRSX1JFUQk7IDEgICA7ICsKKwkJCVRSX1JEWQkgICAgCTsgMiAgIDsgLQorCQkJVFJfUkRZCVRSX1JFUQk7IDMgICA7ICsKKwkJQlVfRU1QCQkgICAgCTsgNCAgIDsgKworCQlCVV9FTVAJICAgICAJVFJfUkVRCTsgNSAgIDsgKworCQlCVV9FTVAJVFJfUkRZCSAgICAJOyA2ICAgOyAtCisJCUJVX0VNUAlUUl9SRFkJVFJfUkVRCTsgNyAgIDsgKworCVJDX1JEWSAJCSAgICAgCQk7IDggICA7ICsKKwlSQ19SRFkJCQlUUl9SRVEJOyA5ICAgOyArCisJUkNfUkRZCQlUUl9SRFkJCTsgMTAgIDsgLQorCVJDX1JEWQkJVFJfUkRZCVRSX1JFUQk7IDExICA7IC0KKwlSQ19SRFkJQlVfRU1QCQkJOyAxMiAgOyAtCisJUkNfUkRZCUJVX0VNUAkJVFJfUkVRCTsgMTMgIDsgLQorCVJDX1JEWQlCVV9FTVAJVFJfUkRZCQk7IDE0ICA7IC0KKwlSQ19SRFkJQlVfRU1QCVRSX1JEWQlUUl9SRVEJOyAxNSAgOyAtCisqLworCisjZGVmaW5lIFZBTElEX0RFQ09ERVIgKDIgKyA4ICsgMHgxMCArIDB4MjAgKyAweDgwICsgMHgxMDAgKyAweDIwMCkKKworCitzdGF0aWMgaW50CitzYm5pX2NhcmRfcHJvYmUoIHVuc2lnbmVkIGxvbmcgIGlvYWRkciApCit7CisJdW5zaWduZWQgY2hhciAgY3NyMDsKKworCWNzcjAgPSBpbmIoIGlvYWRkciArIENTUjAgKTsKKwlpZiggY3NyMCAhPSAweGZmICAmJiAgY3NyMCAhPSAweDAwICkgeworCQljc3IwICY9IH5FTl9JTlQ7CisJCWlmKCBjc3IwICYgQlVfRU1QICkKKwkJCWNzcjAgfD0gRU5fSU5UOworICAgICAgCisJCWlmKCBWQUxJRF9ERUNPREVSICYgKDEgPDwgKGNzcjAgPj4gNCkpICkKKwkJCXJldHVybiAgMDsKKwl9CisgICAKKwlyZXR1cm4gIC1FTk9ERVY7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQKK3NibmlfaW9jdGwoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2LCAgc3RydWN0IGlmcmVxICAqaWZyLCAgaW50ICBjbWQgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsgCisJc3RydWN0IHNibmlfZmxhZ3MgIGZsYWdzOworCWludCAgZXJyb3IgPSAwOworCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJc3RydWN0IG5ldF9kZXZpY2UgICpzbGF2ZV9kZXY7CisJY2hhciAgc2xhdmVfbmFtZVsgOCBdOworI2VuZGlmCisgIAorCXN3aXRjaCggY21kICkgeworCWNhc2UgIFNJT0NERVZHRVRJTlNUQVRTIDoKKwkJaWYgKGNvcHlfdG9fdXNlciggaWZyLT5pZnJfZGF0YSwgJm5sLT5pbl9zdGF0cywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBzYm5pX2luX3N0YXRzKSApKQorCQkJZXJyb3IgPSAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgIFNJT0NERVZSRVNJTlNUQVRTIDoKKwkJaWYoIGN1cnJlbnQtPmV1aWQgIT0gMCApCS8qIHJvb3Qgb25seSAqLworCQkJcmV0dXJuICAtRVBFUk07CisJCW1lbXNldCggJm5sLT5pbl9zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBzYm5pX2luX3N0YXRzKSApOworCQlicmVhazsKKworCWNhc2UgIFNJT0NERVZHSFdTVEFURSA6CisJCWZsYWdzLm1hY19hZGRyCT0gKih1MzIgKikoZGV2LT5kZXZfYWRkciArIDMpOworCQlmbGFncy5yYXRlCT0gbmwtPmNzcjEucmF0ZTsKKwkJZmxhZ3Muc2xvd19tb2RlCT0gKG5sLT5zdGF0ZSAmIEZMX1NMT1dfTU9ERSkgIT0gMDsKKwkJZmxhZ3MucnhsCT0gbmwtPmN1cl9yeGxfaW5kZXg7CisJCWZsYWdzLmZpeGVkX3J4bAk9IG5sLT5kZWx0YV9yeGwgPT0gMDsKKworCQlpZiAoY29weV90b191c2VyKCBpZnItPmlmcl9kYXRhLCAmZmxhZ3MsIHNpemVvZiBmbGFncyApKQorCQkJZXJyb3IgPSAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgIFNJT0NERVZTSFdTVEFURSA6CisJCWlmKCBjdXJyZW50LT5ldWlkICE9IDAgKQkvKiByb290IG9ubHkgKi8KKwkJCXJldHVybiAgLUVQRVJNOworCisJCXNwaW5fbG9jayggJm5sLT5sb2NrICk7CisJCWZsYWdzID0gKihzdHJ1Y3Qgc2JuaV9mbGFncyopICZpZnItPmlmcl9pZnJ1OworCQlpZiggZmxhZ3MuZml4ZWRfcnhsICkKKwkJCW5sLT5kZWx0YV9yeGwgPSAwLAorCQkJbmwtPmN1cl9yeGxfaW5kZXggPSBmbGFncy5yeGw7CisJCWVsc2UKKwkJCW5sLT5kZWx0YV9yeGwgPSBERUZfUlhMX0RFTFRBLAorCQkJbmwtPmN1cl9yeGxfaW5kZXggPSBERUZfUlhMOworCisJCW5sLT5jc3IxLnJ4bCA9IHJ4bF90YWJbIG5sLT5jdXJfcnhsX2luZGV4IF07CisJCW5sLT5jc3IxLnJhdGUgPSBmbGFncy5yYXRlOworCQlvdXRiKCAqKHU4ICopJm5sLT5jc3IxIHwgUFJfUkVTLCBkZXYtPmJhc2VfYWRkciArIENTUjEgKTsKKwkJc3Bpbl91bmxvY2soICZubC0+bG9jayApOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCisJY2FzZSAgU0lPQ0RFVkVOU0xBVkUgOgorCQlpZiggY3VycmVudC0+ZXVpZCAhPSAwICkJLyogcm9vdCBvbmx5ICovCisJCQlyZXR1cm4gIC1FUEVSTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoIHNsYXZlX25hbWUsIGlmci0+aWZyX2RhdGEsIHNpemVvZiBzbGF2ZV9uYW1lICkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc2xhdmVfZGV2ID0gZGV2X2dldF9ieV9uYW1lKCBzbGF2ZV9uYW1lICk7CisJCWlmKCAhc2xhdmVfZGV2ICB8fCAgIShzbGF2ZV9kZXYtPmZsYWdzICYgSUZGX1VQKSApIHsKKwkJCXByaW50ayggS0VSTl9FUlIgIiVzOiB0cnlpbmcgdG8gZW5zbGF2ZSBub24tYWN0aXZlICIKKwkJCQkiZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUsIHNsYXZlX25hbWUgKTsKKwkJCXJldHVybiAgLUVQRVJNOworCQl9CisKKwkJcmV0dXJuICBlbnNsYXZlKCBkZXYsIHNsYXZlX2RldiApOworCisJY2FzZSAgU0lPQ0RFVkVNQU5TSVBBVEUgOgorCQlpZiggY3VycmVudC0+ZXVpZCAhPSAwICkJLyogcm9vdCBvbmx5ICovCisJCQlyZXR1cm4gIC1FUEVSTTsKKworCQlyZXR1cm4gIGVtYW5jaXBhdGUoIGRldiApOworCisjZW5kaWYJLyogQ09ORklHX1NCTklfTVVMVElMSU5FICovCisKKwlkZWZhdWx0IDoKKwkJcmV0dXJuICAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gIGVycm9yOworfQorCisKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKworc3RhdGljIGludAorZW5zbGF2ZSggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYsICBzdHJ1Y3QgbmV0X2RldmljZSAgKnNsYXZlX2RldiApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2xvY2FsICAqc25sID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgc2xhdmVfZGV2LT5wcml2OworCisJaWYoIG5sLT5zdGF0ZSAmIEZMX1NMQVZFICkJLyogVGhpcyBpc24ndCBtYXN0ZXIgb3IgZnJlZSBkZXZpY2UgKi8KKwkJcmV0dXJuICAtRUJVU1k7CisKKwlpZiggc25sLT5zdGF0ZSAmIEZMX1NMQVZFICkJLyogVGhhdCB3YXMgYWxyZWFkeSBlbnNsYXZlZCAqLworCQlyZXR1cm4gIC1FQlVTWTsKKworCXNwaW5fbG9jayggJm5sLT5sb2NrICk7CisJc3Bpbl9sb2NrKCAmc25sLT5sb2NrICk7CisKKwkvKiBhcHBlbmQgdG8gbGlzdCAqLworCXNubC0+bGluayA9IG5sLT5saW5rOworCW5sLT5saW5rICA9IHNsYXZlX2RldjsKKwlzbmwtPm1hc3RlciA9IGRldjsKKwlzbmwtPnN0YXRlIHw9IEZMX1NMQVZFOworCisJLyogU3VtbWFyeSBzdGF0aXN0aWNzIG9mIE11bHRpTGluZSBvcGVyYXRpb24gd2lsbCBiZSBzdG9yZWQKKwkgICBpbiBtYXN0ZXIncyBjb3VudGVycyAqLworCW1lbXNldCggJnNubC0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykgKTsKKwluZXRpZl9zdG9wX3F1ZXVlKCBzbGF2ZV9kZXYgKTsKKwluZXRpZl93YWtlX3F1ZXVlKCBkZXYgKTsJLyogTm93IHdlIGFyZSBhYmxlIHRvIHRyYW5zbWl0ICovCisKKwlzcGluX3VubG9jayggJnNubC0+bG9jayApOworCXNwaW5fdW5sb2NrKCAmbmwtPmxvY2sgKTsKKwlwcmludGsoIEtFUk5fTk9USUNFICIlczogc2xhdmUgZGV2aWNlICglcykgYXR0YWNoZWQuXG4iLAorCQlkZXYtPm5hbWUsIHNsYXZlX2Rldi0+bmFtZSApOworCXJldHVybiAgMDsKK30KKworCitzdGF0aWMgaW50CitlbWFuY2lwYXRlKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgICpzbmwgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgICpwICAgPSBzbmwtPm1hc3RlcjsKKwlzdHJ1Y3QgbmV0X2xvY2FsICAgKm5sICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIHAtPnByaXY7CisKKwlpZiggIShzbmwtPnN0YXRlICYgRkxfU0xBVkUpICkKKwkJcmV0dXJuICAtRUlOVkFMOworCisJc3Bpbl9sb2NrKCAmbmwtPmxvY2sgKTsKKwlzcGluX2xvY2soICZzbmwtPmxvY2sgKTsKKwlkcm9wX3htaXRfcXVldWUoIGRldiApOworCisJLyogZXhjbHVkZSBmcm9tIGxpc3QgKi8KKwlmb3IoOzspIHsJLyogbXVzdCBiZSBpbiBsaXN0ICovCisJCXN0cnVjdCBuZXRfbG9jYWwgICp0ID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgcC0+cHJpdjsKKwkJaWYoIHQtPmxpbmsgPT0gZGV2ICkgeworCQkJdC0+bGluayA9IHNubC0+bGluazsKKwkJCWJyZWFrOworCQl9CisJCXAgPSB0LT5saW5rOworCX0KKworCXNubC0+bGluayA9IE5VTEw7CisJc25sLT5tYXN0ZXIgPSBkZXY7CisJc25sLT5zdGF0ZSAmPSB+RkxfU0xBVkU7CisKKwluZXRpZl9zdGFydF9xdWV1ZSggZGV2ICk7CisKKwlzcGluX3VubG9jayggJnNubC0+bG9jayApOworCXNwaW5fdW5sb2NrKCAmbmwtPmxvY2sgKTsKKworCWRldl9wdXQoIGRldiApOworCXJldHVybiAgMDsKK30KKworI2VuZGlmCisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK3NibmlfZ2V0X3N0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJcmV0dXJuICAmKChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdiktPnN0YXRzOworfQorCisKK3N0YXRpYyB2b2lkCitzZXRfbXVsdGljYXN0X2xpc3QoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlyZXR1cm47CQkvKiBzYm5pIGFsd2F5cyBvcGVyYXRlIGluIHByb21pc2N1b3MgbW9kZSAqLworfQorCisKKyNpZmRlZiBNT0RVTEUKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoYmF1ZCwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShyeGwsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWFjLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKHNraXBfcGNpX3Byb2JlLCBib29sLCAwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKK2ludAoraW5pdF9tb2R1bGUoIHZvaWQgKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICAqZGV2OworCWludCBlcnI7CisKKwl3aGlsZSggbnVtIDwgU0JOSV9NQVhfTlVNX0NBUkRTICkgeworCQlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpLCAKKwkJCQkgICAic2JuaSVkIiwgc2JuaV9kZXZzZXR1cCk7CisJCWlmKCAhZGV2KQorCQkJYnJlYWs7CisKKwkJc3ByaW50ZiggZGV2LT5uYW1lLCAic2JuaSVkIiwgbnVtICk7CisKKwkJZXJyID0gc2JuaV9pbml0KGRldik7CisJCWlmIChlcnIpIHsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQlicmVhazsKKwkJfQorCisJCWlmKCByZWdpc3Rlcl9uZXRkZXYoIGRldiApICkgeworCQkJcmVsZWFzZV9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCBTQk5JX0lPX0VYVEVOVCApOworCQkJZnJlZV9uZXRkZXYoIGRldiApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gICpzYm5pX2NhcmRzICA/ICAwICA6ICAtRU5PREVWOworfQorCit2b2lkCitjbGVhbnVwX21vZHVsZSggdm9pZCApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgICpkZXY7CisJaW50ICBudW07CisKKwlmb3IoIG51bSA9IDA7ICBudW0gPCBTQk5JX01BWF9OVU1fQ0FSRFM7ICArK251bSApCisJCWlmKCAoZGV2ID0gc2JuaV9jYXJkc1sgbnVtIF0pICE9IE5VTEwgKSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldiggZGV2ICk7CisJCQlyZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIFNCTklfSU9fRVhURU5UICk7CisJCQlmcmVlX25ldGRldiggZGV2ICk7CisJCX0KK30KKworI2Vsc2UJLyogTU9EVUxFICovCisKK3N0YXRpYyBpbnQgX19pbml0CitzYm5pX3NldHVwKCBjaGFyICAqcCApCit7CisJaW50ICBuLCBwYXJtOworCisJaWYoICpwKysgIT0gJygnICkKKwkJZ290byAgYmFkX3BhcmFtOworCisJZm9yKCBuID0gMCwgcGFybSA9IDA7ICAqcCAgJiYgIG4gPCA4OyApIHsKKwkJKCpkZXN0WyBwYXJtIF0pWyBuIF0gPSBzaW1wbGVfc3RydG9sKCBwLCAmcCwgMCApOworCQlpZiggISpwICB8fCAgKnAgPT0gJyknICkKKwkJCXJldHVybiAxOworCQlpZiggKnAgPT0gJzsnICkKKwkJCSsrcCwgKytuLCBwYXJtID0gMDsKKwkJZWxzZSBpZiggKnArKyAhPSAnLCcgKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCWlmKCArK3Bhcm0gPj0gNSApCisJCQkJYnJlYWs7CisJfQorYmFkX3BhcmFtOgorCXByaW50ayggS0VSTl9FUlIgIkVycm9yIGluIHNibmkga2VybmVsIHBhcmFtZXRlciFcbiIgKTsKKwlyZXR1cm4gMDsKK30KKworX19zZXR1cCggInNibmk9Iiwgc2JuaV9zZXR1cCApOworCisjZW5kaWYJLyogTU9EVUxFICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBBU01fQ1JDCisKK3N0YXRpYyB1MzIKK2NhbGNfY3JjMzIoIHUzMiAgY3JjLCAgdTggICpwLCAgdTMyICBsZW4gKQoreworCXJlZ2lzdGVyIHUzMiAgX2NyYzsKKwlfY3JjID0gY3JjOworCQorCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJInhvcmwJJSVlYngsICUlZWJ4XG4iCisJCSJtb3ZsCSUyLCAlJWVzaVxuIiAKKwkJIm1vdmwJJTMsICUlZWN4XG4iIAorCQkibW92bAkkY3JjMzJ0YWIsICUlZWRpXG4iCisJCSJzaHJsCSQyLCAlJWVjeFxuIgorCQkianoJMWZcbiIKKworCQkiLmFsaWduIDRcbiIKKwkiMDpcbiIKKwkJIm1vdmIJJSVhbCwgJSVibFxuIgorCQkibW92bAkoJSVlc2kpLCAlJWVkeFxuIgorCQkic2hybAkkOCwgJSVlYXhcbiIKKwkJInhvcmIJJSVkbCwgJSVibFxuIgorCQkic2hybAkkOCwgJSVlZHhcbiIKKwkJInhvcmwJKCUlZWRpLCUlZWJ4LDQpLCAlJWVheFxuIgorCisJCSJtb3ZiCSUlYWwsICUlYmxcbiIKKwkJInNocmwJJDgsICUlZWF4XG4iCisJCSJ4b3JiCSUlZGwsICUlYmxcbiIKKwkJInNocmwJJDgsICUlZWR4XG4iCisJCSJ4b3JsCSglJWVkaSwlJWVieCw0KSwgJSVlYXhcbiIKKworCQkibW92YgklJWFsLCAlJWJsXG4iCisJCSJzaHJsCSQ4LCAlJWVheFxuIgorCQkieG9yYgklJWRsLCAlJWJsXG4iCisJCSJtb3ZiCSUlZGgsICUlZGxcbiIgCisJCSJ4b3JsCSglJWVkaSwlJWVieCw0KSwgJSVlYXhcbiIKKworCQkibW92YgklJWFsLCAlJWJsXG4iCisJCSJzaHJsCSQ4LCAlJWVheFxuIgorCQkieG9yYgklJWRsLCAlJWJsXG4iCisJCSJhZGRsCSQ0LCAlJWVzaVxuIgorCQkieG9ybAkoJSVlZGksJSVlYngsNCksICUlZWF4XG4iCisKKwkJImRlY2wJJSVlY3hcbiIKKwkJImpuegkwYlxuIgorCisJIjE6XG4iCisJCSJtb3ZsCSUzLCAlJWVjeFxuIgorCQkiYW5kbAkkMywgJSVlY3hcbiIKKwkJImp6CTJmXG4iCisKKwkJIm1vdmIJJSVhbCwgJSVibFxuIgorCQkic2hybAkkOCwgJSVlYXhcbiIKKwkJInhvcmIJKCUlZXNpKSwgJSVibFxuIgorCQkieG9ybAkoJSVlZGksJSVlYngsNCksICUlZWF4XG4iCisKKwkJImRlY2wJJSVlY3hcbiIKKwkJImp6CTJmXG4iCisKKwkJIm1vdmIJJSVhbCwgJSVibFxuIgorCQkic2hybAkkOCwgJSVlYXhcbiIKKwkJInhvcmIJMSglJWVzaSksICUlYmxcbiIKKwkJInhvcmwJKCUlZWRpLCUlZWJ4LDQpLCAlJWVheFxuIgorCisJCSJkZWNsCSUlZWN4XG4iCisJCSJqegkyZlxuIgorCisJCSJtb3ZiCSUlYWwsICUlYmxcbiIKKwkJInNocmwJJDgsICUlZWF4XG4iCisJCSJ4b3JiCTIoJSVlc2kpLCAlJWJsXG4iCisJCSJ4b3JsCSglJWVkaSwlJWVieCw0KSwgJSVlYXhcbiIKKwkiMjpcbiIKKwkJOiAiPWEiIChfY3JjKQorCQk6ICIwIiAoX2NyYyksICJnIiAocCksICJnIiAobGVuKQorCQk6ICJieCIsICJjeCIsICJkeCIsICJzaSIsICJkaSIKKwkpOworCisJcmV0dXJuICBfY3JjOworfQorCisjZWxzZQkvKiBBU01fQ1JDICovCisKK3N0YXRpYyB1MzIKK2NhbGNfY3JjMzIoIHUzMiAgY3JjLCAgdTggICpwLCAgdTMyICBsZW4gKQoreworCXdoaWxlKCBsZW4tLSApCisJCWNyYyA9IENSQzMyKCAqcCsrLCBjcmMgKTsKKworCXJldHVybiAgY3JjOworfQorCisjZW5kaWYJLyogQVNNX0NSQyAqLworCisKK3N0YXRpYyB1MzIgIGNyYzMydGFiW10gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKSA9IHsKKwkweEQyMDJFRjhELCAgMHhBNTA1REYxQiwgIDB4M0MwQzhFQTEsICAweDRCMEJCRTM3LAorCTB4RDU2RjJCOTQsICAweEEyNjgxQjAyLCAgMHgzQjYxNEFCOCwgIDB4NEM2NjdBMkUsCisJMHhEQ0Q5NjdCRiwgIDB4QUJERTU3MjksICAweDMyRDcwNjkzLCAgMHg0NUQwMzYwNSwKKwkweERCQjRBM0E2LCAgMHhBQ0IzOTMzMCwgIDB4MzVCQUMyOEEsICAweDQyQkRGMjFDLAorCTB4Q0ZCNUZGRTksICAweEI4QjJDRjdGLCAgMHgyMUJCOUVDNSwgIDB4NTZCQ0FFNTMsCisJMHhDOEQ4M0JGMCwgIDB4QkZERjBCNjYsICAweDI2RDY1QURDLCAgMHg1MUQxNkE0QSwKKwkweEMxNkU3N0RCLCAgMHhCNjY5NDc0RCwgIDB4MkY2MDE2RjcsICAweDU4NjcyNjYxLAorCTB4QzYwM0IzQzIsICAweEIxMDQ4MzU0LCAgMHgyODBERDJFRSwgIDB4NUYwQUUyNzgsCisJMHhFOTZDQ0Y0NSwgIDB4OUU2QkZGRDMsICAweDA3NjJBRTY5LCAgMHg3MDY1OUVGRiwKKwkweEVFMDEwQjVDLCAgMHg5OTA2M0JDQSwgIDB4MDAwRjZBNzAsICAweDc3MDg1QUU2LAorCTB4RTdCNzQ3NzcsICAweDkwQjA3N0UxLCAgMHgwOUI5MjY1QiwgIDB4N0VCRTE2Q0QsCisJMHhFMERBODM2RSwgIDB4OTdEREIzRjgsICAweDBFRDRFMjQyLCAgMHg3OUQzRDJENCwKKwkweEY0REJERjIxLCAgMHg4M0RDRUZCNywgIDB4MUFENUJFMEQsICAweDZERDI4RTlCLAorCTB4RjNCNjFCMzgsICAweDg0QjEyQkFFLCAgMHgxREI4N0ExNCwgIDB4NkFCRjRBODIsCisJMHhGQTAwNTcxMywgIDB4OEQwNzY3ODUsICAweDE0MEUzNjNGLCAgMHg2MzA5MDZBOSwKKwkweEZENkQ5MzBBLCAgMHg4QTZBQTM5QywgIDB4MTM2M0YyMjYsICAweDY0NjRDMkIwLAorCTB4QTRERUFFMUQsICAweEQzRDk5RThCLCAgMHg0QUQwQ0YzMSwgIDB4M0REN0ZGQTcsCisJMHhBM0IzNkEwNCwgIDB4RDRCNDVBOTIsICAweDREQkQwQjI4LCAgMHgzQUJBM0JCRSwKKwkweEFBMDUyNjJGLCAgMHhERDAyMTZCOSwgIDB4NDQwQjQ3MDMsICAweDMzMEM3Nzk1LAorCTB4QUQ2OEUyMzYsICAweERBNkZEMkEwLCAgMHg0MzY2ODMxQSwgIDB4MzQ2MUIzOEMsCisJMHhCOTY5QkU3OSwgIDB4Q0U2RThFRUYsICAweDU3NjdERjU1LCAgMHgyMDYwRUZDMywKKwkweEJFMDQ3QTYwLCAgMHhDOTAzNEFGNiwgIDB4NTAwQTFCNEMsICAweDI3MEQyQkRBLAorCTB4QjdCMjM2NEIsICAweEMwQjUwNkRELCAgMHg1OUJDNTc2NywgIDB4MkVCQjY3RjEsCisJMHhCMERGRjI1MiwgIDB4QzdEOEMyQzQsICAweDVFRDE5MzdFLCAgMHgyOUQ2QTNFOCwKKwkweDlGQjA4RUQ1LCAgMHhFOEI3QkU0MywgIDB4NzFCRUVGRjksICAweDA2QjlERjZGLAorCTB4OThERDRBQ0MsICAweEVGREE3QTVBLCAgMHg3NkQzMkJFMCwgIDB4MDFENDFCNzYsCisJMHg5MTZCMDZFNywgIDB4RTY2QzM2NzEsICAweDdGNjU2N0NCLCAgMHgwODYyNTc1RCwKKwkweDk2MDZDMkZFLCAgMHhFMTAxRjI2OCwgIDB4NzgwOEEzRDIsICAweDBGMEY5MzQ0LAorCTB4ODIwNzlFQjEsICAweEY1MDBBRTI3LCAgMHg2QzA5RkY5RCwgIDB4MUIwRUNGMEIsCisJMHg4NTZBNUFBOCwgIDB4RjI2RDZBM0UsICAweDZCNjQzQjg0LCAgMHgxQzYzMEIxMiwKKwkweDhDREMxNjgzLCAgMHhGQkRCMjYxNSwgIDB4NjJEMjc3QUYsICAweDE1RDU0NzM5LAorCTB4OEJCMUQyOUEsICAweEZDQjZFMjBDLCAgMHg2NUJGQjNCNiwgIDB4MTJCODgzMjAsCisJMHgzRkJBNkNBRCwgIDB4NDhCRDVDM0IsICAweEQxQjQwRDgxLCAgMHhBNkIzM0QxNywKKwkweDM4RDdBOEI0LCAgMHg0RkQwOTgyMiwgIDB4RDZEOUM5OTgsICAweEExREVGOTBFLAorCTB4MzE2MUU0OUYsICAweDQ2NjZENDA5LCAgMHhERjZGODVCMywgIDB4QTg2OEI1MjUsCisJMHgzNjBDMjA4NiwgIDB4NDEwQjEwMTAsICAweEQ4MDI0MUFBLCAgMHhBRjA1NzEzQywKKwkweDIyMEQ3Q0M5LCAgMHg1NTBBNEM1RiwgIDB4Q0MwMzFERTUsICAweEJCMDQyRDczLAorCTB4MjU2MEI4RDAsICAweDUyNjc4ODQ2LCAgMHhDQjZFRDlGQywgIDB4QkM2OUU5NkEsCisJMHgyQ0Q2RjRGQiwgIDB4NUJEMUM0NkQsICAweEMyRDg5NUQ3LCAgMHhCNURGQTU0MSwKKwkweDJCQkIzMEUyLCAgMHg1Q0JDMDA3NCwgIDB4QzVCNTUxQ0UsICAweEIyQjI2MTU4LAorCTB4MDRENDRDNjUsICAweDczRDM3Q0YzLCAgMHhFQURBMkQ0OSwgIDB4OURERDFEREYsCisJMHgwM0I5ODg3QywgIDB4NzRCRUI4RUEsICAweEVEQjdFOTUwLCAgMHg5QUIwRDlDNiwKKwkweDBBMEZDNDU3LCAgMHg3RDA4RjRDMSwgIDB4RTQwMUE1N0IsICAweDkzMDY5NUVELAorCTB4MEQ2MjAwNEUsICAweDdBNjUzMEQ4LCAgMHhFMzZDNjE2MiwgIDB4OTQ2QjUxRjQsCisJMHgxOTYzNUMwMSwgIDB4NkU2NDZDOTcsICAweEY3NkQzRDJELCAgMHg4MDZBMERCQiwKKwkweDFFMEU5ODE4LCAgMHg2OTA5QTg4RSwgIDB4RjAwMEY5MzQsICAweDg3MDdDOUEyLAorCTB4MTdCOEQ0MzMsICAweDYwQkZFNEE1LCAgMHhGOUI2QjUxRiwgIDB4OEVCMTg1ODksCisJMHgxMEQ1MTAyQSwgIDB4NjdEMjIwQkMsICAweEZFREI3MTA2LCAgMHg4OURDNDE5MCwKKwkweDQ5NjYyRDNELCAgMHgzRTYxMURBQiwgIDB4QTc2ODRDMTEsICAweEQwNkY3Qzg3LAorCTB4NEUwQkU5MjQsICAweDM5MENEOUIyLCAgMHhBMDA1ODgwOCwgIDB4RDcwMkI4OUUsCisJMHg0N0JEQTUwRiwgIDB4MzBCQTk1OTksICAweEE5QjNDNDIzLCAgMHhERUI0RjRCNSwKKwkweDQwRDA2MTE2LCAgMHgzN0Q3NTE4MCwgIDB4QUVERTAwM0EsICAweEQ5RDkzMEFDLAorCTB4NTREMTNENTksICAweDIzRDYwRENGLCAgMHhCQURGNUM3NSwgIDB4Q0REODZDRTMsCisJMHg1M0JDRjk0MCwgIDB4MjRCQkM5RDYsICAweEJEQjI5ODZDLCAgMHhDQUI1QThGQSwKKwkweDVBMEFCNTZCLCAgMHgyRDBEODVGRCwgIDB4QjQwNEQ0NDcsICAweEMzMDNFNEQxLAorCTB4NUQ2NzcxNzIsICAweDJBNjA0MUU0LCAgMHhCMzY5MTA1RSwgIDB4QzQ2RTIwQzgsCisJMHg3MjA4MERGNSwgIDB4MDUwRjNENjMsICAweDlDMDY2Q0Q5LCAgMHhFQjAxNUM0RiwKKwkweDc1NjVDOUVDLCAgMHgwMjYyRjk3QSwgIDB4OUI2QkE4QzAsICAweEVDNkM5ODU2LAorCTB4N0NEMzg1QzcsICAweDBCRDRCNTUxLCAgMHg5MkRERTRFQiwgIDB4RTVEQUQ0N0QsCisJMHg3QkJFNDFERSwgIDB4MENCOTcxNDgsICAweDk1QjAyMEYyLCAgMHhFMkI3MTA2NCwKKwkweDZGQkYxRDkxLCAgMHgxOEI4MkQwNywgIDB4ODFCMTdDQkQsICAweEY2QjY0QzJCLAorCTB4NjhEMkQ5ODgsICAweDFGRDVFOTFFLCAgMHg4NkRDQjhBNCwgIDB4RjFEQjg4MzIsCisJMHg2MTY0OTVBMywgIDB4MTY2M0E1MzUsICAweDhGNkFGNDhGLCAgMHhGODZEQzQxOSwKKwkweDY2MDk1MUJBLCAgMHgxMTBFNjEyQywgIDB4ODgwNzMwOTYsICAweEZGMDAwMDAwCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc2JuaS5oIGIvZHJpdmVycy9uZXQvd2FuL3NibmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzcxNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NibmkuaApAQCAtMCwwICsxLDE0MSBAQAorLyogc2JuaS5oOiAgZGVmaW5pdGlvbnMgZm9yIGEgR3JhbmNoIFNCTkkxMiBkcml2ZXIsIHZlcnNpb24gNS4wLjAKKyAqIFdyaXR0ZW4gMjAwMSBEZW5pcyBJLlRpbW9mZWV2ICh0aW1vZmVldkBncmFuY2gucnUpCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHUEwKKyAqLworCisjaWZuZGVmIFNCTklfSAorI2RlZmluZSBTQk5JX0gKKworI2lmZGVmIFNCTklfREVCVUcKKyNkZWZpbmUgRFAoIEEgKSBBCisjZWxzZQorI2RlZmluZSBEUCggQSApCisjZW5kaWYKKworCisvKiBXZSBkb24ndCBoYXZlIG9mZmljaWFsIHZlbmRvciBpZCB5ZXQuLi4gKi8KKyNkZWZpbmUgU0JOSV9QQ0lfVkVORE9SIAkweDU1IAorI2RlZmluZSBTQk5JX1BDSV9ERVZJQ0UgCTB4OWYKKworI2RlZmluZSBJU0FfTU9ERSAweDAwCisjZGVmaW5lIFBDSV9NT0RFIDB4MDEKKworI2RlZmluZQlTQk5JX0lPX0VYVEVOVAk0CisKK2VudW0gc2JuaV9yZWcgeworCUNTUjAgPSAwLAorCUNTUjEgPSAxLAorCURBVCAgPSAyCit9OworCisvKiBDU1IwIG1hcHBpbmcgKi8KK2VudW0geworCUJVX0VNUCA9IDB4MDIsCisJUkNfQ0hLID0gMHgwNCwKKwlDVF9aRVIgPSAweDA4LAorCVRSX1JFUSA9IDB4MTAsCisJVFJfUkRZID0gMHgyMCwKKwlFTl9JTlQgPSAweDQwLAorCVJDX1JEWSA9IDB4ODAKK307CisKKworLyogQ1NSMSBtYXBwaW5nICovCisjZGVmaW5lIFBSX1JFUyAweDgwCisKK3N0cnVjdCBzYm5pX2NzcjEgeworCXVuc2lnbmVkIHJ4bAk6IDU7CisJdW5zaWduZWQgcmF0ZQk6IDI7CisJdW5zaWduZWQgCTogMTsKK307CisKKy8qIGZpZWxkcyBpbiBmcmFtZSBoZWFkZXIgKi8KKyNkZWZpbmUgRlJBTUVfQUNLX01BU0sgICh1bnNpZ25lZCBzaG9ydCkweDcwMDAKKyNkZWZpbmUgRlJBTUVfTEVOX01BU0sgICh1bnNpZ25lZCBzaG9ydCkweDAzRkYKKyNkZWZpbmUgRlJBTUVfRklSU1QgICAgICh1bnNpZ25lZCBzaG9ydCkweDgwMDAKKyNkZWZpbmUgRlJBTUVfUkVUUlkgICAgICh1bnNpZ25lZCBzaG9ydCkweDA4MDAKKworI2RlZmluZSBGUkFNRV9TRU5UX0JBRCAgKHVuc2lnbmVkIHNob3J0KTB4NDAwMAorI2RlZmluZSBGUkFNRV9TRU5UX09LICAgKHVuc2lnbmVkIHNob3J0KTB4MzAwMAorCisKKy8qIHN0YXRlIGZsYWdzICovCitlbnVtIHsKKwlGTF9XQUlUX0FDSyAgICA9IDB4MDEsCisJRkxfTkVFRF9SRVNFTkQgPSAweDAyLAorCUZMX1BSRVZfT0sgICAgID0gMHgwNCwKKwlGTF9TTE9XX01PREUgICA9IDB4MDgsCisJRkxfU0VDT05EQVJZICAgPSAweDEwLAorI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCUZMX1NMQVZFICAgICAgID0gMHgyMCwKKyNlbmRpZgorCUZMX0xJTkVfRE9XTiAgID0gMHg0MAorfTsKKworCitlbnVtIHsKKwlERUZBVUxUX0lPQkFTRUFERFIgPSAweDIxMCwKKwlERUZBVUxUX0lOVEVSUlVQVE5VTUJFUiA9IDUsCisJREVGQVVMVF9SQVRFID0gMCwKKwlERUZBVUxUX0ZSQU1FX0xFTiA9IDEwMTIKK307CisKKyNkZWZpbmUgREVGX1JYTF9ERUxUQQktMQorI2RlZmluZSBERUZfUlhMCQkweGYKKworI2RlZmluZSBTQk5JX1NJRyAweDVhCisKKyNkZWZpbmUJU0JOSV9NSU5fTEVOCTYwCS8qIFNob3J0ZXN0IEV0aGVybmV0IGZyYW1lIHdpdGhvdXQgRkNTICovCisjZGVmaW5lIFNCTklfTUFYX0ZSQU1FCTEwMjMKKyNkZWZpbmUgRVRIRVJfTUFYX0xFTgkxNTE4CisKKyNkZWZpbmUgU0JOSV9USU1FT1VUCShIWi8xMCkKKworI2RlZmluZSBUUl9FUlJPUl9DT1VOVAkzMgorI2RlZmluZSBDSEFOR0VfTEVWRUxfU1RBUlRfVElDS1MgNAorCisjZGVmaW5lIFNCTklfTUFYX05VTV9DQVJEUwkxNgorCisvKiBpbnRlcm5hbCBTQk5JLXNwZWNpZmljIHN0YXRpc3RpY3MgKi8KK3N0cnVjdCBzYm5pX2luX3N0YXRzIHsKKwl1MzIJYWxsX3J4X251bWJlcjsKKwl1MzIJYmFkX3J4X251bWJlcjsKKwl1MzIJdGltZW91dF9udW1iZXI7CisJdTMyCWFsbF90eF9udW1iZXI7CisJdTMyCXJlc2VuZF90eF9udW1iZXI7Cit9OworCisvKiBTQk5JIGlvY3RsIHBhcmFtcyAqLworI2RlZmluZSBTSU9DREVWR0VUSU5TVEFUUyAJU0lPQ0RFVlBSSVZBVEUKKyNkZWZpbmUgU0lPQ0RFVlJFU0lOU1RBVFMgCVNJT0NERVZQUklWQVRFKzEKKyNkZWZpbmUgU0lPQ0RFVkdIV1NUQVRFICAgCVNJT0NERVZQUklWQVRFKzIKKyNkZWZpbmUgU0lPQ0RFVlNIV1NUQVRFICAgCVNJT0NERVZQUklWQVRFKzMKKyNkZWZpbmUgU0lPQ0RFVkVOU0xBVkUgIAlTSU9DREVWUFJJVkFURSs0CisjZGVmaW5lIFNJT0NERVZFTUFOU0lQQVRFICAJU0lPQ0RFVlBSSVZBVEUrNQorCisKKy8qIGRhdGEgcGFja2V0IGZvciBTSU9DREVWR0hXU1RBVEUvU0lPQ0RFVlNIV1NUQVRFIGlvY3RsIHJlcXVlc3RzICovCitzdHJ1Y3Qgc2JuaV9mbGFncyB7CisJdTMyCXJ4bAkJOiA0OworCXUzMglyYXRlCQk6IDI7CisJdTMyCWZpeGVkX3J4bAk6IDE7CisJdTMyCXNsb3dfbW9kZQk6IDE7CisJdTMyCW1hY19hZGRyCTogMjQ7Cit9OworCisvKgorICogQ1JDLTMyIHN0dWZmCisgKi8KKyNkZWZpbmUgQ1JDMzIoYyxjcmMpIChjcmMzMnRhYlsoKHNpemVfdCkoY3JjKSBeIChjKSkgJiAweGZmXSBeICgoKGNyYykgPj4gOCkgJiAweDAwRkZGRkZGKSkKKyAgICAgIC8qIENSQyBnZW5lcmF0b3IgMHhFREI4ODMyMCAqLworICAgICAgLyogQ1JDIHJlbWFpbmRlciAweDIxNDRERjFDICovCisgICAgICAvKiBDUkMgaW5pdGlhbCB2YWx1ZSAweDAwMDAwMDAwICovCisjZGVmaW5lIENSQzMyX1JFTUFJTkRFUiAweDIxNDRERjFDCisjZGVmaW5lIENSQzMyX0lOSVRJQUwgMHgwMDAwMDAwMAorCisjaWZuZGVmIF9faW5pdGRhdGEKKyNkZWZpbmUgX19pbml0ZGF0YQorI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc2RsYS5jIGIvZHJpdmVycy9uZXQvd2FuL3NkbGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWM5YTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NkbGEuYwpAQCAtMCwwICsxLDE2NzYgQEAKKy8qCisgKiBTRExBCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGRyaXZlciBmb3IgdGhlIFNhbmdvbWEgUzUwMi9TNTA4IHNlcmllcworICoJCW11bHRpLXByb3RvY29sIFBDIGludGVyZmFjZSBjYXJkLiAgSW5pdGlhbCBvZmZlcmluZyBpcyB3aXRoIAorICoJCXRoZSBETENJIGRyaXZlciwgcHJvdmlkaW5nIEZyYW1lIFJlbGF5IHN1cHBvcnQgZm9yIGxpbnV4LgorICoKKyAqCQlHbG9iYWwgZGVmaW5pdGlvbnMgZm9yIHRoZSBGcmFtZSByZWxheSBpbnRlcmZhY2UuCisgKgorICogVmVyc2lvbjoJQCgjKXNkbGEuYyAgIDAuMzAJMTIgU2VwIDE5OTYKKyAqCisgKiBDcmVkaXRzOglTYW5nb21hIFRlY2hub2xvZ2llcywgZm9yIHRoZSB1c2Ugb2YgMiBjYXJkcyBmb3IgYW4gZXh0ZW5kZWQKKyAqCQkJcGVyaW9kIG9mIHRpbWUuCisgKgkJRGF2aWQgTWFuZGVsc3RhbSA8ZG1Ac2FuZ29tYS5jb20+IGZvciBnZXR0aW5nIG1lIHN0YXJ0ZWQgb24gCisgKgkJCXRoaXMgcHJvamVjdCwgYW5kIGluY2VudGl2ZSB0byBjb21wbGV0ZSBpdC4KKyAqCQlHZW5lIEtvemVuIDw3NDYwNC4xNTJAY29tcHVzZXJ2ZS5jb20+IGZvciBwcm92aWRpbmcgbWUgd2l0aAorICoJCQlpbXBvcnRhbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhcmRzLgorICoKKyAqIEF1dGhvcjoJTWlrZSBNY0xhZ2FuIDxtaWtlLm1jbGFnYW5AbGludXgub3JnPgorICoKKyAqIENoYW5nZXM6CisgKgkJMC4xNQlNaWtlIE1jTGFnYW4JSW1wcm92ZWQgZXJyb3IgaGFuZGxpbmcsIHBhY2tldCBkcm9wcGluZworICoJCTAuMjAJTWlrZSBNY0xhZ2FuCU5ldyB0cmFuc21pdC9yZWNlaXZlIGZsYWdzIGZvciBjb25maWcKKyAqCQkJCQlJZiBpbiBGUiBtb2RlLCBkb24ndCBhY2NlcHQgcGFja2V0cyBmcm9tCisgKgkJCQkJbm9uIERMQ0kgZGV2aWNlcy4KKyAqCQkwLjI1CU1pa2UgTWNMYWdhbglGaXhlZCBwcm9ibGVtIHdpdGggcmVqZWN0aW5nIHBhY2tldHMKKyAqCQkJCQlmcm9tIG5vbiBETENJIGRldmljZXMuCisgKgkJMC4zMAlNaWtlIE1jTGFnYW4JRml4ZWQga2VybmVsIHBhbmljIHdoZW4gdXNlZCB3aXRoIG1vZGlmaWVkCisgKgkJCQkJaWZjb25maWcKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+IC8qIGZvciBDT05GSUdfRExDSV9NQVggKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9mcmFkLmg+CisjaW5jbHVkZSA8bGludXgvc2RsYS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgY29uc3QgY2hhciogdmVyc2lvbiA9ICJTRExBIGRyaXZlciB2MC4zMCwgMTIgU2VwIDE5OTYsIG1pa2UubWNsYWdhbkBsaW51eC5vcmciOworCitzdGF0aWMgdW5zaWduZWQgaW50IHZhbGlkX3BvcnRbXSBfX2luaXRkYXRhID0geyAweDI1MCwgMHgyNzAsIDB4MjgwLCAweDMwMCwgMHgzNTAsIDB4MzYwLCAweDM4MCwgMHgzOTB9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHZhbGlkX21lbVtdICBfX2luaXRkYXRhID0geworCQkJCSAgICAweEEwMDAwLCAweEEyMDAwLCAweEE0MDAwLCAweEE2MDAwLCAweEE4MDAwLCAweEFBMDAwLCAweEFDMDAwLCAweEFFMDAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjAwMDAsIDB4QjIwMDAsIDB4QjQwMDAsIDB4QjYwMDAsIDB4QjgwMDAsIDB4QkEwMDAsIDB4QkMwMDAsIDB4QkUwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEMwMDAwLCAweEMyMDAwLCAweEM0MDAwLCAweEM2MDAwLCAweEM4MDAwLCAweENBMDAwLCAweENDMDAwLCAweENFMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEMDAwMCwgMHhEMjAwMCwgMHhENDAwMCwgMHhENjAwMCwgMHhEODAwMCwgMHhEQTAwMCwgMHhEQzAwMCwgMHhERTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTAwMDAsIDB4RTIwMDAsIDB4RTQwMDAsIDB4RTYwMDAsIDB4RTgwMDAsIDB4RUEwMDAsIDB4RUMwMDAsIDB4RUUwMDB9OyAKKworc3RhdGljIERFRklORV9TUElOTE9DSyhzZGxhX2xvY2spOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdGhlc2UgYXJlIHRoZSBjb3JlIHJvdXRpbmVzIHRoYXQgYWNjZXNzIHRoZSBjYXJkIGl0c2VsZiAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNETEFfV0lORE9XKGRldixhZGRyKSBvdXRiKCgoKGFkZHIpID4+IDEzKSAmIDB4MUYpLCAoZGV2KS0+YmFzZV9hZGRyICsgU0RMQV9SRUdfWjgwX1dJTkRPVykKKworc3RhdGljIHZvaWQgX19zZGxhX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFkZHIsIHZvaWQgKmJ1Ziwgc2hvcnQgbGVuKQoreworCWNoYXIgICAgICAgICAgKnRlbXA7CisJY29uc3Qgdm9pZCAgICAqYmFzZTsKKwlpbnQgICAgICAgICAgIG9mZnNldCwgYnl0ZXM7CisKKwl0ZW1wID0gYnVmOworCXdoaWxlKGxlbikKKwl7CQorCQlvZmZzZXQgPSBhZGRyICYgU0RMQV9BRERSX01BU0s7CisJCWJ5dGVzID0gb2Zmc2V0ICsgbGVuID4gU0RMQV9XSU5ET1dfU0laRSA/IFNETEFfV0lORE9XX1NJWkUgLSBvZmZzZXQgOiBsZW47CisJCWJhc2UgPSAoY29uc3Qgdm9pZCAqKSAoZGV2LT5tZW1fc3RhcnQgKyBvZmZzZXQpOworCisJCVNETEFfV0lORE9XKGRldiwgYWRkcik7CisJCW1lbWNweSh0ZW1wLCBiYXNlLCBieXRlcyk7CisKKwkJYWRkciArPSBieXRlczsKKwkJdGVtcCArPSBieXRlczsKKwkJbGVuICAtPSBieXRlczsKKwl9ICAKK30KKworc3RhdGljIHZvaWQgc2RsYV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhZGRyLCB2b2lkICpidWYsIHNob3J0IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZzZGxhX2xvY2ssIGZsYWdzKTsKKwlfX3NkbGFfcmVhZChkZXYsIGFkZHIsIGJ1ZiwgbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGxhX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgX19zZGxhX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhZGRyLCAKKwkJCSBjb25zdCB2b2lkICpidWYsIHNob3J0IGxlbikKK3sKKwljb25zdCBjaGFyICAgICp0ZW1wOworCXZvaWQgCSAgICAgICpiYXNlOworCWludCAgICAgICAgICAgb2Zmc2V0LCBieXRlczsKKworCXRlbXAgPSBidWY7CisJd2hpbGUobGVuKQorCXsKKwkJb2Zmc2V0ID0gYWRkciAmIFNETEFfQUREUl9NQVNLOworCQlieXRlcyA9IG9mZnNldCArIGxlbiA+IFNETEFfV0lORE9XX1NJWkUgPyBTRExBX1dJTkRPV19TSVpFIC0gb2Zmc2V0IDogbGVuOworCQliYXNlID0gKHZvaWQgKikgKGRldi0+bWVtX3N0YXJ0ICsgb2Zmc2V0KTsKKworCQlTRExBX1dJTkRPVyhkZXYsIGFkZHIpOworCQltZW1jcHkoYmFzZSwgdGVtcCwgYnl0ZXMpOworCisJCWFkZHIgKz0gYnl0ZXM7CisJCXRlbXAgKz0gYnl0ZXM7CisJCWxlbiAgLT0gYnl0ZXM7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZGxhX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhZGRyLCAKKwkJICAgICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2hvcnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2RsYV9sb2NrLCBmbGFncyk7CisJX19zZGxhX3dyaXRlKGRldiwgYWRkciwgYnVmLCBsZW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkbGFfbG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIHNkbGFfY2xlYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNoYXIgICAgICAgICAgKmJhc2U7CisJaW50ICAgICAgICAgICBsZW4sIGFkZHIsIGJ5dGVzOworCisJbGVuID0gNjU1MzY7CQorCWFkZHIgPSAwOworCWJ5dGVzID0gU0RMQV9XSU5ET1dfU0laRTsKKwliYXNlID0gKHZvaWQgKikgZGV2LT5tZW1fc3RhcnQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2RsYV9sb2NrLCBmbGFncyk7CisJd2hpbGUobGVuKQorCXsKKwkJU0RMQV9XSU5ET1coZGV2LCBhZGRyKTsKKwkJbWVtc2V0KGJhc2UsIDAsIGJ5dGVzKTsKKworCQlhZGRyICs9IGJ5dGVzOworCQlsZW4gIC09IGJ5dGVzOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGxhX2xvY2ssIGZsYWdzKTsKKworfQorCitzdGF0aWMgY2hhciBzZGxhX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyICAgICAgICAgIGJ5dGUsICp0ZW1wOworCisJdGVtcCA9ICh2b2lkICopIChkZXYtPm1lbV9zdGFydCArIChhZGRyICYgU0RMQV9BRERSX01BU0spKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZGxhX2xvY2ssIGZsYWdzKTsKKwlTRExBX1dJTkRPVyhkZXYsIGFkZHIpOworCWJ5dGUgPSAqdGVtcDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGxhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybihieXRlKTsKK30KKwordm9pZCBzZGxhX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCisJZmxwID0gZGV2LT5wcml2OworCXN3aXRjaChmbHAtPnR5cGUpCisJeworCQljYXNlIFNETEFfUzUwMkE6CisJCQlvdXRiKFNETEFfUzUwMkFfSEFMVCwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWZscC0+c3RhdGUgPSBTRExBX0hBTFQ7CisJCQlicmVhazsKKwkJY2FzZSBTRExBX1M1MDJFOgorCQkJb3V0YihTRExBX0hBTFQsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfWjgwX0NPTlRST0wpOworCQkJb3V0YihTRExBX1M1MDJFX0VOQUJMRSwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWZscC0+c3RhdGUgPSBTRExBX1M1MDJFX0VOQUJMRTsKKwkJCWJyZWFrOworCQljYXNlIFNETEFfUzUwNzoKKwkJCWZscC0+c3RhdGUgJj0gflNETEFfQ1BVRU47CisJCQlvdXRiKGZscC0+c3RhdGUsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlicmVhazsKKwkJY2FzZSBTRExBX1M1MDg6CisJCQlmbHAtPnN0YXRlICY9IH5TRExBX0NQVUVOOworCQkJb3V0YihmbHAtPnN0YXRlLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQkJYnJlYWs7CisJfQorfQorCit2b2lkIHNkbGFfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCisJZmxwID0gZGV2LT5wcml2OworCXN3aXRjaChmbHAtPnR5cGUpCisJeworCQljYXNlIFNETEFfUzUwMkE6CisJCQlvdXRiKFNETEFfUzUwMkFfTk1JLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQkJb3V0YihTRExBX1M1MDJBX1NUQVJULCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQkJZmxwLT5zdGF0ZSA9IFNETEFfUzUwMkFfU1RBUlQ7CisJCQlicmVhazsKKwkJY2FzZSBTRExBX1M1MDJFOgorCQkJb3V0YihTRExBX1M1MDJFX0NQVUVOLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX1o4MF9DT05UUk9MKTsKKwkJCW91dGIoMHgwMCwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWZscC0+c3RhdGUgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgU0RMQV9TNTA3OgorCQkJZmxwLT5zdGF0ZSB8PSBTRExBX0NQVUVOOworCQkJb3V0YihmbHAtPnN0YXRlLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQkJYnJlYWs7CisJCWNhc2UgU0RMQV9TNTA4OgorCQkJZmxwLT5zdGF0ZSB8PSBTRExBX0NQVUVOOworCQkJb3V0YihmbHAtPnN0YXRlLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQkJYnJlYWs7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHRoaXMgaXMgdXNlZCBmb3IgdGhlIFM1MDJBL0UgY2FyZHMgdG8gZGV0ZXJtaW5lCisgKiB0aGUgc3BlZWQgb2YgdGhlIG9uYm9hcmQgQ1BVLiAgQ2FsaWJyYXRpb24gaXMKKyAqIG5lY2Vzc2FyeSBmb3IgdGhlIEZyYW1lIFJlbGF5IGNvZGUgdXBsb2FkZWQgCisgKiBsYXRlci4gIEluY29ycmVjdCByZXN1bHRzIGNhdXNlIHRpbWluZyBwcm9ibGVtcworICogd2l0aCBsaW5rIGNoZWNrcyAmIHN0YXR1cyBtZXNzYWdlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBzZGxhX3o4MF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB6ODBfYWRkciwgaW50IGppZmZzLCBjaGFyIHJlc3AxLCBjaGFyIHJlc3AyKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGRvbmUsIG5vdzsKKwljaGFyICAgICAgICAgIHJlc3AsICp0ZW1wOworCisJc3RhcnQgPSBub3cgPSBqaWZmaWVzOworCWRvbmUgPSBqaWZmaWVzICsgamlmZnM7CisKKwl0ZW1wID0gKHZvaWQgKilkZXYtPm1lbV9zdGFydDsKKwl0ZW1wICs9IHo4MF9hZGRyICYgU0RMQV9BRERSX01BU0s7CisJCisJcmVzcCA9IH5yZXNwMTsKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZG9uZSkgJiYgKHJlc3AgIT0gcmVzcDEpICYmICghcmVzcDIgfHwgKHJlc3AgIT0gcmVzcDIpKSkKKwl7CisJCWlmIChqaWZmaWVzICE9IG5vdykKKwkJeworCQkJU0RMQV9XSU5ET1coZGV2LCB6ODBfYWRkcik7CisJCQlub3cgPSBqaWZmaWVzOworCQkJcmVzcCA9ICp0ZW1wOworCQl9CisJfQorCXJldHVybih0aW1lX2JlZm9yZShqaWZmaWVzLCBkb25lKSA/IGppZmZpZXMgLSBzdGFydCA6IC0xKTsKK30KKworLyogY29uc3RhbnRzIGZvciBaODAgQ1BVIHNwZWVkICovCisjZGVmaW5lIFo4MF9SRUFEWSAJCScxJwkvKiBaODAgaXMgcmVhZHkgdG8gYmVnaW4gKi8KKyNkZWZpbmUgTE9BREVSX1JFQURZIAkJJzInCS8qIGRyaXZlciBpcyByZWFkeSB0byBiZWdpbiAqLworI2RlZmluZSBaODBfU0NDX09LIAkJJzMnCS8qIFNDQyBpcyBvbiBib2FyZCAqLworI2RlZmluZSBaODBfU0NDX0JBRAkgCSc0JwkvKiBTQ0Mgd2FzIG5vdCBmb3VuZCAqLworCitzdGF0aWMgaW50IHNkbGFfY3B1c3BlZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIpCit7CisJaW50ICBqaWZmczsKKwljaGFyIGRhdGE7CisKKwlzZGxhX3N0YXJ0KGRldik7CisJaWYgKHNkbGFfejgwX3BvbGwoZGV2LCAwLCAzKkhaLCBaODBfUkVBRFksIDApIDwgMCkKKwkJcmV0dXJuKC1FSU8pOworCisJZGF0YSA9IExPQURFUl9SRUFEWTsKKwlzZGxhX3dyaXRlKGRldiwgMCwgJmRhdGEsIDEpOworCisJaWYgKChqaWZmcyA9IHNkbGFfejgwX3BvbGwoZGV2LCAwLCA4KkhaLCBaODBfU0NDX09LLCBaODBfU0NDX0JBRCkpIDwgMCkKKwkJcmV0dXJuKC1FSU8pOworCisJc2RsYV9zdG9wKGRldik7CisJc2RsYV9yZWFkKGRldiwgMCwgJmRhdGEsIDEpOworCisJaWYgKGRhdGEgPT0gWjgwX1NDQ19CQUQpCisJeworCQlwcmludGsoIiVzOiBTQ0MgYmFkXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4oLUVJTyk7CisJfQorCisJaWYgKGRhdGEgIT0gWjgwX1NDQ19PSykKKwkJcmV0dXJuKC1FSU5WQUwpOworCisJaWYgKGppZmZzIDwgMTY1KQorCQlpZnItPmlmcl9tdHUgPSBTRExBX0NQVV8xNk07CisJZWxzZSBpZiAoamlmZnMgPCAyMjApCisJCWlmci0+aWZyX210dSA9IFNETEFfQ1BVXzEwTTsKKwllbHNlIGlmIChqaWZmcyA8IDI1OCkKKwkJaWZyLT5pZnJfbXR1ID0gU0RMQV9DUFVfOE07CisJZWxzZSBpZiAoamlmZnMgPCAzNTcpCisJCWlmci0+aWZyX210dSA9IFNETEFfQ1BVXzdNOworCWVsc2UgaWYgKGppZmZzIDwgNDY3KQorCQlpZnItPmlmcl9tdHUgPSBTRExBX0NQVV81TTsKKwllbHNlCisJCWlmci0+aWZyX210dSA9IFNETEFfQ1BVXzNNOworIAorCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBEaXJlY3QgaW50ZXJhY3Rpb24gd2l0aCB0aGUgRnJhbWUgUmVsYXkgY29kZSAKKyAqICBzdGFydHMgaGVyZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgX2RsY2lfc3RhdCAKK3sKKwlzaG9ydCBkbGNpCQlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwljaGFyICBmbGFncwkJX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9OworCitzdHJ1Y3QgX2ZyYWRfc3RhdCAKK3sKKwljaGFyICAgIGZsYWdzOworCXN0cnVjdCBfZGxjaV9zdGF0IGRsY2lzW1NETEFfTUFYX0RMQ0ldOworfTsKKworc3RhdGljIHZvaWQgc2RsYV9lcnJvcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNtZCwgaW50IGRsY2ksIGludCByZXQsIGludCBsZW4sIHZvaWQgKmRhdGEpIAoreworCXN0cnVjdCBfZGxjaV9zdGF0ICpwc3RhdHVzOworCXNob3J0ICAgICAgICAgICAgICpwZGxjaTsKKwlpbnQgICAgICAgICAgICAgICBpOworCWNoYXIgICAgICAgICAgICAgICpzdGF0ZSwgbGluZVszMF07CisKKwlzd2l0Y2ggKHJldCkKKwl7CisJCWNhc2UgU0RMQV9SRVRfTU9ERU06CisJCQlzdGF0ZSA9IGRhdGE7CisJCQlpZiAoKnN0YXRlICYgU0RMQV9NT0RFTV9EQ0RfTE9XKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNb2RlbSBEQ0QgdW5leHBlY3RlZGx5IGxvdyFcbiIsIGRldi0+bmFtZSk7CisJCQlpZiAoKnN0YXRlICYgU0RMQV9NT0RFTV9DVFNfTE9XKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNb2RlbSBDVFMgdW5leHBlY3RlZGx5IGxvdyFcbiIsIGRldi0+bmFtZSk7CisJCQkvKiBJIHNob3VsZCBwcm9iYWJseSBkbyBzb21ldGhpbmcgYWJvdXQgdGhpcyEgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9SRVRfQ0hBTk5FTF9PRkY6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ2hhbm5lbCBiZWNhbWUgaW5vcGVyYXRpdmUhXG4iLCBkZXYtPm5hbWUpOworCQkJLyogc2FtZSBoZXJlICovCisJCQlicmVhazsKKworCQljYXNlIFNETEFfUkVUX0NIQU5ORUxfT046CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ2hhbm5lbCBiZWNhbWUgb3BlcmF0aXZlIVxuIiwgZGV2LT5uYW1lKTsKKwkJCS8qIHNhbWUgaGVyZSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1JFVF9ETENJX1NUQVRVUzoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdGF0dXMgY2hhbmdlIHJlcG9ydGVkIGJ5IEFjY2VzcyBOb2RlLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWxlbiAvPSBzaXplb2Yoc3RydWN0IF9kbGNpX3N0YXQpOworCQkJZm9yKHBzdGF0dXMgPSBkYXRhLCBpPTA7aSA8IGxlbjtpKysscHN0YXR1cysrKQorCQkJeworCQkJCWlmIChwc3RhdHVzLT5mbGFncyAmIFNETEFfRExDSV9ORVcpCisJCQkJCXN0YXRlID0gIm5ldyI7CisJCQkJZWxzZSBpZiAocHN0YXR1cy0+ZmxhZ3MgJiBTRExBX0RMQ0lfREVMRVRFRCkKKwkJCQkJc3RhdGUgPSAiZGVsZXRlZCI7CisJCQkJZWxzZSBpZiAocHN0YXR1cy0+ZmxhZ3MgJiBTRExBX0RMQ0lfQUNUSVZFKQorCQkJCQlzdGF0ZSA9ICJhY3RpdmUiOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCXNwcmludGYobGluZSwgInVua25vd24gc3RhdHVzOiAlMDJYIiwgcHN0YXR1cy0+ZmxhZ3MpOworCQkJCQlzdGF0ZSA9IGxpbmU7CisJCQkJfQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBETENJICVpOiAlcy5cbiIsIGRldi0+bmFtZSwgcHN0YXR1cy0+ZGxjaSwgc3RhdGUpOworCQkJCS8qIHNhbWUgaGVyZSAqLworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1JFVF9ETENJX1VOS05PV046CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjZWl2ZWQgdW5rbm93biBETENJczoiLCBkZXYtPm5hbWUpOworCQkJbGVuIC89IHNpemVvZihzaG9ydCk7CisJCQlmb3IocGRsY2kgPSBkYXRhLGk9MDtpIDwgbGVuO2krKyxwZGxjaSsrKQorCQkJCXByaW50aygiICVpIiwgKnBkbGNpKTsKKwkJCXByaW50aygiXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9SRVRfVElNRU9VVDoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvbW1hbmQgdGltZWQgb3V0IVxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9SRVRfQlVGX09WRVJTSVpFOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJjL0NJUiBvdmVyZmxvdywgYWNjZXB0YWJsZSBzaXplIGlzICVpXG4iLCBkZXYtPm5hbWUsIGxlbik7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfUkVUX0JVRl9UT09fQklHOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJ1ZmZlciBzaXplIG92ZXIgc3BlY2lmaWVkIG1heCBvZiAlaVxuIiwgZGV2LT5uYW1lLCBsZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1JFVF9DSEFOTkVMX0lOQUNUSVZFOgorCQljYXNlIFNETEFfUkVUX0RMQ0lfSU5BQ1RJVkU6CisJCWNhc2UgU0RMQV9SRVRfQ0lSX09WRVJGTE9XOgorCQljYXNlIFNETEFfUkVUX05PX0JVRlM6CisJCQlpZiAoY21kID09IFNETEFfSU5GT1JNQVRJT05fV1JJVEUpCisJCQkJYnJlYWs7CisKKwkJZGVmYXVsdDogCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENtZCAweCUyLjJYIGdlbmVyYXRlZCByZXR1cm4gY29kZSAweCUyLjJYXG4iLCBkZXYtPm5hbWUsIGNtZCwgcmV0KTsKKwkJCS8qIEZ1cnRoZXIgcHJvY2Vzc2luZyBjb3VsZCBiZSBkb25lIGhlcmUgKi8KKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBzZGxhX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY21kLCBzaG9ydCBkbGNpLCBzaG9ydCBmbGFncywgCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICppbmJ1Ziwgc2hvcnQgaW5sZW4sIHZvaWQgKm91dGJ1Ziwgc2hvcnQgKm91dGxlbikKK3sKKwlzdGF0aWMgc3RydWN0IF9mcmFkX3N0YXQgc3RhdHVzOworCXN0cnVjdCBmcmFkX2xvY2FsICAgICAgICAqZmxwOworCXN0cnVjdCBzZGxhX2NtZCAgICAgICAgICAqY21kX2J1ZjsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgcGZsYWdzOworCXVuc2lnbmVkIGxvbmcJCSBqaWZmczsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgcmV0LCB3YWl0aW5nLCBsZW47CisJbG9uZyAgICAgICAgICAgICAgICAgICAgIHdpbmRvdzsKKworCWZscCA9IGRldi0+cHJpdjsKKwl3aW5kb3cgPSBmbHAtPnR5cGUgPT0gU0RMQV9TNTA4ID8gU0RMQV81MDhfQ01EX0JVRiA6IFNETEFfNTAyX0NNRF9CVUY7CisJY21kX2J1ZiA9IChzdHJ1Y3Qgc2RsYV9jbWQgKikoZGV2LT5tZW1fc3RhcnQgKyAod2luZG93ICYgU0RMQV9BRERSX01BU0spKTsKKwlyZXQgPSAwOworCWxlbiA9IDA7CisJamlmZnMgPSBqaWZmaWVzICsgSFo7ICAvKiAxIHNlY29uZCBpcyBwbGVudHkgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZGxhX2xvY2ssIHBmbGFncyk7CisJU0RMQV9XSU5ET1coZGV2LCB3aW5kb3cpOworCWNtZF9idWYtPmNtZCA9IGNtZDsKKwljbWRfYnVmLT5kbGNpID0gZGxjaTsKKwljbWRfYnVmLT5mbGFncyA9IGZsYWdzOworCisJaWYgKGluYnVmKQorCQltZW1jcHkoY21kX2J1Zi0+ZGF0YSwgaW5idWYsIGlubGVuKTsKKworCWNtZF9idWYtPmxlbmd0aCA9IGlubGVuOworCisJY21kX2J1Zi0+b3BwX2ZsYWcgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkbGFfbG9jaywgcGZsYWdzKTsKKworCXdhaXRpbmcgPSAxOworCWxlbiA9IDA7CisJd2hpbGUgKHdhaXRpbmcgJiYgdGltZV9iZWZvcmVfZXEoamlmZmllcywgamlmZnMpKQorCXsKKwkJaWYgKHdhaXRpbmcrKyAlIDMpIAorCQl7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2RsYV9sb2NrLCBwZmxhZ3MpOworCQkJU0RMQV9XSU5ET1coZGV2LCB3aW5kb3cpOworCQkJd2FpdGluZyA9ICgodm9sYXRpbGUgaW50KShjbWRfYnVmLT5vcHBfZmxhZykpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RsYV9sb2NrLCBwZmxhZ3MpOworCQl9CisJfQorCQorCWlmICghd2FpdGluZykKKwl7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNkbGFfbG9jaywgcGZsYWdzKTsKKwkJU0RMQV9XSU5ET1coZGV2LCB3aW5kb3cpOworCQlyZXQgPSBjbWRfYnVmLT5yZXR2YWw7CisJCWxlbiA9IGNtZF9idWYtPmxlbmd0aDsKKwkJaWYgKG91dGJ1ZiAmJiBvdXRsZW4pCisJCXsKKwkJCSpvdXRsZW4gPSAqb3V0bGVuID49IGxlbiA/IGxlbiA6ICpvdXRsZW47CisKKwkJCWlmICgqb3V0bGVuKQorCQkJCW1lbWNweShvdXRidWYsIGNtZF9idWYtPmRhdGEsICpvdXRsZW4pOworCQl9CisKKwkJLyogVGhpcyBpcyBhIGxvY2FsIGNvcHkgdGhhdCdzIHVzZWQgZm9yIGVycm9yIGhhbmRsaW5nICovCisJCWlmIChyZXQpCisJCQltZW1jcHkoJnN0YXR1cywgY21kX2J1Zi0+ZGF0YSwgbGVuID4gc2l6ZW9mKHN0YXR1cykgPyBzaXplb2Yoc3RhdHVzKSA6IGxlbik7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RsYV9sb2NrLCBwZmxhZ3MpOworCX0KKwllbHNlCisJCXJldCA9IFNETEFfUkVUX1RJTUVPVVQ7CisKKwlpZiAocmV0ICE9IFNETEFfUkVUX09LKQorCSAgIAlzZGxhX2Vycm9ycyhkZXYsIGNtZCwgZGxjaSwgcmV0LCBsZW4sICZzdGF0dXMpOworCisJcmV0dXJuKHJldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGJ5IHRoZSBETENJIGRyaXZlciAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgc2RsYV9yZWNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworaW50IHNkbGFfYWN0aXZhdGUoc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlLCBzdHJ1Y3QgbmV0X2RldmljZSAqbWFzdGVyKQoreworCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7CisJaW50IGk7CisKKwlmbHAgPSBzbGF2ZS0+cHJpdjsKKworCWZvcihpPTA7aTxDT05GSUdfRExDSV9NQVg7aSsrKQorCQlpZiAoZmxwLT5tYXN0ZXJbaV0gPT0gbWFzdGVyKQorCQkJYnJlYWs7CisKKwlpZiAoaSA9PSBDT05GSUdfRExDSV9NQVgpCisJCXJldHVybigtRU5PREVWKTsKKworCWZscC0+ZGxjaVtpXSA9IGFicyhmbHAtPmRsY2lbaV0pOworCisJaWYgKG5ldGlmX3J1bm5pbmcoc2xhdmUpICYmIChmbHAtPmNvbmZpZy5zdGF0aW9uID09IEZSQURfU1RBVElPTl9OT0RFKSkKKwkJc2RsYV9jbWQoc2xhdmUsIFNETEFfQUNUSVZBVEVfRExDSSwgMCwgMCwgJmZscC0+ZGxjaVtpXSwgc2l6ZW9mKHNob3J0KSwgTlVMTCwgTlVMTCk7CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBzZGxhX2RlYWN0aXZhdGUoc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlLCBzdHJ1Y3QgbmV0X2RldmljZSAqbWFzdGVyKQoreworCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7CisJaW50ICAgICAgICAgICAgICAgaTsKKworCWZscCA9IHNsYXZlLT5wcml2OworCisJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCWlmIChmbHAtPm1hc3RlcltpXSA9PSBtYXN0ZXIpCisJCQlicmVhazsKKworCWlmIChpID09IENPTkZJR19ETENJX01BWCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJZmxwLT5kbGNpW2ldID0gLWFicyhmbHAtPmRsY2lbaV0pOworCisJaWYgKG5ldGlmX3J1bm5pbmcoc2xhdmUpICYmIChmbHAtPmNvbmZpZy5zdGF0aW9uID09IEZSQURfU1RBVElPTl9OT0RFKSkKKwkJc2RsYV9jbWQoc2xhdmUsIFNETEFfREVBQ1RJVkFURV9ETENJLCAwLCAwLCAmZmxwLT5kbGNpW2ldLCBzaXplb2Yoc2hvcnQpLCBOVUxMLCBOVUxMKTsKKworCXJldHVybigwKTsKK30KKworaW50IHNkbGFfYXNzb2Moc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlLCBzdHJ1Y3QgbmV0X2RldmljZSAqbWFzdGVyKQoreworCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7CisJaW50ICAgICAgICAgICAgICAgaTsKKworCWlmIChtYXN0ZXItPnR5cGUgIT0gQVJQSFJEX0RMQ0kpCisJCXJldHVybigtRUlOVkFMKTsKKworCWZscCA9IHNsYXZlLT5wcml2OworCisJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJeworCQlpZiAoIWZscC0+bWFzdGVyW2ldKQorCQkJYnJlYWs7CisJCWlmIChhYnMoZmxwLT5kbGNpW2ldKSA9PSAqKHNob3J0ICopKG1hc3Rlci0+ZGV2X2FkZHIpKQorCQkJcmV0dXJuKC1FQUREUklOVVNFKTsKKwl9IAorCisJaWYgKGkgPT0gQ09ORklHX0RMQ0lfTUFYKQorCQlyZXR1cm4oLUVNTElOSyk7ICAvKiAjIyMjIEFsYW46IENvbW1lbnRzIG9uIHRoaXMgPz8gKi8KKworCisJZmxwLT5tYXN0ZXJbaV0gPSBtYXN0ZXI7CisJZmxwLT5kbGNpW2ldID0gLSooc2hvcnQgKikobWFzdGVyLT5kZXZfYWRkcik7CisJbWFzdGVyLT5tdHUgPSBzbGF2ZS0+bXR1OworCisJaWYgKG5ldGlmX3J1bm5pbmcoc2xhdmUpKSB7CisJCWlmIChmbHAtPmNvbmZpZy5zdGF0aW9uID09IEZSQURfU1RBVElPTl9DUEUpCisJCQlzZGxhX3JlY29uZmlnKHNsYXZlKTsKKwkJZWxzZQorCQkJc2RsYV9jbWQoc2xhdmUsIFNETEFfQUREX0RMQ0ksIDAsIDAsIG1hc3Rlci0+ZGV2X2FkZHIsIHNpemVvZihzaG9ydCksIE5VTEwsIE5VTEwpOworCX0KKworCXJldHVybigwKTsKK30KKworaW50IHNkbGFfZGVhc3NvYyhzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmUsIHN0cnVjdCBuZXRfZGV2aWNlICptYXN0ZXIpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlpbnQgICAgICAgICAgICAgICBpOworCisJZmxwID0gc2xhdmUtPnByaXY7CisKKwlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJaWYgKGZscC0+bWFzdGVyW2ldID09IG1hc3RlcikKKwkJCWJyZWFrOworCisJaWYgKGkgPT0gQ09ORklHX0RMQ0lfTUFYKQorCQlyZXR1cm4oLUVOT0RFVik7CisKKwlmbHAtPm1hc3RlcltpXSA9IE5VTEw7CisJZmxwLT5kbGNpW2ldID0gMDsKKworCisJaWYgKG5ldGlmX3J1bm5pbmcoc2xhdmUpKSB7CisJCWlmIChmbHAtPmNvbmZpZy5zdGF0aW9uID09IEZSQURfU1RBVElPTl9DUEUpCisJCQlzZGxhX3JlY29uZmlnKHNsYXZlKTsKKwkJZWxzZQorCQkJc2RsYV9jbWQoc2xhdmUsIFNETEFfREVMRVRFX0RMQ0ksIDAsIDAsIG1hc3Rlci0+ZGV2X2FkZHIsIHNpemVvZihzaG9ydCksIE5VTEwsIE5VTEwpOworCX0KKworCXJldHVybigwKTsKK30KKworaW50IHNkbGFfZGxjaV9jb25mKHN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZSwgc3RydWN0IG5ldF9kZXZpY2UgKm1hc3RlciwgaW50IGdldCkKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHA7CisJaW50ICAgICAgICAgICAgICAgaTsKKwlzaG9ydCAgICAgICAgICAgICBsZW4sIHJldDsKKworCWZscCA9IHNsYXZlLT5wcml2OworCisJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCWlmIChmbHAtPm1hc3RlcltpXSA9PSBtYXN0ZXIpCisJCQlicmVhazsKKworCWlmIChpID09IENPTkZJR19ETENJX01BWCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJZGxwID0gbWFzdGVyLT5wcml2OworCisJcmV0ID0gU0RMQV9SRVRfT0s7CisJbGVuID0gc2l6ZW9mKHN0cnVjdCBkbGNpX2NvbmYpOworCWlmIChuZXRpZl9ydW5uaW5nKHNsYXZlKSkgeworCQlpZiAoZ2V0KQorCQkJcmV0ID0gc2RsYV9jbWQoc2xhdmUsIFNETEFfUkVBRF9ETENJX0NPTkZJR1VSQVRJT04sIGFicyhmbHAtPmRsY2lbaV0pLCAwLCAgCisJCQkgICAgICAgICAgICBOVUxMLCAwLCAmZGxwLT5jb25maWcsICZsZW4pOworCQllbHNlCisJCQlyZXQgPSBzZGxhX2NtZChzbGF2ZSwgU0RMQV9TRVRfRExDSV9DT05GSUdVUkFUSU9OLCBhYnMoZmxwLT5kbGNpW2ldKSwgMCwgIAorCQkJICAgICAgICAgICAgJmRscC0+Y29uZmlnLCBzaXplb2Yoc3RydWN0IGRsY2lfY29uZikgLSA0ICogc2l6ZW9mKHNob3J0KSwgTlVMTCwgTlVMTCk7CisJfQorCisJcmV0dXJuKHJldCA9PSBTRExBX1JFVF9PSyA/IDAgOiAtRUlPKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogbm93IGZvciB0aGUgTGludXggZHJpdmVyIAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTk9URTogdGhlIERMQ0kgZHJpdmVyIGRlYWxzIHdpdGggZnJlZWluZyB0aGUgU0tCISEgKi8KK3N0YXRpYyBpbnQgc2RsYV90cmFuc21pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7CisJaW50ICAgICAgICAgICAgICAgcmV0LCBhZGRyLCBhY2NlcHQsIGk7CisJc2hvcnQgICAgICAgICAgICAgc2l6ZTsKKwl1bnNpZ25lZCBsb25nICAgICBmbGFnczsKKwlzdHJ1Y3QgYnVmX2VudHJ5ICAqcGJ1ZjsKKworCWZscCA9IGRldi0+cHJpdjsKKwlyZXQgPSAwOworCWFjY2VwdCA9IDE7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKgorCSAqIHN0dXBpZCBHYXRlRCBpbnNpc3RzIG9uIHNldHRpbmcgdXAgdGhlIG11bHRpY2FzdCByb3V0ZXIgdGhydSB1cworCSAqIGFuZCB3ZSdyZSBpbGwgZXF1aXBwZWQgdG8gaGFuZGxlIGEgbm9uIEZyYW1lIFJlbGF5IHBhY2tldCBhdCB0aGlzCisJICogdGltZSEKKwkgKi8KKworCWFjY2VwdCA9IDE7CisJc3dpdGNoIChkZXYtPnR5cGUpCisJeworCQljYXNlIEFSUEhSRF9GUkFEOgorCQkJaWYgKHNrYi0+ZGV2LT50eXBlICE9IEFSUEhSRF9ETENJKQorCQkJeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOb24gRExDSSBkZXZpY2UsIHR5cGUgJWksIHRyaWVkIHRvIHNlbmQgb24gRlJBRCBtb2R1bGUuXG4iLCBkZXYtPm5hbWUsIHNrYi0+ZGV2LT50eXBlKTsKKwkJCQlhY2NlcHQgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5rbm93biBmaXJtd2FyZSB0eXBlIDB4JTQuNFhcbiIsIGRldi0+bmFtZSwgZGV2LT50eXBlKTsKKwkJCWFjY2VwdCA9IDA7CisJCQlicmVhazsKKwl9CisJaWYgKGFjY2VwdCkKKwl7CisJCS8qIHRoaXMgaXMgZnJhbWUgc3BlY2lmaWMsIGJ1dCB0aWxsIHRoZXJlJ3MgYSBQUFAgbW9kdWxlLCBpdCdzIHRoZSBkZWZhdWx0ICovCisJCXN3aXRjaCAoZmxwLT50eXBlKQorCQl7CisJCQljYXNlIFNETEFfUzUwMkE6CisJCQljYXNlIFNETEFfUzUwMkU6CisJCQkJcmV0ID0gc2RsYV9jbWQoZGV2LCBTRExBX0lORk9STUFUSU9OX1dSSVRFLCAqKHNob3J0ICopKHNrYi0+ZGV2LT5kZXZfYWRkciksIDAsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIE5VTEwsIE5VTEwpOworCQkJCWJyZWFrOworCQkJCWNhc2UgU0RMQV9TNTA4OgorCQkJCXNpemUgPSBzaXplb2YoYWRkcik7CisJCQkJcmV0ID0gc2RsYV9jbWQoZGV2LCBTRExBX0lORk9STUFUSU9OX1dSSVRFLCAqKHNob3J0ICopKHNrYi0+ZGV2LT5kZXZfYWRkciksIDAsIE5VTEwsIHNrYi0+bGVuLCAmYWRkciwgJnNpemUpOworCQkJCWlmIChyZXQgPT0gU0RMQV9SRVRfT0spCisJCQkJeworCisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzZGxhX2xvY2ssIGZsYWdzKTsKKwkJCQkJU0RMQV9XSU5ET1coZGV2LCBhZGRyKTsKKwkJCQkJcGJ1ZiA9ICh2b2lkICopKCgoaW50KSBkZXYtPm1lbV9zdGFydCkgKyAoYWRkciAmIFNETEFfQUREUl9NQVNLKSk7CisJCQkJCV9fc2RsYV93cml0ZShkZXYsIHBidWYtPmJ1Zl9hZGRyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCQkJU0RMQV9XSU5ET1coZGV2LCBhZGRyKTsKKwkJCQkJcGJ1Zi0+b3BwX2ZsYWcgPSAxOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGxhX2xvY2ssIGZsYWdzKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoIChyZXQpCisJCXsKKwkJCWNhc2UgU0RMQV9SRVRfT0s6CisJCQkJZmxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJcmV0ID0gRExDSV9SRVRfT0s7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU0RMQV9SRVRfQ0lSX09WRVJGTE9XOgorCQkJY2FzZSBTRExBX1JFVF9CVUZfT1ZFUlNJWkU6CisJCQljYXNlIFNETEFfUkVUX05PX0JVRlM6CisJCQkJZmxwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCQkJcmV0ID0gRExDSV9SRVRfRFJPUDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlmbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCXJldCA9IERMQ0lfUkVUX0VSUjsKKwkJCQlicmVhazsKKwkJfQorCX0KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJeworCQlpZihmbHAtPm1hc3RlcltpXSE9TlVMTCkKKwkJCW5ldGlmX3dha2VfcXVldWUoZmxwLT5tYXN0ZXJbaV0pOworCX0JCQorCXJldHVybihyZXQpOworfQorCitzdGF0aWMgdm9pZCBzZGxhX3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkgICptYXN0ZXI7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlzdHJ1Y3QgZGxjaV9sb2NhbCAqZGxwOworCXN0cnVjdCBza19idWZmCSAqc2tiOworCisJc3RydWN0IHNkbGFfY21kCSpjbWQ7CisJc3RydWN0IGJ1Zl9pbmZvCSpwYnVmaTsKKwlzdHJ1Y3QgYnVmX2VudHJ5ICAqcGJ1ZjsKKworCXVuc2lnbmVkIGxvbmcJICBmbGFnczsKKwlpbnQgICAgICAgICAgICAgICBpPTAsIHJlY2VpdmVkLCBzdWNjZXNzLCBhZGRyLCBidWZfYmFzZSwgYnVmX3RvcDsKKwlzaG9ydCAgICAgICAgICAgICBkbGNpLCBsZW4sIGxlbjIsIHNwbGl0OworCisJZmxwID0gZGV2LT5wcml2OworCXN1Y2Nlc3MgPSAxOworCXJlY2VpdmVkID0gYWRkciA9IGJ1Zl90b3AgPSBidWZfYmFzZSA9IDA7CisJbGVuID0gZGxjaSA9IDA7CisJc2tiID0gTlVMTDsKKwltYXN0ZXIgPSBOVUxMOworCWNtZCA9IE5VTEw7CisJcGJ1ZmkgPSBOVUxMOworCXBidWYgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNkbGFfbG9jaywgZmxhZ3MpOworCisJc3dpdGNoIChmbHAtPnR5cGUpCisJeworCQljYXNlIFNETEFfUzUwMkE6CisJCWNhc2UgU0RMQV9TNTAyRToKKwkJCWNtZCA9ICh2b2lkICopIChkZXYtPm1lbV9zdGFydCArIChTRExBXzUwMl9SQ1ZfQlVGICYgU0RMQV9BRERSX01BU0spKTsKKwkJCVNETEFfV0lORE9XKGRldiwgU0RMQV81MDJfUkNWX0JVRik7CisJCQlzdWNjZXNzID0gY21kLT5vcHBfZmxhZzsKKwkJCWlmICghc3VjY2VzcykKKwkJCQlicmVhazsKKworCQkJZGxjaSA9IGNtZC0+ZGxjaTsKKwkJCWxlbiA9IGNtZC0+bGVuZ3RoOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1M1MDg6CisJCQlwYnVmaSA9ICh2b2lkICopIChkZXYtPm1lbV9zdGFydCArIChTRExBXzUwOF9SWEJVRl9JTkZPICYgU0RMQV9BRERSX01BU0spKTsKKwkJCVNETEFfV0lORE9XKGRldiwgU0RMQV81MDhfUlhCVUZfSU5GTyk7CisJCQlwYnVmID0gKHZvaWQgKikgKGRldi0+bWVtX3N0YXJ0ICsgKChwYnVmaS0+cnNlX2Jhc2UgKyBmbHAtPmJ1ZmZlciAqIHNpemVvZihzdHJ1Y3QgYnVmX2VudHJ5KSkgJiBTRExBX0FERFJfTUFTSykpOworCQkJc3VjY2VzcyA9IHBidWYtPm9wcF9mbGFnOworCQkJaWYgKCFzdWNjZXNzKQorCQkJCWJyZWFrOworCisJCQlidWZfdG9wID0gcGJ1ZmktPmJ1Zl90b3A7CisJCQlidWZfYmFzZSA9IHBidWZpLT5idWZfYmFzZTsKKwkJCWRsY2kgPSBwYnVmLT5kbGNpOworCQkJbGVuID0gcGJ1Zi0+bGVuZ3RoOworCQkJYWRkciA9IHBidWYtPmJ1Zl9hZGRyOworCQkJYnJlYWs7CisJfQorCisJLyogY29tbW9uIGNvZGUsIGZpbmQgdGhlIERMQ0kgYW5kIGdldCB0aGUgU0tCICovCisJaWYgKHN1Y2Nlc3MpCisJeworCQlmb3IgKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCQlpZiAoZmxwLT5kbGNpW2ldID09IGRsY2kpCisJCQkJYnJlYWs7CisKKwkJaWYgKGkgPT0gQ09ORklHX0RMQ0lfTUFYKQorCQl7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBSZWNlaXZlZCBwYWNrZXQgZnJvbSBpbnZhbGlkIERMQ0kgJWksIGlnbm9yaW5nLiIsIGRldi0+bmFtZSwgZGxjaSk7CisJCQlmbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJc3VjY2VzcyA9IDA7CisJCX0KKwl9CisKKwlpZiAoc3VjY2VzcykKKwl7CisJCW1hc3RlciA9IGZscC0+bWFzdGVyW2ldOworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIHNpemVvZihzdHJ1Y3QgZnJoZHIpKTsKKwkJaWYgKHNrYiA9PSBOVUxMKSAKKwkJeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7CisJCQlmbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsgCisJCQlzdWNjZXNzID0gMDsKKwkJfQorCQllbHNlCisJCQlza2JfcmVzZXJ2ZShza2IsIHNpemVvZihzdHJ1Y3QgZnJoZHIpKTsKKwl9CisKKwkvKiBwaWNrIHVwIHRoZSBkYXRhICovCisJc3dpdGNoIChmbHAtPnR5cGUpCisJeworCQljYXNlIFNETEFfUzUwMkE6CisJCWNhc2UgU0RMQV9TNTAyRToKKwkJCWlmIChzdWNjZXNzKQorCQkJCV9fc2RsYV9yZWFkKGRldiwgU0RMQV81MDJfUkNWX0JVRiArIFNETEFfNTAyX0RBVEFfT0ZTLCBza2JfcHV0KHNrYixsZW4pLCBsZW4pOworCisJCQlTRExBX1dJTkRPVyhkZXYsIFNETEFfNTAyX1JDVl9CVUYpOworCQkJY21kLT5vcHBfZmxhZyA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfUzUwODoKKwkJCWlmIChzdWNjZXNzKQorCQkJeworCQkJCS8qIGlzIHRoaXMgYnVmZmVyIHNwbGl0IG9mZiB0aGUgZW5kIG9mIHRoZSBpbnRlcm5hbCByaW5nIGJ1ZmZlciAqLworCQkJCXNwbGl0ID0gYWRkciArIGxlbiA+IGJ1Zl90b3AgKyAxID8gbGVuIC0gKGJ1Zl90b3AgLSBhZGRyICsgMSkgOiAwOworCQkJCWxlbjIgPSBsZW4gLSBzcGxpdDsKKworCQkJCV9fc2RsYV9yZWFkKGRldiwgYWRkciwgc2tiX3B1dChza2IsIGxlbjIpLCBsZW4yKTsKKwkJCQlpZiAoc3BsaXQpCisJCQkJCV9fc2RsYV9yZWFkKGRldiwgYnVmX2Jhc2UsIHNrYl9wdXQoc2tiLCBzcGxpdCksIHNwbGl0KTsKKwkJCX0KKworCQkJLyogaW5jcmVtZW50IHRoZSBidWZmZXIgd2UncmUgbG9va2luZyBhdCAqLworCQkJU0RMQV9XSU5ET1coZGV2LCBTRExBXzUwOF9SWEJVRl9JTkZPKTsKKwkJCWZscC0+YnVmZmVyID0gKGZscC0+YnVmZmVyICsgMSkgJSBwYnVmaS0+cnNlX251bTsKKwkJCXBidWYtPm9wcF9mbGFnID0gMDsKKwkJCWJyZWFrOworCX0KKworCWlmIChzdWNjZXNzKQorCXsKKwkJZmxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWRscCA9IG1hc3Rlci0+cHJpdjsKKwkJKCpkbHAtPnJlY2VpdmUpKHNrYiwgbWFzdGVyKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGxhX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHNkbGFfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICAgICAqZGV2OworCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7CisJY2hhciAgICAgICAgICAgICAgYnl0ZTsKKworCWRldiA9IGRldl9pZDsKKworCWlmIChkZXYgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNkbGFfaXNyKCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJZmxwID0gZGV2LT5wcml2OworCisJaWYgKCFmbHAtPmluaXRpYWxpemVkKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGlycSAlZCBmb3IgdW5pbml0aWFsaXplZCBkZXZpY2UuXG4iLCBkZXYtPm5hbWUsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlieXRlID0gc2RsYV9ieXRlKGRldiwgZmxwLT50eXBlID09IFNETEFfUzUwOCA/IFNETEFfNTA4X0lSUV9JTlRFUkZBQ0UgOiBTRExBXzUwMl9JUlFfSU5URVJGQUNFKTsKKwlzd2l0Y2ggKGJ5dGUpCisJeworCQljYXNlIFNETEFfSU5UUl9SWDoKKwkJCXNkbGFfcmVjZWl2ZShkZXYpOworCQkJYnJlYWs7CisKKwkJLyogdGhlIGNvbW1hbmQgd2lsbCBnZXQgYW4gZXJyb3IgcmV0dXJuLCB3aGljaCBpcyBwcm9jZXNzZWQgYWJvdmUgKi8KKwkJY2FzZSBTRExBX0lOVFJfTU9ERU06CisJCWNhc2UgU0RMQV9JTlRSX1NUQVRVUzoKKwkJCXNkbGFfY21kKGRldiwgU0RMQV9SRUFEX0RMQ19TVEFUVVMsIDAsIDAsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX0lOVFJfVFg6CisJCWNhc2UgU0RMQV9JTlRSX0NPTVBMRVRFOgorCQljYXNlIFNETEFfSU5UUl9USU1FUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIGlycSBmbGFnIDB4JTAyWC5cbiIsIGRldi0+bmFtZSwgYnl0ZSk7CisJCQlicmVhazsKKwl9CisKKwkvKiB0aGUgUzUwMkUgcmVxdWlyZXMgYSBtYW51YWwgYWNrbm93bGVkZ2VtZW50IG9mIHRoZSBpbnRlcnJ1cHQgKi8gCisJaWYgKGZscC0+dHlwZSA9PSBTRExBX1M1MDJFKQorCXsKKwkJZmxwLT5zdGF0ZSAmPSB+U0RMQV9TNTAyRV9JTlRBQ0s7CisJCW91dGIoZmxwLT5zdGF0ZSwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJZmxwLT5zdGF0ZSB8PSBTRExBX1M1MDJFX0lOVEFDSzsKKwkJb3V0YihmbHAtPnN0YXRlLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCX0KKworCS8qIHRoaXMgY2xlYXJzIHRoZSBieXRlLCBpbmZvcm1pbmcgdGhlIFo4MCB3ZSdyZSBkb25lICovCisJYnl0ZSA9IDA7CisJc2RsYV93cml0ZShkZXYsIGZscC0+dHlwZSA9PSBTRExBX1M1MDggPyBTRExBXzUwOF9JUlFfSU5URVJGQUNFIDogU0RMQV81MDJfSVJRX0lOVEVSRkFDRSwgJmJ5dGUsIHNpemVvZihieXRlKSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBzZGxhX3BvbGwodW5zaWduZWQgbG9uZyBkZXZpY2UpCit7CisJc3RydWN0IG5ldF9kZXZpY2UJICAqZGV2OworCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7CisKKwlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2aWNlOworCWZscCA9IGRldi0+cHJpdjsKKworCWlmIChzZGxhX2J5dGUoZGV2LCBTRExBXzUwMl9SQ1ZfQlVGKSkKKwkJc2RsYV9yZWNlaXZlKGRldik7CisKKwlmbHAtPnRpbWVyLmV4cGlyZXMgPSAxOworCWFkZF90aW1lcigmZmxwLT50aW1lcik7Cit9CisKK3N0YXRpYyBpbnQgc2RsYV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7CisJc3RydWN0IGludHJfaW5mbyAgaW50cjsKKwlpbnQgICAgICAgICAgICAgICBsZW4sIGk7CisJc2hvcnQgICAgICAgICAgICAgZGxjaXNbQ09ORklHX0RMQ0lfTUFYXTsKKworCWZscCA9IGRldi0+cHJpdjsKKworCWxlbiA9IDA7CisJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCWlmIChmbHAtPmRsY2lbaV0pCisJCQlkbGNpc1tsZW4rK10gPSBhYnMoZmxwLT5kbGNpW2ldKTsKKwlsZW4gKj0gMjsKKworCWlmIChmbHAtPmNvbmZpZy5zdGF0aW9uID09IEZSQURfU1RBVElPTl9OT0RFKQorCXsKKwkJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCQlpZiAoZmxwLT5kbGNpW2ldID4gMCkgCisJCQkJc2RsYV9jbWQoZGV2LCBTRExBX0RFQUNUSVZBVEVfRExDSSwgMCwgMCwgZGxjaXMsIGxlbiwgTlVMTCwgTlVMTCk7CisJCXNkbGFfY21kKGRldiwgU0RMQV9ERUxFVEVfRExDSSwgMCwgMCwgJmZscC0+ZGxjaVtpXSwgc2l6ZW9mKGZscC0+ZGxjaVtpXSksIE5VTEwsIE5VTEwpOworCX0KKworCW1lbXNldCgmaW50ciwgMCwgc2l6ZW9mKGludHIpKTsKKwkvKiBsZXQncyBzdGFydCB1cCB0aGUgcmVjZXB0aW9uICovCisJc3dpdGNoKGZscC0+dHlwZSkKKwl7CisJCWNhc2UgU0RMQV9TNTAyQToKKwkJCWRlbF90aW1lcigmZmxwLT50aW1lcik7IAorCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1M1MDJFOgorCQkJc2RsYV9jbWQoZGV2LCBTRExBX1NFVF9JUlFfVFJJR0dFUiwgMCwgMCwgJmludHIsIHNpemVvZihjaGFyKSArIHNpemVvZihzaG9ydCksIE5VTEwsIE5VTEwpOworCQkJZmxwLT5zdGF0ZSAmPSB+U0RMQV9TNTAyRV9JTlRBQ0s7CisJCQlvdXRiKGZscC0+c3RhdGUsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfUzUwNzoKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9TNTA4OgorCQkJc2RsYV9jbWQoZGV2LCBTRExBX1NFVF9JUlFfVFJJR0dFUiwgMCwgMCwgJmludHIsIHNpemVvZihzdHJ1Y3QgaW50cl9pbmZvKSwgTlVMTCwgTlVMTCk7CisJCQlmbHAtPnN0YXRlICY9IH5TRExBX1M1MDhfSU5URU47CisJCQlvdXRiKGZscC0+c3RhdGUsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlicmVhazsKKwl9CisKKwlzZGxhX2NtZChkZXYsIFNETEFfRElTQUJMRV9DT01NVU5JQ0FUSU9OUywgMCwgMCwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJcmV0dXJuKDApOworfQorCitzdHJ1Y3QgY29uZl9kYXRhIHsKKwlzdHJ1Y3QgZnJhZF9jb25mIGNvbmZpZzsKKwlzaG9ydCAgICAgICAgICAgIGRsY2lbQ09ORklHX0RMQ0lfTUFYXTsKK307CisKK3N0YXRpYyBpbnQgc2RsYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlzdHJ1Y3QgZGxjaV9sb2NhbCAqZGxwOworCXN0cnVjdCBjb25mX2RhdGEgIGRhdGE7CisJc3RydWN0IGludHJfaW5mbyAgaW50cjsKKwlpbnQgICAgICAgICAgICAgICBsZW4sIGk7CisJY2hhciAgICAgICAgICAgICAgYnl0ZTsKKworCWZscCA9IGRldi0+cHJpdjsKKworCWlmICghZmxwLT5pbml0aWFsaXplZCkKKwkJcmV0dXJuKC1FUEVSTSk7CisKKwlpZiAoIWZscC0+Y29uZmlndXJlZCkKKwkJcmV0dXJuKC1FUEVSTSk7CisKKwkvKiB0aW1lIHRvIHNlbmQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gKi8KKwlsZW4gPSAwOworCWZvcihpPTA7aTxDT05GSUdfRExDSV9NQVg7aSsrKQorCQlpZiAoZmxwLT5kbGNpW2ldKQorCQkJZGF0YS5kbGNpW2xlbisrXSA9IGFicyhmbHAtPmRsY2lbaV0pOworCWxlbiAqPSAyOworCisJbWVtY3B5KCZkYXRhLmNvbmZpZywgJmZscC0+Y29uZmlnLCBzaXplb2Yoc3RydWN0IGZyYWRfY29uZikpOworCWxlbiArPSBzaXplb2Yoc3RydWN0IGZyYWRfY29uZik7CisKKwlzZGxhX2NtZChkZXYsIFNETEFfRElTQUJMRV9DT01NVU5JQ0FUSU9OUywgMCwgMCwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisJc2RsYV9jbWQoZGV2LCBTRExBX1NFVF9ETENJX0NPTkZJR1VSQVRJT04sIDAsIDAsICZkYXRhLCBsZW4sIE5VTEwsIE5VTEwpOworCisJaWYgKGZscC0+dHlwZSA9PSBTRExBX1M1MDgpCisJCWZscC0+YnVmZmVyID0gMDsKKworCXNkbGFfY21kKGRldiwgU0RMQV9FTkFCTEVfQ09NTVVOSUNBVElPTlMsIDAsIDAsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworCisJLyogbGV0J3Mgc3RhcnQgdXAgdGhlIHJlY2VwdGlvbiAqLworCW1lbXNldCgmaW50ciwgMCwgc2l6ZW9mKGludHIpKTsKKwlzd2l0Y2goZmxwLT50eXBlKQorCXsKKwkJY2FzZSBTRExBX1M1MDJBOgorCQkJZmxwLT50aW1lci5leHBpcmVzID0gMTsKKwkJCWFkZF90aW1lcigmZmxwLT50aW1lcik7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfUzUwMkU6CisJCQlmbHAtPnN0YXRlIHw9IFNETEFfUzUwMkVfRU5BQkxFOworCQkJb3V0YihmbHAtPnN0YXRlLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQkJZmxwLT5zdGF0ZSB8PSBTRExBX1M1MDJFX0lOVEFDSzsKKwkJCW91dGIoZmxwLT5zdGF0ZSwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWJ5dGUgPSAwOworCQkJc2RsYV93cml0ZShkZXYsIFNETEFfNTAyX0lSUV9JTlRFUkZBQ0UsICZieXRlLCBzaXplb2YoYnl0ZSkpOworCQkJaW50ci5mbGFncyA9IFNETEFfSU5UUl9SWCB8IFNETEFfSU5UUl9TVEFUVVMgfCBTRExBX0lOVFJfTU9ERU07CisJCQlzZGxhX2NtZChkZXYsIFNETEFfU0VUX0lSUV9UUklHR0VSLCAwLCAwLCAmaW50ciwgc2l6ZW9mKGNoYXIpICsgc2l6ZW9mKHNob3J0KSwgTlVMTCwgTlVMTCk7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfUzUwNzoKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9TNTA4OgorCQkJZmxwLT5zdGF0ZSB8PSBTRExBX1M1MDhfSU5URU47CisJCQlvdXRiKGZscC0+c3RhdGUsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlieXRlID0gMDsKKwkJCXNkbGFfd3JpdGUoZGV2LCBTRExBXzUwOF9JUlFfSU5URVJGQUNFLCAmYnl0ZSwgc2l6ZW9mKGJ5dGUpKTsKKwkJCWludHIuZmxhZ3MgPSBTRExBX0lOVFJfUlggfCBTRExBX0lOVFJfU1RBVFVTIHwgU0RMQV9JTlRSX01PREVNOworCQkJaW50ci5pcnEgPSBkZXYtPmlycTsKKwkJCXNkbGFfY21kKGRldiwgU0RMQV9TRVRfSVJRX1RSSUdHRVIsIDAsIDAsICZpbnRyLCBzaXplb2Yoc3RydWN0IGludHJfaW5mbyksIE5VTEwsIE5VTEwpOworCQkJYnJlYWs7CisJfQorCisJaWYgKGZscC0+Y29uZmlnLnN0YXRpb24gPT0gRlJBRF9TVEFUSU9OX0NQRSkKKwl7CisJCWJ5dGUgPSBTRExBX0lDU19TVEFUVVNfRU5ROworCQlzZGxhX2NtZChkZXYsIFNETEFfSVNTVUVfSU5fQ0hBTk5FTF9TSUdOQUwsIDAsIDAsICZieXRlLCBzaXplb2YoYnl0ZSksIE5VTEwsIE5VTEwpOworCX0KKwllbHNlCisJeworCQlzZGxhX2NtZChkZXYsIFNETEFfQUREX0RMQ0ksIDAsIDAsIGRhdGEuZGxjaSwgbGVuIC0gc2l6ZW9mKHN0cnVjdCBmcmFkX2NvbmYpLCBOVUxMLCBOVUxMKTsKKwkJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCQlpZiAoZmxwLT5kbGNpW2ldID4gMCkKKwkJCQlzZGxhX2NtZChkZXYsIFNETEFfQUNUSVZBVEVfRExDSSwgMCwgMCwgJmZscC0+ZGxjaVtpXSwgMipzaXplb2YoZmxwLT5kbGNpW2ldKSwgTlVMTCwgTlVMTCk7CisJfQorCisJLyogY29uZmlndXJlIGFueSBzcGVjaWZpYyBETENJIHNldHRpbmdzICovCisJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCWlmIChmbHAtPmRsY2lbaV0pCisJCXsKKwkJCWRscCA9IGZscC0+bWFzdGVyW2ldLT5wcml2OworCQkJaWYgKGRscC0+Y29uZmlndXJlZCkKKwkJCQlzZGxhX2NtZChkZXYsIFNETEFfU0VUX0RMQ0lfQ09ORklHVVJBVElPTiwgYWJzKGZscC0+ZGxjaVtpXSksIDAsICZkbHAtPmNvbmZpZywgc2l6ZW9mKHN0cnVjdCBkbGNpX2NvbmYpLCBOVUxMLCBOVUxMKTsKKwkJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgc2RsYV9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGZyYWRfY29uZiBfX3VzZXIgKmNvbmYsIGludCBnZXQpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlzdHJ1Y3QgY29uZl9kYXRhICBkYXRhOworCWludCAgICAgICAgICAgICAgIGk7CisJc2hvcnQgICAgICAgICAgICAgc2l6ZTsKKworCWlmIChkZXYtPnR5cGUgPT0gMHhGRkZGKQorCQlyZXR1cm4oLUVVTkFUQ0gpOworCisJZmxwID0gZGV2LT5wcml2OworCisJaWYgKCFnZXQpCisJeworCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQkJcmV0dXJuKC1FQlVTWSk7CisKKwkJaWYoY29weV9mcm9tX3VzZXIoJmRhdGEuY29uZmlnLCBjb25mLCBzaXplb2Yoc3RydWN0IGZyYWRfY29uZikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGRhdGEuY29uZmlnLnN0YXRpb24gJiB+RlJBRF9TVEFUSU9OX05PREUpCisJCQlyZXR1cm4oLUVJTlZBTCk7CisKKwkJaWYgKGRhdGEuY29uZmlnLmZsYWdzICYgfkZSQURfVkFMSURfRkxBR1MpCisJCQlyZXR1cm4oLUVJTlZBTCk7CisKKwkJaWYgKChkYXRhLmNvbmZpZy5rYmF1ZCA8IDApIHx8IAorCQkJICgoZGF0YS5jb25maWcua2JhdWQgPiAxMjgpICYmIChmbHAtPnR5cGUgIT0gU0RMQV9TNTA4KSkpCisJCQlyZXR1cm4oLUVJTlZBTCk7CisKKwkJaWYgKGRhdGEuY29uZmlnLmNsb2NraW5nICYgfihGUkFEX0NMT0NLX0lOVCB8IFNETEFfUzUwOF9QT1JUX1JTMjMyKSkKKwkJCXJldHVybigtRUlOVkFMKTsKKworCQlpZiAoKGRhdGEuY29uZmlnLm10dSA8IDApIHx8IChkYXRhLmNvbmZpZy5tdHUgPiBTRExBX01BWF9NVFUpKQorCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCWlmICgoZGF0YS5jb25maWcuVDM5MSA8IDUpIHx8IChkYXRhLmNvbmZpZy5UMzkxID4gMzApKQorCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCWlmICgoZGF0YS5jb25maWcuVDM5MiA8IDUpIHx8IChkYXRhLmNvbmZpZy5UMzkyID4gMzApKQorCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCWlmICgoZGF0YS5jb25maWcuTjM5MSA8IDEpIHx8IChkYXRhLmNvbmZpZy5OMzkxID4gMjU1KSkKKwkJCXJldHVybigtRUlOVkFMKTsKKworCQlpZiAoKGRhdGEuY29uZmlnLk4zOTIgPCAxKSB8fCAoZGF0YS5jb25maWcuTjM5MiA+IDEwKSkKKwkJCXJldHVybigtRUlOVkFMKTsKKworCQlpZiAoKGRhdGEuY29uZmlnLk4zOTMgPCAxKSB8fCAoZGF0YS5jb25maWcuTjM5MyA+IDEwKSkKKwkJCXJldHVybigtRUlOVkFMKTsKKworCQltZW1jcHkoJmZscC0+Y29uZmlnLCAmZGF0YS5jb25maWcsIHNpemVvZihzdHJ1Y3QgZnJhZF9jb25mKSk7CisJCWZscC0+Y29uZmlnLmZsYWdzIHw9IFNETEFfRElSRUNUX1JFQ1Y7CisKKwkJaWYgKGZscC0+dHlwZSA9PSBTRExBX1M1MDgpCisJCQlmbHAtPmNvbmZpZy5mbGFncyB8PSBTRExBX1RYNzBfUlgzMDsKKworCQlpZiAoZGV2LT5tdHUgIT0gZmxwLT5jb25maWcubXR1KQorCQl7CisJCQkvKiB0aGlzIGlzIHJlcXVpcmVkIHRvIGNoYW5nZSB0aGUgTVRVICovCisJCQlkZXYtPm10dSA9IGZscC0+Y29uZmlnLm10dTsKKwkJCWZvcihpPTA7aTxDT05GSUdfRExDSV9NQVg7aSsrKQorCQkJCWlmIChmbHAtPm1hc3RlcltpXSkKKwkJCQkJZmxwLT5tYXN0ZXJbaV0tPm10dSA9IGZscC0+Y29uZmlnLm10dTsKKwkJfQorCisJCWZscC0+Y29uZmlnLm10dSArPSBzaXplb2Yoc3RydWN0IGZyaGRyKTsKKworCQkvKiBvZmYgdG8gdGhlIHJhY2VzISAqLworCQlpZiAoIWZscC0+Y29uZmlndXJlZCkKKwkJCXNkbGFfc3RhcnQoZGV2KTsKKworCQlmbHAtPmNvbmZpZ3VyZWQgPSAxOworCX0KKwllbHNlCisJeworCQkvKiBubyBzZW5zZSByZWFkaW5nIGlmIHRoZSBDUFUgaXNuJ3Qgc3RhcnRlZCAqLworCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQl7CisJCQlzaXplID0gc2l6ZW9mKGRhdGEpOworCQkJaWYgKHNkbGFfY21kKGRldiwgU0RMQV9SRUFEX0RMQ0lfQ09ORklHVVJBVElPTiwgMCwgMCwgTlVMTCwgMCwgJmRhdGEsICZzaXplKSAhPSBTRExBX1JFVF9PSykKKwkJCQlyZXR1cm4oLUVJTyk7CisJCX0KKwkJZWxzZQorCQkJaWYgKGZscC0+Y29uZmlndXJlZCkKKwkJCQltZW1jcHkoJmRhdGEuY29uZmlnLCAmZmxwLT5jb25maWcsIHNpemVvZihzdHJ1Y3QgZnJhZF9jb25mKSk7CisJCQllbHNlCisJCQkJbWVtc2V0KCZkYXRhLmNvbmZpZywgMCwgc2l6ZW9mKHN0cnVjdCBmcmFkX2NvbmYpKTsKKworCQltZW1jcHkoJmZscC0+Y29uZmlnLCAmZGF0YS5jb25maWcsIHNpemVvZihzdHJ1Y3QgZnJhZF9jb25mKSk7CisJCWRhdGEuY29uZmlnLmZsYWdzICY9IEZSQURfVkFMSURfRkxBR1M7CisJCWRhdGEuY29uZmlnLm10dSAtPSBkYXRhLmNvbmZpZy5tdHUgPiBzaXplb2Yoc3RydWN0IGZyaGRyKSA/IHNpemVvZihzdHJ1Y3QgZnJoZHIpIDogZGF0YS5jb25maWcubXR1OworCQlyZXR1cm4gY29weV90b191c2VyKGNvbmYsICZkYXRhLmNvbmZpZywgc2l6ZW9mKHN0cnVjdCBmcmFkX2NvbmYpKT8tRUZBVUxUOjA7CisJfQorCisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IHNkbGFfeGZlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2RsYV9tZW0gX191c2VyICppbmZvLCBpbnQgcmVhZCkKK3sKKwlzdHJ1Y3Qgc2RsYV9tZW0gbWVtOworCWNoYXIJKnRlbXA7CisKKwlpZihjb3B5X2Zyb21fdXNlcigmbWVtLCBpbmZvLCBzaXplb2YobWVtKSkpCisJCXJldHVybiAtRUZBVUxUOworCQkKKwlpZiAocmVhZCkKKwl7CQorCQl0ZW1wID0ga21hbGxvYyhtZW0ubGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0ZW1wKQorCQkJcmV0dXJuKC1FTk9NRU0pOworCQltZW1zZXQodGVtcCwgMCwgbWVtLmxlbik7CisJCXNkbGFfcmVhZChkZXYsIG1lbS5hZGRyLCB0ZW1wLCBtZW0ubGVuKTsKKwkJaWYoY29weV90b191c2VyKG1lbS5kYXRhLCB0ZW1wLCBtZW0ubGVuKSkKKwkJeworCQkJa2ZyZWUodGVtcCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlrZnJlZSh0ZW1wKTsKKwl9CisJZWxzZQorCXsKKwkJdGVtcCA9IGttYWxsb2MobWVtLmxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghdGVtcCkKKwkJCXJldHVybigtRU5PTUVNKTsKKwkJaWYoY29weV9mcm9tX3VzZXIodGVtcCwgbWVtLmRhdGEsIG1lbS5sZW4pKQorCQl7CisJCQlrZnJlZSh0ZW1wKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXNkbGFfd3JpdGUoZGV2LCBtZW0uYWRkciwgdGVtcCwgbWVtLmxlbik7CisJCWtmcmVlKHRlbXApOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgc2RsYV9yZWNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7CisJc3RydWN0IGNvbmZfZGF0YSAgZGF0YTsKKwlpbnQgICAgICAgICAgICAgICBpLCBsZW47CisKKwlmbHAgPSBkZXYtPnByaXY7CisKKwlsZW4gPSAwOworCWZvcihpPTA7aTxDT05GSUdfRExDSV9NQVg7aSsrKQorCQlpZiAoZmxwLT5kbGNpW2ldKQorCQkJZGF0YS5kbGNpW2xlbisrXSA9IGZscC0+ZGxjaVtpXTsKKwlsZW4gKj0gMjsKKworCW1lbWNweSgmZGF0YSwgJmZscC0+Y29uZmlnLCBzaXplb2Yoc3RydWN0IGZyYWRfY29uZikpOworCWxlbiArPSBzaXplb2Yoc3RydWN0IGZyYWRfY29uZik7CisKKwlzZGxhX2NtZChkZXYsIFNETEFfRElTQUJMRV9DT01NVU5JQ0FUSU9OUywgMCwgMCwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisJc2RsYV9jbWQoZGV2LCBTRExBX1NFVF9ETENJX0NPTkZJR1VSQVRJT04sIDAsIDAsICZkYXRhLCBsZW4sIE5VTEwsIE5VTEwpOworCXNkbGFfY21kKGRldiwgU0RMQV9FTkFCTEVfQ09NTVVOSUNBVElPTlMsIDAsIDAsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworCisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IHNkbGFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKworCWlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCQkKKwlmbHAgPSBkZXYtPnByaXY7CisKKwlpZiAoIWZscC0+aW5pdGlhbGl6ZWQpCisJCXJldHVybigtRUlOVkFMKTsKKworCXN3aXRjaCAoY21kKQorCXsKKwkJY2FzZSBGUkFEX0dFVF9DT05GOgorCQljYXNlIEZSQURfU0VUX0NPTkY6CisJCQlyZXR1cm4oc2RsYV9jb25maWcoZGV2LCBpZnItPmlmcl9kYXRhLCBjbWQgPT0gRlJBRF9HRVRfQ09ORikpOworCisJCWNhc2UgU0RMQV9JREVOVElGWToKKwkJCWlmci0+aWZyX2ZsYWdzID0gZmxwLT50eXBlOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX0NQVVNQRUVEOgorCQkJcmV0dXJuKHNkbGFfY3B1c3BlZWQoZGV2LCBpZnIpKTsgCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK05PVEU6ICBUaGlzIGlzIHJhdGhlciBhIHVzZWxlc3MgYWN0aW9uIHJpZ2h0IG5vdywgYXMgdGhlCisgICAgICAgY3VycmVudCBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBwcm90b2NvbHMgb3RoZXIgdGhhbgorICAgICAgIEZSLiAgSG93ZXZlciwgU2FuZ29tYSBoYXMgbW9kdWxlcyBmb3IgYSBudW1iZXIgb2YKKyAgICAgICBvdGhlciBwcm90b2NvbHMgaW4gdGhlIHdvcmtzLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJY2FzZSBTRExBX1BST1RPQ09MOgorCQkJaWYgKGZscC0+Y29uZmlndXJlZCkKKwkJCQlyZXR1cm4oLUVBTFJFQURZKTsKKworCQkJc3dpdGNoIChpZnItPmlmcl9mbGFncykKKwkJCXsKKwkJCQljYXNlIEFSUEhSRF9GUkFEOgorCQkJCQlkZXYtPnR5cGUgPSBpZnItPmlmcl9mbGFnczsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuKC1FTk9QUk9UT09QVCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNETEFfQ0xFQVJNRU06CisJCQlzZGxhX2NsZWFyKGRldik7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfV1JJVEVNRU06CisJCWNhc2UgU0RMQV9SRUFETUVNOgorCQkJaWYoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCXJldHVybihzZGxhX3hmZXIoZGV2LCBpZnItPmlmcl9kYXRhLCBjbWQgPT0gU0RMQV9SRUFETUVNKSk7CisKKwkJY2FzZSBTRExBX1NUQVJUOgorCQkJc2RsYV9zdGFydChkZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1NUT1A6CisJCQlzZGxhX3N0b3AoZGV2KTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oLUVPUE5PVFNVUFApOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK2ludCBzZGxhX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKworCWZscCA9IGRldi0+cHJpdjsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybigtRUJVU1kpOworCisJLyogZm9yIG5vdywgeW91IGNhbid0IGNoYW5nZSB0aGUgTVRVISAqLworCXJldHVybigtRU9QTk9UU1VQUCk7Cit9CisKK2ludCBzZGxhX3NldF9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlpbnQgICAgICAgICAgICAgICBpOworCWNoYXIgICAgICAgICAgICAgIGJ5dGU7CisJdW5zaWduZWQgYmFzZTsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCWZscCA9IGRldi0+cHJpdjsKKworCWlmIChmbHAtPmluaXRpYWxpemVkKQorCQlyZXR1cm4oLUVJTlZBTCk7CisKKwlmb3IoaT0wO2kgPCBzaXplb2YodmFsaWRfcG9ydCkgLyBzaXplb2YgKGludCkgOyBpKyspCisJCWlmICh2YWxpZF9wb3J0W2ldID09IG1hcC0+YmFzZV9hZGRyKQorCQkJYnJlYWs7ICAgCisKKwlpZiAoaSA9PSBzaXplb2YodmFsaWRfcG9ydCkgLyBzaXplb2YoaW50KSkKKwkJcmV0dXJuKC1FSU5WQUwpOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihtYXAtPmJhc2VfYWRkciwgU0RMQV9JT19FWFRFTlRTLCBkZXYtPm5hbWUpKXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU0RMQTogaW8tcG9ydCAweCUwNGx4IGluIHVzZSBcbiIsIGRldi0+YmFzZV9hZGRyKTsKKwkJcmV0dXJuKC1FSU5WQUwpOworCX0KKwliYXNlID0gbWFwLT5iYXNlX2FkZHI7CisKKwkvKiB0ZXN0IGZvciBjYXJkIHR5cGVzLCBTNTAyQSwgUzUwMkUsIFM1MDcsIFM1MDggICAgICAgICAgICAgICAgICovCisJLyogdGhlc2UgdGVzdHMgc2h1dCBkb3duIHRoZSBjYXJkIGNvbXBsZXRlbHksIHNvIGNsZWFyIHRoZSBzdGF0ZSAqLworCWZscC0+dHlwZSA9IFNETEFfVU5LTk9XTjsKKwlmbHAtPnN0YXRlID0gMDsKKyAgIAorCWZvcihpPTE7aTxTRExBX0lPX0VYVEVOVFM7aSsrKQorCQlpZiAoaW5iKGJhc2UgKyBpKSAhPSAweEZGKQorCQkJYnJlYWs7CisKKwlpZiAoaSA9PSBTRExBX0lPX0VYVEVOVFMpIHsgICAKKwkJb3V0YihTRExBX0hBTFQsIGJhc2UgKyBTRExBX1JFR19aODBfQ09OVFJPTCk7CisJCWlmICgoaW5iKGJhc2UgKyBTRExBX1M1MDJfU1RTKSAmIDB4MEYpID09IDB4MDgpIHsKKwkJCW91dGIoU0RMQV9TNTAyRV9JTlRBQ0ssIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWlmICgoaW5iKGJhc2UgKyBTRExBX1M1MDJfU1RTKSAmIDB4MEYpID09IDB4MEMpIHsKKwkJCQlvdXRiKFNETEFfSEFMVCwgYmFzZSArIFNETEFfUkVHX0NPTlRST0wpOworCQkJCWZscC0+dHlwZSA9IFNETEFfUzUwMkU7CisJCQkJZ290byBnb3RfdHlwZTsKKwkJCX0KKwkJfQorCX0KKworCWZvcihieXRlPWluYihiYXNlKSxpPTA7aTxTRExBX0lPX0VYVEVOVFM7aSsrKQorCQlpZiAoaW5iKGJhc2UgKyBpKSAhPSBieXRlKQorCQkJYnJlYWs7CisKKwlpZiAoaSA9PSBTRExBX0lPX0VYVEVOVFMpIHsKKwkJb3V0YihTRExBX0hBTFQsIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJaWYgKChpbmIoYmFzZSArIFNETEFfUzUwMl9TVFMpICYgMHg3RSkgPT0gMHgzMCkgeworCQkJb3V0YihTRExBX1M1MDdfRU5BQkxFLCBiYXNlICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlpZiAoKGluYihiYXNlICsgU0RMQV9TNTAyX1NUUykgJiAweDdFKSA9PSAweDMyKSB7CisJCQkJb3V0YihTRExBX0hBTFQsIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCQlmbHAtPnR5cGUgPSBTRExBX1M1MDc7CisJCQkJZ290byBnb3RfdHlwZTsKKwkJCX0KKwkJfQorCX0KKworCW91dGIoU0RMQV9IQUxULCBiYXNlICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJaWYgKChpbmIoYmFzZSArIFNETEFfUzUwOF9TVFMpICYgMHgzRikgPT0gMHgwMCkgeworCQlvdXRiKFNETEFfUzUwOF9JTlRFTiwgYmFzZSArIFNETEFfUkVHX0NPTlRST0wpOworCQlpZiAoKGluYihiYXNlICsgU0RMQV9TNTA4X1NUUykgJiAweDNGKSA9PSAweDEwKSB7CisJCQlvdXRiKFNETEFfSEFMVCwgYmFzZSArIFNETEFfUkVHX0NPTlRST0wpOworCQkJZmxwLT50eXBlID0gU0RMQV9TNTA4OworCQkJZ290byBnb3RfdHlwZTsKKwkJfQorCX0KKworCW91dGIoU0RMQV9TNTAyQV9IQUxULCBiYXNlICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJaWYgKGluYihiYXNlICsgU0RMQV9TNTAyX1NUUykgPT0gMHg0MCkgeworCQlvdXRiKFNETEFfUzUwMkFfU1RBUlQsIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJaWYgKGluYihiYXNlICsgU0RMQV9TNTAyX1NUUykgPT0gMHg0MCkgeworCQkJb3V0YihTRExBX1M1MDJBX0lOVEVOLCBiYXNlICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlpZiAoaW5iKGJhc2UgKyBTRExBX1M1MDJfU1RTKSA9PSAweDQ0KSB7CisJCQkJb3V0YihTRExBX1M1MDJBX1NUQVJULCBiYXNlICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQkJZmxwLT50eXBlID0gU0RMQV9TNTAyQTsKKwkJCQlnb3RvIGdvdF90eXBlOworCQkJfQorCQl9CisJfQorCisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogVW5rbm93biBjYXJkIHR5cGVcbiIsIGRldi0+bmFtZSk7CisJZXJyID0gLUVOT0RFVjsKKwlnb3RvIGZhaWw7CisKK2dvdF90eXBlOgorCXN3aXRjaChiYXNlKSB7CisJCWNhc2UgMHgyNzA6CisJCWNhc2UgMHgyODA6CisJCWNhc2UgMHgzODA6IAorCQljYXNlIDB4MzkwOgorCQkJaWYgKGZscC0+dHlwZSAhPSBTRExBX1M1MDggJiYgZmxwLT50eXBlICE9IFNETEFfUzUwNykKKwkJCQlnb3RvIGZhaWw7CisJfQorCisJc3dpdGNoIChtYXAtPmlycSkgeworCQljYXNlIDI6CisJCQlpZiAoZmxwLT50eXBlICE9IFNETEFfUzUwMkUpCisJCQkJZ290byBmYWlsOworCQkJYnJlYWs7CisKKwkJY2FzZSAxMDoKKwkJY2FzZSAxMToKKwkJY2FzZSAxMjoKKwkJY2FzZSAxNToKKwkJY2FzZSA0OgorCQkJaWYgKGZscC0+dHlwZSAhPSBTRExBX1M1MDggJiYgZmxwLT50eXBlICE9IFNETEFfUzUwNykKKwkJCQlnb3RvIGZhaWw7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQljYXNlIDU6CisJCWNhc2UgNzoKKwkJCWlmIChmbHAtPnR5cGUgPT0gU0RMQV9TNTAyQSkKKwkJCQlnb3RvIGZhaWw7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZ290byBmYWlsOworCX0KKworCWVyciA9IC1FQUdBSU47CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmc2RsYV9pc3IsIDAsIGRldi0+bmFtZSwgZGV2KSkgCisJCWdvdG8gZmFpbDsKKworCWlmIChmbHAtPnR5cGUgPT0gU0RMQV9TNTA3KSB7CisJCXN3aXRjaChkZXYtPmlycSkgeworCQkJY2FzZSAzOgorCQkJCWZscC0+c3RhdGUgPSBTRExBX1M1MDdfSVJRMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTA3X0lSUTQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJZmxwLT5zdGF0ZSA9IFNETEFfUzUwN19JUlE1OworCQkJCWJyZWFrOworCQkJY2FzZSA3OgorCQkJCWZscC0+c3RhdGUgPSBTRExBX1M1MDdfSVJRNzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTA6CisJCQkJZmxwLT5zdGF0ZSA9IFNETEFfUzUwN19JUlExMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTE6CisJCQkJZmxwLT5zdGF0ZSA9IFNETEFfUzUwN19JUlExMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTI6CisJCQkJZmxwLT5zdGF0ZSA9IFNETEFfUzUwN19JUlExMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTU6CisJCQkJZmxwLT5zdGF0ZSA9IFNETEFfUzUwN19JUlExNTsKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWZvcihpPTA7aSA8IHNpemVvZih2YWxpZF9tZW0pIC8gc2l6ZW9mIChpbnQpIDsgaSsrKQorCQlpZiAodmFsaWRfbWVtW2ldID09IG1hcC0+bWVtX3N0YXJ0KQorCQkJYnJlYWs7ICAgCisKKwllcnIgPSAtRUlOVkFMOworCWlmIChpID09IHNpemVvZih2YWxpZF9tZW0pIC8gc2l6ZW9mKGludCkpCisJCWdvdG8gZmFpbDI7CisKKwlpZiAoZmxwLT50eXBlID09IFNETEFfUzUwMkEgJiYgKG1hcC0+bWVtX3N0YXJ0ICYgMHhGMDAwKSA+PiAxMiA9PSAweDBFKQorCQlnb3RvIGZhaWwyOworCisJaWYgKGZscC0+dHlwZSAhPSBTRExBX1M1MDcgJiYgbWFwLT5tZW1fc3RhcnQgPj4gMTYgPT0gMHgwQikKKwkJZ290byBmYWlsMjsKKworCWlmIChmbHAtPnR5cGUgPT0gU0RMQV9TNTA3ICYmIG1hcC0+bWVtX3N0YXJ0ID4+IDE2ID09IDB4MEQpCisJCWdvdG8gZmFpbDI7CisKKwlieXRlID0gZmxwLT50eXBlICE9IFNETEFfUzUwOCA/IFNETEFfOEtfV0lORE9XIDogMDsKKwlieXRlIHw9IChtYXAtPm1lbV9zdGFydCAmIDB4RjAwMCkgPj4gKDEyICsgKGZscC0+dHlwZSA9PSBTRExBX1M1MDggPyAxIDogMCkpOworCXN3aXRjaChmbHAtPnR5cGUpIHsKKwkJY2FzZSBTRExBX1M1MDJBOgorCQljYXNlIFNETEFfUzUwMkU6CisJCQlzd2l0Y2ggKG1hcC0+bWVtX3N0YXJ0ID4+IDE2KSB7CisJCQkJY2FzZSAweDBBOgorCQkJCQlieXRlIHw9IFNETEFfUzUwMl9TRUdfQTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDBDOgorCQkJCQlieXRlIHw9IFNETEFfUzUwMl9TRUdfQzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDBEOgorCQkJCQlieXRlIHw9IFNETEFfUzUwMl9TRUdfRDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDBFOgorCQkJCQlieXRlIHw9IFNETEFfUzUwMl9TRUdfRTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTRExBX1M1MDc6CisJCQlzd2l0Y2ggKG1hcC0+bWVtX3N0YXJ0ID4+IDE2KSB7CisJCQkJY2FzZSAweDBBOgorCQkJCQlieXRlIHw9IFNETEFfUzUwN19TRUdfQTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDBCOgorCQkJCQlieXRlIHw9IFNETEFfUzUwN19TRUdfQjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDBDOgorCQkJCQlieXRlIHw9IFNETEFfUzUwN19TRUdfQzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDBFOgorCQkJCQlieXRlIHw9IFNETEFfUzUwN19TRUdfRTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTRExBX1M1MDg6CisJCQlzd2l0Y2ggKG1hcC0+bWVtX3N0YXJ0ID4+IDE2KSB7CisJCQkJY2FzZSAweDBBOgorCQkJCQlieXRlIHw9IFNETEFfUzUwOF9TRUdfQTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDBDOgorCQkJCQlieXRlIHw9IFNETEFfUzUwOF9TRUdfQzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDBEOgorCQkJCQlieXRlIHw9IFNETEFfUzUwOF9TRUdfRDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDBFOgorCQkJCQlieXRlIHw9IFNETEFfUzUwOF9TRUdfRTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwl9CisKKwkvKiBzZXQgdGhlIG1lbW9yeSBiaXRzLCBhbmQgZW5hYmxlIGFjY2VzcyAqLworCW91dGIoYnl0ZSwgYmFzZSArIFNETEFfUkVHX1BDX1dJTkRPVyk7CisKKwlzd2l0Y2goZmxwLT50eXBlKQorCXsKKwkJY2FzZSBTRExBX1M1MDJFOgorCQkJZmxwLT5zdGF0ZSA9IFNETEFfUzUwMkVfRU5BQkxFOworCQkJYnJlYWs7CisJCWNhc2UgU0RMQV9TNTA3OgorCQkJZmxwLT5zdGF0ZSB8PSBTRExBX01FTUVOOworCQkJYnJlYWs7CisJCWNhc2UgU0RMQV9TNTA4OgorCQkJZmxwLT5zdGF0ZSA9IFNETEFfTUVNRU47CisJCQlicmVhazsKKwl9CisJb3V0YihmbHAtPnN0YXRlLCBiYXNlICsgU0RMQV9SRUdfQ09OVFJPTCk7CisKKwlkZXYtPmlycSA9IG1hcC0+aXJxOworCWRldi0+YmFzZV9hZGRyID0gYmFzZTsKKwlkZXYtPm1lbV9zdGFydCA9IG1hcC0+bWVtX3N0YXJ0OworCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgMHgyMDAwOworCWZscC0+aW5pdGlhbGl6ZWQgPSAxOworCXJldHVybiAwOworCitmYWlsMjoKKwlmcmVlX2lycShtYXAtPmlycSwgZGV2KTsKK2ZhaWw6CisJcmVsZWFzZV9yZWdpb24oYmFzZSwgU0RMQV9JT19FWFRFTlRTKTsKKwlyZXR1cm4gZXJyOworfQorIAorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzZGxhX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlmbHAgPSBkZXYtPnByaXY7CisKKwlyZXR1cm4oJmZscC0+c3RhdHMpOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9zZGxhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscCA9IGRldi0+cHJpdjsKKworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJZGV2LT5mbGFncwkJPSAwOworCWRldi0+dHlwZQkJPSAweEZGRkY7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSAwOworCWRldi0+YWRkcl9sZW4JCT0gMDsKKwlkZXYtPm10dQkJPSBTRExBX01BWF9NVFU7CisKKwlkZXYtPm9wZW4JCT0gc2RsYV9vcGVuOworCWRldi0+c3RvcAkJPSBzZGxhX2Nsb3NlOworCWRldi0+ZG9faW9jdGwJCT0gc2RsYV9pb2N0bDsKKwlkZXYtPnNldF9jb25maWcJCT0gc2RsYV9zZXRfY29uZmlnOworCWRldi0+Z2V0X3N0YXRzCQk9IHNkbGFfc3RhdHM7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBzZGxhX3RyYW5zbWl0OworCWRldi0+Y2hhbmdlX210dQkJPSBzZGxhX2NoYW5nZV9tdHU7CisKKwlmbHAtPmFjdGl2YXRlCQk9IHNkbGFfYWN0aXZhdGU7CisJZmxwLT5kZWFjdGl2YXRlCQk9IHNkbGFfZGVhY3RpdmF0ZTsKKwlmbHAtPmFzc29jCQk9IHNkbGFfYXNzb2M7CisJZmxwLT5kZWFzc29jCQk9IHNkbGFfZGVhc3NvYzsKKwlmbHAtPmRsY2lfY29uZgkJPSBzZGxhX2RsY2lfY29uZjsKKworCWluaXRfdGltZXIoJmZscC0+dGltZXIpOworCWZscC0+dGltZXIuZXhwaXJlcwk9IDE7CisJZmxwLT50aW1lci5kYXRhCQk9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJZmxwLT50aW1lci5mdW5jdGlvbgk9IHNkbGFfcG9sbDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpzZGxhOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NkbGEodm9pZCkKK3sKKwlpbnQgZXJyOworCisJcHJpbnRrKCIlcy5cbiIsIHZlcnNpb24pOworCisJc2RsYSA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGZyYWRfbG9jYWwpLCAic2RsYTAiLCBzZXR1cF9zZGxhKTsKKwlpZiAoIXNkbGEpIAorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihzZGxhKTsKKwlpZiAoZXJyKSAKKwkJZnJlZV9uZXRkZXYoc2RsYSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9zZGxhKHZvaWQpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscCA9IHNkbGEtPnByaXY7CisKKwl1bnJlZ2lzdGVyX25ldGRldihzZGxhKTsKKwlpZiAoZmxwLT5pbml0aWFsaXplZCkgeworCQlmcmVlX2lycShzZGxhLT5pcnEsIHNkbGEpOworCQlyZWxlYXNlX3JlZ2lvbihzZGxhLT5iYXNlX2FkZHIsIFNETEFfSU9fRVhURU5UUyk7CisJfQorCWRlbF90aW1lcl9zeW5jKCZmbHAtPnRpbWVyKTsKKwlmcmVlX25ldGRldihzZGxhKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpbml0X3NkbGEpOworbW9kdWxlX2V4aXQoZXhpdF9zZGxhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhX2NoZGxjLmMgYi9kcml2ZXJzL25ldC93YW4vc2RsYV9jaGRsYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYmUwMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vc2RsYV9jaGRsYy5jCkBAIC0wLDAgKzEsNDQzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHNkbGFfY2hkbGMuYwlXQU5QSVBFKHRtKSBNdWx0aXByb3RvY29sIFdBTiBMaW5rIERyaXZlci4gQ2lzY28gSERMQyBtb2R1bGUuCisqCisqIEF1dGhvcnM6IAlOZW5hZCBDb3JiaWMgPG5jb3JiaWNAc2FuZ29tYS5jb20+CisqCQlHaWRlb24gSGFjayAgCisqCisqIENvcHlyaWdodDoJKGMpIDE5OTUtMjAwMSBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuCisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIEZlYiAyOCwgMjAwMSAgTmVuYWQgQ29yYmljCVVwZGF0ZWQgaWZfdHhfdGltZW91dCgpIHJvdXRpbmUgZm9yIAorKiAJCQkJMi40Llgga2VybmVscy4KKyogSmFuIDI1LCAyMDAxICBOZW5hZCBDb3JiaWMJQWRkZWQgYSBUVFkgU3luYyBzZXJpYWwgZHJpdmVyIG92ZXIgdGhlCisqIAkJCQlIRExDIHN0cmVhbWluZyBwcm90b2NvbAorKiAJCQkJQWRkZWQgYSBUVFkgQXN5bmMgc2VyaWFsIGRyaXZlciBvdmVyIHRoZQorKiAJCQkJQXN5bmMgcHJvdG9jb2wuCisqIERlYyAxNSwgMjAwMCAgTmVuYWQgQ29yYmljICAgIFVwZGF0ZWQgZm9yIDIuNC5YIEtlcm5lbCBzdXBwb3J0CisqIE5vdiAxMywgMjAwMCAgTmVuYWQgQ29yYmljICAgIEFkZGVkIHRydWUgaW50ZXJmYWNlIHR5cGUgZW5jb2Rpbmcgb3B0aW9uLgorKiAJCQkJVGNwZHVtcCBkb2Vzbid0IHN1cHBvcnQgQ0hETEMgaW50ZWZhY2UKKyogCQkJCXR5cGVzLCB0byBmaXggdGhpcyAidHJ1ZSB0eXBlIiBvcHRpb24gd2lsbCBzZXQKKyogCQkJCXRoZSBpbnRlcmZhY2UgdHlwZSB0byBSQVcgSVAgbW9kZS4KKyogTm92IDA3LCAyMDAwICBOZW5hZCBDb3JiaWMJQWRkZWQgc2VjdXJpdHkgZmVhdHVyZXMgZm9yIFVEUCBkZWJ1Z2dpbmc6CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnkgYWxsIGFuZCBzcGVjaWZ5IGFsbG93ZWQgcmVxdWVzdHMuCisqIEp1biAyMCwgMjAwMCAgTmVuYWQgQ29yYmljCUZpeGVkIHRoZSBBUEkgSVAgRVJST1IgYnVnLiBDYXVzZWQgYnkgdGhlIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3QgdXBkYXRlLgorKiBNYXkgMDksIDIwMDAJTmVuYWQgQ29yYmljCU9wdGlvbiB0byBicmluZyBkb3duIGFuIGludGVyZmFjZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cG9uIGRpc2Nvbm5lY3QuCisqIE1hciAyMywgMjAwMCAgTmVuYWQgQ29yYmljCUltcHJvdmVkIHRhc2sgcXVldWUsIGJoIGhhbmRsaW5nLgorKiBNYXIgMTYsIDIwMDAJTmVuYWQgQ29yYmljCUZpeGVkIHRoZSBTTEFSUCBEeW5hbWljIElQIGFkZHJlc3NpbmcuCisqIE1hciAwNiwgMjAwMCAgTmVuYWQgQ29yYmljCUJ1ZyBGaXg6IGNvcnJ1cHRlZCBtYm94IHJlY292ZXJ5LgorKiBGZWIgMTAsIDIwMDAgIEdpZGVvbiBIYWNrICAgICBBZGRlZCBBU1lOQyBzdXBwb3J0LgorKiBGZWIgMDksIDIwMDAgIE5lbmFkIENvcmJpYyAgICBGaXhlZCB0d28gc2h1dGRvd24gYnVncyBpbiB1cGRhdGUoKSBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfc3RhdHMoKSBmdW5jdGlvbnMuCisqIEphbiAyNCwgMjAwMCAgTmVuYWQgQ29yYmljICAgIEZpeGVkIGEgc3RhcnR1cCB3YW5waXBlIHN0YXRlIHJhY2luZywgIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gYmV0d2VlbiBpZl9vcGVuIGFuZCBpc3IuIAorKiBKYW4gMTAsIDIwMDAgIE5lbmFkIENvcmJpYyAgICBBZGRlZCBuZXcgc29ja2V0IEFQSSBzdXBwb3J0LgorKiBEZXYgMTUsIDE5OTkgIE5lbmFkIENvcmJpYyAgICBGaXhlZCB1cCBoZWFkZXIgZmlsZXMgZm9yIDIuMC5YIGtlcm5lbHMKKyogTm92IDIwLCAxOTk5ICBOZW5hZCBDb3JiaWMgCUZpeGVkIHplcm8gbGVuZ3RoIEFQSSBidWcuCisqIFNlcCAzMCwgMTk5OSAgTmVuYWQgQ29yYmljICAgIEZpeGVkIGR5bmFtaWMgSVAgYW5kIHJvdXRlIHNldHVwLgorKiBTZXAgMjMsIDE5OTkgIE5lbmFkIENvcmJpYyAgICBBZGRlZCBTTVAgc3VwcG9ydCwgZml4ZWQgdHJhY2luZyAKKyogU2VwIDEzLCAxOTk5ICBOZW5hZCBDb3JiaWMJU3BsaXQgdXAgUG9ydCAwIGFuZCAxIGludG8gc2VwYXJhdGUgZGV2aWNlcy4KKyogSnVuIDAyLCAxOTk5ICBHaWRlb24gSGFjayAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIFM1MTQgYWRhcHRlci4KKyogT2N0IDMwLCAxOTk4CUphc3ByZWV0IFNpbmdoCUFkZGVkIFN1cHBvcnQgZm9yIENIRExDIEFQSSAoSERMQyBTVFJFQU1JTkcpLgorKiBPY3QgMjgsIDE5OTgJSmFzcHJlZXQgU2luZ2gJQWRkZWQgU3VwcG9ydCBmb3IgRHVhbCBQb3J0IENIRExDLgorKiBBdWcgMDcsIDE5OTgJRGF2aWQgRm9uZwlJbml0aWFsIHZlcnNpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSwgYW5kIG90aGVyIHVzZWZ1bCBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgkvKiBvZmZzZXRvZigpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogcmV0dXJuIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGlubGluZSBtZW1zZXQoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JLyoga21hbGxvYygpLCBrZnJlZSgpICovCisjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5waXBlLmg+CS8qIFdBTlBJUEUgY29tbW9uIHVzZXIgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CS8qIEFSUEhSRF8qIGRlZmluZXMgKi8KKworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbi5oPgkJLyogc29ja2FkZHJfaW4gKi8KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CQorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgkvKiBodG9ucygpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvc2RsYXBjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvc2RsYV9jaGRsYy5oPgkJLyogQ0hETEMgZmlybXdhcmUgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvc2RsYV9hc3kuaD4gICAgICAgICAgIAkvKiBDSERMQyAoYXN5bmMpIEFQSSBkZWZpbml0aW9ucyAqLworCisjaW5jbHVkZSA8bGludXgvaWZfd2FucGlwZV9jb21tb24uaD4gICAgLyogU29ja2V0IERyaXZlciBjb21tb24gYXJlYSAqLworI2luY2x1ZGUgPGxpbnV4L2lmX3dhbnBpcGUuaD4JCQorCisvKiBUVFkgSW5jbHVkZXMgKi8KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorCisKKy8qKioqKiogRGVmaW5lcyAmIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiByZWFzb25zIGZvciBlbmFibGluZyB0aGUgdGltZXIgaW50ZXJydXB0IG9uIHRoZSBhZGFwdGVyICovCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VRFAgICAJCTB4MDEKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1VQREFURQkJMHgwMgorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfQ09ORklHCQkweDEwCisKKyNkZWZpbmUgTUFYX0lQX0VSUk9SUwkxMAorCisjZGVmaW5lIFRUWV9DSERMQ19NQVhfTVRVCTIwMDAKKyNkZWZpbmUJQ0hETENfREZMVF9EQVRBX0xFTgkxNTAwCQkvKiBkZWZhdWx0IE1UVSAqLworI2RlZmluZSBDSERMQ19IRFJfTEVOCQkxCisKKyNkZWZpbmUgQ0hETENfQVBJIDB4MDEKKworI2RlZmluZSBQT1JUKHgpICAgKHggPT0gMCA/ICJQUklNQVJZIiA6ICJTRUNPTkRBUlkiICkKKyNkZWZpbmUgTUFYX0JIX0JVRkYJMTAKKworLy8jZGVmaW5lIFBSSU5UX0RFQlVHCisjaWZkZWYgUFJJTlRfREVCVUcKKyNkZWZpbmUgZGJnX3ByaW50ayhmb3JtYXQsIGEuLi4pIHByaW50ayhmb3JtYXQsICMjIGEpCisjZWxzZQorI2RlZmluZSBkYmdfcHJpbnRrKGZvcm1hdCwgYS4uLikKKyNlbmRpZiAgCisKKy8qKioqKipEYXRhIFN0cnVjdHVyZXMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgcGxhY2VkIGluIHRoZSBwcml2YXRlIGRhdGEgYXJlYSBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqIFRoZSBjYXJkIHN0cnVjdHVyZSB1c2VkIHRvIG9jY3VweSB0aGUgcHJpdmF0ZSBhcmVhIGJ1dCBub3cgdGhlIGZvbGxvd2luZyAKKyAqIHN0cnVjdHVyZSB3aWxsIGluY29ycG9yYXRlIHRoZSBjYXJkIHN0cnVjdHVyZSBhbG9uZyB3aXRoIENIRExDIHNwZWNpZmljIGRhdGEKKyAqLworCit0eXBlZGVmIHN0cnVjdCBjaGRsY19wcml2YXRlX2FyZWEKK3sKKwl3YW5waXBlX2NvbW1vbl90IGNvbW1vbjsKKwlzZGxhX3QJCSpjYXJkOworCWludCAJCVRyYWNpbmdFbmFibGVkOwkJLyogRm9yIGVuYWJsaW5nIFRyYWNpbmcgKi8KKwl1bnNpZ25lZCBsb25nIAljdXJyX3RyYWNlX2FkZHI7CS8qIFVzZWQgZm9yIFRyYWNpbmcgKi8KKwl1bnNpZ25lZCBsb25nIAlzdGFydF90cmFjZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgCWVuZF90cmFjZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgCWJhc2VfYWRkcl90cmFjZV9idWZmZXI7CisJdW5zaWduZWQgbG9uZyAJZW5kX2FkZHJfdHJhY2VfYnVmZmVyOworCXVuc2lnbmVkIHNob3J0IAludW1iZXJfdHJhY2VfZWxlbWVudHM7CisJdW5zaWduZWQgIAlhdmFpbGFibGVfYnVmZmVyX3NwYWNlOworCXVuc2lnbmVkIGxvbmcgCXJvdXRlcl9zdGFydF90aW1lOworCXVuc2lnbmVkIGNoYXIgCXJvdXRlX3N0YXR1czsKKwl1bnNpZ25lZCBjaGFyIAlyb3V0ZV9yZW1vdmVkOworCXVuc2lnbmVkIGxvbmcgCXRpY2tfY291bnRlcjsJCS8qIEZvciA1cyB0aW1lb3V0IGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBsb25nIAlyb3V0ZXJfdXBfdGltZTsKKyAgICAgICAgdTMyICAgICAgICAgICAgIElQX2FkZHJlc3M7CQkvKiBJUCBhZGRyZXNzaW5nICovCisgICAgICAgIHUzMiAgICAgICAgICAgICBJUF9uZXRtYXNrOworCXUzMgkJaXBfbG9jYWw7CisJdTMyCQlpcF9yZW1vdGU7CisJdTMyIAkJaXBfbG9jYWxfdG1wOworCXUzMgkJaXBfcmVtb3RlX3RtcDsKKwl1OAkJaXBfZXJyb3I7CisJdTgJCWNvbmZpZ19jaGRsYzsKKwl1OCAJCWNvbmZpZ19jaGRsY190aW1lb3V0OworCXVuc2lnbmVkIGNoYXIgIG1jOwkJCS8qIE11bGl0Y2FzdCBzdXBwb3J0IG9uL29mZiAqLworCXVuc2lnbmVkIHNob3J0IHVkcF9wa3RfbGd0aDsJCS8qIHVkcCBwYWNrZXQgcHJvY2Vzc2luZyAqLworCWNoYXIgdWRwX3BrdF9zcmM7CisJY2hhciB1ZHBfcGt0X2RhdGFbTUFYX0xHVEhfVURQX01HTlRfUEtUXTsKKwl1bnNpZ25lZCBzaG9ydCB0aW1lcl9pbnRfZW5hYmxlZDsKKwljaGFyIHVwZGF0ZV9jb21tc19zdGF0czsJCS8qIHVwZGF0aW5nIGNvbW1zIHN0YXRzICovCisKKwliaF9kYXRhX3QgKmJoX2hlYWQ7CSAgCSAgLyogQ2lyY3VsYXIgYnVmZmVyIGZvciBjaGRsY19iaCAqLworCXVuc2lnbmVkIGxvbmcgIHRxX3dvcmtpbmc7CisJdm9sYXRpbGUgaW50ICBiaF93cml0ZTsKKwl2b2xhdGlsZSBpbnQgIGJoX3JlYWQ7CisJYXRvbWljX3QgIGJoX2J1ZmZfdXNlZDsKKwkKKwl1bnNpZ25lZCBjaGFyIGludGVyZmFjZV9kb3duOworCisJLyogUG9sbGluZyB3b3JrIHF1ZXVlIGVudHJ5LiBFYWNoIGludGVyZmFjZQorICAgICAgICAgKiBoYXMgaXRzIG93biB3b3JrIHF1ZXVlIGVudHJ5LCB3aGljaCBpcyB1c2VkCisgICAgICAgICAqIHRvIGRlZmVyIGV2ZW50cyBmcm9tIHRoZSBpbnRlcnJ1cHQgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcG9sbF93b3JrOworCXN0cnVjdCB0aW1lcl9saXN0IHBvbGxfZGVsYXlfdGltZXI7CisKKwl1OCBnYXRld2F5OworCXU4IHRydWVfaWZfZW5jb2Rpbmc7CisJLy9GSVhNRTogYWRkIGRyaXZlciBzdGF0cyBhcyBwZXIgZnJhbWUgcmVsYXkhCisKK30gY2hkbGNfcHJpdmF0ZV9hcmVhX3Q7CisKKy8qIFJvdXRlIFN0YXR1cyBvcHRpb25zICovCisjZGVmaW5lIE5PX1JPVVRFCTB4MDAKKyNkZWZpbmUgQUREX1JPVVRFCTB4MDEKKyNkZWZpbmUgUk9VVEVfQURERUQJMHgwMgorI2RlZmluZSBSRU1PVkVfUk9VVEUJMHgwMworCisKKy8qIHZhcmlhYmxlIGZvciBrZWVwaW5nIHRyYWNrIG9mIGVuYWJsaW5nL2Rpc2FibGluZyBGVDEgbW9uaXRvciBzdGF0dXMgKi8KK3N0YXRpYyBpbnQgckNvdW50ID0gMDsKKworLyogdmFyaWFibGUgZm9yIHRyYWNraW5nIGhvdyBtYW55IGludGVyZmFjZXMgdG8gb3BlbiBmb3IgV0FOUElQRSBvbiB0aGUKKyAgIHR3byBwb3J0cyAqLworCitleHRlcm4gdm9pZCBkaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQpOworCisvKioqKioqIEZ1bmN0aW9uIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFdBTiBsaW5rIGRyaXZlciBlbnRyeSBwb2ludHMuIFRoZXNlIGFyZSBjYWxsZWQgYnkgdGhlIFdBTiByb3V0ZXIgbW9kdWxlLiAqLworc3RhdGljIGludCB1cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldik7CitzdGF0aWMgaW50IG5ld19pZihzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkgIHdhbmlmX2NvbmZfdCogY29uZik7CisKKy8qIE5ldHdvcmsgZGV2aWNlIGludGVyZmFjZSAqLworc3RhdGljIGludCBpZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworc3RhdGljIGludCBpZl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworc3RhdGljIGludCBpZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgaWZfaGVhZGVyKHN0cnVjdCBza19idWZmKiBza2IsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCSAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCogZGFkZHIsIHZvaWQqIHNhZGRyLAorCQkgICAgIHVuc2lnbmVkIGxlbik7CisKK3N0YXRpYyBpbnQgaWZfcmVidWlsZF9oZHIgKHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiBpZl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKyAgCitzdGF0aWMgaW50IGlmX3NlbmQoc3RydWN0IHNrX2J1ZmYqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CisKKy8qIENIRExDIEZpcm13YXJlIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgY2hkbGNfY29uZmlndXJlIAkoc2RsYV90KiBjYXJkLCB2b2lkKiBkYXRhKTsKK3N0YXRpYyBpbnQgY2hkbGNfY29tbV9lbmFibGUgCShzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCBjaGRsY19yZWFkX3ZlcnNpb24gCShzZGxhX3QqIGNhcmQsIGNoYXIqIHN0cik7CitzdGF0aWMgaW50IGNoZGxjX3NldF9pbnRyX21vZGUgCShzZGxhX3QqIGNhcmQsIHVuc2lnbmVkIG1vZGUpOworc3RhdGljIGludCBjaGRsY19zZW5kIChzZGxhX3QqIGNhcmQsIHZvaWQqIGRhdGEsIHVuc2lnbmVkIGxlbik7CitzdGF0aWMgaW50IGNoZGxjX3JlYWRfY29tbV9lcnJfc3RhdHMgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IGNoZGxjX3JlYWRfb3Bfc3RhdHMgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IGNoZGxjX2Vycm9yIChzZGxhX3QgKmNhcmQsIGludCBlcnIsIENIRExDX01BSUxCT1hfU1RSVUNUICptYik7CisKKworc3RhdGljIGludCBjaGRsY19kaXNhYmxlX2NvbW1fc2h1dGRvd24gKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgdm9pZCBpZl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBNaXNjZWxsYW5lb3VzIENIRExDIEZ1bmN0aW9ucyAqLworc3RhdGljIGludCBzZXRfY2hkbGNfY29uZmlnIChzZGxhX3QqIGNhcmQpOworc3RhdGljIHZvaWQgaW5pdF9jaGRsY190eF9yeF9idWZmKCBzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCBwcm9jZXNzX2NoZGxjX2V4Y2VwdGlvbihzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCBwcm9jZXNzX2dsb2JhbF9leGNlcHRpb24oc2RsYV90ICpjYXJkKTsKK3N0YXRpYyBpbnQgdXBkYXRlX2NvbW1zX3N0YXRzKHNkbGFfdCogY2FyZCwKKyAgICAgICAgY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSk7CitzdGF0aWMgaW50IGNvbmZpZ3VyZV9pcCAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgdW5jb25maWd1cmVfaXAgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgdm9pZCBwcm9jZXNzX3JvdXRlKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgdm9pZCBwb3J0X3NldF9zdGF0ZSAoc2RsYV90ICpjYXJkLCBpbnQpOworc3RhdGljIGludCBjb25maWdfY2hkbGMgKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbW0gKHNkbGFfdCAqY2FyZCk7CisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfY2hkbGNfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNoZGxjX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBjaGRsY19wb2xsX2RlbGF5ICh1bnNpZ25lZCBsb25nIGRldl9wdHIpOworCisKKy8qIE1pc2NlbGxhbmVvdXMgYXN5bmNocm9ub3VzIGludGVyZmFjZSBGdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgc2V0X2FzeV9jb25maWcgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IGFzeV9jb21tX2VuYWJsZSAoc2RsYV90KiBjYXJkKTsKKworLyogSW50ZXJydXB0IGhhbmRsZXJzICovCitzdGF0aWMgdm9pZCB3cGNfaXNyIChzZGxhX3QqIGNhcmQpOworc3RhdGljIHZvaWQgcnhfaW50ciAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIHRpbWVyX2ludHIoc2RsYV90ICopOworCisvKiBCb3R0b20gaGFsZiBoYW5kbGVycyAqLworc3RhdGljIHZvaWQgY2hkbGNfd29yayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgY2hkbGNfd29ya19jbGVhbnVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBiaF9lbnF1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBjaGtfYmNhc3RfbWNhc3RfYWRkcihzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50IHJlcGx5X3VkcCggdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG1ib3hfbGVuICk7CitzdGF0aWMgaW50IGludHJfdGVzdCggc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgdWRwX3BrdF90eXBlKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiICwgc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgc3RvcmVfdWRwX21nbXRfcGt0KGNoYXIgdWRwX3BrdF9zcmMsIHNkbGFfdCogY2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSk7CitzdGF0aWMgaW50IHByb2Nlc3NfdWRwX21nbXRfcGt0KHNkbGFfdCogY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgIAorCQkJCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWEpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGNhbGNfY2hlY2tzdW0gKGNoYXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIHM1MDhfbG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpOworc3RhdGljIHZvaWQgczUwOF91bmxvY2sgKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKTsKKworCitzdGF0aWMgaW50ICBJbnRyX3Rlc3RfY291bnRlcjsKKworLyogVFRZIEdsb2JhbCBEZWZpbml0aW9ucyAqLworCisjZGVmaW5lIE5SX1BPUlRTIDQKKyNkZWZpbmUgV0FOX1RUWV9NQUpPUiAyMjYKKyNkZWZpbmUgV0FOX1RUWV9NSU5PUiAwCisKKyNkZWZpbmUgV0FOX0NBUkQocG9ydCkgKHR0eV9jYXJkX21hcFtwb3J0XSkKKyNkZWZpbmUgTUlOX1BPUlQgMAorI2RlZmluZSBNQVhfUE9SVCBOUl9QT1JUUy0xIAorCisjZGVmaW5lIENSQ19MRU5HVEggMgorCitzdGF0aWMgaW50IHdhbnBpcGVfdHR5X2luaXQoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdHR5X3JlY2VpdmUoc2RsYV90ICosIHVuc2lnbmVkLCB1bnNpZ25lZCBpbnQpOworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfdHJpZ2dlcl9wb2xsKHNkbGFfdCAqY2FyZCk7CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciBzZXJpYWxfZHJpdmVyOworc3RhdGljIGludCB0dHlfaW5pdF9jbnQ9MDsKKworc3RhdGljIHN0cnVjdCBzZXJpYWxfc3RhdGUgcnNfdGFibGVbTlJfUE9SVFNdOworCitzdGF0aWMgY2hhciB0dHlfZHJpdmVyX21vZGU9V0FOT1BUX1RUWV9TWU5DOworCitzdGF0aWMgY2hhciAqb3B0X2RlY29kZVtdID0geyJOT05FIiwiQ1JUU0NUUyIsIlhPTlhPRkYtUlgiLAorCSAgCSAgICAgICAgICAgICAiQ1JUU0NUUyBYT05YT0ZGLVJYIiwiWE9OWE9GRi1UWCIsCisJCSAgICAgICAgICAgICAiQ1JUU0NUUyBYT05YT0ZGLVRYIiwiQ1JUU0NUUyBYT05YT0ZGIn07CitzdGF0aWMgY2hhciAqcF9kZWNvZGVbXSA9IHsiTk9ORSIsIk9ERCIsIkVWRU4ifTsKKworc3RhdGljIHZvaWQqIHR0eV9jYXJkX21hcFtOUl9QT1JUU10gPSB7TlVMTCxOVUxMLE5VTEwsTlVMTH07CisKKworLyoqKioqKiBQdWJsaWMgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2lzY28gSERMQyBwcm90b2NvbCBpbml0aWFsaXphdGlvbiByb3V0aW5lLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIG1haW4gV0FOUElQRSBtb2R1bGUgZHVyaW5nIHNldHVwLiAgQXQgdGhpcworICogcG9pbnQgYWRhcHRlciBpcyBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGFuZCBmaXJtd2FyZSBpcyBydW5uaW5nLgorICogIG8gcmVhZCBmaXJtd2FyZSB2ZXJzaW9uICh0byBtYWtlIHN1cmUgaXQncyBhbGl2ZSkKKyAqICBvIGNvbmZpZ3VyZSBhZGFwdGVyCisgKiAgbyBpbml0aWFsaXplIHByb3RvY29sLXNwZWNpZmljIGZpZWxkcyBvZiB0aGUgYWRhcHRlciBkYXRhIHNwYWNlLgorICoKKyAqIFJldHVybjoJMAlvLmsuCisgKgkJPCAwCWZhaWx1cmUuCisgKi8KK2ludCB3cGNfaW5pdCAoc2RsYV90KiBjYXJkLCB3YW5kZXZfY29uZl90KiBjb25mKQoreworCXVuc2lnbmVkIGNoYXIgcG9ydF9udW07CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIG1heF9wZXJtaXR0ZWRfYmF1ZCA9IDA7CisJU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCAqZmxhZ3M7CisKKwl1bmlvbgorCQl7CisJCWNoYXIgc3RyWzgwXTsKKwkJfSB1OworCXZvbGF0aWxlIENIRExDX01BSUxCT1hfU1RSVUNUKiBtYjsKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIxOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCS8qIFZlcmlmeSBjb25maWd1cmF0aW9uIElEICovCisJaWYgKGNvbmYtPmNvbmZpZ19pZCAhPSBXQU5DT05GSUdfQ0hETEMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgY29uZmlndXJhdGlvbiBJRCAldSFcbiIsCisJCQkJICBjYXJkLT5kZXZuYW1lLCBjb25mLT5jb25maWdfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBGaW5kIG91dCB3aGljaCBQb3J0IHRvIHVzZSAqLworCWlmICgoY29uZi0+Y29tbV9wb3J0ID09IFdBTk9QVF9QUkkpIHx8IChjb25mLT5jb21tX3BvcnQgPT0gV0FOT1BUX1NFQykpeworCQlpZiAoY2FyZC0+bmV4dCl7CisKKwkJCWlmIChjb25mLT5jb21tX3BvcnQgIT0gY2FyZC0+bmV4dC0+dS5jLmNvbW1fcG9ydCl7CisJCQkJY2FyZC0+dS5jLmNvbW1fcG9ydCA9IGNvbmYtPmNvbW1fcG9ydDsKKwkJCX1lbHNleworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUiAtICVzIHBvcnQgdXNlZCFcbiIsCisgICAgICAgIAkJICAgICAgICAJY2FyZC0+d2FuZGV2Lm5hbWUsIFBPUlQoY29uZi0+Y29tbV9wb3J0KSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX1lbHNleworCQkJY2FyZC0+dS5jLmNvbW1fcG9ydCA9IGNvbmYtPmNvbW1fcG9ydDsKKwkJfQorCX1lbHNleworCQlwcmludGsoS0VSTl9JTkZPICIlczogRVJST1IgLSBJbnZhbGlkIFBvcnQgU2VsZWN0ZWQhXG4iLAorICAgICAgICAgICAgICAgIAkJCWNhcmQtPndhbmRldi5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCisJLyogSW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgKi8KKwlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisKKwkJaWYgKGNhcmQtPnUuYy5jb21tX3BvcnQgPT0gV0FOT1BUX1BSSSl7CQorCQkJY2FyZC0+bWJveCAgPSAodm9pZCAqKSBjYXJkLT5ody5kcG1iYXNlOworCQl9ZWxzZXsKKwkJCWNhcmQtPm1ib3ggID0gKHZvaWQgKikgY2FyZC0+aHcuZHBtYmFzZSArIAorCQkJCVNFQ19CQVNFX0FERFJfTUJfU1RSVUNUIC0gUFJJX0JBU0VfQUREUl9NQl9TVFJVQ1Q7CisJCX0JCisJfWVsc2V7IAorCQkvKiBmb3IgYSBTNTE0IGFkYXB0ZXIsIHNldCBhIHBvaW50ZXIgdG8gdGhlIGFjdHVhbCBtYWlsYm94IGluIHRoZSAqLworCQkvKiBhbGxvY2F0ZWQgdmlydHVhbCBtZW1vcnkgYXJlYSAqLworCQlpZiAoY2FyZC0+dS5jLmNvbW1fcG9ydCA9PSBXQU5PUFRfUFJJKXsKKwkJCWNhcmQtPm1ib3ggPSAodm9pZCAqKSBjYXJkLT5ody5kcG1iYXNlICsgUFJJX0JBU0VfQUREUl9NQl9TVFJVQ1Q7CisJCX1lbHNleworCQkJY2FyZC0+bWJveCA9ICh2b2lkICopIGNhcmQtPmh3LmRwbWJhc2UgKyBTRUNfQkFTRV9BRERSX01CX1NUUlVDVDsKKwkJfQkKKwl9CisKKwltYiA9IG1iMSA9IGNhcmQtPm1ib3g7CisKKwlpZiAoIWNhcmQtPmNvbmZpZ3VyZWQpeworCisJCS8qIFRoZSBib2FyZCB3aWxsIHBsYWNlIGFuICdJJyBpbiB0aGUgcmV0dXJuIGNvZGUgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcworCSAgIAlyZWFkeSB0byBhY2NlcHQgY29tbWFuZHMuICBXZSBleHBlY3QgdGhpcyB0byBiZSBjb21wbGV0ZWQgaW4gbGVzcworICAgICAgICAgICAJdGhhbiAxIHNlY29uZC4gKi8KKworCQl0aW1lb3V0ID0gamlmZmllczsKKwkJd2hpbGUgKG1iLT5yZXR1cm5fY29kZSAhPSAnSScpCS8qIFdhaXQgMXMgZm9yIGJvYXJkIHRvIGluaXRpYWxpemUgKi8KKwkJCWlmICgoamlmZmllcyAtIHRpbWVvdXQpID4gMSpIWikgYnJlYWs7CisKKwkJaWYgKG1iLT5yZXR1cm5fY29kZSAhPSAnSScpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IEluaXRpYWxpemF0aW9uIG5vdCBjb21wbGV0ZWQgYnkgYWRhcHRlclxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlBsZWFzZSBjb250YWN0IFNhbmdvbWEgcmVwcmVzZW50YXRpdmUuXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJLyogUmVhZCBmaXJtd2FyZSB2ZXJzaW9uLiAgTm90ZSB0aGF0IHdoZW4gYWRhcHRlciBpbml0aWFsaXplcywgaXQKKwkgKiBjbGVhcnMgdGhlIG1haWxib3gsIHNvIGl0IG1heSBhcHBlYXIgdGhhdCB0aGUgZmlyc3QgY29tbWFuZCB3YXMKKwkgKiBleGVjdXRlZCBzdWNjZXNzZnVsbHkgd2hlbiBpbiBmYWN0IGl0IHdhcyBtZXJlbHkgZXJhc2VkLiBUbyB3b3JrCisJICogYXJvdW5kIHRoaXMsIHdlIGV4ZWN1dGUgdGhlIGZpcnN0IGNvbW1hbmQgdHdpY2UuCisJICovCisKKwlpZiAoY2hkbGNfcmVhZF92ZXJzaW9uKGNhcmQsIHUuc3RyKSkKKwkJcmV0dXJuIC1FSU87CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogUnVubmluZyBDaXNjbyBIRExDIGZpcm13YXJlIHYlc1xuIiwKKwkJY2FyZC0+ZGV2bmFtZSwgdS5zdHIpOyAKKworCWNhcmQtPmlzcgkJCT0gJndwY19pc3I7CisJY2FyZC0+cG9sbAkJCT0gTlVMTDsKKwljYXJkLT5leGVjCQkJPSBOVUxMOworCWNhcmQtPndhbmRldi51cGRhdGUJCT0gJnVwZGF0ZTsKKyAJY2FyZC0+d2FuZGV2Lm5ld19pZgkJPSAmbmV3X2lmOworCWNhcmQtPndhbmRldi5kZWxfaWYJCT0gTlVMTDsKKwljYXJkLT53YW5kZXYudWRwX3BvcnQgICAJPSBjb25mLT51ZHBfcG9ydDsKKwljYXJkLT5kaXNhYmxlX2NvbW0JCT0gJmRpc2FibGVfY29tbTsKKwljYXJkLT53YW5kZXYubmV3X2lmX2NudCA9IDA7CisKKwkvKiByZXNldCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSAndXBkYXRlKCknIHByb2MgaGFzIGJlZW4gY2FsbGVkICovCisJY2FyZC0+dS5jLnVwZGF0ZV9jYWxsX2NvdW50ID0gMDsKKwkKKwljYXJkLT53YW5kZXYudHRsID0gY29uZi0+dHRsOworCWNhcmQtPndhbmRldi5pbnRlcmZhY2UgPSBjb25mLT5pbnRlcmZhY2U7IAorCisJaWYgKChjYXJkLT51LmMuY29tbV9wb3J0ID09IFdBTk9QVF9TRUMgJiYgY29uZi0+aW50ZXJmYWNlID09IFdBTk9QVF9WMzUpJiYKKwkgICAgY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRVJST1IgLSBWMzUgSW50ZXJmYWNlIG5vdCBzdXBwb3J0ZWQgb24gUzUwOCAlcyBwb3J0IFxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIFBPUlQoY2FyZC0+dS5jLmNvbW1fcG9ydCkpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwljYXJkLT53YW5kZXYuY2xvY2tpbmcgPSBjb25mLT5jbG9ja2luZzsKKworCXBvcnRfbnVtID0gY2FyZC0+dS5jLmNvbW1fcG9ydDsKKworCS8qIGluIEFQSSBtb2RlLCB3ZSBjYW4gY29uZmlndXJlIGZvciAicmVjZWl2ZSBvbmx5IiBidWZmZXJpbmcgKi8KKwlpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkgeworCQljYXJkLT51LmMucmVjZWl2ZV9vbmx5ID0gY29uZi0+cmVjZWl2ZV9vbmx5OworCQlpZihjb25mLT5yZWNlaXZlX29ubHkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IENvbmZpZ3VyZWQgZm9yICdyZWNlaXZlIG9ubHknIG1vZGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmRldm5hbWUpOworCQl9CisJfQorCisJLyogU2V0dXAgUG9ydCBCcHMgKi8KKworCWlmKGNhcmQtPndhbmRldi5jbG9ja2luZykgeworCQlpZigocG9ydF9udW0gPT0gV0FOT1BUX1BSSSkgfHwgY2FyZC0+dS5jLnJlY2VpdmVfb25seSkgeworCQkJLyogRm9yIFByaW1hcnkgUG9ydCAwICovCisgICAgICAgICAgICAgICAJCW1heF9wZXJtaXR0ZWRfYmF1ZCA9CisJCQkJKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSA/CisJCQkJUFJJX01BWF9CQVVEX1JBVEVfUzUxNCA6IAorCQkJCVBSSV9NQVhfQkFVRF9SQVRFX1M1MDg7CisKKwkJfWVsc2UgaWYocG9ydF9udW0gPT0gV0FOT1BUX1NFQykgeworCQkJLyogRm9yIFNlY29uZGFyeSBQb3J0IDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9wZXJtaXR0ZWRfYmF1ZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19NQVhfQkFVRF9SQVRFX1M1MTQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfTUFYX0JBVURfUkFURV9TNTA4OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAKKwkJCWlmKGNvbmYtPmJwcyA+IG1heF9wZXJtaXR0ZWRfYmF1ZCkgeworCQkJCWNvbmYtPmJwcyA9IG1heF9wZXJtaXR0ZWRfYmF1ZDsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQmF1ZCB0b28gaGlnaCFcbiIsCisJCQkJCWNhcmQtPndhbmRldi5uYW1lKTsKKyAJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJhdWQgcmF0ZSBzZXQgdG8gJWx1IGJwc1xuIiwgCisJCQkJCWNhcmQtPndhbmRldi5uYW1lLCBtYXhfcGVybWl0dGVkX2JhdWQpOworCQkJfQorCQkJY2FyZC0+d2FuZGV2LmJwcyA9IGNvbmYtPmJwczsKKwl9ZWxzZXsKKyAgICAgICAgCWNhcmQtPndhbmRldi5icHMgPSAwOworICAJfQorCisJLyogU2V0dXAgdGhlIFBvcnQgTVRVICovCisJaWYoKHBvcnRfbnVtID09IFdBTk9QVF9QUkkpIHx8IGNhcmQtPnUuYy5yZWNlaXZlX29ubHkpIHsKKworCQkvKiBGb3IgUHJpbWFyeSBQb3J0IDAgKi8KKwkJY2FyZC0+d2FuZGV2Lm10dSA9CisJCQkoY29uZi0+bXR1ID49IE1JTl9MR1RIX0NIRExDX0RBVEFfQ0ZHKSA/CisJCQltaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPm10dSwgUFJJX01BWF9OT19EQVRBX0JZVEVTX0lOX0ZSQU1FKSA6CisJCQlDSERMQ19ERkxUX0RBVEFfTEVOOworCX0gZWxzZSBpZihwb3J0X251bSA9PSBXQU5PUFRfU0VDKSB7IAorCQkvKiBGb3IgU2Vjb25kYXJ5IFBvcnQgMSAqLworCQljYXJkLT53YW5kZXYubXR1ID0KKwkJCShjb25mLT5tdHUgPj0gTUlOX0xHVEhfQ0hETENfREFUQV9DRkcpID8KKwkJCW1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+bXR1LCBTRUNfTUFYX05PX0RBVEFfQllURVNfSU5fRlJBTUUpIDoKKwkJCUNIRExDX0RGTFRfREFUQV9MRU47CisJfQorCisJLyogU2V0IHVwIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGFyZWEgKi8KKwkvKiBSZWFkIHRoZSBDSERMQyBDb25maWd1cmF0aW9uIGFuZCBvYnRhaW46IAorCSAqCVB0ciB0byBzaGFyZWQgbWVtb3J5IGluZm9yIHN0cnVjdAorICAgICAgICAgKiBVc2UgdGhpcyBwb2ludGVyIHRvIGNhbGN1bGF0ZSB0aGUgdmFsdWUgb2YgY2FyZC0+dS5jLmZsYWdzICEKKyAJICovCisJbWIxLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYjEtPmNvbW1hbmQgPSBSRUFEX0NIRExDX0NPTkZJR1VSQVRJT047CisJZXJyID0gc2RsYV9leGVjKG1iMSkgPyBtYjEtPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJaWYoZXJyICE9IENPTU1BTkRfT0spIHsKKyAgICAgICAgICAgICAgICBpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCkKKyAgICAgICAgICAgICAgICAJZW5hYmxlX2lycShjYXJkLT5ody5pcnEpOworCisJCWNoZGxjX2Vycm9yKGNhcmQsIGVyciwgbWIxKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpeworICAgICAgICAgICAgICAgCWNhcmQtPnUuYy5mbGFncyA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgCQkoKChDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCAqKW1iMS0+ZGF0YSktPgorCQkJcHRyX3NoYXJlZF9tZW1faW5mb19zdHJ1Y3QpKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLmZsYWdzID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAgICAgICAgICAoKChDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCAqKW1iMS0+ZGF0YSktPgorCQkJcHRyX3NoYXJlZF9tZW1faW5mb19zdHJ1Y3QgJSBTRExBX1dJTkRPV1NJWkUpKTsKKwl9CisKKwlmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwkKKwkvKiBUaGlzIGlzIGZvciB0aGUgcG9ydHMgbGluayBzdGF0ZSAqLworCWNhcmQtPndhbmRldi5zdGF0ZSA9IFdBTl9EVUFMUE9SVDsKKwljYXJkLT51LmMuc3RhdGUgPSBXQU5fRElTQ09OTkVDVEVEOworCisKKwlpZiAoIWNhcmQtPndhbmRldi5waWdneWJhY2spewkKKwkJaW50IGVycjsKKworCQkvKiBQZXJmb3JtIGludGVycnVwdCB0ZXN0aW5nICovCisJCWVyciA9IGludHJfdGVzdChjYXJkKTsKKworCQlpZihlcnIgfHwgKEludHJfdGVzdF9jb3VudGVyIDwgTUFYX0lOVFJfVEVTVF9DT1VOVEVSKSkgeyAKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcnJ1cHQgdGVzdCBmYWlsZWQgKCVpKVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSwgSW50cl90ZXN0X2NvdW50ZXIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBsZWFzZSBjaG9vc2UgYW5vdGhlciBpbnRlcnJ1cHRcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcnJ1cHQgdGVzdCBwYXNzZWQgKCVpKVxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSwgSW50cl90ZXN0X2NvdW50ZXIpOworCQljYXJkLT5jb25maWd1cmVkID0gMTsKKwl9CisKKwlpZiAoKGNhcmQtPnR0eV9vcHQ9Y29uZi0+dHR5KSA9PSBXQU5PUFRfWUVTKXsKKwkJaW50IGVycjsKKwkJY2FyZC0+dHR5X21pbm9yID0gY29uZi0+dHR5X21pbm9yOworCisJCS8qIE9uIEFTWU5DIGNvbm5lY3Rpb25zIGludGVybmFsIGNsb2NraW5nIAorCQkgKiBpcyBtYW5kYXRvcnkgKi8KKwkJaWYgKChjYXJkLT51LmMuYXN5bmNfbW9kZSA9IGNvbmYtPnR0eV9tb2RlKSl7CisJCQljYXJkLT53YW5kZXYuY2xvY2tpbmcgPSAxOworCQl9CisJCWVycj13YW5waXBlX3R0eV9pbml0KGNhcmQpOworCQlpZiAoZXJyKXsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9ZWxzZXsKKwkKKworCQlpZiAoY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLCBBUFBfSU5UX09OX1RJTUVSKSl7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6ICIKKwkJCQkiRmFpbGVkIHRvIHNldCBpbnRlcnJ1cHQgdHJpZ2dlcnMhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIC1FSU87CQorICAgICAgICAJfQorCQorCQkvKiBNYXNrIHRoZSBUaW1lciBpbnRlcnJ1cHQgKi8KKwkJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiAmPSAKKwkJCX5BUFBfSU5UX09OX1RJTUVSOworCX0KKworCS8qIElmIHdlIGFyZSB1c2luZyBDSERMQyBpbiBiYWNrdXAgbW9kZSwgdGhpcyBmbGFnIHdpbGwKKwkgKiBpbmRpY2F0ZSBub3QgdG8gbG9vayBmb3IgSVAgYWRkcmVzc2VzIGluIGNvbmZpZ19jaGRsYygpKi8KKwljYXJkLT51LmMuYmFja3VwID0gY29uZi0+YmFja3VwOworCQorCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKiogV0FOIERldmljZSBEcml2ZXIgRW50cnkgUG9pbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXBkYXRlIGRldmljZSBzdGF0dXMgJiBzdGF0aXN0aWNzCisgKiBUaGlzIHByb2NlZHVyZSBpcyBjYWxsZWQgd2hlbiB1cGRhdGluZyB0aGUgUFJPQyBmaWxlIHN5c3RlbSBhbmQgcmV0dXJucworICogdmFyaW91cyBjb21tdW5pY2F0aW9ucyBzdGF0aXN0aWNzLiBUaGVzZSBzdGF0aXN0aWNzIGFyZSBhY2N1bXVsYXRlZCBmcm9tIDMgCisgKiBkaWZmZXJlbnQgbG9jYXRpb25zOgorICogCTEpIFRoZSAnaWZfc3RhdHMnIHJlY29yZGVkIGZvciB0aGUgZGV2aWNlLgorICogCTIpIENvbW11bmljYXRpb24gZXJyb3Igc3RhdGlzdGljcyBvbiB0aGUgYWRhcHRlci4KKyAqICAgICAgMykgQ0hETEMgb3BlcmF0aW9uYWwgc3RhdGlzdGljcyBvbiB0aGUgYWRhcHRlci4KKyAqIFRoZSBib2FyZCBsZXZlbCBzdGF0aXN0aWNzIGFyZSByZWFkIGR1cmluZyBhIHRpbWVyIGludGVycnVwdC4gTm90ZSB0aGF0IHdlIAorICogcmVhZCB0aGUgZXJyb3IgYW5kIG9wZXJhdGlvbmFsIHN0YXRpc3RpY3MgZHVyaW5nIGNvbnNlY2l0aXZlIHRpbWVyIHRpY2tzIHNvCisgKiBhcyB0byBtaW5pbWl6ZSB0aGUgdGltZSB0aGF0IHdlIGFyZSBpbnNpZGUgdGhlIGludGVycnVwdCBoYW5kbGVyLgorICoKKyAqLworc3RhdGljIGludCB1cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldikKK3sKKwlzZGxhX3QqIGNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisgCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CisgICAgICAgIHZvbGF0aWxlIGNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWE7CisgICAgICAgIFNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCS8qIHNhbml0eSBjaGVja3MgKi8KKwlpZigod2FuZGV2ID09IE5VTEwpIHx8ICh3YW5kZXYtPnByaXZhdGUgPT0gTlVMTCkpCisJCXJldHVybiAtRUZBVUxUOworCQorCWlmKHdhbmRldi0+c3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBtb3JlIHNhbml0eSBjaGVja3MgKi8KKyAgICAgICAgaWYoIWNhcmQtPnUuYy5mbGFncykKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKworCWlmKHRlc3RfYml0KFBFUklfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworCisJaWYoKGRldj1jYXJkLT53YW5kZXYuZGV2KSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmKChjaGRsY19wcml2X2FyZWE9ZGV2LT5wcml2KSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworICAgICAgCWZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworICAgICAgIAlpZihjaGRsY19wcml2X2FyZWEtPnVwZGF0ZV9jb21tc19zdGF0cyl7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkJCQorCS8qIHdlIHdpbGwgbmVlZCAyIHRpbWVyIGludGVycnVwdHMgdG8gY29tcGxldGUgdGhlICovCisJLyogcmVhZGluZyBvZiB0aGUgc3RhdGlzdGljcyAqLworCWNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID0gMjsKKyAgICAgICAJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiB8PSBBUFBfSU5UX09OX1RJTUVSOworCWNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgPSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFOworICAKKwkvKiB3YWl0IGEgbWF4aW11bSBvZiAxIHNlY29uZCBmb3IgdGhlIHN0YXRpc3RpY3MgdG8gYmUgdXBkYXRlZCAqLyAKKyAgICAgICAgdGltZW91dCA9IGppZmZpZXM7CisgICAgICAgIGZvcig7OykgeworCQlpZihjaGRsY19wcml2X2FyZWEtPnVwZGF0ZV9jb21tc19zdGF0cyA9PSAwKQorCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKChqaWZmaWVzIC0gdGltZW91dCkgPiAoMSAqIEhaKSl7CisgICAgCQkJY2hkbGNfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMgPSAwOworIAkJCWNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJj0KKwkJCQl+VE1SX0lOVF9FTkFCTEVEX1VQREFURTsgCisgCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKyAgICAgICAgfQorCisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDcmVhdGUgbmV3IGxvZ2ljYWwgY2hhbm5lbC4KKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHJvdXRlciB3aGVuIFJPVVRFUl9JRk5FVyBJT0NUTCBpcyBiZWluZworICogaGFuZGxlZC4KKyAqIG8gcGFyc2UgbWVkaWEtIGFuZCBoYXJkd2FyZS1zcGVjaWZpYyBjb25maWd1cmF0aW9uCisgKiBvIG1ha2Ugc3VyZSB0aGF0IGEgbmV3IGNoYW5uZWwgY2FuIGJlIGNyZWF0ZWQKKyAqIG8gYWxsb2NhdGUgcmVzb3VyY2VzLCBpZiBuZWNlc3NhcnkKKyAqIG8gcHJlcGFyZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHJlZ2lzdGFyYXRpb24uCisgKgorICogUmV0dXJuOgkwCW8uay4KKyAqCQk8IDAJZmFpbHVyZSAoY2hhbm5lbCB3aWxsIG5vdCBiZSBjcmVhdGVkKQorICovCitzdGF0aWMgaW50IG5ld19pZihzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkgIHdhbmlmX2NvbmZfdCogY29uZikKK3sKKwlzZGxhX3QqIGNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYTsKKworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvbmZpZ3VyaW5nIEludGVyZmFjZTogJXNcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjb25mLT5uYW1lKTsKKyAKKwlpZiAoKGNvbmYtPm5hbWVbMF0gPT0gJ1wwJykgfHwgKHN0cmxlbihjb25mLT5uYW1lKSA+IFdBTl9JRk5BTUVfU1opKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnZhbGlkIGludGVyZmFjZSBuYW1lIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJCQorCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHByaXZhdGUgZGF0YSAqLworCWNoZGxjX3ByaXZfYXJlYSA9IGttYWxsb2Moc2l6ZW9mKGNoZGxjX3ByaXZhdGVfYXJlYV90KSwgR0ZQX0tFUk5FTCk7CisJCisJaWYoY2hkbGNfcHJpdl9hcmVhID09IE5VTEwpIAorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChjaGRsY19wcml2X2FyZWEsIDAsIHNpemVvZihjaGRsY19wcml2YXRlX2FyZWFfdCkpOworCisJY2hkbGNfcHJpdl9hcmVhLT5jYXJkID0gY2FyZDsgCisJY2hkbGNfcHJpdl9hcmVhLT5jb21tb24uc2sgPSBOVUxMOworCWNoZGxjX3ByaXZfYXJlYS0+Y29tbW9uLmZ1bmMgPSBOVUxMOwkKKworCS8qIGluaXRpYWxpemUgZGF0YSAqLworCXN0cmNweShjYXJkLT51LmMuaWZfbmFtZSwgY29uZi0+bmFtZSk7CisKKwlpZihjYXJkLT53YW5kZXYubmV3X2lmX2NudCA+IDApIHsKKyAgICAgICAgICAgICAgICBrZnJlZShjaGRsY19wcml2X2FyZWEpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwljYXJkLT53YW5kZXYubmV3X2lmX2NudCsrOworCisJY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCA9IDA7CisJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZV9zdGF0dXMgPSBOT19ST1VURTsKKwljaGRsY19wcml2X2FyZWEtPnJvdXRlX3JlbW92ZWQgPSAwOworCisJY2FyZC0+dS5jLmFzeW5jX21vZGUgPSBjb25mLT5hc3luY19tb2RlOworCQorCS8qIHNldHVwIGZvciBhc3luY2hyb25vdXMgbW9kZSAqLworCWlmKGNvbmYtPmFzeW5jX21vZGUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvbmZpZ3VyaW5nIGZvciBhc3luY2hyb25vdXMgbW9kZVxuIiwKKwkJCXdhbmRldi0+bmFtZSk7CisKKwkJaWYoY2FyZC0+dS5jLmNvbW1fcG9ydCA9PSBXQU5PUFRfUFJJKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOkFzeW5jaHJvbm91cyBtb2RlIG9uIHNlY29uZGFyeSBwb3J0IG9ubHlcbiIsCisJCQkJCXdhbmRldi0+bmFtZSk7CisJCQlrZnJlZShjaGRsY19wcml2X2FyZWEpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCSAgICAgICAJaWYoc3RyY21wKGNvbmYtPnVzZWRieSwgIldBTlBJUEUiKSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogUnVubmluZyBpbiBXQU5JUEUgQXN5bmMgTW9kZVxuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJd2FuZGV2LT5uYW1lKTsKKwkJCWNhcmQtPnUuYy51c2VkYnkgPSBXQU5QSVBFOworCQl9ZWxzZXsKKwkJCWNhcmQtPnUuYy51c2VkYnkgPSBBUEk7CisJCX0KKworCQlpZighY2FyZC0+d2FuZGV2LmNsb2NraW5nKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBBc3luY2guIGNsb2NraW5nIG11c3QgYmUgJ0ludGVybmFsJ1xuIiwKKwkJCQl3YW5kZXYtPm5hbWUpOworCQkJa2ZyZWUoY2hkbGNfcHJpdl9hcmVhKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYoKGNhcmQtPndhbmRldi5icHMgPCBNSU5fQVNZX0JBVURfUkFURSkgfHwKKwkJCShjYXJkLT53YW5kZXYuYnBzID4gTUFYX0FTWV9CQVVEX1JBVEUpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU2VsZWN0ZWQgYmF1ZCByYXRlIGlzIGludmFsaWQuXG4iLAorCQkJCXdhbmRldi0+bmFtZSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJNdXN0IGJlIGJldHdlZW4gJXUgYW5kICV1IGJwcy5cbiIsCisJCQkJTUlOX0FTWV9CQVVEX1JBVEUsIE1BWF9BU1lfQkFVRF9SQVRFKTsKKwkJCWtmcmVlKGNoZGxjX3ByaXZfYXJlYSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWNhcmQtPnUuYy5hcGlfb3B0aW9ucyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGNvbmYtPmFzeV9kYXRhX3RyYW5zID09IFdBTk9QVF9ZRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5hcGlfb3B0aW9ucyB8PSBBU1lfUlhfREFUQV9UUkFOU1BBUkVOVDsKKyAgICAgICAgICAgICAgICB9CisJCQorCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyA9IDA7CisJCWlmIChjb25mLT5ydHNfaHNfZm9yX3JlY2VpdmUgPT0gV0FOT1BUX1lFUykgeworCQkJY2FyZC0+dS5jLnByb3RvY29sX29wdGlvbnMgfD0gQVNZX1JUU19IU19GT1JfUlg7CisJICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvbmYtPnhvbl94b2ZmX2hzX2Zvcl9yZWNlaXZlID09IFdBTk9QVF9ZRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5wcm90b2NvbF9vcHRpb25zIHw9IEFTWV9YT05fWE9GRl9IU19GT1JfUlg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb25mLT54b25feG9mZl9oc19mb3JfdHJhbnNtaXQgPT0gV0FOT1BUX1lFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnByb3RvY29sX29wdGlvbnMgfD0gQVNZX1hPTl9YT0ZGX0hTX0ZPUl9UWDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvbmYtPmRjZF9oc19mb3JfdHJhbnNtaXQgPT0gV0FOT1BUX1lFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnByb3RvY29sX29wdGlvbnMgfD0gQVNZX0RDRF9IU19GT1JfVFg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb25mLT5jdHNfaHNfZm9yX3RyYW5zbWl0ID09IFdBTk9QVF9ZRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5wcm90b2NvbF9vcHRpb25zIHw9IEFTWV9DVFNfSFNfRk9SX1RYOworICAgICAgICAgICAgICAgIH0KKworCQljYXJkLT51LmMudHhfYml0c19wZXJfY2hhciA9IGNvbmYtPnR4X2JpdHNfcGVyX2NoYXI7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnJ4X2JpdHNfcGVyX2NoYXIgPSBjb25mLT5yeF9iaXRzX3Blcl9jaGFyOworICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5zdG9wX2JpdHMgPSBjb25mLT5zdG9wX2JpdHM7CisJCWNhcmQtPnUuYy5wYXJpdHkgPSBjb25mLT5wYXJpdHk7CisJCWNhcmQtPnUuYy5icmVha190aW1lciA9IGNvbmYtPmJyZWFrX3RpbWVyOworCQljYXJkLT51LmMuaW50ZXJfY2hhcl90aW1lciA9IGNvbmYtPmludGVyX2NoYXJfdGltZXI7CisJCWNhcmQtPnUuYy5yeF9jb21wbGV0ZV9sZW5ndGggPSBjb25mLT5yeF9jb21wbGV0ZV9sZW5ndGg7CisJCWNhcmQtPnUuYy54b25fY2hhciA9IGNvbmYtPnhvbl9jaGFyOworCisJfSBlbHNlIHsJLyogc2V0dXAgZm9yIHN5bmNocm9ub3VzIG1vZGUgKi8KKworCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyA9IDA7CisJCWlmIChjb25mLT5pZ25vcmVfZGNkID09IFdBTk9QVF9ZRVMpeworCQkJY2FyZC0+dS5jLnByb3RvY29sX29wdGlvbnMgfD0gSUdOT1JFX0RDRF9GT1JfTElOS19TVEFUOworCQl9CisJCWlmIChjb25mLT5pZ25vcmVfY3RzID09IFdBTk9QVF9ZRVMpeworCQkJY2FyZC0+dS5jLnByb3RvY29sX29wdGlvbnMgfD0gSUdOT1JFX0NUU19GT1JfTElOS19TVEFUOworCQl9CisKKwkJaWYgKGNvbmYtPmlnbm9yZV9rZWVwYWxpdmUgPT0gV0FOT1BUX1lFUykgeworCQkJY2FyZC0+dS5jLnByb3RvY29sX29wdGlvbnMgfD0KKwkJCQlJR05PUkVfS1BBTFZfRk9SX0xJTktfU1RBVDsKKwkJCWNhcmQtPnUuYy5rcGFsdl90eCAgPSBNSU5fVHhfS1BBTFZfVElNRVI7IAorCQkJY2FyZC0+dS5jLmtwYWx2X3J4ICA9IE1JTl9SeF9LUEFMVl9USU1FUjsgCisJCQljYXJkLT51LmMua3BhbHZfZXJyID0gTUlOX0tQQUxWX0VSUl9UT0w7IAorCisJCX0gZWxzZSB7ICAgLyogRG8gbm90IGlnbm9yZSBrZWVwYWxpdmVzICovCisJCQljYXJkLT51LmMua3BhbHZfdHggPQorCQkJCSgoY29uZi0+a2VlcGFsaXZlX3R4X3RtciAtIE1JTl9UeF9LUEFMVl9USU1FUikKKwkJCQk+PSAwKSA/CisJICAgCQkJbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5rZWVwYWxpdmVfdHhfdG1yLE1BWF9UeF9LUEFMVl9USU1FUikgOgorCQkJCURFRkFVTFRfVHhfS1BBTFZfVElNRVI7CisKKwkJCWNhcmQtPnUuYy5rcGFsdl9yeCA9CisJCSAgIAkJKChjb25mLT5rZWVwYWxpdmVfcnhfdG1yIC0gTUlOX1J4X0tQQUxWX1RJTUVSKQorCQkJCT49IDApID8KKwkgICAJCQltaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPmtlZXBhbGl2ZV9yeF90bXIsTUFYX1J4X0tQQUxWX1RJTUVSKSA6CisJCQkJREVGQVVMVF9SeF9LUEFMVl9USU1FUjsKKworCQkJY2FyZC0+dS5jLmtwYWx2X2VyciA9CisJCSAgIAkJKChjb25mLT5rZWVwYWxpdmVfZXJyX21hcmdpbi1NSU5fS1BBTFZfRVJSX1RPTCkKKwkJCQk+PSAwKSA/CisJICAgCQkJbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5rZWVwYWxpdmVfZXJyX21hcmdpbiwKKwkJCQlNQVhfS1BBTFZfRVJSX1RPTCkgOiAKKwkgICAJCQlERUZBVUxUX0tQQUxWX0VSUl9UT0w7CisJCX0KKworCQkvKiBTZXR1cCBzbGFycCB0aW1lciB0byBjb250cm9sIGRlbGF5IGJldHdlZW4gc2xhcnBzICovCisJCWNhcmQtPnUuYy5zbGFycF90aW1lciA9IAorCQkJKChjb25mLT5zbGFycF90aW1lciAtIE1JTl9TTEFSUF9SRVFfVElNRVIpID49IDApID8KKwkJCW1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+c2xhcnBfdGltZXIsIE1BWF9TTEFSUF9SRVFfVElNRVIpIDoKKwkJCURFRkFVTFRfU0xBUlBfUkVRX1RJTUVSOworCisJCWlmIChjb25mLT5oZGxjX3N0cmVhbWluZyA9PSBXQU5PUFRfWUVTKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRW5hYmxpbmcgSERMQyBTVFJFQU1JTkcgTW9kZVxuIiwKKwkJCQl3YW5kZXYtPm5hbWUpOworCQkJY2FyZC0+dS5jLnByb3RvY29sX29wdGlvbnMgPSBIRExDX1NUUkVBTUlOR19NT0RFOworCQl9CisKKwkJaWYgKChjaGRsY19wcml2X2FyZWEtPnRydWVfaWZfZW5jb2RpbmcgPSBjb25mLT50cnVlX2lmX2VuY29kaW5nKSA9PSBXQU5PUFRfWUVTKXsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBFbmFibGluZywgdHJ1ZSBpbnRlcmZhY2UgdHlwZSBlbmNvZGluZy5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0KKwkJCisgICAgICAgIAkvKiBTZXR1cCB3YW5waXBlIGFzIGEgcm91dGVyIChXQU5QSVBFKSBvciBhcyBhbiBBUEkgKi8KKwkJaWYoIHN0cmNtcChjb25mLT51c2VkYnksICJXQU5QSVBFIikgPT0gMCkgeworCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUnVubmluZyBpbiBXQU5QSVBFIG1vZGUhXG4iLAorCQkJCXdhbmRldi0+bmFtZSk7CisJCQljYXJkLT51LmMudXNlZGJ5ID0gV0FOUElQRTsKKworCQkJLyogT3B0aW9uIHRvIGJyaW5nIGRvd24gdGhlIGludGVyZmFjZSB3aGVuIAorICAgICAgICAJCSAqIHRoZSBsaW5rIGdvZXMgZG93biAqLworCQkJaWYgKGNvbmYtPmlmX2Rvd24peworCQkJCXNldF9iaXQoRFlOX09QVF9PTiwmY2hkbGNfcHJpdl9hcmVhLT5pbnRlcmZhY2VfZG93bik7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkgIiVzOiBEeW5hbWljIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGVuYWJsZWRcbiIsCisJCQkJICAgY2FyZC0+ZGV2bmFtZSk7CisJCQl9IAorCisJCX0gZWxzZSBpZiggc3RyY21wKGNvbmYtPnVzZWRieSwgIkFQSSIpID09IDApIHsKKwkJCWNhcmQtPnUuYy51c2VkYnkgPSBBUEk7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUnVubmluZyBpbiBBUEkgbW9kZSAhXG4iLAorCQkJCXdhbmRldi0+bmFtZSk7CisJCX0KKwl9CisKKwkvKiBUZWxscyB1cyB0aGF0IGlmIHRoaXMgaW50ZXJmYWNlIGlzIGEKKyAgICAgICAgICogZ2F0ZXdheSBvciBub3QgKi8KKwlpZiAoKGNoZGxjX3ByaXZfYXJlYS0+Z2F0ZXdheSA9IGNvbmYtPmdhdGV3YXkpID09IFdBTk9QVF9ZRVMpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJmYWNlICVzIGlzIHNldCBhcyBhIGdhdGV3YXkuXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSxjYXJkLT51LmMuaWZfbmFtZSk7CisJfQorCisJLyogR2V0IE11bHRpY2FzdCBJbmZvcm1hdGlvbiAqLworCWNoZGxjX3ByaXZfYXJlYS0+bWMgPSBjb25mLT5tYzsKKworCS8qIHByZXBhcmUgbmV0d29yayBkZXZpY2UgZGF0YSBzcGFjZSBmb3IgcmVnaXN0cmF0aW9uICovCisJc3RyY3B5KGRldi0+bmFtZSxjYXJkLT51LmMuaWZfbmFtZSk7CisKKwlkZXYtPmluaXQgPSAmaWZfaW5pdDsKKwlkZXYtPnByaXYgPSBjaGRsY19wcml2X2FyZWE7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwb2xsaW5nIHdvcmsgcm91dGluZSAqLworCUlOSVRfV09SSygmY2hkbGNfcHJpdl9hcmVhLT5wb2xsX3dvcmssICh2b2lkKikodm9pZCopY2hkbGNfcG9sbCwgZGV2KTsKKworCS8qIEluaXRpYWxpemUgdGhlIHBvbGxpbmcgZGVsYXkgdGltZXIgKi8KKwlpbml0X3RpbWVyKCZjaGRsY19wcml2X2FyZWEtPnBvbGxfZGVsYXlfdGltZXIpOworCWNoZGxjX3ByaXZfYXJlYS0+cG9sbF9kZWxheV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWNoZGxjX3ByaXZfYXJlYS0+cG9sbF9kZWxheV90aW1lci5mdW5jdGlvbiA9IGNoZGxjX3BvbGxfZGVsYXk7CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKworCXJldHVybiAwOworfQorCisKKy8qKioqKiogTmV0d29yayBEZXZpY2UgSW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgTGludXggbmV0d29yayBpbnRlcmZhY2UuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBvbmx5IG9uY2UgZm9yIGVhY2ggaW50ZXJmYWNlLCBkdXJpbmcgTGludXggbmV0d29yaworICogaW50ZXJmYWNlIHJlZ2lzdHJhdGlvbi4gIFJldHVybmluZyBhbnl0aGluZyBidXQgemVybyB3aWxsIGZhaWwgaW50ZXJmYWNlCisgKiByZWdpc3RyYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgaWZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hkbGNfcHJpdl9hcmVhLT5jYXJkOworCXN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCisJLyogSW5pdGlhbGl6ZSBkZXZpY2UgZHJpdmVyIGVudHJ5IHBvaW50cyAqLworCWRldi0+b3BlbgkJPSAmaWZfb3BlbjsKKwlkZXYtPnN0b3AJCT0gJmlmX2Nsb3NlOworCWRldi0+aGFyZF9oZWFkZXIJPSAmaWZfaGVhZGVyOworCWRldi0+cmVidWlsZF9oZWFkZXIJPSAmaWZfcmVidWlsZF9oZHI7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSAmaWZfc2VuZDsKKwlkZXYtPmdldF9zdGF0cwkJPSAmaWZfc3RhdHM7CisJZGV2LT50eF90aW1lb3V0CQk9ICZpZl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOworCQorCS8qIEluaXRpYWxpemUgbWVkaWEtc3BlY2lmaWMgcGFyYW1ldGVycyAqLworCWRldi0+ZmxhZ3MJCXw9IElGRl9QT0lOVE9QT0lOVDsKKwlkZXYtPmZsYWdzCQl8PSBJRkZfTk9BUlA7CisKKwkvKiBFbmFibGUgTXVsaXRjYXN0aW5nIGlmIHVzZXIgc2VsZWN0ZWQgKi8KKwlpZiAoY2hkbGNfcHJpdl9hcmVhLT5tYyA9PSBXQU5PUFRfWUVTKXsKKwkJZGV2LT5mbGFncyAJfD0gSUZGX01VTFRJQ0FTVDsKKwl9CisJCisJaWYgKGNoZGxjX3ByaXZfYXJlYS0+dHJ1ZV9pZl9lbmNvZGluZyl7CisJCWRldi0+dHlwZQk9IEFSUEhSRF9IRExDOyAvKiBUaGlzIGJyZWFrcyB0aGUgdGNwZHVtcCAqLworCX1lbHNleworCQlkZXYtPnR5cGUJPSBBUlBIUkRfUFBQOworCX0KKwkKKwlkZXYtPm10dQkJPSBjYXJkLT53YW5kZXYubXR1OworCS8qIGZvciBBUEkgdXNhZ2UsIGFkZCB0aGUgQVBJIGhlYWRlciBzaXplIHRvIHRoZSByZXF1ZXN0ZWQgTVRVIHNpemUgKi8KKwlpZihjYXJkLT51LmMudXNlZGJ5ID09IEFQSSkgeworCQlkZXYtPm10dSArPSBzaXplb2YoYXBpX3R4X2hkcl90KTsKKwl9CisgCisJZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSBDSERMQ19IRFJfTEVOOworCisJLyogSW5pdGlhbGl6ZSBoYXJkd2FyZSBwYXJhbWV0ZXJzICovCisJZGV2LT5pcnEJPSB3YW5kZXYtPmlycTsKKwlkZXYtPmRtYQk9IHdhbmRldi0+ZG1hOworCWRldi0+YmFzZV9hZGRyCT0gd2FuZGV2LT5pb3BvcnQ7CisJZGV2LT5tZW1fc3RhcnQJPSB3YW5kZXYtPm1hZGRyOworCWRldi0+bWVtX2VuZAk9IHdhbmRldi0+bWFkZHIgKyB3YW5kZXYtPm1zaXplIC0gMTsKKworCS8qIFNldCB0cmFuc21pdCBidWZmZXIgcXVldWUgbGVuZ3RoIAorCSAqIElmIHRvbyBsb3cgcGFja2V0cyB3aWxsIG5vdCBiZSByZXRyYW5zbWl0dGVkIAorICAgICAgICAgKiBieSBzdGFjay4KKwkgKi8KKyAgICAgICAgZGV2LT50eF9xdWV1ZV9sZW4gPSAxMDA7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworICAgCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogT3BlbiBuZXR3b3JrIGludGVyZmFjZS4KKyAqIG8gZW5hYmxlIGNvbW11bmljYXRpb25zIGFuZCBpbnRlcnJ1cHRzLgorICogbyBwcmV2ZW50IG1vZHVsZSBmcm9tIHVubG9hZGluZyBieSBpbmNyZW1lbnRpbmcgdXNlIGNvdW50CisgKgorICogUmV0dXJuIDAgaWYgTy5rLiBvciBlcnJuby4KKyAqLworc3RhdGljIGludCBpZl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJaW50IGVyciA9IDA7CisKKwkvKiBPbmx5IG9uZSBvcGVuIHBlciBpbnRlcmZhY2UgaXMgYWxsb3dlZCAqLworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIEluaXRpYWxpemUgdGhlIHdvcmsgcXVldWUgZW50cnkgKi8KKwljaGRsY19wcml2X2FyZWEtPnRxX3dvcmtpbmc9MDsKKworCUlOSVRfV09SSygmY2hkbGNfcHJpdl9hcmVhLT5jb21tb24ud2FucGlwZV93b3JrLAorCQkJKHZvaWQgKikodm9pZCAqKWNoZGxjX3dvcmssIGRldik7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBCSCBjaXJjdWxhciBidWZmZXIgKi8KKwkvKiBBZGQgMSB0byBNQVhfQkhfQlVGRiBzbyB3ZSBkb24ndCBoYXZlIHRlc3Qgd2l0aCAoTUFYX0JIX0JVRkYtMSkgKi8KKwljaGRsY19wcml2X2FyZWEtPmJoX2hlYWQgPSBrbWFsbG9jKChzaXplb2YoYmhfZGF0YV90KSooTUFYX0JIX0JVRkYrMSkpLEdGUF9BVE9NSUMpOworCW1lbXNldChjaGRsY19wcml2X2FyZWEtPmJoX2hlYWQsMCwoc2l6ZW9mKGJoX2RhdGFfdCkqKE1BWF9CSF9CVUZGKzEpKSk7CisJYXRvbWljX3NldCgmY2hkbGNfcHJpdl9hcmVhLT5iaF9idWZmX3VzZWQsIDApOworIAorCWRvX2dldHRpbWVvZmRheSgmdHYpOworCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVyX3N0YXJ0X3RpbWUgPSB0di50dl9zZWM7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJd2FucGlwZV9vcGVuKGNhcmQpOworCisJLyogVFRZIGlzIGNvbmZpZ3VyZWQgZHVyaW5nIHdhbnBpcGVfc2V0X3Rlcm1pb3MKKwkgKiBjYWxsLCBub3QgaGVyZSAqLworCWlmIChjYXJkLT50dHlfb3B0KQorCQlyZXR1cm4gZXJyOworCQorCXNldF9iaXQoMCwmY2hkbGNfcHJpdl9hcmVhLT5jb25maWdfY2hkbGMpOworCWNoZGxjX3ByaXZfYXJlYS0+Y29uZmlnX2NoZGxjX3RpbWVvdXQ9amlmZmllczsKKworCS8qIFN0YXJ0IHRoZSBDSERMQyBjb25maWd1cmF0aW9uIGFmdGVyIDFzZWMgZGVsYXkuCisJICogVGhpcyB3aWxsIGdpdmUgdGhlIGludGVyZmFjZSBpbml0aWxpemF0aW9uIHRpbWUKKwkgKiB0byBmaW5pc2ggaXRzIGNvbmZpZ3VyYXRpb24gKi8KKwltb2RfdGltZXIoJmNoZGxjX3ByaXZfYXJlYS0+cG9sbF9kZWxheV90aW1lciwgamlmZmllcyArIEhaKTsKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENsb3NlIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBpZiB0aGlzIGlzIHRoZSBsYXN0IGNsb3NlLCB0aGVuIGRpc2FibGUgY29tbXVuaWNhdGlvbnMgYW5kIGludGVycnVwdHMuCisgKiBvIHJlc2V0IGZsYWdzLgorICovCitzdGF0aWMgaW50IGlmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisKKwlpZiAoY2hkbGNfcHJpdl9hcmVhLT5iaF9oZWFkKXsKKwkJaW50IGk7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCisJCWZvciAoaT0wOyBpPChNQVhfQkhfQlVGRisxKTsgaSsrKXsKKwkJCXNrYiA9ICgoYmhfZGF0YV90ICopJmNoZGxjX3ByaXZfYXJlYS0+YmhfaGVhZFtpXSktPnNrYjsKKwkJCWlmIChza2IgIT0gTlVMTCl7CisgICAgICAgICAgICAgICAgCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJfQorCQl9CisJCWtmcmVlKGNoZGxjX3ByaXZfYXJlYS0+YmhfaGVhZCk7CisJCWNoZGxjX3ByaXZfYXJlYS0+YmhfaGVhZD1OVUxMOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl3YW5waXBlX2Nsb3NlKGNhcmQpOworCWRlbF90aW1lcigmY2hkbGNfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9jb21tIChzZGxhX3QgKmNhcmQpCit7CisJU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCAqZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisJCisJaWYgKGNhcmQtPnUuYy5jb21tX2VuYWJsZWQpeworCQljaGRsY19kaXNhYmxlX2NvbW1fc2h1dGRvd24gKGNhcmQpOworCX1lbHNleworCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uID0gMDsJCisJfQorCisJaWYgKCF0dHlfaW5pdF9jbnQpCisJCXJldHVybjsKKworCWlmIChjYXJkLT50dHlfb3B0KXsKKwkJc3RydWN0IHNlcmlhbF9zdGF0ZSAqIHN0YXRlOworCQlpZiAoISgtLXR0eV9pbml0X2NudCkpeworCQkJaW50IGUxOworCQkJc2VyaWFsX2RyaXZlci5yZWZjb3VudD0wOworCQkJCisJCQlpZiAoKGUxID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKCZzZXJpYWxfZHJpdmVyKSkpCisJCQkJcHJpbnRrKCJTRVJJQUw6IGZhaWxlZCB0byB1bnJlZ2lzdGVyIHNlcmlhbCBkcml2ZXIgKCVkKVxuIiwKKwkJCQkgICAgICAgZTEpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVucmVnaXN0ZXJpbmcgVFRZIERyaXZlciwgTWFqb3IgJWlcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsV0FOX1RUWV9NQUpPUik7CisJCX0KKwkJY2FyZC0+dHR5PU5VTEw7CisJCXR0eV9jYXJkX21hcFtjYXJkLT50dHlfbWlub3JdPU5VTEw7CisJCXN0YXRlID0gJnJzX3RhYmxlW2NhcmQtPnR0eV9taW5vcl07CisJCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKCpzdGF0ZSkpOworCX0KKwlyZXR1cm47Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBCdWlsZCBtZWRpYSBoZWFkZXIuCisgKgorICogVGhlIHRyaWNrIGhlcmUgaXMgdG8gcHV0IHBhY2tldCB0eXBlIChFdGhlcnR5cGUpIGludG8gJ3Byb3RvY29sJyBmaWVsZCBvZgorICogdGhlIHNvY2tldCBidWZmZXIsIHNvIHRoYXQgd2UgZG9uJ3QgZm9yZ2V0IGl0LiAgSWYgcGFja2V0IHR5cGUgaXMgbm90CisgKiBzdXBwb3J0ZWQsIHNldCBza2ItPnByb3RvY29sIHRvIDAgYW5kIGRpc2NhcmQgcGFja2V0IGxhdGVyLgorICoKKyAqIFJldHVybjoJbWVkaWEgaGVhZGVyIGxlbmd0aC4KKyAqLworc3RhdGljIGludCBpZl9oZWFkZXIoc3RydWN0IHNrX2J1ZmYqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkKiBkYWRkciwgdm9pZCogc2FkZHIsCisJCSAgICAgdW5zaWduZWQgbGVuKQoreworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyh0eXBlKTsKKworCXJldHVybiBDSERMQ19IRFJfTEVOOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSGFuZGxlIHRyYW5zbWl0IHRpbWVvdXQgZXZlbnQgZnJvbSBuZXRpZiB3YXRjaGRvZworICovCitzdGF0aWMgdm9pZCBpZl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisJCisJLyogSWYgb3VyIGRldmljZSBzdGF5cyBidXN5IGZvciBhdCBsZWFzdCA1IHNlY29uZHMgdGhlbiB3ZSB3aWxsCisJICoga2ljayBzdGFydCB0aGUgZGV2aWNlIGJ5IG1ha2luZyBkZXYtPnRidXN5ID0gMC4gIFdlIGV4cGVjdAorCSAqIHRoYXQgb3VyIGRldmljZSBuZXZlciBzdGF5cyBidXN5IG1vcmUgdGhhbiA1IHNlY29uZHMuIFNvIHRoaXMgICAgICAgICAgICAgICAgIAorCSAqIGlzIG9ubHkgdXNlZCBhcyBhIGxhc3QgcmVzb3J0LgorCSAqLworCisJKytjYXJkLT53YW5kZXYuc3RhdHMuY29sbGlzaW9uczsKKworCXByaW50ayAoS0VSTl9JTkZPICIlczogVHJhbnNtaXQgdGltZWQgb3V0IG9uICVzXG4iLCBjYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmUtYnVpbGQgbWVkaWEgaGVhZGVyLgorICoKKyAqIFJldHVybjoJMQlwaHlzaWNhbCBhZGRyZXNzIHJlc29sdmVkLgorICoJCTAJcGh5c2ljYWwgYWRkcmVzcyBub3QgcmVzb2x2ZWQKKyAqLworc3RhdGljIGludCBpZl9yZWJ1aWxkX2hkciAoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gMTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSBwYWNrZXQgb24gYSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIG8gc2V0IHRidXN5IGZsYWcgKG1hcmtzIHN0YXJ0IG9mIHRoZSB0cmFuc21pc3Npb24pIHRvIGJsb2NrIGEgdGltZXItYmFzZWQKKyAqICAgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4KKyAqIG8gY2hlY2sgbGluayBzdGF0ZS4gSWYgbGluayBpcyBub3QgdXAsIHRoZW4gZHJvcCB0aGUgcGFja2V0LgorICogbyBleGVjdXRlIGFkYXB0ZXIgc2VuZCBjb21tYW5kLgorICogbyBmcmVlIHNvY2tldCBidWZmZXIKKyAqCisgKiBSZXR1cm46CTAJY29tcGxldGUgKHNvY2tldCBidWZmZXIgbXVzdCBiZSBmcmVlZCkKKyAqCQlub24tMAlwYWNrZXQgbWF5IGJlIHJlLXRyYW5zbWl0dGVkICh0YnVzeSBtdXN0IGJlIHNldCkKKyAqCisgKiBOb3RlczoKKyAqIDEuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZWl0aGVyIGJ5IHRoZSBwcm90b2NvbCBzdGFjayBvciBieSB0aGUgIm5ldAorICogICAgYm90dG9tIGhhbGYiICh3aXRoIGludGVycnVwdHMgZW5hYmxlZCkuCisgKiAyLiBTZXR0aW5nIHRidXN5IGZsYWcgd2lsbCBpbmhpYml0IGZ1cnRoZXIgdHJhbnNtaXQgcmVxdWVzdHMgZnJvbSB0aGUKKyAqICAgIHByb3RvY29sIHN0YWNrIGFuZCBjYW4gYmUgdXNlZCBmb3IgZmxvdyBjb250cm9sIHdpdGggcHJvdG9jb2wgbGF5ZXIuCisgKi8KK3N0YXRpYyBpbnQgaWZfc2VuZChzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCWNoZGxjX3ByaXZhdGVfYXJlYV90ICpjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hkbGNfcHJpdl9hcmVhLT5jYXJkOworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCUlOVEVSUlVQVF9JTkZPUk1BVElPTl9TVFJVQ1QgKmNoZGxjX2ludCA9ICZmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0OworCWludCB1ZHBfdHlwZSA9IDA7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M7CisJaW50IGVycj0wOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWlmIChza2IgPT0gTlVMTCl7CisJCS8qIElmIHdlIGdldCBoZXJlLCBzb21lIGhpZ2hlciBsYXllciB0aGlua3Mgd2UndmUgbWlzc2VkIGFuCisJCSAqIHR4LWRvbmUgaW50ZXJydXB0LgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludGVyZmFjZSAlcyBnb3Qga2lja2VkIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSk7CisKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKyAgIAlpZiAobnRvaHMoc2tiLT5wcm90b2NvbCkgIT0gaHRvbnMoUFZDX1BST1QpKXsKKworCQkvKiBjaGVjayB0aGUgdWRwIHBhY2tldCB0eXBlICovCisJCQorCQl1ZHBfdHlwZSA9IHVkcF9wa3RfdHlwZShza2IsIGNhcmQpOworCisJCWlmICh1ZHBfdHlwZSA9PSBVRFBfQ1BJUEVfVFlQRSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihzdG9yZV91ZHBfbWdtdF9wa3QoVURQX1BLVF9GUk1fU1RBQ0ssIGNhcmQsIHNrYiwgZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGRsY19wcml2X2FyZWEpKXsKKwkgICAgICAgICAgICAgICAgCWNoZGxjX2ludC0+aW50ZXJydXB0X3Blcm1pc3Npb24gfD0KKwkJCQkJQVBQX0lOVF9PTl9USU1FUjsKKwkJCX0KKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIGNoZWNrIHRvIHNlZSBpZiB0aGUgc291cmNlIElQIGFkZHJlc3MgaXMgYSBicm9hZGNhc3Qgb3IgKi8KKwkJLyogbXVsdGljYXN0IElQIGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgICBpZihjaGtfYmNhc3RfbWNhc3RfYWRkcihjYXJkLCBkZXYsIHNrYikpeworCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKyAgICAgICAgfQorCisJLyogTG9jayB0aGUgNTA4IENhcmQ6IFNNUCBpcyBzdXBwb3J0ZWQgKi8KKyAgICAgIAlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisJCXM1MDhfbG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCX0gCisKKyAgICAJaWYodGVzdF9hbmRfc2V0X2JpdChTRU5EX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSkgeworCQorCQlwcmludGsoS0VSTl9JTkZPICIlczogQ3JpdGljYWwgaW4gaWZfc2VuZDogJWx4XG4iLAorCQkJCQljYXJkLT53YW5kZXYubmFtZSxjYXJkLT53YW5kZXYuY3JpdGljYWwpOworICAgICAgICAgICAgICAgICsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCWdvdG8gaWZfc2VuZF9leGl0X2NyaXQ7CisJfQorCisJaWYoY2FyZC0+dS5jLnN0YXRlICE9IFdBTl9DT05ORUNURUQpeworICAgICAgIAkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCisJfWVsc2UgaWYoIXNrYi0+cHJvdG9jb2wpeworICAgICAgICAJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZXJyb3JzOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkKKwl9ZWxzZSB7CisJCXZvaWQqIGRhdGEgPSBza2ItPmRhdGE7CisJCXVuc2lnbmVkIGxlbiA9IHNrYi0+bGVuOworCQl1bnNpZ25lZCBjaGFyIGF0dHI7CisKKwkJLyogSWYgaXQncyBhbiBBUEkgcGFja2V0IHB1bGwgb2ZmIHRoZSBBUEkKKwkJICogaGVhZGVyLiBBbHNvIGNoZWNrIHRoYXQgdGhlIHBhY2tldCBzaXplCisJCSAqIGlzIGxhcmdlciB0aGFuIHRoZSBBUEkgaGVhZGVyCisJICAgICAgICAgKi8KKwkJaWYgKGNhcmQtPnUuYy51c2VkYnkgPT0gQVBJKXsKKwkJCWFwaV90eF9oZHJfdCogYXBpX3R4X2hkcjsKKworCQkJLyogZGlzY2FyZCB0aGUgZnJhbWUgaWYgd2UgYXJlIGNvbmZpZ3VyZWQgZm9yICovCisJCQkvKiAncmVjZWl2ZSBvbmx5JyBtb2RlIG9yIGlmIHRoZXJlIGlzIG5vIGRhdGEgKi8KKwkJCWlmIChjYXJkLT51LmMucmVjZWl2ZV9vbmx5IHx8CisJCQkJKGxlbiA8PSBzaXplb2YoYXBpX3R4X2hkcl90KSkpIHsKKwkJCQkKKwkJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQkJZ290byBpZl9zZW5kX2V4aXRfY3JpdDsKKwkJCX0KKwkJCQkKKwkJCWFwaV90eF9oZHIgPSAoYXBpX3R4X2hkcl90ICopZGF0YTsKKwkJCWF0dHIgPSBhcGlfdHhfaGRyLT5hdHRyOworCQkJZGF0YSArPSBzaXplb2YoYXBpX3R4X2hkcl90KTsKKwkJCWxlbiAtPSBzaXplb2YoYXBpX3R4X2hkcl90KTsKKwkJfQorCisJCWlmKGNoZGxjX3NlbmQoY2FyZCwgZGF0YSwgbGVuKSkgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQl9ZWxzZXsKKwkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X3BhY2tldHM7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT53YW5kZXYuc3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCQkJCisJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJCisJCSAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCX0JCisJfQorCitpZl9zZW5kX2V4aXRfY3JpdDoKKwkKKwlpZiAoIShlcnI9bmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX1lbHNleworCQljaGRsY19wcml2X2FyZWEtPnRpY2tfY291bnRlciA9IGppZmZpZXM7CisJCWNoZGxjX2ludC0+aW50ZXJydXB0X3Blcm1pc3Npb24gfD0gQVBQX0lOVF9PTl9UWF9GUkFNRTsKKwl9CisKKwljbGVhcl9iaXQoU0VORF9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCQlzNTA4X3VubG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCX0KKwkKKwlyZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBwYWNrZXQgdG8gYmUgdHJhbnNtaXR0ZWQgY29udGFpbnMgYSBicm9hZGNhc3Qgb3IKKyAqIG11bHRpY2FzdCBzb3VyY2UgSVAgYWRkcmVzcy4KKyAqLworCitzdGF0aWMgaW50IGNoa19iY2FzdF9tY2FzdF9hZGRyKHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUzMiBzcmNfaXBfYWRkcjsKKyAgICAgICAgdTMyIGJyb2FkY2FzdF9pcF9hZGRyID0gMDsKKyAgICAgICAgc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCisgICAgICAgIC8qIHJlYWQgdGhlIElQIHNvdXJjZSBhZGRyZXNzIGZyb20gdGhlIG91dGdvaW5nIHBhY2tldCAqLworICAgICAgICBzcmNfaXBfYWRkciA9ICoodTMyICopKHNrYi0+ZGF0YSArIDEyKTsKKworCS8qIHJlYWQgdGhlIElQIGJyb2FkY2FzdCBhZGRyZXNzIGZvciB0aGUgZGV2aWNlICovCisgICAgICAgIGluX2RldiA9IGRldi0+aXBfcHRyOworICAgICAgICBpZihpbl9kZXYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBpbl9pZmFkZHIgKmlmYT0gaW5fZGV2LT5pZmFfbGlzdDsKKyAgICAgICAgICAgICAgICBpZihpZmEgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdF9pcF9hZGRyID0gaWZhLT5pZmFfYnJvYWRjYXN0OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgCisgICAgICAgIC8qIGNoZWNrIGlmIHRoZSBJUCBTb3VyY2UgQWRkcmVzcyBpcyBhIEJyb2FkY2FzdCBhZGRyZXNzICovCisgICAgICAgIGlmKChkZXYtPmZsYWdzICYgSUZGX0JST0FEQ0FTVCkgJiYgKHNyY19pcF9hZGRyID09IGJyb2FkY2FzdF9pcF9hZGRyKSkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBCcm9hZGNhc3QgU291cmNlIEFkZHJlc3Mgc2lsZW50bHkgZGlzY2FyZGVkXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IAorCisgICAgICAgIC8qIGNoZWNrIGlmIHRoZSBJUCBTb3VyY2UgQWRkcmVzcyBpcyBhIE11bHRpY2FzdCBhZGRyZXNzICovCisgICAgICAgIGlmKChudG9obChzcmNfaXBfYWRkcikgPj0gMHhFMDAwMDAwMSkgJiYKKwkJKG50b2hsKHNyY19pcF9hZGRyKSA8PSAweEZGRkZGRkZFKSkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBNdWx0aWNhc3QgU291cmNlIEFkZHJlc3Mgc2lsZW50bHkgZGlzY2FyZGVkXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXBseSB0byBVRFAgTWFuYWdlbWVudCBzeXN0ZW0uCisgKiBSZXR1cm4gbGVuZ3RoIG9mIHJlcGx5LgorICovCitzdGF0aWMgaW50IHJlcGx5X3VkcCggdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG1ib3hfbGVuICkKK3sKKworCXVuc2lnbmVkIHNob3J0IGxlbiwgdWRwX2xlbmd0aCwgdGVtcCwgaXBfbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgaXBfdGVtcDsKKwlpbnQgZXZlbl9ib3VuZCA9IDA7CisgIAljaGRsY191ZHBfcGt0X3QgKmNfdWRwX3BrdCA9IChjaGRsY191ZHBfcGt0X3QgKilkYXRhOworCSAKKwkvKiBTZXQgbGVuZ3RoIG9mIHBhY2tldCAqLworCWxlbiA9IHNpemVvZihpcF9wa3RfdCkrIAorCSAgICAgIHNpemVvZih1ZHBfcGt0X3QpKworCSAgICAgIHNpemVvZih3cF9tZ210X3QpKworCSAgICAgIHNpemVvZihjYmxvY2tfdCkrCisJICAgICAgc2l6ZW9mKHRyYWNlX2luZm9fdCkrIAorCSAgICAgIG1ib3hfbGVuOworCisJLyogZmlsbCBpbiBVRFAgcmVwbHkgKi8KKwljX3VkcF9wa3QtPndwX21nbXQucmVxdWVzdF9yZXBseSA9IFVEUE1HTVRfUkVQTFk7CisgICAKKwkvKiBmaWxsIGluIFVEUCBsZW5ndGggKi8KKwl1ZHBfbGVuZ3RoID0gc2l6ZW9mKHVkcF9wa3RfdCkrIAorCQkgICAgIHNpemVvZih3cF9tZ210X3QpKworCQkgICAgIHNpemVvZihjYmxvY2tfdCkrCisJICAgICAgICAgICAgIHNpemVvZih0cmFjZV9pbmZvX3QpKworCQkgICAgIG1ib3hfbGVuOyAKKworIAkvKiBwdXQgaXQgb24gYW4gZXZlbiBib3VuZGFyeSAqLworCWlmICggdWRwX2xlbmd0aCAmIDB4MDAwMSApIHsKKwkJdWRwX2xlbmd0aCArPSAxOworCQlsZW4gKz0gMTsKKwkJZXZlbl9ib3VuZCA9IDE7CisJfSAgCisKKwl0ZW1wID0gKHVkcF9sZW5ndGg8PDgpfCh1ZHBfbGVuZ3RoPj44KTsKKwljX3VkcF9wa3QtPnVkcF9wa3QudWRwX2xlbmd0aCA9IHRlbXA7CisJCSAKKwkvKiBzd2FwIFVEUCBwb3J0cyAqLworCXRlbXAgPSBjX3VkcF9wa3QtPnVkcF9wa3QudWRwX3NyY19wb3J0OworCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfc3JjX3BvcnQgPSAKKwkJCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQ7IAorCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQgPSB0ZW1wOworCisJLyogYWRkIFVEUCBwc2V1ZG8gaGVhZGVyICovCisJdGVtcCA9IDB4MTEwMDsKKwkqKCh1bnNpZ25lZCBzaG9ydCAqKShjX3VkcF9wa3QtPmRhdGErbWJveF9sZW4rZXZlbl9ib3VuZCkpID0gdGVtcDsJCisJdGVtcCA9ICh1ZHBfbGVuZ3RoPDw4KXwodWRwX2xlbmd0aD4+OCk7CisJKigodW5zaWduZWQgc2hvcnQgKikoY191ZHBfcGt0LT5kYXRhK21ib3hfbGVuK2V2ZW5fYm91bmQrMikpID0gdGVtcDsKKworCQkgCisJLyogY2FsY3VsYXRlIFVEUCBjaGVja3N1bSAqLworCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfY2hlY2tzdW0gPSAwOworCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfY2hlY2tzdW0gPSBjYWxjX2NoZWNrc3VtKCZkYXRhW1VEUF9PRkZTRVRdLHVkcF9sZW5ndGgrVURQX09GRlNFVCk7CisKKwkvKiBmaWxsIGluIElQIGxlbmd0aCAqLworCWlwX2xlbmd0aCA9IGxlbjsKKwl0ZW1wID0gKGlwX2xlbmd0aDw8OCl8KGlwX2xlbmd0aD4+OCk7CisJY191ZHBfcGt0LT5pcF9wa3QudG90YWxfbGVuZ3RoID0gdGVtcDsKKyAgCisJLyogc3dhcCBJUCBhZGRyZXNzZXMgKi8KKwlpcF90ZW1wID0gY191ZHBfcGt0LT5pcF9wa3QuaXBfc3JjX2FkZHJlc3M7CisJY191ZHBfcGt0LT5pcF9wa3QuaXBfc3JjX2FkZHJlc3MgPSBjX3VkcF9wa3QtPmlwX3BrdC5pcF9kc3RfYWRkcmVzczsKKwljX3VkcF9wa3QtPmlwX3BrdC5pcF9kc3RfYWRkcmVzcyA9IGlwX3RlbXA7CisKKwkvKiBmaWxsIGluIElQIGNoZWNrc3VtICovCisJY191ZHBfcGt0LT5pcF9wa3QuaGRyX2NoZWNrc3VtID0gMDsKKwljX3VkcF9wa3QtPmlwX3BrdC5oZHJfY2hlY2tzdW0gPSBjYWxjX2NoZWNrc3VtKGRhdGEsc2l6ZW9mKGlwX3BrdF90KSk7CisKKwlyZXR1cm4gbGVuOworCit9IC8qIHJlcGx5X3VkcCAqLworCit1bnNpZ25lZCBzaG9ydCBjYWxjX2NoZWNrc3VtIChjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIHNob3J0IHRlbXA7IAorCXVuc2lnbmVkIGxvbmcgc3VtPTA7CisJaW50IGk7CisKKwlmb3IoIGkgPSAwOyBpIDxsZW47IGkrPTIgKSB7CisJCW1lbWNweSgmdGVtcCwmZGF0YVtpXSwyKTsKKwkJc3VtICs9ICh1bnNpZ25lZCBsb25nKXRlbXA7CisJfQorCisJd2hpbGUgKHN1bSA+PiAxNiApIHsKKwkJc3VtID0gKHN1bSAmIDB4ZmZmZlVMKSArIChzdW0gPj4gMTYpOworCX0KKworCXRlbXAgPSAodW5zaWduZWQgc2hvcnQpc3VtOworCXRlbXAgPSB+dGVtcDsKKworCWlmKCB0ZW1wID09IDAgKSAKKwkJdGVtcCA9IDB4ZmZmZjsKKworCXJldHVybiB0ZW1wOwkKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdldCBldGhlcm5ldC1zdHlsZSBpbnRlcmZhY2Ugc3RhdGlzdGljcy4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gc3RydWN0IGVuZXRfc3RhdGlzdGljcy4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiBpZl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXNkbGFfdCAqbXlfY2FyZDsKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhOworCisJaWYgKChjaGRsY19wcml2X2FyZWE9ZGV2LT5wcml2KSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW15X2NhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisJcmV0dXJuICZteV9jYXJkLT53YW5kZXYuc3RhdHM7IAorfQorCisKKy8qKioqKiogQ2lzY28gSERMQyBGaXJtd2FyZSBJbnRlcmZhY2UgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBmaXJtd2FyZSBjb2RlIHZlcnNpb24uCisgKglQdXQgY29kZSB2ZXJzaW9uIGFzIEFTQ0lJIHN0cmluZyBpbiBzdHIuIAorICovCitzdGF0aWMgaW50IGNoZGxjX3JlYWRfdmVyc2lvbiAoc2RsYV90KiBjYXJkLCBjaGFyKiBzdHIpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKwlpbnQgbGVuOworCWNoYXIgZXJyOworCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ERV9WRVJTSU9OOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKworCWlmKGVyciAhPSBDT01NQU5EX09LKSB7CisJCWNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKwl9CisJZWxzZSBpZiAoc3RyKSB7ICAvKiBpcyBub3QgbnVsbCAqLworCQlsZW4gPSBtYi0+YnVmZmVyX2xlbmd0aDsKKwkJbWVtY3B5KHN0ciwgbWItPmRhdGEsIGxlbik7CisJCXN0cltsZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIChlcnIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgQ29uZmlndXJlIENIRExDIGZpcm13YXJlLgorICovCitzdGF0aWMgaW50IGNoZGxjX2NvbmZpZ3VyZSAoc2RsYV90KiBjYXJkLCB2b2lkKiBkYXRhKQoreworCWludCBlcnI7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QgKm1haWxib3ggPSBjYXJkLT5tYm94OworCWludCBkYXRhX2xlbmd0aCA9IHNpemVvZihDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCk7CisJCisJbWFpbGJveC0+YnVmZmVyX2xlbmd0aCA9IGRhdGFfbGVuZ3RoOyAgCisJbWVtY3B5KG1haWxib3gtPmRhdGEsIGRhdGEsIGRhdGFfbGVuZ3RoKTsKKwltYWlsYm94LT5jb21tYW5kID0gU0VUX0NIRExDX0NPTkZJR1VSQVRJT047CisJZXJyID0gc2RsYV9leGVjKG1haWxib3gpID8gbWFpbGJveC0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwkKKwlpZiAoZXJyICE9IENPTU1BTkRfT0spIGNoZGxjX2Vycm9yIChjYXJkLCBlcnIsIG1haWxib3gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJcmV0dXJuIGVycjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBpbnRlcnJ1cHQgbW9kZSAtLSBIRExDIFZlcnNpb24uCisgKi8KKworc3RhdGljIGludCBjaGRsY19zZXRfaW50cl9tb2RlIChzZGxhX3QqIGNhcmQsIHVuc2lnbmVkIG1vZGUpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKwlDSERMQ19JTlRfVFJJR0dFUlNfU1RSVUNUKiBpbnRfZGF0YSA9CisJCSAoQ0hETENfSU5UX1RSSUdHRVJTX1NUUlVDVCAqKW1iLT5kYXRhOworCWludCBlcnI7CisKKwlpbnRfZGF0YS0+Q0hETENfaW50ZXJydXB0X3RyaWdnZXJzIAk9IG1vZGU7CisJaW50X2RhdGEtPklSUQkJCQk9IGNhcmQtPmh3LmlycTsKKwlpbnRfZGF0YS0+aW50ZXJydXB0X3RpbWVyICAgICAgICAgICAgICAgPSAxOworICAgCisJbWItPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoQ0hETENfSU5UX1RSSUdHRVJTX1NUUlVDVCk7CisJbWItPmNvbW1hbmQgPSBTRVRfQ0hETENfSU5URVJSVVBUX1RSSUdHRVJTOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyICE9IENPTU1BTkRfT0spCisJCWNoZGxjX2Vycm9yIChjYXJkLCBlcnIsIG1iKTsKKwlyZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGNoZGxjX2Rpc2FibGVfY29tbV9zaHV0ZG93bgorICoKKyAqIFNodXRkb3duKCkgZGlzYWJsZXMgdGhlIGNvbW11bmljYXRpb25zLiBXZSBtdXN0CisgKiBoYXZlIGEgc3BhcmF0ZSBmdW5jdGlvbnMsIGJlY2F1c2Ugd2UgbXVzdCBub3QKKyAqIGNhbGwgY2hkbGNfZXJyb3IoKSBoYW5kZXIgc2luY2UgdGhlIHByaXZhdGUKKyAqIGFyZWEgaGFzIGFscmVhZHkgYmVlbiByZXBsYWNlZCAqLworCitzdGF0aWMgaW50IGNoZGxjX2Rpc2FibGVfY29tbV9zaHV0ZG93biAoc2RsYV90ICpjYXJkKQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisJQ0hETENfSU5UX1RSSUdHRVJTX1NUUlVDVCogaW50X2RhdGEgPQorCQkgKENIRExDX0lOVF9UUklHR0VSU19TVFJVQ1QgKiltYi0+ZGF0YTsKKwlpbnQgZXJyOworCisJLyogRGlzYWJsZSBJbnRlcnJ1dHBzICovCisJaW50X2RhdGEtPkNIRExDX2ludGVycnVwdF90cmlnZ2VycyAJPSAwOworCWludF9kYXRhLT5JUlEJCQkJPSBjYXJkLT5ody5pcnE7CisJaW50X2RhdGEtPmludGVycnVwdF90aW1lciAgICAgICAgICAgICAgID0gMTsKKyAgIAorCW1iLT5idWZmZXJfbGVuZ3RoID0gc2l6ZW9mKENIRExDX0lOVF9UUklHR0VSU19TVFJVQ1QpOworCW1iLT5jb21tYW5kID0gU0VUX0NIRExDX0lOVEVSUlVQVF9UUklHR0VSUzsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisKKwkvKiBEaXNhYmxlIENvbW11bmljYXRpb25zICovCisKKwlpZiAoY2FyZC0+dS5jLmFzeW5jX21vZGUpIHsKKwkJbWItPmNvbW1hbmQgPSBESVNBQkxFX0FTWV9DT01NVU5JQ0FUSU9OUzsKKwl9ZWxzZXsKKwkJbWItPmNvbW1hbmQgPSBESVNBQkxFX0NIRExDX0NPTU1VTklDQVRJT05TOworCX0KKwkKKwltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCQorCWNhcmQtPnUuYy5jb21tX2VuYWJsZWQgPSAwOworCQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVuYWJsZSBjb21tdW5pY2F0aW9ucy4KKyAqLworCitzdGF0aWMgaW50IGNoZGxjX2NvbW1fZW5hYmxlIChzZGxhX3QqIGNhcmQpCit7CisJaW50IGVycjsKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCisJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCW1iLT5jb21tYW5kID0gRU5BQkxFX0NIRExDX0NPTU1VTklDQVRJT05TOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyICE9IENPTU1BTkRfT0spCisJCWNoZGxjX2Vycm9yKGNhcmQsIGVyciwgbWIpOworCWVsc2UKKwkJY2FyZC0+dS5jLmNvbW1fZW5hYmxlZCA9IDE7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWFkIGNvbW11bmljYXRpb24gZXJyb3Igc3RhdGlzdGljcy4KKyAqLworc3RhdGljIGludCBjaGRsY19yZWFkX2NvbW1fZXJyX3N0YXRzIChzZGxhX3QqIGNhcmQpCit7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIENIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisKKyAgICAgICAgbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworICAgICAgICBtYi0+Y29tbWFuZCA9IFJFQURfQ09NTVNfRVJST1JfU1RBVFM7CisgICAgICAgIGVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKyAgICAgICAgaWYgKGVyciAhPSBDT01NQU5EX09LKQorICAgICAgICAgICAgICAgIGNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKyAgICAgICAgcmV0dXJuIGVycjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgQ0hETEMgb3BlcmF0aW9uYWwgc3RhdGlzdGljcy4KKyAqLworc3RhdGljIGludCBjaGRsY19yZWFkX29wX3N0YXRzIChzZGxhX3QqIGNhcmQpCit7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIENIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisKKyAgICAgICAgbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworICAgICAgICBtYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfT1BFUkFUSU9OQUxfU1RBVFM7CisgICAgICAgIGVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKyAgICAgICAgaWYgKGVyciAhPSBDT01NQU5EX09LKQorICAgICAgICAgICAgICAgIGNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKyAgICAgICAgcmV0dXJuIGVycjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBjb21tdW5pY2F0aW9ucyBlcnJvciBhbmQgZ2VuZXJhbCBwYWNrZXQgc3RhdGlzdGljcy4KKyAqLworc3RhdGljIGludCB1cGRhdGVfY29tbXNfc3RhdHMoc2RsYV90KiBjYXJkLAorCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWEpCit7CisgICAgICAgIENIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisgIAlDT01NU19FUlJPUl9TVEFUU19TVFJVQ1QqIGVycl9zdGF0czsKKyAgICAgICAgQ0hETENfT1BFUkFUSU9OQUxfU1RBVFNfU1RSVUNUICpvcF9zdGF0czsKKworCS8qIG9uIHRoZSBmaXJzdCB0aW1lciBpbnRlcnJ1cHQsIHJlYWQgdGhlIGNvbW1zIGVycm9yIHN0YXRpc3RpY3MgKi8KKwlpZihjaGRsY19wcml2X2FyZWEtPnVwZGF0ZV9jb21tc19zdGF0cyA9PSAyKSB7CisJCWlmKGNoZGxjX3JlYWRfY29tbV9lcnJfc3RhdHMoY2FyZCkpCisJCQlyZXR1cm4gMTsKKwkJZXJyX3N0YXRzID0gKENPTU1TX0VSUk9SX1NUQVRTX1NUUlVDVCAqKW1iLT5kYXRhOworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfb3Zlcl9lcnJvcnMgPSAKKwkJCQllcnJfc3RhdHMtPlJ4X292ZXJydW5fZXJyX2NvdW50OworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfY3JjX2Vycm9ycyA9IAorCQkJCWVycl9zdGF0cy0+Q1JDX2Vycl9jb3VudDsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IAorCQkJCWVycl9zdGF0cy0+UnhfYWJvcnRfY291bnQ7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9maWZvX2Vycm9ycyA9IAorCQkJCWVycl9zdGF0cy0+UnhfZGlzX3ByaV9iZnJzX2Z1bGxfY291bnQ7IAorCQljYXJkLT53YW5kZXYuc3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9CisJCQkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2ZpZm9fZXJyb3JzOworCQljYXJkLT53YW5kZXYuc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPQorCQkJCWVycl9zdGF0cy0+c2VjX1R4X2Fib3J0X2NvdW50OworCX0KKworICAgICAgICAvKiBvbiB0aGUgc2Vjb25kIHRpbWVyIGludGVycnVwdCwgcmVhZCB0aGUgb3BlcmF0aW9uYWwgc3RhdGlzdGljcyAqLworCWVsc2UgeworICAgICAgICAJaWYoY2hkbGNfcmVhZF9vcF9zdGF0cyhjYXJkKSkKKyAgICAgICAgICAgICAgICAJcmV0dXJuIDE7CisJCW9wX3N0YXRzID0gKENIRExDX09QRVJBVElPTkFMX1NUQVRTX1NUUlVDVCAqKW1iLT5kYXRhOworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9CisJCQkob3Bfc3RhdHMtPlJ4X0RhdGFfZGlzY2FyZF9zaG9ydF9jb3VudCArCisJCQlvcF9zdGF0cy0+UnhfRGF0YV9kaXNjYXJkX2xvbmdfY291bnQpOworCX0KKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgcGFja2V0LgorICoJUmV0dXJuOgkwIC0gby5rLgorICoJCTEgLSBubyB0cmFuc21pdCBidWZmZXJzIGF2YWlsYWJsZQorICovCitzdGF0aWMgaW50IGNoZGxjX3NlbmQgKHNkbGFfdCogY2FyZCwgdm9pZCogZGF0YSwgdW5zaWduZWQgbGVuKQoreworCUNIRExDX0RBVEFfVFhfU1RBVFVTX0VMX1NUUlVDVCAqdHhidWYgPSBjYXJkLT51LmMudHhidWY7CisKKwlpZiAodHhidWYtPm9wcF9mbGFnKQorCQlyZXR1cm4gMTsKKwkKKwlzZGxhX3Bva2UoJmNhcmQtPmh3LCB0eGJ1Zi0+cHRyX2RhdGFfYmZyLCBkYXRhLCBsZW4pOworCisJdHhidWYtPmZyYW1lX2xlbmd0aCA9IGxlbjsKKwl0eGJ1Zi0+b3BwX2ZsYWcgPSAxOwkJLyogc3RhcnQgdHJhbnNtaXNzaW9uICovCisJCisJLyogVXBkYXRlIHRyYW5zbWl0IGJ1ZmZlciBjb250cm9sIGZpZWxkcyAqLworCWNhcmQtPnUuYy50eGJ1ZiA9ICsrdHhidWY7CisJCisJaWYgKCh2b2lkKil0eGJ1ZiA+IGNhcmQtPnUuYy50eGJ1Zl9sYXN0KQorCQljYXJkLT51LmMudHhidWYgPSBjYXJkLT51LmMudHhidWZfYmFzZTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKiBGaXJtd2FyZSBFcnJvciBIYW5kbGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmlybXdhcmUgZXJyb3IgaGFuZGxlci4KKyAqCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgZmlybXdhcmUgY29tbWFuZCByZXR1cm5zIG5vbi16ZXJvCisgKglyZXR1cm4gY29kZS4KKyAqCisgKiBSZXR1cm4gemVybyBpZiBwcmV2aW91cyBjb21tYW5kIGhhcyB0byBiZSBjYW5jZWxsZWQuCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfZXJyb3IgKHNkbGFfdCAqY2FyZCwgaW50IGVyciwgQ0hETENfTUFJTEJPWF9TVFJVQ1QgKm1iKQoreworCXVuc2lnbmVkIGNtZCA9IG1iLT5jb21tYW5kOworCisJc3dpdGNoIChlcnIpIHsKKworCWNhc2UgQ01EX1RJTUVPVVQ6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjb21tYW5kIDB4JTAyWCB0aW1lZCBvdXQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgY21kKTsKKwkJYnJlYWs7CisKKwljYXNlIFM1MTRfQk9USF9QT1JUU19TQU1FX0NMS19NT0RFOgorCQlpZihjbWQgPT0gU0VUX0NIRExDX0NPTkZJR1VSQVRJT04pIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAiJXM6IENvbmZpZ3VyZSBib3RoIHBvcnRzIGZvciB0aGUgc2FtZSBjbG9jayBzb3VyY2VcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbW1hbmQgMHglMDJYIHJldHVybmVkIDB4JTAyWCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjbWQsIGVycik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKiogQm90dG9tIEhhbGYgSGFuZGxlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE5PVEU6IFRoZXJlIGlzIG5vIEFQSSwgQkggc3VwcG9ydCBmb3IgS2VybmVscyBsb3dlciB0aGFuIDIuMi5YLgorICogICAgICAgRE8gTk9UIElOU0VSVCBBTlkgQ09ERSBIRVJFLCBOT1RJQ0UgVEhFIAorICogICAgICAgUFJFUFJPQ0VTU09SIFNUQVRFTUVOVCBBQk9WRSwgVU5MRVNTIFlPVSBLTk9XIFdIQVQgWU9VIEFSRQorICogICAgICAgRE9JTkcgKi8KKworc3RhdGljIHZvaWQgY2hkbGNfd29yayhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBjaGFuLT5jYXJkOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNoYW4tPmJoX2J1ZmZfdXNlZCkgPT0gMCl7CisJCWNsZWFyX2JpdCgwLCAmY2hhbi0+dHFfd29ya2luZyk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoYXRvbWljX3JlYWQoJmNoYW4tPmJoX2J1ZmZfdXNlZCkpeworCisJCXNrYiAgPSAoKGJoX2RhdGFfdCAqKSZjaGFuLT5iaF9oZWFkW2NoYW4tPmJoX3JlYWRdKS0+c2tiOworCisJCWlmIChza2IgIT0gTlVMTCl7CisKKwkJCWlmIChjaGFuLT5jb21tb24uc2sgPT0gTlVMTCB8fCBjaGFuLT5jb21tb24uZnVuYyA9PSBOVUxMKXsKKwkJCQkrK2NhcmQtPndhbmRldi5zdGF0cy5yeF9kcm9wcGVkOworCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQkJY2hkbGNfd29ya19jbGVhbnVwKGRldik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChjaGFuLT5jb21tb24uZnVuYyhza2IsZGV2LGNoYW4tPmNvbW1vbi5zaykgIT0gMCl7CisJCQkJLyogU29jayBmdWxsIGNhbm5vdCBzZW5kLCBxdWV1ZSB1cyBmb3IgYW5vdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0cnkgKi8KKwkJCQlhdG9taWNfc2V0KCZjaGFuLT5jb21tb24ucmVjZWl2ZV9ibG9jaywxKTsKKwkJCQlyZXR1cm47CisJCQl9ZWxzZXsKKwkJCQljaGRsY193b3JrX2NsZWFudXAoZGV2KTsKKwkJCX0KKwkJfWVsc2V7CisJCQljaGRsY193b3JrX2NsZWFudXAoZGV2KTsKKwkJfQorCX0JCisJY2xlYXJfYml0KDAsICZjaGFuLT50cV93b3JraW5nKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludCBjaGRsY193b3JrX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hhbiA9IGRldi0+cHJpdjsKKworCSgoYmhfZGF0YV90ICopJmNoYW4tPmJoX2hlYWRbY2hhbi0+YmhfcmVhZF0pLT5za2IgPSBOVUxMOworCisJaWYgKGNoYW4tPmJoX3JlYWQgPT0gTUFYX0JIX0JVRkYpeworCQljaGFuLT5iaF9yZWFkPTA7CisJfWVsc2V7CisJCSsrY2hhbi0+YmhfcmVhZDsJCisJfQorCisJYXRvbWljX2RlYygmY2hhbi0+YmhfYnVmZl91c2VkKTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgYmhfZW5xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIENoZWNrIGZvciBmdWxsICovCisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hhbi0+Y2FyZDsKKworCWlmIChhdG9taWNfcmVhZCgmY2hhbi0+YmhfYnVmZl91c2VkKSA9PSAoTUFYX0JIX0JVRkYrMSkpeworCQkrK2NhcmQtPndhbmRldi5zdGF0cy5yeF9kcm9wcGVkOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gMTsgCisJfQorCisJKChiaF9kYXRhX3QgKikmY2hhbi0+YmhfaGVhZFtjaGFuLT5iaF93cml0ZV0pLT5za2IgPSBza2I7CisKKwlpZiAoY2hhbi0+Ymhfd3JpdGUgPT0gTUFYX0JIX0JVRkYpeworCQljaGFuLT5iaF93cml0ZT0wOworCX1lbHNleworCQkrK2NoYW4tPmJoX3dyaXRlOworCX0KKworCWF0b21pY19pbmMoJmNoYW4tPmJoX2J1ZmZfdXNlZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRU5EIE9GIEFQSSBCSCBTdXBwb3J0ICovCisKKworLyoqKioqKiBJbnRlcnJ1cHQgSGFuZGxlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2lzY28gSERMQyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgorICovCitzdGF0aWMgdm9pZCB3cGNfaXNyIChzZGxhX3QqIGNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUKiBmbGFncyA9IE5VTEw7CisJaW50IGk7CisJc2RsYV90ICpteV9jYXJkOworCisKKwkvKiBDaGVjayBmb3Igd2hpY2ggcG9ydCB0aGUgaW50ZXJydXB0IGhhcyBiZWVuIGdlbmVyYXRlZAorCSAqIFNpbmNlIFNlY29uZGFyeSBQb3J0IGlzIHBpZ2d5YmFja2luZyBvbiB0aGUgUHJpbWFyeQorICAgICAgICAgKiB0aGUgY2hlY2sgbXVzdCBiZSBkb25lIGhlcmUuIAorCSAqLworCisJZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisJaWYgKCFmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlKXsKKwkJLyogQ2hlY2sgZm9yIGEgc2Vjb25kIHBvcnQgKHBpZ2d5YmFja2luZykgKi8KKwkJaWYgKChteV9jYXJkID0gY2FyZC0+bmV4dCkpeworCQkJZmxhZ3MgPSBteV9jYXJkLT51LmMuZmxhZ3M7CisJCQlpZiAoZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfdHlwZSl7CisJCQkJY2FyZCA9IG15X2NhcmQ7CisJCQkJY2FyZC0+aXNyKGNhcmQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKworCWZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCWNhcmQtPmluX2lzciA9IDE7CisJZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwkKKwkvKiBJZiB3ZSBnZXQgYW4gaW50ZXJydXB0IHdpdGggbm8gbmV0d29yayBkZXZpY2UsIHN0b3AgdGhlIGludGVycnVwdHMKKwkgKiBhbmQgaXNzdWUgYW4gZXJyb3IgKi8KKwlpZiAoIWNhcmQtPnR0eV9vcHQgJiYgIWRldiAmJiAKKwkgICAgZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfdHlwZSAhPSAKKwkgICAgCUNPTU1BTkRfQ09NUExFVEVfQVBQX0lOVF9QRU5EKXsKKworCQlnb3RvIGlzcl9kb25lOworCX0KKwkKKwkvKiBpZiBjcml0aWNhbCBkdWUgdG8gcGVyaXBoZXJhbCBvcGVyYXRpb25zCisJICogaWUuIHVwZGF0ZSgpIG9yIGdldHN0YXRzKCkgdGhlbiByZXNldCB0aGUgaW50ZXJydXB0IGFuZAorCSAqIHdhaXQgZm9yIHRoZSBib2FyZCB0byByZXRyaWdnZXIuCisJICovCisJaWYodGVzdF9iaXQoUEVSSV9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSVNSIENSSVQgVE8gUEVSSVxuIik7CisJCWdvdG8gaXNyX2RvbmU7CisJfQorCisJLyogT24gYSA1MDggQ2FyZCwgaWYgY3JpdGljYWwgZHVlIHRvIGlmX3NlbmQgCisgICAgICAgICAqIE1ham9yIEVycm9yICEhISAqLworCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KSB7CisJCWlmKHRlc3RfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ3JpdGljYWwgd2hpbGUgaW4gSVNSOiAlbHhcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJCWNhcmQtPmluX2lzciA9IDA7CisJCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlID0gMDsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXN3aXRjaChmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlKSB7CisKKwljYXNlIFJYX0FQUF9JTlRfUEVORDoJLyogMHgwMTogcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KKwkJcnhfaW50cihjYXJkKTsKKwkJYnJlYWs7CisKKwljYXNlIFRYX0FQUF9JTlRfUEVORDoJLyogMHgwMjogdHJhbnNtaXQgaW50ZXJydXB0ICovCisJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gJj0KKwkJCSB+QVBQX0lOVF9PTl9UWF9GUkFNRTsKKworCQlpZiAoY2FyZC0+dHR5X29wdCl7CisJCQl3YW5waXBlX3R0eV90cmlnZ2VyX3BvbGwoY2FyZCk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChkZXYgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKXsKKwkJCWlmIChjYXJkLT51LmMudXNlZGJ5ID09IEFQSSl7CisJCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCQl3YWtldXBfc2tfYmgoZGV2KTsKKwkJCX1lbHNleworCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgQ09NTUFORF9DT01QTEVURV9BUFBfSU5UX1BFTkQ6LyogMHgwNDogY21kIGNwbHQgKi8KKwkJKysgSW50cl90ZXN0X2NvdW50ZXI7CisJCWJyZWFrOworCisJY2FzZSBDSERMQ19FWENFUF9DT05EX0FQUF9JTlRfUEVORDoJLyogMHgyMCAqLworCQlwcm9jZXNzX2NoZGxjX2V4Y2VwdGlvbihjYXJkKTsKKwkJYnJlYWs7CisKKwljYXNlIEdMT0JBTF9FWENFUF9DT05EX0FQUF9JTlRfUEVORDoKKwkJcHJvY2Vzc19nbG9iYWxfZXhjZXB0aW9uKGNhcmQpOworCQlicmVhazsKKworCWNhc2UgVElNRVJfQVBQX0lOVF9QRU5EOgorCQl0aW1lcl9pbnRyKGNhcmQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzcHVyaW91cyBpbnRlcnJ1cHQgMHglMDJYIVxuIiwgCisJCQljYXJkLT5kZXZuYW1lLAorCQkJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfdHlwZSk7CisJCXByaW50ayhLRVJOX0lORk8gIkNvZGUgbmFtZTogIik7CisJCWZvcihpID0gMDsgaSA8IDQ7IGkgKyspCisJCQlwcmludGsoS0VSTl9JTkZPICIlYyIsCisJCQkJZmxhZ3MtPmdsb2JhbF9pbmZvX3N0cnVjdC5jb2RlbmFtZVtpXSk7IAorCQlwcmludGsoS0VSTl9JTkZPICJcbkNvZGUgdmVyc2lvbjogIik7CisJIAlmb3IoaSA9IDA7IGkgPCA0OyBpICsrKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJWMiLCAKKwkJCQlmbGFncy0+Z2xvYmFsX2luZm9fc3RydWN0LmNvZGV2ZXJzaW9uW2ldKTsgCisJCXByaW50ayhLRVJOX0lORk8gIlxuIik7CQorCQlicmVhazsKKwl9CisKK2lzcl9kb25lOgorCisJY2FyZC0+aW5faXNyID0gMDsKKwlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlID0gMDsKKwlyZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVjZWl2ZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgcnhfaW50ciAoc2RsYV90KiBjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKmNoZGxjX3ByaXZfYXJlYTsKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwlDSERMQ19EQVRBX1JYX1NUQVRVU19FTF9TVFJVQ1QgKnJ4YnVmID0gY2FyZC0+dS5jLnJ4bWI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsZW47CisJdW5zaWduZWQgYWRkciA9IHJ4YnVmLT5wdHJfZGF0YV9iZnI7CisJdm9pZCAqYnVmOworCWludCBpLHVkcF90eXBlOworCisJaWYgKHJ4YnVmLT5vcHBfZmxhZyAhPSAweDAxKSB7CisJCXByaW50ayhLRVJOX0lORk8gCisJCQkiJXM6IGNvcnJ1cHRlZCBSeCBidWZmZXIgQCAweCVYLCBmbGFnID0gMHglMDJYIVxuIiwgCisJCQljYXJkLT5kZXZuYW1lLCAodW5zaWduZWQpcnhidWYsIHJ4YnVmLT5vcHBfZmxhZyk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiQ29kZSBuYW1lOiAiKTsKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpICsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy0+Z2xvYmFsX2luZm9fc3RydWN0LmNvZGVuYW1lW2ldKTsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJcbkNvZGUgdmVyc2lvbjogIik7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSArKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MtPmdsb2JhbF9pbmZvX3N0cnVjdC5jb2RldmVyc2lvbltpXSk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKworCisJCS8qIEJ1ZyBGaXg6IE1hciA2IDIwMDAKKyAgICAgICAgICAgICAgICAgKiBJZiB3ZSBnZXQgYSBjb3JydXB0ZWQgbWFpbGJveCwgaXQgbWVhc24gdGhhdCBkcml2ZXIgCisgICAgICAgICAgICAgICAgICogaXMgb3V0IG9mIHN5bmMgd2l0aCB0aGUgZmlybXdhcmUuIFRoZXJlIGlzIG5vIHJlY292ZXJ5LgorICAgICAgICAgICAgICAgICAqIElmIHdlIGRvbid0IHR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzIGZvciB0aGlzIGNhcmQKKyAgICAgICAgICAgICAgICAgKiB0aGUgbWFjaGluZSB3aWxsIGNyYXNoLiAKKyAgICAgICAgICAgICAgICAgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENyaXRpY2FsIHJvdXRlciBmYWlsdXJlIC4uLiEhIVxuIiwgY2FyZC0+ZGV2bmFtZSk7CisJCXByaW50ayhLRVJOX0lORk8gIlBsZWFzZSBjb250YWN0IFNhbmdvbWEgVGVjaG5vbG9naWVzICFcbiIpOworCQljaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsMCk7CQorCQlyZXR1cm47CisJfQorCisJbGVuICA9IHJ4YnVmLT5mcmFtZV9sZW5ndGg7CisKKwlpZiAoY2FyZC0+dHR5X29wdCl7CisKKwkJaWYgKHJ4YnVmLT5lcnJvcl9mbGFnKXsJCisJCQlnb3RvIHJ4X2V4aXQ7CisJCX0KKworCQlpZiAobGVuIDw9IENSQ19MRU5HVEgpeworCQkJZ290byByeF9leGl0OworCQl9CisJCQorCQlpZiAoIWNhcmQtPnUuYy5hc3luY19tb2RlKXsKKwkJCWxlbiAtPSBDUkNfTEVOR1RIOworCQl9CisKKwkJd2FucGlwZV90dHlfcmVjZWl2ZShjYXJkLGFkZHIsbGVuKTsKKwkJZ290byByeF9leGl0OworCX0KKworCWRldiA9IGNhcmQtPndhbmRldi5kZXY7CisKKwlpZiAoIWRldil7CisJCWdvdG8gcnhfZXhpdDsKKwl9CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJZ290byByeF9leGl0OworCisJY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCisJCisJLyogQWxsb2NhdGUgc29ja2V0IGJ1ZmZlciAqLworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKworCWlmIChza2IgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogbm8gc29ja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCWdvdG8gcnhfZXhpdDsKKwl9CisKKwkvKiBDb3B5IGRhdGEgdG8gdGhlIHNvY2tldCBidWZmZXIgKi8KKwlpZigoYWRkciArIGxlbikgPiBjYXJkLT51LmMucnhfdG9wICsgMSkgeworCQl1bnNpZ25lZCB0bXAgPSBjYXJkLT51LmMucnhfdG9wIC0gYWRkciArIDE7CisJCWJ1ZiA9IHNrYl9wdXQoc2tiLCB0bXApOworCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBhZGRyLCBidWYsIHRtcCk7CisJCWFkZHIgPSBjYXJkLT51LmMucnhfYmFzZTsKKwkJbGVuIC09IHRtcDsKKwl9CisJCQorCWJ1ZiA9IHNrYl9wdXQoc2tiLCBsZW4pOworCXNkbGFfcGVlaygmY2FyZC0+aHcsIGFkZHIsIGJ1ZiwgbGVuKTsKKworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisKKwljYXJkLT53YW5kZXYuc3RhdHMucnhfcGFja2V0cyArKzsKKwljYXJkLT53YW5kZXYuc3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJdWRwX3R5cGUgPSB1ZHBfcGt0X3R5cGUoIHNrYiwgY2FyZCApOworCisJaWYodWRwX3R5cGUgPT0gVURQX0NQSVBFX1RZUEUpIHsKKwkJaWYoc3RvcmVfdWRwX21nbXRfcGt0KFVEUF9QS1RfRlJNX05FVFdPUkssCisgICAJCQkJICAgICAgY2FyZCwgc2tiLCBkZXYsIGNoZGxjX3ByaXZfYXJlYSkpIHsKKyAgICAgCQkgICAgICAgIGZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuCisJCQkJCQlpbnRlcnJ1cHRfcGVybWlzc2lvbiB8PSAKKwkJCQkJCQlBUFBfSU5UX09OX1RJTUVSOyAKKwkJfQorCX0gZWxzZSBpZihjYXJkLT51LmMudXNlZGJ5ID09IEFQSSkgeworCisJCWFwaV9yeF9oZHJfdCogYXBpX3J4X2hkcjsKKyAgICAgICAJCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKGFwaV9yeF9oZHJfdCkpOworICAgICAgICAgICAgICAgIGFwaV9yeF9oZHIgPSAoYXBpX3J4X2hkcl90Kikmc2tiLT5kYXRhWzB4MDBdOworCQlhcGlfcnhfaGRyLT5lcnJvcl9mbGFnID0gcnhidWYtPmVycm9yX2ZsYWc7CisgICAgIAkJYXBpX3J4X2hkci0+dGltZV9zdGFtcCA9IHJ4YnVmLT50aW1lX3N0YW1wOworCisgICAgICAgICAgICAgICAgc2tiLT5wcm90b2NvbCA9IGh0b25zKFBWQ19QUk9UKTsKKyAgICAgCQlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCQlza2ItPmRldiAgICAgID0gZGV2OworICAgICAgICAgICAgICAgCXNrYi0+cGt0X3R5cGUgPSBXQU5fUEFDS0VUX0RBVEE7CisKKwkJYmhfZW5xdWV1ZShkZXYsIHNrYik7CisKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KDAsJmNoZGxjX3ByaXZfYXJlYS0+dHFfd29ya2luZykpCisJCQl3YW5waXBlX3F1ZXVlX3dvcmsoJmNoZGxjX3ByaXZfYXJlYS0+Y29tbW9uLndhbnBpcGVfd29yayk7CisJfWVsc2V7CisJCS8qIEZJWE1FOiB3ZSBzaG91bGQgY2hlY2sgdG8gc2VlIGlmIHRoZSByZWNlaXZlZCBwYWNrZXQgaXMgYSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGljYXN0IHBhY2tldCBzbyB0aGF0IHdlIGNhbiBpbmNyZW1lbnQgdGhlIG11bHRpY2FzdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlzdGljCisgICAgICAgICAgICAgICAgICAgICAgICAgICsrIGNoZGxjX3ByaXZfYXJlYS0+aWZfc3RhdHMubXVsdGljYXN0OworCQkqLworICAgICAgICAgICAgICAgCS8qIFBhc3MgaXQgdXAgdGhlIHByb3RvY29sIHN0YWNrICovCisJCisgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBkZXY7CisgICAgICAgICAgICAgICAgc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKyAgICAgICAgICAgICAgICBuZXRpZl9yeChza2IpOworICAgICAgICAgICAgICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJfQorCityeF9leGl0OgorCS8qIFJlbGVhc2UgYnVmZmVyIGVsZW1lbnQgYW5kIGNhbGN1bGF0ZSBhIHBvaW50ZXIgdG8gdGhlIG5leHQgb25lICovCisJcnhidWYtPm9wcF9mbGFnID0gMHgwMDsKKwljYXJkLT51LmMucnhtYiA9ICsrIHJ4YnVmOworCWlmKCh2b2lkKilyeGJ1ZiA+IGNhcmQtPnUuYy5yeGJ1Zl9sYXN0KXsKKwkJY2FyZC0+dS5jLnJ4bWIgPSBjYXJkLT51LmMucnhidWZfYmFzZTsKKwl9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGltZXIgaW50ZXJydXB0IGhhbmRsZXIuCisgKiBUaGUgdGltZXIgaW50ZXJydXB0IGlzIHVzZWQgZm9yIHR3byBwdXJwb3NlczoKKyAqICAgIDEpIFByb2Nlc3NpbmcgdWRwIGNhbGxzIGZyb20gJ2NwaXBlbW9uJy4KKyAqICAgIDIpIFJlYWRpbmcgYm9hcmQtbGV2ZWwgc3RhdGlzdGljcyBmb3IgdXBkYXRpbmcgdGhlIHByb2MgZmlsZSBzeXN0ZW0uCisgKi8KK3ZvaWQgdGltZXJfaW50cihzZGxhX3QgKmNhcmQpCit7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CisgICAgICAgIGNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWEgPSBOVUxMOworICAgICAgICBTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUKiBmbGFncyA9IE5VTEw7CisKKyAgICAgICAgaWYgKChkZXYgPSBjYXJkLT53YW5kZXYuZGV2KT09TlVMTCl7CisJCWZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworICAgICAgICAgICAgICAgIGZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gJj0KKyAgICAgICAgICAgICAgICAgICAgICAgIH5BUFBfSU5UX09OX1RJTUVSOworCQlyZXR1cm47CisJfQorCQorICAgICAgICBjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisKKwlpZiAoY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9DT05GSUcpIHsKKwkJaWYgKCFjb25maWdfY2hkbGMoY2FyZCkpeworCQkJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX0NPTkZJRzsKKwkJfQorCX0KKworCS8qIHByb2Nlc3MgYSB1ZHAgY2FsbCBpZiBwZW5kaW5nICovCisgICAgICAgCWlmKGNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVURQKSB7CisgICAgICAgICAgICAgICAJcHJvY2Vzc191ZHBfbWdtdF9wa3QoY2FyZCwgZGV2LAorICAgICAgICAgICAgICAgICAgICAgICBjaGRsY19wcml2X2FyZWEpOworCQljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfVURQOworICAgICAgICB9CisKKwkvKiByZWFkIHRoZSBjb21tdW5pY2F0aW9ucyBzdGF0aXN0aWNzIGlmIHJlcXVpcmVkICovCisJaWYoY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VUERBVEUpIHsKKwkJdXBkYXRlX2NvbW1zX3N0YXRzKGNhcmQsIGNoZGxjX3ByaXZfYXJlYSk7CisgICAgICAgICAgICAgICAgaWYoISgtLSBjaGRsY19wcml2X2FyZWEtPnVwZGF0ZV9jb21tc19zdGF0cykpIHsKKwkJCWNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJj0gCisJCQkJflRNUl9JTlRfRU5BQkxFRF9VUERBVEU7CisJCX0KKyAgICAgICAgfQorCisJLyogb25seSBkaXNhYmxlIHRoZSB0aW1lciBpbnRlcnJ1cHQgaWYgdGhlcmUgYXJlIG5vIHVkcCBvciBzdGF0aXN0aWMgKi8KKwkvKiB1cGRhdGVzIHBlbmRpbmcgKi8KKyAgICAgICAgaWYoIWNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKyAgICAgICAgICAgICAgICBmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uICY9CisgICAgICAgICAgICAgICAgICAgICAgICB+QVBQX0lOVF9PTl9USU1FUjsKKyAgICAgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBNaXNjZWxsYW5lb3VzIEZ1bmN0aW9ucworCS0gc2V0X2NoZGxjX2NvbmZpZygpIHVzZWQgdG8gc2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGUgYm9hcmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc2V0X2NoZGxjX2NvbmZpZyhzZGxhX3QqIGNhcmQpCit7CisJQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgY2ZnOworCisJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCkpOworCisJaWYoY2FyZC0+d2FuZGV2LmNsb2NraW5nKXsKKwkJY2ZnLmJhdWRfcmF0ZSA9IGNhcmQtPndhbmRldi5icHM7CisJfQorCQkKKwljZmcubGluZV9jb25maWdfb3B0aW9ucyA9IChjYXJkLT53YW5kZXYuaW50ZXJmYWNlID09IFdBTk9QVF9SUzIzMikgPworCQlJTlRFUkZBQ0VfTEVWRUxfUlMyMzIgOiBJTlRFUkZBQ0VfTEVWRUxfVjM1OworCisJY2ZnLm1vZGVtX2NvbmZpZ19vcHRpb25zCT0gMDsKKwljZmcubW9kZW1fc3RhdHVzX3RpbWVyCQk9IDEwMDsKKworCWNmZy5DSERMQ19wcm90b2NvbF9vcHRpb25zCT0gY2FyZC0+dS5jLnByb3RvY29sX29wdGlvbnM7CisKKwlpZiAoY2FyZC0+dHR5X29wdCl7CisJCWNmZy5DSERMQ19BUElfb3B0aW9ucwk9IERJU0NBUkRfUlhfRVJST1JfRlJBTUVTOworCX0KKwkKKwljZmcucGVyY2VudF9kYXRhX2J1ZmZlcl9mb3JfVHggID0gKGNhcmQtPnUuYy5yZWNlaXZlX29ubHkpID8gMCA6IDUwOworCWNmZy5DSERMQ19zdGF0aXN0aWNzX29wdGlvbnMJPSAoQ0hETENfVFhfREFUQV9CWVRFX0NPVU5UX1NUQVQgfAorCQlDSERMQ19SWF9EQVRBX0JZVEVfQ09VTlRfU1RBVCk7CisJCisJaWYgKGNhcmQtPnR0eV9vcHQpeworCQljYXJkLT53YW5kZXYubXR1ID0gVFRZX0NIRExDX01BWF9NVFU7CisJfQorCWNmZy5tYXhfQ0hETENfZGF0YV9maWVsZF9sZW5ndGgJPSBjYXJkLT53YW5kZXYubXR1OworCWNmZy50cmFuc21pdF9rZWVwYWxpdmVfdGltZXIJPSBjYXJkLT51LmMua3BhbHZfdHg7CisJY2ZnLnJlY2VpdmVfa2VlcGFsaXZlX3RpbWVyCT0gY2FyZC0+dS5jLmtwYWx2X3J4OworCWNmZy5rZWVwYWxpdmVfZXJyb3JfdG9sZXJhbmNlCT0gY2FyZC0+dS5jLmtwYWx2X2VycjsKKwljZmcuU0xBUlBfcmVxdWVzdF90aW1lcgkJPSBjYXJkLT51LmMuc2xhcnBfdGltZXI7CisKKwlpZiAoY2ZnLlNMQVJQX3JlcXVlc3RfdGltZXIpIHsKKwkJY2ZnLklQX2FkZHJlc3MJCT0gMDsKKwkJY2ZnLklQX25ldG1hc2sJCT0gMDsKKwkJCisJfWVsc2UgaWYgKGNhcmQtPndhbmRldi5kZXYpeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwkJY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKmNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwkJCisgICAgICAgICAgICAgICAgc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisKKwkJaWYoaW5fZGV2ICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBpbl9pZmFkZHIgKmlmYSA9IGluX2Rldi0+aWZhX2xpc3Q7CisKKwkJCWlmIChpZmEgIT0gTlVMTCApIHsKKwkJCQljZmcuSVBfYWRkcmVzcwk9IG50b2hsKGlmYS0+aWZhX2xvY2FsKTsKKwkJCQljZmcuSVBfbmV0bWFzawk9IG50b2hsKGlmYS0+aWZhX21hc2spOyAKKwkJCQljaGRsY19wcml2X2FyZWEtPklQX2FkZHJlc3MgPSBudG9obChpZmEtPmlmYV9sb2NhbCk7CisJCQkJY2hkbGNfcHJpdl9hcmVhLT5JUF9uZXRtYXNrID0gbnRvaGwoaWZhLT5pZmFfbWFzayk7IAorCQkJfQorCQl9CisKKwkJLyogRklYTUU6IFdlIG11c3QgcmUtdGhpbmsgdGhpcyBtZXNzYWdlIGluIG5leHQgcmVsZWFzZQorCQlpZigoY2ZnLklQX2FkZHJlc3MgJiAweDAwMDAwMEZGKSA+IDIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlxuIik7CisJICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiAgV0FSTklORzolcyBjb25maWd1cmVkIHdpdGggYW5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIGludmFsaWQgbG9jYWwgSVAgYWRkcmVzcy5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiICBTbGFycCBwcmFnbWF0aWNzIHdpbGwgZmFpbC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiICBJUCBhZGRyZXNzIHNob3VsZCBiZSBvZiB0aGVcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBmb3JtYXQgQS5CLkMuMSBvciBBLkIuQy4yLlxuIik7CisJCX0KKwkJKi8JCQorCX0KKwkKKwlyZXR1cm4gY2hkbGNfY29uZmlndXJlKGNhcmQsICZjZmcpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNldF9hc3lfY29uZmlnKCkgdXNlZCB0byBzZXQgYXN5bmNocm9ub3VzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGUgYm9hcmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgc2V0X2FzeV9jb25maWcoc2RsYV90KiBjYXJkKQoreworCisgICAgICAgIEFTWV9DT05GSUdVUkFUSU9OX1NUUlVDVCBjZmc7CisgCUNIRExDX01BSUxCT1hfU1RSVUNUICptYWlsYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihBU1lfQ09ORklHVVJBVElPTl9TVFJVQ1QpKTsKKworCWlmKGNhcmQtPndhbmRldi5jbG9ja2luZykKKwkJY2ZnLmJhdWRfcmF0ZSA9IGNhcmQtPndhbmRldi5icHM7CisKKwljZmcubGluZV9jb25maWdfb3B0aW9ucyA9IChjYXJkLT53YW5kZXYuaW50ZXJmYWNlID09IFdBTk9QVF9SUzIzMikgPworCQlJTlRFUkZBQ0VfTEVWRUxfUlMyMzIgOiBJTlRFUkZBQ0VfTEVWRUxfVjM1OworCisJY2ZnLm1vZGVtX2NvbmZpZ19vcHRpb25zCT0gMDsKKwljZmcuYXN5X0FQSV9vcHRpb25zIAkJPSBjYXJkLT51LmMuYXBpX29wdGlvbnM7CisJY2ZnLmFzeV9wcm90b2NvbF9vcHRpb25zCT0gY2FyZC0+dS5jLnByb3RvY29sX29wdGlvbnM7CisJY2ZnLlR4X2JpdHNfcGVyX2NoYXIJCT0gY2FyZC0+dS5jLnR4X2JpdHNfcGVyX2NoYXI7CisJY2ZnLlJ4X2JpdHNfcGVyX2NoYXIJCT0gY2FyZC0+dS5jLnJ4X2JpdHNfcGVyX2NoYXI7CisJY2ZnLnN0b3BfYml0cwkJCT0gY2FyZC0+dS5jLnN0b3BfYml0czsKKwljZmcucGFyaXR5CQkJPSBjYXJkLT51LmMucGFyaXR5OworCWNmZy5icmVha190aW1lcgkJCT0gY2FyZC0+dS5jLmJyZWFrX3RpbWVyOworCWNmZy5hc3lfUnhfaW50ZXJfY2hhcl90aW1lcgk9IGNhcmQtPnUuYy5pbnRlcl9jaGFyX3RpbWVyOyAKKwljZmcuYXN5X1J4X2NvbXBsZXRlX2xlbmd0aAk9IGNhcmQtPnUuYy5yeF9jb21wbGV0ZV9sZW5ndGg7IAorCWNmZy5YT05fY2hhcgkJCT0gY2FyZC0+dS5jLnhvbl9jaGFyOworCWNmZy5YT0ZGX2NoYXIJCQk9IGNhcmQtPnUuYy54b2ZmX2NoYXI7CisJY2ZnLmFzeV9zdGF0aXN0aWNzX29wdGlvbnMJPSAoQ0hETENfVFhfREFUQV9CWVRFX0NPVU5UX1NUQVQgfAorCQlDSERMQ19SWF9EQVRBX0JZVEVfQ09VTlRfU1RBVCk7CisKKwltYWlsYm94LT5idWZmZXJfbGVuZ3RoID0gc2l6ZW9mKEFTWV9DT05GSUdVUkFUSU9OX1NUUlVDVCk7CisJbWVtY3B5KG1haWxib3gtPmRhdGEsICZjZmcsIG1haWxib3gtPmJ1ZmZlcl9sZW5ndGgpOworCW1haWxib3gtPmNvbW1hbmQgPSBTRVRfQVNZX0NPTkZJR1VSQVRJT047CisJZXJyID0gc2RsYV9leGVjKG1haWxib3gpID8gbWFpbGJveC0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyICE9IENPTU1BTkRfT0spIAorCQljaGRsY19lcnJvciAoY2FyZCwgZXJyLCBtYWlsYm94KTsKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVuYWJsZSBhc3luY2hyb25vdXMgY29tbXVuaWNhdGlvbnMuCisgKi8KKworc3RhdGljIGludCBhc3lfY29tbV9lbmFibGUgKHNkbGFfdCogY2FyZCkKK3sKKworCWludCBlcnI7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKworCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYi0+Y29tbWFuZCA9IEVOQUJMRV9BU1lfQ09NTVVOSUNBVElPTlM7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCWlmIChlcnIgIT0gQ09NTUFORF9PSyAmJiBjYXJkLT53YW5kZXYuZGV2KQorCQljaGRsY19lcnJvcihjYXJkLCBlcnIsIG1iKTsKKwkKKwlpZiAoIWVycikKKwkJY2FyZC0+dS5jLmNvbW1fZW5hYmxlZCA9IDE7CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByb2Nlc3MgZ2xvYmFsIGV4Y2VwdGlvbiBjb25kaXRpb24KKyAqLworc3RhdGljIGludCBwcm9jZXNzX2dsb2JhbF9leGNlcHRpb24oc2RsYV90ICpjYXJkKQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyOworCisJbWJveC0+YnVmZmVyX2xlbmd0aCA9IDA7CisJbWJveC0+Y29tbWFuZCA9IFJFQURfR0xPQkFMX0VYQ0VQVElPTl9DT05ESVRJT047CisJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKworCWlmKGVyciAhPSBDTURfVElNRU9VVCApeworCQorCQlzd2l0Y2gobWJveC0+cmV0dXJuX2NvZGUpIHsKKyAgICAgICAgIAorCSAgICAgIAljYXNlIEVYQ0VQX01PREVNX1NUQVRVU19DSEFOR0U6CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNb2RlbSBzdGF0dXMgY2hhbmdlXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCisJCQlzd2l0Y2gobWJveC0+ZGF0YVswXSAmIChEQ0RfSElHSCB8IENUU19ISUdIKSkgeworCQkJCWNhc2UgKERDRF9ISUdIKToKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERDRCBoaWdoLCBDVFMgbG93XG4iLGNhcmQtPmRldm5hbWUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIChDVFNfSElHSCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERDRCBsb3csIENUUyBoaWdoXG4iLGNhcmQtPmRldm5hbWUpOyAKKwkJCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKChEQ0RfSElHSCB8IENUU19ISUdIKSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERDRCBoaWdoLCBDVFMgaGlnaFxuIixjYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQlkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBEQ0QgbG93LCBDVFMgbG93XG4iLGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEVYQ0VQX1RSQ19ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5lIHRyYWNlIGRpc2FibGVkXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJY2FzZSBFWENFUF9JUlFfVElNRU9VVDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJUlEgdGltZW91dCBvY2N1cnJlZFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsgCisJCQlicmVhazsKKworCQljYXNlIDB4MTc6CisJCQlpZiAoY2FyZC0+dHR5X29wdCl7CisJCQkJaWYgKGNhcmQtPnR0eSAmJiBjYXJkLT50dHlfb3Blbil7IAorCQkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCQkJIiVzOiBNb2RlbSBIYW5ndXAgRXhjZXB0aW9uOiBIYW5naW5nIFVwIVxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCQl0dHlfaGFuZ3VwKGNhcmQtPnR0eSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBJZiBUVFkgaXMgbm90IHVzZWQganVzdCBkcm9wIHRocm91Z2h0ICovCisJCQkKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdsb2JhbCBleGNlcHRpb24gJXhcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgbWJveC0+cmV0dXJuX2NvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByb2Nlc3MgY2hkbGMgZXhjZXB0aW9uIGNvbmRpdGlvbgorICovCitzdGF0aWMgaW50IHByb2Nlc3NfY2hkbGNfZXhjZXB0aW9uKHNkbGFfdCAqY2FyZCkKK3sKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJbWItPmNvbW1hbmQgPSBSRUFEX0NIRExDX0VYQ0VQVElPTl9DT05ESVRJT047CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCWlmKGVyciAhPSBDTURfVElNRU9VVCkgeworCQorCQlzd2l0Y2ggKGVycikgeworCisJCWNhc2UgRVhDRVBfTElOS19BQ1RJVkU6CisJCQlwb3J0X3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVEVEKTsKKwkJCXRyaWdnZXJfY2hkbGNfcG9sbChjYXJkLT53YW5kZXYuZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVhDRVBfTElOS19JTkFDVElWRV9NT0RFTToKKwkJCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCQkJdW5jb25maWd1cmVfaXAoY2FyZCk7CisJCQl0cmlnZ2VyX2NoZGxjX3BvbGwoY2FyZC0+d2FuZGV2LmRldik7CisJCQlicmVhazsKKworCQljYXNlIEVYQ0VQX0xJTktfSU5BQ1RJVkVfS1BBTFY6CisJCQlwb3J0X3NldF9zdGF0ZShjYXJkLCBXQU5fRElTQ09OTkVDVEVEKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBLZWVwYWxpdmUgdGltZXIgZXhwaXJlZC5cbiIsCisJCQkJIAkJY2FyZC0+ZGV2bmFtZSk7CisJCQl1bmNvbmZpZ3VyZV9pcChjYXJkKTsKKwkJCXRyaWdnZXJfY2hkbGNfcG9sbChjYXJkLT53YW5kZXYuZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVhDRVBfSVBfQUREUkVTU19ESVNDT1ZFUkVEOgorCQkJaWYgKGNvbmZpZ3VyZV9pcChjYXJkKSkgCisJCQkJcmV0dXJuIC0xOworCQkJYnJlYWs7CisKKwkJY2FzZSBFWENFUF9MT09QQkFDS19DT05ESVRJT046CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTG9vcGJhY2sgQ29uZGl0aW9uIERldGVjdGVkLlxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBOT19DSERMQ19FWENFUF9DT05EX1RPX1JFUE9SVDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBObyBleGNlcHRpb25zIHJlcG9ydGVkLlxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbmZpZ3VyZSBJUCBmcm9tIFNMQVJQIG5lZ290aWF0aW9uCisgKiBUaGlzIGFkZHMgZHluYW1pYyByb3V0ZXMgd2hlbiBTTEFSUCBoYXMgcHJvdmlkZWQgdmFsaWQgYWRkcmVzc2VzCisgKi8KKworc3RhdGljIGludCBjb25maWd1cmVfaXAgKHNkbGFfdCogY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKyAgICAgICAgY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKmNoZGxjX3ByaXZfYXJlYTsKKyAgICAgICAgY2hhciBlcnI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIDA7CisKKwljaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJCisJCisgICAgICAgIC8qIHNldCB0byBkaXNjb3ZlciAqLworICAgICAgICBpZihjYXJkLT51LmMuc2xhcnBfdGltZXIgIT0gMHgwMCkgeworCQlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCQlDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCAqY2ZnOworCisgICAgIAkJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCQltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ORklHVVJBVElPTjsKKwkJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCQorCQlpZihlcnIgIT0gQ09NTUFORF9PSykgeworCQkJY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJY2ZnID0gKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWItPmRhdGE7CisgICAgICAgICAgICAgICAgY2hkbGNfcHJpdl9hcmVhLT5JUF9hZGRyZXNzID0gY2ZnLT5JUF9hZGRyZXNzOworICAgICAgICAgICAgICAgIGNoZGxjX3ByaXZfYXJlYS0+SVBfbmV0bWFzayA9IGNmZy0+SVBfbmV0bWFzazsKKworCQkvKiBTZXQgZmxhZyB0byBhZGQgcm91dGUgKi8KKwkJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZV9zdGF0dXMgPSBBRERfUk9VVEU7CisKKwkJLyogVGhlIGlkZWEgaGVyZSBpcyB0byBhZGQgdGhlIHJvdXRlIGluIHRoZSBwb2xsIHJvdXRpbmUuCisJICAgCVRoaXMgd2F5LCB3ZSBhcmVuJ3QgaW4gaW50ZXJydXB0IGNvbnRleHQgd2hlbiBhZGRpbmcgcm91dGVzICovCisJCXRyaWdnZXJfY2hkbGNfcG9sbChkZXYpOworICAgICAgICB9CisKKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVuLUNvbmZpZ3VyZSBJUCBuZWdvdGlhdGVkIGJ5IFNMQVJQCisgKiBUaGlzIHJlbW92ZXMgZHluYW1pYyByb3V0ZXMgd2hlbiB0aGUgbGluayBiZWNvbWVzIGluYWN0aXZlLgorICovCisKK3N0YXRpYyBpbnQgdW5jb25maWd1cmVfaXAgKHNkbGFfdCogY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwljaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhOworCisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCisJY2hkbGNfcHJpdl9hcmVhPSBkZXYtPnByaXY7CisJCisJaWYgKGNoZGxjX3ByaXZfYXJlYS0+cm91dGVfc3RhdHVzID09IFJPVVRFX0FEREVEKSB7CisKKwkJLyogTm90ZTogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSAKKyAgICAgICAgICAgICAgICAgKiBwb3J0IHN0YXRlIGhhcyBiZWVuIERJU0NPTk5FQ1RFRC4gIFRoaXMgc3RhdGUKKyAgICAgICAgICAgICAgICAgKiBjaGFuZ2Ugd2lsbCB0cmlnZ2VyIGEgcG9sbF9kaXNjb25uZWN0ZWQgCisgICAgICAgICAgICAgICAgICogZnVuY3Rpb24sIHRoYXQgd2lsbCBjaGVjayBmb3IgdGhpcyBjb25kaXRpb24uIAorCQkgKi8KKwkJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZV9zdGF0dXMgPSBSRU1PVkVfUk9VVEU7CisKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUm91dGluZSB0byBhZGQvcmVtb3ZlIHJvdXRlcyAKKyAqIENhbGxlZCBsaWtlIGEgcG9sbGluZyByb3V0aW5lIHdoZW4gUm91dGVzIGFyZSBmbGFnZ2VkIHRvIGJlIGFkZGVkL3JlbW92ZWQuCisgKi8KKworc3RhdGljIHZvaWQgcHJvY2Vzc19yb3V0ZSAoc2RsYV90ICpjYXJkKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKyAgICAgICAgdW5zaWduZWQgY2hhciBwb3J0X251bTsKKyAgICAgICAgY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKmNoZGxjX3ByaXZfYXJlYSA9IE5VTEw7CisJdTMyIGxvY2FsX0lQX2FkZHIgPSAwOworCXUzMiByZW1vdGVfSVBfYWRkciA9IDA7CisJdTMyIElQX25ldG1hc2ssIElQX2FkZHI7CisgICAgICAgIGludCBlcnIgPSAwOworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwltbV9zZWdtZW50X3QgZnM7CisJc3RydWN0IGlmcmVxIGlmX2luZm87CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqaWZfZGF0YTEsICppZl9kYXRhMjsKKwkKKyAgICAgICAgY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworICAgICAgICBwb3J0X251bSA9IGNhcmQtPnUuYy5jb21tX3BvcnQ7CisKKwkvKiBCdWcgRml4IE1hciAxNiAyMDAwCisJICogQU5EIHRoZSBJUCBhZGRyZXNzIHRvIHRoZSBNYXNrIGJlZm9yZSBjaGVja2luZworICAgICAgICAgKiB0aGUgbGFzdCB0d28gYml0cy4gKi8KKworCWlmKChjaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cyA9PSBBRERfUk9VVEUpICYmCisJCSgoY2hkbGNfcHJpdl9hcmVhLT5JUF9hZGRyZXNzICYgfmNoZGxjX3ByaXZfYXJlYS0+SVBfbmV0bWFzaykgPiAyKSkgeworCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEeW5hbWljIHJvdXRlIGZhaWx1cmUuXG4iLGNhcmQtPmRldm5hbWUpOworCisgICAgICAgICAgICAgICAgaWYoY2FyZC0+dS5jLnNsYXJwX3RpbWVyKSB7CisJCQl1MzIgYWRkcl9uZXQgPSBodG9ubChjaGRsY19wcml2X2FyZWEtPklQX2FkZHJlc3MpOworCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQmFkIElQIGFkZHJlc3MgJXUuJXUuJXUuJXUgcmVjZWl2ZWRcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwKKwkJCSAgICAgICBOSVBRVUFEKGFkZHJfbmV0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogZnJvbSByZW1vdGUgc3RhdGlvbi5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisKKyAgICAgICAgICAgICAgICB9ZWxzZXsgCisJCQl1MzIgYWRkcl9uZXQgPSBodG9ubChjaGRsY19wcml2X2FyZWEtPklQX2FkZHJlc3MpOworCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogQmFkIElQIGFkZHJlc3MgJXUuJXUuJXUuJXUgaXNzdWVkXG4iLAorCQkJICAgICAgIGNhcmQtPmRldm5hbWUsCisJCQkgICAgICAgTklQUVVBRChhZGRyX25ldCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHRvIHJlbW90ZSBzdGF0aW9uLiBMb2NhbFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJUCBhZGRyZXNzIG11c3QgYmUgQS5CLkMuMVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBvciBBLkIuQy4yLlxuIixjYXJkLT5kZXZuYW1lKTsKKwkJfQorCisJCS8qIHJlbW92ZSB0aGUgcm91dGUgZHVlIHRvIHRoZSBJUCBhZGRyZXNzIGVycm9yIGNvbmRpdGlvbiAqLworCQljaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cyA9IFJFTU9WRV9ST1VURTsKKwkJZXJyID0gMTsKKyAgIAl9CisKKwkvKiBJZiB3ZSBhcmUgcmVtb3ZpbmcgYSByb3V0ZSB3aXRoIGJhZCBJUCBhZGRyZXNzaW5nLCB0aGVuIHVzZSB0aGUgKi8KKwkvKiBsb2NhbGx5IGNvbmZpZ3VyZWQgSVAgYWRkcmVzc2VzICovCisgICAgICAgIGlmKChjaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cyA9PSBSRU1PVkVfUk9VVEUpICYmIGVycikgeworCisgCSAgICAgICAgLyogZG8gbm90IHJlbW92ZSBhIGJhZCByb3V0ZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCAqLworICAgICAgICAJaWYoY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZV9yZW1vdmVkKSB7CisJICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCX0KKworICAgICAgICAgICAgICAgIGluX2RldiA9IGRldi0+aXBfcHRyOworCisgICAgICAgICAgICAgICAgaWYoaW5fZGV2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbl9pZmFkZHIgKmlmYSA9IGluX2Rldi0+aWZhX2xpc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWZhICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX0lQX2FkZHIgPSBpZmEtPmlmYV9sb2NhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBfbmV0bWFzayAgPSBpZmEtPmlmYV9tYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwl9ZWxzZXsgCisgICAgICAgCQkvKiBBY2NvcmRpbmcgdG8gQ2lzY28gSERMQywgaWYgdGhlIHBvaW50LXRvLXBvaW50IGFkZHJlc3MgaXMKKwkJICAgQS5CLkMuMSwgdGhlbiB3ZSBhcmUgdGhlIG9wcG9zaXRlIChBLkIuQy4yKSwgYW5kIHZpY2UtdmVyc2EuCisJCSovCisJCUlQX25ldG1hc2sgPSBudG9obChjaGRsY19wcml2X2FyZWEtPklQX25ldG1hc2spOworCSAgICAgICAgcmVtb3RlX0lQX2FkZHIgPSBudG9obChjaGRsY19wcml2X2FyZWEtPklQX2FkZHJlc3MpOworCQorCisJCS8qIElmIE5ldG1hc2sgaXMgMjU1LjI1NS4yNTUuMjU1IHRoZSBsb2NhbCBhZGRyZXNzCisgICAgICAgICAgICAgICAgICogY2FsY3VsYXRpb24gd2lsbCBmYWlsLiBEZWZhdWx0IGl0IGJhY2sgdG8gMjU1LjI1NS4yNTUuMCAqLworCQlpZiAoSVBfbmV0bWFzayA9PSAweGZmZmZmZmZmKQorCQkJSVBfbmV0bWFzayAmPSAweDAwZmZmZmZmOworCisJCS8qIEJ1ZyBGaXggTWFyIDE2IDIwMDAKKwkJICogQU5EIHRoZSBSZW1vdGUgSVAgYWRkcmVzcyB3aXRoIElQIG5ldG1hc2ssIGluc3RlYWQKKyAgICAgICAgICAgICAgICAgKiBvZiBzdGF0aWMgbmV0bWFzayBvZiAyNTUuMjU1LjI1NS4wICovCisgICAgICAgIAlsb2NhbF9JUF9hZGRyID0gKHJlbW90ZV9JUF9hZGRyICYgSVBfbmV0bWFzaykgKworICAgICAgICAgICAgICAgIAkofnJlbW90ZV9JUF9hZGRyICYgbnRvaGwoMHgwMDAzKSk7CisKKwkgICAgICAgIGlmKCFjYXJkLT51LmMuc2xhcnBfdGltZXIpIHsKKwkJCUlQX2FkZHIgPSBsb2NhbF9JUF9hZGRyOworCQkJbG9jYWxfSVBfYWRkciA9IHJlbW90ZV9JUF9hZGRyOworCQkJcmVtb3RlX0lQX2FkZHIgPSBJUF9hZGRyOworICAgICAgIAkJfQorCX0KKworICAgICAgICBmcyA9IGdldF9mcygpOyAgICAgICAgICAgICAgICAgIC8qIFNhdmUgZmlsZSBzeXN0ZW0gICovCisgICAgICAgIHNldF9mcyhnZXRfZHMoKSk7ICAgICAgICAgICAgICAgLyogR2V0IHVzZXIgc3BhY2UgYmxvY2sgKi8KKworICAgICAgICAvKiBTZXR1cCBhIHN0cnVjdHVyZSBmb3IgYWRkaW5nL3JlbW92aW5nIHJvdXRlcyAqLworICAgICAgICBtZW1zZXQoJmlmX2luZm8sIDAsIHNpemVvZihpZl9pbmZvKSk7CisgICAgICAgIHN0cmNweShpZl9pbmZvLmlmcl9uYW1lLCBkZXYtPm5hbWUpOworCisJc3dpdGNoIChjaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cykgeworCisJY2FzZSBBRERfUk9VVEU6CisKKwkJaWYoIWNhcmQtPnUuYy5zbGFycF90aW1lcikgeworCQkJaWZfZGF0YTIgPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmX2luZm8uaWZyX2RzdGFkZHI7CisJCQlpZl9kYXRhMi0+c2luX2FkZHIuc19hZGRyID0gcmVtb3RlX0lQX2FkZHI7CisJCQlpZl9kYXRhMi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQllcnIgPSBkZXZpbmV0X2lvY3RsKFNJT0NTSUZEU1RBRERSLCAmaWZfaW5mbyk7CisJCX0gZWxzZSB7IAorCQkJaWZfZGF0YTEgPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmX2luZm8uaWZyX2FkZHI7CisJCQlpZl9kYXRhMS0+c2luX2FkZHIuc19hZGRyID0gbG9jYWxfSVBfYWRkcjsKKwkJCWlmX2RhdGExLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCWlmKCEoZXJyID0gZGV2aW5ldF9pb2N0bChTSU9DU0lGQUREUiwgJmlmX2luZm8pKSl7CisJCQkJaWZfZGF0YTIgPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmX2luZm8uaWZyX2RzdGFkZHI7CisJCQkJaWZfZGF0YTItPnNpbl9hZGRyLnNfYWRkciA9IHJlbW90ZV9JUF9hZGRyOworCQkJCWlmX2RhdGEyLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCQllcnIgPSBkZXZpbmV0X2lvY3RsKFNJT0NTSUZEU1RBRERSLCAmaWZfaW5mbyk7CisJCQl9CisJCX0KKworICAgICAgICAgICAgICAgaWYoZXJyKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQWRkIHJvdXRlICV1LiV1LiV1LiV1IGZhaWxlZCAoJWQpXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLCBOSVBRVUFEKHJlbW90ZV9JUF9hZGRyKSwgZXJyKTsKKwkJfSBlbHNlIHsKKwkJCSgoY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKilkZXYtPnByaXYpLT5yb3V0ZV9zdGF0dXMgPSBST1VURV9BRERFRDsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEeW5hbWljIHJvdXRlIGFkZGVkLlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAgICBMb2NhbCBJUCBhZGRyIDogJXUuJXUuJXUuJXVcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgTklQUVVBRChsb2NhbF9JUF9hZGRyKSk7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogICAgUmVtb3RlIElQIGFkZHI6ICV1LiV1LiV1LiV1XG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIE5JUFFVQUQocmVtb3RlX0lQX2FkZHIpKTsKKwkJCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVfcmVtb3ZlZCA9IDA7CisJCX0KKwkJYnJlYWs7CisKKworCWNhc2UgUkVNT1ZFX1JPVVRFOgorCQorCQkvKiBDaGFuZ2UgdGhlIGxvY2FsIGlwIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZSB0byAwLgorCQkgKiBUaGlzIHdpbGwgYWxzbyBkZWxldGUgdGhlIGRlc3RpbmF0aW9uIHJvdXRlLgorCQkgKi8KKwkJaWYoIWNhcmQtPnUuYy5zbGFycF90aW1lcikgeworCQkJaWZfZGF0YTIgPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmX2luZm8uaWZyX2RzdGFkZHI7CisJCQlpZl9kYXRhMi0+c2luX2FkZHIuc19hZGRyID0gMDsKKwkJCWlmX2RhdGEyLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCWVyciA9IGRldmluZXRfaW9jdGwoU0lPQ1NJRkRTVEFERFIsICZpZl9pbmZvKTsKKwkJfSBlbHNlIHsKKwkJCWlmX2RhdGExID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZpZl9pbmZvLmlmcl9hZGRyOworCQkJaWZfZGF0YTEtPnNpbl9hZGRyLnNfYWRkciA9IDA7CisJCQlpZl9kYXRhMS0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQllcnIgPSBkZXZpbmV0X2lvY3RsKFNJT0NTSUZBRERSLCZpZl9pbmZvKTsKKwkJCisJCX0KKwkJaWYoZXJyKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBSZW1vdmUgcm91dGUgJXUuJXUuJXUuJXUgZmFpbGVkLCAoZXJyICVkKVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSwgTklQUVVBRChyZW1vdGVfSVBfYWRkciksCisJCQkJCWVycik7CisJCX0gZWxzZSB7CisJCQkoKGNoZGxjX3ByaXZhdGVfYXJlYV90ICopZGV2LT5wcml2KS0+cm91dGVfc3RhdHVzID0KKwkJCQlOT19ST1VURTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBEeW5hbWljIHJvdXRlIHJlbW92ZWQ6ICV1LiV1LiV1LiV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmRldm5hbWUsIE5JUFFVQUQobG9jYWxfSVBfYWRkcikpOyAKKwkJCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVfcmVtb3ZlZCA9IDE7CisJCX0KKwkJYnJlYWs7CisJfQorCisgICAgICAgIHNldF9mcyhmcyk7ICAgICAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBmaWxlIHN5c3RlbSAqLworCit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RvcmUgYSBVRFAgbWFuYWdlbWVudCBwYWNrZXQgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCisgKi8KKworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoY2hhciB1ZHBfcGt0X3NyYywgc2RsYV90KiBjYXJkLAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJCSAgICAgIGNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWEpCit7CisJaW50IHVkcF9wa3Rfc3RvcmVkID0gMDsKKworCWlmKCFjaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfbGd0aCAmJgorCSAgKHNrYi0+bGVuIDw9IE1BWF9MR1RIX1VEUF9NR05UX1BLVCkpIHsKKyAgICAgICAgCWNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9sZ3RoID0gc2tiLT5sZW47CisJCWNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9zcmMgPSB1ZHBfcGt0X3NyYzsKKyAgICAgICAJCW1lbWNweShjaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgPSBUTVJfSU5UX0VOQUJMRURfVURQOworCQl1ZHBfcGt0X3N0b3JlZCA9IDE7CisJfQorCisJaWYodWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fU1RBQ0speworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX1lbHNleworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfQorCQkKKwlyZXR1cm4odWRwX3BrdF9zdG9yZWQpOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByb2Nlc3MgVURQIG1hbmFnZW1lbnQgcGFja2V0LgorICovCisKK3N0YXRpYyBpbnQgcHJvY2Vzc191ZHBfbWdtdF9wa3Qoc2RsYV90KiBjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkJCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWEgKSAKK3sKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgaW50IGZyYW1lcywgbGVuOworCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCXVuc2lnbmVkIHNob3J0IGJ1ZmZlcl9sZW5ndGgsIHJlYWxfbGVuOworCXVuc2lnbmVkIGxvbmcgZGF0YV9wdHI7CisJdW5zaWduZWQgZGF0YV9sZW5ndGg7CisJaW50IHVkcF9tZ210X3JlcV92YWxpZCA9IDE7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QgKm1iID0gY2FyZC0+bWJveDsKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwljaGRsY191ZHBfcGt0X3QgKmNoZGxjX3VkcF9wa3Q7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJaW50IGVycjsKKwljaGFyIHV0X2NoYXI7CisKKwljaGRsY191ZHBfcGt0ID0gKGNoZGxjX3VkcF9wa3RfdCAqKSBjaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfZGF0YTsKKworCWlmKGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fTkVUV09SSyl7CisKKwkJLyogT25seSB0aGVzZSBjb21tYW5kcyBhcmUgc3VwcG9ydCBmb3IgcmVtb3RlIGRlYnVnZ2luZy4KKwkJICogQWxsIG90aGVycyBhcmUgbm90ICovCisJCXN3aXRjaChjaGRsY191ZHBfcGt0LT5jYmxvY2suY29tbWFuZCkgeworCisJCQljYXNlIFJFQURfR0xPQkFMX1NUQVRJU1RJQ1M6CisJCQljYXNlIFJFQURfTU9ERU1fU1RBVFVTOiAgCisJCQljYXNlIFJFQURfQ0hETENfTElOS19TVEFUVVM6CisJCQljYXNlIENQSVBFX1JPVVRFUl9VUF9USU1FOgorCQkJY2FzZSBSRUFEX0NPTU1TX0VSUk9SX1NUQVRTOgorCQkJY2FzZSBSRUFEX0NIRExDX09QRVJBVElPTkFMX1NUQVRTOgorCisJCQkvKiBUaGVzZSB0d28gY29tbWFuZHMgYXJlIGV4ZWN1dGVkIGZvcgorCQkJICogZWFjaCByZXF1ZXN0ICovCisJCQljYXNlIFJFQURfQ0hETENfQ09ORklHVVJBVElPTjoKKwkJCWNhc2UgUkVBRF9DSERMQ19DT0RFX1ZFUlNJT046CisJCQkJdWRwX21nbXRfcmVxX3ZhbGlkID0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdWRwX21nbXRfcmVxX3ZhbGlkID0gMDsKKwkJCQlicmVhazsKKwkJfSAKKwl9CisJCisgIAlpZighdWRwX21nbXRfcmVxX3ZhbGlkKSB7CisKKwkJLyogc2V0IGxlbmd0aCB0byAwICovCisJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5idWZmZXJfbGVuZ3RoID0gMDsKKworICAgIAkJLyogc2V0IHJldHVybiBjb2RlICovCisJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IDB4Q0Q7CisKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CQorCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogV2FybmluZywgSWxsZWdhbCBVRFAgY29tbWFuZCBhdHRlbXB0ZWQgZnJvbSBuZXR3b3JrOiAleFxuIiwKKwkJCWNhcmQtPmRldm5hbWUsY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpOworCQl9CisKKyAgIAl9IGVsc2UgeworCSAgIAl1bnNpZ25lZCBsb25nIHRyYWNlX3N0YXR1c19jZmdfYWRkciA9IDA7CisJCVRSQUNFX1NUQVRVU19FTF9DRkdfU1RSVUNUIHRyYWNlX2NmZ19zdHJ1Y3Q7CisJCVRSQUNFX1NUQVRVU19FTEVNRU5UX1NUUlVDVCB0cmFjZV9lbGVtZW50X3N0cnVjdDsKKworCQlzd2l0Y2goY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpIHsKKworCQljYXNlIENQSVBFX0VOQUJMRV9UUkFDSU5HOgorCQkgICAgIGlmICghY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCkgeworCisJCQkvKiBPUEVSQVRFX0RBVEFMSU5FX01PTklUT1IgKi8KKworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUKTsKKwkJCW1iLT5jb21tYW5kID0gU0VUX1RSQUNFX0NPTkZJR1VSQVRJT047CisKKyAgICAJCQkoKExJTkVfVFJBQ0VfQ09ORklHX1NUUlVDVCAqKW1iLT5kYXRhKS0+CisJCQkJdHJhY2VfY29uZmlnID0gVFJBQ0VfQUNUSVZFOworCQkJLyogVHJhY2UgZGVsYXkgbW9kZSBpcyBub3QgdXNlZCBiZWNhdXNlIGl0IHNsb3dzCisJCQkgICBkb3duIHRyYW5zZmVyIGFuZCByZXN1bHRzIGluIGEgc3RhbmRvZmYgc2l0dWF0aW9uCisJCQkgICB3aGVuIHRoZXJlIGlzIGEgbG90IG9mIGRhdGEgKi8KKworCQkJLyogQ29uZmlndXJlIHRoZSBUcmFjZSBiYXNlZCBvbiB1c2VyIGlucHV0cyAqLworCQkJKChMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QgKiltYi0+ZGF0YSktPnRyYWNlX2NvbmZpZyB8PSAKKwkJCQkJY2hkbGNfdWRwX3BrdC0+ZGF0YVswXTsKKworCQkJKChMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QgKiltYi0+ZGF0YSktPgorCQkJICAgdHJhY2VfZGVhY3RpdmF0aW9uX3RpbWVyID0gNDAwMDsKKworCisJCQllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJCQlpZiAoZXJyICE9IENPTU1BTkRfT0spIHsKKwkJCQljaGRsY19lcnJvcihjYXJkLGVycixtYik7CisJCQkJY2FyZC0+VHJhY2luZ0VuYWJsZWQgPSAwOworCQkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IGVycjsKKwkJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCQkJYnJlYWs7CisJICAgIAkJfSAKKworCQkJLyogR2V0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHRyYWNlIGVsZW1lbnQgbGlzdCAqLworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCQkJbWItPmNvbW1hbmQgPSBSRUFEX1RSQUNFX0NPTkZJR1VSQVRJT047CisJCQllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisKKwkJCWlmIChlcnIgIT0gQ09NTUFORF9PSykgeworCQkJCWNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKwkJCQljaGRsY19wcml2X2FyZWEtPlRyYWNpbmdFbmFibGVkID0gMDsKKwkJCQljaGRsY191ZHBfcGt0LT5jYmxvY2sucmV0dXJuX2NvZGUgPSBlcnI7CisJCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCQkJCWJyZWFrOworCSAgICAJCX0gCQorCisJICAgCQl0cmFjZV9zdGF0dXNfY2ZnX2FkZHIgPSgoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUICopCisJCQkJbWItPmRhdGEpIC0+IHB0cl90cmFjZV9zdGF0X2VsX2NmZ19zdHJ1Y3Q7CisKKwkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIHRyYWNlX3N0YXR1c19jZmdfYWRkciwKKwkJCQkgJnRyYWNlX2NmZ19zdHJ1Y3QsIHNpemVvZih0cmFjZV9jZmdfc3RydWN0KSk7CisJCSAgICAKKwkJCWNoZGxjX3ByaXZfYXJlYS0+c3RhcnRfdHJhY2VfYWRkciA9IHRyYWNlX2NmZ19zdHJ1Y3QuCisJCQkJYmFzZV9hZGRyX3RyYWNlX3N0YXR1c19lbGVtZW50czsKKworCQkJY2hkbGNfcHJpdl9hcmVhLT5udW1iZXJfdHJhY2VfZWxlbWVudHMgPSAKKwkJCQkJdHJhY2VfY2ZnX3N0cnVjdC5udW1iZXJfdHJhY2Vfc3RhdHVzX2VsZW1lbnRzOworCisJCQljaGRsY19wcml2X2FyZWEtPmVuZF90cmFjZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpCisJCQkJCSgoVFJBQ0VfU1RBVFVTX0VMRU1FTlRfU1RSVUNUICopCisJCQkJCSBjaGRsY19wcml2X2FyZWEtPnN0YXJ0X3RyYWNlX2FkZHIgKyAKKwkJCQkJIChjaGRsY19wcml2X2FyZWEtPm51bWJlcl90cmFjZV9lbGVtZW50cyAtIDEpKTsKKworCQkJY2hkbGNfcHJpdl9hcmVhLT5iYXNlX2FkZHJfdHJhY2VfYnVmZmVyID0gCisJCQkJCXRyYWNlX2NmZ19zdHJ1Y3QuYmFzZV9hZGRyX3RyYWNlX2J1ZmZlcjsKKworCQkJY2hkbGNfcHJpdl9hcmVhLT5lbmRfYWRkcl90cmFjZV9idWZmZXIgPSAKKwkJCQkJdHJhY2VfY2ZnX3N0cnVjdC5lbmRfYWRkcl90cmFjZV9idWZmZXI7CisKKwkJICAgIAljaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciA9IAorCQkJCQl0cmFjZV9jZmdfc3RydWN0Lm5leHRfdHJhY2VfZWxlbWVudF90b191c2U7CisKKwkgICAgCQljaGRsY19wcml2X2FyZWEtPmF2YWlsYWJsZV9idWZmZXJfc3BhY2UgPSAyMDAwIC0gCisJCQkJCQkJCSAgc2l6ZW9mKGlwX3BrdF90KSAtCisJCQkJCQkJCSAgc2l6ZW9mKHVkcF9wa3RfdCkgLQorCQkJCQkJCSAgICAgIAkgIHNpemVvZih3cF9tZ210X3QpIC0KKwkJCQkJCQkJICBzaXplb2YoY2Jsb2NrX3QpIC0KKwkJCQkJCQkgICAgICAgICAgc2l6ZW9mKHRyYWNlX2luZm9fdCk7CQorCSAgICAgICAJICAgICB9CisJCSAgICAgY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gQ09NTUFORF9PSzsKKwkJICAgICBtYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJICAgICAgIAkgICAgIGNoZGxjX3ByaXZfYXJlYS0+VHJhY2luZ0VuYWJsZWQgPSAxOworCSAgICAgICAJICAgICBicmVhazsKKwkgICAKKworCQljYXNlIENQSVBFX0RJU0FCTEVfVFJBQ0lORzoKKwkJICAgICBpZiAoY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCkgeworCisJCQkvKiBPUEVSQVRFX0RBVEFMSU5FX01PTklUT1IgKi8KKwkJCW1iLT5idWZmZXJfbGVuZ3RoID0gc2l6ZW9mKExJTkVfVFJBQ0VfQ09ORklHX1NUUlVDVCk7CisJCQltYi0+Y29tbWFuZCA9IFNFVF9UUkFDRV9DT05GSUdVUkFUSU9OOworICAgIAkJCSgoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUICopbWItPmRhdGEpLT4KKwkJCQl0cmFjZV9jb25maWcgPSBUUkFDRV9JTkFDVElWRTsKKwkJCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwkJICAgICB9CQkKKworCQkgICAgIGNoZGxjX3ByaXZfYXJlYS0+VHJhY2luZ0VuYWJsZWQgPSAwOworCQkgICAgIGNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IENPTU1BTkRfT0s7CisJCSAgICAgbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCQkgICAgIGJyZWFrOworCSAgIAorCisJCWNhc2UgQ1BJUEVfR0VUX1RSQUNFX0lORk86CisKKwkJICAgICBpZiAoIWNoZGxjX3ByaXZfYXJlYS0+VHJhY2luZ0VuYWJsZWQpIHsKKwkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IDE7CisJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCQlicmVhazsKKwkJICAgICB9CisKKyAgCQkgICAgIGNoZGxjX3VkcF9wa3QtPnRyYWNlX2luZm8uaXNtb3JlZGF0YSA9IDB4MDA7CisJCSAgICAgYnVmZmVyX2xlbmd0aCA9IDA7CS8qIG9mZnNldCBvZiBwYWNrZXQgYWxyZWFkeSBvY2N1cGllZCAqLworCisJCSAgICAgZm9yIChmcmFtZXM9MDsgZnJhbWVzIDwgY2hkbGNfcHJpdl9hcmVhLT5udW1iZXJfdHJhY2VfZWxlbWVudHM7IGZyYW1lcysrKXsKKworCQkJdHJhY2VfcGt0X3QgKnRyYWNlX3BrdCA9ICh0cmFjZV9wa3RfdCAqKQorCQkJCSZjaGRsY191ZHBfcGt0LT5kYXRhW2J1ZmZlcl9sZW5ndGhdOworCisJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBjaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciwKKwkJCSAgIAkgICh1bnNpZ25lZCBjaGFyICopJnRyYWNlX2VsZW1lbnRfc3RydWN0LAorCQkJICAgCSAgc2l6ZW9mKFRSQUNFX1NUQVRVU19FTEVNRU5UX1NUUlVDVCkpOworCisgICAgIAkJCWlmICh0cmFjZV9lbGVtZW50X3N0cnVjdC5vcHBfZmxhZyA9PSAweDAwKSB7CisJCQkgCWJyZWFrOworCQkJfQorCisJCQkvKiBnZXQgcG9pbnRlciB0byByZWFsIGRhdGEgKi8KKwkJCWRhdGFfcHRyID0gdHJhY2VfZWxlbWVudF9zdHJ1Y3QucHRyX2RhdGFfYmZyOworCisJCQkvKiBTZWUgaWYgdGhlcmUgaXMgYWN0dWFsIGRhdGEgb24gdGhlIHRyYWNlIGJ1ZmZlciAqLworCQkJaWYgKGRhdGFfcHRyKXsKKwkJCQlkYXRhX2xlbmd0aCA9IHRyYWNlX2VsZW1lbnRfc3RydWN0LnRyYWNlX2xlbmd0aDsKKwkJCX1lbHNleworCQkJCWRhdGFfbGVuZ3RoID0gMDsKKwkJCQljaGRsY191ZHBfcGt0LT50cmFjZV9pbmZvLmlzbW9yZWRhdGEgPSAweDAxOworCQkJfQorCQorICAgCQkJaWYoIChjaGRsY19wcml2X2FyZWEtPmF2YWlsYWJsZV9idWZmZXJfc3BhY2UgLSBidWZmZXJfbGVuZ3RoKQorCQkJCTwgKCBzaXplb2YodHJhY2VfcGt0X3QpICsgZGF0YV9sZW5ndGgpICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kaWNhdGUgdGhlcmUgYXJlIG1vcmUgZnJhbWVzIG9uIGJvYXJkICYgZXhpdCAqLworCQkJCWNoZGxjX3VkcF9wa3QtPnRyYWNlX2luZm8uaXNtb3JlZGF0YSA9IDB4MDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCQkJdHJhY2VfcGt0LT5zdGF0dXMgPSB0cmFjZV9lbGVtZW50X3N0cnVjdC50cmFjZV90eXBlOworCisJCQl0cmFjZV9wa3QtPnRpbWVfc3RhbXAgPQorCQkJCXRyYWNlX2VsZW1lbnRfc3RydWN0LnRyYWNlX3RpbWVfc3RhbXA7CisKKwkJCXRyYWNlX3BrdC0+cmVhbF9sZW5ndGggPQorCQkJCXRyYWNlX2VsZW1lbnRfc3RydWN0LnRyYWNlX2xlbmd0aDsKKworCQkJLyogc2VlIGlmIHdlIGNhbiBmaXQgdGhlIGZyYW1lIGludG8gdGhlIHVzZXIgYnVmZmVyICovCisJCQlyZWFsX2xlbiA9IHRyYWNlX3BrdC0+cmVhbF9sZW5ndGg7CisKKwkJCWlmIChkYXRhX3B0ciA9PSAwKSB7CisJCQkgICAgIAl0cmFjZV9wa3QtPmRhdGFfYXZhaWwgPSAweDAwOworCQkJfSBlbHNlIHsKKwkJCQl1bnNpZ25lZCB0bXAgPSAwOworCisJCQkJLyogZ2V0IHRoZSBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVyCisJCQkJICAgIG11c3QgY2hlY2sgZm9yIGVuZCBvZiBidWZmZXIgKi8KKwkJCSAgICAgICAgdHJhY2VfcGt0LT5kYXRhX2F2YWlsID0gMHgwMTsKKworCQkJCWlmICgoZGF0YV9wdHIgKyByZWFsX2xlbikgPgorCQkJCQkgICAgIGNoZGxjX3ByaXZfYXJlYS0+ZW5kX2FkZHJfdHJhY2VfYnVmZmVyICsgMSl7CisKKwkJCQkgICAgCXRtcCA9IGNoZGxjX3ByaXZfYXJlYS0+ZW5kX2FkZHJfdHJhY2VfYnVmZmVyIC0gZGF0YV9wdHIgKyAxOworCQkJCSAgICAJc2RsYV9wZWVrKCZjYXJkLT5odywgZGF0YV9wdHIsCisJCQkJCSAgICAgICAJICB0cmFjZV9wa3QtPmRhdGEsdG1wKTsKKwkJCQkgICAgCWRhdGFfcHRyID0gY2hkbGNfcHJpdl9hcmVhLT5iYXNlX2FkZHJfdHJhY2VfYnVmZmVyOworCQkJCX0KKwkKKwkJICAgICAgICAJc2RsYV9wZWVrKCZjYXJkLT5odywgZGF0YV9wdHIsCisJCQkJCSAgJnRyYWNlX3BrdC0+ZGF0YVt0bXBdLCByZWFsX2xlbiAtIHRtcCk7CisJCQl9CQorCisJCQkvKiB6ZXJvIHRoZSBvcHAgZmxhZyB0byBzaG93IHdlIGdvdCB0aGUgZnJhbWUgKi8KKwkJCXV0X2NoYXIgPSAweDAwOworCQkJc2RsYV9wb2tlKCZjYXJkLT5odywgY2hkbGNfcHJpdl9hcmVhLT5jdXJyX3RyYWNlX2FkZHIsICZ1dF9jaGFyLCAxKTsKKworICAgICAgIAkJCS8qIG5vdyBtb3ZlIG9udG8gdGhlIG5leHQgZnJhbWUgKi8KKyAgICAgICAJCQljaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciArPSBzaXplb2YoVFJBQ0VfU1RBVFVTX0VMRU1FTlRfU1RSVUNUKTsKKworICAgICAgIAkJCS8qIGNoZWNrIGlmIHdlIHdlbnQgb3ZlciB0aGUgbGFzdCBhZGRyZXNzICovCisJCQlpZiAoIGNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyID4gY2hkbGNfcHJpdl9hcmVhLT5lbmRfdHJhY2VfYWRkciApIHsKKwkJCQljaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciA9IGNoZGxjX3ByaXZfYXJlYS0+c3RhcnRfdHJhY2VfYWRkcjsKKyAgICAgICAJCQl9CisKKyAgICAgICAgICAgIAkJaWYodHJhY2VfcGt0LT5kYXRhX2F2YWlsID09IDB4MDEpIHsKKwkJCQlidWZmZXJfbGVuZ3RoICs9IHJlYWxfbGVuIC0gMTsKKwkJCX0KKwkgCisJICAgICAgIAkgICAgCS8qIGZvciB0aGUgaGVhZGVyICovCisJICAgICAgICAgICAgCWJ1ZmZlcl9sZW5ndGggKz0gc2l6ZW9mKHRyYWNlX3BrdF90KTsKKworCQkgICAgIH0gIC8qIEZvciBMb29wICovCisKKwkJICAgICBpZiAoZnJhbWVzID09IGNoZGxjX3ByaXZfYXJlYS0+bnVtYmVyX3RyYWNlX2VsZW1lbnRzKXsKKwkJCWNoZGxjX3VkcF9wa3QtPnRyYWNlX2luZm8uaXNtb3JlZGF0YSA9IDB4MDE7CisJICAgICAgICAgICAgIH0KKyAJCSAgICAgY2hkbGNfdWRwX3BrdC0+dHJhY2VfaW5mby5udW1fZnJhbWVzID0gZnJhbWVzOworCQkgCisgICAgCQkgICAgIG1iLT5idWZmZXJfbGVuZ3RoID0gYnVmZmVyX2xlbmd0aDsKKwkJICAgICBjaGRsY191ZHBfcGt0LT5jYmxvY2suYnVmZmVyX2xlbmd0aCA9IGJ1ZmZlcl9sZW5ndGg7IAorCQkgCisJCSAgICAgY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gQ09NTUFORF9PSzsgCisJCSAgICAgCisJCSAgICAgYnJlYWs7CisKKworCQljYXNlIENQSVBFX0ZUMV9SRUFEX1NUQVRVUzoKKwkJCSgodW5zaWduZWQgY2hhciAqKWNoZGxjX3VkcF9wa3QtPmRhdGEgKVswXSA9CisJCQkJZmxhZ3MtPkZUMV9pbmZvX3N0cnVjdC5wYXJhbGxlbF9wb3J0X0FfaW5wdXQ7CisKKwkJCSgodW5zaWduZWQgY2hhciAqKWNoZGxjX3VkcF9wa3QtPmRhdGEgKVsxXSA9CisJCQkJZmxhZ3MtPkZUMV9pbmZvX3N0cnVjdC5wYXJhbGxlbF9wb3J0X0JfaW5wdXQ7CisJCQkJCisJCQljaGRsY191ZHBfcGt0LT5jYmxvY2sucmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOworCQkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLmJ1ZmZlcl9sZW5ndGggPSAyOworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSAyOworCQkJYnJlYWs7CisKKwkJY2FzZSBDUElQRV9ST1VURVJfVVBfVElNRToKKwkJCWRvX2dldHRpbWVvZmRheSggJnR2ICk7CisJCQljaGRsY19wcml2X2FyZWEtPnJvdXRlcl91cF90aW1lID0gdHYudHZfc2VjIC0gCisJCQkJCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVyX3N0YXJ0X3RpbWU7CisJCQkqKHVuc2lnbmVkIGxvbmcgKikmY2hkbGNfdWRwX3BrdC0+ZGF0YSA9IAorCQkJCQljaGRsY19wcml2X2FyZWEtPnJvdXRlcl91cF90aW1lOwkKKwkJCW1iLT5idWZmZXJfbGVuZ3RoID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCQljaGRsY191ZHBfcGt0LT5jYmxvY2sucmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOworCQkJYnJlYWs7CisKKyAgIAkJY2FzZSBGVDFfTU9OSVRPUl9TVEFUVVNfQ1RSTDoKKwkJCS8qIEVuYWJsZSBGVDEgTU9OSVRPUiBTVEFUVVMgKi8KKwkgICAgICAgIAlpZiAoKGNoZGxjX3VkcF9wa3QtPmRhdGFbMF0gJiBFTkFCTEVfUkVBRF9GVDFfU1RBVFVTKSB8fCAgCisJCQkJKGNoZGxjX3VkcF9wa3QtPmRhdGFbMF0gJiBFTkFCTEVfUkVBRF9GVDFfT1BfU1RBVFMpKSB7CisJCQkKKwkJCSAgICAgCWlmKCByQ291bnQrKyAhPSAwICkgeworCQkJCQljaGRsY191ZHBfcGt0LT5jYmxvY2suCisJCQkJCXJldHVybl9jb2RlID0gQ09NTUFORF9PSzsKKwkJCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSAxOworCQkgIAkJCWJyZWFrOworCQkgICAgCSAgICAgCX0KKwkgICAgICAJCX0KKworCSAgICAgIAkJLyogRGlzYWJsZSBGVDEgTU9OSVRPUiBTVEFUVVMgKi8KKwkgICAgICAJCWlmKCBjaGRsY191ZHBfcGt0LT5kYXRhWzBdID09IDApIHsKKworCSAgICAgIAkgICAJICAgICAJaWYoIC0tckNvdW50ICE9IDApIHsKKwkJICAJCQljaGRsY191ZHBfcGt0LT5jYmxvY2suCisJCQkJCXJldHVybl9jb2RlID0gQ09NTUFORF9PSzsKKwkJCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSAxOworCQkgIAkJCWJyZWFrOworCSAgIAkgICAgCSAgICAgCX0gCisJICAgICAgCQl9IAkKKwkJCWdvdG8gZGZsdF8xOworCisJCWRlZmF1bHQ6CitkZmx0XzE6CisJCQkvKiBpdCdzIGEgYm9hcmQgY29tbWFuZCAqLworCQkJbWItPmNvbW1hbmQgPSBjaGRsY191ZHBfcGt0LT5jYmxvY2suY29tbWFuZDsKKwkJCW1iLT5idWZmZXJfbGVuZ3RoID0gY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLmJ1ZmZlcl9sZW5ndGg7CisJCQlpZiAobWItPmJ1ZmZlcl9sZW5ndGgpIHsKKwkJCQltZW1jcHkoJm1iLT5kYXRhLCAodW5zaWduZWQgY2hhciAqKSBjaGRsY191ZHBfcGt0LT4KKwkJCQkJCQlkYXRhLCBtYi0+YnVmZmVyX2xlbmd0aCk7CisJICAgICAgCQl9IAorCQkJLyogcnVuIHRoZSBjb21tYW5kIG9uIHRoZSBib2FyZCAqLworCQkJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCQkJaWYgKGVyciAhPSBDT01NQU5EX09LKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIGNvcHkgdGhlIHJlc3VsdCBiYWNrIHRvIG91ciBidWZmZXIgKi8KKwkgICAgICAgICAJbWVtY3B5KCZjaGRsY191ZHBfcGt0LT5jYmxvY2ssIG1iLCBzaXplb2YoY2Jsb2NrX3QpKTsgCisJCQkKKwkJCWlmIChtYi0+YnVmZmVyX2xlbmd0aCkgeworCSAgICAgICAgIAkJbWVtY3B5KCZjaGRsY191ZHBfcGt0LT5kYXRhLCAmbWItPmRhdGEsIAorCQkJCQkJCQltYi0+YnVmZmVyX2xlbmd0aCk7IAorCSAgICAgIAkJfQorCisJCX0gLyogZW5kIG9mIHN3aXRjaCAqLworICAgICAJfSAvKiBlbmQgb2YgZWxzZSAqLworCisgICAgIAkvKiBGaWxsIFVEUCBUVEwgKi8KKwljaGRsY191ZHBfcGt0LT5pcF9wa3QudHRsID0gY2FyZC0+d2FuZGV2LnR0bDsgCisKKyAgICAgCWxlbiA9IHJlcGx5X3VkcChjaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfZGF0YSwgbWItPmJ1ZmZlcl9sZW5ndGgpOworCQorCisgICAgIAlpZihjaGRsY19wcml2X2FyZWEtPnVkcF9wa3Rfc3JjID09IFVEUF9QS1RfRlJNX05FVFdPUkspeworCisJCS8qIE11c3QgY2hlY2sgaWYgd2UgaW50ZXJydXB0ZWQgaWZfc2VuZCgpIHJvdXRpbmUuIFRoZQorCQkgKiB0eCBidWZmZXJzIG1pZ2h0IGJlIHVzZWQuIElmIHNvIGRyb3AgdGhlIHBhY2tldCAqLworCSAgIAlpZiAoIXRlc3RfYml0KFNFTkRfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSkgeworCQkKKwkJCWlmKCFjaGRsY19zZW5kKGNhcmQsIGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhLCBsZW4pKSB7CisJCQkJKysgY2FyZC0+d2FuZGV2LnN0YXRzLnR4X3BhY2tldHM7CisJCQkJY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CQorCQorCQkvKiBQYXNzIGl0IHVwIHRoZSBzdGFjaworICAgIAkJICAgQWxsb2NhdGUgc29ja2V0IGJ1ZmZlciAqLworCQlpZiAoKG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbikpICE9IE5VTEwpIHsKKwkJCS8qIGNvcHkgZGF0YSBpbnRvIG5ld19za2IgKi8KKworIAkgICAgCQlidWYgPSBza2JfcHV0KG5ld19za2IsIGxlbik7CisgIAkgICAgCQltZW1jcHkoYnVmLCBjaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfZGF0YSwgbGVuKTsKKworICAgICAgICAgICAgCQkvKiBEZWNhcHN1bGF0ZSBwa3QgYW5kIHBhc3MgaXQgdXAgdGhlIHByb3RvY29sIHN0YWNrICovCisJICAgIAkJbmV3X3NrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisgICAgICAgICAgICAJCW5ld19za2ItPmRldiA9IGRldjsKKwkgICAgCQluZXdfc2tiLT5tYWMucmF3ICA9IG5ld19za2ItPmRhdGE7CisJCisJCQluZXRpZl9yeChuZXdfc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCX0gZWxzZSB7CisJICAgIAkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBzb2NrZXQgYnVmZmVycyBhdmFpbGFibGUhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKyAgCQl9CisgICAgCX0KKyAKKwljaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfbGd0aCA9IDA7CisgCQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgUmVjZWl2ZSBhbmQgVHJhbnNtaXQgQnVmZmVycy4KKyAqLworCitzdGF0aWMgdm9pZCBpbml0X2NoZGxjX3R4X3J4X2J1ZmYoIHNkbGFfdCogY2FyZCkKK3sKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCUNIRExDX1RYX1NUQVRVU19FTF9DRkdfU1RSVUNUICp0eF9jb25maWc7CisJQ0hETENfUlhfU1RBVFVTX0VMX0NGR19TVFJVQ1QgKnJ4X2NvbmZpZzsKKwljaGFyIGVycjsKKwkKKwltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJbWItPmNvbW1hbmQgPSBSRUFEX0NIRExDX0NPTkZJR1VSQVRJT047CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCisJaWYoZXJyICE9IENPTU1BTkRfT0spIHsKKwkJaWYgKGNhcmQtPndhbmRldi5kZXYpeworCQkJY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkgeworCQl0eF9jb25maWcgPSAoQ0hETENfVFhfU1RBVFVTX0VMX0NGR19TVFJVQ1QgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAgKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYi0+ZGF0YSktPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9DSERMQ19UeF9zdGF0X2VsX2NmZ19zdHJ1Y3QpKTsKKyAgICAgICAgCXJ4X2NvbmZpZyA9IChDSERMQ19SWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICAoKChDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCAqKW1iLT5kYXRhKS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX0NIRExDX1J4X3N0YXRfZWxfY2ZnX3N0cnVjdCkpOworCisgICAgICAgCQkvKiBTZXR1cCBIZWFkIGFuZCBUYWlscyBmb3IgYnVmZmVycyAqLworICAgICAgICAJY2FyZC0+dS5jLnR4YnVmX2Jhc2UgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICB0eF9jb25maWctPmJhc2VfYWRkcl9UeF9zdGF0dXNfZWxlbWVudHMpOworICAgICAgICAJY2FyZC0+dS5jLnR4YnVmX2xhc3QgPSAKKwkJKENIRExDX0RBVEFfVFhfU1RBVFVTX0VMX1NUUlVDVCAqKSAgCisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnR4YnVmX2Jhc2UgKworCQkodHhfY29uZmlnLT5udW1iZXJfVHhfc3RhdHVzX2VsZW1lbnRzIC0gMSk7CisKKyAgICAgICAgCWNhcmQtPnUuYy5yeGJ1Zl9iYXNlID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAgcnhfY29uZmlnLT5iYXNlX2FkZHJfUnhfc3RhdHVzX2VsZW1lbnRzKTsKKyAgICAgICAgCWNhcmQtPnUuYy5yeGJ1Zl9sYXN0ID0KKwkJKENIRExDX0RBVEFfUlhfU1RBVFVTX0VMX1NUUlVDVCAqKQorICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5yeGJ1Zl9iYXNlICsKKwkJKHJ4X2NvbmZpZy0+bnVtYmVyX1J4X3N0YXR1c19lbGVtZW50cyAtIDEpOworCisgCQkvKiBTZXQgdXAgbmV4dCBwb2ludGVyIHRvIGJlIHVzZWQgKi8KKyAgICAgICAgCWNhcmQtPnUuYy50eGJ1ZiA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgIHR4X2NvbmZpZy0+bmV4dF9UeF9zdGF0dXNfZWxlbWVudF90b191c2UpOworICAgICAgICAJY2FyZC0+dS5jLnJ4bWIgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICByeF9jb25maWctPm5leHRfUnhfc3RhdHVzX2VsZW1lbnRfdG9fdXNlKTsKKwl9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHR4X2NvbmZpZyA9IChDSERMQ19UWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJCSgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWItPmRhdGEpLT4KKwkJCXB0cl9DSERMQ19UeF9zdGF0X2VsX2NmZ19zdHJ1Y3QgJSBTRExBX1dJTkRPV1NJWkUpKTsKKworICAgICAgICAgICAgICAgIHJ4X2NvbmZpZyA9IChDSERMQ19SWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJCSgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWItPmRhdGEpLT4KKwkJCXB0cl9DSERMQ19SeF9zdGF0X2VsX2NmZ19zdHJ1Y3QgJSBTRExBX1dJTkRPV1NJWkUpKTsKKworICAgICAgICAgICAgICAgIC8qIFNldHVwIEhlYWQgYW5kIFRhaWxzIGZvciBidWZmZXJzICovCisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnR4YnVmX2Jhc2UgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJKHR4X2NvbmZpZy0+YmFzZV9hZGRyX1R4X3N0YXR1c19lbGVtZW50cyAlIFNETEFfV0lORE9XU0laRSkpOworICAgICAgICAgICAgICAgIGNhcmQtPnUuYy50eGJ1Zl9sYXN0ID0KKwkJKENIRExDX0RBVEFfVFhfU1RBVFVTX0VMX1NUUlVDVCAqKWNhcmQtPnUuYy50eGJ1Zl9iYXNlCisJCSsgKHR4X2NvbmZpZy0+bnVtYmVyX1R4X3N0YXR1c19lbGVtZW50cyAtIDEpOworICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5yeGJ1Zl9iYXNlID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisJCShyeF9jb25maWctPmJhc2VfYWRkcl9SeF9zdGF0dXNfZWxlbWVudHMgJSBTRExBX1dJTkRPV1NJWkUpKTsKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMucnhidWZfbGFzdCA9IAorCQkoQ0hETENfREFUQV9SWF9TVEFUVVNfRUxfU1RSVUNUICopY2FyZC0+dS5jLnJ4YnVmX2Jhc2UKKwkJKyAocnhfY29uZmlnLT5udW1iZXJfUnhfc3RhdHVzX2VsZW1lbnRzIC0gMSk7CisKKyAgICAgICAgICAgICAgICAgLyogU2V0IHVwIG5leHQgcG9pbnRlciB0byBiZSB1c2VkICovCisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnR4YnVmID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisJCSh0eF9jb25maWctPm5leHRfVHhfc3RhdHVzX2VsZW1lbnRfdG9fdXNlICUgU0RMQV9XSU5ET1dTSVpFKSk7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnJ4bWIgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJKHJ4X2NvbmZpZy0+bmV4dF9SeF9zdGF0dXNfZWxlbWVudF90b191c2UgJSBTRExBX1dJTkRPV1NJWkUpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldHVwIEFjdHVhbCBCdWZmZXIgU3RhcnQgYW5kIGVuZCBhZGRyZXNzZXMgKi8KKyAgICAgICAgY2FyZC0+dS5jLnJ4X2Jhc2UgPSByeF9jb25maWctPmJhc2VfYWRkcl9SeF9idWZmZXI7CisgICAgICAgIGNhcmQtPnUuYy5yeF90b3AgID0gcnhfY29uZmlnLT5lbmRfYWRkcl9SeF9idWZmZXI7CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUGVyZm9ybSBJbnRlcnJ1cHQgVGVzdCBieSBydW5uaW5nIFJFQURfQ0hETENfQ09ERV9WRVJTSU9OIGNvbW1hbmQgTUFYX0lOVFIKKyAqIF9URVNUX0NPVU5URVIgdGltZXMuCisgKi8KK3N0YXRpYyBpbnQgaW50cl90ZXN0KCBzZGxhX3QqIGNhcmQpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyLGk7CisKKwlJbnRyX3Rlc3RfY291bnRlciA9IDA7CisJCisJZXJyID0gY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLCBBUFBfSU5UX09OX0NPTU1BTkRfQ09NUExFVEUpOworCisJaWYgKGVyciA9PSBDTURfT0spIHsgCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfSU5UUl9URVNUX0NPVU5URVI7IGkgKyspIHsJCisJCQltYi0+YnVmZmVyX2xlbmd0aCAgPSAwOworCQkJbWItPmNvbW1hbmQgPSBSRUFEX0NIRExDX0NPREVfVkVSU0lPTjsKKwkJCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwkJCWlmIChlcnIgIT0gQ01EX09LKSAKKwkJCQljaGRsY19lcnJvcihjYXJkLCBlcnIsIG1iKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBjaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsIDApOworCisJaWYgKGVyciAhPSBDTURfT0spCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVybWluZSB3aGF0IHR5cGUgb2YgVURQIGNhbGwgaXQgaXMuIENQSVBFQUIgPworICovCitzdGF0aWMgaW50IHVkcF9wa3RfdHlwZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzZGxhX3QqIGNhcmQpCit7CisJIGNoZGxjX3VkcF9wa3RfdCAqY2hkbGNfdWRwX3BrdCA9IChjaGRsY191ZHBfcGt0X3QgKilza2ItPmRhdGE7CisKKyNpZmRlZiBfV0FOX1VEUF9ERUJVRworCQlwcmludGsoS0VSTl9JTkZPICJTSUcgJXMgPSAlc1xuXAorCQkJCSAgVVBQICV4ID0gJXhcblwKKwkJCQkgIFBSVCAleCA9ICV4XG5cCisJCQkJICBSRVEgJWkgPSAlaVxuXAorCQkJCSAgMzYgdGggPSAleCAzN3RoID0gJXhcbiIsCisJCQkJICBjaGRsY191ZHBfcGt0LT53cF9tZ210LnNpZ25hdHVyZSwKKwkJCQkgIFVEUE1HTVRfU0lHTkFUVVJFLAorCQkJCSAgY2hkbGNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQsCisJCQkJICBudG9ocyhjYXJkLT53YW5kZXYudWRwX3BvcnQpLAorCQkJCSAgY2hkbGNfdWRwX3BrdC0+aXBfcGt0LnByb3RvY29sLAorCQkJCSAgVURQTUdNVF9VRFBfUFJPVE9DT0wsCisJCQkJICBjaGRsY191ZHBfcGt0LT53cF9tZ210LnJlcXVlc3RfcmVwbHksCisJCQkJICBVRFBNR01UX1JFUVVFU1QsCisJCQkJICBza2ItPmRhdGFbMzZdLCBza2ItPmRhdGFbMzddKTsKKyNlbmRpZgkKKwkJCisJaWYgKCFzdHJuY21wKGNoZGxjX3VkcF9wa3QtPndwX21nbXQuc2lnbmF0dXJlLFVEUE1HTVRfU0lHTkFUVVJFLDgpICYmCisJICAgKGNoZGxjX3VkcF9wa3QtPnVkcF9wa3QudWRwX2RzdF9wb3J0ID09IG50b2hzKGNhcmQtPndhbmRldi51ZHBfcG9ydCkpICYmCisJICAgKGNoZGxjX3VkcF9wa3QtPmlwX3BrdC5wcm90b2NvbCA9PSBVRFBNR01UX1VEUF9QUk9UT0NPTCkgJiYKKwkgICAoY2hkbGNfdWRwX3BrdC0+d3BfbWdtdC5yZXF1ZXN0X3JlcGx5ID09IFVEUE1HTVRfUkVRVUVTVCkpIHsKKworCQlyZXR1cm4gVURQX0NQSVBFX1RZUEU7CisKKwl9ZWxzZXsgCisJCXJldHVybiBVRFBfSU5WQUxJRF9UWVBFOworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgUE9SVCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgcG9ydF9zZXRfc3RhdGUgKHNkbGFfdCAqY2FyZCwgaW50IHN0YXRlKQoreworICAgICAgICBpZiAoY2FyZC0+dS5jLnN0YXRlICE9IHN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBXQU5fQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrIChLRVJOX0lORk8gIiVzOiBMaW5rIGNvbm5lY3RlZCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgIAlicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgV0FOX0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsgKEtFUk5fSU5GTyAiJXM6IExpbmsgY29ubmVjdGluZy4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgV0FOX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoS0VSTl9JTkZPICIlczogTGluayBkaXNjb25uZWN0ZWQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhcmQtPndhbmRldi5zdGF0ZSA9IGNhcmQtPnUuYy5zdGF0ZSA9IHN0YXRlOworCQlpZiAoY2FyZC0+d2FuZGV2LmRldil7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwkJCWNoZGxjX3ByaXZhdGVfYXJlYV90ICpjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJCQljaGRsY19wcml2X2FyZWEtPmNvbW1vbi5zdGF0ZSA9IHN0YXRlOworCQl9CisgICAgICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGNvbmZpZ19jaGRsYworICoKKyAqCUNvbmZpZ3VyZSB0aGUgY2hkbGMgcHJvdG9jb2wgYW5kIGVuYWJsZSBjb21tdW5pY2F0aW9ucy4JCQorICoKKyAqICAgCVRoZSBpZl9vcGVuKCkgZnVuY3Rpb24gYmluZHMgdGhpcyBmdW5jdGlvbiB0byB0aGUgcG9sbCByb3V0aW5lLgorICogICAgICBUaGVyZWZvcmUsIHRoaXMgZnVuY3Rpb24gd2lsbCBydW4gZXZlcnkgdGltZSB0aGUgY2hkbGMgaW50ZXJmYWNlCisgKiAgICAgIGlzIGJyb3VnaHQgdXAuIFdlIGNhbm5vdCBydW4gdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSBpZl9vcGVuIAorICogICAgICBiZWNhdXNlIGlmX29wZW4gZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHJlbW90ZSBJUCBhZGRyZXNzLgorICogICAgICAKKyAqCUlmIHRoZSBjb21tdW5pY2F0aW9ucyBhcmUgbm90IGVuYWJsZWQsIHByb2NlZWQgdG8gY29uZmlndXJlCisgKiAgICAgIHRoZSBjYXJkIGFuZCBlbmFibGUgY29tbXVuaWNhdGlvbnMuCisgKgorICogICAgICBJZiB0aGUgY29tbXVuaWNhdGlvbnMgYXJlIGVuYWJsZWQsIGl0IG1lYW5zIHRoYXQgdGhlIGludGVyZmFjZQorICogICAgICB3YXMgc2h1dGRvd24gYnkgZXRoZXIgdGhlIHVzZXIgb3IgZHJpdmVyLiBJbiB0aGlzIGNhc2UsIHdlIAorICogICAgICBoYXZlIHRvIGNoZWNrIHRoYXQgdGhlIElQIGFkZHJlc3NlcyBoYXZlIG5vdCBjaGFuZ2VkLiAgSWYKKyAqICAgICAgdGhlIElQIGFkZHJlc3NlcyBoYXZlIGNoYW5nZWQsIHdlIGhhdmUgdG8gcmVjb25maWd1cmUgdGhlIGZpcm13YXJlCisgKiAgICAgIGFuZCB1cGRhdGUgdGhlIGNoYW5nZWQgSVAgYWRkcmVzc2VzLiAgT3RoZXJ3aXNlLCBqdXN0IGV4aXQuCisgKgorICovCisKK3N0YXRpYyBpbnQgY29uZmlnX2NoZGxjIChzZGxhX3QgKmNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNhcmQtPndhbmRldi5kZXY7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKmNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKworCWlmIChjYXJkLT51LmMuY29tbV9lbmFibGVkKXsKKworCQkvKiBKdW4gMjAuIDIwMDA6IE5DCisJCSAqIElQIGFkZHJlc3NlcyBhcmUgbm90IHVzZWQgaW4gdGhlIEFQSSBtb2RlICovCisJCQorCQlpZiAoKGNoZGxjX3ByaXZfYXJlYS0+aXBfbG9jYWxfdG1wICE9IGNoZGxjX3ByaXZfYXJlYS0+aXBfbG9jYWwgfHwKKwkJICAgICBjaGRsY19wcml2X2FyZWEtPmlwX3JlbW90ZV90bXAgIT0gY2hkbGNfcHJpdl9hcmVhLT5pcF9yZW1vdGUpICYmIAorCQkgICAgIGNhcmQtPnUuYy51c2VkYnkgPT0gV0FOUElQRSkgeworCQkJCisJCQkvKiBUaGUgSVAgYWRkZXJzc2VzIGhhdmUgY2hhbmdlZCwgd2UgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICogc3RvcCB0aGUgY29tbXVuaWNhdGlvbnMgYW5kIHJlY29uZmlndXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgY2FyZC4gUmVhc29uOiB0aGUgZmlybXdhcmUgbXVzdCBrbm93CisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgbG9jYWwgYW5kIHJlbW90ZSBJUCBhZGRyZXNzZXMuICovCisJCQlkaXNhYmxlX2NvbW0oY2FyZCk7CisJCQlwb3J0X3NldF9zdGF0ZShjYXJkLCBXQU5fRElTQ09OTkVDVEVEKTsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBJUCBhZGRyZXNzZXMgY2hhbmdlZCFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IFJlc3RhcnRpbmcgY29tbXVuaWNhdGlvbnMgLi4uXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJfWVsc2V7IAorCQkJLyogSVAgYWRkcmVzc2VzIGFyZSB0aGUgc2FtZSBhbmQgdGhlIGxpbmsgaXMgdXAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICogd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBoZXJlLiBUaGVyZWZvcmUsIGV4aXQgKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorCisJY2hkbGNfcHJpdl9hcmVhLT5pcF9sb2NhbCA9IGNoZGxjX3ByaXZfYXJlYS0+aXBfbG9jYWxfdG1wOworCWNoZGxjX3ByaXZfYXJlYS0+aXBfcmVtb3RlID0gY2hkbGNfcHJpdl9hcmVhLT5pcF9yZW1vdGVfdG1wOworCisKKwkvKiBTZXR1cCB0aGUgQm9hcmQgZm9yIGFzeW5jaHJvbm91cyBtb2RlICovCisJaWYgKGNhcmQtPnUuYy5hc3luY19tb2RlKXsKKwkJCisJCWlmIChzZXRfYXN5X2NvbmZpZyhjYXJkKSkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBGYWlsZWQgQ0hETEMgQXN5bmMgY29uZmlndXJhdGlvbiFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX1lbHNleworCQkvKiBTZXR1cCB0aGUgQm9hcmQgZm9yIENIRExDICovCisJCWlmIChzZXRfY2hkbGNfY29uZmlnKGNhcmQpKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCBDSERMQyBjb25maWd1cmF0aW9uIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogU2V0IGludGVycnVwdCBtb2RlIGFuZCBtYXNrICovCisgICAgICAgIGlmIChjaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsIEFQUF9JTlRfT05fUlhfRlJBTUUgfAorICAgICAgICAgICAgICAgIAkJQVBQX0lOVF9PTl9HTE9CQUxfRVhDRVBfQ09ORCB8CisgICAgICAgICAgICAgICAgCQlBUFBfSU5UX09OX1RYX0ZSQU1FIHwKKyAgICAgICAgICAgICAgICAJCUFQUF9JTlRfT05fQ0hETENfRVhDRVBfQ09ORCB8IEFQUF9JTlRfT05fVElNRVIpKXsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gc2V0IGludGVycnVwdCB0cmlnZ2VycyFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAwOwkKKyAgICAgICAgfQorCQorCisJLyogTWFzayB0aGUgVHJhbnNtaXQgYW5kIFRpbWVyIGludGVycnVwdCAqLworCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gJj0gCisJCX4oQVBQX0lOVF9PTl9UWF9GUkFNRSB8IEFQUF9JTlRfT05fVElNRVIpOworCisJLyogSW4gVFRZIG1vZGUsIHJlY2VpdmUgaW50ZXJydXB0IHdpbGwgYmUgZW5hYmxlZCBkdXJpbmcKKwkgKiB3YW5waXBlX3R0eV9vcGVuKCkgb3BlcmF0aW9uICovCisJaWYgKGNhcmQtPnR0eV9vcHQpeworCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uICY9IH5BUFBfSU5UX09OX1JYX0ZSQU1FOworCX0KKworCS8qIEVuYWJsZSBjb21tdW5pY2F0aW9ucyAqLworIAlpZiAoY2FyZC0+dS5jLmFzeW5jX21vZGUpeworCQlpZiAoYXN5X2NvbW1fZW5hYmxlKGNhcmQpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGFzeW5jIGNvbW1udW5pY2F0aW9uIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uID0gMDsKKwkJCWNhcmQtPnUuYy5jb21tX2VuYWJsZWQ9MDsKKwkJCWNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwwKTsKKwkJCXJldHVybiAwOworCQl9CisgICAgICAgIH1lbHNleyAKKwkJaWYgKGNoZGxjX2NvbW1fZW5hYmxlKGNhcmQpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGNoZGxjIGNvbW11bmljYXRpb25zIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uID0gMDsKKwkJCWNhcmQtPnUuYy5jb21tX2VuYWJsZWQ9MDsKKwkJCWNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwwKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSBSeC9UeCBidWZmZXIgY29udHJvbCBmaWVsZHMgKi8KKwlpbml0X2NoZGxjX3R4X3J4X2J1ZmYoY2FyZCk7CisJcG9ydF9zZXRfc3RhdGUoY2FyZCwgV0FOX0NPTk5FQ1RJTkcpOworCXJldHVybiAwOyAKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogY2hkbGNfcG9sbAorICoJCisgKiBSYXRpb25hbGU6CisgKiAJV2UgY2Fubm90IG1hbmlwdWxhdGUgdGhlIHJvdXRpbmcgdGFibGVzLCBvcgorICogICAgICBpcCBhZGRyZXNzZXMgd2l0aGluZyB0aGUgaW50ZXJydXB0LiBUaGVyZWZvcmUKKyAqICAgICAgd2UgbXVzdCBwZXJmb3JtIHN1Y2ggYWN0b25zIG91dHNpZGUgYW4gaW50ZXJydXB0IAorICogICAgICBhdCBhIGxhdGVyIHRpbWUuIAorICoKKyAqIERlc2NyaXB0aW9uOgkKKyAqCUNIRExDIHBvbGxpbmcgcm91dGluZSwgcmVzcG9uc2libGUgZm9yIAorICogICAgIAlzaHV0dGluZyBkb3duIGludGVyZmFjZXMgdXBvbiBkaXNjb25uZWN0CisgKiAgICAgCWFuZCBhZGRpbmcvcmVtb3Zpbmcgcm91dGVzLiAKKyAqICAgICAgCisgKiBVc2FnZTogICAgICAgIAorICogCVRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZm9yIGVhY2ggQ0hETEMgIAorICogCWludGVyZmFjZSB0aHJvdWdoIGEgdHFfc2NoZWR1bGUgYm90dG9tIGhhbGYuCisgKiAgICAgIAorICogICAgICB0cmlnZ2VyX2NoZGxjX3BvbGwoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGtpY2sKKyAqICAgICAgdGhlIGNobGRjX3BvbGwgcm91dGluZS4gIAorICovCisKK3N0YXRpYyB2b2lkIGNoZGxjX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwljaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhOworCXNkbGFfdCAqY2FyZDsKKwl1OCBjaGVja19nYXRld2F5PTA7CQorCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QqIGZsYWdzOworCisJCisJaWYgKCFkZXYgfHwgKGNoZGxjX3ByaXZfYXJlYT1kZXYtPnByaXYpID09IE5VTEwpCisJCXJldHVybjsKKworCWNhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisJZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisJCisJLyogKFJlKUNvbmZpZ3VyYWl0b24gaXMgaW4gcHJvZ3Jlc3MsIHN0b3Agd2hhdCB5b3UgYXJlIAorCSAqIGRvaW5nIGFuZCBnZXQgb3V0ICovCisJaWYgKHRlc3RfYml0KFBFUklfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisJCWNsZWFyX2JpdChQT0xMX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCXJldHVybjsKKwl9CisJCisJLyogaWZfb3BlbigpIGZ1bmN0aW9uIGhhcyB0cmlnZ2VyZWQgdGhlIHBvbGxpbmcgcm91dGluZQorCSAqIHRvIGRldGVybWluZSB0aGUgY29uZmlndXJlZCBJUCBhZGRyZXNzZXMuICBPbmNlIHRoZQorCSAqIGFkZHJlc3NlcyBhcmUgZm91bmQsIHRyaWdnZXIgdGhlIGNoZGxjIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAodGVzdF9iaXQoMCwmY2hkbGNfcHJpdl9hcmVhLT5jb25maWdfY2hkbGMpKXsKKworCQljaGRsY19wcml2X2FyZWEtPmlwX2xvY2FsX3RtcCAgPSBnZXRfaXBfYWRkcmVzcyhkZXYsV0FOX0xPQ0FMX0lQKTsKKwkJY2hkbGNfcHJpdl9hcmVhLT5pcF9yZW1vdGVfdG1wID0gZ2V0X2lwX2FkZHJlc3MoZGV2LFdBTl9QT0lOVE9QT0lOVF9JUCk7CisJCisJICAgICAgIC8qIEp1biAyMC4gMjAwMCBCdWcgRml4CisJIAkqIE9ubHkgcGVyZm9ybSB0aGlzIGNoZWNrIGluIFdBTlBJUEUgbW9kZSwgc2luY2UKKwkgCSogSVAgYWRkcmVzc2VzIGFyZSBub3QgdXNlZCBpbiB0aGUgQVBJIG1vZGUuICovCisJCisJCWlmIChjaGRsY19wcml2X2FyZWEtPmlwX2xvY2FsX3RtcCA9PSBjaGRsY19wcml2X2FyZWEtPmlwX3JlbW90ZV90bXAgJiYgCisJCSAgICBjYXJkLT51LmMuc2xhcnBfdGltZXIgPT0gMHgwMCAmJiAKKwkJICAgICFjYXJkLT51LmMuYmFja3VwICYmIAorCQkgICAgY2FyZC0+dS5jLnVzZWRieSA9PSBXQU5QSVBFKXsKKworCQkJaWYgKCsrY2hkbGNfcHJpdl9hcmVhLT5pcF9lcnJvciA+IE1BWF9JUF9FUlJPUlMpeworCQkJCXByaW50ayhLRVJOX0lORk8gIlxuJXM6IC0tLSBXQVJOSU5HIC0tLVxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBUaGUgbG9jYWwgSVAgYWRkcmVzcyBpcyB0aGUgc2FtZSBhcyB0aGVcbiIsCisJCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogUG9pbnQtdG8tUG9pbnQgSVAgYWRkcmVzcy5cbiIsCisJCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogLS0tIFdBUk5JTkcgLS0tXG5cbiIsCisJCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCX1lbHNleworCQkJCWNsZWFyX2JpdChQT0xMX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCQkJY2hkbGNfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzK0haOworCQkJCWFkZF90aW1lcigmY2hkbGNfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQljbGVhcl9iaXQoMCwmY2hkbGNfcHJpdl9hcmVhLT5jb25maWdfY2hkbGMpOworCQljbGVhcl9iaXQoUE9MTF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQkKKwkJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfQ09ORklHOworCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uIHw9IEFQUF9JTlRfT05fVElNRVI7CisJCXJldHVybjsKKwl9CisJLyogRHluYW1pYyBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24sIGFzIHdlbGwgYXMgZHluYW1pYworCSAqIHJvdXRpbmcuICAqLworCQorCXN3aXRjaCAoY2FyZC0+dS5jLnN0YXRlKXsKKworCWNhc2UgV0FOX0RJU0NPTk5FQ1RFRDoKKworCQkvKiBJZiB0aGUgZHluYW1pYyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBpcyBvbiwgYW5kIGludGVyZmFjZSAKKwkJICogaXMgdXAsIHRoZW4gYnJpbmcgZG93biB0aGUgbmV0b3dyayBpbnRlcmZhY2UgKi8KKwkJCisJCWlmICh0ZXN0X2JpdChEWU5fT1BUX09OLCZjaGRsY19wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKSAmJiAKKwkJICAgICF0ZXN0X2JpdChERVZfRE9XTiwgICZjaGRsY19wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKSAmJgkJCisJCSAgICBjYXJkLT53YW5kZXYuZGV2LT5mbGFncyAmIElGRl9VUCl7CQorCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJmYWNlICVzIGRvd24uXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsY2FyZC0+d2FuZGV2LmRldi0+bmFtZSk7CisJCQljaGFuZ2VfZGV2X2ZsYWdzKGNhcmQtPndhbmRldi5kZXYsKGNhcmQtPndhbmRldi5kZXYtPmZsYWdzJn5JRkZfVVApKTsKKwkJCXNldF9iaXQoREVWX0RPV04sJmNoZGxjX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pOworCQkJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZV9zdGF0dXMgPSBOT19ST1VURTsKKworCQl9ZWxzZXsKKwkJCS8qIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGxvY2FsIElQIGFkZHJlc3MgaXMKKyAgICAgICAgICAgICAgIAkgIAkgKiB6ZXJvLiBJZiBpdCBpcywgd2Ugc2hvdWxkbid0IHRyeSB0byByZW1vdmUgaXQuCisgICAgICAgICAgICAgICAgIAkgKi8KKworCQkJaWYgKGNhcmQtPndhbmRldi5kZXYtPmZsYWdzICYgSUZGX1VQICYmIAorCQkgICAgCSAgICBnZXRfaXBfYWRkcmVzcyhjYXJkLT53YW5kZXYuZGV2LFdBTl9MT0NBTF9JUCkgJiYgCisJCSAgICAJICAgIGNoZGxjX3ByaXZfYXJlYS0+cm91dGVfc3RhdHVzICE9IE5PX1JPVVRFICYmCisJCQkgICAgY2FyZC0+dS5jLnNsYXJwX3RpbWVyKXsKKworCQkJCXByb2Nlc3Nfcm91dGUoY2FyZCk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdBTl9DT05ORUNURUQ6CisKKwkJLyogSW4gU01QIG1hY2hpbmUgdGhpcyBjb2RlIGNhbiBleGVjdXRlIGJlZm9yZSB0aGUgaW50ZXJmYWNlCisJCSAqIGNvbWVzIHVwLiAgSW4gdGhpcyBjYXNlLCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdAorCQkgKiB0cnkgdG8gYnJpbmcgdXAgdGhlIGludGVyZmFjZSBiZWZvcmUgZGV2X29wZW4oKSBpcyBmaW5pc2hlZCAqLworCisKKwkJLyogREVWX0RPV04gd2lsbCBiZSBzZXQgb25seSB3aGVuIHdlIGJyaW5nIGRvd24gdGhlIGludGVyZmFjZQorCQkgKiBmb3IgdGhlIHZlcnkgZmlyc3QgdGltZS4gVGhpcyB3YXkgd2Uga25vdyB0aGF0IGl0IHdhcyB1cworCQkgKiB0aGF0IGJyb3VnaHQgdGhlIGludGVyZmFjZSBkb3duICovCisJCQorCQlpZiAodGVzdF9iaXQoRFlOX09QVF9PTiwmY2hkbGNfcHJpdl9hcmVhLT5pbnRlcmZhY2VfZG93bikgJiYKKwkJICAgIHRlc3RfYml0KERFVl9ET1dOLCAgJmNoZGxjX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pICYmCisJCSAgICAhKGNhcmQtPndhbmRldi5kZXYtPmZsYWdzICYgSUZGX1VQKSl7CisJCQkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcmZhY2UgJXMgdXAuXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsY2FyZC0+d2FuZGV2LmRldi0+bmFtZSk7CisJCQljaGFuZ2VfZGV2X2ZsYWdzKGNhcmQtPndhbmRldi5kZXYsKGNhcmQtPndhbmRldi5kZXYtPmZsYWdzfElGRl9VUCkpOworCQkJY2xlYXJfYml0KERFVl9ET1dOLCZjaGRsY19wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKTsKKwkJCWNoZWNrX2dhdGV3YXk9MTsKKwkJfQorCisJCWlmIChjaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cyA9PSBBRERfUk9VVEUgJiYgCisJCSAgICBjYXJkLT51LmMuc2xhcnBfdGltZXIpeyAKKworCQkJcHJvY2Vzc19yb3V0ZShjYXJkKTsKKwkJCWNoZWNrX2dhdGV3YXk9MTsKKwkJfQorCisJCWlmIChjaGRsY19wcml2X2FyZWEtPmdhdGV3YXkgJiYgY2hlY2tfZ2F0ZXdheSkKKwkJCWFkZF9nYXRld2F5KGNhcmQsZGV2KTsKKworCQlicmVhazsKKwl9CQorCisJY2xlYXJfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHRyaWdnZXJfY2hkbGNfcG9sbAorICoKKyAqIERlc2NyaXB0aW9uOgorICogCUFkZCBhIGNoZGxjX3BvbGwoKSB3b3JrIGVudHJ5IGludG8gdGhlIGtldmVudGQgd29yayBxdWV1ZQorICogICAgICBmb3IgYSBzcGVjaWZpYyBkbGNpL2ludGVyZmFjZS4gIFRoaXMgd2lsbCBraWNrCisgKiAgICAgIHRoZSBmcl9wb2xsKCkgcm91dGluZSBhdCBhIGxhdGVyIHRpbWUuIAorICoKKyAqIFVzYWdlOgorICogCUludGVycnVwdHMgdXNlIHRoaXMgdG8gZGVmZXIgYSB0YWtzIHRvIAorICogICAgICBhIHBvbGxpbmcgcm91dGluZS4KKyAqCisgKi8JCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2NoZGxjX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwljaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhOworCXNkbGFfdCAqY2FyZDsKKworCWlmICghZGV2KQorCQlyZXR1cm47CisJCisJaWYgKChjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXYpPT1OVUxMKQorCQlyZXR1cm47CisKKwljYXJkID0gY2hkbGNfcHJpdl9hcmVhLT5jYXJkOworCQorCWlmICh0ZXN0X2FuZF9zZXRfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisJCXJldHVybjsKKwl9CisJaWYgKHRlc3RfYml0KFBFUklfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisJCXJldHVybjsgCisJfQorCXNjaGVkdWxlX3dvcmsoJmNoZGxjX3ByaXZfYXJlYS0+cG9sbF93b3JrKTsKK30KKworCitzdGF0aWMgdm9pZCBjaGRsY19wb2xsX2RlbGF5ICh1bnNpZ25lZCBsb25nIGRldl9wdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9wdHI7CisJdHJpZ2dlcl9jaGRsY19wb2xsKGRldik7Cit9CisKKwordm9pZCBzNTA4X2xvY2sgKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKQoreworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT53YW5kZXYubG9jaywgKnNtcF9mbGFncyk7CisgICAgICAgIGlmIChjYXJkLT5uZXh0KXsKKyAgICAgICAgCXNwaW5fbG9jaygmY2FyZC0+bmV4dC0+d2FuZGV2LmxvY2spOworCX0KK30KKwordm9pZCBzNTA4X3VubG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisgICAgICAgIGlmIChjYXJkLT5uZXh0KXsKKyAgICAgICAgCXNwaW5fdW5sb2NrKCZjYXJkLT5uZXh0LT53YW5kZXYubG9jayk7CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+d2FuZGV2LmxvY2ssICpzbXBfZmxhZ3MpOworfQorCisvLyoqKioqKioqKioqIFRUWSBTRUNUSU9OICoqKioqKioqKioqKioqKioKKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfdHJpZ2dlcl90eF9pcnEoc2RsYV90ICpjYXJkKQoreworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCUlOVEVSUlVQVF9JTkZPUk1BVElPTl9TVFJVQ1QgKmNoZGxjX2ludCA9ICZmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0OworCWNoZGxjX2ludC0+aW50ZXJydXB0X3Blcm1pc3Npb24gfD0gQVBQX0lOVF9PTl9UWF9GUkFNRTsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfdHJpZ2dlcl9wb2xsKHNkbGFfdCAqY2FyZCkKK3sKKwlzY2hlZHVsZV93b3JrKCZjYXJkLT50dHlfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIHR0eV9wb2xsX3dvcmsgKHZvaWQqIGRhdGEpCit7CisJc2RsYV90ICpjYXJkID0gKHNkbGFfdCopZGF0YTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCisJaWYgKCh0dHk9Y2FyZC0+dHR5KT09TlVMTCkKKwkJcmV0dXJuOworCQorCXR0eV93YWtldXAodHR5KTsKKyNpZiBkZWZpbmVkKFNFUklBTF9IQVZFX1BPTExfV0FJVCkKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+cG9sbF93YWl0KTsKKyNlbmRpZgkKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzZGxhX3QgKmNhcmQ7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M7CisJCisJaWYgKCF0dHkgfHwgIXR0eS0+ZHJpdmVyX2RhdGEpeworCQlyZXR1cm47CisJfQorCQorCWNhcmQgPSAoc2RsYV90Kil0dHktPmRyaXZlcl9kYXRhOworCQorCWlmICghY2FyZCkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENsb3NpbmcgVFRZIERyaXZlciFcbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKworCS8qIFNhbml0eSBDaGVjayAqLworCWlmICghY2FyZC0+dHR5X29wZW4pCisJCXJldHVybjsKKwkKKwl3YW5waXBlX2Nsb3NlKGNhcmQpOworCWlmICgtLWNhcmQtPnR0eV9vcGVuID09IDApeworCisJCWxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOwkKKwkJY2FyZC0+dHR5PU5VTEw7CisJCWNoZGxjX2Rpc2FibGVfY29tbV9zaHV0ZG93bihjYXJkKTsKKwkJdW5sb2NrX2FkYXB0ZXJfaXJxKCZjYXJkLT53YW5kZXYubG9jaywmc21wX2ZsYWdzKTsKKworCQlpZiAoY2FyZC0+dHR5X2J1Zil7CisJCQlrZnJlZShjYXJkLT50dHlfYnVmKTsKKwkJCWNhcmQtPnR0eV9idWY9TlVMTDsJCQkKKwkJfQorCisJCWlmIChjYXJkLT50dHlfcngpeworCQkJa2ZyZWUoY2FyZC0+dHR5X3J4KTsKKwkJCWNhcmQtPnR0eV9yeD1OVUxMOworCQl9CisJfQorCXJldHVybjsKK30KK3N0YXRpYyBpbnQgd2FucGlwZV90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M7CisJc2RsYV90ICpjYXJkOworCQorCWlmICghdHR5KXsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCQorCWlmICghdHR5LT5kcml2ZXJfZGF0YSl7CisJCWludCBwb3J0OworCQlwb3J0ID0gdHR5LT5pbmRleDsKKwkJaWYgKChwb3J0IDwgMCkgfHwgKHBvcnQgPj0gTlJfUE9SVFMpKSAKKwkJCXJldHVybiAtRU5PREVWOworCQkKKwkJdHR5LT5kcml2ZXJfZGF0YSA9IFdBTl9DQVJEKHBvcnQpOworCQlpZiAoIXR0eS0+ZHJpdmVyX2RhdGEpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljYXJkID0gKHNkbGFfdCopdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghY2FyZCl7CisJCWxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOwkKKwkJY2FyZC0+dHR5PU5VTEw7CisJCXVubG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBPcGVuaW5nIFRUWSBEcml2ZXIhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSk7CisKKwlpZiAoY2FyZC0+dHR5X29wZW4gPT0gMCl7CisJCWxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOwkKKwkJY2FyZC0+dHR5PXR0eTsKKwkJdW5sb2NrX2FkYXB0ZXJfaXJxKCZjYXJkLT53YW5kZXYubG9jaywmc21wX2ZsYWdzKTsKKworCQlpZiAoIWNhcmQtPnR0eV9idWYpeworCQkJY2FyZC0+dHR5X2J1ZiA9IGttYWxsb2MoVFRZX0NIRExDX01BWF9NVFUsIEdGUF9LRVJORUwpOworCQkJaWYgKCFjYXJkLT50dHlfYnVmKXsKKwkJCQljYXJkLT50dHlfYnVmPU5VTEw7CisJCQkJY2FyZC0+dHR5PU5VTEw7CisJCQkJcmV0dXJuIC1FTk9NRU07CQorCQkJfQorCQl9CisKKwkJaWYgKCFjYXJkLT50dHlfcngpeworCQkJY2FyZC0+dHR5X3J4ID0ga21hbGxvYyhUVFlfQ0hETENfTUFYX01UVSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWNhcmQtPnR0eV9yeCl7CisJCQkJLyogRnJlZSB0aGUgYnVmZmVyIGFib3ZlICovCisJCQkJa2ZyZWUoY2FyZC0+dHR5X2J1Zik7CisJCQkJY2FyZC0+dHR5X2J1Zj1OVUxMOworCQkJCWNhcmQtPnR0eT1OVUxMOworCQkJCXJldHVybiAtRU5PTUVNOwkKKwkJCX0KKwkJfQorCX0KKworCSsrY2FyZC0+dHR5X29wZW47CisJd2FucGlwZV9vcGVuKGNhcmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdhbnBpcGVfdHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFncz0wOworCXNkbGFfdCAqY2FyZD1OVUxMOworCisJaWYgKCF0dHkpeworCQlkYmdfcHJpbnRrKEtFUk5fSU5GTyAiTk8gVFRZIGluIFdyaXRlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY2FyZCA9IChzZGxhX3QgKil0dHktPmRyaXZlcl9kYXRhOworCQkJCisJaWYgKCFjYXJkKXsKKwkJZGJnX3ByaW50ayhLRVJOX0lORk8gIk5vIENhcmQgaW4gVFRZIFdyaXRlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQkKKworCWlmIChjb3VudCA+IGNhcmQtPndhbmRldi5tdHUpeworCQlkYmdfcHJpbnRrKEtFUk5fSU5GTyAiRnJhbWUgdG9vIGJpZyBpbiBXcml0ZSAlaSBNYXg6ICVpXG4iLAorCQkJCWNvdW50LGNhcmQtPndhbmRldi5tdHUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJCisJaWYgKGNhcmQtPndhbmRldi5zdGF0ZSAhPSBXQU5fQ09OTkVDVEVEKXsKKwkJZGJnX3ByaW50ayhLRVJOX0lORk8gIkNhcmQgbm90IGNvbm5lY3RlZCBpbiBUVFkgV3JpdGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBMb2NrIHRoZSA1MDggQ2FyZDogU01QIGlzIHN1cHBvcnRlZCAqLworICAgICAgCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KXsKKwkJczUwOF9sb2NrKGNhcmQsJnNtcF9mbGFncyk7CisJfSAKKwkKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChTRU5EX0NSSVQsKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENyaXRpY2FsIGluIFRUWSBXcml0ZVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCisJCS8qIExvY2sgdGhlIDUwOCBDYXJkOiBTTVAgaXMgc3VwcG9ydGVkICovCisJCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KQorCQkJczUwOF91bmxvY2soY2FyZCwmc21wX2ZsYWdzKTsKKwkJCisJCXJldHVybiAtRUlOVkFMOyAKKwl9CisJCisgCWlmIChjaGRsY19zZW5kKGNhcmQsKHZvaWQqKWJ1Zixjb3VudCkpeworCQlkYmdfcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBzZW5kLCByZXRyeSBsYXRlcjoga2VybmVsIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJY2xlYXJfYml0KFNFTkRfQ1JJVCwodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisKKwkJd2FucGlwZV90dHlfdHJpZ2dlcl90eF9pcnEoY2FyZCk7CisJCQorCQlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCkKKwkJCXM1MDhfdW5sb2NrKGNhcmQsJnNtcF9mbGFncyk7CisJCXJldHVybiAwOworCX0KKwlkYmdfcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBhY2tldCBzZW50IE9LOiAlaVxuIixjYXJkLT5kZXZuYW1lLGNvdW50KTsKKwljbGVhcl9iaXQoU0VORF9DUklULCh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkKKwlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCkKKwkJczUwOF91bmxvY2soY2FyZCwmc21wX2ZsYWdzKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfcmVjZWl2ZShzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGFkZHIsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgb2Zmc2V0PTA7CisJdW5zaWduZWQgb2xlbj1sZW47CisJY2hhciBmcD0wOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJaW50IGk7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisJCisJaWYgKCFjYXJkLT50dHlfb3Blbil7CisJCWRiZ19wcmludGsoS0VSTl9JTkZPICIlczogVFRZIG5vdCBvcGVuIGR1cmluZyByZWNlaXZlXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm47CisJfQorCQorCWlmICgodHR5PWNhcmQtPnR0eSkgPT0gTlVMTCl7CisJCWRiZ19wcmludGsoS0VSTl9JTkZPICIlczogTm8gVFRZIG9uIHJlY2VpdmVcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybjsKKwl9CisJCisJaWYgKCF0dHktPmRyaXZlcl9kYXRhKXsKKwkJZGJnX3ByaW50ayhLRVJOX0lORk8gIiVzOiBObyBEcml2ZXIgRGF0YSwgb3IgRmxpcCBvbiByZWNlaXZlXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm47CisJfQorCQorCisJaWYgKGNhcmQtPnUuYy5hc3luY19tb2RlKXsKKwkJaWYgKCh0dHktPmZsaXAuY291bnQrbGVuKSA+PSBUVFlfRkxJUEJVRl9TSVpFKXsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeworCQkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJCSIlczogUmVjZWl2ZWQgcGFja2V0IHNpemUgdG9vIGJpZzogJWkgYnl0ZXMsIE1heDogJWkhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLGxlbixUVFlfRkxJUEJVRl9TSVpFKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCisJCQorCQlpZigoYWRkciArIGxlbikgPiBjYXJkLT51LmMucnhfdG9wICsgMSkgeworCQkJb2Zmc2V0ID0gY2FyZC0+dS5jLnJ4X3RvcCAtIGFkZHIgKyAxOworCQkJCisJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBhZGRyLCB0dHktPmZsaXAuY2hhcl9idWZfcHRyLCBvZmZzZXQpOworCQkJCisJCQlhZGRyID0gY2FyZC0+dS5jLnJ4X2Jhc2U7CisJCQlsZW4gLT0gb2Zmc2V0OworCQkJCisJCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKz1vZmZzZXQ7CisJCQl0dHktPmZsaXAuY291bnQrPW9mZnNldDsKKwkJCWZvciAoaT0wO2k8b2Zmc2V0O2krKyl7CisJCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSAwOworCQkJCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKzsKKwkJCX0KKwkJfQorCQkKKwkJc2RsYV9wZWVrKCZjYXJkLT5odywgYWRkciwgdHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwgbGVuKTsKKwkJCQorCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyKz1sZW47CisJCWNhcmQtPnR0eS0+ZmxpcC5jb3VudCs9bGVuOworCQlmb3IgKGk9MDtpPGxlbjtpKyspeworCQkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgPSAwOworCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOworCQl9CisKKwkJdHR5LT5sb3dfbGF0ZW5jeT0xOworCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCX1lbHNleworCQlpZiAoIWNhcmQtPnR0eV9yeCl7CQorCQkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IFJlY2VpdmUgc3luYyBidWZmZXIgbm90IGF2YWlsYWJsZSFcbiIsCisJCQkJIGNhcmQtPmRldm5hbWUpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCisJCWlmIChsZW4gPiBUVFlfQ0hETENfTUFYX01UVSl7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKXsKKwkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogUmVjZWl2ZWQgcGFja2V0IHNpemUgdG9vIGJpZzogJWkgYnl0ZXMsIE1heDogJWkhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLGxlbixUVFlfRkxJUEJVRl9TSVpFKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCisJCQorCQlpZigoYWRkciArIGxlbikgPiBjYXJkLT51LmMucnhfdG9wICsgMSkgeworCQkJb2Zmc2V0ID0gY2FyZC0+dS5jLnJ4X3RvcCAtIGFkZHIgKyAxOworCQkJCisJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBhZGRyLCBjYXJkLT50dHlfcngsIG9mZnNldCk7CisJCQkKKwkJCWFkZHIgPSBjYXJkLT51LmMucnhfYmFzZTsKKwkJCWxlbiAtPSBvZmZzZXQ7CisJCX0KKwkJc2RsYV9wZWVrKCZjYXJkLT5odywgYWRkciwgY2FyZC0+dHR5X3J4K29mZnNldCwgbGVuKTsKKwkJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJCWlmIChsZCkgeworCQkJaWYgKGxkLT5yZWNlaXZlX2J1ZikKKwkJCQlsZC0+cmVjZWl2ZV9idWYodHR5LGNhcmQtPnR0eV9yeCwmZnAsb2xlbik7CisJCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCQl9ZWxzZXsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeworCQkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJCSIlczogTk8gVFRZIFN5bmMgbGluZSBkaXNjaXBsaW5lIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQl9CisJCX0KKwl9CisKKwlkYmdfcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlY2VpdmVkIERhdGEgJWlcbiIsY2FyZC0+ZGV2bmFtZSxvbGVuKTsKKwlyZXR1cm47Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IHdhbnBpcGVfdHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKwkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3R0eSAoc2RsYV90ICpjYXJkKQoreworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCisJLyogU2V0dXAgdGhlIEJvYXJkIGZvciBhc3luY2hyb25vdXMgbW9kZSAqLworCWlmIChjYXJkLT51LmMuYXN5bmNfbW9kZSl7CisJCQorCQlpZiAoc2V0X2FzeV9jb25maWcoY2FyZCkpIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPICIlczogRmFpbGVkIENIRExDIEFzeW5jIGNvbmZpZ3VyYXRpb24hXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9ZWxzZXsKKwkJLyogU2V0dXAgdGhlIEJvYXJkIGZvciBDSERMQyAqLworCQlpZiAoc2V0X2NoZGxjX2NvbmZpZyhjYXJkKSkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBGYWlsZWQgQ0hETEMgY29uZmlndXJhdGlvbiFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIFNldCBpbnRlcnJ1cHQgbW9kZSBhbmQgbWFzayAqLworICAgICAgICBpZiAoY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLCBBUFBfSU5UX09OX1JYX0ZSQU1FIHwKKyAgICAgICAgICAgICAgICAJCUFQUF9JTlRfT05fR0xPQkFMX0VYQ0VQX0NPTkQgfAorICAgICAgICAgICAgICAgIAkJQVBQX0lOVF9PTl9UWF9GUkFNRSB8CisgICAgICAgICAgICAgICAgCQlBUFBfSU5UX09OX0NIRExDX0VYQ0VQX0NPTkQgfCBBUFBfSU5UX09OX1RJTUVSKSl7CisJCXByaW50ayAoS0VSTl9JTkZPICIlczogRmFpbGVkIHRvIHNldCBpbnRlcnJ1cHQgdHJpZ2dlcnMhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsJCisgICAgICAgIH0KKwkKKworCS8qIE1hc2sgdGhlIFRyYW5zbWl0IGFuZCBUaW1lciBpbnRlcnJ1cHQgKi8KKwlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uICY9IAorCQl+KEFQUF9JTlRfT05fVFhfRlJBTUUgfCBBUFBfSU5UX09OX1RJTUVSKTsKKworCQorCS8qIEVuYWJsZSBjb21tdW5pY2F0aW9ucyAqLworIAlpZiAoY2FyZC0+dS5jLmFzeW5jX21vZGUpeworCQlpZiAoYXN5X2NvbW1fZW5hYmxlKGNhcmQpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGFzeW5jIGNvbW1udW5pY2F0aW9uIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uID0gMDsKKwkJCWNhcmQtPnUuYy5jb21tX2VuYWJsZWQ9MDsKKwkJCWNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwwKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisgICAgICAgIH1lbHNleyAKKwkJaWYgKGNoZGxjX2NvbW1fZW5hYmxlKGNhcmQpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGNoZGxjIGNvbW11bmljYXRpb25zIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uID0gMDsKKwkJCWNhcmQtPnUuYy5jb21tX2VuYWJsZWQ9MDsKKwkJCWNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwwKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSBSeC9UeCBidWZmZXIgY29udHJvbCBmaWVsZHMgKi8KKwlpbml0X2NoZGxjX3R4X3J4X2J1ZmYoY2FyZCk7CisJcG9ydF9zZXRfc3RhdGUoY2FyZCwgV0FOX0NPTk5FQ1RJTkcpOworCXJldHVybiAwOyAKK30KKworCitzdGF0aWMgaW50IGNoYW5nZV9zcGVlZChzZGxhX3QgKmNhcmQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCWludAliYXVkLCByZXQ9MDsKKwl1bnNpZ25lZCBjZmxhZzsgCisJaW50CWRiaXRzLHNiaXRzLHBhcml0eSxoYW5kc2hha2luZzsKKworCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJLyogVGhlcmUgaXMgYWx3YXlzIG9uZSBzdG9wIGJpdCAqLworCXNiaXRzPVdBTk9QVF9PTkU7CisJCisJLyogUGFyaXR5IGlzIGRlZmF1bHRlZCB0byBOT05FICovCisJcGFyaXR5ID0gV0FOT1BUX05PTkU7CisKKwloYW5kc2hha2luZz0wOworCQorCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCisJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJICAgICAgY2FzZSBDUzU6IGRiaXRzID0gNTsgYnJlYWs7CisJICAgICAgY2FzZSBDUzY6IGRiaXRzID0gNjsgYnJlYWs7CisJICAgICAgY2FzZSBDUzc6IGRiaXRzID0gNzsgYnJlYWs7CisJICAgICAgY2FzZSBDUzg6IGRiaXRzID0gODsgYnJlYWs7CisJICAgICAgLyogTmV2ZXIgaGFwcGVucywgYnV0IEdDQyBpcyB0b28gZHVtYiB0byBmaWd1cmUgaXQgb3V0ICovCisJICAgICAgZGVmYXVsdDogIGRiaXRzID0gODsgYnJlYWs7CisJfQorCQorCS8qIE9uZSBtb3JlIHN0b3AgYml0IHNob3VsZCBiZSBzdXBwb3J0ZWQsIHRodXMgaW5jcmVtZW50CisJICogdGhlIG51bWJlciBvZiBzdG9wIGJpdHMgTWF4PTIgKi8KKwlpZiAoY2ZsYWcgJiBDU1RPUEIpIHsKKwkJc2JpdHMgPSBXQU5PUFRfVFdPOworCX0KKwlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKKwkJcGFyaXR5ID0gV0FOT1BUX0VWRU47CisJfQorCWlmIChjZmxhZyAmIFBBUk9ERCl7CisJCXBhcml0eSA9IFdBTk9QVF9PREQ7CisJfQorCisJLyogRGV0ZXJtaW5lIGRpdmlzb3IgYmFzZWQgb24gYmF1ZCByYXRlICovCisJYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKHR0eSk7CisKKwlpZiAoIWJhdWQpCisJCWJhdWQgPSA5NjAwOwkvKiBCMCB0cmFuc2l0aW9uIGhhbmRsZWQgaW4gcnNfc2V0X3Rlcm1pb3MgKi8KKworCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKKwkJaGFuZHNoYWtpbmd8PUFTWV9SVFNfSFNfRk9SX1JYOworCX0KKwkKKwlpZiAoSV9JR05QQVIodHR5KSkKKwkJcGFyaXR5ID0gV0FOT1BUX05PTkU7CisKKwlpZiAoSV9JWE9GRih0dHkpKXsKKwkJaGFuZHNoYWtpbmd8PUFTWV9YT05fWE9GRl9IU19GT1JfUlg7CisJCWhhbmRzaGFraW5nfD1BU1lfWE9OX1hPRkZfSFNfRk9SX1RYOworCX0KKworCWlmIChJX0lYT04odHR5KSl7CisJCWhhbmRzaGFraW5nfD1BU1lfWE9OX1hPRkZfSFNfRk9SX1JYOworCQloYW5kc2hha2luZ3w9QVNZX1hPTl9YT0ZGX0hTX0ZPUl9UWDsKKwl9CisKKwlpZiAoY2FyZC0+dS5jLmFzeW5jX21vZGUpeworCQlpZiAoY2FyZC0+d2FuZGV2LmJwcyAhPSBiYXVkKQorCQkJcmV0PTE7CisJCWNhcmQtPndhbmRldi5icHMgPSBiYXVkOworCX0KKworCWlmIChjYXJkLT51LmMuYXN5bmNfbW9kZSl7CisJCWlmIChjYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyAhPSBoYW5kc2hha2luZykKKwkJCXJldD0xOworCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyA9IGhhbmRzaGFraW5nOworCisJCWlmIChjYXJkLT51LmMudHhfYml0c19wZXJfY2hhciAhPSBkYml0cykKKwkJCXJldD0xOworCQljYXJkLT51LmMudHhfYml0c19wZXJfY2hhciA9IGRiaXRzOworCisJCWlmIChjYXJkLT51LmMucnhfYml0c19wZXJfY2hhciAhPSBkYml0cykKKwkJCXJldD0xOworCQljYXJkLT51LmMucnhfYml0c19wZXJfY2hhciA9IGRiaXRzOworCQkKKwkJaWYgKGNhcmQtPnUuYy5zdG9wX2JpdHMgIT0gc2JpdHMpCisJCQlyZXQ9MTsKKwkJY2FyZC0+dS5jLnN0b3BfYml0cyA9IHNiaXRzOworCisJCWlmIChjYXJkLT51LmMucGFyaXR5ICE9IHBhcml0eSkKKwkJCXJldD0xOworCQljYXJkLT51LmMucGFyaXR5ID0gcGFyaXR5OwkKKworCQljYXJkLT51LmMuYnJlYWtfdGltZXIgPSA1MDsKKwkJY2FyZC0+dS5jLmludGVyX2NoYXJfdGltZXIgPSAxMDsKKwkJY2FyZC0+dS5jLnJ4X2NvbXBsZXRlX2xlbmd0aCA9IDEwMDsKKwkJY2FyZC0+dS5jLnhvbl9jaGFyID0gMHhGRTsKKwl9ZWxzZXsKKwkJY2FyZC0+dS5jLnByb3RvY29sX29wdGlvbnMgPSBIRExDX1NUUkVBTUlOR19NT0RFOworCX0KKwkKKwlyZXR1cm4gcmV0OworfQorCisJCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJc2RsYV90ICpjYXJkOworCWludCBlcnI9MTsKKworCWlmICghdHR5KXsKKwkJcmV0dXJuOworCX0KKworCWNhcmQgPSAoc2RsYV90ICopdHR5LT5kcml2ZXJfZGF0YTsKKwkJCQorCWlmICghY2FyZCkKKwkJcmV0dXJuOworCisJaWYgKGNoYW5nZV9zcGVlZChjYXJkLCB0dHksIG9sZF90ZXJtaW9zKSB8fCAhY2FyZC0+dS5jLmNvbW1fZW5hYmxlZCl7CisJCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzOworCQkKKwkJaWYgKGNhcmQtPnUuYy5jb21tX2VuYWJsZWQpeworCQkJbG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CisJCQljaGRsY19kaXNhYmxlX2NvbW1fc2h1dGRvd24oY2FyZCk7CisJCQl1bmxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOworCQl9CisJCWxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOworCQllcnIgPSBjb25maWdfdHR5KGNhcmQpOworCQl1bmxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOworCQlpZiAoY2FyZC0+dS5jLmFzeW5jX21vZGUpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRUWSBBc3luYyBDb25maWd1cmF0aW9uOlxuIgorCQkJCSAiICAgQmF1ZCAgICAgICAgPSVpXG4iCisJCQkJICIgICBIYW5kc2hha2luZyA9JXNcbiIKKwkJCQkgIiAgIFR4IERiaXRzICAgID0laVxuIgorCQkJCSAiICAgUnggRGJpdHMgICAgPSVpXG4iCisJCQkJICIgICBQYXJpdHkgICAgICA9JXNcbiIKKwkJCQkgIiAgIFN0b3AgQml0cyAgID0laVxuIiwKKwkJCQkgY2FyZC0+ZGV2bmFtZSwKKwkJCQkgY2FyZC0+d2FuZGV2LmJwcywKKwkJCQkgb3B0X2RlY29kZVtjYXJkLT51LmMucHJvdG9jb2xfb3B0aW9uc10sCisJCQkJIGNhcmQtPnUuYy50eF9iaXRzX3Blcl9jaGFyLAorCQkJCSBjYXJkLT51LmMucnhfYml0c19wZXJfY2hhciwKKwkJCQkgcF9kZWNvZGVbY2FyZC0+dS5jLnBhcml0eV0gLAorCQkJCSBjYXJkLT51LmMuc3RvcF9iaXRzKTsKKwkJfWVsc2V7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVFRZIFN5bmMgQ29uZmlndXJhdGlvbjpcbiIKKwkJCQkgIiAgIEJhdWQgICAgICAgID0laVxuIgorCQkJCSAiICAgUHJvdG9jb2wgICAgPUhETENfU1RSRUFNSU5HXG4iLAorCQkJCSBjYXJkLT5kZXZuYW1lLGNhcmQtPndhbmRldi5icHMpOworCQl9CisJCWlmICghZXJyKXsKKwkJCXBvcnRfc2V0X3N0YXRlKGNhcmQsV0FOX0NPTk5FQ1RFRCk7CisJCX1lbHNleworCQkJcG9ydF9zZXRfc3RhdGUoY2FyZCxXQU5fRElTQ09OTkVDVEVEKTsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdHR5X3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCit7CisJc2RsYV90ICpjYXJkOworCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzPTA7CisKKwlpZiAoIXR0eSl7CisJCXJldHVybjsKKwl9CisJCisJY2FyZCA9IChzZGxhX3QgKil0dHktPmRyaXZlcl9kYXRhOworCQkJCisJaWYgKCFjYXJkKQorCQlyZXR1cm47CisKKwlpZiAoY2FyZC0+d2FuZGV2LnN0YXRlICE9IFdBTl9DT05ORUNURUQpCisJCXJldHVybjsKKworCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KQorCQlzNTA4X2xvY2soY2FyZCwmc21wX2ZsYWdzKTsKKwkKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChTRU5EX0NSSVQsKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJCisJCXdhbnBpcGVfdHR5X3RyaWdnZXJfdHhfaXJxKGNhcmQpOworCisJCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KQorCQkJczUwOF91bmxvY2soY2FyZCwmc21wX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjaGRsY19zZW5kKGNhcmQsKHZvaWQqKSZjaCwxKSl7CisJCXdhbnBpcGVfdHR5X3RyaWdnZXJfdHhfaXJxKGNhcmQpOworCQlkYmdfcHJpbnRrKCIlczogRmFpbGVkIHRvIFRYIGNoYXIhXG4iLGNhcmQtPmRldm5hbWUpOworCX0KKwkKKwlkYmdfcHJpbnRrKCIlczogQ2hhciBUWCBPS1xuIixjYXJkLT5kZXZuYW1lKTsKKwkKKwljbGVhcl9iaXQoU0VORF9DUklULCh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkKKwlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCkKKwkJczUwOF91bmxvY2soY2FyZCwmc21wX2ZsYWdzKTsKKwkKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdHR5X2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCQorI2lmIGRlZmluZWQoU0VSSUFMX0hBVkVfUE9MTF9XQUlUKQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT5wb2xsX3dhaXQpOworI2VuZGlmCisJdHR5X3dha2V1cCh0dHkpOworCXJldHVybjsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGEgaGlnaC1wcmlvcml0eSBYT04vWE9GRiBjaGFyYWN0ZXIgdG8KKyAqIHRoZSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfc2VuZF94Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKQoreworCXJldHVybjsKK30KKworCitzdGF0aWMgaW50IHdhbnBpcGVfdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgd2FucGlwZV90dHlfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXNkbGFfdCAqY2FyZDsKKworCXByaW50ayhLRVJOX0lORk8gIlRUWSBXcml0ZSBSb29tXG4iKTsKKwkKKwlpZiAoIXR0eSl7CisJCXJldHVybiAwOworCX0KKworCWNhcmQgPSAoc2RsYV90ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIWNhcmQpCisJCXJldHVybiAwOworCisJaWYgKGNhcmQtPndhbmRldi5zdGF0ZSAhPSBXQU5fQ09OTkVDVEVEKQorCQlyZXR1cm4gMDsKKwkKKwlyZXR1cm4gU0VDX01BWF9OT19EQVRBX0JZVEVTX0lOX0ZSQU1FOworfQorCisKK3N0YXRpYyBpbnQgc2V0X21vZGVtX3N0YXR1cyhzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCAqbWIgPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltYi0+YnVmZmVyX2xlbmd0aD0xOworCW1iLT5jb21tYW5kPVNFVF9NT0RFTV9TVEFUVVM7CisJbWItPmRhdGFbMF09ZGF0YTsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJaWYgKGVyciAhPSBDT01NQU5EX09LKSAKKwkJY2hkbGNfZXJyb3IgKGNhcmQsIGVyciwgbWIpOworCQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXNkbGFfdCAqY2FyZDsKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKworCXByaW50ayhLRVJOX0lORk8gIlRUWSBIYW5ndXAhXG4iKTsKKwkKKwlpZiAoIXR0eSl7CisJCXJldHVybjsKKwl9CisKKwljYXJkID0gKHNkbGFfdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKCFjYXJkKQorCQlyZXR1cm47CisKKwlsb2NrX2FkYXB0ZXJfaXJxKCZjYXJkLT53YW5kZXYubG9jaywmc21wX2ZsYWdzKTsKKwlzZXRfbW9kZW1fc3RhdHVzKGNhcmQsMCk7CisJdW5sb2NrX2FkYXB0ZXJfaXJxKCZjYXJkLT53YW5kZXYubG9jaywmc21wX2ZsYWdzKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdHR5X2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdHR5X3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdHR5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3sKKwlyZXR1cm47Cit9CisKK2ludCB3YW5waXBlX3R0eV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwKKwkJIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXJldHVybiAwOworfQorCisvKgorICogVGhlIHNlcmlhbCBkcml2ZXIgYm9vdC10aW1lIGluaXRpYWxpemF0aW9uIGNvZGUhCisgKi8KK2ludCB3YW5waXBlX3R0eV9pbml0KHNkbGFfdCAqY2FyZCkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0YXRlICogc3RhdGU7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgdHR5X2RyaXZlciBzdHJ1Y3R1cmUgKi8KKworCWlmIChjYXJkLT50dHlfbWlub3IgPCAwIHx8IGNhcmQtPnR0eV9taW5vciA+IE5SX1BPUlRTKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElsbGVnYWwgTWlub3IgVFRZIG51bWJlciAoMC00KTogJWlcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxjYXJkLT50dHlfbWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoV0FOX0NBUkQoY2FyZC0+dHR5X21pbm9yKSl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUVFkgTWlub3IgJWksIGFscmVhZHkgaW4gdXNlXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsY2FyZC0+dHR5X21pbm9yKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAodHR5X2luaXRfY250PT0wKXsKKwkJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUVFkgJXMgRHJpdmVyIEluaXQ6IE1ham9yICVpLCBNaW5vciBSYW5nZSAlaS0laVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLAorCQkJCWNhcmQtPnUuYy5hc3luY19tb2RlID8gIkFTWU5DIiA6ICJTWU5DIiwKKwkJCQlXQU5fVFRZX01BSk9SLE1JTl9QT1JULE1BWF9QT1JUKTsKKwkJCisJCXR0eV9kcml2ZXJfbW9kZSA9IGNhcmQtPnUuYy5hc3luY19tb2RlOworCQkKKwkJbWVtc2V0KCZzZXJpYWxfZHJpdmVyLCAwLCBzaXplb2Yoc3RydWN0IHR0eV9kcml2ZXIpKTsKKwkJc2VyaWFsX2RyaXZlci5tYWdpYyA9IFRUWV9EUklWRVJfTUFHSUM7CisJCXNlcmlhbF9kcml2ZXIub3duZXIgPSBUSElTX01PRFVMRTsKKwkJc2VyaWFsX2RyaXZlci5kcml2ZXJfbmFtZSA9ICJ3YW5waXBlX3R0eSI7IAorCQlzZXJpYWxfZHJpdmVyLm5hbWUgPSAidHR5VyI7CisJCXNlcmlhbF9kcml2ZXIubWFqb3IgPSBXQU5fVFRZX01BSk9SOworCQlzZXJpYWxfZHJpdmVyLm1pbm9yX3N0YXJ0ID0gV0FOX1RUWV9NSU5PUjsKKwkJc2VyaWFsX2RyaXZlci5udW0gPSBOUl9QT1JUUzsgCisJCXNlcmlhbF9kcml2ZXIudHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJCXNlcmlhbF9kcml2ZXIuc3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwkJCisJCXNlcmlhbF9kcml2ZXIuaW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCQlzZXJpYWxfZHJpdmVyLmluaXRfdGVybWlvcy5jX2NmbGFnID0KKwkJCUI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwkJc2VyaWFsX2RyaXZlci5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisJCQorCQlzZXJpYWxfZHJpdmVyLnJlZmNvdW50ID0gMTsJLyogIUAhQF4jXiYhISAqLworCisJCXNlcmlhbF9kcml2ZXIub3BlbiA9IHdhbnBpcGVfdHR5X29wZW47CisJCXNlcmlhbF9kcml2ZXIuY2xvc2UgPSB3YW5waXBlX3R0eV9jbG9zZTsKKwkJc2VyaWFsX2RyaXZlci53cml0ZSA9IHdhbnBpcGVfdHR5X3dyaXRlOworCQkKKwkJc2VyaWFsX2RyaXZlci5wdXRfY2hhciA9IHdhbnBpcGVfdHR5X3B1dF9jaGFyOworCQlzZXJpYWxfZHJpdmVyLmZsdXNoX2NoYXJzID0gd2FucGlwZV90dHlfZmx1c2hfY2hhcnM7CisJCXNlcmlhbF9kcml2ZXIud3JpdGVfcm9vbSA9IHdhbnBpcGVfdHR5X3dyaXRlX3Jvb207CisJCXNlcmlhbF9kcml2ZXIuY2hhcnNfaW5fYnVmZmVyID0gd2FucGlwZV90dHlfY2hhcnNfaW5fYnVmZmVyOworCQlzZXJpYWxfZHJpdmVyLmZsdXNoX2J1ZmZlciA9IHdhbnBpcGVfdHR5X2ZsdXNoX2J1ZmZlcjsKKwkJLy9zZXJpYWxfZHJpdmVyLmlvY3RsID0gd2FucGlwZV90dHlfaW9jdGw7CisJCXNlcmlhbF9kcml2ZXIudGhyb3R0bGUgPSB3YW5waXBlX3R0eV90aHJvdHRsZTsKKwkJc2VyaWFsX2RyaXZlci51bnRocm90dGxlID0gd2FucGlwZV90dHlfdW50aHJvdHRsZTsKKwkJc2VyaWFsX2RyaXZlci5zZW5kX3hjaGFyID0gd2FucGlwZV90dHlfc2VuZF94Y2hhcjsKKwkJc2VyaWFsX2RyaXZlci5zZXRfdGVybWlvcyA9IHdhbnBpcGVfdHR5X3NldF90ZXJtaW9zOworCQlzZXJpYWxfZHJpdmVyLnN0b3AgPSB3YW5waXBlX3R0eV9zdG9wOworCQlzZXJpYWxfZHJpdmVyLnN0YXJ0ID0gd2FucGlwZV90dHlfc3RhcnQ7CisJCXNlcmlhbF9kcml2ZXIuaGFuZ3VwID0gd2FucGlwZV90dHlfaGFuZ3VwOworCQlzZXJpYWxfZHJpdmVyLmJyZWFrX2N0bCA9IHdhbnBpcGVfdHR5X2JyZWFrOworCQlzZXJpYWxfZHJpdmVyLndhaXRfdW50aWxfc2VudCA9IHdhbnBpcGVfdHR5X3dhaXRfdW50aWxfc2VudDsKKwkJc2VyaWFsX2RyaXZlci5yZWFkX3Byb2MgPSB3YW5waXBlX3R0eV9yZWFkX3Byb2M7CisJCQorCQlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcigmc2VyaWFsX2RyaXZlcikpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byByZWdpc3RlciBzZXJpYWwgZHJpdmVyIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0KKwl9CisKKworCS8qIFRoZSBzdWJzZXF1ZW50IHBvcnRzIG11c3QgY29tcGx5IHRvIHRoZSBpbml0aWFsIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAodHR5X2RyaXZlcl9tb2RlICE9IGNhcmQtPnUuYy5hc3luY19tb2RlKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVycm9yOiBUVFkgRHJpdmVyIG9wZXJhdGlvbiBtb2RlIG1pc21hdGNoIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRoZSBUVFkgZHJpdmVyIGlzIGNvbmZpZ3VyZWQgZm9yICVzIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCB0dHlfZHJpdmVyX21vZGUgPyAiQVNZTkMiIDogIlNZTkMiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCXR0eV9pbml0X2NudCsrOworCQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbml0aWFsaXppbmcgVFRZICVzIERyaXZlciBNaW5vciAlaVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsCisJCQl0dHlfZHJpdmVyX21vZGUgPyAiQVNZTkMiIDogIlNZTkMiLAorCQkJY2FyZC0+dHR5X21pbm9yKTsKKwkKKwl0dHlfY2FyZF9tYXBbY2FyZC0+dHR5X21pbm9yXSA9IGNhcmQ7CisJc3RhdGUgPSAmcnNfdGFibGVbY2FyZC0+dHR5X21pbm9yXTsKKwkKKwlzdGF0ZS0+bWFnaWMgPSBTU1RBVEVfTUFHSUM7CisJc3RhdGUtPmxpbmUgPSAwOworCXN0YXRlLT50eXBlID0gUE9SVF9VTktOT1dOOworCXN0YXRlLT5jdXN0b21fZGl2aXNvciA9IDA7CisJc3RhdGUtPmNsb3NlX2RlbGF5ID0gNSpIWi8xMDsKKwlzdGF0ZS0+Y2xvc2luZ193YWl0ID0gMzAqSFo7CisJc3RhdGUtPmljb3VudC5jdHMgPSBzdGF0ZS0+aWNvdW50LmRzciA9IAorCQlzdGF0ZS0+aWNvdW50LnJuZyA9IHN0YXRlLT5pY291bnQuZGNkID0gMDsKKwlzdGF0ZS0+aWNvdW50LnJ4ID0gc3RhdGUtPmljb3VudC50eCA9IDA7CisJc3RhdGUtPmljb3VudC5mcmFtZSA9IHN0YXRlLT5pY291bnQucGFyaXR5ID0gMDsKKwlzdGF0ZS0+aWNvdW50Lm92ZXJydW4gPSBzdGF0ZS0+aWNvdW50LmJyayA9IDA7CisJc3RhdGUtPmlycSA9IGNhcmQtPndhbmRldi5pcnE7IAorCisJSU5JVF9XT1JLKCZjYXJkLT50dHlfd29yaywgdHR5X3BvbGxfd29yaywgKHZvaWQqKWNhcmQpOworCXJldHVybiAwOworfQorCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoqKioqKiBFbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhX2ZyLmMgYi9kcml2ZXJzL25ldC93YW4vc2RsYV9mci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZmNjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vc2RsYV9mci5jCkBAIC0wLDAgKzEsNTA2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHNkbGFfZnIuYwlXQU5QSVBFKHRtKSBNdWx0aXByb3RvY29sIFdBTiBMaW5rIERyaXZlci4gRnJhbWUgcmVsYXkgbW9kdWxlLgorKgorKiBBdXRob3Iocyk6CU5lbmFkIENvcmJpYyAgPG5jb3JiaWNAc2FuZ29tYS5jb20+CisqCQlHaWRlb24gSGFjaworKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk1LTIwMDEgU2FuZ29tYSBUZWNobm9sb2dpZXMgSW5jLgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBOb3YgMjMsIDIwMDAgIE5lbmFkIENvcmJpYyAgICBvIEFkZGVkIHN1cHBvcnQgZm9yIDIuNC5YIGtlcm5lbHMKKyogTm92IDE1LCAyMDAwICBEYXZpZCBSb2thdmFyZyAgCisqICAgICAgICAgICAgICAgTmVuYWQgQ29yYmljCW8gQWRkZWQgZnJhbWUgcmVsYXkgYnJpZGdpbmcgc3VwcG9ydC4KKyogCQkJCSAgT3JpZ2luYWwgY29kZSBmcm9tIE1hcmsgV2VsbHMgYW5kIEtyaXN0aWFuIEhvZmZtYW5uIGhhcworKiAJCQkJICBiZWVuIGludGVncmF0ZWQgaW50byB0aGUgZnJhbWUgcmVsYXkgZHJpdmVyLgorKiBOb3YgMTMsIDIwMDAgIE5lbmFkIENvcmJpYyAgICBvIEFkZGVkIHRydWUgaW50ZXJmYWNlIHR5cGUgZW5jb2Rpbmcgb3B0aW9uLgorKiAJCQkJICBUY3BkdW1wIGRvZXNuJ3Qgc3VwcG9ydCBGcmFtZSBSZWxheSBpbnRlZmFjZQorKiAJCQkJICB0eXBlcywgdG8gZml4IHRoaXMgdHJ1ZSB0eXBlIG9wdGlvbiB3aWxsIHNldAorKiAJCQkJICB0aGUgaW50ZXJmYWNlIHR5cGUgdG8gUkFXIElQIG1vZGUuCisqIE5vdiAwNywgMjAwMCAgTmVuYWQgQ29yYmljCW8gQWRkZWQgc2VjdXJpdHkgZmVhdHVyZXMgZm9yIFVEUCBkZWJ1Z2dpbmc6CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVueSBhbGwgYW5kIHNwZWNpZnkgYWxsb3dlZCByZXF1ZXN0cy4KKyogTm92IDA2LCAyMDAwICBOZW5hZCBDb3JiaWMJbyBXYW5waXBlIGludGVyZmFjZXMgY29uZm9ybSB0byByYXcgcGFja2V0IGludGVyZmFjZXMuICAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZlZCB0aGUgaWZfaGVhZGVyIGludG8gdGhlIGlmX3NlbmQoKSByb3V0aW5lLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpZl9oZWFkZXIoKSB3YXMgYnJlYWtpbmcgdGhlIGxpYnBjYXAgCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC4gaS5lLiBzdXBwb3J0IGZvciB0Y3BkdW1wLCBldGhlcmVhbCAuLi4KKyogT2N0IDEyLiAyMDAwICBOZW5hZCBDb3JiaWMgICAgbyBBZGRlZCBlcnJvciBtZXNzYWdlIGluIGZyX2NvbmZpZ3VyZQorKiBKdWwgMzEsIDIwMDAgIE5lbmFkIENvcmJpYwlvIEZpeGVkIHRoZSBSb3V0ZXIgVVAgVGltZS4KKyogQXByIDI4LCAyMDAwICBOZW5hZCBDb3JiaWMJbyBBZGRlZCB0aGUgb3B0aW9uIHRvIHNodXRkb3duIGFuIGludGVyZmFjZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIGNoYW5uZWwgZ2V0cyBkaXNjb25uZWN0ZWQuCisqIEFwciAyOCwgMjAwMCAgTmVuYWQgQ29yYmljIAlvIEFkZGVkIE0uR3JhbnRzIHBhdGNoOiBkaXNhbGxvdyBkdXBsaWNhdGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Ugc2V0dXBzLiAKKyogQXByIDI1LCAyMDAwICBOZW5hZCBDb3JiaWMJbyBBZGRlZCBNLkdyYW50cyBwYXRjaDogZHluYW1pY2FsbHkgYWRkL3JlbW92ZSAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZGxjaXMvaW50ZXJmYWNlcy4KKyogTWFyIDIzLCAyMDAwICBOZW5hZCBDb3JiaWMgCW8gSW1wcm92ZWQgdGFzayBxdWV1ZSwgYmggaGFuZGxpbmcuCisqIE1hciAxNiwgMjAwMAlOZW5hZCBDb3JiaWMJbyBBZGRlZCBJbnZlcnNlIEFSUCBzdXBwb3J0CisqIE1hciAxMywgMjAwMCAgTmVuYWQgQ29yYmljCW8gQWRkZWQgbmV3IHNvY2tldCBBUEkgc3VwcG9ydC4KKyogTWFyIDA2LCAyMDAwICBOZW5hZCBDb3JiaWMJbyBCdWcgRml4OiBjb3JydXB0ZWQgbWJveCByZWNvdmVyeS4KKyogRmViIDI0LCAyMDAwICBOZW5hZCBDb3JiaWMgICAgbyBGaXhlZCB1cCBGVDEgVURQIGRlYnVnZ2luZyBwcm9ibGVtLgorKiBEZXYgMTUsIDE5OTkgIE5lbmFkIENvcmJpYyAgICBvIEZpeGVkIHVwIGhlYWRlciBmaWxlcyBmb3IgMi4wLlgga2VybmVscworKgorKiBOb3YgMDgsIDE5OTkgIE5lbmFkIENvcmJpYyAgICBvIENvbWJpbmVkIGFsbCBkZWJ1ZyBVRFAgY2FsbHMgaW50byBvbmUgZnVuY3Rpb24KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBSZW1vdmVkIHRoZSBBUlAgc3VwcG9ydC4gVGhpcyBoYXMgdG8gYmUgZG9uZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBuZXh0IHZlcnNpb24uCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gT25seSBhIE5vZGUgY2FuIGltcGxlbWVudCBOTyBzaWduYWxsaW5nLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRpYWxpemUgRExDSSBkdXJpbmcgaWZfb3BlbigpIGlmIE5PIAorKgkJCQkgIHNpZ25hbGxpbmcuCisqCQkJCW8gVG9vayBvdXQgSVBYIHN1cHBvcnQsIGltcGxlbWVudCBpbiBuZXh0CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbgorKiBTZXAgMjksIDE5OTkgIE5lbmFkIENvcmJpYwlvIEFkZGVkIFNNUCBzdXBwb3J0IGFuZCBjaGFuZ2VkIHRoZSB1cGRhdGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0byB1c2UgdGltZXIgaW50ZXJydXB0LgorKgkJCQlvIEZpeGVkIHRoZSBDSVIgYnVnOiAgU2V0IHRoZSB2YWx1ZSBvZiBCQworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIENJUiB3aGVuIHRoZSBDSVIgaXMgZW5hYmxlZC4KKyogIAkJCQlvIFVwZGF0ZWQgY29tbWVudHMsIHN0YXRpc3RpY3MgYW5kIHRyYWNpbmcuCisqIEp1biAwMiwgMTk5OQlHaWRlb24gSGFjawlvIFVwZGF0ZWQgZm9yIFM1MTQgc3VwcG9ydC4KKyogU2VwIDE4LCAxOTk4CUphc3ByZWV0IFNpbmdoCW8gVXBkYXRlZCBmb3IgMi4yLlgga2VybmVscy4KKyogSnVsIDMxLCAxOTk4CUphc3ByZWV0IFNpbmdoCW8gUmVtb3ZlZCB3cGZfcG9sbCByb3V0aW5lLiAgVGhlIGNoYW5uZWwvRExDSSAKKyoJCQkJICBzdGF0dXMgaXMgcmVjZWl2ZWQgdGhyb3VnaCBhbiBldmVudCBpbnRlcnJ1cHQuCisqIEp1bCAwOCwgMTk5OAlEYXZpZCBGb25nCW8gQWRkZWQgaW52ZXJzZSBBUlAgc3VwcG9ydC4KKyogTWFyIDI2LCAxOTk3CUphc3ByZWV0IFNpbmdoCW8gUmV0dXJuaW5nIHJldHVybiBjb2RlcyBmb3IgZmFpbGVkIFVEUCBjbWRzLgorKiBKYW4gMjgsIDE5OTcJSmFzcHJlZXQgU2luZ2ggIG8gSW1wcm92ZWQgaGFuZGxpbmcgb2YgaW5hY3RpdmUgRExDSXMuCisqIERlYyAzMCwgMTk5NwlKYXNwcmVldCBTaW5naAlvIFJlcGxhY2VkIGRldl90aW50KCkgd2l0aCBtYXJrX2JoKE5FVF9CSCkKKyogRGVjIDE2LCAxOTk3CUphc3ByZWV0IFNpbmdoCW8gSW1wbGVtZW50ZWQgTXVsdGlwbGUgSVBYIHN1cHBvcnQuCisqIE5vdiAyNiwgMTk5NwlKYXNwcmVldCBTaW5naAlvIEltcHJvdmVkIGxvYWQgc2hhcmluZyB3aXRoIG11bHRpcGxlIGJvYXJkcworKgkJCQlvIEFkZGVkIENsaSgpIHRvIHByb3RlY3QgZW5hYmxpbmcgb2YgaW50ZXJydXB0cworKgkJCQkgIHdoaWxlIHBvbGxpbmcgaXMgY2FsbGVkLgorKiBOb3YgMjQsIDE5OTcJSmFzcHJlZXQgU2luZ2gJbyBBZGRlZCBjb3VudGVycyB0byBhdm9pZCBlbmFibGluZyBvZiBpbnRlcnJ1cHRzCisqCQkJCSAgd2hlbiB0aGV5IGhhdmUgYmVlbiBkaXNhYmxlZCBieSBhbm90aGVyCisqCQkJCSAgaW50ZXJmYWNlIG9yIHJvdXRpbmUgKGVnLiB3cGZfcG9sbCkuCisqIE5vdiAwNiwgMTk5NwlKYXNwcmVldCBTaW5naAlvIEFkZGVkIElOVFJfVEVTVF9NT0RFIHRvIGF2b2lkIHBvbGxpbmcJCisqCQkJCSAgcm91dGluZSBkaXNhYmxlIGludGVycnVwdHMgZHVyaW5nIGludGVycnVwdAorKgkJCQkgIHRlc3RpbmcuCisqIE9jdCAyMCwgMTk5NyAgSmFzcHJlZXQgU2luZ2ggIG8gQWRkZWQgaG9va3MgaW4gZm9yIFJvdXRlciBVUCB0aW1lLgorKiBPY3QgMTYsIDE5OTcgIEphc3ByZWV0IFNpbmdoICBvIFRoZSBjcml0aWNhbCBmbGFnIGlzIHVzZWQgdG8gbWFpbnRhaW4gZmxvdworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYnkgYXZvaWRpbmcgUkFDRSBjb25kaXRpb25zLiAgVGhlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpKCkgYW5kIHJlc3RvcmVfZmxhZ3MoKSBhcmUgdGFrZW4gb3V0LgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmcl9jaGFubmVsIHN0cnVjdHVyZSBpcyBhcHBlbmRlZCBmb3IgCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyIFN0YXRpc3RpY3MuCisqIE9jdCAxNSwgMTk5NyAgRmFyaGFuIFRoYXdhciAgICBvIHVwZGF0ZWQgaWZfc2VuZCgpIGFuZCByZWNlaXZlIGZvciBJUFgKKyogQXVnIDI5LCAxOTk3ICBGYXJoYW4gVGhhd2FyICAgIG8gUmVtb3ZlZCBtb3N0IG9mIHRoZSBjbGkoKSBhbmQgc3RpKCkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gQWJzdHJhY3RlZCB0aGUgVURQIG1hbmFnZW1lbnQgc3R1ZmYKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gTm93IHVzZSB0YnVzeSBhbmQgY3JpdGljYWwgbW9yZSBpbnRlbGxpZ2VudGx5CisqIEp1bCAyMSwgMTk5NyAgSmFzcHJlZXQgU2luZ2gJIG8gQ2FuIGNvbmZpZ3VyZSBUMzkxLCBUMzkyLCBOMzkxLCBOMzkyICYgTjM5MworKgkJCQkgICB0aHJvdWdoIHJvdXRlci5jb25mLgorKgkJCQkgbyBQcm90ZWN0ZWQgY2FsbHMgdG8gc2RsYV9wZWVrKCkgYnkgYWREaW5nIAorKgkJCQkgICBzYXZlX2ZsYWdzKCksIGNsaSgpIGFuZCByZXN0b3JlX2ZsYWdzKCkuCisqCQkJCSBvIEFkZGVkIGVycm9yIG1lc3NhZ2UgZm9yIEluYWN0aXZlIERMQ0lzIGluCisqCQkJCSAgIGZyX2V2ZW50KCkgYW5kIHVwZGF0ZV9jaGFuX3N0YXRlKCkuCisqCQkJCSBvIEZpeGVkIGZyZWVpbmcgdXAgb2YgYnVmZmVycyB1c2luZyBrZnJlZSgpIAorKgkJCSAgICAgICAgICAgd2hlbiBwYWNrZXRzIGFyZSByZWNlaXZlZC4KKyogSnVsIDA3LCAxOTk3CUphc3ByZWV0IFNpbmdoCSBvIEFkZGVkIGNvbmZpZ3VyYWJsZSBUVEwgZm9yIFVEUCBwYWNrZXRzIAorKgkJCQkgbyBBZGRlZCBhYmlsaXR5IHRvIGRpc2NhcmQgbXVsdGljYXN0IGFuZCAKKyoJCQkJICAgYnJvYWRjYXN0IHNvdXJjZSBhZGRyZXNzZWQgcGFja2V0cworKiBKdW4gMjcsIDE5OTcJSmFzcHJlZXQgU2luZ2gJIG8gQWRkZWQgRlQxIG1vbml0b3IgY2FwYWJpbGl0aWVzIAorKgkJCQkgICBOZXcgY2FzZSAoMHg0NCkgc3RhdGVtZW50IGluIGlmX3NlbmQgcm91dGluZSAKKyoJCQkJICAgQWRkZWQgYSBnbG9iYWwgdmFyaWFibGUgckNvdW50IHRvIGtlZXAgdHJhY2sKKyoJCQkgCSAgIG9mIEZUMSBzdGF0dXMgZW5hYmxlZCBvbiB0aGUgYm9hcmQuCisqIE1heSAyOSwgMTk5NwlKYXNwcmVldCBTaW5naAkgbyBGaXhlZCBtYWpvciBGbG93IENvbnRyb2wgUHJvYmxlbQorKgkJCQkgICBXaXRoIG11bHRpcGxlIGJvYXJkcyBhIHByb2JsZW0gd2FzIHNlZW4gd2hlcmUKKyoJCQkJICAgdGhlIHNlY29uZCBib2FyZCBhbHdheXMgc3RvcHBlZCB0cmFuc21pdHRpbmcKKyoJCQkJICAgcGFja2V0IGFmdGVyIHJ1bm5pbmcgZm9yIGEgd2hpbGUuIFRoZSBjb2RlCisqCQkJCSAgIGdvdCBpbnRvIGEgc3RhZ2Ugd2hlcmUgdGhlIGludGVycnVwdHMgd2VyZQorKgkJCQkgICBkaXNhYmxlZCBhbmQgZGV2LT50YnVzeSB3YXMgc2V0IHRvIDEuCisqICAgICAgICAgICAgICAgICAgCQkgICBUaGlzIGNhdXNlZCB0aGUgSWZfc2VuZCgpIHJvdXRpbmUgdG8gZ2V0IGludG8KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlmIGNsYXVzZSBmb3IgaXQoMCxkZXYtPnRidXN5KSAKKyoJCQkJICAgZm9yZXZlci4KKyoJCQkJICAgVGhlIGNvZGUgZ290IGludG8gdGhpcyBzdGFnZSBkdWUgdG8gYW4gCisqCQkJCSAgIGludGVycnVwdCBvY2N1cnJpbmcgd2l0aGluIHRoZSBpZiBjbGF1c2UgZm9yIAorKgkJCQkgICBzZXRfYml0KDAsZGV2LT50YnVzeSkuICBTaW5jZSBhbiBpbnRlcnJ1cHQgCisqCQkJCSAgIGRpc2FibGVzIGZ1cmh0ZXIgdHJhbnNtaXQgaW50ZXJydXB0IGFuZCAKKyogCQkJCSAgIG1ha2VzIGRldi0+dGJ1c3kgPSAwLCB0aGlzIGVmZmVjdCB3YXMgdW5kb25lIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBtYWtpbmcgZGV2LT50YnVzeSA9IDEgaW4gdGhlIGlmIGNsYXVzZS4KKyoJCQkJICAgVGhlIEZpeCBjaGVja3MgdG8gc2VlIGlmIFRyYW5zbWl0IGludGVycnVwdHMKKyoJCQkJICAgYXJlIGRpc2FibGVkIHRoZW4gZG8gbm90IG1ha2UgZGV2LT50YnVzeSA9IDEKKyogCSAgIAkJCSAgIEludHJvZHVjZWQgYSBnbG9iYWwgdmFyaWFibGU6IGludF9vY2N1ciBhbmQKKyoJCQkJICAgYWRkZWQgdHhfaW50X2VuYWJsZWQgaW4gdGhlIHdhbl9kZXZpY2UgCisqCQkJCSAgIHN0cnVjdHVyZS4JCisqIE1heSAyMSwgMTk5NyAgSmFzcHJlZXQgU2luZ2ggICBvIEZpeGVkIFVEUCBNYW5hZ2VtZW50IGZvciBtdWx0aXBsZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2FyZHMuCisqCisqIEFwciAyNSwgMTk5NyAgRmFyaGFuIFRoYXdhciAgICBvIGFkZGVkIFVEUCBNYW5hZ2VtZW50IHN0dWZmCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIGZpeGVkIGJ1ZyBpbiBpZl9zZW5kKCkgYW5kIHR4X2ludHIoKSB0bworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCBhbmQgd2FrZXVwIGFsbCBkZXZpY2VzCisqIE1hciAxMSwgMTk5NyAgRmFyaGFuIFRoYXdhciAgIFZlcnNpb24gMy4xLjEKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gZml4ZWQgKCsxKSBidWcgaW4gZnI1MDhfcnhfaW50cigpCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIGNoYW5nZWQgaWZfc2VuZCgpIHRvIHJldHVybiAwIGlmCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbmRldi5jcml0aWNhbCgpIGlzIHRydWUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gZnJlZSBzb2NrZXQgYnVmZmVyIGluIGlmX3NlbmQoKSBpZgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgMCAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gYWRkZWQgdHhfaW50cigpIHJvdXRpbmUKKyogSmFuIDMwLCAxOTk3CUdlbmUgS296aW4JVmVyc2lvbiAzLjEuMAorKgkJCQkgbyBpbXBsZW1lbnRlZCBleGVjKCkgZW50cnkgcG9pbnQKKyoJCQkJIG8gZml4ZWQgYSBidWcgY2F1c2luZyBkcml2ZXIgY29uZmlndXJlZCBhcworKgkJCQkgICBhIEZSIHN3aXRjaCB0byBiZSBzdHVjayBpbiBXQU5fCisqCQkJCSAgIG1vZGUKKyogSmFuIDAyLCAxOTk3CUdlbmUgS296aW4JSW5pdGlhbCB2ZXJzaW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrKCksIGFuZCBvdGhlciB1c2VmdWwgc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogb2Zmc2V0b2YoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIHJldHVybiBjb2RlcyAqLworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBpbmxpbmUgbWVtc2V0KCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CS8qIGttYWxsb2MoKSwga2ZyZWUoKSAqLworI2luY2x1ZGUgPGxpbnV4L3dhbnJvdXRlci5oPgkvKiBXQU4gcm91dGVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvd2FucGlwZS5oPgkvKiBXQU5QSVBFIGNvbW1vbiB1c2VyIEFQSSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgkvKiBBUlBIUkRfKiBkZWZpbmVzICovCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgkvKiBodG9ucygpLCBldGMuICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CQkvKiBmb3IgaW5iKCksIG91dGIoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4JIAkvKiBmb3IgZG9fZ2V0dGltZW9mZGF5ICovCQorI2luY2x1ZGUgPGxpbnV4L2luLmg+CQkvKiBzb2NrYWRkcl9pbiAqLworI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorCisjaW5jbHVkZSA8bGludXgvaWZfd2FucGlwZV9jb21tb24uaD4JLyogV2FucGlwZSBTb2NrZXQgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl93YW5waXBlLmg+CQorCisjaW5jbHVkZSA8bGludXgvc2RsYV9mci5oPgkJLyogZnJhbWUgcmVsYXkgZmlybXdhcmUgQVBJIGRlZmluaXRpb25zICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPiAgICAgICAgICAJLyogRHluYW1pYyBSb3V0ZSBDcmVhdGlvbiAqLworI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CQkvKiBldGhfdHlwZV90cmFucygpIHVzZWQgZm9yIGJyaWRnaW5nICovCisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisKKy8qKioqKiogRGVmaW5lcyAmIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lCU1BWF9DTURfUkVUUlkJMTAJCS8qIG1heCBudW1iZXIgb2YgZmlybXdhcmUgcmV0cmllcyAqLworCisjZGVmaW5lCUZSX0hFQURFUl9MRU4JOAkJLyogbWF4IGVuY2Fwc3VsYXRpb24gaGVhZGVyIHNpemUgKi8KKyNkZWZpbmUJRlJfQ0hBTk5FTF9NVFUJMTUwMAkJLyogdW5mcmFnbWVudGVkIGxvZ2ljYWwgY2hhbm5lbCBNVFUgKi8KKworLyogUS45MjIgZnJhbWUgdHlwZXMgKi8KKyNkZWZpbmUJUTkyMl9VSQkJMHgwMwkJLyogVW5udW1iZXJlZCBJbmZvIGZyYW1lICovCisjZGVmaW5lCVE5MjJfWElECTB4QUYJCQorCisvKiBETENJIGNvbmZpZ3VyZWQgb3Igbm90ICovCisjZGVmaW5lIERMQ0lfTk9UX0NPTkZJR1VSRUQJMHgwMAorI2RlZmluZSBETENJX0NPTkZJR19QRU5ESU5HCTB4MDEKKyNkZWZpbmUgRExDSV9DT05GSUdVUkVECQkweDAyCisKKy8qIENJUiBlbmFibGVkIG9yIG5vdCAqLworI2RlZmluZSBDSVJfRU5BQkxFRAkweDAwCisjZGVmaW5lIENJUl9ESVNBQkxFRAkweDAxCisKKyNkZWZpbmUgRlJBTUVfUkVMQVlfQVBJIDEKKyNkZWZpbmUgTUFYX0JIX0JVRkYJMTAKKworLyogRm9yIGhhbmRsZV9JUFhXQU4oKSAqLworI2RlZmluZSBDVkhleFRvQXNjaWkoYikgKCgodW5zaWduZWQgY2hhcikoYikgPiAodW5zaWduZWQgY2hhcik5KSA/ICgodW5zaWduZWQgY2hhciknQScgKyAoKHVuc2lnbmVkIGNoYXIpKGIpIC0gKHVuc2lnbmVkIGNoYXIpMTApKSA6ICgodW5zaWduZWQgY2hhciknMCcgKyAodW5zaWduZWQgY2hhcikoYikpKQorIAorLyoqKioqKiBEYXRhIFN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgaXMgYW4gZXh0ZW50aW9uIG9mIHRoZSAnc3RydWN0IGRldmljZScgd2UgY3JlYXRlIGZvciBlYWNoIG5ldHdvcmsKKyAqIGludGVyZmFjZSB0byBrZWVwIHRoZSByZXN0IG9mIGNoYW5uZWwtc3BlY2lmaWMgZGF0YS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZnJfY2hhbm5lbAoreworCXdhbnBpcGVfY29tbW9uX3QgY29tbW9uOworCWNoYXIgbmFtZVtXQU5fSUZOQU1FX1NaKzFdOwkvKiBpbnRlcmZhY2UgbmFtZSwgQVNDSUlaICovCisJdW5zaWduZWQgZGxjaV9jb25maWd1cmVkICA7CS8qIGNoZWNrIHdoZXRoZXIgY29uZmlndXJlZCBvciBub3QgKi8KKwl1bnNpZ25lZCBjaXJfc3RhdHVzOwkJLyogY2hlY2sgd2hldGhlciBDSVIgZW5hYmxlZCBvciBub3QgKi8KKwl1bnNpZ25lZCBkbGNpOwkJCS8qIGxvZ2ljYWwgY2hhbm5lbCBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaXI7CQkJLyogY29tbWl0dGVkIGluZm9ybWF0aW9uIHJhdGUgKi8KKwl1bnNpZ25lZCBiYzsJCQkvKiBjb21taXR0ZWQgYnVyc3Qgc2l6ZSAqLworCXVuc2lnbmVkIGJlOwkJCS8qIGV4Y2VzcyBidXJzdCBzaXplICovCisJdW5zaWduZWQgbWM7CQkJLyogbXVsdGljYXN0IHN1cHBvcnQgb24gb3Igb2ZmICovCisJdW5zaWduZWQgdHhfaW50X3N0YXR1czsJCS8qIFRyYW5zbWl0IEludGVycnVwdCBTdGF0dXMgKi8JCisJdW5zaWduZWQgc2hvcnQgcGt0X2xlbmd0aDsJLyogUGFja2V0IExlbmd0aCAqLworCXVuc2lnbmVkIGxvbmcgcm91dGVyX3N0YXJ0X3RpbWU7LyogUm91dGVyIHN0YXJ0IHRpbWUgaW4gc2Vjb25kcyAqLworCXVuc2lnbmVkIGxvbmcgdGlja19jb3VudGVyOwkvKiBjb3VudGVyIGZvciB0cmFuc21pdCB0aW1lIG91dCAqLworCWNoYXIgZGV2X3BlbmRpbmdfZGV2dGludDsJLyogaW50ZXJmYWNlIHBlbmRpbmcgZGV2X3RpbnQoKSAqLworCXZvaWQgKmRsY2lfaW50X2ludGVyZmFjZTsJLyogcG9pbnRlciB0byB0aGUgRExDSSBJbnRlcmZhY2UgKi8gCisJdW5zaWduZWQgbG9uZyBJQl9hZGRyOwkJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBJbnRlcmZhY2UgQnl0ZSAqLworCXVuc2lnbmVkIGxvbmcgc3RhdGVfdGljazsJLyogdGltZSBvZiB0aGUgbGFzdCBzdGF0ZSBjaGFuZ2UgKi8KKwl1bnNpZ25lZCBjaGFyIGVuYWJsZV9JUFg7CS8qIEVuYWJsZS9EaXNhYmxlIHRoZSB1c2Ugb2YgSVBYICovCisJdW5zaWduZWQgbG9uZyBuZXR3b3JrX251bWJlcjsJLyogSW50ZXJuYWwgTmV0d29yayBOdW1iZXIgZm9yIElQWCovCisJc2RsYV90ICpjYXJkOwkJCS8qIC0+IG93bmVyICovCisJdW5zaWduZWQgcm91dGVfZmxhZzsJCS8qIEFkZC9SZW0gZGVzdCBhZGRyIGluIHJvdXRlIHRhYmxlcyAqLworCXVuc2lnbmVkIGluYXJwOwkJCS8qIEludmVyc2UgQXJwIFJlcXVlc3Qgc3RhdHVzICovIAorCWxvbmcgaW5hcnBfcmVhZHk7CQkvKiBSZWFkeSB0byBzZW5kIHJlcXVlc3RzICovCisJaW50IGluYXJwX2ludGVydmFsOwkJLyogVGltZSBiZXR3ZWVuIEluQXJwIFJlcXVlc3RzICovCisJdW5zaWduZWQgbG9uZyBpbmFycF90aWNrOwkvKiBJbkFycCBqaWZmaWVzIHRpY2sgY291bnRlciAqLworCWxvbmcgaW50ZXJmYWNlX2Rvd247CQkvKiBCcmluZyBpbnRlcmZhY2UgZG93biBvbiBkaXNjb25uZWN0ICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgaWZzdGF0czsJLyogaW50ZXJmYWNlIHN0YXRpc3RpY3MgKi8KKwlpZl9zZW5kX3N0YXRfdCBkcnZzdGF0c19pZl9zZW5kOworICAgICAgICByeF9pbnRyX3N0YXRfdCBkcnZzdGF0c19yeF9pbnRyOworICAgICAgICBwaXBlX21nbXRfc3RhdF90IGRydnN0YXRzX2dlbjsKKwl1bnNpZ25lZCBsb25nIHJvdXRlcl91cF90aW1lOworCisJdW5zaWduZWQgc2hvcnQgdHJhbnNtaXRfbGVuZ3RoOworCXN0cnVjdCBza19idWZmICpkZWxheV9za2I7CisKKwliaF9kYXRhX3QgKmJoX2hlYWQ7CSAgCSAgLyogQ2lyY3VsYXIgYnVmZmVyIGZvciBjaGRsY19iaCAqLworCXVuc2lnbmVkIGxvbmcgIHRxX3dvcmtpbmc7CisJdm9sYXRpbGUgaW50ICBiaF93cml0ZTsKKwl2b2xhdGlsZSBpbnQgIGJoX3JlYWQ7CisJYXRvbWljX3QgIGJoX2J1ZmZfdXNlZDsKKworCS8qIFBvbGxpbmcgdGFzayBxdWV1ZS4gRWFjaCBpbnRlcmZhY2UKKyAgICAgICAgICogaGFzIGl0cyBvd24gdGFzayBxdWV1ZSwgd2hpY2ggaXMgdXNlZAorICAgICAgICAgKiB0byBkZWZlciBldmVudHMgZnJvbSB0aGUgaW50ZXJydXB0ICovCisJc3RydWN0IHdvcmtfc3RydWN0IGZyX3BvbGxfd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBmcl9hcnBfdGltZXI7CisKKwl1MzIgaXBfbG9jYWw7CisJdTMyIGlwX3JlbW90ZTsKKwlsb25nIGNvbmZpZ19kbGNpOworCWxvbmcgdW5jb25maWdfZGxjaTsKKworCS8qIFdoZXRoZXIgdGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIHNldHVwIGFzIGEgZ2F0ZXdheS4KKwkgKiBVc2VkIGJ5IGR5bmFtaWMgcm91dGUgc2V0dXAgY29kZSAqLworCXU4ICBnYXRld2F5OworCisJLyogVHJ1ZSBpbnRlcmZhY2UgdHlwZSAqLworCXU4IHRydWVfaWZfZW5jb2Rpbmc7CisJdTggZnJfaGVhZGVyW0ZSX0hFQURFUl9MRU5dOworCWNoYXIgZnJfaGVhZGVyX2xlbjsKKworfSBmcl9jaGFubmVsX3Q7CisKKy8qIFJvdXRlIEZsYWcgb3B0aW9ucyAqLworI2RlZmluZSBOT19ST1VURQkweDAwCisjZGVmaW5lIEFERF9ST1VURSAJMHgwMQorI2RlZmluZSBST1VURV9BRERFRAkweDAyCisjZGVmaW5lIFJFTU9WRV9ST1VURSAJMHgwMworI2RlZmluZSBBUlBfUkVRCQkweDA0CisKKy8qIGluYXJwIG9wdGlvbnMgKi8KKyNkZWZpbmUgSU5BUlBfTk9ORQkJMHgwMAorI2RlZmluZSBJTkFSUF9SRVFVRVNUCQkweDAxCisjZGVmaW5lIElOQVJQX0NPTkZJR1VSRUQJMHgwMgorCisvKiByZWFzb25zIGZvciBlbmFibGluZyB0aGUgdGltZXIgaW50ZXJydXB0IG9uIHRoZSBhZGFwdGVyICovCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VRFAgICAJMHgwMQorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFIAkweDAyCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9BUlAJMHgwNAorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFX1NUQVRFIAkweDA4CisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9DT05GSUcJMHgxMAorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfVU5DT05GSUcJMHgyMAorCisKK3R5cGVkZWYgc3RydWN0IGRsY2lfc3RhdHVzCit7CisJdW5zaWduZWQgc2hvcnQgZGxjaQlQQUNLRUQ7CisJdW5zaWduZWQgY2hhciBzdGF0ZQlQQUNLRUQ7Cit9IGRsY2lfc3RhdHVzX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRsY2lfSUJfbWFwcGluZworeworCXVuc2lnbmVkIHNob3J0IGRsY2kJCVBBQ0tFRDsKKwl1bnNpZ25lZCBsb25nICBhZGRyX3ZhbHVlCVBBQ0tFRDsKK30gZGxjaV9JQl9tYXBwaW5nX3Q7CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIERMQ0kgbGlzdCBUeCBpbnRlcnJ1cHQgbW9kZS4gIEl0IGlzIHVzZWQgdG8KKyAgIGVuYWJsZSBpbnRlcnJ1cHQgYml0IGFuZCBzZXQgdGhlIHBhY2tldCBsZW5ndGggZm9yIHRyYW5zbWlzc2lvbgorICovCit0eXBlZGVmIHN0cnVjdCBmcl9kbGNpX2ludGVyZmFjZSAKK3sKKwl1bnNpZ25lZCBjaGFyIGdlbl9pbnRlcnJ1cHQJUEFDS0VEOworCXVuc2lnbmVkIHNob3J0IHBhY2tldF9sZW5ndGgJUEFDS0VEOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQJCVBBQ0tFRDsKK30gZnJfZGxjaV9pbnRlcmZhY2VfdDsgCisKKy8qIHZhcmlhYmxlIGZvciBrZWVwaW5nIHRyYWNrIG9mIGVuYWJsaW5nL2Rpc2FibGluZyBGVDEgbW9uaXRvciBzdGF0dXMgKi8KK3N0YXRpYyBpbnQgckNvdW50ID0gMDsKKworZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKKworLyogdmFyaWFibGUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgbnVtYmVyIG9mIGludGVycnVwdHMgZ2VuZXJhdGVkIGR1cmluZyAKKyAqIGludGVycnVwdCB0ZXN0IHJvdXRpbmUgCisgKi8KK3N0YXRpYyBpbnQgSW50cl90ZXN0X2NvdW50ZXI7CisKKy8qKioqKiogRnVuY3Rpb24gUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBXQU4gbGluayBkcml2ZXIgZW50cnkgcG9pbnRzLiBUaGVzZSBhcmUgY2FsbGVkIGJ5IHRoZSBXQU4gcm91dGVyIG1vZHVsZS4gKi8KK3N0YXRpYyBpbnQgdXBkYXRlKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYpOworc3RhdGljIGludCBuZXdfaWYoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICB3YW5pZl9jb25mX3QgKmNvbmYpOworc3RhdGljIGludCBkZWxfaWYoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbW0gKHNkbGFfdCAqY2FyZCk7CisKKy8qIFdBTlBJUEUtc3BlY2lmaWMgZW50cnkgcG9pbnRzICovCitzdGF0aWMgaW50IHdwZl9leGVjKHN0cnVjdCBzZGxhICpjYXJkLCB2b2lkICp1X2NtZCwgdm9pZCAqdV9kYXRhKTsKKworLyogTmV0d29yayBkZXZpY2UgaW50ZXJmYWNlICovCitzdGF0aWMgaW50IGlmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlmX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBpZl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IGlmX3JlYnVpbGRfaGRyIChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworc3RhdGljIGludCBpZl9zZW5kKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBjaGtfYmNhc3RfbWNhc3RfYWRkcihzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppZl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogSW50ZXJydXB0IGhhbmRsZXJzICovCitzdGF0aWMgdm9pZCBmcl9pc3Ioc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHJ4X2ludHIoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHR4X2ludHIoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHRpbWVyX2ludHIoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHNwdXJfaW50cihzZGxhX3QgKmNhcmQpOworCisvKiBGcmFtZSByZWxheSBmaXJtd2FyZSBpbnRlcmZhY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGZyX3JlYWRfdmVyc2lvbihzZGxhX3QgKmNhcmQsIGNoYXIgKnN0cik7CitzdGF0aWMgaW50IGZyX2NvbmZpZ3VyZShzZGxhX3QgKmNhcmQsIGZyX2NvbmZfdCAqY29uZik7CitzdGF0aWMgaW50IGZyX2RsY2lfY29uZmlndXJlKHNkbGFfdCAqY2FyZCwgZnJfZGxjX2NvbmZfdCAqY29uZiwgdW5zaWduZWQgZGxjaSk7CitzdGF0aWMgaW50IGZyX2luaXRfZGxjaSAoc2RsYV90ICpjYXJkLCBmcl9jaGFubmVsX3QgKmNoYW4pOworc3RhdGljIGludCBmcl9zZXRfaW50cl9tb2RlIChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIG1vZGUsIHVuc2lnbmVkIG10dSwgdW5zaWduZWQgc2hvcnQgdGltZW91dCk7CitzdGF0aWMgaW50IGZyX2NvbW1fZW5hYmxlKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgdm9pZCBmcl9jb21tX2Rpc2FibGUoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyBpbnQgZnJfZ2V0X2Vycl9zdGF0cyhzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCBmcl9nZXRfc3RhdHMoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyBpbnQgZnJfYWRkX2RsY2koc2RsYV90ICpjYXJkLCBpbnQgZGxjaSk7CitzdGF0aWMgaW50IGZyX2FjdGl2YXRlX2RsY2koc2RsYV90ICpjYXJkLCBpbnQgZGxjaSk7CitzdGF0aWMgaW50IGZyX2RlbGV0ZV9kbGNpIChzZGxhX3QqIGNhcmQsIGludCBkbGNpKTsKK3N0YXRpYyBpbnQgZnJfaXNzdWVfaXNmKHNkbGFfdCAqY2FyZCwgaW50IGlzZik7CitzdGF0aWMgaW50IGZyX3NlbmQoc2RsYV90ICpjYXJkLCBpbnQgZGxjaSwgdW5zaWduZWQgY2hhciBhdHRyLCBpbnQgbGVuLAorCXZvaWQgKmJ1Zik7CitzdGF0aWMgaW50IGZyX3NlbmRfZGF0YV9oZWFkZXIoc2RsYV90ICpjYXJkLCBpbnQgZGxjaSwgdW5zaWduZWQgY2hhciBhdHRyLCBpbnQgbGVuLAorCXZvaWQgKmJ1Zix1bnNpZ25lZCBjaGFyIGhkcl9sZW4pOworc3RhdGljIHVuc2lnbmVkIGludCBmcl9zZW5kX2hkcihzZGxhX3QgKmNhcmQsIGludCBkbGNpLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KTsKKworc3RhdGljIGludCBjaGVja19kbGNpX2NvbmZpZyAoc2RsYV90ICpjYXJkLCBmcl9jaGFubmVsX3QgKmNoYW4pOworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9yeF90eF9idWZmZXJzIChzZGxhX3QgKmNhcmQpOworCisKKy8qIEZpcm13YXJlIGFzeW5jaHJvbm91cyBldmVudCBoYW5kbGVycyAqLworc3RhdGljIGludCBmcl9ldmVudChzZGxhX3QgKmNhcmQsIGludCBldmVudCwgZnJfbWJveF90ICptYm94KTsKK3N0YXRpYyBpbnQgZnJfbW9kZW1fZmFpbHVyZShzZGxhX3QgKmNhcmQsIGZyX21ib3hfdCAqbWJveCk7CitzdGF0aWMgaW50IGZyX2RsY2lfY2hhbmdlKHNkbGFfdCAqY2FyZCwgZnJfbWJveF90ICptYm94KTsKKworLyogTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgdXBkYXRlX2NoYW5fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfY2hhbl9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhdGUpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpmaW5kX2NoYW5uZWwoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBkbGNpKTsKK3N0YXRpYyBpbnQgaXNfdHhfcmVhZHkoc2RsYV90ICpjYXJkLCBmcl9jaGFubmVsX3QgKmNoYW4pOworc3RhdGljIHVuc2lnbmVkIGludCBkZWNfdG9fdWludCh1bnNpZ25lZCBjaGFyICpzdHIsIGludCBsZW4pOworc3RhdGljIGludCByZXBseV91ZHAoIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBtYm94X2xlbiApOworCitzdGF0aWMgaW50IGludHJfdGVzdCggc2RsYV90KiBjYXJkICk7CitzdGF0aWMgdm9pZCBpbml0X2NoYW5fc3RhdGlzdGljcyggZnJfY2hhbm5lbF90KiBjaGFuICk7CitzdGF0aWMgdm9pZCBpbml0X2dsb2JhbF9zdGF0aXN0aWNzKCBzZGxhX3QqIGNhcmQgKTsKK3N0YXRpYyB2b2lkIHJlYWRfRExDSV9JQl9tYXBwaW5nKCBzZGxhX3QqIGNhcmQsIGZyX2NoYW5uZWxfdCogY2hhbiApOworc3RhdGljIGludCBzZXR1cF9mb3JfZGVsYXllZF90cmFuc21pdChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpOworCitzdHJ1Y3QgbmV0X2RldmljZSAqbW92ZV9kZXZfdG9fbmV4dChzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBjaGVja190eF9zdGF0dXMoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogRnJhbWUgUmVsYXkgU29ja2V0IEFQSSAqLworc3RhdGljIHZvaWQgdHJpZ2dlcl9mcl9iaCAoZnJfY2hhbm5lbF90ICopOworc3RhdGljIHZvaWQgZnJfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGZyX2JoX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGJoX2VucXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfZnJfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGZyX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvL3N0YXRpYyB2b2lkIGFkZF9nYXRld2F5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCB0cmlnZ2VyX3VuY29uZmlnX2ZyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdW5jb25maWdfZnIgKHNkbGFfdCAqKTsKKworc3RhdGljIHZvaWQgdHJpZ2dlcl9jb25maWdfZnIgKHNkbGFfdCAqKTsKK3N0YXRpYyB2b2lkIGNvbmZpZ19mciAoc2RsYV90ICopOworCisKKy8qIEludmVyc2UgQVJQIGFuZCBEeW5hbWljIHJvdXRpbmcgZnVuY3Rpb25zICovCitpbnQgcHJvY2Vzc19BUlAoYXJwaGRyXzE0OTBfdCAqQXJwUGFja2V0LCBzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IGlzX2FycCh2b2lkICpidWYpOworaW50IHNlbmRfaW5hcnBfcmVxdWVzdChzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2ZyX2FycChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGZyX2FycCAodW5zaWduZWQgbG9uZyBkYXRhKTsKKworCisvKiBVZHAgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc191ZHBfbWdtdF9wa3Qoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyBpbnQgdWRwX3BrdF90eXBlKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzZGxhX3QgKmNhcmQgKTsKK3N0YXRpYyBpbnQgc3RvcmVfdWRwX21nbXRfcGt0KGludCB1ZHBfdHlwZSwgY2hhciB1ZHBfcGt0X3NyYywgc2RsYV90KiBjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZGxjaSk7CisKKy8qIElQWCBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHN3aXRjaF9uZXRfbnVtYmVycyh1bnNpZ25lZCBjaGFyICpzZW5kcGFja2V0LAorCXVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXIsIHVuc2lnbmVkIGNoYXIgaW5jb21pbmcpOworCitzdGF0aWMgaW50IGhhbmRsZV9JUFhXQU4odW5zaWduZWQgY2hhciAqc2VuZHBhY2tldCwgY2hhciAqZGV2bmFtZSwKKwl1bnNpZ25lZCBjaGFyIGVuYWJsZV9JUFgsIHVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXIpOworCisvKiBMb2NrIEZ1bmN0aW9uczogU01QIHN1cHBvcnRlZCAqLwordm9pZCAJczUwOF9zNTE0X3VubG9jayhzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncyk7Cit2b2lkIAlzNTA4X3M1MTRfbG9jayhzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncyk7CisKK3Vuc2lnbmVkIHNob3J0IGNhbGNfY2hlY2tzdW0gKGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgc2V0dXBfZnJfaGVhZGVyKHN0cnVjdCBza19idWZmKiogc2tiLAorCQkJICAgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgY2hhciBvcF9tb2RlKTsKKworCisvKioqKioqIFB1YmxpYyBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGcmFtZSByZWxheSBwcm90b2NvbCBpbml0aWFsaXphdGlvbiByb3V0aW5lLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIG1haW4gV0FOUElQRSBtb2R1bGUgZHVyaW5nIHNldHVwLiAgQXQgdGhpcworICogcG9pbnQgYWRhcHRlciBpcyBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGFuZCBmaXJtd2FyZSBpcyBydW5uaW5nLgorICogIG8gcmVhZCBmaXJtd2FyZSB2ZXJzaW9uICh0byBtYWtlIHN1cmUgaXQncyBhbGl2ZSkKKyAqICBvIGNvbmZpZ3VyZSBhZGFwdGVyCisgKiAgbyBpbml0aWFsaXplIHByb3RvY29sLXNwZWNpZmljIGZpZWxkcyBvZiB0aGUgYWRhcHRlciBkYXRhIHNwYWNlLgorICoKKyAqIFJldHVybjoJMAlvLmsuCisgKgkJPCAwCWZhaWx1cmUuCisgKi8KK2ludCB3cGZfaW5pdChzZGxhX3QgKmNhcmQsIHdhbmRldl9jb25mX3QgKmNvbmYpCit7CisKKwlpbnQgZXJyOworCWZyNTA4X2ZsYWdzX3QqIGZsYWdzOworCisJdW5pb24KKwl7CisJCWNoYXIgc3RyWzgwXTsKKwkJZnJfY29uZl90IGNmZzsKKwl9IHU7CisKKwlmcl9idWZfaW5mb190KiBidWZfaW5mbzsKKwlpbnQgaTsKKworCisJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKworCS8qIFZlcmlmeSBjb25maWd1cmF0aW9uIElEICovCisJaWYgKGNvbmYtPmNvbmZpZ19pZCAhPSBXQU5DT05GSUdfRlIpIHsKKwkJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gSUQgJXUhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgY29uZi0+Y29uZmlnX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJfQorCisJLyogSW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgb2YgYWRhcHRlciBkYXRhIHNwYWNlICovCisJc3dpdGNoIChjYXJkLT5ody5md2lkKSB7CisJCisJCWNhc2UgU0ZJRF9GUjUwODoKKwkJCWNhcmQtPm1ib3ggID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgCisJCQkJCUZSNTA4X01CT1hfT0ZGUyk7CisJCQljYXJkLT5mbGFncyA9ICh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArIAorCQkJCQlGUjUwOF9GTEFHX09GRlMpOworCQkJaWYoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpIHsKKwkJCQljYXJkLT5tYm94ICs9IEZSX01CX1ZFQ1RPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZmxhZ3MgKz0gRlJfTUJfVkVDVE9SOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+aXNyID0gJmZyX2lzcjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmbGFncyA9IGNhcmQtPmZsYWdzOworCisJLyogUmVhZCBmaXJtd2FyZSB2ZXJzaW9uLiAgTm90ZSB0aGF0IHdoZW4gYWRhcHRlciBpbml0aWFsaXplcywgaXQKKwkgKiBjbGVhcnMgdGhlIG1haWxib3gsIHNvIGl0IG1heSBhcHBlYXIgdGhhdCB0aGUgZmlyc3QgY29tbWFuZCB3YXMKKwkgKiBleGVjdXRlZCBzdWNjZXNzZnVsbHkgd2hlbiBpbiBmYWN0IGl0IHdhcyBtZXJlbHkgZXJhc2VkLiBUbyB3b3JrCisJICogYXJvdW5kIHRoaXMsIHdlIGV4ZWN1dGUgdGhlIGZpcnN0IGNvbW1hbmQgdHdpY2UuCisJICovCisKKwlpZiAoZnJfcmVhZF92ZXJzaW9uKGNhcmQsIE5VTEwpIHx8IGZyX3JlYWRfdmVyc2lvbihjYXJkLCB1LnN0cikpCisJCXJldHVybiAtRUlPOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJ1bm5pbmcgZnJhbWUgcmVsYXkgZmlybXdhcmUgdiVzXG4iLAorCQljYXJkLT5kZXZuYW1lLCB1LnN0cik7CisKKwkvKiBBZGp1c3QgY29uZmlndXJhdGlvbiAqLworCWNvbmYtPm10dSArPSBGUl9IRUFERVJfTEVOOworCWNvbmYtPm10dSA9IChjb25mLT5tdHUgPj0gTUlOX0xHVEhfRlJfREFUQV9DRkcpID8KKwkJCW1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+bXR1LCBGUl9NQVhfTk9fREFUQV9CWVRFU19JTl9GUkFNRSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgRlJfQ0hBTk5FTF9NVFUgKyBGUl9IRUFERVJfTEVOOworICAgICAKKwljb25mLT5icHMgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPmJwcywgMjA0ODAwMCk7CisKKwkvKiBJbml0aWFsemUgdGhlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIHNlbnQgdG8gdGhlIGJvYXJkIHRvIHplcm8gKi8KKwltZW1zZXQoJnUuY2ZnLCAwLCBzaXplb2YodS5jZmcpKTsKKworCW1lbXNldChjYXJkLT51LmYuZGxjaV90b19kZXZfbWFwLCAwLCBzaXplb2YoY2FyZC0+dS5mLmRsY2lfdG9fZGV2X21hcCkpOworIAkKKwkvKiBDb25maWd1cmUgYWRhcHRlciBmaXJtd2FyZSAqLworCisJdS5jZmcubXR1CT0gY29uZi0+bXR1OworCXUuY2ZnLmticHMJPSBjb25mLT5icHMgLyAxMDAwOworCisgICAgCXUuY2ZnLmNpcl9md2QgPSB1LmNmZy5jaXJfYndkID0gMTY7CisgICAgICAgIHUuY2ZnLmJjX2Z3ZCAgPSB1LmNmZy5iY19id2QgPSAxNjsKKwkKKwl1LmNmZy5vcHRpb25zCT0gMHgwMDAwOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBHbG9iYWwgQ0lSIGVuYWJsZWQgYnkgRGVmYXVsdFxuIiwgY2FyZC0+ZGV2bmFtZSk7CisJCisJc3dpdGNoIChjb25mLT51LmZyLnNpZ25hbGxpbmcpIHsKKworCQljYXNlIFdBTk9QVF9GUl9BTlNJOgorCQkJdS5jZmcub3B0aW9ucyA9IDB4MDAwMDsgCisJCQlicmVhazsJCQorCQorCQljYXNlIFdBTk9QVF9GUl9ROTMzOgkKKwkJCXUuY2ZnLm9wdGlvbnMgfD0gMHgwMjAwOyAKKwkJCWJyZWFrOworCQorCQljYXNlIFdBTk9QVF9GUl9MTUk6CQorCQkJdS5jZmcub3B0aW9ucyB8PSAweDA0MDA7IAorCQkJYnJlYWs7CisKKwkJY2FzZSBXQU5PUFRfTk86CisJCQl1LmNmZy5vcHRpb25zIHw9IDB4MDgwMDsgCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbGxlZ2FsIFNpZ25hbGxpbmcgb3B0aW9uXG4iLAorCQkJCQljYXJkLT53YW5kZXYubmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKworCWNhcmQtPndhbmRldi5zaWduYWxsaW5nID0gY29uZi0+dS5mci5zaWduYWxsaW5nOworCisJaWYgKGNvbmYtPnN0YXRpb24gPT0gV0FOT1BUX0NQRSkgeworCisKKwkJaWYgKGNvbmYtPnUuZnIuc2lnbmFsbGluZyA9PSBXQU5PUFRfTk8peworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IEVSUk9SIC0gRm9yIE5PIHNpZ25hbGxpbmcsIHN0YXRpb24gbXVzdCBiZSBzZXQgdG8gTm9kZSEiLAorCQkJCSAJIGNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQl1LmNmZy5zdGF0aW9uID0gMDsKKwkJdS5jZmcub3B0aW9ucyB8PSAweDgwMDA7CS8qIGF1dG8gY29uZmlnIERMQ0kgKi8KKwkJY2FyZC0+dS5mLmRsY2lfbnVtICA9IDA7CisJCisJfSBlbHNlIHsKKworCQl1LmNmZy5zdGF0aW9uID0gMTsJLyogc3dpdGNoIGVtdWxhdGlvbiBtb2RlICovCisKKwkJLyogRm9yIHN3aXRjaCBlbXVsYXRpb24gd2UgaGF2ZSB0byBjcmVhdGUgYSBsaXN0IG9mIGRsY2kocykKKwkJICogdGhhdCB3aWxsIGJlIHNlbnQgdG8gYmUgZ2xvYmFsIFNFVF9ETENJX0NPTkZJR1VSQVRJT04gCisJCSAqIGNvbW1hbmQgaW4gZnJfY29uZmlndXJlKCkgcm91dGluZS4gCisJCSAqLworCisJCWNhcmQtPnUuZi5kbGNpX251bSAgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIG1heF90KHVuc2lnbmVkIGludCwgY29uZi0+dS5mci5kbGNpX251bSwgMSksIDEwMCk7CisJCisJCWZvciAoIGkgPSAwOyBpIDwgY2FyZC0+dS5mLmRsY2lfbnVtOyBpKyspIHsKKworCQkJY2FyZC0+dS5mLm5vZGVfZGxjaVtpXSA9ICh1bnNpZ25lZCBzaG9ydCkgCisJCQkJY29uZi0+dS5mci5kbGNpW2ldID8gY29uZi0+dS5mci5kbGNpW2ldIDogMTY7CisJCisJCX0KKwl9CisKKwlpZiAoY29uZi0+Y2xvY2tpbmcgPT0gV0FOT1BUX0lOVEVSTkFMKQorCQl1LmNmZy5wb3J0IHw9IDB4MDAwMTsKKworCWlmIChjb25mLT5pbnRlcmZhY2UgPT0gV0FOT1BUX1JTMjMyKQorCQl1LmNmZy5wb3J0IHw9IDB4MDAwMjsKKworCWlmIChjb25mLT51LmZyLnQzOTEpCisJCXUuY2ZnLnQzOTEgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUuZnIudDM5MSwgMzApOworCWVsc2UKKwkJdS5jZmcudDM5MSA9IDU7CisKKwlpZiAoY29uZi0+dS5mci50MzkyKQorCQl1LmNmZy50MzkyID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LmZyLnQzOTIsIDMwKTsKKwllbHNlCisJCXUuY2ZnLnQzOTIgPSAxNTsKKworCWlmIChjb25mLT51LmZyLm4zOTEpCisJCXUuY2ZnLm4zOTEgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUuZnIubjM5MSwgMjU1KTsKKwllbHNlCisJCXUuY2ZnLm4zOTEgPSAyOworCisJaWYgKGNvbmYtPnUuZnIubjM5MikKKwkJdS5jZmcubjM5MiA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS5mci5uMzkyLCAxMCk7CisJZWxzZQorCQl1LmNmZy5uMzkyID0gMzsJCisKKwlpZiAoY29uZi0+dS5mci5uMzkzKQorCQl1LmNmZy5uMzkzID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LmZyLm4zOTMsIDEwKTsKKwllbHNlCisJCXUuY2ZnLm4zOTMgPSA0OworCisJaWYgKGZyX2NvbmZpZ3VyZShjYXJkLCAmdS5jZmcpKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkgeworCQorICAgICAgICAgICAgICAgIGJ1Zl9pbmZvID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgRlJfTUJfVkVDVE9SICsKKwkJCUZSNTA4X1JYQkNfT0ZGUyk7CisKKyAgICAgICAgICAgICAgICBjYXJkLT5yeG1iID0gKHZvaWQqKShidWZfaW5mby0+cnNlX25leHQgKyBjYXJkLT5ody5kcG1iYXNlKTsKKworICAgICAgICAgICAgICAgIGNhcmQtPnUuZi5yeG1iX2Jhc2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKShidWZfaW5mby0+cnNlX2Jhc2UgKyBjYXJkLT5ody5kcG1iYXNlKTsgCisKKyAgICAgICAgICAgICAgICBjYXJkLT51LmYucnhtYl9sYXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikoYnVmX2luZm8tPnJzZV9iYXNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChidWZfaW5mby0+cnNlX251bSAtIDEpICogc2l6ZW9mKGZyX3J4X2J1Zl9jdGxfdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+aHcuZHBtYmFzZSk7CisJfWVsc2V7CQorCQlidWZfaW5mbyA9ICh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArIEZSNTA4X1JYQkNfT0ZGUyk7CisKKwkJY2FyZC0+cnhtYiA9ICh2b2lkKikoYnVmX2luZm8tPnJzZV9uZXh0IC0KKwkJCUZSX01CX1ZFQ1RPUiArIGNhcmQtPmh3LmRwbWJhc2UpOworCQkKKwkJY2FyZC0+dS5mLnJ4bWJfYmFzZSA9CisJCQkodm9pZCopKGJ1Zl9pbmZvLT5yc2VfYmFzZSAtCisJCQlGUl9NQl9WRUNUT1IgKyBjYXJkLT5ody5kcG1iYXNlKTsKKwkJCisJCWNhcmQtPnUuZi5yeG1iX2xhc3QgPQorCQkJKHZvaWQqKShidWZfaW5mby0+cnNlX2Jhc2UgKworCQkJKGJ1Zl9pbmZvLT5yc2VfbnVtIC0gMSkgKiBzaXplb2YoZnJfcnhfYnVmX2N0bF90KSAtCisJCQlGUl9NQl9WRUNUT1IgKyBjYXJkLT5ody5kcG1iYXNlKTsKKwl9CisKKwljYXJkLT51LmYucnhfYmFzZSA9IGJ1Zl9pbmZvLT5idWZfYmFzZTsKKwljYXJkLT51LmYucnhfdG9wICA9IGJ1Zl9pbmZvLT5idWZfdG9wOworCisJY2FyZC0+dS5mLnR4X2ludGVycnVwdHNfcGVuZGluZyA9IDA7CisKKwljYXJkLT53YW5kZXYubXR1CT0gY29uZi0+bXR1OworCWNhcmQtPndhbmRldi5icHMJPSBjb25mLT5icHM7CisJY2FyZC0+d2FuZGV2LmludGVyZmFjZQk9IGNvbmYtPmludGVyZmFjZTsKKwljYXJkLT53YW5kZXYuY2xvY2tpbmcJPSBjb25mLT5jbG9ja2luZzsKKwljYXJkLT53YW5kZXYuc3RhdGlvbgk9IGNvbmYtPnN0YXRpb247CisJY2FyZC0+cG9sbAkJPSBOVUxMOyAKKwljYXJkLT5leGVjCQk9ICZ3cGZfZXhlYzsKKwljYXJkLT53YW5kZXYudXBkYXRlCT0gJnVwZGF0ZTsKKwljYXJkLT53YW5kZXYubmV3X2lmCT0gJm5ld19pZjsKKwljYXJkLT53YW5kZXYuZGVsX2lmCT0gJmRlbF9pZjsKKwljYXJkLT53YW5kZXYuc3RhdGUJPSBXQU5fRElTQ09OTkVDVEVEOworCWNhcmQtPndhbmRldi50dGwJPSBjb25mLT50dGw7CisgICAgICAgIGNhcmQtPndhbmRldi51ZHBfcG9ydCAJPSBjb25mLT51ZHBfcG9ydDsgICAgICAgCisJY2FyZC0+ZGlzYWJsZV9jb21tCT0gJmRpc2FibGVfY29tbTsJCisJY2FyZC0+dS5mLmFycF9kZXYgCT0gTlVMTDsKKworCS8qIEludGlhbGl6ZSBnbG9iYWwgc3RhdGlzdGljcyBmb3IgYSBjYXJkICovCisJaW5pdF9nbG9iYWxfc3RhdGlzdGljcyggY2FyZCApOworCisgICAgICAgIGNhcmQtPlRyYWNpbmdFbmFibGVkICAgICAgICAgID0gMDsKKworCS8qIEludGVycnVwdCBUZXN0ICovCisJSW50cl90ZXN0X2NvdW50ZXIgPSAwOworCWNhcmQtPmludHJfbW9kZSA9IElOVFJfVEVTVF9NT0RFOworCWVyciA9IGludHJfdGVzdCggY2FyZCApOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVuZCBvZiBJbnRlcnJ1cHQgVGVzdCByYz0weCV4ICBjb3VudD0laVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsZXJyLEludHJfdGVzdF9jb3VudGVyKTsgCisJCisJaWYgKGVyciB8fCAoSW50cl90ZXN0X2NvdW50ZXIgPCBNQVhfSU5UUl9URVNUX0NPVU5URVIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludGVycnVwdCBUZXN0IEZhaWxlZCwgQ291bnRlcjogJWlcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSwgSW50cl90ZXN0X2NvdW50ZXIpOworCQlwcmludGsoS0VSTl9FUlIgIlBsZWFzZSBjaG9vc2UgYW5vdGhlciBpbnRlcnJ1cHRcbiIpOworCQllcnIgPSAtRUlPOworCQlyZXR1cm4gZXJyOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcnJ1cHQgVGVzdCBQYXNzZWQsIENvdW50ZXI6ICVpXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgSW50cl90ZXN0X2NvdW50ZXIpOworCisKKwkvKiBBcHIgMjggMjAwMC4gTmVuYWQgQ29yYmljCisJICogRW5hYmxlIGNvbW1udW5pY2F0aW9ucyBoZXJlLCBub3QgaW4gaWZfb3BlbiBvciBuZXdfaWYsIHNpbmNlCisgICAgICAgICAqIGludGVyZmFjZXMgY29tZSBkb3duIHdoZW4gdGhlIGxpbmsgaXMgZGlzY29ubmVjdGVkLiAKKyAgICAgICAgICovCisJIAorCS8qIElmIHlvdSBlbmFibGUgY29tbXMgYW5kIHRoZW4gc2V0IGludHMsIHlvdSBnZXQgYSBUeCBpbnQgYXMgeW91CisJICogcGVyZm9ybSB0aGUgU0VUX0lOVF9UUklHR0VSUyBjb21tYW5kLiBTbywgd2Ugb25seSBzZXQgaW50CisJICogdHJpZ2dlcnMgYW5kIHRoZW4gYWRqdXN0IHRoZSBpbnRlcnJ1cHQgbWFzayAodG8gZGlzYWJsZSBUeCBpbnRzKQorCSAqIGJlZm9yZSBlbmFibGluZyBjb21tcy4gCisJICovCQorICAgICAgICBpZiAoZnJfc2V0X2ludHJfbW9kZShjYXJkLCAoRlJfSU5UUl9SWFJEWSB8IEZSX0lOVFJfVFhSRFkgfAorCQlGUl9JTlRSX0RMQyB8IEZSX0lOVFJfVElNRVIgfCBGUl9JTlRSX1RYX01VTFRfRExDSXMpICwKKwkJY2FyZC0+d2FuZGV2Lm10dSwgMCkpIHsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZmxhZ3MtPmltYXNrICY9IH4oRlJfSU5UUl9UWFJEWSB8IEZSX0lOVFJfVElNRVIpOworIAorCWlmIChmcl9jb21tX2VuYWJsZShjYXJkKSkgeworCQlyZXR1cm4gLUVJTzsKKwl9CQorCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9DT05ORUNURUQpOworCXNwaW5fbG9ja19pbml0KCZjYXJkLT51LmYuaWZfc2VuZF9sb2NrKTsKKwkKKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisgICAgICAgIHJldHVybiAwOworfQorCisvKioqKioqKiBXQU4gRGV2aWNlIERyaXZlciBFbnRyeSBQb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVcGRhdGUgZGV2aWNlIHN0YXR1cyAmIHN0YXRpc3RpY3MuCisgKi8KK3N0YXRpYyBpbnQgdXBkYXRlKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYpCit7CisJdm9sYXRpbGUgc2RsYV90KiBjYXJkOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlmcjUwOF9mbGFnc190KiBmbGFnczsKKworCS8qIHNhbml0eSBjaGVja3MgKi8KKwlpZiAoKHdhbmRldiA9PSBOVUxMKSB8fCAod2FuZGV2LT5wcml2YXRlID09IE5VTEwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICh3YW5kZXYtPnN0YXRlID09IFdBTl9VTkNPTkZJR1VSRUQpCisJCXJldHVybiAtRU5PREVWOworCisJY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKwlmbGFncyA9IGNhcmQtPmZsYWdzOworCisKKwljYXJkLT51LmYudXBkYXRlX2NvbW1zX3N0YXRzID0gMTsKKwljYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgfD0gVE1SX0lOVF9FTkFCTEVEX1VQREFURTsKKwlmbGFncy0+aW1hc2sgfD0gRlJfSU5UUl9USU1FUjsKKyAgICAgICAJdGltZW91dCA9IGppZmZpZXM7CisgICAgICAgCWZvcig7OykgeworCQlpZihjYXJkLT51LmYudXBkYXRlX2NvbW1zX3N0YXRzID09IDApCisJCQlicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoKGppZmZpZXMgLSB0aW1lb3V0KSA+ICgxICogSFopKXsKKyAgICAJCQljYXJkLT51LmYudXBkYXRlX2NvbW1zX3N0YXRzID0gMDsKKyAJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorICAgICAgICB9CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDcmVhdGUgbmV3IGxvZ2ljYWwgY2hhbm5lbC4KKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHJvdXRlciB3aGVuIFJPVVRFUl9JRk5FVyBJT0NUTCBpcyBiZWluZworICogaGFuZGxlZC4KKyAqIG8gcGFyc2UgbWVkaWEtIGFuZCBoYXJkd2FyZS1zcGVjaWZpYyBjb25maWd1cmF0aW9uCisgKiBvIG1ha2Ugc3VyZSB0aGF0IGEgbmV3IGNoYW5uZWwgY2FuIGJlIGNyZWF0ZWQKKyAqIG8gYWxsb2NhdGUgcmVzb3VyY2VzLCBpZiBuZWNlc3NhcnkKKyAqIG8gcHJlcGFyZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHJlZ2lzdGFyYXRpb24uCisgKgorICogUmV0dXJuOgkwCW8uay4KKyAqCQk8IDAJZmFpbHVyZSAoY2hhbm5lbCB3aWxsIG5vdCBiZSBjcmVhdGVkKQorICovCitzdGF0aWMgaW50IG5ld19pZihzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkgIHdhbmlmX2NvbmZfdCogY29uZikKK3sKKwlzZGxhX3QqIGNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisJZnJfY2hhbm5lbF90KiBjaGFuOworCWludCBkbGNpID0gMDsKKwlpbnQgZXJyID0gMDsKKworCQorCWlmICgoY29uZi0+bmFtZVswXSA9PSAnXDAnKSB8fCAoc3RybGVuKGNvbmYtPm5hbWUpID4gV0FOX0lGTkFNRV9TWikpIHsKKwkJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnZhbGlkIGludGVyZmFjZSBuYW1lIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgKi8KKwljaGFuID0ga21hbGxvYyhzaXplb2YoZnJfY2hhbm5lbF90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoY2hhbiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChjaGFuLCAwLCBzaXplb2YoZnJfY2hhbm5lbF90KSk7CisJc3RyY3B5KGNoYW4tPm5hbWUsIGNvbmYtPm5hbWUpOworCWNoYW4tPmNhcmQgPSBjYXJkOworCisJLyogdmVyaWZ5IG1lZGlhIGFkZHJlc3MgKi8KKwlpZiAoaXNfZGlnaXQoY29uZi0+YWRkclswXSkpIHsKKworCQlkbGNpID0gZGVjX3RvX3VpbnQoY29uZi0+YWRkciwgMCk7CisKKwkJaWYgKGRsY2kgJiYgKGRsY2kgPD0gSElHSEVTVF9WQUxJRF9ETENJKSkgeworCQkKKwkJCWNoYW4tPmRsY2kgPSBkbGNpOworCQkKKwkJfSBlbHNlIHsKKwkJCisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiJXM6IEludmFsaWQgRExDSSAldSBvbiBpbnRlcmZhY2UgJXMhXG4iLAorCQkJCXdhbmRldi0+bmFtZSwgZGxjaSwgY2hhbi0+bmFtZSk7CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSIlczogSW52YWxpZCBtZWRpYSBhZGRyZXNzIG9uIGludGVyZmFjZSAlcyFcbiIsCisJCQl3YW5kZXYtPm5hbWUsIGNoYW4tPm5hbWUpOworCQllcnIgPSAtRUlOVkFMOworCX0KKworCWlmICgoY2hhbi0+dHJ1ZV9pZl9lbmNvZGluZyA9IGNvbmYtPnRydWVfaWZfZW5jb2RpbmcpID09IFdBTk9QVF9ZRVMpeworCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBFbmFibGluZywgdHJ1ZSBpbnRlcmZhY2UgdHlwZSBlbmNvZGluZy5cbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKwl9CisJCisKKworICAgIC8qIFNldHVwIHdhbnBpcGUgYXMgYSByb3V0ZXIgKFdBTlBJUEUpIGV2ZW4gaWYgaXQgaXMKKwkgKiBhIGJyaWRnZWQgRExDSSwgb3IgYXMgYW4gQVBJIAorCSAqLworICAgICAgICBpZiAoc3RyY21wKGNvbmYtPnVzZWRieSwgIldBTlBJUEUiKSAgPT0gMCAgfHwgCisJICAgIHN0cmNtcChjb25mLT51c2VkYnksICJCUklER0UiKSAgID09IDAgIHx8CisJICAgIHN0cmNtcChjb25mLT51c2VkYnksICJCUklER0VfTiIpID09IDApeworCQkKKwkJaWYoc3RyY21wKGNvbmYtPnVzZWRieSwgIldBTlBJUEUiKSA9PSAwKXsKKwkJCWNoYW4tPmNvbW1vbi51c2VkYnkgPSBXQU5QSVBFOworCQkJCisJICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBSdW5uaW5nIGluIFdBTlBJUEUgbW9kZS5cbiIsIAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCQorCQl9ZWxzZSBpZihzdHJjbXAoY29uZi0+dXNlZGJ5LCAiQlJJREdFIikgPT0gMCl7CisJCQkKKwkJCWNoYW4tPmNvbW1vbi51c2VkYnkgPSBCUklER0U7CisJCQkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSdW5uaW5nIGluIFdBTlBJUEUgKEJSSURHRSkgbW9kZS5cbiIsIAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJfWVsc2UgaWYoIHN0cmNtcChjb25mLT51c2VkYnksICJCUklER0VfTiIpID09IDAgKXsKKwkJCQorCQkJY2hhbi0+Y29tbW9uLnVzZWRieSA9IEJSSURHRV9OT0RFOworCQkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSdW5uaW5nIGluIFdBTlBJUEUgKEJSSURHRV9OT0RFKSBtb2RlLlxuIiwgCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQl9CisKKwkJaWYgKCFlcnIpeworCQkJLyogRHluYW1pYyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBvcHRpb24uCisJCQkgKiBPbiBkaXNjb25uZWN0LCBpZiB0aGUgb3B0aW9ucyBpcyBzZWxlY3RlZCwKKwkJCSAqIHRoZSBpbnRlcmZhY2Ugd2lsbCBiZSBicm91Z2h0IGRvd24gKi8KKwkJCWlmIChjb25mLT5pZl9kb3duID09IFdBTk9QVF9ZRVMpeyAKKwkJCQlzZXRfYml0KERZTl9PUFRfT04sJmNoYW4tPmludGVyZmFjZV9kb3duKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSAgICAiJXM6IER5bmFtaWMgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZW5hYmxlZC5cbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJfQorCQl9CisKKyAgICAgICAgfSBlbHNlIGlmKHN0cmNtcChjb25mLT51c2VkYnksICJBUEkiKSA9PSAwKXsKKworICAgICAgICAgICAgICAgIGNoYW4tPmNvbW1vbi51c2VkYnkgPSBBUEk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgaW4gQVBJIG1vZGUuXG4iLAorCQkJd2FuZGV2LT5uYW1lKTsKKyAgICAgICAgfQorCisJaWYgKGVycikgeworCQkKKwkJa2ZyZWUoY2hhbik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogcGxhY2UgY2lyLGJlLGJjIGFuZCBvdGhlciBjaGFubmVsIHNwZWNpZmljIGluZm9ybWF0aW9uIGludG8gdGhlCisJICogY2hhbiBzdHJ1Y3R1cmUgCisgICAgICAgICAqLworCWlmIChjb25mLT5jaXIpIHsKKworCQljaGFuLT5jaXIgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIDEsCisJCQkJbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5jaXIsIDUxMikpOworCQljaGFuLT5jaXJfc3RhdHVzID0gQ0lSX0VOQUJMRUQ7IAorCisJCQorCQkvKiBJZiBDSVIgaXMgZW5hYmxlZCwgZm9yY2UgQkMgdG8gZXF1YWwgQ0lSCisgICAgICAgICAgICAgICAgICogdGhpcyBzb2x2ZXMgbnVtYmVyIG9mIHBvdGVudGlhbCBwcm9ibGVtcyBpZiBDSVIgaXMgCisgICAgICAgICAgICAgICAgICogc2V0IGFuZCBCQyBpcyBub3QgCisJCSAqLworCQljaGFuLT5iYyA9IGNoYW4tPmNpcjsKKworCQlpZiAoY29uZi0+YmUpeworCQkJY2hhbi0+YmUgPSBtYXhfdCh1bnNpZ25lZCBpbnQsCisJCQkJICAgICAgIDAsIG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+YmUsIDUxMSkpOworCQl9ZWxzZXsJCisJCQljb25mLT5iZSA9IDA7CisJCX0KKworCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IENJUiBlbmFibGVkIGZvciBETENJICVpIFxuIiwKKwkJCQl3YW5kZXYtPm5hbWUsY2hhbi0+ZGxjaSk7CisJCXByaW50ayAoS0VSTl9JTkZPICIlczogICAgIENJUiA9ICVpIDsgQkMgPSAlaSA7IEJFID0gJWlcbiIsCisJCQkJd2FuZGV2LT5uYW1lLGNoYW4tPmNpcixjaGFuLT5iYyxjaGFuLT5iZSk7CisKKworCX1lbHNleworCQljaGFuLT5jaXJfc3RhdHVzID0gQ0lSX0RJU0FCTEVEOworCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IENJUiBkaXNhYmxlZCBmb3IgRExDSSAlaVxuIiwKKwkJCQl3YW5kZXYtPm5hbWUsY2hhbi0+ZGxjaSk7CisJfQorCisJY2hhbi0+bWMgPSBjb25mLT5tYzsKKworCWlmIChjb25mLT5pbmFycCA9PSBXQU5PUFRfWUVTKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludmVyc2UgQVJQIFN1cHBvcnQgRW5hYmxlZFxuIixjYXJkLT5kZXZuYW1lKTsKKwkJY2hhbi0+aW5hcnAgPSBjb25mLT5pbmFycCA/IElOQVJQX1JFUVVFU1QgOiBJTkFSUF9OT05FOworCQljaGFuLT5pbmFycF9pbnRlcnZhbCA9IGNvbmYtPmluYXJwX2ludGVydmFsID8gY29uZi0+aW5hcnBfaW50ZXJ2YWwgOiAxMDsKKwl9ZWxzZXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludmVyc2UgQVJQIFN1cHBvcnQgRGlzYWJsZWRcbiIsY2FyZC0+ZGV2bmFtZSk7CisJCWNoYW4tPmluYXJwID0gSU5BUlBfTk9ORTsKKwkJY2hhbi0+aW5hcnBfaW50ZXJ2YWwgPSAxMDsKKwl9CisKKworCWNoYW4tPmRsY2lfY29uZmlndXJlZCA9IERMQ0lfTk9UX0NPTkZJR1VSRUQ7CQorCisKKwkvKkZJWE1FOiBJUFggZGlzYWJsZWQgaW4gdGhpcyBXQU5QSVBFIHZlcnNpb24gKi8KKwlpZiAoY29uZi0+ZW5hYmxlX0lQWCA9PSBXQU5PUFRfWUVTKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVSUk9SIC0gVGhpcyB2ZXJzaW9uIG9mIFdBTlBJUEUgZG9lc24ndCBzdXBwb3J0IElQWFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJa2ZyZWUoY2hhbik7CisJCXJldHVybiAtRUlOVkFMOworCX1lbHNleworCQljaGFuLT5lbmFibGVfSVBYID0gV0FOT1BUX05POworCX0JCisKKwlpZiAoY29uZi0+bmV0d29ya19udW1iZXIpeworCQljaGFuLT5uZXR3b3JrX251bWJlciA9IGNvbmYtPm5ldHdvcmtfbnVtYmVyOworCX1lbHNleworCQljaGFuLT5uZXR3b3JrX251bWJlciA9IDB4REVBREJFRUY7CisJfQorCisJY2hhbi0+cm91dGVfZmxhZyA9IE5PX1JPVVRFOworCQorCWluaXRfY2hhbl9zdGF0aXN0aWNzKGNoYW4pOworCisJY2hhbi0+dHJhbnNtaXRfbGVuZ3RoID0gMDsKKworCS8qIHByZXBhcmUgbmV0d29yayBkZXZpY2UgZGF0YSBzcGFjZSBmb3IgcmVnaXN0cmF0aW9uICovCisJc3RyY3B5KGRldi0+bmFtZSxjaGFuLT5uYW1lKTsKKwkKKwlkZXYtPmluaXQgPSAmaWZfaW5pdDsKKwlkZXYtPnByaXYgPSBjaGFuOworCisJLyogSW5pdGlhbGl6ZSBGUiBQb2xsaW5nIFRhc2sgUXVldWUKKyAgICAgICAgICogV2UgbmVlZCBhIHBvbGwgcm91dGluZSBmb3IgZWFjaCBuZXR3b3JrCisgICAgICAgICAqIGludGVyZmFjZS4gCisgICAgICAgICAqLworCUlOSVRfV09SSygmY2hhbi0+ZnJfcG9sbF93b3JrLCAodm9pZCAqKWZyX3BvbGwsIGRldik7CisKKwlpbml0X3RpbWVyKCZjaGFuLT5mcl9hcnBfdGltZXIpOworCWNoYW4tPmZyX2FycF90aW1lci5kYXRhPSh1bnNpZ25lZCBsb25nKWRldjsKKwljaGFuLT5mcl9hcnBfdGltZXIuZnVuY3Rpb24gPSBmcl9hcnA7CisKKwl3YW5kZXYtPm5ld19pZl9jbnQrKzsKKworCS8qIFRlbGxzIHVzIHRoYXQgaWYgdGhpcyBpbnRlcmZhY2UgaXMgYQorICAgICAgICAgKiBnYXRld2F5IG9yIG5vdCAqLworCWlmICgoY2hhbi0+Z2F0ZXdheSA9IGNvbmYtPmdhdGV3YXkpID09IFdBTk9QVF9ZRVMpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJmYWNlICVzIGlzIHNldCBhcyBhIGdhdGV3YXkuXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOworCX0KKworCS8qIE0uIEdyYW50IFBhdGNoIEFwciAyOCAyMDAwIAorICAgICAgICAgKiBEaXNhbGxvdyBkdXBsaWNhdGUgZGxjaSBjb25maWd1cmF0aW9ucy4gKi8KKwlpZiAoY2FyZC0+dS5mLmRsY2lfdG9fZGV2X21hcFtjaGFuLT5kbGNpXSAhPSBOVUxMKSB7CisJCWtmcmVlKGNoYW4pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIENvbmZpZ3VyZSB0aGlzIGRsY2kgYXQgYSBsYXRlciBkYXRlLCB3aGVuCisgICAgICAgICAqIHRoZSBpbnRlcmZhY2UgY29tZXMgdXAuIGkuZS4gd2hlbiBpZl9vcGVuKCkgCisgICAgICAgICAqIGV4ZWN1dGVzICovCisJc2V0X2JpdCgwLCZjaGFuLT5jb25maWdfZGxjaSk7CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERlbGV0ZSBsb2dpY2FsIGNoYW5uZWwuCisgKi8KK3N0YXRpYyBpbnQgZGVsX2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzPTA7CisKKwkvKiBUaGlzIGludGVyZmFjZSBpcyBkZWFkLCBtYWtlIHN1cmUgdGhlIAorCSAqIEFSUCB0aW1lciBpcyBzdG9wcGVkICovCisJZGVsX3RpbWVyKCZjaGFuLT5mcl9hcnBfdGltZXIpOworCQorCS8qIElmIHdlIGFyZSBhIE5PREUsIHdlIG11c3QgdW5jb25maWd1cmUgdGhpcyBETENJCisJICogVHJpZ2dlciBhbiB1bmNvbmZpZ3VyZSBjb21tYW5kIHRoYXQgd2lsbAorCSAqIGJlIGV4ZWN1dGVkIGluIHRpbWVyIGludGVycnVwdC4gV2UgbXVzdCB3YWl0CisJICogZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlLiAqLworCXRyaWdnZXJfdW5jb25maWdfZnIoZGV2KTsKKworCWxvY2tfYWRhcHRlcl9pcnEoJndhbmRldi0+bG9jaywgJnNtcF9mbGFncyk7CisJd2FuZGV2LT5uZXdfaWZfY250LS07CisJdW5sb2NrX2FkYXB0ZXJfaXJxKCZ3YW5kZXYtPmxvY2ssICZzbXBfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGRpc2FibGVfY29tbQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJRGlzYWJsZSBjb21tdW5pY2F0aW9ucy4KKyAqIAlUaGlzIGNvZGUgcnVucyBpbiBzaHV0ZG93biAoc2RsYW1haW4uYykKKyAqICAgICAgdW5kZXIgY3JpdGljYWwgZmxhZy4gVGhlcmVmb3JlIGl0IGlzIG5vdAorICogICAgICBuZWNlc3NhcnkgdG8gc2V0IGEgY3JpdGljYWwgZmxhZyBoZXJlIAorICoKKyAqIFVzYWdlOgorICogCUNvbW1udW5pY2F0aW9ucyBhcmUgZGlzYWJsZWQgb25seSBvbiBhIGNhcmQKKyAqICAgICAgc2h1dGRvd24uCisgKi8KKworc3RhdGljIHZvaWQgZGlzYWJsZV9jb21tIChzZGxhX3QgKmNhcmQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERpc2FibGluZyBDb21tdW5pY2F0aW9ucyFcbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKwlmcl9jb21tX2Rpc2FibGUoY2FyZCk7Cit9CisKKy8qKioqKiogV0FOUElQRS1zcGVjaWZpYyBlbnRyeSBwb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEV4ZWN1dGUgYWRhcHRlciBpbnRlcmZhY2UgY29tbWFuZC4KKyAqLworc3RhdGljIGludCB3cGZfZXhlYyAoc3RydWN0IHNkbGEqIGNhcmQsIHZvaWQqIHVfY21kLCB2b2lkKiB1X2RhdGEpCit7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnIsIGxlbjsKKwlmcl9jbWRfdCBjbWQ7CisKKwlpZihjb3B5X2Zyb21fdXNlcigodm9pZCopJmNtZCwgdV9jbWQsIHNpemVvZihjbWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJLyogZXhlY3V0ZSBjb21tYW5kICovCisJZG8KKwl7CisJCW1lbWNweSgmbWJveC0+Y21kLCAmY21kLCBzaXplb2YoY21kKSk7CisJCQorCQlpZiAoY21kLmxlbmd0aCl7CisJCQlpZiggY29weV9mcm9tX3VzZXIoKHZvaWQqKSZtYm94LT5kYXRhLCB1X2RhdGEsIGNtZC5sZW5ndGgpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCQorCQlpZiAoc2RsYV9leGVjKG1ib3gpKQorCQkJZXJyID0gbWJveC0+Y21kLnJlc3VsdDsKKworCQllbHNlIHJldHVybiAtRUlPOworCQorCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIGZyX2V2ZW50KGNhcmQsIGVyciwgbWJveCkpOworCisJLyogcmV0dXJuIHJlc3VsdCAqLworCWlmIChjb3B5X3RvX3VzZXIodV9jbWQsICh2b2lkKikmbWJveC0+Y21kLCBzaXplb2YoZnJfY21kX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsZW4gPSBtYm94LT5jbWQubGVuZ3RoOworCisJaWYgKGxlbiAmJiB1X2RhdGEgJiYgIWNvcHlfdG9fdXNlcih1X2RhdGEsICh2b2lkKikmbWJveC0+ZGF0YSwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKiogTmV0d29yayBEZXZpY2UgSW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgTGludXggbmV0d29yayBpbnRlcmZhY2UuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBvbmx5IG9uY2UgZm9yIGVhY2ggaW50ZXJmYWNlLCBkdXJpbmcgTGludXggbmV0d29yaworICogaW50ZXJmYWNlIHJlZ2lzdHJhdGlvbi4gIFJldHVybmluZyBhbnl0aGluZyBidXQgemVybyB3aWxsIGZhaWwgaW50ZXJmYWNlCisgKiByZWdpc3RyYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgaWZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCWZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGFuLT5jYXJkOworCXN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCisJLyogSW5pdGlhbGl6ZSBkZXZpY2UgZHJpdmVyIGVudHJ5IHBvaW50cyAqLworCWRldi0+b3BlbgkJPSAmaWZfb3BlbjsKKwlkZXYtPnN0b3AJCT0gJmlmX2Nsb3NlOworCWRldi0+aGFyZF9oZWFkZXIJPSBOVUxMOworCWRldi0+cmVidWlsZF9oZWFkZXIJPSAmaWZfcmVidWlsZF9oZHI7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSAmaWZfc2VuZDsKKwlkZXYtPmdldF9zdGF0cwkJPSAmaWZfc3RhdHM7CisJZGV2LT50eF90aW1lb3V0CQk9ICZpZl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOworCQorCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IFdBTlBJUEUgfHwgY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCisJCS8qIEluaXRpYWxpemUgbWVkaWEtc3BlY2lmaWMgcGFyYW1ldGVycyAqLworCQlpZiAoY2hhbi0+dHJ1ZV9pZl9lbmNvZGluZyl7CisJCQlkZXYtPnR5cGUgCQk9IEFSUEhSRF9ETENJOyAgLyogVGhpcyBicmVha3MgdGNwZHVtcCAqLworCQl9ZWxzZXsKKwkJCWRldi0+dHlwZQkJPSBBUlBIUkRfUFBQOyAJLyogQVJQIGgvdyB0eXBlICovCisJCX0KKwkJCisJCWRldi0+ZmxhZ3MJCXw9IElGRl9QT0lOVE9QT0lOVDsKKwkJZGV2LT5mbGFncwkJfD0gSUZGX05PQVJQOworCisJCS8qIEVuYWJsZSBNdWx0aWNhc3QgYWRkcmVzc2luZyAqLworCQlpZiAoY2hhbi0+bWMgPT0gV0FOT1BUX1lFUyl7CisJCQlkZXYtPmZsYWdzIAl8PSBJRkZfTVVMVElDQVNUOworCQl9CisKKwkJZGV2LT5tdHUJCT0gd2FuZGV2LT5tdHUgLSBGUl9IRUFERVJfTEVOOworCQkvKiBGb3IgYW4gQVBJLCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB0aGUgc3RhY2sgd2lsbCBwYXNzCisJCSAgIHRvIHRoZSBkcml2ZXIgaXMgKGRldi0+bXR1ICsgZGV2LT5oYXJkX2hlYWRlcl9sZW4pLiBTbywgYWRqdXN0IHRoZQorCQkgICBtdHUgc28gdGhhdCBhIGZyYW1lIG9mIG1heGltdW0gc2l6ZSBjYW4gYmUgdHJhbnNtaXR0ZWQgYnkgdGhlIEFQSS4gCisJCSovCisJCWlmKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKSB7CisJCQlkZXYtPm10dSArPSAoc2l6ZW9mKGFwaV90eF9oZHJfdCkgLSBGUl9IRUFERVJfTEVOKTsKKwkJfQorCQkKKwkJZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSBGUl9IRUFERVJfTEVOOy8qIG1lZGlhIGhlYWRlciBsZW5ndGggKi8KKwkJZGV2LT5hZGRyX2xlbgkJPSAyOyAJCS8qIGhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoICovCisJCSoodW5zaWduZWQgc2hvcnQqKWRldi0+ZGV2X2FkZHIgPSBodG9ucyhjaGFuLT5kbGNpKTsKKworCQkvKiBTZXQgdHJhbnNtaXQgYnVmZmVyIHF1ZXVlIGxlbmd0aCAqLworICAgICAgICAJZGV2LT50eF9xdWV1ZV9sZW4gPSAxMDA7CisKKwl9ZWxzZXsKKworCQkvKiBTZXR1cCB0aGUgaW50ZXJmYWNlIGZvciBCcmlkZ2luZyAqLworCQlpbnQgaHdfYWRkcj0wOworCQlldGhlcl9zZXR1cChkZXYpOworCQkKKwkJLyogVXNlIGEgcmFuZG9tIG51bWJlciB0byBnZW5lcmF0ZSB0aGUgTUFDIGFkZHJlc3MgKi8KKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICJceEZFXHhGQ1x4MDBceDAwXHgwMFx4MDAiLCA2KTsKKwkJZ2V0X3JhbmRvbV9ieXRlcygmaHdfYWRkciwgc2l6ZW9mKGh3X2FkZHIpKTsKKwkJKihpbnQgKikoZGV2LT5kZXZfYWRkciArIDIpICs9IGh3X2FkZHI7CisJfQorCQkKKwkvKiBJbml0aWFsaXplIGhhcmR3YXJlIHBhcmFtZXRlcnMgKGp1c3QgZm9yIHJlZmVyZW5jZSkgKi8KKwlkZXYtPmlycQk9IHdhbmRldi0+aXJxOworCWRldi0+ZG1hCT0gd2FuZGV2LT5kbWE7CisJZGV2LT5iYXNlX2FkZHIJPSB3YW5kZXYtPmlvcG9ydDsKKwlkZXYtPm1lbV9zdGFydAk9IHdhbmRldi0+bWFkZHI7CisJZGV2LT5tZW1fZW5kCT0gd2FuZGV2LT5tYWRkciArIHdhbmRldi0+bXNpemUgLSAxOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE9wZW4gbmV0d29yayBpbnRlcmZhY2UuCisgKiBvIGlmIHRoaXMgaXMgdGhlIGZpcnN0IG9wZW4sIHRoZW4gZW5hYmxlIGNvbW11bmljYXRpb25zIGFuZCBpbnRlcnJ1cHRzLgorICogbyBwcmV2ZW50IG1vZHVsZSBmcm9tIHVubG9hZGluZyBieSBpbmNyZW1lbnRpbmcgdXNlIGNvdW50CisgKgorICogUmV0dXJuIDAgaWYgTy5rLiBvciBlcnJuby4KKyAqLworc3RhdGljIGludCBpZl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCQorCS8qIEluaXRpYWxpemUgdGhlIHRhc2sgcXVldWUgKi8KKwljaGFuLT50cV93b3JraW5nPTA7CisKKwlJTklUX1dPUksoJmNoYW4tPmNvbW1vbi53YW5waXBlX3dvcmssICh2b2lkICopZnJfYmgsIGRldik7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBCSCBjaXJjdWxhciBidWZmZXIgKi8KKwljaGFuLT5iaF9oZWFkID0ga21hbGxvYygoc2l6ZW9mKGJoX2RhdGFfdCkqTUFYX0JIX0JVRkYpLEdGUF9BVE9NSUMpOworCW1lbXNldChjaGFuLT5iaF9oZWFkLDAsKHNpemVvZihiaF9kYXRhX3QpKk1BWF9CSF9CVUZGKSk7CisJYXRvbWljX3NldCgmY2hhbi0+YmhfYnVmZl91c2VkLCAwKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwl3YW5waXBlX29wZW4oY2FyZCk7CisJZG9fZ2V0dGltZW9mZGF5KCAmdHYgKTsKKwljaGFuLT5yb3V0ZXJfc3RhcnRfdGltZSA9IHR2LnR2X3NlYzsKKwkKKwlpZiAodGVzdF9iaXQoMCwmY2hhbi0+Y29uZmlnX2RsY2kpKXsKKwkJdHJpZ2dlcl9jb25maWdfZnIgKGNhcmQpOworCX1lbHNlIGlmIChjaGFuLT5pbmFycCA9PSBJTkFSUF9SRVFVRVNUKXsKKwkJdHJpZ2dlcl9mcl9hcnAoZGV2KTsKKwl9CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDbG9zZSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIG8gaWYgdGhpcyBpcyB0aGUgbGFzdCBvcGVuLCB0aGVuIGRpc2FibGUgY29tbXVuaWNhdGlvbnMgYW5kIGludGVycnVwdHMuCisgKiBvIHJlc2V0IGZsYWdzLgorICovCitzdGF0aWMgaW50IGlmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisKKwlpZiAoY2hhbi0+aW5hcnAgPT0gSU5BUlBfQ09ORklHVVJFRCkgeworCQljaGFuLT5pbmFycCA9IElOQVJQX1JFUVVFU1Q7CisJfQorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXdhbnBpcGVfY2xvc2UoY2FyZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZS1idWlsZCBtZWRpYSBoZWFkZXIuCisgKgorICogUmV0dXJuOgkxCXBoeXNpY2FsIGFkZHJlc3MgcmVzb2x2ZWQuCisgKgkJMAlwaHlzaWNhbCBhZGRyZXNzIG5vdCByZXNvbHZlZAorICovCitzdGF0aWMgaW50IGlmX3JlYnVpbGRfaGRyIChzdHJ1Y3Qgc2tfYnVmZiogc2tiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWJ1aWxkX2hlYWRlcigpIGNhbGxlZCBmb3IgaW50ZXJmYWNlICVzIVxuIiwKKwkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKwlyZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBIYW5kbGUgdHJhbnNtaXQgdGltZW91dCBldmVudCBmcm9tIG5ldGlmIHdhdGNoZG9nCisgKi8KK3N0YXRpYyB2b2lkIGlmX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAJZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisKKwkvKiBJZiBvdXIgZGV2aWNlIHN0YXlzIGJ1c3kgZm9yIGF0IGxlYXN0IDUgc2Vjb25kcyB0aGVuIHdlIHdpbGwKKwkgKiBraWNrIHN0YXJ0IHRoZSBkZXZpY2UgYnkgbWFraW5nIGRldi0+dGJ1c3kgPSAwLiAgV2UgZXhwZWN0CisJICogdGhhdCBvdXIgZGV2aWNlIG5ldmVyIHN0YXlzIGJ1c3kgbW9yZSB0aGFuIDUgc2Vjb25kcy4gU28gdGhpcyAgICAgICAgICAgICAgICAgCisJICogaXMgb25seSB1c2VkIGFzIGEgbGFzdCByZXNvcnQuCisJICovCisKKwljaGFuLT5kcnZzdGF0c19pZl9zZW5kLmlmX3NlbmRfdGJ1c3krKzsKKwkrK2NoYW4tPmlmc3RhdHMuY29sbGlzaW9uczsKKworCXByaW50ayAoS0VSTl9JTkZPICIlczogVHJhbnNtaXQgdGltZWQgb3V0IG9uICVzXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSk7CisJY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC5pZl9zZW5kX3RidXN5X3RpbWVvdXQrKzsKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgcGFja2V0IG9uIGEgbmV0d29yayBpbnRlcmZhY2UuCisgKiBvIHNldCB0YnVzeSBmbGFnIChtYXJrcyBzdGFydCBvZiB0aGUgdHJhbnNtaXNzaW9uKSB0byBibG9jayBhIHRpbWVyLWJhc2VkCisgKiAgIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuCisgKiBvIHNldCBjcml0aWNhbCBmbGFnIHdoZW4gYWNjZXNzaW5nIGJvYXJkLgorICogbyBjaGVjayBsaW5rIHN0YXRlLiBJZiBsaW5rIGlzIG5vdCB1cCwgdGhlbiBkcm9wIHRoZSBwYWNrZXQuCisgKiBvIGNoZWNrIGNoYW5uZWwgc3RhdHVzLiBJZiBpdCdzIGRvd24gdGhlbiBpbml0aWF0ZSBhIGNhbGwuCisgKiBvIHBhc3MgYSBwYWNrZXQgdG8gY29ycmVzcG9uZGluZyBXQU4gZGV2aWNlLgorICogbyBmcmVlIHNvY2tldCBidWZmZXIKKyAqCisgKiBSZXR1cm46CTAJY29tcGxldGUgKHNvY2tldCBidWZmZXIgbXVzdCBiZSBmcmVlZCkKKyAqCQlub24tMAlwYWNrZXQgbWF5IGJlIHJlLXRyYW5zbWl0dGVkICh0YnVzeSBtdXN0IGJlIHNldCkKKyAqCisgKiBOb3RlczoKKyAqIDEuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZWl0aGVyIGJ5IHRoZSBwcm90b2NvbCBzdGFjayBvciBieSB0aGUgIm5ldAorICogICAgYm90dG9tIGhhbGYiICh3aXRoIGludGVycnVwdHMgZW5hYmxlZCkuCisgKiAKKyAqIDIuIFVzaW5nIG5ldGlmX3N0YXJ0X3F1ZXVlKCkgYW5kIG5ldGlmX3N0b3BfcXVldWUoKQorICogICAgd2lsbCBpbmhpYml0IGZ1cnRoZXIgdHJhbnNtaXQgcmVxdWVzdHMgZnJvbSB0aGUgcHJvdG9jb2wgc3RhY2sgCisgKiAgICBhbmQgY2FuIGJlIHVzZWQgZm9yIGZsb3cgY29udHJvbCB3aXRoIHByb3RvY29sIGxheWVyLgorICovCitzdGF0aWMgaW50IGlmX3NlbmQoc3RydWN0IHNrX2J1ZmYqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKyAgICAJZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworICAgIAlzZGxhX3QqIGNhcmQgPSBjaGFuLT5jYXJkOworICAgICAgICBpbnQgZXJyOworICAgIAl1bnNpZ25lZCBjaGFyICpzZW5kcGFja2V0OworICAgIAlmcjUwOF9mbGFnc190KiBhZHB0cl9mbGFncyA9IGNhcmQtPmZsYWdzOworCWludCB1ZHBfdHlwZTsKKwlsb25nIGRlbGF5X3R4X3F1ZXVlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M9MDsKKwl1bnNpZ25lZCBjaGFyIGF0dHIgPSAwOworCisJY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC5pZl9zZW5kX2VudHJ5Kys7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisgICAgICAgIGlmIChza2IgPT0gTlVMTCkgeyAgICAgICAgICAgICAKKwkJLyogaWYgd2UgZ2V0IGhlcmUsIHNvbWUgaGlnaGVyIGxheWVyIHRoaW5rcyB3ZSd2ZSBtaXNzZWQgYW4KKwkJICogdHgtZG9uZSBpbnRlcnJ1cHQuCisJCSAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW50ZXJmYWNlICVzIGdvdCBraWNrZWQhXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSk7CisJCWNoYW4tPmRydnN0YXRzX2lmX3NlbmQuaWZfc2VuZF9za2JfbnVsbCArKzsKKworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXJldHVybiAwOworCX0KKworCS8qIElmIGEgcGVyaXBoZXJhbCB0YXNrIGlzIHJ1bm5pbmcganVzdCBkcm9wIHBhY2tldHMgKi8KKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCAmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisJCQorCQlwcmludGsoS0VSTl9JTkZPICIlczogQ3JpdGljYWwgaW4gaWZfc2VuZCgpOiBQZXJpcGhlcmFsIHJ1bm5pbmchXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogV2UgbXVzdCBzZXQgdGhlICd0YnVzeScgZmxhZyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBwYWNrZXQgcXVldWVkIGZvcgorCSAgIHRyYW5zbWlzc2lvbiBpbiB0aGUgdHJhbnNtaXQgaW50ZXJydXB0IGhhbmRsZXIuIEhvd2V2ZXIsIHdlIG11c3QKKwkgICBlbnN1cmUgdGhhdCB0aGUgdHJhbnNtaXQgaW50ZXJydXB0IGRvZXMgbm90IHJlc2V0IHRoZSAndGJ1c3knIGZsYWcKKwkgICBqdXN0IGJlZm9yZSB3ZSBzZXQgaXQsIGFzIHRoaXMgd2lsbCByZXN1bHQgaW4gYSAidHJhbnNtaXQgdGltZW91dCIuCisJKi8KKwlzZXRfYml0KFNFTkRfVFhJUlFfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworICAgICAgICBpZihjaGFuLT50cmFuc21pdF9sZW5ndGgpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQljaGFuLT50aWNrX2NvdW50ZXIgPSBqaWZmaWVzOworIAkJY2xlYXJfYml0KFNFTkRfVFhJUlFfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQlyZXR1cm4gMTsKKwl9CisgICAgICAgCWNsZWFyX2JpdChTRU5EX1RYSVJRX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKyAKKwkvKiBNb3ZlIHRoZSBpZl9oZWFkZXIoKSBjb2RlIHRvIGhlcmUuIEJ5IGluc2VydGluZyBmcmFtZQorCSAqIHJlbGF5IGhlYWRlciBpbiBpZl9oZWFkZXIoKSB3ZSB3b3VsZCBicmVhayB0aGUKKwkgKiB0Y3BkdW1wIGFuZCBvdGhlciBwYWNrZXQgc25pZmZlcnMgKi8KKwljaGFuLT5mcl9oZWFkZXJfbGVuID0gc2V0dXBfZnJfaGVhZGVyKCZza2IsZGV2LGNoYW4tPmNvbW1vbi51c2VkYnkpOworCWlmIChjaGFuLT5mcl9oZWFkZXJfbGVuIDwgMCApeworCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CQorCQlyZXR1cm4gMDsKKwl9CisKKwlzZW5kcGFja2V0ID0gc2tiLT5kYXRhOworCisJdWRwX3R5cGUgPSB1ZHBfcGt0X3R5cGUoc2tiLCBjYXJkKTsKKworICAgICAgICBpZih1ZHBfdHlwZSAhPSBVRFBfSU5WQUxJRF9UWVBFKSB7CisJCWlmKHN0b3JlX3VkcF9tZ210X3BrdCh1ZHBfdHlwZSwgVURQX1BLVF9GUk1fU1RBQ0ssIGNhcmQsIHNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4tPmRsY2kpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZHB0cl9mbGFncy0+aW1hc2sgfD0gRlJfSU5UUl9USU1FUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1ZHBfdHlwZSA9PSBVRFBfRlBJUEVfVFlQRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4tPmRydnN0YXRzX2lmX3NlbmQuCisJCQkJCWlmX3NlbmRfUElQRV9yZXF1ZXN0ICsrOworCQkJfQorICAgICAgICAgICAgICAgIH0KKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLy9GSVhNRTogY2FuIHdlIGRvIGJldHRlciB0aGFuIHNlbmRwYWNrZXRbMl0/CisgIAlpZiAoKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gV0FOUElQRSkgJiYgKHNlbmRwYWNrZXRbMl0gPT0gMHg0NSkpIHsKKwkJCisgICAgICAgICAgICAgICAJLyogY2hlY2sgdG8gc2VlIGlmIHRoZSBzb3VyY2UgSVAgYWRkcmVzcyBpcyBhIGJyb2FkY2FzdCBvciAqLworICAgICAgICAgICAgICAgIC8qIG11bHRpY2FzdCBJUCBhZGRyZXNzICovCisgICAgICAgICAgICAgICAgaWYoY2hrX2JjYXN0X21jYXN0X2FkZHIoY2FyZCwgZGV2LCBza2IpKXsKKyAgICAgICAgICAgIAkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworICAgICAgICAgICAgICAgIAlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJCisJLyogTG9jayB0aGUgUzUxNC9TNTA4IGNhcmQ6IFNNUCBTdXBwb3J0ZWQgKi8KKyAgICAJczUwOF9zNTE0X2xvY2soY2FyZCwmc21wX2ZsYWdzKTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisJCQorCQljaGFuLT5kcnZzdGF0c19pZl9zZW5kLmlmX3NlbmRfY3JpdGljYWxfbm9uX0lTUiArKzsKKwkJY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkICsrOworCQlwcmludGsoS0VSTl9JTkZPICIlcyBDcml0aWNhbCBpbiBJRl9TRU5EOiBpZl9zZW5kKCkgYWxyZWFkeSBydW5uaW5nIVxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCWdvdG8gaWZfc2VuZF9zdGFydF9hbmRfZXhpdDsKKwl9CisJCisJLyogQVBJIHBhY2tldCBjaGVjazogbWluaW11bSBwYWNrZXQgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAKKwkgKiAxNiBieXRlIEFQSSBoZWFkZXIgKi8KKwlpZigoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpICYmIChza2ItPmxlbiA8PSBzaXplb2YoYXBpX3R4X2hkcl90KSkpIHsKKwkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJICAgIAorCQkKKwkJZ290byBpZl9zZW5kX3N0YXJ0X2FuZF9leGl0OworCisgCX1lbHNleworCQkvKiBEdXJpbmcgQVBJIHRyYW5zbWlzc2lvbiwgZ2V0IHJpZCBvZiB0aGUgQVBJIGhlYWRlciAqLworCQlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpIHsKKwkJCWFwaV90eF9oZHJfdCogYXBpX3R4X2hkcjsKKwkJCWFwaV90eF9oZHIgPSAoYXBpX3R4X2hkcl90Kikmc2tiLT5kYXRhWzB4MDBdOworCQkJYXR0ciA9IGFwaV90eF9oZHItPmF0dHI7CisJCQlza2JfcHVsbChza2Isc2l6ZW9mKGFwaV90eF9oZHJfdCkpOworCQl9CisJfQorCisJaWYgKGNhcmQtPndhbmRldi5zdGF0ZSAhPSBXQU5fQ09OTkVDVEVEKSB7CisJCWNoYW4tPmRydnN0YXRzX2lmX3NlbmQuaWZfc2VuZF93YW5fZGlzY29ubmVjdGVkICsrOworCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKyAgICAgICAgCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCisJfSBlbHNlIGlmIChjaGFuLT5jb21tb24uc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCkgeworCQljaGFuLT5kcnZzdGF0c19pZl9zZW5kLmlmX3NlbmRfZGxjaV9kaXNjb25uZWN0ZWQgKys7CisKKwkJLyogVXBkYXRlIHRoZSBETENJIHN0YXRlIGluIHRpbWVyIGludGVycnVwdCAqLworCQljYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgfD0gVE1SX0lOVF9FTkFCTEVEX1VQREFURV9TVEFURTsJCisJCWFkcHRyX2ZsYWdzLT5pbWFzayB8PSBGUl9JTlRSX1RJTUVSOworCisgICAgICAgIAkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKyAgICAgICAgCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQorCX0gZWxzZSBpZiAoIWlzX3R4X3JlYWR5KGNhcmQsIGNoYW4pKSB7CisJCS8qIE5vIHR4IGJ1ZmZlcnMgYXZhaWxhYmxlLCBzdG9yZSBmb3IgZGVsYXllZCB0cmFuc21pdCAqLworCQlpZiAoIXNldHVwX2Zvcl9kZWxheWVkX3RyYW5zbWl0KGRldiwgc2tiKSl7CisJCQlzZXRfYml0KDEsJmRlbGF5X3R4X3F1ZXVlZCk7CisJCX0KKwkJY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC5pZl9zZW5kX25vX2JmcnMrKzsKKwkJCisJfSBlbHNlIGlmICghc2tiLT5wcm90b2NvbCkgeworCQkvKiBObyBwcm90b2NvbHMgZHJvcCBwYWNrZXQgKi8KKwkJY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC5pZl9zZW5kX3Byb3RvY29sX2Vycm9yICsrOworCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9lcnJvcnM7CisJCisJfSBlbHNlIGlmICh0ZXN0X2JpdChBUlBfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisJCS8qIFdlIGFyZSB0cnlpbmcgdG8gc2VuZCBhbiBBUlAgUGFja2V0LCBibG9jayBJUCBkYXRhIHVudGlsCisJCSAqIEFSUCBpcyBzZW50ICovCisJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworICAgICAgICAJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCisJfSBlbHNlIHsKKwkJLy9GSVhNRTogSVBYIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24gb2YgRnJhbWUgUmVsYXkgPworCQlpZigoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBXQU5QSVBFKSAmJgorCQkgCXNlbmRwYWNrZXRbMV0gPT0gMHgwMCAmJgorCQkgICAgCXNlbmRwYWNrZXRbMl0gPT0gMHg4MCAmJgorCQkgICAgCXNlbmRwYWNrZXRbNl0gPT0gMHg4MSAmJgorCQkgICAgCXNlbmRwYWNrZXRbN10gPT0gMHgzNykgeworCQkJCisJCQlpZiggY2hhbi0+ZW5hYmxlX0lQWCApIHsKKwkJCQlzd2l0Y2hfbmV0X251bWJlcnMoc2VuZHBhY2tldCwgCisJCQkJCQljaGFuLT5uZXR3b3JrX251bWJlciwgMCk7CisJCQl9IGVsc2UgeworCQkJCS8vRklYTUU6IFRha2UgdGhpcyBvdXQgd2hlbiBJUFggaXMgZml4ZWQgCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IFdBUk5JTkc6IFVuc3VwcG9ydGVkIElQWCBkYXRhIGluIHNlbmQsIHBhY2tldCBkcm9wcGVkXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCX0KKwkJCQorCQl9ZWxzZXsKKyAgICAgICAgCQllcnIgPSBmcl9zZW5kX2RhdGFfaGVhZGVyKGNhcmQsIGNoYW4tPmRsY2ksIGF0dHIsIHNrYi0+bGVuLCBza2ItPmRhdGEsIGNoYW4tPmZyX2hlYWRlcl9sZW4pOworCQkJaWYgKGVycikgeworCQkJCXN3aXRjaChlcnIpIHsKKwkJCQljYXNlIEZSUkVTX0NJUl9PVkVSRkxPVzoKKwkJCQljYXNlIEZSUkVTX0JVRkZFUl9PVkVSRkxPVzoKKyAgICAgICAgICAgICAgICAJCQlpZiAoIXNldHVwX2Zvcl9kZWxheWVkX3RyYW5zbWl0KGRldiwgc2tiKSl7CisJCQkJCQlzZXRfYml0KDEsJmRlbGF5X3R4X3F1ZXVlZCk7CisJCQkJCX0KKyAgICAgICAgICAgCQkJCWNoYW4tPmRydnN0YXRzX2lmX3NlbmQuCisJCQkJCQlpZl9zZW5kX2FkcHRyX2JmcnNfZnVsbCArKzsKKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgRlJSRVNfVE9PX0xPTkc6CisJCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeworCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkJCSIlczogRXJyb3I6IEZyYW1lIHRvbyBsb25nLCB0cmFuc21pc3Npb24gZmFpbGVkICVpXG4iLAorCQkJCQkJIGNhcmQtPmRldm5hbWUsICh1bnNpZ25lZCBpbnQpc2tiLT5sZW4pOworCQkJCQl9CisJCQkJCS8qIERyb3AgZG93biB0byBkZWZhdWx0ICovCisJCQkJZGVmYXVsdDoKKwkJCQkJY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC4KKwkJCQkJCWlmX3NlbmRfZGxjaV9kaXNjb25uZWN0ZWQgKys7CisgICAgICAgIAkJCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKyAgICAgICAgCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC4KKwkJCQkJaWZfc2VuZF9iZnJfcGFzc2VkX3RvX2FkcHRyKys7CisJCQkJKytjaGFuLT5pZnN0YXRzLnR4X3BhY2tldHM7CisJCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfcGFja2V0czsKKwkJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbi0+aWZzdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJfQorCQl9CisJfQorCitpZl9zZW5kX3N0YXJ0X2FuZF9leGl0OgorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkKKwkvKiBJZiB3ZSBxdWV1ZWQgdGhlIHBhY2tldCBmb3IgdHJhbnNtaXNzaW9uLCB3ZSBtdXN0IG5vdAorCSAqIGRlYWxsb2NhdGUgaXQuIFRoZSBwYWNrZXQgaXMgdW5saW5rZWQgZnJvbSB0aGUgSVAgc3RhY2sKKwkgKiBub3QgY29waWVkLiBUaGVyZWZvcmUsIHdlIG11c3Qga2VlcCB0aGUgb3JpZ2luYWwgcGFja2V0ICovCisJaWYgKCF0ZXN0X2JpdCgxLCZkZWxheV90eF9xdWV1ZWQpKSB7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9ZWxzZXsKKwkJYWRwdHJfZmxhZ3MtPmltYXNrIHw9IEZSX0lOVFJfVFhSRFk7CisJCWNhcmQtPnUuZi50eF9pbnRlcnJ1cHRzX3BlbmRpbmcgKys7CisJfQorCisgICAgICAgIGNsZWFyX2JpdChTRU5EX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKworCXM1MDhfczUxNF91bmxvY2soY2FyZCwmc21wX2ZsYWdzKTsKKworCXJldHVybiAwOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXR1cCBzbyB0aGF0IGEgZnJhbWUgY2FuIGJlIHRyYW5zbWl0dGVkIG9uIHRoZSBvY2N1cnJlbmNlIG9mIGEgdHJhbnNtaXQKKyAqIGludGVycnVwdC4KKyAqLworc3RhdGljIGludCBzZXR1cF9mb3JfZGVsYXllZF90cmFuc21pdChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisgICAgICAgIGZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKyAgICAgICAgc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKyAgICAgICAgZnJfZGxjaV9pbnRlcmZhY2VfdCogZGxjaV9pbnRlcmZhY2U7CisJaW50IGxlbiA9IHNrYi0+bGVuOworCisJLyogQ2hlY2sgdGhhdCB0aGUgZGxjaSBpcyBwcm9wZXJseSBjb25maWd1cmVkLAorICAgICAgICAgKiBiZWZvcmUgdXNpbmcgdHggaW50ZXJydXB0ICovCisJaWYgKCFjaGFuLT5kbGNpX2ludF9pbnRlcmZhY2UpeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKXsgCisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogRVJST1Igb24gRExDSSAlaTogTm90IGNvbmZpZ3VyZWQgcHJvcGVybHkgIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSwgY2hhbi0+ZGxjaSk7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUGxlYXNlIGNvbnRhY3QgU2FuZ29tYSBUZWNobm9sb2dpZXNcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQl9CisJCXJldHVybiAxOworCX0KKwkJCisJZGxjaV9pbnRlcmZhY2UgPSBjaGFuLT5kbGNpX2ludF9pbnRlcmZhY2U7CisKKyAgICAgICAgaWYoY2hhbi0+dHJhbnNtaXRfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJpZyBtZXNzIGluIHNldHVwX2Zvcl9kZWwuLi5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworCWlmKGxlbiA+IEZSX01BWF9OT19EQVRBX0JZVEVTX0lOX0ZSQU1FKSB7CisJCS8vRklYTUU6IGluY3JlbWVudCBzb21lIHN0YXRpc3RpYyAqLworCQlyZXR1cm4gMTsKKwl9CisKKwlza2JfdW5saW5rKHNrYik7CisJCisgICAgICAgIGNoYW4tPnRyYW5zbWl0X2xlbmd0aCA9IGxlbjsKKwljaGFuLT5kZWxheV9za2IgPSBza2I7CisgICAgICAgIAorICAgICAgICBkbGNpX2ludGVyZmFjZS0+Z2VuX2ludGVycnVwdCB8PSBGUl9JTlRSX1RYUkRZOworICAgICAgICBkbGNpX2ludGVyZmFjZS0+cGFja2V0X2xlbmd0aCA9IGxlbjsKKworCS8qIFR1cm4gb24gVFggaW50ZXJydXB0IGF0IHRoZSBlbmQgb2YgaWZfc2VuZCAqLworCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBwYWNrZXQgdG8gYmUgdHJhbnNtaXR0ZWQgY29udGFpbnMgYSBicm9hZGNhc3Qgb3IKKyAqIG11bHRpY2FzdCBzb3VyY2UgSVAgYWRkcmVzcy4KKyAqIFJldHVybiAwIGlmIG5vdCBicm9hZGNhc3QvbXVsdGljYXN0IGFkZHJlc3MsIG90aGVyd2lzZSByZXR1cm4gMS4KKyAqLworCitzdGF0aWMgaW50IGNoa19iY2FzdF9tY2FzdF9hZGRyKHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAgICAgICAgdTMyIHNyY19pcF9hZGRyOworICAgICAgICB1MzIgYnJvYWRjYXN0X2lwX2FkZHIgPSAwOworICAgICAgICBzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisgICAgICAgIGZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKyAKKyAgICAgICAgLyogcmVhZCB0aGUgSVAgc291cmNlIGFkZHJlc3MgZnJvbSB0aGUgb3V0Z29pbmcgcGFja2V0ICovCisgICAgICAgIHNyY19pcF9hZGRyID0gKih1MzIgKikoc2tiLT5kYXRhICsgMTQpOworCisgICAgICAgIC8qIHJlYWQgdGhlIElQIGJyb2FkY2FzdCBhZGRyZXNzIGZvciB0aGUgZGV2aWNlICovCisgICAgICAgIGluX2RldiA9IGRldi0+aXBfcHRyOworICAgICAgICBpZihpbl9kZXYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBpbl9pZmFkZHIgKmlmYT0gaW5fZGV2LT5pZmFfbGlzdDsKKyAgICAgICAgICAgICAgICBpZihpZmEgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdF9pcF9hZGRyID0gaWZhLT5pZmFfYnJvYWRjYXN0OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgaWYgdGhlIElQIFNvdXJjZSBBZGRyZXNzIGlzIGEgQnJvYWRjYXN0IGFkZHJlc3MgKi8KKyAgICAgICAgaWYoKGRldi0+ZmxhZ3MgJiBJRkZfQlJPQURDQVNUKSAmJiAoc3JjX2lwX2FkZHIgPT0gYnJvYWRjYXN0X2lwX2FkZHIpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTworICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBCcm9hZGNhc3QgU291cmNlIEFkZHJlc3Mgc2lsZW50bHkgZGlzY2FyZGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBjaGVjayBpZiB0aGUgSVAgU291cmNlIEFkZHJlc3MgaXMgYSBNdWx0aWNhc3QgYWRkcmVzcyAqLworICAgICAgICBpZigoY2hhbi0+bWMgPT0gV0FOT1BUX05PKSAmJiAobnRvaGwoc3JjX2lwX2FkZHIpID49IDB4RTAwMDAwMDEpICYmCisgICAgICAgICAgICAgICAgKG50b2hsKHNyY19pcF9hZGRyKSA8PSAweEZGRkZGRkZFKSkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8KKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogTXVsdGljYXN0IFNvdXJjZSBBZGRyZXNzIHNpbGVudGx5IGRpc2NhcmRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVwbHkgdG8gVURQIE1hbmFnZW1lbnQgc3lzdGVtLgorICogUmV0dXJuIG5vdGhpbmcuCisgKi8KK3N0YXRpYyBpbnQgcmVwbHlfdWRwKCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbWJveF9sZW4gKSAKK3sKKwl1bnNpZ25lZCBzaG9ydCBsZW4sIHVkcF9sZW5ndGgsIHRlbXAsIGlwX2xlbmd0aDsKKwl1bnNpZ25lZCBsb25nIGlwX3RlbXA7CisJaW50IGV2ZW5fYm91bmQgPSAwOworCisgIAorCWZyX3VkcF9wa3RfdCAqZnJfdWRwX3BrdCA9IChmcl91ZHBfcGt0X3QgKilkYXRhOyAKKworCS8qIFNldCBsZW5ndGggb2YgcGFja2V0ICovCisJbGVuID0gLy9zaXplb2YoZnJfZW5jYXBfaGRyX3QpKworCSAgICAgIHNpemVvZihpcF9wa3RfdCkrIAorCSAgICAgIHNpemVvZih1ZHBfcGt0X3QpKworCSAgICAgIHNpemVvZih3cF9tZ210X3QpKworCSAgICAgIHNpemVvZihjYmxvY2tfdCkrCisJICAgICAgbWJveF9sZW47CisgCisKKwkvKiBmaWxsIGluIFVEUCByZXBseSAqLworCWZyX3VkcF9wa3QtPndwX21nbXQucmVxdWVzdF9yZXBseSA9IFVEUE1HTVRfUkVQTFk7CisgIAorCS8qIGZpbGwgaW4gVURQIGxlbmd0aCAqLworCXVkcF9sZW5ndGggPSBzaXplb2YodWRwX3BrdF90KSsgCisJCSAgICAgc2l6ZW9mKHdwX21nbXRfdCkrCisJCSAgICAgc2l6ZW9mKGNibG9ja190KSsKKwkJICAgICBtYm94X2xlbjsgCisKKworCS8qIHB1dCBpdCBvbiBhbiBldmVuIGJvdW5kYXJ5ICovCisJaWYgKCB1ZHBfbGVuZ3RoICYgMHgwMDAxICkgeworCQl1ZHBfbGVuZ3RoICs9IDE7CisJCWxlbiArPSAxOworCQlldmVuX2JvdW5kID0gMTsKKwl9CisKKwl0ZW1wID0gKHVkcF9sZW5ndGg8PDgpfCh1ZHBfbGVuZ3RoPj44KTsKKwlmcl91ZHBfcGt0LT51ZHBfcGt0LnVkcF9sZW5ndGggPSB0ZW1wOworCSAKKwkvKiBzd2FwIFVEUCBwb3J0cyAqLworCXRlbXAgPSBmcl91ZHBfcGt0LT51ZHBfcGt0LnVkcF9zcmNfcG9ydDsKKwlmcl91ZHBfcGt0LT51ZHBfcGt0LnVkcF9zcmNfcG9ydCA9IAorCQkJZnJfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQ7IAorCWZyX3VkcF9wa3QtPnVkcF9wa3QudWRwX2RzdF9wb3J0ID0gdGVtcDsKKworCisKKwkvKiBhZGQgVURQIHBzZXVkbyBoZWFkZXIgKi8KKwl0ZW1wID0gMHgxMTAwOworCSooKHVuc2lnbmVkIHNob3J0ICopCisJCShmcl91ZHBfcGt0LT5kYXRhK21ib3hfbGVuK2V2ZW5fYm91bmQpKSA9IHRlbXA7CQorCXRlbXAgPSAodWRwX2xlbmd0aDw8OCl8KHVkcF9sZW5ndGg+PjgpOworCSooKHVuc2lnbmVkIHNob3J0ICopCisJCShmcl91ZHBfcGt0LT5kYXRhK21ib3hfbGVuK2V2ZW5fYm91bmQrMikpID0gdGVtcDsKKwkJIAorCS8qIGNhbGN1bGF0ZSBVRFAgY2hlY2tzdW0gKi8KKwlmcl91ZHBfcGt0LT51ZHBfcGt0LnVkcF9jaGVja3N1bSA9IDA7CisKKwlmcl91ZHBfcGt0LT51ZHBfcGt0LnVkcF9jaGVja3N1bSA9IAorCQljYWxjX2NoZWNrc3VtKCZkYXRhW1VEUF9PRkZTRVQvKitzaXplb2YoZnJfZW5jYXBfaGRyX3QpKi9dLAorCQkJICAgICAgdWRwX2xlbmd0aCtVRFBfT0ZGU0VUKTsKKworCS8qIGZpbGwgaW4gSVAgbGVuZ3RoICovCisJaXBfbGVuZ3RoID0gdWRwX2xlbmd0aCArIHNpemVvZihpcF9wa3RfdCk7CisJdGVtcCA9IChpcF9sZW5ndGg8PDgpfChpcF9sZW5ndGg+PjgpOworCWZyX3VkcF9wa3QtPmlwX3BrdC50b3RhbF9sZW5ndGggPSB0ZW1wOworICAKKwkvKiBzd2FwIElQIGFkZHJlc3NlcyAqLworCWlwX3RlbXAgPSBmcl91ZHBfcGt0LT5pcF9wa3QuaXBfc3JjX2FkZHJlc3M7CisJZnJfdWRwX3BrdC0+aXBfcGt0LmlwX3NyY19hZGRyZXNzID0gCisJCQkJZnJfdWRwX3BrdC0+aXBfcGt0LmlwX2RzdF9hZGRyZXNzOworCWZyX3VkcF9wa3QtPmlwX3BrdC5pcF9kc3RfYWRkcmVzcyA9IGlwX3RlbXA7CisKKwkJIAorCS8qIGZpbGwgaW4gSVAgY2hlY2tzdW0gKi8KKwlmcl91ZHBfcGt0LT5pcF9wa3QuaGRyX2NoZWNrc3VtID0gMDsKKwlmcl91ZHBfcGt0LT5pcF9wa3QuaGRyX2NoZWNrc3VtID0gCisJCWNhbGNfY2hlY2tzdW0oJmRhdGFbLypzaXplb2YoZnJfZW5jYXBfaGRyX3QpKi8wXSwKKwkJICAgICAgCSAgICAgIHNpemVvZihpcF9wa3RfdCkpOworCisJcmV0dXJuIGxlbjsKK30gLyogcmVwbHlfdWRwICovCisKK3Vuc2lnbmVkIHNob3J0IGNhbGNfY2hlY2tzdW0gKGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJdW5zaWduZWQgc2hvcnQgdGVtcDsgCisJdW5zaWduZWQgbG9uZyBzdW09MDsKKwlpbnQgaTsKKworCWZvciggaSA9IDA7IGkgPGxlbjsgaSs9MiApIHsKKwkJbWVtY3B5KCZ0ZW1wLCZkYXRhW2ldLDIpOworCQlzdW0gKz0gKHVuc2lnbmVkIGxvbmcpdGVtcDsKKwl9CisKKwl3aGlsZSAoc3VtID4+IDE2ICkgeworCQlzdW0gPSAoc3VtICYgMHhmZmZmVUwpICsgKHN1bSA+PiAxNik7CisJfQorCisJdGVtcCA9ICh1bnNpZ25lZCBzaG9ydClzdW07CisJdGVtcCA9IH50ZW1wOworCisJaWYoIHRlbXAgPT0gMCApIAorCQl0ZW1wID0gMHhmZmZmOworCisJcmV0dXJuIHRlbXA7CQorfQorCisvKgorICAgSWYgaW5jb21pbmcgaXMgMCAob3V0Z29pbmcpLSBpZiB0aGUgbmV0IG51bWJlcnMgaXMgb3VycyBtYWtlIGl0IDAKKyAgIGlmIGluY29taW5nIGlzIDEgLSBpZiB0aGUgbmV0IG51bWJlciBpcyAwIG1ha2UgaXQgb3VycyAKKworKi8KK3N0YXRpYyB2b2lkIHN3aXRjaF9uZXRfbnVtYmVycyh1bnNpZ25lZCBjaGFyICpzZW5kcGFja2V0LCB1bnNpZ25lZCBsb25nIG5ldHdvcmtfbnVtYmVyLCB1bnNpZ25lZCBjaGFyIGluY29taW5nKQoreworCXVuc2lnbmVkIGxvbmcgcG5ldHdvcmtfbnVtYmVyOworCisJcG5ldHdvcmtfbnVtYmVyID0gKHVuc2lnbmVkIGxvbmcpKChzZW5kcGFja2V0WzE0XSA8PCAyNCkgKyAKKwkJCSAgKHNlbmRwYWNrZXRbMTVdIDw8IDE2KSArIChzZW5kcGFja2V0WzE2XSA8PCA4KSArIAorCQkJICBzZW5kcGFja2V0WzE3XSk7CisKKwlpZiAoIWluY29taW5nKSB7CisJCS8qIElmIHRoZSBkZXN0aW5hdGlvbiBuZXR3b3JrIG51bWJlciBpcyBvdXJzLCBtYWtlIGl0IDAgKi8KKwkJaWYoIHBuZXR3b3JrX251bWJlciA9PSBuZXR3b3JrX251bWJlcikgeworCQkJc2VuZHBhY2tldFsxNF0gPSBzZW5kcGFja2V0WzE1XSA9IHNlbmRwYWNrZXRbMTZdID0gCisJCQkJCSBzZW5kcGFja2V0WzE3XSA9IDB4MDA7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJZiB0aGUgaW5jb21pbmcgbmV0d29yayBpcyAwLCBtYWtlIGl0IG91cnMgKi8KKwkJaWYoIHBuZXR3b3JrX251bWJlciA9PSAwKSB7CisJCQlzZW5kcGFja2V0WzE0XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciA+PiAyNCk7CisJCQlzZW5kcGFja2V0WzE1XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDBGRjAwMDApID4+IDE2KTsKKwkJCXNlbmRwYWNrZXRbMTZdID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMDAwRkYwMCkgPj4gOCk7CisJCQlzZW5kcGFja2V0WzE3XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMDAwMDBGRik7CisJCX0KKwl9CisKKworCXBuZXR3b3JrX251bWJlciA9ICh1bnNpZ25lZCBsb25nKSgoc2VuZHBhY2tldFsyNl0gPDwgMjQpICsgCisJCQkgIChzZW5kcGFja2V0WzI3XSA8PCAxNikgKyAoc2VuZHBhY2tldFsyOF0gPDwgOCkgKyAKKwkJCSAgc2VuZHBhY2tldFsyOV0pOworCisJaWYoICFpbmNvbWluZyApIHsKKwkJLyogSWYgdGhlIHNvdXJjZSBuZXR3b3JrIGlzIG91cnMsIG1ha2UgaXQgMCAqLworCQlpZiggcG5ldHdvcmtfbnVtYmVyID09IG5ldHdvcmtfbnVtYmVyKSB7CisJCQlzZW5kcGFja2V0WzI2XSA9IHNlbmRwYWNrZXRbMjddID0gc2VuZHBhY2tldFsyOF0gPSAKKwkJCQkJIHNlbmRwYWNrZXRbMjldID0gMHgwMDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIElmIHRoZSBzb3VyY2UgbmV0d29yayBpcyAwLCBtYWtlIGl0IG91cnMgKi8KKwkJaWYoIHBuZXR3b3JrX251bWJlciA9PSAwICkgeworCQkJc2VuZHBhY2tldFsyNl0gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgPj4gMjQpOworCQkJc2VuZHBhY2tldFsyN10gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwRkYwMDAwKSA+PiAxNik7CisJCQlzZW5kcGFja2V0WzI4XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDAwMEZGMDApID4+IDgpOworCQkJc2VuZHBhY2tldFsyOV0gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDAwMDAwRkYpOworCQl9CisJfQorfSAvKiBzd2l0Y2hfbmV0X251bWJlcnMgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZXQgZXRoZXJuZXQtc3R5bGUgaW50ZXJmYWNlIHN0YXRpc3RpY3MuCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHN0cnVjdCBlbmV0X3N0YXRpc3RpY3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaWZfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJCisJaWYoY2hhbiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmY2hhbi0+aWZzdGF0czsKK30KKworLyoqKioqKiBJbnRlcnJ1cHQgSGFuZGxlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogZnJfaXNyOglTNTA4IGZyYW1lIHJlbGF5IGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKgorICogRGVzY3JpcHRpb246CisgKglGcmFtZSByZWxheSBtYWluIGludGVycnVwdCBzZXJ2aWNlIHJvdXRlLiBUaGlzCisgKiAgICAgIGZ1bmN0aW9uIGNoZWNrIHRoZSBpbnRlcnJ1cHQgdHlwZSBhbmQgdGFrZXMKKyAqICAgICAgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbi4KKyAqLworc3RhdGljIHZvaWQgZnJfaXNyIChzZGxhX3QqIGNhcmQpCit7CisJZnI1MDhfZmxhZ3NfdCogZmxhZ3MgPSBjYXJkLT5mbGFnczsKKwljaGFyICpwdHIgPSAmZmxhZ3MtPmlmbGFnOworCWludCBpLGVycjsKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCisJLyogVGhpcyBmbGFnIHByZXZlbnRzIG5lc3Rpbmcgb2YgaW50ZXJydXB0cy4gIFNlZSBzZGxhX2lzcigpIHJvdXRpbmUKKyAgICAgICAgICogaW4gc2RsYW1haW4uYy4gICovCisJY2FyZC0+aW5faXNyID0gMTsKKwkKKwkrK2NhcmQtPnN0YXRpc3RpY3MuaXNyX2VudHJ5OworCisKKwkvKiBBbGwgcGVyaXBoZXJhbCAoY29uZmlndXJhaXRvbiwgcmUtY29uZmlndXJhdGlvbikgZXZlbnRzCisJICogdGFrZSBwcmVzaWRlbmNlIG92ZXIgdGhlIElTUi4gIFRodXMsIHJldHJpZ2dlciAqLworCWlmICh0ZXN0X2JpdChQRVJJX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSkgeworCQkrK2NhcmQtPnN0YXRpc3RpY3MuaXNyX2FscmVhZHlfY3JpdGljYWw7CisJCWdvdG8gZnJfaXNyX2V4aXQ7CisJfQorCQorICAgICAgICBpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCkgeworCQlpZiAodGVzdF9iaXQoU0VORF9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCB3aGlsZSBpbiBJU1I6IElmIFNlbmQgUnVubmluZyFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmRldm5hbWUpOworCQkJKytjYXJkLT5zdGF0aXN0aWNzLmlzcl9hbHJlYWR5X2NyaXRpY2FsOworCQkJZ290byBmcl9pc3JfZXhpdDsKKwkJfQorCX0KKworCXN3aXRjaCAoZmxhZ3MtPmlmbGFnKSB7CisKKyAgICAgICAgICAgICAgICBjYXNlIEZSX0lOVFJfUlhSRFk6ICAvKiByZWNlaXZlIGludGVycnVwdCAqLworCSAgICAJCSsrY2FyZC0+c3RhdGlzdGljcy5pc3Jfcng7CisgICAgICAgICAgCQlyeF9pbnRyKGNhcmQpOworICAgICAgICAgICAgCQlicmVhazsKKworCisgICAgICAgICAgICAgICAgY2FzZSBGUl9JTlRSX1RYUkRZOiAgLyogdHJhbnNtaXQgaW50ZXJydXB0ICovCisJICAgIAkJKysgY2FyZC0+c3RhdGlzdGljcy5pc3JfdHg7IAorCQkJdHhfaW50cihjYXJkKTsgCisgICAgICAgICAgICAJCWJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBGUl9JTlRSX1JFQURZOiAgCQorCSAgICAJCUludHJfdGVzdF9jb3VudGVyKys7CisJCQkrK2NhcmQtPnN0YXRpc3RpY3MuaXNyX2ludHJfdGVzdDsKKwkgICAgCQlicmVhazsJCisKKyAgICAgICAgICAgICAgICBjYXNlIEZSX0lOVFJfRExDOiAvKiBFdmVudCBpbnRlcnJ1cHQgb2NjdXJyZWQgKi8KKwkJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfUkVBRF9TVEFUVVM7CisJCQltYm94LT5jbWQubGVuZ3RoID0gMDsKKwkJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwkJCWlmIChlcnIpCisJCQkJZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KTsKKwkJCWJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBGUl9JTlRSX1RJTUVSOiAgLyogVGltZXIgaW50ZXJydXB0ICovCisJCQl0aW1lcl9pbnRyKGNhcmQpOworCQkJYnJlYWs7CisJCisJCWRlZmF1bHQ6CisJICAgIAkJKytjYXJkLT5zdGF0aXN0aWNzLmlzcl9zcHVyaW91czsKKyAgICAgICAgICAgIAkJc3B1cl9pbnRyKGNhcmQpOworCSAgICAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcnJ1cHQgVHlwZSAweCUwMlghXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLCBmbGFncy0+aWZsYWcpOworCSAgICAKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJRCBCeXRlcyA9ICIsY2FyZC0+ZGV2bmFtZSk7CisgCSAgICAJCWZvcihpID0gMDsgaSA8IDg7IGkgKyspCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiMHglMDJYICIsICoocHRyICsgMHgyOCArIGkpKTsKKwkgICAJIAlwcmludGsoS0VSTl9JTkZPICJcbiIpOwkKKyAgICAgICAgICAgIAorCQkJYnJlYWs7CisgICAgCX0KKworZnJfaXNyX2V4aXQ6CisJCisJY2FyZC0+aW5faXNyID0gMDsKKwlmbGFncy0+aWZsYWcgPSAwOworCXJldHVybjsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHJ4X2ludHIJUmVjZWl2ZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqCisgKiBEZXNjcmlwdGlvbgorICogCVVwb24gcmVjZWl2ZWluZyBhbiBpbnRlcnJ1cHQ6IAorICoJMS4gQ2hlY2sgdGhhdCB0aGUgZmlybXdhcmUgaXMgaW4gc3luYyB3aXRoIAorICogICAgIAkgICB0aGUgZHJpdmVyLiAKKyAqICAgICAgMi4gRmluZCBhbiBhcHByb3ByaWF0ZSBuZXR3b3JrIGludGVyZmFjZQorICogICAgICAgICBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgZGxjaSBudW1iZXIuCisgKgkzLiBDaGVjayB0aGF0IHRoZSBuZXRvd3JrIGludGVyZmFjZSBleGlzdHMKKyAqICAgICAgICAgYW5kIHRoYXQgaXQncyBzZXR1cCBwcm9wZXJseS4KKyAqCTQuIENvcHkgdGhlIGRhdGEgaW50byBhbiBza2IgYnVmZmVyLgorICoJNS4gQ2hlY2sgdGhlIHBhY2tldCB0eXBlIGFuZCB0YWtlCisgKiAgICAgICAgIGFwcHJvcHJpYXRlIGFjdG9uOiBVUEQsIEFQSSwgQVJQIG9yIERhdGEuCisgKi8KKworc3RhdGljIHZvaWQgcnhfaW50ciAoc2RsYV90KiBjYXJkKQoreworCWZyX3J4X2J1Zl9jdGxfdCogZnJidWYgPSBjYXJkLT5yeG1iOworCWZyNTA4X2ZsYWdzX3QqIGZsYWdzID0gY2FyZC0+ZmxhZ3M7CisJZnJfY2hhbm5lbF90KiBjaGFuOworCWNoYXIgKnB0ciA9ICZmbGFncy0+aWZsYWc7CisJc3RydWN0IHNrX2J1ZmYqIHNrYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworCXZvaWQqIGJ1ZjsKKwl1bnNpZ25lZCBkbGNpLCBsZW4sIG9mZnMsIGxlbl9pbmNsX2hkcjsKKwlpbnQgaSwgdWRwX3R5cGU7CQorCisKKwkvKiBDaGVjayB0aGF0IGZpcm13YXJlIGJ1ZmZlcnMgYXJlIGluIHN5bmMgKi8KKwlpZiAoZnJidWYtPmZsYWcgIT0gMHgwMSkgeworCisJCXByaW50ayhLRVJOX0lORk8gCisJCQkiJXM6IGNvcnJ1cHRlZCBSeCBidWZmZXIgQCAweCVYLCBmbGFnID0gMHglMDJYIVxuIiwgCisJCQljYXJkLT5kZXZuYW1lLCAodW5zaWduZWQpZnJidWYsIGZyYnVmLT5mbGFnKTsKKyAgICAgIAorCQlwcmludGsoS0VSTl9JTkZPICIlczogSUQgQnl0ZXMgPSAiLGNhcmQtPmRldm5hbWUpOworIAkJZm9yKGkgPSAwOyBpIDwgODsgaSArKykKKwkJCXByaW50ayhLRVJOX0lORk8gIjB4JTAyWCAiLCAqKHB0ciArIDB4MjggKyBpKSk7CisJCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisJCisJCSsrY2FyZC0+c3RhdGlzdGljcy5yeF9pbnRyX2NvcnJ1cHRfcnhfYmZyOworCisJCS8qIEJ1ZyBGaXg6IE1hciA2IDIwMDAKKyAgICAgICAgICAgICAgICAgKiBJZiB3ZSBnZXQgYSBjb3JydXB0ZWQgbWFpbGJveCwgaXQgbWVhbnMgdGhhdCBkcml2ZXIgCisgICAgICAgICAgICAgICAgICogaXMgb3V0IG9mIHN5bmMgd2l0aCB0aGUgZmlybXdhcmUuIFRoZXJlIGlzIG5vIHJlY292ZXJ5LgorICAgICAgICAgICAgICAgICAqIElmIHdlIGRvbid0IHR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzIGZvciB0aGlzIGNhcmQKKyAgICAgICAgICAgICAgICAgKiB0aGUgbWFjaGluZSB3aWxsIGNyYXNoLiAKKyAgICAgICAgICAgICAgICAgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENyaXRpY2FsIHJvdXRlciBmYWlsdXJlIC4uLiEhIVxuIiwgY2FyZC0+ZGV2bmFtZSk7CisJCXByaW50ayhLRVJOX0lORk8gIlBsZWFzZSBjb250YWN0IFNhbmdvbWEgVGVjaG5vbG9naWVzICFcbiIpOworCQlmcl9zZXRfaW50cl9tb2RlKGNhcmQsIDAsIDAsIDApOwkKKwkJcmV0dXJuOworCX0KKworCWxlbiAgPSBmcmJ1Zi0+bGVuZ3RoOworCWRsY2kgPSBmcmJ1Zi0+ZGxjaTsKKwlvZmZzID0gZnJidWYtPm9mZnNldDsKKworCS8qIEZpbmQgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGZvciB0aGlzIHBhY2tldCAqLworCWRldiA9IGZpbmRfY2hhbm5lbChjYXJkLCBkbGNpKTsKKyAgIAorCisJLyogQ2hlY2sgdGhhdCB0aGUgbmV0d29yayBpbnRlcmZhY2UgaXMgYWN0aXZlIGFuZAorICAgICAgICAgKiBwcm9wZXJseSBzZXR1cCAqLworCWlmIChkZXYgPT0gTlVMTCkgeworICAgCQlpZiggbmV0X3JhdGVsaW1pdCgpKSB7IAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlY2VpdmVkIGRhdGEgb24gdW5jb25maWd1cmVkIERMQ0kgJWQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSwgZGxjaSk7CisJCX0KKwkJKytjYXJkLT5zdGF0aXN0aWNzLnJ4X2ludHJfb25fb3JwaGFuZWRfRExDSTsgCisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCWdvdG8gcnhfZG9uZTsKKwl9CisKKwlpZiAoKGNoYW4gPSBkZXYtPnByaXYpID09IE5VTEwpeworCQlpZiggbmV0X3JhdGVsaW1pdCgpKSB7IAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlY2VpdmVkIGRhdGEgb24gdW5jb25maWd1cmVkIERMQ0kgJWQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSwgZGxjaSk7CisJCX0KKwkJKytjYXJkLT5zdGF0aXN0aWNzLnJ4X2ludHJfb25fb3JwaGFuZWRfRExDSTsgCisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCWdvdG8gcnhfZG9uZTsKKwl9CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7IAorCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikgfHwgKHNrYiA9PSBOVUxMKSl7CisKKwkJKytjaGFuLT5pZnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCisJCWlmKHNrYiA9PSBOVUxMKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7IAorCQkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJCSIlczogbm8gc29ja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlIVxuIiwgCisJCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCX0KKwkJCWNoYW4tPmRydnN0YXRzX3J4X2ludHIucnhfaW50cl9ub19zb2NrZXQgKys7CisJCX0gCisKKwkJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpeworCQkJY2hhbi0+ZHJ2c3RhdHNfcnhfaW50ci4KKwkJCQlyeF9pbnRyX2Rldl9ub3Rfc3RhcnRlZCArKzsKKwkJCWlmIChza2IpeworCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQl9CisJCX0KKwkJZ290byByeF9kb25lOworCX0KKworCS8qIENvcHkgZGF0YSBmcm9tIHRoZSBib2FyZCBpbnRvIHRoZSBzb2NrZXQgYnVmZmVyICovCisJaWYgKChvZmZzICsgbGVuKSA+IGNhcmQtPnUuZi5yeF90b3AgKyAxKSB7CisJCXVuc2lnbmVkIHRtcCA9IGNhcmQtPnUuZi5yeF90b3AgLSBvZmZzICsgMTsKKworCQlidWYgPSBza2JfcHV0KHNrYiwgdG1wKTsKKwkJc2RsYV9wZWVrKCZjYXJkLT5odywgb2ZmcywgYnVmLCB0bXApOworCQlvZmZzID0gY2FyZC0+dS5mLnJ4X2Jhc2U7CisJCWxlbiAtPSB0bXA7CisJfQorCisJYnVmID0gc2tiX3B1dChza2IsIGxlbik7CisJc2RsYV9wZWVrKCZjYXJkLT5odywgb2ZmcywgYnVmLCBsZW4pOworCisKKwkvKiBXZSBnb3QgdGhlIHBhY2tldCBmcm9tIHRoZSBiYXJkLiAKKyAgICAgICAgICogQ2hlY2sgdGhlIHBhY2tldCB0eXBlIGFuZCB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiAqLworCisJdWRwX3R5cGUgPSB1ZHBfcGt0X3R5cGUoIHNrYiwgY2FyZCApOworCisJaWYodWRwX3R5cGUgIT0gVURQX0lOVkFMSURfVFlQRSkgeworCisJCS8qIFVEUCBEZWJ1ZyBwYWNrZXQgcmVjZWl2ZWQsIHN0b3JlIHRoZQorCQkgKiBwYWNrZXQgYW5kIGhhbmRsZSBpdCBpbiB0aW1lciBpbnRlcnJ1cHQgKi8KKworCQlza2JfcHVsbChza2IsIDEpOyAKKwkJaWYgKHdhbnJvdXRlcl90eXBlX3RyYW5zKHNrYiwgZGV2KSl7IAorCQkJaWYoc3RvcmVfdWRwX21nbXRfcGt0KHVkcF90eXBlLFVEUF9QS1RfRlJNX05FVFdPUkssY2FyZCxza2IsZGxjaSkpeworCisJCQkJZmxhZ3MtPmltYXNrIHw9IEZSX0lOVFJfVElNRVI7CisKKwkJCQlpZiAodWRwX3R5cGUgPT0gVURQX0ZQSVBFX1RZUEUpeworCQkJCQkrK2NoYW4tPmRydnN0YXRzX3J4X2ludHIucnhfaW50cl9QSVBFX3JlcXVlc3Q7CisJCQkJfQorCQkJfQorCQl9CisKKwl9ZWxzZSBpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpIHsKKworCQkvKiBXZSBhcmUgaW4gQVBJIG1vZGUuIAorICAgICAgICAgICAgICAgICAqIEFkZCBhbiBBUEkgaGVhZGVyIHRvIHRoZSBSQVcgcGFja2V0CisgICAgICAgICAgICAgICAgICogYW5kIHF1ZXVlIGl0IGludG8gYSBjaXJjdWxhciBidWZmZXIuCisgICAgICAgICAgICAgICAgICogVGhlbiBraWNrIHRoZSBmcl9iaCgpIGJvdHRvbSBoYWxmIGhhbmRsZXIgKi8KKworCQlhcGlfcnhfaGRyX3QqIGFwaV9yeF9oZHI7CisJCWNoYW4tPmRydnN0YXRzX3J4X2ludHIucnhfaW50cl9iZnJfcGFzc2VkX3RvX3N0YWNrICsrOworCQljaGFuLT5pZnN0YXRzLnJ4X3BhY2tldHMgKys7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9wYWNrZXRzICsrOworCisJCWNoYW4tPmlmc3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworCQlza2JfcHVzaChza2IsIHNpemVvZihhcGlfcnhfaGRyX3QpKTsKKwkJYXBpX3J4X2hkciA9IChhcGlfcnhfaGRyX3QqKSZza2ItPmRhdGFbMHgwMF07CisJCWFwaV9yeF9oZHItPmF0dHIgPSBmcmJ1Zi0+YXR0cjsKKwkJYXBpX3J4X2hkci0+dGltZV9zdGFtcCA9IGZyYnVmLT50bXN0YW1wOworCisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJCXNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7CisJCXNrYi0+ZGV2ICAgICAgPSBkZXY7CisJCXNrYi0+cGt0X3R5cGUgPSBXQU5fUEFDS0VUX0RBVEE7CisKKwkJYmhfZW5xdWV1ZShkZXYsIHNrYik7CisKKwkJdHJpZ2dlcl9mcl9iaChjaGFuKTsKKworCX1lbHNlIGlmIChoYW5kbGVfSVBYV0FOKHNrYi0+ZGF0YSxjaGFuLT5uYW1lLGNoYW4tPmVuYWJsZV9JUFgsIGNoYW4tPm5ldHdvcmtfbnVtYmVyKSl7CisKKwkJLy9GSVhNRTogRnJhbWUgUmVsYXkgSVBYIGlzIG5vdCBzdXBwb3J0ZWQsIFlldCAhCisJCS8vaWYgKGNoYW4tPmVuYWJsZV9JUFgpIHsKKwkJLy8JZnJfc2VuZChjYXJkLCBkbGNpLCAwLCBza2ItPmxlbixza2ItPmRhdGEpOworCQkvL30KKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCX0gZWxzZSBpZiAoaXNfYXJwKHNrYi0+ZGF0YSkpIHsKKworCQkvKiBBUlAgc3VwcG9ydCBlbmFibGVkIE1hciAxNiAyMDAwIAorCQkgKiBQcm9jZXNzIGluY29taW5nIEFSUCByZXBseS9yZXF1ZXN0LCBzZXR1cAorCQkgKiBkeW5hbWljIHJvdXRlcy4gKi8gCisKKwkJaWYgKHByb2Nlc3NfQVJQKChhcnBoZHJfMTQ5MF90ICopc2tiLT5kYXRhLCBjYXJkLCBkZXYpKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKXsgIAorCQkJCXByaW50ayAoS0VSTl9JTkZPIAorCQkJCSAgICIlczogRXJyb3IgcHJvY2Vzc2luZyBBUlAgUGFja2V0LlxuIiwgCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJfQorCQl9CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwl9IGVsc2UgaWYgKHNrYi0+ZGF0YVswXSAhPSAweDAzKSB7CisKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeyAKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBOb24gSUVURiBwYWNrZXQgZGlzY2FyZGVkLlxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0KKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCX0gZWxzZSB7CisKKwkJbGVuX2luY2xfaGRyID0gc2tiLT5sZW47CisJCS8qIERlY2Fwc3VsYXRlIHBhY2tldCBhbmQgcGFzcyBpdCB1cCB0aGUKKwkJICAgcHJvdG9jb2wgc3RhY2sgKi8KKwkJc2tiLT5kZXYgPSBkZXY7CisJCQorCQlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBCUklER0UgfHwgY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBCUklER0VfTk9ERSl7CisJCQorCQkJLyogTWFrZSBzdXJlIGl0J3MgYW4gRXRoZXJuZXQgZnJhbWUsIG90aGVyd2lzZSBkcm9wIGl0ICovCisJCQlpZiAoIW1lbWNtcChza2ItPmRhdGEsICJceDAzXHgwMFx4ODBceDAwXHg4MFx4QzJceDAwXHgwNyIsIDgpKSB7CisJCQkJc2tiX3B1bGwoc2tiLCA4KTsKKwkJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkJfWVsc2V7CisJCQkJKytjaGFuLT5kcnZzdGF0c19yeF9pbnRyLnJ4X2ludHJfYmZyX25vdF9wYXNzZWRfdG9fc3RhY2s7CisJCQkJKytjaGFuLT5pZnN0YXRzLnJ4X2Vycm9yczsKKwkJCQkrK2NhcmQtPndhbmRldi5zdGF0cy5yeF9lcnJvcnM7CisJCQkJZ290byByeF9kb25lOworCQkJfQorCQl9ZWxzZXsKKwkJCisJCQkvKiByZW1vdmUgaGFyZHdhcmUgaGVhZGVyICovCisJCQlidWYgPSBza2JfcHVsbChza2IsIDEpOyAKKwkJCQorCQkJaWYgKCF3YW5yb3V0ZXJfdHlwZV90cmFucyhza2IsIGRldikpIHsKKwkJCQkKKwkJCQkvKiBjYW4ndCBkZWNhcHN1bGF0ZSBwYWNrZXQgKi8KKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCisJCQkJKytjaGFuLT5kcnZzdGF0c19yeF9pbnRyLnJ4X2ludHJfYmZyX25vdF9wYXNzZWRfdG9fc3RhY2s7CisJCQkJKytjaGFuLT5pZnN0YXRzLnJ4X2Vycm9yczsKKwkJCQkrK2NhcmQtPndhbmRldi5zdGF0cy5yeF9lcnJvcnM7CisJCQkJZ290byByeF9kb25lOwkKKwkJCX0KKwkJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJfSAKKwkJCisKKwkJLyogU2VuZCBhIHBhY2tldCB1cCB0aGUgSVAgc3RhY2sgKi8KKwkJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQluZXRpZl9yeChza2IpOworCQkrK2NoYW4tPmRydnN0YXRzX3J4X2ludHIucnhfaW50cl9iZnJfcGFzc2VkX3RvX3N0YWNrOworCQkrK2NoYW4tPmlmc3RhdHMucnhfcGFja2V0czsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfcGFja2V0czsKKworCQljaGFuLT5pZnN0YXRzLnJ4X2J5dGVzICs9IGxlbl9pbmNsX2hkcjsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2J5dGVzICs9IGxlbl9pbmNsX2hkcjsKKwl9CisKK3J4X2RvbmU6CisKKyAgICAgICAJLyogUmVsZWFzZSBidWZmZXIgZWxlbWVudCBhbmQgY2FsY3VsYXRlIGEgcG9pbnRlciB0byB0aGUgbmV4dCBvbmUgKi8gCisgICAgICAgCWZyYnVmLT5mbGFnID0gMDsKKwljYXJkLT5yeG1iID0gKytmcmJ1ZjsKKwlpZiAoKHZvaWQqKWZyYnVmID4gY2FyZC0+dS5mLnJ4bWJfbGFzdCkKKwkJY2FyZC0+cnhtYiA9IGNhcmQtPnUuZi5yeG1iX2Jhc2U7CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHR4X2ludHI6CVRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyLgorICoKKyAqIFJhdGlvbmFsZToKKyAqICAgICAgSWYgdGhlIGJvYXJkIGlzIGJ1c3kgdHJhbnNtaXR0aW5nLCBpZl9zZW5kKCkgd2lsbAorICogICAgICBidWZmZXJzIGEgc2luZ2xlIHBhY2tldCBhbmQgdHVybiBvbgorICogICAgICB0aGUgdHggaW50ZXJydXB0LiBUeCBpbnRlcnJ1cHQgd2lsbCBiZSBjYWxsZWQKKyAqICAgICAgYnkgdGhlIGJvYXJkLCBvbmNlIHRoZSBmaXJtd2FyZSBjYW4gc2VuZCBtb3JlCisgKiAgICAgIGRhdGEuIFRodXMsIG5vIHBvbGxpbmcgaXMgcmVxdWlyZWQuCSAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVR4IGludGVycnVwdCBpcyBjYWxsZWQgZm9yIGVhY2ggCisgKiAgICAgIGNvbmZpZ3VyZWQgZGxjaSBjaGFubmVsLiBUaHVzOiAKKyAqIAkxLiBPYnRhaW4gdGhlIG5ldG93cmsgaW50ZXJmYWNlIGJhc2VkIG9uIHRoZQorICogICAgICAgICBkbGNpIG51bWJlci4KKyAqICAgICAgMi4gQ2hlY2sgdGhhdCBuZXR3b3JrIGludGVyZmFjZSBpcyB1cCBhbmQKKyAqICAgICAgICAgcHJvcGVybHkgc2V0dXAuCisgKiAJMy4gQ2hlY2sgZm9yIGEgYnVmZmVyZWQgcGFja2V0LgorICogICAgICA0LiBUcmFuc21pdCB0aGUgcGFja2V0LgorICoJNS4gSWYgd2UgYXJlIGluIFdBTlBJUEUgbW9kZSwgbWFyayB0aGUgCisgKiAgICAgICAgIE5FVF9CSCBoYW5kbGVyLiAKKyAqICAgICAgNi4gSWYgd2UgYXJlIGluIEFQSSBtb2RlLCBraWNrCisgKiAgICAgICAgIHRoZSBBRl9XQU5QSVBFIHNvY2tldCBmb3IgbW9yZSBkYXRhLiAKKyAqCSAgIAorICovCitzdGF0aWMgdm9pZCB0eF9pbnRyKHNkbGFfdCAqY2FyZCkKK3sKKyAgICAgICAgZnI1MDhfZmxhZ3NfdCogZmxhZ3MgPSBjYXJkLT5mbGFnczsKKyAgICAgICAgZnJfdHhfYnVmX2N0bF90KiBiY3RsOworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworICAgICAgICBmcl9jaGFubmVsX3QqIGNoYW47CisKKyAgICAgICAgaWYoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpeworICAgICAgICAgICAgICAgIGJjdGwgPSAodm9pZCopKGZsYWdzLT50c2Vfb2ZmcyArIGNhcmQtPmh3LmRwbWJhc2UpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBiY3RsID0gKHZvaWQqKShmbGFncy0+dHNlX29mZnMgLSBGUl9NQl9WRUNUT1IgKworICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+aHcuZHBtYmFzZSk7CisJfQorCisgICAgICAgIC8qIEZpbmQgdGhlIHN0cnVjdHVyZSBhbmQgbWFrZSBpdCB1bmJ1c3kgKi8KKyAgICAgICAgZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsIGZsYWdzLT5kbGNpKTsKKwlpZiAoZGV2ID09IE5VTEwpeworCQlwcmludGsoS0VSTl9JTkZPICJOTyBERVYgSU4gVFggSW50ZXJydXB0XG4iKTsJCisJCWdvdG8gZW5kX29mX3R4X2ludHI7CisJfQorCisgICAgICAgIGlmICgoY2hhbiA9IGRldi0+cHJpdikgPT0gTlVMTCl7CisJCXByaW50ayhLRVJOX0lORk8gIk5PIENIQU4gSU4gVFggSW50ZXJydXB0XG4iKTsJCisJCWdvdG8gZW5kX29mX3R4X2ludHI7CisJfQorCisgICAgICAgIGlmKCFjaGFuLT50cmFuc21pdF9sZW5ndGggfHwgIWNoYW4tPmRlbGF5X3NrYikgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiB0eCBpbnQgZXJyb3IgLSB0cmFuc21pdCBsZW5ndGggemVyb1xuIiwKKwkJCQljYXJkLT53YW5kZXYubmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBlbmRfb2ZfdHhfaW50cjsKKyAgICAgICAgfQorCisJLyogSWYgdGhlICdpZl9zZW5kKCknIHByb2NlZHVyZSBpcyBjdXJyZW50bHkgY2hlY2tpbmcgdGhlICd0YnVzeScKKwkgICBzdGF0dXMsIHRoZW4gd2UgY2Fubm90IHRyYW5zbWl0LiBJbnN0ZWFkLCB3ZSBjb25maWd1cmUgdGhlIG1pY3JvY29kZQorCSAgIHNvIGFzIHRvIHJlLWlzc3VlIHRoaXMgdHJhbnNtaXQgaW50ZXJydXB0IGF0IGEgbGF0ZXIgc3RhZ2UuIAorCSovCisJaWYgKHRlc3RfYml0KFNFTkRfVFhJUlFfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisKKwkJZnJfZGxjaV9pbnRlcmZhY2VfdCogZGxjaV9pbnRlcmZhY2UgPSBjaGFuLT5kbGNpX2ludF9pbnRlcmZhY2U7CisJCWJjdGwtPmZsYWcgPSAweEEwOworCQlkbGNpX2ludGVyZmFjZS0+Z2VuX2ludGVycnVwdCB8PSBGUl9JTlRSX1RYUkRZOworCQlyZXR1cm47CisKKyAJfWVsc2V7CisgICAgICAgIAliY3RsLT5kbGNpID0gZmxhZ3MtPmRsY2k7CisJICAgICAgICBiY3RsLT5sZW5ndGggPSBjaGFuLT50cmFuc21pdF9sZW5ndGgrY2hhbi0+ZnJfaGVhZGVyX2xlbjsKKyAgICAgICAgCXNkbGFfcG9rZSgmY2FyZC0+aHcsIAorCQkgICAgICAgICAgZnJfc2VuZF9oZHIoY2FyZCxiY3RsLT5kbGNpLGJjdGwtPm9mZnNldCksIAorCQkJICBjaGFuLT5kZWxheV9za2ItPmRhdGEsCisgCSAgICAgICAgICAgICAgCSAgY2hhbi0+ZGVsYXlfc2tiLT5sZW4pOworCSAgICAgICAgYmN0bC0+ZmxhZyA9IDB4QzA7CisKKwkJKytjaGFuLT5pZnN0YXRzLnR4X3BhY2tldHM7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X3BhY2tldHM7CisJCWNoYW4tPmlmc3RhdHMudHhfYnl0ZXMgKz0gY2hhbi0+dHJhbnNtaXRfbGVuZ3RoOworCQljYXJkLT53YW5kZXYuc3RhdHMudHhfYnl0ZXMgKz0gY2hhbi0+dHJhbnNtaXRfbGVuZ3RoOworCisJCS8qIFdlIG11c3QgZnJlZSBhbiBzayBidWZmZXIsIHdoaWNoIHdlIHVzZWQKKwkJICogZm9yIGRlbGF5ZWQgdHJhbnNtaXNzaW9uOyBPdGhlcndpc2UsIHRoZSBzb2NrCisJCSAqIHdpbGwgcnVuIG91dCBvZiBtZW1vcnkgKi8KKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShjaGFuLT5kZWxheV9za2IpOworCisJCWNoYW4tPmRlbGF5X3NrYiA9IE5VTEw7CQkJCQorICAgICAgICAJY2hhbi0+dHJhbnNtaXRfbGVuZ3RoID0gMDsKKworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKXsKKwkJCS8qIElmIHVzaW5nIEFQSSwgdGhhbiB3YWtldXAgc29ja2V0IEJIIGhhbmRsZXIgKi8KKwkJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCQl3YWtldXBfc2tfYmgoZGV2KTsKKwkJCX1lbHNleworCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCX0KKwkJfQorCX0KKworZW5kX29mX3R4X2ludHI6CisKKyAJLyogaWYgYW55IG90aGVyIGludGVyZmFjZXMgaGF2ZSB0cmFuc21pdCBpbnRlcnJ1cHRzIHBlbmRpbmcsIAorCSAqIGRvIG5vdCBkaXNhYmxlIHRoZSBnbG9iYWwgdHJhbnNtaXQgaW50ZXJydXB0ICovCisJaWYoISgtLSBjYXJkLT51LmYudHhfaW50ZXJydXB0c19wZW5kaW5nKSkKKyAgICAgICAJICAgICAgICBmbGFncy0+aW1hc2sgJj0gfkZSX0lOVFJfVFhSRFk7CisKKworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdGltZXJfaW50cjoJVGltZXIgaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICogUmF0aW9uYWxlOgorICoJQWxsIGNvbW1hbnMgbXVzdCBiZSBleGVjdXRlZCB3aXRoaW4gdGhlIHRpbWVyCisgKiAgICAgIGludGVycnVwdCBzaW5jZSBubyB0d28gY29tbWFuZHMgc2hvdWxkIGV4ZWN1dGUKKyAqICAgICAgYXQgdGhlIHNhbWUgdGltZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSB0aW1lciBpbnRlcnJ1cHQgaXMgdXNlZCB0bzoKKyAqICAgIAkxLiBQcm9jZXNzaW5nIHVkcCBjYWxscyBmcm9tICdmcGlwZW1vbicuCisgKiAgICAJMi4gUHJvY2Vzc2luZyB1cGRhdGUgY2FsbHMgZnJvbSAvcHJvYyBmaWxlIHN5c3RlbQorICogICAJMy4gUmVhZGluZyBib2FyZC1sZXZlbCBzdGF0aXN0aWNzIGZvciAKKyAqICAgICAgICAgdXBkYXRpbmcgdGhlIHByb2MgZmlsZSBzeXN0ZW0uCisgKiAgICAJNC4gU2VuZGluZyBpbnZlcnNlIEFSUCByZXF1ZXN0IHBhY2tldHMuCisgKgk1LiBDb25maWd1cmUgYSBkbGNpL2NoYW5uZWwuCisgKgk2LiBVbmNvbmZpZ3VyZSBhIGRsY2kvY2hhbm5lbC4gKE5vZGUgb25seSkKKyAqLworCitzdGF0aWMgdm9pZCB0aW1lcl9pbnRyKHNkbGFfdCAqY2FyZCkKK3sKKwlmcjUwOF9mbGFnc190KiBmbGFncyA9IGNhcmQtPmZsYWdzOworCisJLyogVURQIERlYnVnaW5nOiBmcGlwZW1vbiBjYWxsICovCisgICAgICAgIGlmIChjYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVURQKSB7CisJCWlmKGNhcmQtPnUuZi51ZHBfdHlwZSA9PSBVRFBfRlBJUEVfVFlQRSkgeworICAgICAgICAgICAgICAgICAgICAJaWYocHJvY2Vzc191ZHBfbWdtdF9wa3QoY2FyZCkpIHsKKwkJICAgICAgICAgICAgICAgIGNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCAmPQorCQkJCQl+VE1SX0lOVF9FTkFCTEVEX1VEUDsKKwkJCX0KKwkJfQorICAgICAgICB9CisKKwkvKiAvcHJvYyB1cGRhdGUgY2FsbCA6IHRyaWdnZXJlZCBmcm9tIHVwZGF0ZSgpICovCisJaWYgKGNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VUERBVEUpIHsKKwkJZnJfZ2V0X2Vycl9zdGF0cyhjYXJkKTsKKwkJZnJfZ2V0X3N0YXRzKGNhcmQpOworCQljYXJkLT51LmYudXBkYXRlX2NvbW1zX3N0YXRzID0gMDsKKwkJY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfVVBEQVRFOworCX0KKworCS8qIFVwZGF0ZSB0aGUgY2hhbm5lbCBzdGF0ZSBjYWxsLiAgVGhpcyBpcyBjYWxsIGlzCisgICAgICAgICAqIHRyaWdnZXJlZCBieSBpZl9zZW5kKCkgZnVuY3Rpb24gKi8KKwlpZiAoY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1VQREFURV9TVEFURSl7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCWlmIChjYXJkLT53YW5kZXYuc3RhdGUgPT0gV0FOX0NPTk5FQ1RFRCl7CisJCQlmb3IgKGRldiA9IGNhcmQtPndhbmRldi5kZXY7IGRldjsKKwkJCSAgICAgZGV2ID0gKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KSl7CisJCQkJZnJfY2hhbm5lbF90ICpjaGFuID0gZGV2LT5wcml2OwkKKwkJCQlpZiAoY2hhbi0+Y29tbW9uLnN0YXRlICE9IFdBTl9DT05ORUNURUQpeworCQkJCQl1cGRhdGVfY2hhbl9zdGF0ZShkZXYpOworCQkJCX0KKwkJCX0KKwkJfQorCQljYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9VUERBVEVfU1RBVEU7CisJfQorCisJLyogY29uZmlndXJlIGEgZGxjaS9jaGFubmVsICovCisJaWYgKGNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9DT05GSUcpeworCQljb25maWdfZnIoY2FyZCk7CisJCWNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX0NPTkZJRzsKKwl9CisKKwkvKiB1bmNvbmZpZ3VyZSBhIGRsY2kvY2hhbm5lbCAqLworCWlmIChjYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVU5DT05GSUcpeworCQl1bmNvbmZpZ19mcihjYXJkKTsKKwkJY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfVU5DT05GSUc7CisJfQorCisJCisJLyogVHJhbnNtaXQgQVJQIHBhY2tldHMgKi8KKwlpZiAoY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX0FSUCl7CisJCWludCBpPTA7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkJaWYgKGNhcmQtPnUuZi5hcnBfZGV2ID09IE5VTEwpCisJCQljYXJkLT51LmYuYXJwX2RldiA9IGNhcmQtPndhbmRldi5kZXY7CisKKwkJZGV2ID0gY2FyZC0+dS5mLmFycF9kZXY7CisKKwkJZm9yICg7Oyl7IAorCisJCQlmcl9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisKKwkJCS8qIElmIHRoZSBpbnRlcmZhY2UgaXMgYnJvdWdodCBkb3duIGNhbmNlbCBzZW5kaW5nIEluLUFSUHMgKi8KKwkJCWlmICghKGRldi0+ZmxhZ3MmSUZGX1VQKSl7CisJCQkJY2xlYXJfYml0KDAsJmNoYW4tPmluYXJwX3JlYWR5KTsJCisJCQl9CisKKwkJCWlmICh0ZXN0X2JpdCgwLCZjaGFuLT5pbmFycF9yZWFkeSkpeworCisJCQkJaWYgKGNoZWNrX3R4X3N0YXR1cyhjYXJkLGRldikpeworCQkJCQlzZXRfYml0KEFSUF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoIXNlbmRfaW5hcnBfcmVxdWVzdChjYXJkLGRldikpeworCQkJCQl0cmlnZ2VyX2ZyX2FycChkZXYpOworCQkJCQljaGFuLT5pbmFycF90aWNrID0gamlmZmllczsKKwkJCQl9CisKKwkJCQljbGVhcl9iaXQoMCwmY2hhbi0+aW5hcnBfcmVhZHkpOworCQkJCWRldiA9IG1vdmVfZGV2X3RvX25leHQoY2FyZCxkZXYpOworCQkJCWJyZWFrOworCQkJfQorCQkJZGV2ID0gbW92ZV9kZXZfdG9fbmV4dChjYXJkLGRldik7CisKKwkJCWlmICgrK2kgPT0gY2FyZC0+d2FuZGV2Lm5ld19pZl9jbnQpeworCQkJCWNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX0FSUDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQljYXJkLT51LmYuYXJwX2RldiA9IGRldjsKKwl9CisKKyAgICAgICAgaWYoIWNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCkKKyAgICAgICAgICAgICAgICBmbGFncy0+aW1hc2sgJj0gfkZSX0lOVFJfVElNRVI7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBzcHVyX2ludHI6CVNwdXJpb3VzIGludGVycnVwdCBoYW5kbGVyLgorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqICAJV2UgZG9uJ3Qga25vdyB0aGlzIGludGVycnVwdC4KKyAqICAgICAgUHJpbnQgYSB3YXJuaW5nLgorICovCisKK3N0YXRpYyB2b2lkIHNwdXJfaW50ciAoc2RsYV90KiBjYXJkKQoreworCWlmIChuZXRfcmF0ZWxpbWl0KCkpeyAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNwdXJpb3VzIGludGVycnVwdCFcbiIsIGNhcmQtPmRldm5hbWUpOworCX0KK30KKworCisvL0ZJWE1FOiBGaXggdGhlIElQWCBpbiBuZXh0IHZlcnNpb24KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgUmV0dXJuIDAgZm9yIG5vbi1JUFhXQU4gcGFja2V0CisgKiAgICAgICAgIDEgZm9yIElQWFdBTiBwYWNrZXQgb3IgSVBYIGlzIG5vdCBlbmFibGVkIQorICogIEZJWE1FOiBVc2UgYSBJUFggc3RydWN0dXJlIGhlcmUgbm90IG9mZnNldHMKKyAqLworc3RhdGljIGludCBoYW5kbGVfSVBYV0FOKHVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQsIAorCQkJIGNoYXIgKmRldm5hbWUsIHVuc2lnbmVkIGNoYXIgZW5hYmxlX0lQWCwgCisJCQkgdW5zaWduZWQgbG9uZyBuZXR3b3JrX251bWJlcikKK3sKKwlpbnQgaTsKKworCWlmKCBzZW5kcGFja2V0WzFdID09IDB4MDAgJiYgc2VuZHBhY2tldFsyXSA9PSAweDgwICYmCisJICAgIHNlbmRwYWNrZXRbNl0gPT0gMHg4MSAmJiBzZW5kcGFja2V0WzddID09IDB4MzcpIHsgCisKKwkJLyogSXQncyBhbiBJUFggcGFja2V0ICovCisJCWlmICghZW5hYmxlX0lQWCl7CisJCQkvKiBSZXR1cm4gMSBzbyB3ZSBkb24ndCBwYXNzIGl0IHVwIHRoZSBzdGFjay4gKi8KKwkJCS8vRklYTUU6IFRha2UgdGhpcyBvdXQgd2hlbiBJUFggaXMgZml4ZWQKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeyAKKwkJCQlwcmludGsgKEtFUk5fSU5GTyAKKwkJCQkiJXM6IFdBUk5JTkc6IFVuc3VwcG9ydGVkIElQWCBwYWNrZXQgcmVjZWl2ZWQgYW5kIGRyb3BwZWRcbiIsCisJCQkJCWRldm5hbWUpOworCQkJfQorCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJdCdzIG5vdCBJUFggc28gcmV0dXJuIGFuZCBwYXNzIGl0IHVwIHRoZSBzdGFjay4gKi8KKwkJcmV0dXJuIDA7CisJfQorCisJaWYoIHNlbmRwYWNrZXRbMjRdID09IDB4OTAgJiYgc2VuZHBhY2tldFsyNV0gPT0gMHgwNCl7CisJCS8qIEl0J3MgSVBYV0FOICovCisKKwkJaWYoIHNlbmRwYWNrZXRbMTBdID09IDB4MDIgJiYgc2VuZHBhY2tldFs0Ml0gPT0gMHgwMCl7CisKKwkJCS8qIEl0J3MgYSB0aW1lciByZXF1ZXN0IHBhY2tldCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlY2VpdmVkIElQWFdBTiBUaW1lciBSZXF1ZXN0IHBhY2tldFxuIiwKKwkJCQkJZGV2bmFtZSk7CisKKwkJCS8qIEdvIHRocm91Z2ggdGhlIHJvdXRpbmcgb3B0aW9ucyBhbmQgYW5zd2VyIG5vIHRvIGV2ZXJ5CisJCQkgKiBvcHRpb24gZXhjZXB0IFVubnVtYmVyZWQgUklQL1NBUAorCQkJICovCisJCQlmb3IoaSA9IDQ5OyBzZW5kcGFja2V0W2ldID09IDB4MDA7IGkgKz0gNSl7CisJCQkJLyogMHgwMiBpcyB0aGUgb3B0aW9uIGZvciBVbm51bWJlcmVkIFJJUC9TQVAgKi8KKwkJCQlpZiggc2VuZHBhY2tldFtpICsgNF0gIT0gMHgwMil7CisJCQkJCXNlbmRwYWNrZXRbaSArIDFdID0gMDsKKwkJCQl9CisJCQl9CisKKwkJCS8qIFNraXAgb3ZlciB0aGUgZXh0ZW5kZWQgTm9kZSBJRCBvcHRpb24gKi8KKwkJCWlmKCBzZW5kcGFja2V0W2ldID09IDB4MDQgKXsKKwkJCQlpICs9IDg7CisJCQl9CisKKwkJCS8qIFdlIGFsc28gd2FudCB0byB0dXJuIG9mZiBhbGwgaGVhZGVyIGNvbXByZXNzaW9uIG9wdC4KKwkJCSAqLworCQkJZm9yKDsgc2VuZHBhY2tldFtpXSA9PSAweDgwIDspeworCQkJCXNlbmRwYWNrZXRbaSArIDFdID0gMDsKKwkJCQlpICs9IChzZW5kcGFja2V0W2kgKyAyXSA8PCA4KSArIChzZW5kcGFja2V0W2kgKyAzXSkgKyA0OworCQkJfQorCisJCQkvKiBTZXQgdGhlIHBhY2tldCB0eXBlIHRvIHRpbWVyIHJlc3BvbnNlICovCisJCQlzZW5kcGFja2V0WzQyXSA9IDB4MDE7CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZW5kaW5nIElQWFdBTiBUaW1lciBSZXNwb25zZVxuIiwKKwkJCQkJZGV2bmFtZSk7CisKKwkJfSBlbHNlIGlmKCBzZW5kcGFja2V0WzQyXSA9PSAweDAyICl7CisKKwkJCS8qIFRoaXMgaXMgYW4gaW5mb3JtYXRpb24gcmVxdWVzdCBwYWNrZXQgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBSZWNlaXZlZCBJUFhXQU4gSW5mb3JtYXRpb24gUmVxdWVzdCBwYWNrZXRcbiIsCisJCQkJCQlkZXZuYW1lKTsKKworCQkJLyogU2V0IHRoZSBwYWNrZXQgdHlwZSB0byBpbmZvcm1hdGlvbiByZXNwb25zZSAqLworCQkJc2VuZHBhY2tldFs0Ml0gPSAweDAzOworCisJCQkvKiBTZXQgdGhlIHJvdXRlciBuYW1lICovCisJCQlzZW5kcGFja2V0WzU5XSA9ICdGJzsKKwkJCXNlbmRwYWNrZXRbNjBdID0gJ1AnOworCQkJc2VuZHBhY2tldFs2MV0gPSAnSSc7CisJCQlzZW5kcGFja2V0WzYyXSA9ICdQJzsKKwkJCXNlbmRwYWNrZXRbNjNdID0gJ0UnOworCQkJc2VuZHBhY2tldFs2NF0gPSAnLSc7CisJCQlzZW5kcGFja2V0WzY1XSA9IENWSGV4VG9Bc2NpaShuZXR3b3JrX251bWJlciA+PiAyOCk7CisJCQlzZW5kcGFja2V0WzY2XSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDBGMDAwMDAwKT4+IDI0KTsKKwkJCXNlbmRwYWNrZXRbNjddID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDBGMDAwMDApPj4gMjApOworCQkJc2VuZHBhY2tldFs2OF0gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMDBGMDAwMCk+PiAxNik7CisJCQlzZW5kcGFja2V0WzY5XSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDAwMDBGMDAwKT4+IDEyKTsKKwkJCXNlbmRwYWNrZXRbNzBdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMDBGMDApPj4gOCk7CisJCQlzZW5kcGFja2V0WzcxXSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDAwMDAwMEYwKT4+IDQpOworCQkJc2VuZHBhY2tldFs3Ml0gPSBDVkhleFRvQXNjaWkobmV0d29ya19udW1iZXIgJiAweDAwMDAwMDBGKTsKKwkJCWZvcihpID0gNzM7IGkgPCAxMDc7IGkrPSAxKQorCQkJeworCQkJCXNlbmRwYWNrZXRbaV0gPSAwOworCQkJfQorCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU2VuZGluZyBJUFhXQU4gSW5mb3JtYXRpb24gUmVzcG9uc2UgcGFja2V0XG4iLAorCQkJCQlkZXZuYW1lKTsKKwkJfSBlbHNlIHsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVua25vd24gSVBYV0FOIHBhY2tldCFcbiIsZGV2bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIFNldCB0aGUgV05vZGVJRCB0byBvdXIgbmV0d29yayBhZGRyZXNzICovCisJCXNlbmRwYWNrZXRbNDNdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyID4+IDI0KTsKKwkJc2VuZHBhY2tldFs0NF0gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgMHgwMEZGMDAwMCkgPj4gMTYpOworCQlzZW5kcGFja2V0WzQ1XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAweDAwMDBGRjAwKSA+PiA4KTsKKwkJc2VuZHBhY2tldFs0Nl0gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgJiAweDAwMDAwMEZGKTsKKworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBJZiB3ZSBnZXQgaGVyZSwgaXQncyBhbiBJUFgtZGF0YSBwYWNrZXQgc28gaXQnbGwgZ2V0IHBhc3NlZCB1cCB0aGUgCisJICogc3RhY2suCisJICogc3dpdGNoIHRoZSBuZXR3b3JrIG51bWJlcnMgCisJICovCisJc3dpdGNoX25ldF9udW1iZXJzKHNlbmRwYWNrZXQsIG5ldHdvcmtfbnVtYmVyICwxKTsKKwlyZXR1cm4gMDsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogcHJvY2Vzc19yb3V0ZQorICogCisgKiBSYXRpb25hbGU6CisgKglJZiB0aGUgaW50ZXJmYWNlIGdvZXMgZG93biwgb3Igd2UgcmVjZWl2ZSBhbiBBUlAgcmVxdWVzdCwKKyAqICAgICAgd2UgaGF2ZSB0byBjaGFuZ2UgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGlwIGFkZHJlc3Nlcy4KKyAqIAlUaGlzIGNhbm5vdCBiZSBkb25lIHdpdGhpbiB0aGUgaW50ZXJydXB0LgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIAlUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFzIGEgcG9sbGluZyByb3V0aW5lIHRvIGR5bmFtaWNhbGx5IAorICoJYWRkL2RlbGV0ZSByb3V0ZXMgbmVnb3RpYXRlZCBieSBpbnZlcnNlIEFSUC4gIEl0IGlzIGluIHRoaXMgCisgKiAgICAJInRhc2siIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCByb3V0ZXMgdG8gYmUgYWRkZWQgd2hpbGUgaW4gCisgKiAgICAgIGludGVycnVwdCBjb250ZXh0LgorICoKKyAqIFVzYWdlOgorICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZnJfcG9sbCgpIHBvbGxpbmcgZnVudGlvbi4KKyAqLworCitzdGF0aWMgdm9pZCBwcm9jZXNzX3JvdXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJfY2hhbm5lbF90ICpjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisKKwlzdHJ1Y3QgaWZyZXEgaWZfaW5mbzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmlmX2RhdGE7CisJbW1fc2VnbWVudF90IGZzID0gZ2V0X2ZzKCk7CisJdTMyIGlwX3RtcDsKKwlpbnQgZXJyOworCisKKwlzd2l0Y2goY2hhbi0+cm91dGVfZmxhZyl7CisKKwljYXNlIEFERF9ST1VURToKKwkJCQkKKwkJLyogU2V0IHJlbW90ZSBhZGRyZXNzZXMgKi8KKwkJbWVtc2V0KCZpZl9pbmZvLCAwLCBzaXplb2YoaWZfaW5mbykpOworCQlzdHJjcHkoaWZfaW5mby5pZnJfbmFtZSwgZGV2LT5uYW1lKTsKKworCQlzZXRfZnMoZ2V0X2RzKCkpOyAgICAgLyogZ2V0IHVzZXIgc3BhY2UgYmxvY2sgKi8gCisJCQorCQlpZl9kYXRhID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZpZl9pbmZvLmlmcl9kc3RhZGRyOworCQlpZl9kYXRhLT5zaW5fYWRkci5zX2FkZHIgPSBjaGFuLT5pcF9yZW1vdGU7CisJCWlmX2RhdGEtPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQllcnIgPSBkZXZpbmV0X2lvY3RsKCBTSU9DU0lGRFNUQUREUiwgJmlmX2luZm8gKTsKKworCQlzZXRfZnMoZnMpOyAgICAgICAgICAgLyogcmVzdG9yZSBvbGQgYmxvY2sgKi8KKworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogUm91dGUgQWRkIGZhaWxlZC4gIEVycm9yOiAlZFxuIiwgCisJCQkJCWNhcmQtPmRldm5hbWUsZXJyKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBZGRyZXNzOiAldS4ldS4ldS4ldVxuIiwKKwkJCQljaGFuLT5uYW1lLCBOSVBRVUFEKGNoYW4tPmlwX3JlbW90ZSkpOworCisJCX1lbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSb3V0ZSBBZGRlZCBTdWNjZXNzZnVsbHk6ICV1LiV1LiV1LiV1XG4iLAorCQkJCWNhcmQtPmRldm5hbWUsTklQUVVBRChjaGFuLT5pcF9yZW1vdGUpKTsKKwkJCWNoYW4tPnJvdXRlX2ZsYWcgPSBST1VURV9BRERFRDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkVNT1ZFX1JPVVRFOgorCisJCS8qIFNldCByZW1vdGUgYWRkcmVzc2VzICovCisJCW1lbXNldCgmaWZfaW5mbywgMCwgc2l6ZW9mKGlmX2luZm8pKTsKKwkJc3RyY3B5KGlmX2luZm8uaWZyX25hbWUsIGRldi0+bmFtZSk7CisKKwkJaXBfdG1wID0gZ2V0X2lwX2FkZHJlc3MoZGV2LFdBTl9QT0lOVE9QT0lOVF9JUCk7CQorCisJCXNldF9mcyhnZXRfZHMoKSk7ICAgICAvKiBnZXQgdXNlciBzcGFjZSBibG9jayAqLyAKKwkJCisJCWlmX2RhdGEgPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmX2luZm8uaWZyX2RzdGFkZHI7CisJCWlmX2RhdGEtPnNpbl9hZGRyLnNfYWRkciA9IDA7CisJCWlmX2RhdGEtPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQllcnIgPSBkZXZpbmV0X2lvY3RsKCBTSU9DU0lGRFNUQUREUiwgJmlmX2luZm8gKTsKKworCQlzZXRfZnMoZnMpOyAgICAKKwkJCisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBEZWxldGluZyBvZiByb3V0ZSBmYWlsZWQuICBFcnJvcjogJWRcbiIsIAorCQkJCQljYXJkLT5kZXZuYW1lLGVycik7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQWRkcmVzczogJXUuJXUuJXUuJXVcbiIsCisJCQkJZGV2LT5uYW1lLE5JUFFVQUQoY2hhbi0+aXBfcmVtb3RlKSApOworCisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUm91dGUgUmVtb3ZlZCBTdWNlc3NmdWx5OiAldS4ldS4ldS4ldVxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSxOSVBRVUFEKGlwX3RtcCkpOworCQkJY2hhbi0+cm91dGVfZmxhZyA9IE5PX1JPVVRFOworCQl9CisJCWJyZWFrOworCisJfSAvKiBDYXNlIFN0YXRlbWVudCAqLworCit9CisKKworCisvKioqKioqIEZyYW1lIFJlbGF5IEZpcm13YXJlLVNwZWNpZmljIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWFkIGZpcm13YXJlIGNvZGUgdmVyc2lvbi4KKyAqIG8gZmlsbCBzdHJpbmcgc3RyIHdpdGggZmlybXdhcmUgdmVyc2lvbiBpbmZvLiAKKyAqLworc3RhdGljIGludCBmcl9yZWFkX3ZlcnNpb24gKHNkbGFfdCogY2FyZCwgY2hhciogc3RyKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfUkVBRF9DT0RFX1ZFUlNJT047CisJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisJCisJaWYgKCFlcnIgJiYgc3RyKSB7CisJCWludCBsZW4gPSBtYm94LT5jbWQubGVuZ3RoOworCQltZW1jcHkoc3RyLCBtYm94LT5kYXRhLCBsZW4pOworCSAgICAgICAgc3RyW2xlbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBnbG9iYWwgY29uZmlndXJhdGlvbi4KKyAqLworc3RhdGljIGludCBmcl9jb25maWd1cmUgKHNkbGFfdCogY2FyZCwgZnJfY29uZl90ICpjb25mKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZGxjaV9udW0gPSBjYXJkLT51LmYuZGxjaV9udW07CisJaW50IGVyciwgaTsKKworCWRvCisJeworCQltZW1jcHkobWJveC0+ZGF0YSwgY29uZiwgc2l6ZW9mKGZyX2NvbmZfdCkpOworCisJCWlmIChkbGNpX251bSkgZm9yIChpID0gMDsgaSA8IGRsY2lfbnVtOyArK2kpCisJCQkoKGZyX2NvbmZfdCopbWJveC0+ZGF0YSktPmRsY2lbaV0gPSAKKwkJCQkJY2FyZC0+dS5mLm5vZGVfZGxjaVtpXTsgCisJCQorCQltYm94LT5jbWQuY29tbWFuZCA9IEZSX1NFVF9DT05GSUc7CisJCW1ib3gtPmNtZC5sZW5ndGggPQorCQkJc2l6ZW9mKGZyX2NvbmZfdCkgKyBkbGNpX251bSAqIHNpemVvZihzaG9ydCk7CisKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQorCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIGZyX2V2ZW50KGNhcmQsIGVyciwgbWJveCkpOworCisJLypOQyBPY3QgMTIgMjAwMCAqLworCWlmIChlcnIgIT0gQ01EX09LKXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRnJhbWUgUmVsYXkgQ29uZmlndXJhdGlvbiBGYWlsZWQ6IHJjPTB4JXhcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxlcnIpOworCX0KKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBETENJIGNvbmZpZ3VyYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgZnJfZGxjaV9jb25maWd1cmUgKHNkbGFfdCogY2FyZCwgZnJfZGxjX2NvbmZfdCAqY29uZiwgdW5zaWduZWQgZGxjaSkKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltZW1jcHkobWJveC0+ZGF0YSwgY29uZiwgc2l6ZW9mKGZyX2RsY19jb25mX3QpKTsKKwkJbWJveC0+Y21kLmRsY2kgPSAodW5zaWduZWQgc2hvcnQpIGRsY2k7IAorCQltYm94LT5jbWQuY29tbWFuZCA9IEZSX1NFVF9DT05GSUc7CisJCW1ib3gtPmNtZC5sZW5ndGggPSBzaXplb2YoZnJfZGxjX2NvbmZfdCk7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSk7CisJCisJcmV0dXJuIGVycjsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IGludGVycnVwdCBtb2RlLgorICovCitzdGF0aWMgaW50IGZyX3NldF9pbnRyX21vZGUgKHNkbGFfdCogY2FyZCwgdW5zaWduZWQgbW9kZSwgdW5zaWduZWQgbXR1LAorCXVuc2lnbmVkIHNob3J0IHRpbWVvdXQpCit7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveDsKKwlmcjUwOF9pbnRyX2N0bF90KiBpY3RsID0gKHZvaWQqKW1ib3gtPmRhdGE7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldChpY3RsLCAwLCBzaXplb2YoZnI1MDhfaW50cl9jdGxfdCkpOworCQlpY3RsLT5tb2RlICAgPSBtb2RlOworCQlpY3RsLT50eF9sZW4gPSBtdHU7CisJCWljdGwtPmlycSAgICA9IGNhcmQtPmh3LmlycTsKKworCQkvKiBpbmRpY2F0ZSB0aW1lb3V0IG9uIHRpbWVyICovCisJCWlmIChtb2RlICYgMHgyMCkgaWN0bC0+dGltZW91dCA9IHRpbWVvdXQ7IAorCisJCW1ib3gtPmNtZC5sZW5ndGggPSBzaXplb2YoZnI1MDhfaW50cl9jdGxfdCk7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfU0VUX0lOVFJfTU9ERTsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFbmFibGUgY29tbXVuaWNhdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgZnJfY29tbV9lbmFibGUgKHNkbGFfdCogY2FyZCkKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltYm94LT5jbWQuY29tbWFuZCA9IEZSX0NPTU1fRU5BQkxFOworCQltYm94LT5jbWQubGVuZ3RoID0gMDsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIGZyX2V2ZW50KGNhcmQsIGVyciwgbWJveCkpOworCQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogZnJfY29tbV9kaXNhYmxlIAorICoKKyAqIFdhcm5pbmc6IFRoaXMgZnVuY3RpbiBpcyBjYWxsZWQgYnkgdGhlIHNodXRkb3duKCkgcHJvY2VkdXJlLiBJdCBpcyB2b2lkCisgKiAgICAgICAgICBzaW5jZSBkZXYtPnByaXYgYXJlIGhhcyBhbHJlYWR5IGJlZW4gZGVhbGxvY2F0ZWQgYW5kIG5vCisgKiAgICAgICAgICBlcnJvciBjaGVja2luZyBpcyBwb3NzaWJsZSB1c2luZyBmcl9ldmVudCgpIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBmcl9jb21tX2Rpc2FibGUgKHNkbGFfdCogY2FyZCkKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvIHsKKwltYm94LT5jbWQuY29tbWFuZCA9IEZSX1NFVF9NT0RFTV9TVEFUVVM7CisJbWJveC0+Y21kLmxlbmd0aCA9IDE7CisJbWJveC0+ZGF0YVswXSA9IDA7CisJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tKTsKKwkKKwlyZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJCisJZG8KKwl7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfQ09NTV9ESVNBQkxFOworCQltYm94LT5jbWQubGVuZ3RoID0gMDsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tKTsKKworCXJldHVybjsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2V0IGNvbW11bmljYXRpb25zIGVycm9yIHN0YXRpc3RpY3MuIAorICovCitzdGF0aWMgaW50IGZyX2dldF9lcnJfc3RhdHMgKHNkbGFfdCogY2FyZCkKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCisJZG8KKwl7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfUkVBRF9FUlJPUl9TVEFUUzsKKwkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCW1ib3gtPmNtZC5kbGNpID0gMDsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIGZyX2V2ZW50KGNhcmQsIGVyciwgbWJveCkpOworCisJaWYgKCFlcnIpIHsKKwkJZnJfY29tbV9zdGF0X3QqIHN0YXRzID0gKHZvaWQqKW1ib3gtPmRhdGE7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9vdmVyX2Vycm9ycyAgICA9IHN0YXRzLT5yeF9vdmVycnVuczsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2NyY19lcnJvcnMgICAgID0gc3RhdHMtPnJ4X2JhZF9jcmM7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICA9IHN0YXRzLT5yeF9hYm9ydHM7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICA9IHN0YXRzLT5yeF90b29fbG9uZzsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gc3RhdHMtPnR4X2Fib3J0czsKKwkKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdldCBzdGF0aXN0aWNzLiAKKyAqLworc3RhdGljIGludCBmcl9nZXRfc3RhdHMgKHNkbGFfdCogY2FyZCkKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCisJZG8KKwl7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfUkVBRF9TVEFUSVNUSUNTOworCQltYm94LT5jbWQubGVuZ3RoID0gMDsKKwkJbWJveC0+Y21kLmRsY2kgPSAwOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisKKwlpZiAoIWVycikgeworCQlmcl9saW5rX3N0YXRfdCogc3RhdHMgPSAodm9pZCopbWJveC0+ZGF0YTsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IHN0YXRzLT5yeF9iYWRfZm9ybWF0OworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZCA9CisJCQlzdGF0cy0+cnhfZHJvcHBlZCArIHN0YXRzLT5yeF9kcm9wcGVkMjsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEFkZCBETENJKHMpIChBY2Nlc3MgTm9kZSBvbmx5ISkuCisgKiBUaGlzIHJvdXRpbmUgd2lsbCBwZXJmb3JtIHRoZSBBRERfRExDSXMgY29tbWFuZCBmb3IgdGhlIHNwZWNpZmllZCBETENJLgorICovCitzdGF0aWMgaW50IGZyX2FkZF9kbGNpIChzZGxhX3QqIGNhcmQsIGludCBkbGNpKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCXVuc2lnbmVkIHNob3J0KiBkbGNpX2xpc3QgPSAodm9pZCopbWJveC0+ZGF0YTsKKworCQltYm94LT5jbWQubGVuZ3RoICA9IHNpemVvZihzaG9ydCk7CisJCWRsY2lfbGlzdFswXSA9IGRsY2k7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfQUREX0RMQ0k7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIGZyX2V2ZW50KGNhcmQsIGVyciwgbWJveCkpOworCQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQWN0aXZhdGUgRExDSShzKSAoQWNjZXNzIE5vZGUgb25seSEpLiAKKyAqIFRoaXMgcm91dGluZSB3aWxsIHBlcmZvcm0gdGhlIEFDVElWQVRFX0RMQ0lzIGNvbW1hbmQgd2l0aCBhIERMQ0kgbnVtYmVyLiAKKyAqLworc3RhdGljIGludCBmcl9hY3RpdmF0ZV9kbGNpIChzZGxhX3QqIGNhcmQsIGludCBkbGNpKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCXVuc2lnbmVkIHNob3J0KiBkbGNpX2xpc3QgPSAodm9pZCopbWJveC0+ZGF0YTsKKworCQltYm94LT5jbWQubGVuZ3RoICA9IHNpemVvZihzaG9ydCk7CisJCWRsY2lfbGlzdFswXSA9IGRsY2k7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfQUNUSVZBVEVfRExDSTsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZWxldGUgRExDSShzKSAoQWNjZXNzIE5vZGUgb25seSEpLiAKKyAqIFRoaXMgcm91dGluZSB3aWxsIHBlcmZvcm0gdGhlIERFTEVURV9ETENJcyBjb21tYW5kIHdpdGggYSBETENJIG51bWJlci4gCisgKi8KK3N0YXRpYyBpbnQgZnJfZGVsZXRlX2RsY2kgKHNkbGFfdCogY2FyZCwgaW50IGRsY2kpCit7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJdW5zaWduZWQgc2hvcnQqIGRsY2lfbGlzdCA9ICh2b2lkKiltYm94LT5kYXRhOworCisJCW1ib3gtPmNtZC5sZW5ndGggID0gc2l6ZW9mKHNob3J0KTsKKwkJZGxjaV9saXN0WzBdID0gZGxjaTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9ERUxFVEVfRExDSTsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisJCisJcmV0dXJuIGVycjsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSXNzdWUgaW4tY2hhbm5lbCBzaWduYWxsaW5nIGZyYW1lLiAKKyAqLworc3RhdGljIGludCBmcl9pc3N1ZV9pc2YgKHNkbGFfdCogY2FyZCwgaW50IGlzZikKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltYm94LT5kYXRhWzBdID0gaXNmOworCQltYm94LT5jbWQubGVuZ3RoICA9IDE7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfSVNTVUVfSVNfRlJBTUU7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnJfc2VuZF9oZHIgKHNkbGFfdCpjYXJkLCBpbnQgZGxjaSwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsZGxjaSk7CQorCWZyX2NoYW5uZWxfdCAqY2hhbjsKKworCWlmICghZGV2IHx8ICEoY2hhbj1kZXYtPnByaXYpKQorCQlyZXR1cm4gb2Zmc2V0OworCQorCWlmIChjaGFuLT5mcl9oZWFkZXJfbGVuKXsKKwkJc2RsYV9wb2tlKCZjYXJkLT5odywgb2Zmc2V0LCBjaGFuLT5mcl9oZWFkZXIsIGNoYW4tPmZyX2hlYWRlcl9sZW4pOworCX0KKwkKKwlyZXR1cm4gb2Zmc2V0K2NoYW4tPmZyX2hlYWRlcl9sZW47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBhIGZyYW1lIG9uIGEgc2VsZWN0ZWQgRExDSS4gIAorICovCitzdGF0aWMgaW50IGZyX3NlbmRfZGF0YV9oZWFkZXIgKHNkbGFfdCogY2FyZCwgaW50IGRsY2ksIHVuc2lnbmVkIGNoYXIgYXR0ciwgaW50IGxlbiwKKwl2b2lkICpidWYsIHVuc2lnbmVkIGNoYXIgaGRyX2xlbikKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94ICsgMHg4MDA7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1ib3gtPmNtZC5kbGNpICAgID0gZGxjaTsKKwkJbWJveC0+Y21kLmF0dHIgICAgPSBhdHRyOworCQltYm94LT5jbWQubGVuZ3RoICA9IGxlbitoZHJfbGVuOworCQltYm94LT5jbWQuY29tbWFuZCA9IEZSX1dSSVRFOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisKKwlpZiAoIWVycikgeworCQlmcl90eF9idWZfY3RsX3QqIGZyYnVmOworIAorICAgICAgICAgICAgICAgCWlmKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KQorCQkJZnJidWYgPSAodm9pZCopKCoodW5zaWduZWQgbG9uZyopbWJveC0+ZGF0YSArCisgICAgICAgICAgICAgICAgICAgICAgICAJY2FyZC0+aHcuZHBtYmFzZSk7CisJCWVsc2UKKwkJCWZyYnVmID0gKHZvaWQqKSgqKHVuc2lnbmVkIGxvbmcqKW1ib3gtPmRhdGEgLQorICAgICAgICAgICAgICAgICAgICAgICAgCUZSX01CX1ZFQ1RPUiArIGNhcmQtPmh3LmRwbWJhc2UpOworCisJCXNkbGFfcG9rZSgmY2FyZC0+aHcsIGZyX3NlbmRfaGRyKGNhcmQsZGxjaSxmcmJ1Zi0+b2Zmc2V0KSwgYnVmLCBsZW4pOworCQlmcmJ1Zi0+ZmxhZyA9IDB4MDE7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBmcl9zZW5kIChzZGxhX3QqIGNhcmQsIGludCBkbGNpLCB1bnNpZ25lZCBjaGFyIGF0dHIsIGludCBsZW4sCisJdm9pZCAqYnVmKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3ggKyAweDgwMDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWJveC0+Y21kLmRsY2kgICAgPSBkbGNpOworCQltYm94LT5jbWQuYXR0ciAgICA9IGF0dHI7CisJCW1ib3gtPmNtZC5sZW5ndGggID0gbGVuOworCQltYm94LT5jbWQuY29tbWFuZCA9IEZSX1dSSVRFOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisKKwlpZiAoIWVycikgeworCQlmcl90eF9idWZfY3RsX3QqIGZyYnVmOworIAorICAgICAgICAgICAgICAgCWlmKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KQorCQkJZnJidWYgPSAodm9pZCopKCoodW5zaWduZWQgbG9uZyopbWJveC0+ZGF0YSArCisgICAgICAgICAgICAgICAgICAgICAgICAJY2FyZC0+aHcuZHBtYmFzZSk7CisJCWVsc2UKKwkJCWZyYnVmID0gKHZvaWQqKSgqKHVuc2lnbmVkIGxvbmcqKW1ib3gtPmRhdGEgLQorICAgICAgICAgICAgICAgICAgICAgICAgCUZSX01CX1ZFQ1RPUiArIGNhcmQtPmh3LmRwbWJhc2UpOworCisJCXNkbGFfcG9rZSgmY2FyZC0+aHcsIGZyYnVmLT5vZmZzZXQsIGJ1ZiwgbGVuKTsKKwkJZnJidWYtPmZsYWcgPSAweDAxOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKworLyoqKioqKiBGaXJtd2FyZSBBc3luY2hyb25vdXMgRXZlbnQgSGFuZGxlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTWFpbiBhc3luY3Jvbm91cyBldmVudC9lcnJvciBoYW5kbGVyLgorICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBmaXJtd2FyZSBjb21tYW5kIHJldHVybnMgbm9uLXplcm8KKyAqCXJldHVybiBjb2RlLgorICoKKyAqIFJldHVybiB6ZXJvIGlmIHByZXZpb3VzIGNvbW1hbmQgaGFzIHRvIGJlIGNhbmNlbGxlZC4KKyAqLworc3RhdGljIGludCBmcl9ldmVudCAoc2RsYV90ICpjYXJkLCBpbnQgZXZlbnQsIGZyX21ib3hfdCogbWJveCkKK3sKKwlmcjUwOF9mbGFnc190KiBmbGFncyA9IGNhcmQtPmZsYWdzOworCWNoYXIgKnB0ciA9ICZmbGFncy0+aWZsYWc7CisJaW50IGk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisKKwkJY2FzZSBGUlJFU19NT0RFTV9GQUlMVVJFOgorCQkJcmV0dXJuIGZyX21vZGVtX2ZhaWx1cmUoY2FyZCwgbWJveCk7CisKKwkJY2FzZSBGUlJFU19DSEFOTkVMX0RPV046IHsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkJCS8qIFJlbW92ZSBhbGwgcm91dGVzIGZyb20gYXNzb2NpYXRlZCBETENJJ3MgKi8KKwkJCWZvciAoZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsgZGV2OworCQkJICAgICBkZXYgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKSB7CisJCQkJZnJfY2hhbm5lbF90ICpjaGFuID0gZGV2LT5wcml2OworCQkJCWlmIChjaGFuLT5yb3V0ZV9mbGFnID09IFJPVVRFX0FEREVEKSB7CisJCQkJCWNoYW4tPnJvdXRlX2ZsYWcgPSBSRU1PVkVfUk9VVEU7CisJCQkJfQorCisJCQkJaWYgKGNoYW4tPmluYXJwID09IElOQVJQX0NPTkZJR1VSRUQpIHsKKwkJCQkJY2hhbi0+aW5hcnAgPSBJTkFSUF9SRVFVRVNUOworCQkJCX0KKworCQkJCS8qIElmIHRoZSBsaW5rIGJlY29tZXMgZGlzY29ubmVjdGVkIHRoZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFsbCBjaGFubmVscyB3aWxsIGJlIGRpc2Nvbm5lY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcyB3ZWxsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCQlzZXRfY2hhbl9zdGF0ZShkZXYsV0FOX0RJU0NPTk5FQ1RFRCk7CisJCQl9CisJCQkJCisJCQl3YW5waXBlX3NldF9zdGF0ZShjYXJkLCBXQU5fRElTQ09OTkVDVEVEKTsKKwkJCXJldHVybiAxOworCQkJfQorCisJCWNhc2UgRlJSRVNfQ0hBTk5FTF9VUDogeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCQkJLyogRklYTUU6IE9ubHkgc3RhcnR1cCBkZXZpY2VzIHRoYXQgYXJlIG9uIHRoZSBsaXN0ICovCisJCQkKKwkJCWZvciAoZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsgZGV2OworCQkJICAgICBkZXYgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKSB7CisJCQkJCisJCQkJc2V0X2NoYW5fc3RhdGUoZGV2LFdBTl9DT05ORUNURUQpOworCQkJfQorCisJCQl3YW5waXBlX3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVEVEKTsKKwkJCXJldHVybiAxOworCQkJfQorCisJCWNhc2UgRlJSRVNfRExDSV9DSEFOR0U6CisJCQlyZXR1cm4gZnJfZGxjaV9jaGFuZ2UoY2FyZCwgbWJveCk7CisKKwkJY2FzZSBGUlJFU19ETENJX01JU01BVENIOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERMQ0kgbGlzdCBtaXNtYXRjaCFcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIDE7CisKKwkJY2FzZSBDTURfVElNRU9VVDoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbW1hbmQgMHglMDJYIHRpbWVkIG91dCFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgbWJveC0+Y21kLmNvbW1hbmQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElEIEJ5dGVzID0gIixjYXJkLT5kZXZuYW1lKTsKKyAJICAgIAkJZm9yKGkgPSAwOyBpIDwgODsgaSArKykKKwkJCQlwcmludGsoS0VSTl9JTkZPICIweCUwMlggIiwgKihwdHIgKyAweDE4ICsgaSkpOworCSAgIAkgCXByaW50ayhLRVJOX0lORk8gIlxuIik7CQorICAgICAgICAgICAgCisJCQlicmVhazsKKworCQljYXNlIEZSUkVTX0RMQ0lfSU5BQ1RJVkU6CisJCQlicmVhazsKKyAKKwkJY2FzZSBGUlJFU19DSVJfT1ZFUkZMT1c6CisJCQlicmVhazsKKwkJCQorCQljYXNlIEZSUkVTX0JVRkZFUl9PVkVSRkxPVzoKKwkJCWJyZWFrOyAKKwkJCQorCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbW1hbmQgMHglMDJYIHJldHVybmVkIDB4JTAyWCFcbiIKKwkJCQksIGNhcmQtPmRldm5hbWUsIG1ib3gtPmNtZC5jb21tYW5kLCBldmVudCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSGFuZGxlIG1vZGVtIGVycm9yLgorICoKKyAqIFJldHVybiB6ZXJvIGlmIHByZXZpb3VzIGNvbW1hbmQgaGFzIHRvIGJlIGNhbmNlbGxlZC4KKyAqLworc3RhdGljIGludCBmcl9tb2RlbV9mYWlsdXJlIChzZGxhX3QgKmNhcmQsIGZyX21ib3hfdCogbWJveCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogcGh5c2ljYWwgbGluayBkb3duISAobW9kZW0gZXJyb3IgMHglMDJYKVxuIiwKKwkJY2FyZC0+ZGV2bmFtZSwgbWJveC0+ZGF0YVswXSk7CisKKwlzd2l0Y2ggKG1ib3gtPmNtZC5jb21tYW5kKXsKKwkJY2FzZSBGUl9XUklURToKKwkKKwkJY2FzZSBGUl9SRUFEOgorCQkJcmV0dXJuIDA7CisJfQorCQorCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEhhbmRsZSBETENJIHN0YXR1cyBjaGFuZ2UuCisgKgorICogUmV0dXJuIHplcm8gaWYgcHJldmlvdXMgY29tbWFuZCBoYXMgdG8gYmUgY2FuY2VsbGVkLgorICovCitzdGF0aWMgaW50IGZyX2RsY2lfY2hhbmdlIChzZGxhX3QgKmNhcmQsIGZyX21ib3hfdCogbWJveCkKK3sKKwlkbGNpX3N0YXR1c190KiBzdGF0dXMgPSAodm9pZCopbWJveC0+ZGF0YTsKKwlpbnQgY250ID0gbWJveC0+Y21kLmxlbmd0aCAvIHNpemVvZihkbGNpX3N0YXR1c190KTsKKwlmcl9jaGFubmVsX3QgKmNoYW47CisJc3RydWN0IG5ldF9kZXZpY2UqIGRldjI7CisJCisKKwlmb3IgKDsgY250OyAtLWNudCwgKytzdGF0dXMpIHsKKworCQl1bnNpZ25lZCBzaG9ydCBkbGNpPSBzdGF0dXMtPmRsY2k7CisJCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgPSBmaW5kX2NoYW5uZWwoY2FyZCwgZGxjaSk7CisJCQorCQlpZiAoZGV2ID09IE5VTEwpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IENQRSBjb250YWlucyB1bmNvbmZpZ3VyZWQgRExDST0gJWRcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsIGRsY2kpOyAJCisKKyAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogdW5jb25maWd1cmVkIERMQ0kgJWQgcmVwb3J0ZWQgYnkgbmV0d29ya1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGNhcmQtPmRldm5hbWUsIGRsY2kpOworIAorCQl9ZWxzZXsKKwkJCWlmIChzdGF0dXMtPnN0YXRlID09IEZSX0xJTktfSU5PUEVSKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiJXM6IERMQ0kgJXUgaXMgaW5hY3RpdmUhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLCBkbGNpKTsKKworCQkJCWlmIChkZXYgJiYgbmV0aWZfcnVubmluZyhkZXYpKQorCQkJCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworCQkJfQorCQorCQkJaWYgKHN0YXR1cy0+c3RhdGUgJiBGUl9ETENJX0RFTEVURUQpIHsKKworCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJIiVzOiBETENJICV1IGhhcyBiZWVuIGRlbGV0ZWQhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLCBkbGNpKTsKKworCQkJCWlmIChkZXYgJiYgbmV0aWZfcnVubmluZyhkZXYpKXsKKworCQkJCQlmcl9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisKKwkJCQkJaWYgKGNoYW4tPnJvdXRlX2ZsYWcgPT0gUk9VVEVfQURERUQpIHsKKwkJCQkJCWNoYW4tPnJvdXRlX2ZsYWcgPSBSRU1PVkVfUk9VVEU7CisJCQkJCQkvKiBUaGUgc3RhdGUgY2hhbmdlIHdpbGwgdHJpZ2dlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIGZyIHBvbGxpbmcgcm91dGluZSAqLworCQkJCQl9CisKKwkJCQkJaWYgKGNoYW4tPmluYXJwID09IElOQVJQX0NPTkZJR1VSRUQpIHsKKwkJCQkJCWNoYW4tPmluYXJwID0gSU5BUlBfUkVRVUVTVDsKKwkJCQkJfQorCisJCQkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJCQkJfQorCisJCQl9IGVsc2UgaWYgKHN0YXR1cy0+c3RhdGUgJiBGUl9ETENJX0FDVElWRSkgeworCisJCQkJY2hhbiA9IGRldi0+cHJpdjsKKwkJCQorCQkJCS8qIFRoaXMgZmxhZyBpcyB1c2VkIGZvciBjb25maWd1cmluZyBzcGVjaWZpYyAKKwkJCQkgICBETENJKHMpIHdoZW4gdGhleSBiZWNvbWUgYWN0aXZlLgorCQkJIAkqLyAKKwkJCQljaGFuLT5kbGNpX2NvbmZpZ3VyZWQgPSBETENJX0NPTkZJR19QRU5ESU5HOworCQorCQkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RFRCk7CisJCQorCQkJfQorCQl9CisJfQorCQorCWZvciAoZGV2MiA9IGNhcmQtPndhbmRldi5kZXY7IGRldjI7CisJICAgICBkZXYyID0gKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2Mi0+cHJpdikpeworCQkKKwkJY2hhbiA9IGRldjItPnByaXY7CisJCisJCWlmIChjaGFuLT5kbGNpX2NvbmZpZ3VyZWQgPT0gRExDSV9DT05GSUdfUEVORElORykgeworCQkJaWYgKGZyX2luaXRfZGxjaShjYXJkLCBjaGFuKSl7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKworCX0KKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGZyX2luaXRfZGxjaSAoc2RsYV90ICpjYXJkLCBmcl9jaGFubmVsX3QgKmNoYW4pCit7CisJZnJfZGxjX2NvbmZfdCBjZmc7CisJCisJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihjZmcpKTsKKworCWlmICggY2hhbi0+Y2lyX3N0YXR1cyA9PSBDSVJfRElTQUJMRUQpIHsKKworCQljZmcuY2lyX2Z3ZCA9IGNmZy5jaXJfYndkICA9IDE2OworCQljZmcuYmNfZndkID0gY2ZnLmJjX2J3ZCA9IDE2OworCQljZmcuY29uZl9mbGFncyA9IDB4MDAwMTsJCisKKwl9ZWxzZSBpZiAoY2hhbi0+Y2lyX3N0YXR1cyA9PSBDSVJfRU5BQkxFRCkgeworCQorCQljZmcuY2lyX2Z3ZCA9IGNmZy5jaXJfYndkID0gY2hhbi0+Y2lyOworCQljZmcuYmNfZndkICA9IGNmZy5iY19id2QgID0gY2hhbi0+YmM7CisJCWNmZy5iZV9md2QgID0gY2ZnLmJlX2J3ZCAgPSBjaGFuLT5iZTsKKwkJY2ZnLmNvbmZfZmxhZ3MgPSAweDAwMDA7CisJfQorCQorCWlmIChmcl9kbGNpX2NvbmZpZ3VyZSggY2FyZCwgJmNmZyAsIGNoYW4tPmRsY2kpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogRExDSSBDb25maWd1cmUgZmFpbGVkIGZvciAlZFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBjaGFuLT5kbGNpKTsKKwkJcmV0dXJuIDE7CQorCX0KKwkKKwljaGFuLT5kbGNpX2NvbmZpZ3VyZWQgPSBETENJX0NPTkZJR1VSRUQ7CisKKwkvKiBSZWFkIHRoZSBpbnRlcmZhY2UgYnl0ZSBtYXBwaW5nIGludG8gdGhlIGNoYW5uZWwgCisJICogc3RydWN0dXJlLgorCSAqLworCXJlYWRfRExDSV9JQl9tYXBwaW5nKCBjYXJkLCBjaGFuICk7CisKKwlyZXR1cm4gMDsKK30KKy8qKioqKioqIE1pc2NlbGxhbmVvdXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBjaGFubmVsIHN0YXRlLiAKKyAqLworc3RhdGljIGludCB1cGRhdGVfY2hhbl9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCWZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGFuLT5jYXJkOworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfTElTVF9BQ1RJVkVfRExDSTsKKwkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKworCWlmICghZXJyKSB7CisJCQorCQl1bnNpZ25lZCBzaG9ydCogbGlzdCA9ICh2b2lkKiltYm94LT5kYXRhOworCQlpbnQgY250ID0gbWJveC0+Y21kLmxlbmd0aCAvIHNpemVvZihzaG9ydCk7CisJCQorCQllcnI9MTsKKwkJCisJCWZvciAoOyBjbnQ7IC0tY250LCArK2xpc3QpIHsKKworCQkJaWYgKCpsaXN0ID09IGNoYW4tPmRsY2kpIHsKKyAJCQkJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fQ09OTkVDVEVEKTsKKworCisJCQkJLyogTWF5IDIzIDIwMDAuIE5DCisJCQkJICogV2hlbiBhIGRsY2kgaXMgYWRkZWQgb3IgcmVzdGFydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZGxjaV9pbnRfaW50ZXJmYWNlIHBvaW50ZXIgbXVzdAorCQkJCSAqIGJlIHJlaW5pdGlhbGl6ZWQuICAqLworCQkJCWlmICghY2hhbi0+ZGxjaV9pbnRfaW50ZXJmYWNlKXsKKwkJCQkJZXJyPWZyX2luaXRfZGxjaSAoY2FyZCxjaGFuKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBjaGFubmVsIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCBzZXRfY2hhbl9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBpbnQgc3RhdGUpCit7CisJZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisKKwlpZiAoY2hhbi0+Y29tbW9uLnN0YXRlICE9IHN0YXRlKSB7CisKKwkJc3dpdGNoIChzdGF0ZSkgeworCisJCQljYXNlIFdBTl9DT05ORUNURUQ6CisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiJXM6IEludGVyZmFjZSAlczogRExDSSAlZCBjb25uZWN0ZWRcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSwgY2hhbi0+ZGxjaSk7CisKKwkJCQkvKiBJZiB0aGUgaW50ZXJmYWNlIHdhcyBwcmV2aW91bHN5IGRvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJyaW5nIGl0IHVwLCBzaW5jZSB0aGUgY2hhbm5lbCBpcyBhY3RpdmUgKi8KKworCQkJCXRyaWdnZXJfZnJfcG9sbCAoZGV2KTsKKwkJCQl0cmlnZ2VyX2ZyX2FycCAgKGRldik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgV0FOX0NPTk5FQ1RJTkc6CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkgICAgICAiJXM6IEludGVyZmFjZSAlczogRExDSSAlZCBjb25uZWN0aW5nXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUsIGNoYW4tPmRsY2kpOworCQkJCWJyZWFrOworCisJCQljYXNlIFdBTl9ESVNDT05ORUNURUQ6CisJCQkJcHJpbnRrIChLRVJOX0lORk8gCisJCQkJICAgICIlczogSW50ZXJmYWNlICVzOiBETENJICVkIGRpc2Nvbm5lY3RlZCFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSwgY2hhbi0+ZGxjaSk7CisJCQkKKwkJCQkvKiBJZiB0aGUgaW50ZXJmYWNlIGlzIHVwLCBicmluZyBpdCBkb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaW5jZSB0aGUgY2hhbm5lbCBpcyBub3cgZGlzY29ubmVjdGVkICovCisJCQkJdHJpZ2dlcl9mcl9wb2xsIChkZXYpOworCQkJCWJyZWFrOworCQl9CisKKwkJY2hhbi0+Y29tbW9uLnN0YXRlID0gc3RhdGU7CisJfQorCisJY2hhbi0+c3RhdGVfdGljayA9IGppZmZpZXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmluZCBuZXR3b3JrIGRldmljZSBieSBpdHMgY2hhbm5lbCBudW1iZXIuCisgKgorICogV2UgbmVlZCB0aGlzIGNyaXRpY2FsIGZsYWcgYmVjYXVzZSB3ZSBjaGFuZ2UKKyAqIHRoZSBkbGNpX3RvX2Rldl9tYXAgb3V0c2lkZSB0aGUgaW50ZXJydXB0LgorICoKKyAqIE5PVEU6IGRlbF9pZigpIGZ1bmN0aW9ucyB1cGRhdGVzIHRoaXMgYXJyYXksIGl0IHVzZXMKKyAqICAgICAgIHRoZSBzcGluIGxvY2tzIHRvIGF2b2lkIGNvcnJ1cHRpb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSogZmluZF9jaGFubmVsKHNkbGFfdCogY2FyZCwgdW5zaWduZWQgZGxjaSkKK3sKKwlpZihkbGNpID4gSElHSEVTVF9WQUxJRF9ETENJKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybihjYXJkLT51LmYuZGxjaV90b19kZXZfbWFwW2RsY2ldKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaGVjayB0byBzZWUgaWYgYSBmcmFtZSBjYW4gYmUgc2VudC4gSWYgbm8gdHJhbnNtaXQgYnVmZmVycyBhdmFpbGFibGUsCisgKiBlbmFibGUgdHJhbnNtaXQgaW50ZXJydXB0cy4KKyAqCisgKiBSZXR1cm46CTEgLSBUeCBidWZmZXIocykgYXZhaWxhYmxlCisgKgkJMCAtIG5vIGJ1ZmZlcnMgYXZhaWxhYmxlCisgKi8KK3N0YXRpYyBpbnQgaXNfdHhfcmVhZHkgKHNkbGFfdCogY2FyZCwgZnJfY2hhbm5lbF90KiBjaGFuKQoreworCXVuc2lnbmVkIGNoYXIgc2I7CisKKyAgICAgICAgaWYoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpCisJCXJldHVybiAxOworCisJc2IgPSBpbmIoY2FyZC0+aHcucG9ydCk7CisJaWYgKHNiICYgMHgwMikgCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29udmVydCBkZWNpbWFsIHN0cmluZyB0byB1bnNpZ25lZCBpbnRlZ2VyLgorICogSWYgbGVuICE9IDAgdGhlbiBvbmx5ICdsZW4nIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZyBhcmUgY29udmVydGVkLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGRlY190b191aW50ICh1bnNpZ25lZCBjaGFyKiBzdHIsIGludCBsZW4pCit7CisJdW5zaWduZWQgdmFsOworCisJaWYgKCFsZW4pIAorCQlsZW4gPSBzdHJsZW4oc3RyKTsKKworCWZvciAodmFsID0gMDsgbGVuICYmIGlzX2RpZ2l0KCpzdHIpOyArK3N0ciwgLS1sZW4pCisJCXZhbCA9ICh2YWwgKiAxMCkgKyAoKnN0ciAtICh1bnNpZ25lZCknMCcpOworCisJcmV0dXJuIHZhbDsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0b3JlIGEgVURQIG1hbmFnZW1lbnQgcGFja2V0IGZvciBsYXRlciBwcm9jZXNzaW5nLgorICovCisKK3N0YXRpYyBpbnQgc3RvcmVfdWRwX21nbXRfcGt0KGludCB1ZHBfdHlwZSwgY2hhciB1ZHBfcGt0X3NyYywgc2RsYV90KiBjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZGxjaSkKK3sKKyAgICAgICAgaW50IHVkcF9wa3Rfc3RvcmVkID0gMDsKKwkKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsIGRsY2kpOworCWZyX2NoYW5uZWxfdCAqY2hhbjsKKwkKKwlpZiAoIWRldiB8fCAhKGNoYW49ZGV2LT5wcml2KSkKKwkJcmV0dXJuIDE7CisJCisgICAgICAgIGlmKCFjYXJkLT51LmYudWRwX3BrdF9sZ3RoICYmIChza2ItPmxlbiA8PSBNQVhfTEdUSF9VRFBfTUdOVF9QS1QpKXsKKyAgICAgICAgICAgICAgICBjYXJkLT51LmYudWRwX3BrdF9sZ3RoID0gc2tiLT5sZW4gKyBjaGFuLT5mcl9oZWFkZXJfbGVuOworICAgICAgICAgICAgICAgIGNhcmQtPnUuZi51ZHBfdHlwZSA9IHVkcF90eXBlOworICAgICAgICAgICAgICAgIGNhcmQtPnUuZi51ZHBfcGt0X3NyYyA9IHVkcF9wa3Rfc3JjOworICAgICAgICAgICAgICAgIGNhcmQtPnUuZi51ZHBfZGxjaSA9IGRsY2k7CisgICAgICAgICAgICAgICAgbWVtY3B5KGNhcmQtPnUuZi51ZHBfcGt0X2RhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworICAgICAgICAgICAgICAgIGNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfVURQOworICAgICAgICAgICAgICAgIHVkcF9wa3Rfc3RvcmVkID0gMTsKKworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJFUlJPUjogVURQIHBhY2tldCBub3Qgc3RvcmVkIGZvciBETENJICVkXG4iLCAKKwkJCQkJCQlkbGNpKTsKKwl9CisKKyAgICAgICAgaWYodWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fU1RBQ0speworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfWVsc2V7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9CisJCQorICAgICAgICByZXR1cm4odWRwX3BrdF9zdG9yZWQpOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQcm9jZXNzIFVEUCBjYWxsIG9mIHR5cGUgRlBJUEU4TkQKKyAqLworc3RhdGljIGludCBwcm9jZXNzX3VkcF9tZ210X3BrdChzZGxhX3QqIGNhcmQpCit7CisKKwlpbnQgY19yZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGNoYXIgZnJhbWVzOworCXVuc2lnbmVkIGludCBsZW47CisJdW5zaWduZWQgc2hvcnQgYnVmZmVyX2xlbmd0aDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCBlcnI7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJaW50IHVkcF9tZ210X3JlcV92YWxpZCA9IDE7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CisgICAgICAgIGZyX2NoYW5uZWxfdCogY2hhbjsKKyAgICAgICAgZnJfdWRwX3BrdF90ICpmcl91ZHBfcGt0OworCXVuc2lnbmVkIHNob3J0IG51bV90cmNfZWxzOworCWZyX3RyY19lbF90KiBwdHJfdHJjX2VsOworCWZyX3RyY19lbF90IHRyY19lbDsKKwlmcGlwZW1vbl90cmNfdCogZnBpcGVtb25fdHJjOworCisJY2hhciB1ZHBfcGt0X3NyYyA9IGNhcmQtPnUuZi51ZHBfcGt0X3NyYzsgCisJaW50IGRsY2kgPSBjYXJkLT51LmYudWRwX2RsY2k7CisKKwkvKiBGaW5kIG5ldHdvcmsgaW50ZXJmYWNlIGZvciB0aGlzIHBhY2tldCAqLworCWRldiA9IGZpbmRfY2hhbm5lbChjYXJkLCBkbGNpKTsKKwlpZiAoIWRldil7CisJCWNhcmQtPnUuZi51ZHBfcGt0X2xndGggPSAwOworCQlyZXR1cm4gMTsKKwl9CisgICAgICAgIGlmICgoY2hhbiA9IGRldi0+cHJpdikgPT0gTlVMTCl7CisJCWNhcmQtPnUuZi51ZHBfcGt0X2xndGggPSAwOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBJZiB0aGUgVURQIHBhY2tldCBpcyBmcm9tIHRoZSBuZXR3b3JrLCB3ZSBhcmUgZ29pbmcgdG8gaGF2ZSB0byAKKwkgICB0cmFuc21pdCBhIHJlc3BvbnNlLiBCZWZvcmUgZG9pbmcgc28sIHdlIG11c3QgY2hlY2sgdG8gc2VlIHRoYXQKKwkgICB3ZSBhcmUgbm90IGN1cnJlbnRseSB0cmFuc21pdHRpbmcgYSBmcmFtZSAoaW4gJ2lmX3NlbmQoKScpIGFuZAorCSAgIHRoYXQgd2UgYXJlIG5vdCBhbHJlYWR5IGluIGEgJ2RlbGF5ZWQgdHJhbnNtaXQnIHN0YXRlLgorCSovCisJaWYodWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fTkVUV09SSykgeworCQlpZiAoY2hlY2tfdHhfc3RhdHVzKGNhcmQsZGV2KSl7CisJCQljYXJkLT51LmYudWRwX3BrdF9sZ3RoID0gMDsKKwkJCXJldHVybiAxOworCQl9CisgICAgICAgIH0KKworICAgICAgICBmcl91ZHBfcGt0ID0gKGZyX3VkcF9wa3RfdCAqKWNhcmQtPnUuZi51ZHBfcGt0X2RhdGE7CisKKwlpZih1ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKSB7CisJCisJCXN3aXRjaChmcl91ZHBfcGt0LT5jYmxvY2suY29tbWFuZCkgeworCisJCQljYXNlIEZSX1JFQURfTU9ERU1fU1RBVFVTOgorCQkJY2FzZSBGUl9SRUFEX1NUQVRVUzoKKwkJCWNhc2UgRlBJUEVfUk9VVEVSX1VQX1RJTUU6CisJCQljYXNlIEZSX1JFQURfRVJST1JfU1RBVFM6CisJCQljYXNlIEZQSVBFX0RSSVZFUl9TVEFUX0dFTjoKKwkJCWNhc2UgRlJfUkVBRF9TVEFUSVNUSUNTOgorCQkJY2FzZSBGUl9SRUFEX0FERF9ETENfU1RBVFM6CisJCQljYXNlIEZSX1JFQURfQ09ORklHOgorCQkJY2FzZSBGUl9SRUFEX0NPREVfVkVSU0lPTjoKKwkJCQl1ZHBfbWdtdF9yZXFfdmFsaWQgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl1ZHBfbWdtdF9yZXFfdmFsaWQgPSAwOworCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYoIXVkcF9tZ210X3JlcV92YWxpZCkgeworCQkvKiBzZXQgbGVuZ3RoIHRvIDAgKi8KKwkJZnJfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IDA7CisJCS8qIHNldCByZXR1cm4gY29kZSAqLworCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMHhDRDsgCisJCQorCQljaGFuLT5kcnZzdGF0c19nZW4uVURQX1BJUEVfbWdtdF9kaXJlY3Rpb25fZXJyICsrOworCisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpewkKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkiJXM6IFdhcm5pbmcsIElsbGVnYWwgVURQIGNvbW1hbmQgYXR0ZW1wdGVkIGZyb20gbmV0d29yazogJXhcbiIsCisJCQljYXJkLT5kZXZuYW1lLGZyX3VkcF9wa3QtPmNibG9jay5jb21tYW5kKTsKKwkJfQorCQkKKwl9IGVsc2UgeyAgIAorICAgICAgICAgICAKKwkJc3dpdGNoKGZyX3VkcF9wa3QtPmNibG9jay5jb21tYW5kKSB7CisKKwkJY2FzZSBGUElQRV9FTkFCTEVfVFJBQ0lORzoKKwkJCWlmKCFjYXJkLT5UcmFjaW5nRW5hYmxlZCkgeworCQkJCWRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCQkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9TRVRfVFJBQ0VfQ09ORklHOworICAgICAgICAgICAgICAgICAgICAgICAJCQltYm94LT5jbWQubGVuZ3RoID0gMTsKKyAgICAgICAgICAgICAgICAgICAgIAkJCW1ib3gtPmNtZC5kbGNpID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAJCQltYm94LT5kYXRhWzBdID0gZnJfdWRwX3BrdC0+ZGF0YVswXSB8IAorCQkJCQkJUkVTRVRfVFJDOworICAgICAgICAgICAgICAgICAgICAJCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyAKKwkJCQkJICAgICAJCW1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKyAgICAgICAgICAgICAgICAgICAgICAgCQl9IHdoaWxlIChlcnIgJiYgY19yZXRyeS0tICYmIGZyX2V2ZW50KGNhcmQsIGVyciwKKwkJCQkJIG1ib3gpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgCWlmKGVycikgeworCQkJCQljYXJkLT5UcmFjaW5nRW5hYmxlZCA9IDA7CisJCQkJCS8qIHNldCB0aGUgcmV0dXJuIGNvZGUgKi8KKwkJCQkJZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9CisgIAkJCQkJCW1ib3gtPmNtZC5yZXN1bHQ7CisJCQkJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBOT19UUkNfRUxFTUVOVFNfT0ZGLAorCQkJCQkJJm51bV90cmNfZWxzLCAyKTsKKwkJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBCQVNFX1RSQ19FTEVNRU5UU19PRkYsCisJCQkJCQkmY2FyZC0+dS5mLnRyY19lbF9iYXNlLCA0KTsKKwkJCQljYXJkLT51LmYuY3Vycl90cmNfZWwgPSBjYXJkLT51LmYudHJjX2VsX2Jhc2U7CisgICAgICAgICAgICAgCQkJY2FyZC0+dS5mLnRyY19lbF9sYXN0ID0gY2FyZC0+dS5mLmN1cnJfdHJjX2VsICsKKwkJCQkJCQkoKG51bV90cmNfZWxzIC0gMSkgKiAKKwkJCQkJCQlzaXplb2YoZnJfdHJjX2VsX3QpKTsKKyAgIAorCQkJCS8qIENhbGN1bGF0ZSB0aGUgbWF4aW11bSB0cmFjZSBkYXRhIGFyZWEgaW4gKi8KKwkJCQkvKiB0aGUgVURQIHBhY2tldCAqLworCQkJCWNhcmQtPnUuZi50cmNfYmZyX3NwYWNlPShNQVhfTEdUSF9VRFBfTUdOVF9QS1QgLQorCQkJCQkvL3NpemVvZihmcl9lbmNhcF9oZHJfdCkgLQorCQkJCQlzaXplb2YoaXBfcGt0X3QpIC0KKwkJCQkJc2l6ZW9mKHVkcF9wa3RfdCkgLQorCQkJCQlzaXplb2Yod3BfbWdtdF90KSAtCisJCQkJCXNpemVvZihjYmxvY2tfdCkpOworCisJCQkJLyogc2V0IHJldHVybiBjb2RlICovCisJCQkJZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCQkKKwkJCX0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAJLyogc2V0IHJldHVybiBjb2RlIHRvIGxpbmUgdHJhY2UgYWxyZWFkeSAKKwkJCQkgICBlbmFibGVkICovCisJCQkJZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIAl9CisKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQkJY2FyZC0+VHJhY2luZ0VuYWJsZWQgPSAxOworCQkJYnJlYWs7CisKKworICAgICAgICAgICAgICAgIGNhc2UgRlBJUEVfRElTQUJMRV9UUkFDSU5HOgorCQkJaWYoY2FyZC0+VHJhY2luZ0VuYWJsZWQpIHsKKwkJCQorCQkJCWRvIHsKKwkJCQkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9TRVRfVFJBQ0VfQ09ORklHOworCQkJCQltYm94LT5jbWQubGVuZ3RoID0gMTsKKwkJCQkJbWJveC0+Y21kLmRsY2kgPSAweDAwOworCQkJCQltYm94LT5kYXRhWzBdID0gfkFDVElWQVRFX1RSQzsKKwkJCQkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gCisJCQkJCQkJbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQkJCX0gd2hpbGUgKGVyciAmJiBjX3JldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisgICAgICAgICAgICAgICAgICAgIAl9CisKKyAgICAgICAgICAgICAgICAgICAgCS8qIHNldCByZXR1cm4gY29kZSAqLworCQkJZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCQltYm94LT5jbWQubGVuZ3RoID0gMDsKKwkJCWNhcmQtPlRyYWNpbmdFbmFibGVkID0gMDsKKwkJCWJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBGUElQRV9HRVRfVFJBQ0VfSU5GTzoKKworCQkgICAgICAgIC8qIExpbmUgdHJhY2UgY2Fubm90IGJlIHBlcmZvcm1lZCBvbiB0aGUgNTAyICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZighY2FyZC0+VHJhY2luZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHJldHVybiBjb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYm94LT5jbWQubGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKwkJCXB0cl90cmNfZWwgPSAodm9pZCAqKWNhcmQtPnUuZi5jdXJyX3RyY19lbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2xlbmd0aCA9IDA7CisJCQlmcl91ZHBfcGt0LT5kYXRhWzB4MDBdID0gMHgwMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGZyYW1lcyA9IDA7IGZyYW1lcyA8IE1BWF9GUk1TX1RSQUNFRDsgZnJhbWVzICsrKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RsYV9wZWVrKCZjYXJkLT5odywgKHVuc2lnbmVkIGxvbmcpcHRyX3RyY19lbCwKKwkJCQkJICAodm9pZCAqKSZ0cmNfZWwuZmxhZywKKwkJCQkJICBzaXplb2YoZnJfdHJjX2VsX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHJjX2VsLmZsYWcgPT0gMHgwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGNhcmQtPnUuZi50cmNfYmZyX3NwYWNlIC0gYnVmZmVyX2xlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IHNpemVvZihmcGlwZW1vbl90cmNfaGRyX3QpKSB7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyX3VkcF9wa3QtPmRhdGFbMHgwMF0gfD0gTU9SRV9UUkNfREFUQTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisJCQkJZnBpcGVtb25fdHJjID0gCisJCQkJCShmcGlwZW1vbl90cmNfdCAqKSZmcl91ZHBfcGt0LT5kYXRhW2J1ZmZlcl9sZW5ndGhdOyAKKwkJCQlmcGlwZW1vbl90cmMtPmZwaXBlbW9uX3RyY19oZHIuc3RhdHVzID0KKwkJCQkJdHJjX2VsLmF0dHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWZwaXBlbW9uX3RyYy0+ZnBpcGVtb25fdHJjX2hkci50bXN0YW1wID0KKwkJCQkJdHJjX2VsLnRtc3RhbXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWZwaXBlbW9uX3RyYy0+ZnBpcGVtb25fdHJjX2hkci5sZW5ndGggPSAKKwkJCQkJdHJjX2VsLmxlbmd0aDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdHJjX2VsLm9mZnNldCB8fCAhdHJjX2VsLmxlbmd0aCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWZwaXBlbW9uX3RyYy0+ZnBpcGVtb25fdHJjX2hkci5kYXRhX3Bhc3NlZCA9IDB4MDA7CisKKyAJCQkJfWVsc2UgaWYoKHRyY19lbC5sZW5ndGggKyBzaXplb2YoZnBpcGVtb25fdHJjX2hkcl90KSArIDEpID4KKwkJCQkJKGNhcmQtPnUuZi50cmNfYmZyX3NwYWNlIC0gYnVmZmVyX2xlbmd0aCkpeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBpcGVtb25fdHJjLT5mcGlwZW1vbl90cmNfaGRyLmRhdGFfcGFzc2VkID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlmcl91ZHBfcGt0LT5kYXRhWzB4MDBdIHw9IE1PUkVfVFJDX0RBVEE7CisgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcGlwZW1vbl90cmMtPmZwaXBlbW9uX3RyY19oZHIuZGF0YV9wYXNzZWQgPSAweDAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkbGFfcGVlaygmY2FyZC0+aHcsIHRyY19lbC5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkgIGZwaXBlbW9uX3RyYy0+ZGF0YSwKKwkJCQkJCSAgdHJjX2VsLmxlbmd0aCk7CisJCQkJfQkJCQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyY19lbC5mbGFnID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RsYV9wb2tlKCZjYXJkLT5odywgKHVuc2lnbmVkIGxvbmcpcHRyX3RyY19lbCwKKwkJCQkJICAmdHJjX2VsLmZsYWcsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCXB0cl90cmNfZWwgKys7CisJCQkJaWYoKHZvaWQgKilwdHJfdHJjX2VsID4gY2FyZC0+dS5mLnRyY19lbF9sYXN0KQorCQkJCQlwdHJfdHJjX2VsID0gKHZvaWQqKWNhcmQtPnUuZi50cmNfZWxfYmFzZTsKKworCQkJCWJ1ZmZlcl9sZW5ndGggKz0gc2l6ZW9mKGZwaXBlbW9uX3RyY19oZHJfdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWlmKGZwaXBlbW9uX3RyYy0+ZnBpcGVtb25fdHJjX2hkci5kYXRhX3Bhc3NlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJYnVmZmVyX2xlbmd0aCArPSB0cmNfZWwubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAl9CisKKwkJCQlpZihmcl91ZHBfcGt0LT5kYXRhWzB4MDBdICYgTU9SRV9UUkNfREFUQSkgeworCQkJCQlicmVhazsKKwkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisJCQlpZihmcmFtZXMgPT0gTUFYX0ZSTVNfVFJBQ0VEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAJZnJfdWRwX3BrdC0+ZGF0YVsweDAwXSB8PSBNT1JFX1RSQ19EQVRBOworCQkJfQorICAgICAgICAgICAgIAorCQkJY2FyZC0+dS5mLmN1cnJfdHJjX2VsID0gKHZvaWQgKilwdHJfdHJjX2VsOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdGhlIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgcGFzc2VkICovCisJCQlmcl91ZHBfcGt0LT5kYXRhWzB4MDBdIHw9CisJCQkJKChmcmFtZXMgPDwgMSkgJiAoTUFYX0ZSTVNfVFJBQ0VEIDw8IDEpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRoZSBkYXRhIGxlbmd0aCBhbmQgcmV0dXJuIGNvZGUgKi8KKwkJCWZyX3VkcF9wa3QtPmNibG9jay5sZW5ndGggPSBtYm94LT5jbWQubGVuZ3RoID0gYnVmZmVyX2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEZQSVBFX0ZUMV9SRUFEX1NUQVRVUzoKKwkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIDB4RjAyMCwKKwkJCQkmZnJfdWRwX3BrdC0+ZGF0YVsweDAwXSAsIDIpOworCQkJZnJfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IG1ib3gtPmNtZC5sZW5ndGggPSAyOworCQkJZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCQlicmVhazsKKworCQljYXNlIEZQSVBFX0ZMVVNIX0RSSVZFUl9TVEFUUzoKKwkJCWluaXRfY2hhbl9zdGF0aXN0aWNzKGNoYW4pOworCQkJaW5pdF9nbG9iYWxfc3RhdGlzdGljcyhjYXJkKTsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQkJYnJlYWs7CisJCQorCQljYXNlIEZQSVBFX1JPVVRFUl9VUF9USU1FOgorCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJCQljaGFuLT5yb3V0ZXJfdXBfdGltZSA9IHR2LnR2X3NlYyAtIAorCQkJCQkJY2hhbi0+cm91dGVyX3N0YXJ0X3RpbWU7CisgICAgCSAgICAgICAgICAgICAgICAqKHVuc2lnbmVkIGxvbmcgKikmZnJfdWRwX3BrdC0+ZGF0YSA9CisgICAgCQkJCWNoYW4tPnJvdXRlcl91cF90aW1lOwkKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSBmcl91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gNDsKKwkJCWZyX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBGUElQRV9EUklWRVJfU1RBVF9JRlNFTkQ6CisJCQltZW1jcHkoZnJfdWRwX3BrdC0+ZGF0YSwKKwkJCQkmY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC5pZl9zZW5kX2VudHJ5LAorCQkJCXNpemVvZihpZl9zZW5kX3N0YXRfdCkpOworCQkJbWJveC0+Y21kLmxlbmd0aCA9IGZyX3VkcF9wa3QtPmNibG9jay5sZW5ndGggPXNpemVvZihpZl9zZW5kX3N0YXRfdCk7CQorCQkJZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCQlicmVhazsKKwkKKwkJY2FzZSBGUElQRV9EUklWRVJfU1RBVF9JTlRSOgorCisJCQltZW1jcHkoZnJfdWRwX3BrdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhcmQtPnN0YXRpc3RpY3MuaXNyX2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZ2xvYmFsX3N0YXRzX3QpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZmcl91ZHBfcGt0LT5kYXRhW3NpemVvZihnbG9iYWxfc3RhdHNfdCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbi0+ZHJ2c3RhdHNfcnhfaW50ci5yeF9pbnRyX25vX3NvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJ4X2ludHJfc3RhdF90KSk7CisKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSBmcl91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gCisJCQkJCXNpemVvZihnbG9iYWxfc3RhdHNfdCkgKworCQkJCQlzaXplb2YocnhfaW50cl9zdGF0X3QpOworCQkJZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCQlicmVhazsKKworCQljYXNlIEZQSVBFX0RSSVZFUl9TVEFUX0dFTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShmcl91ZHBfcGt0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbi0+ZHJ2c3RhdHNfZ2VuLlVEUF9QSVBFX21nbXRfa21hbGxvY19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwaXBlX21nbXRfc3RhdF90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmZnJfdWRwX3BrdC0+ZGF0YVtzaXplb2YocGlwZV9tZ210X3N0YXRfdCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXJkLT5zdGF0aXN0aWNzLCBzaXplb2YoZ2xvYmFsX3N0YXRzX3QpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWJveC0+Y21kLmxlbmd0aCA9IGZyX3VkcF9wa3QtPmNibG9jay5sZW5ndGggPSBzaXplb2YoZ2xvYmFsX3N0YXRzX3QpKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocnhfaW50cl9zdGF0X3QpOworCQkJZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCisJCWNhc2UgRlJfRlQxX1NUQVRVU19DVFJMOgorCQkJaWYoZnJfdWRwX3BrdC0+ZGF0YVswXSA9PSAxKSB7CisJCQkJaWYockNvdW50KysgIT0gMCApeworCQkJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCQkJbWJveC0+Y21kLmxlbmd0aCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0gCisJCQl9CisgICAgICAgICAgIAorCQkJLyogRGlzYWJsZSBGVDEgTU9OSVRPUiBTVEFUVVMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZyX3VkcF9wa3QtPmRhdGFbMF0gPT0gMCkgeworCQkJCWlmKCAtLXJDb3VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCQkJCW1ib3gtPmNtZC5sZW5ndGggPSAxOworCQkJCQlicmVhazsKKwkJCQl9IAorCQkJfSAgCisJCQlnb3RvIHVkcF9tZ210X2RmbHQ7CisKKwkJCQorCQlkZWZhdWx0OgordWRwX21nbXRfZGZsdDoKKyAJCQlkbyB7CisJCQkJbWVtY3B5KCZtYm94LT5jbWQsCisJCQkJCSZmcl91ZHBfcGt0LT5jYmxvY2suY29tbWFuZCwKKwkJCQkJc2l6ZW9mKGZyX2NtZF90KSk7CisJCQkJaWYobWJveC0+Y21kLmxlbmd0aCkgeworCQkJCQltZW1jcHkoJm1ib3gtPmRhdGEsCisJCQkJCQkoY2hhciAqKWZyX3VkcF9wa3QtPmRhdGEsCisJCQkJCQltYm94LT5jbWQubGVuZ3RoKTsKKwkJCQl9CisgCQkJCQorCQkJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiAKKwkJCQkJQ01EX1RJTUVPVVQ7CisJCQl9IHdoaWxlIChlcnIgJiYgY19yZXRyeS0tICYmIGZyX2V2ZW50KGNhcmQsIGVyciwgbWJveCkpOworCisJCQlpZighZXJyKQorCQkJCWNoYW4tPmRydnN0YXRzX2dlbi4KKwkJCQkJVURQX1BJUEVfbWdtdF9hZHB0cl9jbW5kX09LICsrOworCQkJZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLT5kcnZzdGF0c19nZW4uCisJCQkJCVVEUF9QSVBFX21nbXRfYWRwdHJfY21uZF90aW1lb3V0ICsrOworCisgICAgICAgCSAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSByZXN1bHQgYmFjayB0byBvdXIgYnVmZmVyICovCisJCQltZW1jcHkoJmZyX3VkcF9wa3QtPmNibG9jay5jb21tYW5kLAorCQkJCSZtYm94LT5jbWQsIHNpemVvZihmcl9jbWRfdCkpOworCisgICAgICAgICAgICAgICAgICAgICAgIAlpZihtYm94LT5jbWQubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCW1lbWNweSgmZnJfdWRwX3BrdC0+ZGF0YSwKKwkJCQkJJm1ib3gtPmRhdGEsIG1ib3gtPmNtZC5sZW5ndGgpOworCQkJfQorCQl9IAorICAgICAgICB9CisgICAKKyAgICAgICAgLyogRmlsbCBVRFAgVFRMICovCisgICAgICAgIGZyX3VkcF9wa3QtPmlwX3BrdC50dGwgPSBjYXJkLT53YW5kZXYudHRsOworICAgICAgICBsZW4gPSByZXBseV91ZHAoY2FyZC0+dS5mLnVkcF9wa3RfZGF0YSwgbWJveC0+Y21kLmxlbmd0aCk7CisKKyAgICAgICAgaWYodWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fTkVUV09SSykgeworCisJCWNoYW4tPmZyX2hlYWRlcl9sZW49MjsKKwkJY2hhbi0+ZnJfaGVhZGVyWzBdPVE5MjJfVUk7CisJCWNoYW4tPmZyX2hlYWRlclsxXT1OTFBJRF9JUDsKKwkJCQorCQllcnIgPSBmcl9zZW5kX2RhdGFfaGVhZGVyKGNhcmQsIGRsY2ksIDAsIGxlbiwgCisJCQljYXJkLT51LmYudWRwX3BrdF9kYXRhLGNoYW4tPmZyX2hlYWRlcl9sZW4pOworCQlpZiAoZXJyKXsgCisJCQljaGFuLT5kcnZzdGF0c19nZW4uVURQX1BJUEVfbWdtdF9hZHB0cl9zZW5kX3Bhc3NlZCArKzsKKwkJfWVsc2V7CisJCQljaGFuLT5kcnZzdGF0c19nZW4uVURQX1BJUEVfbWdtdF9hZHB0cl9zZW5kX2ZhaWxlZCArKzsKKwkJfQorCQkKKwl9IGVsc2UgeworCQkvKiBBbGxvY2F0ZSBzb2NrZXQgYnVmZmVyICovCisJCWlmKChuZXdfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pKSAhPSBOVUxMKSB7CisKKwkJCS8qIGNvcHkgZGF0YSBpbnRvIG5ld19za2IgKi8KKwkJCWJ1ZiA9IHNrYl9wdXQobmV3X3NrYiwgbGVuKTsKKwkJCW1lbWNweShidWYsIGNhcmQtPnUuZi51ZHBfcGt0X2RhdGEsIGxlbik7CisgICAgICAgIAorCQkJY2hhbi0+ZHJ2c3RhdHNfZ2VuLgorCQkJCVVEUF9QSVBFX21nbXRfcGFzc2VkX3RvX3N0YWNrICsrOworCQkJbmV3X3NrYi0+ZGV2ID0gZGV2OworCQkJbmV3X3NrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJCQluZXdfc2tiLT5tYWMucmF3ID0gbmV3X3NrYi0+ZGF0YTsKKwkJCW5ldGlmX3J4KG5ld19za2IpOworICAgICAgICAgICAgCQorCQl9IGVsc2UgeworCQkJY2hhbi0+ZHJ2c3RhdHNfZ2VuLlVEUF9QSVBFX21nbXRfbm9fc29ja2V0ICsrOworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogVURQIG1nbXQgY21uZCwgbm8gc29ja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlIVxuIiwgCisJCQljYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgIH0KKworCWNhcmQtPnUuZi51ZHBfcGt0X2xndGggPSAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIEludmVyc2UgQVJQIFJlcXVlc3QKKyAqLworCitpbnQgc2VuZF9pbmFycF9yZXF1ZXN0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyPTA7CisKKwlhcnBoZHJfMTQ5MF90ICpBcnBQYWNrZXQ7CisJYXJwaGRyX2ZyX3QgKmFycGhkcjsKKwlmcl9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCisJaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisKKwlpZihpbl9kZXYgIT0gTlVMTCApIHsJCisKKwkJQXJwUGFja2V0ID0ga21hbGxvYyhzaXplb2YoYXJwaGRyXzE0OTBfdCkgKyBzaXplb2YoYXJwaGRyX2ZyX3QpLCBHRlBfQVRPTUlDKTsKKwkJLyogU05BUCBIZWFkZXIgaW5kaWNhdGluZyBBUlAgKi8KKwkJQXJwUGFja2V0LT5jb250cm9sCT0gMHgwMzsKKwkJQXJwUGFja2V0LT5wYWQJCT0gMHgwMDsKKwkJQXJwUGFja2V0LT5OTFBJRAk9IDB4ODA7CisJCUFycFBhY2tldC0+T1VJWzBdCT0gMDsKKwkJQXJwUGFja2V0LT5PVUlbMV0JPSAwOworCQlBcnBQYWNrZXQtPk9VSVsyXQk9IDA7CisJCUFycFBhY2tldC0+UElECQk9IDB4MDYwODsKKworCQlhcnBoZHIgPSAoYXJwaGRyX2ZyX3QgKikoQXJwUGFja2V0ICsgMSk7IC8vIEdvIHRvIEFSUCBQYWNrZXQKKworCQkvKiBJbkFSUCByZXF1ZXN0ICovCQkKKwkJYXJwaGRyLT5hcl9ocmQgPSAweDBGMDA7CS8qIEZyYW1lIFJlbGF5IEhXIHR5cGUgKi8KKwkJYXJwaGRyLT5hcl9wcm8gPSAweDAwMDg7CS8qIElQIFByb3RvY29sCSAgICAgICAqLworCQlhcnBoZHItPmFyX2hsbiA9IDI7CQkvKiBIVyBhZGRyIGxlbmd0aCAgICAgICovCisJCWFycGhkci0+YXJfcGxuID0gNDsJCS8qIElQIGFkZHIgbGVuZ3RoICAgICAgKi8KKwkJYXJwaGRyLT5hcl9vcCA9IGh0b25zKDB4MDgpOwkvKiBJbkFSUCBSZXF1ZXN0ICAgICAgICovCisJCWFycGhkci0+YXJfc2hhID0gMDsgCQkvKiBzcmMgSFcgRExDSSAtIERvZXNuJ3QgbWF0dGVyICovCisJCWlmKGluX2Rldi0+aWZhX2xpc3QgIT0gTlVMTCkKKwkJCWFycGhkci0+YXJfc2lwID0gaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2xvY2FsOyAgLyogTG9jYWwgQWRkcmVzcyAgICAgICAqL2Vsc2UKKwkJCWFycGhkci0+YXJfc2lwID0gMDsKKwkJYXJwaGRyLT5hcl90aGEgPSAwOyAJCS8qIGRzdCBIVyBETENJIC0gRG9lc24ndCBtYXR0ZXIgKi8KKwkJYXJwaGRyLT5hcl90aXAgPSAwOwkJLyogUmVtb3RlIEFkZHJlc3MgLS0gd2hhdCB3ZSB3YW50ICovCisKKwkJZXJyID0gZnJfc2VuZChjYXJkLCBjaGFuLT5kbGNpLCAwLCBzaXplb2YoYXJwaGRyXzE0OTBfdCkgKyBzaXplb2YoYXJwaGRyX2ZyX3QpLAorCQkgICAJCQkodm9pZCAqKUFycFBhY2tldCk7CisKKwkJaWYgKCFlcnIpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiXG4lczogU2VuZGluZyBJbkFSUCByZXF1ZXN0IG9uIERMQ0kgJWQuXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLCBjaGFuLT5kbGNpKTsKKwkJCWNsZWFyX2JpdChBUlBfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJfQorCisJCWtmcmVlKEFycFBhY2tldCk7CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJTkFSUCBFUlJPUjogJXMgZG9lc24ndCBoYXZlIGEgbG9jYWwgSVAgYWRkcmVzcyFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENoZWNrIHBhY2tldCBmb3IgQVJQIFR5cGUKKyAqLworCitpbnQgaXNfYXJwKHZvaWQgKmJ1ZikKK3sKKwlhcnBoZHJfMTQ5MF90ICphcnBoZHIgPSAoYXJwaGRyXzE0OTBfdCAqKWJ1ZjsKKwkKKwlpZiAoYXJwaGRyLT5wYWQgICA9PSAweDAwICAmJgorCSAgICBhcnBoZHItPk5MUElEID09IDB4ODAgICYmCisJICAgIGFycGhkci0+UElEICAgPT0gMHgwNjA4KSAKKwkJcmV0dXJuIDE7CisJZWxzZSByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByb2Nlc3MgQVJQIFBhY2tldCBUeXBlCisgKi8KKworaW50IHByb2Nlc3NfQVJQKGFycGhkcl8xNDkwX3QgKkFycFBhY2tldCwgc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCisKKwlhcnBoZHJfZnJfdCAqYXJwaGRyID0gKGFycGhkcl9mcl90ICopKEFycFBhY2tldCArIDEpOyAvKiBTa2lwIGhlYWRlciAqLworCWZyX3J4X2J1Zl9jdGxfdCogZnJidWYgPSBjYXJkLT5yeG1iOworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwlmcl9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CQkKKwkKKwkvKiBCZWZvcmUgd2UgdHJhbnNtaXQgQVJQIHBhY2tldCwgd2UgbXVzdCBjaGVjayAKKwkgKiB0byBzZWUgdGhhdCB3ZSBhcmUgbm90IGN1cnJlbnRseSB0cmFuc21pdHRpbmcgYSAKKwkgKiBmcmFtZSAoaW4gJ2lmX3NlbmQoKScpIGFuZCB0aGF0IHdlIGFyZSBub3QgCisJICogYWxyZWFkeSBpbiBhICdkZWxheWVkIHRyYW5zbWl0JyBzdGF0ZS4gKi8KKwlpZiAoY2hlY2tfdHhfc3RhdHVzKGNhcmQsZGV2KSl7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeyAJCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRGlzYWJsaW5nIGNvbW1pbmljYXRpb24gdG8gcHJvY2VzcyBBUlBcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQl9CisJCXNldF9iaXQoQVJQX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCXJldHVybiAwOworCX0KKworCWluX2RldiA9IGRldi0+aXBfcHRyOworCisJLyogQ2hlY2sgdGhhdCBJUCBhZGRyZXNzZXMgZXhpc3QgZm9yIG91ciBuZXR3b3JrIGFkZHJlc3MgKi8KKwlpZiAoaW5fZGV2ID09IE5VTEwgfHwgaW5fZGV2LT5pZmFfbGlzdCA9PSBOVUxMKSAKKwkJcmV0dXJuIC0xOworCisJc3dpdGNoIChudG9ocyhhcnBoZHItPmFyX29wKSkgeworCisJY2FzZSAweDA4OiAgLy8gSW52ZXJzZSBBUlAgcmVxdWVzdCAgLS0gU2VuZCBSZXBseSwgYWRkIHJvdXRlLgorCQkJCisJCS8qIENoZWNrIGZvciB2YWxpZCBBZGRyZXNzICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWN2ZCBQdFAgYWRkciAtSW5BcnAgUmVxOiAldS4ldS4ldS4ldVxuIiwgCisJCQljYXJkLT5kZXZuYW1lLCBOSVBRVUFEKGFycGhkci0+YXJfc2lwKSk7CisKKworCQkvKiBDaGVjayB0aGF0IHRoZSBuZXR3b3JrIGFkZHJlc3MgaXMgdGhlIHNhbWUgYXMgb3Vycywgb25seQorICAgICAgICAgICAgICAgICAqIGlmIHRoZSBuZXRvd3JrIG1hc2sgaXMgbm90IDI1NS4yNTUuMjU1LjI1NS4gT3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICogdGhpcyBjaGVjayB3b3VsZCBub3QgbWFrZSBzZW5zZSAqLworCisJCWlmIChpbl9kZXYtPmlmYV9saXN0LT5pZmFfbWFzayAhPSAweEZGRkZGRkZGICYmIAorCQkgICAgKGluX2Rldi0+aWZhX2xpc3QtPmlmYV9tYXNrICYgYXJwaGRyLT5hcl9zaXApICE9IAorCQkgICAgKGluX2Rldi0+aWZhX2xpc3QtPmlmYV9tYXNrICYgaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2xvY2FsKSl7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogSW52YWxpZCBQdFAgYWRkcmVzcy4gJXUuJXUuJXUuJXUgIEluQVJQIGlnbm9yZWQuXG4iLCAKKwkJCQkJY2FyZC0+ZGV2bmFtZSxOSVBRVUFEKGFycGhkci0+YXJfc2lwKSk7CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBtYXNrICV1LiV1LiV1LiV1XG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLCBOSVBRVUFEKGluX2Rldi0+aWZhX2xpc3QtPmlmYV9tYXNrKSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxvY2FsICV1LiV1LiV1LiV1XG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLE5JUFFVQUQoaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2xvY2FsKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2xvY2FsID09IGFycGhkci0+YXJfc2lwKXsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBMb2NhbCBhZGRyID0gUHRQIGFkZHIuICBJbkFSUCBpZ25vcmVkLlxuIiwgCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCisJCWFycGhkci0+YXJfb3AgPSBodG9ucygweDA5KTsJLyogSW5BUlAgUmVwbHkgKi8KKworCQkvKiBTZXQgYWRkcmVzc2VzICovCisJCWFycGhkci0+YXJfdGlwID0gYXJwaGRyLT5hcl9zaXA7CisJCWFycGhkci0+YXJfc2lwID0gaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2xvY2FsOworCisJCWNoYW4tPmlwX2xvY2FsID0gaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2xvY2FsOworCQljaGFuLT5pcF9yZW1vdGUgPSBhcnBoZHItPmFyX3NpcDsKKworCQlmcl9zZW5kKGNhcmQsIGZyYnVmLT5kbGNpLCAwLCBmcmJ1Zi0+bGVuZ3RoLCAodm9pZCAqKUFycFBhY2tldCk7CisKKwkJaWYgKHRlc3RfYml0KEFSUF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeyAJCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFSUCBQcm9jZXNzZWQgRW5hYmxpbmcgQ29tbXVuaWNhdGlvbiFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJfQorCQl9CisJCWNsZWFyX2JpdChBUlBfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJCisJCWNoYW4tPmlwX2xvY2FsID0gaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2xvY2FsOworCQljaGFuLT5pcF9yZW1vdGUgPSBhcnBoZHItPmFyX3NpcDsKKworCQkvKiBBZGQgUm91dGUgRmxhZyAqLworCQkvKiBUaGUgcm91dGUgd2lsbCBiZSBhZGRlZCBpbiB0aGUgcG9sbGluZyByb3V0aW5lIHNvCisJCSAgIHRoYXQgaXQgaXMgbm90IGludGVycnVwdCBjb250ZXh0LiAqLworCisJCWNoYW4tPnJvdXRlX2ZsYWcgPSBBRERfUk9VVEU7CisJCXRyaWdnZXJfZnJfcG9sbCAoZGV2KTsKKworCQlicmVhazsKKworCWNhc2UgMHgwOTogIC8vIEludmVyc2UgQVJQIHJlcGx5CisKKwkJLyogQ2hlY2sgZm9yIHZhbGlkIEFkZHJlc3MgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlY3ZkIFB0UCBhZGRyICV1LiV1LiV1LiV1IC1JbkFycCBSZXBseVxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSwgTklQUVVBRChhcnBoZHItPmFyX3NpcCkpOworCisKKwkJLyogQ29tcGFyZSBuZXR3b3JrIGFkZHJlc3Nlcywgb25seSBpZiBuZXR3b3JrIG1hc2sKKyAgICAgICAgICAgICAgICAgKiBpcyBub3QgMjU1LjI1NS4yNTUuMjU1ICBJdCB3b3VsZCBub3QgbWFrZSBzZW5zZQorICAgICAgICAgICAgICAgICAqIHRvIHBlcmZvcm0gdGhpcyB0ZXN0IGlmIHRoZSBtYXNrIHdhcyBhbGwgMSdzICovCisKKwkJaWYgKGluX2Rldi0+aWZhX2xpc3QtPmlmYV9tYXNrICE9IDB4ZmZmZmZmZmYgJiYKKwkJICAgIChpbl9kZXYtPmlmYV9saXN0LT5pZmFfbWFzayAmIGFycGhkci0+YXJfc2lwKSAhPSAKKwkJCShpbl9kZXYtPmlmYV9saXN0LT5pZmFfbWFzayAmIGluX2Rldi0+aWZhX2xpc3QtPmlmYV9sb2NhbCkpIHsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludmFsaWQgUHRQIGFkZHJlc3MuICBJbkFSUCBpZ25vcmVkLlxuIiwgCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogTWFrZSBzdXJlIHRoYXQgdGhlIHJlY2VpdmVkIElQIGFkZHJlc3MgaXMgbm90CisgICAgICAgICAgICAgICAgICogdGhlIHNhbWUgYXMgb3VyIG93biBsb2NhbCBhZGRyZXNzICovCisJCWlmIChpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWwgPT0gYXJwaGRyLT5hcl9zaXApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMb2NhbCBhZGRyID0gUHRQIGFkZHIuICBJbkFSUCBpZ25vcmVkLlxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0JCQkKKworCQljaGFuLT5pcF9sb2NhbCAgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisJCWNoYW4tPmlwX3JlbW90ZSA9IGFycGhkci0+YXJfc2lwOworCisJCS8qIEFkZCBSb3V0ZSBGbGFnICovCisJCS8qIFRoZSByb3V0ZSB3aWxsIGJlIGFkZGVkIGluIHRoZSBwb2xsaW5nIHJvdXRpbmUgc28KKwkJICAgdGhhdCBpdCBpcyBub3QgaW50ZXJydXB0IGNvbnRleHQuICovCisKKwkJY2hhbi0+cm91dGVfZmxhZyA9IEFERF9ST1VURTsKKwkJY2hhbi0+aW5hcnAgPSBJTkFSUF9DT05GSUdVUkVEOworCQl0cmlnZ2VyX2ZyX3BvbGwoZGV2KTsKKwkJCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOyAvLyBBUlAncyBhbmQgUkFSUCdzIC0tIFNob3VsZG4ndCBoYXBwZW4uCisJfQorCisJcmV0dXJuIDA7CQorfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB0cmlnZ2VyX2ZyX2FycAorICoKKyAqIERlc2NyaXB0aW9uOgorICogCUFkZCBhbiBmcl9hcnAoKSB0YXNrIGludG8gYSBhcnAKKyAqICAgICAgdGltZXIgaGFuZGxlciBmb3IgYSBzcGVjaWZpYyBkbGNpL2ludGVyZmFjZS4gIAorICogICAgICBUaGlzIHdpbGwga2ljayB0aGUgZnJfYXJwKCkgcm91dGluZSAKKyAqICAgICAgd2l0aGluIHRoZSBzcGVjaWZpZWQgdGltZSBpbnRlcnZhbC4gCisgKgorICogVXNhZ2U6CisgKiAJVGhpcyB0aW1lciBpcyB1c2VkIHRvIHNlbmQgQVJQIHJlcXVlc3RzIGF0CisgKiAgICAgIGNlcnRhaW4gdGltZSBpbnRlcnZhbHMuIAorICogCUNhbGxlZCBieSBhbiBpbnRlcnJ1cHQgdG8gcmVxdWVzdCBhbiBhY3Rpb24KKyAqICAgICAgYXQgYSBsYXRlciBkYXRlLgorICovCQorCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2ZyX2FycChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKworCW1vZF90aW1lcigmY2hhbi0+ZnJfYXJwX3RpbWVyLCBqaWZmaWVzICsgY2hhbi0+aW5hcnBfaW50ZXJ2YWwgKiBIWik7CisJcmV0dXJuOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEFSUCBSZXF1ZXN0IEFjdGlvbgorICoKKyAqCVRoaXMgZnVuY2l0b24gaXMgY2FsbGVkIGJ5IHRpbWVyIGludGVycnVwdCB0byBzZW5kIGFuIGFycCByZXF1ZXN0CisgKiAgICAgIHRvIHRoZSByZW1vdGUgZW5kLgorICovCisKK3N0YXRpYyB2b2lkIGZyX2FycCAodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCWZyX2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKwl2b2xhdGlsZSBzZGxhX3QgKmNhcmQgPSBjaGFuLT5jYXJkOworCWZyNTA4X2ZsYWdzX3QqIGZsYWdzID0gY2FyZC0+ZmxhZ3M7CisKKwkvKiBTZW5kIEFSUCBwYWNrZXRzIGZvciBhbGwgZGV2cycgdW50aWwKKyAgICAgICAgICogQVJQIHN0YXRlIGNoYW5nZXMgdG8gQ09ORklHVVJFRCAqLworCisJaWYgKGNoYW4tPmluYXJwID09IElOQVJQX1JFUVVFU1QgJiYKKwkgICAgY2hhbi0+Y29tbW9uLnN0YXRlID09IFdBTl9DT05ORUNURUQgJiYgCisJICAgIGNhcmQtPndhbmRldi5zdGF0ZSA9PSBXQU5fQ09OTkVDVEVEKXsKKwkJc2V0X2JpdCgwLCZjaGFuLT5pbmFycF9yZWFkeSk7CisJCWNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfQVJQOworCQlmbGFncy0+aW1hc2sgfD0gRlJfSU5UUl9USU1FUjsJCisJfQorIAorCXJldHVybjsKK30KKwkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFBlcmZvcm0gdGhlIEludGVycnVwdCBUZXN0IGJ5IHJ1bm5pbmcgdGhlIFJFQURfQ09ERV9WRVJTSU9OIGNvbW1hbmQgTUFYX0lOVFJfCisgKiBURVNUX0NPVU5URVIgdGltZXMuCisgKi8KK3N0YXRpYyBpbnQgaW50cl90ZXN0KCBzZGxhX3QqIGNhcmQgKQoreworCWZyX21ib3hfdCogbWIgPSBjYXJkLT5tYm94OworCWludCBlcnIsaTsKKworICAgICAgICBlcnIgPSBmcl9zZXRfaW50cl9tb2RlKGNhcmQsIEZSX0lOVFJfUkVBRFksIGNhcmQtPndhbmRldi5tdHUsIDAgKTsKKwkKKwlpZiAoZXJyID09IENNRF9PSykgeworCisJCWZvciAoIGkgPSAwOyBpIDwgTUFYX0lOVFJfVEVTVF9DT1VOVEVSOyBpKysgKSB7CisgCQkJLyogUnVuIGNvbW1hbmQgUkVBRF9DT0RFX1ZFUlNJT04gKi8KKwkJCW1iLT5jbWQubGVuZ3RoICA9IDA7CisJCQltYi0+Y21kLmNvbW1hbmQgPSBGUl9SRUFEX0NPREVfVkVSU0lPTjsKKwkJCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQkJaWYgKGVyciAhPSBDTURfT0spIAorCQkJCWZyX2V2ZW50KGNhcmQsIGVyciwgbWIpOworCQl9CisJCisJfSBlbHNlIHsKKwkJcmV0dXJuIGVycjsJCisJfQorCisJZXJyID0gZnJfc2V0X2ludHJfbW9kZSggY2FyZCwgMCwgY2FyZC0+d2FuZGV2Lm10dSwgMCApOworCisJaWYoIGVyciAhPSBDTURfT0sgKSAKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBVRFAgY2FsbCBpdCBpcy4gRlBJUEU4TkQgPworICovCitzdGF0aWMgaW50IHVkcF9wa3RfdHlwZSggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc2RsYV90KiBjYXJkICkKK3sKKwlmcl91ZHBfcGt0X3QgKmZyX3VkcF9wa3QgPSAoZnJfdWRwX3BrdF90ICopc2tiLT5kYXRhOworCisJLyogUXVpY2sgSEFDSyAqLworCQorCQorICAgICAgICBpZigoZnJfdWRwX3BrdC0+aXBfcGt0LnByb3RvY29sID09IFVEUE1HTVRfVURQX1BST1RPQ09MKSAmJgorCQkoZnJfdWRwX3BrdC0+aXBfcGt0LnZlcl9pbmV0X2hkcl9sZW5ndGggPT0gMHg0NSkgJiYKKwkJKGZyX3VkcF9wa3QtPnVkcF9wa3QudWRwX2RzdF9wb3J0ID09IAorCQludG9ocyhjYXJkLT53YW5kZXYudWRwX3BvcnQpKSAmJgorCQkoZnJfdWRwX3BrdC0+d3BfbWdtdC5yZXF1ZXN0X3JlcGx5ID09IAorCQlVRFBNR01UX1JFUVVFU1QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighc3RybmNtcChmcl91ZHBfcGt0LT53cF9tZ210LnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVURQTUdNVF9GUElQRV9TSUdOQVRVUkUsIDgpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVEUF9GUElQRV9UWVBFOworCQkJfQorCX0KKyAgICAgICAgcmV0dXJuIFVEUF9JTlZBTElEX1RZUEU7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemVzIHRoZSBTdGF0aXN0aWNzIHZhbHVlcyBpbiB0aGUgZnJfY2hhbm5lbCBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQgaW5pdF9jaGFuX3N0YXRpc3RpY3MoIGZyX2NoYW5uZWxfdCogY2hhbikKK3sKKyAgICAgICAgbWVtc2V0KCZjaGFuLT5kcnZzdGF0c19pZl9zZW5kLmlmX3NlbmRfZW50cnksIDAsCisJCXNpemVvZihpZl9zZW5kX3N0YXRfdCkpOworICAgICAgICBtZW1zZXQoJmNoYW4tPmRydnN0YXRzX3J4X2ludHIucnhfaW50cl9ub19zb2NrZXQsIDAsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHJ4X2ludHJfc3RhdF90KSk7CisgICAgICAgIG1lbXNldCgmY2hhbi0+ZHJ2c3RhdHNfZ2VuLlVEUF9QSVBFX21nbXRfa21hbGxvY19lcnIsIDAsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHBpcGVfbWdtdF9zdGF0X3QpKTsKK30KKwkKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplcyB0aGUgU3RhdGlzdGljcyB2YWx1ZXMgaW4gdGhlIFNkbGFfdCBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQgaW5pdF9nbG9iYWxfc3RhdGlzdGljcyggc2RsYV90KiBjYXJkICkKK3sKKwkvKiBJbnRpYWxpemUgZ2xvYmFsIHN0YXRpc3RpY3MgZm9yIGEgY2FyZCAqLworICAgICAgICBtZW1zZXQoJmNhcmQtPnN0YXRpc3RpY3MuaXNyX2VudHJ5LCAwLCBzaXplb2YoZ2xvYmFsX3N0YXRzX3QpKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9ETENJX0lCX21hcHBpbmcoIHNkbGFfdCogY2FyZCwgZnJfY2hhbm5lbF90KiBjaGFuICkKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CQorCWRsY2lfSUJfbWFwcGluZ190KiByZXN1bHQ7IAorCWludCBlcnIsIGNvdW50ZXIsIGZvdW5kOwkKKworCWRvIHsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9SRUFEX0RMQ0lfSUJfTUFQUElORzsKKwkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CQorCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisKKwlpZiggbWJveC0+Y21kLnJlc3VsdCAhPSAwKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlYWQgRExDSSBJQiBNYXBwaW5nIGZhaWxlZFxuIiwgCisJCQljaGFuLT5uYW1lKTsKKwl9CisKKwljb3VudGVyID0gbWJveC0+Y21kLmxlbmd0aCAvIHNpemVvZihkbGNpX0lCX21hcHBpbmdfdCk7CisJcmVzdWx0ID0gKHZvaWQgKiltYm94LT5kYXRhOworCQorCWZvdW5kID0gMDsKKwlmb3IgKDsgY291bnRlcjsgLS1jb3VudGVyLCArK3Jlc3VsdCkgeworCQlpZiAoIHJlc3VsdC0+ZGxjaSA9PSBjaGFuLT5kbGNpICkgeworCQkJY2hhbi0+SUJfYWRkciA9IHJlc3VsdC0+YWRkcl92YWx1ZTsKKwkJCWlmKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KXsKKwkgICAgICAgICAgICAgCQljaGFuLT5kbGNpX2ludF9pbnRlcmZhY2UgPQorCQkJCQkodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkJCQljaGFuLT5JQl9hZGRyKTsKKyAgICAgICAJCQl9ZWxzZXsgCisJCQkJY2hhbi0+ZGxjaV9pbnRfaW50ZXJmYWNlID0gCisJCQkJCSh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArIAorCQkJCQkoY2hhbi0+SUJfYWRkciAmIDB4MDAwMDFGRkYpKTsKKworCQkJfQorCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CQorCQl9IAorCX0KKwlpZiAoIWZvdW5kKQorCQlwcmludGsoIEtFUk5fSU5GTyAiJXM6IERMQ0kgJWQgbm90IGZvdW5kIGJ5IElCIE1BUFBJTkcgY21kXG4iLCAKKwkJY2FyZC0+ZGV2bmFtZSwgY2hhbi0+ZGxjaSk7Cit9CisKKworCit2b2lkIHM1MDhfczUxNF9sb2NrKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKQoreworCWlmIChjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPndhbmRldi5sb2NrLCAqc21wX2ZsYWdzKTsKKwl9ZWxzZXsKKwkJc3Bpbl9sb2NrKCZjYXJkLT51LmYuaWZfc2VuZF9sb2NrKTsKKwl9CisJcmV0dXJuOworfQorCisKK3ZvaWQgczUwOF9zNTE0X3VubG9jayhzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncykKK3sKKwlpZiAoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZjYXJkLT53YW5kZXYubG9jaywgKnNtcF9mbGFncyk7CisJfWVsc2V7CisJCXNwaW5fdW5sb2NrKCZjYXJkLT51LmYuaWZfc2VuZF9sb2NrKTsKKwl9CisJcmV0dXJuOworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICBSRUNFSVZFIElOVEVSUlVQVDogQk9UVE9NIEhBTEYgSEFORExFUlMgCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogYmhfZW5xdWV1ZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJSW5zZXJ0IGEgcmVjZWl2ZWQgcGFja2V0IGludG8gYSBjaXJjdWxhcgorICogICAgICByeCBxdWV1ZS4gIFRoaXMgcGFja2V0IHdpbGwgYmUgcGlja2VkIHVwIAorICogICAgICBieSBmcl9iaCgpIGFuZCBzZW50IHVwIHRoZSBzdGFjayB0byB0aGUKKyAqICAgICAgdXNlci4KKyAqICAgICAgIAkKKyAqIFVzYWdlOiAKKyAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHJ4IGludGVycnVwdCwKKyAqICAgICAgaW4gQVBJIG1vZGUuCisgKgorICovCisKK3N0YXRpYyBpbnQgYmhfZW5xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIENoZWNrIGZvciBmdWxsICovCisJZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisKKworCWlmIChhdG9taWNfcmVhZCgmY2hhbi0+YmhfYnVmZl91c2VkKSA9PSBNQVhfQkhfQlVGRil7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiAxOyAKKwl9CisKKwkoKGJoX2RhdGFfdCAqKSZjaGFuLT5iaF9oZWFkW2NoYW4tPmJoX3dyaXRlXSktPnNrYiA9IHNrYjsKKworCWlmIChjaGFuLT5iaF93cml0ZSA9PSAoTUFYX0JIX0JVRkYtMSkpeworCQljaGFuLT5iaF93cml0ZT0wOworCX1lbHNleworCQkrK2NoYW4tPmJoX3dyaXRlOworCX0KKworCWF0b21pY19pbmMoJmNoYW4tPmJoX2J1ZmZfdXNlZCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB0cmlnZ2VyX2ZyX2JoCisgKgorICogRGVzY3JpcHRpb246CisgKiAJS2ljayB0aGUgZnJfYmgoKSBoYW5kbGVyCisgKgorICogVXNhZ2U6CisgKglyeCBpbnRlcnJ1cHQgY2FsbHMgdGhpcyBmdW5jdGlvbiBkdXJpbmcKKyAqICAgICAgdGhlIEFQSSBtb2RlLiAKKyAqLworCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2ZyX2JoIChmcl9jaGFubmVsX3QgKmNoYW4pCit7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KDAsJmNoYW4tPnRxX3dvcmtpbmcpKXsKKwkJd2FucGlwZV9xdWV1ZV93b3JrKCZjaGFuLT5jb21tb24ud2FucGlwZV93b3JrKTsKKwl9Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogZnJfYmgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUZyYW1lIHJlbGF5IHJlY2VpdmUgQkggaGFuZGxlci4gCisgKglEZXF1ZXVlIGRhdGEgZnJvbSB0aGUgQkggY2lyY3VsYXIgCisgKglidWZmZXIgYW5kIHBhc3MgaXQgdXAgdGhlIEFQSSBzb2NrLgorICogICAgICAgCQorICogUmF0aW9uYWxlOiAKKyAqCVRoaXMgZnVjdGlvbiBpcyB1c2VkIHRvIG9mZmxvYWQgdGhlIAorICoJcnhfaW50ZXJydXB0IGR1cmluZyBBUEkgb3BlcmF0aW9uIG1vZGUuICAKKyAqCVRoZSBmcl9iaCgpIGZ1bmN0aW9uIGV4ZWN1dGVzIGZvciBlYWNoIAorICoJZGxjaS9pbnRlcmZhY2UuICAKKyAqIAorICogICAgICBPbmNlIHJlY2VpdmUgaW50ZXJydXB0IGNvcGllcyBkYXRhIGZyb20gdGhlCisgKiAgICAgIGNhcmQgaW50byBhbiBza2IgYnVmZmVyLCB0aGUgc2tiIGJ1ZmZlcgorICogIAlpcyBhcHBlbmRlZCB0byBhIGNpcmN1bGFyIEJIIGJ1ZmZlci4KKyAqICAJVGhlbiB0aGUgaW50ZXJydXB0IGtpY2tzIGZyX2JoKCkgdG8gZmluaXNoIHRoZQorICogICAgICBqb2IgYXQgYSBsYXRlciB0aW1lIChub3Qgd2l0aGluIHRoZSBpbnRlcnJ1cHQpLgorICogICAgICAgCisgKiBVc2FnZToKKyAqIAlJbnRlcnJ1cHRzIHVzZSB0aGlzIHRvIGRlZmVyIGEgdGFzayB0byAKKyAqICAgICAgYSBwb2xsaW5nIHJvdXRpbmUuCisgKgorICovCQorCitzdGF0aWMgdm9pZCBmcl9iaChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hhbi0+Y2FyZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKGF0b21pY19yZWFkKCZjaGFuLT5iaF9idWZmX3VzZWQpID09IDApeworCQljbGVhcl9iaXQoMCwgJmNoYW4tPnRxX3dvcmtpbmcpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKGF0b21pY19yZWFkKCZjaGFuLT5iaF9idWZmX3VzZWQpKXsKKworCQlpZiAoY2hhbi0+Y29tbW9uLnNrID09IE5VTEwgfHwgY2hhbi0+Y29tbW9uLmZ1bmMgPT0gTlVMTCl7CisJCQljbGVhcl9iaXQoMCwgJmNoYW4tPnRxX3dvcmtpbmcpOworCQkJcmV0dXJuOworCQl9CisKKwkJc2tiICA9ICgoYmhfZGF0YV90ICopJmNoYW4tPmJoX2hlYWRbY2hhbi0+YmhfcmVhZF0pLT5za2I7CisKKwkJaWYgKHNrYiAhPSBOVUxMKXsKKworCQkJaWYgKGNoYW4tPmNvbW1vbi5zayA9PSBOVUxMIHx8IGNoYW4tPmNvbW1vbi5mdW5jID09IE5VTEwpeworCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQkJKytjaGFuLT5pZnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQlmcl9iaF9jbGVhbnVwKGRldik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChjaGFuLT5jb21tb24uZnVuYyhza2IsZGV2LGNoYW4tPmNvbW1vbi5zaykgIT0gMCl7CisJCQkJLyogU29jayBmdWxsIGNhbm5vdCBzZW5kLCBxdWV1ZSB1cyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5vdGhlciB0cnkgKi8KKwkJCQlhdG9taWNfc2V0KCZjaGFuLT5jb21tb24ucmVjZWl2ZV9ibG9jaywxKTsKKwkJCQlyZXR1cm47CisJCQl9ZWxzZXsKKwkJCQlmcl9iaF9jbGVhbnVwKGRldik7CisJCQl9CisJCX1lbHNleworCQkJZnJfYmhfY2xlYW51cChkZXYpOworCQl9CisJfQkKKwljbGVhcl9iaXQoMCwgJmNoYW4tPnRxX3dvcmtpbmcpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGZyX2JoX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisKKwkoKGJoX2RhdGFfdCAqKSZjaGFuLT5iaF9oZWFkW2NoYW4tPmJoX3JlYWRdKS0+c2tiID0gTlVMTDsKKworCWlmIChjaGFuLT5iaF9yZWFkID09IChNQVhfQkhfQlVGRi0xKSl7CisJCWNoYW4tPmJoX3JlYWQ9MDsKKwl9ZWxzZXsKKwkJKytjaGFuLT5iaF9yZWFkOwkKKwl9CisKKwlhdG9taWNfZGVjKCZjaGFuLT5iaF9idWZmX3VzZWQpOworCXJldHVybiAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgUE9MTCBCSCBIQU5ETEVSUyBBTkQgS0lDSyBST1VUSU5FUyAKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHRyaWdnZXJfZnJfcG9sbAorICoKKyAqIERlc2NyaXB0aW9uOgorICogCUFkZCBhIGZyX3BvbGwoKSB0YXNrIGludG8gYSB0cV9zY2hlZHVsZXIgYmggaGFuZGxlcgorICogICAgICBmb3IgYSBzcGVjaWZpYyBkbGNpL2ludGVyZmFjZS4gIFRoaXMgd2lsbCBraWNrCisgKiAgICAgIHRoZSBmcl9wb2xsKCkgcm91dGluZSBhdCBhIGxhdGVyIHRpbWUuIAorICoKKyAqIFVzYWdlOgorICogCUludGVycnVwdHMgdXNlIHRoaXMgdG8gZGVmZXIgYSB0YWtzIHRvIAorICogICAgICBhIHBvbGxpbmcgcm91dGluZS4KKyAqCisgKi8JCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2ZyX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2NoZWR1bGVfd29yaygmY2hhbi0+ZnJfcG9sbF93b3JrKTsKKwlyZXR1cm47Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGZyX3BvbGwKKyAqCQorICogUmF0aW9uYWxlOgorICogCVdlIGNhbm5vdCBtYW5pcHVsYXRlIHRoZSByb3V0aW5nIHRhYmxlcywgb3IKKyAqICAgICAgaXAgYWRkcmVzc2VzIHdpdGhpbmcgdGhlIGludGVycnVwdC4gVGhlcmVmb3JlCisgKiAgICAgIHdlIG11c3QgcGVyZm9ybSBzdWNoIGFjdG9ucyBvdXRzaWRlIGFuIGludGVycnVwdCAKKyAqICAgICAgYXQgYSBsYXRlciB0aW1lLiAKKyAqCisgKiBEZXNjcmlwdGlvbjoJCisgKglGcmFtZSByZWxheSBwb2xsaW5nIHJvdXRpbmUsIHJlc3BvbnNpYmxlIGZvciAKKyAqICAgICAJc2h1dHRpbmcgZG93biBpbnRlcmZhY2VzIHVwb24gZGlzY29ubmVjdAorICogICAgIAlhbmQgYWRkaW5nL3JlbW92aW5nIHJvdXRlcy4gCisgKiAgICAgIAorICogVXNhZ2U6ICAgICAgICAKKyAqIAlUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGZvciBlYWNoIGZyYW1lIHJlbGF5CisgKiAJZGxjaS9pbnRlcmZhY2UgdGhyb3VnaCBhIHRxX3NjaGVkdWxlIGJvdHRvbSBoYWxmLgorICogICAgICAKKyAqICAgICAgdHJpZ2dlcl9mcl9wb2xsKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBraWNrCisgKiAgICAgIHRoZSBmcl9wb2xsIHJvdXRpbmUuICAKKyAqLworCitzdGF0aWMgdm9pZCBmcl9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlmcl9jaGFubmVsX3QqIGNoYW47CisJc2RsYV90ICpjYXJkOworCXU4IGNoZWNrX2dhdGV3YXk9MDsKKworCWlmICghZGV2IHx8IChjaGFuID0gZGV2LT5wcml2KSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwljYXJkID0gY2hhbi0+Y2FyZDsKKwkKKwkvKiAoUmUpQ29uZmlndXJhaXRvbiBpcyBpbiBwcm9ncmVzcywgc3RvcCB3aGF0IHlvdSBhcmUgCisJICogZG9pbmcgYW5kIGdldCBvdXQgKi8KKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoY2hhbi0+Y29tbW9uLnN0YXRlKXsKKworCWNhc2UgV0FOX0RJU0NPTk5FQ1RFRDoKKworCQlpZiAodGVzdF9iaXQoRFlOX09QVF9PTiwmY2hhbi0+aW50ZXJmYWNlX2Rvd24pICYmCisJCSAgICAhdGVzdF9iaXQoREVWX0RPV04sICZjaGFuLT5pbnRlcmZhY2VfZG93bikgJiYKKwkJICAgIGRldi0+ZmxhZ3MmSUZGX1VQKXsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVyZmFjZSAlcyBpcyBEb3duLlxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOworCQkJY2hhbmdlX2Rldl9mbGFncyhkZXYsZGV2LT5mbGFncyZ+SUZGX1VQKTsKKwkJCXNldF9iaXQoREVWX0RPV04sICZjaGFuLT5pbnRlcmZhY2VfZG93bik7CisJCQljaGFuLT5yb3V0ZV9mbGFnID0gTk9fUk9VVEU7CisJCQkKKwkJfWVsc2V7CisJCQlpZiAoY2hhbi0+aW5hcnAgIT0gSU5BUlBfTk9ORSkKKwkJCQlwcm9jZXNzX3JvdXRlKGRldik7CQorCQl9CisJCWJyZWFrOworCisJY2FzZSBXQU5fQ09OTkVDVEVEOgorCisJCWlmICh0ZXN0X2JpdChEWU5fT1BUX09OLCZjaGFuLT5pbnRlcmZhY2VfZG93bikgJiYKKwkJICAgIHRlc3RfYml0KERFVl9ET1dOLCAmY2hhbi0+aW50ZXJmYWNlX2Rvd24pICYmCisJCSAgICAhKGRldi0+ZmxhZ3MmSUZGX1VQKSl7CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcmZhY2UgJXMgaXMgVXAuXG4iLCAKKwkJCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOworCisJCQljaGFuZ2VfZGV2X2ZsYWdzKGRldixkZXYtPmZsYWdzfElGRl9VUCk7CisJCQljbGVhcl9iaXQoREVWX0RPV04sICZjaGFuLT5pbnRlcmZhY2VfZG93bik7CisJCQljaGVja19nYXRld2F5PTE7CisJCX0KKworCQlpZiAoY2hhbi0+aW5hcnAgIT0gSU5BUlBfTk9ORSl7CisJCQlwcm9jZXNzX3JvdXRlKGRldik7CisJCQljaGVja19nYXRld2F5PTE7CisJCX0KKworCQlpZiAoY2hhbi0+Z2F0ZXdheSAmJiBjaGVja19nYXRld2F5KQorCQkJYWRkX2dhdGV3YXkoY2FyZCxkZXYpOworCisJCWJyZWFrOworCisJfQorCisJcmV0dXJuOwkKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogY2hlY2tfdHhfc3RhdHVzCisgKgorICogUmF0aW9uYWxlOgorICoJV2UgY2Fubm90IHRyYW5zbWl0IGZyb20gYW4gaW50ZXJydXB0IHdoaWxlCisgKiAgICAgIHRoZSBpZl9zZW5kIGlzIHRyYW5zbWl0dGluZyBkYXRhLiAgVGhlcmVmb3JlLAorICogICAgICB3ZSBtdXN0IGNoZWNrIHdoZXRoZXIgdGhlIHR4IGJ1ZmZlcnMgYXJlCisgKiAgICAgIGJlZ2luIHVzZWQsIGJlZm9yZSB3ZSB0cmFuc21pdCBmcm9tIGFuCisgKiAgICAgIGludGVycnVwdC4JCisgKiAKKyAqIERlc2NyaXB0aW9uOgkKKyAqCUNoZWNrcyB3aGV0aGVyIGl0J3Mgc2FmZSB0byB1c2UgdGhlIHRyYW5zbWl0IAorICogICAgICBidWZmZXJzLiAKKyAqCisgKiBVc2FnZToKKyAqIAlBUlAgYW5kIFVEUCBoYW5kbGluZyByb3V0aW5lcyB1c2UgdGhpcyBmdW5jdGlvbgorICogICAgICBiZWNhdXNlLCB0aGV5IG5lZWQgdG8gdHJhbnNtaXQgZGF0YSBkdXJpbmcKKyAqICAgICAgYW4gaW50ZXJydXB0LgorICovCisKK3N0YXRpYyBpbnQgY2hlY2tfdHhfc3RhdHVzKHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCWlmIChjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCl7CisJCWlmICh0ZXN0X2JpdChTRU5EX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSB8fAorCQkJdGVzdF9iaXQoU0VORF9UWElSUV9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpIHsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSB8fCAoY2FyZC0+dS5mLnR4X2ludGVycnVwdHNfcGVuZGluZykpCisgICAgIAkJcmV0dXJuIDE7IAorCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBtb3ZlX2Rldl90b19uZXh0CisgKiAgCisgKiBEZXNjcmlwdGlvbjoKKyAqCU1vdmUgdGhlIGRldiBwb2ludGVyIHRvIHRoZSBuZXh0IGxvY2F0aW9uIGluIHRoZQorICogICAgICBsaW5rIGxpc3QuICBDaGVjayBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgCisgKiAgICAgIGxpc3QsIGlmIHNvIHN0YXJ0IGZyb20gdGhlIGJlZ2luaW5nLgorICoKKyAqIFVzYWdlOgorICogCVRpbWVyIGludGVycnVwdCB1c2VzIHRoaXMgZnVuY3Rpb24gdG8gZWZmaWNpZW50bHkKKyAqICAgICAgc3RlcCB0aHJvdWdoIHRoZSBkZXZpY2VzIHRoYXQgbmVlZCB0byBzZW5kIEFSUCBkYXRhLgorICoKKyAqLworCitzdHJ1Y3QgbmV0X2RldmljZSAqbW92ZV9kZXZfdG9fbmV4dChzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGNhcmQtPndhbmRldi5uZXdfaWZfY250ICE9IDEpeworCQlpZiAoISooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdikpCisJCQlyZXR1cm4gY2FyZC0+d2FuZGV2LmRldjsKKwkJZWxzZQorCQkJcmV0dXJuICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdik7CisJfQorCXJldHVybiBkZXY7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHRyaWdnZXJfY29uZmlnX2ZyCisgKgorICogUmF0aW9uYWxlOgorICoJQWxsIGNvbW1hbmRzIG11c3QgYmUgcGVyZm9ybWVkIGluc2lkZSBvZiBhICAKKyAqICAgICAgaW50ZXJydXB0LiAgIAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJS2ljayB0aGUgY29uZmlnX2ZyKCkgcm91dGluZSB0aHJvdWdodCB0aGUKKyAqICAgICAgdGltZXIgaW50ZXJydXB0LgorICovCisKKworc3RhdGljIHZvaWQgdHJpZ2dlcl9jb25maWdfZnIgKHNkbGFfdCAqY2FyZCkKK3sKKwlmcjUwOF9mbGFnc190KiBmbGFncyA9IGNhcmQtPmZsYWdzOworCisJY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9DT05GSUc7CisJZmxhZ3MtPmltYXNrIHw9IEZSX0lOVFJfVElNRVI7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogY29uZmlnX2ZyCisgKgorICogUmF0aW9uYWxlOgorICogCUFsbCBjb21tYW5kcyBtdXN0IGJlIHBlcmZvcm1lZCBpbnNpZGUgb2YgYSAgCisgKiAgICAgIGludGVycnVwdC4gIAorICYKKyAqIERlc2NyaXB0aW9uOgkKKyAqIAlDb25maWd1cmUgYSBETENJLiBUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkCisgKiAgICAgIGJ5IGEgdGltZXJfaW50ZXJydXB0LiAgVGhlIGlmX29wZW4oKSBmdW5jdGlvbgorICogICAgICB0cmlnZ2VycyBpdC4KKyAqCisgKiBVc2FnZToKKyAqCW5ld19pZigpIGNvbGxlY3RzIGFsbCBkYXRhIG5lY2Vzc2FyeSB0bworICogICAgICBjb25maWd1cmUgdGhlIERMQ0kuIEl0IHNldHMgdGhlIGNoYW4tPmRsY2lfcmVhZHkgCisgKiAgICAgIGJpdC4gIFdoZW4gdGhlIGlmX29wZW4oKSBmdW5jdGlvbiBpcyBleGVjdXRlZAorICogICAgICBpdCBjaGVja3MgdGhpcyBiaXQsIGFuZCBpZiBpdHMgc2V0IGl0IHRyaWdnZXJzCisgKiAgICAgIHRoZSB0aW1lciBpbnRlcnJ1cHQgdG8gZXhlY3V0ZSB0aGUgY29uZmlnX2ZyKCkKKyAqICAgICAgZnVuY3Rpb24uCisgKi8KKworc3RhdGljIHZvaWQgY29uZmlnX2ZyIChzZGxhX3QgKmNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlmcl9jaGFubmVsX3QgKmNoYW47CisKKwlmb3IgKGRldiA9IGNhcmQtPndhbmRldi5kZXY7IGRldjsKKwkgICAgIGRldiA9ICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdikpIHsKKwkKKwkJaWYgKChjaGFuPWRldi0+cHJpdikgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQkKKwkJaWYgKCF0ZXN0X2JpdCgwLCZjaGFuLT5jb25maWdfZGxjaSkpCisJCQljb250aW51ZTsKKworCQljbGVhcl9iaXQoMCwmY2hhbi0+Y29uZmlnX2RsY2kpOworCisJCS8qIElmIHNpZ25hbGxpbmcgaXMgc2V0IHRvIE5PLCB0aGVuIHNldHVwIAorICAgICAgICAJICogRExDSSBhZGRyZXNzZXMgcmlnaHQgYXdheS4gIERvbid0IGhhdmUgdG8gd2FpdCBmb3IKKwkJICogbGluayB0byBjb25uZWN0LiAKKwkJICovCisJCWlmIChjYXJkLT53YW5kZXYuc2lnbmFsbGluZyA9PSBXQU5PUFRfTk8peworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNpZ25hbGxpbmcgc2V0IHRvIE5POiBNYXBwaW5nIERMQ0knc1xuIiwKKwkJCQkJY2FyZC0+d2FuZGV2Lm5hbWUpOworCQkJaWYgKGZyX2luaXRfZGxjaShjYXJkLGNoYW4pKXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogRVJST1I6IEZhaWxlZCB0byBjb25maWd1cmUgRExDSSAlaSAhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLCBjaGFuLT5kbGNpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlpZiAoY2FyZC0+d2FuZGV2LnN0YXRpb24gPT0gV0FOT1BUX0NQRSkgeworCQorCQkJdXBkYXRlX2NoYW5fc3RhdGUoZGV2KTsJCisJCQkKKwkJCS8qIENQRTogaXNzdWUgZnVsbCBzdGF0dXMgZW5xdWlyeSAqLworCQkJZnJfaXNzdWVfaXNmKGNhcmQsIEZSX0lTRl9GU0UpOworCisJCX0gZWxzZSB7CQorCQkJLyogRlIgc3dpdGNoOiBhY3RpdmF0ZSBETENJKHMpICovCisJCisJCQkvKiBGb3IgU3dpdGNoIGVtdWxhdGlvbiB3ZSBoYXZlIHRvIEFERCBhbmQgQUNUSVZBVEUKKwkJCSAqIHRoZSBETENJKHMpIHRoYXQgd2VyZSBjb25maWd1cmVkIHdpdGggdGhlIFNFVF9ETENJXworCQkJICogQ09ORklHVVJBVElPTiBjb21tYW5kLiBBZGQgYW5kIEFjdGl2YXRlIHdpbGwgZmFpbCBpZgorCQkJICogRExDSSBzcGVjaWZpZWQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBsaXN0LgorCQkJICoKKwkJCSAqIEFsc28gSWZfb3BlbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBpbnRlcmZhY2UuIEJ1dAorCQkJICogaXQgZG9lcyBub3QgZ2V0IGluIGhlcmUgZm9yIGFsbCB0aGUgaW50ZXJmYWNlLiBTbworCQkgCSAqIHdlIGhhdmUgdG8gcGFzcyB0aGUgZW50aXJlIGxpc3Qgb2YgRExDSShzKSB0byBhZGQgCisJCQkgKiBhY3RpdmF0ZSByb3V0aW5lcy4gIAorCQkJICovIAorCQkJCisJCQlpZiAoIWNoZWNrX2RsY2lfY29uZmlnIChjYXJkLCBjaGFuKSl7CisJCQkJZnJfYWRkX2RsY2koY2FyZCwgY2hhbi0+ZGxjaSk7CisJCQkJZnJfYWN0aXZhdGVfZGxjaShjYXJkLCBjaGFuLT5kbGNpKTsKKwkJCX0KKwkJfQorCisJCWNhcmQtPnUuZi5kbGNpX3RvX2Rldl9tYXBbY2hhbi0+ZGxjaV0gPSBkZXY7CisJfQorCXJldHVybjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBjb25maWdfZnIKKyAqCisgKiBSYXRpb25hbGU6CisgKglBbGwgY29tbWFuZHMgbXVzdCBiZSBleGVjdXRlZCBkdXJpbmcgYW4gaW50ZXJydXB0LgorICogCisgKiBEZXNjcmlwdGlvbjoJCisgKglUcmlnZ2VyIHVuY29maWdfZnIoKSBmdW5jdGlvbiB0aHJvdWdoIAorICogICAgICB0aGUgdGltZXIgaW50ZXJydXB0LgorICoKKyAqLworCitzdGF0aWMgdm9pZCB0cmlnZ2VyX3VuY29uZmlnX2ZyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJfY2hhbm5lbF90ICpjaGFuID0gZGV2LT5wcml2OworCXZvbGF0aWxlIHNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisJdTMyIHRpbWVvdXQ7CisJZnI1MDhfZmxhZ3NfdCogZmxhZ3MgPSBjYXJkLT5mbGFnczsKKwlpbnQgcmVzZXRfY3JpdGljYWw9MDsKKwkKKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisJCWNsZWFyX2JpdChQRVJJX0NSSVQsKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQlyZXNldF9jcml0aWNhbD0xOworCX0KKwkJCisJLyogcnVuIHVuY29uZmlnX2RsY2koKSBmdW5jdGlvbiAKKyAgICAgICAgICogdGhyb3VnaHQgdGhlIHRpbWVyIGludGVycnVwdCAqLworCXNldF9iaXQoMCwodm9pZCopJmNoYW4tPnVuY29uZmlnX2RsY2kpOworCWNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfVU5DT05GSUc7CisJZmxhZ3MtPmltYXNrIHw9IEZSX0lOVFJfVElNRVI7CisKKwkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCXRpbWVvdXQgPSBqaWZmaWVzOworICAgICAJZm9yKDs7KSB7CisKKwkJaWYoIShjYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVU5DT05GSUcpKQorCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAJaWYgKChqaWZmaWVzIC0gdGltZW91dCkgPiAoMSAqIEhaKSl7CisgICAgCQkJY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfVU5DT05GSUc7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRmFpbGVkIHRvIGRlbGV0ZSBETENJICVpXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsY2hhbi0+ZGxjaSk7CisgCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocmVzZXRfY3JpdGljYWwpeworCQlzZXRfYml0KFBFUklfQ1JJVCwodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB1bmNvbmZpZ19mcgorICoKKyAqIFJhdGlvbmFsZToKKyAqCUFsbCBjb21tYW5kcyBtdXN0IGJlIGV4ZWN1dGVkIGR1cmluZyBhbiBpbnRlcnJ1cHQuCisgKiAKKyAqIERlc2NyaXB0aW9uOgkKKyAqCVJlbW92ZSB0aGUgZGxjaSBmcm9tIGZpcm13YXJlLgorICoJVGhpcyBmdW5jaXRvbiBpcyB1c2VkIGluIE5PREUgc2h1dGRvd24uCisgKi8KKworc3RhdGljIHZvaWQgdW5jb25maWdfZnIgKHNkbGFfdCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWZyX2NoYW5uZWxfdCAqY2hhbjsKKworCWZvciAoZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsgZGV2OworCSAgICAgZGV2ID0gKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KSl7CisJCisJCWlmICgoY2hhbj1kZXYtPnByaXYpID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJCisJCWlmICghdGVzdF9iaXQoMCwmY2hhbi0+dW5jb25maWdfZGxjaSkpCisJCQljb250aW51ZTsKKworCQljbGVhcl9iaXQoMCwmY2hhbi0+dW5jb25maWdfZGxjaSk7CisKKwkJaWYgKGNhcmQtPndhbmRldi5zdGF0aW9uID09IFdBTk9QVF9OT0RFKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmNvbmZpZ3VyaW5nIERMQ0kgJWlcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsY2hhbi0+ZGxjaSk7CisJCQlmcl9kZWxldGVfZGxjaShjYXJkLGNoYW4tPmRsY2kpOworCQl9CisJCWNhcmQtPnUuZi5kbGNpX3RvX2Rldl9tYXBbY2hhbi0+ZGxjaV0gPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBzZXR1cF9mcl9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKipza2Jfb3JpZywgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJCSAgIGNoYXIgb3BfbW9kZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnNrYl9vcmlnOworCWZyX2NoYW5uZWxfdCAqY2hhbj1kZXYtPnByaXY7CisKKwlpZiAob3BfbW9kZSA9PSBXQU5QSVBFKXsKKworCQljaGFuLT5mcl9oZWFkZXJbMF09UTkyMl9VSTsKKwkJCisJCXN3aXRjaCAoaHRvbnMoc2tiLT5wcm90b2NvbCkpeworCQkJCisJCWNhc2UgRVRIX1BfSVA6CisJCQljaGFuLT5mcl9oZWFkZXJbMV09TkxQSURfSVA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCQkKKwkJcmV0dXJuIDI7CisJfQorCisJLyogSWYgd2UgYXJlIGluIGJyaWRnaW5nIG1vZGUsIHdlIG11c3QgYXBwbHkKKwkgKiBhbiBFdGhlcm5ldCBoZWFkZXIgKi8KKwlpZiAob3BfbW9kZSA9PSBCUklER0UgfHwgb3BfbW9kZSA9PSBCUklER0VfTk9ERSl7CisKKworCQkvKiBFbmNhcHN1bGF0ZSB0aGUgcGFja2V0IGFzIGEgYnJpZGdlZCBFdGhlcm5ldCBmcmFtZS4gKi8KKyNpZmRlZiBERUJVRworCQlwcmludGsoS0VSTl9JTkZPICIlczogZW5jYXBzdWxhdGluZyBza2IgZm9yIGZyYW1lIHJlbGF5XG4iLCAKKwkJCWRldi0+bmFtZSk7CisjZW5kaWYKKwkJCisJCWNoYW4tPmZyX2hlYWRlclswXSA9IDB4MDM7CisJCWNoYW4tPmZyX2hlYWRlclsxXSA9IDB4MDA7CisJCWNoYW4tPmZyX2hlYWRlclsyXSA9IDB4ODA7CisJCWNoYW4tPmZyX2hlYWRlclszXSA9IDB4MDA7CisJCWNoYW4tPmZyX2hlYWRlcls0XSA9IDB4ODA7CisJCWNoYW4tPmZyX2hlYWRlcls1XSA9IDB4QzI7CisJCWNoYW4tPmZyX2hlYWRlcls2XSA9IDB4MDA7CisJCWNoYW4tPmZyX2hlYWRlcls3XSA9IDB4MDc7CisKKwkJLyogWXVjay4gKi8KKwkJc2tiLT5wcm90b2NvbCA9IEVUSF9QXzgwMl8zOworCQlyZXR1cm4gODsKKworCX0KKwkJCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjaGVja19kbGNpX2NvbmZpZyAoc2RsYV90ICpjYXJkLCBmcl9jaGFubmVsX3QgKmNoYW4pCit7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyPTA7CisJZnJfY29uZl90ICpjb25mPU5VTEw7CisJdW5zaWduZWQgc2hvcnQgZGxjaV9udW0gPSBjaGFuLT5kbGNpOworCWludCBkbGNpX29mZnNldD0wOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCQorCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfUkVBRF9DT05GSUc7CisJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJbWJveC0+Y21kLmRsY2kgPSBkbGNpX251bTsgCQorCisJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQorCWlmIChlcnIgPT0gQ01EX09LKXsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChkZXYgPSBjYXJkLT53YW5kZXYuZGV2OyBkZXY7CisJICAgICBkZXY9Kigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KSkKKwkJc2V0X2NoYW5fc3RhdGUoZGV2LFdBTl9ESVNDT05ORUNURUQpOworCQorCXByaW50ayhLRVJOX0lORk8gIkRMQ0kgJWkgTm90IGNvbmZpZ3VyZWQsIGNvbmZpZ3VyaW5nXG4iLGRsY2lfbnVtKTsKKwkKKwltYm94LT5jbWQuY29tbWFuZCA9IEZSX0NPTU1fRElTQUJMRTsKKwltYm94LT5jbWQubGVuZ3RoID0gMDsKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJaWYgKGVyciAhPSBDTURfT0speworCQlmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpOworCQlyZXR1cm4gMjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJEaXNhYmxlZCBDb21tdW5pY2F0aW9ucyBcbiIpOworCQorCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfUkVBRF9DT05GSUc7CisJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJbWJveC0+Y21kLmRsY2kgPSAwOyAJCisKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCisJaWYgKGVyciAhPSBDTURfT0speworCQlmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpOworCQlyZXR1cm4gMjsKKwl9CisJCisJY29uZiA9IChmcl9jb25mX3QgKiltYm94LT5kYXRhOworCisJZGxjaV9vZmZzZXQ9MDsKKwlmb3IgKGRldiA9IGNhcmQtPndhbmRldi5kZXY7IGRldjsKKwkgICAgIGRldiA9ICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdikpIHsKKwkJZnJfY2hhbm5lbF90ICpjaGFuX3RtcCA9IGRldi0+cHJpdjsKKwkJY29uZi0+ZGxjaVtkbGNpX29mZnNldF0gPSBjaGFuX3RtcC0+ZGxjaTsJCQorCQlkbGNpX29mZnNldCsrOworCX0KKwkKKwlwcmludGsoS0VSTl9JTkZPICJHb3QgRnIgY29uZmlndXJhdGlvbiBCdWZmZXIgTGVuZ3RoIGlzICV4IERsY2kgJWkgRGxjaSBPZmYgJWlcbiIsCisJCW1ib3gtPmNtZC5sZW5ndGgsCisJCW1ib3gtPmNtZC5sZW5ndGggPiAweDIwID8gY29uZi0+ZGxjaVswXSA6IC0xLCAKKwkJZGxjaV9vZmZzZXQgKTsKKwkKKwltYm94LT5jbWQubGVuZ3RoID0gMHgyMCArIGRsY2lfb2Zmc2V0KjI7CisKKwltYm94LT5jbWQuY29tbWFuZCA9IEZSX1NFVF9DT05GSUc7CisJbWJveC0+Y21kLmRsY2kgPSAwOyAKKworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCWlmIChlcnIgIT0gQ01EX09LKXsKKwkJZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KTsKKwkJcmV0dXJuIDI7CisJfQorCisJaW5pdGlhbGl6ZV9yeF90eF9idWZmZXJzIChjYXJkKTsKKworCQorCXByaW50ayhLRVJOX0lORk8gIkNvbmZpZ3VyYWl0b24gU3VjY2VkZWQgZm9yIG5ldyBETENJICVpXG4iLGRsY2lfbnVtKTsKKworCWlmIChmcl9jb21tX2VuYWJsZSAoY2FyZCkpeworCQlyZXR1cm4gMjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBDb21tdW5pY2F0aW9ucyBcbiIpOworCisJZm9yIChkZXYgPSBjYXJkLT53YW5kZXYuZGV2OyBkZXY7CisJICAgICBkZXYgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKSB7CisJCWZyX2NoYW5uZWxfdCAqY2hhbl90bXAgPSBkZXYtPnByaXY7CisJCWZyX2luaXRfZGxjaShjYXJkLGNoYW5fdG1wKTsKKwkJZnJfYWRkX2RsY2koY2FyZCwgY2hhbl90bXAtPmRsY2kpOworCQlmcl9hY3RpdmF0ZV9kbGNpKGNhcmQsIGNoYW5fdG1wLT5kbGNpKTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJFTkQgT0YgQ09ORklHVVJBSVRPTiAlaVxuIixkbGNpX251bSk7CisJCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfcnhfdHhfYnVmZmVycyAoc2RsYV90ICpjYXJkKQoreworCWZyX2J1Zl9pbmZvX3QqIGJ1Zl9pbmZvOworCQorCWlmIChjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkgeworCQorICAgICAgICAgICAgICAgIGJ1Zl9pbmZvID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgRlJfTUJfVkVDVE9SICsKKwkJCUZSNTA4X1JYQkNfT0ZGUyk7CisKKyAgICAgICAgICAgICAgICBjYXJkLT5yeG1iID0gKHZvaWQqKShidWZfaW5mby0+cnNlX25leHQgKyBjYXJkLT5ody5kcG1iYXNlKTsKKworICAgICAgICAgICAgICAgIGNhcmQtPnUuZi5yeG1iX2Jhc2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKShidWZfaW5mby0+cnNlX2Jhc2UgKyBjYXJkLT5ody5kcG1iYXNlKTsgCisKKyAgICAgICAgICAgICAgICBjYXJkLT51LmYucnhtYl9sYXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikoYnVmX2luZm8tPnJzZV9iYXNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChidWZfaW5mby0+cnNlX251bSAtIDEpICogc2l6ZW9mKGZyX3J4X2J1Zl9jdGxfdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+aHcuZHBtYmFzZSk7CisJfWVsc2V7CQorCQlidWZfaW5mbyA9ICh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArIEZSNTA4X1JYQkNfT0ZGUyk7CisKKwkJY2FyZC0+cnhtYiA9ICh2b2lkKikoYnVmX2luZm8tPnJzZV9uZXh0IC0KKwkJCUZSX01CX1ZFQ1RPUiArIGNhcmQtPmh3LmRwbWJhc2UpOworCQkKKwkJY2FyZC0+dS5mLnJ4bWJfYmFzZSA9CisJCQkodm9pZCopKGJ1Zl9pbmZvLT5yc2VfYmFzZSAtCisJCQlGUl9NQl9WRUNUT1IgKyBjYXJkLT5ody5kcG1iYXNlKTsKKwkJCisJCWNhcmQtPnUuZi5yeG1iX2xhc3QgPQorCQkJKHZvaWQqKShidWZfaW5mby0+cnNlX2Jhc2UgKworCQkJKGJ1Zl9pbmZvLT5yc2VfbnVtIC0gMSkgKiBzaXplb2YoZnJfcnhfYnVmX2N0bF90KSAtCisJCQlGUl9NQl9WRUNUT1IgKyBjYXJkLT5ody5kcG1iYXNlKTsKKwl9CisKKwljYXJkLT51LmYucnhfYmFzZSA9IGJ1Zl9pbmZvLT5idWZfYmFzZTsKKwljYXJkLT51LmYucnhfdG9wICA9IGJ1Zl9pbmZvLT5idWZfdG9wOworCisJY2FyZC0+dS5mLnR4X2ludGVycnVwdHNfcGVuZGluZyA9IDA7CisKKwlyZXR1cm47Cit9CisKKwkKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKioqKioqIEVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhX2Z0MS5jIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFfZnQxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzMTI0OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhX2Z0MS5jCkBAIC0wLDAgKzEsMzQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc2RsYV9jaGRsYy5jCVdBTlBJUEUodG0pIE11bHRpcHJvdG9jb2wgV0FOIExpbmsgRHJpdmVyLiBDaXNjbyBIRExDIG1vZHVsZS4KKyoKKyogQXV0aG9yczogCU5lbmFkIENvcmJpYyA8bmNvcmJpY0BzYW5nb21hLmNvbT4KKyoJCUdpZGVvbiBIYWNrICAKKyoKKyogQ29weXJpZ2h0OgkoYykgMTk5NS0xOTk5IFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4KKyoKKyoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogU2VwIDMwLCAxOTk5ICBOZW5hZCBDb3JiaWMgICAgRml4ZWQgZHluYW1pYyBJUCBhbmQgcm91dGUgc2V0dXAuCisqIFNlcCAyMywgMTk5OSAgTmVuYWQgQ29yYmljICAgIEFkZGVkIFNNUCBzdXBwb3J0LCBmaXhlZCB0cmFjaW5nIAorKiBTZXAgMTMsIDE5OTkgIE5lbmFkIENvcmJpYwlTcGxpdCB1cCBQb3J0IDAgYW5kIDEgaW50byBzZXBhcmF0ZSBkZXZpY2VzLgorKiBKdW4gMDIsIDE5OTkgIEdpZGVvbiBIYWNrICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgUzUxNCBhZGFwdGVyLgorKiBPY3QgMzAsIDE5OTgJSmFzcHJlZXQgU2luZ2gJQWRkZWQgU3VwcG9ydCBmb3IgQ0hETEMgQVBJIChIRExDIFNUUkVBTUlORykuCisqIE9jdCAyOCwgMTk5OAlKYXNwcmVldCBTaW5naAlBZGRlZCBTdXBwb3J0IGZvciBEdWFsIFBvcnQgQ0hETEMuCisqIEF1ZyAwNywgMTk5OAlEYXZpZCBGb25nCUluaXRpYWwgdmVyc2lvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpLCBhbmQgb3RoZXIgdXNlZnVsIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIG9mZnNldG9mKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogaW5saW5lIG1lbXNldCgpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkJLyoga21hbGxvYygpLCBrZnJlZSgpICovCisjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5waXBlLmg+CS8qIFdBTlBJUEUgY29tbW9uIHVzZXIgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CS8qIEFSUEhSRF8qIGRlZmluZXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvaW4uaD4JCS8qIHNvY2thZGRyX2luICovCisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgkKKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4JLyogaHRvbnMoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3NkbGFwY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L3NkbGFfY2hkbGMuaD4JCS8qIENIRExDIGZpcm13YXJlIEFQSSBkZWZpbml0aW9ucyAqLworCisvKioqKioqIERlZmluZXMgJiBNYWNyb3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogcmVhc29ucyBmb3IgZW5hYmxpbmcgdGhlIHRpbWVyIGludGVycnVwdCBvbiB0aGUgYWRhcHRlciAqLworI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfVURQICAgCTB4MDAwMQorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFCTB4MDAwMgorIAorI2RlZmluZQlDSERMQ19ERkxUX0RBVEFfTEVOCTE1MDAJCS8qIGRlZmF1bHQgTVRVICovCisjZGVmaW5lIENIRExDX0hEUl9MRU4JCTEKKworI2RlZmluZSBJRkZfUE9JTlRUT1BPSU5UIDB4MTAKKworI2RlZmluZSBXQU5QSVBFIDB4MDAKKyNkZWZpbmUgQVBJCTB4MDEKKyNkZWZpbmUgQ0hETENfQVBJIDB4MDEKKworI2RlZmluZSBQT1JUKHgpICAgKHggPT0gMCA/ICJQUklNQVJZIiA6ICJTRUNPTkRBUlkiICkKKworIAorLyoqKioqKkRhdGEgU3RydWN0dXJlcyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBwbGFjZWQgaW4gdGhlIHByaXZhdGUgZGF0YSBhcmVhIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgorICogVGhlIGNhcmQgc3RydWN0dXJlIHVzZWQgdG8gb2NjdXB5IHRoZSBwcml2YXRlIGFyZWEgYnV0IG5vdyB0aGUgZm9sbG93aW5nIAorICogc3RydWN0dXJlIHdpbGwgaW5jb3Jwb3JhdGUgdGhlIGNhcmQgc3RydWN0dXJlIGFsb25nIHdpdGggQ0hETEMgc3BlY2lmaWMgZGF0YQorICovCisKK3R5cGVkZWYgc3RydWN0IGNoZGxjX3ByaXZhdGVfYXJlYQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZTsKKwlzZGxhX3QJCSpjYXJkOworCWludCAJCVRyYWNpbmdFbmFibGVkOwkJLyogRm9yIGVuYWJsaW5nIFRyYWNpbmcgKi8KKwl1bnNpZ25lZCBsb25nIAljdXJyX3RyYWNlX2FkZHI7CS8qIFVzZWQgZm9yIFRyYWNpbmcgKi8KKwl1bnNpZ25lZCBsb25nIAlzdGFydF90cmFjZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgCWVuZF90cmFjZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgCWJhc2VfYWRkcl90cmFjZV9idWZmZXI7CisJdW5zaWduZWQgbG9uZyAJZW5kX2FkZHJfdHJhY2VfYnVmZmVyOworCXVuc2lnbmVkIHNob3J0IAludW1iZXJfdHJhY2VfZWxlbWVudHM7CisJdW5zaWduZWQgIAlhdmFpbGFibGVfYnVmZmVyX3NwYWNlOworCXVuc2lnbmVkIGxvbmcgCXJvdXRlcl9zdGFydF90aW1lOworCXVuc2lnbmVkIGNoYXIgCXJvdXRlX3N0YXR1czsKKwl1bnNpZ25lZCBjaGFyIAlyb3V0ZV9yZW1vdmVkOworCXVuc2lnbmVkIGxvbmcgCXRpY2tfY291bnRlcjsJCS8qIEZvciA1cyB0aW1lb3V0IGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBsb25nIAlyb3V0ZXJfdXBfdGltZTsKKyAgICAgICAgdTMyICAgICAgICAgICAgIElQX2FkZHJlc3M7CQkvKiBJUCBhZGRyZXNzaW5nICovCisgICAgICAgIHUzMiAgICAgICAgICAgICBJUF9uZXRtYXNrOworCXVuc2lnbmVkIGNoYXIgIG1jOwkJCS8qIE11bGl0Y2FzdCBzdXBwb3J0IG9uL29mZiAqLworCXVuc2lnbmVkIHNob3J0IHVkcF9wa3RfbGd0aDsJCS8qIHVkcCBwYWNrZXQgcHJvY2Vzc2luZyAqLworCWNoYXIgdWRwX3BrdF9zcmM7CisJY2hhciB1ZHBfcGt0X2RhdGFbTUFYX0xHVEhfVURQX01HTlRfUEtUXTsKKwl1bnNpZ25lZCBzaG9ydCB0aW1lcl9pbnRfZW5hYmxlZDsKKwljaGFyIHVwZGF0ZV9jb21tc19zdGF0czsJCS8qIHVwZGF0aW5nIGNvbW1zIHN0YXRzICovCisJLy9GSVhNRTogYWRkIGRyaXZlciBzdGF0cyBhcyBwZXIgZnJhbWUgcmVsYXkhCisKK30gY2hkbGNfcHJpdmF0ZV9hcmVhX3Q7CisKKy8qIFJvdXRlIFN0YXR1cyBvcHRpb25zICovCisjZGVmaW5lIE5PX1JPVVRFCTB4MDAKKyNkZWZpbmUgQUREX1JPVVRFCTB4MDEKKyNkZWZpbmUgUk9VVEVfQURERUQJMHgwMgorI2RlZmluZSBSRU1PVkVfUk9VVEUJMHgwMworCisKKy8qKioqKiogRnVuY3Rpb24gUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV0FOIGxpbmsgZHJpdmVyIGVudHJ5IHBvaW50cy4gVGhlc2UgYXJlIGNhbGxlZCBieSB0aGUgV0FOIHJvdXRlciBtb2R1bGUuICovCitzdGF0aWMgaW50IHdwZnQxX2V4ZWMgKHN0cnVjdCBzZGxhICpjYXJkLCB2b2lkICp1X2NtZCwgdm9pZCAqdV9kYXRhKTsKK3N0YXRpYyBpbnQgY2hkbGNfcmVhZF92ZXJzaW9uIChzZGxhX3QqIGNhcmQsIGNoYXIqIHN0cik7CitzdGF0aWMgaW50IGNoZGxjX2Vycm9yIChzZGxhX3QgKmNhcmQsIGludCBlcnIsIENIRExDX01BSUxCT1hfU1RSVUNUICptYik7CisKKy8qKioqKiogUHVibGljIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENpc2NvIEhETEMgcHJvdG9jb2wgaW5pdGlhbGl6YXRpb24gcm91dGluZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBtYWluIFdBTlBJUEUgbW9kdWxlIGR1cmluZyBzZXR1cC4gIEF0IHRoaXMKKyAqIHBvaW50IGFkYXB0ZXIgaXMgY29tcGxldGVseSBpbml0aWFsaXplZCBhbmQgZmlybXdhcmUgaXMgcnVubmluZy4KKyAqICBvIHJlYWQgZmlybXdhcmUgdmVyc2lvbiAodG8gbWFrZSBzdXJlIGl0J3MgYWxpdmUpCisgKiAgbyBjb25maWd1cmUgYWRhcHRlcgorICogIG8gaW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgb2YgdGhlIGFkYXB0ZXIgZGF0YSBzcGFjZS4KKyAqCisgKiBSZXR1cm46CTAJby5rLgorICoJCTwgMAlmYWlsdXJlLgorICovCitpbnQgd3BmdDFfaW5pdCAoc2RsYV90KiBjYXJkLCB3YW5kZXZfY29uZl90KiBjb25mKQoreworCXVuc2lnbmVkIGNoYXIgcG9ydF9udW07CisJaW50IGVycjsKKworCXVuaW9uCisJCXsKKwkJY2hhciBzdHJbODBdOworCQl9IHU7CisJdm9sYXRpbGUgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iOworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYjE7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gSUQgKi8KKwlpZiAoY29uZi0+Y29uZmlnX2lkICE9IFdBTkNPTkZJR19DSERMQykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCBjb25maWd1cmF0aW9uIElEICV1IVxuIiwKKwkJCQkgIGNhcmQtPmRldm5hbWUsIGNvbmYtPmNvbmZpZ19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFVzZSBwcmltYXJ5IHBvcnQgKi8KKwljYXJkLT51LmMuY29tbV9wb3J0ID0gMDsKKwkKKworCS8qIEluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzICovCisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCQljYXJkLT5tYm94ICA9ICh2b2lkICopIGNhcmQtPmh3LmRwbWJhc2U7CisJfWVsc2V7IAorCQljYXJkLT5tYm94ID0gKHZvaWQgKikgY2FyZC0+aHcuZHBtYmFzZSArIFBSSV9CQVNFX0FERFJfTUJfU1RSVUNUOworCX0KKworCW1iID0gbWIxID0gY2FyZC0+bWJveDsKKworCWlmICghY2FyZC0+Y29uZmlndXJlZCl7CisKKwkJLyogVGhlIGJvYXJkIHdpbGwgcGxhY2UgYW4gJ0knIGluIHRoZSByZXR1cm4gY29kZSB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzCisJICAgCXJlYWR5IHRvIGFjY2VwdCBjb21tYW5kcy4gIFdlIGV4cGVjdCB0aGlzIHRvIGJlIGNvbXBsZXRlZCBpbiBsZXNzCisgICAgICAgICAgIAl0aGFuIDEgc2Vjb25kLiAqLworCisJCXRpbWVvdXQgPSBqaWZmaWVzOworCQl3aGlsZSAobWItPnJldHVybl9jb2RlICE9ICdJJykJLyogV2FpdCAxcyBmb3IgYm9hcmQgdG8gaW5pdGlhbGl6ZSAqLworCQkJaWYgKChqaWZmaWVzIC0gdGltZW91dCkgPiAxKkhaKSBicmVhazsKKworCQlpZiAobWItPnJldHVybl9jb2RlICE9ICdJJykgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSIlczogSW5pdGlhbGl6YXRpb24gbm90IGNvbXBsZXRlZCBieSBhZGFwdGVyXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUGxlYXNlIGNvbnRhY3QgU2FuZ29tYSByZXByZXNlbnRhdGl2ZS5cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwkvKiBSZWFkIGZpcm13YXJlIHZlcnNpb24uICBOb3RlIHRoYXQgd2hlbiBhZGFwdGVyIGluaXRpYWxpemVzLCBpdAorCSAqIGNsZWFycyB0aGUgbWFpbGJveCwgc28gaXQgbWF5IGFwcGVhciB0aGF0IHRoZSBmaXJzdCBjb21tYW5kIHdhcworCSAqIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSB3aGVuIGluIGZhY3QgaXQgd2FzIG1lcmVseSBlcmFzZWQuIFRvIHdvcmsKKwkgKiBhcm91bmQgdGhpcywgd2UgZXhlY3V0ZSB0aGUgZmlyc3QgY29tbWFuZCB0d2ljZS4KKwkgKi8KKworCWlmIChjaGRsY19yZWFkX3ZlcnNpb24oY2FyZCwgdS5zdHIpKQorCQlyZXR1cm4gLUVJTzsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBSdW5uaW5nIEZUMSBDb25maWd1cmF0aW9uIGZpcm13YXJlIHYlc1xuIiwKKwkJY2FyZC0+ZGV2bmFtZSwgdS5zdHIpOyAKKworCWNhcmQtPmlzcgkJCT0gTlVMTDsKKwljYXJkLT5wb2xsCQkJPSBOVUxMOworCWNhcmQtPmV4ZWMJCQk9ICZ3cGZ0MV9leGVjOworCWNhcmQtPndhbmRldi51cGRhdGUJCT0gTlVMTDsKKyAJY2FyZC0+d2FuZGV2Lm5ld19pZgkJPSBOVUxMOworCWNhcmQtPndhbmRldi5kZWxfaWYJCT0gTlVMTDsKKwljYXJkLT53YW5kZXYuc3RhdGUJCT0gV0FOX0RVQUxQT1JUOworCWNhcmQtPndhbmRldi51ZHBfcG9ydCAgIAk9IGNvbmYtPnVkcF9wb3J0OworCisJY2FyZC0+d2FuZGV2Lm5ld19pZl9jbnQgPSAwOworCisJLyogVGhpcyBpcyBmb3IgdGhlIHBvcnRzIGxpbmsgc3RhdGUgKi8KKwljYXJkLT51LmMuc3RhdGUgPSBXQU5fRElTQ09OTkVDVEVEOworCQorCS8qIHJlc2V0IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlICd1cGRhdGUoKScgcHJvYyBoYXMgYmVlbiBjYWxsZWQgKi8KKwljYXJkLT51LmMudXBkYXRlX2NhbGxfY291bnQgPSAwOworCQorCWNhcmQtPndhbmRldi50dGwgPSAweDdGOworCWNhcmQtPndhbmRldi5pbnRlcmZhY2UgPSAwOyAKKworCWNhcmQtPndhbmRldi5jbG9ja2luZyA9IDA7CisKKwlwb3J0X251bSA9IGNhcmQtPnUuYy5jb21tX3BvcnQ7CisKKwkvKiBTZXR1cCBQb3J0IEJwcyAqLworCisgICAgICAgCWNhcmQtPndhbmRldi5icHMgPSAwOworCisJY2FyZC0+d2FuZGV2Lm10dSA9IE1JTl9MR1RIX0NIRExDX0RBVEFfQ0ZHOworCisJLyogU2V0IHVwIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGFyZWEgKi8KKwkvKiBSZWFkIHRoZSBDSERMQyBDb25maWd1cmF0aW9uIGFuZCBvYnRhaW46IAorCSAqCVB0ciB0byBzaGFyZWQgbWVtb3J5IGluZm9yIHN0cnVjdAorICAgICAgICAgKiBVc2UgdGhpcyBwb2ludGVyIHRvIGNhbGN1bGF0ZSB0aGUgdmFsdWUgb2YgY2FyZC0+dS5jLmZsYWdzICEKKyAJICovCisJbWIxLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYjEtPmNvbW1hbmQgPSBSRUFEX0NIRExDX0NPTkZJR1VSQVRJT047CisJZXJyID0gc2RsYV9leGVjKG1iMSkgPyBtYjEtPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJaWYoZXJyICE9IENPTU1BTkRfT0spIHsKKwkJY2hkbGNfZXJyb3IoY2FyZCwgZXJyLCBtYjEpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCl7CisgICAgICAgICAgICAgICAJY2FyZC0+dS5jLmZsYWdzID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAJCSgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWIxLT5kYXRhKS0+CisJCQlwdHJfc2hhcmVkX21lbV9pbmZvX3N0cnVjdCkpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMuZmxhZ3MgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWIxLT5kYXRhKS0+CisJCQlwdHJfc2hhcmVkX21lbV9pbmZvX3N0cnVjdCAlIFNETEFfV0lORE9XU0laRSkpOworCX0KKworCWNhcmQtPndhbmRldi5zdGF0ZSA9IFdBTl9GVDFfUkVBRFk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZUMSBDb25maWcgUmVhZHkgIVxuIixjYXJkLT5kZXZuYW1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdwZnQxX2V4ZWMoc2RsYV90ICpjYXJkLCB2b2lkICp1X2NtZCwgdm9pZCAqdV9kYXRhKQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgbGVuOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkKikmbWJveC0+Y29tbWFuZCwgdV9jbWQsIHNpemVvZihmdDFfZXhlY19jbWRfdCkpKXsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbGVuID0gbWJveC0+YnVmZmVyX2xlbmd0aDsKKworCWlmIChsZW4pIHsKKwkJaWYoIGNvcHlfZnJvbV91c2VyKCh2b2lkKikmbWJveC0+ZGF0YSwgdV9kYXRhLCBsZW4pKXsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCisJLyogZXhlY3V0ZSBjb21tYW5kICovCisJaWYgKCFzZGxhX2V4ZWMobWJveCkpeworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiByZXR1cm4gcmVzdWx0ICovCisJaWYoIGNvcHlfdG9fdXNlcih1X2NtZCwgKHZvaWQqKSZtYm94LT5jb21tYW5kLCBzaXplb2YoZnQxX2V4ZWNfY21kX3QpKSl7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWxlbiA9IG1ib3gtPmJ1ZmZlcl9sZW5ndGg7CisKKwlpZiAobGVuICYmIHVfZGF0YSAmJiBjb3B5X3RvX3VzZXIodV9kYXRhLCAodm9pZCopJm1ib3gtPmRhdGEsIGxlbikpeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgZmlybXdhcmUgY29kZSB2ZXJzaW9uLgorICoJUHV0IGNvZGUgdmVyc2lvbiBhcyBBU0NJSSBzdHJpbmcgaW4gc3RyLiAKKyAqLworc3RhdGljIGludCBjaGRsY19yZWFkX3ZlcnNpb24gKHNkbGFfdCogY2FyZCwgY2hhciogc3RyKQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisJaW50IGxlbjsKKwljaGFyIGVycjsKKwltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJbWItPmNvbW1hbmQgPSBSRUFEX0NIRExDX0NPREVfVkVSU0lPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisKKwlpZihlcnIgIT0gQ09NTUFORF9PSykgeworCQljaGRsY19lcnJvcihjYXJkLGVycixtYik7CisJfQorCWVsc2UgaWYgKHN0cikgeyAgLyogaXMgbm90IG51bGwgKi8KKwkJbGVuID0gbWItPmJ1ZmZlcl9sZW5ndGg7CisJCW1lbWNweShzdHIsIG1iLT5kYXRhLCBsZW4pOworCQlzdHJbbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiAoZXJyKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaXJtd2FyZSBlcnJvciBoYW5kbGVyLgorICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBmaXJtd2FyZSBjb21tYW5kIHJldHVybnMgbm9uLXplcm8KKyAqCXJldHVybiBjb2RlLgorICoKKyAqIFJldHVybiB6ZXJvIGlmIHByZXZpb3VzIGNvbW1hbmQgaGFzIHRvIGJlIGNhbmNlbGxlZC4KKyAqLworc3RhdGljIGludCBjaGRsY19lcnJvciAoc2RsYV90ICpjYXJkLCBpbnQgZXJyLCBDSERMQ19NQUlMQk9YX1NUUlVDVCAqbWIpCit7CisJdW5zaWduZWQgY21kID0gbWItPmNvbW1hbmQ7CisKKwlzd2l0Y2ggKGVycikgeworCisJY2FzZSBDTURfVElNRU9VVDoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY29tbWFuZCAweCUwMlggdGltZWQgb3V0IVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGNtZCk7CisJCWJyZWFrOworCisJY2FzZSBTNTE0X0JPVEhfUE9SVFNfU0FNRV9DTEtfTU9ERToKKwkJaWYoY21kID09IFNFVF9DSERMQ19DT05GSUdVUkFUSU9OKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgIiVzOiBDb25maWd1cmUgYm90aCBwb3J0cyBmb3IgdGhlIHNhbWUgY2xvY2sgc291cmNlXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBjb21tYW5kIDB4JTAyWCByZXR1cm5lZCAweCUwMlghXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgY21kLCBlcnIpOworCX0KKworCXJldHVybiAwOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc2RsYV9wcHAuYyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhX3BwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjFjYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vc2RsYV9wcHAuYwpAQCAtMCwwICsxLDM0MjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBzZGxhX3BwcC5jCVdBTlBJUEUodG0pIE11bHRpcHJvdG9jb2wgV0FOIExpbmsgRHJpdmVyLiBQUFAgbW9kdWxlLgorKgorKiBBdXRob3I6IAlOZW5hZCBDb3JiaWMgPG5jb3JiaWNAc2FuZ29tYS5jb20+CisqCisqIENvcHlyaWdodDoJKGMpIDE5OTUtMjAwMSBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuCisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIEZlYiAyOCwgMjAwMSAgTmVuYWQgQ29yYmljCW8gVXBkYXRlZCBpZl90eF90aW1lb3V0KCkgcm91dGluZSBmb3IgCisqIAkJCQkgIDIuNC5YIGtlcm5lbHMuCisqIE5vdiAyOSwgMjAwMCAgTmVuYWQgQ29yYmljCW8gQWRkZWQgdGhlIDIuNC54IGtlcm5lbCBzdXBwb3J0OgorKiAJCQkJICBnZXRfaXBfYWRkcmVzcygpIGZ1bmN0aW9uIGhhcyBtb3ZlZAorKiAJCQkJICBpbnRvIHRoZSBwcHBfcG9sbCgpIHJvdXRpbmUuIEl0IGNhbm5vdAorKiAJCQkJICBiZSBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQuCisqIE5vdiAwNywgMjAwMCAgTmVuYWQgQ29yYmljCW8gQWRkZWQgc2VjdXJpdHkgZmVhdHVyZXMgZm9yIFVEUCBkZWJ1Z2dpbmc6CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVueSBhbGwgYW5kIHNwZWNpZnkgYWxsb3dlZCByZXF1ZXN0cy4KKyogTWF5IDAyLCAyMDAwICBOZW5hZCBDb3JiaWMJbyBBZGRlZCB0aGUgZHluYW1pYyBpbnRlcmZhY2Ugc2h1dGRvd24KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uIFdoZW4gdGhlIGxpbmsgZ29lcyBkb3duLCB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrIGludGVyZmFjZSBJRkZfVVAgZmxhZyBpcyByZXNldC4KKyogTWFyIDA2LCAyMDAwICBOZW5hZCBDb3JiaWMJbyBCdWcgRml4OiBjb3JydXB0ZWQgbWJveCByZWNvdmVyeS4KKyogRmViIDI1LCAyMDAwICBOZW5hZCBDb3JiaWMgICAgbyBGaXhlZCB0aGUgRlQxIFVEUCBkZWJ1Z2dlciBwcm9ibGVtLgorKiBGZWIgMDksIDIwMDAgIE5lbmFkIENvcmliYyAgICBvIFNodXRkb3duIGJ1ZyBmaXguIHVwZGF0ZSgpIHdhcyBjYWxsZWQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIE5VTEwgZGV2IHBvaW50ZXI6IG5vIGNoZWNrLgorKiBKYW4gMjQsIDIwMDAgIE5lbmFkIENvcmJpYyAgICBvIERpc2FibGVkIHVzZSBvZiBDTUQgY29tcGxldGUgaW50ZXIuCisqIERldiAxNSwgMTk5OSAgTmVuYWQgQ29yYmljICAgIG8gRml4ZWQgdXAgaGVhZGVyIGZpbGVzIGZvciAyLjAuWCBrZXJuZWxzCisqIE9jdCAyNSwgMTk5OSAgTmVuYWQgQ29yYmljICAgIG8gU3VwcG9ydCBmb3IgMi4wLlgga2VybmVscworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmVkIGR5bmFtaWMgcm91dGUgcHJvY2Vzc2luZyBpbnRvIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9sbGluZyByb3V0aW5lLgorKiBPY3QgMDcsIDE5OTkgIE5lbmFkIENvcmJpYyAgICBvIFN1cHBvcnQgZm9yIFM1MTQgUENJIGNhcmQuICAKKyogICAgICAgICAgICAgICBHaWRlb24gSGFjayAgICAgbyBVUEQgYW5kIFVwZGF0ZXMgZXhlY3V0ZWQgdXNpbmcgdGltZXIgaW50ZXJydXB0CisqIFNlcCAxMCwgMTk5OSAgTmVuYWQgQ29yYmljICAgIG8gRml4ZWQgdXAgdGhlIC9wcm9jIHN0YXRpc3RpY3MKKyogSnVsIDIwLCAxOTk5ICBOZW5hZCBDb3JiaWMgICAgbyBSZW1vdmUgdGhlIHBvbGxpbmcgcm91dGluZXMgYW5kIHVzZSAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzIGluc3RlYWQuCisqIFNlcCAxNywgMTk5OAlKYXNwcmVldCBTaW5naAlvIFVwZGF0ZXMgZm9yIDIuMi5YIEtlcm5lbHMuCisqIEF1ZyAxMywgMTk5OAlKYXNwcmVldCBTaW5naAlvIEltcHJvdmVkIExpbmUgVHJhY2luZy4KKyogSnVuIDIyLCAxOTk4CURhdmlkIEZvbmcJbyBBZGRlZCByZW1vdGUgSVAgYWRkcmVzcyBhc3NpZ25tZW50CisqIE1hciAxNSwgMTk5OAlBbGFuIENveAlvIDIuMS44eCBiYXNpYyBwb3J0LgorKiBBcHIgMTYsIDE5OTgJSmFzcHJlZXQgU2luZ2gJbyB1c2luZyBodG9ucygpIGZvciB0aGUgSVBYIHByb3RvY29sLgorKiBEZWMgMDksIDE5OTcJSmFzcHJlZXQgU2luZ2gJbyBBZGRlZCBQQVAgYW5kIENIQVAuCisqCQkJCW8gSW1wbGVtZW50ZWQgbmV3IHJvdXRpbmVzIGxpa2UgCisqCQkJCSAgcHBwX3NldF9pbmJuZF9hdXRoKCksIHBwcF9zZXRfb3V0Ym5kX2F1dGgoKSwKKyoJCQkJICB0b2tlbml6ZSgpIGFuZCBzdHJzdHJpcCgpLgorKiBOb3YgMjcsIDE5OTcJSmFzcHJlZXQgU2luZ2gJbyBBZGRlZCBwcm90ZWN0aW9uIGFnYWluc3QgZW5hYmxpbmcgb2YgaXJxcyAKKyoJCQkJICB3aGlsZSB0aGV5IGhhdmUgYmVlbiBkaXNhYmxlZC4KKyogTm92IDI0LCAxOTk3ICBKYXNwcmVldCBTaW5naCAgbyBGaXhlZCBhbm90aGVyIFJBQ0UgY29uZGl0aW9uIGNhdXNlZCBieQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGluZyBhbmQgZW5hYmxpbmcgb2YgaXJxcy4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBBZGRlZCBuZXcgY291bnRlcnMgZm9yIHN0YXRzIG9uIGRpc2FibGUvZW5hYmxlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJRcy4KKyogTm92IDEwLCAxOTk3CUphc3ByZWV0IFNpbmdoCW8gSW5pdGlhbGl6ZWQgJ3NrYi0+bWFjLnJhdycgdG8gJ3NrYi0+ZGF0YScKKyoJCQkJICBiZWZvcmUgZXZlcnkgbmV0aWZfcngoKS4KKyoJCQkJbyBGcmVlIHVwIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGluIGRlbF9pZigpLgorKiBOb3YgMDcsIDE5OTcJSmFzcHJlZXQgU2luZ2gJbyBDaGFuZ2VkIHRoZSBkZWxheSB0byB6ZXJvIGZvciBMaW5lIHRyYWNpbmcKKyoJCQkJICBjb21tYW5kLgorKiBPY3QgMjAsIDE5OTcgCUphc3ByZWV0IFNpbmdoCW8gQWRkZWQgaG9va3MgaW4gZm9yIFJvdXRlciBVUCB0aW1lLgorKiBPY3QgMTYsIDE5OTcJSmFzcHJlZXQgU2luZ2ggIG8gVGhlIGNyaXRpY2FsIGZsYWcgaXMgdXNlZCB0byBtYWludGFpbiBmbG93CisqCQkJCSAgY29udHJvbCBieSBhdm9pZGluZyBSQUNFIGNvbmRpdGlvbnMuICBUaGUgCisqCQkJCSAgY2xpKCkgYW5kIHJlc3RvcmVfZmxhZ3MoKSBhcmUgdGFrZW4gb3V0LgorKgkJCQkgIEEgbmV3IHN0cnVjdHVyZSwgInBwcF9wcml2YXRlX2FyZWEiLCBpcyBhZGRlZCAKKyoJCQkJICB0byBwcm92aWRlIERyaXZlciBTdGF0aXN0aWNzLiAgIAorKiBKdWwgMjEsIDE5OTcgCUphc3ByZWV0IFNpbmdoCW8gUHJvdGVjdGVkIGNhbGxzIHRvIHNkbGFfcGVlaygpIGJ5IGFkZGluZyAKKyoJCQkJICBzYXZlX2ZsYWdzKCksIGNsaSgpIGFuZCByZXN0b3JlX2ZsYWdzKCkuCisqIEp1bCAwNywgMTk5NwlKYXNwcmVldCBTaW5naCAgbyBBZGRlZCBjb25maWd1cmFibGUgVFRMIGZvciBVRFAgcGFja2V0cworKgkJCQlvIEFkZGVkIGFiaWxpdHkgdG8gZGlzY2FyZCBtdWxpdGNhc3QgYW5kCisqCQkJCSAgYnJvYWNhc3Qgc291cmNlIGFkZHJlc3NlZCBwYWNrZXRzLgorKiBKdW4gMjcsIDE5OTcgCUphc3ByZWV0IFNpbmdoCW8gQWRkZWQgRlQxIG1vbml0b3IgY2FwYWJpbGl0aWVzCisqCQkJCSAgTmV3IGNhc2UgKDB4MjUpIHN0YXRlbWVudCBpbiBpZl9zZW5kIHJvdXRpbmUuCisqCQkJCSAgQWRkZWQgYSBnbG9iYWwgdmFyaWFibGUgckNvdW50IHRvIGtlZXAgdHJhY2sKKyoJCQkJICBvZiBGVDEgc3RhdHVzIGVuYWJsZWQgb24gdGhlIGJvYXJkLgorKiBNYXkgMjIsIDE5OTcJSmFzcHJlZXQgU2luZ2gJbyBBZGRlZCBjaGFuZ2UgaW4gdGhlIFBQUF9TRVRfQ09ORklHIGNvbW1hbmQgZm9yCisqCQkJCTUwOCBjYXJkIHRvIHJlZmxlY3QgY2hhbmdlcyBpbiB0aGUgbmV3IAorKgkJCQlwcHA1MDguc2ZtIGZvciBzdXBwb3J0aW5nOmNvbnRpbm91cyB0cmFuc21pc3Npb24KKyoJCQkJb2YgQ29uZmlndXJlLVJlcXVlc3QgcGFja2V0cyB3aXRob3V0IHJlY2VpdmluZyBhCisqCQkJCXJlcGx5IAkJCQkKKyoJCQkJT1ItZWQgMHgzMDAgdG8gY29uZl9mbGFncyAKKyoJCQkgICAgICAgIG8gQ2hhbmdlZCBjb25uZWN0X3Rtb3V0IGZyb20gOTAwIHRvIDAKKyogTWF5IDIxLCAxOTk3CUphc3ByZWV0IFNpbmdoICBvIEZpeGVkIFVEUCBNYW5hZ2VtZW50IGZvciBtdWx0aXBsZSBib2FyZHMKKyogQXByIDI1LCAxOTk3ICBGYXJoYW4gVGhhd2FyICAgIG8gYWRkZWQgVURQIE1hbmFnZW1lbnQgc3R1ZmYKKyogTWFyIDExLCAxOTk3ICBGYXJoYW4gVGhhd2FyICAgVmVyc2lvbiAzLjEuMQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBmaXhlZCAoKzEpIGJ1ZyBpbiByeF9pbnRyKCkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gY2hhbmdlZCBpZl9zZW5kKCkgdG8gcmV0dXJuIDAgaWYKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FuZGV2LmNyaXRpY2FsKCkgaXMgdHJ1ZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBmcmVlIHNvY2tldCBidWZmZXIgaW4gaWZfc2VuZCgpIGlmCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAwIAorKiBKYW4gMTUsIDE5OTcJR2VuZSBLb3ppbglWZXJzaW9uIDMuMS4wCisqCQkJCSBvIGltcGxlbWVudGVkIGV4ZWMoKSBlbnRyeSBwb2ludAorKiBKYW4gMDYsIDE5OTcJR2VuZSBLb3ppbglJbml0aWFsIHZlcnNpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSwgYW5kIG90aGVyIHVzZWZ1bCBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgkvKiBvZmZzZXRvZigpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogcmV0dXJuIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGlubGluZSBtZW1zZXQoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JLyoga21hbGxvYygpLCBrZnJlZSgpICovCisjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5waXBlLmg+CS8qIFdBTlBJUEUgY29tbW9uIHVzZXIgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CS8qIEFSUEhSRF8qIGRlZmluZXMgKi8KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIGh0b25zKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgkJLyogc29ja2FkZHJfaW4gKi8KKworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NkbGFfcHBwLmg+CQkvKiBQUFAgZmlybXdhcmUgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvc2RsYXNmbS5oPgkJLyogUzUxNCBUeXBlIERlZmluaXRpb24gKi8KKy8qKioqKiogRGVmaW5lcyAmIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lCVBQUF9ERkxUX01UVQkxNTAwCQkvKiBkZWZhdWx0IE1UVSAqLworI2RlZmluZQlQUFBfTUFYX01UVQk0MDAwCQkvKiBtYXhpbXVtIE1UVSAqLworI2RlZmluZSBQUFBfSERSX0xFTgkxCisKKyNkZWZpbmUgTUFYX0lQX0VSUk9SUyAxMDAgCisKKyNkZWZpbmUJQ09OTkVDVF9USU1FT1VUCSg5MCpIWikJCS8qIGxpbmsgY29ubmVjdGlvbiB0aW1lb3V0ICovCisjZGVmaW5lCUhPTERfRE9XTl9USU1FCSg1KkhaKQkJLyogbGluayBob2xkIGRvd24gdGltZSA6IENoYW5nZWQgZnJvbSAzMCB0byA1ICovCisKKy8qIEZvciBoYW5kbGVfSVBYV0FOKCkgKi8KKyNkZWZpbmUgQ1ZIZXhUb0FzY2lpKGIpICgoKHVuc2lnbmVkIGNoYXIpKGIpID4gKHVuc2lnbmVkIGNoYXIpOSkgPyAoKHVuc2lnbmVkIGNoYXIpJ0EnICsgKCh1bnNpZ25lZCBjaGFyKShiKSAtICh1bnNpZ25lZCBjaGFyKTEwKSkgOiAoKHVuc2lnbmVkIGNoYXIpJzAnICsgKHVuc2lnbmVkIGNoYXIpKGIpKSkKKworLyogTWFjcm8gZm9yIGVuYWJsaW5nL2Rpc2FibGluZyBkZWJ1Z2dpbmcgY29tbWVudHMgKi8KKy8vI2RlZmluZSBORVhfREVCVUcKKyNpZmRlZiBORVhfREVCVUcKKyNkZWZpbmUgTkVYX1BSSU5USyhmb3JtYXQsIGEuLi4pIHByaW50ayhmb3JtYXQsICMjIGEpCisjZWxzZQorI2RlZmluZSBORVhfUFJJTlRLKGZvcm1hdCwgYS4uLikKKyNlbmRpZiAvKiBORVhfREVCVUcgKi8gCisKKyNkZWZpbmUgRENEKGEpICAgKCBhICYgMHgwOCA/ICJISUdIIiA6ICJMT1ciICkKKyNkZWZpbmUgQ1RTKGEpICAgKCBhICYgMHgyMCA/ICJISUdIIiA6ICJMT1ciICkKKyNkZWZpbmUgTENQKGEpICAgKCBhID09IDB4MDkgPyAiT1BFTiIgOiAiQ0xPU0VEIiApCisjZGVmaW5lIElQKGEpICAgICggYSA9PSAweDA5ID8gIkVOQUJMRUQiIDogIkRJU0FCTEVEIiApCisKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1VQREFURSAgCTB4MDEKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1BQUF9FVkVOVAkweDAyCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VRFAJCTB4MDQKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX0NPTkZJRwkJMHgyMAorCisvKiBTZXQgQ29uZmlndXJhdG9uIENvbW1hbmQgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgUEVSQ0VOVF9UWF9CVUZGCQkJNjAKKyNkZWZpbmUgVElNRV9CRVRXRUVOX0NPTkZfUkVRICAJCTMwCisjZGVmaW5lIFRJTUVfQkVUV0VFTl9QQVBfQ0hBUF9SRVEJMzAKKyNkZWZpbmUgV0FJVF9QQVBfQ0hBUF9XSVRIT1VUX1JFUExZICAgICAzMDAKKyNkZWZpbmUgV0FJVF9BRlRFUl9EQ0RfQ1RTX0xPVyAgICAgICAgICA1CisjZGVmaW5lIFRJTUVfRENEX0NUU19MT1dfQUZURVJfTE5LX0RPV04gMTAKKyNkZWZpbmUgV0FJVF9EQ0RfSElHSF9BRlRFUl9FTkFCTEVfQ09NTSA5MDAKKyNkZWZpbmUgTUFYX0NPTkZfUkVRX1dJVEhPVVRfUkVQTFkgICAgICAxMAorI2RlZmluZSBNQVhfVEVSTV9SRVFfV0lUSE9VVF9SRVBMWSAgICAgIDIKKyNkZWZpbmUgTlVNX0NPTkZfTkFLX1dJVEhPVVRfUkVQTFkgICAgICA1CisjZGVmaW5lIE5VTV9BVVRIX1JFUV9XSVRIT1VUX1JFUExZICAgICAgMTAKKworI2RlZmluZSBFTkRfT0ZGU0VUIDB4MUYwCisKKworLyoqKioqKkRhdGEgU3RydWN0dXJlcyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBwbGFjZWQgaW4gdGhlIHByaXZhdGUgZGF0YSBhcmVhIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgorICogVGhlIGNhcmQgc3RydWN0dXJlIHVzZWQgdG8gb2NjdXB5IHRoZSBwcml2YXRlIGFyZWEgYnV0IG5vdyB0aGUgZm9sbG93aW5nIAorICogc3RydWN0dXJlIHdpbGwgaW5jb3Jwb3JhdGUgdGhlIGNhcmQgc3RydWN0dXJlIGFsb25nIHdpdGggUFBQIHNwZWNpZmljIGRhdGEKKyAqLworICAKK3R5cGVkZWYgc3RydWN0IHBwcF9wcml2YXRlX2FyZWEKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmU7CisJc2RsYV90KiBjYXJkOwkKKwl1bnNpZ25lZCBsb25nIHJvdXRlcl9zdGFydF90aW1lOwkvKnJvdXRlciBzdGFydCB0aW1lIGluIHNlYyAqLworCXVuc2lnbmVkIGxvbmcgdGlja19jb3VudGVyOwkJLyp1c2VkIGZvciA1IHNlY29uZCBjb3VudGVyKi8KKwl1bnNpZ25lZCBtYzsJCQkJLyptdWx0aWNhc3Qgc3VwcG9ydCBvbiBvciBvZmYqLworCXVuc2lnbmVkIGNoYXIgZW5hYmxlX0lQWDsKKwl1bnNpZ25lZCBsb25nIG5ldHdvcmtfbnVtYmVyOworCXVuc2lnbmVkIGNoYXIgcGFwOworCXVuc2lnbmVkIGNoYXIgY2hhcDsKKwl1bnNpZ25lZCBjaGFyIHN5c25hbWVbMzFdOwkJLyogc3lzdGVtIG5hbWUgZm9yIGluLWJuZCBhdXRoKi8KKwl1bnNpZ25lZCBjaGFyIHVzZXJpZFs1MTFdOwkJLyogbGlzdCBvZiB1c2VyIGlkcyAqLworCXVuc2lnbmVkIGNoYXIgcGFzc3dkWzUxMV07CQkvKiBsaXN0IG9mIHBhc3N3b3JkcyAqLworCXVuc2lnbmVkIHByb3RvY29sOwkJCS8qIFNLQiBQcm90b2NvbCAqLworCXUzMiBpcF9sb2NhbDsJCQkJLyogTG9jYWwgSVAgQWRkcmVzcyAqLworCXUzMiBpcF9yZW1vdGU7CQkJCS8qIHJlbW90ZSBJUCBBZGRyZXNzICovCisKKwl1MzIgaXBfbG9jYWxfdG1wOworCXUzMiBpcF9yZW1vdGVfdG1wOworCQorCXVuc2lnbmVkIGNoYXIgdGltZXJfaW50X2VuYWJsZWQ7CS8qIFdobyBlbmFibGVkIHRoZSB0aW1lciBpbnRlciovCisJdW5zaWduZWQgY2hhciB1cGRhdGVfY29tbXNfc3RhdHM7CS8qIFVzZWQgYnkgdXBkYXRlIGZ1bmN0aW9uICovCisJdW5zaWduZWQgbG9uZyBjdXJyX3RyYWNlX2FkZHI7CQkvKiBUcmFjZSBpbmZvcm1hdGlvbiAqLworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdHJhY2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGVuZF90cmFjZV9hZGRyOworCisJdW5zaWduZWQgY2hhciBpbnRlcmZhY2VfZG93bjsJCS8qIEJyaW5kIGRvd24gaW50ZXJmYWNlIHdoZW4gY2hhbm5lbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvZXMgZG93biAqLworCXVuc2lnbmVkIGxvbmcgY29uZmlnX3dhaXRfdGltZW91dDsJLyogQWZ0ZXIgaWZfb3BlbigpIGlmIGluIGR5bmFtaWMgaWYgbW9kZSwKKwkJCQkJCSAgIHdhaXQgYSBmZXcgc2Vjb25kcyBiZWZvcmUgY29uZmlndXJpbmcgKi8KKwkKKwl1bnNpZ25lZCBzaG9ydCB1ZHBfcGt0X2xndGg7CisJY2hhciAgdWRwX3BrdF9zcmM7CisgICAgICAJY2hhciAgdWRwX3BrdF9kYXRhW01BWF9MR1RIX1VEUF9NR05UX1BLVF07CisKKwkvKiBQUFAgc3BlY2lmaWMgc3RhdGlzdGljcyAqLworCisJaWZfc2VuZF9zdGF0X3QgaWZfc2VuZF9zdGF0OworCXJ4X2ludHJfc3RhdF90IHJ4X2ludHJfc3RhdDsKKwlwaXBlX21nbXRfc3RhdF90IHBpcGVfbWdtdF9zdGF0OworCisJdW5zaWduZWQgbG9uZyByb3V0ZXJfdXBfdGltZTsgCisKKwkvKiBQb2xsaW5nIHdvcmsgcXVldWUgZW50cnkuIEVhY2ggaW50ZXJmYWNlCisgICAgICAgICAqIGhhcyBpdHMgb3duIHdvcmsgcXVldWUgZW50cnksIHdoaWNoIGlzIHVzZWQKKyAgICAgICAgICogdG8gZGVmZXIgZXZlbnRzIGZyb20gdGhlIGludGVycnVwdCAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBwb2xsX3dvcms7CisJc3RydWN0IHRpbWVyX2xpc3QgcG9sbF9kZWxheV90aW1lcjsKKworCXU4IGdhdGV3YXk7CisJdTggY29uZmlnX3BwcDsKKwl1OCBpcF9lcnJvcjsKKwkKK31wcHBfcHJpdmF0ZV9hcmVhX3Q7CisKKy8qIHZhcmlhYmxlIGZvciBrZWVwaW5nIHRyYWNrIG9mIGVuYWJsaW5nL2Rpc2FibGluZyBGVDEgbW9uaXRvciBzdGF0dXMgKi8KK3N0YXRpYyBpbnQgckNvdW50ID0gMDsKKworZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKKworLyoqKioqKiBGdW5jdGlvbiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFdBTiBsaW5rIGRyaXZlciBlbnRyeSBwb2ludHMuIFRoZXNlIGFyZSBjYWxsZWQgYnkgdGhlIFdBTiByb3V0ZXIgbW9kdWxlLiAqLworc3RhdGljIGludCB1cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldik7CitzdGF0aWMgaW50IG5ld19pZihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgIHdhbmlmX2NvbmZfdCAqY29uZik7CitzdGF0aWMgaW50IGRlbF9pZihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogV0FOUElQRS1zcGVjaWZpYyBlbnRyeSBwb2ludHMgKi8KK3N0YXRpYyBpbnQgd3BwX2V4ZWMgKHN0cnVjdCBzZGxhICpjYXJkLCB2b2lkICp1X2NtZCwgdm9pZCAqdV9kYXRhKTsKKworLyogTmV0d29yayBkZXZpY2UgaW50ZXJmYWNlICovCitzdGF0aWMgaW50IGlmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlmX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpZl9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCAKKwkJICAgICB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGxlbik7CisKK3N0YXRpYyB2b2lkIGlmX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgaWZfcmVidWlsZF9oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlmX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpZl9zZW5kKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKKy8qIFBQUCBmaXJtd2FyZSBpbnRlcmZhY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IHBwcF9yZWFkX3ZlcnNpb24oc2RsYV90ICpjYXJkLCBjaGFyICpzdHIpOworc3RhdGljIGludCBwcHBfc2V0X291dGJuZF9hdXRoKHNkbGFfdCAqY2FyZCwgcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhKTsKK3N0YXRpYyBpbnQgcHBwX3NldF9pbmJuZF9hdXRoKHNkbGFfdCAqY2FyZCwgcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhKTsKK3N0YXRpYyBpbnQgcHBwX2NvbmZpZ3VyZShzZGxhX3QgKmNhcmQsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBwcHBfc2V0X2ludHJfbW9kZShzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGNoYXIgbW9kZSk7CitzdGF0aWMgaW50IHBwcF9jb21tX2VuYWJsZShzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCBwcHBfY29tbV9kaXNhYmxlKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgaW50IHBwcF9jb21tX2Rpc2FibGVfc2h1dGRvd24oc2RsYV90ICpjYXJkKTsKK3N0YXRpYyBpbnQgcHBwX2dldF9lcnJfc3RhdHMoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyBpbnQgcHBwX3NlbmQoc2RsYV90ICpjYXJkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIHByb3RvKTsKK3N0YXRpYyBpbnQgcHBwX2Vycm9yKHNkbGFfdCAqY2FyZCwgaW50IGVyciwgcHBwX21ib3hfdCAqbWIpOworCitzdGF0aWMgdm9pZCB3cHBfaXNyKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgdm9pZCByeF9pbnRyKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgdm9pZCBldmVudF9pbnRyKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgdm9pZCB0aW1lcl9pbnRyKHNkbGFfdCAqY2FyZCk7CisKKy8qIEJhY2tncm91bmQgcG9sbGluZyByb3V0aW5lcyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19yb3V0ZShzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgcmV0cmlnZ2VyX2NvbW0oc2RsYV90ICpjYXJkKTsKKworLyogTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgcmVhZF9pbmZvKCBzZGxhX3QgKmNhcmQgKTsKK3N0YXRpYyBpbnQgcmVhZF9jb25uZWN0aW9uX2luZm8gKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgdm9pZCByZW1vdmVfcm91dGUoIHNkbGFfdCAqY2FyZCApOworc3RhdGljIGludCBjb25maWc1MDgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHNob3dfZGlzY19jYXVzZShzZGxhX3QgKiBjYXJkLCB1bnNpZ25lZCBjYXVzZSk7CitzdGF0aWMgaW50IHJlcGx5X3VkcCggdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG1ib3hfbGVuICk7CitzdGF0aWMgdm9pZCBwcm9jZXNzX3VkcF9tZ210X3BrdChzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAorCQkJCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSk7CitzdGF0aWMgdm9pZCBpbml0X3BwcF90eF9yeF9idWZmKCBzZGxhX3QgKmNhcmQgKTsKK3N0YXRpYyBpbnQgaW50cl90ZXN0KCBzZGxhX3QgKmNhcmQgKTsKK3N0YXRpYyBpbnQgdWRwX3BrdF90eXBlKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiICwgc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIGluaXRfcHBwX3ByaXZfc3RydWN0KCBwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEpOworc3RhdGljIHZvaWQgaW5pdF9nbG9iYWxfc3RhdGlzdGljcyggc2RsYV90ICpjYXJkICk7CitzdGF0aWMgaW50IHRva2VuaXplKGNoYXIgKnN0ciwgY2hhciAqKnRva2Vucyk7CitzdGF0aWMgY2hhciogc3Ryc3RyaXAoY2hhciAqc3RyLCBjaGFyICpzKTsKK3N0YXRpYyBpbnQgY2hrX2JjYXN0X21jYXN0X2FkZHIoc2RsYV90KiBjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkJCXN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgaW50IGNvbmZpZ19wcHAgKHNkbGFfdCAqKTsKK3N0YXRpYyB2b2lkIHBwcF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdHJpZ2dlcl9wcHBfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHBwcF9wb2xsX2RlbGF5ICh1bnNpZ25lZCBsb25nIGRldl9wdHIpOworCisKK3N0YXRpYyBpbnQgUmVhZF9jb25uZWN0aW9uX2luZm87CitzdGF0aWMgaW50IEludHJfdGVzdF9jb3VudGVyOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGF2YWlsYWJsZV9idWZmZXJfc3BhY2U7CisKKworLyogSVBYIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgc3dpdGNoX25ldF9udW1iZXJzKHVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQsIHVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXIsIAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgaW5jb21pbmcpOworc3RhdGljIGludCBoYW5kbGVfSVBYV0FOKHVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQsIGNoYXIgKmRldm5hbWUsIHVuc2lnbmVkIGNoYXIgZW5hYmxlX1BYLCAKKwkJCSB1bnNpZ25lZCBsb25nIG5ldHdvcmtfbnVtYmVyLCB1bnNpZ25lZCBzaG9ydCBwcm90byk7CisKKy8qIExvY2sgRnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBzNTA4X2xvY2sgKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKTsKK3N0YXRpYyB2b2lkIHM1MDhfdW5sb2NrIChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncyk7CisKK3N0YXRpYyBpbnQgc3RvcmVfdWRwX21nbXRfcGt0KGNoYXIgdWRwX3BrdF9zcmMsIHNkbGFfdCogY2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBwX3ByaXZhdGVfYXJlYV90KiBwcHBfcHJpdl9hcmVhICk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgY2FsY19jaGVja3N1bSAoY2hhciAqZGF0YSwgaW50IGxlbik7CitzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbW0gKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgaW50IGRldGVjdF9hbmRfZml4X3R4X2J1ZyAoc2RsYV90ICpjYXJkKTsKKworLyoqKioqKiBQdWJsaWMgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUFBQIHByb3RvY29sIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBXQU5QSVBFIG1vZHVsZSBkdXJpbmcgc2V0dXAuICBBdCB0aGlzCisgKiBwb2ludCBhZGFwdGVyIGlzIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYW5kIGZpcm13YXJlIGlzIHJ1bm5pbmcuCisgKiAgbyByZWFkIGZpcm13YXJlIHZlcnNpb24gKHRvIG1ha2Ugc3VyZSBpdCdzIGFsaXZlKQorICogIG8gY29uZmlndXJlIGFkYXB0ZXIKKyAqICBvIGluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIG9mIHRoZSBhZGFwdGVyIGRhdGEgc3BhY2UuCisgKgorICogUmV0dXJuOgkwCW8uay4KKyAqCQk8IDAJZmFpbHVyZS4KKyAqLworaW50IHdwcF9pbml0KHNkbGFfdCAqY2FyZCwgd2FuZGV2X2NvbmZfdCAqY29uZikKK3sKKwlwcHBfZmxhZ3NfdCAqZmxhZ3M7CisJdW5pb24KKwl7CisJCWNoYXIgc3RyWzgwXTsKKwl9IHU7CisKKwkvKiBWZXJpZnkgY29uZmlndXJhdGlvbiBJRCAqLworCWlmIChjb25mLT5jb25maWdfaWQgIT0gV0FOQ09ORklHX1BQUCkgeworCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgY29uZmlndXJhdGlvbiBJRCAldSFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjb25mLT5jb25maWdfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KKworCS8qIEluaXRpYWxpemUgbWlzY2VsbGFuZW91cyBwb2ludGVycyB0byBzdHJ1Y3R1cmVzIG9uIHRoZSBhZGFwdGVyICovCisJc3dpdGNoIChjYXJkLT5ody50eXBlKSB7CisKKwkJY2FzZSBTRExBX1M1MDg6CisJCQljYXJkLT5tYm94ID0odm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKyBQUFA1MDhfTUJfT0ZGUyk7CisJCQljYXJkLT5mbGFncz0odm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKyBQUFA1MDhfRkxHX09GRlMpOworCQkJYnJlYWs7CisJCQorCQljYXNlIFNETEFfUzUxNDoKKwkJCWNhcmQtPm1ib3ggPSh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArIFBQUDUxNF9NQl9PRkZTKTsKKwkJCWNhcmQtPmZsYWdzPSh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArIFBQUDUxNF9GTEdfT0ZGUyk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisJZmxhZ3MgPSBjYXJkLT5mbGFnczsKKworCS8qIFJlYWQgZmlybXdhcmUgdmVyc2lvbi4gIE5vdGUgdGhhdCB3aGVuIGFkYXB0ZXIgaW5pdGlhbGl6ZXMsIGl0CisJICogY2xlYXJzIHRoZSBtYWlsYm94LCBzbyBpdCBtYXkgYXBwZWFyIHRoYXQgdGhlIGZpcnN0IGNvbW1hbmQgd2FzCisJICogZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IHdoZW4gaW4gZmFjdCBpdCB3YXMgbWVyZWx5IGVyYXNlZC4gVG8gd29yaworCSAqIGFyb3VuZCB0aGlzLCB3ZSBleGVjdXRlIHRoZSBmaXJzdCBjb21tYW5kIHR3aWNlLgorCSAqLworCWlmIChwcHBfcmVhZF92ZXJzaW9uKGNhcmQsIE5VTEwpIHx8IHBwcF9yZWFkX3ZlcnNpb24oY2FyZCwgdS5zdHIpKQorCQlyZXR1cm4gLUVJTzsKKwkKKwlwcmludGsoS0VSTl9JTkZPICIlczogcnVubmluZyBQUFAgZmlybXdhcmUgdiVzXG4iLGNhcmQtPmRldm5hbWUsIHUuc3RyKTsgCisJLyogQWRqdXN0IGNvbmZpZ3VyYXRpb24gYW5kIHNldCBkZWZhdWx0cyAqLworCWNhcmQtPndhbmRldi5tdHUgPSAoY29uZi0+bXR1KSA/CisJCW1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+bXR1LCBQUFBfTUFYX01UVSkgOiBQUFBfREZMVF9NVFU7CisKKwljYXJkLT53YW5kZXYuYnBzCT0gY29uZi0+YnBzOworCWNhcmQtPndhbmRldi5pbnRlcmZhY2UJPSBjb25mLT5pbnRlcmZhY2U7CisJY2FyZC0+d2FuZGV2LmNsb2NraW5nCT0gY29uZi0+Y2xvY2tpbmc7CisJY2FyZC0+d2FuZGV2LnN0YXRpb24JPSBjb25mLT5zdGF0aW9uOworCWNhcmQtPmlzcgkJPSAmd3BwX2lzcjsKKwljYXJkLT5wb2xsCQk9IE5VTEw7IAorCWNhcmQtPmV4ZWMJCT0gJndwcF9leGVjOworCWNhcmQtPndhbmRldi51cGRhdGUJPSAmdXBkYXRlOworCWNhcmQtPndhbmRldi5uZXdfaWYJPSAmbmV3X2lmOworCWNhcmQtPndhbmRldi5kZWxfaWYJPSAmZGVsX2lmOworICAgICAgICBjYXJkLT53YW5kZXYudWRwX3BvcnQgICA9IGNvbmYtPnVkcF9wb3J0OworCWNhcmQtPndhbmRldi50dGwJPSBjb25mLT50dGw7CisJY2FyZC0+d2FuZGV2LnN0YXRlICAgICAgPSBXQU5fRElTQ09OTkVDVEVEOworCWNhcmQtPmRpc2FibGVfY29tbQk9ICZkaXNhYmxlX2NvbW07CisJY2FyZC0+aXJxX2Rpc19pZl9zZW5kX2NvdW50ID0gMDsKKyAgICAgICAgY2FyZC0+aXJxX2Rpc19wb2xsX2NvdW50ID0gMDsKKwljYXJkLT51LnAuYXV0aGVudGljYXRvciA9IGNvbmYtPnUucHBwLmF1dGhlbnRpY2F0b3I7CisJY2FyZC0+dS5wLmlwX21vZGUgCT0gY29uZi0+dS5wcHAuaXBfbW9kZSA/CisJCQkJIGNvbmYtPnUucHBwLmlwX21vZGUgOiBXQU5PUFRfUFBQX1NUQVRJQzsKKyAgICAgICAgY2FyZC0+VHJhY2luZ0VuYWJsZWQgICAgPSAwOworCVJlYWRfY29ubmVjdGlvbl9pbmZvICAgID0gMTsKKworCS8qIGluaXRpYWxpemUgZ2xvYmFsIHN0YXRpc3RpY3MgKi8KKwlpbml0X2dsb2JhbF9zdGF0aXN0aWNzKCBjYXJkICk7CisKKworCisJaWYgKCFjYXJkLT5jb25maWd1cmVkKXsKKwkJaW50IGVycjsKKworCQlJbnRyX3Rlc3RfY291bnRlciA9IDA7CisJCWVyciA9IGludHJfdGVzdChjYXJkKTsKKworCQlpZihlcnIgfHwgKEludHJfdGVzdF9jb3VudGVyIDwgTUFYX0lOVFJfVEVTVF9DT1VOVEVSKSkgeworCQkJcHJpbnRrKCIlczogSW50ZXJydXB0IFRlc3QgRmFpbGVkLCBDb3VudGVyOiAlaVxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSwgSW50cl90ZXN0X2NvdW50ZXIpOworCQkJcHJpbnRrKCAiJXM6IFBsZWFzZSBjaG9vc2UgYW5vdGhlciBpbnRlcnJ1cHRcbiIsY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVycnVwdCBUZXN0IFBhc3NlZCwgQ291bnRlcjogJWlcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSwgSW50cl90ZXN0X2NvdW50ZXIpOworCQljYXJkLT5jb25maWd1cmVkID0gMTsKKwl9CisKKwlwcHBfc2V0X2ludHJfbW9kZShjYXJkLCBQUFBfSU5UUl9USU1FUik7IAorCisJLyogVHVybiBvZmYgdGhlIHRyYW5zbWl0IGFuZCB0aW1lciBpbnRlcnJ1cHQgKi8KKwlmbGFncy0+aW1hc2sgJj0gflBQUF9JTlRSX1RJTUVSOworCisJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKiBXQU4gRGV2aWNlIERyaXZlciBFbnRyeSBQb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVcGRhdGUgZGV2aWNlIHN0YXR1cyAmIHN0YXRpc3RpY3MuCisgKi8KK3N0YXRpYyBpbnQgdXBkYXRlKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYpCit7CisJc2RsYV90KiBjYXJkID0gd2FuZGV2LT5wcml2YXRlOworIAlzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworICAgICAgICB2b2xhdGlsZSBwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWE7CisJcHBwX2ZsYWdzX3QgKmZsYWdzID0gY2FyZC0+ZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmICgod2FuZGV2ID09IE5VTEwpIHx8ICh3YW5kZXYtPnByaXZhdGUgPT0gTlVMTCkpCisJCXJldHVybiAtRUZBVUxUOworCQorCWlmICh3YW5kZXYtPnN0YXRlID09IFdBTl9VTkNPTkZJR1VSRUQpCisJCXJldHVybiAtRU5PREVWOworCQorCS8qIFNodXRkb3duIGJ1ZyBmaXguIFRoaXMgZnVuY3Rpb24gY2FuIGJlCisgICAgICAgICAqIGNhbGxlZCB3aXRoIE5VTEwgZGV2IHBvaW50ZXIgZHVyaW5nCisgICAgICAgICAqIHNodXRkb3duIAorCSAqLworCWlmICgoZGV2PWNhcmQtPndhbmRldi5kZXYpID09IE5VTEwpeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKHBwcF9wcml2X2FyZWE9ZGV2LT5wcml2KSA9PSBOVUxMKXsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCQorCXBwcF9wcml2X2FyZWEtPnVwZGF0ZV9jb21tc19zdGF0cyA9IDI7CisJcHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgfD0gVE1SX0lOVF9FTkFCTEVEX1VQREFURTsKKwlmbGFncy0+aW1hc2sgfD0gUFBQX0lOVFJfVElNRVI7CQorCQorCS8qIHdhaXQgYSBtYXhpbXVtIG9mIDEgc2Vjb25kIGZvciB0aGUgc3RhdGlzdGljcyB0byBiZSB1cGRhdGVkICovIAorICAgICAgICB0aW1lb3V0ID0gamlmZmllczsKKyAgICAgICAgZm9yKDs7KSB7CisJCWlmKHBwcF9wcml2X2FyZWEtPnVwZGF0ZV9jb21tc19zdGF0cyA9PSAwKXsKKwkJCWJyZWFrOworCQl9CisgICAgICAgICAgICAgICAgaWYgKChqaWZmaWVzIC0gdGltZW91dCkgPiAoMSAqIEhaKSl7CisgICAgCQkJcHBwX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID0gMDsKKyAJCQlwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPQorCQkJCX5UTVJfSU5UX0VOQUJMRURfVVBEQVRFOyAKKyAJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorICAgICAgICB9CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDcmVhdGUgbmV3IGxvZ2ljYWwgY2hhbm5lbC4KKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHJvdXRlciB3aGVuIFJPVVRFUl9JRk5FVyBJT0NUTCBpcyBiZWluZworICogaGFuZGxlZC4KKyAqIG8gcGFyc2UgbWVkaWEtIGFuZCBoYXJkd2FyZS1zcGVjaWZpYyBjb25maWd1cmF0aW9uCisgKiBvIG1ha2Ugc3VyZSB0aGF0IGEgbmV3IGNoYW5uZWwgY2FuIGJlIGNyZWF0ZWQKKyAqIG8gYWxsb2NhdGUgcmVzb3VyY2VzLCBpZiBuZWNlc3NhcnkKKyAqIG8gcHJlcGFyZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHJlZ2lzdGFyYXRpb24uCisgKgorICogUmV0dXJuOgkwCW8uay4KKyAqCQk8IDAJZmFpbHVyZSAoY2hhbm5lbCB3aWxsIG5vdCBiZSBjcmVhdGVkKQorICovCitzdGF0aWMgaW50IG5ld19pZihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgIHdhbmlmX2NvbmZfdCAqY29uZikKK3sKKwlzZGxhX3QgKmNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisJcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhOworCisJaWYgKHdhbmRldi0+bmRldikKKwkJcmV0dXJuIC1FRVhJU1Q7CisJCisKKwlwcmludGsoS0VSTl9JTkZPICIlczogQ29uZmlndXJpbmcgSW50ZXJmYWNlOiAlc1xuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGNvbmYtPm5hbWUpOworCisJaWYgKChjb25mLT5uYW1lWzBdID09ICdcMCcpIHx8IChzdHJsZW4oY29uZi0+bmFtZSkgPiBXQU5fSUZOQU1FX1NaKSkgeworCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnZhbGlkIGludGVyZmFjZSBuYW1lIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHByaXZhdGUgZGF0YSAqLworCXBwcF9wcml2X2FyZWEgPSBrbWFsbG9jKHNpemVvZihwcHBfcHJpdmF0ZV9hcmVhX3QpLCBHRlBfS0VSTkVMKTsKKwkKKwlpZiggcHBwX3ByaXZfYXJlYSA9PSBOVUxMICkKKwkJcmV0dXJuCS1FTk9NRU07CisJCisJbWVtc2V0KHBwcF9wcml2X2FyZWEsIDAsIHNpemVvZihwcHBfcHJpdmF0ZV9hcmVhX3QpKTsKKwkKKwlwcHBfcHJpdl9hcmVhLT5jYXJkID0gY2FyZDsgCisJCisJLyogaW5pdGlhbGl6ZSBkYXRhICovCisJc3RyY3B5KGNhcmQtPnUucC5pZl9uYW1lLCBjb25mLT5uYW1lKTsKKworCS8qIGluaXRpYWxpemUgZGF0YSBpbiBwcHBfcHJpdmF0ZV9hcmVhIHN0cnVjdHVyZSAqLworCQorCWluaXRfcHBwX3ByaXZfc3RydWN0KCBwcHBfcHJpdl9hcmVhICk7CisKKwlwcHBfcHJpdl9hcmVhLT5tYyA9IGNvbmYtPm1jOworCXBwcF9wcml2X2FyZWEtPnBhcCA9IGNvbmYtPnBhcDsKKwlwcHBfcHJpdl9hcmVhLT5jaGFwID0gY29uZi0+Y2hhcDsKKworCS8qIE9wdGlvbiB0byBicmluZyBkb3duIHRoZSBpbnRlcmZhY2Ugd2hlbiAKKyAgICAgICAgICogdGhlIGxpbmsgZ29lcyBkb3duICovCisJaWYgKGNvbmYtPmlmX2Rvd24peworCQlzZXRfYml0KERZTl9PUFRfT04sJnBwcF9wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKTsKKwkJcHJpbnRrKCIlczogRHluYW1pYyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBlbmFibGVkXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJfSAKKworCS8qIElmIG5vIHVzZXIgaWRzIGFyZSBzcGVjaWZpZWQgKi8KKwlpZighc3RybGVuKGNvbmYtPnVzZXJpZCkgJiYgKHBwcF9wcml2X2FyZWEtPnBhcHx8cHBwX3ByaXZfYXJlYS0+Y2hhcCkpeworCQlrZnJlZShwcHBfcHJpdl9hcmVhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSWYgbm8gcGFzc3dvcmRzIGFyZSBzcGVjaWZpZWQgKi8KKwlpZighc3RybGVuKGNvbmYtPnBhc3N3ZCkgJiYgKHBwcF9wcml2X2FyZWEtPnBhcHx8cHBwX3ByaXZfYXJlYS0+Y2hhcCkpeworCQlrZnJlZShwcHBfcHJpdl9hcmVhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYoc3RybGVuKGNvbmYtPnN5c25hbWUpID4gMzEpeworCQlrZnJlZShwcHBfcHJpdl9hcmVhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSWYgbm8gc3lzdGVtIG5hbWUgaXMgc3BlY2lmaWVkICovCisJaWYoIXN0cmxlbihjb25mLT5zeXNuYW1lKSAmJiAoY2FyZC0+dS5wLmF1dGhlbnRpY2F0b3IpKXsKKwkJa2ZyZWUocHBwX3ByaXZfYXJlYSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNvcHkgdGhlIGRhdGEgaW50byB0aGUgcHBwIHByaXZhdGUgc3RydWN0dXJlICovCisJbWVtY3B5KHBwcF9wcml2X2FyZWEtPnVzZXJpZCwgY29uZi0+dXNlcmlkLCBzdHJsZW4oY29uZi0+dXNlcmlkKSk7CisJbWVtY3B5KHBwcF9wcml2X2FyZWEtPnBhc3N3ZCwgY29uZi0+cGFzc3dkLCBzdHJsZW4oY29uZi0+cGFzc3dkKSk7CisJbWVtY3B5KHBwcF9wcml2X2FyZWEtPnN5c25hbWUsIGNvbmYtPnN5c25hbWUsIHN0cmxlbihjb25mLT5zeXNuYW1lKSk7CisKKwkKKwlwcHBfcHJpdl9hcmVhLT5lbmFibGVfSVBYID0gY29uZi0+ZW5hYmxlX0lQWDsKKwlpZiAoY29uZi0+bmV0d29ya19udW1iZXIpeworCQlwcHBfcHJpdl9hcmVhLT5uZXR3b3JrX251bWJlciA9IGNvbmYtPm5ldHdvcmtfbnVtYmVyOworCX1lbHNleworCQlwcHBfcHJpdl9hcmVhLT5uZXR3b3JrX251bWJlciA9IDB4REVBREJFRUY7CisJfQorCisJLyogVGVsbHMgdXMgdGhhdCBpZiB0aGlzIGludGVyZmFjZSBpcyBhCisgICAgICAgICAqIGdhdGV3YXkgb3Igbm90ICovCisJaWYgKChwcHBfcHJpdl9hcmVhLT5nYXRld2F5ID0gY29uZi0+Z2F0ZXdheSkgPT0gV0FOT1BUX1lFUyl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcmZhY2UgJXMgaXMgc2V0IGFzIGEgZ2F0ZXdheS5cbiIsCisJCQljYXJkLT5kZXZuYW1lLGNhcmQtPnUucC5pZl9uYW1lKTsKKwl9CisKKwkvKiBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIGRhdGEgc3BhY2UgZm9yIHJlZ2lzdHJhdGlvbiAqLworIAlzdHJjcHkoZGV2LT5uYW1lLGNhcmQtPnUucC5pZl9uYW1lKTsKKwkKKwlkZXYtPmluaXQgPSAmaWZfaW5pdDsKKwlkZXYtPnByaXYgPSBwcHBfcHJpdl9hcmVhOworCWRldi0+bXR1ID0gbWluX3QodW5zaWduZWQgaW50LCBkZXYtPm10dSwgY2FyZC0+d2FuZGV2Lm10dSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwb2xsaW5nIHdvcmsgcm91dGluZSAqLworCUlOSVRfV09SSygmcHBwX3ByaXZfYXJlYS0+cG9sbF93b3JrLCAodm9pZCopKHZvaWQqKXBwcF9wb2xsLCBkZXYpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcG9sbGluZyBkZWxheSB0aW1lciAqLworCWluaXRfdGltZXIoJnBwcF9wcml2X2FyZWEtPnBvbGxfZGVsYXlfdGltZXIpOworCXBwcF9wcml2X2FyZWEtPnBvbGxfZGVsYXlfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlwcHBfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyLmZ1bmN0aW9uID0gcHBwX3BvbGxfZGVsYXk7CisJCisJCisJLyogU2luY2Ugd2Ugc3RhcnQgd2l0aCBkdW1teSBJUCBhZGRyZXNzZXMgd2UgY2FuIHNheQorCSAqIHRoYXQgcm91dGUgZXhpc3RzICovCisJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERlbGV0ZSBsb2dpY2FsIGNoYW5uZWwuCisgKi8KK3N0YXRpYyBpbnQgZGVsX2lmKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29tbSAoc2RsYV90ICpjYXJkKQoreworCXBwcF9jb21tX2Rpc2FibGVfc2h1dGRvd24oY2FyZCk7CisJcmV0dXJuOworfQorCisvKioqKioqIFdBTlBJUEUtc3BlY2lmaWMgZW50cnkgcG9pbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFeGVjdXRlIGFkYXB0ZXIgaW50ZXJmYWNlIGNvbW1hbmQuCisgKi8KKworLy9GSVhNRTogV2h5IGRvIHdlIG5lZWQgdGhpcyA/Pz8/CitzdGF0aWMgaW50IHdwcF9leGVjKHN0cnVjdCBzZGxhICpjYXJkLCB2b2lkICp1X2NtZCwgdm9pZCAqdV9kYXRhKQoreworCXBwcF9tYm94X3QgKm1ib3ggPSBjYXJkLT5tYm94OworCWludCBsZW47CisKKwlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQqKSZtYm94LT5jbWQsIHVfY21kLCBzaXplb2YocHBwX2NtZF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbGVuID0gbWJveC0+Y21kLmxlbmd0aDsKKworCWlmIChsZW4pIHsKKworCQlpZiggY29weV9mcm9tX3VzZXIoKHZvaWQqKSZtYm94LT5kYXRhLCB1X2RhdGEsIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCX0KKworCS8qIGV4ZWN1dGUgY29tbWFuZCAqLworCWlmICghc2RsYV9leGVjKG1ib3gpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHJldHVybiByZXN1bHQgKi8KKwlpZiggY29weV90b191c2VyKHVfY21kLCAodm9pZCopJm1ib3gtPmNtZCwgc2l6ZW9mKHBwcF9jbWRfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlsZW4gPSBtYm94LT5jbWQubGVuZ3RoOworCisJaWYgKGxlbiAmJiB1X2RhdGEgJiYgY29weV90b191c2VyKHVfZGF0YSwgKHZvaWQqKSZtYm94LT5kYXRhLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKioqKioqIE5ldHdvcmsgRGV2aWNlIEludGVyZmFjZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIExpbnV4IG5ldHdvcmsgaW50ZXJmYWNlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgb25seSBvbmNlIGZvciBlYWNoIGludGVyZmFjZSwgZHVyaW5nIExpbnV4IG5ldHdvcmsKKyAqIGludGVyZmFjZSByZWdpc3RyYXRpb24uICBSZXR1cm5pbmcgYW55dGhpbmcgYnV0IHplcm8gd2lsbCBmYWlsIGludGVyZmFjZQorICogcmVnaXN0cmF0aW9uLgorICovCitzdGF0aWMgaW50IGlmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gcHBwX3ByaXZfYXJlYS0+Y2FyZDsKKwlzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKworCS8qIEluaXRpYWxpemUgZGV2aWNlIGRyaXZlciBlbnRyeSBwb2ludHMgKi8KKwlkZXYtPm9wZW4JCT0gJmlmX29wZW47CisJZGV2LT5zdG9wCQk9ICZpZl9jbG9zZTsKKwlkZXYtPmhhcmRfaGVhZGVyCT0gJmlmX2hlYWRlcjsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyCT0gJmlmX3JlYnVpbGRfaGRyOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gJmlmX3NlbmQ7CisJZGV2LT5nZXRfc3RhdHMJCT0gJmlmX3N0YXRzOworCWRldi0+dHhfdGltZW91dAkJPSAmaWZfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gVFhfVElNRU9VVDsKKworCS8qIEluaXRpYWxpemUgbWVkaWEtc3BlY2lmaWMgcGFyYW1ldGVycyAqLworCWRldi0+dHlwZQkJPSBBUlBIUkRfUFBQOwkvKiBBUlAgaC93IHR5cGUgKi8KKwlkZXYtPmZsYWdzCQl8PSBJRkZfUE9JTlRPUE9JTlQ7CisJZGV2LT5mbGFncwkJfD0gSUZGX05PQVJQOworCisJLyogRW5hYmxlIE11bGl0Y2FzdGluZyBpZiBzcGVjaWZpZWQgYnkgdXNlciovCisJaWYgKHBwcF9wcml2X2FyZWEtPm1jID09IFdBTk9QVF9ZRVMpeworCQlkZXYtPmZsYWdzCXw9IElGRl9NVUxUSUNBU1Q7CisJfQorCisJZGV2LT5tdHUJCT0gd2FuZGV2LT5tdHU7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSBQUFBfSERSX0xFTjsJLyogbWVkaWEgaGVhZGVyIGxlbmd0aCAqLworCisJLyogSW5pdGlhbGl6ZSBoYXJkd2FyZSBwYXJhbWV0ZXJzIChqdXN0IGZvciByZWZlcmVuY2UpICovCisJZGV2LT5pcnEJCT0gd2FuZGV2LT5pcnE7CisJZGV2LT5kbWEJCT0gd2FuZGV2LT5kbWE7CisJZGV2LT5iYXNlX2FkZHIJCT0gd2FuZGV2LT5pb3BvcnQ7CisJZGV2LT5tZW1fc3RhcnQJCT0gd2FuZGV2LT5tYWRkcjsKKwlkZXYtPm1lbV9lbmQJCT0gd2FuZGV2LT5tYWRkciArIHdhbmRldi0+bXNpemUgLSAxOworCisgICAgICAgIC8qIFNldCB0cmFuc21pdCBidWZmZXIgcXVldWUgbGVuZ3RoICovCisgICAgICAgIGRldi0+dHhfcXVldWVfbGVuID0gMTAwOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgIAorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE9wZW4gbmV0d29yayBpbnRlcmZhY2UuCisgKiBvIGVuYWJsZSBjb21tdW5pY2F0aW9ucyBhbmQgaW50ZXJydXB0cy4KKyAqIG8gcHJldmVudCBtb2R1bGUgZnJvbSB1bmxvYWRpbmcgYnkgaW5jcmVtZW50aW5nIHVzZSBjb3VudAorICoKKyAqIFJldHVybiAwIGlmIE8uay4gb3IgZXJybm8uCisgKi8KK3N0YXRpYyBpbnQgaWZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBwcHBfcHJpdl9hcmVhLT5jYXJkOworCXN0cnVjdCB0aW1ldmFsIHR2OworCS8vdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJd2FucGlwZV9vcGVuKGNhcmQpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkKKwlkb19nZXR0aW1lb2ZkYXkoICZ0diApOworCXBwcF9wcml2X2FyZWEtPnJvdXRlcl9zdGFydF90aW1lID0gdHYudHZfc2VjOworCisJLyogV2UgY2Fubm90IGNvbmZpZ3VyZSB0aGUgY2FyZCBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3QKKwkgKiBoYXZlIGFjY2VzcyB0byB0aGUgaW50ZXJmYWNlIElQIGFkZHJlc3Nlcy4KKyAgICAgICAgICogT25jZSB0aGUgaW50ZXJmYWNlIGluaXRpbGl6YXRpb24gaXMgY29tcGxldGUsIHdlIHdpbGwgYmUKKyAgICAgICAgICogYWJsZSB0byBhY2Nlc3MgdGhlIElQIGFkZHJlc3Nlcy4gIFRoZXJlZm9yZSwKKyAgICAgICAgICogY29uZmlndXJlIHRoZSBwcHAgbGluayBpbiB0aGUgcG9sbCByb3V0aW5lICovCisJc2V0X2JpdCgwLCZwcHBfcHJpdl9hcmVhLT5jb25maWdfcHBwKTsKKwlwcHBfcHJpdl9hcmVhLT5jb25maWdfd2FpdF90aW1lb3V0PWppZmZpZXM7CisKKwkvKiBTdGFydCB0aGUgUFBQIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgMXNlYyBkZWxheS4KKwkgKiBUaGlzIHdpbGwgZ2l2ZSB0aGUgaW50ZXJmYWNlIGluaXRpbGl6YXRpb24gdGltZQorCSAqIHRvIGZpbmlzaCBpdHMgY29uZmlndXJhdGlvbiAqLworCW1vZF90aW1lcigmcHBwX3ByaXZfYXJlYS0+cG9sbF9kZWxheV90aW1lciwgamlmZmllcyArIEhaKTsKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDbG9zZSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIG8gaWYgdGhpcyBpcyB0aGUgbGFzdCBvcGVuLCB0aGVuIGRpc2FibGUgY29tbXVuaWNhdGlvbnMgYW5kIGludGVycnVwdHMuCisgKiBvIHJlc2V0IGZsYWdzLgorICovCitzdGF0aWMgaW50IGlmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IHBwcF9wcml2X2FyZWEtPmNhcmQ7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJd2FucGlwZV9jbG9zZShjYXJkKTsKKworCWRlbF90aW1lciAoJnBwcF9wcml2X2FyZWEtPnBvbGxfZGVsYXlfdGltZXIpOworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEJ1aWxkIG1lZGlhIGhlYWRlci4KKyAqCisgKiBUaGUgdHJpY2sgaGVyZSBpcyB0byBwdXQgcGFja2V0IHR5cGUgKEV0aGVydHlwZSkgaW50byAncHJvdG9jb2wnIGZpZWxkIG9mCisgKiB0aGUgc29ja2V0IGJ1ZmZlciwgc28gdGhhdCB3ZSBkb24ndCBmb3JnZXQgaXQuICBJZiBwYWNrZXQgdHlwZSBpcyBub3QKKyAqIHN1cHBvcnRlZCwgc2V0IHNrYi0+cHJvdG9jb2wgdG8gMCBhbmQgZGlzY2FyZCBwYWNrZXQgbGF0ZXIuCisgKgorICogUmV0dXJuOgltZWRpYSBoZWFkZXIgbGVuZ3RoLgorICovCitzdGF0aWMgaW50IGlmX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKQoreworCXN3aXRjaCAodHlwZSkKKwl7CisJCWNhc2UgRVRIX1BfSVA6CisJCWNhc2UgRVRIX1BfSVBYOgorCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKHR5cGUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXNrYi0+cHJvdG9jb2wgPSAwOworCX0KKworCXJldHVybiBQUFBfSERSX0xFTjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZS1idWlsZCBtZWRpYSBoZWFkZXIuCisgKgorICogUmV0dXJuOgkxCXBoeXNpY2FsIGFkZHJlc3MgcmVzb2x2ZWQuCisgKgkJMAlwaHlzaWNhbCBhZGRyZXNzIG5vdCByZXNvbHZlZAorICovCitzdGF0aWMgaW50IGlmX3JlYnVpbGRfaGRyIChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gcHBwX3ByaXZfYXJlYS0+Y2FyZDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWJ1aWxkX2hlYWRlcigpIGNhbGxlZCBmb3IgaW50ZXJmYWNlICVzIVxuIiwKKwkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKwlyZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBIYW5kbGUgdHJhbnNtaXQgdGltZW91dCBldmVudCBmcm9tIG5ldGlmIHdhdGNoZG9nCisgKi8KK3N0YXRpYyB2b2lkIGlmX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAJcHBwX3ByaXZhdGVfYXJlYV90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisJCisJLyogSWYgb3VyIGRldmljZSBzdGF5cyBidXN5IGZvciBhdCBsZWFzdCA1IHNlY29uZHMgdGhlbiB3ZSB3aWxsCisJICoga2ljayBzdGFydCB0aGUgZGV2aWNlIGJ5IG1ha2luZyBkZXYtPnRidXN5ID0gMC4gIFdlIGV4cGVjdAorCSAqIHRoYXQgb3VyIGRldmljZSBuZXZlciBzdGF5cyBidXN5IG1vcmUgdGhhbiA1IHNlY29uZHMuIFNvIHRoaXMgICAgICAgICAgICAgICAgIAorCSAqIGlzIG9ubHkgdXNlZCBhcyBhIGxhc3QgcmVzb3J0LgorCSAqLworCisJKysgY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfdGJ1c3k7CisJKytjYXJkLT53YW5kZXYuc3RhdHMuY29sbGlzaW9uczsKKworCXByaW50ayAoS0VSTl9JTkZPICIlczogVHJhbnNtaXQgdGltZWQgb3V0IG9uICVzXG4iLCBjYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisJKytjaGFuLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF90YnVzeV90aW1lb3V0OworCW5ldGlmX3dha2VfcXVldWUgKGRldik7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSBwYWNrZXQgb24gYSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIG8gc2V0IHRidXN5IGZsYWcgKG1hcmtzIHN0YXJ0IG9mIHRoZSB0cmFuc21pc3Npb24pIHRvIGJsb2NrIGEgdGltZXItYmFzZWQKKyAqICAgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4KKyAqIG8gY2hlY2sgbGluayBzdGF0ZS4gSWYgbGluayBpcyBub3QgdXAsIHRoZW4gZHJvcCB0aGUgcGFja2V0LgorICogbyBleGVjdXRlIGFkYXB0ZXIgc2VuZCBjb21tYW5kLgorICogbyBmcmVlIHNvY2tldCBidWZmZXIKKyAqCisgKiBSZXR1cm46CTAJY29tcGxldGUgKHNvY2tldCBidWZmZXIgbXVzdCBiZSBmcmVlZCkKKyAqCQlub24tMAlwYWNrZXQgbWF5IGJlIHJlLXRyYW5zbWl0dGVkICh0YnVzeSBtdXN0IGJlIHNldCkKKyAqCisgKiBOb3RlczoKKyAqIDEuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZWl0aGVyIGJ5IHRoZSBwcm90b2NvbCBzdGFjayBvciBieSB0aGUgIm5ldAorICogICAgYm90dG9tIGhhbGYiICh3aXRoIGludGVycnVwdHMgZW5hYmxlZCkuCisgKiAyLiBTZXR0aW5nIHRidXN5IGZsYWcgd2lsbCBpbmhpYml0IGZ1cnRoZXIgdHJhbnNtaXQgcmVxdWVzdHMgZnJvbSB0aGUKKyAqICAgIHByb3RvY29sIHN0YWNrIGFuZCBjYW4gYmUgdXNlZCBmb3IgZmxvdyBjb250cm9sIHdpdGggcHJvdG9jb2wgbGF5ZXIuCisgKi8KK3N0YXRpYyBpbnQgaWZfc2VuZCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gcHBwX3ByaXZfYXJlYS0+Y2FyZDsKKwl1bnNpZ25lZCBjaGFyICpzZW5kcGFja2V0OworCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzOworCXBwcF9mbGFnc190ICpmbGFncyA9IGNhcmQtPmZsYWdzOworCWludCB1ZHBfdHlwZTsKKwlpbnQgZXJyPTA7CisJCisJKytwcHBfcHJpdl9hcmVhLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF9lbnRyeTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlpZiAoc2tiID09IE5VTEwpIHsKKworCQkvKiBJZiB3ZSBnZXQgaGVyZSwgc29tZSBoaWdoZXIgbGF5ZXIgdGhpbmtzIHdlJ3ZlIG1pc3NlZCBhbgorCQkgKiB0eC1kb25lIGludGVycnVwdC4KKwkJICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnRlcmZhY2UgJXMgZ290IGtpY2tlZCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUpOworCQkKKwkJKytwcHBfcHJpdl9hcmVhLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF9za2JfbnVsbDsKKwkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZW5kcGFja2V0ID0gc2tiLT5kYXRhOworCisJdWRwX3R5cGUgPSB1ZHBfcGt0X3R5cGUoIHNrYiwgY2FyZCApOworCisKKwlpZiAodWRwX3R5cGUgPT0gVURQX1BUUElQRV9UWVBFKXsKKwkJaWYoc3RvcmVfdWRwX21nbXRfcGt0KFVEUF9QS1RfRlJNX1NUQUNLLCBjYXJkLCBza2IsIGRldiwKKyAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICBwcHBfcHJpdl9hcmVhKSl7CisJICAgICAgICAgICAgICAgCWZsYWdzLT5pbWFzayB8PSBQUFBfSU5UUl9USU1FUjsKKwkJfQorCQkrK3BwcF9wcml2X2FyZWEtPmlmX3NlbmRfc3RhdC5pZl9zZW5kX1BJUEVfcmVxdWVzdDsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgZm9yIGJyb2FkY2FzdCBhbmQgbXVsdGljYXN0IGFkZHJlc3NlcyAKKwkgKiBJZiBmb3VuZCwgZHJvcCAoZGVhbGxvY2F0ZSkgYSBwYWNrZXQgYW5kIHJldHVybi4KKwkgKi8KKwlpZihjaGtfYmNhc3RfbWNhc3RfYWRkcihjYXJkLCBkZXYsIHNrYikpeworCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKworIAlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisJCXM1MDhfbG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCX0KKworICAgIAlpZiAodGVzdF9hbmRfc2V0X2JpdChTRU5EX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSkgeworCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCBpbiBpZl9zZW5kOiAlbHhcbiIsCisJCQkJY2FyZC0+d2FuZGV2Lm5hbWUsY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJCisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCSsrcHBwX3ByaXZfYXJlYS0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfY3JpdGljYWxfbm9uX0lTUjsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJZ290byBpZl9zZW5kX2V4aXRfY3JpdDsKKwl9CisKKwlpZiAoY2FyZC0+d2FuZGV2LnN0YXRlICE9IFdBTl9DT05ORUNURUQpIHsKKworCQkrK3BwcF9wcml2X2FyZWEtPmlmX3NlbmRfc3RhdC5pZl9zZW5kX3dhbl9kaXNjb25uZWN0ZWQ7CisgICAgICAgIAkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkKKyAgICAgCX0gZWxzZSBpZiAoIXNrYi0+cHJvdG9jb2wpIHsKKwkJKytwcHBfcHJpdl9hcmVhLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF9wcm90b2NvbF9lcnJvcjsKKyAgICAgICAgCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Vycm9yczsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCisJfSBlbHNlIHsKKworCQkvKklmIGl0J3MgSVBYIGNoYW5nZSB0aGUgbmV0d29yayBudW1iZXJzIHRvIDAgaWYgdGhleSdyZSBvdXJzLiovCisJCWlmKCBza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQWCkgKSB7CisJCQlpZihwcHBfcHJpdl9hcmVhLT5lbmFibGVfSVBYKSB7CisJCQkJc3dpdGNoX25ldF9udW1iZXJzKCBza2ItPmRhdGEsIAorCQkJCQlwcHBfcHJpdl9hcmVhLT5uZXR3b3JrX251bWJlciwgMCk7CisJCQl9IGVsc2UgeworCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCQlnb3RvIGlmX3NlbmRfZXhpdF9jcml0OworCQkJfQorCQl9CisKKwkJaWYgKHBwcF9zZW5kKGNhcmQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIHNrYi0+cHJvdG9jb2wpKSB7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQkrK3BwcF9wcml2X2FyZWEtPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2FkcHRyX2JmcnNfZnVsbDsKKwkJCSsrcHBwX3ByaXZfYXJlYS0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfdHhfaW50X2VuYWJsZWQ7CisJCX0gZWxzZSB7CisJCQkrK3BwcF9wcml2X2FyZWEtPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2Jmcl9wYXNzZWRfdG9fYWRwdHI7CisJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9wYWNrZXRzOworCQkJY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQl9CisgICAgCX0KKwkKK2lmX3NlbmRfZXhpdF9jcml0OgorCQorCWlmICghKGVycj1uZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpKXsKKyAgICAgIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9ZWxzZXsKKwkJcHBwX3ByaXZfYXJlYS0+dGlja19jb3VudGVyID0gamlmZmllczsKKwkJZmxhZ3MtPmltYXNrIHw9IFBQUF9JTlRSX1RYUkRZOwkvKiB1bm1hc2sgVHggaW50ZXJydXB0cyAqLworCX0KKwkKKwljbGVhcl9iaXQoU0VORF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KXsJCisJCXM1MDhfdW5sb2NrKGNhcmQsJnNtcF9mbGFncyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdG9yZSBhIFVEUCBtYW5hZ2VtZW50IHBhY2tldCBmb3IgbGF0ZXIgcHJvY2Vzc2luZy4KKyAqLworCitzdGF0aWMgaW50IHN0b3JlX3VkcF9tZ210X3BrdChjaGFyIHVkcF9wa3Rfc3JjLCBzZGxhX3QqIGNhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwcF9wcml2YXRlX2FyZWFfdCogcHBwX3ByaXZfYXJlYSApCit7CisJaW50IHVkcF9wa3Rfc3RvcmVkID0gMDsKKworCWlmKCFwcHBfcHJpdl9hcmVhLT51ZHBfcGt0X2xndGggJiYgKHNrYi0+bGVuPD1NQVhfTEdUSF9VRFBfTUdOVF9QS1QpKXsKKyAgICAgICAgCXBwcF9wcml2X2FyZWEtPnVkcF9wa3RfbGd0aCA9IHNrYi0+bGVuOworCQlwcHBfcHJpdl9hcmVhLT51ZHBfcGt0X3NyYyA9IHVkcF9wa3Rfc3JjOworICAgICAgIAkJbWVtY3B5KHBwcF9wcml2X2FyZWEtPnVkcF9wa3RfZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9VRFA7CisJCXBwcF9wcml2X2FyZWEtPnByb3RvY29sID0gc2tiLT5wcm90b2NvbDsKKwkJdWRwX3BrdF9zdG9yZWQgPSAxOworCX1lbHNleworCQlpZiAoc2tiLT5sZW4gPiBNQVhfTEdUSF9VRFBfTUdOVF9QS1QpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBJUEVNT04gVURQIHJlcXVlc3QgdG9vIGxvbmcgOiAlaVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBza2ItPmxlbik7CisJCX1lbHNleworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBJUEVNT04gVVBEIHJlcXVlc3QgYWxyZWFkeSBwZW5kaW5nXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQl9CisJCXBwcF9wcml2X2FyZWEtPnVkcF9wa3RfbGd0aCA9IDA7CisJfQorCisJaWYodWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fU1RBQ0speworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX1lbHNleworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfQorCisJcmV0dXJuKHVkcF9wa3Rfc3RvcmVkKTsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVwbHkgdG8gVURQIE1hbmFnZW1lbnQgc3lzdGVtLgorICogUmV0dXJuIGxlbmd0aCBvZiByZXBseS4KKyAqLworc3RhdGljIGludCByZXBseV91ZHAoIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBtYm94X2xlbiApIAoreworCXVuc2lnbmVkIHNob3J0IGxlbiwgdWRwX2xlbmd0aCwgdGVtcCwgaXBfbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgaXBfdGVtcDsKKwlpbnQgZXZlbl9ib3VuZCA9IDA7CisJcHBwX3VkcF9wa3RfdCAqcF91ZHBfcGt0ID0gKHBwcF91ZHBfcGt0X3QgKilkYXRhOworIAorCS8qIFNldCBsZW5ndGggb2YgcGFja2V0ICovCisJbGVuID0gc2l6ZW9mKGlwX3BrdF90KSsgCisJICAgICAgc2l6ZW9mKHVkcF9wa3RfdCkrCisJICAgICAgc2l6ZW9mKHdwX21nbXRfdCkrCisJICAgICAgc2l6ZW9mKGNibG9ja190KSsKKwkgICAgICBtYm94X2xlbjsKKworCS8qIGZpbGwgaW4gVURQIHJlcGx5ICovCisgIAlwX3VkcF9wa3QtPndwX21nbXQucmVxdWVzdF9yZXBseSA9IFVEUE1HTVRfUkVQTFk7IAorCisJLyogZmlsbCBpbiBVRFAgbGVuZ3RoICovCisJdWRwX2xlbmd0aCA9IHNpemVvZih1ZHBfcGt0X3QpKyAKKwkJICAgICBzaXplb2Yod3BfbWdtdF90KSsKKwkJICAgICBzaXplb2YoY2Jsb2NrX3QpKworCQkgICAgIG1ib3hfbGVuOyAKKyAgCisgCisJLyogcHV0IGl0IG9uIGFuIGV2ZW4gYm91bmRhcnkgKi8KKwlpZiAoIHVkcF9sZW5ndGggJiAweDAwMDEgKSB7CisJCXVkcF9sZW5ndGggKz0gMTsKKwkJbGVuICs9IDE7CisJCWV2ZW5fYm91bmQ9MTsKKwl9IAorCQorCXRlbXAgPSAodWRwX2xlbmd0aDw8OCl8KHVkcF9sZW5ndGg+PjgpOworCXBfdWRwX3BrdC0+dWRwX3BrdC51ZHBfbGVuZ3RoID0gdGVtcDsJCQorCisgCisJLyogc3dhcCBVRFAgcG9ydHMgKi8KKwl0ZW1wID0gcF91ZHBfcGt0LT51ZHBfcGt0LnVkcF9zcmNfcG9ydDsKKwlwX3VkcF9wa3QtPnVkcF9wa3QudWRwX3NyY19wb3J0ID0gCisJCQlwX3VkcF9wa3QtPnVkcF9wa3QudWRwX2RzdF9wb3J0OyAKKwlwX3VkcF9wa3QtPnVkcF9wa3QudWRwX2RzdF9wb3J0ID0gdGVtcDsKKworCisJLyogYWRkIFVEUCBwc2V1ZG8gaGVhZGVyICovCisJdGVtcCA9IDB4MTEwMDsKKwkqKCh1bnNpZ25lZCBzaG9ydCAqKShwX3VkcF9wa3QtPmRhdGErbWJveF9sZW4rZXZlbl9ib3VuZCkpID0gdGVtcDsKKwl0ZW1wID0gKHVkcF9sZW5ndGg8PDgpfCh1ZHBfbGVuZ3RoPj44KTsKKwkqKCh1bnNpZ25lZCBzaG9ydCAqKShwX3VkcF9wa3QtPmRhdGErbWJveF9sZW4rZXZlbl9ib3VuZCsyKSkgPSB0ZW1wOworIAorCS8qIGNhbGN1bGF0ZSBVRFAgY2hlY2tzdW0gKi8KKwlwX3VkcF9wa3QtPnVkcF9wa3QudWRwX2NoZWNrc3VtID0gMDsKKwlwX3VkcF9wa3QtPnVkcF9wa3QudWRwX2NoZWNrc3VtID0gCisJCWNhbGNfY2hlY2tzdW0oJmRhdGFbVURQX09GRlNFVF0sdWRwX2xlbmd0aCtVRFBfT0ZGU0VUKTsKKworCS8qIGZpbGwgaW4gSVAgbGVuZ3RoICovCisJaXBfbGVuZ3RoID0gdWRwX2xlbmd0aCArIHNpemVvZihpcF9wa3RfdCk7CisJdGVtcCA9IChpcF9sZW5ndGg8PDgpfChpcF9sZW5ndGg+PjgpOworICAJcF91ZHBfcGt0LT5pcF9wa3QudG90YWxfbGVuZ3RoID0gdGVtcDsKKyAKKwkvKiBzd2FwIElQIGFkZHJlc3NlcyAqLworCWlwX3RlbXAgPSBwX3VkcF9wa3QtPmlwX3BrdC5pcF9zcmNfYWRkcmVzczsKKwlwX3VkcF9wa3QtPmlwX3BrdC5pcF9zcmNfYWRkcmVzcyA9IHBfdWRwX3BrdC0+aXBfcGt0LmlwX2RzdF9hZGRyZXNzOworCXBfdWRwX3BrdC0+aXBfcGt0LmlwX2RzdF9hZGRyZXNzID0gaXBfdGVtcDsKKworCS8qIGZpbGwgaW4gSVAgY2hlY2tzdW0gKi8KKwlwX3VkcF9wa3QtPmlwX3BrdC5oZHJfY2hlY2tzdW0gPSAwOworCXBfdWRwX3BrdC0+aXBfcGt0Lmhkcl9jaGVja3N1bSA9IGNhbGNfY2hlY2tzdW0oZGF0YSxzaXplb2YoaXBfcGt0X3QpKTsKKworCXJldHVybiBsZW47CisKK30gLyogcmVwbHlfdWRwICovCisKK3Vuc2lnbmVkIHNob3J0IGNhbGNfY2hlY2tzdW0gKGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJdW5zaWduZWQgc2hvcnQgdGVtcDsgCisJdW5zaWduZWQgbG9uZyBzdW09MDsKKwlpbnQgaTsKKworCWZvciggaSA9IDA7IGkgPGxlbjsgaSs9MiApIHsKKwkJbWVtY3B5KCZ0ZW1wLCZkYXRhW2ldLDIpOworCQlzdW0gKz0gKHVuc2lnbmVkIGxvbmcpdGVtcDsKKwl9CisKKwl3aGlsZSAoc3VtID4+IDE2ICkgeworCQlzdW0gPSAoc3VtICYgMHhmZmZmVUwpICsgKHN1bSA+PiAxNik7CisJfQorCisJdGVtcCA9ICh1bnNpZ25lZCBzaG9ydClzdW07CisJdGVtcCA9IH50ZW1wOworCisJaWYoIHRlbXAgPT0gMCApIAorCQl0ZW1wID0gMHhmZmZmOworCisJcmV0dXJuIHRlbXA7CQorfQorCisvKgorICAgSWYgaW5jb21pbmcgaXMgMCAob3V0Z29pbmcpLSBpZiB0aGUgbmV0IG51bWJlcnMgaXMgb3VycyBtYWtlIGl0IDAKKyAgIGlmIGluY29taW5nIGlzIDEgLSBpZiB0aGUgbmV0IG51bWJlciBpcyAwIG1ha2UgaXQgb3VycyAKKworKi8KK3N0YXRpYyB2b2lkIHN3aXRjaF9uZXRfbnVtYmVycyh1bnNpZ25lZCBjaGFyICpzZW5kcGFja2V0LCB1bnNpZ25lZCBsb25nIG5ldHdvcmtfbnVtYmVyLCB1bnNpZ25lZCBjaGFyIGluY29taW5nKQoreworCXVuc2lnbmVkIGxvbmcgcG5ldHdvcmtfbnVtYmVyOworCisJcG5ldHdvcmtfbnVtYmVyID0gKHVuc2lnbmVkIGxvbmcpKChzZW5kcGFja2V0WzZdIDw8IDI0KSArIAorCQkJICAoc2VuZHBhY2tldFs3XSA8PCAxNikgKyAoc2VuZHBhY2tldFs4XSA8PCA4KSArIAorCQkJICBzZW5kcGFja2V0WzldKTsKKworCWlmICghaW5jb21pbmcpIHsKKwkJLy9JZiB0aGUgZGVzdGluYXRpb24gbmV0d29yayBudW1iZXIgaXMgb3VycywgbWFrZSBpdCAwCisJCWlmKCBwbmV0d29ya19udW1iZXIgPT0gbmV0d29ya19udW1iZXIpIHsKKwkJCXNlbmRwYWNrZXRbNl0gPSBzZW5kcGFja2V0WzddID0gc2VuZHBhY2tldFs4XSA9IAorCQkJCQkgc2VuZHBhY2tldFs5XSA9IDB4MDA7CisJCX0KKwl9IGVsc2UgeworCQkvL0lmIHRoZSBpbmNvbWluZyBuZXR3b3JrIGlzIDAsIG1ha2UgaXQgb3VycworCQlpZiggcG5ldHdvcmtfbnVtYmVyID09IDApIHsKKwkJCXNlbmRwYWNrZXRbNl0gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgPj4gMjQpOworCQkJc2VuZHBhY2tldFs3XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDBGRjAwMDApID4+IDE2KTsKKwkJCXNlbmRwYWNrZXRbOF0gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDBGRjAwKSA+PiA4KTsKKwkJCXNlbmRwYWNrZXRbOV0gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDAwMDAwRkYpOworCQl9CisJfQorCisKKwlwbmV0d29ya19udW1iZXIgPSAodW5zaWduZWQgbG9uZykoKHNlbmRwYWNrZXRbMThdIDw8IDI0KSArIAorCQkJICAoc2VuZHBhY2tldFsxOV0gPDwgMTYpICsgKHNlbmRwYWNrZXRbMjBdIDw8IDgpICsgCisJCQkgIHNlbmRwYWNrZXRbMjFdKTsKKworCWlmKCAhaW5jb21pbmcgKSB7CisJCS8vSWYgdGhlIHNvdXJjZSBuZXR3b3JrIGlzIG91cnMsIG1ha2UgaXQgMAorCQlpZiggcG5ldHdvcmtfbnVtYmVyID09IG5ldHdvcmtfbnVtYmVyKSB7CisJCQlzZW5kcGFja2V0WzE4XSA9IHNlbmRwYWNrZXRbMTldID0gc2VuZHBhY2tldFsyMF0gPSAKKwkJCQkJIHNlbmRwYWNrZXRbMjFdID0gMHgwMDsKKwkJfQorCX0gZWxzZSB7CisJCS8vSWYgdGhlIHNvdXJjZSBuZXR3b3JrIGlzIDAsIG1ha2UgaXQgb3VycworCQlpZiggcG5ldHdvcmtfbnVtYmVyID09IDAgKSB7CisJCQlzZW5kcGFja2V0WzE4XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciA+PiAyNCk7CisJCQlzZW5kcGFja2V0WzE5XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDBGRjAwMDApID4+IDE2KTsKKwkJCXNlbmRwYWNrZXRbMjBdID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMDAwRkYwMCkgPj4gOCk7CisJCQlzZW5kcGFja2V0WzIxXSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMDAwMDBGRik7CisJCX0KKwl9Cit9IC8qIHN3aXRjaF9uZXRfbnVtYmVycyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdldCBldGhlcm5ldC1zdHlsZSBpbnRlcmZhY2Ugc3RhdGlzdGljcy4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaWZfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQ7CisJCisJaWYoIHBwcF9wcml2X2FyZWEgPT0gTlVMTCApCisJCXJldHVybiBOVUxMOworCisJY2FyZCA9IHBwcF9wcml2X2FyZWEtPmNhcmQ7CisJcmV0dXJuICZjYXJkLT53YW5kZXYuc3RhdHM7Cit9CisKKy8qKioqKiogUFBQIEZpcm13YXJlIEludGVyZmFjZSBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgZmlybXdhcmUgY29kZSB2ZXJzaW9uLgorICoJUHV0IGNvZGUgdmVyc2lvbiBhcyBBU0NJSSBzdHJpbmcgaW4gc3RyLiAKKyAqLworc3RhdGljIGludCBwcHBfcmVhZF92ZXJzaW9uKHNkbGFfdCAqY2FyZCwgY2hhciAqc3RyKQoreworCXBwcF9tYm94X3QgKm1iID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZtYi0+Y21kLCAwLCBzaXplb2YocHBwX2NtZF90KSk7CisJbWItPmNtZC5jb21tYW5kID0gUFBQX1JFQURfQ09ERV9WRVJTSU9OOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCisJaWYgKGVyciAhPSBDTURfT0spCisgCisJCXBwcF9lcnJvcihjYXJkLCBlcnIsIG1iKTsKKworCWVsc2UgaWYgKHN0cikgeworCisJCWludCBsZW4gPSBtYi0+Y21kLmxlbmd0aDsKKworCQltZW1jcHkoc3RyLCBtYi0+ZGF0YSwgbGVuKTsKKwkJc3RyW2xlbl0gPSAnXDAnOworCisJfQorCisJcmV0dXJuIGVycjsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgT3V0LUJvdW5kIEF1dGhlbnRpY2F0aW9uLgorKi8KK3N0YXRpYyBpbnQgcHBwX3NldF9vdXRibmRfYXV0aCAoc2RsYV90ICpjYXJkLCBwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEpCit7CisJcHBwX21ib3hfdCAqbWIgPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltZW1zZXQoJm1iLT5jbWQsIDAsIHNpemVvZihwcHBfY21kX3QpKTsKKwltZW1zZXQoJm1iLT5kYXRhLCAwLCAoc3RybGVuKHBwcF9wcml2X2FyZWEtPnVzZXJpZCkgKyAKKwkJCQkJc3RybGVuKHBwcF9wcml2X2FyZWEtPnBhc3N3ZCkgKyAyICkgKTsKKwltZW1jcHkobWItPmRhdGEsIHBwcF9wcml2X2FyZWEtPnVzZXJpZCwgc3RybGVuKHBwcF9wcml2X2FyZWEtPnVzZXJpZCkpOworCW1lbWNweSgobWItPmRhdGEgKyBzdHJsZW4ocHBwX3ByaXZfYXJlYS0+dXNlcmlkKSArIDEpLCAKKwkJcHBwX3ByaXZfYXJlYS0+cGFzc3dkLCBzdHJsZW4ocHBwX3ByaXZfYXJlYS0+cGFzc3dkKSk7CQorCQorCW1iLT5jbWQubGVuZ3RoICA9IHN0cmxlbihwcHBfcHJpdl9hcmVhLT51c2VyaWQpICsgCisJCQkJCXN0cmxlbihwcHBfcHJpdl9hcmVhLT5wYXNzd2QpICsgMiA7CisJCisJbWItPmNtZC5jb21tYW5kID0gUFBQX1NFVF9PVVRCT1VORF9BVVRIOworCisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwlpZiAoZXJyICE9IENNRF9PSykKKwkJcHBwX2Vycm9yKGNhcmQsIGVyciwgbWIpOworCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBJbi1Cb3VuZCBBdXRoZW50aWNhdGlvbi4KKyovCitzdGF0aWMgaW50IHBwcF9zZXRfaW5ibmRfYXV0aCAoc2RsYV90ICpjYXJkLCBwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEpCit7CisJcHBwX21ib3hfdCAqbWIgPSBjYXJkLT5tYm94OworCWludCBlcnIsIGk7CisJY2hhciogdXNlcl90b2tlbnNbMzJdOworCWNoYXIqIHBhc3NfdG9rZW5zWzMyXTsKKwlpbnQgdXNlcmlkcywgcGFzc3dkczsKKwlpbnQgYWRkX3B0cjsKKworCW1lbXNldCgmbWItPmNtZCwgMCwgc2l6ZW9mKHBwcF9jbWRfdCkpOworCW1lbXNldCgmbWItPmRhdGEsIDAsIDEwMDgpOworCW1lbWNweShtYi0+ZGF0YSwgcHBwX3ByaXZfYXJlYS0+c3lzbmFtZSwgCisJCQkJCQlzdHJsZW4ocHBwX3ByaXZfYXJlYS0+c3lzbmFtZSkpOworCQorCS8qIFBhcnNlIHRoZSB1c2VyaWQgc3RyaW5nIGFuZCB0aGUgcGFzc3dvcmQgc3RyaW5nIGFuZCBidWlsZCBhIHN0cmluZworCSAgIHRvIGNvcHkgaXQgdG8gdGhlIGRhdGEgYXJlYSBvZiB0aGUgY29tbWFuZCBzdHJ1Y3R1cmUuICAgVGhlIHN0cmluZworCSAgIHdpbGwgbG9vayBsaWtlICJTWVNfTkFNRTxOVUxMPlVTRVIxPE5VTEw+UEFTUzE8TlVMTD5VU0VSMjxOVUxMPlBBU1MyCisJICAgLi4uLjxOVUxMPiAiIAorCSAqLworCXVzZXJpZHMgPSB0b2tlbml6ZSggcHBwX3ByaXZfYXJlYS0+dXNlcmlkLCB1c2VyX3Rva2Vucyk7CisJcGFzc3dkcyA9IHRva2VuaXplKCBwcHBfcHJpdl9hcmVhLT5wYXNzd2QsIHBhc3NfdG9rZW5zKTsKKwkKKwlpZiAodXNlcmlkcyAhPSBwYXNzd2RzKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE51bWJlciBvZiBwYXNzd29yZHMgZG9lcyBub3QgZXF1YWwgdGhlIG51bWJlciBvZiB1c2VyIGlkc1xuIiwgY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAxOwkKKwl9CisKKwlhZGRfcHRyID0gc3RybGVuKHBwcF9wcml2X2FyZWEtPnN5c25hbWUpICsgMTsKKwlmb3IgKGk9MDsgaTx1c2VyaWRzOyBpKyspeworCQltZW1jcHkoKG1iLT5kYXRhICsgYWRkX3B0ciksIHVzZXJfdG9rZW5zW2ldLCAKKwkJCQkJCQlzdHJsZW4odXNlcl90b2tlbnNbaV0pKTsKKwkJbWVtY3B5KChtYi0+ZGF0YSArIGFkZF9wdHIgKyBzdHJsZW4odXNlcl90b2tlbnNbaV0pICsgMSksIAorCQkJCQlwYXNzX3Rva2Vuc1tpXSwgc3RybGVuKHBhc3NfdG9rZW5zW2ldKSk7CisJCWFkZF9wdHIgPSBhZGRfcHRyICsgc3RybGVuKHVzZXJfdG9rZW5zW2ldKSArIDEgKyAKKwkJCQkJCXN0cmxlbihwYXNzX3Rva2Vuc1tpXSkgKyAxOworCX0KKworCW1iLT5jbWQubGVuZ3RoICA9IGFkZF9wdHIgKyAxOworCW1iLT5jbWQuY29tbWFuZCA9IFBQUF9TRVRfSU5CT1VORF9BVVRIOworCisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwlpZiAoZXJyICE9IENNRF9PSykKKwkJcHBwX2Vycm9yKGNhcmQsIGVyciwgbWIpOworCisJcmV0dXJuIGVycjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRva2VuaXplIHN0cmluZy4KKyAqICAgICAgUGFyc2UgYSBzdHJpbmcgb2YgdGhlIGZvbGxvd2luZyBzeW50YXg6CisgKiAgICAgICAgICAgICAgPGFyZzE+LDxhcmcyPiwuLi4KKyAqICAgICAgYW5kIGZpbGwgYXJyYXkgb2YgdG9rZW5zIHdpdGggcG9pbnRlcnMgdG8gc3RyaW5nIGVsZW1lbnRzLgorICoKKyAqLworc3RhdGljIGludCB0b2tlbml6ZSAoY2hhciAqc3RyLCBjaGFyICoqdG9rZW5zKQoreworICAgICAgICBpbnQgY250ID0gMDsKKworICAgICAgICB0b2tlbnNbMF0gPSBzdHJzZXAoJnN0ciwgIi8iKTsKKyAgICAgICAgd2hpbGUgKHRva2Vuc1tjbnRdICYmIChjbnQgPCAzMiAtIDEpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9rZW5zW2NudF0gPSBzdHJzdHJpcCh0b2tlbnNbY250XSwgIiBcdCIpOworICAgICAgICAgICAgICAgIHRva2Vuc1srK2NudF0gPSBzdHJzZXAoJnN0ciwgIi8iKTsKKyAgICAgICAgfQorCXJldHVybiBjbnQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIG9mZiB0aGUgc3RyaW5nIHN0ci4KKyAqLworc3RhdGljIGNoYXIqIHN0cnN0cmlwIChjaGFyICpzdHIsIGNoYXIqIHMpCit7CisgICAgICAgIGNoYXIgKmVvcyA9IHN0ciArIHN0cmxlbihzdHIpOyAgICAgICAgICAvKiAtPiBlbmQgb2Ygc3RyaW5nICovCisKKyAgICAgICAgd2hpbGUgKCpzdHIgJiYgc3RyY2hyKHMsICpzdHIpKQorICAgICAgICAgICAgICAgICsrc3RyICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RyaXAgbGVhZGluZyBzcGFjZXMgKi8KKyAgICAgICAgOworICAgICAgICB3aGlsZSAoKGVvcyA+IHN0cikgJiYgc3RyY2hyKHMsICooZW9zIC0gMSkpKQorICAgICAgICAgICAgICAgIC0tZW9zICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RyaXAgdHJhaWxpbmcgc3BhY2VzICovCisgICAgICAgIDsKKyAgICAgICAgKmVvcyA9ICdcMCc7CisgICAgICAgIHJldHVybiBzdHI7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbmZpZ3VyZSBQUFAgZmlybXdhcmUuCisgKi8KK3N0YXRpYyBpbnQgcHBwX2NvbmZpZ3VyZShzZGxhX3QgKmNhcmQsIHZvaWQgKmRhdGEpCit7CisJcHBwX21ib3hfdCAqbWIgPSBjYXJkLT5tYm94OworCWludCBkYXRhX2xlbiA9IHNpemVvZihwcHA1MDhfY29uZl90KTsgCisJaW50IGVycjsKKworCW1lbXNldCgmbWItPmNtZCwgMCwgc2l6ZW9mKHBwcF9jbWRfdCkpOworCW1lbWNweShtYi0+ZGF0YSwgZGF0YSwgZGF0YV9sZW4pOworCW1iLT5jbWQubGVuZ3RoICA9IGRhdGFfbGVuOworCW1iLT5jbWQuY29tbWFuZCA9IFBQUF9TRVRfQ09ORklHOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCisJaWYgKGVyciAhPSBDTURfT0spIAorCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgaW50ZXJydXB0IG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgcHBwX3NldF9pbnRyX21vZGUoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBjaGFyIG1vZGUpCit7CisJcHBwX21ib3hfdCAqbWIgPSBjYXJkLT5tYm94OworICAgICAgICBwcHBfaW50cl9pbmZvX3QgKnBwcF9pbnRyX2RhdGEgPSAocHBwX2ludHJfaW5mb190ICopICZtYi0+ZGF0YVswXTsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZtYi0+Y21kLCAwLCBzaXplb2YocHBwX2NtZF90KSk7CisJcHBwX2ludHJfZGF0YS0+aV9lbmFibGUgPSBtb2RlOworCisJcHBwX2ludHJfZGF0YS0+aXJxID0gY2FyZC0+aHcuaXJxOworCW1iLT5jbWQubGVuZ3RoID0gMjsKKworICAgICAgIC8qIElmIHRpbWVyIGhhcyBiZWVuIGVuYWJsZWQsIHNldCB0aGUgdGltZXIgZGVsYXkgdG8gMXNlYyAqLworICAgICAgIGlmIChtb2RlICYgMHg4MCl7CisgICAgICAgCQlwcHBfaW50cl9kYXRhLT50aW1lcl9sZW4gPSAyNTA7IC8vNTsvLzEwMDsgLy8yNTA7CisgICAgICAgICAgICAgICAgbWItPmNtZC5sZW5ndGggPSA0OworICAgICAgICB9CisJCisJbWItPmNtZC5jb21tYW5kID0gUFBQX1NFVF9JTlRSX0ZMQUdTOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQorCWlmIChlcnIgIT0gQ01EX09LKSAKKwkJcHBwX2Vycm9yKGNhcmQsIGVyciwgbWIpOworIAkJCisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVuYWJsZSBjb21tdW5pY2F0aW9ucy4KKyAqLworc3RhdGljIGludCBwcHBfY29tbV9lbmFibGUoc2RsYV90ICpjYXJkKQoreworCXBwcF9tYm94X3QgKm1iID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZtYi0+Y21kLCAwLCBzaXplb2YocHBwX2NtZF90KSk7CisJbWItPmNtZC5jb21tYW5kID0gUFBQX0NPTU1fRU5BQkxFOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQorCWlmIChlcnIgIT0gQ01EX09LKSAKKwkJcHBwX2Vycm9yKGNhcmQsIGVyciwgbWIpOworCWVsc2UJCisJCWNhcmQtPnUucC5jb21tX2VuYWJsZWQgPSAxOwkKKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGlzYWJsZSBjb21tdW5pY2F0aW9ucy4KKyAqLworc3RhdGljIGludCBwcHBfY29tbV9kaXNhYmxlKHNkbGFfdCAqY2FyZCkKK3sKKwlwcHBfbWJveF90ICptYiA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKworCW1lbXNldCgmbWItPmNtZCwgMCwgc2l6ZW9mKHBwcF9jbWRfdCkpOworCW1iLT5jbWQuY29tbWFuZCA9IFBQUF9DT01NX0RJU0FCTEU7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJaWYgKGVyciAhPSBDTURfT0spIAorCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisJZWxzZQorCQljYXJkLT51LnAuY29tbV9lbmFibGVkID0gMDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcHBwX2NvbW1fZGlzYWJsZV9zaHV0ZG93bihzZGxhX3QgKmNhcmQpCit7CisJcHBwX21ib3hfdCAqbWIgPSBjYXJkLT5tYm94OworCXBwcF9pbnRyX2luZm9fdCAqcHBwX2ludHJfZGF0YTsKKwlpbnQgZXJyOworCisJaWYgKCFtYil7CisJCXJldHVybiAxOworCX0KKwkKKwlwcHBfaW50cl9kYXRhID0gKHBwcF9pbnRyX2luZm9fdCAqKSAmbWItPmRhdGFbMF07CisJCisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCW1lbXNldCgmbWItPmNtZCwgMCwgc2l6ZW9mKHBwcF9jbWRfdCkpOworCXBwcF9pbnRyX2RhdGEtPmlfZW5hYmxlID0gMDsKKworCXBwcF9pbnRyX2RhdGEtPmlycSA9IGNhcmQtPmh3LmlycTsKKwltYi0+Y21kLmxlbmd0aCA9IDI7CisKKwltYi0+Y21kLmNvbW1hbmQgPSBQUFBfU0VUX0lOVFJfRkxBR1M7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwkvKiBEaXNhYmxlIGNvbW11bmljYXRpbm9ucyAqLworCW1lbXNldCgmbWItPmNtZCwgMCwgc2l6ZW9mKHBwcF9jbWRfdCkpOworCW1iLT5jbWQuY29tbWFuZCA9IFBQUF9DT01NX0RJU0FCTEU7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwljYXJkLT51LnAuY29tbV9lbmFibGVkID0gMDsKKworCXJldHVybiAwOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZXQgY29tbXVuaWNhdGlvbnMgZXJyb3Igc3RhdGlzdGljcy4KKyAqLworc3RhdGljIGludCBwcHBfZ2V0X2Vycl9zdGF0cyhzZGxhX3QgKmNhcmQpCit7CisJcHBwX21ib3hfdCAqbWIgPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltZW1zZXQoJm1iLT5jbWQsIDAsIHNpemVvZihwcHBfY21kX3QpKTsKKwltYi0+Y21kLmNvbW1hbmQgPSBQUFBfUkVBRF9FUlJPUl9TVEFUUzsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwkKKwlpZiAoZXJyID09IENNRF9PSykgeworCQkKKwkJcHBwX2Vycl9zdGF0c190KiBzdGF0cyA9ICh2b2lkKiltYi0+ZGF0YTsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X292ZXJfZXJyb3JzICAgID0gc3RhdHMtPnJ4X292ZXJydW47CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9jcmNfZXJyb3JzICAgICA9IHN0YXRzLT5yeF9iYWRfY3JjOworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfbWlzc2VkX2Vycm9ycyAgPSBzdGF0cy0+cnhfYWJvcnQ7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICA9IHN0YXRzLT5yeF9sb3N0OworCQljYXJkLT53YW5kZXYuc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSBzdGF0cy0+dHhfYWJvcnQ7CisJCisJfSBlbHNlIAorCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIHBhY2tldC4KKyAqCVJldHVybjoJMCAtIG8uay4KKyAqCQkxIC0gbm8gdHJhbnNtaXQgYnVmZmVycyBhdmFpbGFibGUKKyAqLworc3RhdGljIGludCBwcHBfc2VuZCAoc2RsYV90ICpjYXJkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIHByb3RvKQoreworCXBwcF9idWZfY3RsX3QgKnR4YnVmID0gY2FyZC0+dS5wLnR4YnVmOworCisJaWYgKHR4YnVmLT5mbGFnKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworCQorCXNkbGFfcG9rZSgmY2FyZC0+aHcsIHR4YnVmLT5idWYucHRyLCBkYXRhLCBsZW4pOworCisJdHhidWYtPmxlbmd0aCA9IGxlbjsJCS8qIGZyYW1lIGxlbmd0aCAqLworCQorCWlmIChwcm90byA9PSBodG9ucyhFVEhfUF9JUFgpKQorCQl0eGJ1Zi0+cHJvdG8gPSAweDAxOwkvKiBwcm90b2NvbCBJRCAqLworCWVsc2UKKwkJdHhidWYtPnByb3RvID0gMHgwMDsJLyogcHJvdG9jb2wgSUQgKi8KKwkKKwl0eGJ1Zi0+ZmxhZyA9IDE7CQkvKiBzdGFydCB0cmFuc21pc3Npb24gKi8KKworCS8qIFVwZGF0ZSB0cmFuc21pdCBidWZmZXIgY29udHJvbCBmaWVsZHMgKi8KKwljYXJkLT51LnAudHhidWYgPSArK3R4YnVmOworCisJaWYgKCh2b2lkKil0eGJ1ZiA+IGNhcmQtPnUucC50eGJ1Zl9sYXN0KQorCQljYXJkLT51LnAudHhidWYgPSBjYXJkLT51LnAudHhidWZfYmFzZTsKKworCXJldHVybiAwOworfQorCisvKioqKioqIEZpcm13YXJlIEVycm9yIEhhbmRsZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaXJtd2FyZSBlcnJvciBoYW5kbGVyLgorICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBmaXJtd2FyZSBjb21tYW5kIHJldHVybnMgbm9uLXplcm8KKyAqCXJldHVybiBjb2RlLgorICoKKyAqIFJldHVybiB6ZXJvIGlmIHByZXZpb3VzIGNvbW1hbmQgaGFzIHRvIGJlIGNhbmNlbGxlZC4KKyAqLworc3RhdGljIGludCBwcHBfZXJyb3Ioc2RsYV90ICpjYXJkLCBpbnQgZXJyLCBwcHBfbWJveF90ICptYikKK3sKKwl1bnNpZ25lZCBjbWQgPSBtYi0+Y21kLmNvbW1hbmQ7CisKKwlzd2l0Y2ggKGVycikgeworCisJCWNhc2UgQ01EX1RJTUVPVVQ6CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb21tYW5kIDB4JTAyWCB0aW1lZCBvdXQhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIGNtZCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbW1hbmQgMHglMDJYIHJldHVybmVkIDB4JTAyWCFcbiIKKwkJCQksIGNhcmQtPmRldm5hbWUsIGNtZCwgZXJyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKiBJbnRlcnJ1cHQgSGFuZGxlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUFBQIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIHdwcF9pc3IgKHNkbGFfdCAqY2FyZCkKK3sKKwlwcHBfZmxhZ3NfdCAqZmxhZ3MgPSBjYXJkLT5mbGFnczsKKwljaGFyICpwdHIgPSAmZmxhZ3MtPmlmbGFnOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCWludCBpOworCisJY2FyZC0+aW5faXNyID0gMTsKKwkrK2NhcmQtPnN0YXRpc3RpY3MuaXNyX2VudHJ5OworCisJaWYgKCFkZXYgJiYgZmxhZ3MtPmlmbGFnICE9IFBQUF9JTlRSX0NNRCl7CisJCWNhcmQtPmluX2lzciA9IDA7CisJCWZsYWdzLT5pZmxhZyA9IDA7CisJCXJldHVybjsKKwl9CisJCisJaWYgKHRlc3RfYml0KFBFUklfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisJCWNhcmQtPmluX2lzciA9IDA7CisJCWZsYWdzLT5pZmxhZyA9IDA7CisJCXJldHVybjsKKwl9CisJCisJCisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCQlpZiAodGVzdF9iaXQoU0VORF9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpIHsKKwkJCSsrY2FyZC0+c3RhdGlzdGljcy5pc3JfYWxyZWFkeV9jcml0aWNhbDsKKwkJCXByaW50ayAoS0VSTl9JTkZPICIlczogQ3JpdGljYWwgd2hpbGUgaW4gSVNSIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQljYXJkLT5pbl9pc3IgPSAwOworCQkJZmxhZ3MtPmlmbGFnID0gMDsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXN3aXRjaCAoZmxhZ3MtPmlmbGFnKSB7CisKKwkJY2FzZSBQUFBfSU5UUl9SWFJEWToJLyogcmVjZWl2ZSBpbnRlcnJ1cHQgIDB4MDEgIChiaXQgMCkqLworCQkJKytjYXJkLT5zdGF0aXN0aWNzLmlzcl9yeDsKKwkJCXJ4X2ludHIoY2FyZCk7CisJCQlicmVhazsKKworCQljYXNlIFBQUF9JTlRSX1RYUkRZOgkvKiB0cmFuc21pdCBpbnRlcnJ1cHQgIDB4MDIgKGJpdCAxKSovCisJCQkrK2NhcmQtPnN0YXRpc3RpY3MuaXNyX3R4OworCQkJZmxhZ3MtPmltYXNrICY9IH5QUFBfSU5UUl9UWFJEWTsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgUFBQX0lOVFJfQ01EOiAgICAgIC8qIGludGVyZmFjZSBjb21tYW5kIGNvbXBsZXRlZCAqLworCQkJKytJbnRyX3Rlc3RfY291bnRlcjsKKwkJCSsrY2FyZC0+c3RhdGlzdGljcy5pc3JfaW50cl90ZXN0OworCQkJYnJlYWs7CisKKwkJY2FzZSBQUFBfSU5UUl9NT0RFTTogICAgLyogbW9kZW0gc3RhdHVzIGNoYW5nZSAoRENELCBDVFMpIDB4MDQgKGJpdCAyKSovCisJCWNhc2UgUFBQX0lOVFJfRElTQzogIAkvKiBEYXRhIGxpbmsgZGlzY29ubmVjdGVkIDB4MTAgIChiaXQgNCkqLwkKKwkJY2FzZSBQUFBfSU5UUl9PUEVOOiAgIAkvKiBEYXRhIGxpbmsgb3BlbiAweDIwICAoYml0IDUpKi8KKwkJY2FzZSBQUFBfSU5UUl9EUk9QX0RUUjoJLyogRFRSIGRyb3AgdGltZW91dCBleHBpcmVkICAweDQwIGJpdCA2ICovCisJCQlldmVudF9pbnRyKGNhcmQpOworCQkJYnJlYWs7CisJCisJCWNhc2UgUFBQX0lOVFJfVElNRVI6CisJCQl0aW1lcl9pbnRyKGNhcmQpOworCQkJYnJlYWs7CSAKKworCQlkZWZhdWx0OgkvKiB1bmV4cGVjdGVkIGludGVycnVwdCAqLworCQkJKytjYXJkLT5zdGF0aXN0aWNzLmlzcl9zcHVyaW91czsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzcHVyaW91cyBpbnRlcnJ1cHQgMHglMDJYIVxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSwgZmxhZ3MtPmlmbGFnKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJRCBCeXRlcyA9ICIsY2FyZC0+ZGV2bmFtZSk7CisJIAkJZm9yKGkgPSAwOyBpIDwgODsgaSArKykKKwkJCQlwcmludGsoS0VSTl9JTkZPICIweCUwMlggIiwgKihwdHIgKyAweDI4ICsgaSkpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsJCisJfQorCQorCWNhcmQtPmluX2lzciA9IDA7CisJZmxhZ3MtPmlmbGFnID0gMDsKKwlyZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVjZWl2ZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgcnhfaW50cihzZGxhX3QgKmNhcmQpCit7CisJcHBwX2J1Zl9jdGxfdCAqcnhidWYgPSBjYXJkLT5yeG1iOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxlbjsKKwl2b2lkICpidWY7CisJaW50IGk7CisgICAgICAgIHBwcF9mbGFnc190ICpmbGFncyA9IGNhcmQtPmZsYWdzOworICAgICAgICBjaGFyICpwdHIgPSAmZmxhZ3MtPmlmbGFnOworCWludCB1ZHBfdHlwZTsKKwkKKworCWlmIChyeGJ1Zi0+ZmxhZyAhPSAweDAxKSB7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogY29ycnVwdGVkIFJ4IGJ1ZmZlciBAIDB4JVgsIGZsYWcgPSAweCUwMlghXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUsICh1bnNpZ25lZClyeGJ1ZiwgcnhidWYtPmZsYWcpOworCQorCQlwcmludGsoS0VSTl9JTkZPICIlczogSUQgQnl0ZXMgPSAiLGNhcmQtPmRldm5hbWUpOworCSAJCisJCWZvcihpID0gMDsgaSA8IDg7IGkgKyspCisJCQlwcmludGsoS0VSTl9JTkZPICIweCUwMlggIiwgKihwdHIgKyAweDI4ICsgaSkpOworCQlwcmludGsoS0VSTl9JTkZPICJcbiIpOwkKKwkJCisJCSsrY2FyZC0+c3RhdGlzdGljcy5yeF9pbnRyX2NvcnJ1cHRfcnhfYmZyOworCisKKwkJLyogQnVnIEZpeDogTWFyIDYgMjAwMAorICAgICAgICAgICAgICAgICAqIElmIHdlIGdldCBhIGNvcnJ1cHRlZCBtYWlsYm94LCBpdCBtZWFucyB0aGF0IGRyaXZlciAKKyAgICAgICAgICAgICAgICAgKiBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBmaXJtd2FyZS4gVGhlcmUgaXMgbm8gcmVjb3ZlcnkuCisgICAgICAgICAgICAgICAgICogSWYgd2UgZG9uJ3QgdHVybiBvZmYgYWxsIGludGVycnVwdHMgZm9yIHRoaXMgY2FyZAorICAgICAgICAgICAgICAgICAqIHRoZSBtYWNoaW5lIHdpbGwgY3Jhc2guIAorICAgICAgICAgICAgICAgICAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ3JpdGljYWwgcm91dGVyIGZhaWx1cmUgLi4uISEhXG4iLCBjYXJkLT5kZXZuYW1lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUGxlYXNlIGNvbnRhY3QgU2FuZ29tYSBUZWNobm9sb2dpZXMgIVxuIik7CisJCXBwcF9zZXRfaW50cl9tb2RlKGNhcmQsMCk7CisJCXJldHVybjsKKwl9CisgICAgICAKKwlpZiAoZGV2ICYmIG5ldGlmX3J1bm5pbmcoZGV2KSAmJiBkZXYtPnByaXYpeworCQorCQlsZW4gID0gcnhidWYtPmxlbmd0aDsKKwkJcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKworCQkvKiBBbGxvY2F0ZSBzb2NrZXQgYnVmZmVyICovCisJCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKworCQlpZiAoc2tiICE9IE5VTEwpIHsKKwkJCisJCQkvKiBDb3B5IGRhdGEgdG8gdGhlIHNvY2tldCBidWZmZXIgKi8KKwkJCXVuc2lnbmVkIGFkZHIgPSByeGJ1Zi0+YnVmLnB0cjsKKworCQkJaWYgKChhZGRyICsgbGVuKSA+IGNhcmQtPnUucC5yeF90b3AgKyAxKSB7CisJCQkKKwkJCQl1bnNpZ25lZCB0bXAgPSBjYXJkLT51LnAucnhfdG9wIC0gYWRkciArIDE7CisJCQkJYnVmID0gc2tiX3B1dChza2IsIHRtcCk7CisJCQkJc2RsYV9wZWVrKCZjYXJkLT5odywgYWRkciwgYnVmLCB0bXApOworCQkJCWFkZHIgPSBjYXJkLT51LnAucnhfYmFzZTsKKwkJCQlsZW4gLT0gdG1wOworCQkJfQorCQkJYnVmID0gc2tiX3B1dChza2IsIGxlbik7CisJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBhZGRyLCBidWYsIGxlbik7CisKKwkJCS8qIERlY2Fwc3VsYXRlIHBhY2tldCAqLworICAgICAgICAJCXN3aXRjaCAocnhidWYtPnByb3RvKSB7CisJCisJCQkJY2FzZSAweDAwOgorCQkJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMHgwMToKKwkJCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQWCk7CisJCQkJCWJyZWFrOworCQkJfQorCisJCQl1ZHBfdHlwZSA9IHVkcF9wa3RfdHlwZSggc2tiLCBjYXJkICk7CisKKwkJCWlmICh1ZHBfdHlwZSA9PSBVRFBfUFRQSVBFX1RZUEUpeworCisJCQkJLyogSGFuZGxlIGEgVURQIFJlcXVlc3QgaW4gVGltZXIgSW50ZXJydXB0ICovCisJCQkJaWYoc3RvcmVfdWRwX21nbXRfcGt0KFVEUF9QS1RfRlJNX05FVFdPUkssIGNhcmQsIHNrYiwgZGV2LAorICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJCXBwcF9wcml2X2FyZWEpKXsKKwkgICAgICAgICAgICAgICAJCQlmbGFncy0+aW1hc2sgfD0gUFBQX0lOVFJfVElNRVI7CisJCQkJfQorCQkJCSsrcHBwX3ByaXZfYXJlYS0+cnhfaW50cl9zdGF0LnJ4X2ludHJfUElQRV9yZXF1ZXN0OworCisKKwkJCX0gZWxzZSBpZiAoaGFuZGxlX0lQWFdBTihza2ItPmRhdGEsY2FyZC0+ZGV2bmFtZSwgCisJCQkJCQkgcHBwX3ByaXZfYXJlYS0+ZW5hYmxlX0lQWCwgCisJCQkJCQkgcHBwX3ByaXZfYXJlYS0+bmV0d29ya19udW1iZXIsIAorCQkJCQkJIHNrYi0+cHJvdG9jb2wpKSB7CisJCQkKKwkJCQkvKiBIYW5kbGUgYW4gSVBYV0FOIHBhY2tldCAqLworCQkJCWlmKCBwcHBfcHJpdl9hcmVhLT5lbmFibGVfSVBYKSB7CisJCQkJCQorCQkJCQkvKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCBhbHJlYWR5IHNlbmRpbmcgKi8KKwkJCQkJaWYgKCF0ZXN0X2JpdChTRU5EX0NSSVQsICZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJCQkJIAlwcHBfc2VuZChjYXJkLCBza2ItPmRhdGEsIHNrYi0+bGVuLCBodG9ucyhFVEhfUF9JUFgpKTsKKwkJCQkJfQorCQkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCisJCQkJfSBlbHNlIHsKKwkJCQkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIFBhc3MgZGF0YSB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgKi8KKwkgICAgCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKworCQkJICAgIAkrK2NhcmQtPndhbmRldi5zdGF0cy5yeF9wYWNrZXRzOworCQkJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJICAgIAkJKytwcHBfcHJpdl9hcmVhLT5yeF9pbnRyX3N0YXQucnhfaW50cl9iZnJfcGFzc2VkX3RvX3N0YWNrOwkKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBzb2NrZXQgYnVmZmVycyBhdmFpbGFibGUhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCX0KKwkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQkrK3BwcF9wcml2X2FyZWEtPnJ4X2ludHJfc3RhdC5yeF9pbnRyX25vX3NvY2tldDsKKwkJfQorCisJfSBlbHNlIHsKKwkJKytjYXJkLT5zdGF0aXN0aWNzLnJ4X2ludHJfZGV2X25vdF9zdGFydGVkOworCX0KKworCS8qIFJlbGVhc2UgYnVmZmVyIGVsZW1lbnQgYW5kIGNhbGN1bGF0ZSBhIHBvaW50ZXIgdG8gdGhlIG5leHQgb25lICovCisJcnhidWYtPmZsYWcgPSAweDAwOworCWNhcmQtPnJ4bWIgPSArK3J4YnVmOworCWlmICgodm9pZCopcnhidWYgPiBjYXJkLT51LnAucnhidWZfbGFzdCkKKwkJY2FyZC0+cnhtYiA9IGNhcmQtPnUucC5yeGJ1Zl9iYXNlOworfQorCisKK3ZvaWQgZXZlbnRfaW50ciAoc2RsYV90ICpjYXJkKQoreworCisgCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworICAgICAgICBwcHBfcHJpdmF0ZV9hcmVhX3QqIHBwcF9wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJdm9sYXRpbGUgcHBwX2ZsYWdzX3QgKmZsYWdzID0gY2FyZC0+ZmxhZ3M7CisKKwlzd2l0Y2ggKGZsYWdzLT5pZmxhZyl7CisKKwkJY2FzZSBQUFBfSU5UUl9NT0RFTTogICAgLyogbW9kZW0gc3RhdHVzIGNoYW5nZSAoRENELCBDVFMpIDB4MDQgIChiaXQgMikqLworCisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKXsKKwkJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IE1vZGVtIHN0YXR1czogRENEPSVzIENUUz0lc1xuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSwgRENEKGZsYWdzLT5tc3RhdHVzKSwgQ1RTKGZsYWdzLT5tc3RhdHVzKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFBQUF9JTlRSX0RJU0M6ICAJLyogRGF0YSBsaW5rIGRpc2Nvbm5lY3RlZCAweDEwICAoYml0IDQpKi8JCisKKwkJCU5FWF9QUklOVEsgKEtFUk5fSU5GTyAiRGF0YSBsaW5rIGRpc2Nvbm5lY3RlZCBpbnRyIENhdXNlICVYXG4iLAorCQkJCQkgICAgICAgZmxhZ3MtPmRpc2NfY2F1c2UpOworCisJCQlpZiAoZmxhZ3MtPmRpc2NfY2F1c2UgJgorCQkJCShQUFBfTE9DQUxfVEVSTUlOQVRJT04gfCBQUFBfRENEX0NUU19EUk9QIHwKKwkJCQlQUFBfUkVNT1RFX1RFUk1JTkFUSU9OKSkgeworCisJCQkJaWYgKGNhcmQtPnUucC5pcF9tb2RlID09IFdBTk9QVF9QUFBfUEVFUikgeyAKKwkJCQkJc2V0X2JpdCgwLCZSZWFkX2Nvbm5lY3Rpb25faW5mbyk7CisJCQkJfQorCQkJCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCisJCQkJc2hvd19kaXNjX2NhdXNlKGNhcmQsIGZsYWdzLT5kaXNjX2NhdXNlKTsKKwkJCQlwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfUFBQX0VWRU5UOworCQkJCWZsYWdzLT5pbWFzayB8PSBQUFBfSU5UUl9USU1FUjsKKwkJCQl0cmlnZ2VyX3BwcF9wb2xsKGRldik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFBQUF9JTlRSX09QRU46ICAgCS8qIERhdGEgbGluayBvcGVuIDB4MjAgIChiaXQgNSkqLworCisJCQlORVhfUFJJTlRLIChLRVJOX0lORk8gIiVzOiBQUFAgTGluayBPcGVuLCBMQ1A9JXMgSVA9JXNcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsTENQKGZsYWdzLT5sY3Bfc3RhdGUpLAorCQkJCQlJUChmbGFncy0+aXBfc3RhdGUpKTsKKworCQkJaWYgKGZsYWdzLT5sY3Bfc3RhdGUgPT0gMHgwOSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncy0+aXBfc3RhdGUgPT0gMHgwOSB8fCBmbGFncy0+aXB4X3N0YXRlID09IDB4MDkpKXsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwb2xsaW5nIHRpbWVyIGFuZCBzZXQgdGhlIHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIFdBTl9DT05OTkVDVEVEICovCisKKworCQkJCS8qIEJVRyBGSVg6IFdoZW4gdGhlIHByb3RvY29sIHJlc3RhcnRzLCBkdXJpbmcgaGVhdnkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRyYWZmaWMsIGJvYXJkIHR4IGJ1ZmZlcnMgYW5kIGRyaXZlciB0eCBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNhbiBnbyBvdXQgb2Ygc3luYy4gIFRoaXMgY2hlY2tzIHRoZSBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGlmIHRoZSB0eCBidWZmZXJzIGFyZSBvdXQgb2Ygc3luYywgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwcm90b2NvbHMgYXJlIHJlc3RhcnRlZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEkgZG9uJ3Qga25vdyB3aHkgdGhlIGJvYXJkIHR4IGJ1ZmZlciBpcyBvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2Ygc3luYy4gSXQgY291bGQgYmUgdGhhdCBhIHBhY2tldHMgaXMgdHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2hpbGUgdGhlIGxpbmsgaXMgZG93biwgYnV0IHRoYXQgaXMgbm90IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwb3NzaWJsZS4gVGhlIG90aGVyIHBvc3NpYmxpbGl0eSBpcyB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmaXJtd2FyZSBkb2Vzbid0IHJlaW5pdGlhbGl6ZSBwcm9wZXJseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRklYTUU6IEEgYmV0dGVyIGZpeCBzaG91bGQgYmUgZm91bmQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKKwkJCQlpZiAoZGV0ZWN0X2FuZF9maXhfdHhfYnVnKGNhcmQpKXsKKworCQkJCQlwcHBfY29tbV9kaXNhYmxlKGNhcmQpOworCisJCQkJCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCisJCQkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkIHw9IAorCQkJCQkJVE1SX0lOVF9FTkFCTEVEX1BQUF9FVkVOVDsKKwkJCQkJZmxhZ3MtPmltYXNrIHw9IFBQUF9JTlRSX1RJTUVSOworCQkJCQlicmVhazsJCisJCQkJfQorCisJCQkJY2FyZC0+c3RhdGVfdGljayA9IGppZmZpZXM7CisJCQkJd2FucGlwZV9zZXRfc3RhdGUoY2FyZCwgV0FOX0NPTk5FQ1RFRCk7CisKKwkJCQlORVhfUFJJTlRLKEtFUk5fSU5GTyAiQ09OOiBMIFR4OiAlbHggIEIgVHg6ICVseCB8fCBMIFJ4ICVseCBCIFJ4ICVseFxuIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpY2FyZC0+dS5wLnR4YnVmLCAqY2FyZC0+dS5wLnR4YnVmX25leHQsCisJCQkJCSh1bnNpZ25lZCBsb25nKWNhcmQtPnJ4bWIsICpjYXJkLT51LnAucnhidWZfbmV4dCk7CisKKwkJCQkvKiBUZWxsIHRpbWVyIGludGVycnVwdCB0aGF0IFBQUCBldmVudCBvY2N1cnJlZCAqLworCQkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9QUFBfRVZFTlQ7CisJCQkJZmxhZ3MtPmltYXNrIHw9IFBQUF9JTlRSX1RJTUVSOworCisJCQkJLyogSWYgd2UgYXJlIGluIFBFRVIgbW9kZSwgd2UgbXVzdCBmaXJzdCBvYnRhaW4gdGhlCisJCQkJICogSVAgaW5mb3JtYXRpb24gYW5kIHRoZW4gZ28gaW50byB0aGUgcG9sbCByb3V0aW5lICovCisJCQkJaWYgKGNhcmQtPnUucC5pcF9tb2RlICE9IFdBTk9QVF9QUFBfUEVFUil7CQorCQkJCQl0cmlnZ2VyX3BwcF9wb2xsKGRldik7CisJCQkJfQorCQkJfQorICAgICAgICAgICAgICAgICAgIAlicmVhazsKKworCQljYXNlIFBQUF9JTlRSX0RST1BfRFRSOgkJLyogRFRSIGRyb3AgdGltZW91dCBleHBpcmVkICAweDQwIGJpdCA2ICovCisKKwkJCU5FWF9QUklOVEsoS0VSTl9JTkZPICJEVFIgRHJvcCBUaW1lb3V0IEludGVycnJ1cHQgXG4iKTsgCisKKwkJCWlmIChjYXJkLT51LnAuaXBfbW9kZSA9PSBXQU5PUFRfUFBQX1BFRVIpIHsgCisJCQkJc2V0X2JpdCgwLCZSZWFkX2Nvbm5lY3Rpb25faW5mbyk7CisJCQl9CisJCQorCQkJd2FucGlwZV9zZXRfc3RhdGUoY2FyZCwgV0FOX0RJU0NPTk5FQ1RFRCk7CisKKwkJCXNob3dfZGlzY19jYXVzZShjYXJkLCBmbGFncy0+ZGlzY19jYXVzZSk7CisJCQlwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfUFBQX0VWRU5UOworCQkJZmxhZ3MtPmltYXNrIHw9IFBQUF9JTlRSX1RJTUVSOworCQkJdHJpZ2dlcl9wcHBfcG9sbChkZXYpOworCQkJYnJlYWs7CisJCQorCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVycm9yLCBJbnZhbGlkIFBQUCBFdmVudFxuIixjYXJkLT5kZXZuYW1lKTsKKwl9Cit9CisKKworCisvKiBUSU1FUiBJTlRFUlJVUFQgKi8KKwordm9pZCB0aW1lcl9pbnRyIChzZGxhX3QgKmNhcmQpCit7CisKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UqIGRldiA9IGNhcmQtPndhbmRldi5kZXY7CisgICAgICAgIHBwcF9wcml2YXRlX2FyZWFfdCogcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlwcHBfZmxhZ3NfdCAqZmxhZ3MgPSBjYXJkLT5mbGFnczsKKworCisJaWYgKHBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX0NPTkZJRyl7CisJCWlmICghY29uZmlnX3BwcChjYXJkKSl7CisJCQlwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPSAKKwkJCQkJflRNUl9JTlRfRU5BQkxFRF9DT05GSUc7CQorCQl9CisJfQorCisJLyogVXBkYXRlIHN0YXRpc3RpY3MgKi8KKwlpZiAocHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVVBEQVRFKXsKKwkJcHBwX2dldF9lcnJfc3RhdHMoY2FyZCk7CisgICAgICAgICAgICAgICAgaWYoISgtLXBwcF9wcml2X2FyZWEtPnVwZGF0ZV9jb21tc19zdGF0cykpeworCQkJcHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJj0gCisJCQkJflRNUl9JTlRfRU5BQkxFRF9VUERBVEU7CisJCX0KKwl9CisKKwkvKiBQUElQRU1PTiBVRFAgcmVxdWVzdCAqLworCisJaWYgKHBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1VEUCl7CisJCXByb2Nlc3NfdWRwX21nbXRfcGt0KGNhcmQsZGV2LCBwcHBfcHJpdl9hcmVhKTsKKwkJcHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9VRFA7CisJfQorCisJLyogUFBQIEV2ZW50ICovCisJaWYgKHBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1BQUF9FVkVOVCl7CisKKwkJaWYgKGNhcmQtPndhbmRldi5zdGF0ZSA9PSBXQU5fRElTQ09OTkVDVEVEKXsKKwkJCXJldHJpZ2dlcl9jb21tKGNhcmQpOworCQl9CisKKwkJLyogSWYgdGhlIHN0YXRlIGlzIENPTk5FQ1RJTkcsIGl0IG1lYW5zIHRoYXQgY29tbXVuaWNhdGlucyB3ZXJlCisJIAkgKiBlbmFibGVkLiBXaGVuIHRoZSByZW1vdGUgc2lkZSBlbmFibGVzIGl0cyBjb21taW5pY2F0aW9uIHdlCisJIAkgKiBzaG91bGQgZ2V0IGFuIGludGVycnVwdCBQUFBfSU5UUl9PUEVOLCB0aHVzIHR1cm4gb2ZmIHBvbGxpbmcgCisJCSAqLworCisJCWVsc2UgaWYgKGNhcmQtPndhbmRldi5zdGF0ZSA9PSBXQU5fQ09OTkVDVElORyl7CisJCQkvKiBUdXJuIG9mZiB0aGUgdGltZXIgaW50ZXJydXB0ICovCisJCQlwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX1BQUF9FVkVOVDsKKwkJfQorCisJCS8qIElmIHN0YXRlIGlzIGNvbm5lY3RlZCBhbmQgd2UgYXJlIGluIFBFRVIgbW9kZSAKKwkgCSAqIHBvbGwgZm9yIGFuIElQIGFkZHJlc3Mgd2hpY2ggd2lsbCBiZSBwcm92aWRlZCBieSByZW1vdGUgZW5kLgorCSAJICovCisJCWVsc2UgaWYgKChjYXJkLT53YW5kZXYuc3RhdGUgPT0gV0FOX0NPTk5FQ1RFRCAmJiAKKwkJICAJICBjYXJkLT51LnAuaXBfbW9kZSA9PSBXQU5PUFRfUFBQX1BFRVIpICYmIAorCQkgIAkgIHRlc3RfYml0KDAsJlJlYWRfY29ubmVjdGlvbl9pbmZvKSl7CisKKwkJCWNhcmQtPnN0YXRlX3RpY2sgPSBqaWZmaWVzOworCQkJaWYgKHJlYWRfY29ubmVjdGlvbl9pbmZvIChjYXJkKSl7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byByZWFkIFBFRVIgSVAgQWRkcmVzc2VzXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCX1lbHNleworCQkJCWNsZWFyX2JpdCgwLCZSZWFkX2Nvbm5lY3Rpb25faW5mbyk7CisJCQkJc2V0X2JpdCgxLCZSZWFkX2Nvbm5lY3Rpb25faW5mbyk7CisJCQkJdHJpZ2dlcl9wcHBfcG9sbChkZXYpOworCQkJfQorCQl9ZWxzZXsKKwkJCS8vRklYTUUgUHV0IHRoZSBjb21tZW50IGJhY2sgaW50CisJCQlwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX1BQUF9FVkVOVDsKKwkJfQorCisJfS8qIEVuZCBvZiBQUFBfRVZFTlQgKi8KKworCisJLyogT25seSBkaXNhYmxlIHRoZSB0aW1lciBpbnRlcnJ1cHQgaWYgdGhlcmUgYXJlIG5vIHVkcCwgc3RhdGlzdGljICovCisJLyogdXBkYXRlcyBvciBldmVudHMgcGVuZGluZyAqLworICAgICAgICBpZighcHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBmbGFncy0+aW1hc2sgJj0gflBQUF9JTlRSX1RJTUVSOworICAgICAgICB9Cit9CisKKworc3RhdGljIGludCBoYW5kbGVfSVBYV0FOKHVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQsIGNoYXIgKmRldm5hbWUsIHVuc2lnbmVkIGNoYXIgZW5hYmxlX0lQWCwgdW5zaWduZWQgbG9uZyBuZXR3b3JrX251bWJlciwgdW5zaWduZWQgc2hvcnQgcHJvdG8pCit7CisJaW50IGk7CisKKwlpZiggcHJvdG8gPT0gaHRvbnMoRVRIX1BfSVBYKSApIHsKKwkJLy9JdCdzIGFuIElQWCBwYWNrZXQKKwkJaWYoIWVuYWJsZV9JUFgpIHsKKwkJCS8vUmV0dXJuIDEgc28gd2UgZG9uJ3QgcGFzcyBpdCB1cCB0aGUgc3RhY2suCisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8vSXQncyBub3QgSVBYIHNvIHBhc3MgaXQgdXAgdGhlIHN0YWNrLgorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiggc2VuZHBhY2tldFsxNl0gPT0gMHg5MCAmJgorCSAgICBzZW5kcGFja2V0WzE3XSA9PSAweDA0KQorCXsKKwkJLy9JdCdzIElQWFdBTgorCisJCWlmKCBzZW5kcGFja2V0WzJdID09IDB4MDIgJiYKKwkJICAgIHNlbmRwYWNrZXRbMzRdID09IDB4MDApCisJCXsKKwkJCS8vSXQncyBhIHRpbWVyIHJlcXVlc3QgcGFja2V0CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjZWl2ZWQgSVBYV0FOIFRpbWVyIFJlcXVlc3QgcGFja2V0XG4iLGRldm5hbWUpOworCisJCQkvL0dvIHRocm91Z2ggdGhlIHJvdXRpbmcgb3B0aW9ucyBhbmQgYW5zd2VyIG5vIHRvIGV2ZXJ5CisJCQkvL29wdGlvbiBleGNlcHQgVW5udW1iZXJlZCBSSVAvU0FQCisJCQlmb3IoaSA9IDQxOyBzZW5kcGFja2V0W2ldID09IDB4MDA7IGkgKz0gNSkKKwkJCXsKKwkJCQkvLzB4MDIgaXMgdGhlIG9wdGlvbiBmb3IgVW5udW1iZXJlZCBSSVAvU0FQCisJCQkJaWYoIHNlbmRwYWNrZXRbaSArIDRdICE9IDB4MDIpCisJCQkJeworCQkJCQlzZW5kcGFja2V0W2kgKyAxXSA9IDA7CisJCQkJfQorCQkJfQorCisJCQkvL1NraXAgb3ZlciB0aGUgZXh0ZW5kZWQgTm9kZSBJRCBvcHRpb24KKwkJCWlmKCBzZW5kcGFja2V0W2ldID09IDB4MDQgKQorCQkJeworCQkJCWkgKz0gODsKKwkJCX0KKworCQkJLy9XZSBhbHNvIHdhbnQgdG8gdHVybiBvZmYgYWxsIGhlYWRlciBjb21wcmVzc2lvbiBvcHQuCisJCQlmb3IoOyBzZW5kcGFja2V0W2ldID09IDB4ODAgOykKKwkJCXsKKwkJCQlzZW5kcGFja2V0W2kgKyAxXSA9IDA7CisJCQkJaSArPSAoc2VuZHBhY2tldFtpICsgMl0gPDwgOCkgKyAoc2VuZHBhY2tldFtpICsgM10pICsgNDsKKwkJCX0KKworCQkJLy9TZXQgdGhlIHBhY2tldCB0eXBlIHRvIHRpbWVyIHJlc3BvbnNlCisJCQlzZW5kcGFja2V0WzM0XSA9IDB4MDE7CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZW5kaW5nIElQWFdBTiBUaW1lciBSZXNwb25zZVxuIixkZXZuYW1lKTsKKwkJfQorCQllbHNlIGlmKCBzZW5kcGFja2V0WzM0XSA9PSAweDAyICkKKwkJeworCQkJLy9UaGlzIGlzIGFuIGluZm9ybWF0aW9uIHJlcXVlc3QgcGFja2V0CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjZWl2ZWQgSVBYV0FOIEluZm9ybWF0aW9uIFJlcXVlc3QgcGFja2V0XG4iLGRldm5hbWUpOworCisJCQkvL1NldCB0aGUgcGFja2V0IHR5cGUgdG8gaW5mb3JtYXRpb24gcmVzcG9uc2UKKwkJCXNlbmRwYWNrZXRbMzRdID0gMHgwMzsKKworCQkJLy9TZXQgdGhlIHJvdXRlciBuYW1lCisJCQlzZW5kcGFja2V0WzUxXSA9ICdQJzsKKwkJCXNlbmRwYWNrZXRbNTJdID0gJ1QnOworCQkJc2VuZHBhY2tldFs1M10gPSAnUCc7CisJCQlzZW5kcGFja2V0WzU0XSA9ICdJJzsKKwkJCXNlbmRwYWNrZXRbNTVdID0gJ1AnOworCQkJc2VuZHBhY2tldFs1Nl0gPSAnRSc7CisJCQlzZW5kcGFja2V0WzU3XSA9ICctJzsKKwkJCXNlbmRwYWNrZXRbNThdID0gQ1ZIZXhUb0FzY2lpKG5ldHdvcmtfbnVtYmVyID4+IDI4KTsKKwkJCXNlbmRwYWNrZXRbNTldID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MEYwMDAwMDApPj4gMjQpOworCQkJc2VuZHBhY2tldFs2MF0gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMEYwMDAwMCk+PiAyMCk7CisJCQlzZW5kcGFja2V0WzYxXSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDAwMEYwMDAwKT4+IDE2KTsKKwkJCXNlbmRwYWNrZXRbNjJdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMEYwMDApPj4gMTIpOworCQkJc2VuZHBhY2tldFs2M10gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwMEYwMCk+PiA4KTsKKwkJCXNlbmRwYWNrZXRbNjRdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwRjApPj4gNCk7CisJCQlzZW5kcGFja2V0WzY1XSA9IENWSGV4VG9Bc2NpaShuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwMEYpOworCQkJZm9yKGkgPSA2NjsgaSA8IDk5OyBpKz0gMSkKKwkJCXsKKwkJCQlzZW5kcGFja2V0W2ldID0gMDsKKwkJCX0KKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNlbmRpbmcgSVBYV0FOIEluZm9ybWF0aW9uIFJlc3BvbnNlIHBhY2tldFxuIixkZXZuYW1lKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmtub3duIElQWFdBTiBwYWNrZXQhXG4iLGRldm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvL1NldCB0aGUgV05vZGVJRCB0byBvdXIgbmV0d29yayBhZGRyZXNzCisJCXNlbmRwYWNrZXRbMzVdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyID4+IDI0KTsKKwkJc2VuZHBhY2tldFszNl0gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgMHgwMEZGMDAwMCkgPj4gMTYpOworCQlzZW5kcGFja2V0WzM3XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAweDAwMDBGRjAwKSA+PiA4KTsKKwkJc2VuZHBhY2tldFszOF0gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgJiAweDAwMDAwMEZGKTsKKworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQkvL0lmIHdlIGdldCBoZXJlIGl0J3MgYW4gSVBYLWRhdGEgcGFja2V0LCBzbyBpdCdsbCBnZXQgcGFzc2VkIHVwIHRoZSBzdGFjay4KKworCQkvL3N3aXRjaCB0aGUgbmV0d29yayBudW1iZXJzCisJCXN3aXRjaF9uZXRfbnVtYmVycyhzZW5kcGFja2V0LCBuZXR3b3JrX251bWJlciwgMSk7CQorCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qKioqKiogQmFja2dyb3VuZCBQb2xsaW5nIFJvdXRpbmVzICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBbGwgcG9sbGluZyBmdW5jdGlvbnMgYXJlIGludm9rZWQgYnkgdGhlIFRJTUVSIGludGVycnVwdCBpbiB0aGUgd3BwX2lzciAKKyAqIHJvdXRpbmUuICAKKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE1vbml0b3IgYWN0aXZlIGxpbmsgcGhhc2UuCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3Nfcm91dGUgKHNkbGFfdCAqY2FyZCkKK3sKKwlwcHBfZmxhZ3NfdCAqZmxhZ3MgPSBjYXJkLT5mbGFnczsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJCisJaWYgKChjYXJkLT51LnAuaXBfbW9kZSA9PSBXQU5PUFRfUFBQX1BFRVIpICYmCisJICAgIChmbGFncy0+aXBfc3RhdGUgPT0gMHgwOSkpeyAKKworCQkvKiBXZSBnZXQgaXBfbG9jYWwgZnJvbSB0aGUgZmlybXdhcmUgaW4gUEVFUiBtb2RlLgorCSAgICAgICAgICogVGhlcmVmb3JlLCBpZiBpcF9sb2NhbCBpcyAwLCB3ZSBmYWlsZWQgdG8gb2J0YWluCisgICAgICAgICAJICogdGhlIHJlbW90ZSBJUCBhZGRyZXNzLiAqLworCQlpZiAocHBwX3ByaXZfYXJlYS0+aXBfbG9jYWwgPT0gMCkgCisJCQlyZXR1cm47CisJCQorCQlwcmludGsoS0VSTl9JTkZPICIlczogSVBDUCBTdGF0ZSBPcGVuZWQuXG4iLCBjYXJkLT5kZXZuYW1lKTsKKwkJaWYgKHJlYWRfaW5mbyggY2FyZCApKSB7CisgICAJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogQW4gZXJyb3Igb2NjdXJyZWQgaW4gSVAgYXNzaWdubWVudC5cbiIsIAorCQkJCWNhcmQtPmRldm5hbWUpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisJCQlpZiAoaW5fZGV2ICE9IE5VTEwgKSB7CisJCQkJc3RydWN0IGluX2lmYWRkciAqaWZhID0gaW5fZGV2LT5pZmFfbGlzdDsKKworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBc3NpZ25lZCBMY2wuIEFkZHI6ICV1LiV1LiV1LiV1XG4iLCAKKwkJCQkJY2FyZC0+ZGV2bmFtZSwgTklQUVVBRChpZmEtPmlmYV9sb2NhbCkpOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBc3NpZ25lZCBSbXQuIEFkZHI6ICV1LiV1LiV1LiV1XG4iLCAKKwkJCQkJCWNhcmQtPmRldm5hbWUsIE5JUFFVQUQoaWZhLT5pZmFfYWRkcmVzcykpOworCQkJfWVsc2V7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IEVycm9yOiBGYWlsZWQgdG8gYWRkIGEgcm91dGUgZm9yIFBQUCBpbnRlcmZhY2UgJXNcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsZGV2LT5uYW1lKTsJCisJCQl9CisJCX0KKwl9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTW9uaXRvciBwaHlzaWNhbCBsaW5rIGRpc2Nvbm5lY3RlZCBwaGFzZS4KKyAqICBvIGlmIGludGVyZmFjZSBpcyB1cCBhbmQgdGhlIGhvbGQtZG93biB0aW1lb3V0IGhhcyBleHBpcmVkLCB0aGVuIHJldHJ5CisgKiAgICBjb25uZWN0aW9uLgorICovCitzdGF0aWMgdm9pZCByZXRyaWdnZXJfY29tbShzZGxhX3QgKmNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNhcmQtPndhbmRldi5kZXY7CisKKwlpZiAoZGV2ICYmICgoamlmZmllcyAtIGNhcmQtPnN0YXRlX3RpY2spID4gSE9MRF9ET1dOX1RJTUUpKSB7CisKKwkJd2FucGlwZV9zZXRfc3RhdGUoY2FyZCwgV0FOX0NPTk5FQ1RJTkcpOworCisJCWlmKHBwcF9jb21tX2VuYWJsZShjYXJkKSA9PSBDTURfT0speworCQkJaW5pdF9wcHBfdHhfcnhfYnVmZiggY2FyZCApOworCQl9CSAgICAgICAgIAorCX0KK30KKworLyoqKioqKiBNaXNjZWxsYW5lb3VzIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29uZmlndXJlIFM1MDggYWRhcHRlci4KKyAqLworc3RhdGljIGludCBjb25maWc1MDgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2RsYV90ICpjYXJkKQoreworCXBwcDUwOF9jb25mX3QgY2ZnOworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IGRldi0+aXBfcHRyOworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKworCS8qIFByZXBhcmUgUFBQIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCisJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihwcHA1MDhfY29uZl90KSk7CisKKwlpZiAoY2FyZC0+d2FuZGV2LmNsb2NraW5nKQorCQljZmcubGluZV9zcGVlZCA9IGNhcmQtPndhbmRldi5icHM7CisKKwlpZiAoY2FyZC0+d2FuZGV2LmludGVyZmFjZSA9PSBXQU5PUFRfUlMyMzIpCisJCWNmZy5jb25mX2ZsYWdzIHw9IElOVEVSRkFDRV9MRVZFTF9SUzIzMjsKKworCisgICAgICAgIGNmZy5jb25mX2ZsYWdzIAl8PSBET05UX1RFUk1JTkFURV9MTktfTUFYX0NPTkZJRzsgLypzZW5kIENvbmZpZ3VyZS1SZXF1ZXN0IHBhY2tldHMgZm9yZXZlciovCisJY2ZnLnR4YnVmX3BlcmNlbnQJPSBQRVJDRU5UX1RYX0JVRkY7CS8qICUgb2YgVHggYnVmcyAqLworCWNmZy5tdHVfbG9jYWwJCT0gY2FyZC0+d2FuZGV2Lm10dTsKKwljZmcubXR1X3JlbW90ZQkJPSBjYXJkLT53YW5kZXYubXR1OyAgICAgICAgICAgICAgICAgIC8qICAgIERlZmF1bHQgICAqLworCWNmZy5yZXN0YXJ0X3RtcgkJPSBUSU1FX0JFVFdFRU5fQ09ORl9SRVE7ICAJICAgICAvKiAgICAzMCA9IDNzZWMgKi8KKwljZmcuYXV0aF9yc3J0X3Rtcgk9IFRJTUVfQkVUV0VFTl9QQVBfQ0hBUF9SRVE7ICAgICAgICAgLyogICAgMzAgPSAzc2VjICovCisJY2ZnLmF1dGhfd2FpdF90bXIJPSBXQUlUX1BBUF9DSEFQX1dJVEhPVVRfUkVQTFk7ICAgICAgIC8qICAgMzAwID0gMzBzICAqLworCWNmZy5tZG1fZmFpbF90bXIJPSBXQUlUX0FGVEVSX0RDRF9DVFNfTE9XOyAgICAgICAgICAgIC8qICAgICA1ID0gMC41cyAqLworCWNmZy5kdHJfZHJvcF90bXIJPSBUSU1FX0RDRF9DVFNfTE9XX0FGVEVSX0xOS19ET1dOOyAgIC8qICAgIDEwID0gMXMgICAqLworCWNmZy5jb25uZWN0X3Rtb3V0CT0gV0FJVF9EQ0RfSElHSF9BRlRFUl9FTkFCTEVfQ09NTTsgICAvKiAgIDkwMCA9IDkwcyAgKi8KKwljZmcuY29uZl9yZXRyeQkJPSBNQVhfQ09ORl9SRVFfV0lUSE9VVF9SRVBMWTsgICAgICAgIC8qICAgIDEwID0gMXMgICAqLworCWNmZy50ZXJtX3JldHJ5CQk9IE1BWF9URVJNX1JFUV9XSVRIT1VUX1JFUExZOwkgICAgIC8qICAgICAyIHRpbWVzICAqLworCWNmZy5mYWlsX3JldHJ5CQk9IE5VTV9DT05GX05BS19XSVRIT1VUX1JFUExZOyAgICAgICAgLyogICAgIDUgdGltZXMgICovCisJY2ZnLmF1dGhfcmV0cnkJCT0gTlVNX0FVVEhfUkVRX1dJVEhPVVRfUkVQTFk7ICAgICAgICAvKiAgICAgMTAgdGltZXMgKi8gICAKKworCisJaWYoICFjYXJkLT51LnAuYXV0aGVudGljYXRvciApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERldmljZSBpcyBub3QgY29uZmlndXJlZCBhcyBhbiBhdXRoZW50aWNhdG9yXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJY2ZnLmF1dGhfb3B0aW9ucyA9IE5PX0FVVEhFTlRJQ0FUSU9OOworCX1lbHNleworCQlwcmludGsoS0VSTl9JTkZPICIlczogRGV2aWNlIGlzIGNvbmZpZ3VyZWQgYXMgYW4gYXV0aGVudGljYXRvclxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCWNmZy5hdXRoX29wdGlvbnMgPSBJTkJPVU5EX0FVVEg7CisJfQorCisJaWYoIHBwcF9wcml2X2FyZWEtPnBhcCA9PSBXQU5PUFRfWUVTKXsKKwkJY2ZnLmF1dGhfb3B0aW9ucyB8PVBBUF9BVVRIOworCQlwcmludGsoS0VSTl9JTkZPICIlczogUGFwIGVuYWJsZWRcbiIsIGNhcmQtPmRldm5hbWUpOworCX0KKwlpZiggcHBwX3ByaXZfYXJlYS0+Y2hhcCA9PSBXQU5PUFRfWUVTKXsKKwkJY2ZnLmF1dGhfb3B0aW9ucyB8PSBDSEFQX0FVVEg7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDaGFwIGVuYWJsZWRcbiIsIGNhcmQtPmRldm5hbWUpOworCX0KKworCisJaWYgKHBwcF9wcml2X2FyZWEtPmVuYWJsZV9JUFggPT0gV0FOT1BUX1lFUyl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbmFibGluZyBJUFggUHJvdG9jb2xcbiIsY2FyZC0+ZGV2bmFtZSk7CisJCWNmZy5pcHhfb3B0aW9ucwkJPSBFTkFCTEVfSVBYIHwgUk9VVElOR19QUk9UX0RFRkFVTFQ7CisJfWVsc2V7CisJCWNmZy5pcHhfb3B0aW9ucyAJPSBESVNBQkxFX0lQWDsKKwl9CisKKwlzd2l0Y2ggKGNhcmQtPnUucC5pcF9tb2RlKSB7CisJCisJCWNhc2UgV0FOT1BUX1BQUF9TVEFUSUM6CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQUFAgSVAgTW9kZTogU1RBVElDXG4iLGNhcmQtPmRldm5hbWUpOworCQkJY2ZnLmlwX29wdGlvbnMJCT0gTF9BTkRfUl9JUF9OT19BU1NJRyB8IAorCQkJCQkJCSAgICBFTkFCTEVfSVA7CisJCQljZmcuaXBfbG9jYWwJCT0gaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2xvY2FsOworCQkJY2ZnLmlwX3JlbW90ZQkJPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfYWRkcmVzczsKKwkJCS8qIERlYnVnZ2luZyBjb2RlIHVzZWQgdG8gY2hlY2sgdGhhdCBJUCBhZGRyZXNzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIG9idGFpbmVkIGZyb20gdGhlIGtlcm5lbCBhcmUgY29ycmVjdCAqLworCisgICAgICAgICAgICAgICAgICAgICAgICBORVhfUFJJTlRLKEtFUk5fSU5GTyAiTG9jYWwgJXUuJXUuJXUuJXUgUmVtb3RlICV1LiV1LiV1LiV1IE5hbWUgJXNcbiIsCisJCQkJCU5JUFFVQUQoaXBfbG9jYWwpLE5JUFFVQUQoaXBfcmVtb3RlKSwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0FOT1BUX1BQUF9IT1NUOgorCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUFBQIElQIE1vZGU6IEhPU1RcbiIsY2FyZC0+ZGV2bmFtZSk7CisJCQljZmcuaXBfb3B0aW9ucwkJPSBMX0lQX0xPQ0FMX0FTU0lHIHwKKwkJCQkJCSAgUl9JUF9MT0NBTF9BU1NJRyB8IAorCQkJCQkJICBFTkFCTEVfSVA7CisJCQljZmcuaXBfbG9jYWwJCT0gaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2xvY2FsOworCQkJY2ZnLmlwX3JlbW90ZQkJPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfYWRkcmVzczsKKwkJCS8qIERlYnVnZ2luZyBjb2RlIHVzZWQgdG8gY2hlY2sgdGhhdCBJUCBhZGRyZXNzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIG9idGFpbmVkIGZyb20gdGhlIGtlcm5lbCBhcmUgY29ycmVjdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgTkVYX1BSSU5USyAoS0VSTl9JTkZPICJMb2NhbCAldS4ldS4ldS4ldSBSZW1vdGUgJXUuJXUuJXUuJXUgTmFtZSAlc1xuIiwKKwkJCQkJTklQUVVBRChpcF9sb2NhbCksTklQUVVBRChpcF9yZW1vdGUpLCBkZXYtPm5hbWUpOworCQkJCisJCQlicmVhazsKKwkKKwkJY2FzZSBXQU5PUFRfUFBQX1BFRVI6CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQUFAgSVAgTW9kZTogUEVFUlxuIixjYXJkLT5kZXZuYW1lKTsKKwkJCWNmZy5pcF9vcHRpb25zCQk9IExfSVBfUkVNT1RFX0FTU0lHIHwgCisJCQkJCQkgIFJfSVBfUkVNT1RFX0FTU0lHIHwgCisJCQkJCQkJICBFTkFCTEVfSVA7CisJCQljZmcuaXBfbG9jYWwJCT0gMHgwMDsKKwkJCWNmZy5pcF9yZW1vdGUJCT0gMHgwMDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRVJST1I6IFVuc3VwcG9ydGVkIFBQUCBNb2RlIFNlbGVjdGVkXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAgICAgICAgUFBQIElQIE1vZGVzOiBTVEFUSUMsIFBFRVIgb3IgSE9TVFxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIHBwcF9jb25maWd1cmUoY2FyZCwgJmNmZyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2hvdyBkaXNjb25uZWN0aW9uIGNhdXNlLgorICovCitzdGF0aWMgdm9pZCBzaG93X2Rpc2NfY2F1c2Uoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBjYXVzZSkKK3sKKwlpZiAoY2F1c2UgJiAweDA4MDIpIAorCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHRlcm1pbmF0ZWQgYnkgcGVlclxuIiwgCisJCQljYXJkLT5kZXZuYW1lKTsKKworCWVsc2UgaWYgKGNhdXNlICYgMHgwMDA0KSAKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayB0ZXJtaW5hdGVkIGJ5IHVzZXJcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSk7CisKKwllbHNlIGlmIChjYXVzZSAmIDB4MDAwOCkgCisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGF1dGhlbnRpY2F0aW9uIGZhaWxlZFxuIiwgY2FyZC0+ZGV2bmFtZSk7CisJCisJZWxzZSBpZiAoY2F1c2UgJiAweDAwMTApIAorCisJCXByaW50ayhLRVJOX0lORk8gCisJCQkiJXM6IGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIG5lZ290aWF0aW9uIGZhaWxlZFxuIiwgCisJCQljYXJkLT5kZXZuYW1lKTsKKworCWVsc2UgaWYgKGNhdXNlICYgMHgwMDIwKSAKKwkJCisJCXByaW50ayhLRVJOX0lORk8KKwkJIiVzOiBwZWVyJ3MgcmVxdWVzdCBmb3IgYXV0aGVudGljYXRpb24gcmVqZWN0ZWRcbiIsCisJCWNhcmQtPmRldm5hbWUpOworCisJZWxzZSBpZiAoY2F1c2UgJiAweDAwNDApIAorCQorCQlwcmludGsoS0VSTl9JTkZPICIlczogTVJVIG9wdGlvbiByZWplY3RlZCBieSBwZWVyXG4iLCAKKwkJY2FyZC0+ZGV2bmFtZSk7CisKKwllbHNlIGlmIChjYXVzZSAmIDB4MDA4MCkgCisJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwZWVyJ3MgTVJVIHdhcyB0b28gc21hbGxcbiIsIAorCQljYXJkLT5kZXZuYW1lKTsKKworCWVsc2UgaWYgKGNhdXNlICYgMHgwMTAwKSAKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogZmFpbGVkIHRvIG5lZ290aWF0ZSBwZWVyJ3MgTENQIG9wdGlvbnNcbiIsCisJCWNhcmQtPmRldm5hbWUpOworCisJZWxzZSBpZiAoY2F1c2UgJiAweDAyMDApIAorCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZhaWxlZCB0byBuZWdvdGlhdGUgcGVlcidzIElQQ1Agb3B0aW9uc1xuIgorCQksIGNhcmQtPmRldm5hbWUpOworCisJZWxzZSBpZiAoY2F1c2UgJiAweDA0MDApIAorCisJCXByaW50ayhLRVJOX0lORk8gCisJCQkiJXM6IGZhaWxlZCB0byBuZWdvdGlhdGUgcGVlcidzIElQWENQIG9wdGlvbnNcbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2VzcyBVRFAgY2FsbCBvZiB0eXBlIFBUUElQRUFCLgorICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX3VkcF9tZ210X3BrdChzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAorCQkJCSBwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEgKSAKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjJbNV07CisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGludCBmcmFtZXMsIGxlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKKwl1bnNpZ25lZCBzaG9ydCBkYXRhX2xlbmd0aCwgYnVmZmVyX2xlbmd0aCwgcmVhbF9sZW47CisJdW5zaWduZWQgbG9uZyBkYXRhX3B0cjsKKwlpbnQgdWRwX21nbXRfcmVxX3ZhbGlkID0gMTsKKwlwcHBfbWJveF90ICptYm94ID0gY2FyZC0+bWJveDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgZXJyOworCXBwcF91ZHBfcGt0X3QgKnBwcF91ZHBfcGt0ID0gKHBwcF91ZHBfcGt0X3QqKSZwcHBfcHJpdl9hcmVhLT51ZHBfcGt0X2RhdGE7CisKKwltZW1jcHkoJmJ1ZjIsICZjYXJkLT53YW5kZXYudWRwX3BvcnQsIDIgKTsKKworCisJaWYocHBwX3ByaXZfYXJlYS0+dWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fTkVUV09SSykgeworCisJCXN3aXRjaChwcHBfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpIHsKKworCQkJY2FzZSBQUElQRV9HRVRfSUJBX0RBVEE6CisJCQljYXNlIFBQUF9SRUFEX0NPTkZJRzoKKwkJCWNhc2UgUFBQX0dFVF9DT05ORUNUSU9OX0lORk86CisJCQljYXNlIFBQSVBFX1JPVVRFUl9VUF9USU1FOgorCQkJY2FzZSBQUFBfUkVBRF9TVEFUSVNUSUNTOgorCQkJY2FzZSBQUFBfUkVBRF9FUlJPUl9TVEFUUzoKKwkJCWNhc2UgUFBQX1JFQURfUEFDS0VUX1NUQVRTOgorCQkJY2FzZSBQUFBfUkVBRF9MQ1BfU1RBVFM6CisJCQljYXNlIFBQUF9SRUFEX0lQQ1BfU1RBVFM6CisJCQljYXNlIFBQUF9SRUFEX0lQWENQX1NUQVRTOgorCQkJY2FzZSBQUFBfUkVBRF9QQVBfU1RBVFM6CisJCQljYXNlIFBQUF9SRUFEX0NIQVBfU1RBVFM6CisJCQljYXNlIFBQUF9SRUFEX0NPREVfVkVSU0lPTjoKKwkJCQl1ZHBfbWdtdF9yZXFfdmFsaWQgPSAxOworCQkJCWJyZWFrOworCQkJICAgCisJCQlkZWZhdWx0OgorCQkJCXVkcF9tZ210X3JlcV92YWxpZCA9IDA7CisJCQkJYnJlYWs7CisJCX0gCisJfQorCQorICAJaWYoIXVkcF9tZ210X3JlcV92YWxpZCkgeworCSAgICAKKwkJLyogc2V0IGxlbmd0aCB0byAwICovCisgICAgCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IDB4MDA7CisKKyAgICAJCS8qIHNldCByZXR1cm4gY29kZSAqLworICAgIAkJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAweENEOyAKKwkJKytwcHBfcHJpdl9hcmVhLT5waXBlX21nbXRfc3RhdC5VRFBfUElQRV9tZ210X2RpcmVjdGlvbl9lcnI7CisJCisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpewkKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkiJXM6IFdhcm5pbmcsIElsbGVnYWwgVURQIGNvbW1hbmQgYXR0ZW1wdGVkIGZyb20gbmV0d29yazogJXhcbiIsCisJCQljYXJkLT5kZXZuYW1lLHBwcF91ZHBfcGt0LT5jYmxvY2suY29tbWFuZCk7CisJCX0KKyAgIAl9IGVsc2UgeworCQkvKiBJbml0aWFsaXplIHRoZSB0cmFjZSBlbGVtZW50ICovCisJCXRyYWNlX2VsZW1lbnRfdCB0cmFjZV9lbGVtZW50OwkJICAgIAorCisJCXN3aXRjaCAocHBwX3VkcF9wa3QtPmNibG9jay5jb21tYW5kKXsKKworCQkvKiBQUElQRV9FTkFCTEVfVFJBQ0lORyAqLworICAgIAkJY2FzZSBQUElQRV9FTkFCTEVfVFJBQ0lORzoKKwkJCWlmICghY2FyZC0+VHJhY2luZ0VuYWJsZWQpIHsKKyAgICAJCQkKKwkJCQkvKiBPUEVSQVRFX0RBVEFMSU5FX01PTklUT1IgKi8KKyAgICAJCQkJbWJveC0+Y21kLmNvbW1hbmQgPSBQUFBfREFUQUxJTkVfTU9OSVRPUjsKKyAgICAJCQkJbWJveC0+Y21kLmxlbmd0aCA9IDB4MDE7CisgICAgCQkJCW1ib3gtPmRhdGFbMF0gPSBwcHBfdWRwX3BrdC0+ZGF0YVswXTsKKwkgICAgCQkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gCisJCQkJCW1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwkgICAKKwkJCQlpZiAoZXJyICE9IENNRF9PSykgeyAKKwkgICAgICAgIAkJCQorCQkJCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYm94KTsKKwkgICAgICAgIAkJCWNhcmQtPlRyYWNpbmdFbmFibGVkID0gMDsKKwkgICAgICAgIAkJCisJCQkJCS8qIHNldCB0aGUgcmV0dXJuIGNvZGUgKi8KKworCQkgICAgICAgIAkJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSBtYm94LT5jbWQucmVzdWx0OworCSAgICAgICAgCQkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJICAgICAgICAJCQlicmVhazsKKwkgICAgCQkJfSAKKworCQkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIDB4QzAwMCwgJmJ1ZjIsIDIpOworCQkgICAgCisJCQkJcHBwX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyID0gMDsKKwkJICAgIAkJbWVtY3B5KCZwcHBfcHJpdl9hcmVhLT5jdXJyX3RyYWNlX2FkZHIsICZidWYyLCAyKTsKKwkJICAgIAkJcHBwX3ByaXZfYXJlYS0+c3RhcnRfdHJhY2VfYWRkciA9IAorCQkJCQkJcHBwX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyOworCQkJCXBwcF9wcml2X2FyZWEtPmVuZF90cmFjZV9hZGRyID0gCisJCQkJCXBwcF9wcml2X2FyZWEtPnN0YXJ0X3RyYWNlX2FkZHIgKyBFTkRfT0ZGU0VUOworCQkgICAgCQorCQkJCS8qIE1BWF9TRU5EX0JVRkZFUl9TSVpFIC0gMjggKElQIGhlYWRlcikgCisJCQkJICAgLSAzMiAocHBpcGVtb24gQ0JMT0NLKSAqLworCQkgICAgCQlhdmFpbGFibGVfYnVmZmVyX3NwYWNlID0gTUFYX0xHVEhfVURQX01HTlRfUEtUIC0gCisJCQkJCQkJIHNpemVvZihpcF9wa3RfdCktCisJCQkJCQkJIHNpemVvZih1ZHBfcGt0X3QpLQorCQkJCQkJCSBzaXplb2Yod3BfbWdtdF90KS0KKwkJCQkJCQkgc2l6ZW9mKGNibG9ja190KTsKKwkgICAgICAgCSAgCX0KKwkgICAgICAgCSAgCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkgICAgICAgCSAgCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCSAgICAgICAJICAJY2FyZC0+VHJhY2luZ0VuYWJsZWQgPSAxOworCSAgICAgICAJICAJYnJlYWs7CisJICAgCisJCS8qIFBQSVBFX0RJU0FCTEVfVFJBQ0lORyAqLworCQljYXNlIFBQSVBFX0RJU0FCTEVfVFJBQ0lORzoKKwkgICAgICAJCQorCQkJaWYoY2FyZC0+VHJhY2luZ0VuYWJsZWQpIHsKKwkJICAgCQorCQkJCS8qIE9QRVJBVEVfREFUQUxJTkVfTU9OSVRPUiAqLworCQkgICAgCQltYm94LT5jbWQuY29tbWFuZCA9IDB4MzM7CisJCSAgICAJCW1ib3gtPmNtZC5sZW5ndGggPSAxOworCQkgICAgCQltYm94LT5kYXRhWzBdID0gMHgwMDsKKwkJICAgIAkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gCisJCQkJCW1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwkgICAgICAgCSAgCisJCQl9IAorCQkKKwkJCS8qc2V0IHJldHVybiBjb2RlKi8KKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQkJY2FyZC0+VHJhY2luZ0VuYWJsZWQgPSAwOworCQkJYnJlYWs7CisJICAgCisJCS8qIFBQSVBFX0dFVF9UUkFDRV9JTkZPICovCisJCWNhc2UgUFBJUEVfR0VUX1RSQUNFX0lORk86CisKKwkJCWlmKCFjYXJkLT5UcmFjaW5nRW5hYmxlZCkgeworCQkJCS8qIHNldCByZXR1cm4gY29kZSAqLworCSAgICAJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDE7CisJICAgIAkJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQkJfQkJICAgIAorCisJCQlidWZmZXJfbGVuZ3RoID0gMDsKKwkJCQorCQkJLyogZnJhbWVzIDwgNjIsIHdoZXJlIDYyIGlzIHRoZSBudW1iZXIgb2YgdHJhY2UKKwkJCSAgIGluZm9ybWF0aW9uIGVsZW1lbnRzLiAgVGhlcmUgaXMgaW4gdG90YWwgNDk2CisJCQkgICBieXRlcyBvZiBzcGFjZSBhbmQgZWFjaCB0cmFjZSBpbmZvcm1hdGlvbgorCQkJICAgZWxlbWVudCBpcyA4IGJ5dGVzLiAKKwkJCSAqLworCQkJZm9yICggZnJhbWVzPTA7IGZyYW1lczw2MjsgZnJhbWVzKyspIHsKKwkKKwkJCQl0cmFjZV9wa3RfdCAqdHJhY2VfcGt0ID0gKHRyYWNlX3BrdF90ICopCisJCQkJCSZwcHBfdWRwX3BrdC0+ZGF0YVtidWZmZXJfbGVuZ3RoXTsKKwkKKwkJCQkvKiBSZWFkIHRoZSB3aG9sZSB0cmFjZSBwYWNrZXQgKi8KKwkJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBwcHBfcHJpdl9hcmVhLT5jdXJyX3RyYWNlX2FkZHIsIAorCQkJCQkgICZ0cmFjZV9lbGVtZW50LCBzaXplb2YodHJhY2VfZWxlbWVudF90KSk7CisJCisJCQkJLyogbm8gZGF0YSBvbiBib2FyZCBzbyBleGl0ICovCisJCQkJaWYoIHRyYWNlX2VsZW1lbnQub3BwX2ZsYWcgPT0gMHgwMCApIAorCQkJCQlicmVhazsKKwkgICAgICAKKwkJCQlkYXRhX3B0ciA9IHRyYWNlX2VsZW1lbnQudHJhY2VfZGF0YV9wdHI7CisKKwkJCQkvKiBTZWUgaWYgdGhlcmUgaXMgYWN0dWFsIGRhdGEgb24gdGhlIHRyYWNlIGJ1ZmZlciAqLworCQkJCWlmIChkYXRhX3B0cil7CisJCQkJCWRhdGFfbGVuZ3RoID0gdHJhY2VfZWxlbWVudC50cmFjZV9sZW5ndGg7CisJCQkJfWVsc2V7CisJCQkJCWRhdGFfbGVuZ3RoID0gMDsKKwkJCQkJcHBwX3VkcF9wa3QtPmRhdGFbMF0gfD0gMHgwMjsKKwkJCQl9CisKKwkJCQkvL0ZJWE1FOiBEbyB3ZSBuZWVkIHRoaXMgY2hlY2sKKwkJCQlpZiAoKGF2YWlsYWJsZV9idWZmZXJfc3BhY2UgLSBidWZmZXJfbGVuZ3RoKSAKKwkJCQkgICAgIDwgKHNpemVvZih0cmFjZV9lbGVtZW50X3QpKzEpKXsKKwkJCQkJCisJCQkJCS8qaW5kaWNhdGUgd2UgaGF2ZSBtb3JlIGZyYW1lcyAKKwkJCQkJICogb24gYm9hcmQgYW5kIGV4aXQgCisJCQkJCSAqLworCQkJCQlwcHBfdWRwX3BrdC0+ZGF0YVswXSB8PSAweDAyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJCisJCQkJdHJhY2VfcGt0LT5zdGF0dXMgPSB0cmFjZV9lbGVtZW50LnRyYWNlX3R5cGU7CisJCQkJdHJhY2VfcGt0LT50aW1lX3N0YW1wID0gdHJhY2VfZWxlbWVudC50cmFjZV90aW1lX3N0YW1wOworCQkJCXRyYWNlX3BrdC0+cmVhbF9sZW5ndGggPSB0cmFjZV9lbGVtZW50LnRyYWNlX2xlbmd0aDsKKworCQkJCXJlYWxfbGVuID0gdHJhY2VfZWxlbWVudC50cmFjZV9sZW5ndGg7CQorCQkJCQorCQkJCWlmKGRhdGFfcHRyID09IDApeworCQkJCQl0cmFjZV9wa3QtPmRhdGFfYXZhaWwgPSAweDAwOworCQkJCX1lbHNleworCQkJCQkvKiB3ZSBjYW4gdGFrZSBpdCBuZXh0IHRpbWUgKi8KKwkJCQkJaWYgKChhdmFpbGFibGVfYnVmZmVyX3NwYWNlIC0gYnVmZmVyX2xlbmd0aCk8CisJCQkJCQkocmVhbF9sZW4gKyBzaXplb2YodHJhY2VfcGt0X3QpKSl7CisJCQkJCQorCQkJCQkJcHBwX3VkcF9wa3QtPmRhdGFbMF0gfD0gMHgwMjsKKwkJCQkJCWJyZWFrOworCQkJCQl9IAorCQkJCQl0cmFjZV9wa3QtPmRhdGFfYXZhaWwgPSAweDAxOworCQkJCQorCQkJCQkvKiBnZXQgdGhlIGRhdGEgKi8KKwkJCQkJc2RsYV9wZWVrKCZjYXJkLT5odywgZGF0YV9wdHIsIAorCQkJCQkJICAmdHJhY2VfcGt0LT5kYXRhLAorCQkJCQkJICByZWFsX2xlbik7CisJCQkJfQkKKwkJCQkvKiB6ZXJvIHRoZSBvcHAgZmxhZyB0byAKKwkJCQkgICBzaG93IHdlIGdvdCB0aGUgZnJhbWUgKi8KKwkJCQlidWYyWzBdID0gMHgwMDsKKwkJCQlzZGxhX3Bva2UoJmNhcmQtPmh3LCBwcHBfcHJpdl9hcmVhLT5jdXJyX3RyYWNlX2FkZHIsCisJCQkJCSAgJmJ1ZjIsIDEpOworCisJCQkJLyogbm93IG1vdmUgb250byB0aGUgbmV4dCAKKwkJCQkgICBmcmFtZSAqLworCQkJCXBwcF9wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciArPSA4OworCisJCQkJLyogY2hlY2sgaWYgd2UgcGFzc2VkIHRoZSBsYXN0IGFkZHJlc3MgKi8KKwkJCQlpZiAoIHBwcF9wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciA+PSAKKwkJCQkJcHBwX3ByaXZfYXJlYS0+ZW5kX3RyYWNlX2FkZHIpeworCisJCQkJCXBwcF9wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciA9IAorCQkJCQkJcHBwX3ByaXZfYXJlYS0+c3RhcnRfdHJhY2VfYWRkcjsKKwkJCQl9CisgCisJCQkJLyogdXBkYXRlIGJ1ZmZlciBsZW5ndGggYW5kIG1ha2Ugc3VyZSBpdHMgZXZlbiAqLyAKKworCQkJCWlmICggdHJhY2VfcGt0LT5kYXRhX2F2YWlsID09IDB4MDEgKSB7CisJCQkJCWJ1ZmZlcl9sZW5ndGggKz0gcmVhbF9sZW4gLSAxOworCQkJCX0KKyAKKwkJCQkvKiBmb3IgdGhlIGhlYWRlciAqLworCQkJCWJ1ZmZlcl9sZW5ndGggKz0gODsKKworCQkJCWlmKCBidWZmZXJfbGVuZ3RoICYgMHgwMDAxICkKKwkJCQkJYnVmZmVyX2xlbmd0aCArPSAxOworCQkJfQorCisJCQkvKiBvayBub3cgc2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHBhc3NlZAorCQkJICAgaW4gdGhlIGhpZ2ggNSBiaXRzICovCisJCQlwcHBfdWRwX3BrdC0+ZGF0YVswXSB8PSAoZnJhbWVzIDw8IDIpOworCSAKKwkJCS8qIHNldCB0aGUgZGF0YSBsZW5ndGggKi8KKwkJCW1ib3gtPmNtZC5sZW5ndGggPSBidWZmZXJfbGVuZ3RoOworCQkJcHBwX3VkcF9wa3QtPmNibG9jay5sZW5ndGggPSBidWZmZXJfbGVuZ3RoOworCSAKKwkJCS8qIHNldCByZXR1cm4gY29kZSAqLworCQkJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCSAgICAgIAkgIAlicmVhazsKKworICAgCQkvKiBQUElQRV9HRVRfSUJBX0RBVEEgKi8KKwkJY2FzZSBQUElQRV9HRVRfSUJBX0RBVEE6CisJICAgICAgICAKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSAweDA5OworCQkKKwkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIDB4RjAwMywgJnBwcF91ZHBfcGt0LT5kYXRhLCAKKwkJCQkJbWJveC0+Y21kLmxlbmd0aCk7CisJICAgICAgICAKKwkJCS8qIHNldCB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhICovCisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IDB4MDk7CisKKwkJCS8qIHNldCByZXR1cm4gY29kZSAqLworCQkJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAweDAwOworCQkJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCQkJYnJlYWs7CisKKwkJLyogUFBJUEVfRlQxX1JFQURfU1RBVFVTICovCisJCWNhc2UgUFBJUEVfRlQxX1JFQURfU1RBVFVTOgorCQkJc2RsYV9wZWVrKCZjYXJkLT5odywgMHhGMDIwLCAmcHBwX3VkcF9wa3QtPmRhdGFbMF0sIDIpOworCQkJcHBwX3VkcF9wa3QtPmNibG9jay5sZW5ndGggPSBtYm94LT5jbWQubGVuZ3RoID0gMjsKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBQUElQRV9GTFVTSF9EUklWRVJfU1RBVFM6ICAgCisJCQlpbml0X3BwcF9wcml2X3N0cnVjdCggcHBwX3ByaXZfYXJlYSApOworCQkJaW5pdF9nbG9iYWxfc3RhdGlzdGljcyggY2FyZCApOworCQkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCQlicmVhazsKKworCQkKKwkJY2FzZSBQUElQRV9ST1VURVJfVVBfVElNRToKKworCQkJZG9fZ2V0dGltZW9mZGF5KCAmdHYgKTsKKwkJCXBwcF9wcml2X2FyZWEtPnJvdXRlcl91cF90aW1lID0gdHYudHZfc2VjIC0gCisJCQkJCXBwcF9wcml2X2FyZWEtPnJvdXRlcl9zdGFydF90aW1lOworCQkJKih1bnNpZ25lZCBsb25nICopJnBwcF91ZHBfcGt0LT5kYXRhID0gcHBwX3ByaXZfYXJlYS0+cm91dGVyX3VwX3RpbWU7CisJCQltYm94LT5jbWQubGVuZ3RoID0gNDsKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCisJCQkJLyogUFBJUEVfRFJJVkVSX1NUQVRJU1RJQ1MgKi8gICAKKwkJY2FzZSBQUElQRV9EUklWRVJfU1RBVF9JRlNFTkQ6CisJCQltZW1jcHkoJnBwcF91ZHBfcGt0LT5kYXRhLCAmcHBwX3ByaXZfYXJlYS0+aWZfc2VuZF9zdGF0LCAKKwkJCQlzaXplb2YoaWZfc2VuZF9zdGF0X3QpKTsKKworCisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IHNpemVvZihpZl9zZW5kX3N0YXRfdCk7CisJCQltYm94LT5jbWQubGVuZ3RoID0gc2l6ZW9mKGlmX3NlbmRfc3RhdF90KTsJCisJCQlicmVhazsKKworCQljYXNlIFBQSVBFX0RSSVZFUl9TVEFUX0lOVFI6CisJCQltZW1jcHkoJnBwcF91ZHBfcGt0LT5kYXRhLCAmY2FyZC0+c3RhdGlzdGljcywgCisJCQkJc2l6ZW9mKGdsb2JhbF9zdGF0c190KSk7CisKKwkJCW1lbWNweSgmcHBwX3VkcF9wa3QtPmRhdGErc2l6ZW9mKGdsb2JhbF9zdGF0c190KSwKKwkJCQkmcHBwX3ByaXZfYXJlYS0+cnhfaW50cl9zdGF0LAorCQkJCXNpemVvZihyeF9pbnRyX3N0YXRfdCkpOworCisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IHNpemVvZihnbG9iYWxfc3RhdHNfdCkrCisJCQkJCQkgICAgIHNpemVvZihyeF9pbnRyX3N0YXRfdCk7CisJCQltYm94LT5jbWQubGVuZ3RoID0gcHBwX3VkcF9wa3QtPmNibG9jay5sZW5ndGg7CisJCQlicmVhazsKKworCQljYXNlIFBQSVBFX0RSSVZFUl9TVEFUX0dFTjoKKwkJCW1lbWNweSggJnBwcF91ZHBfcGt0LT5kYXRhLAorCQkJCSZwcHBfcHJpdl9hcmVhLT5waXBlX21nbXRfc3RhdCwKKwkJCQlzaXplb2YocGlwZV9tZ210X3N0YXRfdCkpOworCisJCQltZW1jcHkoJnBwcF91ZHBfcGt0LT5kYXRhK3NpemVvZihwaXBlX21nbXRfc3RhdF90KSwgCisJCQkgICAgICAgJmNhcmQtPnN0YXRpc3RpY3MsIHNpemVvZihnbG9iYWxfc3RhdHNfdCkpOworCisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IHNpemVvZihnbG9iYWxfc3RhdHNfdCkrCisJCQkJCQkgICAgIHNpemVvZihyeF9pbnRyX3N0YXRfdCk7CisJCQltYm94LT5jbWQubGVuZ3RoID0gcHBwX3VkcF9wa3QtPmNibG9jay5sZW5ndGg7CisJCQlicmVhazsKKworCisJCS8qIEZUMSBNT05JVE9SIFNUQVRVUyAqLworICAgCQljYXNlIEZUMV9NT05JVE9SX1NUQVRVU19DVFJMOgorCQorCQkJLyogRW5hYmxlIEZUMSBNT05JVE9SIFNUQVRVUyAqLworCSAgICAgICAgCWlmKCBwcHBfdWRwX3BrdC0+ZGF0YVswXSA9PSAxKSB7CisJCQkKKwkJCQlpZiggckNvdW50KysgIT0gMCApIHsKKwkJICAgICAgICAJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkgICAgICAgICAgCQkJbWJveC0+Y21kLmxlbmd0aCA9IDE7CisJCSAgCQkJYnJlYWs7CisJCSAgICAJCX0JCisJICAgICAgCQl9CisKKwkgICAgICAJCS8qIERpc2FibGUgRlQxIE1PTklUT1IgU1RBVFVTICovCisJICAgICAgCQlpZiggcHBwX3VkcF9wa3QtPmRhdGFbMF0gPT0gMCkgeworCisJICAgICAgCSAgIAkJaWYoIC0tckNvdW50ICE9IDApIHsKKwkJICAJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCSAgCQkJbWJveC0+Y21kLmxlbmd0aCA9IDE7CisJCSAgCQkJYnJlYWs7CisJICAgCSAgICAJCX0gCisJICAgICAgCQl9IAkKKwkJCWdvdG8gdWRwX2RmbHRfY21kOworCQkJCisJCS8qIFdBUk5JTkc6IEZJWE1FOiBUaGlzIHNob3VsZCBiZSBmaXhlZC4KKwkJICogVGhlIEZUMSBTdGF0dXMgQ3RybCBkb2Vzbid0IGhhdmUgYSBicmVhaworICAgICAgICAgICAgICAgICAqIHN0YXRtZW50LiAgVGh1cywgbm8gY29kZSBtdXN0IGJlIGluc2VydGVkCisgICAgICAgICAgICAgICAgICogSEVSRTogYmV0d2VlbiBkZWZhdWx0IGFuZCBhYm92ZSBjYXNlIHN0YXRlbWVudCAqLworCisJCWRlZmF1bHQ6Cit1ZHBfZGZsdF9jbWQ6CisJICAgICAgICAKKwkJCS8qIGl0J3MgYSBib2FyZCBjb21tYW5kICovCisJCQltYm94LT5jbWQuY29tbWFuZCA9IHBwcF91ZHBfcGt0LT5jYmxvY2suY29tbWFuZDsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSBwcHBfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aDsKKyAKKwkJCWlmKG1ib3gtPmNtZC5sZW5ndGgpIHsKKwkJCQltZW1jcHkoJm1ib3gtPmRhdGEsKHVuc2lnbmVkIGNoYXIgKilwcHBfdWRwX3BrdC0+ZGF0YSwKKwkJCQkgICAgICAgbWJveC0+Y21kLmxlbmd0aCk7CisJICAgICAgCQl9IAorCSAgICAgICAgICAKKwkJCS8qIHJ1biB0aGUgY29tbWFuZCBvbiB0aGUgYm9hcmQgKi8KKwkJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwkJCisJCQlpZiAoZXJyICE9IENNRF9PSykgeworCQkKKwkJICAgIAkJcHBwX2Vycm9yKGNhcmQsIGVyciwgbWJveCk7CisJCSAgICAJCSsrcHBwX3ByaXZfYXJlYS0+cGlwZV9tZ210X3N0YXQuCisJCQkJCSBVRFBfUElQRV9tZ210X2FkcHRyX2NtbmRfdGltZW91dDsKKwkJCQlicmVhazsKKwkJCX0KKwkgICAgICAgICAgCisJCSAgCSsrcHBwX3ByaXZfYXJlYS0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9hZHB0cl9jbW5kX09LOworCQkKKwkJCS8qIGNvcHkgdGhlIHJlc3VsdCBiYWNrIHRvIG91ciBidWZmZXIgKi8KKwkJCW1lbWNweSgmcHBwX3VkcF9wa3QtPmNibG9jayxtYm94LCBzaXplb2YoY2Jsb2NrX3QpKTsKKwkgICAgICAgICAgCisJCQlpZihtYm94LT5jbWQubGVuZ3RoKSB7CisJCQkJbWVtY3B5KCZwcHBfdWRwX3BrdC0+ZGF0YSwmbWJveC0+ZGF0YSxtYm94LT5jbWQubGVuZ3RoKTsKKwkJCX0gCisKKwkJfSAvKiBlbmQgb2Ygc3dpdGNoICovCisgICAgIAl9IC8qIGVuZCBvZiBlbHNlICovCisKKyAgICAgCS8qIEZpbGwgVURQIFRUTCAqLworICAgICAJcHBwX3VkcF9wa3QtPmlwX3BrdC50dGwgPSBjYXJkLT53YW5kZXYudHRsOyAKKyAgICAgCWxlbiA9IHJlcGx5X3VkcChwcHBfcHJpdl9hcmVhLT51ZHBfcGt0X2RhdGEsIG1ib3gtPmNtZC5sZW5ndGgpOworCisgICAgIAlpZiAocHBwX3ByaXZfYXJlYS0+dWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fTkVUV09SSykgeworCisJCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGFscmVhZHkgc2VuZGluZyAqLworCQlpZiAoIXRlc3RfYml0KFNFTkRfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisJCQkrK3BwcF9wcml2X2FyZWEtPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfcGFzc2VkX3RvX2FkcHRyOworCQkJcHBwX3NlbmQoY2FyZCxwcHBfcHJpdl9hcmVhLT51ZHBfcGt0X2RhdGEsbGVuLHBwcF9wcml2X2FyZWEtPnByb3RvY29sKTsKKwkJfQorCisJfSBlbHNlIHsJCisJCisJCS8qIFBhc3MgaXQgdXAgdGhlIHN0YWNrCisgICAgCQkgICBBbGxvY2F0ZSBzb2NrZXQgYnVmZmVyICovCisJCWlmICgobmV3X3NrYiA9IGRldl9hbGxvY19za2IobGVuKSkgIT0gTlVMTCkgeworCSAgICAJCisJCQkvKiBjb3B5IGRhdGEgaW50byBuZXdfc2tiICovCisKKyAgCSAgICAJCWJ1ZiA9IHNrYl9wdXQobmV3X3NrYiwgbGVuKTsKKyAgCSAgICAJCW1lbWNweShidWYscHBwX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhLCBsZW4pOworCisJICAgIAkJKytwcHBfcHJpdl9hcmVhLT5waXBlX21nbXRfc3RhdC5VRFBfUElQRV9tZ210X3Bhc3NlZF90b19zdGFjazsKKwkJCQorICAgICAgICAgICAgCQkvKiBEZWNhcHN1bGF0ZSBwYWNrZXQgYW5kIHBhc3MgaXQgdXAgdGhlIHByb3RvY29sIAorCQkJICAgc3RhY2sgKi8KKwkgICAgCQluZXdfc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKyAgICAgICAgICAgIAkJbmV3X3NrYi0+ZGV2ID0gZGV2OworCSAgICAJCW5ld19za2ItPm1hYy5yYXcgID0gbmV3X3NrYi0+ZGF0YTsKKwkJCW5ldGlmX3J4KG5ld19za2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCisJCX0gZWxzZSB7CisJICAgIAkKKwkJCSsrcHBwX3ByaXZfYXJlYS0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9ub19zb2NrZXQ7CisJCQlwcmludGsoS0VSTl9JTkZPICJubyBzb2NrZXQgYnVmZmVycyBhdmFpbGFibGUhXG4iKTsKKyAgCQl9CisgICAgCX0JCisKKwlwcHBfcHJpdl9hcmVhLT51ZHBfcGt0X2xndGggPSAwOworCQorCXJldHVybjsgCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWwgdGhlIHBwcF9wcml2YXRlX2FyZWEgc3RydWN0dXJlLgorICovCitzdGF0aWMgdm9pZCBpbml0X3BwcF9wcml2X3N0cnVjdCggcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhICkKK3sKKworCW1lbXNldCgmcHBwX3ByaXZfYXJlYS0+aWZfc2VuZF9zdGF0LCAwLCBzaXplb2YoaWZfc2VuZF9zdGF0X3QpKTsKKwltZW1zZXQoJnBwcF9wcml2X2FyZWEtPnJ4X2ludHJfc3RhdCwgMCwgc2l6ZW9mKHJ4X2ludHJfc3RhdF90KSk7CisJbWVtc2V0KCZwcHBfcHJpdl9hcmVhLT5waXBlX21nbXRfc3RhdCwgMCwgc2l6ZW9mKHBpcGVfbWdtdF9zdGF0X3QpKTsJCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBHbG9iYWwgU3RhdGlzdGljcworICovCitzdGF0aWMgdm9pZCBpbml0X2dsb2JhbF9zdGF0aXN0aWNzKCBzZGxhX3QgKmNhcmQgKQoreworCW1lbXNldCgmY2FyZC0+c3RhdGlzdGljcywgMCwgc2l6ZW9mKGdsb2JhbF9zdGF0c190KSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBSZWNlaXZlIGFuZCBUcmFuc21pdCBCdWZmZXJzLgorICovCitzdGF0aWMgdm9pZCBpbml0X3BwcF90eF9yeF9idWZmKCBzZGxhX3QgKmNhcmQgKQoreworCXBwcDUwOF9idWZfaW5mb190KiBpbmZvOworCisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSB7CisJCQorCQlpbmZvID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgUFBQNTE0X0JVRl9PRkZTKTsKKworICAgICAgIAkJY2FyZC0+dS5wLnR4YnVmX2Jhc2UgPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkJaW5mby0+dHhiX3B0cik7CisKKyAgICAgICAgICAgICAgICBjYXJkLT51LnAudHhidWZfbGFzdCA9IChwcHBfYnVmX2N0bF90KiljYXJkLT51LnAudHhidWZfYmFzZSArCisgICAgICAgICAgICAgICAgICAgICAgICAoaW5mby0+dHhiX251bSAtIDEpOworCisgICAgICAgICAgICAgICAgY2FyZC0+dS5wLnJ4YnVmX2Jhc2UgPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+cnhiX3B0cik7CisKKyAgICAgICAgICAgICAgICBjYXJkLT51LnAucnhidWZfbGFzdCA9IChwcHBfYnVmX2N0bF90KiljYXJkLT51LnAucnhidWZfYmFzZSArCisgICAgICAgICAgICAgICAgICAgICAgICAoaW5mby0+cnhiX251bSAtIDEpOworCisJfSBlbHNlIHsKKwkJCisJCWluZm8gPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKyBQUFA1MDhfQlVGX09GRlMpOworCisJCWNhcmQtPnUucC50eGJ1Zl9iYXNlID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJCShpbmZvLT50eGJfcHRyIC0gUFBQNTA4X01CX1ZFQ1QpKTsKKworCQljYXJkLT51LnAudHhidWZfbGFzdCA9IChwcHBfYnVmX2N0bF90KiljYXJkLT51LnAudHhidWZfYmFzZSArCisJCQkoaW5mby0+dHhiX251bSAtIDEpOworCisJCWNhcmQtPnUucC5yeGJ1Zl9iYXNlID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJCShpbmZvLT5yeGJfcHRyIC0gUFBQNTA4X01CX1ZFQ1QpKTsKKworCQljYXJkLT51LnAucnhidWZfbGFzdCA9IChwcHBfYnVmX2N0bF90KiljYXJkLT51LnAucnhidWZfYmFzZSArCisJCQkoaW5mby0+cnhiX251bSAtIDEpOworCX0KKworCWNhcmQtPnUucC50eGJ1Zl9uZXh0ID0gKHVuc2lnbmVkIGxvbmcqKSZpbmZvLT50eGJfbnh0OyAKKwljYXJkLT51LnAucnhidWZfbmV4dCA9ICh1bnNpZ25lZCBsb25nKikmaW5mby0+cnhiMV9wdHI7CisKKwljYXJkLT51LnAucnhfYmFzZSA9IGluZm8tPnJ4Yl9iYXNlOworICAgICAgICBjYXJkLT51LnAucnhfdG9wICA9IGluZm8tPnJ4Yl9lbmQ7CisgICAgICAKKwljYXJkLT51LnAudHhidWYgPSBjYXJkLT51LnAudHhidWZfYmFzZTsKKwljYXJkLT5yeG1iID0gY2FyZC0+dS5wLnJ4YnVmX2Jhc2U7CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBDb25uZWN0aW9uIEluZm9ybWF0aW9uIChpZSBmb3IgUmVtb3RlIElQIGFkZHJlc3MgYXNzZ2lubWVudCkuCisgKiBDYWxsZWQgd2hlbiBwcHAgaW50ZXJmYWNlIGNvbm5lY3RlZC4KKyAqLworc3RhdGljIGludCByZWFkX2luZm8oIHNkbGFfdCAqY2FyZCApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNhcmQtPndhbmRldi5kZXY7CisJcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCWludCBlcnI7CisKKwlzdHJ1Y3QgaWZyZXEgaWZfaW5mbzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmlmX2RhdGExLCAqaWZfZGF0YTI7CisJbW1fc2VnbWVudF90IGZzOworCisJLyogU2V0IExvY2FsIGFuZCByZW1vdGUgYWRkcmVzc2VzICovCisJbWVtc2V0KCZpZl9pbmZvLCAwLCBzaXplb2YoaWZfaW5mbykpOworCXN0cmNweShpZl9pbmZvLmlmcl9uYW1lLCBkZXYtPm5hbWUpOworCisKKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7ICAgICAvKiBnZXQgdXNlciBzcGFjZSBibG9jayAqLyAKKworCS8qIENoYW5nZSB0aGUgbG9jYWwgYW5kIHJlbW90ZSBpcCBhZGRyZXNzIG9mIHRoZSBpbnRlcmZhY2UuCisJICogVGhpcyB3aWxsIGFsc28gYWRkIGluIHRoZSBkZXN0aW5hdGlvbiByb3V0ZS4KKwkgKi8JCisJaWZfZGF0YTEgPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmX2luZm8uaWZyX2FkZHI7CisJaWZfZGF0YTEtPnNpbl9hZGRyLnNfYWRkciA9IHBwcF9wcml2X2FyZWEtPmlwX2xvY2FsOworCWlmX2RhdGExLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwllcnIgPSBkZXZpbmV0X2lvY3RsKCBTSU9DU0lGQUREUiwgJmlmX2luZm8gKTsKKwlpZl9kYXRhMiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZfaW5mby5pZnJfZHN0YWRkcjsKKwlpZl9kYXRhMi0+c2luX2FkZHIuc19hZGRyID0gcHBwX3ByaXZfYXJlYS0+aXBfcmVtb3RlOworCWlmX2RhdGEyLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwllcnIgPSBkZXZpbmV0X2lvY3RsKCBTSU9DU0lGRFNUQUREUiwgJmlmX2luZm8gKTsKKworCXNldF9mcyhmcyk7ICAgICAgICAgICAvKiByZXN0b3JlIG9sZCBibG9jayAqLworCQorCWlmIChlcnIpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBBZGRpbmcgb2Ygcm91dGUgZmFpbGVkOiAlaVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsZXJyKTsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOglMb2NhbCA6ICV1LiV1LiV1LiV1XG4iLAorCQkJY2FyZC0+ZGV2bmFtZSxOSVBRVUFEKHBwcF9wcml2X2FyZWEtPmlwX2xvY2FsKSk7CisJCXByaW50ayAoS0VSTl9JTkZPICIlczoJUmVtb3RlOiAldS4ldS4ldS4ldVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsTklQUVVBRChwcHBfcHJpdl9hcmVhLT5pcF9yZW1vdGUpKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVtb3ZlIER5bmFtaWMgUm91dGUuCisgKiBDYWxsZWQgd2hlbiBwcHAgaW50ZXJmYWNlIGRpc2Nvbm5lY3RlZC4KKyAqLworCitzdGF0aWMgdm9pZCByZW1vdmVfcm91dGUoIHNkbGFfdCAqY2FyZCApCit7CisKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwlsb25nIGlwX2FkZHI7CisJaW50IGVycjsKKworICAgICAgICBtbV9zZWdtZW50X3QgZnM7CisJc3RydWN0IGlmcmVxIGlmX2luZm87CisJc3RydWN0IHNvY2thZGRyX2luICppZl9kYXRhMTsKKyAgICAgICAgc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisgICAgICAgIHN0cnVjdCBpbl9pZmFkZHIgKmlmYSA9IGluX2Rldi0+aWZhX2xpc3Q7CQorCisJaXBfYWRkciA9IGlmYS0+aWZhX2xvY2FsOworCisJLyogU2V0IExvY2FsIGFuZCByZW1vdGUgYWRkcmVzc2VzICovCisJbWVtc2V0KCZpZl9pbmZvLCAwLCBzaXplb2YoaWZfaW5mbykpOworCXN0cmNweShpZl9pbmZvLmlmcl9uYW1lLCBkZXYtPm5hbWUpOworCisJZnMgPSBnZXRfZnMoKTsKKyAgICAgICAJc2V0X2ZzKGdldF9kcygpKTsgICAgIC8qIGdldCB1c2VyIHNwYWNlIGJsb2NrICovIAorCisJLyogQ2hhbmdlIHRoZSBsb2NhbCBpcCBhZGRyZXNzIG9mIHRoZSBpbnRlcmZhY2UgdG8gMC4KKwkgKiBUaGlzIHdpbGwgYWxzbyBkZWxldGUgdGhlIGRlc3RpbmF0aW9uIHJvdXRlLgorCSAqLwkKKwlpZl9kYXRhMSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZfaW5mby5pZnJfYWRkcjsKKwlpZl9kYXRhMS0+c2luX2FkZHIuc19hZGRyID0gMDsKKwlpZl9kYXRhMS0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJZXJyID0gZGV2aW5ldF9pb2N0bCggU0lPQ1NJRkFERFIsICZpZl9pbmZvICk7CisKKyAgICAgICAgc2V0X2ZzKGZzKTsgICAgICAgICAgIC8qIHJlc3RvcmUgb2xkIGJsb2NrICovCisKKwkKKwlpZiAoZXJyKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICIlczogRGVsZXRpbmcgZHluYW1pYyByb3V0ZSBmYWlsZWQgJWQhXG4iLAorCQkJIGNhcmQtPmRldm5hbWUsIGVycik7CisJCXJldHVybjsKKwl9ZWxzZXsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBQUFAgRGVsZXRpbmcgZHluYW1pYyByb3V0ZSAldS4ldS4ldS4ldSBzdWNjZXNzZnVseVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIE5JUFFVQUQoaXBfYWRkcikpOworCX0KKwlyZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFBlcmZvcm0gdGhlIEludGVycnVwdCBUZXN0IGJ5IHJ1bm5pbmcgdGhlIFJFQURfQ09ERV9WRVJTSU9OIGNvbW1hbmQgTUFYX0lOVFIKKyAqIF9URVNUX0NPVU5URVIgdGltZXMuCisgKi8KK3N0YXRpYyBpbnQgaW50cl90ZXN0KCBzZGxhX3QgKmNhcmQgKQoreworCXBwcF9tYm94X3QgKm1iID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyLGk7CisKKwllcnIgPSBwcHBfc2V0X2ludHJfbW9kZSggY2FyZCwgMHgwOCApOworCQorCWlmIChlcnIgPT0gQ01EX09LKSB7IAorCQkKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9JTlRSX1RFU1RfQ09VTlRFUjsgaSArKykgewkKKwkJCS8qIFJ1biBjb21tYW5kIFJFQURfQ09ERV9WRVJTSU9OICovCisJCQltZW1zZXQoJm1iLT5jbWQsIDAsIHNpemVvZihwcHBfY21kX3QpKTsKKwkJCW1iLT5jbWQubGVuZ3RoICA9IDA7CisJCQltYi0+Y21kLmNvbW1hbmQgPSBQUFBfUkVBRF9DT0RFX1ZFUlNJT047CisJCQllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwkJCWlmIChlcnIgIT0gQ01EX09LKSAKKwkJCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisJCX0KKwl9CisJZWxzZSByZXR1cm4gZXJyOworCisJZXJyID0gcHBwX3NldF9pbnRyX21vZGUoIGNhcmQsIDAgKTsKKwlpZiAoZXJyICE9IENNRF9PSykgCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVybWluZSB3aGF0IHR5cGUgb2YgVURQIGNhbGwgaXQgaXMuIERSVlNUQVRTIG9yIFBUUElQRUFCID8KKyAqLworc3RhdGljIGludCB1ZHBfcGt0X3R5cGUoIHN0cnVjdCBza19idWZmICpza2IsIHNkbGFfdCAqY2FyZCApCit7CisJdW5zaWduZWQgY2hhciAqc2VuZHBhY2tldDsKKwl1bnNpZ25lZCBjaGFyIGJ1ZjJbNV07IAorCXBwcF91ZHBfcGt0X3QgKnBwcF91ZHBfcGt0ID0gKHBwcF91ZHBfcGt0X3QgKilza2ItPmRhdGE7IAorCQorCXNlbmRwYWNrZXQgPSBza2ItPmRhdGE7CisJbWVtY3B5KCZidWYyLCAmY2FyZC0+d2FuZGV2LnVkcF9wb3J0LCAyKTsKKwkKKwlpZiggCXBwcF91ZHBfcGt0LT5pcF9wa3QudmVyX2luZXRfaGRyX2xlbmd0aCAgPT0gMHg0NSAmJiAgICAgICAgLyogSVAgcGFja2V0ICovIAorCQlzZW5kcGFja2V0WzldICA9PSAweDExICYmICAgICAgICAvKiBVRFAgcGFja2V0ICovCisJCXNlbmRwYWNrZXRbMjJdID09IGJ1ZjJbMV0gJiYgICAgIC8qIFVEUCBQb3J0ICovCisJCXNlbmRwYWNrZXRbMjNdID09IGJ1ZjJbMF0gJiYKKwkJc2VuZHBhY2tldFszNl0gPT0gMHgwMSApIHsKKwkKKwkJaWYgKCAgICBzZW5kcGFja2V0WzI4XSA9PSAweDUwICYmICAgIC8qIFBUUElQRUFCOiBTaWduYXR1cmUgKi8gCisJCQlzZW5kcGFja2V0WzI5XSA9PSAweDU0ICYmICAgICAgCisJCQlzZW5kcGFja2V0WzMwXSA9PSAweDUwICYmICAgICAgCisJCQlzZW5kcGFja2V0WzMxXSA9PSAweDQ5ICYmICAgICAgCisJCQlzZW5kcGFja2V0WzMyXSA9PSAweDUwICYmICAgICAgCisJCQlzZW5kcGFja2V0WzMzXSA9PSAweDQ1ICYmICAgICAgCisJCQlzZW5kcGFja2V0WzM0XSA9PSAweDQxICYmICAgICAgCisJCQlzZW5kcGFja2V0WzM1XSA9PSAweDQyICl7IAorCisJCQlyZXR1cm4gVURQX1BUUElQRV9UWVBFOworCQorCQl9IGVsc2UgaWYoc2VuZHBhY2tldFsyOF0gPT0gMHg0NCAmJiAgLyogRFJWU1RBVFM6IFNpZ25hdHVyZSAqLworCQkJc2VuZHBhY2tldFsyOV0gPT0gMHg1MiAmJiAgICAgIAorICAgICAgCQkJc2VuZHBhY2tldFszMF0gPT0gMHg1NiAmJiAgICAgIAorICAgICAgCQkJc2VuZHBhY2tldFszMV0gPT0gMHg1MyAmJiAgICAgIAorICAgICAgCQkJc2VuZHBhY2tldFszMl0gPT0gMHg1NCAmJiAgICAgIAorICAgICAgCQkJc2VuZHBhY2tldFszM10gPT0gMHg0MSAmJiAgICAgIAorICAgICAgCQkJc2VuZHBhY2tldFszNF0gPT0gMHg1NCAmJiAgICAgIAorICAgICAgCQkJc2VuZHBhY2tldFszNV0gPT0gMHg1MyApeworCQorCQkJcmV0dXJuIFVEUF9EUlZTVEFUU19UWVBFOworCisJCX0gZWxzZQorCQkJcmV0dXJuIFVEUF9JTlZBTElEX1RZUEU7CisKKwl9IGVsc2UKKwkJcmV0dXJuIFVEUF9JTlZBTElEX1RZUEU7CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaGVjayB0byBzZWUgaWYgdGhlIHBhY2tldCB0byBiZSB0cmFuc21pdHRlZCBjb250YWlucyBhIGJyb2FkY2FzdCBvcgorICogbXVsdGljYXN0IHNvdXJjZSBJUCBhZGRyZXNzLgorICovCisKK3N0YXRpYyBpbnQgY2hrX2JjYXN0X21jYXN0X2FkZHIoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJdTMyIHNyY19pcF9hZGRyOworICAgICAgICB1MzIgYnJvYWRjYXN0X2lwX2FkZHIgPSAwOworICAgICAgICBzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKyAgICAgICAgLyogcmVhZCB0aGUgSVAgc291cmNlIGFkZHJlc3MgZnJvbSB0aGUgb3V0Z29pbmcgcGFja2V0ICovCisgICAgICAgIHNyY19pcF9hZGRyID0gKih1MzIgKikoc2tiLT5kYXRhICsgMTIpOworCisJLyogcmVhZCB0aGUgSVAgYnJvYWRjYXN0IGFkZHJlc3MgZm9yIHRoZSBkZXZpY2UgKi8KKyAgICAgICAgaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisgICAgICAgIGlmKGluX2RldiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IGluX2lmYWRkciAqaWZhPSBpbl9kZXYtPmlmYV9saXN0OworICAgICAgICAgICAgICAgIGlmKGlmYSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0X2lwX2FkZHIgPSBpZmEtPmlmYV9icm9hZGNhc3Q7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAKKyAgICAgICAgLyogY2hlY2sgaWYgdGhlIElQIFNvdXJjZSBBZGRyZXNzIGlzIGEgQnJvYWRjYXN0IGFkZHJlc3MgKi8KKyAgICAgICAgaWYoKGRldi0+ZmxhZ3MgJiBJRkZfQlJPQURDQVNUKSAmJiAoc3JjX2lwX2FkZHIgPT0gYnJvYWRjYXN0X2lwX2FkZHIpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJyb2FkY2FzdCBTb3VyY2UgQWRkcmVzcyBzaWxlbnRseSBkaXNjYXJkZWRcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gCisKKyAgICAgICAgLyogY2hlY2sgaWYgdGhlIElQIFNvdXJjZSBBZGRyZXNzIGlzIGEgTXVsdGljYXN0IGFkZHJlc3MgKi8KKyAgICAgICAgaWYoKG50b2hsKHNyY19pcF9hZGRyKSA+PSAweEUwMDAwMDAxKSAmJgorCQkobnRvaGwoc3JjX2lwX2FkZHIpIDw9IDB4RkZGRkZGRkUpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE11bHRpY2FzdCBTb3VyY2UgQWRkcmVzcyBzaWxlbnRseSBkaXNjYXJkZWRcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKK30KKwordm9pZCBzNTA4X2xvY2sgKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKQoreworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT53YW5kZXYubG9jaywgKnNtcF9mbGFncyk7Cit9CisKK3ZvaWQgczUwOF91bmxvY2sgKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKQoreworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT53YW5kZXYubG9jaywgKnNtcF9mbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9jb25uZWN0aW9uX2luZm8gKHNkbGFfdCAqY2FyZCkKK3sKKwlwcHBfbWJveF90ICptYiA9IGNhcmQtPm1ib3g7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNhcmQtPndhbmRldi5kZXY7CisJcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXBwcDUwOF9jb25uZWN0X2luZm9fdCAqcHBwNTA4X2Nvbm5lY3RfaW5mbzsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZtYi0+Y21kLCAwLCBzaXplb2YocHBwX2NtZF90KSk7CisJbWItPmNtZC5sZW5ndGggID0gMDsKKwltYi0+Y21kLmNvbW1hbmQgPSBQUFBfR0VUX0NPTk5FQ1RJT05fSU5GTzsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCWlmIChlcnIgIT0gQ01EX09LKSB7IAorCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisJCXBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZSA9IDA7CisJCXBwcF9wcml2X2FyZWEtPmlwX2xvY2FsID0gMDsKKwl9CisJZWxzZSB7CisJCXBwcDUwOF9jb25uZWN0X2luZm8gPSAocHBwNTA4X2Nvbm5lY3RfaW5mb190ICopbWItPmRhdGE7CisJCXBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZSA9IHBwcDUwOF9jb25uZWN0X2luZm8tPmlwX3JlbW90ZTsKKwkJcHBwX3ByaXZfYXJlYS0+aXBfbG9jYWwgPSBwcHA1MDhfY29ubmVjdF9pbmZvLT5pcF9sb2NhbDsKKworCQlORVhfUFJJTlRLKEtFUk5fSU5GTyAiUkVBRCBDT05ORUNUSU9OIEdPVCBJUCBBRERSRVNTICV4LCAleFxuIiwKKwkJCQlwcHBfcHJpdl9hcmVhLT5pcF9yZW1vdGUsCisJCQkJcHBwX3ByaXZfYXJlYS0+aXBfbG9jYWwpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogY29uZmlnX3BwcAorICoKKyAqCUNvbmZpZ3VyZSB0aGUgcHBwIHByb3RvY29sIGFuZCBlbmFibGUgY29tbXVuaWNhdGlvbnMuCQkKKyAqCisgKiAgIAlUaGUgaWZfb3BlbiBmdW5jdGlvbiBiaW5kcyB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBwb2xsIHJvdXRpbmUuCisgKiAgICAgIFRoZXJlZm9yZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHJ1biBldmVyeSB0aW1lIHRoZSBwcHAgaW50ZXJmYWNlCisgKiAgICAgIGlzIGJyb3VnaHQgdXAuICAKKyAqICAgICAgCisgKglJZiB0aGUgY29tbXVuaWNhdGlvbnMgYXJlIG5vdCBlbmFibGVkLCBwcm9jZWVkIHRvIGNvbmZpZ3VyZQorICogICAgICB0aGUgY2FyZCBhbmQgZW5hYmxlIGNvbW11bmljYXRpb25zLgorICoKKyAqICAgICAgSWYgdGhlIGNvbW11bmljYXRpb25zIGFyZSBlbmFibGVkLCBpdCBtZWFucyB0aGF0IHRoZSBpbnRlcmZhY2UKKyAqICAgICAgd2FzIHNodXRkb3duIGJ5IGV0aGVyIHRoZSB1c2VyIG9yIGRyaXZlci4gSW4gdGhpcyBjYXNlLCB3ZSAKKyAqICAgICAgaGF2ZSB0byBjaGVjayB0aGF0IHRoZSBJUCBhZGRyZXNzZXMgaGF2ZSBub3QgY2hhbmdlZC4gIElmCisgKiAgICAgIHRoZSBJUCBhZGRyZXNzZXMgY2hhbmdlZCwgd2UgaGF2ZSB0byByZWNvbmZpZ3VyZSB0aGUgZmlybXdhcmUKKyAqICAgICAgYW5kIHVwZGF0ZSB0aGUgY2hhbmdlZCBJUCBhZGRyZXNzZXMuICBPdGhlcndpc2UsIGp1c3QgZXhpdC4KKyAqLworc3RhdGljIGludCBjb25maWdfcHBwIChzZGxhX3QgKmNhcmQpCit7CisKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwlwcHBfZmxhZ3NfdCAqZmxhZ3MgPSBjYXJkLT5mbGFnczsKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEgPSBkZXYtPnByaXY7CisKKwlpZiAoY2FyZC0+dS5wLmNvbW1fZW5hYmxlZCl7CisKKwkJaWYgKHBwcF9wcml2X2FyZWEtPmlwX2xvY2FsX3RtcCAhPSBwcHBfcHJpdl9hcmVhLT5pcF9sb2NhbCB8fAorCQkgICAgcHBwX3ByaXZfYXJlYS0+aXBfcmVtb3RlX3RtcCAhPSBwcHBfcHJpdl9hcmVhLT5pcF9yZW1vdGUpeworCQkJCisJCQkvKiBUaGUgSVAgYWRkZXJzc2VzIGhhdmUgY2hhbmdlZCwgd2UgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICogc3RvcCB0aGUgY29tbXVuaWNhdGlvbnMgYW5kIHJlY29uZmlndXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgY2FyZC4gUmVhc29uOiB0aGUgZmlybXdhcmUgbXVzdCBrbm93CisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgbG9jYWwgYW5kIHJlbW90ZSBJUCBhZGRyZXNzZXMuICovCisJCQlkaXNhYmxlX2NvbW0oY2FyZCk7CisJCQl3YW5waXBlX3NldF9zdGF0ZShjYXJkLCBXQU5fRElTQ09OTkVDVEVEKTsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBJUCBhZGRyZXNzZXMgY2hhbmdlZCFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlc3RhcnRpbmcgY29tbXVuaWNhdGlvbnMgLi4uXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJfWVsc2V7IAorCQkJLyogSVAgYWRkcmVzc2VzIGFyZSB0aGUgc2FtZSBhbmQgdGhlIGxpbmsgaXMgdXAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICogd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBoZXJlLiBUaGVyZWZvcmUsIGV4aXQgKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogUmVjb3JkIHRoZSBuZXcgSVAgYWRkcmVzZXMgKi8KKwlwcHBfcHJpdl9hcmVhLT5pcF9sb2NhbCA9IHBwcF9wcml2X2FyZWEtPmlwX2xvY2FsX3RtcDsKKwlwcHBfcHJpdl9hcmVhLT5pcF9yZW1vdGUgPSBwcHBfcHJpdl9hcmVhLT5pcF9yZW1vdGVfdG1wOworCisJaWYgKGNvbmZpZzUwOChkZXYsIGNhcmQpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBjb25maWd1cmUgUFBQIGRldmljZVxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocHBwX3NldF9pbnRyX21vZGUoY2FyZCwgUFBQX0lOVFJfUlhSRFl8CisJCQkgICAgCQlQUFBfSU5UUl9UWFJEWXwKKwkJCQkgICAgCVBQUF9JTlRSX01PREVNfAorCQkJCSAgICAJUFBQX0lOVFJfRElTQyB8CisJCQkJICAgIAlQUFBfSU5UUl9PUEVOIHwKKwkJCQkgICAgCVBQUF9JTlRSX0RST1BfRFRSIHwKKwkJCQkJUFBQX0lOVFJfVElNRVIpKSB7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBjb25maWd1cmUgYm9hcmQgaW50ZXJydXB0cyAhXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKyAgICAgICAgLyogVHVybiBvZmYgdGhlIHRyYW5zbWl0IGFuZCB0aW1lciBpbnRlcnJ1cHQgKi8KKwlmbGFncy0+aW1hc2sgJj0gfihQUFBfSU5UUl9UWFJEWSB8IFBQUF9JTlRSX1RJTUVSKSA7CisKKworCS8qIElmIHlvdSBhcmUgbm90IHRoZSBhdXRoZW50aWNhdG9yIGFuZCBhbnkgb25lIG9mIHRoZSBwcm90b2NvbCBpcyAKKwkgKiBlbmFibGVkIHRoZW4gd2UgY2FsbCB0aGUgc2V0X291dF9ib3VuZF9hdXRoZW50aWNhdGlvbi4KKwkgKi8KKwlpZiAoICFjYXJkLT51LnAuYXV0aGVudGljYXRvciAgJiYgKHBwcF9wcml2X2FyZWEtPnBhcCB8fCBwcHBfcHJpdl9hcmVhLT5jaGFwKSkgeworCQlpZiAoIHBwcF9zZXRfb3V0Ym5kX2F1dGgoY2FyZCwgcHBwX3ByaXZfYXJlYSkgKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPdXRib3VuZCBhdXRoZW50aWNhdGlvbiBmYWlsZWQgIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfSAKKwkKKwkvKiBJZiB5b3UgYXJlIHRoZSBhdXRoZW50aWNhdG9yIGFuZCBhbnkgb25lIG9mIHRoZSBwcm90b2NvbCBpcyBlbmFibGVkCisJICogdGhlbiB3ZSBjYWxsIHRoZSBzZXRfaW5fYm91bmRfYXV0aGVudGljYXRpb24uCisJICovCisJaWYgKGNhcmQtPnUucC5hdXRoZW50aWNhdG9yICYmIChwcHBfcHJpdl9hcmVhLT5wYXAgfHwgcHBwX3ByaXZfYXJlYS0+Y2hhcCkpeworCQlpZiAocHBwX3NldF9pbmJuZF9hdXRoKGNhcmQsIHBwcF9wcml2X2FyZWEpKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbmJvdW5kIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCAhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOwkKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogSWYgd2UgZmFpbCB0byBlbmFibGUgY29tbXVuaWNhdGlvbnMgaGVyZSBpdCdzIE9LLAorCSAqIHNpbmNlIHRoZSBEVFIgdGltZXIgd2lsbCBjYXVzZSBhIGRpc2Nvbm5lY3RlZCwgd2hpY2gKKwkgKiB3aWxsIHJldHJpZ2dlciBjb21tdW5pY2F0aW9uIGluIHRpbWVyX2ludHIoKSAqLworCWlmIChwcHBfY29tbV9lbmFibGUoY2FyZCkgPT0gQ01EX09LKSB7CisJCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9DT05ORUNUSU5HKTsKKwkJaW5pdF9wcHBfdHhfcnhfYnVmZihjYXJkKTsKKwl9CisKKwlyZXR1cm4gMDsgCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBwcHBfcG9sbAorICoJCisgKiBSYXRpb25hbGU6CisgKiAJV2UgY2Fubm90IG1hbmlwdWxhdGUgdGhlIHJvdXRpbmcgdGFibGVzLCBvcgorICogICAgICBpcCBhZGRyZXNzZXMgd2l0aGluZyB0aGUgaW50ZXJydXB0LiBUaGVyZWZvcmUKKyAqICAgICAgd2UgbXVzdCBwZXJmb3JtIHN1Y2ggYWN0b25zIG91dHNpZGUgYW4gaW50ZXJydXB0IAorICogICAgICBhdCBhIGxhdGVyIHRpbWUuIAorICoKKyAqIERlc2NyaXB0aW9uOgkKKyAqCVBQUCBwb2xsaW5nIHJvdXRpbmUsIHJlc3BvbnNpYmxlIGZvciAKKyAqICAgICAJc2h1dHRpbmcgZG93biBpbnRlcmZhY2VzIHVwb24gZGlzY29ubmVjdAorICogICAgIAlhbmQgYWRkaW5nL3JlbW92aW5nIHJvdXRlcy4gCisgKiAgICAgIAorICogVXNhZ2U6ICAgICAgICAKKyAqIAlUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGZvciBlYWNoIHBwcCAgCisgKiAJaW50ZXJmYWNlIHRocm91Z2ggYSB0cV9zY2hlZHVsZSBib3R0b20gaGFsZi4KKyAqICAgICAgCisgKiAgICAgIHRyaWdnZXJfcHBwX3BvbGwoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGtpY2sKKyAqICAgICAgdGhlIHBwcF9wb2xsIHJvdXRpbmUuICAKKyAqLworc3RhdGljIHZvaWQgcHBwX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWE7IAkKKwlzZGxhX3QgKmNhcmQ7CisJdTggY2hlY2tfZ2F0ZXdheT0wOworCXBwcF9mbGFnc190ICpmbGFnczsKKworCWlmICghZGV2IHx8IChwcHBfcHJpdl9hcmVhID0gZGV2LT5wcml2KSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwljYXJkID0gcHBwX3ByaXZfYXJlYS0+Y2FyZDsKKwlmbGFncyA9IGNhcmQtPmZsYWdzOworCisJLyogU2h1dGRvd24gaXMgaW4gcHJvZ3Jlc3MsIHN0b3Agd2hhdCB5b3UgYXJlIAorCSAqIGRvaW5nIGFuZCBnZXQgb3V0ICovCisJaWYgKHRlc3RfYml0KFBFUklfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisJCWNsZWFyX2JpdChQT0xMX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZl9vcGVuKCkgZnVuY3Rpb24gaGFzIHRyaWdnZXJlZCB0aGUgcG9sbGluZyByb3V0aW5lCisJICogdG8gZGV0ZXJtaW5lIHRoZSBjb25maWd1cmVkIElQIGFkZHJlc3Nlcy4gIE9uY2UgdGhlCisJICogYWRkcmVzc2VzIGFyZSBmb3VuZCwgdHJpZ2dlciB0aGUgY2hkbGMgY29uZmlndXJhdGlvbiAqLworCWlmICh0ZXN0X2JpdCgwLCZwcHBfcHJpdl9hcmVhLT5jb25maWdfcHBwKSl7CisKKwkJcHBwX3ByaXZfYXJlYS0+aXBfbG9jYWxfdG1wICA9IGdldF9pcF9hZGRyZXNzKGRldixXQU5fTE9DQUxfSVApOworCQlwcHBfcHJpdl9hcmVhLT5pcF9yZW1vdGVfdG1wID0gZ2V0X2lwX2FkZHJlc3MoZGV2LFdBTl9QT0lOVE9QT0lOVF9JUCk7CisKKwkJaWYgKHBwcF9wcml2X2FyZWEtPmlwX2xvY2FsX3RtcCA9PSBwcHBfcHJpdl9hcmVhLT5pcF9yZW1vdGVfdG1wICYmIAorCSAgICAgICAgICAgIGNhcmQtPnUucC5pcF9tb2RlID09IFdBTk9QVF9QUFBfSE9TVCl7CisJCQkKKwkJCWlmICgrK3BwcF9wcml2X2FyZWEtPmlwX2Vycm9yID4gTUFYX0lQX0VSUk9SUyl7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiXG4lczogLS0tIFdBUk5JTkcgLS0tXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRoZSBsb2NhbCBJUCBhZGRyZXNzIGlzIHRoZSBzYW1lIGFzIHRoZVxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQb2ludC10by1Qb2ludCBJUCBhZGRyZXNzLlxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAtLS0gV0FSTklORyAtLS1cblxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJfWVsc2V7CisJCQkJY2xlYXJfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJCQlwcHBfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzK0haOworCQkJCWFkZF90aW1lcigmcHBwX3ByaXZfYXJlYS0+cG9sbF9kZWxheV90aW1lcik7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJcHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgfD0gVE1SX0lOVF9FTkFCTEVEX0NPTkZJRzsKKwkJZmxhZ3MtPmltYXNrIHw9IFBQUF9JTlRSX1RJTUVSOwkKKwkJcHBwX3ByaXZfYXJlYS0+aXBfZXJyb3I9MDsJCisJCQorCQljbGVhcl9iaXQoMCwmcHBwX3ByaXZfYXJlYS0+Y29uZmlnX3BwcCk7CisJCWNsZWFyX2JpdChQT0xMX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBEeW5hbWljIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiwgYXMgd2VsbCBhcyBkeW5hbWljCisJICogcm91dGluZy4gICovCisJCisJc3dpdGNoIChjYXJkLT53YW5kZXYuc3RhdGUpIHsKKwkKKwljYXNlIFdBTl9ESVNDT05ORUNURUQ6CisKKwkJLyogSWYgdGhlIGR5bmFtaWMgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gaXMgb24sIGFuZCBpbnRlcmZhY2UgCisJCSAqIGlzIHVwLCB0aGVuIGJyaW5nIGRvd24gdGhlIG5ldG93cmsgaW50ZXJmYWNlICovCisKKwkJaWYgKHRlc3RfYml0KERZTl9PUFRfT04sJnBwcF9wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKSAmJgorCQkgICAgIXRlc3RfYml0KERFVl9ET1dOLCZwcHBfcHJpdl9hcmVhLT5pbnRlcmZhY2VfZG93bikJJiYJCisJCSAgICBjYXJkLT53YW5kZXYuZGV2LT5mbGFncyAmIElGRl9VUCl7CQorCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJmYWNlICVzIGRvd24uXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsY2FyZC0+d2FuZGV2LmRldi0+bmFtZSk7CisJCQljaGFuZ2VfZGV2X2ZsYWdzKGNhcmQtPndhbmRldi5kZXYsCisJCQkJCShjYXJkLT53YW5kZXYuZGV2LT5mbGFncyZ+SUZGX1VQKSk7CisJCQlzZXRfYml0KERFVl9ET1dOLCZwcHBfcHJpdl9hcmVhLT5pbnRlcmZhY2VfZG93bik7CisJCX1lbHNleworCQkJLyogV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgbG9jYWwgSVAgYWRkcmVzcyBpcworICAgICAgICAgICAgICAgCSAgIAkgKiB6ZXJvLiBJZiBpdCBpcywgd2Ugc2hvdWxkbid0IHRyeSB0byByZW1vdmUgaXQuCisgICAgICAgICAgICAgICAgIAkgKiBGb3Igc29tZSByZWFzb24gdGhlIGtlcm5lbCBjcmFzaGVzIGJhZGx5IGlmIAorICAgICAgICAgICAgICAgICAJICogd2UgdHJ5IHRvIHJlbW92ZSB0aGUgcm91dGUgdHdpY2UgKi8KKworCQkJaWYgKGNhcmQtPndhbmRldi5kZXYtPmZsYWdzICYgSUZGX1VQICYmIAorCQkgICAgCSAgICBnZXRfaXBfYWRkcmVzcyhjYXJkLT53YW5kZXYuZGV2LFdBTl9MT0NBTF9JUCkgJiYKKwkJICAgIAkgICAgY2FyZC0+dS5wLmlwX21vZGUgPT0gV0FOT1BUX1BQUF9QRUVSKXsKKworCQkJCXJlbW92ZV9yb3V0ZShjYXJkKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCisJCS8qIEluIFNNUCBtYWNoaW5lIHRoaXMgY29kZSBjYW4gZXhlY3V0ZSBiZWZvcmUgdGhlIGludGVyZmFjZQorCQkgKiBjb21lcyB1cC4gIEluIHRoaXMgY2FzZSwgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QKKwkJICogdHJ5IHRvIGJyaW5nIHVwIHRoZSBpbnRlcmZhY2UgYmVmb3JlIGRldl9vcGVuKCkgaXMgZmluaXNoZWQgKi8KKworCisJCS8qIERFVl9ET1dOIHdpbGwgYmUgc2V0IG9ubHkgd2hlbiB3ZSBicmluZyBkb3duIHRoZSBpbnRlcmZhY2UKKwkJICogZm9yIHRoZSB2ZXJ5IGZpcnN0IHRpbWUuIFRoaXMgd2F5IHdlIGtub3cgdGhhdCBpdCB3YXMgdXMKKwkJICogdGhhdCBicm91Z2h0IHRoZSBpbnRlcmZhY2UgZG93biAqLworCQkKKwkJaWYgKHRlc3RfYml0KERZTl9PUFRfT04sJnBwcF9wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKSAmJgorCSAgICAgICAgICAgIHRlc3RfYml0KERFVl9ET1dOLCAgJnBwcF9wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKSAmJgorIAkJICAgICEoY2FyZC0+d2FuZGV2LmRldi0+ZmxhZ3MgJiBJRkZfVVApKXsKKwkJCQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVyZmFjZSAlcyB1cC5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxjYXJkLT53YW5kZXYuZGV2LT5uYW1lKTsKKwkJCQorCQkJY2hhbmdlX2Rldl9mbGFncyhjYXJkLT53YW5kZXYuZGV2LChjYXJkLT53YW5kZXYuZGV2LT5mbGFnc3xJRkZfVVApKTsKKwkJCWNsZWFyX2JpdChERVZfRE9XTiwmcHBwX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pOworCQkJY2hlY2tfZ2F0ZXdheT0xOworCQl9CisKKwkJaWYgKChjYXJkLT51LnAuaXBfbW9kZSA9PSBXQU5PUFRfUFBQX1BFRVIpICYmIAorCQkgICAgdGVzdF9iaXQoMSwmUmVhZF9jb25uZWN0aW9uX2luZm8pKSB7IAorCQkJCisJCQlwcm9jZXNzX3JvdXRlKGNhcmQpOworCQkJY2xlYXJfYml0KDEsJlJlYWRfY29ubmVjdGlvbl9pbmZvKTsKKwkJCWNoZWNrX2dhdGV3YXk9MTsKKwkJfQorCisJCWlmIChwcHBfcHJpdl9hcmVhLT5nYXRld2F5ICYmIGNoZWNrX2dhdGV3YXkpCisJCQlhZGRfZ2F0ZXdheShjYXJkLGRldik7CisKKwkJYnJlYWs7CisJfQorCWNsZWFyX2JpdChQT0xMX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdHJpZ2dlcl9wcHBfcG9sbAorICoKKyAqIERlc2NyaXB0aW9uOgorICogCUFkZCBhIHBwcF9wb2xsKCkgdGFzayBpbnRvIGEgdHFfc2NoZWR1bGVyIGJoIGhhbmRsZXIKKyAqICAgICAgZm9yIGEgc3BlY2lmaWMgaW50ZXJmYWNlLiAgVGhpcyB3aWxsIGtpY2sKKyAqICAgICAgdGhlIHBwcF9wb2xsKCkgcm91dGluZSBhdCBhIGxhdGVyIHRpbWUuIAorICoKKyAqIFVzYWdlOgorICogCUludGVycnVwdHMgdXNlIHRoaXMgdG8gZGVmZXIgYSB0YWtzIHRvIAorICogICAgICBhIHBvbGxpbmcgcm91dGluZS4KKyAqCisgKi8JCisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfcHBwX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWE7CisJaWYgKChwcHBfcHJpdl9hcmVhPWRldi0+cHJpdikgIT0gTlVMTCl7IAkKKwkJCisJCXNkbGFfdCAqY2FyZCA9IHBwcF9wcml2X2FyZWEtPmNhcmQ7CisKKwkJaWYgKHRlc3RfYml0KFBFUklfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmICh0ZXN0X2FuZF9zZXRfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisJCQlyZXR1cm47CisJCX0KKworCQlzY2hlZHVsZV93b3JrKCZwcHBfcHJpdl9hcmVhLT5wb2xsX3dvcmspOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHBwcF9wb2xsX2RlbGF5ICh1bnNpZ25lZCBsb25nIGRldl9wdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9wdHI7CisJdHJpZ2dlcl9wcHBfcG9sbChkZXYpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogZGV0ZWN0X2FuZF9maXhfdHhfYnVnCisgKgorICogRGVzY3JpcHRpb246CisgKglPbiBjb25uZWN0LCBpZiB0aGUgYm9hcmQgdHggYnVmZmVyIHB0ciBpcyBub3QgdGhlIHNhbWUKKyAqICAgICAgYXMgdGhlIGRyaXZlciB0eCBidWZmZXIgcHRyLCB3ZSBmb3VuZCBhIGZpcm13YXJlIGJ1Zy4KKyAqICAgICAgUmVwb3J0IHRoZSBidWcgdG8gdGhlIGFib3ZlIGxheWVyLiAgVG8gZml4IHRoZQorICogICAgICBlcnJvciByZXN0YXJ0IGNvbW11bmljYXRpb25zIGFnYWluLgorICoKKyAqIFVzYWdlOgorICoKKyAqLwkKKworc3RhdGljIGludCBkZXRlY3RfYW5kX2ZpeF90eF9idWcgKHNkbGFfdCAqY2FyZCkKK3sKKwlpZiAoKCh1bnNpZ25lZCBsb25nKWNhcmQtPnUucC50eGJ1Zl9iYXNlJjB4RkZGKSAhPSAoKCpjYXJkLT51LnAudHhidWZfbmV4dCkmMHhGRkYpKXsKKwkJTkVYX1BSSU5USyhLRVJOX0lORk8gIk1ham9yIEVycm9yLCBGaXggdGhlIGJ1Z1xuIik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKioqKioqIEVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhX3gyNS5jIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFfeDI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5M2QyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhX3gyNS5jCkBAIC0wLDAgKzEsNTQ5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHNkbGFfeDI1LmMJV0FOUElQRSh0bSkgTXVsdGlwcm90b2NvbCBXQU4gTGluayBEcml2ZXIuICBYLjI1IG1vZHVsZS4KKyoKKyogQXV0aG9yOglOZW5hZCBDb3JiaWMJPG5jb3JiaWNAc2FuZ29tYS5jb20+CisqCisqIENvcHlyaWdodDoJKGMpIDE5OTUtMjAwMSBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuCisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIEFwciAwMywgMjAwMSAgTmVuYWQgQ29yYmljCSBvIEZpeGVkIHRoZSByeF9za2I9TlVMTCBidWcgaW4geDI1IGluIHJ4X2ludHIoKS4KKyogRGVjIDI2LCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gQWRkZWQgYSBuZXcgcG9sbGluZyByb3V0aW5lLCB0aGF0IHVzZXMKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBrZXJuZWwgdGltZXIgKG1vcmUgZWZmaWNpZW50KS4KKyogRGVjIDI1LCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gVXBkYXRlZCBmb3IgMi40Llgga2VybmVsCisqIEp1bCAyNiwgMjAwMCAgTmVuYWQgQ29yYmljCSBvIEluY3JlYXNlZCB0aGUgbG9jYWwgcGFja2V0IGJ1ZmZlcmluZworKiAJCQkJICAgZm9yIEFQSSB0byA0MDk2K2hlYWRlcl9zaXplLiAKKyogSnVsIDE3LCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gRml4ZWQgdGhlIHgyNSBzdGFydHVwIGJ1Zy4gRW5hYmxlIAorKiAJCQkJICAgY29tbXVuaWNhdGlvbnMgb25seSBhZnRlciBhbGwgaW50ZXJmYWNlcworKiAJCQkJICAgY29tZSB1cC4gIEhJR0ggU1ZDL1BWQyBpcyB1c2VkIHRvIGNhbGN1bGF0ZQorKiAJCQkJICAgdGhlIG51bWJlciBvZiBjaGFubmVscy4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIHByb3RvY29sIG9ubHkgYWZ0ZXIgYWxsIGludGVyZmFjZXMKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGVuYWJsZWQuCisqIEp1bCAxMCwgMjAwMAlOZW5hZCBDb3JiaWMJIG8gRml4ZWQgdGhlIE1fQklUIGJ1Zy4gCisqIEFwciAyNSwgMjAwMCAgTmVuYWQgQ29yYmljCSBvIFBhc3MgTW9kZW0gbWVzc2FnZXMgdG8gdGhlIEFQSS4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZSBpZGxlIHRpbWVvdXQgaW4gWDI1IEFQSS4KKyogQXByIDE0LCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gRml4ZWQ6IExhcmdlIExDTiBudW1iZXIgc3VwcG9ydC4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4aW11bSBMQ04gbnVtYmVyIGlzIDQwOTUuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heGltdW0gbnVtYmVyIG9mIFgyNSBjaGFubmVscyBpcyAyNTUuCisqIEFwciAwNiwgMjAwMCAgTmVuYWQgQ29yYmljCSBvIEFkZGVkIFNNUCBTdXBwb3J0LgorKiBNYXIgMjksIDIwMDAgIE5lbmFkIENvcmJpYwkgbyBBZGRlZCBzdXBwb3J0IGZvciBTNTE0IFBDSSBDYXJkCisqIE1hciAyMywgMjAwMCAgTmVuYWQgQ29yYmljCSBvIEltcHJvdmVkIHRhc2sgcXVldWUsIEJIIGhhbmRsaW5nLgorKiBNYXIgMTQsIDIwMDAgIE5lbmFkIENvcmJpYyAgCSBvIFVwZGF0ZWQgUHJvdG9jb2wgVmlvbGF0aW9uIGhhbmRsaW5nCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmVzLiAgQnVnIEZpeC4KKyogTWFyIDEwLCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gQnVnIEZpeDogY29ycnVwdGVkIG1ib3ggcmVjb3ZlcnkuCisqIE1hciAwOSwgMjAwMCAgTmVuYWQgQ29yYmljICAgICBvIEZpeGVkIHRoZSBhdXRvIEhETEMgYnVnLgorKiBNYXIgMDgsIDIwMDAJTmVuYWQgQ29yYmljICAgICBvIEZpeGVkIExBUEIgSERMQyBzdGFydHVwIHByb2JsZW1zLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbiBtdXN0IGJyaW5nIHRoZSBsaW5rIHVwIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgdHgvcngsIGFuZCBicmluZyB0aGUgCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsgZG93biBvbiBjbG9zZSgpLgorKiBNYXIgMDYsIDIwMDAJTmVuYWQgQ29yYmljCSBvIEFkZGVkIGFuIG9wdGlvbiBmb3IgbG9nZ2luZyBjYWxsIHNldHVwIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbi4gCisqIEZlYiAyOSwgMjAwMCAgTmVuYWQgQ29yYmljIAkgbyBBZGRlZCBzdXBwb3J0IGZvciBMQVBCIEhETEMgQVBJCisqIEZlYiAyNSwgMjAwMCAgTmVuYWQgQ29yYmljICAgICBvIEZpeGVkIHRoZSBtb2RlbSBmYWlsdXJlIGhhbmRsaW5nLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBNb2RlbSBPT0IgbWVzc2FnZSB3aWxsIGJlIHBhc3NlZCAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHVzZXIuCisqIEZlYiAyMSwgMjAwMCAgTmVuYWQgQ29yYmljIAkgbyBBZGRlZCBYcGlwZW1vbiBEZWJ1ZyBTdXBwb3J0CisqIERlYyAzMCwgMTk5OSAJTmVuYWQgQ29yYmljCSBvIFNvY2tldCBiYXNlZCBYMjVBUEkgCisqIFNlcCAxNywgMTk5OAlKYXNwcmVldCBTaW5naAkgbyBVcGRhdGVzIGZvciAyLjIuWCAga2VybmVsCisqIE1hciAxNSwgMTk5OAlBbGFuIENveAkgbyAyLjEueCBwb3J0aW5nCisqIERlYyAxOSwgMTk5NwlKYXNwcmVldCBTaW5naAkgbyBBZGRlZCBtdWx0aS1jaGFubmVsIElQWCBzdXBwb3J0CisqIE5vdiAyNywgMTk5NwlKYXNwcmVldCBTaW5naAkgbyBBZGRlZCBwcm90ZWN0aW9uIGFnYWluc3QgZW5hYmxpbmcgb2YgaXJxcworKgkJCQkgICB3aGVuIHRoZXkgYXJlIGRpc2FibGVkLgorKiBOb3YgMTcsIDE5OTcgIEZhcmhhbiBUaGF3YXIgICAgbyBBZGRlZCBJUFggc3VwcG9ydAorKgkJCQkgbyBDaGFuZ2VkIGlmX3NlbmQoKSB0byBub3cgYnVmZmVyIHBhY2tldHMgd2hlbgorKgkJCQkgICB0aGUgYm9hcmQgaXMgYnVzeQorKgkJCQkgbyBSZW1vdmVkIHF1ZXVlaW5nIG9mIHBhY2tldHMgdmlhIHRoZSBwb2xsaW5nCisqCQkJCSAgIHJvdXRpbmcKKyoJCQkJIG8gQ2hhbmdlZCBpZl9zZW5kKCkgY3JpdGljYWwgZmxhZ3MgdG8gcHJvcGVybHkKKyoJCQkJICAgaGFuZGxlIHJhY2UgY29uZGl0aW9ucworKiBOb3YgMDYsIDE5OTcgIEZhcmhhbiBUaGF3YXIgICAgbyBBZGRlZCBzdXBwb3J0IGZvciBTVkMgdGltZW91dHMKKyoJCQkJIG8gQ2hhbmdlZCBQVkMgZW5jYXBzdWxhdGlvbiB0byBFVEhfUF9JUAorKiBKdWwgMjEsIDE5OTcgIEphc3ByZWV0IFNpbmdoCSBvIEZpeGVkIGZyZWVpbmcgdXAgb2YgYnVmZmVycyB1c2luZyBrZnJlZSgpCisqCQkJCSAgIHdoZW4gcGFja2V0cyBhcmUgcmVjZWl2ZWQuCisqIE1hciAxMSwgMTk5NyAgRmFyaGFuIFRoYXdhciAgIFZlcnNpb24gMy4xLjEKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gYWRkZWQgc3VwcG9ydCBmb3IgVjM1CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIGNoYW5nZWQgaWZfc2VuZCgpIHRvIHJldHVybiAwIGlmCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbmRldi5jcml0aWNhbCgpIGlzIHRydWUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gZnJlZSBzb2NrZXQgYnVmZmVyIGluIGlmX3NlbmQoKSBpZgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgMAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBhZGRlZCBzdXBwb3J0IGZvciBzaW5nbGUgJ0AnIGFkZHJlc3MgdG8KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0IGFsbCBpbmNvbWluZyBjYWxscworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBmaXhlZCBidWcgaW4gc2V0X2NoYW5fc3RhdGUoKSB0byBkaXNjb25uZWN0CisqIEphbiAxNSwgMTk5NwlHZW5lIEtvemluCVZlcnNpb24gMy4xLjAKKyoJCQkJIG8gaW1wbGVtZW50ZWQgZXhlYygpIGVudHJ5IHBvaW50CisqIEphbiAwNywgMTk5NwlHZW5lIEtvemluCUluaXRpYWwgdmVyc2lvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCUluY2x1ZGVzIAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrKCksIGFuZCBvdGhlciB1c2VmdWwgc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogb2Zmc2V0b2YoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIHJldHVybiBjb2RlcyAqLworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBpbmxpbmUgbWVtc2V0KCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JLyoga21hbGxvYygpLCBrZnJlZSgpICovCisjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5waXBlLmg+CS8qIFdBTlBJUEUgY29tbW9uIHVzZXIgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgkvKiBodG9ucygpLCBldGMuICovCisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIEV4cGVyaW1lbnRhbCBkZWxheSAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc2RsYV94MjUuaD4JLyogWC4yNSBmaXJtd2FyZSBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl93YW5waXBlX2NvbW1vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3dhbnBpcGUuaD4KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCURlZmluZXMgJiBNYWNyb3MgCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisjZGVmaW5lCUNNRF9PSwkJMAkJLyogbm9ybWFsIGZpcm13YXJlIHJldHVybiBjb2RlICovCisjZGVmaW5lCUNNRF9USU1FT1VUCTB4RkYJCS8qIGZpcm13YXJlIGNvbW1hbmQgdGltZWQgb3V0ICovCisjZGVmaW5lCU1BWF9DTURfUkVUUlkJMTAJCS8qIG1heCBudW1iZXIgb2YgZmlybXdhcmUgcmV0cmllcyAqLworCisjZGVmaW5lCVgyNV9DSEFOX01UVQk0MDk2CQkvKiB1bmZyYWdtZW50ZWQgbG9naWNhbCBjaGFubmVsIE1UVSAqLworI2RlZmluZQlYMjVfSFJESERSX1NaCTcJCS8qIG1heCBlbmNhcHN1bGF0aW9uIGhlYWRlciBzaXplICovCisjZGVmaW5lCVgyNV9DT05DVF9UTU9VVAkoOTAqSFopCQkvKiBsaW5rIGNvbm5lY3Rpb24gdGltZW91dCAqLworI2RlZmluZQlYMjVfUkVDT05fVE1PVVQJKDEwKkhaKQkJLyogbGluayBjb25uZWN0aW9uIHRpbWVvdXQgKi8KKyNkZWZpbmUJQ09OTkVDVF9USU1FT1VUCSg5MCpIWikJCS8qIGxpbmsgY29ubmVjdGlvbiB0aW1lb3V0ICovCisjZGVmaW5lCUhPTERfRE9XTl9USU1FCSgzMCpIWikJCS8qIGxpbmsgaG9sZCBkb3duIHRpbWUgKi8KKyNkZWZpbmUgTUFYX0JIX0JVRkYJMTAKKyNkZWZpbmUgTV9CSVQJCTB4MDEJCisKKy8vI2RlZmluZSBQUklOVF9ERUJVRyAxCisjaWZkZWYgUFJJTlRfREVCVUcKKyNkZWZpbmUgREJHX1BSSU5USyhmb3JtYXQsIGEuLi4pIHByaW50ayhmb3JtYXQsICMjIGEpCisjZWxzZQorI2RlZmluZSBEQkdfUFJJTlRLKGZvcm1hdCwgYS4uLikKKyNlbmRpZiAgCisKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1BPTExfQUNUSVZFICAgICAgMHgwMQorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfUE9MTF9DT05ORUNUX09OICAweDAyCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9QT0xMX0NPTk5FQ1RfT0ZGIDB4MDQKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1BPTExfRElTQ09OTkVDVCAgMHgwOAorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfQ01EX0VYRUMJIDB4MTAKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1VQREFURQkJIDB4MjAKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1VEUF9QS1QJCSAweDQwCisKKyNkZWZpbmUgTUFYX1gyNV9BRERSX1NJWkUJMTYKKyNkZWZpbmUgTUFYX1gyNV9EQVRBX1NJWkUgCTEyOQorI2RlZmluZSBNQVhfWDI1X0ZBQ0xfU0laRQkxMTAKKworI2RlZmluZSBUUllfQ01EX0FHQUlOCTIKKyNkZWZpbmUgREVMQVlfUkVTVUxUICAgIDEKKyNkZWZpbmUgUkVUVVJOX1JFU1VMVCAgIDAKKworI2RlZmluZSBEQ0QoeCkgKHggJiAweDAzID8gIkhJR0giIDogIkxPVyIpCisjZGVmaW5lIENUUyh4KSAoeCAmIDB4MDUgPyAiSElHSCIgOiAiTE9XIikKKworCisvKiBEcml2ZXIgd2lsbCBub3Qgd3JpdGUgbG9nIG1lc3NhZ2VzIGFib3V0IAorICogbW9kZW0gc3RhdHVzIGlmIGRlZmluZWQuKi8KKyNkZWZpbmUgTU9ERU1fTk9UX0xPRyAxCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAqIAlGb3IgSVBYV0FOIAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIENWSGV4VG9Bc2NpaShiKSAoKCh1bnNpZ25lZCBjaGFyKShiKSA+ICh1bnNpZ25lZCBjaGFyKTkpID8gKCh1bnNpZ25lZCBjaGFyKSdBJyArICgodW5zaWduZWQgY2hhcikoYikgLSAodW5zaWduZWQgY2hhcikxMCkpIDogKCh1bnNpZ25lZCBjaGFyKScwJyArICh1bnNpZ25lZCBjaGFyKShiKSkpCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgICAgICAgTUVNT1JZIERFQlVHR0lORyBGVU5DVElPTgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgS01FTV9TQUZFVFlaT05FIDgKKworc3RhdGljIHZvaWQgKiBkYmdfa21hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IHByaW8sIGludCBsaW5lKSB7CisJaW50IGkgPSAwOworCXZvaWQgKiB2ID0ga21hbGxvYyhzaXplK3NpemVvZih1bnNpZ25lZCBpbnQpKzIqS01FTV9TQUZFVFlaT05FKjgscHJpbyk7CisJY2hhciAqIGMxID0gdjsJCisJYzEgKz0gc2l6ZW9mKHVuc2lnbmVkIGludCk7CisJKigodW5zaWduZWQgaW50ICopdikgPSBzaXplOworCisJZm9yIChpID0gMDsgaSA8IEtNRU1fU0FGRVRZWk9ORTsgaSsrKSB7CisJCWMxWzBdID0gJ0QnOyBjMVsxXSA9ICdFJzsgYzFbMl0gPSAnQSc7IGMxWzNdID0gJ0QnOworCQljMVs0XSA9ICdCJzsgYzFbNV0gPSAnRSc7IGMxWzZdID0gJ0UnOyBjMVs3XSA9ICdGJzsKKwkJYzEgKz0gODsKKwl9CisJYzEgKz0gc2l6ZTsKKwlmb3IgKGkgPSAwOyBpIDwgS01FTV9TQUZFVFlaT05FOyBpKyspIHsKKwkJYzFbMF0gPSAnTSc7IGMxWzFdID0gJ1UnOyBjMVsyXSA9ICdOJzsgYzFbM10gPSAnRyc7CisJCWMxWzRdID0gJ1cnOyBjMVs1XSA9ICdBJzsgYzFbNl0gPSAnTCc7IGMxWzddID0gJ0wnOworCQljMSArPSA4OworCX0KKwl2ID0gKChjaGFyICopdikgKyBzaXplb2YodW5zaWduZWQgaW50KSArIEtNRU1fU0FGRVRZWk9ORSo4OworCXByaW50ayhLRVJOX0lORk8gImxpbmUgJWQgIGttYWxsb2MoJWQsJWQpID0gJXBcbiIsbGluZSxzaXplLHByaW8sdik7CisJcmV0dXJuIHY7Cit9CitzdGF0aWMgdm9pZCBkYmdfa2ZyZWUodm9pZCAqIHYsIGludCBsaW5lKSB7CisJdW5zaWduZWQgaW50ICogc3AgPSAodW5zaWduZWQgaW50ICopKCgoY2hhciAqKXYpIC0gKHNpemVvZih1bnNpZ25lZCBpbnQpICsgS01FTV9TQUZFVFlaT05FKjgpKTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9ICpzcDsKKwljaGFyICogYzEgPSAoKGNoYXIgKil2KSAtIEtNRU1fU0FGRVRZWk9ORSo4OworCWludCBpID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgS01FTV9TQUZFVFlaT05FOyBpKyspIHsKKwkJaWYgKCAgIGMxWzBdICE9ICdEJyB8fCBjMVsxXSAhPSAnRScgfHwgYzFbMl0gIT0gJ0EnIHx8IGMxWzNdICE9ICdEJworCQkgICAgfHwgYzFbNF0gIT0gJ0InIHx8IGMxWzVdICE9ICdFJyB8fCBjMVs2XSAhPSAnRScgfHwgYzFbN10gIT0gJ0YnKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJrbWFsbG9jZWQgYmxvY2sgYXQgJXAgaGFzIGJlZW4gY29ycnVwdGVkICh1bmRlcnJ1bikhXG4iLHYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiICU0eDogJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeFxuIiwgaSo4LAorCQkJICAgICAgICAgICAgICAgIGMxWzBdLGMxWzFdLGMxWzJdLGMxWzNdLGMxWzRdLGMxWzVdLGMxWzZdLGMxWzddICk7CisJCX0KKwkJYzEgKz0gODsKKwl9CisJYzEgKz0gc2l6ZTsKKwlmb3IgKGkgPSAwOyBpIDwgS01FTV9TQUZFVFlaT05FOyBpKyspIHsKKwkJaWYgKCAgIGMxWzBdICE9ICdNJyB8fCBjMVsxXSAhPSAnVScgfHwgYzFbMl0gIT0gJ04nIHx8IGMxWzNdICE9ICdHJworCQkgICAgfHwgYzFbNF0gIT0gJ1cnIHx8IGMxWzVdICE9ICdBJyB8fCBjMVs2XSAhPSAnTCcgfHwgYzFbN10gIT0gJ0wnCisJCSAgICkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAia21hbGxvY2VkIGJsb2NrIGF0ICVwIGhhcyBiZWVuIGNvcnJ1cHRlZCAob3ZlcnJ1bik6XG4iLHYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiICU0eDogJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeFxuIiwgaSo4LAorCQkJICAgICAgICAgICAgICAgIGMxWzBdLGMxWzFdLGMxWzJdLGMxWzNdLGMxWzRdLGMxWzVdLGMxWzZdLGMxWzddICk7CisJCX0KKwkJYzEgKz0gODsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAibGluZSAlZCAga2ZyZWUoJXApXG4iLGxpbmUsdik7CisJdiA9ICgoY2hhciAqKXYpIC0gKHNpemVvZih1bnNpZ25lZCBpbnQpICsgS01FTV9TQUZFVFlaT05FKjgpOworCWtmcmVlKHYpOworfQorCisjZGVmaW5lIGttYWxsb2MoeCx5KSBkYmdfa21hbGxvYyh4LHksX19MSU5FX18pCisjZGVmaW5lIGtmcmVlKHgpIGRiZ19rZnJlZSh4LF9fTElORV9fKQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJRGF0YSBTdHJ1Y3R1cmVzIAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTmFtZTogCXgyNV9jaGFubmVsCisgKgorICogUHVycG9zZToJVG8gaG9sZCBwcml2YXRlIGluZm9ybWF0b24gZm9yIGVhY2ggIAorICogICAgICAgICAgICAgIGxvZ2ljYWwgY2hhbm5lbC4KKyAqCQkKKyAqIFJhdGlvbmFsZTogIAlQZXItY2hhbm5lbCBkZWJ1Z2dpbmcgaXMgcG9zc2libGUgaWYgZWFjaCAKKyAqICAgICAgICAgICAgICBjaGFubmVsIGhhcyBpdHMgb3duIHByaXZhdGUgYXJlYS4KKyAqCQorICogQXNzdW1wdGlvbnM6CisgKgorICogRGVzY3JpcHRpb246CVRoaXMgaXMgYW4gZXh0ZW50aW9uIG9mIHRoZSBzdHJ1Y3QgbmV0X2RldmljZQorICogICAgICAgICAgICAgIHdlIGNyZWF0ZSBmb3IgZWFjaCBuZXR3b3JrIGludGVyZmFjZSB0byBrZWVwIAorICogICAgICAgICAgICAgIHRoZSByZXN0IG9mIFguMjUgY2hhbm5lbC1zcGVjaWZpYyBkYXRhLiAKKyAqCisgKiBDb25zdHJ1Y3Q6CVR5cGVkZWYKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeDI1X2NoYW5uZWwKK3sKKwl3YW5waXBlX2NvbW1vbl90IGNvbW1vbjsJLyogY29tbW9uIGFyZWEgZm9yIHgyNWFwaSBhbmQgc29ja2V0ICovCisJY2hhciBuYW1lW1dBTl9JRk5BTUVfU1orMV07CS8qIGludGVyZmFjZSBuYW1lLCBBU0NJSVogKi8KKwljaGFyIGFkZHJbV0FOX0FERFJFU1NfU1orMV07CS8qIG1lZGlhIGFkZHJlc3MsIEFTQ0lJWiAqLworCXVuc2lnbmVkIHR4X3BrdF9zaXplOworCXVuc2lnbmVkIHNob3J0IHByb3RvY29sOwkvKiBldGhlcnR5cGUsIDAgLSBtdWx0aXBsZXhlZCAqLworCWNoYXIgZHJvcF9zZXF1ZW5jZTsJCS8qIG1hcmsgc2VxdWVuY2UgZm9yIGRyb3BwaW5nICovCisJdW5zaWduZWQgbG9uZyBzdGF0ZV90aWNrOwkvKiB0aW1lIG9mIHRoZSBsYXN0IHN0YXRlIGNoYW5nZSAqLworCXVuc2lnbmVkIGlkbGVfdGltZW91dDsJCS8qIHNlYywgYmVmb3JlIGRpc2Nvbm5lY3RpbmcgKi8KKwl1bnNpZ25lZCBsb25nIGlfdGltZW91dF9zb2ZhcjsgIC8qICMgb2Ygc2VjJ3Mgd2UndmUgYmVlbiBpZGxlICovCisJdW5zaWduZWQgaG9sZF90aW1lb3V0OwkJLyogc2VjLCBiZWZvcmUgcmUtY29ubmVjdGluZyAqLworCXVuc2lnbmVkIGxvbmcgdGlja19jb3VudGVyOwkvKiBjb3VudGVyIGZvciB0cmFuc21pdCB0aW1lIG91dCAqLworCWNoYXIgZGV2dGludDsJCQkvKiBXZWF0aGVyIHdlIHNob3VsZCBkZXZfdGludCgpICovCisJc3RydWN0IHNrX2J1ZmYqIHJ4X3NrYjsJCS8qIHJlY2VpdmUgc29ja2V0IGJ1ZmZlciAqLworCXN0cnVjdCBza19idWZmKiB0eF9za2I7CQkvKiB0cmFuc21pdCBzb2NrZXQgYnVmZmVyICovCisKKwliaF9kYXRhX3QgKmJoX2hlYWQ7CSAgCSAgLyogQ2lyY3VsYXIgYnVmZmVyIGZvciB4MjVhcGlfYmggKi8KKwl1bnNpZ25lZCBsb25nICB0cV93b3JraW5nOworCXZvbGF0aWxlIGludCAgYmhfd3JpdGU7CisJdm9sYXRpbGUgaW50ICBiaF9yZWFkOworCWF0b21pY190ICBiaF9idWZmX3VzZWQ7CisKKwlzZGxhX3QqIGNhcmQ7CQkJLyogLT4gb3duZXIgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwkJLyogLT4gYm91bmQgZGV2Y2UgKi8KKworCWludCBjaF9pZHg7CisJdW5zaWduZWQgY2hhciBlbmFibGVfSVBYOworCXVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXI7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgaWZzdGF0czsJLyogaW50ZXJmYWNlIHN0YXRpc3RpY3MgKi8KKwl1bnNpZ25lZCBzaG9ydCB0cmFuc21pdF9sZW5ndGg7CisJdW5zaWduZWQgc2hvcnQgdHhfb2Zmc2V0OworCWNoYXIgdHJhbnNtaXRfYnVmZmVyW1gyNV9DSEFOX01UVStzaXplb2YoeDI1YXBpX2hkcl90KV07CisKKwlpZl9zZW5kX3N0YXRfdCAgIGlmX3NlbmRfc3RhdDsKKyAgICAgICAgcnhfaW50cl9zdGF0X3QgICByeF9pbnRyX3N0YXQ7CisgICAgICAgIHBpcGVfbWdtdF9zdGF0X3QgcGlwZV9tZ210X3N0YXQ7ICAgIAorCisJdW5zaWduZWQgbG9uZyByb3V0ZXJfc3RhcnRfdGltZTsgLyogUm91dGVyIHN0YXJ0IHRpbWUgaW4gc2Vjb25kcyAqLworCXVuc2lnbmVkIGxvbmcgcm91dGVyX3VwX3RpbWU7CisJCit9IHgyNV9jaGFubmVsX3Q7CisKKy8qIEZJWE1FIFRha2UgdGhpcyBvdXQgKi8KKworI2lmZGVmIE5FWF9PTERfQ0FMTF9JTkZPCit0eXBlZGVmIHN0cnVjdCB4MjVfY2FsbF9pbmZvCit7CisJY2hhciBkZXN0WzE3XTsJCQlQQUNLRUQ7LyogQVNDSUlaIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwljaGFyIHNyY1sxN107CQkJUEFDS0VEOy8qIEFTQ0lJWiBzb3VyY2UgYWRkcmVzcyAqLworCWNoYXIgbnVzZXI7CQkJUEFDS0VEOy8qIG51bWJlciBvZiB1c2VyIGRhdGEgYnl0ZXMgKi8KKwl1bnNpZ25lZCBjaGFyIHVzZXJbMTI3XTsJUEFDS0VEOy8qIHVzZXIgZGF0YSAqLworCWNoYXIgbmZhY2lsOwkJCVBBQ0tFRDsvKiBudW1iZXIgb2YgZmFjaWxpdGllcyAqLworCXN0cnVjdAorCXsKKwkJdW5zaWduZWQgY2hhciBjb2RlOyAgICAgUEFDS0VEOworCQl1bnNpZ25lZCBjaGFyIHBhcm07ICAgICBQQUNLRUQ7CisJfSBmYWNpbFs2NF07CQkJICAgICAgICAvKiBmYWNpbGl0aWVzICovCit9IHgyNV9jYWxsX2luZm9fdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCB4MjVfY2FsbF9pbmZvCit7CisJY2hhciBkZXN0W01BWF9YMjVfQUREUl9TSVpFXQkJUEFDS0VEOy8qIEFTQ0lJWiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJY2hhciBzcmNbTUFYX1gyNV9BRERSX1NJWkVdCQlQQUNLRUQ7LyogQVNDSUlaIHNvdXJjZSBhZGRyZXNzICovCisJdW5zaWduZWQgY2hhciBudXNlcgkJCVBBQ0tFRDsKKwl1bnNpZ25lZCBjaGFyIHVzZXJbTUFYX1gyNV9EQVRBX1NJWkVdCVBBQ0tFRDsvKiB1c2VyIGRhdGEgKi8KKwl1bnNpZ25lZCBjaGFyIG5mYWNpbAkJCVBBQ0tFRDsKKwl1bnNpZ25lZCBjaGFyIGZhY2lsW01BWF9YMjVfRkFDTF9TSVpFXQlQQUNLRUQ7CisJdW5zaWduZWQgc2hvcnQgbGNuICAgICAgICAgICAgIAkJUEFDS0VEOworfSB4MjVfY2FsbF9pbmZvX3Q7CisjZW5kaWYKKworCisgIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoJUHJpdmF0ZSBGdW5jdGlvbiBQcm90b3R5cGVzCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAqIFdBTiBsaW5rIGRyaXZlciBlbnRyeSBwb2ludHMuIFRoZXNlIGFyZSAKKyAqIGNhbGxlZCBieSB0aGUgV0FOIHJvdXRlciBtb2R1bGUuCisgKi8KK3N0YXRpYyBpbnQgdXBkYXRlKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYpOworc3RhdGljIGludCBuZXdfaWYoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJICB3YW5pZl9jb25mX3QqIGNvbmYpOworc3RhdGljIGludCBkZWxfaWYoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbW0gKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbW1fc2h1dGRvd24oc2RsYV90ICpjYXJkKTsKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAqCVdBTlBJUEUtc3BlY2lmaWMgZW50cnkgcG9pbnRzIAorICovCitzdGF0aWMgaW50IHdweF9leGVjIChzdHJ1Y3Qgc2RsYSogY2FyZCwgdm9pZCogdV9jbWQsIHZvaWQqIHVfZGF0YSk7CitzdGF0aWMgdm9pZCB4MjVhcGlfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHgyNWFwaV9iaF9jbGVhbnVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBiaF9lbnF1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgKiAJTmV0d29yayBkZXZpY2UgaW50ZXJmYWNlIAorICovCitzdGF0aWMgaW50IGlmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgaW50IGlmX29wZW4oc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgaW50IGlmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworc3RhdGljIGludCBpZl9oZWFkZXIoc3RydWN0IHNrX2J1ZmYqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwl1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkKiBkYWRkciwgdm9pZCogc2FkZHIsIHVuc2lnbmVkIGxlbik7CitzdGF0aWMgaW50IGlmX3JlYnVpbGRfaGRyIChzdHJ1Y3Qgc2tfYnVmZiogc2tiKTsKK3N0YXRpYyBpbnQgaWZfc2VuZChzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaWZfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CisKK3N0YXRpYyB2b2lkIGlmX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgKiAJSW50ZXJydXB0IGhhbmRsZXJzIAorICovCitzdGF0aWMgdm9pZCB3cHhfaXNyCShzZGxhX3QgKik7CitzdGF0aWMgdm9pZCByeF9pbnRyCShzZGxhX3QgKik7CitzdGF0aWMgdm9pZCB0eF9pbnRyCShzZGxhX3QgKik7CitzdGF0aWMgdm9pZCBzdGF0dXNfaW50cgkoc2RsYV90ICopOworc3RhdGljIHZvaWQgZXZlbnRfaW50cgkoc2RsYV90ICopOworc3RhdGljIHZvaWQgc3B1cl9pbnRyCShzZGxhX3QgKik7CitzdGF0aWMgdm9pZCB0aW1lcl9pbnRyICAoc2RsYV90ICopOworCitzdGF0aWMgaW50IHR4X2ludHJfc2VuZChzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICptb3ZlX2Rldl90b19uZXh0KHNkbGFfdCAqY2FyZCwKKwkJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgKglCYWNrZ3JvdW5kIHBvbGxpbmcgcm91dGluZXMgCisgKi8KK3N0YXRpYyB2b2lkIHdweF9wb2xsIChzZGxhX3QqIGNhcmQpOworc3RhdGljIHZvaWQgcG9sbF9kaXNjb25uZWN0ZWQgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgdm9pZCBwb2xsX2Nvbm5lY3RpbmcgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgdm9pZCBwb2xsX2FjdGl2ZSAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIHRyaWdnZXJfeDI1X3BvbGwoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHgyNV90aW1lcl9yb3V0aW5lKHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICoJWC4yNSBmaXJtd2FyZSBpbnRlcmZhY2UgZnVuY3Rpb25zIAorICovCitzdGF0aWMgaW50IHgyNV9nZXRfdmVyc2lvbiAoc2RsYV90KiBjYXJkLCBjaGFyKiBzdHIpOworc3RhdGljIGludCB4MjVfY29uZmlndXJlIChzZGxhX3QqIGNhcmQsIFRYMjVDb25maWcqIGNvbmYpOworc3RhdGljIGludCBoZGxjX2NvbmZpZ3VyZSAoc2RsYV90KiBjYXJkLCBUWDI1Q29uZmlnKiBjb25mKTsKK3N0YXRpYyBpbnQgc2V0X2hkbGNfbGV2ZWwgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IHgyNV9nZXRfZXJyX3N0YXRzIChzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCB4MjVfZ2V0X3N0YXRzIChzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCB4MjVfc2V0X2ludHJfbW9kZSAoc2RsYV90KiBjYXJkLCBpbnQgbW9kZSk7CitzdGF0aWMgaW50IHgyNV9jbG9zZV9oZGxjIChzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCB4MjVfb3Blbl9oZGxjIChzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCB4MjVfc2V0dXBfaGRsYyAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgeDI1X3NldF9kdHIgKHNkbGFfdCogY2FyZCwgaW50IGR0cik7CitzdGF0aWMgaW50IHgyNV9nZXRfY2hhbl9jb25mIChzZGxhX3QqIGNhcmQsIHgyNV9jaGFubmVsX3QqIGNoYW4pOworc3RhdGljIGludCB4MjVfcGxhY2VfY2FsbCAoc2RsYV90KiBjYXJkLCB4MjVfY2hhbm5lbF90KiBjaGFuKTsKK3N0YXRpYyBpbnQgeDI1X2FjY2VwdF9jYWxsIChzZGxhX3QqIGNhcmQsIGludCBsY24sIGludCBxZG0pOworc3RhdGljIGludCB4MjVfY2xlYXJfY2FsbCAoc2RsYV90KiBjYXJkLCBpbnQgbGNuLCBpbnQgY2F1c2UsIGludCBkaWFnbik7CitzdGF0aWMgaW50IHgyNV9zZW5kIChzZGxhX3QqIGNhcmQsIGludCBsY24sIGludCBxZG0sIGludCBsZW4sIHZvaWQqIGJ1Zik7CitzdGF0aWMgaW50IHgyNV9mZXRjaF9ldmVudHMgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IHgyNV9lcnJvciAoc2RsYV90KiBjYXJkLCBpbnQgZXJyLCBpbnQgY21kLCBpbnQgbGNuKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAqCVguMjUgYXN5bmNocm9ub3VzIGV2ZW50IGhhbmRsZXJzIAorICovCitzdGF0aWMgaW50IGluY29taW5nX2NhbGwgKHNkbGFfdCogY2FyZCwgaW50IGNtZCwgaW50IGxjbiwgVFgyNU1ib3gqIG1iKTsKK3N0YXRpYyBpbnQgY2FsbF9hY2NlcHRlZCAoc2RsYV90KiBjYXJkLCBpbnQgY21kLCBpbnQgbGNuLCBUWDI1TWJveCogbWIpOworc3RhdGljIGludCBjYWxsX2NsZWFyZWQgKHNkbGFfdCogY2FyZCwgaW50IGNtZCwgaW50IGxjbiwgVFgyNU1ib3gqIG1iKTsKK3N0YXRpYyBpbnQgdGltZW91dF9ldmVudCAoc2RsYV90KiBjYXJkLCBpbnQgY21kLCBpbnQgbGNuLCBUWDI1TWJveCogbWIpOworc3RhdGljIGludCByZXN0YXJ0X2V2ZW50IChzZGxhX3QqIGNhcmQsIGludCBjbWQsIGludCBsY24sIFRYMjVNYm94KiBtYik7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAqCU1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zIAorICovCitzdGF0aWMgaW50IGNvbm5lY3QgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IGRpc2Nvbm5lY3QgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UqIGdldF9kZXZfYnlfbGNuKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsCisJCQkJCSB1bnNpZ25lZCBsY24pOworc3RhdGljIGludCBjaGFuX2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgaW50IGNoYW5fZGlzYyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9jaGFuX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIGludCBzdGF0ZSk7CitzdGF0aWMgaW50IGNoYW5fc2VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkKiBidWZmLCB1bnNpZ25lZCBkYXRhX2xlbiwKKwkJICAgICB1bnNpZ25lZCBjaGFyIHR4X2ludHIpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnBzX3RvX3NwZWVkX2NvZGUgKHVuc2lnbmVkIGxvbmcgYnBzKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVjX3RvX3VpbnQgKHVuc2lnbmVkIGNoYXIqIHN0ciwgaW50IGxlbik7CitzdGF0aWMgdW5zaWduZWQgaW50IGhleF90b191aW50ICh1bnNpZ25lZCBjaGFyKiwgaW50KTsKK3N0YXRpYyB2b2lkIHBhcnNlX2NhbGxfaW5mbyAodW5zaWduZWQgY2hhciosIHgyNV9jYWxsX2luZm9fdCopOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpmaW5kX2NoYW5uZWwoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsY24pOworc3RhdGljIHZvaWQgYmluZF9sY25fdG9fZGV2KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgbGNuKTsKK3N0YXRpYyB2b2lkIHNldHVwX2Zvcl9kZWxheWVkX3RyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICogICAgICBYMjUgQVBJIEZ1bmN0aW9ucyAKKyAqLworc3RhdGljIGludCB3YW5waXBlX3B1bGxfZGF0YV9pbl9za2Ioc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqKik7CitzdGF0aWMgdm9pZCB0aW1lcl9pbnRyX2V4ZWMoc2RsYV90ICosIHVuc2lnbmVkIGNoYXIpOworc3RhdGljIGludCBleGVjdXRlX2RlbGF5ZWRfY21kKHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBtYm94X2NtZF90ICp1c3JfY21kLCBjaGFyIGJhZF9jbWQpOworc3RhdGljIGludCBhcGlfaW5jb21pbmdfY2FsbCAoc2RsYV90KiwgVFgyNU1ib3ggKiwgaW50KTsKK3N0YXRpYyBpbnQgYWxsb2NfYW5kX2luaXRfc2tiX2J1ZiAoc2RsYV90ICosc3RydWN0IHNrX2J1ZmYgKiosIGludCk7CitzdGF0aWMgdm9pZCBzZW5kX2RlbGF5ZWRfY21kX3Jlc3VsdChzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIFRYMjVNYm94KiBtYm94KTsKK3N0YXRpYyBpbnQgY2xlYXJfY29uZmlybV9ldmVudCAoc2RsYV90ICosIFRYMjVNYm94Kik7CitzdGF0aWMgdm9pZCBzZW5kX29vYl9tc2cgKHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgVFgyNU1ib3ggKm1ib3gpOworc3RhdGljIGludCB0aW1lcl9pbnRyX2NtZF9leGVjKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgdm9pZCBhcGlfb29iX2V2ZW50IChzZGxhX3QgKmNhcmQsVFgyNU1ib3ggKm1ib3gpOworc3RhdGljIGludCBjaGVja19iYWRfY29tbWFuZChzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBjaGFubmVsX2Rpc2Nvbm5lY3Qoc2RsYV90KiBjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGhkbGNfbGlua19kb3duIChzZGxhX3QqKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgWFBJUEVNT04gRnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc191ZHBfbWdtdF9wa3Qoc2RsYV90ICopOworc3RhdGljIGludCB1ZHBfcGt0X3R5cGUoIHN0cnVjdCBza19idWZmICosIHNkbGFfdCopOworc3RhdGljIGludCByZXBseV91ZHAoIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50KTsgCitzdGF0aWMgdm9pZCBpbml0X3gyNV9jaGFubmVsX3N0cnVjdCggeDI1X2NoYW5uZWxfdCAqKTsKK3N0YXRpYyB2b2lkIGluaXRfZ2xvYmFsX3N0YXRpc3RpY3MoIHNkbGFfdCAqKTsKK3N0YXRpYyBpbnQgc3RvcmVfdWRwX21nbXRfcGt0KGludCB1ZHBfdHlwZSwgY2hhciB1ZHBfcGt0X3NyYywgc2RsYV90ICpjYXJkLAorCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCBsY24pOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGNhbGNfY2hlY2tzdW0gKGNoYXIgKiwgaW50KTsKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAqCUlQWCBmdW5jdGlvbnMgCisgKi8KK3N0YXRpYyB2b2lkIHN3aXRjaF9uZXRfbnVtYmVycyh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGNoYXIpOworc3RhdGljIGludCBoYW5kbGVfSVBYV0FOKHVuc2lnbmVkIGNoYXIgKiwgY2hhciAqLCB1bnNpZ25lZCBjaGFyICwgCisJCQkgdW5zaWduZWQgbG9uZyAsIHVuc2lnbmVkIHNob3J0ICk7CisKK2V4dGVybiB2b2lkIGRpc2FibGVfaXJxKHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCk7CisKK3N0YXRpYyB2b2lkIFM1MDhfUzUxNF9sb2NrKHNkbGFfdCAqLCB1bnNpZ25lZCBsb25nICopOworc3RhdGljIHZvaWQgUzUwOF9TNTE0X3VubG9jayhzZGxhX3QgKiwgdW5zaWduZWQgbG9uZyAqKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICogCUdsb2JhbCBWYXJpYWJsZXMgCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICoJUHVibGljIEZ1bmN0aW9ucyAKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogd3B4X2luaXQ6CVguMjUgUHJvdG9jb2wgSW5pdGlhbGl6YXRpb24gcm91dGluZS4KKyAqCisgKiBQdXJwb3NlOglUbyBpbml0aWFsaXplIHRoZSBwcm90b2NvbC9maXJtd2FyZS4KKyAqIAorICogUmF0aW9uYWxlOglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBzZXR1cCgpIGZ1bmN0aW9uLCBpbgorICogICAgICAgICAgICAgIHNkbGFtYWluLmMsIHRvIGR5bmFtaWNhbGx5IHNldHVwIHRoZSB4MjUgcHJvdG9jb2wuCisgKgkJVGhpcyBpcyB0aGUgZmlyc3QgcHJvdG9jb2wgc3BlY2lmaWMgZnVuY3Rpb24sIHdoaWNoCisgKiAgICAgICAgICAgICAgZXhlY3V0ZXMgb25jZSBvbiBzdGFydHVwLgorICogICAgICAgICAgICAgICAgCisgKiBEZXNjcmlwdGlvbjoJVGhpcyBwcm9jZWR1cmUgaW5pdGlhbGl6ZXMgdGhlIHgyNSBmaXJtd2FyZSBhbmQKKyAqICAgIAkJc2V0cyB1cCB0aGUgbWFpbGJveCwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVyCisgKiAgICAgICAgICAgICAgcG9pbnRlcnMuIEl0IGFsc28gaW5pdGlhbGl6ZXMgYWxsIGRlYnVnZ2luZyBzdHJ1Y3R1cmVzCisgKiAgICAgICAgICAgICAgYW5kIHNldHMgdXAgdGhlIFgyNSBlbnZpcm9ubWVudC4KKyAqCisgKgkJU2V0cyB1cCBoYXJkd2FyZSBvcHRpb25zIGRlZmluZWQgYnkgdXNlciBpbiBbd2FucGlwZSNdIAorICoJCXNlY3Rpb24gb2Ygd2FucGlwZSMuY29uZiBjb25maWd1cmF0aW9uIGZpbGUuIAorICoKKyAqIAkJQXQgdGhpcyBwb2ludCBhZGFwdGVyIGlzIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgCisgKiAgICAgIAlhbmQgWC4yNSBmaXJtd2FyZSBpcyBydW5uaW5nLgorICogIAkJbyByZWFkIGZpcm13YXJlIHZlcnNpb24gKHRvIG1ha2Ugc3VyZSBpdCdzIGFsaXZlKQorICogIAkJbyBjb25maWd1cmUgYWRhcHRlcgorICogIAkJbyBpbml0aWFsaXplIHByb3RvY29sLXNwZWNpZmljIGZpZWxkcyBvZiB0aGUgCisgKiAgICAgICAgICAgICAgICBhZGFwdGVyIGRhdGEgc3BhY2UuCisgKgorICogQ2FsbGVkIGJ5OglzZXR1cCgpIGZ1bmN0aW9uIGluIHNkbGFtYWluLmMKKyAqCisgKiBBc3N1bXB0aW9uczoJTm9uZQorICoKKyAqIFdhcm5pbmdzOglOb25lCisgKgorICogUmV0dXJuOiAJMAlvLmsuCisgKgkgCTwgMAlmYWlsdXJlLgorICovCisKK2ludCB3cHhfaW5pdCAoc2RsYV90KiBjYXJkLCB3YW5kZXZfY29uZl90KiBjb25mKQoreworCXVuaW9ueworCQljaGFyIHN0cls4MF07CisJCVRYMjVDb25maWcgY2ZnOworCX0gdTsKKworCS8qIFZlcmlmeSBjb25maWd1cmF0aW9uIElEICovCisJaWYgKGNvbmYtPmNvbmZpZ19pZCAhPSBXQU5DT05GSUdfWDI1KXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgY29uZmlndXJhdGlvbiBJRCAldSFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjb25mLT5jb25maWdfaWQpCisJCTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgKi8KKwljYXJkLT5tYm94ICA9ICh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArIFgyNV9NQk9YX09GRlMpOworCWNhcmQtPnJ4bWIgID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgWDI1X1JYTUJPWF9PRkZTKTsKKwljYXJkLT5mbGFncyA9ICh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArIFgyNV9TVEFUVVNfT0ZGUyk7CisKKwkvKiBJbml0aWFsaXplIGZvciBTNTE0IENhcmQgKi8KKwlpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkgeworCQljYXJkLT5tYm94ICs9IFgyNV9NQl9WRUNUT1I7CisJCWNhcmQtPmZsYWdzICs9IFgyNV9NQl9WRUNUT1I7CisJCWNhcmQtPnJ4bWIgKz0gWDI1X01CX1ZFQ1RPUjsKKwl9CisKKworCS8qIFJlYWQgZmlybXdhcmUgdmVyc2lvbi4gIE5vdGUgdGhhdCB3aGVuIGFkYXB0ZXIgaW5pdGlhbGl6ZXMsIGl0CisJICogY2xlYXJzIHRoZSBtYWlsYm94LCBzbyBpdCBtYXkgYXBwZWFyIHRoYXQgdGhlIGZpcnN0IGNvbW1hbmQgd2FzCisJICogZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IHdoZW4gaW4gZmFjdCBpdCB3YXMgbWVyZWx5IGVyYXNlZC4gVG8gd29yaworCSAqIGFyb3VuZCB0aGlzLCB3ZSBleGVjdXRlIHRoZSBmaXJzdCBjb21tYW5kIHR3aWNlLgorCSAqLworCWlmICh4MjVfZ2V0X3ZlcnNpb24oY2FyZCwgTlVMTCkgfHwgeDI1X2dldF92ZXJzaW9uKGNhcmQsIHUuc3RyKSkKKwkJcmV0dXJuIC1FSU87CisKKworCS8qIFgyNSBmaXJtd2FyZSBjYW4gcnVuIGV0aGVyIGluIFgyNSBvciBMQVBCIEhETEMgbW9kZS4KKyAgICAgICAgICogQ2hlY2sgdGhlIHVzZXIgZGVmaW5lZCBvcHRpb24gYW5kIGNvbmZpZ3VyZSBhY2NvcmRpbmdseSAqLworCWlmIChjb25mLT51LngyNS5MQVBCX2hkbGNfb25seSA9PSBXQU5PUFRfWUVTKXsKKwkJaWYgKHNldF9oZGxjX2xldmVsKGNhcmQpICE9IENNRF9PSyl7CisJCQlyZXR1cm4gLUVJTzsJCisJCX1lbHNleworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJ1bm5pbmcgTEFQX0IgSERMQyBmaXJtd2FyZSB2JXNcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgdS5zdHIpOworCQl9CisJCWNhcmQtPnUueC5MQVBCX2hkbGMgPSAxOworCX1lbHNleworCQlwcmludGsoS0VSTl9JTkZPICIlczogcnVubmluZyBYLjI1IGZpcm13YXJlIHYlc1xuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCB1LnN0cik7CisJCWNhcmQtPnUueC5MQVBCX2hkbGMgPSAwOworCX0KKworCS8qIENvbmZpZ3VyZSBhZGFwdGVyLiBIZXJlIHdlIHNldCByZXNvbmFibGUgZGVmYXVsdHMsIHRoZW4gcGFyc2UKKwkgKiBkZXZpY2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgYW5kIHNldCBjb25maWd1cmF0aW9uIG9wdGlvbnMuCisJICogTW9zdCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHZlcmlmaWVkIGFuZCBjb3JyZWN0ZWQgKGlmCisJICogbmVjZXNzYXJ5KSBzaW5jZSB3ZSBjYW4ndCByZWx5IG9uIHRoZSBhZGFwdGVyIHRvIGRvIHNvLgorCSAqLworCW1lbXNldCgmdS5jZmcsIDAsIHNpemVvZih1LmNmZykpOworCXUuY2ZnLnQxCQk9IDM7CisJdS5jZmcubjIJCT0gMTA7CisJdS5jZmcuYXV0b0hkbGMJCT0gMTsJCS8qIGF1dG9tYXRpYyBIRExDIGNvbm5lY3Rpb24gKi8KKwl1LmNmZy5oZGxjV2luZG93CT0gNzsKKwl1LmNmZy5wa3RXaW5kb3cJCT0gMjsKKwl1LmNmZy5zdGF0aW9uCQk9IDE7CQkvKiBEVEUgKi8KKwl1LmNmZy5vcHRpb25zCQk9IDB4MDA5MDsJLyogZGlzYWJsZSBELWJpdCBwcmFnbWF0aWNzICovCisJdS5jZmcuY2NpdHRDb21wYXQJPSAxOTg4OworCXUuY2ZnLnQxMHQyMAkJPSAzMDsKKwl1LmNmZy50MTF0MjEJCT0gMzA7CisJdS5jZmcudDEydDIyCQk9IDMwOworCXUuY2ZnLnQxM3QyMwkJPSAzMDsKKwl1LmNmZy50MTZ0MjYJCT0gMzA7CisJdS5jZmcudDI4CQk9IDMwOworCXUuY2ZnLnIxMHIyMAkJPSA1OworCXUuY2ZnLnIxMnIyMgkJPSA1OworCXUuY2ZnLnIxM3IyMwkJPSA1OworCXUuY2ZnLnJlc3BvbnNlT3B0CT0gMTsJCS8qIFJSJ3MgYWZ0ZXIgZXZlcnkgcGFja2V0ICovCisKKwlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYyl7CisJCXUuY2ZnLmhkbGNNVFUgPSAxMDI3OworCX0KKworCWlmIChjb25mLT51LngyNS54MjVfY29uZl9vcHQpeworCQl1LmNmZy5vcHRpb25zID0gY29uZi0+dS54MjUueDI1X2NvbmZfb3B0OworCX0KKworCWlmIChjb25mLT5jbG9ja2luZyAhPSBXQU5PUFRfRVhURVJOQUwpCisJCXUuY2ZnLmJhdWRSYXRlID0gYnBzX3RvX3NwZWVkX2NvZGUoY29uZi0+YnBzKTsKKworCWlmIChjb25mLT5zdGF0aW9uICE9IFdBTk9QVF9EVEUpeworCQl1LmNmZy5zdGF0aW9uID0gMDsJCS8qIERDRSBtb2RlICovCisJfQorCisgICAgICAgIGlmIChjb25mLT5pbnRlcmZhY2UgIT0gV0FOT1BUX1JTMjMyICl7CisJICAgICAgICB1LmNmZy5oZGxjT3B0aW9ucyB8PSAweDgwOyAgICAgIC8qIFYzNSBtb2RlICovCisJfSAKKworCS8qIGFkanVzdCBNVFUgKi8KKwlpZiAoIWNvbmYtPm10dSB8fCAoY29uZi0+bXR1ID49IDEwMjQpKQorCQljYXJkLT53YW5kZXYubXR1ID0gMTAyNDsKKwllbHNlIGlmIChjb25mLT5tdHUgPj0gNTEyKQorCQljYXJkLT53YW5kZXYubXR1ID0gNTEyOworCWVsc2UgaWYgKGNvbmYtPm10dSA+PSAyNTYpCisJCWNhcmQtPndhbmRldi5tdHUgPSAyNTY7CisJZWxzZSBpZiAoY29uZi0+bXR1ID49IDEyOCkKKwkJY2FyZC0+d2FuZGV2Lm10dSA9IDEyODsKKwllbHNlIAorCQljYXJkLT53YW5kZXYubXR1ID0gNjQ7CisKKwl1LmNmZy5kZWZQa3RTaXplID0gdS5jZmcucGt0TVRVID0gY2FyZC0+d2FuZGV2Lm10dTsKKworCWlmIChjb25mLT51LngyNS5oaV9wdmMpeworCQljYXJkLT51LnguaGlfcHZjID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5oaV9wdmMsIE1BWF9MQ05fTlVNKTsKKwkJY2FyZC0+dS54LmxvX3B2YyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUubG9fcHZjLCBjYXJkLT51LnguaGlfcHZjKTsKKwl9CisKKwlpZiAoY29uZi0+dS54MjUuaGlfc3ZjKXsKKwkJY2FyZC0+dS54LmhpX3N2YyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUuaGlfc3ZjLCBNQVhfTENOX05VTSk7CisJCWNhcmQtPnUueC5sb19zdmMgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LmxvX3N2YywgY2FyZC0+dS54LmhpX3N2Yyk7CisJfQorCisJLyogRmlndXJlIG91dCB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzIHRvIGNvbmZpZ3VyZSAqLworCWNhcmQtPnUueC5udW1fb2ZfY2ggPSAwOworCWlmIChjYXJkLT51LnguaGlfc3ZjICE9IDApeworCQljYXJkLT51LngubnVtX29mX2NoID0gKGNhcmQtPnUueC5oaV9zdmMgLSBjYXJkLT51LngubG9fc3ZjKSArIDE7CisJfQorCWlmIChjYXJkLT51LnguaGlfcHZjICE9IDApeworCQljYXJkLT51LngubnVtX29mX2NoICs9IChjYXJkLT51LnguaGlfcHZjIC0gY2FyZC0+dS54LmxvX3B2YykgKyAxOworCX0KKworCWlmIChjYXJkLT51LngubnVtX29mX2NoID09IDApeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRVJST1IsIE1pbmltdW0gbnVtYmVyIG9mIFBWQy9TVkMgY2hhbm5lbHMgaXMgMSAhXG4iCisJCQkJICIlczogUGxlYXNlIHNldCB0aGUgTG93ZXN0L0hpZ2hlc3QgUFZDL1NWQyB2YWx1ZXMgIVxuIiwKKwkJCQkgY2FyZC0+ZGV2bmFtZSxjYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIC1FQ0hSTkc7CisJfQorCQorCXUuY2ZnLmxvUFZDID0gY2FyZC0+dS54LmxvX3B2YzsKKwl1LmNmZy5oaVBWQyA9IGNhcmQtPnUueC5oaV9wdmM7CisJdS5jZmcubG9Ud29XYXlTVkMgPSBjYXJkLT51LngubG9fc3ZjOworCXUuY2ZnLmhpVHdvV2F5U1ZDID0gY2FyZC0+dS54LmhpX3N2YzsKKworCWlmIChjb25mLT51LngyNS5oZGxjX3dpbmRvdykKKwkJdS5jZmcuaGRsY1dpbmRvdyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUuaGRsY193aW5kb3csIDcpOworCWlmIChjb25mLT51LngyNS5wa3Rfd2luZG93KQorCQl1LmNmZy5wa3RXaW5kb3cgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnBrdF93aW5kb3csIDcpOworCisJaWYgKGNvbmYtPnUueDI1LnQxKQorCQl1LmNmZy50MSA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUudDEsIDMwKTsKKwlpZiAoY29uZi0+dS54MjUudDIpCisJCXUuY2ZnLnQyID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS50MiwgMjkpOworCWlmIChjb25mLT51LngyNS50NCkKKwkJdS5jZmcudDQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnQ0LCAyNDApOworCWlmIChjb25mLT51LngyNS5uMikKKwkJdS5jZmcubjIgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1Lm4yLCAzMCk7CisKKwlpZiAoY29uZi0+dS54MjUudDEwX3QyMCkKKwkJdS5jZmcudDEwdDIwID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS50MTBfdDIwLDI1NSk7CisJaWYgKGNvbmYtPnUueDI1LnQxMV90MjEpCisJCXUuY2ZnLnQxMXQyMSA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUudDExX3QyMSwyNTUpOworCWlmIChjb25mLT51LngyNS50MTJfdDIyKQorCQl1LmNmZy50MTJ0MjIgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnQxMl90MjIsMjU1KTsKKwlpZiAoY29uZi0+dS54MjUudDEzX3QyMykJCisJCXUuY2ZnLnQxM3QyMyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUudDEzX3QyMywyNTUpOworCWlmIChjb25mLT51LngyNS50MTZfdDI2KQorCQl1LmNmZy50MTZ0MjYgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnQxNl90MjYsIDI1NSk7CisJaWYgKGNvbmYtPnUueDI1LnQyOCkKKwkJdS5jZmcudDI4ID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS50MjgsIDI1NSk7CisKKwlpZiAoY29uZi0+dS54MjUucjEwX3IyMCkKKwkJdS5jZmcucjEwcjIwID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5yMTBfcjIwLDI1MCk7CisJaWYgKGNvbmYtPnUueDI1LnIxMl9yMjIpCisJCXUuY2ZnLnIxMnIyMiA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUucjEyX3IyMiwyNTApOworCWlmIChjb25mLT51LngyNS5yMTNfcjIzKQorCQl1LmNmZy5yMTNyMjMgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnIxM19yMjMsMjUwKTsKKworCisJaWYgKGNvbmYtPnUueDI1LmNjaXR0X2NvbXBhdCkKKwkJdS5jZmcuY2NpdHRDb21wYXQgPSBjb25mLT51LngyNS5jY2l0dF9jb21wYXQ7CisKKwkvKiBpbml0aWFsaXplIGFkYXB0ZXIgKi8KKwlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYyl7CisJCWlmIChoZGxjX2NvbmZpZ3VyZShjYXJkLCAmdS5jZmcpICE9IENNRF9PSykKKwkJCXJldHVybiAtRUlPOworCX1lbHNleworCQlpZiAoeDI1X2NvbmZpZ3VyZShjYXJkLCAmdS5jZmcpICE9IENNRF9PSykKKwkJCXJldHVybiAtRUlPOworCX0KKworCWlmICgoeDI1X2Nsb3NlX2hkbGMoY2FyZCkgIT0gQ01EX09LKSB8fAkJLyogY2xvc2UgSERMQyBsaW5rICovCisJICAgICh4MjVfc2V0X2R0cihjYXJkLCAwKSAhPSBDTURfT0spKQkJLyogZHJvcCBEVFIgKi8KKwkJcmV0dXJuIC1FSU87CisKKwkvKiBJbml0aWFsaXplIHByb3RvY29sLXNwZWNpZmljIGZpZWxkcyBvZiBhZGFwdGVyIGRhdGEgc3BhY2UgKi8KKwljYXJkLT53YW5kZXYuYnBzCT0gY29uZi0+YnBzOworCWNhcmQtPndhbmRldi5pbnRlcmZhY2UJPSBjb25mLT5pbnRlcmZhY2U7CisJY2FyZC0+d2FuZGV2LmNsb2NraW5nCT0gY29uZi0+Y2xvY2tpbmc7CisJY2FyZC0+d2FuZGV2LnN0YXRpb24JPSBjb25mLT5zdGF0aW9uOworCWNhcmQtPmlzcgkJPSAmd3B4X2lzcjsKKwljYXJkLT5wb2xsCQk9IE5VTEw7IC8vJndweF9wb2xsOworCWNhcmQtPmRpc2FibGVfY29tbQk9ICZkaXNhYmxlX2NvbW07CisJY2FyZC0+ZXhlYwkJPSAmd3B4X2V4ZWM7CisJY2FyZC0+d2FuZGV2LnVwZGF0ZQk9ICZ1cGRhdGU7CisJY2FyZC0+d2FuZGV2Lm5ld19pZgk9ICZuZXdfaWY7CisJY2FyZC0+d2FuZGV2LmRlbF9pZgk9ICZkZWxfaWY7CisKKwkvKiBXQVJOSU5HOiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBleGl0IHdpdGggYW4gZXJyb3IKKwkgKiAgICAgICAgICBhZnRlciB0aGUgY2hhbmdlIG9mIHN0YXRlICovCisJY2FyZC0+d2FuZGV2LnN0YXRlCT0gV0FOX0RJU0NPTk5FQ1RFRDsKKwkKKwljYXJkLT53YW5kZXYuZW5hYmxlX3R4X2ludCA9IDA7CisJY2FyZC0+aXJxX2Rpc19pZl9zZW5kX2NvdW50ID0gMDsKKyAgICAgICAgY2FyZC0+aXJxX2Rpc19wb2xsX2NvdW50ID0gMDsKKwljYXJkLT51LngudHhfZGV2ID0gTlVMTDsKKwljYXJkLT51Lngubm9fZGV2ID0gMDsKKworCisJLyogQ29uZmlndXJlIGZvciBTNTE0IFBDSSBDYXJkICovCisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSB7CisJCWNhcmQtPnUueC5oZGxjX2J1Zl9zdGF0dXMgPSAKKwkJCSh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopCisJCQkJKGNhcmQtPmh3LmRwbWJhc2UgKyBYMjVfTUJfVkVDVE9SKyBYMjVfTUlTQ19IRExDX0JJVFMpOworCX1lbHNleworCQljYXJkLT51LnguaGRsY19idWZfc3RhdHVzID0gCisJCQkodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShjYXJkLT5ody5kcG1iYXNlICsgWDI1X01JU0NfSERMQ19CSVRTKTsgCisJfQorCisJY2FyZC0+dS54LnBvbGxfZGV2aWNlPU5VTEw7CisJY2FyZC0+d2FuZGV2LnVkcF9wb3J0ID0gY29uZi0+dWRwX3BvcnQ7CisKKwkvKiBFbmFibGUgb3IgZGlzYWJsZSBjYWxsIHNldHVwIGxvZ2dpbmcgKi8KKwlpZiAoY29uZi0+dS54MjUubG9nZ2luZyA9PSBXQU5PUFRfWUVTKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVuYWJsaW5nIENhbGwgTG9nZ2luZy5cbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKwkJY2FyZC0+dS54LmxvZ2dpbmcgPSAxOworCX1lbHNlewkKKwkJY2FyZC0+dS54LmxvZ2dpbmcgPSAwOworCX0KKworCS8qIEVuYWJsZSBvciBkaXNhYmxlIG1vZGVtIHN0YXR1cyByZXBvcnRpbmcgKi8KKwlpZiAoY29uZi0+dS54MjUub29iX29uX21vZGVtID09IFdBTk9QVF9ZRVMpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRW5hYmxpbmcgT09CIG9uIE1vZGVtIGNoYW5nZS5cbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKwkJY2FyZC0+dS54Lm9vYl9vbl9tb2RlbSA9IDE7CisJfWVsc2V7CisJCWNhcmQtPnUueC5vb2Jfb25fbW9kZW0gPSAwOworCX0KKwkKKwlpbml0X2dsb2JhbF9zdGF0aXN0aWNzKGNhcmQpOwkKKworCUlOSVRfV09SSygmY2FyZC0+dS54LngyNV9wb2xsX3dvcmssICh2b2lkICopd3B4X3BvbGwsIGNhcmQpOworCisJaW5pdF90aW1lcigmY2FyZC0+dS54LngyNV90aW1lcik7CisJY2FyZC0+dS54LngyNV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpY2FyZDsKKwljYXJkLT51LngueDI1X3RpbWVyLmZ1bmN0aW9uID0geDI1X3RpbWVyX3JvdXRpbmU7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKglXQU4gRGV2aWNlIERyaXZlciBFbnRyeSBQb2ludHMgCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE5hbWU6CXVwZGF0ZSgpLCAgVXBkYXRlIGRldmljZSBzdGF0dXMgJiBzdGF0aXN0aWNzLgorICoKKyAqIFB1cnBvc2U6CVRvIHByb3ZpZGUgZGVidWdnaW5nIGFuZCBzdGF0aXRpY2FsCisgKiAgICAgICAgICAgICAgaW5mb3JtYXRpb24gdG8gdGhlIC9wcm9jIGZpbGUgc3lzdGVtLgorICogICAgICAgICAgICAgIC9wcm9jL25ldC93YW5yb3V0ZXIvd2FucGlwZSMKKyAqICAgICAgICAgICAgICAJCisgKiBSYXRpb25hbGU6CVRoZSAvcHJvYyBmaWxlIHN5c3RlbSBpcyB1c2VkIHRvIGNvbGxlY3QKKyAqICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUga2VybmVsIGFuZCBkcml2ZXJzLgorICogICAgICAgICAgICAgIFVzaW5nIHRoZSAvcHJvYyBmaWxlIHN5c3RlbSB0aGUgdXNlcgorICogICAgICAgICAgICAgIGNhbiBzZWUgZXhhY3RseSB3aGF0IHRoZSBzYW5nb21hIGRyaXZlcnMgYXJlCisgKiAgICAgICAgICAgICAgZG9pbmcuIEFuZCBpbiB3aGF0IHN0YXRlIHRoZXkgYXJlIGluLiAKKyAqICAgICAgICAgICAgICAgIAorICogRGVzY3JpcHRpb246IENvbGxlY3QgYWxsIGRyaXZlciBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbgorICogICAgICAgICAgICAgIGFuZCBwYXNzIGl0IHRvIHRoZSB0b3AgbGF5d2VyLiAKKyAqCQkKKyAqCQlTaW5jZSB3ZSBoYXZlIHRvIGV4ZWN1dGUgYSBkZWJ1Z2dpbmcgY29tbWFuZCwgCisgKiAgICAgICAgICAgICAgdG8gb2J0YWluIGZpcm13YXJlIHN0YXRpdGljcywgd2UgdHJpZ2dlciBhIAorICogICAgICAgICAgICAgIFVQREFURSBmdW5jdGlvbiB3aXRoaW4gdGhlIHRpbWVyIGludGVycnR1cC4KKyAqICAgICAgICAgICAgICBXZSB3YWl0IHVudGlsIHRoZSB0aW1lciB1cGRhdGUgaXMgY29tcGxldGUuCisgKiAgICAgICAgICAgICAgT25jZSBjb21wbGV0ZSByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHJldHVybgorICogICAgICAgICAgICAgIGNvZGUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdXBkYXRlIHdhcyBzdWNjZXNzZnVsLgorICogICAgICAgICAgICAgIAorICogQ2FsbGVkIGJ5OglkZXZpY2Vfc3RhdCgpIGluIHdhbm1haW4uYworICoKKyAqIEFzc3VtcHRpb25zOgkKKyAqCisgKiBXYXJuaW5nczoJVGhpcyBmdW5jdGlvbiB3aWxsIGRlZ3JhZGUgdGhlIHBlcmZvcm1hbmNlCisgKiAgICAgICAgICAgICAgb2YgdGhlIHJvdXRlciwgc2luY2UgaXQgdXNlcyB0aGUgbWFpbGJveC4gCisgKgorICogUmV0dXJuOiAJMCAJT0sKKyAqIAkJPDAJRmFpbGVkIChvciBidXN5KS4KKyAqLworCitzdGF0aWMgaW50IHVwZGF0ZShzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2KQoreworCXZvbGF0aWxlIHNkbGFfdCogY2FyZDsKKwlUWDI1U3RhdHVzKiBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmICgod2FuZGV2ID09IE5VTEwpIHx8ICh3YW5kZXYtPnByaXZhdGUgPT0gTlVMTCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHdhbmRldi0+c3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAodGVzdF9iaXQoU0VORF9DUklULCAodm9pZCopJndhbmRldi0+Y3JpdGljYWwpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWlmICghd2FuZGV2LT5kZXYpCisJCXJldHVybiAtRU5PREVWOworCQorCWNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisJc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisKKwljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgfD0gVE1SX0lOVF9FTkFCTEVEX1VQREFURTsKKwlzdGF0dXMtPmltYXNrIHw9IElOVFJfT05fVElNRVI7CisJdGltZW91dCA9IGppZmZpZXM7CQorCisJZm9yICg7Oyl7CisJCWlmICghKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VUERBVEUpKXsJCisJCQlicmVhazsKKwkJfQorCQlpZiAoKGppZmZpZXMtdGltZW91dCkgPiAxKkhaKXsKKwkJCWNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX1VQREFURTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTmFtZToJbmV3X2lmCisgKgorICogUHVycG9zZToJVG8gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcmVzb3VyY2VzIGZvciBhIAorICogICAgICAgICAgICAgIG5ldyBsb2dpY2FsIGNoYW5uZWwuICAKKyAqIAorICogUmF0aW9uYWxlOglBIG5ldyBjaGFubmVsIGNhbiBiZSBhZGRlZCBkeW5hbWljYWxseSB2aWEKKyAqICAgICAgICAgICAgICBpb2N0bCBjYWxsLgorICogICAgICAgICAgICAgICAgCisgKiBEZXNjcmlwdGlvbjoJQWxsb2NhdGUgYSBwcml2YXRlIGNoYW5uZWwgc3RydWN0dXJlLCB4MjVfY2hhbm5lbF90LgorICoJCVBhcnNlIHRoZSB1c2VyIGludGVyZmFjZSBvcHRpb25zIGZyb20gd2FucGlwZSMuY29uZiAKKyAqCQljb25maWd1cmF0aW9uIGZpbGUuIAorICoJCUJpbmQgdGhlIHByaXZhdGUgYXJlIGludG8gdGhlIG5ldHdvcmsgZGV2aWNlIHByaXZhdGUKKyAqICAgICAgICAgICAgICBhcmVhIHBvaW50ZXIgKGRldi0+cHJpdikuCisgKgkJUHJlcGFyZSB0aGUgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlIGZvciByZWdpc3RyYXRpb24uCisgKgorICogQ2FsbGVkIGJ5OglST1VURVJfSUZORVcgSW9jdGwgY2FsbCwgZnJvbSB3YW5yb3V0ZXJfaW9jdGwoKSAKKyAqICAgICAgICAgICAgICAod2FubWFpbi5jKQorICoKKyAqIEFzc3VtcHRpb25zOiBOb25lCisgKgorICogV2FybmluZ3M6CU5vbmUKKyAqCisgKiBSZXR1cm46IAkwIAlPaworICoJCTwwIAlGYWlsZWQgKGNoYW5uZWwgd2lsbCBub3QgYmUgY3JlYXRlZCkKKyAqLworc3RhdGljIGludCBuZXdfaWYoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJICB3YW5pZl9jb25mX3QqIGNvbmYpCit7CisJc2RsYV90KiBjYXJkID0gd2FuZGV2LT5wcml2YXRlOworCXgyNV9jaGFubmVsX3QqIGNoYW47CisJaW50IGVyciA9IDA7CisKKwlpZiAoKGNvbmYtPm5hbWVbMF0gPT0gJ1wwJykgfHwgKHN0cmxlbihjb25mLT5uYW1lKSA+IFdBTl9JRk5BTUVfU1opKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgaW50ZXJmYWNlIG5hbWUhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmKGNhcmQtPndhbmRldi5uZXdfaWZfY250KysgPiAwICYmIGNhcmQtPnUueC5MQVBCX2hkbGMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVycm9yOiBSdW5uaW5nIExBUEIgSERMQyBNb2RlICFcbiIsCisJCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogTWF4aW11bSBudW1iZXIgb2YgbmV0d29yayBpbnRlcmZhY2VzIG11c3QgYmUgb25lICFcbiIsCisJCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcHJpdmF0ZSBkYXRhICovCisJY2hhbiA9IGttYWxsb2Moc2l6ZW9mKHgyNV9jaGFubmVsX3QpLCBHRlBfQVRPTUlDKTsKKwlpZiAoY2hhbiA9PSBOVUxMKXsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCQorCW1lbXNldChjaGFuLCAwLCBzaXplb2YoeDI1X2NoYW5uZWxfdCkpOworCisJLyogQnVnIEZpeDogU2VnIEVyciBvbiBQVkMgc3RhcnR1cAorCSAqIEl0IG11c3QgYmUgaGVyZSBzaW5jZSBiaW5kX2xjbl90b19kZXYgZXhwZWN0cyAKKwkgKiBpdCBiZWxsb3cgKi8KKwlkZXYtPnByaXYgPSBjaGFuOworCQorCXN0cmNweShjaGFuLT5uYW1lLCBjb25mLT5uYW1lKTsKKwljaGFuLT5jYXJkID0gY2FyZDsKKwljaGFuLT5kZXYgPSBkZXY7CisJY2hhbi0+Y29tbW9uLnNrID0gTlVMTDsKKwljaGFuLT5jb21tb24uZnVuYyA9IE5VTEw7CisJY2hhbi0+Y29tbW9uLnJ3X2JpbmQgPSAwOworCWNoYW4tPnR4X3NrYiA9IGNoYW4tPnJ4X3NrYiA9IE5VTEw7CisKKwkvKiB2ZXJpZnkgbWVkaWEgYWRkcmVzcyAqLworCWlmIChjb25mLT5hZGRyWzBdID09ICdAJyl7CQkvKiBTVkMgKi8KKwkJY2hhbi0+Y29tbW9uLnN2YyA9IDE7CisJCXN0cm5jcHkoY2hhbi0+YWRkciwgJmNvbmYtPmFkZHJbMV0sIFdBTl9BRERSRVNTX1NaKTsKKworCQkvKiBTZXQgY2hhbm5lbCB0aW1lb3V0cyAoZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkKSAqLworCQljaGFuLT5pZGxlX3RpbWVvdXQgPSAoY29uZi0+aWRsZV90aW1lb3V0KSA/IAorCQkJCQljb25mLT5pZGxlX3RpbWVvdXQgOiA5MDsKKwkJY2hhbi0+aG9sZF90aW1lb3V0ID0gKGNvbmYtPmhvbGRfdGltZW91dCkgPyAKKwkJCQkJY29uZi0+aG9sZF90aW1lb3V0IDogMTA7CisKKwl9ZWxzZSBpZiAoaXNfZGlnaXQoY29uZi0+YWRkclswXSkpewkvKiBQVkMgKi8KKwkJaW50IGxjbiA9IGRlY190b191aW50KGNvbmYtPmFkZHIsIDApOworCisJCWlmICgobGNuID49IGNhcmQtPnUueC5sb19wdmMpICYmIChsY24gPD0gY2FyZC0+dS54LmhpX3B2YykpeworCQkJYmluZF9sY25fdG9fZGV2IChjYXJkLCBkZXYsIGxjbik7CisJCX1lbHNleworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJIiVzOiBQVkMgJXUgaXMgb3V0IG9mIHJhbmdlIG9uIGludGVyZmFjZSAlcyFcbiIsCisJCQkJd2FuZGV2LT5uYW1lLCBsY24sIGNoYW4tPm5hbWUpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJfQorCX1lbHNleworCQlwcmludGsoS0VSTl9FUlIKKwkJCSIlczogaW52YWxpZCBtZWRpYSBhZGRyZXNzIG9uIGludGVyZmFjZSAlcyFcbiIsCisJCQl3YW5kZXYtPm5hbWUsIGNoYW4tPm5hbWUpOworCQllcnIgPSAtRUlOVkFMOworCX0KKworCWlmKHN0cmNtcChjb25mLT51c2VkYnksICJXQU5QSVBFIikgPT0gMCl7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgaW4gV0FOUElQRSBtb2RlICVzXG4iLAorCQkJd2FuZGV2LT5uYW1lLCBjaGFuLT5uYW1lKTsKKyAgICAgICAgICAgICAgICBjaGFuLT5jb21tb24udXNlZGJ5ID0gV0FOUElQRTsKKwkJY2hhbi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisKKyAgICAgICAgfWVsc2UgaWYoc3RyY21wKGNvbmYtPnVzZWRieSwgIkFQSSIpID09IDApeworCQljaGFuLT5jb21tb24udXNlZGJ5ID0gQVBJOworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBSdW5uaW5nIGluIEFQSSBtb2RlICVzXG4iLAorCQkJd2FuZGV2LT5uYW1lLCBjaGFuLT5uYW1lKTsKKwkJY2hhbi0+cHJvdG9jb2wgPSBodG9ucyhYMjVfUFJPVCk7CisJfQorCisKKwlpZiAoZXJyKXsKKwkJa2ZyZWUoY2hhbik7CisJCWRldi0+cHJpdiA9IE5VTEw7CisJCXJldHVybiBlcnI7CisJfQorCQorCWNoYW4tPmVuYWJsZV9JUFggPSBjb25mLT5lbmFibGVfSVBYOworCQorCWlmIChjaGFuLT5lbmFibGVfSVBYKQorCQljaGFuLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQWCk7CisJCisJaWYgKGNvbmYtPm5ldHdvcmtfbnVtYmVyKQorCQljaGFuLT5uZXR3b3JrX251bWJlciA9IGNvbmYtPm5ldHdvcmtfbnVtYmVyOworCWVsc2UKKwkJY2hhbi0+bmV0d29ya19udW1iZXIgPSAweERFQURCRUVGOworCisJLyogcHJlcGFyZSBuZXR3b3JrIGRldmljZSBkYXRhIHNwYWNlIGZvciByZWdpc3RyYXRpb24gKi8KKwlzdHJjcHkoZGV2LT5uYW1lLGNoYW4tPm5hbWUpOworCisJZGV2LT5pbml0ID0gJmlmX2luaXQ7CisKKwlpbml0X3gyNV9jaGFubmVsX3N0cnVjdChjaGFuKTsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE5hbWU6CWRlbF9pZigpLCAgUmVtb3ZlIGEgbG9naWNhbCBjaGFubmVsLgkgCisgKgorICogUHVycG9zZToJVG8gZHluYW1pY2FsbHkgcmVtb3ZlIGEgbG9naWNhbCBjaGFubmVsLgorICogCisgKiBSYXRpb25hbGU6CUVhY2ggbG9naWNhbCBjaGFubmVsIHNob3VsZCBiZSBkeW5hbWljYWxseQorICogICAgICAgICAgICAgIHJlbW92YWJsZS4gVGhpcyBmdW5jdGluIGlzIGNhbGxlZCBieSBhbiAKKyAqICAgICAgICAgICAgICBJT0NUTF9JRkRFTCBpb2N0bCBjYWxsIG9yIHNodXRkb3duKCkuIAorICogICAgICAgICAgICAgICAgCisgKiBEZXNjcmlwdGlvbjogRG8gbm90aGluZy4KKyAqCisgKiBDYWxsZWQgYnk6CUlPQ1RMX0lGREVMIDogd2Fucm91dGVyX2lvY3RsKCkgZnJvbSB3YW5tYWluLmMKKyAqICAgICAgICAgICAgICBzaHV0ZG93bigpIGZyb20gc2RsYW1haW4uYworICoKKyAqIEFzc3VtcHRpb25zOiAKKyAqCisgKiBXYXJuaW5nczoKKyAqCisgKiBSZXR1cm46IAkwIE9rLiBWb2lkIGZ1bmN0aW9uLgorICovCisKKy8vRklYTUUgRGVsIElGIFNob3VsZCBiZSB0YWtlbiBvdXQgbm93LgorCitzdGF0aWMgaW50IGRlbF9pZihzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBOYW1lOgl3cHhfZXhlYworICoKKyAqIERlc2NyaXB0aW9uOglFeGVjdXRlIGFkYXB0ZXIgaW50ZXJmYWNlIGNvbW1hbmQuCisgKiAJCVRoaXMgb3B0aW9uIGlzIGN1cnJlbnRseSBkaXNzYWJsZWQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB3cHhfZXhlYyAoc3RydWN0IHNkbGEqIGNhcmQsIHZvaWQqIHVfY21kLCB2b2lkKiB1X2RhdGEpCit7CisgICAgICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTmFtZToJZGlzYWJsZV9jb21tCQorICoKKyAqIERlc2NyaXB0aW9uOglEaXNhYmxlIGNvbW11bmljYXRpb25zIGR1cmluZyBzaHV0ZG93bi4KKyAqICAgICAgICAgICAgICBEb250IGNoZWNrIHJldHVybiBjb2RlIGJlY2F1c2UgdGhlcmUgaXMgCisgKiAgICAgICAgICAgICAgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgaXQuICAKKyAqCisgKiBXYXJuaW5nOglEZXYgYW5kIHByaXZhdGUgYXJlYXMgYXJlIGdvbmUgYXQgdGhpcyBwb2ludC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbW0oc2RsYV90KiBjYXJkKQoreworCWRpc2FibGVfY29tbV9zaHV0ZG93bihjYXJkKTsKKwlkZWxfdGltZXIoJmNhcmQtPnUueC54MjVfdGltZXIpOworCXJldHVybjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoJTmV0d29yayBEZXZpY2UgSW50ZXJmYWNlIAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTmFtZToJaWZfaW5pdCgpLCAgIE5ldG93cmsgSW50ZXJmYWNlIEluaXRpYWxpemF0aW9uIAkgCisgKgorICogUHVycG9zZToJVG8gaW5pdGlhbGl6ZSBhIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAKKyAqIFJhdGlvbmFsZToJRHVyaW5nIG5ldHdvcmsgaW50ZXJmYWNlIHN0YXJ0dXAsIHRoZSBpZl9pbml0CisgKiAgICAgICAgICAgICAgaXMgY2FsbGVkIGJ5IHRoZSBrZXJuZWwgdG8gaW5pdGlhbGl6ZSB0aGUKKyAqICAgICAgICAgICAgICBuZXRvd3JrIGRldmljZSBzdHJ1Y3R1cmUuICBUaHVzIGEgZHJpdmVyCisgKiAgICAgICAgICAgICAgY2FuIGN1c3RvbXplIGEgbmV0d29yayBkZXZpY2UuIAorICogICAgICAgICAgICAgICAgCisgKiBEZXNjcmlwdGlvbjoJSW5pdGlhbGl6ZSB0aGUgbmV0b3dyayBkZXZpY2UgY2FsbCBiYWNrCisgKiAgICAgICAgICAgICAgcm91dGluZXMuICBUaGlzIGlzIHdoZXJlIHdlIHRlbGwgdGhlIGtlcm5lbAorICogICAgICAgICAgICAgIHdoaWNoIGZ1bmN0aW9uIHRvIHVzZSB3aGVuIGl0IHdhbnRzIHRvIHNlbmQKKyAqICAgICAgICAgICAgICB2aWEgb3VyIGludGVyZmFjZS4gCisgKgkJRnVydGhlcm1vcmUsIHdlIGluaXRpYWxpemUgdGhlIGRldmljZSBmbGFncywgCisgKiAgICAgICAgICAgICAgTVRVIGFuZCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBib2FyZC4KKyAqCisgKiBDYWxsZWQgYnk6CUtlcm5lbCAoL3Vzci9zcmMvbGludXgvbmV0L2NvcmUvZGV2LmMpCisgKiAJCShkZXYtPmluaXQoKSkKKyAqCisgKiBBc3N1bXB0aW9uczogTm9uZQorICoJCisgKiBXYXJuaW5nczoJTm9uZQorICoKKyAqIFJldHVybjogCTAgCU9rIDogVm9pZCBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBpZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGFuLT5jYXJkOworCXN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCisJLyogSW5pdGlhbGl6ZSBkZXZpY2UgZHJpdmVyIGVudHJ5IHBvaW50cyAqLworCWRldi0+b3BlbgkJPSAmaWZfb3BlbjsKKwlkZXYtPnN0b3AJCT0gJmlmX2Nsb3NlOworCWRldi0+aGFyZF9oZWFkZXIJPSAmaWZfaGVhZGVyOworCWRldi0+cmVidWlsZF9oZWFkZXIJPSAmaWZfcmVidWlsZF9oZHI7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSAmaWZfc2VuZDsKKwlkZXYtPmdldF9zdGF0cwkJPSAmaWZfc3RhdHM7CisJZGV2LT50eF90aW1lb3V0CQk9ICZpZl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOworCisJLyogSW5pdGlhbGl6ZSBtZWRpYS1zcGVjaWZpYyBwYXJhbWV0ZXJzICovCisJZGV2LT50eXBlCQk9IEFSUEhSRF9QUFA7CQkvKiBBUlAgaC93IHR5cGUgKi8KKwlkZXYtPmZsYWdzCQl8PSBJRkZfUE9JTlRPUE9JTlQ7CisJZGV2LT5mbGFncwkJfD0gSUZGX05PQVJQOworCisJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKwkJZGV2LT5tdHUJPSBYMjVfQ0hBTl9NVFUrc2l6ZW9mKHgyNWFwaV9oZHJfdCk7CisJfWVsc2V7CisJCWRldi0+bXR1CT0gY2FyZC0+d2FuZGV2Lm10dTsgCQorCX0KKwkKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IFgyNV9IUkRIRFJfU1o7IC8qIG1lZGlhIGhlYWRlciBsZW5ndGggKi8KKwlkZXYtPmFkZHJfbGVuCQk9IDI7CQkvKiBoYXJkd2FyZSBhZGRyZXNzIGxlbmd0aCAqLworCQorCWlmICghY2hhbi0+Y29tbW9uLnN2Yyl7CisJCSoodW5zaWduZWQgc2hvcnQqKWRldi0+ZGV2X2FkZHIgPSBodG9ucyhjaGFuLT5jb21tb24ubGNuKTsKKwl9CisJCisJLyogSW5pdGlhbGl6ZSBoYXJkd2FyZSBwYXJhbWV0ZXJzIChqdXN0IGZvciByZWZlcmVuY2UpICovCisJZGV2LT5pcnEJPSB3YW5kZXYtPmlycTsKKwlkZXYtPmRtYQk9IHdhbmRldi0+ZG1hOworCWRldi0+YmFzZV9hZGRyCT0gd2FuZGV2LT5pb3BvcnQ7CisJZGV2LT5tZW1fc3RhcnQJPSAodW5zaWduZWQgbG9uZyl3YW5kZXYtPm1hZGRyOworCWRldi0+bWVtX2VuZAk9IHdhbmRldi0+bWFkZHIgKyB3YW5kZXYtPm1zaXplIC0gMTsKKworICAgICAgICAvKiBTZXQgdHJhbnNtaXQgYnVmZmVyIHF1ZXVlIGxlbmd0aCAqLworICAgICAgICBkZXYtPnR4X3F1ZXVlX2xlbiA9IDEwMDsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBGSVhNRSBXaHkgYXJlIHdlIGRvaW5nIHRoaXMgKi8KKwlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTmFtZToJaWZfb3BlbigpLCAgIE9wZW4vQnJpbmcgdXAgdGhlIE5ldG93cmsgSW50ZXJmYWNlIAorICoKKyAqIFB1cnBvc2U6CVRvIGJyaW5nIHVwIGEgbmV0d29yayBpbnRlcmZhY2UuCisgKiAKKyAqIFJhdGlvbmFsZToJCisgKiAgICAgICAgICAgICAgICAKKyAqIERlc2NyaXB0aW9uOglPcGVuIG5ldHdvcmsgaW50ZXJmYWNlLgorICogCQlvIHByZXZlbnQgbW9kdWxlIGZyb20gdW5sb2FkaW5nIGJ5IGluY3JlbWVudGluZyB1c2UgY291bnQKKyAqIAkJbyBpZiBsaW5rIGlzIGRpc2Nvbm5lY3RlZCB0aGVuIGluaXRpYXRlIGNvbm5lY3Rpb24KKyAqCisgKiBDYWxsZWQgYnk6CUtlcm5lbCAoL3Vzci9zcmMvbGludXgvbmV0L2NvcmUvZGV2LmMpCisgKiAJCShkZXYtPm9wZW4oKSkKKyAqCisgKiBBc3N1bXB0aW9uczogTm9uZQorICoJCisgKiBXYXJuaW5nczoJTm9uZQorICoKKyAqIFJldHVybjogCTAgCU9rCisgKiAJCTwwIAlGYWlsdXJlOiBJbnRlcmZhY2Ugd2lsbCBub3QgY29tZSB1cC4KKyAqLworCitzdGF0aWMgaW50IGlmX29wZW4oc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M7CisJCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWNoYW4tPnRxX3dvcmtpbmcgPSAwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgd29ya3F1ZXVlICovCisJSU5JVF9XT1JLKCZjaGFuLT5jb21tb24ud2FucGlwZV93b3JrLCAodm9pZCAqKXgyNWFwaV9iaCwgZGV2KTsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIEJIIGNpcmN1bGFyIGJ1ZmZlciAqLworCS8qIEFkZCAxIHRvIE1BWF9CSF9CVUZGIHNvIHdlIGRvbid0IGhhdmUgdGVzdCB3aXRoIChNQVhfQkhfQlVGRi0xKSAqLworCWNoYW4tPmJoX2hlYWQgPSBrbWFsbG9jKChzaXplb2YoYmhfZGF0YV90KSooTUFYX0JIX0JVRkYrMSkpLEdGUF9BVE9NSUMpOworCisJaWYgKGNoYW4tPmJoX2hlYWQgPT0gTlVMTCl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUiwgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAhIEJIX0JVRkZFUlMgIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCW1lbXNldChjaGFuLT5iaF9oZWFkLDAsKHNpemVvZihiaF9kYXRhX3QpKihNQVhfQkhfQlVGRisxKSkpOworCWF0b21pY19zZXQoJmNoYW4tPmJoX2J1ZmZfdXNlZCwgMCk7CisKKwkvKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBpbnRlcmZhY2VzICovCisJKytjYXJkLT51Lngubm9fZGV2OworCQorCXdhbnBpcGVfb3BlbihjYXJkKTsKKworCS8qIExBUEIgcHJvdG9jb2wgb25seSB1c2VzIG9uZSBpbnRlcmZhY2UsIHRodXMKKwkgKiBzdGFydCB0aGUgcHJvdG9jb2wgYWZ0ZXIgaXQgY29tZXMgdXAuICovCisJaWYgKGNhcmQtPnUueC5MQVBCX2hkbGMpeworCQlpZiAoY2FyZC0+b3Blbl9jbnQgPT0gMSl7CisJCQlUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKwkJCVM1MDhfUzUxNF9sb2NrKGNhcmQsICZzbXBfZmxhZ3MpOworCQkJeDI1X3NldF9pbnRyX21vZGUoY2FyZCwgSU5UUl9PTl9USU1FUik7IAorCQkJc3RhdHVzLT5pbWFzayAmPSB+SU5UUl9PTl9USU1FUjsKKwkJCVM1MDhfUzUxNF91bmxvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJCX0KKwl9ZWxzZXsKKwkJLyogWDI1IGNhbiBoYXZlIG11bHRpcGxlIGludGVyZmFjZXMgdGh1cywgc3RhcnQgdGhlIAorCQkgKiBwcm90b2NvbCBvbmNlIGFsbCBpbnRlcmZhY2VzIGFyZSB1cCAqLworCisJCS8vRklYTUU6IFRoZXJlIGlzIGEgYnVnIGhlcmUuIElmIGludGVyZmFjZSBpcworCQkvL2Jyb3VnaHQgZG93biBhbmQgdXAsIGl0IHdpbGwgdHJ5IHRvIGVuYWJsZSBjb21tLgorCQlpZiAoY2FyZC0+b3Blbl9jbnQgPT0gY2FyZC0+dS54Lm51bV9vZl9jaCl7CisKKwkJCVM1MDhfUzUxNF9sb2NrKGNhcmQsICZzbXBfZmxhZ3MpOworCQkJY29ubmVjdChjYXJkKTsKKwkJCVM1MDhfUzUxNF91bmxvY2soY2FyZCwgJnNtcF9mbGFncyk7CisKKwkJCW1vZF90aW1lcigmY2FyZC0+dS54LngyNV90aW1lciwgamlmZmllcyArIEhaKTsKKwkJfQorCX0KKwkvKiBEZXZpY2UgaXMgbm90IHVwIHVudGlsIHRoZSB3ZSBhcmUgaW4gY29ubmVjdGVkIHN0YXRlICovCisJZG9fZ2V0dGltZW9mZGF5KCAmdHYgKTsKKwljaGFuLT5yb3V0ZXJfc3RhcnRfdGltZSA9IHR2LnR2X3NlYzsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBOYW1lOglpZl9jbG9zZSgpLCAgIENsb3NlL0JyaW5nIGRvd24gdGhlIE5ldG93cmsgSW50ZXJmYWNlIAorICoKKyAqIFB1cnBvc2U6CVRvIGJyaW5nIGRvd24gYSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIAorICogUmF0aW9uYWxlOgkKKyAqICAgICAgICAgICAgICAgIAorICogRGVzY3JpcHRpb246CUNsb3NlIG5ldHdvcmsgaW50ZXJmYWNlLgorICogCQlvIGRlY3JlbWVudCB1c2UgbW9kdWxlIHVzZSBjb3VudAorICoKKyAqIENhbGxlZCBieToJS2VybmVsICgvdXNyL3NyYy9saW51eC9uZXQvY29yZS9kZXYuYykKKyAqIAkJKGRldi0+Y2xvc2UoKSkKKyAqCQlpZmNvbmZpZyA8bmFtZT4gZG93bjogd2lsbCB0cmlnZ2VyIHRoZSBrZXJuZWwKKyAqICAgICAgICAgICAgICB3aGljaCB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBBc3N1bXB0aW9uczogTm9uZQorICoJCisgKiBXYXJuaW5nczoJTm9uZQorICoKKyAqIFJldHVybjogCTAgCU9rCisgKiAJCTwwIAlGYWlsdXJlOiBJbnRlcmZhY2Ugd2lsbCBub3QgZXhpdCBwcm9wZXJseS4KKyAqLworc3RhdGljIGludCBpZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXgyNV9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKwkKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoKGNoYW4tPmNvbW1vbi5zdGF0ZSA9PSBXQU5fQ09OTkVDVEVEKSB8fCAKKwkgICAgKGNoYW4tPmNvbW1vbi5zdGF0ZSA9PSBXQU5fQ09OTkVDVElORykpeworCQlTNTA4X1M1MTRfbG9jayhjYXJkLCAmc21wX2ZsYWdzKTsKKwkJY2hhbl9kaXNjKGRldik7CisJCVM1MDhfUzUxNF91bmxvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJfQorCisJd2FucGlwZV9jbG9zZShjYXJkKTsKKworCVM1MDhfUzUxNF9sb2NrKGNhcmQsICZzbXBfZmxhZ3MpOworCWlmIChjaGFuLT5iaF9oZWFkKXsKKwkJaW50IGk7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCisJCWZvciAoaT0wOyBpPChNQVhfQkhfQlVGRisxKTsgaSsrKXsKKwkJCXNrYiA9ICgoYmhfZGF0YV90ICopJmNoYW4tPmJoX2hlYWRbaV0pLT5za2I7CisJCQlpZiAoc2tiICE9IE5VTEwpeworICAgICAgICAgICAgICAgIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCX0KKwkJfQorCQlrZnJlZShjaGFuLT5iaF9oZWFkKTsKKwkJY2hhbi0+YmhfaGVhZD1OVUxMOworCX0KKwlTNTA4X1M1MTRfdW5sb2NrKGNhcmQsICZzbXBfZmxhZ3MpOworCisJLyogSWYgdGhpcyBpcyB0aGUgbGFzdCBjbG9zZSwgZGlzY29ubmVjdCBwaHlzaWNhbCBsaW5rICovCisJaWYgKCFjYXJkLT5vcGVuX2NudCl7CisJCVM1MDhfUzUxNF9sb2NrKGNhcmQsICZzbXBfZmxhZ3MpOworCQlkaXNjb25uZWN0KGNhcmQpOworCQl4MjVfc2V0X2ludHJfbW9kZShjYXJkLCAwKTsKKwkJUzUwOF9TNTE0X3VubG9jayhjYXJkLCAmc21wX2ZsYWdzKTsKKwl9CisJCisJLyogRGVjcmVtZW50IHRoZSBudW1iZXIgb2YgaW50ZXJmYWNlcyAqLworCS0tY2FyZC0+dS54Lm5vX2RldjsKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJQnVpbGQgbWVkaWEgaGVhZGVyLgorICogCW8gZW5jYXBzdWxhdGUgcGFja2V0IGFjY29yZGluZyB0byBlbmNhcHN1bGF0aW9uIHR5cGUuCisgKgorICogCVRoZSB0cmljayBoZXJlIGlzIHRvIHB1dCBwYWNrZXQgdHlwZSAoRXRoZXJ0eXBlKSBpbnRvICdwcm90b2NvbCcgCisgKiAgICAgIGZpZWxkIG9mIHRoZSBzb2NrZXQgYnVmZmVyLCBzbyB0aGF0IHdlIGRvbid0IGZvcmdldCBpdC4gIAorICogICAgICBJZiBlbmNhcHN1bGF0aW9uIGZhaWxzLCBzZXQgc2tiLT5wcm90b2NvbCB0byAwIGFuZCBkaXNjYXJkIAorICogICAgICBwYWNrZXQgbGF0ZXIuCisgKgorICogCVJldHVybjoJCW1lZGlhIGhlYWRlciBsZW5ndGguCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGlmX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQqIGRhZGRyLCB2b2lkKiBzYWRkciwKKwkJICAgICB1bnNpZ25lZCBsZW4pCit7CisJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlpbnQgaGRyX2xlbiA9IGRldi0+aGFyZF9oZWFkZXJfbGVuOworCQorCXNrYi0+cHJvdG9jb2wgPSBodG9ucyh0eXBlKTsKKwlpZiAoIWNoYW4tPnByb3RvY29sKXsKKwkJaGRyX2xlbiA9IHdhbnJvdXRlcl9lbmNhcHN1bGF0ZShza2IsIGRldiwgdHlwZSk7CisJCWlmIChoZHJfbGVuIDwgMCl7CisJCQloZHJfbGVuID0gMDsKKwkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucygwKTsKKwkJfQorCX0KKwlyZXR1cm4gaGRyX2xlbjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlSZS1idWlsZCBtZWRpYSBoZWFkZXIuCisgKgorICogCVJldHVybjoJCTEJcGh5c2ljYWwgYWRkcmVzcyByZXNvbHZlZC4KKyAqCQkJMAlwaHlzaWNhbCBhZGRyZXNzIG5vdCByZXNvbHZlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgaWZfcmVidWlsZF9oZHIgKHN0cnVjdCBza19idWZmKiBza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OyAKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogcmVidWlsZF9oZWFkZXIoKSBjYWxsZWQgZm9yIGludGVyZmFjZSAlcyFcbiIsCisJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSk7CisJcmV0dXJuIDE7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBIYW5kbGUgdHJhbnNtaXQgdGltZW91dCBldmVudCBmcm9tIG5ldGlmIHdhdGNoZG9nCisgKi8KK3N0YXRpYyB2b2lkIGlmX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBjaGFuLT5jYXJkOworCisJLyogSWYgb3VyIGRldmljZSBzdGF5cyBidXN5IGZvciBhdCBsZWFzdCA1IHNlY29uZHMgdGhlbiB3ZSB3aWxsCisJICoga2ljayBzdGFydCB0aGUgZGV2aWNlIGJ5IG1ha2luZyBkZXYtPnRidXN5ID0gMC4gIFdlIGV4cGVjdAorCSAqIHRoYXQgb3VyIGRldmljZSBuZXZlciBzdGF5cyBidXN5IG1vcmUgdGhhbiA1IHNlY29uZHMuIFNvIHRoaXMgICAgICAgICAgICAgICAgIAorCSAqIGlzIG9ubHkgdXNlZCBhcyBhIGxhc3QgcmVzb3J0LgorCSAqLworCisJKytjaGFuLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF90YnVzeV90aW1lb3V0OworCXByaW50ayAoS0VSTl9JTkZPICIlczogVHJhbnNtaXQgdGltZWQgb3V0IG9uICVzXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSk7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlTZW5kIGEgcGFja2V0IG9uIGEgbmV0d29yayBpbnRlcmZhY2UuCisgKiAJbyBzZXQgdGJ1c3kgZmxhZyAobWFya3Mgc3RhcnQgb2YgdGhlIHRyYW5zbWlzc2lvbikuCisgKiAJbyBjaGVjayBsaW5rIHN0YXRlLiBJZiBsaW5rIGlzIG5vdCB1cCwgdGhlbiBkcm9wIHRoZSBwYWNrZXQuCisgKiAJbyBjaGVjayBjaGFubmVsIHN0YXR1cy4gSWYgaXQncyBkb3duIHRoZW4gaW5pdGlhdGUgYSBjYWxsLgorICogCW8gcGFzcyBhIHBhY2tldCB0byBjb3JyZXNwb25kaW5nIFdBTiBkZXZpY2UuCisgKiAJbyBmcmVlIHNvY2tldCBidWZmZXIKKyAqCisgKiAJUmV0dXJuOgkwCWNvbXBsZXRlIChzb2NrZXQgYnVmZmVyIG11c3QgYmUgZnJlZWQpCisgKgkJbm9uLTAJcGFja2V0IG1heSBiZSByZS10cmFuc21pdHRlZCAodGJ1c3kgbXVzdCBiZSBzZXQpCisgKgorICogCU5vdGVzOgorICogCTEuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZWl0aGVyIGJ5IHRoZSBwcm90b2NvbCBzdGFjayBvciBieSB0aGUgIm5ldAorICogICAgCWJvdHRvbSBoYWxmIiAod2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQpLgorICogCTIuIFNldHRpbmcgdGJ1c3kgZmxhZyB3aWxsIGluaGliaXQgZnVydGhlciB0cmFuc21pdCByZXF1ZXN0cyBmcm9tIHRoZQorICogICAgCXByb3RvY29sIHN0YWNrIGFuZCBjYW4gYmUgdXNlZCBmb3IgZmxvdyBjb250cm9sIHdpdGggcHJvdG9jb2wgbGF5ZXIuCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGlmX3NlbmQoc3RydWN0IHNrX2J1ZmYqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisJaW50IHVkcF90eXBlOworCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzPTA7CisKKwkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2VudHJ5OworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogTm8gbmVlZCB0byBjaGVjayBmcmFtZSBsZW5ndGgsIHNpbmNlIHNvY2tldCBjb2RlCisgICAgICAgICAqIHdpbGwgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIHVzICovCisKKwljaGFuLT50aWNrX2NvdW50ZXIgPSBqaWZmaWVzOworCQorCS8qIENyaXRpY2FsIHJlZ2lvbiBzdGFydHMgaGVyZSAqLworCVM1MDhfUzUxNF9sb2NrKGNhcmQsICZzbXBfZmxhZ3MpOworCQorCWlmICh0ZXN0X2FuZF9zZXRfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSGl0IGNyaXRpY2FsIGluIGlmX3NlbmQoKSEgJWx4XG4iLGNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCWdvdG8gaWZfc2VuZF9jcml0X2V4aXQ7CisJfQorCQorCXVkcF90eXBlID0gdWRwX3BrdF90eXBlKHNrYiwgY2FyZCk7CisKKyAgICAgICAgaWYodWRwX3R5cGUgIT0gVURQX0lOVkFMSURfVFlQRSkgeworCisgICAgICAgICAgICAgICAgaWYoc3RvcmVfdWRwX21nbXRfcGt0KHVkcF90eXBlLCBVRFBfUEtUX0ZSTV9TVEFDSywgY2FyZCwgZGV2LCBza2IsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLT5jb21tb24ubGNuKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMtPmltYXNrIHw9IElOVFJfT05fVElNRVI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodWRwX3R5cGUgPT0gVURQX1hQSVBFX1RZUEUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF9QSVBFX3JlcXVlc3QrKzsKKwkJCX0KKyAgICAgICAgICAgICAgIAl9CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCWNsZWFyX2JpdChTRU5EX0NSSVQsKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQlTNTA4X1M1MTRfdW5sb2NrKGNhcmQsICZzbXBfZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY2hhbi0+dHJhbnNtaXRfbGVuZ3RoKXsKKwkJLy9GSVhNRTogVGhpcyBjaGVjayBkb2Vzbid0IG1ha2Ugc2Vuc2UgYW55IG1vcmUKKwkJaWYgKGNoYW4tPmNvbW1vbi5zdGF0ZSAhPSBXQU5fQ09OTkVDVEVEKXsKKwkJCWNoYW4tPnRyYW5zbWl0X2xlbmd0aD0wOworCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmRyaXZlcl9idXN5LDApOworCQl9ZWxzZXsKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCSsrY2FyZC0+dS54LnR4X2ludGVycnVwdHNfcGVuZGluZzsKKwkJICAgICAgICBzdGF0dXMtPmltYXNrIHw9IElOVFJfT05fVFhfRlJBTUU7CisJCQljbGVhcl9iaXQoU0VORF9DUklULCh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJCVM1MDhfUzUxNF91bmxvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmIChjYXJkLT53YW5kZXYuc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCl7CisJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX3dhbl9kaXNjb25uZWN0ZWQ7CQorCQkKKwl9ZWxzZSBpZiAoIGNoYW4tPnByb3RvY29sICYmIChjaGFuLT5wcm90b2NvbCAhPSBza2ItPnByb3RvY29sKSl7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSIlczogdW5zdXBwb3J0ZWQgRXRoZXJ0eXBlIDB4JTA0WCBvbiBpbnRlcmZhY2UgJXMhXG4iLAorCQkJY2hhbi0+bmFtZSwgaHRvbnMoc2tiLT5wcm90b2NvbCksIGRldi0+bmFtZSk7CisJCQorCQlwcmludGsoS0VSTl9JTkZPICJQUk9UTyAlWG4iLCBodG9ucyhjaGFuLT5wcm90b2NvbCkpOworCQkrK2NoYW4tPmlmc3RhdHMudHhfZXJyb3JzOworCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJKytjaGFuLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF9wcm90b2NvbF9lcnJvcjsKKwkJCisJfWVsc2Ugc3dpdGNoIChjaGFuLT5jb21tb24uc3RhdGUpeworCisJCWNhc2UgV0FOX0RJU0NPTk5FQ1RFRDoKKwkJCS8qIFRyeSB0byBlc3RhYmxpc2ggY29ubmVjdGlvbi4gSWYgc3VjY2VkZWQsIHRoZW4gc3RhcnQKKwkJCSAqIHRyYW5zbWlzc2lvbiwgZWxzZSBkcm9wIGEgcGFja2V0LgorCQkJICovCisJCQlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCQkJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJYnJlYWs7CisJCQl9ZWxzZXsKKwkJCQlpZiAoY2hhbl9jb25uZWN0KGRldikgIT0gMCl7CisJCQkJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworCQkJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCQljYXNlIFdBTl9DT05ORUNURUQ6CisJCQlpZiggc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFgpKSB7CisJCQkJaWYoY2hhbi0+ZW5hYmxlX0lQWCkgeworCQkJCQlzd2l0Y2hfbmV0X251bWJlcnMoIHNrYi0+ZGF0YSwgCisJCQkJCQljaGFuLT5uZXR3b3JrX251bWJlciwgMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJCSsrY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfcHJvdG9jb2xfZXJyb3I7CisJCQkJCWdvdG8gaWZfc2VuZF9jcml0X2V4aXQ7CisJCQkJfQorCQkJfQorCQkJLyogV2UgbmV2ZXIgZHJvcCBoZXJlLCBpZiBjYW5ub3Qgc2VuZCB0aGFuLCBjb3B5CisJICAgICAgICAgICAgICAgICAqIGEgcGFja2V0IGludG8gYSB0cmFuc21pdCBidWZmZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCWNoYW5fc2VuZChkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIDApOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOwkKKwkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQlicmVhazsKKwl9CisKKworaWZfc2VuZF9jcml0X2V4aXQ6CisJCisgICAgICAgCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCWNsZWFyX2JpdChTRU5EX0NSSVQsKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCVM1MDhfUzUxNF91bmxvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0dXAgc28gdGhhdCBhIGZyYW1lIGNhbiBiZSB0cmFuc21pdHRlZCBvbiB0aGUgb2NjdXJyZW5jZSBvZiBhIHRyYW5zbWl0CisgKiBpbnRlcnJ1cHQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNldHVwX2Zvcl9kZWxheWVkX3RyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHZvaWQqIGJ1ZiwKKwkJCQkgICAgICAgdW5zaWduZWQgbGVuKQoreworICAgICAgICB4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworICAgICAgICBzZGxhX3QqIGNhcmQgPSBjaGFuLT5jYXJkOworCVRYMjVTdGF0dXMqIHN0YXR1cyA9IGNhcmQtPmZsYWdzOworCisJKytjaGFuLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF9hZHB0cl9iZnJzX2Z1bGw7CisKKyAgICAgICAgaWYoY2hhbi0+dHJhbnNtaXRfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVycm9yLCB0cmFuc21pdCBsZW5ndGggc2V0IGluIGRlbGF5ZWQgdHJhbnNtaXQhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKwkJaWYgKGxlbiA+IFgyNV9DSEFOX01UVStzaXplb2YoeDI1YXBpX2hkcl90KSkgeworCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CQorCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMZW5ndGggaXMgdG9vIGJpZyBmb3IgZGVsYXllZCB0cmFuc21pdFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCX1lbHNleworCQlpZiAobGVuID4gWDI1X01BWF9EQVRBKSB7CisJCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsJCisJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExlbmd0aCBpcyB0b28gYmlnIGZvciBkZWxheWVkIHRyYW5zbWl0XG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJfQorCisgICAgICAgIGNoYW4tPnRyYW5zbWl0X2xlbmd0aCA9IGxlbjsKKwlhdG9taWNfc2V0KCZjaGFuLT5jb21tb24uZHJpdmVyX2J1c3ksMSk7CisgICAgICAgIG1lbWNweShjaGFuLT50cmFuc21pdF9idWZmZXIsIGJ1ZiwgbGVuKTsKKworCSsrY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfdHhfaW50X2VuYWJsZWQ7CisKKwkvKiBFbmFibGUgVHJhbnNtaXQgSW50ZXJydXB0ICovCisJKytjYXJkLT51LngudHhfaW50ZXJydXB0c19wZW5kaW5nOworICAgICAgICBzdGF0dXMtPmltYXNrIHw9IElOVFJfT05fVFhfRlJBTUU7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIG5ldF9kZXZpY2Vfc3RhdHMKKyAqCisgKiAJR2V0IGV0aGVybmV0LXN0eWxlIGludGVyZmFjZSBzdGF0aXN0aWNzLgorICogCVJldHVybiBhIHBvaW50ZXIgdG8gc3RydWN0IGVuZXRfc3RhdGlzdGljcy4KKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaWZfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl4MjVfY2hhbm5lbF90ICpjaGFuID0gZGV2LT5wcml2OworCisJaWYoY2hhbiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmY2hhbi0+aWZzdGF0czsKK30KKworCisvKgorICoJSW50ZXJydXB0IEhhbmRsZXJzIAorICovCisKKy8qCisgKiBYLjI1IEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUuCisgKi8KKworc3RhdGljIHZvaWQgd3B4X2lzciAoc2RsYV90KiBjYXJkKQoreworCVRYMjVTdGF0dXMqIHN0YXR1cyA9IGNhcmQtPmZsYWdzOworCisJY2FyZC0+aW5faXNyID0gMTsKKwkrK2NhcmQtPnN0YXRpc3RpY3MuaXNyX2VudHJ5OworCisJaWYgKHRlc3RfYml0KFBFUklfQ1JJVCwodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQljYXJkLT5pbl9pc3I9MDsKKwkJc3RhdHVzLT5pZmxhZ3MgPSAwOworCQlyZXR1cm47CisJfQorCQorCWlmICh0ZXN0X2JpdChTRU5EX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisKKyAJCXByaW50ayhLRVJOX0lORk8gIiVzOiB3cHhfaXNyOiB3YW5kZXYuY3JpdGljYWwgc2V0IHRvIDB4JTAybHgsIGludCB0eXBlID0gMHglMDJ4XG4iLCAKKwkJCWNhcmQtPmRldm5hbWUsIGNhcmQtPndhbmRldi5jcml0aWNhbCwgc3RhdHVzLT5pZmxhZ3MpOworCQljYXJkLT5pbl9pc3IgPSAwOworCQlzdGF0dXMtPmlmbGFncyA9IDA7CisJCXJldHVybjsKKwl9CisKKwkvKiBGb3IgYWxsIGludGVycnVwdHMgc2V0IHRoZSBjcml0aWNhbCBmbGFnIHRvIENSSVRJQ0FMX1JYX0lOVFIuCisgICAgICAgICAqIElmIHRoZSBpZl9zZW5kIHJvdXRpbmUgaXMgY2FsbGVkIHdpdGggdGhpcyBmbGFnIHNldCBpdCB3aWxsIHNldAorICAgICAgICAgKiB0aGUgZW5hYmxlIHRyYW5zbWl0IGZsYWcgdG8gMS4gKGZvciBhIGRlbGF5ZWQgaW50ZXJydXB0KQorICAgICAgICAgKi8KKwlzd2l0Y2ggKHN0YXR1cy0+aWZsYWdzKXsKKworCQljYXNlIFJYX0lOVFJfUEVORElORzoJCS8qIHJlY2VpdmUgaW50ZXJydXB0ICovCisJCQlyeF9pbnRyKGNhcmQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUWF9JTlRSX1BFTkRJTkc6CQkvKiB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKwkJCXR4X2ludHIoY2FyZCk7CisJCQlicmVhazsKKworCQljYXNlIE1PREVNX0lOVFJfUEVORElORzoJLyogbW9kZW0gc3RhdHVzIGludGVycnVwdCAqLworCQkJc3RhdHVzX2ludHIoY2FyZCk7CisJCQlicmVhazsKKworCQljYXNlIFgyNV9BU1lfVFJBTlNfSU5UUl9QRU5ESU5HOgkvKiBuZXR3b3JrIGV2ZW50IGludGVycnVwdCAqLworCQkJZXZlbnRfaW50cihjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVElNRVJfSU5UUl9QRU5ESU5HOgorCQkJdGltZXJfaW50cihjYXJkKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CQkvKiB1bndhbnRlZCBpbnRlcnJ1cHQgKi8KKwkJCXNwdXJfaW50cihjYXJkKTsKKwl9CisKKwljYXJkLT5pbl9pc3IgPSAwOworCXN0YXR1cy0+aWZsYWdzID0gMDsJLyogY2xlYXIgaW50ZXJydXB0IGNvbmRpdGlvbiAqLworfQorCisvKgorICogCVJlY2VpdmUgaW50ZXJydXB0IGhhbmRsZXIuCisgKiAJVGhpcyByb3V0aW5lIGhhbmRsZXMgZnJhZ21lbnRlZCBJUCBwYWNrZXRzIHVzaW5nIE0tYml0IGFjY29yZGluZyB0byB0aGUKKyAqIAlSRkMxMzU2LgorICogCW8gbWFwIGxpZ2ljYWwgY2hhbm5lbCBudW1iZXIgdG8gbmV0d29yayBpbnRlcmZhY2UuCisgKiAJbyBhbGxvY2F0ZSBzb2NrZXQgYnVmZmVyIG9yIGFwcGVuZCByZWNlaXZlZCBwYWNrZXQgdG8gdGhlIGV4aXN0aW5nIG9uZS4KKyAqIAlvIGlmIE0tYml0IGlzIHJlc2V0IChpLmUuIGl0J3MgdGhlIGxhc3QgcGFja2V0IGluIGEgc2VxdWVuY2UpIHRoZW4gCisgKiAgIAlkZWNhcHN1bGF0ZSBwYWNrZXQgYW5kIHBhc3Mgc29ja2V0IGJ1ZmZlciB0byB0aGUgcHJvdG9jb2wgc3RhY2suCisgKgorICogCU5vdGVzOgorICogCTEuIFdoZW4gYWxsb2NhdGluZyBhIHNvY2tldCBidWZmZXIsIGlmIE0tYml0IGlzIHNldCB0aGVuIG1vcmUgZGF0YSBpcworICogICAgCWNvbWluZyBhbmQgd2UgaGF2ZSB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBtYXhpbXVtIElQIHBhY2tldCBzaXplCisgKiAgICAJZXhwZWN0ZWQgb24gdGhpcyBjaGFubmVsLgorICogCTIuIElmIHNvbWV0aGluZyBnb2VzIHdyb25nIGFuZCBYLjI1IHBhY2tldCBoYXMgdG8gYmUgZHJvcHBlZCAoZS5nLiBubworICogICAgCXNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSkgdGhlIHdob2xlIHBhY2tldCBzZXF1ZW5jZSBtdXN0IGJlIGRpc2NhcmRlZC4KKyAqLworCitzdGF0aWMgdm9pZCByeF9pbnRyIChzZGxhX3QqIGNhcmQpCit7CisJVFgyNU1ib3gqIHJ4bWIgPSBjYXJkLT5yeG1iOworCXVuc2lnbmVkIGxjbiA9IHJ4bWItPmNtZC5sY247CisJc3RydWN0IG5ldF9kZXZpY2UqIGRldiA9IGZpbmRfY2hhbm5lbChjYXJkLGxjbik7CisJeDI1X2NoYW5uZWxfdCogY2hhbjsKKwlzdHJ1Y3Qgc2tfYnVmZiogc2tiPU5VTEw7CisKKwlpZiAoZGV2ID09IE5VTEwpeworCQkvKiBJbnZhbGlkIGNoYW5uZWwsIGRpc2NhcmQgcGFja2V0ICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWNlaXZpbmcgb24gb3JwaGFuZWQgTENOICVkIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGxjbik7CisJCXJldHVybjsKKwl9CisKKwljaGFuID0gZGV2LT5wcml2OworCWNoYW4tPmlfdGltZW91dF9zb2ZhciA9IGppZmZpZXM7CisKKworCS8qIENvcHkgdGhlIGRhdGEgZnJvbSB0aGUgYm9hcmQsIGludG8gYW4KKyAgICAgICAgICogc2tiIGJ1ZmZlciAKKwkgKi8KKwlpZiAod2FucGlwZV9wdWxsX2RhdGFfaW5fc2tiKGNhcmQsZGV2LCZza2IpKXsKKwkJKytjaGFuLT5pZnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCSsrY2hhbi0+cnhfaW50cl9zdGF0LnJ4X2ludHJfbm9fc29ja2V0OworCQkrK2NoYW4tPnJ4X2ludHJfc3RhdC5yeF9pbnRyX2Jmcl9ub3RfcGFzc2VkX3RvX3N0YWNrOworCQlyZXR1cm47CisJfQorCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsJCS8qIHRpbWVzdGFtcCAqLworCisKKwkvKiAtLS0tLS0tLS0tLS0gQVBJIC0tLS0tLS0tLS0tLS0tLS0qLworCisJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKworCQlpZiAoYmhfZW5xdWV1ZShkZXYsIHNrYikpeworCQkJKytjaGFuLT5pZnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQkrK2NhcmQtPndhbmRldi5zdGF0cy5yeF9kcm9wcGVkOworCQkJKytjaGFuLT5yeF9pbnRyX3N0YXQucnhfaW50cl9iZnJfbm90X3Bhc3NlZF90b19zdGFjazsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlyZXR1cm47CisJCX0JCQorCisJCSsrY2hhbi0+aWZzdGF0cy5yeF9wYWNrZXRzOworCQljaGFuLT5pZnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQkKKworCQljaGFuLT5yeF9za2IgPSBOVUxMOworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJmNoYW4tPnRxX3dvcmtpbmcpKXsKKwkJCXdhbnBpcGVfcXVldWVfd29yaygmY2hhbi0+Y29tbW9uLndhbnBpcGVfd29yayk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCisJLyogLS0tLS0tLS0tLS0tLSBXQU5QSVBFIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQorCS8qIHNldCByeF9za2IgdG8gTlVMTCBzbyB3ZSB3b24ndCBhY2Nlc3MgaXQgbGF0ZXIgd2hlbiBrZXJuZWwgYWxyZWFkeSBvd25zIGl0ICovCisJY2hhbi0+cnhfc2tiPU5VTEw7CisJCisJLyogRGVjYXBzdWxhdGUgcGFja2V0LCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoIXNrYi0+cHJvdG9jb2wgJiYgIXdhbnJvdXRlcl90eXBlX3RyYW5zKHNrYiwgZGV2KSl7CisJCS8qIGNhbid0IGRlY2Fwc3VsYXRlIHBhY2tldCAqLworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCSsrY2hhbi0+aWZzdGF0cy5yeF9lcnJvcnM7CisJCSsrY2hhbi0+aWZzdGF0cy5yeF9kcm9wcGVkOworCQkrK2NhcmQtPndhbmRldi5zdGF0cy5yeF9kcm9wcGVkOworCQkrK2NoYW4tPnJ4X2ludHJfc3RhdC5yeF9pbnRyX2Jmcl9ub3RfcGFzc2VkX3RvX3N0YWNrOworCisJfWVsc2V7CisJCWlmKCBoYW5kbGVfSVBYV0FOKHNrYi0+ZGF0YSwgY2hhbi0+bmFtZSwgCisJCQkJICBjaGFuLT5lbmFibGVfSVBYLCBjaGFuLT5uZXR3b3JrX251bWJlciwgCisJCQkJICBza2ItPnByb3RvY29sKSl7CisKKwkJCWlmKCBjaGFuLT5lbmFibGVfSVBYICl7CisJCQkJaWYoY2hhbl9zZW5kKGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwwKSl7CisJCQkJCWNoYW4tPnR4X3NrYiA9IHNrYjsKKwkJCQl9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJCQkrK2NoYW4tPnJ4X2ludHJfc3RhdC5yeF9pbnRyX2Jmcl9ub3RfcGFzc2VkX3RvX3N0YWNrOworCQkJCX0KKwkJCX1lbHNleworCQkJCS8qIGluY3JlbWVudCBJUFggcGFja2V0IGRyb3BwZWQgc3RhdGlzdGljICovCisJCQkJKytjaGFuLT5pZnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQkJKytjaGFuLT5yeF9pbnRyX3N0YXQucnhfaW50cl9iZnJfbm90X3Bhc3NlZF90b19zdGFjazsKKwkJCX0KKwkJfWVsc2V7CisJCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCQljaGFuLT5pZnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQkJKytjaGFuLT5pZnN0YXRzLnJ4X3BhY2tldHM7CisJCQkrK2NoYW4tPnJ4X2ludHJfc3RhdC5yeF9pbnRyX2Jmcl9wYXNzZWRfdG9fc3RhY2s7CisJCQluZXRpZl9yeChza2IpOworCQl9CisJfQorCQorCXJldHVybjsKK30KKworCitzdGF0aWMgaW50IHdhbnBpcGVfcHVsbF9kYXRhX2luX3NrYihzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBza19idWZmICoqc2tiKQoreworCXZvaWQgKmJ1ZnB0cjsKKwlUWDI1TWJveCogcnhtYiA9IGNhcmQtPnJ4bWI7CisJdW5zaWduZWQgbGVuID0gcnhtYi0+Y21kLmxlbmd0aDsJLyogcGFja2V0IGxlbmd0aCAqLworCXVuc2lnbmVkIHFkbSA9IHJ4bWItPmNtZC5xZG07CQkvKiBRLEQgYW5kIE0gYml0cyAqLworCXgyNV9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPSAqc2tiOworCisJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gV0FOUElQRSl7CisJCWlmIChjaGFuLT5kcm9wX3NlcXVlbmNlKXsKKwkJCWlmICghKHFkbSAmIDB4MDEpKXsgCisJCQkJY2hhbi0+ZHJvcF9zZXF1ZW5jZSA9IDA7CisJCQl9CisJCQlyZXR1cm4gMTsKKwkJfQorCQluZXdfc2tiID0gY2hhbi0+cnhfc2tiOworCX1lbHNleworCQkvKiBBZGQgb24gdGhlIEFQSSBoZWFkZXIgdG8gdGhlIHJlY2VpdmVkCisgICAgICAgICAgICAgICAgICogZGF0YSAKKwkJICovCisJCWxlbiArPSBzaXplb2YoeDI1YXBpX2hkcl90KTsKKwl9CisKKwlpZiAobmV3X3NrYiA9PSBOVUxMKXsKKwkJaW50IGJ1ZnNpemU7CisKKwkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gV0FOUElQRSl7CisJCQlidWZzaXplID0gKHFkbSAmIDB4MDEpID8gZGV2LT5tdHUgOiBsZW47CisJCX1lbHNleworCQkJYnVmc2l6ZSA9IGxlbjsKKwkJfQorCisJCS8qIEFsbG9jYXRlIG5ldyBzb2NrZXQgYnVmZmVyICovCisJCW5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKGJ1ZnNpemUgKyBkZXYtPmhhcmRfaGVhZGVyX2xlbik7CisJCWlmIChuZXdfc2tiID09IE5VTEwpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQljaGFuLT5kcm9wX3NlcXVlbmNlID0gMTsJLyogc2V0IGZsYWcgKi8KKwkJCSsrY2hhbi0+aWZzdGF0cy5yeF9kcm9wcGVkOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlpZiAoc2tiX3RhaWxyb29tKG5ld19za2IpIDwgbGVuKXsKKwkJLyogTm8gcm9vbSBmb3IgdGhlIHBhY2tldC4gQ2FsbCBvZmYgdGhlIHdob2xlIHRoaW5nISAqLworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KG5ld19za2IpOworCQlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBXQU5QSVBFKXsKKwkJCWNoYW4tPnJ4X3NrYiA9IE5VTEw7CisJCQlpZiAocWRtICYgMHgwMSl7IAorCQkJCWNoYW4tPmRyb3Bfc2VxdWVuY2UgPSAxOworCQkJfQorCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVuZXhwZWN0ZWRseSBsb25nIHBhY2tldCBzZXF1ZW5jZSAiCisJCQkib24gaW50ZXJmYWNlICVzIVxuIiwgY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKwkJKytjaGFuLT5pZnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnM7CisJCXJldHVybiAxOworCX0KKworCWJ1ZnB0ciA9IHNrYl9wdXQobmV3X3NrYixsZW4pOworCisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCQkvKiBGaWxsIGluIHRoZSB4MjVhcGkgaGVhZGVyIAorCQkgKi8KKwkJeDI1YXBpX3QgKiBhcGlfZGF0YSA9ICh4MjVhcGlfdCopYnVmcHRyOworCQlhcGlfZGF0YS0+aGRyLnFkbSA9IHJ4bWItPmNtZC5xZG07CisJCWFwaV9kYXRhLT5oZHIuY2F1c2UgPSByeG1iLT5jbWQuY2F1c2U7CisJCWFwaV9kYXRhLT5oZHIuZGlhZ24gPSByeG1iLT5jbWQuZGlhZ247CisJCWFwaV9kYXRhLT5oZHIubGVuZ3RoID0gcnhtYi0+Y21kLmxlbmd0aDsKKwkJbWVtY3B5KGFwaV9kYXRhLT5kYXRhLCByeG1iLT5kYXRhLCByeG1iLT5jbWQubGVuZ3RoKTsKKwl9ZWxzZXsKKwkJbWVtY3B5KGJ1ZnB0ciwgcnhtYi0+ZGF0YSwgbGVuKTsKKwl9CisKKwluZXdfc2tiLT5kZXYgPSBkZXY7CisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCQluZXdfc2tiLT5tYWMucmF3ID0gbmV3X3NrYi0+ZGF0YTsKKwkJbmV3X3NrYi0+cHJvdG9jb2wgPSBodG9ucyhYMjVfUFJPVCk7CisJCW5ld19za2ItPnBrdF90eXBlID0gV0FOX1BBQ0tFVF9EQVRBOworCX1lbHNleworCQluZXdfc2tiLT5wcm90b2NvbCA9IGNoYW4tPnByb3RvY29sOworCQljaGFuLT5yeF9za2IgPSBuZXdfc2tiOworCX0KKworCS8qIElmIHFkbSBiaXQgaXMgc2V0LCBtb3JlIGRhdGEgaXMgY29taW5nIAorICAgICAgICAgKiB0aHVzLCBleGl0IGFuZCB3YWl0IGZvciBtb3JlIGRhdGEgYmVmb3JlCisgICAgICAgICAqIHNlbmRpbmcgdGhlIHBhY2tldCB1cC4gKFVzZWQgYnkgcm91dGVyIG9ubHkpIAorCSAqLworCWlmICgocWRtICYgMHgwMSkgJiYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gV0FOUElQRSkpIAorCQlyZXR1cm4gMTsJCisKKwkqc2tiID0gbmV3X3NrYjsgCisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHR4X2ludHIKKyAqICAKKyAqIAlUcmFuc21pdCBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqCUZvciBlYWNoIGRldiwgY2hlY2sgdGhhdCB0aGVyZSBpcyBzb21ldGhpbmcgdG8gc2VuZC4KKyAqCUlmIGRhdGEgYXZhaWxhYmxlLCB0cmFuc21pdC4gCQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgdHhfaW50ciAoc2RsYV90KiBjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisJdW5zaWduZWQgY2hhciBtb3JlX3RvX3R4PTA7CisJeDI1X2NoYW5uZWxfdCAqY2hhbj1OVUxMOworCWludCBpPTA7CQorCisJaWYgKGNhcmQtPnUueC50eF9kZXYgPT0gTlVMTCl7CisJCWNhcmQtPnUueC50eF9kZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCX0KKworCWRldiA9IGNhcmQtPnUueC50eF9kZXY7CisKKwlmb3IgKDs7KXsKKworCQljaGFuID0gZGV2LT5wcml2OworCQlpZiAoY2hhbi0+dHJhbnNtaXRfbGVuZ3RoKXsKKwkJCS8qIERldmljZSB3YXMgc2V0IHRvIHRyYW5zbWl0LCBjaGVjayBpZiB0aGUgVFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZSAKKwkJCSAqLwkJCisJCQlpZiAoY2hhbi0+Y29tbW9uLnN0YXRlICE9IFdBTl9DT05ORUNURUQpeworCQkJCWNoYW4tPnRyYW5zbWl0X2xlbmd0aCA9IDA7CisJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmRyaXZlcl9idXN5LDApOworCQkJCWNoYW4tPnR4X29mZnNldD0wOworCQkJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpeworCQkJCQlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCQkJCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCQkJCXdha2V1cF9za19iaChkZXYpOworCQkJCQl9ZWxzZXsKKwkJCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCQkJfQorCQkJCX0KKwkJCQlkZXYgPSBtb3ZlX2Rldl90b19uZXh0KGNhcmQsZGV2KTsKKwkJCQlicmVhazsKKwkJCX0JCQkJCisKKwkJCWlmICgoc3RhdHVzLT5jZmxhZ3NbY2hhbi0+Y2hfaWR4XSAmIDB4NDAgfHwgY2FyZC0+dS54LkxBUEJfaGRsYykgJiYgCisJCQkgICAgICgqY2FyZC0+dS54LmhkbGNfYnVmX3N0YXR1cyAmIDB4NDApICl7CisJCQkJLyogVHggYnVmZmVyIGF2YWlsYWJsZSwgd2UgY2FuIHNlbmQgKi8KKwkJCQkKKwkJCQlpZiAodHhfaW50cl9zZW5kKGNhcmQsIGRldikpeworCQkJCQltb3JlX3RvX3R4PTE7CisJCQkJfQorCisJCQkJLyogSWYgbW9yZSB0aGFuIG9uZSBpbnRlcmZhY2UgcHJlc2VudCwgbW92ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGV2aWNlIHBvaW50ZXIgdG8gdGhlIG5leHQgaW50ZXJmYWNlLCBzbyBvbiB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG5leHQgVFggaW50ZXJydXB0IHdlIHdpbGwgdHJ5IHNlbmRpbmcgZnJvbSBpdC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJCWRldiA9IG1vdmVfZGV2X3RvX25leHQoY2FyZCxkZXYpOworCQkJCWJyZWFrOworCQkJfWVsc2V7CisJCQkJLyogVHggYnVmZmVycyBub3QgYXZhaWxhYmxlLCBidXQgZGV2aWNlIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgVFggaW50ZXJydXB0LiAgU2V0IG1vcmVfdG9fdHggYW5kIHRyeSAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIHRyYW5zbWl0IGZvciBvdGhlciBkZXZpY2VzLgorCQkJCSAqLworCQkJCW1vcmVfdG9fdHg9MTsKKwkJCQlkZXYgPSBtb3ZlX2Rldl90b19uZXh0KGNhcmQsZGV2KTsKKwkJCX0KKworCQl9ZWxzZXsKKwkJCS8qIFRoaXMgZGV2aWNlIHdhcyBub3Qgc2V0IHRvIHRyYW5zbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICogZ28gdG8gbmV4dCAKKwkJCSAqLworCQkJZGV2ID0gbW92ZV9kZXZfdG9fbmV4dChjYXJkLGRldik7CisJCX0JCisKKwkJaWYgKCsraSA9PSBjYXJkLT51Lngubm9fZGV2KXsKKwkJCWlmICghbW9yZV90b190eCl7CisJCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIiVzOiBOb3RoaW5nIHRvIFNlbmQgaW4gVFggSU5UUlxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJfSAvL0VuZCBvZiBGT1IKKworCWNhcmQtPnUueC50eF9kZXYgPSBkZXY7CisJCisJaWYgKCFtb3JlX3RvX3R4KXsKKwkJLyogaWYgYW55IG90aGVyIGludGVyZmFjZXMgaGF2ZSB0cmFuc21pdCBpbnRlcnJ1cHRzIHBlbmRpbmcsICovCisJCS8qIGRvIG5vdCBkaXNhYmxlIHRoZSBnbG9iYWwgdHJhbnNtaXQgaW50ZXJydXB0ICovCisJCWlmICghKC0tY2FyZC0+dS54LnR4X2ludGVycnVwdHNfcGVuZGluZykpeworCQkJc3RhdHVzLT5pbWFzayAmPSB+SU5UUl9PTl9UWF9GUkFNRTsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBtb3ZlX2Rldl90b19uZXh0CisgKiAgCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKK3N0cnVjdCBuZXRfZGV2aWNlICptb3ZlX2Rldl90b19uZXh0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoY2FyZC0+dS54Lm5vX2RldiAhPSAxKXsKKwkJaWYgKCEqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKQorCQkJcmV0dXJuIGNhcmQtPndhbmRldi5kZXY7CisJCWVsc2UKKwkJCXJldHVybiAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpOworCX0KKwlyZXR1cm4gZGV2OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogIHR4X2ludHJfc2VuZAorICogIAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB0eF9pbnRyX3NlbmQoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXgyNV9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7IAorCisJaWYgKGNoYW5fc2VuZCAoZGV2LGNoYW4tPnRyYW5zbWl0X2J1ZmZlcixjaGFuLT50cmFuc21pdF9sZW5ndGgsMSkpeworCQkgCisgICAgICAgICAgICAgICAgLyogUGFja2V0IHdhcyBzcGxpdCB1cCBkdWUgdG8gaXRzIHNpemUsIGRvIG5vdCBkaXNhYmxlCisgICAgICAgICAgICAgICAgICogdHhfaW50ciAKKyAgICAgICAgICAgICAgICAgKi8KKwkJcmV0dXJuIDE7CisJfQorCisJY2hhbi0+dHJhbnNtaXRfbGVuZ3RoPTA7CisJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmRyaXZlcl9idXN5LDApOworCWNoYW4tPnR4X29mZnNldD0wOworCisJLyogSWYgd2UgYXJlIGluIEFQSSBtb2RlLCB3YWtldXAgdGhlIAorICAgICAgICAgKiBzb2NrIEJIIGhhbmRsZXIsIG5vdCB0aGUgTkVUX0JIICovCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSl7CisJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJd2FrZXVwX3NrX2JoKGRldik7CisJCX1lbHNleworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB0aW1lcl9pbnRyCisgKiAgCisgKiAJVGltZXIgaW50ZXJydXB0IGhhbmRsZXIuCisgKglDaGVjayB3aG8gY2FsbGVkIHRoZSB0aW1lciBpbnRlcnJ1cHQgYW5kIHBlcmZvcm0KKyAqICAgICAgYWN0aW9uIGFjY29yZGluZ2x5LgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgdGltZXJfaW50ciAoc2RsYV90ICpjYXJkKQoreworCVRYMjVTdGF0dXMqIHN0YXR1cyA9IGNhcmQtPmZsYWdzOworCisJaWYgKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9DTURfRVhFQyl7CisKKwkJaWYgKHRpbWVyX2ludHJfY21kX2V4ZWMoY2FyZCkgPT0gMCl7CisJCQljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJj0KKwkJCQl+VE1SX0lOVF9FTkFCTEVEX0NNRF9FWEVDOworCQl9CisKKwl9ZWxzZSAgaWYoY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1VEUF9QS1QpIHsKKworCQlpZiAoKCpjYXJkLT51LnguaGRsY19idWZfc3RhdHVzICYgMHg0MCkgJiYgCisJCSAgICBjYXJkLT51LngudWRwX3R5cGUgPT0gVURQX1hQSVBFX1RZUEUpeworCisgICAgICAgICAgICAgICAgICAgIAlpZihwcm9jZXNzX3VkcF9tZ210X3BrdChjYXJkKSkgeworCQkgICAgICAgICAgICAgICAgY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICY9IAorCQkJCQl+VE1SX0lOVF9FTkFCTEVEX1VEUF9QS1Q7CisJCQl9CisJCX0KKworCX1lbHNlIGlmIChjYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfUE9MTF9BQ1RJVkUpIHsKKworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+dS54LnBvbGxfZGV2aWNlOworCQl4MjVfY2hhbm5lbF90ICpjaGFuID0gTlVMTDsKKworCQlpZiAoIWRldil7CisJCQljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9QT0xMX0FDVElWRTsKKwkJCXJldHVybjsKKwkJfQorCQljaGFuID0gZGV2LT5wcml2OworCisJCXByaW50ayhLRVJOX0lORk8gCisJCQkiJXM6IENsb3NpbmcgZG93biBJZGxlIGxpbmsgJXMgb24gTENOICVkXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLGNoYW4tPm5hbWUsY2hhbi0+Y29tbW9uLmxjbik7IAorCQljaGFuLT5pX3RpbWVvdXRfc29mYXIgPSBqaWZmaWVzOworCQljaGFuX2Rpc2MoZGV2KTsJCisgICAgICAgICAJY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfUE9MTF9BQ1RJVkU7CisJCWNhcmQtPnUueC5wb2xsX2RldmljZT1OVUxMOworCisJfWVsc2UgaWYgKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9QT0xMX0NPTk5FQ1RfT04pIHsKKworCQl3YW5waXBlX3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVEVEKTsKKwkJaWYgKGNhcmQtPnUueC5MQVBCX2hkbGMpeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNhcmQtPndhbmRldi5kZXY7CisJCQlzZXRfY2hhbl9zdGF0ZShkZXYsV0FOX0NPTk5FQ1RFRCk7CisJCQlzZW5kX2RlbGF5ZWRfY21kX3Jlc3VsdChjYXJkLGRldixjYXJkLT5tYm94KTsJCisJCX0KKworCQkvKiAweDhGIGVuYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCQl4MjVfc2V0X2ludHJfbW9kZShjYXJkLCBJTlRSX09OX1JYX0ZSQU1FfAkKKwkJCQkJSU5UUl9PTl9UWF9GUkFNRXwKKwkJCQkJSU5UUl9PTl9NT0RFTV9TVEFUVVNfQ0hBTkdFfAorCQkJCQkvL0lOVFJfT05fQ09NTUFORF9DT01QTEVURXwKKwkJCQkJWDI1X0FTWV9UUkFOU19JTlRSX1BFTkRJTkcgfAorCQkJCQlJTlRSX09OX1RJTUVSIHwKKwkJCQkJRElSRUNUX1JYX0lOVFJfVVNBR0UKKwkJCQkpOyAKKworCQlzdGF0dXMtPmltYXNrICY9IH5JTlRSX09OX1RYX0ZSQU1FOwkvKiBtYXNrIFR4IGludGVycnVwdHMgKi8KKwkJY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfUE9MTF9DT05ORUNUX09OOworCisJfWVsc2UgaWYgKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9QT0xMX0NPTk5FQ1RfT0ZGKSB7CisKKwkJLy9wcmludGsoS0VSTl9JTkZPICJQb2xsIGNvbm5lY3QsIFR1cm5pbmcgT0ZGXG4iKTsKKwkJZGlzY29ubmVjdChjYXJkKTsKKwkJY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfUE9MTF9DT05ORUNUX09GRjsKKworCX1lbHNlIGlmIChjYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfUE9MTF9ESVNDT05ORUNUKSB7CisKKwkJLy9wcmludGsoS0VSTl9JTkZPICJQT2xsIGRpc2Nvbm5lY3QsIHRyeWluZyB0byBjb25uZWN0XG4iKTsKKwkJY29ubmVjdChjYXJkKTsKKwkJY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfUE9MTF9ESVNDT05ORUNUOworCisJfWVsc2UgaWYgKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VUERBVEUpeworCisJCWlmICgqY2FyZC0+dS54LmhkbGNfYnVmX3N0YXR1cyAmIDB4NDApeworCQkJeDI1X2dldF9lcnJfc3RhdHMoY2FyZCk7CisJCQl4MjVfZ2V0X3N0YXRzKGNhcmQpOworCQkJY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfVVBEQVRFOworCQl9CisJfQorCisJaWYoIWNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCl7CisJCS8vcHJpbnRrKEtFUk5fSU5GTyAiVHVybmluZyBUaW1lciBPZmYgXG4iKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMtPmltYXNrICY9IH5JTlRSX09OX1RJTUVSOwkKKwl9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlNb2RlbSBzdGF0dXMgaW50ZXJydXB0IGhhbmRsZXIuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgc3RhdHVzX2ludHIgKHNkbGFfdCogY2FyZCkKK3sKKworCS8qIEFkZGVkIHRvIGF2b2lkIE1vZGVtIHN0YXR1cyBtZXNzYWdlIGZsb29kaW5nICovCisJc3RhdGljIFRYMjVNb2RlbVN0YXR1cyBsYXN0X3N0YXQ7CisKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisJVFgyNU1vZGVtU3RhdHVzICptb2RlbV9zdGF0dXM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl4MjVfY2hhbm5lbF90ICpjaGFuOworCWludCBlcnI7CisKKwltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9SRUFEX01PREVNX1NUQVRVUzsKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJaWYgKGVycil7IAorCQl4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfUkVBRF9NT0RFTV9TVEFUVVMsIDApOworCX1lbHNleworCQorCQltb2RlbV9zdGF0dXMgPSAoVFgyNU1vZGVtU3RhdHVzKiltYm94LT5kYXRhOwkKKwkKKyAgICAgICAgICAgCS8qIENoZWNrIGlmIHRoZSBsYXN0IHN0YXR1cyB3YXMgdGhlIHNhbWUKKyAgICAgICAgICAgCSAqIGlmIGl0IHdhcywgZG8gTk9UIHByaW50IG1lc3NhZ2UgYWdhaW4gKi8KKwkKKwkJaWYgKGxhc3Rfc3RhdC5zdGF0dXMgIT0gbW9kZW1fc3RhdHVzLT5zdGF0dXMpeworCisJICAgICAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNb2RlbSBTdGF0dXMgQ2hhbmdlOiBEQ0Q9JXMsIENUUz0lc1xuIiwKKwkJCQljYXJkLT5kZXZuYW1lLERDRChtb2RlbV9zdGF0dXMtPnN0YXR1cyksQ1RTKG1vZGVtX3N0YXR1cy0+c3RhdHVzKSk7CisKKwkJCWxhc3Rfc3RhdC5zdGF0dXMgPSBtb2RlbV9zdGF0dXMtPnN0YXR1czsKKwkJCisJCQlpZiAoY2FyZC0+dS54Lm9vYl9vbl9tb2RlbSl7CisKKwkJCQltYm94LT5jbWQucGt0VHlwZSA9IG1ib3gtPmNtZC5jb21tYW5kOworCQkJCW1ib3gtPmNtZC5yZXN1bHQgPSAweDA4OworCisJCQkJLyogU2VuZCBhIE9PQiB0byBhbGwgY29ubmVjdGVkIHNvY2tldHMgKi8KKwkJCQlmb3IgKGRldiA9IGNhcmQtPndhbmRldi5kZXY7IGRldjsKKwkJCQkgICAgIGRldiA9ICooKHN0cnVjdCBuZXRfZGV2aWNlKiopZGV2LT5wcml2KSkgeworCQkJCQljaGFuPWRldi0+cHJpdjsKKwkJCQkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKwkJCQkJCXNlbmRfb29iX21zZyhjYXJkLGRldixtYm94KTsJCQkJCisJCQkJCX0KKwkJCQl9CisKKwkJCQkvKiBUaGUgbW9kZW0gT09CIG1lc3NhZ2Ugd2lsbCBwcm9iYWJseSBraWxsIHRoZQorCQkJCSAqIHRoZSBsaW5rLiBJZiB3ZSBkb24ndCBjbGVhciB0aGUgZmxhZyBoZXJlLAorCQkJCSAqIGEgZGVhZGxvY2sgY291bGQgb2NjdXIgKi8gCisJCQkJaWYgKGF0b21pY19yZWFkKCZjYXJkLT51LnguY29tbWFuZF9idXN5KSl7CisJCQkJCWF0b21pY19zZXQoJmNhcmQtPnUueC5jb21tYW5kX2J1c3ksMCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfSERMQ19MSU5LX1NUQVRVUzsKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJaWYgKGVycil7IAorCQl4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfSERMQ19MSU5LX1NUQVRVUywgMCk7CisJfQorCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlOZXR3b3JrIGV2ZW50IGludGVycnVwdCBoYW5kbGVyLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIGV2ZW50X2ludHIgKHNkbGFfdCogY2FyZCkKK3sKKwl4MjVfZmV0Y2hfZXZlbnRzKGNhcmQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJU3B1cmlvdXMgaW50ZXJydXB0IGhhbmRsZXIuCisgKiAJbyBwcmludCBhIHdhcm5pbmcKKyAqIAlvCSAKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBzcHVyX2ludHIgKHNkbGFfdCogY2FyZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogc3B1cmlvdXMgaW50ZXJydXB0IVxuIiwgY2FyZC0+ZGV2bmFtZSk7Cit9CisKKworLyoKKyAqCUJhY2tncm91bmQgUG9sbGluZyBSb3V0aW5lcyAgCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCU1haW4gcG9sbGluZyByb3V0aW5lLgorICogCVRoaXMgcm91dGluZSBpcyByZXBlYXRlZGx5IGNhbGxlZCBieSB0aGUgV0FOUElQRSAndGhyZWFkJyB0byBhbGxvdyBmb3IKKyAqIAl0aW1lLWRlcGVuZGVudCBob3VzZWtlZXBpbmcgd29yay4KKyAqCisgKiAJTm90ZXM6CisgKiAJMS4gVGhpcyByb3V0aW5lIG1heSBiZSBjYWxsZWQgb24gaW50ZXJydXB0IGNvbnRleHQgd2l0aCBhbGwgaW50ZXJydXB0cworICogICAgCWVuYWJsZWQuIEJld2FyZSEKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCB3cHhfcG9sbCAoc2RsYV90ICpjYXJkKQoreworCWlmICghY2FyZC0+d2FuZGV2LmRldil7CisJCWdvdG8gd3B4X3BvbGxfZXhpdDsKKwl9CisKKwlpZiAoY2FyZC0+b3Blbl9jbnQgIT0gY2FyZC0+dS54Lm51bV9vZl9jaCl7CisJCWdvdG8gd3B4X3BvbGxfZXhpdDsKKwl9CisJCisJaWYgKHRlc3RfYml0KFBFUklfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisJCWdvdG8gd3B4X3BvbGxfZXhpdDsKKwl9CisKKwlpZiAodGVzdF9iaXQoU0VORF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJZ290byB3cHhfcG9sbF9leGl0OworCX0KKworCXN3aXRjaChjYXJkLT53YW5kZXYuc3RhdGUpeworCQljYXNlIFdBTl9DT05ORUNURUQ6CisJCQlwb2xsX2FjdGl2ZShjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0FOX0NPTk5FQ1RJTkc6CisJCQlwb2xsX2Nvbm5lY3RpbmcoY2FyZCk7CisJCQlicmVhazsKKworCQljYXNlIFdBTl9ESVNDT05ORUNURUQ6CisJCQlwb2xsX2Rpc2Nvbm5lY3RlZChjYXJkKTsKKwkJCWJyZWFrOworCX0KKword3B4X3BvbGxfZXhpdDoKKwljbGVhcl9iaXQoUE9MTF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgdHJpZ2dlcl94MjVfcG9sbChzZGxhX3QgKmNhcmQpCit7CisJc2NoZWR1bGVfd29yaygmY2FyZC0+dS54LngyNV9wb2xsX3dvcmspOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJSGFuZGxlIHBoeXNpY2FsIGxpbmsgZXN0YWJsaXNobWVudCBwaGFzZS4KKyAqIAlvIGlmIGNvbm5lY3Rpb24gdGltZWQgb3V0LCBkaXNjb25uZWN0IHRoZSBsaW5rLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgcG9sbF9jb25uZWN0aW5nIChzZGxhX3QqIGNhcmQpCit7CisJdm9sYXRpbGUgVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisKKwlpZiAoc3RhdHVzLT5nZmxhZ3MgJiBYMjVfSERMQ19BQk0peworCisJCXRpbWVyX2ludHJfZXhlYyAoY2FyZCwgVE1SX0lOVF9FTkFCTEVEX1BPTExfQ09OTkVDVF9PTik7CisKKwl9ZWxzZSBpZiAoKGppZmZpZXMgLSBjYXJkLT5zdGF0ZV90aWNrKSA+IENPTk5FQ1RfVElNRU9VVCl7CisKKwkJdGltZXJfaW50cl9leGVjIChjYXJkLCBUTVJfSU5UX0VOQUJMRURfUE9MTF9DT05ORUNUX09GRik7CisKKwl9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlIYW5kbGUgcGh5c2ljYWwgbGluayBkaXNjb25uZWN0ZWQgcGhhc2UuCisgKiAJbyBpZiBob2xkLWRvd24gdGltZW91dCBoYXMgZXhwaXJlZCBhbmQgdGhlcmUgYXJlIG9wZW4gaW50ZXJmYWNlcywgCisgKgljb25uZWN0IGxpbmsuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBwb2xsX2Rpc2Nvbm5lY3RlZCAoc2RsYV90KiBjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7IAorCXgyNV9jaGFubmVsX3QgKmNoYW47CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisKKwlpZiAoIWNhcmQtPnUueC5MQVBCX2hkbGMgJiYgY2FyZC0+b3Blbl9jbnQgJiYgCisJICAgICgoamlmZmllcyAtIGNhcmQtPnN0YXRlX3RpY2spID4gSE9MRF9ET1dOX1RJTUUpKXsKKwkJdGltZXJfaW50cl9leGVjKGNhcmQsIFRNUl9JTlRfRU5BQkxFRF9QT0xMX0RJU0NPTk5FQ1QpOworCX0KKworCisJaWYgKChkZXY9Y2FyZC0+d2FuZGV2LmRldikgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKChjaGFuPWRldi0+cHJpdikgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJICYmIAorCSAgICBhdG9taWNfcmVhZCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQpICYmIAorCSAgICBjYXJkLT51LnguTEFQQl9oZGxjKXsKKworCQlpZiAoIShjYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfQ01EX0VYRUMpKSAKKwkJCWNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfQ01EX0VYRUM7CisKKwkJaWYgKCEoc3RhdHVzLT5pbWFzayAmIElOVFJfT05fVElNRVIpKQorCQkJc3RhdHVzLT5pbWFzayB8PSBJTlRSX09OX1RJTUVSOworCX0JCisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCUhhbmRsZSBhY3RpdmUgbGluayBwaGFzZS4KKyAqIAlvIGZldGNoIFguMjUgYXN5bmNocm9ub3VzIGV2ZW50cy4KKyAqIAlvIGtpY2sgb2ZmIHRyYW5zbWlzc2lvbiBvbiBhbGwgaW50ZXJmYWNlcy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHBvbGxfYWN0aXZlIChzZGxhX3QqIGNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKwlUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKworCWZvciAoZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsgZGV2OworCSAgICAgZGV2ID0gKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KSl7CisJCXgyNV9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisKKwkJLyogSWYgU1ZDIGhhcyBiZWVuIGlkbGUgbG9uZyBlbm91Z2gsIGNsb3NlIHZpcnR1YWwgY2lyY3VpdCAqLworCQlpZiAoIGNoYW4tPmNvbW1vbi5zdmMgJiYgCisJCSAgICAgY2hhbi0+Y29tbW9uLnN0YXRlID09IFdBTl9DT05ORUNURUQgJiYKKwkJICAgICBjaGFuLT5jb21tb24udXNlZGJ5ID09IFdBTlBJUEUgKXsKKwkJCisJCQlpZiggKGppZmZpZXMgLSBjaGFuLT5pX3RpbWVvdXRfc29mYXIpIC8gSFogPiBjaGFuLT5pZGxlX3RpbWVvdXQgKXsKKwkJCQkvKiBDbG9zZSBzdmMgKi8KKwkJCQljYXJkLT51LngucG9sbF9kZXZpY2U9ZGV2OworCQkJCXRpbWVyX2ludHJfZXhlYwkoY2FyZCwgVE1SX0lOVF9FTkFCTEVEX1BPTExfQUNUSVZFKTsKKwkJCX0KKwkJfQorCisjaWZkZWYgUFJJTlRfREVCVUcKKwkJY2hhbi0+aWZzdGF0cy50eF9jb21wcmVzc2VkID0gYXRvbWljX3JlYWQoJmNoYW4tPmNvbW1vbi5jb21tYW5kKTsKKwkJY2hhbi0+aWZzdGF0cy50eF9lcnJvcnMgPSBjaGFuLT5jb21tb24uc3RhdGU7CisJCWNoYW4tPmlmc3RhdHMucnhfZmlmb19lcnJvcnMgPSBhdG9taWNfcmVhZCgmY2FyZC0+dS54LmNvbW1hbmRfYnVzeSk7CisJCSsrY2hhbi0+aWZzdGF0cy50eF9ieXRlczsKKworCQljaGFuLT5pZnN0YXRzLnJ4X2ZpZm9fZXJyb3JzPWF0b21pY19yZWFkKCZjaGFuLT5jb21tb24uZGlzY29ubmVjdCk7CisJCWNoYW4tPmlmc3RhdHMubXVsdGljYXN0PWF0b21pY19yZWFkKCZjaGFuLT5iaF9idWZmX3VzZWQpOworCQljaGFuLT5pZnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnM9KmNhcmQtPnUueC5oZGxjX2J1Zl9zdGF0dXM7CisjZW5kaWYJCisKKwkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJICYmIAorCQkgICAgYXRvbWljX3JlYWQoJmNoYW4tPmNvbW1vbi5jb21tYW5kKSAmJiAKKwkgICAgICAgICAgICAhY2FyZC0+dS54LkxBUEJfaGRsYyl7CisKKwkJCWlmICghKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9DTURfRVhFQykpIAorCQkJCWNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfQ01EX0VYRUM7CisKKwkJCWlmICghKHN0YXR1cy0+aW1hc2sgJiBJTlRSX09OX1RJTUVSKSkKKwkJCQlzdGF0dXMtPmltYXNrIHw9IElOVFJfT05fVElNRVI7CisJCX0JCisKKwkJaWYgKChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSkgJiYgCisJCSAgICAgYXRvbWljX3JlYWQoJmNoYW4tPmNvbW1vbi5kaXNjb25uZWN0KSl7CisKKwkJCWlmIChjaGFuLT5jb21tb24uc3RhdGUgPT0gV0FOX0RJU0NPTk5FQ1RFRCl7CisJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmRpc2Nvbm5lY3QsMCk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlhdG9taWNfc2V0KCZjaGFuLT5jb21tb24uY29tbWFuZCxYMjVfQ0xFQVJfQ0FMTCk7CisJCQlpZiAoIShjYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfQ01EX0VYRUMpKSAKKwkJCQljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgfD0gVE1SX0lOVF9FTkFCTEVEX0NNRF9FWEVDOworCisJCQlpZiAoIShzdGF0dXMtPmltYXNrICYgSU5UUl9PTl9USU1FUikpCisJCQkJc3RhdHVzLT5pbWFzayB8PSBJTlRSX09OX1RJTUVSOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCB0aW1lcl9pbnRyX2V4ZWMoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBjaGFyIFRZUEUpCit7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisJY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkIHw9IFRZUEU7CisJaWYgKCEoc3RhdHVzLT5pbWFzayAmIElOVFJfT05fVElNRVIpKQorCQlzdGF0dXMtPmltYXNrIHw9IElOVFJfT05fVElNRVI7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAqIFNETEEgRmlybXdhcmUtU3BlY2lmaWMgRnVuY3Rpb25zIAorICoKKyAqICBBbG1vc3QgYWxsIFguMjUgY29tbWFuZHMgY2FuIHVuZXhwZXRlZGx5IGZhaWwgZHVlIHRvIHNvIGNhbGxlZCAnWC4yNQorICogIGFzeW5jaHJvbm91cyBldmVudHMnIHN1Y2ggYXMgcmVzdGFydCwgaW50ZXJydXB0LCBpbmNvbWluZyBjYWxsIHJlcXVlc3QsCisgKiAgY2FsbCBjbGVhciByZXF1ZXN0LCBldGMuICBUaGV5IGNhbid0IGJlIGlnbm9yZWQgYW5kIGhhdmUgdG8gYmUgZGVsdCB3aXRoCisgKiAgaW1tZWRpYXRlbHkuICBUbyB0YWNrbGUgd2l0aCB0aGlzIHByb2JsZW0gd2UgZXhlY3V0ZSBlYWNoIGludGVyZmFjZSAKKyAqICBjb21tYW5kIGluIGEgbG9vcCB1bnRpbCBnb29kIHJldHVybiBjb2RlIGlzIHJlY2VpdmVkIG9yIG1heGltdW0gbnVtYmVyIAorICogIG9mIHJldHJpZXMgaXMgcmVhY2hlZC4gIEVhY2ggaW50ZXJmYWNlIGNvbW1hbmQgcmV0dXJucyBub24temVybyByZXR1cm4gCisgKiAgY29kZSwgYW4gYXN5bmNocm9ub3VzIGV2ZW50L2Vycm9yIGhhbmRsZXIgeDI1X2Vycm9yKCkgaXMgY2FsbGVkLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlSZWFkIFguMjUgZmlybXdhcmUgdmVyc2lvbi4KKyAqCQlQdXQgY29kZSB2ZXJzaW9uIGFzIEFTQ0lJIHN0cmluZyBpbiBzdHIuIAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB4MjVfZ2V0X3ZlcnNpb24gKHNkbGFfdCogY2FyZCwgY2hhciogc3RyKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKyAgCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfUkVBRF9DT0RFX1ZFUlNJT047CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJgorCQkgeDI1X2Vycm9yKGNhcmQsIGVyciwgWDI1X1JFQURfQ09ERV9WRVJTSU9OLCAwKSk7CisKKwlpZiAoIWVyciAmJiBzdHIpCisJeworCQlpbnQgbGVuID0gbWJveC0+Y21kLmxlbmd0aDsKKworCQltZW1jcHkoc3RyLCBtYm94LT5kYXRhLCBsZW4pOworCQlzdHJbbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlDb25maWd1cmUgYWRhcHRlci4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgeDI1X2NvbmZpZ3VyZSAoc2RsYV90KiBjYXJkLCBUWDI1Q29uZmlnKiBjb25mKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKyAgCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRveworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWVtY3B5KG1ib3gtPmRhdGEsICh2b2lkKiljb25mLCBzaXplb2YoVFgyNUNvbmZpZykpOworCQltYm94LT5jbWQubGVuZ3RoICA9IHNpemVvZihUWDI1Q29uZmlnKTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfU0VUX0NPTkZJR1VSQVRJT047CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfU0VUX0NPTkZJR1VSQVRJT04sIDApKTsKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJQ29uZmlndXJlIGFkYXB0ZXIgZm9yIEhETEMgb25seS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgaGRsY19jb25maWd1cmUgKHNkbGFfdCogY2FyZCwgVFgyNUNvbmZpZyogY29uZikKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkb3sKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCW1lbWNweShtYm94LT5kYXRhLCAodm9pZCopY29uZiwgc2l6ZW9mKFRYMjVDb25maWcpKTsKKwkJbWJveC0+Y21kLmxlbmd0aCAgPSBzaXplb2YoVFgyNUNvbmZpZyk7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X0hETENfU0VUX0NPTkZJRzsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9TRVRfQ09ORklHVVJBVElPTiwgMCkpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzZXRfaGRsY19sZXZlbCAoc2RsYV90KiBjYXJkKQoreworCisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG97CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFNFVF9QUk9UT0NPTF9MRVZFTDsKKwkJbWJveC0+Y21kLmxlbmd0aCA9IDE7CisJCW1ib3gtPmRhdGFbMF0gPSBIRExDX0xFVkVMOyAvL3wgRE9fSERMQ19MRVZFTF9FUlJPUl9DSEVDS0lORzsgCQorCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgU0VUX1BST1RPQ09MX0xFVkVMLCAwKSk7CisKKwlyZXR1cm4gZXJyOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2V0IGNvbW11bmljYXRpb25zIGVycm9yIHN0YXRpc3RpY3MuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB4MjVfZ2V0X2Vycl9zdGF0cyAoc2RsYV90KiBjYXJkKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKyAgCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfSERMQ19SRUFEX0NPTU1fRVJSOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgWDI1X0hETENfUkVBRF9DT01NX0VSUiwgMCkpOworCQorCWlmICghZXJyKQorCXsKKwkJVEhkbGNDb21tRXJyKiBzdGF0cyA9ICh2b2lkKiltYm94LT5kYXRhOworCisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9vdmVyX2Vycm9ycyAgICA9IHN0YXRzLT5yeE92ZXJydW47CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9jcmNfZXJyb3JzICAgICA9IHN0YXRzLT5yeEJhZENyYzsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgID0gc3RhdHMtPnJ4QWJvcnRlZDsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gc3RhdHMtPnR4QWJvcnRlZDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCUdldCBwcm90b2NvbCBzdGF0aXN0aWNzLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB4MjVfZ2V0X3N0YXRzIChzZGxhX3QqIGNhcmQpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9SRUFEX1NUQVRJU1RJQ1M7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfUkVBRF9TVEFUSVNUSUNTLCAwKSkgOworCQorCWlmICghZXJyKQorCXsKKwkJVFgyNVN0YXRzKiBzdGF0cyA9ICh2b2lkKiltYm94LT5kYXRhOworCisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9wYWNrZXRzID0gc3RhdHMtPnJ4RGF0YTsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnR4X3BhY2tldHMgPSBzdGF0cy0+dHhEYXRhOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJQ2xvc2UgSERMQyBsaW5rLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB4MjVfY2xvc2VfaGRsYyAoc2RsYV90KiBjYXJkKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKyAgCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfSERMQ19MSU5LX0NMT1NFOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgWDI1X0hETENfTElOS19DTE9TRSwgMCkpOworCQorCXJldHVybiBlcnI7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCU9wZW4gSERMQyBsaW5rLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB4MjVfb3Blbl9oZGxjIChzZGxhX3QqIGNhcmQpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9IRExDX0xJTktfT1BFTjsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9IRExDX0xJTktfT1BFTiwgMCkpOworCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldHVwIEhETEMgbGluay4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCB4MjVfc2V0dXBfaGRsYyAoc2RsYV90KiBjYXJkKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKyAgCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfSERMQ19MSU5LX1NFVFVQOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgWDI1X0hETENfTElOS19TRVRVUCwgMCkpOworCQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCAocmFpc2UvZHJvcCkgRFRSLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB4MjVfc2V0X2R0ciAoc2RsYV90KiBjYXJkLCBpbnQgZHRyKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKyAgCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWJveC0+ZGF0YVswXSA9IDA7CisJCW1ib3gtPmRhdGFbMl0gPSAwOworCQltYm94LT5kYXRhWzFdID0gZHRyID8gMHgwMiA6IDB4MDE7CisJCW1ib3gtPmNtZC5sZW5ndGggID0gMzsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfU0VUX0dMT0JBTF9WQVJTOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgWDI1X1NFVF9HTE9CQUxfVkFSUywgMCkpOworCQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlTZXQgaW50ZXJydXB0IG1vZGUuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9zZXRfaW50cl9tb2RlIChzZGxhX3QqIGNhcmQsIGludCBtb2RlKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKyAgCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWJveC0+ZGF0YVswXSA9IG1vZGU7CisJCWlmIChjYXJkLT5ody5md2lkID09IFNGSURfWDI1XzUwOCl7CisJCQltYm94LT5kYXRhWzFdID0gY2FyZC0+aHcuaXJxOworCQkJbWJveC0+ZGF0YVsyXSA9IDI7CisJCQltYm94LT5jbWQubGVuZ3RoID0gMzsKKwkJfWVsc2UgeworCQkgCW1ib3gtPmNtZC5sZW5ndGggID0gMTsKKwkJfQorCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9TRVRfSU5URVJSVVBUX01PREU7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfU0VUX0lOVEVSUlVQVF9NT0RFLCAwKSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCVJlYWQgWC4yNSBjaGFubmVsIGNvbmZpZ3VyYXRpb24uCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9nZXRfY2hhbl9jb25mIChzZGxhX3QqIGNhcmQsIHgyNV9jaGFubmVsX3QqIGNoYW4pCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgbGNuID0gY2hhbi0+Y29tbW9uLmxjbjsKKwlpbnQgZXJyOworCisJZG97CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5jbWQubGNuICAgICA9IGxjbjsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfUkVBRF9DSEFOTkVMX0NPTkZJRzsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9SRUFEX0NIQU5ORUxfQ09ORklHLCBsY24pKTsKKworCWlmICghZXJyKQorCXsKKwkJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisKKwkJLyogY2FsY3VsYXRlIGFuIG9mZnNldCBpbnRvIHRoZSBhcnJheSBvZiBzdGF0dXMgYnl0ZXMgKi8KKwkJaWYgKGNhcmQtPnUueC5oaV9zdmMgPD0gWDI1X01BWF9DSEFOKXsgCisKKwkJCWNoYW4tPmNoX2lkeCA9IGxjbiAtIDE7CisKKwkJfWVsc2V7CisJCQlpbnQgb2Zmc2V0OworCisJCQkvKiBGSVg6IEFwciAxNCAyMDAwIDogTmVuYWQgQ29yYmljCisJCQkgKiBUaGUgZGF0YSBmaWVsZCB3YXMgYmVpbmcgY29tcGFyZWQgdG8gMHgxRiB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICogJyYmJyBpbnN0ZWFkIG9mICcmJy4gCisJCQkgKiBUaGlzIGNhdXNlZCBYMjVBUEkgdG8gZmFpbCBmb3IgTENOcyBncmVhdGVyIHRoYW4gMjU1LgorCQkJICovCisJCQlzd2l0Y2ggKG1ib3gtPmRhdGFbMF0gJiAweDFGKQorCQkJeworCQkJCWNhc2UgMHgwMTogCisJCQkJCW9mZnNldCA9IHN0YXR1cy0+cHZjX21hcDsgYnJlYWs7CisJCQkJY2FzZSAweDAzOiAKKwkJCQkJb2Zmc2V0ID0gc3RhdHVzLT5pY2NfbWFwOyBicmVhazsKKwkJCQljYXNlIDB4MDc6IAorCQkJCQlvZmZzZXQgPSBzdGF0dXMtPnR3Y19tYXA7IGJyZWFrOworCQkJCWNhc2UgMHgwQjogCisJCQkJCW9mZnNldCA9IHN0YXR1cy0+b2djX21hcDsgYnJlYWs7CisJCQkJZGVmYXVsdDogCisJCQkJCW9mZnNldCA9IDA7CisJCQl9CisJCQljaGFuLT5jaF9pZHggPSBsY24gLSAxIC0gb2Zmc2V0OworCQl9CisKKwkJLyogZ2V0IGFjdHVhbCB0cmFuc21pdCBwYWNrZXQgc2l6ZSBvbiB0aGlzIGNoYW5uZWwgKi8KKwkJc3dpdGNoKG1ib3gtPmRhdGFbMV0gJiAweDM4KQorCQl7CisJCQljYXNlIDB4MDA6IAorCQkJCWNoYW4tPnR4X3BrdF9zaXplID0gMTY7IAorCQkJCWJyZWFrOworCQkJY2FzZSAweDA4OiAKKwkJCQljaGFuLT50eF9wa3Rfc2l6ZSA9IDMyOyAKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgxMDogCisJCQkJY2hhbi0+dHhfcGt0X3NpemUgPSA2NDsgCisJCQkJYnJlYWs7CisJCQljYXNlIDB4MTg6IAorCQkJCWNoYW4tPnR4X3BrdF9zaXplID0gMTI4OyAKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgyMDogCisJCQkJY2hhbi0+dHhfcGt0X3NpemUgPSAyNTY7IAorCQkJCWJyZWFrOworCQkJY2FzZSAweDI4OiAKKwkJCQljaGFuLT50eF9wa3Rfc2l6ZSA9IDUxMjsgCisJCQkJYnJlYWs7CisJCQljYXNlIDB4MzA6IAorCQkJCWNoYW4tPnR4X3BrdF9zaXplID0gMTAyNDsgCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNhcmQtPnUueC5sb2dnaW5nKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFguMjUgcGFja2V0IHNpemUgb24gTENOICVkIGlzICVkLlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBsY24sIGNoYW4tPnR4X3BrdF9zaXplKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCVBsYWNlIFguMjUgY2FsbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9wbGFjZV9jYWxsIChzZGxhX3QqIGNhcmQsIHgyNV9jaGFubmVsX3QqIGNoYW4pCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCWNoYXIgc3RyWzY0XTsKKworCisJaWYgKGNoYW4tPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSl7CisJCXNwcmludGYoc3RyLCAiLWQlcyAtdUNDIiwgY2hhbi0+YWRkcik7CisJCisJfWVsc2UgaWYgKGNoYW4tPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQWCkpeworCQlzcHJpbnRmKHN0ciwgIi1kJXMgLXU4MDAwMDAwMDgxMzciLCBjaGFuLT5hZGRyKTsKKwkKKwl9CisJCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQlzdHJjcHkobWJveC0+ZGF0YSwgc3RyKTsKKwkJbWJveC0+Y21kLmxlbmd0aCAgPSBzdHJsZW4oc3RyKTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfUExBQ0VfQ0FMTDsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9QTEFDRV9DQUxMLCAwKSk7CisKKwlpZiAoIWVycil7CisJCWJpbmRfbGNuX3RvX2RldiAoY2FyZCwgY2hhbi0+ZGV2LCBtYm94LT5jbWQubGNuKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCUFjY2VwdCBYLjI1IGNhbGwuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB4MjVfYWNjZXB0X2NhbGwgKHNkbGFfdCogY2FyZCwgaW50IGxjbiwgaW50IHFkbSkKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCW1ib3gtPmNtZC5sY24gICAgID0gbGNuOworCQltYm94LT5jbWQucWRtICAgICA9IHFkbTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfQUNDRVBUX0NBTEw7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfQUNDRVBUX0NBTEwsIGxjbikpOworCQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlDbGVhciBYLjI1IGNhbGwuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB4MjVfY2xlYXJfY2FsbCAoc2RsYV90KiBjYXJkLCBpbnQgbGNuLCBpbnQgY2F1c2UsIGludCBkaWFnbikKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCW1ib3gtPmNtZC5sY24gICAgID0gbGNuOworCQltYm94LT5jbWQuY2F1c2UgICA9IGNhdXNlOworCQltYm94LT5jbWQuZGlhZ24gICA9IGRpYWduOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9DTEVBUl9DQUxMOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgWDI1X0NMRUFSX0NBTEwsIGxjbikpOworCQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlTZW5kIFguMjUgZGF0YSBwYWNrZXQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB4MjVfc2VuZCAoc2RsYV90KiBjYXJkLCBpbnQgbGNuLCBpbnQgcWRtLCBpbnQgbGVuLCB2b2lkKiBidWYpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGNoYXIgY21kOworCQkKKwlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYykKKwkJY21kID0gWDI1X0hETENfV1JJVEU7CisJZWxzZQorCQljbWQgPSBYMjVfV1JJVEU7CisKKwlkbworCXsKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCW1lbWNweShtYm94LT5kYXRhLCBidWYsIGxlbik7CisJCW1ib3gtPmNtZC5sZW5ndGggID0gbGVuOworCQltYm94LT5jbWQubGNuICAgICA9IGxjbjsKKworCQlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYyl7CisJCQltYm94LT5jbWQucGYgPSBxZG07CisJCX1lbHNlewkJCQorCQkJbWJveC0+Y21kLnFkbSA9IHFkbTsKKwkJfQorCisJCW1ib3gtPmNtZC5jb21tYW5kID0gY21kOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgY21kICwgbGNuKSk7CisKKworCS8qIElmIGJ1ZmZlcnMgYXJlIGJ1c3kgdGhlIHJldHVybiBjb2RlIGZvciBMQVBCIEhETEMgaXMKKyAgICAgICAgICogMS4gVGhlIGFib3ZlIGZ1bmN0aW9ucyBhcmUgbG9va2luZyBmb3IgcmV0dXJuIGNvZGUKKyAgICAgICAgICogb2YgWDI1UkVTX05PVF9SRUFEWSBpZiBidXN5LiAqLworCisJaWYgKGNhcmQtPnUueC5MQVBCX2hkbGMgJiYgZXJyID09IDEpeworCQllcnIgPSBYMjVSRVNfTk9UX1JFQURZOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlGZXRjaCBYLjI1IGFzeW5jaHJvbm91cyBldmVudHMuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9mZXRjaF9ldmVudHMgKHNkbGFfdCogY2FyZCkKK3sKKwlUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IGVyciA9IDA7CisKKwlpZiAoc3RhdHVzLT5nZmxhZ3MgJiAweDIwKQorCXsKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X0lTX0RBVEFfQVZBSUxBQkxFOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisgCQlpZiAoZXJyKSB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfSVNfREFUQV9BVkFJTEFCTEUsIDApOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJWC4yNSBhc3luY2hyb25vdXMgZXZlbnQvZXJyb3IgaGFuZGxlci4KKyAqCQlUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGVhY2ggdGltZSBpbnRlcmZhY2UgY29tbWFuZCByZXR1cm5zIAorICoJCW5vbi16ZXJvIHJldHVybiBjb2RlIHRvIGhhbmRsZSBYLjI1IGFzeW5jaHJvbm91cyBldmVudHMgYW5kIAorICoJCWNvbW1vbiBlcnJvcnMuIFJldHVybiBub24temVybyB0byByZXBlYXQgY29tbWFuZCBvciB6ZXJvIHRvIAorICoJCWNhbmNlbCBpdC4KKyAqCisgKiAJTm90ZXM6CisgKiAJMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5LCBhcyBoYW5kbGluZyBzb21lIG9mIHRoZQorICogICAgCWFzeW5jaHJvbm91cyBldmVudHMgKGUuZy4gY2FsbCByZXF1ZXN0KSByZXF1aXJlcyBleGVjdXRpb24gb2YgdGhlCisgKiAgICAJaW50ZXJmYWNlIGNvbW1hbmQocykgdGhhdCwgaW4gdHVybiwgbWF5IGFsc28gcmV0dXJuIGFzeW5jaHJvbm91cworICogICAgCWV2ZW50cy4gIFRvIGF2b2lkIHJlLWVudHJhbmN5IHByb2JsZW1zIHdlIGNvcHkgbWFpbGJveCB0byBkeW5hbWljYWxseQorICogICAgCWFsbG9jYXRlZCBtZW1vcnkgYmVmb3JlIHByb2Nlc3NpbmcgZXZlbnRzLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgeDI1X2Vycm9yIChzZGxhX3QqIGNhcmQsIGludCBlcnIsIGludCBjbWQsIGludCBsY24pCit7CisJaW50IHJldHJ5ID0gMTsKKwl1bnNpZ25lZCBkbGVuID0gKChUWDI1TWJveCopY2FyZC0+bWJveCktPmNtZC5sZW5ndGg7CisJVFgyNU1ib3gqIG1iOworCisJbWIgPSBrbWFsbG9jKHNpemVvZihUWDI1TWJveCkgKyBkbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAobWIgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHgyNV9lcnJvcigpIG91dCBvZiBtZW1vcnkhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAwOworCX0KKwltZW1jcHkobWIsIGNhcmQtPm1ib3gsIHNpemVvZihUWDI1TWJveCkgKyBkbGVuKTsKKwlzd2l0Y2ggKGVycil7CisKKwljYXNlIFgyNVJFU19BU1lOQ19QQUNLRVQ6CS8qIFguMjUgYXN5bmNocm9ub3VzIHBhY2tldCB3YXMgcmVjZWl2ZWQgKi8KKworCQltYi0+ZGF0YVtkbGVuXSA9ICdcMCc7CisKKwkJc3dpdGNoIChtYi0+Y21kLnBrdFR5cGUgJiAweDdGKXsKKworCQljYXNlIEFTRV9DQUxMX1JRU1Q6CQkvKiBpbmNvbWluZyBjYWxsICovCisJCQlyZXRyeSA9IGluY29taW5nX2NhbGwoY2FyZCwgY21kLCBsY24sIG1iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVNFX0NBTExfQUNDRVBURUQ6CQkvKiBjb25uZWN0ZWQgKi8KKwkJCXJldHJ5ID0gY2FsbF9hY2NlcHRlZChjYXJkLCBjbWQsIGxjbiwgbWIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBU0VfQ0xFQVJfUlFTVDoJCS8qIGNhbGwgY2xlYXIgcmVxdWVzdCAqLworCQkJcmV0cnkgPSBjYWxsX2NsZWFyZWQoY2FyZCwgY21kLCBsY24sIG1iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVNFX1JFU0VUX1JRU1Q6CQkvKiByZXNldCByZXF1ZXN0ICovCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogWC4yNSByZXNldCByZXF1ZXN0IG9uIExDTiAlZCEgIgorCQkJCSJDYXVzZToweCUwMlggRGlhZ246MHglMDJYXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIG1iLT5jbWQubGNuLCBtYi0+Y21kLmNhdXNlLAorCQkJCW1iLT5jbWQuZGlhZ24pOworCQkJYXBpX29vYl9ldmVudCAoY2FyZCxtYik7CisJCQlicmVhazsKKworCQljYXNlIEFTRV9SRVNUQVJUX1JRU1Q6CQkvKiByZXN0YXJ0IHJlcXVlc3QgKi8KKwkJCXJldHJ5ID0gcmVzdGFydF9ldmVudChjYXJkLCBjbWQsIGxjbiwgbWIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBU0VfQ0xFQVJfQ09ORlJNOgorCQkJaWYgKGNsZWFyX2NvbmZpcm1fZXZlbnQgKGNhcmQsbWIpKQorCQkJCWJyZWFrOworCisJCQkvKiBJIHVzZSB0aGUgZ290byBzdGF0ZW1lbnQgaGVyZSBzbyBpZiAKKwkgICAgICAgICAgICAgICAgICogc29tZWJvZHkgaW5zZXJ0cyBjb2RlIGJldHdlZW4gdGhlCisgICAgICAgIAkgICAgICAgICAqIGNhc2UgYW5kIGRlZmF1bHQsIHdlIHdpbGwgbm90IGhhdmUKKyAgICAgICAgICAgICAgICAJICogZ2hvc3QgcHJvYmxlbXMgKi8KKworCQkJZ290byBkZmx0XzE7CisKKwkJZGVmYXVsdDoKK2RmbHRfMToKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBYLjI1IGV2ZW50IDB4JTAyWCBvbiBMQ04gJWQhICIKKwkJCQkiQ2F1c2U6MHglMDJYIERpYWduOjB4JTAyWFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBtYi0+Y21kLnBrdFR5cGUsCisJCQkJbWItPmNtZC5sY24sIG1iLT5jbWQuY2F1c2UsIG1iLT5jbWQuZGlhZ24pOworCQl9CisJCWJyZWFrOworCisJY2FzZSBYMjVSRVNfUFJPVE9fVklPTEFUSU9OOgkvKiBYLjI1IHByb3RvY29sIHZpb2xhdGlvbiBpbmRpY2F0aW9uICovCisKKwkJLyogQnVnIEZpeDogTWFyIDE0IDIwMDAKKyAgICAgICAgICAgICAgICAgKiBUaGUgUHJvdG9jb2wgdmlvbGF0aW9uIGVycm9yIGNvbmRpdGlvbnMgd2VyZSAgCisgICAgICAgICAgICAgICAgICogbm90IGhhbmRsZWQgcHJldmlvdXNseSAqLworCisJCXN3aXRjaCAobWItPmNtZC5wa3RUeXBlICYgMHg3Ril7CisKKwkJY2FzZSBQVkVfQ0xFQVJfUlFTVDoJLyogQ2xlYXIgcmVxdWVzdCAqLwkJCisJCQlyZXRyeSA9IGNhbGxfY2xlYXJlZChjYXJkLCBjbWQsIGxjbiwgbWIpOworCQkJYnJlYWs7CQorCisJCWNhc2UgUFZFX1JFU0VUX1JRU1Q6CS8qIFJlc2V0IHJlcXVlc3QgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBYLjI1IHJlc2V0IHJlcXVlc3Qgb24gTENOICVkISAiCisJCQkJIkNhdXNlOjB4JTAyWCBEaWFnbjoweCUwMlhcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgbWItPmNtZC5sY24sIG1iLT5jbWQuY2F1c2UsCisJCQkJbWItPmNtZC5kaWFnbik7CisJCQlhcGlfb29iX2V2ZW50IChjYXJkLG1iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUFZFX1JFU1RBUlRfUlFTVDoJLyogUmVzdGFydCByZXF1ZXN0ICovCisJCQlyZXRyeSA9IHJlc3RhcnRfZXZlbnQoY2FyZCwgY21kLCBsY24sIG1iKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQgOgorCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSIlczogWC4yNSBwcm90b2NvbCB2aW9sYXRpb24gb24gTENOICVkISAiCisJCQkJIlBhY2tldDoweCUwMlggQ2F1c2U6MHglMDJYIERpYWduOjB4JTAyWFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBtYi0+Y21kLmxjbiwKKwkJCQltYi0+Y21kLnBrdFR5cGUgJiAweDdGLCBtYi0+Y21kLmNhdXNlLCBtYi0+Y21kLmRpYWduKTsKKwkJCWFwaV9vb2JfZXZlbnQoY2FyZCxtYik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDB4NDI6CS8qIFguMjUgdGltZW91dCAqLworCQlyZXRyeSA9IHRpbWVvdXRfZXZlbnQoY2FyZCwgY21kLCBsY24sIG1iKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4NDM6CS8qIFguMjUgcmV0cnkgbGltaXQgZXhjZWVkZWQgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiBleGNlZWRlZCBYLjI1IHJldHJ5IGxpbWl0IG9uIExDTiAlZCEgIgorCQkJIlBhY2tldDoweCUwMlggRGlhZ246MHglMDJYXG4iLCBjYXJkLT5kZXZuYW1lLAorCQkJbWItPmNtZC5sY24sIG1iLT5jbWQucGt0VHlwZSwgbWItPmNtZC5kaWFnbikKKwkJOworCQlicmVhazsKKworCWNhc2UgMHgwODoJLyogbW9kZW0gZmFpbHVyZSAqLworI2lmbmRlZiBNT0RFTV9OT1RfTE9HCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBtb2RlbSBmYWlsdXJlIVxuIiwgY2FyZC0+ZGV2bmFtZSk7CisjZW5kaWYgLyogTU9ERU1fTk9UX0xPRyAqLworCQlhcGlfb29iX2V2ZW50KGNhcmQsbWIpOworCQlicmVhazsKKworCWNhc2UgMHgwOToJLyogTjIgcmV0cnkgbGltaXQgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGV4Y2VlZGVkIEhETEMgcmV0cnkgbGltaXQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJCWFwaV9vb2JfZXZlbnQoY2FyZCxtYik7CisJCWJyZWFrOworCisJY2FzZSAweDA2OgkvKiB1bm51bWJlcmVkIGZyYW1lIHdhcyByZWNlaXZlZCB3aGlsZSBpbiBBQk0gKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlY2VpdmVkIFVubnVtYmVyZWQgZnJhbWUgMHglMDJYIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIG1iLT5kYXRhWzBdKTsKKwkJYXBpX29vYl9ldmVudChjYXJkLG1iKTsKKwkJYnJlYWs7CisKKwljYXNlIENNRF9USU1FT1VUOgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb21tYW5kIDB4JTAyWCB0aW1lZCBvdXQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgY21kKQorCQk7CisJCXJldHJ5ID0gMDsJLyogYWJvcnQgY29tbWFuZCAqLworCQlicmVhazsKKworCWNhc2UgWDI1UkVTX05PVF9SRUFEWToKKwkJcmV0cnkgPSAxOworCQlicmVhazsKKworCWNhc2UgMHgwMToKKwkJaWYgKGNhcmQtPnUueC5MQVBCX2hkbGMpCisJCQlicmVhazsKKworCQlpZiAobWItPmNtZC5jb21tYW5kID09IDB4MTYpCisJCQlicmVhazsKKwkJLyogSSB1c2UgdGhlIGdvdG8gc3RhdGVtZW50IGhlcmUgc28gaWYgCisgICAgICAgICAgICAgICAgICogc29tZWJvZHkgaW5zZXJ0cyBjb2RlIGJldHdlZW4gdGhlCisgICAgICAgICAgICAgICAgICogY2FzZSBhbmQgZGVmYXVsdCwgd2Ugd2lsbCBub3QgaGF2ZQorICAgICAgICAgICAgICAgICAqIGdob3N0IHByb2JsZW1zICovCisJCWdvdG8gZGZsdF8yOworCisJZGVmYXVsdDoKK2RmbHRfMjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbW1hbmQgMHglMDJYIHJldHVybmVkIDB4JTAyWCEgTGNuICVpXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgY21kLCBlcnIsIG1iLT5jbWQubGNuKQorCQk7CisJCXJldHJ5ID0gMDsJLyogYWJvcnQgY29tbWFuZCAqLworCX0KKwlrZnJlZShtYik7CisJcmV0dXJuIHJldHJ5OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICoJWC4yNSBBc3luY2hyb25vdXMgRXZlbnQgSGFuZGxlcnMKKyAqIAlUaGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSB0aGUgeDI1X2Vycm9yKCkgYW5kIHNob3VsZCByZXR1cm4gMCwgaWYKKyAqIAl0aGUgY29tbWFuZCByZXN1bHRpbmcgaW4gdGhlIGFzeW5jaHJvbm91cyBldmVudCBtdXN0IGJlIGFib3J0ZWQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqSGFuZGxlIFguMjUgaW5jb21pbmcgY2FsbCByZXF1ZXN0LgorICoJUkZDIDEzNTYgZXN0YWJsaXNoZXMgdGhlIGZvbGxvd2luZyBydWxlczoKKyAqCTEuIFRoZSBmaXJzdCBvY3RldCBpbiB0aGUgQ2FsbCBVc2VyIERhdGEgKENVRCkgZmllbGQgb2YgdGhlIGNhbGwKKyAqICAgICAJICAgcmVxdWVzdCBwYWNrZXQgY29udGFpbnMgTkxQSUQgaWRlbnRpZnlpbmcgcHJvdG9jb2wgZW5jYXBzdWxhdGlvbgorICogCTIuIENhbGxzIE1VU1QgTk9UIGJlIGFjY2VwdGVkIHVubGVzcyByb3V0ZXIgc3VwcG9ydHMgcmVxdWVzdGVkCisgKiAgIAkgICBwcm90b2NvbCBlbmNhcHN1bGF0aW9uLgorICoJMy4gQSBkaWFnbm9zdGljIGNvZGUgMjQ5IGRlZmluZWQgYnkgSVNPL0lFQyA4MjA4IG1heSBiZSB1c2VkIAorICoJICAgd2hlbiBjbGVhcmluZyBhIGNhbGwgYmVjYXVzZSBwcm90b2NvbCBlbmNhcHN1bGF0aW9uIGlzIG5vdCAKKyAqCSAgIHN1cHBvcnRlZC4KKyAqCTQuIElmIGFuIGluY29taW5nIGNhbGwgaXMgcmVjZWl2ZWQgd2hpbGUgYSBjYWxsIHJlcXVlc3QgaXMgCisgKgkgICBwZW5kaW5nIChpLmUuIGNhbGwgY29sbGlzaW9uIGhhcyBvY2N1cnJlZCksIHRoZSBpbmNvbWluZyBjYWxsIAorICoJICAgc2hhbGwgYmUgcmVqZWN0ZWQgYW5kIGNhbGwgcmVxdWVzdCBzaGFsbCBiZSByZXRyaWVkLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgaW5jb21pbmdfY2FsbCAoc2RsYV90KiBjYXJkLCBpbnQgY21kLCBpbnQgbGNuLCBUWDI1TWJveCogbWIpCit7CisJc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiA9ICZjYXJkLT53YW5kZXY7CisJaW50IG5ld19sY24gPSBtYi0+Y21kLmxjbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2ID0gZ2V0X2Rldl9ieV9sY24od2FuZGV2LCBuZXdfbGNuKTsKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gTlVMTDsKKwlpbnQgYWNjZXB0ID0gMDsJCS8qIHNldCB0byAnMScgaWYgby5rLiB0byBhY2NlcHQgY2FsbCAqLworCXVuc2lnbmVkIGludCB1c2VyX2RhdGE7CisJeDI1X2NhbGxfaW5mb190KiBpbmZvOworCQorCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjYWxsIGNvbGxpc2lvbiAqLworCWlmIChkZXYgIT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSIlczogWC4yNSBpbmNvbWluZyBjYWxsIGNvbGxpc2lvbiBvbiBMQ04gJWQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgbmV3X2xjbik7CisKKwkJeDI1X2NsZWFyX2NhbGwoY2FyZCwgbmV3X2xjbiwgMCwgMCk7CisJCXJldHVybiAxOworCX0KKworCS8qIE1ha2Ugc3VyZSBEIGJpdCBpcyBub3Qgc2V0IGluIGNhbGwgcmVxdWVzdCAqLworLy9GSVhNRTogVEhJUyBJUyBOT1QgVFVSRSAhISEhIFRBS0UgSVQgT1VUCisvLwlpZiAobWItPmNtZC5xZG0gJiAweDAyKQorLy8JeworLy8JCXByaW50ayhLRVJOX0lORk8KKy8vCQkJIiVzOiBYLjI1IGluY29taW5nIGNhbGwgb24gTENOICVkIHdpdGggRC1iaXQgc2V0IVxuIiwKKy8vCQkJY2FyZC0+ZGV2bmFtZSwgbmV3X2xjbik7CisvLworLy8JCXgyNV9jbGVhcl9jYWxsKGNhcmQsIG5ld19sY24sIDAsIDApOworLy8JCXJldHVybiAxOworLy8JfQorCisJLyogUGFyc2UgY2FsbCByZXF1ZXN0IGRhdGEgKi8KKwlpbmZvID0ga21hbGxvYyhzaXplb2YoeDI1X2NhbGxfaW5mb190KSwgR0ZQX0FUT01JQyk7CisJaWYgKGluZm8gPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIiVzOiBub3QgZW5vdWdoIG1lbW9yeSB0byBwYXJzZSBYLjI1IGluY29taW5nIGNhbGwgIgorCQkJIm9uIExDTiAlZCFcbiIsIGNhcmQtPmRldm5hbWUsIG5ld19sY24pOworCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAwKTsKKwkJcmV0dXJuIDE7CisJfQorIAorCXBhcnNlX2NhbGxfaW5mbyhtYi0+ZGF0YSwgaW5mbyk7CisKKwlpZiAoY2FyZC0+dS54LmxvZ2dpbmcpCisJCXByaW50ayhLRVJOX0lORk8gIlxuJXM6IFguMjUgaW5jb21pbmcgY2FsbCBvbiBMQ04gJWQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgbmV3X2xjbik7CisKKwkvKiBDb252ZXIgdGhlIGZpcnN0IHR3byBBU0NJSSBjaGFyYWN0ZXJzIGludG8gYW4KKyAgICAgICAgICogaW50ZXJnZXIuIFVzZWQgdG8gY2hlY2sgdGhlIGluY29taW5nIHByb3RvY29sIAorICAgICAgICAgKi8KKwl1c2VyX2RhdGEgPSBoZXhfdG9fdWludChpbmZvLT51c2VyLDIpOworCisJLyogRmluZCBhdmFpbGFibGUgY2hhbm5lbCAqLworCWZvciAoZGV2ID0gd2FuZGV2LT5kZXY7IGRldjsgZGV2ID0gKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KSkgeworCQljaGFuID0gZGV2LT5wcml2OworCisJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghY2hhbi0+Y29tbW9uLnN2YyB8fCAoY2hhbi0+Y29tbW9uLnN0YXRlICE9IFdBTl9ESVNDT05ORUNURUQpKQorCQkJY29udGludWU7CisKKwkJaWYgKHVzZXJfZGF0YSA9PSBOTFBJRF9JUCAmJiBjaGFuLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiSVAgcGFja2V0IGJ1dCBjb25maWd1cmVkIGZvciBJUFggOiAleCwgJXhcbiIsCisJCQkJICAgICAgIGh0b25zKGNoYW4tPnByb3RvY29sKSwgaW5mby0+dXNlclswXSk7CisJCQljb250aW51ZTsKKwkJfQorCQorCQlpZiAodXNlcl9kYXRhID09IE5MUElEX1NOQVAgJiYgY2hhbi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfSVBYKSl7CisJCQlwcmludGsoS0VSTl9JTkZPICJJUFggcGFja2V0IGJ1dCBjb25maWd1cmVkIGZvciBJUDogJXhcbiIsCisJCQkJICAgICAgIGh0b25zKGNoYW4tPnByb3RvY29sKSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RyY21wKGluZm8tPnNyYywgY2hhbi0+YWRkcikgPT0gMCkKKwkJCWJyZWFrOworCisJICAgICAgICAvKiBJZiBqdXN0IGFuICdAJyBpcyBzcGVjaWZpZWQsIGFjY2VwdCBhbGwgaW5jb21pbmcgY2FsbHMgKi8KKwkgICAgICAgIGlmIChzdHJjbXAoY2hhbi0+YWRkciwgIiIpID09IDApCisJICAgICAgICAgICAgICAgIGJyZWFrOworCX0KKworCWlmIChkZXYgPT0gTlVMTCl7CisKKwkJLyogSWYgdGhlIGNhbGwgaXMgbm90IGZvciBhbnkgV0FOUElQRSBpbnRlcmZhY2VzCisgICAgICAgICAgICAgICAgICogY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGFuIEFQSSBsaXN0ZW5pbmcgcXVldWUKKyAgICAgICAgICAgICAgICAgKiB3YWl0aW5nIGZvciBkYXRhLiBJZiB0aGVyZSBpcyBzZW5kIHRoZSBwYWNrZXQKKyAgICAgICAgICAgICAgICAgKiB1cCB0aGUgc3RhY2suCisgICAgICAgICAgICAgICAgICovCisJCWlmIChjYXJkLT5zayAhPSBOVUxMICYmIGNhcmQtPmZ1bmMgIT0gTlVMTCl7CisJCQlpZiAoYXBpX2luY29taW5nX2NhbGwoY2FyZCxtYixuZXdfbGNuKSl7CisJCQkJeDI1X2NsZWFyX2NhbGwoY2FyZCwgbmV3X2xjbiwgMCwgMCk7CisJCQl9CisJCQlhY2NlcHQgPSAwOworCQl9ZWxzZXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBjaGFubmVscyBhdmFpbGFibGUhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCisJCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAwKTsKKwkJfQorCisJfWVsc2UgaWYgKGluZm8tPm51c2VyID09IDApeworCisJCXByaW50ayhLRVJOX0lORk8KKwkJCSIlczogbm8gdXNlciBkYXRhIGluIGluY29taW5nIGNhbGwgb24gTENOICVkIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIG5ld19sY24pCisJCTsKKwkJeDI1X2NsZWFyX2NhbGwoY2FyZCwgbmV3X2xjbiwgMCwgMCk7CisKKwl9ZWxzZSBzd2l0Y2ggKGluZm8tPnVzZXJbMF0peworCisJCWNhc2UgMDoJCS8qIG11bHRpcGxleGVkICovCisJCQljaGFuLT5wcm90b2NvbCA9IGh0b25zKDApOworCQkJYWNjZXB0ID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgTkxQSURfSVA6CS8qIElQIGRhdGFncmFtcyAqLworCQkJYWNjZXB0ID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgTkxQSURfU05BUDogLyogSVBYIGRhdGFncmFtcyAqLworCQkJYWNjZXB0ID0gMTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiB1bnN1cHBvcnRlZCBOTFBJRCAweCUwMlggaW4gaW5jb21pbmcgY2FsbCAiCisJCQkJIm9uIExDTiAlZCFcbiIsIGNhcmQtPmRldm5hbWUsIGluZm8tPnVzZXJbMF0sIG5ld19sY24pOworCQkJeDI1X2NsZWFyX2NhbGwoY2FyZCwgbmV3X2xjbiwgMCwgMjQ5KTsKKwl9CisJCisJaWYgKGFjY2VwdCAmJiAoeDI1X2FjY2VwdF9jYWxsKGNhcmQsIG5ld19sY24sIDApID09IENNRF9PSykpeworCisJCWJpbmRfbGNuX3RvX2RldiAoY2FyZCwgY2hhbi0+ZGV2LCBuZXdfbGNuKTsKKwkJCisJCWlmICh4MjVfZ2V0X2NoYW5fY29uZihjYXJkLCBjaGFuKSA9PSBDTURfT0spCisJCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9DT05ORUNURUQpOworCQllbHNlIAorCQkJeDI1X2NsZWFyX2NhbGwoY2FyZCwgbmV3X2xjbiwgMCwgMCk7CisJfQorCWtmcmVlKGluZm8pOworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJSGFuZGxlIGFjY2VwdGVkIGNhbGwuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBjYWxsX2FjY2VwdGVkIChzZGxhX3QqIGNhcmQsIGludCBjbWQsIGludCBsY24sIFRYMjVNYm94KiBtYikKK3sKKwl1bnNpZ25lZCBuZXdfbGNuID0gbWItPmNtZC5sY247CisJc3RydWN0IG5ldF9kZXZpY2UqIGRldiA9IGZpbmRfY2hhbm5lbChjYXJkLCBuZXdfbGNuKTsKKwl4MjVfY2hhbm5lbF90KiBjaGFuOworCisJaWYgKGRldiA9PSBOVUxMKXsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiBjbGVhcmluZyBvcnBoYW5lZCBjb25uZWN0aW9uIG9uIExDTiAlZCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBuZXdfbGNuKTsKKwkJeDI1X2NsZWFyX2NhbGwoY2FyZCwgbmV3X2xjbiwgMCwgMCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChjYXJkLT51LngubG9nZ2luZykJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBYLjI1IGNhbGwgYWNjZXB0ZWQgb24gRGV2ICVzIGFuZCBMQ04gJWQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lLCBuZXdfbGNuKTsKKworCS8qIEdldCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYW5kIG5vdGlmeSByb3V0ZXIgKi8KKwljaGFuID0gZGV2LT5wcml2OworCWlmICh4MjVfZ2V0X2NoYW5fY29uZihjYXJkLCBjaGFuKSAhPSBDTURfT0spCisJeworCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fQ09OTkVDVEVEKTsKKworCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCXNlbmRfZGVsYXllZF9jbWRfcmVzdWx0KGNhcmQsZGV2LG1iKTsKKwkJYmluZF9sY25fdG9fZGV2IChjYXJkLCBkZXYsIG5ld19sY24pOworCX0KKworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJSGFuZGxlIGNsZWFyZWQgY2FsbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGNhbGxfY2xlYXJlZCAoc2RsYV90KiBjYXJkLCBpbnQgY21kLCBpbnQgbGNuLCBUWDI1TWJveCogbWIpCit7CisJdW5zaWduZWQgbmV3X2xjbiA9IG1iLT5jbWQubGNuOworCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgPSBmaW5kX2NoYW5uZWwoY2FyZCwgbmV3X2xjbik7CisJeDI1X2NoYW5uZWxfdCAqY2hhbjsKKwl1bnNpZ25lZCBjaGFyIG9sZF9zdGF0ZTsKKworCWlmIChjYXJkLT51LngubG9nZ2luZyl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBYLjI1IGNsZWFyIHJlcXVlc3Qgb24gTENOICVkISBDYXVzZToweCUwMlggIgorCQkiRGlhZ246MHglMDJYXG4iLAorCQljYXJkLT5kZXZuYW1lLCBuZXdfbGNuLCBtYi0+Y21kLmNhdXNlLCBtYi0+Y21kLmRpYWduKTsKKwl9CisKKwlpZiAoZGV2ID09IE5VTEwpeyAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFguMjUgY2xlYXIgcmVxdWVzdCA6IE5vIGRldmljZSBmb3IgY2xlYXJcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWNoYW49ZGV2LT5wcml2OworCisJb2xkX3N0YXRlID0gY2hhbi0+Y29tbW9uLnN0YXRlOworCisJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fRElTQ09OTkVDVEVEKTsKKworCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisKKwkJc3dpdGNoIChvbGRfc3RhdGUpeworCQkKKwkJY2FzZSBXQU5fQ09OTkVDVElORzoKKwkJCXNlbmRfZGVsYXllZF9jbWRfcmVzdWx0KGNhcmQsZGV2LG1iKTsKKwkJCWJyZWFrOworCQljYXNlIFdBTl9DT05ORUNURUQ6CisJCQlzZW5kX29vYl9tc2coY2FyZCxkZXYsbWIpOwkJCQkKKwkJCWJyZWFrOworCQl9CisJfQorCQorCXJldHVybiAoKGNtZCA9PSBYMjVfV1JJVEUpICYmIChsY24gPT0gbmV3X2xjbikpID8gMCA6IDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlIYW5kbGUgWC4yNSByZXN0YXJ0IGV2ZW50LgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgcmVzdGFydF9ldmVudCAoc2RsYV90KiBjYXJkLCBpbnQgY21kLCBpbnQgbGNuLCBUWDI1TWJveCogbWIpCit7CisJc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiA9ICZjYXJkLT53YW5kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKwl4MjVfY2hhbm5lbF90ICpjaGFuOworCXVuc2lnbmVkIGNoYXIgb2xkX3N0YXRlOworCisJcHJpbnRrKEtFUk5fSU5GTworCQkiJXM6IFguMjUgcmVzdGFydCByZXF1ZXN0ISBDYXVzZToweCUwMlggRGlhZ246MHglMDJYXG4iLAorCQljYXJkLT5kZXZuYW1lLCBtYi0+Y21kLmNhdXNlLCBtYi0+Y21kLmRpYWduKTsKKworCS8qIGRvd24gYWxsIGxvZ2ljYWwgY2hhbm5lbHMgKi8KKwlmb3IgKGRldiA9IHdhbmRldi0+ZGV2OyBkZXY7IGRldiA9ICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdikpIHsKKwkJY2hhbj1kZXYtPnByaXY7CisJCW9sZF9zdGF0ZSA9IGNoYW4tPmNvbW1vbi5zdGF0ZTsKKworCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworCisJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCQlzd2l0Y2ggKG9sZF9zdGF0ZSl7CisJCQorCQkJY2FzZSBXQU5fQ09OTkVDVElORzoKKwkJCQlzZW5kX2RlbGF5ZWRfY21kX3Jlc3VsdChjYXJkLGRldixtYik7CisJCQkJYnJlYWs7CisJCQljYXNlIFdBTl9DT05ORUNURUQ6CisJCQkJc2VuZF9vb2JfbXNnKGNhcmQsZGV2LG1iKTsJCQkJCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIChjbWQgPT0gWDI1X1dSSVRFKSA/IDAgOiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBIYW5kbGUgdGltZW91dCBldmVudC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHRpbWVvdXRfZXZlbnQgKHNkbGFfdCogY2FyZCwgaW50IGNtZCwgaW50IGxjbiwgVFgyNU1ib3gqIG1iKQoreworCXVuc2lnbmVkIG5ld19sY24gPSBtYi0+Y21kLmxjbjsKKworCWlmIChtYi0+Y21kLnBrdFR5cGUgPT0gMHgwNSkJLyogY2FsbCByZXF1ZXN0IHRpbWUgb3V0ICovCisJeworCQlzdHJ1Y3QgbmV0X2RldmljZSogZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsbmV3X2xjbik7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFguMjUgY2FsbCB0aW1lZCB0aW1lb3V0IG9uIExDTiAlZCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBuZXdfbGNuKTsKKworCQlpZiAoZGV2KXsKKwkJCXgyNV9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisJCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworCisJCQlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCQkJCXNlbmRfZGVsYXllZF9jbWRfcmVzdWx0KGNhcmQsZGV2LGNhcmQtPm1ib3gpOworCQkJfQorCQl9CisJfWVsc2V7IAorCQlwcmludGsoS0VSTl9JTkZPICIlczogWC4yNSBwYWNrZXQgMHglMDJYIHRpbWVvdXQgb24gTENOICVkIVxuIiwKKwkJY2FyZC0+ZGV2bmFtZSwgbWItPmNtZC5wa3RUeXBlLCBuZXdfbGNuKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIAorICoJTWlzY2VsbGFuZW91cyAKKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJRXN0YWJsaXNoIHBoeXNpY2FsIGNvbm5lY3Rpb24uCisgKiAJbyBvcGVuIEhETEMgYW5kIHJhaXNlIERUUgorICoKKyAqIAlSZXR1cm46CQkwCWNvbm5lY3Rpb24gZXN0YWJsaXNoZWQKKyAqCQkJMQljb25uZWN0aW9uIGlzIGluIHByb2dyZXNzCisgKgkJCTwwCWVycm9yCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGNvbm5lY3QgKHNkbGFfdCogY2FyZCkKK3sKKwlUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKworCWlmICh4MjVfb3Blbl9oZGxjKGNhcmQpIHx8IHgyNV9zZXR1cF9oZGxjKGNhcmQpKQorCQlyZXR1cm4gLUVJTzsKKworCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9DT05ORUNUSU5HKTsKKworCXgyNV9zZXRfaW50cl9tb2RlKGNhcmQsIElOVFJfT05fVElNRVIpOyAKKwlzdGF0dXMtPmltYXNrICY9IH5JTlRSX09OX1RJTUVSOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiAJVGVhciBkb3duIHBoeXNpY2FsIGNvbm5lY3Rpb24uCisgKiAJbyBjbG9zZSBIRExDIGxpbmsKKyAqIAlvIGRyb3AgRFRSCisgKgorICogCVJldHVybjoJCTAKKyAqCQkJPDAJZXJyb3IKKyAqLworCitzdGF0aWMgaW50IGRpc2Nvbm5lY3QgKHNkbGFfdCogY2FyZCkKK3sKKwl3YW5waXBlX3NldF9zdGF0ZShjYXJkLCBXQU5fRElTQ09OTkVDVEVEKTsKKwl4MjVfc2V0X2ludHJfbW9kZShjYXJkLCBJTlRSX09OX1RJTUVSKTsJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0IGV4Y2VwdCB0aW1lciAqLworCXgyNV9jbG9zZV9oZGxjKGNhcmQpOwkJCS8qIGNsb3NlIEhETEMgbGluayAqLworCXgyNV9zZXRfZHRyKGNhcmQsIDApOwkJCS8qIGRyb3AgRFRSICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaW5kIG5ldHdvcmsgZGV2aWNlIGJ5IGl0cyBjaGFubmVsIG51bWJlci4KKyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UqIGdldF9kZXZfYnlfbGNuKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsCisJCQkJCSB1bnNpZ25lZCBsY24pCit7CisJc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKworCWZvciAoZGV2ID0gd2FuZGV2LT5kZXY7IGRldjsgZGV2ID0gKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KSkKKwkJaWYgKCgoeDI1X2NoYW5uZWxfdCopZGV2LT5wcml2KS0+Y29tbW9uLmxjbiA9PSBsY24pIAorCQkJYnJlYWs7CisJcmV0dXJuIGRldjsKK30KKworLyoKKyAqIAlJbml0aWF0ZSBjb25uZWN0aW9uIG9uIHRoZSBsb2dpY2FsIGNoYW5uZWwuCisgKiAJbyBmb3IgUFZDIHdlIGp1c3QgZ2V0IGNoYW5uZWwgY29uZmlndXJhdGlvbgorICogCW8gZm9yIFNWQ3MgcGxhY2UgYW4gWC4yNSBjYWxsCisgKgorICogCVJldHVybjoJCTAJY29ubmVjdGVkCisgKgkJCT4wCWNvbm5lY3Rpb24gaW4gcHJvZ3Jlc3MKKyAqCQkJPDAJZmFpbHVyZQorICovCisKK3N0YXRpYyBpbnQgY2hhbl9jb25uZWN0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGFuLT5jYXJkOworCisJaWYgKGNoYW4tPmNvbW1vbi5zdmMgJiYgY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBXQU5QSVBFKXsKKwkJaWYgKCFjaGFuLT5hZGRyWzBdKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBObyBEZXN0aW5hdGlvbiBBZGRyZXNzXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybiAtRUlOVkFMOwkvKiBubyBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBsYWNpbmcgWC4yNSBjYWxsIHRvICVzIC4uLlxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGNoYW4tPmFkZHIpOworCisJCWlmICh4MjVfcGxhY2VfY2FsbChjYXJkLCBjaGFuKSAhPSBDTURfT0spCisJCQlyZXR1cm4gLUVJTzsKKworCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9DT05ORUNUSU5HKTsKKwkJcmV0dXJuIDE7CisJfWVsc2V7CisJCWlmICh4MjVfZ2V0X2NoYW5fY29uZihjYXJkLCBjaGFuKSAhPSBDTURfT0spCisJCQlyZXR1cm4gLUVJTzsKKworCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9DT05ORUNURUQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIAlEaXNjb25uZWN0IGxvZ2ljYWwgY2hhbm5lbC4KKyAqIAlvIGlmIFNWQyB0aGVuIGNsZWFyIFguMjUgY2FsbAorICovCisKK3N0YXRpYyBpbnQgY2hhbl9kaXNjKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKworCWlmIChjaGFuLT5jb21tb24uc3ZjKXsgCisJCXgyNV9jbGVhcl9jYWxsKGNoYW4tPmNhcmQsIGNoYW4tPmNvbW1vbi5sY24sIDAsIDApOworCisJCS8qIEZvciBBUEkgd2UgZGlzY29ubmVjdCBvbiBjbGVhcgorICAgICAgICAgICAgICAgICAqIGNvbmZpcm1hdGlvbi4gCisgICAgICAgICAgICAgICAgICovCisJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSkKKwkJCXJldHVybiAwOworCX0KKworCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAJU2V0IGxvZ2ljYWwgY2hhbm5lbCBzdGF0ZS4KKyAqLworCitzdGF0aWMgdm9pZCBzZXRfY2hhbl9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBpbnQgc3RhdGUpCit7CisJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGFuLT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwljbGkoKTsKKwlpZiAoY2hhbi0+Y29tbW9uLnN0YXRlICE9IHN0YXRlKQorCXsKKwkJc3dpdGNoIChzdGF0ZSkKKwkJeworCQkJY2FzZSBXQU5fQ09OTkVDVEVEOgorCQkJCWlmIChjYXJkLT51LngubG9nZ2luZyl7CisJCQkJCXByaW50ayAoS0VSTl9JTkZPIAorCQkJCQkJIiVzOiBpbnRlcmZhY2UgJXMgY29ubmVjdGVkLCBsY24gJWkgIVxuIiwgCisJCQkJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUsY2hhbi0+Y29tbW9uLmxjbik7CisJCQkJfQorCQkJCSoodW5zaWduZWQgc2hvcnQqKWRldi0+ZGV2X2FkZHIgPSBodG9ucyhjaGFuLT5jb21tb24ubGNuKTsKKwkJCQljaGFuLT5pX3RpbWVvdXRfc29mYXIgPSBqaWZmaWVzOworCisJCQkJLyogTEFQQiBpcyBQVkMgQmFzZWQgKi8KKwkJCQlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYykKKwkJCQkJY2hhbi0+Y29tbW9uLnN2Yz0wOworCQkJCWJyZWFrOworCisJCQljYXNlIFdBTl9DT05ORUNUSU5HOgorCQkJCWlmIChjYXJkLT51LngubG9nZ2luZyl7CisJCQkJCXByaW50ayAoS0VSTl9JTkZPIAorCQkJCQkJIiVzOiBpbnRlcmZhY2UgJXMgY29ubmVjdGluZywgbGNuICVpIC4uLlxuIiwgCisJCQkJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUsIGNoYW4tPmNvbW1vbi5sY24pOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBXQU5fRElTQ09OTkVDVEVEOgorCQkJCWlmIChjYXJkLT51LngubG9nZ2luZyl7CisJCQkJCXByaW50ayAoS0VSTl9JTkZPIAorCQkJCQkJIiVzOiBpbnRlcmZhY2UgJXMgZGlzY29ubmVjdGVkLCBsY24gJWkgIVxuIiwgCisJCQkJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUsY2hhbi0+Y29tbW9uLmxjbik7CisJCQkJfQorCQkJCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5kaXNjb25uZWN0LDApOworCQkJCQorCQkJCWlmIChjaGFuLT5jb21tb24uc3ZjKSB7CisJCQkJCSoodW5zaWduZWQgc2hvcnQqKWRldi0+ZGV2X2FkZHIgPSAwOworCQkJCQljYXJkLT51Lnguc3ZjX3RvX2Rldl9tYXBbKGNoYW4tPmNvbW1vbi5sY24lWDI1X01BWF9DSEFOKV09TlVMTDsKKwkJICAgICAgICAgICAgICAgIAljaGFuLT5jb21tb24ubGNuID0gMDsKKwkJCQl9CisKKwkJCQlpZiAoY2hhbi0+dHJhbnNtaXRfbGVuZ3RoKXsKKwkJCQkJY2hhbi0+dHJhbnNtaXRfbGVuZ3RoPTA7CisJCQkJCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5kcml2ZXJfYnVzeSwwKTsKKwkJCQkJY2hhbi0+dHhfb2Zmc2V0PTA7CisJCQkJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpeworCQkJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCQl9CisJCQkJfQorCQkJCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5jb21tYW5kLDApOworCQkJCWJyZWFrOworCisJCQljYXNlIFdBTl9ESVNDT05ORUNUSU5HOgorCQkJCWlmIChjYXJkLT51LngubG9nZ2luZyl7CisJCQkJCXByaW50ayAoS0VSTl9JTkZPIAorCQkJCQkiXG4lczogaW50ZXJmYWNlICVzIGRpc2Nvbm5lY3RpbmcsIGxjbiAlaSAuLi5cbiIsIAorCQkJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUsY2hhbi0+Y29tbW9uLmxjbik7CisJCQkJfQorCQkJCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5kaXNjb25uZWN0LDApOworCQkJCWJyZWFrOworCQl9CisJCWNoYW4tPmNvbW1vbi5zdGF0ZSA9IHN0YXRlOworCX0KKwljaGFuLT5zdGF0ZV90aWNrID0gamlmZmllczsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoKKyAqIAlTZW5kIHBhY2tldCBvbiBhIGxvZ2ljYWwgY2hhbm5lbC4KKyAqCQlXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB0eF9za2IgZmllbGQgb2YgdGhlIGNoYW5uZWwgZGF0YSAKKyAqCQlzcGFjZSBwb2ludHMgdG8gdGhlIHRyYW5zbWl0IHNvY2tldCBidWZmZXIuICBXaGVuIHRyYW5zbWlzc2lvbiAKKyAqCQlpcyBjb21wbGV0ZSwgcmVsZWFzZSBzb2NrZXQgYnVmZmVyIGFuZCByZXNldCAndGJ1c3knIGZsYWcuCisgKgorICogCVJldHVybjoJCTAJLSB0cmFuc21pc3Npb24gY29tcGxldGUKKyAqCQkJMQktIGJ1c3kKKyAqCisgKiAJTm90ZXM6CisgKiAJMS4gSWYgcGFja2V0IGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gTVRVIGZvciB0aGlzIGNoYW5uZWwsIHdlJ2xsIGZyYWdtZW50CisgKiAgICAJdGhlIHBhY2tldCBpbnRvICdjb21wbGV0ZSBzZXF1ZW5jZScgdXNpbmcgTS1iaXQuCisgKiAJMi4gV2hlbiB0cmFuc21pc3Npb24gaXMgY29tcGxldGUsIGFuIGV2ZW50IG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgaXNzdWVkCisgKiAgICAJdG8gdGhlIHJvdXRlci4KKyAqLworCitzdGF0aWMgaW50IGNoYW5fc2VuZChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB2b2lkKiBidWZmLCB1bnNpZ25lZCBkYXRhX2xlbiwKKwkJICAgICB1bnNpZ25lZCBjaGFyIHR4X2ludHIpCit7CisJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGFuLT5jYXJkOworCVRYMjVTdGF0dXMqIHN0YXR1cyA9IGNhcmQtPmZsYWdzOworCXVuc2lnbmVkIGxlbj0wLCBxZG09MCwgcmVzPTAsIG9yaWdfbGVuID0gMDsKKwl2b2lkICpkYXRhOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIGNoYW5uZWwgaXMgcmVhZHkgKi8KKwlpZiAoKCEoc3RhdHVzLT5jZmxhZ3NbY2hhbi0+Y2hfaWR4XSAmIDB4NDApICYmICFjYXJkLT51LnguTEFQQl9oZGxjKSAgfHwgCisgICAgICAgICAgICAgISgqY2FyZC0+dS54LmhkbGNfYnVmX3N0YXR1cyAmIDB4NDApKXsgCisgICAgICAgICAgICAKKwkJaWYgKCF0eF9pbnRyKXsKKwkJCXNldHVwX2Zvcl9kZWxheWVkX3RyYW5zbWl0IChkZXYsIGJ1ZmYsIGRhdGFfbGVuKTsKKwkJCXJldHVybiAwOworCQl9ZWxzZXsKKwkJCS8qIEJ5IHJldHVybmluZyAwIHRvIHR4X2ludHIgdGhlIHBhY2tldCB3aWxsIGJlIGRyb3BwZWQgKi8KKwkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUiwgVHggaW50ciBjb3VsZCBub3Qgc2VuZCwgZHJvcHBpbmcgJXM6XG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisJCQkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2Jmcl9ub3RfcGFzc2VkX3RvX2FkcHRyOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCQkvKiBSZW1vdmUgdGhlIEFQSSBIZWFkZXIgKi8KKwkJeDI1YXBpX2hkcl90ICphcGlfZGF0YSA9ICh4MjVhcGlfaGRyX3QgKilidWZmOworCisJCS8qIFNldCB0aGUgcWRtIGJpdHMgZnJvbSB0aGUgcGFja2V0IGhlYWRlciAKKyAgICAgICAgICAgICAgICAgKiBVc2VyIGhhcyB0aGUgb3B0aW9uIHRvIHNldCB0aGUgcWRtIGJpdHMKKyAgICAgICAgICAgICAgICAgKi8KKwkJcWRtID0gYXBpX2RhdGEtPnFkbTsKKworCQlvcmlnX2xlbiA9IGxlbiA9IGRhdGFfbGVuIC0gc2l6ZW9mKHgyNWFwaV9oZHJfdCk7CisJCWRhdGEgPSAodW5zaWduZWQgY2hhciopYnVmZiArIHNpemVvZih4MjVhcGlfaGRyX3QpOworCX1lbHNleworCQlkYXRhID0gYnVmZjsKKwkJb3JpZ19sZW4gPSBsZW4gPSBkYXRhX2xlbjsKKwl9CQorCisJaWYgKHR4X2ludHIpeworCQkvKiBXZSBhcmUgaW4gdHhfaW50ciwgbWludXMgdGhlIHR4X29mZnNldCBmcm9tIAorICAgICAgICAgICAgICAgICAqIHRoZSB0b3RhbCBsZW5ndGguIFRoZSB0eF9vZmZzZXQgcGFydCBvZiB0aGUKKwkJICogZGF0YSBoYXMgYWxyZWFkeSBiZWVuIHNlbnQuIEFsc28sIG1vdmUgdGhlIAorCQkgKiBkYXRhIHBvaW50ZXIgdG8gcHJvcGVyIG9mZnNldCBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgKi8KKwkJbGVuIC09IGNoYW4tPnR4X29mZnNldDsKKwkJZGF0YSA9ICh1bnNpZ25lZCBjaGFyKilkYXRhICsgY2hhbi0+dHhfb2Zmc2V0OworCX0KKwkJCisJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIE1UVQorICAgICAgICAgKiBJZiBZRVM6IEN1dCB0aGUgbGVuIHRvIE1UVSBhbmQgc2V0IHRoZSBNIGJpdCAKKyAgICAgICAgICovCisJaWYgKGxlbiA+IGNoYW4tPnR4X3BrdF9zaXplICYmICFjYXJkLT51LnguTEFQQl9oZGxjKXsKKwkJbGVuID0gY2hhbi0+dHhfcGt0X3NpemU7CisJCXFkbSB8PSBNX0JJVDsJCQorCX0gCisKKworCS8qIFBhc3Mgb25seSBmaXJzdCB0aHJlZSBiaXRzIG9mIHRoZSBxZG0gYnl0ZSB0byB0aGUgc2VuZAorICAgICAgICAgKiByb3V0aW5lLiBJbiBjYXNlIHVzZXIgc2V0cyBhbnkgb3RoZXIgYml0IHdoaWNoIG1pZ2h0CisgICAgICAgICAqIGNhdXNlIGVycm9ycy4gCisgICAgICAgICAqLworCisJc3dpdGNoKHgyNV9zZW5kKGNhcmQsIGNoYW4tPmNvbW1vbi5sY24sIChxZG0mMHgwNyksIGxlbiwgZGF0YSkpeworCQljYXNlIDB4MDA6CS8qIHN1Y2Nlc3MgKi8KKwkJCWNoYW4tPmlfdGltZW91dF9zb2ZhciA9IGppZmZpZXM7CisKKwkJCWRldi0+dHJhbnNfc3RhcnQ9amlmZmllczsKKwkJCQorCQkJaWYgKChxZG0gJiBNX0JJVCkgJiYgIWNhcmQtPnUueC5MQVBCX2hkbGMpeworCQkJCWlmICghdHhfaW50cil7CisJCQkJCS8qIFRoZSBNIGJpdCB3YXMgc2V0LCB3aGljaCBtZWFucyB0aGF0IHBhcnQgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFja2V0IGhhcyBiZWVuIHNlbnQuIENvcHkgdGhlIHBhY2tldCBpbnRvIGEgYnVmZmVyCisJCQkJICAgICAgICAgKiBhbmQgc2V0IHRoZSBvZmZzZXQgdG8gbGVuLCBzbyBvbiBuZXh0IHR4X2ludGVyIAorCQkJCQkgKiB0aGUgcGFja2V0IHdpbGwgYmUgc2VudCB1c2luZyB0aGUgYmVsb3cgb2Zmc2V0LgorCQkJCQkgKi8KKwkJCQkJY2hhbi0+dHhfb2Zmc2V0ICs9IGxlbjsKKworCQkJCQkrK2NoYW4tPmlmc3RhdHMudHhfcGFja2V0czsKKwkJCQkJY2hhbi0+aWZzdGF0cy50eF9ieXRlcyArPSBsZW47CisJCQkJCQorCQkJCQlpZiAoY2hhbi0+dHhfb2Zmc2V0IDwgb3JpZ19sZW4peworCQkJCQkJc2V0dXBfZm9yX2RlbGF5ZWRfdHJhbnNtaXQgKGRldiwgYnVmZiwgZGF0YV9sZW4pOworCQkJCQl9CisJCQkJCXJlcz0wOworCQkJCX1lbHNleworCQkJCQkvKiBXZSBhcmUgYWxyZWFkeSBpbiB0eF9pbnRlciwgdGh1cyBkYXRhIGlzIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbiB0aGUgYnVmZmVyLiBVcGRhdGUgdGhlIG9mZnNldCBhbmQgd2FpdCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBuZXh0IHR4X2ludHIuIFdlIGFkZCBvbiB0byB0aGUgb2Zmc2V0LCBzaW5jZSBkYXRhIGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlIFggbnVtYmVyIG9mIHRpbWVzIGxhcmdlciB0aGFuIG1heCBkYXRhIHNpemUuCisJCQkJCSAqLworCQkJCQkrK2NoYW4tPmlmc3RhdHMudHhfcGFja2V0czsKKwkJCQkJY2hhbi0+aWZzdGF0cy50eF9ieXRlcyArPSBsZW47CisJCQkJCQorCQkJCQkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2Jmcl9wYXNzZWRfdG9fYWRwdHI7CisJCQkJCWNoYW4tPnR4X29mZnNldCArPSBsZW47CisKKwkJCQkJLyogVGhlIHVzZXIgY2FuIHNldCB0aGUgcWRtIGJpdCBhcyB3ZWxsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIHRoZSBlbnRpcmUgcGFja2V0IHdhcyBzZW50IGFuZCBxZG0gaXMgc3RpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZXQsIHRoYW4gaXQncyB0aGUgdXNlciB3aG8gaGFzIHNldCB0aGUgTSBiaXQuIEluIHRoYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2FzZSBpbmRpY2F0ZSB0aGF0IHRoZSBwYWNrZXQgd2FzIHNlbmQgYnkgcmV0dXJuaW5nIAorCQkJCQkgKiAwIGFuZCB3YWl0IGZvciBhIG5ldyBwYWNrZXQuIE90aGVyd2lzZSwgd2FpdCBmb3IgbmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHR4IGludGVycnVwdCB0byBzZW5kIHRoZSByZXN0IG9mIHRoZSBwYWNrZXQgKi8KKworCQkJCQlpZiAoY2hhbi0+dHhfb2Zmc2V0IDwgb3JpZ19sZW4peworCQkJCQkJcmVzPTE7CisJCQkJCX1lbHNlewkKKwkJCQkJCXJlcz0wOworCQkJCQl9CisJCQkJfQorCQkJfWVsc2V7CisJCQkJKytjaGFuLT5pZnN0YXRzLnR4X3BhY2tldHM7CisJCQkJY2hhbi0+aWZzdGF0cy50eF9ieXRlcyArPSBsZW47CisJCQkJKytjaGFuLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF9iZnJfcGFzc2VkX3RvX2FkcHRyOworCQkJCXJlcz0wOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAweDMzOgkvKiBUeCBidXN5ICovCisJCQlpZiAodHhfaW50cil7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFR4X2ludHI6IEJpZyBFcnJvciBkcm9wcGluZyBwYWNrZXQgJXNcbiIsCisJCQkJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisJCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCQkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2Jmcl9ub3RfcGFzc2VkX3RvX2FkcHRyOworCQkJCXJlcz0wOworCQkJfWVsc2V7CisJCQkJREJHX1BSSU5USyhLRVJOX0lORk8gCisJCQkJCSIlczogU2VuZDogQmlnIEVycm9yIHNob3VsZCBoYXZlIHR4OiBzdG9ycmluZyAlc1xuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUsZGV2LT5uYW1lKTsKKwkJCQlzZXR1cF9mb3JfZGVsYXllZF90cmFuc21pdCAoZGV2LCBidWZmLCBkYXRhX2xlbik7CQorCQkJCXJlcz0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoJLyogZmFpbHVyZSAqLworCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Vycm9yczsKKwkJCWlmICh0eF9pbnRyKXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogVHhfaW50cjogRmFpbHVyZSB0byBzZW5kLCBkcm9wcGluZyAlc1xuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOworCQkJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJKytjaGFuLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF9iZnJfbm90X3Bhc3NlZF90b19hZHB0cjsKKwkJCQlyZXM9MDsKKwkJCX1lbHNleworCQkJCURCR19QUklOVEsoS0VSTl9JTkZPICIlczogU2VuZDogRmFpbHVyZSB0byBzZW5kICEhISwgc3RvcmluZyAlc1xuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOwkJCQorCQkJCXNldHVwX2Zvcl9kZWxheWVkX3RyYW5zbWl0IChkZXYsIGJ1ZmYsIGRhdGFfbGVuKTsKKwkJCQlyZXM9MTsKKwkJCX0KKwkJCWJyZWFrOwkKKwl9CisJcmV0dXJuIHJlczsKK30KKworCisvKgorICogCVBhcnNlIFguMjUgY2FsbCByZXF1ZXN0IGRhdGEgYW5kIGZpbGwgeDI1X2NhbGxfaW5mb190IHN0cnVjdHVyZS4KKyAqLworCitzdGF0aWMgdm9pZCBwYXJzZV9jYWxsX2luZm8gKHVuc2lnbmVkIGNoYXIqIHN0ciwgeDI1X2NhbGxfaW5mb190KiBpbmZvKQoreworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoeDI1X2NhbGxfaW5mb190KSk7CisJZm9yICg7ICpzdHI7ICsrc3RyKQorCXsKKwkJaW50IGk7CisJCXVuc2lnbmVkIGNoYXIgY2g7CisKKwkJaWYgKCpzdHIgPT0gJy0nKSBzd2l0Y2ggKHN0clsxXSkgeworCisJCQkvKiBUYWtlIG1pbnVzIDIgb2ZmIHRoZSBtYXhpbXVtIHNpemUgc28gdGhhdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGxhc3QgYnl0ZSBpcyAwLiBUaGlzIHdheSB3ZSBjYW4gdXNlIHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICogbWFuaXB1bGF0b24gZnVuY3Rpb25zIG9uIGNhbGwgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCQkJY2FzZSAnZCc6CS8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgKE1BWF9YMjVfQUREUl9TSVpFLTIpOyArK2kpeworCQkJCQljaCA9IHN0clsyK2ldOworCQkJCQlpZiAoaXNzcGFjZShjaCkpIGJyZWFrOworCQkJCQlpbmZvLT5kZXN0W2ldID0gY2g7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlICdzJzoJLyogc291cmNlIGFkZHJlc3MgKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgKE1BWF9YMjVfQUREUl9TSVpFLTIpOyArK2kpeworCQkJCQljaCA9IHN0clsyK2ldOworCQkJCQlpZiAoaXNzcGFjZShjaCkpIGJyZWFrOworCQkJCQlpbmZvLT5zcmNbaV0gPSBjaDsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJ3UnOgkvKiB1c2VyIGRhdGEgKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgKE1BWF9YMjVfREFUQV9TSVpFLTIpOyArK2kpeworCQkJCQljaCA9IHN0clsyK2ldOworCQkJCQlpZiAoaXNzcGFjZShjaCkpIGJyZWFrOworCQkJCQlpbmZvLT51c2VyW2ldID0gY2g7IAorCQkJCX0KKwkJCQlpbmZvLT5udXNlciA9IGk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJ2YnOgkvKiBmYWNpbGl0aWVzICovCisJCQkJZm9yIChpID0gMDsgaSA8IChNQVhfWDI1X0ZBQ0xfU0laRS0yKTsgKytpKXsKKwkJCQkJY2ggPSBzdHJbMitpXTsKKwkJCQkJaWYgKGlzc3BhY2UoY2gpKSBicmVhazsKKwkJCQkJaW5mby0+ZmFjaWxbaV0gPSBjaDsKKwkJCQl9CisJCQkJaW5mby0+bmZhY2lsID0gaTsKKwkJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoKKyAqIAlDb252ZXJ0IGxpbmUgc3BlZWQgaW4gYnBzIHRvIGEgbnVtYmVyIHVzZWQgYnkgUzUwMiBjb2RlLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJwc190b19zcGVlZF9jb2RlICh1bnNpZ25lZCBsb25nIGJwcykKK3sKKwl1bnNpZ25lZCBjaGFyCW51bWJlcjsKKworCWlmIChicHMgPD0gMTIwMCkgICAgICAgIG51bWJlciA9IDB4MDE7CisJZWxzZSBpZiAoYnBzIDw9IDI0MDApICAgbnVtYmVyID0gMHgwMjsKKwllbHNlIGlmIChicHMgPD0gNDgwMCkgICBudW1iZXIgPSAweDAzOworCWVsc2UgaWYgKGJwcyA8PSA5NjAwKSAgIG51bWJlciA9IDB4MDQ7CisJZWxzZSBpZiAoYnBzIDw9IDE5MjAwKSAgbnVtYmVyID0gMHgwNTsKKwllbHNlIGlmIChicHMgPD0gMzg0MDApICBudW1iZXIgPSAweDA2OworCWVsc2UgaWYgKGJwcyA8PSA0NTAwMCkgIG51bWJlciA9IDB4MDc7CisJZWxzZSBpZiAoYnBzIDw9IDU2MDAwKSAgbnVtYmVyID0gMHgwODsKKwllbHNlIGlmIChicHMgPD0gNjQwMDApICBudW1iZXIgPSAweDA5OworCWVsc2UgaWYgKGJwcyA8PSA3NDAwMCkgIG51bWJlciA9IDB4MEE7CisJZWxzZSBpZiAoYnBzIDw9IDExMjAwMCkgbnVtYmVyID0gMHgwQjsKKwllbHNlIGlmIChicHMgPD0gMTI4MDAwKSBudW1iZXIgPSAweDBDOworCWVsc2UgbnVtYmVyID0gMHgwRDsKKworCXJldHVybiBudW1iZXI7Cit9CisKKy8qCisgKiAJQ29udmVydCBkZWNpbWFsIHN0cmluZyB0byB1bnNpZ25lZCBpbnRlZ2VyLgorICogCUlmIGxlbiAhPSAwIHRoZW4gb25seSAnbGVuJyBjaGFyYWN0ZXJzIG9mIHRoZSBzdHJpbmcgYXJlIGNvbnZlcnRlZC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGRlY190b191aW50ICh1bnNpZ25lZCBjaGFyKiBzdHIsIGludCBsZW4pCit7CisJdW5zaWduZWQgdmFsOworCisJaWYgKCFsZW4pIAorCQlsZW4gPSBzdHJsZW4oc3RyKTsKKworCWZvciAodmFsID0gMDsgbGVuICYmIGlzX2RpZ2l0KCpzdHIpOyArK3N0ciwgLS1sZW4pCisJCXZhbCA9ICh2YWwgKiAxMCkgKyAoKnN0ciAtICh1bnNpZ25lZCknMCcpOworCQorCXJldHVybiB2YWw7Cit9CisKKy8qCisgKiAJQ29udmVydCBoZXggc3RyaW5nIHRvIHVuc2lnbmVkIGludGVnZXIuCisgKiAJSWYgbGVuICE9IDAgdGhlbiBvbmx5ICdsZW4nIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZyBhcmUgY29uZmVydGVkLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGV4X3RvX3VpbnQgKHVuc2lnbmVkIGNoYXIqIHN0ciwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCB2YWwsIGNoOworCisJaWYgKCFsZW4pIAorCQlsZW4gPSBzdHJsZW4oc3RyKTsKKworCWZvciAodmFsID0gMDsgbGVuOyArK3N0ciwgLS1sZW4pCisJeworCQljaCA9ICpzdHI7CisJCWlmIChpc19kaWdpdChjaCkpCisJCQl2YWwgPSAodmFsIDw8IDQpICsgKGNoIC0gKHVuc2lnbmVkKScwJyk7CisJCWVsc2UgaWYgKGlzX2hleF9kaWdpdChjaCkpCisJCQl2YWwgPSAodmFsIDw8IDQpICsgKChjaCAmIDB4REYpIC0gKHVuc2lnbmVkKSdBJyArIDEwKTsKKwkJZWxzZSBicmVhazsKKwl9CisJcmV0dXJuIHZhbDsKK30KKworCitzdGF0aWMgaW50IGhhbmRsZV9JUFhXQU4odW5zaWduZWQgY2hhciAqc2VuZHBhY2tldCwgY2hhciAqZGV2bmFtZSwgdW5zaWduZWQgY2hhciBlbmFibGVfSVBYLCB1bnNpZ25lZCBsb25nIG5ldHdvcmtfbnVtYmVyLCB1bnNpZ25lZCBzaG9ydCBwcm90bykKK3sKKwlpbnQgaTsKKworCWlmKCBwcm90byA9PSBFVEhfUF9JUFgpIHsKKwkJLyogSXQncyBhbiBJUFggcGFja2V0ICovCisJCWlmKCFlbmFibGVfSVBYKSB7CisJCQkvKiBSZXR1cm4gMSBzbyB3ZSBkb24ndCBwYXNzIGl0IHVwIHRoZSBzdGFjay4gKi8KKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIHsKKwkJLyogSXQncyBub3QgSVBYIHNvIHBhc3MgaXQgdXAgdGhlIHN0YWNrLiovIAorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiggc2VuZHBhY2tldFsxNl0gPT0gMHg5MCAmJgorCSAgICBzZW5kcGFja2V0WzE3XSA9PSAweDA0KQorCXsKKwkJLyogSXQncyBJUFhXQU4gICovCisKKwkJaWYoIHNlbmRwYWNrZXRbMl0gPT0gMHgwMiAmJgorCQkgICAgc2VuZHBhY2tldFszNF0gPT0gMHgwMCkKKwkJeworCQkJLyogSXQncyBhIHRpbWVyIHJlcXVlc3QgcGFja2V0ICovCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjZWl2ZWQgSVBYV0FOIFRpbWVyIFJlcXVlc3QgcGFja2V0XG4iLGRldm5hbWUpOworCisJCQkvKiBHbyB0aHJvdWdoIHRoZSByb3V0aW5nIG9wdGlvbnMgYW5kIGFuc3dlciBubyB0byBldmVyeQorCQkJICogb3B0aW9uIGV4Y2VwdCBVbm51bWJlcmVkIFJJUC9TQVAKKwkJCSAqLworCQkJZm9yKGkgPSA0MTsgc2VuZHBhY2tldFtpXSA9PSAweDAwOyBpICs9IDUpCisJCQl7CisJCQkJLyogMHgwMiBpcyB0aGUgb3B0aW9uIGZvciBVbm51bWJlcmVkIFJJUC9TQVAgKi8KKwkJCQlpZiggc2VuZHBhY2tldFtpICsgNF0gIT0gMHgwMikKKwkJCQl7CisJCQkJCXNlbmRwYWNrZXRbaSArIDFdID0gMDsKKwkJCQl9CisJCQl9CisKKwkJCS8qIFNraXAgb3ZlciB0aGUgZXh0ZW5kZWQgTm9kZSBJRCBvcHRpb24gKi8KKwkJCWlmKCBzZW5kcGFja2V0W2ldID09IDB4MDQgKQorCQkJeworCQkJCWkgKz0gODsKKwkJCX0KKworCQkJLyogV2UgYWxzbyB3YW50IHRvIHR1cm4gb2ZmIGFsbCBoZWFkZXIgY29tcHJlc3Npb24gb3B0LiAJCQkgKi8gCisJCQlmb3IoOyBzZW5kcGFja2V0W2ldID09IDB4ODAgOykKKwkJCXsKKwkJCQlzZW5kcGFja2V0W2kgKyAxXSA9IDA7CisJCQkJaSArPSAoc2VuZHBhY2tldFtpICsgMl0gPDwgOCkgKyAoc2VuZHBhY2tldFtpICsgM10pICsgNDsKKwkJCX0KKworCQkJLyogU2V0IHRoZSBwYWNrZXQgdHlwZSB0byB0aW1lciByZXNwb25zZSAqLworCQkJc2VuZHBhY2tldFszNF0gPSAweDAxOworCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU2VuZGluZyBJUFhXQU4gVGltZXIgUmVzcG9uc2VcbiIsZGV2bmFtZSk7CisJCX0KKwkJZWxzZSBpZiggc2VuZHBhY2tldFszNF0gPT0gMHgwMiApCisJCXsKKwkJCS8qIFRoaXMgaXMgYW4gaW5mb3JtYXRpb24gcmVxdWVzdCBwYWNrZXQgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlZCBJUFhXQU4gSW5mb3JtYXRpb24gUmVxdWVzdCBwYWNrZXRcbiIsZGV2bmFtZSk7CisKKwkJCS8qIFNldCB0aGUgcGFja2V0IHR5cGUgdG8gaW5mb3JtYXRpb24gcmVzcG9uc2UgKi8KKwkJCXNlbmRwYWNrZXRbMzRdID0gMHgwMzsKKworCQkJLyogU2V0IHRoZSByb3V0ZXIgbmFtZSAqLworCQkJc2VuZHBhY2tldFs1MV0gPSAnWCc7CisJCQlzZW5kcGFja2V0WzUyXSA9ICdUJzsKKwkJCXNlbmRwYWNrZXRbNTNdID0gJ1AnOworCQkJc2VuZHBhY2tldFs1NF0gPSAnSSc7CisJCQlzZW5kcGFja2V0WzU1XSA9ICdQJzsKKwkJCXNlbmRwYWNrZXRbNTZdID0gJ0UnOworCQkJc2VuZHBhY2tldFs1N10gPSAnLSc7CisJCQlzZW5kcGFja2V0WzU4XSA9IENWSGV4VG9Bc2NpaShuZXR3b3JrX251bWJlciA+PiAyOCk7CisJCQlzZW5kcGFja2V0WzU5XSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDBGMDAwMDAwKT4+IDI0KTsKKwkJCXNlbmRwYWNrZXRbNjBdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDBGMDAwMDApPj4gMjApOworCQkJc2VuZHBhY2tldFs2MV0gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMDBGMDAwMCk+PiAxNik7CisJCQlzZW5kcGFja2V0WzYyXSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDAwMDBGMDAwKT4+IDEyKTsKKwkJCXNlbmRwYWNrZXRbNjNdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMDBGMDApPj4gOCk7CisJCQlzZW5kcGFja2V0WzY0XSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDAwMDAwMEYwKT4+IDQpOworCQkJc2VuZHBhY2tldFs2NV0gPSBDVkhleFRvQXNjaWkobmV0d29ya19udW1iZXIgJiAweDAwMDAwMDBGKTsKKwkJCWZvcihpID0gNjY7IGkgPCA5OTsgaSs9IDEpCisJCQl7CisJCQkJc2VuZHBhY2tldFtpXSA9IDA7CisJCQl9CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZW5kaW5nIElQWFdBTiBJbmZvcm1hdGlvbiBSZXNwb25zZSBwYWNrZXRcbiIsZGV2bmFtZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5rbm93biBJUFhXQU4gcGFja2V0IVxuIixkZXZuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogU2V0IHRoZSBXTm9kZUlEIHRvIG91ciBuZXR3b3JrIGFkZHJlc3MgKi8KKwkJc2VuZHBhY2tldFszNV0gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgPj4gMjQpOworCQlzZW5kcGFja2V0WzM2XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAweDAwRkYwMDAwKSA+PiAxNik7CisJCXNlbmRwYWNrZXRbMzddID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMEZGMDApID4+IDgpOworCQlzZW5kcGFja2V0WzM4XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwRkYpOworCisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCS8qSWYgd2UgZ2V0IGhlcmUgaXQncyBhbiBJUFgtZGF0YSBwYWNrZXQsIHNvIGl0J2xsIGdldCBwYXNzZWQgdXAgdGhlIHN0YWNrLgorCQkgKi8KKwkJLyogc3dpdGNoIHRoZSBuZXR3b3JrIG51bWJlcnMgKi8KKwkJc3dpdGNoX25ldF9udW1iZXJzKHNlbmRwYWNrZXQsIG5ldHdvcmtfbnVtYmVyLCAxKTsJCisJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqICAJSWYgaW5jb21pbmcgaXMgMCAob3V0Z29pbmcpLSBpZiB0aGUgbmV0IG51bWJlcnMgaXMgb3VycyBtYWtlIGl0IDAKKyAqICAJaWYgaW5jb21pbmcgaXMgMSAtIGlmIHRoZSBuZXQgbnVtYmVyIGlzIDAgbWFrZSBpdCBvdXJzIAorICovCisKK3N0YXRpYyB2b2lkIHN3aXRjaF9uZXRfbnVtYmVycyh1bnNpZ25lZCBjaGFyICpzZW5kcGFja2V0LCB1bnNpZ25lZCBsb25nIG5ldHdvcmtfbnVtYmVyLCB1bnNpZ25lZCBjaGFyIGluY29taW5nKQoreworCXVuc2lnbmVkIGxvbmcgcG5ldHdvcmtfbnVtYmVyOworCisJcG5ldHdvcmtfbnVtYmVyID0gKHVuc2lnbmVkIGxvbmcpKChzZW5kcGFja2V0WzZdIDw8IDI0KSArIAorCQkJICAoc2VuZHBhY2tldFs3XSA8PCAxNikgKyAoc2VuZHBhY2tldFs4XSA8PCA4KSArIAorCQkJICBzZW5kcGFja2V0WzldKTsKKwkKKworCWlmICghaW5jb21pbmcpIHsKKwkJLypJZiB0aGUgZGVzdGluYXRpb24gbmV0d29yayBudW1iZXIgaXMgb3VycywgbWFrZSBpdCAwICovCisJCWlmKCBwbmV0d29ya19udW1iZXIgPT0gbmV0d29ya19udW1iZXIpIHsKKwkJCXNlbmRwYWNrZXRbNl0gPSBzZW5kcGFja2V0WzddID0gc2VuZHBhY2tldFs4XSA9IAorCQkJCQkgc2VuZHBhY2tldFs5XSA9IDB4MDA7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJZiB0aGUgaW5jb21pbmcgbmV0d29yayBpcyAwLCBtYWtlIGl0IG91cnMgKi8KKwkJaWYoIHBuZXR3b3JrX251bWJlciA9PSAwKSB7CisJCQlzZW5kcGFja2V0WzZdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyID4+IDI0KTsKKwkJCXNlbmRwYWNrZXRbN10gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwRkYwMDAwKSA+PiAxNik7CisJCQlzZW5kcGFja2V0WzhdID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMDAwRkYwMCkgPj4gOCk7CisJCQlzZW5kcGFja2V0WzldID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDAwMEZGKTsKKwkJfQorCX0KKworCisJcG5ldHdvcmtfbnVtYmVyID0gKHVuc2lnbmVkIGxvbmcpKChzZW5kcGFja2V0WzE4XSA8PCAyNCkgKyAKKwkJCSAgKHNlbmRwYWNrZXRbMTldIDw8IDE2KSArIChzZW5kcGFja2V0WzIwXSA8PCA4KSArIAorCQkJICBzZW5kcGFja2V0WzIxXSk7CisJCisJCisJaWYoICFpbmNvbWluZyApIHsKKwkJLyogSWYgdGhlIHNvdXJjZSBuZXR3b3JrIGlzIG91cnMsIG1ha2UgaXQgMCAqLworCQlpZiggcG5ldHdvcmtfbnVtYmVyID09IG5ldHdvcmtfbnVtYmVyKSB7CisJCQlzZW5kcGFja2V0WzE4XSA9IHNlbmRwYWNrZXRbMTldID0gc2VuZHBhY2tldFsyMF0gPSAKKwkJCQkgc2VuZHBhY2tldFsyMV0gPSAweDAwOworCQl9CisJfSBlbHNlIHsKKwkJLyogSWYgdGhlIHNvdXJjZSBuZXR3b3JrIGlzIDAsIG1ha2UgaXQgb3VycyAqLworCQlpZiggcG5ldHdvcmtfbnVtYmVyID09IDAgKSB7CisJCQlzZW5kcGFja2V0WzE4XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciA+PiAyNCk7CisJCQlzZW5kcGFja2V0WzE5XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDBGRjAwMDApID4+IDE2KTsKKwkJCXNlbmRwYWNrZXRbMjBdID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMDAwRkYwMCkgPj4gOCk7CisJCQlzZW5kcGFja2V0WzIxXSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMDAwMDBGRik7CisJCX0KKwl9Cit9IC8qIHN3aXRjaF9uZXRfbnVtYmVycyAqLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqIFgyNUFQSSBTUEVDSUZJQyBGVU5DVElPTlMgKioqKioqKioqKioqKioqKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogIGZpbmRfY2hhbm5lbAorICoKKyAqCU1hbmFnZXMgdGhlIGxjbiB0byBkZXZpY2UgbWFwLiBJdCBpbmNyZWFzZXMgcGVyZm9ybWFuY2UKKyAqICAgICAgYmVjYXVzZSBpdCBlbGltaW5hdGVzIHRoZSBuZWVkIHRvIHNlYXJjaCB0aHJvdWdoIHRoZSBsaW5rICAKKyAqICAgICAgbGlzdCBmb3IgYSBkZXZpY2Ugd2hpY2ggaXMgYm91bmRlZCB0byBhIHNwZWNpZmljIGxjbi4KKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworc3RydWN0IG5ldF9kZXZpY2UgKmZpbmRfY2hhbm5lbChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxjbikKK3sKKwlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYyl7CisKKwkJcmV0dXJuIGNhcmQtPndhbmRldi5kZXY7CisKKwl9ZWxzZXsKKwkJLyogV2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSBpbmNvbWluZyBsY24KKyAgICAgICAgICAgICAgICAgKiBpcyBhIFBWQyBvciBhbiBTVkMgY2hhbm5lbC4gQnV0IHdlIGRvIGtub3cgdGhhdAorICAgICAgICAgICAgICAgICAqIHRoZSBsY24gY2Fubm90IGJlIGZvciBib3RoIHRoZSBQVkMgYW5kIHRoZSBTVkMKKyAgICAgICAgICAgICAgICAgKiBjaGFubmVsLgorCisJCSAqIElmIHRoZSBsY24gbnVtYmVyIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMjU1LCAKKyAgICAgICAgICAgICAgICAgKiB0YWtlIHRoZSBtb2R1bG8gMjU1IG9mIHRoYXQgbnVtYmVyLiBXZSBvbmx5IGhhdmUKKyAgICAgICAgICAgICAgICAgKiAyNTUgbG9jYXRpb25zLCB0aHVzIGhpZ2hlciBudW1iZXJzIG11c3QgYmUgbWFwcGVkCisgICAgICAgICAgICAgICAgICogdG8gYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyNDUuIAorCisJCSAqIFdlIG11c3Qgc2VwYXJhdGUgcHZjJ3MgYW5kIHN2YydzIHNpbmNlIHR3byBkb24ndAorICAgICAgICAgICAgICAgICAqIGhhdmUgdG8gYmUgY29udGlndW91cy4gIE1lYW5pbmcgcHZjJ3MgY2FuIHN0YXJ0CisgICAgICAgICAgICAgICAgICogZnJvbSAxIHRvIDEwIGFuZCBzdmMncyBjYW4gc3RhcnQgZnJvbSAyNTYgdG8gMjY2LgorICAgICAgICAgICAgICAgICAqIEJ1dCAyNTYlMjU1IGlzIDEsIGkuZS4gQ09ORkxJQ1QuCisJCSAqLworCisKKwkJLyogSGlnaGVzdCBMQ04gbnVtYmVyIG11c3QgYmUgbGVzcyBvciBlcXVhbCB0byA0MDk2ICovCisJCWlmICgobGNuIDw9IE1BWF9MQ05fTlVNKSAmJiAobGNuID4gMCkpeworCisJCQlpZiAobGNuIDwgWDI1X01BWF9DSEFOKXsKKwkJCQlpZiAoY2FyZC0+dS54LnN2Y190b19kZXZfbWFwW2xjbl0pCisJCQkJCXJldHVybiBjYXJkLT51Lnguc3ZjX3RvX2Rldl9tYXBbbGNuXTsKKworCQkJCWlmIChjYXJkLT51LngucHZjX3RvX2Rldl9tYXBbbGNuXSkKKwkJCQkJcmV0dXJuIGNhcmQtPnUueC5wdmNfdG9fZGV2X21hcFtsY25dOworCQkJCisJCQl9ZWxzZXsKKwkJCQlpbnQgbmV3X2xjbiA9IGxjbiVYMjVfTUFYX0NIQU47CisJCQkJaWYgKGNhcmQtPnUueC5zdmNfdG9fZGV2X21hcFtuZXdfbGNuXSkKKwkJCQkJcmV0dXJuIGNhcmQtPnUueC5zdmNfdG9fZGV2X21hcFtuZXdfbGNuXTsKKworCQkJCWlmIChjYXJkLT51LngucHZjX3RvX2Rldl9tYXBbbmV3X2xjbl0pCisJCQkJCXJldHVybiBjYXJkLT51LngucHZjX3RvX2Rldl9tYXBbbmV3X2xjbl07CisJCQl9CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCit2b2lkIGJpbmRfbGNuX3RvX2RldihzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxjbikKK3sKKwl4MjVfY2hhbm5lbF90ICpjaGFuID0gZGV2LT5wcml2OworCisJLyogTW9kdWxvIHRoZSBsY24gbnVtYmVyIGJ5IFgyNV9NQVhfQ0hBTiAoMjU1KQorCSAqIGJlY2F1c2UgdGhlIGxjbiBudW1iZXIgY2FuIGJlIGdyZWF0ZXIgdGhhbiAyNTUgCisgICAgICAgICAqCisJICogV2UgbmVlZCB0byBzcGxpdCBzdmMgYW5kIHB2YyBzaW5jZSB0aGV5IGRvbid0IGhhdmUKKyAgICAgICAgICogdG8gYmUgY29udGlnb3VzLiAKKwkgKi8KKworCWlmIChjaGFuLT5jb21tb24uc3ZjKXsKKwkJY2FyZC0+dS54LnN2Y190b19kZXZfbWFwWyhsY24gJSBYMjVfTUFYX0NIQU4pXSA9IGRldjsKKwl9ZWxzZXsKKwkJY2FyZC0+dS54LnB2Y190b19kZXZfbWFwWyhsY24gJSBYMjVfTUFYX0NIQU4pXSA9IGRldjsKKwl9CisJY2hhbi0+Y29tbW9uLmxjbiA9IGxjbjsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB4MjVhcGlfYmggCisgKgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCB4MjVhcGlfYmgoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmIChhdG9taWNfcmVhZCgmY2hhbi0+YmhfYnVmZl91c2VkKSA9PSAwKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJIIEJ1ZmZlciBFbXB0eSBpbiBCSFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJY2xlYXJfYml0KDAsICZjaGFuLT50cV93b3JraW5nKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChhdG9taWNfcmVhZCgmY2hhbi0+YmhfYnVmZl91c2VkKSl7CisKKwkJLyogSWYgdGhlIHNvY2sgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgdW5saW5raW5nIHRoZQorCQkgKiBkcml2ZXIgZnJvbSB0aGUgc29ja2V0LCB3ZSBtdXN0IGdldCBvdXQuIAorCQkgKiBUaGlzIG5ldmVyIGhhcHBlbmRzIGJ1dCBpcyBhIHNhbml0eSBjaGVjay4gKi8KKwkJaWYgKHRlc3RfYml0KDAsJmNoYW4tPmNvbW1vbi5jb21tb25fY3JpdGljYWwpKXsKKwkJCWNsZWFyX2JpdCgwLCAmY2hhbi0+dHFfd29ya2luZyk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCS8qIElmIExBUEIgSERMQywgZG8gbm90IGRyb3AgcGFja2V0cyBpZiBzb2NrZXQgaXMKKyAgICAgICAgICAgICAgICAgKiBub3QgY29ubmVjdGVkLiAgTGV0IHRoZSBidWZmZXIgZmlsbCB1cCBhbmQKKyAgICAgICAgICAgICAgICAgKiB0dXJuIG9mZiByeCBpbnRlcnJ1cHQgKi8KKwkJaWYgKGNhcmQtPnUueC5MQVBCX2hkbGMpeworCQkJaWYgKGNoYW4tPmNvbW1vbi5zayA9PSBOVUxMIHx8IGNoYW4tPmNvbW1vbi5mdW5jID09IE5VTEwpeworCQkJCWNsZWFyX2JpdCgwLCAmY2hhbi0+dHFfd29ya2luZyk7CQkJCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJc2tiICA9ICgoYmhfZGF0YV90ICopJmNoYW4tPmJoX2hlYWRbY2hhbi0+YmhfcmVhZF0pLT5za2I7CisKKwkJaWYgKHNrYiA9PSBOVUxMKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCSCBTa2IgZW1wdHkgZm9yIHJlYWQgJWlcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsY2hhbi0+YmhfcmVhZCk7CisJCX1lbHNleworCQkJCisJCQlpZiAoY2hhbi0+Y29tbW9uLnNrID09IE5VTEwgfHwgY2hhbi0+Y29tbW9uLmZ1bmMgPT0gTlVMTCl7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJIOiBTb2NrZXQgZGlzY29ubmVjdGVkLCBkcm9wcGluZ1xuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQkJeDI1YXBpX2JoX2NsZWFudXAoZGV2KTsKKwkJCQkrK2NoYW4tPmlmc3RhdHMucnhfZHJvcHBlZDsKKwkJCQkrK2NoYW4tPnJ4X2ludHJfc3RhdC5yeF9pbnRyX2Jmcl9ub3RfcGFzc2VkX3RvX3N0YWNrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisKKwkJCWlmIChjaGFuLT5jb21tb24uZnVuYyhza2IsZGV2LGNoYW4tPmNvbW1vbi5zaykgIT0gMCl7CisJCQkJLyogU29jayBmdWxsIGNhbm5vdCBzZW5kLCBxdWV1ZSB1cyBmb3IgYW5vdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0cnkgCisJCQkJICovCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJIOiAhISEgUGFja2V0IGZhaWxlZCB0byBzZW5kICEhISEhIFxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5yZWNlaXZlX2Jsb2NrLDEpOworCQkJCXJldHVybjsKKwkJCX1lbHNleworCQkJCXgyNWFwaV9iaF9jbGVhbnVwKGRldik7CisJCQkJKytjaGFuLT5yeF9pbnRyX3N0YXQucnhfaW50cl9iZnJfcGFzc2VkX3RvX3N0YWNrOworCQkJfQorCQl9CisJfQkKKwljbGVhcl9iaXQoMCwgJmNoYW4tPnRxX3dvcmtpbmcpOworCisJcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogeDI1YXBpX2JoX2NsZWFudXAgCisgKgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNWFwaV9iaF9jbGVhbnVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBjaGFuLT5jYXJkOworCVRYMjVTdGF0dXMqIHN0YXR1cyA9IGNhcmQtPmZsYWdzOworCisKKwkoKGJoX2RhdGFfdCAqKSZjaGFuLT5iaF9oZWFkW2NoYW4tPmJoX3JlYWRdKS0+c2tiID0gTlVMTDsKKworCWlmIChjaGFuLT5iaF9yZWFkID09IE1BWF9CSF9CVUZGKXsKKwkJY2hhbi0+YmhfcmVhZD0wOworCX1lbHNleworCQkrK2NoYW4tPmJoX3JlYWQ7CQorCX0KKworCS8qIElmIHRoZSBSZWNlaXZlIGludGVycnVwdCB3YXMgb2ZmLCBpdCBtZWFucworICAgICAgICAgKiB0aGF0IHdlIGZpbGxlZCB1cCBvdXIgY2lyY3VsYXIgYnVmZmVyLiBDaGVjayAgICAKKyAgICAgICAgICogdGhhdCB3ZSBoYXZlIHNwYWNlIGluIHRoZSBidWZmZXIuIElmIHNvIAorICAgICAgICAgKiB0dXJuIHRoZSBSWCBpbnRlcnJ1cHQgYmFjayBvbi4gCisJICovCisJaWYgKCEoc3RhdHVzLT5pbWFzayAmIElOVFJfT05fUlhfRlJBTUUpKXsKKwkJaWYgKGF0b21pY19yZWFkKCZjaGFuLT5iaF9idWZmX3VzZWQpIDwgKE1BWF9CSF9CVUZGKzEpKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCSDogVHVybmluZyBvbiB0aGUgaW50ZXJydXB0XG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXN0YXR1cy0+aW1hc2sgfD0gSU5UUl9PTl9SWF9GUkFNRTsKKwkJfQorCX0JCisKKwlhdG9taWNfZGVjKCZjaGFuLT5iaF9idWZmX3VzZWQpOworCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBiaF9lbnF1ZXVlIAorICoKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBiaF9lbnF1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBjaGFuLT5jYXJkOworCVRYMjVTdGF0dXMqIHN0YXR1cyA9IGNhcmQtPmZsYWdzOworCisJaWYgKGF0b21pY19yZWFkKCZjaGFuLT5iaF9idWZmX3VzZWQpID09IChNQVhfQkhfQlVGRisxKSl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCb3R0b20gaGFsZiBidWZmZXIgRlVMTFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIDE7IAorCX0KKworCSgoYmhfZGF0YV90ICopJmNoYW4tPmJoX2hlYWRbY2hhbi0+Ymhfd3JpdGVdKS0+c2tiID0gc2tiOworCisJaWYgKGNoYW4tPmJoX3dyaXRlID09IE1BWF9CSF9CVUZGKXsKKwkJY2hhbi0+Ymhfd3JpdGU9MDsKKwl9ZWxzZXsKKwkJKytjaGFuLT5iaF93cml0ZTsKKwl9CisKKwlhdG9taWNfaW5jKCZjaGFuLT5iaF9idWZmX3VzZWQpOworCisJaWYgKGF0b21pY19yZWFkKCZjaGFuLT5iaF9idWZmX3VzZWQpID09IChNQVhfQkhfQlVGRisxKSl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCdWZmZXIgaXMgbm93IGZ1bGwsIFR1cm5pbmcgb2ZmIFJYIEludHJcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXN0YXR1cy0+aW1hc2sgJj0gfklOVFJfT05fUlhfRlJBTUU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHRpbWVyX2ludHJfY21kX2V4ZWMKKyAqICAKKyAqCUNhbGxlZCBieSB0aW1lciBpbnRlcnJ1cHQgdG8gZXhlY3V0ZSBhIGNvbW1hbmQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB0aW1lcl9pbnRyX2NtZF9leGVjIChzZGxhX3QqIGNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBjaGFyIG1vcmVfdG9fZXhlYz0wOworCXZvbGF0aWxlIHgyNV9jaGFubmVsX3QgKmNoYW49TlVMTDsKKwlpbnQgaT0wLGJhZF9jbWQ9MCxlcnI9MDsJCisKKwlpZiAoY2FyZC0+dS54LmNtZF9kZXYgPT0gTlVMTCl7CisJCWNhcmQtPnUueC5jbWRfZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwl9CisKKwlkZXYgPSBjYXJkLT51LnguY21kX2RldjsKKworCWZvciAoOzspeworCisJCWNoYW4gPSBkZXYtPnByaXY7CisJCQorCQlpZiAoYXRvbWljX3JlYWQoJmNoYW4tPmNvbW1vbi5jb21tYW5kKSl7IAorCisJCQliYWRfY21kID0gY2hlY2tfYmFkX2NvbW1hbmQoY2FyZCxkZXYpOworCisJCQlpZiAoKCFjaGFuLT5jb21tb24ubWJveCB8fCBhdG9taWNfcmVhZCgmY2hhbi0+Y29tbW9uLmRpc2Nvbm5lY3QpKSAmJiAKKwkJCSAgICAgIWJhZF9jbWQpeworCisJCQkJLyogU29ja2V0IGhhcyBkaWVkIG9yIGV4aXRlZCwgV2UgbXVzdCBicmluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2hhbm5lbCBkb3duIGJlZm9yZSBhbnlib2R5IGVsc2UgdHJpZXMgdG8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHVzZSBpdCAqLworCQkJCWVyciA9IGNoYW5uZWxfZGlzY29ubmVjdChjYXJkLGRldik7CisJCQl9ZWxzZXsKKwkJCSAgICAgICAgZXJyID0gZXhlY3V0ZV9kZWxheWVkX2NtZChjYXJkLCBkZXYsCisJCQkJCQkJIChtYm94X2NtZF90KiljaGFuLT5jb21tb24ubWJveCwKKwkJCQkJCQkgIGJhZF9jbWQpOworCQkJfQorCisJCQlzd2l0Y2ggKGVycil7CisKKwkJCWNhc2UgUkVUVVJOX1JFU1VMVDoKKworCQkJCS8qIFJldHVybiB0aGUgcmVzdWx0IHRvIHRoZSBzb2NrZXQgd2l0aG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkZWxheS4gTk9fV0FJVCBDb21tYW5kICovCQorCQkJCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5jb21tYW5kLDApOworCQkJCWlmIChhdG9taWNfcmVhZCgmY2FyZC0+dS54LmNvbW1hbmRfYnVzeSkpCisJCQkJCWF0b21pY19zZXQoJmNhcmQtPnUueC5jb21tYW5kX2J1c3ksMCk7CisKKwkJCQlzZW5kX2RlbGF5ZWRfY21kX3Jlc3VsdChjYXJkLGRldixjYXJkLT5tYm94KTsKKworCQkJCW1vcmVfdG9fZXhlYz0wOworCQkJCWJyZWFrOworCQkJY2FzZSBERUxBWV9SRVNVTFQ6CisJCQorCQkJCS8qIFdhaXQgZm9yIHRoZSByZW1vdGUgdG8gcmVzcG9uZCwgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNlbmRpbmcgdGhlIHJlc3VsdCB1cCB0byB0aGUgc29ja2V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBXQUlUIGNvbW1hbmQgKi8KKwkJCQlpZiAoYXRvbWljX3JlYWQoJmNhcmQtPnUueC5jb21tYW5kX2J1c3kpKQorCQkJCQlhdG9taWNfc2V0KCZjYXJkLT51LnguY29tbWFuZF9idXN5LDApOworCQkJCQorCQkJCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5jb21tYW5kLDApOworCQkJCW1vcmVfdG9fZXhlYz0wOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKworCQkJCS8qIElmIGNvbW1hbmQgY291bGQgbm90IGJlIGV4ZWN1dGVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzb21lIHJlYXNvbiAoaS5lIHJldHVybiBjb2RlIDB4MzMgYnVzeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2V0IHRoZSBtb3JlX3RvX2V4ZWMgYml0IHdoaWNoIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW5kaWNhdGUgdGhhdCB0aGlzIGNvbW1hbmQgbXVzdCBiZSBleGVjdHVlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhZ2FpbiBkdXJpbmcgbmV4dCB0aW1lciBpbnRlcnJ1cHQgCisJCQkJICovCisJCQkJbW9yZV90b19leGVjPTE7CisJCQkJaWYgKGF0b21pY19yZWFkKCZjYXJkLT51LnguY29tbWFuZF9idXN5KSA9PSAwKQorCQkJCQlhdG9taWNfc2V0KCZjYXJkLT51LnguY29tbWFuZF9idXN5LDEpOworCQkJCWJyZWFrOworCQkJfQorCisJCQliYWRfY21kPTA7CisKKwkJCS8qIElmIGZsYWdzIGlzIHNldCwgdGhlcmUgYXJlIG5vIGhkbGMgYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRodXMsIHdhaXQgZm9yIHRoZSBuZXh0IHBhc3MgYW5kIHRyeSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNhbWUgY29tbWFuZCBhZ2Fpbi4gT3RoZXJ3aXNlLCBzdGFydCBzZWFyY2hpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBmcm9tIG5leHQgZGV2aWNlIG9uIHRoZSBuZXh0IHBhc3MuIAorCQkJICovCisJCQlpZiAoIW1vcmVfdG9fZXhlYyl7CisJCQkJZGV2ID0gbW92ZV9kZXZfdG9fbmV4dChjYXJkLGRldik7CisJCQl9CisJCQlicmVhazsKKwkJfWVsc2V7CisJCQkvKiBUaGlzIGRldmljZSBoYXMgbm90aGluZyB0byBleGVjdXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICogZ28gdG8gbmV4dC4gCisJCQkgKi8KKwkJCWlmIChhdG9taWNfcmVhZCgmY2FyZC0+dS54LmNvbW1hbmRfYnVzeSkpCisJCQkJCWF0b21pY19zZXQoJmNhcmQtPnUueC5jb21tYW5kX2J1c3ksMCk7CisJCQlkZXYgPSBtb3ZlX2Rldl90b19uZXh0KGNhcmQsZGV2KTsKKwkJfQkKKworCQlpZiAoKytpID09IGNhcmQtPnUueC5ub19kZXYpeworCQkJaWYgKCFtb3JlX3RvX2V4ZWMpeworCQkJCURCR19QUklOVEsoS0VSTl9JTkZPICIlczogTm90aGluZyB0byBleGVjdXRlIGluIFRpbWVyXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCQlpZiAoYXRvbWljX3JlYWQoJmNhcmQtPnUueC5jb21tYW5kX2J1c3kpKXsKKwkJCQkJYXRvbWljX3NldCgmY2FyZC0+dS54LmNvbW1hbmRfYnVzeSwwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJfSAvL0VuZCBvZiBGT1IKKworCWNhcmQtPnUueC5jbWRfZGV2ID0gZGV2OworCQorCWlmIChtb3JlX3RvX2V4ZWMpeworCQkvKiBJZiBtb3JlIGNvbW1hbmRzIGFyZSBwZW5kaW5nLCBkbyBub3QgdHVybiBvZmYgdGltZXIgCisgICAgICAgICAgICAgICAgICogaW50ZXJydXB0ICovCisJCXJldHVybiAxOworCX1lbHNleworCQkvKiBObyBtb3JlIGNvbW1hbmRzLCB0dXJuIG9mZiB0aW1lciBpbnRlcnJ1cHQgKi8KKwkJcmV0dXJuIDA7CisJfQkKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGV4ZWN1dGVfZGVsYXllZF9jbWQgCisgKgorICoJRXhlY3V0ZSBhbiBBUEkgY29tbWFuZCB3aGljaCB3YXMgcGFzc2VkIGRvd24gZnJvbSB0aGUKKyAqICAgICAgc29jay4gIFNvY2sgaXMgdmVyeSBsaW1pdGVkIGluIHdoaWNoIGNvbW1hbmRzIGl0IGNhbgorICogICAgICBleGVjdXRlLiAgV2FpdCBhbmQgTm8gV2FpdCBjb21tYW5kcyBhcmUgc3VwcG9ydGVkLiAgCisgKiAgICAgIFBsYWNlIENhbGwsIENsZWFyIENhbGwgYW5kIFJlc2V0IHdhaXQgY29tbWFuZHMsIHdoZXJlCisgKiAgICAgIEFjY2VwdCBDYWxsIGlzIGEgbm9fd2FpdCBjb21tYW5kLgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBleGVjdXRlX2RlbGF5ZWRfY21kKHNkbGFfdCogY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBtYm94X2NtZF90ICp1c3JfY21kLCBjaGFyIGJhZF9jbWQpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCBlcnI7CisJeDI1X2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKwlpbnQgZGVsYXk9UkVUVVJOX1JFU1VMVDsKKworCWlmICghKCpjYXJkLT51LnguaGRsY19idWZfc3RhdHVzICYgMHg0MCkgJiYgIWJhZF9jbWQpeworCQlyZXR1cm4gVFJZX0NNRF9BR0FJTjsKKwl9CisKKwkvKiBUaGlzIHdheSBhIGNvbW1hbmQgaXMgZ3VhcmFudGVlZCB0byBiZSBleGVjdXRlZCBmb3IKKyAgICAgICAgICogYSBzcGVjaWZpYyBsY24sIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpcyBib3VuZCB0by4gKi8KKwl1c3JfY21kLT5jbWQubGNuID0gY2hhbi0+Y29tbW9uLmxjbjsKKwkKKworCS8qIElmIGNoYW5uZWwgaXMgcHZjLCBpbnN0ZWFkIG9mIHBsYWNlIGNhbGwKKyAgICAgICAgICogcnVuIHgyNV9jaGFubmVsIGNvbmZpZ3VyYXRpb24uIElmIHJ1bm5pbmcgTEFQQiBIRExDCisgICAgICAgICAqIGVuYWJsZSBjb21tdW5pY2F0aW9ucy4gCisgICAgICAgICAqLworCWlmICgoIWNoYW4tPmNvbW1vbi5zdmMpICYmICh1c3JfY21kLT5jbWQuY29tbWFuZCA9PSBYMjVfUExBQ0VfQ0FMTCkpeworCisJCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKXsKKwkJCURCR19QUklOVEsoS0VSTl9JTkZPICJMQVBCOiBDb25uZWN0aW5nXG4iKTsKKwkJCWNvbm5lY3QoY2FyZCk7CisJCQlzZXRfY2hhbl9zdGF0ZShkZXYsV0FOX0NPTk5FQ1RJTkcpOworCQkJcmV0dXJuIERFTEFZX1JFU1VMVDsKKwkJfWVsc2V7CisJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAiJXM6IFBWQyBpcyBDT05ORUNUSU5HXG4iLGNhcmQtPmRldm5hbWUpOworCQkJaWYgKHgyNV9nZXRfY2hhbl9jb25mKGNhcmQsIGNoYW4pID09IENNRF9PSyl7CisJCQkJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fQ09OTkVDVEVEKTsKKwkJCX1lbHNleyAKKwkJCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworCQkJfQorCQkJcmV0dXJuIFJFVFVSTl9SRVNVTFQ7CisJCX0KKwl9CisKKwkvKiBDb3B5IHRoZSBzb2NrZXQgbWJveCBjb21tYW5kIG9udG8gdGhlIGJvYXJkICovCisKKwltZW1jcHkoJm1ib3gtPmNtZCwgJnVzcl9jbWQtPmNtZCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwlpZiAodXNyX2NtZC0+Y21kLmxlbmd0aCl7CisJCW1lbWNweShtYm94LT5kYXRhLCB1c3JfY21kLT5kYXRhLCB1c3JfY21kLT5jbWQubGVuZ3RoKTsKKwl9CisKKwkvKiBDaGVjayBpZiBjb21tYW5kIGlzIGJhZC4gV2UgbmVlZCB0byBjb3B5IHRoZSBjbWQgaW50bworICAgICAgICAgKiB0aGUgYnVmZmVyIHJlZ2FyZGxlc3Mgc2luY2Ugd2UgcmV0dXJuIHRoZSwgbWJveCB0bworICAgICAgICAgKiB0aGUgdXNlciAqLworCWlmIChiYWRfY21kKXsKKwkJbWJveC0+Y21kLnJlc3VsdD0weDAxOworCQlyZXR1cm4gUkVUVVJOX1JFU1VMVDsKKwl9CisKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwlpZiAoZXJyICE9IENNRF9PSyAmJiBlcnIgIT0gWDI1UkVTX05PVF9SRUFEWSkKKwkJeDI1X2Vycm9yKGNhcmQsIGVyciwgdXNyX2NtZC0+Y21kLmNvbW1hbmQsIHVzcl9jbWQtPmNtZC5sY24pOworCisJaWYgKG1ib3gtPmNtZC5yZXN1bHQgPT0gWDI1UkVTX05PVF9SRUFEWSl7CisJCXJldHVybiBUUllfQ01EX0FHQUlOOworCX0KKworCXN3aXRjaCAobWJveC0+Y21kLmNvbW1hbmQpeworCisJY2FzZSBYMjVfUExBQ0VfQ0FMTDoKKwkJCisJCXN3aXRjaCAobWJveC0+Y21kLnJlc3VsdCl7CisKKwkJY2FzZSBDTURfT0s6CisKKwkJCS8qIENoZWNrIGlmIFBsYWNlIGNhbGwgaXMgYSB3YWl0IGNvbW1hbmQgb3IgYSAKKyAgICAgICAgICAgICAgIAkgIAkgKiBubyB3YWl0IGNvbW1hbmQgKi8KKwkJCWlmIChhdG9taWNfcmVhZCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQpICYgMHg4MCkKKyAJCQkJZGVsYXk9UkVUVVJOX1JFU1VMVDsKKwkJCWVsc2UKKwkJCQlkZWxheT1ERUxBWV9SRVNVTFQ7CisJCQorCisJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAiXG4lczogUExBQ0UgQ0FMTCBCaW5kaW5nIGRldiAlcyB0byBsY24gJWlcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsZGV2LT5uYW1lLCBtYm94LT5jbWQubGNuKTsKKwkJCisJCQliaW5kX2xjbl90b19kZXYgKGNhcmQsIGRldiwgbWJveC0+Y21kLmxjbik7CisJCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9DT05ORUNUSU5HKTsKKwkJCWJyZWFrOworCisKKwkJZGVmYXVsdDoKKwkJCWRlbGF5PVJFVFVSTl9SRVNVTFQ7CisJCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFgyNV9BQ0NFUFRfQ0FMTDogCisJCQorCQlzd2l0Y2ggKG1ib3gtPmNtZC5yZXN1bHQpeworCisJCWNhc2UgQ01EX09LOgorCisJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAiXG4lczogQUNDRVBUIEJpbmRpbmcgZGV2ICVzIHRvIGxjbiAlaVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSxtYm94LT5jbWQubGNuKTsKKworCQkJYmluZF9sY25fdG9fZGV2IChjYXJkLCBkZXYsIG1ib3gtPmNtZC5sY24pOworCisJCQlpZiAoeDI1X2dldF9jaGFuX2NvbmYoY2FyZCwgY2hhbikgPT0gQ01EX09LKXsKKworCQkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RFRCk7CisJCQkJZGVsYXk9UkVUVVJOX1JFU1VMVDsKKworCQkJfWVsc2V7IAorCQkJCWlmICh4MjVfY2xlYXJfY2FsbChjYXJkLCB1c3JfY21kLT5jbWQubGNuLCAwLCAwKSA9PSBDTURfT0speworCQkJCQkvKiBpZiBjbGVhciBpcyBzdWNjZXNzZnVsLCB3YWl0IGZvciBjbGVhciBjb25maXJtIAorCQkJCQkgKi8gCisJCQkJCWRlbGF5PURFTEFZX1JFU1VMVDsKKwkJCQl9ZWxzZXsKKwkJCQkJLyogRG8gbm90IGNoYW5nZSB0aGUgc3RhdGUgaGVyZS4gSWYgd2UgZmFpbCAKKwkJCQkJICogdGhlIGFjY2VwdCB0aGUgcmV0dXJuIGNvZGUgaXMgc2VuZCB1cCAKKwkJCQkJICp0aGUgc3RhY2ssIHdoaWNoIHdpbGwgZXRoZXIgcmV0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAJICogb3IgY2xlYXIgdGhlIGNhbGwgCisJCQkJCSAqLworCQkJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAKKwkJCQkJCSIlczogQUNDRVBUOiBTVEFURSBNQVkgQkUgQ1VSUlVQVEVEIDIgISEhISFcbiIsCisJCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCQkJZGVsYXk9UkVUVVJOX1JFU1VMVDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCisJCWNhc2UgWDI1UkVTX0FTWU5DX1BBQ0tFVDoKKwkJCWRlbGF5PVRSWV9DTURfQUdBSU47CisJCQlicmVhazsKKworCQlkZWZhdWx0OiAKKwkJCURCR19QUklOVEsoS0VSTl9JTkZPICIlczogQUNDRVBUIEZBSUxFRFxuIixjYXJkLT5kZXZuYW1lKTsKKwkJCWlmICh4MjVfY2xlYXJfY2FsbChjYXJkLCB1c3JfY21kLT5jbWQubGNuLCAwLCAwKSA9PSBDTURfT0speworCQkJCWRlbGF5PURFTEFZX1JFU1VMVDsKKwkJCX1lbHNleworCQkJCS8qIERvIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIGhlcmUuIElmIHdlIGZhaWwgdGhlIGFjY2VwdC4gVGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJldHVybiBjb2RlIGlzIHNlbmQgdXAgdGhlIHN0YWNrLCB3aGljaCB3aWxsIGV0aGVyIHJldHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9yIGNsZWFyIHRoZSBjYWxsICovCisJCQkJREJHX1BSSU5USyhLRVJOX0lORk8gCisJCQkJCSIlczogQUNDRVBUOiBTVEFURSBNQVkgQkUgQ09SUlVQVEVEIDEgISEhISFcbiIsCisJCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCQlkZWxheT1SRVRVUk5fUkVTVUxUOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBYMjVfQ0xFQVJfQ0FMTDoKKworCQlzd2l0Y2ggKG1ib3gtPmNtZC5yZXN1bHQpeworCisJCWNhc2UgQ01EX09LOgorCQkJREJHX1BSSU5USyhLRVJOX0lORk8gCisJCQkJCSJDQUxMIENMRUFSIE9LOiBEZXYgJXMgTWJveCBMY24gJWkgIENoYW4gTGNuICVpXG4iLAorCQkJCQlkZXYtPm5hbWUsbWJveC0+Y21kLmxjbixjaGFuLT5jb21tb24ubGNuKTsKKwkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RJTkcpOworCQkJZGVsYXkgPSBERUxBWV9SRVNVTFQ7CisJCQlicmVhazsKKworCQljYXNlIFgyNVJFU19DSEFOTkVMX0lOX1VTRToKKwkJY2FzZSBYMjVSRVNfQVNZTkNfUEFDS0VUOgorCQkJZGVsYXkgPSBUUllfQ01EX0FHQUlOOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBYMjVSRVNfTElOS19OT1RfSU5fQUJNOgorCQljYXNlIFgyNVJFU19JTlZBTF9MQ046CisJCWNhc2UgWDI1UkVTX0lOVkFMX1NUQVRFOgorCQkJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fRElTQ09OTkVDVEVEKTsKKwkJCWRlbGF5ID0gUkVUVVJOX1JFU1VMVDsKKwkJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCS8qIElmIGNvbW1hbmQgZGlkIG5vdCBleGVjdXRlIGJlY2F1c2Ugb2YgdXNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICogZmF1bHQsIGRvIG5vdCBjaGFuZ2UgdGhlIHN0YXRlLiBUaGlzIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpZ25hbCB0aGUgc29ja2V0IHRoYXQgY2xlYXIgY29tbWFuZCBmYWlsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBVc2VyIGNhbiByZXRyeSBvciBjbG9zZSB0aGUgc29ja2V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICogV2hlbiBzb2NrZXQgZ2V0cyBraWxsZWQsIGl0IHdpbGwgc2V0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGNoYW4tPmRpc2Nvbm5lY3Qgd2hpY2ggd2lsbCBzaWduYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGRyaXZlciB0byBjbGVhciB0aGUgY2FsbCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENsZWFyIENvbW1hbmQgRmFpbGVkLCBSYyAleFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLG1ib3gtPmNtZC5jb21tYW5kKTsgCisJCQlkZWxheSA9IFJFVFVSTl9SRVNVTFQ7CisJCX0KKwkJYnJlYWs7CisJfQkKKworCXJldHVybiBkZWxheTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGFwaV9pbmNvbWluZ19jYWxsIAorICoKKyAqCVBhc3MgYW4gaW5jb21pbmcgY2FsbCByZXF1ZXN0IHVwIHRoZSBsaXN0ZW5pbmcKKyAqICAgICAgc29jay4gIElmIHRoZSBBUEkgc29jayBpcyBub3QgbGlzdGVuaW5nIHJlamVjdCB0aGUKKyAqICAgICAgY2FsbC4KKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgYXBpX2luY29taW5nX2NhbGwgKHNkbGFfdCogY2FyZCwgVFgyNU1ib3ggKm1ib3gsIGludCBsY24pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgbGVuID0gc2l6ZW9mKFRYMjVDbWQpK21ib3gtPmNtZC5sZW5ndGg7CisKKwlpZiAoYWxsb2NfYW5kX2luaXRfc2tiX2J1ZihjYXJkLCAmc2tiLCBsZW4pKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFQSSBpbmNvbWluZyBjYWxsLCBubyBtZW1vcnlcbiIsY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCW1lbWNweShza2JfcHV0KHNrYixsZW4pLCZtYm94LT5jbWQsbGVuKTsKKworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoWDI1X1BST1QpOworCXNrYi0+cGt0X3R5cGUgPSBXQU5fUEFDS0VUX0FTWU5DOworCisJaWYgKGNhcmQtPmZ1bmMoc2tiLGNhcmQtPnNrKSA8IDApeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTUFKT1IgRVJST1I6IEZhaWxlZCB0byBzZW5kIHVwIHBsYWNlIGNhbGwgXG4iLGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogc2VuZF9kZWxheWVkX2NtZF9yZXN1bHQKKyAqCisgKglXYWl0IGNvbW1hbmRzIGxpa2UgUExFQUNFIENBTEwgb3IgQ0xFQVIgQ0FMTCBtdXN0IHdhaXQKKyAqICAgICAgdW50aWwgdGhlIHJlc3VsdCBhcnJpdmVzLiBUaGlzIGZ1bmN0aW9uIHBhc3NlcworICogICAgICB0aGUgcmVzdWx0IHRvIGEgd2FpdGluZyBzb2NrLiAKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBzZW5kX2RlbGF5ZWRfY21kX3Jlc3VsdChzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIFRYMjVNYm94KiBtYm94KQoreworCXgyNV9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisJbWJveF9jbWRfdCAqdXNyX2NtZCA9IChtYm94X2NtZF90ICopY2hhbi0+Y29tbW9uLm1ib3g7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgbGVuPXNpemVvZih1bnNpZ25lZCBjaGFyKTsKKworCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5jb21tYW5kLDApOworCisJLyogSWYgdGhlIHNvY2sgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgdW5saW5raW5nIHRoZQorCSAqIGRyaXZlciBmcm9tIHRoZSBzb2NrZXQsIHdlIG11c3QgZ2V0IG91dC4gCisJICogVGhpcyBuZXZlciBoYXBwZW5kcyBidXQgaXMgYSBzYW5pdHkgY2hlY2suICovCisJaWYgKHRlc3RfYml0KDAsJmNoYW4tPmNvbW1vbi5jb21tb25fY3JpdGljYWwpKXsKKwkJcmV0dXJuOworCX0KKworCWlmICghdXNyX2NtZCB8fCAhY2hhbi0+Y29tbW9uLnNrIHx8ICFjaGFuLT5jb21tb24uZnVuYyl7CisJCURCR19QUklOVEsoS0VSTl9JTkZPICJEZWxheSByZXN1bHQ6IFNvY2sgbm90IGJvdW5kZWQgc2s6ICV1LCBmdW5jOiAldSwgbWJveDogJXVcbiIsCisJCQkodW5zaWduZWQgaW50KWNoYW4tPmNvbW1vbi5zaywKKwkJCSh1bnNpZ25lZCBpbnQpY2hhbi0+Y29tbW9uLmZ1bmMsCisJCQkodW5zaWduZWQgaW50KXVzcl9jbWQpOyAKKwkJcmV0dXJuOworCX0KKworCW1lbWNweSgmdXNyX2NtZC0+Y21kLCAmbWJveC0+Y21kLCBzaXplb2YoVFgyNUNtZCkpOyAKKwlpZiAobWJveC0+Y21kLmxlbmd0aCA+IDApeworCQltZW1jcHkodXNyX2NtZC0+ZGF0YSwgbWJveC0+ZGF0YSwgbWJveC0+Y21kLmxlbmd0aCk7CisJfQorCisJaWYgKGFsbG9jX2FuZF9pbml0X3NrYl9idWYoY2FyZCwmc2tiLGxlbikpeworCQlwcmludGsoS0VSTl9JTkZPICJEZWxheSByZXN1bHQ6IE5vIHNvY2sgYnVmZmVyc1xuIik7CisJCXJldHVybjsKKwl9CisKKwltZW1jcHkoc2tiX3B1dChza2IsbGVuKSwmbWJveC0+Y21kLmNvbW1hbmQsbGVuKTsKKwkKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiLT5wa3RfdHlwZSA9IFdBTl9QQUNLRVRfQ01EOworCQkJCisJY2hhbi0+Y29tbW9uLmZ1bmMoc2tiLGRldixjaGFuLT5jb21tb24uc2spOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogY2xlYXJfY29uZmlybV9ldmVudAorICoKKyAqIAlQYXNzIHRoZSBjbGVhciBjb25maXJtYXRpb24gZXZlbnQgdXAgdGhlIHNvY2suIFRoZQorICogICAgICBBUEkgd2lsbCBkaXNjb25uZWN0IG9ubHkgYWZ0ZXIgdGhlIGNsZWFyIGNvbmZpcm1hdGlvbgorICogICAgICBoYXMgYmVlbiByZWNlaXZlZC4gCisgKgorICogICAgICBEZXBlbmRpbmcgb24gdGhlIHN0YXRlLCBjbGVhciBjb25maXJtYXRpb24gY291bGQgCisgKiAgICAgIGJlIGFuIE9PQiBldmVudCwgb3IgYSByZXN1bHQgb2YgYW4gQVBJIGNvbW1hbmQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgY2xlYXJfY29uZmlybV9ldmVudCAoc2RsYV90ICpjYXJkLCBUWDI1TWJveCogbWIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl4MjVfY2hhbm5lbF90ICpjaGFuOworCXVuc2lnbmVkIGNoYXIgb2xkX3N0YXRlOwkKKworCWRldiA9IGZpbmRfY2hhbm5lbChjYXJkLG1iLT5jbWQubGNuKTsKKwlpZiAoIWRldil7CisJCURCR19QUklOVEsoS0VSTl9JTkZPICIlczogKioqIEdPVCBDTEVBUiBCVVQgTk8gREVWICVpXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsbWItPmNtZC5sY24pOworCQlyZXR1cm4gMDsKKwl9CisKKwljaGFuPWRldi0+cHJpdjsKKwlEQkdfUFJJTlRLKEtFUk5fSU5GTyAiJXM6IEdPVCBDTEVBUiBDT05GSVJNICVzOiAgTWJveCBsY24gJWkgIENoYW4gbGNuICVpXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lLCBtYi0+Y21kLmxjbiwgY2hhbi0+Y29tbW9uLmxjbik7CisKKwkvKiBJZiBub3QgQVBJIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0LiAKKwkgKiBJZiBBUEksIHNlbmQgdGhlIHJlc3VsdCB0byBhIHdhaXRpbmcKKyAgICAgICAgICogc29ja2V0LgorCSAqLworCQorCW9sZF9zdGF0ZSA9IGNoYW4tPmNvbW1vbi5zdGF0ZTsKKwlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworCisJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKwkJc3dpdGNoIChvbGRfc3RhdGUpIHsKKworCQljYXNlIFdBTl9ESVNDT05ORUNUSU5HOgorCQljYXNlIFdBTl9DT05ORUNUSU5HOgorCQkJc2VuZF9kZWxheWVkX2NtZF9yZXN1bHQoY2FyZCxkZXYsbWIpOworCQkJYnJlYWs7CisJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCXNlbmRfb29iX21zZyhjYXJkLGRldixtYik7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHNlbmRfb29iX21zZworICoKKyAqICAgIENvbnN0cnVjdCBhbiBORU0gTWVzc2FnZSBhbmQgcGFzcyBpdCB1cCB0aGUgY29ubmVjdGVkCisgKiAgICBzb2NrLiBJZiB0aGUgc29jayBpcyBub3QgYm91bmRlZCBkaXNjYXJkIHRoZSBORU0uCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBzZW5kX29vYl9tc2coc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBUWDI1TWJveCAqbWJveCkKK3sKKwl4MjVfY2hhbm5lbF90ICpjaGFuID0gZGV2LT5wcml2OworCW1ib3hfY21kX3QgKnVzcl9jbWQgPSAobWJveF9jbWRfdCAqKWNoYW4tPmNvbW1vbi5tYm94OworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGxlbj1zaXplb2YoeDI1YXBpX2hkcl90KSttYm94LT5jbWQubGVuZ3RoOworCXgyNWFwaV90ICphcGlfaGRyOworCisJLyogSWYgdGhlIHNvY2sgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgdW5saW5raW5nIHRoZQorCSAqIGRyaXZlciBmcm9tIHRoZSBzb2NrZXQsIHdlIG11c3QgZ2V0IG91dC4gCisJICogVGhpcyBuZXZlciBoYXBwZW5kcyBidXQgaXMgYSBzYW5pdHkgY2hlY2suICovCisJaWYgKHRlc3RfYml0KDAsJmNoYW4tPmNvbW1vbi5jb21tb25fY3JpdGljYWwpKXsKKwkJcmV0dXJuOworCX0KKworCWlmICghdXNyX2NtZCB8fCAhY2hhbi0+Y29tbW9uLnNrIHx8ICFjaGFuLT5jb21tb24uZnVuYyl7CisJCURCR19QUklOVEsoS0VSTl9JTkZPICJPT0IgTVNHOiBTb2NrIG5vdCBib3VuZGVkXG4iKTsgCisJCXJldHVybjsKKwl9CisKKwltZW1jcHkoJnVzcl9jbWQtPmNtZCwgJm1ib3gtPmNtZCwgc2l6ZW9mKFRYMjVDbWQpKTsgCisJaWYgKG1ib3gtPmNtZC5sZW5ndGggPiAwKXsKKwkJbWVtY3B5KHVzcl9jbWQtPmRhdGEsIG1ib3gtPmRhdGEsIG1ib3gtPmNtZC5sZW5ndGgpOworCX0KKworCWlmIChhbGxvY19hbmRfaW5pdF9za2JfYnVmKGNhcmQsJnNrYixsZW4pKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9PQiBNU0c6IE5vIHNvY2sgYnVmZmVyc1xuIixjYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWFwaV9oZHIgPSAoeDI1YXBpX3QqKXNrYl9wdXQoc2tiLGxlbik7IAorCWFwaV9oZHItPmhkci5wa3RUeXBlID0gbWJveC0+Y21kLnBrdFR5cGUgJiAweDdGOworCWFwaV9oZHItPmhkci5xZG0gICAgID0gbWJveC0+Y21kLnFkbTsKKwlhcGlfaGRyLT5oZHIuY2F1c2UgICA9IG1ib3gtPmNtZC5jYXVzZTsKKwlhcGlfaGRyLT5oZHIuZGlhZ24gICA9IG1ib3gtPmNtZC5kaWFnbjsKKwlhcGlfaGRyLT5oZHIubGVuZ3RoICA9IG1ib3gtPmNtZC5sZW5ndGg7CisJYXBpX2hkci0+aGRyLnJlc3VsdCAgPSBtYm94LT5jbWQucmVzdWx0OworCWFwaV9oZHItPmhkci5sY24gICAgID0gbWJveC0+Y21kLmxjbjsKKworCWlmIChtYm94LT5jbWQubGVuZ3RoID4gMCl7CisJCW1lbWNweShhcGlfaGRyLT5kYXRhLG1ib3gtPmRhdGEsbWJveC0+Y21kLmxlbmd0aCk7CisJfQorCQorCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2ItPnBrdF90eXBlID0gV0FOX1BBQ0tFVF9FUlI7CisJCQkKKwlpZiAoY2hhbi0+Y29tbW9uLmZ1bmMoc2tiLGRldixjaGFuLT5jb21tb24uc2spIDwgMCl7CisJCWlmIChiaF9lbnF1ZXVlKGRldixza2IpKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEcm9wcGluZyBPT0IgTVNHXG4iLGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgIAlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQl9CisJfQorCisJREJHX1BSSU5USyhLRVJOX0lORk8gIiVzOiBPT0IgTVNHIE9LLCAlcywgbGNuICVpXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lLCBtYm94LT5jbWQubGNuKTsKK30JCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgYWxsb2NfYW5kX2luaXRfc2tiX2J1ZiAKKyAqCisgKglBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBza2IgYnVmZmVyLiAKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgYWxsb2NfYW5kX2luaXRfc2tiX2J1ZiAoc2RsYV90ICpjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrYiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYiA9ICpza2I7CisKKwluZXdfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyBYMjVfSFJESERSX1NaKTsKKwlpZiAobmV3X3NrYiA9PSBOVUxMKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSFcbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHNrYl90YWlscm9vbShuZXdfc2tiKSA8IGxlbil7CisJCS8qIE5vIHJvb20gZm9yIHRoZSBwYWNrZXQuIENhbGwgb2ZmIHRoZSB3aG9sZSB0aGluZyEgKi8KKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShuZXdfc2tiKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpc3RlbjogdW5leHBlY3RlZGx5IGxvbmcgcGFja2V0IHNlcXVlbmNlXG4iCisJCQksY2FyZC0+ZGV2bmFtZSk7CisJCSpza2IgPSBOVUxMOworCQlyZXR1cm4gMTsKKwl9CisKKwkqc2tiID0gbmV3X3NrYjsKKwlyZXR1cm4gMDsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogIGFwaV9vb2JfZXZlbnQgCisgKgorICoJU2VuZCBhbiBPT0IgZXZlbnQgdXAgdG8gdGhlIHNvY2sgCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBhcGlfb29iX2V2ZW50IChzZGxhX3QgKmNhcmQsVFgyNU1ib3ggKm1ib3gpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGZpbmRfY2hhbm5lbChjYXJkLCBtYm94LT5jbWQubGNuKTsKKwl4MjVfY2hhbm5lbF90ICpjaGFuOworCisJaWYgKCFkZXYpCisJCXJldHVybjsKKworCWNoYW49ZGV2LT5wcml2OworCisJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKQorCQlzZW5kX29vYl9tc2coY2FyZCxkZXYsbWJveCk7CisJCit9CisKKworCisKK3N0YXRpYyBpbnQgY2hhbm5lbF9kaXNjb25uZWN0KHNkbGFfdCogY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCWludCBlcnI7CisJeDI1X2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKworCURCR19QUklOVEsoS0VSTl9JTkZPICIlczogVElNRVI6ICVzLCBEZXZpY2UgZG93biBkaXNjb25uZWN0aW5nXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsZGV2LT5uYW1lKTsKKworCWlmIChjaGFuLT5jb21tb24uc3ZjKXsKKwkJZXJyID0geDI1X2NsZWFyX2NhbGwoY2FyZCxjaGFuLT5jb21tb24ubGNuLDAsMCk7CisJfWVsc2V7CisJCS8qIElmIGNoYW5uZWwgaXMgUFZDIG9yIExBUEIgSERMQywgdGhlcmUgaXMgbm8gY2FsbAorICAgICAgICAgICAgICAgICAqIHRvIGJlIGNsZWFyZWQsIHRodXMgZHJvcCBkb3duIHRvIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICogYXJlYSAKKwkgICAgICAgICAqLworCQllcnIgPSAxOworCX0KKworCXN3aXRjaCAoZXJyKXsKKwkKKwkJY2FzZSBYMjVSRVNfQ0hBTk5FTF9JTl9VU0U6CQorCQljYXNlIFgyNVJFU19OT1RfUkVBRFk6CisJCQllcnIgPSBUUllfQ01EX0FHQUlOOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX09LOgorCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIkNBTEwgQ0xFQVIgT0s6IERldiAlcyBDaGFuIExjbiAlaVxuIiwKKwkJCQkJCWRldi0+bmFtZSxjaGFuLT5jb21tb24ubGNuKTsKKworCQkJc2V0X2NoYW5fc3RhdGUoZGV2LFdBTl9ESVNDT05ORUNUSU5HKTsKKwkJCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5jb21tYW5kLDApOworCQkJZXJyID0gREVMQVlfUkVTVUxUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBJZiBMQVBCIEhETEMgcHJvdG9jb2wsIGJyaW5nIHRoZSB3aG9sZSBsaW5rIGRvd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIG9uY2UgdGhlIGFwcGxpY2F0aW9uIHRlcm1pbmF0ZXMgCisJCQkgKi8KKworCQkJc2V0X2NoYW5fc3RhdGUoZGV2LFdBTl9ESVNDT05ORUNURUQpOworCisJCQlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYyl7CisJCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIkxBUEI6IERpc2Nvbm5lY3RpbmcgTGlua1xuIik7CisJCQkJaGRsY19saW5rX2Rvd24gKGNhcmQpOworCQkJfQorCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQsMCk7CisJCQllcnIgPSBSRVRVUk5fUkVTVUxUOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgaGRsY19saW5rX2Rvd24gKHNkbGFfdCAqY2FyZCkKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gNTsKKwlpbnQgZXJyPTA7CisKKwlkbyB7CisJCW1lbXNldChtYm94LDAsc2l6ZW9mKFRYMjVNYm94KSk7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X0hETENfTElOS19ESVNDOworCQltYm94LT5jbWQubGVuZ3RoID0gMTsKKwkJbWJveC0+ZGF0YVswXT0wOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfSERMQ19MSU5LX0RJU0MsIDApKTsKKworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBIZGxjIExpbmsgRG93biBGYWlsZWQgJXhcbiIsY2FyZC0+ZGV2bmFtZSxlcnIpOworCisJZGlzY29ubmVjdCAoY2FyZCk7CisJCit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYmFkX2NvbW1hbmQoc2RsYV90KiBjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXgyNV9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisJaW50IGJhZF9jbWQgPSAwOworCisJc3dpdGNoIChhdG9taWNfcmVhZCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQpJjB4N0YpeworCisJCWNhc2UgWDI1X1BMQUNFX0NBTEw6CisJCQlpZiAoY2hhbi0+Y29tbW9uLnN0YXRlICE9IFdBTl9ESVNDT05ORUNURUQpCisJCQkJYmFkX2NtZD0xOworCQkJYnJlYWs7CisJCWNhc2UgWDI1X0NMRUFSX0NBTEw6CisJCQlpZiAoY2hhbi0+Y29tbW9uLnN0YXRlID09IFdBTl9ESVNDT05ORUNURUQpCisJCQkJYmFkX2NtZD0xOworCQkJYnJlYWs7CisJCWNhc2UgWDI1X0FDQ0VQVF9DQUxMOgorCQkJaWYgKGNoYW4tPmNvbW1vbi5zdGF0ZSAhPSBXQU5fQ09OTkVDVElORykKKwkJCQliYWRfY21kPTE7CisJCQlicmVhazsKKwkJY2FzZSBYMjVfUkVTRVQ6CisJCQlpZiAoY2hhbi0+Y29tbW9uLnN0YXRlICE9IFdBTl9DT05ORUNURUQpCisJCQkJYmFkX2NtZD0xOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQliYWRfY21kPTE7CisJCQlicmVhazsKKwl9CisKKwlpZiAoYmFkX2NtZCl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnZhbGlkIFN0YXRlLCBCQUQgQ29tbWFuZCAleCwgZGV2ICVzLCBsY24gJWksIHN0ICVpXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUsYXRvbWljX3JlYWQoJmNoYW4tPmNvbW1vbi5jb21tYW5kKSxkZXYtPm5hbWUsIAorCQkJY2hhbi0+Y29tbW9uLmxjbiwgY2hhbi0+Y29tbW9uLnN0YXRlKTsKKwl9CisKKwlyZXR1cm4gYmFkX2NtZDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogWFBJUEVNT04gRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2VzcyBVRFAgY2FsbCBvZiB0eXBlIFhQSVBFCisgKi8KKworc3RhdGljIGludCBwcm9jZXNzX3VkcF9tZ210X3BrdChzZGxhX3QgKmNhcmQpCit7CisJaW50ICAgICAgICAgICAgY19yZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJdW5zaWduZWQgaW50ICAgbGVuOworCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCVRYMjVNYm94ICAgICAgICptYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgICAgICAgICAgICBlcnI7CisJaW50ICAgICAgICAgICAgdWRwX21nbXRfcmVxX3ZhbGlkID0gMTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgICAgICB4MjVfY2hhbm5lbF90ICAqY2hhbjsKKwl1bnNpZ25lZCBzaG9ydCBsY247CisJc3RydWN0IHRpbWV2YWwgdHY7CisJCisKKwl4MjVfdWRwX3BrdF90ICp4MjVfdWRwX3BrdDsKKwl4MjVfdWRwX3BrdCA9ICh4MjVfdWRwX3BrdF90ICopY2FyZC0+dS54LnVkcF9wa3RfZGF0YTsKKworCWRldiA9IGNhcmQtPnUueC51ZHBfZGV2OworCWNoYW4gPSBkZXYtPnByaXY7CisJbGNuID0gY2hhbi0+Y29tbW9uLmxjbjsKKworCXN3aXRjaCh4MjVfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpIHsKKyAgICAgICAgICAgIAorCQkvKiBYUElQRV9FTkFCTEVfVFJBQ0UgKi8KKwkJY2FzZSBYUElQRV9FTkFCTEVfVFJBQ0lORzoKKworCQkvKiBYUElQRV9HRVRfVFJBQ0VfSU5GTyAqLworCQljYXNlIFhQSVBFX0dFVF9UUkFDRV9JTkZPOgorIAorCQkvKiBTRVQgRlQxIE1PREUgKi8KKwkJY2FzZSBYUElQRV9TRVRfRlQxX01PREU6CisgICAgICAgICAgIAorCQkJaWYoY2FyZC0+dS54LnVkcF9wa3Rfc3JjID09IFVEUF9QS1RfRlJNX05FVFdPUkspIHsKKyAgICAgICAgICAgICAgICAgICAgCQkrK2NoYW4tPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfZGlyZWN0aW9uX2VycjsKKwkJCQl1ZHBfbWdtdF9yZXFfdmFsaWQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCisJCS8qIFhQSVBFX0ZUMV9SRUFEX1NUQVRVUyAqLworCQljYXNlIFhQSVBFX0ZUMV9SRUFEX1NUQVRVUzoKKworCQkvKiBGVDEgTU9OSVRPUiBTVEFUVVMgKi8KKwkJY2FzZSBYUElQRV9GVDFfU1RBVFVTX0NUUkw6CisJCQlpZihjYXJkLT5ody5md2lkICE9ICBTRklEX1gyNV81MDgpIHsKKwkJCQkrK2NoYW4tPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfYWRwdHJfdHlwZV9lcnI7CisJCQkJdWRwX21nbXRfcmVxX3ZhbGlkID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworICAgICAgIAl9CisKKwlpZighdWRwX21nbXRfcmVxX3ZhbGlkKSB7CisgICAgICAgICAgIAkvKiBzZXQgbGVuZ3RoIHRvIDAgKi8KKwkJeDI1X3VkcF9wa3QtPmNibG9jay5sZW5ndGggPSAwOworCQkvKiBzZXQgcmV0dXJuIGNvZGUgKi8KKwkJeDI1X3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAoY2FyZC0+aHcuZndpZCAhPSBTRklEX1gyNV81MDgpID8gMHgxRiA6IDB4Q0Q7CisJCQorCX0gZWxzZSB7ICAgCisgICAgICAgIAorCQlzd2l0Y2ggKHgyNV91ZHBfcGt0LT5jYmxvY2suY29tbWFuZCkgeworICAgIAorCQorCQljYXNlIFhQSVBFX0ZMVVNIX0RSSVZFUl9TVEFUUzoKKwkJCWluaXRfeDI1X2NoYW5uZWxfc3RydWN0KGNoYW4pOworCQkJaW5pdF9nbG9iYWxfc3RhdGlzdGljcyhjYXJkKTsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQkJYnJlYWs7CisKKworCQljYXNlIFhQSVBFX0RSSVZFUl9TVEFUX0lGU0VORDoKKwkJCW1lbWNweSh4MjVfdWRwX3BrdC0+ZGF0YSwgJmNoYW4tPmlmX3NlbmRfc3RhdCwgc2l6ZW9mKGlmX3NlbmRfc3RhdF90KSk7CisJCQltYm94LT5jbWQubGVuZ3RoID0gc2l6ZW9mKGlmX3NlbmRfc3RhdF90KTsKKwkJCXgyNV91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gIG1ib3gtPmNtZC5sZW5ndGg7CQorCQkJYnJlYWs7CisJCisJCWNhc2UgWFBJUEVfRFJJVkVSX1NUQVRfSU5UUjoKKwkJCW1lbWNweSgmeDI1X3VkcF9wa3QtPmRhdGFbMF0sICZjYXJkLT5zdGF0aXN0aWNzLCBzaXplb2YoZ2xvYmFsX3N0YXRzX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmeDI1X3VkcF9wa3QtPmRhdGFbc2l6ZW9mKGdsb2JhbF9zdGF0c190KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFuLT5yeF9pbnRyX3N0YXQsIHNpemVvZihyeF9pbnRyX3N0YXRfdCkpOworCQkJCisJCQltYm94LT5jbWQubGVuZ3RoID0gc2l6ZW9mKGdsb2JhbF9zdGF0c190KSArCisJCQkJCXNpemVvZihyeF9pbnRyX3N0YXRfdCk7CisJCQl4MjVfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9ICBtYm94LT5jbWQubGVuZ3RoOworCQkJYnJlYWs7CisKKwkJY2FzZSBYUElQRV9EUklWRVJfU1RBVF9HRU46CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoeDI1X3VkcF9wa3QtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFuLT5waXBlX21nbXRfc3RhdC5VRFBfUElQRV9tZ210X2ttYWxsb2NfZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGlwZV9tZ210X3N0YXRfdCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJngyNV91ZHBfcGt0LT5kYXRhW3NpemVvZihwaXBlX21nbXRfc3RhdF90KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhcmQtPnN0YXRpc3RpY3MsIHNpemVvZihnbG9iYWxfc3RhdHNfdCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICB4MjVfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB4MjVfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IHNpemVvZihnbG9iYWxfc3RhdHNfdCkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyeF9pbnRyX3N0YXRfdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYm94LT5jbWQubGVuZ3RoID0geDI1X3VkcF9wa3QtPmNibG9jay5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCQljYXNlIFhQSVBFX1JPVVRFUl9VUF9USU1FOgorCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJCQljaGFuLT5yb3V0ZXJfdXBfdGltZSA9IHR2LnR2X3NlYyAtIGNoYW4tPnJvdXRlcl9zdGFydF90aW1lOworICAgIAkgICAgICAgICAgICAgICAgKih1bnNpZ25lZCBsb25nICopJngyNV91ZHBfcGt0LT5kYXRhID0gY2hhbi0+cm91dGVyX3VwX3RpbWU7CQorCQkJeDI1X3VkcF9wa3QtPmNibG9jay5sZW5ndGggPSBtYm94LT5jbWQubGVuZ3RoID0gNDsKKwkJCXgyNV91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCQorCQlkZWZhdWx0IDoKKworCQkJZG8geworCQkJCW1lbWNweSgmbWJveC0+Y21kLCAmeDI1X3VkcF9wa3QtPmNibG9jay5jb21tYW5kLCBzaXplb2YoVFgyNUNtZCkpOworCQkJCWlmKG1ib3gtPmNtZC5sZW5ndGgpeyAKKwkJCQkJbWVtY3B5KCZtYm94LT5kYXRhLCAKKwkJCQkJICAgICAgIChjaGFyICopeDI1X3VkcF9wa3QtPmRhdGEsIAorCQkJCQkgICAgICAgbWJveC0+Y21kLmxlbmd0aCk7CisJCQkJfQkKKwkJCisJCQkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQkJfSB3aGlsZSAoZXJyICYmIGNfcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBtYm94LT5jbWQuY29tbWFuZCwgMCkpOworCisKKwkJCWlmICggZXJyID09IENNRF9PSyB8fCAKKwkJCSAgICAoZXJyID09IDEgJiYgCisJCQkgICAgIChtYm94LT5jbWQuY29tbWFuZCA9PSAweDA2IHx8IAorCQkJICAgICAgbWJveC0+Y21kLmNvbW1hbmQgPT0gMHgxNikgICkgKXsKKworCQkJCSsrY2hhbi0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9hZHB0cl9jbW5kX09LOworCQkJfSBlbHNlIHsKKwkJCQkrK2NoYW4tPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfYWRwdHJfY21uZF90aW1lb3V0OworCQkJfQorCisJCQkgIC8qIGNvcHkgdGhlIHJlc3VsdCBiYWNrIHRvIG91ciBidWZmZXIgKi8KKwkJCW1lbWNweSgmeDI1X3VkcF9wa3QtPmNibG9jay5jb21tYW5kLCAmbWJveC0+Y21kLCBzaXplb2YoVFgyNUNtZCkpOworCisgICAgICAJICAgICAgICAgCWlmKG1ib3gtPmNtZC5sZW5ndGgpIHsKKyAgICAgICAgCSAgICAgICAgICAgICAgIG1lbWNweSgmeDI1X3VkcF9wa3QtPmRhdGEsICZtYm94LT5kYXRhLCBtYm94LT5jbWQubGVuZ3RoKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCX0gLy9zd2l0Y2gKKworICAgICAgICB9CisgICAgCisgICAgICAgIC8qIEZpbGwgVURQIFRUTCAqLworCisJeDI1X3VkcF9wa3QtPmlwX3BrdC50dGwgPSBjYXJkLT53YW5kZXYudHRsOworICAgICAgICBsZW4gPSByZXBseV91ZHAoY2FyZC0+dS54LnVkcF9wa3RfZGF0YSwgbWJveC0+Y21kLmxlbmd0aCk7CisKKworICAgICAgICBpZihjYXJkLT51LngudWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fTkVUV09SSykgeworCQkKKwkJZXJyID0geDI1X3NlbmQoY2FyZCwgbGNuLCAwLCBsZW4sIGNhcmQtPnUueC51ZHBfcGt0X2RhdGEpOworCQlpZiAoIWVycikgCisJCQkrK2NoYW4tPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfYWRwdHJfc2VuZF9wYXNzZWQ7CisJCWVsc2UKKwkJCSsrY2hhbi0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9hZHB0cl9zZW5kX2ZhaWxlZDsKKwkKKwl9IGVsc2UgeworCisJCS8qIEFsbG9jYXRlIHNvY2tldCBidWZmZXIgKi8KKwkJaWYoKG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbikpICE9IE5VTEwpIHsKKwkJCXZvaWQgKmJ1ZjsKKworCQkJLyogY29weSBkYXRhIGludG8gbmV3X3NrYiAqLworCQkJYnVmID0gc2tiX3B1dChuZXdfc2tiLCBsZW4pOworCQkJbWVtY3B5KGJ1ZiwgY2FyZC0+dS54LnVkcF9wa3RfZGF0YSwgbGVuKTsKKyAgICAgICAgCisJCQkvKiBEZWNhcHN1bGF0ZSBwYWNrZXQgYW5kIHBhc3MgaXQgdXAgdGhlIHByb3RvY29sIAorCQkJICAgc3RhY2sgKi8KKwkJCW5ld19za2ItPmRldiA9IGRldjsKKwkKKwkJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSkKKyAgICAgICAgICAgICAgICAgICAgICAgIAluZXdfc2tiLT5wcm90b2NvbCA9IGh0b25zKFgyNV9QUk9UKTsKKwkJCWVsc2UgCisJCQkJbmV3X3NrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc2tiLT5tYWMucmF3ID0gbmV3X3NrYi0+ZGF0YTsKKworCQkJbmV0aWZfcngobmV3X3NrYik7CisJCQkrK2NoYW4tPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfcGFzc2VkX3RvX3N0YWNrOworICAgICAgICAgICAgCQorCQl9IGVsc2UgeworCQkJKytjaGFuLT5waXBlX21nbXRfc3RhdC5VRFBfUElQRV9tZ210X25vX3NvY2tldDsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkiJXM6IFVEUCBtZ210IGNtbmQsIG5vIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSFcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAJfQorICAgICAgICB9CisKKwljYXJkLT51LngudWRwX3BrdF9sZ3RoID0gMDsKKworCXJldHVybiAxOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXRlcm1pbmUgd2hhdCB0eXBlIG9mIFVEUCBjYWxsIGl0IGlzLiBEUlZTVEFUUyBvciBYUElQRThORCA/CisgKi8KK3N0YXRpYyBpbnQgdWRwX3BrdF90eXBlKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzZGxhX3QqIGNhcmQgKQoreworCXgyNV91ZHBfcGt0X3QgKngyNV91ZHBfcGt0ID0gKHgyNV91ZHBfcGt0X3QgKilza2ItPmRhdGE7CisKKyAgICAgICAgaWYoKHgyNV91ZHBfcGt0LT5pcF9wa3QucHJvdG9jb2wgPT0gVURQTUdNVF9VRFBfUFJPVE9DT0wpICYmCisJCSh4MjVfdWRwX3BrdC0+aXBfcGt0LnZlcl9pbmV0X2hkcl9sZW5ndGggPT0gMHg0NSkgJiYKKwkJKHgyNV91ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydCA9PSBudG9ocyhjYXJkLT53YW5kZXYudWRwX3BvcnQpKSAmJgorCQkoeDI1X3VkcF9wa3QtPndwX21nbXQucmVxdWVzdF9yZXBseSA9PSBVRFBNR01UX1JFUVVFU1QpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFzdHJuY21wKHgyNV91ZHBfcGt0LT53cF9tZ210LnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVURQTUdNVF9YUElQRV9TSUdOQVRVUkUsIDgpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVEUF9YUElQRV9UWVBFOworCQkJfWVsc2V7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVEUCBQYWNrZXQsIEZhaWxlZCBTaWduYXR1cmUgIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQl9CisJfQorCisgICAgICAgIHJldHVybiBVRFBfSU5WQUxJRF9UWVBFOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVwbHkgdG8gVURQIE1hbmFnZW1lbnQgc3lzdGVtLgorICogUmV0dXJuIG5vdGhpbmcuCisgKi8KK3N0YXRpYyBpbnQgcmVwbHlfdWRwKCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbWJveF9sZW4gKSAKK3sKKwl1bnNpZ25lZCBzaG9ydCBsZW4sIHVkcF9sZW5ndGgsIHRlbXAsIGlwX2xlbmd0aDsKKwl1bnNpZ25lZCBsb25nIGlwX3RlbXA7CisJaW50IGV2ZW5fYm91bmQgPSAwOworCisgIAorCXgyNV91ZHBfcGt0X3QgKngyNV91ZHBfcGt0ID0gKHgyNV91ZHBfcGt0X3QgKilkYXRhOyAKKworCS8qIFNldCBsZW5ndGggb2YgcGFja2V0ICovCisJbGVuID0gc2l6ZW9mKGlwX3BrdF90KSsgCisJICAgICAgc2l6ZW9mKHVkcF9wa3RfdCkrCisJICAgICAgc2l6ZW9mKHdwX21nbXRfdCkrCisJICAgICAgc2l6ZW9mKGNibG9ja190KSsKKwkgICAgICBtYm94X2xlbjsKKyAKKworCS8qIGZpbGwgaW4gVURQIHJlcGx5ICovCisJeDI1X3VkcF9wa3QtPndwX21nbXQucmVxdWVzdF9yZXBseSA9IFVEUE1HTVRfUkVQTFk7CisgIAorCS8qIGZpbGwgaW4gVURQIGxlbmd0aCAqLworCXVkcF9sZW5ndGggPSBzaXplb2YodWRwX3BrdF90KSsgCisJCSAgICAgc2l6ZW9mKHdwX21nbXRfdCkrCisJCSAgICAgc2l6ZW9mKGNibG9ja190KSsKKwkJICAgICBtYm94X2xlbjsgCisKKworCS8qIHB1dCBpdCBvbiBhbiBldmVuIGJvdW5kYXJ5ICovCisJaWYgKCB1ZHBfbGVuZ3RoICYgMHgwMDAxICkgeworCQl1ZHBfbGVuZ3RoICs9IDE7CisJCWxlbiArPSAxOworCQlldmVuX2JvdW5kID0gMTsKKwl9CisKKwl0ZW1wID0gKHVkcF9sZW5ndGg8PDgpfCh1ZHBfbGVuZ3RoPj44KTsKKwl4MjVfdWRwX3BrdC0+dWRwX3BrdC51ZHBfbGVuZ3RoID0gdGVtcDsKKwkgCisJLyogc3dhcCBVRFAgcG9ydHMgKi8KKwl0ZW1wID0geDI1X3VkcF9wa3QtPnVkcF9wa3QudWRwX3NyY19wb3J0OworCXgyNV91ZHBfcGt0LT51ZHBfcGt0LnVkcF9zcmNfcG9ydCA9IAorCQkJeDI1X3VkcF9wa3QtPnVkcF9wa3QudWRwX2RzdF9wb3J0OyAKKwl4MjVfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQgPSB0ZW1wOworCisKKworCS8qIGFkZCBVRFAgcHNldWRvIGhlYWRlciAqLworCXRlbXAgPSAweDExMDA7CisJKigodW5zaWduZWQgc2hvcnQgKikKKwkJKHgyNV91ZHBfcGt0LT5kYXRhK21ib3hfbGVuK2V2ZW5fYm91bmQpKSA9IHRlbXA7CQorCXRlbXAgPSAodWRwX2xlbmd0aDw8OCl8KHVkcF9sZW5ndGg+PjgpOworCSooKHVuc2lnbmVkIHNob3J0ICopCisJCSh4MjVfdWRwX3BrdC0+ZGF0YSttYm94X2xlbitldmVuX2JvdW5kKzIpKSA9IHRlbXA7CisJCSAKKwkvKiBjYWxjdWxhdGUgVURQIGNoZWNrc3VtICovCisJeDI1X3VkcF9wa3QtPnVkcF9wa3QudWRwX2NoZWNrc3VtID0gMDsKKworCXgyNV91ZHBfcGt0LT51ZHBfcGt0LnVkcF9jaGVja3N1bSA9IAorCQljYWxjX2NoZWNrc3VtKCZkYXRhW1VEUF9PRkZTRVRdLCB1ZHBfbGVuZ3RoK1VEUF9PRkZTRVQpOworCisJLyogZmlsbCBpbiBJUCBsZW5ndGggKi8KKwlpcF9sZW5ndGggPSBsZW47CisJdGVtcCA9IChpcF9sZW5ndGg8PDgpfChpcF9sZW5ndGg+PjgpOworCXgyNV91ZHBfcGt0LT5pcF9wa3QudG90YWxfbGVuZ3RoID0gdGVtcDsKKyAgCisJLyogc3dhcCBJUCBhZGRyZXNzZXMgKi8KKwlpcF90ZW1wID0geDI1X3VkcF9wa3QtPmlwX3BrdC5pcF9zcmNfYWRkcmVzczsKKwl4MjVfdWRwX3BrdC0+aXBfcGt0LmlwX3NyY19hZGRyZXNzID0gCisJCQkJeDI1X3VkcF9wa3QtPmlwX3BrdC5pcF9kc3RfYWRkcmVzczsKKwl4MjVfdWRwX3BrdC0+aXBfcGt0LmlwX2RzdF9hZGRyZXNzID0gaXBfdGVtcDsKKworCQkgCisJLyogZmlsbCBpbiBJUCBjaGVja3N1bSAqLworCXgyNV91ZHBfcGt0LT5pcF9wa3QuaGRyX2NoZWNrc3VtID0gMDsKKwl4MjVfdWRwX3BrdC0+aXBfcGt0Lmhkcl9jaGVja3N1bSA9IGNhbGNfY2hlY2tzdW0oZGF0YSwgc2l6ZW9mKGlwX3BrdF90KSk7CisKKwlyZXR1cm4gbGVuOworfSAvKiByZXBseV91ZHAgKi8KKwordW5zaWduZWQgc2hvcnQgY2FsY19jaGVja3N1bSAoY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wOyAKKwl1bnNpZ25lZCBsb25nIHN1bT0wOworCWludCBpOworCisJZm9yKCBpID0gMDsgaSA8bGVuOyBpKz0yICkgeworCQltZW1jcHkoJnRlbXAsJmRhdGFbaV0sMik7CisJCXN1bSArPSAodW5zaWduZWQgbG9uZyl0ZW1wOworCX0KKworCXdoaWxlIChzdW0gPj4gMTYgKSB7CisJCXN1bSA9IChzdW0gJiAweGZmZmZVTCkgKyAoc3VtID4+IDE2KTsKKwl9CisKKwl0ZW1wID0gKHVuc2lnbmVkIHNob3J0KXN1bTsKKwl0ZW1wID0gfnRlbXA7CisKKwlpZiggdGVtcCA9PSAwICkgCisJCXRlbXAgPSAweGZmZmY7CisKKwlyZXR1cm4gdGVtcDsJCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0b3JlIGEgVURQIG1hbmFnZW1lbnQgcGFja2V0IGZvciBsYXRlciBwcm9jZXNzaW5nLgorICovCisKK3N0YXRpYyBpbnQgc3RvcmVfdWRwX21nbXRfcGt0KGludCB1ZHBfdHlwZSwgY2hhciB1ZHBfcGt0X3NyYywgc2RsYV90KiBjYXJkLAorCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIGludCBsY24pCit7CisgICAgICAgIGludCB1ZHBfcGt0X3N0b3JlZCA9IDA7CisKKyAgICAgICAgaWYoIWNhcmQtPnUueC51ZHBfcGt0X2xndGggJiYgKHNrYi0+bGVuIDw9IE1BWF9MR1RIX1VEUF9NR05UX1BLVCkpeworICAgICAgICAgICAgICAgIGNhcmQtPnUueC51ZHBfcGt0X2xndGggPSBza2ItPmxlbjsKKyAgICAgICAgICAgICAgICBjYXJkLT51LngudWRwX3R5cGUgPSB1ZHBfdHlwZTsKKyAgICAgICAgICAgICAgICBjYXJkLT51LngudWRwX3BrdF9zcmMgPSB1ZHBfcGt0X3NyYzsKKyAgICAgICAgICAgICAgICBjYXJkLT51LngudWRwX2xjbiA9IGxjbjsKKwkJY2FyZC0+dS54LnVkcF9kZXYgPSBkZXY7CisgICAgICAgICAgICAgICAgbWVtY3B5KGNhcmQtPnUueC51ZHBfcGt0X2RhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworICAgICAgICAgICAgICAgIGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfVURQX1BLVDsKKyAgICAgICAgICAgICAgICB1ZHBfcGt0X3N0b3JlZCA9IDE7CisKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVSUk9SOiBVRFAgcGFja2V0IG5vdCBzdG9yZWQgZm9yIExDTiAlZFxuIiwgCisJCQkJCQkJY2FyZC0+ZGV2bmFtZSxsY24pOworCX0KKworICAgICAgICBpZih1ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9TVEFDSyl7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9ZWxzZXsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0KKworICAgICAgICByZXR1cm4odWRwX3BrdF9zdG9yZWQpOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbCB0aGUgcHBwX3ByaXZhdGVfYXJlYSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfeDI1X2NoYW5uZWxfc3RydWN0KCB4MjVfY2hhbm5lbF90ICpjaGFuICkKK3sKKwltZW1zZXQoJmNoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2VudHJ5LDAsc2l6ZW9mKGlmX3NlbmRfc3RhdF90KSk7CisJbWVtc2V0KCZjaGFuLT5yeF9pbnRyX3N0YXQucnhfaW50cl9ub19zb2NrZXQsMCxzaXplb2YocnhfaW50cl9zdGF0X3QpKTsKKwltZW1zZXQoJmNoYW4tPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfa21hbGxvY19lcnIsMCxzaXplb2YocGlwZV9tZ210X3N0YXRfdCkpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgR2xvYmFsIFN0YXRpc3RpY3MKKyAqLworc3RhdGljIHZvaWQgaW5pdF9nbG9iYWxfc3RhdGlzdGljcyggc2RsYV90ICpjYXJkICkKK3sKKwltZW1zZXQoJmNhcmQtPnN0YXRpc3RpY3MuaXNyX2VudHJ5LDAsc2l6ZW9mKGdsb2JhbF9zdGF0c190KSk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNNUCBTdXBwb3J0CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIFM1MDhfUzUxNF9sb2NrKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKQoreworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT53YW5kZXYubG9jaywgKnNtcF9mbGFncyk7Cit9CitzdGF0aWMgdm9pZCBTNTA4X1M1MTRfdW5sb2NrKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKQoreworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPndhbmRldi5sb2NrLCAqc21wX2ZsYWdzKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHgyNV90aW1lcl9yb3V0aW5lCisgKgorICogCUEgbW9yZSBlZmZpY2llbnQgcG9sbGluZyByb3V0aW5lLiAgRWFjaCBoYWxmIGEgc2Vjb25kCisgKiAJcXVldWUgYSBwb2xsaW5nIHRhc2suIFdlIHdhbnQgdG8gZG8gdGhlIHBvbGxpbmcgaW4gYSAKKyAqIAl0YXNrIG5vdCB0aW1lciwgYmVjYXVzZSB0aW1lciBydW5zIGluIGludGVycnVwdCB0aW1lLgorICoKKyAqIAlGSVhNRSBQb2xsaW5nIHNob3VsZCBiZSByZXRoaW5rZWQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgeDI1X3RpbWVyX3JvdXRpbmUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXNkbGFfdCAqY2FyZCA9IChzZGxhX3QqKWRhdGE7CisKKwlpZiAoIWNhcmQtPndhbmRldi5kZXYpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogU3RvcHBpbmcgdGhlIFgyNSBQb2xsIFRpbWVyOiBObyBEZXYuXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNhcmQtPm9wZW5fY250ICE9IGNhcmQtPnUueC5udW1fb2ZfY2gpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogU3RvcHBpbmcgdGhlIFgyNSBQb2xsIFRpbWVyOiBJbnRlcmZhY2UgZG93bi5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0b3BwaW5nIHRoZSBYMjUgUG9sbCBUaW1lcjogU2h1dHRpbmcgZG93bi5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybjsKKwl9CisJCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisJCXRyaWdnZXJfeDI1X3BvbGwoY2FyZCk7CisJfQorCQorCWNhcmQtPnUueC54MjVfdGltZXIuZXhwaXJlcz1qaWZmaWVzKyhIWj4+MSk7CisJYWRkX3RpbWVyKCZjYXJkLT51LngueDI1X3RpbWVyKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgZGlzYWJsZV9jb21tX3NodXRkb3duKHNkbGFfdCAqY2FyZCkKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKworCS8qIFR1cm4gb2YgaW50ZXJydXRwcyAqLworCW1ib3gtPmRhdGFbMF0gPSAwOworCWlmIChjYXJkLT5ody5md2lkID09IFNGSURfWDI1XzUwOCl7CisJCW1ib3gtPmRhdGFbMV0gPSBjYXJkLT5ody5pcnE7CisJCW1ib3gtPmRhdGFbMl0gPSAyOworCQltYm94LT5jbWQubGVuZ3RoID0gMzsKKwl9ZWxzZSB7CisJIAltYm94LT5jbWQubGVuZ3RoICA9IDE7CisJfQorCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X1NFVF9JTlRFUlJVUFRfTU9ERTsKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSU5URVJSVVBUIE9GRiBGQUlFRCAleFxuIixlcnIpOworCisJLyogQnJpbmcgZG93biBIRExDICovCisJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfSERMQ19MSU5LX0NMT1NFOworCW1ib3gtPmNtZC5sZW5ndGggID0gMDsKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTElOSyBDTE9TRUQgRkFJTEVEICV4XG4iLGVycik7CisKKworCS8qIEJyaW5kIGRvd24gRFRSICovCisJbWJveC0+ZGF0YVswXSA9IDA7CisJbWJveC0+ZGF0YVsyXSA9IDA7CisJbWJveC0+ZGF0YVsxXSA9IDB4MDE7CisJbWJveC0+Y21kLmxlbmd0aCAgPSAzOworCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X1NFVF9HTE9CQUxfVkFSUzsKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRFRSIERPV04gRkFJTEVEICV4XG4iLGVycik7CisKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKioqKioqIEVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhZHJ2LmMgYi9kcml2ZXJzL25ldC93YW4vc2RsYWRydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YmM2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vc2RsYWRydi5jCkBAIC0wLDAgKzEsMjMxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHNkbGFkcnYuYwlTRExBIFN1cHBvcnQgTW9kdWxlLiAgTWFpbiBtb2R1bGUuCisqCisqCQlUaGlzIG1vZHVsZSBpcyBhIGxpYnJhcnkgb2YgY29tbW9uIGhhcmR3YXJlLXNwZWNpZmljIGZ1bmN0aW9ucworKgkJdXNlZCBieSBhbGwgU2FuZ29tYSBkcml2ZXJzLgorKgorKiBBdXRob3I6CUdpZGVvbiBIYWNrCQorKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk1LTIwMDAgU2FuZ29tYSBUZWNobm9sb2dpZXMgSW5jLgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBNYXIgMjAsIDIwMDEgIE5lbmFkIENvcmJpYwlBZGRlZCB0aGUgYXV0b19wY2lfY2ZnIGZpbGVkLCB0byBzdXBwb3J0CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBQQ0lTTE9UICMwLiAKKyogQXByIDA0LCAyMDAwICBOZW5hZCBDb3JiaWMJRml4ZWQgdGhlIGF1dG8gbWVtb3J5IGRldGVjdGlvbiBjb2RlLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWVtb3J5IHRlc3QgYXQgYWRkcmVzcyAweEM4MDAwLgorKiBNYXIgMDksIDIwMDAgIE5lbmFkIENvcmJpYyAJQWRkZWQgR2lkZW9uJ3MgQnVnIEZpeDogY2xlYXIgcGNpCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCBmbGFncyBvbiBpbml0aWFsIGxvYWQuCisqIEp1biAwMiwgMTk5OSAgR2lkZW9uIEhhY2sgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBTNTE0IGFkYXB0ZXIuCisqCQkJCVVwZGF0ZXMgZm9yIExpbnV4IDIuMi5YIGtlcm5lbHMuCQorKiBTZXAgMTcsIDE5OTgJSmFzcHJlZXQgU2luZ2gJVXBkYXRlcyBmb3IgbGludXggMi4yLlgga2VybmVscworKiBEZWMgMjAsIDE5OTYJR2VuZSBLb3ppbglWZXJzaW9uIDMuMC4wLiBDb21wbGV0ZSBvdmVyaGF1bC4KKyogSnVsIDEyLCAxOTk2CUdlbmUgS296aW4JQ2hhbmdlcyBmb3IgTGludXggMi4wIGNvbXBhdGliaWxpdHkuCisqIEp1biAxMiwgMTk5NglHZW5lIEtvemluIAlBZGRlZCBzdXBwb3J0IGZvciBTNTAzIGNhcmQuCisqIEFwciAzMCwgMTk5NglHZW5lIEtvemluCVNETEEgaGFyZHdhcmUgaW50ZXJydXB0IGlzIGFja25vd2xlZGdlZCBiZWZvcmUKKyoJCQkJY2FsbGluZyBwcm90b2NvbHNwZWNpZmljIElTUi4KKyoJCQkJUmVnaXN0ZXIgSS9PIHBvcnRzIHdpdGggTGludXgga2VybmVsLgorKgkJCQlNaXNjZWxsYW5lb3VzIGJ1ZyBmaXhlcy4KKyogRGVjIDIwLCAxOTk1CUdlbmUgS296aW4JRml4ZWQgYSBidWcgaW4gaW50ZXJydXB0IHJvdXRpbmUuCisqIE9jdCAxNCwgMTk5NQlHZW5lIEtvemluCUluaXRpYWwgdmVyc2lvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5vdGVzOgorICogLS0tLS0tCisgKiAxLiBUaGlzIGNvZGUgaXMgbWVudCB0byBiZSBzeXN0ZW0taW5kZXBlbmRlbnQgKGFzIG11Y2ggYXMgcG9zc2libGUpLiAgVG8KKyAqICAgIGFjaGl2ZSB0aGlzLCB2YXJpb3VzIG1hY3JvcyBhcmUgdXNlZCB0byBoaWRlIHN5c3RlbS1zcGVjaWZpYyBpbnRlcmZhY2VzLgorICogICAgVG8gY29tcGlsZSB0aGlzIGNvZGUsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBtdXN0IGJlIGRlZmluZWQ6CisgKgorICoJUGxhdGZvcm0JRGVmaW5lCisgKgktLS0tLS0tLQktLS0tLS0KKyAqCUxpbnV4CQlfTElOVVhfCisgKglTQ08gVW5peAlfU0NPX1VOSVhfCisgKgorICogMi4gU3VwcG9ydGVkIGFkYXB0ZXIgdHlwZXM6CisgKgorICoJUzUwMkEKKyAqCUVTNTAyQSAoUzUwMkUpCisgKglTNTAzCisgKglTNTA3CisgKglTNTA4IChTNTA5KQorICoKKyAqIDMuIFM1MDJBIE5vdGVzOgorICoKKyAqCVRoZXJlIGlzIG5vIHNlcGFyYXRlIERQTSB3aW5kb3cgZW5hYmxlL2Rpc2FibGUgY29udHJvbCBpbiBTNTAyQS4gIEl0CisgKglvcGVucyBpbW1lZGlhdGVseSBhZnRlciBhIHdpbmRvdyBudW1iZXIgaXQgd3JpdHRlbiB0byB0aGUgSE1DUgorICoJcmVnaXN0ZXIuICBUbyBjbG9zZSB0aGUgd2luZG93LCBITUNSIGhhcyB0byBiZSB3cml0dGVuIGEgdmFsdWUKKyAqCT8/Pz8xMTExYiAoZS5nLiAweDBGIG9yIDB4RkYpLgorICoKKyAqCVM1MDJBIERQTSB3aW5kb3cgY2Fubm90IGJlIGxvY2F0ZWQgYXQgb2Zmc2V0IEUwMDAgKGUuZy4gMHhBRTAwMCkuCisgKgorICoJVGhlcmUgc2hvdWxkIGJlIGEgZGVsYXkgb2YgPz8/IGJlZm9yZSByZWFkaW5nIGJhY2sgUzUwMkEgc3RhdHVzCisgKglyZWdpc3Rlci4KKyAqCisgKiA0LiBTNTAyRSBOb3RlczoKKyAqCisgKglTNTAyRSBoYXMgYSBoL3cgYnVnOiBhbHRob3VnaCBkZWZhdWx0IElSUSBsaW5lIHN0YXRlIGlzIEhJR0gsIGVuYWJsaW5nCisgKglpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgYml0IDEgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKEJBU0UpIHRvICcxJworICoJY2F1c2VzIGl0IHRvIGdvIExPVyEgVGhlcmVmb3JlLCBkaXNhYmxpbmcgaW50ZXJydXB0cyBieSBzZXR0aW5nIHRoYXQKKyAqCWJpdCB0byAnMCcgY2F1c2VzIGxvdy10by1oaWdoIHRyYW5zaXRpb24gb24gSVJRIGxpbmUgKGdob3N0eQorICoJaW50ZXJydXB0KS4gVGhlIHNhbWUgb2NjdXJzIHdoZW4gZGlzYWJsaW5nIENQVSBieSByZXNldHRpbmcgYml0IDAgb2YKKyAqCUNQVSBjb250cm9sIHJlZ2lzdGVyIChCQVNFKzMpIC0gc2VlIHRoZSBuZXh0IG5vdGUuCisgKgorICoJUzUwMkUgQ1BVIGFuZCBEUE0gY29udHJvbCBpcyBsaW1pdGVkOgorICoKKyAqCW8gQ1BVIGNhbm5vdCBiZSBzdG9wcGVkIGluZGVwZW5kZW50bHkuIFJlc2V0dGluZyBiaXQgMCBvZiB0aGUgQ1BVaQorICoJICBjb250cm9sIHJlZ2lzdGVyIChCQVNFKzMpIHNodXRzIHRoZSBib2FyZCBkb3duIGVudGlyZWx5LCBpbmNsdWRpbmcKKyAqCSAgRFBNOworICoKKyAqCW8gRFBNIGFjY2VzcyBjYW5ub3QgYmUgY29udHJvbGxlZCBkeW5hbWljYWxseS4gT25lcyBDUFUgaXMgc3RhcnRlZCwKKyAqCSAgYml0IDEgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKEJBU0UpIGlzIHVzZWQgdG8gZW5hYmxlL2Rpc2FibGUgSVJRLAorICoJICBzbyB0aGF0IGFjY2VzcyB0byBzaGFyZWQgbWVtb3J5IGNhbm5vdCBiZSBkaXNhYmxlZCB3aGlsZSBDUFUgaXMKKyAqCSAgcnVubmluZy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lCV9MSU5VWF8KKworI2lmCWRlZmluZWQoX0xJTlVYXykJLyoqKioqKiBMaW51eCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpLCBhbmQgb3RoZXIgdXNlZnVsIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIG9mZnNldG9mKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogaW5saW5lIG1lbXNldCgpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIHN1cHBvcnQgZm9yIGxvYWRhYmxlIG1vZHVsZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CS8qIGZvciBqaWZmaWVzLCBIWiwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3NkbGFkcnYuaD4JLyogQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvc2RsYXNmbS5oPgkvKiBTRExBIGZpcm13YXJlIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3NkbGFwY2kuaD4JLyogU0RMQSBQQ0kgaGFyZHdhcmUgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4JCS8qIFBDSSBkZWZpbmVzIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CQkvKiBmb3IgaW5iKCksIG91dGIoKSwgZXRjLiAqLworCisjZGVmaW5lIF9JTkIocG9ydCkJCShpbmIocG9ydCkpCisjZGVmaW5lIF9PVVRCKHBvcnQsIGJ5dGUpCShvdXRiKChieXRlKSwocG9ydCkpKQorI2RlZmluZQlTWVNURU1fVElDSwkJamlmZmllcworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisKKyNlbGlmCWRlZmluZWQoX1NDT19VTklYXykJLyoqKioqKiBTQ08gVW5peCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYJIWRlZmluZWQoSU5LRVJORUwpCisjZXJyb3IJVGhpcyBjb2RlIE1VU1QgYmUgY29tcGlsZWQgaW4ga2VybmVsIG1vZGUhCisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc2RsYWRydi5oPgkvKiBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxzeXMvc2RsYXNmbS5oPgkvKiBTRExBIGZpcm13YXJlIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPHN5cy9pbmxpbmUuaD4JCS8qIGZvciBpbmIoKSwgb3V0YigpLCBldGMuICovCisjZGVmaW5lIF9JTkIocG9ydCkJCShpbmIocG9ydCkpCisjZGVmaW5lIF9PVVRCKHBvcnQsIGJ5dGUpCShvdXRiKChwb3J0KSwoYnl0ZSkpKQorI2RlZmluZQlTWVNURU1fVElDSwkJbGJvbHQKKworI2Vsc2UKKyNlcnJvcglVbmtub3duIHN5c3RlbSB0eXBlIQorI2VuZGlmCisKKyNkZWZpbmUJTU9EX1ZFUlNJT04JMworI2RlZmluZQlNT0RfUkVMRUFTRQkwCisKKyNkZWZpbmUJU0RMQV9JT0RFTEFZCTEwMAkvKiBJL08gUmQvV3IgZGVsYXksIDEwIHdvcmtzIGZvciA0ODZEWDItNjYgKi8KKyNkZWZpbmUJRVhFQ19ERUxBWQkyMAkvKiBzaGFyZWQgbWVtb3J5IGFjY2VzcyBkZWxheSwgbWtzICovCisjZGVmaW5lCUVYRUNfVElNRU9VVAkoSFoqMikJLyogY29tbWFuZCB0aW1lb3V0LCBpbiB0aWNrcyAqLworCisvKiBJL08gcG9ydCBhZGRyZXNzIHJhbmdlICovCisjZGVmaW5lIFM1MDJBX0lPUkFOR0UJMworI2RlZmluZSBTNTAyRV9JT1JBTkdFCTQKKyNkZWZpbmUgUzUwM19JT1JBTkdFCTMKKyNkZWZpbmUgUzUwN19JT1JBTkdFCTQKKyNkZWZpbmUgUzUwOF9JT1JBTkdFCTQKKworLyogTWF4aW11bSBhbW91bnQgb2YgbWVtb3J5ICovCisjZGVmaW5lIFM1MDJfTUFYTUVNCTB4MTAwMDBMCisjZGVmaW5lIFM1MDNfTUFYTUVNCTB4MTAwMDBMCisjZGVmaW5lIFM1MDdfTUFYTUVNCTB4NDAwMDBMCisjZGVmaW5lIFM1MDhfTUFYTUVNCTB4NDAwMDBMCisKKy8qIE1pbmltdW0gYW1vdW50IG9mIG1lbW9yeSAqLworI2RlZmluZSBTNTAyX01JTk1FTQkweDgwMDBMCisjZGVmaW5lIFM1MDNfTUlOTUVNCTB4ODAwMEwKKyNkZWZpbmUgUzUwN19NSU5NRU0JMHgyMDAwMEwKKyNkZWZpbmUgUzUwOF9NSU5NRU0JMHgyMDAwMEwKKyNkZWZpbmUgTk9fUE9SVCAgICAgICAgIC0xCisKKworCisKKworLyoqKioqKiBGdW5jdGlvbiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhhcmR3YXJlLXNwZWNpZmljIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBzZGxhX2RldGVjdAkoc2RsYWh3X3QqIGh3KTsKK3N0YXRpYyBpbnQgc2RsYV9hdXRvZHBtCShzZGxhaHdfdCogaHcpOworc3RhdGljIGludCBzZGxhX3NldGRwbQkoc2RsYWh3X3QqIGh3KTsKK3N0YXRpYyBpbnQgc2RsYV9sb2FkCShzZGxhaHdfdCogaHcsIHNmbV90KiBzZm0sIHVuc2lnbmVkIGxlbik7CitzdGF0aWMgaW50IHNkbGFfaW5pdAkoc2RsYWh3X3QqIGh3KTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNkbGFfbWVtdGVzdCAoc2RsYWh3X3QqIGh3KTsKK3N0YXRpYyBpbnQgc2RsYV9ib290Y2ZnCShzZGxhaHdfdCogaHcsIHNmbV9pbmZvX3QqIHNmbWluZm8pOworc3RhdGljIHVuc2lnbmVkIGNoYXIgbWFrZV9jb25maWdfYnl0ZSAoc2RsYWh3X3QqIGh3KTsKK3N0YXRpYyBpbnQgc2RsYV9zdGFydAkoc2RsYWh3X3QqIGh3LCB1bnNpZ25lZCBhZGRyKTsKKworc3RhdGljIGludCBpbml0X3M1MDJhCShzZGxhaHdfdCogaHcpOworc3RhdGljIGludCBpbml0X3M1MDJlCShzZGxhaHdfdCogaHcpOworc3RhdGljIGludCBpbml0X3M1MDMJKHNkbGFod190KiBodyk7CitzdGF0aWMgaW50IGluaXRfczUwNwkoc2RsYWh3X3QqIGh3KTsKK3N0YXRpYyBpbnQgaW5pdF9zNTA4CShzZGxhaHdfdCogaHcpOworICAgICAgICAgICAgCitzdGF0aWMgaW50IGRldGVjdF9zNTAyYQkoaW50IHBvcnQpOworc3RhdGljIGludCBkZXRlY3RfczUwMmUJKGludCBwb3J0KTsKK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MDMJKGludCBwb3J0KTsKK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MDcJKGludCBwb3J0KTsKK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MDgJKGludCBwb3J0KTsKK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MTQgIChzZGxhaHdfdCogaHcpOworc3RhdGljIGludCBmaW5kX3M1MTRfYWRhcHRlcihzZGxhaHdfdCogaHcsIGNoYXIgZmluZF9maXJzdF9TNTE0X2NhcmQpOworCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgcGVla19ieV80ICh1bnNpZ25lZCBsb25nIHNyYywgdm9pZCogYnVmLCB1bnNpZ25lZCBsZW4pOworc3RhdGljIHZvaWQgcG9rZV9ieV80ICh1bnNpZ25lZCBsb25nIGRlc3QsIHZvaWQqIGJ1ZiwgdW5zaWduZWQgbGVuKTsKK3N0YXRpYyBpbnQgY2FsaWJyYXRlX2RlbGF5IChpbnQgbWtzKTsKK3N0YXRpYyBpbnQgZ2V0X29wdGlvbl9pbmRleCAodW5zaWduZWQqIG9wdGxpc3QsIHVuc2lnbmVkIG9wdHZhbCk7CitzdGF0aWMgdW5zaWduZWQgY2hlY2tfbWVtcmVnaW9uICh2b2lkKiBwdHIsIHVuc2lnbmVkIGxlbik7CitzdGF0aWMgdW5zaWduZWQJdGVzdF9tZW1yZWdpb24gKHZvaWQqIHB0ciwgdW5zaWduZWQgbGVuKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjaGVja3N1bSAodW5zaWduZWQgY2hhciogYnVmLCB1bnNpZ25lZCBsZW4pOworc3RhdGljIGludCBpbml0X3BjaV9zbG90KHNkbGFod190ICopOworCitzdGF0aWMgaW50IHBjaV9wcm9iZShzZGxhaHdfdCAqaHcpOworCisvKioqKioqIEdsb2JhbCBEYXRhICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5vdGU6IEFsbCBkYXRhIG11c3QgYmUgZXhwbGljaXRseSBpbml0aWFsaXplZCEhIQorICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzZGxhZHJ2X3BjaV90YmxbXSA9IHsKKwl7IFYzX1ZFTkRPUl9JRCwgVjNfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgfQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNkbGFkcnZfcGNpX3RibCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogcHJpdmF0ZSBkYXRhICovCitzdGF0aWMgY2hhciBtb2RuYW1lW10JPSAic2RsYWRydiI7CitzdGF0aWMgY2hhciBmdWxsbmFtZVtdCT0gIlNETEEgU3VwcG9ydCBNb2R1bGUiOworc3RhdGljIGNoYXIgY29weXJpZ2h0W10JPSAiKGMpIDE5OTUtMTk5OSBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuIjsKK3N0YXRpYyB1bnNpZ25lZAlleGVjX2lkbGU7CisKKy8qIEhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyAqIFRoZXNlIGFyZSBhcnJheXMgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zIHVzZWQgYnkgdmVyaWZpY2F0aW9uIHJvdXRpbmVzLgorICogVGhlIGZpcnN0IGVsZW1lbnQgb2YgZWFjaCBhcnJheSBpcyBpdHMgc2l6ZSAoaS5lLiBudW1iZXIgb2Ygb3B0aW9ucykuCisgKi8KK3N0YXRpYyB1bnNpZ25lZAlzNTAyX3BvcnRfb3B0aW9uc1tdID0KKwl7IDQsIDB4MjUwLCAweDMwMCwgMHgzNTAsIDB4MzYwIH0KKzsKK3N0YXRpYyB1bnNpZ25lZAlzNTAzX3BvcnRfb3B0aW9uc1tdID0KKwl7IDgsIDB4MjUwLCAweDI1NCwgMHgzMDAsIDB4MzA0LCAweDM1MCwgMHgzNTQsIDB4MzYwLCAweDM2NCB9Cis7CitzdGF0aWMgdW5zaWduZWQJczUwOF9wb3J0X29wdGlvbnNbXSA9CisJeyA4LCAweDI1MCwgMHgyNzAsIDB4MjgwLCAweDMwMCwgMHgzNTAsIDB4MzYwLCAweDM4MCwgMHgzOTAgfQorOworCitzdGF0aWMgdW5zaWduZWQgczUwMmFfaXJxX29wdGlvbnNbXSA9IHsgMCB9Oworc3RhdGljIHVuc2lnbmVkIHM1MDJlX2lycV9vcHRpb25zW10gPSB7IDQsIDIsIDMsIDUsIDcgfTsKK3N0YXRpYyB1bnNpZ25lZCBzNTAzX2lycV9vcHRpb25zW10gID0geyA1LCAyLCAzLCA0LCA1LCA3IH07CitzdGF0aWMgdW5zaWduZWQgczUwOF9pcnFfb3B0aW9uc1tdICA9IHsgOCwgMywgNCwgNSwgNywgMTAsIDExLCAxMiwgMTUgfTsKKworc3RhdGljIHVuc2lnbmVkIHM1MDJhX2RwbWJhc2Vfb3B0aW9uc1tdID0KK3sKKwkyOCwKKwkweEEwMDAwLCAweEEyMDAwLCAweEE0MDAwLCAweEE2MDAwLCAweEE4MDAwLCAweEFBMDAwLCAweEFDMDAwLAorCTB4QzAwMDAsIDB4QzIwMDAsIDB4QzQwMDAsIDB4QzYwMDAsIDB4QzgwMDAsIDB4Q0EwMDAsIDB4Q0MwMDAsCisJMHhEMDAwMCwgMHhEMjAwMCwgMHhENDAwMCwgMHhENjAwMCwgMHhEODAwMCwgMHhEQTAwMCwgMHhEQzAwMCwKKwkweEUwMDAwLCAweEUyMDAwLCAweEU0MDAwLCAweEU2MDAwLCAweEU4MDAwLCAweEVBMDAwLCAweEVDMDAwLAorfTsKK3N0YXRpYyB1bnNpZ25lZCBzNTA3X2RwbWJhc2Vfb3B0aW9uc1tdID0KK3sKKwkzMiwKKwkweEEwMDAwLCAweEEyMDAwLCAweEE0MDAwLCAweEE2MDAwLCAweEE4MDAwLCAweEFBMDAwLCAweEFDMDAwLCAweEFFMDAwLAorCTB4QjAwMDAsIDB4QjIwMDAsIDB4QjQwMDAsIDB4QjYwMDAsIDB4QjgwMDAsIDB4QkEwMDAsIDB4QkMwMDAsIDB4QkUwMDAsCisJMHhDMDAwMCwgMHhDMjAwMCwgMHhDNDAwMCwgMHhDNjAwMCwgMHhDODAwMCwgMHhDQTAwMCwgMHhDQzAwMCwgMHhDRTAwMCwKKwkweEUwMDAwLCAweEUyMDAwLCAweEU0MDAwLCAweEU2MDAwLCAweEU4MDAwLCAweEVBMDAwLCAweEVDMDAwLCAweEVFMDAwLAorfTsKK3N0YXRpYyB1bnNpZ25lZCBzNTA4X2RwbWJhc2Vfb3B0aW9uc1tdID0JLyogaW5jbC4gUzUwMkUgYW5kIFM1MDMgKi8KK3sKKwkzMiwKKwkweEEwMDAwLCAweEEyMDAwLCAweEE0MDAwLCAweEE2MDAwLCAweEE4MDAwLCAweEFBMDAwLCAweEFDMDAwLCAweEFFMDAwLAorCTB4QzAwMDAsIDB4QzIwMDAsIDB4QzQwMDAsIDB4QzYwMDAsIDB4QzgwMDAsIDB4Q0EwMDAsIDB4Q0MwMDAsIDB4Q0UwMDAsCisJMHhEMDAwMCwgMHhEMjAwMCwgMHhENDAwMCwgMHhENjAwMCwgMHhEODAwMCwgMHhEQTAwMCwgMHhEQzAwMCwgMHhERTAwMCwKKwkweEUwMDAwLCAweEUyMDAwLCAweEU0MDAwLCAweEU2MDAwLCAweEU4MDAwLCAweEVBMDAwLCAweEVDMDAwLCAweEVFMDAwLAorfTsKKworLyoKK3N0YXRpYyB1bnNpZ25lZAlzNTAyX2RwbXNpemVfb3B0aW9uc1tdID0geyAyLCAweDIwMDAsIDB4MTAwMDAgfTsKK3N0YXRpYyB1bnNpZ25lZAlzNTA3X2RwbXNpemVfb3B0aW9uc1tdID0geyAyLCAweDIwMDAsIDB4NDAwMCB9Oworc3RhdGljIHVuc2lnbmVkCXM1MDhfZHBtc2l6ZV9vcHRpb25zW10gPSB7IDEsIDB4MjAwMCB9OworKi8KKworc3RhdGljIHVuc2lnbmVkCXM1MDJhX3BjbGtfb3B0aW9uc1tdID0geyAyLCAzNjAwLCA3MjAwIH07CitzdGF0aWMgdW5zaWduZWQJczUwMmVfcGNsa19vcHRpb25zW10gPSB7IDUsIDM2MDAsIDUwMDAsIDcyMDAsIDgwMDAsIDEwMDAwIH07CitzdGF0aWMgdW5zaWduZWQJczUwM19wY2xrX29wdGlvbnNbXSAgPSB7IDMsIDcyMDAsIDgwMDAsIDEwMDAwIH07CitzdGF0aWMgdW5zaWduZWQJczUwN19wY2xrX29wdGlvbnNbXSAgPSB7IDEsIDEyMjg4IH07CitzdGF0aWMgdW5zaWduZWQJczUwOF9wY2xrX29wdGlvbnNbXSAgPSB7IDEsIDE2MDAwIH07CisKKy8qIEhvc3QgbWVtb3J5IGNvbnRyb2wgcmVnaXN0ZXIgbWFza3MgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHM1MDJhX2htY3JbXSA9Cit7CisJMHgxMCwgMHgxMiwgMHgxNCwgMHgxNiwgMHgxOCwgMHgxQSwgMHgxQywJLyogQTAwMDAgLSBBQzAwMCAqLworCTB4MjAsIDB4MjIsIDB4MjQsIDB4MjYsIDB4MjgsIDB4MkEsIDB4MkMsCS8qIEMwMDAwIC0gQ0MwMDAgKi8KKwkweDAwLCAweDAyLCAweDA0LCAweDA2LCAweDA4LCAweDBBLCAweDBDLAkvKiBEMDAwMCAtIERDMDAwICovCisJMHgzMCwgMHgzMiwgMHgzNCwgMHgzNiwgMHgzOCwgMHgzQSwgMHgzQywJLyogRTAwMDAgLSBFQzAwMCAqLworfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHM1MDJlX2htY3JbXSA9Cit7CisJMHgxMCwgMHgxMiwgMHgxNCwgMHgxNiwgMHgxOCwgMHgxQSwgMHgxQywgMHgxRSwJLyogQTAwMDAgLSBBRTAwMCAqLworCTB4MjAsIDB4MjIsIDB4MjQsIDB4MjYsIDB4MjgsIDB4MkEsIDB4MkMsIDB4MkUsCS8qIEMwMDAwIC0gQ0UwMDAgKi8KKwkweDAwLCAweDAyLCAweDA0LCAweDA2LCAweDA4LCAweDBBLCAweDBDLCAweDBFLAkvKiBEMDAwMCAtIERFMDAwICovCisJMHgzMCwgMHgzMiwgMHgzNCwgMHgzNiwgMHgzOCwgMHgzQSwgMHgzQywgMHgzRSwJLyogRTAwMDAgLSBFRTAwMCAqLworfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHM1MDdfaG1jcltdID0KK3sKKwkweDAwLCAweDAyLCAweDA0LCAweDA2LCAweDA4LCAweDBBLCAweDBDLCAweDBFLAkvKiBBMDAwMCAtIEFFMDAwICovCisJMHg0MCwgMHg0MiwgMHg0NCwgMHg0NiwgMHg0OCwgMHg0QSwgMHg0QywgMHg0RSwJLyogQjAwMDAgLSBCRTAwMCAqLworCTB4ODAsIDB4ODIsIDB4ODQsIDB4ODYsIDB4ODgsIDB4OEEsIDB4OEMsIDB4OEUsCS8qIEMwMDAwIC0gQ0UwMDAgKi8KKwkweEMwLCAweEMyLCAweEM0LCAweEM2LCAweEM4LCAweENBLCAweENDLCAweENFLAkvKiBFMDAwMCAtIEVFMDAwICovCit9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgczUwOF9obWNyW10gPQoreworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCS8qIEEwMDAwIC0gQUUwMDAgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAkvKiBDMDAwMCAtIENFMDAwICovCisJMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwJLyogRDAwMDAgLSBERTAwMCAqLworCTB4MTgsIDB4MTksIDB4MUEsIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYsCS8qIEUwMDAwIC0gRUUwMDAgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHM1MDdfaXJxbWFza1tdID0KK3sKKwkweDAwLCAweDIwLCAweDQwLCAweDYwLCAweDgwLCAweEEwLCAweEMwLCAweEUwCit9OworCitzdGF0aWMgaW50IHBjaV9zbG90X2FyW01BWF9TNTE0X0NBUkRTXTsKKworLyoqKioqKiogS2VybmVsIExvYWRhYmxlIE1vZHVsZSBFbnRyeSBQb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTW9kdWxlICdpbnNlcnQnIGVudHJ5IHBvaW50LgorICogbyBwcmludCBhbm5vdW5jZW1lbnQKKyAqIG8gaW5pdGlhbGl6ZSBzdGF0aWMgZGF0YQorICogbyBjYWxpYnJhdGUgU0RMQSBzaGFyZWQgbWVtb3J5IGFjY2VzcyBkZWxheS4KKyAqCisgKiBSZXR1cm46CTAJT2sKKyAqCQk8IDAJZXJyb3IuCisgKiBDb250ZXh0Oglwcm9jZXNzCisgKi8KKworc3RhdGljIGludCBfX2luaXQgc2RsYWRydl9pbml0KHZvaWQpCit7CisJaW50IGk9MDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzIHYldS4ldSAlc1xuIiwKKwkJZnVsbG5hbWUsIE1PRF9WRVJTSU9OLCBNT0RfUkVMRUFTRSwgY29weXJpZ2h0KTsKKwlleGVjX2lkbGUgPSBjYWxpYnJhdGVfZGVsYXkoRVhFQ19ERUxBWSk7CisjaWZkZWYgV0FOREVCVUcJCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGVjX2lkbGUgPSAlZFxuIiwgbW9kbmFtZSwgZXhlY19pZGxlKTsKKyNlbmRpZgkKKworCS8qIEluaXRpYWxpemUgdGhlIFBDSSBDYXJkIGFycmF5LCB3aGljaAorICAgICAgICAgKiB3aWxsIHN0b3JlIGZsYWdzLCB1c2VkIHRvIG1hcmsgCisgICAgICAgICAqIGNhcmQgaW5pdGlhbGl6YXRpb24gc3RhdGUgKi8KKwlmb3IgKGk9MDsgaTxNQVhfUzUxNF9DQVJEUzsgaSsrKQorCQlwY2lfc2xvdF9hcltpXSA9IDB4RkY7CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBNb2R1bGUgJ3JlbW92ZScgZW50cnkgcG9pbnQuCisgKiBvIHJlbGVhc2UgYWxsIHJlbWFpbmluZyBzeXN0ZW0gcmVzb3VyY2VzCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBzZGxhZHJ2X2NsZWFudXAodm9pZCkKK3sKK30KKworbW9kdWxlX2luaXQoc2RsYWRydl9pbml0KTsKK21vZHVsZV9leGl0KHNkbGFkcnZfY2xlYW51cCk7CisKKy8qKioqKioqIEtlcm5lbCBBUElzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCB1cCBhZGFwdGVyLgorICogbyBkZXRlY3QgYWRhcHRlciB0eXBlCisgKiBvIHZlcmlmeSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAqIG8gY2hlY2sgZm9yIGhhcmR3YXJlIGNvbmZsaWN0cworICogbyBzZXQgdXAgYWRhcHRlciBzaGFyZWQgbWVtb3J5CisgKiBvIHRlc3QgYWRhcHRlciBtZW1vcnkKKyAqIG8gbG9hZCBmaXJtd2FyZQorICogUmV0dXJuOgkwCW9rLgorICoJCTwgMAllcnJvcgorICovCisKK0VYUE9SVF9TWU1CT0woc2RsYV9zZXR1cCk7CisKK2ludCBzZGxhX3NldHVwIChzZGxhaHdfdCogaHcsIHZvaWQqIHNmbSwgdW5zaWduZWQgbGVuKQoreworCXVuc2lnbmVkKiBpcnFfb3B0CT0gTlVMTDsJLyogSVJRIG9wdGlvbnMgKi8KKwl1bnNpZ25lZCogZHBtYmFzZV9vcHQJPSBOVUxMOwkvKiBEUE0gd2luZG93IGJhc2Ugb3B0aW9ucyAqLworCXVuc2lnbmVkKiBwY2xrX29wdAk9IE5VTEw7CS8qIENQVSBjbG9jayByYXRlIG9wdGlvbnMgKi8KKwlpbnQgZXJyPTA7CisKKwlpZiAoc2RsYV9kZXRlY3QoaHcpKSB7CisgICAgICAgICAgICAgICAgaWYoaHctPnR5cGUgIT0gU0RMQV9TNTE0KQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIFNETEEgY2FyZCBmb3VuZCBhdCBwb3J0IDB4JVhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RuYW1lLCBody0+cG9ydCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmKGh3LT50eXBlICE9IFNETEFfUzUxNCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBmb3VuZCBTJTA0dSBjYXJkIGF0IHBvcnQgMHglWC5cbiIsCisgICAgICAgICAgICAgICAgbW9kbmFtZSwgaHctPnR5cGUsIGh3LT5wb3J0KTsKKworICAgICAgICAgICAgICAgIGh3LT5kcG1zaXplID0gU0RMQV9XSU5ET1dTSVpFOworICAgICAgICAgICAgICAgIHN3aXRjaCAoaHctPnR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNETEFfUzUwMkE6CisgICAgICAgICAgICAgICAgICAgICAgICBody0+aW9fcmFuZ2UgICAgPSBTNTAyQV9JT1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgaXJxX29wdCAgICAgICAgID0gczUwMmFfaXJxX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBkcG1iYXNlX29wdCAgICAgPSBzNTAyYV9kcG1iYXNlX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBwY2xrX29wdCAgICAgICAgPSBzNTAyYV9wY2xrX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0RMQV9TNTAyRToKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5pb19yYW5nZSAgICA9IFM1MDJFX0lPUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICBpcnFfb3B0ICAgICAgICAgPSBzNTAyZV9pcnFfb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRwbWJhc2Vfb3B0ICAgICA9IHM1MDhfZHBtYmFzZV9vcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgcGNsa19vcHQgICAgICAgID0gczUwMmVfcGNsa19vcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNETEFfUzUwMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5pb19yYW5nZSAgICA9IFM1MDNfSU9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlycV9vcHQgICAgICAgICA9IHM1MDNfaXJxX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBkcG1iYXNlX29wdCAgICAgPSBzNTA4X2RwbWJhc2Vfb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjbGtfb3B0ICAgICAgICA9IHM1MDNfcGNsa19vcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNETEFfUzUwNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5pb19yYW5nZSAgICA9IFM1MDdfSU9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlycV9vcHQgICAgICAgICA9IHM1MDhfaXJxX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBkcG1iYXNlX29wdCAgICAgPSBzNTA3X2RwbWJhc2Vfb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjbGtfb3B0ICAgICAgICA9IHM1MDdfcGNsa19vcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNETEFfUzUwODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5pb19yYW5nZSAgICA9IFM1MDhfSU9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlycV9vcHQgICAgICAgICA9IHM1MDhfaXJxX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBkcG1iYXNlX29wdCAgICAgPSBzNTA4X2RwbWJhc2Vfb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjbGtfb3B0ICAgICAgICA9IHM1MDhfcGNsa19vcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogVmVyaWZ5IElSUSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWdldF9vcHRpb25faW5kZXgoaXJxX29wdCwgaHctPmlycSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBJUlEgJWQgaXMgaW52YWxpZCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAJbW9kbmFtZSwgaHctPmlycSk7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfSAKKworICAgICAgICAgICAgICAgIC8qIFZlcmlmeSBDUFUgY2xvY2sgcmF0ZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKyAgICAgICAgICAgICAgICBpZiAoaHctPnBjbGsgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5wY2xrID0gcGNsa19vcHRbMV07ICAvKiB1c2UgZGVmYXVsdCAqLworICAgICAgICAKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghZ2V0X29wdGlvbl9pbmRleChwY2xrX29wdCwgaHctPnBjbGspKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogQ1BVIGNsb2NrICV1IGlzIGludmFsaWQhXG4iLAorCQkJCW1vZG5hbWUsIGh3LT5wY2xrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGFzc3VtaW5nIENQVSBjbG9jayByYXRlIG9mICV1IGtIei5cbiIsCisJCQltb2RuYW1lLCBody0+cGNsayk7CisKKyAgICAgICAgICAgICAgICAvKiBTZXR1cCBhZGFwdGVyIGR1YWwtcG9ydCBtZW1vcnkgd2luZG93IGFuZCB0ZXN0IG1lbW9yeSAqLworICAgICAgICAgICAgICAgIGlmIChody0+ZHBtYmFzZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzZGxhX2F1dG9kcG0oaHcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBjYW4ndCBmaW5kIGF2YWlsYWJsZSBtZW1vcnkgcmVnaW9uIVxuIiwKKwkJCQkJbW9kbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFnZXRfb3B0aW9uX2luZGV4KGRwbWJhc2Vfb3B0LAorCQkJdmlydF90b19waHlzKGh3LT5kcG1iYXNlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IG1lbW9yeSBhZGRyZXNzIDB4JWxYIGlzIGludmFsaWQhXG4iLAorCQkJCW1vZG5hbWUsIHZpcnRfdG9fcGh5cyhody0+ZHBtYmFzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNkbGFfc2V0ZHBtKGh3KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiA4SyBtZW1vcnkgcmVnaW9uIGF0IDB4JWxYIGlzIG5vdCBhdmFpbGFibGUhXG4iLAorCQkJCW1vZG5hbWUsIHZpcnRfdG9fcGh5cyhody0+ZHBtYmFzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisJCQkiJXM6IGR1YWwtcG9ydCBtZW1vcnkgd2luZG93IGlzIHNldCBhdCAweCVsWC5cbiIsCisJCQkJbW9kbmFtZSwgdmlydF90b19waHlzKGh3LT5kcG1iYXNlKSk7CisKKworCQkvKiBJZiB3ZSBmaW5kIG1lbW9yeSBpbiAweEUqKioqIE1lbW9yeSByZWdpb24sIAorICAgICAgICAgICAgICAgICAqIHdhcm4gdGhlIHVzZXIgdG8gZGlzYWJsZSB0aGUgU0hBRE9XIFJBTS4gIAorICAgICAgICAgICAgICAgICAqIFNpbmNlIG1lbW9yeSBjb3JydXB0aW9uIGNhbiBvY2N1ciBpZiBTSEFET1cgaXMKKyAgICAgICAgICAgICAgICAgKiBlbmFibGVkLiBUaGlzIGNhbiBjYXVzZXMgcmFuZG9tIGNyYXNoZXMgISAqLworCQlpZiAodmlydF90b19waHlzKGh3LT5kcG1iYXNlKSA+PSAweEUwMDAwKXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlxuJXM6ICEhISEhISEhICBXQVJOSU5HICEhISEhISEhXG4iLG1vZG5hbWUpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFdBTlBJUEUgaXMgdXNpbmcgMHglbFggbWVtb3J5IHJlZ2lvbiAhISFcbiIsCisJCQkJCQltb2RuYW1lLCB2aXJ0X3RvX3BoeXMoaHctPmRwbWJhc2UpKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgICAgICAgIFBsZWFzZSBkaXNhYmxlIHRoZSBTSEFET1cgUkFNLCBvdGhlcndpc2VcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICAgICAgICAgeW91ciBzeXN0ZW0gbWlnaHQgY3Jhc2ggcmFuZG9tbHkgZnJvbSB0aW1lIHRvIHRpbWUgIVxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogISEhISEhISEgIFdBUk5JTkcgISEhISEhISFcblxuIixtb2RuYW1lKTsKKwkJfQorICAgICAgICB9CisKKwllbHNlIHsKKwkJaHctPm1lbW9yeSA9IHRlc3RfbWVtcmVnaW9uKCh2b2lkKilody0+ZHBtYmFzZSwgCisJCQlNQVhfU0laRU9GX1M1MTRfTUVNT1JZKTsKKwkJaWYoaHctPm1lbW9yeSA8ICgyNTYgKiAxMDI0KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSIlczogZXJyb3IgaW4gdGVzdGluZyBTNTE0IG1lbW9yeSAoMHglbFgpXG4iLAorCQkJCW1vZG5hbWUsIGh3LT5tZW1vcnkpOworCQkJc2RsYV9kb3duKGh3KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorICAgIAorCXByaW50ayhLRVJOX0lORk8gIiVzOiBmb3VuZCAlbHVLIGJ5dGVzIG9mIG9uLWJvYXJkIG1lbW9yeVxuIiwKKwkJbW9kbmFtZSwgaHctPm1lbW9yeSAvIDEwMjQpOworCisJLyogTG9hZCBmaXJtd2FyZS4gSWYgbG9hZGVyIGZhaWxzIHRoZW4gc2h1dCBkb3duIGFkYXB0ZXIgKi8KKwllcnIgPSBzZGxhX2xvYWQoaHcsIHNmbSwgbGVuKTsKKwlpZiAoZXJyKSBzZGxhX2Rvd24oaHcpOwkJLyogc2h1dGRvd24gYWRhcHRlciAqLworCisJcmV0dXJuIGVycjsKK30gCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2h1dCBkb3duIFNETEE6IGRpc2FibGUgc2hhcmVkIG1lbW9yeSBhY2Nlc3MgYW5kIGludGVycnVwdHMsIHN0b3AgQ1BVLCBldGMuCisgKi8KKworRVhQT1JUX1NZTUJPTChzZGxhX2Rvd24pOworCitpbnQgc2RsYV9kb3duIChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgcG9ydCA9IGh3LT5wb3J0OworCWludCBpOworICAgICAgICB1bnNpZ25lZCBjaGFyIENQVV9ubzsKKyAgICAgICAgdTMyIGludF9jb25maWcsIGludF9zdGF0dXM7CisKKyAgICAgICAgaWYoIXBvcnQgJiYgKGh3LT50eXBlICE9IFNETEFfUzUxNCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGh3LT50eXBlKSB7CisJY2FzZSBTRExBX1M1MDJBOgorCQlfT1VUQihwb3J0LCAweDA4KTsJCS8qIGhhbHQgQ1BVICovCisJCV9PVVRCKHBvcnQsIDB4MDgpOworCQlfT1VUQihwb3J0LCAweDA4KTsKKwkJaHctPnJlZ3NbMF0gPSAweDA4OworCQlfT1VUQihwb3J0ICsgMSwgMHhGRik7CQkvKiBjbG9zZSBtZW1vcnkgd2luZG93ICovCisJCWh3LT5yZWdzWzFdID0gMHhGRjsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMkU6CisJCV9PVVRCKHBvcnQgKyAzLCAwKTsJCS8qIHN0b3AgQ1BVICovCisJCV9PVVRCKHBvcnQsIDApOwkJCS8qIHJlc2V0IGJvYXJkICovCisJCWZvciAoaSA9IDA7IGkgPCBTNTAyRV9JT1JBTkdFOyArK2kpCisJCQlody0+cmVnc1tpXSA9IDAKKwkJOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAzOgorCWNhc2UgU0RMQV9TNTA3OgorCWNhc2UgU0RMQV9TNTA4OgorCQlfT1VUQihwb3J0LCAwKTsJCQkvKiByZXNldCBib2FyZCBsb2dpYyAqLworCQlody0+cmVnc1swXSA9IDA7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MTQ6CisJCS8qIGhhbHQgdGhlIGFkYXB0ZXIgKi8KKyAgICAgICAgICAgICAgICAqKGNoYXIgKilody0+dmVjdG9yID0gUzUxNF9DUFVfSEFMVDsKKyAgICAgICAgCUNQVV9ubyA9IGh3LT5TNTE0X2NwdV9ub1swXTsKKworCQkvKiBkaXNhYmxlIHRoZSBQQ0kgSVJRIGFuZCBkaXNhYmxlIG1lbW9yeSBhY2Nlc3MgKi8KKyAgICAgICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoaHctPnBjaV9kZXYsIFBDSV9JTlRfQ09ORklHLCAmaW50X2NvbmZpZyk7CisJICAgICAgICBpbnRfY29uZmlnICY9IChDUFVfbm8gPT0gUzUxNF9DUFVfQSkgPyB+UENJX0RJU0FCTEVfSVJRX0NQVV9BIDoJflBDSV9ESVNBQkxFX0lSUV9DUFVfQjsKKyAgICAgICAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGh3LT5wY2lfZGV2LCBQQ0lfSU5UX0NPTkZJRywgaW50X2NvbmZpZyk7CisJCXJlYWRfUzUxNF9pbnRfc3RhdChodywgJmludF9zdGF0dXMpOworCQlTNTE0X2ludGFjayhodywgaW50X3N0YXR1cyk7CisJCWlmKENQVV9ubyA9PSBTNTE0X0NQVV9BKQorICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChody0+cGNpX2RldiwgUENJX01BUDBfRFdPUkQsCisJCQkJUENJX0NQVV9BX01FTV9ESVNBQkxFKTsKKwkJZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChody0+cGNpX2RldiwgUENJX01BUDFfRFdPUkQsCisJCQkJUENJX0NQVV9CX01FTV9ESVNBQkxFKTsKKworCQkvKiBmcmVlIHVwIHRoZSBhbGxvY2F0ZWQgdmlydHVhbCBtZW1vcnkgKi8KKyAJCWlvdW5tYXAoKHZvaWQgKilody0+ZHBtYmFzZSk7CisgICAgICAgIAlpb3VubWFwKCh2b2lkICopaHctPnZlY3Rvcik7CisgCQlicmVhazsKKworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE1hcCBzaGFyZWQgbWVtb3J5IHdpbmRvdyBpbnRvIFNETEEgYWRkcmVzcyBzcGFjZS4KKyAqLworCitFWFBPUlRfU1lNQk9MKHNkbGFfbWFwbWVtKTsKKworaW50IHNkbGFfbWFwbWVtIChzZGxhaHdfdCogaHcsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwl1bnNpZ25lZCBwb3J0ID0gaHctPnBvcnQ7CisJcmVnaXN0ZXIgaW50IHRtcDsKKworCXN3aXRjaCAoaHctPnR5cGUpIHsKKwljYXNlIFNETEFfUzUwMkE6CisJY2FzZSBTRExBX1M1MDJFOgorCQlpZiAoYWRkciA8IFM1MDJfTUFYTUVNKQl7IC8qIHZlcmlmeSBwYXJhbWV0ZXIgKi8KKwkJCXRtcCA9IGFkZHIgPj4gMTM7CS8qIGNvbnZlcnQgdG8gcmVnaXN0ZXIgbWFzayAqLworCQkJX09VVEIocG9ydCArIDIsIHRtcCk7CisJCQlody0+cmVnc1syXSA9IHRtcDsKKwkJfQorCQllbHNlIHJldHVybiAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAzOgorCQlpZiAoYWRkciA8IFM1MDNfTUFYTUVNKQl7IC8qIHZlcmlmeSBwYXJhbWV0ZXIgKi8KKwkJCXRtcCA9IChody0+cmVnc1swXSAmIDB4OEYpIHwgKChhZGRyID4+IDkpICYgMHg3MCk7CisJCQlfT1VUQihwb3J0LCB0bXApOworCQkJaHctPnJlZ3NbMF0gPSB0bXA7CisJCX0KKwkJZWxzZSByZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwNzoKKwkJaWYgKGFkZHIgPCBTNTA3X01BWE1FTSkgeworCQkJaWYgKCEoX0lOQihwb3J0KSAmIDB4MDIpKQorCQkJCXJldHVybiAtRUlPOworCQkJdG1wID0gYWRkciA+PiAxMzsJLyogY29udmVydCB0byByZWdpc3RlciBtYXNrICovCisJCQlfT1VUQihwb3J0ICsgMiwgdG1wKTsKKwkJCWh3LT5yZWdzWzJdID0gdG1wOworCQl9CisJCWVsc2UgcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDg6CisJCWlmIChhZGRyIDwgUzUwOF9NQVhNRU0pIHsKKwkJCXRtcCA9IGFkZHIgPj4gMTM7CS8qIGNvbnZlcnQgdG8gcmVnaXN0ZXIgbWFzayAqLworCQkJX09VVEIocG9ydCArIDIsIHRtcCk7CisJCQlody0+cmVnc1syXSA9IHRtcDsKKwkJfQorCQllbHNlIHJldHVybiAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTE0OgorCQlyZXR1cm4gMDsKKworIAlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaHctPnZlY3RvciA9IGFkZHIgJiAweEZGRkZFMDAwTDsKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFbmFibGUgaW50ZXJydXB0IGdlbmVyYXRpb24uCisgKi8KKworRVhQT1JUX1NZTUJPTChzZGxhX2ludGVuKTsKKworaW50IHNkbGFfaW50ZW4gKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBwb3J0ID0gaHctPnBvcnQ7CisJaW50IHRtcCwgaTsKKworCXN3aXRjaCAoaHctPnR5cGUpIHsKKwljYXNlIFNETEFfUzUwMkU6CisJCS8qIE5vdGUgdGhhciBpbnRlcnJ1cHQgY29udHJvbCBvcGVyYXRpb25zIG9uIFM1MDJFIGFyZSBhbGxvd2VkCisJCSAqIG9ubHkgaWYgQ1BVIGlzIGVuYWJsZWQgKGJpdCAwIG9mIHN0YXR1cyByZWdpc3RlciBpcyBzZXQpLgorCQkgKi8KKwkJaWYgKF9JTkIocG9ydCkgJiAweDAxKSB7CisJCQlfT1VUQihwb3J0LCAweDAyKTsJLyogYml0MSA9IDEsIGJpdDIgPSAwICovCisJCQlfT1VUQihwb3J0LCAweDA2KTsJLyogYml0MSA9IDEsIGJpdDIgPSAxICovCisJCQlody0+cmVnc1swXSA9IDB4MDY7CisJCX0KKwkJZWxzZSByZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMzoKKwkJdG1wID0gaHctPnJlZ3NbMF0gfCAweDA0OworCQlfT1VUQihwb3J0LCB0bXApOworCQlody0+cmVnc1swXSA9IHRtcDsJCS8qIHVwZGF0ZSBtaXJyb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwkJaWYgKCEoX0lOQihwb3J0KSAmIDB4MDIpKQkJLyogdmVyaWZ5ICovCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwODoKKwkJdG1wID0gaHctPnJlZ3NbMF0gfCAweDEwOworCQlfT1VUQihwb3J0LCB0bXApOworCQlody0+cmVnc1swXSA9IHRtcDsJCS8qIHVwZGF0ZSBtaXJyb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwkJaWYgKCEoX0lOQihwb3J0ICsgMSkgJiAweDEwKSkJCS8qIHZlcmlmeSAqLworCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDJBOgorCWNhc2UgU0RMQV9TNTA3OgorCQlicmVhazsKKworICAgICAgICBjYXNlIFNETEFfUzUxNDoKKyAgICAgICAgICAgICAgICBicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCisJfQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERpc2FibGUgaW50ZXJydXB0IGdlbmVyYXRpb24uCisgKi8KKworRVhQT1JUX1NZTUJPTChzZGxhX2ludGRlKTsKKworaW50IHNkbGFfaW50ZGUgKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBwb3J0ID0gaHctPnBvcnQ7CisJaW50IHRtcCwgaTsKKworCXN3aXRjaCAoaHctPnR5cGUpIHsKKwljYXNlIFNETEFfUzUwMkU6CisJCS8qIE5vdGVzOgorCQkgKiAgMSkgaW50ZXJydXB0IGNvbnRyb2wgb3BlcmF0aW9ucyBhcmUgYWxsb3dlZCBvbmx5IGlmIENQVSBpcworCQkgKiAgICAgZW5hYmxlZCAoYml0IDAgb2Ygc3RhdHVzIHJlZ2lzdGVyIGlzIHNldCkuCisJCSAqICAyKSBkaXNhYmxpbmcgaW50ZXJydXB0cyB1c2luZyBiaXQgMSBvZiBjb250cm9sIHJlZ2lzdGVyCisJCSAqICAgICBjYXVzZXMgSVJRIGxpbmUgZ28gaGlnaCwgdGhlcmVmb3JlIHdlIGFyZSBnb2luZyB0byB1c2UKKwkJICogICAgIDB4MDQgaW5zdGVhZDogbG93ZXIgaXQgdG8gaW5oaWJpdCBpbnRlcnJ1cHRzIHRvIFBDLgorCQkgKi8KKwkJaWYgKF9JTkIocG9ydCkgJiAweDAxKSB7CisJCQlfT1VUQihwb3J0LCBody0+cmVnc1swXSAmIH4weDA0KTsKKwkJCWh3LT5yZWdzWzBdICY9IH4weDA0OworCQl9CisJCWVsc2UgcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDM6CisJCXRtcCA9IGh3LT5yZWdzWzBdICYgfjB4MDQ7CisJCV9PVVRCKHBvcnQsIHRtcCk7CisJCWh3LT5yZWdzWzBdID0gdG1wOwkJCS8qIHVwZGF0ZSBtaXJyb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwkJaWYgKF9JTkIocG9ydCkgJiAweDAyKQkJCS8qIHZlcmlmeSAqLworCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDg6CisJCXRtcCA9IGh3LT5yZWdzWzBdICYgfjB4MTA7CisJCV9PVVRCKHBvcnQsIHRtcCk7CisJCWh3LT5yZWdzWzBdID0gdG1wOwkJCS8qIHVwZGF0ZSBtaXJyb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwkJaWYgKF9JTkIocG9ydCkgJiAweDEwKQkJCS8qIHZlcmlmeSAqLworCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDJBOgorCWNhc2UgU0RMQV9TNTA3OgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBBY2tub3dsZWRnZSBTRExBIGhhcmR3YXJlIGludGVycnVwdC4KKyAqLworCitFWFBPUlRfU1lNQk9MKHNkbGFfaW50YWNrKTsKKworaW50IHNkbGFfaW50YWNrIChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgcG9ydCA9IGh3LT5wb3J0OworCWludCB0bXA7CisKKwlzd2l0Y2ggKGh3LT50eXBlKSB7CisJY2FzZSBTRExBX1M1MDJFOgorCQkvKiBUbyBhY2tub2xlZGdlIGhhcmR3YXJlIGludGVycnVwdCB3ZSBoYXZlIHRvIHRvZ2dsZSBiaXQgMyBvZgorCQkgKiBjb250cm9sIHJlZ2lzdGVyOiBcXy8KKwkJICogTm90ZSB0aGF0IGludGVycnVwdCBjb250cm9sIG9wZXJhdGlvbnMgb24gUzUwMkUgYXJlIGFsbG93ZWQKKwkJICogb25seSBpZiBDUFUgaXMgZW5hYmxlZCAoYml0IDEgb2Ygc3RhdHVzIHJlZ2lzdGVyIGlzIHNldCkuCisJCSAqLworCQlpZiAoX0lOQihwb3J0KSAmIDB4MDEpIHsKKwkJCXRtcCA9IGh3LT5yZWdzWzBdICYgfjB4MDQ7CisJCQlfT1VUQihwb3J0LCB0bXApOworCQkJdG1wIHw9IDB4MDQ7CisJCQlfT1VUQihwb3J0LCB0bXApOworCQkJaHctPnJlZ3NbMF0gPSB0bXA7CisJCX0KKwkJZWxzZSByZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMzoKKwkJaWYgKF9JTkIocG9ydCkgJiAweDA0KSB7CisJCQl0bXAgPSBody0+cmVnc1swXSAmIH4weDA4OworCQkJX09VVEIocG9ydCwgdG1wKTsKKwkJCXRtcCB8PSAweDA4OworCQkJX09VVEIocG9ydCwgdG1wKTsKKwkJCWh3LT5yZWdzWzBdID0gdG1wOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDJBOgorCWNhc2UgU0RMQV9TNTA3OgorCWNhc2UgU0RMQV9TNTA4OgorCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQWNrbm93bGVkZ2UgUzUxNCBoYXJkd2FyZSBpbnRlcnJ1cHQuCisgKi8KKworRVhQT1JUX1NZTUJPTChTNTE0X2ludGFjayk7CisKK3ZvaWQgUzUxNF9pbnRhY2sgKHNkbGFod190KiBodywgdTMyIGludF9zdGF0dXMpCit7CisgICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoaHctPnBjaV9kZXYsIFBDSV9JTlRfU1RBVFVTLCBpbnRfc3RhdHVzKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgdGhlIFM1MTQgaGFyZHdhcmUgaW50ZXJydXB0IHN0YXR1cy4KKyAqLworCitFWFBPUlRfU1lNQk9MKHJlYWRfUzUxNF9pbnRfc3RhdCk7CisKK3ZvaWQgcmVhZF9TNTE0X2ludF9zdGF0IChzZGxhaHdfdCogaHcsIHUzMiogaW50X3N0YXR1cykKK3sKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaHctPnBjaV9kZXYsIFBDSV9JTlRfU1RBVFVTLCBpbnRfc3RhdHVzKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdlbmVyYXRlIGFuIGludGVycnVwdCB0byBhZGFwdGVyJ3MgQ1BVLgorICovCisKK0VYUE9SVF9TWU1CT0woc2RsYV9pbnRyKTsKKworaW50IHNkbGFfaW50ciAoc2RsYWh3X3QqIGh3KQoreworCXVuc2lnbmVkIHBvcnQgPSBody0+cG9ydDsKKworCXN3aXRjaCAoaHctPnR5cGUpIHsKKwljYXNlIFNETEFfUzUwMkE6CisJCWlmICghKF9JTkIocG9ydCkgJiAweDQwKSkgeworCQkJX09VVEIocG9ydCwgMHgxMCk7CQkvKiBpc3N1ZSBOTUkgdG8gQ1BVICovCisJCQlody0+cmVnc1swXSA9IDB4MTA7CisJCX0KKwkJZWxzZSByZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwNzoKKwkJaWYgKChfSU5CKHBvcnQpICYgMHgwNikgPT0gMHgwNikgeworCQkJX09VVEIocG9ydCArIDMsIDApOworCQl9CisJCWVsc2UgcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDg6CisJCWlmIChfSU5CKHBvcnQgKyAxKSAmIDB4MDIpIHsKKwkJCV9PVVRCKHBvcnQsIDB4MDgpOworCQl9CisJCWVsc2UgcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDJFOgorCWNhc2UgU0RMQV9TNTAzOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFeGVjdXRlIEFkYXB0ZXIgQ29tbWFuZC4KKyAqIG8gU2V0IGV4ZWMgZmxhZy4KKyAqIG8gQnVzeS13YWl0IHVudGlsIGZsYWcgaXMgcmVzZXQuCisgKiBvIFJldHVybiBudW1iZXIgb2YgbG9vcHMgbWFkZSwgb3IgMCBpZiBjb21tYW5kIHRpbWVkIG91dC4KKyAqLworCitFWFBPUlRfU1lNQk9MKHNkbGFfZXhlYyk7CisKK2ludCBzZGxhX2V4ZWMgKHZvaWQqIG9wZmxhZykKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKiBmbGFnID0gb3BmbGFnOworCXVuc2lnbmVkIGxvbmcgdHN0b3A7CisJaW50IG5sb29wczsKKworCWlmKHJlYWRiKGZsYWcpICE9IDB4MDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIldBTlBJUEU6IG9wcCBmbGFnIHNldCBvbiBlbnRyeSB0byBzZGxhX2V4ZWNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJCisJd3JpdGViKDB4MDEsIGZsYWcpOworCisJdHN0b3AgPSBTWVNURU1fVElDSyArIEVYRUNfVElNRU9VVDsKKworCWZvciAobmxvb3BzID0gMTsgKHJlYWRiKGZsYWcpID09IDB4MDEpOyArKyBubG9vcHMpIHsKKwkJdW5zaWduZWQgZGVsYXkgPSBleGVjX2lkbGU7CisJCXdoaWxlICgtLSBkZWxheSk7CQkJLyogZGVsYXkgKi8KKwkJaWYgKFNZU1RFTV9USUNLID4gdHN0b3ApIHJldHVybiAwOwkvKiB0aW1lIGlzIHVwISAqLworCX0KKwlyZXR1cm4gbmxvb3BzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgYWJzb2x1dGUgYWRhcHRlciBtZW1vcnkuCisgKiBUcmFuc2ZlciBkYXRhIGZyb20gYWRhcHRlcidzIG1lbW9yeSB0byBkYXRhIGJ1ZmZlci4KKyAqCisgKiBOb3RlOgorICogQ2FyZSBzaG91bGQgYmUgdGFrZW4gd2hlbiBjcm9zc2luZyBkdWFsLXBvcnQgbWVtb3J5IHdpbmRvdyBib3VuZGFyeS4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgbm90IGF0b21pYywgc28gY2FsbGVyIG11c3QgZGlzYWJsZSBpbnRlcnJ1cHQgaWYKKyAqIGludGVycnVwdCByb3V0aW5lcyBhcmUgYWNjZXNzaW5nIGFkYXB0ZXIgc2hhcmVkIG1lbW9yeS4KKyAqLworCitFWFBPUlRfU1lNQk9MKHNkbGFfcGVlayk7CisKK2ludCBzZGxhX3BlZWsgKHNkbGFod190KiBodywgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkKiBidWYsIHVuc2lnbmVkIGxlbikKK3sKKworCWlmIChhZGRyICsgbGVuID4gaHctPm1lbW9yeSkJLyogdmVyaWZ5IGFyZ3VtZW50cyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBpZihody0+dHlwZSA9PSBTRExBX1M1MTQpIHsJLyogY29weSBkYXRhIGZvciB0aGUgUzUxNCBhZGFwdGVyICovCisgICAgICAgICAgICAgICAgcGVla19ieV80ICgodW5zaWduZWQgbG9uZylody0+ZHBtYmFzZSArIGFkZHIsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwl9CisKKyAgICAgICAgZWxzZSB7CQkJCS8qIGNvcHkgZGF0YSBmb3IgdGhlIFM1MDggYWRhcHRlciAqLworCSAgICAgICAgdW5zaWduZWQgbG9uZyBvbGR2ZWMgPSBody0+dmVjdG9yOworICAgICAgICAJdW5zaWduZWQgd2luc2l6ZSA9IGh3LT5kcG1zaXplOworCSAgICAgICAgdW5zaWduZWQgY3VycG9zLCBjdXJsZW47ICAgLyogY3VycmVudCBvZmZzZXQgYW5kIGJsb2NrIHNpemUgKi8KKyAgICAgICAgCXVuc2lnbmVkIGxvbmcgY3VydmVjOyAgICAgIC8qIGN1cnJlbnQgRFBNIHdpbmRvdyB2ZWN0b3IgKi8KKwkgICAgICAgIGludCBlcnIgPSAwOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGxlbiAmJiAhZXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJwb3MgPSBhZGRyICUgd2luc2l6ZTsgIC8qIGN1cnJlbnQgd2luZG93IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVjID0gYWRkciAtIGN1cnBvczsgICAvKiBjdXJyZW50IHdpbmRvdyB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxlbiA9IChsZW4gPiAod2luc2l6ZSAtIGN1cnBvcykpID8KKwkJCQkod2luc2l6ZSAtIGN1cnBvcykgOiBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWxvY2F0ZSB3aW5kb3cgYW5kIGNvcHkgYmxvY2sgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc2RsYV9tYXBtZW0oaHcsIGN1cnZlYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwZWVrX2J5XzQgKCh1bnNpZ25lZCBsb25nKWh3LT5kcG1iYXNlICsgY3VycG9zLCBidWYsCisJCQkJY3VybGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgICAgICAgKz0gY3VybGVuOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmICAgICAgICAgPSAoY2hhciopYnVmICsgY3VybGVuOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuICAgICAgICAtPSBjdXJsZW47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBEUE0gd2luZG93IHBvc2l0aW9uICovCisgICAgICAgICAgICAgICAgc2RsYV9tYXBtZW0oaHcsIG9sZHZlYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBkYXRhIGZyb20gYWRhcHRlcidzIG1lbW9yeSB0byBhIGRhdGEgYnVmZmVyIGluIDQtYnl0ZSBjaHVua3MuCisgKiBOb3RlIHRoYXQgd2UgZW5zdXJlIHRoYXQgdGhlIFNETEEgbWVtb3J5IGFkZHJlc3MgaXMgb24gYSA0LWJ5dGUgYm91bmRhcnkKKyAqIGJlZm9yZSB3ZSBiZWdpbiBtb3ZpbmcgdGhlIGRhdGEgaW4gNC1ieXRlIGNodW5rcy4KKyovCisKK3N0YXRpYyB2b2lkIHBlZWtfYnlfNCAodW5zaWduZWQgbG9uZyBzcmMsIHZvaWQqIGJ1ZiwgdW5zaWduZWQgbGVuKQoreworCisgICAgICAgIC8qIGJ5dGUgY29weSBkYXRhIHVudGlsIHdlIGdldCB0byBhIDQtYnl0ZSBib3VuZGFyeSAqLworICAgICAgICB3aGlsZSAobGVuICYmIChzcmMgJiAweDAzKSkgeworICAgICAgICAgICAgICAgICooY2hhciAqKWJ1ZiArKyA9IHJlYWRiKHNyYyArKyk7CisgICAgICAgICAgICAgICAgbGVuIC0tOworICAgICAgICB9CisKKyAgICAgICAgLyogY29weSBkYXRhIGluIDQtYnl0ZSBjaHVua3MgKi8KKyAgICAgICAgd2hpbGUgKGxlbiA+PSA0KSB7CisgICAgICAgICAgICAgICAgKih1bnNpZ25lZCBsb25nICopYnVmID0gcmVhZGwoc3JjKTsKKyAgICAgICAgICAgICAgICBidWYgKz0gNDsKKyAgICAgICAgICAgICAgICBzcmMgKz0gNDsKKyAgICAgICAgICAgICAgICBsZW4gLT0gNDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGJ5dGUgY29weSBhbnkgcmVtYWluaW5nIGRhdGEgKi8KKyAgICAgICAgd2hpbGUgKGxlbikgeworICAgICAgICAgICAgICAgICooY2hhciAqKWJ1ZiArKyA9IHJlYWRiKHNyYyArKyk7CisgICAgICAgICAgICAgICAgbGVuIC0tOworICAgICAgICB9Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBXcml0ZSBBYnNvbHV0ZSBBZGFwdGVyIE1lbW9yeS4KKyAqIFRyYW5zZmVyIGRhdGEgZnJvbSBkYXRhIGJ1ZmZlciB0byBhZGFwdGVyJ3MgbWVtb3J5LgorICoKKyAqIE5vdGU6CisgKiBDYXJlIHNob3VsZCBiZSB0YWtlbiB3aGVuIGNyb3NzaW5nIGR1YWwtcG9ydCBtZW1vcnkgd2luZG93IGJvdW5kYXJ5LgorICogVGhpcyBmdW5jdGlvbiBpcyBub3QgYXRvbWljLCBzbyBjYWxsZXIgbXVzdCBkaXNhYmxlIGludGVycnVwdCBpZgorICogaW50ZXJydXB0IHJvdXRpbmVzIGFyZSBhY2Nlc3NpbmcgYWRhcHRlciBzaGFyZWQgbWVtb3J5LgorICovCisKK0VYUE9SVF9TWU1CT0woc2RsYV9wb2tlKTsKKyAKK2ludCBzZGxhX3Bva2UgKHNkbGFod190KiBodywgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkKiBidWYsIHVuc2lnbmVkIGxlbikKK3sKKworCWlmIChhZGRyICsgbGVuID4gaHctPm1lbW9yeSkJLyogdmVyaWZ5IGFyZ3VtZW50cyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKyAgIAorICAgICAgICBpZihody0+dHlwZSA9PSBTRExBX1M1MTQpIHsJLyogY29weSBkYXRhIGZvciB0aGUgUzUxNCBhZGFwdGVyICovCisgICAgICAgICAgICAgICAgcG9rZV9ieV80ICgodW5zaWduZWQgbG9uZylody0+ZHBtYmFzZSArIGFkZHIsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwl9CisJCisJZWxzZSB7CQkJCS8qIGNvcHkgZGF0YSBmb3IgdGhlIFM1MDggYWRhcHRlciAqLworICAgIAkJdW5zaWduZWQgbG9uZyBvbGR2ZWMgPSBody0+dmVjdG9yOworCSAgICAgICAgdW5zaWduZWQgd2luc2l6ZSA9IGh3LT5kcG1zaXplOworICAgICAgICAJdW5zaWduZWQgY3VycG9zLCBjdXJsZW47ICAgICAvKiBjdXJyZW50IG9mZnNldCBhbmQgYmxvY2sgc2l6ZSAqLworICAgICAgICAJdW5zaWduZWQgbG9uZyBjdXJ2ZWM7ICAgICAgICAvKiBjdXJyZW50IERQTSB3aW5kb3cgdmVjdG9yICovCisgICAgICAgIAlpbnQgZXJyID0gMDsKKworCQl3aGlsZSAobGVuICYmICFlcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnBvcyA9IGFkZHIgJSB3aW5zaXplOyAgICAvKiBjdXJyZW50IHdpbmRvdyBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlYyA9IGFkZHIgLSBjdXJwb3M7ICAgICAvKiBjdXJyZW50IHdpbmRvdyB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxlbiA9IChsZW4gPiAod2luc2l6ZSAtIGN1cnBvcykpID8KKwkJCQkod2luc2l6ZSAtIGN1cnBvcykgOiBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWxvY2F0ZSB3aW5kb3cgYW5kIGNvcHkgYmxvY2sgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2RsYV9tYXBtZW0oaHcsIGN1cnZlYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwb2tlX2J5XzQgKCh1bnNpZ25lZCBsb25nKWh3LT5kcG1iYXNlICsgY3VycG9zLCBidWYsCisJCQkJY3VybGVuKTsKKwkgICAgICAgICAgICAgICAgYWRkciAgICAgICArPSBjdXJsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBidWYgICAgICAgICA9IChjaGFyKilidWYgKyBjdXJsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gICAgICAgIC09IGN1cmxlbjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIERQTSB3aW5kb3cgcG9zaXRpb24gKi8KKyAgICAgICAgICAgICAgICBzZGxhX21hcG1lbShodywgb2xkdmVjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBXcml0ZSBmcm9tIGEgZGF0YSBidWZmZXIgdG8gYWRhcHRlcidzIG1lbW9yeSBpbiA0LWJ5dGUgY2h1bmtzLgorICogTm90ZSB0aGF0IHdlIGVuc3VyZSB0aGF0IHRoZSBTRExBIG1lbW9yeSBhZGRyZXNzIGlzIG9uIGEgNC1ieXRlIGJvdW5kYXJ5CisgKiBiZWZvcmUgd2UgYmVnaW4gbW92aW5nIHRoZSBkYXRhIGluIDQtYnl0ZSBjaHVua3MuCisqLworCitzdGF0aWMgdm9pZCBwb2tlX2J5XzQgKHVuc2lnbmVkIGxvbmcgZGVzdCwgdm9pZCogYnVmLCB1bnNpZ25lZCBsZW4pCit7CisKKyAgICAgICAgLyogYnl0ZSBjb3B5IGRhdGEgdW50aWwgd2UgZ2V0IHRvIGEgNC1ieXRlIGJvdW5kYXJ5ICovCisgICAgICAgIHdoaWxlIChsZW4gJiYgKGRlc3QgJiAweDAzKSkgeworICAgICAgICAgICAgICAgIHdyaXRlYiAoKihjaGFyICopYnVmICsrLCBkZXN0ICsrKTsKKyAgICAgICAgICAgICAgICBsZW4gLS07CisgICAgICAgIH0KKworICAgICAgICAvKiBjb3B5IGRhdGEgaW4gNC1ieXRlIGNodW5rcyAqLworICAgICAgICB3aGlsZSAobGVuID49IDQpIHsKKyAgICAgICAgICAgICAgICB3cml0ZWwgKCoodW5zaWduZWQgbG9uZyAqKWJ1ZiwgZGVzdCk7CisgICAgICAgICAgICAgICAgZGVzdCArPSA0OworICAgICAgICAgICAgICAgIGJ1ZiArPSA0OworICAgICAgICAgICAgICAgIGxlbiAtPSA0OworICAgICAgICB9CisKKyAgICAgICAgLyogYnl0ZSBjb3B5IGFueSByZW1haW5pbmcgZGF0YSAqLworICAgICAgICB3aGlsZSAobGVuKSB7CisgICAgICAgICAgICAgICAgd3JpdGViICgqKGNoYXIgKilidWYgKysgLCBkZXN0ICsrKTsKKyAgICAgICAgICAgICAgICBsZW4gLS07CisgICAgICAgIH0KK30KKworCisjaWZkZWYJRE9OVF9DT01QSVBMRV9USElTCisjZW5kaWYJLyogRE9OVF9DT01QSVBMRV9USElTICovCisKKy8qKioqKiogSGFyZHdhcmUtU3BlY2lmaWMgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVjdCBhZGFwdGVyIHR5cGUuCisgKiBvIGlmIGFkYXB0ZXIgdHlwZSBpcyBzcGVjaWZpZWQgdGhlbiBjYWxsIGRldGVjdGlvbiByb3V0aW5lIGZvciB0aGF0IGFkYXB0ZXIKKyAqICAgdHlwZS4gIE90aGVyd2lzZSBjYWxsIGRldGVjdGlvbiByb3V0aW5lcyBmb3IgZXZlcnkgYWRhcHRlciB0eXBlcyB1bnRpbAorICogICBhZGFwdGVyIGlzIGRldGVjdGVkLgorICoKKyAqIE5vdGVzOgorICogMSkgRGV0ZWN0aW9uIHRlc3RzIGFyZSBkZXN0cnVjdGl2ZSEgQWRhcHRlciB3aWxsIGJlIGxlZnQgaW4gc2h1dGRvd24gc3RhdGUKKyAqICAgIGFmdGVyIHRoZSB0ZXN0LgorICovCitzdGF0aWMgaW50IHNkbGFfZGV0ZWN0IChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgcG9ydCA9IGh3LT5wb3J0OworCWludCBlcnIgPSAwOworCisJaWYgKCFwb3J0ICYmIChody0+dHlwZSAhPSBTRExBX1M1MTQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworICAgIAlzd2l0Y2ggKGh3LT50eXBlKSB7CisJY2FzZSBTRExBX1M1MDJBOgorCQlpZiAoIWRldGVjdF9zNTAyYShwb3J0KSkgZXJyID0gLUVOT0RFVjsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMkU6CisJCWlmICghZGV0ZWN0X3M1MDJlKHBvcnQpKSBlcnIgPSAtRU5PREVWOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAzOgorCQlpZiAoIWRldGVjdF9zNTAzKHBvcnQpKSBlcnIgPSAtRU5PREVWOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTA3OgorCQlpZiAoIWRldGVjdF9zNTA3KHBvcnQpKSBlcnIgPSAtRU5PREVWOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTA4OgorCQlpZiAoIWRldGVjdF9zNTA4KHBvcnQpKSBlcnIgPSAtRU5PREVWOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTE0OgorICAgICAgICAgICAgICAgIGlmICghZGV0ZWN0X3M1MTQoaHcpKSBlcnIgPSAtRU5PREVWOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlmIChkZXRlY3RfczUwMmEocG9ydCkpCisJCQlody0+dHlwZSA9IFNETEFfUzUwMkE7CisJCWVsc2UgaWYgKGRldGVjdF9zNTAyZShwb3J0KSkKKwkJCWh3LT50eXBlID0gU0RMQV9TNTAyRTsKKwkJZWxzZSBpZiAoZGV0ZWN0X3M1MDMocG9ydCkpCisJCQlody0+dHlwZSA9IFNETEFfUzUwMzsKKwkJZWxzZSBpZiAoZGV0ZWN0X3M1MDcocG9ydCkpCisJCQlody0+dHlwZSA9IFNETEFfUzUwNzsKKwkJZWxzZSBpZiAoZGV0ZWN0X3M1MDgocG9ydCkpCisJCQlody0+dHlwZSA9IFNETEFfUzUwODsKKwkJZWxzZSBlcnIgPSAtRU5PREVWOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEF1dG9zZWxlY3QgbWVtb3J5IHJlZ2lvbi4gCisgKiBvIHRyeSBhbGwgYXZhaWxhYmxlIERNUCBhZGRyZXNzIG9wdGlvbnMgZnJvbSB0aGUgdG9wIGRvd24gdW50aWwgc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBzZGxhX2F1dG9kcG0gKHNkbGFod190KiBodykKK3sKKwlpbnQgaSwgZXJyID0gLUVJTlZBTDsKKwl1bnNpZ25lZCogb3B0OworCisJc3dpdGNoIChody0+dHlwZSkgeworCWNhc2UgU0RMQV9TNTAyQToKKwkJb3B0ID0gczUwMmFfZHBtYmFzZV9vcHRpb25zOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAyRToKKwljYXNlIFNETEFfUzUwMzoKKwljYXNlIFNETEFfUzUwODoKKwkJb3B0ID0gczUwOF9kcG1iYXNlX29wdGlvbnM7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDc6CisJCW9wdCA9IHM1MDdfZHBtYmFzZV9vcHRpb25zOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFN0YXJ0IHRlc3RpbmcgZnJvbSA4dGggcG9zaXRpb24sIGFkZHJlc3MKKyAgICAgICAgICogMHhDODAwMCBmcm9tIHRoZSA1MDggYWRkcmVzcyB0YWJsZS4gCisgICAgICAgICAqIFdlIGRvbid0IHdhbnQgdG8gdGVzdCBBKioqKiBhZGRyZXNzZXMsIHNpbmNlCisgICAgICAgICAqIHRoZXkgYXJlIHVzdWFsbHkgdXNlZCBmb3IgVmlkZW8gKi8KKwlmb3IgKGkgPSA4OyBpIDw9IG9wdFswXSAmJiBlcnI7IGkrKykgeworCQlody0+ZHBtYmFzZSA9IHBoeXNfdG9fdmlydChvcHRbaV0pOworCQllcnIgPSBzZGxhX3NldGRwbShodyk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IHVwIGFkYXB0ZXIgZHVhbC1wb3J0IG1lbW9yeSB3aW5kb3cuIAorICogbyBzaHV0IGRvd24gYWRhcHRlcgorICogbyBtYWtlIHN1cmUgdGhhdCBubyBwaHlzaWNhbCBtZW1vcnkgZXhpc3RzIGluIHRoaXMgcmVnaW9uLCBpLmUgZW50aXJlCisgKiAgIHJlZ2lvbiByZWFkcyAweEZGIGFuZCBpcyBub3Qgd3JpdGFibGUgd2hlbiBhZGFwdGVyIGlzIHNodXQgZG93bi4KKyAqIG8gaW5pdGlhbGl6ZSBhZGFwdGVyIGhhcmR3YXJlCisgKiBvIG1ha2Ugc3VyZSB0aGF0IHJlZ2lvbiBpcyB1c2FibGUgd2l0aCBTRExBIGNhcmQsIGkuZS4gd2UgY2FuIHdyaXRlIHRvIGl0CisgKiAgIHdoZW4gYWRhcHRlciBpcyBjb25maWd1cmVkLgorICovCitzdGF0aWMgaW50IHNkbGFfc2V0ZHBtIChzZGxhaHdfdCogaHcpCit7CisJaW50IGVycjsKKworCS8qIFNodXQgZG93biBjYXJkIGFuZCB2ZXJpZnkgbWVtb3J5IHJlZ2lvbiAqLworCXNkbGFfZG93bihodyk7CisJaWYgKGNoZWNrX21lbXJlZ2lvbihody0+ZHBtYmFzZSwgaHctPmRwbXNpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEluaXRpYWxpemUgYWRhcHRlciBhbmQgdGVzdCBvbi1ib2FyZCBtZW1vcnkgc2VnbWVudCBieSBzZWdtZW50LgorCSAqIElmIG1lbW9yeSBzaXplIGFwcGVhcnMgdG8gYmUgbGVzcyB0aGFuIHNoYXJlZCBtZW1vcnkgd2luZG93IHNpemUsCisJICogYXNzdW1lIHRoYXQgbWVtb3J5IHJlZ2lvbiBpcyB1bnVzYWJsZS4KKwkgKi8KKwllcnIgPSBzZGxhX2luaXQoaHcpOworCWlmIChlcnIpIHJldHVybiBlcnI7CisKKwlpZiAoc2RsYV9tZW10ZXN0KGh3KSA8IGh3LT5kcG1zaXplKSB7CS8qIGxlc3MgdGhhbiB3aW5kb3cgc2l6ZSAqLworCQlzZGxhX2Rvd24oaHcpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJc2RsYV9tYXBtZW0oaHcsIDBMKTsJLyogc2V0IHdpbmRvdyB2ZWN0b3IgYXQgYm90dG9tICovCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9hZCBhZGFwdGVyIGZyb20gdGhlIG1lbW9yeSBpbWFnZSBvZiB0aGUgU0RMQSBmaXJtd2FyZSBtb2R1bGUuIAorICogbyB2ZXJpZnkgZmlybXdhcmUgaW50ZWdyaXR5IGFuZCBjb21wYXRpYmlsaXR5CisgKiBvIHN0YXJ0IGFkYXB0ZXIgdXAKKyAqLworc3RhdGljIGludCBzZGxhX2xvYWQgKHNkbGFod190KiBodywgc2ZtX3QqIHNmbSwgdW5zaWduZWQgbGVuKQoreworCisJaW50IGk7CisKKwkvKiBWZXJpZnkgZmlybXdhcmUgc2lnbmF0dXJlICovCisJaWYgKHN0cmNtcChzZm0tPnNpZ25hdHVyZSwgU0ZNX1NJR05BVFVSRSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vdCBTRExBIGZpcm13YXJlIVxuIiwKKwkJCW1vZG5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBWZXJpZnkgZmlybXdhcmUgbW9kdWxlIGZvcm1hdCB2ZXJzaW9uICovCisJaWYgKHNmbS0+dmVyc2lvbiAhPSBTRk1fVkVSU0lPTikgeworCQlwcmludGsoS0VSTl9JTkZPCisJCQkiJXM6IGZpcm13YXJlIGZvcm1hdCAldSByZWplY3RlZCEgRXhwZWN0aW5nICV1LlxuIiwKKwkJCW1vZG5hbWUsIHNmbS0+dmVyc2lvbiwgU0ZNX1ZFUlNJT04pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBWZXJpZnkgZmlybXdhcmUgbW9kdWxlIGxlbmd0aCBhbmQgY2hlY2tzdW0gKi8KKwlpZiAoKGxlbiAtIG9mZnNldG9mKHNmbV90LCBpbWFnZSkgIT0gc2ZtLT5pbmZvLmNvZGVzaXplKSB8fAorCQkoY2hlY2tzdW0oKHZvaWQqKSZzZm0tPmluZm8sCisJCXNpemVvZihzZm1faW5mb190KSArIHNmbS0+aW5mby5jb2Rlc2l6ZSkgIT0gc2ZtLT5jaGVja3N1bSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZpcm13YXJlIGNvcnJ1cHRlZCFcbiIsIG1vZG5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBBbm5vdW5jZSAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiBsb2FkaW5nICVzIChJRD0ldSkuLi5cbiIsIG1vZG5hbWUsCisJCShzZm0tPmRlc2NyWzBdICE9ICdcMCcpID8gc2ZtLT5kZXNjciA6ICJ1bmtub3duIGZpcm13YXJlIiwKKwkJc2ZtLT5pbmZvLmNvZGVpZCk7CisKKwlpZihody0+dHlwZSA9PSBTRExBX1M1MTQpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsb2FkaW5nIFM1MTQgYWRhcHRlciwgQ1BVICVjXG4iLAorCQkJbW9kbmFtZSwgaHctPlM1MTRfY3B1X25vWzBdKTsKKworCS8qIFNjYW4gdGhyb3VnaCB0aGUgbGlzdCBvZiBjb21wYXRpYmxlIGFkYXB0ZXJzIGFuZCBtYWtlIHN1cmUgb3VyCisJICogYWRhcHRlciB0eXBlIGlzIGxpc3RlZC4KKwkgKi8KKwlmb3IgKGkgPSAwOworCSAgICAgKGkgPCBTRk1fTUFYX1NETEEpICYmIChzZm0tPmluZm8uYWRhcHRlcltpXSAhPSBody0+dHlwZSk7CisJICAgICArK2kpOworCQorCWlmIChpID09IFNGTV9NQVhfU0RMQSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogZmlybXdhcmUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBTJXUhXG4iLAorCQkJbW9kbmFtZSwgaHctPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKworCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggb24tYm9hcmQgbWVtb3J5ICovCisJaWYgKGh3LT5tZW1vcnkgPCBzZm0tPmluZm8ubWVtc2l6ZSkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCQkiJXM6IGZpcm13YXJlIG5lZWRzICVsdSBieXRlcyBvZiBvbi1ib2FyZCBtZW1vcnkhXG4iLAorCQkJbW9kbmFtZSwgc2ZtLT5pbmZvLm1lbXNpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBNb3ZlIGNvZGUgb250byBhZGFwdGVyICovCisJaWYgKHNkbGFfcG9rZShodywgc2ZtLT5pbmZvLmNvZGVvZmZzLCBzZm0tPmltYWdlLCBzZm0tPmluZm8uY29kZXNpemUpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBmYWlsZWQgdG8gbG9hZCBjb2RlIHNlZ21lbnQhXG4iLAorCQkJbW9kbmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFByZXBhcmUgYm9vdC10aW1lIGNvbmZpZ3VyYXRpb24gZGF0YSBhbmQga2ljay1vZmYgQ1BVICovCisJc2RsYV9ib290Y2ZnKGh3LCAmc2ZtLT5pbmZvKTsKKwlpZiAoc2RsYV9zdGFydChodywgc2ZtLT5pbmZvLnN0YXJ0b2ZmcykpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERhbW4uLi4gQWRhcHRlciB3b24ndCBzdGFydCFcbiIsCisJCQltb2RuYW1lKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogcG9zaXRpb24gRFBNIHdpbmRvdyBvdmVyIHRoZSBtYWlsYm94IGFuZCBlbmFibGUgaW50ZXJydXB0cyAqLworICAgICAgICBpZiAoc2RsYV9tYXBtZW0oaHcsIHNmbS0+aW5mby53aW5vZmZzKSB8fCBzZGxhX2ludGVuKGh3KSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogYWRhcHRlciBoYXJkd2FyZSBmYWlsdXJlIVxuIiwKKwkJCW1vZG5hbWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaHctPmZ3aWQgPSBzZm0tPmluZm8uY29kZWlkOwkJLyogc2V0IGZpcm13YXJlIElEICovCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBTRExBIGhhcmR3YXJlOiBzZXR1cCBtZW1vcnkgd2luZG93LCBJUlEsIGV0Yy4KKyAqLworc3RhdGljIGludCBzZGxhX2luaXQgKHNkbGFod190KiBodykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTRExBX01BWElPUkFOR0U7ICsraSkKKwkJaHctPnJlZ3NbaV0gPSAwOworCisJc3dpdGNoIChody0+dHlwZSkgeworCWNhc2UgU0RMQV9TNTAyQTogcmV0dXJuIGluaXRfczUwMmEoaHcpOworCWNhc2UgU0RMQV9TNTAyRTogcmV0dXJuIGluaXRfczUwMmUoaHcpOworCWNhc2UgU0RMQV9TNTAzOiAgcmV0dXJuIGluaXRfczUwMyhodyk7CisJY2FzZSBTRExBX1M1MDc6ICByZXR1cm4gaW5pdF9zNTA3KGh3KTsKKwljYXNlIFNETEFfUzUwODogIHJldHVybiBpbml0X3M1MDgoaHcpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGFkYXB0ZXIgb24tYm9hcmQgbWVtb3J5LgorICogbyBzbGlkZSBEUE0gd2luZG93IGZyb20gdGhlIGJvdHRvbSB1cCBhbmQgdGVzdCBhZGFwdGVyIG1lbW9yeSBzZWdtZW50IGJ5CisgKiAgIHNlZ21lbnQuCisgKiBSZXR1cm4gYWRhcHRlciBtZW1vcnkgc2l6ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2RsYV9tZW10ZXN0IChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgbG9uZyBtZW1zaXplOworCXVuc2lnbmVkIHdpbnNpemU7CisKKwlmb3IgKG1lbXNpemUgPSAwLCB3aW5zaXplID0gaHctPmRwbXNpemU7CisJICAgICAhc2RsYV9tYXBtZW0oaHcsIG1lbXNpemUpICYmCisJCSh0ZXN0X21lbXJlZ2lvbihody0+ZHBtYmFzZSwgd2luc2l6ZSkgPT0gd2luc2l6ZSkKKwkgICAgIDsKKwkgICAgIG1lbXNpemUgKz0gd2luc2l6ZSkKKwk7CisJaHctPm1lbW9yeSA9IG1lbXNpemU7CisJcmV0dXJuIG1lbXNpemU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJlcGFyZSBib290LXRpbWUgZmlybXdhcmUgY29uZmlndXJhdGlvbiBkYXRhLgorICogbyBwb3NpdGlvbiBEUE0gd2luZG93CisgKiBvIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiBkYXRhIGFyZWEKKyAqLworc3RhdGljIGludCBzZGxhX2Jvb3RjZmcgKHNkbGFod190KiBodywgc2ZtX2luZm9fdCogc2ZtaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyKiBkYXRhOworCisJaWYgKCFzZm1pbmZvLT5kYXRhc2l6ZSkgcmV0dXJuIDA7CS8qIG5vdGhpbmcgdG8gZG8gKi8KKworCWlmIChzZGxhX21hcG1lbShodywgc2ZtaW5mby0+ZGF0YW9mZnMpICE9IDApCisJCXJldHVybiAtRUlPOworCisJaWYoaHctPnR5cGUgPT0gU0RMQV9TNTE0KQorICAgICAgICAgICAgICAgIGRhdGEgPSAodm9pZCopKGh3LT5kcG1iYXNlICsgc2ZtaW5mby0+ZGF0YW9mZnMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGF0YSA9ICh2b2lkKikoKHU4ICopaHctPmRwbWJhc2UgKworICAgICAgICAgICAgICAgICAgICAgICAgKHNmbWluZm8tPmRhdGFvZmZzIC0gaHctPnZlY3RvcikpOworCisJbWVtc2V0X2lvIChkYXRhLCAwLCBzZm1pbmZvLT5kYXRhc2l6ZSk7CisKKwl3cml0ZWIgKG1ha2VfY29uZmlnX2J5dGUoaHcpLCAmZGF0YVsweDAwXSk7CisKKwlzd2l0Y2ggKHNmbWluZm8tPmNvZGVpZCkgeworCWNhc2UgU0ZJRF9YMjVfNTAyOgorCWNhc2UgU0ZJRF9YMjVfNTA4OgorICAgICAgICAgICAgICAgIHdyaXRlYiAoMywgJmRhdGFbMHgwMV0pOyAgICAgICAgLyogVDEgdGltZXIgKi8KKyAgICAgICAgICAgICAgICB3cml0ZWIgKDEwLCAmZGF0YVsweDAzXSk7ICAgICAgIC8qIE4yICovCisgICAgICAgICAgICAgICAgd3JpdGViICg3LCAmZGF0YVsweDA2XSk7ICAgICAgICAvKiBIRExDIHdpbmRvdyBzaXplICovCisgICAgICAgICAgICAgICAgd3JpdGViICgxLCAmZGF0YVsweDBCXSk7ICAgICAgICAvKiBEVEUgKi8KKyAgICAgICAgICAgICAgICB3cml0ZWIgKDIsICZkYXRhWzB4MENdKTsgICAgICAgIC8qIFguMjUgcGFja2V0IHdpbmRvdyBzaXplICovCisgICAgICAgICAgICAgICAgd3JpdGV3ICgxMjgsICZkYXRhWzB4MERdKTsJLyogZGVmYXVsdCBYLjI1IGRhdGEgc2l6ZSAqLworICAgICAgICAgICAgICAgIHdyaXRldyAoMTI4LCAmZGF0YVsweDBGXSk7CS8qIG1heGltdW0gWC4yNSBkYXRhIHNpemUgKi8KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByZXBhcmUgY29uZmlndXJhdGlvbiBieXRlIGlkZW50aWZ5aW5nIGFkYXB0ZXIgdHlwZSBhbmQgQ1BVIGNsb2NrIHJhdGUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1ha2VfY29uZmlnX2J5dGUgKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ5dGUgPSAwOworCisJc3dpdGNoIChody0+cGNsaykgeworCQljYXNlIDUwMDA6ICBieXRlID0gMHgwMTsgYnJlYWs7CisJCWNhc2UgNzIwMDogIGJ5dGUgPSAweDAyOyBicmVhazsKKwkJY2FzZSA4MDAwOiAgYnl0ZSA9IDB4MDM7IGJyZWFrOworCQljYXNlIDEwMDAwOiBieXRlID0gMHgwNDsgYnJlYWs7CisJCWNhc2UgMTYwMDA6IGJ5dGUgPSAweDA1OyBicmVhazsKKwl9CisKKwlzd2l0Y2ggKGh3LT50eXBlKSB7CisJCWNhc2UgU0RMQV9TNTAyRTogYnl0ZSB8PSAweDgwOyBicmVhazsKKwkJY2FzZSBTRExBX1M1MDM6ICBieXRlIHw9IDB4NDA7IGJyZWFrOworCX0KKwlyZXR1cm4gYnl0ZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFydCBhZGFwdGVyJ3MgQ1BVLgorICogbyBjYWxjdWxhdGUgYSBwb2ludGVyIHRvIGFkYXB0ZXIncyBjb2xkIGJvb3QgZW50cnkgcG9pbnQKKyAqIG8gcG9zaXRpb24gRFBNIHdpbmRvdworICogbyBwbGFjZSBib290IGluc3RydWN0aW9uIChqcCBhZGRyKSBhdCBjb2xkIGJvb3QgZW50cnkgcG9pbnQKKyAqIG8gc3RhcnQgQ1BVCisgKi8KK3N0YXRpYyBpbnQgc2RsYV9zdGFydCAoc2RsYWh3X3QqIGh3LCB1bnNpZ25lZCBhZGRyKQoreworCXVuc2lnbmVkIHBvcnQgPSBody0+cG9ydDsKKwl1bnNpZ25lZCBjaGFyICpib290cDsKKwlpbnQgZXJyLCB0bXAsIGk7CisKKwlpZiAoIXBvcnQgJiYgKGh3LT50eXBlICE9IFNETEFfUzUxNCkpIHJldHVybiAtRUZBVUxUOworCisgCXN3aXRjaCAoaHctPnR5cGUpIHsKKwljYXNlIFNETEFfUzUwMkE6CisJCWJvb3RwID0gaHctPmRwbWJhc2U7CisJCWJvb3RwICs9IDB4NjY7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDJFOgorCWNhc2UgU0RMQV9TNTAzOgorCWNhc2UgU0RMQV9TNTA3OgorCWNhc2UgU0RMQV9TNTA4OgorCWNhc2UgU0RMQV9TNTE0OgorCQlib290cCA9IGh3LT5kcG1iYXNlOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVyciA9IHNkbGFfbWFwbWVtKGh3LCAwKTsKKwlpZiAoZXJyKSByZXR1cm4gZXJyOworCisgICAgICAJd3JpdGViICgweEMzLCBib290cCk7ICAgLyogWjgwOiAnanAnIG9wY29kZSAqLworCWJvb3RwICsrOworCXdyaXRldyAoYWRkciwgYm9vdHApOworCisJc3dpdGNoIChody0+dHlwZSkgeworCWNhc2UgU0RMQV9TNTAyQToKKwkJX09VVEIocG9ydCwgMHgxMCk7CQkvKiBpc3N1ZSBOTUkgdG8gQ1BVICovCisJCWh3LT5yZWdzWzBdID0gMHgxMDsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMkU6CisJCV9PVVRCKHBvcnQgKyAzLCAweDAxKTsJCS8qIHN0YXJ0IENQVSAqLworCQlody0+cmVnc1szXSA9IDB4MDE7CisJCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CisJCWlmIChfSU5CKHBvcnQpICYgMHgwMSkgewkvKiB2ZXJpZnkgKi8KKwkJCS8qCisJCQkgKiBFbmFibGluZyBDUFUgY2hhbmdlcyBmdW5jdGlvbmFsaXR5IG9mIHRoZQorCQkJICogY29udHJvbCByZWdpc3Rlciwgc28gd2UgaGF2ZSB0byByZXNldCBpdHMKKwkJCSAqIG1pcnJvci4KKwkJCSAqLworCQkJX09VVEIocG9ydCwgMCk7CQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwkJCWh3LT5yZWdzWzBdID0gMDsKKwkJfQorCQllbHNlIHJldHVybiAtRUlPOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAzOgorCQl0bXAgPSBody0+cmVnc1swXSB8IDB4MDk7CS8qIHNldCBiaXRzIDAgYW5kIDMgKi8KKwkJX09VVEIocG9ydCwgdG1wKTsKKwkJaHctPnJlZ3NbMF0gPSB0bXA7CQkvKiB1cGRhdGUgbWlycm9yICovCisJCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CisJCWlmICghKF9JTkIocG9ydCkgJiAweDAxKSkJLyogdmVyaWZ5ICovCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwNzoKKwkJdG1wID0gaHctPnJlZ3NbMF0gfCAweDAyOworCQlfT1VUQihwb3J0LCB0bXApOworCQlody0+cmVnc1swXSA9IHRtcDsJCS8qIHVwZGF0ZSBtaXJyb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsKKwkJaWYgKCEoX0lOQihwb3J0KSAmIDB4MDQpKQkvKiB2ZXJpZnkgKi8KKwkJCXJldHVybiAtRUlPOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTA4OgorCQl0bXAgPSBody0+cmVnc1swXSB8IDB4MDI7CisJCV9PVVRCKHBvcnQsIHRtcCk7CisJCWh3LT5yZWdzWzBdID0gdG1wOwkvKiB1cGRhdGUgbWlycm9yICovCisJCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CisJCWlmICghKF9JTkIocG9ydCArIDEpICYgMHgwMikpCS8qIHZlcmlmeSAqLworCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MTQ6CisJCXdyaXRlYiAoUzUxNF9DUFVfU1RBUlQsIGh3LT52ZWN0b3IpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIFM1MDJBIGFkYXB0ZXIuCisgKi8KK3N0YXRpYyBpbnQgaW5pdF9zNTAyYSAoc2RsYWh3X3QqIGh3KQoreworCXVuc2lnbmVkIHBvcnQgPSBody0+cG9ydDsKKwlpbnQgdG1wLCBpOworCisJaWYgKCFkZXRlY3RfczUwMmEocG9ydCkpCisJCXJldHVybiAtRU5PREVWOworCisJaHctPnJlZ3NbMF0gPSAweDA4OworCWh3LT5yZWdzWzFdID0gMHhGRjsKKworCS8qIFZlcmlmeSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKwlpID0gZ2V0X29wdGlvbl9pbmRleChzNTAyYV9kcG1iYXNlX29wdGlvbnMsIHZpcnRfdG9fcGh5cyhody0+ZHBtYmFzZSkpOworCWlmIChpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdG1wID0gczUwMmFfaG1jcltpIC0gMV07CisJc3dpdGNoIChody0+ZHBtc2l6ZSkgeworCWNhc2UgMHgyMDAwOgorCQl0bXAgfD0gMHgwMTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTAwMDBMOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFNldHVwIGR1YWwtcG9ydCBtZW1vcnkgd2luZG93ICh0aGlzIGFsc28gZW5hYmxlcyBtZW1vcnkgYWNjZXNzKSAqLworCV9PVVRCKHBvcnQgKyAxLCB0bXApOworCWh3LT5yZWdzWzFdID0gdG1wOworCWh3LT5yZWdzWzBdID0gMHgwODsKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIFM1MDJFIGFkYXB0ZXIuCisgKi8KK3N0YXRpYyBpbnQgaW5pdF9zNTAyZSAoc2RsYWh3X3QqIGh3KQoreworCXVuc2lnbmVkIHBvcnQgPSBody0+cG9ydDsKKwlpbnQgdG1wLCBpOworCisJaWYgKCFkZXRlY3RfczUwMmUocG9ydCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworCWkgPSBnZXRfb3B0aW9uX2luZGV4KHM1MDhfZHBtYmFzZV9vcHRpb25zLCB2aXJ0X3RvX3BoeXMoaHctPmRwbWJhc2UpKTsKKwlpZiAoaSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRtcCA9IHM1MDJlX2htY3JbaSAtIDFdOworCXN3aXRjaCAoaHctPmRwbXNpemUpIHsKKwljYXNlIDB4MjAwMDoKKwkJdG1wIHw9IDB4MDE7CisJCWJyZWFrOworCisJY2FzZSAweDEwMDAwTDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTZXR1cCBkdWFsLXBvcnQgbWVtb3J5IHdpbmRvdyAqLworCV9PVVRCKHBvcnQgKyAxLCB0bXApOworCWh3LT5yZWdzWzFdID0gdG1wOworCisJLyogRW5hYmxlIG1lbW9yeSBhY2Nlc3MgKi8KKwlfT1VUQihwb3J0LCAweDAyKTsKKwlody0+cmVnc1swXSA9IDB4MDI7CisJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwlyZXR1cm4gKF9JTkIocG9ydCkgJiAweDAyKSA/IDAgOiAtRUlPOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgUzUwMyBhZGFwdGVyLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgaW5pdF9zNTAzIChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgcG9ydCA9IGh3LT5wb3J0OworCWludCB0bXAsIGk7CisKKwlpZiAoIWRldGVjdF9zNTAzKHBvcnQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFZlcmlmeSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKwlpID0gZ2V0X29wdGlvbl9pbmRleChzNTA4X2RwbWJhc2Vfb3B0aW9ucywgdmlydF90b19waHlzKGh3LT5kcG1iYXNlKSk7CisJaWYgKGkgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0bXAgPSBzNTAyZV9obWNyW2kgLSAxXTsKKwlzd2l0Y2ggKGh3LT5kcG1zaXplKSB7CisJY2FzZSAweDIwMDA6CisJCXRtcCB8PSAweDAxOworCQlicmVhazsKKworCWNhc2UgMHgxMDAwMEw6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0dXAgZHVhbC1wb3J0IG1lbW9yeSB3aW5kb3cgKi8KKwlfT1VUQihwb3J0ICsgMSwgdG1wKTsKKwlody0+cmVnc1sxXSA9IHRtcDsKKworCS8qIEVuYWJsZSBtZW1vcnkgYWNjZXNzICovCisJX09VVEIocG9ydCwgMHgwMik7CisJaHctPnJlZ3NbMF0gPSAweDAyOwkvKiB1cGRhdGUgbWlycm9yICovCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBTNTA3IGFkYXB0ZXIuCisgKi8KK3N0YXRpYyBpbnQgaW5pdF9zNTA3IChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgcG9ydCA9IGh3LT5wb3J0OworCWludCB0bXAsIGk7CisKKwlpZiAoIWRldGVjdF9zNTA3KHBvcnQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFZlcmlmeSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKwlpID0gZ2V0X29wdGlvbl9pbmRleChzNTA3X2RwbWJhc2Vfb3B0aW9ucywgdmlydF90b19waHlzKGh3LT5kcG1iYXNlKSk7CisJaWYgKGkgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0bXAgPSBzNTA3X2htY3JbaSAtIDFdOworCXN3aXRjaCAoaHctPmRwbXNpemUpIHsKKwljYXNlIDB4MjAwMDoKKwkJdG1wIHw9IDB4MDE7CisJCWJyZWFrOworCisJY2FzZSAweDEwMDAwTDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBFbmFibGUgYWRhcHRlcidzIGxvZ2ljICovCisJX09VVEIocG9ydCwgMHgwMSk7CisJaHctPnJlZ3NbMF0gPSAweDAxOworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJaWYgKCEoX0lOQihwb3J0KSAmIDB4MjApKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIFNldHVwIGR1YWwtcG9ydCBtZW1vcnkgd2luZG93ICovCisJX09VVEIocG9ydCArIDEsIHRtcCk7CisJaHctPnJlZ3NbMV0gPSB0bXA7CisKKwkvKiBFbmFibGUgbWVtb3J5IGFjY2VzcyAqLworCXRtcCA9IGh3LT5yZWdzWzBdIHwgMHgwNDsKKwlpZiAoaHctPmlycSkgeworCQlpID0gZ2V0X29wdGlvbl9pbmRleChzNTA4X2lycV9vcHRpb25zLCBody0+aXJxKTsKKwkJaWYgKGkpIHRtcCB8PSBzNTA3X2lycW1hc2tbaSAtIDFdOworCX0KKwlfT1VUQihwb3J0LCB0bXApOworCWh3LT5yZWdzWzBdID0gdG1wOwkJLyogdXBkYXRlIG1pcnJvciAqLworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJcmV0dXJuIChfSU5CKHBvcnQpICYgMHgwOCkgPyAwIDogLUVJTzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIFM1MDggYWRhcHRlci4KKyAqLworc3RhdGljIGludCBpbml0X3M1MDggKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBwb3J0ID0gaHctPnBvcnQ7CisJaW50IHRtcCwgaTsKKworCWlmICghZGV0ZWN0X3M1MDgocG9ydCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworCWkgPSBnZXRfb3B0aW9uX2luZGV4KHM1MDhfZHBtYmFzZV9vcHRpb25zLCB2aXJ0X3RvX3BoeXMoaHctPmRwbWJhc2UpKTsKKwlpZiAoaSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNldHVwIG1lbW9yeSBjb25maWd1cmF0aW9uICovCisJdG1wID0gczUwOF9obWNyW2kgLSAxXTsKKwlfT1VUQihwb3J0ICsgMSwgdG1wKTsKKwlody0+cmVnc1sxXSA9IHRtcDsKKworCS8qIEVuYWJsZSBtZW1vcnkgYWNjZXNzICovCisJX09VVEIocG9ydCwgMHgwNCk7CisJaHctPnJlZ3NbMF0gPSAweDA0OwkJLyogdXBkYXRlIG1pcnJvciAqLworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJcmV0dXJuIChfSU5CKHBvcnQgKyAxKSAmIDB4MDQpID8gMCA6IC1FSU87Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZWN0IFM1MDJBIGFkYXB0ZXIuCisgKglGb2xsb3dpbmcgdGVzdHMgYXJlIHVzZWQgdG8gZGV0ZWN0IFM1MDJBIGFkYXB0ZXI6CisgKgkxLiBBbGwgcmVnaXN0ZXJzIG90aGVyIHRoYW4gc3RhdHVzIChCQVNFKSBzaG91bGQgcmVhZCAweEZGCisgKgkyLiBBZnRlciB3cml0aW5nIDAwMDAxMDAwYiB0byBjb250cm9sIHJlZ2lzdGVyLCBzdGF0dXMgcmVnaXN0ZXIgc2hvdWxkCisgKgkgICByZWFkIDAxMDAwMDAwYi4KKyAqCTMuIEFmdGVyIHdyaXRpbmcgMCB0byBjb250cm9sIHJlZ2lzdGVyLCBzdGF0dXMgcmVnaXN0ZXIgc2hvdWxkIHN0aWxsCisgKgkgICByZWFkICAwMTAwMDAwMGIuCisgKgk0LiBBZnRlciB3cml0aW5nIDAwMDAwMTAwYiB0byBjb250cm9sIHJlZ2lzdGVyLCBzdGF0dXMgcmVnaXN0ZXIgc2hvdWxkCisgKgkgICByZWFkIDAxMDAwMTAwYi4KKyAqCVJldHVybiAxIGlmIGRldGVjdGVkIG8uay4gb3IgMCBpZiBmYWlsZWQuCisgKglOb3RlOglUaGlzIHRlc3QgaXMgZGVzdHJ1Y3RpdmUhIEFkYXB0ZXIgd2lsbCBiZSBsZWZ0IGluIHNodXRkb3duCisgKgkJc3RhdGUgYWZ0ZXIgdGhlIHRlc3QuCisgKi8KK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MDJhIChpbnQgcG9ydCkKK3sKKwlpbnQgaSwgajsKKworCWlmICghZ2V0X29wdGlvbl9pbmRleChzNTAyX3BvcnRfb3B0aW9ucywgcG9ydCkpCisJCXJldHVybiAwOworCQorCWZvciAoaiA9IDE7IGogPCBTRExBX01BWElPUkFOR0U7ICsraikgeworCQlpZiAoX0lOQihwb3J0ICsgaikgIT0gMHhGRikKKwkJCXJldHVybiAwOworCQlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCX0KKworCV9PVVRCKHBvcnQsIDB4MDgpOwkJCS8qIGhhbHQgQ1BVICovCisJX09VVEIocG9ydCwgMHgwOCk7CisJX09VVEIocG9ydCwgMHgwOCk7CisJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwlpZiAoX0lOQihwb3J0KSAhPSAweDQwKQorCQlyZXR1cm4gMDsKKwlfT1VUQihwb3J0LCAweDAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCWlmIChfSU5CKHBvcnQpICE9IDB4NDApCisJCXJldHVybiAwOworCV9PVVRCKHBvcnQsIDB4MDQpOworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJaWYgKF9JTkIocG9ydCkgIT0gMHg0NCkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZXNldCBhZGFwdGVyICovCisJX09VVEIocG9ydCwgMHgwOCk7CisJX09VVEIocG9ydCwgMHgwOCk7CisJX09VVEIocG9ydCwgMHgwOCk7CisJX09VVEIocG9ydCArIDEsIDB4RkYpOworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVjdCBTNTAyRSBhZGFwdGVyLgorICoJRm9sbG93aW5nIHRlc3RzIGFyZSB1c2VkIHRvIHZlcmlmeSBhZGFwdGVyIHByZXNlbmNlOgorICoJMS4gQWxsIHJlZ2lzdGVycyBvdGhlciB0aGFuIHN0YXR1cyAoQkFTRSkgc2hvdWxkIHJlYWQgMHhGRi4KKyAqCTIuIEFmdGVyIHdyaXRpbmcgMCB0byBDUFUgY29udHJvbCByZWdpc3RlciAoQkFTRSszKSwgc3RhdHVzIHJlZ2lzdGVyCisgKgkgICAoQkFTRSkgc2hvdWxkIHJlYWQgMTExMTEwMDBiLgorICoJMy4gQWZ0ZXIgd3JpdGluZyAwMDAwMDEwMGIgdG8gcG9ydCBCQVNFIChzZXQgYml0IDIpLCBzdGF0dXMgcmVnaXN0ZXIKKyAqCSAgIChCQVNFKSBzaG91bGQgcmVhZCAxMTExMTEwMGIuCisgKglSZXR1cm4gMSBpZiBkZXRlY3RlZCBvLmsuIG9yIDAgaWYgZmFpbGVkLgorICoJTm90ZToJVGhpcyB0ZXN0IGlzIGRlc3RydWN0aXZlISBBZGFwdGVyIHdpbGwgYmUgbGVmdCBpbiBzaHV0ZG93bgorICoJCXN0YXRlIGFmdGVyIHRoZSB0ZXN0LgorICovCitzdGF0aWMgaW50IGRldGVjdF9zNTAyZSAoaW50IHBvcnQpCit7CisJaW50IGksIGo7CisKKwlpZiAoIWdldF9vcHRpb25faW5kZXgoczUwMl9wb3J0X29wdGlvbnMsIHBvcnQpKQorCQlyZXR1cm4gMDsKKwlmb3IgKGogPSAxOyBqIDwgU0RMQV9NQVhJT1JBTkdFOyArK2opIHsKKwkJaWYgKF9JTkIocG9ydCArIGopICE9IDB4RkYpCisJCQlyZXR1cm4gMDsKKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwl9CisKKwlfT1VUQihwb3J0ICsgMywgMCk7CQkJLyogQ1BVIGNvbnRyb2wgcmVnLiAqLworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJaWYgKF9JTkIocG9ydCkgIT0gMHhGOCkJCQkvKiByZWFkIHN0YXR1cyAqLworCQlyZXR1cm4gMDsKKwlfT1VUQihwb3J0LCAweDA0KTsJCQkvKiBzZXQgYml0IDIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCWlmIChfSU5CKHBvcnQpICE9IDB4RkMpCQkJLyogdmVyaWZ5ICovCisJCXJldHVybiAwOworCisJLyogUmVzZXQgYWRhcHRlciAqLworCV9PVVRCKHBvcnQsIDApOworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVjdCBzNTAzIGFkYXB0ZXIuCisgKglGb2xsb3dpbmcgdGVzdHMgYXJlIHVzZWQgdG8gdmVyaWZ5IGFkYXB0ZXIgcHJlc2VuY2U6CisgKgkxLiBBbGwgcmVnaXN0ZXJzIG90aGVyIHRoYW4gc3RhdHVzIChCQVNFKSBzaG91bGQgcmVhZCAweEZGLgorICoJMi4gQWZ0ZXIgd3JpdGluZyAwIHRvIGNvbnRyb2wgcmVnaXN0ZXIgKEJBU0UpLCBzdGF0dXMgcmVnaXN0ZXIgKEJBU0UpCisgKgkgICBzaG91bGQgcmVhZCAxMTExMDAwMGIuCisgKgkzLiBBZnRlciB3cml0aW5nIDAwMDAwMTAwYiAoc2V0IGJpdCAyKSB0byBjb250cm9sIHJlZ2lzdGVyIChCQVNFKSwKKyAqCSAgIHN0YXR1cyByZWdpc3RlciBzaG91bGQgcmVhZCAxMTExMDAxMGIuCisgKglSZXR1cm4gMSBpZiBkZXRlY3RlZCBvLmsuIG9yIDAgaWYgZmFpbGVkLgorICoJTm90ZToJVGhpcyB0ZXN0IGlzIGRlc3RydWN0aXZlISBBZGFwdGVyIHdpbGwgYmUgbGVmdCBpbiBzaHV0ZG93bgorICoJCXN0YXRlIGFmdGVyIHRoZSB0ZXN0LgorICovCitzdGF0aWMgaW50IGRldGVjdF9zNTAzIChpbnQgcG9ydCkKK3sKKwlpbnQgaSwgajsKKworCWlmICghZ2V0X29wdGlvbl9pbmRleChzNTAzX3BvcnRfb3B0aW9ucywgcG9ydCkpCisJCXJldHVybiAwOworCWZvciAoaiA9IDE7IGogPCBTRExBX01BWElPUkFOR0U7ICsraikgeworCQlpZiAoX0lOQihwb3J0ICsgaikgIT0gMHhGRikKKwkJCXJldHVybiAwOworCQlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCX0KKworCV9PVVRCKHBvcnQsIDApOwkJCQkvKiByZXNldCBjb250cm9sIHJlZy4qLworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJaWYgKF9JTkIocG9ydCkgIT0gMHhGMCkJCQkvKiByZWFkIHN0YXR1cyAqLworCQlyZXR1cm4gMDsKKwlfT1VUQihwb3J0LCAweDA0KTsJCQkvKiBzZXQgYml0IDIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCWlmIChfSU5CKHBvcnQpICE9IDB4RjIpCQkJLyogdmVyaWZ5ICovCisJCXJldHVybiAwOworCisJLyogUmVzZXQgYWRhcHRlciAqLworCV9PVVRCKHBvcnQsIDApOworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVjdCBzNTA3IGFkYXB0ZXIuCisgKglGb2xsb3dpbmcgdGVzdHMgYXJlIHVzZWQgdG8gZGV0ZWN0IHM1MDcgYWRhcHRlcjoKKyAqCTEuIEFsbCBwb3J0cyBzaG91bGQgcmVhZCB0aGUgc2FtZSB2YWx1ZS4KKyAqCTIuIEFmdGVyIHdyaXRpbmcgMHgwMCB0byBjb250cm9sIHJlZ2lzdGVyLCBzdGF0dXMgcmVnaXN0ZXIgc2hvdWxkIHJlYWQKKyAqCSAgID8wMTEwMDA/Yi4KKyAqCTMuIEFmdGVyIHdyaXRpbmcgMHgwMSB0byBjb250cm9sIHJlZ2lzdGVyLCBzdGF0dXMgcmVnaXN0ZXIgc2hvdWxkIHJlYWQKKyAqCSAgID8wMTEwMDE/Yi4KKyAqCVJldHVybiAxIGlmIGRldGVjdGVkIG8uay4gb3IgMCBpZiBmYWlsZWQuCisgKglOb3RlOglUaGlzIHRlc3QgaXMgZGVzdHJ1Y3RpdmUhIEFkYXB0ZXIgd2lsbCBiZSBsZWZ0IGluIHNodXRkb3duCisgKgkJc3RhdGUgYWZ0ZXIgdGhlIHRlc3QuCisgKi8KK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MDcgKGludCBwb3J0KQoreworCWludCB0bXAsIGksIGo7CisKKwlpZiAoIWdldF9vcHRpb25faW5kZXgoczUwOF9wb3J0X29wdGlvbnMsIHBvcnQpKQorCQlyZXR1cm4gMDsKKwl0bXAgPSBfSU5CKHBvcnQpOworCWZvciAoaiA9IDE7IGogPCBTNTA3X0lPUkFOR0U7ICsraikgeworCQlpZiAoX0lOQihwb3J0ICsgaikgIT0gdG1wKQorCQkJcmV0dXJuIDA7CisJCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJfQorCisJX09VVEIocG9ydCwgMHgwMCk7CisJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwlpZiAoKF9JTkIocG9ydCkgJiAweDdFKSAhPSAweDMwKQorCQlyZXR1cm4gMDsKKwlfT1VUQihwb3J0LCAweDAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCWlmICgoX0lOQihwb3J0KSAmIDB4N0UpICE9IDB4MzIpCisJCXJldHVybiAwOworCisJLyogUmVzZXQgYWRhcHRlciAqLworCV9PVVRCKHBvcnQsIDB4MDApOworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVjdCBzNTA4IGFkYXB0ZXIuCisgKglGb2xsb3dpbmcgdGVzdHMgYXJlIHVzZWQgdG8gZGV0ZWN0IHM1MDggYWRhcHRlcjoKKyAqCTEuIEFmdGVyIHdyaXRpbmcgMHgwMCB0byBjb250cm9sIHJlZ2lzdGVyLCBzdGF0dXMgcmVnaXN0ZXIgc2hvdWxkIHJlYWQKKyAqCSAgID8/MDAwMDAwYi4KKyAqCTIuIEFmdGVyIHdyaXRpbmcgMHgxMCB0byBjb250cm9sIHJlZ2lzdGVyLCBzdGF0dXMgcmVnaXN0ZXIgc2hvdWxkIHJlYWQKKyAqCSAgID8/MDEwMDAwYgorICoJUmV0dXJuIDEgaWYgZGV0ZWN0ZWQgby5rLiBvciAwIGlmIGZhaWxlZC4KKyAqCU5vdGU6CVRoaXMgdGVzdCBpcyBkZXN0cnVjdGl2ZSEgQWRhcHRlciB3aWxsIGJlIGxlZnQgaW4gc2h1dGRvd24KKyAqCQlzdGF0ZSBhZnRlciB0aGUgdGVzdC4KKyAqLworc3RhdGljIGludCBkZXRlY3RfczUwOCAoaW50IHBvcnQpCit7CisJaW50IGk7CisKKwlpZiAoIWdldF9vcHRpb25faW5kZXgoczUwOF9wb3J0X29wdGlvbnMsIHBvcnQpKQorCQlyZXR1cm4gMDsKKwlfT1VUQihwb3J0LCAweDAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCWlmICgoX0lOQihwb3J0ICsgMSkgJiAweDNGKSAhPSAweDAwKQorCQlyZXR1cm4gMDsKKwlfT1VUQihwb3J0LCAweDEwKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCWlmICgoX0lOQihwb3J0ICsgMSkgJiAweDNGKSAhPSAweDEwKQorCQlyZXR1cm4gMDsKKworCS8qIFJlc2V0IGFkYXB0ZXIgKi8KKwlfT1VUQihwb3J0LCAweDAwKTsKKwlyZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXRlY3QgczUxNCBQQ0kgYWRhcHRlci4KKyAqICAgICAgUmV0dXJuIDEgaWYgZGV0ZWN0ZWQgby5rLiBvciAwIGlmIGZhaWxlZC4KKyAqICAgICAgTm90ZTogICBUaGlzIHRlc3QgaXMgZGVzdHJ1Y3RpdmUhIEFkYXB0ZXIgd2lsbCBiZSBsZWZ0IGluIHNodXRkb3duCisgKiAgICAgICAgICAgICAgc3RhdGUgYWZ0ZXIgdGhlIHRlc3QuCisgKi8KK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MTQgKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBjaGFyIENQVV9ubywgc2xvdF9ubywgYXV0b19zbG90X2NmZzsKKwlpbnQgbnVtYmVyX1M1MTRfY2FyZHMgPSAwOworCXUzMiBTNTE0X21lbV9iYXNlX2FkZHIgPSAwOworCXUzMiB1dF91MzI7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisKKworI2lmbmRlZiBDT05GSUdfUENJCisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBMaW51eCBub3QgY29tcGlsZWQgZm9yIFBDSSB1c2FnZSFcbiIsIG1vZG5hbWUpOworICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorCisJLyoKKwlUaGUgJ3NldHVwKCknIHByb2NlZHVyZSBpbiAnc2RsYW1haW4uYycgcGFzc2VzIHRoZSBDUFUgbnVtYmVyIGFuZCB0aGUKKwlzbG90IG51bWJlciBkZWZpbmVkIGluICdyb3V0ZXIuY29uZicgdmlhIHRoZSAncG9ydCcgZGVmaW5pdGlvbi4KKwkqLworCUNQVV9ubyA9IGh3LT5TNTE0X2NwdV9ub1swXTsKKwlzbG90X25vID0gaHctPlM1MTRfc2xvdF9ubzsKKwlhdXRvX3Nsb3RfY2ZnID0gaHctPmF1dG9fcGNpX2NmZzsKKworCWlmIChhdXRvX3Nsb3RfY2ZnKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNyY2guLi4gUzUxNCBjYXJkLCBDUFUgJWMsIFNsb3Q9QXV0b1xuIiwKKwkJbW9kbmFtZSwgQ1BVX25vKTsKKworCX1lbHNleworCQlwcmludGsoS0VSTl9JTkZPICIlczogc3JjaC4uLiBTNTE0IGNhcmQsIENQVSAlYywgU2xvdCAjJWRcbiIsCisJCW1vZG5hbWUsIENQVV9ubywgc2xvdF9ubyk7CisJfQorCQorCS8qIGNoZWNrIHRvIHNlZSB0aGF0IENQVSBBIG9yIEIgaGFzIGJlZW4gc2VsZWN0ZWQgaW4gJ3JvdXRlci5jb25mJyAqLworCXN3aXRjaChDUFVfbm8pIHsKKwkJY2FzZSBTNTE0X0NQVV9BOgorCQljYXNlIFM1MTRfQ1BVX0I6CisJCQlicmVhazsKKwkKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTNTE0IENQVSBkZWZpbml0aW9uIGludmFsaWQuXG4iLCAKKwkJCQltb2RuYW1lKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIk11c3QgYmUgJ0EnIG9yICdCJ1xuIik7CisJCQlyZXR1cm4gMDsKKwl9CisKKwludW1iZXJfUzUxNF9jYXJkcyA9IGZpbmRfczUxNF9hZGFwdGVyKGh3LCAwKTsKKwlpZighbnVtYmVyX1M1MTRfY2FyZHMpCisJCXJldHVybiAwOworCisJLyogd2UgYXJlIHVzaW5nIGEgc2luZ2xlIFM1MTQgYWRhcHRlciB3aXRoIGEgc2xvdCBvZiAwIHNvIHJlLXJlYWQgdGhlICovCQorCS8qIGxvY2F0aW9uIG9mIHRoaXMgYWRhcHRlciAqLworCWlmKChudW1iZXJfUzUxNF9jYXJkcyA9PSAxKSAmJiBhdXRvX3Nsb3RfY2ZnKSB7CQorICAgICAgICAJbnVtYmVyX1M1MTRfY2FyZHMgPSBmaW5kX3M1MTRfYWRhcHRlcihodywgMSk7CisJCWlmKCFudW1iZXJfUzUxNF9jYXJkcykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVycm9yIGZpbmRpbmcgUENJIGNhcmRcbiIsCisJCQkJbW9kbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXBjaV9kZXYgPSBody0+cGNpX2RldjsKKwkvKiByZWFkIHRoZSBwaHlzaWNhbCBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisJUzUxNF9tZW1fYmFzZV9hZGRyID0gKENQVV9ubyA9PSBTNTE0X0NQVV9BKSA/IAorCQkocGNpX2Rldi0+cmVzb3VyY2VbMV0uc3RhcnQpIDoKKwkJKHBjaV9kZXYtPnJlc291cmNlWzJdLnN0YXJ0KTsKKwkKKwlwcmludGsoS0VSTl9JTkZPICIlczogUzUxNCBQQ0kgbWVtb3J5IGF0IDB4JVhcbiIsCisJCW1vZG5hbWUsIFM1MTRfbWVtX2Jhc2VfYWRkcik7CisJaWYoIVM1MTRfbWVtX2Jhc2VfYWRkcikgeworCQlpZihDUFVfbm8gPT0gUzUxNF9DUFVfQikKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDUFUgI0Igbm90IHByZXNlbnQgb24gdGhlIGNhcmRcbiIsIAkJCQltb2RuYW1lKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIFBDSSBtZW1vcnkgYWxsb2NhdGVkIHRvIGNhcmRcbiIsCQkJCW1vZG5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBlbmFibGUgdGhlIFBDSSBtZW1vcnkgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldiwgCisJCShDUFVfbm8gPT0gUzUxNF9DUFVfQSkgPyBQQ0lfTUFQMF9EV09SRCA6IFBDSV9NQVAxX0RXT1JELAorCQkmdXRfdTMyKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsCisJCShDUFVfbm8gPT0gUzUxNF9DUFVfQSkgPyBQQ0lfTUFQMF9EV09SRCA6IFBDSV9NQVAxX0RXT1JELAorCQkodXRfdTMyIHwgUENJX01FTU9SWV9FTkFCTEUpKTsKKworCS8qIGNoZWNrIHRoZSBJUlEgYWxsb2NhdGVkIGFuZCBlbmFibGUgSVJRIHVzYWdlICovCisJaWYoIShody0+aXJxID0gcGNpX2Rldi0+aXJxKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogSVJRIG5vdCBhbGxvY2F0ZWQgdG8gUzUxNCBhZGFwdGVyXG4iLAorCQkJbW9kbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJfQorCisJLyogQlVHIEZJWCA6IE1hciA2IDIwMDAKKyAJICogT24gYSBpbml0aWFsIGxvYWRpbmcgb2YgdGhlIGNhcmQsIHdlIG11c3QgY2hlY2sKKyAgICAgICAgICogYW5kIGNsZWFyIFBDSSBpbnRlcnJ1cHQgYml0cywgZHVlIHRvIGEgcmVzZXQKKyAgICAgICAgICogcHJvYmxlbSBvbiBzb21lIG90aGVyIGJvYXJkcy4gIGkuZS4gQW4gaW50ZXJydXB0CisgICAgICAgICAqIG1pZ2h0IGJlIHBlbmRpbmcsIGV2ZW4gYWZ0ZXIgc3lzdGVtIGJvb3R1cCwgCisgICAgICAgICAqIGluIHdoaWNoIGNhc2UsIHdoZW4gc3RhcnRpbmcgd2Fucm91dGVyIHRoZSBtYWNoaW5lCisgICAgICAgICAqIHdvdWxkIGNyYXNoLiAKKwkgKi8KKwlpZiAoaW5pdF9wY2lfc2xvdChodykpCisJCXJldHVybiAwOworCisgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCBQQ0lfSU5UX0NPTkZJRywgJnV0X3UzMik7CisgICAgICAgIHV0X3UzMiB8PSAoQ1BVX25vID09IFM1MTRfQ1BVX0EpID8KKyAgICAgICAgICAgICAgICBQQ0lfRU5BQkxFX0lSUV9DUFVfQSA6IFBDSV9FTkFCTEVfSVJRX0NQVV9COworICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9JTlRfQ09ORklHLCB1dF91MzIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElSUSAlZCBhbGxvY2F0ZWQgdG8gdGhlIFM1MTQgY2FyZFxuIiwKKwkJbW9kbmFtZSwgaHctPmlycSk7CisKKwkvKiBtYXAgdGhlIHBoeXNpY2FsIFBDSSBtZW1vcnkgdG8gdmlydHVhbCBtZW1vcnkgKi8KKwkodm9pZCAqKWh3LT5kcG1iYXNlID0gaW9yZW1hcCgodW5zaWduZWQgbG9uZylTNTE0X21lbV9iYXNlX2FkZHIsCisJCSh1bnNpZ25lZCBsb25nKU1BWF9TSVpFT0ZfUzUxNF9NRU1PUlkpOworICAgIAkvKiBtYXAgdGhlIHBoeXNpY2FsIGNvbnRyb2wgcmVnaXN0ZXIgbWVtb3J5IHRvIHZpcnR1YWwgbWVtb3J5ICovCisJaHctPnZlY3RvciA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAoCisJCSh1bnNpZ25lZCBsb25nKShTNTE0X21lbV9iYXNlX2FkZHIgKyBTNTE0X0NUUkxfUkVHX0JZVEUpLAorCQkodW5zaWduZWQgbG9uZykxNik7CisgICAgIAorICAgICAgICBpZighaHctPmRwbWJhc2UgfHwgIWh3LT52ZWN0b3IpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBDSSB2aXJ0dWFsIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIiwKKwkJCW1vZG5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCX0KKworCS8qIGhhbHQgdGhlIGFkYXB0ZXIgKi8KKwl3cml0ZWIgKFM1MTRfQ1BVX0hBTFQsIGh3LT52ZWN0b3IpOwkKKworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZpbmQgdGhlIFM1MTQgUENJIGFkYXB0ZXIgaW4gdGhlIFBDSSBidXMuCisgKiAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIFM1MTQgYWRhcHRlcnMgZm91bmQgKDAgaWYgbm8gYWRhcHRlciBmb3VuZCkuCisgKi8KK3N0YXRpYyBpbnQgZmluZF9zNTE0X2FkYXB0ZXIoc2RsYWh3X3QqIGh3LCBjaGFyIGZpbmRfZmlyc3RfUzUxNF9jYXJkKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyIHNsb3Rfbm87CisgICAgICAgIGludCBudW1iZXJfUzUxNF9jYXJkcyA9IDA7CisJY2hhciBTNTE0X2ZvdW5kX2luX3Nsb3QgPSAwOworICAgICAgICB1MTYgUENJX3N1YnN5c192ZW5kb3I7CisKKyAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworIAorICAgICAgIHNsb3Rfbm8gPSBody0+UzUxNF9zbG90X25vOworICAKKwl3aGlsZSAoKHBjaV9kZXYgPSBwY2lfZmluZF9kZXZpY2UoVjNfVkVORE9SX0lELCBWM19ERVZJQ0VfSUQsIHBjaV9kZXYpKQorICAgICAgICAJIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIAorCQlwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfU1VCU1lTX1ZFTkRPUl9XT1JELAorICAgICAgICAgICAgICAgICAgICAgICAgJlBDSV9zdWJzeXNfdmVuZG9yKTsKKyAgICAgICAgICAgICAgICAKKwkJaWYoUENJX3N1YnN5c192ZW5kb3IgIT0gU0FOR09NQV9TVUJTWVNfVkVORE9SKQorICAgICAgICAgICAgICAgIAljb250aW51ZTsKKyAgICAgICAgCQorCQlody0+cGNpX2RldiA9IHBjaV9kZXY7CisJCQorCQlpZihmaW5kX2ZpcnN0X1M1MTRfY2FyZCkKKwkJCXJldHVybigxKTsKKwkJCisgICAgICAgICAgICAgICAgbnVtYmVyX1M1MTRfY2FyZHMgKys7CisgICAgICAgICAgICAgICAgCisJCXByaW50ayhLRVJOX0lORk8KKwkJCSIlczogUzUxNCBjYXJkIGZvdW5kLCBzbG90ICMlZCAoZGV2Zm4gMHglWClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RuYW1lLCAoKHBjaV9kZXYtPmRldmZuID4+IDMpICYgUENJX0RFVl9TTE9UX01BU0spLAorCQkJcGNpX2Rldi0+ZGV2Zm4pOworCQkKKwkJaWYgKGh3LT5hdXRvX3BjaV9jZmcpeworCQkJaHctPlM1MTRfc2xvdF9ubyA9ICgocGNpX2Rldi0+ZGV2Zm4gPj4gMykgJiBQQ0lfREVWX1NMT1RfTUFTSyk7CisJCQlzbG90X25vID0gaHctPlM1MTRfc2xvdF9ubzsKKwkJCQorCQl9ZWxzZSBpZiAoKChwY2lfZGV2LT5kZXZmbiA+PiAzKSAmIFBDSV9ERVZfU0xPVF9NQVNLKSA9PSBzbG90X25vKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIFM1MTRfZm91bmRfaW5fc2xvdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworCS8qIGlmIG5vIFM1MTQgYWRhcHRlciBoYXMgYmVlbiBmb3VuZCwgdGhlbiBleGl0ICovCisgICAgICAgIGlmICghbnVtYmVyX1M1MTRfY2FyZHMpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3IsIG5vIFM1MTQgYWRhcHRlcnMgZm91bmRcbiIsIG1vZG5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8qIGlmIG1vcmUgdGhhbiBvbmUgUzUxNCBjYXJkIGhhcyBiZWVuIGZvdW5kLCB0aGVuIHRoZSB1c2VyIG11c3QgaGF2ZSAqLyAgICAgICAgLyogZGVmaW5lZCBhIHNsb3QgbnVtYmVyIHNvIHRoYXQgdGhlIGNvcnJlY3QgYWRhcHRlciBpcyB1c2VkICovCisgICAgICAgIGVsc2UgaWYgKChudW1iZXJfUzUxNF9jYXJkcyA+IDEpICYmIGh3LT5hdXRvX3BjaV9jZmcpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3IsIFBDSSBTbG90IGF1dG9kZXRlY3QgRmFpbGVkISBcbiIKKwkJCQkgIiVzOiAgICAgICAgTW9yZSB0aGFuIG9uZSBTNTE0IGFkYXB0ZXIgZm91bmQuXG4iCisJCQkJICIlczogICAgICAgIERpc2FibGUgdGhlIEF1dG9kZXRlY3QgZmVhdHVyZSBhbmQgc3VwcGx5XG4iCisJCQkJICIlczogICAgICAgIHRoZSBQQ0lTTE9UIG51bWJlcnMgZm9yIGVhY2ggY2FyZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RuYW1lLG1vZG5hbWUsbW9kbmFtZSxtb2RuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBpZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIGEgc2xvdCBudW1iZXIgYW5kIHRoZSBTNTE0IGFkYXB0ZXIgaGFzICovCisgICAgICAgIC8qIG5vdCBiZWVuIGZvdW5kIGluIHRoYXQgc2xvdCwgdGhlbiBleGl0ICovCisgICAgICAgIGVsc2UgaWYgKCFody0+YXV0b19wY2lfY2ZnICYmICFTNTE0X2ZvdW5kX2luX3Nsb3QpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisJCQkiJXM6IEVycm9yLCBTNTE0IGNhcmQgbm90IGZvdW5kIGluIHNwZWNpZmllZCBzbG90ICMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUsIHNsb3Rfbm8pOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKwlyZXR1cm4gKG51bWJlcl9TNTE0X2NhcmRzKTsKK30KKworCisKKy8qKioqKioqIE1pc2NlbGxhbmVvdXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENhbGlicmF0ZSBTRExBIG1lbW9yeSBhY2Nlc3MgZGVsYXkuCisgKiBDb3VudCBudW1iZXIgb2YgaWRsZSBsb29wcyBtYWRlIHdpdGhpbiAxIHNlY29uZCBhbmQgdGhlbiBjYWxjdWxhdGUgdGhlCisgKiBudW1iZXIgb2YgbG9vcHMgdGhhdCBzaG91bGQgYmUgbWFkZSB0byBhY2hpdmUgZGVzaXJlZCBkZWxheS4KKyAqLworc3RhdGljIGludCBjYWxpYnJhdGVfZGVsYXkgKGludCBta3MpCit7CisJdW5zaWduZWQgaW50IGRlbGF5OworCXVuc2lnbmVkIGxvbmcgc3RvcDsKKworCWZvciAoZGVsYXkgPSAwLCBzdG9wID0gU1lTVEVNX1RJQ0sgKyBIWjsgU1lTVEVNX1RJQ0sgPCBzdG9wOyArK2RlbGF5KTsKKwlyZXR1cm4gKGRlbGF5LygxMDAwMDAwTC9ta3MpICsgMSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2V0IG9wdGlvbidzIGluZGV4IGludG8gdGhlIG9wdGlvbnMgbGlzdC4KKyAqCVJldHVybiBvcHRpb24ncyBpbmRleCAoMSAuLiBOKSBvciB6ZXJvIGlmIG9wdGlvbiBpcyBpbnZhbGlkLgorICovCitzdGF0aWMgaW50IGdldF9vcHRpb25faW5kZXggKHVuc2lnbmVkKiBvcHRsaXN0LCB1bnNpZ25lZCBvcHR2YWwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDw9IG9wdGxpc3RbMF07ICsraSkKKwkJaWYgKCBvcHRsaXN0W2ldID09IG9wdHZhbCkKKwkJCXJldHVybiBpOworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENoZWNrIG1lbW9yeSByZWdpb24gdG8gc2VlIGlmIGl0J3MgYXZhaWxhYmxlLiAKKyAqIFJldHVybjoJMAlvay4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoZWNrX21lbXJlZ2lvbiAodm9pZCogcHRyLCB1bnNpZ25lZCBsZW4pCit7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciogcCA9IHB0cjsKKworICAgICAgICBmb3IgKDsgbGVuICYmIChyZWFkYiAocCkgPT0gMHhGRik7IC0tbGVuLCArK3ApIHsKKyAgICAgICAgICAgICAgICB3cml0ZWIgKDAsIHApOyAgICAgICAgICAvKiBhdHRlbXB0IHRvIHdyaXRlIDAgKi8KKyAgICAgICAgICAgICAgICBpZiAocmVhZGIocCkgIT0gMHhGRikgeyAvKiBzdGlsbCBoYXMgdG8gcmVhZCAweEZGICovCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZWIgKDB4RkYsIHApOy8qIHJlc3RvcmUgb3JpZ2luYWwgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiBub3QgZ29vZCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJcmV0dXJuIGxlbjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IG1lbW9yeSByZWdpb24uCisgKiBSZXR1cm46CXNpemUgb2YgdGhlIHJlZ2lvbiB0aGF0IHBhc3NlZCB0aGUgdGVzdC4KKyAqIE5vdGU6CVJlZ2lvbiBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgMiAhCisgKi8KK3N0YXRpYyB1bnNpZ25lZCB0ZXN0X21lbXJlZ2lvbiAodm9pZCogcHRyLCB1bnNpZ25lZCBsZW4pCit7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqIHdfcHRyOworCXVuc2lnbmVkIGxlbl93ID0gbGVuID4+IDE7CS8qIHJlZ2lvbiBsZW4gaW4gd29yZHMgKi8KKwl1bnNpZ25lZCBpOworCisgICAgICAgIGZvciAoaSA9IDAsIHdfcHRyID0gcHRyOyBpIDwgbGVuX3c7ICsraSwgKyt3X3B0cikKKyAgICAgICAgICAgICAgICB3cml0ZXcgKDB4QUE1NSwgd19wdHIpOworICAgICAgICAKKwlmb3IgKGkgPSAwLCB3X3B0ciA9IHB0cjsgaSA8IGxlbl93OyArK2ksICsrd19wdHIpCisgICAgICAgICAgICAgICAgaWYgKHJlYWR3ICh3X3B0cikgIT0gMHhBQTU1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW5fdyA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMCwgd19wdHIgPSBwdHI7IGkgPCBsZW5fdzsgKytpLCArK3dfcHRyKQorICAgICAgICAgICAgICAgIHdyaXRldyAoMHg1NUFBLCB3X3B0cik7CisgICAgICAgIAorICAgICAgICBmb3IgKGkgPSAwLCB3X3B0ciA9IHB0cjsgaSA8IGxlbl93OyArK2ksICsrd19wdHIpCisgICAgICAgICAgICAgICAgaWYgKHJlYWR3KHdfcHRyKSAhPSAweDU1QUEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbl93ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoaSA9IDAsIHdfcHRyID0gcHRyOyBpIDwgbGVuX3c7ICsraSwgKyt3X3B0cikKKwkJd3JpdGV3ICgwLCB3X3B0cik7CisKKyAgICAgICAgcmV0dXJuIGxlbl93IDw8IDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2FsY3VsYXRlIDE2LWJpdCBDUkMgdXNpbmcgQ0NJVFQgcG9seW5vbWlhbC4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGNoZWNrc3VtICh1bnNpZ25lZCBjaGFyKiBidWYsIHVuc2lnbmVkIGxlbikKK3sKKwl1bnNpZ25lZCBzaG9ydCBjcmMgPSAwOworCXVuc2lnbmVkIG1hc2ssIGZsYWc7CisKKwlmb3IgKDsgbGVuOyAtLWxlbiwgKytidWYpIHsKKwkJZm9yIChtYXNrID0gMHg4MDsgbWFzazsgbWFzayA+Pj0gMSkgeworCQkJZmxhZyA9IChjcmMgJiAweDgwMDApOworCQkJY3JjIDw8PSAxOworCQkJY3JjIHw9ICgoKmJ1ZiAmIG1hc2spID8gMSA6IDApOworCQkJaWYgKGZsYWcpIGNyYyBePSAweDEwMjE7CisJCX0KKwl9CisJcmV0dXJuIGNyYzsKK30KKworc3RhdGljIGludCBpbml0X3BjaV9zbG90KHNkbGFod190ICpodykKK3sKKworCXUzMiBpbnRfc3RhdHVzOworCWludCB2b2xhdGlsZSBmb3VuZD0wOworCWludCBpPTA7CisKKwkvKiBDaGVjayBpZiB0aGlzIGlzIGEgdmVyeSBmaXJzdCBsb2FkIGZvciBhIHNwZWNpZmljCisgICAgICAgICAqIHBjaSBjYXJkLiBJZiBpdCBpcywgY2xlYXIgdGhlIGludGVycnB1dCBiaXRzLCBhbmQKKyAgICAgICAgICogc2V0IHRoZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGlzIGNhcmQgd2FzIGluaXRpYWxpemVkLgorCSAqLworCQorCWZvciAoaT0wOyAoaTxNQVhfUzUxNF9DQVJEUykgJiYgIWZvdW5kOyBpKyspeworCQlpZiAocGNpX3Nsb3RfYXJbaV0gPT0gaHctPlM1MTRfc2xvdF9ubyl7CisJCQlmb3VuZD0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHBjaV9zbG90X2FyW2ldID09IDB4RkYpeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKXsKKwkJcmVhZF9TNTE0X2ludF9zdGF0KGh3LCZpbnRfc3RhdHVzKTsKKwkJUzUxNF9pbnRhY2soaHcsaW50X3N0YXR1cyk7CisJCWlmIChpID09IE1BWF9TNTE0X0NBUkRTKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCBFcnJvciAhISFcbiIsbW9kbmFtZSk7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogTnVtYmVyIG9mIFNhbmdvbWEgUENJIGNhcmRzIGV4Y2VlZGVkIG1heGltdW0gbGltaXQuXG4iLAorCQkJCQltb2RuYW1lKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlBsZWFzZSBjb250YWN0IFNhbmdvbWEgVGVjaG5vbG9naWVzXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCXBjaV9zbG90X2FyW2ldID0gaHctPlM1MTRfc2xvdF9ubzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNpX3Byb2JlKHNkbGFod190ICpodykKK3sKKworICAgICAgICB1bnNpZ25lZCBjaGFyIHNsb3Rfbm87CisgICAgICAgIGludCBudW1iZXJfUzUxNF9jYXJkcyA9IDA7CisgICAgICAgIHUxNiBQQ0lfc3Vic3lzX3ZlbmRvcjsKKwl1MTYgUENJX2NhcmRfdHlwZTsKKworICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisJc3RydWN0IHBjaV9idXMgKmJ1cyA9IE5VTEw7CisgCisgICAgICAgc2xvdF9ubyA9IDA7CisgIAorCXdoaWxlICgocGNpX2RldiA9IHBjaV9maW5kX2RldmljZShWM19WRU5ET1JfSUQsIFYzX0RFVklDRV9JRCwgcGNpX2RldikpCisgICAgICAgIAkhPSBOVUxMKSB7CisJCQorICAgICAgICAgICAgICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIFBDSV9TVUJTWVNfVkVORE9SX1dPUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAmUENJX3N1YnN5c192ZW5kb3IpOworCQkKKyAgICAgICAgICAgICAgICBpZihQQ0lfc3Vic3lzX3ZlbmRvciAhPSBTQU5HT01BX1NVQlNZU19WRU5ET1IpCisgICAgICAgICAgICAgICAgCWNvbnRpbnVlOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIFBDSV9DQVJEX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAmUENJX2NhcmRfdHlwZSk7CisJCisJCWJ1cyA9IHBjaV9kZXYtPmJ1czsKKwkJCisJCS8qIEEgZHVhbCBjcHUgY2FyZCBjYW4gc3VwcG9ydCB1cCB0byA0IHBoeXNpY2FsIGNvbm5lY3Rpb25zLAorCQkgKiB3aGVyZSBhIHNpbmdsZSBjcHUgY2FyZCBjYW4gc3VwcG9ydCB1cCB0byAyIHBoeXNpY2FsCisJCSAqIGNvbm5lY3Rpb25zLiAgVGhlIEZUMSBjYXJkIGNhbiBvbmx5IHN1cHBvcnQgYSBzaW5nbGUgCisJCSAqIGNvbm5lY3Rpb24sIGhvd2V2ZXIgd2UgY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBTaW5nbGUKKwkJICogQ1BVIGNhcmQgYW5kIGFuIEZUMSBjYXJkLiAqLworCQlpZiAoUENJX2NhcmRfdHlwZSA9PSBTNTE0X0RVQUxfQ1BVKXsKKyAgICAgICAgICAgICAgICAJbnVtYmVyX1M1MTRfY2FyZHMgKz0gNDsKKwkJCSBwcmludGsoS0VSTl9JTkZPCisJCQkJIndhbnBpcGU6IFM1MTQtUENJIGNhcmQgZm91bmQsIGNwdShzKSAyLCBidXMgIyVkLCBzbG90ICMlZCwgaXJxICMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIAlidXMtPm51bWJlciwoKHBjaV9kZXYtPmRldmZuID4+IDMpICYgUENJX0RFVl9TTE9UX01BU0spLAorCQkJCXBjaV9kZXYtPmlycSk7CisJCX1lbHNleworCQkJbnVtYmVyX1M1MTRfY2FyZHMgKz0gMjsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkid2FucGlwZTogUzUxNC1QQ0kgY2FyZCBmb3VuZCwgY3B1KHMpIDEsIGJ1cyAjJWQsIHNsb3QgIyVkLCBpcnEgIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgCWJ1cy0+bnVtYmVyLCgocGNpX2Rldi0+ZGV2Zm4gPj4gMykgJiBQQ0lfREVWX1NMT1RfTUFTSyksCisJCQkJcGNpX2Rldi0+aXJxKTsKKwkJfQorICAgICAgICB9CisKKwlyZXR1cm4gbnVtYmVyX1M1MTRfY2FyZHM7CisKK30KKworCisKK0VYUE9SVF9TWU1CT0wod2FucGlwZV9od19wcm9iZSk7CisKK3Vuc2lnbmVkIHdhbnBpcGVfaHdfcHJvYmUodm9pZCkKK3sKKwlzZGxhaHdfdCBodzsKKwl1bnNpZ25lZCogb3B0ID0gczUwOF9wb3J0X29wdGlvbnM7IAorCXVuc2lnbmVkIGNhcmRubz0wOworCWludCBpOworCQorCW1lbXNldCgmaHcsIDAsIHNpemVvZihodykpOworCQorCWZvciAoaSA9IDE7IGkgPD0gb3B0WzBdOyBpKyspIHsKKwkJaWYgKGRldGVjdF9zNTA4KG9wdFtpXSkpeworCQkJLyogUzUwOCBjYXJkIGNhbiBzdXBwb3J0IHVwIHRvIHR3byBwaHlzaWNhbCBsaW5rcyAqLworCQkJY2FyZG5vKz0yOworCQkJcHJpbnRrKEtFUk5fSU5GTyAid2FucGlwZTogUzUwOC1JU0EgY2FyZCBmb3VuZCwgcG9ydCAweCV4XG4iLG9wdFtpXSk7CisJCX0KKwl9CisKKyAgICAgICNpZmRlZiBDT05GSUdfUENJCisJaHcuUzUxNF9zbG90X25vID0gMDsKKwljYXJkbm8gKz0gcGNpX3Byb2JlKCZodyk7CisgICAgICAjZWxzZQorCXByaW50ayhLRVJOX0lORk8gIndhbnBpcGU6IFdhcm5pbmcsIEtlcm5lbCBub3QgY29tcGlsZWQgZm9yIFBDSSBzdXBwb3J0IVxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAid2FucGlwZTogUENJIEhhcmR3YXJlIFByb2JlIEZhaWxlZCFcbiIpOworICAgICAgI2VuZGlmCisKKwlyZXR1cm4gY2FyZG5vOworfQorCisvKioqKioqIEVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhbWFpbi5jIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFtYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlMTUxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhbWFpbi5jCkBAIC0wLDAgKzEsMTM0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc2RsYW1haW4uYwlXQU5QSVBFKHRtKSBNdWx0aXByb3RvY29sIFdBTiBMaW5rIERyaXZlci4gIE1haW4gbW9kdWxlLgorKgorKiBBdXRob3I6CU5lbmFkIENvcmJpYwk8bmNvcmJpY0BzYW5nb21hLmNvbT4KKyoJCUdpZGVvbiBIYWNrCQorKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk1LTIwMDAgU2FuZ29tYSBUZWNobm9sb2dpZXMgSW5jLgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBEZWMgMjIsIDIwMDAgIE5lbmFkIENvcmJpYwlVcGRhdGVkIGZvciAyLjQuWCBrZXJuZWxzLgorKiAJCQkJUmVtb3ZlZCB0aGUgcG9sbGluZyByb3V0aW5lLgorKiBOb3YgMTMsIDIwMDAgIE5lbmFkIENvcmJpYwlBZGRlZCBodyBwcm9iaW5nIG9uIG1vZHVsZSBsb2FkIGFuZCBkeW5hbWljCisqIAkJCQlkZXZpY2UgYWxsb2NhdGlvbi4gCisqIE5vdiA3LCAgMjAwMCAgTmVuYWQgQ29yYmljCUZpeGVkIHRoZSBNdWx0aS1Qb3J0IFBQUCBmb3Iga2VybmVscworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjIuMTYgYW5kIGFib3ZlLgorKiBBdWcgMiwgIDIwMDAgIE5lbmFkIENvcmJpYwlCbG9jayB0aGUgTXVsdGktUG9ydCBQUFAgZnJvbSBydW5uaW5nIG9uCisqICAJCQkgICAgICAgIGtlcm5lbHMgMi4yLjE2IG9yIGdyZWF0ZXIuICBUaGUgU3luY1BQUCAKKyogIAkJCSAgICAgICAgaGFzIGNoYW5nZWQuCisqIEp1bCAyNSwgMjAwMCAgTmVuYWQgQ29yYmljCVVwZGF0ZWQgdGhlIFBpZ2dpYmFjayBzdXBwb3J0IGZvciBNdWx0UFBQUC4KKyogSnVsIDEzLCAyMDAwCU5lbmFkIENvcmJpYwlBZGRlZCBNdWx0aS1QUFAgc3VwcG9ydC4KKyogRmViIDAyLCAyMDAwICBOZW5hZCBDb3JiaWMgICAgRml4ZWQgdXAgcGlnZ3liYWNrIHByb2JpbmcgYW5kIHNlbGVjdGlvbi4KKyogU2VwIDIzLCAxOTk5ICBOZW5hZCBDb3JiaWMgICAgQWRkZWQgc3VwcG9ydCBmb3IgU01QCisqIFNlcCAxMywgMTk5OSAgTmVuYWQgQ29yYmljCUVhY2ggcG9ydCBpcyB0cmVhdGVkIGFzIGEgc2VwYXJhdGUgZGV2aWNlLgorKiBKdW4gMDIsIDE5OTkgIEdpZGVvbiBIYWNrICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgUzUxNCBhZGFwdGVyLgorKgkJCQlVcGRhdGVzIGZvciBMaW51eCAyLjIuWCBrZXJuZWxzLgorKiBTZXAgMTcsIDE5OTgJSmFzcHJlZXQgU2luZ2gJVXBkYXRlZCBmb3IgMi4xLjEyMSsga2VybmVsCisqIE5vdiAyOCwgMTk5NwlKYXNwcmVldCBTaW5naAlDaGFuZ2VkIERSVl9SRUxFQVNFIHRvIDEKKyogTm92IDEwLCAxOTk3CUphc3ByZWV0IFNpbmdoCUNoYW5nZWQgc3RpKCkgdG8gcmVzdG9yZV9mbGFncygpOworKiBOb3YgMDYsIDE5OTcgCUphc3ByZWV0IFNpbmdoCUNoYW5nZWQgRFJWX1ZFUlNJT04gdG8gNCBhbmQgRFJWX1JFTEVBU0UgdG8gMAorKiBPY3QgMjAsIDE5OTcgCUphc3ByZWV0IFNpbmdoCU1vZGlmaWVkIHNkbGFfaXNyIHJvdXRpbmUgc28gdGhhdCBjYXJkLT5pbl9pc3IKKyoJCQkJYXNzaWdubWVudHMgYXJlIHRha2VuIG91dCBhbmQgcGxhY2VkIGluIHRoZQorKgkJCQlzZGxhX3BwcC5jLCBzZGxhX2ZyLmMgYW5kIHNkbGFfeDI1LmMgaXNyCisqCQkJCXJvdXRpbmVzLiBUb29rIG91dCAnd2FuZGV2LT50eF9pbnRfZW5hYmxlZCcgYW5kCisqCQkJCXJlcGxhY2VkIGl0IHdpdGggJ3dhbmRldi0+ZW5hYmxlX3R4X2ludCcuIAorKiBNYXkgMjksIDE5OTcJSmFzcHJlZXQgU2luZ2gJRmxvdyBDb250cm9sIFByb2JsZW0KKyoJCQkJYWRkZWQgIndhbmRldi0+dHhfaW50X2VuYWJsZWQ9MSIgbGluZSBpbiB0aGUKKyoJCQkJaW5pdCBtb2R1bGUuIFRoaXMgbGluZSBpbml0aWFsaXplcyB0aGUgZmxhZyBmb3IgCisqCQkJCXByZXZlbnRpbmcgSW50ZXJydXB0IGRpc2FibGVkIHdpdGggZGV2aWNlIHNldCB0bworKgkJCQlidXN5CisqIEphbiAxNSwgMTk5NwlHZW5lIEtvemluCVZlcnNpb24gMy4xLjAKKyoJCQkJIG8gYWRkZWQgVURQIG1hbmFnZW1lbnQgc3R1ZmYKKyogSmFuIDAyLCAxOTk3CUdlbmUgS296aW4JSW5pdGlhbCB2ZXJzaW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JLyogT1MgY29uZmlndXJhdGlvbiBvcHRpb25zICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIG9mZnNldG9mKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogaW5saW5lIG1lbXNldCgpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JLyoga21hbGxvYygpLCBrZnJlZSgpICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpLCBhbmQgb3RoZXIgdXNlZnVsIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIHN1cHBvcnQgZm9yIGxvYWRhYmxlIG1vZHVsZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4JLyogcmVxdWVzdF9yZWdpb24oKSwgcmVsZWFzZV9yZWdpb24oKSAqLworI2luY2x1ZGUgPGxpbnV4L3dhbnJvdXRlci5oPgkvKiBXQU4gcm91dGVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvd2FucGlwZS5oPgkvKiBXQU5QSVBFIGNvbW1vbiB1c2VyIEFQSSBkZWZpbml0aW9ucyAqLworCisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIHBoeXNfdG9fdmlydCgpICovCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2RsYXBjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3dhbnBpcGVfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBrZXJuZWwgPC0+IHVzZXIgY29weSAqLworI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisgCisjZGVmaW5lIEtNRU1fU0FGRVRZWk9ORSA4CisKKworI2lmbmRlZiBDT05GSUdfV0FOUElQRV9GUgorICAjZGVmaW5lIHdwZl9pbml0KGEsYikgKC1FUFJPVE9OT1NVUFBPUlQpIAorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1dBTlBJUEVfQ0hETEMKKyAjZGVmaW5lIHdwY19pbml0KGEsYikgKC1FUFJPVE9OT1NVUFBPUlQpIAorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1dBTlBJUEVfWDI1CisgI2RlZmluZSB3cHhfaW5pdChhLGIpICgtRVBST1RPTk9TVVBQT1JUKSAKKyNlbmRpZgorIAorI2lmbmRlZiBDT05GSUdfV0FOUElQRV9QUFAKKyAjZGVmaW5lIHdwcF9pbml0KGEsYikgKC1FUFJPVE9OT1NVUFBPUlQpIAorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1dBTlBJUEVfTVVMVFBQUCAKKyAjZGVmaW5lIHdzcHBwX2luaXQoYSxiKSAoLUVQUk9UT05PU1VQUE9SVCkgCisjZW5kaWYKKyAKKyAKKy8qKioqKioqKioqKkZPUiBERUJVR0dJTkcgUFVSUE9TRVMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkICogZGJnX2ttYWxsb2ModW5zaWduZWQgaW50IHNpemUsIGludCBwcmlvLCBpbnQgbGluZSkgeworCWludCBpID0gMDsKKwl2b2lkICogdiA9IGttYWxsb2Moc2l6ZStzaXplb2YodW5zaWduZWQgaW50KSsyKktNRU1fU0FGRVRZWk9ORSo4LHByaW8pOworCWNoYXIgKiBjMSA9IHY7CQorCWMxICs9IHNpemVvZih1bnNpZ25lZCBpbnQpOworCSooKHVuc2lnbmVkIGludCAqKXYpID0gc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBLTUVNX1NBRkVUWVpPTkU7IGkrKykgeworCQljMVswXSA9ICdEJzsgYzFbMV0gPSAnRSc7IGMxWzJdID0gJ0EnOyBjMVszXSA9ICdEJzsKKwkJYzFbNF0gPSAnQic7IGMxWzVdID0gJ0UnOyBjMVs2XSA9ICdFJzsgYzFbN10gPSAnRic7CisJCWMxICs9IDg7CisJfQorCWMxICs9IHNpemU7CisJZm9yIChpID0gMDsgaSA8IEtNRU1fU0FGRVRZWk9ORTsgaSsrKSB7CisJCWMxWzBdID0gJ00nOyBjMVsxXSA9ICdVJzsgYzFbMl0gPSAnTic7IGMxWzNdID0gJ0cnOworCQljMVs0XSA9ICdXJzsgYzFbNV0gPSAnQSc7IGMxWzZdID0gJ0wnOyBjMVs3XSA9ICdMJzsKKwkJYzEgKz0gODsKKwl9CisJdiA9ICgoY2hhciAqKXYpICsgc2l6ZW9mKHVuc2lnbmVkIGludCkgKyBLTUVNX1NBRkVUWVpPTkUqODsKKwlwcmludGsoS0VSTl9JTkZPICJsaW5lICVkICBrbWFsbG9jKCVkLCVkKSA9ICVwXG4iLGxpbmUsc2l6ZSxwcmlvLHYpOworCXJldHVybiB2OworfQorc3RhdGljIHZvaWQgZGJnX2tmcmVlKHZvaWQgKiB2LCBpbnQgbGluZSkgeworCXVuc2lnbmVkIGludCAqIHNwID0gKHVuc2lnbmVkIGludCAqKSgoKGNoYXIgKil2KSAtIChzaXplb2YodW5zaWduZWQgaW50KSArIEtNRU1fU0FGRVRZWk9ORSo4KSk7CisJdW5zaWduZWQgaW50IHNpemUgPSAqc3A7CisJY2hhciAqIGMxID0gKChjaGFyICopdikgLSBLTUVNX1NBRkVUWVpPTkUqODsKKwlpbnQgaSA9IDA7CisJZm9yIChpID0gMDsgaSA8IEtNRU1fU0FGRVRZWk9ORTsgaSsrKSB7CisJCWlmICggICBjMVswXSAhPSAnRCcgfHwgYzFbMV0gIT0gJ0UnIHx8IGMxWzJdICE9ICdBJyB8fCBjMVszXSAhPSAnRCcKKwkJICAgIHx8IGMxWzRdICE9ICdCJyB8fCBjMVs1XSAhPSAnRScgfHwgYzFbNl0gIT0gJ0UnIHx8IGMxWzddICE9ICdGJykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAia21hbGxvY2VkIGJsb2NrIGF0ICVwIGhhcyBiZWVuIGNvcnJ1cHRlZCAodW5kZXJydW4pIVxuIix2KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiAlNHg6ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnhcbiIsIGkqOCwKKwkJCSAgICAgICAgICAgICAgICBjMVswXSxjMVsxXSxjMVsyXSxjMVszXSxjMVs0XSxjMVs1XSxjMVs2XSxjMVs3XSApOworCQl9CisJCWMxICs9IDg7CisJfQorCWMxICs9IHNpemU7CisJZm9yIChpID0gMDsgaSA8IEtNRU1fU0FGRVRZWk9ORTsgaSsrKSB7CisJCWlmICggICBjMVswXSAhPSAnTScgfHwgYzFbMV0gIT0gJ1UnIHx8IGMxWzJdICE9ICdOJyB8fCBjMVszXSAhPSAnRycKKwkJICAgIHx8IGMxWzRdICE9ICdXJyB8fCBjMVs1XSAhPSAnQScgfHwgYzFbNl0gIT0gJ0wnIHx8IGMxWzddICE9ICdMJworCQkgICApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImttYWxsb2NlZCBibG9jayBhdCAlcCBoYXMgYmVlbiBjb3JydXB0ZWQgKG92ZXJydW4pOlxuIix2KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiAlNHg6ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnhcbiIsIGkqOCwKKwkJCSAgICAgICAgICAgICAgICBjMVswXSxjMVsxXSxjMVsyXSxjMVszXSxjMVs0XSxjMVs1XSxjMVs2XSxjMVs3XSApOworCQl9CisJCWMxICs9IDg7CisJfQorCXByaW50ayhLRVJOX0lORk8gImxpbmUgJWQgIGtmcmVlKCVwKVxuIixsaW5lLHYpOworCXYgPSAoKGNoYXIgKil2KSAtIChzaXplb2YodW5zaWduZWQgaW50KSArIEtNRU1fU0FGRVRZWk9ORSo4KTsKKwlrZnJlZSh2KTsKK30KKworI2RlZmluZSBrbWFsbG9jKHgseSkgZGJnX2ttYWxsb2MoeCx5LF9fTElORV9fKQorI2RlZmluZSBrZnJlZSh4KSBkYmdfa2ZyZWUoeCxfX0xJTkVfXykKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8qKioqKiogRGVmaW5lcyAmIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYJX0RFQlVHXworI2RlZmluZQlTVEFUSUMKKyNlbHNlCisjZGVmaW5lCVNUQVRJQwkJc3RhdGljCisjZW5kaWYKKworI2RlZmluZQlEUlZfVkVSU0lPTgk1CQkvKiB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZQlEUlZfUkVMRUFTRQkwCQkvKiByZWxlYXNlIChtaW5vciB2ZXJzaW9uKSBudW1iZXIgKi8KKyNkZWZpbmUJTUFYX0NBUkRTCTE2CQkvKiBtYXggbnVtYmVyIG9mIGFkYXB0ZXJzICovCisKKyNpZm5kZWYJQ09ORklHX1dBTlBJUEVfQ0FSRFMJCS8qIGNvbmZpZ3VyYWJsZSBvcHRpb24gKi8KKyNkZWZpbmUJQ09ORklHX1dBTlBJUEVfQ0FSRFMgMQorI2VuZGlmCisKKyNkZWZpbmUJQ01EX09LCQkwCQkvKiBub3JtYWwgZmlybXdhcmUgcmV0dXJuIGNvZGUgKi8KKyNkZWZpbmUJQ01EX1RJTUVPVVQJMHhGRgkJLyogZmlybXdhcmUgY29tbWFuZCB0aW1lZCBvdXQgKi8KKyNkZWZpbmUJTUFYX0NNRF9SRVRSWQkxMAkJLyogbWF4IG51bWJlciBvZiBmaXJtd2FyZSByZXRyaWVzICovCisvKioqKioqIEZ1bmN0aW9uIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKKyAKKy8qIFdBTiBsaW5rIGRyaXZlciBlbnRyeSBwb2ludHMgKi8KK3N0YXRpYyBpbnQgc2V0dXAoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwgd2FuZGV2X2NvbmZfdCogY29uZik7CitzdGF0aWMgaW50IHNodXRkb3duKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYpOworc3RhdGljIGludCBpb2N0bChzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworLyogSU9DVEwgaGFuZGxlcnMgKi8KK3N0YXRpYyBpbnQgaW9jdGxfZHVtcAkoc2RsYV90KiBjYXJkLCBzZGxhX2R1bXBfdCogdV9kdW1wKTsKK3N0YXRpYyBpbnQgaW9jdGxfZXhlYwkoc2RsYV90KiBjYXJkLCBzZGxhX2V4ZWNfdCogdV9leGVjLCBpbnQpOworCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworU1RBVElDIGlycXJldHVybl90IHNkbGFfaXNyCShpbnQgaXJxLCB2b2lkKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfaHcgIChzZGxhX3QgKmNhcmQpOworCitzdGF0aWMgaW50IGNoZWNrX3M1MDhfY29uZmxpY3RzIChzZGxhX3QqIGNhcmQsd2FuZGV2X2NvbmZfdCogY29uZiwgaW50Kik7CitzdGF0aWMgaW50IGNoZWNrX3M1MTRfY29uZmxpY3RzIChzZGxhX3QqIGNhcmQsd2FuZGV2X2NvbmZfdCogY29uZiwgaW50Kik7CisKKworLyoqKioqKiBHbG9iYWwgRGF0YSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOb3RlOiBBbGwgZGF0YSBtdXN0IGJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQhISEKKyAqLworCisvKiBwcml2YXRlIGRhdGEgKi8KK3N0YXRpYyBjaGFyIGRydm5hbWVbXQk9ICJ3YW5waXBlIjsKK3N0YXRpYyBjaGFyIGZ1bGxuYW1lW10JPSAiV0FOUElQRSh0bSkgTXVsdGlwcm90b2NvbCBEcml2ZXIiOworc3RhdGljIGNoYXIgY29weXJpZ2h0W10JPSAiKGMpIDE5OTUtMjAwMCBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuIjsKK3N0YXRpYyBpbnQgbmNhcmRzOyAKK3N0YXRpYyBzZGxhX3QqIGNhcmRfYXJyYXk7CQkvKiBhZGFwdGVyIGRhdGEgc3BhY2UgKi8KKworLyogV2FucGlwZSdzIG93biB3b3JrcXVldWUsIHVzZWQgZm9yIGFsbCBBUEkncy4KKyAqIEFsbCBwcm90b2NvbCBzcGVjaWZpYyB0YXNrcyB3aWxsIGJlIGluc2VydGVkCisgKiBpbnRvIHRoZSAid2FucGlwZV93cSIgd29ya3F1ZXVlLiAKKworICogVGhlIGtlcm5lbCB3b3JrcXVldWUgbWVjaGFuaXNtIHdpbGwgZXhlY3V0ZQorICogYWxsIHBlbmRpbmcgdGFza3MgaW4gdGhlICJ3YW5waXBlX3dxIiB3b3JrcXVldWUuCisgKi8KKworc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndhbnBpcGVfd3E7CitERUNMQVJFX1dPUksod2FucGlwZV93b3JrLCBOVUxMLCBOVUxMKTsKKworc3RhdGljIGludCB3YW5waXBlX2JoX2NyaXRpY2FsOworCisvKioqKioqKiBLZXJuZWwgTG9hZGFibGUgTW9kdWxlIEVudHJ5IFBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBNb2R1bGUgJ2luc2VydCcgZW50cnkgcG9pbnQuCisgKiBvIHByaW50IGFubm91bmNlbWVudAorICogbyBhbGxvY2F0ZSBhZGFwdGVyIGRhdGEgc3BhY2UKKyAqIG8gaW5pdGlhbGl6ZSBzdGF0aWMgZGF0YQorICogbyByZWdpc3RlciBhbGwgY2FyZHMgd2l0aCBXQU4gcm91dGVyCisgKiBvIGNhbGlicmF0ZSBTRExBIHNoYXJlZCBtZW1vcnkgYWNjZXNzIGRlbGF5LgorICoKKyAqIFJldHVybjoJMAlPaworICoJCTwgMAllcnJvci4KKyAqIENvbnRleHQ6CXByb2Nlc3MKKyAqLworIAorc3RhdGljIGludCBfX2luaXQgd2FucGlwZV9pbml0KHZvaWQpCit7CisJaW50IGNudCwgZXJyID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzIHYldS4ldSAlc1xuIiwKKwkJZnVsbG5hbWUsIERSVl9WRVJTSU9OLCBEUlZfUkVMRUFTRSwgY29weXJpZ2h0KTsKKworCXdhbnBpcGVfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJ3YW5waXBlX3dxIik7CisJaWYgKCF3YW5waXBlX3dxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFByb2JlIGZvciB3YW5waXBlIGNhcmRzIGFuZCByZXR1cm4gdGhlIG51bWJlciBmb3VuZCAqLworCXByaW50ayhLRVJOX0lORk8gIndhbnBpcGU6IFByb2JpbmcgZm9yIFdBTlBJUEUgaGFyZHdhcmUuXG4iKTsKKwluY2FyZHMgPSB3YW5waXBlX2h3X3Byb2JlKCk7CisJaWYgKG5jYXJkcyl7CisJCXByaW50ayhLRVJOX0lORk8gIndhbnBpcGU6IEFsbG9jYXRpbmcgbWF4aW11bSAlaSBkZXZpY2VzOiB3YW5waXBlJWkgLSB3YW5waXBlJWkuXG4iLG5jYXJkcywxLG5jYXJkcyk7CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0lORk8gIndhbnBpcGU6IE5vIFM1MTQvUzUwOCBjYXJkcyBmb3VuZCwgdW5sb2FkaW5nIG1vZHVsZXMhXG4iKTsKKwkJZGVzdHJveV93b3JrcXVldWUod2FucGlwZV93cSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkKKwkvKiBWZXJpZnkgbnVtYmVyIG9mIGNhcmRzIGFuZCBhbGxvY2F0ZSBhZGFwdGVyIGRhdGEgc3BhY2UgKi8KKwljYXJkX2FycmF5ID0ga21hbGxvYyhzaXplb2Yoc2RsYV90KSAqIG5jYXJkcywgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcmRfYXJyYXkgPT0gTlVMTCkgeworCQlkZXN0cm95X3dvcmtxdWV1ZSh3YW5waXBlX3dxKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KGNhcmRfYXJyYXksIDAsIHNpemVvZihzZGxhX3QpICogbmNhcmRzKTsKKworCS8qIFJlZ2lzdGVyIGFkYXB0ZXJzIHdpdGggV0FOIHJvdXRlciAqLworCWZvciAoY250ID0gMDsgY250IDwgbmNhcmRzOyArKyBjbnQpIHsKKwkJc2RsYV90KiBjYXJkID0gJmNhcmRfYXJyYXlbY250XTsKKwkJc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiA9ICZjYXJkLT53YW5kZXY7CisKKwkJY2FyZC0+bmV4dCA9IE5VTEw7CisJCXNwcmludGYoY2FyZC0+ZGV2bmFtZSwgIiVzJWQiLCBkcnZuYW1lLCBjbnQgKyAxKTsKKwkJd2FuZGV2LT5tYWdpYyAgICA9IFJPVVRFUl9NQUdJQzsKKwkJd2FuZGV2LT5uYW1lICAgICA9IGNhcmQtPmRldm5hbWU7CisJCXdhbmRldi0+cHJpdmF0ZSAgPSBjYXJkOworCQl3YW5kZXYtPmVuYWJsZV90eF9pbnQgPSAwOworCQl3YW5kZXYtPnNldHVwICAgID0gJnNldHVwOworCQl3YW5kZXYtPnNodXRkb3duID0gJnNodXRkb3duOworCQl3YW5kZXYtPmlvY3RsICAgID0gJmlvY3RsOworCQllcnIgPSByZWdpc3Rlcl93YW5fZGV2aWNlKHdhbmRldik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6ICVzIHJlZ2lzdHJhdGlvbiBmYWlsZWQgd2l0aCBlcnJvciAlZCFcbiIsCisJCQkJZHJ2bmFtZSwgY2FyZC0+ZGV2bmFtZSwgZXJyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChjbnQpeworCQluY2FyZHMgPSBjbnQ7CS8qIGFkanVzdCBhY3R1YWwgbnVtYmVyIG9mIGNhcmRzICovCisJfWVsc2UgeworCQlrZnJlZShjYXJkX2FycmF5KTsKKwkJZGVzdHJveV93b3JrcXVldWUod2FucGlwZV93cSk7CisJCXByaW50ayhLRVJOX0lORk8gIklOIEluaXQgTW9kdWxlOiBOTyBDYXJkcyByZWdpc3RlcmVkXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE1vZHVsZSAncmVtb3ZlJyBlbnRyeSBwb2ludC4KKyAqIG8gdW5yZWdpc3RlciBhbGwgYWRhcHRlcnMgZnJvbSB0aGUgV0FOIHJvdXRlcgorICogbyByZWxlYXNlIGFsbCByZW1haW5pbmcgc3lzdGVtIHJlc291cmNlcworICovCitzdGF0aWMgdm9pZCBfX2V4aXQgd2FucGlwZV9jbGVhbnVwKHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAoIW5jYXJkcykKKwkJcmV0dXJuOworCQkKKwlmb3IgKGkgPSAwOyBpIDwgbmNhcmRzOyArK2kpIHsKKwkJc2RsYV90KiBjYXJkID0gJmNhcmRfYXJyYXlbaV07CisJCXVucmVnaXN0ZXJfd2FuX2RldmljZShjYXJkLT5kZXZuYW1lKTsKKwl9CisJZGVzdHJveV93b3JrcXVldWUod2FucGlwZV93cSk7CisJa2ZyZWUoY2FyZF9hcnJheSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJcbndhbnBpcGU6IFdBTlBJUEUgTW9kdWxlcyBVbmxvYWRlZC5cbiIpOworfQorCittb2R1bGVfaW5pdCh3YW5waXBlX2luaXQpOworbW9kdWxlX2V4aXQod2FucGlwZV9jbGVhbnVwKTsKKworLyoqKioqKiogV0FOIERldmljZSBEcml2ZXIgRW50cnkgUG9pbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0dXAvY29uZmlndXJlIFdBTiBsaW5rIGRyaXZlci4KKyAqIG8gY2hlY2sgYWRhcHRlciBzdGF0ZQorICogbyBtYWtlIHN1cmUgZmlybXdhcmUgaXMgcHJlc2VudCBpbiBjb25maWd1cmF0aW9uCisgKiBvIG1ha2Ugc3VyZSBJL08gcG9ydCBhbmQgSVJRIGFyZSBzcGVjaWZpZWQKKyAqIG8gbWFrZSBzdXJlIEkvTyByZWdpb24gaXMgYXZhaWxhYmxlCisgKiBvIGFsbG9jYXRlIGludGVycnVwdCB2ZWN0b3IKKyAqIG8gc2V0dXAgU0RMQSBoYXJkd2FyZQorICogbyBjYWxsIGFwcHJvcHJpYXRlIHJvdXRpbmUgdG8gcGVyZm9ybSBwcm90b2NvbC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICogbyBtYXJrIEkvTyByZWdpb24gYXMgdXNlZAorICogbyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBhY3RpdmUgY2FyZCwgdGhlbiBzY2hlZHVsZSBiYWNrZ3JvdW5kIHRhc2sKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHJvdXRlciBoYW5kbGVzIFJPVVRFUl9TRVRVUCBJT0NUTC4gVGhlCisgKiBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBpcyBpbiBrZXJuZWwgbWVtb3J5IChpbmNsdWRpbmcgZXh0ZW5kZWQgZGF0YSwgaWYKKyAqIGFueSkuCisgKi8KKyAKK3N0YXRpYyBpbnQgc2V0dXAoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwgd2FuZGV2X2NvbmZfdCogY29uZikKK3sKKwlzZGxhX3QqIGNhcmQ7CisJaW50IGVyciA9IDA7CisJaW50IGlycT0wOworCisJLyogU2FuaXR5IGNoZWNrcyAqLworCWlmICgod2FuZGV2ID09IE5VTEwpIHx8ICh3YW5kZXYtPnByaXZhdGUgPT0gTlVMTCkgfHwgKGNvbmYgPT0gTlVMTCkpeworCQlwcmludGsoS0VSTl9JTkZPIAorCQkgICAgICAiJXM6IEZhaWxlZCBTZGxhbWFpbiBTZXR1cCB3YW5kZXYgJXUsIGNhcmQgJXUsIGNvbmYgJXUgIVxuIiwKKwkJICAgICAgd2FuZGV2LT5uYW1lLAorCQkgICAgICAodW5zaWduZWQgaW50KXdhbmRldiwodW5zaWduZWQgaW50KXdhbmRldi0+cHJpdmF0ZSwKKwkJICAgICAgKHVuc2lnbmVkIGludCljb25mKTsgCisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdGFydGluZyBXQU4gU2V0dXBcbiIsIHdhbmRldi0+bmFtZSk7CisKKwljYXJkID0gd2FuZGV2LT5wcml2YXRlOworCWlmICh3YW5kZXYtPnN0YXRlICE9IFdBTl9VTkNPTkZJR1VSRUQpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogZmFpbGVkIHNkbGFtYWluIHNldHVwLCBidXN5IVxuIiwKKwkJCXdhbmRldi0+bmFtZSk7CisJCXJldHVybiAtRUJVU1k7CQkvKiBhbHJlYWR5IGNvbmZpZ3VyZWQgKi8KKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJcblByb2Nlc3NpbmcgV0FOIGRldmljZSAlcy4uLlxuIiwgd2FuZGV2LT5uYW1lKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNvdW50ZXJzIGZvciBlYWNoIHdhbmRldiAKKwkgKiBVc2VkIGZvciBjb3VudGluZyBudW1iZXIgb2YgdGltZXMgbmV3X2lmIGFuZCAKKyAgICAgICAgICogZGVsX2lmIGdldCBjYWxsZWQuCisJICovCisJd2FuZGV2LT5kZWxfaWZfY250ID0gMDsKKwl3YW5kZXYtPm5ld19pZl9jbnQgPSAwOworCXdhbmRldi0+Y29uZmlnX2lkICA9IGNvbmYtPmNvbmZpZ19pZDsKKworCWlmICghY29uZi0+ZGF0YV9zaXplIHx8IChjb25mLT5kYXRhID09IE5VTEwpKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSIlczogZmlybXdhcmUgbm90IGZvdW5kIGluIGNvbmZpZ3VyYXRpb24gZGF0YSFcbiIsCisJCQl3YW5kZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayBmb3IgcmVzb3VyY2UgY29uZmxpY3RzIGFuZCBzZXR1cCB0aGUKKwkgKiBjYXJkIGZvciBwaWdnaWJhY2tpbmcgaWYgbmVjZXNzYXJ5ICovCisJaWYoIWNvbmYtPlM1MTRfQ1BVX25vWzBdKSB7CisJCWlmICgoZXJyPWNoZWNrX3M1MDhfY29uZmxpY3RzKGNhcmQsY29uZiwmaXJxKSkgIT0gMCl7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfWVsc2UgeworCQlpZiAoKGVycj1jaGVja19zNTE0X2NvbmZsaWN0cyhjYXJkLGNvbmYsJmlycSkpICE9IDApeworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCS8qIElmIHRoZSBjdXJyZW50IGNhcmQgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkCisgICAgICAgICAqIG9yIGl0J3MgYSBwaWdneWJhY2sgY2FyZCwgZG8gbm90IHRyeSB0byBhbGxvY2F0ZQorICAgICAgICAgKiByZXNvdXJjZXMuCisJICovCisJaWYgKCFjYXJkLT53YW5kZXYucGlnZ3liYWNrICYmICFjYXJkLT5jb25maWd1cmVkKXsKKworCQkvKiBDb25maWd1cmUgaGFyZHdhcmUsIGxvYWQgZmlybXdhcmUsIGV0Yy4gKi8KKwkJbWVtc2V0KCZjYXJkLT5odywgMCwgc2l6ZW9mKHNkbGFod190KSk7CisKKwkJLyogZm9yIGFuIFM1MTQgYWRhcHRlciwgcGFzcyB0aGUgQ1BVIG51bWJlciBhbmQgdGhlIHNsb3QgbnVtYmVyIHJlYWQgKi8KKwkJLyogZnJvbSAncm91dGVyLmNvbmYnIHRvIHRoZSAnc2RsYV9zZXR1cCgpJyBmdW5jdGlvbiB2aWEgdGhlICdwb3J0JyAqLworCQkvKiBwYXJhbWV0ZXIgKi8KKwkJaWYgKGNvbmYtPlM1MTRfQ1BVX25vWzBdKXsKKworCQkJY2FyZC0+aHcuUzUxNF9jcHVfbm9bMF0gPSBjb25mLT5TNTE0X0NQVV9ub1swXTsKKwkJCWNhcmQtPmh3LlM1MTRfc2xvdF9ubyA9IGNvbmYtPlBDSV9zbG90X25vOworCQkJY2FyZC0+aHcuYXV0b19wY2lfY2ZnID0gY29uZi0+YXV0b19wY2lfY2ZnOworCisJCQlpZiAoY2FyZC0+aHcuYXV0b19wY2lfY2ZnID09IFdBTk9QVF9ZRVMpeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZXR0aW5nIENQVSB0byAlYyBhbmQgU2xvdCB0byBBdXRvXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIGNhcmQtPmh3LlM1MTRfY3B1X25vWzBdKTsKKwkJCX1lbHNleworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZXR0aW5nIENQVSB0byAlYyBhbmQgU2xvdCB0byAlaVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBjYXJkLT5ody5TNTE0X2NwdV9ub1swXSwgY2FyZC0+aHcuUzUxNF9zbG90X25vKTsKKwkJCX0KKworCQl9ZWxzZXsKKwkJCS8qIDUwOCBDYXJkIGlvIHBvcnQgYW5kIGlycSBpbml0aWFsaXphdGlvbiAqLworCQkJY2FyZC0+aHcucG9ydCA9IGNvbmYtPmlvcG9ydDsKKwkJCWNhcmQtPmh3LmlycSA9IChjb25mLT5pcnEgPT0gOSkgPyAyIDogY29uZi0+aXJxOworCQl9CisKKworCQkvKiBDb21wdXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGNhcmQgaW4ga2VybmVsIHNwYWNlICovCisJCWlmKGNvbmYtPm1hZGRyKXsKKwkJCWNhcmQtPmh3LmRwbWJhc2UgPSBwaHlzX3RvX3ZpcnQoY29uZi0+bWFkZHIpOworCQl9ZWxzZXsJCisJCQljYXJkLT5ody5kcG1iYXNlID0gKHZvaWQgKiljb25mLT5tYWRkcjsKKwkJfQorCQkJCisJCWNhcmQtPmh3LmRwbXNpemUgPSBTRExBX1dJTkRPV1NJWkU7CisJCQorCQkvKiBzZXQgdGhlIGFkYXB0ZXIgdHlwZSBpZiB1c2luZyBhbiBTNTE0IGFkYXB0ZXIgKi8KKwkJY2FyZC0+aHcudHlwZSA9IChjb25mLT5TNTE0X0NQVV9ub1swXSkgPyBTRExBX1M1MTQgOiBjb25mLT5od19vcHRbMF07IAorCQljYXJkLT5ody5wY2xrID0gY29uZi0+aHdfb3B0WzFdOworCisJCWVyciA9IHNkbGFfc2V0dXAoJmNhcmQtPmh3LCBjb25mLT5kYXRhLCBjb25mLT5kYXRhX3NpemUpOworCQlpZiAoZXJyKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBIYXJkd2FyZSBzZXR1cCBGYWlsZWQgJWlcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCSAgICAgICAgaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpCisJCQlpcnEgPSAoY29uZi0+aXJxID09IDIpID8gOSA6IGNvbmYtPmlycTsgLyogSVJRMiAtPiBJUlE5ICovCisJCWVsc2UKKwkJCWlycSA9IGNhcmQtPmh3LmlycTsKKworCQkvKiByZXF1ZXN0IGFuIGludGVycnVwdCB2ZWN0b3IgLSBub3RlIHRoYXQgaW50ZXJydXB0cyBtYXkgYmUgc2hhcmVkICovCisJCS8qIHdoZW4gdXNpbmcgdGhlIFM1MTQgUENJIGFkYXB0ZXIgKi8KKwkJCisgICAgICAgCQlpZihyZXF1ZXN0X2lycShpcnEsIHNkbGFfaXNyLCAKKwkJICAgICAgKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSA/IFNBX1NISVJRIDogMCwgCisJCSAgICAgICB3YW5kZXYtPm5hbWUsIGNhcmQpKXsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENhbid0IHJlc2VydmUgSVJRICVkIVxuIiwgd2FuZGV2LT5uYW1lLCBpcnEpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCX1lbHNleworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ2FyZCBDb25maWd1cmVkICVsdSBvciBQaWdneWJhY2tpbmcgJWkhXG4iLAorCQkJd2FuZGV2LT5uYW1lLGNhcmQtPmNvbmZpZ3VyZWQsY2FyZC0+d2FuZGV2LnBpZ2d5YmFjayk7CisJfSAKKworCisJaWYgKCFjYXJkLT5jb25maWd1cmVkKXsKKworCQkvKiBJbml0aWFsaXplIHRoZSBTcGluIGxvY2sgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluaXRpYWxpemluZyBmb3IgU01QXG4iLHdhbmRldi0+bmFtZSk7CisKKwkJLyogUGlnZ3liYWNrIHNwaW4gbG9jayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLAorCQkgKiBpbiBjaGVja19zNTE0L3M1MDhfY29uZmxpY3RzKCkgKi8KKwkJaWYgKCFjYXJkLT53YW5kZXYucGlnZ3liYWNrKXsKKwkJCXNwaW5fbG9ja19pbml0KCZjYXJkLT53YW5kZXYubG9jayk7CisJCX0KKwkJCisJCS8qIEludGlhbGl6ZSBXQU4gZGV2aWNlIGRhdGEgc3BhY2UgKi8KKwkJd2FuZGV2LT5pcnEgICAgICAgPSBpcnE7CisJCXdhbmRldi0+ZG1hICAgICAgID0gMDsKKwkJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeyAKKwkJCXdhbmRldi0+aW9wb3J0ID0gY2FyZC0+aHcucG9ydDsKKwkJfWVsc2V7CisJCQl3YW5kZXYtPlM1MTRfY3B1X25vWzBdID0gY2FyZC0+aHcuUzUxNF9jcHVfbm9bMF07CisJCQl3YW5kZXYtPlM1MTRfc2xvdF9ubyA9IGNhcmQtPmh3LlM1MTRfc2xvdF9ubzsKKwkJfQorCQl3YW5kZXYtPm1hZGRyICAgICA9ICh1bnNpZ25lZCBsb25nKWNhcmQtPmh3LmRwbWJhc2U7CisJCXdhbmRldi0+bXNpemUgICAgID0gY2FyZC0+aHcuZHBtc2l6ZTsKKwkJd2FuZGV2LT5od19vcHRbMF0gPSBjYXJkLT5ody50eXBlOworCQl3YW5kZXYtPmh3X29wdFsxXSA9IGNhcmQtPmh3LnBjbGs7CisJCXdhbmRldi0+aHdfb3B0WzJdID0gY2FyZC0+aHcubWVtb3J5OworCQl3YW5kZXYtPmh3X29wdFszXSA9IGNhcmQtPmh3LmZ3aWQ7CisJfQorCisJLyogUHJvdG9jb2wtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KKwlzd2l0Y2ggKGNhcmQtPmh3LmZ3aWQpIHsKKworCWNhc2UgU0ZJRF9YMjVfNTAyOgorCWNhc2UgU0ZJRF9YMjVfNTA4OgorCQlwcmludGsoS0VSTl9JTkZPICIlczogU3RhcnRpbmcgWC4yNSBQcm90b2NvbCBJbml0LlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJZXJyID0gd3B4X2luaXQoY2FyZCwgY29uZik7CisJCWJyZWFrOworCWNhc2UgU0ZJRF9GUjUwMjoKKwljYXNlIFNGSURfRlI1MDg6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdGFydGluZyBGcmFtZSBSZWxheSBQcm90b2NvbCBJbml0LlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJZXJyID0gd3BmX2luaXQoY2FyZCwgY29uZik7CisJCWJyZWFrOworCWNhc2UgU0ZJRF9QUFA1MDI6CisJY2FzZSBTRklEX1BQUDUwODoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXJ0aW5nIFBQUCBQcm90b2NvbCBJbml0LlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJZXJyID0gd3BwX2luaXQoY2FyZCwgY29uZik7CisJCWJyZWFrOworCQkKKwljYXNlIFNGSURfQ0hETEM1MDg6CisJY2FzZSBTRklEX0NIRExDNTE0OgorCQlpZiAoY29uZi0+ZnQxKXsJCQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXJ0aW5nIEZUMSBDU1UvRFNVIENvbmZpZyBEcml2ZXIuXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJZXJyID0gd3BmdDFfaW5pdChjYXJkLCBjb25mKTsKKwkJCWJyZWFrOworCQkJCisJCX1lbHNlIGlmIChjb25mLT5jb25maWdfaWQgPT0gV0FOQ09ORklHX01QUFApeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXJ0aW5nIE11bHRpLVBvcnQgUFBQIFByb3RvY29sIEluaXQuXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWVyciA9IHdzcHBwX2luaXQoY2FyZCxjb25mKTsKKwkJCWJyZWFrOworCisJCX1lbHNleworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXJ0aW5nIENIRExDIFByb3RvY29sIEluaXQuXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWVyciA9IHdwY19pbml0KGNhcmQsIGNvbmYpOworCQkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3IsIEZpcm13YXJlIGlzIG5vdCBzdXBwb3J0ZWQgJVggJVghXG4iLAorCQkJd2FuZGV2LT5uYW1lLGNhcmQtPmh3LmZ3aWQsU0ZJRF9DSERMQzUwOCk7CisJCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJfQorCisJaWYgKGVyciAhPSAwKXsKKwkJaWYgKGVyciA9PSAtRVBST1RPTk9TVVBQT1JUKXsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBFcnJvciwgUHJvdG9jb2wgc2VsZWN0ZWQgaGFzIG5vdCBiZWVuIGNvbXBpbGVkIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogICAgICAgIFJlLWNvbmZpZ3VyZSB0aGUga2VybmVsIGFuZCByZS1idWlsZCB0aGUgbW9kdWxlcyFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQl9CisJCQorCQlyZWxlYXNlX2h3KGNhcmQpOworCQl3YW5kZXYtPnN0YXRlID0gV0FOX1VOQ09ORklHVVJFRDsKKwkJcmV0dXJuIGVycjsKKwl9CisKKworICAJLyogUmVzZXJ2ZSBJL08gcmVnaW9uIGFuZCBzY2hlZHVsZSBiYWNrZ3JvdW5kIHRhc2sgKi8KKyAgICAgICAgaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQgJiYgIWNhcmQtPndhbmRldi5waWdneWJhY2spCisJCWlmICghcmVxdWVzdF9yZWdpb24oY2FyZC0+aHcucG9ydCwgY2FyZC0+aHcuaW9fcmFuZ2UsIAorCQkJCXdhbmRldi0+bmFtZSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBvcnQgMHglMDR4IGJ1c3lcbiIsIGNhcmQtPmh3LnBvcnQpOworCQkJcmVsZWFzZV9odyhjYXJkKTsKKwkJCXdhbmRldi0+c3RhdGUgPSBXQU5fVU5DT05GSUdVUkVEOworCQkJcmV0dXJuIC1FQlVTWTsKKwkgIH0KKworCS8qIE9ubHkgdXNlIHRoZSBwb2xsaW5nIHJvdXRpbmUgZm9yIHRoZSBYMjUgcHJvdG9jb2wgKi8KKwkKKwljYXJkLT53YW5kZXYuY3JpdGljYWw9MDsKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgKiBjb25maWd1cmVfczUwOF9jYXJkCisgKiAKKyAqIEZvciBhIFM1MDggYWRhcHRlciwgY2hlY2sgZm9yIGEgcG9zc2libGUgY29uZmlndXJhdGlvbiBlcnJvciBpbiB0aGF0CisgKiB3ZSBhcmUgbG9hZGluZyBhbiBhZGFwdGVyIGluIHRoZSBzYW1lIElPIHBvcnQgYXMgYSBwcmV2aW91c2x5IGxvYWRlZCBTNTA4CisgKiBjYXJkLgorICovIAorCitzdGF0aWMgaW50IGNoZWNrX3M1MDhfY29uZmxpY3RzIChzZGxhX3QqIGNhcmQsd2FuZGV2X2NvbmZfdCogY29uZiwgaW50ICppcnEpCit7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M7CisJaW50IGk7CisJCisJaWYgKGNvbmYtPmlvcG9ydCA8PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJIiVzOiBjYW4ndCBjb25maWd1cmUgd2l0aG91dCBJL08gcG9ydCBhZGRyZXNzIVxuIiwKKwkJY2FyZC0+d2FuZGV2Lm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY29uZi0+aXJxIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNhbid0IGNvbmZpZ3VyZSB3aXRob3V0IElSUSFcbiIsCisJCWNhcmQtPndhbmRldi5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHRlc3RfYml0KDAsJmNhcmQtPmNvbmZpZ3VyZWQpKQorCQlyZXR1cm4gMDsKKworCisJLyogQ2hlY2sgZm9yIGFscmVhZHkgbG9hZGVkIGNhcmQgd2l0aCB0aGUgc2FtZSBJTyBwb3J0IGFuZCBJUlEgCisJICogSWYgZm91bmQsIGNvcHkgaXRzIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gYW5kIHVzZSBpdHMKKwkgKiByZXNvdXJjZXMgKGkuZS4gcGlnZ3liYWNraW5nKQorCSAqLworCQorCWZvciAoaSA9IDA7IGkgPCBuY2FyZHM7IGkrKykgeworCQlzZGxhX3QgKm54dF9jYXJkID0gJmNhcmRfYXJyYXlbaV07CisKKwkJLyogU2tpcCB0aGUgY3VycmVudCBjYXJkIHB0ciAqLworCQlpZiAobnh0X2NhcmQgPT0gY2FyZCkJCisJCQljb250aW51ZTsKKworCisJCS8qIEZpbmQgYSBjYXJkIHRoYXQgaXMgYWxyZWFkeSBjb25maWd1cmVkIHdpdGggdGhlCisJCSAqIHNhbWUgSU8gUG9ydCAqLworCQlpZiAoKG54dF9jYXJkLT5ody50eXBlID09IFNETEFfUzUwOCkgJiYKKwkJICAgIChueHRfY2FyZC0+aHcucG9ydCA9PSBjb25mLT5pb3BvcnQpICYmIAorCQkgICAgKG54dF9jYXJkLT5uZXh0ID09IE5VTEwpKXsKKwkJCQorCQkJLyogV2UgZm91bmQgYSBjYXJkIHRoZSBjYXJkIHRoYXQgaGFzIHNhbWUgY29uZmlndXJhdGlvbgorCQkJICogYXMgdXMuIFRoaXMgbWVhbnMsIHRoYXQgd2UgbXVzdCBzZXR1cCB0aGlzIGNhcmQgaW4gCisJCQkgKiBwaWdnaWJhY2tpbmcgbW9kZS4gSG93ZXZlciwgb25seSBDSERMQyBhbmQgTVBQUCBwcm90b2NvbAorCQkJICogc3VwcG9ydCB0aGlzIHNldHVwICovCisJCQorCQkJaWYgKChjb25mLT5jb25maWdfaWQgPT0gV0FOQ09ORklHX0NIRExDIHx8IAorCQkJICAgICBjb25mLT5jb25maWdfaWQgPT0gV0FOQ09ORklHX01QUFApICYmCisJCQkgICAgKG54dF9jYXJkLT53YW5kZXYuY29uZmlnX2lkID09IFdBTkNPTkZJR19DSERMQyB8fCAKKwkJCSAgICAgbnh0X2NhcmQtPndhbmRldi5jb25maWdfaWQgPT0gV0FOQ09ORklHX01QUFApKXsgCisJCQkJCisJCQkJKmlycSA9IG54dF9jYXJkLT5ody5pcnE7CisJCQkJbWVtY3B5KCZjYXJkLT5odywgJm54dF9jYXJkLT5odywgc2l6ZW9mKHNkbGFod190KSk7CisJCQkKKwkJCQkvKiBUaGUgbWFzdGVyIGNvdWxkIGFscmVhZHkgYmUgcnVubmluZywgd2UgbXVzdAorCQkJCSAqIHNldCB0aGlzIGFzIGEgY3JpdGljYWwgYXJlYSAqLworCQkJCWxvY2tfYWRhcHRlcl9pcnEoJm54dF9jYXJkLT53YW5kZXYubG9jaywgJnNtcF9mbGFncyk7CisKKwkJCQlueHRfY2FyZC0+bmV4dCA9IGNhcmQ7CisJCQkJY2FyZC0+bmV4dCA9IG54dF9jYXJkOworCisJCQkJY2FyZC0+d2FuZGV2LnBpZ2d5YmFjayA9IFdBTk9QVF9ZRVM7CisKKwkJCQkvKiBXZSBtdXN0IGluaXRpYWxpc2UgdGhlIHBpZ2dpYmFjayBzcGluIGxvY2sgaGVyZQorCQkJCSAqIHNpbmNlIGlzciB3aWxsIHRyeSB0byBsb2NrIGNhcmQtPm5leHQgaWYgaXQKKwkJCQkgKiBleGlzdHMgKi8KKwkJCQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+d2FuZGV2LmxvY2spOworCQkJCQorCQkJCXVubG9ja19hZGFwdGVyX2lycSgmbnh0X2NhcmQtPndhbmRldi5sb2NrLCAmc21wX2ZsYWdzKTsKKwkJCQlicmVhazsKKwkJCX1lbHNleworCQkJCS8qIFRyeWluZyB0byBydW4gcGlnZ2liYWNraW5nIHdpdGggYSB3cm9uZyBwcm90b2NvbCAqLworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUjogUmVzb3VyY2UgYnVzeSwgaW9wb3J0OiAweCV4XG4iCisJCQkJCQkgIiVzOiAgICAgICAgVGhpcyBwcm90b2NvbCBkb2Vzbid0IHN1cHBvcnRcbiIKKwkJCQkJCSAiJXM6ICAgICAgICBtdWx0aS1wb3J0IG9wZXJhdGlvbiFcbiIsCisJCQkJCQkgY2FyZC0+ZGV2bmFtZSxueHRfY2FyZC0+aHcucG9ydCwKKwkJCQkJCSBjYXJkLT5kZXZuYW1lLGNhcmQtPmRldm5hbWUpOworCQkJCXJldHVybiAtRUVYSVNUOworCQkJfQorCQl9CisJfQorCQorCisJLyogTWFrZSBzdXJlIEkvTyBwb3J0IHJlZ2lvbiBpcyBhdmFpbGFibGUgb25seSBpZiB3ZSBhcmUgdGhlCisJICogbWFzdGVyIGRldmljZS4gIElmIHdlIGFyZSBydW5uaW5nIGluIHBpZ2d5YmFja2luZyBtb2RlLCAKKwkgKiB3ZSB3aWxsIHVzZSB0aGUgcmVzb3VyY2VzIG9mIHRoZSBtYXN0ZXIgY2FyZC4gKi8KKwlpZiAoIWNhcmQtPndhbmRldi5waWdneWJhY2spIHsKKwkJc3RydWN0IHJlc291cmNlICpyciA9CisJCQlyZXF1ZXN0X3JlZ2lvbihjb25mLT5pb3BvcnQsIFNETEFfTUFYSU9SQU5HRSwgInNkbGFtYWluIik7CisJCXJlbGVhc2VfcmVnaW9uKGNvbmYtPmlvcG9ydCwgU0RMQV9NQVhJT1JBTkdFKTsKKworCQlpZiAoIXJyKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBJL08gcmVnaW9uIDB4JVggLSAweCVYIGlzIGluIHVzZSFcbiIsCisJCQkJY2FyZC0+d2FuZGV2Lm5hbWUsIGNvbmYtPmlvcG9ydCwKKwkJCQljb25mLT5pb3BvcnQgKyBTRExBX01BWElPUkFOR0UgLSAxKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICogY29uZmlndXJlX3M1MTRfY2FyZAorICogCisgKiBGb3IgYSBTNTE0IGFkYXB0ZXIsIGNoZWNrIGZvciBhIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gZXJyb3IgaW4gdGhhdAorICogd2UgYXJlIGxvYWRpbmcgYW4gYWRhcHRlciBpbiB0aGUgc2FtZSBzbG90IGFzIGEgcHJldmlvdXNseSBsb2FkZWQgUzUxNAorICogY2FyZC4KKyAqLyAKKworCitzdGF0aWMgaW50IGNoZWNrX3M1MTRfY29uZmxpY3RzKHNkbGFfdCogY2FyZCx3YW5kZXZfY29uZl90KiBjb25mLCBpbnQgKmlycSkKK3sKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKwlpbnQgaTsKKwkKKwlpZiAodGVzdF9iaXQoMCwmY2FyZC0+Y29uZmlndXJlZCkpCisJCXJldHVybiAwOworCisJCisJLyogQ2hlY2sgZm9yIGFscmVhZHkgbG9hZGVkIGNhcmQgd2l0aCB0aGUgc2FtZSBJTyBwb3J0IGFuZCBJUlEgCisJICogSWYgZm91bmQsIGNvcHkgaXRzIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gYW5kIHVzZSBpdHMKKwkgKiByZXNvdXJjZXMgKGkuZS4gcGlnZ3liYWNraW5nKQorCSAqLworCisJZm9yIChpID0gMDsgaSA8IG5jYXJkczsgaSArKykgeworCQorCQlzZGxhX3QqIG54dF9jYXJkID0gJmNhcmRfYXJyYXlbaV07CisJCWlmKG54dF9jYXJkID09IGNhcmQpCisJCQljb250aW51ZTsKKwkJCisJCWlmKChueHRfY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpICYmCisJCSAgIChueHRfY2FyZC0+aHcuUzUxNF9zbG90X25vID09IGNvbmYtPlBDSV9zbG90X25vKSAmJgorCQkgICAobnh0X2NhcmQtPmh3LlM1MTRfY3B1X25vWzBdID09IGNvbmYtPlM1MTRfQ1BVX25vWzBdKSYmCisJCSAgIChueHRfY2FyZC0+bmV4dCA9PSBOVUxMKSl7CisKKworCQkJaWYgKChjb25mLT5jb25maWdfaWQgPT0gV0FOQ09ORklHX0NIRExDIHx8IAorCQkJICAgICBjb25mLT5jb25maWdfaWQgPT0gV0FOQ09ORklHX01QUFApICYmCisJCQkgICAgKG54dF9jYXJkLT53YW5kZXYuY29uZmlnX2lkID09IFdBTkNPTkZJR19DSERMQyB8fCAKKwkJCSAgICAgbnh0X2NhcmQtPndhbmRldi5jb25maWdfaWQgPT0gV0FOQ09ORklHX01QUFApKXsgCisJCQkJCisJCQkJKmlycSA9IG54dF9jYXJkLT5ody5pcnE7CisJCQkJbWVtY3B5KCZjYXJkLT5odywgJm54dF9jYXJkLT5odywgc2l6ZW9mKHNkbGFod190KSk7CisJCisJCQkJLyogVGhlIG1hc3RlciBjb3VsZCBhbHJlYWR5IGJlIHJ1bm5pbmcsIHdlIG11c3QKKwkJCQkgKiBzZXQgdGhpcyBhcyBhIGNyaXRpY2FsIGFyZWEgKi8KKwkJCQlsb2NrX2FkYXB0ZXJfaXJxKCZueHRfY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CisJCQkJbnh0X2NhcmQtPm5leHQgPSBjYXJkOworCQkJCWNhcmQtPm5leHQgPSBueHRfY2FyZDsKKworCQkJCWNhcmQtPndhbmRldi5waWdneWJhY2sgPSBXQU5PUFRfWUVTOworCisJCQkJLyogV2UgbXVzdCBpbml0aWFsaXNlIHRoZSBwaWdnaWJhY2sgc3BpbiBsb2NrIGhlcmUKKwkJCQkgKiBzaW5jZSBpc3Igd2lsbCB0cnkgdG8gbG9jayBjYXJkLT5uZXh0IGlmIGl0CisJCQkJICogZXhpc3RzICovCisJCQkJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPndhbmRldi5sb2NrKTsKKworCQkJCXVubG9ja19hZGFwdGVyX2lycSgmbnh0X2NhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOworCisJCQl9ZWxzZXsKKwkJCQkvKiBUcnlpbmcgdG8gcnVuIHBpZ2dpYmFja2luZyB3aXRoIGEgd3JvbmcgcHJvdG9jb2wgKi8KKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogRVJST1I6IFJlc291cmNlIGJ1c3k6IENQVSAlYyBQQ0lTTE9UICVpXG4iCisJCQkJCQkgIiVzOiAgICAgICAgVGhpcyBwcm90b2NvbCBkb2Vzbid0IHN1cHBvcnRcbiIKKwkJCQkJCSAiJXM6ICAgICAgICBtdWx0aS1wb3J0IG9wZXJhdGlvbiFcbiIsCisJCQkJCQkgY2FyZC0+ZGV2bmFtZSwKKwkJCQkJCSBjb25mLT5TNTE0X0NQVV9ub1swXSxjb25mLT5QQ0lfc2xvdF9ubywKKwkJCQkJCSBjYXJkLT5kZXZuYW1lLGNhcmQtPmRldm5hbWUpOworCQkJCXJldHVybiAtRUVYSVNUOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNodXQgZG93biBXQU4gbGluayBkcml2ZXIuIAorICogbyBzaHV0IGRvd24gYWRhcHRlciBoYXJkd2FyZQorICogbyByZWxlYXNlIHN5c3RlbSByZXNvdXJjZXMuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHJvdXRlciB3aGVuIGRldmljZSBpcyBiZWluZyB1bnJlZ2lzdGVyZWQgb3IKKyAqIHdoZW4gaXQgaGFuZGxlcyBST1VURVJfRE9XTiBJT0NUTC4KKyAqLworc3RhdGljIGludCBzaHV0ZG93bihzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2KQoreworCXNkbGFfdCAqY2FyZDsKKwlpbnQgZXJyPTA7CisJCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmICgod2FuZGV2ID09IE5VTEwpIHx8ICh3YW5kZXYtPnByaXZhdGUgPT0gTlVMTCkpeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJCQorCWlmICh3YW5kZXYtPnN0YXRlID09IFdBTl9VTkNPTkZJR1VSRUQpeworCQlyZXR1cm4gMDsKKwl9CisKKwljYXJkID0gd2FuZGV2LT5wcml2YXRlOworCisJaWYgKGNhcmQtPnR0eV9vcHQpeworCQlpZiAoY2FyZC0+dHR5X29wZW4peworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IFNodXRkb3duIEZhaWxlZDogVFRZIGlzIHN0aWxsIG9wZW5cbiIsCisJCQkJICBjYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisJCisJd2FuZGV2LT5zdGF0ZSA9IFdBTl9VTkNPTkZJR1VSRUQ7CisKKwlzZXRfYml0KFBFUklfQ1JJVCwodm9pZCopJndhbmRldi0+Y3JpdGljYWwpOworCQorCS8qIEluIGNhc2Ugb2YgcGlnZ2liYWNraW5nLCBtYWtlIHN1cmUgdGhhdCAKKyAgICAgICAgICogd2UgbmV2ZXIgdHJ5IHRvIHNodXRkb3duIGJvdGggZGV2aWNlcyBhdCB0aGUgc2FtZQorICAgICAgICAgKiB0aW1lLCBiZWNhdXNlIHRoZXkgZGVwZW5kIG9uIG9uZSBhbm90aGVyICovCisJCisJaWYgKGNhcmQtPmRpc2FibGVfY29tbSl7CisJCWNhcmQtPmRpc2FibGVfY29tbShjYXJkKTsKKwl9CisKKwkvKiBSZWxlYXNlIFJlc291cmNlcyAqLworCXJlbGVhc2VfaHcoY2FyZCk7CisKKyAgICAgICAgLyogb25seSBmcmVlIHRoZSBhbGxvY2F0ZWQgSS9PIHJhbmdlIGlmIG5vdCBhbiBTNTE0IGFkYXB0ZXIgKi8KKwlpZiAod2FuZGV2LT5od19vcHRbMF0gIT0gU0RMQV9TNTE0ICYmICFjYXJkLT5jb25maWd1cmVkKXsKKyAgICAgICAgICAgICAgCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmh3LnBvcnQsIGNhcmQtPmh3LmlvX3JhbmdlKTsKKwl9CisKKwlpZiAoIWNhcmQtPmNvbmZpZ3VyZWQpeworCQltZW1zZXQoJmNhcmQtPmh3LCAwLCBzaXplb2Yoc2RsYWh3X3QpKTsKKwkgICAgICAJaWYgKGNhcmQtPm5leHQpeworCQkJbWVtc2V0KCZjYXJkLT5uZXh0LT5odywgMCwgc2l6ZW9mKHNkbGFod190KSk7CisJCX0KKwl9CisJCisKKwljbGVhcl9iaXQoUEVSSV9DUklULCh2b2lkKikmd2FuZGV2LT5jcml0aWNhbCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9odyAoc2RsYV90ICpjYXJkKQoreworCXNkbGFfdCAqbnh0X2NhcmQ7CisKKwkKKwkvKiBDaGVjayBpZiBuZXh0IGRldmljZSBleGlzdHMgKi8KKwlpZiAoY2FyZC0+bmV4dCl7CisJCW54dF9jYXJkID0gY2FyZC0+bmV4dDsKKwkJLyogSWYgbmV4dCBkZXZpY2UgaXMgZG93biB0aGVuIHJlbGVhc2UgcmVzb3VyY2VzICovCisJCWlmIChueHRfY2FyZC0+d2FuZGV2LnN0YXRlID09IFdBTl9VTkNPTkZJR1VSRUQpeworCQkJaWYgKGNhcmQtPndhbmRldi5waWdneWJhY2speworCQkJCS8qIElmIHRoaXMgZGV2aWNlIGlzIHBpZ2d5YmFjayB0aGVuIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbmZvcm1hdGlvbiBvZiB0aGUgbWFzdGVyIGRldmljZSAKKwkJCQkgKi8KKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogUGlnZ3liYWNrIHNodXR0aW5nIGRvd25cbiIsY2FyZC0+ZGV2bmFtZSk7CisJCQkJc2RsYV9kb3duKCZjYXJkLT5uZXh0LT5odyk7CisgICAgICAgCQkJCWZyZWVfaXJxKGNhcmQtPndhbmRldi5pcnEsIGNhcmQtPm5leHQpOworCQkJCWNhcmQtPmNvbmZpZ3VyZWQgPSAwOworCQkJCWNhcmQtPm5leHQtPmNvbmZpZ3VyZWQgPSAwOworCQkJCWNhcmQtPndhbmRldi5waWdneWJhY2sgPSAwOworCQkJfWVsc2V7CisJCQkJLyogTWFzdGVyIGRldmljZSBzaHV0dGluZyBkb3duICovCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1hc3RlciBzaHV0dGluZyBkb3duXG4iLGNhcmQtPmRldm5hbWUpOworCQkJCXNkbGFfZG93bigmY2FyZC0+aHcpOworCQkJCWZyZWVfaXJxKGNhcmQtPndhbmRldi5pcnEsIGNhcmQpOworCQkJCWNhcmQtPmNvbmZpZ3VyZWQgPSAwOworCQkJCWNhcmQtPm5leHQtPmNvbmZpZ3VyZWQgPSAwOworCQkJfQorCQl9ZWxzZXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEZXZpY2Ugc3RpbGwgcnVubmluZyAlaVxuIiwKKwkJCQlueHRfY2FyZC0+ZGV2bmFtZSxueHRfY2FyZC0+d2FuZGV2LnN0YXRlKTsKKworCQkJY2FyZC0+Y29uZmlndXJlZCA9IDE7CisJCX0KKwl9ZWxzZXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1hc3RlciBzaHV0dGluZyBkb3duXG4iLGNhcmQtPmRldm5hbWUpOworCQlzZGxhX2Rvd24oJmNhcmQtPmh3KTsKKyAgICAgICAJCWZyZWVfaXJxKGNhcmQtPndhbmRldi5pcnEsIGNhcmQpOworCQljYXJkLT5jb25maWd1cmVkID0gMDsKKwl9CisJcmV0dXJuOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRHJpdmVyIEkvTyBjb250cm9sLiAKKyAqIG8gdmVyaWZ5IGFyZ3VtZW50cworICogbyBwZXJmb3JtIHJlcXVlc3RlZCBhY3Rpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHJvdXRlciBoYW5kbGVzIG9uZSBvZiB0aGUgcmVzZXJ2ZWQgdXNlcgorICogSU9DVExzLiAgTm90ZSB0aGF0ICdhcmcnIHN0aWwgcG9pbnRzIHRvIHVzZXIgYWRkcmVzcyBzcGFjZS4KKyAqLworc3RhdGljIGludCBpb2N0bChzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXNkbGFfdCogY2FyZDsKKwlpbnQgZXJyOworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmICgod2FuZGV2ID09IE5VTEwpIHx8ICh3YW5kZXYtPnByaXZhdGUgPT0gTlVMTCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICh3YW5kZXYtPnN0YXRlID09IFdBTl9VTkNPTkZJR1VSRUQpCisJCXJldHVybiAtRU5PREVWOworCisJY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKworCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KXsKKwkJZGlzYWJsZV9pcnEoY2FyZC0+aHcuaXJxKTsKKwl9CisKKwlpZiAodGVzdF9iaXQoU0VORF9DUklULCAodm9pZCopJndhbmRldi0+Y3JpdGljYWwpKSB7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0FOUElQRV9EVU1QOgorCQllcnIgPSBpb2N0bF9kdW1wKHdhbmRldi0+cHJpdmF0ZSwgKHZvaWQqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXQU5QSVBFX0VYRUM6CisJCWVyciA9IGlvY3RsX2V4ZWMod2FuZGV2LT5wcml2YXRlLCAodm9pZCopYXJnLCBjbWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCX0KKyAKKwlyZXR1cm4gZXJyOworfQorCisvKioqKioqIERyaXZlciBJT0NUTCBIYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEdW1wIGFkYXB0ZXIgbWVtb3J5IHRvIHVzZXIgYnVmZmVyLgorICogbyB2ZXJpZnkgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqIG8gY29weSByZXF1ZXN0IHN0cnVjdHVyZSB0byBrZXJuZWwgZGF0YSBzcGFjZQorICogbyB2ZXJpZnkgbGVuZ3RoL29mZnNldAorICogbyB2ZXJpZnkgdXNlciBidWZmZXIKKyAqIG8gY29weSBhZGFwdGVyIG1lbW9yeSBpbWFnZSB0byB1c2VyIGJ1ZmZlcgorICoKKyAqIE5vdGU6IHdoZW4gZHVtcGluZyBtZW1vcnksIHRoaXMgcm91dGluZSBzd2l0Y2hlcyBjdXJlbnQgZHVhbC1wb3J0IG1lbW9yeQorICoJIHZlY3Rvciwgc28gY2FyZSBtdXN0IGJlIHRha2VuIHRvIGF2b2lkIHJhY2luZyBjb25kaXRpb25zLgorICovCitzdGF0aWMgaW50IGlvY3RsX2R1bXAgKHNkbGFfdCogY2FyZCwgc2RsYV9kdW1wX3QqIHVfZHVtcCkKK3sKKwlzZGxhX2R1bXBfdCBkdW1wOworCXVuc2lnbmVkIHdpbnNpemU7CisJdW5zaWduZWQgbG9uZyBvbGR2ZWM7CS8qIERQTSB3aW5kb3cgdmVjdG9yICovCisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M7CisJaW50IGVyciA9IDA7CisKKwlpZihjb3B5X2Zyb21fdXNlcigodm9pZCopJmR1bXAsICh2b2lkKil1X2R1bXAsIHNpemVvZihzZGxhX2R1bXBfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkJCisJaWYgKChkdW1wLm1hZ2ljICE9IFdBTlBJUEVfTUFHSUMpIHx8CisJICAgIChkdW1wLm9mZnNldCArIGR1bXAubGVuZ3RoID4gY2FyZC0+aHcubWVtb3J5KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJd2luc2l6ZSA9IGNhcmQtPmh3LmRwbXNpemU7CisKKwlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCkgeworCisJCWxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCAmc21wX2ZsYWdzKTsKKwkJCisgICAgICAgICAgICAgICAgb2xkdmVjID0gY2FyZC0+aHcudmVjdG9yOworICAgICAgICAgICAgICAgIHdoaWxlIChkdW1wLmxlbmd0aCkgeworCQkJLyogY3VycmVudCBvZmZzZXQgKi8JCQkJCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwb3MgPSBkdW1wLm9mZnNldCAlIHdpbnNpemU7CisJCQkvKiBjdXJyZW50IHZlY3RvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB2ZWMgPSBkdW1wLm9mZnNldCAtIHBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbiA9IChkdW1wLmxlbmd0aCA+ICh3aW5zaXplIC0gcG9zKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgCSh3aW5zaXplIC0gcG9zKSA6IGR1bXAubGVuZ3RoOworCQkJLyogcmVsb2NhdGUgd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2RsYV9tYXBtZW0oJmNhcmQtPmh3LCB2ZWMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLUVJTzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvcHlfdG9fdXNlcigodm9pZCAqKWR1bXAucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTggKiljYXJkLT5ody5kcG1iYXNlICsgcG9zLCBsZW4pKXsgCisJCQkJCisJCQkJdW5sb2NrX2FkYXB0ZXJfaXJxKCZjYXJkLT53YW5kZXYubG9jaywgJnNtcF9mbGFncyk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXAubGVuZ3RoICAgICAtPSBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1wLm9mZnNldCAgICAgKz0gbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcC5wdHIgICAgICAgICA9IChjaGFyKilkdW1wLnB0ciArIGxlbjsKKyAgICAgICAgICAgICAgICB9CisJCQorICAgICAgICAgICAgICAgIHNkbGFfbWFwbWVtKCZjYXJkLT5odywgb2xkdmVjKTsvKiByZXN0b3JlIERQTSB3aW5kb3cgcG9zaXRpb24gKi8KKwkJdW5sb2NrX2FkYXB0ZXJfaXJxKCZjYXJkLT53YW5kZXYubG9jaywgJnNtcF9mbGFncyk7CisgICAgICAgIAorCX1lbHNlIHsKKworICAgICAgICAgICAgICAgaWYoY29weV90b191c2VyKCh2b2lkICopZHVtcC5wdHIsCisJCQkgICAgICAgKHU4ICopY2FyZC0+aHcuZHBtYmFzZSArIGR1bXAub2Zmc2V0LCBkdW1wLmxlbmd0aCkpeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEV4ZWN1dGUgYWRhcHRlciBmaXJtd2FyZSBjb21tYW5kLgorICogbyB2ZXJpZnkgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqIG8gY29weSByZXF1ZXN0IHN0cnVjdHVyZSB0byBrZXJuZWwgZGF0YSBzcGFjZQorICogbyBjYWxsIHByb3RvY29sLXNwZWNpZmljICdleGVjJyBmdW5jdGlvbgorICovCitzdGF0aWMgaW50IGlvY3RsX2V4ZWMgKHNkbGFfdCogY2FyZCwgc2RsYV9leGVjX3QqIHVfZXhlYywgaW50IGNtZCkKK3sKKwlzZGxhX2V4ZWNfdCBleGVjOworCWludCBlcnI9MDsKKworCWlmIChjYXJkLT5leGVjID09IE5VTEwgJiYgY21kID09IFdBTlBJUEVfRVhFQyl7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmKGNvcHlfZnJvbV91c2VyKCh2b2lkKikmZXhlYywgKHZvaWQqKXVfZXhlYywgc2l6ZW9mKHNkbGFfZXhlY190KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChleGVjLm1hZ2ljICE9IFdBTlBJUEVfTUFHSUMpIHx8IChleGVjLmNtZCA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFdBTlBJUEVfRVhFQzoJCisJCQllcnIgPSBjYXJkLT5leGVjKGNhcmQsIGV4ZWMuY21kLCBleGVjLmRhdGEpOworCQkJYnJlYWs7CisJfQkKKwlyZXR1cm4gZXJyOworfQorCisvKioqKioqKiBNaXNjZWxsYW5lb3VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTRExBIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUuCisgKiBvIGFja25vd2xlZGdlIFNETEEgaGFyZHdhcmUgaW50ZXJydXB0LgorICogbyBjYWxsIHByb3RvY29sLXNwZWNpZmljIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUsIGlmIGFueS4KKyAqLworU1RBVElDIGlycXJldHVybl90IHNkbGFfaXNyIChpbnQgaXJxLCB2b2lkKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2RlZmluZQljYXJkCSgoc2RsYV90KilkZXZfaWQpCisKKwlpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkgewkvKiBoYW5kbGUgaW50ZXJycnVwdCBvbiBTNTE0ICovCisgICAgICAgICAgICAgICAgdTMyIGludF9zdGF0dXM7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBDUFVfbm8gPSBjYXJkLT5ody5TNTE0X2NwdV9ub1swXTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGNhcmRfZm91bmRfZm9yX0lSUTsKKwkJdTggSVJRX2NvdW50ID0gMDsKKworCQlmb3IoOzspIHsKKworCQkJcmVhZF9TNTE0X2ludF9zdGF0KCZjYXJkLT5odywgJmludF9zdGF0dXMpOworCisJCQkvKiBjaGVjayBpZiB0aGUgaW50ZXJydXB0IGlzIGZvciB0aGlzIGRldmljZSAqLworIAkJCWlmKCEoKHVuc2lnbmVkIGNoYXIpaW50X3N0YXR1cyAmCisJCQkJKElSUV9DUFVfQSB8IElSUV9DUFVfQikpKQorICAgICAgICAgICAgICAgIAkgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKworCQkJLyogaWYgdGhlIElSUSBpcyBmb3IgYm90aCBDUFVzIG9uIHRoZSBzYW1lIGFkYXB0ZXIsICovCisJCQkvKiB0aGVuIGFsdGVyIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHNvIGFzIHRvIGhhbmRsZSAqLworCQkJLyogb25lIENQVSBhdCBhIHRpbWUgKi8KKwkJCWlmKCgodW5zaWduZWQgY2hhcilpbnRfc3RhdHVzICYgKElSUV9DUFVfQSB8IElSUV9DUFVfQikpCisJCQkJPT0gKElSUV9DUFVfQSB8IElSUV9DUFVfQikpIHsKKwkJCQlpbnRfc3RhdHVzICY9IChDUFVfbm8gPT0gUzUxNF9DUFVfQSkgPworCQkJCQl+SVJRX0NQVV9CIDogfklSUV9DUFVfQTsKKwkJCX0KKyAKKwkJCWNhcmRfZm91bmRfZm9yX0lSUSA9IDA7CisKKwkgICAgICAgICAgICAgCS8qIGNoZWNrIHRvIHNlZSB0aGF0IHRoZSBDUFUgbnVtYmVyIGZvciB0aGlzIGRldmljZSAqLworCQkJLyogY29ycmVzcG9uZHMgdG8gdGhlIGludGVycnVwdCBzdGF0dXMgcmVhZCAqLworICAgICAgICAgICAgICAgIAlzd2l0Y2ggKENQVV9ubykgeworICAgICAgICAgICAgICAgICAgICAgICAgCWNhc2UgUzUxNF9DUFVfQToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWlmKCh1bnNpZ25lZCBjaGFyKWludF9zdGF0dXMgJgorCQkJCQkJSVJRX0NQVV9BKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRfZm91bmRfZm9yX0lSUSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTNTE0X0NQVV9COgorICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHVuc2lnbmVkIGNoYXIpaW50X3N0YXR1cyAmCisJCQkJCQlJUlFfQ1BVX0IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZF9mb3VuZF9mb3JfSVJRID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCX0KKworCQkJLyogZXhpdCBpZiB0aGUgaW50ZXJydXB0IGlzIGZvciBhbm90aGVyIENQVSBvbiB0aGUgKi8KKwkJCS8qIHNhbWUgSVJRICovCisJCQlpZighY2FyZF9mb3VuZF9mb3JfSVJRKQorCQkJCXJldHVybiBJUlFfSEFORExFRDsKKworICAgICAgIAkgCQlpZiAoIWNhcmQgfHwgCisJCQkgICAoY2FyZC0+d2FuZGV2LnN0YXRlID09IFdBTl9VTkNPTkZJR1VSRUQgJiYgIWNhcmQtPmNvbmZpZ3VyZWQpKXsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkJIlJlY2VpdmVkIElSUSAlZCBmb3IgQ1BVICMlY1xuIiwKKwkJCQkJCWlycSwgQ1BVX25vKTsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkJIklSUSBmb3IgdW5jb25maWd1cmVkIGFkYXB0ZXJcbiIpOworCQkJCQlTNTE0X2ludGFjaygmY2FyZC0+aHcsIGludF9zdGF0dXMpOworCQkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgICAgCQkJfQorCisJICAgICAgICAJaWYgKGNhcmQtPmluX2lzcikgeworICAgICAgICAJICAgICAgIAkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiJXM6IGludGVycnVwdCByZS1lbnRyYW5jeSBvbiBJUlEgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIAkJCWNhcmQtPmRldm5hbWUsIGNhcmQtPndhbmRldi5pcnEpOworCQkJCVM1MTRfaW50YWNrKCZjYXJkLT5odywgaW50X3N0YXR1cyk7CisgCQkJCXJldHVybiBJUlFfSEFORExFRDsKKyAgICAgICAJCQl9CisKKwkJCXNwaW5fbG9jaygmY2FyZC0+d2FuZGV2LmxvY2spOworCQkJaWYgKGNhcmQtPm5leHQpeworCQkJCXNwaW5fbG9jaygmY2FyZC0+bmV4dC0+d2FuZGV2LmxvY2spOworCQkJfQorCQkJCQorCSAgICAgICAgICAgICAgIAlTNTE0X2ludGFjaygmY2FyZC0+aHcsIGludF9zdGF0dXMpOworICAgICAgIAkJCWlmIChjYXJkLT5pc3IpCisJCQkJY2FyZC0+aXNyKGNhcmQpOworCisJCQlpZiAoY2FyZC0+bmV4dCl7CisJCQkJc3Bpbl91bmxvY2soJmNhcmQtPm5leHQtPndhbmRldi5sb2NrKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZjYXJkLT53YW5kZXYubG9jayk7CisKKwkJCS8qIGhhbmRsZSBhIG1heGltdW0gb2YgdHdvIGludGVycnVwdHMgKG9uZSBmb3IgZWFjaCAqLworCQkJLyogQ1BVIG9uIHRoZSBhZGFwdGVyKSBiZWZvcmUgcmV0dXJuaW5nICovICAKKwkJCWlmKCgrKyBJUlFfY291bnQpID09IDIpCisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJfQorCisJZWxzZSB7CQkJLyogaGFuZGxlIGludGVycnVwdCBvbiBTNTA4IGFkYXB0ZXIgKi8KKworCQlpZiAoIWNhcmQgfHwgKChjYXJkLT53YW5kZXYuc3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCkgJiYgIWNhcmQtPmNvbmZpZ3VyZWQpKQorCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJCWlmIChjYXJkLT5pbl9pc3IpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IGludGVycnVwdCByZS1lbnRyYW5jeSBvbiBJUlEgJWQhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIGNhcmQtPndhbmRldi5pcnEpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisKKwkJc3Bpbl9sb2NrKCZjYXJkLT53YW5kZXYubG9jayk7CisJCWlmIChjYXJkLT5uZXh0KXsKKwkJCXNwaW5fbG9jaygmY2FyZC0+bmV4dC0+d2FuZGV2LmxvY2spOworCQl9CisJCisJCXNkbGFfaW50YWNrKCZjYXJkLT5odyk7CisJCWlmIChjYXJkLT5pc3IpCisJCQljYXJkLT5pc3IoY2FyZCk7CisJCQorCQlpZiAoY2FyZC0+bmV4dCl7CisJCQlzcGluX3VubG9jaygmY2FyZC0+bmV4dC0+d2FuZGV2LmxvY2spOworCQl9CisJCXNwaW5fdW5sb2NrKCZjYXJkLT53YW5kZXYubG9jayk7CisKKwl9CisgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKyN1bmRlZgljYXJkCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgcHJvdG9jb2wtc3BlY2lmaWMgbW9kdWxlcyB3aGVuIG5ldHdvcmsKKyAqIGludGVyZmFjZSBpcyBiZWluZyBvcGVuLiAgVGhlIG9ubHkgcmVhc29uIHdlIG5lZWQgdGhpcywgaXMgYmVjYXVzZSB3ZQorICogaGF2ZSB0byBjYWxsIE1PRF9JTkNfVVNFX0NPVU5ULCBidXQgY2Fubm90IGluY2x1ZGUgJ21vZHVsZS5oJyB3aGVyZSBpdCdzCisgKiBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlIGludG8gdGhlIHNhbWUga2VybmVsIG1vZHVsZS4KKyAqLwordm9pZCB3YW5waXBlX29wZW4gKHNkbGFfdCogY2FyZCkKK3sKKwkrK2NhcmQtPm9wZW5fY250OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHByb3RvY29sLXNwZWNpZmljIG1vZHVsZXMgd2hlbiBuZXR3b3JrCisgKiBpbnRlcmZhY2UgaXMgYmVpbmcgY2xvc2VkLiAgVGhlIG9ubHkgcmVhc29uIHdlIG5lZWQgdGhpcywgaXMgYmVjYXVzZSB3ZQorICogaGF2ZSB0byBjYWxsIE1PRF9ERUNfVVNFX0NPVU5ULCBidXQgY2Fubm90IGluY2x1ZGUgJ21vZHVsZS5oJyB3aGVyZSBpdCdzCisgKiBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlIGludG8gdGhlIHNhbWUga2VybmVsIG1vZHVsZS4KKyAqLwordm9pZCB3YW5waXBlX2Nsb3NlIChzZGxhX3QqIGNhcmQpCit7CisJLS1jYXJkLT5vcGVuX2NudDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgV0FOIGRldmljZSBzdGF0ZS4KKyAqLwordm9pZCB3YW5waXBlX3NldF9zdGF0ZSAoc2RsYV90KiBjYXJkLCBpbnQgc3RhdGUpCit7CisJaWYgKGNhcmQtPndhbmRldi5zdGF0ZSAhPSBzdGF0ZSkgeworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCXByaW50ayAoS0VSTl9JTkZPICIlczogbGluayBjb25uZWN0ZWQhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXQU5fQ09OTkVDVElORzoKKwkJCXByaW50ayAoS0VSTl9JTkZPICIlczogbGluayBjb25uZWN0aW5nLi4uXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXQU5fRElTQ09OTkVDVEVEOgorCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBsaW5rIGRpc2Nvbm5lY3RlZCFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlicmVhazsKKwkJfQorCQljYXJkLT53YW5kZXYuc3RhdGUgPSBzdGF0ZTsKKwl9CisJY2FyZC0+c3RhdGVfdGljayA9IGppZmZpZXM7Cit9CisKK3NkbGFfdCAqIHdhbnBpcGVfZmluZF9jYXJkIChjaGFyICpuYW1lKQoreworCWludCBjbnQ7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBuY2FyZHM7ICsrIGNudCkgeworCQlzZGxhX3QqIGNhcmQgPSAmY2FyZF9hcnJheVtjbnRdOworCQlpZiAoIXN0cmNtcChjYXJkLT5kZXZuYW1lLG5hbWUpKQorCQkJcmV0dXJuIGNhcmQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzZGxhX3QgKiB3YW5waXBlX2ZpbmRfY2FyZF9udW0gKGludCBudW0pCit7CisJaWYgKG51bSA8IDEgfHwgbnVtID4gbmNhcmRzKQorCQlyZXR1cm4gTlVMTDsJCisJbnVtLS07CisJcmV0dXJuICZjYXJkX2FycmF5W251bV07Cit9CisKKy8qCisgKiBAd29ya19wb2ludGVyOgl3b3JrX3N0cnVjdCB0byBiZSBkb25lOworICogCQkJc2hvdWxkIGFscmVhZHkgaGF2ZSBQUkVQQVJFX1dPUksoKSBvcgorICogCQkJICBJTklUX1dPUksoKSBkb25lIG9uIGl0IGJ5IGNhbGxlcjsKKyAqLwordm9pZCB3YW5waXBlX3F1ZXVlX3dvcmsgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19wb2ludGVyKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDEsICh2b2lkKikmd2FucGlwZV9iaF9jcml0aWNhbCkpCisJCXByaW50ayhLRVJOX0lORk8gIkNSSVRJQ0FMIElOIFFVRVVJTkcgV09SS1xuIik7CisKKwlxdWV1ZV93b3JrKHdhbnBpcGVfd3EsIHdvcmtfcG9pbnRlcik7CisJY2xlYXJfYml0KDEsKHZvaWQqKSZ3YW5waXBlX2JoX2NyaXRpY2FsKTsKK30KKwordm9pZCB3YWtldXBfc2tfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3YW5waXBlX2NvbW1vbl90ICpjaGFuID0gZGV2LT5wcml2OworCisJaWYgKHRlc3RfYml0KDAsJmNoYW4tPmNvbW1vbl9jcml0aWNhbCkpCisJCXJldHVybjsKKwkKKwlpZiAoY2hhbi0+c2sgJiYgY2hhbi0+dHhfdGltZXIpeworCQljaGFuLT50eF90aW1lci0+ZXhwaXJlcz1qaWZmaWVzKzE7CisJCWFkZF90aW1lcihjaGFuLT50eF90aW1lcik7CisJfQorfQorCitpbnQgY2hhbmdlX2Rldl9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZfaW5mbzsKKwltbV9zZWdtZW50X3QgZnMgPSBnZXRfZnMoKTsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZpZl9pbmZvLCAwLCBzaXplb2YoaWZfaW5mbykpOworCXN0cmNweShpZl9pbmZvLmlmcl9uYW1lLCBkZXYtPm5hbWUpOworCWlmX2luZm8uaWZyX2ZsYWdzID0gZmxhZ3M7CQorCisJc2V0X2ZzKGdldF9kcygpKTsgICAgIC8qIGdldCB1c2VyIHNwYWNlIGJsb2NrICovIAorCWVyciA9IGRldmluZXRfaW9jdGwoU0lPQ1NJRkZMQUdTLCAmaWZfaW5mbyk7CisJc2V0X2ZzKGZzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZ2V0X2lwX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9wdGlvbikKK3sKKwkKKwlzdHJ1Y3QgaW5faWZhZGRyICppZmFkZHI7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCisJaWYgKChpbl9kZXYgPSBfX2luX2Rldl9nZXQoZGV2KSkgPT0gTlVMTCl7CisJCXJldHVybiAwOworCX0KKworCWlmICgoaWZhZGRyID0gaW5fZGV2LT5pZmFfbGlzdCk9PSBOVUxMICl7CisJCXJldHVybiAwOworCX0KKwkKKwlzd2l0Y2ggKG9wdGlvbil7CisKKwljYXNlIFdBTl9MT0NBTF9JUDoKKwkJcmV0dXJuIGlmYWRkci0+aWZhX2xvY2FsOworCQlicmVhazsKKwkKKwljYXNlIFdBTl9QT0lOVE9QT0lOVF9JUDoKKwkJcmV0dXJuIGlmYWRkci0+aWZhX2FkZHJlc3M7CisJCWJyZWFrOwkKKworCWNhc2UgV0FOX05FVE1BU0tfSVA6CisJCXJldHVybiBpZmFkZHItPmlmYV9tYXNrOworCQlicmVhazsKKworCWNhc2UgV0FOX0JST0FEQ0FTVF9JUDoKKwkJcmV0dXJuIGlmYWRkci0+aWZhX2Jyb2FkY2FzdDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CQorCit2b2lkIGFkZF9nYXRld2F5KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwltbV9zZWdtZW50X3Qgb2xkZnM7CisJc3RydWN0IHJ0ZW50cnkgcm91dGU7CisJaW50IHJlczsKKworCW1lbXNldCgoY2hhciopJnJvdXRlLDAsc2l6ZW9mKHN0cnVjdCBydGVudHJ5KSk7CisKKwkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKQorCQkmKHJvdXRlLnJ0X2RzdCkpLT5zaW5fYWRkci5zX2FkZHIgPSAwOworCSgoc3RydWN0IHNvY2thZGRyX2luICopCisJCSYocm91dGUucnRfZHN0KSktPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCisJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikKKwkJJihyb3V0ZS5ydF9nZW5tYXNrKSktPnNpbl9hZGRyLnNfYWRkciA9IDA7CisJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgCisJCSYocm91dGUucnRfZ2VubWFzaykpIC0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisKKworCXJvdXRlLnJ0X2ZsYWdzID0gMDsgIAorCXJvdXRlLnJ0X2RldiA9IGRldi0+bmFtZTsKKworCW9sZGZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKwlyZXMgPSBpcF9ydF9pb2N0bChTSU9DQUREUlQsJnJvdXRlKTsKKwlzZXRfZnMob2xkZnMpOworCisJaWYgKHJlcyA9PSAwKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdhdGV3YXkgYWRkZWQgZm9yICVzXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOworCX0KKworCXJldHVybjsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKioqKioqIEVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc2VhbGV2ZWwuYyBiL2RyaXZlcnMvbmV0L3dhbi9zZWFsZXZlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzODBkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vc2VhbGV2ZWwuYwpAQCAtMCwwICsxLDQ2OSBAQAorLyoKKyAqCVNlYWxldmVsIFN5c3RlbXMgNDAyMSBkcml2ZXIuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTksIDIwMDEgQWxhbiBDb3gKKyAqCShjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxuZXQvc3luY3BwcC5oPgorI2luY2x1ZGUgIno4NTIzMC5oIgorCisKK3N0cnVjdCBzbHZsX2RldmljZQoreworCXZvaWQgKmlmX3B0cjsJLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIgKHVzZWQgYnkgU1BQUCkgKi8KKwlzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqY2hhbjsKKwlzdHJ1Y3QgcHBwX2RldmljZSBwcHBkZXY7CisJaW50IGNoYW5uZWw7Cit9OworCisKK3N0cnVjdCBzbHZsX2JvYXJkCit7CisJc3RydWN0IHNsdmxfZGV2aWNlICpkZXZbMl07CisJc3RydWN0IHo4NTMwX2RldiBib2FyZDsKKwlpbnQgaW9iYXNlOworfTsKKworLyoKKyAqCU5ldHdvcmsgZHJpdmVyIHN1cHBvcnQgcm91dGluZXMKKyAqLworCisvKgorICoJRnJhbWUgcmVjZWl2ZS4gU2ltcGxlIGZvciBvdXIgY2FyZCBhcyB3ZSBkbyBzeW5jIHBwcCBhbmQgdGhlcmUKKyAqCWlzIG5vIGZ1bm55IGdhcmJhZ2UgaW52b2x2ZWQKKyAqLworIAorc3RhdGljIHZvaWQgc2VhbGV2ZWxfaW5wdXQoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogRHJvcCB0aGUgQ1JDIC0gaXQncyBub3QgYSBnb29kIGlkZWEgdG8gdHJ5IGFuZCBuZWdvdGlhdGUgaXQgOykgKi8KKwlza2JfdHJpbShza2IsIHNrYi0+bGVuLTIpOworCXNrYi0+cHJvdG9jb2w9aHRvbnMoRVRIX1BfV0FOX1BQUCk7CisJc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKKwlza2ItPmRldj1jLT5uZXRkZXZpY2U7CisJLyoKKwkgKglTZW5kIGl0IHRvIHRoZSBQUFAgbGF5ZXIuIFdlIGRvbid0IGhhdmUgdGltZSB0byBwcm9jZXNzCisJICoJaXQgcmlnaHQgbm93LgorCSAqLworCW5ldGlmX3J4KHNrYik7CisJYy0+bmV0ZGV2aWNlLT5sYXN0X3J4ID0gamlmZmllczsKK30KKyAKKy8qCisgKglXZSd2ZSBiZWVuIHBsYWNlZCBpbiB0aGUgVVAgc3RhdGUKKyAqLyAKKyAKK3N0YXRpYyBpbnQgc2VhbGV2ZWxfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlzdHJ1Y3Qgc2x2bF9kZXZpY2UgKnNsdmw9ZC0+cHJpdjsKKwlpbnQgZXJyID0gLTE7CisJaW50IHVuaXQgPSBzbHZsLT5jaGFubmVsOworCQorCS8qCisJICoJTGluayBsYXllciB1cC4gCisJICovCisKKwlzd2l0Y2godW5pdCkKKwl7CisJCWNhc2UgMDoKKwkJCWVycj16ODUzMF9zeW5jX2RtYV9vcGVuKGQsIHNsdmwtPmNoYW4pOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWVycj16ODUzMF9zeW5jX29wZW4oZCwgc2x2bC0+Y2hhbik7CisJCQlicmVhazsKKwl9CisJCisJaWYoZXJyKQorCQlyZXR1cm4gZXJyOworCS8qCisJICoJQmVnaW4gUFBQCisJICovCisJZXJyPXNwcHBfb3BlbihkKTsKKwlpZihlcnIpCisJeworCQlzd2l0Y2godW5pdCkKKwkJeworCQkJY2FzZSAwOgorCQkJCXo4NTMwX3N5bmNfZG1hX2Nsb3NlKGQsIHNsdmwtPmNoYW4pOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXo4NTMwX3N5bmNfY2xvc2UoZCwgc2x2bC0+Y2hhbik7CisJCQkJYnJlYWs7CisJCX0JCQkJCisJCXJldHVybiBlcnI7CisJfQorCQorCXNsdmwtPmNoYW4tPnJ4X2Z1bmN0aW9uPXNlYWxldmVsX2lucHV0OworCQorCS8qCisJICoJR28gZ28gZ28KKwkgKi8KKwluZXRpZl9zdGFydF9xdWV1ZShkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZWFsZXZlbF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlzdHJ1Y3Qgc2x2bF9kZXZpY2UgKnNsdmw9ZC0+cHJpdjsKKwlpbnQgdW5pdCA9IHNsdmwtPmNoYW5uZWw7CisJCisJLyoKKwkgKglEaXNjYXJkIG5ldyBmcmFtZXMKKwkgKi8KKwkKKwlzbHZsLT5jaGFuLT5yeF9mdW5jdGlvbj16ODUzMF9udWxsX3J4OworCQkKKwkvKgorCSAqCVBQUCBvZmYKKwkgKi8KKwlzcHBwX2Nsb3NlKGQpOworCS8qCisJICoJTGluayBsYXllciBkb3duCisJICovCisKKwluZXRpZl9zdG9wX3F1ZXVlKGQpOworCQkKKwlzd2l0Y2godW5pdCkKKwl7CisJCWNhc2UgMDoKKwkJCXo4NTMwX3N5bmNfZG1hX2Nsb3NlKGQsIHNsdmwtPmNoYW4pOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXo4NTMwX3N5bmNfY2xvc2UoZCwgc2x2bC0+Y2hhbik7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VhbGV2ZWxfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmQsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCS8qIHN0cnVjdCBzbHZsX2RldmljZSAqc2x2bD1kLT5wcml2OworCSAgIHo4NTMwX2lvY3RsKGQsJnNsdmwtPnN5bmMuY2hhbkEsaWZyLGNtZCkgKi8KKwlyZXR1cm4gc3BwcF9kb19pb2N0bChkLCBpZnIsY21kKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzZWFsZXZlbF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmQpCit7CisJc3RydWN0IHNsdmxfZGV2aWNlICpzbHZsPWQtPnByaXY7CisJaWYoc2x2bCkKKwkJcmV0dXJuIHo4NTMwX2dldF9zdGF0cyhzbHZsLT5jaGFuKTsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCisvKgorICoJUGFzc2VkIFBQUCBmcmFtZXMsIGZpcmUgdGhlbSBkb3dud2luZC4KKyAqLworIAorc3RhdGljIGludCBzZWFsZXZlbF9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkKQoreworCXN0cnVjdCBzbHZsX2RldmljZSAqc2x2bD1kLT5wcml2OworCXJldHVybiB6ODUzMF9xdWV1ZV94bWl0KHNsdmwtPmNoYW4sIHNrYik7Cit9CisKK3N0YXRpYyBpbnQgc2VhbGV2ZWxfbmVpZ2hfc2V0dXAoc3RydWN0IG5laWdoYm91ciAqbikKK3sKKwlpZiAobi0+bnVkX3N0YXRlID09IE5VRF9OT05FKSB7CisJCW4tPm9wcyA9ICZhcnBfYnJva2VuX29wczsKKwkJbi0+b3V0cHV0ID0gbi0+b3BzLT5vdXRwdXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlYWxldmVsX25laWdoX3NldHVwX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmVpZ2hfcGFybXMgKnApCit7CisJaWYgKHAtPnRibC0+ZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJcC0+bmVpZ2hfc2V0dXAgPSBzZWFsZXZlbF9uZWlnaF9zZXR1cDsKKwkJcC0+dWNhc3RfcHJvYmVzID0gMDsKKwkJcC0+bWNhc3RfcHJvYmVzID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VhbGV2ZWxfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNsdmxfZGV2aWNlICpzdiA9IGRldi0+cHJpdjsKKwlzcHBwX2F0dGFjaCgmc3YtPnBwcGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNlYWxldmVsX2RldGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNwcHBfZGV0YWNoKGRldik7Cit9CisJCQorc3RhdGljIHZvaWQgc2x2bF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlkLT5vcGVuID0gc2VhbGV2ZWxfb3BlbjsKKwlkLT5zdG9wID0gc2VhbGV2ZWxfY2xvc2U7CisJZC0+aW5pdCA9IHNlYWxldmVsX2F0dGFjaDsKKwlkLT51bmluaXQgPSBzZWFsZXZlbF9kZXRhY2g7CisJZC0+aGFyZF9zdGFydF94bWl0ID0gc2VhbGV2ZWxfcXVldWVfeG1pdDsKKwlkLT5nZXRfc3RhdHMgPSBzZWFsZXZlbF9nZXRfc3RhdHM7CisJZC0+c2V0X211bHRpY2FzdF9saXN0ID0gTlVMTDsKKwlkLT5kb19pb2N0bCA9IHNlYWxldmVsX2lvY3RsOworCWQtPm5laWdoX3NldHVwID0gc2VhbGV2ZWxfbmVpZ2hfc2V0dXBfZGV2OworCWQtPnNldF9tYWNfYWRkcmVzcyA9IE5VTEw7CisKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2x2bF9kZXZpY2UgKnNsdmxfYWxsb2MoaW50IGlvYmFzZSwgaW50IGlycSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZDsKKwlzdHJ1Y3Qgc2x2bF9kZXZpY2UgKnN2OworCisJZCA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHNsdmxfZGV2aWNlKSwgImhkbGMlZCIsCisJCQkgc2x2bF9zZXR1cCk7CisKKwlpZiAoIWQpIAorCQlyZXR1cm4gTlVMTDsKKworCXN2ID0gZC0+cHJpdjsKKwlzdi0+aWZfcHRyID0gJnN2LT5wcHBkZXY7CisJc3YtPnBwcGRldi5kZXYgPSBkOworCWQtPmJhc2VfYWRkciA9IGlvYmFzZTsKKwlkLT5pcnEgPSBpcnE7CisJCQorCXJldHVybiBzdjsKK30KKworCisvKgorICoJQWxsb2NhdGUgYW5kIHNldHVwIFNlYWxldmVsIGJvYXJkLgorICovCisgCitzdGF0aWMgX19pbml0IHN0cnVjdCBzbHZsX2JvYXJkICpzbHZsX2luaXQoaW50IGlvYmFzZSwgaW50IGlycSwgCisJCQkJCSAgIGludCB0eGRtYSwgaW50IHJ4ZG1hLCBpbnQgc2xvdykKK3sKKwlzdHJ1Y3Qgejg1MzBfZGV2ICpkZXY7CisJc3RydWN0IHNsdmxfYm9hcmQgKmI7CisJCisJLyoKKwkgKglHZXQgdGhlIG5lZWRlZCBJL08gc3BhY2UKKwkgKi8KKworCWlmKCFyZXF1ZXN0X3JlZ2lvbihpb2Jhc2UsIDgsICJTZWFsZXZlbCA0MDIxIikpIAorCXsJCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNlYWxldmVsOiBJL08gMHglWCBhbHJlYWR5IGluIHVzZS5cbiIsIGlvYmFzZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwliID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNsdmxfYm9hcmQpLCBHRlBfS0VSTkVMKTsKKwlpZighYikKKwkJZ290byBmYWlsMzsKKworCW1lbXNldChiLCAwLCBzaXplb2YoKmIpKTsKKwlpZiAoIShiLT5kZXZbMF09IHNsdmxfYWxsb2MoaW9iYXNlLCBpcnEpKSkKKwkJZ290byBmYWlsMjsKKworCWItPmRldlswXS0+Y2hhbiA9ICZiLT5ib2FyZC5jaGFuQTsJCisJYi0+ZGV2WzBdLT5jaGFubmVsID0gMDsKKwkKKwlpZiAoIShiLT5kZXZbMV0gPSBzbHZsX2FsbG9jKGlvYmFzZSwgaXJxKSkpCisJCWdvdG8gZmFpbDFfMDsKKworCWItPmRldlsxXS0+Y2hhbiA9ICZiLT5ib2FyZC5jaGFuQjsKKwliLT5kZXZbMV0tPmNoYW5uZWwgPSAxOworCisJZGV2ID0gJmItPmJvYXJkOworCQorCS8qCisJICoJU3R1ZmYgaW4gdGhlIEkvTyBhZGRyZXNzaW5nCisJICovCisJIAorCWRldi0+YWN0aXZlID0gMDsKKworCWItPmlvYmFzZSA9IGlvYmFzZTsKKwkKKwkvKgorCSAqCVNlbGVjdCA4NTMwIGRlbGF5cyBmb3IgdGhlIG9sZCBib2FyZAorCSAqLworCSAKKwlpZihzbG93KQorCQlpb2Jhc2UgfD0gWjg1MzBfUE9SVF9TTEVFUDsKKwkJCisJZGV2LT5jaGFuQS5jdHJsaW89aW9iYXNlKzE7CisJZGV2LT5jaGFuQS5kYXRhaW89aW9iYXNlOworCWRldi0+Y2hhbkIuY3RybGlvPWlvYmFzZSszOworCWRldi0+Y2hhbkIuZGF0YWlvPWlvYmFzZSsyOworCQorCWRldi0+Y2hhbkEuaXJxcz0mejg1MzBfbm9wOworCWRldi0+Y2hhbkIuaXJxcz0mejg1MzBfbm9wOworCQorCS8qCisJICoJQXNzZXJ0IERUUiBlbmFibGUgRE1BCisJICovCisJIAorCW91dGIoM3woMTw8NyksIGItPmlvYmFzZSs0KTsJCisJCisKKwkvKiBXZSB3YW50IGEgZmFzdCBJUlEgZm9yIHRoaXMgZGV2aWNlLiBBY3R1YWxseSB3ZSdkIGxpa2UgYW4gZXZlbiBmYXN0ZXIKKwkgICBJUlEgOykgLSBUaGlzIGlzIG9uZSBkcml2ZXIgUnRMaW51eCBpcyBtYWRlIGZvciAqLworICAgCisJaWYocmVxdWVzdF9pcnEoaXJxLCAmejg1MzBfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsICJTZWFMZXZlbCIsIGRldik8MCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNlYWxldmVsOiBJUlEgJWQgYWxyZWFkeSBpbiB1c2UuXG4iLCBpcnEpOworCQlnb3RvIGZhaWwxXzE7CisJfQorCQorCWRldi0+aXJxPWlycTsKKwlkZXYtPmNoYW5BLnByaXZhdGU9JmItPmRldlswXTsKKwlkZXYtPmNoYW5CLnByaXZhdGU9JmItPmRldlsxXTsKKwlkZXYtPmNoYW5BLm5ldGRldmljZT1iLT5kZXZbMF0tPnBwcGRldi5kZXY7CisJZGV2LT5jaGFuQi5uZXRkZXZpY2U9Yi0+ZGV2WzFdLT5wcHBkZXYuZGV2OworCWRldi0+Y2hhbkEuZGV2PWRldjsKKwlkZXYtPmNoYW5CLmRldj1kZXY7CisKKwlkZXYtPmNoYW5BLnR4ZG1hPTM7CisJZGV2LT5jaGFuQS5yeGRtYT0xOworCWlmKHJlcXVlc3RfZG1hKGRldi0+Y2hhbkEudHhkbWEsICJTZWFMZXZlbCAoVFgpIikhPTApCisJCWdvdG8gZmFpbDsKKwkJCisJaWYocmVxdWVzdF9kbWEoZGV2LT5jaGFuQS5yeGRtYSwgIlNlYUxldmVsIChSWCkiKSE9MCkKKwkJZ290byBkbWFmYWlsOworCQorCWRpc2FibGVfaXJxKGlycSk7CisJCQorCS8qCisJICoJQmVnaW4gbm9ybWFsIGluaXRpYWxpc2UKKwkgKi8KKwkgCisJaWYoejg1MzBfaW5pdChkZXYpIT0wKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJaODUzMCBzZXJpZXMgZGV2aWNlIG5vdCBmb3VuZC5cbiIpOworCQllbmFibGVfaXJxKGlycSk7CisJCWdvdG8gZG1hZmFpbDI7CisJfQorCWlmKGRldi0+dHlwZT09Wjg1QzMwKQorCXsKKwkJejg1MzBfY2hhbm5lbF9sb2FkKCZkZXYtPmNoYW5BLCB6ODUzMF9oZGxjX2tpbG9zdHJlYW0pOworCQl6ODUzMF9jaGFubmVsX2xvYWQoJmRldi0+Y2hhbkIsIHo4NTMwX2hkbGNfa2lsb3N0cmVhbSk7CisJfQorCWVsc2UKKwl7CisJCXo4NTMwX2NoYW5uZWxfbG9hZCgmZGV2LT5jaGFuQSwgejg1MzBfaGRsY19raWxvc3RyZWFtXzg1MjMwKTsKKwkJejg1MzBfY2hhbm5lbF9sb2FkKCZkZXYtPmNoYW5CLCB6ODUzMF9oZGxjX2tpbG9zdHJlYW1fODUyMzApOworCX0KKworCS8qCisJICoJTm93IHdlIGNhbiB0YWtlIHRoZSBJUlEKKwkgKi8KKwkKKwllbmFibGVfaXJxKGlycSk7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGItPmRldlswXS0+cHBwZGV2LmRldikpIAorCQlnb3RvIGRtYWZhaWwyOworCQkKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGItPmRldlsxXS0+cHBwZGV2LmRldikpIAorCQlnb3RvIGZhaWxfdW5pdDsKKworCXo4NTMwX2Rlc2NyaWJlKGRldiwgIkkvTyIsIGlvYmFzZSk7CisJZGV2LT5hY3RpdmU9MTsKKwlyZXR1cm4gYjsKKworZmFpbF91bml0OgorCXVucmVnaXN0ZXJfbmV0ZGV2KGItPmRldlswXS0+cHBwZGV2LmRldik7CisJCitkbWFmYWlsMjoKKwlmcmVlX2RtYShkZXYtPmNoYW5BLnJ4ZG1hKTsKK2RtYWZhaWw6CisJZnJlZV9kbWEoZGV2LT5jaGFuQS50eGRtYSk7CitmYWlsOgorCWZyZWVfaXJxKGlycSwgZGV2KTsKK2ZhaWwxXzE6CisJZnJlZV9uZXRkZXYoYi0+ZGV2WzFdLT5wcHBkZXYuZGV2KTsKK2ZhaWwxXzA6CisJZnJlZV9uZXRkZXYoYi0+ZGV2WzBdLT5wcHBkZXYuZGV2KTsKK2ZhaWwyOgorCWtmcmVlKGIpOworZmFpbDM6CisJcmVsZWFzZV9yZWdpb24oaW9iYXNlLDgpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2x2bF9zaHV0ZG93bihzdHJ1Y3Qgc2x2bF9ib2FyZCAqYikKK3sKKwlpbnQgdTsKKworCXo4NTMwX3NodXRkb3duKCZiLT5ib2FyZCk7CisJCisJZm9yKHU9MDsgdTwyOyB1KyspCisJeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZCA9IGItPmRldlt1XS0+cHBwZGV2LmRldjsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZCk7CisJCWZyZWVfbmV0ZGV2KGQpOworCX0KKwkKKwlmcmVlX2lycShiLT5ib2FyZC5pcnEsICZiLT5ib2FyZCk7CisJZnJlZV9kbWEoYi0+Ym9hcmQuY2hhbkEucnhkbWEpOworCWZyZWVfZG1hKGItPmJvYXJkLmNoYW5BLnR4ZG1hKTsKKwkvKiBETUEgb2ZmIG9uIHRoZSBjYXJkLCBkcm9wIERUUiAqLworCW91dGIoMCwgYi0+aW9iYXNlKTsKKwlyZWxlYXNlX3JlZ2lvbihiLT5pb2Jhc2UsIDgpOworCWtmcmVlKGIpOworfQorCisKK3N0YXRpYyBpbnQgaW89MHgyMzg7CitzdGF0aWMgaW50IHR4ZG1hPTE7CitzdGF0aWMgaW50IHJ4ZG1hPTM7CitzdGF0aWMgaW50IGlycT01Oworc3RhdGljIGludCBzbG93PTA7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJUaGUgSS9PIGJhc2Ugb2YgdGhlIFNlYWxldmVsIGNhcmQiKTsKK21vZHVsZV9wYXJhbSh0eGRtYSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModHhkbWEsICJUcmFuc21pdCBETUEgY2hhbm5lbCIpOworbW9kdWxlX3BhcmFtKHJ4ZG1hLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhyeGRtYSwgIlJlY2VpdmUgRE1BIGNoYW5uZWwiKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIlRoZSBpbnRlcnJ1cHQgbGluZSBzZXR0aW5nIGZvciB0aGUgU2VhTGV2ZWwgY2FyZCIpOworbW9kdWxlX3BhcmFtKHNsb3csIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhzbG93LCAiU2V0IHRoaXMgZm9yIGFuIG9sZGVyIFNlYWxldmVsIGNhcmQgc3VjaCBhcyB0aGUgNDAxMiIpOworCitNT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNb2R1bGFyIGRyaXZlciBmb3IgdGhlIFNlYUxldmVsIDQwMjEiKTsKKworc3RhdGljIHN0cnVjdCBzbHZsX2JvYXJkICpzbHZsX3VuaXQ7CisKK3N0YXRpYyBpbnQgX19pbml0IHNsdmxfaW5pdF9tb2R1bGUodm9pZCkKK3sKKyNpZmRlZiBNT0RVTEUKKwlwcmludGsoS0VSTl9JTkZPICJTZWFMZXZlbCBaODUyMzAgU3luY2hyb25vdXMgRHJpdmVyIHYgMC4wMi5cbiIpOworCXByaW50ayhLRVJOX0lORk8gIihjKSBDb3B5cmlnaHQgMTk5OCwgQnVpbGRpbmcgTnVtYmVyIFRocmVlIEx0ZC5cbiIpOworI2VuZGlmCisJc2x2bF91bml0ID0gc2x2bF9pbml0KGlvLCBpcnEsIHR4ZG1hLCByeGRtYSwgc2xvdyk7CisKKwlyZXR1cm4gc2x2bF91bml0ID8gMCA6IC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbHZsX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaWYoc2x2bF91bml0KQorCQlzbHZsX3NodXRkb3duKHNsdmxfdW5pdCk7Cit9CisKK21vZHVsZV9pbml0KHNsdmxfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoc2x2bF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc3luY3BwcC5jIGIvZHJpdmVycy9uZXQvd2FuL3N5bmNwcHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGI2NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3N5bmNwcHAuYwpAQCAtMCwwICsxLDE0ODggQEAKKy8qCisgKglORVQzOglBIChmYWlybHkgbWluaW1hbCkgaW1wbGVtZW50YXRpb24gb2Ygc3luY2hyb25vdXMgUFBQIGZvciBMaW51eAorICoJCWFzIHdlbGwgYXMgYSBDSVNDTyBIRExDIGltcGxlbWVudGF0aW9uLiBTZWUgdGhlIGNvcHlyaWdodCAKKyAqCQltZXNzYWdlIGJlbG93IGZvciB0aGUgb3JpZ2luYWwgc291cmNlLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIGxpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTm90ZSBob3dldmVyLiBUaGlzIGNvZGUgaXMgYWxzbyB1c2VkIGluIGEgZGlmZmVyZW50IGZvcm0gYnkgRnJlZUJTRC4KKyAqCVRoZXJlZm9yZSB3aGVuIG1ha2luZyBhbnkgbm9uIE9TIHNwZWNpZmljIGNoYW5nZSBwbGVhc2UgY29uc2lkZXIKKyAqCWNvbnRyaWJ1dGluZyBpdCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBhdXRob3IgdW5kZXIgdGhlIHRlcm1zCisgKgliZWxvdyBpbiBhZGRpdGlvbi4KKyAqCQktLSBBbGFuCisgKgorICoJUG9ydCBmb3IgTGludXgtMi4xIGJ5IEphbiAiWWVueWEiIEthc3ByemFrIDxrYXNAZmkubXVuaS5jej4KKyAqLworCisvKgorICogU3luY2hyb25vdXMgUFBQL0Npc2NvIGxpbmsgbGV2ZWwgc3Vicm91dGluZXMuCisgKiBLZWVwYWxpdmUgcHJvdG9jb2wgaW1wbGVtZW50ZWQgaW4gYm90aCBDaXNjbyBhbmQgUFBQIG1vZGVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NCBDcm9ueXggTHRkLgorICogQXV0aG9yOiBTZXJnZSBWYWt1bGVua28sIDx2YWtAemVidWIubXNrLnN1PgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aCBOTyBXQVJSQU5USUVTLCBub3QgZXZlbiB0aGUgaW1wbGllZAorICogd2FycmFudGllcyBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEF1dGhvcnMgZ3JhbnQgYW55IG90aGVyIHBlcnNvbnMgb3Igb3JnYW5pc2F0aW9ucyBwZXJtaXNzaW9uIHRvIHVzZQorICogb3IgbW9kaWZ5IHRoaXMgc29mdHdhcmUgYXMgbG9uZyBhcyB0aGlzIG1lc3NhZ2UgaXMga2VwdCB3aXRoIHRoZSBzb2Z0d2FyZSwKKyAqIGFsbCBkZXJpdmF0aXZlIHdvcmtzIG9yIG1vZGlmaWVkIHZlcnNpb25zLgorICoKKyAqIFZlcnNpb24gMS45LCBXZWQgT2N0ICA0IDE4OjU4OjE1IE1TSyAxOTk1CisgKgorICogJElkOiBzeW5jcHBwLmMsdiAxLjE4IDIwMDAvMDQvMTEgMDU6MjU6MzEgYXNqIEV4cCAkCisgKi8KKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorCisjaW5jbHVkZSA8bmV0L3N5bmNwcHAuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIE1BWEFMSVZFQ05UICAgICA2ICAgICAgICAgICAgICAgLyogbWF4LiBhbGl2ZSBwYWNrZXRzICovCisKKyNkZWZpbmUgUFBQX0FMTFNUQVRJT05TIDB4ZmYgICAgICAgICAgICAvKiBBbGwtU3RhdGlvbnMgYnJvYWRjYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgUFBQX1VJICAgICAgICAgIDB4MDMgICAgICAgICAgICAvKiBVbm51bWJlcmVkIEluZm9ybWF0aW9uICovCisjZGVmaW5lIFBQUF9JUCAgICAgICAgICAweDAwMjEgICAgICAgICAgLyogSW50ZXJuZXQgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0lTTyAgICAgICAgIDB4MDAyMyAgICAgICAgICAvKiBJU08gT1NJIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9YTlMgICAgICAgICAweDAwMjUgICAgICAgICAgLyogWGVyb3ggTlMgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0lQWCAgICAgICAgIDB4MDAyYiAgICAgICAgICAvKiBOb3ZlbGwgSVBYIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9MQ1AgICAgICAgICAweGMwMjEgICAgICAgICAgLyogTGluayBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9JUENQICAgICAgICAweDgwMjEgICAgICAgICAgLyogSW50ZXJuZXQgUHJvdG9jb2wgQ29udHJvbCBQcm90b2NvbCAqLworCisjZGVmaW5lIExDUF9DT05GX1JFUSAgICAxICAgICAgICAgICAgICAgLyogUFBQIExDUCBjb25maWd1cmUgcmVxdWVzdCAqLworI2RlZmluZSBMQ1BfQ09ORl9BQ0sgICAgMiAgICAgICAgICAgICAgIC8qIFBQUCBMQ1AgY29uZmlndXJlIGFja25vd2xlZGdlICovCisjZGVmaW5lIExDUF9DT05GX05BSyAgICAzICAgICAgICAgICAgICAgLyogUFBQIExDUCBjb25maWd1cmUgbmVnYXRpdmUgYWNrICovCisjZGVmaW5lIExDUF9DT05GX1JFSiAgICA0ICAgICAgICAgICAgICAgLyogUFBQIExDUCBjb25maWd1cmUgcmVqZWN0ICovCisjZGVmaW5lIExDUF9URVJNX1JFUSAgICA1ICAgICAgICAgICAgICAgLyogUFBQIExDUCB0ZXJtaW5hdGUgcmVxdWVzdCAqLworI2RlZmluZSBMQ1BfVEVSTV9BQ0sgICAgNiAgICAgICAgICAgICAgIC8qIFBQUCBMQ1AgdGVybWluYXRlIGFja25vd2xlZGdlICovCisjZGVmaW5lIExDUF9DT0RFX1JFSiAgICA3ICAgICAgICAgICAgICAgLyogUFBQIExDUCBjb2RlIHJlamVjdCAqLworI2RlZmluZSBMQ1BfUFJPVE9fUkVKICAgOCAgICAgICAgICAgICAgIC8qIFBQUCBMQ1AgcHJvdG9jb2wgcmVqZWN0ICovCisjZGVmaW5lIExDUF9FQ0hPX1JFUSAgICA5ICAgICAgICAgICAgICAgLyogUFBQIExDUCBlY2hvIHJlcXVlc3QgKi8KKyNkZWZpbmUgTENQX0VDSE9fUkVQTFkgIDEwICAgICAgICAgICAgICAvKiBQUFAgTENQIGVjaG8gcmVwbHkgKi8KKyNkZWZpbmUgTENQX0RJU0NfUkVRICAgIDExICAgICAgICAgICAgICAvKiBQUFAgTENQIGRpc2NhcmQgcmVxdWVzdCAqLworCisjZGVmaW5lIExDUF9PUFRfTVJVICAgICAgICAgICAgIDEgICAgICAgLyogbWF4aW11bSByZWNlaXZlIHVuaXQgKi8KKyNkZWZpbmUgTENQX09QVF9BU1lOQ19NQVAgICAgICAgMiAgICAgICAvKiBhc3luYyBjb250cm9sIGNoYXJhY3RlciBtYXAgKi8KKyNkZWZpbmUgTENQX09QVF9BVVRIX1BST1RPICAgICAgMyAgICAgICAvKiBhdXRoZW50aWNhdGlvbiBwcm90b2NvbCAqLworI2RlZmluZSBMQ1BfT1BUX1FVQUxfUFJPVE8gICAgICA0ICAgICAgIC8qIHF1YWxpdHkgcHJvdG9jb2wgKi8KKyNkZWZpbmUgTENQX09QVF9NQUdJQyAgICAgICAgICAgNSAgICAgICAvKiBtYWdpYyBudW1iZXIgKi8KKyNkZWZpbmUgTENQX09QVF9SRVNFUlZFRCAgICAgICAgNiAgICAgICAvKiByZXNlcnZlZCAqLworI2RlZmluZSBMQ1BfT1BUX1BST1RPX0NPTVAgICAgICA3ICAgICAgIC8qIHByb3RvY29sIGZpZWxkIGNvbXByZXNzaW9uICovCisjZGVmaW5lIExDUF9PUFRfQUREUl9DT01QICAgICAgIDggICAgICAgLyogYWRkcmVzcy9jb250cm9sIGZpZWxkIGNvbXByZXNzaW9uICovCisKKyNkZWZpbmUgSVBDUF9DT05GX1JFUSAgIExDUF9DT05GX1JFUSAgICAvKiBQUFAgSVBDUCBjb25maWd1cmUgcmVxdWVzdCAqLworI2RlZmluZSBJUENQX0NPTkZfQUNLICAgTENQX0NPTkZfQUNLICAgIC8qIFBQUCBJUENQIGNvbmZpZ3VyZSBhY2tub3dsZWRnZSAqLworI2RlZmluZSBJUENQX0NPTkZfTkFLICAgTENQX0NPTkZfTkFLICAgIC8qIFBQUCBJUENQIGNvbmZpZ3VyZSBuZWdhdGl2ZSBhY2sgKi8KKyNkZWZpbmUgSVBDUF9DT05GX1JFSiAgIExDUF9DT05GX1JFSiAgICAvKiBQUFAgSVBDUCBjb25maWd1cmUgcmVqZWN0ICovCisjZGVmaW5lIElQQ1BfVEVSTV9SRVEgICBMQ1BfVEVSTV9SRVEgICAgLyogUFBQIElQQ1AgdGVybWluYXRlIHJlcXVlc3QgKi8KKyNkZWZpbmUgSVBDUF9URVJNX0FDSyAgIExDUF9URVJNX0FDSyAgICAvKiBQUFAgSVBDUCB0ZXJtaW5hdGUgYWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUgSVBDUF9DT0RFX1JFSiAgIExDUF9DT0RFX1JFSiAgICAvKiBQUFAgSVBDUCBjb2RlIHJlamVjdCAqLworCisjZGVmaW5lIENJU0NPX01VTFRJQ0FTVCAgICAgICAgIDB4OGYgICAgLyogQ2lzY28gbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0lTQ09fVU5JQ0FTVCAgICAgICAgICAgMHgwZiAgICAvKiBDaXNjbyB1bmljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0lTQ09fS0VFUEFMSVZFICAgICAgICAgMHg4MDM1ICAvKiBDaXNjbyBrZWVwYWxpdmUgcHJvdG9jb2wgKi8KKyNkZWZpbmUgQ0lTQ09fQUREUl9SRVEgICAgICAgICAgMCAgICAgICAvKiBDaXNjbyBhZGRyZXNzIHJlcXVlc3QgKi8KKyNkZWZpbmUgQ0lTQ09fQUREUl9SRVBMWSAgICAgICAgMSAgICAgICAvKiBDaXNjbyBhZGRyZXNzIHJlcGx5ICovCisjZGVmaW5lIENJU0NPX0tFRVBBTElWRV9SRVEgICAgIDIgICAgICAgLyogQ2lzY28ga2VlcGFsaXZlIHJlcXVlc3QgKi8KKworc3RydWN0IHBwcF9oZWFkZXIgeworCXU4IGFkZHJlc3M7CisJdTggY29udHJvbDsKKwl1MTYgcHJvdG9jb2w7Cit9OworI2RlZmluZSBQUFBfSEVBREVSX0xFTiAgICAgICAgICBzaXplb2YgKHN0cnVjdCBwcHBfaGVhZGVyKQorCitzdHJ1Y3QgbGNwX2hlYWRlciB7CisJdTggdHlwZTsKKwl1OCBpZGVudDsKKwl1MTYgbGVuOworfTsKKyNkZWZpbmUgTENQX0hFQURFUl9MRU4gICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgbGNwX2hlYWRlcikKKworc3RydWN0IGNpc2NvX3BhY2tldCB7CisJdTMyIHR5cGU7CisJdTMyIHBhcjE7CisJdTMyIHBhcjI7CisJdTE2IHJlbDsKKwl1MTYgdGltZTA7CisJdTE2IHRpbWUxOworfTsKKyNkZWZpbmUgQ0lTQ09fUEFDS0VUX0xFTiAxOAorI2RlZmluZSBDSVNDT19CSUdfUEFDS0VUX0xFTiAyMAorCitzdGF0aWMgc3RydWN0IHNwcHAgKnNwcHBxOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHNwcHBfa2VlcGFsaXZlX3RpbWVyOworc3RhdGljIERFRklORV9TUElOTE9DSyhzcHBwcV9sb2NrKTsKKworLyogZ2xvYmFsIHhtaXQgcXVldWUgZm9yIHNlbmRpbmcgcGFja2V0cyB3aGlsZSBzcGlubG9jayBpcyBoZWxkICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmZfaGVhZCB0eF9xdWV1ZTsKKworc3RhdGljIHZvaWQgc3BwcF9rZWVwYWxpdmUgKHVuc2lnbmVkIGxvbmcgZHVtbXkpOworc3RhdGljIHZvaWQgc3BwcF9jcF9zZW5kIChzdHJ1Y3Qgc3BwcCAqc3AsIHUxNiBwcm90bywgdTggdHlwZSwKKwl1OCBpZGVudCwgdTE2IGxlbiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBzcHBwX2Npc2NvX3NlbmQgKHN0cnVjdCBzcHBwICpzcCwgaW50IHR5cGUsIGxvbmcgcGFyMSwgbG9uZyBwYXIyKTsKK3N0YXRpYyB2b2lkIHNwcHBfbGNwX2lucHV0IChzdHJ1Y3Qgc3BwcCAqc3AsIHN0cnVjdCBza19idWZmICptKTsKK3N0YXRpYyB2b2lkIHNwcHBfY2lzY29faW5wdXQgKHN0cnVjdCBzcHBwICpzcCwgc3RydWN0IHNrX2J1ZmYgKm0pOworc3RhdGljIHZvaWQgc3BwcF9pcGNwX2lucHV0IChzdHJ1Y3Qgc3BwcCAqc3AsIHN0cnVjdCBza19idWZmICptKTsKK3N0YXRpYyB2b2lkIHNwcHBfbGNwX29wZW4gKHN0cnVjdCBzcHBwICpzcCk7CitzdGF0aWMgdm9pZCBzcHBwX2lwY3Bfb3BlbiAoc3RydWN0IHNwcHAgKnNwKTsKK3N0YXRpYyBpbnQgc3BwcF9sY3BfY29uZl9wYXJzZV9vcHRpb25zIChzdHJ1Y3Qgc3BwcCAqc3AsIHN0cnVjdCBsY3BfaGVhZGVyICpoLAorCWludCBsZW4sIHUzMiAqbWFnaWMpOworc3RhdGljIHZvaWQgc3BwcF9jcF90aW1lb3V0ICh1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgY2hhciAqc3BwcF9sY3BfdHlwZV9uYW1lICh1OCB0eXBlKTsKK3N0YXRpYyBjaGFyICpzcHBwX2lwY3BfdHlwZV9uYW1lICh1OCB0eXBlKTsKK3N0YXRpYyB2b2lkIHNwcHBfcHJpbnRfYnl0ZXMgKHU4ICpwLCB1MTYgbGVuKTsKKworc3RhdGljIGludCBkZWJ1ZzsKKworLyogRmx1c2ggZ2xvYmFsIG91dGdvaW5nIHBhY2tldCBxdWV1ZSB0byBkZXZfcXVldWVfeG1pdCgpLgorICoKKyAqIGRldl9xdWV1ZV94bWl0KCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQKKyAqIHdoaWNoIG1lYW5zIGl0IGNhbid0IGJlIGNhbGxlZCB3aXRoIHNwaW5sb2NrcyBoZWxkLgorICogSWYgYSBwYWNrZXQgbmVlZHMgdG8gYmUgc2VudCB3aGlsZSBhIHNwaW5sb2NrIGlzIGhlbGQsCisgKiB0aGVuIHB1dCB0aGUgcGFja2V0IGludG8gdHhfcXVldWUsIGFuZCBjYWxsIHNwcHBfZmx1c2hfeG1pdCgpCisgKiBhZnRlciBzcGlubG9jayBpcyByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQgc3BwcF9mbHVzaF94bWl0KHZvaWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZ0eF9xdWV1ZSkpICE9IE5VTEwpCisJCWRldl9xdWV1ZV94bWl0KHNrYik7Cit9CisKKy8qCisgKglJbnRlcmZhY2UgZG93biBzdHViCisgKi8JCisKK3N0YXRpYyB2b2lkIGlmX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BwcCAqc3AgPSAoc3RydWN0IHNwcHAgKilzcHBwX29mKGRldik7CisKKwlzcC0+cHBfbGlua19zdGF0ZT1TUFBQX0xJTktfRE9XTjsKK30KKworLyoKKyAqIFRpbWVvdXQgcm91dGluZSBhY3RpdmF0aW9ucy4KKyAqLworCitzdGF0aWMgdm9pZCBzcHBwX3NldF90aW1lb3V0KHN0cnVjdCBzcHBwICpwLGludCBzKSAKK3sKKwlpZiAoISAocC0+cHBfZmxhZ3MgJiBQUF9USU1PKSkgCisJeworCQlpbml0X3RpbWVyKCZwLT5wcF90aW1lcik7CisJCXAtPnBwX3RpbWVyLmZ1bmN0aW9uPXNwcHBfY3BfdGltZW91dDsKKwkJcC0+cHBfdGltZXIuZXhwaXJlcz1qaWZmaWVzK3MqSFo7CisJCXAtPnBwX3RpbWVyLmRhdGE9KHVuc2lnbmVkIGxvbmcpcDsKKwkJcC0+cHBfZmxhZ3MgfD0gUFBfVElNTzsKKwkJYWRkX3RpbWVyKCZwLT5wcF90aW1lcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzcHBwX2NsZWFyX3RpbWVvdXQoc3RydWN0IHNwcHAgKnApCit7CisJaWYgKHAtPnBwX2ZsYWdzICYgUFBfVElNTykgCisJeworCQlkZWxfdGltZXIoJnAtPnBwX3RpbWVyKTsKKwkJcC0+cHBfZmxhZ3MgJj0gflBQX1RJTU87IAorCX0KK30KKworLyoqCisgKglzcHBwX2lucHV0IC0JcmVjZWl2ZSBhbmQgcHJvY2VzcyBhIFdBTiBQUFAgZnJhbWUKKyAqCUBza2I6CVRoZSBidWZmZXIgdG8gcHJvY2VzcworICoJQGRldjoJVGhlIGRldmljZSBpdCBhcnJpdmVkIG9uCisgKgorICoJVGhpcyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNhcmRzIHRoYXQgZG8gbm90IGhhdmUKKyAqCXRpbWluZyBjb25zdHJhaW50cyBidXQgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlIG5ldHdvcmsgbGF5ZXIKKyAqCWFmdGVyIGludGVycnVwdCBzZXJ2aWNpbmcgdG8gcHJvY2VzcyBmcmFtZXMgcXVldWVkIHZpYSBuZXRpZl9yeCgpLgorICoKKyAqCVdlIHByb2Nlc3MgdGhlIG9wdGlvbnMgaW4gdGhlIGNhcmQuIElmIHRoZSBmcmFtZSBpcyBkZXN0aW5lZCBmb3IKKyAqCXRoZSBwcm90b2NvbCBzdGFja3MgdGhlbiBpdCByZXF1ZXVlcyB0aGUgZnJhbWUgZm9yIHRoZSB1cHBlciBsZXZlbAorICoJcHJvdG9jb2wuIElmIGl0IGlzIGEgY29udHJvbCBmcm9tIGl0IGlzIHByb2Nlc3NlZCBhbmQgZGlzY2FyZGVkCisgKgloZXJlLgorICovCisgCit2b2lkIHNwcHBfaW5wdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHBwcF9oZWFkZXIgKmg7CisJc3RydWN0IHNwcHAgKnNwID0gKHN0cnVjdCBzcHBwICopc3BwcF9vZihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlza2ItPmRldj1kZXY7CisJc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1JVTk5JTkcpCisJeworCQkvKiBDb3VudCByZWNlaXZlZCBieXRlcywgYWRkIEZDUyBhbmQgb25lIGZsYWcgKi8KKwkJc3AtPmlieXRlcys9IHNrYi0+bGVuICsgMzsKKwkJc3AtPmlwa3RzKys7CisJfQorCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgUFBQX0hFQURFUl9MRU4pKSB7CisJCS8qIFRvbyBzbWFsbCBwYWNrZXQsIGRyb3AgaXQuICovCisJCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykKKwkJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IGlucHV0IHBhY2tldCBpcyB0b28gc21hbGwsICVkIGJ5dGVzXG4iLAorCQkJCWRldi0+bmFtZSwgc2tiLT5sZW4pOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEdldCBQUFAgaGVhZGVyLiAqLworCWggPSAoc3RydWN0IHBwcF9oZWFkZXIgKilza2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLHNpemVvZihzdHJ1Y3QgcHBwX2hlYWRlcikpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwLT5sb2NrLCBmbGFncyk7CisJCisJc3dpdGNoIChoLT5hZGRyZXNzKSB7CisJZGVmYXVsdDogICAgICAgIC8qIEludmFsaWQgUFBQIHBhY2tldC4gKi8KKwkJZ290byBpbnZhbGlkOworCWNhc2UgUFBQX0FMTFNUQVRJT05TOgorCQlpZiAoaC0+Y29udHJvbCAhPSBQUFBfVUkpCisJCQlnb3RvIGludmFsaWQ7CisJCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9DSVNDTykgeworCQkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogUFBQIHBhY2tldCBpbiBDaXNjbyBtb2RlIDwweCV4IDB4JXggMHgleD5cbiIsCisJCQkJCWRldi0+bmFtZSwKKwkJCQkJaC0+YWRkcmVzcywgaC0+Y29udHJvbCwgbnRvaHMgKGgtPnByb3RvY29sKSk7CisJCQlnb3RvIGRyb3A7CisJCX0KKwkJc3dpdGNoIChudG9ocyAoaC0+cHJvdG9jb2wpKSB7CisJCWRlZmF1bHQ6CisJCQlpZiAoc3AtPmxjcC5zdGF0ZSA9PSBMQ1BfU1RBVEVfT1BFTkVEKQorCQkJCXNwcHBfY3Bfc2VuZCAoc3AsIFBQUF9MQ1AsIExDUF9QUk9UT19SRUosCisJCQkJCSsrc3AtPnBwX3NlcSwgc2tiLT5sZW4gKyAyLAorCQkJCQkmaC0+cHJvdG9jb2wpOworCQkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCBpbnB1dCBwcm90b2NvbCA8MHgleCAweCV4IDB4JXg+XG4iLAorCQkJCQlkZXYtPm5hbWUsCisJCQkJCWgtPmFkZHJlc3MsIGgtPmNvbnRyb2wsIG50b2hzIChoLT5wcm90b2NvbCkpOworCQkJZ290byBkcm9wOworCQljYXNlIFBQUF9MQ1A6CisJCQlzcHBwX2xjcF9pbnB1dCAoc3AsIHNrYik7CisJCQlnb3RvIGRyb3A7CisJCWNhc2UgUFBQX0lQQ1A6CisJCQlpZiAoc3AtPmxjcC5zdGF0ZSA9PSBMQ1BfU1RBVEVfT1BFTkVEKQorCQkJCXNwcHBfaXBjcF9pbnB1dCAoc3AsIHNrYik7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIklQQ1Agd2hlbiBzdGlsbCB3YWl0aW5nIExDUCBmaW5pc2guXG4iKTsKKwkJCWdvdG8gZHJvcDsKKwkJY2FzZSBQUFBfSVA6CisJCQlpZiAoc3AtPmlwY3Auc3RhdGUgPT0gSVBDUF9TVEFURV9PUEVORUQpIHsKKwkJCQlpZihzcC0+cHBfZmxhZ3MmUFBfREVCVUcpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICJZb3cgYW4gSVAgZnJhbWUuXG4iKTsKKwkJCQlza2ItPnByb3RvY29sPWh0b25zKEVUSF9QX0lQKTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgSVBYCisJCWNhc2UgUFBQX0lQWDoKKwkJCS8qIElQWCBJUFhDUCBub3QgaW1wbGVtZW50ZWQgeWV0ICovCisJCQlpZiAoc3AtPmxjcC5zdGF0ZSA9PSBMQ1BfU1RBVEVfT1BFTkVEKSB7CisJCQkJc2tiLT5wcm90b2NvbD1odG9ucyhFVEhfUF9JUFgpOworCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWJyZWFrOworCWNhc2UgQ0lTQ09fTVVMVElDQVNUOgorCWNhc2UgQ0lTQ09fVU5JQ0FTVDoKKwkJLyogRG9uJ3QgY2hlY2sgdGhlIGNvbnRyb2wgZmllbGQgaGVyZSAoUkZDIDE1NDcpLiAqLworCQlpZiAoISAoc3AtPnBwX2ZsYWdzICYgUFBfQ0lTQ08pKSB7CisJCQlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBDaXNjbyBwYWNrZXQgaW4gUFBQIG1vZGUgPDB4JXggMHgleCAweCV4PlxuIiwKKwkJCQkJZGV2LT5uYW1lLAorCQkJCQloLT5hZGRyZXNzLCBoLT5jb250cm9sLCBudG9ocyAoaC0+cHJvdG9jb2wpKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCQlzd2l0Y2ggKG50b2hzIChoLT5wcm90b2NvbCkpIHsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gaW52YWxpZDsKKwkJY2FzZSBDSVNDT19LRUVQQUxJVkU6CisJCQlzcHBwX2Npc2NvX2lucHV0IChzcCwgc2tiKTsKKwkJCWdvdG8gZHJvcDsKKyNpZmRlZiBDT05GSUdfSU5FVAorCQljYXNlIEVUSF9QX0lQOgorCQkJc2tiLT5wcm90b2NvbD1odG9ucyhFVEhfUF9JUCk7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWdvdG8gZG9uZTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JUFgKKwkJY2FzZSBFVEhfUF9JUFg6CisJCQlza2ItPnByb3RvY29sPWh0b25zKEVUSF9QX0lQWCk7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWdvdG8gZG9uZTsKKyNlbmRpZgorCQl9CisJCWJyZWFrOworCX0KKwlnb3RvIGRyb3A7CisKK2ludmFsaWQ6CisJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWQgaW5wdXQgcGFja2V0IDwweCV4IDB4JXggMHgleD5cbiIsCisJCQlkZXYtPm5hbWUsIGgtPmFkZHJlc3MsIGgtPmNvbnRyb2wsIG50b2hzIChoLT5wcm90b2NvbCkpOworZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwlzcHBwX2ZsdXNoX3htaXQoKTsKKwlyZXR1cm47Cit9CisKK0VYUE9SVF9TWU1CT0woc3BwcF9pbnB1dCk7CisKKy8qCisgKglIYW5kbGUgdHJhbnNtaXQgcGFja2V0cy4KKyAqLworIAorc3RhdGljIGludCBzcHBwX2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHR5cGUsCisJCXZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3BwcCAqc3AgPSAoc3RydWN0IHNwcHAgKilzcHBwX29mKGRldik7CisJc3RydWN0IHBwcF9oZWFkZXIgKmg7CisJc2tiX3B1c2goc2tiLHNpemVvZihzdHJ1Y3QgcHBwX2hlYWRlcikpOworCWg9KHN0cnVjdCBwcHBfaGVhZGVyICopc2tiLT5kYXRhOworCWlmKHNwLT5wcF9mbGFncyZQUF9DSVNDTykKKwl7CisJCWgtPmFkZHJlc3MgPSBDSVNDT19VTklDQVNUOworCQloLT5jb250cm9sID0gMDsKKwl9CisJZWxzZQorCXsKKwkJaC0+YWRkcmVzcyA9IFBQUF9BTExTVEFUSU9OUzsKKwkJaC0+Y29udHJvbCA9IFBQUF9VSTsKKwl9CisJaWYoc3AtPnBwX2ZsYWdzICYgUFBfQ0lTQ08pCisJeworCQloLT5wcm90b2NvbCA9IGh0b25zKHR5cGUpOworCX0KKwllbHNlIHN3aXRjaCh0eXBlKQorCXsKKwkJY2FzZSBFVEhfUF9JUDoKKwkJCWgtPnByb3RvY29sID0gaHRvbnMoUFBQX0lQKTsKKwkJCWJyZWFrOworCQljYXNlIEVUSF9QX0lQWDoKKwkJCWgtPnByb3RvY29sID0gaHRvbnMoUFBQX0lQWCk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcHBwX2hlYWRlcik7Cit9CisKK3N0YXRpYyBpbnQgc3BwcF9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAwOworfQorCisvKgorICogU2VuZCBrZWVwYWxpdmUgcGFja2V0cywgZXZlcnkgMTAgc2Vjb25kcy4KKyAqLworCitzdGF0aWMgdm9pZCBzcHBwX2tlZXBhbGl2ZSAodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlzdHJ1Y3Qgc3BwcCAqc3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcHBwcV9sb2NrLCBmbGFncyk7CisKKwlmb3IgKHNwPXNwcHBxOyBzcDsgc3A9c3AtPnBwX25leHQpIAorCXsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5wcF9pZjsKKworCQkvKiBLZWVwYWxpdmUgbW9kZSBkaXNhYmxlZCBvciBjaGFubmVsIGRvd24/ICovCisJCWlmICghIChzcC0+cHBfZmxhZ3MgJiBQUF9LRUVQQUxJVkUpIHx8CisJCSAgICAhIChkZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9jaygmc3AtPmxvY2spOworCisJCS8qIE5vIGtlZXBhbGl2ZSBpbiBQUFAgbW9kZSBpZiBMQ1Agbm90IG9wZW5lZCB5ZXQuICovCisJCWlmICghIChzcC0+cHBfZmxhZ3MgJiBQUF9DSVNDTykgJiYKKwkJICAgIHNwLT5sY3Auc3RhdGUgIT0gTENQX1NUQVRFX09QRU5FRCkgeworCQkJc3Bpbl91bmxvY2soJnNwLT5sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHNwLT5wcF9hbGl2ZWNudCA9PSBNQVhBTElWRUNOVCkgeworCQkJLyogTm8ga2VlcGFsaXZlIHBhY2tldHMgZ290LiAgU3RvcCB0aGUgaW50ZXJmYWNlLiAqLworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBwcm90b2NvbCBkb3duXG4iLCBkZXYtPm5hbWUpOworCQkJaWZfZG93biAoZGV2KTsKKwkJCWlmICghIChzcC0+cHBfZmxhZ3MgJiBQUF9DSVNDTykpIHsKKwkJCQkvKiBTaHV0IGRvd24gdGhlIFBQUCBsaW5rLiAqLworCQkJCXNwLT5sY3AubWFnaWMgPSBqaWZmaWVzOworCQkJCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfQ0xPU0VEOworCQkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9DTE9TRUQ7CisJCQkJc3BwcF9jbGVhcl90aW1lb3V0IChzcCk7CisJCQkJLyogSW5pdGlhdGUgbmVnb3RpYXRpb24uICovCisJCQkJc3BwcF9sY3Bfb3BlbiAoc3ApOworCQkJfQorCQl9CisJCWlmIChzcC0+cHBfYWxpdmVjbnQgPD0gTUFYQUxJVkVDTlQpCisJCQkrK3NwLT5wcF9hbGl2ZWNudDsKKwkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0NJU0NPKQorCQkJc3BwcF9jaXNjb19zZW5kIChzcCwgQ0lTQ09fS0VFUEFMSVZFX1JFUSwgKytzcC0+cHBfc2VxLAorCQkJCXNwLT5wcF9yc2VxKTsKKwkJZWxzZSBpZiAoc3AtPmxjcC5zdGF0ZSA9PSBMQ1BfU1RBVEVfT1BFTkVEKSB7CisJCQlsb25nIG5tYWdpYyA9IGh0b25sIChzcC0+bGNwLm1hZ2ljKTsKKwkJCXNwLT5sY3AuZWNob2lkID0gKytzcC0+cHBfc2VxOworCQkJc3BwcF9jcF9zZW5kIChzcCwgUFBQX0xDUCwgTENQX0VDSE9fUkVRLAorCQkJCXNwLT5sY3AuZWNob2lkLCA0LCAmbm1hZ2ljKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZzcC0+bG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwcHBxX2xvY2ssIGZsYWdzKTsKKwlzcHBwX2ZsdXNoX3htaXQoKTsKKwlzcHBwX2tlZXBhbGl2ZV90aW1lci5leHBpcmVzPWppZmZpZXMrMTAqSFo7CisJYWRkX3RpbWVyKCZzcHBwX2tlZXBhbGl2ZV90aW1lcik7Cit9CisKKy8qCisgKiBIYW5kbGUgaW5jb21pbmcgUFBQIExpbmsgQ29udHJvbCBQcm90b2NvbCBwYWNrZXRzLgorICovCisgCitzdGF0aWMgdm9pZCBzcHBwX2xjcF9pbnB1dCAoc3RydWN0IHNwcHAgKnNwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsY3BfaGVhZGVyICpoOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzcC0+cHBfaWY7CisJaW50IGxlbiA9IHNrYi0+bGVuOworCXU4ICpwLCBvcHRbNl07CisJdTMyIHJtYWdpYzsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgbGNwX2hlYWRlcikpKSB7CisJCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCBsY3AgcGFja2V0IGxlbmd0aDogJWQgYnl0ZXNcbiIsCisJCQkJZGV2LT5uYW1lLCBsZW4pOworCQlyZXR1cm47CisJfQorCWggPSAoc3RydWN0IGxjcF9oZWFkZXIgKilza2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLHNpemVvZihzdHJ1Y3QgbGNwX2hlYWRlciAqKSk7CisJCisJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKSAKKwl7CisJCWNoYXIgc3RhdGUgPSAnPyc7CisJCXN3aXRjaCAoc3AtPmxjcC5zdGF0ZSkgeworCQljYXNlIExDUF9TVEFURV9DTE9TRUQ6ICAgc3RhdGUgPSAnQyc7IGJyZWFrOworCQljYXNlIExDUF9TVEFURV9BQ0tfUkNWRDogc3RhdGUgPSAnUic7IGJyZWFrOworCQljYXNlIExDUF9TVEFURV9BQ0tfU0VOVDogc3RhdGUgPSAnUyc7IGJyZWFrOworCQljYXNlIExDUF9TVEFURV9PUEVORUQ6ICAgc3RhdGUgPSAnTyc7IGJyZWFrOworCQl9CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogbGNwIGlucHV0KCVjKTogJWQgYnl0ZXMgPCVzIGlkPSV4aCBsZW49JXhoIiwKKwkJCWRldi0+bmFtZSwgc3RhdGUsIGxlbiwKKwkJCXNwcHBfbGNwX3R5cGVfbmFtZSAoaC0+dHlwZSksIGgtPmlkZW50LCBudG9ocyAoaC0+bGVuKSk7CisJCWlmIChsZW4gPiA0KQorCQkJc3BwcF9wcmludF9ieXRlcyAoKHU4KikgKGgrMSksIGxlbi00KTsKKwkJcHJpbnRrICgiPlxuIik7CisJfQorCWlmIChsZW4gPiBudG9ocyAoaC0+bGVuKSkKKwkJbGVuID0gbnRvaHMgKGgtPmxlbik7CisJc3dpdGNoIChoLT50eXBlKSB7CisJZGVmYXVsdDoKKwkJLyogVW5rbm93biBwYWNrZXQgdHlwZSAtLSBzZW5kIENvZGUtUmVqZWN0IHBhY2tldC4gKi8KKwkJc3BwcF9jcF9zZW5kIChzcCwgUFBQX0xDUCwgTENQX0NPREVfUkVKLCArK3NwLT5wcF9zZXEsCisJCQlza2ItPmxlbiwgaCk7CisJCWJyZWFrOworCWNhc2UgTENQX0NPTkZfUkVROgorCQlpZiAobGVuIDwgNCkgeworCQkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQkJCXByaW50ayAoS0VSTl9ERUJVRyIlczogaW52YWxpZCBsY3AgY29uZmlndXJlIHJlcXVlc3QgcGFja2V0IGxlbmd0aDogJWQgYnl0ZXNcbiIsCisJCQkJCWRldi0+bmFtZSwgbGVuKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChsZW4+NCAmJiAhc3BwcF9sY3BfY29uZl9wYXJzZV9vcHRpb25zIChzcCwgaCwgbGVuLCAmcm1hZ2ljKSkKKwkJCWdvdG8gYmFkcmVxOworCQlpZiAocm1hZ2ljID09IHNwLT5sY3AubWFnaWMpIHsKKwkJCS8qIExvY2FsIGFuZCByZW1vdGUgbWFnaWNzIGVxdWFsIC0tIGxvb3BiYWNrPyAqLworCQkJaWYgKHNwLT5wcF9sb29wY250ID49IE1BWEFMSVZFQ05UKjUpIHsKKwkJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGxvb3BiYWNrXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCQkJCXNwLT5wcF9sb29wY250ID0gMDsKKwkJCQlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkgeworCQkJCQlpZl9kb3duIChkZXYpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogY29uZiByZXE6IG1hZ2ljIGdsaXRjaFxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCSsrc3AtPnBwX2xvb3BjbnQ7CisKKwkJCS8qIE1VU1Qgc2VuZCBDb25mLU5hY2sgcGFja2V0LiAqLworCQkJcm1hZ2ljID0gfnNwLT5sY3AubWFnaWM7CisJCQlvcHRbMF0gPSBMQ1BfT1BUX01BR0lDOworCQkJb3B0WzFdID0gc2l6ZW9mIChvcHQpOworCQkJb3B0WzJdID0gcm1hZ2ljID4+IDI0OworCQkJb3B0WzNdID0gcm1hZ2ljID4+IDE2OworCQkJb3B0WzRdID0gcm1hZ2ljID4+IDg7CisJCQlvcHRbNV0gPSBybWFnaWM7CisJCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfTENQLCBMQ1BfQ09ORl9OQUssCisJCQkJaC0+aWRlbnQsIHNpemVvZiAob3B0KSwgJm9wdCk7CitiYWRyZXE6CisJCQlzd2l0Y2ggKHNwLT5sY3Auc3RhdGUpIHsKKwkJCWNhc2UgTENQX1NUQVRFX09QRU5FRDoKKwkJCQkvKiBJbml0aWF0ZSByZW5lZ290aWF0aW9uLiAqLworCQkJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwkJCQkvKiBmYWxsIHRocm91Z2guLi4gKi8KKwkJCWNhc2UgTENQX1NUQVRFX0FDS19TRU5UOgorCQkJCS8qIEdvIHRvIGNsb3NlZCBzdGF0ZS4gKi8KKwkJCQlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0NMT1NFRDsKKwkJCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJLyogU2VuZCBDb25maWd1cmUtQWNrIHBhY2tldC4gKi8KKwkJc3AtPnBwX2xvb3BjbnQgPSAwOworCQlpZiAoc3AtPmxjcC5zdGF0ZSAhPSBMQ1BfU1RBVEVfT1BFTkVEKSB7CisJCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfTENQLCBMQ1BfQ09ORl9BQ0ssCisJCQkJCWgtPmlkZW50LCBsZW4tNCwgaCsxKTsKKwkJfQorCQkvKiBDaGFuZ2UgdGhlIHN0YXRlLiAqLworCQlzd2l0Y2ggKHNwLT5sY3Auc3RhdGUpIHsKKwkJY2FzZSBMQ1BfU1RBVEVfQ0xPU0VEOgorCQkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9BQ0tfU0VOVDsKKwkJCWJyZWFrOworCQljYXNlIExDUF9TVEFURV9BQ0tfUkNWRDoKKwkJCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfT1BFTkVEOworCQkJc3BwcF9pcGNwX29wZW4gKHNwKTsKKwkJCWJyZWFrOworCQljYXNlIExDUF9TVEFURV9PUEVORUQ6CisJCQkvKiBSZW1vdGUgbWFnaWMgY2hhbmdlZCAtLSBjbG9zZSBzZXNzaW9uLiAqLworCQkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9DTE9TRUQ7CisJCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCQkJLyogSW5pdGlhdGUgcmVuZWdvdGlhdGlvbi4gKi8KKwkJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwkJCS8qIFNlbmQgQUNLIGFmdGVyIG91ciBSRVEgaW4gYXR0ZW1wdCB0byBicmVhayBsb29wICovCisJCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfTENQLCBMQ1BfQ09ORl9BQ0ssCisJCQkJCWgtPmlkZW50LCBsZW4tNCwgaCsxKTsKKwkJCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfQUNLX1NFTlQ7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIExDUF9DT05GX0FDSzoKKwkJaWYgKGgtPmlkZW50ICE9IHNwLT5sY3AuY29uZmlkKQorCQkJYnJlYWs7CisJCXNwcHBfY2xlYXJfdGltZW91dCAoc3ApOworCQlpZiAoKHNwLT5wcF9saW5rX3N0YXRlICE9IFNQUFBfTElOS19VUCkgJiYKKwkJICAgIChkZXYtPmZsYWdzICYgSUZGX1VQKSkgeworCQkJLyogQ29taW5nIG91dCBvZiBsb29wYmFjayBtb2RlLiAqLworCQkJc3AtPnBwX2xpbmtfc3RhdGU9U1BQUF9MSU5LX1VQOworCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBwcm90b2NvbCB1cFxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCQlzd2l0Y2ggKHNwLT5sY3Auc3RhdGUpIHsKKwkJY2FzZSBMQ1BfU1RBVEVfQ0xPU0VEOgorCQkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9BQ0tfUkNWRDsKKwkJCXNwcHBfc2V0X3RpbWVvdXQgKHNwLCA1KTsKKwkJCWJyZWFrOworCQljYXNlIExDUF9TVEFURV9BQ0tfU0VOVDoKKwkJCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfT1BFTkVEOworCQkJc3BwcF9pcGNwX29wZW4gKHNwKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgTENQX0NPTkZfTkFLOgorCQlpZiAoaC0+aWRlbnQgIT0gc3AtPmxjcC5jb25maWQpCisJCQlicmVhazsKKwkJcCA9ICh1OCopIChoKzEpOworCQlpZiAobGVuPj0xMCAmJiBwWzBdID09IExDUF9PUFRfTUFHSUMgJiYgcFsxXSA+PSA0KSB7CisJCQlybWFnaWMgPSAodTMyKXBbMl0gPDwgMjQgfAorCQkJCSh1MzIpcFszXSA8PCAxNiB8IHBbNF0gPDwgOCB8IHBbNV07CisJCQlpZiAocm1hZ2ljID09IH5zcC0+bGNwLm1hZ2ljKSB7CisJCQkJaW50IG5ld21hZ2ljOworCQkJCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykKKwkJCQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogY29uZiBuYWs6IG1hZ2ljIGdsaXRjaFxuIiwKKwkJCQkJCWRldi0+bmFtZSk7CisJCQkJZ2V0X3JhbmRvbV9ieXRlcygmbmV3bWFnaWMsIHNpemVvZihuZXdtYWdpYykpOworCQkJCXNwLT5sY3AubWFnaWMgKz0gbmV3bWFnaWM7CisJCQl9IGVsc2UKKwkJCQlzcC0+bGNwLm1hZ2ljID0gcm1hZ2ljOworCQkJfQorCQlpZiAoc3AtPmxjcC5zdGF0ZSAhPSBMQ1BfU1RBVEVfQUNLX1NFTlQpIHsKKwkJCS8qIEdvIHRvIGNsb3NlZCBzdGF0ZS4gKi8KKwkJCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfQ0xPU0VEOworCQkJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0NMT1NFRDsKKwkJfQorCQkvKiBUaGUgbGluayB3aWxsIGJlIHJlbmVnb3RpYXRlZCBhZnRlciB0aW1lb3V0LAorCQkgKiB0byBhdm9pZCBlbmRsZXNzIHJlcS1uYWNrIGxvb3AuICovCisJCXNwcHBfY2xlYXJfdGltZW91dCAoc3ApOworCQlzcHBwX3NldF90aW1lb3V0IChzcCwgMik7CisJCWJyZWFrOworCWNhc2UgTENQX0NPTkZfUkVKOgorCQlpZiAoaC0+aWRlbnQgIT0gc3AtPmxjcC5jb25maWQpCisJCQlicmVhazsKKwkJc3BwcF9jbGVhcl90aW1lb3V0IChzcCk7CisJCS8qIEluaXRpYXRlIHJlbmVnb3RpYXRpb24uICovCisJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwkJaWYgKHNwLT5sY3Auc3RhdGUgIT0gTENQX1NUQVRFX0FDS19TRU5UKSB7CisJCQkvKiBHbyB0byBjbG9zZWQgc3RhdGUuICovCisJCQlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0NMT1NFRDsKKwkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9DTE9TRUQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBMQ1BfVEVSTV9SRVE6CisJCXNwcHBfY2xlYXJfdGltZW91dCAoc3ApOworCQkvKiBTZW5kIFRlcm1pbmF0ZS1BY2sgcGFja2V0LiAqLworCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfTENQLCBMQ1BfVEVSTV9BQ0ssIGgtPmlkZW50LCAwLCBOVUxMKTsKKwkJLyogR28gdG8gY2xvc2VkIHN0YXRlLiAqLworCQlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0NMT1NFRDsKKwkJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0NMT1NFRDsKKwkJLyogSW5pdGlhdGUgcmVuZWdvdGlhdGlvbi4gKi8KKwkJc3BwcF9sY3Bfb3BlbiAoc3ApOworCQlicmVhazsKKwljYXNlIExDUF9URVJNX0FDSzoKKwljYXNlIExDUF9DT0RFX1JFSjoKKwljYXNlIExDUF9QUk9UT19SRUo6CisJCS8qIElnbm9yZSBmb3Igbm93LiAqLworCQlicmVhazsKKwljYXNlIExDUF9ESVNDX1JFUToKKwkJLyogRGlzY2FyZCB0aGUgcGFja2V0LiAqLworCQlicmVhazsKKwljYXNlIExDUF9FQ0hPX1JFUToKKwkJaWYgKHNwLT5sY3Auc3RhdGUgIT0gTENQX1NUQVRFX09QRU5FRCkKKwkJCWJyZWFrOworCQlpZiAobGVuIDwgOCkgeworCQkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCBsY3AgZWNobyByZXF1ZXN0IHBhY2tldCBsZW5ndGg6ICVkIGJ5dGVzXG4iLAorCQkJCQlkZXYtPm5hbWUsIGxlbik7CisJCQlicmVhazsKKwkJfQorCQlpZiAobnRvaGwgKCoobG9uZyopKGgrMSkpID09IHNwLT5sY3AubWFnaWMpIHsKKwkJCS8qIExpbmUgbG9vcGJhY2sgbW9kZSBkZXRlY3RlZC4gKi8KKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogbG9vcGJhY2tcbiIsIGRldi0+bmFtZSk7CisJCQlpZl9kb3duIChkZXYpOworCisJCQkvKiBTaHV0IGRvd24gdGhlIFBQUCBsaW5rLiAqLworCQkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9DTE9TRUQ7CisJCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCQkJc3BwcF9jbGVhcl90aW1lb3V0IChzcCk7CisJCQkvKiBJbml0aWF0ZSBuZWdvdGlhdGlvbi4gKi8KKwkJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwkJCWJyZWFrOworCQl9CisJCSoobG9uZyopKGgrMSkgPSBodG9ubCAoc3AtPmxjcC5tYWdpYyk7CisJCXNwcHBfY3Bfc2VuZCAoc3AsIFBQUF9MQ1AsIExDUF9FQ0hPX1JFUExZLCBoLT5pZGVudCwgbGVuLTQsIGgrMSk7CisJCWJyZWFrOworCWNhc2UgTENQX0VDSE9fUkVQTFk6CisJCWlmIChoLT5pZGVudCAhPSBzcC0+bGNwLmVjaG9pZCkKKwkJCWJyZWFrOworCQlpZiAobGVuIDwgOCkgeworCQkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCBsY3AgZWNobyByZXBseSBwYWNrZXQgbGVuZ3RoOiAlZCBieXRlc1xuIiwKKwkJCQkJZGV2LT5uYW1lLCBsZW4pOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG50b2hsICgqKGxvbmcqKShoKzEpKSAhPSBzcC0+bGNwLm1hZ2ljKQorCQlzcC0+cHBfYWxpdmVjbnQgPSAwOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBIYW5kbGUgaW5jb21pbmcgQ2lzY28ga2VlcGFsaXZlIHByb3RvY29sIHBhY2tldHMuCisgKi8KKworc3RhdGljIHZvaWQgc3BwcF9jaXNjb19pbnB1dCAoc3RydWN0IHNwcHAgKnNwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjaXNjb19wYWNrZXQgKmg7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5wcF9pZjsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgY2lzY29fcGFja2V0KSkKKwkgICAgfHwgKHNrYi0+bGVuICE9IENJU0NPX1BBQ0tFVF9MRU4KKwkJJiYgc2tiLT5sZW4gIT0gQ0lTQ09fQklHX1BBQ0tFVF9MRU4pKSB7CisJCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCBjaXNjbyBwYWNrZXQgbGVuZ3RoOiAlZCBieXRlc1xuIiwKKwkJCQlkZXYtPm5hbWUsICBza2ItPmxlbik7CisJCXJldHVybjsKKwl9CisJaCA9IChzdHJ1Y3QgY2lzY29fcGFja2V0ICopc2tiLT5kYXRhOworCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBjaXNjb19wYWNrZXQqKSk7CisJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGNpc2NvIGlucHV0OiAlZCBieXRlcyA8JXhoICV4aCAleGggJXhoICV4aC0leGg+XG4iLAorCQkJZGV2LT5uYW1lLCAgc2tiLT5sZW4sCisJCQludG9obCAoaC0+dHlwZSksIGgtPnBhcjEsIGgtPnBhcjIsIGgtPnJlbCwKKwkJCWgtPnRpbWUwLCBoLT50aW1lMSk7CisJc3dpdGNoIChudG9obCAoaC0+dHlwZSkpIHsKKwlkZWZhdWx0OgorCQlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHVua25vd24gY2lzY28gcGFja2V0IHR5cGU6IDB4JXhcbiIsCisJCQkJZGV2LT5uYW1lLCAgbnRvaGwgKGgtPnR5cGUpKTsKKwkJYnJlYWs7CisJY2FzZSBDSVNDT19BRERSX1JFUExZOgorCQkvKiBSZXBseSBvbiBhZGRyZXNzIHJlcXVlc3QsIGlnbm9yZSAqLworCQlicmVhazsKKwljYXNlIENJU0NPX0tFRVBBTElWRV9SRVE6CisJCXNwLT5wcF9hbGl2ZWNudCA9IDA7CisJCXNwLT5wcF9yc2VxID0gbnRvaGwgKGgtPnBhcjEpOworCQlpZiAoc3AtPnBwX3NlcSA9PSBzcC0+cHBfcnNlcSkgeworCQkJLyogTG9jYWwgYW5kIHJlbW90ZSBzZXF1ZW5jZSBudW1iZXJzIGFyZSBlcXVhbC4KKwkJCSAqIFByb2JhYmx5LCB0aGUgbGluZSBpcyBpbiBsb29wYmFjayBtb2RlLiAqLworCQkJaW50IG5ld3NlcTsKKwkJCWlmIChzcC0+cHBfbG9vcGNudCA+PSBNQVhBTElWRUNOVCkgeworCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogbG9vcGJhY2tcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQkJc3AtPnBwX2xvb3BjbnQgPSAwOworCQkJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCQkJCWlmX2Rvd24gKGRldik7CisJCQkJfQorCQkJfQorCQkJKytzcC0+cHBfbG9vcGNudDsKKworCQkJLyogR2VuZXJhdGUgbmV3IGxvY2FsIHNlcXVlbmNlIG51bWJlciAqLworCQkJZ2V0X3JhbmRvbV9ieXRlcygmbmV3c2VxLCBzaXplb2YobmV3c2VxKSk7CisJCQlzcC0+cHBfc2VxIF49IG5ld3NlcTsKKwkJCWJyZWFrOworCQl9CisJCXNwLT5wcF9sb29wY250ID0gMDsKKwkJaWYgKHNwLT5wcF9saW5rX3N0YXRlPT1TUFBQX0xJTktfRE9XTiAmJgorCQkgICAgKGRldi0+ZmxhZ3MgJiBJRkZfVVApKSB7CisJCQlzcC0+cHBfbGlua19zdGF0ZT1TUFBQX0xJTktfVVA7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IHByb3RvY29sIHVwXG4iLCBkZXYtPm5hbWUpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0lTQ09fQUREUl9SRVE6CisJCS8qIFN0b2xlbiBmcm9tIG5ldC9pcHY0L2RldmluZXQuYyAtLSBTSU9DR0lGQUREUiBpb2N0bCAqLworCQl7CisJCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwkJc3RydWN0IGluX2lmYWRkciAqaWZhOworCQl1MzIgYWRkciA9IDAsIG1hc2sgPSB+MDsgLyogRklYTUU6IGlzIHRoZSBtYXNrIGNvcnJlY3Q/ICovCisjaWZkZWYgQ09ORklHX0lORVQKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpZiAoKGluX2RldiA9IF9faW5fZGV2X2dldChkZXYpKSAhPSBOVUxMKQorCQl7CisJCQlmb3IgKGlmYT1pbl9kZXYtPmlmYV9saXN0OyBpZmEgIT0gTlVMTDsKKwkJCQlpZmE9aWZhLT5pZmFfbmV4dCkgeworCQkJCWlmIChzdHJjbXAoZGV2LT5uYW1lLCBpZmEtPmlmYV9sYWJlbCkgPT0gMCkgCisJCQkJeworCQkJCQlhZGRyID0gaWZhLT5pZmFfbG9jYWw7CisJCQkJCW1hc2sgPSBpZmEtPmlmYV9tYXNrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisjZW5kaWYJCQorCQkvKiBJIGhvcGUgYm90aCBhZGRyIGFuZCBtYXNrIGFyZSBpbiB0aGUgbmV0IG9yZGVyICovCisJCXNwcHBfY2lzY29fc2VuZCAoc3AsIENJU0NPX0FERFJfUkVQTFksIGFkZHIsIG1hc2spOworCQlicmVhazsKKwkJfQorCX0KK30KKworCisvKgorICogU2VuZCBQUFAgTENQIHBhY2tldC4KKyAqLworCitzdGF0aWMgdm9pZCBzcHBwX2NwX3NlbmQgKHN0cnVjdCBzcHBwICpzcCwgdTE2IHByb3RvLCB1OCB0eXBlLAorCXU4IGlkZW50LCB1MTYgbGVuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwcHBfaGVhZGVyICpoOworCXN0cnVjdCBsY3BfaGVhZGVyICpsaDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzcC0+cHBfaWY7CisKKwlza2I9YWxsb2Nfc2tiKGRldi0+aGFyZF9oZWFkZXJfbGVuK1BQUF9IRUFERVJfTEVOK0xDUF9IRUFERVJfTEVOK2xlbiwKKwkJR0ZQX0FUT01JQyk7CisJaWYgKHNrYj09TlVMTCkKKwkJcmV0dXJuOworCisJc2tiX3Jlc2VydmUoc2tiLGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwkKKwloID0gKHN0cnVjdCBwcHBfaGVhZGVyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgcHBwX2hlYWRlcikpOworCWgtPmFkZHJlc3MgPSBQUFBfQUxMU1RBVElPTlM7ICAgICAgICAvKiBicm9hZGNhc3QgYWRkcmVzcyAqLworCWgtPmNvbnRyb2wgPSBQUFBfVUk7ICAgICAgICAgICAgICAgICAvKiBVbm51bWJlcmVkIEluZm8gKi8KKwloLT5wcm90b2NvbCA9IGh0b25zIChwcm90byk7ICAgICAgICAgLyogTGluayBDb250cm9sIFByb3RvY29sICovCisKKwlsaCA9IChzdHJ1Y3QgbGNwX2hlYWRlciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGxjcF9oZWFkZXIpKTsKKwlsaC0+dHlwZSA9IHR5cGU7CisJbGgtPmlkZW50ID0gaWRlbnQ7CisJbGgtPmxlbiA9IGh0b25zIChMQ1BfSEVBREVSX0xFTiArIGxlbik7CisKKwlpZiAobGVuKQorCQltZW1jcHkoc2tiX3B1dChza2IsbGVuKSxkYXRhLCBsZW4pOworCisJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogJXMgb3V0cHV0IDwlcyBpZD0leGggbGVuPSV4aCIsCisJCQlkZXYtPm5hbWUsIAorCQkJcHJvdG89PVBQUF9MQ1AgPyAibGNwIiA6ICJpcGNwIiwKKwkJCXByb3RvPT1QUFBfTENQID8gc3BwcF9sY3BfdHlwZV9uYW1lIChsaC0+dHlwZSkgOgorCQkJc3BwcF9pcGNwX3R5cGVfbmFtZSAobGgtPnR5cGUpLCBsaC0+aWRlbnQsCisJCQludG9ocyAobGgtPmxlbikpOworCQlpZiAobGVuKQorCQkJc3BwcF9wcmludF9ieXRlcyAoKHU4KikgKGxoKzEpLCBsZW4pOworCQlwcmludGsgKCI+XG4iKTsKKwl9CisJc3AtPm9ieXRlcyArPSBza2ItPmxlbjsKKwkvKiBDb250cm9sIGlzIGhpZ2ggcHJpb3JpdHkgc28gaXQgZG9lc24ndCBnZXQgcXVldWVkIGJlaGluZCBkYXRhICovCisJc2tiLT5wcmlvcml0eT1UQ19QUklPX0NPTlRST0w7CisJc2tiLT5kZXYgPSBkZXY7CisJc2tiX3F1ZXVlX3RhaWwoJnR4X3F1ZXVlLCBza2IpOworfQorCisvKgorICogU2VuZCBDaXNjbyBrZWVwYWxpdmUgcGFja2V0LgorICovCisKK3N0YXRpYyB2b2lkIHNwcHBfY2lzY29fc2VuZCAoc3RydWN0IHNwcHAgKnNwLCBpbnQgdHlwZSwgbG9uZyBwYXIxLCBsb25nIHBhcjIpCit7CisJc3RydWN0IHBwcF9oZWFkZXIgKmg7CisJc3RydWN0IGNpc2NvX3BhY2tldCAqY2g7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3AtPnBwX2lmOworCXUzMiB0ID0gamlmZmllcyAqIDEwMDAvSFo7CisKKwlza2I9YWxsb2Nfc2tiKGRldi0+aGFyZF9oZWFkZXJfbGVuK1BQUF9IRUFERVJfTEVOK0NJU0NPX1BBQ0tFVF9MRU4sCisJCUdGUF9BVE9NSUMpOworCisJaWYoc2tiPT1OVUxMKQorCQlyZXR1cm47CisJCQorCXNrYl9yZXNlcnZlKHNrYiwgZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCWggPSAoc3RydWN0IHBwcF9oZWFkZXIgKilza2JfcHV0IChza2IsIHNpemVvZihzdHJ1Y3QgcHBwX2hlYWRlcikpOworCWgtPmFkZHJlc3MgPSBDSVNDT19NVUxUSUNBU1Q7CisJaC0+Y29udHJvbCA9IDA7CisJaC0+cHJvdG9jb2wgPSBodG9ucyAoQ0lTQ09fS0VFUEFMSVZFKTsKKworCWNoID0gKHN0cnVjdCBjaXNjb19wYWNrZXQqKXNrYl9wdXQoc2tiLCBDSVNDT19QQUNLRVRfTEVOKTsKKwljaC0+dHlwZSA9IGh0b25sICh0eXBlKTsKKwljaC0+cGFyMSA9IGh0b25sIChwYXIxKTsKKwljaC0+cGFyMiA9IGh0b25sIChwYXIyKTsKKwljaC0+cmVsID0gLTE7CisJY2gtPnRpbWUwID0gaHRvbnMgKCh1MTYpICh0ID4+IDE2KSk7CisJY2gtPnRpbWUxID0gaHRvbnMgKCh1MTYpIHQpOworCisJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGNpc2NvIG91dHB1dDogPCV4aCAleGggJXhoICV4aCAleGgtJXhoPlxuIiwKKwkJCWRldi0+bmFtZSwgIG50b2hsIChjaC0+dHlwZSksIGNoLT5wYXIxLAorCQkJY2gtPnBhcjIsIGNoLT5yZWwsIGNoLT50aW1lMCwgY2gtPnRpbWUxKTsKKwlzcC0+b2J5dGVzICs9IHNrYi0+bGVuOworCXNrYi0+cHJpb3JpdHk9VENfUFJJT19DT05UUk9MOworCXNrYi0+ZGV2ID0gZGV2OworCXNrYl9xdWV1ZV90YWlsKCZ0eF9xdWV1ZSwgc2tiKTsKK30KKworLyoqCisgKglzcHBwX2Nsb3NlIC0gY2xvc2UgZG93biBhIHN5bmNocm9ub3VzIFBQUCBvciBDaXNjbyBIRExDIGxpbmsKKyAqCUBkZXY6IFRoZSBuZXR3b3JrIGRldmljZSB0byBkcm9wIHRoZSBsaW5rIG9mCisgKgorICoJVGhpcyBkcm9wcyB0aGUgbG9naWNhbCBpbnRlcmZhY2UgdG8gdGhlIGNoYW5uZWwuIEl0IGlzIG5vdAorICoJZG9uZSBwb2xpdGVseSBhcyB3ZSBhc3N1bWUgd2Ugd2lsbCBhbHNvIGJlIGRyb3BwaW5nIERUUi4gQW55CisgKgl0aW1lb3V0cyBhcmUga2lsbGVkLgorICovCisKK2ludCBzcHBwX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcHBwICpzcCA9IChzdHJ1Y3Qgc3BwcCAqKXNwcHBfb2YoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwLT5sb2NrLCBmbGFncyk7CisJc3AtPnBwX2xpbmtfc3RhdGUgPSBTUFBQX0xJTktfRE9XTjsKKwlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0NMT1NFRDsKKwlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCXNwcHBfY2xlYXJfdGltZW91dCAoc3ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChzcHBwX2Nsb3NlKTsKKworLyoqCisgKglzcHBwX29wZW4gLSBvcGVuIGEgc3luY2hyb25vdXMgUFBQIG9yIENpc2NvIEhETEMgbGluaworICoJQGRldjoJTmV0d29yayBkZXZpY2UgdG8gYWN0aXZhdGUKKyAqCQorICoJQ2xvc2UgZG93biBhbnkgZXhpc3Rpbmcgc3luY2hyb25vdXMgc2Vzc2lvbiBhbmQgY29tbWVuY2UKKyAqCWZyb20gc2NyYXRjaC4gSW4gdGhlIFBQUCBjYXNlIHRoaXMgbWVhbnMgbmVnb3RpYXRpbmcgTENQL0lQQ1AKKyAqCWFuZCBmcmllbmRzLCB3aGlsZSBmb3IgQ2lzY28gSERMQyB3ZSBzaW1wbHkgbmVlZCB0byBzdGFydCBzZW5kaW5nCisgKglrZWVwYWxpdmVzCisgKi8KKworaW50IHNwcHBfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BwcCAqc3AgPSAoc3RydWN0IHNwcHAgKilzcHBwX29mKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwcHBfY2xvc2UoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+bG9jaywgZmxhZ3MpOworCWlmICghKHNwLT5wcF9mbGFncyAmIFBQX0NJU0NPKSkgeworCQlzcHBwX2xjcF9vcGVuIChzcCk7CisJfQorCXNwLT5wcF9saW5rX3N0YXRlID0gU1BQUF9MSU5LX0RPV047CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwlzcHBwX2ZsdXNoX3htaXQoKTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHNwcHBfb3Blbik7CisKKy8qKgorICoJc3BwcF9yZW9wZW4gLSBub3RpZnkgb2YgcGh5c2ljYWwgbGluayBsb3NzCisgKglAZGV2OiBEZXZpY2UgdGhhdCBsb3N0IHRoZSBsaW5rCisgKgorICoJVGhpcyBmdW5jdGlvbiBpbmZvcm1zIHRoZSBzeW5jaHJvbm91cyBwcm90b2NvbCBjb2RlIHRoYXQKKyAqCXRoZSB1bmRlcmx5aW5nIGxpbmsgZGllZCAoZm9yIGV4YW1wbGUgYSBjYXJyaWVyIGRyb3Agb24gWC4yMSkKKyAqCisgKglXZSBpbmNyZW1lbnQgdGhlIG1hZ2ljIG51bWJlcnMgdG8gZW5zdXJlIHRoYXQgaWYgdGhlIG90aGVyIGVuZAorICoJZmFpbGVkIHRvIG5vdGljZSB3ZSB3aWxsIGNvcnJlY3RseSBzdGFydCBhIG5ldyBzZXNzaW9uLiBJdCBoYXBwZW5zCisgKglkbyB0byB0aGUgbmF0dXJlIG9mIHRlbGNvIGNpcmN1aXRzIGlzIHRoYXQgeW91IGNhbiBsb3NlIGNhcnJpZXIgb24KKyAqCW9uZSBlbmRvbmx5LgorICoKKyAqCUhhdmluZyBkb25lIHRoaXMgd2UgZ28gYmFjayB0byBuZWdvdGlhdGluZy4gVGhpcyBmdW5jdGlvbiBtYXkKKyAqCWJlIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBjb250ZXh0LgorICovCisgCitpbnQgc3BwcF9yZW9wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwcHAgKnNwID0gKHN0cnVjdCBzcHBwICopc3BwcF9vZihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcHBwX2Nsb3NlKGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzcC0+cHBfZmxhZ3MgJiBQUF9DSVNDTykpCisJeworCQlzcC0+bGNwLm1hZ2ljID0gamlmZmllczsKKwkJKytzcC0+cHBfc2VxOworCQlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0NMT1NFRDsKKwkJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0NMT1NFRDsKKwkJLyogR2l2ZSBpdCBhIG1vbWVudCBmb3IgdGhlIGxpbmUgdG8gc2V0dGxlIHRoZW4gZ28gKi8KKwkJc3BwcF9zZXRfdGltZW91dCAoc3AsIDEpOworCX0gCisJc3AtPnBwX2xpbmtfc3RhdGU9U1BQUF9MSU5LX0RPV047CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHNwcHBfcmVvcGVuKTsKKworLyoqCisgKglzcHBwX2NoYW5nZV9tdHUgLSBDaGFuZ2UgdGhlIGxpbmsgTVRVCisgKglAZGV2OglEZXZpY2UgdG8gY2hhbmdlIE1UVSBvbgorICoJQG5ld19tdHU6IE5ldyBNVFUKKyAqCisgKglDaGFuZ2UgdGhlIE1UVSBvbiB0aGUgbGluay4gVGhpcyBjYW4gb25seSBiZSBjYWxsZWQgd2l0aAorICoJdGhlIGxpbmsgZG93bi4gSXQgcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgbGluayBpcyB1cCBvcgorICoJdGhlIG10dSBpcyBvdXQgb2YgcmFuZ2UuCisgKi8KKyAKK2ludCBzcHBwX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYobmV3X210dTwxMjh8fG5ld19tdHU+UFBQX01UVXx8KGRldi0+ZmxhZ3MmSUZGX1VQKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5tdHU9bmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChzcHBwX2NoYW5nZV9tdHUpOworCisvKioKKyAqCXNwcHBfZG9faW9jdGwgLSBJb2N0bCBoYW5kbGVyIGZvciBwcHAvaGRsYworICoJQGRldjogRGV2aWNlIHN1YmplY3QgdG8gaW9jdGwKKyAqCUBpZnI6IEludGVyZmFjZSByZXF1ZXN0IGJsb2NrIGZyb20gdGhlIHVzZXIKKyAqCUBjbWQ6IENvbW1hbmQgdGhhdCBpcyBiZWluZyBpc3N1ZWQKKyAqCQorICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBpb2N0bHMgdGhhdCBtYXkgYmUgaXNzdWVkIGJ5IHRoZSB1c2VyCisgKgl0byBjb250cm9sIHRoZSBzZXR0aW5ncyBvZiBhIFBQUC9IRExDIGxpbmsuIEl0IGRvZXMgYm90aCBidXN5CisgKglhbmQgc2VjdXJpdHkgY2hlY2tzLiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHdyYXBwZWQgYnkKKyAqCWNhbGxlcnMgd2hvIHdpc2ggdG8gYWRkIGFkZGl0aW9uYWwgaW9jdGwgY2FsbHMgb2YgdGhlaXIgb3duLgorICovCisgCitpbnQgc3BwcF9kb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc3BwcCAqc3AgPSAoc3RydWN0IHNwcHAgKilzcHBwX29mKGRldik7CisKKwlpZihkZXYtPmZsYWdzJklGRl9VUCkKKwkJcmV0dXJuIC1FQlVTWTsKKwkJCisJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJCisJc3dpdGNoKGNtZCkKKwl7CisJCWNhc2UgU1BQUElPQ0NJU0NPOgorCQkJc3AtPnBwX2ZsYWdzfD1QUF9DSVNDTzsKKwkJCWRldi0+dHlwZSA9IEFSUEhSRF9IRExDOworCQkJYnJlYWs7CisJCWNhc2UgU1BQUElPQ1BQUDoKKwkJCXNwLT5wcF9mbGFncyY9flBQX0NJU0NPOworCQkJZGV2LT50eXBlID0gQVJQSFJEX1BQUDsKKwkJCWJyZWFrOworCQljYXNlIFNQUFBJT0NERUJVRzoKKwkJCXNwLT5wcF9mbGFncyY9flBQX0RFQlVHOworCQkJaWYoaWZyLT5pZnJfZmxhZ3MpCisJCQkJc3AtPnBwX2ZsYWdzfD1QUF9ERUJVRzsKKwkJCWJyZWFrOworCQljYXNlIFNQUFBJT0NHRkxBR1M6CisJCQlpZihjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJnNwLT5wcF9mbGFncywgc2l6ZW9mKHNwLT5wcF9mbGFncykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisJCWNhc2UgU1BQUElPQ1NGTEFHUzoKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZzcC0+cHBfZmxhZ3MsIGlmci0+aWZyX2RhdGEsIHNpemVvZihzcC0+cHBfZmxhZ3MpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHNwcHBfZG9faW9jdGwpOworCisvKioKKyAqCXNwcHBfYXR0YWNoIC0gYXR0YWNoIHN5bmNocm9ub3VzIFBQUC9IRExDIHRvIGEgZGV2aWNlCisgKglAcGQ6CVBQUCBkZXZpY2UgdG8gaW5pdGlhbGlzZQorICoKKyAqCVRoaXMgaW5pdGlhbGlzZXMgdGhlIFBQUC9IRExDIHN1cHBvcnQgb24gYW4gaW50ZXJmYWNlLiBBdCB0aGUKKyAqCXRpbWUgb2YgY2FsbGluZyB0aGUgZGV2IGVsZW1lbnQgbXVzdCBwb2ludCB0byB0aGUgbmV0d29yayBkZXZpY2UKKyAqCXRoYXQgdGhpcyBpbnRlcmZhY2UgaXMgYXR0YWNoZWQgdG8uIFRoZSBpbnRlcmZhY2Ugc2hvdWxkIG5vdCB5ZXQKKyAqCWJlIHJlZ2lzdGVyZWQuIAorICovCisgCit2b2lkIHNwcHBfYXR0YWNoKHN0cnVjdCBwcHBfZGV2aWNlICpwZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGQtPmRldjsKKwlzdHJ1Y3Qgc3BwcCAqc3AgPSAmcGQtPnNwcHA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIE1ha2Ugc3VyZSBlbWJlZGRpbmcgaXMgc2FmZSBmb3Igc3BwcF9vZiAqLworCUJVR19PTihzcHBwX29mKGRldikgIT0gc3ApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwcHBxX2xvY2ssIGZsYWdzKTsKKwkvKiBJbml0aWFsaXplIGtlZXBhbGl2ZSBoYW5kbGVyLiAqLworCWlmICghIHNwcHBxKQorCXsKKwkJaW5pdF90aW1lcigmc3BwcF9rZWVwYWxpdmVfdGltZXIpOworCQlzcHBwX2tlZXBhbGl2ZV90aW1lci5leHBpcmVzPWppZmZpZXMrMTAqSFo7CisJCXNwcHBfa2VlcGFsaXZlX3RpbWVyLmZ1bmN0aW9uPXNwcHBfa2VlcGFsaXZlOworCQlhZGRfdGltZXIoJnNwcHBfa2VlcGFsaXZlX3RpbWVyKTsKKwl9CisJLyogSW5zZXJ0IG5ldyBlbnRyeSBpbnRvIHRoZSBrZWVwYWxpdmUgbGlzdC4gKi8KKwlzcC0+cHBfbmV4dCA9IHNwcHBxOworCXNwcHBxID0gc3A7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BwcHFfbG9jaywgZmxhZ3MpOworCisJc3AtPnBwX2xvb3BjbnQgPSAwOworCXNwLT5wcF9hbGl2ZWNudCA9IDA7CisJc3AtPnBwX3NlcSA9IDA7CisJc3AtPnBwX3JzZXEgPSAwOworCXNwLT5wcF9mbGFncyA9IFBQX0tFRVBBTElWRXxQUF9DSVNDT3xkZWJ1ZzsvKlBQX0RFQlVHOyovCisJc3AtPmxjcC5tYWdpYyA9IDA7CisJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9DTE9TRUQ7CisJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0NMT1NFRDsKKwlzcC0+cHBfaWYgPSBkZXY7CisJc3Bpbl9sb2NrX2luaXQoJnNwLT5sb2NrKTsKKwkKKwkvKiAKKwkgKglEZXZpY2Ugc3BlY2lmaWMgc2V0dXAuIEFsbCBidXQgaW50ZXJydXB0IGhhbmRsZXIgYW5kCisJICoJaGFyZF9zdGFydF94bWl0LgorCSAqLworCSAKKwlkZXYtPmhhcmRfaGVhZGVyID0gc3BwcF9oYXJkX2hlYWRlcjsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyID0gc3BwcF9yZWJ1aWxkX2hlYWRlcjsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDEwOworCWRldi0+dHlwZSA9IEFSUEhSRF9IRExDOworCWRldi0+YWRkcl9sZW4gPSAwOworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBwcHBfaGVhZGVyKTsKKwlkZXYtPm10dSA9IFBQUF9NVFU7CisJLyoKKwkgKglUaGVzZSA0IGFyZSBjYWxsZXJzIGJ1dCBNVVNUIGFsc28gY2FsbCBzcHBwXyBmdW5jdGlvbnMKKwkgKi8KKwlkZXYtPmRvX2lvY3RsID0gc3BwcF9kb19pb2N0bDsKKyNpZiAwCisJZGV2LT5nZXRfc3RhdHMgPSBOVUxMOwkJLyogTGV0IHRoZSBkcml2ZXIgb3ZlcnJpZGUgdGhlc2UgKi8KKwlkZXYtPm9wZW4gPSBzcHBwX29wZW47CisJZGV2LT5zdG9wID0gc3BwcF9jbG9zZTsKKyNlbmRpZgkKKwlkZXYtPmNoYW5nZV9tdHUgPSBzcHBwX2NoYW5nZV9tdHU7CisJZGV2LT5oYXJkX2hlYWRlcl9jYWNoZSA9IE5VTEw7CisJZGV2LT5oZWFkZXJfY2FjaGVfdXBkYXRlID0gTlVMTDsKKwlkZXYtPmZsYWdzID0gSUZGX01VTFRJQ0FTVHxJRkZfUE9JTlRPUE9JTlR8SUZGX05PQVJQOworfQorCitFWFBPUlRfU1lNQk9MKHNwcHBfYXR0YWNoKTsKKworLyoqCisgKglzcHBwX2RldGFjaCAtIHJlbGVhc2UgUFBQIHJlc291cmNlcyBmcm9tIGEgZGV2aWNlCisgKglAZGV2OglOZXR3b3JrIGRldmljZSB0byByZWxlYXNlCisgKgorICoJU3RvcCBhbmQgZnJlZSB1cCBhbnkgUFBQL0hETEMgcmVzb3VyY2VzIHVzZWQgYnkgdGhpcworICoJaW50ZXJmYWNlLiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZGV2aWNlIGlzCisgKglmcmVlZC4KKyAqLworIAordm9pZCBzcHBwX2RldGFjaCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BwcCAqKnEsICpwLCAqc3AgPSAoc3RydWN0IHNwcHAgKilzcHBwX29mKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcHBwcV9sb2NrLCBmbGFncyk7CisJLyogUmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBrZWVwYWxpdmUgbGlzdC4gKi8KKwlmb3IgKHEgPSAmc3BwcHE7IChwID0gKnEpOyBxID0gJnAtPnBwX25leHQpCisJCWlmIChwID09IHNwKSB7CisJCQkqcSA9IHAtPnBwX25leHQ7CisJCQlicmVhazsKKwkJfQorCisJLyogU3RvcCBrZWVwYWxpdmUgaGFuZGxlci4gKi8KKwlpZiAoISBzcHBwcSkKKwkJZGVsX3RpbWVyKCZzcHBwX2tlZXBhbGl2ZV90aW1lcik7CisJc3BwcF9jbGVhcl90aW1lb3V0IChzcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BwcHFfbG9jaywgZmxhZ3MpOworfQorCitFWFBPUlRfU1lNQk9MKHNwcHBfZGV0YWNoKTsKKworLyoKKyAqIEFuYWx5emUgdGhlIExDUCBDb25maWd1cmUtUmVxdWVzdCBvcHRpb25zIGxpc3QKKyAqIGZvciB0aGUgcHJlc2VuY2Ugb2YgdW5rbm93biBvcHRpb25zLgorICogSWYgdGhlIHJlcXVlc3QgY29udGFpbnMgdW5rbm93biBvcHRpb25zLCBidWlsZCBhbmQKKyAqIHNlbmQgQ29uZmlndXJlLXJlamVjdCBwYWNrZXQsIGNvbnRhaW5pbmcgb25seSB1bmtub3duIG9wdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQKK3NwcHBfbGNwX2NvbmZfcGFyc2Vfb3B0aW9ucyAoc3RydWN0IHNwcHAgKnNwLCBzdHJ1Y3QgbGNwX2hlYWRlciAqaCwKKwlpbnQgbGVuLCB1MzIgKm1hZ2ljKQoreworCXU4ICpidWYsICpyLCAqcDsKKwlpbnQgcmxlbjsKKworCWxlbiAtPSA0OworCWJ1ZiA9IHIgPSBrbWFsbG9jIChsZW4sIEdGUF9BVE9NSUMpOworCWlmICghIGJ1ZikKKwkJcmV0dXJuICgwKTsKKworCXAgPSAodm9pZCopIChoKzEpOworCWZvciAocmxlbj0wOyBsZW4+MSAmJiBwWzFdOyBsZW4tPXBbMV0sIHArPXBbMV0pIHsKKwkJc3dpdGNoICgqcCkgeworCQljYXNlIExDUF9PUFRfTUFHSUM6CisJCQkvKiBNYWdpYyBudW1iZXIgLS0gZXh0cmFjdC4gKi8KKwkJCWlmIChsZW4gPj0gNiAmJiBwWzFdID09IDYpIHsKKwkJCQkqbWFnaWMgPSAodTMyKXBbMl0gPDwgMjQgfAorCQkJCQkodTMyKXBbM10gPDwgMTYgfCBwWzRdIDw8IDggfCBwWzVdOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTENQX09QVF9BU1lOQ19NQVA6CisJCQkvKiBBc3luYyBjb250cm9sIGNoYXJhY3RlciBtYXAgLS0gY2hlY2sgdG8gYmUgemVyby4gKi8KKwkJCWlmIChsZW4gPj0gNiAmJiBwWzFdID09IDYgJiYgISBwWzJdICYmICEgcFszXSAmJgorCQkJICAgICEgcFs0XSAmJiAhIHBbNV0pCisJCQkJY29udGludWU7CisJCQlicmVhazsKKwkJY2FzZSBMQ1BfT1BUX01SVToKKwkJCS8qIE1heGltdW0gcmVjZWl2ZSB1bml0IC0tIGFsd2F5cyBPSy4gKi8KKwkJCWNvbnRpbnVlOworCQlkZWZhdWx0OgorCQkJLyogT3RoZXJzIG5vdCBzdXBwb3J0ZWQuICovCisJCQlicmVhazsKKwkJfQorCQkvKiBBZGQgdGhlIG9wdGlvbiB0byByZWplY3RlZCBsaXN0LiAqLworCQltZW1jcHkociwgcCwgcFsxXSk7CisJCXIgKz0gcFsxXTsKKwkJcmxlbiArPSBwWzFdOworCX0KKwlpZiAocmxlbikKKwkJc3BwcF9jcF9zZW5kIChzcCwgUFBQX0xDUCwgTENQX0NPTkZfUkVKLCBoLT5pZGVudCwgcmxlbiwgYnVmKTsKKwlrZnJlZShidWYpOworCXJldHVybiAocmxlbiA9PSAwKTsKK30KKworc3RhdGljIHZvaWQgc3BwcF9pcGNwX2lucHV0IChzdHJ1Y3Qgc3BwcCAqc3AsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxjcF9oZWFkZXIgKmg7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5wcF9pZjsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGxjcF9oZWFkZXIpKSkgeworCQlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWQgaXBjcCBwYWNrZXQgbGVuZ3RoOiAlZCBieXRlc1xuIiwKKwkJCQlkZXYtPm5hbWUsICBsZW4pOworCQlyZXR1cm47CisJfQorCWggPSAoc3RydWN0IGxjcF9oZWFkZXIgKilza2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLHNpemVvZihzdHJ1Y3QgbGNwX2hlYWRlcikpOworCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGlwY3AgaW5wdXQ6ICVkIGJ5dGVzIDwlcyBpZD0leGggbGVuPSV4aCIsCisJCQlkZXYtPm5hbWUsICBsZW4sCisJCQlzcHBwX2lwY3BfdHlwZV9uYW1lIChoLT50eXBlKSwgaC0+aWRlbnQsIG50b2hzIChoLT5sZW4pKTsKKwkJaWYgKGxlbiA+IDQpCisJCQlzcHBwX3ByaW50X2J5dGVzICgodTgqKSAoaCsxKSwgbGVuLTQpOworCQlwcmludGsgKCI+XG4iKTsKKwl9CisJaWYgKGxlbiA+IG50b2hzIChoLT5sZW4pKQorCQlsZW4gPSBudG9ocyAoaC0+bGVuKTsKKwlzd2l0Y2ggKGgtPnR5cGUpIHsKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIHBhY2tldCB0eXBlIC0tIHNlbmQgQ29kZS1SZWplY3QgcGFja2V0LiAqLworCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfSVBDUCwgSVBDUF9DT0RFX1JFSiwgKytzcC0+cHBfc2VxLCBsZW4sIGgpOworCQlicmVhazsKKwljYXNlIElQQ1BfQ09ORl9SRVE6CisJCWlmIChsZW4gPCA0KSB7CisJCQlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIGlwY3AgY29uZmlndXJlIHJlcXVlc3QgcGFja2V0IGxlbmd0aDogJWQgYnl0ZXNcbiIsCisJCQkJCWRldi0+bmFtZSwgbGVuKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAobGVuID4gNCkgeworCQkJc3BwcF9jcF9zZW5kIChzcCwgUFBQX0lQQ1AsIExDUF9DT05GX1JFSiwgaC0+aWRlbnQsCisJCQkJbGVuLTQsIGgrMSk7CisKKwkJCXN3aXRjaCAoc3AtPmlwY3Auc3RhdGUpIHsKKwkJCWNhc2UgSVBDUF9TVEFURV9PUEVORUQ6CisJCQkJLyogSW5pdGlhdGUgcmVuZWdvdGlhdGlvbi4gKi8KKwkJCQlzcHBwX2lwY3Bfb3BlbiAoc3ApOworCQkJCS8qIGZhbGwgdGhyb3VnaC4uLiAqLworCQkJY2FzZSBJUENQX1NUQVRFX0FDS19TRU5UOgorCQkJCS8qIEdvIHRvIGNsb3NlZCBzdGF0ZS4gKi8KKwkJCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogU2VuZCBDb25maWd1cmUtQWNrIHBhY2tldC4gKi8KKwkJCXNwcHBfY3Bfc2VuZCAoc3AsIFBQUF9JUENQLCBJUENQX0NPTkZfQUNLLCBoLT5pZGVudCwKKwkJCQkwLCBOVUxMKTsKKwkJCS8qIENoYW5nZSB0aGUgc3RhdGUuICovCisJCQlpZiAoc3AtPmlwY3Auc3RhdGUgPT0gSVBDUF9TVEFURV9BQ0tfUkNWRCkKKwkJCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfT1BFTkVEOworCQkJZWxzZQorCQkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9BQ0tfU0VOVDsKKwkJfQorCQlicmVhazsKKwljYXNlIElQQ1BfQ09ORl9BQ0s6CisJCWlmIChoLT5pZGVudCAhPSBzcC0+aXBjcC5jb25maWQpCisJCQlicmVhazsKKwkJc3BwcF9jbGVhcl90aW1lb3V0IChzcCk7CisJCXN3aXRjaCAoc3AtPmlwY3Auc3RhdGUpIHsKKwkJY2FzZSBJUENQX1NUQVRFX0NMT1NFRDoKKwkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9BQ0tfUkNWRDsKKwkJCXNwcHBfc2V0X3RpbWVvdXQgKHNwLCA1KTsKKwkJCWJyZWFrOworCQljYXNlIElQQ1BfU1RBVEVfQUNLX1NFTlQ6CisJCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfT1BFTkVEOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJUENQX0NPTkZfTkFLOgorCWNhc2UgSVBDUF9DT05GX1JFSjoKKwkJaWYgKGgtPmlkZW50ICE9IHNwLT5pcGNwLmNvbmZpZCkKKwkJCWJyZWFrOworCQlzcHBwX2NsZWFyX3RpbWVvdXQgKHNwKTsKKwkJCS8qIEluaXRpYXRlIHJlbmVnb3RpYXRpb24uICovCisJCXNwcHBfaXBjcF9vcGVuIChzcCk7CisJCWlmIChzcC0+aXBjcC5zdGF0ZSAhPSBJUENQX1NUQVRFX0FDS19TRU5UKQorCQkJLyogR28gdG8gY2xvc2VkIHN0YXRlLiAqLworCQkJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0NMT1NFRDsKKwkJYnJlYWs7CisJY2FzZSBJUENQX1RFUk1fUkVROgorCQkvKiBTZW5kIFRlcm1pbmF0ZS1BY2sgcGFja2V0LiAqLworCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfSVBDUCwgSVBDUF9URVJNX0FDSywgaC0+aWRlbnQsIDAsIE5VTEwpOworCQkvKiBHbyB0byBjbG9zZWQgc3RhdGUuICovCisJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9DTE9TRUQ7CisJCS8qIEluaXRpYXRlIHJlbmVnb3RpYXRpb24uICovCisJCXNwcHBfaXBjcF9vcGVuIChzcCk7CisJCWJyZWFrOworCWNhc2UgSVBDUF9URVJNX0FDSzoKKwkJLyogSWdub3JlIGZvciBub3cuICovCisJY2FzZSBJUENQX0NPREVfUkVKOgorCQkvKiBJZ25vcmUgZm9yIG5vdy4gKi8KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBzcHBwX2xjcF9vcGVuIChzdHJ1Y3Qgc3BwcCAqc3ApCit7CisJY2hhciBvcHRbNl07CisKKwlpZiAoISBzcC0+bGNwLm1hZ2ljKQorCQlzcC0+bGNwLm1hZ2ljID0gamlmZmllczsKKwlvcHRbMF0gPSBMQ1BfT1BUX01BR0lDOworCW9wdFsxXSA9IHNpemVvZiAob3B0KTsKKwlvcHRbMl0gPSBzcC0+bGNwLm1hZ2ljID4+IDI0OworCW9wdFszXSA9IHNwLT5sY3AubWFnaWMgPj4gMTY7CisJb3B0WzRdID0gc3AtPmxjcC5tYWdpYyA+PiA4OworCW9wdFs1XSA9IHNwLT5sY3AubWFnaWM7CisJc3AtPmxjcC5jb25maWQgPSArK3NwLT5wcF9zZXE7CisJc3BwcF9jcF9zZW5kIChzcCwgUFBQX0xDUCwgTENQX0NPTkZfUkVRLCBzcC0+bGNwLmNvbmZpZCwKKwkJc2l6ZW9mIChvcHQpLCAmb3B0KTsKKwlzcHBwX3NldF90aW1lb3V0IChzcCwgMik7Cit9CisKK3N0YXRpYyB2b2lkIHNwcHBfaXBjcF9vcGVuIChzdHJ1Y3Qgc3BwcCAqc3ApCit7CisJc3AtPmlwY3AuY29uZmlkID0gKytzcC0+cHBfc2VxOworCXNwcHBfY3Bfc2VuZCAoc3AsIFBQUF9JUENQLCBJUENQX0NPTkZfUkVRLCBzcC0+aXBjcC5jb25maWQsIDAsIE5VTEwpOworCXNwcHBfc2V0X3RpbWVvdXQgKHNwLCAyKTsKK30KKworLyoKKyAqIFByb2Nlc3MgUFBQIGNvbnRyb2wgcHJvdG9jb2wgdGltZW91dHMuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHNwcHBfY3BfdGltZW91dCAodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNwcHAgKnNwID0gKHN0cnVjdCBzcHBwKikgYXJnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3AtPmxvY2ssIGZsYWdzKTsKKworCXNwLT5wcF9mbGFncyAmPSB+UFBfVElNTzsKKwlpZiAoISAoc3AtPnBwX2lmLT5mbGFncyAmIElGRl9VUCkgfHwgKHNwLT5wcF9mbGFncyAmIFBQX0NJU0NPKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXN3aXRjaCAoc3AtPmxjcC5zdGF0ZSkgeworCWNhc2UgTENQX1NUQVRFX0NMT1NFRDoKKwkJLyogTm8gQUNLIGZvciBDb25maWd1cmUtUmVxdWVzdCwgcmV0cnkuICovCisJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwkJYnJlYWs7CisJY2FzZSBMQ1BfU1RBVEVfQUNLX1JDVkQ6CisJCS8qIEFDSyBnb3QsIGJ1dCBubyBDb25maWd1cmUtUmVxdWVzdCBmb3IgcGVlciwgcmV0cnkuICovCisJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9DTE9TRUQ7CisJCWJyZWFrOworCWNhc2UgTENQX1NUQVRFX0FDS19TRU5UOgorCQkvKiBBQ0sgc2VudCBidXQgbm8gQUNLIGZvciBDb25maWd1cmUtUmVxdWVzdCwgcmV0cnkuICovCisJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwkJYnJlYWs7CisJY2FzZSBMQ1BfU1RBVEVfT1BFTkVEOgorCQkvKiBMQ1AgaXMgYWxyZWFkeSBPSywgdHJ5IElQQ1AuICovCisJCXN3aXRjaCAoc3AtPmlwY3Auc3RhdGUpIHsKKwkJY2FzZSBJUENQX1NUQVRFX0NMT1NFRDoKKwkJCS8qIE5vIEFDSyBmb3IgQ29uZmlndXJlLVJlcXVlc3QsIHJldHJ5LiAqLworCQkJc3BwcF9pcGNwX29wZW4gKHNwKTsKKwkJCWJyZWFrOworCQljYXNlIElQQ1BfU1RBVEVfQUNLX1JDVkQ6CisJCQkvKiBBQ0sgZ290LCBidXQgbm8gQ29uZmlndXJlLVJlcXVlc3QgZm9yIHBlZXIsIHJldHJ5LiAqLworCQkJc3BwcF9pcGNwX29wZW4gKHNwKTsKKwkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9DTE9TRUQ7CisJCQlicmVhazsKKwkJY2FzZSBJUENQX1NUQVRFX0FDS19TRU5UOgorCQkJLyogQUNLIHNlbnQgYnV0IG5vIEFDSyBmb3IgQ29uZmlndXJlLVJlcXVlc3QsIHJldHJ5LiAqLworCQkJc3BwcF9pcGNwX29wZW4gKHNwKTsKKwkJCWJyZWFrOworCQljYXNlIElQQ1BfU1RBVEVfT1BFTkVEOgorCQkJLyogSVBDUCBpcyBPSy4gKi8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+bG9jaywgZmxhZ3MpOworCXNwcHBfZmx1c2hfeG1pdCgpOworfQorCitzdGF0aWMgY2hhciAqc3BwcF9sY3BfdHlwZV9uYW1lICh1OCB0eXBlKQoreworCXN0YXRpYyBjaGFyIGJ1ZiBbOF07CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBMQ1BfQ09ORl9SRVE6ICAgcmV0dXJuICgiY29uZi1yZXEiKTsKKwljYXNlIExDUF9DT05GX0FDSzogICByZXR1cm4gKCJjb25mLWFjayIpOworCWNhc2UgTENQX0NPTkZfTkFLOiAgIHJldHVybiAoImNvbmYtbmFjayIpOworCWNhc2UgTENQX0NPTkZfUkVKOiAgIHJldHVybiAoImNvbmYtcmVqIik7CisJY2FzZSBMQ1BfVEVSTV9SRVE6ICAgcmV0dXJuICgidGVybS1yZXEiKTsKKwljYXNlIExDUF9URVJNX0FDSzogICByZXR1cm4gKCJ0ZXJtLWFjayIpOworCWNhc2UgTENQX0NPREVfUkVKOiAgIHJldHVybiAoImNvZGUtcmVqIik7CisJY2FzZSBMQ1BfUFJPVE9fUkVKOiAgcmV0dXJuICgicHJvdG8tcmVqIik7CisJY2FzZSBMQ1BfRUNIT19SRVE6ICAgcmV0dXJuICgiZWNoby1yZXEiKTsKKwljYXNlIExDUF9FQ0hPX1JFUExZOiByZXR1cm4gKCJlY2hvLXJlcGx5Iik7CisJY2FzZSBMQ1BfRElTQ19SRVE6ICAgcmV0dXJuICgiZGlzY2FyZC1yZXEiKTsKKwl9CisJc3ByaW50ZiAoYnVmLCAiJXhoIiwgdHlwZSk7CisJcmV0dXJuIChidWYpOworfQorCitzdGF0aWMgY2hhciAqc3BwcF9pcGNwX3R5cGVfbmFtZSAodTggdHlwZSkKK3sKKwlzdGF0aWMgY2hhciBidWYgWzhdOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVBDUF9DT05GX1JFUTogICByZXR1cm4gKCJjb25mLXJlcSIpOworCWNhc2UgSVBDUF9DT05GX0FDSzogICByZXR1cm4gKCJjb25mLWFjayIpOworCWNhc2UgSVBDUF9DT05GX05BSzogICByZXR1cm4gKCJjb25mLW5hY2siKTsKKwljYXNlIElQQ1BfQ09ORl9SRUo6ICAgcmV0dXJuICgiY29uZi1yZWoiKTsKKwljYXNlIElQQ1BfVEVSTV9SRVE6ICAgcmV0dXJuICgidGVybS1yZXEiKTsKKwljYXNlIElQQ1BfVEVSTV9BQ0s6ICAgcmV0dXJuICgidGVybS1hY2siKTsKKwljYXNlIElQQ1BfQ09ERV9SRUo6ICAgcmV0dXJuICgiY29kZS1yZWoiKTsKKwl9CisJc3ByaW50ZiAoYnVmLCAiJXhoIiwgdHlwZSk7CisJcmV0dXJuIChidWYpOworfQorCitzdGF0aWMgdm9pZCBzcHBwX3ByaW50X2J5dGVzICh1X2NoYXIgKnAsIHUxNiBsZW4pCit7CisJcHJpbnRrICgiICV4IiwgKnArKyk7CisJd2hpbGUgKC0tbGVuID4gMCkKKwkJcHJpbnRrICgiLSV4IiwgKnArKyk7Cit9CisKKy8qKgorICoJc3BwcF9yY3YgLQlyZWNlaXZlIGFuZCBwcm9jZXNzIGEgV0FOIFBQUCBmcmFtZQorICoJQHNrYjoJVGhlIGJ1ZmZlciB0byBwcm9jZXNzCisgKglAZGV2OglUaGUgZGV2aWNlIGl0IGFycml2ZWQgb24KKyAqCUBwOiBVbnVzZWQKKyAqCisgKglQcm90b2NvbCBnbHVlLiBUaGlzIGRyaXZlcyB0aGUgZGVmZXJyZWQgcHJvY2Vzc2luZyBtb2RlIHRoZSBwb29yZXIKKyAqCWNhcmRzIHVzZS4gVGhpcyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNhcmRzIHRoYXQgZG8gbm90IGhhdmUKKyAqCXRpbWluZyBjb25zdHJhaW50cyBidXQgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlIG5ldHdvcmsgbGF5ZXIKKyAqCWFmdGVyIGludGVycnVwdCBzZXJ2aWNpbmcgdG8gcHJvY2VzcyBmcmFtZXMgcXVldWVkIHZpYSBuZXRpZl9yeC4KKyAqLworCitzdGF0aWMgaW50IHNwcHBfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYWNrZXRfdHlwZSAqcCkKK3sKKwlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gTkVUX1JYX0RST1A7CisJc3BwcF9pbnB1dChkZXYsc2tiKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBhY2tldF90eXBlIHNwcHBfcGFja2V0X3R5cGUgPSB7CisJLnR5cGUJPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX1dBTl9QUFApLAorCS5mdW5jCT0gc3BwcF9yY3YsCit9OworCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gCisJS0VSTl9JTkZPICJDcm9ueXggTHRkLCBTeW5jaHJvbm91cyBQUFAgYW5kIENJU0NPIEhETEMgKGMpIDE5OTRcbiIKKwlLRVJOX0lORk8gIkxpbnV4IHBvcnQgKGMpIDE5OTggQnVpbGRpbmcgTnVtYmVyIFRocmVlIEx0ZCAmICIKKwkJICAiSmFuIFwiWWVueWFcIiBLYXNwcnphay5cbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IHN5bmNfcHBwX2luaXQodm9pZCkKK3sKKwlpZihkZWJ1ZykKKwkJZGVidWc9UFBfREVCVUc7CisJcHJpbnRrKGJhbm5lcik7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdHhfcXVldWUpOworCWRldl9hZGRfcGFjaygmc3BwcF9wYWNrZXRfdHlwZSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHN5bmNfcHBwX2NsZWFudXAodm9pZCkKK3sKKwlkZXZfcmVtb3ZlX3BhY2soJnNwcHBfcGFja2V0X3R5cGUpOworfQorCittb2R1bGVfaW5pdChzeW5jX3BwcF9pbml0KTsKK21vZHVsZV9leGl0KHN5bmNfcHBwX2NsZWFudXApOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vd2FucGlwZV9tdWx0cHBwLmMgYi9kcml2ZXJzL25ldC93YW4vd2FucGlwZV9tdWx0cHBwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhNjk4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi93YW5waXBlX211bHRwcHAuYwpAQCAtMCwwICsxLDIzNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB3YW5waXBlX211bHRwcHAuYyBNdWx0aS1Qb3J0IFBQUCBkcml2ZXIgbW9kdWxlLgorKgorKiBBdXRob3JzOiAJTmVuYWQgQ29yYmljIDxuY29yYmljQHNhbmdvbWEuY29tPgorKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk1LTIwMDEgU2FuZ29tYSBUZWNobm9sb2dpZXMgSW5jLgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBEZWMgMTUgMjAwMCAgIFVwZGF0ZWQgZm9yIDIuNC5YIGtlcm5lbAorKiBOb3YgMTUgMjAwMCAgIEZpeGVkIHRoZSBTeW5jUFBQIHN1cHBvcnQgZm9yIGtlcm5lbHMgMi4yLjE2IGFuZCBoaWdoZXIuCisqICAgCQlUaGUgcHBwc3RydWN0IGhhcyBjaGFuZ2VkLgorKiBKdWwgMTMgMjAwMAlVc2luZyB0aGUga2VybmVsIFN5bmNwcHAgbW9kdWxlIG9uIHRvcCBvZiBSQVcgV2FucGlwZSBDSERMQworKiAgCQltb2R1bGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSwgYW5kIG90aGVyIHVzZWZ1bCBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgkvKiBvZmZzZXRvZigpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogcmV0dXJuIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGlubGluZSBtZW1zZXQoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JLyoga21hbGxvYygpLCBrZnJlZSgpICovCisjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5waXBlLmg+CS8qIFdBTlBJUEUgY29tbW9uIHVzZXIgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CS8qIEFSUEhSRF8qIGRlZmluZXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luLmg+CQkvKiBzb2NrYWRkcl9pbiAqLworI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4JCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIGh0b25zKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9zZGxhcGNpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zZGxhX2NoZGxjLmg+CQkvKiBDSERMQyBmaXJtd2FyZSBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9zZGxhX2FzeS5oPiAgICAgICAgICAgCS8qIENIRExDIChhc3luYykgQVBJIGRlZmluaXRpb25zICovCisKKyNpbmNsdWRlIDxsaW51eC9pZl93YW5waXBlX2NvbW1vbi5oPiAgICAvKiBTb2NrZXQgRHJpdmVyIGNvbW1vbiBhcmVhICovCisjaW5jbHVkZSA8bGludXgvaWZfd2FucGlwZS5oPgkJCisKKworI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bmV0L3N5bmNwcHAuaD4KKworCisvKioqKioqIERlZmluZXMgJiBNYWNyb3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmCV9ERUJVR18KKyNkZWZpbmUJU1RBVElDCisjZWxzZQorI2RlZmluZQlTVEFUSUMJCXN0YXRpYworI2VuZGlmCisKKy8qIHJlYXNvbnMgZm9yIGVuYWJsaW5nIHRoZSB0aW1lciBpbnRlcnJ1cHQgb24gdGhlIGFkYXB0ZXIgKi8KKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1VEUCAgIAkweDAxCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VUERBVEUJMHgwMgorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfQ09ORklHICAweDA0CisgCisjZGVmaW5lCUNIRExDX0RGTFRfREFUQV9MRU4JMTUwMAkJLyogZGVmYXVsdCBNVFUgKi8KKyNkZWZpbmUgQ0hETENfSERSX0xFTgkJMQorCisjZGVmaW5lIElGRl9QT0lOVFRPUE9JTlQgMHgxMAorCisjZGVmaW5lIENIRExDX0FQSSAweDAxCisKKyNkZWZpbmUgUE9SVCh4KSAgICh4ID09IDAgPyAiUFJJTUFSWSIgOiAiU0VDT05EQVJZIiApCisjZGVmaW5lIE1BWF9CSF9CVUZGCTEwCisKKyNkZWZpbmUgQ1JDX0xFTkdUSCAJMiAKKyNkZWZpbmUgUFBQX0hFQURFUl9MRU4gCTQKKyAKKy8qKioqKipEYXRhIFN0cnVjdHVyZXMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgcGxhY2VkIGluIHRoZSBwcml2YXRlIGRhdGEgYXJlYSBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqIFRoZSBjYXJkIHN0cnVjdHVyZSB1c2VkIHRvIG9jY3VweSB0aGUgcHJpdmF0ZSBhcmVhIGJ1dCBub3cgdGhlIGZvbGxvd2luZyAKKyAqIHN0cnVjdHVyZSB3aWxsIGluY29ycG9yYXRlIHRoZSBjYXJkIHN0cnVjdHVyZSBhbG9uZyB3aXRoIENIRExDIHNwZWNpZmljIGRhdGEKKyAqLworCit0eXBlZGVmIHN0cnVjdCBjaGRsY19wcml2YXRlX2FyZWEKK3sKKwl2b2lkICppZl9wdHI7CQkJCS8qIEdlbmVyYWwgUG9pbnRlciB1c2VkIGJ5IFNQUFAgKi8KKwl3YW5waXBlX2NvbW1vbl90IGNvbW1vbjsKKwlzZGxhX3QJCSpjYXJkOworCWludCAJCVRyYWNpbmdFbmFibGVkOwkJLyogRm9yIGVuYWJsaW5nIFRyYWNpbmcgKi8KKwl1bnNpZ25lZCBsb25nIAljdXJyX3RyYWNlX2FkZHI7CS8qIFVzZWQgZm9yIFRyYWNpbmcgKi8KKwl1bnNpZ25lZCBsb25nIAlzdGFydF90cmFjZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgCWVuZF90cmFjZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgCWJhc2VfYWRkcl90cmFjZV9idWZmZXI7CisJdW5zaWduZWQgbG9uZyAJZW5kX2FkZHJfdHJhY2VfYnVmZmVyOworCXVuc2lnbmVkIHNob3J0IAludW1iZXJfdHJhY2VfZWxlbWVudHM7CisJdW5zaWduZWQgIAlhdmFpbGFibGVfYnVmZmVyX3NwYWNlOworCXVuc2lnbmVkIGxvbmcgCXJvdXRlcl9zdGFydF90aW1lOworCXVuc2lnbmVkIGNoYXIgCXJvdXRlX3N0YXR1czsKKwl1bnNpZ25lZCBjaGFyIAlyb3V0ZV9yZW1vdmVkOworCXVuc2lnbmVkIGxvbmcgCXRpY2tfY291bnRlcjsJCS8qIEZvciA1cyB0aW1lb3V0IGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBsb25nIAlyb3V0ZXJfdXBfdGltZTsKKyAgICAgICAgdTMyICAgICAgICAgICAgIElQX2FkZHJlc3M7CQkvKiBJUCBhZGRyZXNzaW5nICovCisgICAgICAgIHUzMiAgICAgICAgICAgICBJUF9uZXRtYXNrOworCXVuc2lnbmVkIGNoYXIgIG1jOwkJCS8qIE11bGl0Y2FzdCBzdXBwb3J0IG9uL29mZiAqLworCXVuc2lnbmVkIHNob3J0IHVkcF9wa3RfbGd0aDsJCS8qIHVkcCBwYWNrZXQgcHJvY2Vzc2luZyAqLworCWNoYXIgdWRwX3BrdF9zcmM7CisJY2hhciB1ZHBfcGt0X2RhdGFbTUFYX0xHVEhfVURQX01HTlRfUEtUXTsKKwl1bnNpZ25lZCBzaG9ydCB0aW1lcl9pbnRfZW5hYmxlZDsKKwljaGFyIHVwZGF0ZV9jb21tc19zdGF0czsJCS8qIHVwZGF0aW5nIGNvbW1zIHN0YXRzICovCisKKwkvL0ZJWE1FOiBhZGQgZHJpdmVyIHN0YXRzIGFzIHBlciBmcmFtZSByZWxheSEKKworfSBjaGRsY19wcml2YXRlX2FyZWFfdDsKKworLyogUm91dGUgU3RhdHVzIG9wdGlvbnMgKi8KKyNkZWZpbmUgTk9fUk9VVEUJMHgwMAorI2RlZmluZSBBRERfUk9VVEUJMHgwMQorI2RlZmluZSBST1VURV9BRERFRAkweDAyCisjZGVmaW5lIFJFTU9WRV9ST1VURQkweDAzCisKKworLyogdmFyaWFibGUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgZW5hYmxpbmcvZGlzYWJsaW5nIEZUMSBtb25pdG9yIHN0YXR1cyAqLworc3RhdGljIGludCByQ291bnQgPSAwOworCisvKiB2YXJpYWJsZSBmb3IgdHJhY2tpbmcgaG93IG1hbnkgaW50ZXJmYWNlcyB0byBvcGVuIGZvciBXQU5QSVBFIG9uIHRoZQorICAgdHdvIHBvcnRzICovCisKK2V4dGVybiB2b2lkIGRpc2FibGVfaXJxKHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCk7CisKKy8qKioqKiogRnVuY3Rpb24gUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV0FOIGxpbmsgZHJpdmVyIGVudHJ5IHBvaW50cy4gVGhlc2UgYXJlIGNhbGxlZCBieSB0aGUgV0FOIHJvdXRlciBtb2R1bGUuICovCitzdGF0aWMgaW50IHVwZGF0ZShzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2KTsKK3N0YXRpYyBpbnQgbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCSAgd2FuaWZfY29uZl90KiBjb25mKTsKK3N0YXRpYyBpbnQgZGVsX2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworCisvKiBOZXR3b3JrIGRldmljZSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQgaWZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgaWZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgaW50IGlmX3NlbmQoc3RydWN0IHNrX2J1ZmYqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqIGlmX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworCitzdGF0aWMgdm9pZCBpZl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBDSERMQyBGaXJtd2FyZSBpbnRlcmZhY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGNoZGxjX2NvbmZpZ3VyZSAJKHNkbGFfdCogY2FyZCwgdm9pZCogZGF0YSk7CitzdGF0aWMgaW50IGNoZGxjX2NvbW1fZW5hYmxlIAkoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgY2hkbGNfY29tbV9kaXNhYmxlIAkoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgY2hkbGNfcmVhZF92ZXJzaW9uIAkoc2RsYV90KiBjYXJkLCBjaGFyKiBzdHIpOworc3RhdGljIGludCBjaGRsY19zZXRfaW50cl9tb2RlIAkoc2RsYV90KiBjYXJkLCB1bnNpZ25lZCBtb2RlKTsKK3N0YXRpYyBpbnQgY2hkbGNfc2VuZCAoc2RsYV90KiBjYXJkLCB2b2lkKiBkYXRhLCB1bnNpZ25lZCBsZW4pOworc3RhdGljIGludCBjaGRsY19yZWFkX2NvbW1fZXJyX3N0YXRzIChzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCBjaGRsY19yZWFkX29wX3N0YXRzIChzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCBjb25maWdfY2hkbGMgKHNkbGFfdCAqY2FyZCk7CisKKworLyogTWlzY2VsbGFuZW91cyBDSERMQyBGdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgc2V0X2NoZGxjX2NvbmZpZyAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIGluaXRfY2hkbGNfdHhfcnhfYnVmZihzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBjaGRsY19lcnJvciAoc2RsYV90ICpjYXJkLCBpbnQgZXJyLCBDSERMQ19NQUlMQk9YX1NUUlVDVCAqbWIpOworc3RhdGljIGludCBwcm9jZXNzX2NoZGxjX2V4Y2VwdGlvbihzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCBwcm9jZXNzX2dsb2JhbF9leGNlcHRpb24oc2RsYV90ICpjYXJkKTsKK3N0YXRpYyBpbnQgdXBkYXRlX2NvbW1zX3N0YXRzKHNkbGFfdCogY2FyZCwKKyAgICAgICAgY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSk7CitzdGF0aWMgdm9pZCBwb3J0X3NldF9zdGF0ZSAoc2RsYV90ICpjYXJkLCBpbnQpOworCisvKiBJbnRlcnJ1cHQgaGFuZGxlcnMgKi8KK3N0YXRpYyB2b2lkIHdzcHBwX2lzciAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIHJ4X2ludHIgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgdm9pZCB0aW1lcl9pbnRyKHNkbGFfdCAqKTsKKworLyogTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgcmVwbHlfdWRwKCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbWJveF9sZW4gKTsKK3N0YXRpYyBpbnQgaW50cl90ZXN0KCBzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCB1ZHBfcGt0X3R5cGUoIHN0cnVjdCBza19idWZmICpza2IgLCBzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoY2hhciB1ZHBfcGt0X3NyYywgc2RsYV90KiBjYXJkLAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJCSAgICAgIGNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWEpOworc3RhdGljIGludCBwcm9jZXNzX3VkcF9tZ210X3BrdChzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsICAKKwkJCQljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjYWxjX2NoZWNrc3VtIChjaGFyICosIGludCk7CitzdGF0aWMgdm9pZCBzNTA4X2xvY2sgKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKTsKK3N0YXRpYyB2b2lkIHM1MDhfdW5sb2NrIChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncyk7CitzdGF0aWMgdm9pZCBzZW5kX3BwcF90ZXJtX3JlcXVlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworc3RhdGljIGludCAgSW50cl90ZXN0X2NvdW50ZXI7CisvKioqKioqIFB1YmxpYyBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaXNjbyBIRExDIHByb3RvY29sIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBXQU5QSVBFIG1vZHVsZSBkdXJpbmcgc2V0dXAuICBBdCB0aGlzCisgKiBwb2ludCBhZGFwdGVyIGlzIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYW5kIGZpcm13YXJlIGlzIHJ1bm5pbmcuCisgKiAgbyByZWFkIGZpcm13YXJlIHZlcnNpb24gKHRvIG1ha2Ugc3VyZSBpdCdzIGFsaXZlKQorICogIG8gY29uZmlndXJlIGFkYXB0ZXIKKyAqICBvIGluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIG9mIHRoZSBhZGFwdGVyIGRhdGEgc3BhY2UuCisgKgorICogUmV0dXJuOgkwCW8uay4KKyAqCQk8IDAJZmFpbHVyZS4KKyAqLworaW50IHdzcHBwX2luaXQgKHNkbGFfdCogY2FyZCwgd2FuZGV2X2NvbmZfdCogY29uZikKK3sKKwl1bnNpZ25lZCBjaGFyIHBvcnRfbnVtOworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBtYXhfcGVybWl0dGVkX2JhdWQgPSAwOworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzOworCisJdW5pb24KKwkJeworCQljaGFyIHN0cls4MF07CisJCX0gdTsKKwl2b2xhdGlsZSBDSERMQ19NQUlMQk9YX1NUUlVDVCogbWI7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iMTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKiBWZXJpZnkgY29uZmlndXJhdGlvbiBJRCAqLworCWlmIChjb25mLT5jb25maWdfaWQgIT0gV0FOQ09ORklHX01QUFApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgY29uZmlndXJhdGlvbiBJRCAldSFcbiIsCisJCQkJICBjYXJkLT5kZXZuYW1lLCBjb25mLT5jb25maWdfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBGaW5kIG91dCB3aGljaCBQb3J0IHRvIHVzZSAqLworCWlmICgoY29uZi0+Y29tbV9wb3J0ID09IFdBTk9QVF9QUkkpIHx8IChjb25mLT5jb21tX3BvcnQgPT0gV0FOT1BUX1NFQykpeworCQlpZiAoY2FyZC0+bmV4dCl7CisKKwkJCWlmIChjb25mLT5jb21tX3BvcnQgIT0gY2FyZC0+bmV4dC0+dS5jLmNvbW1fcG9ydCl7CisJCQkJY2FyZC0+dS5jLmNvbW1fcG9ydCA9IGNvbmYtPmNvbW1fcG9ydDsKKwkJCX1lbHNleworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVSUk9SIC0gJXMgcG9ydCB1c2VkIVxuIiwKKyAgICAgICAgCQkgICAgICAgIAljYXJkLT53YW5kZXYubmFtZSwgUE9SVChjb25mLT5jb21tX3BvcnQpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfWVsc2V7CisJCQljYXJkLT51LmMuY29tbV9wb3J0ID0gY29uZi0+Y29tbV9wb3J0OworCQl9CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVSUk9SIC0gSW52YWxpZCBQb3J0IFNlbGVjdGVkIVxuIiwKKyAgICAgICAgICAgICAgICAJCQljYXJkLT53YW5kZXYubmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKworCS8qIEluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzICovCisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCisJCWlmIChjYXJkLT51LmMuY29tbV9wb3J0ID09IFdBTk9QVF9QUkkpewkKKwkJCWNhcmQtPm1ib3ggID0gKHZvaWQgKikgY2FyZC0+aHcuZHBtYmFzZTsKKwkJfWVsc2V7CisJCQljYXJkLT5tYm94ICA9ICh2b2lkICopIGNhcmQtPmh3LmRwbWJhc2UgKyAKKwkJCQlTRUNfQkFTRV9BRERSX01CX1NUUlVDVCAtIFBSSV9CQVNFX0FERFJfTUJfU1RSVUNUOworCQl9CQorCX1lbHNleyAKKwkJLyogZm9yIGEgUzUxNCBhZGFwdGVyLCBzZXQgYSBwb2ludGVyIHRvIHRoZSBhY3R1YWwgbWFpbGJveCBpbiB0aGUgKi8KKwkJLyogYWxsb2NhdGVkIHZpcnR1YWwgbWVtb3J5IGFyZWEgKi8KKwkJaWYgKGNhcmQtPnUuYy5jb21tX3BvcnQgPT0gV0FOT1BUX1BSSSl7CisJCQljYXJkLT5tYm94ID0gKHZvaWQgKikgY2FyZC0+aHcuZHBtYmFzZSArIFBSSV9CQVNFX0FERFJfTUJfU1RSVUNUOworCQl9ZWxzZXsKKwkJCWNhcmQtPm1ib3ggPSAodm9pZCAqKSBjYXJkLT5ody5kcG1iYXNlICsgU0VDX0JBU0VfQUREUl9NQl9TVFJVQ1Q7CisJCX0JCisJfQorCisJbWIgPSBtYjEgPSBjYXJkLT5tYm94OworCisJaWYgKCFjYXJkLT5jb25maWd1cmVkKXsKKworCQkvKiBUaGUgYm9hcmQgd2lsbCBwbGFjZSBhbiAnSScgaW4gdGhlIHJldHVybiBjb2RlIHRvIGluZGljYXRlIHRoYXQgaXQgaXMKKwkgICAJcmVhZHkgdG8gYWNjZXB0IGNvbW1hbmRzLiAgV2UgZXhwZWN0IHRoaXMgdG8gYmUgY29tcGxldGVkIGluIGxlc3MKKyAgICAgICAgICAgCXRoYW4gMSBzZWNvbmQuICovCisKKwkJdGltZW91dCA9IGppZmZpZXM7CisJCXdoaWxlIChtYi0+cmV0dXJuX2NvZGUgIT0gJ0knKQkvKiBXYWl0IDFzIGZvciBib2FyZCB0byBpbml0aWFsaXplICovCisJCQlpZiAoKGppZmZpZXMgLSB0aW1lb3V0KSA+IDEqSFopIGJyZWFrOworCisJCWlmIChtYi0+cmV0dXJuX2NvZGUgIT0gJ0knKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBJbml0aWFsaXphdGlvbiBub3QgY29tcGxldGVkIGJ5IGFkYXB0ZXJcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJQbGVhc2UgY29udGFjdCBTYW5nb21hIHJlcHJlc2VudGF0aXZlLlxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCS8qIFJlYWQgZmlybXdhcmUgdmVyc2lvbi4gIE5vdGUgdGhhdCB3aGVuIGFkYXB0ZXIgaW5pdGlhbGl6ZXMsIGl0CisJICogY2xlYXJzIHRoZSBtYWlsYm94LCBzbyBpdCBtYXkgYXBwZWFyIHRoYXQgdGhlIGZpcnN0IGNvbW1hbmQgd2FzCisJICogZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IHdoZW4gaW4gZmFjdCBpdCB3YXMgbWVyZWx5IGVyYXNlZC4gVG8gd29yaworCSAqIGFyb3VuZCB0aGlzLCB3ZSBleGVjdXRlIHRoZSBmaXJzdCBjb21tYW5kIHR3aWNlLgorCSAqLworCisJaWYgKGNoZGxjX3JlYWRfdmVyc2lvbihjYXJkLCB1LnN0cikpCisJCXJldHVybiAtRUlPOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgUmF3IENIRExDIGZpcm13YXJlIHYlc1xuIiAKKwkJCSAiJXM6IGZvciBNdWx0aS1Qb3J0IFBQUCBwcm90b2NvbC5cbiIsCisJCQljYXJkLT5kZXZuYW1lLHUuc3RyLGNhcmQtPmRldm5hbWUpOyAKKworCWNhcmQtPmlzcgkJCT0gJndzcHBwX2lzcjsKKwljYXJkLT5wb2xsCQkJPSBOVUxMOworCWNhcmQtPmV4ZWMJCQk9IE5VTEw7CisJY2FyZC0+d2FuZGV2LnVwZGF0ZQkJPSAmdXBkYXRlOworIAljYXJkLT53YW5kZXYubmV3X2lmCQk9ICZuZXdfaWY7CisJY2FyZC0+d2FuZGV2LmRlbF9pZgkJPSAmZGVsX2lmOworCWNhcmQtPndhbmRldi51ZHBfcG9ydCAgIAk9IGNvbmYtPnVkcF9wb3J0OworCisJY2FyZC0+d2FuZGV2Lm5ld19pZl9jbnQgPSAwOworCisJLyogcmVzZXQgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgJ3VwZGF0ZSgpJyBwcm9jIGhhcyBiZWVuIGNhbGxlZCAqLworCWNhcmQtPnUuYy51cGRhdGVfY2FsbF9jb3VudCA9IDA7CisJCisJY2FyZC0+d2FuZGV2LnR0bCA9IGNvbmYtPnR0bDsKKwljYXJkLT53YW5kZXYuaW50ZXJmYWNlID0gY29uZi0+aW50ZXJmYWNlOyAKKworCWlmICgoY2FyZC0+dS5jLmNvbW1fcG9ydCA9PSBXQU5PUFRfU0VDICYmIGNvbmYtPmludGVyZmFjZSA9PSBXQU5PUFRfVjM1KSYmCisJICAgIGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVSUk9SIC0gVjM1IEludGVyZmFjZSBub3Qgc3VwcG9ydGVkIG9uIFM1MDggJXMgcG9ydCBcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBQT1JUKGNhcmQtPnUuYy5jb21tX3BvcnQpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisKKwljYXJkLT53YW5kZXYuY2xvY2tpbmcgPSBjb25mLT5jbG9ja2luZzsKKworCXBvcnRfbnVtID0gY2FyZC0+dS5jLmNvbW1fcG9ydDsKKworCS8qIFNldHVwIFBvcnQgQnBzICovCisKKwlpZihjYXJkLT53YW5kZXYuY2xvY2tpbmcpIHsKKwkJaWYoKHBvcnRfbnVtID09IFdBTk9QVF9QUkkpIHx8IGNhcmQtPnUuYy5yZWNlaXZlX29ubHkpIHsKKwkJCS8qIEZvciBQcmltYXJ5IFBvcnQgMCAqLworICAgICAgICAgICAgICAgCQltYXhfcGVybWl0dGVkX2JhdWQgPQorCQkJCShjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkgPworCQkJCVBSSV9NQVhfQkFVRF9SQVRFX1M1MTQgOiAKKwkJCQlQUklfTUFYX0JBVURfUkFURV9TNTA4OworCQl9CisJCWVsc2UgaWYocG9ydF9udW0gPT0gV0FOT1BUX1NFQykgeworCQkJLyogRm9yIFNlY29uZGFyeSBQb3J0IDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9wZXJtaXR0ZWRfYmF1ZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19NQVhfQkFVRF9SQVRFX1M1MTQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfTUFYX0JBVURfUkFURV9TNTA4OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAKKwkJCWlmKGNvbmYtPmJwcyA+IG1heF9wZXJtaXR0ZWRfYmF1ZCkgeworCQkJCWNvbmYtPmJwcyA9IG1heF9wZXJtaXR0ZWRfYmF1ZDsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQmF1ZCB0b28gaGlnaCFcbiIsCisJCQkJCWNhcmQtPndhbmRldi5uYW1lKTsKKyAJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJhdWQgcmF0ZSBzZXQgdG8gJWx1IGJwc1xuIiwgCisJCQkJCWNhcmQtPndhbmRldi5uYW1lLCBtYXhfcGVybWl0dGVkX2JhdWQpOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWNhcmQtPndhbmRldi5icHMgPSBjb25mLT5icHM7CisJfWVsc2V7CisgICAgICAgIAljYXJkLT53YW5kZXYuYnBzID0gMDsKKyAgCX0KKworCS8qIFNldHVwIHRoZSBQb3J0IE1UVSAqLworCWlmKChwb3J0X251bSA9PSBXQU5PUFRfUFJJKSB8fCBjYXJkLT51LmMucmVjZWl2ZV9vbmx5KSB7CisKKwkJLyogRm9yIFByaW1hcnkgUG9ydCAwICovCisJCWNhcmQtPndhbmRldi5tdHUgPQorCQkJKGNvbmYtPm10dSA+PSBNSU5fTEdUSF9DSERMQ19EQVRBX0NGRykgPworCQkJbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5tdHUsIFBSSV9NQVhfTk9fREFUQV9CWVRFU19JTl9GUkFNRSkgOgorCQkJQ0hETENfREZMVF9EQVRBX0xFTjsKKwl9IGVsc2UgaWYocG9ydF9udW0gPT0gV0FOT1BUX1NFQykgeyAKKwkJLyogRm9yIFNlY29uZGFyeSBQb3J0IDEgKi8KKwkJY2FyZC0+d2FuZGV2Lm10dSA9CisJCQkoY29uZi0+bXR1ID49IE1JTl9MR1RIX0NIRExDX0RBVEFfQ0ZHKSA/CisJCQltaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPm10dSwgU0VDX01BWF9OT19EQVRBX0JZVEVTX0lOX0ZSQU1FKSA6CisJCQlDSERMQ19ERkxUX0RBVEFfTEVOOworCX0KKworCS8qIEFkZCBvbiBhIFBQUCBIZWFkZXIgKi8KKwljYXJkLT53YW5kZXYubXR1ICs9IFBQUF9IRUFERVJfTEVOOworCisJLyogU2V0IHVwIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGFyZWEgKi8KKwkvKiBSZWFkIHRoZSBDSERMQyBDb25maWd1cmF0aW9uIGFuZCBvYnRhaW46IAorCSAqCVB0ciB0byBzaGFyZWQgbWVtb3J5IGluZm9yIHN0cnVjdAorICAgICAgICAgKiBVc2UgdGhpcyBwb2ludGVyIHRvIGNhbGN1bGF0ZSB0aGUgdmFsdWUgb2YgY2FyZC0+dS5jLmZsYWdzICEKKyAJICovCisJbWIxLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYjEtPmNvbW1hbmQgPSBSRUFEX0NIRExDX0NPTkZJR1VSQVRJT047CisJZXJyID0gc2RsYV9leGVjKG1iMSkgPyBtYjEtPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJaWYoZXJyICE9IENPTU1BTkRfT0spIHsKKwkJY2xlYXJfYml0KDEsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKworICAgICAgICAgICAgICAgIGlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KQorICAgICAgICAgICAgICAgIAllbmFibGVfaXJxKGNhcmQtPmh3LmlycSk7CisKKwkJY2hkbGNfZXJyb3IoY2FyZCwgZXJyLCBtYjEpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCl7CisgICAgICAgICAgICAgICAJY2FyZC0+dS5jLmZsYWdzID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAJCSgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWIxLT5kYXRhKS0+CisJCQlwdHJfc2hhcmVkX21lbV9pbmZvX3N0cnVjdCkpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMuZmxhZ3MgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWIxLT5kYXRhKS0+CisJCQlwdHJfc2hhcmVkX21lbV9pbmZvX3N0cnVjdCAlIFNETEFfV0lORE9XU0laRSkpOworCX0KKwkKKwlmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwkKKwkvKiBUaGlzIGlzIGZvciB0aGUgcG9ydHMgbGluayBzdGF0ZSAqLworCWNhcmQtPndhbmRldi5zdGF0ZSA9IFdBTl9EVUFMUE9SVDsKKwljYXJkLT51LmMuc3RhdGUgPSBXQU5fRElTQ09OTkVDVEVEOworCisKKwlpZiAoIWNhcmQtPndhbmRldi5waWdneWJhY2speworCQllcnIgPSBpbnRyX3Rlc3QoY2FyZCk7CisKKwkJaWYoZXJyIHx8IChJbnRyX3Rlc3RfY291bnRlciA8IE1BWF9JTlRSX1RFU1RfQ09VTlRFUikpIHsgCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnRlcnJ1cHQgdGVzdCBmYWlsZWQgKCVpKVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSwgSW50cl90ZXN0X2NvdW50ZXIpOworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUGxlYXNlIGNob29zZSBhbm90aGVyIGludGVycnVwdFxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gIC1FSU87CisJCX0KKwkJCQorCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJydXB0IHRlc3QgcGFzc2VkICglaSlcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsIEludHJfdGVzdF9jb3VudGVyKTsKKwl9CisKKworCWlmIChjaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsIEFQUF9JTlRfT05fVElNRVIpKXsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gc2V0IGludGVycnVwdCB0cmlnZ2VycyFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUlPOwkKKyAgICAgICAgfQorCQorCS8qIE1hc2sgdGhlIFRpbWVyIGludGVycnVwdCAqLworCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gJj0gCisJCX5BUFBfSU5UX09OX1RJTUVSOworCisJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKiBXQU4gRGV2aWNlIERyaXZlciBFbnRyeSBQb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVcGRhdGUgZGV2aWNlIHN0YXR1cyAmIHN0YXRpc3RpY3MKKyAqIFRoaXMgcHJvY2VkdXJlIGlzIGNhbGxlZCB3aGVuIHVwZGF0aW5nIHRoZSBQUk9DIGZpbGUgc3lzdGVtIGFuZCByZXR1cm5zCisgKiB2YXJpb3VzIGNvbW11bmljYXRpb25zIHN0YXRpc3RpY3MuIFRoZXNlIHN0YXRpc3RpY3MgYXJlIGFjY3VtdWxhdGVkIGZyb20gMyAKKyAqIGRpZmZlcmVudCBsb2NhdGlvbnM6CisgKiAJMSkgVGhlICdpZl9zdGF0cycgcmVjb3JkZWQgZm9yIHRoZSBkZXZpY2UuCisgKiAJMikgQ29tbXVuaWNhdGlvbiBlcnJvciBzdGF0aXN0aWNzIG9uIHRoZSBhZGFwdGVyLgorICogICAgICAzKSBDSERMQyBvcGVyYXRpb25hbCBzdGF0aXN0aWNzIG9uIHRoZSBhZGFwdGVyLgorICogVGhlIGJvYXJkIGxldmVsIHN0YXRpc3RpY3MgYXJlIHJlYWQgZHVyaW5nIGEgdGltZXIgaW50ZXJydXB0LiBOb3RlIHRoYXQgd2UgCisgKiByZWFkIHRoZSBlcnJvciBhbmQgb3BlcmF0aW9uYWwgc3RhdGlzdGljcyBkdXJpbmcgY29uc2VjaXRpdmUgdGltZXIgdGlja3Mgc28KKyAqIGFzIHRvIG1pbmltaXplIHRoZSB0aW1lIHRoYXQgd2UgYXJlIGluc2lkZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICovCitzdGF0aWMgaW50IHVwZGF0ZShzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2KQoreworCXNkbGFfdCogY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKyAJc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKyAgICAgICAgdm9sYXRpbGUgY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYTsKKyAgICAgICAgU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCAqZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmKCh3YW5kZXYgPT0gTlVMTCkgfHwgKHdhbmRldi0+cHJpdmF0ZSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJaWYod2FuZGV2LT5zdGF0ZSA9PSBXQU5fVU5DT05GSUdVUkVEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIG1vcmUgc2FuaXR5IGNoZWNrcyAqLworICAgICAgICBpZighY2FyZC0+dS5jLmZsYWdzKQorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworCisJaWYoKGRldj1jYXJkLT53YW5kZXYuZGV2KSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmKChjaGRsY19wcml2X2FyZWE9ZGV2LT5wcml2KSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworICAgICAgCWZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCisgICAgICAgCWlmKGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzKXsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCQkJCisJLyogd2Ugd2lsbCBuZWVkIDIgdGltZXIgaW50ZXJydXB0cyB0byBjb21wbGV0ZSB0aGUgKi8KKwkvKiByZWFkaW5nIG9mIHRoZSBzdGF0aXN0aWNzICovCisJY2hkbGNfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMgPSAyOworICAgICAgIAlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uIHw9IEFQUF9JTlRfT05fVElNRVI7CisJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCA9IFRNUl9JTlRfRU5BQkxFRF9VUERBVEU7CisgIAorCS8qIHdhaXQgYSBtYXhpbXVtIG9mIDEgc2Vjb25kIGZvciB0aGUgc3RhdGlzdGljcyB0byBiZSB1cGRhdGVkICovIAorICAgICAgICB0aW1lb3V0ID0gamlmZmllczsKKyAgICAgICAgZm9yKDs7KSB7CisJCWlmKGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID09IDApCisJCQlicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoKGppZmZpZXMgLSB0aW1lb3V0KSA+ICgxICogSFopKXsKKyAgICAJCQljaGRsY19wcml2X2FyZWEtPnVwZGF0ZV9jb21tc19zdGF0cyA9IDA7CisgCQkJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPQorCQkJCX5UTVJfSU5UX0VOQUJMRURfVVBEQVRFOyAKKyAJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorICAgICAgICB9CisKKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENyZWF0ZSBuZXcgbG9naWNhbCBjaGFubmVsLgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgcm91dGVyIHdoZW4gUk9VVEVSX0lGTkVXIElPQ1RMIGlzIGJlaW5nCisgKiBoYW5kbGVkLgorICogbyBwYXJzZSBtZWRpYS0gYW5kIGhhcmR3YXJlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAqIG8gbWFrZSBzdXJlIHRoYXQgYSBuZXcgY2hhbm5lbCBjYW4gYmUgY3JlYXRlZAorICogbyBhbGxvY2F0ZSByZXNvdXJjZXMsIGlmIG5lY2Vzc2FyeQorICogbyBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZSBmb3IgcmVnaXN0YXJhdGlvbi4KKyAqCisgKiBSZXR1cm46CTAJby5rLgorICoJCTwgMAlmYWlsdXJlIChjaGFubmVsIHdpbGwgbm90IGJlIGNyZWF0ZWQpCisgKi8KK3N0YXRpYyBpbnQgbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBwZGV2LAorCQkgIHdhbmlmX2NvbmZfdCogY29uZikKK3sKKworCXN0cnVjdCBwcHBfZGV2aWNlICpwcHBkZXYgPSAoc3RydWN0IHBwcF9kZXZpY2UgKilwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBzcHBwICpzcDsKKwlzZGxhX3QqIGNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYTsKKwkKKwlpZiAoKGNvbmYtPm5hbWVbMF0gPT0gJ1wwJykgfHwgKHN0cmxlbihjb25mLT5uYW1lKSA+IFdBTl9JRk5BTUVfU1opKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIGludGVyZmFjZSBuYW1lIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJCQorCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHByaXZhdGUgZGF0YSAqLworCWNoZGxjX3ByaXZfYXJlYSA9IGttYWxsb2Moc2l6ZW9mKGNoZGxjX3ByaXZhdGVfYXJlYV90KSwgR0ZQX0tFUk5FTCk7CisJCisJaWYoY2hkbGNfcHJpdl9hcmVhID09IE5VTEwpIAorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChjaGRsY19wcml2X2FyZWEsIDAsIHNpemVvZihjaGRsY19wcml2YXRlX2FyZWFfdCkpOworCisJY2hkbGNfcHJpdl9hcmVhLT5jYXJkID0gY2FyZDsgCisKKwkvKiBpbml0aWFsaXplIGRhdGEgKi8KKwlzdHJjcHkoY2FyZC0+dS5jLmlmX25hbWUsIGNvbmYtPm5hbWUpOworCisJaWYoY2FyZC0+d2FuZGV2Lm5ld19pZl9jbnQgPiAwKSB7CisgICAgICAgICAgICAgICAga2ZyZWUoY2hkbGNfcHJpdl9hcmVhKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJY2FyZC0+d2FuZGV2Lm5ld19pZl9jbnQrKzsKKworCWNoZGxjX3ByaXZfYXJlYS0+VHJhY2luZ0VuYWJsZWQgPSAwOworCisJLy9XZSBkb24ndCBuZWVkIHRoaXMgYW55IG1vcmUKKwljaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cyA9IE5PX1JPVVRFOworCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVfcmVtb3ZlZCA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogRmlybXdhcmUgcnVubmluZyBpbiBIRExDIFNUUkVBTUlORyBNb2RlXG4iLAorCQl3YW5kZXYtPm5hbWUpOworCQorCS8qIFNldHVwIHdhbnBpcGUgYXMgYSByb3V0ZXIgKFdBTlBJUEUpIG9yIGFzIGFuIEFQSSAqLworCWlmKCBzdHJjbXAoY29uZi0+dXNlZGJ5LCAiV0FOUElQRSIpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERyaXZlciBydW5uaW5nIGluIFdBTlBJUEUgbW9kZSFcbiIsCisJCQl3YW5kZXYtPm5hbWUpOworCQljYXJkLT51LmMudXNlZGJ5ID0gV0FOUElQRTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBBUEkgTW9kZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBTeW5jUFBQIVxuIiwKKwkJCXdhbmRldi0+bmFtZSk7CisJCWtmcmVlKGNoZGxjX3ByaXZfYXJlYSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEdldCBNdWx0aWNhc3QgSW5mb3JtYXRpb24gKi8KKwljaGRsY19wcml2X2FyZWEtPm1jID0gY29uZi0+bWM7CisKKworCWNoZGxjX3ByaXZfYXJlYS0+aWZfcHRyID0gcHBwZGV2OworCisJLyogcHJlcGFyZSBuZXR3b3JrIGRldmljZSBkYXRhIHNwYWNlIGZvciByZWdpc3RyYXRpb24gKi8KKworCXN0cmNweShkZXYtPm5hbWUsY2FyZC0+dS5jLmlmX25hbWUpOworCisJLyogQXR0YWNoIFBQUCBwcm90b2NvbCBsYXllciB0byBwcHBkZXYKKwkgKiBUaGUgc3BwcF9hdHRhY2goKSB3aWxsIGluaXRpbGl6ZSB0aGUgZGV2IHN0cnVjdHVyZQorICAgICAgICAgKiBhbmQgc2V0dXAgcHBwIGxheWVyIHByb3RvY29scy4KKyAgICAgICAgICogQWxsIHdlIGhhdmUgdG8gZG8gaXMgdG8gYmluZCBpbjoKKyAgICAgICAgICogICAgICAgIGlmX29wZW4oKSwgaWZfY2xvc2UoKSwgaWZfc2VuZCgpIGFuZCBnZXRfc3RhdHMoKSBmdW5jdGlvbnMuCisgICAgICAgICAqLworCXNwcHBfYXR0YWNoKHBwcGRldik7CisJZGV2ID0gcHBwZGV2LT5kZXY7CisJc3AgPSAmcHBwZGV2LT5zcHBwOworCQorCS8qIEVuYWJsZSBQUFAgRGVidWdnaW5nICovCisJLy8gRklYTUUgRml4IHRoaXMgdXAgc29tZWhvdworCS8vc3AtPnBwX2ZsYWdzIHw9IFBQX0RFQlVHOyAJCisJc3AtPnBwX2ZsYWdzICY9IH5QUF9DSVNDTzsKKworCWRldi0+aW5pdCA9ICZpZl9pbml0OworCWRldi0+cHJpdiA9IGNoZGxjX3ByaXZfYXJlYTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZWxldGUgbG9naWNhbCBjaGFubmVsLgorICovCitzdGF0aWMgaW50IGRlbF9pZihzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCWNoZGxjX3ByaXZhdGVfYXJlYV90ICpjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hkbGNfcHJpdl9hcmVhLT5jYXJkOworCXVuc2lnbmVkIGxvbmcgc21wX2xvY2s7CisJCisJLyogRGV0YWNoIHRoZSBQUFAgbGF5ZXIgKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogRGV0YWNoaW5nIFN5bmNQUFAgTW9kdWxlIGZyb20gJXNcbiIsCisJCQl3YW5kZXYtPm5hbWUsZGV2LT5uYW1lKTsKKworCWxvY2tfYWRhcHRlcl9pcnEoJndhbmRldi0+bG9jaywmc21wX2xvY2spOworCisJc3BwcF9kZXRhY2goZGV2KTsKKwljaGRsY19wcml2X2FyZWEtPmlmX3B0cj1OVUxMOworCQorCWNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwgMCk7CisJaWYgKGNhcmQtPnUuYy5jb21tX2VuYWJsZWQpCisJCWNoZGxjX2NvbW1fZGlzYWJsZShjYXJkKTsKKwl1bmxvY2tfYWRhcHRlcl9pcnEoJndhbmRldi0+bG9jaywmc21wX2xvY2spOworCQorCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKiBOZXR3b3JrIERldmljZSBJbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBMaW51eCBuZXR3b3JrIGludGVyZmFjZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG9ubHkgb25jZSBmb3IgZWFjaCBpbnRlcmZhY2UsIGR1cmluZyBMaW51eCBuZXR3b3JrCisgKiBpbnRlcmZhY2UgcmVnaXN0cmF0aW9uLiAgUmV0dXJuaW5nIGFueXRoaW5nIGJ1dCB6ZXJvIHdpbGwgZmFpbCBpbnRlcmZhY2UKKyAqIHJlZ2lzdHJhdGlvbi4KKyAqLworc3RhdGljIGludCBpZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisJc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiA9ICZjYXJkLT53YW5kZXY7CisJCisJLyogTk9URTogTW9zdCBvZiB0aGUgZGV2IGluaXRpYWxpemF0aW9uIHdhcworICAgICAgICAgKiAgICAgICBkb25lIGluIHNwcHBfYXR0YWNoKCksIGNhbGxlZCBieSBuZXdfaWYoKSAKKyAgICAgICAgICogICAgICAgZnVuY3Rpb24uIEFsbCB3ZSBoYXZlIHRvIGRvIGhlcmUgaXMKKyAgICAgICAgICogICAgICAgdG8gbGluayBmb3VyIG1ham9yIHJvdXRpbmVzIGJlbG93LiAKKyAgICAgICAgICovCisKKwkvKiBJbml0aWFsaXplIGRldmljZSBkcml2ZXIgZW50cnkgcG9pbnRzICovCisJZGV2LT5vcGVuCQk9ICZpZl9vcGVuOworCWRldi0+c3RvcAkJPSAmaWZfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSAmaWZfc2VuZDsKKwlkZXYtPmdldF9zdGF0cwkJPSAmaWZfc3RhdHM7CisJZGV2LT50eF90aW1lb3V0CQk9ICZpZl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOworCisKKwkvKiBJbml0aWFsaXplIGhhcmR3YXJlIHBhcmFtZXRlcnMgKi8KKwlkZXYtPmlycQk9IHdhbmRldi0+aXJxOworCWRldi0+ZG1hCT0gd2FuZGV2LT5kbWE7CisJZGV2LT5iYXNlX2FkZHIJPSB3YW5kZXYtPmlvcG9ydDsKKwlkZXYtPm1lbV9zdGFydAk9IHdhbmRldi0+bWFkZHI7CisJZGV2LT5tZW1fZW5kCT0gd2FuZGV2LT5tYWRkciArIHdhbmRldi0+bXNpemUgLSAxOworCisJLyogU2V0IHRyYW5zbWl0IGJ1ZmZlciBxdWV1ZSBsZW5ndGggCisgICAgICAgICAqIElmIHdlIG92ZXIgZmlsbCB0aGlzIHF1ZXVlIHRoZSBwYWNrZXRzIHdpbGwKKyAgICAgICAgICogYmUgZHJvcGVkIGJ5IHRoZSBrZXJuZWwuCisgICAgICAgICAqIHNwcHBfYXR0YWNoKCkgc2V0cyB0aGlzIHRvIDEwLCBidXQKKyAgICAgICAgICogMTAwIHdpbGwgZ2l2ZSB1cyBtb3JlIHJvb20gYXQgbG93IHNwZWVkcy4KKwkgKi8KKyAgICAgICAgZGV2LT50eF9xdWV1ZV9sZW4gPSAxMDA7CisgICAKKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEhhbmRsZSB0cmFuc21pdCB0aW1lb3V0IGV2ZW50IGZyb20gbmV0aWYgd2F0Y2hkb2cKKyAqLworc3RhdGljIHZvaWQgaWZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIAljaGRsY19wcml2YXRlX2FyZWFfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBjaGFuLT5jYXJkOworCQorCS8qIElmIG91ciBkZXZpY2Ugc3RheXMgYnVzeSBmb3IgYXQgbGVhc3QgNSBzZWNvbmRzIHRoZW4gd2Ugd2lsbAorCSAqIGtpY2sgc3RhcnQgdGhlIGRldmljZSBieSBtYWtpbmcgZGV2LT50YnVzeSA9IDAuICBXZSBleHBlY3QKKwkgKiB0aGF0IG91ciBkZXZpY2UgbmV2ZXIgc3RheXMgYnVzeSBtb3JlIHRoYW4gNSBzZWNvbmRzLiBTbyB0aGlzICAgICAgICAgICAgICAgICAKKwkgKiBpcyBvbmx5IHVzZWQgYXMgYSBsYXN0IHJlc29ydC4KKwkgKi8KKworCSsrY2FyZC0+d2FuZGV2LnN0YXRzLmNvbGxpc2lvbnM7CisKKwlwcmludGsgKEtFUk5fSU5GTyAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dCBvbiAlc1xuIiwgY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOworCW5ldGlmX3dha2VfcXVldWUgKGRldik7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBPcGVuIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBlbmFibGUgY29tbXVuaWNhdGlvbnMgYW5kIGludGVycnVwdHMuCisgKiBvIHByZXZlbnQgbW9kdWxlIGZyb20gdW5sb2FkaW5nIGJ5IGluY3JlbWVudGluZyB1c2UgY291bnQKKyAqCisgKiBSZXR1cm4gMCBpZiBPLmsuIG9yIGVycm5vLgorICovCitzdGF0aWMgaW50IGlmX29wZW4oc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKworCS8qIE9ubHkgb25lIG9wZW4gcGVyIGludGVyZmFjZSBpcyBhbGxvd2VkICovCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIFN0YXJ0IFBQUCBMYXllciAqLworCWlmIChzcHBwX29wZW4oZGV2KSl7CisJCXJldHVybiAtRUlPOworCX0KKworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVyX3N0YXJ0X3RpbWUgPSB0di50dl9zZWM7CisgCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkKKwl3YW5waXBlX29wZW4oY2FyZCk7CisKKwljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9DT05GSUc7CisJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiB8PSBBUFBfSU5UX09OX1RJTUVSOworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENsb3NlIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBpZiB0aGlzIGlzIHRoZSBsYXN0IGNsb3NlLCB0aGVuIGRpc2FibGUgY29tbXVuaWNhdGlvbnMgYW5kIGludGVycnVwdHMuCisgKiBvIHJlc2V0IGZsYWdzLgorICovCitzdGF0aWMgaW50IGlmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisKKwkvKiBTdG9wIHRoZSBQUFAgTGF5ZXIgKi8KKwlzcHBwX2Nsb3NlKGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJd2FucGlwZV9jbG9zZShjYXJkKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgcGFja2V0IG9uIGEgbmV0d29yayBpbnRlcmZhY2UuCisgKiBvIHNldCB0YnVzeSBmbGFnIChtYXJrcyBzdGFydCBvZiB0aGUgdHJhbnNtaXNzaW9uKSB0byBibG9jayBhIHRpbWVyLWJhc2VkCisgKiAgIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuCisgKiBvIGNoZWNrIGxpbmsgc3RhdGUuIElmIGxpbmsgaXMgbm90IHVwLCB0aGVuIGRyb3AgdGhlIHBhY2tldC4KKyAqIG8gZXhlY3V0ZSBhZGFwdGVyIHNlbmQgY29tbWFuZC4KKyAqIG8gZnJlZSBzb2NrZXQgYnVmZmVyCisgKgorICogUmV0dXJuOgkwCWNvbXBsZXRlIChzb2NrZXQgYnVmZmVyIG11c3QgYmUgZnJlZWQpCisgKgkJbm9uLTAJcGFja2V0IG1heSBiZSByZS10cmFuc21pdHRlZCAodGJ1c3kgbXVzdCBiZSBzZXQpCisgKgorICogTm90ZXM6CisgKiAxLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGVpdGhlciBieSB0aGUgcHJvdG9jb2wgc3RhY2sgb3IgYnkgdGhlICJuZXQKKyAqICAgIGJvdHRvbSBoYWxmIiAod2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQpLgorICogMi4gU2V0dGluZyB0YnVzeSBmbGFnIHdpbGwgaW5oaWJpdCBmdXJ0aGVyIHRyYW5zbWl0IHJlcXVlc3RzIGZyb20gdGhlCisgKiAgICBwcm90b2NvbCBzdGFjayBhbmQgY2FuIGJlIHVzZWQgZm9yIGZsb3cgY29udHJvbCB3aXRoIHByb3RvY29sIGxheWVyLgorICovCitzdGF0aWMgaW50IGlmX3NlbmQoc3RydWN0IHNrX2J1ZmYqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwljaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwlJTlRFUlJVUFRfSU5GT1JNQVRJT05fU1RSVUNUICpjaGRsY19pbnQgPSAmZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdDsKKwlpbnQgdWRwX3R5cGUgPSAwOworCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzOworCWludCBlcnI9MDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQorCWlmIChza2IgPT0gTlVMTCl7CisJCS8qIElmIHdlIGdldCBoZXJlLCBzb21lIGhpZ2hlciBsYXllciB0aGlua3Mgd2UndmUgbWlzc2VkIGFuCisJCSAqIHR4LWRvbmUgaW50ZXJydXB0LgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlY2VpdmVkIE5VTEwgc2tiIGJ1ZmZlciEgaW50ZXJmYWNlICVzIGdvdCBraWNrZWQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXJldHVybiAwOworCX0KKworICAgCWlmIChudG9ocyhza2ItPnByb3RvY29sKSAhPSBodG9ucyhQVkNfUFJPVCkpeworCQkvKiBjaGVjayB0aGUgdWRwIHBhY2tldCB0eXBlICovCisJCQorCQl1ZHBfdHlwZSA9IHVkcF9wa3RfdHlwZShza2IsIGNhcmQpOworCQlpZiAodWRwX3R5cGUgPT0gVURQX0NQSVBFX1RZUEUpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RvcmVfdWRwX21nbXRfcGt0KFVEUF9QS1RfRlJNX1NUQUNLLCBjYXJkLCBza2IsIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hkbGNfcHJpdl9hcmVhKSl7CisJCQkJY2hkbGNfaW50LT5pbnRlcnJ1cHRfcGVybWlzc2lvbiB8PQorCQkJCQlBUFBfSU5UX09OX1RJTUVSOworCQkJfQorCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisgICAgICAgIH0KKworCS8qIExvY2sgdGhlIDUwOCBDYXJkOiBTTVAgaXMgc3VwcG9ydGVkICovCisgICAgICAJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCQlzNTA4X2xvY2soY2FyZCwmc21wX2ZsYWdzKTsKKwl9IAorCisgICAgCWlmICh0ZXN0X2FuZF9zZXRfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENyaXRpY2FsIGluIGlmX3NlbmQ6ICVseFxuIiwKKwkJCQkJY2FyZC0+d2FuZGV2Lm5hbWUsY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKyAgICAgICAgICAgICAgICArK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlnb3RvIGlmX3NlbmRfY3JpdF9leGl0OworCX0KKworCWlmIChjYXJkLT53YW5kZXYuc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCl7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCWdvdG8gaWZfc2VuZF9jcml0X2V4aXQ7CisJfQorCQorCWlmIChjaGRsY19zZW5kKGNhcmQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pKXsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJfWVsc2V7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X3BhY2tldHM7CisgICAgICAgCQljYXJkLT53YW5kZXYuc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCX0JCisKK2lmX3NlbmRfY3JpdF9leGl0OgorCWlmICghKGVycj1uZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpKXsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX1lbHNleworCQljaGRsY19wcml2X2FyZWEtPnRpY2tfY291bnRlciA9IGppZmZpZXM7CisJCWNoZGxjX2ludC0+aW50ZXJydXB0X3Blcm1pc3Npb24gfD0gQVBQX0lOVF9PTl9UWF9GUkFNRTsKKwl9CisKKwljbGVhcl9iaXQoU0VORF9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCQlzNTA4X3VubG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXBseSB0byBVRFAgTWFuYWdlbWVudCBzeXN0ZW0uCisgKiBSZXR1cm4gbGVuZ3RoIG9mIHJlcGx5LgorICovCitzdGF0aWMgaW50IHJlcGx5X3VkcCggdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG1ib3hfbGVuICkKK3sKKworCXVuc2lnbmVkIHNob3J0IGxlbiwgdWRwX2xlbmd0aCwgdGVtcCwgaXBfbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgaXBfdGVtcDsKKwlpbnQgZXZlbl9ib3VuZCA9IDA7CisgIAljaGRsY191ZHBfcGt0X3QgKmNfdWRwX3BrdCA9IChjaGRsY191ZHBfcGt0X3QgKilkYXRhOworCSAKKwkvKiBTZXQgbGVuZ3RoIG9mIHBhY2tldCAqLworCWxlbiA9IHNpemVvZihpcF9wa3RfdCkrIAorCSAgICAgIHNpemVvZih1ZHBfcGt0X3QpKworCSAgICAgIHNpemVvZih3cF9tZ210X3QpKworCSAgICAgIHNpemVvZihjYmxvY2tfdCkrCisJICAgICAgc2l6ZW9mKHRyYWNlX2luZm9fdCkrIAorCSAgICAgIG1ib3hfbGVuOworCisJLyogZmlsbCBpbiBVRFAgcmVwbHkgKi8KKwljX3VkcF9wa3QtPndwX21nbXQucmVxdWVzdF9yZXBseSA9IFVEUE1HTVRfUkVQTFk7CisgICAKKwkvKiBmaWxsIGluIFVEUCBsZW5ndGggKi8KKwl1ZHBfbGVuZ3RoID0gc2l6ZW9mKHVkcF9wa3RfdCkrIAorCQkgICAgIHNpemVvZih3cF9tZ210X3QpKworCQkgICAgIHNpemVvZihjYmxvY2tfdCkrCisJICAgICAgICAgICAgIHNpemVvZih0cmFjZV9pbmZvX3QpKworCQkgICAgIG1ib3hfbGVuOyAKKworIAkvKiBwdXQgaXQgb24gYW4gZXZlbiBib3VuZGFyeSAqLworCWlmICggdWRwX2xlbmd0aCAmIDB4MDAwMSApIHsKKwkJdWRwX2xlbmd0aCArPSAxOworCQlsZW4gKz0gMTsKKwkJZXZlbl9ib3VuZCA9IDE7CisJfSAgCisKKwl0ZW1wID0gKHVkcF9sZW5ndGg8PDgpfCh1ZHBfbGVuZ3RoPj44KTsKKwljX3VkcF9wa3QtPnVkcF9wa3QudWRwX2xlbmd0aCA9IHRlbXA7CisJCSAKKwkvKiBzd2FwIFVEUCBwb3J0cyAqLworCXRlbXAgPSBjX3VkcF9wa3QtPnVkcF9wa3QudWRwX3NyY19wb3J0OworCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfc3JjX3BvcnQgPSAKKwkJCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQ7IAorCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQgPSB0ZW1wOworCisJLyogYWRkIFVEUCBwc2V1ZG8gaGVhZGVyICovCisJdGVtcCA9IDB4MTEwMDsKKwkqKCh1bnNpZ25lZCBzaG9ydCAqKShjX3VkcF9wa3QtPmRhdGErbWJveF9sZW4rZXZlbl9ib3VuZCkpID0gdGVtcDsJCisJdGVtcCA9ICh1ZHBfbGVuZ3RoPDw4KXwodWRwX2xlbmd0aD4+OCk7CisJKigodW5zaWduZWQgc2hvcnQgKikoY191ZHBfcGt0LT5kYXRhK21ib3hfbGVuK2V2ZW5fYm91bmQrMikpID0gdGVtcDsKKworCQkgCisJLyogY2FsY3VsYXRlIFVEUCBjaGVja3N1bSAqLworCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfY2hlY2tzdW0gPSAwOworCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfY2hlY2tzdW0gPSBjYWxjX2NoZWNrc3VtKCZkYXRhW1VEUF9PRkZTRVRdLHVkcF9sZW5ndGgrVURQX09GRlNFVCk7CisKKwkvKiBmaWxsIGluIElQIGxlbmd0aCAqLworCWlwX2xlbmd0aCA9IGxlbjsKKwl0ZW1wID0gKGlwX2xlbmd0aDw8OCl8KGlwX2xlbmd0aD4+OCk7CisJY191ZHBfcGt0LT5pcF9wa3QudG90YWxfbGVuZ3RoID0gdGVtcDsKKyAgCisJLyogc3dhcCBJUCBhZGRyZXNzZXMgKi8KKwlpcF90ZW1wID0gY191ZHBfcGt0LT5pcF9wa3QuaXBfc3JjX2FkZHJlc3M7CisJY191ZHBfcGt0LT5pcF9wa3QuaXBfc3JjX2FkZHJlc3MgPSBjX3VkcF9wa3QtPmlwX3BrdC5pcF9kc3RfYWRkcmVzczsKKwljX3VkcF9wa3QtPmlwX3BrdC5pcF9kc3RfYWRkcmVzcyA9IGlwX3RlbXA7CisKKwkvKiBmaWxsIGluIElQIGNoZWNrc3VtICovCisJY191ZHBfcGt0LT5pcF9wa3QuaGRyX2NoZWNrc3VtID0gMDsKKwljX3VkcF9wa3QtPmlwX3BrdC5oZHJfY2hlY2tzdW0gPSBjYWxjX2NoZWNrc3VtKGRhdGEsc2l6ZW9mKGlwX3BrdF90KSk7CisKKwlyZXR1cm4gbGVuOworCit9IC8qIHJlcGx5X3VkcCAqLworCit1bnNpZ25lZCBzaG9ydCBjYWxjX2NoZWNrc3VtIChjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIHNob3J0IHRlbXA7IAorCXVuc2lnbmVkIGxvbmcgc3VtPTA7CisJaW50IGk7CisKKwlmb3IoIGkgPSAwOyBpIDxsZW47IGkrPTIgKSB7CisJCW1lbWNweSgmdGVtcCwmZGF0YVtpXSwyKTsKKwkJc3VtICs9ICh1bnNpZ25lZCBsb25nKXRlbXA7CisJfQorCisJd2hpbGUgKHN1bSA+PiAxNiApIHsKKwkJc3VtID0gKHN1bSAmIDB4ZmZmZlVMKSArIChzdW0gPj4gMTYpOworCX0KKworCXRlbXAgPSAodW5zaWduZWQgc2hvcnQpc3VtOworCXRlbXAgPSB+dGVtcDsKKworCWlmKCB0ZW1wID09IDAgKSAKKwkJdGVtcCA9IDB4ZmZmZjsKKworCXJldHVybiB0ZW1wOwkKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdldCBldGhlcm5ldC1zdHlsZSBpbnRlcmZhY2Ugc3RhdGlzdGljcy4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gc3RydWN0IGVuZXRfc3RhdGlzdGljcy4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiBpZl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXNkbGFfdCAqbXlfY2FyZDsKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhOworCisJLyogU2h1dGRvd24gYnVnIGZpeC4gSW4gZGVsX2lmKCkgd2Uga2lsbAorICAgICAgICAgKiBkZXYtPnByaXYgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiwgZ2V0cworICAgICAgICAgKiBjYWxsZWQgYWZ0ZXIgZGVsX2lmKCksIHRodXMgY2hlY2sKKyAgICAgICAgICogaWYgcG9pbnRlciBoYXMgYmVlbiBkZWxldGVkICovCisJaWYgKChjaGRsY19wcml2X2FyZWE9ZGV2LT5wcml2KSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW15X2NhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisJcmV0dXJuICZteV9jYXJkLT53YW5kZXYuc3RhdHM7IAorfQorCisKKy8qKioqKiogQ2lzY28gSERMQyBGaXJtd2FyZSBJbnRlcmZhY2UgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBmaXJtd2FyZSBjb2RlIHZlcnNpb24uCisgKglQdXQgY29kZSB2ZXJzaW9uIGFzIEFTQ0lJIHN0cmluZyBpbiBzdHIuIAorICovCitzdGF0aWMgaW50IGNoZGxjX3JlYWRfdmVyc2lvbiAoc2RsYV90KiBjYXJkLCBjaGFyKiBzdHIpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKwlpbnQgbGVuOworCWNoYXIgZXJyOworCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ERV9WRVJTSU9OOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKworCWlmKGVyciAhPSBDT01NQU5EX09LKSB7CisJCWNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKwl9CisJZWxzZSBpZiAoc3RyKSB7ICAvKiBpcyBub3QgbnVsbCAqLworCQlsZW4gPSBtYi0+YnVmZmVyX2xlbmd0aDsKKwkJbWVtY3B5KHN0ciwgbWItPmRhdGEsIGxlbik7CisJCXN0cltsZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIChlcnIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgQ29uZmlndXJlIENIRExDIGZpcm13YXJlLgorICovCitzdGF0aWMgaW50IGNoZGxjX2NvbmZpZ3VyZSAoc2RsYV90KiBjYXJkLCB2b2lkKiBkYXRhKQoreworCWludCBlcnI7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QgKm1haWxib3ggPSBjYXJkLT5tYm94OworCWludCBkYXRhX2xlbmd0aCA9IHNpemVvZihDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCk7CisJCisJbWFpbGJveC0+YnVmZmVyX2xlbmd0aCA9IGRhdGFfbGVuZ3RoOyAgCisJbWVtY3B5KG1haWxib3gtPmRhdGEsIGRhdGEsIGRhdGFfbGVuZ3RoKTsKKwltYWlsYm94LT5jb21tYW5kID0gU0VUX0NIRExDX0NPTkZJR1VSQVRJT047CisJZXJyID0gc2RsYV9leGVjKG1haWxib3gpID8gbWFpbGJveC0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwkKKwlpZiAoZXJyICE9IENPTU1BTkRfT0spIGNoZGxjX2Vycm9yIChjYXJkLCBlcnIsIG1haWxib3gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJcmV0dXJuIGVycjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBpbnRlcnJ1cHQgbW9kZSAtLSBIRExDIFZlcnNpb24uCisgKi8KKworc3RhdGljIGludCBjaGRsY19zZXRfaW50cl9tb2RlIChzZGxhX3QqIGNhcmQsIHVuc2lnbmVkIG1vZGUpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKwlDSERMQ19JTlRfVFJJR0dFUlNfU1RSVUNUKiBpbnRfZGF0YSA9CisJCSAoQ0hETENfSU5UX1RSSUdHRVJTX1NUUlVDVCAqKW1iLT5kYXRhOworCWludCBlcnI7CisKKwlpbnRfZGF0YS0+Q0hETENfaW50ZXJydXB0X3RyaWdnZXJzIAk9IG1vZGU7CisJaW50X2RhdGEtPklSUQkJCQk9IGNhcmQtPmh3LmlycTsKKwlpbnRfZGF0YS0+aW50ZXJydXB0X3RpbWVyICAgICAgICAgICAgICAgPSAxOworICAgCisJbWItPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoQ0hETENfSU5UX1RSSUdHRVJTX1NUUlVDVCk7CisJbWItPmNvbW1hbmQgPSBTRVRfQ0hETENfSU5URVJSVVBUX1RSSUdHRVJTOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyICE9IENPTU1BTkRfT0spCisJCWNoZGxjX2Vycm9yIChjYXJkLCBlcnIsIG1iKTsKKwlyZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRW5hYmxlIGNvbW11bmljYXRpb25zLgorICovCisKK3N0YXRpYyBpbnQgY2hkbGNfY29tbV9lbmFibGUgKHNkbGFfdCogY2FyZCkKK3sKKwlpbnQgZXJyOworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisKKwltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJbWItPmNvbW1hbmQgPSBFTkFCTEVfQ0hETENfQ09NTVVOSUNBVElPTlM7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCWlmIChlcnIgIT0gQ09NTUFORF9PSykKKwkJY2hkbGNfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisJZWxzZQorCQljYXJkLT51LmMuY29tbV9lbmFibGVkPTE7CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERpc2FibGUgY29tbXVuaWNhdGlvbnMgYW5kIERyb3AgdGhlIE1vZGVtIGxpbmVzIChEQ0QgYW5kIFJUUykuCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfY29tbV9kaXNhYmxlIChzZGxhX3QqIGNhcmQpCit7CisJaW50IGVycjsKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCisJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCW1iLT5jb21tYW5kID0gRElTQUJMRV9DSERMQ19DT01NVU5JQ0FUSU9OUzsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJaWYgKGVyciAhPSBDT01NQU5EX09LKQorCQljaGRsY19lcnJvcihjYXJkLGVycixtYik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgY29tbXVuaWNhdGlvbiBlcnJvciBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IGNoZGxjX3JlYWRfY29tbV9lcnJfc3RhdHMgKHNkbGFfdCogY2FyZCkKK3sKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKworICAgICAgICBtYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisgICAgICAgIG1iLT5jb21tYW5kID0gUkVBRF9DT01NU19FUlJPUl9TVEFUUzsKKyAgICAgICAgZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworICAgICAgICBpZiAoZXJyICE9IENPTU1BTkRfT0spCisgICAgICAgICAgICAgICAgY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworICAgICAgICByZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBDSERMQyBvcGVyYXRpb25hbCBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IGNoZGxjX3JlYWRfb3Bfc3RhdHMgKHNkbGFfdCogY2FyZCkKK3sKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKworICAgICAgICBtYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisgICAgICAgIG1iLT5jb21tYW5kID0gUkVBRF9DSERMQ19PUEVSQVRJT05BTF9TVEFUUzsKKyAgICAgICAgZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworICAgICAgICBpZiAoZXJyICE9IENPTU1BTkRfT0spCisgICAgICAgICAgICAgICAgY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworICAgICAgICByZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXBkYXRlIGNvbW11bmljYXRpb25zIGVycm9yIGFuZCBnZW5lcmFsIHBhY2tldCBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IHVwZGF0ZV9jb21tc19zdGF0cyhzZGxhX3QqIGNhcmQsCisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSkKK3sKKyAgICAgICAgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKyAgCUNPTU1TX0VSUk9SX1NUQVRTX1NUUlVDVCogZXJyX3N0YXRzOworICAgICAgICBDSERMQ19PUEVSQVRJT05BTF9TVEFUU19TVFJVQ1QgKm9wX3N0YXRzOworCisJLyogb24gdGhlIGZpcnN0IHRpbWVyIGludGVycnVwdCwgcmVhZCB0aGUgY29tbXMgZXJyb3Igc3RhdGlzdGljcyAqLworCWlmKGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID09IDIpIHsKKwkJaWYoY2hkbGNfcmVhZF9jb21tX2Vycl9zdGF0cyhjYXJkKSkKKwkJCXJldHVybiAxOworCQllcnJfc3RhdHMgPSAoQ09NTVNfRVJST1JfU1RBVFNfU1RSVUNUICopbWItPmRhdGE7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IAorCQkJCWVycl9zdGF0cy0+Unhfb3ZlcnJ1bl9lcnJfY291bnQ7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9jcmNfZXJyb3JzID0gCisJCQkJZXJyX3N0YXRzLT5DUkNfZXJyX2NvdW50OworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfZnJhbWVfZXJyb3JzID0gCisJCQkJZXJyX3N0YXRzLT5SeF9hYm9ydF9jb3VudDsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gCisJCQkJZXJyX3N0YXRzLT5SeF9kaXNfcHJpX2JmcnNfZnVsbF9jb3VudDsgCisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0KKwkJCQljYXJkLT53YW5kZXYuc3RhdHMucnhfZmlmb19lcnJvcnM7CisJCWNhcmQtPndhbmRldi5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9CisJCQkJZXJyX3N0YXRzLT5zZWNfVHhfYWJvcnRfY291bnQ7CisJfQorCisgICAgICAgIC8qIG9uIHRoZSBzZWNvbmQgdGltZXIgaW50ZXJydXB0LCByZWFkIHRoZSBvcGVyYXRpb25hbCBzdGF0aXN0aWNzICovCisJZWxzZSB7CisgICAgICAgIAlpZihjaGRsY19yZWFkX29wX3N0YXRzKGNhcmQpKQorICAgICAgICAgICAgICAgIAlyZXR1cm4gMTsKKwkJb3Bfc3RhdHMgPSAoQ0hETENfT1BFUkFUSU9OQUxfU1RBVFNfU1RSVUNUICopbWItPmRhdGE7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0KKwkJCShvcF9zdGF0cy0+UnhfRGF0YV9kaXNjYXJkX3Nob3J0X2NvdW50ICsKKwkJCW9wX3N0YXRzLT5SeF9EYXRhX2Rpc2NhcmRfbG9uZ19jb3VudCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBwYWNrZXQuCisgKglSZXR1cm46CTAgLSBvLmsuCisgKgkJMSAtIG5vIHRyYW5zbWl0IGJ1ZmZlcnMgYXZhaWxhYmxlCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfc2VuZCAoc2RsYV90KiBjYXJkLCB2b2lkKiBkYXRhLCB1bnNpZ25lZCBsZW4pCit7CisJQ0hETENfREFUQV9UWF9TVEFUVVNfRUxfU1RSVUNUICp0eGJ1ZiA9IGNhcmQtPnUuYy50eGJ1ZjsKKworCWlmICh0eGJ1Zi0+b3BwX2ZsYWcpCisJCXJldHVybiAxOworCQorCXNkbGFfcG9rZSgmY2FyZC0+aHcsIHR4YnVmLT5wdHJfZGF0YV9iZnIsIGRhdGEsIGxlbik7CisKKwl0eGJ1Zi0+ZnJhbWVfbGVuZ3RoID0gbGVuOworCXR4YnVmLT5vcHBfZmxhZyA9IDE7CQkvKiBzdGFydCB0cmFuc21pc3Npb24gKi8KKwkKKwkvKiBVcGRhdGUgdHJhbnNtaXQgYnVmZmVyIGNvbnRyb2wgZmllbGRzICovCisJY2FyZC0+dS5jLnR4YnVmID0gKyt0eGJ1ZjsKKworCWlmICgodm9pZCopdHhidWYgPiBjYXJkLT51LmMudHhidWZfbGFzdCkKKwkJY2FyZC0+dS5jLnR4YnVmID0gY2FyZC0+dS5jLnR4YnVmX2Jhc2U7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKiBGaXJtd2FyZSBFcnJvciBIYW5kbGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmlybXdhcmUgZXJyb3IgaGFuZGxlci4KKyAqCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgZmlybXdhcmUgY29tbWFuZCByZXR1cm5zIG5vbi16ZXJvCisgKglyZXR1cm4gY29kZS4KKyAqCisgKiBSZXR1cm4gemVybyBpZiBwcmV2aW91cyBjb21tYW5kIGhhcyB0byBiZSBjYW5jZWxsZWQuCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfZXJyb3IgKHNkbGFfdCAqY2FyZCwgaW50IGVyciwgQ0hETENfTUFJTEJPWF9TVFJVQ1QgKm1iKQoreworCXVuc2lnbmVkIGNtZCA9IG1iLT5jb21tYW5kOworCisJc3dpdGNoIChlcnIpIHsKKworCWNhc2UgQ01EX1RJTUVPVVQ6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbW1hbmQgMHglMDJYIHRpbWVkIG91dCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjbWQpOworCQlicmVhazsKKworCWNhc2UgUzUxNF9CT1RIX1BPUlRTX1NBTUVfQ0xLX01PREU6CisJCWlmKGNtZCA9PSBTRVRfQ0hETENfQ09ORklHVVJBVElPTikgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICIlczogQ29uZmlndXJlIGJvdGggcG9ydHMgZm9yIHRoZSBzYW1lIGNsb2NrIHNvdXJjZVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICIlczogY29tbWFuZCAweCUwMlggcmV0dXJuZWQgMHglMDJYIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGNtZCwgZXJyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKiBJbnRlcnJ1cHQgSGFuZGxlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2lzY28gSERMQyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgorICovCitTVEFUSUMgdm9pZCB3c3BwcF9pc3IgKHNkbGFfdCogY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QqIGZsYWdzID0gTlVMTDsKKwlpbnQgaTsKKwlzZGxhX3QgKm15X2NhcmQ7CisKKworCS8qIENoZWNrIGZvciB3aGljaCBwb3J0IHRoZSBpbnRlcnJ1cHQgaGFzIGJlZW4gZ2VuZXJhdGVkCisJICogU2luY2UgU2Vjb25kYXJ5IFBvcnQgaXMgcGlnZ3liYWNraW5nIG9uIHRoZSBQcmltYXJ5CisgICAgICAgICAqIHRoZSBjaGVjayBtdXN0IGJlIGRvbmUgaGVyZS4gCisJICovCisKKwlmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwlpZiAoIWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3R5cGUpeworCQkvKiBDaGVjayBmb3IgYSBzZWNvbmQgcG9ydCAocGlnZ3liYWNraW5nKSAqLworCQlpZigobXlfY2FyZCA9IGNhcmQtPm5leHQpKXsKKwkJCWZsYWdzID0gbXlfY2FyZC0+dS5jLmZsYWdzOworCQkJaWYgKGZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3R5cGUpeworCQkJCWNhcmQgPSBteV9jYXJkOworCQkJCWNhcmQtPmlzcihjYXJkKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisKKwlkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCWNhcmQtPmluX2lzciA9IDE7CisJZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisJCQorCS8qIElmIHdlIGdldCBhbiBpbnRlcnJ1cHQgd2l0aCBubyBuZXR3b3JrIGRldmljZSwgc3RvcCB0aGUgaW50ZXJydXB0cworCSAqIGFuZCBpc3N1ZSBhbiBlcnJvciAqLworCWlmICgoIWRldiB8fCAhZGV2LT5wcml2KSAmJiBmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlICE9IAorCSAgICAJQ09NTUFORF9DT01QTEVURV9BUFBfSU5UX1BFTkQpeworCQlnb3RvIGlzcl9kb25lOworCX0KKworCQorCS8qIGlmIGNyaXRpY2FsIGR1ZSB0byBwZXJpcGhlcmFsIG9wZXJhdGlvbnMKKwkgKiBpZS4gdXBkYXRlKCkgb3IgZ2V0c3RhdHMoKSB0aGVuIHJlc2V0IHRoZSBpbnRlcnJ1cHQgYW5kCisJICogd2FpdCBmb3IgdGhlIGJvYXJkIHRvIHJldHJpZ2dlci4KKwkgKi8KKwlpZih0ZXN0X2JpdChQRVJJX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSkgeworCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LgorCQkJCQlpbnRlcnJ1cHRfdHlwZSA9IDA7CisJCWdvdG8gaXNyX2RvbmU7CisJfQorCisKKwkvKiBPbiBhIDUwOCBDYXJkLCBpZiBjcml0aWNhbCBkdWUgdG8gaWZfc2VuZCAKKyAgICAgICAgICogTWFqb3IgRXJyb3IgISEhCisJICovCisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpIHsKKwkJaWYodGVzdF9iaXQoMCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ3JpdGljYWwgd2hpbGUgaW4gSVNSOiAlbHhcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJCWdvdG8gaXNyX2RvbmU7CisJCX0KKwl9CisKKwlzd2l0Y2goZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfdHlwZSkgeworCisJCWNhc2UgUlhfQVBQX0lOVF9QRU5EOgkvKiAweDAxOiByZWNlaXZlIGludGVycnVwdCAqLworCQkJcnhfaW50cihjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVFhfQVBQX0lOVF9QRU5EOgkvKiAweDAyOiB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKwkJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gJj0KKwkJCQkgfkFQUF9JTlRfT05fVFhfRlJBTUU7CisKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ09NTUFORF9DT01QTEVURV9BUFBfSU5UX1BFTkQ6LyogMHgwNDogY21kIGNwbHQgKi8KKwkJCSsrIEludHJfdGVzdF9jb3VudGVyOworCQkJYnJlYWs7CisKKwkJY2FzZSBDSERMQ19FWENFUF9DT05EX0FQUF9JTlRfUEVORDoJLyogMHgyMCAqLworCQkJcHJvY2Vzc19jaGRsY19leGNlcHRpb24oY2FyZCk7CisJCQlicmVhazsKKworCQljYXNlIEdMT0JBTF9FWENFUF9DT05EX0FQUF9JTlRfUEVORDoKKwkJCXByb2Nlc3NfZ2xvYmFsX2V4Y2VwdGlvbihjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVElNRVJfQVBQX0lOVF9QRU5EOgorCQkJdGltZXJfaW50cihjYXJkKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogc3B1cmlvdXMgaW50ZXJydXB0IDB4JTAyWCFcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsCisJCQkJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfdHlwZSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJDb2RlIG5hbWU6ICIpOworCQkJZm9yKGkgPSAwOyBpIDwgNDsgaSArKykKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlYyIsCisJCQkJCWZsYWdzLT5nbG9iYWxfaW5mb19zdHJ1Y3QuY29kZW5hbWVbaV0pOyAKKwkJCXByaW50ayhLRVJOX0lORk8gIlxuQ29kZSB2ZXJzaW9uOiAiKTsKKwkJCWZvcihpID0gMDsgaSA8IDQ7IGkgKyspCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJWMiLCAKKwkJCQkJZmxhZ3MtPmdsb2JhbF9pbmZvX3N0cnVjdC5jb2RldmVyc2lvbltpXSk7IAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsJCisJCQlicmVhazsKKwl9CisKK2lzcl9kb25lOgorCWNhcmQtPmluX2lzciA9IDA7CisJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfdHlwZSA9IDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVjZWl2ZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgcnhfaW50ciAoc2RsYV90KiBjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKmNoZGxjX3ByaXZfYXJlYTsKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwlDSERMQ19EQVRBX1JYX1NUQVRVU19FTF9TVFJVQ1QgKnJ4YnVmID0gY2FyZC0+dS5jLnJ4bWI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsZW47CisJdW5zaWduZWQgYWRkciA9IHJ4YnVmLT5wdHJfZGF0YV9iZnI7CisJdm9pZCAqYnVmOworCWludCBpLHVkcF90eXBlOworCQorCWlmIChyeGJ1Zi0+b3BwX2ZsYWcgIT0gMHgwMSkgeworCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBjb3JydXB0ZWQgUnggYnVmZmVyIEAgMHglWCwgZmxhZyA9IDB4JTAyWCFcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSwgKHVuc2lnbmVkKXJ4YnVmLCByeGJ1Zi0+b3BwX2ZsYWcpOworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIkNvZGUgbmFtZTogIik7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSArKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MtPmdsb2JhbF9pbmZvX3N0cnVjdC5jb2RlbmFtZVtpXSk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiXG5Db2RlIHZlcnNpb246ICIpOworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkgKyspCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLT5nbG9iYWxfaW5mb19zdHJ1Y3QuY29kZXZlcnNpb25baV0pOworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlxuIik7CisKKworCQkvKiBCdWcgRml4OiBNYXIgNiAyMDAwCisgICAgICAgICAgICAgICAgICogSWYgd2UgZ2V0IGEgY29ycnVwdGVkIG1haWxib3gsIGl0IG1lYXNuIHRoYXQgZHJpdmVyIAorICAgICAgICAgICAgICAgICAqIGlzIG91dCBvZiBzeW5jIHdpdGggdGhlIGZpcm13YXJlLiBUaGVyZSBpcyBubyByZWNvdmVyeS4KKyAgICAgICAgICAgICAgICAgKiBJZiB3ZSBkb24ndCB0dXJuIG9mZiBhbGwgaW50ZXJydXB0cyBmb3IgdGhpcyBjYXJkCisgICAgICAgICAgICAgICAgICogdGhlIG1hY2hpbmUgd2lsbCBjcmFzaC4gCisgICAgICAgICAgICAgICAgICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCByb3V0ZXIgZmFpbHVyZSAuLi4hISFcbiIsIGNhcmQtPmRldm5hbWUpOworCQlwcmludGsoS0VSTl9JTkZPICJQbGVhc2UgY29udGFjdCBTYW5nb21hIFRlY2hub2xvZ2llcyAhXG4iKTsKKwkJY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLDApOwkKKwkJcmV0dXJuOworCX0KKworCWRldiA9IGNhcmQtPndhbmRldi5kZXY7CisKKwlpZiAoIWRldil7IAorCQlnb3RvIHJ4X2V4aXQ7CisJfQorCQorCWlmICghbmV0aWZfcnVubmluZyhkZXYpKXsKKwkJZ290byByeF9leGl0OworCX0KKworCWNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKworCWlmIChyeGJ1Zi0+ZXJyb3JfZmxhZyl7CQorCQlnb3RvIHJ4X2V4aXQ7CisJfQorCS8qIFRha2Ugb2ZmIHR3byBDUkMgYnl0ZXMgKi8KKworCWlmIChyeGJ1Zi0+ZnJhbWVfbGVuZ3RoIDwgNyB8fCByeGJ1Zi0+ZnJhbWVfbGVuZ3RoID4gMTUwNiApeworCQlnb3RvIHJ4X2V4aXQ7CisJfQkKKworCWxlbiA9IHJ4YnVmLT5mcmFtZV9sZW5ndGggLSBDUkNfTEVOR1RIOworCisJLyogQWxsb2NhdGUgc29ja2V0IGJ1ZmZlciAqLworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKworCWlmIChza2IgPT0gTlVMTCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBzb2NrZXQgYnVmZmVycyBhdmFpbGFibGUhXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0KKwkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJZ290byByeF9leGl0OworCX0KKworCS8qIENvcHkgZGF0YSB0byB0aGUgc29ja2V0IGJ1ZmZlciAqLworCWlmKChhZGRyICsgbGVuKSA+IGNhcmQtPnUuYy5yeF90b3AgKyAxKSB7CisJCXVuc2lnbmVkIHRtcCA9IGNhcmQtPnUuYy5yeF90b3AgLSBhZGRyICsgMTsKKwkJYnVmID0gc2tiX3B1dChza2IsIHRtcCk7CisJCXNkbGFfcGVlaygmY2FyZC0+aHcsIGFkZHIsIGJ1ZiwgdG1wKTsKKwkJYWRkciA9IGNhcmQtPnUuYy5yeF9iYXNlOworCQlsZW4gLT0gdG1wOworCX0KKwkJCisJYnVmID0gc2tiX3B1dChza2IsIGxlbik7CisJc2RsYV9wZWVrKCZjYXJkLT5odywgYWRkciwgYnVmLCBsZW4pOworCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX1dBTl9QUFApOworCisJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X3BhY2tldHMgKys7CisJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCXVkcF90eXBlID0gdWRwX3BrdF90eXBlKCBza2IsIGNhcmQgKTsKKworCWlmKHVkcF90eXBlID09IFVEUF9DUElQRV9UWVBFKSB7CisJCWlmKHN0b3JlX3VkcF9tZ210X3BrdChVRFBfUEtUX0ZSTV9ORVRXT1JLLAorICAgCQkJCSAgICAgIGNhcmQsIHNrYiwgZGV2LCBjaGRsY19wcml2X2FyZWEpKSB7CisgICAgIAkJICAgICAgICBmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LgorCQkJCQkJaW50ZXJydXB0X3Blcm1pc3Npb24gfD0gCisJCQkJCQkJQVBQX0lOVF9PTl9USU1FUjsgCisJCX0KKwl9ZWxzZXsKKyAgICAgICAgICAgICAgIAkvKiBQYXNzIGl0IHVwIHRoZSBwcm90b2NvbCBzdGFjayAqLworICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgICAgIHNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7CisgICAgICAgICAgICAgICAgbmV0aWZfcngoc2tiKTsKKyAgICAgICAgICAgICAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCX0KKworcnhfZXhpdDoKKwkvKiBSZWxlYXNlIGJ1ZmZlciBlbGVtZW50IGFuZCBjYWxjdWxhdGUgYSBwb2ludGVyIHRvIHRoZSBuZXh0IG9uZSAqLworCXJ4YnVmLT5vcHBfZmxhZyA9IDB4MDA7CisJY2FyZC0+dS5jLnJ4bWIgPSArKyByeGJ1ZjsKKwlpZigodm9pZCopcnhidWYgPiBjYXJkLT51LmMucnhidWZfbGFzdCl7CisJCWNhcmQtPnUuYy5yeG1iID0gY2FyZC0+dS5jLnJ4YnVmX2Jhc2U7CisJfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRpbWVyIGludGVycnVwdCBoYW5kbGVyLgorICogVGhlIHRpbWVyIGludGVycnVwdCBpcyB1c2VkIGZvciB0d28gcHVycG9zZXM6CisgKiAgICAxKSBQcm9jZXNzaW5nIHVkcCBjYWxscyBmcm9tICdjcGlwZW1vbicuCisgKiAgICAyKSBSZWFkaW5nIGJvYXJkLWxldmVsIHN0YXRpc3RpY3MgZm9yIHVwZGF0aW5nIHRoZSBwcm9jIGZpbGUgc3lzdGVtLgorICovCit2b2lkIHRpbWVyX2ludHIoc2RsYV90ICpjYXJkKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworICAgICAgICBjaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhID0gTlVMTDsKKyAgICAgICAgU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCogZmxhZ3MgPSBOVUxMOworCisgICAgICAgIGRldiA9IGNhcmQtPndhbmRldi5kZXY7IAorICAgICAgICBjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisKKwlpZiAoY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9DT05GSUcpIHsKKwkJaWYgKCFjb25maWdfY2hkbGMoY2FyZCkpeworCQkJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX0NPTkZJRzsKKwkJfQorCX0KKwkKKwkvKiBwcm9jZXNzIGEgdWRwIGNhbGwgaWYgcGVuZGluZyAqLworICAgICAgIAlpZihjaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1VEUCkgeworICAgICAgICAgICAgICAgCXByb2Nlc3NfdWRwX21nbXRfcGt0KGNhcmQsIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hkbGNfcHJpdl9hcmVhKTsKKwkJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX1VEUDsKKyAgICAgICAgfQorCQorCisJLyogcmVhZCB0aGUgY29tbXVuaWNhdGlvbnMgc3RhdGlzdGljcyBpZiByZXF1aXJlZCAqLworCWlmKGNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVVBEQVRFKSB7CisJCXVwZGF0ZV9jb21tc19zdGF0cyhjYXJkLCBjaGRsY19wcml2X2FyZWEpOworICAgICAgICAgICAgICAgIGlmKCEoLS0gY2hkbGNfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMpKSB7CisJCQljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9IAorCQkJCX5UTVJfSU5UX0VOQUJMRURfVVBEQVRFOworCQl9CisgICAgICAgIH0KKworCS8qIG9ubHkgZGlzYWJsZSB0aGUgdGltZXIgaW50ZXJydXB0IGlmIHRoZXJlIGFyZSBubyB1ZHAgb3Igc3RhdGlzdGljICovCisJLyogdXBkYXRlcyBwZW5kaW5nICovCisgICAgICAgIGlmKCFjaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisgICAgICAgICAgICAgICAgZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiAmPQorICAgICAgICAgICAgICAgICAgICAgICAgfkFQUF9JTlRfT05fVElNRVI7CisgICAgICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTWlzY2VsbGFuZW91cyBGdW5jdGlvbnMKKwktIHNldF9jaGRsY19jb25maWcoKSB1c2VkIHRvIHNldCBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gdGhlIGJvYXJkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHNldF9jaGRsY19jb25maWcoc2RsYV90KiBjYXJkKQoreworCisJQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgY2ZnOworCisJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCkpOworCisJaWYoY2FyZC0+d2FuZGV2LmNsb2NraW5nKQorCQljZmcuYmF1ZF9yYXRlID0gY2FyZC0+d2FuZGV2LmJwczsKKworCWNmZy5saW5lX2NvbmZpZ19vcHRpb25zID0gKGNhcmQtPndhbmRldi5pbnRlcmZhY2UgPT0gV0FOT1BUX1JTMjMyKSA/CisJCUlOVEVSRkFDRV9MRVZFTF9SUzIzMiA6IElOVEVSRkFDRV9MRVZFTF9WMzU7CisKKwljZmcubW9kZW1fY29uZmlnX29wdGlvbnMJPSAwOworCS8vQVBJIE9QVElPTlMKKwljZmcuQ0hETENfQVBJX29wdGlvbnMJCT0gRElTQ0FSRF9SWF9FUlJPUl9GUkFNRVM7CisJY2ZnLm1vZGVtX3N0YXR1c190aW1lcgkJPSAxMDA7CisJY2ZnLkNIRExDX3Byb3RvY29sX29wdGlvbnMJPSBIRExDX1NUUkVBTUlOR19NT0RFOworCWNmZy5wZXJjZW50X2RhdGFfYnVmZmVyX2Zvcl9UeCAgPSA1MDsKKwljZmcuQ0hETENfc3RhdGlzdGljc19vcHRpb25zCT0gKENIRExDX1RYX0RBVEFfQllURV9DT1VOVF9TVEFUIHwKKwkJQ0hETENfUlhfREFUQV9CWVRFX0NPVU5UX1NUQVQpOworCWNmZy5tYXhfQ0hETENfZGF0YV9maWVsZF9sZW5ndGgJPSBjYXJkLT53YW5kZXYubXR1OworCisJY2ZnLnRyYW5zbWl0X2tlZXBhbGl2ZV90aW1lcgk9IDA7CisJY2ZnLnJlY2VpdmVfa2VlcGFsaXZlX3RpbWVyCT0gMDsKKwljZmcua2VlcGFsaXZlX2Vycm9yX3RvbGVyYW5jZQk9IDA7CisJY2ZnLlNMQVJQX3JlcXVlc3RfdGltZXIJCT0gMDsKKworCWNmZy5JUF9hZGRyZXNzCQk9IDA7CisJY2ZnLklQX25ldG1hc2sJCT0gMDsKKwkKKwlyZXR1cm4gY2hkbGNfY29uZmlndXJlKGNhcmQsICZjZmcpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByb2Nlc3MgZ2xvYmFsIGV4Y2VwdGlvbiBjb25kaXRpb24KKyAqLworc3RhdGljIGludCBwcm9jZXNzX2dsb2JhbF9leGNlcHRpb24oc2RsYV90ICpjYXJkKQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyOworCisJbWJveC0+YnVmZmVyX2xlbmd0aCA9IDA7CisJbWJveC0+Y29tbWFuZCA9IFJFQURfR0xPQkFMX0VYQ0VQVElPTl9DT05ESVRJT047CisJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKworCWlmKGVyciAhPSBDTURfVElNRU9VVCApeworCQorCQlzd2l0Y2gobWJveC0+cmV0dXJuX2NvZGUpIHsKKyAgICAgICAgIAorCSAgICAgIAljYXNlIEVYQ0VQX01PREVNX1NUQVRVU19DSEFOR0U6CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNb2RlbSBzdGF0dXMgY2hhbmdlXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCisJCQlzd2l0Y2gobWJveC0+ZGF0YVswXSAmIChEQ0RfSElHSCB8IENUU19ISUdIKSkgeworCQkJCWNhc2UgKERDRF9ISUdIKToKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERDRCBoaWdoLCBDVFMgbG93XG4iLGNhcmQtPmRldm5hbWUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIChDVFNfSElHSCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERDRCBsb3csIENUUyBoaWdoXG4iLGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgoRENEX0hJR0ggfCBDVFNfSElHSCkpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBEQ0QgaGlnaCwgQ1RTIGhpZ2hcbiIsY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRENEIGxvdywgQ1RTIGxvd1xuIixjYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCX0KKworCQkJaWYgKCEobWJveC0+ZGF0YVswXSAmIERDRF9ISUdIKSB8fCAhKG1ib3gtPmRhdGFbMF0gJiBEQ0RfSElHSCkpeworCQkJCS8vcHJpbnRrKEtFUk5fSU5GTyAiU2VuZGluZyBURVJNIFJlcXVlc3QgTWFudWFsbHkgIVxuIik7CisJCQkJc2VuZF9wcHBfdGVybV9yZXF1ZXN0KGNhcmQtPndhbmRldi5kZXYpOworCQkJfQkKKwkJCWJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBFWENFUF9UUkNfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogTGluZSB0cmFjZSBkaXNhYmxlZFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCWNhc2UgRVhDRVBfSVJRX1RJTUVPVVQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSVJRIHRpbWVvdXQgb2NjdXJyZWRcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7IAorCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdsb2JhbCBleGNlcHRpb24gJXhcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgbWJveC0+cmV0dXJuX2NvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByb2Nlc3MgY2hkbGMgZXhjZXB0aW9uIGNvbmRpdGlvbgorICovCitzdGF0aWMgaW50IHByb2Nlc3NfY2hkbGNfZXhjZXB0aW9uKHNkbGFfdCAqY2FyZCkKK3sKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJbWItPmNvbW1hbmQgPSBSRUFEX0NIRExDX0VYQ0VQVElPTl9DT05ESVRJT047CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCWlmKGVyciAhPSBDTURfVElNRU9VVCkgeworCQorCQlzd2l0Y2ggKGVycikgeworCisJCWNhc2UgRVhDRVBfTElOS19BQ1RJVkU6CisJCQlwb3J0X3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVEVEKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVhDRVBfTElOS19JTkFDVElWRV9NT0RFTToKKwkJCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFWENFUF9MT09QQkFDS19DT05ESVRJT046CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTG9vcGJhY2sgQ29uZGl0aW9uIERldGVjdGVkLlxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBOT19DSERMQ19FWENFUF9DT05EX1RPX1JFUE9SVDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBObyBleGNlcHRpb25zIHJlcG9ydGVkLlxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRXhjZXB0aW9uIENvbmRpdGlvbiAleCFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsZXJyKTsKKwkJCWJyZWFrOworCQl9CisKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RvcmUgYSBVRFAgbWFuYWdlbWVudCBwYWNrZXQgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCisgKi8KKworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoY2hhciB1ZHBfcGt0X3NyYywgc2RsYV90KiBjYXJkLAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJCSAgICAgIGNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWEgKQoreworCWludCB1ZHBfcGt0X3N0b3JlZCA9IDA7CisKKwlpZighY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X2xndGggJiYKKwkgIChza2ItPmxlbiA8PSBNQVhfTEdUSF9VRFBfTUdOVF9QS1QpKSB7CisgICAgICAgIAljaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfbGd0aCA9IHNrYi0+bGVuOworCQljaGRsY19wcml2X2FyZWEtPnVkcF9wa3Rfc3JjID0gdWRwX3BrdF9zcmM7CisgICAgICAgCQltZW1jcHkoY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X2RhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkID0gVE1SX0lOVF9FTkFCTEVEX1VEUDsKKwkJdWRwX3BrdF9zdG9yZWQgPSAxOworCX0KKworCWlmKHVkcF9wa3Rfc3JjID09IFVEUF9QS1RfRlJNX1NUQUNLKQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCWVsc2UKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQorCXJldHVybih1ZHBfcGt0X3N0b3JlZCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2VzcyBVRFAgbWFuYWdlbWVudCBwYWNrZXQuCisgKi8KKworc3RhdGljIGludCBwcm9jZXNzX3VkcF9tZ210X3BrdChzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCQkJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSApIAoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgZnJhbWVzLCBsZW47CisJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisJdW5zaWduZWQgc2hvcnQgYnVmZmVyX2xlbmd0aCwgcmVhbF9sZW47CisJdW5zaWduZWQgbG9uZyBkYXRhX3B0cjsKKwl1bnNpZ25lZCBkYXRhX2xlbmd0aDsKKwlpbnQgdWRwX21nbXRfcmVxX3ZhbGlkID0gMTsKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCAqbWIgPSBjYXJkLT5tYm94OworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCWNoZGxjX3VkcF9wa3RfdCAqY2hkbGNfdWRwX3BrdDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgZXJyOworCWNoYXIgdXRfY2hhcjsKKworCWNoZGxjX3VkcF9wa3QgPSAoY2hkbGNfdWRwX3BrdF90ICopIGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhOworCisJaWYoY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKSB7CisKKwkJc3dpdGNoKGNoZGxjX3VkcF9wa3QtPmNibG9jay5jb21tYW5kKSB7CisJCQljYXNlIFJFQURfR0xPQkFMX1NUQVRJU1RJQ1M6CisJCQljYXNlIFJFQURfTU9ERU1fU1RBVFVTOiAgCisJCQljYXNlIFJFQURfQ0hETENfTElOS19TVEFUVVM6CisJCQljYXNlIENQSVBFX1JPVVRFUl9VUF9USU1FOgorCQkJY2FzZSBSRUFEX0NPTU1TX0VSUk9SX1NUQVRTOgorCQkJY2FzZSBSRUFEX0NIRExDX09QRVJBVElPTkFMX1NUQVRTOgorCisJCQkvKiBUaGVzZSB0d28gY29tbWFuZHMgYXJlIGV4ZWN1dGVkIGZvcgorCQkJICogZWFjaCByZXF1ZXN0ICovCisJCQljYXNlIFJFQURfQ0hETENfQ09ORklHVVJBVElPTjoKKwkJCWNhc2UgUkVBRF9DSERMQ19DT0RFX1ZFUlNJT046CisJCQkJdWRwX21nbXRfcmVxX3ZhbGlkID0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdWRwX21nbXRfcmVxX3ZhbGlkID0gMDsKKwkJCQlicmVhazsKKwkJfSAKKwl9CisJCisgIAlpZighdWRwX21nbXRfcmVxX3ZhbGlkKSB7CisKKwkJLyogc2V0IGxlbmd0aCB0byAwICovCisJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5idWZmZXJfbGVuZ3RoID0gMDsKKworICAgIAkJLyogc2V0IHJldHVybiBjb2RlICovCisJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IDB4Q0Q7CisKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CQorCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogV2FybmluZywgSWxsZWdhbCBVRFAgY29tbWFuZCBhdHRlbXB0ZWQgZnJvbSBuZXR3b3JrOiAleFxuIiwKKwkJCWNhcmQtPmRldm5hbWUsY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpOworCQl9CisKKyAgIAl9IGVsc2UgeworCSAgIAl1bnNpZ25lZCBsb25nIHRyYWNlX3N0YXR1c19jZmdfYWRkciA9IDA7CisJCVRSQUNFX1NUQVRVU19FTF9DRkdfU1RSVUNUIHRyYWNlX2NmZ19zdHJ1Y3Q7CisJCVRSQUNFX1NUQVRVU19FTEVNRU5UX1NUUlVDVCB0cmFjZV9lbGVtZW50X3N0cnVjdDsKKworCQlzd2l0Y2goY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpIHsKKworCQljYXNlIENQSVBFX0VOQUJMRV9UUkFDSU5HOgorCQkgICAgIGlmICghY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCkgeworCisJCQkvKiBPUEVSQVRFX0RBVEFMSU5FX01PTklUT1IgKi8KKworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUKTsKKwkJCW1iLT5jb21tYW5kID0gU0VUX1RSQUNFX0NPTkZJR1VSQVRJT047CisKKyAgICAJCQkoKExJTkVfVFJBQ0VfQ09ORklHX1NUUlVDVCAqKW1iLT5kYXRhKS0+CisJCQkJdHJhY2VfY29uZmlnID0gVFJBQ0VfQUNUSVZFOworCQkJLyogVHJhY2UgZGVsYXkgbW9kZSBpcyBub3QgdXNlZCBiZWNhdXNlIGl0IHNsb3dzCisJCQkgICBkb3duIHRyYW5zZmVyIGFuZCByZXN1bHRzIGluIGEgc3RhbmRvZmYgc2l0dWF0aW9uCisJCQkgICB3aGVuIHRoZXJlIGlzIGEgbG90IG9mIGRhdGEgKi8KKworCQkJLyogQ29uZmlndXJlIHRoZSBUcmFjZSBiYXNlZCBvbiB1c2VyIGlucHV0cyAqLworCQkJKChMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QgKiltYi0+ZGF0YSktPnRyYWNlX2NvbmZpZyB8PSAKKwkJCQkJY2hkbGNfdWRwX3BrdC0+ZGF0YVswXTsKKworCQkJKChMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QgKiltYi0+ZGF0YSktPgorCQkJICAgdHJhY2VfZGVhY3RpdmF0aW9uX3RpbWVyID0gNDAwMDsKKworCisJCQllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJCQlpZiAoZXJyICE9IENPTU1BTkRfT0spIHsKKwkJCQljaGRsY19lcnJvcihjYXJkLGVycixtYik7CisJCQkJY2FyZC0+VHJhY2luZ0VuYWJsZWQgPSAwOworCQkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IGVycjsKKwkJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCQkJYnJlYWs7CisJICAgIAkJfSAKKworCQkJLyogR2V0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHRyYWNlIGVsZW1lbnQgbGlzdCAqLworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCQkJbWItPmNvbW1hbmQgPSBSRUFEX1RSQUNFX0NPTkZJR1VSQVRJT047CisJCQllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisKKwkJCWlmIChlcnIgIT0gQ09NTUFORF9PSykgeworCQkJCWNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKwkJCQljaGRsY19wcml2X2FyZWEtPlRyYWNpbmdFbmFibGVkID0gMDsKKwkJCQljaGRsY191ZHBfcGt0LT5jYmxvY2sucmV0dXJuX2NvZGUgPSBlcnI7CisJCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCQkJCWJyZWFrOworCSAgICAJCX0gCQorCisJICAgCQl0cmFjZV9zdGF0dXNfY2ZnX2FkZHIgPSgoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUICopCisJCQkJbWItPmRhdGEpIC0+IHB0cl90cmFjZV9zdGF0X2VsX2NmZ19zdHJ1Y3Q7CisKKwkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIHRyYWNlX3N0YXR1c19jZmdfYWRkciwKKwkJCQkgJnRyYWNlX2NmZ19zdHJ1Y3QsIHNpemVvZih0cmFjZV9jZmdfc3RydWN0KSk7CisJCSAgICAKKwkJCWNoZGxjX3ByaXZfYXJlYS0+c3RhcnRfdHJhY2VfYWRkciA9IHRyYWNlX2NmZ19zdHJ1Y3QuCisJCQkJYmFzZV9hZGRyX3RyYWNlX3N0YXR1c19lbGVtZW50czsKKworCQkJY2hkbGNfcHJpdl9hcmVhLT5udW1iZXJfdHJhY2VfZWxlbWVudHMgPSAKKwkJCQkJdHJhY2VfY2ZnX3N0cnVjdC5udW1iZXJfdHJhY2Vfc3RhdHVzX2VsZW1lbnRzOworCisJCQljaGRsY19wcml2X2FyZWEtPmVuZF90cmFjZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpCisJCQkJCSgoVFJBQ0VfU1RBVFVTX0VMRU1FTlRfU1RSVUNUICopCisJCQkJCSBjaGRsY19wcml2X2FyZWEtPnN0YXJ0X3RyYWNlX2FkZHIgKyAKKwkJCQkJIChjaGRsY19wcml2X2FyZWEtPm51bWJlcl90cmFjZV9lbGVtZW50cyAtIDEpKTsKKworCQkJY2hkbGNfcHJpdl9hcmVhLT5iYXNlX2FkZHJfdHJhY2VfYnVmZmVyID0gCisJCQkJCXRyYWNlX2NmZ19zdHJ1Y3QuYmFzZV9hZGRyX3RyYWNlX2J1ZmZlcjsKKworCQkJY2hkbGNfcHJpdl9hcmVhLT5lbmRfYWRkcl90cmFjZV9idWZmZXIgPSAKKwkJCQkJdHJhY2VfY2ZnX3N0cnVjdC5lbmRfYWRkcl90cmFjZV9idWZmZXI7CisKKwkJICAgIAljaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciA9IAorCQkJCQl0cmFjZV9jZmdfc3RydWN0Lm5leHRfdHJhY2VfZWxlbWVudF90b191c2U7CisKKwkgICAgCQljaGRsY19wcml2X2FyZWEtPmF2YWlsYWJsZV9idWZmZXJfc3BhY2UgPSAyMDAwIC0gCisJCQkJCQkJCSAgc2l6ZW9mKGlwX3BrdF90KSAtCisJCQkJCQkJCSAgc2l6ZW9mKHVkcF9wa3RfdCkgLQorCQkJCQkJCSAgICAgIAkgIHNpemVvZih3cF9tZ210X3QpIC0KKwkJCQkJCQkJICBzaXplb2YoY2Jsb2NrX3QpIC0KKwkJCQkJCQkgICAgICAgICAgc2l6ZW9mKHRyYWNlX2luZm9fdCk7CQorCSAgICAgICAJICAgICB9CisJCSAgICAgY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gQ09NTUFORF9PSzsKKwkJICAgICBtYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJICAgICAgIAkgICAgIGNoZGxjX3ByaXZfYXJlYS0+VHJhY2luZ0VuYWJsZWQgPSAxOworCSAgICAgICAJICAgICBicmVhazsKKwkgICAKKworCQljYXNlIENQSVBFX0RJU0FCTEVfVFJBQ0lORzoKKwkJICAgICBpZiAoY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCkgeworCisJCQkvKiBPUEVSQVRFX0RBVEFMSU5FX01PTklUT1IgKi8KKwkJCW1iLT5idWZmZXJfbGVuZ3RoID0gc2l6ZW9mKExJTkVfVFJBQ0VfQ09ORklHX1NUUlVDVCk7CisJCQltYi0+Y29tbWFuZCA9IFNFVF9UUkFDRV9DT05GSUdVUkFUSU9OOworICAgIAkJCSgoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUICopbWItPmRhdGEpLT4KKwkJCQl0cmFjZV9jb25maWcgPSBUUkFDRV9JTkFDVElWRTsKKwkJCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwkJICAgICB9CQkKKworCQkgICAgIGNoZGxjX3ByaXZfYXJlYS0+VHJhY2luZ0VuYWJsZWQgPSAwOworCQkgICAgIGNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IENPTU1BTkRfT0s7CisJCSAgICAgbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCQkgICAgIGJyZWFrOworCSAgIAorCisJCWNhc2UgQ1BJUEVfR0VUX1RSQUNFX0lORk86CisKKwkJICAgICBpZiAoIWNoZGxjX3ByaXZfYXJlYS0+VHJhY2luZ0VuYWJsZWQpIHsKKwkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IDE7CisJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCQlicmVhazsKKwkJICAgICB9CisKKyAgCQkgICAgIGNoZGxjX3VkcF9wa3QtPnRyYWNlX2luZm8uaXNtb3JlZGF0YSA9IDB4MDA7CisJCSAgICAgYnVmZmVyX2xlbmd0aCA9IDA7CS8qIG9mZnNldCBvZiBwYWNrZXQgYWxyZWFkeSBvY2N1cGllZCAqLworCisJCSAgICAgZm9yIChmcmFtZXM9MDsgZnJhbWVzIDwgY2hkbGNfcHJpdl9hcmVhLT5udW1iZXJfdHJhY2VfZWxlbWVudHM7IGZyYW1lcysrKXsKKworCQkJdHJhY2VfcGt0X3QgKnRyYWNlX3BrdCA9ICh0cmFjZV9wa3RfdCAqKQorCQkJCSZjaGRsY191ZHBfcGt0LT5kYXRhW2J1ZmZlcl9sZW5ndGhdOworCisJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBjaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciwKKwkJCSAgIAkgICh1bnNpZ25lZCBjaGFyICopJnRyYWNlX2VsZW1lbnRfc3RydWN0LAorCQkJICAgCSAgc2l6ZW9mKFRSQUNFX1NUQVRVU19FTEVNRU5UX1NUUlVDVCkpOworCisgICAgIAkJCWlmICh0cmFjZV9lbGVtZW50X3N0cnVjdC5vcHBfZmxhZyA9PSAweDAwKSB7CisJCQkgCWJyZWFrOworCQkJfQorCisJCQkvKiBnZXQgcG9pbnRlciB0byByZWFsIGRhdGEgKi8KKwkJCWRhdGFfcHRyID0gdHJhY2VfZWxlbWVudF9zdHJ1Y3QucHRyX2RhdGFfYmZyOworCisJCQkvKiBTZWUgaWYgdGhlcmUgaXMgYWN0dWFsIGRhdGEgb24gdGhlIHRyYWNlIGJ1ZmZlciAqLworCQkJaWYgKGRhdGFfcHRyKXsKKwkJCQlkYXRhX2xlbmd0aCA9IHRyYWNlX2VsZW1lbnRfc3RydWN0LnRyYWNlX2xlbmd0aDsKKwkJCX1lbHNleworCQkJCWRhdGFfbGVuZ3RoID0gMDsKKwkJCQljaGRsY191ZHBfcGt0LT50cmFjZV9pbmZvLmlzbW9yZWRhdGEgPSAweDAxOworCQkJfQorCQorICAgCQkJaWYoIChjaGRsY19wcml2X2FyZWEtPmF2YWlsYWJsZV9idWZmZXJfc3BhY2UgLSBidWZmZXJfbGVuZ3RoKQorCQkJCTwgKCBzaXplb2YodHJhY2VfcGt0X3QpICsgZGF0YV9sZW5ndGgpICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kaWNhdGUgdGhlcmUgYXJlIG1vcmUgZnJhbWVzIG9uIGJvYXJkICYgZXhpdCAqLworCQkJCWNoZGxjX3VkcF9wa3QtPnRyYWNlX2luZm8uaXNtb3JlZGF0YSA9IDB4MDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCQkJdHJhY2VfcGt0LT5zdGF0dXMgPSB0cmFjZV9lbGVtZW50X3N0cnVjdC50cmFjZV90eXBlOworCisJCQl0cmFjZV9wa3QtPnRpbWVfc3RhbXAgPQorCQkJCXRyYWNlX2VsZW1lbnRfc3RydWN0LnRyYWNlX3RpbWVfc3RhbXA7CisKKwkJCXRyYWNlX3BrdC0+cmVhbF9sZW5ndGggPQorCQkJCXRyYWNlX2VsZW1lbnRfc3RydWN0LnRyYWNlX2xlbmd0aDsKKworCQkJLyogc2VlIGlmIHdlIGNhbiBmaXQgdGhlIGZyYW1lIGludG8gdGhlIHVzZXIgYnVmZmVyICovCisJCQlyZWFsX2xlbiA9IHRyYWNlX3BrdC0+cmVhbF9sZW5ndGg7CisKKwkJCWlmIChkYXRhX3B0ciA9PSAwKSB7CisJCQkgICAgIAl0cmFjZV9wa3QtPmRhdGFfYXZhaWwgPSAweDAwOworCQkJfSBlbHNlIHsKKwkJCQl1bnNpZ25lZCB0bXAgPSAwOworCisJCQkJLyogZ2V0IHRoZSBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVyCisJCQkJICAgIG11c3QgY2hlY2sgZm9yIGVuZCBvZiBidWZmZXIgKi8KKwkJCSAgICAgICAgdHJhY2VfcGt0LT5kYXRhX2F2YWlsID0gMHgwMTsKKworCQkJCWlmICgoZGF0YV9wdHIgKyByZWFsX2xlbikgPgorCQkJCQkgICAgIGNoZGxjX3ByaXZfYXJlYS0+ZW5kX2FkZHJfdHJhY2VfYnVmZmVyICsgMSl7CisKKwkJCQkgICAgCXRtcCA9IGNoZGxjX3ByaXZfYXJlYS0+ZW5kX2FkZHJfdHJhY2VfYnVmZmVyIC0gZGF0YV9wdHIgKyAxOworCQkJCSAgICAJc2RsYV9wZWVrKCZjYXJkLT5odywgZGF0YV9wdHIsCisJCQkJCSAgICAgICAJICB0cmFjZV9wa3QtPmRhdGEsdG1wKTsKKwkJCQkgICAgCWRhdGFfcHRyID0gY2hkbGNfcHJpdl9hcmVhLT5iYXNlX2FkZHJfdHJhY2VfYnVmZmVyOworCQkJCX0KKwkKKwkJICAgICAgICAJc2RsYV9wZWVrKCZjYXJkLT5odywgZGF0YV9wdHIsCisJCQkJCSAgJnRyYWNlX3BrdC0+ZGF0YVt0bXBdLCByZWFsX2xlbiAtIHRtcCk7CisJCQl9CQorCisJCQkvKiB6ZXJvIHRoZSBvcHAgZmxhZyB0byBzaG93IHdlIGdvdCB0aGUgZnJhbWUgKi8KKwkJCXV0X2NoYXIgPSAweDAwOworCQkJc2RsYV9wb2tlKCZjYXJkLT5odywgY2hkbGNfcHJpdl9hcmVhLT5jdXJyX3RyYWNlX2FkZHIsICZ1dF9jaGFyLCAxKTsKKworICAgICAgIAkJCS8qIG5vdyBtb3ZlIG9udG8gdGhlIG5leHQgZnJhbWUgKi8KKyAgICAgICAJCQljaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciArPSBzaXplb2YoVFJBQ0VfU1RBVFVTX0VMRU1FTlRfU1RSVUNUKTsKKworICAgICAgIAkJCS8qIGNoZWNrIGlmIHdlIHdlbnQgb3ZlciB0aGUgbGFzdCBhZGRyZXNzICovCisJCQlpZiAoIGNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyID4gY2hkbGNfcHJpdl9hcmVhLT5lbmRfdHJhY2VfYWRkciApIHsKKwkJCQljaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciA9IGNoZGxjX3ByaXZfYXJlYS0+c3RhcnRfdHJhY2VfYWRkcjsKKyAgICAgICAJCQl9CisKKyAgICAgICAgICAgIAkJaWYodHJhY2VfcGt0LT5kYXRhX2F2YWlsID09IDB4MDEpIHsKKwkJCQlidWZmZXJfbGVuZ3RoICs9IHJlYWxfbGVuIC0gMTsKKwkJCX0KKwkgCisJICAgICAgIAkgICAgCS8qIGZvciB0aGUgaGVhZGVyICovCisJICAgICAgICAgICAgCWJ1ZmZlcl9sZW5ndGggKz0gc2l6ZW9mKHRyYWNlX3BrdF90KTsKKworCQkgICAgIH0gIC8qIEZvciBMb29wICovCisKKwkJICAgICBpZiAoZnJhbWVzID09IGNoZGxjX3ByaXZfYXJlYS0+bnVtYmVyX3RyYWNlX2VsZW1lbnRzKXsKKwkJCWNoZGxjX3VkcF9wa3QtPnRyYWNlX2luZm8uaXNtb3JlZGF0YSA9IDB4MDE7CisJICAgICAgICAgICAgIH0KKyAJCSAgICAgY2hkbGNfdWRwX3BrdC0+dHJhY2VfaW5mby5udW1fZnJhbWVzID0gZnJhbWVzOworCQkgCisgICAgCQkgICAgIG1iLT5idWZmZXJfbGVuZ3RoID0gYnVmZmVyX2xlbmd0aDsKKwkJICAgICBjaGRsY191ZHBfcGt0LT5jYmxvY2suYnVmZmVyX2xlbmd0aCA9IGJ1ZmZlcl9sZW5ndGg7IAorCQkgCisJCSAgICAgY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gQ09NTUFORF9PSzsgCisJCSAgICAgCisJCSAgICAgYnJlYWs7CisKKworCQljYXNlIENQSVBFX0ZUMV9SRUFEX1NUQVRVUzoKKwkJCSgodW5zaWduZWQgY2hhciAqKWNoZGxjX3VkcF9wa3QtPmRhdGEgKVswXSA9CisJCQkJZmxhZ3MtPkZUMV9pbmZvX3N0cnVjdC5wYXJhbGxlbF9wb3J0X0FfaW5wdXQ7CisKKwkJCSgodW5zaWduZWQgY2hhciAqKWNoZGxjX3VkcF9wa3QtPmRhdGEgKVsxXSA9CisJCQkJZmxhZ3MtPkZUMV9pbmZvX3N0cnVjdC5wYXJhbGxlbF9wb3J0X0JfaW5wdXQ7CisJCQkJIAorCQkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gQ09NTUFORF9PSzsKKwkJCW1iLT5idWZmZXJfbGVuZ3RoID0gMjsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBDUElQRV9ST1VURVJfVVBfVElNRToKKwkJCWRvX2dldHRpbWVvZmRheSggJnR2ICk7CisJCQljaGRsY19wcml2X2FyZWEtPnJvdXRlcl91cF90aW1lID0gdHYudHZfc2VjIC0gCisJCQkJCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVyX3N0YXJ0X3RpbWU7CisJCQkqKHVuc2lnbmVkIGxvbmcgKikmY2hkbGNfdWRwX3BrdC0+ZGF0YSA9IAorCQkJCQljaGRsY19wcml2X2FyZWEtPnJvdXRlcl91cF90aW1lOwkKKwkJCW1iLT5idWZmZXJfbGVuZ3RoID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQkJYnJlYWs7CisKKyAgIAkJY2FzZSBGVDFfTU9OSVRPUl9TVEFUVVNfQ1RSTDoKKwkJCS8qIEVuYWJsZSBGVDEgTU9OSVRPUiBTVEFUVVMgKi8KKwkgICAgICAgIAlpZiAoKGNoZGxjX3VkcF9wa3QtPmRhdGFbMF0gJiBFTkFCTEVfUkVBRF9GVDFfU1RBVFVTKSB8fCAgCisJCQkJKGNoZGxjX3VkcF9wa3QtPmRhdGFbMF0gJiBFTkFCTEVfUkVBRF9GVDFfT1BfU1RBVFMpKSB7CisJCQkKKwkJCSAgICAgCWlmKCByQ291bnQrKyAhPSAwICkgeworCQkJCQljaGRsY191ZHBfcGt0LT5jYmxvY2suCisJCQkJCXJldHVybl9jb2RlID0gQ09NTUFORF9PSzsKKwkJCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSAxOworCQkgIAkJCWJyZWFrOworCQkgICAgCSAgICAgCX0KKwkgICAgICAJCX0KKworCSAgICAgIAkJLyogRGlzYWJsZSBGVDEgTU9OSVRPUiBTVEFUVVMgKi8KKwkgICAgICAJCWlmKCBjaGRsY191ZHBfcGt0LT5kYXRhWzBdID09IDApIHsKKworCSAgICAgIAkgICAJICAgICAJaWYoIC0tckNvdW50ICE9IDApIHsKKwkJICAJCQljaGRsY191ZHBfcGt0LT5jYmxvY2suCisJCQkJCXJldHVybl9jb2RlID0gQ09NTUFORF9PSzsKKwkJCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSAxOworCQkgIAkJCWJyZWFrOworCSAgIAkgICAgCSAgICAgCX0gCisJICAgICAgCQl9IAkKKwkKKwkJZGVmYXVsdDoKKwkJCS8qIGl0J3MgYSBib2FyZCBjb21tYW5kICovCisJCQltYi0+Y29tbWFuZCA9IGNoZGxjX3VkcF9wa3QtPmNibG9jay5jb21tYW5kOworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSBjaGRsY191ZHBfcGt0LT5jYmxvY2suYnVmZmVyX2xlbmd0aDsKKwkJCWlmIChtYi0+YnVmZmVyX2xlbmd0aCkgeworCQkJCW1lbWNweSgmbWItPmRhdGEsICh1bnNpZ25lZCBjaGFyICopIGNoZGxjX3VkcF9wa3QtPgorCQkJCQkJCWRhdGEsIG1iLT5idWZmZXJfbGVuZ3RoKTsKKwkgICAgICAJCX0gCisJCQkvKiBydW4gdGhlIGNvbW1hbmQgb24gdGhlIGJvYXJkICovCisJCQllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJCQlpZiAoZXJyICE9IENPTU1BTkRfT0spIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogY29weSB0aGUgcmVzdWx0IGJhY2sgdG8gb3VyIGJ1ZmZlciAqLworCSAgICAgICAgIAltZW1jcHkoJmNoZGxjX3VkcF9wa3QtPmNibG9jaywgbWIsIHNpemVvZihjYmxvY2tfdCkpOyAKKwkJCQorCQkJaWYgKG1iLT5idWZmZXJfbGVuZ3RoKSB7CisJICAgICAgICAgCQltZW1jcHkoJmNoZGxjX3VkcF9wa3QtPmRhdGEsICZtYi0+ZGF0YSwgCisJCQkJCQkJCW1iLT5idWZmZXJfbGVuZ3RoKTsgCisJICAgICAgCQl9CisKKwkJfSAvKiBlbmQgb2Ygc3dpdGNoICovCisgICAgIAl9IC8qIGVuZCBvZiBlbHNlICovCisKKyAgICAgCS8qIEZpbGwgVURQIFRUTCAqLworCWNoZGxjX3VkcF9wa3QtPmlwX3BrdC50dGwgPSBjYXJkLT53YW5kZXYudHRsOyAKKworICAgICAJbGVuID0gcmVwbHlfdWRwKGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhLCBtYi0+YnVmZmVyX2xlbmd0aCk7CisJCisgICAgIAlpZihjaGRsY19wcml2X2FyZWEtPnVkcF9wa3Rfc3JjID09IFVEUF9QS1RfRlJNX05FVFdPUkspIHsKKwkJaWYoIWNoZGxjX3NlbmQoY2FyZCwgY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X2RhdGEsIGxlbikpIHsKKwkJCSsrIGNhcmQtPndhbmRldi5zdGF0cy50eF9wYWNrZXRzOworCQkJY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwkJfQorCX0gZWxzZSB7CQorCQorCQkvKiBQYXNzIGl0IHVwIHRoZSBzdGFjaworICAgIAkJICAgQWxsb2NhdGUgc29ja2V0IGJ1ZmZlciAqLworCQlpZiAoKG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbikpICE9IE5VTEwpIHsKKwkJCS8qIGNvcHkgZGF0YSBpbnRvIG5ld19za2IgKi8KKworIAkgICAgCQlidWYgPSBza2JfcHV0KG5ld19za2IsIGxlbik7CisgIAkgICAgCQltZW1jcHkoYnVmLCBjaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfZGF0YSwgbGVuKTsKKworICAgICAgICAgICAgCQkvKiBEZWNhcHN1bGF0ZSBwa3QgYW5kIHBhc3MgaXQgdXAgdGhlIHByb3RvY29sIHN0YWNrICovCisJICAgIAkJbmV3X3NrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisgICAgICAgICAgICAJCW5ld19za2ItPmRldiA9IGRldjsKKwkgICAgCQluZXdfc2tiLT5tYWMucmF3ICA9IG5ld19za2ItPmRhdGE7CisJCisJCQluZXRpZl9yeChuZXdfc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCX0gZWxzZSB7CisJICAgIAkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBzb2NrZXQgYnVmZmVycyBhdmFpbGFibGUhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKyAgCQl9CisgICAgCX0KKyAKKwljaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfbGd0aCA9IDA7CisgCQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgUmVjZWl2ZSBhbmQgVHJhbnNtaXQgQnVmZmVycy4KKyAqLworCitzdGF0aWMgdm9pZCBpbml0X2NoZGxjX3R4X3J4X2J1ZmYoc2RsYV90KiBjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisJQ0hETENfVFhfU1RBVFVTX0VMX0NGR19TVFJVQ1QgKnR4X2NvbmZpZzsKKwlDSERMQ19SWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqcnhfY29uZmlnOworCWNoYXIgZXJyOworCQorCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ORklHVVJBVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisKKwlpZihlcnIgIT0gQ09NTUFORF9PSykgeworCQljaGRsY19lcnJvcihjYXJkLGVycixtYik7CisJCXJldHVybjsKKwl9CisKKwlpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkgeworCQl0eF9jb25maWcgPSAoQ0hETENfVFhfU1RBVFVTX0VMX0NGR19TVFJVQ1QgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAgKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYi0+ZGF0YSktPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9DSERMQ19UeF9zdGF0X2VsX2NmZ19zdHJ1Y3QpKTsKKyAgICAgICAgCXJ4X2NvbmZpZyA9IChDSERMQ19SWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICAoKChDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCAqKW1iLT5kYXRhKS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX0NIRExDX1J4X3N0YXRfZWxfY2ZnX3N0cnVjdCkpOworCisgICAgICAgCQkvKiBTZXR1cCBIZWFkIGFuZCBUYWlscyBmb3IgYnVmZmVycyAqLworICAgICAgICAJY2FyZC0+dS5jLnR4YnVmX2Jhc2UgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICB0eF9jb25maWctPmJhc2VfYWRkcl9UeF9zdGF0dXNfZWxlbWVudHMpOworICAgICAgICAJY2FyZC0+dS5jLnR4YnVmX2xhc3QgPSAKKwkJKENIRExDX0RBVEFfVFhfU1RBVFVTX0VMX1NUUlVDVCAqKSAgCisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnR4YnVmX2Jhc2UgKworCQkodHhfY29uZmlnLT5udW1iZXJfVHhfc3RhdHVzX2VsZW1lbnRzIC0gMSk7CisKKyAgICAgICAgCWNhcmQtPnUuYy5yeGJ1Zl9iYXNlID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAgcnhfY29uZmlnLT5iYXNlX2FkZHJfUnhfc3RhdHVzX2VsZW1lbnRzKTsKKyAgICAgICAgCWNhcmQtPnUuYy5yeGJ1Zl9sYXN0ID0KKwkJKENIRExDX0RBVEFfUlhfU1RBVFVTX0VMX1NUUlVDVCAqKQorICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5yeGJ1Zl9iYXNlICsKKwkJKHJ4X2NvbmZpZy0+bnVtYmVyX1J4X3N0YXR1c19lbGVtZW50cyAtIDEpOworCisgCQkvKiBTZXQgdXAgbmV4dCBwb2ludGVyIHRvIGJlIHVzZWQgKi8KKyAgICAgICAgCWNhcmQtPnUuYy50eGJ1ZiA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgIHR4X2NvbmZpZy0+bmV4dF9UeF9zdGF0dXNfZWxlbWVudF90b191c2UpOworICAgICAgICAJY2FyZC0+dS5jLnJ4bWIgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICByeF9jb25maWctPm5leHRfUnhfc3RhdHVzX2VsZW1lbnRfdG9fdXNlKTsKKwl9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHR4X2NvbmZpZyA9IChDSERMQ19UWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJCSgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWItPmRhdGEpLT4KKwkJCXB0cl9DSERMQ19UeF9zdGF0X2VsX2NmZ19zdHJ1Y3QgJSBTRExBX1dJTkRPV1NJWkUpKTsKKworICAgICAgICAgICAgICAgIHJ4X2NvbmZpZyA9IChDSERMQ19SWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJCSgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWItPmRhdGEpLT4KKwkJCXB0cl9DSERMQ19SeF9zdGF0X2VsX2NmZ19zdHJ1Y3QgJSBTRExBX1dJTkRPV1NJWkUpKTsKKworICAgICAgICAgICAgICAgIC8qIFNldHVwIEhlYWQgYW5kIFRhaWxzIGZvciBidWZmZXJzICovCisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnR4YnVmX2Jhc2UgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJKHR4X2NvbmZpZy0+YmFzZV9hZGRyX1R4X3N0YXR1c19lbGVtZW50cyAlIFNETEFfV0lORE9XU0laRSkpOworICAgICAgICAgICAgICAgIGNhcmQtPnUuYy50eGJ1Zl9sYXN0ID0KKwkJKENIRExDX0RBVEFfVFhfU1RBVFVTX0VMX1NUUlVDVCAqKWNhcmQtPnUuYy50eGJ1Zl9iYXNlCisJCSsgKHR4X2NvbmZpZy0+bnVtYmVyX1R4X3N0YXR1c19lbGVtZW50cyAtIDEpOworICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5yeGJ1Zl9iYXNlID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisJCShyeF9jb25maWctPmJhc2VfYWRkcl9SeF9zdGF0dXNfZWxlbWVudHMgJSBTRExBX1dJTkRPV1NJWkUpKTsKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMucnhidWZfbGFzdCA9IAorCQkoQ0hETENfREFUQV9SWF9TVEFUVVNfRUxfU1RSVUNUICopY2FyZC0+dS5jLnJ4YnVmX2Jhc2UKKwkJKyAocnhfY29uZmlnLT5udW1iZXJfUnhfc3RhdHVzX2VsZW1lbnRzIC0gMSk7CisKKyAgICAgICAgICAgICAgICAgLyogU2V0IHVwIG5leHQgcG9pbnRlciB0byBiZSB1c2VkICovCisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnR4YnVmID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisJCSh0eF9jb25maWctPm5leHRfVHhfc3RhdHVzX2VsZW1lbnRfdG9fdXNlICUgU0RMQV9XSU5ET1dTSVpFKSk7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnJ4bWIgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJKHJ4X2NvbmZpZy0+bmV4dF9SeF9zdGF0dXNfZWxlbWVudF90b191c2UgJSBTRExBX1dJTkRPV1NJWkUpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldHVwIEFjdHVhbCBCdWZmZXIgU3RhcnQgYW5kIGVuZCBhZGRyZXNzZXMgKi8KKyAgICAgICAgY2FyZC0+dS5jLnJ4X2Jhc2UgPSByeF9jb25maWctPmJhc2VfYWRkcl9SeF9idWZmZXI7CisgICAgICAgIGNhcmQtPnUuYy5yeF90b3AgID0gcnhfY29uZmlnLT5lbmRfYWRkcl9SeF9idWZmZXI7CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUGVyZm9ybSBJbnRlcnJ1cHQgVGVzdCBieSBydW5uaW5nIFJFQURfQ0hETENfQ09ERV9WRVJTSU9OIGNvbW1hbmQgTUFYX0lOVFIKKyAqIF9URVNUX0NPVU5URVIgdGltZXMuCisgKi8KK3N0YXRpYyBpbnQgaW50cl90ZXN0KCBzZGxhX3QqIGNhcmQpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyLGk7CisKKwlJbnRyX3Rlc3RfY291bnRlciA9IDA7CisKKwkvKiBUaGUgY3JpdGljYWwgZmxhZyBpcyB1bnNldCBiZWNhdXNlIGR1cmluZyBpbml0aWFsaXphdGlvbiAoaWZfb3BlbikgCisJICogd2Ugd2FudCB0aGUgaW50ZXJydXB0cyB0byBiZSBlbmFibGVkIHNvIHRoYXQgd2hlbiB0aGUgd3BjX2lzciBpcworCSAqIGNhbGxlZCBpdCBkb2VzIG5vdCBleGl0IGR1ZSB0byBjcml0aWNhbCBmbGFnIHNldC4KKwkgKi8gCisKKwllcnIgPSBjaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsIEFQUF9JTlRfT05fQ09NTUFORF9DT01QTEVURSk7CisKKwlpZiAoZXJyID09IENNRF9PSykgeyAKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9JTlRSX1RFU1RfQ09VTlRFUjsgaSArKykgewkKKwkJCW1iLT5idWZmZXJfbGVuZ3RoICA9IDA7CisJCQltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ERV9WRVJTSU9OOworCQkJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCQl9CisJfQorCWVsc2UgeworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IGNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwgMCk7CisKKwlpZiAoZXJyICE9IENNRF9PSykKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBVRFAgY2FsbCBpdCBpcy4gQ1BJUEVBQiA/CisgKi8KK3N0YXRpYyBpbnQgdWRwX3BrdF90eXBlKHN0cnVjdCBza19idWZmICpza2IsIHNkbGFfdCogY2FyZCkKK3sKKwkgY2hkbGNfdWRwX3BrdF90ICpjaGRsY191ZHBfcGt0ID0gKGNoZGxjX3VkcF9wa3RfdCAqKXNrYi0+ZGF0YTsKKworCWlmICghc3RybmNtcChjaGRsY191ZHBfcGt0LT53cF9tZ210LnNpZ25hdHVyZSxVRFBNR01UX1NJR05BVFVSRSw4KSAmJgorCSAgIChjaGRsY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydCA9PSBudG9ocyhjYXJkLT53YW5kZXYudWRwX3BvcnQpKSAmJgorCSAgIChjaGRsY191ZHBfcGt0LT5pcF9wa3QucHJvdG9jb2wgPT0gVURQTUdNVF9VRFBfUFJPVE9DT0wpICYmCisJICAgKGNoZGxjX3VkcF9wa3QtPndwX21nbXQucmVxdWVzdF9yZXBseSA9PSBVRFBNR01UX1JFUVVFU1QpKSB7CisJCXJldHVybiBVRFBfQ1BJUEVfVFlQRTsKKwl9CisJZWxzZSByZXR1cm4gVURQX0lOVkFMSURfVFlQRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgUE9SVCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgcG9ydF9zZXRfc3RhdGUgKHNkbGFfdCAqY2FyZCwgaW50IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCWNoZGxjX3ByaXZhdGVfYXJlYV90ICpjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisKKyAgICAgICAgaWYgKGNhcmQtPnUuYy5zdGF0ZSAhPSBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgV0FOX0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoS0VSTl9JTkZPICIlczogSERMQyBsaW5rIGNvbm5lY3RlZCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBXQU5fQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoS0VSTl9JTkZPICIlczogSERMQyBsaW5rIGNvbm5lY3RpbmcuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFdBTl9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsgKEtFUk5fSU5GTyAiJXM6IEhETEMgbGluayBkaXNjb25uZWN0ZWQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhcmQtPndhbmRldi5zdGF0ZSA9IGNhcmQtPnUuYy5zdGF0ZSA9IHN0YXRlOworCQljaGRsY19wcml2X2FyZWEtPmNvbW1vbi5zdGF0ZSA9IHN0YXRlOworICAgICAgICB9Cit9CisKK3ZvaWQgczUwOF9sb2NrIChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncykKK3sKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+d2FuZGV2LmxvY2ssICpzbXBfZmxhZ3MpOworICAgICAgICBpZiAoY2FyZC0+bmV4dCl7CisJCS8qIEl0IGlzIG9rIHRvIHVzZSBzcGluX2xvY2sgaGVyZSwgc2luY2Ugd2UKKwkJICogYWxyZWFkeSB0dXJuZWQgb2ZmIGludGVycnVwdHMgKi8KKyAgICAgICAgCXNwaW5fbG9jaygmY2FyZC0+bmV4dC0+d2FuZGV2LmxvY2spOworCX0KK30KKwordm9pZCBzNTA4X3VubG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisJaWYgKGNhcmQtPm5leHQpeworCQlzcGluX3VubG9jaygmY2FyZC0+bmV4dC0+d2FuZGV2LmxvY2spOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT53YW5kZXYubG9jaywgKnNtcF9mbGFncyk7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogY29uZmlnX2NoZGxjCisgKgorICoJQ29uZmlndXJlIHRoZSBjaGRsYyBwcm90b2NvbCBhbmQgZW5hYmxlIGNvbW11bmljYXRpb25zLgkJCisgKgorICogICAJVGhlIGlmX29wZW4oKSBmdW5jdGlvbiBiaW5kcyB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBwb2xsIHJvdXRpbmUuCisgKiAgICAgIFRoZXJlZm9yZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHJ1biBldmVyeSB0aW1lIHRoZSBjaGRsYyBpbnRlcmZhY2UKKyAqICAgICAgaXMgYnJvdWdodCB1cC4gV2UgY2Fubm90IHJ1biB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGlmX29wZW4gCisgKiAgICAgIGJlY2F1c2UgaWZfb3BlbiBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgcmVtb3RlIElQIGFkZHJlc3MuCisgKiAgICAgIAorICoJSWYgdGhlIGNvbW11bmljYXRpb25zIGFyZSBub3QgZW5hYmxlZCwgcHJvY2VlZCB0byBjb25maWd1cmUKKyAqICAgICAgdGhlIGNhcmQgYW5kIGVuYWJsZSBjb21tdW5pY2F0aW9ucy4KKyAqCisgKiAgICAgIElmIHRoZSBjb21tdW5pY2F0aW9ucyBhcmUgZW5hYmxlZCwgaXQgbWVhbnMgdGhhdCB0aGUgaW50ZXJmYWNlCisgKiAgICAgIHdhcyBzaHV0ZG93biBieSBldGhlciB0aGUgdXNlciBvciBkcml2ZXIuIEluIHRoaXMgY2FzZSwgd2UgCisgKiAgICAgIGhhdmUgdG8gY2hlY2sgdGhhdCB0aGUgSVAgYWRkcmVzc2VzIGhhdmUgbm90IGNoYW5nZWQuICBJZgorICogICAgICB0aGUgSVAgYWRkcmVzc2VzIGhhdmUgY2hhbmdlZCwgd2UgaGF2ZSB0byByZWNvbmZpZ3VyZSB0aGUgZmlybXdhcmUKKyAqICAgICAgYW5kIHVwZGF0ZSB0aGUgY2hhbmdlZCBJUCBhZGRyZXNzZXMuICBPdGhlcndpc2UsIGp1c3QgZXhpdC4KKyAqCisgKi8KKworc3RhdGljIGludCBjb25maWdfY2hkbGMgKHNkbGFfdCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKworCWlmIChjYXJkLT51LmMuY29tbV9lbmFibGVkKXsKKwkJY2hkbGNfY29tbV9kaXNhYmxlKGNhcmQpOworCQlwb3J0X3NldF9zdGF0ZShjYXJkLCBXQU5fRElTQ09OTkVDVEVEKTsKKwl9CisKKwlpZiAoc2V0X2NoZGxjX2NvbmZpZyhjYXJkKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ0hETEMgQ29uZmlndXJhdGlvbiBGYWlsZWQhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJaW5pdF9jaGRsY190eF9yeF9idWZmKGNhcmQsIGRldik7CisKKwkvKiBTZXQgaW50ZXJydXB0IG1vZGUgYW5kIG1hc2sgKi8KKyAgICAgICAgaWYgKGNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwgQVBQX0lOVF9PTl9SWF9GUkFNRSB8CisgICAgICAgICAgICAgICAgCQlBUFBfSU5UX09OX0dMT0JBTF9FWENFUF9DT05EIHwKKyAgICAgICAgICAgICAgICAJCUFQUF9JTlRfT05fVFhfRlJBTUUgfAorICAgICAgICAgICAgICAgIAkJQVBQX0lOVF9PTl9DSERMQ19FWENFUF9DT05EIHwgQVBQX0lOVF9PTl9USU1FUikpeworCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBzZXQgaW50ZXJydXB0IHRyaWdnZXJzIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIDA7CQorICAgICAgICB9CisJCisKKwkvKiBNYXNrIHRoZSBUcmFuc21pdCBhbmQgVGltZXIgaW50ZXJydXB0ICovCisJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiAmPSAKKwkJfihBUFBfSU5UX09OX1RYX0ZSQU1FIHwgQVBQX0lOVF9PTl9USU1FUik7CisKKworCWlmIChjaGRsY19jb21tX2VuYWJsZShjYXJkKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGNoZGxjIGNvbW11bmljYXRpb25zIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiA9IDA7CisJCWNhcmQtPnUuYy5jb21tX2VuYWJsZWQ9MDsKKwkJY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLDApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBJbml0aWFsaXplIFJ4L1R4IGJ1ZmZlciBjb250cm9sIGZpZWxkcyAqLworCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9DT05ORUNUSU5HKTsKKwlyZXR1cm4gMDsgCit9CisKKworc3RhdGljIHZvaWQgc2VuZF9wcHBfdGVybV9yZXF1ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisJdW5zaWduZWQgY2hhciAqYnVmOworCisJaWYgKChuZXdfc2tiID0gZGV2X2FsbG9jX3NrYig4KSkgIT0gTlVMTCkgeworCQkvKiBjb3B5IGRhdGEgaW50byBuZXdfc2tiICovCisKKwkJYnVmID0gc2tiX3B1dChuZXdfc2tiLCA4KTsKKwkJc3ByaW50ZihidWYsIiVjJWMlYyVjJWMlYyVjJWMiLCAweEZGLDB4MDMsMHhDMCwweDIxLDB4MDUsMHg5OCwweDAwLDB4MDcpOworCisJCS8qIERlY2Fwc3VsYXRlIHBrdCBhbmQgcGFzcyBpdCB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgKi8KKwkJbmV3X3NrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9XQU5fUFBQKTsKKwkJbmV3X3NrYi0+ZGV2ID0gZGV2OworCQluZXdfc2tiLT5tYWMucmF3ICA9IG5ld19za2ItPmRhdGE7CisKKwkJbmV0aWZfcngobmV3X3NrYik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJfQorfQorCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoqKioqKiBFbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi93YW54bC5jIGIvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3YjQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi93YW54bC5jCkBAIC0wLDAgKzEsODM5IEBACisvKgorICogd2FuWEwgc2VyaWFsIGNhcmQgZHJpdmVyIGZvciBMaW51eAorICogaG9zdCBwYXJ0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBTdGF0dXM6CisgKiAgIC0gT25seSBEVEUgKGV4dGVybmFsIGNsb2NrKSBzdXBwb3J0IHdpdGggTlJaIGFuZCBOUlpJIGVuY29kaW5ncworICogICAtIHdhblhMMTAwIHdpbGwgcmVxdWlyZSBtaW5vciBkcml2ZXIgbW9kaWZpY2F0aW9ucywgbm8gYWNjZXNzIHRvIGh3CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisKKyNpbmNsdWRlICJ3YW54bC5oIgorCitzdGF0aWMgY29uc3QgY2hhciogdmVyc2lvbiA9ICJ3YW5YTCBzZXJpYWwgY2FyZCBkcml2ZXIgdmVyc2lvbjogMC40OCI7CisKKyNkZWZpbmUgUExYX0NUTF9SRVNFVCAgIDB4NDAwMDAwMDAgLyogYWRhcHRlciByZXNldCAqLworCisjdW5kZWYgREVCVUdfUEtUCisjdW5kZWYgREVCVUdfUENJCisKKy8qIE1BSUxCT1ggIzEgLSBQVVRTIENPTU1BTkRTICovCisjZGVmaW5lIE1CWDFfQ01EX0FCT1JUSiAweDg1MDAwMDAwIC8qIEFib3J0IGFuZCBKdW1wICovCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIE1CWDFfQ01EX0JTV0FQICAweDhDMDAwMDAxIC8qIGxpdHRsZS1lbmRpYW4gQnl0ZSBTd2FwIE1vZGUgKi8KKyNlbHNlCisjZGVmaW5lIE1CWDFfQ01EX0JTV0FQICAweDhDMDAwMDAwIC8qIGJpZy1lbmRpYW4gQnl0ZSBTd2FwIE1vZGUgKi8KKyNlbmRpZgorCisvKiBNQUlMQk9YICMyIC0gRFJBTSBTSVpFICovCisjZGVmaW5lIE1CWDJfTUVNU1pfTUFTSyAweEZGRkYwMDAwIC8qIFBVVFMgTWVtb3J5IFNpemUgUmVnaXN0ZXIgbWFzayAqLworCisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBjYXJkX3QgKmNhcmQ7CisJc3BpbmxvY2tfdCBsb2NrOwkvKiBmb3Igd2FueGxfeG1pdCAqLworICAgICAgICBpbnQgbm9kZTsJCS8qIHBoeXNpY2FsIHBvcnQgIzAgLSAzICovCisJdW5zaWduZWQgaW50IGNsb2NrX3R5cGU7CisJaW50IHR4X2luLCB0eF9vdXQ7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnNbVFhfQlVGRkVSU107Cit9cG9ydF90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKwlkZXNjX3QgcnhfZGVzY3NbUlhfUVVFVUVfTEVOR1RIXTsKKwlwb3J0X3N0YXR1c190IHBvcnRfc3RhdHVzWzRdOworfWNhcmRfc3RhdHVzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgY2FyZF90IHsKKwlpbnQgbl9wb3J0czsJCS8qIDEsIDIgb3IgNCBwb3J0cyAqLworCXU4IGlycTsKKworCXU4IF9faW9tZW0gKnBseDsJLyogUExYIFBDSTkwNjAgdmlydHVhbCBiYXNlIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJLyogZm9yIHBjaV9uYW1lKHBkZXYpICovCisJaW50IHJ4X2luOworCXN0cnVjdCBza19idWZmICpyeF9za2JzW1JYX1FVRVVFX0xFTkdUSF07CisJY2FyZF9zdGF0dXNfdCAqc3RhdHVzOwkvKiBzaGFyZWQgYmV0d2VlbiBob3N0IGFuZCBjYXJkICovCisJZG1hX2FkZHJfdCBzdGF0dXNfYWRkcmVzczsKKwlwb3J0X3QgcG9ydHNbMF07CS8qIDEgLSA0IHBvcnRfdCBzdHJ1Y3R1cmVzIGZvbGxvdyAqLworfWNhcmRfdDsKKworCisKK3N0YXRpYyBpbmxpbmUgcG9ydF90KiBkZXZfdG9fcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICByZXR1cm4gKHBvcnRfdCAqKWRldl90b19oZGxjKGRldiktPnByaXY7Cit9CisKKworc3RhdGljIGlubGluZSBwb3J0X3N0YXR1c190KiBnZXRfc3RhdHVzKHBvcnRfdCAqcG9ydCkKK3sKKwlyZXR1cm4gJnBvcnQtPmNhcmQtPnN0YXR1cy0+cG9ydF9zdGF0dXNbcG9ydC0+bm9kZV07Cit9CisKKworI2lmZGVmIERFQlVHX1BDSQorc3RhdGljIGlubGluZSBkbWFfYWRkcl90IHBjaV9tYXBfc2luZ2xlX2RlYnVnKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB2b2lkICpwdHIsCisJCQkJCSAgICAgIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQoreworCWRtYV9hZGRyX3QgYWRkciA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHB0ciwgc2l6ZSwgZGlyZWN0aW9uKTsKKwlpZiAoYWRkciArIHNpemUgPiAweDEwMDAwMDAwMExMKQorCQlwcmludGsoS0VSTl9DUklUICJ3YW5YTCAlczogcGNpX21hcF9zaW5nbGUoKSByZXR1cm5lZCBtZW1vcnkiCisJCSAgICAgICAiIGF0IDB4JUxYIVxuIiwgcGNpX25hbWUocGRldiksCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFkZHIpOworCXJldHVybiBhZGRyOworfQorCisjdW5kZWYgcGNpX21hcF9zaW5nbGUKKyNkZWZpbmUgcGNpX21hcF9zaW5nbGUgcGNpX21hcF9zaW5nbGVfZGVidWcKKyNlbmRpZgorCisKKy8qIENhYmxlIGFuZC9vciBwZXJzb25hbGl0eSBtb2R1bGUgY2hhbmdlIGludGVycnVwdCBzZXJ2aWNlICovCitzdGF0aWMgaW5saW5lIHZvaWQgd2FueGxfY2FibGVfaW50cihwb3J0X3QgKnBvcnQpCit7CisJdTMyIHZhbHVlID0gZ2V0X3N0YXR1cyhwb3J0KS0+Y2FibGU7CisJaW50IHZhbGlkID0gMTsKKwljb25zdCBjaGFyICpjYWJsZSwgKnBtLCAqZHRlID0gIiIsICpkc3IgPSAiIiwgKmRjZCA9ICIiOworCisJc3dpdGNoKHZhbHVlICYgMHg3KSB7CisJY2FzZSBTVEFUVVNfQ0FCTEVfVjM1OiBjYWJsZSA9ICJWLjM1IjsgYnJlYWs7CisJY2FzZSBTVEFUVVNfQ0FCTEVfWDIxOiBjYWJsZSA9ICJYLjIxIjsgYnJlYWs7CisJY2FzZSBTVEFUVVNfQ0FCTEVfVjI0OiBjYWJsZSA9ICJWLjI0IjsgYnJlYWs7CisJY2FzZSBTVEFUVVNfQ0FCTEVfRUlBNTMwOiBjYWJsZSA9ICJFSUE1MzAiOyBicmVhazsKKwljYXNlIFNUQVRVU19DQUJMRV9OT05FOiBjYWJsZSA9ICJubyI7IGJyZWFrOworCWRlZmF1bHQ6IGNhYmxlID0gImludmFsaWQiOworCX0KKworCXN3aXRjaCgodmFsdWUgPj4gU1RBVFVTX0NBQkxFX1BNX1NISUZUKSAmIDB4NykgeworCWNhc2UgU1RBVFVTX0NBQkxFX1YzNTogcG0gPSAiVi4zNSI7IGJyZWFrOworCWNhc2UgU1RBVFVTX0NBQkxFX1gyMTogcG0gPSAiWC4yMSI7IGJyZWFrOworCWNhc2UgU1RBVFVTX0NBQkxFX1YyNDogcG0gPSAiVi4yNCI7IGJyZWFrOworCWNhc2UgU1RBVFVTX0NBQkxFX0VJQTUzMDogcG0gPSAiRUlBNTMwIjsgYnJlYWs7CisJY2FzZSBTVEFUVVNfQ0FCTEVfTk9ORTogcG0gPSAibm8gcGVyc29uYWxpdHkiOyB2YWxpZCA9IDA7IGJyZWFrOworCWRlZmF1bHQ6IHBtID0gImludmFsaWQgcGVyc29uYWxpdHkiOyB2YWxpZCA9IDA7CisJfQorCisJaWYgKHZhbGlkKSB7CisJCWlmICgodmFsdWUgJiA3KSA9PSAoKHZhbHVlID4+IFNUQVRVU19DQUJMRV9QTV9TSElGVCkgJiA3KSkgeworCQkJZHNyID0gKHZhbHVlICYgU1RBVFVTX0NBQkxFX0RTUikgPyAiLCBEU1IgT04iIDoKKwkJCQkiLCBEU1Igb2ZmIjsKKwkJCWRjZCA9ICh2YWx1ZSAmIFNUQVRVU19DQUJMRV9EQ0QpID8gIiwgY2FycmllciBPTiIgOgorCQkJCSIsIGNhcnJpZXIgb2ZmIjsKKwkJfQorCQlkdGUgPSAodmFsdWUgJiBTVEFUVVNfQ0FCTEVfRENFKSA/ICIgRENFIiA6ICIgRFRFIjsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzJXMgbW9kdWxlLCAlcyBjYWJsZSVzJXNcbiIsCisJICAgICAgIHBvcnQtPmRldi0+bmFtZSwgcG0sIGR0ZSwgY2FibGUsIGRzciwgZGNkKTsKKworCWhkbGNfc2V0X2NhcnJpZXIodmFsdWUgJiBTVEFUVVNfQ0FCTEVfRENELCBwb3J0LT5kZXYpOworfQorCisKKworLyogVHJhbnNtaXQgY29tcGxldGUgaW50ZXJydXB0IHNlcnZpY2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3YW54bF90eF9pbnRyKHBvcnRfdCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydC0+ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwl3aGlsZSAoMSkgeworICAgICAgICAgICAgICAgIGRlc2NfdCAqZGVzYyA9ICZnZXRfc3RhdHVzKHBvcnQpLT50eF9kZXNjc1twb3J0LT50eF9pbl07CisJCXN0cnVjdCBza19idWZmICpza2IgPSBwb3J0LT50eF9za2JzW3BvcnQtPnR4X2luXTsKKworCQlzd2l0Y2ggKGRlc2MtPnN0YXQpIHsKKwkJY2FzZSBQQUNLRVRfRlVMTDoKKwkJY2FzZSBQQUNLRVRfRU1QVFk6CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQlyZXR1cm47CisKKwkJY2FzZSBQQUNLRVRfVU5ERVJSVU46CisJCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCQlzdGF0cy0+dHhfZmlmb19lcnJvcnMrKzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlzdGF0cy0+dHhfcGFja2V0cysrOworCQkJc3RhdHMtPnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQl9CisgICAgICAgICAgICAgICAgZGVzYy0+c3RhdCA9IFBBQ0tFVF9FTVBUWTsgLyogRnJlZSBkZXNjcmlwdG9yICovCisJCXBjaV91bm1hcF9zaW5nbGUocG9ydC0+Y2FyZC0+cGRldiwgZGVzYy0+YWRkcmVzcywgc2tiLT5sZW4sCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworICAgICAgICAgICAgICAgIHBvcnQtPnR4X2luID0gKHBvcnQtPnR4X2luICsgMSkgJSBUWF9CVUZGRVJTOworICAgICAgICB9Cit9CisKKworCisvKiBSZWNlaXZlIGNvbXBsZXRlIGludGVycnVwdCBzZXJ2aWNlICovCitzdGF0aWMgaW5saW5lIHZvaWQgd2FueGxfcnhfaW50cihjYXJkX3QgKmNhcmQpCit7CisJZGVzY190ICpkZXNjOworCXdoaWxlIChkZXNjID0gJmNhcmQtPnN0YXR1cy0+cnhfZGVzY3NbY2FyZC0+cnhfaW5dLAorCSAgICAgICBkZXNjLT5zdGF0ICE9IFBBQ0tFVF9FTVBUWSkgeworCQlpZiAoKGRlc2MtPnN0YXQgJiBQQUNLRVRfUE9SVF9NQVNLKSA+IGNhcmQtPm5fcG9ydHMpCisJCQlwcmludGsoS0VSTl9DUklUICJ3YW5YTCAlczogcmVjZWl2ZWQgcGFja2V0IGZvciIKKwkJCSAgICAgICAiIG5vbmV4aXN0ZW50IHBvcnRcbiIsIHBjaV9uYW1lKGNhcmQtPnBkZXYpKTsKKwkJZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gY2FyZC0+cnhfc2tic1tjYXJkLT5yeF9pbl07CisJCQlwb3J0X3QgKnBvcnQgPSAmY2FyZC0+cG9ydHNbZGVzYy0+c3RhdCAmCisJCQkJCQkgICAgUEFDS0VUX1BPUlRfTUFTS107CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydC0+ZGV2OworCQkJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCisJCQlpZiAoIXNrYikKKwkJCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQkJZWxzZSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjLT5hZGRyZXNzLAorCQkJCQkJIEJVRkZFUl9MRU5HVEgsCisJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlza2JfcHV0KHNrYiwgZGVzYy0+bGVuZ3RoKTsKKworI2lmZGVmIERFQlVHX1BLVAorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlcyBSWCglaSk6IiwgZGV2LT5uYW1lLAorCQkJCSAgICAgICBza2ItPmxlbik7CisJCQkJZGVidWdfZnJhbWUoc2tiKTsKKyNlbmRpZgorCQkJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCQkJc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJc2tiLT5wcm90b2NvbCA9IGhkbGNfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlza2IgPSBOVUxMOworCQkJfQorCisJCQlpZiAoIXNrYikgeworCQkJCXNrYiA9IGRldl9hbGxvY19za2IoQlVGRkVSX0xFTkdUSCk7CisJCQkJZGVzYy0+YWRkcmVzcyA9IHNrYiA/CisJCQkJCXBjaV9tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJCSAgICAgICBCVUZGRVJfTEVOR1RILAorCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSkgOiAwOworCQkJCWNhcmQtPnJ4X3NrYnNbY2FyZC0+cnhfaW5dID0gc2tiOworCQkJfQorCQl9CisJCWRlc2MtPnN0YXQgPSBQQUNLRVRfRU1QVFk7IC8qIEZyZWUgZGVzY3JpcHRvciAqLworCQljYXJkLT5yeF9pbiA9IChjYXJkLT5yeF9pbiArIDEpICUgUlhfUVVFVUVfTEVOR1RIOworCX0KK30KKworCisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3YW54bF9pbnRyKGludCBpcnEsIHZvaWQqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgICAgIGNhcmRfdCAqY2FyZCA9IGRldl9pZDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHUzMiBzdGF0OworICAgICAgICBpbnQgaGFuZGxlZCA9IDA7CisKKworICAgICAgICB3aGlsZSgoc3RhdCA9IHJlYWRsKGNhcmQtPnBseCArIFBMWF9ET09SQkVMTF9GUk9NX0NBUkQpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IDE7CisJCXdyaXRlbChzdGF0LCBjYXJkLT5wbHggKyBQTFhfRE9PUkJFTExfRlJPTV9DQVJEKTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYXJkLT5uX3BvcnRzOyBpKyspIHsKKwkJCWlmIChzdGF0ICYgKDEgPDwgKERPT1JCRUxMX0ZST01fQ0FSRF9UWF8wICsgaSkpKQorCQkJCXdhbnhsX3R4X2ludHIoJmNhcmQtPnBvcnRzW2ldKTsKKwkJCWlmIChzdGF0ICYgKDEgPDwgKERPT1JCRUxMX0ZST01fQ0FSRF9DQUJMRV8wICsgaSkpKQorCQkJCXdhbnhsX2NhYmxlX2ludHIoJmNhcmQtPnBvcnRzW2ldKTsKKwkJfQorCQlpZiAoc3RhdCAmICgxIDw8IERPT1JCRUxMX0ZST01fQ0FSRF9SWCkpCisJCQl3YW54bF9yeF9pbnRyKGNhcmQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKworCitzdGF0aWMgaW50IHdhbnhsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlkZXNjX3QgKmRlc2M7CisKKyAgICAgICAgc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKKworCWRlc2MgPSAmZ2V0X3N0YXR1cyhwb3J0KS0+dHhfZGVzY3NbcG9ydC0+dHhfb3V0XTsKKyAgICAgICAgaWYgKGRlc2MtPnN0YXQgIT0gUEFDS0VUX0VNUFRZKSB7CisgICAgICAgICAgICAgICAgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAtIHByZXZpb3VzIHhtaXQgc2hvdWxkIHN0b3AgcXVldWUgKi8KKyNpZmRlZiBERUJVR19QS1QKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRyYW5zbWl0dGVyIGJ1ZmZlciBmdWxsXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKKwkJcmV0dXJuIDE7ICAgICAgIC8qIHJlcXVlc3QgcGFja2V0IHRvIGJlIHF1ZXVlZCAqLworCX0KKworI2lmZGVmIERFQlVHX1BLVAorCXByaW50ayhLRVJOX0RFQlVHICIlcyBUWCglaSk6IiwgZGV2LT5uYW1lLCBza2ItPmxlbik7CisJZGVidWdfZnJhbWUoc2tiKTsKKyNlbmRpZgorCisJcG9ydC0+dHhfc2tic1twb3J0LT50eF9vdXRdID0gc2tiOworCWRlc2MtPmFkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShwb3J0LT5jYXJkLT5wZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwlkZXNjLT5sZW5ndGggPSBza2ItPmxlbjsKKwlkZXNjLT5zdGF0ID0gUEFDS0VUX0ZVTEw7CisJd3JpdGVsKDEgPDwgKERPT1JCRUxMX1RPX0NBUkRfVFhfMCArIHBvcnQtPm5vZGUpLAorCSAgICAgICBwb3J0LT5jYXJkLT5wbHggKyBQTFhfRE9PUkJFTExfVE9fQ0FSRCk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlwb3J0LT50eF9vdXQgPSAocG9ydC0+dHhfb3V0ICsgMSkgJSBUWF9CVUZGRVJTOworCisJaWYgKGdldF9zdGF0dXMocG9ydCktPnR4X2Rlc2NzW3BvcnQtPnR4X291dF0uc3RhdCAhPSBQQUNLRVRfRU1QVFkpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworI2lmZGVmIERFQlVHX1BLVAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRyYW5zbWl0dGVyIGJ1ZmZlciBmdWxsXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJfQorCisJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCB3YW54bF9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgZW5jb2RpbmcsCisJCQl1bnNpZ25lZCBzaG9ydCBwYXJpdHkpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKworCWlmIChlbmNvZGluZyAhPSBFTkNPRElOR19OUlogJiYKKwkgICAgZW5jb2RpbmcgIT0gRU5DT0RJTkdfTlJaSSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGFyaXR5ICE9IFBBUklUWV9OT05FICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMzJfUFIxX0NDSVRUICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMzJfUFIwX0NDSVRUICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMTZfUFIwX0NDSVRUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdldF9zdGF0dXMocG9ydCktPmVuY29kaW5nID0gZW5jb2Rpbmc7CisJZ2V0X3N0YXR1cyhwb3J0KS0+cGFyaXR5ID0gcGFyaXR5OworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCB3YW54bF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihzeW5jX3NlcmlhbF9zZXR0aW5ncyk7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgbGluZTsKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCisJaWYgKGNtZCAhPSBTSU9DV0FOREVWKQorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKworCXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX0lGQUNFOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfU1lOQ19TRVJJQUw7CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlsaW5lLmNsb2NrX3R5cGUgPSBnZXRfc3RhdHVzKHBvcnQpLT5jbG9ja2luZzsKKwkJbGluZS5jbG9ja19yYXRlID0gMDsKKwkJbGluZS5sb29wYmFjayA9IDA7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jLCAmbGluZSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX0lGQUNFX1NZTkNfU0VSSUFMOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZsaW5lLCBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jLAorCQkJCSAgIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGxpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19FWFQgJiYKKwkJICAgIGxpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19UWEZST01SWCkKKwkJCXJldHVybiAtRUlOVkFMOyAvKiBObyBzdWNoIGNsb2NrIHNldHRpbmcgKi8KKworCQlpZiAobGluZS5sb29wYmFjayAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZ2V0X3N0YXR1cyhwb3J0KS0+Y2xvY2tpbmcgPSBsaW5lLmNsb2NrX3R5cGU7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisgICAgICAgIH0KK30KKworCisKK3N0YXRpYyBpbnQgd2FueGxfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJdTggX19pb21lbSAqZGJyID0gcG9ydC0+Y2FyZC0+cGx4ICsgUExYX0RPT1JCRUxMX1RPX0NBUkQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCBpOworCisJaWYgKGdldF9zdGF0dXMocG9ydCktPm9wZW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcG9ydCBhbHJlYWR5IG9wZW5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoKGkgPSBoZGxjX29wZW4oZGV2KSkgIT0gMCkKKwkJcmV0dXJuIGk7CisKKwlwb3J0LT50eF9pbiA9IHBvcnQtPnR4X291dCA9IDA7CisJZm9yIChpID0gMDsgaSA8IFRYX0JVRkZFUlM7IGkrKykKKwkJZ2V0X3N0YXR1cyhwb3J0KS0+dHhfZGVzY3NbaV0uc3RhdCA9IFBBQ0tFVF9FTVBUWTsKKwkvKiBzaWduYWwgdGhlIGNhcmQgKi8KKwl3cml0ZWwoMSA8PCAoRE9PUkJFTExfVE9fQ0FSRF9PUEVOXzAgKyBwb3J0LT5ub2RlKSwgZGJyKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJZG8KKwkJaWYgKGdldF9zdGF0dXMocG9ydCktPm9wZW4pIHsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQlyZXR1cm4gMDsKKwkJfQorCXdoaWxlICh0aW1lX2FmdGVyKHRpbWVvdXQsIGppZmZpZXMpKTsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBvcGVuIHBvcnRcbiIsIGRldi0+bmFtZSk7CisJLyogYXNrIHRoZSBjYXJkIHRvIGNsb3NlIHRoZSBwb3J0LCBzaG91bGQgaXQgYmUgc3RpbGwgYWxpdmUgKi8KKwl3cml0ZWwoMSA8PCAoRE9PUkJFTExfVE9fQ0FSRF9DTE9TRV8wICsgcG9ydC0+bm9kZSksIGRicik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKKworCitzdGF0aWMgaW50IHdhbnhsX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJaW50IGk7CisKKwloZGxjX2Nsb3NlKGRldik7CisJLyogc2lnbmFsIHRoZSBjYXJkICovCisJd3JpdGVsKDEgPDwgKERPT1JCRUxMX1RPX0NBUkRfQ0xPU0VfMCArIHBvcnQtPm5vZGUpLAorCSAgICAgICBwb3J0LT5jYXJkLT5wbHggKyBQTFhfRE9PUkJFTExfVE9fQ0FSRCk7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIEhaOworCWRvCisJCWlmICghZ2V0X3N0YXR1cyhwb3J0KS0+b3BlbikKKwkJCWJyZWFrOworCXdoaWxlICh0aW1lX2FmdGVyKHRpbWVvdXQsIGppZmZpZXMpKTsKKworCWlmIChnZXRfc3RhdHVzKHBvcnQpLT5vcGVuKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gY2xvc2UgcG9ydFxuIiwgZGV2LT5uYW1lKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBUWF9CVUZGRVJTOyBpKyspIHsKKwkJZGVzY190ICpkZXNjID0gJmdldF9zdGF0dXMocG9ydCktPnR4X2Rlc2NzW2ldOworCisJCWlmIChkZXNjLT5zdGF0ICE9IFBBQ0tFVF9FTVBUWSkgeworCQkJZGVzYy0+c3RhdCA9IFBBQ0tFVF9FTVBUWTsKKwkJCXBjaV91bm1hcF9zaW5nbGUocG9ydC0+Y2FyZC0+cGRldiwgZGVzYy0+YWRkcmVzcywKKwkJCQkJIHBvcnQtPnR4X3NrYnNbaV0tPmxlbiwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihwb3J0LT50eF9za2JzW2ldKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqd2FueGxfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisKKwlzdGF0cy0+cnhfb3Zlcl9lcnJvcnMgPSBnZXRfc3RhdHVzKHBvcnQpLT5yeF9vdmVycnVuczsKKwlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzID0gZ2V0X3N0YXR1cyhwb3J0KS0+cnhfZnJhbWVfZXJyb3JzOworCXN0YXRzLT5yeF9lcnJvcnMgPSBzdGF0cy0+cnhfb3Zlcl9lcnJvcnMgKyBzdGF0cy0+cnhfZnJhbWVfZXJyb3JzOworICAgICAgICByZXR1cm4gc3RhdHM7Cit9CisKKworCitzdGF0aWMgaW50IHdhbnhsX3B1dHNfY29tbWFuZChjYXJkX3QgKmNhcmQsIHUzMiBjbWQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIDUgKiBIWjsKKworCXdyaXRlbChjbWQsIGNhcmQtPnBseCArIFBMWF9NQUlMQk9YXzEpOworCWRvIHsKKwkJaWYgKHJlYWRsKGNhcmQtPnBseCArIFBMWF9NQUlMQk9YXzEpID09IDApCisJCQlyZXR1cm4gMDsKKworCQlzY2hlZHVsZSgpOworCX13aGlsZSAodGltZV9hZnRlcih0aW1lb3V0LCBqaWZmaWVzKSk7CisKKwlyZXR1cm4gLTE7Cit9CisKKworCitzdGF0aWMgdm9pZCB3YW54bF9yZXNldChjYXJkX3QgKmNhcmQpCit7CisJdTMyIG9sZF92YWx1ZSA9IHJlYWRsKGNhcmQtPnBseCArIFBMWF9DT05UUk9MKSAmIH5QTFhfQ1RMX1JFU0VUOworCisJd3JpdGVsKDB4ODAsIGNhcmQtPnBseCArIFBMWF9NQUlMQk9YXzApOworCXdyaXRlbChvbGRfdmFsdWUgfCBQTFhfQ1RMX1JFU0VULCBjYXJkLT5wbHggKyBQTFhfQ09OVFJPTCk7CisJcmVhZGwoY2FyZC0+cGx4ICsgUExYX0NPTlRST0wpOyAvKiB3YWl0IGZvciBwb3N0ZWQgd3JpdGUgKi8KKwl1ZGVsYXkoMSk7CisJd3JpdGVsKG9sZF92YWx1ZSwgY2FyZC0+cGx4ICsgUExYX0NPTlRST0wpOworCXJlYWRsKGNhcmQtPnBseCArIFBMWF9DT05UUk9MKTsgLyogd2FpdCBmb3IgcG9zdGVkIHdyaXRlICovCit9CisKKworCitzdGF0aWMgdm9pZCB3YW54bF9wY2lfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwljYXJkX3QgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bl9wb3J0czsgaSsrKSB7CisJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UoY2FyZC0+cG9ydHNbaV0uZGV2KTsKKwkJZnJlZV9uZXRkZXYoY2FyZC0+cG9ydHNbaV0uZGV2KTsKKwl9CisKKwkvKiB1bnJlZ2lzdGVyIGFuZCBmcmVlIGFsbCBob3N0IHJlc291cmNlcyAqLworCWlmIChjYXJkLT5pcnEpCisJCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CisKKwl3YW54bF9yZXNldChjYXJkKTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9MRU5HVEg7IGkrKykKKwkJaWYgKGNhcmQtPnJ4X3NrYnNbaV0pIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoY2FyZC0+cGRldiwKKwkJCQkJIGNhcmQtPnN0YXR1cy0+cnhfZGVzY3NbaV0uYWRkcmVzcywKKwkJCQkJIEJVRkZFUl9MRU5HVEgsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKGNhcmQtPnJ4X3NrYnNbaV0pOworCQl9CisKKwlpZiAoY2FyZC0+cGx4KQorCQlpb3VubWFwKGNhcmQtPnBseCk7CisKKwlpZiAoY2FyZC0+c3RhdHVzKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZihjYXJkX3N0YXR1c190KSwKKwkJCQkgICAgY2FyZC0+c3RhdHVzLCBjYXJkLT5zdGF0dXNfYWRkcmVzcyk7CisKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUoY2FyZCk7Cit9CisKKworI2luY2x1ZGUgIndhbnhsZncuaW5jIgorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3YW54bF9wY2lfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJY2FyZF90ICpjYXJkOworCXUzMiByYW1zaXplLCBzdGF0OworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl1MzIgcGx4X3BoeTsJCS8qIFBMWCBQQ0kgYmFzZSBhZGRyZXNzICovCisJdTMyIG1lbV9waHk7CQkvKiBtZW1vcnkgUENJIGJhc2UgYWRkciAqLworCXU4IF9faW9tZW0gKm1lbTsJLyogbWVtb3J5IHZpcnR1YWwgYmFzZSBhZGRyICovCisJaW50IGksIHBvcnRzLCBhbGxvY19zaXplOworCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKSB7CisJCXByaW50ZWRfdmVyc2lvbisrOworCQlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CisJfQorI2VuZGlmCisKKwlpID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCisJLyogUVVJQ0MgY2FuIG9ubHkgYWNjZXNzIGZpcnN0IDI1NiBNQiBvZiBob3N0IFJBTSBkaXJlY3RseSwKKwkgICBidXQgUExYOTA2MCBETUEgZG9lcyAzMi1iaXRzIGZvciBhY3R1YWwgcGFja2V0IGRhdGEgdHJhbnNmZXJzICovCisKKwkvKiBGSVhNRSB3aGVuIFBDSS9ETUEgc3Vic3lzdGVtcyBhcmUgZml4ZWQuCisJICAgV2Ugc2V0IGJvdGggZG1hX21hc2sgYW5kIGNvbnNpc3RlbnRfZG1hX21hc2sgdG8gMjggYml0cworCSAgIGFuZCBwcmF5IHBjaV9hbGxvY19jb25zaXN0ZW50KCkgd2lsbCB1c2UgdGhpcyBpbmZvLiBJdCBzaG91bGQKKwkgICB3b3JrIG9uIG1vc3QgcGxhdGZvcm1zICovCisJaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCAweDBGRkZGRkZGKSB8fAorCSAgICBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4MEZGRkZGRkYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAid2FuWEw6IE5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWkgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJ3YW5YTCIpOworCWlmIChpKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcmV0dXJuIGk7CisJfQorCisJc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfU0JFX1dBTlhMMTAwOiBwb3J0cyA9IDE7IGJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9TQkVfV0FOWEwyMDA6IHBvcnRzID0gMjsgYnJlYWs7CisJZGVmYXVsdDogcG9ydHMgPSA0OworCX0KKworCWFsbG9jX3NpemUgPSBzaXplb2YoY2FyZF90KSArIHBvcnRzICogc2l6ZW9mKHBvcnRfdCk7CisJY2FyZCA9IGttYWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcmQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIndhblhMICVzOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisJbWVtc2V0KGNhcmQsIDAsIGFsbG9jX3NpemUpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCWNhcmQtPnBkZXYgPSBwZGV2OworCisJY2FyZC0+c3RhdHVzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKGNhcmRfc3RhdHVzX3QpLAorCQkJCQkgICAgJmNhcmQtPnN0YXR1c19hZGRyZXNzKTsKKwlpZiAoY2FyZC0+c3RhdHVzID09IE5VTEwpIHsKKwkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKyNpZmRlZiBERUJVR19QQ0kKKwlwcmludGsoS0VSTl9ERUJVRyAid2FuWEwgJXM6IHBjaV9hbGxvY19jb25zaXN0ZW50KCkgcmV0dXJuZWQgbWVtb3J5IgorCSAgICAgICAiIGF0IDB4JUxYXG4iLCBwY2lfbmFtZShwZGV2KSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyljYXJkLT5zdGF0dXNfYWRkcmVzcyk7CisjZW5kaWYKKworCS8qIEZJWE1FIHdoZW4gUENJL0RNQSBzdWJzeXN0ZW1zIGFyZSBmaXhlZC4KKwkgICBXZSBzZXQgYm90aCBkbWFfbWFzayBhbmQgY29uc2lzdGVudF9kbWFfbWFzayBiYWNrIHRvIDMyIGJpdHMKKwkgICB0byBpbmRpY2F0ZSB0aGUgY2FyZCBjYW4gZG8gMzItYml0IERNQSBhZGRyZXNzaW5nICovCisJaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCAweEZGRkZGRkZGKSB8fAorCSAgICBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAid2FuWEw6IE5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvblxuIik7CisJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBzZXQgdXAgUExYIG1hcHBpbmcgKi8KKwlwbHhfcGh5ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWNhcmQtPnBseCA9IGlvcmVtYXBfbm9jYWNoZShwbHhfcGh5LCAweDcwKTsKKworI2lmIFJFU0VUX1dISUxFX0xPQURJTkcKKwl3YW54bF9yZXNldChjYXJkKTsKKyNlbmRpZgorCisJdGltZW91dCA9IGppZmZpZXMgKyAyMCAqIEhaOworCXdoaWxlICgoc3RhdCA9IHJlYWRsKGNhcmQtPnBseCArIFBMWF9NQUlMQk9YXzApKSAhPSAwKSB7CisJCWlmICh0aW1lX2JlZm9yZSh0aW1lb3V0LCBqaWZmaWVzKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FuWEwgJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IiCisJCQkgICAgICAgIiBQVVRTIHRvIGNvbXBsZXRlXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJc3dpdGNoKHN0YXQgJiAweEMwKSB7CisJCWNhc2UgMHgwMDoJLyogaG1tIC0gUFVUUyBjb21wbGV0ZWQgd2l0aCBub24temVybyBjb2RlPyAqLworCQljYXNlIDB4ODA6CS8qIFBVVFMgc3RpbGwgdGVzdGluZyB0aGUgaGFyZHdhcmUgKi8KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YW5YTCAlczogUFVUUyB0ZXN0IDB4JVgiCisJCQkgICAgICAgIiBmYWlsZWRcbiIsIHBjaV9uYW1lKHBkZXYpLCBzdGF0ICYgMHgzMCk7CisJCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJc2NoZWR1bGUoKTsKKwl9CisKKwkvKiBnZXQgb24tYm9hcmQgbWVtb3J5IHNpemUgKFBVVFMgZGV0ZWN0cyBubyBtb3JlIHRoYW4gNCBNQikgKi8KKwlyYW1zaXplID0gcmVhZGwoY2FyZC0+cGx4ICsgUExYX01BSUxCT1hfMikgJiBNQlgyX01FTVNaX01BU0s7CisKKwkvKiBzZXQgdXAgb24tYm9hcmQgUkFNIG1hcHBpbmcgKi8KKwltZW1fcGh5ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOworCisKKwkvKiBzYW5pdHkgY2hlY2sgdGhlIGJvYXJkJ3MgcmVwb3J0ZWQgbWVtb3J5IHNpemUgKi8KKwlpZiAocmFtc2l6ZSA8IEJVRkZFUlNfQUREUiArCisJICAgIChUWF9CVUZGRVJTICsgUlhfQlVGRkVSUykgKiBCVUZGRVJfTEVOR1RIICogcG9ydHMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FuWEwgJXM6IG5vIGVub3VnaCBvbi1ib2FyZCBSQU0iCisJCSAgICAgICAiICgldSBieXRlcyBkZXRlY3RlZCwgJXUgYnl0ZXMgcmVxdWlyZWQpXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldiksIHJhbXNpemUsIEJVRkZFUlNfQUREUiArCisJCSAgICAgICAoVFhfQlVGRkVSUyArIFJYX0JVRkZFUlMpICogQlVGRkVSX0xFTkdUSCAqIHBvcnRzKTsKKwkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICh3YW54bF9wdXRzX2NvbW1hbmQoY2FyZCwgTUJYMV9DTURfQlNXQVApKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhblhMICVzOiB1bmFibGUgdG8gU2V0IEJ5dGUgU3dhcCIKKwkJICAgICAgICIgTW9kZVxuIiwgcGNpX25hbWUocGRldikpOworCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFJYX1FVRVVFX0xFTkdUSDsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKEJVRkZFUl9MRU5HVEgpOworCQljYXJkLT5yeF9za2JzW2ldID0gc2tiOworCQlpZiAoc2tiKQorCQkJY2FyZC0+c3RhdHVzLT5yeF9kZXNjc1tpXS5hZGRyZXNzID0KKwkJCQlwY2lfbWFwX3NpbmdsZShjYXJkLT5wZGV2LCBza2ItPmRhdGEsCisJCQkJCSAgICAgICBCVUZGRVJfTEVOR1RILAorCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwl9CisKKwltZW0gPSBpb3JlbWFwX25vY2FjaGUobWVtX3BoeSwgUERNX09GRlNFVCArIHNpemVvZihmaXJtd2FyZSkpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoZmlybXdhcmUpOyBpICs9IDQpCisJCXdyaXRlbChodG9ubCgqKHUzMiopKGZpcm13YXJlICsgaSkpLCBtZW0gKyBQRE1fT0ZGU0VUICsgaSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydHM7IGkrKykKKwkJd3JpdGVsKGNhcmQtPnN0YXR1c19hZGRyZXNzICsKKwkJICAgICAgICh2b2lkICopJmNhcmQtPnN0YXR1cy0+cG9ydF9zdGF0dXNbaV0gLQorCQkgICAgICAgKHZvaWQgKiljYXJkLT5zdGF0dXMsIG1lbSArIFBETV9PRkZTRVQgKyA0ICsgaSAqIDQpOworCXdyaXRlbChjYXJkLT5zdGF0dXNfYWRkcmVzcywgbWVtICsgUERNX09GRlNFVCArIDIwKTsKKwl3cml0ZWwoUERNX09GRlNFVCwgbWVtKTsKKwlpb3VubWFwKG1lbSk7CisKKwl3cml0ZWwoMCwgY2FyZC0+cGx4ICsgUExYX01BSUxCT1hfNSk7CisKKwlpZiAod2FueGxfcHV0c19jb21tYW5kKGNhcmQsIE1CWDFfQ01EX0FCT1JUSikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FuWEwgJXM6IHVuYWJsZSB0byBBYm9ydCBhbmQgSnVtcFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXN0YXQgPSAwOworCXRpbWVvdXQgPSBqaWZmaWVzICsgNSAqIEhaOworCWRvIHsKKwkJaWYgKChzdGF0ID0gcmVhZGwoY2FyZC0+cGx4ICsgUExYX01BSUxCT1hfNSkpICE9IDApCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9d2hpbGUgKHRpbWVfYWZ0ZXIodGltZW91dCwgamlmZmllcykpOworCisJaWYgKCFzdGF0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhblhMICVzOiB0aW1lb3V0IHdoaWxlIGluaXRpYWxpemluZyBjYXJkIgorCQkgICAgICAgImZpcm13YXJlXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKyNpZiBERVRFQ1RfUkFNCisJcmFtc2l6ZSA9IHN0YXQ7CisjZW5kaWYKKworCXByaW50ayhLRVJOX0lORk8gIndhblhMICVzOiBhdCAweCVYLCAldSBLQiBvZiBSQU0gYXQgMHglWCwgaXJxICV1XG4iLAorCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcGx4X3BoeSwgcmFtc2l6ZSAvIDEwMjQsIG1lbV9waHksIHBkZXYtPmlycSk7CisKKwkvKiBBbGxvY2F0ZSBJUlEgKi8KKwlpZiAocmVxdWVzdF9pcnEocGRldi0+aXJxLCB3YW54bF9pbnRyLCBTQV9TSElSUSwgIndhblhMIiwgY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FuWEwgJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBJUlElaS5cbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcGRldi0+aXJxKTsKKwkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWNhcmQtPmlycSA9IHBkZXYtPmlycTsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0czsgaSsrKSB7CisJCWhkbGNfZGV2aWNlICpoZGxjOworCQlwb3J0X3QgKnBvcnQgPSAmY2FyZC0+cG9ydHNbaV07CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19oZGxjZGV2KHBvcnQpOworCQlpZiAoIWRldikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ3YW5YTCAlczogdW5hYmxlIHRvIGFsbG9jYXRlIgorCQkJICAgICAgICIgbWVtb3J5XG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJcG9ydC0+ZGV2ID0gZGV2OworCQloZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBvcnQtPmxvY2spOworCQlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJCWRldi0+dHhfcXVldWVfbGVuID0gNTA7CisJCWRldi0+ZG9faW9jdGwgPSB3YW54bF9pb2N0bDsKKwkJZGV2LT5vcGVuID0gd2FueGxfb3BlbjsKKwkJZGV2LT5zdG9wID0gd2FueGxfY2xvc2U7CisJCWhkbGMtPmF0dGFjaCA9IHdhbnhsX2F0dGFjaDsKKwkJaGRsYy0+eG1pdCA9IHdhbnhsX3htaXQ7CisJCWRldi0+Z2V0X3N0YXRzID0gd2FueGxfZ2V0X3N0YXRzOworCQlwb3J0LT5jYXJkID0gY2FyZDsKKwkJcG9ydC0+bm9kZSA9IGk7CisJCWdldF9zdGF0dXMocG9ydCktPmNsb2NraW5nID0gQ0xPQ0tfRVhUOworCQlpZiAocmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ3YW5YTCAlczogdW5hYmxlIHRvIHJlZ2lzdGVyIGhkbGMiCisJCQkgICAgICAgIiBkZXZpY2VcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQljYXJkLT5uX3BvcnRzKys7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAid2FuWEwgJXM6IHBvcnQiLCBwY2lfbmFtZShwZGV2KSk7CisJZm9yIChpID0gMDsgaSA8IHBvcnRzOyBpKyspCisJCXByaW50aygiJXMgIyVpOiAlcyIsIGkgPyAiLCIgOiAiIiwgaSwKKwkJICAgICAgIGNhcmQtPnBvcnRzW2ldLmRldi0+bmFtZSk7CisJcHJpbnRrKCJcbiIpOworCisJZm9yIChpID0gMDsgaSA8IHBvcnRzOyBpKyspCisJCXdhbnhsX2NhYmxlX2ludHIoJmNhcmQtPnBvcnRzW2ldKTsgLyogZ2V0IGNhcnJpZXIgc3RhdHVzIGV0Yy4qLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3YW54bF9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfU0JFLCBQQ0lfREVWSUNFX0lEX1NCRV9XQU5YTDEwMCwgUENJX0FOWV9JRCwKKwkgIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfU0JFLCBQQ0lfREVWSUNFX0lEX1NCRV9XQU5YTDIwMCwgUENJX0FOWV9JRCwKKwkgIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfU0JFLCBQQ0lfREVWSUNFX0lEX1NCRV9XQU5YTDQwMCwgUENJX0FOWV9JRCwKKwkgIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDAsIH0KK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHdhbnhsX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIndhblhMIiwKKwkuaWRfdGFibGUJPSB3YW54bF9wY2lfdGJsLAorCS5wcm9iZQkJPSB3YW54bF9wY2lfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSB3YW54bF9wY2lfcmVtb3ZlX29uZSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgd2FueGxfaW5pdF9tb2R1bGUodm9pZCkKK3sKKyNpZmRlZiBNT0RVTEUKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CisjZW5kaWYKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ3YW54bF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHdhbnhsX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ3YW54bF9wY2lfZHJpdmVyKTsKK30KKworCitNT0RVTEVfQVVUSE9SKCJLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQkUgSW5jLiB3YW5YTCBzZXJpYWwgcG9ydCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB3YW54bF9wY2lfdGJsKTsKKworbW9kdWxlX2luaXQod2FueGxfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQod2FueGxfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmggYi9kcml2ZXJzL25ldC93YW4vd2FueGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjg2NTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiB3YW5YTCBzZXJpYWwgY2FyZCBkcml2ZXIgZm9yIExpbnV4CisgKiBkZWZpbml0aW9ucyBjb21tb24gdG8gaG9zdCBkcml2ZXIgYW5kIGNhcmQgZmlybXdhcmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNkZWZpbmUgUkVTRVRfV0hJTEVfTE9BRElORyAwCisKKy8qIHlvdSBtdXN0IHJlYnVpbGQgdGhlIGZpcm13YXJlIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIGlzIGNoYW5nZWQgKi8KKyNkZWZpbmUgREVURUNUX1JBTSAwCQkvKiBuZWVkZWQgZm9yID4gNE1CIFJBTSwgMTYgTUIgbWF4aW11bSAqLworI2RlZmluZSBRVUlDQ19NRU1DUFlfVVNFU19QTFggMQkvKiBtdXN0IGJlIHVzZWQgaWYgdGhlIGhvc3QgaGFzID4gMjU2IE1CIFJBTSAqLworCisKKyNkZWZpbmUgU1RBVFVTX0NBQkxFX1YzNQkyCisjZGVmaW5lIFNUQVRVU19DQUJMRV9YMjEJMworI2RlZmluZSBTVEFUVVNfQ0FCTEVfVjI0CTQKKyNkZWZpbmUgU1RBVFVTX0NBQkxFX0VJQTUzMAk1CisjZGVmaW5lIFNUQVRVU19DQUJMRV9JTlZBTElECTYKKyNkZWZpbmUgU1RBVFVTX0NBQkxFX05PTkUJNworCisjZGVmaW5lIFNUQVRVU19DQUJMRV9EQ0UJMHg4MDAwCisjZGVmaW5lIFNUQVRVU19DQUJMRV9EU1IJMHgwMDEwCisjZGVmaW5lIFNUQVRVU19DQUJMRV9EQ0QJMHgwMDA4CisjZGVmaW5lIFNUQVRVU19DQUJMRV9QTV9TSElGVAk1CisKKyNkZWZpbmUgUERNX09GRlNFVCAweDEwMDAKKworI2RlZmluZSBUWF9CVUZGRVJTIDEwCQkvKiBwZXIgcG9ydCAqLworI2RlZmluZSBSWF9CVUZGRVJTIDMwCisjZGVmaW5lIFJYX1FVRVVFX0xFTkdUSCA0MAkvKiBjYXJkLT5ob3N0IHF1ZXVlIGxlbmd0aCAtIHBlciBjYXJkICovCisKKyNkZWZpbmUgUEFDS0VUX0VNUFRZCQkweDAwCisjZGVmaW5lIFBBQ0tFVF9GVUxMCQkweDEwCisjZGVmaW5lIFBBQ0tFVF9TRU5UCQkweDIwIC8qIFRYIG9ubHkgKi8KKyNkZWZpbmUgUEFDS0VUX1VOREVSUlVOCQkweDMwIC8qIFRYIG9ubHkgKi8KKyNkZWZpbmUgUEFDS0VUX1BPUlRfTUFTSwkweDAzIC8qIFJYIG9ubHkgKi8KKworLyogYml0IG51bWJlcnMgaW4gUExYOTA2MCBkb29yYmVsbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRE9PUkJFTExfRlJPTV9DQVJEX1RYXzAJCTAgLyogcGFja2V0IHNlbnQgYnkgdGhlIGNhcmQgKi8KKyNkZWZpbmUgRE9PUkJFTExfRlJPTV9DQVJEX1RYXzEJCTEKKyNkZWZpbmUgRE9PUkJFTExfRlJPTV9DQVJEX1RYXzIJCTIKKyNkZWZpbmUgRE9PUkJFTExfRlJPTV9DQVJEX1RYXzMJCTMKKyNkZWZpbmUgRE9PUkJFTExfRlJPTV9DQVJEX1JYCQk0CisjZGVmaW5lIERPT1JCRUxMX0ZST01fQ0FSRF9DQUJMRV8wCTUgLyogY2FibGUvUE0vZXRjLiBjaGFuZ2VkICovCisjZGVmaW5lIERPT1JCRUxMX0ZST01fQ0FSRF9DQUJMRV8xCTYKKyNkZWZpbmUgRE9PUkJFTExfRlJPTV9DQVJEX0NBQkxFXzIJNworI2RlZmluZSBET09SQkVMTF9GUk9NX0NBUkRfQ0FCTEVfMwk4CisKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9PUEVOXzAJCTAKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9PUEVOXzEJCTEKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9PUEVOXzIJCTIKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9PUEVOXzMJCTMKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9DTE9TRV8wCTQKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9DTE9TRV8xCTUKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9DTE9TRV8yCTYKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9DTE9TRV8zCTcKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9UWF8wCQk4IC8qIG91dGJvdW5kIHBhY2tldCBxdWV1ZWQgKi8KKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9UWF8xCQk5CisjZGVmaW5lIERPT1JCRUxMX1RPX0NBUkRfVFhfMgkJMTAKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9UWF8zCQkxMQorCisvKiBmaXJtd2FyZS1vbmx5IHN0YXR1cyBiaXRzLCBzdGFydGluZyBmcm9tIGxhc3QgRE9PUkJFTExfVE9fQ0FSRCArIDEgKi8KKyNkZWZpbmUgVEFTS19TQ0NfMAkJCTEyCisjZGVmaW5lIFRBU0tfU0NDXzEJCQkxMworI2RlZmluZSBUQVNLX1NDQ18yCQkJMTQKKyNkZWZpbmUgVEFTS19TQ0NfMwkJCTE1CisKKyNkZWZpbmUgQUxJR04zMih4KSAoKCh4KSArIDMpICYgMHhGRkZGRkZGQykKKyNkZWZpbmUgQlVGRkVSX0xFTkdUSAlBTElHTjMyKEhETENfTUFYX01SVSArIDQpIC8qIDQgYnl0ZXMgZm9yIDMyLWJpdCBDUkMgKi8KKworLyogQWRkcmVzcyBvZiBUWCBhbmQgUlggYnVmZmVycyBpbiA2ODM2MCBhZGRyZXNzIHNwYWNlICovCisjZGVmaW5lIEJVRkZFUlNfQUREUgkweDQwMDAJLyogMTYgS0IgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxFUl9fCisjZGVmaW5lIFBMWF9PRkZTRVQJCTAKKyNlbHNlCisjZGVmaW5lIFBMWF9PRkZTRVQJCVBMWCArIDB4ODAKKyNlbmRpZgorCisjZGVmaW5lIFBMWF9NQUlMQk9YXzAJCShQTFhfT0ZGU0VUICsgMHg0MCkKKyNkZWZpbmUgUExYX01BSUxCT1hfMQkJKFBMWF9PRkZTRVQgKyAweDQ0KQorI2RlZmluZSBQTFhfTUFJTEJPWF8yCQkoUExYX09GRlNFVCArIDB4NDgpCisjZGVmaW5lIFBMWF9NQUlMQk9YXzMJCShQTFhfT0ZGU0VUICsgMHg0QykKKyNkZWZpbmUgUExYX01BSUxCT1hfNAkJKFBMWF9PRkZTRVQgKyAweDUwKQorI2RlZmluZSBQTFhfTUFJTEJPWF81CQkoUExYX09GRlNFVCArIDB4NTQpCisjZGVmaW5lIFBMWF9NQUlMQk9YXzYJCShQTFhfT0ZGU0VUICsgMHg1OCkKKyNkZWZpbmUgUExYX01BSUxCT1hfNwkJKFBMWF9PRkZTRVQgKyAweDVDKQorI2RlZmluZSBQTFhfRE9PUkJFTExfVE9fQ0FSRAkoUExYX09GRlNFVCArIDB4NjApCisjZGVmaW5lIFBMWF9ET09SQkVMTF9GUk9NX0NBUkQJKFBMWF9PRkZTRVQgKyAweDY0KQorI2RlZmluZSBQTFhfSU5URVJSVVBUX0NTCShQTFhfT0ZGU0VUICsgMHg2OCkKKyNkZWZpbmUgUExYX0NPTlRST0wJCShQTFhfT0ZGU0VUICsgMHg2QykKKworI2lmZGVmIF9fQVNTRU1CTEVSX18KKyNkZWZpbmUgUExYX0RNQV8wX01PREUJCShQTFggKyAweDEwMCkKKyNkZWZpbmUgUExYX0RNQV8wX1BDSQkJKFBMWCArIDB4MTA0KQorI2RlZmluZSBQTFhfRE1BXzBfTE9DQUwJCShQTFggKyAweDEwOCkKKyNkZWZpbmUgUExYX0RNQV8wX0xFTkdUSAkoUExYICsgMHgxMEMpCisjZGVmaW5lIFBMWF9ETUFfMF9ERVNDCQkoUExYICsgMHgxMTApCisjZGVmaW5lIFBMWF9ETUFfMV9NT0RFCQkoUExYICsgMHgxMTQpCisjZGVmaW5lIFBMWF9ETUFfMV9QQ0kJCShQTFggKyAweDExOCkKKyNkZWZpbmUgUExYX0RNQV8xX0xPQ0FMCQkoUExYICsgMHgxMUMpCisjZGVmaW5lIFBMWF9ETUFfMV9MRU5HVEgJKFBMWCArIDB4MTIwKQorI2RlZmluZSBQTFhfRE1BXzFfREVTQwkJKFBMWCArIDB4MTI0KQorI2RlZmluZSBQTFhfRE1BX0NNRF9TVFMJCShQTFggKyAweDEyOCkKKyNkZWZpbmUgUExYX0RNQV9BUkJJVFJfMAkoUExYICsgMHgxMkMpCisjZGVmaW5lIFBMWF9ETUFfQVJCSVRSXzEJKFBMWCArIDB4MTMwKQorI2VuZGlmCisKKyNkZWZpbmUgREVTQ19MRU5HVEggMTIKKworLyogb2Zmc2V0cyBmcm9tIHN0YXJ0IG9mIHN0YXR1c190ICovCisvKiBjYXJkIHRvIGhvc3QgKi8KKyNkZWZpbmUgU1RBVFVTX09QRU4JCTAKKyNkZWZpbmUgU1RBVFVTX0NBQkxFCQkoU1RBVFVTX09QRU4gKyA0KQorI2RlZmluZSBTVEFUVVNfUlhfT1ZFUlJVTlMJKFNUQVRVU19DQUJMRSArIDQpCisjZGVmaW5lIFNUQVRVU19SWF9GUkFNRV9FUlJPUlMJKFNUQVRVU19SWF9PVkVSUlVOUyArIDQpCisKKy8qIGhvc3QgdG8gY2FyZCAqLworI2RlZmluZSBTVEFUVVNfUEFSSVRZCQkoU1RBVFVTX1JYX0ZSQU1FX0VSUk9SUyArIDQpCisjZGVmaW5lIFNUQVRVU19FTkNPRElORwkJKFNUQVRVU19QQVJJVFkgKyA0KQorI2RlZmluZSBTVEFUVVNfQ0xPQ0tJTkcJCShTVEFUVVNfRU5DT0RJTkcgKyA0KQorI2RlZmluZSBTVEFUVVNfVFhfREVTQ1MJCShTVEFUVVNfQ0xPQ0tJTkcgKyA0KQorCisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHUzMiBzdGF0OworCXUzMiBhZGRyZXNzOwkJLyogUENJIGFkZHJlc3MgKi8KKwl2b2xhdGlsZSB1MzIgbGVuZ3RoOworfWRlc2NfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisvLyBDYXJkIHRvIGhvc3QKKwl2b2xhdGlsZSB1MzIgb3BlbjsKKwl2b2xhdGlsZSB1MzIgY2FibGU7CisJdm9sYXRpbGUgdTMyIHJ4X292ZXJydW5zOworCXZvbGF0aWxlIHUzMiByeF9mcmFtZV9lcnJvcnM7CisKKy8vIEhvc3QgdG8gY2FyZAorCXUzMiBwYXJpdHk7CisJdTMyIGVuY29kaW5nOworCXUzMiBjbG9ja2luZzsKKwlkZXNjX3QgdHhfZGVzY3NbVFhfQlVGRkVSU107Cit9cG9ydF9zdGF0dXNfdDsKKworI2VuZGlmIC8qIF9fQVNTRU1CTEVSX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi93YW54bGZ3LlMgYi9kcml2ZXJzL25ldC93YW4vd2FueGxmdy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYWFlMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vd2FueGxmdy5TCkBAIC0wLDAgKzEsODk1IEBACisucHNpemUgMAorLyoKKyAgd2FuWEwgc2VyaWFsIGNhcmQgZHJpdmVyIGZvciBMaW51eAorICBjYXJkIGZpcm13YXJlIHBhcnQKKworICBDb3B5cmlnaHQgKEMpIDIwMDMgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworCisKKworCURQUkFNIEJEczoKKwkweDAwMCAtIDB4MDUwIFRYIzAJMHgwNTAgLSAweDE0MCBSWCMwCisJMHgxNDAgLSAweDE5MCBUWCMxCTB4MTkwIC0gMHgyODAgUlgjMQorCTB4MjgwIC0gMHgyRDAgVFgjMgkweDJEMCAtIDB4M0MwIFJYIzIKKwkweDNDMCAtIDB4NDEwIFRYIzMJMHg0MTAgLSAweDUwMCBSWCMzCisKKworCTAwMCA1RkYgMTUzNiBCeXRlcyBEdWFsLVBvcnQgUkFNIFVzZXIgRGF0YSAvIEJEcworCTYwMCA2RkYgMjU2IEJ5dGVzIER1YWwtUG9ydCBSQU0gVXNlciBEYXRhIC8gQkRzCisJNzAwIDdGRiAyNTYgQnl0ZXMgRHVhbC1Qb3J0IFJBTSBVc2VyIERhdGEgLyBCRHMKKwlDMDAgQ0JGIDE5MiBCeXRlcyBEdWFsLVBvcnQgUkFNIFBhcmFtZXRlciBSQU0gUGFnZSAxCisJRDAwIERCRiAxOTIgQnl0ZXMgRHVhbC1Qb3J0IFJBTSBQYXJhbWV0ZXIgUkFNIFBhZ2UgMgorCUUwMCBFQkYgMTkyIEJ5dGVzIER1YWwtUG9ydCBSQU0gUGFyYW1ldGVyIFJBTSBQYWdlIDMKKwlGMDAgRkJGIDE5MiBCeXRlcyBEdWFsLVBvcnQgUkFNIFBhcmFtZXRlciBSQU0gUGFnZSA0CisKKwlsb2NhbCBpbnRlcnJ1cHRzCQkgICAgbGV2ZWwKKwlOTUkJCQkJCTcKKwlQSVQgdGltZXIsIENQTSAoUlgvVFggY29tcGxldGUpCQk0CisJUENJOTA2MAlETUEgYW5kIFBDSSBkb29yYmVsbHMJCTMKKwlDYWJsZSAtIG5vdCB1c2VkCQkJMQorKi8KKworI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKyNpbmNsdWRlICJ3YW54bC5oIgorCisvKiBtZW1vcnkgYWRkcmVzc2VzIGFuZCBvZmZzZXRzICovCisKK01BWF9SQU1fU0laRQk9IDE2ICogMTAyNCAqIDEwMjQJLy8gbWF4IFJBTSBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUKKworUENJOTA2MF9WRUNUT1IJPSAweDAwMDAwMDZDCitDUE1fSVJRX0JBU0UJPSAweDQwCitFUlJPUl9WRUNUT1IJPSBDUE1fSVJRX0JBU0UgKiA0CitTQ0MxX1ZFQ1RPUgk9IChDUE1fSVJRX0JBU0UgKyAweDFFKSAqIDQKK1NDQzJfVkVDVE9SCT0gKENQTV9JUlFfQkFTRSArIDB4MUQpICogNAorU0NDM19WRUNUT1IJPSAoQ1BNX0lSUV9CQVNFICsgMHgxQykgKiA0CitTQ0M0X1ZFQ1RPUgk9IChDUE1fSVJRX0JBU0UgKyAweDFCKSAqIDQKK0NQTV9JUlFfTEVWRUwJPSA0CitUSU1FUl9JUlEJPSAxMjgKK1RJTUVSX0lSUV9MRVZFTCA9IDQKK1BJVFJfQ09OU1QJPSAweDEwMCArIDE2CQkvLyAxIEh6IHRpbWVyCisKK01CQVIJCT0gMHgwMDAzRkYwMAorCitWQUxVRV9XSU5ET1cJPSAweDQwMDAwMDAwCitPUkRFUl9XSU5ET1cJPSAweEMwMDAwMDAwCisKK1BMWAkJPSAweEZGRjkwMDAwCisKK0NTUkEJCT0gMHhGRkZCMDAwMAorQ1NSQgkJPSAweEZGRkIwMDAyCitDU1JDCQk9IDB4RkZGQjAwMDQKK0NTUkQJCT0gMHhGRkZCMDAwNgorU1RBVFVTX0NBQkxFX0xMCQk9IDB4MjAwMAorU1RBVFVTX0NBQkxFX0RUUgk9IDB4MTAwMAorCitEUFJCQVNFCQk9IDB4RkZGQzAwMDAKKworU0NDMV9CQVNFCT0gRFBSQkFTRSArIDB4QzAwCitNSVNDX0JBU0UJPSBEUFJCQVNFICsgMHhDQjAKK1NDQzJfQkFTRQk9IERQUkJBU0UgKyAweEQwMAorU0NDM19CQVNFCT0gRFBSQkFTRSArIDB4RTAwCitTQ0M0X0JBU0UJPSBEUFJCQVNFICsgMHhGMDAKKworLy8gb2Zmc2V0IGZyb20gU0NDeF9CQVNFCisvLyBTQ0NfeEJBU0UgY29udGFpbiBvZmZzZXRzIGZyb20gRFBSQkFTRSBhbmQgbXVzdCBiZSBkaXZpc2libGUgYnkgOAorU0NDX1JCQVNFCT0gMAkJLy8gMTYtYml0IFJ4QkQgYmFzZSBhZGRyZXNzCitTQ0NfVEJBU0UJPSAyCQkvLyAxNi1iaXQgVHhCRCBiYXNlIGFkZHJlc3MKK1NDQ19SRkNSCT0gNAkJLy8gOC1iaXQgUnggZnVuY3Rpb24gY29kZQorU0NDX1RGQ1IJPSA1CQkvLyA4LWJpdCBUeCBmdW5jdGlvbiBjb2RlCitTQ0NfTVJCTFIJPSA2CQkvLyAxNi1iaXQgbWF4aW11bSBSeCBidWZmZXIgbGVuZ3RoCitTQ0NfQ19NQVNLCT0gMHgzNAkJLy8gMzItYml0IENSQyBjb25zdGFudAorU0NDX0NfUFJFUwk9IDB4MzgJCS8vIDMyLWJpdCBDUkMgcHJlc2V0CitTQ0NfTUZMUgk9IDB4NDYJCS8vIDE2LWJpdCBtYXggUnggZnJhbWUgbGVuZ3RoICh3aXRob3V0IGZsYWdzKQorCitSRUdCQVNFCQk9IERQUkJBU0UgKyAweDEwMDAKK1BJQ1IJCT0gUkVHQkFTRSArIDB4MDI2CS8vIDE2LWJpdCBwZXJpb2RpYyBpcnEgY29udHJvbAorUElUUgkJPSBSRUdCQVNFICsgMHgwMkEJLy8gMTYtYml0IHBlcmlvZGljIGlycSB0aW1pbmcKK09SMQkJPSBSRUdCQVNFICsgMHgwNjQJLy8gMzItYml0IFJBTSBiYW5rICMxIG9wdGlvbnMKK0NJQ1IJCT0gUkVHQkFTRSArIDB4NTQwCS8vIDMyKDI0KS1iaXQgQ1AgaW50ZXJydXB0IGNvbmZpZworQ0lNUgkJPSBSRUdCQVNFICsgMHg1NDgJLy8gMzItYml0IENQIGludGVycnVwdCBtYXNrCitDSVNSCQk9IFJFR0JBU0UgKyAweDU0QwkvLyAzMi1iaXQgQ1AgaW50ZXJydXB0cyBpbi1zZXJ2aWNlCitQQURJUgkJPSBSRUdCQVNFICsgMHg1NTAJLy8gMTYtYml0IFBvcnRBIGRhdGEgZGlyZWN0aW9uIGJpdG1hcAorUEFQQVIJCT0gUkVHQkFTRSArIDB4NTUyCS8vIDE2LWJpdCBQb3J0QSBwaW4gYXNzaWdubWVudCBiaXRtYXAKK1BBT0RSCQk9IFJFR0JBU0UgKyAweDU1NAkvLyAxNi1iaXQgUG9ydEEgb3BlbiBkcmFpbiBiaXRtYXAKK1BBREFUCQk9IFJFR0JBU0UgKyAweDU1NgkvLyAxNi1iaXQgUG9ydEEgZGF0YSByZWdpc3RlcgorCitQQ0RJUgkJPSBSRUdCQVNFICsgMHg1NjAJLy8gMTYtYml0IFBvcnRDIGRhdGEgZGlyZWN0aW9uIGJpdG1hcAorUENQQVIJCT0gUkVHQkFTRSArIDB4NTYyCS8vIDE2LWJpdCBQb3J0QyBwaW4gYXNzaWdubWVudCBiaXRtYXAKK1BDU08JCT0gUkVHQkFTRSArIDB4NTY0CS8vIDE2LWJpdCBQb3J0QyBzcGVjaWFsIG9wdGlvbnMKK1BDREFUCQk9IFJFR0JBU0UgKyAweDU2NgkvLyAxNi1iaXQgUG9ydEMgZGF0YSByZWdpc3RlcgorUENJTlQJCT0gUkVHQkFTRSArIDB4NTY4CS8vIDE2LWJpdCBQb3J0QyBpbnRlcnJ1cHQgY29udHJvbAorQ1IJCT0gUkVHQkFTRSArIDB4NUMwCS8vIDE2LWJpdCBDb21tYW5kIHJlZ2lzdGVyCisKK1NDQzFfUkVHUwk9IFJFR0JBU0UgKyAweDYwMAorU0NDMl9SRUdTCT0gUkVHQkFTRSArIDB4NjIwCitTQ0MzX1JFR1MJPSBSRUdCQVNFICsgMHg2NDAKK1NDQzRfUkVHUwk9IFJFR0JBU0UgKyAweDY2MAorU0lDUgkJPSBSRUdCQVNFICsgMHg2RUMJLy8gMzItYml0IFNJIGNsb2NrIHJvdXRlCisKKy8vIG9mZnNldCBmcm9tIFNDQ3hfUkVHUworU0NDX0dTTVJfTAk9IDB4MDAJLy8gMzIgYml0cworU0NDX0dTTVJfSAk9IDB4MDQJLy8gMzIgYml0cworU0NDX1BTTVIJPSAweDA4CS8vIDE2IGJpdHMKK1NDQ19UT0RSCT0gMHgwQwkvLyAxNiBiaXRzCitTQ0NfRFNSCQk9IDB4MEUJLy8gMTYgYml0cworU0NDX1NDQ0UJPSAweDEwCS8vIDE2IGJpdHMKK1NDQ19TQ0NNCT0gMHgxNAkvLyAxNiBiaXRzCitTQ0NfU0NDUwk9IDB4MTcJLy8gOCBiaXRzCisKKyNpZiBRVUlDQ19NRU1DUFlfVVNFU19QTFgKKwkubWFjcm8gbWVtY3B5X2Zyb21fcGNpIHNyYywgZGVzdCwgbGVuIC8vIGxlbiBtdXN0IGJlIDwgOCBNQgorCWFkZGwgIzMsIFxsZW4KKwlhbmRsICMweEZGRkZGRkZDLCBcbGVuCQkvLyBhbHdheXMgY29weSBuICogNCBieXRlcworCW1vdmVsIFxzcmMsIFBMWF9ETUFfMF9QQ0kKKwltb3ZlbCBcZGVzdCwgUExYX0RNQV8wX0xPQ0FMCisJbW92ZWwgXGxlbiwgUExYX0RNQV8wX0xFTkdUSAorCW1vdmVsICMweDAxMDMsIFBMWF9ETUFfQ01EX1NUUwkvLyBzdGFydCBjaGFubmVsIDAgdHJhbnNmZXIKKwlic3IgbWVtY3B5X2Zyb21fcGNpX3J1bgorCS5lbmRtCisKKwkubWFjcm8gbWVtY3B5X3RvX3BjaSBzcmMsIGRlc3QsIGxlbgorCWFkZGwgIzMsIFxsZW4KKwlhbmRsICMweEZGRkZGRkZDLCBcbGVuCQkvLyBhbHdheXMgY29weSBuICogNCBieXRlcworCW1vdmVsIFxzcmMsIFBMWF9ETUFfMV9MT0NBTAorCW1vdmVsIFxkZXN0LCBQTFhfRE1BXzFfUENJCisJbW92ZWwgXGxlbiwgUExYX0RNQV8xX0xFTkdUSAorCW1vdmVsICMweDAzMDEsIFBMWF9ETUFfQ01EX1NUUwkvLyBzdGFydCBjaGFubmVsIDEgdHJhbnNmZXIKKwlic3IgbWVtY3B5X3RvX3BjaV9ydW4KKwkuZW5kbQorCisjZWxzZQorCisJLm1hY3JvIG1lbWNweSBzcmMsIGRlc3QsIGxlbgkvLyBsZW4gbXVzdCBiZSA8IDY1NTM2IGJ5dGVzCisJbW92ZWwgJWQ3LCAtKCVzcCkJCS8vIHNyYyBhbmQgZGVzdCBtdXN0IGJlIDwgMjU2IE1CCisJbW92ZWwgXGxlbiwgJWQ3CQkJLy8gYml0cyAwIGFuZCAxCisJbHNybCAjMiwgXGxlbgorCWFuZGwgXGxlbiwgXGxlbgorCWJlcSA5OWYJCQkJLy8gb25seSAwIC0gMyBieXRlcworCXN1YmwgIzEsIFxsZW4JCQkvLyBmb3IgZGJmCis5ODoJbW92ZWwgKFxzcmMpKywgKFxkZXN0KSsKKwlkYmZ3IFxsZW4sIDk4YgorOTk6CW1vdmVsICVkNywgXGxlbgorCWJ0c3RsICMxLCBcbGVuCisJYmVxIDk5ZgorCW1vdmV3IChcc3JjKSssIChcZGVzdCkrCis5OToJYnRzdGwgIzAsIFxsZW4KKwliZXEgOTlmCisJbW92ZWIgKFxzcmMpKywgKFxkZXN0KSsKKzk5OgorCW1vdmVsICglc3ApKywgJWQ3CisJLmVuZG0KKworCS5tYWNybyBtZW1jcHlfZnJvbV9wY2kgc3JjLCBkZXN0LCBsZW4KKwlhZGRsICNWQUxVRV9XSU5ET1csIFxzcmMKKwltZW1jcHkgXHNyYywgXGRlc3QsIFxsZW4KKwkuZW5kbQorCisJLm1hY3JvIG1lbWNweV90b19wY2kgc3JjLCBkZXN0LCBsZW4KKwlhZGRsICNWQUxVRV9XSU5ET1csIFxkZXN0CisJbWVtY3B5IFxzcmMsIFxkZXN0LCBcbGVuCisJLmVuZG0KKyNlbmRpZgorCisKKwkubWFjcm8gd2FpdF9mb3JfY29tbWFuZAorOTk6CWJ0c3RsICMwLCBDUgorCWJuZSA5OWIKKwkuZW5kbQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNhcmQgaW5pdGlhbGl6YXRpb24gKioqKioqKioqKioqKioqKioqKi8KKwkudGV4dAorCS5nbG9iYWwgX3N0YXJ0Citfc3RhcnQ6CWJyYSBpbml0CisKKwkub3JnIF9zdGFydCArIDQKK2NoX3N0YXR1c19hZGRyOgkubG9uZyAwLCAwLCAwLCAwCityeF9kZXNjc19hZGRyOgkubG9uZyAwCisKK2luaXQ6CisjaWYgREVURUNUX1JBTQorCW1vdmVsIE9SMSwgJWQwCisJYW5kbCAjMHhGMDAwMDdGRiwgJWQwCQkvLyBtYXNrIEFNeHggYml0cworCW9ybCAjMHhGRkZGODAwICYgfihNQVhfUkFNX1NJWkUgLSAxKSwgJWQwIC8vIHVwZGF0ZSBSQU0gYmFuayBzaXplCisJbW92ZWwgJWQwLCBPUjEKKyNlbmRpZgorCisJYWRkbCAjVkFMVUVfV0lORE9XLCByeF9kZXNjc19hZGRyIC8vIFBDSSBhZGRyZXNzZXMgb2Ygc2hhcmVkIGRhdGEKKwljbHJsICVkMAkJCS8vIEQwID0gNCAqIHBvcnQKK2luaXRfMToJdHN0bCBjaF9zdGF0dXNfYWRkciglZDApCisJYmVxIGluaXRfMgorCWFkZGwgI1ZBTFVFX1dJTkRPVywgY2hfc3RhdHVzX2FkZHIoJWQwKQoraW5pdF8yOglhZGRsICM0LCAlZDAKKwljbXBsICM0ICogNCwgJWQwCisJYm5lIGluaXRfMQorCisJbW92ZWwgI3BjaTkwNjBfaW50ZXJydXB0LCBQQ0k5MDYwX1ZFQ1RPUgorCW1vdmVsICNlcnJvcl9pbnRlcnJ1cHQsIEVSUk9SX1ZFQ1RPUgorCW1vdmVsICNwb3J0X2ludGVycnVwdF8xLCBTQ0MxX1ZFQ1RPUgorCW1vdmVsICNwb3J0X2ludGVycnVwdF8yLCBTQ0MyX1ZFQ1RPUgorCW1vdmVsICNwb3J0X2ludGVycnVwdF8zLCBTQ0MzX1ZFQ1RPUgorCW1vdmVsICNwb3J0X2ludGVycnVwdF80LCBTQ0M0X1ZFQ1RPUgorCW1vdmVsICN0aW1lcl9pbnRlcnJ1cHQsIFRJTUVSX0lSUSAqIDQKKworCW1vdmVsICMweDc4MDAwMDAwLCBDSU1SCQkvLyBvbmx5IFNDQ3ggSVJRcyBmcm9tIENQTQorCW1vdmV3ICMoVElNRVJfSVJRX0xFVkVMIDw8IDgpICsgVElNRVJfSVJRLCBQSUNSCS8vIGludGVycnVwdCBmcm9tIFBJVAorCW1vdmV3ICNQSVRSX0NPTlNULCBQSVRSCisKKwkvLyBTQ0MxPVNDQ2EgU0NDMj1TQ0NiIFNDQzM9U0NDYyBTQ0M0PVNDQ2QgcHJpbz00IEhQPS0xIElSUT02NC03OQorCW1vdmVsICMweEQ0MUY0MCArIChDUE1fSVJRX0xFVkVMIDw8IDEzKSwgQ0lDUgorCW1vdmVsICMweDU0MywgUExYX0RNQV8wX01PREUJLy8gMzItYml0LCBSZWFkeSwgQnVyc3QsIElSUQorCW1vdmVsICMweDU0MywgUExYX0RNQV8xX01PREUKKwltb3ZlbCAjMHgwLCBQTFhfRE1BXzBfREVTQwkvLyBmcm9tIFBDSSB0byBsb2NhbAorCW1vdmVsICMweDgsIFBMWF9ETUFfMV9ERVNDCS8vIGZyb20gbG9jYWwgdG8gUENJCisJbW92ZWwgIzB4MTAxLCBQTFhfRE1BX0NNRF9TVFMJLy8gZW5hYmxlIGJvdGggRE1BIGNoYW5uZWxzCisJLy8gZW5hYmxlIGxvY2FsIElSUSwgRE1BLCBkb29yYmVsbHMgYW5kIFBDSSBJUlEKKwlvcmwgIzB4MDAwRjAzMDAsIFBMWF9JTlRFUlJVUFRfQ1MKKworI2lmIERFVEVDVF9SQU0KKwlic3IgcmFtX3Rlc3QKKyNlbHNlCisJbW92ZWwgIzEsIFBMWF9NQUlMQk9YXzUJCS8vIG5vbi16ZXJvIHZhbHVlID0gaW5pdCBjb21wbGV0ZQorI2VuZGlmCisJYnNyIGNoZWNrX2NzcgorCisJbW92ZXcgIzB4RkZGRiwgUEFQQVIJCS8vIGFsbCBwaW5zIGFyZSBjbG9ja3MvZGF0YQorCWNscncgUEFESVIJCQkvLyBmaXJzdCBmdW5jdGlvbgorCWNscncgUENTTwkJCS8vIENEIGFuZCBDVFMgYWx3YXlzIGFjdGl2ZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogbWFpbiBsb29wICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCittYWluOgltb3ZlbCBjaGFubmVsX3N0YXRzLCAlZDcJLy8gRDcgPSBkb29yYmVsbCArIGlycSBzdGF0dXMKKwljbHJsIGNoYW5uZWxfc3RhdHMKKworCXRzdGwgJWQ3CisJYm5lIG1haW5fMQorCS8vIG5vdGhpbmcgdG8gZG8gLSB3YWl0IGZvciBuZXh0IGV2ZW50CisJc3RvcCAjMHgyMjAwCQkJLy8gc3VwZXJ2aXNvciArIElSUSBsZXZlbCAyCisJbW92ZXcgIzB4MjcwMCwgJXNyCQkvLyBkaXNhYmxlIElSUXMgYWdhaW4KKwlicmEgbWFpbgorCittYWluXzE6CWNscmwgJWQwCQkJLy8gRDAgPSA0ICogcG9ydAorCWNscmwgJWQ2CQkJLy8gRDYgPSBkb29yYmVsbCB0byBob3N0IHZhbHVlCisKK21haW5fbDogYnRzdGwgI0RPT1JCRUxMX1RPX0NBUkRfQ0xPU0VfMCwgJWQ3CisJYmVxIG1haW5fb3AKKwliY2xybCAjRE9PUkJFTExfVE9fQ0FSRF9PUEVOXzAsICVkNyAvLyBpbiBjYXNlIGJvdGggYml0cyBhcmUgc2V0CisJYnNyIGNsb3NlX3BvcnQKK21haW5fb3A6CisJYnRzdGwgI0RPT1JCRUxMX1RPX0NBUkRfT1BFTl8wLCAlZDcKKwliZXEgbWFpbl9jbAorCWJzciBvcGVuX3BvcnQKK21haW5fY2w6CisJYnRzdGwgI0RPT1JCRUxMX1RPX0NBUkRfVFhfMCwgJWQ3CisJYmVxIG1haW5fdHhlbmQKKwlic3IgdHgKK21haW5fdHhlbmQ6CisJYnRzdGwgI1RBU0tfU0NDXzAsICVkNworCWJlcSBtYWluX25leHQKKwlic3IgdHhfZW5kCisJYnNyIHJ4CisKK21haW5fbmV4dDoKKwlsc3JsICMxLCAlZDcJCQkvLyBwb3J0IHN0YXR1cyBmb3IgbmV4dCBwb3J0CisJYWRkbCAjNCwgJWQwCQkJLy8gRDAgPSA0ICogbmV4dCBwb3J0CisJY21wbCAjNCAqIDQsICVkMAorCWJuZSBtYWluX2wKKwltb3ZlbCAlZDYsIFBMWF9ET09SQkVMTF9GUk9NX0NBUkQgLy8gc2lnbmFsIHRoZSBob3N0CisJYnJhIG1haW4KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIG9wZW4gcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworb3Blbl9wb3J0OgkJCQkvLyBEMCA9IDQgKiBwb3J0LCBENiA9IGRvb3JiZWxsIHRvIGhvc3QKKwltb3ZlbCBjaF9zdGF0dXNfYWRkciglZDApLCAlYTAJLy8gQTAgPSBwb3J0IHN0YXR1cyBhZGRyZXNzCisJdHN0bCBTVEFUVVNfT1BFTiglYTApCisJYm5lIG9wZW5fcG9ydF9yZXQJCS8vIHBvcnQgYWxyZWFkeSBvcGVuCisJbW92ZWwgIzEsIFNUQVRVU19PUEVOKCVhMCkJLy8gY29uZmlybSB0aGUgcG9ydCBpcyBvcGVuCisvLyBzZXR1cCBCRHMKKwljbHJsIHR4X2luKCVkMCkKKwljbHJsIHR4X291dCglZDApCisJY2xybCB0eF9jb3VudCglZDApCisJY2xybCByeF9pbiglZDApCisKKwltb3ZlbCBTSUNSLCAlZDEJCQkvLyBEMSA9IGNsb2NrIHNldHRpbmdzIGluIFNJQ1IKKwlhbmRsIGNsb2NraW5nX21hc2soJWQwKSwgJWQxCisJY21wbCAjQ0xPQ0tfVFhGUk9NUlgsIFNUQVRVU19DTE9DS0lORyglYTApCisJYm5lIG9wZW5fcG9ydF9jbG9ja19leHQKKwlvcmwgY2xvY2tpbmdfdHhmcm9tcngoJWQwKSwgJWQxCisJYnJhIG9wZW5fcG9ydF9zZXRfY2xvY2sKKworb3Blbl9wb3J0X2Nsb2NrX2V4dDoKKwlvcmwgY2xvY2tpbmdfZXh0KCVkMCksICVkMQorb3Blbl9wb3J0X3NldF9jbG9jazoKKwltb3ZlbCAlZDEsIFNJQ1IJCQkvLyB1cGRhdGUgY2xvY2sgc2V0dGluZ3MgaW4gU0lDUgorCisJb3J3ICNTVEFUVVNfQ0FCTEVfRFRSLCBjc3Jfb3V0cHV0KCVkMCkJLy8gRFRSIG9uCisJYnNyIGNoZWNrX2NzcgkJCS8vIGNhbGwgd2l0aCBkaXNhYmxlZCB0aW1lciBpbnRlcnJ1cHQKKworLy8gU2V0dXAgVFggZGVzY3JpcHRvcnMKKwltb3ZlbCBmaXJzdF9idWZmZXIoJWQwKSwgJWQxCS8vIEQxID0gc3RhcnRpbmcgYnVmZmVyIGFkZHJlc3MKKwltb3ZlbCB0eF9maXJzdF9iZCglZDApLCAlYTEJLy8gQTEgPSBzdGFydGluZyBUWCBCRCBhZGRyZXNzCisJbW92ZWwgI1RYX0JVRkZFUlMgLSAyLCAlZDIJLy8gRDIgPSBUWF9CVUZGRVJTIC0gMSBjb3VudGVyCisJbW92ZWwgIzB4MTgwMDAwMDAsICVkMwkJLy8gRDMgPSBpbml0aWFsIFRYIEJEIGZsYWdzOiBJbnQgKyBMYXN0CisJY21wbCAjUEFSSVRZX05PTkUsIFNUQVRVU19QQVJJVFkoJWEwKQorCWJlcSBvcGVuX3BvcnRfdHhfbG9vcAorCWJzZXRsICMyNiwgJWQzCQkJLy8gVFggQkQgZmxhZzogVHJhbnNtaXQgQ1JDCitvcGVuX3BvcnRfdHhfbG9vcDoKKwltb3ZlbCAlZDMsICglYTEpKwkJLy8gVFggZmxhZ3MgKyBsZW5ndGgKKwltb3ZlbCAlZDEsICglYTEpKwkJLy8gYnVmZmVyIGFkZHJlc3MKKwlhZGRsICNCVUZGRVJfTEVOR1RILCAlZDEKKwlkYmZ3ICVkMiwgb3Blbl9wb3J0X3R4X2xvb3AKKworCWJzZXRsICMyOSwgJWQzCQkJLy8gVFggQkQgZmxhZzogV3JhcCAobGFzdCBCRCkKKwltb3ZlbCAlZDMsICglYTEpKwkJLy8gRmluYWwgVFggZmxhZ3MgKyBsZW5ndGgKKwltb3ZlbCAlZDEsICglYTEpKwkJLy8gYnVmZmVyIGFkZHJlc3MKKworLy8gU2V0dXAgUlggZGVzY3JpcHRvcnMJCQkvLyBBMSA9IHN0YXJ0aW5nIFJYIEJEIGFkZHJlc3MKKwltb3ZlbCAjUlhfQlVGRkVSUyAtIDIsICVkMgkvLyBEMiA9IFJYX0JVRkZFUlMgLSAxIGNvdW50ZXIKK29wZW5fcG9ydF9yeF9sb29wOgorCW1vdmVsICMweDkwMDAwMDAwLCAoJWExKSsJLy8gUlggZmxhZ3MgKyBsZW5ndGgKKwltb3ZlbCAlZDEsICglYTEpKwkJLy8gYnVmZmVyIGFkZHJlc3MKKwlhZGRsICNCVUZGRVJfTEVOR1RILCAlZDEKKwlkYmZ3ICVkMiwgb3Blbl9wb3J0X3J4X2xvb3AKKworCW1vdmVsICMweEIwMDAwMDAwLCAoJWExKSsJLy8gRmluYWwgUlggZmxhZ3MgKyBsZW5ndGgKKwltb3ZlbCAlZDEsICglYTEpKwkJLy8gYnVmZmVyIGFkZHJlc3MKKworLy8gU2V0dXAgcG9ydCBwYXJhbWV0ZXJzCisJbW92ZWwgc2NjX2Jhc2VfYWRkciglZDApLCAlYTEJLy8gQTEgPSBTQ0NfQkFTRSBhZGRyZXNzCisJbW92ZWwgc2NjX3JlZ19hZGRyKCVkMCksICVhMgkvLyBBMiA9IFNDQ19SRUdTIGFkZHJlc3MKKworCW1vdmVsICMweEZGRkYsIFNDQ19TQ0NFKCVhMikJLy8gY2xlYXIgc3RhdHVzIGJpdHMKKwltb3ZlbCAjMHgwMDAwLCBTQ0NfU0NDTSglYTIpCS8vIGludGVycnVwdCBtYXNrCisKKwltb3ZlbCB0eF9maXJzdF9iZCglZDApLCAlZDEKKwltb3ZldyAlZDEsIFNDQ19UQkFTRSglYTEpCS8vIEQxID0gb2Zmc2V0IG9mIGZpcnN0IFR4QkQKKwlhZGRsICNUWF9CVUZGRVJTICogOCwgJWQxCisJbW92ZXcgJWQxLCBTQ0NfUkJBU0UoJWExKQkvLyBEMSA9IG9mZnNldCBvZiBmaXJzdCBSeEJECisJbW92ZWIgIzB4OCwgU0NDX1JGQ1IoJWExKQkvLyBJbnRlbCBtb2RlLCAxMDAwCisJbW92ZWIgIzB4OCwgU0NDX1RGQ1IoJWExKQorCisvLyBQYXJpdHkgc2V0dGluZ3MKKwljbXBsICNQQVJJVFlfQ1JDMTZfUFIxX0NDSVRULCBTVEFUVVNfUEFSSVRZKCVhMCkKKwlibmUgb3Blbl9wb3J0X3Bhcml0eV8xCisJY2xydyBTQ0NfUFNNUiglYTIpCQkvLyBDUkMxNi1DQ0lUVAorCW1vdmVsICMweEYwQjgsIFNDQ19DX01BU0soJWExKQorCW1vdmVsICMweEZGRkYsIFNDQ19DX1BSRVMoJWExKQorCW1vdmV3ICNIRExDX01BWF9NUlUgKyAyLCBTQ0NfTUZMUiglYTEpIC8vIDIgYnl0ZXMgZm9yIENSQworCW1vdmV3ICMyLCBwYXJpdHlfYnl0ZXMoJWQwKQorCWJyYSBvcGVuX3BvcnRfMgorCitvcGVuX3BvcnRfcGFyaXR5XzE6CisJY21wbCAjUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVCwgU1RBVFVTX1BBUklUWSglYTApCisJYm5lIG9wZW5fcG9ydF9wYXJpdHlfMgorCW1vdmV3ICMweDA4MDAsIFNDQ19QU01SKCVhMikJLy8gQ1JDMzItQ0NJVFQKKwltb3ZlbCAjMHhERUJCMjBFMywgU0NDX0NfTUFTSyglYTEpCisJbW92ZWwgIzB4RkZGRkZGRkYsIFNDQ19DX1BSRVMoJWExKQorCW1vdmV3ICNIRExDX01BWF9NUlUgKyA0LCBTQ0NfTUZMUiglYTEpIC8vIDQgYnl0ZXMgZm9yIENSQworCW1vdmV3ICM0LCBwYXJpdHlfYnl0ZXMoJWQwKQorCWJyYSBvcGVuX3BvcnRfMgorCitvcGVuX3BvcnRfcGFyaXR5XzI6CisJY21wbCAjUEFSSVRZX0NSQzE2X1BSMF9DQ0lUVCwgU1RBVFVTX1BBUklUWSglYTApCisJYm5lIG9wZW5fcG9ydF9wYXJpdHlfMworCWNscncgU0NDX1BTTVIoJWEyKQkJLy8gQ1JDMTYtQ0NJVFQgcHJlc2V0IDAKKwltb3ZlbCAjMHhGMEI4LCBTQ0NfQ19NQVNLKCVhMSkKKwljbHJsIFNDQ19DX1BSRVMoJWExKQorCW1vdmV3ICNIRExDX01BWF9NUlUgKyAyLCBTQ0NfTUZMUiglYTEpIC8vIDIgYnl0ZXMgZm9yIENSQworCW1vdmV3ICMyLCBwYXJpdHlfYnl0ZXMoJWQwKQorCWJyYSBvcGVuX3BvcnRfMgorCitvcGVuX3BvcnRfcGFyaXR5XzM6CisJY21wbCAjUEFSSVRZX0NSQzMyX1BSMF9DQ0lUVCwgU1RBVFVTX1BBUklUWSglYTApCisJYm5lIG9wZW5fcG9ydF9wYXJpdHlfNAorCW1vdmV3ICMweDA4MDAsIFNDQ19QU01SKCVhMikJLy8gQ1JDMzItQ0NJVFQgcHJlc2V0IDAKKwltb3ZlbCAjMHhERUJCMjBFMywgU0NDX0NfTUFTSyglYTEpCisJY2xybCBTQ0NfQ19QUkVTKCVhMSkKKwltb3ZldyAjSERMQ19NQVhfTVJVICsgNCwgU0NDX01GTFIoJWExKSAvLyA0IGJ5dGVzIGZvciBDUkMKKwltb3ZldyAjNCwgcGFyaXR5X2J5dGVzKCVkMCkKKwlicmEgb3Blbl9wb3J0XzIKKworb3Blbl9wb3J0X3Bhcml0eV80OgorCWNscncgU0NDX1BTTVIoJWEyKQkJLy8gbm8gcGFyaXR5CisJbW92ZWwgIzB4RjBCOCwgU0NDX0NfTUFTSyglYTEpCisJbW92ZWwgIzB4RkZGRiwgU0NDX0NfUFJFUyglYTEpCisJbW92ZXcgI0hETENfTUFYX01SVSwgU0NDX01GTFIoJWExKSAvLyAwIGJ5dGVzIGZvciBDUkMKKwljbHJ3IHBhcml0eV9ieXRlcyglZDApCisKK29wZW5fcG9ydF8yOgorCW1vdmVsICMweDAwMDAwMDAzLCBTQ0NfR1NNUl9IKCVhMikgLy8gUlRTTQorCWNtcGwgI0VOQ09ESU5HX05SWkksIFNUQVRVU19FTkNPRElORyglYTApCisJYm5lIG9wZW5fcG9ydF9ucnoKKwltb3ZlbCAjMHgxMDA0MDkwMCwgU0NDX0dTTVJfTCglYTIpIC8vIE5SWkk6IFRDSSBUZW5kIFJFQ04rVEVOQz0xCisJYnJhIG9wZW5fcG9ydF8zCisKK29wZW5fcG9ydF9ucno6CisJbW92ZWwgIzB4MTAwNDAwMDAsIFNDQ19HU01SX0woJWEyKSAvLyBOUlo6IFRDSSBUZW5kIFJFQ04rVEVOQz0wCitvcGVuX3BvcnRfMzoKKwltb3ZldyAjQlVGRkVSX0xFTkdUSCwgU0NDX01SQkxSKCVhMSkKKwltb3ZlbCAlZDAsICVkMQorCWxzbGwgIzQsICVkMQkJCS8vIEQxIGJpdHMgNyBhbmQgNiA9IHBvcnQKKwlvcmwgIzEsICVkMQorCW1vdmV3ICVkMSwgQ1IJCQkvLyBJbml0IFNDQyBSWCBhbmQgVFggcGFyYW1zCisJd2FpdF9mb3JfY29tbWFuZAorCisJLy8gVENJIFRlbmQgRU5SIEVOVAorCW1vdmV3ICMweDAwMUYsIFNDQ19TQ0NNKCVhMikJLy8gVFhFIFJYRiBCU1kgVFhCIFJYQiBpbnRlcnJ1cHRzCisJb3JsICMweDAwMDAwMDMwLCBTQ0NfR1NNUl9MKCVhMikgLy8gZW5hYmxlIFNDQworb3Blbl9wb3J0X3JldDoKKwlydHMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNsb3NlIHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY2xvc2VfcG9ydDoJCQkJLy8gRDAgPSA0ICogcG9ydCwgRDYgPSBkb29yYmVsbCB0byBob3N0CisJbW92ZWwgc2NjX3JlZ19hZGRyKCVkMCksICVhMAkvLyBBMCA9IFNDQ19SRUdTIGFkZHJlc3MKKwljbHJ3IFNDQ19TQ0NNKCVhMCkJCS8vIG5vIFNDQyBpbnRlcnJ1cHRzCisJYW5kbCAjMHhGRkZGRkZDRiwgU0NDX0dTTVJfTCglYTApIC8vIERpc2FibGUgRU5UIGFuZCBFTlIKKworCWFuZHcgI35TVEFUVVNfQ0FCTEVfRFRSLCBjc3Jfb3V0cHV0KCVkMCkgLy8gRFRSIG9mZgorCWJzciBjaGVja19jc3IJCQkvLyBjYWxsIHdpdGggZGlzYWJsZWQgdGltZXIgaW50ZXJydXB0CisKKwltb3ZlbCBjaF9zdGF0dXNfYWRkciglZDApLCAlZDEKKwljbHJsIFNUQVRVU19PUEVOKCVkMSkJCS8vIGNvbmZpcm0gdGhlIHBvcnQgaXMgY2xvc2VkCisJcnRzCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB0cmFuc21pdCBwYWNrZXQgKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBxdWV1ZSBwYWNrZXRzIGZvciB0cmFuc21pc3Npb24KK3R4OgkJCQkJLy8gRDAgPSA0ICogcG9ydCwgRDYgPSBkb29yYmVsbCB0byBob3N0CisJY21wbCAjVFhfQlVGRkVSUywgdHhfY291bnQoJWQwKQorCWJlcSB0eF9yZXQJCQkvLyBhbGwgREIncyA9IGRlc2NzIGluIHVzZQorCisJbW92ZWwgdHhfb3V0KCVkMCksICVkMQorCW1vdmVsICVkMSwgJWQyCQkJLy8gRDEgPSBEMiA9IHR4X291dCBCRCMgPSBkZXNjIworCW11bHVsICNERVNDX0xFTkdUSCwgJWQyCQkvLyBEMiA9IFRYIGRlc2Mgb2Zmc2V0CisJYWRkbCBjaF9zdGF0dXNfYWRkciglZDApLCAlZDIKKwlhZGRsICNTVEFUVVNfVFhfREVTQ1MsICVkMgkvLyBEMiA9IFRYIGRlc2MgYWRkcmVzcworCWNtcGwgI1BBQ0tFVF9GVUxMLCAoJWQyKQkvLyBkZXNjIHN0YXR1cworCWJuZSB0eF9yZXQKKworLy8gcXVldWUgaXQKKwltb3ZlbCA0KCVkMiksICVhMAkJLy8gUENJIGFkZHJlc3MKKwlsc2xsICMzLCAlZDEJCQkvLyBCRCBpcyA4LWJ5dGVzIGxvbmcKKwlhZGRsIHR4X2ZpcnN0X2JkKCVkMCksICVkMQkvLyBEMSA9IGN1cnJlbnQgdHhfb3V0IEJEIGFkZHIKKworCW1vdmVsIDQoJWQxKSwgJWExCQkvLyBBMSA9IGRlc3QgYWRkcmVzcworCW1vdmVsIDgoJWQyKSwgJWQyCQkvLyBEMiA9IGxlbmd0aAorCW1vdmV3ICVkMiwgMiglZDEpCQkvLyBsZW5ndGggaW50byBCRAorCW1lbWNweV9mcm9tX3BjaSAlYTAsICVhMSwgJWQyCisJYnNldGwgIzMxLCAoJWQxKQkJLy8gQ1AgZ28gYWhlYWQKKworLy8gdXBkYXRlIHR4X291dCBhbmQgdHhfY291bnQKKwltb3ZlbCB0eF9vdXQoJWQwKSwgJWQxCisJYWRkbCAjMSwgJWQxCisJY21wbCAjVFhfQlVGRkVSUywgJWQxCisJYm5lIHR4XzEKKwljbHJsICVkMQordHhfMToJbW92ZWwgJWQxLCB0eF9vdXQoJWQwKQorCisJYWRkbCAjMSwgdHhfY291bnQoJWQwKQorCWJyYSB0eAorCit0eF9yZXQ6IHJ0cworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcGFja2V0IHJlY2VpdmVkICoqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBTZXJ2aWNlIHJlY2VpdmUgYnVmZmVycwkJLy8gRDAgPSA0ICogcG9ydCwgRDYgPSBkb29yYmVsbCB0byBob3N0CityeDoJbW92ZWwgcnhfaW4oJWQwKSwgJWQxCQkvLyBEMSA9IHJ4X2luIEJEIworCWxzbGwgIzMsICVkMQkJCS8vIEJEIGlzIDgtYnl0ZXMgbG9uZworCWFkZGwgcnhfZmlyc3RfYmQoJWQwKSwgJWQxCS8vIEQxID0gY3VycmVudCByeF9pbiBCRCBhZGRyZXNzCisJbW92ZXcgKCVkMSksICVkMgkJLy8gRDIgPSBSWCBCRCBmbGFncworCWJ0c3RsICMxNSwgJWQyCisJYm5lIHJ4X3JldAkJCS8vIEJEIHN0aWxsIGVtcHR5CisKKwlidHN0bCAjMSwgJWQyCisJYm5lIHJ4X292ZXJydW4KKworCXRzdHcgcGFyaXR5X2J5dGVzKCVkMCkKKwlibmUgcnhfcGFyaXR5CisJYmNscmwgIzIsICVkMgkJCS8vIGRvIG5vdCB0ZXN0IGZvciBDUkMgZXJyb3JzCityeF9wYXJpdHk6CisJYW5kdyAjMHgwQ0JDLCAlZDIJCS8vIG1hc2sgc3RhdHVzIGJpdHMKKwljbXB3ICMweDBDMDAsICVkMgkJLy8gY29ycmVjdCBmcmFtZQorCWJuZSByeF9iYWRfZnJhbWUKKwljbHJsICVkMworCW1vdmV3IDIoJWQxKSwgJWQzCisJc3VidyBwYXJpdHlfYnl0ZXMoJWQwKSwgJWQzCS8vIEQzID0gcGFja2V0IGxlbmd0aAorCWNtcHcgI0hETENfTUFYX01SVSwgJWQzCisJYmd0IHJ4X2JhZF9mcmFtZQorCityeF9nb29kX2ZyYW1lOgorCW1vdmVsIHJ4X291dCwgJWQyCisJbXVsdWwgI0RFU0NfTEVOR1RILCAlZDIKKwlhZGRsIHJ4X2Rlc2NzX2FkZHIsICVkMgkJLy8gRDIgPSBSWCBkZXNjIGFkZHJlc3MKKwljbXBsICNQQUNLRVRfRU1QVFksICglZDIpCS8vIGRlc2Mgc3RhdAorCWJuZSByeF9vdmVycnVuCisKKwltb3ZlbCAlZDMsIDgoJWQyKQorCW1vdmVsIDQoJWQxKSwgJWEwCQkvLyBBMCA9IHNvdXJjZSBhZGRyZXNzCisJbW92ZWwgNCglZDIpLCAlYTEKKwl0c3RsICVhMQorCWJlcSByeF9pZ25vcmVfZGF0YQorCW1lbWNweV90b19wY2kgJWEwLCAlYTEsICVkMworcnhfaWdub3JlX2RhdGE6CisJbW92ZWwgcGFja2V0X2Z1bGwoJWQwKSwgKCVkMikJLy8gdXBkYXRlIGRlc2Mgc3RhdAorCisvLyB1cGRhdGUgRDYgYW5kIHJ4X291dAorCWJzZXRsICNET09SQkVMTF9GUk9NX0NBUkRfUlgsICVkNiAvLyBzaWduYWwgaG9zdCB0aGF0IFJYIGNvbXBsZXRlZAorCW1vdmVsIHJ4X291dCwgJWQyCisJYWRkbCAjMSwgJWQyCisJY21wbCAjUlhfUVVFVUVfTEVOR1RILCAlZDIKKwlibmUgcnhfMQorCWNscmwgJWQyCityeF8xOgltb3ZlbCAlZDIsIHJ4X291dAorCityeF9mcmVlX2JkOgorCWFuZHcgIzB4RjAwMCwgKCVkMSkJCS8vIGNsZWFyIENNIGFuZCBlcnJvciBiaXRzCisJYnNldGwgIzMxLCAoJWQxKQkJLy8gZnJlZSBCRAorLy8gdXBkYXRlIHJ4X2luCisJbW92ZWwgcnhfaW4oJWQwKSwgJWQxCisJYWRkbCAjMSwgJWQxCisJY21wbCAjUlhfQlVGRkVSUywgJWQxCisJYm5lIHJ4XzIKKwljbHJsICVkMQorcnhfMjoJbW92ZWwgJWQxLCByeF9pbiglZDApCisJYnJhIHJ4CisKK3J4X292ZXJydW46CisJbW92ZWwgY2hfc3RhdHVzX2FkZHIoJWQwKSwgJWQyCisJYWRkbCAjMSwgU1RBVFVTX1JYX09WRVJSVU5TKCVkMikKKwlicmEgcnhfZnJlZV9iZAorCityeF9iYWRfZnJhbWU6CisJbW92ZWwgY2hfc3RhdHVzX2FkZHIoJWQwKSwgJWQyCisJYWRkbCAjMSwgU1RBVFVTX1JYX0ZSQU1FX0VSUk9SUyglZDIpCisJYnJhIHJ4X2ZyZWVfYmQKKworcnhfcmV0OiBydHMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHBhY2tldCB0cmFuc21pdHRlZCAqKioqKioqKioqKioqKioqKioqKi8KKworLy8gU2VydmljZSB0cmFuc21pdCBidWZmZXJzCQkvLyBEMCA9IDQgKiBwb3J0LCBENiA9IGRvb3JiZWxsIHRvIGhvc3QKK3R4X2VuZDoJdHN0bCB0eF9jb3VudCglZDApCisJYmVxIHR4X2VuZF9yZXQJCQkvLyBUWCBidWZmZXJzIGFscmVhZHkgZW1wdHkKKworCW1vdmVsIHR4X2luKCVkMCksICVkMQorCW1vdmVsICVkMSwgJWQyCQkJLy8gRDEgPSBEMiA9IHR4X2luIEJEIyA9IGRlc2MjCisJbHNsbCAjMywgJWQxCQkJLy8gQkQgaXMgOC1ieXRlcyBsb25nCisJYWRkbCB0eF9maXJzdF9iZCglZDApLCAlZDEJLy8gRDEgPSBjdXJyZW50IHR4X2luIEJEIGFkZHJlc3MKKwltb3ZldyAoJWQxKSwgJWQzCQkvLyBEMyA9IFRYIEJEIGZsYWdzCisJYnRzdGwgIzE1LCAlZDMKKwlibmUgdHhfZW5kX3JldAkJCS8vIEJEIHN0aWxsIGJlaW5nIHRyYW5zbWl0dGVkCisKKy8vIHVwZGF0ZSBENiwgdHhfaW4gYW5kIHR4X2NvdW50CisJb3JsIGJlbGxfdHgoJWQwKSwgJWQ2CQkvLyBzaWduYWwgaG9zdCB0aGF0IFRYIGRlc2MgZnJlZWQKKwlzdWJsICMxLCB0eF9jb3VudCglZDApCisJbW92ZWwgdHhfaW4oJWQwKSwgJWQxCisJYWRkbCAjMSwgJWQxCisJY21wbCAjVFhfQlVGRkVSUywgJWQxCisJYm5lIHR4X2VuZF8xCisJY2xybCAlZDEKK3R4X2VuZF8xOgorCW1vdmVsICVkMSwgdHhfaW4oJWQwKQorCisvLyBmcmVlIGhvc3QncyBkZXNjcmlwdG9yCisJbXVsdWwgI0RFU0NfTEVOR1RILCAlZDIJCS8vIEQyID0gVFggZGVzYyBvZmZzZXQKKwlhZGRsIGNoX3N0YXR1c19hZGRyKCVkMCksICVkMgorCWFkZGwgI1NUQVRVU19UWF9ERVNDUywgJWQyCS8vIEQyID0gVFggZGVzYyBhZGRyZXNzCisJYnRzdGwgIzEsICVkMworCWJuZSB0eF9lbmRfdW5kZXJydW4KKwltb3ZlbCAjUEFDS0VUX1NFTlQsICglZDIpCisJYnJhIHR4X2VuZAorCit0eF9lbmRfdW5kZXJydW46CisJbW92ZWwgI1BBQ0tFVF9VTkRFUlJVTiwgKCVkMikKKwlicmEgdHhfZW5kCisKK3R4X2VuZF9yZXQ6IHJ0cworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUExYIFBDSTkwNjAgRE1BIG1lbWNweSAqKioqKioqKioqKioqKioqLworCisjaWYgUVVJQ0NfTUVNQ1BZX1VTRVNfUExYCisvLyBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkCittZW1jcHlfZnJvbV9wY2lfcnVuOgorCW1vdmVsICVkMCwgLSglc3ApCisJbW92ZXcgJXNyLCAtKCVzcCkKK21lbWNweV8xOgorCW1vdmVsIFBMWF9ETUFfQ01EX1NUUywgJWQwCS8vIGRvIG5vdCBidHN0IFBMWCByZWdpc3RlciBkaXJlY3RseQorCWJ0c3RsICM0LCAlZDAJCQkvLyB0cmFuc2ZlciBkb25lPworCWJuZSBtZW1jcHlfZW5kCisJc3RvcCAjMHgyMjAwCQkJLy8gZW5hYmxlIFBDSTkwNjAgaW50ZXJydXB0cworCW1vdmV3ICMweDI3MDAsICVzcgkJLy8gZGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluCisJYnJhIG1lbWNweV8xCisKK21lbWNweV90b19wY2lfcnVuOgorCW1vdmVsICVkMCwgLSglc3ApCisJbW92ZXcgJXNyLCAtKCVzcCkKK21lbWNweV8yOgorCW1vdmVsIFBMWF9ETUFfQ01EX1NUUywgJWQwCS8vIGRvIG5vdCBidHN0IFBMWCByZWdpc3RlciBkaXJlY3RseQorCWJ0c3RsICMxMiwgJWQwCQkJLy8gdHJhbnNmZXIgZG9uZT8KKwlibmUgbWVtY3B5X2VuZAorCXN0b3AgIzB4MjIwMAkJCS8vIGVuYWJsZSBQQ0k5MDYwIGludGVycnVwdHMKKwltb3ZldyAjMHgyNzAwLCAlc3IJCS8vIGRpc2FibGUgaW50ZXJydXB0cyBhZ2FpbgorCWJyYSBtZW1jcHlfMgorCittZW1jcHlfZW5kOgorCW1vdmV3ICglc3ApKywgJXNyCisJbW92ZWwgKCVzcCkrLCAlZDAKKwlydHMKKyNlbmRpZgorCisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQTFggUENJOTA2MCBpbnRlcnJ1cHQgKioqKioqKioqKioqKioqKiovCisKK3BjaTkwNjBfaW50ZXJydXB0OgorCW1vdmVsICVkMCwgLSglc3ApCisKKwltb3ZlbCBQTFhfRE9PUkJFTExfVE9fQ0FSRCwgJWQwCisJbW92ZWwgJWQwLCBQTFhfRE9PUkJFTExfVE9fQ0FSRAkvLyBjb25maXJtIGFsbCByZXF1ZXN0cworCW9ybCAlZDAsIGNoYW5uZWxfc3RhdHMKKworCW1vdmVsICMweDA5MDksIFBMWF9ETUFfQ01EX1NUUwkvLyBjbGVhciBETUEgY2ggIzAgYW5kICMxIGludGVycnVwdHMKKworCW1vdmVsICglc3ApKywgJWQwCisJcnRlCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0NDIGludGVycnVwdHMgKioqKioqKioqKioqKioqKioqKioqKioqLworCitwb3J0X2ludGVycnVwdF8xOgorCW9ybCAjMCwgU0NDMV9SRUdTICsgU0NDX1NDQ0U7IC8vIGNvbmZpcm0gU0NDIGV2ZW50cworCW9ybCAjMSA8PCBUQVNLX1NDQ18wLCBjaGFubmVsX3N0YXRzCisJbW92ZWwgIzB4NDAwMDAwMDAsIENJU1IKKwlydGUKKworcG9ydF9pbnRlcnJ1cHRfMjoKKwlvcmwgIzAsIFNDQzJfUkVHUyArIFNDQ19TQ0NFOyAvLyBjb25maXJtIFNDQyBldmVudHMKKwlvcmwgIzEgPDwgVEFTS19TQ0NfMSwgY2hhbm5lbF9zdGF0cworCW1vdmVsICMweDIwMDAwMDAwLCBDSVNSCisJcnRlCisKK3BvcnRfaW50ZXJydXB0XzM6CisJb3JsICMwLCBTQ0MzX1JFR1MgKyBTQ0NfU0NDRTsgLy8gY29uZmlybSBTQ0MgZXZlbnRzCisJb3JsICMxIDw8IFRBU0tfU0NDXzIsIGNoYW5uZWxfc3RhdHMKKwltb3ZlbCAjMHgxMDAwMDAwMCwgQ0lTUgorCXJ0ZQorCitwb3J0X2ludGVycnVwdF80OgorCW9ybCAjMCwgU0NDNF9SRUdTICsgU0NDX1NDQ0U7IC8vIGNvbmZpcm0gU0NDIGV2ZW50cworCW9ybCAjMSA8PCBUQVNLX1NDQ18zLCBjaGFubmVsX3N0YXRzCisJbW92ZWwgIzB4MDgwMDAwMDAsIENJU1IKKwlydGUKKworZXJyb3JfaW50ZXJydXB0OgorCXJ0ZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogY2FibGUgYW5kIFBNIHJvdXRpbmUgKioqKioqKioqKioqKioqKioqLworLy8gbW9kaWZpZWQgcmVnaXN0ZXJzOiBub25lCitjaGVja19jc3I6CisJbW92ZWwgJWQwLCAtKCVzcCkKKwltb3ZlbCAlZDEsIC0oJXNwKQorCW1vdmVsICVkMiwgLSglc3ApCisJbW92ZWwgJWEwLCAtKCVzcCkKKwltb3ZlbCAlYTEsIC0oJXNwKQorCisJY2xybCAlZDAJCQkvLyBEMCA9IDQgKiBwb3J0CisJbW92ZWwgI0NTUkEsICVhMAkJLy8gQTAgPSBDU1IgYWRkcmVzcworCitjaGVja19jc3JfbG9vcDoKKwltb3ZldyAoJWEwKSwgJWQxCQkvLyBEMSA9IENTUiBpbnB1dCBiaXRzCisJYW5kbCAjMHhFNywgJWQxCQkJLy8gUE0gYW5kIGNhYmxlIHNlbnNlIGJpdHMgKG5vIERDRSBiaXQpCisJY21wdyAjU1RBVFVTX0NBQkxFX1YzNSAqICgxICsgMSA8PCBTVEFUVVNfQ0FCTEVfUE1fU0hJRlQpLCAlZDEKKwlibmUgY2hlY2tfY3NyXzEKKwltb3ZldyAjMHgwRTA4LCAlZDEKKwlicmEgY2hlY2tfY3NyX3ZhbGlkCisKK2NoZWNrX2Nzcl8xOgorCWNtcHcgI1NUQVRVU19DQUJMRV9YMjEgKiAoMSArIDEgPDwgU1RBVFVTX0NBQkxFX1BNX1NISUZUKSwgJWQxCisJYm5lIGNoZWNrX2Nzcl8yCisJbW92ZXcgIzB4MDQwOCwgJWQxCisJYnJhIGNoZWNrX2Nzcl92YWxpZAorCitjaGVja19jc3JfMjoKKwljbXB3ICNTVEFUVVNfQ0FCTEVfVjI0ICogKDEgKyAxIDw8IFNUQVRVU19DQUJMRV9QTV9TSElGVCksICVkMQorCWJuZSBjaGVja19jc3JfMworCW1vdmV3ICMweDAyMDgsICVkMQorCWJyYSBjaGVja19jc3JfdmFsaWQKKworY2hlY2tfY3NyXzM6CisJY21wdyAjU1RBVFVTX0NBQkxFX0VJQTUzMCAqICgxICsgMSA8PCBTVEFUVVNfQ0FCTEVfUE1fU0hJRlQpLCAlZDEKKwlibmUgY2hlY2tfY3NyX2Rpc2FibGUKKwltb3ZldyAjMHgwRDA4LCAlZDEKKwlicmEgY2hlY2tfY3NyX3ZhbGlkCisKK2NoZWNrX2Nzcl9kaXNhYmxlOgorCW1vdmV3ICMweDAwMDgsICVkMQkJLy8gRDEgPSBkaXNhYmxlIGV2ZXJ5dGhpbmcKKwltb3ZldyAjMHg4MEU3LCAlZDIJCS8vIEQyID0gaW5wdXQgbWFzazogaWdub3JlIERTUgorCWJyYSBjaGVja19jc3Jfd3JpdGUKKworY2hlY2tfY3NyX3ZhbGlkOgkJCS8vIEQxID0gbW9kZSBhbmQgSVJRIGJpdHMKKwltb3ZldyBjc3Jfb3V0cHV0KCVkMCksICVkMgorCWFuZHcgIzB4MzAwMCwgJWQyCQkvLyBEMiA9IHJlcXVlc3RlZCBMTCBhbmQgRFRSIGJpdHMKKwlvcncgJWQyLCAlZDEJCQkvLyBEMSA9IGFsbCByZXF1ZXN0ZWQgb3V0cHV0IGJpdHMKKwltb3ZldyAjMHg4MEZGLCAlZDIJCS8vIEQyID0gaW5wdXQgbWFzazogaW5jbHVkZSBEU1IKKworY2hlY2tfY3NyX3dyaXRlOgorCWNtcHcgb2xkX2Nzcl9vdXRwdXQoJWQwKSwgJWQxCisJYmVxIGNoZWNrX2Nzcl9pbnB1dAorCW1vdmV3ICVkMSwgb2xkX2Nzcl9vdXRwdXQoJWQwKQorCW1vdmV3ICVkMSwgKCVhMCkJCS8vIFdyaXRlIENTUiBvdXRwdXQgYml0cworCitjaGVja19jc3JfaW5wdXQ6CisJbW92ZXcgKFBDREFUKSwgJWQxCisJYW5kdyBkY2RfbWFzayglZDApLCAlZDEKKwliZXEgY2hlY2tfY3NyX2RjZF9vbgkJLy8gRENEIGFuZCBDVFMgc2lnbmFscyBhcmUgbmVnYXRlZAorCW1vdmV3ICglYTApLCAlZDEJCS8vIEQxID0gQ1NSIGlucHV0IGJpdHMKKwlhbmR3ICN+U1RBVFVTX0NBQkxFX0RDRCwgJWQxCS8vIERDRCBvZmYKKwlicmEgY2hlY2tfY3NyX3ByZXZpb3VzCisKK2NoZWNrX2Nzcl9kY2Rfb246CisJbW92ZXcgKCVhMCksICVkMQkJLy8gRDEgPSBDU1IgaW5wdXQgYml0cworCW9ydyAjU1RBVFVTX0NBQkxFX0RDRCwgJWQxCS8vIERDRCBvbgorY2hlY2tfY3NyX3ByZXZpb3VzOgorCWFuZHcgJWQyLCAlZDEJCQkvLyBpbnB1dCBtYXNrCisJbW92ZWwgY2hfc3RhdHVzX2FkZHIoJWQwKSwgJWExCisJY21wbCBTVEFUVVNfQ0FCTEUoJWExKSwgJWQxCS8vIGNoZWNrIGZvciBjaGFuZ2UKKwliZXEgY2hlY2tfY3NyX25leHQKKwltb3ZlbCAlZDEsIFNUQVRVU19DQUJMRSglYTEpCS8vIHVwZGF0ZSBzdGF0dXMKKwltb3ZlbCBiZWxsX2NhYmxlKCVkMCksIFBMWF9ET09SQkVMTF9GUk9NX0NBUkQJLy8gc2lnbmFsIHRoZSBob3N0CisKK2NoZWNrX2Nzcl9uZXh0OgorCWFkZGwgIzIsICVhMAkJCS8vIG5leHQgQ1NSIHJlZ2lzdGVyCisJYWRkbCAjNCwgJWQwCQkJLy8gRDAgPSA0ICogbmV4dCBwb3J0CisJY21wbCAjNCAqIDQsICVkMAorCWJuZSBjaGVja19jc3JfbG9vcAorCisJbW92ZWwgKCVzcCkrLCAlYTEKKwltb3ZlbCAoJXNwKSssICVhMAorCW1vdmVsICglc3ApKywgJWQyCisJbW92ZWwgKCVzcCkrLCAlZDEKKwltb3ZlbCAoJXNwKSssICVkMAorCXJ0cworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdGltZXIgaW50ZXJydXB0ICoqKioqKioqKioqKioqKioqKioqKioqLworCit0aW1lcl9pbnRlcnJ1cHQ6CisJYnNyIGNoZWNrX2NzcgorCXJ0ZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUkFNIHNpemluZyBhbmQgdGVzdCAqKioqKioqKioqKioqKioqKioqLworI2lmIERFVEVDVF9SQU0KK3JhbV90ZXN0OgorCW1vdmVsICMweDEyMzQ1Njc4LCAlZDEJCS8vIEQxID0gdGVzdCB2YWx1ZQorCW1vdmVsICVkMSwgKDEyOCAqIDEwMjQgLSA0KQorCW1vdmVsICMxMjggKiAxMDI0LCAlZDAJCS8vIEQwID0gUkFNIHNpemUgdGVzdGVkCityYW1fdGVzdF9zaXplOgorCWNtcGwgI01BWF9SQU1fU0laRSwgJWQwCisJYmVxIHJhbV90ZXN0X3NpemVfZm91bmQKKwltb3ZlbCAlZDAsICVhMAorCWFkZGwgIzEyOCAqIDEwMjQgLSA0LCAlYTAKKwljbXBsICglYTApLCAlZDEKKwliZXEgcmFtX3Rlc3Rfc2l6ZV9jaGVjaworcmFtX3Rlc3RfbmV4dF9zaXplOgorCWxzbGwgIzEsICVkMAorCWJyYSByYW1fdGVzdF9zaXplCisKK3JhbV90ZXN0X3NpemVfY2hlY2s6CisJZW9ybCAjMHhGRkZGRkZGRiwgJWQxCisJbW92ZWwgJWQxLCAoMTI4ICogMTAyNCAtIDQpCisJY21wbCAoJWEwKSwgJWQxCisJYm5lIHJhbV90ZXN0X25leHRfc2l6ZQorCityYW1fdGVzdF9zaXplX2ZvdW5kOgkJCS8vIEQwID0gUkFNIHNpemUKKwltb3ZlbCAlZDAsICVhMAkJCS8vIEEwID0gZmlsbCBwdHIKKwlzdWJsICNmaXJtd2FyZV9lbmQgKyA0LCAlZDAKKwlsc3JsICMyLCAlZDAKKwltb3ZlbCAlZDAsICVkMQkJCS8vIEQxID0gREJmIGNvdW50ZXIKK3JhbV90ZXN0X2ZpbGw6CisJbW92ZWwgJWEwLCAtKCVhMCkKKwlkYmZ3ICVkMSwgcmFtX3Rlc3RfZmlsbAorCXN1YmwgIzB4MTAwMDAsICVkMQorCWNtcGwgIzB4RkZGRkZGRkYsICVkMQorCWJuZSByYW1fdGVzdF9maWxsCisKK3JhbV90ZXN0X2xvb3A6CQkJCS8vIEQwID0gREJmIGNvdW50ZXIKKwljbXBsICglYTApKywgJWEwCisJZGJuZXcgJWQwLCByYW1fdGVzdF9sb29wCisJYm5lIHJhbV90ZXN0X2ZvdW5kX2JhZAorCXN1YmwgIzB4MTAwMDAsICVkMAorCWNtcGwgIzB4RkZGRkZGRkYsICVkMAorCWJuZSByYW1fdGVzdF9sb29wCisJYnJhIHJhbV90ZXN0X2FsbF9vaworCityYW1fdGVzdF9mb3VuZF9iYWQ6CisJc3VibCAjNCwgJWEwCityYW1fdGVzdF9hbGxfb2s6CisJbW92ZWwgJWEwLCBQTFhfTUFJTEJPWF81CisJcnRzCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc2NjX3JlZ19hZGRyOgorCS5sb25nIFNDQzFfUkVHUywgU0NDMl9SRUdTLCBTQ0MzX1JFR1MsIFNDQzRfUkVHUworc2NjX2Jhc2VfYWRkcjoKKwkubG9uZyBTQ0MxX0JBU0UsIFNDQzJfQkFTRSwgU0NDM19CQVNFLCBTQ0M0X0JBU0UKKwordHhfZmlyc3RfYmQ6CisJLmxvbmcgRFBSQkFTRQorCS5sb25nIERQUkJBU0UgKyAoVFhfQlVGRkVSUyArIFJYX0JVRkZFUlMpICogOAorCS5sb25nIERQUkJBU0UgKyAoVFhfQlVGRkVSUyArIFJYX0JVRkZFUlMpICogOCAqIDIKKwkubG9uZyBEUFJCQVNFICsgKFRYX0JVRkZFUlMgKyBSWF9CVUZGRVJTKSAqIDggKiAzCisKK3J4X2ZpcnN0X2JkOgorCS5sb25nIERQUkJBU0UgKyBUWF9CVUZGRVJTICogOAorCS5sb25nIERQUkJBU0UgKyBUWF9CVUZGRVJTICogOCArIChUWF9CVUZGRVJTICsgUlhfQlVGRkVSUykgKiA4CisJLmxvbmcgRFBSQkFTRSArIFRYX0JVRkZFUlMgKiA4ICsgKFRYX0JVRkZFUlMgKyBSWF9CVUZGRVJTKSAqIDggKiAyCisJLmxvbmcgRFBSQkFTRSArIFRYX0JVRkZFUlMgKiA4ICsgKFRYX0JVRkZFUlMgKyBSWF9CVUZGRVJTKSAqIDggKiAzCisKK2ZpcnN0X2J1ZmZlcjoKKwkubG9uZyBCVUZGRVJTX0FERFIKKwkubG9uZyBCVUZGRVJTX0FERFIgKyAoVFhfQlVGRkVSUyArIFJYX0JVRkZFUlMpICogQlVGRkVSX0xFTkdUSAorCS5sb25nIEJVRkZFUlNfQUREUiArIChUWF9CVUZGRVJTICsgUlhfQlVGRkVSUykgKiBCVUZGRVJfTEVOR1RIICogMgorCS5sb25nIEJVRkZFUlNfQUREUiArIChUWF9CVUZGRVJTICsgUlhfQlVGRkVSUykgKiBCVUZGRVJfTEVOR1RIICogMworCitiZWxsX3R4OgorCS5sb25nIDEgPDwgRE9PUkJFTExfRlJPTV9DQVJEX1RYXzAsIDEgPDwgRE9PUkJFTExfRlJPTV9DQVJEX1RYXzEKKwkubG9uZyAxIDw8IERPT1JCRUxMX0ZST01fQ0FSRF9UWF8yLCAxIDw8IERPT1JCRUxMX0ZST01fQ0FSRF9UWF8zCisKK2JlbGxfY2FibGU6CisJLmxvbmcgMSA8PCBET09SQkVMTF9GUk9NX0NBUkRfQ0FCTEVfMCwgMSA8PCBET09SQkVMTF9GUk9NX0NBUkRfQ0FCTEVfMQorCS5sb25nIDEgPDwgRE9PUkJFTExfRlJPTV9DQVJEX0NBQkxFXzIsIDEgPDwgRE9PUkJFTExfRlJPTV9DQVJEX0NBQkxFXzMKKworcGFja2V0X2Z1bGw6CisJLmxvbmcgUEFDS0VUX0ZVTEwsIFBBQ0tFVF9GVUxMICsgMSwgUEFDS0VUX0ZVTEwgKyAyLCBQQUNLRVRfRlVMTCArIDMKKworY2xvY2tpbmdfZXh0OgorCS5sb25nIDB4MDAwMDAwMkMsIDB4MDAwMDNFMDAsIDB4MDAyQzAwMDAsIDB4M0UwMDAwMDAKK2Nsb2NraW5nX3R4ZnJvbXJ4OgorCS5sb25nIDB4MDAwMDAwMkQsIDB4MDAwMDNGMDAsIDB4MDAyRDAwMDAsIDB4M0YwMDAwMDAKK2Nsb2NraW5nX21hc2s6CisJLmxvbmcgMHgwMDAwMDBGRiwgMHgwMDAwRkYwMCwgMHgwMEZGMDAwMCwgMHhGRjAwMDAwMAorZGNkX21hc2s6CisJLndvcmQgMHgwMjAsIDAsIDB4MDgwLCAwLCAweDIwMCwgMCwgMHg4MDAKKworCS5hc2NpaSAid2FuWEwgZmlybXdhcmVcbiIKKwkuYXNjaXogIkNvcHlyaWdodCAoQykgMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPlxuIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJCS5hbGlnbiA0CitjaGFubmVsX3N0YXRzOgkubG9uZyAwCisKK3R4X2luOgkJLmxvbmcgMCwgMCwgMCwgMAkvLyB0cmFuc21pdHRlZAordHhfb3V0OgkJLmxvbmcgMCwgMCwgMCwgMAkvLyByZWNlaXZlZCBmcm9tIGhvc3QgZm9yIHRyYW5zbWlzc2lvbgordHhfY291bnQ6CS5sb25nIDAsIDAsIDAsIDAJLy8gY3VycmVudGx5IGluIHRyYW5zbWl0IHF1ZXVlCisKK3J4X2luOgkJLmxvbmcgMCwgMCwgMCwgMAkvLyByZWNlaXZlZCBmcm9tIHBvcnQKK3J4X291dDoJCS5sb25nIDAJCQkvLyB0cmFuc21pdHRlZCB0byBob3N0CitwYXJpdHlfYnl0ZXM6CS53b3JkIDAsIDAsIDAsIDAsIDAsIDAsIDAgLy8gb25seSA0IHdvcmRzIGFyZSB1c2VkCisKK2Nzcl9vdXRwdXQ6CS53b3JkIDAKK29sZF9jc3Jfb3V0cHV0Ogkud29yZCAwLCAwLCAwLCAwLCAwLCAwLCAwCisJCS5hbGlnbiA0CitmaXJtd2FyZV9lbmQ6CQkJCS8vIG11c3QgYmUgZHdvcmQtYWxpZ25lZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3dhbnhsZncuaW5jX3NoaXBwZWQgYi9kcml2ZXJzL25ldC93YW4vd2FueGxmdy5pbmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2RhNjg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3dhbnhsZncuaW5jX3NoaXBwZWQKQEAgLTAsMCArMSwxNTggQEAKK3N0YXRpYyB1OCBmaXJtd2FyZVtdPXsKKzB4NjAsMHgwMCwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNiwweEI5LDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDE0LDB4NDIsMHg4MCwweDRBLDB4QjAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDEwLDB4MDQsMHg2NywweDAwLDB4MDAsMHgwRSwKKzB4MDYsMHhCMCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxMCwweDA0LDB4NTgsMHg4MCwweDBDLDB4ODAsCisweDAwLDB4MDAsMHgwMCwweDEwLDB4NjYsMHgwMCwweEZGLDB4REUsMHgyMSwweEZDLDB4MDAsMHgwMCwweDE2LDB4QkMsMHgwMCwweDZDLAorMHgyMSwweEZDLDB4MDAsMHgwMCwweDE3LDB4NUUsMHgwMSwweDAwLDB4MjEsMHhGQywweDAwLDB4MDAsMHgxNiwweERFLDB4MDEsMHg3OCwKKzB4MjEsMHhGQywweDAwLDB4MDAsMHgxNiwweEZFLDB4MDEsMHg3NCwweDIxLDB4RkMsMHgwMCwweDAwLDB4MTcsMHgxRSwweDAxLDB4NzAsCisweDIxLDB4RkMsMHgwMCwweDAwLDB4MTcsMHgzRSwweDAxLDB4NkMsMHgyMSwweEZDLDB4MDAsMHgwMCwweDE4LDB4NEMsMHgwMiwweDAwLAorMHgyMywweEZDLDB4NzgsMHgwMCwweDAwLDB4MDAsMHhGRiwweEZDLDB4MTUsMHg0OCwweDMzLDB4RkMsMHgwNCwweDgwLDB4RkYsMHhGQywKKzB4MTAsMHgyNiwweDMzLDB4RkMsMHgwMSwweDEwLDB4RkYsMHhGQywweDEwLDB4MkEsMHgyMywweEZDLDB4MDAsMHhENCwweDlGLDB4NDAsCisweEZGLDB4RkMsMHgxNSwweDQwLDB4MjMsMHhGQywweDAwLDB4MDAsMHgwNSwweDQzLDB4RkYsMHhGOSwweDAxLDB4MDAsMHgyMywweEZDLAorMHgwMCwweDAwLDB4MDUsMHg0MywweEZGLDB4RjksMHgwMSwweDE0LDB4MjMsMHhGQywweDAwLDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGOSwKKzB4MDEsMHgxMCwweDIzLDB4RkMsMHgwMCwweDAwLDB4MDAsMHgwOCwweEZGLDB4RjksMHgwMSwweDI0LDB4MjMsMHhGQywweDAwLDB4MDAsCisweDAxLDB4MDEsMHhGRiwweEY5LDB4MDEsMHgyOCwweDAwLDB4QjksMHgwMCwweDBGLDB4MDMsMHgwMCwweEZGLDB4RjksMHgwMCwweEU4LAorMHgyMywweEZDLDB4MDAsMHgwMCwweDAwLDB4MDEsMHhGRiwweEY5LDB4MDAsMHhENCwweDYxLDB4MDAsMHgwNiwweDc0LDB4MzMsMHhGQywKKzB4RkYsMHhGRiwweEZGLDB4RkMsMHgxNSwweDUyLDB4NDIsMHg3OSwweEZGLDB4RkMsMHgxNSwweDUwLDB4NDIsMHg3OSwweEZGLDB4RkMsCisweDE1LDB4NjQsMHgyRSwweDNBLDB4MDgsMHg1MCwweDQyLDB4QjksMHgwMCwweDAwLDB4MTksMHg1NCwweDRBLDB4ODcsMHg2NiwweDAwLAorMHgwMCwweDBFLDB4NEUsMHg3MiwweDIyLDB4MDAsMHg0NiwweEZDLDB4MjcsMHgwMCwweDYwLDB4MDAsMHhGRiwweEU2LDB4NDIsMHg4MCwKKzB4NDIsMHg4NiwweDA4LDB4MDcsMHgwMCwweDA0LDB4NjcsMHgwMCwweDAwLDB4MEEsMHgwOCwweDg3LDB4MDAsMHgwMCwweDYxLDB4MDAsCisweDAyLDB4QTAsMHgwOCwweDA3LDB4MDAsMHgwMCwweDY3LDB4MDAsMHgwMCwweDA2LDB4NjEsMHgwMCwweDAwLDB4MzYsMHgwOCwweDA3LAorMHgwMCwweDA4LDB4NjcsMHgwMCwweDAwLDB4MDYsMHg2MSwweDAwLDB4MDIsMHhCOCwweDA4LDB4MDcsMHgwMCwweDBDLDB4NjcsMHgwMCwKKzB4MDAsMHgwQSwweDYxLDB4MDAsMHgwNCwweDk0LDB4NjEsMHgwMCwweDAzLDB4NjAsMHhFMiwweDhGLDB4NTgsMHg4MCwweDBDLDB4ODAsCisweDAwLDB4MDAsMHgwMCwweDEwLDB4NjYsMHgwMCwweEZGLDB4QkMsMHgyMywweEM2LDB4RkYsMHhGOSwweDAwLDB4RTQsMHg2MCwweDAwLAorMHhGRiwweDkyLDB4MjAsMHg3MCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTAsMHgwNCwweDRBLDB4QTgsMHgwMCwweDAwLDB4NjYsMHgwMCwKKzB4MDIsMHg0RSwweDIxLDB4N0MsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHg0MiwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsCisweDE5LDB4NTgsMHg0MiwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDY4LDB4NDIsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLAorMHgxOSwweDc4LDB4NDIsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg4OCwweDIyLDB4MzksMHhGRiwweEZDLDB4MTYsMHhFQywKKzB4QzIsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHhGMiwweDBDLDB4QTgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MTgsCisweDY2LDB4MDAsMHgwMCwweDBFLDB4ODIsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHhFMiwweDYwLDB4MDAsMHgwMCwweDBBLAorMHg4MiwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweEQyLDB4MjMsMHhDMSwweEZGLDB4RkMsMHgxNiwweEVDLDB4MDAsMHg3MCwKKzB4MTAsMHgwMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHhBQSwweDYxLDB4MDAsMHgwNSwweDc2LDB4MjIsMHgzMCwweDA5LDB4QjAsCisweDAwLDB4MDAsMHgxOCwweDkyLDB4MjIsMHg3MCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHg3MiwweDc0LDB4MDgsMHgyNiwweDNDLAorMHgxOCwweDAwLDB4MDAsMHgwMCwweDBDLDB4QTgsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MTAsMHg2NywweDAwLDB4MDAsMHgwNiwKKzB4MDgsMHhDMywweDAwLDB4MUEsMHgyMiwweEMzLDB4MjIsMHhDMSwweDA2LDB4ODEsMHgwMCwweDAwLDB4MDUsMHhGQywweDUxLDB4Q0EsCisweEZGLDB4RjQsMHgwOCwweEMzLDB4MDAsMHgxRCwweDIyLDB4QzMsMHgyMiwweEMxLDB4NzQsMHgxQywweDIyLDB4RkMsMHg5MCwweDAwLAorMHgwMCwweDAwLDB4MjIsMHhDMSwweDA2LDB4ODEsMHgwMCwweDAwLDB4MDUsMHhGQywweDUxLDB4Q0EsMHhGRiwweEYwLDB4MjIsMHhGQywKKzB4QjAsMHgwMCwweDAwLDB4MDAsMHgyMiwweEMxLDB4MjIsMHg3MCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHg2MiwweDI0LDB4NzAsCisweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHg1MiwweDI1LDB4N0MsMHgwMCwweDAwLDB4RkYsMHhGRiwweDAwLDB4MTAsMHgyNSwweDdDLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHgyMiwweDMwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweDcyLDB4MzMsMHg0MSwKKzB4MDAsMHgwMiwweDA2LDB4ODEsMHgwMCwweDAwLDB4MDAsMHg1MCwweDMzLDB4NDEsMHgwMCwweDAwLDB4MTMsMHg3QywweDAwLDB4MDgsCisweDAwLDB4MDQsMHgxMywweDdDLDB4MDAsMHgwOCwweDAwLDB4MDUsMHgwQywweEE4LDB4MDAsMHgwMCwweDAwLDB4MDUsMHgwMCwweDEwLAorMHg2NiwweDAwLDB4MDAsMHgyQSwweDQyLDB4NkEsMHgwMCwweDA4LDB4MjMsMHg3QywweDAwLDB4MDAsMHhGMCwweEI4LDB4MDAsMHgzNCwKKzB4MjMsMHg3QywweDAwLDB4MDAsMHhGRiwweEZGLDB4MDAsMHgzOCwweDMzLDB4N0MsMHgwNSwweEZBLDB4MDAsMHg0NiwweDMxLDB4QkMsCisweDAwLDB4MDIsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4OUMsMHg2MCwweDAwLDB4MDAsMHhCQywweDBDLDB4QTgsMHgwMCwweDAwLAorMHgwMCwweDA3LDB4MDAsMHgxMCwweDY2LDB4MDAsMHgwMCwweDJDLDB4MzUsMHg3QywweDA4LDB4MDAsMHgwMCwweDA4LDB4MjMsMHg3QywKKzB4REUsMHhCQiwweDIwLDB4RTMsMHgwMCwweDM0LDB4MjMsMHg3QywweEZGLDB4RkYsMHhGRiwweEZGLDB4MDAsMHgzOCwweDMzLDB4N0MsCisweDA1LDB4RkMsMHgwMCwweDQ2LDB4MzEsMHhCQywweDAwLDB4MDQsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4OUMsMHg2MCwweDAwLAorMHgwMCwweDg2LDB4MEMsMHhBOCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgxMCwweDY2LDB4MDAsMHgwMCwweDI2LDB4NDIsMHg2QSwKKzB4MDAsMHgwOCwweDIzLDB4N0MsMHgwMCwweDAwLDB4RjAsMHhCOCwweDAwLDB4MzQsMHg0MiwweEE5LDB4MDAsMHgzOCwweDMzLDB4N0MsCisweDA1LDB4RkEsMHgwMCwweDQ2LDB4MzEsMHhCQywweDAwLDB4MDIsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4OUMsMHg2MCwweDAwLAorMHgwMCwweDU2LDB4MEMsMHhBOCwweDAwLDB4MDAsMHgwMCwweDA2LDB4MDAsMHgxMCwweDY2LDB4MDAsMHgwMCwweDI4LDB4MzUsMHg3QywKKzB4MDgsMHgwMCwweDAwLDB4MDgsMHgyMywweDdDLDB4REUsMHhCQiwweDIwLDB4RTMsMHgwMCwweDM0LDB4NDIsMHhBOSwweDAwLDB4MzgsCisweDMzLDB4N0MsMHgwNSwweEZDLDB4MDAsMHg0NiwweDMxLDB4QkMsMHgwMCwweDA0LDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDlDLAorMHg2MCwweDAwLDB4MDAsMHgyNCwweDQyLDB4NkEsMHgwMCwweDA4LDB4MjMsMHg3QywweDAwLDB4MDAsMHhGMCwweEI4LDB4MDAsMHgzNCwKKzB4MjMsMHg3QywweDAwLDB4MDAsMHhGRiwweEZGLDB4MDAsMHgzOCwweDMzLDB4N0MsMHgwNSwweEY4LDB4MDAsMHg0NiwweDQyLDB4NzAsCisweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg5QywweDI1LDB4N0MsMHgwMCwweDAwLDB4MDAsMHgwMywweDAwLDB4MDQsMHgwQywweEE4LAorMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MTQsMHg2NiwweDAwLDB4MDAsMHgwRSwweDI1LDB4N0MsMHgxMCwweDA0LDB4MDksMHgwMCwKKzB4MDAsMHgwMCwweDYwLDB4MDAsMHgwMCwweDBBLDB4MjUsMHg3QywweDEwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMzLDB4N0MsCisweDA1LDB4RkMsMHgwMCwweDA2LDB4MjIsMHgwMCwweEU5LDB4ODksMHgwMCwweDgxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgzMywweEMxLAorMHhGRiwweEZDLDB4MTUsMHhDMCwweDA4LDB4MzksMHgwMCwweDAwLDB4RkYsMHhGQywweDE1LDB4QzAsMHg2NiwweDAwLDB4RkYsMHhGNiwKKzB4MzUsMHg3QywweDAwLDB4MUYsMHgwMCwweDE0LDB4MDAsMHhBQSwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDRFLDB4NzUsCisweDIwLDB4NzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE4LDB4NTIsMHg0MiwweDY4LDB4MDAsMHgxNCwweDAyLDB4QTgsMHhGRiwweEZGLAorMHhGRiwweENGLDB4MDAsMHgwMCwweDAyLDB4NzAsMHhFRiwweEZGLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweEFBLDB4NjEsMHgwMCwKKzB4MDMsMHg3MCwweDIyLDB4MzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDEwLDB4MDQsMHg0MiwweEIwLDB4MTksMHg5MCwweDRFLDB4NzUsCisweDBDLDB4QjAsMHgwMCwweDAwLDB4MDAsMHgwQSwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg3OCwweDY3LDB4MDAsMHgwMCwweEE4LAorMHgyMiwweDMwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDY4LDB4MjQsMHgwMSwweDRDLDB4M0MsMHgyMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwQywweEQ0LDB4QjAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDEwLDB4MDQsMHgwNiwweDgyLDB4MDAsMHgwMCwweDAwLDB4MUMsCisweDBDLDB4QjAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDI5LDB4OTAsMHg2NiwweDAwLDB4MDAsMHg3QywweDIwLDB4NzAsMHgyOSwweEEwLAorMHgwMCwweDA0LDB4RTcsMHg4OSwweEQyLDB4QjAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE4LDB4NzIsMHgyMiwweDcwLDB4MTksMHhBMCwKKzB4MDAsMHgwNCwweDI0LDB4MzAsMHgyOSwweEEwLDB4MDAsMHgwOCwweDMxLDB4ODIsMHgxOSwweEEwLDB4MDAsMHgwMiwweDU2LDB4ODIsCisweDAyLDB4ODIsMHhGRiwweEZGLDB4RkYsMHhGQywweDIzLDB4QzgsMHhGRiwweEY5LDB4MDEsMHgwNCwweDIzLDB4QzksMHhGRiwweEY5LAorMHgwMSwweDA4LDB4MjMsMHhDMiwweEZGLDB4RjksMHgwMSwweDBDLDB4MjMsMHhGQywweDAwLDB4MDAsMHgwMSwweDAzLDB4RkYsMHhGOSwKKzB4MDEsMHgyOCwweDYxLDB4MDAsMHgwMSwweEY2LDB4MDgsMHhGMCwweDAwLDB4MUYsMHgxOSwweDkwLDB4MjIsMHgzMCwweDA5LDB4QjAsCisweDAwLDB4MDAsMHgxOSwweDY4LDB4NTIsMHg4MSwweDBDLDB4ODEsMHgwMCwweDAwLDB4MDAsMHgwQSwweDY2LDB4MDAsMHgwMCwweDA0LAorMHg0MiwweDgxLDB4MjEsMHg4MSwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg2OCwweDUyLDB4QjAsMHgwOSwweEIwLDB4MDAsMHgwMCwKKzB4MTksMHg3OCwweDYwLDB4MDAsMHhGRiwweDRDLDB4NEUsMHg3NSwweDIyLDB4MzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4ODgsCisweEU3LDB4ODksMHhEMiwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweDgyLDB4MzQsMHgzMCwweDE5LDB4OTAsMHgwOCwweDAyLAorMHgwMCwweDBGLDB4NjYsMHgwMCwweDAxLDB4MTIsMHgwOCwweDAyLDB4MDAsMHgwMSwweDY2LDB4MDAsMHgwMCwweEU2LDB4NEEsMHg3MCwKKzB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDlDLDB4NjYsMHgwMCwweDAwLDB4MDYsMHgwOCwweDgyLDB4MDAsMHgwMiwweDAyLDB4NDIsCisweDBDLDB4QkMsMHgwQywweDQyLDB4MEMsMHgwMCwweDY2LDB4MDAsMHgwMCwweERDLDB4NDIsMHg4MywweDM2LDB4MzAsMHgxOSwweEEwLAorMHgwMCwweDAyLDB4OTYsMHg3MCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg5QywweDBDLDB4NDMsMHgwNSwweEY4LDB4NkUsMHgwMCwKKzB4MDAsMHhDNCwweDI0LDB4M0EsMHgwNCwweDg0LDB4NEMsMHgzQywweDIwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwQywweEQ0LDB4QkEsCisweEZBLDB4RjQsMHgwQywweEIwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyOSwweDkwLDB4NjYsMHgwMCwweDAwLDB4OTYsMHgyMSwweDgzLAorMHgyOSwweEEwLDB4MDAsMHgwOCwweDIwLDB4NzAsMHgxOSwweEEwLDB4MDAsMHgwNCwweDIyLDB4NzAsMHgyOSwweEEwLDB4MDAsMHgwNCwKKzB4NEEsMHg4OSwweDY3LDB4MDAsMHgwMCwweDJBLDB4NTYsMHg4MywweDAyLDB4ODMsMHhGRiwweEZGLDB4RkYsMHhGQywweDIzLDB4QzgsCisweEZGLDB4RjksMHgwMSwweDFDLDB4MjMsMHhDOSwweEZGLDB4RjksMHgwMSwweDE4LDB4MjMsMHhDMywweEZGLDB4RjksMHgwMSwweDIwLAorMHgyMywweEZDLDB4MDAsMHgwMCwweDAzLDB4MDEsMHhGRiwweEY5LDB4MDEsMHgyOCwweDYxLDB4MDAsMHgwMSwweDJDLDB4MjEsMHhCMCwKKzB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweEMyLDB4MjksMHg5MCwweDA4LDB4QzYsMHgwMCwweDA0LDB4MjQsMHgzQSwweDA0LDB4MUEsCisweDUyLDB4ODIsMHgwQywweDgyLDB4MDAsMHgwMCwweDAwLDB4MjgsMHg2NiwweDAwLDB4MDAsMHgwNCwweDQyLDB4ODIsMHgyMywweEMyLAorMHgwMCwweDAwLDB4MTksMHg5OCwweDAyLDB4NzAsMHhGMCwweDAwLDB4MTksMHg5MCwweDA4LDB4RjAsMHgwMCwweDFGLDB4MTksMHg5MCwKKzB4MjIsMHgzMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg4OCwweDUyLDB4ODEsMHgwQywweDgxLDB4MDAsMHgwMCwweDAwLDB4MUUsCisweDY2LDB4MDAsMHgwMCwweDA0LDB4NDIsMHg4MSwweDIxLDB4ODEsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4ODgsMHg2MCwweDAwLAorMHhGRSwweEY4LDB4MjQsMHgzMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTAsMHgwNCwweDUyLDB4QjAsMHgyOSwweEEwLDB4MDAsMHgwOCwKKzB4NjAsMHgwMCwweEZGLDB4QzIsMHgyNCwweDMwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxMCwweDA0LDB4NTIsMHhCMCwweDI5LDB4QTAsCisweDAwLDB4MEMsMHg2MCwweDAwLDB4RkYsMHhCMCwweDRFLDB4NzUsMHg0QSwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDc4LAorMHg2NywweDAwLDB4MDAsMHg4NiwweDIyLDB4MzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4NTgsMHgyNCwweDAxLDB4RTcsMHg4OSwKKzB4RDIsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHg3MiwweDM2LDB4MzAsMHgxOSwweDkwLDB4MDgsMHgwMywweDAwLDB4MEYsCisweDY2LDB4MDAsMHgwMCwweDY2LDB4OEMsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHhBMiwweDUzLDB4QjAsMHgwOSwweEIwLAorMHgwMCwweDAwLDB4MTksMHg3OCwweDIyLDB4MzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4NTgsMHg1MiwweDgxLDB4MEMsMHg4MSwKKzB4MDAsMHgwMCwweDAwLDB4MEEsMHg2NiwweDAwLDB4MDAsMHgwNCwweDQyLDB4ODEsMHgyMSwweDgxLDB4MDksMHhCMCwweDAwLDB4MDAsCisweDE5LDB4NTgsMHg0QywweDNDLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBDLDB4RDQsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLAorMHgxMCwweDA0LDB4MDYsMHg4MiwweDAwLDB4MDAsMHgwMCwweDFDLDB4MDgsMHgwMywweDAwLDB4MDEsMHg2NiwweDAwLDB4MDAsMHgwRSwKKzB4MjEsMHhCQywweDAwLDB4MDAsMHgwMCwweDIwLDB4MjksMHg5MCwweDYwLDB4MDAsMHhGRiwweDdFLDB4MjEsMHhCQywweDAwLDB4MDAsCisweDAwLDB4MzAsMHgyOSwweDkwLDB4NjAsMHgwMCwweEZGLDB4NzIsMHg0RSwweDc1LDB4MkYsMHgwMCwweDQwLDB4RTcsMHgyMCwweDM5LAorMHhGRiwweEY5LDB4MDEsMHgyOCwweDA4LDB4MDAsMHgwMCwweDA0LDB4NjYsMHgwMCwweDAwLDB4MkMsMHg0RSwweDcyLDB4MjIsMHgwMCwKKzB4NDYsMHhGQywweDI3LDB4MDAsMHg2MCwweDAwLDB4RkYsMHhFOCwweDJGLDB4MDAsMHg0MCwweEU3LDB4MjAsMHgzOSwweEZGLDB4RjksCisweDAxLDB4MjgsMHgwOCwweDAwLDB4MDAsMHgwQywweDY2LDB4MDAsMHgwMCwweDBFLDB4NEUsMHg3MiwweDIyLDB4MDAsMHg0NiwweEZDLAorMHgyNywweDAwLDB4NjAsMHgwMCwweEZGLDB4RTgsMHg0NiwweERGLDB4MjAsMHgxRiwweDRFLDB4NzUsMHgyRiwweDAwLDB4MjAsMHgzOSwKKzB4RkYsMHhGOSwweDAwLDB4RTAsMHgyMywweEMwLDB4RkYsMHhGOSwweDAwLDB4RTAsMHg4MSwweEI5LDB4MDAsMHgwMCwweDE5LDB4NTQsCisweDIzLDB4RkMsMHgwMCwweDAwLDB4MDksMHgwOSwweEZGLDB4RjksMHgwMSwweDI4LDB4MjAsMHgxRiwweDRFLDB4NzMsMHgwMCwweEI5LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweEZGLDB4RkMsMHgxNiwweDEwLDB4MDAsMHhCOSwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwKKzB4MTksMHg1NCwweDIzLDB4RkMsMHg0MCwweDAwLDB4MDAsMHgwMCwweEZGLDB4RkMsMHgxNSwweDRDLDB4NEUsMHg3MywweDAwLDB4QjksCisweDAwLDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGQywweDE2LDB4MzAsMHgwMCwweEI5LDB4MDAsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLAorMHgxOSwweDU0LDB4MjMsMHhGQywweDIwLDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGQywweDE1LDB4NEMsMHg0RSwweDczLDB4MDAsMHhCOSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHhGRiwweEZDLDB4MTYsMHg1MCwweDAwLDB4QjksMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsCisweDE5LDB4NTQsMHgyMywweEZDLDB4MTAsMHgwMCwweDAwLDB4MDAsMHhGRiwweEZDLDB4MTUsMHg0QywweDRFLDB4NzMsMHgwMCwweEI5LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweEZGLDB4RkMsMHgxNiwweDcwLDB4MDAsMHhCOSwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwKKzB4MTksMHg1NCwweDIzLDB4RkMsMHgwOCwweDAwLDB4MDAsMHgwMCwweEZGLDB4RkMsMHgxNSwweDRDLDB4NEUsMHg3MywweDRFLDB4NzMsCisweDJGLDB4MDAsMHgyRiwweDAxLDB4MkYsMHgwMiwweDJGLDB4MDgsMHgyRiwweDA5LDB4NDIsMHg4MCwweDIwLDB4N0MsMHhGRiwweEZCLAorMHgwMCwweDAwLDB4MzIsMHgxMCwweDAyLDB4ODEsMHgwMCwweDAwLDB4MDAsMHhFNywweDBDLDB4NDEsMHgwMCwweDQyLDB4NjYsMHgwMCwKKzB4MDAsMHgwQSwweDMyLDB4M0MsMHgwRSwweDA4LDB4NjAsMHgwMCwweDAwLDB4M0UsMHgwQywweDQxLDB4MDAsMHg2MywweDY2LDB4MDAsCisweDAwLDB4MEEsMHgzMiwweDNDLDB4MDQsMHgwOCwweDYwLDB4MDAsMHgwMCwweDJFLDB4MEMsMHg0MSwweDAwLDB4ODQsMHg2NiwweDAwLAorMHgwMCwweDBBLDB4MzIsMHgzQywweDAyLDB4MDgsMHg2MCwweDAwLDB4MDAsMHgxRSwweDBDLDB4NDEsMHgwMCwweEE1LDB4NjYsMHgwMCwKKzB4MDAsMHgwQSwweDMyLDB4M0MsMHgwRCwweDA4LDB4NjAsMHgwMCwweDAwLDB4MEUsMHgzMiwweDNDLDB4MDAsMHgwOCwweDM0LDB4M0MsCisweDgwLDB4RTcsMHg2MCwweDAwLDB4MDAsMHgxNCwweDM0LDB4MzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4QUEsMHgwMiwweDQyLAorMHgzMCwweDAwLDB4ODIsMHg0MiwweDM0LDB4M0MsMHg4MCwweEZGLDB4QjIsMHg3MCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHhBQywKKzB4NjcsMHgwMCwweDAwLDB4MEMsMHgzMSwweDgxLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweEFDLDB4MzAsMHg4MSwweDMyLDB4MzksCisweEZGLDB4RkMsMHgxNSwweDY2LDB4QzIsMHg3MCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHgwMiwweDY3LDB4MDAsMHgwMCwweDBDLAorMHgzMiwweDEwLDB4MDIsMHg0MSwweEZGLDB4RjcsMHg2MCwweDAwLDB4MDAsMHgwOCwweDMyLDB4MTAsMHgwMCwweDQxLDB4MDAsMHgwOCwKKzB4QzIsMHg0MiwweDIyLDB4NzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDEwLDB4MDQsMHhCMiwweEE5LDB4MDAsMHgwNCwweDY3LDB4MDAsCisweDAwLDB4MTIsMHgyMywweDQxLDB4MDAsMHgwNCwweDIzLDB4RjAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE4LDB4QjIsMHhGRiwweEY5LAorMHgwMCwweEU0LDB4NTQsMHg4OCwweDU4LDB4ODAsMHgwQywweDgwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg2NiwweDAwLDB4RkYsMHgzNCwKKzB4MjIsMHg1RiwweDIwLDB4NUYsMHgyNCwweDFGLDB4MjIsMHgxRiwweDIwLDB4MUYsMHg0RSwweDc1LDB4NjEsMHgwMCwweEZGLDB4MTIsCisweDRFLDB4NzMsMHhGRiwweEZDLDB4MTYsMHgwMCwweEZGLDB4RkMsMHgxNiwweDIwLDB4RkYsMHhGQywweDE2LDB4NDAsMHhGRiwweEZDLAorMHgxNiwweDYwLDB4RkYsMHhGQywweDBDLDB4MDAsMHhGRiwweEZDLDB4MEQsMHgwMCwweEZGLDB4RkMsMHgwRSwweDAwLDB4RkYsMHhGQywKKzB4MEYsMHgwMCwweEZGLDB4RkMsMHgwMCwweDAwLDB4RkYsMHhGQywweDAxLDB4NDAsMHhGRiwweEZDLDB4MDIsMHg4MCwweEZGLDB4RkMsCisweDAzLDB4QzAsMHhGRiwweEZDLDB4MDAsMHg1MCwweEZGLDB4RkMsMHgwMSwweDkwLDB4RkYsMHhGQywweDAyLDB4RDAsMHhGRiwweEZDLAorMHgwNCwweDEwLDB4MDAsMHgwMCwweDQwLDB4MDAsMHgwMCwweDAxLDB4MkYsMHg2MCwweDAwLDB4MDIsMHgxRSwweEMwLDB4MDAsMHgwMywKKzB4MEUsMHgyMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsCisweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDQwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDAwLAorMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgxMSwweDAwLDB4MDAsMHgwMCwweDEyLDB4MDAsMHgwMCwKKzB4MDAsMHgxMywweDAwLDB4MDAsMHgwMCwweDJDLDB4MDAsMHgwMCwweDNFLDB4MDAsMHgwMCwweDJDLDB4MDAsMHgwMCwweDNFLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyRCwweDAwLDB4MDAsMHgzRiwweDAwLDB4MDAsMHgyRCwweDAwLDB4MDAsMHgzRiwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4RkYsMHgwMCwweDAwLDB4RkYsMHgwMCwweDAwLDB4RkYsMHgwMCwweDAwLDB4RkYsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsCisweDc3LDB4NjEsMHg2RSwweDU4LDB4NEMsMHgyMCwweDY2LDB4NjksMHg3MiwweDZELDB4NzcsMHg2MSwweDcyLDB4NjUsMHgwQSwweDQzLAorMHg2RiwweDcwLDB4NzksMHg3MiwweDY5LDB4NjcsMHg2OCwweDc0LDB4MjAsMHgyOCwweDQzLDB4MjksMHgyMCwweDMyLDB4MzAsMHgzMCwKKzB4MzMsMHgyMCwweDRCLDB4NzIsMHg3QSwweDc5LDB4NzMsMHg3QSwweDc0LDB4NkYsMHg2NiwweDIwLDB4NDgsMHg2MSwweDZDLDB4NjEsCisweDczLDB4NjEsMHgyMCwweDNDLDB4NkIsMHg2OCwweDYzLDB4NDAsMHg3MCwweDZELDB4MkUsMHg3NywweDYxLDB4NzcsMHgyRSwweDcwLAorMHg2QywweDNFLDB4MEEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4veDI1X2FzeS5jIGIvZHJpdmVycy9uZXQvd2FuL3gyNV9hc3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzVjZmNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3gyNV9hc3kuYwpAQCAtMCwwICsxLDg0NCBAQAorLyoKKyAqCVRoaW5ncyB0byBzb3J0IG91dDoKKyAqCisgKglvCXRidXN5IGhhbmRsaW5nCisgKglvCWFsbG93IHVzZXJzIHRvIHNldCB0aGUgcGFyYW1ldGVycworICoJbwlzeW5jL2FzeW5jIHN3aXRjaGluZyA/CisgKgorICoJTm90ZTogVGhpcyBkb2VzIF9ub3RfIGltcGxlbWVudCBDQ0lUVCBYLjI1IGFzeW5jaHJvbm91cyBmcmFtaW5nCisgKglyZWNvbW1lbmRhdGlvbnMuIEl0cyBwcmltYXJpbHkgZm9yIHRlc3RpbmcgcHVycG9zZXMuIElmIHlvdSB3YW50ZWQKKyAqCXRvIGRvIENDSVRUIHRoZW4gaW4gdGhlb3J5IGFsbCB5b3UgbmVlZCBpcyB0byBuaWNrIHRoZSBIRExDIGFzeW5jCisgKgljaGVja3N1bSByb3V0aW5lcyBmcm9tIHBwcC5jCisgKiAgICAgIENoYW5nZXM6CisgKgorICoJMjAwMC0xMC0yOQlIZW5uZXIgRWlzZW4JbGFwYl9kYXRhX2luZGljYXRpb24oKSByZXR1cm4gc3RhdHVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgveDI1Lmg+CisjaW5jbHVkZSA8bGludXgvbGFwYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICJ4MjVfYXN5LmgiCisKKyNpbmNsdWRlIDxuZXQveDI1ZGV2aWNlLmg+CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqKngyNV9hc3lfZGV2czsKK3N0YXRpYyBpbnQgeDI1X2FzeV9tYXhkZXYgPSBTTF9OUlVOSVQ7CisKK21vZHVsZV9wYXJhbSh4MjVfYXN5X21heGRldiwgaW50LCAwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCB4MjVfYXN5X2VzYyh1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIHgyNV9hc3lfdW5lc2Moc3RydWN0IHgyNV9hc3kgKnNsLCB1bnNpZ25lZCBjaGFyIGMpOworc3RhdGljIHZvaWQgeDI1X2FzeV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogRmluZCBhIGZyZWUgWC4yNSBjaGFubmVsLCBhbmQgbGluayBpbiB0aGlzIGB0dHknIGxpbmUuICovCitzdGF0aWMgc3RydWN0IHgyNV9hc3kgKngyNV9hc3lfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgeDI1X2FzeSAqc2w7CisJaW50IGk7CisKKwlpZiAoeDI1X2FzeV9kZXZzID09IE5VTEwpCisJCXJldHVybiBOVUxMOwkvKiBNYXN0ZXIgYXJyYXkgbWlzc2luZyAhICovCisKKwlmb3IgKGkgPSAwOyBpIDwgeDI1X2FzeV9tYXhkZXY7IGkrKykgeworCQlkZXYgPSB4MjVfYXN5X2RldnNbaV07CisKKwkJLyogTm90IGFsbG9jYXRlZCA/ICovCisJCWlmIChkZXYgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCXNsID0gZGV2LT5wcml2OworCQkvKiBOb3QgaW4gdXNlID8gKi8KKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNMRl9JTlVTRSwgJnNsLT5mbGFncykpCisJCQlyZXR1cm4gc2w7CisJfQorCisKKwkvKiBTb3JyeSwgdG9vIG1hbnksIGFsbCBzbG90cyBpbiB1c2UgKi8KKwlpZiAoaSA+PSB4MjVfYXN5X21heGRldikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBJZiBubyBjaGFubmVscyBhcmUgYXZhaWxhYmxlLCBhbGxvY2F0ZSBvbmUgKi8KKwlpZiAoIWRldikgeworCQljaGFyIG5hbWVbSUZOQU1TSVpdOworCQlzcHJpbnRmKG5hbWUsICJ4MjVhc3klZCIsIGkpOworCisJCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHgyNV9hc3kpLAorCQkJCSAgIG5hbWUsIHgyNV9hc3lfc2V0dXApOworCQlpZiAoIWRldikKKwkJCXJldHVybiBOVUxMOworCisJCS8qIEluaXRpYWxpemUgY2hhbm5lbCBjb250cm9sIGRhdGEgKi8KKwkJc2wgPSBkZXYtPnByaXY7CisJCWRldi0+YmFzZV9hZGRyICAgID0gaTsKKworCQkvKiByZWdpc3RlciBkZXZpY2Ugc28gdGhhdCBpdCBjYW4gYmUgaWZjb25maWcnZWQgICAgICAgKi8KKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCS8qIChSZS0pU2V0IHRoZSBJTlVTRSBiaXQuICAgVmVyeSBJbXBvcnRhbnQhICovCisJCQlzZXRfYml0KFNMRl9JTlVTRSwgJnNsLT5mbGFncyk7CisJCQl4MjVfYXN5X2RldnNbaV0gPSBkZXY7CisJCQlyZXR1cm4gc2w7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIngyNV9hc3lfYWxsb2MoKSAtIHJlZ2lzdGVyX25ldGRldigpIGZhaWx1cmUuXG4iKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyogRnJlZSBhbiBYLjI1IGNoYW5uZWwuICovCitzdGF0aWMgdm9pZCB4MjVfYXN5X2ZyZWUoc3RydWN0IHgyNV9hc3kgKnNsKQoreworCS8qIEZyZWUgYWxsIFguMjUgZnJhbWUgYnVmZmVycy4gKi8KKwlpZiAoc2wtPnJidWZmKSAgeworCQlrZnJlZShzbC0+cmJ1ZmYpOworCX0KKwlzbC0+cmJ1ZmYgPSBOVUxMOworCWlmIChzbC0+eGJ1ZmYpICB7CisJCWtmcmVlKHNsLT54YnVmZik7CisJfQorCXNsLT54YnVmZiA9IE5VTEw7CisKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChTTEZfSU5VU0UsICZzbC0+ZmxhZ3MpKSB7CisJCXByaW50aygiJXM6IHgyNV9hc3lfZnJlZSBmb3IgYWxyZWFkeSBmcmVlIHVuaXQuXG4iLCBzbC0+ZGV2LT5uYW1lKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgeDI1X2FzeV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdtdHUpCit7CisJc3RydWN0IHgyNV9hc3kgKnNsID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGNoYXIgKnhidWZmLCAqcmJ1ZmY7CisJaW50IGxlbiA9IDIqIG5ld210dTsKKworCXhidWZmID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYyAobGVuICsgNCwgR0ZQX0FUT01JQyk7CisJcmJ1ZmYgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jIChsZW4gKyA0LCBHRlBfQVRPTUlDKTsKKworCWlmICh4YnVmZiA9PSBOVUxMIHx8IHJidWZmID09IE5VTEwpICAKKwl7CisJCXByaW50aygiJXM6IHVuYWJsZSB0byBncm93IFguMjUgYnVmZmVycywgTVRVIGNoYW5nZSBjYW5jZWxsZWQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJaWYgKHhidWZmICE9IE5VTEwpICAKKwkJCWtmcmVlKHhidWZmKTsKKwkJaWYgKHJidWZmICE9IE5VTEwpICAKKwkJCWtmcmVlKHJidWZmKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2JoKCZzbC0+bG9jayk7CisJeGJ1ZmYgICAgPSB4Y2hnKCZzbC0+eGJ1ZmYsIHhidWZmKTsKKwlpZiAoc2wtPnhsZWZ0KSAgeworCQlpZiAoc2wtPnhsZWZ0IDw9IGxlbikgIHsKKwkJCW1lbWNweShzbC0+eGJ1ZmYsIHNsLT54aGVhZCwgc2wtPnhsZWZ0KTsKKwkJfSBlbHNlICB7CisJCQlzbC0+eGxlZnQgPSAwOworCQkJc2wtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJfQorCX0KKwlzbC0+eGhlYWQgPSBzbC0+eGJ1ZmY7CisKKwlyYnVmZgkgPSB4Y2hnKCZzbC0+cmJ1ZmYsIHJidWZmKTsKKwlpZiAoc2wtPnJjb3VudCkgIHsKKwkJaWYgKHNsLT5yY291bnQgPD0gbGVuKSB7CisJCQltZW1jcHkoc2wtPnJidWZmLCByYnVmZiwgc2wtPnJjb3VudCk7CisJCX0gZWxzZSAgeworCQkJc2wtPnJjb3VudCA9IDA7CisJCQlzbC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCXNldF9iaXQoU0xGX0VSUk9SLCAmc2wtPmZsYWdzKTsKKwkJfQorCX0KKworCWRldi0+bXR1ICAgID0gbmV3bXR1OworCXNsLT5idWZmc2l6ZSA9IGxlbjsKKworCXNwaW5fdW5sb2NrX2JoKCZzbC0+bG9jayk7CisKKwlpZiAoeGJ1ZmYgIT0gTlVMTCkgCisJCWtmcmVlKHhidWZmKTsKKwlpZiAocmJ1ZmYgIT0gTlVMTCkKKwkJa2ZyZWUocmJ1ZmYpOworCXJldHVybiAwOworfQorCisKKy8qIFNldCB0aGUgInNlbmRpbmciIGZsYWcuICBUaGlzIG11c3QgYmUgYXRvbWljLCBoZW5jZSB0aGUgQVNNLiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgeDI1X2FzeV9sb2NrKHN0cnVjdCB4MjVfYXN5ICpzbCkKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKHNsLT5kZXYpOworfQorCisKKy8qIENsZWFyIHRoZSAic2VuZGluZyIgZmxhZy4gIFRoaXMgbXVzdCBiZSBhdG9taWMsIGhlbmNlIHRoZSBBU00uICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4MjVfYXN5X3VubG9jayhzdHJ1Y3QgeDI1X2FzeSAqc2wpCit7CisJbmV0aWZfd2FrZV9xdWV1ZShzbC0+ZGV2KTsKK30KKworLyogU2VuZCBvbmUgY29tcGxldGVseSBkZWNhcHN1bGF0ZWQgSVAgZGF0YWdyYW0gdG8gdGhlIElQIGxheWVyLiAqLworCitzdGF0aWMgdm9pZCB4MjVfYXN5X2J1bXAoc3RydWN0IHgyNV9hc3kgKnNsKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGNvdW50OworCWludCBlcnI7CisKKwljb3VudCA9IHNsLT5yY291bnQ7CisJc2wtPnN0YXRzLnJ4X2J5dGVzKz1jb3VudDsKKwkKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGNvdW50KzEpOworCWlmIChza2IgPT0gTlVMTCkgIAorCXsKKwkJcHJpbnRrKCIlczogbWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIHNsLT5kZXYtPm5hbWUpOworCQlzbC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCXNrYl9wdXNoKHNrYiwxKTsJLyogTEFQQiBpbnRlcm5hbCBjb250cm9sICovCisJbWVtY3B5KHNrYl9wdXQoc2tiLGNvdW50KSwgc2wtPnJidWZmLCBjb3VudCk7CisJc2tiLT5wcm90b2NvbCA9IHgyNV90eXBlX3RyYW5zKHNrYiwgc2wtPmRldik7CisJaWYoKGVycj1sYXBiX2RhdGFfcmVjZWl2ZWQoc2tiLT5kZXYsIHNrYikpIT1MQVBCX09LKQorCXsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXByaW50ayhLRVJOX0RFQlVHICJ4MjVfYXN5OiBkYXRhIHJlY2VpdmVkIGVyciAtICVkXG4iLGVycik7CisJfQorCWVsc2UKKwl7CisJCW5ldGlmX3J4KHNrYik7CisJCXNsLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlzbC0+c3RhdHMucnhfcGFja2V0cysrOworCX0KK30KKworLyogRW5jYXBzdWxhdGUgb25lIElQIGRhdGFncmFtIGFuZCBzdHVmZiBpbnRvIGEgVFRZIHF1ZXVlLiAqLworc3RhdGljIHZvaWQgeDI1X2FzeV9lbmNhcHMoc3RydWN0IHgyNV9hc3kgKnNsLCB1bnNpZ25lZCBjaGFyICppY3AsIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgYWN0dWFsLCBjb3VudCwgbXR1ID0gc2wtPmRldi0+bXR1OworCisJaWYgKGxlbiA+IG10dSkgCisJewkJLyogU2lnaCwgc2hvdWxkbid0IG9jY3VyIEJVVCAuLi4gKi8KKwkJbGVuID0gbXR1OworCQlwcmludGsgKCIlczogdHJ1bmNhdGluZyBvdmVyc2l6ZWQgdHJhbnNtaXQgcGFja2V0IVxuIiwgc2wtPmRldi0+bmFtZSk7CisJCXNsLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCXgyNV9hc3lfdW5sb2NrKHNsKTsKKwkJcmV0dXJuOworCX0KKworCXAgPSBpY3A7CisJY291bnQgPSB4MjVfYXN5X2VzYyhwLCAodW5zaWduZWQgY2hhciAqKSBzbC0+eGJ1ZmYsIGxlbik7CisKKwkvKiBPcmRlciBvZiBuZXh0IHR3byBsaW5lcyBpcyAqdmVyeSogaW1wb3J0YW50LgorCSAqIFdoZW4gd2UgYXJlIHNlbmRpbmcgYSBsaXR0bGUgYW1vdW50IG9mIGRhdGEsCisJICogdGhlIHRyYW5zZmVyIG1heSBiZSBjb21wbGV0ZWQgaW5zaWRlIGRyaXZlci53cml0ZSgpCisJICogcm91dGluZSwgYmVjYXVzZSBpdCdzIHJ1bm5pbmcgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuCisJICogSW4gdGhpcyBjYXNlIHdlICpuZXZlciogZ290IFdSSVRFX1dBS0VVUCBldmVudCwKKwkgKiBpZiB3ZSBkaWQgbm90IHJlcXVlc3QgaXQgYmVmb3JlIHdyaXRlIG9wZXJhdGlvbi4KKwkgKiAgICAgICAxNCBPY3QgMTk5NCAgRG1pdHJ5IEdvcm9kY2hhbmluLgorCSAqLworCXNsLT50dHktPmZsYWdzIHw9ICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCWFjdHVhbCA9IHNsLT50dHktPmRyaXZlci0+d3JpdGUoc2wtPnR0eSwgc2wtPnhidWZmLCBjb3VudCk7CisJc2wtPnhsZWZ0ID0gY291bnQgLSBhY3R1YWw7CisJc2wtPnhoZWFkID0gc2wtPnhidWZmICsgYWN0dWFsOworCS8qIFZTViAqLworCWNsZWFyX2JpdChTTEZfT1VUV0FJVCwgJnNsLT5mbGFncyk7CS8qIHJlc2V0IG91dGZpbGwgZmxhZyAqLworfQorCisvKgorICogQ2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZGF0YS4gIElmIHdlIGhhdmUKKyAqIG1vcmUgcGFja2V0cyB0byBzZW5kLCB3ZSBzZW5kIHRoZW0gaGVyZS4KKyAqLworc3RhdGljIHZvaWQgeDI1X2FzeV93cml0ZV93YWtldXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpbnQgYWN0dWFsOworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IChzdHJ1Y3QgeDI1X2FzeSAqKSB0dHktPmRpc2NfZGF0YTsKKworCS8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuICovCisJaWYgKCFzbCB8fCBzbC0+bWFnaWMgIT0gWDI1X0FTWV9NQUdJQyB8fCAhbmV0aWZfcnVubmluZyhzbC0+ZGV2KSkKKwkJcmV0dXJuOworCisJaWYgKHNsLT54bGVmdCA8PSAwKSAgCisJeworCQkvKiBOb3cgc2VyaWFsIGJ1ZmZlciBpcyBhbG1vc3QgZnJlZSAmIHdlIGNhbiBzdGFydAorCQkgKiB0cmFuc21pc3Npb24gb2YgYW5vdGhlciBwYWNrZXQgKi8KKwkJc2wtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJdHR5LT5mbGFncyAmPSB+KDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisJCXgyNV9hc3lfdW5sb2NrKHNsKTsKKwkJcmV0dXJuOworCX0KKworCWFjdHVhbCA9IHR0eS0+ZHJpdmVyLT53cml0ZSh0dHksIHNsLT54aGVhZCwgc2wtPnhsZWZ0KTsKKwlzbC0+eGxlZnQgLT0gYWN0dWFsOworCXNsLT54aGVhZCArPSBhY3R1YWw7Cit9CisKK3N0YXRpYyB2b2lkIHgyNV9hc3lfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IChzdHJ1Y3QgeDI1X2FzeSopKGRldi0+cHJpdik7CisKKwlzcGluX2xvY2soJnNsLT5sb2NrKTsKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCS8qIE1heSBiZSB3ZSBtdXN0IGNoZWNrIHRyYW5zbWl0dGVyIHRpbWVvdXQgaGVyZSA/CisJCSAqICAgICAgMTQgT2N0IDE5OTQgRG1pdHJ5IEdvcm9kY2hhbmluLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/XG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICAoc2wtPnR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIoc2wtPnR0eSkgfHwgc2wtPnhsZWZ0KSA/CisJCSAgICAgICAiYmFkIGxpbmUgcXVhbGl0eSIgOiAiZHJpdmVyIGVycm9yIik7CisJCXNsLT54bGVmdCA9IDA7CisJCXNsLT50dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwkJeDI1X2FzeV91bmxvY2soc2wpOworCX0KKwlzcGluX3VubG9jaygmc2wtPmxvY2spOworfQorCisvKiBFbmNhcHN1bGF0ZSBhbiBJUCBkYXRhZ3JhbSBhbmQga2ljayBpdCBpbnRvIGEgVFRZIHF1ZXVlLiAqLworCitzdGF0aWMgaW50IHgyNV9hc3lfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IChzdHJ1Y3QgeDI1X2FzeSopKGRldi0+cHJpdik7CisJaW50IGVycjsKKworCWlmICghbmV0aWZfcnVubmluZyhzbC0+ZGV2KSkgeworCQlwcmludGsoIiVzOiB4bWl0IGNhbGwgd2hlbiBpZmFjZSBpcyBkb3duXG4iLCBkZXYtPm5hbWUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCXN3aXRjaChza2ItPmRhdGFbMF0pCisJeworCQljYXNlIDB4MDA6YnJlYWs7CisJCWNhc2UgMHgwMTogLyogQ29ubmVjdGlvbiByZXF1ZXN0IC4uIGRvIG5vdGhpbmcgKi8KKwkJCWlmKChlcnI9bGFwYl9jb25uZWN0X3JlcXVlc3QoZGV2KSkhPUxBUEJfT0spCisJCQkJcHJpbnRrKEtFUk5fRVJSICJ4MjVfYXN5OiBsYXBiX2Nvbm5lY3RfcmVxdWVzdCBlcnJvciAtICVkXG4iLCBlcnIpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAweDAyOiAvKiBEaXNjb25uZWN0IHJlcXVlc3QgLi4gZG8gbm90aGluZyAtIGhhbmcgdXAgPz8gKi8KKwkJCWlmKChlcnI9bGFwYl9kaXNjb25uZWN0X3JlcXVlc3QoZGV2KSkhPUxBUEJfT0spCisJCQkJcHJpbnRrKEtFUk5fRVJSICJ4MjVfYXN5OiBsYXBiX2Rpc2Nvbm5lY3RfcmVxdWVzdCBlcnJvciAtICVkXG4iLCBlcnIpOworCQlkZWZhdWx0OgorCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gIDA7CisJfQorCXNrYl9wdWxsKHNrYiwxKTsJLyogUmVtb3ZlIGNvbnRyb2wgYnl0ZSAqLworCS8qCisJICogSWYgd2UgYXJlIGJ1c3kgYWxyZWFkeS0gdG9vIGJhZC4gIFdlIG91Z2h0IHRvIGJlIGFibGUKKwkgKiB0byBxdWV1ZSB0aGluZ3MgYXQgdGhpcyBwb2ludCwgdG8gYWxsb3cgZm9yIGEgbGl0dGxlCisJICogZnJhbWUgYnVmZmVyLiAgT2ggd2VsbC4uLgorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogSSBoYXRlIHF1ZXVlcyBpbiBYLjI1IGRyaXZlci4gTWF5IGJlIGl0J3MgZWZmaWNpZW50LAorCSAqIGJ1dCBmb3IgbWUgbGF0ZW5jeSBpcyBtb3JlIGltcG9ydGFudC4gOykKKwkgKiBTbywgbm8gcXVldWVzICEKKwkgKiAgICAgICAgMTQgT2N0IDE5OTQgIERtaXRyeSBHb3JvZGNoYW5pbi4KKwkgKi8KKwkKKwlpZigoZXJyPWxhcGJfZGF0YV9yZXF1ZXN0KGRldixza2IpKSE9TEFQQl9PSykKKwl7CisJCXByaW50ayhLRVJOX0VSUiAibGFwYmV0aDogbGFwYl9kYXRhX3JlcXVlc3QgZXJyb3IgLSAlZFxuIiwgZXJyKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJTEFQQiBpbnRlcmZhY2UgYm9pbGVycGxhdGUKKyAqLworCisvKgorICoJQ2FsbGVkIHdoZW4gSSBmcmFtZSBkYXRhIGFycml2ZXMuIFdlIGRpZCB0aGUgd29yayBhYm92ZSAtIHRocm93IGl0CisgKglhdCB0aGUgbmV0IGxheWVyLgorICovCisgIAorc3RhdGljIGludCB4MjVfYXN5X2RhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlyZXR1cm4gbmV0aWZfcngoc2tiKTsKK30KKworLyoKKyAqCURhdGEgaGFzIGVtZXJnZWQgZnJvbSB0aGUgTEFQQiBwcm90b2NvbCBtYWNoaW5lLiBXZSBkb24ndCBoYW5kbGUKKyAqCWJ1c3kgY2FzZXMgdG9vIHdlbGwuIEl0cyB0cmlja3kgdG8gc2VlIGhvdyB0byBkbyB0aGlzIG5pY2VseSAtCisgKglwZXJoYXBzIGxhcGIgc2hvdWxkIGFsbG93IHVzIHRvIGJvdW5jZSB0aGlzID8KKyAqLworIAorc3RhdGljIHZvaWQgeDI1X2FzeV9kYXRhX3RyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHgyNV9hc3kgKnNsPWRldi0+cHJpdjsKKwkKKwlzcGluX2xvY2soJnNsLT5sb2NrKTsKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChzbC0+ZGV2KSB8fCBzbC0+dHR5ID09IE5VTEwpCisJeworCQlzcGluX3VubG9jaygmc2wtPmxvY2spOworCQlwcmludGsoS0VSTl9FUlIgIngyNV9hc3k6IHRidXN5IGRyb3BcbiIpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKwkvKiBXZSB3ZXJlIG5vdCBidXN5LCBzbyB3ZSBhcmUgbm93Li4uIDotKSAqLworCWlmIChza2IgIT0gTlVMTCkgCisJeworCQl4MjVfYXN5X2xvY2soc2wpOworCQlzbC0+c3RhdHMudHhfYnl0ZXMrPXNrYi0+bGVuOworCQl4MjVfYXN5X2VuY2FwcyhzbCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CisJc3Bpbl91bmxvY2soJnNsLT5sb2NrKTsKK30KKworLyoKKyAqCUxBUEIgY29ubmVjdGlvbiBlc3RhYmxpc2gvZG93biBpbmZvcm1hdGlvbi4KKyAqLworIAorc3RhdGljIHZvaWQgeDI1X2FzeV9jb25uZWN0ZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJlYXNvbikKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSBkZXYtPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKKwlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoMSkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsYXBiZXRoOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCXB0ciAgPSBza2JfcHV0KHNrYiwgMSk7CisJKnB0ciA9IDB4MDE7CisKKwlza2ItPnByb3RvY29sID0geDI1X3R5cGVfdHJhbnMoc2tiLCBzbC0+ZGV2KTsKKwluZXRpZl9yeChza2IpOworCXNsLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworfQorCitzdGF0aWMgdm9pZCB4MjVfYXN5X2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhc29uKQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYigxKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIngyNV9hc3k6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm47CisJfQorCisJcHRyICA9IHNrYl9wdXQoc2tiLCAxKTsKKwkqcHRyID0gMHgwMjsKKworCXNrYi0+cHJvdG9jb2wgPSB4MjVfdHlwZV90cmFucyhza2IsIHNsLT5kZXYpOworCW5ldGlmX3J4KHNrYik7CisJc2wtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGFwYl9yZWdpc3Rlcl9zdHJ1Y3QgeDI1X2FzeV9jYWxsYmFja3MgPSB7CisJLmNvbm5lY3RfY29uZmlybWF0aW9uID0geDI1X2FzeV9jb25uZWN0ZWQsCisJLmNvbm5lY3RfaW5kaWNhdGlvbiA9IHgyNV9hc3lfY29ubmVjdGVkLAorCS5kaXNjb25uZWN0X2NvbmZpcm1hdGlvbiA9IHgyNV9hc3lfZGlzY29ubmVjdGVkLAorCS5kaXNjb25uZWN0X2luZGljYXRpb24gPSB4MjVfYXN5X2Rpc2Nvbm5lY3RlZCwKKwkuZGF0YV9pbmRpY2F0aW9uID0geDI1X2FzeV9kYXRhX2luZGljYXRpb24sCisJLmRhdGFfdHJhbnNtaXQgPSB4MjVfYXN5X2RhdGFfdHJhbnNtaXQsCisKK307CisKKworLyogT3BlbiB0aGUgbG93LWxldmVsIHBhcnQgb2YgdGhlIFguMjUgY2hhbm5lbC4gRWFzeSEgKi8KK3N0YXRpYyBpbnQgeDI1X2FzeV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHgyNV9hc3kgKnNsID0gKHN0cnVjdCB4MjVfYXN5KikoZGV2LT5wcml2KTsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwlpbnQgZXJyOworCisJaWYgKHNsLT50dHkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBYLjI1IGZyYW1lIGJ1ZmZlcnM6CisJICoKKwkgKiByYnVmZglSZWNlaXZlIGJ1ZmZlci4KKwkgKiB4YnVmZglUcmFuc21pdCBidWZmZXIuCisJICovCisKKwlsZW4gPSBkZXYtPm10dSAqIDI7CisKKwlzbC0+cmJ1ZmYgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jKGxlbiArIDQsIEdGUF9LRVJORUwpOworCWlmIChzbC0+cmJ1ZmYgPT0gTlVMTCkgICB7CisJCWdvdG8gbm9yYnVmZjsKKwl9CisJc2wtPnhidWZmID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYyhsZW4gKyA0LCBHRlBfS0VSTkVMKTsKKwlpZiAoc2wtPnhidWZmID09IE5VTEwpICAgeworCQlnb3RvIG5veGJ1ZmY7CisJfQorCisJc2wtPmJ1ZmZzaXplID0gbGVuOworCXNsLT5yY291bnQgICA9IDA7CisJc2wtPnhsZWZ0ICAgID0gMDsKKwlzbC0+ZmxhZ3MgICAmPSAoMSA8PCBTTEZfSU5VU0UpOyAgICAgIC8qIENsZWFyIEVTQ0FQRSAmIEVSUk9SIGZsYWdzICovCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJCisJLyoKKwkgKglOb3cgYXR0YWNoIExBUEIKKwkgKi8KKwlpZigoZXJyPWxhcGJfcmVnaXN0ZXIoZGV2LCAmeDI1X2FzeV9jYWxsYmFja3MpKT09TEFQQl9PSykKKwkJcmV0dXJuIDA7CisKKwkvKiBDbGVhbnVwICovCisJa2ZyZWUoc2wtPnhidWZmKTsKK25veGJ1ZmY6CisJa2ZyZWUoc2wtPnJidWZmKTsKK25vcmJ1ZmY6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKworLyogQ2xvc2UgdGhlIGxvdy1sZXZlbCBwYXJ0IG9mIHRoZSBYLjI1IGNoYW5uZWwuIEVhc3khICovCitzdGF0aWMgaW50IHgyNV9hc3lfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSAoc3RydWN0IHgyNV9hc3kqKShkZXYtPnByaXYpOworCWludCBlcnI7CisKKwlzcGluX2xvY2soJnNsLT5sb2NrKTsKKwlpZiAoc2wtPnR0eSkgCisJCXNsLT50dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzbC0+cmNvdW50ID0gMDsKKwlzbC0+eGxlZnQgID0gMDsKKwlpZigoZXJyPWxhcGJfdW5yZWdpc3RlcihkZXYpKSE9TEFQQl9PSykKKwkJcHJpbnRrKEtFUk5fRVJSICJ4MjVfYXN5X2Nsb3NlOiBsYXBiX3VucmVnaXN0ZXIgZXJyb3IgLSVkXG4iLGVycik7CisJc3Bpbl91bmxvY2soJnNsLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4MjVfYXN5X3JlY2VpdmVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJldHVybiA2NTUzNjsgIC8qIFdlIGNhbiBoYW5kbGUgYW4gaW5maW5pdGUgYW1vdW50IG9mIGRhdGEuIDotKSAqLworfQorCisvKgorICogSGFuZGxlIHRoZSAncmVjZWl2ZXIgZGF0YSByZWFkeScgaW50ZXJydXB0LgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlICd0dHlfaW8nIG1vZHVsZSBpbiB0aGUga2VybmVsIHdoZW4KKyAqIGEgYmxvY2sgb2YgWC4yNSBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLCB3aGljaCBjYW4gbm93IGJlIGRlY2Fwc3VsYXRlZAorICogYW5kIHNlbnQgb24gdG8gc29tZSBJUCBsYXllciBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgorICovCisgCitzdGF0aWMgdm9pZCB4MjVfYXN5X3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IChzdHJ1Y3QgeDI1X2FzeSAqKSB0dHktPmRpc2NfZGF0YTsKKworCWlmICghc2wgfHwgc2wtPm1hZ2ljICE9IFgyNV9BU1lfTUFHSUMgfHwgIW5ldGlmX3J1bm5pbmcoc2wtPmRldikpCisJCXJldHVybjsKKworCisJLyogUmVhZCB0aGUgY2hhcmFjdGVycyBvdXQgb2YgdGhlIGJ1ZmZlciAqLworCXdoaWxlIChjb3VudC0tKSB7CisJCWlmIChmcCAmJiAqZnArKykgeworCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNMRl9FUlJPUiwgJnNsLT5mbGFncykpICB7CisJCQkJc2wtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJfQorCQkJY3ArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCXgyNV9hc3lfdW5lc2Moc2wsICpjcCsrKTsKKwl9Cit9CisKKy8qCisgKiBPcGVuIHRoZSBoaWdoLWxldmVsIHBhcnQgb2YgdGhlIFguMjUgY2hhbm5lbC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBUVFkgbW9kdWxlIHdoZW4gdGhlCisgKiBYLjI1IGxpbmUgZGlzY2lwbGluZSBpcyBjYWxsZWQgZm9yLiAgQmVjYXVzZSB3ZSBhcmUKKyAqIHN1cmUgdGhlIHR0eSBsaW5lIGV4aXN0cywgd2Ugb25seSBoYXZlIHRvIGxpbmsgaXQgdG8KKyAqIGEgZnJlZSBYLjI1IGNoYW5uZWwuLi4KKyAqLworCitzdGF0aWMgaW50IHgyNV9hc3lfb3Blbl90dHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSAoc3RydWN0IHgyNV9hc3kgKikgdHR5LT5kaXNjX2RhdGE7CisJaW50IGVycjsKKworCS8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBub3QgYWxyZWFkeSBjb25uZWN0ZWQuICovCisJaWYgKHNsICYmIHNsLT5tYWdpYyA9PSBYMjVfQVNZX01BR0lDKSB7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCS8qIE9LLiAgRmluZCBhIGZyZWUgWC4yNSBjaGFubmVsIHRvIHVzZS4gKi8KKwlpZiAoKHNsID0geDI1X2FzeV9hbGxvYygpKSA9PSBOVUxMKSB7CisJCXJldHVybiAtRU5GSUxFOworCX0KKworCXNsLT50dHkgPSB0dHk7CisJdHR5LT5kaXNjX2RhdGEgPSBzbDsKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikgIHsKKwkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCX0KKwlpZiAodHR5LT5sZGlzYy5mbHVzaF9idWZmZXIpICB7CisJCXR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyKHR0eSk7CisJfQorCisJLyogUmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzICovCisJc2wtPmRldi0+dHlwZSA9IEFSUEhSRF9YMjU7CisJCisJLyogUGVyZm9ybSB0aGUgbG93LWxldmVsIFguMjUgYXN5bmMgaW5pdCAqLworCWlmICgoZXJyID0geDI1X2FzeV9vcGVuKHNsLT5kZXYpKSkKKwkJcmV0dXJuIGVycjsKKworCS8qIERvbmUuICBXZSBoYXZlIGxpbmtlZCB0aGUgVFRZIGxpbmUgdG8gYSBjaGFubmVsLiAqLworCXJldHVybiBzbC0+ZGV2LT5iYXNlX2FkZHI7Cit9CisKKworLyoKKyAqIENsb3NlIGRvd24gYW4gWC4yNSBjaGFubmVsLgorICogVGhpcyBtZWFucyBmbHVzaGluZyBvdXQgYW55IHBlbmRpbmcgcXVldWVzLCBhbmQgdGhlbiByZXN0b3JpbmcgdGhlCisgKiBUVFkgbGluZSBkaXNjaXBsaW5lIHRvIHdoYXQgaXQgd2FzIGJlZm9yZSBpdCBnb3QgaG9va2VkIHRvIFguMjUKKyAqICh3aGljaCB1c3VhbGx5IGlzIFRUWSBhZ2FpbikuCisgKi8KK3N0YXRpYyB2b2lkIHgyNV9hc3lfY2xvc2VfdHR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHgyNV9hc3kgKnNsID0gKHN0cnVjdCB4MjVfYXN5ICopIHR0eS0+ZGlzY19kYXRhOworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIGNvbm5lY3RlZC4gKi8KKwlpZiAoIXNsIHx8IHNsLT5tYWdpYyAhPSBYMjVfQVNZX01BR0lDKQorCQlyZXR1cm47CisKKwlpZiAoc2wtPmRldi0+ZmxhZ3MgJiBJRkZfVVApCisJeworCQkodm9pZCkgZGV2X2Nsb3NlKHNsLT5kZXYpOworCX0KKworCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKKwlzbC0+dHR5ID0gTlVMTDsKKwl4MjVfYXN5X2ZyZWUoc2wpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqeDI1X2FzeV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSAoc3RydWN0IHgyNV9hc3kqKShkZXYtPnByaXYpOworCisJcmV0dXJuICZzbC0+c3RhdHM7Cit9CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgkJCVNUQU5EQVJEIFguMjUgRU5DQVBTVUxBVElPTgkJICAJICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgeDI1X2FzeV9lc2ModW5zaWduZWQgY2hhciAqcywgdW5zaWduZWQgY2hhciAqZCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSBkOworCXVuc2lnbmVkIGNoYXIgYzsKKworCS8qCisJICogU2VuZCBhbiBpbml0aWFsIEVORCBjaGFyYWN0ZXIgdG8gZmx1c2ggb3V0IGFueQorCSAqIGRhdGEgdGhhdCBtYXkgaGF2ZSBhY2N1bXVsYXRlZCBpbiB0aGUgcmVjZWl2ZXIKKwkgKiBkdWUgdG8gbGluZSBub2lzZS4KKwkgKi8KKworCSpwdHIrKyA9IFgyNV9FTkQ7CS8qIFNlbmQgMTAxMTExMTAgYml0IHNlcSAqLworCisJLyoKKwkgKiBGb3IgZWFjaCBieXRlIGluIHRoZSBwYWNrZXQsIHNlbmQgdGhlIGFwcHJvcHJpYXRlCisJICogY2hhcmFjdGVyIHNlcXVlbmNlLCBhY2NvcmRpbmcgdG8gdGhlIFguMjUgcHJvdG9jb2wuCisJICovCisKKwl3aGlsZSAobGVuLS0gPiAwKSAKKwl7CisJCXN3aXRjaChjID0gKnMrKykgCisJCXsKKwkJCWNhc2UgWDI1X0VORDoKKwkJCQkqcHRyKysgPSBYMjVfRVNDOworCQkJCSpwdHIrKyA9IFgyNV9FU0NBUEUoWDI1X0VORCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFgyNV9FU0M6CisJCQkJKnB0cisrID0gWDI1X0VTQzsKKwkJCQkqcHRyKysgPSBYMjVfRVNDQVBFKFgyNV9FU0MpOworCQkJCWJyZWFrOworCQkJIGRlZmF1bHQ6CisJCQkJKnB0cisrID0gYzsKKwkJCQlicmVhazsKKwkJfQorCX0KKwkqcHRyKysgPSBYMjVfRU5EOworCXJldHVybiAocHRyIC0gZCk7Cit9CisKK3N0YXRpYyB2b2lkIHgyNV9hc3lfdW5lc2Moc3RydWN0IHgyNV9hc3kgKnNsLCB1bnNpZ25lZCBjaGFyIHMpCit7CisKKwlzd2l0Y2gocykgCisJeworCQljYXNlIFgyNV9FTkQ6CisJCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChTTEZfRVJST1IsICZzbC0+ZmxhZ3MpICYmIChzbC0+cmNvdW50ID4gMikpICAKKwkJCXsKKwkJCQl4MjVfYXN5X2J1bXAoc2wpOworCQkJfQorCQkJY2xlYXJfYml0KFNMRl9FU0NBUEUsICZzbC0+ZmxhZ3MpOworCQkJc2wtPnJjb3VudCA9IDA7CisJCQlyZXR1cm47CisKKwkJY2FzZSBYMjVfRVNDOgorCQkJc2V0X2JpdChTTEZfRVNDQVBFLCAmc2wtPmZsYWdzKTsKKwkJCXJldHVybjsKKwkJCQorCQljYXNlIFgyNV9FU0NBUEUoWDI1X0VTQyk6CisJCWNhc2UgWDI1X0VTQ0FQRShYMjVfRU5EKToKKwkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0xGX0VTQ0FQRSwgJnNsLT5mbGFncykpCisJCQkJcyA9IFgyNV9VTkVTQ0FQRShzKTsKKwkJCWJyZWFrOworCX0KKwlpZiAoIXRlc3RfYml0KFNMRl9FUlJPUiwgJnNsLT5mbGFncykpICAKKwl7CisJCWlmIChzbC0+cmNvdW50IDwgc2wtPmJ1ZmZzaXplKSAgCisJCXsKKwkJCXNsLT5yYnVmZltzbC0+cmNvdW50KytdID0gczsKKwkJCXJldHVybjsKKwkJfQorCQlzbC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJc2V0X2JpdChTTEZfRVJST1IsICZzbC0+ZmxhZ3MpOworCX0KK30KKworCisvKiBQZXJmb3JtIEkvTyBjb250cm9sIG9uIGFuIGFjdGl2ZSBYLjI1IGNoYW5uZWwuICovCitzdGF0aWMgaW50IHgyNV9hc3lfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IChzdHJ1Y3QgeDI1X2FzeSAqKSB0dHktPmRpc2NfZGF0YTsKKworCS8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuICovCisJaWYgKCFzbCB8fCBzbC0+bWFnaWMgIT0gWDI1X0FTWV9NQUdJQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR0lGTkFNRToKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIHNsLT5kZXYtPm5hbWUsCisJCQkJCXN0cmxlbihzbC0+ZGV2LT5uYW1lKSArIDEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgU0lPQ1NJRkhXQUREUjoKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogQWxsb3cgc3R0eSB0byByZWFkLCBidXQgbm90IHNldCwgdGhlIHNlcmlhbCBwb3J0ICovCisJY2FzZSBUQ0dFVFM6CisJY2FzZSBUQ0dFVEE6CisJCXJldHVybiBuX3R0eV9pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworc3RhdGljIGludCB4MjVfYXN5X29wZW5fZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHgyNV9hc3kgKnNsID0gKHN0cnVjdCB4MjVfYXN5KikoZGV2LT5wcml2KTsKKwlpZihzbC0+dHR5PT1OVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKworLyogSW5pdGlhbGlzZSB0aGUgWC4yNSBkcml2ZXIuICBDYWxsZWQgYnkgdGhlIGRldmljZSBpbml0IGNvZGUgKi8KK3N0YXRpYyB2b2lkIHgyNV9hc3lfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSBkZXYtPnByaXY7CisKKwlzbC0+bWFnaWMgID0gWDI1X0FTWV9NQUdJQzsKKwlzbC0+ZGV2CSAgID0gZGV2OworCXNwaW5fbG9ja19pbml0KCZzbC0+bG9jayk7CisJc2V0X2JpdChTTEZfSU5VU0UsICZzbC0+ZmxhZ3MpOworCisJLyoKKwkgKglGaW5pc2ggc2V0dGluZyB1cCB0aGUgREVWSUNFIGluZm8uIAorCSAqLworCSAKKwlkZXYtPm10dQkJPSBTTF9NVFU7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSB4MjVfYXN5X3htaXQ7CisJZGV2LT50eF90aW1lb3V0CQk9IHgyNV9hc3lfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gSFoqMjA7CisJZGV2LT5vcGVuCQk9IHgyNV9hc3lfb3Blbl9kZXY7CisJZGV2LT5zdG9wCQk9IHgyNV9hc3lfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMJICAgICAgICA9IHgyNV9hc3lfZ2V0X3N0YXRzOworCWRldi0+Y2hhbmdlX210dQkJPSB4MjVfYXN5X2NoYW5nZV9tdHU7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSAwOworCWRldi0+YWRkcl9sZW4JCT0gMDsKKwlkZXYtPnR5cGUJCT0gQVJQSFJEX1gyNTsKKwlkZXYtPnR4X3F1ZXVlX2xlbgk9IDEwOworCisJLyogTmV3LXN0eWxlIGZsYWdzLiAqLworCWRldi0+ZmxhZ3MJCT0gSUZGX05PQVJQOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9sZGlzYyB4MjVfbGRpc2MgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5tYWdpYwkJPSBUVFlfTERJU0NfTUFHSUMsCisJLm5hbWUJCT0gIlguMjUiLAorCS5vcGVuCQk9IHgyNV9hc3lfb3Blbl90dHksCisJLmNsb3NlCQk9IHgyNV9hc3lfY2xvc2VfdHR5LAorCS5pb2N0bAkJPSB4MjVfYXN5X2lvY3RsLAorCS5yZWNlaXZlX2J1Zgk9IHgyNV9hc3lfcmVjZWl2ZV9idWYsCisJLnJlY2VpdmVfcm9vbQk9IHgyNV9hc3lfcmVjZWl2ZV9yb29tLAorCS53cml0ZV93YWtldXAJPSB4MjVfYXN5X3dyaXRlX3dha2V1cCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfeDI1X2FzeSh2b2lkKQoreworCWlmICh4MjVfYXN5X21heGRldiA8IDQpCisJCXgyNV9hc3lfbWF4ZGV2ID0gNDsgLyogU2FuaXR5ICovCisKKwlwcmludGsoS0VSTl9JTkZPICJYLjI1IGFzeW5jOiB2ZXJzaW9uIDAuMDAgQUxQSEEgIgorCQkJIihkeW5hbWljIGNoYW5uZWxzLCBtYXg9JWQpLlxuIiwgeDI1X2FzeV9tYXhkZXYgKTsKKworCXgyNV9hc3lfZGV2cyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlICopKngyNV9hc3lfbWF4ZGV2LCAKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXgyNV9hc3lfZGV2cykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJYMjUgYXN5bmM6IENhbid0IGFsbG9jYXRlIHgyNV9hc3lfY3RybHNbXSAiCisJCQkJImFycmF5ISBVYWFyZ2ghICgtPiBObyBYLjI1IGF2YWlsYWJsZSlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHgyNV9hc3lfZGV2cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlICopKngyNV9hc3lfbWF4ZGV2KTsgCisKKwlyZXR1cm4gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fWDI1LCAmeDI1X2xkaXNjKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF94MjVfYXN5KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB4MjVfYXN5X21heGRldjsgaSsrKSB7CisJCWRldiA9IHgyNV9hc3lfZGV2c1tpXTsKKwkJaWYgKGRldikgeworCQkJc3RydWN0IHgyNV9hc3kgKnNsID0gZGV2LT5wcml2OworCisJCQlzcGluX2xvY2tfYmgoJnNsLT5sb2NrKTsKKwkJCWlmIChzbC0+dHR5KSAKKwkJCQl0dHlfaGFuZ3VwKHNsLT50dHkpOworCisJCQlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCQkJLyoKKwkJCSAqIFZTViA9IGlmIGRldi0+c3RhcnQ9PTAsIHRoZW4gZGV2aWNlCisJCQkgKiB1bnJlZ2lzdGVyZWQgd2hpbGUgY2xvc2UgcHJvYy4KKwkJCSAqLworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9CisKKwlrZnJlZSh4MjVfYXN5X2RldnMpOworCXR0eV9yZWdpc3Rlcl9sZGlzYyhOX1gyNSwgTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfeDI1X2FzeSk7Cittb2R1bGVfZXhpdChleGl0X3gyNV9hc3kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3gyNV9hc3kuaCBiL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3NzAyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmgKQEAgLTAsMCArMSw1MCBAQAorI2lmbmRlZiBfTElOVVhfWDI1X0FTWV9ICisjZGVmaW5lIF9MSU5VWF9YMjVfQVNZX0gKKworLyogWC4yNSBhc3kgY29uZmlndXJhdGlvbi4gKi8KKyNkZWZpbmUgU0xfTlJVTklUCTI1NgkJLyogTUFYIG51bWJlciBvZiBYLjI1IGNoYW5uZWxzOworCQkJCQkgICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHdpdGgKKwkJCQkJICAgaW5zbW9kIC1veDI1X2FzeV9tYXhkZXY9bm5uCSovCisjZGVmaW5lIFNMX01UVQkJMjU2CQorCisvKiBYMjUgYXN5bmMgcHJvdG9jb2wgY2hhcmFjdGVycy4gKi8KKyNkZWZpbmUgWDI1X0VORCAgICAgICAgIDB4N0UJCS8qIGluZGljYXRlcyBlbmQgb2YgZnJhbWUJKi8KKyNkZWZpbmUgWDI1X0VTQyAgICAgICAgIDB4N0QJCS8qIGluZGljYXRlcyBieXRlIHN0dWZmaW5nCSovCisjZGVmaW5lIFgyNV9FU0NBUEUoeCkJKCh4KV4weDIwKQorI2RlZmluZSBYMjVfVU5FU0NBUEUoeCkJKCh4KV4weDIwKQorCisKK3N0cnVjdCB4MjVfYXN5IHsKKyAgaW50CQkJbWFnaWM7CisKKyAgLyogVmFyaW91cyBmaWVsZHMuICovCisgIHNwaW5sb2NrX3QJCWxvY2s7CisgIHN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CQkvKiBwdHIgdG8gVFRZIHN0cnVjdHVyZQkJKi8KKyAgc3RydWN0IG5ldF9kZXZpY2UJKmRldjsJCS8qIGVhc3kgZm9yIGludHIgaGFuZGxpbmcJKi8KKworICAvKiBUaGVzZSBhcmUgcG9pbnRlcnMgdG8gdGhlIG1hbGxvYygpZWQgZnJhbWUgYnVmZmVycy4gKi8KKyAgdW5zaWduZWQgY2hhcgkJKnJidWZmOwkJLyogcmVjZWl2ZXIgYnVmZmVyCQkqLworICBpbnQgICAgICAgICAgICAgICAgICAgcmNvdW50OyAgICAgICAgIC8qIHJlY2VpdmVkIGNoYXJzIGNvdW50ZXIgICAgICAgKi8KKyAgdW5zaWduZWQgY2hhcgkJKnhidWZmOwkJLyogdHJhbnNtaXR0ZXIgYnVmZmVyCQkqLworICB1bnNpZ25lZCBjaGFyICAgICAgICAgKnhoZWFkOyAgICAgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBieXRlIHRvIFhNSVQgKi8KKyAgaW50ICAgICAgICAgICAgICAgICAgIHhsZWZ0OyAgICAgICAgICAvKiBieXRlcyBsZWZ0IGluIFhNSVQgcXVldWUgICAgICovCisKKyAgLyogWC4yNSBpbnRlcmZhY2Ugc3RhdGlzdGljcy4gKi8KKyAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKyAgaW50ICAgICAgICAgICAgICAgICAgIGJ1ZmZzaXplOyAgICAgICAvKiBNYXggYnVmZmVycyBzaXplcyAgICAgICAgICAgICovCisKKyAgdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBGbGFnIHZhbHVlcy8gbW9kZSBldGMJKi8KKyNkZWZpbmUgU0xGX0lOVVNFCTAJCS8qIENoYW5uZWwgaW4gdXNlICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0xGX0VTQ0FQRQkxICAgICAgICAgICAgICAgLyogRVNDIHJlY2VpdmVkICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTTEZfRVJST1IJMiAgICAgICAgICAgICAgIC8qIFBhcml0eSwgZXRjLiBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgU0xGX09VVFdBSVQJNAkJLyogV2FpdGluZyBmb3Igb3V0cHV0CQkqLworfTsKKworCisKKyNkZWZpbmUgWDI1X0FTWV9NQUdJQyAweDUzMDMKKworZXh0ZXJuIGludCB4MjVfYXN5X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNlbmRpZgkvKiBfTElOVVhfWDI1X0FTWS5IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vejg1MjMwLmMgYi9kcml2ZXJzL25ldC93YW4vejg1MjMwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhNDhmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuYwpAQCAtMCwwICsxLDE4NTEgQEAKKy8qCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5OCBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgorICoJKGMpIENvcHlyaWdodCAyMDAwLCAyMDAxIFJlZCBIYXQgSW5jCisgKgorICoJRGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIgd2FzIGZ1bmRlZCBieSBFcXVpaW5ldCBMdGQKKyAqCQkJaHR0cDovL3d3dy5lcXVpaW5ldC5jb20KKyAqCisgKglDaGFuZ2VMb2c6CisgKgorICoJQXN5bmNocm9ub3VzIG1vZGUgZHJvcHBlZCBmb3IgMi4yLiBGb3IgMi41IHdlIHdpbGwgYXR0ZW1wdCB0aGUKKyAqCXVuaWZpY2F0aW9uIG9mIGFsbCB0aGUgWjg1eDMwIGFzeW5jaHJvbm91cyBkcml2ZXJzIGZvciByZWFsLgorICoKKyAqCURNQSBub3cgdXNlcyBnZXRfZnJlZV9wYWdlIGFzIGttYWxsb2MgYnVmZmVycyBtYXkgc3BhbiBhIDY0SyAKKyAqCWJvdW5kYXJ5LgorICoKKyAqCU1vZGlmaWVkIGZvciBTTVAgc2FmZXR5IGFuZCBTTVAgbG9ja2luZyBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqCVBlcmZvcm1hbmNlCisgKgorICoJWjg1MjMwOgorICoJTm9uIERNQSB5b3Ugd2FudCBhIDQ4NkRYNTAgb3IgYmV0dGVyIHRvIGRvIDY0S2JpdHMuIDk2MDAgYmF1ZAorICoJWC4yNSBpcyBub3QgdW5yZWFsaXN0aWMgb24gYWxsIG1hY2hpbmVzLiBETUEgbW9kZSBjYW4gaW4gdGhlb3J5CisgKgloYW5kbGUgVDEvRTEgcXVpdGUgbmljZWx5LiBJbiBwcmFjdGljZSB0aGUgbGltaXQgc2VlbXMgdG8gYmUgYWJvdXQKKyAqCTUxMktiaXQtPjFNYml0IGRlcGVuZGluZyBvbiBtb3RoZXJib2FyZC4KKyAqCisgKglaODVDMzA6CisgKgk2NEsgd2lsbCB0YWtlIERNQSwgOTYwMCBiYXVkIFguMjUgc2hvdWxkIGJlIG9rLgorICoKKyAqCVo4NTMwOgorICoJU3luY2hyb25vdXMgbW9kZSB3aXRob3V0IERNQSBpcyB1bmxpa2VseSB0byBwYXNzIGFib3V0IDI0MDAgYmF1ZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjZGVmaW5lIFJUX0xPQ0sKKyNkZWZpbmUgUlRfVU5MT0NLCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPG5ldC9zeW5jcHBwLmg+CisjaW5jbHVkZSAiejg1MjMwLmgiCisKKworLyoqCisgKgl6ODUzMF9yZWFkX3BvcnQgLSBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW50ZXJmYWNlIGZ1bmN0aW9uCisgKglAcDogcG9ydCB0byByZWFkCisgKgorICoJUHJvdmlkZWQgcG9ydCBhY2Nlc3MgbWV0aG9kcy4gVGhlIENvbXRyb2wgU1YxMSByZXF1aXJlcyBubyBkZWxheXMKKyAqCWJldHdlZW4gYWNjZXNzZXMgYW5kIHVzZXMgUEMgSS9PLiBTb21lIGRyaXZlcnMgbWF5IG5lZWQgYSA1dVMgZGVsYXkKKyAqCQorICoJSW4gdGhlIGxvbmdlciB0ZXJtIHRoaXMgc2hvdWxkIGJlY29tZSBhbiBhcmNoaXRlY3R1cmUgc3BlY2lmaWMKKyAqCXNlY3Rpb24gc28gdGhhdCB0aGlzIGNhbiBiZWNvbWUgYSBnZW5lcmljIGRyaXZlciBpbnRlcmZhY2UgZm9yIGFsbAorICoJcGxhdGZvcm1zLiBGb3Igbm93IHdlIG9ubHkgaGFuZGxlIFBDIEkvTyBwb3J0cyB3aXRoIG9yIHdpdGhvdXQgdGhlCisgKglkcmVhZCA1dVMgc2FuaXR5IGRlbGF5LgorICoKKyAqCVRoZSBjYWxsZXIgbXVzdCBob2xkIHN1ZmZpY2llbnQgbG9ja3MgdG8gYXZvaWQgdmlvbGF0aW5nIHRoZSBob3JyaWJsZQorICoJNXVTIGRlbGF5IHJ1bGUuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgejg1MzBfcmVhZF9wb3J0KHVuc2lnbmVkIGxvbmcgcCkKK3sKKwl1OCByPWluYihaODUzMF9QT1JUX09GKHApKTsKKwlpZihwJlo4NTMwX1BPUlRfU0xFRVApCS8qIGdjYyBzaG91bGQgZmlndXJlIHRoaXMgb3V0IGVmZmljaWVudGx5ICEgKi8KKwkJdWRlbGF5KDUpOworCXJldHVybiByOworfQorCisvKioKKyAqCXo4NTMwX3dyaXRlX3BvcnQgLSBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW50ZXJmYWNlIGZ1bmN0aW9uCisgKglAcDogcG9ydCB0byB3cml0ZQorICoJQGQ6IHZhbHVlIHRvIHdyaXRlCisgKgorICoJV3JpdGUgYSB2YWx1ZSB0byBhIHBvcnQgd2l0aCBkZWxheXMgaWYgbmVlZCBiZS4gTm90ZSB0aGF0IHRoZQorICoJY2FsbGVyIG11c3QgaG9sZCBsb2NrcyB0byBhdm9pZCByZWFkL3dyaXRlcyBmcm9tIG90aGVyIGNvbnRleHRzCisgKgl2aW9sYXRpbmcgdGhlIDV1UyBydWxlCisgKgorICoJSW4gdGhlIGxvbmdlciB0ZXJtIHRoaXMgc2hvdWxkIGJlY29tZSBhbiBhcmNoaXRlY3R1cmUgc3BlY2lmaWMKKyAqCXNlY3Rpb24gc28gdGhhdCB0aGlzIGNhbiBiZWNvbWUgYSBnZW5lcmljIGRyaXZlciBpbnRlcmZhY2UgZm9yIGFsbAorICoJcGxhdGZvcm1zLiBGb3Igbm93IHdlIG9ubHkgaGFuZGxlIFBDIEkvTyBwb3J0cyB3aXRoIG9yIHdpdGhvdXQgdGhlCisgKglkcmVhZCA1dVMgc2FuaXR5IGRlbGF5LgorICovCisKKworc3RhdGljIGlubGluZSB2b2lkIHo4NTMwX3dyaXRlX3BvcnQodW5zaWduZWQgbG9uZyBwLCB1OCBkKQoreworCW91dGIoZCxaODUzMF9QT1JUX09GKHApKTsKKwlpZihwJlo4NTMwX1BPUlRfU0xFRVApCisJCXVkZWxheSg1KTsKK30KKworCisKK3N0YXRpYyB2b2lkIHo4NTMwX3J4X2RvbmUoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpOworc3RhdGljIHZvaWQgejg1MzBfdHhfZG9uZShzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYyk7CisKKworLyoqCisgKglyZWFkX3pzcmVnIC0gUmVhZCBhIHJlZ2lzdGVyIGZyb20gYSBaODUyMzAgCisgKglAYzogWjg1MzAgY2hhbm5lbCB0byByZWFkIGZyb20gKDIgcGVyIGNoaXApCisgKglAcmVnOiBSZWdpc3RlciB0byByZWFkCisgKglGSVhNRTogVXNlIGEgc3BpbmxvY2suCisgKgkKKyAqCU1vc3Qgb2YgdGhlIFo4NTMwIHJlZ2lzdGVycyBhcmUgaW5kZXhlZCBvZmYgdGhlIGNvbnRyb2wgcmVnaXN0ZXJzLgorICoJQSByZWFkIGlzIGRvbmUgYnkgd3JpdGluZyB0byB0aGUgY29udHJvbCByZWdpc3RlciBhbmQgcmVhZGluZyB0aGUKKyAqCXJlZ2lzdGVyIGJhY2suICBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgbG9jaworICovCisgCitzdGF0aWMgaW5saW5lIHU4IHJlYWRfenNyZWcoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMsIHU4IHJlZykKK3sKKwlpZihyZWcpCisJCXo4NTMwX3dyaXRlX3BvcnQoYy0+Y3RybGlvLCByZWcpOworCXJldHVybiB6ODUzMF9yZWFkX3BvcnQoYy0+Y3RybGlvKTsKK30KKworLyoqCisgKglyZWFkX3pzZGF0YSAtIFJlYWQgdGhlIGRhdGEgcG9ydCBvZiBhIFo4NTMwIGNoYW5uZWwKKyAqCUBjOiBUaGUgWjg1MzAgY2hhbm5lbCB0byByZWFkIHRoZSBkYXRhIHBvcnQgZnJvbQorICoKKyAqCVRoZSBkYXRhIHBvcnQgcHJvdmlkZXMgZmFzdCBhY2Nlc3MgdG8gc29tZSB0aGluZ3MuIFdlIHN0aWxsCisgKgloYXZlIGFsbCB0aGUgNXVTIGRlbGF5cyB0byB3b3JyeSBhYm91dC4KKyAqLworCitzdGF0aWMgaW5saW5lIHU4IHJlYWRfenNkYXRhKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXU4IHI7CisJcj16ODUzMF9yZWFkX3BvcnQoYy0+ZGF0YWlvKTsKKwlyZXR1cm4gcjsKK30KKworLyoqCisgKgl3cml0ZV96c3JlZyAtIFdyaXRlIHRvIGEgWjg1MzAgY2hhbm5lbCByZWdpc3RlcgorICoJQGM6IFRoZSBaODUzMCBjaGFubmVsCisgKglAcmVnOiBSZWdpc3RlciBudW1iZXIKKyAqCUB2YWw6IFZhbHVlIHRvIHdyaXRlCisgKgorICoJV3JpdGUgYSB2YWx1ZSB0byBhbiBpbmRleGVkIHJlZ2lzdGVyLiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgbG9jaworICoJdG8gaG9ub3VyIHRoZSBpcnJpdGF0aW5nIGRlbGF5IHJ1bGVzLiBXZSBrbm93IGFib3V0IHJlZ2lzdGVyIDAKKyAqCWJlaW5nIGZhc3QgdG8gYWNjZXNzLgorICoKKyAqICAgICAgQXNzdW1lcyBjLT5sb2NrIGlzIGhlbGQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV96c3JlZyhzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgdTggcmVnLCB1OCB2YWwpCit7CisJaWYocmVnKQorCQl6ODUzMF93cml0ZV9wb3J0KGMtPmN0cmxpbywgcmVnKTsKKwl6ODUzMF93cml0ZV9wb3J0KGMtPmN0cmxpbywgdmFsKTsKKworfQorCisvKioKKyAqCXdyaXRlX3pzY3RybCAtIFdyaXRlIHRvIGEgWjg1MzAgY29udHJvbCByZWdpc3RlcgorICoJQGM6IFRoZSBaODUzMCBjaGFubmVsCisgKglAdmFsOiBWYWx1ZSB0byB3cml0ZQorICoKKyAqCVdyaXRlIGRpcmVjdGx5IHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyIG9uIHRoZSBaODUzMAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV96c2N0cmwoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMsIHU4IHZhbCkKK3sKKwl6ODUzMF93cml0ZV9wb3J0KGMtPmN0cmxpbywgdmFsKTsKK30KKworLyoqCisgKgl3cml0ZV96c2RhdGEgLSBXcml0ZSB0byBhIFo4NTMwIGNvbnRyb2wgcmVnaXN0ZXIKKyAqCUBjOiBUaGUgWjg1MzAgY2hhbm5lbAorICoJQHZhbDogVmFsdWUgdG8gd3JpdGUKKyAqCisgKglXcml0ZSBkaXJlY3RseSB0byB0aGUgZGF0YSByZWdpc3RlciBvbiB0aGUgWjg1MzAKKyAqLworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV96c2RhdGEoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMsIHU4IHZhbCkKK3sKKwl6ODUzMF93cml0ZV9wb3J0KGMtPmRhdGFpbywgdmFsKTsKK30KKworLyoKKyAqCVJlZ2lzdGVyIGxvYWRpbmcgcGFyYW1ldGVycyBmb3IgYSBkZWFkIHBvcnQKKyAqLworIAordTggejg1MzBfZGVhZF9wb3J0W109Cit7CisJMjU1Cit9OworCitFWFBPUlRfU1lNQk9MKHo4NTMwX2RlYWRfcG9ydCk7CisKKy8qCisgKglSZWdpc3RlciBsb2FkaW5nIHBhcmFtZXRlcnMgZm9yIGN1cnJlbnRseSBzdXBwb3J0ZWQgY2lyY3VpdCB0eXBlcworICovCisKKworLyoKKyAqCURhdGEgY2xvY2tlZCBieSB0ZWxjbyBlbmQuIFRoaXMgaXMgdGhlIGNvcnJlY3QgZGF0YSBmb3IgdGhlIFVLCisgKgkia2lsb3N0cmVhbSIgc2VydmljZSwgYW5kIG1vc3Qgb3RoZXIgc2ltaWxhciBzZXJ2aWNlcy4KKyAqLworIAordTggejg1MzBfaGRsY19raWxvc3RyZWFtW109Cit7CisJNCwJU1lOQ19FTkFCfFNETEN8WDFDTEssCisJMiwJMCwJLyogTm8gdmVjdG9yICovCisJMSwJMCwKKwkzLAlFTlRfSE18UnhDUkNfRU5BQnxSeDgsCisJNSwJVHhDUkNfRU5BQnxSVFN8VHhFTkFCfFR4OHxEVFIsCisJOSwJMCwJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCTYsCTB4RkYsCisJNywJRkxBRywKKwkxMCwJQUJVTkRFUnxOUlp8Q1JDUFMsLypNQVJLSURMRSA/PyovCisJMTEsCVRDVFJ4Q1AsCisJMTQsCURJU0RQTEwsCisJMTUsCURDRElFfFNZTkNJRXxDVFNJRXxUeFVJRXxCUktJRSwKKwkxLAlFWFRfSU5UX0VOQUJ8VHhJTlRfRU5BQnxJTlRfQUxMX1J4LAorCTksCU5WfE1JRXxOT1JFU0VULAorCTI1NQorfTsKKworRVhQT1JUX1NZTUJPTCh6ODUzMF9oZGxjX2tpbG9zdHJlYW0pOworCisvKgorICoJQXMgYWJvdmUgYnV0IGZvciBlbmhhbmNlZCBjaGlwcy4KKyAqLworIAordTggejg1MzBfaGRsY19raWxvc3RyZWFtXzg1MjMwW109Cit7CisJNCwJU1lOQ19FTkFCfFNETEN8WDFDTEssCisJMiwJMCwJLyogTm8gdmVjdG9yICovCisJMSwJMCwKKwkzLAlFTlRfSE18UnhDUkNfRU5BQnxSeDgsCisJNSwJVHhDUkNfRU5BQnxSVFN8VHhFTkFCfFR4OHxEVFIsCisJOSwJMCwJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCTYsCTB4RkYsCisJNywJRkxBRywKKwkxMCwJQUJVTkRFUnxOUlp8Q1JDUFMsCS8qIE1BUktJRExFPz8gKi8KKwkxMSwJVENUUnhDUCwKKwkxNCwJRElTRFBMTCwKKwkxNSwJRENESUV8U1lOQ0lFfENUU0lFfFR4VUlFfEJSS0lFLAorCTEsCUVYVF9JTlRfRU5BQnxUeElOVF9FTkFCfElOVF9BTExfUngsCisJOSwJTlZ8TUlFfE5PUkVTRVQsCisJMjMsCTMsCQkvKiBFeHRlbmRlZCBtb2RlIEFVVE8gVFggYW5kIEVPTSovCisJCisJMjU1Cit9OworCitFWFBPUlRfU1lNQk9MKHo4NTMwX2hkbGNfa2lsb3N0cmVhbV84NTIzMCk7CisKKy8qKgorICoJejg1MzBfZmx1c2hfZmlmbyAtIEZsdXNoIG9uIGNoaXAgUlggRklGTworICoJQGM6IENoYW5uZWwgdG8gZmx1c2gKKyAqCisgKglGbHVzaCB0aGUgcmVjZWl2ZSBGSUZPLiBUaGVyZSBpcyBubyBzcGVjaWZpYyBvcHRpb24gZm9yIHRoaXMsIHdlIAorICoJYmxpbmRseSByZWFkIGJ5dGVzIGFuZCBkaXNjYXJkIHRoZW0uIFJlYWRpbmcgd2hlbiB0aGVyZSBpcyBubyBkYXRhCisgKglpcyBoYXJtbGVzcy4gVGhlIDg1MzAgaGFzIGEgNCBieXRlIEZJRk8sIHRoZSA4NTIzMCBoYXMgOCBieXRlcy4KKyAqCQorICoJQWxsIGxvY2tpbmcgaXMgaGFuZGxlZCBmb3IgdGhlIGNhbGxlci4gT24gcmV0dXJuIGRhdGEgbWF5IHN0aWxsIGJlCisgKglwcmVzZW50IGlmIGl0IGFycml2ZWQgZHVyaW5nIHRoZSBmbHVzaC4KKyAqLworIAorc3RhdGljIHZvaWQgejg1MzBfZmx1c2hfZmlmbyhzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYykKK3sKKwlyZWFkX3pzcmVnKGMsIFIxKTsKKwlyZWFkX3pzcmVnKGMsIFIxKTsKKwlyZWFkX3pzcmVnKGMsIFIxKTsKKwlyZWFkX3pzcmVnKGMsIFIxKTsKKwlpZihjLT5kZXYtPnR5cGU9PVo4NTIzMCkKKwl7CisJCXJlYWRfenNyZWcoYywgUjEpOworCQlyZWFkX3pzcmVnKGMsIFIxKTsKKwkJcmVhZF96c3JlZyhjLCBSMSk7CisJCXJlYWRfenNyZWcoYywgUjEpOworCX0KK30JCisKKy8qKgorICoJejg1MzBfcnRzZHRyIC0gQ29udHJvbCB0aGUgb3V0Z29pbmcgRFRTL1JUUyBsaW5lCisgKglAYzogVGhlIFo4NTMwIGNoYW5uZWwgdG8gY29udHJvbDsKKyAqCUBzZXQ6IDEgdG8gc2V0LCAwIHRvIGNsZWFyCisgKgorICoJU2V0cyBvciBjbGVhcnMgRFRSL1JUUyBvbiB0aGUgcmVxdWVzdGVkIGxpbmUuIEFsbCBsb2NraW5nIGlzIGhhbmRsZWQKKyAqCWJ5IHRoZSBjYWxsZXIuIEZvciBub3cgd2UgYXNzdW1lIGFsbCBib2FyZHMgdXNlIHRoZSBhY3R1YWwgUlRTL0RUUgorICoJb24gdGhlIGNoaXAuIEFwcGFyZW50bHkgb25lIG9yIHR3byBkb24ndC4gV2UnbGwgc2NyZWFtIGFib3V0IHRoZW0KKyAqCWxhdGVyLgorICovCisKK3N0YXRpYyB2b2lkIHo4NTMwX3J0c2R0cihzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgaW50IHNldCkKK3sKKwlpZiAoc2V0KQorCQljLT5yZWdzWzVdIHw9IChSVFMgfCBEVFIpOworCWVsc2UKKwkJYy0+cmVnc1s1XSAmPSB+KFJUUyB8IERUUik7CisJd3JpdGVfenNyZWcoYywgUjUsIGMtPnJlZ3NbNV0pOworfQorCisvKioKKyAqCXo4NTMwX3J4IC0gSGFuZGxlIGEgUElPIHJlY2VpdmUgZXZlbnQKKyAqCUBjOiBaODUzMCBjaGFubmVsIHRvIHByb2Nlc3MKKyAqCisgKglSZWNlaXZlIGhhbmRsZXIgZm9yIHJlY2VpdmluZyBpbiBQSU8gbW9kZS4gVGhpcyBpcyBtdWNoIGxpa2UgdGhlIAorICoJYXN5bmMgb25lIGJ1dCBub3QgcXVpdGUgdGhlIHNhbWUgb3IgYXMgY29tcGxleAorICoKKyAqCU5vdGU6IEl0cyBpbnRlbmRlZCB0aGF0IHRoaXMgaGFuZGxlciBjYW4gZWFzaWx5IGJlIHNlcGFyYXRlZCBmcm9tCisgKgl0aGUgbWFpbiBjb2RlIHRvIHJ1biByZWFsdGltZS4gVGhhdCdsbCBiZSBuZWVkZWQgZm9yIHNvbWUgbWFjaGluZXMKKyAqCShlZyB0byBldmVyIGNsb2NrIDY0a2JpdHMgb24gYSBzcGFyYyA7KSkuCisgKgorICoJVGhlIFJUX0xPQ0sgbWFjcm9zIGRvbid0IGRvIGFueXRoaW5nIG5vdy4gS2VlcCB0aGUgY29kZSBjb3ZlcmVkCisgKglieSB0aGVtIGFzIHNob3J0IGFzIHBvc3NpYmxlIGluIGFsbCBjaXJjdW1zdGFuY2VzIC0gY2xvY2tzIGNvc3QKKyAqCWJhdWQuIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGF0b21pYyB3LnIudC4gdG8KKyAqCW90aGVyIGNvZGUgLSB0aGlzIGlzIHRydWUgaW4gdGhlIFJUIGNhc2UgdG9vLgorICoKKyAqCVdlIG9ubHkgY292ZXIgdGhlIHN5bmMgY2FzZXMgZm9yIHRoaXMuIElmIHlvdSB3YW50IDJNYml0IGFzeW5jCisgKglkbyBpdCB5b3Vyc2VsZiBidXQgY29uc2lkZXIgbWVkaWNhbCBhc3Npc3RhbmNlIGZpcnN0LiBUaGlzIG5vbiBETUEgCisgKglzeW5jaHJvbm91cyBtb2RlIGlzIHBvcnRhYmxlIGNvZGUuIFRoZSBETUEgbW9kZSBhc3N1bWVzIFBDSSBsaWtlIAorICoJSVNBIERNQQorICoKKyAqCUNhbGxlZCB3aXRoIHRoZSBkZXZpY2UgbG9jayBoZWxkCisgKi8KKyAKK3N0YXRpYyB2b2lkIHo4NTMwX3J4KHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXU4IGNoLHN0YXQ7CisJc3Bpbl9sb2NrKGMtPmxvY2spOworIAorCXdoaWxlKDEpCisJeworCQkvKiBGSUZPIGVtcHR5ID8gKi8KKwkJaWYoIShyZWFkX3pzcmVnKGMsIFIwKSYxKSkKKwkJCWJyZWFrOworCQljaD1yZWFkX3pzZGF0YShjKTsKKwkJc3RhdD1yZWFkX3pzcmVnKGMsIFIxKTsKKwkKKwkJLyoKKwkJICoJT3ZlcnJ1biA/CisJCSAqLworCQlpZihjLT5jb3VudCA8IGMtPm1heCkKKwkJeworCQkJKmMtPmRwdHIrKz1jaDsKKwkJCWMtPmNvdW50Kys7CisJCX0KKworCQlpZihzdGF0JkVORF9GUikKKwkJeworCQkKKwkJCS8qCisJCQkgKglFcnJvciA/CisJCQkgKi8KKwkJCWlmKHN0YXQmKFJ4X09WUnxDUkNfRVJSKSkKKwkJCXsKKwkJCQkvKiBSZXdpbmQgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuICovCisJCQkJaWYoYy0+c2tiKQorCQkJCQljLT5kcHRyPWMtPnNrYi0+ZGF0YTsKKwkJCQljLT5jb3VudD0wOworCQkJCWlmKHN0YXQmUnhfT1ZSKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG92ZXJydW5cbiIsIGMtPmRldi0+bmFtZSk7CisJCQkJCWMtPnJ4X292ZXJydW4rKzsKKwkJCQl9CisJCQkJaWYoc3RhdCZDUkNfRVJSKQorCQkJCXsKKwkJCQkJYy0+cnhfY3JjX2VycisrOworCQkJCQkvKiBwcmludGsoImNyYyBlcnJvclxuIik7ICovCisJCQkJfQorCQkJCS8qIFNob3ZlIHRoZSBmcmFtZSB1cHN0cmVhbSAqLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qCisJCQkJICoJRHJvcCB0aGUgbG9jayBmb3IgUlggcHJvY2Vzc2luZywgb3IKKwkJIAkJICoJdGhlcmUgYXJlIGRlYWRsb2NrcworCQkgCQkgKi8KKwkJCQl6ODUzMF9yeF9kb25lKGMpOworCQkJCXdyaXRlX3pzY3RybChjLCBSRVNfUnhfQ1JDKTsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqCUNsZWFyIGlycQorCSAqLworCXdyaXRlX3pzY3RybChjLCBFUlJfUkVTKTsKKwl3cml0ZV96c2N0cmwoYywgUkVTX0hfSVVTKTsKKwlzcGluX3VubG9jayhjLT5sb2NrKTsKK30KKworCisvKioKKyAqCXo4NTMwX3R4IC0gSGFuZGxlIGEgUElPIHRyYW5zbWl0IGV2ZW50CisgKglAYzogWjg1MzAgY2hhbm5lbCB0byBwcm9jZXNzCisgKgorICoJWjg1MzAgdHJhbnNtaXQgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBQSU8gbW9kZS4gVGhlIGJhc2ljCisgKglpZGVhIGlzIHRvIGF0dGVtcHQgdG8ga2VlcCB0aGUgRklGTyBmZWQuIFdlIGZpbGwgYXMgbWFueSBieXRlcworICoJaW4gYXMgcG9zc2libGUsIGl0cyBxdWl0ZSBwb3NzaWJsZSB0aGF0IHdlIHdvbid0IGtlZXAgdXAgd2l0aCB0aGUKKyAqCWRhdGEgcmF0ZSBvdGhlcndpc2UuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHo4NTMwX3R4KHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXNwaW5fbG9jayhjLT5sb2NrKTsKKwl3aGlsZShjLT50eGNvdW50KSB7CisJCS8qIEZJRk8gZnVsbCA/ICovCisJCWlmKCEocmVhZF96c3JlZyhjLCBSMCkmNCkpCisJCQlicmVhazsKKwkJYy0+dHhjb3VudC0tOworCQkvKgorCQkgKglTaG92ZWwgb3V0IHRoZSBieXRlCisJCSAqLworCQl3cml0ZV96c3JlZyhjLCBSOCwgKmMtPnR4X3B0cisrKTsKKwkJd3JpdGVfenNjdHJsKGMsIFJFU19IX0lVUyk7CisJCS8qIFdlIGFyZSBhYm91dCB0byB1bmRlcmZsb3cgKi8KKwkJaWYoYy0+dHhjb3VudD09MCkKKwkJeworCQkJd3JpdGVfenNjdHJsKGMsIFJFU19FT01fTCk7CisJCQl3cml0ZV96c3JlZyhjLCBSMTAsIGMtPnJlZ3NbMTBdJn5BQlVOREVSKTsKKwkJfQorCX0KKworCQorCS8qCisJICoJRW5kIG9mIGZyYW1lIFRYIC0gZmlyZSBhbm90aGVyIG9uZQorCSAqLworCSAKKwl3cml0ZV96c2N0cmwoYywgUkVTX1R4X1ApOworCisJejg1MzBfdHhfZG9uZShjKTsJIAorCXdyaXRlX3pzY3RybChjLCBSRVNfSF9JVVMpOworCXNwaW5fdW5sb2NrKGMtPmxvY2spOworfQorCisvKioKKyAqCXo4NTMwX3N0YXR1cyAtIEhhbmRsZSBhIFBJTyBzdGF0dXMgZXhjZXB0aW9uCisgKglAY2hhbjogWjg1MzAgY2hhbm5lbCB0byBwcm9jZXNzCisgKgorICoJQSBzdGF0dXMgZXZlbnQgb2NjdXJyZWQgaW4gUElPIHN5bmNocm9ub3VzIG1vZGUuIFRoZXJlIGFyZSBzZXZlcmFsCisgKglyZWFzb25zIHRoZSBjaGlwIHdpbGwgYm90aGVyIHVzIGhlcmUuIEEgdHJhbnNtaXQgdW5kZXJydW4gbWVhbnMgd2UKKyAqCWZhaWxlZCB0byBmZWVkIHRoZSBjaGlwIGZhc3QgZW5vdWdoIGFuZCBqdXN0IGJyb2tlIGEgcGFja2V0LiBBIERDRAorICoJY2hhbmdlIGlzIGEgbGluZSB1cCBvciBkb3duLiBXZSBjb21tdW5pY2F0ZSB0aGF0IGJhY2sgdG8gdGhlIHByb3RvY29sCisgKglsYXllciBmb3Igc3luY2hyb25vdXMgUFBQIHRvIHJlbmVnb3RpYXRlLgorICovCisKK3N0YXRpYyB2b2lkIHo4NTMwX3N0YXR1cyhzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqY2hhbikKK3sKKwl1OCBzdGF0dXMsIGFsdGVyZWQ7CisKKwlzcGluX2xvY2soY2hhbi0+bG9jayk7CisJc3RhdHVzPXJlYWRfenNyZWcoY2hhbiwgUjApOworCWFsdGVyZWQ9Y2hhbi0+c3RhdHVzXnN0YXR1czsKKwkKKwljaGFuLT5zdGF0dXM9c3RhdHVzOworCQorCWlmKHN0YXR1cyZUeEVPTSkKKwl7CisvKgkJcHJpbnRrKCIlczogVHggdW5kZXJydW4uXG4iLCBjaGFuLT5kZXYtPm5hbWUpOyAqLworCQljaGFuLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQl3cml0ZV96c2N0cmwoY2hhbiwgRVJSX1JFUyk7CisJCXo4NTMwX3R4X2RvbmUoY2hhbik7CisJfQorCQkKKwlpZihhbHRlcmVkJmNoYW4tPmRjZGNoZWNrKQorCXsKKwkJaWYoc3RhdHVzJmNoYW4tPmRjZGNoZWNrKQorCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRENEIHJhaXNlZFxuIiwgY2hhbi0+ZGV2LT5uYW1lKTsKKwkJCXdyaXRlX3pzcmVnKGNoYW4sIFIzLCBjaGFuLT5yZWdzWzNdfFJ4RU5BQkxFKTsKKwkJCWlmKGNoYW4tPm5ldGRldmljZSAmJgorCQkJICAgICgoY2hhbi0+bmV0ZGV2aWNlLT50eXBlID09IEFSUEhSRF9IRExDKSB8fAorCQkJICAgIChjaGFuLT5uZXRkZXZpY2UtPnR5cGUgPT0gQVJQSFJEX1BQUCkpKQorCQkJCXNwcHBfcmVvcGVuKGNoYW4tPm5ldGRldmljZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRENEIGxvc3RcbiIsIGNoYW4tPmRldi0+bmFtZSk7CisJCQl3cml0ZV96c3JlZyhjaGFuLCBSMywgY2hhbi0+cmVnc1szXSZ+UnhFTkFCTEUpOworCQkJejg1MzBfZmx1c2hfZmlmbyhjaGFuKTsKKwkJfQorCQkKKwl9CQorCXdyaXRlX3pzY3RybChjaGFuLCBSRVNfRVhUX0lOVCk7CisJd3JpdGVfenNjdHJsKGNoYW4sIFJFU19IX0lVUyk7CisJc3Bpbl91bmxvY2soY2hhbi0+bG9jayk7Cit9CisKK3N0cnVjdCB6ODUzMF9pcnFoYW5kbGVyIHo4NTMwX3N5bmM9Cit7CisJejg1MzBfcngsCisJejg1MzBfdHgsCisJejg1MzBfc3RhdHVzCit9OworCitFWFBPUlRfU1lNQk9MKHo4NTMwX3N5bmMpOworCisvKioKKyAqCXo4NTMwX2RtYV9yeCAtIEhhbmRsZSBhIERNQSBSWCBldmVudAorICoJQGNoYW46IENoYW5uZWwgdG8gaGFuZGxlCisgKgorICoJTm9uIGJ1cyBtYXN0ZXJpbmcgRE1BIGludGVyZmFjZXMgZm9yIHRoZSBaOHgzMCBkZXZpY2VzLiBUaGlzCisgKglpcyByZWFsbHkgcHJldHR5IFBDIHNwZWNpZmljLiBUaGUgRE1BIG1vZGUgbWVhbnMgdGhhdCBtb3N0IHJlY2VpdmUKKyAqCWV2ZW50cyBhcmUgaGFuZGxlZCBieSB0aGUgRE1BIGhhcmR3YXJlLiBXZSBnZXQgYSBraWNrIGhlcmUgb25seSBpZgorICoJYSBmcmFtZSBlbmRlZC4KKyAqLworIAorc3RhdGljIHZvaWQgejg1MzBfZG1hX3J4KHN0cnVjdCB6ODUzMF9jaGFubmVsICpjaGFuKQoreworCXNwaW5fbG9jayhjaGFuLT5sb2NrKTsKKwlpZihjaGFuLT5yeGRtYV9vbikKKwl7CisJCS8qIFNwZWNpYWwgY29uZGl0aW9uIGNoZWNrIG9ubHkgKi8KKwkJdTggc3RhdHVzOworCQorCQlyZWFkX3pzcmVnKGNoYW4sIFI3KTsKKwkJcmVhZF96c3JlZyhjaGFuLCBSNik7CisJCQorCQlzdGF0dXM9cmVhZF96c3JlZyhjaGFuLCBSMSk7CisJCisJCWlmKHN0YXR1cyZFTkRfRlIpCisJCXsKKwkJCXo4NTMwX3J4X2RvbmUoY2hhbik7CS8qIEZpcmUgdXAgdGhlIG5leHQgb25lICovCisJCX0JCQorCQl3cml0ZV96c2N0cmwoY2hhbiwgRVJSX1JFUyk7CisJCXdyaXRlX3pzY3RybChjaGFuLCBSRVNfSF9JVVMpOworCX0KKwllbHNlCisJeworCQkvKiBETUEgaXMgb2ZmIHJpZ2h0IG5vdywgZHJhaW4gdGhlIHNsb3cgd2F5ICovCisJCXo4NTMwX3J4KGNoYW4pOworCX0JCisJc3Bpbl91bmxvY2soY2hhbi0+bG9jayk7Cit9CisKKy8qKgorICoJejg1MzBfZG1hX3R4IC0gSGFuZGxlIGEgRE1BIFRYIGV2ZW50CisgKglAY2hhbjoJVGhlIFo4NTMwIGNoYW5uZWwgdG8gaGFuZGxlCisgKgorICoJV2UgaGF2ZSByZWNlaXZlZCBhbiBpbnRlcnJ1cHQgd2hpbGUgZG9pbmcgRE1BIHRyYW5zbWlzc2lvbnMuIEl0CisgKglzaG91bGRuJ3QgaGFwcGVuLiBTY3JlYW0gbG91ZGx5IGlmIGl0IGRvZXMuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHo4NTMwX2RtYV90eChzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqY2hhbikKK3sKKwlzcGluX2xvY2soY2hhbi0+bG9jayk7CisJaWYoIWNoYW4tPmRtYV90eCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhleSB3aG8gdHVybmVkIHRoZSBETUEgb2ZmP1xuIik7CisJCXo4NTMwX3R4KGNoYW4pOworCQlyZXR1cm47CisJfQorCS8qIFRoaXMgc2hvdWxkbnQgb2NjdXIgaW4gRE1BIG1vZGUgKi8KKwlwcmludGsoS0VSTl9FUlIgIkRNQSB0eCAtIGJvZ3VzIGV2ZW50IVxuIik7CisJejg1MzBfdHgoY2hhbik7CisJc3Bpbl91bmxvY2soY2hhbi0+bG9jayk7Cit9CisKKy8qKgorICoJejg1MzBfZG1hX3N0YXR1cyAtIEhhbmRsZSBhIERNQSBzdGF0dXMgZXhjZXB0aW9uCisgKglAY2hhbjogWjg1MzAgY2hhbm5lbCB0byBwcm9jZXNzCisgKgkKKyAqCUEgc3RhdHVzIGV2ZW50IG9jY3VycmVkIG9uIHRoZSBaODUzMC4gV2UgcmVjZWl2ZSB0aGVzZSBmb3IgdHdvIHJlYXNvbnMKKyAqCXdoZW4gaW4gRE1BIG1vZGUuIEZpcnN0bHkgaWYgd2UgZmluaXNoZWQgYSBwYWNrZXQgdHJhbnNmZXIgd2UgZ2V0IG9uZQorICoJYW5kIGtpY2sgdGhlIG5leHQgcGFja2V0IG91dC4gU2Vjb25kbHkgd2UgbWF5IHNlZSBhIERDRCBjaGFuZ2UgYW5kCisgKgloYXZlIHRvIHBva2UgdGhlIHByb3RvY29sIGxheWVyLgorICoKKyAqLworIAorc3RhdGljIHZvaWQgejg1MzBfZG1hX3N0YXR1cyhzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqY2hhbikKK3sKKwl1OCBzdGF0dXMsIGFsdGVyZWQ7CisKKwlzdGF0dXM9cmVhZF96c3JlZyhjaGFuLCBSMCk7CisJYWx0ZXJlZD1jaGFuLT5zdGF0dXNec3RhdHVzOworCQorCWNoYW4tPnN0YXR1cz1zdGF0dXM7CisKKworCWlmKGNoYW4tPmRtYV90eCkKKwl7CisJCWlmKHN0YXR1cyZUeEVPTSkKKwkJeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwkJCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJCQlkaXNhYmxlX2RtYShjaGFuLT50eGRtYSk7CisJCQljbGVhcl9kbWFfZmYoY2hhbi0+dHhkbWEpOwkKKwkJCWNoYW4tPnR4ZG1hX29uPTA7CisJCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkJCXo4NTMwX3R4X2RvbmUoY2hhbik7CisJCX0KKwl9CisKKwlzcGluX2xvY2soY2hhbi0+bG9jayk7CisJaWYoYWx0ZXJlZCZjaGFuLT5kY2RjaGVjaykKKwl7CisJCWlmKHN0YXR1cyZjaGFuLT5kY2RjaGVjaykKKwkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERDRCByYWlzZWRcbiIsIGNoYW4tPmRldi0+bmFtZSk7CisJCQl3cml0ZV96c3JlZyhjaGFuLCBSMywgY2hhbi0+cmVnc1szXXxSeEVOQUJMRSk7CisJCQlpZihjaGFuLT5uZXRkZXZpY2UgJiYKKwkJCSAgICAoKGNoYW4tPm5ldGRldmljZS0+dHlwZSA9PSBBUlBIUkRfSERMQykgfHwKKwkJCSAgICAoY2hhbi0+bmV0ZGV2aWNlLT50eXBlID09IEFSUEhSRF9QUFApKSkKKwkJCQlzcHBwX3Jlb3BlbihjaGFuLT5uZXRkZXZpY2UpOworCQl9CisJCWVsc2UKKwkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6RENEIGxvc3RcbiIsIGNoYW4tPmRldi0+bmFtZSk7CisJCQl3cml0ZV96c3JlZyhjaGFuLCBSMywgY2hhbi0+cmVnc1szXSZ+UnhFTkFCTEUpOworCQkJejg1MzBfZmx1c2hfZmlmbyhjaGFuKTsKKwkJfQorCX0JCisKKwl3cml0ZV96c2N0cmwoY2hhbiwgUkVTX0VYVF9JTlQpOworCXdyaXRlX3pzY3RybChjaGFuLCBSRVNfSF9JVVMpOworCXNwaW5fdW5sb2NrKGNoYW4tPmxvY2spOworfQorCitzdHJ1Y3Qgejg1MzBfaXJxaGFuZGxlciB6ODUzMF9kbWFfc3luYz0KK3sKKwl6ODUzMF9kbWFfcngsCisJejg1MzBfZG1hX3R4LAorCXo4NTMwX2RtYV9zdGF0dXMKK307CisKK0VYUE9SVF9TWU1CT0woejg1MzBfZG1hX3N5bmMpOworCitzdHJ1Y3Qgejg1MzBfaXJxaGFuZGxlciB6ODUzMF90eGRtYV9zeW5jPQoreworCXo4NTMwX3J4LAorCXo4NTMwX2RtYV90eCwKKwl6ODUzMF9kbWFfc3RhdHVzCit9OworCitFWFBPUlRfU1lNQk9MKHo4NTMwX3R4ZG1hX3N5bmMpOworCisvKioKKyAqCXo4NTMwX3J4X2NsZWFyIC0gSGFuZGxlIFJYIGV2ZW50cyBmcm9tIGEgc3RvcHBlZCBjaGlwCisgKglAYzogWjg1MzAgY2hhbm5lbCB0byBzaHV0IHVwCisgKgorICoJUmVjZWl2ZSBpbnRlcnJ1cHQgdmVjdG9ycyBmb3IgYSBaODUzMCB0aGF0IGlzIGluICdwYXJrZWQnIG1vZGUuCisgKglGb3IgbWFjaGluZXMgd2l0aCBQQ0kgWjg1eDMwIGNhcmRzLCBvciBsZXZlbCB0cmlnZ2VyZWQgaW50ZXJydXB0cworICoJKGVnIHRoZSBNYWNJSSkgd2UgbXVzdCBjbGVhciB0aGUgaW50ZXJydXB0IGNhdXNlIG9yIGRpZS4KKyAqLworCisKK3N0YXRpYyB2b2lkIHo4NTMwX3J4X2NsZWFyKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCS8qCisJICoJRGF0YSBhbmQgc3RhdHVzIGJ5dGVzCisJICovCisJdTggc3RhdDsKKworCXJlYWRfenNkYXRhKGMpOworCXN0YXQ9cmVhZF96c3JlZyhjLCBSMSk7CisJCisJaWYoc3RhdCZFTkRfRlIpCisJCXdyaXRlX3pzY3RybChjLCBSRVNfUnhfQ1JDKTsKKwkvKgorCSAqCUNsZWFyIGlycQorCSAqLworCXdyaXRlX3pzY3RybChjLCBFUlJfUkVTKTsKKwl3cml0ZV96c2N0cmwoYywgUkVTX0hfSVVTKTsKK30KKworLyoqCisgKgl6ODUzMF90eF9jbGVhciAtIEhhbmRsZSBUWCBldmVudHMgZnJvbSBhIHN0b3BwZWQgY2hpcAorICoJQGM6IFo4NTMwIGNoYW5uZWwgdG8gc2h1dCB1cAorICoKKyAqCVRyYW5zbWl0IGludGVycnVwdCB2ZWN0b3JzIGZvciBhIFo4NTMwIHRoYXQgaXMgaW4gJ3BhcmtlZCcgbW9kZS4KKyAqCUZvciBtYWNoaW5lcyB3aXRoIFBDSSBaODV4MzAgY2FyZHMsIG9yIGxldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHRzCisgKgkoZWcgdGhlIE1hY0lJKSB3ZSBtdXN0IGNsZWFyIHRoZSBpbnRlcnJ1cHQgY2F1c2Ugb3IgZGllLgorICovCisKK3N0YXRpYyB2b2lkIHo4NTMwX3R4X2NsZWFyKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXdyaXRlX3pzY3RybChjLCBSRVNfVHhfUCk7CisJd3JpdGVfenNjdHJsKGMsIFJFU19IX0lVUyk7Cit9CisKKy8qKgorICoJejg1MzBfc3RhdHVzX2NsZWFyIC0gSGFuZGxlIHN0YXR1cyBldmVudHMgZnJvbSBhIHN0b3BwZWQgY2hpcAorICoJQGNoYW46IFo4NTMwIGNoYW5uZWwgdG8gc2h1dCB1cAorICoKKyAqCVN0YXR1cyBpbnRlcnJ1cHQgdmVjdG9ycyBmb3IgYSBaODUzMCB0aGF0IGlzIGluICdwYXJrZWQnIG1vZGUuCisgKglGb3IgbWFjaGluZXMgd2l0aCBQQ0kgWjg1eDMwIGNhcmRzLCBvciBsZXZlbCB0cmlnZ2VyZWQgaW50ZXJydXB0cworICoJKGVnIHRoZSBNYWNJSSkgd2UgbXVzdCBjbGVhciB0aGUgaW50ZXJydXB0IGNhdXNlIG9yIGRpZS4KKyAqLworCitzdGF0aWMgdm9pZCB6ODUzMF9zdGF0dXNfY2xlYXIoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmNoYW4pCit7CisJdTggc3RhdHVzPXJlYWRfenNyZWcoY2hhbiwgUjApOworCWlmKHN0YXR1cyZUeEVPTSkKKwkJd3JpdGVfenNjdHJsKGNoYW4sIEVSUl9SRVMpOworCXdyaXRlX3pzY3RybChjaGFuLCBSRVNfRVhUX0lOVCk7CisJd3JpdGVfenNjdHJsKGNoYW4sIFJFU19IX0lVUyk7Cit9CisKK3N0cnVjdCB6ODUzMF9pcnFoYW5kbGVyIHo4NTMwX25vcD0KK3sKKwl6ODUzMF9yeF9jbGVhciwKKwl6ODUzMF90eF9jbGVhciwKKwl6ODUzMF9zdGF0dXNfY2xlYXIKK307CisKKworRVhQT1JUX1NZTUJPTCh6ODUzMF9ub3ApOworCisvKioKKyAqCXo4NTMwX2ludGVycnVwdCAtIEhhbmRsZSBhbiBpbnRlcnJ1cHQgZnJvbSBhIFo4NTMwCisgKglAaXJxOiAJSW50ZXJydXB0IG51bWJlcgorICoJQGRldl9pZDogVGhlIFo4NTMwIGRldmljZSB0aGF0IGlzIGludGVycnVwdGluZy4KKyAqCUByZWdzOiB1bnVzZWQKKyAqCisgKglBIFo4NVsyXTMwIGRldmljZSBoYXMgc3R1Y2sgaXRzIGhhbmQgaW4gdGhlIGFpciBmb3IgYXR0ZW50aW9uLgorICoJV2Ugc2NhbiBib3RoIHRoZSBjaGFubmVscyBvbiB0aGUgY2hpcCBmb3IgZXZlbnRzIGFuZCB0aGVuIGNhbGwKKyAqCXRoZSBjaGFubmVsIHNwZWNpZmljIGNhbGwgYmFja3MgZm9yIGVhY2ggY2hhbm5lbCB0aGF0IGhhcyBldmVudHMuCisgKglXZSBoYXZlIHRvIHVzZSBjYWxsYmFjayBmdW5jdGlvbnMgYmVjYXVzZSB0aGUgdHdvIGNoYW5uZWxzIGNhbiBiZQorICoJaW4gZGlmZmVyZW50IG1vZGVzLgorICoKKyAqCUxvY2tpbmcgaXMgZG9uZSBmb3IgdGhlIGhhbmRsZXJzLiBOb3RlIHRoYXQgbG9ja2luZyBpcyBkb25lCisgKglhdCB0aGUgY2hpcCBsZXZlbCAodGhlIDV1UyBkZWxheSBpc3N1ZSBpcyBwZXIgY2hpcCBub3QgcGVyCisgKgljaGFubmVsKS4gYy0+bG9jayBmb3IgYm90aCBjaGFubmVscyBwb2ludHMgdG8gZGV2LT5sb2NrCisgKi8KKworaXJxcmV0dXJuX3Qgejg1MzBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHo4NTMwX2RldiAqZGV2PWRldl9pZDsKKwl1OCBpbnRyOworCXN0YXRpYyB2b2xhdGlsZSBpbnQgbG9ja2VyPTA7CisJaW50IHdvcms9MDsKKwlzdHJ1Y3Qgejg1MzBfaXJxaGFuZGxlciAqaXJxczsKKwkKKwlpZihsb2NrZXIpCisJeworCQlwcmludGsoS0VSTl9FUlIgIklSUSByZS1lbnRlclxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJbG9ja2VyPTE7CisKKwlzcGluX2xvY2soJmRldi0+bG9jayk7CisKKwl3aGlsZSgrK3dvcms8NTAwMCkKKwl7CisKKwkJaW50ciA9IHJlYWRfenNyZWcoJmRldi0+Y2hhbkEsIFIzKTsKKwkJaWYoIShpbnRyICYgKENIQVJ4SVB8Q0hBVHhJUHxDSEFFWFR8Q0hCUnhJUHxDSEJUeElQfENIQkVYVCkpKQorCQkJYnJlYWs7CisJCisJCS8qIFRoaXMgaG9sZHMgdGhlIElSUSBzdGF0dXMuIE9uIHRoZSA4NTMwIHlvdSBtdXN0IHJlYWQgaXQgZnJvbSBjaGFuIAorCQkgICBBIGV2ZW4gdGhvdWdoIGl0IGFwcGxpZXMgdG8gdGhlIHdob2xlIGNoaXAgKi8KKwkJCisJCS8qIE5vdyB3YWxrIHRoZSBjaGlwIGFuZCBzZWUgd2hhdCBpdCBpcyB3YW50aW5nIC0gaXQgbWF5IGJlCisJCSAgIGFuIElSUSBmb3Igc29tZW9uZSBlbHNlIHJlbWVtYmVyICovCisJCSAgIAorCQlpcnFzPWRldi0+Y2hhbkEuaXJxczsKKworCQlpZihpbnRyICYgKENIQVJ4SVB8Q0hBVHhJUHxDSEFFWFQpKQorCQl7CisJCQlpZihpbnRyJkNIQVJ4SVApCisJCQkJaXJxcy0+cngoJmRldi0+Y2hhbkEpOworCQkJaWYoaW50ciZDSEFUeElQKQorCQkJCWlycXMtPnR4KCZkZXYtPmNoYW5BKTsKKwkJCWlmKGludHImQ0hBRVhUKQorCQkJCWlycXMtPnN0YXR1cygmZGV2LT5jaGFuQSk7CisJCX0KKworCQlpcnFzPWRldi0+Y2hhbkIuaXJxczsKKworCQlpZihpbnRyICYgKENIQlJ4SVB8Q0hCVHhJUHxDSEJFWFQpKQorCQl7CisJCQlpZihpbnRyJkNIQlJ4SVApCisJCQkJaXJxcy0+cngoJmRldi0+Y2hhbkIpOworCQkJaWYoaW50ciZDSEJUeElQKQorCQkJCWlycXMtPnR4KCZkZXYtPmNoYW5CKTsKKwkJCWlmKGludHImQ0hCRVhUKQorCQkJCWlycXMtPnN0YXR1cygmZGV2LT5jaGFuQik7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmRldi0+bG9jayk7CisJaWYod29yaz09NTAwMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW50ZXJydXB0IGphbW1lZCAtIGFib3J0KDB4JVgpIVxuIiwgZGV2LT5uYW1lLCBpbnRyKTsKKwkvKiBPayBhbGwgZG9uZSAqLworCWxvY2tlcj0wOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9pbnRlcnJ1cHQpOworCitzdGF0aWMgY2hhciByZWdfaW5pdFsxNl09Cit7CisJMCwwLDAsMCwKKwkwLDAsMCwwLAorCTAsMCwwLDAsCisJMHg1NSwwLDAsMAorfTsKKworCisvKioKKyAqCXo4NTMwX3N5bmNfb3BlbiAtIE9wZW4gYSBaODUzMCBjaGFubmVsIGZvciBQSU8KKyAqCUBkZXY6CVRoZSBuZXR3b3JrIGludGVyZmFjZSB3ZSBhcmUgdXNpbmcKKyAqCUBjOglUaGUgWjg1MzAgY2hhbm5lbCB0byBvcGVuIGluIHN5bmNocm9ub3VzIFBJTyBtb2RlCisgKgorICoJU3dpdGNoIGEgWjg1MzAgaW50byBzeW5jaHJvbm91cyBtb2RlIHdpdGhvdXQgRE1BIGFzc2lzdC4gV2UKKyAqCXJhaXNlIHRoZSBSVFMvRFRSIGFuZCBjb21tZW5jZSBuZXR3b3JrIG9wZXJhdGlvbi4KKyAqLworIAoraW50IHo4NTMwX3N5bmNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoYy0+bG9jaywgZmxhZ3MpOworCisJYy0+c3luYyA9IDE7CisJYy0+bXR1ID0gZGV2LT5tdHUrNjQ7CisJYy0+Y291bnQgPSAwOworCWMtPnNrYiA9IE5VTEw7CisJYy0+c2tiMiA9IE5VTEw7CisJYy0+aXJxcyA9ICZ6ODUzMF9zeW5jOworCisJLyogVGhpcyBsb2FkcyB0aGUgZG91YmxlIGJ1ZmZlciB1cCAqLworCXo4NTMwX3J4X2RvbmUoYyk7CS8qIExvYWQgdGhlIGZyYW1lIHJpbmcgKi8KKwl6ODUzMF9yeF9kb25lKGMpOwkvKiBMb2FkIHRoZSBiYWNrdXAgZnJhbWUgKi8KKwl6ODUzMF9ydHNkdHIoYywxKTsKKwljLT5kbWFfdHggPSAwOworCWMtPnJlZ3NbUjFdfD1UeElOVF9FTkFCOworCXdyaXRlX3pzcmVnKGMsIFIxLCBjLT5yZWdzW1IxXSk7CisJd3JpdGVfenNyZWcoYywgUjMsIGMtPnJlZ3NbUjNdfFJ4RU5BQkxFKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisKK0VYUE9SVF9TWU1CT0woejg1MzBfc3luY19vcGVuKTsKKworLyoqCisgKgl6ODUzMF9zeW5jX2Nsb3NlIC0gQ2xvc2UgYSBQSU8gWjg1MzAgY2hhbm5lbAorICoJQGRldjogTmV0d29yayBkZXZpY2UgdG8gY2xvc2UKKyAqCUBjOiBaODUzMCBjaGFubmVsIHRvIGRpc2Fzc29jaWF0ZSBhbmQgbW92ZSB0byBpZGxlCisgKgorICoJQ2xvc2UgZG93biBhIFo4NTMwIGludGVyZmFjZSBhbmQgc3dpdGNoIGl0cyBpbnRlcnJ1cHQgaGFuZGxlcnMKKyAqCXRvIGRpc2NhcmQgZnV0dXJlIGV2ZW50cy4KKyAqLworIAoraW50IHo4NTMwX3N5bmNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCit7CisJdTggY2hrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoYy0+bG9jaywgZmxhZ3MpOworCWMtPmlycXMgPSAmejg1MzBfbm9wOworCWMtPm1heCA9IDA7CisJYy0+c3luYyA9IDA7CisJCisJY2hrPXJlYWRfenNyZWcoYyxSMCk7CisJd3JpdGVfenNyZWcoYywgUjMsIGMtPnJlZ3NbUjNdKTsKKwl6ODUzMF9ydHNkdHIoYywwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHo4NTMwX3N5bmNfY2xvc2UpOworCisvKioKKyAqCXo4NTMwX3N5bmNfZG1hX29wZW4gLSBPcGVuIGEgWjg1MzAgZm9yIERNQSBJL08KKyAqCUBkZXY6IFRoZSBuZXR3b3JrIGRldmljZSB0byBhdHRhY2gKKyAqCUBjOiBUaGUgWjg1MzAgY2hhbm5lbCB0byBjb25maWd1cmUgaW4gc3luYyBETUEgbW9kZS4KKyAqCisgKglTZXQgdXAgYSBaODV4MzAgZGV2aWNlIGZvciBzeW5jaHJvbm91cyBETUEgaW4gYm90aCBkaXJlY3Rpb25zLiBUd28KKyAqCUlTQSBETUEgY2hhbm5lbHMgbXVzdCBiZSBhdmFpbGFibGUgZm9yIHRoaXMgdG8gd29yay4gV2UgYXNzdW1lIElTQQorICoJRE1BIGRyaXZlbiBJL08gYW5kIFBDIGxpbWl0cyBvbiBhY2Nlc3MuCisgKi8KKyAKK2ludCB6ODUzMF9zeW5jX2RtYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXVuc2lnbmVkIGxvbmcgY2ZsYWdzLCBkZmxhZ3M7CisJCisJYy0+c3luYyA9IDE7CisJYy0+bXR1ID0gZGV2LT5tdHUrNjQ7CisJYy0+Y291bnQgPSAwOworCWMtPnNrYiA9IE5VTEw7CisJYy0+c2tiMiA9IE5VTEw7CisJLyoKKwkgKglMb2FkIHRoZSBETUEgaW50ZXJmYWNlcyB1cAorCSAqLworCWMtPnJ4ZG1hX29uID0gMDsKKwljLT50eGRtYV9vbiA9IDA7CisJCisJLyoKKwkgKglBbGxvY2F0ZSB0aGUgRE1BIGZsaXAgYnVmZmVycy4gTGltaXQgYnkgcGFnZSBzaXplLgorCSAqCUV2ZXJ5b25lIHJ1bnMgMTUwMCBtdHUgb3IgbGVzcyBvbiB3YW4gbGlua3Mgc28gdGhpcworCSAqCXNob3VsZCBiZSBmaW5lLgorCSAqLworCSAKKwlpZihjLT5tdHUgID4gUEFHRV9TSVpFLzIpCisJCXJldHVybiAtRU1TR1NJWkU7CisJIAorCWMtPnJ4X2J1ZlswXT0odm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMfEdGUF9ETUEpOworCWlmKGMtPnJ4X2J1ZlswXT09TlVMTCkKKwkJcmV0dXJuIC1FTk9CVUZTOworCWMtPnJ4X2J1ZlsxXT1jLT5yeF9idWZbMF0rUEFHRV9TSVpFLzI7CisJCisJYy0+dHhfZG1hX2J1ZlswXT0odm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMfEdGUF9ETUEpOworCWlmKGMtPnR4X2RtYV9idWZbMF09PU5VTEwpCisJeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYy0+cnhfYnVmWzBdKTsKKwkJYy0+cnhfYnVmWzBdPU5VTEw7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisJYy0+dHhfZG1hX2J1ZlsxXT1jLT50eF9kbWFfYnVmWzBdK1BBR0VfU0laRS8yOworCisJYy0+dHhfZG1hX3VzZWQ9MDsKKwljLT5kbWFfdHggPSAxOworCWMtPmRtYV9udW09MDsKKwljLT5kbWFfcmVhZHk9MTsKKwkKKwkvKgorCSAqCUVuYWJsZSBETUEgY29udHJvbCBtb2RlCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZShjLT5sb2NrLCBjZmxhZ3MpOworCSAKKwkvKgorCSAqCVRYIERNQSB2aWEgRElSL1JFUQorCSAqLworCSAKKwljLT5yZWdzW1IxNF18PSBEVFJSRVE7CisJd3JpdGVfenNyZWcoYywgUjE0LCBjLT5yZWdzW1IxNF0pOyAgICAgCisKKwljLT5yZWdzW1IxXSY9IH5UeElOVF9FTkFCOworCXdyaXRlX3pzcmVnKGMsIFIxLCBjLT5yZWdzW1IxXSk7CisJCisJLyoKKwkgKglSWCBETUEgdmlhIFcvUmVxCisJICovCSAKKworCWMtPnJlZ3NbUjFdfD0gV1RfRk5fUkRZRk47CisJYy0+cmVnc1tSMV18PSBXVF9SRFlfUlQ7CisJYy0+cmVnc1tSMV18PSBJTlRfRVJSX1J4OworCWMtPnJlZ3NbUjFdJj0gflR4SU5UX0VOQUI7CisJd3JpdGVfenNyZWcoYywgUjEsIGMtPnJlZ3NbUjFdKTsKKwljLT5yZWdzW1IxXXw9IFdUX1JEWV9FTkFCOworCXdyaXRlX3pzcmVnKGMsIFIxLCBjLT5yZWdzW1IxXSk7ICAgICAgICAgICAgCisJCisJLyoKKwkgKglETUEgaW50ZXJydXB0cworCSAqLworCSAKKwkvKgorCSAqCVNldCB1cCB0aGUgRE1BIGNvbmZpZ3VyYXRpb24KKwkgKi8JCisJIAorCWRmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCSAKKwlkaXNhYmxlX2RtYShjLT5yeGRtYSk7CisJY2xlYXJfZG1hX2ZmKGMtPnJ4ZG1hKTsKKwlzZXRfZG1hX21vZGUoYy0+cnhkbWEsIERNQV9NT0RFX1JFQUR8MHgxMCk7CisJc2V0X2RtYV9hZGRyKGMtPnJ4ZG1hLCB2aXJ0X3RvX2J1cyhjLT5yeF9idWZbMF0pKTsKKwlzZXRfZG1hX2NvdW50KGMtPnJ4ZG1hLCBjLT5tdHUpOworCWVuYWJsZV9kbWEoYy0+cnhkbWEpOworCisJZGlzYWJsZV9kbWEoYy0+dHhkbWEpOworCWNsZWFyX2RtYV9mZihjLT50eGRtYSk7CisJc2V0X2RtYV9tb2RlKGMtPnR4ZG1hLCBETUFfTU9ERV9XUklURSk7CisJZGlzYWJsZV9kbWEoYy0+dHhkbWEpOworCQorCXJlbGVhc2VfZG1hX2xvY2soZGZsYWdzKTsKKwkKKwkvKgorCSAqCVNlbGVjdCB0aGUgRE1BIGludGVycnVwdCBoYW5kbGVycworCSAqLworCisJYy0+cnhkbWFfb24gPSAxOworCWMtPnR4ZG1hX29uID0gMTsKKwljLT50eF9kbWFfdXNlZCA9IDE7CisJIAorCWMtPmlycXMgPSAmejg1MzBfZG1hX3N5bmM7CisJejg1MzBfcnRzZHRyKGMsMSk7CisJd3JpdGVfenNyZWcoYywgUjMsIGMtPnJlZ3NbUjNdfFJ4RU5BQkxFKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYy0+bG9jaywgY2ZsYWdzKTsKKwkKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9zeW5jX2RtYV9vcGVuKTsKKworLyoqCisgKgl6ODUzMF9zeW5jX2RtYV9jbG9zZSAtIENsb3NlIGRvd24gRE1BIEkvTworICoJQGRldjogTmV0d29yayBkZXZpY2UgdG8gZGV0YWNoCisgKglAYzogWjg1MzAgY2hhbm5lbCB0byBtb3ZlIGludG8gZGlzY2FyZCBtb2RlCisgKgorICoJU2h1dCBkb3duIGEgRE1BIG1vZGUgc3luY2hyb25vdXMgaW50ZXJmYWNlLiBIYWx0IHRoZSBETUEsIGFuZAorICoJZnJlZSB0aGUgYnVmZmVycy4KKyAqLworIAoraW50IHo4NTMwX3N5bmNfZG1hX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXU4IGNoazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWMtPmlycXMgPSAmejg1MzBfbm9wOworCWMtPm1heCA9IDA7CisJYy0+c3luYyA9IDA7CisJCisJLyoKKwkgKglEaXNhYmxlIHRoZSBQQyBETUEgY2hhbm5lbHMKKwkgKi8KKwkKKwlmbGFncz1jbGFpbV9kbWFfbG9jaygpOyAKKwlkaXNhYmxlX2RtYShjLT5yeGRtYSk7CisJY2xlYXJfZG1hX2ZmKGMtPnJ4ZG1hKTsKKwkKKwljLT5yeGRtYV9vbiA9IDA7CisJCisJZGlzYWJsZV9kbWEoYy0+dHhkbWEpOworCWNsZWFyX2RtYV9mZihjLT50eGRtYSk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCisJYy0+dHhkbWFfb24gPSAwOworCWMtPnR4X2RtYV91c2VkID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKGMtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICoJRGlzYWJsZSBETUEgY29udHJvbCBtb2RlCisJICovCisJIAorCWMtPnJlZ3NbUjFdJj0gfldUX1JEWV9FTkFCOworCXdyaXRlX3pzcmVnKGMsIFIxLCBjLT5yZWdzW1IxXSk7ICAgICAgICAgICAgCisJYy0+cmVnc1tSMV0mPSB+KFdUX1JEWV9SVHxXVF9GTl9SRFlGTnxJTlRfRVJSX1J4KTsKKwljLT5yZWdzW1IxXXw9IElOVF9BTExfUng7CisJd3JpdGVfenNyZWcoYywgUjEsIGMtPnJlZ3NbUjFdKTsKKwljLT5yZWdzW1IxNF0mPSB+RFRSUkVROworCXdyaXRlX3pzcmVnKGMsIFIxNCwgYy0+cmVnc1tSMTRdKTsgICAKKwkKKwlpZihjLT5yeF9idWZbMF0pCisJeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYy0+cnhfYnVmWzBdKTsKKwkJYy0+cnhfYnVmWzBdPU5VTEw7CisJfQorCWlmKGMtPnR4X2RtYV9idWZbMF0pCisJeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkICBsb25nKWMtPnR4X2RtYV9idWZbMF0pOworCQljLT50eF9kbWFfYnVmWzBdPU5VTEw7CisJfQorCWNoaz1yZWFkX3pzcmVnKGMsUjApOworCXdyaXRlX3pzcmVnKGMsIFIzLCBjLT5yZWdzW1IzXSk7CisJejg1MzBfcnRzZHRyKGMsMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHo4NTMwX3N5bmNfZG1hX2Nsb3NlKTsKKworLyoqCisgKgl6ODUzMF9zeW5jX3R4ZG1hX29wZW4gLSBPcGVuIGEgWjg1MzAgZm9yIFRYIGRyaXZlbiBETUEKKyAqCUBkZXY6IFRoZSBuZXR3b3JrIGRldmljZSB0byBhdHRhY2gKKyAqCUBjOiBUaGUgWjg1MzAgY2hhbm5lbCB0byBjb25maWd1cmUgaW4gc3luYyBETUEgbW9kZS4KKyAqCisgKglTZXQgdXAgYSBaODV4MzAgZGV2aWNlIGZvciBzeW5jaHJvbm91cyBETUEgdHJhbm1pc3Npb24uIE9uZQorICoJSVNBIERNQSBjaGFubmVsIG11c3QgYmUgYXZhaWxhYmxlIGZvciB0aGlzIHRvIHdvcmsuIFRoZSByZWNlaXZlCisgKglzaWRlIGlzIHJ1biBpbiBQSU8gbW9kZSwgYnV0IHRoZW4gaXQgaGFzIHRoZSBiaWdnZXIgRklGTy4KKyAqLworCitpbnQgejg1MzBfc3luY190eGRtYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXVuc2lnbmVkIGxvbmcgY2ZsYWdzLCBkZmxhZ3M7CisKKwlwcmludGsoIk9wZW5pbmcgc3luYyBpbnRlcmZhY2UgZm9yIFRYLURNQVxuIik7CisJYy0+c3luYyA9IDE7CisJYy0+bXR1ID0gZGV2LT5tdHUrNjQ7CisJYy0+Y291bnQgPSAwOworCWMtPnNrYiA9IE5VTEw7CisJYy0+c2tiMiA9IE5VTEw7CisJCisJLyoKKwkgKglBbGxvY2F0ZSB0aGUgRE1BIGZsaXAgYnVmZmVycy4gTGltaXQgYnkgcGFnZSBzaXplLgorCSAqCUV2ZXJ5b25lIHJ1bnMgMTUwMCBtdHUgb3IgbGVzcyBvbiB3YW4gbGlua3Mgc28gdGhpcworCSAqCXNob3VsZCBiZSBmaW5lLgorCSAqLworCSAKKwlpZihjLT5tdHUgID4gUEFHRV9TSVpFLzIpCisJCXJldHVybiAtRU1TR1NJWkU7CisJIAorCWMtPnR4X2RtYV9idWZbMF09KHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTHxHRlBfRE1BKTsKKwlpZihjLT50eF9kbWFfYnVmWzBdPT1OVUxMKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwljLT50eF9kbWFfYnVmWzFdID0gYy0+dHhfZG1hX2J1ZlswXSArIFBBR0VfU0laRS8yOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZShjLT5sb2NrLCBjZmxhZ3MpOworCisJLyoKKwkgKglMb2FkIHRoZSBQSU8gcmVjZWl2ZSByaW5nCisJICovCisKKwl6ODUzMF9yeF9kb25lKGMpOworCXo4NTMwX3J4X2RvbmUoYyk7CisKKyAJLyoKKwkgKglMb2FkIHRoZSBETUEgaW50ZXJmYWNlcyB1cAorCSAqLworCisJYy0+cnhkbWFfb24gPSAwOworCWMtPnR4ZG1hX29uID0gMDsKKwkKKwljLT50eF9kbWFfdXNlZD0wOworCWMtPmRtYV9udW09MDsKKwljLT5kbWFfcmVhZHk9MTsKKwljLT5kbWFfdHggPSAxOworCisgCS8qCisJICoJRW5hYmxlIERNQSBjb250cm9sIG1vZGUKKwkgKi8KKworIAkvKgorCSAqCVRYIERNQSB2aWEgRElSL1JFUQorIAkgKi8KKwljLT5yZWdzW1IxNF18PSBEVFJSRVE7CisJd3JpdGVfenNyZWcoYywgUjE0LCBjLT5yZWdzW1IxNF0pOyAgICAgCisJCisJYy0+cmVnc1tSMV0mPSB+VHhJTlRfRU5BQjsKKwl3cml0ZV96c3JlZyhjLCBSMSwgYy0+cmVnc1tSMV0pOworCQorCS8qCisJICoJU2V0IHVwIHRoZSBETUEgY29uZmlndXJhdGlvbgorCSAqLwkKKwkgCisJZGZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKworCWRpc2FibGVfZG1hKGMtPnR4ZG1hKTsKKwljbGVhcl9kbWFfZmYoYy0+dHhkbWEpOworCXNldF9kbWFfbW9kZShjLT50eGRtYSwgRE1BX01PREVfV1JJVEUpOworCWRpc2FibGVfZG1hKGMtPnR4ZG1hKTsKKworCXJlbGVhc2VfZG1hX2xvY2soZGZsYWdzKTsKKwkKKwkvKgorCSAqCVNlbGVjdCB0aGUgRE1BIGludGVycnVwdCBoYW5kbGVycworCSAqLworCisJYy0+cnhkbWFfb24gPSAwOworCWMtPnR4ZG1hX29uID0gMTsKKwljLT50eF9kbWFfdXNlZCA9IDE7CisJIAorCWMtPmlycXMgPSAmejg1MzBfdHhkbWFfc3luYzsKKwl6ODUzMF9ydHNkdHIoYywxKTsKKwl3cml0ZV96c3JlZyhjLCBSMywgYy0+cmVnc1tSM118UnhFTkFCTEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYy0+bG9jaywgY2ZsYWdzKTsKKwkKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9zeW5jX3R4ZG1hX29wZW4pOworCisvKioKKyAqCXo4NTMwX3N5bmNfdHhkbWFfY2xvc2UgLSBDbG9zZSBkb3duIGEgVFggZHJpdmVuIERNQSBjaGFubmVsCisgKglAZGV2OiBOZXR3b3JrIGRldmljZSB0byBkZXRhY2gKKyAqCUBjOiBaODUzMCBjaGFubmVsIHRvIG1vdmUgaW50byBkaXNjYXJkIG1vZGUKKyAqCisgKglTaHV0IGRvd24gYSBETUEvUElPIHNwbGl0IG1vZGUgc3luY2hyb25vdXMgaW50ZXJmYWNlLiBIYWx0IHRoZSBETUEsIAorICoJYW5kICBmcmVlIHRoZSBidWZmZXJzLgorICovCisKK2ludCB6ODUzMF9zeW5jX3R4ZG1hX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXVuc2lnbmVkIGxvbmcgZGZsYWdzLCBjZmxhZ3M7CisJdTggY2hrOworCisJCisJc3Bpbl9sb2NrX2lycXNhdmUoYy0+bG9jaywgY2ZsYWdzKTsKKwkKKwljLT5pcnFzID0gJno4NTMwX25vcDsKKwljLT5tYXggPSAwOworCWMtPnN5bmMgPSAwOworCQorCS8qCisJICoJRGlzYWJsZSB0aGUgUEMgRE1BIGNoYW5uZWxzCisJICovCisJIAorCWRmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisKKwlkaXNhYmxlX2RtYShjLT50eGRtYSk7CisJY2xlYXJfZG1hX2ZmKGMtPnR4ZG1hKTsKKwljLT50eGRtYV9vbiA9IDA7CisJYy0+dHhfZG1hX3VzZWQgPSAwOworCisJcmVsZWFzZV9kbWFfbG9jayhkZmxhZ3MpOworCisJLyoKKwkgKglEaXNhYmxlIERNQSBjb250cm9sIG1vZGUKKwkgKi8KKwkgCisJYy0+cmVnc1tSMV0mPSB+V1RfUkRZX0VOQUI7CisJd3JpdGVfenNyZWcoYywgUjEsIGMtPnJlZ3NbUjFdKTsgICAgICAgICAgICAKKwljLT5yZWdzW1IxXSY9IH4oV1RfUkRZX1JUfFdUX0ZOX1JEWUZOfElOVF9FUlJfUngpOworCWMtPnJlZ3NbUjFdfD0gSU5UX0FMTF9SeDsKKwl3cml0ZV96c3JlZyhjLCBSMSwgYy0+cmVnc1tSMV0pOworCWMtPnJlZ3NbUjE0XSY9IH5EVFJSRVE7CisJd3JpdGVfenNyZWcoYywgUjE0LCBjLT5yZWdzW1IxNF0pOyAgIAorCQorCWlmKGMtPnR4X2RtYV9idWZbMF0pCisJeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYy0+dHhfZG1hX2J1ZlswXSk7CisJCWMtPnR4X2RtYV9idWZbMF09TlVMTDsKKwl9CisJY2hrPXJlYWRfenNyZWcoYyxSMCk7CisJd3JpdGVfenNyZWcoYywgUjMsIGMtPnJlZ3NbUjNdKTsKKwl6ODUzMF9ydHNkdHIoYywwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYy0+bG9jaywgY2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworCitFWFBPUlRfU1lNQk9MKHo4NTMwX3N5bmNfdHhkbWFfY2xvc2UpOworCisKKy8qCisgKglOYW1lIHN0cmluZ3MgZm9yIFo4NTMwIGNoaXBzLiBTR0kgY2xhaW0gdG8gaGF2ZSBhIDEzMCwgWmlsb2cgZGVueQorICoJaXQgZXhpc3RzLi4uCisgKi8KKyAKK3N0YXRpYyBjaGFyICp6ODUzMF90eXBlX25hbWVbXT17CisJIlo4NTMwIiwKKwkiWjg1QzMwIiwKKwkiWjg1MjMwIgorfTsKKworLyoqCisgKgl6ODUzMF9kZXNjcmliZSAtIFVuaWZvcm1seSBkZXNjcmliZSBhIFo4NTMwIHBvcnQKKyAqCUBkZXY6IFo4NTMwIGRldmljZSB0byBkZXNjcmliZQorICoJQG1hcHBpbmc6IHN0cmluZyBob2xkaW5nIG1hcHBpbmcgdHlwZSAoZWcgIkkvTyIgb3IgIk1lbSIpCisgKglAaW86IHRoZSBwb3J0IHZhbHVlIGluIHF1ZXN0aW9uCisgKgorICoJRGVzY3JpYmUgYSBaODUzMCBpbiBhIHN0YW5kYXJkIGZvcm1hdC4gV2UgbXVzdCBwYXNzIHRoZSBJL08gYXMKKyAqCXRoZSBwb3J0IG9mZnNldCBpc250IHByZWRpY3RhYmxlLiBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgZnVuY3Rpb24KKyAqCWlzIHRvIHRyeSBhbmQgZ2V0IGEgY29tbW9uIGZvcm1hdCBvZiByZXBvcnQuCisgKi8KKwordm9pZCB6ODUzMF9kZXNjcmliZShzdHJ1Y3Qgejg1MzBfZGV2ICpkZXYsIGNoYXIgKm1hcHBpbmcsIHVuc2lnbmVkIGxvbmcgaW8pCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGZvdW5kIGF0ICVzIDB4JWxYLCBJUlEgJWQuXG4iLAorCQlkZXYtPm5hbWUsIAorCQl6ODUzMF90eXBlX25hbWVbZGV2LT50eXBlXSwKKwkJbWFwcGluZywKKwkJWjg1MzBfUE9SVF9PRihpbyksCisJCWRldi0+aXJxKTsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9kZXNjcmliZSk7CisKKy8qCisgKglMb2NrZWQgb3BlcmF0aW9uIHBhcnQgb2YgdGhlIHo4NTMwIGluaXQgY29kZQorICovCisgCitzdGF0aWMgaW5saW5lIGludCBkb196ODUzMF9pbml0KHN0cnVjdCB6ODUzMF9kZXYgKmRldikKK3sKKwkvKiBOT1AgdGhlIGludGVycnVwdCBoYW5kbGVycyBmaXJzdCAtIHdlIG1pZ2h0IGdldCBhCisJICAgZmxvYXRpbmcgSVJRIHRyYW5zaXRpb24gd2hlbiB3ZSByZXNldCB0aGUgY2hpcCAqLworCWRldi0+Y2hhbkEuaXJxcz0mejg1MzBfbm9wOworCWRldi0+Y2hhbkIuaXJxcz0mejg1MzBfbm9wOworCWRldi0+Y2hhbkEuZGNkY2hlY2s9RENEOworCWRldi0+Y2hhbkIuZGNkY2hlY2s9RENEOworCisJLyogUmVzZXQgdGhlIGNoaXAgKi8KKwl3cml0ZV96c3JlZygmZGV2LT5jaGFuQSwgUjksIDB4QzApOworCXVkZWxheSgyMDApOworCS8qIE5vdyBjaGVjayBpdHMgdmFsaWQgKi8KKwl3cml0ZV96c3JlZygmZGV2LT5jaGFuQSwgUjEyLCAweEFBKTsKKwlpZihyZWFkX3pzcmVnKCZkZXYtPmNoYW5BLCBSMTIpIT0weEFBKQorCQlyZXR1cm4gLUVOT0RFVjsKKwl3cml0ZV96c3JlZygmZGV2LT5jaGFuQSwgUjEyLCAweDU1KTsKKwlpZihyZWFkX3pzcmVnKCZkZXYtPmNoYW5BLCBSMTIpIT0weDU1KQorCQlyZXR1cm4gLUVOT0RFVjsKKwkJCisJZGV2LT50eXBlPVo4NTMwOworCQorCS8qCisJICoJU2VlIHRoZSBhcHBsaWNhdGlvbiBub3RlLgorCSAqLworCSAKKwl3cml0ZV96c3JlZygmZGV2LT5jaGFuQSwgUjE1LCAweDAxKTsKKwkKKwkvKgorCSAqCUlmIHdlIGNhbiBzZXQgdGhlIGxvdyBiaXQgb2YgUjE1IHRoZW4KKwkgKgl0aGUgY2hpcCBpcyBlbmhhbmNlZC4KKwkgKi8KKwkgCisJaWYocmVhZF96c3JlZygmZGV2LT5jaGFuQSwgUjE1KT09MHgwMSkKKwl7CisJCS8qIFRoaXMgQzMwIHZlcnN1cyAyMzAgZGV0ZWN0IGlzIGZyb20gS2xhdXMgS3VkaWVsa2EncyBkbWFzY2MgKi8KKwkJLyogUHV0IGEgY2hhciBpbiB0aGUgZmlmbyAqLworCQl3cml0ZV96c3JlZygmZGV2LT5jaGFuQSwgUjgsIDApOworCQlpZihyZWFkX3pzcmVnKCZkZXYtPmNoYW5BLCBSMCkmVHhfQlVGX0VNUCkKKwkJCWRldi0+dHlwZSA9IFo4NTIzMDsJLyogSGFzIGEgRklGTyAqLworCQllbHNlCisJCQlkZXYtPnR5cGUgPSBaODVDMzA7CS8qIFo4NUMzMCwgMSBieXRlIEZJRk8gKi8KKwl9CisJCQorCS8qCisJICoJVGhlIGNvZGUgYXNzdW1lcyBSNycgYW5kIGZyaWVuZHMgYXJlCisJICoJb2ZmLiBVc2Ugd3JpdGVfenNleHQoKSBmb3IgdGhlc2UgYW5kIGtlZXAKKwkgKgl0aGlzIGJpdCBjbGVhci4KKwkgKi8KKwkgCisJd3JpdGVfenNyZWcoJmRldi0+Y2hhbkEsIFIxNSwgMCk7CisJCQorCS8qCisJICoJQXQgdGhpcyBwb2ludCBpdCBsb29rcyBsaWtlIHRoZSBjaGlwIGlzIGJlaGF2aW5nCisJICovCisJIAorCW1lbWNweShkZXYtPmNoYW5BLnJlZ3MsIHJlZ19pbml0LCAxNik7CisJbWVtY3B5KGRldi0+Y2hhbkIucmVncywgcmVnX2luaXQgLDE2KTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl6ODUzMF9pbml0IC0gSW5pdGlhbGlzZSBhIFo4NTMwIGRldmljZQorICoJQGRldjogWjg1MzAgZGV2aWNlIHRvIGluaXRpYWxpc2UuCisgKgorICoJQ29uZmlndXJlIHVwIGEgWjg1MzAvWjg1QzMwIG9yIFo4NTIzMCBjaGlwLiBXZSBjaGVjayB0aGUgZGV2aWNlCisgKglpcyBwcmVzZW50LCBpZGVudGlmeSB0aGUgdHlwZSBhbmQgdGhlbiBwcm9ncmFtIGl0IHRvIGhvcGVmdWxseQorICoJa2VlcCBxdWl0ZSBhbmQgYmVoYXZlLiBUaGlzIG1hdHRlcnMgYSBsb3QsIGEgWjg1MzAgaW4gdGhlIHdyb25nCisgKglzdGF0ZSB3aWxsIHNvbWV0aW1lcyBnZXQgaW50byBzdHVwaWQgbW9kZXMgZ2VuZXJhdGluZyAxMEtoegorICoJaW50ZXJydXB0IHN0cmVhbXMgYW5kIHRoZSBsaWtlLgorICoKKyAqCVdlIHNldCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdXAgdG8gZGlzY2FyZCBhbnkgZXZlbnRzLCBpbiBjYXNlCisgKgl3ZSBnZXQgdGhlbSBkdXJpbmcgcmVzZXQgb3Igc2V0cC4KKyAqCisgKglSZXR1cm4gMCBmb3Igc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBwcm9ibGVtCisgKglpbiBlcnJubyBmb3JtLgorICovCisKK2ludCB6ODUzMF9pbml0KHN0cnVjdCB6ODUzMF9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwkvKiBTZXQgdXAgdGhlIGNoaXAgbGV2ZWwgbG9jayAqLworCXNwaW5fbG9ja19pbml0KCZkZXYtPmxvY2spOworCWRldi0+Y2hhbkEubG9jayA9ICZkZXYtPmxvY2s7CisJZGV2LT5jaGFuQi5sb2NrID0gJmRldi0+bG9jazsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlyZXQgPSBkb196ODUzMF9pbml0KGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK0VYUE9SVF9TWU1CT0woejg1MzBfaW5pdCk7CisKKy8qKgorICoJejg1MzBfc2h1dGRvd24gLSBTaHV0ZG93biBhIFo4NTMwIGRldmljZQorICoJQGRldjogVGhlIFo4NTMwIGNoaXAgdG8gc2h1dGRvd24KKyAqCisgKglXZSBzZXQgdGhlIGludGVycnVwdCBoYW5kbGVycyB0byBzaWxlbmNlIGFueSBpbnRlcnJ1cHRzLiBXZSB0aGVuIAorICoJcmVzZXQgdGhlIGNoaXAgYW5kIHdhaXQgMTAwdVMgdG8gYmUgc3VyZSB0aGUgcmVzZXQgY29tcGxldGVkLiBKdXN0CisgKglpbiBjYXNlIHRoZSBjYWxsZXIgdGhlbiB0cmllcyB0byBkbyBzdHVmZi4KKyAqCisgKglUaGlzIGlzIGNhbGxlZCB3aXRob3V0IHRoZSBsb2NrIGhlbGQKKyAqLworIAoraW50IHo4NTMwX3NodXRkb3duKHN0cnVjdCB6ODUzMF9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8qIFJlc2V0IHRoZSBjaGlwICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJZGV2LT5jaGFuQS5pcnFzPSZ6ODUzMF9ub3A7CisJZGV2LT5jaGFuQi5pcnFzPSZ6ODUzMF9ub3A7CisJd3JpdGVfenNyZWcoJmRldi0+Y2hhbkEsIFI5LCAweEMwKTsKKwkvKiBXZSBtdXN0IGxvY2sgdGhlIHVkZWxheSwgdGhlIGNoaXAgaXMgb2ZmbGltaXRzIGhlcmUgKi8KKwl1ZGVsYXkoMTAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9zaHV0ZG93bik7CisKKy8qKgorICoJejg1MzBfY2hhbm5lbF9sb2FkIC0gTG9hZCBjaGFubmVsIGRhdGEKKyAqCUBjOiBaODUzMCBjaGFubmVsIHRvIGNvbmZpZ3VyZQorICoJQHJ0YWJsZTogdGFibGUgb2YgcmVnaXN0ZXIsIHZhbHVlIHBhaXJzCisgKglGSVhNRTogaW9jdGwgdG8gYWxsb3cgdXNlciB1cGxvYWRlZCB0YWJsZXMKKyAqCisgKglMb2FkIGEgWjg1MzAgY2hhbm5lbCB1cCBmcm9tIHRoZSBzeXN0ZW0gZGF0YS4gV2UgdXNlICsxNiB0byAKKyAqCWluZGljYXRlIHRoZSAicHJpbWUiIHJlZ2lzdGVycy4gVGhlIHZhbHVlIDI1NSB0ZXJtaW5hdGVzIHRoZQorICoJdGFibGUuCisgKi8KKworaW50IHo4NTMwX2NoYW5uZWxfbG9hZChzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgdTggKnJ0YWJsZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoYy0+bG9jaywgZmxhZ3MpOworCisJd2hpbGUoKnJ0YWJsZSE9MjU1KQorCXsKKwkJaW50IHJlZz0qcnRhYmxlKys7CisJCWlmKHJlZz4weDBGKQorCQkJd3JpdGVfenNyZWcoYywgUjE1LCBjLT5yZWdzWzE1XXwxKTsKKwkJd3JpdGVfenNyZWcoYywgcmVnJjB4MEYsICpydGFibGUpOworCQlpZihyZWc+MHgwRikKKwkJCXdyaXRlX3pzcmVnKGMsIFIxNSwgYy0+cmVnc1sxNV0mfjEpOworCQljLT5yZWdzW3JlZ109KnJ0YWJsZSsrOworCX0KKwljLT5yeF9mdW5jdGlvbj16ODUzMF9udWxsX3J4OworCWMtPnNrYj1OVUxMOworCWMtPnR4X3NrYj1OVUxMOworCWMtPnR4X25leHRfc2tiPU5VTEw7CisJYy0+bXR1PTE1MDA7CisJYy0+bWF4PTA7CisJYy0+Y291bnQ9MDsKKwljLT5zdGF0dXM9cmVhZF96c3JlZyhjLCBSMCk7CisJYy0+c3luYz0xOworCXdyaXRlX3pzcmVnKGMsIFIzLCBjLT5yZWdzW1IzXXxSeEVOQUJMRSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9jaGFubmVsX2xvYWQpOworCisKKy8qKgorICoJejg1MzBfdHhfYmVnaW4gLSBCZWdpbiBwYWNrZXQgdHJhbnNtaXNzaW9uCisgKglAYzogVGhlIFo4NTMwIGNoYW5uZWwgdG8ga2ljaworICoKKyAqCVRoaXMgaXMgdGhlIHNwZWVkIHNlbnNpdGl2ZSBzaWRlIG9mIHRyYW5zbWlzc2lvbi4gSWYgd2UgYXJlIGNhbGxlZAorICoJYW5kIG5vIGJ1ZmZlciBpcyBiZWluZyB0cmFuc21pdHRlZCB3ZSBjb21tZW5jZSB0aGUgbmV4dCBidWZmZXIuIElmCisgKglub3RoaW5nIGlzIHF1ZXVlZCB3ZSBpZGxlIHRoZSBzeW5jLiAKKyAqCisgKglOb3RlOiBXZSBhcmUgaGFuZGxpbmcgdGhpcyBjb2RlIHBhdGggaW4gdGhlIGludGVycnVwdCBwYXRoLCBrZWVwIGl0CisgKglmYXN0IG9yIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4uCisgKgorICoJQ2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgdm9pZCB6ODUzMF90eF9iZWdpbihzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlmKGMtPnR4X3NrYikKKwkJcmV0dXJuOworCQkKKwljLT50eF9za2I9Yy0+dHhfbmV4dF9za2I7CisJYy0+dHhfbmV4dF9za2I9TlVMTDsKKwljLT50eF9wdHI9Yy0+dHhfbmV4dF9wdHI7CisJCisJaWYoYy0+dHhfc2tiPT1OVUxMKQorCXsKKwkJLyogSWRsZSBvbiAqLworCQlpZihjLT5kbWFfdHgpCisJCXsKKwkJCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJCQlkaXNhYmxlX2RtYShjLT50eGRtYSk7CisJCQkvKgorCQkJICoJQ2hlY2sgaWYgd2UgY3JhcHBlZCBvdXQuCisJCQkgKi8KKwkJCWlmKGdldF9kbWFfcmVzaWR1ZShjLT50eGRtYSkpCisJCQl7CisJCQkJYy0+c3RhdHMudHhfZHJvcHBlZCsrOworCQkJCWMtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQl9CisJCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkJfQorCQljLT50eGNvdW50PTA7CisJfQorCWVsc2UKKwl7CisJCWMtPnR4Y291bnQ9Yy0+dHhfc2tiLT5sZW47CisJCQorCQkKKwkJaWYoYy0+ZG1hX3R4KQorCQl7CisJCQkvKgorCQkJICoJRklYTUUuIERNQSBpcyBicm9rZW4gZm9yIHRoZSBvcmlnaW5hbCA4NTMwLAorCQkJICoJb24gdGhlIG9sZGVyIHBhcnRzIHdlIG5lZWQgdG8gc2V0IGEgZmxhZyBhbmQKKwkJCSAqCXdhaXQgZm9yIGEgZnVydGhlciBUWCBpbnRlcnJ1cHQgdG8gZmlyZSB0aGlzCisJCQkgKglzdGFnZSBvZmYJCisJCQkgKi8KKwkJCSAKKwkJCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJCQlkaXNhYmxlX2RtYShjLT50eGRtYSk7CisKKwkJCS8qCisJCQkgKglUaGVzZSB0d28gYXJlIG5lZWRlZCBieSB0aGUgODUzMC84NUMzMAorCQkJICoJYW5kIG11c3QgYmUgaXNzdWVkIHdoZW4gaWRsaW5nLgorCQkJICovCisJCQkgCisJCQlpZihjLT5kZXYtPnR5cGUhPVo4NTIzMCkKKwkJCXsKKwkJCQl3cml0ZV96c2N0cmwoYywgUkVTX1R4X0NSQyk7CisJCQkJd3JpdGVfenNjdHJsKGMsIFJFU19FT01fTCk7CisJCQl9CQorCQkJd3JpdGVfenNyZWcoYywgUjEwLCBjLT5yZWdzWzEwXSZ+QUJVTkRFUik7CisJCQljbGVhcl9kbWFfZmYoYy0+dHhkbWEpOworCQkJc2V0X2RtYV9hZGRyKGMtPnR4ZG1hLCB2aXJ0X3RvX2J1cyhjLT50eF9wdHIpKTsKKwkJCXNldF9kbWFfY291bnQoYy0+dHhkbWEsIGMtPnR4Y291bnQpOworCQkJZW5hYmxlX2RtYShjLT50eGRtYSk7CisJCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkJCXdyaXRlX3pzY3RybChjLCBSRVNfRU9NX0wpOworCQkJd3JpdGVfenNyZWcoYywgUjUsIGMtPnJlZ3NbUjVdfFR4RU5BQik7CisJCX0KKwkJZWxzZQorCQl7CisKKwkJCS8qIEFCVU5ERVIgb2ZmICovCisJCQl3cml0ZV96c3JlZyhjLCBSMTAsIGMtPnJlZ3NbMTBdKTsKKwkJCXdyaXRlX3pzY3RybChjLCBSRVNfVHhfQ1JDKTsKKwkKKwkJCXdoaWxlKGMtPnR4Y291bnQgJiYgKHJlYWRfenNyZWcoYyxSMCkmVHhfQlVGX0VNUCkpCisJCQl7CQkKKwkJCQl3cml0ZV96c3JlZyhjLCBSOCwgKmMtPnR4X3B0cisrKTsKKwkJCQljLT50eGNvdW50LS07CisJCQl9CisKKwkJfQorCX0KKwkvKgorCSAqCVNpbmNlIHdlIGVtcHRpZWQgdHhfc2tiIHdlIGNhbiBhc2sgZm9yIG1vcmUKKwkgKi8KKwluZXRpZl93YWtlX3F1ZXVlKGMtPm5ldGRldmljZSk7Cit9CisKKy8qKgorICoJejg1MzBfdHhfZG9uZSAtIFRYIGNvbXBsZXRlIGNhbGxiYWNrCisgKglAYzogVGhlIGNoYW5uZWwgdGhhdCBjb21wbGV0ZWQgYSB0cmFuc21pdC4KKyAqCisgKglUaGlzIGlzIGNhbGxlZCB3aGVuIHdlIGNvbXBsZXRlIGEgcGFja2V0IHNlbmQuIFdlIHdha2UgdGhlIHF1ZXVlLAorICoJc3RhcnQgdGhlIG5leHQgcGFja2V0IGdvaW5nIGFuZCB0aGVuIGZyZWUgdGhlIGJ1ZmZlciBvZiB0aGUgZXhpc3RpbmcKKyAqCXBhY2tldC4gVGhpcyBjb2RlIGlzIGZhaXJseSB0aW1pbmcgc2Vuc2l0aXZlLgorICoKKyAqCUNhbGxlZCB3aXRoIHRoZSByZWdpc3RlciBsb2NrIGhlbGQuCisgKi8gCisgCitzdGF0aWMgdm9pZCB6ODUzMF90eF9kb25lKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiBBY3R1YWxseSB0aGlzIGNhbiBoYXBwZW4uKi8KKwlpZihjLT50eF9za2I9PU5VTEwpCisJCXJldHVybjsKKworCXNrYj1jLT50eF9za2I7CisJYy0+dHhfc2tiPU5VTEw7CisJejg1MzBfdHhfYmVnaW4oYyk7CisJYy0+c3RhdHMudHhfcGFja2V0cysrOworCWMtPnN0YXRzLnR4X2J5dGVzKz1za2ItPmxlbjsKKwlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworfQorCisvKioKKyAqCXo4NTMwX251bGxfcnggLSBEaXNjYXJkIGEgcGFja2V0CisgKglAYzogVGhlIGNoYW5uZWwgdGhlIHBhY2tldCBhcnJpdmVkIG9uCisgKglAc2tiOiBUaGUgYnVmZmVyCisgKgorICoJV2UgcG9pbnQgdGhlIHJlY2VpdmUgaGFuZGxlciBhdCB0aGlzIGZ1bmN0aW9uIHdoZW4gaWRsZS4gSW5zdGVhZAorICoJb2Ygc3luY3BwcCBwcm9jZXNzaW5nIHRoZSBmcmFtZXMgd2UgZ2V0IHRvIHRocm93IHRoZW0gYXdheS4KKyAqLworIAordm9pZCB6ODUzMF9udWxsX3J4KHN0cnVjdCB6ODUzMF9jaGFubmVsICpjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWRldl9rZnJlZV9za2JfYW55KHNrYik7Cit9CisKK0VYUE9SVF9TWU1CT0woejg1MzBfbnVsbF9yeCk7CisKKy8qKgorICoJejg1MzBfcnhfZG9uZSAtIFJlY2VpdmUgY29tcGxldGlvbiBjYWxsYmFjaworICoJQGM6IFRoZSBjaGFubmVsIHRoYXQgY29tcGxldGVkIGEgcmVjZWl2ZQorICoKKyAqCUEgbmV3IHBhY2tldCBpcyBjb21wbGV0ZS4gT3VyIGdvYWwgaGVyZSBpcyB0byBnZXQgYmFjayBpbnRvIHJlY2VpdmUKKyAqCW1vZGUgYXMgZmFzdCBhcyBwb3NzaWJsZS4gT24gdGhlIFo4NTIzMCB3ZSBjb3VsZCBjaGFuZ2UgdG8gdXNpbmcKKyAqCUVTQ0MgbW9kZSwgYnV0IG9uIHRoZSBvbGRlciBjaGlwcyB3ZSBoYXZlIG5vIGNob2ljZS4gV2UgZmxpcCB0byB0aGUKKyAqCW5ldyBidWZmZXIgaW1tZWRpYXRlbHkgaW4gRE1BIG1vZGUgc28gdGhhdCB0aGUgRE1BIG9mIHRoZSBuZXh0CisgKglmcmFtZSBjYW4gb2NjdXIgd2hpbGUgd2UgYXJlIGNvcHlpbmcgdGhlIHByZXZpb3VzIGJ1ZmZlciB0byBhbiBza19idWZmCisgKgorICoJQ2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZAorICovCisgCitzdGF0aWMgdm9pZCB6ODUzMF9yeF9kb25lKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGN0OworCQorCS8qCisJICoJSXMgb3VyIHJlY2VpdmUgZW5naW5lIGluIERNQSBtb2RlCisJICovCisJIAorCWlmKGMtPnJ4ZG1hX29uKQorCXsKKwkJLyoKKwkJICoJU2F2ZSB0aGUgcmVhZHkgc3RhdGUgYW5kIHRoZSBidWZmZXIgY3VycmVudGx5CisJCSAqCWJlaW5nIHVzZWQgYXMgdGhlIERNQSB0YXJnZXQKKwkJICovCisJCSAKKwkJaW50IHJlYWR5PWMtPmRtYV9yZWFkeTsKKwkJdW5zaWduZWQgY2hhciAqcnhiPWMtPnJ4X2J1ZltjLT5kbWFfbnVtXTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCisJCS8qCisJCSAqCUNvbXBsZXRlIHRoaXMgRE1BLiBOZWNjZXNzYXJ5IHRvIGZpbmQgdGhlIGxlbmd0aAorCQkgKi8JCQorCQkgCisJCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJCQorCQlkaXNhYmxlX2RtYShjLT5yeGRtYSk7CisJCWNsZWFyX2RtYV9mZihjLT5yeGRtYSk7CisJCWMtPnJ4ZG1hX29uPTA7CisJCWN0PWMtPm10dS1nZXRfZG1hX3Jlc2lkdWUoYy0+cnhkbWEpOworCQlpZihjdDwwKQorCQkJY3Q9MjsJLyogU2hpdCBoYXBwZW5zLi4gKi8KKwkJYy0+ZG1hX3JlYWR5PTA7CisJCQorCQkvKgorCQkgKglOb3JtYWwgY2FzZTogdGhlIG90aGVyIHNsb3QgaXMgZnJlZSwgc3RhcnQgdGhlIG5leHQgRE1BCisJCSAqCWludG8gaXQgaW1tZWRpYXRlbHkuCisJCSAqLworCQkgCisJCWlmKHJlYWR5KQorCQl7CisJCQljLT5kbWFfbnVtXj0xOworCQkJc2V0X2RtYV9tb2RlKGMtPnJ4ZG1hLCBETUFfTU9ERV9SRUFEfDB4MTApOworCQkJc2V0X2RtYV9hZGRyKGMtPnJ4ZG1hLCB2aXJ0X3RvX2J1cyhjLT5yeF9idWZbYy0+ZG1hX251bV0pKTsKKwkJCXNldF9kbWFfY291bnQoYy0+cnhkbWEsIGMtPm10dSk7CisJCQljLT5yeGRtYV9vbiA9IDE7CisJCQllbmFibGVfZG1hKGMtPnJ4ZG1hKTsKKwkJCS8qIFN0b3AgYW55IGZyYW1lcyB0aGF0IHdlIG1pc3NlZCB0aGUgaGVhZCBvZiAKKwkJCSAgIGZyb20gcGFzc2luZyAqLworCQkJd3JpdGVfenNyZWcoYywgUjAsIFJFU19SeF9DUkMpOworCQl9CisJCWVsc2UKKwkJCS8qIENhbid0IG9jY3VyIGFzIHdlIGRvbnQgcmVlbmFibGUgdGhlIERNQSBpcnEgdW50aWwKKwkJCSAgIGFmdGVyIHRoZSBmbGlwIGlzIGRvbmUgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBETUEgZmxpcCBvdmVycnVuIVxuIiwgYy0+bmV0ZGV2aWNlLT5uYW1lKTsKKwkJCQorCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkJCisJCS8qCisJCSAqCVNob3ZlIHRoZSBvbGQgYnVmZmVyIGludG8gYW4gc2tfYnVmZi4gV2UgY2FuJ3QgRE1BCisJCSAqCWRpcmVjdGx5IGludG8gb25lIG9uIGEgUEMgLSBpdCBtaWdodCBiZSBhYm92ZSB0aGUgMTZNYgorCQkgKglib3VuZGFyeS4gT3B0aW1pc2F0aW9uIC0gd2UgY291bGQgY2hlY2sgdG8gc2VlIGlmIHdlCisJCSAqCWNhbiBhdm9pZCB0aGUgY29weS4gT3B0aW1pc2F0aW9uIDIgLSBtYWtlIHRoZSBtZW1jcHkKKwkJICoJYSBjb3B5Y2hlY2tzdW0uCisJCSAqLworCQkgCisJCXNrYj1kZXZfYWxsb2Nfc2tiKGN0KTsKKwkJaWYoc2tiPT1OVUxMKQorCQl7CisJCQljLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUuXG4iLCBjLT5uZXRkZXZpY2UtPm5hbWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJc2tiX3B1dChza2IsIGN0KTsKKwkJCW1lbWNweShza2ItPmRhdGEsIHJ4YiwgY3QpOworCQkJYy0+c3RhdHMucnhfcGFja2V0cysrOworCQkJYy0+c3RhdHMucnhfYnl0ZXMrPWN0OworCQl9CisJCWMtPmRtYV9yZWFkeT0xOworCX0KKwllbHNlCisJeworCQlSVF9MT0NLOwkKKwkJc2tiPWMtPnNrYjsKKwkJCisJCS8qCisJCSAqCVRoZSBnYW1lIHdlIHBsYXkgZm9yIG5vbiBETUEgaXMgc2ltaWxhci4gV2Ugd2FudCB0bworCQkgKglnZXQgdGhlIGNvbnRyb2xsZXIgc2V0IHVwIGZvciB0aGUgbmV4dCBwYWNrZXQgYXMgZmFzdAorCQkgKglhcyBwb3NzaWJsZS4gV2UgcG90ZW50aWFsbHkgb25seSBoYXZlIG9uZSBieXRlICsgdGhlCisJCSAqCWZpZm8gbGVuZ3RoIGZvciB0aGlzLiBUaHVzIHdlIHdhbnQgdG8gZmxpcCB0byB0aGUgbmV3CisJCSAqCWJ1ZmZlciBhbmQgdGhlbiBtZXNzIGFyb3VuZCBjb3B5aW5nIGFuZCBhbGxvY2F0aW5nCisJCSAqCXRoaW5ncy4gRm9yIHRoZSBjdXJyZW50IGNhc2UgaXQgZG9lc24ndCBtYXR0ZXIgYnV0CisJCSAqCWlmIHlvdSBidWlsZCBhIHN5c3RlbSB3aGVyZSB0aGUgc3luYyBpcnEgaXNudCBibG9ja2VkCisJCSAqCWJ5IHRoZSBrZXJuZWwgSVJRIGRpc2FibGUgdGhlbiB5b3UgbmVlZCBvbmx5IGJsb2NrIHRoZQorCQkgKglzeW5jIElSUSBmb3IgdGhlIFJUX0xPQ0sgYXJlYS4KKwkJICoJCisJCSAqLworCQljdD1jLT5jb3VudDsKKwkJCisJCWMtPnNrYiA9IGMtPnNrYjI7CisJCWMtPmNvdW50ID0gMDsKKwkJYy0+bWF4ID0gYy0+bXR1OworCQlpZihjLT5za2IpCisJCXsKKwkJCWMtPmRwdHIgPSBjLT5za2ItPmRhdGE7CisJCQljLT5tYXggPSBjLT5tdHU7CisJCX0KKwkJZWxzZQorCQl7CisJCQljLT5jb3VudD0gMDsKKwkJCWMtPm1heCA9IDA7CisJCX0KKwkJUlRfVU5MT0NLOworCisJCWMtPnNrYjIgPSBkZXZfYWxsb2Nfc2tiKGMtPm10dSk7CisJCWlmKGMtPnNrYjI9PU5VTEwpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbWVtb3J5IHNxdWVlemUuXG4iLAorCQkJCWMtPm5ldGRldmljZS0+bmFtZSk7CisJCWVsc2UKKwkJeworCQkJc2tiX3B1dChjLT5za2IyLGMtPm10dSk7CisJCX0KKwkJYy0+c3RhdHMucnhfcGFja2V0cysrOworCQljLT5zdGF0cy5yeF9ieXRlcys9Y3Q7CisJCQorCX0KKwkvKgorCSAqCUlmIHdlIHJlY2VpdmVkIGEgZnJhbWUgd2UgbXVzdCBub3cgcHJvY2VzcyBpdC4KKwkgKi8KKwlpZihza2IpCisJeworCQlza2JfdHJpbShza2IsIGN0KTsKKwkJYy0+cnhfZnVuY3Rpb24oYyxza2IpOworCX0KKwllbHNlCisJeworCQljLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IExvc3QgYSBmcmFtZVxuIiwgYy0+bmV0ZGV2aWNlLT5uYW1lKTsKKwl9Cit9CisKKy8qKgorICoJc3BhbnNfYm91bmRhcnkgLSBDaGVjayBhIHBhY2tldCBjYW4gYmUgSVNBIERNQSdkCisgKglAc2tiOiBUaGUgYnVmZmVyIHRvIGNoZWNrCisgKgorICoJUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXIgY3Jvc3MgYSBETUEgYm91bmRhcnkgb24gYSBQQy4gVGhlIHBvb3IKKyAqCXRoaW5nIGNhbiBvbmx5IERNQSB3aXRoaW4gYSA2NEsgYmxvY2sgbm90IGFjcm9zcyB0aGUgZWRnZXMgb2YgaXQuCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgaW50IHNwYW5zX2JvdW5kYXJ5KHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgbG9uZyBhPSh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YTsKKwlhXj0oYStza2ItPmxlbik7CisJaWYoYSYweDAwMDEwMDAwKQkvKiBJZiB0aGUgNjRLIGJpdCBpcyBkaWZmZXJlbnQuLiAqLworCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl6ODUzMF9xdWV1ZV94bWl0IC0gUXVldWUgYSBwYWNrZXQKKyAqCUBjOiBUaGUgY2hhbm5lbCB0byB1c2UKKyAqCUBza2I6IFRoZSBwYWNrZXQgdG8ga2ljayBkb3duIHRoZSBjaGFubmVsCisgKgorICoJUXVldWUgYSBwYWNrZXQgZm9yIHRyYW5zbWlzc2lvbi4gQmVjYXVzZSB3ZSBoYXZlIHJhdGhlcgorICoJaGFyZCB0byBoaXQgaW50ZXJydXB0IGxhdGVuY2llcyBmb3IgdGhlIFo4NTIzMCBwZXIgcGFja2V0IAorICoJZXZlbiBpbiBETUEgbW9kZSB3ZSBkbyB0aGUgZmxpcCB0byBETUEgYnVmZmVyIGlmIG5lZWRlZCBoZXJlCisgKglub3QgaW4gdGhlIElSUS4KKyAqCisgKglDYWxsZWQgZnJvbSB0aGUgbmV0d29yayBjb2RlLiBUaGUgbG9jayBpcyBub3QgaGVsZCBhdCB0aGlzIAorICoJcG9pbnQuCisgKi8KKworaW50IHo4NTMwX3F1ZXVlX3htaXQoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwluZXRpZl9zdG9wX3F1ZXVlKGMtPm5ldGRldmljZSk7CisJaWYoYy0+dHhfbmV4dF9za2IpCisJeworCQlyZXR1cm4gMTsKKwl9CisJCisJLyogUEMgU1BFQ0lGSUMgLSBETUEgbGltaXRzICovCisJCisJLyoKKwkgKglJZiB3ZSB3aWxsIERNQSB0aGUgdHJhbnNtaXQgYW5kIGl0cyBnb25lIG92ZXIgdGhlIElTQSBidXMKKwkgKglsaW1pdCwgdGhlbiBjb3B5IHRvIHRoZSBmbGlwIGJ1ZmZlcgorCSAqLworCSAKKwlpZihjLT5kbWFfdHggJiYgKCh1bnNpZ25lZCBsb25nKSh2aXJ0X3RvX2J1cyhza2ItPmRhdGErc2tiLT5sZW4pKT49MTYqMTAyNCoxMDI0IHx8IHNwYW5zX2JvdW5kYXJ5KHNrYikpKQorCXsKKwkJLyogCisJCSAqCVNlbmQgdGhlIGZsaXAgYnVmZmVyLCBhbmQgZmxpcCB0aGUgZmxpcHB5IGJpdC4KKwkJICoJV2UgZG9uJ3QgY2FyZSB3aGljaCBpcyB1c2VkIHdoZW4ganVzdCBzbyBsb25nIGFzCisJCSAqCXdlIG5ldmVyIHVzZSB0aGUgc2FtZSBidWZmZXIgdHdpY2UgaW4gYSByb3cuIFNpbmNlCisJCSAqCW9ubHkgb25lIGJ1ZmZlciBjYW4gYmUgZ29pbmcgb3V0IGF0IGEgdGltZSB0aGUgb3RoZXIKKwkJICoJaGFzIHRvIGJlIHNhZmUuCisJCSAqLworCQljLT50eF9uZXh0X3B0cj1jLT50eF9kbWFfYnVmW2MtPnR4X2RtYV91c2VkXTsKKwkJYy0+dHhfZG1hX3VzZWRePTE7CS8qIEZsaXAgdGVtcCBidWZmZXIgKi8KKwkJbWVtY3B5KGMtPnR4X25leHRfcHRyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwl9CisJZWxzZQorCQljLT50eF9uZXh0X3B0cj1za2ItPmRhdGE7CQorCVJUX0xPQ0s7CisJYy0+dHhfbmV4dF9za2I9c2tiOworCVJUX1VOTE9DSzsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZShjLT5sb2NrLCBmbGFncyk7CisJejg1MzBfdHhfYmVnaW4oYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjLT5sb2NrLCBmbGFncyk7CisJCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woejg1MzBfcXVldWVfeG1pdCk7CisKKy8qKgorICoJejg1MzBfZ2V0X3N0YXRzIC0gR2V0IG5ldHdvcmsgc3RhdGlzdGljcworICoJQGM6IFRoZSBjaGFubmVsIHRvIHVzZQorICoKKyAqCUdldCB0aGUgc3RhdGlzdGljcyBibG9jay4gV2Uga2VlcCB0aGUgc3RhdGlzdGljcyBpbiBzb2Z0d2FyZSBhcworICoJdGhlIGNoaXAgZG9lc24ndCBkbyBpdCBmb3IgdXMuCisgKgorICoJTG9ja2luZyBpcyBpZ25vcmVkIGhlcmUgLSB3ZSBjb3VsZCBsb2NrIGZvciBhIGNvcHkgYnV0IGl0cworICoJbm90IGxpa2VseSB0byBiZSB0aGF0IGJpZyBhbiBpc3N1ZQorICovCisgCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqejg1MzBfZ2V0X3N0YXRzKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXJldHVybiAmYy0+c3RhdHM7Cit9CisKK0VYUE9SVF9TWU1CT0woejg1MzBfZ2V0X3N0YXRzKTsKKworLyoKKyAqCU1vZHVsZSBzdXBwb3J0CisgKi8KK3N0YXRpYyBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPSBLRVJOX0lORk8gIkdlbmVyaWMgWjg1QzMwL1o4NTIzMCBpbnRlcmZhY2UgZHJpdmVyIHYwLjAyXG4iOworCitzdGF0aWMgaW50IF9faW5pdCB6ODUyMzBfaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlwcmludGsoYmFubmVyKTsKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KHo4NTIzMF9pbml0X2RyaXZlcik7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB6ODUyMzBfY2xlYW51cF9kcml2ZXIodm9pZCkKK3sKK30KK21vZHVsZV9leGl0KHo4NTIzMF9jbGVhbnVwX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlJlZCBIYXQgSW5jLiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJaODV4MzAgc3luY2hyb25vdXMgZHJpdmVyIGNvcmUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuaCBiL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2U1MzIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3o4NTIzMC5oCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICoJRGVzY3JpcHRpb24gb2YgWjg1MzAgWjg1QzMwIGFuZCBaODUyMzAgY29tbXVuaWNhdGlvbnMgY2hpcHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICogQ29weXJpZ2h0IChDKSAxOTk4IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKi8KKworI2lmbmRlZiBfWjg1MzBfSAorI2RlZmluZSBfWjg1MzBfSAorCisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKy8qIENvbnZlcnNpb24gcm91dGluZXMgdG8vZnJvbSBicmcgdGltZSBjb25zdGFudHMgZnJvbS90byBiaXRzCisgKiBwZXIgc2Vjb25kLgorICovCisjZGVmaW5lIEJSR19UT19CUFMoYnJnLCBmcmVxKSAoKGZyZXEpIC8gMiAvICgoYnJnKSArIDIpKQorI2RlZmluZSBCUFNfVE9fQlJHKGJwcywgZnJlcSkgKCgoKGZyZXEpICsgKGJwcykpIC8gKDIgKiAoYnBzKSkpIC0gMikKKworLyogVGhlIFppbG9nIHJlZ2lzdGVyIHNldCAqLworCisjZGVmaW5lCUZMQUcJMHg3ZQorCisvKiBXcml0ZSBSZWdpc3RlciAwICovCisjZGVmaW5lCVIwCTAJCS8qIFJlZ2lzdGVyIHNlbGVjdHMgKi8KKyNkZWZpbmUJUjEJMQorI2RlZmluZQlSMgkyCisjZGVmaW5lCVIzCTMKKyNkZWZpbmUJUjQJNAorI2RlZmluZQlSNQk1CisjZGVmaW5lCVI2CTYKKyNkZWZpbmUJUjcJNworI2RlZmluZQlSOAk4CisjZGVmaW5lCVI5CTkKKyNkZWZpbmUJUjEwCTEwCisjZGVmaW5lCVIxMQkxMQorI2RlZmluZQlSMTIJMTIKKyNkZWZpbmUJUjEzCTEzCisjZGVmaW5lCVIxNAkxNAorI2RlZmluZQlSMTUJMTUKKworI2RlZmluZSBSUFJJTUUJMTYJCS8qIEluZGljYXRlIGEgcHJpbWUgcmVnaXN0ZXIgYWNjZXNzIG9uIDIzMCAqLworCisjZGVmaW5lCU5VTExDT0RFCTAJLyogTnVsbCBDb2RlICovCisjZGVmaW5lCVBPSU5UX0hJR0gJMHg4CS8qIFNlbGVjdCB1cHBlciBoYWxmIG9mIHJlZ2lzdGVycyAqLworI2RlZmluZQlSRVNfRVhUX0lOVAkweDEwCS8qIFJlc2V0IEV4dC4gU3RhdHVzIEludGVycnVwdHMgKi8KKyNkZWZpbmUJU0VORF9BQk9SVAkweDE4CS8qIEhETEMgQWJvcnQgKi8KKyNkZWZpbmUJUkVTX1J4SU5UX0ZDCTB4MjAJLyogUmVzZXQgUnhJTlQgb24gRmlyc3QgQ2hhcmFjdGVyICovCisjZGVmaW5lCVJFU19UeF9QCTB4MjgJLyogUmVzZXQgVHhJTlQgUGVuZGluZyAqLworI2RlZmluZQlFUlJfUkVTCQkweDMwCS8qIEVycm9yIFJlc2V0ICovCisjZGVmaW5lCVJFU19IX0lVUwkweDM4CS8qIFJlc2V0IGhpZ2hlc3QgSVVTICovCisKKyNkZWZpbmUJUkVTX1J4X0NSQwkweDQwCS8qIFJlc2V0IFJ4IENSQyBDaGVja2VyICovCisjZGVmaW5lCVJFU19UeF9DUkMJMHg4MAkvKiBSZXNldCBUeCBDUkMgQ2hlY2tlciAqLworI2RlZmluZQlSRVNfRU9NX0wJMHhDMAkvKiBSZXNldCBFT00gbGF0Y2ggKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMSAqLworCisjZGVmaW5lCUVYVF9JTlRfRU5BQgkweDEJLyogRXh0IEludCBFbmFibGUgKi8KKyNkZWZpbmUJVHhJTlRfRU5BQgkweDIJLyogVHggSW50IEVuYWJsZSAqLworI2RlZmluZQlQQVJfU1BFQwkweDQJLyogUGFyaXR5IGlzIHNwZWNpYWwgY29uZGl0aW9uICovCisKKyNkZWZpbmUJUnhJTlRfRElTQUIJMAkvKiBSeCBJbnQgRGlzYWJsZSAqLworI2RlZmluZQlSeElOVF9GQ0VSUgkweDgJLyogUnggSW50IG9uIEZpcnN0IENoYXJhY3RlciBPbmx5IG9yIEVycm9yICovCisjZGVmaW5lCUlOVF9BTExfUngJMHgxMAkvKiBJbnQgb24gYWxsIFJ4IENoYXJhY3RlcnMgb3IgZXJyb3IgKi8KKyNkZWZpbmUJSU5UX0VSUl9SeAkweDE4CS8qIEludCBvbiBlcnJvciBvbmx5ICovCisKKyNkZWZpbmUJV1RfUkRZX1JUCTB4MjAJLyogV2FpdC9SZWFkeSBvbiBSL1QgKi8KKyNkZWZpbmUJV1RfRk5fUkRZRk4JMHg0MAkvKiBXYWl0L0ZOL1JlYWR5IEZOICovCisjZGVmaW5lCVdUX1JEWV9FTkFCCTB4ODAJLyogV2FpdC9SZWFkeSBFbmFibGUgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgIzIgKEludGVycnVwdCBWZWN0b3IpICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDMgKi8KKworI2RlZmluZQlSeEVOQUJMRQkweDEJLyogUnggRW5hYmxlICovCisjZGVmaW5lCVNZTkNfTF9JTkgJMHgyCS8qIFN5bmMgQ2hhcmFjdGVyIExvYWQgSW5oaWJpdCAqLworI2RlZmluZQlBRERfU00JCTB4NAkvKiBBZGRyZXNzIFNlYXJjaCBNb2RlIChTRExDKSAqLworI2RlZmluZQlSeENSQ19FTkFCCTB4OAkvKiBSeCBDUkMgRW5hYmxlICovCisjZGVmaW5lCUVOVF9ITQkJMHgxMAkvKiBFbnRlciBIdW50IE1vZGUgKi8KKyNkZWZpbmUJQVVUT19FTkFCCTB4MjAJLyogQXV0byBFbmFibGVzICovCisjZGVmaW5lCVJ4NQkJMHgwCS8qIFJ4IDUgQml0cy9DaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUng3CQkweDQwCS8qIFJ4IDcgQml0cy9DaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUng2CQkweDgwCS8qIFJ4IDYgQml0cy9DaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUng4CQkweGMwCS8qIFJ4IDggQml0cy9DaGFyYWN0ZXIgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgNCAqLworCisjZGVmaW5lCVBBUl9FTkEJCTB4MQkvKiBQYXJpdHkgRW5hYmxlICovCisjZGVmaW5lCVBBUl9FVkVOCTB4MgkvKiBQYXJpdHkgRXZlbi9PZGQqICovCisKKyNkZWZpbmUJU1lOQ19FTkFCCTAJLyogU3luYyBNb2RlcyBFbmFibGUgKi8KKyNkZWZpbmUJU0IxCQkweDQJLyogMSBzdG9wIGJpdC9jaGFyICovCisjZGVmaW5lCVNCMTUJCTB4OAkvKiAxLjUgc3RvcCBiaXRzL2NoYXIgKi8KKyNkZWZpbmUJU0IyCQkweGMJLyogMiBzdG9wIGJpdHMvY2hhciAqLworCisjZGVmaW5lCU1PTlNZTkMJCTAJLyogOCBCaXQgU3luYyBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUJQklTWU5DCQkweDEwCS8qIDE2IGJpdCBzeW5jIGNoYXJhY3RlciAqLworI2RlZmluZQlTRExDCQkweDIwCS8qIFNETEMgTW9kZSAoMDExMTExMTAgU3luYyBGbGFnKSAqLworI2RlZmluZQlFWFRTWU5DCQkweDMwCS8qIEV4dGVybmFsIFN5bmMgTW9kZSAqLworCisjZGVmaW5lCVgxQ0xLCQkweDAJLyogeDEgY2xvY2sgbW9kZSAqLworI2RlZmluZQlYMTZDTEsJCTB4NDAJLyogeDE2IGNsb2NrIG1vZGUgKi8KKyNkZWZpbmUJWDMyQ0xLCQkweDgwCS8qIHgzMiBjbG9jayBtb2RlICovCisjZGVmaW5lCVg2NENMSwkJMHhDMAkvKiB4NjQgY2xvY2sgbW9kZSAqLworCisvKiBXcml0ZSBSZWdpc3RlciA1ICovCisKKyNkZWZpbmUJVHhDUkNfRU5BQgkweDEJLyogVHggQ1JDIEVuYWJsZSAqLworI2RlZmluZQlSVFMJCTB4MgkvKiBSVFMgKi8KKyNkZWZpbmUJU0RMQ19DUkMJMHg0CS8qIFNETEMvQ1JDLTE2ICovCisjZGVmaW5lCVR4RU5BQgkJMHg4CS8qIFR4IEVuYWJsZSAqLworI2RlZmluZQlTTkRfQlJLCQkweDEwCS8qIFNlbmQgQnJlYWsgKi8KKyNkZWZpbmUJVHg1CQkweDAJLyogVHggNSBiaXRzIChvciBsZXNzKS9jaGFyYWN0ZXIgKi8KKyNkZWZpbmUJVHg3CQkweDIwCS8qIFR4IDcgYml0cy9jaGFyYWN0ZXIgKi8KKyNkZWZpbmUJVHg2CQkweDQwCS8qIFR4IDYgYml0cy9jaGFyYWN0ZXIgKi8KKyNkZWZpbmUJVHg4CQkweDYwCS8qIFR4IDggYml0cy9jaGFyYWN0ZXIgKi8KKyNkZWZpbmUJRFRSCQkweDgwCS8qIERUUiAqLworCisvKiBXcml0ZSBSZWdpc3RlciA2IChTeW5jIGJpdHMgMC03L1NETEMgQWRkcmVzcyBGaWVsZCkgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgNyAoU3luYyBiaXRzIDgtMTUvU0RMQyAwMTExMTExMCkgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgOCAodHJhbnNtaXQgYnVmZmVyKSAqLworCisvKiBXcml0ZSBSZWdpc3RlciA5IChNYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wpICovCisjZGVmaW5lCVZJUwkxCS8qIFZlY3RvciBJbmNsdWRlcyBTdGF0dXMgKi8KKyNkZWZpbmUJTlYJMgkvKiBObyBWZWN0b3IgKi8KKyNkZWZpbmUJRExDCTQJLyogRGlzYWJsZSBMb3dlciBDaGFpbiAqLworI2RlZmluZQlNSUUJOAkvKiBNYXN0ZXIgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZQlTVEFUSEkJMHgxMAkvKiBTdGF0dXMgaGlnaCAqLworI2RlZmluZQlOT1JFU0VUCTAJLyogTm8gcmVzZXQgb24gd3JpdGUgdG8gUjkgKi8KKyNkZWZpbmUJQ0hSQgkweDQwCS8qIFJlc2V0IGNoYW5uZWwgQiAqLworI2RlZmluZQlDSFJBCTB4ODAJLyogUmVzZXQgY2hhbm5lbCBBICovCisjZGVmaW5lCUZIV1JFUwkweGMwCS8qIEZvcmNlIGhhcmR3YXJlIHJlc2V0ICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDEwIChtaXNjIGNvbnRyb2wgYml0cykgKi8KKyNkZWZpbmUJQklUNgkxCS8qIDYgYml0LzhiaXQgc3luYyAqLworI2RlZmluZQlMT09QTU9ERSAyCS8qIFNETEMgTG9vcCBtb2RlICovCisjZGVmaW5lCUFCVU5ERVIJNAkvKiBBYm9ydC9mbGFnIG9uIFNETEMgeG1pdCB1bmRlcnJ1biAqLworI2RlZmluZQlNQVJLSURMRSA4CS8qIE1hcmsvZmxhZyBvbiBpZGxlICovCisjZGVmaW5lCUdBT1AJMHgxMAkvKiBHbyBhY3RpdmUgb24gcG9sbCAqLworI2RlZmluZQlOUloJMAkvKiBOUlogbW9kZSAqLworI2RlZmluZQlOUlpJCTB4MjAJLyogTlJaSSBtb2RlICovCisjZGVmaW5lCUZNMQkweDQwCS8qIEZNMSAodHJhbnNpdGlvbiA9IDEpICovCisjZGVmaW5lCUZNMAkweDYwCS8qIEZNMCAodHJhbnNpdGlvbiA9IDApICovCisjZGVmaW5lCUNSQ1BTCTB4ODAJLyogQ1JDIFByZXNldCBJL08gKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMTEgKENsb2NrIE1vZGUgY29udHJvbCkgKi8KKyNkZWZpbmUJVFJ4Q1hUCTAJLyogVFJ4QyA9IFh0YWwgb3V0cHV0ICovCisjZGVmaW5lCVRSeENUQwkxCS8qIFRSeEMgPSBUcmFuc21pdCBjbG9jayAqLworI2RlZmluZQlUUnhDQlIJMgkvKiBUUnhDID0gQlIgR2VuZXJhdG9yIE91dHB1dCAqLworI2RlZmluZQlUUnhDRFAJMwkvKiBUUnhDID0gRFBMTCBvdXRwdXQgKi8KKyNkZWZpbmUJVFJ4Q09JCTQJLyogVFJ4QyBPL0kgKi8KKyNkZWZpbmUJVENSVHhDUAkwCS8qIFRyYW5zbWl0IGNsb2NrID0gUlR4QyBwaW4gKi8KKyNkZWZpbmUJVENUUnhDUAk4CS8qIFRyYW5zbWl0IGNsb2NrID0gVFJ4QyBwaW4gKi8KKyNkZWZpbmUJVENCUgkweDEwCS8qIFRyYW5zbWl0IGNsb2NrID0gQlIgR2VuZXJhdG9yIG91dHB1dCAqLworI2RlZmluZQlUQ0RQTEwJMHgxOAkvKiBUcmFuc21pdCBjbG9jayA9IERQTEwgb3V0cHV0ICovCisjZGVmaW5lCVJDUlR4Q1AJMAkvKiBSZWNlaXZlIGNsb2NrID0gUlR4QyBwaW4gKi8KKyNkZWZpbmUJUkNUUnhDUAkweDIwCS8qIFJlY2VpdmUgY2xvY2sgPSBUUnhDIHBpbiAqLworI2RlZmluZQlSQ0JSCTB4NDAJLyogUmVjZWl2ZSBjbG9jayA9IEJSIEdlbmVyYXRvciBvdXRwdXQgKi8KKyNkZWZpbmUJUkNEUExMCTB4NjAJLyogUmVjZWl2ZSBjbG9jayA9IERQTEwgb3V0cHV0ICovCisjZGVmaW5lCVJUeENYCTB4ODAJLyogUlR4QyBYdGFsL05vIFh0YWwgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMTIgKGxvd2VyIGJ5dGUgb2YgYmF1ZCByYXRlIGdlbmVyYXRvciB0aW1lIGNvbnN0YW50KSAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxMyAodXBwZXIgYnl0ZSBvZiBiYXVkIHJhdGUgZ2VuZXJhdG9yIHRpbWUgY29uc3RhbnQpICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDE0IChNaXNjIGNvbnRyb2wgYml0cykgKi8KKyNkZWZpbmUJQlJFTkFCTAkxCS8qIEJhdWQgcmF0ZSBnZW5lcmF0b3IgZW5hYmxlICovCisjZGVmaW5lCUJSU1JDCTIJLyogQmF1ZCByYXRlIGdlbmVyYXRvciBzb3VyY2UgKi8KKyNkZWZpbmUJRFRSUkVRCTQJLyogRFRSL1JlcXVlc3QgZnVuY3Rpb24gKi8KKyNkZWZpbmUJQVVUT0VDSE8gOAkvKiBBdXRvIEVjaG8gKi8KKyNkZWZpbmUJTE9PUEJBSwkweDEwCS8qIExvY2FsIGxvb3BiYWNrICovCisjZGVmaW5lCVNFQVJDSAkweDIwCS8qIEVudGVyIHNlYXJjaCBtb2RlICovCisjZGVmaW5lCVJNQwkweDQwCS8qIFJlc2V0IG1pc3NpbmcgY2xvY2sgKi8KKyNkZWZpbmUJRElTRFBMTAkweDYwCS8qIERpc2FibGUgRFBMTCAqLworI2RlZmluZQlTU0JSCTB4ODAJLyogU2V0IERQTEwgc291cmNlID0gQlIgZ2VuZXJhdG9yICovCisjZGVmaW5lCVNTUlR4QwkweGEwCS8qIFNldCBEUExMIHNvdXJjZSA9IFJUeEMgKi8KKyNkZWZpbmUJU0ZNTQkweGMwCS8qIFNldCBGTSBtb2RlICovCisjZGVmaW5lCVNOUlpJCTB4ZTAJLyogU2V0IE5SWkkgbW9kZSAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxNSAoZXh0ZXJuYWwvc3RhdHVzIGludGVycnVwdCBjb250cm9sKSAqLworI2RlZmluZSBQUklNRQkxCS8qIFI1JyBldGMgcmVnaXN0ZXIgYWNjZXNzIChaODVDMzAvMjMwIG9ubHkpICovCisjZGVmaW5lCVpDSUUJMgkvKiBaZXJvIGNvdW50IElFICovCisjZGVmaW5lIEZJRk9FCTQJLyogWjg1MjMwIG9ubHkgKi8KKyNkZWZpbmUJRENESUUJOAkvKiBEQ0QgSUUgKi8KKyNkZWZpbmUJU1lOQ0lFCTB4MTAJLyogU3luYy9odW50IElFICovCisjZGVmaW5lCUNUU0lFCTB4MjAJLyogQ1RTIElFICovCisjZGVmaW5lCVR4VUlFCTB4NDAJLyogVHggVW5kZXJydW4vRU9NIElFICovCisjZGVmaW5lCUJSS0lFCTB4ODAJLyogQnJlYWsvQWJvcnQgSUUgKi8KKworCisvKiBSZWFkIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJUnhfQ0hfQVYJMHgxCS8qIFJ4IENoYXJhY3RlciBBdmFpbGFibGUgKi8KKyNkZWZpbmUJWkNPVU5UCQkweDIJLyogWmVybyBjb3VudCAqLworI2RlZmluZQlUeF9CVUZfRU1QCTB4NAkvKiBUeCBCdWZmZXIgZW1wdHkgKi8KKyNkZWZpbmUJRENECQkweDgJLyogRENEICovCisjZGVmaW5lCVNZTkNfSFVOVAkweDEwCS8qIFN5bmMvaHVudCAqLworI2RlZmluZQlDVFMJCTB4MjAJLyogQ1RTICovCisjZGVmaW5lCVR4RU9NCQkweDQwCS8qIFR4IHVuZGVycnVuICovCisjZGVmaW5lCUJSS19BQlJUCTB4ODAJLyogQnJlYWsvQWJvcnQgKi8KKworLyogUmVhZCBSZWdpc3RlciAxICovCisjZGVmaW5lCUFMTF9TTlQJCTB4MQkvKiBBbGwgc2VudCAqLworLyogUmVzaWR1ZSBEYXRhIGZvciA4IFJ4IGJpdHMvY2hhciBwcm9ncmFtbWVkICovCisjZGVmaW5lCVJFUzMJCTB4OAkvKiAwLzMgKi8KKyNkZWZpbmUJUkVTNAkJMHg0CS8qIDAvNCAqLworI2RlZmluZQlSRVM1CQkweGMJLyogMC81ICovCisjZGVmaW5lCVJFUzYJCTB4MgkvKiAwLzYgKi8KKyNkZWZpbmUJUkVTNwkJMHhhCS8qIDAvNyAqLworI2RlZmluZQlSRVM4CQkweDYJLyogMC84ICovCisjZGVmaW5lCVJFUzE4CQkweGUJLyogMS84ICovCisjZGVmaW5lCVJFUzI4CQkweDAJLyogMi84ICovCisvKiBTcGVjaWFsIFJ4IENvbmRpdGlvbiBJbnRlcnJ1cHRzICovCisjZGVmaW5lCVBBUl9FUlIJCTB4MTAJLyogUGFyaXR5IGVycm9yICovCisjZGVmaW5lCVJ4X09WUgkJMHgyMAkvKiBSeCBPdmVycnVuIEVycm9yICovCisjZGVmaW5lCUNSQ19FUlIJCTB4NDAJLyogQ1JDL0ZyYW1pbmcgRXJyb3IgKi8KKyNkZWZpbmUJRU5EX0ZSCQkweDgwCS8qIEVuZCBvZiBGcmFtZSAoU0RMQykgKi8KKworLyogUmVhZCBSZWdpc3RlciAyIChjaGFubmVsIGIgb25seSkgLSBJbnRlcnJ1cHQgdmVjdG9yICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgMyAoaW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXIpIGNoIGEgb25seSAqLworI2RlZmluZQlDSEJFWFQJMHgxCQkvKiBDaGFubmVsIEIgRXh0L1N0YXQgSVAgKi8KKyNkZWZpbmUJQ0hCVHhJUAkweDIJCS8qIENoYW5uZWwgQiBUeCBJUCAqLworI2RlZmluZQlDSEJSeElQCTB4NAkJLyogQ2hhbm5lbCBCIFJ4IElQICovCisjZGVmaW5lCUNIQUVYVAkweDgJCS8qIENoYW5uZWwgQSBFeHQvU3RhdCBJUCAqLworI2RlZmluZQlDSEFUeElQCTB4MTAJCS8qIENoYW5uZWwgQSBUeCBJUCAqLworI2RlZmluZQlDSEFSeElQCTB4MjAJCS8qIENoYW5uZWwgQSBSeCBJUCAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDggKHJlY2VpdmUgZGF0YSByZWdpc3RlcikgKi8KKworLyogUmVhZCBSZWdpc3RlciAxMCAgKG1pc2Mgc3RhdHVzIGJpdHMpICovCisjZGVmaW5lCU9OTE9PUAkyCQkvKiBPbiBsb29wICovCisjZGVmaW5lCUxPT1BTRU5EIDB4MTAJCS8qIExvb3Agc2VuZGluZyAqLworI2RlZmluZQlDTEsyTUlTCTB4NDAJCS8qIFR3byBjbG9ja3MgbWlzc2luZyAqLworI2RlZmluZQlDTEsxTUlTCTB4ODAJCS8qIE9uZSBjbG9jayBtaXNzaW5nICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgMTIgKGxvd2VyIGJ5dGUgb2YgYmF1ZCByYXRlIGdlbmVyYXRvciBjb25zdGFudCkgKi8KKworLyogUmVhZCBSZWdpc3RlciAxMyAodXBwZXIgYnl0ZSBvZiBiYXVkIHJhdGUgZ2VuZXJhdG9yIGNvbnN0YW50KSAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDE1ICh2YWx1ZSBvZiBXUiAxNSkgKi8KKworCisvKgorICoJSW50ZXJydXB0IGhhbmRsaW5nIGZ1bmN0aW9ucyBmb3IgdGhpcyBTQ0MKKyAqLworCitzdHJ1Y3Qgejg1MzBfY2hhbm5lbDsKKyAKK3N0cnVjdCB6ODUzMF9pcnFoYW5kbGVyCit7CisJdm9pZCAoKnJ4KShzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqKTsKKwl2b2lkICgqdHgpKHN0cnVjdCB6ODUzMF9jaGFubmVsICopOworCXZvaWQgKCpzdGF0dXMpKHN0cnVjdCB6ODUzMF9jaGFubmVsICopOworfTsKKworLyoKKyAqCUEgY2hhbm5lbCBvZiB0aGUgWjg1MzAKKyAqLworCitzdHJ1Y3Qgejg1MzBfY2hhbm5lbAoreworCXN0cnVjdAkJejg1MzBfaXJxaGFuZGxlciAqaXJxczsJCS8qIElSUSBoYW5kbGVycyAqLworCS8qCisJICoJU3luY2hyb25vdXMKKwkgKi8KKwl1MTYJCWNvdW50OwkJLyogQnV5ZXMgcmVjZWl2ZWQgKi8KKwl1MTYJCW1heDsJCS8qIE1vc3Qgd2UgY2FuIHJlY2VpdmUgdGhpcyBmcmFtZSAqLworCXUxNgkJbXR1OwkJLyogTVRVIG9mIHRoZSBkZXZpY2UgKi8KKwl1OAkJKmRwdHI7CQkvKiBQb2ludGVyIGludG8gcnggYnVmZmVyICovCisJc3RydWN0IHNrX2J1ZmYJKnNrYjsJCS8qIEJ1ZmZlciBkcHRyIHBvaW50cyBpbnRvICovCisJc3RydWN0IHNrX2J1ZmYJKnNrYjI7CQkvKiBQZW5kaW5nIGJ1ZmZlciAqLworCXU4CQlzdGF0dXM7CQkvKiBDdXJyZW50IERDRCAqLworCXU4CQlkY2RjaGVjazsJLyogd2hpY2ggYml0IHRvIGNoZWNrIGZvciBsaW5lICovCisJdTgJCXN5bmM7CQkvKiBTZXQgaWYgaW4gc3luYyBtb2RlICovCisKKwl1OAkJcmVnc1szMl07CS8qIFJlZ2lzdGVyIG1hcCBmb3IgdGhlIGNoaXAgKi8KKwl1OAkJcGVuZHJlZ3NbMzJdOwkvKiBQZW5kaW5nIHJlZ2lzdGVyIHZhbHVlcyAqLworCQorCXN0cnVjdCBza19idWZmIAkqdHhfc2tiOwkvKiBCdWZmZXIgYmVpbmcgdHJhbnNtaXR0ZWQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAgKnR4X25leHRfc2tiOwkvKiBOZXh0IHRyYW5zbWl0IGJ1ZmZlciAqLworCXU4CQkqdHhfcHRyOwkvKiBCeXRlIHBvaW50ZXIgaW50byB0aGUgYnVmZmVyICovCisJdTgJCSp0eF9uZXh0X3B0cjsJLyogTmV4dCBwb2ludGVyIHRvIHVzZSAqLworCXU4CQkqdHhfZG1hX2J1ZlsyXTsJLyogVFggZmxpcCBidWZmZXJzIGZvciBETUEgKi8KKwl1OAkJdHhfZG1hX3VzZWQ7CS8qIEZsaXAgYnVmZmVyIHVzYWdlIHRvZ2dsZXIgKi8KKwl1MTYJCXR4Y291bnQ7CS8qIENvdW50IG9mIGJ5dGVzIHRvIHRyYW5zbWl0ICovCisJCisJdm9pZAkJKCpyeF9mdW5jdGlvbikoc3RydWN0IHo4NTMwX2NoYW5uZWwgKiwgc3RydWN0IHNrX2J1ZmYgKik7CisJCisJLyoKKwkgKglTeW5jIERNQQorCSAqLworCQorCXU4CQlyeGRtYTsJCS8qIERNQSBjaGFubmVscyAqLworCXU4CQl0eGRtYTsJCQorCXU4CQlyeGRtYV9vbjsJLyogRE1BIGFjdGl2ZSBpZiBmbGFnIHNldCAqLworCXU4CQl0eGRtYV9vbjsKKwl1OAkJZG1hX251bTsJLyogQnVmZmVyIHdlIGFyZSBETUFpbmcgaW50byAqLworCXU4CQlkbWFfcmVhZHk7CS8qIElzIHRoZSBvdGhlciBidWZmZXIgZnJlZSAqLworCXU4CQlkbWFfdHg7CQkvKiBUWCBpcyB0byB1c2UgRE1BICovCisJdTgJCSpyeF9idWZbMl07CS8qIFRoZSBmbGlwIGJ1ZmZlcnMgKi8KKwkKKwkvKgorCSAqCVN5c3RlbQorCSAqLworCSAKKwlzdHJ1Y3Qgejg1MzBfZGV2ICpkZXY7CQkvKiBaODUyMzAgY2hpcCBpbnN0YW5jZSB3ZSBhcmUgZnJvbSAqLworCXVuc2lnbmVkIGxvbmcJY3RybGlvOwkJLyogSS9PIHBvcnRzICovCisJdW5zaWduZWQgbG9uZwlkYXRhaW87CisKKwkvKgorCSAqCUZvciBQQyB3ZSBlbmNvZGUgdGhpcyB3YXkuCisJICovCQorI2RlZmluZSBaODUzMF9QT1JUX1NMRUVQCTB4ODAwMDAwMDAKKyNkZWZpbmUgWjg1MzBfUE9SVF9PRih4KQkoKHgpJjB4RkZGRikKKworCXUzMgkJcnhfb3ZlcnJ1bjsJCS8qIE92ZXJydW5zIC0gbm90IGRvbmUgeWV0ICovCisJdTMyCQlyeF9jcmNfZXJyOworCisJLyoKKwkgKglCb3VuZCBkZXZpY2UgcG9pbnRlcnMKKwkgKi8KKworCXZvaWQJCSpwcml2YXRlOwkvKiBGb3Igb3VyIG93bmVyICovCisJc3RydWN0IG5ldF9kZXZpY2UJKm5ldGRldmljZTsJLyogTmV0d29yayBsYXllciBkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogTmV0d29yayBsYXllciBzdGF0aXN0aWNzICovCisKKwkvKgorCSAqCUFzeW5jIGZlYXR1cmVzCisJICovCisKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAJKnR0eTsJCS8qIEF0dGFjaGVkIHRlcm1pbmFsICovCisJaW50CQkJbGluZTsJCS8qIE1pbm9yIG51bWJlciAqLworCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsJLyogVGFza3Mgd2FpdGluZyB0byBvcGVuICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJY2xvc2Vfd2FpdDsJLyogYW5kIGZvciBjbG9zZSB0byBlbmQgKi8KKwl1bnNpZ25lZCBsb25nCQlldmVudDsJCS8qIFBlbmRpbmcgZXZlbnRzICovCisJaW50CQkJZmRjb3VudDsgICAgCS8qICMgb2YgZmQgb24gZGV2aWNlICovCisJaW50CQkJYmxvY2tlZF9vcGVuOwkvKiAjIG9mIGJsb2NrZWQgb3BlbnMgKi8KKwlpbnQJCQl4X2NoYXI7CQkvKiBYT04vWE9GIGNoYXIgKi8KKwl1bnNpZ25lZCBjaGFyIAkJKnhtaXRfYnVmOwkvKiBUcmFuc21pdCBwb2ludGVyICovCisJaW50CQkJeG1pdF9oZWFkOwkvKiBUcmFuc21pdCByaW5nICovCisJaW50CQkJeG1pdF90YWlsOworCWludAkJCXhtaXRfY250OworCWludAkJCWZsYWdzOwkKKwlpbnQJCQl0aW1lb3V0OworCWludAkJCXhtaXRfZmlmb19zaXplOwkvKiBUcmFuc21pdCBGSUZPIGluZm8gKi8KKworCWludAkJCWNsb3NlX2RlbGF5OwkvKiBEbyB3ZSB3YWl0IGZvciBkcmFpbiBvbiBjbG9zZSA/ICovCisJdW5zaWduZWQgc2hvcnQJCWNsb3Npbmdfd2FpdDsKKworCS8qIFdlIG5lZWQgdG8ga25vdyB0aGUgY3VycmVudCBjbG9jayBkaXZpc29yCisJICogdG8gcmVhZCB0aGUgYnBzIHJhdGUgdGhlIGNoaXAgaGFzIGN1cnJlbnRseQorCSAqIGxvYWRlZC4KKwkgKi8KKworCXVuc2lnbmVkIGNoYXIJCWNsa19kaXZpc29yOyAgLyogTWF5IGJlIDEsIDE2LCAzMiwgb3IgNjQgKi8KKwlpbnQJCQl6c19iYXVkOworCisJaW50CQkJbWFnaWM7CisJaW50CQkJYmF1ZF9iYXNlOwkJLyogQmF1ZCBwYXJhbWV0ZXJzICovCisJaW50CQkJY3VzdG9tX2Rpdmlzb3I7CisKKworCXVuc2lnbmVkIGNoYXIJCXR4X2FjdGl2ZTsgLyogY2hhcmFjdGVyIGlzIGJlaW5nIHhtaXR0ZWQgKi8KKwl1bnNpZ25lZCBjaGFyCQl0eF9zdG9wcGVkOyAvKiBvdXRwdXQgaXMgc3VzcGVuZGVkICovCisKKwlzcGlubG9ja190CQkqbG9jazsJICAvKiBEZXZpY3IgbG9jayAqLworfTsJCisKKy8qCisgKglFYWNoIFo4NTN4MCBkZXZpY2UuCisgKi8JCisgCitzdHJ1Y3Qgejg1MzBfZGV2Cit7CisJY2hhciAqbmFtZTsJLyogRGV2aWNlIGluc3RhbmNlIG5hbWUgKi8KKwlzdHJ1Y3Qgejg1MzBfY2hhbm5lbCBjaGFuQTsJLyogU0NDIGNoYW5uZWwgQSAqLworCXN0cnVjdCB6ODUzMF9jaGFubmVsIGNoYW5COwkvKiBTQ0MgY2hhbm5lbCBCICovCisJaW50IHR5cGU7CisjZGVmaW5lIFo4NTMwCTAJLyogTk1PUyBkaW5vc2F1ciAqLwkKKyNkZWZpbmUgWjg1QzMwCTEJLyogQ01PUyAtIGJldHRlciAqLworI2RlZmluZSBaODUyMzAJMgkvKiBDTU9TIHdpdGggcmVhbCBGSUZPICovCisJaW50IGlycTsJLyogSW50ZXJydXB0IGZvciB0aGUgZGV2aWNlICovCisJaW50IGFjdGl2ZTsJLyogU29mdCBpbnRlcnJ1cHQgZW5hYmxlIC0gdGhlIE1hYyBkb2Vzbid0IAorCQkJICAgYWx3YXlzIGhhdmUgYSBoYXJkIGRpc2FibGUgb24gaXRzIDg1MzBzLi4uICovCisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworCisvKgorICoJRnVuY3Rpb25zCisgKi8KKyAKK2V4dGVybiB1OCB6ODUzMF9kZWFkX3BvcnRbXTsKK2V4dGVybiB1OCB6ODUzMF9oZGxjX2tpbG9zdHJlYW1fODUyMzBbXTsKK2V4dGVybiB1OCB6ODUzMF9oZGxjX2tpbG9zdHJlYW1bXTsKK2V4dGVybiBpcnFyZXR1cm5fdCB6ODUzMF9pbnRlcnJ1cHQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworZXh0ZXJuIHZvaWQgejg1MzBfZGVzY3JpYmUoc3RydWN0IHo4NTMwX2RldiAqLCBjaGFyICptYXBwaW5nLCB1bnNpZ25lZCBsb25nIGlvKTsKK2V4dGVybiBpbnQgejg1MzBfaW5pdChzdHJ1Y3Qgejg1MzBfZGV2ICopOworZXh0ZXJuIGludCB6ODUzMF9zaHV0ZG93bihzdHJ1Y3Qgejg1MzBfZGV2ICopOworZXh0ZXJuIGludCB6ODUzMF9zeW5jX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKik7CitleHRlcm4gaW50IHo4NTMwX3N5bmNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKik7CitleHRlcm4gaW50IHo4NTMwX3N5bmNfZG1hX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKik7CitleHRlcm4gaW50IHo4NTMwX3N5bmNfZG1hX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCB6ODUzMF9jaGFubmVsICopOworZXh0ZXJuIGludCB6ODUzMF9zeW5jX3R4ZG1hX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKik7CitleHRlcm4gaW50IHo4NTMwX3N5bmNfdHhkbWFfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKik7CitleHRlcm4gaW50IHo4NTMwX2NoYW5uZWxfbG9hZChzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqLCB1OCAqKTsKK2V4dGVybiBpbnQgejg1MzBfcXVldWVfeG1pdChzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKno4NTMwX2dldF9zdGF0cyhzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYyk7CitleHRlcm4gdm9pZCB6ODUzMF9udWxsX3J4KHN0cnVjdCB6ODUzMF9jaGFubmVsICpjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworCisvKgorICoJU3RhbmRhcmQgaW50ZXJydXB0IHZlY3RvciBzZXRzCisgKi8KKyAKK2V4dGVybiBzdHJ1Y3Qgejg1MzBfaXJxaGFuZGxlciB6ODUzMF9zeW5jLCB6ODUzMF9hc3luYywgejg1MzBfbm9wOworCisvKgorICoJQXN5bmNocm9ub3VzIEludGVyZmFjaW5nCisgKi8KKworI2RlZmluZSBTRVJJQUxfTUFHSUMgMHg1MzAxCisKKy8qCisgKiBUaGUgc2l6ZSBvZiB0aGUgc2VyaWFsIHhtaXQgYnVmZmVyIGlzIDEgcGFnZSwgb3IgNDA5NiBieXRlcworICovCisKKyNkZWZpbmUgU0VSSUFMX1hNSVRfU0laRSA0MDk2CisjZGVmaW5lIFdBS0VVUF9DSEFSUwkyNTYKKworLyoKKyAqIEV2ZW50cyBhcmUgdXNlZCB0byBzY2hlZHVsZSB0aGluZ3MgdG8gaGFwcGVuIGF0IHRpbWVyLWludGVycnVwdAorICogdGltZSwgaW5zdGVhZCBvZiBhdCBycyBpbnRlcnJ1cHQgdGltZS4KKyAqLworI2RlZmluZSBSU19FVkVOVF9XUklURV9XQUtFVVAJMAorCisvKiBJbnRlcm5hbCBmbGFncyB1c2VkIG9ubHkgYnkga2VybmVsL2Nocl9kcnYvc2VyaWFsLmMgKi8KKyNkZWZpbmUgWklMT0dfSU5JVElBTElaRUQJMHg4MDAwMDAwMCAvKiBTZXJpYWwgcG9ydCB3YXMgaW5pdGlhbGl6ZWQgKi8KKyNkZWZpbmUgWklMT0dfQ0FMTE9VVF9BQ1RJVkUJMHg0MDAwMDAwMCAvKiBDYWxsIG91dCBkZXZpY2UgaXMgYWN0aXZlICovCisjZGVmaW5lIFpJTE9HX05PUk1BTF9BQ1RJVkUJMHgyMDAwMDAwMCAvKiBOb3JtYWwgZGV2aWNlIGlzIGFjdGl2ZSAqLworI2RlZmluZSBaSUxPR19CT09UX0FVVE9DT05GCTB4MTAwMDAwMDAgLyogQXV0b2NvbmZpZ3VyZSBwb3J0IG9uIGJvb3R1cCAqLworI2RlZmluZSBaSUxPR19DTE9TSU5HCQkweDA4MDAwMDAwIC8qIFNlcmlhbCBwb3J0IGlzIGNsb3NpbmcgKi8KKyNkZWZpbmUgWklMT0dfQ1RTX0ZMT1cJCTB4MDQwMDAwMDAgLyogRG8gQ1RTIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBaSUxPR19DSEVDS19DRAkJMHgwMjAwMDAwMCAvKiBpLmUuLCBDTE9DQUwgKi8KKworI2VuZGlmIC8qICEoX1o4NTMwX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93ZC5jIGIvZHJpdmVycy9uZXQvd2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjA1ZDliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2QuYwpAQCAtMCwwICsxLDU1OSBAQAorLyogd2QuYzogQSBXRDgweDMgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisKKwlDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisJRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJVGhpcyBpcyBhIGRyaXZlciBmb3IgV0Q4MDAzIGFuZCBXRDgwMTMgImNvbXBhdGlibGUiIGV0aGVyY2FyZHMuCisKKwlUaGFua3MgdG8gUnVzcyBOZWxzb24gKG5lbHNvbkBjcm53eXIuY29tKSBmb3IgbG9hbmluZyBtZSBhIFdEODAxMy4KKworCUNoYW5nZWxvZzoKKworCVBhdWwgR29ydG1ha2VyCTogbXVsdGlwbGUgY2FyZCBzdXBwb3J0IGZvciBtb2R1bGUgdXNlcnMsIHN1cHBvcnQKKwkJCSAgZm9yIG5vbi1zdGFuZGFyZCBtZW1vcnkgc2l6ZXMuCisKKworKi8KKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKwkid2QuYzp2MS4xMCA5LzIzLzk0IERvbmFsZCBCZWNrZXIgKGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdilcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgIndkIgorCisvKiBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIEkvTyBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkLiAqLworc3RhdGljIHVuc2lnbmVkIGludCB3ZF9wb3J0bGlzdFtdIF9faW5pdGRhdGEgPQorezB4MzAwLCAweDI4MCwgMHgzODAsIDB4MjQwLCAwfTsKKworc3RhdGljIGludCB3ZF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcik7CisKK3N0YXRpYyBpbnQgd2Rfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHdkX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB3ZF9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCQkJCWludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgd2RfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgd2RfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyBpbnQgd2RfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwwKKyNkZWZpbmUgV0RfU1RBUlRfUEcJCTB4MDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgV0QwM19TVE9QX1BHCTB4MjAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKyNkZWZpbmUgV0QxM19TVE9QX1BHCTB4NDAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKworI2RlZmluZSBXRF9DTURSRUcJCTAJCS8qIE9mZnNldCB0byBBU0lDIGNvbW1hbmQgcmVnaXN0ZXIuICovCisjZGVmaW5lCSBXRF9SRVNFVAkJMHg4MAkvKiBCb2FyZCByZXNldCwgaW4gV0RfQ01EUkVHLiAqLworI2RlZmluZQkgV0RfTUVNRU5CCQkweDQwCS8qIEVuYWJsZSB0aGUgc2hhcmVkIG1lbW9yeS4gKi8KKyNkZWZpbmUgV0RfQ01EUkVHNQkJNQkJLyogT2Zmc2V0IHRvIDE2LWJpdC1vbmx5IEFTSUMgcmVnaXN0ZXIgNS4gKi8KKyNkZWZpbmUJIElTQTE2CQkJMHg4MAkvKiBFbmFibGUgMTYgYml0IGFjY2VzcyBmcm9tIHRoZSBJU0EgYnVzLiAqLworI2RlZmluZQkgTklDMTYJCQkweDQwCS8qIEVuYWJsZSAxNiBiaXQgYWNjZXNzIGZyb20gdGhlIDgzOTAuICovCisjZGVmaW5lIFdEX05JQ19PRkZTRVQJMTYJCS8qIE9mZnNldCB0byB0aGUgODM5MCBmcm9tIHRoZSBiYXNlX2FkZHIuICovCisjZGVmaW5lIFdEX0lPX0VYVEVOVAkzMgorCisMCisvKglQcm9iZSBmb3IgdGhlIFdEODAwMyBhbmQgV0Q4MDEzLiAgVGhlc2UgY2FyZHMgaGF2ZSB0aGUgc3RhdGlvbgorCWFkZHJlc3MgUFJPTSBhdCBJL08gcG9ydHMgPGJhc2U+KzggdG8gPGJhc2U+KzEzLCB3aXRoIGEgY2hlY2tzdW0KKwlmb2xsb3dpbmcuIEEgU291bmRibGFzdGVyIGNhbiBoYXZlIHRoZSBzYW1lIGNoZWNrc3VtIGFzIGFuIFdEZXRoZXJjYXJkLAorCXNvIHdlIGhhdmUgYW4gZXh0cmEgZXhjbHVzaW9uYXJ5IGNoZWNrIGZvciBpdC4KKworCVRoZSB3ZF9wcm9iZTEoKSByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBjYXJkIGFuZCBmaWxscyB0aGUKKwlzdGF0aW9uIGFkZHJlc3MgZmllbGQuICovCisKK3N0YXRpYyBpbnQgX19pbml0IGRvX3dkX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJc3RydWN0IHJlc291cmNlICpyOworCWludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaXJxID0gZGV2LT5pcnE7CisJaW50IG1lbV9zdGFydCA9IGRldi0+bWVtX3N0YXJ0OworCWludCBtZW1fZW5kID0gZGV2LT5tZW1fZW5kOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKGJhc2VfYWRkciA+IDB4MWZmKSB7CS8qIENoZWNrIGEgdXNlciBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCXIgPSByZXF1ZXN0X3JlZ2lvbihiYXNlX2FkZHIsIFdEX0lPX0VYVEVOVCwgIndkLXByb2JlIik7CisJCWlmICggciA9PSBOVUxMKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJaSA9IHdkX3Byb2JlMShkZXYsIGJhc2VfYWRkcik7CisJCWlmIChpICE9IDApICAKKwkJCXJlbGVhc2VfcmVnaW9uKGJhc2VfYWRkciwgV0RfSU9fRVhURU5UKTsKKwkJZWxzZQorCQkJci0+bmFtZSA9IGRldi0+bmFtZTsKKwkJcmV0dXJuIGk7CisJfQorCWVsc2UgaWYgKGJhc2VfYWRkciAhPSAwKQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisKKwlmb3IgKGkgPSAwOyB3ZF9wb3J0bGlzdFtpXTsgaSsrKSB7CisJCWludCBpb2FkZHIgPSB3ZF9wb3J0bGlzdFtpXTsKKwkJciA9IHJlcXVlc3RfcmVnaW9uKGlvYWRkciwgV0RfSU9fRVhURU5ULCAid2QtcHJvYmUiKTsKKwkJaWYgKHIgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAod2RfcHJvYmUxKGRldiwgaW9hZGRyKSA9PSAwKSB7CisJCQlyLT5uYW1lID0gZGV2LT5uYW1lOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBXRF9JT19FWFRFTlQpOworCQlkZXYtPmlycSA9IGlycTsKKwkJZGV2LT5tZW1fc3RhcnQgPSBtZW1fc3RhcnQ7CisJCWRldi0+bWVtX2VuZCA9IG1lbV9lbmQ7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyIC0gV0RfTklDX09GRlNFVCwgV0RfSU9fRVhURU5UKTsKKwlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgd2RfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2VpX25ldGRldigpOworCWludCBlcnI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCWVyciA9IGRvX3dkX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCB3ZF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlpbnQgaTsKKwlpbnQgY2hlY2tzdW0gPSAwOworCWludCBhbmNpZW50ID0gMDsJCQkvKiBBbiBvbGQgY2FyZCB3aXRob3V0IGNvbmZpZyByZWdpc3RlcnMuICovCisJaW50IHdvcmQxNiA9IDA7CQkJCS8qIDAgPSA4IGJpdCwgMSA9IDE2IGJpdCAqLworCWNvbnN0IGNoYXIgKm1vZGVsX25hbWU7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWNoZWNrc3VtICs9IGluYihpb2FkZHIgKyA4ICsgaSk7CisJaWYgKGluYihpb2FkZHIgKyA4KSA9PSAweGZmIAkvKiBFeHRyYSBjaGVjayB0byBhdm9pZCBzb3VuZGNhcmQuICovCisJCXx8IGluYihpb2FkZHIgKyA5KSA9PSAweGZmCisJCXx8IChjaGVja3N1bSAmIDB4ZmYpICE9IDB4RkYpCisJCXJldHVybiAtRU5PREVWOworCisJLyogQ2hlY2sgZm9yIHNlbWktdmFsaWQgbWVtX3N0YXJ0L2VuZCB2YWx1ZXMgaWYgc3VwcGxpZWQuICovCisJaWYgKChkZXYtPm1lbV9zdGFydCAlIDB4MjAwMCkgfHwgKGRldi0+bWVtX2VuZCAlIDB4MjAwMCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2QuYzogdXNlciBzdXBwbGllZCBtZW1fc3RhcnQgb3IgbWVtX2VuZCBub3Qgb24gOGtCIGJvdW5kYXJ5IC0gaWdub3JlZC5cbiIpOworCQlkZXYtPm1lbV9zdGFydCA9IDA7CisJCWRldi0+bWVtX2VuZCA9IDA7CisJfQorCisJaWYgKGVpX2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJcHJpbnRrKCIlczogV0Q4MHgzIGF0ICUjM3gsIiwgZGV2LT5uYW1lLCBpb2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUyLjJYIiwgZGV2LT5kZXZfYWRkcltpXSA9IGluYihpb2FkZHIgKyA4ICsgaSkpOworCisJLyogVGhlIGZvbGxvd2luZyBQdXJlRGF0YSBwcm9iZSBjb2RlIHdhcyBjb250cmlidXRlZCBieQorCSAgIE1pa2UgSmFnZGlzIDxqYWdneUBwdXJwbGV0LmRlbW9uLmNvLnVrPi4gUHVyZWRhdGEgZG9lcyBzb2Z0d2FyZQorCSAgIGNvbmZpZ3VyYXRpb24gZGlmZmVyZW50bHkgZnJvbSBvdGhlcnMgc28gd2UgaGF2ZSB0byBjaGVjayBmb3IgdGhlbS4KKwkgICBUaGlzIGRldGVjdHMgYW4gOCBiaXQsIDE2IGJpdCBvciBkdW1iIChUb3NoaWJhLCBqdW1wZXJlZCkgY2FyZC4KKwkgICAqLworCWlmIChpbmIoaW9hZGRyKzApID09ICdQJyAmJiBpbmIoaW9hZGRyKzEpID09ICdEJykgeworCQl1bnNpZ25lZCBjaGFyIHJlZzUgPSBpbmIoaW9hZGRyKzUpOworCisJCXN3aXRjaCAoaW5iKGlvYWRkcisyKSkgeworCQljYXNlIDB4MDM6IHdvcmQxNiA9IDA7IG1vZGVsX25hbWUgPSAiUERJODAyMy04IjsJYnJlYWs7CisJCWNhc2UgMHgwNTogd29yZDE2ID0gMDsgbW9kZWxfbmFtZSA9ICJQRFVDODAyMyI7CWJyZWFrOworCQljYXNlIDB4MGE6IHdvcmQxNiA9IDE7IG1vZGVsX25hbWUgPSAiUERJODAyMy0xNiI7IGJyZWFrOworCQkJLyogRWl0aGVyIDB4MDEgKGR1bWIpIG9yIHRoZXkndmUgcmVsZWFzZWQgYSBuZXcgdmVyc2lvbi4gKi8KKwkJZGVmYXVsdDoJIHdvcmQxNiA9IDA7IG1vZGVsX25hbWUgPSAiUERJODAyMyI7CWJyZWFrOworCQl9CisJCWRldi0+bWVtX3N0YXJ0ID0gKChyZWc1ICYgMHgxYykgKyAweGMwKSA8PCAxMjsKKwkJZGV2LT5pcnEgPSAocmVnNSAmIDB4ZTApID09IDB4ZTAgPyAxMCA6IChyZWc1ID4+IDUpICsgMTsKKwl9IGVsc2UgewkJCQkJCQkJLyogRW5kIG9mIFB1cmVEYXRhIHByb2JlICovCisJCS8qIFRoaXMgbWV0aG9kIG9mIGNoZWNraW5nIGZvciBhIDE2LWJpdCBib2FyZCBpcyBib3Jyb3dlZCBmcm9tIHRoZQorCQkgICB3ZS5jIGRyaXZlci4gIEEgc2ltcGxlciBtZXRob2QgaXMganVzdCB0byBsb29rIGluIEFTSUMgcmVnLiAweDAzLgorCQkgICBJJ20gY29tcGFyaW5nIHRoZSB0d28gbWV0aG9kIGluIGFscGhhIHRlc3QgdG8gbWFrZSBjZXJ0YWluIHRoZXkKKwkJICAgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4gKi8KKwkJLyogQ2hlY2sgZm9yIHRoZSBvbGQgOCBiaXQgYm9hcmQgLSBpdCBoYXMgcmVnaXN0ZXIgMC84IGFsaWFzaW5nLgorCQkgICBEbyBOT1QgY2hlY2sgaT49NiBoZXJlIC0tIGl0IGhhbmdzIHRoZSBvbGQgODAwMyBib2FyZHMhICovCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlpZiAoaW5iKGlvYWRkcitpKSAhPSBpbmIoaW9hZGRyKzgraSkpCisJCQkJYnJlYWs7CisJCWlmIChpID49IDYpIHsKKwkJCWFuY2llbnQgPSAxOworCQkJbW9kZWxfbmFtZSA9ICJXRDgwMDMtb2xkIjsKKwkJCXdvcmQxNiA9IDA7CisJCX0gZWxzZSB7CisJCQlpbnQgdG1wID0gaW5iKGlvYWRkcisxKTsgLyogZmlkZGxlIHdpdGggMTZiaXQgYml0ICovCisJCQlvdXRiKCB0bXAgXiAweDAxLCBpb2FkZHIrMSApOyAvKiBhdHRlbXB0IHRvIGNsZWFyIDE2Yml0IGJpdCAqLworCQkJaWYgKCgoaW5iKCBpb2FkZHIrMSkgJiAweDAxKSA9PSAweDAxKSAvKiBBIDE2IGJpdCBjYXJkICovCisJCQkJJiYgKHRtcCAmIDB4MDEpID09IDB4MDEJKSB7CQkJCS8qIEluIGEgMTYgc2xvdC4gKi8KKwkJCQlpbnQgYXNpY19yZWc1ID0gaW5iKGlvYWRkcitXRF9DTURSRUc1KTsKKwkJCQkvKiBNYWdpYyB0byBzZXQgQVNJQyB0byB3b3JkLXdpZGUgbW9kZS4gKi8KKwkJCQlvdXRiKCBOSUMxNiB8IChhc2ljX3JlZzUmMHgxZiksIGlvYWRkcitXRF9DTURSRUc1KTsKKwkJCQlvdXRiKHRtcCwgaW9hZGRyKzEpOworCQkJCW1vZGVsX25hbWUgPSAiV0Q4MDEzIjsKKwkJCQl3b3JkMTYgPSAxOwkJLyogV2UgaGF2ZSBhIDE2Yml0IGJvYXJkIGhlcmUhICovCisJCQl9IGVsc2UgeworCQkJCW1vZGVsX25hbWUgPSAiV0Q4MDAzIjsKKwkJCQl3b3JkMTYgPSAwOworCQkJfQorCQkJb3V0Yih0bXAsIGlvYWRkcisxKTsJCQkvKiBSZXN0b3JlIG9yaWdpbmFsIHJlZzEgdmFsdWUuICovCisJCX0KKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQlpZiAoICFhbmNpZW50ICYmIChpbmIoaW9hZGRyKzEpICYgMHgwMSkgIT0gKHdvcmQxNiAmIDB4MDEpKQorCQkJcHJpbnRrKCJcbldEODA/MzogQnVzIHdpZHRoIGNvbmZsaWN0LCAlZCAocHJvYmUpICE9ICVkIChyZWcgcmVwb3J0KS4iLAorCQkJCSAgIHdvcmQxNiA/IDE2IDogOCwgKGluYihpb2FkZHIrMSkgJiAweDAxKSA/IDE2IDogOCk7CisjZW5kaWYKKwl9CisKKyNpZiBkZWZpbmVkKFdEX1NITUVNKSAmJiBXRF9TSE1FTSA+IDB4ODAwMDAKKwkvKiBBbGxvdyBhIGNvbXBpbGUtdGltZSBvdmVycmlkZS4JICovCisJZGV2LT5tZW1fc3RhcnQgPSBXRF9TSE1FTTsKKyNlbHNlCisJaWYgKGRldi0+bWVtX3N0YXJ0ID09IDApIHsKKwkJLyogU2FuaXR5IGFuZCBvbGQgODAwMyBjaGVjayAqLworCQlpbnQgcmVnMCA9IGluYihpb2FkZHIpOworCQlpZiAocmVnMCA9PSAweGZmIHx8IHJlZzAgPT0gMCkgeworCQkJLyogRnV0dXJlIHBsYW46IHRoaXMgY291bGQgY2hlY2sgYSBmZXcgbGlrZWx5IGxvY2F0aW9ucyBmaXJzdC4gKi8KKwkJCWRldi0+bWVtX3N0YXJ0ID0gMHhkMDAwMDsKKwkJCXByaW50aygiIGFzc2lnbmluZyBhZGRyZXNzICUjbHgiLCBkZXYtPm1lbV9zdGFydCk7CisJCX0gZWxzZSB7CisJCQlpbnQgaGlnaF9hZGRyX2JpdHMgPSBpbmIoaW9hZGRyK1dEX0NNRFJFRzUpICYgMHgxZjsKKwkJCS8qIFNvbWUgYm9hcmRzIGRvbid0IGhhdmUgdGhlIHJlZ2lzdGVyIDUgLS0gaXQgcmV0dXJucyAweGZmLiAqLworCQkJaWYgKGhpZ2hfYWRkcl9iaXRzID09IDB4MWYgfHwgd29yZDE2ID09IDApCisJCQkJaGlnaF9hZGRyX2JpdHMgPSAweDAxOworCQkJZGV2LT5tZW1fc3RhcnQgPSAoKHJlZzAmMHgzZikgPDwgMTMpICsgKGhpZ2hfYWRkcl9iaXRzIDw8IDE5KTsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogVGhlIDgzOTAgaXNuJ3QgYXQgdGhlIGJhc2UgYWRkcmVzcyAtLSB0aGUgQVNJQyByZWdzIGFyZSB0aGVyZSEgKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcitXRF9OSUNfT0ZGU0VUOworCisJaWYgKGRldi0+aXJxIDwgMikgeworCQlpbnQgaXJxbWFwW10gPSB7OSwzLDUsNywxMCwxMSwxNSw0fTsKKwkJaW50IHJlZzEgPSBpbmIoaW9hZGRyKzEpOworCQlpbnQgcmVnNCA9IGluYihpb2FkZHIrNCk7CisJCWlmIChhbmNpZW50IHx8IHJlZzEgPT0gMHhmZikgewkvKiBBY2shISBObyB3YXkgdG8gcmVhZCB0aGUgSVJRISAqLworCQkJc2hvcnQgbmljX2FkZHIgPSBpb2FkZHIrV0RfTklDX09GRlNFVDsKKwkJCXVuc2lnbmVkIGxvbmcgaXJxX21hc2s7CisKKwkJCS8qIFdlIGhhdmUgYW4gb2xkLXN0eWxlIGV0aGVyY2FyZCB0aGF0IGRvZXNuJ3QgcmVwb3J0IGl0cyBJUlEKKwkJCSAgIGxpbmUuICBEbyBhdXRvaXJxIHRvIGZpbmQgdGhlIElSUSBsaW5lLiBOb3RlIHRoYXQgdGhpcyBJUyBOT1QKKwkJCSAgIGEgcmVsaWFibGUgd2F5IHRvIHRyaWdnZXIgYW4gaW50ZXJydXB0LiAqLworCQkJb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfU1RPUCwgbmljX2FkZHIpOworCQkJb3V0YigweDAwLCBuaWNfYWRkcitFTjBfSU1SKTsJLyogRGlzYWJsZSBhbGwgaW50cnMuICovCisJCQkKKwkJCWlycV9tYXNrID0gcHJvYmVfaXJxX29uKCk7CisJCQlvdXRiX3AoMHhmZiwgbmljX2FkZHIgKyBFTjBfSU1SKTsJLyogRW5hYmxlIGFsbCBpbnRlcnJ1cHRzLiAqLworCQkJb3V0Yl9wKDB4MDAsIG5pY19hZGRyICsgRU4wX1JDTlRMTyk7CisJCQlvdXRiX3AoMHgwMCwgbmljX2FkZHIgKyBFTjBfUkNOVEhJKTsKKwkJCW91dGIoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19hZGRyKTsgLyogVHJpZ2dlciBpdC4uLiAqLworCQkJbWRlbGF5KDIwKTsKKwkJCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZihpcnFfbWFzayk7CisJCQkKKwkJCW91dGJfcCgweDAwLCBuaWNfYWRkcitFTjBfSU1SKTsJLyogTWFzayBhbGwgaW50cnMuIGFnYWluLiAqLworCisJCQlpZiAoZWlfZGVidWcgPiAyKQorCQkJCXByaW50aygiIGF1dG9pcnEgaXMgJWQiLCBkZXYtPmlycSk7CisJCQlpZiAoZGV2LT5pcnEgPCAyKQorCQkJCWRldi0+aXJxID0gd29yZDE2ID8gMTAgOiA1OworCQl9IGVsc2UKKwkJCWRldi0+aXJxID0gaXJxbWFwWygocmVnNCA+PiA1KSAmIDB4MDMpICsgKHJlZzEgJiAweDA0KV07CisJfSBlbHNlIGlmIChkZXYtPmlycSA9PSAyKQkJLyogRml4dXAgYm9nb3NpdHk6IElSUTIgaXMgcmVhbGx5IElSUTkgKi8KKwkJZGV2LT5pcnEgPSA5OworCisJLyogU25hcmYgdGhlIGludGVycnVwdCBub3cuICBUaGVyZSdzIG5vIHBvaW50IGluIHdhaXRpbmcgc2luY2Ugd2UgY2Fubm90CisJICAgc2hhcmUgYW5kIHRoZSBib2FyZCB3aWxsIHVzdWFsbHkgYmUgZW5hYmxlZC4gKi8KKwlpID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgRFJWX05BTUUsIGRldik7CisJaWYgKGkpIHsKKwkJcHJpbnRrICgiIHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwgZGV2LT5pcnEpOworCQlyZXR1cm4gaTsKKwl9CisKKwkvKiBPSywgd2VyZSBhcmUgY2VydGFpbiB0aGlzIGlzIGdvaW5nIHRvIHdvcmsuICBTZXR1cCB0aGUgZGV2aWNlLiAqLworCWVpX3N0YXR1cy5uYW1lID0gbW9kZWxfbmFtZTsKKwllaV9zdGF0dXMud29yZDE2ID0gd29yZDE2OworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gV0RfU1RBUlRfUEc7CisJZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBXRF9TVEFSVF9QRyArIFRYX1BBR0VTOworCisJLyogRG9uJ3QgbWFwIGluIHRoZSBzaGFyZWQgbWVtb3J5IHVudGlsIHRoZSBib2FyZCBpcyBhY3R1YWxseSBvcGVuZWQuICovCisKKwkvKiBTb21lIGNhcmRzIChlZyBXRDgwMDNFQlQpIGNhbiBiZSBqdW1wZXJlZCBmb3IgbW9yZSAoMzJrISkgbWVtb3J5LiAqLworCWlmIChkZXYtPm1lbV9lbmQgIT0gMCkgeworCQllaV9zdGF0dXMuc3RvcF9wYWdlID0gKGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0KS8yNTY7CisJCWVpX3N0YXR1cy5wcml2ID0gZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQ7CisJfSBlbHNlIHsKKwkJZWlfc3RhdHVzLnN0b3BfcGFnZSA9IHdvcmQxNiA/IFdEMTNfU1RPUF9QRyA6IFdEMDNfU1RPUF9QRzsKKwkJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAoZWlfc3RhdHVzLnN0b3BfcGFnZSAtIFdEX1NUQVJUX1BHKSoyNTY7CisJCWVpX3N0YXR1cy5wcml2ID0gKGVpX3N0YXR1cy5zdG9wX3BhZ2UgLSBXRF9TVEFSVF9QRykqMjU2OworCX0KKworCWVpX3N0YXR1cy5tZW0gPSBpb3JlbWFwKGRldi0+bWVtX3N0YXJ0LCBlaV9zdGF0dXMucHJpdik7CisJaWYgKCFlaV9zdGF0dXMubWVtKSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwcmludGsoIiAlcywgSVJRICVkLCBzaGFyZWQgbWVtb3J5IGF0ICUjbHgtJSNseC5cbiIsCisJCSAgIG1vZGVsX25hbWUsIGRldi0+aXJxLCBkZXYtPm1lbV9zdGFydCwgZGV2LT5tZW1fZW5kLTEpOworCisJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmd2RfcmVzZXRfODM5MDsKKwllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmd2RfYmxvY2tfaW5wdXQ7CisJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZ3ZF9ibG9ja19vdXRwdXQ7CisJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZ3ZF9nZXRfODM5MF9oZHI7CisJZGV2LT5vcGVuID0gJndkX29wZW47CisJZGV2LT5zdG9wID0gJndkX2Nsb3NlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworI2VuZGlmCisJTlM4MzkwX2luaXQoZGV2LCAwKTsKKworI2lmIDEKKwkvKiBFbmFibGUgaW50ZXJydXB0IGdlbmVyYXRpb24gb24gc29mdGNvbmZpZyBjYXJkcyAtLSBNLlUgKi8KKwkvKiAuLiBidXQgcG9zc2libHkgcG90ZW50aWFsbHkgdW5zYWZlIC0gRG9uYWxkICovCisJaWYgKGluYihpb2FkZHIrMTQpICYgMHgyMCkKKwkJb3V0YihpbmIoaW9hZGRyKzQpfDB4ODAsIGlvYWRkcis0KTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dkX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyIC0gV0RfTklDX09GRlNFVDsgLyogV0RfQ01EUkVHICovCisKKyAgLyogTWFwIGluIHRoZSBzaGFyZWQgbWVtb3J5LiBBbHdheXMgc2V0IHJlZ2lzdGVyIDAgbGFzdCB0byByZW1haW4KKwkgY29tcGF0aWJsZSB3aXRoIHZlcnkgb2xkIGJvYXJkcy4gKi8KKyAgZWlfc3RhdHVzLnJlZzAgPSAoKGRldi0+bWVtX3N0YXJ0Pj4xMykgJiAweDNmKSB8IFdEX01FTUVOQjsKKyAgZWlfc3RhdHVzLnJlZzUgPSAoKGRldi0+bWVtX3N0YXJ0Pj4xOSkgJiAweDFmKSB8IE5JQzE2OworCisgIGlmIChlaV9zdGF0dXMud29yZDE2KQorCSAgb3V0YihlaV9zdGF0dXMucmVnNSwgaW9hZGRyK1dEX0NNRFJFRzUpOworICBvdXRiKGVpX3N0YXR1cy5yZWcwLCBpb2FkZHIpOyAvKiBXRF9DTURSRUcgKi8KKworICBlaV9vcGVuKGRldik7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAord2RfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCB3ZF9jbWRfcG9ydCA9IGRldi0+YmFzZV9hZGRyIC0gV0RfTklDX09GRlNFVDsgLyogV0RfQ01EUkVHICovCisKKwlvdXRiKFdEX1JFU0VULCB3ZF9jbWRfcG9ydCk7CisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldHRpbmcgdGhlIFdEODB4MyB0PSVsdS4uLiIsIGppZmZpZXMpOworCWVpX3N0YXR1cy50eGluZyA9IDA7CisKKwkvKiBTZXQgdXAgdGhlIEFTSUMgcmVnaXN0ZXJzLCBqdXN0IGluIGNhc2Ugc29tZXRoaW5nIGNoYW5nZWQgdGhlbS4gKi8KKwlvdXRiKCgoKGRldi0+bWVtX3N0YXJ0Pj4xMykgJiAweDNmKXxXRF9NRU1FTkIpLCB3ZF9jbWRfcG9ydCk7CisJaWYgKGVpX3N0YXR1cy53b3JkMTYpCisJCW91dGIoTklDMTYgfCAoKGRldi0+bWVtX3N0YXJ0Pj4xOSkgJiAweDFmKSwgd2RfY21kX3BvcnQrV0RfQ01EUkVHNSk7CisKKwlpZiAoZWlfZGVidWcgPiAxKSBwcmludGsoInJlc2V0IGRvbmVcbiIpOworCXJldHVybjsKK30KKworLyogR3JhYiB0aGUgODM5MCBzcGVjaWZpYyBoZWFkZXIuIFNpbWlsYXIgdG8gdGhlIGJsb2NrX2lucHV0IHJvdXRpbmUsIGJ1dAorICAgd2UgZG9uJ3QgbmVlZCB0byBiZSBjb25jZXJuZWQgd2l0aCByaW5nIHdyYXAgYXMgdGhlIGhlYWRlciB3aWxsIGJlIGF0CisgICB0aGUgc3RhcnQgb2YgYSBwYWdlLCBzbyB3ZSBvcHRpbWl6ZSBhY2NvcmRpbmdseS4gKi8KKworc3RhdGljIHZvaWQKK3dkX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCisJaW50IHdkX2NtZHJlZyA9IGRldi0+YmFzZV9hZGRyIC0gV0RfTklDX09GRlNFVDsgLyogV0RfQ01EUkVHICovCisJdm9pZCBfX2lvbWVtICpoZHJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgKChyaW5nX3BhZ2UgLSBXRF9TVEFSVF9QRyk8PDgpOworCisJLyogV2UnbGwgYWx3YXlzIGdldCBhIDQgYnl0ZSBoZWFkZXIgcmVhZCBmb2xsb3dlZCBieSBhIHBhY2tldCByZWFkLCBzbworCSAgIHdlIGVuYWJsZSAxNiBiaXQgbW9kZSBiZWZvcmUgdGhlIGhlYWRlciwgYW5kIGRpc2FibGUgYWZ0ZXIgdGhlIGJvZHkuICovCisJaWYgKGVpX3N0YXR1cy53b3JkMTYpCisJCW91dGIoSVNBMTYgfCBlaV9zdGF0dXMucmVnNSwgd2RfY21kcmVnK1dEX0NNRFJFRzUpOworCisjaWZkZWYgX19CSUdfRU5ESUFOCisJLyogT2ZmaWNpYWxseSB0aGlzIGlzIHdoYXQgd2UgYXJlIGRvaW5nLCBidXQgdGhlIHJlYWRsKCkgaXMgZmFzdGVyICovCisJLyogdW5mb3J0dW5hdGVseSBpdCBpc24ndCBlbmRpYW4gYXdhcmUgb2YgdGhlIHN0cnVjdCAgICAgICAgICAgICAgICovCisJbWVtY3B5X2Zyb21pbyhoZHIsIGhkcl9zdGFydCwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSk7CisJaGRyLT5jb3VudCA9IGxlMTZfdG9fY3B1KGhkci0+Y291bnQpOworI2Vsc2UKKwkoKHVuc2lnbmVkIGludCopaGRyKVswXSA9IHJlYWRsKGhkcl9zdGFydCk7CisjZW5kaWYKK30KKworLyogQmxvY2sgaW5wdXQgYW5kIG91dHB1dCBhcmUgZWFzeSBvbiBzaGFyZWQgbWVtb3J5IGV0aGVyY2FyZHMsIGFuZCB0cml2aWFsCisgICBvbiB0aGUgV2VzdGVybiBkaWdpdGFsIGNhcmQgd2hlcmUgdGhlcmUgaXMgbm8gY2hvaWNlIG9mIGhvdyB0byBkbyBpdC4KKyAgIFRoZSBvbmx5IGNvbXBsaWNhdGlvbnMgYXJlIHRoYXQgdGhlIHJpbmcgYnVmZmVyIHdyYXBzLCBhbmQgbmVlZCB0byBtYXAKKyAgIHN3aXRjaCBiZXR3ZWVuIDgtIGFuZCAxNi1iaXQgbW9kZXMuICovCisKK3N0YXRpYyB2b2lkCit3ZF9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKwlpbnQgd2RfY21kcmVnID0gZGV2LT5iYXNlX2FkZHIgLSBXRF9OSUNfT0ZGU0VUOyAvKiBXRF9DTURSRUcgKi8KKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHJpbmdfb2Zmc2V0IC0gKFdEX1NUQVJUX1BHPDw4KTsKKwl2b2lkIF9faW9tZW0gKnhmZXJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgb2Zmc2V0OworCisJaWYgKG9mZnNldCArIGNvdW50ID4gZWlfc3RhdHVzLnByaXYpIHsKKwkJLyogV2UgbXVzdCB3cmFwIHRoZSBpbnB1dCBtb3ZlLiAqLworCQlpbnQgc2VtaV9jb3VudCA9IGVpX3N0YXR1cy5wcml2IC0gb2Zmc2V0OworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgeGZlcl9zdGFydCwgc2VtaV9jb3VudCk7CisJCWNvdW50IC09IHNlbWlfY291bnQ7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgc2VtaV9jb3VudCwgZWlfc3RhdHVzLm1lbSArIFRYX1BBR0VTICogMjU2LCBjb3VudCk7CisJfSBlbHNlIHsKKwkJLyogUGFja2V0IGlzIGluIG9uZSBjaHVuayAtLSB3ZSBjYW4gY29weSArIGNrc3VtLiAqLworCQlldGhfaW9fY29weV9hbmRfc3VtKHNrYiwgeGZlcl9zdGFydCwgY291bnQsIDApOworCX0KKworCS8qIFR1cm4gb2ZmIDE2IGJpdCBhY2Nlc3Mgc28gdGhhdCByZWJvb3Qgd29ya3MuCSBJU0EgYnJhaW4tZGFtYWdlICovCisJaWYgKGVpX3N0YXR1cy53b3JkMTYpCisJCW91dGIoZWlfc3RhdHVzLnJlZzUsIHdkX2NtZHJlZytXRF9DTURSRUc1KTsKK30KKworc3RhdGljIHZvaWQKK3dkX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQlpbnQgc3RhcnRfcGFnZSkKK3sKKwlpbnQgd2RfY21kcmVnID0gZGV2LT5iYXNlX2FkZHIgLSBXRF9OSUNfT0ZGU0VUOyAvKiBXRF9DTURSRUcgKi8KKwl2b2lkIF9faW9tZW0gKnNobWVtID0gZWlfc3RhdHVzLm1lbSArICgoc3RhcnRfcGFnZSAtIFdEX1NUQVJUX1BHKTw8OCk7CisKKworCWlmIChlaV9zdGF0dXMud29yZDE2KSB7CisJCS8qIFR1cm4gb24gYW5kIG9mZiAxNiBiaXQgYWNjZXNzIHNvIHRoYXQgcmVib290IHdvcmtzLiAqLworCQlvdXRiKElTQTE2IHwgZWlfc3RhdHVzLnJlZzUsIHdkX2NtZHJlZytXRF9DTURSRUc1KTsKKwkJbWVtY3B5X3RvaW8oc2htZW0sIGJ1ZiwgY291bnQpOworCQlvdXRiKGVpX3N0YXR1cy5yZWc1LCB3ZF9jbWRyZWcrV0RfQ01EUkVHNSk7CisJfSBlbHNlCisJCW1lbWNweV90b2lvKHNobWVtLCBidWYsIGNvdW50KTsKK30KKworCitzdGF0aWMgaW50Cit3ZF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCB3ZF9jbWRyZWcgPSBkZXYtPmJhc2VfYWRkciAtIFdEX05JQ19PRkZTRVQ7IC8qIFdEX0NNRFJFRyAqLworCisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKCIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOworCWVpX2Nsb3NlKGRldik7CisKKwkvKiBDaGFuZ2UgZnJvbSAxNi1iaXQgdG8gOC1iaXQgc2hhcmVkIG1lbW9yeSBzbyByZWJvb3Qgd29ya3MuICovCisJaWYgKGVpX3N0YXR1cy53b3JkMTYpCisJCW91dGIoZWlfc3RhdHVzLnJlZzUsIHdkX2NtZHJlZyArIFdEX0NNRFJFRzUgKTsKKworCS8qIEFuZCBkaXNhYmxlIHRoZSBzaGFyZWQgbWVtb3J5LiAqLworCW91dGIoZWlfc3RhdHVzLnJlZzAgJiB+V0RfTUVNRU5CLCB3ZF9jbWRyZWcpOworCisJcmV0dXJuIDA7Cit9CisKKwwKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUgTUFYX1dEX0NBUkRTCTQJLyogTWF4IG51bWJlciBvZiB3ZCBjYXJkcyBwZXIgbW9kdWxlICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl93ZFtNQVhfV0RfQ0FSRFNdOworc3RhdGljIGludCBpb1tNQVhfV0RfQ0FSRFNdOworc3RhdGljIGludCBpcnFbTUFYX1dEX0NBUkRTXTsKK3N0YXRpYyBpbnQgbWVtW01BWF9XRF9DQVJEU107CitzdGF0aWMgaW50IG1lbV9lbmRbTUFYX1dEX0NBUkRTXTsJLyogZm9yIG5vbiBzdGQuIG1lbSBzaXplICovCisKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWVtLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG1lbV9lbmQsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGJhc2UgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIG51bWJlcihzKSAoaWdub3JlZCBmb3IgUHVyZURhdGEgYm9hcmRzKSIpOworTU9EVUxFX1BBUk1fREVTQyhtZW0sICJtZW1vcnkgYmFzZSBhZGRyZXNzKGVzKShpZ25vcmVkIGZvciBQdXJlRGF0YSBib2FyZHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKG1lbV9lbmQsICJtZW1vcnkgZW5kIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklTQSBXZXN0ZXJuIERpZ2l0YWwgd2Q4MDAzL3dkODAxMyA7IFNNQyBFbGl0ZSwgRWxpdGUxNiBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogVGhpcyBpcyBzZXQgdXAgc28gdGhhdCBvbmx5IGEgc2luZ2xlIGF1dG9wcm9iZSB0YWtlcyBwbGFjZSBwZXIgY2FsbC4KK0lTQSBkZXZpY2UgYXV0b3Byb2JlcyBvbiBhIHJ1bm5pbmcgbWFjaGluZSBhcmUgbm90IHJlY29tbWVuZGVkLiAqLworaW50Citpbml0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHRoaXNfZGV2LCBmb3VuZCA9IDA7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfV0RfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJaWYgKGlvW3RoaXNfZGV2XSA9PSAwKSAgeworCQkJaWYgKHRoaXNfZGV2ICE9IDApIGJyZWFrOyAvKiBvbmx5IGF1dG9wcm9iZSAxc3Qgb25lICovCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIndkLmM6IFByZXNlbnRseSBhdXRvcHJvYmluZyAobm90IHJlY29tbWVuZGVkKSBmb3IgYSBzaW5nbGUgY2FyZC5cbiIpOworCQl9CisJCWRldiA9IGFsbG9jX2VpX25ldGRldigpOworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCQlkZXYtPmlycSA9IGlycVt0aGlzX2Rldl07CisJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOworCQlkZXYtPm1lbV9zdGFydCA9IG1lbVt0aGlzX2Rldl07CisJCWRldi0+bWVtX2VuZCA9IG1lbV9lbmRbdGhpc19kZXZdOworCQlpZiAoZG9fd2RfcHJvYmUoZGV2KSA9PSAwKSB7CisJCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgeworCQkJCWRldl93ZFtmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndkLmM6IE5vIHdkODB4MyBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsIGlvW3RoaXNfZGV2XSk7CisJCWJyZWFrOworCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiAtRU5YSU87Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX1dEX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfd2RbdGhpc19kZXZdOworCQlpZiAoZGV2KSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorfQorI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhYTEyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcKQEAgLTAsMCArMSwzNjUgQEAKKyMKKyMgV2lyZWxlc3MgTEFOIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIldpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKSIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMKKworY29uZmlnIE5FVF9SQURJTworCWJvb2wgIldpcmVsZXNzIExBTiBkcml2ZXJzIChub24taGFtcmFkaW8pICYgV2lyZWxlc3MgRXh0ZW5zaW9ucyIKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB3aXJlbGVzcyBMQU5zIGFuZCBldmVyeXRoaW5nIGhhdmluZyB0byBkbyB3aXRoIHJhZGlvLAorCSAgYnV0IG5vdCB3aXRoIGFtYXRldXIgcmFkaW8gb3IgRk0gYnJvYWRjYXN0aW5nLgorCisJICBTYXlpbmcgWSBoZXJlIGFsc28gZW5hYmxlcyB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucyAoY3JlYXRlcworCSAgL3Byb2MvbmV0L3dpcmVsZXNzIGFuZCBlbmFibGVzIGl3Y29uZmlnIGFjY2VzcykuIFRoZSBXaXJlbGVzcworCSAgRXh0ZW5zaW9uIGlzIGEgZ2VuZXJpYyBBUEkgYWxsb3dpbmcgYSBkcml2ZXIgdG8gZXhwb3NlIHRvIHRoZSB1c2VyCisJICBzcGFjZSBjb25maWd1cmF0aW9uIGFuZCBzdGF0aXN0aWNzIHNwZWNpZmljIHRvIGNvbW1vbiBXaXJlbGVzcyBMQU5zLgorCSAgVGhlIGJlYXV0eSBvZiBpdCBpcyB0aGF0IGEgc2luZ2xlIHNldCBvZiB0b29sIGNhbiBzdXBwb3J0IGFsbCB0aGUKKwkgIHZhcmlhdGlvbnMgb2YgV2lyZWxlc3MgTEFOcywgcmVnYXJkbGVzcyBvZiB0aGVpciB0eXBlIChhcyBsb25nIGFzCisJICB0aGUgZHJpdmVyIHN1cHBvcnRzIFdpcmVsZXNzIEV4dGVuc2lvbikuIEFub3RoZXIgYWR2YW50YWdlIGlzIHRoYXQKKwkgIHRoZXNlIHBhcmFtZXRlcnMgbWF5IGJlIGNoYW5nZWQgb24gdGhlIGZseSB3aXRob3V0IHJlc3RhcnRpbmcgdGhlCisJICBkcml2ZXIgKG9yIExpbnV4KS4gSWYgeW91IHdpc2ggdG8gdXNlIFdpcmVsZXNzIEV4dGVuc2lvbnMgd2l0aAorCSAgd2lyZWxlc3MgUENNQ0lBIChQQy0pIGNhcmRzLCB5b3UgbmVlZCB0byBzYXkgWSBoZXJlOyB5b3UgY2FuIGZldGNoCisJICB0aGUgdG9vbHMgZnJvbQorCSAgPGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvVG9vbHMuaHRtbD4uCisKKwkgIFNvbWUgdXNlci1sZXZlbCBkcml2ZXJzIGZvciBzY2FyYWIgZGV2aWNlcyB3aGljaCBkb24ndCByZXF1aXJlCisJICBzcGVjaWFsIGtlcm5lbCBzdXBwb3J0IGFyZSBhdmFpbGFibGUgZnJvbQorCSAgPGZ0cDovL3NoYWRvdy5jYWJpLm5ldC9wdWIvTGludXgvPi4KKworIyBOb3RlIDogdGhlIGNhcmRzIGFyZSBvYnNvbGV0ZSAoY2FuJ3QgYnV5IHRoZW0gYW55bW9yZSksIGJ1dCB0aGUgZHJpdmVycworIyBhcmUgbm90LCBhcyBwZW9wbGUgYXJlIHN0aWxsIHVzaW5nIHRoZW0uLi4KK2NvbW1lbnQgIk9ic29sZXRlIFdpcmVsZXNzIGNhcmRzIHN1cHBvcnQgKHByZS04MDIuMTEpIgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIChJTkVUIHx8IElTQSB8fCBQQ01DSUEpCisKK2NvbmZpZyBTVFJJUAorCXRyaXN0YXRlICJTVFJJUCAoTWV0cmljb20gc3Rhcm1vZGUgcmFkaW8gSVApIgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIElORVQKKwktLS1oZWxwLS0tCisJICBTYXkgWSBpZiB5b3UgaGF2ZSBhIE1ldHJpY29tIHJhZGlvIGFuZCBpbnRlbmQgdG8gdXNlIFN0YXJtb2RlIFJhZGlvCisJICBJUC4gU1RSSVAgaXMgYSByYWRpbyBwcm90b2NvbCBkZXZlbG9wZWQgZm9yIHRoZSBNb3NxdWl0b05ldCBwcm9qZWN0CisJICAob24gdGhlIFdXVyBhdCA8aHR0cDovL21vc3F1aXRvbmV0LnN0YW5mb3JkLmVkdS8+KSB0byBzZW5kIEludGVybmV0CisJICB0cmFmZmljIHVzaW5nIE1ldHJpY29tIHJhZGlvcy4gIE1ldHJpY29tIHJhZGlvcyBhcmUgc21hbGwsIGJhdHRlcnkKKwkgIHBvd2VyZWQsIDEwMGtiaXQvc2VjIHBhY2tldCByYWRpbyB0cmFuc2NlaXZlcnMsIGFib3V0IHRoZSBzaXplIGFuZAorCSAgd2VpZ2h0IG9mIGEgY2VsbHVsYXIgdGVsZXBob25lLiAoWW91IG1heSBhbHNvIGhhdmUgaGVhcmQgdGhlbSBjYWxsZWQKKwkgICJNZXRyaWNvbSBtb2RlbXMiIGJ1dCB3ZSBhdm9pZCB0aGUgdGVybSAibW9kZW0iIGJlY2F1c2UgaXQgbWlzbGVhZHMKKwkgIG1hbnkgcGVvcGxlIGludG8gdGhpbmtpbmcgdGhhdCB5b3UgY2FuIHBsdWcgYSBNZXRyaWNvbSBtb2RlbSBpbnRvIGEKKwkgIHBob25lIGxpbmUgYW5kIHVzZSBpdCBhcyBhIG1vZGVtLikKKworCSAgWW91IGNhbiB1c2UgU1RSSVAgb24gYW55IExpbnV4IG1hY2hpbmUgd2l0aCBhIHNlcmlhbCBwb3J0LCBhbHRob3VnaAorCSAgaXQgaXMgb2J2aW91c2x5IG1vc3QgdXNlZnVsIGZvciBwZW9wbGUgd2l0aCBsYXB0b3AgY29tcHV0ZXJzLiBJZiB5b3UKKwkgIHRoaW5rIHlvdSBtaWdodCBnZXQgYSBNZXRyaWNvbSByYWRpbyBpbiB0aGUgZnV0dXJlLCB0aGVyZSBpcyBubyBoYXJtCisJICBpbiBzYXlpbmcgWSB0byBTVFJJUCBub3csIGV4Y2VwdCB0aGF0IGl0IG1ha2VzIHRoZSBrZXJuZWwgYSBiaXQKKwkgIGJpZ2dlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBzdHJpcC4KKworY29uZmlnIEFSTEFOCisJdHJpc3RhdGUgIkFpcm9uZXQgQXJsYW4gNjU1ICYgSUMyMjAwIERTIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgSVNBICYmICE2NEJJVAorCS0tLWhlbHAtLS0KKwkgIEFpcm9uZXQgbWFrZXMgQXJsYW4sIGEgY2xhc3Mgb2Ygd2lyZWxlc3MgTEFOIGFkYXB0ZXJzLiBUaGVzZSB1c2UgdGhlCisJICB3d3cuVGVseG9uLmNvbSBjaGlwLCB3aGljaCBpcyBhbHNvIHVzZWQgb24gc2V2ZXJhbCBzaW1pbGFyIGNhcmRzLgorCSAgVGhpcyBkcml2ZXIgaXMgdGVzdGVkIG9uIHRoZSA2NTUgYW5kIElDMjIwMCBzZXJpZXMgY2FyZHMuIExvb2sgYXQKKwkgIDxodHRwOi8vd3d3LnlsZW51cm1lLmVlL35lbG1lci82NTUvPiBmb3IgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbi4KKworCSAgVGhlIGRyaXZlciBpcyBidWlsdCBhcyB0d28gbW9kdWxlcywgYXJsYW4gYW5kIGFybGFuLXByb2MuIFRoZSBsYXR0ZXIKKwkgIGlzIHRoZSAvcHJvYyBpbnRlcmZhY2UgYW5kIGlzIG5vdCBuZWVkZWQgbW9zdCBvZiB0aW1lLgorCisJICBPbiBzb21lIGNvbXB1dGVycyB0aGUgY2FyZCBlbmRzIHVwIGluIG5vbi12YWxpZCBzdGF0ZSBhZnRlciBzb21lCisJICB0aW1lLiBVc2UgYSBwaW5nLXJlc2V0IHNjcmlwdCB0byBjbGVhciBpdC4KKworY29uZmlnIFdBVkVMQU4KKwl0cmlzdGF0ZSAiQVQmVC9MdWNlbnQgb2xkIFdhdmVMQU4gJiBERUMgUm9hbUFib3V0IERTIElTQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIElTQQorCS0tLWhlbHAtLS0KKwkgIFRoZSBMdWNlbnQgV2F2ZUxBTiAoZm9ybWVybHkgTkNSIGFuZCBBVCZUOyBvciBERUMgUm9hbUFib3V0IERTKSBpcworCSAgYSBSYWRpbyBMQU4gKHdpcmVsZXNzIEV0aGVybmV0LWxpa2UgTG9jYWwgQXJlYSBOZXR3b3JrKSB1c2luZyB0aGUKKwkgIHJhZGlvIGZyZXF1ZW5jaWVzIDkwMCBNSHogYW5kIDIuNCBHSHouCisKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnQgdGhlIElTQSB2ZXJzaW9uIG9mIHRoZSBXYXZlTEFOIGNhcmQuICBBIHNlcGFyYXRlCisJICBkcml2ZXIgZm9yIHRoZSBQQ01DSUEgKFBDLWNhcmQpIGhhcmR3YXJlIGlzIGF2YWlsYWJsZSBpbiBEYXZpZAorCSAgSGluZHMnIHBjbWNpYS1jcyBwYWNrYWdlIChzZWUgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9DaGFuZ2VzPgorCSAgZm9yIGxvY2F0aW9uKS4KKworCSAgSWYgeW91IHdhbnQgdG8gdXNlIGFuIElTQSBXYXZlTEFOIGNhcmQgdW5kZXIgTGludXgsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiBTb21lIG1vcmUgc3BlY2lmaWMKKwkgIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhdmVsYW4udHh0PiBhbmQgaW4gdGhlIHNvdXJjZSBjb2RlCisJICA8ZmlsZTpkcml2ZXJzL25ldC93YXZlbGFuLnAuaD4uCisKKwkgIFlvdSB3aWxsIGFsc28gbmVlZCB0aGUgd2lyZWxlc3MgdG9vbHMgcGFja2FnZSBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvVG9vbHMuaHRtbD4uCisJICBQbGVhc2UgcmVhZCB0aGUgbWFuIHBhZ2VzIGNvbnRhaW5lZCB0aGVyZWluLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCB3YXZlbGFuLgorCitjb25maWcgUENNQ0lBX1dBVkVMQU4KKwl0cmlzdGF0ZSAiQVQmVC9MdWNlbnQgb2xkIFdhdmVMQU4gUGNtY2lhIHdpcmVsZXNzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCBhbiBBVCZUL0x1Y2VudCBXYXZlbGFuIFBDTUNJQQorCSAgKFBDLWNhcmQpIHdpcmVsZXNzIEV0aGVybmV0IG5ldHdvcmtpbmcgY2FyZCB0byB5b3VyIGNvbXB1dGVyLiAgVGhpcworCSAgZHJpdmVyIGlzIGZvciB0aGUgbm9uLUlFRUUtODAyLjExIFdhdmVsYW4gY2FyZHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHdhdmVsYW5fY3MuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUENNQ0lBX05FVFdBVkUKKwl0cmlzdGF0ZSAiWGlyY29tIE5ldHdhdmUgQWlyU3VyZmVyIFBjbWNpYSB3aXJlbGVzcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggdGhpcyB0eXBlIG9mIFBDTUNJQSAoUEMtY2FyZCkKKwkgIHdpcmVsZXNzIEV0aGVybmV0IG5ldHdvcmtpbmcgY2FyZCB0byB5b3VyIGNvbXB1dGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBuZXR3YXZlX2NzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29tbWVudCAiV2lyZWxlc3MgODAyLjExIEZyZXF1ZW5jeSBIb3BwaW5nIGNhcmRzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBCisKK2NvbmZpZyBQQ01DSUFfUkFZQ1MKKwl0cmlzdGF0ZSAiQXZpYXRvci9SYXl0aGVvbiAyLjRNSHogd2lyZWxlc3Mgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ01DSUEKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGFuIEF2aWF0b3IvUmF5dGhlb24gUENNQ0lBCisJICAoUEMtY2FyZCkgd2lyZWxlc3MgRXRoZXJuZXQgbmV0d29ya2luZyBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCisJICBQbGVhc2UgcmVhZCB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcmF5X2NzLnR4dD4gZm9yCisJICBkZXRhaWxzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCByYXlfY3MuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb21tZW50ICJXaXJlbGVzcyA4MDIuMTFiIElTQS9QQ0kgY2FyZHMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiAoSVNBIHx8IFBDSSB8fCBQUENfUE1BQyB8fCBQQ01DSUEpCisKK2NvbmZpZyBBSVJPCisJdHJpc3RhdGUgIkNpc2NvL0Fpcm9uZXQgMzRYLzM1WC80NTAwLzQ4MDAgSVNBIGFuZCBQQ0kgY2FyZHMiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgSVNBICYmIChQQ0kgfHwgQlJPS0VOKQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIHN0YW5kYXJkIExpbnV4IGRyaXZlciB0byBzdXBwb3J0IENpc2NvL0Fpcm9uZXQgSVNBIGFuZAorCSAgUENJIDgwMi4xMSB3aXJlbGVzcyBjYXJkcy4KKwkgIEl0IHN1cHBvcnRzIHRoZSBuZXcgODAyLjExYiBjYXJkcyBmcm9tIENpc2NvIChDaXNjbyAzNFgsIENpc2NvIDM1WAorCSAgLSB3aXRoIG9yIHdpdGhvdXQgZW5jcnlwdGlvbikgYXMgd2VsbCBhcyBjYXJkIGJlZm9yZSB0aGUgQ2lzY28KKwkgIGFxdWlzaXRpb24gKEFpcm9uZXQgNDUwMCwgQWlyb25ldCA0ODAwLCBBaXJvbmV0IDQ4MDBCKS4KKworCSAgVGhpcyBkcml2ZXIgc3VwcG9ydCBib3RoIHRoZSBzdGFuZGFyZCBMaW51eCBXaXJlbGVzcyBFeHRlbnNpb25zCisJICBhbmQgQ2lzY28gcHJvcHJpZXRhcnkgQVBJLCBzbyBib3RoIHRoZSBMaW51eCBXaXJlbGVzcyBUb29scyBhbmQgdGhlCisJICBDaXNjbyBMaW51eCB1dGlsaXRpZXMgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBjYXJkLgorCisJICBUaGUgZHJpdmVyIGNhbiBiZSBjb21waWxlZCBhcyBhIG1vZHVsZSBhbmQgd2lsbCBiZSBuYW1lZCAiYWlybyIuCisKK2NvbmZpZyBIRVJNRVMKKwl0cmlzdGF0ZSAiSGVybWVzIGNoaXBzZXQgODAyLjExYiBzdXBwb3J0IChPcmlub2NvL1ByaXNtMi9TeW1ib2wpIgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIChQUENfUE1BQyB8fCBQQ0kgfHwgUENNQ0lBKQorCS0tLWhlbHAtLS0KKwkgIEEgZHJpdmVyIGZvciA4MDIuMTFiIHdpcmVsZXNzIGNhcmRzIGJhc2VkIGJhc2VkIG9uIHRoZSAiSGVybWVzIiBvcgorCSAgSW50ZXJzaWwgSEZBMzg0eCAoUHJpc20gMikgTUFDIGNvbnRyb2xsZXIuICBUaGlzIGluY2x1ZGVzIHRoZSB2YXN0CisJICBtYWpvcml0eSBvZiB0aGUgUENNQ0lBIDgwMi4xMWIgY2FyZHMgKHdoaWNoIGFyZSBuZWFybHkgYWxsIHJlYmFkZ2VzKQorCSAgLSBleGNlcHQgZm9yIHRoZSBDaXNjby9BaXJvbmV0IGNhcmRzLiAgQ2FyZHMgc3VwcG9ydGVkIGluY2x1ZGUgdGhlCisJICBBcHBsZSBBaXJwb3J0IChub3QgYSBQQ01DSUEgY2FyZCksIFdhdmVsYW5JRUVFL09yaW5vY28sCisJICBDYWJsZXRyb24vRW50ZXJhU3lzIFJvYW1hYm91dCwgRUxTQSBBaXJMYW5jZXIsIE1FTENPIEJ1ZmZhbG8sIEF2YXlhLAorCSAgSUJNIEhpZ2ggUmF0ZSBXaXJlbGVzcywgRmFycmFsb24gU3l5bGluZSwgU2Ftc3VuZyBNYWdpY0xBTiwgTmV0Z2VhcgorCSAgTUE0MDEsIExpbmtTeXMgV1BDLTExLCBELUxpbmsgRFdMLTY1MCwgM0NvbSBBaXJDb25uZWN0LCBJbnRlbAorCSAgUFJPL1dpcmVsZXNzLCBhbmQgU3ltYm9sIFNwZWN0cnVtMjQgSGlnaCBSYXRlIGFtb25nc3Qgb3RoZXJzLgorCisJICBUaGlzIG9wdGlvbiBpbmNsdWRlcyB0aGUgZ3V0cyBvZiB0aGUgZHJpdmVyLCBidXQgaW4gb3JkZXIgdG8KKwkgIGFjdHVhbGx5IHVzZSBhIGNhcmQgeW91IHdpbGwgYWxzbyBuZWVkIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBQQ01DSUEKKwkgIEhlcm1lcyBjYXJkcywgUExYOTA1MiBiYXNlZCBQQ0kgYWRhcHRvcnMgb3IgdGhlIEFwcGxlIEFpcnBvcnQgYmVsb3cuCisKKwkgIFlvdSB3aWxsIGFsc28gdmVyeSBsaWtlbHkgYWxzbyBuZWVkIHRoZSBXaXJlbGVzcyBUb29scyBpbiBvcmRlciB0bworCSAgY29uZmlndXJlIHlvdXIgY2FyZCBhbmQgdGhhdCAvZXRjL3BjbWNpYS93aXJlbGVzcy5vcHRzIHdvcmtzIDoKKwkgIDxodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4L1Rvb2xzLmh0bWw+CisKK2NvbmZpZyBBUFBMRV9BSVJQT1JUCisJdHJpc3RhdGUgIkFwcGxlIEFpcnBvcnQgc3VwcG9ydCAoYnVpbHQtaW4pIgorCWRlcGVuZHMgb24gUFBDX1BNQUMgJiYgSEVSTUVTCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBBaXJwb3J0IDgwMi4xMWIgd2lyZWxlc3MgRXRoZXJuZXQgaGFyZHdhcmUKKwkgIGJ1aWx0IGludG8gdGhlIE1hY2ludG9zaCBpQm9vayBhbmQgb3RoZXIgcmVjZW50IFBvd2VyUEMtYmFzZWQKKwkgIE1hY2ludG9zaCBtYWNoaW5lcy4gVGhpcyBpcyBlc3NlbnRpYWxseSBhIEx1Y2VudCBPcmlub2NvIGNhcmQgd2l0aCAKKwkgIGEgbm9uLXN0YW5kYXJkIGludGVyZmFjZQorCitjb25maWcgUExYX0hFUk1FUworCXRyaXN0YXRlICJIZXJtZXMgaW4gUExYOTA1MiBiYXNlZCBQQ0kgYWRhcHRvciBzdXBwb3J0IChOZXRnZWFyIE1BMzAxIGV0Yy4pIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gUENJICYmIEhFUk1FUyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgUENNQ0lBIGNhcmRzIHN1cHBvcnRlZCBieSB0aGUgIkhlcm1lcyIgKGFrYQorCSAgb3Jpbm9jbykgZHJpdmVyIHdoZW4gdXNlZCBpbiBQTFg5MDUyIGJhc2VkIFBDSSBhZGFwdG9ycy4gIFRoZXNlCisJICBhZGFwdG9ycyBhcmUgbm90IGEgZnVsbCBQQ01DSUEgY29udHJvbGxlciBidXQgYWN0IGFzIGEgbW9yZSBsaW1pdGVkCisJICBQQ0kgPC0+IFBDTUNJQSBicmlkZ2UuICBTZXZlcmFsIHZlbmRvcnMgc2VsbCBzdWNoIGFkYXB0b3JzIHNvIHRoYXQKKwkgIDgwMi4xMWIgUENNQ0lBIGNhcmRzIGNhbiBiZSB1c2VkIGluIGRlc2t0b3AgbWFjaGluZXMuICBUaGUgTmV0Z2VhcgorCSAgTUEzMDEgaXMgc3VjaCBhbiBhZGFwdG9yLgorCisJICBTdXBwb3J0IGZvciB0aGVzZSBhZGFwdG9ycyBpcyBzbyBmYXIgc3RpbGwgaW5jb21wbGV0ZSBhbmQgYnVnZ3kuCisJICBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KKworY29uZmlnIFRNRF9IRVJNRVMKKwl0cmlzdGF0ZSAiSGVybWVzIGluIFRNRDcxNjAgYmFzZWQgUENJIGFkYXB0b3Igc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFBDSSAmJiBIRVJNRVMgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFBDTUNJQSBjYXJkcyBzdXBwb3J0ZWQgYnkgdGhlICJIZXJtZXMiIChha2EKKwkgIG9yaW5vY28pIGRyaXZlciB3aGVuIHVzZWQgaW4gVE1ENzE2MCBiYXNlZCBQQ0kgYWRhcHRvcnMuICBUaGVzZQorCSAgYWRhcHRvcnMgYXJlIG5vdCBhIGZ1bGwgUENNQ0lBIGNvbnRyb2xsZXIgYnV0IGFjdCBhcyBhIG1vcmUgbGltaXRlZAorCSAgUENJIDwtPiBQQ01DSUEgYnJpZGdlLiAgU2V2ZXJhbCB2ZW5kb3JzIHNlbGwgc3VjaCBhZGFwdG9ycyBzbyB0aGF0CisJICA4MDIuMTFiIFBDTUNJQSBjYXJkcyBjYW4gYmUgdXNlZCBpbiBkZXNrdG9wIG1hY2hpbmVzLgorCisJICBTdXBwb3J0IGZvciB0aGVzZSBhZGFwdG9ycyBpcyBzbyBmYXIgc3RpbGwgaW5jb21wbGV0ZSBhbmQgYnVnZ3kuCisJICBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KKworY29uZmlnIFBDSV9IRVJNRVMKKwl0cmlzdGF0ZSAiUHJpc20gMi41IFBDSSA4MDIuMTFiIGFkYXB0b3Igc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFBDSSAmJiBIRVJNRVMgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFBDSSBhbmQgbWluaS1QQ0kgODAyLjExYiB3aXJlbGVzcyBOSUNzIGJhc2VkIG9uCisJICB0aGUgUHJpc20gMi41IGNoaXBzZXQuICBUaGVzZSBhcmUgdHJ1ZSBQQ0kgY2FyZHMsIG5vdCB0aGUgODAyLjExYgorCSAgUENNQ0lBIGNhcmRzIGJ1bmRsZWQgd2l0aCBQQ0k8LT5QQ01DSUEgYWRhcHRvcnMgd2hpY2ggYXJlIGFsc28KKwkgIGNvbW1vbi4gIFNvbWUgb2YgdGhlIGJ1aWx0LWluIHdpcmVsZXNzIGFkYXB0b3JzIGluIGxhcHRvcHMgYXJlIG9mCisJICB0aGlzIHZhcmlldHkuCisKK2NvbmZpZyBBVE1FTAorICAgICAgdHJpc3RhdGUgIkF0bWVsIGF0NzZjNTB4IGNoaXBzZXQgIDgwMi4xMWIgc3VwcG9ydCIKKyAgICAgIGRlcGVuZHMgb24gTkVUX1JBRElPICYmIEVYUEVSSU1FTlRBTAorICAgICAgc2VsZWN0IEZXX0xPQURFUgorICAgICAgc2VsZWN0IENSQzMyCisgICAgICAgLS0taGVscC0tLQorICAgICAgICBBIGRyaXZlciA4MDIuMTFiIHdpcmVsZXNzIGNhcmRzIGJhc2VkIG9uIHRoZSBBdG1lbCBmYXN0LXZuZXQKKyAgICAgICAgY2hpcHMuIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHN0YW5kYXJkIExpbnV4IHdpcmVsZXNzIGV4dGVuc2lvbnMuIAorIAorICAgICAgICBNYW55ICBjYXJkcyBiYXNlZCBvbiB0aGlzIGNoaXBzZXQgZG8gbm90IGhhdmUgZmxhc2ggbWVtb3J5CisgICAgICAgIGFuZCBuZWVkIHRoZWlyIGZpcm13YXJlIGxvYWRlZCBhdCBzdGFydC11cC4gSWYgeW91cnMgaXMgCisgICAgICAgIG9uZSBvZiB0aGVzZSwgeW91IHdpbGwgbmVlZCB0byBwcm92aWRlIGEgZmlybXdhcmUgaW1hZ2UKKyAgICAgICAgdG8gYmUgbG9hZGVkIGludG8gdGhlIGNhcmQgYnkgdGhlIGRyaXZlci4gVGhlIEF0bWVsCisgICAgICAgIGZpcm13YXJlIHBhY2thZ2UgY2FuIGJlIGRvd25sb2FkZWQgZnJvbQorICAgICAgICA8aHR0cDovL3d3dy50aGVrZWxsZXlzLm9yZy51ay9hdG1lbD4KKworY29uZmlnIFBDSV9BVE1FTAorICAgICAgdHJpc3RhdGUgIkF0bWVsIGF0NzZjNTA2IFBDSSBjYXJkcyIKKyAgICAgIGRlcGVuZHMgb24gQVRNRUwgJiYgUENJCisgICAgICAgLS0taGVscC0tLQorICAgICAgICBFbmFibGUgc3VwcG9ydCBmb3IgUENJIGFuZCBtaW5pLVBDSSBjYXJkcyBjb250YWluaW5nIHRoZQorICAgICAgICBBdG1lbCBhdDc2YzUwNiBjaGlwLgorCisjIElmIFBjbWNpYSBpcyBjb21waWxlZCBpbiwgb2ZmZXIgUGNtY2lhIGNhcmRzLi4uCitjb21tZW50ICJXaXJlbGVzcyA4MDIuMTFiIFBjbWNpYS9DYXJkYnVzIGNhcmRzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBCisKK2NvbmZpZyBQQ01DSUFfSEVSTUVTCisJdHJpc3RhdGUgIkhlcm1lcyBQQ01DSUEgY2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQSAmJiBIRVJNRVMKKwktLS1oZWxwLS0tCisJICBBIGRyaXZlciBmb3IgIkhlcm1lcyIgY2hpcHNldCBiYXNlZCBQQ01DSUEgd2lyZWxlc3MgYWRhcHRvcnMsIHN1Y2gKKwkgIGFzIHRoZSBMdWNlbnQgV2F2ZWxhbklFRUUvT3Jpbm9jbyBjYXJkcyBhbmQgdGhlaXIgT0VNIChDYWJsZXRyb24vCisJICBFbnRlcmFTeXMgUm9hbUFib3V0IDgwMi4xMSwgRUxTQSBBaXJsYW5jZXIsIE1lbGNvIEJ1ZmZhbG8gYW5kCisJICBvdGhlcnMpLiAgSXQgc2hvdWxkIGFsc28gYmUgdXNhYmxlIG9uIHZhcmlvdXMgUHJpc20gSUkgYmFzZWQgY2FyZHMKKwkgIHN1Y2ggYXMgdGhlIExpbmtzeXMsIEQtTGluayBhbmQgRmFyYWxsb24gU2t5bGluZS4gIEl0IHNob3VsZCBhbHNvCisJICB3b3JrIG9uIFN5bWJvbCBjYXJkcyBzdWNoIGFzIHRoZSAzQ29tIEFpckNvbm5lY3QgYW5kIEVyaWNzc29uIFdMQU4uCisKKwkgIFRvIHVzZSB5b3VyIFBDLWNhcmRzLCB5b3Ugd2lsbCBuZWVkIHN1cHBvcnRpbmcgc29mdHdhcmUgZnJvbSBEYXZpZAorCSAgSGluZHMnIHBjbWNpYS1jcyBwYWNrYWdlIChzZWUgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9DaGFuZ2VzPgorCSAgZm9yIGxvY2F0aW9uKS4gIFlvdSBhbHNvIHdhbnQgdG8gY2hlY2sgb3V0IHRoZSBQQ01DSUEtSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBZb3Ugd2lsbCBhbHNvIHZlcnkgbGlrZWx5IGFsc28gbmVlZCB0aGUgV2lyZWxlc3MgVG9vbHMgaW4gb3JkZXIgdG8KKwkgIGNvbmZpZ3VyZSB5b3VyIGNhcmQgYW5kIHRoYXQgL2V0Yy9wY21jaWEvd2lyZWxlc3Mub3B0cyB3b3JrczoKKwkgIDxodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4L1Rvb2xzLmh0bWw+LgorCitjb25maWcgQUlST19DUworCXRyaXN0YXRlICJDaXNjby9BaXJvbmV0IDM0WC8zNVgvNDUwMC80ODAwIFBDTUNJQSBjYXJkcyIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ01DSUEKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBzdGFuZGFyZCBMaW51eCBkcml2ZXIgdG8gc3VwcG9ydCBDaXNjby9BaXJvbmV0IFBDTUNJQQorCSAgODAyLjExIHdpcmVsZXNzIGNhcmRzLiAgVGhpcyBkcml2ZXIgaXMgdGhlIHNhbWUgYXMgdGhlIEFpcm9uZXQKKwkgIGRyaXZlciBwYXJ0IG9mIHRoZSBMaW51eCBQY21jaWEgcGFja2FnZS4KKwkgIEl0IHN1cHBvcnRzIHRoZSBuZXcgODAyLjExYiBjYXJkcyBmcm9tIENpc2NvIChDaXNjbyAzNFgsIENpc2NvIDM1WAorCSAgLSB3aXRoIG9yIHdpdGhvdXQgZW5jcnlwdGlvbikgYXMgd2VsbCBhcyBjYXJkIGJlZm9yZSB0aGUgQ2lzY28KKwkgIGFxdWlzaXRpb24gKEFpcm9uZXQgNDUwMCwgQWlyb25ldCA0ODAwLCBBaXJvbmV0IDQ4MDBCKS4gSXQgYWxzbworCSAgc3VwcG9ydHMgT0VNIG9mIENpc2NvIHN1Y2ggYXMgdGhlIERFTEwgVHJ1ZU1vYmlsZSA0ODAwIGFuZCBYaXJjb20KKwkgIDgwMi4xMWIgY2FyZHMuCisKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnQgYm90aCB0aGUgc3RhbmRhcmQgTGludXggV2lyZWxlc3MgRXh0ZW5zaW9ucworCSAgYW5kIENpc2NvIHByb3ByaWV0YXJ5IEFQSSwgc28gYm90aCB0aGUgTGludXggV2lyZWxlc3MgVG9vbHMgYW5kIHRoZQorCSAgQ2lzY28gTGludXggdXRpbGl0aWVzIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgY2FyZC4KKworCSAgVG8gdXNlIHlvdXIgUEMtY2FyZHMsIHlvdSB3aWxsIG5lZWQgc3VwcG9ydGluZyBzb2Z0d2FyZSBmcm9tIERhdmlkCisJICBIaW5kcycgcGNtY2lhLWNzIHBhY2thZ2UgKHNlZSB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL0NoYW5nZXM+CisJICBmb3IgbG9jYXRpb24pLiAgWW91IGFsc28gd2FudCB0byBjaGVjayBvdXQgdGhlIFBDTUNJQS1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKK2NvbmZpZyBQQ01DSUFfQVRNRUwKKwl0cmlzdGF0ZSAiQXRtZWwgYXQ3NmM1MDIvYXQ3NmM1MDQgUENNQ0lBIGNhcmRzIgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIEFUTUVMICYmIFBDTUNJQQorCXNlbGVjdCBGV19MT0FERVIKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBFbmFibGUgc3VwcG9ydCBmb3IgUENNQ0lBIGNhcmRzIGNvbnRhaW5pbmcgdGhlCisJICBBdG1lbCBhdDc2YzUwMiBhbmQgYXQ3NmM1MDQgY2hpcHMuCisKK2NvbmZpZyBQQ01DSUFfV0wzNTAxCisgICAgICB0cmlzdGF0ZSAiUGxhbmV0IFdMMzUwMSBQQ01DSUEgY2FyZHMiCisgICAgICBkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBFWFBFUklNRU5UQUwgJiYgUENNQ0lBCisgICAgICAgLS0taGVscC0tLQorICAgICAgICAgQSBkcml2ZXIgZm9yIFdMMzUwMSBQQ01DSUEgODAyLjExIHdpcmVsZXNzIGNhcmRzIG1hZGUgYnkgUGxhbmV0LgorCSBJdCBoYXMgYmFzaWMgc3VwcG9ydCBmb3IgTGludXggd2lyZWxlc3MgZXh0ZW5zaW9ucyBhbmQgaW5pdGlhbAorCSBtaWNybyBzdXBwb3J0IGZvciBldGh0b29sLgorCitjb21tZW50ICJQcmlzbSBHVC9EdWV0dGUgODAyLjExKGEvYi9nKSBQQ0kvQ2FyZGJ1cyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDSQorY29uZmlnIFBSSVNNNTQKKwl0cmlzdGF0ZSAnSW50ZXJzaWwgUHJpc20gR1QvRHVldHRlL0luZGlnbyBQQ0kvQ2FyZGJ1cycgCisJZGVwZW5kcyBvbiBQQ0kgJiYgTkVUX1JBRElPICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBGV19MT0FERVIKKwktLS1oZWxwLS0tCisJICBFbmFibGUgUENJIGFuZCBDYXJkYnVzIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmcgY2hpcHNldCBiYXNlZCBjYXJkczoKKworCSAgSVNMMzg4MCAtIFByaXNtIEdUICAgICAgICAgICAgODAyLjExIGIvZworCSAgSVNMMzg3NyAtIFByaXNtIEluZGlnbyAgICAgICAgODAyLjExIGEKKwkgIElTTDM4OTAgLSBQcmlzbSBEdWV0dGUgICAgICAgIDgwMi4xMSBhL2IvZworCSAgCisJICBGb3IgYSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBjYXJkcyB2aXNpdCA8aHR0cDovL3ByaXNtNTQub3JnPi4KKwkgIEhlcmUgaXMgdGhlIGxhdGVzdCBjb25maXJtZWQgbGlzdCBvZiBzdXBwb3J0ZWQgY2FyZHM6CisKKwkgIDNjb20gT2ZmaWNlQ29ubmVjdCAxMWcgQ2FyZGJ1cyBDYXJkIGFrYSAzQ1JXRTE1NEc3MgorCSAgQWxsbmV0IEFMTDAyNzEgUENJIENhcmQKKwkgIENvbXBleCBXTDU0RyBDYXJkYnVzIENhcmQKKwkgIENvcmVnYSBDRy1XTENCNTRHVCBDYXJkYnVzIENhcmQKKwkgIEQtTGluayBBaXIgUGx1cyBYdHJlbWUgRyBBMSBDYXJkYnVzIENhcmQgYWthIERXTC1nNjUwCisJICBJLU8gRGF0YSBXTi1HNTQvQ0IgQ2FyZGJ1cyBDYXJkCisJICBLb2Jpc2hpIFhHLTMwMCBha2EgWi1Db20gQ2FyZGJ1cyBDYXJkCisJICBOZXRnZWFyIFdHNTExIENhcmRidXMgQ2FyZAorCSAgT3Zpc2xpbmsgV0wtNTQwMFBDSSBQQ0kgQ2FyZAorCSAgUGVhYmlyZCBXTEctUENJIFBDSSBDYXJkCisJICBTaXRlY29tIFdMLTEwMGkgQ2FyZGJ1cyBDYXJkCisJICBTaXRlY29tIFdMLTExMGkgUENJIENhcmQKKwkgIFNNQzI4MDJXIC0gICAgRVogQ29ubmVjdCBnIDIuNEdIeiA1NCBNYnBzIFdpcmVsZXNzIFBDSSBDYXJkCisJICBTTUMyODM1VyAtICAgIEVaIENvbm5lY3QgZyAyLjRHSHogNTQgTWJwcyBXaXJlbGVzcyBDYXJkYnVzIENhcmQKKwkgIFNNQzI4MzVXLVYyIC0gRVogQ29ubmVjdCBnIDIuNEdIeiA1NCBNYnBzIFdpcmVsZXNzIENhcmRidXMgQ2FyZAorCSAgWi1Db20gWEctOTAwIFBDSSBDYXJkCisJICBaeXhlbCBHLTEwMCBDYXJkYnVzIENhcmQKKworCSAgSWYgeW91IGVuYWJsZSB0aGlzIHlvdSB3aWxsIG5lZWQgYSBmaXJtd2FyZSBmaWxlIGFzIHdlbGwuCisJICBZb3Ugd2lsbCBuZWVkIHRvIGNvcHkgdGhpcyB0byAvdXNyL2xpYi9ob3RwbHVnL2Zpcm13YXJlL2lzbDM4OTAuCisJICBZb3UgY2FuIGdldCB0aGlzIG5vbi1HUEwnZCBmaXJtd2FyZSBmaWxlIGZyb20gdGhlIFByaXNtNTQgcHJvamVjdCBwYWdlOgorCSAgPGh0dHA6Ly9wcmlzbTU0Lm9yZz4KKwkgIFlvdSB3aWxsIGFsc28gbmVlZCB0aGUgL2V0Yy9ob3RwbHVnL2Zpcm13YXJlLmFnZW50IHNjcmlwdCBmcm9tCisJICBhIGN1cnJlbnQgaG90cGx1ZyBwYWNrYWdlLgorCisJICBOb3RlOiBZb3UgbmVlZCBhIG1vdGhlcmJvYXJkIHdpdGggRE1BIHN1cHBvcnQgdG8gdXNlIGFueSBvZiB0aGVzZSBjYXJkcyAKKwkgIAorCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSB0aGUgZHJpdmVyIGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLAorCSAgc2F5IE0gaGVyZSBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHByaXNtNTQua28uCisKKyMgeWVzLCB0aGlzIHdvcmtzIGV2ZW4gd2hlbiBubyBkcml2ZXJzIGFyZSBzZWxlY3RlZAorY29uZmlnIE5FVF9XSVJFTEVTUworCWJvb2wKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiAoSVNBIHx8IFBDSSB8fCBQUENfUE1BQyB8fCBQQ01DSUEpCisJZGVmYXVsdCB5CisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjg3ODQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvTWFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IFdpcmVsZXNzIG5ldHdvcmsgZGV2aWNlIGRyaXZlcnMuCisjCisKK29iai0kKENPTkZJR19TVFJJUCkgKz0gc3RyaXAubworb2JqLSQoQ09ORklHX0FSTEFOKSArPSBhcmxhbi5vIAorCithcmxhbi1vYmpzIDo9IGFybGFuLW1haW4ubyBhcmxhbi1wcm9jLm8KKworIyBPYnNvbGV0ZSBjYXJkcworb2JqLSQoQ09ORklHX1dBVkVMQU4pCQkrPSB3YXZlbGFuLm8KK29iai0kKENPTkZJR19QQ01DSUFfTkVUV0FWRSkJKz0gbmV0d2F2ZV9jcy5vCitvYmotJChDT05GSUdfUENNQ0lBX1dBVkVMQU4pCSs9IHdhdmVsYW5fY3MubworCitvYmotJChDT05GSUdfSEVSTUVTKQkJKz0gb3Jpbm9jby5vIGhlcm1lcy5vCitvYmotJChDT05GSUdfUENNQ0lBX0hFUk1FUykJKz0gb3Jpbm9jb19jcy5vCitvYmotJChDT05GSUdfQVBQTEVfQUlSUE9SVCkJKz0gYWlycG9ydC5vCitvYmotJChDT05GSUdfUExYX0hFUk1FUykJKz0gb3Jpbm9jb19wbHgubworb2JqLSQoQ09ORklHX1BDSV9IRVJNRVMpCSs9IG9yaW5vY29fcGNpLm8KK29iai0kKENPTkZJR19UTURfSEVSTUVTKQkrPSBvcmlub2NvX3RtZC5vCisKK29iai0kKENPTkZJR19BSVJPKQkJKz0gYWlyby5vCitvYmotJChDT05GSUdfQUlST19DUykJCSs9IGFpcm9fY3MubyBhaXJvLm8KKworb2JqLSQoQ09ORklHX0FUTUVMKSAgICAgICAgICAgICArPSBhdG1lbC5vCitvYmotJChDT05GSUdfUENJX0FUTUVMKSAgICAgICAgICs9IGF0bWVsX3BjaS5vIAorb2JqLSQoQ09ORklHX1BDTUNJQV9BVE1FTCkgICAgICArPSBhdG1lbF9jcy5vCisKK29iai0kKENPTkZJR19QUklTTTU0KQkJKz0gcHJpc201NC8KKworIyAxNi1iaXQgd2lyZWxlc3MgUENNQ0lBIGNsaWVudCBkcml2ZXJzCitvYmotJChDT05GSUdfUENNQ0lBX1JBWUNTKQkrPSByYXlfY3Mubworb2JqLSQoQ09ORklHX1BDTUNJQV9XTDM1MDEpCSs9IHdsMzUwMV9jcy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9SRUFETUUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyNzRiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL1JFQURNRQpAQCAtMCwwICsxLDI1IEBACisJUkVBRE1FCisJLS0tLS0tCisKKwlUaGlzIGRpcmVjdG9yeSBpcyBtb3N0bHkgZm9yIFdpcmVsZXNzIExBTiBkcml2ZXJzLCBpbiB0aGVpcgordmFyaW91cyBpbmNhcm5hdGlvbnMgKElTQSwgUENJLCBQY21jaWEuLi4pLgorCVRoaXMgc2VwYXJhdGUgZGlyZWN0b3J5IGlzIG5lZWRlZCBiZWNhdXNlIGEgbG90IG9mIGRyaXZlciB3b3JrCitvbiBkaWZmZXJlbnQgYnVzICh0eXBpY2FsbHkgUENJICsgUGNtY2lhKSBhbmQgc2hhcmUgOTUlIG9mIHRoZQorY29kZS4gVGhpcyBhbGxvdyB0aGUgY29kZSBhbmQgdGhlIGNvbmZpZyBvcHRpb25zIHRvIGJlIGluIG9uZSBzaW5nbGUKK3BsYWNlIGluc3RlYWQgb2Ygc2NhdHRlcmVkIGFsbCBvdmVyIHRoZSBkcml2ZXIgdHJlZSwgd2hpY2ggaXMgbmV2ZXIKKzEwMCUgc2F0aXNmYWN0b3J5LgorCisJTm90ZSA6IGlmIHlvdSB3YW50IG1vcmUgaW5mbyBvbiB0aGUgdG9waWMgb2YgV2lyZWxlc3MgTEFOcywKK3lvdSBhcmUga2luZGx5IGludml0ZWQgdG8gaGF2ZSBhIGxvb2sgYXQgdGhlIFdpcmVsZXNzIEhvd3RvIDoKKwkJaHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9MaW51eC8KKwlTb21lIFdpcmVsZXNzIExBTiBkcml2ZXJzLCBsaWtlIG9yaW5vY29fY3MsIHJlcXVpcmUgdGhlIHVzZSBvZgorV2lyZWxlc3MgVG9vbHMgdG8gYmUgY29uZmlndXJlZCA6CisJCWh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvVG9vbHMuaHRtbAorCisJU3BlY2lhbCBub3RlcyBmb3IgZGlzdHJpYnV0aW9uIG1haW50YWluZXJzIDoKKwkxKSB3dmxhbl9jcyB3aWxsIGJlIGRpc2NvbnRpbnVlZCBzb29uIGluIGZhdm9yIG9mIG9yaW5vY29fY3MKKwkyKSBQbGVhc2UgYWRkIFdpcmVsZXNzIFRvb2xzIHN1cHBvcnQgaW4geW91ciBzY3JpcHRzCisKKwlIYXZlIGZ1bi4uLgorCisJSmVhbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OTkxNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKQEAgLTAsMCArMSw3NjY3IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEFpcm9uZXQgZHJpdmVyIGZvciA0NTAwIGFuZCA0ODAwIHNlcmllcyBjYXJkcworCisgICAgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIGJvdGggdGhlIEdQTCB2ZXJzaW9uIDIgYW5kIEJTRCBsaWNlbnNlcy4KKyAgICBFaXRoZXIgbGljZW5zZSBtYXkgYmUgdXNlZC4gIFRoZSByZXNwZWN0aXZlIGxpY2Vuc2VzIGFyZSBmb3VuZCBhdAorICAgIHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorCisgICAgVGhpcyBjb2RlIHdhcyBkZXZlbG9wZWQgYnkgQmVuamFtaW4gUmVlZCA8YnJlZWRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICAgIGluY2x1ZGluZyBwb3J0aW9ucyBvZiB3aGljaCBjb21lIGZyb20gdGhlIEFpcm9uZXQgUEM0NTAwCisgICAgRGV2ZWxvcGVyJ3MgUmVmZXJlbmNlIE1hbnVhbCBhbmQgdXNlZCB3aXRoIHBlcm1pc3Npb24uICBDb3B5cmlnaHQKKyAgICAoQykgMTk5OSBCZW5qYW1pbiBSZWVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gIFBlcm1pc3Npb24gdG8gdXNlCisgICAgY29kZSBpbiB0aGUgRGV2ZWxvcGVyJ3MgbWFudWFsIHdhcyBncmFudGVkIGZvciB0aGlzIGRyaXZlciBieQorICAgIEFpcm9uZXQuICBNYWpvciBjb2RlIGNvbnRyaWJ1dGlvbnMgd2VyZSByZWNlaXZlZCBmcm9tIEphdmllciBBY2hpcmljYQorICAgIDxhY2hpcmljYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+IGFuZCBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+LgorICAgIENvZGUgd2FzIGFsc28gaW50ZWdyYXRlZCBmcm9tIHRoZSBDaXNjbyBBaXJvbmV0IGRyaXZlciBmb3IgTGludXguCisgICAgU3VwcG9ydCBmb3IgTVBJMzUwIGNhcmRzIHdhcyBhZGRlZCBieSBGYWJyaWNlIEJlbGxldAorICAgIDxmYWJyaWNlQGJlbGxldC5pbmZvPi4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2FyZF9pZHNbXSA9IHsKKwl7IDB4MTRiOSwgMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDB4MTRiOSwgMHg0NTAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCisJeyAweDE0YjksIDB4NDgwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDB4MTRiOSwgMHgwMzQwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMHgxNGI5LCAweDAzNTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyAweDE0YjksIDB4NTAwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDB4MTRiOSwgMHhhNTA0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjYXJkX2lkcyk7CisKK3N0YXRpYyBpbnQgYWlyb19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBhaXJvX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKik7CitzdGF0aWMgaW50IGFpcm9fcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSk7CitzdGF0aWMgaW50IGFpcm9fcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhaXJvX2RyaXZlciA9IHsKKwkubmFtZSAgICAgPSAiYWlybyIsCisJLmlkX3RhYmxlID0gY2FyZF9pZHMsCisJLnByb2JlICAgID0gYWlyb19wY2lfcHJvYmUsCisJLnJlbW92ZSAgID0gX19kZXZleGl0X3AoYWlyb19wY2lfcmVtb3ZlKSwKKwkuc3VzcGVuZCAgPSBhaXJvX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUgICA9IGFpcm9fcGNpX3Jlc3VtZSwKK307CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisvKiBJbmNsdWRlIFdpcmVsZXNzIEV4dGVuc2lvbiBkZWZpbml0aW9uIGFuZCBjaGVjayB2ZXJzaW9uIC0gSmVhbiBJSSAqLworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLy8gZW5hYmxlIGl3c3B5IHN1cHBvcnQKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgkvLyBOZXcgZHJpdmVyIEFQSQorCisjZGVmaW5lIENJU0NPX0VYVAkJLy8gZW5hYmxlIENpc2NvIGV4dGVuc2lvbnMKKyNpZmRlZiBDSVNDT19FWFQKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2VuZGlmCisKKy8qIFN1cHBvcnQgQ2lzY28gTUlDIGZlYXR1cmUgKi8KKyNkZWZpbmUgTUlDU1VQUE9SVAorCisjaWYgZGVmaW5lZChNSUNTVVBQT1JUKSAmJiAhZGVmaW5lZChDT05GSUdfQ1JZUFRPKQorI3dhcm5pbmcgTUlDIHN1cHBvcnQgcmVxdWlyZXMgQ3J5cHRvIEFQSQorI3VuZGVmIE1JQ1NVUFBPUlQKKyNlbmRpZgorCisvKiBIYWNrIHRvIGRvIHNvbWUgcG93ZXIgc2F2aW5nICovCisjZGVmaW5lIFBPV0VSX09OX0RPV04KKworLyogQXMgeW91IGNhbiBzZWUgdGhpcyBsaXN0IGlzIEhVR0ghCisgICBJIHJlYWxseSBkb24ndCBrbm93IHdoYXQgYSBsb3Qgb2YgdGhlc2UgY291bnRzIGFyZSBhYm91dCwgYnV0IHRoZXkKKyAgIGFyZSBhbGwgaGVyZSBmb3IgY29tcGxldGVuZXNzLiAgSWYgdGhlIElHTkxBQkVMIG1hY3JvIGlzIHB1dCBpbgorICAgaW5mcm9udCBvZiB0aGUgbGFiZWwsIHRoYXQgc3RhdGlzdGljIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0CisgICBvZiBzdGF0aXN0aWNzIGluIHRoZSAvcHJvYyBmaWxlc3lzdGVtICovCisKKyNkZWZpbmUgSUdOTEFCRUwoY29tbWVudCkgTlVMTAorc3RhdGljIGNoYXIgKnN0YXRzTGFiZWxzW10gPSB7CisJIlJ4T3ZlcnJ1biIsCisJSUdOTEFCRUwoIlJ4UGxjcENyY0VyciIpLAorCUlHTkxBQkVMKCJSeFBsY3BGb3JtYXRFcnIiKSwKKwlJR05MQUJFTCgiUnhQbGNwTGVuZ3RoRXJyIiksCisJIlJ4TWFjQ3JjRXJyIiwKKwkiUnhNYWNDcmNPayIsCisJIlJ4V2VwRXJyIiwKKwkiUnhXZXBPayIsCisJIlJldHJ5TG9uZyIsCisJIlJldHJ5U2hvcnQiLAorCSJNYXhSZXRyaWVzIiwKKwkiTm9BY2siLAorCSJOb0N0cyIsCisJIlJ4QWNrIiwKKwkiUnhDdHMiLAorCSJUeEFjayIsCisJIlR4UnRzIiwKKwkiVHhDdHMiLAorCSJUeE1jIiwKKwkiVHhCYyIsCisJIlR4VWNGcmFncyIsCisJIlR4VWNQYWNrZXRzIiwKKwkiVHhCZWFjb24iLAorCSJSeEJlYWNvbiIsCisJIlR4U2luQ29sbCIsCisJIlR4TXVsQ29sbCIsCisJIkRlZmVyc05vIiwKKwkiRGVmZXJzUHJvdCIsCisJIkRlZmVyc0VuZ3kiLAorCSJEdXBGcmFtIiwKKwkiUnhGcmFnRGlzYyIsCisJIlR4QWdlZCIsCisJIlJ4QWdlZCIsCisJIkxvc3RTeW5jLU1heFJldHJ5IiwKKwkiTG9zdFN5bmMtTWlzc2VkQmVhY29ucyIsCisJIkxvc3RTeW5jLUFybEV4Y2VlZGVkIiwKKwkiTG9zdFN5bmMtRGVhdXRoIiwKKwkiTG9zdFN5bmMtRGlzYXNzb2NlZCIsCisJIkxvc3RTeW5jLVRzZlRpbWluZyIsCisJIkhvc3RUeE1jIiwKKwkiSG9zdFR4QmMiLAorCSJIb3N0VHhVYyIsCisJIkhvc3RUeEZhaWwiLAorCSJIb3N0UnhNYyIsCisJIkhvc3RSeEJjIiwKKwkiSG9zdFJ4VWMiLAorCSJIb3N0UnhEaXNjYXJkIiwKKwlJR05MQUJFTCgiSG1hY1R4TWMiKSwKKwlJR05MQUJFTCgiSG1hY1R4QmMiKSwKKwlJR05MQUJFTCgiSG1hY1R4VWMiKSwKKwlJR05MQUJFTCgiSG1hY1R4RmFpbCIpLAorCUlHTkxBQkVMKCJIbWFjUnhNYyIpLAorCUlHTkxBQkVMKCJIbWFjUnhCYyIpLAorCUlHTkxBQkVMKCJIbWFjUnhVYyIpLAorCUlHTkxBQkVMKCJIbWFjUnhEaXNjYXJkIiksCisJSUdOTEFCRUwoIkhtYWNSeEFjY2VwdGVkIiksCisJIlNzaWRNaXNtYXRjaCIsCisJIkFwTWlzbWF0Y2giLAorCSJSYXRlc01pc21hdGNoIiwKKwkiQXV0aFJlamVjdCIsCisJIkF1dGhUaW1lb3V0IiwKKwkiQXNzb2NSZWplY3QiLAorCSJBc3NvY1RpbWVvdXQiLAorCUlHTkxBQkVMKCJSZWFzb25PdXRzaWRlVGFibGUiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMSIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXMyIiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czMiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzNCIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXM1IiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czYiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzNyIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXM4IiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czkiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTAiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTEiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTIiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTMiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTQiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTUiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTYiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTciKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTgiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTkiKSwKKwkiUnhNYW4iLAorCSJUeE1hbiIsCisJIlJ4UmVmcmVzaCIsCisJIlR4UmVmcmVzaCIsCisJIlJ4UG9sbCIsCisJIlR4UG9sbCIsCisJIkhvc3RSZXRyaWVzIiwKKwkiTG9zdFN5bmMtSG9zdFJlcSIsCisJIkhvc3RUeEJ5dGVzIiwKKwkiSG9zdFJ4Qnl0ZXMiLAorCSJFbGFwc2VkVXNlYyIsCisJIkVsYXBzZWRTZWMiLAorCSJMb3N0U3luY0JldHRlckFQIiwKKwkiUHJpdmFjeU1pc21hdGNoIiwKKwkiSmFtbWVkIiwKKwkiRGlzY1J4Tm90V2VwcGVkIiwKKwkiUGh5RWxlTWlzbWF0Y2giLAorCShjaGFyKiktMSB9OworI2lmbmRlZiBSVU5fQVQKKyNkZWZpbmUgUlVOX0FUKHgpIChqaWZmaWVzKyh4KSkKKyNlbmRpZgorCisKKy8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgZm9yIGluc21vZCwgc2luY2UgaXQgc2VlbXMgdGhhdCB0aGUgcmF0ZXMKKyAgIGNhbiBvbmx5IGJlIHNldCBpbiBzZXR1cF9jYXJkLiAgUmF0ZXMgc2hvdWxkIGJlIGEgY29tbWEgc2VwYXJhdGVkCisgICAobm8gc3BhY2VzKSBsaXN0IG9mIHJhdGVzICh1cCB0byA4KS4gKi8KKworc3RhdGljIGludCByYXRlc1s4XTsKK3N0YXRpYyBpbnQgYmFzaWNfcmF0ZTsKK3N0YXRpYyBjaGFyICpzc2lkc1szXTsKKworc3RhdGljIGludCBpb1s0XTsKK3N0YXRpYyBpbnQgaXJxWzRdOworCitzdGF0aWMKK2ludCBtYXhlbmNyeXB0IC8qID0gMCAqLzsgLyogVGhlIGhpZ2hlc3QgcmF0ZSB0aGF0IHRoZSBjYXJkIGNhbiBlbmNyeXB0IGF0LgorCQkgICAgICAgMCBtZWFucyBubyBsaW1pdC4gIEZvciBvbGQgY2FyZHMgdGhpcyB3YXMgNCAqLworCitzdGF0aWMgaW50IGF1dG9fd2VwIC8qID0gMCAqLzsgLyogSWYgc2V0LCBpdCB0cmllcyB0byBmaWd1cmUgb3V0IHRoZSB3ZXAgbW9kZSAqLworc3RhdGljIGludCBhdXhfYmFwIC8qID0gMCAqLzsgLyogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgYXV4IHBvcnRzIGFyZSBuZWVkZWQgdG8gcmVhZAorCQkgICAgdGhlIGJhcCwgbmVlZGVkIG9uIHNvbWUgb2xkZXIgY2FyZHMgYW5kIGJ1c2VzLiAqLworc3RhdGljIGludCBhZGhvYzsKKworc3RhdGljIGludCBwcm9iZSA9IDE7CisKK3N0YXRpYyBpbnQgcHJvY191aWQgLyogPSAwICovOworCitzdGF0aWMgaW50IHByb2NfZ2lkIC8qID0gMCAqLzsKKworc3RhdGljIGludCBhaXJvX3Blcm0gPSAwNTU1OworCitzdGF0aWMgaW50IHByb2NfcGVybSA9IDA2NDQ7CisKK01PRFVMRV9BVVRIT1IoIkJlbmphbWluIFJlZWQiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgQ2lzY28vQWlyb25ldCA4MDIuMTEgd2lyZWxlc3MgZXRoZXJuZXQgXAorICAgICAgICAgICAgICAgICAgIGNhcmRzLiAgRGlyZWN0IHN1cHBvcnQgZm9yIElTQS9QQ0kvTVBJIGNhcmRzIGFuZCBzdXBwb3J0IFwKKwkJICAgZm9yIFBDTUNJQSB3aGVuIHVzZWQgd2l0aCBhaXJvX2NzLiIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIkFpcm9uZXQgNDUwMCwgNDgwMCBhbmQgQ2lzY28gMzQwLzM1MCIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShiYXNpY19yYXRlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHJhdGVzLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHNzaWRzLCBjaGFycCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0oYXV0b193ZXAsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1dG9fd2VwLCAiSWYgbm9uLXplcm8sIHRoZSBkcml2ZXIgd2lsbCBrZWVwIGxvb3BpbmcgdGhyb3VnaCBcCit0aGUgYXV0aGVudGljYXRpb24gb3B0aW9ucyB1bnRpbCBhbiBhc3NvY2lhdGlvbiBpcyBtYWRlLiAgVGhlIHZhbHVlIG9mIFwKK2F1dG9fd2VwIGlzIG51bWJlciBvZiB0aGUgd2VwIGtleXMgdG8gY2hlY2suICBBIHZhbHVlIG9mIDIgd2lsbCB0cnkgdXNpbmcgXAordGhlIGtleSBhdCBpbmRleCAwIGFuZCBpbmRleCAxLiIpOworbW9kdWxlX3BhcmFtKGF1eF9iYXAsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1eF9iYXAsICJJZiBub24temVybywgdGhlIGRyaXZlciB3aWxsIHN3aXRjaCBpbnRvIGEgbW9kZSBcCit0aGFuIHNlZW1zIHRvIHdvcmsgYmV0dGVyIGZvciBvbGRlciBjYXJkcyB3aXRoIHNvbWUgb2xkZXIgYnVzZXMuICBCZWZvcmUgXAorc3dpdGNoaW5nIGl0IGNoZWNrcyB0aGF0IHRoZSBzd2l0Y2ggaXMgbmVlZGVkLiIpOworbW9kdWxlX3BhcmFtKG1heGVuY3J5cHQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heGVuY3J5cHQsICJUaGUgbWF4aW11bSBzcGVlZCB0aGF0IHRoZSBjYXJkIGNhbiBkbyBcCitlbmNyeXB0aW9uLiAgVW5pdHMgYXJlIGluIDUxMmticy4gIFplcm8gKGRlZmF1bHQpIG1lYW5zIHRoZXJlIGlzIG5vIGxpbWl0LiBcCitPbGRlciBjYXJkcyB1c2VkIHRvIGJlIGxpbWl0ZWQgdG8gMm1icyAoNCkuIik7Cittb2R1bGVfcGFyYW0oYWRob2MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFkaG9jLCAiSWYgbm9uLXplcm8sIHRoZSBjYXJkIHdpbGwgc3RhcnQgaW4gYWRob2MgbW9kZS4iKTsKK21vZHVsZV9wYXJhbShwcm9iZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJvYmUsICJJZiB6ZXJvLCB0aGUgZHJpdmVyIHdvbid0IHN0YXJ0IHRoZSBjYXJkLiIpOworCittb2R1bGVfcGFyYW0ocHJvY191aWQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHByb2NfdWlkLCAiVGhlIHVpZCB0aGF0IHRoZSAvcHJvYyBmaWxlcyB3aWxsIGJlbG9uZyB0by4iKTsKK21vZHVsZV9wYXJhbShwcm9jX2dpZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJvY19naWQsICJUaGUgZ2lkIHRoYXQgdGhlIC9wcm9jIGZpbGVzIHdpbGwgYmVsb25nIHRvLiIpOworbW9kdWxlX3BhcmFtKGFpcm9fcGVybSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWlyb19wZXJtLCAiVGhlIHBlcm1pc3Npb24gYml0cyBvZiAvcHJvYy9bZHJpdmVyL11haXJvbmV0LiIpOworbW9kdWxlX3BhcmFtKHByb2NfcGVybSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJvY19wZXJtLCAiVGhlIHBlcm1pc3Npb24gYml0cyBvZiB0aGUgZmlsZXMgaW4gL3Byb2MiKTsKKworLyogVGhpcyBpcyBhIGtpbmQgb2Ygc2xvcHB5IGhhY2sgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24gdG8gT1VUNDUwMCBhbmQKKyAgIElONDUwMC4gIEkgd291bGQgYmUgZXh0cmVtZWx5IGludGVyZXN0ZWQgaW4gdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGlzCisgICBkb2Vzbid0IHdvcmsgdGhvdWdoISEhICovCitzdGF0aWMgaW50IGRvOGJpdElPID0gMDsKKworLyogUmV0dXJuIGNvZGVzICovCisjZGVmaW5lIFNVQ0NFU1MgMAorI2RlZmluZSBFUlJPUiAtMQorI2RlZmluZSBOT19QQUNLRVQgLTIKKworLyogQ29tbWFuZHMgKi8KKyNkZWZpbmUgTk9QMgkJMHgwMDAwCisjZGVmaW5lIE1BQ19FTkFCTEUJMHgwMDAxCisjZGVmaW5lIE1BQ19ESVNBQkxFCTB4MDAwMgorI2RlZmluZSBDTURfTE9TRV9TWU5DCTB4MDAwMyAvKiBOb3Qgc3VyZSB3aGF0IHRoaXMgZG9lcy4uLiAqLworI2RlZmluZSBDTURfU09GVFJFU0VUCTB4MDAwNAorI2RlZmluZSBIT1NUU0xFRVAJMHgwMDA1CisjZGVmaW5lIENNRF9NQUdJQ19QS1QJMHgwMDA2CisjZGVmaW5lIENNRF9TRVRXQUtFTUFTSwkweDAwMDcKKyNkZWZpbmUgQ01EX1JFQURDRkcJMHgwMDA4CisjZGVmaW5lIENNRF9TRVRNT0RFCTB4MDAwOQorI2RlZmluZSBDTURfQUxMT0NBVEVUWAkweDAwMGEKKyNkZWZpbmUgQ01EX1RSQU5TTUlUCTB4MDAwYgorI2RlZmluZSBDTURfREVBTExPQ0FURVRYIDB4MDAwYworI2RlZmluZSBOT1AJCTB4MDAxMAorI2RlZmluZSBDTURfV09SS0FST1VORAkweDAwMTEKKyNkZWZpbmUgQ01EX0FMTE9DQVRFQVVYIDB4MDAyMAorI2RlZmluZSBDTURfQUNDRVNTCTB4MDAyMQorI2RlZmluZSBDTURfUENJQkFQCTB4MDAyMgorI2RlZmluZSBDTURfUENJQVVYCTB4MDAyMworI2RlZmluZSBDTURfQUxMT0NCVUYJMHgwMDI4CisjZGVmaW5lIENNRF9HRVRUTFYJMHgwMDI5CisjZGVmaW5lIENNRF9QVVRUTFYJMHgwMDJhCisjZGVmaW5lIENNRF9ERUxUTFYJMHgwMDJiCisjZGVmaW5lIENNRF9GSU5ETkVYVFRMVgkweDAwMmMKKyNkZWZpbmUgQ01EX1BTUE5PREVTCTB4MDAzMAorI2RlZmluZSBDTURfU0VUQ1cJMHgwMDMxICAgIAorI2RlZmluZSBDTURfU0VUUENGCTB4MDAzMiAgICAKKyNkZWZpbmUgQ01EX1NFVFBIWVJFRwkweDAwM2UKKyNkZWZpbmUgQ01EX1RYVEVTVAkweDAwM2YKKyNkZWZpbmUgTUFDX0VOQUJMRVRYCTB4MDEwMQorI2RlZmluZSBDTURfTElTVEJTUwkweDAxMDMKKyNkZWZpbmUgQ01EX1NBVkVDRkcJMHgwMTA4CisjZGVmaW5lIENNRF9FTkFCTEVBVVgJMHgwMTExCisjZGVmaW5lIENNRF9XUklURVJJRAkweDAxMjEKKyNkZWZpbmUgQ01EX1VTRVBTUE5PREVTCTB4MDEzMAorI2RlZmluZSBNQUNfRU5BQkxFUlgJMHgwMjAxCisKKy8qIENvbW1hbmQgZXJyb3JzICovCisjZGVmaW5lIEVSUk9SX1FVQUxJRiAweDAwCisjZGVmaW5lIEVSUk9SX0lMTENNRCAweDAxCisjZGVmaW5lIEVSUk9SX0lMTEZNVCAweDAyCisjZGVmaW5lIEVSUk9SX0lOVkZJRCAweDAzCisjZGVmaW5lIEVSUk9SX0lOVlJJRCAweDA0CisjZGVmaW5lIEVSUk9SX0xBUkdFIDB4MDUKKyNkZWZpbmUgRVJST1JfTkRJU0FCTCAweDA2CisjZGVmaW5lIEVSUk9SX0FMTE9DQlNZIDB4MDcKKyNkZWZpbmUgRVJST1JfTk9SRCAweDBCCisjZGVmaW5lIEVSUk9SX05PV1IgMHgwQworI2RlZmluZSBFUlJPUl9JTlZGSURUWCAweDBECisjZGVmaW5lIEVSUk9SX1RFU1RBQ1QgMHgwRQorI2RlZmluZSBFUlJPUl9UQUdORk5EIDB4MTIKKyNkZWZpbmUgRVJST1JfREVDT0RFIDB4MjAKKyNkZWZpbmUgRVJST1JfREVTQ1VOQVYgMHgyMQorI2RlZmluZSBFUlJPUl9CQURMRU4gMHgyMgorI2RlZmluZSBFUlJPUl9NT0RFIDB4ODAKKyNkZWZpbmUgRVJST1JfSE9QIDB4ODEKKyNkZWZpbmUgRVJST1JfQklOVEVSIDB4ODIKKyNkZWZpbmUgRVJST1JfUlhNT0RFIDB4ODMKKyNkZWZpbmUgRVJST1JfTUFDQUREUiAweDg0CisjZGVmaW5lIEVSUk9SX1JBVEVTIDB4ODUKKyNkZWZpbmUgRVJST1JfT1JERVIgMHg4NgorI2RlZmluZSBFUlJPUl9TQ0FOIDB4ODcKKyNkZWZpbmUgRVJST1JfQVVUSCAweDg4CisjZGVmaW5lIEVSUk9SX1BTTU9ERSAweDg5CisjZGVmaW5lIEVSUk9SX1JUWVBFIDB4OEEKKyNkZWZpbmUgRVJST1JfRElWRVIgMHg4QgorI2RlZmluZSBFUlJPUl9TU0lEIDB4OEMKKyNkZWZpbmUgRVJST1JfQVBMSVNUIDB4OEQKKyNkZWZpbmUgRVJST1JfQVVUT1dBS0UgMHg4RQorI2RlZmluZSBFUlJPUl9MRUFQIDB4OEYKKworLyogUmVnaXN0ZXJzICovCisjZGVmaW5lIENPTU1BTkQgMHgwMAorI2RlZmluZSBQQVJBTTAgMHgwMgorI2RlZmluZSBQQVJBTTEgMHgwNAorI2RlZmluZSBQQVJBTTIgMHgwNgorI2RlZmluZSBTVEFUVVMgMHgwOAorI2RlZmluZSBSRVNQMCAweDBhCisjZGVmaW5lIFJFU1AxIDB4MGMKKyNkZWZpbmUgUkVTUDIgMHgwZQorI2RlZmluZSBMSU5LU1RBVCAweDEwCisjZGVmaW5lIFNFTEVDVDAgMHgxOAorI2RlZmluZSBPRkZTRVQwIDB4MWMKKyNkZWZpbmUgUlhGSUQgMHgyMAorI2RlZmluZSBUWEFMTE9DRklEIDB4MjIKKyNkZWZpbmUgVFhDT01QTEZJRCAweDI0CisjZGVmaW5lIERBVEEwIDB4MzYKKyNkZWZpbmUgRVZTVEFUIDB4MzAKKyNkZWZpbmUgRVZJTlRFTiAweDMyCisjZGVmaW5lIEVWQUNLIDB4MzQKKyNkZWZpbmUgU1dTMCAweDI4CisjZGVmaW5lIFNXUzEgMHgyYQorI2RlZmluZSBTV1MyIDB4MmMKKyNkZWZpbmUgU1dTMyAweDJlCisjZGVmaW5lIEFVWFBBR0UgMHgzQQorI2RlZmluZSBBVVhPRkYgMHgzQworI2RlZmluZSBBVVhEQVRBIDB4M0UKKworI2RlZmluZSBGSURfVFggMQorI2RlZmluZSBGSURfUlggMgorLyogT2Zmc2V0IGludG8gYXV4IG1lbW9yeSBmb3IgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgQVVYX09GRlNFVCAweDgwMAorLyogU2l6ZSBvZiBhbGxvY2F0ZWQgcGFja2V0cyAqLworI2RlZmluZSBQS1RTSVpFIDE4NDAKKyNkZWZpbmUgUklEU0laRSAyMDQ4CisvKiBTaXplIG9mIHRoZSB0cmFuc21pdCBxdWV1ZSAqLworI2RlZmluZSBNQVhUWFEgNjQKKworLyogQkFQIHNlbGVjdG9ycyAqLworI2RlZmluZSBCQVAwIDAgLy8gVXNlZCBmb3IgcmVjZWl2aW5nIHBhY2tldHMKKyNkZWZpbmUgQkFQMSAyIC8vIFVzZWQgZm9yIHhtaXRpbmcgcGFja2V0cyBhbmQgd29ya2luZyB3aXRoIFJJRFMKKworLyogRmxhZ3MgKi8KKyNkZWZpbmUgQ09NTUFORF9CVVNZIDB4ODAwMAorCisjZGVmaW5lIEJBUF9CVVNZIDB4ODAwMAorI2RlZmluZSBCQVBfRVJSIDB4NDAwMAorI2RlZmluZSBCQVBfRE9ORSAweDIwMDAKKworI2RlZmluZSBQUk9NSVNDIDB4ZmZmZgorI2RlZmluZSBOT1BST01JU0MgMHgwMDAwCisKKyNkZWZpbmUgRVZfQ01EIDB4MTAKKyNkZWZpbmUgRVZfQ0xFQVJDT01NQU5EQlVTWSAweDQwMDAKKyNkZWZpbmUgRVZfUlggMHgwMQorI2RlZmluZSBFVl9UWCAweDAyCisjZGVmaW5lIEVWX1RYRVhDIDB4MDQKKyNkZWZpbmUgRVZfQUxMT0MgMHgwOAorI2RlZmluZSBFVl9MSU5LIDB4ODAKKyNkZWZpbmUgRVZfQVdBS0UgMHgxMDAKKyNkZWZpbmUgRVZfVFhDUFkgMHg0MDAKKyNkZWZpbmUgRVZfVU5LTk9XTiAweDgwMAorI2RlZmluZSBFVl9NSUMgMHgxMDAwIC8qIE1lc3NhZ2UgSW50ZWdyaXR5IENoZWNrIEludGVycnVwdCAqLworI2RlZmluZSBFVl9BV0FLRU4gMHgyMDAwCisjZGVmaW5lIFNUQVRVU19JTlRTIChFVl9BV0FLRXxFVl9MSU5LfEVWX1RYRVhDfEVWX1RYfEVWX1RYQ1BZfEVWX1JYfEVWX01JQykKKworI2lmZGVmIENIRUNLX1VOS05PV05fSU5UUworI2RlZmluZSBJR05PUkVfSU5UUyAoIEVWX0NNRCB8IEVWX1VOS05PV04pCisjZWxzZQorI2RlZmluZSBJR05PUkVfSU5UUyAoflNUQVRVU19JTlRTKQorI2VuZGlmCisKKy8qIFJJRCBUWVBFUyAqLworI2RlZmluZSBSSURfUlcgMHgyMAorCisvKiBUaGUgUklEcyAqLworI2RlZmluZSBSSURfQ0FQQUJJTElUSUVTIDB4RkYwMAorI2RlZmluZSBSSURfQVBJTkZPICAgICAweEZGMDEKKyNkZWZpbmUgUklEX1JBRElPSU5GTyAgMHhGRjAyCisjZGVmaW5lIFJJRF9VTktOT1dOMyAgIDB4RkYwMworI2RlZmluZSBSSURfUlNTSSAgICAgICAweEZGMDQKKyNkZWZpbmUgUklEX0NPTkZJRyAgICAgMHhGRjEwCisjZGVmaW5lIFJJRF9TU0lEICAgICAgIDB4RkYxMQorI2RlZmluZSBSSURfQVBMSVNUICAgICAweEZGMTIKKyNkZWZpbmUgUklEX0RSVk5BTUUgICAgMHhGRjEzCisjZGVmaW5lIFJJRF9FVEhFUkVOQ0FQIDB4RkYxNAorI2RlZmluZSBSSURfV0VQX1RFTVAgICAweEZGMTUKKyNkZWZpbmUgUklEX1dFUF9QRVJNICAgMHhGRjE2CisjZGVmaW5lIFJJRF9NT0RVTEFUSU9OIDB4RkYxNworI2RlZmluZSBSSURfT1BUSU9OUyAgICAweEZGMTgKKyNkZWZpbmUgUklEX0FDVFVBTENPTkZJRyAweEZGMjAgLypyZWFkb25seSovCisjZGVmaW5lIFJJRF9GQUNUT1JZQ09ORklHIDB4RkYyMQorI2RlZmluZSBSSURfVU5LTk9XTjIyICAweEZGMjIKKyNkZWZpbmUgUklEX0xFQVBVU0VSTkFNRSAweEZGMjMKKyNkZWZpbmUgUklEX0xFQVBQQVNTV09SRCAweEZGMjQKKyNkZWZpbmUgUklEX1NUQVRVUyAgICAgMHhGRjUwCisjZGVmaW5lIFJJRF9CRUFDT05fSFNUIDB4RkY1MQorI2RlZmluZSBSSURfQlVTWV9IU1QgICAweEZGNTIKKyNkZWZpbmUgUklEX1JFVFJJRVNfSFNUIDB4RkY1MworI2RlZmluZSBSSURfVU5LTk9XTjU0ICAweEZGNTQKKyNkZWZpbmUgUklEX1VOS05PV041NSAgMHhGRjU1CisjZGVmaW5lIFJJRF9VTktOT1dONTYgIDB4RkY1NgorI2RlZmluZSBSSURfTUlDICAgICAgICAweEZGNTcKKyNkZWZpbmUgUklEX1NUQVRTMTYgICAgMHhGRjYwCisjZGVmaW5lIFJJRF9TVEFUUzE2REVMVEEgMHhGRjYxCisjZGVmaW5lIFJJRF9TVEFUUzE2REVMVEFDTEVBUiAweEZGNjIKKyNkZWZpbmUgUklEX1NUQVRTICAgICAgMHhGRjY4CisjZGVmaW5lIFJJRF9TVEFUU0RFTFRBIDB4RkY2OQorI2RlZmluZSBSSURfU1RBVFNERUxUQUNMRUFSIDB4RkY2QQorI2RlZmluZSBSSURfRUNIT1RFU1RfUklEIDB4RkY3MAorI2RlZmluZSBSSURfRUNIT1RFU1RfUkVTVUxUUyAweEZGNzEKKyNkZWZpbmUgUklEX0JTU0xJU1RGSVJTVCAweEZGNzIKKyNkZWZpbmUgUklEX0JTU0xJU1RORVhUICAweEZGNzMKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBjbWQ7CisJdTE2IHBhcm0wOworCXUxNiBwYXJtMTsKKwl1MTYgcGFybTI7Cit9IENtZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBzdGF0dXM7CisJdTE2IHJzcDA7CisJdTE2IHJzcDE7CisJdTE2IHJzcDI7Cit9IFJlc3A7CisKKy8qCisgKiBSaWRzIGFuZCBlbmRpYW4tbmVzczogIFRoZSBSaWRzIHdpbGwgYWx3YXlzIGJlIGluIGNwdSBlbmRpYW4sIHNpbmNlCisgKiB0aGlzIGFsbCB0aGUgcGF0Y2hlcyBmcm9tIHRoZSBiaWctZW5kaWFuIGd1eXMgZW5kIHVwIGRvaW5nIHRoYXQuCisgKiBzbyBhbGwgcmlkIGFjY2VzcyBzaG91bGQgdXNlIHRoZSByZWFkL3dyaXRlWFhYUmlkIHJvdXRpbmVzLgorICovCisKKy8qIFRoaXMgaXMgcmVkdW5kYW50IGZvciB4ODYgYXJjaHMsIGJ1dCBpdCBzZWVtcyBuZWNlc3NhcnkgZm9yIEFSTSAqLworI3ByYWdtYSBwYWNrKDEpCisKKy8qIFRoaXMgc3RydWN0dXJlIGNhbWUgZnJvbSBhbiBlbWFpbCBzZW50IHRvIG1lIGZyb20gYW4gZW5naW5lZXIgYXQKKyAgIGFpcm9uZXQgZm9yIGluY2x1c2lvbiBpbnRvIHRoaXMgZHJpdmVyICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGxlbjsKKwl1MTYga2luZGV4OworCXU4IG1hY1tFVEhfQUxFTl07CisJdTE2IGtsZW47CisJdTgga2V5WzE2XTsKK30gV2VwS2V5UmlkOworCisvKiBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSBmcm9tIHRoZSBBaXJvbmV0J3MgUEM0NTAwIERldmVsb3BlcnMgTWFudWFsICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGxlbjsKKwl1OCBzc2lkWzMyXTsKK30gU3NpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBsZW47CisJU3NpZCBzc2lkc1szXTsKK30gU3NpZFJpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICB1MTYgbGVuOworICAgICAgICB1MTYgbW9kdWxhdGlvbjsKKyNkZWZpbmUgTU9EX0RFRkFVTFQgMAorI2RlZmluZSBNT0RfQ0NLIDEKKyNkZWZpbmUgTU9EX01PSyAyCit9IE1vZHVsYXRpb25SaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgbGVuOyAvKiBzaXplb2YoQ29uZmlnUmlkKSAqLworCXUxNiBvcG1vZGU7IC8qIG9wZXJhdGluZyBtb2RlICovCisjZGVmaW5lIE1PREVfU1RBX0lCU1MgMAorI2RlZmluZSBNT0RFX1NUQV9FU1MgMQorI2RlZmluZSBNT0RFX0FQIDIKKyNkZWZpbmUgTU9ERV9BUF9SUFRSIDMKKyNkZWZpbmUgTU9ERV9FVEhFUk5FVF9IT1NUICgwPDw4KSAvKiByeCBwYXlsb2FkcyBjb252ZXJ0ZWQgKi8KKyNkZWZpbmUgTU9ERV9MTENfSE9TVCAoMTw8OCkgLyogcnggcGF5bG9hZHMgbGVmdCBhcyBpcyAqLworI2RlZmluZSBNT0RFX0FJUk9ORVRfRVhURU5EICgxPDw5KSAvKiBlbmFibGUgQWlyb25ldCBleHRlbnN0aW9ucyAqLworI2RlZmluZSBNT0RFX0FQX0lOVEVSRkFDRSAoMTw8MTApIC8qIGVuYWJsZSBhcCBpbnRlcmZhY2UgZXh0ZW5zaW9ucyAqLworI2RlZmluZSBNT0RFX0FOVEVOTkFfQUxJR04gKDE8PDExKSAvKiBlbmFibGUgYW50ZW5uYSBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgTU9ERV9FVEhFUl9MTEMgKDE8PDEyKSAvKiBlbmFibGUgZXRoZXJuZXQgTExDICovCisjZGVmaW5lIE1PREVfTEVBRl9OT0RFICgxPDwxMykgLyogZW5hYmxlIGxlYWYgbm9kZSBicmlkZ2UgKi8KKyNkZWZpbmUgTU9ERV9DRl9QT0xMQUJMRSAoMTw8MTQpIC8qIGVuYWJsZSBDRiBwb2xsYWJsZSAqLworI2RlZmluZSBNT0RFX01JQyAoMTw8MTUpIC8qIGVuYWJsZSBNSUMgKi8KKwl1MTYgcm1vZGU7IC8qIHJlY2VpdmUgbW9kZSAqLworI2RlZmluZSBSWE1PREVfQkNfTUNfQUREUiAwCisjZGVmaW5lIFJYTU9ERV9CQ19BRERSIDEgLyogaWdub3JlIG11bHRpY2FzdHMgKi8KKyNkZWZpbmUgUlhNT0RFX0FERFIgMiAvKiBpZ25vcmUgbXVsdGljYXN0IGFuZCBicm9hZGNhc3QgKi8KKyNkZWZpbmUgUlhNT0RFX1JGTU9OIDMgLyogd2lyZWxlc3MgbW9uaXRvciBtb2RlICovCisjZGVmaW5lIFJYTU9ERV9SRk1PTl9BTllCU1MgNAorI2RlZmluZSBSWE1PREVfTEFOTU9OIDUgLyogbGFuIHN0eWxlIG1vbml0b3IgLS0gZGF0YSBwYWNrZXRzIG9ubHkgKi8KKyNkZWZpbmUgUlhNT0RFX0RJU0FCTEVfODAyXzNfSEVBREVSICgxPDw4KSAvKiBkaXNhYmxlcyA4MDIuMyBoZWFkZXIgb24gcnggKi8KKyNkZWZpbmUgUlhNT0RFX05PUk1BTElaRURfUlNTSSAoMTw8OSkgLyogcmV0dXJuIG5vcm1hbGl6ZWQgUlNTSSAqLworCXUxNiBmcmFnVGhyZXNoOworCXUxNiBydHNUaHJlczsKKwl1OCBtYWNBZGRyW0VUSF9BTEVOXTsKKwl1OCByYXRlc1s4XTsKKwl1MTYgc2hvcnRSZXRyeUxpbWl0OworCXUxNiBsb25nUmV0cnlMaW1pdDsKKwl1MTYgdHhMaWZldGltZTsgLyogaW4ga3VzZWMgKi8KKwl1MTYgcnhMaWZldGltZTsgLyogaW4ga3VzZWMgKi8KKwl1MTYgc3RhdGlvbmFyeTsKKwl1MTYgb3JkZXJpbmc7CisJdTE2IHUxNmRldmljZVR5cGU7IC8qIGZvciBvdmVycmlkaW5nIGRldmljZSB0eXBlICovCisJdTE2IGNmcFJhdGU7CisJdTE2IGNmcER1cmF0aW9uOworCXUxNiBfcmVzZXJ2ZWQxWzNdOworCS8qLS0tLS0tLS0tLSBTY2FubmluZy9Bc3NvY2lhdGluZyAtLS0tLS0tLS0tKi8KKwl1MTYgc2Nhbk1vZGU7CisjZGVmaW5lIFNDQU5NT0RFX0FDVElWRSAwCisjZGVmaW5lIFNDQU5NT0RFX1BBU1NJVkUgMQorI2RlZmluZSBTQ0FOTU9ERV9BSVJPU0NBTiAyCisJdTE2IHByb2JlRGVsYXk7IC8qIGluIGt1c2VjICovCisJdTE2IHByb2JlRW5lcmd5VGltZW91dDsgLyogaW4ga3VzZWMgKi8KKyAgICAgICAgdTE2IHByb2JlUmVzcG9uc2VUaW1lb3V0OworCXUxNiBiZWFjb25MaXN0ZW5UaW1lb3V0OworCXUxNiBqb2luTmV0VGltZW91dDsKKwl1MTYgYXV0aFRpbWVvdXQ7CisJdTE2IGF1dGhUeXBlOworI2RlZmluZSBBVVRIX09QRU4gMHgxCisjZGVmaW5lIEFVVEhfRU5DUllQVCAweDEwMQorI2RlZmluZSBBVVRIX1NIQVJFREtFWSAweDEwMgorI2RlZmluZSBBVVRIX0FMTE9XX1VORU5DUllQVEVEIDB4MjAwCisJdTE2IGFzc29jaWF0aW9uVGltZW91dDsKKwl1MTYgc3BlY2lmaWVkQXBUaW1lb3V0OworCXUxNiBvZmZsaW5lU2NhbkludGVydmFsOworCXUxNiBvZmZsaW5lU2NhbkR1cmF0aW9uOworCXUxNiBsaW5rTG9zc0RlbGF5OworCXUxNiBtYXhCZWFjb25Mb3N0VGltZTsKKwl1MTYgcmVmcmVzaEludGVydmFsOworI2RlZmluZSBESVNBQkxFX1JFRlJFU0ggMHhGRkZGCisJdTE2IF9yZXNlcnZlZDFhWzFdOworCS8qLS0tLS0tLS0tLSBQb3dlciBzYXZlIG9wZXJhdGlvbiAtLS0tLS0tLS0tKi8KKwl1MTYgcG93ZXJTYXZlTW9kZTsKKyNkZWZpbmUgUE9XRVJTQVZFX0NBTSAwCisjZGVmaW5lIFBPV0VSU0FWRV9QU1AgMQorI2RlZmluZSBQT1dFUlNBVkVfUFNQQ0FNIDIKKwl1MTYgc2xlZXBGb3JEdGltczsKKwl1MTYgbGlzdGVuSW50ZXJ2YWw7CisJdTE2IGZhc3RMaXN0ZW5JbnRlcnZhbDsKKwl1MTYgbGlzdGVuRGVjYXk7CisJdTE2IGZhc3RMaXN0ZW5EZWxheTsKKwl1MTYgX3Jlc2VydmVkMlsyXTsKKwkvKi0tLS0tLS0tLS0gQXAvSWJzcyBjb25maWcgaXRlbXMgLS0tLS0tLS0tLSovCisJdTE2IGJlYWNvblBlcmlvZDsKKwl1MTYgYXRpbUR1cmF0aW9uOworCXUxNiBob3BQZXJpb2Q7CisJdTE2IGNoYW5uZWxTZXQ7CisJdTE2IGNoYW5uZWw7CisJdTE2IGR0aW1QZXJpb2Q7CisJdTE2IGJyaWRnZURpc3RhbmNlOworCXUxNiByYWRpb0lEOworCS8qLS0tLS0tLS0tLSBSYWRpbyBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0qLworCXUxNiByYWRpb1R5cGU7CisjZGVmaW5lIFJBRElPVFlQRV9ERUZBVUxUIDAKKyNkZWZpbmUgUkFESU9UWVBFXzgwMl8xMSAxCisjZGVmaW5lIFJBRElPVFlQRV9MRUdBQ1kgMgorCXU4IHJ4RGl2ZXJzaXR5OworCXU4IHR4RGl2ZXJzaXR5OworCXUxNiB0eFBvd2VyOworI2RlZmluZSBUWFBPV0VSX0RFRkFVTFQgMAorCXUxNiByc3NpVGhyZXNob2xkOworI2RlZmluZSBSU1NJX0RFRkFVTFQgMAorICAgICAgICB1MTYgbW9kdWxhdGlvbjsKKyNkZWZpbmUgUFJFQU1CTEVfQVVUTyAwCisjZGVmaW5lIFBSRUFNQkxFX0xPTkcgMQorI2RlZmluZSBQUkVBTUJMRV9TSE9SVCAyCisJdTE2IHByZWFtYmxlOworCXUxNiBob21lUHJvZHVjdDsKKwl1MTYgcmFkaW9TcGVjaWZpYzsKKwkvKi0tLS0tLS0tLS0gQWlyb25ldCBFeHRlbnNpb25zIC0tLS0tLS0tLS0qLworCXU4IG5vZGVOYW1lWzE2XTsKKwl1MTYgYXJsVGhyZXNob2xkOworCXUxNiBhcmxEZWNheTsKKwl1MTYgYXJsRGVsYXk7CisJdTE2IF9yZXNlcnZlZDRbMV07CisJLyotLS0tLS0tLS0tIEFpcm9uZXQgRXh0ZW5zaW9ucyAtLS0tLS0tLS0tKi8KKwl1OCBtYWdpY0FjdGlvbjsKKyNkZWZpbmUgTUFHSUNfQUNUSU9OX1NUU0NIRyAxCisjZGVmaW5lIE1BR0lDX0FDVElPTl9SRVNVTUUgMgorI2RlZmluZSBNQUdJQ19JR05PUkVfTUNBU1QgKDE8PDgpCisjZGVmaW5lIE1BR0lDX0lHTk9SRV9CQ0FTVCAoMTw8OSkKKyNkZWZpbmUgTUFHSUNfU1dJVENIX1RPX1BTUCAoMDw8MTApCisjZGVmaW5lIE1BR0lDX1NUQVlfSU5fQ0FNICgxPDwxMCkKKwl1OCBtYWdpY0NvbnRyb2w7CisJdTE2IGF1dG9XYWtlOworfSBDb25maWdSaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgbGVuOworCXU4IG1hY1tFVEhfQUxFTl07CisJdTE2IG1vZGU7CisJdTE2IGVycm9yQ29kZTsKKwl1MTYgc2lnUXVhbGl0eTsKKwl1MTYgU1NJRGxlbjsKKwljaGFyIFNTSURbMzJdOworCWNoYXIgYXBOYW1lWzE2XTsKKwl1OCBic3NpZFs0XVtFVEhfQUxFTl07CisJdTE2IGJlYWNvblBlcmlvZDsKKwl1MTYgZGltUGVyaW9kOworCXUxNiBhdGltRHVyYXRpb247CisJdTE2IGhvcFBlcmlvZDsKKwl1MTYgY2hhbm5lbFNldDsKKwl1MTYgY2hhbm5lbDsKKwl1MTYgaG9wc1RvQmFja2JvbmU7CisJdTE2IGFwVG90YWxMb2FkOworCXUxNiBnZW5lcmF0ZWRMb2FkOworCXUxNiBhY2N1bXVsYXRlZEFybDsKKwl1MTYgc2lnbmFsUXVhbGl0eTsKKwl1MTYgY3VycmVudFhtaXRSYXRlOworCXUxNiBhcERldkV4dGVuc2lvbnM7CisJdTE2IG5vcm1hbGl6ZWRTaWduYWxTdHJlbmd0aDsKKwl1MTYgc2hvcnRQcmVhbWJsZTsKKwl1OCBhcElQWzRdOworCXU4IG5vaXNlUGVyY2VudDsgLyogTm9pc2UgcGVyY2VudCBpbiBsYXN0IHNlY29uZCAqLworCXU4IG5vaXNlZEJtOyAvKiBOb2lzZSBkQm0gaW4gbGFzdCBzZWNvbmQgKi8KKwl1OCBub2lzZUF2ZVBlcmNlbnQ7IC8qIE5vaXNlIHBlcmNlbnQgaW4gbGFzdCBtaW51dGUgKi8KKwl1OCBub2lzZUF2ZWRCbTsgLyogTm9pc2UgZEJtIGluIGxhc3QgbWludXRlICovCisJdTggbm9pc2VNYXhQZXJjZW50OyAvKiBIaWdoZXN0IG5vaXNlIHBlcmNlbnQgaW4gbGFzdCBtaW51dGUgKi8KKwl1OCBub2lzZU1heGRCbTsgLyogSGlnaGVzdCBub2lzZSBkYm0gaW4gbGFzdCBtaW51dGUgKi8KKwl1MTYgbG9hZDsKKwl1OCBjYXJyaWVyWzRdOworCXUxNiBhc3NvY1N0YXR1czsKKyNkZWZpbmUgU1RBVF9OT1BBQ0tFVFMgMAorI2RlZmluZSBTVEFUX05PQ0FSUklFUlNFVCAxMAorI2RlZmluZSBTVEFUX0dPVENBUlJJRVJTRVQgMTEKKyNkZWZpbmUgU1RBVF9XUk9OR1NTSUQgMjAKKyNkZWZpbmUgU1RBVF9CQURDSEFOTkVMIDI1CisjZGVmaW5lIFNUQVRfQkFEQklUUkFURVMgMzAKKyNkZWZpbmUgU1RBVF9CQURQUklWQUNZIDM1CisjZGVmaW5lIFNUQVRfQVBGT1VORCA0MAorI2RlZmluZSBTVEFUX0FQUkVKRUNURUQgNTAKKyNkZWZpbmUgU1RBVF9BVVRIRU5USUNBVElORyA2MAorI2RlZmluZSBTVEFUX0RFQVVUSEVOVElDQVRFRCA2MQorI2RlZmluZSBTVEFUX0FVVEhUSU1FT1VUIDYyCisjZGVmaW5lIFNUQVRfQVNTT0NJQVRJTkcgNzAKKyNkZWZpbmUgU1RBVF9ERUFTU09DSUFURUQgNzEKKyNkZWZpbmUgU1RBVF9BU1NPQ1RJTUVPVVQgNzIKKyNkZWZpbmUgU1RBVF9OT1RBSVJPQVAgNzMKKyNkZWZpbmUgU1RBVF9BU1NPQ0lBVEVEIDgwCisjZGVmaW5lIFNUQVRfTEVBUElORyA5MAorI2RlZmluZSBTVEFUX0xFQVBGQUlMRUQgOTEKKyNkZWZpbmUgU1RBVF9MRUFQVElNRURPVVQgOTIKKyNkZWZpbmUgU1RBVF9MRUFQQ09NUExFVEUgOTMKK30gU3RhdHVzUmlkOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGxlbjsKKwl1MTYgc3BhY2VyOworCXUzMiB2YWxzWzEwMF07Cit9IFN0YXRzUmlkOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgbGVuOworCXU4IGFwWzRdW0VUSF9BTEVOXTsKK30gQVBMaXN0UmlkOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGxlbjsKKwljaGFyIG91aVszXTsKKwljaGFyIHplcm87CisJdTE2IHByb2ROdW07CisJY2hhciBtYW5OYW1lWzMyXTsKKwljaGFyIHByb2ROYW1lWzE2XTsKKwljaGFyIHByb2RWZXJbOF07CisJY2hhciBmYWN0b3J5QWRkcltFVEhfQUxFTl07CisJY2hhciBhaXJvbmV0QWRkcltFVEhfQUxFTl07CisJdTE2IHJhZGlvVHlwZTsKKwl1MTYgY291bnRyeTsKKwljaGFyIGNhbGxpZFtFVEhfQUxFTl07CisJY2hhciBzdXBwb3J0ZWRSYXRlc1s4XTsKKwljaGFyIHJ4RGl2ZXJzaXR5OworCWNoYXIgdHhEaXZlcnNpdHk7CisJdTE2IHR4UG93ZXJMZXZlbHNbOF07CisJdTE2IGhhcmRWZXI7CisJdTE2IGhhcmRDYXA7CisJdTE2IHRlbXBSYW5nZTsKKwl1MTYgc29mdFZlcjsKKwl1MTYgc29mdFN1YlZlcjsKKwl1MTYgaW50ZXJmYWNlVmVyOworCXUxNiBzb2Z0Q2FwOworCXUxNiBib290QmxvY2tWZXI7CisJdTE2IHJlcXVpcmVkSGFyZDsKKwl1MTYgZXh0U29mdENhcDsKK30gQ2FwYWJpbGl0eVJpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1MTYgbGVuOworICB1MTYgaW5kZXg7IC8qIEZpcnN0IGlzIDAgYW5kIDB4ZmZmZiBtZWFucyBlbmQgb2YgbGlzdCAqLworI2RlZmluZSBSQURJT19GSCAxIC8qIEZyZXF1ZW5jeSBob3BwaW5nIHJhZGlvIHR5cGUgKi8KKyNkZWZpbmUgUkFESU9fRFMgMiAvKiBEaXJlY3Qgc2VxdWVuY2UgcmFkaW8gdHlwZSAqLworI2RlZmluZSBSQURJT19UTUEgNCAvKiBQcm9wcmlldGFyeSByYWRpbyB1c2VkIGluIG9sZCBjYXJkcyAoMjUwMCkgKi8KKyAgdTE2IHJhZGlvVHlwZTsKKyAgdTggYnNzaWRbRVRIX0FMRU5dOyAvKiBNYWMgYWRkcmVzcyBvZiB0aGUgQlNTICovCisgIHU4IHplcm87CisgIHU4IHNzaWRMZW47CisgIHU4IHNzaWRbMzJdOworICB1MTYgcnNzaTsKKyNkZWZpbmUgQ0FQX0VTUyAoMTw8MCkKKyNkZWZpbmUgQ0FQX0lCU1MgKDE8PDEpCisjZGVmaW5lIENBUF9QUklWQUNZICgxPDw0KQorI2RlZmluZSBDQVBfU0hPUlRIRFIgKDE8PDUpCisgIHUxNiBjYXA7CisgIHUxNiBiZWFjb25JbnRlcnZhbDsKKyAgdTggcmF0ZXNbOF07IC8qIFNhbWUgYXMgcmF0ZXMgZm9yIGNvbmZpZyByaWQgKi8KKyAgc3RydWN0IHsgLyogRm9yIGZyZXF1ZW5jeSBob3BwaW5nIG9ubHkgKi8KKyAgICB1MTYgZHdlbGw7CisgICAgdTggaG9wU2V0OworICAgIHU4IGhvcFBhdHRlcm47CisgICAgdTggaG9wSW5kZXg7CisgICAgdTggZmlsbDsKKyAgfSBmaDsKKyAgdTE2IGRzQ2hhbm5lbDsKKyAgdTE2IGF0aW1XaW5kb3c7Cit9IEJTU0xpc3RSaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdTggcnNzaXBjdDsKKyAgdTggcnNzaWRCbTsKK30gdGRzUnNzaUVudHJ5OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHUxNiBsZW47CisgIHRkc1Jzc2lFbnRyeSB4WzI1Nl07Cit9IHRkc1Jzc2lSaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgbGVuOworCXUxNiBzdGF0ZTsKKwl1MTYgbXVsdGljYXN0VmFsaWQ7CisJdTggIG11bHRpY2FzdFsxNl07CisJdTE2IHVuaWNhc3RWYWxpZDsKKwl1OCAgdW5pY2FzdFsxNl07Cit9IE1JQ1JpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiB0eXBlbGVuOworCisJdW5pb24geworCSAgICB1OCBzbmFwWzhdOworCSAgICBzdHJ1Y3QgeworCQl1OCBkc2FwOworCQl1OCBzc2FwOworCQl1OCBjb250cm9sOworCQl1OCBvcmdjb2RlWzNdOworCQl1OCBmaWVsZHR5cGVbMl07CisJICAgIH0gbGxjOworCX0gdTsKKwl1MzIgbWljOworCXUzMiBzZXE7Cit9IE1JQ0J1ZmZlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXU4IGRhW0VUSF9BTEVOXTsKKwl1OCBzYVtFVEhfQUxFTl07Cit9IGV0aGVySGVhZDsKKworI3ByYWdtYSBwYWNrKCkKKworI2RlZmluZSBUWENUTF9UWE9LICgxPDwxKSAvKiByZXBvcnQgaWYgdHggaXMgb2sgKi8KKyNkZWZpbmUgVFhDVExfVFhFWCAoMTw8MikgLyogcmVwb3J0IGlmIHR4IGZhaWxzICovCisjZGVmaW5lIFRYQ1RMXzgwMl8zICgwPDwzKSAvKiA4MDIuMyBwYWNrZXQgKi8KKyNkZWZpbmUgVFhDVExfODAyXzExICgxPDwzKSAvKiA4MDIuMTEgbWFjIHBhY2tldCAqLworI2RlZmluZSBUWENUTF9FVEhFUk5FVCAoMDw8NCkgLyogcGF5bG9hZCBoYXMgZXRoZXJ0eXBlICovCisjZGVmaW5lIFRYQ1RMX0xMQyAoMTw8NCkgLyogcGF5bG9hZCBpcyBsbGMgKi8KKyNkZWZpbmUgVFhDVExfUkVMRUFTRSAoMDw8NSkgLyogcmVsZWFzZSBhZnRlciBjb21wbGV0aW9uICovCisjZGVmaW5lIFRYQ1RMX05PUkVMRUFTRSAoMTw8NSkgLyogb24gY29tcGxldGlvbiByZXR1cm5zIHRvIGhvc3QgKi8KKworI2RlZmluZSBCVVNZX0ZJRCAweDEwMDAwCisKKyNpZmRlZiBDSVNDT19FWFQKKyNkZWZpbmUgQUlST01BR0lDCTB4YTU1YQorLyogV2FybmluZyA6IFNJT0NERVZQUklWQVRFIG1heSBkaXNhcGVhciBkdXJpbmcgMi41LlggLSBKZWFuIElJICovCisjaWZkZWYgU0lPQ0lXRklSU1RQUklWCisjaWZkZWYgU0lPQ0RFVlBSSVZBVEUKKyNkZWZpbmUgQUlST09MRElPQ1RMCVNJT0NERVZQUklWQVRFCisjZGVmaW5lIEFJUk9PTERJRElGQyAJQUlST09MRElPQ1RMICsgMQorI2VuZGlmIC8qIFNJT0NERVZQUklWQVRFICovCisjZWxzZSAvKiBTSU9DSVdGSVJTVFBSSVYgKi8KKyNkZWZpbmUgU0lPQ0lXRklSU1RQUklWIFNJT0NERVZQUklWQVRFCisjZW5kaWYgLyogU0lPQ0lXRklSU1RQUklWICovCisvKiBUaGlzIG1heSBiZSB3cm9uZy4gV2hlbiB1c2luZyB0aGUgbmV3IFNJT0NJV0ZJUlNUUFJJViByYW5nZSwgd2UgcHJvYmFibHkKKyAqIHNob3VsZCB1c2Ugb25seSAiR0VUIiBpb2N0bHMgKGxhc3QgYml0IHNldCB0byAxKS4gIlNFVCIgaW9jdGxzIGFyZSByb290CisgKiBvbmx5IGFuZCBkb24ndCByZXR1cm4gdGhlIG1vZGlmaWVkIHN0cnVjdCBpZnJlcSB0byB0aGUgYXBwbGljYXRpb24gd2hpY2gKKyAqIGlzIHVzdWFsbHkgYSBwcm9ibGVtLiAtIEplYW4gSUkgKi8KKyNkZWZpbmUgQUlST0lPQ1RMCVNJT0NJV0ZJUlNUUFJJVgorI2RlZmluZSBBSVJPSURJRkMgCUFJUk9JT0NUTCArIDEKKworLyogSW9jdGwgY29uc3RhbnRzIHRvIGJlIHVzZWQgaW4gYWlyb19pb2N0bC5jb21tYW5kICovCisKKyNkZWZpbmUJQUlST0dDQVAgIAkJMAkvLyBDYXBhYmlsaXR5IHJpZAorI2RlZmluZSBBSVJPR0NGRwkJMSAgICAgICAvLyBVU0VEIEEgTE9UCisjZGVmaW5lIEFJUk9HU0xJU1QJCTIJLy8gU3lzdGVtIElEIGxpc3QKKyNkZWZpbmUgQUlST0dWTElTVAkJMyAgICAgICAvLyBMaXN0IG9mIHNwZWNpZmllZCBBUCdzCisjZGVmaW5lIEFJUk9HRFJWTkFNCQk0CS8vICBOT1RVU0VECisjZGVmaW5lIEFJUk9HRUhURU5DCQk1CS8vIE5PVFVTRUQKKyNkZWZpbmUgQUlST0dXRVBLVE1QCQk2CisjZGVmaW5lIEFJUk9HV0VQS05WCQk3CisjZGVmaW5lIEFJUk9HU1RBVAkJOAorI2RlZmluZSBBSVJPR1NUQVRTQzMyCQk5CisjZGVmaW5lIEFJUk9HU1RBVFNEMzIJCTEwCisjZGVmaW5lIEFJUk9HTUlDUklECQkxMQorI2RlZmluZSBBSVJPR01JQ1NUQVRTCQkxMgorI2RlZmluZSBBSVJPR0ZMQUdTCQkxMworI2RlZmluZSBBSVJPR0lECQkJMTQKKyNkZWZpbmUgQUlST1JSSUQJCTE1CisjZGVmaW5lIEFJUk9SU1dWRVJTSU9OCQkxNworCisvKiBMZWF2ZSBnYXAgb2YgNDAgY29tbWFuZHMgYWZ0ZXIgQUlST0dTVEFUU0QzMiBmb3IgZnV0dXJlICovCisKKyNkZWZpbmUgQUlST1BDQVAgICAgICAgICAgICAgICAJQUlST0dTVEFUU0QzMiArIDQwCisjZGVmaW5lIEFJUk9QVkxJU1QgICAgICAgICAgICAgIEFJUk9QQ0FQICAgICAgKyAxCisjZGVmaW5lIEFJUk9QU0xJU1QJCUFJUk9QVkxJU1QgICAgKyAxCisjZGVmaW5lIEFJUk9QQ0ZHCQlBSVJPUFNMSVNUICAgICsgMQorI2RlZmluZSBBSVJPUFNJRFMJCUFJUk9QQ0ZHICAgICAgKyAxCisjZGVmaW5lIEFJUk9QQVBMSVNUCQlBSVJPUFNJRFMgICAgICsgMQorI2RlZmluZSBBSVJPUE1BQ09OCQlBSVJPUEFQTElTVCAgICsgMQkvKiBFbmFibGUgbWFjICAqLworI2RlZmluZSBBSVJPUE1BQ09GRgkJQUlST1BNQUNPTiAgICArIDEgCS8qIERpc2FibGUgbWFjICovCisjZGVmaW5lIEFJUk9QU1RDTFIJCUFJUk9QTUFDT0ZGICAgKyAxCisjZGVmaW5lIEFJUk9QV0VQS0VZCQlBSVJPUFNUQ0xSICAgICsgMQorI2RlZmluZSBBSVJPUFdFUEtFWU5WCQlBSVJPUFdFUEtFWSAgICsgMQorI2RlZmluZSBBSVJPUExFQVBQV0QgICAgICAgICAgICBBSVJPUFdFUEtFWU5WICsgMQorI2RlZmluZSBBSVJPUExFQVBVU1IgICAgICAgICAgICBBSVJPUExFQVBQV0QgICsgMQorCisvKiBGbGFzaCBjb2RlcyAqLworCisjZGVmaW5lIEFJUk9GTFNIUlNUCSAgICAgICBBSVJPUFdFUEtFWU5WICArIDQwCisjZGVmaW5lIEFJUk9GTFNIR0NIUiAgICAgICAgICAgQUlST0ZMU0hSU1QgICAgKyAxCisjZGVmaW5lIEFJUk9GTFNIU1RGTCAgICAgICAgICAgQUlST0ZMU0hHQ0hSICAgKyAxCisjZGVmaW5lIEFJUk9GTFNIUENIUiAgICAgICAgICAgQUlST0ZMU0hTVEZMICAgKyAxCisjZGVmaW5lIEFJUk9GTFBVVEJVRiAgICAgICAgICAgQUlST0ZMU0hQQ0hSICAgKyAxCisjZGVmaW5lIEFJUk9SRVNUQVJUICAgICAgICAgICAgQUlST0ZMUFVUQlVGICAgKyAxCisKKyNkZWZpbmUgRkxBU0hTSVpFCTMyNzY4CisjZGVmaW5lIEFVWE1FTVNJWkUJKDI1NiAqIDEwMjQpCisKK3R5cGVkZWYgc3RydWN0IGFpcm9uZXRfaW9jdGwgeworCXVuc2lnbmVkIHNob3J0IGNvbW1hbmQ7CQkvLyBXaGF0IHRvIGRvCisJdW5zaWduZWQgc2hvcnQgbGVuOwkJLy8gTGVuIG9mIGRhdGEKKwl1bnNpZ25lZCBzaG9ydCByaWRudW07CQkvLyByaWQgbnVtYmVyCisJdW5zaWduZWQgY2hhciBfX3VzZXIgKmRhdGE7CS8vIGQtZGF0YQorfSBhaXJvbmV0X2lvY3RsOworCitzdGF0aWMgY2hhciAqc3d2ZXJzaW9uID0gIjIuMSI7CisjZW5kaWYgLyogQ0lTQ09fRVhUICovCisKKyNkZWZpbmUgTlVNX01PRFVMRVMgICAgICAgMgorI2RlZmluZSBNSUNfTVNHTEVOX01BWCAgICAyNDAwCisjZGVmaW5lIEVNTUgzMl9NU0dMRU5fTUFYIE1JQ19NU0dMRU5fTUFYCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgICBzaXplOyAgICAgICAgICAgIC8vIHNpemUKKwl1OCAgICBlbmFibGVkOyAgICAgICAgIC8vIE1JQyBlbmFibGVkIG9yIG5vdAorCXUzMiAgIHJ4U3VjY2VzczsgICAgICAgLy8gc3VjY2Vzc2Z1bCBwYWNrZXRzIHJlY2VpdmVkCisJdTMyICAgcnhJbmNvcnJlY3RNSUM7ICAvLyBwa3RzIGRyb3BwZWQgZHVlIHRvIGluY29ycmVjdCBNSUMgY29tcGFyaXNvbgorCXUzMiAgIHJ4Tm90TUlDZWQ7ICAgICAgLy8gcGt0cyBkcm9wcGVkIGR1ZSB0byBub3QgYmVpbmcgTUlDJ2QKKwl1MzIgICByeE1JQ1BsdW1tZWQ7ICAgIC8vIHBrdHMgZHJvcHBlZCBkdWUgdG8gbm90IGhhdmluZyBhIE1JQyBwbHVtbWVkCisJdTMyICAgcnhXcm9uZ1NlcXVlbmNlOyAvLyBwa3RzIGRyb3BwZWQgZHVlIHRvIHNlcXVlbmNlIG51bWJlciB2aW9sYXRpb24KKwl1MzIgICByZXNlcnZlWzMyXTsKK30gbWljX3N0YXRpc3RpY3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgY29lZmZbKChFTU1IMzJfTVNHTEVOX01BWCkrMyk+PjJdOworCXU2NCBhY2N1bTsJLy8gYWNjdW11bGF0ZWQgbWljLCByZWR1Y2VkIHRvIHUzMiBpbiBmaW5hbCgpCisJaW50IHBvc2l0aW9uOwkvLyBjdXJyZW50IHBvc2l0aW9uIChieXRlIG9mZnNldCkgaW4gbWVzc2FnZQorCXVuaW9uIHsKKwkJdTggIGQ4WzRdOworCQl1MzIgZDMyOworCX0gcGFydDsJLy8gc2F2ZXMgcGFydGlhbCBtZXNzYWdlIHdvcmQgYWNyb3NzIHVwZGF0ZSgpIGNhbGxzCit9IGVtbWgzMl9jb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCB7CisJZW1taDMyX2NvbnRleHQgc2VlZDsJICAgIC8vIENvbnRleHQgLSB0aGUgc2VlZAorCXUzMgkJIHJ4OwkgICAgLy8gUmVjZWl2ZWQgc2VxdWVuY2UgbnVtYmVyCisJdTMyCQkgdHg7CSAgICAvLyBUeCBzZXF1ZW5jZSBudW1iZXIKKwl1MzIJCSB3aW5kb3c7ICAgIC8vIFN0YXJ0IG9mIHdpbmRvdworCXU4CQkgdmFsaWQ7CSAgICAvLyBGbGFnIHRvIHNheSBpZiBjb250ZXh0IGlzIHZhbGlkIG9yIG5vdAorCXU4CQkga2V5WzE2XTsKK30gbWljY250eDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCW1pY2NudHggbUN0eDsJCS8vIE11bHRpY2FzdCBjb250ZXh0CisJbWljY250eCB1Q3R4OwkJLy8gVW5pY2FzdCBjb250ZXh0Cit9IG1pY19tb2R1bGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgIHJpZDogMTY7CisJdW5zaWduZWQgaW50ICBsZW46IDE1OworCXVuc2lnbmVkIGludCAgdmFsaWQ6IDE7CisJZG1hX2FkZHJfdCBob3N0X2FkZHI7Cit9IFJpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCAgb2Zmc2V0OiAxNTsKKwl1bnNpZ25lZCBpbnQgIGVvYzogMTsKKwl1bnNpZ25lZCBpbnQgIGxlbjogMTU7CisJdW5zaWduZWQgaW50ICB2YWxpZDogMTsKKwlkbWFfYWRkcl90IGhvc3RfYWRkcjsKK30gVHhGaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgIGN0bDogMTU7CisJdW5zaWduZWQgaW50ICByZHk6IDE7CisJdW5zaWduZWQgaW50ICBsZW46IDE1OworCXVuc2lnbmVkIGludCAgdmFsaWQ6IDE7CisJZG1hX2FkZHJfdCBob3N0X2FkZHI7Cit9IFJ4RmlkOworCisvKgorICogSG9zdCByZWNlaXZlIGRlc2NyaXB0b3IKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqY2FyZF9yYW1fb2ZmOyAvKiBvZmZzZXQgaW50byBjYXJkIG1lbW9yeSBvZiB0aGUKKwkJCQkJCWRlc2MgKi8KKwlSeEZpZCAgICAgICAgIHJ4X2Rlc2M7CQkgICAgIC8qIGNhcmQgcmVjZWl2ZSBkZXNjcmlwdG9yICovCisJY2hhciAgICAgICAgICAqdmlydHVhbF9ob3N0X2FkZHI7ICAgIC8qIHZpcnR1YWwgYWRkcmVzcyBvZiBob3N0IHJlY2VpdmUKKwkJCQkJICAgICAgICBidWZmZXIgKi8KKwlpbnQgICAgICAgICAgIHBlbmRpbmc7Cit9IEhvc3RSeERlc2M7CisKKy8qCisgKiBIb3N0IHRyYW5zbWl0IGRlc2NyaXB0b3IKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqY2FyZF9yYW1fb2ZmOwkgICAgIC8qIG9mZnNldCBpbnRvIGNhcmQgbWVtb3J5IG9mIHRoZQorCQkJCQkJZGVzYyAqLworCVR4RmlkICAgICAgICAgdHhfZGVzYzsJCSAgICAgLyogY2FyZCB0cmFuc21pdCBkZXNjcmlwdG9yICovCisJY2hhciAgICAgICAgICAqdmlydHVhbF9ob3N0X2FkZHI7ICAgIC8qIHZpcnR1YWwgYWRkcmVzcyBvZiBob3N0IHJlY2VpdmUKKwkJCQkJICAgICAgICBidWZmZXIgKi8KKwlpbnQgICAgICAgICAgIHBlbmRpbmc7Cit9IEhvc3RUeERlc2M7CisKKy8qCisgKiBIb3N0IFJJRCBkZXNjcmlwdG9yCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKmNhcmRfcmFtX29mZjsgICAgICAvKiBvZmZzZXQgaW50byBjYXJkIG1lbW9yeSBvZiB0aGUKKwkJCQkJICAgICBkZXNjcmlwdG9yICovCisJUmlkICAgICAgICAgICByaWRfZGVzYzsJCSAgLyogY2FyZCBSSUQgZGVzY3JpcHRvciAqLworCWNoYXIgICAgICAgICAgKnZpcnR1YWxfaG9zdF9hZGRyOyAvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgaG9zdCByZWNlaXZlCisJCQkJCSAgICAgYnVmZmVyICovCit9IEhvc3RSaWREZXNjOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IHN3MDsKKwl1MTYgc3cxOworCXUxNiBzdGF0dXM7CisJdTE2IGxlbjsKKyNkZWZpbmUgSE9TVF9TRVQgKDEgPDwgMCkKKyNkZWZpbmUgSE9TVF9JTlRfVFggKDEgPDwgMSkgLyogSW50ZXJydXB0IG9uIHN1Y2Nlc3NmdWwgVFggKi8KKyNkZWZpbmUgSE9TVF9JTlRfVFhFUlIgKDEgPDwgMikgLyogSW50ZXJydXB0IG9uIHVuc2VjY2Vzc2Z1bCBUWCAqLworI2RlZmluZSBIT1NUX0xDQ19QQVlMT0FEICgxIDw8IDQpIC8qIExMQyBwYXlsb2FkLCAwID0gRXRoZXJ0eXBlICovCisjZGVmaW5lIEhPU1RfRE9OVF9STFNFICgxIDw8IDUpIC8qIERvbid0IHJlbGVhc2UgYnVmZmVyIHdoZW4gZG9uZSAqLworI2RlZmluZSBIT1NUX0RPTlRfUkVUUlkgKDEgPDwgNikgLyogRG9uJ3QgcmV0cnkgdHJhc21pdCAqLworI2RlZmluZSBIT1NUX0NMUl9BSUQgKDEgPDwgNykgLyogY2xlYXIgQUlEIGZhaWx1cmUgKi8KKyNkZWZpbmUgSE9TVF9SVFMgKDEgPDwgOSkgLyogRm9yY2UgUlRTIHVzZSAqLworI2RlZmluZSBIT1NUX1NIT1JUICgxIDw8IDEwKSAvKiBEbyBzaG9ydCBwcmVhbWJsZSAqLworCXUxNiBjdGw7CisJdTE2IGFpZDsKKwl1MTYgcmV0cmllczsKKwl1MTYgZmlsbDsKK30gVHhDdGxIZHI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgdTE2IGN0bDsKKyAgICAgICAgdTE2IGR1cmF0aW9uOworICAgICAgICBjaGFyIGFkZHIxWzZdOworICAgICAgICBjaGFyIGFkZHIyWzZdOworICAgICAgICBjaGFyIGFkZHIzWzZdOworICAgICAgICB1MTYgc2VxOworICAgICAgICBjaGFyIGFkZHI0WzZdOworfSBXaWZpSGRyOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwlUeEN0bEhkciBjdGxoZHI7CisJdTE2IGZpbGwxOworCXUxNiBmaWxsMjsKKwlXaWZpSGRyIHdpZmloZHI7CisJdTE2IGdhcGxlbjsKKwl1MTYgc3RhdHVzOworfSBXaWZpQ3RsSGRyOworCitXaWZpQ3RsSGRyIHdpZmljdGxoZHI4MDIzID0geworCS5jdGxoZHIgPSB7CisJCS5jdGwJPSBIT1NUX0RPTlRfUkxTRSwKKwl9Cit9OworCisjaWZkZWYgV0lSRUxFU1NfRVhUCisvLyBGcmVxdWVuY3kgbGlzdCAobWFwIGNoYW5uZWxzIHRvIGZyZXF1ZW5jaWVzKQorc3RhdGljIGNvbnN0IGxvbmcgZnJlcXVlbmN5X2xpc3RbXSA9IHsgMjQxMiwgMjQxNywgMjQyMiwgMjQyNywgMjQzMiwgMjQzNywgMjQ0MiwKKwkJCQkyNDQ3LCAyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LCAyNDcyLCAyNDg0IH07CisKKy8vIEEgZmV3IGRldGFpbHMgbmVlZGVkIGZvciBXRVAgKFdpcmVsZXNzIEVxdWl2YWxlbnQgUHJpdmFjeSkKKyNkZWZpbmUgTUFYX0tFWV9TSVpFIDEzCQkJLy8gMTI4ICg/KSBiaXRzCisjZGVmaW5lIE1JTl9LRVlfU0laRSAgNQkJCS8vIDQwIGJpdHMgUkM0IC0gV0VQCit0eXBlZGVmIHN0cnVjdCB3ZXBfa2V5X3QgeworCXUxNglsZW47CisJdTgJa2V5WzE2XTsJLyogNDAtYml0IGFuZCAxMDQtYml0IGtleXMgKi8KK30gd2VwX2tleV90OworCisvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisjaWZuZGVmIElXX0VOQ09ERV9OT0tFWQorI2RlZmluZSBJV19FTkNPREVfTk9LRVkgICAgICAgICAweDA4MDAgIC8qIEtleSBpcyB3cml0ZSBvbmx5LCBzbyBub3QgcHJlc2VudCAqLworI2RlZmluZSBJV19FTkNPREVfTU9ERSAgKElXX0VOQ09ERV9ESVNBQkxFRCB8IElXX0VOQ09ERV9SRVNUUklDVEVEIHwgSVdfRU5DT0RFX09QRU4pCisjZW5kaWYgLyogSVdfRU5DT0RFX05PS0VZICovCisKKy8qIExpc3Qgb2YgV2lyZWxlc3MgSGFuZGxlcnMgKG5ldyBBUEkpICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCWFpcm9faGFuZGxlcl9kZWY7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9ICJhaXJvLmMgMC42IChCZW4gUmVlZCAmIEphdmllciBBY2hpcmljYSkiOworCitzdHJ1Y3QgYWlyb19pbmZvOworCitzdGF0aWMgaW50IGdldF9kZWNfdTE2KCBjaGFyICpidWZmZXIsIGludCAqc3RhcnQsIGludCBsaW1pdCApOworc3RhdGljIHZvaWQgT1VUNDUwMCggc3RydWN0IGFpcm9faW5mbyAqLCB1MTYgcmVnaXN0ZXIsIHUxNiB2YWx1ZSApOworc3RhdGljIHVuc2lnbmVkIHNob3J0IElONDUwMCggc3RydWN0IGFpcm9faW5mbyAqLCB1MTYgcmVnaXN0ZXIgKTsKK3N0YXRpYyB1MTYgc2V0dXBfY2FyZChzdHJ1Y3QgYWlyb19pbmZvKiwgdTggKm1hYywgaW50IGxvY2spOworc3RhdGljIGludCBlbmFibGVfTUFDKCBzdHJ1Y3QgYWlyb19pbmZvICphaSwgUmVzcCAqcnNwLCBpbnQgbG9jayApOworc3RhdGljIHZvaWQgZGlzYWJsZV9NQUMoc3RydWN0IGFpcm9faW5mbyAqYWksIGludCBsb2NrKTsKK3N0YXRpYyB2b2lkIGVuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBhaXJvX2luZm8qKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgYWlyb19pbmZvKik7CitzdGF0aWMgdTE2IGlzc3VlY29tbWFuZChzdHJ1Y3QgYWlyb19pbmZvKiwgQ21kICpwQ21kLCBSZXNwICpwUnNwKTsKK3N0YXRpYyBpbnQgYmFwX3NldHVwKHN0cnVjdCBhaXJvX2luZm8qLCB1MTYgcmlkLCB1MTYgb2Zmc2V0LCBpbnQgd2hpY2hiYXApOworc3RhdGljIGludCBhdXhfYmFwX3JlYWQoc3RydWN0IGFpcm9faW5mbyosIHUxNiAqcHUxNkRzdCwgaW50IGJ5dGVsZW4sCisJCQlpbnQgd2hpY2hiYXApOworc3RhdGljIGludCBmYXN0X2JhcF9yZWFkKHN0cnVjdCBhaXJvX2luZm8qLCB1MTYgKnB1MTZEc3QsIGludCBieXRlbGVuLAorCQkJIGludCB3aGljaGJhcCk7CitzdGF0aWMgaW50IGJhcF93cml0ZShzdHJ1Y3QgYWlyb19pbmZvKiwgY29uc3QgdTE2ICpwdTE2U3JjLCBpbnQgYnl0ZWxlbiwKKwkJICAgICBpbnQgd2hpY2hiYXApOworc3RhdGljIGludCBQQzQ1MDBfYWNjZXNzcmlkKHN0cnVjdCBhaXJvX2luZm8qLCB1MTYgcmlkLCB1MTYgYWNjbWQpOworc3RhdGljIGludCBQQzQ1MDBfcmVhZHJpZChzdHJ1Y3QgYWlyb19pbmZvKiwgdTE2IHJpZCwgdm9pZCAqcEJ1ZiwgaW50IGxlbiwgaW50IGxvY2spOworc3RhdGljIGludCBQQzQ1MDBfd3JpdGVyaWQoc3RydWN0IGFpcm9faW5mbyosIHUxNiByaWQsIGNvbnN0IHZvaWQKKwkJCSAgICpwQnVmLCBpbnQgbGVuLCBpbnQgbG9jayk7CitzdGF0aWMgaW50IGRvX3dyaXRlcmlkKCBzdHJ1Y3QgYWlyb19pbmZvKiwgdTE2IHJpZCwgY29uc3Qgdm9pZCAqcmlkX2RhdGEsCisJCQlpbnQgbGVuLCBpbnQgZHVtbXkgKTsKK3N0YXRpYyB1MTYgdHJhbnNtaXRfYWxsb2NhdGUoc3RydWN0IGFpcm9faW5mbyosIGludCBsZW5QYXlsb2FkLCBpbnQgcmF3KTsKK3N0YXRpYyBpbnQgdHJhbnNtaXRfODAyXzNfcGFja2V0KHN0cnVjdCBhaXJvX2luZm8qLCBpbnQgbGVuLCBjaGFyICpwUGFja2V0KTsKK3N0YXRpYyBpbnQgdHJhbnNtaXRfODAyXzExX3BhY2tldChzdHJ1Y3QgYWlyb19pbmZvKiwgaW50IGxlbiwgY2hhciAqcFBhY2tldCk7CisKK3N0YXRpYyBpbnQgbXBpX3NlbmRfcGFja2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG1waV91bm1hcF9jYXJkKHN0cnVjdCBwY2lfZGV2ICpwY2kpOworc3RhdGljIHZvaWQgbXBpX3JlY2VpdmVfODAyXzMoc3RydWN0IGFpcm9faW5mbyAqYWkpOworc3RhdGljIHZvaWQgbXBpX3JlY2VpdmVfODAyXzExKHN0cnVjdCBhaXJvX2luZm8gKmFpKTsKK3N0YXRpYyBpbnQgd2FpdGJ1c3kgKHN0cnVjdCBhaXJvX2luZm8gKmFpKTsKKworc3RhdGljIGlycXJldHVybl90IGFpcm9faW50ZXJydXB0KCBpbnQgaXJxLCB2b2lkKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzCisJCQkgICAgKnJlZ3MpOworc3RhdGljIGludCBhaXJvX3RocmVhZCh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIHRpbWVyX2Z1bmMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3N0YXRpYyBpbnQgYWlyb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKKyNpZmRlZiBXSVJFTEVTU19FWFQKK3N0cnVjdCBpd19zdGF0aXN0aWNzICphaXJvX2dldF93aXJlbGVzc19zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhaXJvX3JlYWRfd2lyZWxlc3Nfc3RhdHMgKHN0cnVjdCBhaXJvX2luZm8gKmxvY2FsKTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKyNpZmRlZiBDSVNDT19FWFQKK3N0YXRpYyBpbnQgcmVhZHJpZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYWlyb25ldF9pb2N0bCAqY29tcCk7CitzdGF0aWMgaW50IHdyaXRlcmlkcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBhaXJvbmV0X2lvY3RsICpjb21wKTsKK2ludCBmbGFzaGNhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYWlyb25ldF9pb2N0bCAqY29tcCk7CisjZW5kaWYgLyogQ0lTQ09fRVhUICovCisjaWZkZWYgTUlDU1VQUE9SVAorc3RhdGljIHZvaWQgbWljaW5pdChzdHJ1Y3QgYWlyb19pbmZvICphaSk7CitzdGF0aWMgaW50IG1pY3NldHVwKHN0cnVjdCBhaXJvX2luZm8gKmFpKTsKK3N0YXRpYyBpbnQgZW5jYXBzdWxhdGUoc3RydWN0IGFpcm9faW5mbyAqYWksIGV0aGVySGVhZCAqcFBhY2tldCwgTUlDQnVmZmVyICpidWZmZXIsIGludCBsZW4pOworc3RhdGljIGludCBkZWNhcHN1bGF0ZShzdHJ1Y3QgYWlyb19pbmZvICphaSwgTUlDQnVmZmVyICptaWMsIGV0aGVySGVhZCAqcFBhY2tldCwgdTE2IHBheUxlbik7CisKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNlbmRpZgorCitzdHJ1Y3QgYWlyb19pbmZvIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAgICAgICAqZGV2OworCS8qIE5vdGUsIHdlIGNhbiBoYXZlIE1BWF9GSURTIG91dHN0YW5kaW5nLiAgRklEcyBhcmUgMTYtYml0cywgc28gd2UKKwkgICB1c2UgdGhlIGhpZ2ggYml0IHRvIG1hcmsgd2hldGhlciBpdCBpcyBpbiB1c2UuICovCisjZGVmaW5lIE1BWF9GSURTIDYKKyNkZWZpbmUgTVBJX01BWF9GSURTIDEKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWRzW01BWF9GSURTXTsKKwlDb25maWdSaWQgY29uZmlnOworCWNoYXIga2V5aW5kZXg7IC8vIFVzZWQgd2l0aCBhdXRvIHdlcAorCWNoYXIgZGVmaW5kZXg7IC8vIFVzZWQgd2l0aCBhdXRvIHdlcAorCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19lbnRyeTsKKyAgICAgICAgc3BpbmxvY2tfdCBhdXhfbG9jazsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyNkZWZpbmUgRkxBR19QUk9NSVNDCTgJLyogSUZGX1BST01JU0MgMHgxMDAgLSBpbmNsdWRlL2xpbnV4L2lmLmggKi8KKyNkZWZpbmUgRkxBR19SQURJT19PRkYJMAkvKiBVc2VyIGRpc2FibGluZyBvZiBNQUMgKi8KKyNkZWZpbmUgRkxBR19SQURJT19ET1dOCTEJLyogaWZ1cC9pZmRvd24gZGlzYWJsaW5nIG9mIE1BQyAqLworI2RlZmluZSBGTEFHX1JBRElPX01BU0sgMHgwMworI2RlZmluZSBGTEFHX0VOQUJMRUQJMgorI2RlZmluZSBGTEFHX0FESE9DCTMJLyogTmVlZGVkIGJ5IE1JQyAqLworI2RlZmluZSBGTEFHX01JQ19DQVBBQkxFIDQKKyNkZWZpbmUgRkxBR19VUERBVEVfTVVMVEkgNQorI2RlZmluZSBGTEFHX1VQREFURV9VTkkgNgorI2RlZmluZSBGTEFHXzgwMl8xMQk3CisjZGVmaW5lIEZMQUdfUEVORElOR19YTUlUIDkKKyNkZWZpbmUgRkxBR19QRU5ESU5HX1hNSVQxMSAxMAorI2RlZmluZSBGTEFHX01QSQkxMQorI2RlZmluZSBGTEFHX1JFR0lTVEVSRUQJMTIKKyNkZWZpbmUgRkxBR19DT01NSVQJMTMKKyNkZWZpbmUgRkxBR19SRVNFVAkxNAorI2RlZmluZSBGTEFHX0ZMQVNISU5HCTE1CisjZGVmaW5lIEpPQl9NQVNLCTB4MWZmMDAwMAorI2RlZmluZSBKT0JfRElFCQkxNgorI2RlZmluZSBKT0JfWE1JVAkxNworI2RlZmluZSBKT0JfWE1JVDExCTE4CisjZGVmaW5lIEpPQl9TVEFUUwkxOQorI2RlZmluZSBKT0JfUFJPTUlTQwkyMAorI2RlZmluZSBKT0JfTUlDCQkyMQorI2RlZmluZSBKT0JfRVZFTlQJMjIKKyNkZWZpbmUgSk9CX0FVVE9XRVAJMjMKKyNkZWZpbmUgSk9CX1dTVEFUUwkyNAorCWludCAoKmJhcF9yZWFkKShzdHJ1Y3QgYWlyb19pbmZvKiwgdTE2ICpwdTE2RHN0LCBpbnQgYnl0ZWxlbiwKKwkJCWludCB3aGljaGJhcCk7CisJdW5zaWduZWQgc2hvcnQgKmZsYXNoOworCXRkc1Jzc2lFbnRyeSAqcnNzaTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07CisJcGlkX3QgdGhyX3BpZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB0aHJfd2FpdDsKKwlzdHJ1Y3QgY29tcGxldGlvbiB0aHJfZXhpdGVkOworCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlpbnQgZmlkOworCX0geG1pdCwgeG1pdDExOworCXN0cnVjdCBuZXRfZGV2aWNlICp3aWZpZGV2OworI2lmZGVmIFdJUkVMRVNTX0VYVAorCXN0cnVjdCBpd19zdGF0aXN0aWNzCXdzdGF0czsJCS8vIHdpcmVsZXNzIHN0YXRzCisJdW5zaWduZWQgbG9uZwkJc2Nhbl90aW1lc3RhbXA7CS8qIFRpbWUgc3RhcnRlZCB0byBzY2FuICovCisJc3RydWN0IGl3X3NweV9kYXRhCXNweV9kYXRhOworCXN0cnVjdCBpd19wdWJsaWNfZGF0YQl3aXJlbGVzc19kYXRhOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLworI2lmZGVmIE1JQ1NVUFBPUlQKKwkvKiBNSUMgc3R1ZmYgKi8KKwlzdHJ1Y3QgY3J5cHRvX3RmbQkqdGZtOworCW1pY19tb2R1bGUJCW1vZFsyXTsKKwltaWNfc3RhdGlzdGljcwkJbWljc3RhdHM7CisjZW5kaWYKKwlIb3N0UnhEZXNjIHJ4Zmlkc1tNUElfTUFYX0ZJRFNdOyAvLyByeC90eC9jb25maWcgTVBJMzUwIGRlc2NyaXB0b3JzCisJSG9zdFR4RGVzYyB0eGZpZHNbTVBJX01BWF9GSURTXTsKKwlIb3N0UmlkRGVzYyBjb25maWdfZGVzYzsKKwl1bnNpZ25lZCBsb25nIHJpZGJ1czsgLy8gcGh5cyBhZGRyIG9mIGNvbmZpZ19kZXNjCisJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eHE7Ly8gdHggcXVldWUgdXNlZCBieSBtcGkzNTAgY29kZQorCXN0cnVjdCBwY2lfZGV2ICAgICAgICAgICpwY2k7CisJdW5zaWduZWQgY2hhcgkJX19pb21lbSAqcGNpbWVtOworCXVuc2lnbmVkIGNoYXIJCV9faW9tZW0gKnBjaWF1eDsKKwl1bnNpZ25lZCBjaGFyCQkqc2hhcmVkOworCWRtYV9hZGRyX3QJCXNoYXJlZF9kbWE7CisJaW50CQkJcG93ZXI7CisJU3NpZFJpZAkJCSpTU0lEOworCUFQTGlzdFJpZAkJKkFQTGlzdDsKKyNkZWZpbmUJUENJX1NIQVJFRF9MRU4JCTIqTVBJX01BWF9GSURTKlBLVFNJWkUrUklEU0laRQorCWNoYXIJCQlwcm9jX25hbWVbSUZOQU1TSVpdOworfTsKKworc3RhdGljIGlubGluZSBpbnQgYmFwX3JlYWQoc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiAqcHUxNkRzdCwgaW50IGJ5dGVsZW4sCisJCQkgICBpbnQgd2hpY2hiYXApIHsKKwlyZXR1cm4gYWktPmJhcF9yZWFkKGFpLCBwdTE2RHN0LCBieXRlbGVuLCB3aGljaGJhcCk7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfcHJvY19lbnRyeSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGFpcm9faW5mbyAqYXByaXYgKTsKK3N0YXRpYyBpbnQgdGFrZWRvd25fcHJvY19lbnRyeSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgYWlyb19pbmZvICphcHJpdiApOworCisjaWZkZWYgTUlDU1VQUE9SVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JQyBST1VUSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3N0YXRpYyBpbnQgUnhTZXFWYWxpZCAoc3RydWN0IGFpcm9faW5mbyAqYWksbWljY250eCAqY29udGV4dCxpbnQgbWNhc3QsdTMyIG1pY1NlcSk7CitzdGF0aWMgdm9pZCBNb3ZlV2luZG93KG1pY2NudHggKmNvbnRleHQsIHUzMiBtaWNTZXEpOwordm9pZCBlbW1oMzJfc2V0c2VlZChlbW1oMzJfY29udGV4dCAqY29udGV4dCwgdTggKnBrZXksIGludCBrZXlsZW4sIHN0cnVjdCBjcnlwdG9fdGZtICopOwordm9pZCBlbW1oMzJfaW5pdChlbW1oMzJfY29udGV4dCAqY29udGV4dCk7Cit2b2lkIGVtbWgzMl91cGRhdGUoZW1taDMyX2NvbnRleHQgKmNvbnRleHQsIHU4ICpwT2N0ZXRzLCBpbnQgbGVuKTsKK3ZvaWQgZW1taDMyX2ZpbmFsKGVtbWgzMl9jb250ZXh0ICpjb250ZXh0LCB1OCBkaWdlc3RbNF0pOworCisvKiBtaWNpbml0IC0gSW5pdGlhbGl6ZSBtaWMgc2VlZCAqLworCitzdGF0aWMgdm9pZCBtaWNpbml0KHN0cnVjdCBhaXJvX2luZm8gKmFpKQoreworCU1JQ1JpZCBtaWNfcmlkOworCisJY2xlYXJfYml0KEpPQl9NSUMsICZhaS0+ZmxhZ3MpOworCVBDNDUwMF9yZWFkcmlkKGFpLCBSSURfTUlDLCAmbWljX3JpZCwgc2l6ZW9mKG1pY19yaWQpLCAwKTsKKwl1cCgmYWktPnNlbSk7CisKKwlhaS0+bWljc3RhdHMuZW5hYmxlZCA9IChtaWNfcmlkLnN0YXRlICYgMHgwMEZGKSA/IDEgOiAwOworCisJaWYgKGFpLT5taWNzdGF0cy5lbmFibGVkKSB7CisJCS8qIEtleSBtdXN0IGJlIHZhbGlkIGFuZCBkaWZmZXJlbnQgKi8KKwkJaWYgKG1pY19yaWQubXVsdGljYXN0VmFsaWQgJiYgKCFhaS0+bW9kWzBdLm1DdHgudmFsaWQgfHwKKwkJICAgIChtZW1jbXAgKGFpLT5tb2RbMF0ubUN0eC5rZXksIG1pY19yaWQubXVsdGljYXN0LAorCQkJICAgICBzaXplb2YoYWktPm1vZFswXS5tQ3R4LmtleSkpICE9IDApKSkgeworCQkJLyogQWdlIGN1cnJlbnQgbWljIENvbnRleHQgKi8KKwkJCW1lbWNweSgmYWktPm1vZFsxXS5tQ3R4LCZhaS0+bW9kWzBdLm1DdHgsc2l6ZW9mKG1pY2NudHgpKTsKKwkJCS8qIEluaXRpYWxpemUgbmV3IGNvbnRleHQgKi8KKwkJCW1lbWNweSgmYWktPm1vZFswXS5tQ3R4LmtleSxtaWNfcmlkLm11bHRpY2FzdCxzaXplb2YobWljX3JpZC5tdWx0aWNhc3QpKTsKKwkJCWFpLT5tb2RbMF0ubUN0eC53aW5kb3cgID0gMzM7IC8vV2luZG93IGFsd2F5cyBwb2ludHMgdG8gdGhlIG1pZGRsZQorCQkJYWktPm1vZFswXS5tQ3R4LnJ4ICAgICAgPSAwOyAgLy9SeCBTZXF1ZW5jZSBudW1iZXJzCisJCQlhaS0+bW9kWzBdLm1DdHgudHggICAgICA9IDA7ICAvL1R4IHNlcXVlbmNlIG51bWJlcnMKKwkJCWFpLT5tb2RbMF0ubUN0eC52YWxpZCAgID0gMTsgIC8vS2V5IGlzIG5vdyB2YWxpZAorICAKKwkJCS8qIEdpdmUga2V5IHRvIG1pYyBzZWVkICovCisJCQllbW1oMzJfc2V0c2VlZCgmYWktPm1vZFswXS5tQ3R4LnNlZWQsbWljX3JpZC5tdWx0aWNhc3Qsc2l6ZW9mKG1pY19yaWQubXVsdGljYXN0KSwgYWktPnRmbSk7CisJCX0KKworCQkvKiBLZXkgbXVzdCBiZSB2YWxpZCBhbmQgZGlmZmVyZW50ICovCisJCWlmIChtaWNfcmlkLnVuaWNhc3RWYWxpZCAmJiAoIWFpLT5tb2RbMF0udUN0eC52YWxpZCB8fCAKKwkJICAgIChtZW1jbXAoYWktPm1vZFswXS51Q3R4LmtleSwgbWljX3JpZC51bmljYXN0LAorCQkJICAgIHNpemVvZihhaS0+bW9kWzBdLnVDdHgua2V5KSkgIT0gMCkpKSB7CisJCQkvKiBBZ2UgY3VycmVudCBtaWMgQ29udGV4dCAqLworCQkJbWVtY3B5KCZhaS0+bW9kWzFdLnVDdHgsJmFpLT5tb2RbMF0udUN0eCxzaXplb2YobWljY250eCkpOworCQkJLyogSW5pdGlhbGl6ZSBuZXcgY29udGV4dCAqLworCQkJbWVtY3B5KCZhaS0+bW9kWzBdLnVDdHgua2V5LG1pY19yaWQudW5pY2FzdCxzaXplb2YobWljX3JpZC51bmljYXN0KSk7CisJCisJCQlhaS0+bW9kWzBdLnVDdHgud2luZG93ICA9IDMzOyAvL1dpbmRvdyBhbHdheXMgcG9pbnRzIHRvIHRoZSBtaWRkbGUKKwkJCWFpLT5tb2RbMF0udUN0eC5yeCAgICAgID0gMDsgIC8vUnggU2VxdWVuY2UgbnVtYmVycworCQkJYWktPm1vZFswXS51Q3R4LnR4ICAgICAgPSAwOyAgLy9UeCBzZXF1ZW5jZSBudW1iZXJzCisJCQlhaS0+bW9kWzBdLnVDdHgudmFsaWQgICA9IDE7ICAvL0tleSBpcyBub3cgdmFsaWQKKwkKKwkJCS8vR2l2ZSBrZXkgdG8gbWljIHNlZWQKKwkJCWVtbWgzMl9zZXRzZWVkKCZhaS0+bW9kWzBdLnVDdHguc2VlZCwgbWljX3JpZC51bmljYXN0LCBzaXplb2YobWljX3JpZC51bmljYXN0KSwgYWktPnRmbSk7CisJCX0KKwl9IGVsc2UgeworICAgICAgLyogU28gbmV4dCB0aW1lIHdlIGhhdmUgYSB2YWxpZCBrZXkgYW5kIG1pYyBpcyBlbmFibGVkLCB3ZSB3aWxsIHVwZGF0ZQorICAgICAgICogdGhlIHNlcXVlbmNlIG51bWJlciBpZiB0aGUga2V5IGlzIHRoZSBzYW1lIGFzIGJlZm9yZS4KKyAgICAgICAqLworCQlhaS0+bW9kWzBdLnVDdHgudmFsaWQgPSAwOworCQlhaS0+bW9kWzBdLm1DdHgudmFsaWQgPSAwOworCX0KK30KKworLyogbWljc2V0dXAgLSBHZXQgcmVhZHkgZm9yIGJ1c2luZXNzICovCisKK3N0YXRpYyBpbnQgbWljc2V0dXAoc3RydWN0IGFpcm9faW5mbyAqYWkpIHsKKwlpbnQgaTsKKworCWlmIChhaS0+dGZtID09IE5VTEwpCisJICAgICAgICBhaS0+dGZtID0gY3J5cHRvX2FsbG9jX3RmbSgiYWVzIiwgMCk7CisKKyAgICAgICAgaWYgKGFpLT50Zm0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiYWlybzogZmFpbGVkIHRvIGxvYWQgdHJhbnNmb3JtIGZvciBBRVNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUjsKKyAgICAgICAgfQorCisJZm9yIChpPTA7IGkgPCBOVU1fTU9EVUxFUzsgaSsrKSB7CisJCW1lbXNldCgmYWktPm1vZFtpXS5tQ3R4LDAsc2l6ZW9mKG1pY2NudHgpKTsKKwkJbWVtc2V0KCZhaS0+bW9kW2ldLnVDdHgsMCxzaXplb2YobWljY250eCkpOworCX0KKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworY2hhciBtaWNzbmFwW109IHsweEFBLDB4QUEsMHgwMywweDAwLDB4NDAsMHg5NiwweDAwLDB4MDJ9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGVzY3JpcHRpb246IE1pYyBhIHBhY2tldAorICogICAgCisgKiAgICAgIElucHV0czogZXRoZXJIZWFkICogcG9pbnRlciB0byBhbiA4MDIuMyBmcmFtZQorICogICAgCisgKiAgICAgUmV0dXJuczogQk9PTEVBTiBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZmFsc2UuCisgKiAgICAgICAgICAgICBQYWNrZXRUeExlbiB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbWljJ2QgcGFja2V0cyBzaXplLgorICoKKyAqICAgIENhdmVhdHM6IEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWUgYnVmZmVyIHdpbGwgYWxyZWFkeQorICogICAgICAgICAgICAgYmUgYmlnIGVub3VnaCB0byBob2xkIHRoZSBsYXJnZXRzIG1pYyBtZXNzYWdlIHBvc3NpYmxlLgorICogICAgICAgICAgICAoTm8gbWVtb3J5IGFsbG9jYXRpb24gaXMgZG9uZSBoZXJlKS4KKyAqICAKKyAqICAgIEF1dGhvcjogc2JyYW5la3kgKDEwLzE1LzAxKQorICogICAgTWVyY2lsZXNzIGhhY2tzIGJ5IHJ3aWxjaGVyICgxLzE0LzAyKQorICovCisKK3N0YXRpYyBpbnQgZW5jYXBzdWxhdGUoc3RydWN0IGFpcm9faW5mbyAqYWkgLGV0aGVySGVhZCAqZnJhbWUsIE1JQ0J1ZmZlciAqbWljLCBpbnQgcGF5TGVuKQoreworCW1pY2NudHggICAqY29udGV4dDsKKworCS8vIERldGVybWluZSBjb3JyZWN0IGNvbnRleHQKKwkvLyBJZiBub3QgYWRob2MsIGFsd2F5cyB1c2UgdW5pY2FzdCBrZXkKKworCWlmICh0ZXN0X2JpdChGTEFHX0FESE9DLCAmYWktPmZsYWdzKSAmJiAoZnJhbWUtPmRhWzBdICYgMHgxKSkKKwkJY29udGV4dCA9ICZhaS0+bW9kWzBdLm1DdHg7CisJZWxzZQorCQljb250ZXh0ID0gJmFpLT5tb2RbMF0udUN0eDsKKyAgCisJaWYgKCFjb250ZXh0LT52YWxpZCkKKwkJcmV0dXJuIEVSUk9SOworCisJbWljLT50eXBlbGVuID0gaHRvbnMocGF5TGVuICsgMTYpOyAvL0xlbmd0aCBvZiBNaWMnZCBwYWNrZXQKKworCW1lbWNweSgmbWljLT51LnNuYXAsIG1pY3NuYXAsIHNpemVvZihtaWNzbmFwKSk7IC8vIEFkZCBTbmFwCisKKwkvLyBBZGQgVHggc2VxdWVuY2UKKwltaWMtPnNlcSA9IGh0b25sKGNvbnRleHQtPnR4KTsKKwljb250ZXh0LT50eCArPSAyOworCisJZW1taDMyX2luaXQoJmNvbnRleHQtPnNlZWQpOyAvLyBNaWMgdGhlIHBhY2tldAorCWVtbWgzMl91cGRhdGUoJmNvbnRleHQtPnNlZWQsZnJhbWUtPmRhLEVUSF9BTEVOICogMik7IC8vIERBLFNBCisJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCwodTgqKSZtaWMtPnR5cGVsZW4sMTApOyAvLyBUeXBlL0xlbmd0aCBhbmQgU25hcAorCWVtbWgzMl91cGRhdGUoJmNvbnRleHQtPnNlZWQsKHU4KikmbWljLT5zZXEsc2l6ZW9mKG1pYy0+c2VxKSk7IC8vU0VRCisJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCxmcmFtZS0+ZGEgKyBFVEhfQUxFTiAqIDIscGF5TGVuKTsgLy9wYXlsb2FkCisJZW1taDMyX2ZpbmFsKCZjb250ZXh0LT5zZWVkLCAodTgqKSZtaWMtPm1pYyk7CisKKwkvKiAgICBOZXcgVHlwZS9sZW5ndGggPz8/Pz8/Pz8/PyAqLworCW1pYy0+dHlwZWxlbiA9IDA7IC8vTGV0IE5JQyBrbm93IGl0IGNvdWxkIGJlIGFuIG92ZXJzaXplZCBwYWNrZXQKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKwordHlwZWRlZiBlbnVtIHsKKyAgICBOT05FLAorICAgIE5PTUlDLAorICAgIE5PTUlDUExVTU1FRCwKKyAgICBTRVFVRU5DRSwKKyAgICBJTkNPUlJFQ1RNSUMsCit9IG1pY19lcnJvcjsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICBEZXNjcmlwdGlvbjogRGVjYXBzdWxhdGVzIGEgTUlDJ2QgcGFja2V0IGFuZCByZXR1cm5zIHRoZSA4MDIuMyBwYWNrZXQKKyAqICAgICAgICAgICAgICAgKHJlbW92ZXMgdGhlIE1JQyBzdHVmZikgaWYgcGFja2V0IGlzIGEgdmFsaWQgcGFja2V0LgorICogICAgICAKKyAqICAgICAgIElucHV0czogZXRoZXJIZWFkICBwb2ludGVyIHRvIHRoZSA4MDIuMyBwYWNrZXQgICAgICAgICAgICAgCisgKiAgICAgCisgKiAgICAgIFJldHVybnM6IEJPT0xFQU4gLSBUUlVFIGlmIHBhY2tldCBzaG91bGQgYmUgZHJvcHBlZCBvdGhlcndpc2UgRkFMU0UKKyAqICAgICAKKyAqICAgICAgQXV0aG9yOiBzYnJhbmVreSAoMTAvMTUvMDEpCisgKiAgICBNZXJjaWxlc3MgaGFja3MgYnkgcndpbGNoZXIgKDEvMTQvMDIpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbnQgZGVjYXBzdWxhdGUoc3RydWN0IGFpcm9faW5mbyAqYWksIE1JQ0J1ZmZlciAqbWljLCBldGhlckhlYWQgKmV0aCwgdTE2IHBheUxlbikKK3sKKwlpbnQgICAgICBpOworCXUzMiAgICAgIG1pY1NFUTsKKwltaWNjbnR4ICAqY29udGV4dDsKKwl1OCAgICAgICBkaWdlc3RbNF07CisJbWljX2Vycm9yIG1pY0Vycm9yID0gTk9ORTsKKworCS8vIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgYSBNaWMnZCBwYWNrZXQKKworCWlmICghYWktPm1pY3N0YXRzLmVuYWJsZWQpIHsKKwkJLy9ObyBNaWMgc2V0IG9yIE1pYyBPRkYgYnV0IHdlIHJlY2VpdmVkIGEgTUlDJ2QgcGFja2V0LgorCQlpZiAobWVtY21wICgodTgqKWV0aCArIDE0LCBtaWNzbmFwLCBzaXplb2YobWljc25hcCkpID09IDApIHsKKwkJCWFpLT5taWNzdGF0cy5yeE1JQ1BsdW1tZWQrKzsKKwkJCXJldHVybiBFUlJPUjsKKwkJfQorCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisKKwlpZiAobnRvaHMobWljLT50eXBlbGVuKSA9PSAweDg4OEUpCisJCXJldHVybiBTVUNDRVNTOworCisJaWYgKG1lbWNtcCAobWljLT51LnNuYXAsIG1pY3NuYXAsIHNpemVvZihtaWNzbmFwKSkgIT0gMCkgeworCSAgICAvLyBNaWMgZW5hYmxlZCBidXQgcGFja2V0IGlzbid0IE1pYydkCisJCWFpLT5taWNzdGF0cy5yeE1JQ1BsdW1tZWQrKzsKKwkgICAgCXJldHVybiBFUlJPUjsKKwl9CisKKwltaWNTRVEgPSBudG9obChtaWMtPnNlcSk7ICAgICAgICAgICAgLy9zdG9yZSBTRVEgYXMgQ1BVIG9yZGVyCisKKwkvL0F0IHRoaXMgcG9pbnQgd2UgYSBoYXZlIGEgbWljJ2QgcGFja2V0IGFuZCBtaWMgaXMgZW5hYmxlZAorCS8vTm93IGRvIHRoZSBtaWMgZXJyb3IgY2hlY2tpbmcuCisKKwkvL1JlY2VpdmUgc2VxIG11c3QgYmUgb2RkCisJaWYgKCAobWljU0VRICYgMSkgPT0gMCApIHsKKwkJYWktPm1pY3N0YXRzLnJ4V3JvbmdTZXF1ZW5jZSsrOworCQlyZXR1cm4gRVJST1I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE5VTV9NT0RVTEVTOyBpKyspIHsKKwkJaW50IG1jYXN0ID0gZXRoLT5kYVswXSAmIDE7CisJCS8vRGV0ZXJtaW5lIHByb3BlciBjb250ZXh0IAorCQljb250ZXh0ID0gbWNhc3QgPyAmYWktPm1vZFtpXS5tQ3R4IDogJmFpLT5tb2RbaV0udUN0eDsKKwkKKwkJLy9NYWtlIHN1cmUgY29udGV4dCBpcyB2YWxpZAorCQlpZiAoIWNvbnRleHQtPnZhbGlkKSB7CisJCQlpZiAoaSA9PSAwKQorCQkJCW1pY0Vycm9yID0gTk9NSUNQTFVNTUVEOworCQkJY29udGludWU7ICAgICAgICAgICAgICAgIAorCQl9CisJICAgICAgIAkvL0RlTWljIGl0IAorCisJCWlmICghbWljLT50eXBlbGVuKQorCQkJbWljLT50eXBlbGVuID0gaHRvbnMocGF5TGVuICsgc2l6ZW9mKE1JQ0J1ZmZlcikgLSAyKTsKKwkKKwkJZW1taDMyX2luaXQoJmNvbnRleHQtPnNlZWQpOworCQllbW1oMzJfdXBkYXRlKCZjb250ZXh0LT5zZWVkLCBldGgtPmRhLCBFVEhfQUxFTioyKTsgCisJCWVtbWgzMl91cGRhdGUoJmNvbnRleHQtPnNlZWQsICh1OCAqKSZtaWMtPnR5cGVsZW4sIHNpemVvZihtaWMtPnR5cGVsZW4pK3NpemVvZihtaWMtPnUuc25hcCkpOyAKKwkJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCwgKHU4ICopJm1pYy0+c2VxLHNpemVvZihtaWMtPnNlcSkpOwkKKwkJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCwgZXRoLT5kYSArIEVUSF9BTEVOKjIscGF5TGVuKTsJCisJCS8vQ2FsY3VsYXRlIE1JQworCQllbW1oMzJfZmluYWwoJmNvbnRleHQtPnNlZWQsIGRpZ2VzdCk7CisJCisJCWlmIChtZW1jbXAoZGlnZXN0LCAmbWljLT5taWMsIDQpKSB7IC8vTWFrZSBzdXJlIHRoZSBtaWNzIG1hdGNoCisJCSAgLy9JbnZhbGlkIE1pYworCQkJaWYgKGkgPT0gMCkKKwkJCQltaWNFcnJvciA9IElOQ09SUkVDVE1JQzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLy9DaGVjayBTZXF1ZW5jZSBudW1iZXIgaWYgbWljcyBwYXNzCisJCWlmIChSeFNlcVZhbGlkKGFpLCBjb250ZXh0LCBtY2FzdCwgbWljU0VRKSA9PSBTVUNDRVNTKSB7CisJCQlhaS0+bWljc3RhdHMucnhTdWNjZXNzKys7CisJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJfQorCQlpZiAoaSA9PSAwKQorCQkJbWljRXJyb3IgPSBTRVFVRU5DRTsKKwl9CisKKwkvLyBVcGRhdGUgc3RhdGlzdGljcworCXN3aXRjaCAobWljRXJyb3IpIHsKKwkJY2FzZSBOT01JQ1BMVU1NRUQ6IGFpLT5taWNzdGF0cy5yeE1JQ1BsdW1tZWQrKzsgICBicmVhazsKKwkJY2FzZSBTRVFVRU5DRTogICAgYWktPm1pY3N0YXRzLnJ4V3JvbmdTZXF1ZW5jZSsrOyBicmVhazsKKwkJY2FzZSBJTkNPUlJFQ1RNSUM6IGFpLT5taWNzdGF0cy5yeEluY29ycmVjdE1JQysrOyBicmVhazsKKwkJY2FzZSBOT05FOiAgYnJlYWs7CisJCWNhc2UgTk9NSUM6IGJyZWFrOworCX0KKwlyZXR1cm4gRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXNjcmlwdGlvbjogIENoZWNrcyB0aGUgUnggU2VxIG51bWJlciB0byBtYWtlIHN1cmUgaXQgaXMgdmFsaWQKKyAqICAgICAgICAgICAgICAgYW5kIGhhc24ndCBhbHJlYWR5IGJlZW4gcmVjZWl2ZWQKKyAqICAgCisgKiAgICAgSW5wdXRzOiBtaWNjbnR4IC0gbWljIGNvbnRleHQgdG8gY2hlY2sgc2VxIGFnYWluc3QKKyAqICAgICAgICAgICAgIG1pY1NlcSAgLSB0aGUgTWljIHNlcSBudW1iZXIKKyAqICAgCisgKiAgICBSZXR1cm5zOiBUUlVFIGlmIHZhbGlkIG90aGVyd2lzZSBGQUxTRS4gCisgKgorICogICAgQXV0aG9yOiBzYnJhbmVreSAoMTAvMTUvMDEpCisgKiAgICBNZXJjaWxlc3MgaGFja3MgYnkgcndpbGNoZXIgKDEvMTQvMDIpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbnQgUnhTZXFWYWxpZCAoc3RydWN0IGFpcm9faW5mbyAqYWksbWljY250eCAqY29udGV4dCxpbnQgbWNhc3QsdTMyIG1pY1NlcSkKK3sKKwl1MzIgc2VxLGluZGV4OworCisJLy9BbGxvdyBmb3IgdGhlIGFwIGJlaW5nIHJlYm9vdGVkIC0gaWYgaXQgaXMgdGhlbiB1c2UgdGhlIG5leHQgCisJLy9zZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyIC0gbWlnaHQgZ28gYmFja3dhcmRzCisKKwlpZiAobWNhc3QpIHsKKwkJaWYgKHRlc3RfYml0KEZMQUdfVVBEQVRFX01VTFRJLCAmYWktPmZsYWdzKSkgeworCQkJY2xlYXJfYml0IChGTEFHX1VQREFURV9NVUxUSSwgJmFpLT5mbGFncyk7CisJCQljb250ZXh0LT53aW5kb3cgPSAobWljU2VxID4gMzMpID8gbWljU2VxIDogMzM7CisJCQljb250ZXh0LT5yeCAgICAgPSAwOyAgICAgICAgLy8gUmVzZXQgcngKKwkJfQorCX0gZWxzZSBpZiAodGVzdF9iaXQoRkxBR19VUERBVEVfVU5JLCAmYWktPmZsYWdzKSkgeworCQljbGVhcl9iaXQgKEZMQUdfVVBEQVRFX1VOSSwgJmFpLT5mbGFncyk7CisJCWNvbnRleHQtPndpbmRvdyA9IChtaWNTZXEgPiAzMykgPyBtaWNTZXEgOiAzMzsgLy8gTW92ZSB3aW5kb3cKKwkJY29udGV4dC0+cnggICAgID0gMDsgICAgICAgIC8vIFJlc2V0IHJ4CisJfQorCisJLy9NYWtlIHNlcXVlbmNlIG51bWJlciByZWxhdGl2ZSB0byBTVEFSVCBvZiB3aW5kb3cKKwlzZXEgPSBtaWNTZXEgLSAoY29udGV4dC0+d2luZG93IC0gMzMpOworCisJLy9Ub28gb2xkIG9mIGEgU0VRIG51bWJlciB0byBjaGVjay4KKwlpZiAoKHMzMilzZXEgPCAwKQorCQlyZXR1cm4gRVJST1I7CisgICAgCisJaWYgKCBzZXEgPiA2NCApIHsKKwkJLy9XaW5kb3cgaXMgaW5maW5pdGUgZm9yd2FyZAorCQlNb3ZlV2luZG93KGNvbnRleHQsbWljU2VxKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJLy8gV2UgYXJlIGluIHRoZSB3aW5kb3cuIE5vdyBjaGVjayB0aGUgY29udGV4dCByeCBiaXQgdG8gc2VlIGlmIGl0IHdhcyBhbHJlYWR5IHNlbnQKKwlzZXEgPj49IDE7ICAgICAgICAgLy9kaXZpZGUgYnkgMiBiZWNhdXNlIHdlIG9ubHkgaGF2ZSBvZGQgbnVtYmVycworCWluZGV4ID0gMSA8PCBzZXE7ICAvL0dldCBhbiBpbmRleCBudW1iZXIKKworCWlmICghKGNvbnRleHQtPnJ4ICYgaW5kZXgpKSB7CisJCS8vbWljU0VRIGZhbGxzIGluc2lkZSB0aGUgd2luZG93LgorCQkvL0FkZCBzZXFlbmNlIG51bWJlciB0byB0aGUgbGlzdCBvZiByZWNlaXZlZCBudW1iZXJzLgorCQljb250ZXh0LT5yeCB8PSBpbmRleDsKKworCQlNb3ZlV2luZG93KGNvbnRleHQsbWljU2VxKTsKKworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisJcmV0dXJuIEVSUk9SOworfQorCitzdGF0aWMgdm9pZCBNb3ZlV2luZG93KG1pY2NudHggKmNvbnRleHQsIHUzMiBtaWNTZXEpCit7CisJdTMyIHNoaWZ0OworCisJLy9Nb3ZlIHdpbmRvdyBpZiBzZXEgZ3JlYXRlciB0aGFuIHRoZSBtaWRkbGUgb2YgdGhlIHdpbmRvdworCWlmIChtaWNTZXEgPiBjb250ZXh0LT53aW5kb3cpIHsKKwkJc2hpZnQgPSAobWljU2VxIC0gY29udGV4dC0+d2luZG93KSA+PiAxOworICAgIAorCQkgICAgLy9TaGlmdCBvdXQgb2xkCisJCWlmIChzaGlmdCA8IDMyKQorCQkJY29udGV4dC0+cnggPj49IHNoaWZ0OworCQllbHNlCisJCQljb250ZXh0LT5yeCA9IDA7CisKKwkJY29udGV4dC0+d2luZG93ID0gbWljU2VxOyAgICAgIC8vTW92ZSB3aW5kb3cKKwl9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKj09PT09PT09PT0gRU1NSCBST1VUSU5FUyAgPT09PT09PT09PT09PT09PT09PT0qLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogbWljIGFjY3VtdWxhdGUgKi8KKyNkZWZpbmUgTUlDX0FDQ1VNKHZhbCkJXAorCWNvbnRleHQtPmFjY3VtICs9ICh1NjQpKHZhbCkgKiBjb250ZXh0LT5jb2VmZltjb2VmZl9wb3NpdGlvbisrXTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYWVzX2NvdW50ZXJbMTZdOworCisvKiBleHBhbmQgdGhlIGtleSB0byBmaWxsIHRoZSBNTUggY29lZmZpY2llbnQgYXJyYXkgKi8KK3ZvaWQgZW1taDMyX3NldHNlZWQoZW1taDMyX2NvbnRleHQgKmNvbnRleHQsIHU4ICpwa2V5LCBpbnQga2V5bGVuLCBzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworICAvKiB0YWtlIHRoZSBrZXlpbmcgbWF0ZXJpYWwsIGV4cGFuZCBpZiBuZWNlc3NhcnksIHRydW5jYXRlIGF0IDE2LWJ5dGVzICovCisgIC8qIHJ1biB0aHJvdWdoIEFFUyBjb3VudGVyIG1vZGUgdG8gZ2VuZXJhdGUgY29udGV4dC0+Y29lZmZbXSAqLworICAKKwlpbnQgaSxqOworCXUzMiBjb3VudGVyOworCXU4ICpjaXBoZXIsIHBsYWluWzE2XTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMV07CisKKwljcnlwdG9fY2lwaGVyX3NldGtleSh0Zm0sIHBrZXksIDE2KTsKKwljb3VudGVyID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihjb250ZXh0LT5jb2VmZikvc2l6ZW9mKGNvbnRleHQtPmNvZWZmWzBdKSk7ICkgeworCQlhZXNfY291bnRlclsxNV0gPSAodTgpKGNvdW50ZXIgPj4gMCk7CisJCWFlc19jb3VudGVyWzE0XSA9ICh1OCkoY291bnRlciA+PiA4KTsKKwkJYWVzX2NvdW50ZXJbMTNdID0gKHU4KShjb3VudGVyID4+IDE2KTsKKwkJYWVzX2NvdW50ZXJbMTJdID0gKHU4KShjb3VudGVyID4+IDI0KTsKKwkJY291bnRlcisrOworCQltZW1jcHkgKHBsYWluLCBhZXNfY291bnRlciwgMTYpOworCQlzZ1swXS5wYWdlID0gdmlydF90b19wYWdlKHBsYWluKTsKKwkJc2dbMF0ub2Zmc2V0ID0gKChsb25nKSBwbGFpbiAmIH5QQUdFX01BU0spOworCQlzZ1swXS5sZW5ndGggPSAxNjsKKwkJY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHRmbSwgc2csIHNnLCAxNik7CisJCWNpcGhlciA9IGttYXAoc2dbMF0ucGFnZSkgKyBzZ1swXS5vZmZzZXQ7CisJCWZvciAoaj0wOyAoajwxNikgJiYgKGk8IChzaXplb2YoY29udGV4dC0+Y29lZmYpL3NpemVvZihjb250ZXh0LT5jb2VmZlswXSkpKTsgKSB7CisJCQljb250ZXh0LT5jb2VmZltpKytdID0gbnRvaGwoKih1MzIgKikmY2lwaGVyW2pdKTsKKwkJCWogKz0gNDsKKwkJfQorCX0KK30KKworLyogcHJlcGFyZSBmb3IgY2FsY3VsYXRpb24gb2YgYSBuZXcgbWljICovCit2b2lkIGVtbWgzMl9pbml0KGVtbWgzMl9jb250ZXh0ICpjb250ZXh0KQoreworCS8qIHByZXBhcmUgZm9yIG5ldyBtaWMgY2FsY3VsYXRpb24gKi8KKwljb250ZXh0LT5hY2N1bSA9IDA7CisJY29udGV4dC0+cG9zaXRpb24gPSAwOworfQorCisvKiBhZGQgc29tZSBieXRlcyB0byB0aGUgbWljIGNhbGN1bGF0aW9uICovCit2b2lkIGVtbWgzMl91cGRhdGUoZW1taDMyX2NvbnRleHQgKmNvbnRleHQsIHU4ICpwT2N0ZXRzLCBpbnQgbGVuKQoreworCWludAljb2VmZl9wb3NpdGlvbiwgYnl0ZV9wb3NpdGlvbjsKKyAgCisJaWYgKGxlbiA9PSAwKSByZXR1cm47CisgIAorCWNvZWZmX3Bvc2l0aW9uID0gY29udGV4dC0+cG9zaXRpb24gPj4gMjsKKyAgCisJLyogZGVhbCB3aXRoIHBhcnRpYWwgMzItYml0IHdvcmQgbGVmdCBvdmVyIGZyb20gbGFzdCB1cGRhdGUgKi8KKwlieXRlX3Bvc2l0aW9uID0gY29udGV4dC0+cG9zaXRpb24gJiAzOworCWlmIChieXRlX3Bvc2l0aW9uKSB7CisJCS8qIGhhdmUgYSBwYXJ0aWFsIHdvcmQgaW4gcGFydCB0byBkZWFsIHdpdGggKi8KKwkJZG8geworCQkJaWYgKGxlbiA9PSAwKSByZXR1cm47CisJCQljb250ZXh0LT5wYXJ0LmQ4W2J5dGVfcG9zaXRpb24rK10gPSAqcE9jdGV0cysrOworCQkJY29udGV4dC0+cG9zaXRpb24rKzsKKwkJCWxlbi0tOworCQl9IHdoaWxlIChieXRlX3Bvc2l0aW9uIDwgNCk7CisJCU1JQ19BQ0NVTShodG9ubChjb250ZXh0LT5wYXJ0LmQzMikpOworCX0KKworCS8qIGRlYWwgd2l0aCBmdWxsIDMyLWJpdCB3b3JkcyAqLworCXdoaWxlIChsZW4gPj0gNCkgeworCQlNSUNfQUNDVU0oaHRvbmwoKih1MzIgKilwT2N0ZXRzKSk7CisJCWNvbnRleHQtPnBvc2l0aW9uICs9IDQ7CisJCXBPY3RldHMgKz0gNDsKKwkJbGVuIC09IDQ7CisJfQorCisJLyogZGVhbCB3aXRoIHBhcnRpYWwgMzItYml0IHdvcmQgdGhhdCB3aWxsIGJlIGxlZnQgb3ZlciBmcm9tIHRoaXMgdXBkYXRlICovCisJYnl0ZV9wb3NpdGlvbiA9IDA7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJY29udGV4dC0+cGFydC5kOFtieXRlX3Bvc2l0aW9uKytdID0gKnBPY3RldHMrKzsKKwkJY29udGV4dC0+cG9zaXRpb24rKzsKKwkJbGVuLS07CisJfQorfQorCisvKiBtYXNrIHVzZWQgdG8gemVybyBlbXB0eSBieXRlcyBmb3IgZmluYWwgcGFydGlhbCB3b3JkICovCitzdGF0aWMgdTMyIG1hc2szMls0XSA9IHsgMHgwMDAwMDAwMEwsIDB4RkYwMDAwMDBMLCAweEZGRkYwMDAwTCwgMHhGRkZGRkYwMEwgfTsKKworLyogY2FsY3VsYXRlIHRoZSBtaWMgKi8KK3ZvaWQgZW1taDMyX2ZpbmFsKGVtbWgzMl9jb250ZXh0ICpjb250ZXh0LCB1OCBkaWdlc3RbNF0pCit7CisJaW50CWNvZWZmX3Bvc2l0aW9uLCBieXRlX3Bvc2l0aW9uOworCXUzMgl2YWw7CisgIAorCXU2NCBzdW0sIHV0bXA7CisJczY0IHN0bXA7CisKKwljb2VmZl9wb3NpdGlvbiA9IGNvbnRleHQtPnBvc2l0aW9uID4+IDI7CisgIAorCS8qIGRlYWwgd2l0aCBwYXJ0aWFsIDMyLWJpdCB3b3JkIGxlZnQgb3ZlciBmcm9tIGxhc3QgdXBkYXRlICovCisJYnl0ZV9wb3NpdGlvbiA9IGNvbnRleHQtPnBvc2l0aW9uICYgMzsKKwlpZiAoYnl0ZV9wb3NpdGlvbikgeworCQkvKiBoYXZlIGEgcGFydGlhbCB3b3JkIGluIHBhcnQgdG8gZGVhbCB3aXRoICovCisJCXZhbCA9IGh0b25sKGNvbnRleHQtPnBhcnQuZDMyKTsKKwkJTUlDX0FDQ1VNKHZhbCAmIG1hc2szMltieXRlX3Bvc2l0aW9uXSk7CS8qIHplcm8gZW1wdHkgYnl0ZXMgKi8KKwl9CisKKwkvKiByZWR1Y2UgdGhlIGFjY3VtdWxhdGVkIHU2NCB0byBhIDMyLWJpdCBNSUMgKi8KKwlzdW0gPSBjb250ZXh0LT5hY2N1bTsKKwlzdG1wID0gKHN1bSAgJiAweGZmZmZmZmZmTEwpIC0gKChzdW0gPj4gMzIpICAqIDE1KTsKKwl1dG1wID0gKHN0bXAgJiAweGZmZmZmZmZmTEwpIC0gKChzdG1wID4+IDMyKSAqIDE1KTsKKwlzdW0gPSB1dG1wICYgMHhmZmZmZmZmZkxMOworCWlmICh1dG1wID4gMHgxMDAwMDAwMGZMTCkKKwkJc3VtIC09IDE1OworCisJdmFsID0gKHUzMilzdW07CisJZGlnZXN0WzBdID0gKHZhbD4+MjQpICYgMHhGRjsKKwlkaWdlc3RbMV0gPSAodmFsPj4xNikgJiAweEZGOworCWRpZ2VzdFsyXSA9ICh2YWw+PjgpICYgMHhGRjsKKwlkaWdlc3RbM10gPSB2YWwgJiAweEZGOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcmVhZEJTU0xpc3RSaWQoc3RydWN0IGFpcm9faW5mbyAqYWksIGludCBmaXJzdCwKKwkJICAgICAgQlNTTGlzdFJpZCAqbGlzdCkgeworCWludCByYzsKKwkJCUNtZCBjbWQ7CisJCQlSZXNwIHJzcDsKKworCWlmIChmaXJzdCA9PSAxKSB7CisJCQlpZiAoYWktPmZsYWdzICYgRkxBR19SQURJT19NQVNLKSByZXR1cm4gLUVORVRET1dOOworCQkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJCWNtZC5jbWQ9Q01EX0xJU1RCU1M7CisJCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwkJCXVwKCZhaS0+c2VtKTsKKwkJCS8qIExldCB0aGUgY29tbWFuZCB0YWtlIGVmZmVjdCAqLworCQkJYWktPnRhc2sgPSBjdXJyZW50OworCQkJc3NsZWVwKDMpOworCQkJYWktPnRhc2sgPSBOVUxMOworCQl9CisJcmMgPSBQQzQ1MDBfcmVhZHJpZChhaSwgZmlyc3QgPyBSSURfQlNTTElTVEZJUlNUIDogUklEX0JTU0xJU1RORVhULAorCQkJICAgIGxpc3QsIHNpemVvZigqbGlzdCksIDEpOworCisJbGlzdC0+bGVuID0gbGUxNl90b19jcHUobGlzdC0+bGVuKTsKKwlsaXN0LT5pbmRleCA9IGxlMTZfdG9fY3B1KGxpc3QtPmluZGV4KTsKKwlsaXN0LT5yYWRpb1R5cGUgPSBsZTE2X3RvX2NwdShsaXN0LT5yYWRpb1R5cGUpOworCWxpc3QtPmNhcCA9IGxlMTZfdG9fY3B1KGxpc3QtPmNhcCk7CisJbGlzdC0+YmVhY29uSW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShsaXN0LT5iZWFjb25JbnRlcnZhbCk7CisJbGlzdC0+ZmguZHdlbGwgPSBsZTE2X3RvX2NwdShsaXN0LT5maC5kd2VsbCk7CisJbGlzdC0+ZHNDaGFubmVsID0gbGUxNl90b19jcHUobGlzdC0+ZHNDaGFubmVsKTsKKwlsaXN0LT5hdGltV2luZG93ID0gbGUxNl90b19jcHUobGlzdC0+YXRpbVdpbmRvdyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJlYWRXZXBLZXlSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgV2VwS2V5UmlkICp3a3IsIGludCB0ZW1wLCBpbnQgbG9jaykgeworCWludCByYyA9IFBDNDUwMF9yZWFkcmlkKGFpLCB0ZW1wID8gUklEX1dFUF9URU1QIDogUklEX1dFUF9QRVJNLAorCQkJCXdrciwgc2l6ZW9mKCp3a3IpLCBsb2NrKTsKKworCXdrci0+bGVuID0gbGUxNl90b19jcHUod2tyLT5sZW4pOworCXdrci0+a2luZGV4ID0gbGUxNl90b19jcHUod2tyLT5raW5kZXgpOworCXdrci0+a2xlbiA9IGxlMTZfdG9fY3B1KHdrci0+a2xlbik7CisJcmV0dXJuIHJjOworfQorLyogSW4gdGhlIHdyaXRlWFhYUmlkIHJvdXRpbmVzIHdlIGNvcHkgdGhlIHJpZHMgc28gdGhhdCB3ZSBkb24ndCBzY3Jld3VwCisgKiB0aGUgb3JpZ2luYWxzIHdoZW4gd2UgZW5kaWFuIHRoZW0uLi4gKi8KK3N0YXRpYyBpbnQgd3JpdGVXZXBLZXlSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgV2VwS2V5UmlkICpwd2tyLCBpbnQgcGVybSwgaW50IGxvY2spIHsKKwlpbnQgcmM7CisJV2VwS2V5UmlkIHdrciA9ICpwd2tyOworCisJd2tyLmxlbiA9IGNwdV90b19sZTE2KHdrci5sZW4pOworCXdrci5raW5kZXggPSBjcHVfdG9fbGUxNih3a3Iua2luZGV4KTsKKwl3a3Iua2xlbiA9IGNwdV90b19sZTE2KHdrci5rbGVuKTsKKwlyYyA9IFBDNDUwMF93cml0ZXJpZChhaSwgUklEX1dFUF9URU1QLCAmd2tyLCBzaXplb2Yod2tyKSwgbG9jayk7CisJaWYgKHJjIT1TVUNDRVNTKSBwcmludGsoS0VSTl9FUlIgImFpcm86ICBXRVBfVEVNUCBzZXQgJXhcbiIsIHJjKTsKKwlpZiAocGVybSkgeworCQlyYyA9IFBDNDUwMF93cml0ZXJpZChhaSwgUklEX1dFUF9QRVJNLCAmd2tyLCBzaXplb2Yod2tyKSwgbG9jayk7CisJCWlmIChyYyE9U1VDQ0VTUykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiAgV0VQX1BFUk0gc2V0ICV4XG4iLCByYyk7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJlYWRTc2lkUmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIFNzaWRSaWQgKnNzaWRyKSB7CisJaW50IGk7CisJaW50IHJjID0gUEM0NTAwX3JlYWRyaWQoYWksIFJJRF9TU0lELCBzc2lkciwgc2l6ZW9mKCpzc2lkciksIDEpOworCisJc3NpZHItPmxlbiA9IGxlMTZfdG9fY3B1KHNzaWRyLT5sZW4pOworCWZvcihpID0gMDsgaSA8IDM7IGkrKykgeworCQlzc2lkci0+c3NpZHNbaV0ubGVuID0gbGUxNl90b19jcHUoc3NpZHItPnNzaWRzW2ldLmxlbik7CisJfQorCXJldHVybiByYzsKK30KK3N0YXRpYyBpbnQgd3JpdGVTc2lkUmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIFNzaWRSaWQgKnBzc2lkciwgaW50IGxvY2spIHsKKwlpbnQgcmM7CisJaW50IGk7CisJU3NpZFJpZCBzc2lkciA9ICpwc3NpZHI7CisKKwlzc2lkci5sZW4gPSBjcHVfdG9fbGUxNihzc2lkci5sZW4pOworCWZvcihpID0gMDsgaSA8IDM7IGkrKykgeworCQlzc2lkci5zc2lkc1tpXS5sZW4gPSBjcHVfdG9fbGUxNihzc2lkci5zc2lkc1tpXS5sZW4pOworCX0KKwlyYyA9IFBDNDUwMF93cml0ZXJpZChhaSwgUklEX1NTSUQsICZzc2lkciwgc2l6ZW9mKHNzaWRyKSwgbG9jayk7CisJcmV0dXJuIHJjOworfQorc3RhdGljIGludCByZWFkQ29uZmlnUmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIGludCBsb2NrKSB7CisJaW50IHJjOworCXUxNiAqczsKKwlDb25maWdSaWQgY2ZnOworCisJaWYgKGFpLT5jb25maWcubGVuKQorCQlyZXR1cm4gU1VDQ0VTUzsKKworCXJjID0gUEM0NTAwX3JlYWRyaWQoYWksIFJJRF9BQ1RVQUxDT05GSUcsICZjZmcsIHNpemVvZihjZmcpLCBsb2NrKTsKKwlpZiAocmMgIT0gU1VDQ0VTUykKKwkJcmV0dXJuIHJjOworCisJZm9yKHMgPSAmY2ZnLmxlbjsgcyA8PSAmY2ZnLnJ0c1RocmVzOyBzKyspICpzID0gbGUxNl90b19jcHUoKnMpOworCisJZm9yKHMgPSAmY2ZnLnNob3J0UmV0cnlMaW1pdDsgcyA8PSAmY2ZnLnJhZGlvVHlwZTsgcysrKQorCQkqcyA9IGxlMTZfdG9fY3B1KCpzKTsKKworCWZvcihzID0gJmNmZy50eFBvd2VyOyBzIDw9ICZjZmcucmFkaW9TcGVjaWZpYzsgcysrKQorCQkqcyA9IGxlMTZfdG9fY3B1KCpzKTsKKworCWZvcihzID0gJmNmZy5hcmxUaHJlc2hvbGQ7IHMgPD0gJmNmZy5fcmVzZXJ2ZWQ0WzBdOyBzKyspCisJCSpzID0gY3B1X3RvX2xlMTYoKnMpOworCisJZm9yKHMgPSAmY2ZnLmF1dG9XYWtlOyBzIDw9ICZjZmcuYXV0b1dha2U7IHMrKykKKwkJKnMgPSBjcHVfdG9fbGUxNigqcyk7CisKKwlhaS0+Y29uZmlnID0gY2ZnOworCXJldHVybiBTVUNDRVNTOworfQorc3RhdGljIGlubGluZSB2b2lkIGNoZWNrVGhyb3R0bGUoc3RydWN0IGFpcm9faW5mbyAqYWkpIHsKKwlpbnQgaTsKKy8qIE9sZCBoYXJkd2FyZSBoYWQgYSBsaW1pdCBvbiBlbmNyeXB0aW9uIHNwZWVkICovCisJaWYgKGFpLT5jb25maWcuYXV0aFR5cGUgIT0gQVVUSF9PUEVOICYmIG1heGVuY3J5cHQpIHsKKwkJZm9yKGk9MDsgaTw4OyBpKyspIHsKKwkJCWlmIChhaS0+Y29uZmlnLnJhdGVzW2ldID4gbWF4ZW5jcnlwdCkgeworCQkJCWFpLT5jb25maWcucmF0ZXNbaV0gPSAwOworCQkJfQorCQl9CisJfQorfQorc3RhdGljIGludCB3cml0ZUNvbmZpZ1JpZChzdHJ1Y3QgYWlyb19pbmZvKmFpLCBpbnQgbG9jaykgeworCXUxNiAqczsKKwlDb25maWdSaWQgY2ZncjsKKworCWlmICghdGVzdF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKSkKKwkJcmV0dXJuIFNVQ0NFU1M7CisKKwljbGVhcl9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwljbGVhcl9iaXQgKEZMQUdfUkVTRVQsICZhaS0+ZmxhZ3MpOworCWNoZWNrVGhyb3R0bGUoYWkpOworCWNmZ3IgPSBhaS0+Y29uZmlnOworCisJaWYgKChjZmdyLm9wbW9kZSAmIDB4RkYpID09IE1PREVfU1RBX0lCU1MpCisJCXNldF9iaXQoRkxBR19BREhPQywgJmFpLT5mbGFncyk7CisJZWxzZQorCQljbGVhcl9iaXQoRkxBR19BREhPQywgJmFpLT5mbGFncyk7CisKKwlmb3IocyA9ICZjZmdyLmxlbjsgcyA8PSAmY2Znci5ydHNUaHJlczsgcysrKSAqcyA9IGNwdV90b19sZTE2KCpzKTsKKworCWZvcihzID0gJmNmZ3Iuc2hvcnRSZXRyeUxpbWl0OyBzIDw9ICZjZmdyLnJhZGlvVHlwZTsgcysrKQorCQkqcyA9IGNwdV90b19sZTE2KCpzKTsKKworCWZvcihzID0gJmNmZ3IudHhQb3dlcjsgcyA8PSAmY2Znci5yYWRpb1NwZWNpZmljOyBzKyspCisJCSpzID0gY3B1X3RvX2xlMTYoKnMpOworCisJZm9yKHMgPSAmY2Znci5hcmxUaHJlc2hvbGQ7IHMgPD0gJmNmZ3IuX3Jlc2VydmVkNFswXTsgcysrKQorCQkqcyA9IGNwdV90b19sZTE2KCpzKTsKKworCWZvcihzID0gJmNmZ3IuYXV0b1dha2U7IHMgPD0gJmNmZ3IuYXV0b1dha2U7IHMrKykKKwkJKnMgPSBjcHVfdG9fbGUxNigqcyk7CisKKwlyZXR1cm4gUEM0NTAwX3dyaXRlcmlkKCBhaSwgUklEX0NPTkZJRywgJmNmZ3IsIHNpemVvZihjZmdyKSwgbG9jayk7Cit9CitzdGF0aWMgaW50IHJlYWRTdGF0dXNSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgU3RhdHVzUmlkICpzdGF0ciwgaW50IGxvY2spIHsKKwlpbnQgcmMgPSBQQzQ1MDBfcmVhZHJpZChhaSwgUklEX1NUQVRVUywgc3RhdHIsIHNpemVvZigqc3RhdHIpLCBsb2NrKTsKKwl1MTYgKnM7CisKKwlzdGF0ci0+bGVuID0gbGUxNl90b19jcHUoc3RhdHItPmxlbik7CisJZm9yKHMgPSAmc3RhdHItPm1vZGU7IHMgPD0gJnN0YXRyLT5TU0lEbGVuOyBzKyspICpzID0gbGUxNl90b19jcHUoKnMpOworCisJZm9yKHMgPSAmc3RhdHItPmJlYWNvblBlcmlvZDsgcyA8PSAmc3RhdHItPnNob3J0UHJlYW1ibGU7IHMrKykKKwkJKnMgPSBsZTE2X3RvX2NwdSgqcyk7CisJc3RhdHItPmxvYWQgPSBsZTE2X3RvX2NwdShzdGF0ci0+bG9hZCk7CisJc3RhdHItPmFzc29jU3RhdHVzID0gbGUxNl90b19jcHUoc3RhdHItPmFzc29jU3RhdHVzKTsKKwlyZXR1cm4gcmM7Cit9CitzdGF0aWMgaW50IHJlYWRBUExpc3RSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgQVBMaXN0UmlkICphcGxyKSB7CisJaW50IHJjID0gIFBDNDUwMF9yZWFkcmlkKGFpLCBSSURfQVBMSVNULCBhcGxyLCBzaXplb2YoKmFwbHIpLCAxKTsKKwlhcGxyLT5sZW4gPSBsZTE2X3RvX2NwdShhcGxyLT5sZW4pOworCXJldHVybiByYzsKK30KK3N0YXRpYyBpbnQgd3JpdGVBUExpc3RSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgQVBMaXN0UmlkICphcGxyLCBpbnQgbG9jaykgeworCWludCByYzsKKwlhcGxyLT5sZW4gPSBjcHVfdG9fbGUxNihhcGxyLT5sZW4pOworCXJjID0gUEM0NTAwX3dyaXRlcmlkKGFpLCBSSURfQVBMSVNULCBhcGxyLCBzaXplb2YoKmFwbHIpLCBsb2NrKTsKKwlyZXR1cm4gcmM7Cit9CitzdGF0aWMgaW50IHJlYWRDYXBhYmlsaXR5UmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIENhcGFiaWxpdHlSaWQgKmNhcHIsIGludCBsb2NrKSB7CisJaW50IHJjID0gUEM0NTAwX3JlYWRyaWQoYWksIFJJRF9DQVBBQklMSVRJRVMsIGNhcHIsIHNpemVvZigqY2FwciksIGxvY2spOworCXUxNiAqczsKKworCWNhcHItPmxlbiA9IGxlMTZfdG9fY3B1KGNhcHItPmxlbik7CisJY2Fwci0+cHJvZE51bSA9IGxlMTZfdG9fY3B1KGNhcHItPnByb2ROdW0pOworCWNhcHItPnJhZGlvVHlwZSA9IGxlMTZfdG9fY3B1KGNhcHItPnJhZGlvVHlwZSk7CisJY2Fwci0+Y291bnRyeSA9IGxlMTZfdG9fY3B1KGNhcHItPmNvdW50cnkpOworCWZvcihzID0gJmNhcHItPnR4UG93ZXJMZXZlbHNbMF07IHMgPD0gJmNhcHItPnJlcXVpcmVkSGFyZDsgcysrKQorCQkqcyA9IGxlMTZfdG9fY3B1KCpzKTsKKwlyZXR1cm4gcmM7Cit9CitzdGF0aWMgaW50IHJlYWRTdGF0c1JpZChzdHJ1Y3QgYWlyb19pbmZvKmFpLCBTdGF0c1JpZCAqc3IsIGludCByaWQsIGludCBsb2NrKSB7CisJaW50IHJjID0gUEM0NTAwX3JlYWRyaWQoYWksIHJpZCwgc3IsIHNpemVvZigqc3IpLCBsb2NrKTsKKwl1MzIgKmk7CisKKwlzci0+bGVuID0gbGUxNl90b19jcHUoc3ItPmxlbik7CisJZm9yKGkgPSAmc3ItPnZhbHNbMF07IGkgPD0gJnNyLT52YWxzWzk5XTsgaSsrKSAqaSA9IGxlMzJfdG9fY3B1KCppKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYWlyb19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgYWlyb19pbmZvICppbmZvID0gZGV2LT5wcml2OworCVJlc3AgcnNwOworCisJaWYgKHRlc3RfYml0KEZMQUdfRkxBU0hJTkcsICZpbmZvLT5mbGFncykpCisJCXJldHVybiAtRUlPOworCisJLyogTWFrZSBzdXJlIHRoZSBjYXJkIGlzIGNvbmZpZ3VyZWQuCisJICogV2lyZWxlc3MgRXh0ZW5zaW9ucyBtYXkgcG9zdHBvbmUgY29uZmlnIGNoYW5nZXMgdW50aWwgdGhlIGNhcmQKKwkgKiBpcyBvcGVuICh0byBwaXBlbGluZSBjaGFuZ2VzIGFuZCBzcGVlZC11cCBjYXJkIHNldHVwKS4gSWYKKwkgKiB0aG9zZSBjaGFuZ2VzIGFyZSBub3QgeWV0IGNvbW1pdGVkLCBkbyBpdCBub3cgLSBKZWFuIElJICovCisJaWYgKHRlc3RfYml0IChGTEFHX0NPTU1JVCwgJmluZm8tPmZsYWdzKSkgeworCQlkaXNhYmxlX01BQyhpbmZvLCAxKTsKKwkJd3JpdGVDb25maWdSaWQoaW5mbywgMSk7CisJfQorCisJaWYgKGluZm8tPndpZmlkZXYgIT0gZGV2KSB7CisJCS8qIFBvd2VyIG9uIHRoZSBNQUMgY29udHJvbGxlciAod2hpY2ggbWF5IGhhdmUgYmVlbiBkaXNhYmxlZCkgKi8KKwkJY2xlYXJfYml0KEZMQUdfUkFESU9fRE9XTiwgJmluZm8tPmZsYWdzKTsKKwkJZW5hYmxlX2ludGVycnVwdHMoaW5mbyk7CisJfQorCWVuYWJsZV9NQUMoaW5mbywgJnJzcCwgMSk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1waV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlpbnQgbnBhY2tzLCBwZW5kaW5nOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86ICVzOiBza2I9PU5VTExcbiIsX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIDA7CisJfQorCW5wYWNrcyA9IHNrYl9xdWV1ZV9sZW4gKCZhaS0+dHhxKTsKKworCWlmIChucGFja3MgPj0gTUFYVFhRIC0gMSkgeworCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCQlpZiAobnBhY2tzID4gTUFYVFhRKSB7CisJCQlhaS0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCXJldHVybiAxOworCQl9CisJCXNrYl9xdWV1ZV90YWlsICgmYWktPnR4cSwgc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFpLT5hdXhfbG9jaywgZmxhZ3MpOworCXNrYl9xdWV1ZV90YWlsICgmYWktPnR4cSwgc2tiKTsKKwlwZW5kaW5nID0gdGVzdF9iaXQoRkxBR19QRU5ESU5HX1hNSVQsICZhaS0+ZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFpLT5hdXhfbG9jayxmbGFncyk7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKworCWlmIChwZW5kaW5nID09IDApIHsKKwkJc2V0X2JpdChGTEFHX1BFTkRJTkdfWE1JVCwgJmFpLT5mbGFncyk7CisJCW1waV9zZW5kX3BhY2tldCAoZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBAbXBpX3NlbmRfcGFja2V0CisgKgorICogQXR0ZW1wdCB0byB0cmFuc21pdCBhIHBhY2tldC4gQ2FuIGJlIGNhbGxlZCBmcm9tIGludGVycnVwdAorICogb3IgdHJhbnNtaXQgLiByZXR1cm4gbnVtYmVyIG9mIHBhY2tldHMgd2UgdHJpZWQgdG8gc2VuZAorICovCisKK3N0YXRpYyBpbnQgbXBpX3NlbmRfcGFja2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCXMxNiBsZW4sICpwYXlsb2FkTGVuOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCXU4ICpzZW5kYnVmOworCisJLyogZ2V0IGEgcGFja2V0IHRvIHNlbmQgKi8KKworCWlmICgoc2tiID0gc2tiX2RlcXVldWUoJmFpLT50eHEpKSA9PSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIKKwkJCSJhaXJvOiAlczogRGVxdWV1ZSdkIHplcm8gaW4gc2VuZF9wYWNrZXQoKVxuIiwKKwkJCV9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAwOworCX0KKworCS8qIGNoZWNrIG1pbiBsZW5ndGgqLworCWxlbiA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCWJ1ZmZlciA9IHNrYi0+ZGF0YTsKKworCWFpLT50eGZpZHNbMF0udHhfZGVzYy5vZmZzZXQgPSAwOworCWFpLT50eGZpZHNbMF0udHhfZGVzYy52YWxpZCA9IDE7CisJYWktPnR4Zmlkc1swXS50eF9kZXNjLmVvYyA9IDE7CisJYWktPnR4Zmlkc1swXS50eF9kZXNjLmxlbiA9bGVuK3NpemVvZihXaWZpSGRyKTsKKworLyoKKyAqIE1hZ2ljLCB0aGUgY2FyZHMgZmlybXdhcmUgbmVlZHMgYSBsZW5ndGggY291bnQgKDIgYnl0ZXMpIGluIHRoZSBob3N0IGJ1ZmZlcgorICogcmlnaHQgYWZ0ZXIgIFRYRklEX0hEUi5UaGUgVFhGSURfSERSIGNvbnRhaW5zIHRoZSBzdGF0dXMgc2hvcnQgc28gcGF5bG9hZGxlbgorICogaXMgaW1tZWRpYXRseSBhZnRlciBpdC4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB8VFhGSURIRFIrU1RBVFVTfFBBWUxPQURMRU58ODAyLjNIRFJ8UEFDS0VUREFUQXwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKwltZW1jcHkoKGNoYXIgKilhaS0+dHhmaWRzWzBdLnZpcnR1YWxfaG9zdF9hZGRyLAorCQkoY2hhciAqKSZ3aWZpY3RsaGRyODAyMywgc2l6ZW9mKHdpZmljdGxoZHI4MDIzKSk7CisKKwlwYXlsb2FkTGVuID0gKHMxNiAqKShhaS0+dHhmaWRzWzBdLnZpcnR1YWxfaG9zdF9hZGRyICsKKwkJc2l6ZW9mKHdpZmljdGxoZHI4MDIzKSk7CisJc2VuZGJ1ZiA9IGFpLT50eGZpZHNbMF0udmlydHVhbF9ob3N0X2FkZHIgKworCQlzaXplb2Yod2lmaWN0bGhkcjgwMjMpICsgMiA7CisKKwkvKgorCSAqIEZpcm13YXJlIGF1dG9tYXRpY2x5IHB1dHMgODAyIGhlYWRlciBvbiBzbworCSAqIHdlIGRvbid0IG5lZWQgdG8gYWNjb3VudCBmb3IgaXQgaW4gdGhlIGxlbmd0aAorCSAqLworI2lmZGVmIE1JQ1NVUFBPUlQKKwlpZiAodGVzdF9iaXQoRkxBR19NSUNfQ0FQQUJMRSwgJmFpLT5mbGFncykgJiYgYWktPm1pY3N0YXRzLmVuYWJsZWQgJiYKKwkJKG50b2hzKCgodTE2ICopYnVmZmVyKVs2XSkgIT0gMHg4ODhFKSkgeworCQlNSUNCdWZmZXIgcE1pYzsKKworCQlpZiAoZW5jYXBzdWxhdGUoYWksIChldGhlckhlYWQgKilidWZmZXIsICZwTWljLCBsZW4gLSBzaXplb2YoZXRoZXJIZWFkKSkgIT0gU1VDQ0VTUykKKwkJCXJldHVybiBFUlJPUjsKKworCQkqcGF5bG9hZExlbiA9IGNwdV90b19sZTE2KGxlbi1zaXplb2YoZXRoZXJIZWFkKStzaXplb2YocE1pYykpOworCQlhaS0+dHhmaWRzWzBdLnR4X2Rlc2MubGVuICs9IHNpemVvZihwTWljKTsKKwkJLyogY29weSBkYXRhIGludG8gYWlybyBkbWEgYnVmZmVyICovCisJCW1lbWNweSAoc2VuZGJ1ZiwgYnVmZmVyLCBzaXplb2YoZXRoZXJIZWFkKSk7CisJCWJ1ZmZlciArPSBzaXplb2YoZXRoZXJIZWFkKTsKKwkJc2VuZGJ1ZiArPSBzaXplb2YoZXRoZXJIZWFkKTsKKwkJbWVtY3B5IChzZW5kYnVmLCAmcE1pYywgc2l6ZW9mKHBNaWMpKTsKKwkJc2VuZGJ1ZiArPSBzaXplb2YocE1pYyk7CisJCW1lbWNweSAoc2VuZGJ1ZiwgYnVmZmVyLCBsZW4gLSBzaXplb2YoZXRoZXJIZWFkKSk7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCSpwYXlsb2FkTGVuID0gY3B1X3RvX2xlMTYobGVuIC0gc2l6ZW9mKGV0aGVySGVhZCkpOworCisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJCS8qIGNvcHkgZGF0YSBpbnRvIGFpcm8gZG1hIGJ1ZmZlciAqLworCQltZW1jcHkoc2VuZGJ1ZiwgYnVmZmVyLCBsZW4pOworCX0KKworCW1lbWNweV90b2lvKGFpLT50eGZpZHNbMF0uY2FyZF9yYW1fb2ZmLAorCQkmYWktPnR4Zmlkc1swXS50eF9kZXNjLCBzaXplb2YoVHhGaWQpKTsKKworCU9VVDQ1MDAoYWksIEVWQUNLLCA4KTsKKworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGdldF90eF9lcnJvcihzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTMyIGZpZCkKK3sKKwl1MTYgc3RhdHVzOworCisJaWYgKGZpZCA8IDApCisJCXN0YXR1cyA9ICgoV2lmaUN0bEhkciAqKWFpLT50eGZpZHNbMF0udmlydHVhbF9ob3N0X2FkZHIpLT5jdGxoZHIuc3RhdHVzOworCWVsc2UgeworCQlpZiAoYmFwX3NldHVwKGFpLCBhaS0+Zmlkc1tmaWRdICYgMHhmZmZmLCA0LCBCQVAwKSAhPSBTVUNDRVNTKQorCQkJcmV0dXJuOworCQliYXBfcmVhZChhaSwgJnN0YXR1cywgMiwgQkFQMCk7CisJfQorCWlmIChsZTE2X3RvX2NwdShzdGF0dXMpICYgMikgLyogVG9vIG1hbnkgcmV0cmllcyAqLworCQlhaS0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwlpZiAobGUxNl90b19jcHUoc3RhdHVzKSAmIDQpIC8qIFRyYW5zbWl0IGxpZmV0aW1lIGV4Y2VlZGVkICovCisJCWFpLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJaWYgKGxlMTZfdG9fY3B1KHN0YXR1cykgJiA4KSAvKiBBaWQgZmFpbCAqLworCQl7IH0KKwlpZiAobGUxNl90b19jcHUoc3RhdHVzKSAmIDB4MTApIC8qIE1BQyBkaXNhYmxlZCAqLworCQlhaS0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwlpZiAobGUxNl90b19jcHUoc3RhdHVzKSAmIDB4MjApIC8qIEFzc29jaWF0aW9uIGxvc3QgKi8KKwkJeyB9CisJLyogV2UgcHJvZHVjZSBhIFRYRFJPUCBldmVudCBvbmx5IGZvciByZXRyeSBvciBsaWZldGltZQorCSAqIGV4Y2VlZGVkLCBiZWNhdXNlIHRoYXQncyB0aGUgb25seSBzdGF0dXMgdGhhdCByZWFsbHkgbWVhbgorCSAqIHRoYXQgdGhpcyBwYXJ0aWN1bGFyIG5vZGUgd2VudCBhd2F5LgorCSAqIE90aGVyIGVycm9ycyBtZWFucyB0aGF0ICp3ZSogc2NyZXdlZCB1cC4gLSBKZWFuIElJICovCisJaWYgKChsZTE2X3RvX2NwdShzdGF0dXMpICYgMikgfHwKKwkgICAgIChsZTE2X3RvX2NwdShzdGF0dXMpICYgNCkpIHsKKwkJdW5pb24gaXdyZXFfZGF0YQl3cnF1OworCQljaGFyIGp1bmtbMHgxOF07CisKKwkJLyogRmFzdGVyIHRvIHNraXAgb3ZlciB1c2VsZXNzIGRhdGEgdGhhbiB0byBkbworCQkgKiBhbm90aGVyIGJhcF9zZXR1cCgpLiBXZSBhcmUgYXQgb2Zmc2V0IDB4NiBhbmQKKwkJICogbmVlZCB0byBnbyB0byAweDE4IGFuZCByZWFkIDYgYnl0ZXMgLSBKZWFuIElJICovCisJCWJhcF9yZWFkKGFpLCAodTE2ICopIGp1bmssIDB4MTgsIEJBUDApOworCisJCS8qIENvcHkgODAyLjExIGRlc3QgYWRkcmVzcy4KKwkJICogV2UgdXNlIHRoZSA4MDIuMTEgaGVhZGVyIGJlY2F1c2UgdGhlIGZyYW1lIG1heQorCQkgKiBub3QgYmUgODAyLjMgb3IgbWF5IGJlIG1hbmdsZWQuLi4KKwkJICogSW4gQWQtSG9jIG1vZGUsIGl0IHdpbGwgYmUgdGhlIG5vZGUgYWRkcmVzcy4KKwkJICogSW4gbWFuYWdlZCBtb2RlLCBpdCB3aWxsIGJlIG1vc3QgbGlrZWx5IHRoZSBBUCBhZGRyCisJCSAqIFVzZXIgc3BhY2Ugd2lsbCBmaWd1cmUgb3V0IGhvdyB0byBjb252ZXJ0IGl0IHRvCisJCSAqIHdoYXRldmVyIGl0IG5lZWRzIChJUCBhZGRyZXNzIG9yIGVsc2UpLgorCQkgKiAtIEplYW4gSUkgKi8KKwkJbWVtY3B5KHdycXUuYWRkci5zYV9kYXRhLCBqdW5rICsgMHgxMiwgRVRIX0FMRU4pOworCQl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisJCS8qIFNlbmQgZXZlbnQgdG8gdXNlciBzcGFjZSAqLworCQl3aXJlbGVzc19zZW5kX2V2ZW50KGFpLT5kZXYsIElXRVZUWERST1AsICZ3cnF1LCBOVUxMKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFpcm9fZW5kX3htaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXUxNiBzdGF0dXM7CisJaW50IGk7CisJc3RydWN0IGFpcm9faW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJpdi0+eG1pdC5za2I7CisJaW50IGZpZCA9IHByaXYtPnhtaXQuZmlkOworCXUzMiAqZmlkcyA9IHByaXYtPmZpZHM7CisKKwljbGVhcl9iaXQoSk9CX1hNSVQsICZwcml2LT5mbGFncyk7CisJY2xlYXJfYml0KEZMQUdfUEVORElOR19YTUlULCAmcHJpdi0+ZmxhZ3MpOworCXN0YXR1cyA9IHRyYW5zbWl0XzgwMl8zX3BhY2tldCAocHJpdiwgZmlkc1tmaWRdLCBza2ItPmRhdGEpOworCXVwKCZwcml2LT5zZW0pOworCisJaSA9IDA7CisJaWYgKCBzdGF0dXMgPT0gU1VDQ0VTUyApIHsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWZvciAoOyBpIDwgTUFYX0ZJRFMgLyAyICYmIChwcml2LT5maWRzW2ldICYgMHhmZmZmMDAwMCk7IGkrKyk7CisJfSBlbHNlIHsKKwkJcHJpdi0+Zmlkc1tmaWRdICY9IDB4ZmZmZjsKKwkJcHJpdi0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCX0KKwlpZiAoaSA8IE1BWF9GSURTIC8gMikKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIGludCBhaXJvX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXMxNiBsZW47CisJaW50IGksIGo7CisJc3RydWN0IGFpcm9faW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKKwl1MzIgKmZpZHMgPSBwcml2LT5maWRzOworCisJaWYgKCBza2IgPT0gTlVMTCApIHsKKwkJcHJpbnRrKCBLRVJOX0VSUiAiYWlybzogIHNrYiA9PSBOVUxMISEhXG4iICk7CisJCXJldHVybiAwOworCX0KKworCS8qIEZpbmQgYSB2YWNhbnQgRklEICovCisJZm9yKCBpID0gMDsgaSA8IE1BWF9GSURTIC8gMiAmJiAoZmlkc1tpXSAmIDB4ZmZmZjAwMDApOyBpKysgKTsKKwlmb3IoIGogPSBpICsgMTsgaiA8IE1BWF9GSURTIC8gMiAmJiAoZmlkc1tqXSAmIDB4ZmZmZjAwMDApOyBqKysgKTsKKworCWlmICggaiA+PSBNQVhfRklEUyAvIDIgKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQlpZiAoaSA9PSBNQVhfRklEUyAvIDIpIHsKKwkJCXByaXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwkvKiBjaGVjayBtaW4gbGVuZ3RoKi8KKwlsZW4gPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKyAgICAgICAgLyogTWFyayBmaWQgYXMgdXNlZCAmIHNhdmUgbGVuZ3RoIGZvciBsYXRlciAqLworCWZpZHNbaV0gfD0gKGxlbiA8PCAxNik7CisJcHJpdi0+eG1pdC5za2IgPSBza2I7CisJcHJpdi0+eG1pdC5maWQgPSBpOworCWlmIChkb3duX3RyeWxvY2soJnByaXYtPnNlbSkgIT0gMCkgeworCQlzZXRfYml0KEZMQUdfUEVORElOR19YTUlULCAmcHJpdi0+ZmxhZ3MpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNldF9iaXQoSk9CX1hNSVQsICZwcml2LT5mbGFncyk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+dGhyX3dhaXQpOworCX0gZWxzZQorCQlhaXJvX2VuZF94bWl0KGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFpcm9fZW5kX3htaXQxMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJdTE2IHN0YXR1czsKKwlpbnQgaTsKKwlzdHJ1Y3QgYWlyb19pbmZvICpwcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2IgPSBwcml2LT54bWl0MTEuc2tiOworCWludCBmaWQgPSBwcml2LT54bWl0MTEuZmlkOworCXUzMiAqZmlkcyA9IHByaXYtPmZpZHM7CisKKwljbGVhcl9iaXQoSk9CX1hNSVQxMSwgJnByaXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoRkxBR19QRU5ESU5HX1hNSVQxMSwgJnByaXYtPmZsYWdzKTsKKwlzdGF0dXMgPSB0cmFuc21pdF84MDJfMTFfcGFja2V0IChwcml2LCBmaWRzW2ZpZF0sIHNrYi0+ZGF0YSk7CisJdXAoJnByaXYtPnNlbSk7CisKKwlpID0gTUFYX0ZJRFMgLyAyOworCWlmICggc3RhdHVzID09IFNVQ0NFU1MgKSB7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlmb3IgKDsgaSA8IE1BWF9GSURTICYmIChwcml2LT5maWRzW2ldICYgMHhmZmZmMDAwMCk7IGkrKyk7CisJfSBlbHNlIHsKKwkJcHJpdi0+Zmlkc1tmaWRdICY9IDB4ZmZmZjsKKwkJcHJpdi0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCX0KKwlpZiAoaSA8IE1BWF9GSURTKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJZGV2X2tmcmVlX3NrYihza2IpOworfQorCitzdGF0aWMgaW50IGFpcm9fc3RhcnRfeG1pdDExKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzMTYgbGVuOworCWludCBpLCBqOworCXN0cnVjdCBhaXJvX2luZm8gKnByaXYgPSBkZXYtPnByaXY7CisJdTMyICpmaWRzID0gcHJpdi0+ZmlkczsKKworCWlmICh0ZXN0X2JpdChGTEFHX01QSSwgJnByaXYtPmZsYWdzKSkgeworCQkvKiBOb3QgaW1wbGVtZW50ZWQgeWV0IGZvciBNUEkzNTAgKi8KKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmICggc2tiID09IE5VTEwgKSB7CisJCXByaW50ayggS0VSTl9FUlIgImFpcm86ICBza2IgPT0gTlVMTCEhIVxuIiApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGaW5kIGEgdmFjYW50IEZJRCAqLworCWZvciggaSA9IE1BWF9GSURTIC8gMjsgaSA8IE1BWF9GSURTICYmIChmaWRzW2ldICYgMHhmZmZmMDAwMCk7IGkrKyApOworCWZvciggaiA9IGkgKyAxOyBqIDwgTUFYX0ZJRFMgJiYgKGZpZHNbal0gJiAweGZmZmYwMDAwKTsgaisrICk7CisKKwlpZiAoIGogPj0gTUFYX0ZJRFMgKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQlpZiAoaSA9PSBNQVhfRklEUykgeworCQkJcHJpdi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCXJldHVybiAxOworCQl9CisJfQorCS8qIGNoZWNrIG1pbiBsZW5ndGgqLworCWxlbiA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworICAgICAgICAvKiBNYXJrIGZpZCBhcyB1c2VkICYgc2F2ZSBsZW5ndGggZm9yIGxhdGVyICovCisJZmlkc1tpXSB8PSAobGVuIDw8IDE2KTsKKwlwcml2LT54bWl0MTEuc2tiID0gc2tiOworCXByaXYtPnhtaXQxMS5maWQgPSBpOworCWlmIChkb3duX3RyeWxvY2soJnByaXYtPnNlbSkgIT0gMCkgeworCQlzZXRfYml0KEZMQUdfUEVORElOR19YTUlUMTEsICZwcml2LT5mbGFncyk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc2V0X2JpdChKT0JfWE1JVDExLCAmcHJpdi0+ZmxhZ3MpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPnRocl93YWl0KTsKKwl9IGVsc2UKKwkJYWlyb19lbmRfeG1pdDExKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFpcm9fcmVhZF9zdGF0cyhzdHJ1Y3QgYWlyb19pbmZvICphaSkgeworCVN0YXRzUmlkIHN0YXRzX3JpZDsKKwl1MzIgKnZhbHMgPSBzdGF0c19yaWQudmFsczsKKworCWNsZWFyX2JpdChKT0JfU1RBVFMsICZhaS0+ZmxhZ3MpOworCWlmIChhaS0+cG93ZXIpIHsKKwkJdXAoJmFpLT5zZW0pOworCQlyZXR1cm47CisJfQorCXJlYWRTdGF0c1JpZChhaSwgJnN0YXRzX3JpZCwgUklEX1NUQVRTLCAwKTsKKwl1cCgmYWktPnNlbSk7CisKKwlhaS0+c3RhdHMucnhfcGFja2V0cyA9IHZhbHNbNDNdICsgdmFsc1s0NF0gKyB2YWxzWzQ1XTsKKwlhaS0+c3RhdHMudHhfcGFja2V0cyA9IHZhbHNbMzldICsgdmFsc1s0MF0gKyB2YWxzWzQxXTsKKwlhaS0+c3RhdHMucnhfYnl0ZXMgPSB2YWxzWzkyXTsKKwlhaS0+c3RhdHMudHhfYnl0ZXMgPSB2YWxzWzkxXTsKKwlhaS0+c3RhdHMucnhfZXJyb3JzID0gdmFsc1swXSArIHZhbHNbMl0gKyB2YWxzWzNdICsgdmFsc1s0XTsKKwlhaS0+c3RhdHMudHhfZXJyb3JzID0gdmFsc1s0Ml0gKyBhaS0+c3RhdHMudHhfZmlmb19lcnJvcnM7CisJYWktPnN0YXRzLm11bHRpY2FzdCA9IHZhbHNbNDNdOworCWFpLT5zdGF0cy5jb2xsaXNpb25zID0gdmFsc1s4OV07CisKKwkvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisJYWktPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPSB2YWxzWzNdOworCWFpLT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gdmFsc1s0XTsKKwlhaS0+c3RhdHMucnhfZnJhbWVfZXJyb3JzID0gdmFsc1syXTsKKwlhaS0+c3RhdHMucnhfZmlmb19lcnJvcnMgPSB2YWxzWzBdOworfQorCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYWlyb19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9ICBkZXYtPnByaXY7CisKKwlpZiAoIXRlc3RfYml0KEpPQl9TVEFUUywgJmxvY2FsLT5mbGFncykpIHsKKwkJLyogR2V0IHN0YXRzIG91dCBvZiB0aGUgY2FyZCBpZiBhdmFpbGFibGUgKi8KKwkJaWYgKGRvd25fdHJ5bG9jaygmbG9jYWwtPnNlbSkgIT0gMCkgeworCQkJc2V0X2JpdChKT0JfU1RBVFMsICZsb2NhbC0+ZmxhZ3MpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZsb2NhbC0+dGhyX3dhaXQpOworCQl9IGVsc2UKKwkJCWFpcm9fcmVhZF9zdGF0cyhsb2NhbCk7CisJfQorCisJcmV0dXJuICZsb2NhbC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIGFpcm9fc2V0X3Byb21pc2Moc3RydWN0IGFpcm9faW5mbyAqYWkpIHsKKwlDbWQgY21kOworCVJlc3AgcnNwOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQuY21kPUNNRF9TRVRNT0RFOworCWNsZWFyX2JpdChKT0JfUFJPTUlTQywgJmFpLT5mbGFncyk7CisJY21kLnBhcm0wPShhaS0+ZmxhZ3MmSUZGX1BST01JU0MpID8gUFJPTUlTQyA6IE5PUFJPTUlTQzsKKwlpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCXVwKCZhaS0+c2VtKTsKK30KKworc3RhdGljIHZvaWQgYWlyb19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCisJaWYgKChkZXYtPmZsYWdzIF4gYWktPmZsYWdzKSAmIElGRl9QUk9NSVNDKSB7CisJCWNoYW5nZV9iaXQoRkxBR19QUk9NSVNDLCAmYWktPmZsYWdzKTsKKwkJaWYgKGRvd25fdHJ5bG9jaygmYWktPnNlbSkgIT0gMCkgeworCQkJc2V0X2JpdChKT0JfUFJPTUlTQywgJmFpLT5mbGFncyk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFpLT50aHJfd2FpdCk7CisJCX0gZWxzZQorCQkJYWlyb19zZXRfcHJvbWlzYyhhaSk7CisJfQorCisJaWYgKChkZXYtPmZsYWdzJklGRl9BTExNVUxUSSl8fGRldi0+bWNfY291bnQ+MCkgeworCQkvKiBUdXJuIG9uIG11bHRpY2FzdC4gIChTaG91bGQgYmUgYWxyZWFkeSBzZXR1cC4uLikgKi8KKwl9Cit9CisKK3N0YXRpYyBpbnQgYWlyb19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCVJlc3AgcnNwOworCisJcmVhZENvbmZpZ1JpZChhaSwgMSk7CisJbWVtY3B5IChhaS0+Y29uZmlnLm1hY0FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwlkaXNhYmxlX01BQyhhaSwgMSk7CisJd3JpdGVDb25maWdSaWQgKGFpLCAxKTsKKwllbmFibGVfTUFDKGFpLCAmcnNwLCAxKTsKKwltZW1jcHkgKGFpLT5kZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKwlpZiAoYWktPndpZmlkZXYpCisJCW1lbWNweSAoYWktPndpZmlkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaXJvX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKChuZXdfbXR1IDwgNjgpIHx8IChuZXdfbXR1ID4gMjQwMCkpCisJCXJldHVybiAtRUlOVkFMOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFpcm9fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKGFpLT53aWZpZGV2ICE9IGRldikgeworI2lmZGVmIFBPV0VSX09OX0RPV04KKwkJLyogU2h1dCBwb3dlciB0byB0aGUgY2FyZC4gVGhlIGlkZWEgaXMgdGhhdCB0aGUgdXNlciBjYW4gc2F2ZQorCQkgKiBwb3dlciB3aGVuIGhlIGRvZXNuJ3QgbmVlZCB0aGUgY2FyZCB3aXRoICJpZmNvbmZpZyBkb3duIi4KKwkJICogVGhhdCdzIHRoZSBtZXRob2QgdGhhdCBpcyBtb3N0IGZyaWVuZGx5IHRvd2FyZHMgdGhlIG5ldHdvcmsKKwkJICogc3RhY2sgKGkuZS4gdGhlIG5ldHdvcmsgc3RhY2sgd29uJ3QgdHJ5IHRvIGJyb2FkY2FzdAorCQkgKiBhbnl0aGluZyBvbiB0aGUgaW50ZXJmYWNlIGFuZCByb3V0ZXMgYXJlIGdvbmUuIEplYW4gSUkgKi8KKwkJc2V0X2JpdChGTEFHX1JBRElPX0RPV04sICZhaS0+ZmxhZ3MpOworCQlkaXNhYmxlX01BQyhhaSwgMSk7CisjZW5kaWYKKwkJZGlzYWJsZV9pbnRlcnJ1cHRzKCBhaSApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVsX2Fpcm9fZGV2KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK3ZvaWQgc3RvcF9haXJvX2NhcmQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmcmVlcmVzICkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKworCXNldF9iaXQoRkxBR19SQURJT19ET1dOLCAmYWktPmZsYWdzKTsKKwlkaXNhYmxlX01BQyhhaSwgMSk7CisJZGlzYWJsZV9pbnRlcnJ1cHRzKGFpKTsKKwlmcmVlX2lycSggZGV2LT5pcnEsIGRldiApOworCXRha2Vkb3duX3Byb2NfZW50cnkoIGRldiwgYWkgKTsKKwlpZiAodGVzdF9iaXQoRkxBR19SRUdJU1RFUkVELCAmYWktPmZsYWdzKSkgeworCQl1bnJlZ2lzdGVyX25ldGRldiggZGV2ICk7CisJCWlmIChhaS0+d2lmaWRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoYWktPndpZmlkZXYpOworCQkJZnJlZV9uZXRkZXYoYWktPndpZmlkZXYpOworCQkJYWktPndpZmlkZXYgPSBOVUxMOworCQl9CisJCWNsZWFyX2JpdChGTEFHX1JFR0lTVEVSRUQsICZhaS0+ZmxhZ3MpOworCX0KKwlzZXRfYml0KEpPQl9ESUUsICZhaS0+ZmxhZ3MpOworCWtpbGxfcHJvYyhhaS0+dGhyX3BpZCwgU0lHVEVSTSwgMSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmYWktPnRocl9leGl0ZWQpOworCisJLyoKKwkgKiBDbGVhbiBvdXQgdHggcXVldWUKKwkgKi8KKwlpZiAodGVzdF9iaXQoRkxBR19NUEksICZhaS0+ZmxhZ3MpICYmIHNrYl9xdWV1ZV9sZW4gKCZhaS0+dHhxKSA+IDApIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJCWZvciAoOyhza2IgPSBza2JfZGVxdWV1ZSgmYWktPnR4cSkpOykKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlpZiAoYWktPmZsYXNoKQorCQlrZnJlZShhaS0+Zmxhc2gpOworCWlmIChhaS0+cnNzaSkKKwkJa2ZyZWUoYWktPnJzc2kpOworCWlmIChhaS0+QVBMaXN0KQorCQlrZnJlZShhaS0+QVBMaXN0KTsKKwlpZiAoYWktPlNTSUQpCisJCWtmcmVlKGFpLT5TU0lEKTsKKwlpZiAoZnJlZXJlcykgeworCQkvKiBQQ01DSUEgZnJlZXMgdGhpcyBzdHVmZiwgc28gb25seSBmb3IgUENJIGFuZCBJU0EgKi8KKwkgICAgICAgIHJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgNjQgKTsKKwkJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCAmYWktPmZsYWdzKSkgeworCQkJaWYgKGFpLT5wY2kpCisJCQkJbXBpX3VubWFwX2NhcmQoYWktPnBjaSk7CisJCQlpZiAoYWktPnBjaW1lbSkKKwkJCQlpb3VubWFwKGFpLT5wY2ltZW0pOworCQkJaWYgKGFpLT5wY2lhdXgpCisJCQkJaW91bm1hcChhaS0+cGNpYXV4KTsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWktPnBjaSwgUENJX1NIQVJFRF9MRU4sCisJCQkJYWktPnNoYXJlZCwgYWktPnNoYXJlZF9kbWEpOworCQl9CisgICAgICAgIH0KKyNpZmRlZiBNSUNTVVBQT1JUCisJaWYgKGFpLT50Zm0pCisJCWNyeXB0b19mcmVlX3RmbShhaS0+dGZtKTsKKyNlbmRpZgorCWRlbF9haXJvX2RldiggZGV2ICk7CisJZnJlZV9uZXRkZXYoIGRldiApOworfQorCitFWFBPUlRfU1lNQk9MKHN0b3BfYWlyb19jYXJkKTsKKworc3RhdGljIGludCBhZGRfYWlyb19kZXYoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworaW50IHdsbF9oZWFkZXJfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgY2hhciAqaGFkZHIpCit7CisJbWVtY3B5KGhhZGRyLCBza2ItPm1hYy5yYXcgKyAxMCwgRVRIX0FMRU4pOworCXJldHVybiBFVEhfQUxFTjsKK30KKworc3RhdGljIHZvaWQgbXBpX3VubWFwX2NhcmQoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwl1bnNpZ25lZCBsb25nIG1lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDEpOworCXVuc2lnbmVkIGxvbmcgbWVtX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpLCAxKTsKKwl1bnNpZ25lZCBsb25nIGF1eF9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDIpOworCXVuc2lnbmVkIGxvbmcgYXV4X2xlbiA9IEFVWE1FTVNJWkU7CisKKwlyZWxlYXNlX21lbV9yZWdpb24oYXV4X3N0YXJ0LCBhdXhfbGVuKTsKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtX3N0YXJ0LCBtZW1fbGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IGRlc2NyaXB0b3JzIGhhdmUgYmVlbiBzZXR1cCAuCisgKiAgUnVuIGF0IGluc21vZCB0aW1lIG9yIGFmdGVyIHJlc2V0ICB3aGVuIHRoZSBkZWNyaXB0b3JzCisgKiAgaGF2ZSBiZWVuIGluaXRpYWxpemVkIC4gUmV0dXJucyAwIGlmIGFsbCBpcyB3ZWxsIG56CisgKiAgb3RoZXJ3aXNlIC4gRG9lcyBub3QgYWxsb2NhdGUgbWVtb3J5IGJ1dCBzZXRzIHVwIGNhcmQKKyAqICB1c2luZyBwcmV2aW91c2x5IGFsbG9jYXRlZCBkZXNjcmlwdG9ycy4KKyAqLworc3RhdGljIGludCBtcGlfaW5pdF9kZXNjcmlwdG9ycyAoc3RydWN0IGFpcm9faW5mbyAqYWkpCit7CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKKwlpbnQgaTsKKwlpbnQgcmMgPSBTVUNDRVNTOworCisJLyogQWxsb2MgIGNhcmQgUlggZGVzY3JpcHRvcnMgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGFpLT5kZXYpOworCisJbWVtc2V0KCZyc3AsMCxzaXplb2YocnNwKSk7CisJbWVtc2V0KCZjbWQsMCxzaXplb2YoY21kKSk7CisKKwljbWQuY21kID0gQ01EX0FMTE9DQVRFQVVYOworCWNtZC5wYXJtMCA9IEZJRF9SWDsKKwljbWQucGFybTEgPSAoYWktPnJ4Zmlkc1swXS5jYXJkX3JhbV9vZmYgLSBhaS0+cGNpYXV4KTsKKwljbWQucGFybTIgPSBNUElfTUFYX0ZJRFM7CisJcmM9aXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwlpZiAocmMgIT0gU1VDQ0VTUykgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86ICBDb3VsZG4ndCBhbGxvY2F0ZSBSWCBGSURcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJZm9yIChpPTA7IGk8TVBJX01BWF9GSURTOyBpKyspIHsKKwkJbWVtY3B5X3RvaW8oYWktPnJ4Zmlkc1tpXS5jYXJkX3JhbV9vZmYsCisJCQkmYWktPnJ4Zmlkc1tpXS5yeF9kZXNjLCBzaXplb2YoUnhGaWQpKTsKKwl9CisKKwkvKiBBbGxvYyBjYXJkIFRYIGRlc2NyaXB0b3JzICovCisKKwltZW1zZXQoJnJzcCwwLHNpemVvZihyc3ApKTsKKwltZW1zZXQoJmNtZCwwLHNpemVvZihjbWQpKTsKKworCWNtZC5jbWQgPSBDTURfQUxMT0NBVEVBVVg7CisJY21kLnBhcm0wID0gRklEX1RYOworCWNtZC5wYXJtMSA9IChhaS0+dHhmaWRzWzBdLmNhcmRfcmFtX29mZiAtIGFpLT5wY2lhdXgpOworCWNtZC5wYXJtMiA9IE1QSV9NQVhfRklEUzsKKworCWZvciAoaT0wOyBpPE1QSV9NQVhfRklEUzsgaSsrKSB7CisJCWFpLT50eGZpZHNbaV0udHhfZGVzYy52YWxpZCA9IDE7CisJCW1lbWNweV90b2lvKGFpLT50eGZpZHNbaV0uY2FyZF9yYW1fb2ZmLAorCQkJJmFpLT50eGZpZHNbaV0udHhfZGVzYywgc2l6ZW9mKFR4RmlkKSk7CisJfQorCWFpLT50eGZpZHNbaS0xXS50eF9kZXNjLmVvYyA9IDE7IC8qIExhc3QgZGVzY3JpcHRvciBoYXMgRU9DIHNldCAqLworCisJcmM9aXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwlpZiAocmMgIT0gU1VDQ0VTUykgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86ICBDb3VsZG4ndCBhbGxvY2F0ZSBUWCBGSURcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogQWxsb2MgY2FyZCBSaWQgZGVzY3JpcHRvciAqLworCW1lbXNldCgmcnNwLDAsc2l6ZW9mKHJzcCkpOworCW1lbXNldCgmY21kLDAsc2l6ZW9mKGNtZCkpOworCisJY21kLmNtZCA9IENNRF9BTExPQ0FURUFVWDsKKwljbWQucGFybTAgPSBSSURfUlc7CisJY21kLnBhcm0xID0gKGFpLT5jb25maWdfZGVzYy5jYXJkX3JhbV9vZmYgLSBhaS0+cGNpYXV4KTsKKwljbWQucGFybTIgPSAxOyAvKiBNYWdpYyBudW1iZXIuLi4gKi8KKwlyYz1pc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCWlmIChyYyAhPSBTVUNDRVNTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogIENvdWxkbid0IGFsbG9jYXRlIFJJRFxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwltZW1jcHlfdG9pbyhhaS0+Y29uZmlnX2Rlc2MuY2FyZF9yYW1fb2ZmLAorCQkmYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLCBzaXplb2YoUmlkKSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBXZSBhcmUgc2V0dGluZyB1cCB0aHJlZSB0aGluZ3MgaGVyZToKKyAqIDEpIE1hcCBBVVggbWVtb3J5IGZvciBkZXNjcmlwdG9yczogUmlkLCBUeEZpZCwgb3IgUnhGaWQuCisgKiAyKSBNYXAgUENJIG1lbW9yeSBmb3IgaXNzdWVpbmcgY29tbWFuZHMuCisgKiAzKSBBbGxvY2F0ZSBtZW1vcnkgKHNoYXJlZCkgdG8gc2VuZCBhbmQgcmVjZWl2ZSBldGhlcm5ldCBmcmFtZXMuCisgKi8KK3N0YXRpYyBpbnQgbXBpX21hcF9jYXJkKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIG1lbV9zdGFydCwgbWVtX2xlbiwgYXV4X3N0YXJ0LCBhdXhfbGVuOworCWludCByYyA9IC0xOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKmJ1c2FkZHJvZmYsKnZwYWNrb2ZmOworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqcGNpYWRkcm9mZjsKKworCW1lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDEpOworCW1lbV9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMSk7CisJYXV4X3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMik7CisJYXV4X2xlbiA9IEFVWE1FTVNJWkU7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZW1fc3RhcnQsIG1lbV9sZW4sIG5hbWUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogQ291bGRuJ3QgZ2V0IHJlZ2lvbiAleFsleF0gZm9yICVzXG4iLAorCQkgICAgICAgKGludCltZW1fc3RhcnQsIChpbnQpbWVtX2xlbiwgbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihhdXhfc3RhcnQsIGF1eF9sZW4sIG5hbWUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogQ291bGRuJ3QgZ2V0IHJlZ2lvbiAleFsleF0gZm9yICVzXG4iLAorCQkgICAgICAgKGludClhdXhfc3RhcnQsIChpbnQpYXV4X2xlbiwgbmFtZSk7CisJCWdvdG8gZnJlZV9yZWdpb24xOworCX0KKworCWFpLT5wY2ltZW0gPSBpb3JlbWFwKG1lbV9zdGFydCwgbWVtX2xlbik7CisJaWYgKCFhaS0+cGNpbWVtKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogQ291bGRuJ3QgbWFwIHJlZ2lvbiAleFsleF0gZm9yICVzXG4iLAorCQkgICAgICAgKGludCltZW1fc3RhcnQsIChpbnQpbWVtX2xlbiwgbmFtZSk7CisJCWdvdG8gZnJlZV9yZWdpb24yOworCX0KKwlhaS0+cGNpYXV4ID0gaW9yZW1hcChhdXhfc3RhcnQsIGF1eF9sZW4pOworCWlmICghYWktPnBjaWF1eCkgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86IENvdWxkbid0IG1hcCByZWdpb24gJXhbJXhdIGZvciAlc1xuIiwKKwkJICAgICAgIChpbnQpYXV4X3N0YXJ0LCAoaW50KWF1eF9sZW4sIG5hbWUpOworCQlnb3RvIGZyZWVfbWVtbWFwOworCX0KKworCS8qIFJlc2VydmUgUEtUU0laRSBmb3IgZWFjaCBmaWQgYW5kIDJLIGZvciB0aGUgUmlkcyAqLworCWFpLT5zaGFyZWQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2ksIFBDSV9TSEFSRURfTEVOLCAmYWktPnNoYXJlZF9kbWEpOworCWlmICghYWktPnNoYXJlZCkgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86IENvdWxkbid0IGFsbG9jX2NvbnNpc3RlbnQgJWRcbiIsCisJCSAgICAgICBQQ0lfU0hBUkVEX0xFTik7CisJCWdvdG8gZnJlZV9hdXhtYXA7CisJfQorCisJLyoKKwkgKiBTZXR1cCBkZXNjcmlwdG9yIFJYLCBUWCwgQ09ORklHCisJICovCisJYnVzYWRkcm9mZiA9ICh1bnNpZ25lZCBjaGFyICopYWktPnNoYXJlZF9kbWE7CisJcGNpYWRkcm9mZiA9IGFpLT5wY2lhdXggKyBBVVhfT0ZGU0VUOworCXZwYWNrb2ZmICAgPSBhaS0+c2hhcmVkOworCisJLyogUlggZGVzY3JpcHRvciBzZXR1cCAqLworCWZvcihpID0gMDsgaSA8IE1QSV9NQVhfRklEUzsgaSsrKSB7CisJCWFpLT5yeGZpZHNbaV0ucGVuZGluZyA9IDA7CisJCWFpLT5yeGZpZHNbaV0uY2FyZF9yYW1fb2ZmID0gcGNpYWRkcm9mZjsKKwkJYWktPnJ4Zmlkc1tpXS52aXJ0dWFsX2hvc3RfYWRkciA9IHZwYWNrb2ZmOworCQlhaS0+cnhmaWRzW2ldLnJ4X2Rlc2MuaG9zdF9hZGRyID0gKGRtYV9hZGRyX3QpIGJ1c2FkZHJvZmY7CisJCWFpLT5yeGZpZHNbaV0ucnhfZGVzYy52YWxpZCA9IDE7CisJCWFpLT5yeGZpZHNbaV0ucnhfZGVzYy5sZW4gPSBQS1RTSVpFOworCQlhaS0+cnhmaWRzW2ldLnJ4X2Rlc2MucmR5ID0gMDsKKworCQlwY2lhZGRyb2ZmICs9IHNpemVvZihSeEZpZCk7CisJCWJ1c2FkZHJvZmYgKz0gUEtUU0laRTsKKwkJdnBhY2tvZmYgICArPSBQS1RTSVpFOworCX0KKworCS8qIFRYIGRlc2NyaXB0b3Igc2V0dXAgKi8KKwlmb3IoaSA9IDA7IGkgPCBNUElfTUFYX0ZJRFM7IGkrKykgeworCQlhaS0+dHhmaWRzW2ldLmNhcmRfcmFtX29mZiA9IHBjaWFkZHJvZmY7CisJCWFpLT50eGZpZHNbaV0udmlydHVhbF9ob3N0X2FkZHIgPSB2cGFja29mZjsKKwkJYWktPnR4Zmlkc1tpXS50eF9kZXNjLnZhbGlkID0gMTsKKwkJYWktPnR4Zmlkc1tpXS50eF9kZXNjLmhvc3RfYWRkciA9IChkbWFfYWRkcl90KSBidXNhZGRyb2ZmOworCQltZW1jcHkoYWktPnR4Zmlkc1tpXS52aXJ0dWFsX2hvc3RfYWRkciwKKwkJCSZ3aWZpY3RsaGRyODAyMywgc2l6ZW9mKHdpZmljdGxoZHI4MDIzKSk7CisKKwkJcGNpYWRkcm9mZiArPSBzaXplb2YoVHhGaWQpOworCQlidXNhZGRyb2ZmICs9IFBLVFNJWkU7CisJCXZwYWNrb2ZmICAgKz0gUEtUU0laRTsKKwl9CisJYWktPnR4Zmlkc1tpLTFdLnR4X2Rlc2MuZW9jID0gMTsgLyogTGFzdCBkZXNjcmlwdG9yIGhhcyBFT0Mgc2V0ICovCisKKwkvKiBSaWQgZGVzY3JpcHRvciBzZXR1cCAqLworCWFpLT5jb25maWdfZGVzYy5jYXJkX3JhbV9vZmYgPSBwY2lhZGRyb2ZmOworCWFpLT5jb25maWdfZGVzYy52aXJ0dWFsX2hvc3RfYWRkciA9IHZwYWNrb2ZmOworCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy5ob3N0X2FkZHIgPSAoZG1hX2FkZHJfdCkgYnVzYWRkcm9mZjsKKwlhaS0+cmlkYnVzID0gKGRtYV9hZGRyX3QpYnVzYWRkcm9mZjsKKwlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MucmlkID0gMDsKKwlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MubGVuID0gUklEU0laRTsKKwlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MudmFsaWQgPSAxOworCXBjaWFkZHJvZmYgKz0gc2l6ZW9mKFJpZCk7CisJYnVzYWRkcm9mZiArPSBSSURTSVpFOworCXZwYWNrb2ZmICAgKz0gUklEU0laRTsKKworCS8qIFRlbGwgY2FyZCBhYm91dCBkZXNjcmlwdG9ycyAqLworCWlmIChtcGlfaW5pdF9kZXNjcmlwdG9ycyAoYWkpICE9IFNVQ0NFU1MpCisJCWdvdG8gZnJlZV9zaGFyZWQ7CisKKwlyZXR1cm4gMDsKKyBmcmVlX3NoYXJlZDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaSwgUENJX1NIQVJFRF9MRU4sIGFpLT5zaGFyZWQsIGFpLT5zaGFyZWRfZG1hKTsKKyBmcmVlX2F1eG1hcDoKKwlpb3VubWFwKGFpLT5wY2lhdXgpOworIGZyZWVfbWVtbWFwOgorCWlvdW5tYXAoYWktPnBjaW1lbSk7CisgZnJlZV9yZWdpb24yOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihhdXhfc3RhcnQsIGF1eF9sZW4pOworIGZyZWVfcmVnaW9uMToKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtX3N0YXJ0LCBtZW1fbGVuKTsKKyBvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCB3aWZpX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGV2LT5oYXJkX2hlYWRlciAgICAgICAgPSBOVUxMOworCWRldi0+cmVidWlsZF9oZWFkZXIgICAgID0gTlVMTDsKKwlkZXYtPmhhcmRfaGVhZGVyX2NhY2hlICA9IE5VTEw7CisJZGV2LT5oZWFkZXJfY2FjaGVfdXBkYXRlPSBOVUxMOworCisJZGV2LT5oYXJkX2hlYWRlcl9wYXJzZSAgPSB3bGxfaGVhZGVyX3BhcnNlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmFpcm9fc3RhcnRfeG1pdDExOworCWRldi0+Z2V0X3N0YXRzID0gJmFpcm9fZ2V0X3N0YXRzOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gJmFpcm9fc2V0X21hY19hZGRyZXNzOworCWRldi0+ZG9faW9jdGwgPSAmYWlyb19pb2N0bDsKKyNpZmRlZiBXSVJFTEVTU19FWFQKKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJmFpcm9faGFuZGxlcl9kZWY7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCisJZGV2LT5jaGFuZ2VfbXR1ID0gJmFpcm9fY2hhbmdlX210dTsKKwlkZXYtPm9wZW4gPSAmYWlyb19vcGVuOworCWRldi0+c3RvcCA9ICZhaXJvX2Nsb3NlOworCisJZGV2LT50eXBlICAgICAgICAgICAgICAgPSBBUlBIUkRfSUVFRTgwMjExOworCWRldi0+aGFyZF9oZWFkZXJfbGVuICAgID0gRVRIX0hMRU47CisJZGV2LT5tdHUgICAgICAgICAgICAgICAgPSAyMzEyOworCWRldi0+YWRkcl9sZW4gICAgICAgICAgID0gRVRIX0FMRU47CisJZGV2LT50eF9xdWV1ZV9sZW4gICAgICAgPSAxMDA7IAorCisJbWVtc2V0KGRldi0+YnJvYWRjYXN0LDB4RkYsIEVUSF9BTEVOKTsKKworCWRldi0+ZmxhZ3MgICAgICAgICAgICAgID0gSUZGX0JST0FEQ0FTVHxJRkZfTVVMVElDQVNUOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmluaXRfd2lmaWRldihzdHJ1Y3QgYWlyb19pbmZvICphaSwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmV0aGRldikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19uZXRkZXYoMCwgIndpZmklZCIsIHdpZmlfc2V0dXApOworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKwlkZXYtPnByaXYgPSBldGhkZXYtPnByaXY7CisJZGV2LT5pcnEgPSBldGhkZXYtPmlycTsKKwlkZXYtPmJhc2VfYWRkciA9IGV0aGRldi0+YmFzZV9hZGRyOworI2lmZGVmIFdJUkVMRVNTX0VYVAorCWRldi0+d2lyZWxlc3NfZGF0YSA9IGV0aGRldi0+d2lyZWxlc3NfZGF0YTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgZXRoZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycjwwKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gZGV2OworfQorCitpbnQgcmVzZXRfY2FyZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiAsIGludCBsb2NrKSB7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisKKwlpZiAobG9jayAmJiBkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQlyZXR1cm4gLTE7CisJd2FpdGJ1c3kgKGFpKTsKKwlPVVQ0NTAwKGFpLENPTU1BTkQsQ01EX1NPRlRSRVNFVCk7CisJbXNsZWVwKDIwMCk7CisJd2FpdGJ1c3kgKGFpKTsKKwltc2xlZXAoMjAwKTsKKwlpZiAobG9jaykKKwkJdXAoJmFpLT5zZW0pOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqX2luaXRfYWlyb19jYXJkKCB1bnNpZ25lZCBzaG9ydCBpcnEsIGludCBwb3J0LAorCQkJCSAgICBpbnQgaXNfcGNtY2lhLCBzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpkbWRldiApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaTsKKwlpbnQgaSwgcmM7CisKKwkvKiBDcmVhdGUgdGhlIG5ldHdvcmsgZGV2aWNlIG9iamVjdC4gKi8KKyAgICAgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCphaSkpOworICAgICAgICBpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86ICBDb3VsZG4ndCBhbGxvY19ldGhlcmRldlxuIik7CisJCXJldHVybiBOVUxMOworICAgICAgICB9CisJaWYgKGRldl9hbGxvY19uYW1lKGRldiwgZGV2LT5uYW1lKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiAgQ291bGRuJ3QgZ2V0IG5hbWUhXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisJfQorCisJYWkgPSBkZXYtPnByaXY7CisJYWktPndpZmlkZXYgPSBOVUxMOworCWFpLT5mbGFncyA9IDA7CisJaWYgKHBjaSAmJiAocGNpLT5kZXZpY2UgPT0gMHg1MDAwIHx8IHBjaS0+ZGV2aWNlID09IDB4YTUwNCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImFpcm86IEZvdW5kIGFuIE1QSTM1MCBjYXJkXG4iKTsKKwkJc2V0X2JpdChGTEFHX01QSSwgJmFpLT5mbGFncyk7CisJfQorICAgICAgICBhaS0+ZGV2ID0gZGV2OworCXNwaW5fbG9ja19pbml0KCZhaS0+YXV4X2xvY2spOworCXNlbWFfaW5pdCgmYWktPnNlbSwgMSk7CisJYWktPmNvbmZpZy5sZW4gPSAwOworCWFpLT5wY2kgPSBwY2k7CisJaW5pdF93YWl0cXVldWVfaGVhZCAoJmFpLT50aHJfd2FpdCk7CisJaW5pdF9jb21wbGV0aW9uICgmYWktPnRocl9leGl0ZWQpOworCWFpLT50aHJfcGlkID0ga2VybmVsX3RocmVhZChhaXJvX3RocmVhZCwgZGV2LCBDTE9ORV9GUyB8IENMT05FX0ZJTEVTKTsKKwlpZiAoYWktPnRocl9waWQgPCAwKQorCQlnb3RvIGVycl9vdXRfZnJlZTsKKyNpZmRlZiBNSUNTVVBQT1JUCisJYWktPnRmbSA9IE5VTEw7CisjZW5kaWYKKwlyYyA9IGFkZF9haXJvX2RldiggZGV2ICk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfdGhyOworCisJLyogVGhlIEFpcm8tc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpIHsKKwkJc2tiX3F1ZXVlX2hlYWRfaW5pdCAoJmFpLT50eHEpOworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZtcGlfc3RhcnRfeG1pdDsKKwl9IGVsc2UKKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmYWlyb19zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gJmFpcm9fZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmFpcm9fc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gJmFpcm9fc2V0X21hY19hZGRyZXNzOworCWRldi0+ZG9faW9jdGwgPSAmYWlyb19pb2N0bDsKKyNpZmRlZiBXSVJFTEVTU19FWFQKKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJmFpcm9faGFuZGxlcl9kZWY7CisJYWktPndpcmVsZXNzX2RhdGEuc3B5X2RhdGEgPSAmYWktPnNweV9kYXRhOworCWRldi0+d2lyZWxlc3NfZGF0YSA9ICZhaS0+d2lyZWxlc3NfZGF0YTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKwlkZXYtPmNoYW5nZV9tdHUgPSAmYWlyb19jaGFuZ2VfbXR1OworCWRldi0+b3BlbiA9ICZhaXJvX29wZW47CisJZGV2LT5zdG9wID0gJmFpcm9fY2xvc2U7CisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5iYXNlX2FkZHIgPSBwb3J0OworCisJU0VUX05FVERFVl9ERVYoZGV2LCBkbWRldik7CisKKworCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkKKwkJcmVzZXRfY2FyZCAoZGV2LCAxKTsKKworCXJjID0gcmVxdWVzdF9pcnEoIGRldi0+aXJxLCBhaXJvX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2ICk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogcmVnaXN0ZXIgaW50ZXJydXB0ICVkIGZhaWxlZCwgcmMgJWRcbiIsIGlycSwgcmMgKTsKKwkJZ290byBlcnJfb3V0X3VubGluazsKKwl9CisJaWYgKCFpc19wY21jaWEpIHsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDY0LCBkZXYtPm5hbWUgKSkgeworCQkJcmMgPSAtRUJVU1k7CisJCQlwcmludGsoS0VSTl9FUlIgImFpcm86IENvdWxkbid0IHJlcXVlc3QgcmVnaW9uXG4iKTsKKwkJCWdvdG8gZXJyX291dF9pcnE7CisJCX0KKwl9CisKKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpIHsKKwkJaWYgKG1waV9tYXBfY2FyZChhaSwgcGNpLCBkZXYtPm5hbWUpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFpcm86IENvdWxkIG5vdCBtYXAgbWVtb3J5XG4iKTsKKwkJCWdvdG8gZXJyX291dF9yZXM7CisJCX0KKwl9CisKKwlpZiAocHJvYmUpIHsKKwkJaWYgKCBzZXR1cF9jYXJkKCBhaSwgZGV2LT5kZXZfYWRkciwgMSApICE9IFNVQ0NFU1MgKSB7CisJCQlwcmludGsoIEtFUk5fRVJSICJhaXJvOiBNQUMgY291bGQgbm90IGJlIGVuYWJsZWRcbiIgKTsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gZXJyX291dF9tYXA7CisJCX0KKwl9IGVsc2UgaWYgKCF0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkgeworCQlhaS0+YmFwX3JlYWQgPSBmYXN0X2JhcF9yZWFkOworCQlzZXRfYml0KEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpOworCX0KKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogQ291bGRuJ3QgcmVnaXN0ZXJfbmV0ZGV2XG4iKTsKKwkJZ290byBlcnJfb3V0X21hcDsKKwl9CisJYWktPndpZmlkZXYgPSBpbml0X3dpZmlkZXYoYWksIGRldik7CisKKwlzZXRfYml0KEZMQUdfUkVHSVNURVJFRCwmYWktPmZsYWdzKTsKKwlwcmludGsoIEtFUk5fSU5GTyAiYWlybzogTUFDIGVuYWJsZWQgJXMgJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCWRldi0+bmFtZSwKKwkJZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkJZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSApOworCisJLyogQWxsb2NhdGUgdGhlIHRyYW5zbWl0IGJ1ZmZlcnMgKi8KKwlpZiAocHJvYmUgJiYgIXRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKQorCQlmb3IoIGkgPSAwOyBpIDwgTUFYX0ZJRFM7IGkrKyApCisJCQlhaS0+Zmlkc1tpXSA9IHRyYW5zbWl0X2FsbG9jYXRlKGFpLDIzMTIsaT49TUFYX0ZJRFMvMik7CisKKwlzZXR1cF9wcm9jX2VudHJ5KCBkZXYsIGRldi0+cHJpdiApOyAvKiBYWFggY2hlY2sgZm9yIGZhaWx1cmUgKi8KKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlyZXR1cm4gZGV2OworCitlcnJfb3V0X21hcDoKKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykgJiYgcGNpKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpLCBQQ0lfU0hBUkVEX0xFTiwgYWktPnNoYXJlZCwgYWktPnNoYXJlZF9kbWEpOworCQlpb3VubWFwKGFpLT5wY2lhdXgpOworCQlpb3VubWFwKGFpLT5wY2ltZW0pOworCQltcGlfdW5tYXBfY2FyZChhaS0+cGNpKTsKKwl9CitlcnJfb3V0X3JlczoKKwlpZiAoIWlzX3BjbWNpYSkKKwkgICAgICAgIHJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgNjQgKTsKK2Vycl9vdXRfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworZXJyX291dF91bmxpbms6CisJZGVsX2Fpcm9fZGV2KGRldik7CitlcnJfb3V0X3RocjoKKwlzZXRfYml0KEpPQl9ESUUsICZhaS0+ZmxhZ3MpOworCWtpbGxfcHJvYyhhaS0+dGhyX3BpZCwgU0lHVEVSTSwgMSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmYWktPnRocl9leGl0ZWQpOworZXJyX291dF9mcmVlOgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICppbml0X2Fpcm9fY2FyZCggdW5zaWduZWQgc2hvcnQgaXJxLCBpbnQgcG9ydCwgaW50IGlzX3BjbWNpYSwKKwkJCQkgIHN0cnVjdCBkZXZpY2UgKmRtZGV2KQoreworCXJldHVybiBfaW5pdF9haXJvX2NhcmQgKCBpcnEsIHBvcnQsIGlzX3BjbWNpYSwgTlVMTCwgZG1kZXYpOworfQorCitFWFBPUlRfU1lNQk9MKGluaXRfYWlyb19jYXJkKTsKKworc3RhdGljIGludCB3YWl0YnVzeSAoc3RydWN0IGFpcm9faW5mbyAqYWkpIHsKKwlpbnQgZGVsYXkgPSAwOworCXdoaWxlICgoSU40NTAwIChhaSwgQ09NTUFORCkgJiBDT01NQU5EX0JVU1kpICYgKGRlbGF5IDwgMTAwMDApKSB7CisJCXVkZWxheSAoMTApOworCQlpZiAoKCsrZGVsYXkgJSAyMCkgPT0gMCkKKwkJCU9VVDQ1MDAoYWksIEVWQUNLLCBFVl9DTEVBUkNPTU1BTkRCVVNZKTsKKwl9CisJcmV0dXJuIGRlbGF5IDwgMTAwMDA7Cit9CisKK2ludCByZXNldF9haXJvX2NhcmQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCWludCBpOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCisJaWYgKHJlc2V0X2NhcmQgKGRldiwgMSkpCisJCXJldHVybiAtMTsKKworCWlmICggc2V0dXBfY2FyZChhaSwgZGV2LT5kZXZfYWRkciwgMSApICE9IFNVQ0NFU1MgKSB7CisJCXByaW50ayggS0VSTl9FUlIgImFpcm86IE1BQyBjb3VsZCBub3QgYmUgZW5hYmxlZFxuIiApOworCQlyZXR1cm4gLTE7CisJfQorCXByaW50ayggS0VSTl9JTkZPICJhaXJvOiBNQUMgZW5hYmxlZCAlcyAleDoleDoleDoleDoleDoleFxuIiwgZGV2LT5uYW1lLAorCQkJZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkJCWRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOworCS8qIEFsbG9jYXRlIHRoZSB0cmFuc21pdCBidWZmZXJzIGlmIG5lZWRlZCAqLworCWlmICghdGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpCisJCWZvciggaSA9IDA7IGkgPCBNQVhfRklEUzsgaSsrICkKKwkJCWFpLT5maWRzW2ldID0gdHJhbnNtaXRfYWxsb2NhdGUgKGFpLDIzMTIsaT49TUFYX0ZJRFMvMik7CisKKwllbmFibGVfaW50ZXJydXB0cyggYWkgKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0wocmVzZXRfYWlyb19jYXJkKTsKKworc3RhdGljIHZvaWQgYWlyb19zZW5kX2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJU3RhdHVzUmlkIHN0YXR1c19yaWQ7CisKKwljbGVhcl9iaXQoSk9CX0VWRU5ULCAmYWktPmZsYWdzKTsKKwlQQzQ1MDBfcmVhZHJpZChhaSwgUklEX1NUQVRVUywgJnN0YXR1c19yaWQsIHNpemVvZihzdGF0dXNfcmlkKSwgMCk7CisJdXAoJmFpLT5zZW0pOworCXdycXUuZGF0YS5sZW5ndGggPSAwOworCXdycXUuZGF0YS5mbGFncyA9IDA7CisJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBzdGF0dXNfcmlkLmJzc2lkWzBdLCBFVEhfQUxFTik7CisJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCS8qIFNlbmQgZXZlbnQgdG8gdXNlciBzcGFjZSAqLworCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKK30KKworc3RhdGljIGludCBhaXJvX3RocmVhZCh2b2lkICpkYXRhKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJaW50IGxvY2tlZDsKKwkKKwlkYWVtb25pemUoIiVzIiwgZGV2LT5uYW1lKTsKKwlhbGxvd19zaWduYWwoU0lHVEVSTSk7CisKKwl3aGlsZSgxKSB7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisKKwkJLyogbWFrZSBzd3N1c3AgaGFwcHkgd2l0aCBvdXIgdGhyZWFkICovCisJCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKKworCQlpZiAodGVzdF9iaXQoSk9CX0RJRSwgJmFpLT5mbGFncykpCisJCQlicmVhazsKKworCQlpZiAoYWktPmZsYWdzICYgSk9CX01BU0spIHsKKwkJCWxvY2tlZCA9IGRvd25faW50ZXJydXB0aWJsZSgmYWktPnNlbSk7CisJCX0gZWxzZSB7CisJCQl3YWl0X3F1ZXVlX3Qgd2FpdDsKKworCQkJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCQkJYWRkX3dhaXRfcXVldWUoJmFpLT50aHJfd2FpdCwgJndhaXQpOworCQkJZm9yICg7OykgeworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQkJaWYgKGFpLT5mbGFncyAmIEpPQl9NQVNLKQorCQkJCQlicmVhazsKKwkJCQlpZiAoYWktPmV4cGlyZXMpIHsKKwkJCQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcyxhaS0+ZXhwaXJlcykpeworCQkJCQkJc2V0X2JpdChKT0JfQVVUT1dFUCwmYWktPmZsYWdzKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJCXNjaGVkdWxlX3RpbWVvdXQoYWktPmV4cGlyZXMgLSBqaWZmaWVzKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfSBlbHNlIGlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJc2NoZWR1bGUoKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmYWktPnRocl93YWl0LCAmd2FpdCk7CisJCQlsb2NrZWQgPSAxOworCQl9CisKKwkJaWYgKGxvY2tlZCkKKwkJCWNvbnRpbnVlOworCisJCWlmICh0ZXN0X2JpdChKT0JfRElFLCAmYWktPmZsYWdzKSkgeworCQkJdXAoJmFpLT5zZW0pOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoYWktPnBvd2VyIHx8IHRlc3RfYml0KEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpKSB7CisJCQl1cCgmYWktPnNlbSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh0ZXN0X2JpdChKT0JfWE1JVCwgJmFpLT5mbGFncykpCisJCQlhaXJvX2VuZF94bWl0KGRldik7CisJCWVsc2UgaWYgKHRlc3RfYml0KEpPQl9YTUlUMTEsICZhaS0+ZmxhZ3MpKQorCQkJYWlyb19lbmRfeG1pdDExKGRldik7CisJCWVsc2UgaWYgKHRlc3RfYml0KEpPQl9TVEFUUywgJmFpLT5mbGFncykpCisJCQlhaXJvX3JlYWRfc3RhdHMoYWkpOworCQllbHNlIGlmICh0ZXN0X2JpdChKT0JfV1NUQVRTLCAmYWktPmZsYWdzKSkKKwkJCWFpcm9fcmVhZF93aXJlbGVzc19zdGF0cyhhaSk7CisJCWVsc2UgaWYgKHRlc3RfYml0KEpPQl9QUk9NSVNDLCAmYWktPmZsYWdzKSkKKwkJCWFpcm9fc2V0X3Byb21pc2MoYWkpOworI2lmZGVmIE1JQ1NVUFBPUlQKKwkJZWxzZSBpZiAodGVzdF9iaXQoSk9CX01JQywgJmFpLT5mbGFncykpCisJCQltaWNpbml0KGFpKTsKKyNlbmRpZgorCQllbHNlIGlmICh0ZXN0X2JpdChKT0JfRVZFTlQsICZhaS0+ZmxhZ3MpKQorCQkJYWlyb19zZW5kX2V2ZW50KGRldik7CisJCWVsc2UgaWYgKHRlc3RfYml0KEpPQl9BVVRPV0VQLCAmYWktPmZsYWdzKSkKKwkJCXRpbWVyX2Z1bmMoZGV2KTsKKwl9CisJY29tcGxldGVfYW5kX2V4aXQgKCZhaS0+dGhyX2V4aXRlZCwgMCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhaXJvX2ludGVycnVwdCAoIGludCBpcnEsIHZvaWQqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXUxNiBzdGF0dXM7CisJdTE2IGZpZDsKKwlzdHJ1Y3QgYWlyb19pbmZvICphcHJpdiA9IGRldi0+cHJpdjsKKwl1MTYgc2F2ZWRJbnRlcnJ1cHRzID0gMDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWZvciAoOzspIHsKKwkJc3RhdHVzID0gSU40NTAwKCBhcHJpdiwgRVZTVEFUICk7CisJCWlmICggIShzdGF0dXMgJiBTVEFUVVNfSU5UUykgfHwgc3RhdHVzID09IDB4ZmZmZiApIGJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisJCWlmICggc3RhdHVzICYgRVZfQVdBS0UgKSB7CisJCQlPVVQ0NTAwKCBhcHJpdiwgRVZBQ0ssIEVWX0FXQUtFICk7CisJCQlPVVQ0NTAwKCBhcHJpdiwgRVZBQ0ssIEVWX0FXQUtFICk7CisJCX0KKworCQlpZiAoIXNhdmVkSW50ZXJydXB0cykgeworCQkJc2F2ZWRJbnRlcnJ1cHRzID0gSU40NTAwKCBhcHJpdiwgRVZJTlRFTiApOworCQkJT1VUNDUwMCggYXByaXYsIEVWSU5URU4sIDAgKTsKKwkJfQorCisJCWlmICggc3RhdHVzICYgRVZfTUlDICkgeworCQkJT1VUNDUwMCggYXByaXYsIEVWQUNLLCBFVl9NSUMgKTsKKyNpZmRlZiBNSUNTVVBQT1JUCisJCQlpZiAodGVzdF9iaXQoRkxBR19NSUNfQ0FQQUJMRSwgJmFwcml2LT5mbGFncykpIHsKKwkJCQlzZXRfYml0KEpPQl9NSUMsICZhcHJpdi0+ZmxhZ3MpOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYXByaXYtPnRocl93YWl0KTsKKwkJCX0KKyNlbmRpZgorCQl9CisJCWlmICggc3RhdHVzICYgRVZfTElOSyApIHsKKwkJCXVuaW9uIGl3cmVxX2RhdGEJd3JxdTsKKwkJCS8qIFRoZSBsaW5rIHN0YXR1cyBoYXMgY2hhbmdlZCwgaWYgeW91IHdhbnQgdG8gcHV0IGEKKwkJCSAgIG1vbml0b3IgaG9vayBpbiwgZG8gaXQgaGVyZS4gIChSZW1lbWJlciB0aGF0CisJCQkgICBpbnRlcnJ1cHRzIGFyZSBzdGlsbCBkaXNhYmxlZCEpCisJCQkqLworCQkJdTE2IG5ld1N0YXR1cyA9IElONDUwMChhcHJpdiwgTElOS1NUQVQpOworCQkJT1VUNDUwMCggYXByaXYsIEVWQUNLLCBFVl9MSU5LKTsKKwkJCS8qIEhlcmUgaXMgd2hhdCBuZXdTdGF0dXMgbWVhbnM6ICovCisjZGVmaW5lIE5PQkVBQ09OIDB4ODAwMCAvKiBMb3NzIG9mIHN5bmMgLSBtaXNzZWQgYmVhY29ucyAqLworI2RlZmluZSBNQVhSRVRSSUVTIDB4ODAwMSAvKiBMb3NzIG9mIHN5bmMgLSBtYXggcmV0cmllcyAqLworI2RlZmluZSBNQVhBUkwgMHg4MDAyIC8qIExvc3Mgb2Ygc3luYyAtIGF2ZXJhZ2UgcmV0cnkgbGV2ZWwgZXhjZWVkZWQqLworI2RlZmluZSBGT1JDRUxPU1MgMHg4MDAzIC8qIExvc3Mgb2Ygc3luYyAtIGhvc3QgcmVxdWVzdCAqLworI2RlZmluZSBUU0ZTWU5DIDB4ODAwNCAvKiBMb3NzIG9mIHN5bmMgLSBUU0Ygc3luY2hyb25pemF0aW9uICovCisjZGVmaW5lIERFQVVUSCAweDgxMDAgLyogRGVhdXRoZW50aWNhdGlvbiAobG93IGJ5dGUgaXMgcmVhc29uIGNvZGUpICovCisjZGVmaW5lIERJU0FTUyAweDgyMDAgLyogRGlzYXNzb2NpYXRpb24gKGxvdyBieXRlIGlzIHJlYXNvbiBjb2RlKSAqLworI2RlZmluZSBBU1NGQUlMIDB4ODQwMCAvKiBBc3NvY2lhdGlvbiBmYWlsdXJlIChsb3cgYnl0ZSBpcyByZWFzb24KKwkJCSAgY29kZSkgKi8KKyNkZWZpbmUgQVVUSEZBSUwgMHgwMzAwIC8qIEF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgKGxvdyBieXRlIGlzIHJlYXNvbgorCQkJICAgY29kZSkgKi8KKyNkZWZpbmUgQVNTT0NJQVRFRCAweDA0MDAgLyogQXNzb2NhdGllZCAqLworI2RlZmluZSBSQ19SRVNFUlZFRCAwIC8qIFJlc2VydmVkIHJldHVybiBjb2RlICovCisjZGVmaW5lIFJDX05PUkVBU09OIDEgLyogVW5zcGVjaWZpZWQgcmVhc29uICovCisjZGVmaW5lIFJDX0FVVEhJTlYgMiAvKiBQcmV2aW91cyBhdXRoZW50aWNhdGlvbiBpbnZhbGlkICovCisjZGVmaW5lIFJDX0RFQVVUSCAzIC8qIERlYXV0aGVudGljYXRlZCBiZWNhdXNlIHNlbmRpbmcgc3RhdGlvbiBpcworCQkgICAgICAgbGVhdmluZyAqLworI2RlZmluZSBSQ19OT0FDVCA0IC8qIERpc2Fzc29jaWF0ZWQgZHVlIHRvIGluYWN0aXZpdHkgKi8KKyNkZWZpbmUgUkNfTUFYTE9BRCA1IC8qIERpc2Fzc29jaWF0ZWQgYmVjYXVzZSBBUCBpcyB1bmFibGUgdG8gaGFuZGxlCisJCQlhbGwgY3VycmVudGx5IGFzc29jaWF0ZWQgc3RhdGlvbnMgKi8KKyNkZWZpbmUgUkNfQkFEQ0xBU1MyIDYgLyogQ2xhc3MgMiBmcmFtZSByZWNlaXZlZCBmcm9tCisJCQkgIG5vbi1BdXRoZW50aWNhdGVkIHN0YXRpb24gKi8KKyNkZWZpbmUgUkNfQkFEQ0xBU1MzIDcgLyogQ2xhc3MgMyBmcmFtZSByZWNlaXZlZCBmcm9tCisJCQkgIG5vbi1Bc3NvY2lhdGVkIHN0YXRpb24gKi8KKyNkZWZpbmUgUkNfU1RBVExFQVZFIDggLyogRGlzYXNzb2NpYXRlZCBiZWNhdXNlIHNlbmRpbmcgc3RhdGlvbiBpcworCQkJICBsZWF2aW5nIEJTUyAqLworI2RlZmluZSBSQ19OT0FVVEggOSAvKiBTdGF0aW9uIHJlcXVlc3RpbmcgKFJlKUFzc29jaWF0aW9uIGlzIG5vdAorCQkgICAgICAgQXV0aGVudGljYXRlZCB3aXRoIHRoZSByZXNwb25kaW5nIHN0YXRpb24gKi8KKwkJCWlmIChuZXdTdGF0dXMgIT0gQVNTT0NJQVRFRCkgeworCQkJCWlmIChhdXRvX3dlcCAmJiAhYXByaXYtPmV4cGlyZXMpIHsKKwkJCQkJYXByaXYtPmV4cGlyZXMgPSBSVU5fQVQoMypIWik7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYXByaXYtPnRocl93YWl0KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGFwcml2LT50YXNrOworCQkJCWlmIChhdXRvX3dlcCkKKwkJCQkJYXByaXYtPmV4cGlyZXMgPSAwOworCQkJCWlmICh0YXNrKQorCQkJCQl3YWtlX3VwX3Byb2Nlc3MgKHRhc2spOworCQkJCXNldF9iaXQoRkxBR19VUERBVEVfVU5JLCAmYXByaXYtPmZsYWdzKTsKKwkJCQlzZXRfYml0KEZMQUdfVVBEQVRFX01VTFRJLCAmYXByaXYtPmZsYWdzKTsKKwkJCX0KKwkJCS8qIFF1ZXN0aW9uIDogaXMgQVNTT0NJQVRFRCB0aGUgb25seSBzdGF0dXMKKwkJCSAqIHRoYXQgaXMgdmFsaWQgPyBXZSB3YW50IHRvIGNhdGNoIGhhbmRvdmVyCisJCQkgKiBhbmQgcmVhc3NvY2lhdGlvbnMgYXMgdmFsaWQgc3RhdHVzCisJCQkgKiBKZWFuIElJICovCisJCQlpZihuZXdTdGF0dXMgPT0gQVNTT0NJQVRFRCkgeworCQkJCWlmIChhcHJpdi0+c2Nhbl90aW1lc3RhbXApIHsKKwkJCQkJLyogU2VuZCBhbiBlbXB0eSBldmVudCB0byB1c2VyIHNwYWNlLgorCQkJCQkgKiBXZSBkb24ndCBzZW5kIHRoZSByZWNlaXZlZCBkYXRhIG9uCisJCQkJCSAqIHRoZSBldmVudCBiZWNhdXNlIGl0IHdvdWxkIHJlcXVpcmUKKwkJCQkJICogdXMgdG8gZG8gY29tcGxleCB0cmFuc2NvZGluZywgYW5kCisJCQkJCSAqIHdlIHdhbnQgdG8gbWluaW1pc2UgdGhlIHdvcmsgZG9uZSBpbgorCQkJCQkgKiB0aGUgaXJxIGhhbmRsZXIuIFVzZSBhIHJlcXVlc3QgdG8KKwkJCQkJICogZXh0cmFjdCB0aGUgZGF0YSAtIEplYW4gSUkgKi8KKwkJCQkJd3JxdS5kYXRhLmxlbmd0aCA9IDA7CisJCQkJCXdycXUuZGF0YS5mbGFncyA9IDA7CisJCQkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXU0NBTiwgJndycXUsIE5VTEwpOworCQkJCQlhcHJpdi0+c2Nhbl90aW1lc3RhbXAgPSAwOworCQkJCX0KKwkJCQlpZiAoZG93bl90cnlsb2NrKCZhcHJpdi0+c2VtKSAhPSAwKSB7CisJCQkJCXNldF9iaXQoSk9CX0VWRU5ULCAmYXByaXYtPmZsYWdzKTsKKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhcHJpdi0+dGhyX3dhaXQpOworCQkJCX0gZWxzZQorCQkJCQlhaXJvX3NlbmRfZXZlbnQoZGV2KTsKKwkJCX0gZWxzZSB7CisJCQkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAnXDAnLCBFVEhfQUxFTik7CisJCQkJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCQkJCS8qIFNlbmQgZXZlbnQgdG8gdXNlciBzcGFjZSAqLworCQkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXQVAsICZ3cnF1LE5VTEwpOworCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0byByZWNlaXZlICovCisJCWlmICggc3RhdHVzICYgRVZfUlggICkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJCQl1MTYgZmMsIGxlbiwgaGRybGVuID0gMDsKKyNwcmFnbWEgcGFjaygxKQorCQkJc3RydWN0IHsKKwkJCQl1MTYgc3RhdHVzLCBsZW47CisJCQkJdTggcnNzaVsyXTsKKwkJCQl1OCByYXRlOworCQkJCXU4IGZyZXE7CisJCQkJdTE2IHRtcFs0XTsKKwkJCX0gaGRyOworI3ByYWdtYSBwYWNrKCkKKwkJCXUxNiBnYXA7CisJCQl1MTYgdG1wYnVmWzRdOworCQkJdTE2ICpidWZmZXI7CisKKwkJCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYXByaXYtPmZsYWdzKSkgeworCQkJCWlmICh0ZXN0X2JpdChGTEFHXzgwMl8xMSwgJmFwcml2LT5mbGFncykpCisJCQkJCW1waV9yZWNlaXZlXzgwMl8xMShhcHJpdik7CisJCQkJZWxzZQorCQkJCQltcGlfcmVjZWl2ZV84MDJfMyhhcHJpdik7CisJCQkJT1VUNDUwMChhcHJpdiwgRVZBQ0ssIEVWX1JYKTsKKwkJCQlnb3RvIGV4aXRyeDsKKwkJCX0KKworCQkJZmlkID0gSU40NTAwKCBhcHJpdiwgUlhGSUQgKTsKKworCQkJLyogR2V0IHRoZSBwYWNrZXQgbGVuZ3RoICovCisJCQlpZiAodGVzdF9iaXQoRkxBR184MDJfMTEsICZhcHJpdi0+ZmxhZ3MpKSB7CisJCQkJYmFwX3NldHVwIChhcHJpdiwgZmlkLCA0LCBCQVAwKTsKKwkJCQliYXBfcmVhZCAoYXByaXYsICh1MTYqKSZoZHIsIHNpemVvZihoZHIpLCBCQVAwKTsKKwkJCQkvKiBCYWQgQ1JDLiBJZ25vcmUgcGFja2V0ICovCisJCQkJaWYgKGxlMTZfdG9fY3B1KGhkci5zdGF0dXMpICYgMikKKwkJCQkJaGRyLmxlbiA9IDA7CisJCQkJaWYgKGFwcml2LT53aWZpZGV2ID09IE5VTEwpCisJCQkJCWhkci5sZW4gPSAwOworCQkJfSBlbHNlIHsKKwkJCQliYXBfc2V0dXAgKGFwcml2LCBmaWQsIDB4MzYsIEJBUDApOworCQkJCWJhcF9yZWFkIChhcHJpdiwgKHUxNiopJmhkci5sZW4sIDIsIEJBUDApOworCQkJfQorCQkJbGVuID0gbGUxNl90b19jcHUoaGRyLmxlbik7CisKKwkJCWlmIChsZW4gPiAyMzEyKSB7CisJCQkJcHJpbnRrKCBLRVJOX0VSUiAiYWlybzogQmFkIHNpemUgJWRcbiIsIGxlbiApOworCQkJCWdvdG8gYmFkcng7CisJCQl9CisJCQlpZiAobGVuID09IDApCisJCQkJZ290byBiYWRyeDsKKworCQkJaWYgKHRlc3RfYml0KEZMQUdfODAyXzExLCAmYXByaXYtPmZsYWdzKSkgeworCQkJCWJhcF9yZWFkIChhcHJpdiwgKHUxNiopJmZjLCBzaXplb2YoZmMpLCBCQVAwKTsKKwkJCQlmYyA9IGxlMTZfdG9fY3B1KGZjKTsKKwkJCQlzd2l0Y2ggKGZjICYgMHhjKSB7CisJCQkJCWNhc2UgNDoKKwkJCQkJCWlmICgoZmMgJiAweGUwKSA9PSAweGMwKQorCQkJCQkJCWhkcmxlbiA9IDEwOworCQkJCQkJZWxzZQorCQkJCQkJCWhkcmxlbiA9IDE2OworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgODoKKwkJCQkJCWlmICgoZmMmMHgzMDApPT0weDMwMCl7CisJCQkJCQkJaGRybGVuID0gMzA7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCWRlZmF1bHQ6CisJCQkJCQloZHJsZW4gPSAyNDsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQloZHJsZW4gPSBFVEhfQUxFTiAqIDI7CisKKwkJCXNrYiA9IGRldl9hbGxvY19za2IoIGxlbiArIGhkcmxlbiArIDIgKyAyICk7CisJCQlpZiAoICFza2IgKSB7CisJCQkJYXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlnb3RvIGJhZHJ4OworCQkJfQorCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsgLyogVGhpcyB3YXkgdGhlIElQIGhlYWRlciBpcyBhbGlnbmVkICovCisJCQlidWZmZXIgPSAodTE2Kilza2JfcHV0IChza2IsIGxlbiArIGhkcmxlbik7CisJCQlpZiAodGVzdF9iaXQoRkxBR184MDJfMTEsICZhcHJpdi0+ZmxhZ3MpKSB7CisJCQkJYnVmZmVyWzBdID0gZmM7CisJCQkJYmFwX3JlYWQgKGFwcml2LCBidWZmZXIgKyAxLCBoZHJsZW4gLSAyLCBCQVAwKTsKKwkJCQlpZiAoaGRybGVuID09IDI0KQorCQkJCQliYXBfcmVhZCAoYXByaXYsIHRtcGJ1ZiwgNiwgQkFQMCk7CisKKwkJCQliYXBfcmVhZCAoYXByaXYsICZnYXAsIHNpemVvZihnYXApLCBCQVAwKTsKKwkJCQlnYXAgPSBsZTE2X3RvX2NwdShnYXApOworCQkJCWlmIChnYXApIHsKKwkJCQkJaWYgKGdhcCA8PSA4KQorCQkJCQkJYmFwX3JlYWQgKGFwcml2LCB0bXBidWYsIGdhcCwgQkFQMCk7CisJCQkJCWVsc2UKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAiYWlybzogZ2FwbGVuIHRvbyBiaWcuIFByb2JsZW1zIHdpbGwgZm9sbG93Li4uXG4iKTsKKwkJCQl9CisJCQkJYmFwX3JlYWQgKGFwcml2LCBidWZmZXIgKyBoZHJsZW4vMiwgbGVuLCBCQVAwKTsKKwkJCX0gZWxzZSB7CisjaWZkZWYgTUlDU1VQUE9SVAorCQkJCU1JQ0J1ZmZlciBtaWNidWY7CisjZW5kaWYKKwkJCQliYXBfcmVhZCAoYXByaXYsIGJ1ZmZlciwgRVRIX0FMRU4qMiwgQkFQMCk7CisjaWZkZWYgTUlDU1VQUE9SVAorCQkJCWlmIChhcHJpdi0+bWljc3RhdHMuZW5hYmxlZCkgeworCQkJCQliYXBfcmVhZCAoYXByaXYsKHUxNiopJm1pY2J1ZixzaXplb2YobWljYnVmKSxCQVAwKTsKKwkJCQkJaWYgKG50b2hzKG1pY2J1Zi50eXBlbGVuKSA+IDB4MDVEQykKKwkJCQkJCWJhcF9zZXR1cCAoYXByaXYsIGZpZCwgMHg0NCwgQkFQMCk7CisJCQkJCWVsc2UgeworCQkJCQkJaWYgKGxlbiA8PSBzaXplb2YobWljYnVmKSkKKwkJCQkJCQlnb3RvIGJhZG1pYzsKKworCQkJCQkJbGVuIC09IHNpemVvZihtaWNidWYpOworCQkJCQkJc2tiX3RyaW0gKHNrYiwgbGVuICsgaGRybGVuKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZgorCQkJCWJhcF9yZWFkKGFwcml2LGJ1ZmZlcitFVEhfQUxFTixsZW4sQkFQMCk7CisjaWZkZWYgTUlDU1VQUE9SVAorCQkJCWlmIChkZWNhcHN1bGF0ZShhcHJpdiwmbWljYnVmLChldGhlckhlYWQqKWJ1ZmZlcixsZW4pKSB7CitiYWRtaWM6CisJCQkJCWRldl9rZnJlZV9za2JfaXJxIChza2IpOworI2Vsc2UKKwkJCQlpZiAoMCkgeworI2VuZGlmCitiYWRyeDoKKwkJCQkJT1VUNDUwMCggYXByaXYsIEVWQUNLLCBFVl9SWCk7CisJCQkJCWdvdG8gZXhpdHJ4OworCQkJCX0KKwkJCX0KKyNpZmRlZiBXSVJFTEVTU19TUFkKKwkJCWlmIChhcHJpdi0+c3B5X2RhdGEuc3B5X251bWJlciA+IDApIHsKKwkJCQljaGFyICpzYTsKKwkJCQlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisJCQkJLyogUHJlcGFyZSBzcHkgZGF0YSA6IGFkZHIgKyBxdWFsICovCisJCQkJaWYgKCF0ZXN0X2JpdChGTEFHXzgwMl8xMSwgJmFwcml2LT5mbGFncykpIHsKKwkJCQkJc2EgPSAoY2hhciopYnVmZmVyICsgNjsKKwkJCQkJYmFwX3NldHVwIChhcHJpdiwgZmlkLCA4LCBCQVAwKTsKKwkJCQkJYmFwX3JlYWQgKGFwcml2LCAodTE2KiloZHIucnNzaSwgMiwgQkFQMCk7CisJCQkJfSBlbHNlCisJCQkJCXNhID0gKGNoYXIqKWJ1ZmZlciArIDEwOworCQkJCXdzdGF0cy5xdWFsID0gaGRyLnJzc2lbMF07CisJCQkJaWYgKGFwcml2LT5yc3NpKQorCQkJCQl3c3RhdHMubGV2ZWwgPSAweDEwMCAtIGFwcml2LT5yc3NpW2hkci5yc3NpWzFdXS5yc3NpZEJtOworCQkJCWVsc2UKKwkJCQkJd3N0YXRzLmxldmVsID0gKGhkci5yc3NpWzFdICsgMzIxKSAvIDI7CisJCQkJd3N0YXRzLnVwZGF0ZWQgPSAzOwkKKwkJCQkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KKwkJCQl3aXJlbGVzc19zcHlfdXBkYXRlKGRldiwgc2EsICZ3c3RhdHMpOworCQkJfQorI2VuZGlmIC8qIFdJUkVMRVNTX1NQWSAqLworCQkJT1VUNDUwMCggYXByaXYsIEVWQUNLLCBFVl9SWCk7CisKKwkJCWlmICh0ZXN0X2JpdChGTEFHXzgwMl8xMSwgJmFwcml2LT5mbGFncykpIHsKKwkJCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJCQkJc2tiLT5kZXYgPSBhcHJpdi0+d2lmaWRldjsKKwkJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOworCQkJfSBlbHNlIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCQl9CisJCQlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisKKwkJCW5ldGlmX3J4KCBza2IgKTsKKwkJfQorZXhpdHJ4OgorCisJCS8qIENoZWNrIHRvIHNlZSBpZiBhIHBhY2tldCBoYXMgYmVlbiB0cmFuc21pdHRlZCAqLworCQlpZiAoICBzdGF0dXMgJiAoIEVWX1RYfEVWX1RYQ1BZfEVWX1RYRVhDICkgKSB7CisJCQlpbnQgaTsKKwkJCWludCBsZW4gPSAwOworCQkJaW50IGluZGV4ID0gLTE7CisKKwkJCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYXByaXYtPmZsYWdzKSkgeworCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJCQlpZiAoc3RhdHVzICYgRVZfVFhFWEMpCisJCQkJCWdldF90eF9lcnJvcihhcHJpdiwgLTEpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZhcHJpdi0+YXV4X2xvY2ssIGZsYWdzKTsKKwkJCQlpZiAoc2tiX3F1ZXVlX2xlbiAoJmFwcml2LT50eHEpKSB7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwcml2LT5hdXhfbG9jayxmbGFncyk7CisJCQkJCW1waV9zZW5kX3BhY2tldCAoZGV2KTsKKwkJCQl9IGVsc2UgeworCQkJCQljbGVhcl9iaXQoRkxBR19QRU5ESU5HX1hNSVQsICZhcHJpdi0+ZmxhZ3MpOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcHJpdi0+YXV4X2xvY2ssZmxhZ3MpOworCQkJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQkJCX0KKwkJCQlPVVQ0NTAwKCBhcHJpdiwgRVZBQ0ssCisJCQkJCXN0YXR1cyAmIChFVl9UWHxFVl9UWENQWXxFVl9UWEVYQykpOworCQkJCWdvdG8gZXhpdHR4OworCQkJfQorCisJCQlmaWQgPSBJTjQ1MDAoYXByaXYsIFRYQ09NUExGSUQpOworCisJCQlmb3IoIGkgPSAwOyBpIDwgTUFYX0ZJRFM7IGkrKyApIHsKKwkJCQlpZiAoICggYXByaXYtPmZpZHNbaV0gJiAweGZmZmYgKSA9PSBmaWQgKSB7CisJCQkJCWxlbiA9IGFwcml2LT5maWRzW2ldID4+IDE2OworCQkJCQlpbmRleCA9IGk7CisJCQkJfQorCQkJfQorCQkJaWYgKGluZGV4ICE9IC0xKSB7CisJCQkJaWYgKHN0YXR1cyAmIEVWX1RYRVhDKQorCQkJCQlnZXRfdHhfZXJyb3IoYXByaXYsIGluZGV4KTsKKwkJCQlPVVQ0NTAwKCBhcHJpdiwgRVZBQ0ssIHN0YXR1cyAmIChFVl9UWCB8IEVWX1RYRVhDKSk7CisJCQkJLyogU2V0IHVwIHRvIGJlIHVzZWQgYWdhaW4gKi8KKwkJCQlhcHJpdi0+Zmlkc1tpbmRleF0gJj0gMHhmZmZmOworCQkJCWlmIChpbmRleCA8IE1BWF9GSURTIC8gMikgeworCQkJCQlpZiAoIXRlc3RfYml0KEZMQUdfUEVORElOR19YTUlULCAmYXByaXYtPmZsYWdzKSkKKwkJCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIXRlc3RfYml0KEZMQUdfUEVORElOR19YTUlUMTEsICZhcHJpdi0+ZmxhZ3MpKQorCQkJCQkJbmV0aWZfd2FrZV9xdWV1ZShhcHJpdi0+d2lmaWRldik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlPVVQ0NTAwKCBhcHJpdiwgRVZBQ0ssIHN0YXR1cyAmIChFVl9UWCB8IEVWX1RYQ1BZIHwgRVZfVFhFWEMpKTsKKwkJCQlwcmludGsoIEtFUk5fRVJSICJhaXJvOiBVbmFsbG9jYXRlZCBGSUQgd2FzIHVzZWQgdG8geG1pdFxuIiApOworCQkJfQorCQl9CitleGl0dHg6CisJCWlmICggc3RhdHVzICYgflNUQVRVU19JTlRTICYgfklHTk9SRV9JTlRTICkKKwkJCXByaW50ayggS0VSTl9XQVJOSU5HICJhaXJvOiBHb3Qgd2VpcmQgc3RhdHVzICV4XG4iLAorCQkJCXN0YXR1cyAmIH5TVEFUVVNfSU5UUyAmIH5JR05PUkVfSU5UUyApOworCX0KKworCWlmIChzYXZlZEludGVycnVwdHMpCisJCU9VVDQ1MDAoIGFwcml2LCBFVklOVEVOLCBzYXZlZEludGVycnVwdHMgKTsKKworCS8qIGRvbmUuLiAqLworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKgorICogIFJvdXRpbmVzIHRvIHRhbGsgdG8gdGhlIGNhcmQKKyAqLworCisvKgorICogIFRoaXMgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgdGhlIDQ1MDAsIGhlbmNlIHRoZSBuYW1lCisgKiAgTk9URTogIElmIHVzZSB3aXRoIDhiaXQgbW9kZSBhbmQgU01QIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4hCisgKiAgICAgICAgIFdoeSB3b3VsZCBzb21lIG9uZSBkbyA4IGJpdCBJTyBpbiBhbiBTTVAgbWFjaGluZT8hPworICovCitzdGF0aWMgdm9pZCBPVVQ0NTAwKCBzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IHJlZywgdTE2IHZhbCApIHsKKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpCisJCXJlZyA8PD0gMTsKKwlpZiAoICFkbzhiaXRJTyApCisJCW91dHcoIHZhbCwgYWktPmRldi0+YmFzZV9hZGRyICsgcmVnICk7CisJZWxzZSB7CisJCW91dGIoIHZhbCAmIDB4ZmYsIGFpLT5kZXYtPmJhc2VfYWRkciArIHJlZyApOworCQlvdXRiKCB2YWwgPj4gOCwgYWktPmRldi0+YmFzZV9hZGRyICsgcmVnICsgMSApOworCX0KK30KKworc3RhdGljIHUxNiBJTjQ1MDAoIHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcmVnICkgeworCXVuc2lnbmVkIHNob3J0IHJjOworCisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKQorCQlyZWcgPDw9IDE7CisJaWYgKCAhZG84Yml0SU8gKQorCQlyYyA9IGludyggYWktPmRldi0+YmFzZV9hZGRyICsgcmVnICk7CisJZWxzZSB7CisJCXJjID0gaW5iKCBhaS0+ZGV2LT5iYXNlX2FkZHIgKyByZWcgKTsKKwkJcmMgKz0gKChpbnQpaW5iKCBhaS0+ZGV2LT5iYXNlX2FkZHIgKyByZWcgKyAxICkpIDw8IDg7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbmFibGVfTUFDKCBzdHJ1Y3QgYWlyb19pbmZvICphaSwgUmVzcCAqcnNwLCBpbnQgbG9jayApIHsKKwlpbnQgcmM7CisgICAgICAgIENtZCBjbWQ7CisKKwkvKiBGTEFHX1JBRElPX09GRiA6IFJhZGlvIGRpc2FibGVkIHZpYSAvcHJvYyBvciBXaXJlbGVzcyBFeHRlbnNpb25zCisJICogRkxBR19SQURJT19ET1dOIDogUmFkaW8gZGlzYWJsZWQgdmlhICJpZmNvbmZpZyBldGhYIGRvd24iCisJICogTm90ZSA6IHdlIGNvdWxkIHRyeSB0byB1c2UgIW5ldGlmX3J1bm5pbmcoZGV2KSBpbiBlbmFibGVfTUFDKCkKKwkgKiBpbnN0ZWFkIG9mIHRoaXMgZmxhZywgYnV0IEkgZG9uJ3QgdHJ1c3QgaXQgKndpdGhpbiogdGhlCisJICogb3Blbi9jbG9zZSBmdW5jdGlvbnMsIGFuZCB0ZXN0aW5nIGJvdGggZmxhZ3MgdG9nZXRoZXIgaXMKKwkgKiAiY2hlYXBlciIgLSBKZWFuIElJICovCisJaWYgKGFpLT5mbGFncyAmIEZMQUdfUkFESU9fTUFTSykgcmV0dXJuIFNVQ0NFU1M7CisKKwlpZiAobG9jayAmJiBkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKCF0ZXN0X2JpdChGTEFHX0VOQUJMRUQsICZhaS0+ZmxhZ3MpKSB7CisJCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJCWNtZC5jbWQgPSBNQUNfRU5BQkxFOworCQlyYyA9IGlzc3VlY29tbWFuZChhaSwgJmNtZCwgcnNwKTsKKwkJaWYgKHJjID09IFNVQ0NFU1MpCisJCQlzZXRfYml0KEZMQUdfRU5BQkxFRCwgJmFpLT5mbGFncyk7CisJfSBlbHNlCisJCXJjID0gU1VDQ0VTUzsKKworCWlmIChsb2NrKQorCSAgICB1cCgmYWktPnNlbSk7CisKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBlbmFibGUgTUFDLCBlcnI9JWRcbiIsCisJCQlfX0ZVTkNUSU9OX18scmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9NQUMoIHN0cnVjdCBhaXJvX2luZm8gKmFpLCBpbnQgbG9jayApIHsKKyAgICAgICAgQ21kIGNtZDsKKwlSZXNwIHJzcDsKKworCWlmIChsb2NrICYmIGRvd25faW50ZXJydXB0aWJsZSgmYWktPnNlbSkpCisJCXJldHVybjsKKworCWlmICh0ZXN0X2JpdChGTEFHX0VOQUJMRUQsICZhaS0+ZmxhZ3MpKSB7CisJCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJCWNtZC5jbWQgPSBNQUNfRElTQUJMRTsgLy8gZGlzYWJsZSBpbiBjYXNlIGFscmVhZHkgZW5hYmxlZAorCQlpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCQljbGVhcl9iaXQoRkxBR19FTkFCTEVELCAmYWktPmZsYWdzKTsKKwl9CisJaWYgKGxvY2spCisJCXVwKCZhaS0+c2VtKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2ludGVycnVwdHMoIHN0cnVjdCBhaXJvX2luZm8gKmFpICkgeworCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0cyAqLworCU9VVDQ1MDAoIGFpLCBFVklOVEVOLCBTVEFUVVNfSU5UUyApOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX2ludGVycnVwdHMoIHN0cnVjdCBhaXJvX2luZm8gKmFpICkgeworCU9VVDQ1MDAoIGFpLCBFVklOVEVOLCAwICk7Cit9CisKK3N0YXRpYyB2b2lkIG1waV9yZWNlaXZlXzgwMl8zKHN0cnVjdCBhaXJvX2luZm8gKmFpKQoreworCVJ4RmlkIHJ4ZDsKKwlpbnQgbGVuID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWNoYXIgKmJ1ZmZlcjsKKyNpZmRlZiBNSUNTVVBQT1JUCisJaW50IG9mZiA9IDA7CisJTUlDQnVmZmVyIG1pY2J1ZjsKKyNlbmRpZgorCisJbWVtY3B5X2Zyb21pbygmcnhkLCBhaS0+cnhmaWRzWzBdLmNhcmRfcmFtX29mZiwgc2l6ZW9mKHJ4ZCkpOworCS8qIE1ha2Ugc3VyZSB3ZSBnb3Qgc29tZXRoaW5nICovCisJaWYgKHJ4ZC5yZHkgJiYgcnhkLnZhbGlkID09IDApIHsKKwkJbGVuID0gcnhkLmxlbiArIDEyOworCQlpZiAobGVuIDwgMTIgfHwgbGVuID4gMjA0OCkKKwkJCWdvdG8gYmFkcng7CisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCQlpZiAoIXNrYikgeworCQkJYWktPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gYmFkcng7CisJCX0KKwkJYnVmZmVyID0gc2tiX3B1dChza2IsbGVuKTsKKyNpZmRlZiBNSUNTVVBQT1JUCisJCW1lbWNweShidWZmZXIsIGFpLT5yeGZpZHNbMF0udmlydHVhbF9ob3N0X2FkZHIsIEVUSF9BTEVOICogMik7CisJCWlmIChhaS0+bWljc3RhdHMuZW5hYmxlZCkgeworCQkJbWVtY3B5KCZtaWNidWYsCisJCQkJYWktPnJ4Zmlkc1swXS52aXJ0dWFsX2hvc3RfYWRkciArIEVUSF9BTEVOICogMiwKKwkJCQlzaXplb2YobWljYnVmKSk7CisJCQlpZiAobnRvaHMobWljYnVmLnR5cGVsZW4pIDw9IDB4MDVEQykgeworCQkJCWlmIChsZW4gPD0gc2l6ZW9mKG1pY2J1ZikgKyBFVEhfQUxFTiAqIDIpCisJCQkJCWdvdG8gYmFkbWljOworCisJCQkJb2ZmID0gc2l6ZW9mKG1pY2J1Zik7CisJCQkJc2tiX3RyaW0gKHNrYiwgbGVuIC0gb2ZmKTsKKwkJCX0KKwkJfQorCQltZW1jcHkoYnVmZmVyICsgRVRIX0FMRU4gKiAyLAorCQkJYWktPnJ4Zmlkc1swXS52aXJ0dWFsX2hvc3RfYWRkciArIEVUSF9BTEVOICogMiArIG9mZiwKKwkJCWxlbiAtIEVUSF9BTEVOICogMiAtIG9mZik7CisJCWlmIChkZWNhcHN1bGF0ZSAoYWksICZtaWNidWYsIChldGhlckhlYWQqKWJ1ZmZlciwgbGVuIC0gb2ZmIC0gRVRIX0FMRU4gKiAyKSkgeworYmFkbWljOgorCQkJZGV2X2tmcmVlX3NrYl9pcnEgKHNrYik7CisJCQlnb3RvIGJhZHJ4OworCQl9CisjZWxzZQorCQltZW1jcHkoYnVmZmVyLCBhaS0+cnhmaWRzWzBdLnZpcnR1YWxfaG9zdF9hZGRyLCBsZW4pOworI2VuZGlmCisjaWZkZWYgV0lSRUxFU1NfU1BZCisJCWlmIChhaS0+c3B5X2RhdGEuc3B5X251bWJlciA+IDApIHsKKwkJCWNoYXIgKnNhOworCQkJc3RydWN0IGl3X3F1YWxpdHkgd3N0YXRzOworCQkJLyogUHJlcGFyZSBzcHkgZGF0YSA6IGFkZHIgKyBxdWFsICovCisJCQlzYSA9IGJ1ZmZlciArIEVUSF9BTEVOOworCQkJd3N0YXRzLnF1YWwgPSAwOyAvKiBYWFggV2hlcmUgZG8gSSBnZXQgdGhhdCBpbmZvIGZyb20gPz8/ICovCisJCQl3c3RhdHMubGV2ZWwgPSAwOworCQkJd3N0YXRzLnVwZGF0ZWQgPSAwOworCQkJLyogVXBkYXRlIHNweSByZWNvcmRzICovCisJCQl3aXJlbGVzc19zcHlfdXBkYXRlKGFpLT5kZXYsIHNhLCAmd3N0YXRzKTsKKwkJfQorI2VuZGlmIC8qIFdJUkVMRVNTX1NQWSAqLworCisJCXNrYi0+ZGV2ID0gYWktPmRldjsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBhaS0+ZGV2KTsKKwkJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQluZXRpZl9yeChza2IpOworCX0KK2JhZHJ4OgorCWlmIChyeGQudmFsaWQgPT0gMCkgeworCQlyeGQudmFsaWQgPSAxOworCQlyeGQucmR5ID0gMDsKKwkJcnhkLmxlbiA9IFBLVFNJWkU7CisJCW1lbWNweV90b2lvKGFpLT5yeGZpZHNbMF0uY2FyZF9yYW1fb2ZmLCAmcnhkLCBzaXplb2YocnhkKSk7CisJfQorfQorCit2b2lkIG1waV9yZWNlaXZlXzgwMl8xMSAoc3RydWN0IGFpcm9faW5mbyAqYWkpCit7CisJUnhGaWQgcnhkOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXUxNiBmYywgbGVuLCBoZHJsZW4gPSAwOworI3ByYWdtYSBwYWNrKDEpCisJc3RydWN0IHsKKwkJdTE2IHN0YXR1cywgbGVuOworCQl1OCByc3NpWzJdOworCQl1OCByYXRlOworCQl1OCBmcmVxOworCQl1MTYgdG1wWzRdOworCX0gaGRyOworI3ByYWdtYSBwYWNrKCkKKwl1MTYgZ2FwOworCXUxNiAqYnVmZmVyOworCWNoYXIgKnB0ciA9IGFpLT5yeGZpZHNbMF0udmlydHVhbF9ob3N0X2FkZHIrNDsKKworCW1lbWNweV9mcm9taW8oJnJ4ZCwgYWktPnJ4Zmlkc1swXS5jYXJkX3JhbV9vZmYsIHNpemVvZihyeGQpKTsKKwltZW1jcHkgKChjaGFyICopJmhkciwgcHRyLCBzaXplb2YoaGRyKSk7CisJcHRyICs9IHNpemVvZihoZHIpOworCS8qIEJhZCBDUkMuIElnbm9yZSBwYWNrZXQgKi8KKwlpZiAobGUxNl90b19jcHUoaGRyLnN0YXR1cykgJiAyKQorCQloZHIubGVuID0gMDsKKwlpZiAoYWktPndpZmlkZXYgPT0gTlVMTCkKKwkJaGRyLmxlbiA9IDA7CisJbGVuID0gbGUxNl90b19jcHUoaGRyLmxlbik7CisJaWYgKGxlbiA+IDIzMTIpIHsKKwkJcHJpbnRrKCBLRVJOX0VSUiAiYWlybzogQmFkIHNpemUgJWRcbiIsIGxlbiApOworCQlnb3RvIGJhZHJ4OworCX0KKwlpZiAobGVuID09IDApCisJCWdvdG8gYmFkcng7CisKKwltZW1jcHkgKChjaGFyICopJmZjLCBwdHIsIHNpemVvZihmYykpOworCWZjID0gbGUxNl90b19jcHUoZmMpOworCXN3aXRjaCAoZmMgJiAweGMpIHsKKwkJY2FzZSA0OgorCQkJaWYgKChmYyAmIDB4ZTApID09IDB4YzApCisJCQkJaGRybGVuID0gMTA7CisJCQllbHNlCisJCQkJaGRybGVuID0gMTY7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJaWYgKChmYyYweDMwMCk9PTB4MzAwKXsKKwkJCQloZHJsZW4gPSAzMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCWhkcmxlbiA9IDI0OworCX0KKworCXNrYiA9IGRldl9hbGxvY19za2IoIGxlbiArIGhkcmxlbiArIDIgKTsKKwlpZiAoICFza2IgKSB7CisJCWFpLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWdvdG8gYmFkcng7CisJfQorCWJ1ZmZlciA9ICh1MTYqKXNrYl9wdXQgKHNrYiwgbGVuICsgaGRybGVuKTsKKwltZW1jcHkgKChjaGFyICopYnVmZmVyLCBwdHIsIGhkcmxlbik7CisJcHRyICs9IGhkcmxlbjsKKwlpZiAoaGRybGVuID09IDI0KQorCQlwdHIgKz0gNjsKKwltZW1jcHkgKChjaGFyICopJmdhcCwgcHRyLCBzaXplb2YoZ2FwKSk7CisJcHRyICs9IHNpemVvZihnYXApOworCWdhcCA9IGxlMTZfdG9fY3B1KGdhcCk7CisJaWYgKGdhcCkgeworCQlpZiAoZ2FwIDw9IDgpCisJCQlwdHIgKz0gZ2FwOworCQllbHNlCisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAiYWlybzogZ2FwbGVuIHRvbyBiaWcuIFByb2JsZW1zIHdpbGwgZm9sbG93Li4uXG4iKTsKKwl9CisJbWVtY3B5ICgoY2hhciAqKWJ1ZmZlciArIGhkcmxlbiwgcHRyLCBsZW4pOworCXB0ciArPSBsZW47CisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCSAgLyogZGVmaW5lZCBpbiBpd19oYW5kbGVyLmggKi8KKwlpZiAoYWktPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKSB7CisJCWNoYXIgKnNhOworCQlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisJCS8qIFByZXBhcmUgc3B5IGRhdGEgOiBhZGRyICsgcXVhbCAqLworCQlzYSA9IChjaGFyKilidWZmZXIgKyAxMDsKKwkJd3N0YXRzLnF1YWwgPSBoZHIucnNzaVswXTsKKwkJaWYgKGFpLT5yc3NpKQorCQkJd3N0YXRzLmxldmVsID0gMHgxMDAgLSBhaS0+cnNzaVtoZHIucnNzaVsxXV0ucnNzaWRCbTsKKwkJZWxzZQorCQkJd3N0YXRzLmxldmVsID0gKGhkci5yc3NpWzFdICsgMzIxKSAvIDI7CisJCXdzdGF0cy51cGRhdGVkID0gMzsKKwkJLyogVXBkYXRlIHNweSByZWNvcmRzICovCisJCXdpcmVsZXNzX3NweV91cGRhdGUoYWktPmRldiwgc2EsICZ3c3RhdHMpOworCX0KKyNlbmRpZiAvKiBJV19XSVJFTEVTU19TUFkgKi8KKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJc2tiLT5kZXYgPSBhaS0+d2lmaWRldjsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOworCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJbmV0aWZfcngoIHNrYiApOworYmFkcng6CisJaWYgKHJ4ZC52YWxpZCA9PSAwKSB7CisJCXJ4ZC52YWxpZCA9IDE7CisJCXJ4ZC5yZHkgPSAwOworCQlyeGQubGVuID0gUEtUU0laRTsKKwkJbWVtY3B5X3RvaW8oYWktPnJ4Zmlkc1swXS5jYXJkX3JhbV9vZmYsICZyeGQsIHNpemVvZihyeGQpKTsKKwl9Cit9CisKK3N0YXRpYyB1MTYgc2V0dXBfY2FyZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTggKm1hYywgaW50IGxvY2spCit7CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKKwlpbnQgc3RhdHVzOworCWludCBpOworCVNzaWRSaWQgbXlTc2lkOworCXUxNiBsYXN0aW5kZXg7CisJV2VwS2V5UmlkIHdrcjsKKwlpbnQgcmM7CisKKwltZW1zZXQoICZteVNzaWQsIDAsIHNpemVvZiggbXlTc2lkICkgKTsKKwlpZiAoYWktPmZsYXNoKSB7CisJCWtmcmVlIChhaS0+Zmxhc2gpOworCQlhaS0+Zmxhc2ggPSBOVUxMOworCX0KKworCS8qIFRoZSBOT1AgaXMgdGhlIGZpcnN0IHN0ZXAgaW4gZ2V0dGluZyB0aGUgY2FyZCBnb2luZyAqLworCWNtZC5jbWQgPSBOT1A7CisJY21kLnBhcm0wID0gY21kLnBhcm0xID0gY21kLnBhcm0yID0gMDsKKwlpZiAobG9jayAmJiBkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQlyZXR1cm4gRVJST1I7CisJaWYgKCBpc3N1ZWNvbW1hbmQoIGFpLCAmY21kLCAmcnNwICkgIT0gU1VDQ0VTUyApIHsKKwkJaWYgKGxvY2spCisJCQl1cCgmYWktPnNlbSk7CisJCXJldHVybiBFUlJPUjsKKwl9CisJZGlzYWJsZV9NQUMoIGFpLCAwKTsKKworCS8vIExldCdzIGZpZ3VyZSBvdXQgaWYgd2UgbmVlZCB0byB1c2UgdGhlIEFVWCBwb3J0CisJaWYgKCF0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkgeworCQljbWQuY21kID0gQ01EX0VOQUJMRUFVWDsKKwkJaWYgKGlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCkgIT0gU1VDQ0VTUykgeworCQkJaWYgKGxvY2spCisJCQkJdXAoJmFpLT5zZW0pOworCQkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiBFcnJvciBjaGVja2luZyBmb3IgQVVYIHBvcnRcbiIpOworCQkJcmV0dXJuIEVSUk9SOworCQl9CisJCWlmICghYXV4X2JhcCB8fCByc3Auc3RhdHVzICYgMHhmZjAwKSB7CisJCQlhaS0+YmFwX3JlYWQgPSBmYXN0X2JhcF9yZWFkOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImFpcm86IERvaW5nIGZhc3QgYmFwX3JlYWRzXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWFpLT5iYXBfcmVhZCA9IGF1eF9iYXBfcmVhZDsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJhaXJvOiBEb2luZyBBVVggYmFwX3JlYWRzXG4iKTsKKwkJfQorCX0KKwlpZiAobG9jaykKKwkJdXAoJmFpLT5zZW0pOworCWlmIChhaS0+Y29uZmlnLmxlbiA9PSAwKSB7CisJCXRkc1Jzc2lSaWQgcnNzaV9yaWQ7CisJCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsKKworCQlpZiAoYWktPkFQTGlzdCkgeworCQkJa2ZyZWUoYWktPkFQTGlzdCk7CisJCQlhaS0+QVBMaXN0ID0gTlVMTDsKKwkJfQorCQlpZiAoYWktPlNTSUQpIHsKKwkJCWtmcmVlKGFpLT5TU0lEKTsKKwkJCWFpLT5TU0lEID0gTlVMTDsKKwkJfQorCQkvLyBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gKHJlYWQvbW9kaWZ5L3dyaXRlKQorCQlzdGF0dXMgPSByZWFkQ29uZmlnUmlkKGFpLCBsb2NrKTsKKwkJaWYgKCBzdGF0dXMgIT0gU1VDQ0VTUyApIHJldHVybiBFUlJPUjsKKworCQlzdGF0dXMgPSByZWFkQ2FwYWJpbGl0eVJpZChhaSwgJmNhcF9yaWQsIGxvY2spOworCQlpZiAoIHN0YXR1cyAhPSBTVUNDRVNTICkgcmV0dXJuIEVSUk9SOworCisJCXN0YXR1cyA9IFBDNDUwMF9yZWFkcmlkKGFpLFJJRF9SU1NJLCZyc3NpX3JpZCxzaXplb2YocnNzaV9yaWQpLGxvY2spOworCQlpZiAoIHN0YXR1cyA9PSBTVUNDRVNTICkgeworCQkJaWYgKGFpLT5yc3NpIHx8IChhaS0+cnNzaSA9IGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMKSkgIT0gTlVMTCkKKwkJCQltZW1jcHkoYWktPnJzc2ksICh1OCopJnJzc2lfcmlkICsgMiwgNTEyKTsKKwkJfQorCQllbHNlIHsKKwkJCWlmIChhaS0+cnNzaSkgeworCQkJCWtmcmVlKGFpLT5yc3NpKTsKKwkJCQlhaS0+cnNzaSA9IE5VTEw7CisJCQl9CisJCQlpZiAoY2FwX3JpZC5zb2Z0Q2FwICYgOCkKKwkJCQlhaS0+Y29uZmlnLnJtb2RlIHw9IFJYTU9ERV9OT1JNQUxJWkVEX1JTU0k7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWlybzogdW5rbm93biByZWNlaXZlZCBzaWduYWwgbGV2ZWwgc2NhbGVcbiIpOworCQl9CisJCWFpLT5jb25maWcub3Btb2RlID0gYWRob2MgPyBNT0RFX1NUQV9JQlNTIDogTU9ERV9TVEFfRVNTOworCQlhaS0+Y29uZmlnLmF1dGhUeXBlID0gQVVUSF9PUEVOOworCQlhaS0+Y29uZmlnLm1vZHVsYXRpb24gPSBNT0RfQ0NLOworCisjaWZkZWYgTUlDU1VQUE9SVAorCQlpZiAoKGNhcF9yaWQubGVuPj1zaXplb2YoY2FwX3JpZCkpICYmIChjYXBfcmlkLmV4dFNvZnRDYXAmMSkgJiYKKwkJICAgIChtaWNzZXR1cChhaSkgPT0gU1VDQ0VTUykpIHsKKwkJCWFpLT5jb25maWcub3Btb2RlIHw9IE1PREVfTUlDOworCQkJc2V0X2JpdChGTEFHX01JQ19DQVBBQkxFLCAmYWktPmZsYWdzKTsKKwkJfQorI2VuZGlmCisKKwkJLyogU2F2ZSBvZmYgdGhlIE1BQyAqLworCQlmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKKwkJCW1hY1tpXSA9IGFpLT5jb25maWcubWFjQWRkcltpXTsKKwkJfQorCisJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGluc21vZCBjb25maWd1cmVkCisJCSAgIHJhdGVzIHRvIGFkZCAqLworCQlpZiAoIHJhdGVzWzBdICkgeworCQkJaW50IGkgPSAwOworCQkJbWVtc2V0KGFpLT5jb25maWcucmF0ZXMsMCxzaXplb2YoYWktPmNvbmZpZy5yYXRlcykpOworCQkJZm9yKCBpID0gMDsgaSA8IDggJiYgcmF0ZXNbaV07IGkrKyApIHsKKwkJCQlhaS0+Y29uZmlnLnJhdGVzW2ldID0gcmF0ZXNbaV07CisJCQl9CisJCX0KKwkJaWYgKCBiYXNpY19yYXRlID4gMCApIHsKKwkJCWludCBpOworCQkJZm9yKCBpID0gMDsgaSA8IDg7IGkrKyApIHsKKwkJCQlpZiAoIGFpLT5jb25maWcucmF0ZXNbaV0gPT0gYmFzaWNfcmF0ZSB8fAorCQkJCSAgICAgIWFpLT5jb25maWcucmF0ZXMgKSB7CisJCQkJCWFpLT5jb25maWcucmF0ZXNbaV0gPSBiYXNpY19yYXRlIHwgMHg4MDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwl9CisKKwkvKiBTZXR1cCB0aGUgU1NJRHMgaWYgcHJlc2VudCAqLworCWlmICggc3NpZHNbMF0gKSB7CisJCWludCBpOworCQlmb3IoIGkgPSAwOyBpIDwgMyAmJiBzc2lkc1tpXTsgaSsrICkgeworCQkJbXlTc2lkLnNzaWRzW2ldLmxlbiA9IHN0cmxlbihzc2lkc1tpXSk7CisJCQlpZiAoIG15U3NpZC5zc2lkc1tpXS5sZW4gPiAzMiApCisJCQkJbXlTc2lkLnNzaWRzW2ldLmxlbiA9IDMyOworCQkJbWVtY3B5KG15U3NpZC5zc2lkc1tpXS5zc2lkLCBzc2lkc1tpXSwKKwkJCSAgICAgICBteVNzaWQuc3NpZHNbaV0ubGVuKTsKKwkJfQorCQlteVNzaWQubGVuID0gc2l6ZW9mKG15U3NpZCk7CisJfQorCisJc3RhdHVzID0gd3JpdGVDb25maWdSaWQoYWksIGxvY2spOworCWlmICggc3RhdHVzICE9IFNVQ0NFU1MgKSByZXR1cm4gRVJST1I7CisKKwkvKiBTZXQgdXAgdGhlIFNTSUQgbGlzdCAqLworCWlmICggc3NpZHNbMF0gKSB7CisJCXN0YXR1cyA9IHdyaXRlU3NpZFJpZChhaSwgJm15U3NpZCwgbG9jayk7CisJCWlmICggc3RhdHVzICE9IFNVQ0NFU1MgKSByZXR1cm4gRVJST1I7CisJfQorCisJc3RhdHVzID0gZW5hYmxlX01BQyhhaSwgJnJzcCwgbG9jayk7CisJaWYgKCBzdGF0dXMgIT0gU1VDQ0VTUyB8fCAocnNwLnN0YXR1cyAmIDB4RkYwMCkgIT0gMCkgeworCQlwcmludGsoIEtFUk5fRVJSICJhaXJvOiBCYWQgTUFDIGVuYWJsZSByZWFzb24gPSAleCwgcmlkID0gJXgsIG9mZnNldCA9ICVkXG4iLCByc3AucnNwMCwgcnNwLnJzcDEsIHJzcC5yc3AyICk7CisJCXJldHVybiBFUlJPUjsKKwl9CisKKwkvKiBHcmFiIHRoZSBpbml0aWFsIHdlcCBrZXksIHdlIGdvdHRhIHNhdmUgaXQgZm9yIGF1dG9fd2VwICovCisJcmMgPSByZWFkV2VwS2V5UmlkKGFpLCAmd2tyLCAxLCBsb2NrKTsKKwlpZiAocmMgPT0gU1VDQ0VTUykgZG8geworCQlsYXN0aW5kZXggPSB3a3Iua2luZGV4OworCQlpZiAod2tyLmtpbmRleCA9PSAweGZmZmYpIHsKKwkJCWFpLT5kZWZpbmRleCA9IHdrci5tYWNbMF07CisJCX0KKwkJcmMgPSByZWFkV2VwS2V5UmlkKGFpLCAmd2tyLCAwLCBsb2NrKTsKKwl9IHdoaWxlKGxhc3RpbmRleCAhPSB3a3Iua2luZGV4KTsKKworCWlmIChhdXRvX3dlcCkgeworCQlhaS0+ZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhaS0+dGhyX3dhaXQpOworCX0KKworCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgdTE2IGlzc3VlY29tbWFuZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgQ21kICpwQ21kLCBSZXNwICpwUnNwKSB7CisgICAgICAgIC8vIEltIHJlYWxseSBwYXJhbm9pZCBhYm91dCBsZXR0aW5nIGl0IHJ1biBmb3JldmVyIQorCWludCBtYXhfdHJpZXMgPSA2MDAwMDA7CisKKwlpZiAoSU40NTAwKGFpLCBFVlNUQVQpICYgRVZfQ01EKQorCQlPVVQ0NTAwKGFpLCBFVkFDSywgRVZfQ01EKTsKKworCU9VVDQ1MDAoYWksIFBBUkFNMCwgcENtZC0+cGFybTApOworCU9VVDQ1MDAoYWksIFBBUkFNMSwgcENtZC0+cGFybTEpOworCU9VVDQ1MDAoYWksIFBBUkFNMiwgcENtZC0+cGFybTIpOworCU9VVDQ1MDAoYWksIENPTU1BTkQsIHBDbWQtPmNtZCk7CisKKwl3aGlsZSAobWF4X3RyaWVzLS0gJiYgKElONDUwMChhaSwgRVZTVEFUKSAmIEVWX0NNRCkgPT0gMCkgeworCQlpZiAoKElONDUwMChhaSwgQ09NTUFORCkpID09IHBDbWQtPmNtZCkKKwkJCS8vIFBDNDUwMCBkaWRuJ3Qgbm90aWNlIGNvbW1hbmQsIHRyeSBhZ2FpbgorCQkJT1VUNDUwMChhaSwgQ09NTUFORCwgcENtZC0+Y21kKTsKKwkJaWYgKCFpbl9hdG9taWMoKSAmJiAobWF4X3RyaWVzICYgMjU1KSA9PSAwKQorCQkJc2NoZWR1bGUoKTsKKwl9CisKKwlpZiAoIG1heF90cmllcyA9PSAtMSApIHsKKwkJcHJpbnRrKCBLRVJOX0VSUgorCQkJImFpcm86IE1heCB0cmllcyBleGNlZWRlZCB3aGVuIGlzc3VlaW5nIGNvbW1hbmRcbiIgKTsKKwkJaWYgKElONDUwMChhaSwgQ09NTUFORCkgJiBDT01NQU5EX0JVU1kpCisJCQlPVVQ0NTAwKGFpLCBFVkFDSywgRVZfQ0xFQVJDT01NQU5EQlVTWSk7CisJCXJldHVybiBFUlJPUjsKKwl9CisKKwkvLyBjb21tYW5kIGNvbXBsZXRlZAorCXBSc3AtPnN0YXR1cyA9IElONDUwMChhaSwgU1RBVFVTKTsKKwlwUnNwLT5yc3AwID0gSU40NTAwKGFpLCBSRVNQMCk7CisJcFJzcC0+cnNwMSA9IElONDUwMChhaSwgUkVTUDEpOworCXBSc3AtPnJzcDIgPSBJTjQ1MDAoYWksIFJFU1AyKTsKKwlpZiAoKHBSc3AtPnN0YXR1cyAmIDB4ZmYwMCkhPTAgJiYgcENtZC0+Y21kICE9IENNRF9TT0ZUUkVTRVQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiYWlybzogY21kPSAleFxuIiwgcENtZC0+Y21kKTsKKwkJcHJpbnRrIChLRVJOX0VSUiAiYWlybzogc3RhdHVzPSAleFxuIiwgcFJzcC0+c3RhdHVzKTsKKwkJcHJpbnRrIChLRVJOX0VSUiAiYWlybzogUnNwMD0gJXhcbiIsIHBSc3AtPnJzcDApOworCQlwcmludGsgKEtFUk5fRVJSICJhaXJvOiBSc3AxPSAleFxuIiwgcFJzcC0+cnNwMSk7CisJCXByaW50ayAoS0VSTl9FUlIgImFpcm86IFJzcDI9ICV4XG4iLCBwUnNwLT5yc3AyKTsKKwl9CisKKwkvLyBjbGVhciBzdHVjayBjb21tYW5kIGJ1c3kgaWYgbmVjZXNzYXJ5CisJaWYgKElONDUwMChhaSwgQ09NTUFORCkgJiBDT01NQU5EX0JVU1kpIHsKKwkJT1VUNDUwMChhaSwgRVZBQ0ssIEVWX0NMRUFSQ09NTUFOREJVU1kpOworCX0KKwkvLyBhY2tub3dsZWRnZSBwcm9jZXNzaW5nIHRoZSBzdGF0dXMvcmVzcG9uc2UKKwlPVVQ0NTAwKGFpLCBFVkFDSywgRVZfQ01EKTsKKworCXJldHVybiBTVUNDRVNTOworfQorCisvKiBTZXRzIHVwIHRoZSBiYXAgdG8gc3RhcnQgZXhjaGFuZ2UgZGF0YS4gIHdoaWNoYmFwIHNob3VsZAorICogYmUgb25lIG9mIHRoZSBCQVAwIG9yIEJBUDEgZGVmaW5lcy4gIExvY2tzIHNob3VsZCBiZSBoZWxkIGJlZm9yZQorICogY2FsbGluZyEgKi8KK3N0YXRpYyBpbnQgYmFwX3NldHVwKHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcmlkLCB1MTYgb2Zmc2V0LCBpbnQgd2hpY2hiYXAgKQoreworCWludCB0aW1lb3V0ID0gNTA7CisJaW50IG1heF90cmllcyA9IDM7CisKKwlPVVQ0NTAwKGFpLCBTRUxFQ1QwK3doaWNoYmFwLCByaWQpOworCU9VVDQ1MDAoYWksIE9GRlNFVDArd2hpY2hiYXAsIG9mZnNldCk7CisJd2hpbGUgKDEpIHsKKwkJaW50IHN0YXR1cyA9IElONDUwMChhaSwgT0ZGU0VUMCt3aGljaGJhcCk7CisJCWlmIChzdGF0dXMgJiBCQVBfQlVTWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpc24ndCByZWFsbHkgYSB0aW1lb3V0LCBidXQgaXRzIGtpbmRhCisJCQkgICBjbG9zZSAqLworCQkJaWYgKHRpbWVvdXQtLSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgaWYgKCBzdGF0dXMgJiBCQVBfRVJSICkgeworCQkJLyogaW52YWxpZCByaWQgb3Igb2Zmc2V0ICovCisJCQlwcmludGsoIEtFUk5fRVJSICJhaXJvOiBCQVAgZXJyb3IgJXggJWRcbiIsCisJCQkJc3RhdHVzLCB3aGljaGJhcCApOworCQkJcmV0dXJuIEVSUk9SOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIEJBUF9ET05FKSB7IC8vIHN1Y2Nlc3MKKwkJCXJldHVybiBTVUNDRVNTOworCQl9CisJCWlmICggIShtYXhfdHJpZXMtLSkgKSB7CisJCQlwcmludGsoIEtFUk5fRVJSCisJCQkJImFpcm86IEJBUCBzZXR1cCBlcnJvciB0b28gbWFueSByZXRyaWVzXG4iICk7CisJCQlyZXR1cm4gRVJST1I7CisJCX0KKwkJLy8gLS0gUEM0NTAwIG1pc3NlZCBpdCwgdHJ5IGFnYWluCisJCU9VVDQ1MDAoYWksIFNFTEVDVDArd2hpY2hiYXAsIHJpZCk7CisJCU9VVDQ1MDAoYWksIE9GRlNFVDArd2hpY2hiYXAsIG9mZnNldCk7CisJCXRpbWVvdXQgPSA1MDsKKwl9Cit9CisKKy8qIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBhdXhfYmFwX3JlYWQuICBUaGlzIGF1eCBmdW5jdGlvbiBhbmQgdGhlCisgICBmb2xsb3dpbmcgdXNlIGNvbmNlcHRzIG5vdCBkb2N1bWVudGVkIGluIHRoZSBkZXZlbG9wZXJzIGd1aWRlLiAgSQorICAgZ290IHRoZW0gZnJvbSBhIHBhdGNoIGdpdmVuIHRvIG15IGJ5IEFpcm9uZXQgKi8KK3N0YXRpYyB1MTYgYXV4X3NldHVwKHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcGFnZSwKKwkJICAgICB1MTYgb2Zmc2V0LCB1MTYgKmxlbikKK3sKKwl1MTYgbmV4dDsKKworCU9VVDQ1MDAoYWksIEFVWFBBR0UsIHBhZ2UpOworCU9VVDQ1MDAoYWksIEFVWE9GRiwgMCk7CisJbmV4dCA9IElONDUwMChhaSwgQVVYREFUQSk7CisJKmxlbiA9IElONDUwMChhaSwgQVVYREFUQSkmMHhmZjsKKwlpZiAob2Zmc2V0ICE9IDQpIE9VVDQ1MDAoYWksIEFVWE9GRiwgb2Zmc2V0KTsKKwlyZXR1cm4gbmV4dDsKK30KKworLyogcmVxdWlyZXMgY2FsbCB0byBiYXBfc2V0dXAoKSBmaXJzdCAqLworc3RhdGljIGludCBhdXhfYmFwX3JlYWQoc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiAqcHUxNkRzdCwKKwkJCWludCBieXRlbGVuLCBpbnQgd2hpY2hiYXApCit7CisJdTE2IGxlbjsKKwl1MTYgcGFnZTsKKwl1MTYgb2Zmc2V0OworCXUxNiBuZXh0OworCWludCB3b3JkczsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFpLT5hdXhfbG9jaywgZmxhZ3MpOworCXBhZ2UgPSBJTjQ1MDAoYWksIFNXUzArd2hpY2hiYXApOworCW9mZnNldCA9IElONDUwMChhaSwgU1dTMit3aGljaGJhcCk7CisJbmV4dCA9IGF1eF9zZXR1cChhaSwgcGFnZSwgb2Zmc2V0LCAmbGVuKTsKKwl3b3JkcyA9IChieXRlbGVuKzEpPj4xOworCisJZm9yIChpPTA7IGk8d29yZHM7KSB7CisJCWludCBjb3VudDsKKwkJY291bnQgPSAobGVuPj4xKSA8ICh3b3Jkcy1pKSA/IChsZW4+PjEpIDogKHdvcmRzLWkpOworCQlpZiAoICFkbzhiaXRJTyApCisJCQlpbnN3KCBhaS0+ZGV2LT5iYXNlX2FkZHIrREFUQTArd2hpY2hiYXAsCisJCQkgICAgICBwdTE2RHN0K2ksY291bnQgKTsKKwkJZWxzZQorCQkJaW5zYiggYWktPmRldi0+YmFzZV9hZGRyK0RBVEEwK3doaWNoYmFwLAorCQkJICAgICAgcHUxNkRzdCtpLCBjb3VudCA8PCAxICk7CisJCWkgKz0gY291bnQ7CisJCWlmIChpPHdvcmRzKSB7CisJCQluZXh0ID0gYXV4X3NldHVwKGFpLCBuZXh0LCA0LCAmbGVuKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaS0+YXV4X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworCisvKiByZXF1aXJlcyBjYWxsIHRvIGJhcF9zZXR1cCgpIGZpcnN0ICovCitzdGF0aWMgaW50IGZhc3RfYmFwX3JlYWQoc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiAqcHUxNkRzdCwKKwkJCSBpbnQgYnl0ZWxlbiwgaW50IHdoaWNoYmFwKQoreworCWJ5dGVsZW4gPSAoYnl0ZWxlbiArIDEpICYgKH4xKTsgLy8gcm91bmQgdXAgdG8gZXZlbiB2YWx1ZQorCWlmICggIWRvOGJpdElPICkKKwkJaW5zdyggYWktPmRldi0+YmFzZV9hZGRyK0RBVEEwK3doaWNoYmFwLCBwdTE2RHN0LCBieXRlbGVuPj4xICk7CisJZWxzZQorCQlpbnNiKCBhaS0+ZGV2LT5iYXNlX2FkZHIrREFUQTArd2hpY2hiYXAsIHB1MTZEc3QsIGJ5dGVsZW4gKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyogcmVxdWlyZXMgY2FsbCB0byBiYXBfc2V0dXAoKSBmaXJzdCAqLworc3RhdGljIGludCBiYXBfd3JpdGUoc3RydWN0IGFpcm9faW5mbyAqYWksIGNvbnN0IHUxNiAqcHUxNlNyYywKKwkJICAgICBpbnQgYnl0ZWxlbiwgaW50IHdoaWNoYmFwKQoreworCWJ5dGVsZW4gPSAoYnl0ZWxlbiArIDEpICYgKH4xKTsgLy8gcm91bmQgdXAgdG8gZXZlbiB2YWx1ZQorCWlmICggIWRvOGJpdElPICkKKwkJb3V0c3coIGFpLT5kZXYtPmJhc2VfYWRkcitEQVRBMCt3aGljaGJhcCwKKwkJICAgICAgIHB1MTZTcmMsIGJ5dGVsZW4+PjEgKTsKKwllbHNlCisJCW91dHNiKCBhaS0+ZGV2LT5iYXNlX2FkZHIrREFUQTArd2hpY2hiYXAsIHB1MTZTcmMsIGJ5dGVsZW4gKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBQQzQ1MDBfYWNjZXNzcmlkKHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcmlkLCB1MTYgYWNjbWQpCit7CisJQ21kIGNtZDsgLyogZm9yIGlzc3VpbmcgY29tbWFuZHMgKi8KKwlSZXNwIHJzcDsgLyogcmVzcG9uc2UgZnJvbSBjb21tYW5kcyAqLworCXUxNiBzdGF0dXM7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5jbWQgPSBhY2NtZDsKKwljbWQucGFybTAgPSByaWQ7CisJc3RhdHVzID0gaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwlpZiAoc3RhdHVzICE9IDApIHJldHVybiBzdGF0dXM7CisJaWYgKCAocnNwLnN0YXR1cyAmIDB4N0YwMCkgIT0gMCkgeworCQlyZXR1cm4gKGFjY21kIDw8IDgpICsgKHJzcC5yc3AwICYgMHhGRik7CisJfQorCXJldHVybiAwOworfQorCisvKiAgTm90ZSwgdGhhdCB3ZSBhcmUgdXNpbmcgQkFQMSB3aGljaCBpcyBhbHNvIHVzZWQgYnkgdHJhbnNtaXQsIHNvCisgKiAgd2UgbXVzdCBnZXQgYSBsb2NrLiAqLworc3RhdGljIGludCBQQzQ1MDBfcmVhZHJpZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IHJpZCwgdm9pZCAqcEJ1ZiwgaW50IGxlbiwgaW50IGxvY2spCit7CisJdTE2IHN0YXR1czsKKyAgICAgICAgaW50IHJjID0gU1VDQ0VTUzsKKworCWlmIChsb2NrKSB7CisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQkJcmV0dXJuIEVSUk9SOworCX0KKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpIHsKKwkJQ21kIGNtZDsKKwkJUmVzcCByc3A7CisKKwkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJbWVtc2V0KCZyc3AsIDAsIHNpemVvZihyc3ApKTsKKwkJYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLnZhbGlkID0gMTsKKwkJYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLmxlbiA9IFJJRFNJWkU7CisJCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy5yaWQgPSAwOworCQlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MuaG9zdF9hZGRyID0gYWktPnJpZGJ1czsKKworCQljbWQuY21kID0gQ01EX0FDQ0VTUzsKKwkJY21kLnBhcm0wID0gcmlkOworCisJCW1lbWNweV90b2lvKGFpLT5jb25maWdfZGVzYy5jYXJkX3JhbV9vZmYsCisJCQkmYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLCBzaXplb2YoUmlkKSk7CisKKwkJcmMgPSBpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCisJCWlmIChyc3Auc3RhdHVzICYgMHg3ZjAwKQorCQkJcmMgPSByc3AucnNwMDsKKwkJaWYgKCFyYykKKwkJCW1lbWNweShwQnVmLCBhaS0+Y29uZmlnX2Rlc2MudmlydHVhbF9ob3N0X2FkZHIsIGxlbik7CisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgeworCQlpZiAoKHN0YXR1cyA9IFBDNDUwMF9hY2Nlc3NyaWQoYWksIHJpZCwgQ01EX0FDQ0VTUykpIT1TVUNDRVNTKSB7CisJICAgICAgICAgICAgICAgIHJjID0gc3RhdHVzOworCSAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisJICAgICAgICB9CisJCWlmIChiYXBfc2V0dXAoYWksIHJpZCwgMCwgQkFQMSkgIT0gU1VDQ0VTUykgeworCQkJcmMgPSBFUlJPUjsKKwkgICAgICAgICAgICAgICAgZ290byBkb25lOworCSAgICAgICAgfQorCQkvLyByZWFkIHRoZSByaWQgbGVuZ3RoIGZpZWxkCisJCWJhcF9yZWFkKGFpLCBwQnVmLCAyLCBCQVAxKTsKKwkJLy8gbGVuZ3RoIGZvciByZW1haW5pbmcgcGFydCBvZiByaWQKKwkJbGVuID0gbWluKGxlbiwgKGludClsZTE2X3RvX2NwdSgqKHUxNiopcEJ1ZikpIC0gMjsKKworCQlpZiAoIGxlbiA8PSAyICkgeworCQkJcHJpbnRrKCBLRVJOX0VSUgorCQkJImFpcm86IFJpZCAleCBoYXMgYSBsZW5ndGggb2YgJWQgd2hpY2ggaXMgdG9vIHNob3J0XG4iLAorCQkJCShpbnQpcmlkLCAoaW50KWxlbiApOworCQkJcmMgPSBFUlJPUjsKKwkgICAgICAgICAgICAgICAgZ290byBkb25lOworCQl9CisJCS8vIHJlYWQgcmVtYWluZGVyIG9mIHRoZSByaWQKKwkJcmMgPSBiYXBfcmVhZChhaSwgKCh1MTYqKXBCdWYpKzEsIGxlbiwgQkFQMSk7CisJfQorZG9uZToKKwlpZiAobG9jaykKKwkJdXAoJmFpLT5zZW0pOworCXJldHVybiByYzsKK30KKworLyogIE5vdGUsIHRoYXQgd2UgYXJlIHVzaW5nIEJBUDEgd2hpY2ggaXMgYWxzbyB1c2VkIGJ5IHRyYW5zbWl0LCBzbworICogIG1ha2Ugc3VyZSB0aGlzIGlzbnQgY2FsbGVkIHdoZW4gYSB0cmFuc21pdCBpcyBoYXBwZW5pbmcgKi8KK3N0YXRpYyBpbnQgUEM0NTAwX3dyaXRlcmlkKHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcmlkLAorCQkJICAgY29uc3Qgdm9pZCAqcEJ1ZiwgaW50IGxlbiwgaW50IGxvY2spCit7CisJdTE2IHN0YXR1czsKKwlpbnQgcmMgPSBTVUNDRVNTOworCisJKih1MTYqKXBCdWYgPSBjcHVfdG9fbGUxNigodTE2KWxlbik7CisKKwlpZiAobG9jaykgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJCXJldHVybiBFUlJPUjsKKwl9CisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKSB7CisJCUNtZCBjbWQ7CisJCVJlc3AgcnNwOworCisJCWlmICh0ZXN0X2JpdChGTEFHX0VOQUJMRUQsICZhaS0+ZmxhZ3MpKQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJIiVzOiBNQUMgc2hvdWxkIGJlIGRpc2FibGVkIChyaWQ9JTA0eClcbiIsCisJCQkJX19GVU5DVElPTl9fLCByaWQpOworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQltZW1zZXQoJnJzcCwgMCwgc2l6ZW9mKHJzcCkpOworCisJCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy52YWxpZCA9IDE7CisJCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy5sZW4gPSAqKCh1MTYgKilwQnVmKTsKKwkJYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLnJpZCA9IDA7CisKKwkJY21kLmNtZCA9IENNRF9XUklURVJJRDsKKwkJY21kLnBhcm0wID0gcmlkOworCisJCW1lbWNweV90b2lvKGFpLT5jb25maWdfZGVzYy5jYXJkX3JhbV9vZmYsCisJCQkmYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLCBzaXplb2YoUmlkKSk7CisKKwkJaWYgKGxlbiA8IDQgfHwgbGVuID4gMjA0NykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbGVuPSVkXG4iLF9fRlVOQ1RJT05fXyxsZW4pOworCQkJcmMgPSAtMTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweSgoY2hhciAqKWFpLT5jb25maWdfZGVzYy52aXJ0dWFsX2hvc3RfYWRkciwKKwkJCQlwQnVmLCBsZW4pOworCisJCQlyYyA9IGlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CisJCQlpZiAoKHJjICYgMHhmZjAwKSAhPSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogV3JpdGUgcmlkIEVycm9yICVkXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18scmMpOworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENtZD0lMDR4XG4iLAorCQkJCQkJX19GVU5DVElPTl9fLGNtZC5jbWQpOworCQkJfQorCisJCQlpZiAoKHJzcC5zdGF0dXMgJiAweDdmMDApKQorCQkJCXJjID0gcnNwLnJzcDA7CisJCX0KKwl9IGVsc2UgeworCQkvLyAtLS0gZmlyc3QgYWNjZXNzIHNvIHRoYXQgd2UgY2FuIHdyaXRlIHRoZSByaWQgZGF0YQorCQlpZiAoIChzdGF0dXMgPSBQQzQ1MDBfYWNjZXNzcmlkKGFpLCByaWQsIENNRF9BQ0NFU1MpKSAhPSAwKSB7CisJICAgICAgICAgICAgICAgIHJjID0gc3RhdHVzOworCSAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisJICAgICAgICB9CisJCS8vIC0tLSBub3cgd3JpdGUgdGhlIHJpZCBkYXRhCisJCWlmIChiYXBfc2V0dXAoYWksIHJpZCwgMCwgQkFQMSkgIT0gU1VDQ0VTUykgeworCSAgICAgICAgICAgICAgICByYyA9IEVSUk9SOworCSAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisJICAgICAgICB9CisJCWJhcF93cml0ZShhaSwgcEJ1ZiwgbGVuLCBCQVAxKTsKKwkJLy8gLS0tbm93IGNvbW1pdCB0aGUgcmlkIGRhdGEKKwkJcmMgPSBQQzQ1MDBfYWNjZXNzcmlkKGFpLCByaWQsIDB4MTAwfENNRF9BQ0NFU1MpOworCX0KK2RvbmU6CisJaWYgKGxvY2spCisJCXVwKCZhaS0+c2VtKTsKKyAgICAgICAgcmV0dXJuIHJjOworfQorCisvKiBBbGxvY2F0ZXMgYSBGSUQgdG8gYmUgdXNlZCBmb3IgdHJhbnNtaXR0aW5nIHBhY2tldHMuICBXZSBvbmx5IHVzZQorICAgb25lIGZvciBub3cuICovCitzdGF0aWMgdTE2IHRyYW5zbWl0X2FsbG9jYXRlKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBpbnQgbGVuUGF5bG9hZCwgaW50IHJhdykKK3sKKwl1bnNpZ25lZCBpbnQgbG9vcCA9IDMwMDA7CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKKwl1MTYgdHhGaWQ7CisJdTE2IHR4Q29udHJvbDsKKworCWNtZC5jbWQgPSBDTURfQUxMT0NBVEVUWDsKKwljbWQucGFybTAgPSBsZW5QYXlsb2FkOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQlyZXR1cm4gRVJST1I7CisJaWYgKGlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCkgIT0gU1VDQ0VTUykgeworCQl0eEZpZCA9IEVSUk9SOworCQlnb3RvIGRvbmU7CisJfQorCWlmICggKHJzcC5zdGF0dXMgJiAweEZGMDApICE9IDApIHsKKwkJdHhGaWQgPSBFUlJPUjsKKwkJZ290byBkb25lOworCX0KKwkvKiB3YWl0IGZvciB0aGUgYWxsb2NhdGUgZXZlbnQvaW5kaWNhdGlvbgorCSAqIEl0IG1ha2VzIG1lIGtpbmQgb2YgbmVydm91cyB0aGF0IHRoaXMgY2FuIGp1c3Qgc2l0IGhlcmUgYW5kIHNwaW4sCisJICogYnV0IGluIHByYWN0aWNlIGl0IG9ubHkgbG9vcHMgbGlrZSBmb3VyIHRpbWVzLiAqLworCXdoaWxlICgoKElONDUwMChhaSwgRVZTVEFUKSAmIEVWX0FMTE9DKSA9PSAwKSAmJiAtLWxvb3ApOworCWlmICghbG9vcCkgeworCQl0eEZpZCA9IEVSUk9SOworCQlnb3RvIGRvbmU7CisJfQorCisJLy8gZ2V0IHRoZSBhbGxvY2F0ZWQgZmlkIGFuZCBhY2tub3dsZWRnZQorCXR4RmlkID0gSU40NTAwKGFpLCBUWEFMTE9DRklEKTsKKwlPVVQ0NTAwKGFpLCBFVkFDSywgRVZfQUxMT0MpOworCisJLyogIFRoZSBDQVJEIGlzIHByZXR0eSBjb29sIHNpbmNlIGl0IGNvbnZlcnRzIHRoZSBldGhlcm5ldCBwYWNrZXQKKwkgKiAgaW50byA4MDIuMTEuICBBbHNvIG5vdGUgdGhhdCB3ZSBkb24ndCByZWxlYXNlIHRoZSBGSUQgc2luY2Ugd2UKKwkgKiAgd2lsbCBiZSB1c2luZyB0aGUgc2FtZSBvbmUgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4gKi8KKwkvKiAgV2Ugb25seSBoYXZlIHRvIHNldHVwIHRoZSBjb250cm9sIG9uY2Ugc2luY2Ugd2UgYXJlIG5vdAorCSAqICByZWxlYXNpbmcgdGhlIGZpZC4gKi8KKwlpZiAocmF3KQorCQl0eENvbnRyb2wgPSBjcHVfdG9fbGUxNihUWENUTF9UWE9LIHwgVFhDVExfVFhFWCB8IFRYQ1RMXzgwMl8xMQorCQkJfCBUWENUTF9FVEhFUk5FVCB8IFRYQ1RMX05PUkVMRUFTRSk7CisJZWxzZQorCQl0eENvbnRyb2wgPSBjcHVfdG9fbGUxNihUWENUTF9UWE9LIHwgVFhDVExfVFhFWCB8IFRYQ1RMXzgwMl8zCisJCQl8IFRYQ1RMX0VUSEVSTkVUIHwgVFhDVExfTk9SRUxFQVNFKTsKKwlpZiAoYmFwX3NldHVwKGFpLCB0eEZpZCwgMHgwMDA4LCBCQVAxKSAhPSBTVUNDRVNTKQorCQl0eEZpZCA9IEVSUk9SOworCWVsc2UKKwkJYmFwX3dyaXRlKGFpLCAmdHhDb250cm9sLCBzaXplb2YodHhDb250cm9sKSwgQkFQMSk7CisKK2RvbmU6CisJdXAoJmFpLT5zZW0pOworCisJcmV0dXJuIHR4RmlkOworfQorCisvKiBJbiBnZW5lcmFsIEJBUDEgaXMgZGVkaWNhdGVkIHRvIHRyYW5zbWl0aW5nIHBhY2tldHMuICBIb3dldmVyLAorICAgc2luY2Ugd2UgbmVlZCBhIEJBUCB3aGVuIGFjY2Vzc2luZyBSSURzLCB3ZSBhbHNvIHVzZSBCQVAxIGZvciB0aGF0LgorICAgTWFrZSBzdXJlIHRoZSBCQVAxIHNwaW5sb2NrIGlzIGhlbGQgd2hlbiB0aGlzIGlzIGNhbGxlZC4gKi8KK3N0YXRpYyBpbnQgdHJhbnNtaXRfODAyXzNfcGFja2V0KHN0cnVjdCBhaXJvX2luZm8gKmFpLCBpbnQgbGVuLCBjaGFyICpwUGFja2V0KQoreworCXUxNiBwYXlsb2FkTGVuOworCUNtZCBjbWQ7CisJUmVzcCByc3A7CisJaW50IG1pY2xlbiA9IDA7CisJdTE2IHR4RmlkID0gbGVuOworCU1JQ0J1ZmZlciBwTWljOworCisJbGVuID4+PSAxNjsKKworCWlmIChsZW4gPD0gRVRIX0FMRU4gKiAyKSB7CisJCXByaW50ayggS0VSTl9XQVJOSU5HICJTaG9ydCBwYWNrZXQgJWRcbiIsIGxlbiApOworCQlyZXR1cm4gRVJST1I7CisJfQorCWxlbiAtPSBFVEhfQUxFTiAqIDI7CisKKyNpZmRlZiBNSUNTVVBQT1JUCisJaWYgKHRlc3RfYml0KEZMQUdfTUlDX0NBUEFCTEUsICZhaS0+ZmxhZ3MpICYmIGFpLT5taWNzdGF0cy5lbmFibGVkICYmIAorCSAgICAobnRvaHMoKCh1MTYgKilwUGFja2V0KVs2XSkgIT0gMHg4ODhFKSkgeworCQlpZiAoZW5jYXBzdWxhdGUoYWksKGV0aGVySGVhZCAqKXBQYWNrZXQsJnBNaWMsbGVuKSAhPSBTVUNDRVNTKQorCQkJcmV0dXJuIEVSUk9SOworCQltaWNsZW4gPSBzaXplb2YocE1pYyk7CisJfQorI2VuZGlmCisKKwkvLyBwYWNrZXQgaXMgZGVzdGluYXRpb25bNl0sIHNvdXJjZVs2XSwgcGF5bG9hZFtsZW4tMTJdCisJLy8gd3JpdGUgdGhlIHBheWxvYWQgbGVuZ3RoIGFuZCBkc3Qvc3JjL3BheWxvYWQKKwlpZiAoYmFwX3NldHVwKGFpLCB0eEZpZCwgMHgwMDM2LCBCQVAxKSAhPSBTVUNDRVNTKSByZXR1cm4gRVJST1I7CisJLyogVGhlIGhhcmR3YXJlIGFkZHJlc3NlcyBhcmVuJ3QgY291bnRlZCBhcyBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBzbworCSAqIHdlIGhhdmUgdG8gc3VidHJhY3QgdGhlIDEyIGJ5dGVzIGZvciB0aGUgYWRkcmVzc2VzIG9mZiAqLworCXBheWxvYWRMZW4gPSBjcHVfdG9fbGUxNihsZW4gKyBtaWNsZW4pOworCWJhcF93cml0ZShhaSwgJnBheWxvYWRMZW4sIHNpemVvZihwYXlsb2FkTGVuKSxCQVAxKTsKKwliYXBfd3JpdGUoYWksIChjb25zdCB1MTYqKXBQYWNrZXQsIHNpemVvZihldGhlckhlYWQpLCBCQVAxKTsKKwlpZiAobWljbGVuKQorCQliYXBfd3JpdGUoYWksIChjb25zdCB1MTYqKSZwTWljLCBtaWNsZW4sIEJBUDEpOworCWJhcF93cml0ZShhaSwgKGNvbnN0IHUxNiopKHBQYWNrZXQgKyBzaXplb2YoZXRoZXJIZWFkKSksIGxlbiwgQkFQMSk7CisJLy8gaXNzdWUgdGhlIHRyYW5zbWl0IGNvbW1hbmQKKwltZW1zZXQoICZjbWQsIDAsIHNpemVvZiggY21kICkgKTsKKwljbWQuY21kID0gQ01EX1RSQU5TTUlUOworCWNtZC5wYXJtMCA9IHR4RmlkOworCWlmIChpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApICE9IFNVQ0NFU1MpIHJldHVybiBFUlJPUjsKKwlpZiAoIChyc3Auc3RhdHVzICYgMHhGRjAwKSAhPSAwKSByZXR1cm4gRVJST1I7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNtaXRfODAyXzExX3BhY2tldChzdHJ1Y3QgYWlyb19pbmZvICphaSwgaW50IGxlbiwgY2hhciAqcFBhY2tldCkKK3sKKwl1MTYgZmMsIHBheWxvYWRMZW47CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKKwlpbnQgaGRybGVuOworCXN0cnVjdCB7CisJCXU4IGFkZHI0W0VUSF9BTEVOXTsKKwkJdTE2IGdhcGxlbjsKKwkJdTggZ2FwWzZdOworCX0gZ2FwOworCXUxNiB0eEZpZCA9IGxlbjsKKwlsZW4gPj49IDE2OworCWdhcC5nYXBsZW4gPSA2OworCisJZmMgPSBsZTE2X3RvX2NwdSgqKGNvbnN0IHUxNiopcFBhY2tldCk7CisJc3dpdGNoIChmYyAmIDB4YykgeworCQljYXNlIDQ6CisJCQlpZiAoKGZjICYgMHhlMCkgPT0gMHhjMCkKKwkJCQloZHJsZW4gPSAxMDsKKwkJCWVsc2UKKwkJCQloZHJsZW4gPSAxNjsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQlpZiAoKGZjJjB4MzAwKT09MHgzMDApeworCQkJCWhkcmxlbiA9IDMwOworCQkJCWJyZWFrOworCQkJfQorCQlkZWZhdWx0OgorCQkJaGRybGVuID0gMjQ7CisJfQorCisJaWYgKGxlbiA8IGhkcmxlbikgeworCQlwcmludGsoIEtFUk5fV0FSTklORyAiU2hvcnQgcGFja2V0ICVkXG4iLCBsZW4gKTsKKwkJcmV0dXJuIEVSUk9SOworCX0KKworCS8qIHBhY2tldCBpcyA4MDIuMTEgaGVhZGVyICsgIHBheWxvYWQKKwkgKiB3cml0ZSB0aGUgcGF5bG9hZCBsZW5ndGggYW5kIGRzdC9zcmMvcGF5bG9hZCAqLworCWlmIChiYXBfc2V0dXAoYWksIHR4RmlkLCA2LCBCQVAxKSAhPSBTVUNDRVNTKSByZXR1cm4gRVJST1I7CisJLyogVGhlIDgwMi4xMSBoZWFkZXIgYXJlbid0IGNvdW50ZWQgYXMgcGFydCBvZiB0aGUgcGF5bG9hZCwgc28KKwkgKiB3ZSBoYXZlIHRvIHN1YnRyYWN0IHRoZSBoZWFkZXIgYnl0ZXMgb2ZmICovCisJcGF5bG9hZExlbiA9IGNwdV90b19sZTE2KGxlbi1oZHJsZW4pOworCWJhcF93cml0ZShhaSwgJnBheWxvYWRMZW4sIHNpemVvZihwYXlsb2FkTGVuKSxCQVAxKTsKKwlpZiAoYmFwX3NldHVwKGFpLCB0eEZpZCwgMHgwMDE0LCBCQVAxKSAhPSBTVUNDRVNTKSByZXR1cm4gRVJST1I7CisJYmFwX3dyaXRlKGFpLCAoY29uc3QgdTE2KilwUGFja2V0LCBoZHJsZW4sIEJBUDEpOworCWJhcF93cml0ZShhaSwgaGRybGVuID09IDMwID8KKwkJKGNvbnN0IHUxNiopJmdhcC5nYXBsZW4gOiAoY29uc3QgdTE2KikmZ2FwLCAzOCAtIGhkcmxlbiwgQkFQMSk7CisKKwliYXBfd3JpdGUoYWksIChjb25zdCB1MTYqKShwUGFja2V0ICsgaGRybGVuKSwgbGVuIC0gaGRybGVuLCBCQVAxKTsKKwkvLyBpc3N1ZSB0aGUgdHJhbnNtaXQgY29tbWFuZAorCW1lbXNldCggJmNtZCwgMCwgc2l6ZW9mKCBjbWQgKSApOworCWNtZC5jbWQgPSBDTURfVFJBTlNNSVQ7CisJY21kLnBhcm0wID0gdHhGaWQ7CisJaWYgKGlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCkgIT0gU1VDQ0VTUykgcmV0dXJuIEVSUk9SOworCWlmICggKHJzcC5zdGF0dXMgJiAweEZGMDApICE9IDApIHJldHVybiBFUlJPUjsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyoKKyAqICBUaGlzIGlzIHRoZSBwcm9jX2ZzIHJvdXRpbmVzLiAgSXQgaXMgYSBiaXQgbWVzc2llciB0aGFuIEkgd291bGQKKyAqICBsaWtlISAgRmVlbCBmcmVlIHRvIGNsZWFuIGl0IHVwIQorICovCisKK3N0YXRpYyBzc2l6ZV90IHByb2NfcmVhZCggc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgIHNpemVfdCBsZW4sCisJCQkgIGxvZmZfdCAqb2Zmc2V0KTsKKworc3RhdGljIHNzaXplX3QgcHJvY193cml0ZSggc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgc2l6ZV90IGxlbiwKKwkJCSAgIGxvZmZfdCAqb2Zmc2V0ICk7CitzdGF0aWMgaW50IHByb2NfY2xvc2UoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICk7CisKK3N0YXRpYyBpbnQgcHJvY19zdGF0c19vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOworc3RhdGljIGludCBwcm9jX3N0YXRzZGVsdGFfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKK3N0YXRpYyBpbnQgcHJvY19zdGF0dXNfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKK3N0YXRpYyBpbnQgcHJvY19TU0lEX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICk7CitzdGF0aWMgaW50IHByb2NfQVBMaXN0X29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICk7CitzdGF0aWMgaW50IHByb2NfQlNTTGlzdF9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOworc3RhdGljIGludCBwcm9jX2NvbmZpZ19vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOworc3RhdGljIGludCBwcm9jX3dlcGtleV9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3N0YXRzZGVsdGFfb3BzID0geworCS5yZWFkCQk9IHByb2NfcmVhZCwKKwkub3BlbgkJPSBwcm9jX3N0YXRzZGVsdGFfb3BlbiwKKwkucmVsZWFzZQk9IHByb2NfY2xvc2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc3RhdHNfb3BzID0geworCS5yZWFkCQk9IHByb2NfcmVhZCwKKwkub3BlbgkJPSBwcm9jX3N0YXRzX29wZW4sCisJLnJlbGVhc2UJPSBwcm9jX2Nsb3NlCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3N0YXR1c19vcHMgPSB7CisJLnJlYWQJCT0gcHJvY19yZWFkLAorCS5vcGVuCQk9IHByb2Nfc3RhdHVzX29wZW4sCisJLnJlbGVhc2UJPSBwcm9jX2Nsb3NlCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX1NTSURfb3BzID0geworCS5yZWFkCQk9IHByb2NfcmVhZCwKKwkud3JpdGUJCT0gcHJvY193cml0ZSwKKwkub3BlbgkJPSBwcm9jX1NTSURfb3BlbiwKKwkucmVsZWFzZQk9IHByb2NfY2xvc2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfQlNTTGlzdF9vcHMgPSB7CisJLnJlYWQJCT0gcHJvY19yZWFkLAorCS53cml0ZQkJPSBwcm9jX3dyaXRlLAorCS5vcGVuCQk9IHByb2NfQlNTTGlzdF9vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19BUExpc3Rfb3BzID0geworCS5yZWFkCQk9IHByb2NfcmVhZCwKKwkud3JpdGUJCT0gcHJvY193cml0ZSwKKwkub3BlbgkJPSBwcm9jX0FQTGlzdF9vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jb25maWdfb3BzID0geworCS5yZWFkCQk9IHByb2NfcmVhZCwKKwkud3JpdGUJCT0gcHJvY193cml0ZSwKKwkub3BlbgkJPSBwcm9jX2NvbmZpZ19vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY193ZXBrZXlfb3BzID0geworCS5yZWFkCQk9IHByb2NfcmVhZCwKKwkud3JpdGUJCT0gcHJvY193cml0ZSwKKwkub3BlbgkJPSBwcm9jX3dlcGtleV9vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWlyb19lbnRyeTsKKworc3RydWN0IHByb2NfZGF0YSB7CisJaW50IHJlbGVhc2VfYnVmZmVyOworCWludCByZWFkbGVuOworCWNoYXIgKnJidWZmZXI7CisJaW50IHdyaXRlbGVuOworCWludCBtYXh3cml0ZWxlbjsKKwljaGFyICp3YnVmZmVyOworCXZvaWQgKCpvbl9jbG9zZSkgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK307CisKKyNpZm5kZWYgU0VUUFJPQ19PUFMKKyNkZWZpbmUgU0VUUFJPQ19PUFMoZW50cnksIG9wcykgKGVudHJ5KS0+cHJvY19mb3BzID0gJihvcHMpCisjZW5kaWYKKworc3RhdGljIGludCBzZXR1cF9wcm9jX2VudHJ5KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgYWlyb19pbmZvICphcHJpdiApIHsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCS8qIEZpcnN0IHNldHVwIHRoZSBkZXZpY2UgZGlyZWN0b3J5ICovCisJc3RyY3B5KGFwcml2LT5wcm9jX25hbWUsZGV2LT5uYW1lKTsKKwlhcHJpdi0+cHJvY19lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGFwcml2LT5wcm9jX25hbWUsCisJCQkJCSAgICAgIFNfSUZESVJ8YWlyb19wZXJtLAorCQkJCQkgICAgICBhaXJvX2VudHJ5KTsKKyAgICAgICAgYXByaXYtPnByb2NfZW50cnktPnVpZCA9IHByb2NfdWlkOworICAgICAgICBhcHJpdi0+cHJvY19lbnRyeS0+Z2lkID0gcHJvY19naWQ7CisgICAgICAgIGFwcml2LT5wcm9jX2VudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCisJLyogU2V0dXAgdGhlIFN0YXRzRGVsdGEgKi8KKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJTdGF0c0RlbHRhIiwKKwkJCQkgIFNfSUZSRUcgfCAoU19JUlVHTyZwcm9jX3Blcm0pLAorCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOworICAgICAgICBlbnRyeS0+dWlkID0gcHJvY191aWQ7CisgICAgICAgIGVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwllbnRyeS0+ZGF0YSA9IGRldjsKKyAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJU0VUUFJPQ19PUFMoZW50cnksIHByb2Nfc3RhdHNkZWx0YV9vcHMpOworCisJLyogU2V0dXAgdGhlIFN0YXRzICovCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiU3RhdHMiLAorCQkJCSAgU19JRlJFRyB8IChTX0lSVUdPJnByb2NfcGVybSksCisJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7CisgICAgICAgIGVudHJ5LT51aWQgPSBwcm9jX3VpZDsKKyAgICAgICAgZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWVudHJ5LT5kYXRhID0gZGV2OworICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19zdGF0c19vcHMpOworCisJLyogU2V0dXAgdGhlIFN0YXR1cyAqLworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIlN0YXR1cyIsCisJCQkJICBTX0lGUkVHIHwgKFNfSVJVR08mcHJvY19wZXJtKSwKKwkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKKyAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOworICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJZW50cnktPmRhdGEgPSBkZXY7CisgICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX3N0YXR1c19vcHMpOworCisJLyogU2V0dXAgdGhlIENvbmZpZyAqLworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIkNvbmZpZyIsCisJCQkJICBTX0lGUkVHIHwgcHJvY19wZXJtLAorCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOworICAgICAgICBlbnRyeS0+dWlkID0gcHJvY191aWQ7CisgICAgICAgIGVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwllbnRyeS0+ZGF0YSA9IGRldjsKKyAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJU0VUUFJPQ19PUFMoZW50cnksIHByb2NfY29uZmlnX29wcyk7CisKKwkvKiBTZXR1cCB0aGUgU1NJRCAqLworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIlNTSUQiLAorCQkJCSAgU19JRlJFRyB8IHByb2NfcGVybSwKKwkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKKyAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOworICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJZW50cnktPmRhdGEgPSBkZXY7CisgICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX1NTSURfb3BzKTsKKworCS8qIFNldHVwIHRoZSBBUExpc3QgKi8KKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJBUExpc3QiLAorCQkJCSAgU19JRlJFRyB8IHByb2NfcGVybSwKKwkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKKyAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOworICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJZW50cnktPmRhdGEgPSBkZXY7CisgICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX0FQTGlzdF9vcHMpOworCisJLyogU2V0dXAgdGhlIEJTU0xpc3QgKi8KKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJCU1NMaXN0IiwKKwkJCQkgIFNfSUZSRUcgfCBwcm9jX3Blcm0sCisJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7CisJZW50cnktPnVpZCA9IHByb2NfdWlkOworCWVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwllbnRyeS0+ZGF0YSA9IGRldjsKKyAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJU0VUUFJPQ19PUFMoZW50cnksIHByb2NfQlNTTGlzdF9vcHMpOworCisJLyogU2V0dXAgdGhlIFdlcEtleSAqLworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIldlcEtleSIsCisJCQkJICBTX0lGUkVHIHwgcHJvY19wZXJtLAorCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOworICAgICAgICBlbnRyeS0+dWlkID0gcHJvY191aWQ7CisgICAgICAgIGVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwllbnRyeS0+ZGF0YSA9IGRldjsKKyAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJU0VUUFJPQ19PUFMoZW50cnksIHByb2Nfd2Vwa2V5X29wcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YWtlZG93bl9wcm9jX2VudHJ5KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBhaXJvX2luZm8gKmFwcml2ICkgeworCWlmICggIWFwcml2LT5wcm9jX2VudHJ5LT5uYW1lbGVuICkgcmV0dXJuIDA7CisJcmVtb3ZlX3Byb2NfZW50cnkoIlN0YXRzIixhcHJpdi0+cHJvY19lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIlN0YXRzRGVsdGEiLGFwcml2LT5wcm9jX2VudHJ5KTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiU3RhdHVzIixhcHJpdi0+cHJvY19lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIkNvbmZpZyIsYXByaXYtPnByb2NfZW50cnkpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJTU0lEIixhcHJpdi0+cHJvY19lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIkFQTGlzdCIsYXByaXYtPnByb2NfZW50cnkpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJCU1NMaXN0IixhcHJpdi0+cHJvY19lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIldlcEtleSIsYXByaXYtPnByb2NfZW50cnkpOworCXJlbW92ZV9wcm9jX2VudHJ5KGFwcml2LT5wcm9jX25hbWUsYWlyb19lbnRyeSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgV2hhdCB3ZSB3YW50IGZyb20gdGhlIHByb2NfZnMgaXMgdG8gYmUgYWJsZSB0byBlZmZpY2llbnRseSByZWFkCisgKiAgYW5kIHdyaXRlIHRoZSBjb25maWd1cmF0aW9uLiAgVG8gZG8gdGhpcywgd2Ugd2FudCB0byByZWFkIHRoZQorICogIGNvbmZpZ3VyYXRpb24gd2hlbiB0aGUgZmlsZSBpcyBvcGVuZWQgYW5kIHdyaXRlIGl0IHdoZW4gdGhlIGZpbGUgaXMKKyAqICBjbG9zZWQuICBTbyBiYXNpY2FsbHkgd2UgYWxsb2NhdGUgYSByZWFkIGJ1ZmZlciBhdCBvcGVuIGFuZCBmaWxsIGl0CisgKiAgd2l0aCBkYXRhLCBhbmQgYWxsb2NhdGUgYSB3cml0ZSBidWZmZXIgYW5kIHJlYWQgaXQgYXQgY2xvc2UuCisgKi8KKworLyoKKyAqICBUaGUgcmVhZCByb3V0aW5lIGlzIGdlbmVyaWMsIGl0IHJlbGllcyBvbiB0aGUgcHJlYWxsb2NhdGVkIHJidWZmZXIKKyAqICB0byBzdXBwbHkgdGhlIGRhdGEuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHByb2NfcmVhZCggc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgIHNpemVfdCBsZW4sCisJCQkgIGxvZmZfdCAqb2Zmc2V0ICkKK3sKKwlsb2ZmX3QgcG9zID0gKm9mZnNldDsKKwlzdHJ1Y3QgcHJvY19kYXRhICpwcml2ID0gKHN0cnVjdCBwcm9jX2RhdGEqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghcHJpdi0+cmJ1ZmZlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBvcyA+PSBwcml2LT5yZWFkbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAobGVuID4gcHJpdi0+cmVhZGxlbiAtIHBvcykKKwkJbGVuID0gcHJpdi0+cmVhZGxlbiAtIHBvczsKKwlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgcHJpdi0+cmJ1ZmZlciArIHBvcywgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJKm9mZnNldCA9IHBvcyArIGxlbjsKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogIFRoZSB3cml0ZSByb3V0aW5lIGlzIGdlbmVyaWMsIGl0IGZpbGxzIGluIGEgcHJlYWxsb2NhdGVkIHJidWZmZXIKKyAqICB0byBzdXBwbHkgdGhlIGRhdGEuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGUoIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgIHNpemVfdCBsZW4sCisJCQkgICBsb2ZmX3QgKm9mZnNldCApCit7CisJbG9mZl90IHBvcyA9ICpvZmZzZXQ7CisJc3RydWN0IHByb2NfZGF0YSAqcHJpdiA9IChzdHJ1Y3QgcHJvY19kYXRhKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIXByaXYtPndidWZmZXIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBvcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwb3MgPj0gcHJpdi0+bWF4d3JpdGVsZW4pCisJCXJldHVybiAwOworCWlmIChsZW4gPiBwcml2LT5tYXh3cml0ZWxlbiAtIHBvcykKKwkJbGVuID0gcHJpdi0+bWF4d3JpdGVsZW4gLSBwb3M7CisJaWYgKGNvcHlfZnJvbV91c2VyKHByaXYtPndidWZmZXIgKyBwb3MsIGJ1ZmZlciwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCBwb3MgKyBsZW4gPiBwcml2LT53cml0ZWxlbiApCisJCXByaXYtPndyaXRlbGVuID0gbGVuICsgZmlsZS0+Zl9wb3M7CisJKm9mZnNldCA9IHBvcyArIGxlbjsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHByb2Nfc3RhdHVzX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFwcml2ID0gZGV2LT5wcml2OworCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsKKwlTdGF0dXNSaWQgc3RhdHVzX3JpZDsKKwlpbnQgaTsKKworCWlmICgoZmlsZS0+cHJpdmF0ZV9kYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHByb2NfZGF0YSApLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGZpbGUtPnByaXZhdGVfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEpKTsKKwlkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKChkYXRhLT5yYnVmZmVyID0ga21hbGxvYyggMjA0OCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZWFkU3RhdHVzUmlkKGFwcml2LCAmc3RhdHVzX3JpZCwgMSk7CisJcmVhZENhcGFiaWxpdHlSaWQoYXByaXYsICZjYXBfcmlkLCAxKTsKKworICAgICAgICBpID0gc3ByaW50ZihkYXRhLT5yYnVmZmVyLCAiU3RhdHVzOiAlcyVzJXMlcyVzJXMlcyVzJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c19yaWQubW9kZSAmIDEgPyAiQ0ZHICI6ICIiLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfcmlkLm1vZGUgJiAyID8gIkFDVCAiOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3JpZC5tb2RlICYgMHgxMCA/ICJTWU4gIjogIiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c19yaWQubW9kZSAmIDB4MjAgPyAiTE5LICI6ICIiLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfcmlkLm1vZGUgJiAweDQwID8gIkxFQVAgIjogIiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c19yaWQubW9kZSAmIDB4ODAgPyAiUFJJViAiOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3JpZC5tb2RlICYgMHgxMDAgPyAiS0VZICI6ICIiLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfcmlkLm1vZGUgJiAweDIwMCA/ICJXRVAgIjogIiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c19yaWQubW9kZSAmIDB4ODAwMCA/ICJFUlIgIjogIiIpOworCXNwcmludGYoIGRhdGEtPnJidWZmZXIraSwgIk1vZGU6ICV4XG4iCisJCSAiU2lnbmFsIFN0cmVuZ3RoOiAlZFxuIgorCQkgIlNpZ25hbCBRdWFsaXR5OiAlZFxuIgorCQkgIlNTSUQ6ICUtLipzXG4iCisJCSAiQVA6ICUtLjE2c1xuIgorCQkgIkZyZXE6ICVkXG4iCisJCSAiQml0UmF0ZTogJWRtYnNcbiIKKwkJICJEcml2ZXIgVmVyc2lvbjogJXNcbiIKKwkJICJEZXZpY2U6ICVzXG5NYW51ZmFjdHVyZXI6ICVzXG5GaXJtd2FyZSBWZXJzaW9uOiAlc1xuIgorCQkgIlJhZGlvIHR5cGU6ICV4XG5Db3VudHJ5OiAleFxuSGFyZHdhcmUgVmVyc2lvbjogJXhcbiIKKwkJICJTb2Z0d2FyZSBWZXJzaW9uOiAleFxuU29mdHdhcmUgU3VidmVyc2lvbjogJXhcbiIKKwkJICJCb290IGJsb2NrIHZlcnNpb246ICV4XG4iLAorCQkgKGludClzdGF0dXNfcmlkLm1vZGUsCisJCSAoaW50KXN0YXR1c19yaWQubm9ybWFsaXplZFNpZ25hbFN0cmVuZ3RoLAorCQkgKGludClzdGF0dXNfcmlkLnNpZ25hbFF1YWxpdHksCisJCSAoaW50KXN0YXR1c19yaWQuU1NJRGxlbiwKKwkJIHN0YXR1c19yaWQuU1NJRCwKKwkJIHN0YXR1c19yaWQuYXBOYW1lLAorCQkgKGludClzdGF0dXNfcmlkLmNoYW5uZWwsCisJCSAoaW50KXN0YXR1c19yaWQuY3VycmVudFhtaXRSYXRlLzIsCisJCSB2ZXJzaW9uLAorCQkgY2FwX3JpZC5wcm9kTmFtZSwKKwkJIGNhcF9yaWQubWFuTmFtZSwKKwkJIGNhcF9yaWQucHJvZFZlciwKKwkJIGNhcF9yaWQucmFkaW9UeXBlLAorCQkgY2FwX3JpZC5jb3VudHJ5LAorCQkgY2FwX3JpZC5oYXJkVmVyLAorCQkgKGludCljYXBfcmlkLnNvZnRWZXIsCisJCSAoaW50KWNhcF9yaWQuc29mdFN1YlZlciwKKwkJIChpbnQpY2FwX3JpZC5ib290QmxvY2tWZXIgKTsKKwlkYXRhLT5yZWFkbGVuID0gc3RybGVuKCBkYXRhLT5yYnVmZmVyICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19zdGF0c19yaWRfb3BlbihzdHJ1Y3QgaW5vZGUqLCBzdHJ1Y3QgZmlsZSosIHUxNik7CitzdGF0aWMgaW50IHByb2Nfc3RhdHNkZWx0YV9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlpZiAoZmlsZS0+Zl9tb2RlJkZNT0RFX1dSSVRFKSB7CisJCXJldHVybiBwcm9jX3N0YXRzX3JpZF9vcGVuKGlub2RlLCBmaWxlLCBSSURfU1RBVFNERUxUQUNMRUFSKTsKKwl9CisJcmV0dXJuIHByb2Nfc3RhdHNfcmlkX29wZW4oaW5vZGUsIGZpbGUsIFJJRF9TVEFUU0RFTFRBKTsKK30KKworc3RhdGljIGludCBwcm9jX3N0YXRzX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXJldHVybiBwcm9jX3N0YXRzX3JpZF9vcGVuKGlub2RlLCBmaWxlLCBSSURfU1RBVFMpOworfQorCitzdGF0aWMgaW50IHByb2Nfc3RhdHNfcmlkX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdTE2IHJpZCApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphcHJpdiA9IGRldi0+cHJpdjsKKwlTdGF0c1JpZCBzdGF0czsKKwlpbnQgaSwgajsKKwl1MzIgKnZhbHMgPSBzdGF0cy52YWxzOworCisJaWYgKChmaWxlLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhICksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmlsZS0+cHJpdmF0ZV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHByb2NfZGF0YSkpOworCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoKGRhdGEtPnJidWZmZXIgPSBrbWFsbG9jKCA0MDk2LCBHRlBfS0VSTkVMICkpID09IE5VTEwpIHsKKwkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJlYWRTdGF0c1JpZChhcHJpdiwgJnN0YXRzLCByaWQsIDEpOworCisgICAgICAgIGogPSAwOworCWZvcihpPTA7IHN0YXRzTGFiZWxzW2ldIT0oY2hhciAqKS0xICYmCisJCSAgICBpKjQ8c3RhdHMubGVuOyBpKyspeworCQlpZiAoIXN0YXRzTGFiZWxzW2ldKSBjb250aW51ZTsKKwkJaWYgKGorc3RybGVuKHN0YXRzTGFiZWxzW2ldKSsxNj40MDk2KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImFpcm86IFBvdGVudGlhbGx5IGRpc2FzdGVyb3VzIGJ1ZmZlciBvdmVyZmxvdyBhdmVydGVkIVxuIik7CisJCQlicmVhazsKKwkJfQorCQlqKz1zcHJpbnRmKGRhdGEtPnJidWZmZXIraiwgIiVzOiAldVxuIiwgc3RhdHNMYWJlbHNbaV0sIHZhbHNbaV0pOworCX0KKwlpZiAoaSo0Pj1zdGF0cy5sZW4peworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiYWlybzogR290IGEgc2hvcnQgcmlkXG4iKTsKKwl9CisJZGF0YS0+cmVhZGxlbiA9IGo7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2RlY191MTYoIGNoYXIgKmJ1ZmZlciwgaW50ICpzdGFydCwgaW50IGxpbWl0ICkgeworCXUxNiB2YWx1ZTsKKwlpbnQgdmFsaWQgPSAwOworCWZvciggdmFsdWUgPSAwOyBidWZmZXJbKnN0YXJ0XSA+PSAnMCcgJiYKKwkJICAgICBidWZmZXJbKnN0YXJ0XSA8PSAnOScgJiYKKwkJICAgICAqc3RhcnQgPCBsaW1pdDsgKCpzdGFydCkrKyApIHsKKwkJdmFsaWQgPSAxOworCQl2YWx1ZSAqPSAxMDsKKwkJdmFsdWUgKz0gYnVmZmVyWypzdGFydF0gLSAnMCc7CisJfQorCWlmICggIXZhbGlkICkgcmV0dXJuIC0xOworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBhaXJvX2NvbmZpZ19jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHZvaWQgKnp3cnEsCisJCQkgICAgICBjaGFyICpleHRyYSk7CisKK3N0YXRpYyB2b2lkIHByb2NfY29uZmlnX29uX2Nsb3NlKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwljaGFyICpsaW5lOworCisJaWYgKCAhZGF0YS0+d3JpdGVsZW4gKSByZXR1cm47CisKKwlyZWFkQ29uZmlnUmlkKGFpLCAxKTsKKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisKKwlsaW5lID0gZGF0YS0+d2J1ZmZlcjsKKwl3aGlsZSggbGluZVswXSApIHsKKy8qKiogTW9kZSBwcm9jZXNzaW5nICovCisJCWlmICggIXN0cm5jbXAoIGxpbmUsICJNb2RlOiAiLCA2ICkgKSB7CisJCQlsaW5lICs9IDY7CisJCQlpZiAoKGFpLT5jb25maWcucm1vZGUgJiAweGZmKSA+PSBSWE1PREVfUkZNT04pCisJCQkJCXNldF9iaXQgKEZMQUdfUkVTRVQsICZhaS0+ZmxhZ3MpOworCQkJYWktPmNvbmZpZy5ybW9kZSAmPSAweGZlMDA7CisJCQljbGVhcl9iaXQgKEZMQUdfODAyXzExLCAmYWktPmZsYWdzKTsKKwkJCWFpLT5jb25maWcub3Btb2RlICY9IDB4RkYwMDsKKwkJCWFpLT5jb25maWcuc2Nhbk1vZGUgPSBTQ0FOTU9ERV9BQ1RJVkU7CisJCQlpZiAoIGxpbmVbMF0gPT0gJ2EnICkgeworCQkJCWFpLT5jb25maWcub3Btb2RlIHw9IDA7CisJCQl9IGVsc2UgeworCQkJCWFpLT5jb25maWcub3Btb2RlIHw9IDE7CisJCQkJaWYgKCBsaW5lWzBdID09ICdyJyApIHsKKwkJCQkJYWktPmNvbmZpZy5ybW9kZSB8PSBSWE1PREVfUkZNT04gfCBSWE1PREVfRElTQUJMRV84MDJfM19IRUFERVI7CisJCQkJCWFpLT5jb25maWcuc2Nhbk1vZGUgPSBTQ0FOTU9ERV9QQVNTSVZFOworCQkJCQlzZXRfYml0IChGTEFHXzgwMl8xMSwgJmFpLT5mbGFncyk7CisJCQkJfSBlbHNlIGlmICggbGluZVswXSA9PSAneScgKSB7CisJCQkJCWFpLT5jb25maWcucm1vZGUgfD0gUlhNT0RFX1JGTU9OX0FOWUJTUyB8IFJYTU9ERV9ESVNBQkxFXzgwMl8zX0hFQURFUjsKKwkJCQkJYWktPmNvbmZpZy5zY2FuTW9kZSA9IFNDQU5NT0RFX1BBU1NJVkU7CisJCQkJCXNldF9iaXQgKEZMQUdfODAyXzExLCAmYWktPmZsYWdzKTsKKwkJCQl9IGVsc2UgaWYgKCBsaW5lWzBdID09ICdsJyApCisJCQkJCWFpLT5jb25maWcucm1vZGUgfD0gUlhNT0RFX0xBTk1PTjsKKwkJCX0KKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfQorCisvKioqIFJhZGlvIHN0YXR1cyAqLworCQllbHNlIGlmICghc3RybmNtcChsaW5lLCJSYWRpbzogIiwgNykpIHsKKwkJCWxpbmUgKz0gNzsKKwkJCWlmICghc3RybmNtcChsaW5lLCJvZmYiLDMpKSB7CisJCQkJc2V0X2JpdCAoRkxBR19SQURJT19PRkYsICZhaS0+ZmxhZ3MpOworCQkJfSBlbHNlIHsKKwkJCQljbGVhcl9iaXQgKEZMQUdfUkFESU9fT0ZGLCAmYWktPmZsYWdzKTsKKwkJCX0KKwkJfQorLyoqKiBOb2RlTmFtZSBwcm9jZXNzaW5nICovCisJCWVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIk5vZGVOYW1lOiAiLCAxMCApICkgeworCQkJaW50IGo7CisKKwkJCWxpbmUgKz0gMTA7CisJCQltZW1zZXQoIGFpLT5jb25maWcubm9kZU5hbWUsIDAsIDE2ICk7CisvKiBEbyB0aGUgbmFtZSwgYXNzdW1lIGEgc3BhY2UgYmV0d2VlbiB0aGUgbW9kZSBhbmQgbm9kZSBuYW1lICovCisJCQlmb3IoIGogPSAwOyBqIDwgMTYgJiYgbGluZVtqXSAhPSAnXG4nOyBqKysgKSB7CisJCQkJYWktPmNvbmZpZy5ub2RlTmFtZVtqXSA9IGxpbmVbal07CisJCQl9CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0KKworLyoqKiBQb3dlck1vZGUgcHJvY2Vzc2luZyAqLworCQllbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJQb3dlck1vZGU6ICIsIDExICkgKSB7CisJCQlsaW5lICs9IDExOworCQkJaWYgKCAhc3RybmNtcCggbGluZSwgIlBTUENBTSIsIDYgKSApIHsKKwkJCQlhaS0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPSBQT1dFUlNBVkVfUFNQQ0FNOworCQkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiUFNQIiwgMyApICkgeworCQkJCWFpLT5jb25maWcucG93ZXJTYXZlTW9kZSA9IFBPV0VSU0FWRV9QU1A7CisJCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQkJfSBlbHNlIHsKKwkJCQlhaS0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPSBQT1dFUlNBVkVfQ0FNOworCQkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJCX0KKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJEYXRhUmF0ZXM6ICIsIDExICkgKSB7CisJCQlpbnQgdiwgaSA9IDAsIGsgPSAwOyAvKiBpIGlzIGluZGV4IGludG8gbGluZSwKKwkJCQkJCWsgaXMgaW5kZXggdG8gcmF0ZXMgKi8KKworCQkJbGluZSArPSAxMTsKKwkJCXdoaWxlKCh2ID0gZ2V0X2RlY191MTYobGluZSwgJmksIDMpKSE9LTEpIHsKKwkJCQlhaS0+Y29uZmlnLnJhdGVzW2srK10gPSAodTgpdjsKKwkJCQlsaW5lICs9IGkgKyAxOworCQkJCWkgPSAwOworCQkJfQorCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIkNoYW5uZWw6ICIsIDkgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKwkJCWxpbmUgKz0gOTsKKwkJCXYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgaSszKTsKKwkJCWlmICggdiAhPSAtMSApIHsKKwkJCQlhaS0+Y29uZmlnLmNoYW5uZWxTZXQgPSAodTE2KXY7CisJCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQkJfQorCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIlhtaXRQb3dlcjogIiwgMTEgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKwkJCWxpbmUgKz0gMTE7CisJCQl2ID0gZ2V0X2RlY191MTYobGluZSwgJmksIGkrMyk7CisJCQlpZiAoIHYgIT0gLTEgKSB7CisJCQkJYWktPmNvbmZpZy50eFBvd2VyID0gKHUxNil2OworCQkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJCX0KKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJXRVA6ICIsIDUgKSApIHsKKwkJCWxpbmUgKz0gNTsKKwkJCXN3aXRjaCggbGluZVswXSApIHsKKwkJCWNhc2UgJ3MnOgorCQkJCWFpLT5jb25maWcuYXV0aFR5cGUgPSAodTE2KUFVVEhfU0hBUkVES0VZOworCQkJCWJyZWFrOworCQkJY2FzZSAnZSc6CisJCQkJYWktPmNvbmZpZy5hdXRoVHlwZSA9ICh1MTYpQVVUSF9FTkNSWVBUOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlhaS0+Y29uZmlnLmF1dGhUeXBlID0gKHUxNilBVVRIX09QRU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiTG9uZ1JldHJ5TGltaXQ6ICIsIDE2ICkgKSB7CisJCQlpbnQgdiwgaSA9IDA7CisKKwkJCWxpbmUgKz0gMTY7CisJCQl2ID0gZ2V0X2RlY191MTYobGluZSwgJmksIDMpOworCQkJdiA9ICh2PDApID8gMCA6ICgodj4yNTUpID8gMjU1IDogdik7CisJCQlhaS0+Y29uZmlnLmxvbmdSZXRyeUxpbWl0ID0gKHUxNil2OworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIlNob3J0UmV0cnlMaW1pdDogIiwgMTcgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKworCQkJbGluZSArPSAxNzsKKwkJCXYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgMyk7CisJCQl2ID0gKHY8MCkgPyAwIDogKCh2PjI1NSkgPyAyNTUgOiB2KTsKKwkJCWFpLT5jb25maWcuc2hvcnRSZXRyeUxpbWl0ID0gKHUxNil2OworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIlJUU1RocmVzaG9sZDogIiwgMTQgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKworCQkJbGluZSArPSAxNDsKKwkJCXYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgNCk7CisJCQl2ID0gKHY8MCkgPyAwIDogKCh2PjIzMTIpID8gMjMxMiA6IHYpOworCQkJYWktPmNvbmZpZy5ydHNUaHJlcyA9ICh1MTYpdjsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJUWE1TRFVMaWZldGltZTogIiwgMTYgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKworCQkJbGluZSArPSAxNjsKKwkJCXYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgNSk7CisJCQl2ID0gKHY8MCkgPyAwIDogdjsKKwkJCWFpLT5jb25maWcudHhMaWZldGltZSA9ICh1MTYpdjsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJSWE1TRFVMaWZldGltZTogIiwgMTYgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKworCQkJbGluZSArPSAxNjsKKwkJCXYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgNSk7CisJCQl2ID0gKHY8MCkgPyAwIDogdjsKKwkJCWFpLT5jb25maWcucnhMaWZldGltZSA9ICh1MTYpdjsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJUWERpdmVyc2l0eTogIiwgMTMgKSApIHsKKwkJCWFpLT5jb25maWcudHhEaXZlcnNpdHkgPQorCQkJCShsaW5lWzEzXT09J2wnKSA/IDEgOgorCQkJCSgobGluZVsxM109PSdyJyk/IDI6IDMpOworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIlJYRGl2ZXJzaXR5OiAiLCAxMyApICkgeworCQkJYWktPmNvbmZpZy5yeERpdmVyc2l0eSA9CisJCQkJKGxpbmVbMTNdPT0nbCcpID8gMSA6CisJCQkJKChsaW5lWzEzXT09J3InKT8gMjogMyk7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiRnJhZ1RocmVzaG9sZDogIiwgMTUgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKworCQkJbGluZSArPSAxNTsKKwkJCXYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgNCk7CisJCQl2ID0gKHY8MjU2KSA/IDI1NiA6ICgodj4yMzEyKSA/IDIzMTIgOiB2KTsKKwkJCXYgPSB2ICYgMHhmZmZlOyAvKiBNYWtlIHN1cmUgaXRzIGV2ZW4gKi8KKwkJCWFpLT5jb25maWcuZnJhZ1RocmVzaCA9ICh1MTYpdjsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfSBlbHNlIGlmICghc3RybmNtcChsaW5lLCAiTW9kdWxhdGlvbjogIiwgMTIpKSB7CisJCQlsaW5lICs9IDEyOworCQkJc3dpdGNoKCpsaW5lKSB7CisJCQljYXNlICdkJzogIGFpLT5jb25maWcubW9kdWxhdGlvbj1NT0RfREVGQVVMVDsgc2V0X2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7IGJyZWFrOworCQkJY2FzZSAnYyc6ICBhaS0+Y29uZmlnLm1vZHVsYXRpb249TU9EX0NDSzsgc2V0X2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7IGJyZWFrOworCQkJY2FzZSAnbSc6ICBhaS0+Y29uZmlnLm1vZHVsYXRpb249TU9EX01PSzsgc2V0X2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7IGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoIEtFUk5fV0FSTklORyAiYWlybzogVW5rbm93biBtb2R1bGF0aW9uXG4iICk7CisJCQl9CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAobGluZSwgIlByZWFtYmxlOiAiLCAxMCkpIHsKKwkJCWxpbmUgKz0gMTA7CisJCQlzd2l0Y2goKmxpbmUpIHsKKwkJCWNhc2UgJ2EnOiBhaS0+Y29uZmlnLnByZWFtYmxlPVBSRUFNQkxFX0FVVE87IHNldF9iaXQoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOyBicmVhazsKKwkJCWNhc2UgJ2wnOiBhaS0+Y29uZmlnLnByZWFtYmxlPVBSRUFNQkxFX0xPTkc7IHNldF9iaXQoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOyBicmVhazsKKwkJCWNhc2UgJ3MnOiBhaS0+Y29uZmlnLnByZWFtYmxlPVBSRUFNQkxFX1NIT1JUOyBzZXRfYml0KEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsgYnJlYWs7CisJCSAgICAgICAgZGVmYXVsdDogcHJpbnRrKEtFUk5fV0FSTklORyAiYWlybzogVW5rbm93biBwcmVhbWJsZVxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcmludGsoIEtFUk5fV0FSTklORyAiQ291bGRuJ3QgZmlndXJlIG91dCAlc1xuIiwgbGluZSApOworCQl9CisJCXdoaWxlKCBsaW5lWzBdICYmIGxpbmVbMF0gIT0gJ1xuJyApIGxpbmUrKzsKKwkJaWYgKCBsaW5lWzBdICkgbGluZSsrOworCX0KKwlhaXJvX2NvbmZpZ19jb21taXQoZGV2LCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIGNoYXIgKmdldF9ybW9kZSh1MTYgbW9kZSkgeworICAgICAgICBzd2l0Y2gobW9kZSYweGZmKSB7CisgICAgICAgIGNhc2UgUlhNT0RFX1JGTU9OOiAgcmV0dXJuICJyZm1vbiI7CisgICAgICAgIGNhc2UgUlhNT0RFX1JGTU9OX0FOWUJTUzogIHJldHVybiAieW5hIChhbnkpIGJzcyByZm1vbiI7CisgICAgICAgIGNhc2UgUlhNT0RFX0xBTk1PTjogIHJldHVybiAibGFubW9uIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIkVTUyI7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19jb25maWdfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKSB7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJaW50IGk7CisKKwlpZiAoKGZpbGUtPnByaXZhdGVfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEgKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChmaWxlLT5wcml2YXRlX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhKSk7CisJZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGttYWxsb2MoIDIwNDgsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmICgoZGF0YS0+d2J1ZmZlciA9IGttYWxsb2MoIDIwNDgsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZGF0YS0+cmJ1ZmZlcik7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCBkYXRhLT53YnVmZmVyLCAwLCAyMDQ4ICk7CisJZGF0YS0+bWF4d3JpdGVsZW4gPSAyMDQ4OworCWRhdGEtPm9uX2Nsb3NlID0gcHJvY19jb25maWdfb25fY2xvc2U7CisKKwlyZWFkQ29uZmlnUmlkKGFpLCAxKTsKKworCWkgPSBzcHJpbnRmKCBkYXRhLT5yYnVmZmVyLAorCQkgICAgICJNb2RlOiAlc1xuIgorCQkgICAgICJSYWRpbzogJXNcbiIKKwkJICAgICAiTm9kZU5hbWU6ICUtMTZzXG4iCisJCSAgICAgIlBvd2VyTW9kZTogJXNcbiIKKwkJICAgICAiRGF0YVJhdGVzOiAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIgorCQkgICAgICJDaGFubmVsOiAlZFxuIgorCQkgICAgICJYbWl0UG93ZXI6ICVkXG4iLAorCQkgICAgIChhaS0+Y29uZmlnLm9wbW9kZSAmIDB4RkYpID09IDAgPyAiYWRob2MiIDoKKwkJICAgICAoYWktPmNvbmZpZy5vcG1vZGUgJiAweEZGKSA9PSAxID8gZ2V0X3Jtb2RlKGFpLT5jb25maWcucm1vZGUpOgorCQkgICAgIChhaS0+Y29uZmlnLm9wbW9kZSAmIDB4RkYpID09IDIgPyAiQVAiIDoKKwkJICAgICAoYWktPmNvbmZpZy5vcG1vZGUgJiAweEZGKSA9PSAzID8gIkFQIFJQVFIiIDogIkVycm9yIiwKKwkJICAgICB0ZXN0X2JpdChGTEFHX1JBRElPX09GRiwgJmFpLT5mbGFncykgPyAib2ZmIiA6ICJvbiIsCisJCSAgICAgYWktPmNvbmZpZy5ub2RlTmFtZSwKKwkJICAgICBhaS0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPT0gMCA/ICJDQU0iIDoKKwkJICAgICBhaS0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPT0gMSA/ICJQU1AiIDoKKwkJICAgICBhaS0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPT0gMiA/ICJQU1BDQU0iIDogIkVycm9yIiwKKwkJICAgICAoaW50KWFpLT5jb25maWcucmF0ZXNbMF0sCisJCSAgICAgKGludClhaS0+Y29uZmlnLnJhdGVzWzFdLAorCQkgICAgIChpbnQpYWktPmNvbmZpZy5yYXRlc1syXSwKKwkJICAgICAoaW50KWFpLT5jb25maWcucmF0ZXNbM10sCisJCSAgICAgKGludClhaS0+Y29uZmlnLnJhdGVzWzRdLAorCQkgICAgIChpbnQpYWktPmNvbmZpZy5yYXRlc1s1XSwKKwkJICAgICAoaW50KWFpLT5jb25maWcucmF0ZXNbNl0sCisJCSAgICAgKGludClhaS0+Y29uZmlnLnJhdGVzWzddLAorCQkgICAgIChpbnQpYWktPmNvbmZpZy5jaGFubmVsU2V0LAorCQkgICAgIChpbnQpYWktPmNvbmZpZy50eFBvd2VyCisJCSk7CisJc3ByaW50ZiggZGF0YS0+cmJ1ZmZlciArIGksCisJCSAiTG9uZ1JldHJ5TGltaXQ6ICVkXG4iCisJCSAiU2hvcnRSZXRyeUxpbWl0OiAlZFxuIgorCQkgIlJUU1RocmVzaG9sZDogJWRcbiIKKwkJICJUWE1TRFVMaWZldGltZTogJWRcbiIKKwkJICJSWE1TRFVMaWZldGltZTogJWRcbiIKKwkJICJUWERpdmVyc2l0eTogJXNcbiIKKwkJICJSWERpdmVyc2l0eTogJXNcbiIKKwkJICJGcmFnVGhyZXNob2xkOiAlZFxuIgorCQkgIldFUDogJXNcbiIKKwkJICJNb2R1bGF0aW9uOiAlc1xuIgorCQkgIlByZWFtYmxlOiAlc1xuIiwKKwkJIChpbnQpYWktPmNvbmZpZy5sb25nUmV0cnlMaW1pdCwKKwkJIChpbnQpYWktPmNvbmZpZy5zaG9ydFJldHJ5TGltaXQsCisJCSAoaW50KWFpLT5jb25maWcucnRzVGhyZXMsCisJCSAoaW50KWFpLT5jb25maWcudHhMaWZldGltZSwKKwkJIChpbnQpYWktPmNvbmZpZy5yeExpZmV0aW1lLAorCQkgYWktPmNvbmZpZy50eERpdmVyc2l0eSA9PSAxID8gImxlZnQiIDoKKwkJIGFpLT5jb25maWcudHhEaXZlcnNpdHkgPT0gMiA/ICJyaWdodCIgOiAiYm90aCIsCisJCSBhaS0+Y29uZmlnLnJ4RGl2ZXJzaXR5ID09IDEgPyAibGVmdCIgOgorCQkgYWktPmNvbmZpZy5yeERpdmVyc2l0eSA9PSAyID8gInJpZ2h0IiA6ICJib3RoIiwKKwkJIChpbnQpYWktPmNvbmZpZy5mcmFnVGhyZXNoLAorCQkgYWktPmNvbmZpZy5hdXRoVHlwZSA9PSBBVVRIX0VOQ1JZUFQgPyAiZW5jcnlwdCIgOgorCQkgYWktPmNvbmZpZy5hdXRoVHlwZSA9PSBBVVRIX1NIQVJFREtFWSA/ICJzaGFyZWQiIDogIm9wZW4iLAorCQkgYWktPmNvbmZpZy5tb2R1bGF0aW9uID09IDAgPyAiZGVmYXVsdCIgOgorCQkgYWktPmNvbmZpZy5tb2R1bGF0aW9uID09IE1PRF9DQ0sgPyAiY2NrIiA6CisJCSBhaS0+Y29uZmlnLm1vZHVsYXRpb24gPT0gTU9EX01PSyA/ICJtb2siIDogImVycm9yIiwKKwkJIGFpLT5jb25maWcucHJlYW1ibGUgPT0gUFJFQU1CTEVfQVVUTyA/ICJhdXRvIiA6CisJCSBhaS0+Y29uZmlnLnByZWFtYmxlID09IFBSRUFNQkxFX0xPTkcgPyAibG9uZyIgOgorCQkgYWktPmNvbmZpZy5wcmVhbWJsZSA9PSBQUkVBTUJMRV9TSE9SVCA/ICJzaG9ydCIgOiAiZXJyb3IiCisJCSk7CisJZGF0YS0+cmVhZGxlbiA9IHN0cmxlbiggZGF0YS0+cmJ1ZmZlciApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcm9jX1NTSURfb25fY2xvc2UoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJU3NpZFJpZCBTU0lEX3JpZDsKKwlSZXNwIHJzcDsKKwlpbnQgaTsKKwlpbnQgb2Zmc2V0ID0gMDsKKworCWlmICggIWRhdGEtPndyaXRlbGVuICkgcmV0dXJuOworCisJbWVtc2V0KCAmU1NJRF9yaWQsIDAsIHNpemVvZiggU1NJRF9yaWQgKSApOworCisJZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApIHsKKwkJaW50IGo7CisJCWZvciggaiA9IDA7IGorb2Zmc2V0IDwgZGF0YS0+d3JpdGVsZW4gJiYgaiA8IDMyICYmCisJCQkgICAgIGRhdGEtPndidWZmZXJbb2Zmc2V0K2pdICE9ICdcbic7IGorKyApIHsKKwkJCVNTSURfcmlkLnNzaWRzW2ldLnNzaWRbal0gPSBkYXRhLT53YnVmZmVyW29mZnNldCtqXTsKKwkJfQorCQlpZiAoIGogPT0gMCApIGJyZWFrOworCQlTU0lEX3JpZC5zc2lkc1tpXS5sZW4gPSBqOworCQlvZmZzZXQgKz0gajsKKwkJd2hpbGUoIGRhdGEtPndidWZmZXJbb2Zmc2V0XSAhPSAnXG4nICYmCisJCSAgICAgICBvZmZzZXQgPCBkYXRhLT53cml0ZWxlbiApIG9mZnNldCsrOworCQlvZmZzZXQrKzsKKwl9CisJaWYgKGkpCisJCVNTSURfcmlkLmxlbiA9IHNpemVvZihTU0lEX3JpZCk7CisJZGlzYWJsZV9NQUMoYWksIDEpOworCXdyaXRlU3NpZFJpZChhaSwgJlNTSURfcmlkLCAxKTsKKwllbmFibGVfTUFDKGFpLCAmcnNwLCAxKTsKK30KKworaW5saW5lIHN0YXRpYyB1OCBoZXhWYWwoY2hhciBjKSB7CisJaWYgKGM+PScwJyAmJiBjPD0nOScpIHJldHVybiBjIC09ICcwJzsKKwlpZiAoYz49J2EnICYmIGM8PSdmJykgcmV0dXJuIGMgLT0gJ2EnLTEwOworCWlmIChjPj0nQScgJiYgYzw9J0YnKSByZXR1cm4gYyAtPSAnQSctMTA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByb2NfQVBMaXN0X29uX2Nsb3NlKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCUFQTGlzdFJpZCBBUExpc3RfcmlkOworCVJlc3AgcnNwOworCWludCBpOworCisJaWYgKCAhZGF0YS0+d3JpdGVsZW4gKSByZXR1cm47CisKKwltZW1zZXQoICZBUExpc3RfcmlkLCAwLCBzaXplb2YoQVBMaXN0X3JpZCkgKTsKKwlBUExpc3RfcmlkLmxlbiA9IHNpemVvZihBUExpc3RfcmlkKTsKKworCWZvciggaSA9IDA7IGkgPCA0ICYmIGRhdGEtPndyaXRlbGVuID49IChpKzEpKjYqMzsgaSsrICkgeworCQlpbnQgajsKKwkJZm9yKCBqID0gMDsgaiA8IDYqMyAmJiBkYXRhLT53YnVmZmVyW2oraSo2KjNdOyBqKysgKSB7CisJCQlzd2l0Y2goaiUzKSB7CisJCQljYXNlIDA6CisJCQkJQVBMaXN0X3JpZC5hcFtpXVtqLzNdPQorCQkJCQloZXhWYWwoZGF0YS0+d2J1ZmZlcltqK2kqNiozXSk8PDQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJQVBMaXN0X3JpZC5hcFtpXVtqLzNdfD0KKwkJCQkJaGV4VmFsKGRhdGEtPndidWZmZXJbaitpKjYqM10pOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWRpc2FibGVfTUFDKGFpLCAxKTsKKwl3cml0ZUFQTGlzdFJpZChhaSwgJkFQTGlzdF9yaWQsIDEpOworCWVuYWJsZV9NQUMoYWksICZyc3AsIDEpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdyYXBzIFBDNDUwMF93cml0ZXJpZCB3aXRoIGEgTUFDIGRpc2FibGUgKi8KK3N0YXRpYyBpbnQgZG9fd3JpdGVyaWQoIHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcmlkLCBjb25zdCB2b2lkICpyaWRfZGF0YSwKKwkJCWludCBsZW4sIGludCBkdW1teSApIHsKKwlpbnQgcmM7CisJUmVzcCByc3A7CisKKwlkaXNhYmxlX01BQyhhaSwgMSk7CisJcmMgPSBQQzQ1MDBfd3JpdGVyaWQoYWksIHJpZCwgcmlkX2RhdGEsIGxlbiwgMSk7CisJZW5hYmxlX01BQyhhaSwgJnJzcCwgMSk7CisJcmV0dXJuIHJjOworfQorCisvKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGtleSBhdCB0aGUgaW5kZXguICBJZiBpbmRleCA9PSAweGZmZmYKKyAqIHRoZSBpbmRleCBvZiB0aGUgdHJhbnNtaXQga2V5IGlzIHJldHVybmVkLiAgSWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0LAorICogLTEgd2lsbCBiZSByZXR1cm5lZC4KKyAqLworc3RhdGljIGludCBnZXRfd2VwX2tleShzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IGluZGV4KSB7CisJV2VwS2V5UmlkIHdrcjsKKwlpbnQgcmM7CisJdTE2IGxhc3RpbmRleDsKKworCXJjID0gcmVhZFdlcEtleVJpZChhaSwgJndrciwgMSwgMSk7CisJaWYgKHJjID09IFNVQ0NFU1MpIGRvIHsKKwkJbGFzdGluZGV4ID0gd2tyLmtpbmRleDsKKwkJaWYgKHdrci5raW5kZXggPT0gaW5kZXgpIHsKKwkJCWlmIChpbmRleCA9PSAweGZmZmYpIHsKKwkJCQlyZXR1cm4gd2tyLm1hY1swXTsKKwkJCX0KKwkJCXJldHVybiB3a3Iua2xlbjsKKwkJfQorCQlyZWFkV2VwS2V5UmlkKGFpLCAmd2tyLCAwLCAxKTsKKwl9IHdoaWxlKGxhc3RpbmRleCAhPSB3a3Iua2luZGV4KTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3dlcF9rZXkoc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiBpbmRleCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmtleSwgdTE2IGtleWxlbiwgaW50IHBlcm0sIGludCBsb2NrICkgeworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1hY2FkZHJbRVRIX0FMRU5dID0geyAweDAxLCAwLCAwLCAwLCAwLCAwIH07CisJV2VwS2V5UmlkIHdrcjsKKwlSZXNwIHJzcDsKKworCW1lbXNldCgmd2tyLCAwLCBzaXplb2Yod2tyKSk7CisJaWYgKGtleWxlbiA9PSAwKSB7CisvLyBXZSBhcmUgc2VsZWN0aW5nIHdoaWNoIGtleSB0byB1c2UKKwkJd2tyLmxlbiA9IHNpemVvZih3a3IpOworCQl3a3Iua2luZGV4ID0gMHhmZmZmOworCQl3a3IubWFjWzBdID0gKGNoYXIpaW5kZXg7CisJCWlmIChwZXJtKSBwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIHRyYW5zbWl0IGtleSB0byAlZFxuIiwgaW5kZXgpOworCQlpZiAocGVybSkgYWktPmRlZmluZGV4ID0gKGNoYXIpaW5kZXg7CisJfSBlbHNlIHsKKy8vIFdlIGFyZSBhY3R1YWxseSBzZXR0aW5nIHRoZSBrZXkKKwkJd2tyLmxlbiA9IHNpemVvZih3a3IpOworCQl3a3Iua2luZGV4ID0gaW5kZXg7CisJCXdrci5rbGVuID0ga2V5bGVuOworCQltZW1jcHkoIHdrci5rZXksIGtleSwga2V5bGVuICk7CisJCW1lbWNweSggd2tyLm1hYywgbWFjYWRkciwgRVRIX0FMRU4gKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU2V0dGluZyBrZXkgJWRcbiIsIGluZGV4KTsKKwl9CisKKwlkaXNhYmxlX01BQyhhaSwgbG9jayk7CisJd3JpdGVXZXBLZXlSaWQoYWksICZ3a3IsIHBlcm0sIGxvY2spOworCWVuYWJsZV9NQUMoYWksICZyc3AsIGxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcm9jX3dlcGtleV9vbl9jbG9zZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKSB7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJaW50IGk7CisJY2hhciBrZXlbMTZdOworCXUxNiBpbmRleCA9IDA7CisJaW50IGogPSAwOworCisJbWVtc2V0KGtleSwgMCwgc2l6ZW9mKGtleSkpOworCisJZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICggIWRhdGEtPndyaXRlbGVuICkgcmV0dXJuOworCisJaWYgKGRhdGEtPndidWZmZXJbMF0gPj0gJzAnICYmIGRhdGEtPndidWZmZXJbMF0gPD0gJzMnICYmCisJICAgIChkYXRhLT53YnVmZmVyWzFdID09ICcgJyB8fCBkYXRhLT53YnVmZmVyWzFdID09ICdcbicpKSB7CisJCWluZGV4ID0gZGF0YS0+d2J1ZmZlclswXSAtICcwJzsKKwkJaWYgKGRhdGEtPndidWZmZXJbMV0gPT0gJ1xuJykgeworCQkJc2V0X3dlcF9rZXkoYWksIGluZGV4LCBOVUxMLCAwLCAxLCAxKTsKKwkJCXJldHVybjsKKwkJfQorCQlqID0gMjsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86ICBXZXBLZXkgcGFzc2VkIGludmFsaWQga2V5IGluZGV4XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWZvciggaSA9IDA7IGkgPCAxNiozICYmIGRhdGEtPndidWZmZXJbaStqXTsgaSsrICkgeworCQlzd2l0Y2goaSUzKSB7CisJCWNhc2UgMDoKKwkJCWtleVtpLzNdID0gaGV4VmFsKGRhdGEtPndidWZmZXJbaStqXSk8PDQ7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJa2V5W2kvM10gfD0gaGV4VmFsKGRhdGEtPndidWZmZXJbaStqXSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzZXRfd2VwX2tleShhaSwgaW5kZXgsIGtleSwgaS8zLCAxLCAxKTsKK30KKworc3RhdGljIGludCBwcm9jX3dlcGtleV9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwljaGFyICpwdHI7CisJV2VwS2V5UmlkIHdrcjsKKwl1MTYgbGFzdGluZGV4OworCWludCBqPTA7CisJaW50IHJjOworCisJaWYgKChmaWxlLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhICksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmlsZS0+cHJpdmF0ZV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHByb2NfZGF0YSkpOworCW1lbXNldCgmd2tyLCAwLCBzaXplb2Yod2tyKSk7CisJZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGttYWxsb2MoIDE4MCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGRhdGEtPnJidWZmZXIsIDAsIDE4MCk7CisJZGF0YS0+d3JpdGVsZW4gPSAwOworCWRhdGEtPm1heHdyaXRlbGVuID0gODA7CisJaWYgKChkYXRhLT53YnVmZmVyID0ga21hbGxvYyggODAsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZGF0YS0+cmJ1ZmZlcik7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCBkYXRhLT53YnVmZmVyLCAwLCA4MCApOworCWRhdGEtPm9uX2Nsb3NlID0gcHJvY193ZXBrZXlfb25fY2xvc2U7CisKKwlwdHIgPSBkYXRhLT5yYnVmZmVyOworCXN0cmNweShwdHIsICJObyB3ZXAga2V5c1xuIik7CisJcmMgPSByZWFkV2VwS2V5UmlkKGFpLCAmd2tyLCAxLCAxKTsKKwlpZiAocmMgPT0gU1VDQ0VTUykgZG8geworCQlsYXN0aW5kZXggPSB3a3Iua2luZGV4OworCQlpZiAod2tyLmtpbmRleCA9PSAweGZmZmYpIHsKKwkJCWogKz0gc3ByaW50ZihwdHIraiwgIlR4IGtleSA9ICVkXG4iLAorCQkJCSAgICAgKGludCl3a3IubWFjWzBdKTsKKwkJfSBlbHNlIHsKKwkJCWogKz0gc3ByaW50ZihwdHIraiwgIktleSAlZCBzZXQgd2l0aCBsZW5ndGggPSAlZFxuIiwKKwkJCQkgICAgIChpbnQpd2tyLmtpbmRleCwgKGludCl3a3Iua2xlbik7CisJCX0KKwkJcmVhZFdlcEtleVJpZChhaSwgJndrciwgMCwgMSk7CisJfSB3aGlsZSgobGFzdGluZGV4ICE9IHdrci5raW5kZXgpICYmIChqIDwgMTgwLTMwKSk7CisKKwlkYXRhLT5yZWFkbGVuID0gc3RybGVuKCBkYXRhLT5yYnVmZmVyICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19TU0lEX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCWludCBpOworCWNoYXIgKnB0cjsKKwlTc2lkUmlkIFNTSURfcmlkOworCisJaWYgKChmaWxlLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhICksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmlsZS0+cHJpdmF0ZV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHByb2NfZGF0YSkpOworCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoKGRhdGEtPnJidWZmZXIgPSBrbWFsbG9jKCAxMDQsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRhdGEtPndyaXRlbGVuID0gMDsKKwlkYXRhLT5tYXh3cml0ZWxlbiA9IDMzKjM7CisJaWYgKChkYXRhLT53YnVmZmVyID0ga21hbGxvYyggMzMqMywgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChkYXRhLT5yYnVmZmVyKTsKKwkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoIGRhdGEtPndidWZmZXIsIDAsIDMzKjMgKTsKKwlkYXRhLT5vbl9jbG9zZSA9IHByb2NfU1NJRF9vbl9jbG9zZTsKKworCXJlYWRTc2lkUmlkKGFpLCAmU1NJRF9yaWQpOworCXB0ciA9IGRhdGEtPnJidWZmZXI7CisJZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApIHsKKwkJaW50IGo7CisJCWlmICggIVNTSURfcmlkLnNzaWRzW2ldLmxlbiApIGJyZWFrOworCQlmb3IoIGogPSAwOyBqIDwgMzIgJiYKKwkJCSAgICAgaiA8IFNTSURfcmlkLnNzaWRzW2ldLmxlbiAmJgorCQkJICAgICBTU0lEX3JpZC5zc2lkc1tpXS5zc2lkW2pdOyBqKysgKSB7CisJCQkqcHRyKysgPSBTU0lEX3JpZC5zc2lkc1tpXS5zc2lkW2pdOworCQl9CisJCSpwdHIrKyA9ICdcbic7CisJfQorCSpwdHIgPSAnXDAnOworCWRhdGEtPnJlYWRsZW4gPSBzdHJsZW4oIGRhdGEtPnJidWZmZXIgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jX0FQTGlzdF9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKwljaGFyICpwdHI7CisJQVBMaXN0UmlkIEFQTGlzdF9yaWQ7CisKKwlpZiAoKGZpbGUtPnByaXZhdGVfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEgKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChmaWxlLT5wcml2YXRlX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhKSk7CisJZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGttYWxsb2MoIDEwNCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZGF0YS0+d3JpdGVsZW4gPSAwOworCWRhdGEtPm1heHdyaXRlbGVuID0gNCo2KjM7CisJaWYgKChkYXRhLT53YnVmZmVyID0ga21hbGxvYyggZGF0YS0+bWF4d3JpdGVsZW4sIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZGF0YS0+cmJ1ZmZlcik7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCBkYXRhLT53YnVmZmVyLCAwLCBkYXRhLT5tYXh3cml0ZWxlbiApOworCWRhdGEtPm9uX2Nsb3NlID0gcHJvY19BUExpc3Rfb25fY2xvc2U7CisKKwlyZWFkQVBMaXN0UmlkKGFpLCAmQVBMaXN0X3JpZCk7CisJcHRyID0gZGF0YS0+cmJ1ZmZlcjsKKwlmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkgeworLy8gV2UgZW5kIHdoZW4gd2UgZmluZCBhIHplcm8gTUFDCisJCWlmICggISooaW50KilBUExpc3RfcmlkLmFwW2ldICYmCisJCSAgICAgISooaW50KikmQVBMaXN0X3JpZC5hcFtpXVsyXSkgYnJlYWs7CisJCXB0ciArPSBzcHJpbnRmKHB0ciwgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICAgICAgIChpbnQpQVBMaXN0X3JpZC5hcFtpXVswXSwKKwkJCSAgICAgICAoaW50KUFQTGlzdF9yaWQuYXBbaV1bMV0sCisJCQkgICAgICAgKGludClBUExpc3RfcmlkLmFwW2ldWzJdLAorCQkJICAgICAgIChpbnQpQVBMaXN0X3JpZC5hcFtpXVszXSwKKwkJCSAgICAgICAoaW50KUFQTGlzdF9yaWQuYXBbaV1bNF0sCisJCQkgICAgICAgKGludClBUExpc3RfcmlkLmFwW2ldWzVdKTsKKwl9CisJaWYgKGk9PTApIHB0ciArPSBzcHJpbnRmKHB0ciwgIk5vdCB1c2luZyBzcGVjaWZpYyBBUHNcbiIpOworCisJKnB0ciA9ICdcMCc7CisJZGF0YS0+cmVhZGxlbiA9IHN0cmxlbiggZGF0YS0+cmJ1ZmZlciApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2NfQlNTTGlzdF9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwljaGFyICpwdHI7CisJQlNTTGlzdFJpZCBCU1NMaXN0X3JpZDsKKwlpbnQgcmM7CisJLyogSWYgZG9Mb3NlU3luYyBpcyBub3QgMSwgd2Ugd29uJ3QgZG8gYSBMb3NlIFN5bmMgKi8KKwlpbnQgZG9Mb3NlU3luYyA9IC0xOworCisJaWYgKChmaWxlLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhICksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmlsZS0+cHJpdmF0ZV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHByb2NfZGF0YSkpOworCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoKGRhdGEtPnJidWZmZXIgPSBrbWFsbG9jKCAxMDI0LCBHRlBfS0VSTkVMICkpID09IE5VTEwpIHsKKwkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkYXRhLT53cml0ZWxlbiA9IDA7CisJZGF0YS0+bWF4d3JpdGVsZW4gPSAwOworCWRhdGEtPndidWZmZXIgPSBOVUxMOworCWRhdGEtPm9uX2Nsb3NlID0gTlVMTDsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQkJQ21kIGNtZDsKKwkJCVJlc3AgcnNwOworCisJCQlpZiAoYWktPmZsYWdzICYgRkxBR19SQURJT19NQVNLKSByZXR1cm4gLUVORVRET1dOOworCQkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJCWNtZC5jbWQ9Q01EX0xJU1RCU1M7CisJCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwkJCXVwKCZhaS0+c2VtKTsKKwkJCWRhdGEtPnJlYWRsZW4gPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZG9Mb3NlU3luYyA9IDE7CisJfQorCXB0ciA9IGRhdGEtPnJidWZmZXI7CisJLyogVGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiBoZXJlIGlmIHRoZXJlIGFyZSBjb25jdXJyZW50IG9wZW5zLgorICAgICAgICAgICBTaW5jZSBpdCBpcyBhIHJhcmUgY29uZGl0aW9uLCB3ZSdsbCBqdXN0IGxpdmUgd2l0aCBpdCwgb3RoZXJ3aXNlCisgICAgICAgICAgIHdlIGhhdmUgdG8gYWRkIGEgc3BpbiBsb2NrLi4uICovCisJcmMgPSByZWFkQlNTTGlzdFJpZChhaSwgZG9Mb3NlU3luYywgJkJTU0xpc3RfcmlkKTsKKwl3aGlsZShyYyA9PSAwICYmIEJTU0xpc3RfcmlkLmluZGV4ICE9IDB4ZmZmZikgeworCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAlKnMgcnNzaSA9ICVkIiwKKwkJCQkoaW50KUJTU0xpc3RfcmlkLmJzc2lkWzBdLAorCQkJCShpbnQpQlNTTGlzdF9yaWQuYnNzaWRbMV0sCisJCQkJKGludClCU1NMaXN0X3JpZC5ic3NpZFsyXSwKKwkJCQkoaW50KUJTU0xpc3RfcmlkLmJzc2lkWzNdLAorCQkJCShpbnQpQlNTTGlzdF9yaWQuYnNzaWRbNF0sCisJCQkJKGludClCU1NMaXN0X3JpZC5ic3NpZFs1XSwKKwkJCQkoaW50KUJTU0xpc3RfcmlkLnNzaWRMZW4sCisJCQkJQlNTTGlzdF9yaWQuc3NpZCwKKwkJCQkoaW50KUJTU0xpc3RfcmlkLnJzc2kpOworCQlwdHIgKz0gc3ByaW50ZihwdHIsICIgY2hhbm5lbCA9ICVkICVzICVzICVzICVzXG4iLAorCQkJCShpbnQpQlNTTGlzdF9yaWQuZHNDaGFubmVsLAorCQkJCUJTU0xpc3RfcmlkLmNhcCAmIENBUF9FU1MgPyAiRVNTIiA6ICIiLAorCQkJCUJTU0xpc3RfcmlkLmNhcCAmIENBUF9JQlNTID8gImFkaG9jIiA6ICIiLAorCQkJCUJTU0xpc3RfcmlkLmNhcCAmIENBUF9QUklWQUNZID8gIndlcCIgOiAiIiwKKwkJCQlCU1NMaXN0X3JpZC5jYXAgJiBDQVBfU0hPUlRIRFIgPyAic2hvcnRoZHIiIDogIiIpOworCQlyYyA9IHJlYWRCU1NMaXN0UmlkKGFpLCAwLCAmQlNTTGlzdF9yaWQpOworCX0KKwkqcHRyID0gJ1wwJzsKKwlkYXRhLT5yZWFkbGVuID0gc3RybGVuKCBkYXRhLT5yYnVmZmVyICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19jbG9zZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKQoreworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoIGRhdGEtPm9uX2Nsb3NlICE9IE5VTEwgKSBkYXRhLT5vbl9jbG9zZSggaW5vZGUsIGZpbGUgKTsKKwlpZiAoIGRhdGEtPnJidWZmZXIgKSBrZnJlZSggZGF0YS0+cmJ1ZmZlciApOworCWlmICggZGF0YS0+d2J1ZmZlciApIGtmcmVlKCBkYXRhLT53YnVmZmVyICk7CisJa2ZyZWUoIGRhdGEgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX2xpc3QgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2VfbGlzdCAqbmV4dDsKK30gKmFpcm9fZGV2aWNlczsKKworLyogU2luY2UgdGhlIGNhcmQgZG9lc24ndCBhdXRvbWF0aWNhbGx5IHN3aXRjaCB0byB0aGUgcmlnaHQgV0VQIG1vZGUsCisgICB3ZSB3aWxsIG1ha2UgaXQgZG8gaXQuICBJZiB0aGUgY2FyZCBpc24ndCBhc3NvY2lhdGVkLCBldmVyeSBzZWNzIHdlCisgICB3aWxsIHN3aXRjaCBXRVAgbW9kZXMgdG8gc2VlIGlmIHRoYXQgd2lsbCBoZWxwLiAgSWYgdGhlIGNhcmQgaXMKKyAgIGFzc29jaWF0ZWQgd2Ugd2lsbCBjaGVjayBldmVyeSBtaW51dGUgdG8gc2VlIGlmIGFueXRoaW5nIGhhcworICAgY2hhbmdlZC4gKi8KK3N0YXRpYyB2b2lkIHRpbWVyX2Z1bmMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKSB7CisJc3RydWN0IGFpcm9faW5mbyAqYXByaXYgPSBkZXYtPnByaXY7CisJUmVzcCByc3A7CisKKy8qIFdlIGRvbid0IGhhdmUgYSBsaW5rIHNvIHRyeSBjaGFuZ2luZyB0aGUgYXV0aHR5cGUgKi8KKwlyZWFkQ29uZmlnUmlkKGFwcml2LCAwKTsKKwlkaXNhYmxlX01BQyhhcHJpdiwgMCk7CisJc3dpdGNoKGFwcml2LT5jb25maWcuYXV0aFR5cGUpIHsKKwkJY2FzZSBBVVRIX0VOQ1JZUFQ6CisvKiBTbyBkcm9wIHRvIE9QRU4gKi8KKwkJCWFwcml2LT5jb25maWcuYXV0aFR5cGUgPSBBVVRIX09QRU47CisJCQlicmVhazsKKwkJY2FzZSBBVVRIX1NIQVJFREtFWToKKwkJCWlmIChhcHJpdi0+a2V5aW5kZXggPCBhdXRvX3dlcCkgeworCQkJCXNldF93ZXBfa2V5KGFwcml2LCBhcHJpdi0+a2V5aW5kZXgsIE5VTEwsIDAsIDAsIDApOworCQkJCWFwcml2LT5jb25maWcuYXV0aFR5cGUgPSBBVVRIX1NIQVJFREtFWTsKKwkJCQlhcHJpdi0+a2V5aW5kZXgrKzsKKwkJCX0gZWxzZSB7CisJCQkgICAgICAgIC8qIERyb3AgdG8gRU5DUllQVCAqLworCQkJCWFwcml2LT5rZXlpbmRleCA9IDA7CisJCQkJc2V0X3dlcF9rZXkoYXByaXYsIGFwcml2LT5kZWZpbmRleCwgTlVMTCwgMCwgMCwgMCk7CisJCQkJYXByaXYtPmNvbmZpZy5hdXRoVHlwZSA9IEFVVEhfRU5DUllQVDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAgLyogV2UnbGwgZXNjYWxhdGUgdG8gU0hBUkVES0VZICovCisJCQlhcHJpdi0+Y29uZmlnLmF1dGhUeXBlID0gQVVUSF9TSEFSRURLRVk7CisJfQorCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYXByaXYtPmZsYWdzKTsKKwl3cml0ZUNvbmZpZ1JpZChhcHJpdiwgMCk7CisJZW5hYmxlX01BQyhhcHJpdiwgJnJzcCwgMCk7CisJdXAoJmFwcml2LT5zZW0pOworCisvKiBTY2hlZHVsZSBjaGVjayB0byBzZWUgaWYgdGhlIGNoYW5nZSB3b3JrZWQgKi8KKwljbGVhcl9iaXQoSk9CX0FVVE9XRVAsICZhcHJpdi0+ZmxhZ3MpOworCWFwcml2LT5leHBpcmVzID0gUlVOX0FUKEhaKjMpOworfQorCitzdGF0aWMgaW50IGFkZF9haXJvX2Rldiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9saXN0ICpub2RlID0ga21hbGxvYyggc2l6ZW9mKCAqbm9kZSApLCBHRlBfS0VSTkVMICk7CisJaWYgKCAhbm9kZSApCisJCXJldHVybiAtRU5PTUVNOworCisJbm9kZS0+ZGV2ID0gZGV2OworCW5vZGUtPm5leHQgPSBhaXJvX2RldmljZXM7CisJYWlyb19kZXZpY2VzID0gbm9kZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZWxfYWlyb19kZXYoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKSB7CisJc3RydWN0IG5ldF9kZXZpY2VfbGlzdCAqKnAgPSAmYWlyb19kZXZpY2VzOworCXdoaWxlKCAqcCAmJiAoICgqcCktPmRldiAhPSBkZXYgKSApCisJCXAgPSAmKCpwKS0+bmV4dDsKKwlpZiAoICpwICYmICgqcCktPmRldiA9PSBkZXYgKQorCQkqcCA9ICgqcCktPm5leHQ7Cit9CisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhaXJvX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBlbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpZiAocGRldi0+ZGV2aWNlID09IDB4NTAwMCB8fCBwZGV2LT5kZXZpY2UgPT0gMHhhNTA0KQorCQkJZGV2ID0gX2luaXRfYWlyb19jYXJkKHBkZXYtPmlycSwgcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsIDAsIHBkZXYsICZwZGV2LT5kZXYpOworCWVsc2UKKwkJCWRldiA9IF9pbml0X2Fpcm9fY2FyZChwZGV2LT5pcnEsIHBkZXYtPnJlc291cmNlWzJdLnN0YXJ0LCAwLCBwZGV2LCAmcGRldi0+ZGV2KTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGFpcm9fcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKK30KKworc3RhdGljIGludCBhaXJvX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlDbWQgY21kOworCVJlc3AgcnNwOworCisJaWYgKChhaS0+QVBMaXN0ID09IE5VTEwpICYmCisJCShhaS0+QVBMaXN0ID0ga21hbGxvYyhzaXplb2YoQVBMaXN0UmlkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWlmICgoYWktPlNTSUQgPT0gTlVMTCkgJiYKKwkJKGFpLT5TU0lEID0ga21hbGxvYyhzaXplb2YoU3NpZFJpZCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZWFkQVBMaXN0UmlkKGFpLCBhaS0+QVBMaXN0KTsKKwlyZWFkU3NpZFJpZChhaSwgYWktPlNTSUQpOworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJLyogdGhlIGxvY2sgd2lsbCBiZSByZWxlYXNlZCBhdCB0aGUgZW5kIG9mIHRoZSByZXN1bWUgY2FsbGJhY2sgKi8KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJcmV0dXJuIC1FQUdBSU47CisJZGlzYWJsZV9NQUMoYWksIDApOworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlhaS0+cG93ZXIgPSBzdGF0ZTsKKwljbWQuY21kPUhPU1RTTEVFUDsKKwlpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIHN0YXRlLCAxKTsKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlyZXR1cm4gcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgYWlyb19wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJUmVzcCByc3A7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBhaS0+cG93ZXIsIDApOworCisJaWYgKGFpLT5wb3dlciA+IDEpIHsKKwkJcmVzZXRfY2FyZChkZXYsIDApOworCQltcGlfaW5pdF9kZXNjcmlwdG9ycyhhaSk7CisJCXNldHVwX2NhcmQoYWksIGRldi0+ZGV2X2FkZHIsIDApOworCQljbGVhcl9iaXQoRkxBR19SQURJT19PRkYsICZhaS0+ZmxhZ3MpOworCQljbGVhcl9iaXQoRkxBR19QRU5ESU5HX1hNSVQsICZhaS0+ZmxhZ3MpOworCX0gZWxzZSB7CisJCU9VVDQ1MDAoYWksIEVWQUNLLCBFVl9BV0FLRU4pOworCQlPVVQ0NTAwKGFpLCBFVkFDSywgRVZfQVdBS0VOKTsKKwkJbXNsZWVwKDEwMCk7CisJfQorCisJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCWRpc2FibGVfTUFDKGFpLCAwKTsKKyAgICAgICAgbXNsZWVwKDIwMCk7CisJaWYgKGFpLT5TU0lEKSB7CisJCXdyaXRlU3NpZFJpZChhaSwgYWktPlNTSUQsIDApOworCQlrZnJlZShhaS0+U1NJRCk7CisJCWFpLT5TU0lEID0gTlVMTDsKKwl9CisJaWYgKGFpLT5BUExpc3QpIHsKKwkJd3JpdGVBUExpc3RSaWQoYWksIGFpLT5BUExpc3QsIDApOworCQlrZnJlZShhaS0+QVBMaXN0KTsKKwkJYWktPkFQTGlzdCA9IE5VTEw7CisJfQorCXdyaXRlQ29uZmlnUmlkKGFpLCAwKTsKKwllbmFibGVfTUFDKGFpLCAmcnNwLCAwKTsKKwlhaS0+cG93ZXIgPSAwOworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJZW5hYmxlX2ludGVycnVwdHMoYWkpOworCXVwKCZhaS0+c2VtKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBhaXJvX2luaXRfbW9kdWxlKCB2b2lkICkKK3sKKwlpbnQgaSwgaGF2ZV9pc2FfZGV2ID0gMDsKKworCWFpcm9fZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiYWlyb25ldCIsCisJCQkJICAgICAgIFNfSUZESVIgfCBhaXJvX3Blcm0sCisJCQkJICAgICAgIHByb2Nfcm9vdF9kcml2ZXIpOworICAgICAgICBhaXJvX2VudHJ5LT51aWQgPSBwcm9jX3VpZDsKKyAgICAgICAgYWlyb19lbnRyeS0+Z2lkID0gcHJvY19naWQ7CisKKwlmb3IoIGkgPSAwOyBpIDwgNCAmJiBpb1tpXSAmJiBpcnFbaV07IGkrKyApIHsKKwkJcHJpbnRrKCBLRVJOX0lORk8KKwkJCSJhaXJvOiAgVHJ5aW5nIHRvIGNvbmZpZ3VyZSBJU0EgYWRhcHRlciBhdCBpcnE9JWQgaW89MHgleFxuIiwKKwkJCWlycVtpXSwgaW9baV0gKTsKKwkJaWYgKGluaXRfYWlyb19jYXJkKCBpcnFbaV0sIGlvW2ldLCAwLCBOVUxMICkpCisJCQloYXZlX2lzYV9kZXYgPSAxOworCX0KKworI2lmZGVmIENPTkZJR19QQ0kKKwlwcmludGsoIEtFUk5fSU5GTyAiYWlybzogIFByb2JpbmcgZm9yIFBDSSBhZGFwdGVyc1xuIiApOworCXBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFpcm9fZHJpdmVyKTsKKwlwcmludGsoIEtFUk5fSU5GTyAiYWlybzogIEZpbmlzaGVkIHByb2JpbmcgZm9yIFBDSSBhZGFwdGVyc1xuIiApOworI2VuZGlmCisKKwkvKiBBbHdheXMgZXhpdCB3aXRoIHN1Y2Nlc3MsIGFzIHdlIGFyZSBhIGxpYnJhcnkgbW9kdWxlCisJICogYXMgd2VsbCBhcyBhIGRyaXZlciBtb2R1bGUKKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFpcm9fY2xlYW51cF9tb2R1bGUoIHZvaWQgKQoreworCXdoaWxlKCBhaXJvX2RldmljZXMgKSB7CisJCXByaW50ayggS0VSTl9JTkZPICJhaXJvOiBVbnJlZ2lzdGVyaW5nICVzXG4iLCBhaXJvX2RldmljZXMtPmRldi0+bmFtZSApOworCQlzdG9wX2Fpcm9fY2FyZCggYWlyb19kZXZpY2VzLT5kZXYsIDEgKTsKKwl9CisjaWZkZWYgQ09ORklHX1BDSQorCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWlyb19kcml2ZXIpOworI2VuZGlmCisJcmVtb3ZlX3Byb2NfZW50cnkoImFpcm9uZXQiLCBwcm9jX3Jvb3RfZHJpdmVyKTsKK30KKworI2lmZGVmIFdJUkVMRVNTX0VYVAorLyoKKyAqIEluaXRpYWwgV2lyZWxlc3MgRXh0ZW5zaW9uIGNvZGUgZm9yIEFpcm9uZXQgZHJpdmVyIGJ5IDoKKyAqCUplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4gLSBIUEwgLSAxNyBOb3ZlbWJlciAwMAorICogQ29udmVyc2lvbiB0byBuZXcgZHJpdmVyIEFQSSBieSA6CisgKglKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+IC0gSFBMIC0gMjYgTWFyY2ggMDIKKyAqIEphdmllciBhbHNvIGRpZCBhIGdvb2QgYW1vdW50IG9mIHdvcmsgaGVyZSwgYWRkaW5nIHNvbWUgbmV3IGV4dGVuc2lvbnMKKyAqIGFuZCBmaXhpbmcgbXkgY29kZS4gTGV0J3MganVzdCBzYXkgdGhhdCB3aXRob3V0IGhpbSB0aGlzIGNvZGUganVzdAorICogd291bGQgbm90IHdvcmsgYXQgYWxsLi4uIC0gSmVhbiBJSQorICovCisKK3N0YXRpYyBpbnQgYWlyb19nZXRfcXVhbGl0eSAoU3RhdHVzUmlkICpzdGF0dXNfcmlkLCBDYXBhYmlsaXR5UmlkICpjYXBfcmlkKQoreworCWludCBxdWFsaXR5ID0gMDsKKworCWlmICgoc3RhdHVzX3JpZC0+bW9kZSAmIDB4M2YpID09IDB4M2YgJiYgKGNhcF9yaWQtPmhhcmRDYXAgJiA4KSkgeworCQlpZiAobWVtY21wKGNhcF9yaWQtPnByb2ROYW1lLCAiMzUwIiwgMykpCisJCQlpZiAoc3RhdHVzX3JpZC0+c2lnbmFsUXVhbGl0eSA+IDB4MjApCisJCQkJcXVhbGl0eSA9IDA7CisJCQllbHNlCisJCQkJcXVhbGl0eSA9IDB4MjAgLSBzdGF0dXNfcmlkLT5zaWduYWxRdWFsaXR5OworCQllbHNlCisJCQlpZiAoc3RhdHVzX3JpZC0+c2lnbmFsUXVhbGl0eSA+IDB4YjApCisJCQkJcXVhbGl0eSA9IDA7CisJCQllbHNlIGlmIChzdGF0dXNfcmlkLT5zaWduYWxRdWFsaXR5IDwgMHgxMCkKKwkJCQlxdWFsaXR5ID0gMHhhMDsKKwkJCWVsc2UKKwkJCQlxdWFsaXR5ID0gMHhiMCAtIHN0YXR1c19yaWQtPnNpZ25hbFF1YWxpdHk7CisJfQorCXJldHVybiBxdWFsaXR5OworfQorCisjZGVmaW5lIGFpcm9fZ2V0X21heF9xdWFsaXR5KGNhcF9yaWQpIChtZW1jbXAoKGNhcF9yaWQpLT5wcm9kTmFtZSwgIjM1MCIsIDMpID8gMHgyMCA6IDB4YTApCisjZGVmaW5lIGFpcm9fZ2V0X2F2Z19xdWFsaXR5KGNhcF9yaWQpIChtZW1jbXAoKGNhcF9yaWQpLT5wcm9kTmFtZSwgIjM1MCIsIDMpID8gMHgxMCA6IDB4NTApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBwcm90b2NvbCBuYW1lCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgY2hhciAqY3dycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJjcHkoY3dycSwgIklFRUUgODAyLjExLURTIik7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGZyZXF1ZW5jeQorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19mcmVxICpmd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCWludCByYyA9IC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KKworCS8qIElmIHNldHRpbmcgYnkgZnJlcXVlbmN5LCBjb252ZXJ0IHRvIGEgY2hhbm5lbCAqLworCWlmKChmd3JxLT5lID09IDEpICYmCisJICAgKGZ3cnEtPm0gPj0gKGludCkgMi40MTJlOCkgJiYKKwkgICAoZndycS0+bSA8PSAoaW50KSAyLjQ4N2U4KSkgeworCQlpbnQgZiA9IGZ3cnEtPm0gLyAxMDAwMDA7CisJCWludCBjID0gMDsKKwkJd2hpbGUoKGMgPCAxNCkgJiYgKGYgIT0gZnJlcXVlbmN5X2xpc3RbY10pKQorCQkJYysrOworCQkvKiBIYWNrIHRvIGZhbGwgdGhyb3VnaC4uLiAqLworCQlmd3JxLT5lID0gMDsKKwkJZndycS0+bSA9IGMgKyAxOworCX0KKwkvKiBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyICovCisJaWYoKGZ3cnEtPm0gPiAxMDAwKSB8fCAoZndycS0+ZSA+IDApKQorCQlyYyA9IC1FT1BOT1RTVVBQOworCWVsc2UgeworCQlpbnQgY2hhbm5lbCA9IGZ3cnEtPm07CisJCS8qIFdlIHNob3VsZCBkbyBhIGJldHRlciBjaGVjayB0aGFuIHRoYXQsCisJCSAqIGJhc2VkIG9uIHRoZSBjYXJkIGNhcGFiaWxpdHkgISEhICovCisJCWlmKChjaGFubmVsIDwgMSkgfHwgKGNoYW5uZWwgPiAxNikpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTmV3IGNoYW5uZWwgdmFsdWUgb2YgJWQgaXMgaW52YWxpZCFcbiIsIGRldi0+bmFtZSwgZndycS0+bSk7CisJCQlyYyA9IC1FSU5WQUw7CisJCX0gZWxzZSB7CisJCQlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwkJCS8qIFllcyAhIFdlIGNhbiBzZXQgaXQgISEhICovCisJCQlsb2NhbC0+Y29uZmlnLmNoYW5uZWxTZXQgPSAodTE2KShjaGFubmVsIC0gMSk7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfZnJlcSAqZndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlTdGF0dXNSaWQgc3RhdHVzX3JpZDsJCS8qIENhcmQgc3RhdHVzIGluZm8gKi8KKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCWlmICgobG9jYWwtPmNvbmZpZy5vcG1vZGUgJiAweEZGKSA9PSBNT0RFX1NUQV9FU1MpCisJCXN0YXR1c19yaWQuY2hhbm5lbCA9IGxvY2FsLT5jb25maWcuY2hhbm5lbFNldDsKKwllbHNlCisJCXJlYWRTdGF0dXNSaWQobG9jYWwsICZzdGF0dXNfcmlkLCAxKTsKKworI2lmZGVmIFdFWFRfVVNFQ0hBTk5FTFMKKwlmd3JxLT5tID0gKChpbnQpc3RhdHVzX3JpZC5jaGFubmVsKSArIDE7CisJZndycS0+ZSA9IDA7CisjZWxzZQorCXsKKwkJaW50IGYgPSAoaW50KXN0YXR1c19yaWQuY2hhbm5lbDsKKwkJZndycS0+bSA9IGZyZXF1ZW5jeV9saXN0W2ZdICogMTAwMDAwOworCQlmd3JxLT5lID0gMTsKKwl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBFU1NJRAorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJUmVzcCByc3A7CisJU3NpZFJpZCBTU0lEX3JpZDsJCS8qIFNTSURzICovCisKKwkvKiBSZWxvYWQgdGhlIGxpc3Qgb2YgY3VycmVudCBTU0lEICovCisJcmVhZFNzaWRSaWQobG9jYWwsICZTU0lEX3JpZCk7CisKKwkvKiBDaGVjayBpZiB3ZSBhc2tlZCBmb3IgYGFueScgKi8KKwlpZihkd3JxLT5mbGFncyA9PSAwKSB7CisJCS8qIEp1c3Qgc2VuZCBhbiBlbXB0eSBTU0lEIGxpc3QgKi8KKwkJbWVtc2V0KCZTU0lEX3JpZCwgMCwgc2l6ZW9mKFNTSURfcmlkKSk7CisJfSBlbHNlIHsKKwkJaW50CWluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIHN0cmluZyAqLworCQlpZihkd3JxLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSsxKSB7CisJCQlyZXR1cm4gLUUyQklHIDsKKwkJfQorCQkvKiBDaGVjayBpZiBpbmRleCBpcyB2YWxpZCAqLworCQlpZigoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gNCkpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogU2V0IHRoZSBTU0lEICovCisJCW1lbXNldChTU0lEX3JpZC5zc2lkc1tpbmRleF0uc3NpZCwgMCwKKwkJICAgICAgIHNpemVvZihTU0lEX3JpZC5zc2lkc1tpbmRleF0uc3NpZCkpOworCQltZW1jcHkoU1NJRF9yaWQuc3NpZHNbaW5kZXhdLnNzaWQsIGV4dHJhLCBkd3JxLT5sZW5ndGgpOworCQlTU0lEX3JpZC5zc2lkc1tpbmRleF0ubGVuID0gZHdycS0+bGVuZ3RoIC0gMTsKKwl9CisJU1NJRF9yaWQubGVuID0gc2l6ZW9mKFNTSURfcmlkKTsKKwkvKiBXcml0ZSBpdCB0byB0aGUgY2FyZCAqLworCWRpc2FibGVfTUFDKGxvY2FsLCAxKTsKKwl3cml0ZVNzaWRSaWQobG9jYWwsICZTU0lEX3JpZCwgMSk7CisJZW5hYmxlX01BQyhsb2NhbCwgJnJzcCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgRVNTSUQKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCVN0YXR1c1JpZCBzdGF0dXNfcmlkOwkJLyogQ2FyZCBzdGF0dXMgaW5mbyAqLworCisJcmVhZFN0YXR1c1JpZChsb2NhbCwgJnN0YXR1c19yaWQsIDEpOworCisJLyogTm90ZSA6IGlmIGR3cnEtPmZsYWdzICE9IDAsIHdlIHNob3VsZAorCSAqIGdldCB0aGUgcmVsZXZhbnQgU1NJRCBmcm9tIHRoZSBTU0lEIGxpc3QuLi4gKi8KKworCS8qIEdldCB0aGUgY3VycmVudCBTU0lEICovCisJbWVtY3B5KGV4dHJhLCBzdGF0dXNfcmlkLlNTSUQsIHN0YXR1c19yaWQuU1NJRGxlbik7CisJZXh0cmFbc3RhdHVzX3JpZC5TU0lEbGVuXSA9ICdcMCc7CisJLyogSWYgbm9uZSwgd2UgbWF5IHdhbnQgdG8gZ2V0IHRoZSBvbmUgdGhhdCB3YXMgc2V0ICovCisKKwkvKiBQdXNoIGl0IG91dCAhICovCisJZHdycS0+bGVuZ3RoID0gc3RhdHVzX3JpZC5TU0lEbGVuICsgMTsKKwlkd3JxLT5mbGFncyA9IDE7IC8qIGFjdGl2ZSAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IEFQIGFkZHJlc3MKKyAqLworc3RhdGljIGludCBhaXJvX3NldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsCisJCQljaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlDbWQgY21kOworCVJlc3AgcnNwOworCUFQTGlzdFJpZCBBUExpc3RfcmlkOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGJjYXN0W0VUSF9BTEVOXSA9IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9OworCisJaWYgKGF3cnEtPnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYgKCFtZW1jbXAoYmNhc3QsIGF3cnEtPnNhX2RhdGEsIEVUSF9BTEVOKSkgeworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQljbWQuY21kPUNNRF9MT1NFX1NZTkM7CisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmxvY2FsLT5zZW0pKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJaXNzdWVjb21tYW5kKGxvY2FsLCAmY21kLCAmcnNwKTsKKwkJdXAoJmxvY2FsLT5zZW0pOworCX0gZWxzZSB7CisJCW1lbXNldCgmQVBMaXN0X3JpZCwgMCwgc2l6ZW9mKEFQTGlzdF9yaWQpKTsKKwkJQVBMaXN0X3JpZC5sZW4gPSBzaXplb2YoQVBMaXN0X3JpZCk7CisJCW1lbWNweShBUExpc3RfcmlkLmFwWzBdLCBhd3JxLT5zYV9kYXRhLCBFVEhfQUxFTik7CisJCWRpc2FibGVfTUFDKGxvY2FsLCAxKTsKKwkJd3JpdGVBUExpc3RSaWQobG9jYWwsICZBUExpc3RfcmlkLCAxKTsKKwkJZW5hYmxlX01BQyhsb2NhbCwgJnJzcCwgMSk7CisJfQorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBBUCBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IHNvY2thZGRyICphd3JxLAorCQkJY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJU3RhdHVzUmlkIHN0YXR1c19yaWQ7CQkvKiBDYXJkIHN0YXR1cyBpbmZvICovCisKKwlyZWFkU3RhdHVzUmlkKGxvY2FsLCAmc3RhdHVzX3JpZCwgMSk7CisKKwkvKiBUZW50YXRpdmUuIFRoaXMgc2VlbXMgdG8gd29yaywgd293LCBJJ20gbHVja3kgISEhICovCisJbWVtY3B5KGF3cnEtPnNhX2RhdGEsIHN0YXR1c19yaWQuYnNzaWRbMF0sIEVUSF9BTEVOKTsKKwlhd3JxLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgTmlja25hbWUKKyAqLworc3RhdGljIGludCBhaXJvX3NldF9uaWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nICovCisJaWYoZHdycS0+bGVuZ3RoID4gMTYgKyAxKSB7CisJCXJldHVybiAtRTJCSUc7CisJfQorCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCW1lbXNldChsb2NhbC0+Y29uZmlnLm5vZGVOYW1lLCAwLCBzaXplb2YobG9jYWwtPmNvbmZpZy5ub2RlTmFtZSkpOworCW1lbWNweShsb2NhbC0+Y29uZmlnLm5vZGVOYW1lLCBleHRyYSwgZHdycS0+bGVuZ3RoKTsKKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBOaWNrbmFtZQorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCXN0cm5jcHkoZXh0cmEsIGxvY2FsLT5jb25maWcubm9kZU5hbWUsIDE2KTsKKwlleHRyYVsxNl0gPSAnXDAnOworCWR3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IEJpdC1SYXRlCisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsJCS8qIENhcmQgY2FwYWJpbGl0eSBpbmZvICovCisJdTgJYnJhdGUgPSAwOworCWludAlpOworCisJLyogRmlyc3QgOiBnZXQgYSB2YWxpZCBiaXQgcmF0ZSB2YWx1ZSAqLworCXJlYWRDYXBhYmlsaXR5UmlkKGxvY2FsLCAmY2FwX3JpZCwgMSk7CisKKwkvKiBXaGljaCB0eXBlIG9mIHZhbHVlID8gKi8KKwlpZigodndycS0+dmFsdWUgPCA4KSAmJiAodndycS0+dmFsdWUgPj0gMCkpIHsKKwkJLyogU2V0dGluZyBieSByYXRlIGluZGV4ICovCisJCS8qIEZpbmQgdmFsdWUgaW4gdGhlIG1hZ2ljIHJhdGUgdGFibGUgKi8KKwkJYnJhdGUgPSBjYXBfcmlkLnN1cHBvcnRlZFJhdGVzW3Z3cnEtPnZhbHVlXTsKKwl9IGVsc2UgeworCQkvKiBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSB2YWx1ZSAqLworCQl1OAlub3JtdmFsdWUgPSAodTgpICh2d3JxLT52YWx1ZS81MDAwMDApOworCisJCS8qIENoZWNrIGlmIHJhdGUgaXMgdmFsaWQgKi8KKwkJZm9yKGkgPSAwIDsgaSA8IDggOyBpKyspIHsKKwkJCWlmKG5vcm12YWx1ZSA9PSBjYXBfcmlkLnN1cHBvcnRlZFJhdGVzW2ldKSB7CisJCQkJYnJhdGUgPSBub3JtdmFsdWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJLyogLTEgZGVzaWduZWQgdGhlIG1heCByYXRlIChtb3N0bHkgYXV0byBtb2RlKSAqLworCWlmKHZ3cnEtPnZhbHVlID09IC0xKSB7CisJCS8qIEdldCB0aGUgaGlnaGVzdCBhdmFpbGFibGUgcmF0ZSAqLworCQlmb3IoaSA9IDAgOyBpIDwgOCA7IGkrKykgeworCQkJaWYoY2FwX3JpZC5zdXBwb3J0ZWRSYXRlc1tpXSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCWlmKGkgIT0gMCkKKwkJCWJyYXRlID0gY2FwX3JpZC5zdXBwb3J0ZWRSYXRlc1tpIC0gMV07CisJfQorCS8qIENoZWNrIHRoYXQgaXQgaXMgdmFsaWQgKi8KKwlpZihicmF0ZSA9PSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCS8qIE5vdywgY2hlY2sgaWYgd2Ugd2FudCBhIGZpeGVkIG9yIGF1dG8gdmFsdWUgKi8KKwlpZih2d3JxLT5maXhlZCA9PSAwKSB7CisJCS8qIEZpbGwgYWxsIHRoZSByYXRlcyB1cCB0byB0aGlzIG1heCByYXRlICovCisJCW1lbXNldChsb2NhbC0+Y29uZmlnLnJhdGVzLCAwLCA4KTsKKwkJZm9yKGkgPSAwIDsgaSA8IDggOyBpKyspIHsKKwkJCWxvY2FsLT5jb25maWcucmF0ZXNbaV0gPSBjYXBfcmlkLnN1cHBvcnRlZFJhdGVzW2ldOworCQkJaWYobG9jYWwtPmNvbmZpZy5yYXRlc1tpXSA9PSBicmF0ZSkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEZpeGVkIG1vZGUgKi8KKwkJLyogT25lIHJhdGUsIGZpeGVkICovCisJCW1lbXNldChsb2NhbC0+Y29uZmlnLnJhdGVzLCAwLCA4KTsKKwkJbG9jYWwtPmNvbmZpZy5yYXRlc1swXSA9IGJyYXRlOworCX0KKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBCaXQtUmF0ZQorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlTdGF0dXNSaWQgc3RhdHVzX3JpZDsJCS8qIENhcmQgc3RhdHVzIGluZm8gKi8KKworCXJlYWRTdGF0dXNSaWQobG9jYWwsICZzdGF0dXNfcmlkLCAxKTsKKworCXZ3cnEtPnZhbHVlID0gc3RhdHVzX3JpZC5jdXJyZW50WG1pdFJhdGUgKiA1MDAwMDA7CisJLyogSWYgbW9yZSB0aGFuIG9uZSByYXRlLCBzZXQgYXV0byAqLworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCXZ3cnEtPmZpeGVkID0gKGxvY2FsLT5jb25maWcucmF0ZXNbMV0gPT0gMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgUlRTIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCWNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCWludCBydGhyID0gdndycS0+dmFsdWU7CisKKwlpZih2d3JxLT5kaXNhYmxlZCkKKwkJcnRociA9IDIzMTI7CisJaWYoKHJ0aHIgPCAwKSB8fCAocnRociA+IDIzMTIpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwlsb2NhbC0+Y29uZmlnLnJ0c1RocmVzID0gcnRocjsKKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBSVFMgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwl2d3JxLT52YWx1ZSA9IGxvY2FsLT5jb25maWcucnRzVGhyZXM7CisJdndycS0+ZGlzYWJsZWQgPSAodndycS0+dmFsdWUgPj0gMjMxMik7CisJdndycS0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IEZyYWdtZW50YXRpb24gdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCWludCBmdGhyID0gdndycS0+dmFsdWU7CisKKwlpZih2d3JxLT5kaXNhYmxlZCkKKwkJZnRociA9IDIzMTI7CisJaWYoKGZ0aHIgPCAyNTYpIHx8IChmdGhyID4gMjMxMikpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZ0aHIgJj0gfjB4MTsJLyogR2V0IGFuIGV2ZW4gdmFsdWUgLSBpcyBpdCByZWFsbHkgbmVlZGVkID8/PyAqLworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCWxvY2FsLT5jb25maWcuZnJhZ1RocmVzaCA9ICh1MTYpZnRocjsKKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBGcmFnbWVudGF0aW9uIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCXZ3cnEtPnZhbHVlID0gbG9jYWwtPmNvbmZpZy5mcmFnVGhyZXNoOworCXZ3cnEtPmRpc2FibGVkID0gKHZ3cnEtPnZhbHVlID49IDIzMTIpOworCXZ3cnEtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBNb2RlIG9mIE9wZXJhdGlvbgorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIF9fdTMyICp1d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCWludCByZXNldCA9IDA7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwlpZiAoKGxvY2FsLT5jb25maWcucm1vZGUgJiAweGZmKSA+PSBSWE1PREVfUkZNT04pCisJCXJlc2V0ID0gMTsKKworCXN3aXRjaCgqdXdycSkgeworCQljYXNlIElXX01PREVfQURIT0M6CisJCQlsb2NhbC0+Y29uZmlnLm9wbW9kZSAmPSAweEZGMDA7CisJCQlsb2NhbC0+Y29uZmlnLm9wbW9kZSB8PSBNT0RFX1NUQV9JQlNTOworCQkJbG9jYWwtPmNvbmZpZy5ybW9kZSAmPSAweGZlMDA7CisJCQlsb2NhbC0+Y29uZmlnLnNjYW5Nb2RlID0gU0NBTk1PREVfQUNUSVZFOworCQkJY2xlYXJfYml0IChGTEFHXzgwMl8xMSwgJmxvY2FsLT5mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSBJV19NT0RFX0lORlJBOgorCQkJbG9jYWwtPmNvbmZpZy5vcG1vZGUgJj0gMHhGRjAwOworCQkJbG9jYWwtPmNvbmZpZy5vcG1vZGUgfD0gTU9ERV9TVEFfRVNTOworCQkJbG9jYWwtPmNvbmZpZy5ybW9kZSAmPSAweGZlMDA7CisJCQlsb2NhbC0+Y29uZmlnLnNjYW5Nb2RlID0gU0NBTk1PREVfQUNUSVZFOworCQkJY2xlYXJfYml0IChGTEFHXzgwMl8xMSwgJmxvY2FsLT5mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSBJV19NT0RFX01BU1RFUjoKKwkJCWxvY2FsLT5jb25maWcub3Btb2RlICY9IDB4RkYwMDsKKwkJCWxvY2FsLT5jb25maWcub3Btb2RlIHw9IE1PREVfQVA7CisJCQlsb2NhbC0+Y29uZmlnLnJtb2RlICY9IDB4ZmUwMDsKKwkJCWxvY2FsLT5jb25maWcuc2Nhbk1vZGUgPSBTQ0FOTU9ERV9BQ1RJVkU7CisJCQljbGVhcl9iaXQgKEZMQUdfODAyXzExLCAmbG9jYWwtPmZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIElXX01PREVfUkVQRUFUOgorCQkJbG9jYWwtPmNvbmZpZy5vcG1vZGUgJj0gMHhGRjAwOworCQkJbG9jYWwtPmNvbmZpZy5vcG1vZGUgfD0gTU9ERV9BUF9SUFRSOworCQkJbG9jYWwtPmNvbmZpZy5ybW9kZSAmPSAweGZlMDA7CisJCQlsb2NhbC0+Y29uZmlnLnNjYW5Nb2RlID0gU0NBTk1PREVfQUNUSVZFOworCQkJY2xlYXJfYml0IChGTEFHXzgwMl8xMSwgJmxvY2FsLT5mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSBJV19NT0RFX01PTklUT1I6CisJCQlsb2NhbC0+Y29uZmlnLm9wbW9kZSAmPSAweEZGMDA7CisJCQlsb2NhbC0+Y29uZmlnLm9wbW9kZSB8PSBNT0RFX1NUQV9FU1M7CisJCQlsb2NhbC0+Y29uZmlnLnJtb2RlICY9IDB4ZmUwMDsKKwkJCWxvY2FsLT5jb25maWcucm1vZGUgfD0gUlhNT0RFX1JGTU9OIHwgUlhNT0RFX0RJU0FCTEVfODAyXzNfSEVBREVSOworCQkJbG9jYWwtPmNvbmZpZy5zY2FuTW9kZSA9IFNDQU5NT0RFX1BBU1NJVkU7CisJCQlzZXRfYml0IChGTEFHXzgwMl8xMSwgJmxvY2FsLT5mbGFncyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocmVzZXQpCisJCXNldF9iaXQgKEZMQUdfUkVTRVQsICZsb2NhbC0+ZmxhZ3MpOworCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IE1vZGUgb2YgT3BlcmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgX191MzIgKnV3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwkvKiBJZiBub3QgbWFuYWdlZCwgYXNzdW1lIGl0J3MgYWQtaG9jICovCisJc3dpdGNoIChsb2NhbC0+Y29uZmlnLm9wbW9kZSAmIDB4RkYpIHsKKwkJY2FzZSBNT0RFX1NUQV9FU1M6CisJCQkqdXdycSA9IElXX01PREVfSU5GUkE7CisJCQlicmVhazsKKwkJY2FzZSBNT0RFX0FQOgorCQkJKnV3cnEgPSBJV19NT0RFX01BU1RFUjsKKwkJCWJyZWFrOworCQljYXNlIE1PREVfQVBfUlBUUjoKKwkJCSp1d3JxID0gSVdfTU9ERV9SRVBFQVQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCSp1d3JxID0gSVdfTU9ERV9BREhPQzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgRW5jcnlwdGlvbiBLZXkKKyAqLworc3RhdGljIGludCBhaXJvX3NldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlDYXBhYmlsaXR5UmlkIGNhcF9yaWQ7CQkvKiBDYXJkIGNhcGFiaWxpdHkgaW5mbyAqLworCisJLyogSXMgV0VQIHN1cHBvcnRlZCA/ICovCisJcmVhZENhcGFiaWxpdHlSaWQobG9jYWwsICZjYXBfcmlkLCAxKTsKKwkvKiBPbGRlciBmaXJtd2FyZSBkb2Vzbid0IHN1cHBvcnQgdGhpcy4uLgorCWlmKCEoY2FwX3JpZC5zb2Z0Q2FwICYgMikpIHsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0gKi8KKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKworCS8qIEJhc2ljIGNoZWNraW5nOiBkbyB3ZSBoYXZlIGEga2V5IHRvIHNldCA/CisJICogTm90ZSA6IHdpdGggdGhlIG5ldyBBUEksIGl0J3MgaW1wb3NzaWJsZSB0byBnZXQgYSBOVUxMIHBvaW50ZXIuCisJICogVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIGNoZWNrIGEga2V5IHNpemUgPT0gMCBpbnN0ZWFkLgorCSAqIE5ldyB2ZXJzaW9uIG9mIGl3Y29uZmlnIHByb3Blcmx5IHNldCB0aGUgSVdfRU5DT0RFX05PS0VZIGZsYWcKKwkgKiB3aGVuIG5vIGtleSBpcyBwcmVzZW50IChvbmx5IGNoYW5nZSBmbGFncyksIGJ1dCBvbGRlciB2ZXJzaW9ucworCSAqIGRvbid0IGRvIGl0LiAtIEplYW4gSUkgKi8KKwlpZiAoZHdycS0+bGVuZ3RoID4gMCkgeworCQl3ZXBfa2V5X3Qga2V5OworCQlpbnQgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaW50IGN1cnJlbnRfaW5kZXggPSBnZXRfd2VwX2tleShsb2NhbCwgMHhmZmZmKTsKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGtleSAqLworCQlpZiAoZHdycS0+bGVuZ3RoID4gTUFYX0tFWV9TSVpFKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBDaGVjayB0aGUgaW5kZXggKG5vbmUgLT4gdXNlIGN1cnJlbnQpICovCisJCWlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gKChjYXBfcmlkLnNvZnRDYXAgJiAweDgwKSA/IDQ6MSkpKQorCQkJaW5kZXggPSBjdXJyZW50X2luZGV4OworCQkvKiBTZXQgdGhlIGxlbmd0aCAqLworCQlpZiAoZHdycS0+bGVuZ3RoID4gTUlOX0tFWV9TSVpFKQorCQkJa2V5LmxlbiA9IE1BWF9LRVlfU0laRTsKKwkJZWxzZQorCQkJaWYgKGR3cnEtPmxlbmd0aCA+IDApCisJCQkJa2V5LmxlbiA9IE1JTl9LRVlfU0laRTsKKwkJCWVsc2UKKwkJCQkvKiBEaXNhYmxlIHRoZSBrZXkgKi8KKwkJCQlrZXkubGVuID0gMDsKKwkJLyogQ2hlY2sgaWYgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KKwkJaWYoIShkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJCS8qIENsZWFudXAgKi8KKwkJCW1lbXNldChrZXkua2V5LCAwLCBNQVhfS0VZX1NJWkUpOworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCW1lbWNweShrZXkua2V5LCBleHRyYSwgZHdycS0+bGVuZ3RoKTsKKwkJCS8qIFNlbmQgdGhlIGtleSB0byB0aGUgY2FyZCAqLworCQkJc2V0X3dlcF9rZXkobG9jYWwsIGluZGV4LCBrZXkua2V5LCBrZXkubGVuLCAxLCAxKTsKKwkJfQorCQkvKiBXRSBzcGVjaWZ5IHRoYXQgaWYgYSB2YWxpZCBrZXkgaXMgc2V0LCBlbmNyeXB0aW9uCisJCSAqIHNob3VsZCBiZSBlbmFibGVkICh1c2VyIG1heSB0dXJuIGl0IG9mZiBsYXRlcikKKwkJICogVGhpcyBpcyBhbHNvIGhvdyAiaXdjb25maWcgZXRoWCBrZXkgb24iIHdvcmtzICovCisJCWlmKChpbmRleCA9PSBjdXJyZW50X2luZGV4KSAmJiAoa2V5LmxlbiA+IDApICYmCisJCSAgIChsb2NhbC0+Y29uZmlnLmF1dGhUeXBlID09IEFVVEhfT1BFTikpIHsKKwkJCWxvY2FsLT5jb25maWcuYXV0aFR5cGUgPSBBVVRIX0VOQ1JZUFQ7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBEbyB3ZSB3YW50IHRvIGp1c3Qgc2V0IHRoZSB0cmFuc21pdCBrZXkgaW5kZXggPyAqLworCQlpbnQgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCAoKGNhcF9yaWQuc29mdENhcCAmIDB4ODApPzQ6MSkpKSB7CisJCQlzZXRfd2VwX2tleShsb2NhbCwgaW5kZXgsIE5VTEwsIDAsIDEsIDEpOworCQl9IGVsc2UKKwkJCS8qIERvbid0IGNvbXBsYWluIGlmIG9ubHkgY2hhbmdlIHRoZSBtb2RlICovCisJCQlpZighZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfTU9ERSkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCX0KKwkvKiBSZWFkIHRoZSBmbGFncyAqLworCWlmKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKQorCQlsb2NhbC0+Y29uZmlnLmF1dGhUeXBlID0gQVVUSF9PUEVOOwkvLyBkaXNhYmxlIGVuY3J5cHRpb24KKwlpZihkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQorCQlsb2NhbC0+Y29uZmlnLmF1dGhUeXBlID0gQVVUSF9TSEFSRURLRVk7CS8vIE9ubHkgQm90aAorCWlmKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pCisJCWxvY2FsLT5jb25maWcuYXV0aFR5cGUgPSBBVVRIX0VOQ1JZUFQ7CS8vIE9ubHkgV2VwCisJLyogQ29tbWl0IHRoZSBjaGFuZ2VzIHRvIGZsYWdzIGlmIG5lZWRlZCAqLworCWlmKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpCisJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBFbmNyeXB0aW9uIEtleQorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCWludCBpbmRleCA9IChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsJCS8qIENhcmQgY2FwYWJpbGl0eSBpbmZvICovCisKKwkvKiBJcyBpdCBzdXBwb3J0ZWQgPyAqLworCXJlYWRDYXBhYmlsaXR5UmlkKGxvY2FsLCAmY2FwX3JpZCwgMSk7CisJaWYoIShjYXBfcmlkLnNvZnRDYXAgJiAyKSkgeworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCS8qIENoZWNrIGVuY3J5cHRpb24gbW9kZSAqLworCXN3aXRjaChsb2NhbC0+Y29uZmlnLmF1dGhUeXBlKQl7CisJCWNhc2UgQVVUSF9FTkNSWVBUOgorCQkJZHdycS0+ZmxhZ3MgPSBJV19FTkNPREVfT1BFTjsKKwkJCWJyZWFrOworCQljYXNlIEFVVEhfU0hBUkVES0VZOgorCQkJZHdycS0+ZmxhZ3MgPSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIEFVVEhfT1BFTjoKKwkJCWR3cnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQkJYnJlYWs7CisJfQorCS8qIFdlIGNhbid0IHJldHVybiB0aGUga2V5LCBzbyBzZXQgdGhlIHByb3BlciBmbGFnIGFuZCByZXR1cm4gemVybyAqLworCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9OT0tFWTsKKwltZW1zZXQoZXh0cmEsIDAsIDE2KTsKKworCS8qIFdoaWNoIGtleSBkbyB3ZSB3YW50ID8gLTEgLT4gdHggaW5kZXggKi8KKwlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49ICgoY2FwX3JpZC5zb2Z0Q2FwICYgMHg4MCkgPyA0IDogMSkpKQorCQlpbmRleCA9IGdldF93ZXBfa2V5KGxvY2FsLCAweGZmZmYpOworCWR3cnEtPmZsYWdzIHw9IGluZGV4ICsgMTsKKwkvKiBDb3B5IHRoZSBrZXkgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJZHdycS0+bGVuZ3RoID0gZ2V0X3dlcF9rZXkobG9jYWwsIGluZGV4KTsKKwlpZiAoZHdycS0+bGVuZ3RoID4gMTYpIHsKKwkJZHdycS0+bGVuZ3RoPTA7CisJfQorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBUeC1Qb3dlcgorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJQ2FwYWJpbGl0eVJpZCBjYXBfcmlkOwkJLyogQ2FyZCBjYXBhYmlsaXR5IGluZm8gKi8KKwlpbnQgaTsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJcmVhZENhcGFiaWxpdHlSaWQobG9jYWwsICZjYXBfcmlkLCAxKTsKKworCWlmICh2d3JxLT5kaXNhYmxlZCkgeworCQlzZXRfYml0IChGTEFHX1JBRElPX09GRiwgJmxvY2FsLT5mbGFncyk7CisJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KKwl9CisJaWYgKHZ3cnEtPmZsYWdzICE9IElXX1RYUE9XX01XQVRUKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljbGVhcl9iaXQgKEZMQUdfUkFESU9fT0ZGLCAmbG9jYWwtPmZsYWdzKTsKKwlmb3IgKGkgPSAwOyBjYXBfcmlkLnR4UG93ZXJMZXZlbHNbaV0gJiYgKGkgPCA4KTsgaSsrKQorCQlpZiAoKHZ3cnEtPnZhbHVlPT1jYXBfcmlkLnR4UG93ZXJMZXZlbHNbaV0pKSB7CisJCQlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwkJCWxvY2FsLT5jb25maWcudHhQb3dlciA9IHZ3cnEtPnZhbHVlOworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCQkJcmMgPSAtRUlOUFJPR1JFU1M7CS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KKwkJCWJyZWFrOworCQl9CisJcmV0dXJuIHJjOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBUeC1Qb3dlcgorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwl2d3JxLT52YWx1ZSA9IGxvY2FsLT5jb25maWcudHhQb3dlcjsKKwl2d3JxLT5maXhlZCA9IDE7CS8qIE5vIHBvd2VyIGNvbnRyb2wgKi8KKwl2d3JxLT5kaXNhYmxlZCA9IHRlc3RfYml0KEZMQUdfUkFESU9fT0ZGLCAmbG9jYWwtPmZsYWdzKTsKKwl2d3JxLT5mbGFncyA9IElXX1RYUE9XX01XQVRUOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IFJldHJ5IGxpbWl0cworICovCitzdGF0aWMgaW50IGFpcm9fc2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJaW50IHJjID0gLUVJTlZBTDsKKworCWlmKHZ3cnEtPmRpc2FibGVkKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwlpZih2d3JxLT5mbGFncyAmIElXX1JFVFJZX0xJTUlUKSB7CisJCWlmKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTUFYKQorCQkJbG9jYWwtPmNvbmZpZy5sb25nUmV0cnlMaW1pdCA9IHZ3cnEtPnZhbHVlOworCQllbHNlIGlmICh2d3JxLT5mbGFncyAmIElXX1JFVFJZX01JTikKKwkJCWxvY2FsLT5jb25maWcuc2hvcnRSZXRyeUxpbWl0ID0gdndycS0+dmFsdWU7CisJCWVsc2UgeworCQkJLyogTm8gbW9kaWZpZXIgOiBzZXQgYm90aCAqLworCQkJbG9jYWwtPmNvbmZpZy5sb25nUmV0cnlMaW1pdCA9IHZ3cnEtPnZhbHVlOworCQkJbG9jYWwtPmNvbmZpZy5zaG9ydFJldHJ5TGltaXQgPSB2d3JxLT52YWx1ZTsKKwkJfQorCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJCXJjID0gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworCX0KKwlpZih2d3JxLT5mbGFncyAmIElXX1JFVFJZX0xJRkVUSU1FKSB7CisJCWxvY2FsLT5jb25maWcudHhMaWZldGltZSA9IHZ3cnEtPnZhbHVlIC8gMTAyNDsKKwkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCQlyYyA9IC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KKwl9CisJcmV0dXJuIHJjOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBSZXRyeSBsaW1pdHMKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCisJdndycS0+ZGlzYWJsZWQgPSAwOyAgICAgIC8qIENhbid0IGJlIGRpc2FibGVkICovCisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwkvKiBOb3RlIDogYnkgZGVmYXVsdCwgZGlzcGxheSB0aGUgbWluIHJldHJ5IG51bWJlciAqLworCWlmKCh2d3JxLT5mbGFncyAmIElXX1JFVFJZX1RZUEUpID09IElXX1JFVFJZX0xJRkVUSU1FKSB7CisJCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElGRVRJTUU7CisJCXZ3cnEtPnZhbHVlID0gKGludClsb2NhbC0+Y29uZmlnLnR4TGlmZXRpbWUgKiAxMDI0OworCX0gZWxzZSBpZigodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9NQVgpKSB7CisJCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9NQVg7CisJCXZ3cnEtPnZhbHVlID0gKGludClsb2NhbC0+Y29uZmlnLmxvbmdSZXRyeUxpbWl0OworCX0gZWxzZSB7CisJCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJCXZ3cnEtPnZhbHVlID0gKGludClsb2NhbC0+Y29uZmlnLnNob3J0UmV0cnlMaW1pdDsKKwkJaWYoKGludClsb2NhbC0+Y29uZmlnLnNob3J0UmV0cnlMaW1pdCAhPSAoaW50KWxvY2FsLT5jb25maWcubG9uZ1JldHJ5TGltaXQpCisJCQl2d3JxLT5mbGFncyB8PSBJV19SRVRSWV9NSU47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHJhbmdlIGluZm8KKyAqLworc3RhdGljIGludCBhaXJvX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsJCS8qIENhcmQgY2FwYWJpbGl0eSBpbmZvICovCisJaW50CQlpOworCWludAkJazsKKworCXJlYWRDYXBhYmlsaXR5UmlkKGxvY2FsLCAmY2FwX3JpZCwgMSk7CisKKwlkd3JxLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZigqcmFuZ2UpKTsKKwlyYW5nZS0+bWluX253aWQgPSAweDAwMDA7CisJcmFuZ2UtPm1heF9ud2lkID0gMHgwMDAwOworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAxNDsKKwkvKiBTaG91bGQgYmUgYmFzZWQgb24gY2FwX3JpZC5jb3VudHJ5IHRvIGdpdmUgb25seQorCSAqIHdoYXQgdGhlIGN1cnJlbnQgY2FyZCBzdXBwb3J0ICovCisJayA9IDA7CisJZm9yKGkgPSAwOyBpIDwgMTQ7IGkrKykgeworCQlyYW5nZS0+ZnJlcVtrXS5pID0gaSArIDE7IC8qIExpc3QgaW5kZXggKi8KKwkJcmFuZ2UtPmZyZXFba10ubSA9IGZyZXF1ZW5jeV9saXN0W2ldICogMTAwMDAwOworCQlyYW5nZS0+ZnJlcVtrKytdLmUgPSAxOwkvKiBWYWx1ZXMgaW4gdGFibGUgaW4gTUh6IC0+ICogMTBeNSAqIDEwICovCisJfQorCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gazsKKworCS8qIEh1bS4uLiBTaG91bGQgcHV0IHRoZSByaWdodCB2YWx1ZXMgdGhlcmUgKi8KKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IGFpcm9fZ2V0X21heF9xdWFsaXR5KCZjYXBfcmlkKTsKKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAweDEwMCAtIDEyMDsJLyogLTEyMCBkQm0gKi8KKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5zZW5zaXRpdml0eSA9IDY1NTM1OworCisJZm9yKGkgPSAwIDsgaSA8IDggOyBpKyspIHsKKwkJcmFuZ2UtPmJpdHJhdGVbaV0gPSBjYXBfcmlkLnN1cHBvcnRlZFJhdGVzW2ldICogNTAwMDAwOworCQlpZihyYW5nZS0+Yml0cmF0ZVtpXSA9PSAwKQorCQkJYnJlYWs7CisJfQorCXJhbmdlLT5udW1fYml0cmF0ZXMgPSBpOworCisJLyogU2V0IGFuIGluZGljYXRpb24gb2YgdGhlIG1heCBUQ1AgdGhyb3VnaHB1dAorCSAqIGluIGJpdC9zIHRoYXQgd2UgY2FuIGV4cGVjdCB1c2luZyB0aGlzIGludGVyZmFjZS4KKwkgKiBNYXkgYmUgdXNlIGZvciBRb1Mgc3R1ZmYuLi4gSmVhbiBJSSAqLworCWlmKGkgPiAyKQorCQlyYW5nZS0+dGhyb3VnaHB1dCA9IDUwMDAgKiAxMDAwOworCWVsc2UKKwkJcmFuZ2UtPnRocm91Z2hwdXQgPSAxNTAwICogMTAwMDsKKworCXJhbmdlLT5taW5fcnRzID0gMDsKKwlyYW5nZS0+bWF4X3J0cyA9IDIzMTI7CisJcmFuZ2UtPm1pbl9mcmFnID0gMjU2OworCXJhbmdlLT5tYXhfZnJhZyA9IDIzMTI7CisKKwlpZihjYXBfcmlkLnNvZnRDYXAgJiAyKSB7CisJCS8vIFdFUDogUkM0IDQwIGJpdHMKKwkJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA1OworCQkvLyBSQzQgfjEyOCBiaXRzCisJCWlmIChjYXBfcmlkLnNvZnRDYXAgJiAweDEwMCkgeworCQkJcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKKwkJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOworCQl9IGVsc2UKKwkJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAxOworCQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IChjYXBfcmlkLnNvZnRDYXAgJiAweDgwKSA/IDQgOiAxOworCX0gZWxzZSB7CisJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAwOworCQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDA7CisJfQorCXJhbmdlLT5taW5fcG1wID0gMDsKKwlyYW5nZS0+bWF4X3BtcCA9IDUwMDAwMDA7CS8qIDUgc2VjcyAqLworCXJhbmdlLT5taW5fcG10ID0gMDsKKwlyYW5nZS0+bWF4X3BtdCA9IDY1NTM1ICogMTAyNDsJLyogPz8/ICovCisJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfCBJV19QT1dFUl9BTExfUjsKKworCS8qIFRyYW5zbWl0IFBvd2VyIC0gdmFsdWVzIGFyZSBpbiBtVyAqLworCWZvcihpID0gMCA7IGkgPCA4IDsgaSsrKSB7CisJCXJhbmdlLT50eHBvd2VyW2ldID0gY2FwX3JpZC50eFBvd2VyTGV2ZWxzW2ldOworCQlpZihyYW5nZS0+dHhwb3dlcltpXSA9PSAwKQorCQkJYnJlYWs7CisJfQorCXJhbmdlLT5udW1fdHhwb3dlciA9IGk7CisJcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX01XQVRUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDEyOworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9MSUZFVElNRTsKKwlyYW5nZS0+cmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+cl90aW1lX2ZsYWdzID0gSVdfUkVUUllfTElGRVRJTUU7CisJcmFuZ2UtPm1pbl9yZXRyeSA9IDE7CisJcmFuZ2UtPm1heF9yZXRyeSA9IDY1NTM1OworCXJhbmdlLT5taW5fcl90aW1lID0gMTAyNDsKKwlyYW5nZS0+bWF4X3JfdGltZSA9IDY1NTM1ICogMTAyNDsKKwkvKiBFeHBlcmltZW50YWwgbWVhc3VyZW1lbnRzIC0gYm91bmRhcnkgMTEvNS41IE1iL3MgKi8KKwkvKiBOb3RlIDogd2l0aCBvciB3aXRob3V0IHRoZSAobG9jYWwtPnJzc2kpLCByZXN1bHRzCisJICogYXJlIHNvbWV3aGF0IGRpZmZlcmVudC4gLSBKZWFuIElJICovCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSBhaXJvX2dldF9hdmdfcXVhbGl0eSgmY2FwX3JpZCk7CisJaWYgKGxvY2FsLT5yc3NpKQorCQlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAxODY7CS8qIC03MCBkQm0gKi8KKwllbHNlCisJCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDE3NjsJLyogLTgwIGRCbSAqLworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDA7CisKKwkvKiBFdmVudCBjYXBhYmlsaXR5IChrZXJuZWwgKyBkcml2ZXIpICovCisJcmFuZ2UtPmV2ZW50X2NhcGFbMF0gPSAoSVdfRVZFTlRfQ0FQQV9LXzAgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXVEhSU1BZKSB8CisJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdBUCkgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXU0NBTikpOworCXJhbmdlLT5ldmVudF9jYXBhWzFdID0gSVdfRVZFTlRfQ0FQQV9LXzE7CisJcmFuZ2UtPmV2ZW50X2NhcGFbNF0gPSBJV19FVkVOVF9DQVBBX01BU0soSVdFVlRYRFJPUCk7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IFBvd2VyIE1hbmFnZW1lbnQKKyAqLworc3RhdGljIGludCBhaXJvX3NldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJaWYgKHZ3cnEtPmRpc2FibGVkKSB7CisJCWlmICgobG9jYWwtPmNvbmZpZy5ybW9kZSAmIDB4RkYpID49IFJYTU9ERV9SRk1PTikgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbG9jYWwtPmNvbmZpZy5wb3dlclNhdmVNb2RlID0gUE9XRVJTQVZFX0NBTTsKKwkJbG9jYWwtPmNvbmZpZy5ybW9kZSAmPSAweEZGMDA7CisJCWxvY2FsLT5jb25maWcucm1vZGUgfD0gUlhNT0RFX0JDX01DX0FERFI7CisJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KKwl9CisJaWYgKCh2d3JxLT5mbGFncyAmIElXX1BPV0VSX1RZUEUpID09IElXX1BPV0VSX1RJTUVPVVQpIHsKKwkJbG9jYWwtPmNvbmZpZy5mYXN0TGlzdGVuRGVsYXkgPSAodndycS0+dmFsdWUgKyA1MDApIC8gMTAyNDsKKwkJbG9jYWwtPmNvbmZpZy5wb3dlclNhdmVNb2RlID0gUE9XRVJTQVZFX1BTUENBTTsKKwkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCX0gZWxzZSBpZiAoKHZ3cnEtPmZsYWdzICYgSVdfUE9XRVJfVFlQRSkgPT0gSVdfUE9XRVJfUEVSSU9EKSB7CisJCWxvY2FsLT5jb25maWcuZmFzdExpc3RlbkludGVydmFsID0gbG9jYWwtPmNvbmZpZy5saXN0ZW5JbnRlcnZhbCA9ICh2d3JxLT52YWx1ZSArIDUwMCkgLyAxMDI0OworCQlsb2NhbC0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPSBQT1dFUlNBVkVfUFNQQ0FNOworCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJfQorCXN3aXRjaCAodndycS0+ZmxhZ3MgJiBJV19QT1dFUl9NT0RFKSB7CisJCWNhc2UgSVdfUE9XRVJfVU5JQ0FTVF9SOgorCQkJaWYgKChsb2NhbC0+Y29uZmlnLnJtb2RlICYgMHhGRikgPj0gUlhNT0RFX1JGTU9OKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlsb2NhbC0+Y29uZmlnLnJtb2RlICY9IDB4RkYwMDsKKwkJCWxvY2FsLT5jb25maWcucm1vZGUgfD0gUlhNT0RFX0FERFI7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSBJV19QT1dFUl9BTExfUjoKKwkJCWlmICgobG9jYWwtPmNvbmZpZy5ybW9kZSAmIDB4RkYpID49IFJYTU9ERV9SRk1PTikgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJbG9jYWwtPmNvbmZpZy5ybW9kZSAmPSAweEZGMDA7CisJCQlsb2NhbC0+Y29uZmlnLnJtb2RlIHw9IFJYTU9ERV9CQ19NQ19BRERSOworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCQljYXNlIElXX1BPV0VSX09OOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLy8gTm90ZSA6IHdlIG1heSB3YW50IHRvIGZhY3RvciBsb2NhbC0+bmVlZF9jb21taXQgaGVyZQorCS8vIE5vdGUyIDogbWF5IGFsc28gd2FudCB0byBmYWN0b3IgUlhNT0RFX1JGTU9OIHRlc3QKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBQb3dlciBNYW5hZ2VtZW50CisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlpbnQgbW9kZTsKKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCW1vZGUgPSBsb2NhbC0+Y29uZmlnLnBvd2VyU2F2ZU1vZGU7CisJaWYgKCh2d3JxLT5kaXNhYmxlZCA9IChtb2RlID09IFBPV0VSU0FWRV9DQU0pKSkKKwkJcmV0dXJuIDA7CisJaWYgKCh2d3JxLT5mbGFncyAmIElXX1BPV0VSX1RZUEUpID09IElXX1BPV0VSX1RJTUVPVVQpIHsKKwkJdndycS0+dmFsdWUgPSAoaW50KWxvY2FsLT5jb25maWcuZmFzdExpc3RlbkRlbGF5ICogMTAyNDsKKwkJdndycS0+ZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCX0gZWxzZSB7CisJCXZ3cnEtPnZhbHVlID0gKGludClsb2NhbC0+Y29uZmlnLmZhc3RMaXN0ZW5JbnRlcnZhbCAqIDEwMjQ7CisJCXZ3cnEtPmZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCX0KKwlpZiAoKGxvY2FsLT5jb25maWcucm1vZGUgJiAweEZGKSA9PSBSWE1PREVfQUREUikKKwkJdndycS0+ZmxhZ3MgfD0gSVdfUE9XRVJfVU5JQ0FTVF9SOworCWVsc2UKKwkJdndycS0+ZmxhZ3MgfD0gSVdfUE9XRVJfQUxMX1I7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgU2Vuc2l0aXZpdHkKKyAqLworc3RhdGljIGludCBhaXJvX3NldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwlsb2NhbC0+Y29uZmlnLnJzc2lUaHJlc2hvbGQgPSB2d3JxLT5kaXNhYmxlZCA/IFJTU0lfREVGQVVMVCA6IHZ3cnEtPnZhbHVlOworCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IFNlbnNpdGl2aXR5CisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJdndycS0+dmFsdWUgPSBsb2NhbC0+Y29uZmlnLnJzc2lUaHJlc2hvbGQ7CisJdndycS0+ZGlzYWJsZWQgPSAodndycS0+dmFsdWUgPT0gMCk7CisJdndycS0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IEFQIExpc3QKKyAqIE5vdGUgOiB0aGlzIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgSVdTQ0FOCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfYXBsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJc3RydWN0IHNvY2thZGRyICphZGRyZXNzID0gKHN0cnVjdCBzb2NrYWRkciAqKSBleHRyYTsKKwlzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsW0lXX01BWF9BUF07CisJQlNTTGlzdFJpZCBCU1NMaXN0OworCWludCBpOworCWludCBsb3NlU3luYyA9IGNhcGFibGUoQ0FQX05FVF9BRE1JTikgPyAxOiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBJV19NQVhfQVA7IGkrKykgeworCQlpZiAocmVhZEJTU0xpc3RSaWQobG9jYWwsIGxvc2VTeW5jLCAmQlNTTGlzdCkpCisJCQlicmVhazsKKwkJbG9zZVN5bmMgPSAwOworCQltZW1jcHkoYWRkcmVzc1tpXS5zYV9kYXRhLCBCU1NMaXN0LmJzc2lkLCBFVEhfQUxFTik7CisJCWFkZHJlc3NbaV0uc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQlpZiAobG9jYWwtPnJzc2kpCisJCQlxdWFsW2ldLmxldmVsID0gMHgxMDAgLSBsb2NhbC0+cnNzaVtCU1NMaXN0LnJzc2ldLnJzc2lkQm07CisJCWVsc2UKKwkJCXF1YWxbaV0ubGV2ZWwgPSAoQlNTTGlzdC5yc3NpICsgMzIxKSAvIDI7CisJCXF1YWxbaV0ucXVhbCA9IHF1YWxbaV0ubm9pc2UgPSAwOworCQlxdWFsW2ldLnVwZGF0ZWQgPSAyOworCQlpZiAoQlNTTGlzdC5pbmRleCA9PSAweGZmZmYpCisJCQlicmVhazsKKwl9CisJaWYgKCFpKSB7CisJCVN0YXR1c1JpZCBzdGF0dXNfcmlkOwkJLyogQ2FyZCBzdGF0dXMgaW5mbyAqLworCQlyZWFkU3RhdHVzUmlkKGxvY2FsLCAmc3RhdHVzX3JpZCwgMSk7CisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8IG1pbihJV19NQVhfQVAsIDQpICYmCisJCQkgICAgIChzdGF0dXNfcmlkLmJzc2lkW2ldWzBdCisJCQkgICAgICAmIHN0YXR1c19yaWQuYnNzaWRbaV1bMV0KKwkJCSAgICAgICYgc3RhdHVzX3JpZC5ic3NpZFtpXVsyXQorCQkJICAgICAgJiBzdGF0dXNfcmlkLmJzc2lkW2ldWzNdCisJCQkgICAgICAmIHN0YXR1c19yaWQuYnNzaWRbaV1bNF0KKwkJCSAgICAgICYgc3RhdHVzX3JpZC5ic3NpZFtpXVs1XSkhPTB4ZmYgJiYKKwkJCSAgICAgKHN0YXR1c19yaWQuYnNzaWRbaV1bMF0KKwkJCSAgICAgIHwgc3RhdHVzX3JpZC5ic3NpZFtpXVsxXQorCQkJICAgICAgfCBzdGF0dXNfcmlkLmJzc2lkW2ldWzJdCisJCQkgICAgICB8IHN0YXR1c19yaWQuYnNzaWRbaV1bM10KKwkJCSAgICAgIHwgc3RhdHVzX3JpZC5ic3NpZFtpXVs0XQorCQkJICAgICAgfCBzdGF0dXNfcmlkLmJzc2lkW2ldWzVdKTsKKwkJICAgICBpKyspIHsKKwkJCW1lbWNweShhZGRyZXNzW2ldLnNhX2RhdGEsCisJCQkgICAgICAgc3RhdHVzX3JpZC5ic3NpZFtpXSwgRVRIX0FMRU4pOworCQkJYWRkcmVzc1tpXS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCX0KKwl9IGVsc2UgeworCQlkd3JxLT5mbGFncyA9IDE7IC8qIFNob3VsZCBiZSBkZWZpbmUnZCAqLworCQltZW1jcHkoZXh0cmEgKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSppLAorCQkgICAgICAgJnF1YWwsICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpKmkpOworCX0KKwlkd3JxLT5sZW5ndGggPSBpOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogSW5pdGlhdGUgU2NhbgorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlDbWQgY21kOworCVJlc3AgcnNwOworCisJLyogTm90ZSA6IHlvdSBtYXkgaGF2ZSByZWFsaXNlZCB0aGF0LCBhcyB0aGlzIGlzIGEgU0VUIG9wZXJhdGlvbiwKKwkgKiB0aGlzIGlzIHByaXZpbGVnZWQgYW5kIHRoZXJlZm9yZSBhIG5vcm1hbCB1c2VyIGNhbid0CisJICogcGVyZm9ybSBzY2FubmluZy4KKwkgKiBUaGlzIGlzIG5vdCBhbiBlcnJvciwgd2hpbGUgdGhlIGRldmljZSBwZXJmb3JtIHNjYW5uaW5nLAorCSAqIHRyYWZmaWMgZG9lc24ndCBmbG93LCBzbyBpdCdzIGEgcGVyZmVjdCBEb1MuLi4KKwkgKiBKZWFuIElJICovCisJaWYgKGFpLT5mbGFncyAmIEZMQUdfUkFESU9fTUFTSykgcmV0dXJuIC1FTkVURE9XTjsKKworCS8qIEluaXRpYXRlIGEgc2NhbiBjb21tYW5kICovCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQuY21kPUNNRF9MSVNUQlNTOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCWlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CisJYWktPnNjYW5fdGltZXN0YW1wID0gamlmZmllczsKKwl1cCgmYWktPnNlbSk7CisKKwkvKiBBdCB0aGlzIHBvaW50LCBqdXN0IHJldHVybiB0byB0aGUgdXNlci4gKi8KKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVHJhbnNsYXRlIHNjYW4gZGF0YSByZXR1cm5lZCBmcm9tIHRoZSBjYXJkIHRvIGEgY2FyZCBpbmRlcGVuZGVudAorICogZm9ybWF0IHRoYXQgdGhlIFdpcmVsZXNzIFRvb2xzIHdpbGwgdW5kZXJzdGFuZCAtIEplYW4gSUkKKyAqLworc3RhdGljIGlubGluZSBjaGFyICphaXJvX3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCWNoYXIgKmN1cnJlbnRfZXYsCisJCQkJCWNoYXIgKmVuZF9idWYsCisJCQkJCUJTU0xpc3RSaWQgKmxpc3QpCit7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJc3RydWN0IGl3X2V2ZW50CQlpd2U7CQkvKiBUZW1wb3JhcnkgYnVmZmVyICovCisJdTE2CQkJY2FwYWJpbGl0aWVzOworCWNoYXIgKgkJCWN1cnJlbnRfdmFsOwkvKiBGb3IgcmF0ZXMgKi8KKwlpbnQJCQlpOworCisJLyogRmlyc3QgZW50cnkgKk1VU1QqIGJlIHRoZSBBUCBNQUMgYWRkcmVzcyAqLworCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgbGlzdC0+YnNzaWQsIEVUSF9BTEVOKTsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOworCisJLyogT3RoZXIgZW50cmllcyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgb3JkZXIgd2UgZ2l2ZSB0aGVtICovCisKKwkvKiBBZGQgdGhlIEVTU0lEICovCisJaXdlLnUuZGF0YS5sZW5ndGggPSBsaXN0LT5zc2lkTGVuOworCWlmKGl3ZS51LmRhdGEubGVuZ3RoID4gMzIpCisJCWl3ZS51LmRhdGEubGVuZ3RoID0gMzI7CisJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKKwlpd2UudS5kYXRhLmZsYWdzID0gMTsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgbGlzdC0+c3NpZCk7CisKKwkvKiBBZGQgbW9kZSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKwljYXBhYmlsaXRpZXMgPSBsZTE2X3RvX2NwdShsaXN0LT5jYXApOworCWlmKGNhcGFiaWxpdGllcyAmIChDQVBfRVNTIHwgQ0FQX0lCU1MpKSB7CisJCWlmKGNhcGFiaWxpdGllcyAmIENBUF9FU1MpCisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9NQVNURVI7CisJCWVsc2UKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOworCX0KKworCS8qIEFkZCBmcmVxdWVuY3kgKi8KKwlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJaXdlLnUuZnJlcS5tID0gbGUxNl90b19jcHUobGlzdC0+ZHNDaGFubmVsKTsKKwlpd2UudS5mcmVxLm0gPSBmcmVxdWVuY3lfbGlzdFtpd2UudS5mcmVxLm1dICogMTAwMDAwOworCWl3ZS51LmZyZXEuZSA9IDE7CisJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKworCS8qIEFkZCBxdWFsaXR5IHN0YXRpc3RpY3MgKi8KKwlpd2UuY21kID0gSVdFVlFVQUw7CisJaWYgKGFpLT5yc3NpKQorCQlpd2UudS5xdWFsLmxldmVsID0gMHgxMDAgLSBhaS0+cnNzaVtsaXN0LT5yc3NpXS5yc3NpZEJtOworCWVsc2UKKwkJaXdlLnUucXVhbC5sZXZlbCA9IChsaXN0LT5yc3NpICsgMzIxKSAvIDI7CisJaXdlLnUucXVhbC5ub2lzZSA9IDA7CisJaXdlLnUucXVhbC5xdWFsID0gMDsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworCisJLyogQWRkIGVuY3J5cHRpb24gY2FwYWJpbGl0eSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCWlmKGNhcGFiaWxpdGllcyAmIENBUF9QUklWQUNZKQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisJZWxzZQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCWl3ZS51LmRhdGEubGVuZ3RoID0gMDsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgbGlzdC0+c3NpZCk7CisKKwkvKiBSYXRlIDogc3R1ZmZpbmcgbXVsdGlwbGUgdmFsdWVzIGluIGEgc2luZ2xlIGV2ZW50IHJlcXVpcmUgYSBiaXQKKwkgKiBtb3JlIG9mIG1hZ2ljIC0gSmVhbiBJSSAqLworCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisKKwlpd2UuY21kID0gU0lPQ0dJV1JBVEU7CisJLyogVGhvc2UgdHdvIGZsYWdzIGFyZSBpZ25vcmVkLi4uICovCisJaXdlLnUuYml0cmF0ZS5maXhlZCA9IGl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCS8qIE1heCA4IHZhbHVlcyAqLworCWZvcihpID0gMCA7IGkgPCA4IDsgaSsrKSB7CisJCS8qIE5VTEwgdGVybWluYXRlZCAqLworCQlpZihsaXN0LT5yYXRlc1tpXSA9PSAwKQorCQkJYnJlYWs7CisJCS8qIEJpdCByYXRlIGdpdmVuIGluIDUwMCBrYi9zIHVuaXRzICgrIDB4ODApICovCisJCWl3ZS51LmJpdHJhdGUudmFsdWUgPSAoKGxpc3QtPnJhdGVzW2ldICYgMHg3ZikgKiA1MDAwMDApOworCQkvKiBBZGQgbmV3IHZhbHVlIHRvIGV2ZW50ICovCisJCWN1cnJlbnRfdmFsID0gaXdlX3N0cmVhbV9hZGRfdmFsdWUoY3VycmVudF9ldiwgY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsIElXX0VWX1BBUkFNX0xFTik7CisJfQorCS8qIENoZWNrIGlmIHdlIGFkZGVkIGFueSBldmVudCAqLworCWlmKChjdXJyZW50X3ZhbCAtIGN1cnJlbnRfZXYpID4gSVdfRVZfTENQX0xFTikKKwkJY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOworCisJLyogVGhlIG90aGVyIGRhdGEgaW4gdGhlIHNjYW4gcmVzdWx0IGFyZSBub3QgcmVhbGx5CisJICogaW50ZXJlc3RpbmcsIHNvIGZvciBub3cgZHJvcCBpdCAtIEplYW4gSUkgKi8KKwlyZXR1cm4gY3VycmVudF9ldjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBSZWFkIFNjYW4gUmVzdWx0cworICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlCU1NMaXN0UmlkIEJTU0xpc3Q7CisJaW50IHJjOworCWNoYXIgKmN1cnJlbnRfZXYgPSBleHRyYTsKKworCS8qIFdoZW4gd2UgYXJlIGFzc29jaWF0ZWQgYWdhaW4sIHRoZSBzY2FuIGhhcyBzdXJlbHkgZmluaXNoZWQuCisJICogSnVzdCBpbiBjYXNlLCBsZXQncyBtYWtlIHN1cmUgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgc2luY2UKKwkgKiB3ZSBzdGFydGVkIHRoZSBzY2FuLiAtIEphdmllciAqLworCWlmKGFpLT5zY2FuX3RpbWVzdGFtcCAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLGFpLT5zY2FuX3RpbWVzdGFtcCszKkhaKSkgeworCQkvKiBJbXBvcnRhbnQgbm90ZSA6IHdlIGRvbid0IHdhbnQgdG8gYmxvY2sgdGhlIGNhbGxlcgorCQkgKiB1bnRpbCByZXN1bHRzIGFyZSByZWFkeSBmb3IgdmFyaW91cyByZWFzb25zLgorCQkgKiBGaXJzdCwgbWFuYWdpbmcgd2FpdCBxdWV1ZXMgaXMgY29tcGxleCBhbmQgcmFjeQorCQkgKiAodGhlcmUgbWF5IGJlIG11bHRpcGxlIHNpbXVsdGFuZW91cyBjYWxsZXJzKS4KKwkJICogU2Vjb25kLCB3ZSBncmFiIHNvbWUgcnRuZXRsaW5rIGxvY2sgYmVmb3JlIGNvbW1pbmcKKwkJICogaGVyZSAoaW4gZGV2X2lvY3RsKCkpLgorCQkgKiBUaGlyZCwgdGhlIGNhbGxlciBjYW4gd2FpdCBvbiB0aGUgV2lyZWxlc3MgRXZlbnQKKwkJICogLSBKZWFuIElJICovCisJCXJldHVybiAtRUFHQUlOOworCX0KKwlhaS0+c2Nhbl90aW1lc3RhbXAgPSAwOworCisJLyogVGhlcmUncyBvbmx5IGEgcmFjZSB3aXRoIHByb2NfQlNTTGlzdF9vcGVuKCksIGJ1dCBpdHMKKwkgKiBjb25zZXF1ZW5jZXMgYXJlIGJlZ25pZ24uIFNvIEkgZG9uJ3QgYm90aGVyIGZpeGluZyBpdCAtIEphdmllciAqLworCisJLyogVHJ5IHRvIHJlYWQgdGhlIGZpcnN0IGVudHJ5IG9mIHRoZSBzY2FuIHJlc3VsdCAqLworCXJjID0gUEM0NTAwX3JlYWRyaWQoYWksIFJJRF9CU1NMSVNURklSU1QsICZCU1NMaXN0LCBzaXplb2YoQlNTTGlzdCksIDEpOworCWlmKChyYykgfHwgKEJTU0xpc3QuaW5kZXggPT0gMHhmZmZmKSkgeworCQkvKiBDbGllbnQgZXJyb3IsIG5vIHNjYW4gcmVzdWx0cy4uLgorCQkgKiBUaGUgY2FsbGVyIG5lZWQgdG8gcmVzdGFydCB0aGUgc2Nhbi4gKi8KKwkJcmV0dXJuIC1FTk9EQVRBOworCX0KKworCS8qIFJlYWQgYW5kIHBhcnNlIGFsbCBlbnRyaWVzICovCisJd2hpbGUoKCFyYykgJiYgKEJTU0xpc3QuaW5kZXggIT0gMHhmZmZmKSkgeworCQkvKiBUcmFuc2xhdGUgdG8gV0UgZm9ybWF0IHRoaXMgZW50cnkgKi8KKwkJY3VycmVudF9ldiA9IGFpcm9fdHJhbnNsYXRlX3NjYW4oZGV2LCBjdXJyZW50X2V2LAorCQkJCQkJIGV4dHJhICsgZHdycS0+bGVuZ3RoLAorCQkJCQkJICZCU1NMaXN0KTsKKworCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBzcGFjZSBmb3Igb25lIG1vcmUgZW50cnkgKi8KKwkJaWYoKGV4dHJhICsgZHdycS0+bGVuZ3RoIC0gY3VycmVudF9ldikgPD0gSVdfRVZfQUREUl9MRU4pIHsKKwkJCS8qIEFzayB1c2VyIHNwYWNlIHRvIHRyeSBhZ2FpbiB3aXRoIGEgYmlnZ2VyIGJ1ZmZlciAqLworCQkJcmV0dXJuIC1FMkJJRzsKKwkJfQorCisJCS8qIFJlYWQgbmV4dCBlbnRyeSAqLworCQlyYyA9IFBDNDUwMF9yZWFkcmlkKGFpLCBSSURfQlNTTElTVE5FWFQsCisJCQkJICAgICZCU1NMaXN0LCBzaXplb2YoQlNTTGlzdCksIDEpOworCX0KKwkvKiBMZW5ndGggb2YgZGF0YSAqLworCWR3cnEtPmxlbmd0aCA9IChjdXJyZW50X2V2IC0gZXh0cmEpOworCWR3cnEtPmZsYWdzID0gMDsJLyogdG9kbyAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBDb21taXQgaGFuZGxlciA6IGNhbGxlZCBhZnRlciBhIGJ1bmNoIG9mIFNFVCBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyBpbnQgYWlyb19jb25maWdfY29tbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAkvKiBOVUxMICovCisJCQkgICAgICB2b2lkICp6d3JxLAkJCS8qIE5VTEwgKi8KKwkJCSAgICAgIGNoYXIgKmV4dHJhKQkJCS8qIE5VTEwgKi8KK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlSZXNwIHJzcDsKKworCWlmICghdGVzdF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTb21lIG9mIHRoZSAiU0VUIiBmdW5jdGlvbiBtYXkgaGF2ZSBtb2RpZmllZCBzb21lIG9mIHRoZQorCSAqIHBhcmFtZXRlcnMuIEl0J3Mgbm93IHRpbWUgdG8gY29tbWl0IHRoZW0gaW4gdGhlIGNhcmQgKi8KKwlkaXNhYmxlX01BQyhsb2NhbCwgMSk7CisJaWYgKHRlc3RfYml0IChGTEFHX1JFU0VULCAmbG9jYWwtPmZsYWdzKSkgeworCQlBUExpc3RSaWQgQVBMaXN0X3JpZDsKKwkJU3NpZFJpZCBTU0lEX3JpZDsKKworCQlyZWFkQVBMaXN0UmlkKGxvY2FsLCAmQVBMaXN0X3JpZCk7CisJCXJlYWRTc2lkUmlkKGxvY2FsLCAmU1NJRF9yaWQpOworCQlpZiAodGVzdF9iaXQoRkxBR19NUEksJmxvY2FsLT5mbGFncykpCisJCQlzZXR1cF9jYXJkKGxvY2FsLCBkZXYtPmRldl9hZGRyLCAxICk7CisJCWVsc2UKKwkJCXJlc2V0X2Fpcm9fY2FyZChkZXYpOworCQlkaXNhYmxlX01BQyhsb2NhbCwgMSk7CisJCXdyaXRlU3NpZFJpZChsb2NhbCwgJlNTSURfcmlkLCAxKTsKKwkJd3JpdGVBUExpc3RSaWQobG9jYWwsICZBUExpc3RfcmlkLCAxKTsKKwl9CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmbG9jYWwtPnNlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJd3JpdGVDb25maWdSaWQobG9jYWwsIDApOworCWVuYWJsZV9NQUMobG9jYWwsICZyc3AsIDApOworCWlmICh0ZXN0X2JpdCAoRkxBR19SRVNFVCwgJmxvY2FsLT5mbGFncykpCisJCWFpcm9fc2V0X3Byb21pc2MobG9jYWwpOworCWVsc2UKKwkJdXAoJmxvY2FsLT5zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTdHJ1Y3R1cmVzIHRvIGV4cG9ydCB0aGUgV2lyZWxlc3MgSGFuZGxlcnMKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyBhaXJvX3ByaXZhdGVfYXJnc1tdID0geworLyp7IGNtZCwgICAgICAgICBzZXRfYXJncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FyZ3MsIG5hbWUgfSAqLworICB7IEFJUk9JT0NUTCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCBzaXplb2YgKGFpcm9uZXRfaW9jdGwpLAorICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgMjA0NywgImFpcm9pb2N0bCIgfSwKKyAgeyBBSVJPSURJRkMsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgc2l6ZW9mIChhaXJvbmV0X2lvY3RsKSwKKyAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImFpcm9pZGlmYyIgfSwKK307CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCQlhaXJvX2hhbmRsZXJbXSA9Cit7CisJKGl3X2hhbmRsZXIpIGFpcm9fY29uZmlnX2NvbW1pdCwJLyogU0lPQ1NJV0NPTU1JVCAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9uYW1lLAkJLyogU0lPQ0dJV05BTUUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DU0lXTldJRCAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NHSVdOV0lEICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X2ZyZXEsCQkvKiBTSU9DU0lXRlJFUSAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9mcmVxLAkJLyogU0lPQ0dJV0ZSRVEgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfbW9kZSwJCS8qIFNJT0NTSVdNT0RFICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X21vZGUsCQkvKiBTSU9DR0lXTU9ERSAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9zZW5zLAkJLyogU0lPQ1NJV1NFTlMgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfc2VucywJCS8qIFNJT0NHSVdTRU5TICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ1NJV1JBTkdFICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X3JhbmdlLAkJLyogU0lPQ0dJV1JBTkdFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ1NJV1BSSVYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DR0lXUFJJViAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NTSVdTVEFUUyAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NHSVdTVEFUUyAqLworCWl3X2hhbmRsZXJfc2V0X3NweSwJCQkvKiBTSU9DU0lXU1BZICovCisJaXdfaGFuZGxlcl9nZXRfc3B5LAkJCS8qIFNJT0NHSVdTUFkgKi8KKwlpd19oYW5kbGVyX3NldF90aHJzcHksCQkJLyogU0lPQ1NJV1RIUlNQWSAqLworCWl3X2hhbmRsZXJfZ2V0X3RocnNweSwJCQkvKiBTSU9DR0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X3dhcCwJCS8qIFNJT0NTSVdBUCAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF93YXAsCQkvKiBTSU9DR0lXQVAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X2FwbGlzdCwJCS8qIFNJT0NHSVdBUExJU1QgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfc2NhbiwJCS8qIFNJT0NTSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X3NjYW4sCQkvKiBTSU9DR0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9lc3NpZCwJCS8qIFNJT0NTSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9lc3NpZCwJCS8qIFNJT0NHSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9uaWNrLAkJLyogU0lPQ1NJV05JQ0tOICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X25pY2ssCQkvKiBTSU9DR0lXTklDS04gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9yYXRlLAkJLyogU0lPQ1NJV1JBVEUgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfcmF0ZSwJCS8qIFNJT0NHSVdSQVRFICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X3J0cywJCS8qIFNJT0NTSVdSVFMgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfcnRzLAkJLyogU0lPQ0dJV1JUUyAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9mcmFnLAkJLyogU0lPQ1NJV0ZSQUcgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfZnJhZywJCS8qIFNJT0NHSVdGUkFHICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X3R4cG93LAkJLyogU0lPQ1NJV1RYUE9XICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X3R4cG93LAkJLyogU0lPQ0dJV1RYUE9XICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X3JldHJ5LAkJLyogU0lPQ1NJV1JFVFJZICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X3JldHJ5LAkJLyogU0lPQ0dJV1JFVFJZICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfZW5jb2RlLAkJLyogU0lPQ0dJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9wb3dlciwJCS8qIFNJT0NTSVdQT1dFUiAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9wb3dlciwJCS8qIFNJT0NHSVdQT1dFUiAqLworfTsKKworLyogTm90ZSA6IGRvbid0IGRlc2NyaWJlIEFJUk9JRElGQyBhbmQgQUlST09MRElESUZDIGluIGhlcmUuCisgKiBXZSB3YW50IHRvIGZvcmNlIHRoZSB1c2Ugb2YgdGhlIGlvY3RsIGNvZGUsIGJlY2F1c2UgdGhvc2UgY2FuJ3QgYmUKKyAqIHdvbid0IHdvcmsgdGhlIGl3X2hhbmRsZXIgY29kZSAoYmVjYXVzZSB0aGV5IHNpbXVsdGFuZW91c2x5IHJlYWQKKyAqIGFuZCB3cml0ZSBkYXRhIGFuZCBpd19oYW5kbGVyIGNhbid0IGRvIHRoYXQpLgorICogTm90ZSB0aGF0IGl0J3MgcGVyZmVjdGx5IGxlZ2FsIHRvIHJlYWQvd3JpdGUgb24gYSBzaW5nbGUgaW9jdGwgY29tbWFuZCwKKyAqIHlvdSBqdXN0IGNhbid0IHVzZSBpd3ByaXYgYW5kIG5lZWQgdG8gZm9yY2UgaXQgdmlhIHRoZSBpb2N0bCBoYW5kbGVyLgorICogSmVhbiBJSSAqLworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCWFpcm9fcHJpdmF0ZV9oYW5kbGVyW10gPQoreworCU5VTEwsCQkJCS8qIFNJT0NJV0ZJUlNUUFJJViAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZglhaXJvX2hhbmRsZXJfZGVmID0KK3sKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKGFpcm9faGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZQk9IHNpemVvZihhaXJvX3ByaXZhdGVfaGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKGFpcm9fcHJpdmF0ZV9hcmdzKS9zaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisJLnN0YW5kYXJkCT0gYWlyb19oYW5kbGVyLAorCS5wcml2YXRlCT0gYWlyb19wcml2YXRlX2hhbmRsZXIsCisJLnByaXZhdGVfYXJncwk9IGFpcm9fcHJpdmF0ZV9hcmdzLAorCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBhaXJvX2dldF93aXJlbGVzc19zdGF0cywKK307CisKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKworLyoKKyAqIFRoaXMgZGVmaW5lcyB0aGUgY29uZmlndXJhdGlvbiBwYXJ0IG9mIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zCisgKiBOb3RlIDogaXJxIGFuZCBzcGlubG9jayBwcm90ZWN0aW9uIHdpbGwgb2NjdXIgaW4gdGhlIHN1YnJvdXRpbmVzCisgKgorICogVE9ETyA6CisgKglvIENoZWNrIGlucHV0IHZhbHVlIG1vcmUgY2FyZWZ1bGx5IGFuZCBmaWxsIGNvcnJlY3QgdmFsdWVzIGluIHJhbmdlCisgKglvIFRlc3QgYW5kIHNoYWtlb3V0IHRoZSBidWdzIChpZiBhbnkpCisgKgorICogSmVhbiBJSQorICoKKyAqIEphdmllciBBY2hpcmljYSBkaWQgYSBncmVhdCBqb2Igb2YgbWVyZ2luZyBjb2RlIGZyb20gdGhlIHVubmFtZWQgQ0lTQ08KKyAqIGRldmVsb3BlciB0aGF0IGFkZGVkIHN1cHBvcnQgZm9yIGZsYXNoaW5nIHRoZSBjYXJkLgorICovCitzdGF0aWMgaW50IGFpcm9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gKHN0cnVjdCBhaXJvX2luZm8gKilkZXYtPnByaXY7CisKKwlpZiAoYWktPnBvd2VyKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoY21kKSB7CisjaWZkZWYgQ0lTQ09fRVhUCisJY2FzZSBBSVJPSURJRkM6CisjaWZkZWYgQUlST09MRElESUZDCisJY2FzZSBBSVJPT0xESURJRkM6CisjZW5kaWYKKwl7CisJCWludCB2YWwgPSBBSVJPTUFHSUM7CisJCWFpcm9uZXRfaW9jdGwgY29tOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbSxycS0+aWZyX2RhdGEsc2l6ZW9mKGNvbSkpKQorCQkJcmMgPSAtRUZBVUxUOworCQllbHNlIGlmIChjb3B5X3RvX3VzZXIoY29tLmRhdGEsKGNoYXIgKikmdmFsLHNpemVvZih2YWwpKSkKKwkJCXJjID0gLUVGQVVMVDsKKwl9CisJYnJlYWs7CisKKwljYXNlIEFJUk9JT0NUTDoKKyNpZmRlZiBBSVJPT0xESU9DVEwKKwljYXNlIEFJUk9PTERJT0NUTDoKKyNlbmRpZgorCQkvKiBHZXQgdGhlIGNvbW1hbmQgc3RydWN0IGFuZCBoYW5kIGl0IG9mZiBmb3IgZXZhbHVhdGlvbiBieQorCQkgKiB0aGUgcHJvcGVyIHN1YmZ1bmN0aW9uCisJCSAqLworCXsKKwkJYWlyb25ldF9pb2N0bCBjb207CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY29tLHJxLT5pZnJfZGF0YSxzaXplb2YoY29tKSkpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogU2VwYXJhdGUgUi9XIGZ1bmN0aW9ucyBicmFja2V0IGxlZ2FsaXR5IGhlcmUKKwkJICovCisJCWlmICggY29tLmNvbW1hbmQgPT0gQUlST1JTV1ZFUlNJT04gKSB7CisJCQlpZiAoY29weV90b191c2VyKGNvbS5kYXRhLCBzd3ZlcnNpb24sIHNpemVvZihzd3ZlcnNpb24pKSkKKwkJCQlyYyA9IC1FRkFVTFQ7CisJCQllbHNlCisJCQkJcmMgPSAwOworCQl9CisJCWVsc2UgaWYgKCBjb20uY29tbWFuZCA8PSBBSVJPUlJJRCkKKwkJCXJjID0gcmVhZHJpZHMoZGV2LCZjb20pOworCQllbHNlIGlmICggY29tLmNvbW1hbmQgPj0gQUlST1BDQVAgJiYgY29tLmNvbW1hbmQgPD0gKEFJUk9QTEVBUFVTUisyKSApCisJCQlyYyA9IHdyaXRlcmlkcyhkZXYsJmNvbSk7CisJCWVsc2UgaWYgKCBjb20uY29tbWFuZCA+PSBBSVJPRkxTSFJTVCAmJiBjb20uY29tbWFuZCA8PSBBSVJPUkVTVEFSVCApCisJCQlyYyA9IGZsYXNoY2FyZChkZXYsJmNvbSk7CisJCWVsc2UKKwkJCXJjID0gLUVJTlZBTDsgICAgICAvKiBCYWQgY29tbWFuZCBpbiBpb2N0bCAqLworCX0KKwlicmVhazsKKyNlbmRpZiAvKiBDSVNDT19FWFQgKi8KKworCS8vIEFsbCBvdGhlciBjYWxscyBhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkCisJZGVmYXVsdDoKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgV0lSRUxFU1NfRVhUCisvKgorICogR2V0IHRoZSBXaXJlbGVzcyBzdGF0cyBvdXQgb2YgdGhlIGRyaXZlcgorICogTm90ZSA6IGlycSBhbmQgc3BpbmxvY2sgcHJvdGVjdGlvbiB3aWxsIG9jY3VyIGluIHRoZSBzdWJyb3V0aW5lcworICoKKyAqIFRPRE8gOgorICoJbyBDaGVjayBpZiB3b3JrIGluIEFkLUhvYyBtb2RlIChvdGhlcndpc2UsIHVzZSBTUFksIGFzIGluIHd2bGFuX2NzKQorICoKKyAqIEplYW4KKyAqLworc3RhdGljIHZvaWQgYWlyb19yZWFkX3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBhaXJvX2luZm8gKmxvY2FsKQoreworCVN0YXR1c1JpZCBzdGF0dXNfcmlkOworCVN0YXRzUmlkIHN0YXRzX3JpZDsKKwlDYXBhYmlsaXR5UmlkIGNhcF9yaWQ7CisJdTMyICp2YWxzID0gc3RhdHNfcmlkLnZhbHM7CisKKwkvKiBHZXQgc3RhdHMgb3V0IG9mIHRoZSBjYXJkICovCisJY2xlYXJfYml0KEpPQl9XU1RBVFMsICZsb2NhbC0+ZmxhZ3MpOworCWlmIChsb2NhbC0+cG93ZXIpIHsKKwkJdXAoJmxvY2FsLT5zZW0pOworCQlyZXR1cm47CisJfQorCXJlYWRDYXBhYmlsaXR5UmlkKGxvY2FsLCAmY2FwX3JpZCwgMCk7CisJcmVhZFN0YXR1c1JpZChsb2NhbCwgJnN0YXR1c19yaWQsIDApOworCXJlYWRTdGF0c1JpZChsb2NhbCwgJnN0YXRzX3JpZCwgUklEX1NUQVRTLCAwKTsKKwl1cCgmbG9jYWwtPnNlbSk7CisKKwkvKiBUaGUgc3RhdHVzICovCisJbG9jYWwtPndzdGF0cy5zdGF0dXMgPSBzdGF0dXNfcmlkLm1vZGU7CisKKwkvKiBTaWduYWwgcXVhbGl0eSBhbmQgY28uIEJ1dCB3aGVyZSBpcyB0aGUgbm9pc2UgbGV2ZWwgPz8/ICovCisJbG9jYWwtPndzdGF0cy5xdWFsLnF1YWwgPSBhaXJvX2dldF9xdWFsaXR5KCZzdGF0dXNfcmlkLCAmY2FwX3JpZCk7CisJaWYgKGxvY2FsLT5yc3NpKQorCQlsb2NhbC0+d3N0YXRzLnF1YWwubGV2ZWwgPSAweDEwMCAtIGxvY2FsLT5yc3NpW3N0YXR1c19yaWQuc2lnUXVhbGl0eV0ucnNzaWRCbTsKKwllbHNlCisJCWxvY2FsLT53c3RhdHMucXVhbC5sZXZlbCA9IChzdGF0dXNfcmlkLm5vcm1hbGl6ZWRTaWduYWxTdHJlbmd0aCArIDMyMSkgLyAyOworCWlmIChzdGF0dXNfcmlkLmxlbiA+PSAxMjQpIHsKKwkJbG9jYWwtPndzdGF0cy5xdWFsLm5vaXNlID0gMjU2IC0gc3RhdHVzX3JpZC5ub2lzZWRCbTsKKwkJbG9jYWwtPndzdGF0cy5xdWFsLnVwZGF0ZWQgPSA3OworCX0gZWxzZSB7CisJCWxvY2FsLT53c3RhdHMucXVhbC5ub2lzZSA9IDA7CisJCWxvY2FsLT53c3RhdHMucXVhbC51cGRhdGVkID0gMzsKKwl9CisKKwkvKiBQYWNrZXRzIGRpc2NhcmRlZCBpbiB0aGUgd2lyZWxlc3MgYWRhcHRlciBkdWUgdG8gd2lyZWxlc3MKKwkgKiBzcGVjaWZpYyBwcm9ibGVtcyAqLworCWxvY2FsLT53c3RhdHMuZGlzY2FyZC5ud2lkID0gdmFsc1s1Nl0gKyB2YWxzWzU3XSArIHZhbHNbNThdOy8qIFNTSUQgTWlzbWF0Y2ggKi8KKwlsb2NhbC0+d3N0YXRzLmRpc2NhcmQuY29kZSA9IHZhbHNbNl07LyogUnhXZXBFcnIgKi8KKwlsb2NhbC0+d3N0YXRzLmRpc2NhcmQuZnJhZ21lbnQgPSB2YWxzWzMwXTsKKwlsb2NhbC0+d3N0YXRzLmRpc2NhcmQucmV0cmllcyA9IHZhbHNbMTBdOworCWxvY2FsLT53c3RhdHMuZGlzY2FyZC5taXNjID0gdmFsc1sxXSArIHZhbHNbMzJdOworCWxvY2FsLT53c3RhdHMubWlzcy5iZWFjb24gPSB2YWxzWzM0XTsKK30KKworc3RydWN0IGl3X3N0YXRpc3RpY3MgKmFpcm9fZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSAgZGV2LT5wcml2OworCisJaWYgKCF0ZXN0X2JpdChKT0JfV1NUQVRTLCAmbG9jYWwtPmZsYWdzKSkgeworCQkvKiBHZXQgc3RhdHMgb3V0IG9mIHRoZSBjYXJkIGlmIGF2YWlsYWJsZSAqLworCQlpZiAoZG93bl90cnlsb2NrKCZsb2NhbC0+c2VtKSAhPSAwKSB7CisJCQlzZXRfYml0KEpPQl9XU1RBVFMsICZsb2NhbC0+ZmxhZ3MpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZsb2NhbC0+dGhyX3dhaXQpOworCQl9IGVsc2UKKwkJCWFpcm9fcmVhZF93aXJlbGVzc19zdGF0cyhsb2NhbCk7CisJfQorCisJcmV0dXJuICZsb2NhbC0+d3N0YXRzOworfQorI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLworCisjaWZkZWYgQ0lTQ09fRVhUCisvKgorICogVGhpcyBqdXN0IHRyYW5zbGF0ZXMgZnJvbSBkcml2ZXIgSU9DVEwgY29kZXMgdG8gdGhlIGNvbW1hbmQgY29kZXMgdG8KKyAqIGZlZWQgdG8gdGhlIHJhZGlvJ3MgaG9zdCBpbnRlcmZhY2UuIFRoaW5ncyBjYW4gYmUgYWRkZWQvZGVsZXRlZAorICogYXMgbmVlZGVkLiAgVGhpcyByZXByZXNlbnRzIHRoZSBSRUFEIHNpZGUgb2YgY29udHJvbCBJL08gdG8KKyAqIHRoZSBjYXJkCisgKi8KK3N0YXRpYyBpbnQgcmVhZHJpZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYWlyb25ldF9pb2N0bCAqY29tcCkgeworCXVuc2lnbmVkIHNob3J0IHJpZGNvZGU7CisJdW5zaWduZWQgY2hhciAqaW9idWY7CisJaW50IGxlbjsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlSZXNwIHJzcDsKKworCWlmICh0ZXN0X2JpdChGTEFHX0ZMQVNISU5HLCAmYWktPmZsYWdzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2goY29tcC0+Y29tbWFuZCkKKwl7CisJY2FzZSBBSVJPR0NBUDogICAgICByaWRjb2RlID0gUklEX0NBUEFCSUxJVElFUzsgYnJlYWs7CisJY2FzZSBBSVJPR0NGRzogICAgICByaWRjb2RlID0gUklEX0NPTkZJRzsKKwkJaWYgKHRlc3RfYml0KEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKSkgeworCQkJZGlzYWJsZV9NQUMgKGFpLCAxKTsKKwkJCXdyaXRlQ29uZmlnUmlkIChhaSwgMSk7CisJCQllbmFibGVfTUFDIChhaSwgJnJzcCwgMSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBSVJPR1NMSVNUOiAgICByaWRjb2RlID0gUklEX1NTSUQ7ICAgICAgICAgYnJlYWs7CisJY2FzZSBBSVJPR1ZMSVNUOiAgICByaWRjb2RlID0gUklEX0FQTElTVDsgICAgICAgYnJlYWs7CisJY2FzZSBBSVJPR0RSVk5BTTogICByaWRjb2RlID0gUklEX0RSVk5BTUU7ICAgICAgYnJlYWs7CisJY2FzZSBBSVJPR0VIVEVOQzogICByaWRjb2RlID0gUklEX0VUSEVSRU5DQVA7ICAgYnJlYWs7CisJY2FzZSBBSVJPR1dFUEtUTVA6ICByaWRjb2RlID0gUklEX1dFUF9URU1QOworCQkvKiBPbmx5IHN1cGVyLXVzZXIgY2FuIHJlYWQgV0VQIGtleXMgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJYnJlYWs7CisJY2FzZSBBSVJPR1dFUEtOVjogICByaWRjb2RlID0gUklEX1dFUF9QRVJNOworCQkvKiBPbmx5IHN1cGVyLXVzZXIgY2FuIHJlYWQgV0VQIGtleXMgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJYnJlYWs7CisJY2FzZSBBSVJPR1NUQVQ6ICAgICByaWRjb2RlID0gUklEX1NUQVRVUzsgICAgICAgYnJlYWs7CisJY2FzZSBBSVJPR1NUQVRTRDMyOiByaWRjb2RlID0gUklEX1NUQVRTREVMVEE7ICAgYnJlYWs7CisJY2FzZSBBSVJPR1NUQVRTQzMyOiByaWRjb2RlID0gUklEX1NUQVRTOyAgICAgICAgYnJlYWs7CisjaWZkZWYgTUlDU1VQUE9SVAorCWNhc2UgQUlST0dNSUNTVEFUUzoKKwkJaWYgKGNvcHlfdG9fdXNlcihjb21wLT5kYXRhLCAmYWktPm1pY3N0YXRzLAorCQkJCSBtaW4oKGludCljb21wLT5sZW4sKGludClzaXplb2YoYWktPm1pY3N0YXRzKSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworI2VuZGlmCisJY2FzZSBBSVJPUlJJRDogICAgICByaWRjb2RlID0gY29tcC0+cmlkbnVtOyAgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWlmICgoaW9idWYgPSBrbWFsbG9jKFJJRFNJWkUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCVBDNDUwMF9yZWFkcmlkKGFpLHJpZGNvZGUsaW9idWYsUklEU0laRSwgMSk7CisJLyogZ2V0IHRoZSBjb3VudCBvZiBieXRlcyBpbiB0aGUgcmlkICBkb2NzIHNheSAxc3QgMiBieXRlcyBpcyBpdC4KKwkgKiB0aGVuIHJldHVybiBpdCB0byB0aGUgdXNlcgorCSAqIDkvMjIvMjAwMCBIb25vciB1c2VyIGdpdmVuIGxlbmd0aAorCSAqLworCWxlbiA9IGNvbXAtPmxlbjsKKworCWlmIChjb3B5X3RvX3VzZXIoY29tcC0+ZGF0YSwgaW9idWYsIG1pbihsZW4sIChpbnQpUklEU0laRSkpKSB7CisJCWtmcmVlIChpb2J1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlrZnJlZSAoaW9idWYpOworCXJldHVybiAwOworfQorCisvKgorICogRGFuZ2VyIFdpbGwgUm9iaW5zb24gd3JpdGUgdGhlIHJpZHMgaGVyZQorICovCisKK3N0YXRpYyBpbnQgd3JpdGVyaWRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGFpcm9uZXRfaW9jdGwgKmNvbXApIHsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlpbnQgIHJpZGNvZGU7CisjaWZkZWYgTUlDU1VQUE9SVAorICAgICAgICBpbnQgIGVuYWJsZWQ7CisjZW5kaWYKKwlSZXNwICAgICAgcnNwOworCXN0YXRpYyBpbnQgKCogd3JpdGVyKShzdHJ1Y3QgYWlyb19pbmZvICosIHUxNiByaWQsIGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOworCXVuc2lnbmVkIGNoYXIgKmlvYnVmOworCisJLyogT25seSBzdXBlci11c2VyIGNhbiB3cml0ZSBSSURzICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHRlc3RfYml0KEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVJTzsKKworCXJpZGNvZGUgPSAwOworCXdyaXRlciA9IGRvX3dyaXRlcmlkOworCisJc3dpdGNoKGNvbXAtPmNvbW1hbmQpCisJeworCWNhc2UgQUlST1BTSURTOiAgICAgcmlkY29kZSA9IFJJRF9TU0lEOyAgICAgICAgIGJyZWFrOworCWNhc2UgQUlST1BDQVA6ICAgICAgcmlkY29kZSA9IFJJRF9DQVBBQklMSVRJRVM7IGJyZWFrOworCWNhc2UgQUlST1BBUExJU1Q6ICAgcmlkY29kZSA9IFJJRF9BUExJU1Q7ICAgICAgIGJyZWFrOworCWNhc2UgQUlST1BDRkc6IGFpLT5jb25maWcubGVuID0gMDsKKwkJCSAgICBjbGVhcl9iaXQoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQkJICAgIHJpZGNvZGUgPSBSSURfQ09ORklHOyAgICAgICBicmVhazsKKwljYXNlIEFJUk9QV0VQS0VZTlY6IHJpZGNvZGUgPSBSSURfV0VQX1BFUk07ICAgICBicmVhazsKKwljYXNlIEFJUk9QTEVBUFVTUjogIHJpZGNvZGUgPSBSSURfTEVBUFVTRVJOQU1FOyBicmVhazsKKwljYXNlIEFJUk9QTEVBUFBXRDogIHJpZGNvZGUgPSBSSURfTEVBUFBBU1NXT1JEOyBicmVhazsKKwljYXNlIEFJUk9QV0VQS0VZOiAgIHJpZGNvZGUgPSBSSURfV0VQX1RFTVA7IHdyaXRlciA9IFBDNDUwMF93cml0ZXJpZDsKKwkJYnJlYWs7CisJY2FzZSBBSVJPUExFQVBVU1IrMTogcmlkY29kZSA9IDB4RkYyQTsgICAgICAgICAgYnJlYWs7CisJY2FzZSBBSVJPUExFQVBVU1IrMjogcmlkY29kZSA9IDB4RkYyQjsgICAgICAgICAgYnJlYWs7CisKKwkJLyogdGhpcyBpcyBub3QgcmVhbGx5IGEgcmlkIGJ1dCBhIGNvbW1hbmQgZ2l2ZW4gdG8gdGhlIGNhcmQKKwkJICogc2FtZSB3aXRoIE1BQyBvZmYKKwkJICovCisJY2FzZSBBSVJPUE1BQ09OOgorCQlpZiAoZW5hYmxlX01BQyhhaSwgJnJzcCwgMSkgIT0gMCkKKwkJCXJldHVybiAtRUlPOworCQlyZXR1cm4gMDsKKworCQkvKgorCQkgKiBFdmlkZW50bHkgdGhpcyBjb2RlIGluIHRoZSBhaXJvIGRyaXZlciBkb2VzIG5vdCBnZXQgYSBzeW1ib2wKKwkJICogYXMgZGlzYWJsZV9NQUMuIGl0J3MgcHJvYmFibHkgc28gc2hvcnQgdGhlIGNvbXBpbGVyIGRvZXMgbm90IGdlbiBvbmUuCisJCSAqLworCWNhc2UgQUlST1BNQUNPRkY6CisJCWRpc2FibGVfTUFDKGFpLCAxKTsKKwkJcmV0dXJuIDA7CisKKwkJLyogVGhpcyBjb21tYW5kIG1lcmVseSBjbGVhcnMgdGhlIGNvdW50cyBkb2VzIG5vdCBhY3R1YWxseSBzdG9yZSBhbnkgZGF0YQorCQkgKiBvbmx5IHJlYWRzIHJpZC4gQnV0IGFzIGl0IGNoYW5nZXMgdGhlIGNhcmRzIHN0YXRlLCBJIHB1dCBpdCBpbiB0aGUKKwkJICogd3JpdGVyaWQgcm91dGluZXMuCisJCSAqLworCWNhc2UgQUlST1BTVENMUjoKKwkJaWYgKChpb2J1ZiA9IGttYWxsb2MoUklEU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlQQzQ1MDBfcmVhZHJpZChhaSxSSURfU1RBVFNERUxUQUNMRUFSLGlvYnVmLFJJRFNJWkUsIDEpOworCisjaWZkZWYgTUlDU1VQUE9SVAorCQllbmFibGVkID0gYWktPm1pY3N0YXRzLmVuYWJsZWQ7CisJCW1lbXNldCgmYWktPm1pY3N0YXRzLDAsc2l6ZW9mKGFpLT5taWNzdGF0cykpOworCQlhaS0+bWljc3RhdHMuZW5hYmxlZCA9IGVuYWJsZWQ7CisjZW5kaWYKKworCQlpZiAoY29weV90b191c2VyKGNvbXAtPmRhdGEsIGlvYnVmLAorCQkJCSBtaW4oKGludCljb21wLT5sZW4sIChpbnQpUklEU0laRSkpKSB7CisJCQlrZnJlZSAoaW9idWYpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJa2ZyZWUgKGlvYnVmKTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CS8qIEJsYXJnISAqLworCX0KKwlpZihjb21wLT5sZW4gPiBSSURTSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoaW9idWYgPSBrbWFsbG9jKFJJRFNJWkUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihpb2J1Zixjb21wLT5kYXRhLGNvbXAtPmxlbikpIHsKKwkJa2ZyZWUgKGlvYnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGNvbXAtPmNvbW1hbmQgPT0gQUlST1BDRkcpIHsKKwkJQ29uZmlnUmlkICpjZmcgPSAoQ29uZmlnUmlkICopaW9idWY7CisKKwkJaWYgKHRlc3RfYml0KEZMQUdfTUlDX0NBUEFCTEUsICZhaS0+ZmxhZ3MpKQorCQkJY2ZnLT5vcG1vZGUgfD0gTU9ERV9NSUM7CisKKwkJaWYgKChjZmctPm9wbW9kZSAmIDB4RkYpID09IE1PREVfU1RBX0lCU1MpCisJCQlzZXRfYml0IChGTEFHX0FESE9DLCAmYWktPmZsYWdzKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0IChGTEFHX0FESE9DLCAmYWktPmZsYWdzKTsKKwl9CisKKwlpZigoKndyaXRlcikoYWksIHJpZGNvZGUsIGlvYnVmLGNvbXAtPmxlbiwxKSkgeworCQlrZnJlZSAoaW9idWYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJa2ZyZWUgKGlvYnVmKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBbmNpbGxhcnkgZmxhc2ggLyBtb2QgZnVuY3Rpb25zIG11Y2ggYmxhY2sgbWFnaWMgbHVya2VzIGhlcmUgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qCisgKiBGbGFzaCBjb21tYW5kIHN3aXRjaCB0YWJsZQorICovCisKK2ludCBmbGFzaGNhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYWlyb25ldF9pb2N0bCAqY29tcCkgeworCWludCB6OworCWludCBjbWRyZXNldChzdHJ1Y3QgYWlyb19pbmZvICopOworCWludCBzZXRmbGFzaG1vZGUoc3RydWN0IGFpcm9faW5mbyAqKTsKKwlpbnQgZmxhc2hnY2hhcihzdHJ1Y3QgYWlyb19pbmZvICosaW50LGludCk7CisJaW50IGZsYXNocGNoYXIoc3RydWN0IGFpcm9faW5mbyAqLGludCxpbnQpOworCWludCBmbGFzaHB1dGJ1ZihzdHJ1Y3QgYWlyb19pbmZvICopOworCWludCBmbGFzaHJlc3RhcnQoc3RydWN0IGFpcm9faW5mbyAqLHN0cnVjdCBuZXRfZGV2aWNlICopOworCisJLyogT25seSBzdXBlci11c2VyIGNhbiBtb2RpZnkgZmxhc2ggKi8KKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlzd2l0Y2goY29tcC0+Y29tbWFuZCkKKwl7CisJY2FzZSBBSVJPRkxTSFJTVDoKKwkJcmV0dXJuIGNtZHJlc2V0KChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2KTsKKworCWNhc2UgQUlST0ZMU0hTVEZMOgorCQlpZiAoISgoc3RydWN0IGFpcm9faW5mbyAqKWRldi0+cHJpdiktPmZsYXNoICYmCisJCQkoKChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2KS0+Zmxhc2ggPSBrbWFsbG9jIChGTEFTSFNJWkUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiBzZXRmbGFzaG1vZGUoKHN0cnVjdCBhaXJvX2luZm8gKilkZXYtPnByaXYpOworCisJY2FzZSBBSVJPRkxTSEdDSFI6IC8qIEdldCBjaGFyIGZyb20gYXV4ICovCisJCWlmKGNvbXAtPmxlbiAhPSBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnosY29tcC0+ZGF0YSxjb21wLT5sZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBmbGFzaGdjaGFyKChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2LHosODAwMCk7CisKKwljYXNlIEFJUk9GTFNIUENIUjogLyogU2VuZCBjaGFyIHRvIGNhcmQuICovCisJCWlmKGNvbXAtPmxlbiAhPSBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnosY29tcC0+ZGF0YSxjb21wLT5sZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBmbGFzaHBjaGFyKChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2LHosODAwMCk7CisKKwljYXNlIEFJUk9GTFBVVEJVRjogLyogU2VuZCAzMmsgdG8gY2FyZCAqLworCQlpZiAoISgoc3RydWN0IGFpcm9faW5mbyAqKWRldi0+cHJpdiktPmZsYXNoKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmKGNvbXAtPmxlbiA+IEZMQVNIU0laRSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZihjb3B5X2Zyb21fdXNlcigoKHN0cnVjdCBhaXJvX2luZm8gKilkZXYtPnByaXYpLT5mbGFzaCxjb21wLT5kYXRhLGNvbXAtPmxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlmbGFzaHB1dGJ1Zigoc3RydWN0IGFpcm9faW5mbyAqKWRldi0+cHJpdik7CisJCXJldHVybiAwOworCisJY2FzZSBBSVJPUkVTVEFSVDoKKwkJaWYoZmxhc2hyZXN0YXJ0KChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2LGRldikpCisJCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisjZGVmaW5lIEZMQVNIX0NPTU1BTkQgIDB4N2U3ZQorCisvKgorICogU1RFUCAxKQorICogRGlzYWJsZSBNQUMgYW5kIGRvIHNvZnQgcmVzZXQgb24KKyAqIGNhcmQuCisgKi8KKworaW50IGNtZHJlc2V0KHN0cnVjdCBhaXJvX2luZm8gKmFpKSB7CisJZGlzYWJsZV9NQUMoYWksIDEpOworCisJaWYoIXdhaXRidXN5IChhaSkpeworCQlwcmludGsoS0VSTl9JTkZPICJXYWl0YnVzeSBoYW5nIGJlZm9yZSBSRVNFVFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJT1VUNDUwMChhaSxDT01NQU5ELENNRF9TT0ZUUkVTRVQpOworCisJc3NsZWVwKDEpOwkJCS8qIFdBUyA2MDAgMTIvNy8wMCAqLworCisJaWYoIXdhaXRidXN5IChhaSkpeworCQlwcmludGsoS0VSTl9JTkZPICJXYWl0YnVzeSBoYW5nIEFGVEVSIFJFU0VUXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFNURVAgMikKKyAqIFB1dCB0aGUgY2FyZCBpbiBsZWdlbmRhcnkgZmxhc2gKKyAqIG1vZGUKKyAqLworCitpbnQgc2V0Zmxhc2htb2RlIChzdHJ1Y3QgYWlyb19pbmZvICphaSkgeworCXNldF9iaXQgKEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpOworCisJT1VUNDUwMChhaSwgU1dTMCwgRkxBU0hfQ09NTUFORCk7CisJT1VUNDUwMChhaSwgU1dTMSwgRkxBU0hfQ09NTUFORCk7CisJaWYgKHByb2JlKSB7CisJCU9VVDQ1MDAoYWksIFNXUzAsIEZMQVNIX0NPTU1BTkQpOworCQlPVVQ0NTAwKGFpLCBDT01NQU5ELDB4MTApOworCX0gZWxzZSB7CisJCU9VVDQ1MDAoYWksIFNXUzIsIEZMQVNIX0NPTU1BTkQpOworCQlPVVQ0NTAwKGFpLCBTV1MzLCBGTEFTSF9DT01NQU5EKTsKKwkJT1VUNDUwMChhaSwgQ09NTUFORCwwKTsKKwl9CisJbXNsZWVwKDUwMCk7CQkvKiA1MDBtcyBkZWxheSAqLworCisJaWYoIXdhaXRidXN5KGFpKSkgeworCQljbGVhcl9iaXQgKEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpOworCQlwcmludGsoS0VSTl9JTkZPICJXYWl0YnVzeSBoYW5nIGFmdGVyIHNldGZsYXNoIG1vZGVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFB1dCBjaGFyYWN0ZXIgdG8gU1dTMCB3YWl0IGZvciBkd2VsbHRpbWUKKyAqIHggNTB1cyBmb3IgIGVjaG8gLgorICovCisKK2ludCBmbGFzaHBjaGFyKHN0cnVjdCBhaXJvX2luZm8gKmFpLGludCBieXRlLGludCBkd2VsbHRpbWUpIHsKKwlpbnQgZWNobzsKKwlpbnQgd2FpdHRpbWU7CisKKwlieXRlIHw9IDB4ODAwMDsKKworCWlmKGR3ZWxsdGltZSA9PSAwICkKKwkJZHdlbGx0aW1lID0gMjAwOworCisJd2FpdHRpbWU9ZHdlbGx0aW1lOworCisJLyogV2FpdCBmb3IgYnVzeSBiaXQgZDE1IHRvIGdvIGZhbHNlIGluZGljYXRpbmcgYnVmZmVyIGVtcHR5ICovCisJd2hpbGUgKChJTjQ1MDAgKGFpLCBTV1MwKSAmIDB4ODAwMCkgJiYgd2FpdHRpbWUgPiAwKSB7CisJCXVkZWxheSAoNTApOworCQl3YWl0dGltZSAtPSA1MDsKKwl9CisKKwkvKiB0aW1lb3V0IGZvciBidXN5IGNsZWFyIHdhaXQgKi8KKwlpZih3YWl0dGltZSA8PSAwICl7CisJCXByaW50ayhLRVJOX0lORk8gImZsYXNoIHB1dGNoYXIgYnVzeXdhaXQgdGltZW91dCEgXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBQb3J0IGlzIGNsZWFyIG5vdyB3cml0ZSBieXRlIGFuZCB3YWl0IGZvciBpdCB0byBlY2hvIGJhY2sgKi8KKwlkbyB7CisJCU9VVDQ1MDAoYWksU1dTMCxieXRlKTsKKwkJdWRlbGF5KDUwKTsKKwkJZHdlbGx0aW1lIC09IDUwOworCQllY2hvID0gSU40NTAwKGFpLFNXUzEpOworCX0gd2hpbGUgKGR3ZWxsdGltZSA+PSAwICYmIGVjaG8gIT0gYnl0ZSk7CisKKwlPVVQ0NTAwKGFpLFNXUzEsMCk7CisKKwlyZXR1cm4gKGVjaG8gPT0gYnl0ZSkgPyAwIDogLUVJTzsKK30KKworLyoKKyAqIEdldCBhIGNoYXJhY3RlciBmcm9tIHRoZSBjYXJkIG1hdGNoaW5nIG1hdGNoYnl0ZQorICogU3RlcCAzKQorICovCitpbnQgZmxhc2hnY2hhcihzdHJ1Y3QgYWlyb19pbmZvICphaSxpbnQgbWF0Y2hieXRlLGludCBkd2VsbHRpbWUpeworCWludCAgICAgICAgICAgcmNoYXI7CisJdW5zaWduZWQgY2hhciByYnl0ZT0wOworCisJZG8geworCQlyY2hhciA9IElONDUwMChhaSxTV1MxKTsKKworCQlpZihkd2VsbHRpbWUgJiYgISgweDgwMDAgJiByY2hhcikpeworCQkJZHdlbGx0aW1lIC09IDEwOworCQkJbWRlbGF5KDEwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXJieXRlID0gMHhmZiAmIHJjaGFyOworCisJCWlmKCAocmJ5dGUgPT0gbWF0Y2hieXRlKSAmJiAoMHg4MDAwICYgcmNoYXIpICl7CisJCQlPVVQ0NTAwKGFpLFNXUzEsMCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiggcmJ5dGUgPT0gMHg4MSB8fCByYnl0ZSA9PSAweDgyIHx8IHJieXRlID09IDB4ODMgfHwgcmJ5dGUgPT0gMHgxYSB8fCAweGZmZmYgPT0gcmNoYXIpCisJCQlicmVhazsKKwkJT1VUNDUwMChhaSxTV1MxLDApOworCisJfXdoaWxlKGR3ZWxsdGltZSA+IDApOworCXJldHVybiAtRUlPOworfQorCisvKgorICogVHJhbnNmZXIgMzJrIG9mIGZpcm13YXJlIGRhdGEgZnJvbSB1c2VyIGJ1ZmZlciB0byBvdXIgYnVmZmVyIGFuZAorICogc2VuZCB0byB0aGUgY2FyZAorICovCisKK2ludCBmbGFzaHB1dGJ1ZihzdHJ1Y3QgYWlyb19pbmZvICphaSl7CisJaW50ICAgICAgICAgICAgbndvcmRzOworCisJLyogV3JpdGUgc3R1ZmYgKi8KKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpCisJCW1lbWNweV90b2lvKGFpLT5wY2lhdXggKyAweDgwMDAsIGFpLT5mbGFzaCwgRkxBU0hTSVpFKTsKKwllbHNlIHsKKwkJT1VUNDUwMChhaSxBVVhQQUdFLDB4MTAwKTsKKwkJT1VUNDUwMChhaSxBVVhPRkYsMCk7CisKKwkJZm9yKG53b3Jkcz0wO253b3JkcyAhPSBGTEFTSFNJWkUgLyAyO253b3JkcysrKXsKKwkJCU9VVDQ1MDAoYWksQVVYREFUQSxhaS0+Zmxhc2hbbndvcmRzXSAmIDB4ZmZmZik7CisJCX0KKwl9CisJT1VUNDUwMChhaSxTV1MwLDB4ODAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCisgKi8KK2ludCBmbGFzaHJlc3RhcnQoc3RydWN0IGFpcm9faW5mbyAqYWksc3RydWN0IG5ldF9kZXZpY2UgKmRldil7CisJaW50ICAgIGksc3RhdHVzOworCisJc3NsZWVwKDEpOwkJCS8qIEFkZGVkIDEyLzcvMDAgKi8KKwljbGVhcl9iaXQgKEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpOworCWlmICh0ZXN0X2JpdChGTEFHX01QSSwgJmFpLT5mbGFncykpIHsKKwkJc3RhdHVzID0gbXBpX2luaXRfZGVzY3JpcHRvcnMoYWkpOworCQlpZiAoc3RhdHVzICE9IFNVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKwlzdGF0dXMgPSBzZXR1cF9jYXJkKGFpLCBkZXYtPmRldl9hZGRyLCAxKTsKKworCWlmICghdGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpCisJCWZvciggaSA9IDA7IGkgPCBNQVhfRklEUzsgaSsrICkgeworCQkJYWktPmZpZHNbaV0gPSB0cmFuc21pdF9hbGxvY2F0ZQorCQkJCSggYWksIDIzMTIsIGkgPj0gTUFYX0ZJRFMgLyAyICk7CisJCX0KKworCXNzbGVlcCgxKTsJCQkvKiBBZGRlZCAxMi83LzAwICovCisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBDSVNDT19FWFQgKi8KKworLyoKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICAgIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIEluIGFkZGl0aW9uOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbi4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgICAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAgICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAgICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgICAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICAgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgICAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICAgIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICAgIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworbW9kdWxlX2luaXQoYWlyb19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhaXJvX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm9fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm9fY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmY1M2FmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyb19jcy5jCkBAIC0wLDAgKzEsNjIyIEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEFpcm9uZXQgZHJpdmVyIGZvciA0NTAwIGFuZCA0ODAwIHNlcmllcyBjYXJkcworCisgICAgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIGJvdGggdGhlIEdQTCB2ZXJzaW9uIDIgYW5kIEJTRCBsaWNlbnNlcy4KKyAgICBFaXRoZXIgbGljZW5zZSBtYXkgYmUgdXNlZC4gIFRoZSByZXNwZWN0aXZlIGxpY2Vuc2VzIGFyZSBmb3VuZCBhdAorICAgIHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorCisgICAgVGhpcyBjb2RlIHdhcyBkZXZlbG9wZWQgYnkgQmVuamFtaW4gUmVlZCA8YnJlZWRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICAgIGluY2x1ZGluZyBwb3J0aW9ucyBvZiB3aGljaCBjb21lIGZyb20gdGhlIEFpcm9uZXQgUEM0NTAwCisgICAgRGV2ZWxvcGVyJ3MgUmVmZXJlbmNlIE1hbnVhbCBhbmQgdXNlZCB3aXRoIHBlcm1pc3Npb24uICBDb3B5cmlnaHQKKyAgICAoQykgMTk5OSBCZW5qYW1pbiBSZWVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gIFBlcm1pc3Npb24gdG8gdXNlCisgICAgY29kZSBpbiB0aGUgRGV2ZWxvcGVyJ3MgbWFudWFsIHdhcyBncmFudGVkIGZvciB0aGlzIGRyaXZlciBieQorICAgIEFpcm9uZXQuCisKKyAgICBJbiBhZGRpdGlvbiB0aGlzIG1vZHVsZSB3YXMgZGVyaXZlZCBmcm9tIGR1bW15X2NzLgorICAgIFRoZSBpbml0aWFsIGRldmVsb3BlciBvZiBkdW1teV9jcyBpcyBEYXZpZCBBLiBIaW5kcworICAgIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uICBQb3J0aW9ucyBjcmVhdGVkIGJ5IERhdmlkIEEuIEhpbmRzCisgICAgYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgIAorICAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpZmRlZiBfX0lOX1BDTUNJQV9QQUNLQUdFX18KKyNpbmNsdWRlIDxwY21jaWEva19jb21wYXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyoKKyAgIEFsbCB0aGUgUENNQ0lBIG1vZHVsZXMgdXNlIFBDTUNJQV9ERUJVRyB0byBjb250cm9sIGRlYnVnZ2luZy4gIElmCisgICB5b3UgZG8gbm90IGRlZmluZSBQQ01DSUFfREVCVUcgYXQgYWxsLCBhbGwgdGhlIGRlYnVnIGNvZGUgd2lsbCBiZQorICAgbGVmdCBvdXQuICBJZiB5b3UgY29tcGlsZSB3aXRoIFBDTUNJQV9ERUJVRz0wLCB0aGUgZGVidWcgY29kZSB3aWxsCisgICBiZSBwcmVzZW50IGJ1dCBkaXNhYmxlZCAtLSBidXQgaXQgY2FuIHRoZW4gYmUgZW5hYmxlZCBmb3Igc3BlY2lmaWMKKyAgIG1vZHVsZXMgYXQgbG9hZCB0aW1lIHdpdGggYSAncGNfZGVidWc9Iycgb3B0aW9uIHRvIGluc21vZC4KKyovCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOworbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOworc3RhdGljIGNoYXIgKnZlcnNpb24gPSAiJFJldmlzaW9uOiAxLjIgJCI7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpOworI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworTU9EVUxFX0FVVEhPUigiQmVuamFtaW4gUmVlZCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBwb3J0IGZvciBDaXNjby9BaXJvbmV0IDgwMi4xMSB3aXJlbGVzcyBldGhlcm5ldCBcCisgICAgICAgICAgICAgICAgICAgY2FyZHMuICBUaGlzIGlzIHRoZSBtb2R1bGUgdGhhdCBsaW5rcyB0aGUgUENNQ0lBIGNhcmQgXAorCQkgICB3aXRoIHRoZSBhaXJvIG1vZHVsZS4iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJBaXJvbmV0IDQ1MDAsIDQ4MDAgYW5kIENpc2NvIDM0MCBQQ01DSUEgY2FyZHMiKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgICBUaGUgZXZlbnQoKSBmdW5jdGlvbiBpcyB0aGlzIGRyaXZlcidzIENhcmQgU2VydmljZXMgZXZlbnQgaGFuZGxlci4KKyAgIEl0IHdpbGwgYmUgY2FsbGVkIGJ5IENhcmQgU2VydmljZXMgd2hlbiBhbiBhcHByb3ByaWF0ZSBjYXJkIHN0YXR1cworICAgZXZlbnQgaXMgcmVjZWl2ZWQuICBUaGUgY29uZmlnKCkgYW5kIHJlbGVhc2UoKSBlbnRyeSBwb2ludHMgYXJlCisgICB1c2VkIHRvIGNvbmZpZ3VyZSBvciByZWxlYXNlIGEgc29ja2V0LCBpbiByZXNwb25zZSB0byBjYXJkCisgICBpbnNlcnRpb24gYW5kIGVqZWN0aW9uIGV2ZW50cy4gIFRoZXkgYXJlIGludm9rZWQgZnJvbSB0aGUgYWlyb19jcworICAgZXZlbnQgaGFuZGxlci4gCisqLworCitzdHJ1Y3QgbmV0X2RldmljZSAqaW5pdF9haXJvX2NhcmQoIGludCwgaW50LCBpbnQsIHN0cnVjdCBkZXZpY2UgKiApOwordm9pZCBzdG9wX2Fpcm9fY2FyZCggc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50ICk7CitpbnQgcmVzZXRfYWlyb19jYXJkKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CisKK3N0YXRpYyB2b2lkIGFpcm9fY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgYWlyb19yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCBhaXJvX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJICAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKKy8qCisgICBUaGUgYXR0YWNoKCkgYW5kIGRldGFjaCgpIGVudHJ5IHBvaW50cyBhcmUgdXNlZCB0byBjcmVhdGUgYW5kIGRlc3Ryb3kKKyAgICJpbnN0YW5jZXMiIG9mIHRoZSBkcml2ZXIsIHdoZXJlIGVhY2ggaW5zdGFuY2UgcmVwcmVzZW50cyBldmVyeXRoaW5nCisgICBuZWVkZWQgdG8gbWFuYWdlIG9uZSBhY3R1YWwgUENNQ0lBIGNhcmQuCisqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqYWlyb19hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBhaXJvX2RldGFjaChkZXZfbGlua190ICopOworCisvKgorICAgWW91J2xsIGFsc28gbmVlZCB0byBwcm90b3R5cGUgYWxsIHRoZSBmdW5jdGlvbnMgdGhhdCB3aWxsIGFjdHVhbGx5CisgICBiZSB1c2VkIHRvIHRhbGsgdG8geW91ciBkZXZpY2UuICBTZWUgJ3BjbWVtX2NzJyBmb3IgYSBnb29kIGV4YW1wbGUKKyAgIG9mIGEgZnVsbHkgc2VsZi1zdWZmaWNpZW50IGRyaXZlcjsgdGhlIG90aGVyIGRyaXZlcnMgcmVseSBtb3JlIG9yCisgICBsZXNzIG9uIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwuCisqLworCisvKgorICAgVGhlIGRldl9pbmZvIHZhcmlhYmxlIGlzIHRoZSAia2V5IiB0aGF0IGlzIHVzZWQgdG8gbWF0Y2ggdXAgdGhpcworICAgZGV2aWNlIGRyaXZlciB3aXRoIGFwcHJvcHJpYXRlIGNhcmRzLCB0aHJvdWdoIHRoZSBjYXJkIGNvbmZpZ3VyYXRpb24KKyAgIGRhdGFiYXNlLgorKi8KKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAiYWlyb19jcyI7CisKKy8qCisgICBBIGxpbmtlZCBsaXN0IG9mICJpbnN0YW5jZXMiIG9mIHRoZSAgYWlyb25ldCBkZXZpY2UuICBFYWNoIGFjdHVhbAorICAgUENNQ0lBIGNhcmQgY29ycmVzcG9uZHMgdG8gb25lIGRldmljZSBpbnN0YW5jZSwgYW5kIGlzIGRlc2NyaWJlZAorICAgYnkgb25lIGRldl9saW5rX3Qgc3RydWN0dXJlIChkZWZpbmVkIGluIGRzLmgpLgorCisgICBZb3UgbWF5IG5vdCB3YW50IHRvIHVzZSBhIGxpbmtlZCBsaXN0IGZvciB0aGlzIC0tIGZvciBleGFtcGxlLCB0aGUKKyAgIG1lbW9yeSBjYXJkIGRyaXZlciB1c2VzIGFuIGFycmF5IG9mIGRldl9saW5rX3QgcG9pbnRlcnMsIHdoZXJlIG1pbm9yCisgICBkZXZpY2UgbnVtYmVycyBhcmUgdXNlZCB0byBkZXJpdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgaW5kZXguCisqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3QgPSBOVUxMOworCisvKgorICAgQSBkZXZfbGlua190IHN0cnVjdHVyZSBoYXMgZmllbGRzIGZvciBtb3N0IHRoaW5ncyB0aGF0IGFyZSBuZWVkZWQKKyAgIHRvIGtlZXAgdHJhY2sgb2YgYSBzb2NrZXQsIGJ1dCB0aGVyZSB3aWxsIHVzdWFsbHkgYmUgc29tZSBkZXZpY2UKKyAgIHNwZWNpZmljIGluZm9ybWF0aW9uIHRoYXQgYWxzbyBuZWVkcyB0byBiZSBrZXB0IHRyYWNrIG9mLiAgVGhlCisgICAncHJpdicgcG9pbnRlciBpbiBhIGRldl9saW5rX3Qgc3RydWN0dXJlIGNhbiBiZSB1c2VkIHRvIHBvaW50IHRvCisgICBhIGRldmljZS1zcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBsaWtlIHRoaXMuCisKKyAgIEEgZHJpdmVyIG5lZWRzIHRvIHByb3ZpZGUgYSBkZXZfbm9kZV90IHN0cnVjdHVyZSBmb3IgZWFjaCBkZXZpY2UKKyAgIG9uIGEgY2FyZC4gIEluIHNvbWUgY2FzZXMsIHRoZXJlIGlzIG9ubHkgb25lIGRldmljZSBwZXIgY2FyZCAoZm9yCisgICBleGFtcGxlLCBldGhlcm5ldCBjYXJkcywgbW9kZW1zKS4gIEluIG90aGVyIGNhc2VzLCB0aGVyZSBtYXkgYmUKKyAgIG1hbnkgYWN0dWFsIG9yIGxvZ2ljYWwgZGV2aWNlcyAoU0NTSSBhZGFwdGVycywgbWVtb3J5IGNhcmRzIHdpdGgKKyAgIG11bHRpcGxlIHBhcnRpdGlvbnMpLiAgVGhlIGRldl9ub2RlX3Qgc3RydWN0dXJlcyBuZWVkIHRvIGJlIGtlcHQKKyAgIGluIGEgbGlua2VkIGxpc3Qgc3RhcnRpbmcgYXQgdGhlICdkZXYnIGZpZWxkIG9mIGEgZGV2X2xpbmtfdAorICAgc3RydWN0dXJlLiAgV2UgYWxsb2NhdGUgdGhlbSBpbiB0aGUgY2FyZCdzIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsCisgICBiZWNhdXNlIHRoZXkgZ2VuZXJhbGx5IHNob3VsZG4ndCBiZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkuCisKKyAgIEluIHRoaXMgY2FzZSwgd2UgYWxzbyBwcm92aWRlIGEgZmxhZyB0byBpbmRpY2F0ZSBpZiBhIGRldmljZSBpcworICAgInN0b3BwZWQiIGR1ZSB0byBhIHBvd2VyIG1hbmFnZW1lbnQgZXZlbnQsIG9yIGNhcmQgZWplY3Rpb24uICBUaGUKKyAgIGRldmljZSBJTyByb3V0aW5lcyBjYW4gdXNlIGEgZmxhZyBsaWtlIHRoaXMgdG8gdGhyb3R0bGUgSU8gdG8gYQorICAgY2FyZCB0aGF0IGlzIG5vdCByZWFkeSB0byBhY2NlcHQgaXQuCisqLworICAgCit0eXBlZGVmIHN0cnVjdCBsb2NhbF9pbmZvX3QgeworCWRldl9ub2RlX3QJbm9kZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZXRoX2RldjsKK30gbG9jYWxfaW5mb190OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIGFpcm9fYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkCisgIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAgCisgIFRoZSBkZXZfbGluayBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseQorICBjb25maWd1cmUgdGhlIGNhcmQgYXQgdGhpcyBwb2ludCAtLSB3ZSB3YWl0IHVudGlsIHdlIHJlY2VpdmUgYQorICBjYXJkIGluc2VydGlvbiBldmVudC4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgZGV2X2xpbmtfdCAqYWlyb19hdHRhY2godm9pZCkKK3sKKwljbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKwlkZXZfbGlua190ICpsaW5rOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJaW50IHJldDsKKwkKKwlERUJVRygwLCAiYWlyb19hdHRhY2goKVxuIik7CisKKwkvKiBJbml0aWFsaXplIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSAqLworCWxpbmsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCksIEdGUF9LRVJORUwpOworCWlmICghbGluaykgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm9fY3M6IG5vIG1lbW9yeSBmb3IgbmV3IGRldmljZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQobGluaywgMCwgc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSk7CisJCisJLyogSW50ZXJydXB0IHNldHVwICovCisJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworCWxpbmstPmlycS5IYW5kbGVyID0gTlVMTDsKKwkKKwkvKgorCSAgR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiBkZWZhdWx0cyBjYW4gZ28gaGVyZS4gIEluIHRoaXMKKwkgIGNsaWVudCwgd2UgYXNzdW1lIHZlcnkgbGl0dGxlLCBhbmQgcmVseSBvbiB0aGUgQ0lTIGZvciBhbG1vc3QKKwkgIGV2ZXJ5dGhpbmcuICBJbiBtb3N0IGNsaWVudHMsIG1hbnkgZGV0YWlscyAoaS5lLiwgbnVtYmVyLCBzaXplcywKKwkgIGFuZCBhdHRyaWJ1dGVzIG9mIElPIHdpbmRvd3MpIGFyZSBmaXhlZCBieSB0aGUgbmF0dXJlIG9mIHRoZQorCSAgZGV2aWNlLCBhbmQgY2FuIGJlIGhhcmQtd2lyZWQgaGVyZS4KKwkqLworCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IDA7CisJbGluay0+Y29uZi5WY2MgPSA1MDsKKwlsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKwkKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgcHJpdmF0ZSBkZXZpY2Utc3BlY2lmaWMgZGF0YSAqLworCWxvY2FsID0ga21hbGxvYyhzaXplb2YobG9jYWxfaW5mb190KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsb2NhbCkgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm9fY3M6IG5vIG1lbW9yeSBmb3IgbmV3IGRldmljZVxuIik7CisJCWtmcmVlIChsaW5rKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChsb2NhbCwgMCwgc2l6ZW9mKGxvY2FsX2luZm9fdCkpOworCWxpbmstPnByaXYgPSBsb2NhbDsKKwkKKwkvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisJZGV2X2xpc3QgPSBsaW5rOworCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisJY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisJY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmFpcm9fZXZlbnQ7CisJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJCWFpcm9fZGV0YWNoKGxpbmspOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJcmV0dXJuIGxpbms7Cit9IC8qIGFpcm9fYXR0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCisgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBhaXJvX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworCWRldl9saW5rX3QgKipsaW5rcDsKKwkKKwlERUJVRygwLCAiYWlyb19kZXRhY2goMHglcClcbiIsIGxpbmspOworCQorCS8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisJZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwkJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKwlpZiAoKmxpbmtwID09IE5VTEwpCisJCXJldHVybjsKKwkKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCQlhaXJvX3JlbGVhc2UobGluayk7CisJCisJaWYgKCAoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYgKSB7CisJCXN0b3BfYWlyb19jYXJkKCAoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYsIDAgKTsKKwl9CisJKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2ID0gTlVMTDsgICAKKwkKKwkvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlpZiAobGluay0+aGFuZGxlKQorCQlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKwkKKwkKKwkKKwkvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBwaWVjZXMgKi8KKwkqbGlua3AgPSBsaW5rLT5uZXh0OworCWlmIChsaW5rLT5wcml2KSB7CisJCWtmcmVlKGxpbmstPnByaXYpOworCX0KKwlrZnJlZShsaW5rKTsKKwkKK30gLyogYWlyb19kZXRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBhaXJvX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorICBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAgZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgYWlyb19jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKwljbGllbnRfaGFuZGxlX3QgaGFuZGxlOworCXR1cGxlX3QgdHVwbGU7CisJY2lzcGFyc2VfdCBwYXJzZTsKKwlsb2NhbF9pbmZvX3QgKmRldjsKKwlpbnQgbGFzdF9mbiwgbGFzdF9yZXQ7CisJdV9jaGFyIGJ1Zls2NF07CisJd2luX3JlcV90IHJlcTsKKwltZW1yZXFfdCBtYXA7CisJCisJaGFuZGxlID0gbGluay0+aGFuZGxlOworCWRldiA9IGxpbmstPnByaXY7CisKKwlERUJVRygwLCAiYWlyb19jb25maWcoMHglcClcbiIsIGxpbmspOworCQorCS8qCisJICBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KKwkgIHJlZ2lzdGVycy4KKwkqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisJdHVwbGUuQXR0cmlidXRlcyA9IDA7CisJdHVwbGUuVHVwbGVEYXRhID0gYnVmOworCXR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKwkKKwkvKiBDb25maWd1cmUgY2FyZCAqLworCWxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisJCisJLyoKKwkgIEluIHRoaXMgbG9vcCwgd2Ugc2NhbiB0aGUgQ0lTIGZvciBjb25maWd1cmF0aW9uIHRhYmxlIGVudHJpZXMsCisJICBlYWNoIG9mIHdoaWNoIGRlc2NyaWJlcyBhIHZhbGlkIGNhcmQgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nCisJICB2b2x0YWdlLCBJTyB3aW5kb3csIG1lbW9yeSB3aW5kb3csIGFuZCBpbnRlcnJ1cHQgc2V0dGluZ3MuCisJICAKKwkgIFdlIG1ha2Ugbm8gYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGNhcmQgdG8gYmUgY29uZmlndXJlZDogd2UgdXNlCisJICBqdXN0IHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgaW4gdGhlIENJUy4gIEluIGFuIGlkZWFsIHdvcmxkLAorCSAgdGhpcyB3b3VsZCB3b3JrIGZvciBhbnkgUENNQ0lBIGNhcmQsIGJ1dCBpdCByZXF1aXJlcyBhIGNvbXBsZXRlCisJICBhbmQgYWNjdXJhdGUgQ0lTLiAgSW4gcHJhY3RpY2UsIGEgZHJpdmVyIHVzdWFsbHkgImtub3dzIiBtb3N0IG9mCisJICB0aGVzZSB0aGluZ3Mgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBDSVMsIGFuZCBtb3N0IGNsaWVudCBkcml2ZXJzCisJICB3aWxsIG9ubHkgdXNlIHRoZSBDSVMgdG8gZmlsbCBpbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGRldGFpbHMuCisJKi8KKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJd2hpbGUgKDEpIHsKKwkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCBkZmx0ID0geyAwIH07CisJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeSk7CisJCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpICE9IDAgfHwKKwkJCQlwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gMCkKKwkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJCisJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkgZGZsdCA9ICpjZmc7CisJCWlmIChjZmctPmluZGV4ID09IDApIGdvdG8gbmV4dF9lbnRyeTsKKwkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7CisJCQorCQkvKiBEb2VzIHRoaXMgY2FyZCBuZWVkIGF1ZGlvIG91dHB1dD8gKi8KKwkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9BVURJTykgeworCQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7CisJCQlsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOworCQl9CisJCQorCQkvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KKwkJLyogIE5vdGUgdGhhdCB0aGUgQ0lTIHZhbHVlcyBuZWVkIHRvIGJlIHJlc2NhbGVkICovCisJCWlmIChjZmctPnZjYy5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVmNjID0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCQllbHNlIGlmIChkZmx0LnZjYy5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVmNjID0gZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCQkKKwkJaWYgKGNmZy0+dnBwMS5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9CisJCQkJY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKKwkJZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQorCQkJbGluay0+Y29uZi5WcHAxID0gbGluay0+Y29uZi5WcHAyID0KKwkJCQlkZmx0LnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCQkKKwkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCisJCWlmIChjZmctPmlycS5JUlFJbmZvMSB8fCBkZmx0LmlycS5JUlFJbmZvMSkKKwkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisJCQorCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KKwkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKKwkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKKwkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKKwkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCisJCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7CisJCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkJCWlmIChpby0+bndpbiA+IDEpIHsKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IGxpbmstPmlvLkF0dHJpYnV0ZXMxOworCQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJCX0KKwkJfQorCQkKKwkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KKwkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSAhPSAwKQorCQkJZ290byBuZXh0X2VudHJ5OworCQkKKwkJLyoKKwkJICBOb3cgc2V0IHVwIGEgY29tbW9uIG1lbW9yeSB3aW5kb3csIGlmIG5lZWRlZC4gIFRoZXJlIGlzIHJvb20KKwkJICBpbiB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgZm9yIG9uZSBtZW1vcnkgd2luZG93IGhhbmRsZSwKKwkJICBidXQgaWYgdGhlIGJhc2UgYWRkcmVzc2VzIG5lZWQgdG8gYmUgc2F2ZWQsIG9yIGlmIG11bHRpcGxlCisJCSAgd2luZG93cyBhcmUgbmVlZGVkLCB0aGUgaW5mbyBzaG91bGQgZ28gaW4gdGhlIHByaXZhdGUgZGF0YQorCQkgIHN0cnVjdHVyZSBmb3IgdGhpcyBkZXZpY2UuCisJCSAgCisJCSAgTm90ZSB0aGF0IHRoZSBtZW1vcnkgd2luZG93IGJhc2UgaXMgYSBwaHlzaWNhbCBhZGRyZXNzLCBhbmQKKwkJICBuZWVkcyB0byBiZSBtYXBwZWQgdG8gdmlydHVhbCBzcGFjZSB3aXRoIGlvcmVtYXAoKSBiZWZvcmUgaXQKKwkJICBpcyB1c2VkLgorCQkqLworCQlpZiAoKGNmZy0+bWVtLm53aW4gPiAwKSB8fCAoZGZsdC5tZW0ubndpbiA+IDApKSB7CisJCQljaXN0cGxfbWVtX3QgKm1lbSA9CisJCQkJKGNmZy0+bWVtLm53aW4pID8gJmNmZy0+bWVtIDogJmRmbHQubWVtOworCQkJcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF8xNnxXSU5fTUVNT1JZX1RZUEVfQ007CisJCQlyZXEuQmFzZSA9IG1lbS0+d2luWzBdLmhvc3RfYWRkcjsKKwkJCXJlcS5TaXplID0gbWVtLT53aW5bMF0ubGVuOworCQkJcmVxLkFjY2Vzc1NwZWVkID0gMDsKKwkJCWlmIChwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbikgIT0gMCkKKwkJCQlnb3RvIG5leHRfZW50cnk7CisJCQltYXAuUGFnZSA9IDA7IG1hcC5DYXJkT2Zmc2V0ID0gbWVtLT53aW5bMF0uY2FyZF9hZGRyOworCQkJaWYgKHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWFwKSAhPSAwKQorCQkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJfQorCQkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCisJCWJyZWFrOworCQkKKwluZXh0X2VudHJ5OgorCQlDU19DSEVDSyhHZXROZXh0VHVwbGUsIHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCX0KKwkKKyAgICAvKgorICAgICAgQWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhc3NpZ24gYQorICAgICAgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LCB1bmxlc3MgdGhlICdIYW5kbGVyJyBtZW1iZXIgb2YgdGhlCisgICAgICBpcnEgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLgorICAgICovCisJaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKKwkJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOworCQorCS8qCisJICBUaGlzIGFjdHVhbGx5IGNvbmZpZ3VyZXMgdGhlIFBDTUNJQSBzb2NrZXQgLS0gc2V0dGluZyB1cAorCSAgdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcsIGFuZCBwdXR0aW5nIHRoZQorCSAgY2FyZCBhbmQgaG9zdCBpbnRlcmZhY2UgaW50byAiTWVtb3J5IGFuZCBJTyIgbW9kZS4KKwkqLworCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKwkoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYgPSAKKwkJaW5pdF9haXJvX2NhcmQoIGxpbmstPmlycS5Bc3NpZ25lZElSUSwKKwkJCQlsaW5rLT5pby5CYXNlUG9ydDEsIDEsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkgKTsKKwlpZiAoISgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldikgZ290byBjc19mYWlsZWQ7CisJCisJLyoKKwkgIEF0IHRoaXMgcG9pbnQsIHRoZSBkZXZfbm9kZV90IHN0cnVjdHVyZShzKSBuZWVkIHRvIGJlCisJICBpbml0aWFsaXplZCBhbmQgYXJyYW5nZWQgaW4gYSBsaW5rZWQgbGlzdCBhdCBsaW5rLT5kZXYuCisJKi8KKwlzdHJjcHkoZGV2LT5ub2RlLmRldl9uYW1lLCAoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYtPm5hbWUgKTsKKwlkZXYtPm5vZGUubWFqb3IgPSBkZXYtPm5vZGUubWlub3IgPSAwOworCWxpbmstPmRldiA9ICZkZXYtPm5vZGU7CisJCisJLyogRmluYWxseSwgcmVwb3J0IHdoYXQgd2UndmUgZG9uZSAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbmRleCAweCUwMng6IFZjYyAlZC4lZCIsCisJICAgICAgIGRldi0+bm9kZS5kZXZfbmFtZSwgbGluay0+Y29uZi5Db25maWdJbmRleCwKKwkgICAgICAgbGluay0+Y29uZi5WY2MvMTAsIGxpbmstPmNvbmYuVmNjJTEwKTsKKwlpZiAobGluay0+Y29uZi5WcHAxKQorCQlwcmludGsoIiwgVnBwICVkLiVkIiwgbGluay0+Y29uZi5WcHAxLzEwLCBsaW5rLT5jb25mLlZwcDElMTApOworCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCisJCXByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCisJCXByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAorCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQxK2xpbmstPmlvLk51bVBvcnRzMS0xKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMyKQorCQlwcmludGsoIiAmIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDIsCisJCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDIrbGluay0+aW8uTnVtUG9ydHMyLTEpOworCWlmIChsaW5rLT53aW4pCisJCXByaW50aygiLCBtZW0gMHglMDZseC0weCUwNmx4IiwgcmVxLkJhc2UsCisJCSAgICAgICByZXEuQmFzZStyZXEuU2l6ZS0xKTsKKwlwcmludGsoIlxuIik7CisJCisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKwlyZXR1cm47CisJCisgY3NfZmFpbGVkOgorCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworCWFpcm9fcmVsZWFzZShsaW5rKTsKKwkKK30gLyogYWlyb19jb25maWcgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgYWlyb19yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZQorICBkZXZpY2UsIGFuZCByZWxlYXNlIHRoZSBQQ01DSUEgY29uZmlndXJhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKKyAgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgYWlyb19yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisJREVCVUcoMCwgImFpcm9fcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisJCisJLyogVW5saW5rIHRoZSBkZXZpY2UgY2hhaW4gKi8KKwlsaW5rLT5kZXYgPSBOVUxMOworCQorCS8qCisJICBJbiBhIG5vcm1hbCBkcml2ZXIsIGFkZGl0aW9uYWwgY29kZSBtYXkgYmUgbmVlZGVkIHRvIHJlbGVhc2UKKwkgIG90aGVyIGtlcm5lbCBkYXRhIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV2aWNlLiAKKwkqLworCQorCS8qIERvbid0IGJvdGhlciBjaGVja2luZyB0byBzZWUgaWYgdGhlc2Ugc3VjY2VlZCBvciBub3QgKi8KKwlpZiAobGluay0+d2luKQorCQlwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKwlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKKwkJcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCWlmIChsaW5rLT5pcnEuQXNzaWduZWRJUlEpCisJCXBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuCisKKyAgV2hlbiBhIENBUkRfUkVNT1ZBTCBldmVudCBpcyByZWNlaXZlZCwgd2UgaW1tZWRpYXRlbHkgc2V0IGEKKyAgcHJpdmF0ZSBmbGFnIHRvIGJsb2NrIGZ1dHVyZSBhY2Nlc3NlcyB0byB0aGlzIGRldmljZS4gIEFsbCB0aGUKKyAgZnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgYWNjZXNzIHRoZSBkZXZpY2Ugc2hvdWxkIGNoZWNrIHRoaXMgZmxhZworICB0byBtYWtlIHN1cmUgdGhlIGNhcmQgaXMgc3RpbGwgcHJlc2VudC4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGFpcm9fZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisJZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworCWxvY2FsX2luZm9fdCAqbG9jYWwgPSBsaW5rLT5wcml2OworCQorCURFQlVHKDEsICJhaXJvX2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKwkKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChsb2NhbC0+ZXRoX2Rldik7CisJCQlhaXJvX3JlbGVhc2UobGluayk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJCWFpcm9fY29uZmlnKGxpbmspOworCQlicmVhazsKKwljYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGxvY2FsLT5ldGhfZGV2KTsKKwkJCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwkJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCXBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJCQlyZXNldF9haXJvX2NhcmQobG9jYWwtPmV0aF9kZXYpOworCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChsb2NhbC0+ZXRoX2Rldik7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfSAvKiBhaXJvX2V2ZW50ICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBhaXJvX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gImFpcm9fY3MiLAorCX0sCisJLmF0dGFjaAkJPSBhaXJvX2F0dGFjaCwKKwkuZGV0YWNoCQk9IGFpcm9fZGV0YWNoLAorfTsKKworc3RhdGljIGludCBhaXJvX2NzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmYWlyb19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBhaXJvX2NzX2NsZWFudXAodm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJmFpcm9fZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKKy8qCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAgICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBJbiBhZGRpdGlvbjoKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICAgIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgICAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgICAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICAgIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAgIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAgICBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAgICBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gICAgCisqLworCittb2R1bGVfaW5pdChhaXJvX2NzX2luaXQpOworbW9kdWxlX2V4aXQoYWlyb19jc19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpcnBvcnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpcnBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWRjMmExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlycG9ydC5jCkBAIC0wLDAgKzEsMzA0IEBACisvKiBhaXJwb3J0LmMKKyAqCisgKiBBIGRyaXZlciBmb3IgIkhlcm1lcyIgY2hpcHNldCBiYXNlZCBBcHBsZSBBaXJwb3J0IHdpcmVsZXNzCisgKiBjYXJkLgorICoKKyAqIENvcHlyaWdodCBub3RpY2UgJiByZWxlYXNlIG5vdGVzIGluIGZpbGUgb3Jpbm9jby5jCisgKiAKKyAqIE5vdGUgc3BlY2lmaWMgdG8gYWlycG9ydCBzdHViOgorICogCisgKiAgMC4wNSA6IGZpcnN0IHZlcnNpb24gb2YgdGhlIG5ldyBzcGxpdCBkcml2ZXIKKyAqICAwLjA2IDogZml4IHBvc3NpYmxlIGhhbmcgb24gcG93ZXJ1cCwgYWRkIHNsZWVwIHN1cHBvcnQKKyAqLworCisjZGVmaW5lIERSSVZFUl9OQU1FICJhaXJwb3J0IgorI2RlZmluZSBQRlggRFJJVkVSX05BTUUgIjogIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgIm9yaW5vY28uaCIKKworI2RlZmluZSBBSVJQT1JUX0lPX0xFTgkoMHgxMDAwKQkvKiBvbmUgcGFnZSAqLworCitzdHJ1Y3QgYWlycG9ydCB7CisJc3RydWN0IG1hY2lvX2RldiAqbWRldjsKKwl2b2lkIF9faW9tZW0gKnZhZGRyOworCWludCBpcnFfcmVxdWVzdGVkOworCWludCBuZGV2X3JlZ2lzdGVyZWQ7Cit9OworCitzdGF0aWMgaW50CithaXJwb3J0X3N1c3BlbmQoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgdTMyIHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJm1kZXYtPm9mZGV2LmRldik7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBaXJwb3J0IGVudGVyaW5nIHNsZWVwIG1vZGVcbiIsIGRldi0+bmFtZSk7CisKKwllcnIgPSBvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGh3X3VuYXZhaWxhYmxlIG9uIFBCT09LX1NMRUVQX05PV1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWVyciA9IF9fb3Jpbm9jb19kb3duKGRldik7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBCT09LX1NMRUVQX05PVzogRXJyb3IgJWQgZG93bmluZyBpbnRlcmZhY2VcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwlwcml2LT5od191bmF2YWlsYWJsZSsrOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9BSVJQT1JUX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUobWRldiksIDAsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FpcnBvcnRfcmVzdW1lKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YSgmbWRldi0+b2ZkZXYuZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEFpcnBvcnQgd2FraW5nIHVwXG4iLCBkZXYtPm5hbWUpOworCisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfQUlSUE9SVF9FTkFCTEUsIG1hY2lvX2dldF9vZl9ub2RlKG1kZXYpLCAwLCAxKTsKKwltc2xlZXAoMjAwKTsKKworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCisJZXJyID0gb3Jpbm9jb19yZWluaXRfZmlybXdhcmUoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHJlLWluaXRpYWxpemluZyBmaXJtd2FyZSBvbiBQQk9PS19XQUtFXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCisJcHJpdi0+aHdfdW5hdmFpbGFibGUtLTsKKworCWlmIChwcml2LT5vcGVuICYmICghIHByaXYtPmh3X3VuYXZhaWxhYmxlKSkgeworCQllcnIgPSBfX29yaW5vY29fdXAoZGV2KTsKKwkJaWYgKGVycikKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHJlc3RhcnRpbmcgY2FyZCBvbiBQQk9PS19XQUtFXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwl9CisKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CithaXJwb3J0X2RldGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJm1kZXYtPm9mZGV2LmRldik7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFpcnBvcnQgKmNhcmQgPSBwcml2LT5jYXJkOworCisJaWYgKGNhcmQtPm5kZXZfcmVnaXN0ZXJlZCkKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwljYXJkLT5uZGV2X3JlZ2lzdGVyZWQgPSAwOworCisJaWYgKGNhcmQtPmlycV9yZXF1ZXN0ZWQpCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCWNhcmQtPmlycV9yZXF1ZXN0ZWQgPSAwOworCisJaWYgKGNhcmQtPnZhZGRyKQorCQlpb3VubWFwKGNhcmQtPnZhZGRyKTsKKwljYXJkLT52YWRkciA9IE5VTEw7CisKKwltYWNpb19yZWxlYXNlX3Jlc291cmNlKG1kZXYsIDApOworCisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfQUlSUE9SVF9FTkFCTEUsIG1hY2lvX2dldF9vZl9ub2RlKG1kZXYpLCAwLCAwKTsKKwlzc2xlZXAoMSk7CisKKwltYWNpb19zZXRfZHJ2ZGF0YShtZGV2LCBOVUxMKTsKKwlmcmVlX29yaW5vY29kZXYoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpcnBvcnRfaGFyZF9yZXNldChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCS8qIEl0IHdvdWxkIGJlIG5pY2UgdG8gcG93ZXIgY3ljbGUgdGhlIEFpcnBvcnQgZm9yIGEgcmVhbCBoYXJkCisJICogcmVzZXQsIGJ1dCBmb3Igc29tZSByZWFzb24gYWx0aG91Z2ggaXQgYXBwZWFycyB0bworCSAqIHJlLWluaXRpYWxpemUgcHJvcGVybHksIGl0IGZhbGxzIGluIGEgc2NyZWFtaW5nIGhlYXAKKwkgKiBzaG9ydGx5IGFmdGVyd2FyZHMuICovCisjaWYgMAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5uZGV2OworCXN0cnVjdCBhaXJwb3J0ICpjYXJkID0gcHJpdi0+Y2FyZDsKKworCS8qIFZpdGFsbHkgaW1wb3J0YW50LiAgSWYgd2UgZG9uJ3QgZG8gdGhpcyBpdCBzZWVtcyB3ZSBnZXQgYW4KKwkgKiBpbnRlcnJ1cHQgc29tZXdoZXJlIGR1cmluZyB0aGUgcG93ZXIgY3ljbGUsIHNpbmNlCisJICogaHdfdW5hdmFpbGFibGUgaXMgYWxyZWFkeSBzZXQgaXQgZG9lc24ndCBnZXQgQUNLZWQsIHdlIGdldAorCSAqIGludG8gYW4gaW50ZXJydXB0IGxvb3AgYW5kIHRoZSB0aGUgUE1VIGRlY2lkZXMgdG8gdHVybiB1cworCSAqIG9mZi4gKi8KKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisKKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9BSVJQT1JUX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUoY2FyZC0+bWRldiksIDAsIDApOworCXNzbGVlcCgxKTsKKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9BSVJQT1JUX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUoY2FyZC0+bWRldiksIDAsIDEpOworCXNzbGVlcCgxKTsKKworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCXNzbGVlcCgxKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FpcnBvcnRfYXR0YWNoKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBhaXJwb3J0ICpjYXJkOworCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyOworCWhlcm1lc190ICpodzsKKworCWlmIChtYWNpb19yZXNvdXJjZV9jb3VudChtZGV2KSA8IDEgfHwgbWFjaW9faXJxX2NvdW50KG1kZXYpIDwgMSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJXcm9uZyBpbnRlcnJ1cHQvYWRkcmVzc2VzIGluIE9GIHRyZWVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgcHJpdmF0ZSBkZXZpY2Utc3BlY2lmaWMgZGF0YSAqLworCWRldiA9IGFsbG9jX29yaW5vY29kZXYoc2l6ZW9mKCpjYXJkKSwgYWlycG9ydF9oYXJkX3Jlc2V0KTsKKwlpZiAoISBkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNhcmQgPSBwcml2LT5jYXJkOworCisJaHcgPSAmcHJpdi0+aHc7CisJY2FyZC0+bWRldiA9IG1kZXY7CisKKwlpZiAobWFjaW9fcmVxdWVzdF9yZXNvdXJjZShtZGV2LCAwLCAiYWlycG9ydCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbid0IHJlcXVlc3QgSU8gcmVzb3VyY2UgIVxuIik7CisJCWZyZWVfb3Jpbm9jb2RldihkZXYpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZtZGV2LT5vZmRldi5kZXYpOworCisJbWFjaW9fc2V0X2RydmRhdGEobWRldiwgZGV2KTsKKworCS8qIFNldHVwIGludGVycnVwdHMgJiBiYXNlIGFkZHJlc3MgKi8KKwlkZXYtPmlycSA9IG1hY2lvX2lycShtZGV2LCAwKTsKKwlwaHlzX2FkZHIgPSBtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAwKTsgIC8qIFBoeXNpY2FsIGFkZHJlc3MgKi8KKwlwcmludGsoS0VSTl9ERUJVRyBQRlggIlBoeXNpY2FsIGFkZHJlc3MgJWx4XG4iLCBwaHlzX2FkZHIpOworCWRldi0+YmFzZV9hZGRyID0gcGh5c19hZGRyOworCWNhcmQtPnZhZGRyID0gaW9yZW1hcChwaHlzX2FkZHIsIEFJUlBPUlRfSU9fTEVOKTsKKwlpZiAoIWNhcmQtPnZhZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImlvcmVtYXAoKSBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwloZXJtZXNfc3RydWN0X2luaXQoaHcsIGNhcmQtPnZhZGRyLCBIRVJNRVNfMTZCSVRfUkVHU1BBQ0lORyk7CisJCQorCS8qIFBvd2VyIHVwIGNhcmQgKi8KKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9BSVJQT1JUX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUobWRldiksIDAsIDEpOworCXNzbGVlcCgxKTsKKworCS8qIFJlc2V0IGl0IGJlZm9yZSB3ZSBnZXQgdGhlIGludGVycnVwdCAqLworCWhlcm1lc19pbml0KGh3KTsKKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgb3Jpbm9jb19pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZG4ndCBnZXQgSVJRICVkXG4iLCBkZXYtPmlycSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwljYXJkLT5pcnFfcmVxdWVzdGVkID0gMTsKKworCS8qIFRlbGwgdGhlIHN0YWNrIHdlIGV4aXN0ICovCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiQ2FyZCByZWdpc3RlcmVkIGZvciBpbnRlcmZhY2UgJXNcbiIsIGRldi0+bmFtZSk7CisJY2FyZC0+bmRldl9yZWdpc3RlcmVkID0gMTsKKwlyZXR1cm4gMDsKKyBmYWlsZWQ6CisJYWlycG9ydF9kZXRhY2gobWRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CQkJCS8qIGFpcnBvcnRfYXR0YWNoICovCisKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSBEUklWRVJfTkFNRSAiICIgRFJJVkVSX1ZFUlNJT04KKwkiIChCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+KSI7CitNT0RVTEVfQVVUSE9SKCJCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIEFwcGxlIEFpcnBvcnQgd2lyZWxlc3MgY2FyZC4iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKKworc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBhaXJwb3J0X21hdGNoW10gPSAKK3sKKwl7CisJLm5hbWUgCQk9ICJyYWRpbyIsCisJLnR5cGUJCT0gT0ZfQU5ZX01BVENILAorCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENICisJfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFjaW9fZHJpdmVyIGFpcnBvcnRfZHJpdmVyID0gCit7CisJLm5hbWUgCQk9IERSSVZFUl9OQU1FLAorCS5tYXRjaF90YWJsZQk9IGFpcnBvcnRfbWF0Y2gsCisJLnByb2JlCQk9IGFpcnBvcnRfYXR0YWNoLAorCS5yZW1vdmUJCT0gYWlycG9ydF9kZXRhY2gsCisJLnN1c3BlbmQJPSBhaXJwb3J0X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhaXJwb3J0X3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0Citpbml0X2FpcnBvcnQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIHZlcnNpb24pOworCisJcmV0dXJuIG1hY2lvX3JlZ2lzdGVyX2RyaXZlcigmYWlycG9ydF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4aXRfYWlycG9ydCh2b2lkKQoreworCXJldHVybiBtYWNpb191bnJlZ2lzdGVyX2RyaXZlcigmYWlycG9ydF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X2FpcnBvcnQpOworbW9kdWxlX2V4aXQoZXhpdF9haXJwb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLW1haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLW1haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjMwNGM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLW1haW4uYwpAQCAtMCwwICsxLDE4OTYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3IEN1bGxlbiBKZW5uaW5ncworICogIENvcHlyaWdodCAoQykgMTk5OCBFbG1lciBKb2FuZGl1LCBlbG1lckB5bGVudXJtZS5lZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMKKyAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBBcmxhbiA2NTUgY2FyZCBtYWRlIGJ5IEFpcm9uZXQKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiYXJsYW4uaCIKKworI2lmIEJJVFNfUEVSX0xPTkcgIT0gMzIKKyMgIGVycm9yIEZJWE1FOiB0aGlzIGRyaXZlciByZXF1aXJlcyBhIDMyLWJpdCBwbGF0Zm9ybQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICphcmxhbl92ZXJzaW9uID0gIkMuSmVubmlncyA5NyAmIEVsbWVyLkpvYW5kaUB1dC5lZSAgT2N0Jzk4LCBodHRwOi8vd3d3LnlsZW51cm1lLmVlL35lbG1lci82NTUvIjsKKworc3RydWN0IG5ldF9kZXZpY2UgKmFybGFuX2RldmljZVtNQVhfQVJMQU5TXTsKKworc3RhdGljIGludCBTSUQgPSBTSURVTktOT1dOOworc3RhdGljIGludCByYWRpb05vZGVJZCA9IHJhZGlvTm9kZUlkVU5LTk9XTjsKK3N0YXRpYyBjaGFyIGVuY3J5cHRpb25LZXlbMTJdID0geydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnfTsKK2ludCBhcmxhbl9kZWJ1ZyA9IGRlYnVnVU5LTk9XTjsKK3N0YXRpYyBpbnQgc3ByZWFkaW5nQ29kZSA9IHNwcmVhZGluZ0NvZGVVTktOT1dOOworc3RhdGljIGludCBjaGFubmVsTnVtYmVyID0gY2hhbm5lbE51bWJlclVOS05PV047CitzdGF0aWMgaW50IGNoYW5uZWxTZXQgPSBjaGFubmVsU2V0VU5LTk9XTjsKK3N0YXRpYyBpbnQgc3lzdGVtSWQgPSBzeXN0ZW1JZFVOS05PV047CitzdGF0aWMgaW50IHJlZ2lzdHJhdGlvbk1vZGUgPSByZWdpc3RyYXRpb25Nb2RlVU5LTk9XTjsKK3N0YXRpYyBpbnQga2V5U3RhcnQ7CitzdGF0aWMgaW50IHR4X2RlbGF5X21zOworc3RhdGljIGludCByZXRyaWVzID0gNTsKK3N0YXRpYyBpbnQgdHhfcXVldWVfbGVuID0gMTsKK3N0YXRpYyBpbnQgYXJsYW5fRUVQUk9NX2JhZDsKKworI2lmZGVmIEFSTEFOX0RFQlVHR0lORworCitzdGF0aWMgaW50IGFybGFuX2VudHJ5X2RlYnVnOworc3RhdGljIGludCBhcmxhbl9leGl0X2RlYnVnOworc3RhdGljIGludCB0ZXN0TWVtb3J5ID0gdGVzdE1lbW9yeVVOS05PV047CitzdGF0aWMgaW50IGlycSA9IGlycVVOS05PV047CitzdGF0aWMgaW50IHR4U2NyYW1ibGVkID0gMTsKK3N0YXRpYyBpbnQgbWRlYnVnOworCittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1kZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh0ZXN0TWVtb3J5LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGFybGFuX2VudHJ5X2RlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGFybGFuX2V4aXRfZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odHhTY3JhbWJsZWQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIih1bnVzZWQpIik7CitNT0RVTEVfUEFSTV9ERVNDKHRlc3RNZW1vcnksICIodW51c2VkKSIpOworTU9EVUxFX1BBUk1fREVTQyhtZGVidWcsICJBcmxhbiBtdWx0aWNhc3QgZGVidWdnaW5nICgwLTEpIik7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKGFybGFuX2RlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNwcmVhZGluZ0NvZGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY2hhbm5lbE51bWJlciwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjaGFubmVsU2V0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHN5c3RlbUlkLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJlZ2lzdHJhdGlvbk1vZGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocmFkaW9Ob2RlSWQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oU0lELCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGtleVN0YXJ0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHR4X2RlbGF5X21zLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJldHJpZXMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odHhfcXVldWVfbGVuLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGFybGFuX0VFUFJPTV9iYWQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFybGFuX2RlYnVnLCAiQXJsYW4gZGVidWcgZW5hYmxlICgwLTEpIik7CitNT0RVTEVfUEFSTV9ERVNDKHJldHJpZXMsICJBcmxhbiBtYXhpbXVtIHBhY2tldCByZXRyYW5zbWlzaW9ucyIpOworI2lmZGVmIEFSTEFOX0VOVFJZX0VYSVRfREVCVUdHSU5HCitNT0RVTEVfUEFSTV9ERVNDKGFybGFuX2VudHJ5X2RlYnVnLCAiQXJsYW4gZHJpdmVyIGZ1bmN0aW9uIGVudHJ5IGRlYnVnZ2luZyIpOworTU9EVUxFX1BBUk1fREVTQyhhcmxhbl9leGl0X2RlYnVnLCAiQXJsYW4gZHJpdmVyIGZ1bmN0aW9uIGV4aXQgZGVidWdnaW5nIik7CitNT0RVTEVfUEFSTV9ERVNDKGFybGFuX2VudHJ5X2FuZF9leGl0X2RlYnVnLCAiQXJsYW4gZHJpdmVyIGZ1bmN0aW9uIGVudHJ5IGFuZCBleGl0IGRlYnVnZ2luZyIpOworI2Vsc2UKK01PRFVMRV9QQVJNX0RFU0MoYXJsYW5fZW50cnlfZGVidWcsICIoaWdub3JlZCkiKTsKK01PRFVMRV9QQVJNX0RFU0MoYXJsYW5fZXhpdF9kZWJ1ZywgIihpZ25vcmVkKSIpOworTU9EVUxFX1BBUk1fREVTQyhhcmxhbl9lbnRyeV9hbmRfZXhpdF9kZWJ1ZywgIihpZ25vcmVkKSIpOworI2VuZGlmCisKK3N0cnVjdCBhcmxhbl9jb25mX3N0cnUgYXJsYW5fY29uZltNQVhfQVJMQU5TXTsKK3N0YXRpYyBpbnQgYXJsYW5zX2ZvdW5kOworCitzdGF0aWMgIGludCAJYXJsYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyAgaW50IAlhcmxhbl90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyAgaXJxcmV0dXJuX3QgYXJsYW5faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljICBpbnQgCWFybGFuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCisJCWFybGFuX3N0YXRpc3RpY3MJCShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyAgdm9pZCAJYXJsYW5fc2V0X211bHRpY2FzdAkJKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljICBpbnQgCWFybGFuX2h3X3R4CQkJKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCApOworc3RhdGljICBpbnQJYXJsYW5faHdfY29uZmlnCQkJKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KTsKK3N0YXRpYyAgdm9pZCAJYXJsYW5fdHhfZG9uZV9pbnRlcnJ1cHQJCShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IHN0YXR1cyk7CitzdGF0aWMgIHZvaWQJYXJsYW5fcnhfaW50ZXJydXB0CQkoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHVfY2hhciByeFN0YXR1cywgdV9zaG9ydCwgdV9zaG9ydCk7CitzdGF0aWMgIHZvaWQJYXJsYW5fcHJvY2Vzc19pbnRlcnJ1cHQJCShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldik7CitzdGF0aWMJdm9pZAlhcmxhbl90eF90aW1lb3V0CQkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbmxpbmUgbG9uZyB1czJ0aWNrcyhpbnQgdXMpCit7CisJcmV0dXJuIHVzICogKDEwMDAwMDAgLyBIWik7Cit9CisKKworI2lmZGVmIEFSTEFOX0VOVFJZX0VYSVRfREVCVUdHSU5HCisjZGVmaW5lIEFSTEFOX0RFQlVHX0VOVFJZKG5hbWUpIFwKKwl7XAorCXN0cnVjdCB0aW1ldmFsIHRpbWV2O1wKKwlkb19nZXR0aW1lb2ZkYXkoJnRpbWV2KTtcCisJCWlmIChhcmxhbl9lbnRyeV9kZWJ1ZyB8fCBhcmxhbl9lbnRyeV9hbmRfZXhpdF9kZWJ1ZylcCisJCQlwcmludGsoIi0tLT4+PiIgbmFtZSAiICVsZCAiICJcbiIsKChsb25nIGludCkgdGltZXYudHZfc2VjICogMTAwMDAwMCArIHRpbWV2LnR2X3VzZWMpKTtcCisJfQorI2RlZmluZSBBUkxBTl9ERUJVR19FWElUKG5hbWUpIFwKKwl7XAorCXN0cnVjdCB0aW1ldmFsIHRpbWV2O1wKKwlkb19nZXR0aW1lb2ZkYXkoJnRpbWV2KTtcCisJCWlmIChhcmxhbl9leGl0X2RlYnVnIHx8IGFybGFuX2VudHJ5X2FuZF9leGl0X2RlYnVnKVwKKwkJCXByaW50aygiPDw8LS0tIiBuYW1lICIgJWxkICIgIlxuIiwoKGxvbmcgaW50KSB0aW1ldi50dl9zZWMgKiAxMDAwMDAwICsgdGltZXYudHZfdXNlYykgKTtcCisJfQorI2Vsc2UKKyNkZWZpbmUgQVJMQU5fREVCVUdfRU5UUlkobmFtZSkKKyNkZWZpbmUgQVJMQU5fREVCVUdfRVhJVChuYW1lKQorI2VuZGlmCisKKworI2RlZmluZSBhcmxhbl9pbnRlcnJ1cHRfYWNrKGRldilcCisgICAgICAgIGNsZWFyQ2xlYXJJbnRlcnJ1cHQoZGV2KTtcCisgICAgICAgIHNldENsZWFySW50ZXJydXB0KGRldik7CisKK3N0YXRpYyBpbmxpbmUgaW50IGFybGFuX2Ryb3BfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwlpZiAocHJpdi0+Q29uZi0+dHhfZGVsYXlfbXMpCisJeworCQlwcml2LT50eF9kb25lX2RlbGF5ZWQgPSBqaWZmaWVzICsgcHJpdi0+Q29uZi0+dHhfZGVsYXlfbXMgKiBIWiAvIDEwMDAgKyAxOworCX0KKwllbHNlCisJeworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9UWDsKKwkJVFhIRUFEKGRldikub2Zmc2V0ID0gMDsKKwkJVFhUQUlMKGRldikub2Zmc2V0ID0gMDsKKwkJcHJpdi0+dHhMYXN0ID0gMDsKKwkJcHJpdi0+YmFkID0gMDsKKwkJaWYgKCFwcml2LT51bmRlcl9yZXNldCAmJiAhcHJpdi0+dW5kZXJfY29uZmlnKQorCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKworaW50IGFybGFuX2NvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvbW1hbmRfcCkKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwlzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1ICpjb25mID0gcHJpdi0+Q29uZjsKKwlpbnQgdWRlbGF5ZWQgPSAwOworCWludCBpID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX2NvbW1hbmQiKTsKKworCWlmIChwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwpCisJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IDE7CisKKwlpZiAoYXJsYW5fZGVidWcgJiBBUkxBTl9ERUJVR19DSEFJTl9MT0NLUykKKwkJcHJpbnRrKEtFUk5fREVCVUcgImFybGFuX2NvbW1hbmQsICVseCBjb21tYW5kQnl0ZSAleCB3YWl0aW5nICVseCBpbmNvbWluZyAleCBcbiIsCisJCWppZmZpZXMsIFJFQURTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSksCisJCSAgICAgICBwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzaywgY29tbWFuZF9wKTsKKworCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IGNvbW1hbmRfcDsKKworCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfUkVTRVQpCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHByaXYtPmxhc3RSZXNldCArIDUgKiBIWikpCisJCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9SRVNFVDsKKworCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfSU5UX0FDSykKKwl7CisJCWFybGFuX2ludGVycnVwdF9hY2soZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfSU5UX0FDSzsKKwl9CisJaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9JTlRfRU5BQkxFKQorCXsKKwkJc2V0SW50ZXJydXB0RW5hYmxlKGRldik7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX0lOVF9FTkFCTEU7CisJfQorCisJLyogQ2FyZCBhY2Nlc3Mgc2VyaWFsaXppbmcgbG9jayAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBjYXJkcyBzdGF0dXMgYW5kIHdhaXRpbmcgKi8KKworCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIChBUkxBTl9DT01NQU5EX0xPTkdfV0FJVF9OT1cgfCBBUkxBTl9DT01NQU5EX1dBSVRfTk9XKSkKKwl7CisJCXdoaWxlIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIChBUkxBTl9DT01NQU5EX0xPTkdfV0FJVF9OT1cgfCBBUkxBTl9DT01NQU5EX1dBSVRfTk9XKSkKKwkJeworCQkJaWYgKFJFQURTSE1CKGFybGFuLT5yZXNldEZsYWcpIHx8CisJCQkJUkVBRFNITUIoYXJsYW4tPmNvbW1hbmRCeXRlKSkJLyogfHwgCisJCQkJCQkJCSAgIChyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiBBUkxBTl9BQ0NFU1MpKQorCQkJCQkJCQkgKi8KKwkJCQl1ZGVsYXkoNDApOworCQkJZWxzZQorCQkJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH4oQVJMQU5fQ09NTUFORF9MT05HX1dBSVRfTk9XIHwgQVJMQU5fQ09NTUFORF9XQUlUX05PVyk7CisKKwkJCXVkZWxheWVkKys7CisKKwkJCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfTE9OR19XQUlUX05PVykKKwkJCXsKKwkJCQlpZiAodWRlbGF5ZWQgKiA0MCA+IDEwMDAwMDApCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzIGxvbmcgd2FpdCB0b28gbG9uZyBcbiIsIGRldi0+bmFtZSk7CisJCQkJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfUkVTRVQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9XQUlUX05PVykKKwkJCXsKKwkJCQlpZiAodWRlbGF5ZWQgKiA0MCA+IDEwMDApCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzIHNob3J0IHdhaXQgdG9vIGxvbmcgXG4iLCBkZXYtPm5hbWUpOworCQkJCQlnb3RvIGJhZF9lbmQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCWkgPSAwOworCQl3aGlsZSAoKFJFQURTSE1CKGFybGFuLT5yZXNldEZsYWcpIHx8CisJCQlSRUFEU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUpKSAmJgorCQkJY29uZi0+cHJlX0NvbW1hbmRfV2FpdCA+IChpKyspICogMTApCisJCQl1ZGVsYXkoMTApOworCisKKwkJaWYgKChSRUFEU0hNQihhcmxhbi0+cmVzZXRGbGFnKSB8fAorCQkJUkVBRFNITUIoYXJsYW4tPmNvbW1hbmRCeXRlKSkgJiYKKwkJCSEocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1JFU0VUKSkKKwkJeworCQkJZ290byBjYXJkX2J1c3lfZW5kOworCQl9CisJfQorCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfUkVTRVQpCisJCXByaXYtPnVuZGVyX3Jlc2V0ID0gMTsKKwlpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX0NPTkYpCisJCXByaXYtPnVuZGVyX2NvbmZpZyA9IDE7CisKKwkvKiBJc3N1aW5nIGNvbW1hbmQgKi8KKwlhcmxhbl9sb2NrX2NhcmRfYWNjZXNzKGRldik7CisJaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9QT1dFUlVQKQorCXsKKwkvLyAgICAgaWYgKHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSAmIChBUkxBTl9BQ0NFU1MgJiYgQVJMQU5fUE9XRVIpKQorCQlzZXRQb3dlck9uKGRldik7CisJCWFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfUE9XRVJVUDsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9SRVNFVDsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gSFogLyAxMDsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX0FDVElWQVRFKQorCXsKKwkJV1JJVEVTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSwgQVJMQU5fQ09NX0FDVElWQVRFKTsKKwkJYXJsYW5faW50ZXJydXB0X2xhbmNwdShkZXYpOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9BQ1RJVkFURTsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gSFogLyAxMDsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1JYX0FCT1JUKQorCXsKKwkJaWYgKHByaXYtPnJ4X2NvbW1hbmRfZ2l2ZW4pCisJCXsKKwkJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9SWF9BQk9SVCk7CisJCQlhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldik7CisJCQlwcml2LT5yeF9jb21tYW5kX2dpdmVuID0gMDsKKwkJfQorCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9SWF9BQk9SVDsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gMTsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1RYX0FCT1JUKQorCXsKKwkJaWYgKHByaXYtPnR4X2NvbW1hbmRfZ2l2ZW4pCisJCXsKKwkJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9UWF9BQk9SVCk7CisJCQlhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldik7CisJCQlwcml2LT50eF9jb21tYW5kX2dpdmVuID0gMDsKKwkJfQorCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9UWF9BQk9SVDsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gMTsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1JFU0VUKQorCXsKKwkJcHJpdi0+dW5kZXJfcmVzZXQ9MTsKKwkJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCQlhcmxhbl9kcm9wX3R4KGRldik7CisJCWlmIChwcml2LT50eF9jb21tYW5kX2dpdmVuIHx8IHByaXYtPnJ4X2NvbW1hbmRfZ2l2ZW4pCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlc2V0IHVuZGVyIHR4IG9yIHJ4IGNvbW1hbmQgXG4iLCBkZXYtPm5hbWUpOworCQl9CisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJCWlmIChhcmxhbl9kZWJ1ZyAmIEFSTEFOX0RFQlVHX1JFU0VUKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRG9pbmcgY2hpcCByZXNldFxuIiwgZGV2LT5uYW1lKTsKKwkJcHJpdi0+bGFzdFJlc2V0ID0gamlmZmllczsKKwkJV1JJVEVTSE0oYXJsYW4tPmNvbW1hbmRCeXRlLCAwLCB1X2NoYXIpOworCQkvKiBob2xkIGNhcmQgaW4gcmVzZXQgc3RhdGUgKi8KKwkJc2V0SGFyZHdhcmVSZXNldChkZXYpOworCQkvKiBzZXQgcmVzZXQgZmxhZyBhbmQgdGhlbiByZWxlYXNlIHJlc2V0ICovCisJCVdSSVRFU0hNKGFybGFuLT5yZXNldEZsYWcsIDB4ZmYsIHVfY2hhcik7CisJCWNsZWFyQ2hhbm5lbEF0dGVudGlvbihkZXYpOworCQljbGVhckhhcmR3YXJlUmVzZXQoZGV2KTsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gSFogLyA0OworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9SRVNFVDsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9JTlRfUkFDSzsKKy8vCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX0lOVF9SRU5BQkxFOyAKKy8vCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX1JYOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfSU5UX1JBQ0spCisJeworCQljbGVhckhhcmR3YXJlUmVzZXQoZGV2KTsKKwkJY2xlYXJDbGVhckludGVycnVwdChkZXYpOworCQlzZXRDbGVhckludGVycnVwdChkZXYpOworCQlzZXRJbnRlcnJ1cHRFbmFibGUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfSU5UX1JBQ0s7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfQ09ORjsKKwkJcHJpdi0+dW5kZXJfY29uZmlnID0gMTsKKwkJcHJpdi0+dW5kZXJfcmVzZXQgPSAwOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfSU5UX1JFTkFCTEUpCisJeworCQlzZXRJbnRlcnJ1cHRFbmFibGUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfSU5UX1JFTkFCTEU7CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9DT05GKQorCXsKKwkJaWYgKHByaXYtPnR4X2NvbW1hbmRfZ2l2ZW4gfHwgcHJpdi0+cnhfY29tbWFuZF9naXZlbikKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVzZXQgdW5kZXIgdHggb3IgcnggY29tbWFuZCBcbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJYXJsYW5fZHJvcF90eChkZXYpOworCQlzZXRJbnRlcnJ1cHRFbmFibGUoZGV2KTsKKwkJYXJsYW5faHdfY29uZmlnKGRldik7CisJCWFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfQ09ORjsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gSFogLyAxMDsKKy8vCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX0lOVF9SQUNLOyAgIAorLy8JCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfSU5UX0VOQUJMRTsgCisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfQ09ORl9XQUlUOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfQ09ORl9XQUlUKQorCXsKKwkJaWYgKFJFQURTSE1CKGFybGFuLT5jb25maWd1cmVkU3RhdHVzRmxhZykgIT0gMCAmJgorCQkJUkVBRFNITUIoYXJsYW4tPmRpYWdub3N0aWNJbmZvKSA9PSAweGZmKQorCQl7CisJCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9DT05GX1dBSVQ7CisJCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX1JYOworCQkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9UQlVTWV9DTEVBUjsKKwkJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IEhaIC8gMTA7CisJCQlwcml2LT50eF9jb21tYW5kX2dpdmVuID0gMDsKKwkJCXByaXYtPnVuZGVyX2NvbmZpZyA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSAxOworCQkJaWYgKGFybGFuX2RlYnVnICYgQVJMQU5fREVCVUdfVElNSU5HKQorCQkJCXByaW50ayhLRVJOX0VSUiAiY29uZmlndXJlIGRlbGF5ZWQgXG4iKTsKKwkJfQorCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfUlgpCisJeworCQlpZiAoIXJlZ2lzdHJhdGlvbkJhZChkZXYpKQorCQl7CisJCQlzZXRJbnRlcnJ1cHRFbmFibGUoZGV2KTsKKwkJCW1lbXNldF9pbyhhcmxhbi0+Y29tbWFuZFBhcmFtZXRlciwgMCwgMHhmKTsKKwkJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9JTlQgfCBBUkxBTl9DT01fUlhfRU5BQkxFKTsKKwkJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZFBhcmFtZXRlclswXSwgY29uZi0+cnhQYXJhbWV0ZXIpOworCQkJYXJsYW5faW50ZXJydXB0X2xhbmNwdShkZXYpOworCQkJcHJpdi0+cnhfY29tbWFuZF9naXZlbiA9IDA7IC8vIG1uamFoLCBiYWQKKwkJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX1JYOworCQkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gMTsKKwkJfQorCQllbHNlCisJCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSAyOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfVEJVU1lfQ0xFQVIpCisJeworCQlpZiAoICFyZWdpc3RyYXRpb25CYWQoZGV2KSAmJgorCQkgICAgIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgfHwgIW5ldGlmX3J1bm5pbmcoZGV2KSkgKQorCQkJeworCQkJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX1RCVVNZX0NMRUFSOworCQkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCQl9CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9UWCkKKwl7CisJCWlmICghdGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCAqKSAmcHJpdi0+dHhfY29tbWFuZF9naXZlbikpCisJCXsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIAorCQkJCSAgICAgICBwcml2LT50eF9sYXN0X3NlbnQgKyB1czJ0aWNrcyhjb25mLT5yeF90d2VhazEpKQorCQkJICAgIHx8IHRpbWVfYmVmb3JlKGppZmZpZXMsCisJCQkJCSAgIHByaXYtPmxhc3RfcnhfaW50X2Fja190aW1lICsgdXMydGlja3MoY29uZi0+cnhfdHdlYWsyKSkpCisJCQl7CisJCQkJc2V0SW50ZXJydXB0RW5hYmxlKGRldik7CisJCQkJbWVtc2V0X2lvKGFybGFuLT5jb21tYW5kUGFyYW1ldGVyLCAwLCAweGYpOworCQkJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9UWF9FTkFCTEUgfCBBUkxBTl9DT01fSU5UKTsKKwkJCQltZW1jcHlfdG9pbyhhcmxhbi0+Y29tbWFuZFBhcmFtZXRlciwgJlRYTEFTVChkZXYpLCAxNCk7CisvLwkJCQlmb3IgKCBpPTEgOyBpIDwgMTUgOyBpKyspIHByaW50aygiJTAyeDoiLFJFQURTSE1CKGFybGFuLT5jb21tYW5kUGFyYW1ldGVyW2ldKSk7CisJCQkJcHJpdi0+dHhfbGFzdF9zZW50ID0gamlmZmllczsKKwkJCQlhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldik7CisJCQkJcHJpdi0+dHhfY29tbWFuZF9naXZlbiA9IDE7CisJCQkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfVFg7CisJCQkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gMTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwcml2LT50eF9jb21tYW5kX2dpdmVuID0gMDsKKwkJCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSAxOworCQkJfQorCQl9IAorCQllbHNlIGlmIChhcmxhbl9kZWJ1ZyAmIEFSTEFOX0RFQlVHX0NIQUlOX0xPQ0tTKQorCQkJcHJpbnRrKEtFUk5fRVJSICJ0eCBjb21tYW5kIHdoZW4gdHggY2hhaW4gbG9ja2VkIFxuIik7CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9OT09QSU5UKQorCXsKKwkJeworCQkJV1JJVEVTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSwgQVJMQU5fQ09NX05PUCB8IEFSTEFOX0NPTV9JTlQpOworCQl9CisJCWFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfTk9PUElOVDsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gSFogLyAzOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfTk9PUCkKKwl7CisJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9OT1ApOworCQlhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldik7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX05PT1A7CisJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IEhaIC8gMzsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1NMT1dfUE9MTCkKKwl7CisJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9HT1RPX1NMT1dfUE9MTCk7CisJCWFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfU0xPV19QT0xMOworCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSBIWiAvIDM7CisJfSAKKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfUE9XRVJET1dOKQorCXsKKwkJc2V0UG93ZXJPZmYoZGV2KTsKKwkJaWYgKGFybGFuX2RlYnVnICYgQVJMQU5fREVCVUdfQ0FSRF9TVEFURSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBcmxhbiBHb2luZyBTdGFuZGJ5XG4iLCBkZXYtPm5hbWUpOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9QT1dFUkRPV047CisJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IDMgKiBIWjsKKwl9CisJYXJsYW5fdW5sb2NrX2NhcmRfYWNjZXNzKGRldik7CisJZm9yIChpID0gMDsgUkVBRFNITUIoYXJsYW4tPmNvbW1hbmRCeXRlKSAmJiBpIDwgMjA7IGkrKykKKwkJdWRlbGF5KDEwKTsKKwlpZiAoUkVBRFNITUIoYXJsYW4tPmNvbW1hbmRCeXRlKSkKKwkJaWYgKGFybGFuX2RlYnVnICYgQVJMQU5fREVCVUdfQ0FSRF9TVEFURSkKKwkJCXByaW50ayhLRVJOX0VSUiAiY2FyZCBidXN5IGxlYXZpbmcgY29tbWFuZCAlbHhcbiIsIHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9jb21tYW5kIik7CisJcHJpdi0+bGFzdF9jb21tYW5kX2J1ZmZfZnJlZV90aW1lID0gamlmZmllczsKKwlyZXR1cm4gMDsKKworY2FyZF9idXN5X2VuZDoKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT5sYXN0X2NvbW1hbmRfYnVmZl9mcmVlX3RpbWUgKyBIWikpCisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX1JFU0VUOworCisJaWYgKGFybGFuX2RlYnVnICYgQVJMQU5fREVCVUdfQ0FSRF9TVEFURSkKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyBhcmxhbl9jb21tYW5kIGNhcmQgYnVzeSBlbmQgXG4iLCBkZXYtPm5hbWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9jb21tYW5kIik7CisJcmV0dXJuIDE7CisKK2JhZF9lbmQ6CisJcHJpbnRrKEtFUk5fRVJSICIlcyBhcmxhbl9jb21tYW5kIGJhZCBlbmQgXG4iLCBkZXYtPm5hbWUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX2NvbW1hbmQiKTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFybGFuX2NvbW1hbmRfcHJvY2VzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWludCB0aW1lcyA9IDA7CisJd2hpbGUgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYmIHRpbWVzIDwgOCkKKwl7CisJCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzaykKKwkJeworCQkJaWYgKGFybGFuX2NvbW1hbmQoZGV2LCAwKSkKKwkJCQlicmVhazsKKwkJCXRpbWVzKys7CisJCX0KKwkJLyogaWYgbG9uZyBjb21tYW5kLCB3ZSB3b24ndCByZXBlYXQgdHJ5aW5nICovIDsKKwkJaWYgKHByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA+IDEpCisJCQlicmVhazsKKwkJdGltZXMrKzsKKwl9Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGFybGFuX3JldHJhbnNtaXRfbm93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fcmV0cmFuc21pdF9ub3ciKTsKKwlpZiAoVFhMQVNUKGRldikub2Zmc2V0ID09IDApCisJeworCQlpZiAoVFhIRUFEKGRldikub2Zmc2V0KQorCQl7CisJCQlwcml2LT50eExhc3QgPSAwOworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikgcHJpbnRrKEtFUk5fREVCVUcgIlRYIGJ1ZmYgc3dpdGNoIHRvIGhlYWQgXG4iKTsKKworCQl9CisJCWVsc2UgaWYgKFRYVEFJTChkZXYpLm9mZnNldCkKKwkJeworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikgcHJpbnRrKEtFUk5fREVCVUcgIlRYIGJ1ZmYgc3dpdGNoIHRvIHRhaWwgXG4iKTsKKwkJCXByaXYtPnR4TGFzdCA9IDE7CisJCX0KKwkJZWxzZQorCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikgcHJpbnRrKEtFUk5fRVJSICJSZVRyYW5zbWl0IGJ1ZmYgZW1wdHkiKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJcmV0dXJuOworCisJfQorCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX1RYKTsKKworCXByaXYtPkNvbmYtPmRyaXZlclJldHJhbnNtaXNzaW9ucysrOworCXByaXYtPnJldHJhbnNtaXNzaW9ucysrOworCisJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikgcHJpbnRrKCJSZXRyYW5zbWl0ICVkIGJ5dGVzIFxuIiwgVFhMQVNUKGRldikubGVuZ3RoKTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3JldHJhbnNtaXRfbm93Iik7Cit9CisKKworCitzdGF0aWMgdm9pZCBhcmxhbl9yZWdpc3RyYXRpb25fdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGJoX21hcmtfbmVlZGVkID0gMDsKKwlpbnQgbmV4dF90aWNrID0gMTsKKwlsb25nIGxvc3RUaW1lID0gKChsb25nKWppZmZpZXMgLSAobG9uZylwcml2LT5yZWdpc3RyYXRpb25MYXN0U2VlbikKKwkJCSogKDEwMDAvSFopOworCisJaWYgKHJlZ2lzdHJhdGlvbkJhZChkZXYpKQorCXsKKwkJcHJpdi0+cmVnaXN0cmF0aW9uTG9zdENvdW50Kys7CisJCWlmIChsb3N0VGltZSA+IDcwMDAgJiYgbG9zdFRpbWUgPCA3MjAwKQorCQl7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIHJlZ2lzdHJhdGlvbiBMb3N0IFxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCQlpZiAobG9zdFRpbWUgLyBwcml2LT5yZVJlZ2lzdGVyRXhwID4gMjAwMCkKKwkJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9DT05GKTsKKwkJaWYgKGxvc3RUaW1lIC8gKHByaXYtPnJlUmVnaXN0ZXJFeHApID4gMzUwMCkKKwkJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9SRVNFVCk7CisJCWlmIChwcml2LT5yZVJlZ2lzdGVyRXhwIDwgNDAwKQorCQkJcHJpdi0+cmVSZWdpc3RlckV4cCArPSAyOworCQlpZiAobG9zdFRpbWUgPiA3MjAwKQorCQl7CisJCQluZXh0X3RpY2sgPSBIWjsKKwkJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9SRVNFVCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHByaXYtPkNvbmYtPnJlZ2lzdHJhdGlvbk1vZGUgJiYgbG9zdFRpbWUgPiAxMDAwMCAmJgorCQkJcHJpdi0+cmVnaXN0cmF0aW9uTG9zdENvdW50KQorCQl7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIHJlZ2lzdHJhdGlvbiBpcyBiYWNrIGFmdGVyICVsZCBtaWxsaXNlY29uZHNcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBsb3N0VGltZSk7CisJCX0KKwkJcHJpdi0+cmVnaXN0cmF0aW9uTGFzdFNlZW4gPSBqaWZmaWVzOworCQlwcml2LT5yZWdpc3RyYXRpb25Mb3N0Q291bnQgPSAwOworCQlwcml2LT5yZVJlZ2lzdGVyRXhwID0gMTsKKwkJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikgKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlpZiAodGltZV9hZnRlcihwcml2LT50eF9sYXN0X3NlbnQscHJpdi0+dHhfbGFzdF9jbGVhcmVkKSAmJgorCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT50eF9sYXN0X3NlbnQgKiA1KkhaKSApeworCQkJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX1JFU0VUKTsJCQorCQkJcHJpdi0+dHhfbGFzdF9jbGVhcmVkID0gamlmZmllczsKKwkJfQorCX0KKworCisJaWYgKCFyZWdpc3RyYXRpb25CYWQoZGV2KSAmJiBwcml2LT5SZVRyYW5zbWl0UmVxdWVzdGVkKQorCXsKKwkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCXByaW50ayhLRVJOX0VSUiAiUmV0cmFuc21pdCBmcm9tIHRpbWVyIFxuIik7CisJCXByaXYtPlJlVHJhbnNtaXRSZXF1ZXN0ZWQgPSAwOworCQlhcmxhbl9yZXRyYW5zbWl0X25vdyhkZXYpOworCX0KKwlpZiAoIXJlZ2lzdHJhdGlvbkJhZChkZXYpICYmCisJCXRpbWVfYWZ0ZXIoamlmZmllcywgcHJpdi0+dHhfZG9uZV9kZWxheWVkKSAmJgorCQlwcml2LT50eF9kb25lX2RlbGF5ZWQgIT0gMCkKKwl7CisJCVRYTEFTVChkZXYpLm9mZnNldCA9IDA7CisJCWlmIChwcml2LT50eExhc3QpCisJCQlwcml2LT50eExhc3QgPSAwOworCQllbHNlIGlmIChUWFRBSUwoZGV2KS5vZmZzZXQpCisJCQlwcml2LT50eExhc3QgPSAxOworCQlpZiAoVFhMQVNUKGRldikub2Zmc2V0KQorCQl7CisJCQlhcmxhbl9yZXRyYW5zbWl0X25vdyhkZXYpOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCX0KKwkJaWYgKCEoVFhIRUFEKGRldikub2Zmc2V0ICYmIFRYVEFJTChkZXYpLm9mZnNldCkpCisJCXsKKwkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCX0KKwkJcHJpdi0+dHhfZG9uZV9kZWxheWVkID0gMDsKKwkJYmhfbWFya19uZWVkZWQgPSAxOworCX0KKwlpZiAoYmhfbWFya19uZWVkZWQpCisJeworCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCX0KKwlhcmxhbl9wcm9jZXNzX2ludGVycnVwdChkZXYpOworCisJaWYgKG5leHRfdGljayA8IHByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCkKKwkJbmV4dF90aWNrID0gcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsOworCisJcHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBuZXh0X3RpY2s7CisKKwlhZGRfdGltZXIoJnByaXYtPnRpbWVyKTsKK30KKworCisjaWZkZWYgQVJMQU5fREVCVUdHSU5HCisKK3N0YXRpYyB2b2lkIGFybGFuX3ByaW50X3JlZ2lzdGVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbGluZSkKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisKKwl1X2NoYXIgaG9zdGNwdUxvY2ssIGxhbmNwdUxvY2ssIGNvbnRyb2xSZWdpc3RlciwgY250cmxSZWdJbWFnZSwKKwkJdHhTdGF0dXMsIHJ4U3RhdHVzLCBpbnRlcnJ1cHRJblByb2dyZXNzLCBjb21tYW5kQnl0ZTsKKworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3ByaW50X3JlZ2lzdGVycyIpOworCVJFQURTSE0oaW50ZXJydXB0SW5Qcm9ncmVzcywgYXJsYW4tPmludGVycnVwdEluUHJvZ3Jlc3MsIHVfY2hhcik7CisJUkVBRFNITShob3N0Y3B1TG9jaywgYXJsYW4tPmhvc3RjcHVMb2NrLCB1X2NoYXIpOworCVJFQURTSE0obGFuY3B1TG9jaywgYXJsYW4tPmxhbmNwdUxvY2ssIHVfY2hhcik7CisJUkVBRFNITShjb250cm9sUmVnaXN0ZXIsIGFybGFuLT5jb250cm9sUmVnaXN0ZXIsIHVfY2hhcik7CisJUkVBRFNITShjbnRybFJlZ0ltYWdlLCBhcmxhbi0+Y250cmxSZWdJbWFnZSwgdV9jaGFyKTsKKwlSRUFEU0hNKHR4U3RhdHVzLCBhcmxhbi0+dHhTdGF0dXMsIHVfY2hhcik7CisJUkVBRFNITShyeFN0YXR1cywgYXJsYW4tPnJ4U3RhdHVzLCB1X2NoYXIpOworCVJFQURTSE0oY29tbWFuZEJ5dGUsIGFybGFuLT5jb21tYW5kQnl0ZSwgdV9jaGFyKTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgImxpbmUgJTA0ZCBJUCAlMDJ4IEhMICUwMnggTEwgJTAyeCBDQiAlMDJ4IENSICUwMnggQ1JJICUwMnggVFggJTAyeCBSWCAlMDJ4XG4iLAorCQlsaW5lLCBpbnRlcnJ1cHRJblByb2dyZXNzLCBob3N0Y3B1TG9jaywgbGFuY3B1TG9jaywgY29tbWFuZEJ5dGUsCisJCWNvbnRyb2xSZWdpc3RlciwgY250cmxSZWdJbWFnZSwgdHhTdGF0dXMsIHJ4U3RhdHVzKTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3ByaW50X3JlZ2lzdGVycyIpOworfQorI2VuZGlmCisKKworc3RhdGljIGludCBhcmxhbl9od190eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBsZW5ndGgpCit7CisJaW50IGk7CisKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwlzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1ICpjb25mID0gcHJpdi0+Q29uZjsKKworCWludCB0YWlsU3RhcnRzID0gMHg4MDA7CisJaW50IGhlYWRFbmRzID0gMHgwOworCisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5faHdfdHgiKTsKKwlpZiAoVFhIRUFEKGRldikub2Zmc2V0KQorCQloZWFkRW5kcyA9ICgoKFRYSEVBRChkZXYpLm9mZnNldCArIFRYSEVBRChkZXYpLmxlbmd0aCAtIG9mZnNldG9mKHN0cnVjdCBhcmxhbl9zaG1lbSwgdHhCdWZmZXIpKSAvIDY0KSArIDEpICogNjQ7CisJaWYgKFRYVEFJTChkZXYpLm9mZnNldCkKKwkJdGFpbFN0YXJ0cyA9IDB4ODAwIC0gKCgoVFhUQUlMKGRldikub2Zmc2V0IC0gb2Zmc2V0b2Yoc3RydWN0IGFybGFuX3NobWVtLCB0eEJ1ZmZlcikpIC8gNjQpICsgMikgKiA2NDsKKworCisJaWYgKCFUWEhFQUQoZGV2KS5vZmZzZXQgJiYgbGVuZ3RoIDwgdGFpbFN0YXJ0cykKKwl7CisJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQlwcmludGsoS0VSTl9FUlIgIlRYSEVBRCBpbnNlcnQsIHRhaWxTdGFydCAlZFxuIiwgdGFpbFN0YXJ0cyk7CisKKwkJVFhIRUFEKGRldikub2Zmc2V0ID0KKwkJCW9mZnNldG9mKHN0cnVjdCBhcmxhbl9zaG1lbSwgdHhCdWZmZXIpOworCQlUWEhFQUQoZGV2KS5sZW5ndGggPSBsZW5ndGggLSBBUkxBTl9GQUtFX0hEUl9MRU47CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlUWEhFQUQoZGV2KS5kZXN0W2ldID0gYnVmW2ldOworCQlUWEhFQUQoZGV2KS5jbGVhciA9IGNvbmYtPnR4Q2xlYXI7CisJCVRYSEVBRChkZXYpLnJldHJpZXMgPSBjb25mLT50eFJldHJpZXM7CS8qIDAgaXMgdXNlIGRlZmF1bHQgKi8KKwkJVFhIRUFEKGRldikucm91dGluZyA9IGNvbmYtPnR4Um91dGluZzsKKwkJVFhIRUFEKGRldikuc2NyYW1ibGVkID0gY29uZi0+dHhTY3JhbWJsZWQ7CisJCW1lbWNweV90b2lvKChjaGFyIF9faW9tZW0gKilhcmxhbiArIFRYSEVBRChkZXYpLm9mZnNldCwgYnVmICsgQVJMQU5fRkFLRV9IRFJfTEVOLCBUWEhFQUQoZGV2KS5sZW5ndGgpOworCX0KKwllbHNlIGlmICghVFhUQUlMKGRldikub2Zmc2V0ICYmIGxlbmd0aCA8ICgweDgwMCAtIGhlYWRFbmRzKSkKKwl7CisJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQlwcmludGsoS0VSTl9FUlIgIlRYVEFJTCBpbnNlcnQsIGhlYWRFbmQgJWRcbiIsIGhlYWRFbmRzKTsKKworCQlUWFRBSUwoZGV2KS5vZmZzZXQgPQorCQkJb2Zmc2V0b2Yoc3RydWN0IGFybGFuX3NobWVtLCB0eEJ1ZmZlcikgKyAweDgwMCAtIChsZW5ndGggLyA2NCArIDIpICogNjQ7CisJCVRYVEFJTChkZXYpLmxlbmd0aCA9IGxlbmd0aCAtIEFSTEFOX0ZBS0VfSERSX0xFTjsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCVRYVEFJTChkZXYpLmRlc3RbaV0gPSBidWZbaV07CisJCVRYVEFJTChkZXYpLmNsZWFyID0gY29uZi0+dHhDbGVhcjsKKwkJVFhUQUlMKGRldikucmV0cmllcyA9IGNvbmYtPnR4UmV0cmllczsKKwkJVFhUQUlMKGRldikucm91dGluZyA9IGNvbmYtPnR4Um91dGluZzsKKwkJVFhUQUlMKGRldikuc2NyYW1ibGVkID0gY29uZi0+dHhTY3JhbWJsZWQ7CisJCW1lbWNweV90b2lvKCgoY2hhciBfX2lvbWVtICopYXJsYW4gKyBUWFRBSUwoZGV2KS5vZmZzZXQpLCBidWYgKyBBUkxBTl9GQUtFX0hEUl9MRU4sIFRYVEFJTChkZXYpLmxlbmd0aCk7CisJfQorCWVsc2UKKwl7CisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQlwcmludGsoS0VSTl9FUlIgIlRYIFRBSUwgJiBIRUFEIGZ1bGwsIHJldHVybiwgdGFpbFN0YXJ0ICVkIGhlYWRFbmQgJWRcbiIsIHRhaWxTdGFydHMsIGhlYWRFbmRzKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwcml2LT5vdXRfYnl0ZXMgKz0gbGVuZ3RoOworCXByaXYtPm91dF9ieXRlczEwICs9IGxlbmd0aDsKKwlpZiAoY29uZi0+bWVhc3VyZV9yYXRlIDwgMSkKKwkJY29uZi0+bWVhc3VyZV9yYXRlID0gMTsKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT5vdXRfdGltZSArIGNvbmYtPm1lYXN1cmVfcmF0ZSAqIEhaKSkKKwl7CisJCWNvbmYtPm91dF9zcGVlZCA9IHByaXYtPm91dF9ieXRlcyAvIGNvbmYtPm1lYXN1cmVfcmF0ZTsKKwkJcHJpdi0+b3V0X2J5dGVzID0gMDsKKwkJcHJpdi0+b3V0X3RpbWUgPSBqaWZmaWVzOworCX0KKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT5vdXRfdGltZTEwICsgY29uZi0+bWVhc3VyZV9yYXRlICogMTAqSFopKQorCXsKKwkJY29uZi0+b3V0X3NwZWVkMTAgPSBwcml2LT5vdXRfYnl0ZXMxMCAvICgxMCAqIGNvbmYtPm1lYXN1cmVfcmF0ZSk7CisJCXByaXYtPm91dF9ieXRlczEwID0gMDsKKwkJcHJpdi0+b3V0X3RpbWUxMCA9IGppZmZpZXM7CisJfQorCWlmIChUWEhFQUQoZGV2KS5vZmZzZXQgJiYgVFhUQUlMKGRldikub2Zmc2V0KQorCXsKKwkJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UKKwkJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisKKworCUlGREVCVUcoQVJMQU5fREVCVUdfSEVBREVSX0RVTVApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIFRyYW5zbWl0IHQgJTJ4OiUyeDolMng6JTJ4OiUyeDolMnggZiAlMng6JTJ4OiUyeDolMng6JTJ4OiUyeCBcbiIsIGRldi0+bmFtZSwKKwkJICAgKHVuc2lnbmVkIGNoYXIpIGJ1ZlswXSwgKHVuc2lnbmVkIGNoYXIpIGJ1ZlsxXSwgKHVuc2lnbmVkIGNoYXIpIGJ1ZlsyXSwgKHVuc2lnbmVkIGNoYXIpIGJ1ZlszXSwKKwkJICAgKHVuc2lnbmVkIGNoYXIpIGJ1Zls0XSwgKHVuc2lnbmVkIGNoYXIpIGJ1Zls1XSwgKHVuc2lnbmVkIGNoYXIpIGJ1Zls2XSwgKHVuc2lnbmVkIGNoYXIpIGJ1Zls3XSwKKwkJICAgKHVuc2lnbmVkIGNoYXIpIGJ1Zls4XSwgKHVuc2lnbmVkIGNoYXIpIGJ1Zls5XSwgKHVuc2lnbmVkIGNoYXIpIGJ1ZlsxMF0sICh1bnNpZ25lZCBjaGFyKSBidWZbMTFdKTsKKworCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pIHByaW50ayhLRVJOX0VSUiAiVFggY29tbWFuZCBwcmVwYXJlIGZvciBidWZmZXIgJWRcbiIsIHByaXYtPnR4TGFzdCk7CisKKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9UWCk7CisKKwlwcml2LT50eF9sYXN0X3NlbnQgPSBqaWZmaWVzOworCisJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikgcHJpbnRrKCIlcyBUWCBRdWVkICVkIGJ5dGVzIFxuIiwgZGV2LT5uYW1lLCBsZW5ndGgpOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5faHdfdHgiKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXJsYW5faHdfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisJc3RydWN0IGFybGFuX2NvbmZfc3RydSAqY29uZiA9IHByaXYtPkNvbmY7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5faHdfY29uZmlnIik7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIGFybGFuIGNvbmZpZ3VyZSBjYWxsZWQgXG4iLCBkZXYtPm5hbWUpOworCWlmIChhcmxhbl9FRVBST01fYmFkKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgImFybGFuIGNvbmZpZ3VyZSB3aXRoIGVlcHJvbSBiYWQgb3B0aW9uIFxuIik7CisKKworCVdSSVRFU0hNKGFybGFuLT5zcHJlYWRpbmdDb2RlLCBjb25mLT5zcHJlYWRpbmdDb2RlLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5jaGFubmVsU2V0LCBjb25mLT5jaGFubmVsU2V0LCB1X2NoYXIpOworCisJaWYgKGFybGFuX0VFUFJPTV9iYWQpCisJCVdSSVRFU0hNKGFybGFuLT5kZWZhdWx0Q2hhbm5lbFNldCwgY29uZi0+Y2hhbm5lbFNldCwgdV9jaGFyKTsKKworCVdSSVRFU0hNKGFybGFuLT5jaGFubmVsTnVtYmVyLCBjb25mLT5jaGFubmVsTnVtYmVyLCB1X2NoYXIpOworCisJV1JJVEVTSE0oYXJsYW4tPnNjcmFtYmxpbmdEaXNhYmxlLCBjb25mLT5zY3JhbWJsaW5nRGlzYWJsZSwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+dHhBdHRlbnVhdGlvbiwgY29uZi0+dHhBdHRlbnVhdGlvbiwgdV9jaGFyKTsKKworCVdSSVRFU0hNKGFybGFuLT5zeXN0ZW1JZCwgY29uZi0+c3lzdGVtSWQsIHVfaW50KTsKKworCVdSSVRFU0hNKGFybGFuLT5tYXhSZXRyaWVzLCBjb25mLT5tYXhSZXRyaWVzLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5yZWNlaXZlTW9kZSwgY29uZi0+cmVjZWl2ZU1vZGUsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPnByaW9yaXR5LCBjb25mLT5wcmlvcml0eSwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+cm9vdE9yUmVwZWF0ZXIsIGNvbmYtPnJvb3RPclJlcGVhdGVyLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5TSUQsIGNvbmYtPlNJRCwgdV9pbnQpOworCisJV1JJVEVTSE0oYXJsYW4tPnJlZ2lzdHJhdGlvbk1vZGUsIGNvbmYtPnJlZ2lzdHJhdGlvbk1vZGUsIHVfY2hhcik7CisKKwlXUklURVNITShhcmxhbi0+cmVnaXN0cmF0aW9uRmlsbCwgY29uZi0+cmVnaXN0cmF0aW9uRmlsbCwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+bG9jYWxUYWxrQWRkcmVzcywgY29uZi0+bG9jYWxUYWxrQWRkcmVzcywgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+Y29kZUZvcm1hdCwgY29uZi0+Y29kZUZvcm1hdCwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+bnVtQ2hhbm5lbHMsIGNvbmYtPm51bUNoYW5uZWxzLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5jaGFubmVsMSwgY29uZi0+Y2hhbm5lbDEsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPmNoYW5uZWwyLCBjb25mLT5jaGFubmVsMiwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+Y2hhbm5lbDMsIGNvbmYtPmNoYW5uZWwzLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5jaGFubmVsNCwgY29uZi0+Y2hhbm5lbDQsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPnJhZGlvTm9kZUlkLCBjb25mLT5yYWRpb05vZGVJZCwgdV9zaG9ydCk7CisJV1JJVEVTSE0oYXJsYW4tPlNJRCwgY29uZi0+U0lELCB1X2ludCk7CisJV1JJVEVTSE0oYXJsYW4tPndhaXRUaW1lLCBjb25mLT53YWl0VGltZSwgdV9zaG9ydCk7CisJV1JJVEVTSE0oYXJsYW4tPmxQYXJhbWV0ZXIsIGNvbmYtPmxQYXJhbWV0ZXIsIHVfc2hvcnQpOworCW1lbWNweV90b2lvKCYoYXJsYW4tPl8xNSksICYoY29uZi0+XzE1KSwgMyk7CisJV1JJVEVTSE0oYXJsYW4tPl8xNSwgY29uZi0+XzE1LCB1X3Nob3J0KTsKKwlXUklURVNITShhcmxhbi0+aGVhZGVyU2l6ZSwgY29uZi0+aGVhZGVyU2l6ZSwgdV9zaG9ydCk7CisJaWYgKGFybGFuX0VFUFJPTV9iYWQpCisJCVdSSVRFU0hNKGFybGFuLT5oYXJkd2FyZVR5cGUsIGNvbmYtPmhhcmR3YXJlVHlwZSwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+cmFkaW9UeXBlLCBjb25mLT5yYWRpb1R5cGUsIHVfY2hhcik7CisJaWYgKGFybGFuX0VFUFJPTV9iYWQpCisJCVdSSVRFU0hNKGFybGFuLT5yYWRpb01vZHVsZSwgY29uZi0+cmFkaW9UeXBlLCB1X2NoYXIpOworCisJbWVtY3B5X3RvaW8oYXJsYW4tPmVuY3J5cHRpb25LZXkgKyBrZXlTdGFydCwgZW5jcnlwdGlvbktleSwgOCk7CisJbWVtY3B5X3RvaW8oYXJsYW4tPm5hbWUsIGNvbmYtPnNpdGVOYW1lLCAxNik7CisKKwlXUklURVNITUIoYXJsYW4tPmNvbW1hbmRCeXRlLCBBUkxBTl9DT01fSU5UIHwgQVJMQU5fQ09NX0NPTkYpOwkvKiBkbyBjb25maWd1cmUgKi8KKwltZW1zZXRfaW8oYXJsYW4tPmNvbW1hbmRQYXJhbWV0ZXIsIDAsIDB4Zik7CS8qIDB4ZiAqLworCW1lbXNldF9pbyhhcmxhbi0+Y29tbWFuZFBhcmFtZXRlciArIDEsIDAsIDIpOworCWlmIChjb25mLT53cml0ZUVFUFJPTSkKKwl7CisJCSAgbWVtc2V0X2lvKGFybGFuLT5jb21tYW5kUGFyYW1ldGVyLCBjb25mLT53cml0ZUVFUFJPTSwgMSk7CisvLwkJY29uZi0+d3JpdGVFRVBST009MDsKKwl9CisJaWYgKGNvbmYtPnJlZ2lzdHJhdGlvbk1vZGUgJiYgY29uZi0+cmVnaXN0cmF0aW9uSW50ZXJydXB0cykKKwkJbWVtc2V0X2lvKGFybGFuLT5jb21tYW5kUGFyYW1ldGVyICsgMywgMSwgMSk7CisJZWxzZQorCQltZW1zZXRfaW8oYXJsYW4tPmNvbW1hbmRQYXJhbWV0ZXIgKyAzLCAwLCAxKTsKKworCXByaXYtPmlycV90ZXN0X2RvbmUgPSAwOworCisJaWYgKGNvbmYtPnR4X3F1ZXVlX2xlbikKKwkJZGV2LT50eF9xdWV1ZV9sZW4gPSBjb25mLT50eF9xdWV1ZV9sZW47CisJdWRlbGF5KDEwMCk7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9od19jb25maWciKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFybGFuX3JlYWRfY2FyZF9jb25maWd1cmF0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdV9jaGFyIHRseDQxNTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwlzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1ICpjb25mID0gcHJpdi0+Q29uZjsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9yZWFkX2NhcmRfY29uZmlndXJhdGlvbiIpOworCisJaWYgKHJhZGlvTm9kZUlkID09IHJhZGlvTm9kZUlkVU5LTk9XTikKKwl7CisJCVJFQURTSE0oY29uZi0+cmFkaW9Ob2RlSWQsIGFybGFuLT5yYWRpb05vZGVJZCwgdV9zaG9ydCk7CisJfQorCWVsc2UKKwkJY29uZi0+cmFkaW9Ob2RlSWQgPSByYWRpb05vZGVJZDsKKwkJCisJaWYgKFNJRCA9PSBTSURVTktOT1dOKQorCXsKKwkJUkVBRFNITShjb25mLT5TSUQsIGFybGFuLT5TSUQsIHVfaW50KTsKKwl9CisJZWxzZSBjb25mLT5TSUQgPSBTSUQ7CisJCQorCWlmIChzcHJlYWRpbmdDb2RlID09IHNwcmVhZGluZ0NvZGVVTktOT1dOKQorCXsKKwkJICBSRUFEU0hNKGNvbmYtPnNwcmVhZGluZ0NvZGUsIGFybGFuLT5zcHJlYWRpbmdDb2RlLCB1X2NoYXIpOworCX0KKwllbHNlCisJCWNvbmYtPnNwcmVhZGluZ0NvZGUgPSBzcHJlYWRpbmdDb2RlOworCQkKKwlpZiAoY2hhbm5lbFNldCA9PSBjaGFubmVsU2V0VU5LTk9XTikKKwl7CisJCVJFQURTSE0oY29uZi0+Y2hhbm5lbFNldCwgYXJsYW4tPmNoYW5uZWxTZXQsIHVfY2hhcik7CisJfQorCWVsc2UgY29uZi0+Y2hhbm5lbFNldCA9IGNoYW5uZWxTZXQ7CisKKwlpZiAoY2hhbm5lbE51bWJlciA9PSBjaGFubmVsTnVtYmVyVU5LTk9XTikKKwl7CisJCVJFQURTSE0oY29uZi0+Y2hhbm5lbE51bWJlciwgYXJsYW4tPmNoYW5uZWxOdW1iZXIsIHVfY2hhcik7CisJfQorCWVsc2UgY29uZi0+Y2hhbm5lbE51bWJlciA9IGNoYW5uZWxOdW1iZXI7CisJCisJUkVBRFNITShjb25mLT5zY3JhbWJsaW5nRGlzYWJsZSwgYXJsYW4tPnNjcmFtYmxpbmdEaXNhYmxlLCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+dHhBdHRlbnVhdGlvbiwgYXJsYW4tPnR4QXR0ZW51YXRpb24sIHVfY2hhcik7CisJCisJaWYgKHN5c3RlbUlkID09IHN5c3RlbUlkVU5LTk9XTikKKwl7CisJCVJFQURTSE0oY29uZi0+c3lzdGVtSWQsIGFybGFuLT5zeXN0ZW1JZCwgdV9pbnQpOworCX0gCisJZWxzZSBjb25mLT5zeXN0ZW1JZCA9IHN5c3RlbUlkOworCQorCVJFQURTSE0oY29uZi0+bWF4RGF0YWdyYW1TaXplLCBhcmxhbi0+bWF4RGF0YWdyYW1TaXplLCB1X3Nob3J0KTsKKwlSRUFEU0hNKGNvbmYtPm1heEZyYW1lU2l6ZSwgYXJsYW4tPm1heEZyYW1lU2l6ZSwgdV9zaG9ydCk7CisJUkVBRFNITShjb25mLT5tYXhSZXRyaWVzLCBhcmxhbi0+bWF4UmV0cmllcywgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPnJlY2VpdmVNb2RlLCBhcmxhbi0+cmVjZWl2ZU1vZGUsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT5wcmlvcml0eSwgYXJsYW4tPnByaW9yaXR5LCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+cm9vdE9yUmVwZWF0ZXIsIGFybGFuLT5yb290T3JSZXBlYXRlciwgdV9jaGFyKTsKKworCWlmIChTSUQgPT0gU0lEVU5LTk9XTikKKwl7CisJCSAgUkVBRFNITShjb25mLT5TSUQsIGFybGFuLT5TSUQsIHVfaW50KTsKKwl9CisJZWxzZSBjb25mLT5TSUQgPSBTSUQ7CisJCisJaWYgKHJlZ2lzdHJhdGlvbk1vZGUgPT0gcmVnaXN0cmF0aW9uTW9kZVVOS05PV04pCisJeworCQkgIFJFQURTSE0oY29uZi0+cmVnaXN0cmF0aW9uTW9kZSwgYXJsYW4tPnJlZ2lzdHJhdGlvbk1vZGUsIHVfY2hhcik7CisJfQorCWVsc2UgY29uZi0+cmVnaXN0cmF0aW9uTW9kZSA9IHJlZ2lzdHJhdGlvbk1vZGU7CisJCisJUkVBRFNITShjb25mLT5yZWdpc3RyYXRpb25GaWxsLCBhcmxhbi0+cmVnaXN0cmF0aW9uRmlsbCwgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPmxvY2FsVGFsa0FkZHJlc3MsIGFybGFuLT5sb2NhbFRhbGtBZGRyZXNzLCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+Y29kZUZvcm1hdCwgYXJsYW4tPmNvZGVGb3JtYXQsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT5udW1DaGFubmVscywgYXJsYW4tPm51bUNoYW5uZWxzLCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+Y2hhbm5lbDEsIGFybGFuLT5jaGFubmVsMSwgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPmNoYW5uZWwyLCBhcmxhbi0+Y2hhbm5lbDIsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT5jaGFubmVsMywgYXJsYW4tPmNoYW5uZWwzLCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+Y2hhbm5lbDQsIGFybGFuLT5jaGFubmVsNCwgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPndhaXRUaW1lLCBhcmxhbi0+d2FpdFRpbWUsIHVfc2hvcnQpOworCVJFQURTSE0oY29uZi0+bFBhcmFtZXRlciwgYXJsYW4tPmxQYXJhbWV0ZXIsIHVfc2hvcnQpOworCVJFQURTSE0oY29uZi0+XzE1LCBhcmxhbi0+XzE1LCB1X3Nob3J0KTsKKwlSRUFEU0hNKGNvbmYtPmhlYWRlclNpemUsIGFybGFuLT5oZWFkZXJTaXplLCB1X3Nob3J0KTsKKwlSRUFEU0hNKGNvbmYtPmhhcmR3YXJlVHlwZSwgYXJsYW4tPmhhcmR3YXJlVHlwZSwgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPnJhZGlvVHlwZSwgYXJsYW4tPnJhZGlvTW9kdWxlLCB1X2NoYXIpOworCQorCWlmIChjb25mLT5yYWRpb1R5cGUgPT0gMCkKKwkJY29uZi0+cmFkaW9UeXBlID0gMHhjOworCisJV1JJVEVTSE0oYXJsYW4tPmNvbmZpZ1N0YXR1cywgMHhBNSwgdV9jaGFyKTsKKwlSRUFEU0hNKHRseDQxNSwgYXJsYW4tPmNvbmZpZ1N0YXR1cywgdV9jaGFyKTsKKwkKKwlpZiAodGx4NDE1ICE9IDB4QTUpCisJCXByaW50ayhLRVJOX0lORk8gIiVzIHRseDQxNSBjaGlwIFxuIiwgZGV2LT5uYW1lKTsKKwkKKwljb25mLT50eENsZWFyID0gMDsKKwljb25mLT50eFJldHJpZXMgPSAxOworCWNvbmYtPnR4Um91dGluZyA9IDE7CisJY29uZi0+dHhTY3JhbWJsZWQgPSAwOworCWNvbmYtPnJ4UGFyYW1ldGVyID0gMTsKKwljb25mLT50eFRpbWVvdXRNcyA9IDQwMDA7CisJY29uZi0+d2FpdENhcmRUaW1lb3V0ID0gMTAwMDAwOworCWNvbmYtPnJlY2VpdmVNb2RlID0gQVJMQU5fUkNWX0NMRUFOOworCW1lbWNweV9mcm9taW8oY29uZi0+c2l0ZU5hbWUsIGFybGFuLT5uYW1lLCAxNik7CisJY29uZi0+c2l0ZU5hbWVbMTZdID0gJ1wwJzsKKwljb25mLT5yZXRyaWVzID0gcmV0cmllczsKKwljb25mLT50eF9kZWxheV9tcyA9IHR4X2RlbGF5X21zOworCWNvbmYtPlJlVHJhbnNtaXRQYWNrZXRNYXhTaXplID0gMjAwOworCWNvbmYtPndhaXRSZVRyYW5zbWl0UGFja2V0TWF4U2l6ZSA9IDIwMDsKKwljb25mLT50eEFja1RpbWVvdXRNcyA9IDkwMDsKKwljb25mLT5mYXN0UmVUcmFuc0NvdW50ID0gMzsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3JlYWRfY2FyZF9jb25maWd1cmF0aW9uIik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGxhc3RGb3VuZEF0ID0gMHhiZTAwMDsKKworCisvKgorICogVGhpcyBpcyB0aGUgcmVhbCBwcm9iZSByb3V0aW5lLiBMaW51eCBoYXMgYSBoaXN0b3J5IG9mIGZyaWVuZGx5IGRldmljZQorICogcHJvYmVzIG9uIHRoZSBJU0EgYnVzLiBBIGdvb2QgZGV2aWNlIHByb2JlcyBhdm9pZHMgZG9pbmcgd3JpdGVzLCBhbmQKKyAqIHZlcmlmaWVzIHRoYXQgdGhlIGNvcnJlY3QgZGV2aWNlIGV4aXN0cyBhbmQgZnVuY3Rpb25zLgorICovCisjZGVmaW5lIEFSTEFOX1NITUVNX1NJWkUJMHgyMDAwCitzdGF0aWMgaW50IF9faW5pdCBhcmxhbl9jaGVja19maW5nZXJwcmludCh1bnNpZ25lZCBsb25nIG1lbWFkZHIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcHJvYmVUZXh0W10gPSAiVEVMRVNZU1RFTSBTTFcgSU5DLiAgICBBUkxBTiBcMCI7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gKHN0cnVjdCBhcmxhbl9zaG1lbSAqKSBtZW1hZGRyOworCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSB2aXJ0X3RvX3BoeXMoKHZvaWQgKikgbWVtYWRkcik7CisJY2hhciB0ZW1wQnVmWzQ5XTsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9jaGVja19maW5nZXJwcmludCIpOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGFkZHIsIEFSTEFOX1NITUVNX1NJWkUsICJhcmxhbiIpKSB7CisJCS8vIHByaW50ayhLRVJOX1dBUk5JTkcgImFybGFuOiBtZW1vcnkgcmVnaW9uICVseCBleGNsdWRlZCBmcm9tIHByb2JpbmcgXG4iLHBhZGRyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbWVtY3B5X2Zyb21pbyh0ZW1wQnVmLCBhcmxhbi0+dGV4dFJlZ2lvbiwgMjkpOworCXRlbXBCdWZbMzBdID0gMDsKKworCS8qIGNoZWNrIGZvciBjYXJkIGF0IHRoaXMgYWRkcmVzcyAqLworCWlmICgwICE9IHN0cm5jbXAodGVtcEJ1ZiwgcHJvYmVUZXh0LCAyOSkpeworIAkJcmVsZWFzZV9tZW1fcmVnaW9uKHBhZGRyLCBBUkxBTl9TSE1FTV9TSVpFKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisvLyAgIHByaW50ayhLRVJOX0lORk8gImFybGFuIGZvdW5kIGF0IDB4JXggXG4iLG1lbWFkZHIpOworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX2NoZWNrX2ZpbmdlcnByaW50Iik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcmxhbl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1ICpjb25mID0gcHJpdi0+Q29uZjsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9jaGFuZ2VfbXR1Iik7CisJaWYgKG5ld19tdHUgPiAyMDMyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJaWYgKG5ld19tdHUgPCAyNTYpCisJCW5ld19tdHUgPSAyNTY7CS8qIGNhcmRzIGJvb2sgc3VnZ2VzdHMgMTYwMCAqLworCWNvbmYtPm1heERhdGFncmFtU2l6ZSA9IG5ld19tdHU7CisJY29uZi0+bWF4RnJhbWVTaXplID0gbmV3X210dSArIDQ4OworCisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX0NPTkYpOworCXByaW50ayhLRVJOX05PVElDRSAiJXMgbXR1IGNoYW5nZWQgdG8gJWQgXG4iLCBkZXYtPm5hbWUsIG5ld19tdHUpOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fY2hhbmdlX210dSIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJsYW5fbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fbWFjX2FkZHIiKTsKKwlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX21hY19hZGRyIik7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IF9faW5pdCBhcmxhbl9zZXR1cF9kZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fc2V0dXBfZGV2aWNlIik7CisKKwlhcC0+Y29uZiA9IChzdHJ1Y3QgYXJsYW5fc2htZW0gKikoYXArMSk7CisKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IHR4X3F1ZXVlX2xlbjsKKwlkZXYtPm9wZW4gPSBhcmxhbl9vcGVuOworCWRldi0+c3RvcCA9IGFybGFuX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYXJsYW5fdHg7CisJZGV2LT5nZXRfc3RhdHMgPSBhcmxhbl9zdGF0aXN0aWNzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gYXJsYW5fc2V0X211bHRpY2FzdDsKKwlkZXYtPmNoYW5nZV9tdHUgPSBhcmxhbl9jaGFuZ2VfbXR1OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gYXJsYW5fbWFjX2FkZHI7CisJZGV2LT50eF90aW1lb3V0ID0gYXJsYW5fdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gMypIWjsKKwkKKwlhcC0+aXJxX3Rlc3RfZG9uZSA9IDA7CisJYXAtPkNvbmYgPSAmYXJsYW5fY29uZltudW1dOworCisJYXAtPkNvbmYtPnByZV9Db21tYW5kX1dhaXQgPSA0MDsKKwlhcC0+Q29uZi0+cnhfdHdlYWsxID0gMzA7CisJYXAtPkNvbmYtPnJ4X3R3ZWFrMiA9IDA7CisKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHZpcnRfdG9fcGh5cygodm9pZCAqKSBkZXYtPm1lbV9zdGFydCksIAorCQkJICAgQVJMQU5fU0hNRU1fU0laRSk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBlcnI7CisJfQorCWFybGFuX2RldmljZVtudW1dID0gZGV2OworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3NldHVwX2RldmljZSIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhcmxhbl9wcm9iZV9oZXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgbWVtYWRkcikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3Byb2JlX2hlcmUiKTsKKworCWlmIChhcmxhbl9jaGVja19maW5nZXJwcmludChtZW1hZGRyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBBcmxhbiBmb3VuZCBhdCAleCwgXG4gIiwgZGV2LT5uYW1lLCAKKwkgICAgICAgKGludCkgdmlydF90b19waHlzKCh2b2lkKiltZW1hZGRyKSk7CisKKwlhcC0+Y2FyZCA9ICh2b2lkICopIG1lbWFkZHI7CisJZGV2LT5tZW1fc3RhcnQgPSBtZW1hZGRyOworCWRldi0+bWVtX2VuZCA9IG1lbWFkZHIgKyBBUkxBTl9TSE1FTV9TSVpFLTE7CisKKwlpZiAoZGV2LT5pcnEgPCAyKQorCXsKKwkJUkVBRFNITShkZXYtPmlycSwgYXAtPmNhcmQtPmlycUxldmVsLCB1X2NoYXIpOworCX0gZWxzZSBpZiAoZGV2LT5pcnEgPT0gMikKKwkJZGV2LT5pcnEgPSA5OworCisJYXJsYW5fcmVhZF9jYXJkX2NvbmZpZ3VyYXRpb24oZGV2KTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3Byb2JlX2hlcmUiKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFybGFuX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwlpbnQgcmV0ID0gMDsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9vcGVuIik7CisKKwlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJmFybGFuX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQpCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZCAuXG4iLAorCQkJZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCXJldHVybiByZXQ7CisJfQorCisKKwlwcml2LT5iYWQgPSAwOworCXByaXYtPmxhc3RSZXNldCA9IDA7CisJcHJpdi0+cmVzZXQgPSAwOworCW1lbWNweV9mcm9taW8oZGV2LT5kZXZfYWRkciwgYXJsYW4tPmxhbkNhcmROb2RlSWQsIDYpOworCW1lbXNldChkZXYtPmJyb2FkY2FzdCwgMHhmZiwgNik7CisJZGV2LT50eF9xdWV1ZV9sZW4gPSB0eF9xdWV1ZV9sZW47CisJcHJpdi0+aW50ZXJydXB0X3Byb2Nlc3NpbmdfYWN0aXZlID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisKKwluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKworCXByaXYtPnJlZ2lzdHJhdGlvbkxvc3RDb3VudCA9IDA7CisJcHJpdi0+cmVnaXN0cmF0aW9uTGFzdFNlZW4gPSBqaWZmaWVzOworCXByaXYtPnR4TGFzdCA9IDA7CisJcHJpdi0+dHhfY29tbWFuZF9naXZlbiA9IDA7CisJcHJpdi0+cnhfY29tbWFuZF9naXZlbiA9IDA7CisJCisJcHJpdi0+cmVSZWdpc3RlckV4cCA9IDE7CisJcHJpdi0+dHhfbGFzdF9zZW50ID0gamlmZmllcyAtIDE7CisJcHJpdi0+dHhfbGFzdF9jbGVhcmVkID0gamlmZmllczsKKwlwcml2LT5Db25mLT53cml0ZUVFUFJPTSA9IDA7CisJcHJpdi0+Q29uZi0+cmVnaXN0cmF0aW9uSW50ZXJydXB0cyA9IDE7CisKKwlpbml0X3RpbWVyKCZwcml2LT50aW1lcik7CisJcHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAvIDEwOworCXByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCXByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJmFybGFuX3JlZ2lzdHJhdGlvbl90aW1lcjsJLyogdGltZXIgaGFuZGxlciAqLworCisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfUE9XRVJVUCB8IEFSTEFOX0NPTU1BTkRfTE9OR19XQUlUX05PVyk7CisJbWRlbGF5KDIwMCk7CisJYWRkX3RpbWVyKCZwcml2LT50aW1lcik7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9vcGVuIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgYXJsYW5fdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBhcmxhbiB0cmFuc21pdCB0aW1lZCBvdXQsIGtlcm5lbCBkZWNpZGVkXG4iLCBkZXYtPm5hbWUpOworCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLiAqLworCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9SRVNFVCk7CisJLy8gZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJLy8gbmV0aWZfc3RhcnRfcXVldWUgKGRldik7Cit9CisKKworc3RhdGljIGludCBhcmxhbl90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fdHgiKTsKKwkKKwlsZW5ndGggPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKwlidWYgPSBza2ItPmRhdGE7CisKKwlpZiAobGVuZ3RoICsgMHgxMiA+IDB4ODAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVFggUklORyBvdmVyZmxvdyBcbiIpOworCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCX0KKworCWlmIChhcmxhbl9od190eChkZXYsIGJ1ZiwgbGVuZ3RoKSA9PSAtMSkKKwkJZ290byBiYWRfZW5kOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlhcmxhbl9wcm9jZXNzX2ludGVycnVwdChkZXYpOworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3R4Iik7CisJcmV0dXJuIDA7CisKK2JhZF9lbmQ6CisJYXJsYW5fcHJvY2Vzc19pbnRlcnJ1cHQoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3R4Iik7CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgRG9Ob3RSZVRyYW5zbWl0Q3JhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChUWExBU1QoZGV2KS5sZW5ndGggPCBwcml2LT5Db25mLT5SZVRyYW5zbWl0UGFja2V0TWF4U2l6ZSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGlubGluZSBpbnQgRG9Ob3RXYWl0UmVUcmFuc21pdENyYXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoVFhMQVNUKGRldikubGVuZ3RoIDwgcHJpdi0+Q29uZi0+d2FpdFJlVHJhbnNtaXRQYWNrZXRNYXhTaXplKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFybGFuX3F1ZXVlX3JldHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fcXVldWVfcmV0cmFuc21pdCIpOworCisJaWYgKERvTm90V2FpdFJlVHJhbnNtaXRDcmFwKGRldikpCisJeworCQkgIGFybGFuX2Ryb3BfdHgoZGV2KTsKKwl9IGVsc2UKKwkJcHJpdi0+UmVUcmFuc21pdFJlcXVlc3RlZCsrOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fcXVldWVfcmV0cmFuc21pdCIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgUmV0cnlPckZhaWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiUmV0cnlPckZhaWwiKTsKKworCWlmIChwcml2LT5yZXRyYW5zbWlzc2lvbnMgPiBwcml2LT5Db25mLT5yZXRyaWVzIHx8CisJICAgIERvTm90UmVUcmFuc21pdENyYXAoZGV2KSkKKwl7CisJCWFybGFuX2Ryb3BfdHgoZGV2KTsKKwl9CisJZWxzZSBpZiAocHJpdi0+YmFkIDw9IHByaXYtPkNvbmYtPmZhc3RSZVRyYW5zQ291bnQpCisJeworCQlhcmxhbl9yZXRyYW5zbWl0X25vdyhkZXYpOworCX0KKwllbHNlIGFybGFuX3F1ZXVlX3JldHJhbnNtaXQoZGV2KTsKKworCUFSTEFOX0RFQlVHX0VYSVQoIlJldHJ5T3JGYWlsIik7Cit9CisKKworc3RhdGljIHZvaWQgYXJsYW5fdHhfZG9uZV9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fdHhfZG9uZV9pbnRlcnJ1cHQiKTsKKworCXByaXYtPnR4X2xhc3RfY2xlYXJlZCA9IGppZmZpZXM7CisJcHJpdi0+dHhfY29tbWFuZF9naXZlbiA9IDA7CisJc3dpdGNoIChzdGF0dXMpCisJeworCQljYXNlIDE6CisJCXsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQkJcHJpbnRrKCJhcmxhbiBpbnRyOiB0cmFuc21pdCBPS1xuIik7CisJCQlwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlwcml2LT5iYWQgPSAwOworCQkJcHJpdi0+cmVzZXQgPSAwOworCQkJcHJpdi0+cmV0cmFuc21pc3Npb25zID0gMDsKKwkJCWlmIChwcml2LT5Db25mLT50eF9kZWxheV9tcykKKwkJCXsKKwkJCQlwcml2LT50eF9kb25lX2RlbGF5ZWQgPSBqaWZmaWVzICsgKHByaXYtPkNvbmYtPnR4X2RlbGF5X21zICogSFopIC8gMTAwMCArIDE7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJVFhMQVNUKGRldikub2Zmc2V0ID0gMDsKKwkJCQlpZiAocHJpdi0+dHhMYXN0KQorCQkJCQlwcml2LT50eExhc3QgPSAwOworCQkJCWVsc2UgaWYgKFRYVEFJTChkZXYpLm9mZnNldCkKKwkJCQkJcHJpdi0+dHhMYXN0ID0gMTsKKwkJCQlpZiAoVFhMQVNUKGRldikub2Zmc2V0KQorCQkJCXsKKwkJCQkJYXJsYW5fcmV0cmFuc21pdF9ub3coZGV2KTsKKwkJCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQkJfQorCQkJCWlmICghVFhIRUFEKGRldikub2Zmc2V0IHx8ICFUWFRBSUwoZGV2KS5vZmZzZXQpCisJCQkJeworCQkJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKwkJCisJCWNhc2UgMjoKKwkJeworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCQlwcmludGsoImFybGFuIGludHI6IHRyYW5zbWl0IHRpbWVkIG91dFxuIik7CisJCQlwcml2LT5iYWQgKz0gMTsKKwkJCS8vYXJsYW5fcXVldWVfcmV0cmFuc21pdChkZXYpOworCQkJUmV0cnlPckZhaWwoZGV2KTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIDM6CisJCXsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQkJcHJpbnRrKCJhcmxhbiBpbnRyOiB0cmFuc21pdCBtYXggcmV0cmllc1xuIik7CisJCQlwcml2LT5iYWQgKz0gMTsKKwkJCXByaXYtPnJlc2V0ID0gMDsKKwkJCS8vYXJsYW5fcXVldWVfcmV0cmFuc21pdChkZXYpOworCQkJUmV0cnlPckZhaWwoZGV2KTsKKwkJfQorCQlicmVhazsKKwkJCisJCWNhc2UgNDoKKwkJeworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCQlwcmludGsoImFybGFuIGludHI6IHRyYW5zbWl0IGFib3J0ZWRcbiIpOworCQkJcHJpdi0+YmFkICs9IDE7CisJCQlhcmxhbl9xdWV1ZV9yZXRyYW5zbWl0KGRldik7CisJCQkvL1JldHJ5T3JGYWlsKGRldik7CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSA1OgorCQl7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJCXByaW50aygiYXJsYW4gaW50cjogdHJhbnNtaXQgbm90IHJlZ2lzdGVyZWRcbiIpOworCQkJcHJpdi0+YmFkICs9IDE7CisJCQkvL2RlYnVnPTEwMTsKKwkJCWFybGFuX3F1ZXVlX3JldHJhbnNtaXQoZGV2KTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIDY6CisJCXsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pIAorCQkJCXByaW50aygiYXJsYW4gaW50cjogdHJhbnNtaXQgZGVzdGluYXRpb24gZnVsbFxuIik7CisJCQlwcml2LT5iYWQgKz0gMTsKKwkJCXByaXYtPnJlc2V0ID0gMDsKKwkJCS8vYXJsYW5fZHJvcF90eChkZXYpOworCQkJYXJsYW5fcXVldWVfcmV0cmFuc21pdChkZXYpOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgNzoKKwkJeworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCQlwcmludGsoImFybGFuIGludHI6IHRyYW5zbWl0IHVua25vd24gYWNrXG4iKTsKKwkJCXByaXYtPmJhZCArPSAxOworCQkJcHJpdi0+cmVzZXQgPSAwOworCQkJYXJsYW5fcXVldWVfcmV0cmFuc21pdChkZXYpOworCQl9CisJCWJyZWFrOworCQkKKwkJY2FzZSA4OgorCQl7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJCXByaW50aygiYXJsYW4gaW50cjogdHJhbnNtaXQgZGVzdCBtYWlsIGJveCBmdWxsXG4iKTsKKwkJCXByaXYtPmJhZCArPSAxOworCQkJcHJpdi0+cmVzZXQgPSAwOworCQkJLy9hcmxhbl9kcm9wX3R4KGRldik7CisJCQlhcmxhbl9xdWV1ZV9yZXRyYW5zbWl0KGRldik7CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSA5OgorCQl7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJCXByaW50aygiYXJsYW4gaW50cjogdHJhbnNtaXQgcm9vdCBkZXN0IG5vdCByZWcuXG4iKTsKKwkJCXByaXYtPmJhZCArPSAxOworCQkJcHJpdi0+cmVzZXQgPSAxOworCQkJLy9hcmxhbl9kcm9wX3R4KGRldik7CisJCQlhcmxhbl9xdWV1ZV9yZXRyYW5zbWl0KGRldik7CisJCX0KKwkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJhcmxhbiBpbnRyOiB0cmFuc21pdCBzdGF0dXMgdW5rbm93blxuIik7CisJCQlwcml2LT5iYWQgKz0gMTsKKwkJCXByaXYtPnJlc2V0ID0gMTsKKwkJCWFybGFuX2Ryb3BfdHgoZGV2KTsKKwkJfQorCX0KKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3R4X2RvbmVfaW50ZXJydXB0Iik7Cit9CisKKworc3RhdGljIHZvaWQgYXJsYW5fcnhfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciByeFN0YXR1cywgdV9zaG9ydCByeE9mZnNldCwgdV9zaG9ydCBwa3RfbGVuKQoreworCWNoYXIgKnNrYnRtcDsKKwlpbnQgaSA9IDA7CisKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwlzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1ICpjb25mID0gcHJpdi0+Q29uZjsKKworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3J4X2ludGVycnVwdCIpOworCS8vIGJ5IHNwZWMsICAgbm90ICAgICAgICAgICAgICAgIFdSSVRFU0hNQihhcmxhbi0+cnhTdGF0dXMsMHgwMCk7CisJLy8gcHJvaGliaXRlZCBoZXJlICAgICAgICAgICAgICBhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9SWCk7CisKKwlpZiAocGt0X2xlbiA8IDEwIHx8IHBrdF9sZW4gPiAyMDQ4KQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGdvdCB0b28gc2hvcnQgb3IgbG9uZyBwYWNrZXQsIGxlbiAlZCBcbiIsIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCXJldHVybjsKKwl9CisJaWYgKHJ4T2Zmc2V0ICsgcGt0X2xlbiA+IDB4MjAwMCkKKwl7CisJCXByaW50aygiJXM6IGdvdCB0b28gbG9uZyBwYWNrZXQsIGxlbiAlZCBvZmZzZXQgJXhcbiIsIGRldi0+bmFtZSwgcGt0X2xlbiwgcnhPZmZzZXQpOworCQlyZXR1cm47CisJfQorCXByaXYtPmluX2J5dGVzICs9IHBrdF9sZW47CisJcHJpdi0+aW5fYnl0ZXMxMCArPSBwa3RfbGVuOworCWlmIChjb25mLT5tZWFzdXJlX3JhdGUgPCAxKQorCQljb25mLT5tZWFzdXJlX3JhdGUgPSAxOworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHByaXYtPmluX3RpbWUgKyBjb25mLT5tZWFzdXJlX3JhdGUgKiBIWikpCisJeworCQljb25mLT5pbl9zcGVlZCA9IHByaXYtPmluX2J5dGVzIC8gY29uZi0+bWVhc3VyZV9yYXRlOworCQlwcml2LT5pbl9ieXRlcyA9IDA7CisJCXByaXYtPmluX3RpbWUgPSBqaWZmaWVzOworCX0KKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT5pbl90aW1lMTAgKyBjb25mLT5tZWFzdXJlX3JhdGUgKiAxMCpIWikpCisJeworCQljb25mLT5pbl9zcGVlZDEwID0gcHJpdi0+aW5fYnl0ZXMxMCAvICgxMCAqIGNvbmYtPm1lYXN1cmVfcmF0ZSk7CisJCXByaXYtPmluX2J5dGVzMTAgPSAwOworCQlwcml2LT5pbl90aW1lMTAgPSBqaWZmaWVzOworCX0KKwlERUJVR1NITSgxLCAiYXJsYW4gcmN2IHBrdCByeFN0YXR1cz0gJWQgIiwgYXJsYW4tPnJ4U3RhdHVzLCB1X2NoYXIpOworCXN3aXRjaCAocnhTdGF0dXMpCisJeworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQl7CisJCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4gKi8KKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCURFQlVHU0hNKDUwLCAiYXJsYW4gcmVjdiBwa3Qgb2Zmcz0lZFxuIiwgYXJsYW4tPnJ4T2Zmc2V0LCB1X3Nob3J0KTsKKwkJCURFQlVHU0hNKDEsICJhcmxhbiByeEZybVR5cGUgPSAlZCBcbiIsIGFybGFuLT5yeEZybVR5cGUsIHVfY2hhcik7CisJCQlERUJVR1NITSgxLCBLRVJOX0lORk8gImFybGFuIHJ4IHNjcmFtYmxlZCA9ICVkIFxuIiwgYXJsYW4tPnNjcmFtYmxlZCwgdV9jaGFyKTsKKworCQkJLyogaGVyZSB3ZSBkbyBtdWx0aWNhc3QgZmlsdGVyaW5nIHRvIGF2b2lkIHNsb3cgOC1iaXQgbWVtY29weSAqLworI2lmZGVmIEFSTEFOX01VTFRJQ0FTVAorCQkJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgJiYKKwkJCQkhKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgJiYKKwkJCQlkZXYtPm1jX2xpc3QpCisJCQl7CisJCQkJY2hhciBod19kc3RfYWRkcls2XTsKKwkJCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwkJCQlpbnQgaTsKKworCQkJCW1lbWNweV9mcm9taW8oaHdfZHN0X2FkZHIsIGFybGFuLT51bHRpbWF0ZURlc3RBZGRyZXNzLCA2KTsKKwkJCQlpZiAoaHdfZHN0X2FkZHJbMF0gPT0gMHgwMSkKKwkJCQl7CisJCQkJCWlmIChtZGVidWcpCisJCQkJCQlpZiAoaHdfZHN0X2FkZHJbMV0gPT0gMHgwMCkKKwkJCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzIG1jYXN0IDB4MDEwMCBcbiIsIGRldi0+bmFtZSk7CisJCQkJCQllbHNlIGlmIChod19kc3RfYWRkclsxXSA9PSAweDQwKQorCQkJCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgbS9iY2FzdCAweDAxNDAgXG4iLCBkZXYtPm5hbWUpOworCQkJCQl3aGlsZSAoZG1pKQorCQkJCQl7CQkJCQkJCWlmIChkbWktPmRtaV9hZGRybGVuID09IDYpCisJCQkJCQl7CisJCQkJCQkJaWYgKGFybGFuX2RlYnVnICYgQVJMQU5fREVCVUdfSEVBREVSX0RVTVApCisJCQkJCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgbWNsICUyeDolMng6JTJ4OiUyeDolMng6JTJ4IFxuIiwgZGV2LT5uYW1lLAorCQkJCQkJCQkJCSBkbWktPmRtaV9hZGRyWzBdLCBkbWktPmRtaV9hZGRyWzFdLCBkbWktPmRtaV9hZGRyWzJdLAorCQkJCQkJCQkJCSBkbWktPmRtaV9hZGRyWzNdLCBkbWktPmRtaV9hZGRyWzRdLCBkbWktPmRtaV9hZGRyWzVdKTsKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJCQkJCQlpZiAoZG1pLT5kbWlfYWRkcltpXSAhPSBod19kc3RfYWRkcltpXSkKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCWlmIChpID09IDYpCisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWQgbXVsdGljYXN0IGFkZHJlc3MgbGVuZ3RoIGdpdmVuLlxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJCWRtaSA9IGRtaS0+bmV4dDsKKwkJCQkJfQorCQkJCQkvKiB3ZSByZWFjaCBoZXJlIGlmIG11bHRpY2FzdCBmaWx0ZXJpbmcgaXMgb24gYW5kIHBhY2tldCAKKwkJCQkJICogaXMgbXVsdGljYXN0IGFuZCBub3QgZm9yIHJlY2VpdmUgKi8KKwkJCQkJZ290byBlbmRfb2ZfaW50ZXJydXB0OworCQkJCX0KKwkJCX0KKyNlbmRpZgkJCQkvLyBBUkxBTl9NVUxUSUNBU1QKKwkJCS8qIG11bHRpY2FzdCBmaWx0ZXJpbmcgZW5kcyBoZXJlICovCisJCQlwa3RfbGVuICs9IEFSTEFOX0ZBS0VfSERSX0xFTjsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgNCk7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7CisJCQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tidG1wID0gc2tiX3B1dChza2IsIHBrdF9sZW4pOworCisJCQltZW1jcHlfZnJvbWlvKHNrYnRtcCArIEFSTEFOX0ZBS0VfSERSX0xFTiwgKChjaGFyIF9faW9tZW0gKikgYXJsYW4pICsgcnhPZmZzZXQsIHBrdF9sZW4gLSBBUkxBTl9GQUtFX0hEUl9MRU4pOworCQkJbWVtY3B5X2Zyb21pbyhza2J0bXAsIGFybGFuLT51bHRpbWF0ZURlc3RBZGRyZXNzLCA2KTsKKwkJCW1lbWNweV9mcm9taW8oc2tidG1wICsgNiwgYXJsYW4tPnJ4U3JjLCA2KTsKKwkJCVdSSVRFU0hNQihhcmxhbi0+cnhTdGF0dXMsIDB4MDApOworCQkJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfUlgpOworCisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX0hFQURFUl9EVU1QKQorCQkJeworCQkJCWNoYXIgaW1tZWREZXN0QWRkcmVzc1s2XTsKKwkJCQljaGFyIGltbWVkU3JjQWRkcmVzc1s2XTsKKwkJCQltZW1jcHlfZnJvbWlvKGltbWVkRGVzdEFkZHJlc3MsIGFybGFuLT5pbW1lZERlc3RBZGRyZXNzLCA2KTsKKwkJCQltZW1jcHlfZnJvbWlvKGltbWVkU3JjQWRkcmVzcywgYXJsYW4tPmltbWVkU3JjQWRkcmVzcywgNik7CisKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyB0ICUyeDolMng6JTJ4OiUyeDolMng6JTJ4IGYgJTJ4OiUyeDolMng6JTJ4OiUyeDolMnggaW1kICUyeDolMng6JTJ4OiUyeDolMng6JTJ4IGltcyAlMng6JTJ4OiUyeDolMng6JTJ4OiUyeFxuIiwgZGV2LT5uYW1lLAorCQkJCQkodW5zaWduZWQgY2hhcikgc2tidG1wWzBdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzFdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzJdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzNdLAorCQkJCQkodW5zaWduZWQgY2hhcikgc2tidG1wWzRdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzVdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzZdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzddLAorCQkJCQkodW5zaWduZWQgY2hhcikgc2tidG1wWzhdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzldLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzEwXSwgKHVuc2lnbmVkIGNoYXIpIHNrYnRtcFsxMV0sCisJCQkJCWltbWVkRGVzdEFkZHJlc3NbMF0sIGltbWVkRGVzdEFkZHJlc3NbMV0sIGltbWVkRGVzdEFkZHJlc3NbMl0sCisJCQkJCWltbWVkRGVzdEFkZHJlc3NbM10sIGltbWVkRGVzdEFkZHJlc3NbNF0sIGltbWVkRGVzdEFkZHJlc3NbNV0sCisJCQkJCWltbWVkU3JjQWRkcmVzc1swXSwgaW1tZWRTcmNBZGRyZXNzWzFdLCBpbW1lZFNyY0FkZHJlc3NbMl0sCisJCQkJCWltbWVkU3JjQWRkcmVzc1szXSwgaW1tZWRTcmNBZGRyZXNzWzRdLCBpbW1lZFNyY0FkZHJlc3NbNV0pOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfSEVBREVSX0RVTVApCisJCQkJaWYgKHNrYi0+cHJvdG9jb2wgIT0gMHg2MDggJiYgc2tiLT5wcm90b2NvbCAhPSAweDgpCisJCQkJeworCQkJCQlmb3IgKGkgPSAwOyBpIDw9IDIyOyBpKyspCisJCQkJCQlwcmludGsoIiUwMng6IiwgKHVfY2hhcikgc2tidG1wW2kgKyAxMl0pOworCQkJCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFybGFuIGtlcm5lbCBwa3QgdHlwZSB0cmFucyAleCBcbiIsIHNrYi0+cHJvdG9jb2wpOworCQkJCX0KKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCQlicmVhazsKKwkJCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgImFybGFuIGludHI6IHJlY2VpdmVkIHVua25vd24gc3RhdHVzXG4iKTsKKwkJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWJyZWFrOworCX0KKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9yeF9pbnRlcnJ1cHQiKTsKK30KKworc3RhdGljIHZvaWQgYXJsYW5fcHJvY2Vzc19pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwl1X2NoYXIgcnhTdGF0dXMgPSBSRUFEU0hNQihhcmxhbi0+cnhTdGF0dXMpOworCXVfY2hhciB0eFN0YXR1cyA9IFJFQURTSE1CKGFybGFuLT50eFN0YXR1cyk7CisJdV9zaG9ydCByeE9mZnNldCA9IFJFQURTSE1TKGFybGFuLT5yeE9mZnNldCk7CisJdV9zaG9ydCBwa3RfbGVuID0gUkVBRFNITVMoYXJsYW4tPnJ4TGVuZ3RoKTsKKwlpbnQgaW50ZXJydXB0X2NvdW50ID0gMDsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9wcm9jZXNzX2ludGVycnVwdCIpOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikgJnByaXYtPmludGVycnVwdF9wcm9jZXNzaW5nX2FjdGl2ZSkpCisJeworCQlpZiAoYXJsYW5fZGVidWcgJiBBUkxBTl9ERUJVR19DSEFJTl9MT0NLUykKKwkJCXByaW50ayhLRVJOX0VSUiAiaW50ZXJydXB0IGNoYWluIHJlZW50ZXJpbmcgXG4iKTsKKwkJZ290byBlbmRfaW50X3Byb2Nlc3M7CisJfQorCXdoaWxlICgocnhTdGF0dXMgfHwgdHhTdGF0dXMgfHwgcHJpdi0+aW50ZXJydXB0X2Fja19yZXF1ZXN0ZWQpCisJCQkmJiAoaW50ZXJydXB0X2NvdW50IDwgNSkpCisJeworCQlpZiAocnhTdGF0dXMpCisJCQlwcml2LT5sYXN0X3J4X2ludF9hY2tfdGltZSA9IGppZmZpZXM7CisKKwkJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfSU5UX0FDSyk7CisJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0lOVF9FTkFCTEUpOworCQkKKwkJSUZERUJVRyhBUkxBTl9ERUJVR19JTlRFUlJVUFQpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAgZ290IElSUSByeCAleCB0eCAleCBjb21tICV4IHJ4T2ZmICV4IHJ4TGVuICV4IFxuIiwKKwkJCQkJZGV2LT5uYW1lLCByeFN0YXR1cywgdHhTdGF0dXMsIFJFQURTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSksCisJCQkJCXJ4T2Zmc2V0LCBwa3RfbGVuKTsKKworCQlpZiAocnhTdGF0dXMgPT0gMCAmJiB0eFN0YXR1cyA9PSAwKQorCQl7CisJCQlpZiAocHJpdi0+aXJxX3Rlc3RfZG9uZSkKKwkJCXsKKwkJCQlpZiAoIXJlZ2lzdHJhdGlvbkJhZChkZXYpKQorCQkJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX0lOVEVSUlVQVCkgcHJpbnRrKEtFUk5fRVJSICIlcyB1bmtub3duIGludGVycnVwdChub3A/IHJlZ0xvc3QgPykgcmVhc29uIHR4ICVkIHJ4ICVkICIsCisJCQkJCQkJCQkJICAgIGRldi0+bmFtZSwgdHhTdGF0dXMsIHJ4U3RhdHVzKTsKKwkJCX0gZWxzZSB7CisJCQkJSUZERUJVRyhBUkxBTl9ERUJVR19JTlRFUlJVUFQpCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzIGlycSAkJWQgdGVzdCBPSyBcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCisJCQl9CisJCQlwcml2LT5pbnRlcnJ1cHRfYWNrX3JlcXVlc3RlZCA9IDA7CisJCQlnb3RvIGVuZHM7CisJCX0KKwkJaWYgKHR4U3RhdHVzICE9IDApCisJCXsKKwkJCVdSSVRFU0hNQihhcmxhbi0+dHhTdGF0dXMsIDB4MDApOworCQkJYXJsYW5fdHhfZG9uZV9pbnRlcnJ1cHQoZGV2LCB0eFN0YXR1cyk7CisJCQlnb3RvIGVuZHM7CisJCX0KKwkJaWYgKHJ4U3RhdHVzID09IDEgfHwgcnhTdGF0dXMgPT0gMikKKwkJewkJLyogYSBwYWNrZXQgd2FpdGluZyAqLworCQkJYXJsYW5fcnhfaW50ZXJydXB0KGRldiwgcnhTdGF0dXMsIHJ4T2Zmc2V0LCBwa3RfbGVuKTsKKwkJCWdvdG8gZW5kczsKKwkJfQorCQlpZiAocnhTdGF0dXMgPiAyICYmIHJ4U3RhdHVzIDwgMHhmZikKKwkJeworCQkJV1JJVEVTSE1CKGFybGFuLT5yeFN0YXR1cywgMHgwMCk7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzIHVua25vd24gcnhTdGF0dXMgcmVhc29uIHR4ICVkIHJ4ICVkICIsCisJCQkJZGV2LT5uYW1lLCB0eFN0YXR1cywgcnhTdGF0dXMpOworCQkJZ290byBlbmRzOworCQl9CisJCWlmIChyeFN0YXR1cyA9PSAweGZmKQorCQl7CisJCQlXUklURVNITUIoYXJsYW4tPnJ4U3RhdHVzLCAweDAwKTsKKwkJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX1JYKTsKKwkJCWlmIChyZWdpc3RyYXRpb25CYWQoZGV2KSkKKwkJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCQlpZiAoIXJlZ2lzdHJhdGlvbkJhZChkZXYpKQorCQkJeworCQkJCXByaXYtPnJlZ2lzdHJhdGlvbkxhc3RTZWVuID0gamlmZmllczsKKwkJCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJiAhcHJpdi0+dW5kZXJfcmVzZXQgJiYgIXByaXYtPnVuZGVyX2NvbmZpZykKKwkJCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJCX0KKwkJCWdvdG8gZW5kczsKKwkJfQorZW5kczoKKworCQlhcmxhbl9jb21tYW5kX3Byb2Nlc3MoZGV2KTsKKworCQlyeFN0YXR1cyA9IFJFQURTSE1CKGFybGFuLT5yeFN0YXR1cyk7CisJCXR4U3RhdHVzID0gUkVBRFNITUIoYXJsYW4tPnR4U3RhdHVzKTsKKwkJcnhPZmZzZXQgPSBSRUFEU0hNUyhhcmxhbi0+cnhPZmZzZXQpOworCQlwa3RfbGVuID0gUkVBRFNITVMoYXJsYW4tPnJ4TGVuZ3RoKTsKKworCisJCXByaXYtPmlycV90ZXN0X2RvbmUgPSAxOworCisJCWludGVycnVwdF9jb3VudCsrOworCX0KKwlwcml2LT5pbnRlcnJ1cHRfcHJvY2Vzc2luZ19hY3RpdmUgPSAwOworCitlbmRfaW50X3Byb2Nlc3M6CisJYXJsYW5fY29tbWFuZF9wcm9jZXNzKGRldik7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9wcm9jZXNzX2ludGVycnVwdCIpOworCXJldHVybjsKK30KKworc3RhdGljIGlycXJldHVybl90IGFybGFuX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisJdV9jaGFyIHJ4U3RhdHVzID0gUkVBRFNITUIoYXJsYW4tPnJ4U3RhdHVzKTsKKwl1X2NoYXIgdHhTdGF0dXMgPSBSRUFEU0hNQihhcmxhbi0+dHhTdGF0dXMpOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX2ludGVycnVwdCIpOworCisKKwlpZiAoIXJ4U3RhdHVzICYmICF0eFN0YXR1cykKKwkJcHJpdi0+aW50ZXJydXB0X2Fja19yZXF1ZXN0ZWQrKzsKKworCWFybGFuX3Byb2Nlc3NfaW50ZXJydXB0KGRldik7CisJCisJcHJpdi0+aXJxX3Rlc3RfZG9uZSA9IDE7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9pbnRlcnJ1cHQiKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK30KKworCitzdGF0aWMgaW50IGFybGFuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX2Nsb3NlIik7CisKKwlkZWxfdGltZXJfc3luYygmcHJpdi0+dGltZXIpOworCisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfUE9XRVJET1dOKTsKKworCUlGREVCVUcoQVJMQU5fREVCVUdfU1RBUlRVUCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogQ2xvc2luZyBkZXZpY2VcbiIsIGRldi0+bmFtZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9jbG9zZSIpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQVJMQU5fREVCVUdHSU5HCitzdGF0aWMgbG9uZyBhbGlnbkxvbmcodm9sYXRpbGUgdV9jaGFyICogcHRyKQoreworCWxvbmcgcmV0OworCW1lbWNweV9mcm9taW8oJnJldCwgKHZvaWQgKikgcHRyLCA0KTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4KKyAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IgY2xvc2VkLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXJsYW5fc3RhdGlzdGljcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fc3RhdGlzdGljcyIpOworCisJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGZyb20gdGhlIGRldmljZSByZWdpc3RlcnMuICovCisKKwlSRUFEU0hNKHByaXYtPnN0YXRzLmNvbGxpc2lvbnMsIGFybGFuLT5udW1SZVRyYW5zbWlzc2lvbnMsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMsIGFybGFuLT5udW1DUkNFcnJvcnMsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQsIGFybGFuLT5udW1GcmFtZXNEaXNjYXJkZWQsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzLCBhcmxhbi0+bnVtUlhCdWZmZXJPdmVyZmxvd3MsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycywgYXJsYW4tPm51bVJlY2VpdmVGcmFtZXNMb3N0LCB1X2ludCk7CisJUkVBRFNITShwcml2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycywgYXJsYW4tPm51bVJYT3ZlcnJ1bnMsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnJ4X3BhY2tldHMsIGFybGFuLT5udW1EYXRhZ3JhbXNSZWNlaXZlZCwgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMsIGFybGFuLT5udW1BYm9ydEVycm9ycywgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMsIGFybGFuLT5udW1TdGF0dXNUaW1lb3V0cywgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMudHhfZHJvcHBlZCwgYXJsYW4tPm51bURhdGFncmFtc0Rpc2NhcmRlZCwgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMudHhfZmlmb19lcnJvcnMsIGFybGFuLT5udW1UWFVuZGVycnVucywgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMudHhfcGFja2V0cywgYXJsYW4tPm51bURhdGFncmFtc1RyYW5zbWl0dGVkLCB1X2ludCk7CisJUkVBRFNITShwcml2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzLCBhcmxhbi0+bnVtSG9sZE9mZnMsIHVfaW50KTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3N0YXRpc3RpY3MiKTsKKworCXJldHVybiAmcHJpdi0+c3RhdHM7Cit9CisKKworc3RhdGljIHZvaWQgYXJsYW5fc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCXN0cnVjdCBhcmxhbl9jb25mX3N0cnUgKmNvbmYgPSBwcml2LT5Db25mOworCWludCBib2FyZF9jb25mX25lZWRlZCA9IDA7CisKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9zZXRfbXVsdGljYXN0Iik7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCXsKKwkJdW5zaWduZWQgY2hhciByZWNNb2RlOworCQlSRUFEU0hNKHJlY01vZGUsIGFybGFuLT5yZWNlaXZlTW9kZSwgdV9jaGFyKTsKKwkJY29uZi0+cmVjZWl2ZU1vZGUgPSAoQVJMQU5fUkNWX1BST01JU0MgfCBBUkxBTl9SQ1ZfQ09OVFJPTCk7CisJCWlmIChjb25mLT5yZWNlaXZlTW9kZSAhPSByZWNNb2RlKQorCQkJYm9hcmRfY29uZl9uZWVkZWQgPSAxOworCX0KKwllbHNlCisJeworCQkvKiB0dXJuIG9mZiBwcm9taXNjdW91cyBtb2RlICAqLworCQl1bnNpZ25lZCBjaGFyIHJlY01vZGU7CisJCVJFQURTSE0ocmVjTW9kZSwgYXJsYW4tPnJlY2VpdmVNb2RlLCB1X2NoYXIpOworCQljb25mLT5yZWNlaXZlTW9kZSA9IEFSTEFOX1JDVl9DTEVBTiB8IEFSTEFOX1JDVl9DT05UUk9MOworCQlpZiAoY29uZi0+cmVjZWl2ZU1vZGUgIT0gcmVjTW9kZSkKKwkJCWJvYXJkX2NvbmZfbmVlZGVkID0gMTsKKwl9CisJaWYgKGJvYXJkX2NvbmZfbmVlZGVkKQorCQlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9DT05GKTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3NldF9tdWx0aWNhc3QiKTsKK30KKworCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBhcmxhbl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBlcnI7CisJaW50IG07CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fcHJvYmUiKTsKKworCWlmIChhcmxhbnNfZm91bmQgPT0gTUFYX0FSTEFOUykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwkvKiAKKwkgKiBSZXNlcnZlIHNwYWNlIGZvciBsb2NhbCBkYXRhIGFuZCBhIGNvcHkgb2YgdGhlIHNoYXJlZCBtZW1vcnkKKwkgKiB0aGF0IGlzIHVzZWQgYnkgdGhlIC9wcm9jIGludGVyZmFjZS4KKwkgKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGFybGFuX3ByaXZhdGUpCisJCQkgICAgICsgc2l6ZW9mKHN0cnVjdCBhcmxhbl9zaG1lbSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQkKKwkJaWYgKGRldi0+bWVtX3N0YXJ0KSB7CisJCQlpZiAoYXJsYW5fcHJvYmVfaGVyZShkZXYsIGRldi0+bWVtX3N0YXJ0KSA9PSAwKQorCQkJCWdvdG8gZm91bmQ7CisJCQlnb3RvIG5vdF9mb3VuZDsKKwkJfQorCQkJCisJfQorCisKKwlmb3IgKG0gPSAoaW50KXBoeXNfdG9fdmlydChsYXN0Rm91bmRBdCkgKyBBUkxBTl9TSE1FTV9TSVpFOyAKKwkgICAgIG0gPD0gKGludClwaHlzX3RvX3ZpcnQoMHhERTAwMCk7IAorCSAgICAgbSArPSBBUkxBTl9TSE1FTV9TSVpFKQorCXsKKwkJaWYgKGFybGFuX3Byb2JlX2hlcmUoZGV2LCBtKSA9PSAwKQorCQl7CisJCQlsYXN0Rm91bmRBdCA9IChpbnQpdmlydF90b19waHlzKCh2b2lkKiltKTsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlpZiAobGFzdEZvdW5kQXQgPT0gMHhiZTAwMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJhcmxhbjogTm8gQXJsYW4gZGV2aWNlcyBmb3VuZCBcbiIpOworCisgbm90X2ZvdW5kOgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKyBmb3VuZDoKKwllcnIgPSBhcmxhbl9zZXR1cF9kZXZpY2UoZGV2LCBhcmxhbnNfZm91bmQpOworCWlmIChlcnIpCisJCWRldiA9IEVSUl9QVFIoZXJyKTsKKwllbHNlIGlmICghYXJsYW5zX2ZvdW5kKyspCisJCXByaW50ayhLRVJOX0lORk8gIkFybGFuIGRyaXZlciAlc1xuIiwgYXJsYW5fdmVyc2lvbik7CisKKwlyZXR1cm4gZGV2OworfQorCisjaWZkZWYgIE1PRFVMRQoraW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGkgPSAwOworCisJQVJMQU5fREVCVUdfRU5UUlkoImluaXRfbW9kdWxlIik7CisKKwlpZiAoY2hhbm5lbFNldCAhPSBjaGFubmVsU2V0VU5LTk9XTiB8fCBjaGFubmVsTnVtYmVyICE9IGNoYW5uZWxOdW1iZXJVTktOT1dOIHx8IHN5c3RlbUlkICE9IHN5c3RlbUlkVU5LTk9XTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0FSTEFOUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhcmxhbl9wcm9iZShpKTsKKworCQlpZiAoSVNfRVJSKGRldikpIAorCQkJcmV0dXJuIFBUUl9FUlIoZGV2KTsKKwl9CisJaW5pdF9hcmxhbl9wcm9jKCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiQXJsYW4gZHJpdmVyICVzXG4iLCBhcmxhbl92ZXJzaW9uKTsKKwlBUkxBTl9ERUJVR19FWElUKCJpbml0X21vZHVsZSIpOworCXJldHVybiAwOworfQorCisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJjbGVhbnVwX21vZHVsZSIpOworCisJSUZERUJVRyhBUkxBTl9ERUJVR19TSFVURE9XTikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXJsYW46IHVubG9hZGluZyBtb2R1bGVcbiIpOworCisJY2xlYW51cF9hcmxhbl9wcm9jKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0FSTEFOUzsgaSsrKQorCXsKKwkJZGV2ID0gYXJsYW5fZGV2aWNlW2ldOworCQlpZiAoZGV2KSB7CisJCQlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9QT1dFUkRPV04gKTsKKworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbih2aXJ0X3RvX3BoeXMoKHZvaWQgKikgZGV2LT5tZW1fc3RhcnQpLCAKKwkJCQkJICAgQVJMQU5fU0hNRU1fU0laRSk7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJYXJsYW5fZGV2aWNlW2ldID0gTlVMTDsKKwkJfQorCX0KKworCUFSTEFOX0RFQlVHX0VYSVQoImNsZWFudXBfbW9kdWxlIik7Cit9CisKKworI2VuZGlmCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi1wcm9jLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi1wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjY2E1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLXByb2MuYwpAQCAtMCwwICsxLDEyNjIgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJhcmxhbi5oIgorCisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCisvKiB2b2lkIGVuYWJsZVJlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CisqLworCisKKworI2RlZmluZSBBUkxBTl9TVFJfU0laRSAJMHgyZmYwCisjZGVmaW5lIERFVl9BUkxBTl9JTkZPIAkxCisjZGVmaW5lIERFVl9BUkxBTiAJMQorI2RlZmluZSBTQVJMRyh0eXBlLHZhcikge1wKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvK3BvcywgIiVzXHQ9XHQweCV4XG4iLCAjdmFyLCBSRUFEU0hNQihwcml2YS0+Y2FyZC0+dmFyKSk7CVwKKwl9CisKKyNkZWZpbmUgU0FSTEJOKHR5cGUsdmFyLG5uKSB7XAorCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8rcG9zLCAiJXNcdD1cdDB4IiwjdmFyKTtcCisJZm9yIChpPTA7IGkgPCBubjsgaSsrICkgcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbytwb3MsICIlMDJ4IixSRUFEU0hNQihwcml2YS0+Y2FyZC0+dmFyW2ldKSk7XAorCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8rcG9zLCAiXG4iKTsJXAorCX0KKworI2RlZmluZSBTQVJMQk5wbG4odHlwZSx2YXIsbm4pIHtcCisJZm9yIChpPTA7IGkgPCBubjsgaSsrICkgcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbytwb3MsICIlMDJ4IixSRUFEU0hNQihwcml2YS0+Y2FyZC0+dmFyW2ldKSk7XAorCX0KKworI2RlZmluZSBTQVJMU1RSKHZhcixubikge1wKKwljaGFyIHRtcFN0cls0MDBdO1wKKwlpbnQgIHRtcExuID0gbm47XAorCWlmIChubiA+IDM5OSApIHRtcExuID0gMzk5OyBcCisJbWVtY3B5KHRtcFN0ciwoY2hhciAqKSBwcml2YS0+Y29uZi0+dmFyLHRtcExuKTtcCisJdG1wU3RyW3RtcExuXSA9IDA7IFwKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvK3BvcywgIiVzXHQ9XHQlcyBcbiIsI3Zhcixwcml2YS0+Y29uZi0+dmFyKTtcCisJfQorCisjZGVmaW5lIFNBUkxVQyh2YXIpICAJU0FSTEcodV9jaGFyLCB2YXIpCisjZGVmaW5lIFNBUkxVQ04odmFyLG5uKSBTQVJMQk4odV9jaGFyLHZhciwgbm4pCisjZGVmaW5lIFNBUkxVUyh2YXIpCVNBUkxHKHVfc2hvcnQsIHZhcikKKyNkZWZpbmUgU0FSTFVTTih2YXIsbm4pCVNBUkxCTih1X3Nob3J0LHZhciwgbm4pCisjZGVmaW5lIFNBUkxVSSh2YXIpCVNBUkxHKHVfaW50LCB2YXIpCisKKyNkZWZpbmUgU0FSTFVTQSh2YXIpIHtcCisJdV9zaG9ydCB0bXBWYXI7XAorCW1lbWNweSgmdG1wVmFyLCAoc2hvcnQgKikgcHJpdmEtPmNvbmYtPnZhciwyKTsgXAorCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8rcG9zLCAiJXNcdD1cdDB4JXhcbiIsI3ZhciwgdG1wVmFyKTtcCit9CisKKyNkZWZpbmUgU0FSTFVJQSh2YXIpIHtcCisJdV9pbnQgdG1wVmFyO1wKKwltZW1jcHkoJnRtcFZhciwgKGludCogKXByaXZhLT5jb25mLT52YXIsNCk7IFwKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvK3BvcywgIiVzXHQ9XHQweCV4XG4iLCN2YXIsIHRtcFZhcik7XAorfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICphcmxhbl9kaWFnbm9zdGljX2luZm9fc3RyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwl1X2NoYXIgZGlhZ25vc3RpY0luZm87CisKKwlSRUFEU0hNKGRpYWdub3N0aWNJbmZvLCBhcmxhbi0+ZGlhZ25vc3RpY0luZm8sIHVfY2hhcik7CisKKwlzd2l0Y2ggKGRpYWdub3N0aWNJbmZvKQorCXsKKwkJY2FzZSAweEZGOgorCQkJcmV0dXJuICJEaWFnbm9zdGljIGluZm8gaXMgT0siOworCQljYXNlIDB4RkU6CisJCQlyZXR1cm4gIkVSUk9SIEVQUk9NIENoZWNrc3VtIGVycm9yICI7CisJCWNhc2UgMHhGRDoKKwkJCXJldHVybiAiRVJST1IgTG9jYWwgUmFtIFRlc3QgRmFpbGVkICI7CisJCWNhc2UgMHhGQzoKKwkJCXJldHVybiAiRVJST1IgU0NDIGZhaWx1cmUgIjsKKwkJY2FzZSAweEZCOgorCQkJcmV0dXJuICJFUlJPUiBCYWNrQm9uZSBmYWlsdXJlICI7CisJCWNhc2UgMHhGQToKKwkJCXJldHVybiAiRVJST1IgdHJhbnNjZWl2ZXIgbm90IGZvdW5kICI7CisJCWNhc2UgMHhGOToKKwkJCXJldHVybiAiRVJST1Igbm8gbW9yZSBhZGRyZXNzIHNwYWNlICI7CisJCWNhc2UgMHhGODoKKwkJCXJldHVybiAiRVJST1IgQ2hlY2tzdW0gZXJyb3IgICI7CisJCWNhc2UgMHhGNzoKKwkJCXJldHVybiAiRVJST1IgTWlzc2luZyBTUyBDb2RlIjsKKwkJY2FzZSAweEY2OgorCQkJcmV0dXJuICJFUlJPUiBJbnZhbGlkIGNvbmZpZyBmb3JtYXQiOworCQljYXNlIDB4RjU6CisJCQlyZXR1cm4gIkVSUk9SIFJlc2VydmVkIGVycm9yY29kZSBGNSI7CisJCWNhc2UgMHhGNDoKKwkJCXJldHVybiAiRVJST1IgSW52YWxpZCBzcHJlYWRpbmcgY29kZS9jaGFubmVsIG51bWJlciI7CisJCWNhc2UgMHhGMzoKKwkJCXJldHVybiAiRVJST1IgTG9hZCBDb2RlIEVycm9yIjsKKwkJY2FzZSAweEYyOgorCQkJcmV0dXJuICJFUlJPUiBSZXNlcnZlciBlcnJvcmNvZGUgRjIgIjsKKwkJY2FzZSAweEYxOgorCQkJcmV0dXJuICJFUlJPUiBJbnZhbGlkIGNvbW1hbmQgcmVjZWl2ZWMgYnkgTEFOIGNhcmQgIjsKKwkJY2FzZSAweEYwOgorCQkJcmV0dXJuICJFUlJPUiBJbnZhbGlkIHBhcmFtZXRlciBmb3VuZCBpbiBjb21tYW5kICI7CisJCWNhc2UgMHhFRjoKKwkJCXJldHVybiAiRVJST1IgT24tY2hpcCB0aW1lciBmYWlsdXJlICI7CisJCWNhc2UgMHhFRToKKwkJCXJldHVybiAiRVJST1IgVDQxMCB0aW1lciBmYWlsdXJlICI7CisJCWNhc2UgMHhFRDoKKwkJCXJldHVybiAiRVJST1IgVG9vIE1hbnkgVHhFbmFibGUgY29tbWFuZHMgIjsKKwkJY2FzZSAweEVDOgorCQkJcmV0dXJuICJFUlJPUiBFRVBST00gZXJyb3Igb24gcmFkaW8gbW9kdWxlICI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIkVSUk9SIHVua25vd24gRGlhZ25vc3RpYyBpbmZvIHJlcGx5IGNvZGUgIjsKKwkgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmFybGFuX2hhcmR3YXJlX3R5cGVfc3RyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdV9jaGFyIGhhcmR3YXJlVHlwZTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKworCVJFQURTSE0oaGFyZHdhcmVUeXBlLCBhcmxhbi0+aGFyZHdhcmVUeXBlLCB1X2NoYXIpOworCXN3aXRjaCAoaGFyZHdhcmVUeXBlKQorCXsKKwkJY2FzZSAweDAwOgorCQkJcmV0dXJuICJ0eXBlIEE0NTAiOworCQljYXNlIDB4MDE6CisJCQlyZXR1cm4gInR5cGUgQTY1MCAiOworCQljYXNlIDB4MDQ6CisJCQlyZXR1cm4gInR5cGUgVE1BIGNvcHJvYyI7CisJCWNhc2UgMHgwRDoKKwkJCXJldHVybiAidHlwZSBBNjUwRSAiOworCQljYXNlIDB4MTg6CisJCQlyZXR1cm4gInR5cGUgVE1BIGNvcHJvYyBBdXN0cmFsaWFuIjsKKwkJY2FzZSAweDE5OgorCQkJcmV0dXJuICJ0eXBlIEE2NTBBICI7CisJCWNhc2UgMHgyNjoKKwkJCXJldHVybiAidHlwZSBUTUEgY29wcm9jIEV1cm9wZWFuIjsKKwkJY2FzZSAweDJFOgorCQkJcmV0dXJuICJ0eXBlIEE2NTUgIjsKKwkJY2FzZSAweDJGOgorCQkJcmV0dXJuICJ0eXBlIEE2NTVBICI7CisJCWNhc2UgMHgzMDoKKwkJCXJldHVybiAidHlwZSBBNjU1RSAiOworCQljYXNlIDB4MEI6CisJCQlyZXR1cm4gInR5cGUgQTY3MCAiOworCQljYXNlIDB4MEM6CisJCQlyZXR1cm4gInR5cGUgQTY3MEUgIjsKKwkJY2FzZSAweDJEOgorCQkJcmV0dXJuICJ0eXBlIEE2NzBBICI7CisJCWNhc2UgMHgwRjoKKwkJCXJldHVybiAidHlwZSBBNDExVCI7CisJCWNhc2UgMHgxNjoKKwkJCXJldHVybiAidHlwZSBBNDExVEEiOworCQljYXNlIDB4MUI6CisJCQlyZXR1cm4gInR5cGUgQTQ0MFQiOworCQljYXNlIDB4MUM6CisJCQlyZXR1cm4gInR5cGUgQTQxMlQiOworCQljYXNlIDB4MUU6CisJCQlyZXR1cm4gInR5cGUgQTQxMlRBIjsKKwkJY2FzZSAweDIyOgorCQkJcmV0dXJuICJ0eXBlIEE0MTFURSI7CisJCWNhc2UgMHgyNDoKKwkJCXJldHVybiAidHlwZSBBNDEyVEUiOworCQljYXNlIDB4Mjc6CisJCQlyZXR1cm4gInR5cGUgQTY3MVQgIjsKKwkJY2FzZSAweDI5OgorCQkJcmV0dXJuICJ0eXBlIEE2NzFUQSAiOworCQljYXNlIDB4MkI6CisJCQlyZXR1cm4gInR5cGUgQTY3MVRFICI7CisJCWNhc2UgMHgzMToKKwkJCXJldHVybiAidHlwZSBBNDE1VCAiOworCQljYXNlIDB4MzM6CisJCQlyZXR1cm4gInR5cGUgQTQxNVRBICI7CisJCWNhc2UgMHgzNToKKwkJCXJldHVybiAidHlwZSBBNDE1VEUgIjsKKwkJY2FzZSAweDM3OgorCQkJcmV0dXJuICJ0eXBlIEE2NzIiOworCQljYXNlIDB4Mzk6CisJCQlyZXR1cm4gInR5cGUgQTY3MkEgIjsKKwkJY2FzZSAweDNCOgorCQkJcmV0dXJuICJ0eXBlIEE2NzJUIjsKKwkJY2FzZSAweDZCOgorCQkJcmV0dXJuICJ0eXBlIElDMjIwMCI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gInR5cGUgQTY3MlQiOworCX0KK30KKyNpZmRlZiBBUkxBTl9ERUJVR0dJTkcKK3N0YXRpYyB2b2lkIGFybGFuX3ByaW50X2RpYWdub3N0aWNfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXVfY2hhciBkaWFnbm9zdGljSW5mbzsKKwl1X3Nob3J0IGRpYWdub3N0aWNPZmZzZXQ7CisJdV9jaGFyIGhhcmR3YXJlVHlwZTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKworCS8vICBBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fcHJpbnRfZGlhZ25vc3RpY19pbmZvIik7CisKKwlpZiAoUkVBRFNITUIoYXJsYW4tPmNvbmZpZ3VyZWRTdGF0dXNGbGFnKSA9PSAwKQorCQlwcmludGsoIkFybGFuOiBDYXJkIE5PVCBjb25maWd1cmVkXG4iKTsKKwllbHNlCisJCXByaW50aygiQXJsYW46IENhcmQgaXMgY29uZmlndXJlZFxuIik7CisKKwlSRUFEU0hNKGRpYWdub3N0aWNJbmZvLCBhcmxhbi0+ZGlhZ25vc3RpY0luZm8sIHVfY2hhcik7CisJUkVBRFNITShkaWFnbm9zdGljT2Zmc2V0LCBhcmxhbi0+ZGlhZ25vc3RpY09mZnNldCwgdV9zaG9ydCk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgYXJsYW5fZGlhZ25vc3RpY19pbmZvX3N0cmluZyhkZXYpKTsKKworCWlmIChkaWFnbm9zdGljSW5mbyAhPSAweGZmKQorCQlwcmludGsoIiVzIGFybGFuOiBEaWFnbm9zdGljIE9mZnNldCAlZCBcbiIsIGRldi0+bmFtZSwgZGlhZ25vc3RpY09mZnNldCk7CisKKwlwcmludGsoImFybGFuOiBMQU4gQ09ERSBJRCA9ICIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCURFQlVHU0hNKDEsICIlMDNkOiIsIGFybGFuLT5sYW5DYXJkTm9kZUlkW2ldLCB1X2NoYXIpOworCXByaW50aygiXG4iKTsKKworCXByaW50aygiYXJsYW46IEFybGFuIEJyb2FkQ2FzdCBhZGRyZXNzICA9ICIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCURFQlVHU0hNKDEsICIlMDNkOiIsIGFybGFuLT5icm9hZGNhc3RBZGRyZXNzW2ldLCB1X2NoYXIpOworCXByaW50aygiXG4iKTsKKworCVJFQURTSE0oaGFyZHdhcmVUeXBlLCBhcmxhbi0+aGFyZHdhcmVUeXBlLCB1X2NoYXIpOworCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBhcmxhbl9oYXJkd2FyZV90eXBlX3N0cmluZyhkZXYpKTsKKworCisJREVCVUdTSE0oMSwgImFybGFuOiBjaGFubmVsTnVtYmVyPSVkXG4iLCBhcmxhbi0+Y2hhbm5lbE51bWJlciwgdV9jaGFyKTsKKwlERUJVR1NITSgxLCAiYXJsYW46IGNoYW5uZWxTZXQ9JWRcbiIsIGFybGFuLT5jaGFubmVsU2V0LCB1X2NoYXIpOworCURFQlVHU0hNKDEsICJhcmxhbjogc3ByZWFkaW5nQ29kZT0lZFxuIiwgYXJsYW4tPnNwcmVhZGluZ0NvZGUsIHVfY2hhcik7CisJREVCVUdTSE0oMSwgImFybGFuOiByYWRpb05vZGVJZD0lZFxuIiwgYXJsYW4tPnJhZGlvTm9kZUlkLCB1X3Nob3J0KTsKKwlERUJVR1NITSgxLCAiYXJsYW46IFNJRAk9JWRcbiIsIGFybGFuLT5TSUQsIHVfc2hvcnQpOworCURFQlVHU0hNKDEsICJhcmxhbjogcnhPZmZzZXQ9JWRcbiIsIGFybGFuLT5yeE9mZnNldCwgdV9zaG9ydCk7CisKKwlERUJVR1NITSgxLCAiYXJsYW46IHJlZ2lzdHJhdGlvbiBtb2RlIGlzICVkXG4iLCBhcmxhbi0+cmVnaXN0cmF0aW9uTW9kZSwgdV9jaGFyKTsKKworCXByaW50aygiYXJsYW46IG5hbWU9ICIpOworCUlGREVCVUcoMSkKKwkKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwl7CisJCWNoYXIgYzsKKwkJUkVBRFNITShjLCBhcmxhbi0+bmFtZVtpXSwgY2hhcik7CisJCWlmIChjKQorCQkJcHJpbnRrKCIlYyIsIGMpOworCX0KKwlwcmludGsoIlxuIik7CisKKy8vICAgQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fcHJpbnRfZGlhZ25vc3RpY19pbmZvIik7CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCQlURVNUIAlNRU1PUlkJKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgYXJsYW5faHdfdGVzdF9tZW1vcnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1X2NoYXIgKnB0cjsKKwlpbnQgaTsKKwlpbnQgbWVtbGVuID0gc2l6ZW9mKHN0cnVjdCBhcmxhbl9zaG1lbSkgLSAweEY7CS8qIGF2b2lkIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl2b2xhdGlsZSBjaGFyICphcmxhbl9tZW0gPSAoY2hhciAqKSAoZGV2LT5tZW1fc3RhcnQpOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCWNoYXIgcGF0dGVybjsKKworCXB0ciA9IE5VTEw7CisKKwkvKiBob2xkIGNhcmQgaW4gcmVzZXQgc3RhdGUgKi8KKwlzZXRIYXJkd2FyZVJlc2V0KGRldik7CisKKwkvKiB0ZXN0IG1lbW9yeSAqLworCXBhdHRlcm4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBtZW1sZW47IGkrKykKKwkJV1JJVEVTSE0oYXJsYW5fbWVtW2ldLCAoKHVfY2hhcikgcGF0dGVybisrKSwgdV9jaGFyKTsKKworCXBhdHRlcm4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBtZW1sZW47IGkrKykKKwl7CisJCWNoYXIgcmVzOworCQlSRUFEU0hNKHJlcywgYXJsYW5fbWVtW2ldLCBjaGFyKTsKKwkJaWYgKHJlcyAhPSBwYXR0ZXJuKyspCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiQXJsYW4gZHJpdmVyIG1lbW9yeSB0ZXN0IDEgZmFpbGVkIFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlwYXR0ZXJuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbWVtbGVuOyBpKyspCisJCVdSSVRFU0hNKGFybGFuX21lbVtpXSwgfihwYXR0ZXJuKyspLCBjaGFyKTsKKworCXBhdHRlcm4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBtZW1sZW47IGkrKykKKwl7CisJCWNoYXIgcmVzOworCQlSRUFEU0hNKHJlcywgYXJsYW5fbWVtW2ldLCBjaGFyKTsKKwkJaWYgKHJlcyAhPSB+KHBhdHRlcm4rKykpCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiQXJsYW4gZHJpdmVyIG1lbW9yeSB0ZXN0IDIgZmFpbGVkIFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKiB6ZXJvIG1lbW9yeSAqLworCWZvciAoaSA9IDA7IGkgPCBtZW1sZW47IGkrKykKKwkJV1JJVEVTSE0oYXJsYW5fbWVtW2ldLCAweDAwLCBjaGFyKTsKKworCUlGREVCVUcoMSkgcHJpbnRrKEtFUk5fSU5GTyAiQXJsYW46IG1lbW9yeSB0ZXN0cyBva1xuIik7CisKKwkvKiBzZXQgcmVzZXQgZmxhZyBhbmQgdGhlbiByZWxlYXNlIHJlc2V0ICovCisJV1JJVEVTSE0oYXJsYW4tPnJlc2V0RmxhZywgMHhmZiwgdV9jaGFyKTsKKworCWNsZWFyQ2hhbm5lbEF0dGVudGlvbihkZXYpOworCWNsZWFySGFyZHdhcmVSZXNldChkZXYpOworCisJLyogd2FpdCBmb3IgcmVzZXQgZmxhZyB0byBiZWNvbWUgemVybywgd2UnbGwgd2FpdCBmb3IgdHdvIHNlY29uZHMgKi8KKwlpZiAoYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfTE9OR19XQUlUX05PVykpCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzIGFybGFuOiBmYWlsZWQgdG8gY29tZSBiYWNrIGZyb20gbWVtb3J5IHRlc3RcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJsYW5fc2V0dXBfY2FyZF9ieV9ib29rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdV9jaGFyIGlycUxldmVsLCBjb25maWd1cmVkU3RhdHVzRmxhZzsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKworLy8JQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3NldHVwX2NhcmQiKTsKKworCVJFQURTSE0oY29uZmlndXJlZFN0YXR1c0ZsYWcsIGFybGFuLT5jb25maWd1cmVkU3RhdHVzRmxhZywgdV9jaGFyKTsKKworCUlGREVCVUcoMTApCisJaWYgKGNvbmZpZ3VyZWRTdGF0dXNGbGFnICE9IDApCisJCUlGREVCVUcoMTApIHByaW50aygiYXJsYW46IENBUkQgSVMgQ09ORklHVVJFRFxuIik7CisJZWxzZQorCQlJRkRFQlVHKDEwKSBwcmludGsoImFybGFuOiBjYXJkIGlzIE5PVCBjb25maWd1cmVkXG4iKTsKKworCWlmICh0ZXN0TWVtb3J5IHx8IChSRUFEU0hNQihhcmxhbi0+ZGlhZ25vc3RpY0luZm8pICE9IDB4ZmYpKQorCQlpZiAoYXJsYW5faHdfdGVzdF9tZW1vcnkoZGV2KSkKKwkJCXJldHVybiAtMTsKKworCURFQlVHU0hNKDQsICJhcmxhbiBjb25maWd1cmVkU3RhdHVzID0gJWQgXG4iLCBhcmxhbi0+Y29uZmlndXJlZFN0YXR1c0ZsYWcsIHVfY2hhcik7CisJREVCVUdTSE0oNCwgImFybGFuIGRyaXZlciBkaWFnbm9zdGljOiAweCUyeFxuIiwgYXJsYW4tPmRpYWdub3N0aWNJbmZvLCB1X2NoYXIpOworCisJLyogaXNzdWUgbm9wIGNvbW1hbmQgLSBubyBpbnRlcnJ1cHQgKi8KKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9OT09QKTsKKwlpZiAoYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfV0FJVF9OT1cpICE9IDApCisJCXJldHVybiAtMTsKKworCUlGREVCVUcoNTApIHByaW50aygiMXN0IE5vb3Agc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkICEhXG4iKTsKKworCS8qIHRyeSB0byB0dXJuIG9uIHRoZSBhcmxhbiBpbnRlcnJ1cHRzICovCisJY2xlYXJDbGVhckludGVycnVwdChkZXYpOworCXNldENsZWFySW50ZXJydXB0KGRldik7CisJc2V0SW50ZXJydXB0RW5hYmxlKGRldik7CisKKwkvKiBpc3N1ZSBub3AgY29tbWFuZCAtIHdpdGggaW50ZXJydXB0ICovCisKKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9OT09QSU5UKTsKKwlpZiAoYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfV0FJVF9OT1cpICE9IDApCisJCXJldHVybiAtMTsKKworCisJSUZERUJVRyg1MCkgcHJpbnRrKCIybmQgTm9vcCBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQgISFcbiIpOworCisJUkVBRFNITShpcnFMZXZlbCwgYXJsYW4tPmlycUxldmVsLCB1X2NoYXIpCisJCisJaWYgKGlycUxldmVsICE9IGRldi0+aXJxKQorCXsKKwkJSUZERUJVRygxKSBwcmludGsoS0VSTl9XQVJOSU5HICJhcmxhbiBkaXAgc3dpdGNoZXMgc2V0IGlycSB0byAlZFxuIiwgaXJxTGV2ZWwpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJkZXZpY2UgZHJpdmVyIGlycSBzZXQgdG8gJWQgLSBkb2VzIG5vdCBtYXRjaFxuIiwgZGV2LT5pcnEpOworCQlkZXYtPmlycSA9IGlycUxldmVsOworCX0KKwllbHNlCisJCUlGREVCVUcoMikgcHJpbnRrKCJpcnEgbGV2ZWwgaXMgT0tcbiIpOworCisKKwlJRkRFQlVHKDMpIGFybGFuX3ByaW50X2RpYWdub3N0aWNfaW5mbyhkZXYpOworCisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfQ09ORik7CisKKwlSRUFEU0hNKGNvbmZpZ3VyZWRTdGF0dXNGbGFnLCBhcmxhbi0+Y29uZmlndXJlZFN0YXR1c0ZsYWcsIHVfY2hhcik7CisJaWYgKGNvbmZpZ3VyZWRTdGF0dXNGbGFnID09IDApCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhcmxhbiBjb25maWd1cmUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9MT05HX1dBSVRfTk9XKTsKKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9SWCk7CisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfTE9OR19XQUlUX05PVyk7CisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogYXJsYW4gZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGFybGFuX3ZlcnNpb24pOworCisvLwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9zZXR1cF9jYXJkIik7CisKKwlyZXR1cm4gMDsJCS8qIG5vIGVycm9ycyAqLworfQorI2VuZGlmCisKKyNpZmRlZiBBUkxBTl9QUk9DX0lOVEVSRkFDRQorI2lmZGVmIEFSTEFOX1BST0NfU0hNX0RVTVAKKworc3RhdGljIGNoYXIgYXJsYW5fZHJpdmVfaW5mb1tBUkxBTl9TVFJfU0laRV0gPSAiQTY1NVxuXDAiOworCitzdGF0aWMgaW50IGFybGFuX3N5c2N0bF9pbmZvKGN0bF90YWJsZSAqIGN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICogbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCBpOworCWludCByZXR2LCBwb3MsIGRldm51bTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdmEgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJcG9zID0gMDsKKwlpZiAod3JpdGUpCisJeworCQlwcmludGsoIndyaXJ0ZTogIik7CisJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykKKwkJCXByaW50aygiYWRpICV4IFxuIiwgYXJsYW5fZHJpdmVfaW5mb1tpXSk7CisJfQorCWlmIChjdGwtPnByb2NuYW1lID09IE5VTEwgfHwgYXJsYW5fZHJpdmVfaW5mbyA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiIHByb2NuYW1lIGlzIE5VTEwgaW4gc3lzY3RsX3RhYmxlIG9yIGFybGFuX2RyaXZlX2luZm8gaXMgTlVMTCBcbiBhdCBhcmxhbiBtb2R1bGVcbiAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkZXZudW0gPSBjdGwtPnByb2NuYW1lWzVdIC0gJzAnOworCWlmIChkZXZudW0gPCAwIHx8IGRldm51bSA+IE1BWF9BUkxBTlMgLSAxKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidG9vIHN0cmFuZ2UgZGV2bnVtIGluIHByb2NmcyBwYXJzZVxuICIpOworCQlyZXR1cm4gLTE7CisJfQorCWVsc2UgaWYgKGFybGFuX2RldmljZVtkZXZudW1dID09IE5VTEwpCisJeworCQlpZiAoY3RsLT5wcm9jbmFtZSkKKwkJCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICJcdCVzXG5cbiIsIGN0bC0+cHJvY25hbWUpOworCQlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiTm8gZGV2aWNlIGZvdW5kIGhlcmUgXG4iKTsKKwkJZ290byBmaW5hbDsKKwl9CisJZWxzZQorCQlwcml2YSA9IGFybGFuX2RldmljZVtkZXZudW1dLT5wcml2OworCisJaWYgKHByaXZhID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIgQ291bGQgbm90IGZpbmQgdGhlIGRldmljZSBwcml2YXRlIGluIGFybGFuIHByb2NzeXMsIGJhZFxuICIpOworCQlyZXR1cm4gLTE7CisJfQorCWRldiA9IGFybGFuX2RldmljZVtkZXZudW1dOworCisJbWVtY3B5X2Zyb21pbyhwcml2YS0+Y29uZiwgcHJpdmEtPmNhcmQsIHNpemVvZihzdHJ1Y3QgYXJsYW5fc2htZW0pKTsKKworCXBvcyA9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbywgIkFybGFuICBpbmZvIFxuIik7CisJLyogSGVhZGVyIFNpZ25hdHVyZSAqLworCVNBUkxTVFIodGV4dFJlZ2lvbiwgNDgpOworCVNBUkxVQyhyZXNldEZsYWcpOworCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICJkaWFnbm9zdGljSW5mb1x0PVx0JXMgXG4iLCBhcmxhbl9kaWFnbm9zdGljX2luZm9fc3RyaW5nKGRldikpOworCVNBUkxVQyhkaWFnbm9zdGljSW5mbyk7CisJU0FSTFVTKGRpYWdub3N0aWNPZmZzZXQpOworCVNBUkxVQ04oXzEsIDEyKTsKKwlTQVJMVUNOKGxhbkNhcmROb2RlSWQsIDYpOworCVNBUkxVQ04oYnJvYWRjYXN0QWRkcmVzcywgNik7CisJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgImhhcmR3YXJlVHlwZSA9XHQgICVzIFxuIiwgYXJsYW5faGFyZHdhcmVfdHlwZV9zdHJpbmcoZGV2KSk7CisJU0FSTFVDKGhhcmR3YXJlVHlwZSk7CisJU0FSTFVDKG1ham9ySGFyZHdhcmVWZXJzaW9uKTsKKwlTQVJMVUMobWlub3JIYXJkd2FyZVZlcnNpb24pOworCVNBUkxVQyhyYWRpb01vZHVsZSk7CisJU0FSTFVDKGRlZmF1bHRDaGFubmVsU2V0KTsKKwlTQVJMVUNOKF8yLCA0Nyk7CisKKwkvKiBDb250cm9sL1N0YXR1cyBCbG9jayAtIDB4MDA4MCAqLworCVNBUkxVQyhpbnRlcnJ1cHRJblByb2dyZXNzKTsKKwlTQVJMVUMoY250cmxSZWdJbWFnZSk7CisKKwlTQVJMVUNOKF8zLCAxNCk7CisJU0FSTFVDKGNvbW1hbmRCeXRlKTsKKwlTQVJMVUNOKGNvbW1hbmRQYXJhbWV0ZXIsIDE1KTsKKworCS8qIFJlY2VpdmUgU3RhdHVzIC0gMHgwMGEwICovCisJU0FSTFVDKHJ4U3RhdHVzKTsKKwlTQVJMVUMocnhGcm1UeXBlKTsKKwlTQVJMVVMocnhPZmZzZXQpOworCVNBUkxVUyhyeExlbmd0aCk7CisJU0FSTFVDTihyeFNyYywgNik7CisJU0FSTFVDKHJ4QnJvYWRjYXN0RmxhZyk7CisJU0FSTFVDKHJ4UXVhbGl0eSk7CisJU0FSTFVDKHNjcmFtYmxlZCk7CisJU0FSTFVDTihfNCwgMSk7CisKKwkvKiBUcmFuc21pdCBTdGF0dXMgLSAweDAwYjAgKi8KKwlTQVJMVUModHhTdGF0dXMpOworCVNBUkxVQyh0eEFja1F1YWxpdHkpOworCVNBUkxVQyhudW1SZXRyaWVzKTsKKwlTQVJMVUNOKF81LCAxNCk7CisJU0FSTFVDTihyZWdpc3RlcmVkUm91dGVyLCA2KTsKKwlTQVJMVUNOKGJhY2tib25lUm91dGVyLCA2KTsKKwlTQVJMVUMocmVnaXN0cmF0aW9uU3RhdHVzKTsKKwlTQVJMVUMoY29uZmlndXJlZFN0YXR1c0ZsYWcpOworCVNBUkxVQ04oXzYsIDEpOworCVNBUkxVQ04odWx0aW1hdGVEZXN0QWRkcmVzcywgNik7CisJU0FSTFVDTihpbW1lZERlc3RBZGRyZXNzLCA2KTsKKwlTQVJMVUNOKGltbWVkU3JjQWRkcmVzcywgNik7CisJU0FSTFVTKHJ4U2VxdWVuY2VOdW1iZXIpOworCVNBUkxVQyhhc3NpZ25lZExvY2FsdGFsa0FkZHJlc3MpOworCVNBUkxVQ04oXzcsIDI3KTsKKworCS8qIFN5c3RlbSBQYXJhbWV0ZXIgQmxvY2sgKi8KKworCS8qIC0gRHJpdmVyIFBhcmFtZXRlcnMgKE5vdmVsbCBTcGVjaWZpYykgKi8KKworCVNBUkxVUyh0eFRpbWVvdXQpOworCVNBUkxVUyh0cmFuc3BvcnRUaW1lKTsKKwlTQVJMVUNOKF84LCA0KTsKKworCS8qIC0gQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXJzICovCisJU0FSTFVDKGlycUxldmVsKTsKKwlTQVJMVUMoc3ByZWFkaW5nQ29kZSk7CisJU0FSTFVDKGNoYW5uZWxTZXQpOworCVNBUkxVQyhjaGFubmVsTnVtYmVyKTsKKwlTQVJMVVMocmFkaW9Ob2RlSWQpOworCVNBUkxVQ04oXzksIDIpOworCVNBUkxVQyhzY3JhbWJsaW5nRGlzYWJsZSk7CisJU0FSTFVDKHJhZGlvVHlwZSk7CisJU0FSTFVTKHJvdXRlcklkKTsKKwlTQVJMVUNOKF8xMCwgOSk7CisJU0FSTFVDKHR4QXR0ZW51YXRpb24pOworCVNBUkxVSUEoc3lzdGVtSWQpOworCVNBUkxVUyhnbG9iYWxDaGVja3N1bSk7CisJU0FSTFVDTihfMTEsIDQpOworCVNBUkxVUyhtYXhEYXRhZ3JhbVNpemUpOworCVNBUkxVUyhtYXhGcmFtZVNpemUpOworCVNBUkxVQyhtYXhSZXRyaWVzKTsKKwlTQVJMVUMocmVjZWl2ZU1vZGUpOworCVNBUkxVQyhwcmlvcml0eSk7CisJU0FSTFVDKHJvb3RPclJlcGVhdGVyKTsKKwlTQVJMVUNOKHNwZWNpZmllZFJvdXRlciwgNik7CisJU0FSTFVTKGZhc3RQb2xsUGVyaW9kKTsKKwlTQVJMVUMocG9sbERlY2F5KTsKKwlTQVJMVVNBKGZhc3RQb2xsRGVsYXkpOworCVNBUkxVQyhhcmxUaHJlc2hvbGQpOworCVNBUkxVQyhhcmxEZWNheSk7CisJU0FSTFVDTihfMTIsIDEpOworCVNBUkxVUyhzcGVjUm91dGVyVGltZW91dCk7CisJU0FSTFVDTihfMTMsIDUpOworCisJLyogU2NyYW1ibGVkIEFyZWEgKi8KKwlTQVJMVUlBKFNJRCk7CisJU0FSTFVDTihlbmNyeXB0aW9uS2V5LCAxMik7CisJU0FSTFVJQShfMTQpOworCVNBUkxVU0Eod2FpdFRpbWUpOworCVNBUkxVU0EobFBhcmFtZXRlcik7CisJU0FSTFVDTihfMTUsIDMpOworCVNBUkxVUyhoZWFkZXJTaXplKTsKKwlTQVJMVVMoc2VjdGlvbkNoZWNrc3VtKTsKKworCVNBUkxVQyhyZWdpc3RyYXRpb25Nb2RlKTsKKwlTQVJMVUMocmVnaXN0cmF0aW9uRmlsbCk7CisJU0FSTFVTKHBvbGxQZXJpb2QpOworCVNBUkxVUyhyZWZyZXNoUGVyaW9kKTsKKwlTQVJMU1RSKG5hbWUsIDE2KTsKKwlTQVJMVUNOKE5JRCwgNik7CisJU0FSTFVDKGxvY2FsVGFsa0FkZHJlc3MpOworCVNBUkxVQyhjb2RlRm9ybWF0KTsKKwlTQVJMVUMobnVtQ2hhbm5lbHMpOworCVNBUkxVQyhjaGFubmVsMSk7CisJU0FSTFVDKGNoYW5uZWwyKTsKKwlTQVJMVUMoY2hhbm5lbDMpOworCVNBUkxVQyhjaGFubmVsNCk7CisJU0FSTFVDTihTU0NvZGUsIDU5KTsKKworLyogICAgICBTQVJMVUNOKCBfMTYsIDB4MTQwKTsKKyAqLworCS8qIFN0YXRpc3RpY3MgQmxvY2sgLSAweDAzMDAgKi8KKwlTQVJMVUMoaG9zdGNwdUxvY2spOworCVNBUkxVQyhsYW5jcHVMb2NrKTsKKwlTQVJMVUNOKHJlc2V0VGltZSwgMTgpOworCVNBUkxVSUEobnVtRGF0YWdyYW1zVHJhbnNtaXR0ZWQpOworCVNBUkxVSUEobnVtUmVUcmFuc21pc3Npb25zKTsKKwlTQVJMVUlBKG51bUZyYW1lc0Rpc2NhcmRlZCk7CisJU0FSTFVJQShudW1EYXRhZ3JhbXNSZWNlaXZlZCk7CisJU0FSTFVJQShudW1EdXBsaWNhdGVSZWNlaXZlZEZyYW1lcyk7CisJU0FSTFVJQShudW1EYXRhZ3JhbXNEaXNjYXJkZWQpOworCVNBUkxVUyhtYXhOdW1SZVRyYW5zbWl0RGF0YWdyYW0pOworCVNBUkxVUyhtYXhOdW1SZVRyYW5zbWl0RnJhbWVzKTsKKwlTQVJMVVMobWF4TnVtQ29uc2VjdXRpdmVEdXBsaWNhdGVGcmFtZXMpOworCS8qIG1pc2FsaWduZWQgaGVyZSBzbyB3ZSBoYXZlIHRvIGdvIHRvIGNoYXJhY3RlcnMgKi8KKwlTQVJMVUlBKG51bUJ5dGVzVHJhbnNtaXR0ZWQpOworCVNBUkxVSUEobnVtQnl0ZXNSZWNlaXZlZCk7CisJU0FSTFVJQShudW1DUkNFcnJvcnMpOworCVNBUkxVSUEobnVtTGVuZ3RoRXJyb3JzKTsKKwlTQVJMVUlBKG51bUFib3J0RXJyb3JzKTsKKwlTQVJMVUlBKG51bVRYVW5kZXJydW5zKTsKKwlTQVJMVUlBKG51bVJYT3ZlcnJ1bnMpOworCVNBUkxVSUEobnVtSG9sZE9mZnMpOworCVNBUkxVSUEobnVtRnJhbWVzVHJhbnNtaXR0ZWQpOworCVNBUkxVSUEobnVtRnJhbWVzUmVjZWl2ZWQpOworCVNBUkxVSUEobnVtUmVjZWl2ZUZyYW1lc0xvc3QpOworCVNBUkxVSUEobnVtUlhCdWZmZXJPdmVyZmxvd3MpOworCVNBUkxVSUEobnVtRnJhbWVzRGlzY2FyZGVkQWRkck1pc21hdGNoKTsKKwlTQVJMVUlBKG51bUZyYW1lc0Rpc2NhcmRlZFNJRE1pc21hdGNoKTsKKwlTQVJMVUlBKG51bVBvbGxzVHJhbnNtaXN0dGVkKTsKKwlTQVJMVUlBKG51bVBvbGxBY2tub3dsZWRnZXMpOworCVNBUkxVSUEobnVtU3RhdHVzVGltZW91dHMpOworCVNBUkxVSUEobnVtTkFDS1JlY2VpdmVkKTsKKwlTQVJMVVMoYXV4Q21kKTsKKwlTQVJMVUNOKGR1bXBQdHIsIDQpOworCVNBUkxVQyhkdW1wVmFsKTsKKwlTQVJMVUMod2lyZVRlc3QpOworCQorCS8qIG5leHQgNCBzZWVtcyB0b28gbG9uZyBmb3IgcHJvY2ZzLCBvdmVyIHNpbmdsZSBwYWdlID8KKwlTQVJMVUNOKCBfMTcsIDB4ODYpOworCVNBUkxVQ04oIHR4QnVmZmVyLCAweDgwMCk7CisJU0FSTFVDTiggcnhCdWZmZXIsICAweDgwMCk7IAorCVNBUkxVQ04oIF8xOCwgMHgwYmZmKTsKKwkgKi8KKworCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICJyeFJpbmdcdD1cdDB4Iik7CisJZm9yIChpID0gMDsgaSA8IDB4NTA7IGkrKykKKwkJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgIiUwMngiLCAoKGNoYXIgKikgcHJpdmEtPmNvbmYpW3ByaXZhLT5jb25mLT5yeE9mZnNldCArIGldKTsKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiXG4iKTsKKworCVNBUkxVQyhjb25maWdTdGF0dXMpOworCVNBUkxVQyhfMjIpOworCVNBUkxVQyhwcm9nSU9DdHJsKTsKKwlTQVJMVUMoc2hhcmVNQmFzZSk7CisJU0FSTFVDKGNvbnRyb2xSZWdpc3Rlcik7CisKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiIHRvdGFsICVkIGNoYXJzXG4iLCBwb3MpOworCWlmIChjdGwpCisJCWlmIChjdGwtPnByb2NuYW1lKQorCQkJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgIiBkcml2ZXIgbmFtZSA6ICVzXG4iLCBjdGwtPnByb2NuYW1lKTsKK2ZpbmFsOgorCSpsZW5wID0gcG9zOworCisJaWYgKCF3cml0ZSkKKwkJcmV0diA9IHByb2NfZG9zdHJpbmcoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwllbHNlCisJeworCQkqbGVucCA9IDA7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHJldHY7Cit9CisKKworc3RhdGljIGludCBhcmxhbl9zeXNjdGxfaW5mbzE2MTcxOShjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICogbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCBpOworCWludCByZXR2LCBwb3MsIGRldm51bTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdmEgPSBOVUxMOworCisJcG9zID0gMDsKKwlkZXZudW0gPSBjdGwtPnByb2NuYW1lWzVdIC0gJzAnOworCWlmIChhcmxhbl9kZXZpY2VbZGV2bnVtXSA9PSBOVUxMKQorCXsKKwkJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgIk5vIGRldmljZSBmb3VuZCBoZXJlIFxuIik7CisJCWdvdG8gZmluYWw7CisJfQorCWVsc2UKKwkJcHJpdmEgPSBhcmxhbl9kZXZpY2VbZGV2bnVtXS0+cHJpdjsKKwlpZiAocHJpdmEgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiBDb3VsZCBub3QgZmluZCB0aGUgZGV2aWNlIHByaXZhdGUgaW4gYXJsYW4gcHJvY3N5cywgYmFkXG4gIik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtY3B5X2Zyb21pbyhwcml2YS0+Y29uZiwgcHJpdmEtPmNhcmQsIHNpemVvZihzdHJ1Y3QgYXJsYW5fc2htZW0pKTsKKwlTQVJMVUNOKF8xNiwgMHhDMCk7CisJU0FSTFVDTihfMTcsIDB4NkEpOworCVNBUkxVQ04oXzE4LCAxNCk7CisJU0FSTFVDTihfMTksIDB4ODYpOworCVNBUkxVQ04oXzIxLCAweDNmZCk7CisKK2ZpbmFsOgorCSpsZW5wID0gcG9zOworCXJldHYgPSBwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0dXJuIHJldHY7Cit9CisKK3N0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX2luZm90eFJpbmcoY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqIGxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgaTsKKwlpbnQgcmV0diwgcG9zLCBkZXZudW07CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXZhID0gTlVMTDsKKworCXBvcyA9IDA7CisJZGV2bnVtID0gY3RsLT5wcm9jbmFtZVs1XSAtICcwJzsKKwlpZiAoYXJsYW5fZGV2aWNlW2Rldm51bV0gPT0gTlVMTCkKKwl7CisJCSAgcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgIk5vIGRldmljZSBmb3VuZCBoZXJlIFxuIik7CisJCSAgZ290byBmaW5hbDsKKwl9CisJZWxzZQorCQlwcml2YSA9IGFybGFuX2RldmljZVtkZXZudW1dLT5wcml2OworCWlmIChwcml2YSA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiIENvdWxkIG5vdCBmaW5kIHRoZSBkZXZpY2UgcHJpdmF0ZSBpbiBhcmxhbiBwcm9jc3lzLCBiYWRcbiAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHlfZnJvbWlvKHByaXZhLT5jb25mLCBwcml2YS0+Y2FyZCwgc2l6ZW9mKHN0cnVjdCBhcmxhbl9zaG1lbSkpOworCVNBUkxCTnBsbih1X2NoYXIsIHR4QnVmZmVyLCAweDgwMCk7CitmaW5hbDoKKwkqbGVucCA9IHBvczsKKwlyZXR2ID0gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldHVybiByZXR2OworfQorCitzdGF0aWMgaW50IGFybGFuX3N5c2N0bF9pbmZvcnhSaW5nKGN0bF90YWJsZSAqIGN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGk7CisJaW50IHJldHYsIHBvcywgZGV2bnVtOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2YSA9IE5VTEw7CisKKwlwb3MgPSAwOworCWRldm51bSA9IGN0bC0+cHJvY25hbWVbNV0gLSAnMCc7CisJaWYgKGFybGFuX2RldmljZVtkZXZudW1dID09IE5VTEwpCisJeworCQkgIHBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICJObyBkZXZpY2UgZm91bmQgaGVyZSBcbiIpOworCQkgIGdvdG8gZmluYWw7CisJfSBlbHNlCisJCXByaXZhID0gYXJsYW5fZGV2aWNlW2Rldm51bV0tPnByaXY7CisJaWYgKHByaXZhID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIgQ291bGQgbm90IGZpbmQgdGhlIGRldmljZSBwcml2YXRlIGluIGFybGFuIHByb2NzeXMsIGJhZFxuICIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweV9mcm9taW8ocHJpdmEtPmNvbmYsIHByaXZhLT5jYXJkLCBzaXplb2Yoc3RydWN0IGFybGFuX3NobWVtKSk7CisJU0FSTEJOcGxuKHVfY2hhciwgcnhCdWZmZXIsIDB4ODAwKTsKK2ZpbmFsOgorCSpsZW5wID0gcG9zOworCXJldHYgPSBwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0dXJuIHJldHY7Cit9CisKK3N0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX2luZm8xOChjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGk7CisJaW50IHJldHYsIHBvcywgZGV2bnVtOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2YSA9IE5VTEw7CisKKwlwb3MgPSAwOworCWRldm51bSA9IGN0bC0+cHJvY25hbWVbNV0gLSAnMCc7CisJaWYgKGFybGFuX2RldmljZVtkZXZudW1dID09IE5VTEwpCisJeworCQlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiTm8gZGV2aWNlIGZvdW5kIGhlcmUgXG4iKTsKKwkJZ290byBmaW5hbDsKKwl9CisJZWxzZQorCQlwcml2YSA9IGFybGFuX2RldmljZVtkZXZudW1dLT5wcml2OworCWlmIChwcml2YSA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiIENvdWxkIG5vdCBmaW5kIHRoZSBkZXZpY2UgcHJpdmF0ZSBpbiBhcmxhbiBwcm9jc3lzLCBiYWRcbiAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHlfZnJvbWlvKHByaXZhLT5jb25mLCBwcml2YS0+Y2FyZCwgc2l6ZW9mKHN0cnVjdCBhcmxhbl9zaG1lbSkpOworCVNBUkxCTnBsbih1X2NoYXIsIF8xOCwgMHg4MDApOworCitmaW5hbDoKKwkqbGVucCA9IHBvczsKKwlyZXR2ID0gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldHVybiByZXR2OworfQorCisKKyNlbmRpZgkJCQkvKiAjaWZkZWYgQVJMQU5fUFJPQ19TSE1fRFVNUCAqLworCisKK3N0YXRpYyBjaGFyIGNvbmZfcmVzZXRfcmVzdWx0WzIwMF07CisKK3N0YXRpYyBpbnQgYXJsYW5fY29uZmlndXJlKGN0bF90YWJsZSAqIGN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqIGxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcG9zID0gMDsKKwlpbnQgZGV2bnVtID0gY3RsLT5wcm9jbmFtZVs2XSAtICcwJzsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdjsKKworCWlmIChkZXZudW0gPCAwIHx8IGRldm51bSA+IE1BWF9BUkxBTlMgLSAxKQorCXsKKwkJICBwcmludGsoS0VSTl9XQVJOSU5HICJ0b28gc3RyYW5nZSBkZXZudW0gaW4gcHJvY2ZzIHBhcnNlXG4gIik7CisJCSAgcmV0dXJuIC0xOworCX0KKwllbHNlIGlmIChhcmxhbl9kZXZpY2VbZGV2bnVtXSAhPSBOVUxMKQorCXsKKwkJICBwcml2ID0gYXJsYW5fZGV2aWNlW2Rldm51bV0tPnByaXY7CisKKwkJICBhcmxhbl9jb21tYW5kKGFybGFuX2RldmljZVtkZXZudW1dLCBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9DT05GKTsKKwl9CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwkqbGVucCA9IHBvczsKKwlyZXR1cm4gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworfQorCitzdGF0aWMgaW50IGFybGFuX3N5c2N0bF9yZXNldChjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHBvcyA9IDA7CisJaW50IGRldm51bSA9IGN0bC0+cHJvY25hbWVbNV0gLSAnMCc7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXY7CisKKwlpZiAoZGV2bnVtIDwgMCB8fCBkZXZudW0gPiBNQVhfQVJMQU5TIC0gMSkKKwl7CisJCSAgcHJpbnRrKEtFUk5fV0FSTklORyAidG9vIHN0cmFuZ2UgZGV2bnVtIGluIHByb2NmcyBwYXJzZVxuICIpOworCQkgIHJldHVybiAtMTsKKwl9CisJZWxzZSBpZiAoYXJsYW5fZGV2aWNlW2Rldm51bV0gIT0gTlVMTCkKKwl7CisJCXByaXYgPSBhcmxhbl9kZXZpY2VbZGV2bnVtXS0+cHJpdjsKKwkJYXJsYW5fY29tbWFuZChhcmxhbl9kZXZpY2VbZGV2bnVtXSwgQVJMQU5fQ09NTUFORF9DTEVBTl9BTkRfUkVTRVQpOworCisJfSBlbHNlCisJCXJldHVybiAtMTsKKwkqbGVucCA9IHBvcyArIDM7CisJcmV0dXJuIHByb2NfZG9zdHJpbmcoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKK30KKworCisvKiBQbGFjZSBmaWxlcyBpbiAvcHJvYy9zeXMvZGV2L2FybGFuICovCisjZGVmaW5lIENUQkxOKG51bSxjYXJkLG5hbSkgXAorICAgICAgICB7IC5jdGxfbmFtZSA9IG51bSxcCisgICAgICAgICAgLnByb2NuYW1lID0gI25hbSxcCisgICAgICAgICAgLmRhdGEgPSAmKGFybGFuX2NvbmZbY2FyZF0ubmFtKSxcCisgICAgICAgICAgLm1heGxlbiA9IHNpemVvZihpbnQpLCAubW9kZSA9IDA2MDAsIC5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlY30KKyNpZmRlZiBBUkxBTl9ERUJVR0dJTkcKKworI2RlZmluZSBBUkxBTl9QUk9DX0RFQlVHX0VOVFJJRVMgXAorICAgICAgICB7IC5jdGxfbmFtZSA9IDQ4LCAucHJvY25hbWUgPSAiZW50cnlfZXhpdF9kZWJ1ZyIsXAorICAgICAgICAgIC5kYXRhID0gJmFybGFuX2VudHJ5X2FuZF9leGl0X2RlYnVnLFwKKyAgICAgICAgICAubWF4bGVuID0gc2l6ZW9mKGludCksIC5tb2RlID0gMDYwMCwgLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjfSxcCisJeyAuY3RsX25hbWUgPSA0OSwgLnByb2NuYW1lID0gImRlYnVnIiwgLmRhdGEgPSAmYXJsYW5fZGVidWcsXAorICAgICAgICAgIC5tYXhsZW4gPSBzaXplb2YoaW50KSwgLm1vZGUgPSAwNjAwLCAucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWN9LAorI2Vsc2UgCisjZGVmaW5lIEFSTEFOX1BST0NfREVCVUdfRU5UUklFUworI2VuZGlmCisKKyNkZWZpbmUgQVJMQU5fU1lTQ1RMX1RBQkxFX1RPVEFMKGNhcmRObylcCisJQ1RCTE4oMSxjYXJkTm8sc3ByZWFkaW5nQ29kZSksXAorCUNUQkxOKDIsY2FyZE5vLCBjaGFubmVsTnVtYmVyKSxcCisJQ1RCTE4oMyxjYXJkTm8sIHNjcmFtYmxpbmdEaXNhYmxlKSxcCisJQ1RCTE4oNCxjYXJkTm8sIHR4QXR0ZW51YXRpb24pLFwKKwlDVEJMTig1LGNhcmRObywgc3lzdGVtSWQpLCBcCisJQ1RCTE4oNixjYXJkTm8sIG1heERhdGFncmFtU2l6ZSksXAorCUNUQkxOKDcsY2FyZE5vLCBtYXhGcmFtZVNpemUpLFwKKwlDVEJMTig4LGNhcmRObywgbWF4UmV0cmllcyksXAorCUNUQkxOKDksY2FyZE5vLCByZWNlaXZlTW9kZSksXAorCUNUQkxOKDEwLGNhcmRObywgcHJpb3JpdHkpLFwKKwlDVEJMTigxMSxjYXJkTm8sIHJvb3RPclJlcGVhdGVyKSxcCisJQ1RCTE4oMTIsY2FyZE5vLCBTSUQpLFwKKwlDVEJMTigxMyxjYXJkTm8sIHJlZ2lzdHJhdGlvbk1vZGUpLFwKKwlDVEJMTigxNCxjYXJkTm8sIHJlZ2lzdHJhdGlvbkZpbGwpLFwKKwlDVEJMTigxNSxjYXJkTm8sIGxvY2FsVGFsa0FkZHJlc3MpLFwKKwlDVEJMTigxNixjYXJkTm8sIGNvZGVGb3JtYXQpLFwKKwlDVEJMTigxNyxjYXJkTm8sIG51bUNoYW5uZWxzKSxcCisJQ1RCTE4oMTgsY2FyZE5vLCBjaGFubmVsMSksXAorCUNUQkxOKDE5LGNhcmRObywgY2hhbm5lbDIpLFwKKwlDVEJMTigyMCxjYXJkTm8sIGNoYW5uZWwzKSxcCisJQ1RCTE4oMjEsY2FyZE5vLCBjaGFubmVsNCksXAorCUNUQkxOKDIyLGNhcmRObywgdHhDbGVhciksXAorCUNUQkxOKDIzLGNhcmRObywgdHhSZXRyaWVzKSxcCisJQ1RCTE4oMjQsY2FyZE5vLCB0eFJvdXRpbmcpLFwKKwlDVEJMTigyNSxjYXJkTm8sIHR4U2NyYW1ibGVkKSxcCisJQ1RCTE4oMjYsY2FyZE5vLCByeFBhcmFtZXRlciksXAorCUNUQkxOKDI3LGNhcmRObywgdHhUaW1lb3V0TXMpLFwKKwlDVEJMTigyOCxjYXJkTm8sIHdhaXRDYXJkVGltZW91dCksXAorCUNUQkxOKDI5LGNhcmRObywgY2hhbm5lbFNldCksIFwKKwl7LmN0bF9uYW1lID0gMzAsIC5wcm9jbmFtZSA9ICJuYW1lIixcCisJIC5kYXRhID0gYXJsYW5fY29uZltjYXJkTm9dLnNpdGVOYW1lLFwKKwkgLm1heGxlbiA9IDE2LCAubW9kZSA9IDA2MDAsIC5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb3N0cmluZ30sXAorCUNUQkxOKDMxLGNhcmRObyx3YWl0VGltZSksXAorCUNUQkxOKDMyLGNhcmRObyxsUGFyYW1ldGVyKSxcCisJQ1RCTE4oMzMsY2FyZE5vLF8xNSksXAorCUNUQkxOKDM0LGNhcmRObyxoZWFkZXJTaXplKSxcCisJQ1RCTE4oMzYsY2FyZE5vLHR4X2RlbGF5X21zKSxcCisJQ1RCTE4oMzcsY2FyZE5vLHJldHJpZXMpLFwKKwlDVEJMTigzOCxjYXJkTm8sUmVUcmFuc21pdFBhY2tldE1heFNpemUpLFwKKwlDVEJMTigzOSxjYXJkTm8sd2FpdFJlVHJhbnNtaXRQYWNrZXRNYXhTaXplKSxcCisJQ1RCTE4oNDAsY2FyZE5vLGZhc3RSZVRyYW5zQ291bnQpLFwKKwlDVEJMTig0MSxjYXJkTm8sZHJpdmVyUmV0cmFuc21pc3Npb25zKSxcCisJQ1RCTE4oNDIsY2FyZE5vLHR4QWNrVGltZW91dE1zKSxcCisJQ1RCTE4oNDMsY2FyZE5vLHJlZ2lzdHJhdGlvbkludGVycnVwdHMpLFwKKwlDVEJMTig0NCxjYXJkTm8saGFyZHdhcmVUeXBlKSxcCisJQ1RCTE4oNDUsY2FyZE5vLHJhZGlvVHlwZSksXAorCUNUQkxOKDQ2LGNhcmRObyx3cml0ZUVFUFJPTSksXAorCUNUQkxOKDQ3LGNhcmRObyx3cml0ZVJhZGlvVHlwZSksXAorCUFSTEFOX1BST0NfREVCVUdfRU5UUklFU1wKKwlDVEJMTig1MCxjYXJkTm8saW5fc3BlZWQpLFwKKwlDVEJMTig1MSxjYXJkTm8sb3V0X3NwZWVkKSxcCisJQ1RCTE4oNTIsY2FyZE5vLGluX3NwZWVkMTApLFwKKwlDVEJMTig1MyxjYXJkTm8sb3V0X3NwZWVkMTApLFwKKwlDVEJMTig1NCxjYXJkTm8saW5fc3BlZWRfbWF4KSxcCisJQ1RCTE4oNTUsY2FyZE5vLG91dF9zcGVlZF9tYXgpLFwKKwlDVEJMTig1NixjYXJkTm8sbWVhc3VyZV9yYXRlKSxcCisJQ1RCTE4oNTcsY2FyZE5vLHByZV9Db21tYW5kX1dhaXQpLFwKKwlDVEJMTig1OCxjYXJkTm8scnhfdHdlYWsxKSxcCisJQ1RCTE4oNTksY2FyZE5vLHJ4X3R3ZWFrMiksXAorCUNUQkxOKDYwLGNhcmRObyx0eF9xdWV1ZV9sZW4pLFwKKworCisKK3N0YXRpYyBjdGxfdGFibGUgYXJsYW5fY29uZl90YWJsZTBbXSA9Cit7CisJQVJMQU5fU1lTQ1RMX1RBQkxFX1RPVEFMKDApCisKKyNpZmRlZiBBUkxBTl9QUk9DX1NITV9EVU1QCisJeworCQkuY3RsX25hbWUJPSAxNTAsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjAtdHhSaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm90eFJpbmcsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MSwKKwkJLnByb2NuYW1lCT0gImFybGFuMC1yeFJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mb3J4UmluZywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUyLAorCQkucHJvY25hbWUJPSAiYXJsYW4wLTE4IiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8xOCwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUzLAorCQkucHJvY25hbWUJPSAiYXJsYW4wLXJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbzE2MTcxOSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTU0LAorCQkucHJvY25hbWUJPSAiYXJsYW4wLXNobS1jcHkiLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbywKKwl9LAorI2VuZGlmCisJeworCQkuY3RsX25hbWUJPSAxNTUsCisJCS5wcm9jbmFtZQk9ICJjb25maWcwIiwKKwkJLmRhdGEJCT0gJmNvbmZfcmVzZXRfcmVzdWx0LAorCQkubWF4bGVuCQk9IDEwMCwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9jb25maWd1cmUKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTU2LAorCQkucHJvY25hbWUJPSAicmVzZXQwIiwKKwkJLmRhdGEJCT0gJmNvbmZfcmVzZXRfcmVzdWx0LAorCQkubWF4bGVuCQk9IDEwMCwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfcmVzZXQsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBhcmxhbl9jb25mX3RhYmxlMVtdID0KK3sKKworCUFSTEFOX1NZU0NUTF9UQUJMRV9UT1RBTCgxKQorCisjaWZkZWYgQVJMQU5fUFJPQ19TSE1fRFVNUAorCXsKKwkJLmN0bF9uYW1lCT0gMTUwLAorCQkucHJvY25hbWUJPSAiYXJsYW4xLXR4UmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvdHhSaW5nLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTEsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjEtcnhSaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm9yeFJpbmcsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MiwKKwkJLnByb2NuYW1lCT0gImFybGFuMS0xOCIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvMTgsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MywKKwkJLnByb2NuYW1lCT0gImFybGFuMS1yaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8xNjE3MTksCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1NCwKKwkJLnByb2NuYW1lCT0gImFybGFuMS1zaG0tY3B5IiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8sCisJfSwKKyNlbmRpZgorCXsKKwkJLmN0bF9uYW1lCT0gMTU1LAorCQkucHJvY25hbWUJPSAiY29uZmlnMSIsCisJCS5kYXRhCQk9ICZjb25mX3Jlc2V0X3Jlc3VsdCwKKwkJLm1heGxlbgkJPSAxMDAsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fY29uZmlndXJlLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTYsCisJCS5wcm9jbmFtZQk9ICJyZXNldDEiLAorCQkuZGF0YQkJPSAmY29uZl9yZXNldF9yZXN1bHQsCisJCS5tYXhsZW4JCT0gMTAwLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9yZXNldCwKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGFybGFuX2NvbmZfdGFibGUyW10gPQoreworCisJQVJMQU5fU1lTQ1RMX1RBQkxFX1RPVEFMKDIpCisKKyNpZmRlZiBBUkxBTl9QUk9DX1NITV9EVU1QCisJeworCQkuY3RsX25hbWUJPSAxNTAsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjItdHhSaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm90eFJpbmcsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MSwKKwkJLnByb2NuYW1lCT0gImFybGFuMi1yeFJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mb3J4UmluZywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUyLAorCQkucHJvY25hbWUJPSAiYXJsYW4yLTE4IiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8xOCwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUzLAorCQkucHJvY25hbWUJPSAiYXJsYW4yLXJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbzE2MTcxOSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTU0LAorCQkucHJvY25hbWUJPSAiYXJsYW4yLXNobS1jcHkiLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbywKKwl9LAorI2VuZGlmCisJeworCQkuY3RsX25hbWUJPSAxNTUsCisJCS5wcm9jbmFtZQk9ICJjb25maWcyIiwKKwkJLmRhdGEJCT0gJmNvbmZfcmVzZXRfcmVzdWx0LAorCQkubWF4bGVuCQk9IDEwMCwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9jb25maWd1cmUsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1NiwKKwkJLnByb2NuYW1lCT0gInJlc2V0MiIsCisJCS5kYXRhCQk9ICZjb25mX3Jlc2V0X3Jlc3VsdCwKKwkJLm1heGxlbgkJPSAxMDAsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX3Jlc2V0LAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgYXJsYW5fY29uZl90YWJsZTNbXSA9Cit7CisKKwlBUkxBTl9TWVNDVExfVEFCTEVfVE9UQUwoMykKKworI2lmZGVmIEFSTEFOX1BST0NfU0hNX0RVTVAKKwl7CisJCS5jdGxfbmFtZQk9IDE1MCwKKwkJLnByb2NuYW1lCT0gImFybGFuMy10eFJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mb3R4UmluZywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUxLAorCQkucHJvY25hbWUJPSAiYXJsYW4zLXJ4UmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvcnhSaW5nLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTIsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjMtMTgiLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbzE4LAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTMsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjMtcmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvMTYxNzE5LAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTQsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjMtc2htLWNweSIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvLAorCX0sCisjZW5kaWYKKwl7CisJCS5jdGxfbmFtZQk9IDE1NSwKKwkJLnByb2NuYW1lCT0gImNvbmZpZzMiLAorCQkuZGF0YQkJPSAmY29uZl9yZXNldF9yZXN1bHQsCisJCS5tYXhsZW4JCT0gMTAwLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX2NvbmZpZ3VyZSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTU2LAorCQkucHJvY25hbWUJPSAicmVzZXQzIiwKKwkJLmRhdGEJCT0gJmNvbmZfcmVzZXRfcmVzdWx0LAorCQkubWF4bGVuCQk9IDEwMCwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfcmVzZXQsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworCisKK3N0YXRpYyBjdGxfdGFibGUgYXJsYW5fdGFibGVbXSA9Cit7CisJeworCQkuY3RsX25hbWUJPSAwLAorCQkucHJvY25hbWUJPSAiYXJsYW4wIiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNjAwLAorCQkuY2hpbGQJCT0gYXJsYW5fY29uZl90YWJsZTAsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDAsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjEiLAorCQkubWF4bGVuCQk9IDAsCisJCS5tb2RlCQk9IDA2MDAsCisJCS5jaGlsZAkJPSBhcmxhbl9jb25mX3RhYmxlMSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMCwKKwkJLnByb2NuYW1lCT0gImFybGFuMiIsCisJCS5tYXhsZW4JCT0gMCwKKwkJLm1vZGUJCT0gMDYwMCwKKwkJLmNoaWxkCQk9IGFybGFuX2NvbmZfdGFibGUyLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAwLAorCQkucHJvY25hbWUJPSAiYXJsYW4zIiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNjAwLAorCQkuY2hpbGQJCT0gYXJsYW5fY29uZl90YWJsZTMsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworI2Vsc2UKKworc3RhdGljIGN0bF90YWJsZSBhcmxhbl90YWJsZVtNQVhfQVJMQU5TICsgMV0gPQoreworCXsgLmN0bF9uYW1lID0gMCB9Cit9OworI2VuZGlmCisjZWxzZQorCitzdGF0aWMgY3RsX3RhYmxlIGFybGFuX3RhYmxlW01BWF9BUkxBTlMgKyAxXSA9Cit7CisJeyAuY3RsX25hbWUgPSAwIH0KK307CisjZW5kaWYKKworCisvLyBzdGF0aWMgaW50IG1tdHUgPSAxMjM0OworCitzdGF0aWMgY3RsX3RhYmxlIGFybGFuX3Jvb3RfdGFibGVbXSA9Cit7CisJeworCQkuY3RsX25hbWUJPSAyNTQsCisJCS5wcm9jbmFtZQk9ICJhcmxhbiIsCisJCS5tYXhsZW4JCT0gMCwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IGFybGFuX3RhYmxlLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKKy8qIE1ha2Ugc3VyZSB0aGF0IC9wcm9jL3N5cy9kZXYgaXMgdGhlcmUgKi8KKy8vc3RhdGljIGN0bF90YWJsZSBhcmxhbl9kZXZpY2Vfcm9vdF90YWJsZVtdID0KKy8veworLy8Je0NUTF9ERVYsICJkZXYiLCBOVUxMLCAwLCAwNTU1LCBhcmxhbl9yb290X3RhYmxlfSwKKy8vCXswfQorLy99OworCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICphcmxhbl9kZXZpY2Vfc3lzY3RsX2hlYWRlcjsKKworaW50IF9faW5pdCBpbml0X2FybGFuX3Byb2Modm9pZCkKK3sKKworCWludCBpID0gMDsKKwlpZiAoYXJsYW5fZGV2aWNlX3N5c2N0bF9oZWFkZXIpCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBNQVhfQVJMQU5TICYmIGFybGFuX2RldmljZVtpXTsgaSsrKQorCQlhcmxhbl90YWJsZVtpXS5jdGxfbmFtZSA9IGkgKyAxOworCWFybGFuX2RldmljZV9zeXNjdGxfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGFybGFuX3Jvb3RfdGFibGUsIDApOworCWlmICghYXJsYW5fZGV2aWNlX3N5c2N0bF9oZWFkZXIpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworCit9CisKK3ZvaWQgX19leGl0IGNsZWFudXBfYXJsYW5fcHJvYyh2b2lkKQoreworCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGFybGFuX2RldmljZV9zeXNjdGxfaGVhZGVyKTsKKwlhcmxhbl9kZXZpY2Vfc3lzY3RsX2hlYWRlciA9IE5VTEw7CisKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhNmQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLmgKQEAgLTAsMCArMSw1NDEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3IEN1bGxlbiBKZW5uaW5ncworICogIENvcHlyaWdodCAoQykgMTk5OCBFbG1lci5Kb2FuZGlAdXQuZWUsICszNy0yNTUtMTM1MDAJCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CS8qIEZvciB0aGUgc3RhdGlzdGljcyBzdHJ1Y3R1cmUuICovCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CS8qIEZvciBBUlBIUkRfRVRIRVIgKi8KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworCisvLyNkZWZpbmUgQVJMQU5fREVCVUdHSU5HIDEKKworI2RlZmluZSBBUkxBTl9QUk9DX0lOVEVSRkFDRQorI2RlZmluZSBNQVhfQVJMQU5TIDQgLyogbm90IG1vcmUgdGhhbiA0ICEgKi8KKyNkZWZpbmUgQVJMQU5fUFJPQ19TSE1fRFVNUCAvKiBzaG93cyBhbGwgY2FyZCByZWdpc3RlcnMsIG1ha2VzIGRyaXZlciB3YXkgbGFyZ2VyICovCisKKyNkZWZpbmUgQVJMQU5fTUFYX01VTFRJQ0FTVF9BRERSUyAxNgorI2RlZmluZSBBUkxBTl9SQ1ZfQ0xFQU4gCTAKKyNkZWZpbmUgQVJMQU5fUkNWX1BST01JU0MgMQorI2RlZmluZSBBUkxBTl9SQ1ZfQ09OVFJPTCAyCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworZXh0ZXJuIGludCBpbml0X2FybGFuX3Byb2Modm9pZCk7CitleHRlcm4gdm9pZCBjbGVhbnVwX2FybGFuX3Byb2Modm9pZCk7CisjZWxzZQorI2RlZmluZSBpbml0X2FybGFuX3Byb2MoKQkoeyAwOyB9KQorI2RlZmluZSBjbGVhbnVwX2FybGFuX3Byb2MoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphcmxhbl9kZXZpY2VbTUFYX0FSTEFOU107CitleHRlcm4gaW50CWFybGFuX2RlYnVnOworZXh0ZXJuIGludAlhcmxhbl9lbnRyeV9kZWJ1ZzsKK2V4dGVybiBpbnQJYXJsYW5fZXhpdF9kZWJ1ZzsKK2V4dGVybiBpbnQJdGVzdE1lbW9yeTsKK2V4dGVybiBpbnQgICAgIGFybGFuX2NvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBjb21tYW5kKTsKKyAKKyNkZWZpbmUgU0lEVU5LTk9XTiAtMQorI2RlZmluZSByYWRpb05vZGVJZFVOS05PV04gLTEKKyNkZWZpbmUgaXJxVU5LTk9XTiAwCisjZGVmaW5lIGRlYnVnVU5LTk9XTiAwCisjZGVmaW5lIHRlc3RNZW1vcnlVTktOT1dOIDEKKyNkZWZpbmUgc3ByZWFkaW5nQ29kZVVOS05PV04gMAorI2RlZmluZSBjaGFubmVsTnVtYmVyVU5LTk9XTiAwCisjZGVmaW5lIGNoYW5uZWxTZXRVTktOT1dOIDAKKyNkZWZpbmUgc3lzdGVtSWRVTktOT1dOIC0xCisjZGVmaW5lIHJlZ2lzdHJhdGlvbk1vZGVVTktOT1dOIC0xCisKKworI2RlZmluZSBJRkRFQlVHKCBMICkgaWYgKCAoTCkgJiBhcmxhbl9kZWJ1ZyApIAorI2RlZmluZSBBUkxBTl9GQUtFX0hEUl9MRU4gMTIgCisKKyNpZmRlZiBBUkxBTl9ERUJVR0dJTkcKKwkjZGVmaW5lIERFQlVHIDEKKwkjZGVmaW5lIEFSTEFOX0VOVFJZX0VYSVRfREVCVUdHSU5HIDEKKwkjZGVmaW5lIEFSTEFOX0RFQlVHKGEsYikgcHJpbnRrKEtFUk5fREVCVUcgYSwgYikKKyNlbHNlCisJI2RlZmluZSBBUkxBTl9ERUJVRyhhLGIpIAorI2VuZGlmCisKKyNkZWZpbmUgQVJMQU5fU0hNRU1fU0laRQkweDIwMDAKKworc3RydWN0IGFybGFuX3NobWVtCit7CisgICAgICAvKiBIZWFkZXIgU2lnbmF0dXJlICovIAorICAgICAgdm9sYXRpbGUJY2hhciB0ZXh0UmVnaW9uWzQ4XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByZXNldEZsYWc7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgIGRpYWdub3N0aWNJbmZvOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBkaWFnbm9zdGljT2Zmc2V0OworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8xWzEyXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBsYW5DYXJkTm9kZUlkWzZdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGJyb2FkY2FzdEFkZHJlc3NbNl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgaGFyZHdhcmVUeXBlOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG1ham9ySGFyZHdhcmVWZXJzaW9uOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG1pbm9ySGFyZHdhcmVWZXJzaW9uOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJhZGlvTW9kdWxlOy8vIHNob3dzIEVFUFJPTSwgY2FuIGJlIG92ZXJyaWRkZW4gYXQgMHgxMTEKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBkZWZhdWx0Q2hhbm5lbFNldDsgLy8gc2hvd3MgRUVQcm9tLCBjYW4gYmUgb3ZlcnJpaWRlbiBhdCAweDEwQQorICAgICAgdm9sYXRpbGUJdV9jaGFyIF8yWzQ3XTsKKyAgICAgIAorICAgICAgLyogQ29udHJvbC9TdGF0dXMgQmxvY2sgLSAweDAwODAgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciBpbnRlcnJ1cHRJblByb2dyZXNzOyAvKiBub3QgdXNlZCBieSBsYW5jcHUgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjbnRybFJlZ0ltYWdlOyAvKiBub3QgdXNlZCBieSBsYW5jcHUgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfM1sxM107CisgICAgICB2b2xhdGlsZQl1X2NoYXIgZHVtcEJ5dGU7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgY29tbWFuZEJ5dGU7IC8qIG5vbi16ZXJvID0gYWN0aXZlICovCisgICAgICB2b2xhdGlsZQl1X2NoYXIgY29tbWFuZFBhcmFtZXRlclsxNV07CisKKyAgICAgIC8qIFJlY2VpdmUgU3RhdHVzIC0gMHgwMGEwICovCisgICAgICB2b2xhdGlsZQl1X2NoYXIgcnhTdGF0dXM7IC8qIDEtIGRhdGEsIDItY29udHJvbCwgMHhmZiAtIHJlZ2lzdHIgY2hhbmdlICovCisgICAgICB2b2xhdGlsZQl1X2NoYXIgcnhGcm1UeXBlOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCByeE9mZnNldDsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgcnhMZW5ndGg7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcnhTcmNbNl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcnhCcm9hZGNhc3RGbGFnOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJ4UXVhbGl0eTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBzY3JhbWJsZWQ7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzRbMV07CisgICAgICAKKyAgICAgIC8qIFRyYW5zbWl0IFN0YXR1cyAtIDB4MDBiMCAqLworICAgICAgdm9sYXRpbGUJdV9jaGFyIHR4U3RhdHVzOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHR4QWNrUXVhbGl0eTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1SZXRyaWVzOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF81WzE0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByZWdpc3RlcmVkUm91dGVyWzZdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGJhY2tib25lUm91dGVyWzZdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJlZ2lzdHJhdGlvblN0YXR1czsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjb25maWd1cmVkU3RhdHVzRmxhZzsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfNlsxXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciB1bHRpbWF0ZURlc3RBZGRyZXNzWzZdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGltbWVkRGVzdEFkZHJlc3NbNl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgaW1tZWRTcmNBZGRyZXNzWzZdOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCByeFNlcXVlbmNlTnVtYmVyOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGFzc2lnbmVkTG9jYWx0YWxrQWRkcmVzczsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfN1syN107CisKKyAgICAgIC8qIFN5c3RlbSBQYXJhbWV0ZXIgQmxvY2sgKi8KKworICAgICAgLyogLSBEcml2ZXIgUGFyYW1ldGVycyAoTm92ZWxsIFNwZWNpZmljKSAqLworCisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHR4VGltZW91dDsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgdHJhbnNwb3J0VGltZTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfOFs0XTsKKworICAgICAgLyogLSBDb25maWd1cmF0aW9uIFBhcmFtZXRlcnMgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciBpcnFMZXZlbDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBzcHJlYWRpbmdDb2RlOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGNoYW5uZWxTZXQ7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgY2hhbm5lbE51bWJlcjsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgcmFkaW9Ob2RlSWQ7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzlbMl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgc2NyYW1ibGluZ0Rpc2FibGU7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcmFkaW9UeXBlOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCByb3V0ZXJJZDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMTBbOV07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgdHhBdHRlbnVhdGlvbjsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBzeXN0ZW1JZFs0XTsgCisgICAgICB2b2xhdGlsZQl1X3Nob3J0IGdsb2JhbENoZWNrc3VtOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8xMVs0XTsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgbWF4RGF0YWdyYW1TaXplOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBtYXhGcmFtZVNpemU7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbWF4UmV0cmllczsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByZWNlaXZlTW9kZTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBwcmlvcml0eTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByb290T3JSZXBlYXRlcjsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBzcGVjaWZpZWRSb3V0ZXJbNl07CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IGZhc3RQb2xsUGVyaW9kOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHBvbGxEZWNheTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBmYXN0UG9sbERlbGF5WzJdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGFybFRocmVzaG9sZDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBhcmxEZWNheTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMTJbMV07CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHNwZWNSb3V0ZXJUaW1lb3V0OworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8xM1s1XTsKKworICAgICAgLyogU2NyYW1ibGVkIEFyZWEgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciBTSURbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgZW5jcnlwdGlvbktleVsxMl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzE0WzJdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHdhaXRUaW1lWzJdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGxQYXJhbWV0ZXJbMl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzE1WzNdOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBoZWFkZXJTaXplOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBzZWN0aW9uQ2hlY2tzdW07CisKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByZWdpc3RyYXRpb25Nb2RlOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJlZ2lzdHJhdGlvbkZpbGw7CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHBvbGxQZXJpb2Q7CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHJlZnJlc2hQZXJpb2Q7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbmFtZVsxNl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgTklEWzZdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGxvY2FsVGFsa0FkZHJlc3M7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgY29kZUZvcm1hdDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1DaGFubmVsczsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjaGFubmVsMTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjaGFubmVsMjsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjaGFubmVsMzsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjaGFubmVsNDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBTU0NvZGVbNTldOworCisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzE2WzB4QzBdOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBhdXhDbWQ7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgIGR1bXBQdHJbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgZHVtcFZhbDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMTdbMHg2QV07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgd2lyZVRlc3Q7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzE4WzE0XTsKKworICAgICAgLyogU3RhdGlzdGljcyBCbG9jayAtIDB4MDMwMCAqLworICAgICAgdm9sYXRpbGUJdV9jaGFyIGhvc3RjcHVMb2NrOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGxhbmNwdUxvY2s7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcmVzZXRUaW1lWzE4XTsKKyAgICAgIAorICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bURhdGFncmFtc1RyYW5zbWl0dGVkWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bVJlVHJhbnNtaXNzaW9uc1s0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1GcmFtZXNEaXNjYXJkZWRbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRGF0YWdyYW1zUmVjZWl2ZWRbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRHVwbGljYXRlUmVjZWl2ZWRGcmFtZXNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRGF0YWdyYW1zRGlzY2FyZGVkWzRdOworICAgICAgCisgICAgICB2b2xhdGlsZQl1X3Nob3J0IG1heE51bVJlVHJhbnNtaXREYXRhZ3JhbTsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgbWF4TnVtUmVUcmFuc21pdEZyYW1lczsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgbWF4TnVtQ29uc2VjdXRpdmVEdXBsaWNhdGVGcmFtZXM7CisgICAgICAvKiBtaXNhbGlnbmVkIGhlcmUgc28gd2UgaGF2ZSB0byBnbyB0byBjaGFyYWN0ZXJzICovCisgICAgIAorICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUJ5dGVzVHJhbnNtaXR0ZWRbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtQnl0ZXNSZWNlaXZlZFs0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1DUkNFcnJvcnNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtTGVuZ3RoRXJyb3JzWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUFib3J0RXJyb3JzWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bVRYVW5kZXJydW5zWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bVJYT3ZlcnJ1bnNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtSG9sZE9mZnNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRnJhbWVzVHJhbnNtaXR0ZWRbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRnJhbWVzUmVjZWl2ZWRbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtUmVjZWl2ZUZyYW1lc0xvc3RbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtUlhCdWZmZXJPdmVyZmxvd3NbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRnJhbWVzRGlzY2FyZGVkQWRkck1pc21hdGNoWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUZyYW1lc0Rpc2NhcmRlZFNJRE1pc21hdGNoWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bVBvbGxzVHJhbnNtaXN0dGVkWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bVBvbGxBY2tub3dsZWRnZXNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtU3RhdHVzVGltZW91dHNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtTkFDS1JlY2VpdmVkWzRdOworCisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzE5WzB4ODZdOworCisgICAgICB2b2xhdGlsZQl1X2NoYXIgdHhCdWZmZXJbMHg4MDBdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJ4QnVmZmVyWzB4ODAwXTsKKworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8yMFsweDgwMF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzIxWzB4M2ZiXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjb25maWdTdGF0dXM7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzIyOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHByb2dJT0N0cmw7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgc2hhcmVNQmFzZTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjb250cm9sUmVnaXN0ZXI7Cit9OworCitzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1IHsKKyAgICAgIGludCBzcHJlYWRpbmdDb2RlOworICAgICAgaW50IGNoYW5uZWxTZXQ7CisgICAgICBpbnQgY2hhbm5lbE51bWJlcjsKKyAgICAgIGludCBzY3JhbWJsaW5nRGlzYWJsZTsKKyAgICAgIGludCB0eEF0dGVudWF0aW9uOworICAgICAgaW50IHN5c3RlbUlkOyAKKyAgICAgIGludCBtYXhEYXRhZ3JhbVNpemU7CisgICAgICBpbnQgbWF4RnJhbWVTaXplOworICAgICAgaW50IG1heFJldHJpZXM7CisgICAgICBpbnQgcmVjZWl2ZU1vZGU7CisgICAgICBpbnQgcHJpb3JpdHk7CisgICAgICBpbnQgcm9vdE9yUmVwZWF0ZXI7CisgICAgICBpbnQgU0lEOworICAgICAgaW50IHJhZGlvTm9kZUlkOworICAgICAgaW50IHJlZ2lzdHJhdGlvbk1vZGU7CisgICAgICBpbnQgcmVnaXN0cmF0aW9uRmlsbDsKKyAgICAgIGludCBsb2NhbFRhbGtBZGRyZXNzOworICAgICAgaW50IGNvZGVGb3JtYXQ7CisgICAgICBpbnQgbnVtQ2hhbm5lbHM7CisgICAgICBpbnQgY2hhbm5lbDE7CisgICAgICBpbnQgY2hhbm5lbDI7CisgICAgICBpbnQgY2hhbm5lbDM7CisgICAgICBpbnQgY2hhbm5lbDQ7CisgICAgICBpbnQgdHhDbGVhcjsKKyAgICAgIGludCB0eFJldHJpZXM7CisgICAgICBpbnQgdHhSb3V0aW5nOworICAgICAgaW50IHR4U2NyYW1ibGVkOworICAgICAgaW50IHJ4UGFyYW1ldGVyOworICAgICAgaW50IHR4VGltZW91dE1zOworICAgICAgaW50IHR4QWNrVGltZW91dE1zOworICAgICAgaW50IHdhaXRDYXJkVGltZW91dDsKKyAgICAgIGludAl3YWl0VGltZTsKKyAgICAgIGludAlsUGFyYW1ldGVyOworICAgICAgaW50CV8xNTsKKyAgICAgIGludAloZWFkZXJTaXplOworICAgICAgaW50IHJldHJpZXM7CisgICAgICBpbnQgdHhfZGVsYXlfbXM7CisgICAgICBpbnQgd2FpdFJlVHJhbnNtaXRQYWNrZXRNYXhTaXplOworICAgICAgaW50IFJlVHJhbnNtaXRQYWNrZXRNYXhTaXplOworICAgICAgaW50IGZhc3RSZVRyYW5zQ291bnQ7CisgICAgICBpbnQgZHJpdmVyUmV0cmFuc21pc3Npb25zOworICAgICAgaW50IHJlZ2lzdHJhdGlvbkludGVycnVwdHM7CisgICAgICBpbnQgaGFyZHdhcmVUeXBlOworICAgICAgaW50IHJhZGlvVHlwZTsKKyAgICAgIGludCB3cml0ZVJhZGlvVHlwZTsKKyAgICAgIGludCB3cml0ZUVFUFJPTTsKKyAgICAgIGNoYXIgc2l0ZU5hbWVbMTddOworICAgICAgaW50IG1lYXN1cmVfcmF0ZTsKKyAgICAgIGludCBpbl9zcGVlZDsKKyAgICAgIGludCBvdXRfc3BlZWQ7CisgICAgICBpbnQgaW5fc3BlZWQxMDsKKyAgICAgIGludCBvdXRfc3BlZWQxMDsKKyAgICAgIGludCBpbl9zcGVlZF9tYXg7CisgICAgICBpbnQgb3V0X3NwZWVkX21heDsKKyAgICAgIGludCBwcmVfQ29tbWFuZF9XYWl0OworICAgICAgaW50IHJ4X3R3ZWFrMTsKKyAgICAgIGludCByeF90d2VhazI7CisgICAgICBpbnQgdHhfcXVldWVfbGVuOworfTsKKworZXh0ZXJuIHN0cnVjdCBhcmxhbl9jb25mX3N0cnUgYXJsYW5fY29uZltNQVhfQVJMQU5TXTsKKworc3RydWN0IFR4UGFyYW0KK3sKKyAgICAgIHZvbGF0aWxlCXNob3J0IAkJb2Zmc2V0OworICAgICAgdm9sYXRpbGUgCXNob3J0IAkJbGVuZ3RoOworICAgICAgdm9sYXRpbGUJdV9jaGFyIAkJZGVzdFs2XTsKKyAgICAgIHZvbGF0aWxlCXVuc2lnbmVkCWNoYXIgY2xlYXI7CisgICAgICB2b2xhdGlsZQl1bnNpZ25lZAljaGFyIHJldHJpZXM7CisgICAgICB2b2xhdGlsZQl1bnNpZ25lZAljaGFyIHJvdXRpbmc7CisgICAgICB2b2xhdGlsZQl1bnNpZ25lZAljaGFyIHNjcmFtYmxlZDsKK307CisKKyNkZWZpbmUgVFhfUklOR19TSVpFIDIKKy8qIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLiAqLworc3RydWN0IGFybGFuX3ByaXZhdGUgeworICAgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisgICAgICBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqIGNhcmQ7CisgICAgICBzdHJ1Y3QgYXJsYW5fc2htZW0gKiBjb25mOworCisgICAgICBzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1ICogQ29uZjsJICAgICAKKyAgICAgIGludAliYWQ7CisgICAgICBpbnQgCXJlc2V0OworICAgICAgdW5zaWduZWQgbG9uZyBsYXN0UmVzZXQ7CisgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKyAgICAgIHN0cnVjdCB0aW1lcl9saXN0IHR4X2RlbGF5X3RpbWVyOworICAgICAgc3RydWN0IHRpbWVyX2xpc3QgdHhfcmV0cnlfdGltZXI7CisgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCByeF9jaGVja190aW1lcjsKKworICAgICAgaW50IHJlZ2lzdHJhdGlvbkxvc3RDb3VudDsKKyAgICAgIGludCByZVJlZ2lzdGVyRXhwOworICAgICAgaW50IGlycV90ZXN0X2RvbmU7CisKKyAgICAgIHN0cnVjdCBUeFBhcmFtIHR4UmluZ1tUWF9SSU5HX1NJWkVdOworICAgICAgY2hhciByZVRyYW5zbWl0QnVmZlsweDgwMF07CisgICAgICBpbnQgdHhMYXN0OworICAgICAgdW5zaWduZWQgUmVUcmFuc21pdFJlcXVlc3RlZDsKKyAgICAgIHVuc2lnbmVkIGxvbmcgdHhfZG9uZV9kZWxheWVkOworICAgICAgdW5zaWduZWQgbG9uZyByZWdpc3RyYXRpb25MYXN0U2VlbjsKKworICAgICAgdW5zaWduZWQgbG9uZwl0eF9sYXN0X3NlbnQ7CisgICAgICB1bnNpZ25lZCBsb25nCXR4X2xhc3RfY2xlYXJlZDsKKyAgICAgIHVuc2lnbmVkIGxvbmcJcmV0cmFuc21pc3Npb25zOworICAgICAgdW5zaWduZWQgbG9uZyAJaW50ZXJydXB0X2Fja19yZXF1ZXN0ZWQ7CisgICAgICBzcGlubG9ja190CWxvY2s7CisgICAgICB1bnNpZ25lZCBsb25nCXdhaXRpbmdfY29tbWFuZF9tYXNrOworICAgICAgdW5zaWduZWQgbG9uZyAJY2FyZF9wb2xsaW5nX2ludGVydmFsOworICAgICAgdW5zaWduZWQgbG9uZyAJbGFzdF9jb21tYW5kX2J1ZmZfZnJlZV90aW1lOworCisgICAgICBpbnQgCQl1bmRlcl9yZXNldDsKKyAgICAgIGludCAJCXVuZGVyX2NvbmZpZzsKKyAgICAgIGludCAJCXJ4X2NvbW1hbmRfZ2l2ZW47CisgICAgICBpbnQJIAl0eF9jb21tYW5kX2dpdmVuOworICAgICAgdW5zaWduZWQgIGxvbmcJaW50ZXJydXB0X3Byb2Nlc3NpbmdfYWN0aXZlOworICAgICAgdW5zaWduZWQgbG9uZwlsYXN0X3J4X2ludF9hY2tfdGltZTsKKyAgICAgIHVuc2lnbmVkIGxvbmcJaW5fYnl0ZXM7CisgICAgICB1bnNpZ25lZCBsb25nIAlvdXRfYnl0ZXM7CisgICAgICB1bnNpZ25lZCBsb25nCWluX3RpbWU7CisgICAgICB1bnNpZ25lZCBsb25nCW91dF90aW1lOworICAgICAgdW5zaWduZWQgbG9uZwlpbl90aW1lMTA7CisgICAgICB1bnNpZ25lZCBsb25nCW91dF90aW1lMTA7CisgICAgICB1bnNpZ25lZCBsb25nCWluX2J5dGVzMTA7CisgICAgICB1bnNpZ25lZCBsb25nIAlvdXRfYnl0ZXMxMDsKKyAgICAgIGludAlpbml0X2V0aGVyZGV2X2FsbG9jOworfTsKKworCisKKyNkZWZpbmUgQVJMQU5fQ0xFQVIJCTB4MDAKKyNkZWZpbmUgQVJMQU5fUkVTRVQgCQkweDAxCisjZGVmaW5lIEFSTEFOX0NIQU5ORUxfQVRURU5USU9OIDB4MDIKKyNkZWZpbmUgQVJMQU5fSU5URVJSVVBUX0VOQUJMRSAJMHgwNAorI2RlZmluZSBBUkxBTl9DTEVBUl9JTlRFUlJVUFQgCTB4MDgKKyNkZWZpbmUgQVJMQU5fUE9XRVIgCQkweDQwCisjZGVmaW5lIEFSTEFOX0FDQ0VTUwkJMHg4MAorCisjZGVmaW5lIEFSTEFOX0NPTV9DT05GICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQVJMQU5fQ09NX1JYX0VOQUJMRSAgICAgICAgICAgMHgwMworI2RlZmluZSBBUkxBTl9DT01fUlhfQUJPUlQgICAgICAgICAgICAweDA0CisjZGVmaW5lIEFSTEFOX0NPTV9UWF9FTkFCTEUgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgQVJMQU5fQ09NX1RYX0FCT1JUICAgICAgICAgICAgMHgwNgorI2RlZmluZSBBUkxBTl9DT01fTk9QCQkgICAgICAweDA3CisjZGVmaW5lIEFSTEFOX0NPTV9TVEFOREJZICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQVJMQU5fQ09NX0FDVElWQVRFICAgICAgICAgICAgMHgwOQorI2RlZmluZSBBUkxBTl9DT01fR09UT19TTE9XX1BPTEwgICAgICAweDBhCisjZGVmaW5lIEFSTEFOX0NPTV9JTlQgICAgICAgICAgICAgICAgIDB4ODAKKworCisjZGVmaW5lIFRYTEFTVChkZXYpICgoKHN0cnVjdCBhcmxhbl9wcml2YXRlICopbmV0ZGV2X3ByaXYoZGV2KSktPnR4UmluZ1soKHN0cnVjdCBhcmxhbl9wcml2YXRlICopbmV0ZGV2X3ByaXYoZGV2KSktPnR4TGFzdF0pCisjZGVmaW5lIFRYSEVBRChkZXYpICgoKHN0cnVjdCBhcmxhbl9wcml2YXRlICopbmV0ZGV2X3ByaXYoZGV2KSktPnR4UmluZ1swXSkKKyNkZWZpbmUgVFhUQUlMKGRldikgKCgoc3RydWN0IGFybGFuX3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+dHhSaW5nWzFdKQorCisjZGVmaW5lIFRYQnVmZlN0YXJ0KGRldikgb2Zmc2V0b2Yoc3RydWN0IGFybGFuX3NobWVtLCB0eEJ1ZmZlcikKKyNkZWZpbmUgVFhCdWZmRW5kKGRldikgb2Zmc2V0b2Yoc3RydWN0IGFybGFuX3NobWVtLCB4eEJ1ZmZlcikKKyAKKyNkZWZpbmUgUkVBRFNITSh0byxmcm9tLGF0eXBlKSB7XAorCWF0eXBlIHRtcDtcCisJbWVtY3B5X2Zyb21pbygmKHRtcCksJihmcm9tKSxzaXplb2YoYXR5cGUpKTtcCisJdG8gPSB0bXA7XAorCX0KKworI2RlZmluZSBSRUFEU0hNRU0oZnJvbSxhdHlwZSlcCisJYXR5cGUgZnJvbTsgXAorCVJFQURTSE0oZnJvbSwgYXJsYW4tPmZyb20sIGF0eXBlKTsKKworI2RlZmluZSBXUklURVNITSh0byxmcm9tLGF0eXBlKSBcCisJeyBhdHlwZSB0bXBTSE0gPSBmcm9tO1wKKwltZW1jcHlfdG9pbygmKHRvKSwmdG1wU0hNLHNpemVvZihhdHlwZSkpO1wKKwl9CisKKyNkZWZpbmUgREVCVUdTSE0obGV2ZWxTSE0sc3RyaW5nU0hNLHN0dWZmLGF0eXBlKSBcCisJewlhdHlwZSB0bXBTSE07IFwKKwkJbWVtY3B5X2Zyb21pbygmdG1wU0hNLCYoc3R1ZmYpLHNpemVvZihhdHlwZSkpO1wKKwkJSUZERUJVRyhsZXZlbFNITSkgcHJpbnRrKHN0cmluZ1NITSx0bXBTSE0pO1wKKwl9CisKKyNkZWZpbmUgV1JJVEVTSE1CKHRvLCB2YWwpIFwKKwl3cml0ZWIodmFsLCYodG8pKQorI2RlZmluZSBSRUFEU0hNQih0bykgXAorCXJlYWRiKCYodG8pKQorI2RlZmluZSBXUklURVNITVModG8sIHZhbCkgXAorCXdyaXRldyh2YWwsJih0bykpCisjZGVmaW5lIFJFQURTSE1TKHRvKSBcCisJcmVhZHcoJih0bykpCisjZGVmaW5lIFdSSVRFU0hNSSh0bywgdmFsKSBcCisJd3JpdGVsKHZhbCwmKHRvKSkKKyNkZWZpbmUgUkVBRFNITUkodG8pIFwKKwlyZWFkbCgmKHRvKSkKKworCisKKworCisjZGVmaW5lIHJlZ2lzdHJhdGlvbkJhZChkZXYpXAorICAgKCAoICAgUkVBRFNITUIoKChzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqKW5ldGRldl9wcml2KGRldikpLT5jYXJkLT5yZWdpc3RyYXRpb25Nb2RlKSAgICA+IDApICYmIFwKKyAgICAgKCAgIFJFQURTSE1CKCgoc3RydWN0IGFybGFuX3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+Y2FyZC0+cmVnaXN0cmF0aW9uU3RhdHVzKSA9PSAwKSAgICApCisKKworI2RlZmluZSByZWFkQ29udHJvbFJlZ2lzdGVyKGRldilcCisgCVJFQURTSE1CKCgoc3RydWN0IGFybGFuX3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+Y2FyZC0+Y250cmxSZWdJbWFnZSkKKworI2RlZmluZSB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYsIHYpe1wKKyAgIFdSSVRFU0hNQigoKHN0cnVjdCBhcmxhbl9wcml2YXRlICopbmV0ZGV2X3ByaXYoZGV2KSktPmNhcmQtPmNudHJsUmVnSW1hZ2UJLCgodikgJjB4RikgKTtcCisgICBXUklURVNITUIoKChzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqKW5ldGRldl9wcml2KGRldikpLT5jYXJkLT5jb250cm9sUmVnaXN0ZXIJLCh2KSAJKTt9CisKKworI2RlZmluZSBhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldikge1wKKyAgIGludCBjcjsgICBcCisgICBcCisgICBjciA9IHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KTtcCisgICBpZiAoY3IgJiBBUkxBTl9DSEFOTkVMX0FUVEVOVElPTil7IFwKKyAgICAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldiwgKGNyICYgfkFSTEFOX0NIQU5ORUxfQVRURU5USU9OKSk7XAorICAgfWVsc2UgIFwKKyAgICAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldiwgKGNyIHwgQVJMQU5fQ0hBTk5FTF9BVFRFTlRJT04pKTtcCit9CisKKyNkZWZpbmUgY2xlYXJDaGFubmVsQXR0ZW50aW9uKGRldil7IFwKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiB+QVJMQU5fQ0hBTk5FTF9BVFRFTlRJT04pO30KKyNkZWZpbmUgc2V0SGFyZHdhcmVSZXNldChkZXYpIHtcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpIHwgQVJMQU5fUkVTRVQpO30KKyNkZWZpbmUgY2xlYXJIYXJkd2FyZVJlc2V0KGRldikge1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiB+QVJMQU5fUkVTRVQpO30KKyNkZWZpbmUgc2V0SW50ZXJydXB0RW5hYmxlKGRldil7XAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSB8IEFSTEFOX0lOVEVSUlVQVF9FTkFCTEUpICA7fQorI2RlZmluZSBjbGVhckludGVycnVwdEVuYWJsZShkZXYpe1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiB+QVJMQU5fSU5URVJSVVBUX0VOQUJMRSkgIDt9CisjZGVmaW5lIHNldENsZWFySW50ZXJydXB0KGRldil7XAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSB8IEFSTEFOX0NMRUFSX0lOVEVSUlVQVCkgICA7fQorI2RlZmluZSBjbGVhckNsZWFySW50ZXJydXB0KGRldil7XAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSAmIH5BUkxBTl9DTEVBUl9JTlRFUlJVUFQpO30KKyNkZWZpbmUgc2V0UG93ZXJPZmYoZGV2KXtcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpIHwgKEFSTEFOX1BPV0VSICYmIEFSTEFOX0FDQ0VTUykpO1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiB+QVJMQU5fQUNDRVNTKTt9CisjZGVmaW5lIHNldFBvd2VyT24oZGV2KXtcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpICYgfihBUkxBTl9QT1dFUikpOyAgIH0KKyNkZWZpbmUgYXJsYW5fbG9ja19jYXJkX2FjY2VzcyhkZXYpe1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiB+QVJMQU5fQUNDRVNTKTt9CisjZGVmaW5lIGFybGFuX3VubG9ja19jYXJkX2FjY2VzcyhkZXYpe1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgfCBBUkxBTl9BQ0NFU1MgKTsgfSAgCisKKworCisKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9SWAkJMHgwMDAwMDEKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9OT09QCQkweDAwMDAwMgorI2RlZmluZSBBUkxBTl9DT01NQU5EX05PT1BJTlQJCTB4MDAwMDA0CisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfVFgJCTB4MDAwMDA4CisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfQ09ORgkJMHgwMDAwMTAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9SRVNFVAkJMHgwMDAwMjAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9UWF9BQk9SVAkJMHgwMDAwNDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9SWF9BQk9SVAkJMHgwMDAwODAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9QT1dFUkRPV04JCTB4MDAwMTAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfUE9XRVJVUAkJMHgwMDAyMDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9TTE9XX1BPTEwgCTB4MDAwNDAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfQUNUSVZBVEUgCQkweDAwMDgwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX0lOVF9BQ0sJCTB4MDAxMDAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfSU5UX0VOQUJMRQkweDAwMjAwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX1dBSVRfTk9XCQkweDAwNDAwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX0xPTkdfV0FJVF9OT1cJMHgwMDgwMDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9TVEFOREJZCQkweDAxMDAwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX0lOVF9SQUNLCQkweDAyMDAwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX0lOVF9SRU5BQkxFCTB4MDQwMDAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfQ09ORl9XQUlUCQkweDA4MDAwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX1RCVVNZX0NMRUFSCTB4MTAwMDAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX0NPTkYJKEFSTEFOX0NPTU1BTkRfVFhfQUJPUlRcCisJCQkJCXwgQVJMQU5fQ09NTUFORF9SWF9BQk9SVFwKKwkJCQkJfCBBUkxBTl9DT01NQU5EX0NPTkYpCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX1JFU0VUICAgKEFSTEFOX0NPTU1BTkRfVFhfQUJPUlRcCisJCQkJCXwgQVJMQU5fQ09NTUFORF9SWF9BQk9SVFwKKwkJCQkJfCBBUkxBTl9DT01NQU5EX1JFU0VUKQorCisKKyAKKyNkZWZpbmUgQVJMQU5fREVCVUdfQ0hBSU5fTE9DS1MJCTB4MDAwMDEKKyNkZWZpbmUgQVJMQU5fREVCVUdfUkVTRVQJCTB4MDAwMDIKKyNkZWZpbmUgQVJMQU5fREVCVUdfVElNSU5HCQkweDAwMDA0CisjZGVmaW5lIEFSTEFOX0RFQlVHX0NBUkRfU1RBVEUJCTB4MDAwMDgKKyNkZWZpbmUgQVJMQU5fREVCVUdfVFhfQ0hBSU4JCTB4MDAwMTAKKyNkZWZpbmUgQVJMQU5fREVCVUdfTVVMVElDQVNUCQkweDAwMDIwCisjZGVmaW5lIEFSTEFOX0RFQlVHX0hFQURFUl9EVU1QCQkweDAwMDQwCisjZGVmaW5lIEFSTEFOX0RFQlVHX0lOVEVSUlVQVAkJMHgwMDA4MAorI2RlZmluZSBBUkxBTl9ERUJVR19TVEFSVFVQCQkweDAwMTAwCisjZGVmaW5lIEFSTEFOX0RFQlVHX1NIVVRET1dOCQkweDAwMjAwCisgCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGE3ZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwpAQCAtMCwwICsxLDQyNzIgQEAKKy8qKiogLSotIGxpbnV4LWMgLSotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICBEcml2ZXIgZm9yIEF0bWVsIGF0NzZjNTAyIGF0NzZjNTA0IGFuZCBhdDc2YzUwNiB3aXJlbGVzcyBjYXJkcy4KKworICAgICAgICBDb3B5cmlnaHQgMjAwMC0yMDAxIEFUTUVMIENvcnBvcmF0aW9uLgorICAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA0IFNpbW9uIEtlbGxleS4KKworICAgIFRoaXMgY29kZSB3YXMgZGV2ZWxvcGVkIGZyb20gdmVyc2lvbiAyLjEuMSBvZiB0aGUgQXRtZWwgZHJpdmVycywgCisgICAgcmVsZWFzZWQgYnkgQXRtZWwgY29ycC4gdW5kZXIgdGhlIEdQTCBpbiBEZWNlbWJlciAyMDAyLiBJdCBhbHNvIAorICAgIGluY2x1ZGVzIGNvZGUgZnJvbSB0aGUgTGludXggYWlyb25ldCBkcml2ZXJzIChDKSBCZW5qYW1pbiBSZWVkLCAKKyAgICBhbmQgdGhlIExpbnV4IFBDTUNJQSBwYWNrYWdlLCAoQykgRGF2aWQgSGluZHMgYW5kIHRoZSBMaW51eCB3aXJlbGVzcworICAgIGV4dGVuc2lvbnMsIChDKSBKZWFuIFRvdXJyaWxoZXMuCisKKyAgICBUaGUgZmlybXdhcmUgbW9kdWxlIGZvciByZWFkaW5nIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgY2FyZCBjb21lcyBmcm9tCisgICAgbmV0LnJ1c3NvdHRvLkF0bWVsTUFDRlcsIHdyaXR0ZW4gYnkgTWF0dGhldyBULiBSdXNzb3R0byBhbmQgY29weXJpZ2h0CisgICAgYnkgaGltLiBuZXQucnVzc290dG8uQXRtZWxNQUNGVyBpcyB1c2VkIHVuZGVyIHRoZSBHUEwgbGljZW5zZSB2ZXJzaW9uIDIuCisgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtb2R1bGUgaW4gYmluYXJ5IGZvcm0gYW5kLCB1bmRlciB0aGUgdGVybXMKKyAgICBvZiB0aGUgR1BMLCBpbiBzb3VyY2UgZm9ybS4gVGhlIHNvdXJjZSBpcyBsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggQXRtZWwgd2lyZWxlc3MgbGFuIGRyaXZlcnM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBGb3IgYWxsIHF1ZXJpZXMgYWJvdXQgdGhpcyBjb2RlLCBwbGVhc2UgY29udGFjdCB0aGUgY3VycmVudCBhdXRob3IsIAorICAgIFNpbW9uIEtlbGxleSA8c2ltb25AdGhla2VsbGV5cy5vcmcudWs+IGFuZCBub3QgQXRtZWwgQ29ycG9yYXRpb24uCisKKyAgICBDcmVkaXQgaXMgZHVlIHRvIEhQIFVLIGFuZCBDYW1icmlkZ2UgT25saW5lIFN5c3RlbXMgTHRkIGZvciBzdXBwbHlpbmcKKyAgICBoYXJkd2FyZSB1c2VkIGR1cmluZyBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlci4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlICJpZWVlODAyXzExLmgiCisjaW5jbHVkZSAiYXRtZWwuaCIKKworI2RlZmluZSBEUklWRVJfTUFKT1IgMAorI2RlZmluZSBEUklWRVJfTUlOT1IgOTYKKworTU9EVUxFX0FVVEhPUigiU2ltb24gS2VsbGV5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1cHBvcnQgZm9yIEF0bWVsIGF0NzZjNTB4IDgwMi4xMSB3aXJlbGVzcyBldGhlcm5ldCBjYXJkcy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJBdG1lbCBhdDc2YzUweCB3aXJlbGVzcyBjYXJkcyIpOworCisvKiBUaGUgbmFtZSBvZiB0aGUgZmlybXdhcmUgZmlsZSB0byBiZSBsb2FkZWQgCisgICBvdmVyLXJpZGVzIGFueSBhdXRvbWF0aWMgc2VsZWN0aW9uICovCitzdGF0aWMgY2hhciAqZmlybXdhcmUgPSBOVUxMOworbW9kdWxlX3BhcmFtKGZpcm13YXJlLCBjaGFycCwgMCk7CisKKy8qIHRhYmxlIG9mIGZpcm13YXJlIGZpbGUgbmFtZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgeyAKKwlBdG1lbEZXVHlwZSBmd190eXBlOworCWNvbnN0IGNoYXIgKmZ3X2ZpbGU7CisJY29uc3QgY2hhciAqZndfZmlsZV9leHQ7Cit9IGZ3X3RhYmxlW10gPSB7CisJeyBBVE1FTF9GV19UWVBFXzUwMiwgICAgICAiYXRtZWxfYXQ3NmM1MDIiLCAgICAgICJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFXzUwMkQsICAgICAiYXRtZWxfYXQ3NmM1MDJkIiwgICAgICJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFXzUwMkUsICAgICAiYXRtZWxfYXQ3NmM1MDJlIiwgICAgICJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFXzUwMl8zQ09NLCAiYXRtZWxfYXQ3NmM1MDJfM2NvbSIsICJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFXzUwNCwgICAgICAiYXRtZWxfYXQ3NmM1MDQiLCAgICAgICJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFXzUwNF8yOTU4LCAiYXRtZWxfYXQ3NmM1MDRfMjk1OCIsICJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFXzUwNEFfMjk1OCwiYXRtZWxfYXQ3NmM1MDRhXzI5NTgiLCJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFXzUwNiwgICAgICAiYXRtZWxfYXQ3NmM1MDYiLCAgICAgICJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFX05PTkUsICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICBOVUxMIH0KK307CisKKyNkZWZpbmUgTUFYX1NTSURfTEVOR1RIIDMyCisjZGVmaW5lIE1HTVRfSklGRklFUyAoMjU2ICogSFogLyAxMDApCisKKyNkZWZpbmUgTUFYX0JTU19FTlRSSUVTCTY0CQorCisvKiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgR0NSICAweDAwICAgIC8vICAgICAgKFNJUjApICBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgICAgICAgIAorI2RlZmluZSBCU1IgIDB4MDIgICAgLy8gICAgICAoU0lSMSkgIEJhbmsgU3dpdGNoaW5nIFNlbGVjdCBSZWdpc3RlciAKKyNkZWZpbmUgQVIgICAweDA0CisjZGVmaW5lIERSICAgMHgwOAorI2RlZmluZSBNUjEgIDB4MTIgICAgLy8gICAgICBNaXJyb3IgUmVnaXN0ZXIgMSAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBNUjIgIDB4MTQgICAgLy8gICAgICBNaXJyb3IgUmVnaXN0ZXIgMiAgCisjZGVmaW5lIE1SMyAgMHgxNiAgICAvLyAgICAgIE1pcnJvciBSZWdpc3RlciAzICAKKyNkZWZpbmUgTVI0ICAweDE4ICAgIC8vICAgICAgTWlycm9yIFJlZ2lzdGVyIDQgICAKKworI2RlZmluZSBHUFIxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMKKyNkZWZpbmUgR1BSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBlCisjZGVmaW5lIEdQUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorLy8KKy8vIENvbnN0YW50cyBmb3IgdGhlIEdDUiByZWdpc3Rlci4KKy8vCisjZGVmaW5lIEdDUl9SRU1BUCAgICAgMHgwNDAwICAgICAgICAgIC8vIFJlbWFwIGludGVybmFsIFNSQU0gdG8gMAorI2RlZmluZSBHQ1JfU1dSRVMgICAgIDB4MDA4MCAgICAgICAgICAvLyBCSVUgcmVzZXQgKEFSTSBhbmQgUEFJIGFyZSBOT1QgcmVzZXQpIAorI2RlZmluZSBHQ1JfQ09SRVMgICAgIDB4MDA2MCAgICAgICAgICAvLyBDb3JlIFJlc2V0IChBUk0gYW5kIFBBSSBhcmUgcmVzZXQpCisjZGVmaW5lIEdDUl9FTklOVCAgICAgMHgwMDAyICAgICAgICAgIC8vIEVuYWJsZSBJbnRlcnJ1cHRzICAgIAorI2RlZmluZSBHQ1JfQUNLSU5UICAgIDB4MDAwOCAgICAgICAgICAvLyBBY2tub3dsZWRnZSBJbnRlcnJ1cHRzCisKKyNkZWZpbmUgQlNTX1NSQU0gICAgICAweDAyMDAgICAgICAgICAgLy8gQU1CQSBtb2R1bGUgc2VsZWN0aW9uIC0tPiBTUkFNCisjZGVmaW5lIEJTU19JUkFNICAgICAgMHgwMTAwICAgICAgICAgIC8vIEFNQkEgbW9kdWxlIHNlbGVjdGlvbiAtLT4gSVJBTQorLy8KKy8vIENvbnN0YW50cyBmb3IgdGhlIE1SIHJlZ2lzdGVycy4KKy8vCisjZGVmaW5lIE1BQ19JTklUX0NPTVBMRVRFICAgICAgIDB4MDAwMSAgICAgICAgLy8gTUFDIGluaXQgaGFzIGJlZW4gY29tcGxldGVkCisjZGVmaW5lIE1BQ19CT09UX0NPTVBMRVRFICAgICAgIDB4MDAxMCAgICAgICAgLy8gTUFDIGJvb3QgaGFzIGJlZW4gY29tcGxldGVkCisjZGVmaW5lIE1BQ19JTklUX09LICAgICAgICAgICAgIDB4MDAwMiAgICAgICAgLy8gTUFDIGJvb3QgaGFzIGJlZW4gY29tcGxldGVkCisKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9BU1NfUkVRVUVTVCAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX0FTU19SRVNQT05TRSAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEM4MDIxMV9TVUJUWVBFX01HTVRfUkVBU1NfUkVRVUVTVCAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9SRUFTU19SRVNQT05TRSAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX1Byb2JlUmVxdWVzdCAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIEM4MDIxMV9TVUJUWVBFX01HTVRfUHJvYmVSZXNwb25zZSAgICAgICAgICAgICAgIDB4NTAKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9CRUFDT04gICAgICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX0FUSU0gICAgICAgICAgICAgICAgICAgICAgICAweDkwCisjZGVmaW5lIEM4MDIxMV9TVUJUWVBFX01HTVRfRElTQVNTT1NJQVRJT04gICAgICAgICAgICAgIDB4QTAKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9BdXRoZW50aWNhdGlvbiAgICAgICAgICAgICAgMHhCMAorI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX0RlYXV0aGVudGljYXRpb24gICAgMHhDMAorCisjZGVmaW5lIEM4MDIxMV9NR01UX0FBTl9PUEVOU1lTVEVNICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQzgwMjExX01HTVRfQUFOX1NIQVJFREtFWSAgICAgICAgICAgICAgIDB4MDAwMQorCisjZGVmaW5lIEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfRVNTICAgICAgICAgICAgICAweDAwMDEgIC8vIHNlZSA4MDIuMTEgcC41OAorI2RlZmluZSBDODAyMTFfTUdNVF9DQVBBQklMSVRZX0lCU1MgICAgICAgICAgICAgMHgwMDAyICAvLyAgICAgIC0gIiAtCisjZGVmaW5lIEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfQ0ZQb2xsYWJsZSAgICAgICAweDAwMDQgIC8vICAgICAgLSAiIC0KKyNkZWZpbmUgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9DRlBvbGxSZXF1ZXN0ICAgIDB4MDAwOCAgLy8gICAgICAtICIgLQorI2RlZmluZSBDODAyMTFfTUdNVF9DQVBBQklMSVRZX1ByaXZhY3kgICAgICAgICAgMHgwMDEwICAvLyAgICAgIC0gIiAtCisKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfU3VjY2VzcyAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfVW5zcGVjaWZpZWQgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfU3VwcG9ydENhcGFiaWxpdGllcyAgICAgIDEwCisjZGVmaW5lIEM4MDIxMV9NR01UX1NDX1JlYXNzRGVuaWVkICAgICAgICAgICAgICAxMQorI2RlZmluZSBDODAyMTFfTUdNVF9TQ19Bc3NEZW5pZWQgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfQXV0aEFsZ05vdFN1cHBvcnRlZCAgICAgIDEzCisjZGVmaW5lIEM4MDIxMV9NR01UX1NDX0F1dGhUcmFuc1NlcU51bUVycm9yICAgICAxNAorI2RlZmluZSBDODAyMTFfTUdNVF9TQ19BdXRoUmVqZWN0Q2hhbGxlbmdlICAgICAgMTUKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfQXV0aFJlamVjdFRpbWVvdXQgICAgICAgIDE2CisjZGVmaW5lIEM4MDIxMV9NR01UX1NDX0Fzc0RlbmllZEhhbmRsZUFQICAgICAgICAxNworI2RlZmluZSBDODAyMTFfTUdNVF9TQ19Bc3NEZW5pZWRCU1NSYXRlICAgICAgICAgMTgKKworI2RlZmluZSBDODAyMTFfTUdNVF9FbGVtZW50SURfU1NJRCAgICAgICAgICAgICAgMAorI2RlZmluZSBDODAyMTFfTUdNVF9FbGVtZW50SURfU3VwcG9ydGVkUmF0ZXMgICAgMQorI2RlZmluZSBDODAyMTFfTUdNVF9FbGVtZW50SURfQ2hhbGxlbmdlVGV4dCAgICAgMTYKKyNkZWZpbmUgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9TaG9ydFByZWFtYmxlICAgIDB4MDAyMAorCisjZGVmaW5lIE1JQl9NQVhfREFUQV9CWVRFUyAgICAyMTIKKyNkZWZpbmUgTUlCX0hFQURFUl9TSVpFICAgICAgIDQgICAgLyogZmlyc3QgZm91ciBmaWVsZHMgKi8KKworc3RydWN0IGdldF9zZXRfbWliIHsKKyAgICAgICAgdTggdHlwZTsKKyAgICAgICAgdTggc2l6ZTsKKyAgICAgICAgdTggaW5kZXg7CisgICAgICAgIHU4IHJlc2VydmVkOworICAgICAgICB1OCBkYXRhW01JQl9NQVhfREFUQV9CWVRFU107Cit9OworCitzdHJ1Y3QgcnhfZGVzYyB7CisgICAgICAgIHUzMiAgICAgICAgICBOZXh0OworICAgICAgICB1MTYgICAgICAgICAgTXNkdVBvczsKKyAgICAgICAgdTE2ICAgICAgICAgIE1zZHVTaXplOworCQorICAgICAgICB1OCAgICAgICAgICAgU3RhdGU7CisgICAgICAgIHU4ICAgICAgICAgICBTdGF0dXM7CisgICAgICAgIHU4ICAgICAgICAgICBSYXRlOworICAgICAgICB1OCAgICAgICAgICAgUnNzaTsKKyAgICAgICAgdTggICAgICAgICAgIExpbmtRdWFsaXR5OworICAgICAgICB1OCAgICAgICAgICAgUHJlYW1ibGVUeXBlOworICAgICAgICB1MTYgICAgICAgICAgRHVyYXRpb247CisgICAgICAgIHUzMiAgICAgICAgICBSeFRpbWU7CisKK307CisKKyNkZWZpbmUgUlhfREVTQ19GTEFHX1ZBTElEICAgICAgIDB4ODAKKyNkZWZpbmUgUlhfREVTQ19GTEFHX0NPTlNVTUVEICAgIDB4NDAKKyNkZWZpbmUgUlhfREVTQ19GTEFHX0lETEUgICAgICAgIDB4MDAKKworI2RlZmluZSBSWF9TVEFUVVNfU1VDQ0VTUyAgICAgICAgMHgwMAorCisjZGVmaW5lIFJYX0RFU0NfTVNEVV9QT1NfT0ZGU0VUICAgICAgNAorI2RlZmluZSBSWF9ERVNDX01TRFVfU0laRV9PRkZTRVQgICAgIDYKKyNkZWZpbmUgUlhfREVTQ19GTEFHU19PRkZTRVQgICAgICAgICA4CisjZGVmaW5lIFJYX0RFU0NfU1RBVFVTX09GRlNFVCAgICAgICAgOQorI2RlZmluZSBSWF9ERVNDX1JTU0lfT0ZGU0VUICAgICAgICAgIDExCisjZGVmaW5lIFJYX0RFU0NfTElOS19RVUFMSVRZX09GRlNFVCAgMTIKKyNkZWZpbmUgUlhfREVTQ19QUkVBTUJMRV9UWVBFX09GRlNFVCAxMworI2RlZmluZSBSWF9ERVNDX0RVUkFUSU9OX09GRlNFVCAgICAgIDE0CisjZGVmaW5lIFJYX0RFU0NfUlhfVElNRV9PRkZTRVQgICAgICAgMTYKKworCitzdHJ1Y3QgdHhfZGVzYyB7CisJdTMyICAgICAgIE5leHREZXNjcmlwdG9yOworCXUxNiAgICAgICBUeFN0YXJ0T2ZGcmFtZTsKKwl1MTYgICAgICAgVHhMZW5ndGg7CisJCisJdTggICAgICAgIFR4U3RhdGU7CisJdTggICAgICAgIFR4U3RhdHVzOworCXU4ICAgICAgICBSZXRyeUNvdW50OworCQorCXU4ICAgICAgICBUeFJhdGU7CisKKwl1OCAgICAgICAgS2V5SW5kZXg7CisJdTggICAgICAgIENoaXBlclR5cGU7CisJdTggICAgICAgIENoaXByZUxlbmd0aDsKKyAgICAgICAgdTggICAgICAgIFJlc2VydmVkMTsKKworCXU4ICAgICAgICBSZXNlcnZlZDsKKwl1OCAgICAgICAgUGFja2V0VHlwZTsKKwl1MTYgICAgICAgSG9zdFR4TGVuZ3RoOworCQorfTsKKworCisjZGVmaW5lIFRYX0RFU0NfTkVYVF9PRkZTRVQgICAgICAgICAgMAorI2RlZmluZSBUWF9ERVNDX1BPU19PRkZTRVQgICAgICAgICAgIDQKKyNkZWZpbmUgVFhfREVTQ19TSVpFX09GRlNFVCAgICAgICAgICA2CisjZGVmaW5lIFRYX0RFU0NfRkxBR1NfT0ZGU0VUICAgICAgICAgOAorI2RlZmluZSBUWF9ERVNDX1NUQVRVU19PRkZTRVQgICAgICAgIDkKKyNkZWZpbmUgVFhfREVTQ19SRVRSWV9PRkZTRVQgICAgICAgICAxMAorI2RlZmluZSBUWF9ERVNDX1JBVEVfT0ZGU0VUICAgICAgICAgIDExCisjZGVmaW5lIFRYX0RFU0NfS0VZX0lOREVYX09GRlNFVCAgICAgMTIKKyNkZWZpbmUgVFhfREVTQ19DSVBIRVJfVFlQRV9PRkZTRVQgICAxMworI2RlZmluZSBUWF9ERVNDX0NJUEhFUl9MRU5HVEhfT0ZGU0VUIDE0CisjZGVmaW5lIFRYX0RFU0NfUEFDS0VUX1RZUEVfT0ZGU0VUICAgMTcKKyNkZWZpbmUgVFhfREVTQ19IT1NUX0xFTkdUSF9PRkZTRVQgICAxOAorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSG9zdC1NQUMgaW50ZXJmYWNlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgVFhfU1RBVFVTX1NVQ0NFU1MgICAgICAgMHgwMAorCisjZGVmaW5lIFRYX0ZJUk1fT1dOICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgVFhfRE9ORSAgICAgICAgICAgICAgICAgMHg0MAorCisKKyNkZWZpbmUgVFhfRVJST1IgICAgICAgICAgICAgICAgMHgwMQorCisjZGVmaW5lIFRYX1BBQ0tFVF9UWVBFX0RBVEEgICAgIDB4MDEKKyNkZWZpbmUgVFhfUEFDS0VUX1RZUEVfTUdNVCAgICAgMHgwMgorCisjZGVmaW5lIElTUl9FTVBUWSAgICAgICAgICAgICAgIDB4MDAgICAgICAgIC8vIG5vIGJpdHMgc2V0IGluIElTUgorI2RlZmluZSBJU1JfVHhDT01QTEVURSAgICAgICAgICAweDAxICAgICAgICAvLyBwYWNrZXQgdHJhbnNtaXR0ZWQKKyNkZWZpbmUgSVNSX1J4Q09NUExFVEUgICAgICAgICAgMHgwMiAgICAgICAgLy8gcGFja2V0IHJlY2VpdmVkCisjZGVmaW5lIElTUl9SeEZSQU1FTE9TVCAgICAgICAgIDB4MDQgICAgICAgIC8vIFJ4IEZyYW1lIGxvc3QKKyNkZWZpbmUgSVNSX0ZBVEFMX0VSUk9SICAgICAgICAgMHgwOCAgICAgICAgLy8gRmF0YWwgZXJyb3IKKyNkZWZpbmUgSVNSX0NPTU1BTkRfQ09NUExFVEUgICAgMHgxMCAgICAgICAgLy8gY29tbWFuZCBjb21wbGV0ZWQKKyNkZWZpbmUgSVNSX09VVF9PRl9SQU5HRSAgICAgICAgMHgyMCAgICAgICAgLy8gY29tbWFuZCBjb21wbGV0ZWQKKyNkZWZpbmUgSVNSX0lCU1NfTUVSR0UgICAgICAgICAgMHg0MCAgICAgICAgLy8gKDQuMS4yLjMwKTogSUJTUyBtZXJnZQorI2RlZmluZSBJU1JfR0VORVJJQ19JUlEgICAgICAgICAweDgwICAgICAgICAgICAgICAgIAorCisKKyNkZWZpbmUgTG9jYWxfTWliX1R5cGUgICAgICAgICAgMHgwMQorI2RlZmluZSBNYWNfQWRkcmVzc19NaWJfVHlwZSAgICAweDAyCisjZGVmaW5lIE1hY19NaWJfVHlwZSAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgU3RhdGlzdGljc19NaWJfVHlwZSAgICAgMHgwNAorI2RlZmluZSBNYWNfTWdtdF9NaWJfVHlwZSAgICAgICAweDA1CisjZGVmaW5lIE1hY19XZXBfTWliX1R5cGUgICAgICAgIDB4MDYKKyNkZWZpbmUgUGh5X01pYl9UeXBlICAgICAgICAgICAgMHgwNworI2RlZmluZSBNdWx0aV9Eb21haW5fTUlCICAgICAgICAweDA4CisKKyNkZWZpbmUgTUFDX01HTVRfTUlCX0NVUl9CU1NJRF9QT1MgICAgICAgICAgICAxNAorI2RlZmluZSBNQUNfTUlCX0ZSQUdfVEhSRVNIT0xEX1BPUyAgICAgICAgICAgIDgKKyNkZWZpbmUgTUFDX01JQl9SVFNfVEhSRVNIT0xEX1BPUyAgICAgICAgICAgICAxMAorI2RlZmluZSBNQUNfTUlCX1NIT1JUX1JFVFJZX1BPUyAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE1BQ19NSUJfTE9OR19SRVRSWV9QT1MgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgTUFDX01JQl9TSE9SVF9SRVRSWV9MSU1JVF9QT1MgICAgICAgICAxNgorI2RlZmluZSBNQUNfTUdNVF9NSUJfQkVBQ09OX1BFUl9QT1MgICAgICAgICAgIDAKKyNkZWZpbmUgTUFDX01HTVRfTUlCX1NUQVRJT05fSURfUE9TICAgICAgICAgICA2CisjZGVmaW5lIE1BQ19NR01UX01JQl9DVVJfUFJJVkFDWV9QT1MgICAgICAgICAgMTEKKyNkZWZpbmUgTUFDX01HTVRfTUlCX0NVUl9CU1NJRF9QT1MgICAgICAgICAgICAxNAorI2RlZmluZSBNQUNfTUdNVF9NSUJfUFNfTU9ERV9QT1MgICAgICAgICAgICAgIDUzCisjZGVmaW5lIE1BQ19NR01UX01JQl9MSVNURU5fSU5URVJWQUxfUE9TICAgICAgNTQKKyNkZWZpbmUgTUFDX01HTVRfTUlCX01VTFRJX0RPTUFJTl9JTVBMRU1FTlRFRCA1NgorI2RlZmluZSBNQUNfTUdNVF9NSUJfTVVMVElfRE9NQUlOX0VOQUJMRUQgICAgIDU3CisjZGVmaW5lIFBIWV9NSUJfQ0hBTk5FTF9QT1MgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgUEhZX01JQl9SQVRFX1NFVF9QT1MgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBQSFlfTUlCX1JFR19ET01BSU5fUE9TICAgICAgICAgICAgICAgIDI2CisjZGVmaW5lIExPQ0FMX01JQl9BVVRPX1RYX1JBVEVfUE9TICAgICAgICAgICAgMworI2RlZmluZSBMT0NBTF9NSUJfU1NJRF9TSVpFICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTE9DQUxfTUlCX1RYX1BST01JU0NVT1VTX1BPUyAgICAgICAgICA2CisjZGVmaW5lIExPQ0FMX01JQl9UWF9NR01UX1JBVEVfUE9TICAgICAgICAgICAgNworI2RlZmluZSBMT0NBTF9NSUJfVFhfQ09OVFJPTF9SQVRFX1BPUyAgICAgICAgIDgKKyNkZWZpbmUgTE9DQUxfTUlCX1BSRUFNQkxFX1RZUEUgICAgICAgICAgICAgICA5CisjZGVmaW5lIE1BQ19BRERSX01JQl9NQUNfQUREUl9QT1MgICAgICAgICAgICAgMAorCisKKyNkZWZpbmUgICAgICAgICBDTURfU2V0X01JQl9WYXJzICAgICAgICAgICAgICAweDAxCisjZGVmaW5lICAgICAgICAgQ01EX0dldF9NSUJfVmFycyAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSAgICAgICAgIENNRF9TY2FuICAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgICAgICAgICBDTURfSm9pbiAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lICAgICAgICAgQ01EX1N0YXJ0ICAgICAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSAgICAgICAgIENNRF9FbmFibGVSYWRpbyAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgICAgICAgICBDTURfRGlzYWJsZVJhZGlvICAgICAgICAgICAgICAweDA3CisjZGVmaW5lICAgICAgICAgQ01EX1NpdGVTdXJ2ZXkgICAgICAgICAgICAgICAgMHgwQgorCisjZGVmaW5lICAgICAgICAgQ01EX1NUQVRVU19JRExFICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgICAgICBDTURfU1RBVFVTX0NPTVBMRVRFICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSAgICAgICAgIENNRF9TVEFUVVNfVU5LTk9XTiAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lICAgICAgICAgQ01EX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUiAgICAgIDB4MDMKKyNkZWZpbmUgICAgICAgICBDTURfU1RBVFVTX0ZVTkNUSU9OX05PVF9TVVBQT1JURUQgMHgwNAorI2RlZmluZSAgICAgICAgIENNRF9TVEFUVVNfVElNRV9PVVQgICAgICAgICAgICAgICAweDA3CisjZGVmaW5lICAgICAgICAgQ01EX1NUQVRVU19JTl9QUk9HUkVTUyAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgICAgICAgICBDTURfU1RBVFVTX1JFSkVDVEVEX1JBRElPX09GRiAgICAgMHgwOQorI2RlZmluZSAgICAgICAgIENNRF9TVEFUVVNfSE9TVF9FUlJPUiAgICAgICAgICAgICAweEZGCisjZGVmaW5lICAgICAgICAgQ01EX1NUQVRVU19CVVNZICAgICAgICAgICAgICAgICAgIDB4RkUKKworCisjZGVmaW5lIENNRF9CTE9DS19DT01NQU5EX09GRlNFVCAgICAgICAgMAorI2RlZmluZSBDTURfQkxPQ0tfU1RBVFVTX09GRlNFVCAgICAgICAgIDEKKyNkZWZpbmUgQ01EX0JMT0NLX1BBUkFNRVRFUlNfT0ZGU0VUICAgICA0CisKKyNkZWZpbmUgU0NBTl9PUFRJT05TX1NJVEVfU1VSVkVZICAgICAgICAweDgwCisKKyNkZWZpbmUgTUdNVF9GUkFNRV9CT0RZX09GRlNFVAkJMjQKKyNkZWZpbmUgTUFYX0FVVEhFTlRJQ0FUSU9OX1JFVFJJRVMJMworI2RlZmluZSBNQVhfQVNTT0NJQVRJT05fUkVUUklFUyAJMworCisjZGVmaW5lIEFVVEhFTlRJQ0FUSU9OX1JFU1BPTlNFX1RJTUVfT1VUICAxMDAwCisKKyNkZWZpbmUgTUFYX1dJUkVMRVNTX0JPRFkgIDIzMTYgLyogbXR1IGlzIDIzMTIsIENSQyBpcyA0ICovCisjZGVmaW5lIExPT1BfUkVUUllfTElNSVQgICA1MDAwMDAKKworI2RlZmluZSBBQ1RJVkVfTU9ERSAJMQorI2RlZmluZSBQU19NT0RFIAkyCisKKyNkZWZpbmUgTUFYX0VOQ1JZUFRJT05fS0VZUyA0CisjZGVmaW5lIE1BWF9FTkNSWVBUSU9OX0tFWV9TSVpFIDQwCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gODAyLjExIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLworLy8gUmVndWxhdG9yeSBEb21haW5zCisvLworCisjZGVmaW5lIFJFR19ET01BSU5fRkNDCQkweDEwCS8vQ2hhbm5lbHMJMS0xMQlVU0EKKyNkZWZpbmUgUkVHX0RPTUFJTl9ET0MJCTB4MjAJLy9DaGFubmVsCTEtMTEJQ2FuYWRhCisjZGVmaW5lIFJFR19ET01BSU5fRVRTSQkJMHgzMAkvL0NoYW5uZWwJMS0xMwlFdXJvcGUgKGV4IFNwYWluL0ZyYW5jZSkKKyNkZWZpbmUgUkVHX0RPTUFJTl9TUEFJTgkweDMxCS8vQ2hhbm5lbAkxMC0xMQlTcGFpbgorI2RlZmluZSBSRUdfRE9NQUlOX0ZSQU5DRQkweDMyCS8vQ2hhbm5lbAkxMC0xMwlGcmFuY2UKKyNkZWZpbmUgUkVHX0RPTUFJTl9NS0sJCTB4NDAJLy9DaGFubmVsCTE0CUphcGFuCisjZGVmaW5lIFJFR19ET01BSU5fTUtLMQkJMHg0MQkvL0NoYW5uZWwJMS0xNAlKYXBhbihNS0sxKQorI2RlZmluZSBSRUdfRE9NQUlOX0lTUkFFTAkweDUwCS8vQ2hhbm5lbAkzLTkJSVNSQUVMCisKKyNkZWZpbmUgQlNTX1RZUEVfQURfSE9DIAkxCisjZGVmaW5lIEJTU19UWVBFX0lORlJBU1RSVUNUVVJFIDIKKworI2RlZmluZSBTQ0FOX1RZUEVfQUNUSVZFCTAKKyNkZWZpbmUgU0NBTl9UWVBFX1BBU1NJVkUJMQorCisjZGVmaW5lIExPTkdfUFJFQU1CTEUJCTAKKyNkZWZpbmUgU0hPUlRfUFJFQU1CTEUJCTEKKyNkZWZpbmUgQVVUT19QUkVBTUJMRQkJMgorCisjZGVmaW5lIERBVEFfRlJBTUVfV1NfSEVBREVSX1NJWkUgICAzMAorCisvKiBwcm9taXNjdW91cyBtb2RlIGNvbnRyb2wgKi8gCisjZGVmaW5lIFBST01fTU9ERV9PRkYJCQkweDAKKyNkZWZpbmUgUFJPTV9NT0RFX1VOS05PV04JCTB4MQorI2RlZmluZSBQUk9NX01PREVfQ1JDX0ZBSUxFRAkJMHgyCisjZGVmaW5lIFBST01fTU9ERV9EVVBMSUNBVEVECQkweDQKKyNkZWZpbmUgUFJPTV9NT0RFX01HTVQJCQkweDgKKyNkZWZpbmUgUFJPTV9NT0RFX0NUUkwJCQkweDEwCisjZGVmaW5lIFBST01fTU9ERV9CQURfUFJPVE9DT0wJCTB4MjAKKworCisjZGVmaW5lIElGQUNFX0lOVF9TVEFUVVNfT0ZGU0VUIAkwCisjZGVmaW5lIElGQUNFX0lOVF9NQVNLX09GRlNFVAkJMQorI2RlZmluZSBJRkFDRV9MT0NLT1VUX0hPU1RfT0ZGU0VUCTIKKyNkZWZpbmUgSUZBQ0VfTE9DS09VVF9NQUNfT0ZGU0VUCTMKKyNkZWZpbmUgSUZBQ0VfRlVOQ19DVFJMX09GRlNFVAkJMjgKKyNkZWZpbmUgSUZBQ0VfTUFDX1NUQVRfT0ZGU0VUCQkzMAorI2RlZmluZSBJRkFDRV9HRU5FUklDX0lOVF9UWVBFX09GRlNFVAkzMgorCisjZGVmaW5lIENJUEhFUl9TVUlURV9OT05FICAgICAwIAorI2RlZmluZSBDSVBIRVJfU1VJVEVfV0VQXzY0ICAgMQorI2RlZmluZSBDSVBIRVJfU1VJVEVfVEtJUCAgICAgMgorI2RlZmluZSBDSVBIRVJfU1VJVEVfQUVTICAgICAgMworI2RlZmluZSBDSVBIRVJfU1VJVEVfQ0NYICAgICAgNAorI2RlZmluZSBDSVBIRVJfU1VJVEVfV0VQXzEyOCAgNQorCisvLworLy8gSUZBQ0UgTUFDUk9TICYgZGVmaW5pdGlvbnMKKy8vCisvLworCisvLyBGdW5jQ3RybCBmaWVsZDogCisvLworI2RlZmluZSBGVU5DX0NUUkxfVHhFTkFCTEUJCTB4MTAKKyNkZWZpbmUgRlVOQ19DVFJMX1J4RU5BQkxFCQkweDIwCisjZGVmaW5lIEZVTkNfQ1RSTF9JTklUX0NPTVBMRVRFIAkweDAxCisKKy8qIEEgc3R1YiBmaXJtd2FyZSBpbWFnZSB3aGljaCByZWFkcyB0aGUgTUFDIGFkZHJlc3MgZnJvbSBOVlJBTSBvbiB0aGUgY2FyZC4KKyAgIEZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24gYW5kIHNvdXJjZSBzZWUgdGhlIGVuZCBvZiB0aGlzIGZpbGUuICovCitzdGF0aWMgdTggbWFjX3JlYWRlcltdID0geworCTB4MDYsMHgwMCwweDAwLDB4ZWEsMHgwNCwweDAwLDB4MDAsMHhlYSwweDAzLDB4MDAsMHgwMCwweGVhLDB4MDIsMHgwMCwweDAwLDB4ZWEsCisJMHgwMSwweDAwLDB4MDAsMHhlYSwweDAwLDB4MDAsMHgwMCwweGVhLDB4ZmYsMHhmZiwweGZmLDB4ZWEsMHhmZSwweGZmLDB4ZmYsMHhlYSwKKwkweGQzLDB4MDAsMHhhMCwweGUzLDB4MDAsMHhmMCwweDIxLDB4ZTEsMHgwZSwweDA0LDB4YTAsMHhlMywweDAwLDB4MTAsMHhhMCwweGUzLAorCTB4ODEsMHgxMSwweGEwLDB4ZTEsMHgwMCwweDEwLDB4ODEsMHhlMywweDAwLDB4MTAsMHg4MCwweGU1LDB4MWMsMHgxMCwweDkwLDB4ZTUsCisJMHgxMCwweDEwLDB4YzEsMHhlMywweDFjLDB4MTAsMHg4MCwweGU1LDB4MDEsMHgxMCwweGEwLDB4ZTMsMHgwOCwweDEwLDB4ODAsMHhlNSwKKwkweDAyLDB4MDMsMHhhMCwweGUzLDB4MDAsMHgxMCwweGEwLDB4ZTMsMHhiMCwweDEwLDB4YzAsMHhlMSwweGI0LDB4MTAsMHhjMCwweGUxLAorCTB4YjgsMHgxMCwweGMwLDB4ZTEsMHhiYywweDEwLDB4YzAsMHhlMSwweDU2LDB4ZGMsMHhhMCwweGUzLDB4MjEsMHgwMCwweDAwLDB4ZWIsCisJMHgwYSwweDAwLDB4YTAsMHhlMywweDFhLDB4MDAsMHgwMCwweGViLDB4MTAsMHgwMCwweDAwLDB4ZWIsMHgwNywweDAwLDB4MDAsMHhlYiwKKwkweDAyLDB4MDMsMHhhMCwweGUzLDB4MDIsMHgxNCwweGEwLDB4ZTMsMHhiNCwweDEwLDB4YzAsMHhlMSwweDRjLDB4MTAsMHg5ZiwweGU1LAorCTB4YmMsMHgxMCwweGMwLDB4ZTEsMHgxMCwweDEwLDB4YTAsMHhlMywweGI4LDB4MTAsMHhjMCwweGUxLDB4ZmUsMHhmZiwweGZmLDB4ZWEsCisJMHgwMCwweDQwLDB4MmQsMHhlOSwweDAwLDB4MjAsMHhhMCwweGUzLDB4MDIsMHgzYywweGEwLDB4ZTMsMHgwMCwweDEwLDB4YTAsMHhlMywKKwkweDI4LDB4MDAsMHg5ZiwweGU1LDB4MzcsMHgwMCwweDAwLDB4ZWIsMHgwMCwweDQwLDB4YmQsMHhlOCwweDFlLDB4ZmYsMHgyZiwweGUxLAorCTB4MDAsMHg0MCwweDJkLDB4ZTksMHgxMiwweDJlLDB4YTAsMHhlMywweDA2LDB4MzAsMHhhMCwweGUzLDB4MDAsMHgxMCwweGEwLDB4ZTMsCisJMHgwMiwweDA0LDB4YTAsMHhlMywweDJmLDB4MDAsMHgwMCwweGViLDB4MDAsMHg0MCwweGJkLDB4ZTgsMHgxZSwweGZmLDB4MmYsMHhlMSwKKwkweDAwLDB4MDIsMHgwMCwweDAyLDB4ODAsMHgwMSwweDkwLDB4ZTAsMHgwMSwweDAwLDB4MDAsMHgwYSwweDAxLDB4MDAsMHg1MCwweGUyLAorCTB4ZmMsMHhmZiwweGZmLDB4ZWEsMHgxZSwweGZmLDB4MmYsMHhlMSwweDgwLDB4MTAsMHhhMCwweGUzLDB4ZjMsMHgwNiwweGEwLDB4ZTMsCisJMHgwMCwweDEwLDB4ODAsMHhlNSwweDAwLDB4MTAsMHhhMCwweGUzLDB4MDAsMHgxMCwweDgwLDB4ZTUsMHgwMSwweDEwLDB4YTAsMHhlMywKKwkweDA0LDB4MTAsMHg4MCwweGU1LDB4MDAsMHgxMCwweDgwLDB4ZTUsMHgwZSwweDM0LDB4YTAsMHhlMywweDFjLDB4MTAsMHg5MywweGU1LAorCTB4MDIsMHgxYSwweDgxLDB4ZTMsMHgxYywweDEwLDB4ODMsMHhlNSwweDU4LDB4MTEsMHg5ZiwweGU1LDB4MzAsMHgxMCwweDgwLDB4ZTUsCisJMHg1NCwweDExLDB4OWYsMHhlNSwweDM0LDB4MTAsMHg4MCwweGU1LDB4MzgsMHgxMCwweDgwLDB4ZTUsMHgzYywweDEwLDB4ODAsMHhlNSwKKwkweDEwLDB4MTAsMHg5MCwweGU1LDB4MDgsMHgwMCwweDkwLDB4ZTUsMHgxZSwweGZmLDB4MmYsMHhlMSwweGYzLDB4MTYsMHhhMCwweGUzLAorCTB4MDgsMHgwMCwweDkxLDB4ZTUsMHgwNSwweDAwLDB4YTAsMHhlMywweDBjLDB4MDAsMHg4MSwweGU1LDB4MTAsMHgwMCwweDkxLDB4ZTUsCisJMHgwMiwweDAwLDB4MTAsMHhlMywweGZjLDB4ZmYsMHhmZiwweDBhLDB4ZmYsMHgwMCwweGEwLDB4ZTMsMHgwYywweDAwLDB4ODEsMHhlNSwKKwkweDEwLDB4MDAsMHg5MSwweGU1LDB4MDIsMHgwMCwweDEwLDB4ZTMsMHhmYywweGZmLDB4ZmYsMHgwYSwweDA4LDB4MDAsMHg5MSwweGU1LAorCTB4MTAsMHgwMCwweDkxLDB4ZTUsMHgwMSwweDAwLDB4MTAsMHhlMywweGZjLDB4ZmYsMHhmZiwweDBhLDB4MDgsMHgwMCwweDkxLDB4ZTUsCisJMHhmZiwweDAwLDB4MDAsMHhlMiwweDFlLDB4ZmYsMHgyZiwweGUxLDB4MzAsMHg0MCwweDJkLDB4ZTksMHgwMCwweDUwLDB4YTAsMHhlMSwKKwkweDAzLDB4NDAsMHhhMCwweGUxLDB4YTIsMHgwMiwweGEwLDB4ZTEsMHgwOCwweDAwLDB4MDAsMHhlMiwweDAzLDB4MDAsMHg4MCwweGUyLAorCTB4ZDgsMHgxMCwweDlmLDB4ZTUsMHgwMCwweDAwLDB4YzEsMHhlNSwweDAxLDB4MjAsMHhjMSwweGU1LDB4ZTIsMHhmZiwweGZmLDB4ZWIsCisJMHgwMSwweDAwLDB4MTAsMHhlMywweGZjLDB4ZmYsMHhmZiwweDFhLDB4MTQsMHgwMCwweGEwLDB4ZTMsMHhjNCwweGZmLDB4ZmYsMHhlYiwKKwkweDA0LDB4MjAsMHhhMCwweGUxLDB4MDUsMHgxMCwweGEwLDB4ZTEsMHgwMiwweDAwLDB4YTAsMHhlMywweDAxLDB4MDAsMHgwMCwweGViLAorCTB4MzAsMHg0MCwweGJkLDB4ZTgsMHgxZSwweGZmLDB4MmYsMHhlMSwweDcwLDB4NDAsMHgyZCwweGU5LDB4ZjMsMHg0NiwweGEwLDB4ZTMsCisJMHgwMCwweDMwLDB4YTAsMHhlMywweDAwLDB4MDAsMHg1MCwweGUzLDB4MDgsMHgwMCwweDAwLDB4OWEsMHg4YywweDUwLDB4OWYsMHhlNSwKKwkweDAzLDB4NjAsMHhkNSwweGU3LDB4MGMsMHg2MCwweDg0LDB4ZTUsMHgxMCwweDYwLDB4OTQsMHhlNSwweDAyLDB4MDAsMHgxNiwweGUzLAorCTB4ZmMsMHhmZiwweGZmLDB4MGEsMHgwMSwweDMwLDB4ODMsMHhlMiwweDAwLDB4MDAsMHg1MywweGUxLDB4ZjcsMHhmZiwweGZmLDB4M2EsCisJMHhmZiwweDMwLDB4YTAsMHhlMywweDBjLDB4MzAsMHg4NCwweGU1LDB4MDgsMHgwMCwweDk0LDB4ZTUsMHgxMCwweDAwLDB4OTQsMHhlNSwKKwkweDAxLDB4MDAsMHgxMCwweGUzLDB4ZmMsMHhmZiwweGZmLDB4MGEsMHgwOCwweDAwLDB4OTQsMHhlNSwweDAwLDB4MDAsMHhhMCwweGUzLAorCTB4MDAsMHgwMCwweDUyLDB4ZTMsMHgwYiwweDAwLDB4MDAsMHg5YSwweDEwLDB4NTAsMHg5NCwweGU1LDB4MDIsMHgwMCwweDE1LDB4ZTMsCisJMHhmYywweGZmLDB4ZmYsMHgwYSwweDBjLDB4MzAsMHg4NCwweGU1LDB4MTAsMHg1MCwweDk0LDB4ZTUsMHgwMSwweDAwLDB4MTUsMHhlMywKKwkweGZjLDB4ZmYsMHhmZiwweDBhLDB4MDgsMHg1MCwweDk0LDB4ZTUsMHgwMSwweDUwLDB4YzEsMHhlNCwweDAxLDB4MDAsMHg4MCwweGUyLAorCTB4MDIsMHgwMCwweDUwLDB4ZTEsMHhmMywweGZmLDB4ZmYsMHgzYSwweGM4LDB4MDAsMHhhMCwweGUzLDB4OTgsMHhmZiwweGZmLDB4ZWIsCisJMHg3MCwweDQwLDB4YmQsMHhlOCwweDFlLDB4ZmYsMHgyZiwweGUxLDB4MDEsMHgwYywweDAwLDB4MDIsMHgwMSwweDAyLDB4MDAsMHgwMiwKKwkweDAwLDB4MDEsMHgwMCwweDAyCit9OworCitzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSB7CisJdm9pZCAqY2FyZDsgLyogQnVzIGRlcGVuZGVudCBzdHVjdHVyZSB2YXJpZXMgZm9yIFBDY2FyZCAqLworCWludCAoKnByZXNlbnRfY2FsbGJhY2spKHZvaWQgKik7IC8qIEFuZCBjYWxsYmFjayB3aGljaCB1c2VzIGl0ICovCisJY2hhciBmaXJtd2FyZV9pZFszMl07CisJQXRtZWxGV1R5cGUgZmlybXdhcmVfdHlwZTsKKwl1OCAqZmlybXdhcmU7CisJaW50IGZpcm13YXJlX2xlbmd0aDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBtYW5hZ2VtZW50X3RpbWVyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGRldmljZSAqc3lzX2RldjsKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyB3c3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CS8vIGRldmljZSBzdGF0cworCXNwaW5sb2NrX3QgaXJxbG9jaywgdGltZXJsb2NrOwkvLyBzcGlubG9ja3MKKwllbnVtIHsgQlVTX1RZUEVfUENDQVJELCBCVVNfVFlQRV9QQ0kgfSBidXNfdHlwZTsKKwllbnVtIHsgCisJCUNBUkRfVFlQRV9QQVJBTExFTF9GTEFTSCwgCisJCUNBUkRfVFlQRV9TUElfRkxBU0gsCisJCUNBUkRfVFlQRV9FRVBST00gCisJfSBjYXJkX3R5cGU7CisJaW50IGRvX3J4X2NyYzsgLyogSWYgd2UgbmVlZCB0byBDUkMgaW5jb21pbmcgcGFja2V0cyAqLworCWludCBwcm9iZV9jcmM7IC8qIHNldCBpZiB3ZSBkb24ndCB5ZXQga25vdyAqLworCWludCBjcmNfb2tfY250LCBjcmNfa29fY250OyAvKiBjb3VudGVycyBmb3IgcHJvYmluZyAqLworCXUxNiByeF9kZXNjX2hlYWQ7CisJdTE2IHR4X2Rlc2NfZnJlZSwgdHhfZGVzY19oZWFkLCB0eF9kZXNjX3RhaWwsIHR4X2Rlc2NfcHJldmlvdXM7CisJdTE2IHR4X2ZyZWVfbWVtLCB0eF9idWZmX2hlYWQsIHR4X2J1ZmZfdGFpbDsKKwkKKwl1MTYgZnJhZ19zZXEsIGZyYWdfbGVuLCBmcmFnX25vOworCXU4IGZyYWdfc291cmNlWzZdOyAKKwkKKwl1OCB3ZXBfaXNfb24sIGRlZmF1bHRfa2V5LCBleGNsdWRlX3VuZW5jcnlwdGVkLCBlbmNyeXB0aW9uX2xldmVsOworCXU4IGdyb3VwX2NpcGhlcl9zdWl0ZSwgcGFpcndpc2VfY2lwaGVyX3N1aXRlOworCXU4IHdlcF9rZXlzW01BWF9FTkNSWVBUSU9OX0tFWVNdW01BWF9FTkNSWVBUSU9OX0tFWV9TSVpFXTsKKwlpbnQgd2VwX2tleV9sZW5bTUFYX0VOQ1JZUFRJT05fS0VZU107IAorCWludCB1c2Vfd3BhLCByYWRpb19vbl9icm9rZW47IC8qIGZpcm13YXJlIGRlcGVuZGVudCBzdHVmZi4gKi8KKworCXUxNiBob3N0X2luZm9fYmFzZTsKKwlzdHJ1Y3QgaG9zdF9pbmZvX3N0cnVjdCB7IAorCQkvKiBOQiB0aGlzIGlzIG1hdGNoZWQgdG8gdGhlIGhhcmR3YXJlLCBkb24ndCBjaGFuZ2UuICovCisJCXU4IHZvbGF0aWxlIGludF9zdGF0dXM7CisJCXU4IHZvbGF0aWxlIGludF9tYXNrOworCQl1OCB2b2xhdGlsZSBsb2Nrb3V0X2hvc3Q7CisJCXU4IHZvbGF0aWxlIGxvY2tvdXRfbWFjOworCisJCXUxNiB0eF9idWZmX3BvczsKKwkJdTE2IHR4X2J1ZmZfc2l6ZTsKKwkJdTE2IHR4X2Rlc2NfcG9zOworCQl1MTYgdHhfZGVzY19jb3VudDsKKworCQl1MTYgcnhfYnVmZl9wb3M7CisJCXUxNiByeF9idWZmX3NpemU7CisJCXUxNiByeF9kZXNjX3BvczsKKwkJdTE2IHJ4X2Rlc2NfY291bnQ7CisJCQorCQl1MTYgYnVpbGRfdmVyc2lvbjsKKwkJdTE2IGNvbW1hbmRfcG9zOyAJCisJCQorCQl1MTYgbWFqb3JfdmVyc2lvbjsKKwkJdTE2IG1pbm9yX3ZlcnNpb247CisJCQorCQl1MTYgZnVuY19jdHJsOworCQl1MTYgbWFjX3N0YXR1czsKKwkJdTE2IGdlbmVyaWNfSVJRX3R5cGU7CisJCXU4ICByZXNlcnZlZFsyXTsKKwl9IGhvc3RfaW5mbzsKKworCWVudW0geyAKKwkJU1RBVElPTl9TVEFURV9TQ0FOTklORywKKwkJU1RBVElPTl9TVEFURV9KT0lOTklORywKKwkJU1RBVElPTl9TVEFURV9BVVRIRU5USUNBVElORywKKwkJU1RBVElPTl9TVEFURV9BU1NPQ0lBVElORywKKwkJU1RBVElPTl9TVEFURV9SRUFEWSwKKwkJU1RBVElPTl9TVEFURV9SRUFTU09DSUFUSU5HLAorCQlTVEFUSU9OX1NUQVRFX0RPV04sCisJCVNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUgorCX0gc3RhdGlvbl9zdGF0ZTsKKwkKKwlpbnQgb3BlcmF0aW5nX21vZGUsIHBvd2VyX21vZGU7CisJdGltZV90IGxhc3RfcXVhbDsKKwlpbnQgYmVhY29uc190aGlzX3NlYzsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgcmVnX2RvbWFpbiwgY29uZmlnX3JlZ19kb21haW47CisJaW50IHR4X3JhdGU7CisJaW50IGF1dG9fdHhfcmF0ZTsKKwlpbnQgcnRzX3RocmVzaG9sZDsKKwlpbnQgZnJhZ190aHJlc2hvbGQ7CisJaW50IGxvbmdfcmV0cnksIHNob3J0X3JldHJ5OworCWludCBwcmVhbWJsZTsKKwlpbnQgZGVmYXVsdF9iZWFjb25fcGVyaW9kLCBiZWFjb25fcGVyaW9kLCBsaXN0ZW5faW50ZXJ2YWw7CisJaW50IEN1cnJlbnRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0sIEV4cGVjdGVkQXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtOwkKKwlpbnQgQXV0aGVudGljYXRpb25SZXF1ZXN0UmV0cnlDbnQsIEFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250LCBSZUFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250OworCWVudW0geworCQlTSVRFX1NVUlZFWV9JRExFLAorCQlTSVRFX1NVUlZFWV9JTl9QUk9HUkVTUywKKwkJU0lURV9TVVJWRVlfQ09NUExFVEVEIAorCX0gc2l0ZV9zdXJ2ZXlfc3RhdGU7CisJdGltZV90IGxhc3Rfc3VydmV5OworCisJaW50IHN0YXRpb25fd2FzX2Fzc29jaWF0ZWQsIHN0YXRpb25faXNfYXNzb2NpYXRlZDsKKwlpbnQgZmFzdF9zY2FuOworCQkJCQorCXN0cnVjdCBic3NfaW5mbyB7CisJCWludCBjaGFubmVsOworCQlpbnQgU1NJRHNpemU7CisJCWludCBSU1NJOworCQlpbnQgVXNpbmdXRVA7CisJCWludCBwcmVhbWJsZTsKKwkJaW50IGJlYWNvbl9wZXJpb2Q7CisJCWludCBCU1N0eXBlOworCQl1OCBCU1NJRFs2XTsKKwkJdTggU1NJRFtNQVhfU1NJRF9MRU5HVEhdOworCX0gQlNTaW5mb1tNQVhfQlNTX0VOVFJJRVNdOworCWludCBCU1NfbGlzdF9lbnRyaWVzLCBjdXJyZW50X0JTUzsKKwlpbnQgY29ubmVjdF90b19hbnlfQlNTOyAKKwlpbnQgU1NJRF9zaXplLCBuZXdfU1NJRF9zaXplOworCXU4IEN1cnJlbnRCU1NJRFs2XSwgQlNTSURbNl07CisJdTggU1NJRFtNQVhfU1NJRF9MRU5HVEhdLCBuZXdfU1NJRFtNQVhfU1NJRF9MRU5HVEhdOworCXU2NCBsYXN0X2JlYWNvbl90aW1lc3RhbXA7CisJdTggcnhfYnVmW01BWF9XSVJFTEVTU19CT0RZXTsKKwkKK307CisKK3N0YXRpYyB1OCBhdG1lbF9iYXNpY19yYXRlc1s0XSA9IHsweDgyLDB4ODQsMHgwYiwweDE2fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJaW50IHJlZ19kb21haW47CisJaW50IG1pbiwgbWF4OworCWNoYXIgKm5hbWU7IAorfSBjaGFubmVsX3RhYmxlW10gPSB7IHsgUkVHX0RPTUFJTl9GQ0MsIDEsIDExLCAiVVNBIiB9LAorCQkgICAgICB7IFJFR19ET01BSU5fRE9DLCAxLCAxMSwgIkNhbmFkYSIgfSwKKwkJICAgICAgeyBSRUdfRE9NQUlOX0VUU0ksIDEsIDEzLCAiRXVyb3BlIiB9LAorCQkgICAgICB7IFJFR19ET01BSU5fU1BBSU4sIDEwLCAxMSwgIlNwYWluIiB9LAorCQkgICAgICB7IFJFR19ET01BSU5fRlJBTkNFLCAxMCwgMTMsICJGcmFuY2UiIH0sIAorCQkgICAgICB7IFJFR19ET01BSU5fTUtLLCAxNCwgMTQsICJNS0siIH0sCisJCSAgICAgIHsgUkVHX0RPTUFJTl9NS0sxLCAxLCAxNCwgIk1LSzEiIH0sCisJCSAgICAgIHsgUkVHX0RPTUFJTl9JU1JBRUwsIDMsIDksICJJc3JhZWwifSB9OworCitzdGF0aWMgdm9pZCBidWlsZF93cGFfbWliKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KTsKK3N0YXRpYyBpbnQgYXRtZWxfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZCBhdG1lbF9jb3B5X3RvX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGRlc3QsIHVuc2lnbmVkIGNoYXIgKnNyYywgdTE2IGxlbik7CitzdGF0aWMgdm9pZCBhdG1lbF9jb3B5X3RvX2hvc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciAqZGVzdCwgdTE2IHNyYywgdTE2IGxlbik7CitzdGF0aWMgdm9pZCBhdG1lbF9zZXRfZ2NyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBtYXNrKTsKK3N0YXRpYyB2b2lkIGF0bWVsX2NsZWFyX2djcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgbWFzayk7CitzdGF0aWMgaW50IGF0bWVsX2xvY2tfbWFjKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KTsKK3N0YXRpYyB2b2lkIGF0bWVsX3dtZW0zMihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IHBvcywgdTMyIGRhdGEpOworc3RhdGljIHZvaWQgYXRtZWxfY29tbWFuZF9pcnEoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpOworc3RhdGljIGludCBhdG1lbF92YWxpZGF0ZV9jaGFubmVsKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgY2hhbm5lbCk7CitzdGF0aWMgdm9pZCBhdG1lbF9tYW5hZ2VtZW50X2ZyYW1lKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgKmhlYWRlciwgCisJCQkJICAgdTE2IGZyYW1lX2xlbiwgdTggcnNzaSk7CitzdGF0aWMgdm9pZCBhdG1lbF9tYW5hZ2VtZW50X3RpbWVyKHVfbG9uZyBhKTsKK3N0YXRpYyB2b2lkIGF0bWVsX3NlbmRfY29tbWFuZChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGNvbW1hbmQsIHZvaWQgKmNtZCwgaW50IGNtZF9zaXplKTsKK3N0YXRpYyBpbnQgYXRtZWxfc2VuZF9jb21tYW5kX3dhaXQoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBjb21tYW5kLCB2b2lkICpjbWQsIGludCBjbWRfc2l6ZSk7CitzdGF0aWMgdm9pZCBhdG1lbF90cmFuc21pdF9tYW5hZ2VtZW50X2ZyYW1lKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgKmhlYWRlciwKKwkJCQkJICAgIHU4ICpib2R5LCBpbnQgYm9keV9sZW4pOworCitzdGF0aWMgdTggYXRtZWxfZ2V0X21pYjgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4KTsKK3N0YXRpYyB2b2lkIGF0bWVsX3NldF9taWI4KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCB0eXBlLCB1OCBpbmRleCwgdTggZGF0YSk7CitzdGF0aWMgdm9pZCBhdG1lbF9zZXRfbWliMTYoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4LCB1MTYgZGF0YSk7CitzdGF0aWMgdm9pZCBhdG1lbF9zZXRfbWliKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCB0eXBlLCB1OCBpbmRleCwgdTggKmRhdGEsIGludCBkYXRhX2xlbik7CitzdGF0aWMgdm9pZCBhdG1lbF9nZXRfbWliKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCB0eXBlLCB1OCBpbmRleCwgdTggKmRhdGEsIGludCBkYXRhX2xlbik7CitzdGF0aWMgdm9pZCBhdG1lbF9zY2FuKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgc3BlY2lmaWNfc3NpZCk7CitzdGF0aWMgdm9pZCBhdG1lbF9qb2luX2JzcyhzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGJzc19pbmRleCk7CitzdGF0aWMgdm9pZCBhdG1lbF9zbW9vdGhfcXVhbChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdik7CitzdGF0aWMgdm9pZCBhdG1lbF93cml0ZUFSKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBkYXRhKTsKK3N0YXRpYyBpbnQgcHJvYmVfYXRtZWxfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcmVzZXRfYXRtZWxfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgdm9pZCBhdG1lbF9lbnRlcl9zdGF0ZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IG5ld19zdGF0ZSk7CitpbnQgYXRtZWxfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbmxpbmUgdTE2IGF0bWVsX2hpKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgb2Zmc2V0KQoreworCXJldHVybiBwcml2LT5ob3N0X2luZm9fYmFzZSArIG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSB1MTYgYXRtZWxfY28oc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBvZmZzZXQpCit7CisJcmV0dXJuIHByaXYtPmhvc3RfaW5mby5jb21tYW5kX3BvcyArIG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSB1MTYgYXRtZWxfcngoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBvZmZzZXQsIHUxNiAgZGVzYykKK3sKKwlyZXR1cm4gcHJpdi0+aG9zdF9pbmZvLnJ4X2Rlc2NfcG9zICsgKHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKiBkZXNjKSArIG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSB1MTYgYXRtZWxfdHgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBvZmZzZXQsIHUxNiAgZGVzYykKK3sKKwlyZXR1cm4gcHJpdi0+aG9zdF9pbmZvLnR4X2Rlc2NfcG9zICsgKHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiBkZXNjKSArIG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSB1OCBhdG1lbF9yZWFkOChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgb2Zmc2V0KQoreworCXJldHVybiBpbmIoZGV2LT5iYXNlX2FkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRtZWxfd3JpdGU4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBvZmZzZXQsIHU4IGRhdGEpCit7CisJb3V0YihkYXRhLCBkZXYtPmJhc2VfYWRkciArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGF0bWVsX3JlYWQxNihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgb2Zmc2V0KQoreworCXJldHVybiBpbncoZGV2LT5iYXNlX2FkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRtZWxfd3JpdGUxNihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgb2Zmc2V0LCB1MTYgZGF0YSkKK3sKKwlvdXR3KGRhdGEsIGRldi0+YmFzZV9hZGRyICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1OCBhdG1lbF9ybWVtOChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IHBvcykKK3sKKwlhdG1lbF93cml0ZUFSKHByaXYtPmRldiwgcG9zKTsJCisJcmV0dXJuIGF0bWVsX3JlYWQ4KHByaXYtPmRldiwgRFIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRtZWxfd21lbTgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBwb3MsIHUxNiBkYXRhKQoreworCWF0bWVsX3dyaXRlQVIocHJpdi0+ZGV2LCBwb3MpOwkKKwlhdG1lbF93cml0ZTgocHJpdi0+ZGV2LCBEUiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGF0bWVsX3JtZW0xNihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IHBvcykKK3sKKyAgICAgICAJYXRtZWxfd3JpdGVBUihwcml2LT5kZXYsIHBvcyk7CQorCXJldHVybiBhdG1lbF9yZWFkMTYocHJpdi0+ZGV2LCBEUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG1lbF93bWVtMTYoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBwb3MsIHUxNiBkYXRhKQoreworICAgICAgIAlhdG1lbF93cml0ZUFSKHByaXYtPmRldiwgcG9zKTsJCisJYXRtZWxfd3JpdGUxNihwcml2LT5kZXYsIERSLCBkYXRhKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBhdG1lbF9oYW5kbGVyX2RlZjsKKworc3RhdGljIHZvaWQgdHhfZG9uZV9pcnEoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyAKKwkgICAgIGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfRkxBR1NfT0ZGU0VULCBwcml2LT50eF9kZXNjX2hlYWQpKSA9PSBUWF9ET05FICYmCisJCSAgICAgaSA8IHByaXYtPmhvc3RfaW5mby50eF9kZXNjX2NvdW50OworCSAgICAgaSsrKSB7CisJCQorCQl1OCBzdGF0dXMgPSBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1NUQVRVU19PRkZTRVQsIHByaXYtPnR4X2Rlc2NfaGVhZCkpOworCQl1MTYgbXNkdV9zaXplID0gYXRtZWxfcm1lbTE2KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfU0laRV9PRkZTRVQsIHByaXYtPnR4X2Rlc2NfaGVhZCkpOworCQl1OCB0eXBlID0gYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19QQUNLRVRfVFlQRV9PRkZTRVQsIHByaXYtPnR4X2Rlc2NfaGVhZCkpOworCisJCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfRkxBR1NfT0ZGU0VULCBwcml2LT50eF9kZXNjX2hlYWQpLCAwKTsKKworCQlwcml2LT50eF9mcmVlX21lbSArPSBtc2R1X3NpemU7CisJCXByaXYtPnR4X2Rlc2NfZnJlZSsrOworCisJCWlmIChwcml2LT50eF9idWZmX2hlYWQgKyBtc2R1X3NpemUgPiAocHJpdi0+aG9zdF9pbmZvLnR4X2J1ZmZfcG9zICsgcHJpdi0+aG9zdF9pbmZvLnR4X2J1ZmZfc2l6ZSkpCisJCQlwcml2LT50eF9idWZmX2hlYWQgPSAwOworCQllbHNlCisJCQlwcml2LT50eF9idWZmX2hlYWQgKz0gbXNkdV9zaXplOworCQkJCisJCWlmIChwcml2LT50eF9kZXNjX2hlYWQgPCAocHJpdi0+aG9zdF9pbmZvLnR4X2Rlc2NfY291bnQgLSAxKSkKKwkJCXByaXYtPnR4X2Rlc2NfaGVhZCsrIDsJCQkJCQorCQllbHNlCisJCQlwcml2LT50eF9kZXNjX2hlYWQgPSAwOworCQkKKwkJaWYgKHR5cGUgPT0gVFhfUEFDS0VUX1RZUEVfREFUQSkgeworCQkJaWYgKHN0YXR1cyA9PSBUWF9TVEFUVVNfU1VDQ0VTUykKKwkJCQlwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQllbHNlIAorCQkJCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5kZXYpOworCQl9CisJfQorfQorCitzdGF0aWMgdTE2IGZpbmRfdHhfYnVmZihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IGxlbikKK3sKKwl1MTYgYm90dG9tX2ZyZWUgPSBwcml2LT5ob3N0X2luZm8udHhfYnVmZl9zaXplIC0gcHJpdi0+dHhfYnVmZl90YWlsOworCisJaWYgKHByaXYtPnR4X2Rlc2NfZnJlZSA9PSAzIHx8IHByaXYtPnR4X2ZyZWVfbWVtIDwgbGVuKSAKKwkJcmV0dXJuIDA7CisJCisJaWYgKGJvdHRvbV9mcmVlID49IGxlbikKKwkJcmV0dXJuIHByaXYtPmhvc3RfaW5mby50eF9idWZmX3BvcyArIHByaXYtPnR4X2J1ZmZfdGFpbDsKKwkKKwlpZiAocHJpdi0+dHhfZnJlZV9tZW0gLSBib3R0b21fZnJlZSA+PSBsZW4pIHsKKwkJcHJpdi0+dHhfYnVmZl90YWlsID0gMDsKKwkJcmV0dXJuIHByaXYtPmhvc3RfaW5mby50eF9idWZmX3BvczsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHR4X3VwZGF0ZV9kZXNjcmlwdG9yKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgaXNfYmNhc3QsIHUxNiBsZW4sIHUxNiBidWZmLCB1OCB0eXBlKQoreworCWF0bWVsX3dtZW0xNihwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1BPU19PRkZTRVQsIHByaXYtPnR4X2Rlc2NfdGFpbCksIGJ1ZmYpOworCWF0bWVsX3dtZW0xNihwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1NJWkVfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLCBsZW4pOworCWlmICghcHJpdi0+dXNlX3dwYSkKKwkJYXRtZWxfd21lbTE2KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfSE9TVF9MRU5HVEhfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLCBsZW4pOworCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfUEFDS0VUX1RZUEVfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLCB0eXBlKTsKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1JBVEVfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLCBwcml2LT50eF9yYXRlKTsKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1JFVFJZX09GRlNFVCwgcHJpdi0+dHhfZGVzY190YWlsKSwgMCk7CisJaWYgKHByaXYtPnVzZV93cGEpIHsKKwkJaW50IGNpcGhlcl90eXBlLCBjaXBoZXJfbGVuZ3RoOworCQlpZiAoaXNfYmNhc3QpIHsKKwkJCWNpcGhlcl90eXBlID0gcHJpdi0+Z3JvdXBfY2lwaGVyX3N1aXRlOworCQkJaWYgKGNpcGhlcl90eXBlID09IENJUEhFUl9TVUlURV9XRVBfNjQgfHwgCisJCQkgICAgY2lwaGVyX3R5cGUgPT0gQ0lQSEVSX1NVSVRFX1dFUF8xMjggKQorCQkJCWNpcGhlcl9sZW5ndGggPSA4OworCQkJZWxzZSBpZiAoY2lwaGVyX3R5cGUgPT0gQ0lQSEVSX1NVSVRFX1RLSVApCisJCQkJY2lwaGVyX2xlbmd0aCA9IDEyOworCQkJZWxzZSBpZiAocHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID09IENJUEhFUl9TVUlURV9XRVBfNjQgfHwKKwkJCQkgcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID09IENJUEhFUl9TVUlURV9XRVBfMTI4KSB7CisJCQkJY2lwaGVyX3R5cGUgPSBwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGU7CisJCQkJY2lwaGVyX2xlbmd0aCA9IDg7CisJCQl9IGVsc2UgeworCQkJCWNpcGhlcl90eXBlID0gQ0lQSEVSX1NVSVRFX05PTkU7CisJCQkJY2lwaGVyX2xlbmd0aCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQljaXBoZXJfdHlwZSA9IHByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZTsKKwkJCWlmIChjaXBoZXJfdHlwZSA9PSBDSVBIRVJfU1VJVEVfV0VQXzY0IHx8IAorCQkJICAgIGNpcGhlcl90eXBlID09IENJUEhFUl9TVUlURV9XRVBfMTI4ICkKKwkJCQljaXBoZXJfbGVuZ3RoID0gODsKKwkJCWVsc2UgaWYgKGNpcGhlcl90eXBlID09IENJUEhFUl9TVUlURV9US0lQKQorCQkJCWNpcGhlcl9sZW5ndGggPSAxMjsKKwkJCWVsc2UgaWYgKHByaXYtPmdyb3VwX2NpcGhlcl9zdWl0ZSA9PSBDSVBIRVJfU1VJVEVfV0VQXzY0IHx8CisJCQkJIHByaXYtPmdyb3VwX2NpcGhlcl9zdWl0ZSA9PSBDSVBIRVJfU1VJVEVfV0VQXzEyOCkgeworCQkJCWNpcGhlcl90eXBlID0gcHJpdi0+Z3JvdXBfY2lwaGVyX3N1aXRlOworCQkJCWNpcGhlcl9sZW5ndGggPSA4OworCQkJfSBlbHNlIHsKKwkJCQljaXBoZXJfdHlwZSA9IENJUEhFUl9TVUlURV9OT05FOworCQkJCWNpcGhlcl9sZW5ndGggPSAwOworCQkJfQorCQl9CisJCQorCQlhdG1lbF93bWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX0NJUEhFUl9UWVBFX09GRlNFVCwgcHJpdi0+dHhfZGVzY190YWlsKSwKKwkJCSAgICBjaXBoZXJfdHlwZSk7CQorCQlhdG1lbF93bWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX0NJUEhFUl9MRU5HVEhfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLAorCQkJICAgIGNpcGhlcl9sZW5ndGgpOworCX0KKwlhdG1lbF93bWVtMzIocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19ORVhUX09GRlNFVCwgcHJpdi0+dHhfZGVzY190YWlsKSwgMHg4MDAwMDAwMEwpOworCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfRkxBR1NfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLCBUWF9GSVJNX09XTik7CisJaWYgKHByaXYtPnR4X2Rlc2NfcHJldmlvdXMgIT0gcHJpdi0+dHhfZGVzY190YWlsKQorCQlhdG1lbF93bWVtMzIocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19ORVhUX09GRlNFVCwgcHJpdi0+dHhfZGVzY19wcmV2aW91cyksIDApOworCXByaXYtPnR4X2Rlc2NfcHJldmlvdXMgPSBwcml2LT50eF9kZXNjX3RhaWw7CisJaWYgKHByaXYtPnR4X2Rlc2NfdGFpbCA8IChwcml2LT5ob3N0X2luZm8udHhfZGVzY19jb3VudCAtMSApKQorCQlwcml2LT50eF9kZXNjX3RhaWwrKzsKKwllbHNlCisJCXByaXYtPnR4X2Rlc2NfdGFpbCA9IDA7CisJcHJpdi0+dHhfZGVzY19mcmVlLS07CisJcHJpdi0+dHhfZnJlZV9tZW0gLT0gbGVuOworCit9CisKK3N0YXRpYyBpbnQgc3RhcnRfdHggKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyXzExX2hkciBoZWFkZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgYnVmZiwgZnJhbWVfY3RsLCBsZW4gPSAoRVRIX1pMRU4gPCBza2ItPmxlbikgPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCXU4IFNOQVBfUkZDMTAyNFs2XSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKyAKKwlpZiAocHJpdi0+Y2FyZCAmJiBwcml2LT5wcmVzZW50X2NhbGxiYWNrICYmIAorCSAgICAhKCpwcml2LT5wcmVzZW50X2NhbGxiYWNrKShwcml2LT5jYXJkKSkgeworCQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisJCisJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgIT0gU1RBVElPTl9TVEFURV9SRUFEWSkgeworCQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisJCisJLyogZmlyc3QgZW5zdXJlIHRoZSB0aW1lciBmdW5jIGNhbm5vdCBydW4gKi8KKwlzcGluX2xvY2tfYmgoJnByaXYtPnRpbWVybG9jayk7IAorCS8qIHRoZW4gc3RvcCB0aGUgaGFyZHdhcmUgSVNSICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsgCisJLyogbmIgZG9pbmcgdGhlIGFib3ZlIGluIHRoZSBvcHBvc2l0ZSBvcmRlciB3aWxsIGRlYWRsb2NrICovCisJCisJLyogVGhlIFdpcmVsZXNzIEhlYWRlciBpcyAzMCBieXRlcy4gSW4gdGhlIEV0aGVybmV0IHBhY2tldCB3ZSAiY3V0IiB0aGUKKwkgICAxMiBmaXJzdCBieXRlcyAoY29udGFpbmluZyBEQS9TQSkgYW5kIHB1dCB0aGVtIGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMgb2YKKwkgICB0aGUgV2lyZWxlc3MgSGVhZGVyLiBUaHVzIHRoZSBwYWNrZXQgbGVuZ3RoIGlzIHRoZW4gdGhlIGluaXRpYWwgKyAxOCAoKzMwLTEyKSAqLworCQorCWlmICghKGJ1ZmYgPSBmaW5kX3R4X2J1ZmYocHJpdiwgbGVuICsgMTgpKSkgeworCQlwcml2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnRpbWVybG9jayk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDE7CisJfQorCQorCWZyYW1lX2N0bCA9IElFRUU4MDJfMTFfRlRZUEVfREFUQTsKKwloZWFkZXIuZHVyYXRpb25faWQgPSAwOworCWhlYWRlci5zZXFfY3RsID0gMDsKKwlpZiAocHJpdi0+d2VwX2lzX29uKQorCQlmcmFtZV9jdGwgfD0gSUVFRTgwMl8xMV9GQ1RMX1dFUDsKKwlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgc2tiLT5kYXRhLCA2KTsKKwkJbWVtY3B5KCZoZWFkZXIuYWRkcjIsIGRldi0+ZGV2X2FkZHIsIDYpOworCQltZW1jcHkoJmhlYWRlci5hZGRyMywgcHJpdi0+QlNTSUQsIDYpOworCX0gZWxzZSB7CisJCWZyYW1lX2N0bCB8PSBJRUVFODAyXzExX0ZDVExfVE9EUzsKKwkJbWVtY3B5KCZoZWFkZXIuYWRkcjEsIHByaXYtPkN1cnJlbnRCU1NJRCwgNik7CisJCW1lbWNweSgmaGVhZGVyLmFkZHIyLCBkZXYtPmRldl9hZGRyLCA2KTsKKwkJbWVtY3B5KCZoZWFkZXIuYWRkcjMsIHNrYi0+ZGF0YSwgNik7CisJfQorCQorCWlmIChwcml2LT51c2Vfd3BhKQorCQltZW1jcHkoJmhlYWRlci5hZGRyNCwgU05BUF9SRkMxMDI0LCA2KTsKKworCWhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihmcmFtZV9jdGwpOworCS8qIENvcHkgdGhlIHdpcmVsZXNzIGhlYWRlciBpbnRvIHRoZSBjYXJkICovCisJYXRtZWxfY29weV90b19jYXJkKGRldiwgYnVmZiwgKHVuc2lnbmVkIGNoYXIgKikmaGVhZGVyLCBEQVRBX0ZSQU1FX1dTX0hFQURFUl9TSVpFKTsKKwkvKiBDb3B5IHRoZSBwYWNrZXQgc2FucyBpdHMgODAyLjMgaGVhZGVyIGFkZHJlc3NlcyB3aGljaCBoYXZlIGJlZW4gcmVwbGFjZWQgKi8KKwlhdG1lbF9jb3B5X3RvX2NhcmQoZGV2LCBidWZmICsgREFUQV9GUkFNRV9XU19IRUFERVJfU0laRSwgc2tiLT5kYXRhICsgMTIsIGxlbiAtIDEyKTsKKwlwcml2LT50eF9idWZmX3RhaWwgKz0gbGVuIC0gMTIgKyBEQVRBX0ZSQU1FX1dTX0hFQURFUl9TSVpFOworCQorCS8qIGxvdyBiaXQgb2YgZmlyc3QgYnl0ZSBvZiBkZXN0aW5hdGlvbiB0ZWxscyB1cyBpZiBicm9hZGNhc3QgKi8KKwl0eF91cGRhdGVfZGVzY3JpcHRvcihwcml2LCAqKHNrYi0+ZGF0YSkgJiAweDAxLCBsZW4gKyAxOCwgYnVmZiwgVFhfUEFDS0VUX1RZUEVfREFUQSk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19iaCgmcHJpdi0+dGltZXJsb2NrKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCisJcmV0dXJuIDA7CQorfQorCitzdGF0aWMgdm9pZCBhdG1lbF90cmFuc21pdF9tYW5hZ2VtZW50X2ZyYW1lKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCAKKwkJCQkJICAgIHN0cnVjdCBpZWVlODAyXzExX2hkciAqaGVhZGVyLAorCQkJCQkgICAgdTggKmJvZHksIGludCBib2R5X2xlbikKK3sKKwl1MTYgYnVmZjsKKwlpbnQgbGVuID0gIE1HTVRfRlJBTUVfQk9EWV9PRkZTRVQgKyBib2R5X2xlbjsKKwkKKwlpZiAoIShidWZmID0gZmluZF90eF9idWZmKHByaXYsIGxlbikpKSAKKwkJcmV0dXJuOworCisJYXRtZWxfY29weV90b19jYXJkKHByaXYtPmRldiwgYnVmZiwgKHU4ICopaGVhZGVyLCBNR01UX0ZSQU1FX0JPRFlfT0ZGU0VUKTsKKwlhdG1lbF9jb3B5X3RvX2NhcmQocHJpdi0+ZGV2LCBidWZmICsgTUdNVF9GUkFNRV9CT0RZX09GRlNFVCwgYm9keSwgYm9keV9sZW4pOworCXByaXYtPnR4X2J1ZmZfdGFpbCArPSBsZW47CisJdHhfdXBkYXRlX2Rlc2NyaXB0b3IocHJpdiwgaGVhZGVyLT5hZGRyMVswXSAmIDB4MDEsIGxlbiwgYnVmZiwgVFhfUEFDS0VUX1RZUEVfTUdNVCk7Cit9CisJCitzdGF0aWMgdm9pZCBmYXN0X3J4X3BhdGgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBpZWVlODAyXzExX2hkciAqaGVhZGVyLCAKKwkJCSB1MTYgbXNkdV9zaXplLCB1MTYgcnhfcGFja2V0X2xvYywgdTMyIGNyYykKK3sKKwkvKiBmYXN0IHBhdGg6IHVuZnJhZ21lbnRlZCBwYWNrZXQgY29weSBkaXJlY3RseSBpbnRvIHNrYnVmICovCisJdTggbWFjNFs2XTsgCisJc3RydWN0IHNrX2J1ZmYgCSpza2I7CisJdW5zaWduZWQgY2hhciAqc2ticDsKKwkKKwkvKiBnZXQgdGhlIGZpbmFsLCBtYWMgNCBoZWFkZXIgZmllbGQsIHRoaXMgdGVsbHMgdXMgZW5jYXBzdWxhdGlvbiAqLworCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsIG1hYzQsIHJ4X3BhY2tldF9sb2MgKyAyNCwgNik7CisJbXNkdV9zaXplIC09IDY7CisJCisJaWYgKHByaXYtPmRvX3J4X2NyYykgeworCQljcmMgPSBjcmMzMl9sZShjcmMsIG1hYzQsIDYpOworCQltc2R1X3NpemUgLT0gNDsKKwl9CisJCisJaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihtc2R1X3NpemUgKyAxNCkpKSB7CisJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKworCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJc2ticCA9IHNrYl9wdXQoc2tiLCBtc2R1X3NpemUgKyAxMik7CisJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgc2ticCArIDEyLCByeF9wYWNrZXRfbG9jICsgMzAsIG1zZHVfc2l6ZSk7CisJCisJaWYgKHByaXYtPmRvX3J4X2NyYykgeworCQl1MzIgbmV0Y3JjOworCQljcmMgPSBjcmMzMl9sZShjcmMsIHNrYnAgKyAxMiwgbXNkdV9zaXplKTsKKwkJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgKHZvaWQgKikmbmV0Y3JjLCByeF9wYWNrZXRfbG9jICsgMzAgKyBtc2R1X3NpemUsIDQpOworCQlpZiAoKGNyYyBeIDB4ZmZmZmZmZmYpICE9IG5ldGNyYykgeworCQkJcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuOworCQl9CisJfQorCQorCW1lbWNweShza2JwLCBoZWFkZXItPmFkZHIxLCA2KTsgLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCWlmIChsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCkgJiBJRUVFODAyXzExX0ZDVExfRlJPTURTKSAKKwkJbWVtY3B5KCZza2JwWzZdLCBoZWFkZXItPmFkZHIzLCA2KTsKKwllbHNlCisJCW1lbWNweSgmc2ticFs2XSwgaGVhZGVyLT5hZGRyMiwgNik7IC8qIHNvdXJjZSBhZGRyZXNzICovCisJCisJcHJpdi0+ZGV2LT5sYXN0X3J4PWppZmZpZXM7CisJc2tiLT5kZXYgPSBwcml2LT5kZXY7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcHJpdi0+ZGV2KTsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CQorCW5ldGlmX3J4KHNrYik7CisJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gMTIgKyBtc2R1X3NpemU7CisJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworfQorCisvKiBUZXN0IHRvIHNlZSBpZiB0aGUgcGFja2V0IGluIGNhcmQgbWVtb3J5IGF0IHBhY2tldF9sb2MgaGFzIGEgdmFsaWQgQ1JDCisgICBJdCBkb2Vzbid0IG1hdHRlciB0aGF0IHRoaXMgaXMgc2xvdzogaXQgaXMgb25seSB1c2VkIHRvIHByb2JsZSB0aGUgZmlyc3QgZmV3IHBhY2tldHMuICovCitzdGF0aWMgaW50IHByb2JlX2NyYyhzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IHBhY2tldF9sb2MsIHUxNiBtc2R1X3NpemUpCit7CisJaW50IGkgPSBtc2R1X3NpemUgLSA0OworCXUzMiBuZXRjcmMsIGNyYyA9IDB4ZmZmZmZmZmY7CisKKwlpZiAobXNkdV9zaXplIDwgNCkKKwkJcmV0dXJuIDA7CisKKwlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCAodm9pZCAqKSZuZXRjcmMsIHBhY2tldF9sb2MgKyBpLCA0KTsKKwkKKwlhdG1lbF93cml0ZUFSKHByaXYtPmRldiwgcGFja2V0X2xvYyk7CisJd2hpbGUgKGktLSkgeworCQl1OCBvY3RldCA9IGF0bWVsX3JlYWQ4KHByaXYtPmRldiwgRFIpOworCQljcmMgPSBjcmMzMl9sZShjcmMsICZvY3RldCwgMSk7CisJfQorCisJcmV0dXJuIChjcmMgXiAweGZmZmZmZmZmKSA9PSBuZXRjcmM7Cit9CisKK3N0YXRpYyB2b2lkIGZyYWdfcnhfcGF0aChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGllZWU4MDJfMTFfaGRyICpoZWFkZXIsIAorCQkJIHUxNiBtc2R1X3NpemUsIHUxNiByeF9wYWNrZXRfbG9jLCB1MzIgY3JjLCB1MTYgc2VxX25vLCB1OCBmcmFnX25vLCBpbnQgbW9yZV9mcmFncykKK3sKKwl1OCBtYWM0WzZdOyAKKwl1OCBzb3VyY2VbNl07CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmIChsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCkgJiBJRUVFODAyXzExX0ZDVExfRlJPTURTKSAKKwkJbWVtY3B5KHNvdXJjZSwgaGVhZGVyLT5hZGRyMywgNik7CisJZWxzZQorCQltZW1jcHkoc291cmNlLCBoZWFkZXItPmFkZHIyLCA2KTsgCisJCisJcnhfcGFja2V0X2xvYyArPSAyNDsgLyogc2tpcCBoZWFkZXIgKi8KKwkKKwlpZiAocHJpdi0+ZG9fcnhfY3JjKQorCQltc2R1X3NpemUgLT0gNDsKKworCWlmIChmcmFnX25vID09IDApIHsgLyogZmlyc3QgZnJhZ21lbnQgKi8KKwkJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgbWFjNCwgcnhfcGFja2V0X2xvYywgNik7CisJCW1zZHVfc2l6ZSAtPSA2OworCQlyeF9wYWNrZXRfbG9jICs9IDY7CisKKwkJaWYgKHByaXYtPmRvX3J4X2NyYykgCisJCQljcmMgPSBjcmMzMl9sZShjcmMsIG1hYzQsIDYpOworCSAgICAgICAKKwkJcHJpdi0+ZnJhZ19zZXEgPSBzZXFfbm87CisJCXByaXYtPmZyYWdfbm8gPSAxOworCQlwcml2LT5mcmFnX2xlbiA9IG1zZHVfc2l6ZTsKKwkJbWVtY3B5KHByaXYtPmZyYWdfc291cmNlLCBzb3VyY2UsIDYpOyAKKwkJbWVtY3B5KCZwcml2LT5yeF9idWZbNl0sIHNvdXJjZSwgNik7CisJCW1lbWNweShwcml2LT5yeF9idWYsIGhlYWRlci0+YWRkcjEsIDYpOworCQkJCQorCQlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCAmcHJpdi0+cnhfYnVmWzEyXSwgcnhfcGFja2V0X2xvYywgbXNkdV9zaXplKTsKKworCQlpZiAocHJpdi0+ZG9fcnhfY3JjKSB7CisJCQl1MzIgbmV0Y3JjOworCQkJY3JjID0gY3JjMzJfbGUoY3JjLCAmcHJpdi0+cnhfYnVmWzEyXSwgbXNkdV9zaXplKTsKKwkJCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsICh2b2lkICopJm5ldGNyYywgcnhfcGFja2V0X2xvYyArIG1zZHVfc2l6ZSwgNCk7CisJCQlpZiAoKGNyYyBeIDB4ZmZmZmZmZmYpICE9IG5ldGNyYykgeworCQkJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQltZW1zZXQocHJpdi0+ZnJhZ19zb3VyY2UsIDB4ZmYsIDYpOworCQkJfQorCQl9CisJCQorCX0gZWxzZSBpZiAocHJpdi0+ZnJhZ19ubyA9PSBmcmFnX25vICYmCisJCSAgIHByaXYtPmZyYWdfc2VxID09IHNlcV9ubyAmJgorCQkgICBtZW1jbXAocHJpdi0+ZnJhZ19zb3VyY2UsIHNvdXJjZSwgNikgPT0gMCkgeworCQkKKwkJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgJnByaXYtPnJ4X2J1ZlsxMiArIHByaXYtPmZyYWdfbGVuXSwgCisJCQkJICAgcnhfcGFja2V0X2xvYywgbXNkdV9zaXplKTsKKwkJaWYgKHByaXYtPmRvX3J4X2NyYykgeworCQkJdTMyIG5ldGNyYzsKKwkJCWNyYyA9IGNyYzMyX2xlKGNyYywgCisJCQkJICAgICAgICZwcml2LT5yeF9idWZbMTIgKyBwcml2LT5mcmFnX2xlbl0sIAorCQkJCSAgICAgICBtc2R1X3NpemUpOworCQkJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgKHZvaWQgKikmbmV0Y3JjLCByeF9wYWNrZXRfbG9jICsgbXNkdV9zaXplLCA0KTsKKwkJCWlmICgoY3JjIF4gMHhmZmZmZmZmZikgIT0gbmV0Y3JjKSB7CisJCQkJcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCW1lbXNldChwcml2LT5mcmFnX3NvdXJjZSwgMHhmZiwgNik7CisJCQkJbW9yZV9mcmFncyA9IDE7IC8qIGRvbid0IHNlbmQgYnJva2VuIGFzc2VtYmx5ICovCisJCQl9CisJCX0KKwkJCisJCXByaXYtPmZyYWdfbGVuICs9IG1zZHVfc2l6ZTsKKwkJcHJpdi0+ZnJhZ19ubysrOworCisJCWlmICghbW9yZV9mcmFncykgeyAvKiBsYXN0IG9uZSAqLworCQkJbWVtc2V0KHByaXYtPmZyYWdfc291cmNlLCAweGZmLCA2KTsKKwkJCWlmICghKHNrYiA9IGRldl9hbGxvY19za2IocHJpdi0+ZnJhZ19sZW4gKyAxNCkpKSB7CisJCQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJfSBlbHNlIHsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQkJCW1lbWNweShza2JfcHV0KHNrYiwgcHJpdi0+ZnJhZ19sZW4gKyAxMiksIAorCQkJCSAgICAgICBwcml2LT5yeF9idWYsCisJCQkJICAgICAgIHByaXYtPmZyYWdfbGVuICsgMTIpOworCQkJCXByaXYtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJc2tiLT5kZXYgPSBwcml2LT5kZXY7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcHJpdi0+ZGV2KTsKKwkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CQorCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcHJpdi0+ZnJhZ19sZW4gKyAxMjsKKwkJCQlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQl9CisJCX0KKwkJCisJfSBlbHNlCisJCXByaXYtPndzdGF0cy5kaXNjYXJkLmZyYWdtZW50Kys7Cit9CisJCQorc3RhdGljIHZvaWQgcnhfZG9uZV9pcnEoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGk7CisJc3RydWN0IGllZWU4MDJfMTFfaGRyIGhlYWRlcjsKKwkKKwlmb3IgKGkgPSAwOyAKKwkgICAgIGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX3J4KHByaXYsIFJYX0RFU0NfRkxBR1NfT0ZGU0VULCBwcml2LT5yeF9kZXNjX2hlYWQpKSA9PSBSWF9ERVNDX0ZMQUdfVkFMSUQgJiYKKwkJICAgICBpIDwgcHJpdi0+aG9zdF9pbmZvLnJ4X2Rlc2NfY291bnQ7CisJICAgICBpKyspIHsKKwkJCQkKKwkJdTE2IG1zZHVfc2l6ZSwgcnhfcGFja2V0X2xvYywgZnJhbWVfY3RsLCBzZXFfY29udHJvbDsKKwkJdTggc3RhdHVzID0gYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfcngocHJpdiwgUlhfREVTQ19TVEFUVVNfT0ZGU0VULCBwcml2LT5yeF9kZXNjX2hlYWQpKTsKKwkJdTMyIGNyYyA9IDB4ZmZmZmZmZmY7CisJCQorCQlpZiAoc3RhdHVzICE9IFJYX1NUQVRVU19TVUNDRVNTKSB7CisJCQlpZiAoc3RhdHVzID09IDB4YzEpIC8qIGRldGVybWluZWQgYnkgZXhwZXJpbWVudCAqLworCQkJCXByaXYtPndzdGF0cy5kaXNjYXJkLm53aWQrKzsKKwkJCWVsc2UKKwkJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsgCisJCQlnb3RvIG5leHQ7CisJCX0KKworCQltc2R1X3NpemUgPSBhdG1lbF9ybWVtMTYocHJpdiwgYXRtZWxfcngocHJpdiwgUlhfREVTQ19NU0RVX1NJWkVfT0ZGU0VULCBwcml2LT5yeF9kZXNjX2hlYWQpKTsKKwkJcnhfcGFja2V0X2xvYyA9IGF0bWVsX3JtZW0xNihwcml2LCBhdG1lbF9yeChwcml2LCBSWF9ERVNDX01TRFVfUE9TX09GRlNFVCwgcHJpdi0+cnhfZGVzY19oZWFkKSk7CisJCQorCQlpZiAobXNkdV9zaXplIDwgMzApIHsKKwkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOyAKKwkJCWdvdG8gbmV4dDsKKwkJfQorCQkKKwkJLyogR2V0IGhlYWRlciBhcyBmYXIgYXMgZW5kIG9mIHNlcV9jdGwgKi8KKwkJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgKGNoYXIgKikmaGVhZGVyLCByeF9wYWNrZXRfbG9jLCAyNCk7CisJCWZyYW1lX2N0bCA9IGxlMTZfdG9fY3B1KGhlYWRlci5mcmFtZV9jdGwpOworCQlzZXFfY29udHJvbCA9IGxlMTZfdG9fY3B1KGhlYWRlci5zZXFfY3RsKTsKKworCQkvKiBwcm9iZSBmb3IgQ1JDIHVzZSBoZXJlIGlmIG5lZWRlZCAgb25jZSBmaXZlIHBhY2tldHMgaGF2ZSBhcnJpdmVkIHdpdGgKKwkJICAgdGhlIHNhbWUgY3JjIHN0YXR1cywgd2UgYXNzdW1lIHdlIGtub3cgd2hhdCdzIGhhcHBlbmluZyBhbmQgc3RvcCBwcm9iaW5nICovCisJCWlmIChwcml2LT5wcm9iZV9jcmMpIHsKKwkJCWlmICghcHJpdi0+d2VwX2lzX29uIHx8ICEoZnJhbWVfY3RsICYgSUVFRTgwMl8xMV9GQ1RMX1dFUCkpIHsKKwkJCQlwcml2LT5kb19yeF9jcmMgPSBwcm9iZV9jcmMocHJpdiwgcnhfcGFja2V0X2xvYywgbXNkdV9zaXplKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpdi0+ZG9fcnhfY3JjID0gcHJvYmVfY3JjKHByaXYsIHJ4X3BhY2tldF9sb2MgKyAyNCwgbXNkdV9zaXplIC0gMjQpOworCQkJfQorCQkJaWYgKHByaXYtPmRvX3J4X2NyYykgeworCQkJCWlmIChwcml2LT5jcmNfb2tfY250KysgPiA1KQorCQkJCQlwcml2LT5wcm9iZV9jcmMgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocHJpdi0+Y3JjX2tvX2NudCsrID4gNSkKKwkJCQkJcHJpdi0+cHJvYmVfY3JjID0gMDsKKwkJCX0KKwkJfQorCQkgICAgCisJCS8qIGRvbid0IENSQyBoZWFkZXIgd2hlbiBXRVAgaW4gdXNlICovCisJCWlmIChwcml2LT5kb19yeF9jcmMgJiYgKCFwcml2LT53ZXBfaXNfb24gfHwgIShmcmFtZV9jdGwgJiBJRUVFODAyXzExX0ZDVExfV0VQKSkpIHsKKwkJCWNyYyA9IGNyYzMyX2xlKDB4ZmZmZmZmZmYsICh1bnNpZ25lZCBjaGFyICopJmhlYWRlciwgMjQpOworCQl9CisJCW1zZHVfc2l6ZSAtPSAyNDsgLyogaGVhZGVyICovCisKKwkJaWYgKChmcmFtZV9jdGwgJiBJRUVFODAyXzExX0ZDVExfRlRZUEUpID09IElFRUU4MDJfMTFfRlRZUEVfREFUQSkgeyAKKwkJCQorCQkJaW50IG1vcmVfZnJhZ21lbnRzID0gZnJhbWVfY3RsICYgSUVFRTgwMl8xMV9GQ1RMX01PUkVGUkFHUzsKKwkJCXU4IHBhY2tldF9mcmFnbWVudF9ubyA9IHNlcV9jb250cm9sICYgSUVFRTgwMl8xMV9TQ1RMX0ZSQUc7CisJCQl1MTYgcGFja2V0X3NlcXVlbmNlX25vID0gKHNlcV9jb250cm9sICYgSUVFRTgwMl8xMV9TQ1RMX1NFUSkgPj4gNDsKKwkJCQorCQkJaWYgKCFtb3JlX2ZyYWdtZW50cyAmJiBwYWNrZXRfZnJhZ21lbnRfbm8gPT0gMCApIHsKKwkJCQlmYXN0X3J4X3BhdGgocHJpdiwgJmhlYWRlciwgbXNkdV9zaXplLCByeF9wYWNrZXRfbG9jLCBjcmMpOworCQkJfSBlbHNlIHsKKwkJCQlmcmFnX3J4X3BhdGgocHJpdiwgJmhlYWRlciwgbXNkdV9zaXplLCByeF9wYWNrZXRfbG9jLCBjcmMsCisJCQkJCSAgICAgcGFja2V0X3NlcXVlbmNlX25vLCBwYWNrZXRfZnJhZ21lbnRfbm8sIG1vcmVfZnJhZ21lbnRzKTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKChmcmFtZV9jdGwgJiBJRUVFODAyXzExX0ZDVExfRlRZUEUpID09IElFRUU4MDJfMTFfRlRZUEVfTUdNVCkgeworCQkJLyogY29weSByZXN0IG9mIHBhY2tldCBpbnRvIGJ1ZmZlciAqLworCQkJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgKHVuc2lnbmVkIGNoYXIgKikmcHJpdi0+cnhfYnVmLCByeF9wYWNrZXRfbG9jICsgMjQsIG1zZHVfc2l6ZSk7CisJCQkKKwkJCS8qIHdlIHVzZSB0aGUgc2FtZSBidWZmZXIgZm9yIGZyYWcgcmVhc3NlbWJseSBhbmQgY29udHJvbCBwYWNrZXRzICovCisJCQltZW1zZXQocHJpdi0+ZnJhZ19zb3VyY2UsIDB4ZmYsIDYpOworCQkJCisJCQlpZiAocHJpdi0+ZG9fcnhfY3JjKSB7CisJCQkJLyogbGFzdCA0IG9jdGV0cyBpcyBjcmMgKi8KKwkJCQltc2R1X3NpemUgLT0gNDsKKwkJCQljcmMgPSBjcmMzMl9sZShjcmMsICh1bnNpZ25lZCBjaGFyICopJnByaXYtPnJ4X2J1ZiwgbXNkdV9zaXplKTsKKwkJCQlpZiAoKGNyYyBeIDB4ZmZmZmZmZmYpICE9ICgqKCh1MzIgKikmcHJpdi0+cnhfYnVmW21zZHVfc2l6ZV0pKSkgeworCQkJCQlwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisKKwkJCWF0bWVsX21hbmFnZW1lbnRfZnJhbWUocHJpdiwgJmhlYWRlciwgbXNkdV9zaXplLAorCQkJCQkgICAgICAgYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfcngocHJpdiwgUlhfREVTQ19SU1NJX09GRlNFVCwgcHJpdi0+cnhfZGVzY19oZWFkKSkpOworCQl9IAorCisJbmV4dDoKKwkJLyogcmVsZWFzZSBkZXNjcmlwdG9yICovCisJCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX3J4KHByaXYsIFJYX0RFU0NfRkxBR1NfT0ZGU0VULCBwcml2LT5yeF9kZXNjX2hlYWQpLCBSWF9ERVNDX0ZMQUdfQ09OU1VNRUQpOyAgCisJCQorCQlpZiAocHJpdi0+cnhfZGVzY19oZWFkIDwgKHByaXYtPmhvc3RfaW5mby5yeF9kZXNjX2NvdW50IC0gMSkpCisJCQlwcml2LT5yeF9kZXNjX2hlYWQrKzsJCQkJCQorCQllbHNlCisJCQlwcml2LT5yeF9kZXNjX2hlYWQgPSAwOworCX0KK30JCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzZXJ2aWNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1OCBpc3I7CisJaW50IGkgPSAtMTsKKwlzdGF0aWMgdTggaXJxX29yZGVyW10gPSB7IAorCQlJU1JfT1VUX09GX1JBTkdFLAorCQlJU1JfUnhDT01QTEVURSwKKwkJSVNSX1R4Q09NUExFVEUsCisJCUlTUl9SeEZSQU1FTE9TVCwKKwkJSVNSX0ZBVEFMX0VSUk9SLAorCQlJU1JfQ09NTUFORF9DT01QTEVURSwKKwkJSVNSX0lCU1NfTUVSR0UsCisJCUlTUl9HRU5FUklDX0lSUQorCX07CisJCQorCisJaWYgKHByaXYtPmNhcmQgJiYgcHJpdi0+cHJlc2VudF9jYWxsYmFjayAmJiAKKwkgICAgISgqcHJpdi0+cHJlc2VudF9jYWxsYmFjaykocHJpdi0+Y2FyZCkpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCS8qIEluIHRoaXMgc3RhdGUgdXBwZXItbGV2ZWwgY29kZSBhc3N1bWVzIGl0IGNhbiBtZXNzIHdpdGgKKwkgICB0aGUgY2FyZCB1bmhhbXBlcmVkIGJ5IGludGVycnVwdHMgd2hpY2ggbWF5IGNoYW5nZSByZWdpc3RlciBzdGF0ZS4KKwkgICBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIGNhcmQgc2hvdWxkbid0IGdlbmVyYXRlIGludGVycnVwdHMKKwkgICB0aGUgaW50dXJydXB0IGxpbmUgbWF5IGJlIHNoYXJlZC4gVGhpcyBhbGxvd3MgY2FyZCBzZXR1cCAKKwkgICB0byBnbyBvbiB3aXRob3V0IGRpc2FibGluZyBpbnRlcnJ1cHRzIGZvciBhIGxvbmcgdGltZS4gKi8KKwlpZiAocHJpdi0+c3RhdGlvbl9zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX0RPV04pCisJCXJldHVybiBJUlFfTk9ORTsKKyAgICAgCQorCWF0bWVsX2NsZWFyX2djcihkZXYsIEdDUl9FTklOVCk7IC8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCisJd2hpbGUgKDEpIHsKKwkJaWYgKCFhdG1lbF9sb2NrX21hYyhwcml2KSkgeworCQkJLyogZmFpbGVkIHRvIGNvbnRhY3QgY2FyZCAqLworCQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBmYWlsZWQgdG8gY29udGFjdCBNQUMuXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJCQorCQlpc3IgPSBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9JTlRfU1RBVFVTX09GRlNFVCkpOworCQlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9MT0NLT1VUX01BQ19PRkZTRVQpLCAwKTsKKwkJCisJCWlmICghaXNyKSB7CisJCQlhdG1lbF9zZXRfZ2NyKGRldiwgR0NSX0VOSU5UKTsgLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwkJCXJldHVybiBpID09IC0xID8gSVJRX05PTkUgOiBJUlFfSEFORExFRDsKKwkJfQorCQkKKwkJYXRtZWxfc2V0X2djcihkZXYsIEdDUl9BQ0tJTlQpOyAvKiBhY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KKwkJCisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaXJxX29yZGVyKS9zaXplb2YodTgpOyBpKyspCisJCQlpZiAoaXNyICYgaXJxX29yZGVyW2ldKQorCQkJCWJyZWFrOworCQkKKwkJaWYgKCFhdG1lbF9sb2NrX21hYyhwcml2KSkgeworCQkJLyogZmFpbGVkIHRvIGNvbnRhY3QgY2FyZCAqLworCQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBmYWlsZWQgdG8gY29udGFjdCBNQUMuXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJCQorCQlpc3IgPSBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9JTlRfU1RBVFVTX09GRlNFVCkpOworCQlpc3IgXj0gaXJxX29yZGVyW2ldOworCQlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9JTlRfU1RBVFVTX09GRlNFVCksIGlzcik7CisJCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0xPQ0tPVVRfTUFDX09GRlNFVCksIDApOworCQkKKwkJc3dpdGNoIChpcnFfb3JkZXJbaV0pIHsKKwkJCQorCQljYXNlIElTUl9PVVRfT0ZfUkFOR0U6IAorCQkJaWYgKHByaXYtPm9wZXJhdGluZ19tb2RlID09IElXX01PREVfSU5GUkEgJiYgCisJCQkgICAgcHJpdi0+c3RhdGlvbl9zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX1JFQURZKSB7CisJCQkJcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKwkJCQlhdG1lbF9zY2FuKHByaXYsIDEpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJU1JfUnhGUkFNRUxPU1Q6CisJCQlwcml2LT53c3RhdHMuZGlzY2FyZC5taXNjKys7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBJU1JfUnhDT01QTEVURToKKwkJCXJ4X2RvbmVfaXJxKHByaXYpOyAKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgSVNSX1R4Q09NUExFVEU6CisJCQl0eF9kb25lX2lycShwcml2KTsgCisJCQlicmVhazsKKwkJCQorCQljYXNlIElTUl9GQVRBTF9FUlJPUjoKKwkJCXByaW50ayhLRVJOX0FMRVJUICIlczogKioqIEZBVEFMIGVycm9yIGludGVycnVwdCAqKipcbiIsIGRldi0+bmFtZSk7CisJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX01HTVRfRVJST1IpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBJU1JfQ09NTUFORF9DT01QTEVURTogCisJCQlhdG1lbF9jb21tYW5kX2lycShwcml2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVNSX0lCU1NfTUVSR0U6CisJCQlhdG1lbF9nZXRfbWliKHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfQ1VSX0JTU0lEX1BPUywgCisJCQkJICAgICAgcHJpdi0+Q3VycmVudEJTU0lELCA2KTsKKwkJCS8qIFRoZSBXUEEgc3R1ZmYgY2FyZXMgYWJvdXQgdGhlIGN1cnJlbnQgQVAgYWRkcmVzcyAqLworCQkJaWYgKHByaXYtPnVzZV93cGEpCisJCQkJYnVpbGRfd3BhX21pYihwcml2KTsKKwkJCWJyZWFrOworCQljYXNlIElTUl9HRU5FUklDX0lSUToKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBHZW5lcmljX2lycSByZWNlaXZlZC5cbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCX0JCit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdG1lbF9nZXRfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmcHJpdi0+c3RhdHM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqYXRtZWxfZ2V0X3dpcmVsZXNzX3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIHVwZGF0ZSB0aGUgbGluayBxdWFsaXR5IGhlcmUgaW4gY2FzZSB3ZSBhcmUgc2VlaW5nIG5vIGJlYWNvbnMgCisJICAgYXQgYWxsIHRvIGRyaXZlIHRoZSBwcm9jZXNzICovCisJYXRtZWxfc21vb3RoX3F1YWwocHJpdik7CisJCisJcHJpdi0+d3N0YXRzLnN0YXR1cyA9IHByaXYtPnN0YXRpb25fc3RhdGU7CisKKwlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgeworCQlpZiAocHJpdi0+c3RhdGlvbl9zdGF0ZSAhPSBTVEFUSU9OX1NUQVRFX1JFQURZKSB7CisJCQlwcml2LT53c3RhdHMucXVhbC5xdWFsID0gMDsKKwkJCXByaXYtPndzdGF0cy5xdWFsLmxldmVsID0gMDsKKwkJCXByaXYtPndzdGF0cy5xdWFsLnVwZGF0ZWQgPSAoSVdfUVVBTF9RVUFMX0lOVkFMSUQKKwkJCQkJfCBJV19RVUFMX0xFVkVMX0lOVkFMSUQpOworCQl9CisJCXByaXYtPndzdGF0cy5xdWFsLm5vaXNlID0gMDsKKwkJcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX05PSVNFX0lOVkFMSUQ7CisJfSBlbHNlIHsKKwkJLyogUXVhbGl0eSBsZXZlbHMgY2Fubm90IGJlIGRldGVybWluZWQgaW4gYWQtaG9jIG1vZGUsCisJCSAgIGJlY2F1c2Ugd2UgY2FuICdoZWFyJyBtb3JlIHRoYXQgb25lIHJlbW90ZSBzdGF0aW9uLiAqLworCQlwcml2LT53c3RhdHMucXVhbC5xdWFsID0gMDsKKwkJcHJpdi0+d3N0YXRzLnF1YWwubGV2ZWwJPSAwOworCQlwcml2LT53c3RhdHMucXVhbC5ub2lzZQk9IDA7CisJCXByaXYtPndzdGF0cy5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX1FVQUxfSU5WQUxJRAorCQkJCQl8IElXX1FVQUxfTEVWRUxfSU5WQUxJRAorCQkJCQl8IElXX1FVQUxfTk9JU0VfSU5WQUxJRDsKKwkJcHJpdi0+d3N0YXRzLm1pc3MuYmVhY29uID0gMDsKKwl9CisJCisJcmV0dXJuICgmcHJpdi0+d3N0YXRzKTsKK30KKworc3RhdGljIGludCBhdG1lbF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworICAgICAgICBpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiAyMzEyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgZGV2LT5tdHUgPSBuZXdfbXR1OworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworICAgICAgICAKKyAgICAgICAgbWVtY3B5IChkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKwlyZXR1cm4gYXRtZWxfb3BlbihkZXYpOworfQorCitFWFBPUlRfU1lNQk9MKGF0bWVsX29wZW4pOworCitpbnQgYXRtZWxfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGksIGNoYW5uZWw7CisKKwkvKiBhbnkgc2NoZWR1bGVkIHRpbWVyIGlzIG5vIGxvbmdlciBuZWVkZWQgYW5kIG1pZ2h0IHNjcmV3IHRoaW5ncyB1cC4uICovCisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIpOworCQorCS8qIEludGVycnVwdHMgd2lsbCBub3QgdG91Y2ggdGhlIGNhcmQgb25jZSBpbiB0aGlzIHN0YXRlLi4uICovCisJcHJpdi0+c3RhdGlvbl9zdGF0ZSA9IFNUQVRJT05fU1RBVEVfRE9XTjsKKworCWlmIChwcml2LT5uZXdfU1NJRF9zaXplKSB7CisJCW1lbWNweShwcml2LT5TU0lELCBwcml2LT5uZXdfU1NJRCwgcHJpdi0+bmV3X1NTSURfc2l6ZSk7CisJCXByaXYtPlNTSURfc2l6ZSA9IHByaXYtPm5ld19TU0lEX3NpemU7CisJCXByaXYtPm5ld19TU0lEX3NpemUgPSAwOworCX0KKwlwcml2LT5CU1NfbGlzdF9lbnRyaWVzID0gMDsKKworCXByaXYtPkF1dGhlbnRpY2F0aW9uUmVxdWVzdFJldHJ5Q250ID0gMDsKKwlwcml2LT5Bc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA9IDA7CisJcHJpdi0+UmVBc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA9IDA7CisJcHJpdi0+Q3VycmVudEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSA9IDB4MDAwMTsKKwlwcml2LT5FeHBlY3RlZEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSA9IDB4MDAwMjsKKworCXByaXYtPnNpdGVfc3VydmV5X3N0YXRlID0gU0lURV9TVVJWRVlfSURMRTsKKwlwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAwOworCisJaWYgKCFyZXNldF9hdG1lbF9jYXJkKGRldikpIAorCQlyZXR1cm4gLUVBR0FJTjsKKworCWlmIChwcml2LT5jb25maWdfcmVnX2RvbWFpbikgeworCQlwcml2LT5yZWdfZG9tYWluID0gcHJpdi0+Y29uZmlnX3JlZ19kb21haW47CisJCWF0bWVsX3NldF9taWI4KHByaXYsIFBoeV9NaWJfVHlwZSwgUEhZX01JQl9SRUdfRE9NQUlOX1BPUywgcHJpdi0+cmVnX2RvbWFpbik7CisJfSBlbHNlIHsKKwkJcHJpdi0+cmVnX2RvbWFpbiA9IGF0bWVsX2dldF9taWI4KHByaXYsIFBoeV9NaWJfVHlwZSwgUEhZX01JQl9SRUdfRE9NQUlOX1BPUyk7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2hhbm5lbF90YWJsZSkvc2l6ZW9mKGNoYW5uZWxfdGFibGVbMF0pOyBpKyspCisJCQlpZiAocHJpdi0+cmVnX2RvbWFpbiA9PSBjaGFubmVsX3RhYmxlW2ldLnJlZ19kb21haW4pCisJCQkJYnJlYWs7CisJCWlmIChpID09IHNpemVvZihjaGFubmVsX3RhYmxlKS9zaXplb2YoY2hhbm5lbF90YWJsZVswXSkpIHsKKwkJCXByaXYtPnJlZ19kb21haW4gPSBSRUdfRE9NQUlOX01LSzE7CisJCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IGZhaWxlZCB0byBnZXQgcmVndWxhdG9yeSBkb21haW46IGFzc3VtaW5nIE1LSzEuXG4iLCBkZXYtPm5hbWUpOworCQl9IAorCX0KKwkKKwlpZiAoKGNoYW5uZWwgPSBhdG1lbF92YWxpZGF0ZV9jaGFubmVsKHByaXYsIHByaXYtPmNoYW5uZWwpKSkKKwkJcHJpdi0+Y2hhbm5lbCA9IGNoYW5uZWw7CisKKwkvKiB0aGlzIG1vdmVzIHN0YXRpb25fc3RhdGUgb24uLi4uICovIAorCWF0bWVsX3NjYW4ocHJpdiwgMSk7CQorCisJYXRtZWxfc2V0X2djcihwcml2LT5kZXYsIEdDUl9FTklOVCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQkKKwlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX0RPV04pOworCQorCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpIAorCQlhdG1lbF93cml0ZTE2KGRldiwgR0NSLCAweDAwNjApOworCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA0MCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfdmFsaWRhdGVfY2hhbm5lbChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGNoYW5uZWwpCit7CisJLyogY2hlY2sgdGhhdCBjaGFubmVsIGlzIE9LLCBpZiBzbyByZXR1cm4gemVybywKKwkgICBlbHNlIHJldHVybiBzdWl0YWJsZSBkZWZhdWx0IGNoYW5uZWwgKi8KKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2hhbm5lbF90YWJsZSkvc2l6ZW9mKGNoYW5uZWxfdGFibGVbMF0pOyBpKyspCisJCWlmIChwcml2LT5yZWdfZG9tYWluID09IGNoYW5uZWxfdGFibGVbaV0ucmVnX2RvbWFpbikgeworCQkJaWYgKGNoYW5uZWwgPj0gY2hhbm5lbF90YWJsZVtpXS5taW4gJiYKKwkJCSAgICBjaGFubmVsIDw9IGNoYW5uZWxfdGFibGVbaV0ubWF4KQorCQkJCXJldHVybiAwOworCQkJZWxzZQorCQkJCXJldHVybiBjaGFubmVsX3RhYmxlW2ldLm1pbjsKKwkJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3Byb2Nfb3V0cHV0IChjaGFyICpidWYsIHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCWludCBpOworCWNoYXIgKnAgPSBidWY7CisJY2hhciAqcywgKnIsICpjOworCQorCXAgKz0gc3ByaW50ZihwLCAiRHJpdmVyIHZlcnNpb246XHRcdCVkLiVkXG4iLCBEUklWRVJfTUFKT1IsIERSSVZFUl9NSU5PUik7CisJCisJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgIT0gU1RBVElPTl9TVEFURV9ET1dOKSB7CisJCXAgKz0gc3ByaW50ZihwLCAiRmlybXdhcmUgdmVyc2lvbjpcdCVkLiVkIGJ1aWxkICVkXG5GaXJtd2FyZSBsb2NhdGlvbjpcdCIsIAorCQkJICAgICBwcml2LT5ob3N0X2luZm8ubWFqb3JfdmVyc2lvbiwKKwkJCSAgICAgcHJpdi0+aG9zdF9pbmZvLm1pbm9yX3ZlcnNpb24sCisJCQkgICAgIHByaXYtPmhvc3RfaW5mby5idWlsZF92ZXJzaW9uKTsKKwkJCisJCWlmIChwcml2LT5jYXJkX3R5cGUgIT0gQ0FSRF9UWVBFX0VFUFJPTSkgCisJCQlwICs9IHNwcmludGYocCwgIm9uIGNhcmRcbiIpOworCQllbHNlIGlmIChwcml2LT5maXJtd2FyZSkgCisJCQlwICs9IHNwcmludGYocCwgIiVzIGxvYWRlZCBieSBob3N0XG4iLCBwcml2LT5maXJtd2FyZV9pZCk7CisJCWVsc2UKKwkJCXAgKz0gc3ByaW50ZihwLCAiJXMgbG9hZGVkIGJ5IGhvdHBsdWdcbiIsIHByaXYtPmZpcm13YXJlX2lkKTsKKwkJCisJCXN3aXRjaChwcml2LT5jYXJkX3R5cGUpIHsKKwkJY2FzZSBDQVJEX1RZUEVfUEFSQUxMRUxfRkxBU0g6IGMgPSAiUGFyYWxsZWwgZmxhc2giOyBicmVhazsKKwkJY2FzZSBDQVJEX1RZUEVfU1BJX0ZMQVNIOiBjID0gIlNQSSBmbGFzaFxuIjsgYnJlYWs7CisJCWNhc2UgQ0FSRF9UWVBFX0VFUFJPTTogYyA9ICJFRVBST00iOyBicmVhazsKKwkJZGVmYXVsdDogYyA9ICI8dW5rbm93bj4iOworCQl9CisKKwkJCisJCXIgPSAiPHVua25vd24+IjsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihjaGFubmVsX3RhYmxlKS9zaXplb2YoY2hhbm5lbF90YWJsZVswXSk7IGkrKykKKwkJCWlmIChwcml2LT5yZWdfZG9tYWluID09IGNoYW5uZWxfdGFibGVbaV0ucmVnX2RvbWFpbikKKwkJCQlyID0gY2hhbm5lbF90YWJsZVtpXS5uYW1lOworCQkKKwkJcCArPSBzcHJpbnRmKHAsICJNQUMgbWVtb3J5IHR5cGU6XHQlc1xuIiwgYyk7CisJCXAgKz0gc3ByaW50ZihwLCAiUmVndWxhdG9yeSBkb21haW46XHQlc1xuIiwgcik7CisJCXAgKz0gc3ByaW50ZihwLCAiSG9zdCBDUkMgY2hlY2tpbmc6XHQlc1xuIiwgCisJCQkgICAgIHByaXYtPmRvX3J4X2NyYyA/ICJPbiIgOiAiT2ZmIik7CisJCXAgKz0gc3ByaW50ZihwLCAiV1BBLWNhcGFibGUgZmlybXdhcmU6XHQlc1xuIiwKKwkJCSAgICAgcHJpdi0+dXNlX3dwYSA/ICJZZXMiIDogIk5vIik7CisJfQorCQorCXN3aXRjaChwcml2LT5zdGF0aW9uX3N0YXRlKSB7CisJY2FzZSBTVEFUSU9OX1NUQVRFX1NDQU5OSU5HOiBzID0gIlNjYW5uaW5nIjsgYnJlYWs7CisJY2FzZSBTVEFUSU9OX1NUQVRFX0pPSU5OSU5HOiBzID0gIkpvaW5pbmciOyBicmVhazsKKwljYXNlIFNUQVRJT05fU1RBVEVfQVVUSEVOVElDQVRJTkc6IHMgPSAiQXV0aGVudGljYXRpbmciOyBicmVhazsKKwljYXNlIFNUQVRJT05fU1RBVEVfQVNTT0NJQVRJTkc6IHMgPSAiQXNzb2NpYXRpbmciOyBicmVhazsKKwljYXNlIFNUQVRJT05fU1RBVEVfUkVBRFk6IHMgPSAiUmVhZHkiOyBicmVhazsKKwljYXNlIFNUQVRJT05fU1RBVEVfUkVBU1NPQ0lBVElORzogcyA9ICJSZWFzc29jaWF0aW5nIjsgYnJlYWs7CisJY2FzZSBTVEFUSU9OX1NUQVRFX01HTVRfRVJST1I6IHMgPSAiTWFuYWdlbWVudCBlcnJvciI7IGJyZWFrOworCWNhc2UgU1RBVElPTl9TVEFURV9ET1dOOiBzID0gIkRvd24iOyBicmVhazsKKwlkZWZhdWx0OiBzID0gIjx1bmtub3duPiI7CisJfQorICAgICAgCisJcCArPSBzcHJpbnRmKHAsICJDdXJyZW50IHN0YXRlOlx0XHQlc1xuIiwgcyk7CisJcmV0dXJuICBwIC0gYnVmOworfQorCitzdGF0aWMgaW50IGF0bWVsX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCSAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisgICAgICAgIHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gZGF0YTsKKwlpbnQgbGVuID0gYXRtZWxfcHJvY19vdXRwdXQgKHBhZ2UsIHByaXYpOworICAgICAgICBpZiAobGVuIDw9IG9mZitjb3VudCkgKmVvZiA9IDE7CisgICAgICAgICpzdGFydCA9IHBhZ2UgKyBvZmY7CisgICAgICAgIGxlbiAtPSBvZmY7CisgICAgICAgIGlmIChsZW4+Y291bnQpIGxlbiA9IGNvdW50OworICAgICAgICBpZiAobGVuPDApIGxlbiA9IDA7CisgICAgICAgIHJldHVybiBsZW47Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICppbml0X2F0bWVsX2NhcmQoIHVuc2lnbmVkIHNob3J0IGlycSwgaW50IHBvcnQsIGNvbnN0IEF0bWVsRldUeXBlIGZ3X3R5cGUsICAKKwkJCQkgICAgc3RydWN0IGRldmljZSAqc3lzX2RldiwgaW50ICgqY2FyZF9wcmVzZW50KSh2b2lkICopLCB2b2lkICpjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXY7CisJaW50IHJjOworCisJLyogQ3JlYXRlIHRoZSBuZXR3b3JrIGRldmljZSBvYmplY3QuICovCisgICAgICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqcHJpdikpOworICAgICAgICBpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgImF0bWVsOiAgQ291bGRuJ3QgYWxsb2NfZXRoZXJkZXZcbiIpOworCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCWlmIChkZXZfYWxsb2NfbmFtZShkZXYsIGRldi0+bmFtZSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRtZWw6ICBDb3VsZG4ndCBnZXQgbmFtZSFcbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZTsKKwl9CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwcml2LT5kZXYgPSBkZXY7CisJcHJpdi0+c3lzX2RldiA9IHN5c19kZXY7CisJcHJpdi0+cHJlc2VudF9jYWxsYmFjayA9IGNhcmRfcHJlc2VudDsKKwlwcml2LT5jYXJkID0gY2FyZDsKKwlwcml2LT5maXJtd2FyZSA9IE5VTEw7CisJcHJpdi0+ZmlybXdhcmVfaWRbMF0gPSAnXDAnOworCXByaXYtPmZpcm13YXJlX3R5cGUgPSBmd190eXBlOworCWlmIChmaXJtd2FyZSkgLyogbW9kdWxlIHBhcmFtZXRlciAqLworCQlzdHJjcHkocHJpdi0+ZmlybXdhcmVfaWQsIGZpcm13YXJlKTsKKwlwcml2LT5idXNfdHlwZSA9IGNhcmRfcHJlc2VudCA/IEJVU19UWVBFX1BDQ0FSRCA6IEJVU19UWVBFX1BDSTsKKwlwcml2LT5zdGF0aW9uX3N0YXRlID0gU1RBVElPTl9TVEFURV9ET1dOOworCXByaXYtPmRvX3J4X2NyYyA9IDA7CisJLyogRm9yIFBDTUNJQSBjYXJkcywgc29tZSBjaGlwcyBuZWVkIENSQywgc29tZSBkb24ndAorCSAgIHNvIHdlIGhhdmUgdG8gcHJvYmUuICovCisJaWYgKHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDQ0FSRCkgeworCQlwcml2LT5wcm9iZV9jcmMgPSAxOworCQlwcml2LT5jcmNfb2tfY250ID0gcHJpdi0+Y3JjX2tvX2NudCA9IDA7CisJfSBlbHNlCisJCXByaXYtPnByb2JlX2NyYyA9IDA7CisJbWVtc2V0KCZwcml2LT5zdGF0cywgMCwgc2l6ZW9mKHByaXYtPnN0YXRzKSk7CisJbWVtc2V0KCZwcml2LT53c3RhdHMsIDAsIHNpemVvZihwcml2LT53c3RhdHMpKTsKKwlwcml2LT5sYXN0X3F1YWwgPSBqaWZmaWVzOworCXByaXYtPmxhc3RfYmVhY29uX3RpbWVzdGFtcCA9IDA7CisJbWVtc2V0KHByaXYtPmZyYWdfc291cmNlLCAweGZmLCBzaXplb2YocHJpdi0+ZnJhZ19zb3VyY2UpKTsKKwltZW1zZXQocHJpdi0+QlNTSUQsIDAsIDYpOworCXByaXYtPkN1cnJlbnRCU1NJRFswXSA9IDB4RkY7IC8qIEluaXRpYWxpemUgdG8gc29tZXRoaW5nIGludmFsaWQuLi4uICovCisJcHJpdi0+c3RhdGlvbl93YXNfYXNzb2NpYXRlZCA9IDA7CisJCisJcHJpdi0+bGFzdF9zdXJ2ZXkgPSBqaWZmaWVzOworCXByaXYtPnByZWFtYmxlID0gTE9OR19QUkVBTUJMRTsKKwlwcml2LT5vcGVyYXRpbmdfbW9kZSA9IElXX01PREVfSU5GUkE7CisJcHJpdi0+Y29ubmVjdF90b19hbnlfQlNTID0gMDsKKwlwcml2LT5jb25maWdfcmVnX2RvbWFpbiA9IDA7CisJcHJpdi0+cmVnX2RvbWFpbiA9IDA7CisJcHJpdi0+dHhfcmF0ZSA9IDM7CisJcHJpdi0+YXV0b190eF9yYXRlID0gMTsKKwlwcml2LT5jaGFubmVsID0gNDsKKwlwcml2LT5wb3dlcl9tb2RlID0gMDsKKwlwcml2LT5TU0lEWzBdID0gJ1wwJzsKKwlwcml2LT5TU0lEX3NpemUgPSAwOworCXByaXYtPm5ld19TU0lEX3NpemUgPSAwOworCXByaXYtPmZyYWdfdGhyZXNob2xkID0gMjM0NjsKKwlwcml2LT5ydHNfdGhyZXNob2xkID0gMjM0NzsKKwlwcml2LT5zaG9ydF9yZXRyeSA9IDc7CisJcHJpdi0+bG9uZ19yZXRyeSA9IDQ7CisKKwlwcml2LT53ZXBfaXNfb24gPSAwOworCXByaXYtPmRlZmF1bHRfa2V5ID0gMDsKKwlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMDsKKwlwcml2LT5leGNsdWRlX3VuZW5jcnlwdGVkID0gMDsKKwlwcml2LT5ncm91cF9jaXBoZXJfc3VpdGUgPSBwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGUgPSBDSVBIRVJfU1VJVEVfTk9ORTsKKwlwcml2LT51c2Vfd3BhID0gMDsKKwltZW1zZXQocHJpdi0+d2VwX2tleXMsIDAsIHNpemVvZihwcml2LT53ZXBfa2V5cykpOworCW1lbXNldChwcml2LT53ZXBfa2V5X2xlbiwgMCwgc2l6ZW9mKHByaXYtPndlcF9rZXlfbGVuKSk7CisKKwlwcml2LT5kZWZhdWx0X2JlYWNvbl9wZXJpb2QgPSBwcml2LT5iZWFjb25fcGVyaW9kID0gMTAwOworCXByaXYtPmxpc3Rlbl9pbnRlcnZhbCA9IDE7CisKKwlpbml0X3RpbWVyKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+aXJxbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnRpbWVybG9jayk7CisJcHJpdi0+bWFuYWdlbWVudF90aW1lci5mdW5jdGlvbiA9IGF0bWVsX21hbmFnZW1lbnRfdGltZXI7CisJcHJpdi0+bWFuYWdlbWVudF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwkKKwlkZXYtPm9wZW4gPSBhdG1lbF9vcGVuOworCWRldi0+c3RvcCA9IGF0bWVsX2Nsb3NlOworCWRldi0+Y2hhbmdlX210dSA9IGF0bWVsX2NoYW5nZV9tdHU7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBhdG1lbF9zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzdGFydF90eDsKKwlkZXYtPmdldF9zdGF0cyA9IGF0bWVsX2dldF9zdGF0czsKKwlkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IGF0bWVsX2dldF93aXJlbGVzc19zdGF0czsKKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZhdG1lbF9oYW5kbGVyX2RlZjsKKwlkZXYtPmRvX2lvY3RsID0gYXRtZWxfaW9jdGw7CisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5iYXNlX2FkZHIgPSBwb3J0OworCQorCVNFVF9ORVRERVZfREVWKGRldiwgc3lzX2Rldik7CisJCisJaWYgKChyYyA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzZXJ2aWNlX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVnaXN0ZXIgaW50ZXJydXB0ICVkIGZhaWxlZCwgcmMgJWRcbiIsIGRldi0+bmFtZSwgaXJxLCByYyApOworCQlnb3RvIGVycl9vdXRfZnJlZTsKKwl9CisKKwlpZiAocHJpdi0+YnVzX3R5cGUgPT0gQlVTX1RZUEVfUENJICYmCisJICAgICFyZXF1ZXN0X3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDY0LCBkZXYtPm5hbWUgKSkgeworCQlnb3RvIGVycl9vdXRfaXJxOworCX0KKwkKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpCisJCWdvdG8gZXJyX291dF9yZXM7CisJCisJaWYgKCFwcm9iZV9hdG1lbF9jYXJkKGRldikpeworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlnb3RvIGVycl9vdXRfcmVzOworCX0KKwkKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQorCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKCJkcml2ZXIvYXRtZWwiLCAwLCBOVUxMLCBhdG1lbF9yZWFkX3Byb2MsIHByaXYpOwkKKwkKKwlwcmludGsoS0VSTl9JTkZPICIlczogQXRtZWwgYXQ3NmM1MHggd2lyZWxlc3MuIFZlcnNpb24gJWQuJWQgc2ltb25AdGhla2VsbGV5cy5vcmcudWtcbiIsCisJICAgICAgIGRldi0+bmFtZSwgRFJJVkVSX01BSk9SLCBEUklWRVJfTUlOT1IpOworCQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlyZXR1cm4gZGV2OworCQorIGVycl9vdXRfcmVzOgorCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0kpCisJICAgICAgICByZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDY0ICk7CisgZXJyX291dF9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisgZXJyX291dF9mcmVlOgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0woaW5pdF9hdG1lbF9jYXJkKTsKKwordm9pZCBzdG9wX2F0bWVsX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZyZWVyZXMpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQkKKwkvKiBwdXQgYSBicmljayBvbiBpdC4uLiAqLworCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpIAorCQlhdG1lbF93cml0ZTE2KGRldiwgR0NSLCAweDAwNjApOworCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA0MCk7CisJCisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIpOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9hdG1lbCIsIE5VTEwpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCWlmIChwcml2LT5maXJtd2FyZSkKKwkJa2ZyZWUocHJpdi0+ZmlybXdhcmUpOworCWlmIChmcmVlcmVzKSB7CisJCS8qIFBDTUNJQSBmcmVlcyB0aGlzIHN0dWZmLCBzbyBvbmx5IGZvciBQQ0kgKi8KKwkgICAgICAgIHJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCA2NCk7CisgICAgICAgIH0KKwlmcmVlX25ldGRldihkZXYpOworfQorCitFWFBPUlRfU1lNQk9MKHN0b3BfYXRtZWxfY2FyZCk7CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogQ2hlY2sgaWYgd2UgYXNrZWQgZm9yIGBhbnknICovCisJaWYoZHdycS0+ZmxhZ3MgPT0gMCkgeworCQlwcml2LT5jb25uZWN0X3RvX2FueV9CU1MgPSAxOworCX0gZWxzZSB7CisJCWludCBpbmRleCA9IChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCisJCXByaXYtPmNvbm5lY3RfdG9fYW55X0JTUyA9IDA7CisJCQorCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nICovCisJCWlmIChkd3JxLT5sZW5ndGggPiBNQVhfU1NJRF9MRU5HVEggKyAxKQorCQkJIHJldHVybiAtRTJCSUcgOworCQlpZiAoaW5kZXggIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQkKKwkJbWVtY3B5KHByaXYtPm5ld19TU0lELCBleHRyYSwgZHdycS0+bGVuZ3RoIC0gMSk7CisJCXByaXYtPm5ld19TU0lEX3NpemUgPSBkd3JxLT5sZW5ndGggLSAxOworCX0KKworCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogR2V0IHRoZSBjdXJyZW50IFNTSUQgKi8KKwlpZiAocHJpdi0+bmV3X1NTSURfc2l6ZSAhPSAwKSB7CisJCW1lbWNweShleHRyYSwgcHJpdi0+bmV3X1NTSUQsIHByaXYtPm5ld19TU0lEX3NpemUpOworCQlleHRyYVtwcml2LT5uZXdfU1NJRF9zaXplXSA9ICdcMCc7CisJCWR3cnEtPmxlbmd0aCA9IHByaXYtPm5ld19TU0lEX3NpemUgKyAxOworCX0gZWxzZSB7CisJCW1lbWNweShleHRyYSwgcHJpdi0+U1NJRCwgcHJpdi0+U1NJRF9zaXplKTsKKwkJZXh0cmFbcHJpdi0+U1NJRF9zaXplXSA9ICdcMCc7CisJCWR3cnEtPmxlbmd0aCA9IHByaXYtPlNTSURfc2l6ZSArIDE7CisJfQorCQorCWR3cnEtPmZsYWdzID0gIXByaXYtPmNvbm5lY3RfdG9fYW55X0JTUzsgLyogYWN0aXZlICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCW1lbWNweShhd3JxLT5zYV9kYXRhLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpOworCWF3cnEtPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3NldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBCYXNpYyBjaGVja2luZzogZG8gd2UgaGF2ZSBhIGtleSB0byBzZXQgPworCSAqIE5vdGUgOiB3aXRoIHRoZSBuZXcgQVBJLCBpdCdzIGltcG9zc2libGUgdG8gZ2V0IGEgTlVMTCBwb2ludGVyLgorCSAqIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBjaGVjayBhIGtleSBzaXplID09IDAgaW5zdGVhZC4KKwkgKiBOZXcgdmVyc2lvbiBvZiBpd2NvbmZpZyBwcm9wZXJseSBzZXQgdGhlIElXX0VOQ09ERV9OT0tFWSBmbGFnCisJICogd2hlbiBubyBrZXkgaXMgcHJlc2VudCAob25seSBjaGFuZ2UgZmxhZ3MpLCBidXQgb2xkZXIgdmVyc2lvbnMKKwkgKiBkb24ndCBkbyBpdC4gLSBKZWFuIElJICovCisJaWYgKGR3cnEtPmxlbmd0aCA+IDApIHsKKwkJaW50IGluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCWludCBjdXJyZW50X2luZGV4ID0gcHJpdi0+ZGVmYXVsdF9rZXk7CisJCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwkJaWYgKGR3cnEtPmxlbmd0aCA+IDEzKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBDaGVjayB0aGUgaW5kZXggKG5vbmUgLT4gdXNlIGN1cnJlbnQpICovCisJCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gNCkKKwkJCWluZGV4ID0gY3VycmVudF9pbmRleDsKKwkJZWxzZQorCQkJcHJpdi0+ZGVmYXVsdF9rZXkgPSBpbmRleDsKKwkJLyogU2V0IHRoZSBsZW5ndGggKi8KKwkJaWYgKGR3cnEtPmxlbmd0aCA+IDUpCisJCQlwcml2LT53ZXBfa2V5X2xlbltpbmRleF0gPSAxMzsKKwkJZWxzZQorCQkJaWYgKGR3cnEtPmxlbmd0aCA+IDApCisJCQkJcHJpdi0+d2VwX2tleV9sZW5baW5kZXhdID0gNTsKKwkJCWVsc2UKKwkJCQkvKiBEaXNhYmxlIHRoZSBrZXkgKi8KKwkJCQlwcml2LT53ZXBfa2V5X2xlbltpbmRleF0gPSAwOworCQkvKiBDaGVjayBpZiB0aGUga2V5IGlzIG5vdCBtYXJrZWQgYXMgaW52YWxpZCAqLworCQlpZighKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSkgeworCQkJLyogQ2xlYW51cCAqLworCQkJbWVtc2V0KHByaXYtPndlcF9rZXlzW2luZGV4XSwgMCwgMTMpOworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCW1lbWNweShwcml2LT53ZXBfa2V5c1tpbmRleF0sIGV4dHJhLCBkd3JxLT5sZW5ndGgpOworCQl9CisJCS8qIFdFIHNwZWNpZnkgdGhhdCBpZiBhIHZhbGlkIGtleSBpcyBzZXQsIGVuY3J5cHRpb24KKwkJICogc2hvdWxkIGJlIGVuYWJsZWQgKHVzZXIgbWF5IHR1cm4gaXQgb2ZmIGxhdGVyKQorCQkgKiBUaGlzIGlzIGFsc28gaG93ICJpd2NvbmZpZyBldGhYIGtleSBvbiIgd29ya3MgKi8KKwkJaWYgKGluZGV4ID09IGN1cnJlbnRfaW5kZXggJiYgCisJCSAgICBwcml2LT53ZXBfa2V5X2xlbltpbmRleF0gPiAwKSB7CisJCQlwcml2LT53ZXBfaXNfb24gPSAxOworCQkJcHJpdi0+ZXhjbHVkZV91bmVuY3J5cHRlZCA9IDE7CisJCQlpZiAocHJpdi0+d2VwX2tleV9sZW5baW5kZXhdID4gNSkgeworCQkJCXByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9IENJUEhFUl9TVUlURV9XRVBfNjQ7CisJCQkJcHJpdi0+ZW5jcnlwdGlvbl9sZXZlbCA9IDI7CisJCQl9IGVsc2UgeworCQkJCXByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9IENJUEhFUl9TVUlURV9XRVBfMTI4OworCQkJCXByaXYtPmVuY3J5cHRpb25fbGV2ZWwgPSAxOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogRG8gd2Ugd2FudCB0byBqdXN0IHNldCB0aGUgdHJhbnNtaXQga2V5IGluZGV4ID8gKi8KKwkJaW50IGluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCWlmICggaW5kZXg+PTAgJiYgaW5kZXggPCA0ICkgeworCQkJcHJpdi0+ZGVmYXVsdF9rZXkgPSBpbmRleDsKKwkJfSBlbHNlCisJCQkvKiBEb24ndCBjb21wbGFpbiBpZiBvbmx5IGNoYW5nZSB0aGUgbW9kZSAqLworCQkJaWYoIWR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwl9CisJLyogUmVhZCB0aGUgZmxhZ3MgKi8KKwlpZihkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgeworCQlwcml2LT53ZXBfaXNfb24gPSAwOworCQlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMDsgCQorCQlwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGUgPSBDSVBIRVJfU1VJVEVfTk9ORTsKKwl9IGVsc2UgeworCQlwcml2LT53ZXBfaXNfb24gPSAxOworCQlpZiAocHJpdi0+d2VwX2tleV9sZW5bcHJpdi0+ZGVmYXVsdF9rZXldID4gNSkgeworCQkJcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID0gQ0lQSEVSX1NVSVRFX1dFUF8xMjg7CisJCQlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMjsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9IENJUEhFUl9TVUlURV9XRVBfNjQ7CisJCQlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMTsKKwkJfQorCX0KKwlpZihkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQorCQlwcml2LT5leGNsdWRlX3VuZW5jcnlwdGVkID0gMTsKKwlpZihkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKQorCQlwcml2LT5leGNsdWRlX3VuZW5jcnlwdGVkID0gMDsKKwkKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkKKwlpZiAoIXByaXYtPndlcF9pc19vbikKKwkJZHdycS0+ZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJZWxzZSBpZiAocHJpdi0+ZXhjbHVkZV91bmVuY3J5cHRlZCkKKwkJZHdycS0+ZmxhZ3MgPSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKKwllbHNlCisJCWR3cnEtPmZsYWdzID0gSVdfRU5DT0RFX09QRU47CisJCQorCQkvKiBXaGljaCBrZXkgZG8gd2Ugd2FudCA/IC0xIC0+IHR4IGluZGV4ICovCisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSA0KQorCQlpbmRleCA9IHByaXYtPmRlZmF1bHRfa2V5OworCWR3cnEtPmZsYWdzIHw9IGluZGV4ICsgMTsKKwkvKiBDb3B5IHRoZSBrZXkgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJZHdycS0+bGVuZ3RoID0gcHJpdi0+d2VwX2tleV9sZW5baW5kZXhdOworCWlmIChkd3JxLT5sZW5ndGggPiAxNikgeworCQlkd3JxLT5sZW5ndGg9MDsKKwl9IGVsc2UgeworCQltZW1zZXQoZXh0cmEsIDAsIDE2KTsKKwkJbWVtY3B5KGV4dHJhLCBwcml2LT53ZXBfa2V5c1tpbmRleF0sIGR3cnEtPmxlbmd0aCk7CisJfQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIGNoYXIgKmN3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cmNweShjd3JxLCAiSUVFRSA4MDIuMTEtRFMiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlpZiAodndycS0+Zml4ZWQgPT0gMCkgeworCQlwcml2LT50eF9yYXRlID0gMzsKKwkJcHJpdi0+YXV0b190eF9yYXRlID0gMTsKKwl9IGVsc2UgeworCQlwcml2LT5hdXRvX3R4X3JhdGUgPSAwOworCQkKKwkJLyogV2hpY2ggdHlwZSBvZiB2YWx1ZSA/ICovCisJCWlmKCh2d3JxLT52YWx1ZSA8IDQpICYmICh2d3JxLT52YWx1ZSA+PSAwKSkgeworCQkJLyogU2V0dGluZyBieSByYXRlIGluZGV4ICovCisJCXByaXYtPnR4X3JhdGUgPSB2d3JxLT52YWx1ZTsKKwkJfSBlbHNlIHsKKwkJLyogU2V0dGluZyBieSBmcmVxdWVuY3kgdmFsdWUgKi8KKwkJCXN3aXRjaCAodndycS0+dmFsdWUpIHsKKwkJCWNhc2UgIDEwMDAwMDA6IHByaXYtPnR4X3JhdGUgPSAwOyBicmVhazsKKwkJCWNhc2UgIDIwMDAwMDA6IHByaXYtPnR4X3JhdGUgPSAxOyBicmVhazsKKwkJCWNhc2UgIDU1MDAwMDA6IHByaXYtPnR4X3JhdGUgPSAyOyBicmVhazsKKwkJCWNhc2UgMTEwMDAwMDA6IHByaXYtPnR4X3JhdGUgPSAzOyBicmVhazsKKwkJCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBfX3UzMiAqdXdycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCp1d3JxICE9IElXX01PREVfQURIT0MgJiYgKnV3cnEgIT0gSVdfTU9ERV9JTkZSQSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcml2LT5vcGVyYXRpbmdfbW9kZSA9ICp1d3JxOworCXJldHVybiAtRUlOUFJPR1JFU1M7ICAKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBfX3UzMiAqdXdycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCSp1d3JxID0gcHJpdi0+b3BlcmF0aW5nX21vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAocHJpdi0+YXV0b190eF9yYXRlKSB7CisJCXZ3cnEtPmZpeGVkID0gMDsKKwkJdndycS0+dmFsdWUgPSAxMTAwMDAwMDsKKwl9IGVsc2UgeworCQl2d3JxLT5maXhlZCA9IDE7CisJCXN3aXRjaChwcml2LT50eF9yYXRlKSB7CisJCWNhc2UgMDogdndycS0+dmFsdWUgPSAgMTAwMDAwMDsgYnJlYWs7CisJCWNhc2UgMTogdndycS0+dmFsdWUgPSAgMjAwMDAwMDsgYnJlYWs7CisJCWNhc2UgMjogdndycS0+dmFsdWUgPSAgNTUwMDAwMDsgYnJlYWs7CisJCWNhc2UgMzogdndycS0+dmFsdWUgPSAxMTAwMDAwMDsgYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXByaXYtPnBvd2VyX21vZGUgPSB2d3JxLT5kaXNhYmxlZCA/IDAgOiAxOworCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZ3cnEtPmRpc2FibGVkID0gcHJpdi0+cG93ZXJfbW9kZSA/IDAgOiAxOworCXZ3cnEtPmZsYWdzID0gSVdfUE9XRVJfT047CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCWlmKCF2d3JxLT5kaXNhYmxlZCAmJiAodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9MSU1JVCkpIHsKKwkJaWYodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9NQVgpCisJCQlwcml2LT5sb25nX3JldHJ5ID0gdndycS0+dmFsdWU7CisJCWVsc2UgaWYgKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTUlOKQorCQkJcHJpdi0+c2hvcnRfcmV0cnkgPSB2d3JxLT52YWx1ZTsKKwkJZWxzZSB7CisJCQkvKiBObyBtb2RpZmllciA6IHNldCBib3RoICovCisJCQlwcml2LT5sb25nX3JldHJ5ID0gdndycS0+dmFsdWU7CisJCQlwcml2LT5zaG9ydF9yZXRyeSA9IHZ3cnEtPnZhbHVlOworCQl9CisJCXJldHVybiAtRUlOUFJPR1JFU1M7CQkKKwl9CisJICAgCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJdndycS0+ZGlzYWJsZWQgPSAwOyAgICAgIC8qIENhbid0IGJlIGRpc2FibGVkICovCisKKwkvKiBOb3RlIDogYnkgZGVmYXVsdCwgZGlzcGxheSB0aGUgbWluIHJldHJ5IG51bWJlciAqLworCWlmKCh2d3JxLT5mbGFncyAmIElXX1JFVFJZX01BWCkpIHsKKwkJdndycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX01BWDsKKwkJdndycS0+dmFsdWUgPSBwcml2LT5sb25nX3JldHJ5OworCX0gZWxzZSB7CisJCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJCXZ3cnEtPnZhbHVlID0gcHJpdi0+c2hvcnRfcmV0cnk7CisJCWlmKHByaXYtPmxvbmdfcmV0cnkgIT0gcHJpdi0+c2hvcnRfcmV0cnkpCisJCQl2d3JxLT5mbGFncyB8PSBJV19SRVRSWV9NSU47CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcnRociA9IHZ3cnEtPnZhbHVlOworCisJaWYodndycS0+ZGlzYWJsZWQpCisJCXJ0aHIgPSAyMzQ3OworCWlmKChydGhyIDwgMCkgfHwgKHJ0aHIgPiAyMzQ3KSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJpdi0+cnRzX3RocmVzaG9sZCA9IHJ0aHI7CisJCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCXZ3cnEtPnZhbHVlID0gcHJpdi0+cnRzX3RocmVzaG9sZDsKKwl2d3JxLT5kaXNhYmxlZCA9ICh2d3JxLT52YWx1ZSA+PSAyMzQ3KTsKKwl2d3JxLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZnRociA9IHZ3cnEtPnZhbHVlOworCisJaWYodndycS0+ZGlzYWJsZWQpCisJCWZ0aHIgPSAyMzQ2OworCWlmKChmdGhyIDwgMjU2KSB8fCAoZnRociA+IDIzNDYpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlmdGhyICY9IH4weDE7CS8qIEdldCBhbiBldmVuIHZhbHVlIC0gaXMgaXQgcmVhbGx5IG5lZWRlZCA/Pz8gKi8KKwlwcml2LT5mcmFnX3RocmVzaG9sZCA9IGZ0aHI7CisJCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXZ3cnEtPnZhbHVlID0gcHJpdi0+ZnJhZ190aHJlc2hvbGQ7CisJdndycS0+ZGlzYWJsZWQgPSAodndycS0+dmFsdWUgPj0gMjM0Nik7CisJdndycS0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBsb25nIGZyZXF1ZW5jeV9saXN0W10gPSB7IDI0MTIsIDI0MTcsIDI0MjIsIDI0MjcsIDI0MzIsIDI0MzcsIDI0NDIsCisJCQkJMjQ0NywgMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywgMjQ3MiwgMjQ4NCB9OworCitzdGF0aWMgaW50IGF0bWVsX3NldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19mcmVxICpmd3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjID0gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworCQorCS8qIElmIHNldHRpbmcgYnkgZnJlcXVlbmN5LCBjb252ZXJ0IHRvIGEgY2hhbm5lbCAqLworCWlmKChmd3JxLT5lID09IDEpICYmCisJICAgKGZ3cnEtPm0gPj0gKGludCkgMjQxMjAwMDAwKSAmJgorCSAgIChmd3JxLT5tIDw9IChpbnQpIDI0ODcwMDAwMCkpIHsKKwkJaW50IGYgPSBmd3JxLT5tIC8gMTAwMDAwOworCQlpbnQgYyA9IDA7CisJCXdoaWxlKChjIDwgMTQpICYmIChmICE9IGZyZXF1ZW5jeV9saXN0W2NdKSkKKwkJCWMrKzsKKwkJLyogSGFjayB0byBmYWxsIHRocm91Z2guLi4gKi8KKwkJZndycS0+ZSA9IDA7CisJCWZ3cnEtPm0gPSBjICsgMTsKKwl9CisJLyogU2V0dGluZyBieSBjaGFubmVsIG51bWJlciAqLworCWlmKChmd3JxLT5tID4gMTAwMCkgfHwgKGZ3cnEtPmUgPiAwKSkKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwllbHNlIHsKKwkJaW50IGNoYW5uZWwgPSBmd3JxLT5tOworCQlpZiAoYXRtZWxfdmFsaWRhdGVfY2hhbm5lbChwcml2LCBjaGFubmVsKSA9PSAwKSB7CisJCQlwcml2LT5jaGFubmVsID0gY2hhbm5lbDsKKwkJfSBlbHNlIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJfSAKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19mcmVxICpmd3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlmd3JxLT5tID0gcHJpdi0+Y2hhbm5lbDsKKwlmd3JxLT5lID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogTm90ZSA6IHlvdSBtYXkgaGF2ZSByZWFsaXNlZCB0aGF0LCBhcyB0aGlzIGlzIGEgU0VUIG9wZXJhdGlvbiwKKwkgKiB0aGlzIGlzIHByaXZpbGVnZWQgYW5kIHRoZXJlZm9yZSBhIG5vcm1hbCB1c2VyIGNhbid0CisJICogcGVyZm9ybSBzY2FubmluZy4KKwkgKiBUaGlzIGlzIG5vdCBhbiBlcnJvciwgd2hpbGUgdGhlIGRldmljZSBwZXJmb3JtIHNjYW5uaW5nLAorCSAqIHRyYWZmaWMgZG9lc24ndCBmbG93LCBzbyBpdCdzIGEgcGVyZmVjdCBEb1MuLi4KKwkgKiBKZWFuIElJICovCisJCisJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgPT0gU1RBVElPTl9TVEFURV9ET1dOKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qIFRpbWVvdXQgb2xkIHN1cnZleXMuICovCisJaWYgKChqaWZmaWVzIC0gcHJpdi0+bGFzdF9zdXJ2ZXkpID4gKDIwICogSFopKQorCQlwcml2LT5zaXRlX3N1cnZleV9zdGF0ZSA9IFNJVEVfU1VSVkVZX0lETEU7CisJcHJpdi0+bGFzdF9zdXJ2ZXkgPSBqaWZmaWVzOworCisJLyogSW5pdGlhdGUgYSBzY2FuIGNvbW1hbmQgKi8KKwlpZiAocHJpdi0+c2l0ZV9zdXJ2ZXlfc3RhdGUgPT0gU0lURV9TVVJWRVlfSU5fUFJPR1JFU1MpCisJCXJldHVybiAtRUJVU1k7CisJCQorCWRlbF90aW1lcl9zeW5jKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOworCQorCXByaXYtPnNpdGVfc3VydmV5X3N0YXRlID0gU0lURV9TVVJWRVlfSU5fUFJPR1JFU1M7CisJcHJpdi0+ZmFzdF9zY2FuID0gMDsKKwlhdG1lbF9zY2FuKHByaXYsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwljaGFyICpjdXJyZW50X2V2ID0gZXh0cmE7CisJc3RydWN0IGl3X2V2ZW50CWl3ZTsKKwkKKwlpZiAocHJpdi0+c2l0ZV9zdXJ2ZXlfc3RhdGUgIT0gU0lURV9TVVJWRVlfQ09NUExFVEVEKQorCQlyZXR1cm4gLUVBR0FJTjsKKwkKKwlmb3IoaT0wOyBpPHByaXYtPkJTU19saXN0X2VudHJpZXM7IGkrKykgeyAKKwkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKKwkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIHByaXYtPkJTU2luZm9baV0uQlNTSUQsIDYpOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSAgcHJpdi0+QlNTaW5mb1tpXS5TU0lEc2l6ZTsKKwkJaWYgKGl3ZS51LmRhdGEubGVuZ3RoID4gMzIpCisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IDMyOworCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCQlpd2UudS5kYXRhLmZsYWdzID0gMTsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgJml3ZSwgcHJpdi0+QlNTaW5mb1tpXS5TU0lEKTsKKwkJCisJCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKwkJaXdlLnUubW9kZSA9IHByaXYtPkJTU2luZm9baV0uQlNTdHlwZTsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOworCQorCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJCWl3ZS51LmZyZXEubSA9IHByaXYtPkJTU2luZm9baV0uY2hhbm5lbDsKKwkJaXdlLnUuZnJlcS5lID0gMDsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworCQkKKwkJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJCWlmIChwcml2LT5CU1NpbmZvW2ldLlVzaW5nV0VQKQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCQllbHNlCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IDA7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsICZpd2UsIE5VTEwpOworCQkKKwl9CisKKwkvKiBMZW5ndGggb2YgZGF0YSAqLworCWR3cnEtPmxlbmd0aCA9IChjdXJyZW50X2V2IC0gZXh0cmEpOworCWR3cnEtPmZsYWdzID0gMDsgICAKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisJaW50IGssaSxqOworCisJZHdycS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YocmFuZ2UpKTsKKwlyYW5nZS0+bWluX253aWQgPSAweDAwMDA7CisJcmFuZ2UtPm1heF9ud2lkID0gMHgwMDAwOworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAwOworCWZvciAoaiA9IDA7IGogPCBzaXplb2YoY2hhbm5lbF90YWJsZSkvc2l6ZW9mKGNoYW5uZWxfdGFibGVbMF0pOyBqKyspCisJCWlmIChwcml2LT5yZWdfZG9tYWluID09IGNoYW5uZWxfdGFibGVbal0ucmVnX2RvbWFpbikgeworCQkJcmFuZ2UtPm51bV9jaGFubmVscyA9IGNoYW5uZWxfdGFibGVbal0ubWF4IC0gY2hhbm5lbF90YWJsZVtqXS5taW4gKyAxOworCQkJYnJlYWs7CisJCX0KKwlpZiAocmFuZ2UtPm51bV9jaGFubmVscyAhPSAwKSB7CisJCWZvcihrID0gMCwgaSA9IGNoYW5uZWxfdGFibGVbal0ubWluOyBpIDw9IGNoYW5uZWxfdGFibGVbal0ubWF4OyBpKyspIHsKKwkJCXJhbmdlLT5mcmVxW2tdLmkgPSBpOyAvKiBMaXN0IGluZGV4ICovCisJCQlyYW5nZS0+ZnJlcVtrXS5tID0gZnJlcXVlbmN5X2xpc3RbaS0xXSAqIDEwMDAwMDsKKwkJCXJhbmdlLT5mcmVxW2srK10uZSA9IDE7CS8qIFZhbHVlcyBpbiB0YWJsZSBpbiBNSHogLT4gKiAxMF41ICogMTAgKi8KKwkJfQorCQlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IGs7CisJfQorCQorCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDEwMDsKKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOworCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSA1MDsKKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSA1MDsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOworCisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMDsKKworCXJhbmdlLT5iaXRyYXRlWzBdID0gIDEwMDAwMDA7CisJcmFuZ2UtPmJpdHJhdGVbMV0gPSAgMjAwMDAwMDsKKwlyYW5nZS0+Yml0cmF0ZVsyXSA9ICA1NTAwMDAwOworCXJhbmdlLT5iaXRyYXRlWzNdID0gMTEwMDAwMDA7CisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IDQ7CisKKwlyYW5nZS0+bWluX3J0cyA9IDA7CisJcmFuZ2UtPm1heF9ydHMgPSAyMzQ3OworCXJhbmdlLT5taW5fZnJhZyA9IDI1NjsKKwlyYW5nZS0+bWF4X2ZyYWcgPSAyMzQ2OworCisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA1OworCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gMTM7CisJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7CisJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSA0OworCQorCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9PTjsKKwlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfT047CisJcmFuZ2UtPnBtX2NhcGEgPSAwOworCQorCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUIDsKKwlyYW5nZS0+cmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+cl90aW1lX2ZsYWdzID0gMDsKKwlyYW5nZS0+bWluX3JldHJ5ID0gMTsKKwlyYW5nZS0+bWF4X3JldHJ5ID0gNjU1MzU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCXN0YXRpYyBjb25zdCB1OCBiY2FzdFtdID0geyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChhd3JxLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwlpZiAobWVtY21wKGJjYXN0LCBhd3JxLT5zYV9kYXRhLCA2KSA9PSAwKSB7CisJCWRlbF90aW1lcl9zeW5jKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJYXRtZWxfc2Nhbihwcml2LCAxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJCisJZm9yKGk9MDsgaTxwcml2LT5CU1NfbGlzdF9lbnRyaWVzOyBpKyspIHsKKwkJaWYgKG1lbWNtcChwcml2LT5CU1NpbmZvW2ldLkJTU0lELCBhd3JxLT5zYV9kYXRhLCA2KSA9PSAwKSB7CisJCQlpZiAoIXByaXYtPndlcF9pc19vbiAmJiBwcml2LT5CU1NpbmZvW2ldLlVzaW5nV0VQKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9IGVsc2UgaWYgIChwcml2LT53ZXBfaXNfb24gJiYgIXByaXYtPkJTU2luZm9baV0uVXNpbmdXRVApIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0gZWxzZSB7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5pcnFsb2NrLCBmbGFncyk7CisJCQkJYXRtZWxfam9pbl9ic3MocHJpdiwgaSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCQkKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwkKK3N0YXRpYyBpbnQgYXRtZWxfY29uZmlnX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCS8qIE5VTEwgKi8KKwkJCSAgICAgICB2b2lkICp6d3JxLAkJCS8qIE5VTEwgKi8KKwkJCSAgICAgICBjaGFyICpleHRyYSkJCQkvKiBOVUxMICovCit7CisJcmV0dXJuIGF0bWVsX29wZW4oZGV2KTsKK30KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCWF0bWVsX2hhbmRsZXJbXSA9Cit7CisJKGl3X2hhbmRsZXIpIGF0bWVsX2NvbmZpZ19jb21taXQsCS8qIFNJT0NTSVdDT01NSVQgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X25hbWUsICAgIAkvKiBTSU9DR0lXTkFNRSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NTSVdOV0lEICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ0dJV05XSUQgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X2ZyZXEsCQkvKiBTSU9DU0lXRlJFUSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfZnJlcSwJCS8qIFNJT0NHSVdGUkVRICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9tb2RlLAkJLyogU0lPQ1NJV01PREUgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X21vZGUsCQkvKiBTSU9DR0lXTU9ERSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgIAkvKiBTSU9DU0lXU0VOUyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgCQkvKiBTSU9DR0lXU0VOUyAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NTSVdSQU5HRSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfcmFuZ2UsICAgICAgICAgICAvKiBTSU9DR0lXUkFOR0UgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DU0lXUFJJViAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NHSVdQUklWICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ1NJV1NUQVRTICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ0dJV1NUQVRTICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ1NJV1NQWSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NHSVdTUFkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfd2FwLAkJLyogU0lPQ1NJV0FQICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF93YXAsCQkvKiBTSU9DR0lXQVAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgIAkJLyogU0lPQ0dJV0FQTElTVCAqLworCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfc2NhbiwJCS8qIFNJT0NTSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9zY2FuLAkJLyogU0lPQ0dJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X2Vzc2lkLAkJLyogU0lPQ1NJV0VTU0lEICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9lc3NpZCwJCS8qIFNJT0NHSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgIAkJLyogU0lPQ1NJV05JQ0tOICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgIAkJLyogU0lPQ0dJV05JQ0tOICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X3JhdGUsCQkvKiBTSU9DU0lXUkFURSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfcmF0ZSwJCS8qIFNJT0NHSVdSQVRFICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9ydHMsCQkvKiBTSU9DU0lXUlRTICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9ydHMsCQkvKiBTSU9DR0lXUlRTICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9mcmFnLAkJLyogU0lPQ1NJV0ZSQUcgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X2ZyYWcsCQkvKiBTSU9DR0lXRlJBRyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgIAkJLyogU0lPQ1NJV1RYUE9XICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgIAkJLyogU0lPQ0dJV1RYUE9XICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9yZXRyeSwJCS8qIFNJT0NTSVdSRVRSWSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfcmV0cnksCQkvKiBTSU9DR0lXUkVUUlkgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X2VuY29kZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X3Bvd2VyLAkJLyogU0lPQ1NJV1BPV0VSICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9wb3dlciwJCS8qIFNJT0NHSVdQT1dFUiAqLworfTsKKworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJYXRtZWxfcHJpdmF0ZV9oYW5kbGVyW10gPQoreworCU5VTEwsCQkJCS8qIFNJT0NJV0ZJUlNUUFJJViAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgYXRtZWxfcHJpdl9pb2N0bCB7CisJY2hhciBpZFszMl07CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKmRhdGE7CQkKKwl1bnNpZ25lZCBzaG9ydCBsZW47CQkKK30gYXRtZWxfcHJpdl9pb2N0bDsKKworCQorI2RlZmluZSBBVE1FTEZXTCBTSU9DSVdGSVJTVFBSSVYKKyNkZWZpbmUgQVRNRUxJRElGQyBBVE1FTEZXTCArIDEKKyNkZWZpbmUgQVRNRUxSRCBBVE1FTEZXTCArIDIKKyNkZWZpbmUgQVRNRUxNQUdJQyAweDUxODA3IAorI2RlZmluZSBSRUdET01BSU5TWiAyMAorCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyBhdG1lbF9wcml2YXRlX2FyZ3NbXSA9IHsKKy8qeyBjbWQsICAgICAgICAgc2V0X2FyZ3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9hcmdzLCBuYW1lIH0gKi8KKyAgeyBBVE1FTEZXTCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCBzaXplb2YgKGF0bWVsX3ByaXZfaW9jdGwpLCBJV19QUklWX1RZUEVfTk9ORSwgImF0bWVsZndsIiB9LAorICB7IEFUTUVMSURJRkMsIElXX1BSSVZfVFlQRV9OT05FLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImF0bWVsaWRpZmMiIH0sCisgIHsgQVRNRUxSRCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBSRUdET01BSU5TWiwgSVdfUFJJVl9UWVBFX05PTkUsICJyZWdkb21haW4iIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCWF0bWVsX2hhbmRsZXJfZGVmID0KK3sKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKGF0bWVsX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGUJPSBzaXplb2YoYXRtZWxfcHJpdmF0ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksIAorCS5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKGF0bWVsX3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLCAKKwkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBhdG1lbF9oYW5kbGVyLAorCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgYXRtZWxfcHJpdmF0ZV9oYW5kbGVyLCAKKwkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgYXRtZWxfcHJpdmF0ZV9hcmdzCit9OworCitzdGF0aWMgaW50IGF0bWVsX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJaW50IGksIHJjID0gMDsKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJYXRtZWxfcHJpdl9pb2N0bCBjb207CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworCXVuc2lnbmVkIGNoYXIgKm5ld19maXJtd2FyZTsKKwljaGFyIGRvbWFpbltSRUdET01BSU5TWisxXTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR0lXUFJJVjoKKwkJaWYod3JxLT51LmRhdGEucG9pbnRlcikgeworCQkJLyogU2V0IHRoZSBudW1iZXIgb2YgaW9jdGwgYXZhaWxhYmxlICovCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoYXRtZWxfcHJpdmF0ZV9hcmdzKSAvIHNpemVvZihhdG1lbF9wcml2YXRlX2FyZ3NbMF0pOworCQkJCisJCQkvKiBDb3B5IHN0cnVjdHVyZSB0byB0aGUgdXNlciBidWZmZXIgKi8KKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwKKwkJCQkJICh1X2NoYXIgKikgYXRtZWxfcHJpdmF0ZV9hcmdzLAorCQkJCQkgc2l6ZW9mKGF0bWVsX3ByaXZhdGVfYXJncykpKQorCQkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQVRNRUxJRElGQzoKKwkJd3JxLT51LnBhcmFtLnZhbHVlID0gQVRNRUxNQUdJQzsJCQorCQlicmVhazsKKwkKKwljYXNlIEFUTUVMRldMOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbSwgcnEtPmlmcl9kYXRhLCBzaXplb2YoY29tKSkpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyYyA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCEobmV3X2Zpcm13YXJlID0ga21hbGxvYyhjb20ubGVuLCBHRlBfS0VSTkVMKSkpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKG5ld19maXJtd2FyZSwgY29tLmRhdGEsIGNvbS5sZW4pKSB7CisJCQlrZnJlZShuZXdfZmlybXdhcmUpOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocHJpdi0+ZmlybXdhcmUpCisJCQlrZnJlZShwcml2LT5maXJtd2FyZSk7CisJCQorCQlwcml2LT5maXJtd2FyZSA9IG5ld19maXJtd2FyZTsKKwkJcHJpdi0+ZmlybXdhcmVfbGVuZ3RoID0gY29tLmxlbjsKKwkJc3RybmNweShwcml2LT5maXJtd2FyZV9pZCwgY29tLmlkLCAzMSk7CisJCXByaXYtPmZpcm13YXJlX2lkWzMxXSA9ICdcMCc7CisJCWJyZWFrOworCisJY2FzZSBBVE1FTFJEOgorCQlpZiAoY29weV9mcm9tX3VzZXIoZG9tYWluLCBycS0+aWZyX2RhdGEsIFJFR0RPTUFJTlNaKSkgeworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmMgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCisJCWRvbWFpbltSRUdET01BSU5TWl0gPSAwOworCQlyYyA9IC1FSU5WQUw7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2hhbm5lbF90YWJsZSkvc2l6ZW9mKGNoYW5uZWxfdGFibGVbMF0pOyBpKyspIHsKKwkJCS8qIHN0cmNhc2VjbXAgZG9lc24ndCBleGlzdCBpbiB0aGUgbGlicmFyeSAqLworCQkJY2hhciAqYSA9IGNoYW5uZWxfdGFibGVbaV0ubmFtZTsKKwkJCWNoYXIgKmIgPSBkb21haW47CisJCQl3aGlsZSAoKmEpIHsKKwkJCQljaGFyIGMxID0gKmErKzsKKwkJCQljaGFyIGMyID0gKmIrKzsKKwkJCQlpZiAodG9sb3dlcihjMSkgIT0gdG9sb3dlcihjMikpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCEqYSAmJiAhKmIpIHsKKwkJCQlwcml2LT5jb25maWdfcmVnX2RvbWFpbiA9IGNoYW5uZWxfdGFibGVbaV0ucmVnX2RvbWFpbjsKKwkJCQlyYyA9IDA7CisJCQl9CisJCX0KKwkJCisJCWlmIChyYyA9PSAwICYmICBwcml2LT5zdGF0aW9uX3N0YXRlICE9IFNUQVRJT05fU1RBVEVfRE9XTikKKwkJCXJjID0gYXRtZWxfb3BlbihkZXYpOworCQlicmVhazsKKwkJCisJZGVmYXVsdDoKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwl9CisJCisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgYXV0aF9ib2R5IHsKKwl1MTYgYWxnOworCXUxNiB0cmFuc19zZXE7CisJdTE2IHN0YXR1czsKKwl1OCBlbF9pZDsKKwl1OCBjaGFsbF90ZXh0X2xlbjsKKwl1OCBjaGFsbF90ZXh0WzI1M107Cit9OyAKKworc3RhdGljIHZvaWQgYXRtZWxfZW50ZXJfc3RhdGUoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBuZXdfc3RhdGUpCit7CisJaW50IG9sZF9zdGF0ZSA9IHByaXYtPnN0YXRpb25fc3RhdGU7CisJCQorCWlmIChuZXdfc3RhdGUgPT0gb2xkX3N0YXRlKQorCQlyZXR1cm47CisJCisJcHJpdi0+c3RhdGlvbl9zdGF0ZSA9IG5ld19zdGF0ZTsKKwkJCisJaWYgKG5ld19zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX1JFQURZKSB7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKHByaXYtPmRldik7CisJCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+ZGV2KTsKKwl9CisKKwlpZiAob2xkX3N0YXRlID09IFNUQVRJT05fU1RBVEVfUkVBRFkpIHsKKwkJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+ZGV2KTsKKwkJaWYgKG5ldGlmX3J1bm5pbmcocHJpdi0+ZGV2KSkKKwkJCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+ZGV2KTsKKwkJcHJpdi0+bGFzdF9iZWFjb25fdGltZXN0YW1wID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX3NjYW4oc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBzcGVjaWZpY19zc2lkKQoreworCXN0cnVjdCB7CisJCXU4IEJTU0lEWzZdOworCQl1OCBTU0lEW01BWF9TU0lEX0xFTkdUSF07CisJCXU4IHNjYW5fdHlwZTsKKwkJdTggY2hhbm5lbDsKKwkJdTE2IEJTU190eXBlOworCQl1MTYgbWluX2NoYW5uZWxfdGltZTsKKwkJdTE2IG1heF9jaGFubmVsX3RpbWU7CisJCXU4IG9wdGlvbnM7CisJCXU4IFNTSURfc2l6ZTsKKwl9IGNtZDsKKwkKKwltZW1zZXQoY21kLkJTU0lELCAweGZmLCA2KTsKKworCWlmIChwcml2LT5mYXN0X3NjYW4pIHsKKwkJY21kLlNTSURfc2l6ZSA9IHByaXYtPlNTSURfc2l6ZTsKKwkJbWVtY3B5KGNtZC5TU0lELCBwcml2LT5TU0lELCBwcml2LT5TU0lEX3NpemUpOworCQljbWQubWluX2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KDEwKTsKKwkJY21kLm1heF9jaGFubmVsX3RpbWUgPSBjcHVfdG9fbGUxNig1MCk7CisJfSBlbHNlIHsKKwkJcHJpdi0+QlNTX2xpc3RfZW50cmllcyA9IDA7CisJCWNtZC5TU0lEX3NpemUgPSAwOworCQljbWQubWluX2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KDEwKTsKKwkJY21kLm1heF9jaGFubmVsX3RpbWUgPSBjcHVfdG9fbGUxNigxMjApOworCX0KKwkKKwljbWQub3B0aW9ucyA9IDA7CisJCisJaWYgKCFzcGVjaWZpY19zc2lkKQorCQljbWQub3B0aW9ucyB8PSBTQ0FOX09QVElPTlNfU0lURV9TVVJWRVk7CisJCisJY21kLmNoYW5uZWwgPSAocHJpdi0+Y2hhbm5lbCAmIDB4N2YpOyAKKwljbWQuc2Nhbl90eXBlID0gU0NBTl9UWVBFX0FDVElWRTsKKwljbWQuQlNTX3R5cGUgPSBjcHVfdG9fbGUxNihwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBJV19NT0RFX0FESE9DID8gCisJCUJTU19UWVBFX0FEX0hPQyA6IEJTU19UWVBFX0lORlJBU1RSVUNUVVJFKTsKKwkKKwlhdG1lbF9zZW5kX2NvbW1hbmQocHJpdiwgQ01EX1NjYW4sICZjbWQsIHNpemVvZihjbWQpKTsKKworCS8qIFRoaXMgbXVzdCBjb21lIGFmdGVyIGFsbCBoYXJkd2FyZSBhY2Nlc3MgdG8gYXZvaWQgYmVpbmcgbWVzc2VkIHVwCisJICAgYnkgc3R1ZmYgaGFwcGVuaW5nIGluIGludGVycnVwdCBjb250ZXh0IGFmdGVyIHdlIGxlYXZlIFNUQVRFX0RPV04gKi8KKwlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX1NDQU5OSU5HKTsKK30KKworc3RhdGljIHZvaWQgam9pbihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IHR5cGUpCit7CisJc3RydWN0IHsKKwkJdTggQlNTSURbNl07CisJCXU4IFNTSURbTUFYX1NTSURfTEVOR1RIXTsKKwkJdTggQlNTX3R5cGU7IC8qIHRoaXMgaXMgYSBzaG9ydCBpbiBhIHNjYW4gY29tbWFuZCAtIHdlaXJkICovCisJCXU4IGNoYW5uZWw7CisJCXUxNiB0aW1lb3V0OworCQl1OCBTU0lEX3NpemU7CisJCXU4IHJlc2VydmVkOworCX0gY21kOworCisJY21kLlNTSURfc2l6ZSA9IHByaXYtPlNTSURfc2l6ZTsKKwltZW1jcHkoY21kLlNTSUQsIHByaXYtPlNTSUQsIHByaXYtPlNTSURfc2l6ZSk7CisJbWVtY3B5KGNtZC5CU1NJRCwgcHJpdi0+Q3VycmVudEJTU0lELCA2KTsKKwljbWQuY2hhbm5lbCA9IChwcml2LT5jaGFubmVsICYgMHg3Zik7CisJY21kLkJTU190eXBlID0gdHlwZTsKKwljbWQudGltZW91dCA9IGNwdV90b19sZTE2KDIwMDApOworCisgCWF0bWVsX3NlbmRfY29tbWFuZChwcml2LCBDTURfSm9pbiwgJmNtZCwgc2l6ZW9mKGNtZCkpOworfQorCisKK3N0YXRpYyB2b2lkIHN0YXJ0KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgeworCQl1OCBCU1NJRFs2XTsKKwkJdTggU1NJRFtNQVhfU1NJRF9MRU5HVEhdOworCQl1OCBCU1NfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQl1OCBjaGFubmVsOworCQl1OCBTU0lEX3NpemU7CisJCXU4IHJlc2VydmVkWzNdOworCX0gY21kOworCisJY21kLlNTSURfc2l6ZSA9IHByaXYtPlNTSURfc2l6ZTsKKwltZW1jcHkoY21kLlNTSUQsIHByaXYtPlNTSUQsIHByaXYtPlNTSURfc2l6ZSk7CisJbWVtY3B5KGNtZC5CU1NJRCwgcHJpdi0+QlNTSUQsIDYpOworCWNtZC5CU1NfdHlwZSA9IHR5cGU7CisJY21kLmNoYW5uZWwgPSAocHJpdi0+Y2hhbm5lbCAmIDB4N2YpOworCisJYXRtZWxfc2VuZF9jb21tYW5kKHByaXYsIENNRF9TdGFydCwgJmNtZCwgc2l6ZW9mKGNtZCkpOyAKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2JlYWNvbl9wcm9iZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IGNhcGFiaWxpdHksIHU4IGNoYW5uZWwpCit7CisJaW50IHJlam9pbiA9IDA7CisJaW50IG5ldyA9IGNhcGFiaWxpdHkgICYgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9TaG9ydFByZWFtYmxlID8gCisJCVNIT1JUX1BSRUFNQkxFIDogTE9OR19QUkVBTUJMRTsKKworCWlmIChwcml2LT5wcmVhbWJsZSAhPSBuZXcpIHsKKwkJcHJpdi0+cHJlYW1ibGUgPSBuZXc7CisJCXJlam9pbiA9IDE7CisJCWF0bWVsX3NldF9taWI4KHByaXYsIExvY2FsX01pYl9UeXBlLCBMT0NBTF9NSUJfUFJFQU1CTEVfVFlQRSwgbmV3KTsKKwl9CisJCQorCWlmIChwcml2LT5jaGFubmVsICE9IGNoYW5uZWwpIHsKKwkJcHJpdi0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJCXJlam9pbiA9IDE7CisJCWF0bWVsX3NldF9taWI4KHByaXYsIFBoeV9NaWJfVHlwZSwgUEhZX01JQl9DSEFOTkVMX1BPUywgY2hhbm5lbCk7CisJfQorCQorCWlmIChyZWpvaW4pIHsKKwkJcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKwkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9KT0lOTklORyk7CisJCQorCQlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9JTkZSQSkKKwkJCWpvaW4ocHJpdiwgQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkUpOworCQllbHNlIAorCQkJam9pbihwcml2LCBCU1NfVFlQRV9BRF9IT0MpOworCX0gCit9CisKKyAKK3N0YXRpYyB2b2lkIHNlbmRfYXV0aGVudGljYXRpb25fcmVxdWVzdChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggKmNoYWxsZW5nZSwgaW50IGNoYWxsZW5nZV9sZW4pCit7CisJc3RydWN0IGllZWU4MDJfMTFfaGRyIGhlYWRlcjsKKwlzdHJ1Y3QgYXV0aF9ib2R5IGF1dGg7CisJCisJaGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDJfMTFfRlRZUEVfTUdNVCB8IElFRUU4MDJfMTFfU1RZUEVfQVVUSCk7IAorCWhlYWRlci5kdXJhdGlvbl9pZAk9IGNwdV90b19sZTE2KDB4ODAwMCk7CQorCWhlYWRlci5zZXFfY3RsID0gMDsKKwltZW1jcHkoaGVhZGVyLmFkZHIxLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpOworCW1lbWNweShoZWFkZXIuYWRkcjIsIHByaXYtPmRldi0+ZGV2X2FkZHIsIDYpOworCW1lbWNweShoZWFkZXIuYWRkcjMsIHByaXYtPkN1cnJlbnRCU1NJRCwgNik7CisJCisJaWYgKHByaXYtPndlcF9pc19vbikgeworCQlhdXRoLmFsZyA9IGNwdV90b19sZTE2KEM4MDIxMV9NR01UX0FBTl9TSEFSRURLRVkpOyAKKwkJLyogbm8gV0VQIGZvciBhdXRoZW50aWNhdGlvbiBmcmFtZXMgd2l0aCBUclNlcU5vIDEgKi8KKwkJaWYgKHByaXYtPkN1cnJlbnRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0gIT0gMSkKKwkJCWhlYWRlci5mcmFtZV9jdGwgfD0gIGNwdV90b19sZTE2KElFRUU4MDJfMTFfRkNUTF9XRVApOyAKKwl9IGVsc2UgeworCQlhdXRoLmFsZyA9IGNwdV90b19sZTE2KEM4MDIxMV9NR01UX0FBTl9PUEVOU1lTVEVNKTsKKwl9CisKKwlhdXRoLnN0YXR1cyA9IDA7CisJYXV0aC50cmFuc19zZXEgPSBjcHVfdG9fbGUxNihwcml2LT5DdXJyZW50QXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtKTsKKwlwcml2LT5FeHBlY3RlZEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSA9IHByaXYtPkN1cnJlbnRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0rMTsgCisJcHJpdi0+Q3VycmVudEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSArPSAyOworCQorCWlmIChjaGFsbGVuZ2VfbGVuICE9IDApCXsKKwkJYXV0aC5lbF9pZCA9IDE2OyAvKiBjaGFsbGVuZ2VfdGV4dCAqLworCQlhdXRoLmNoYWxsX3RleHRfbGVuID0gY2hhbGxlbmdlX2xlbjsKKwkJbWVtY3B5KGF1dGguY2hhbGxfdGV4dCwgY2hhbGxlbmdlLCBjaGFsbGVuZ2VfbGVuKTsKKwkJYXRtZWxfdHJhbnNtaXRfbWFuYWdlbWVudF9mcmFtZShwcml2LCAmaGVhZGVyLCAodTggKikmYXV0aCwgOCArIGNoYWxsZW5nZV9sZW4pOworCX0gZWxzZSB7CisJCWF0bWVsX3RyYW5zbWl0X21hbmFnZW1lbnRfZnJhbWUocHJpdiwgJmhlYWRlciwgKHU4ICopJmF1dGgsIDYpOworCX0KK30KKworc3RhdGljIHZvaWQgc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgaXNfcmVhc3NvYykKK3sKKwl1OCAqc3NpZF9lbF9wOworCWludCBib2R5c2l6ZTsKKwlzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgaGVhZGVyOworCXN0cnVjdCBhc3NfcmVxX2Zvcm1hdCB7CisJCXUxNiBjYXBhYmlsaXR5OworCQl1MTYgbGlzdGVuX2ludGVydmFsOyAKKwkJdTggYXBbNl07IC8qIG5vdGhpbmcgYWZ0ZXIgaGVyZSBkaXJlY3RseSBhY2Nlc3NpYmxlICovCisJCXU4IHNzaWRfZWxfaWQ7CisJCXU4IHNzaWRfbGVuOworCQl1OCBzc2lkW01BWF9TU0lEX0xFTkdUSF07CisJCXU4IHN1cF9yYXRlc19lbF9pZDsKKwkJdTggc3VwX3JhdGVzX2xlbjsKKwkJdTggcmF0ZXNbNF07CisJfSBib2R5OworCQkKKwloZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMl8xMV9GVFlQRV9NR01UIHwgCisJCShpc19yZWFzc29jID8gSUVFRTgwMl8xMV9TVFlQRV9SRUFTU09DX1JFUSA6IElFRUU4MDJfMTFfU1RZUEVfQVNTT0NfUkVRKSk7CisJaGVhZGVyLmR1cmF0aW9uX2lkID0gY3B1X3RvX2xlMTYoMHg4MDAwKTsKKwloZWFkZXIuc2VxX2N0bCA9IDA7CisKKwltZW1jcHkoaGVhZGVyLmFkZHIxLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpOyAKKwltZW1jcHkoaGVhZGVyLmFkZHIyLCBwcml2LT5kZXYtPmRldl9hZGRyLCA2KTsKKwltZW1jcHkoaGVhZGVyLmFkZHIzLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpOyAKKworCWJvZHkuY2FwYWJpbGl0eSA9IGNwdV90b19sZTE2KEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfRVNTKTsKKwlpZiAocHJpdi0+d2VwX2lzX29uKQorCQlib2R5LmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoQzgwMjExX01HTVRfQ0FQQUJJTElUWV9Qcml2YWN5KTsKKwlpZiAocHJpdi0+cHJlYW1ibGUgPT0gU0hPUlRfUFJFQU1CTEUpCisJCWJvZHkuY2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihDODAyMTFfTUdNVF9DQVBBQklMSVRZX1Nob3J0UHJlYW1ibGUpOworCisJYm9keS5saXN0ZW5faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihwcml2LT5saXN0ZW5faW50ZXJ2YWwgKiBwcml2LT5iZWFjb25fcGVyaW9kKTsKKwkKKwkvKiBjdXJyZW50IEFQIGFkZHJlc3MgLSBvbmx5IGluIHJlYXNzb2MgZnJhbWUgKi8KKwlpZiAoaXNfcmVhc3NvYykgeworCQltZW1jcHkoYm9keS5hcCwgIHByaXYtPkN1cnJlbnRCU1NJRCwgNik7CisJCXNzaWRfZWxfcCA9ICh1OCAqKSZib2R5LnNzaWRfZWxfaWQ7CisJCWJvZHlzaXplID0gMTggKyBwcml2LT5TU0lEX3NpemU7CisJfSBlbHNlIHsKKwkJc3NpZF9lbF9wID0gKHU4ICopJmJvZHkuYXBbMF07CisJCWJvZHlzaXplID0gMTIgKyBwcml2LT5TU0lEX3NpemU7CisJfQorCQkKKwlzc2lkX2VsX3BbMF09IEM4MDIxMV9NR01UX0VsZW1lbnRJRF9TU0lEOworCXNzaWRfZWxfcFsxXSA9IHByaXYtPlNTSURfc2l6ZTsKKwltZW1jcHkoc3NpZF9lbF9wICsgMiwgcHJpdi0+U1NJRCwgcHJpdi0+U1NJRF9zaXplKTsKKwlzc2lkX2VsX3BbMiArIHByaXYtPlNTSURfc2l6ZV0gPSBDODAyMTFfTUdNVF9FbGVtZW50SURfU3VwcG9ydGVkUmF0ZXM7CisJc3NpZF9lbF9wWzMgKyBwcml2LT5TU0lEX3NpemVdID0gNDsgLyogbGVuIG9mIHN1cG9ydGVkIHJhdGVzICovCisJbWVtY3B5KHNzaWRfZWxfcCArIDQgKyBwcml2LT5TU0lEX3NpemUsIGF0bWVsX2Jhc2ljX3JhdGVzLCA0KTsKKworCWF0bWVsX3RyYW5zbWl0X21hbmFnZW1lbnRfZnJhbWUocHJpdiwgJmhlYWRlciwgKHZvaWQgKikmYm9keSwgYm9keXNpemUpOworfQorCitzdGF0aWMgaW50IGlzX2ZyYW1lX2Zyb21fY3VycmVudF9ic3Moc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBpZWVlODAyXzExX2hkciAqaGVhZGVyKQoreworCWlmIChsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCkgJiBJRUVFODAyXzExX0ZDVExfRlJPTURTKQorCQlyZXR1cm4gbWVtY21wKGhlYWRlci0+YWRkcjMsIHByaXYtPkN1cnJlbnRCU1NJRCwgNikgPT0gMDsKKwllbHNlCisJCXJldHVybiBtZW1jbXAoaGVhZGVyLT5hZGRyMiwgcHJpdi0+Q3VycmVudEJTU0lELCA2KSA9PSAwOworfQorCitzdGF0aWMgaW50IHJldHJpZXZlX2JzcyhzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgaTsKKwlpbnQgbWF4X3Jzc2kgPSAtMTI4OworCWludCBtYXhfaW5kZXggPSAtMTsKKwkKKwlpZiAocHJpdi0+QlNTX2xpc3RfZW50cmllcyA9PSAwKQorCQlyZXR1cm4gLTE7CisJCQkKKwlpZiAocHJpdi0+Y29ubmVjdF90b19hbnlfQlNTKSB7CisJCS8qIFNlbGVjdCBhIEJTUyB3aXRoIHRoZSBtYXgtUlNTSSBidXQgb2YgdGhlIHNhbWUgdHlwZSBhbmQgb2YgdGhlIHNhbWUgV0VQIG1vZGUKKwkJICAgYW5kIHRoYXQgaXQgaXMgbm90IG1hcmtlZCBhcyAnYmFkJyAoaS5lLiB3ZSBoYWQgcHJldmlvdXNseSBmYWlsZWQgdG8gY29ubmVjdCB0bworCQkgICB0aGlzIEJTUyB3aXRoIHRoZSBzZXR0aW5ncyB0aGF0IHdlIGN1cnJlbnRseSB1c2UpICovCisJCXByaXYtPmN1cnJlbnRfQlNTID0gMDsKKwkJZm9yKGk9MDsgaTxwcml2LT5CU1NfbGlzdF9lbnRyaWVzOyBpKyspIHsgCisJCQlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gcHJpdi0+QlNTaW5mb1tpXS5CU1N0eXBlICYmCisJCQkgICAgKCghcHJpdi0+d2VwX2lzX29uICYmICFwcml2LT5CU1NpbmZvW2ldLlVzaW5nV0VQKSB8fCAKKwkJCSAgICAgKHByaXYtPndlcF9pc19vbiAmJiBwcml2LT5CU1NpbmZvW2ldLlVzaW5nV0VQKSkgJiYKKwkJCSAgICAhKHByaXYtPkJTU2luZm9baV0uY2hhbm5lbCAmIDB4ODApKSB7CisJCQkJbWF4X3Jzc2kgPSBwcml2LT5CU1NpbmZvW2ldLlJTU0k7CisJCQkJcHJpdi0+Y3VycmVudF9CU1MgPSBtYXhfaW5kZXggPSBpOworCQkJfQorCQkJCisJCX0KKwkJcmV0dXJuIG1heF9pbmRleDsKKwl9CisJCQorCWZvcihpPTA7IGk8cHJpdi0+QlNTX2xpc3RfZW50cmllczsgaSsrKSB7CisJCWlmIChwcml2LT5TU0lEX3NpemUgPT0gcHJpdi0+QlNTaW5mb1tpXS5TU0lEc2l6ZSAmJgorCQkgICAgbWVtY21wKHByaXYtPlNTSUQsIHByaXYtPkJTU2luZm9baV0uU1NJRCwgcHJpdi0+U1NJRF9zaXplKSA9PSAwICYmCisJCSAgICBwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBwcml2LT5CU1NpbmZvW2ldLkJTU3R5cGUgJiYKKwkJICAgIGF0bWVsX3ZhbGlkYXRlX2NoYW5uZWwocHJpdiwgcHJpdi0+QlNTaW5mb1tpXS5jaGFubmVsKSA9PSAwKSB7CisJCQlpZiAocHJpdi0+QlNTaW5mb1tpXS5SU1NJID49IG1heF9yc3NpKSB7CisJCQkJbWF4X3Jzc2kgPSBwcml2LT5CU1NpbmZvW2ldLlJTU0k7CisJCQkJbWF4X2luZGV4ID0gaTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gbWF4X2luZGV4OworfQorCisKK3N0YXRpYyB2b2lkIHN0b3JlX2Jzc19pbmZvKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgKmhlYWRlciwKKwkJCSAgIHUxNiBjYXBhYmlsaXR5LCB1MTYgYmVhY29uX3BlcmlvZCwgdTggY2hhbm5lbCwgdTggcnNzaSwgCisJCQkgICB1OCBzc2lkX2xlbiwgdTggKnNzaWQsIGludCBpc19iZWFjb24pCit7CisJdTggKmJzcyA9IGNhcGFiaWxpdHkgJiBDODAyMTFfTUdNVF9DQVBBQklMSVRZX0VTUyA/IGhlYWRlci0+YWRkcjIgOiBoZWFkZXItPmFkZHIzOworCWludCBpLCBpbmRleDsKKwkJCisJZm9yIChpbmRleCA9IC0xLCBpID0gMDsgaSA8IHByaXYtPkJTU19saXN0X2VudHJpZXM7IGkrKykgCisJCWlmIChtZW1jbXAoYnNzLCBwcml2LT5CU1NpbmZvW2ldLkJTU0lELCA2KSA9PSAwKSAKKwkJCWluZGV4ID0gaTsKKworICAgICAgICAvKiBJZiB3ZSBwcm9jZXNzIGEgcHJvYmUgYW5kIGFuIGVudHJ5IGZyb20gdGhpcyBCU1MgZXhpc3RzIAorCSAgIHdlIHdpbGwgdXBkYXRlIHRoZSBCU1MgZW50cnkgd2l0aCB0aGUgaW5mbyBmcm9tIHRoaXMgQlNTLgorCSAgIElmIHdlIHByb2Nlc3MgYSBiZWFjb24gd2Ugd2lsbCBvbmx5IHVwZGF0ZSBSU1NJICovCisKKwlpZiAoaW5kZXggPT0gLTEpIHsKKwkJaWYgKHByaXYtPkJTU19saXN0X2VudHJpZXMgPT0gTUFYX0JTU19FTlRSSUVTKQorCQkJcmV0dXJuOworCQlpbmRleCA9IHByaXYtPkJTU19saXN0X2VudHJpZXMrKzsKKwkJbWVtY3B5KHByaXYtPkJTU2luZm9baW5kZXhdLkJTU0lELCBic3MsIDYpOworCQlwcml2LT5CU1NpbmZvW2luZGV4XS5SU1NJID0gcnNzaTsKKwl9IGVsc2UgeworCQlpZiAocnNzaSA+IHByaXYtPkJTU2luZm9baW5kZXhdLlJTU0kpCisJCQlwcml2LT5CU1NpbmZvW2luZGV4XS5SU1NJID0gcnNzaTsKKwkJaWYgKGlzX2JlYWNvbikKKwkJCXJldHVybjsKKwl9CisKKwlwcml2LT5CU1NpbmZvW2luZGV4XS5jaGFubmVsID0gY2hhbm5lbDsKKwlwcml2LT5CU1NpbmZvW2luZGV4XS5iZWFjb25fcGVyaW9kID0gYmVhY29uX3BlcmlvZDsKKwlwcml2LT5CU1NpbmZvW2luZGV4XS5Vc2luZ1dFUCA9IGNhcGFiaWxpdHkgJiBDODAyMTFfTUdNVF9DQVBBQklMSVRZX1ByaXZhY3k7CisJbWVtY3B5KHByaXYtPkJTU2luZm9baW5kZXhdLlNTSUQsIHNzaWQsIHNzaWRfbGVuKTsKKwlwcml2LT5CU1NpbmZvW2luZGV4XS5TU0lEc2l6ZSA9IHNzaWRfbGVuOworCisJaWYgKGNhcGFiaWxpdHkgJiBDODAyMTFfTUdNVF9DQVBBQklMSVRZX0lCU1MpCisJCXByaXYtPkJTU2luZm9baW5kZXhdLkJTU3R5cGUgPSBJV19NT0RFX0FESE9DOworCWVsc2UgaWYgKGNhcGFiaWxpdHkgJiBDODAyMTFfTUdNVF9DQVBBQklMSVRZX0VTUykKKwkJcHJpdi0+QlNTaW5mb1tpbmRleF0uQlNTdHlwZSA9SVdfTU9ERV9JTkZSQTsKKwkKKwlwcml2LT5CU1NpbmZvW2luZGV4XS5wcmVhbWJsZSA9IGNhcGFiaWxpdHkgICYgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9TaG9ydFByZWFtYmxlID8gCisJCVNIT1JUX1BSRUFNQkxFIDogTE9OR19QUkVBTUJMRTsKK30KKworc3RhdGljIHZvaWQgYXV0aGVudGljYXRlKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgZnJhbWVfbGVuKQoreworCXN0cnVjdCBhdXRoX2JvZHkgKmF1dGggPSAoc3RydWN0IGF1dGhfYm9keSAqKXByaXYtPnJ4X2J1ZjsKKwl1MTYgc3RhdHVzID0gbGUxNl90b19jcHUoYXV0aC0+c3RhdHVzKTsKKwl1MTYgdHJhbnNfc2VxX25vID0gbGUxNl90b19jcHUoYXV0aC0+dHJhbnNfc2VxKTsKKwkKKwlpZiAoc3RhdHVzID09IEM4MDIxMV9NR01UX1NDX1N1Y2Nlc3MgJiYgIXByaXYtPndlcF9pc19vbikgeyAKKwkJLyogbm8gV0VQICovCisJCWlmIChwcml2LT5zdGF0aW9uX3dhc19hc3NvY2lhdGVkKSB7CisJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX1JFQVNTT0NJQVRJTkcpOworCQkJc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYsIDEpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9BU1NPQ0lBVElORyk7CisJCQlzZW5kX2Fzc29jaWF0aW9uX3JlcXVlc3QocHJpdiwgMCk7CisJCQlyZXR1cm47CisJCX0gCisJfQorCQkKKwlpZiAoc3RhdHVzID09IEM4MDIxMV9NR01UX1NDX1N1Y2Nlc3MgJiYgcHJpdi0+d2VwX2lzX29uKSB7IAorCQkvKiBXRVAgKi8KKwkJaWYgKHRyYW5zX3NlcV9ubyAhPSBwcml2LT5FeHBlY3RlZEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSkKKwkJCXJldHVybjsKKwkJCQkKKwkJaWYgKHRyYW5zX3NlcV9ubyA9PSAweDAwMDIgJiYKKwkJICAgIGF1dGgtPmVsX2lkID09IEM4MDIxMV9NR01UX0VsZW1lbnRJRF9DaGFsbGVuZ2VUZXh0KSB7CisJCQlzZW5kX2F1dGhlbnRpY2F0aW9uX3JlcXVlc3QocHJpdiwgYXV0aC0+Y2hhbGxfdGV4dCwgYXV0aC0+Y2hhbGxfdGV4dF9sZW4pOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAodHJhbnNfc2VxX25vID09IDB4MDAwNCkgeworCQkJaWYocHJpdi0+c3RhdGlvbl93YXNfYXNzb2NpYXRlZCkgeworCQkJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfUkVBU1NPQ0lBVElORyk7CisJCQkJc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYsIDEpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9BU1NPQ0lBVElORyk7CisJCQkJc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYsIDApOworCQkJCXJldHVybjsKKwkJCX0gCisJCX0KKwl9CQkJCisJCisJaWYgKHN0YXR1cyA9PSBDODAyMTFfTUdNVF9TQ19BdXRoQWxnTm90U3VwcG9ydGVkICYmIHByaXYtPmNvbm5lY3RfdG9fYW55X0JTUykgeworCQlpbnQgYnNzX2luZGV4OworCQkKKwkJcHJpdi0+QlNTaW5mb1soaW50KShwcml2LT5jdXJyZW50X0JTUyldLmNoYW5uZWwgfD0gMHg4MDsKKwkJCisJCWlmICgoYnNzX2luZGV4ICA9IHJldHJpZXZlX2Jzcyhwcml2KSkgIT0gLTEpIHsKKwkJCWF0bWVsX2pvaW5fYnNzKHByaXYsIGJzc19pbmRleCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJCisJCisJcHJpdi0+QXV0aGVudGljYXRpb25SZXF1ZXN0UmV0cnlDbnQgPSAwOworCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsICBTVEFUSU9OX1NUQVRFX01HTVRfRVJST1IpOworCXByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGFzc29jaWF0ZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IGZyYW1lX2xlbiwgdTE2IHN1YnR5cGUpCit7CisJc3RydWN0IGFzc19yZXNwX2Zvcm1hdCB7CisJCXUxNiBjYXBhYmlsaXR5OworCQl1MTYgc3RhdHVzOworCQl1MTYgYXNzX2lkOworCQl1OCBlbF9pZDsKKwkJdTggbGVuZ3RoOworCQl1OCByYXRlc1s0XTsKKwl9ICphc3NfcmVzcCA9IChzdHJ1Y3QgYXNzX3Jlc3BfZm9ybWF0ICopcHJpdi0+cnhfYnVmOworCQorICAgICAgIAl1MTYgc3RhdHVzID0gbGUxNl90b19jcHUoYXNzX3Jlc3AtPnN0YXR1cyk7CisJdTE2IGFzc19pZCA9IGxlMTZfdG9fY3B1KGFzc19yZXNwLT5hc3NfaWQpOworICAgCXUxNiByYXRlc19sZW4gPSBhc3NfcmVzcC0+bGVuZ3RoID4gNCA/IDQgOiBhc3NfcmVzcC0+bGVuZ3RoOworCQorCWlmIChmcmFtZV9sZW4gPCA4ICsgcmF0ZXNfbGVuKQorCQlyZXR1cm47CisJCisJaWYgKHN0YXR1cyA9PSBDODAyMTFfTUdNVF9TQ19TdWNjZXNzKSB7CisJCWlmIChzdWJ0eXBlID09IEM4MDIxMV9TVUJUWVBFX01HTVRfQVNTX1JFU1BPTlNFKQorCQkJcHJpdi0+QXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQgPSAwOworCQllbHNlCisJCQlwcml2LT5SZUFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250ID0gMDsKKwkJCisJCWF0bWVsX3NldF9taWIxNihwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX1NUQVRJT05fSURfUE9TLCBhc3NfaWQgJiAweDNmZmYpOworCQlhdG1lbF9zZXRfbWliKHByaXYsIFBoeV9NaWJfVHlwZSwgUEhZX01JQl9SQVRFX1NFVF9QT1MsIGFzc19yZXNwLT5yYXRlcywgcmF0ZXNfbGVuKTsKKwkJaWYgKHByaXYtPnBvd2VyX21vZGUgPT0gMCkgeworCQkJcHJpdi0+bGlzdGVuX2ludGVydmFsID0gMTsKKwkJCWF0bWVsX3NldF9taWI4KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfUFNfTU9ERV9QT1MsICBBQ1RJVkVfTU9ERSk7CisJCQlhdG1lbF9zZXRfbWliMTYocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9MSVNURU5fSU5URVJWQUxfUE9TLCAxKTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPmxpc3Rlbl9pbnRlcnZhbCA9IDI7CisJCQlhdG1lbF9zZXRfbWliOChwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX1BTX01PREVfUE9TLCAgUFNfTU9ERSk7CisJCQlhdG1lbF9zZXRfbWliMTYocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9MSVNURU5fSU5URVJWQUxfUE9TLCAyKTsKKwkJfQorCQkKKwkJcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMTsKKwkJcHJpdi0+c3RhdGlvbl93YXNfYXNzb2NpYXRlZCA9IDE7CisJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfUkVBRFkpOworCQlyZXR1cm47CisJfQorCQorCWlmIChzdWJ0eXBlID09IEM4MDIxMV9TVUJUWVBFX01HTVRfQVNTX1JFU1BPTlNFICYmCisJICAgIHN0YXR1cyAhPSBDODAyMTFfTUdNVF9TQ19Bc3NEZW5pZWRCU1NSYXRlICYmCisJICAgIHN0YXR1cyAhPSBDODAyMTFfTUdNVF9TQ19TdXBwb3J0Q2FwYWJpbGl0aWVzICYmCisJICAgIHByaXYtPkFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250IDwgTUFYX0FTU09DSUFUSU9OX1JFVFJJRVMpIHsKKwkJbW9kX3RpbWVyKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyLCBqaWZmaWVzICsgTUdNVF9KSUZGSUVTKTsKKwkJcHJpdi0+QXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQrKzsKKwkJc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYsIDApOworCQlyZXR1cm47CisJfQorCQkKKwlpZiAoc3VidHlwZSA9PSBDODAyMTFfU1VCVFlQRV9NR01UX1JFQVNTX1JFU1BPTlNFICYmCisJICAgIHN0YXR1cyAhPSBDODAyMTFfTUdNVF9TQ19Bc3NEZW5pZWRCU1NSYXRlICYmCisJICAgIHN0YXR1cyAhPSBDODAyMTFfTUdNVF9TQ19TdXBwb3J0Q2FwYWJpbGl0aWVzICYmCisJICAgIHByaXYtPkFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250IDwgTUFYX0FTU09DSUFUSU9OX1JFVFJJRVMpIHsKKwkJbW9kX3RpbWVyKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyLCBqaWZmaWVzICsgTUdNVF9KSUZGSUVTKTsKKwkJcHJpdi0+UmVBc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCsrOworCQlzZW5kX2Fzc29jaWF0aW9uX3JlcXVlc3QocHJpdiwgMSk7CisJCXJldHVybjsKKwl9CisJCisJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgIFNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUik7CisJcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKwkKKwlpZihwcml2LT5jb25uZWN0X3RvX2FueV9CU1MpIHsKKwkJaW50IGJzc19pbmRleDsKKwkJcHJpdi0+QlNTaW5mb1soaW50KShwcml2LT5jdXJyZW50X0JTUyldLmNoYW5uZWwgfD0gMHg4MDsKKwkJCisJCWlmICgoYnNzX2luZGV4ID0gcmV0cmlldmVfYnNzKHByaXYpKSAhPSAtMSkgCisJCQlhdG1lbF9qb2luX2Jzcyhwcml2LCBic3NfaW5kZXgpOworCQkKKwl9Cit9CisKK3ZvaWQgYXRtZWxfam9pbl9ic3Moc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBic3NfaW5kZXgpCit7CisJc3RydWN0IGJzc19pbmZvICpic3MgPSAgJnByaXYtPkJTU2luZm9bYnNzX2luZGV4XTsKKworCW1lbWNweShwcml2LT5DdXJyZW50QlNTSUQsIGJzcy0+QlNTSUQsIDYpOworCW1lbWNweShwcml2LT5TU0lELCBic3MtPlNTSUQsIHByaXYtPlNTSURfc2l6ZSA9IGJzcy0+U1NJRHNpemUpOworCisJLyogVGhlIFdQQSBzdHVmZiBjYXJlcyBhYm91dCB0aGUgY3VycmVudCBBUCBhZGRyZXNzICovCisJaWYgKHByaXYtPnVzZV93cGEpCisJCWJ1aWxkX3dwYV9taWIocHJpdik7CisJCisJLyogV2hlbiBzd2l0Y2hpbmcgdG8gQWRIb2MgdHVybiBPRkYgUG93ZXIgU2F2ZSBpZiBuZWVkZWQgKi8KKworCWlmIChic3MtPkJTU3R5cGUgPT0gSVdfTU9ERV9BREhPQyAmJgorCSAgICBwcml2LT5vcGVyYXRpbmdfbW9kZSAhPSBJV19NT0RFX0FESE9DICYmCisJICAgIHByaXYtPnBvd2VyX21vZGUpIHsKKwkJcHJpdi0+cG93ZXJfbW9kZSA9IDA7CisJCXByaXYtPmxpc3Rlbl9pbnRlcnZhbCA9IDE7CisJCWF0bWVsX3NldF9taWI4KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfUFNfTU9ERV9QT1MsICBBQ1RJVkVfTU9ERSk7CisJCWF0bWVsX3NldF9taWIxNihwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX0xJU1RFTl9JTlRFUlZBTF9QT1MsIDEpOworCX0KKwkJCisJcHJpdi0+b3BlcmF0aW5nX21vZGUgPSBic3MtPkJTU3R5cGU7CisJcHJpdi0+Y2hhbm5lbCA9IGJzcy0+Y2hhbm5lbCAmIDB4N2Y7IAkKKwlwcml2LT5iZWFjb25fcGVyaW9kID0gYnNzLT5iZWFjb25fcGVyaW9kOworCQorCWlmIChwcml2LT5wcmVhbWJsZSAhPSBic3MtPnByZWFtYmxlKSB7CisJCXByaXYtPnByZWFtYmxlID0gYnNzLT5wcmVhbWJsZTsKKwkJYXRtZWxfc2V0X21pYjgocHJpdiwgTG9jYWxfTWliX1R5cGUsIExPQ0FMX01JQl9QUkVBTUJMRV9UWVBFLCBic3MtPnByZWFtYmxlKTsKKwl9CisJCisJaWYgKCFwcml2LT53ZXBfaXNfb24gJiYgYnNzLT5Vc2luZ1dFUCkgeworCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX01HTVRfRVJST1IpOworCQlwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAwOworCQlyZXR1cm47CisJfQorCQkKKwlpZiAocHJpdi0+d2VwX2lzX29uICYmICFic3MtPlVzaW5nV0VQKSB7CisJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUik7CisJCXByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDA7CisJCXJldHVybjsKKwl9CisKKwlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX0pPSU5OSU5HKTsKKwkKKwlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9JTkZSQSkKKwkJam9pbihwcml2LCBCU1NfVFlQRV9JTkZSQVNUUlVDVFVSRSk7CisJZWxzZSAKKwkJam9pbihwcml2LCBCU1NfVFlQRV9BRF9IT0MpOworfQorCisKK3N0YXRpYyB2b2lkIHJlc3RhcnRfc2VhcmNoKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCWludCBic3NfaW5kZXg7CisJCisJaWYgKCFwcml2LT5jb25uZWN0X3RvX2FueV9CU1MpIHsKKwkJYXRtZWxfc2Nhbihwcml2LCAxKTsKKwl9IGVsc2UgeworCQlwcml2LT5CU1NpbmZvWyhpbnQpKHByaXYtPmN1cnJlbnRfQlNTKV0uY2hhbm5lbCB8PSAweDgwOworCQkKKwkJaWYgKChic3NfaW5kZXggPSByZXRyaWV2ZV9ic3MocHJpdikpICE9IC0xKSAKKwkJCWF0bWVsX2pvaW5fYnNzKHByaXYsIGJzc19pbmRleCk7CisJCWVsc2UKKwkJCWF0bWVsX3NjYW4ocHJpdiwgMCk7CisJCQorCX0gCit9CQorCitzdGF0aWMgdm9pZCBzbW9vdGhfcnNzaShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggcnNzaSkKK3sKKwl1OCBvbGQgPSBwcml2LT53c3RhdHMucXVhbC5sZXZlbDsKKwl1OCBtYXhfcnNzaSA9IDQyOyAvKiA1MDItcm1mZC1yZXZkIG1heCBieSBleHBlcmltZW50LCBkZWZhdWx0IGZvciBub3cgKi8KKworCXN3aXRjaCAocHJpdi0+ZmlybXdhcmVfdHlwZSkgeworCQljYXNlIEFUTUVMX0ZXX1RZUEVfNTAyRToKKwkJCW1heF9yc3NpID0gNjM7IC8qIDUwMi1ybWZkLXJldmUgbWF4IGJ5IGV4cGVyaW1lbnQgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcnNzaSA9IHJzc2kgKiAxMDAgLyBtYXhfcnNzaTsKKwlpZigocnNzaSArIG9sZCkgJSAyKQorCQlwcml2LT53c3RhdHMucXVhbC5sZXZlbCA9ICAoKHJzc2kgKyBvbGQpLzIpICsgMTsKKwllbHNlCisJCXByaXYtPndzdGF0cy5xdWFsLmxldmVsID0gICgocnNzaSArIG9sZCkvMik7CQkKKwlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfTEVWRUxfVVBEQVRFRDsKKwlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkICY9IH5JV19RVUFMX0xFVkVMX0lOVkFMSUQ7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX3Ntb290aF9xdWFsKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCXVuc2lnbmVkIGxvbmcgdGltZV9kaWZmID0gKGppZmZpZXMgLSBwcml2LT5sYXN0X3F1YWwpL0haOworCXdoaWxlICh0aW1lX2RpZmYtLSkgeworCQlwcml2LT5sYXN0X3F1YWwgKz0gSFo7CisJCXByaXYtPndzdGF0cy5xdWFsLnF1YWwgPSBwcml2LT53c3RhdHMucXVhbC5xdWFsLzI7CisJCXByaXYtPndzdGF0cy5xdWFsLnF1YWwgKz0gCisJCQlwcml2LT5iZWFjb25zX3RoaXNfc2VjICogcHJpdi0+YmVhY29uX3BlcmlvZCAqIChwcml2LT53c3RhdHMucXVhbC5sZXZlbCArIDEwMCkgLyA0MDAwOworCQlwcml2LT5iZWFjb25zX3RoaXNfc2VjID0gMDsKKwl9CisJcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX1FVQUxfVVBEQVRFRDsKKwlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkICY9IH5JV19RVUFMX1FVQUxfSU5WQUxJRDsKK30KKworLyogZGVhbHMgd2l0aCBpbmNvbWluZyBtYW5hZ21lbnQgZnJhbWVzLiAqLworc3RhdGljIHZvaWQgYXRtZWxfbWFuYWdlbWVudF9mcmFtZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGllZWU4MDJfMTFfaGRyICpoZWFkZXIsIAorCQkgICAgICB1MTYgZnJhbWVfbGVuLCB1OCByc3NpKQoreworCXUxNiBzdWJ0eXBlOworCQorCXN3aXRjaCAoc3VidHlwZSA9IGxlMTZfdG9fY3B1KGhlYWRlci0+ZnJhbWVfY3RsKSAmIElFRUU4MDJfMTFfRkNUTF9TVFlQRSkgeworCWNhc2UgQzgwMjExX1NVQlRZUEVfTUdNVF9CRUFDT04gOgorCWNhc2UgQzgwMjExX1NVQlRZUEVfTUdNVF9Qcm9iZVJlc3BvbnNlOgorCQkKKwkJLyogYmVhY29uIGZyYW1lIGhhcyBtdWx0aXBsZSB2YXJpYWJsZS1sZW5ndGggZmllbGRzIC0KKwkJICAgbmV2ZXIgbGV0IGFuIGVuZ2luZWVyIGxvb3NlIHdpdGggYSBkYXRhIHN0cnVjdHVyZSBkZXNpZ24uICovCisJCXsKKwkJCXN0cnVjdCBiZWFjb25fZm9ybWF0IHsKKwkJCQl1NjQgdGltZXN0YW1wOworCQkJCXUxNiBpbnRlcnZhbDsKKwkJCQl1MTYgY2FwYWJpbGl0eTsKKwkJCQl1OCBzc2lkX2VsX2lkOworCQkJCXU4IHNzaWRfbGVuZ3RoOworCQkJCS8qIHNzaWQgaGVyZSAqLworCQkJCXU4IHJhdGVzX2VsX2lkOworCQkJCXU4IHJhdGVzX2xlbmd0aDsKKwkJCQkvKiByYXRlcyBoZXJlICovCisJCQkJdTggZHNfZWxfaWQ7CisJCQkJdTggZHNfbGVuZ3RoOworCQkJCS8qIGRzIGhlcmUgKi8KKwkJCX0gKmJlYWNvbiA9IChzdHJ1Y3QgYmVhY29uX2Zvcm1hdCAqKXByaXYtPnJ4X2J1ZjsKKwkJCQorCQkJdTggY2hhbm5lbCwgcmF0ZXNfbGVuZ3RoLCBzc2lkX2xlbmd0aDsKKwkJCXU2NCB0aW1lc3RhbXAgPSBsZTY0X3RvX2NwdShiZWFjb24tPnRpbWVzdGFtcCk7CisJCQl1MTYgYmVhY29uX2ludGVydmFsID0gbGUxNl90b19jcHUoYmVhY29uLT5pbnRlcnZhbCk7CisJCQl1MTYgY2FwYWJpbGl0eSA9IGxlMTZfdG9fY3B1KGJlYWNvbi0+Y2FwYWJpbGl0eSk7CisJCQl1OCAqYmVhY29ucCA9IHByaXYtPnJ4X2J1ZjsKKwkJCXNzaWRfbGVuZ3RoID0gYmVhY29uLT5zc2lkX2xlbmd0aDsKKwkJCS8qIHRoaXMgYmxvd3MgY2h1bmtzLiAqLworCQkJaWYgKGZyYW1lX2xlbiA8IDE0IHx8IGZyYW1lX2xlbiA8IHNzaWRfbGVuZ3RoICsgMTUpIAorCQkJCXJldHVybjsKKwkJCXJhdGVzX2xlbmd0aCA9IGJlYWNvbnBbYmVhY29uLT5zc2lkX2xlbmd0aCArIDE1XTsKKwkJCWlmIChmcmFtZV9sZW4gPCBzc2lkX2xlbmd0aCArIHJhdGVzX2xlbmd0aCArIDE4KQorCQkJCXJldHVybjsKKwkJCWlmIChzc2lkX2xlbmd0aCA+ICBNQVhfU1NJRF9MRU5HVEgpCisJCQkJcmV0dXJuOworCQkJY2hhbm5lbCA9IGJlYWNvbnBbc3NpZF9sZW5ndGggKyByYXRlc19sZW5ndGggKyAxOF07CisJCSAgICAgICAKKwkJCWlmIChwcml2LT5zdGF0aW9uX3N0YXRlID09IFNUQVRJT05fU1RBVEVfUkVBRFkpIHsKKwkJCQlzbW9vdGhfcnNzaShwcml2LCByc3NpKTsKKwkJCQlpZiAoaXNfZnJhbWVfZnJvbV9jdXJyZW50X2Jzcyhwcml2LCBoZWFkZXIpKSB7IAorCQkJCQlwcml2LT5iZWFjb25zX3RoaXNfc2VjKys7CisJCQkJCWF0bWVsX3Ntb290aF9xdWFsKHByaXYpOworCQkJCQlpZiAocHJpdi0+bGFzdF9iZWFjb25fdGltZXN0YW1wKSB7CisJCQkJCQkvKiBOb3RlIHRydW5jYXRlIHRoaXMgdG8gMzIgYml0cyAtIGtlcm5lbCBjYW4ndCBkaXZpZGUgYSBsb25nIGxvbmcgKi8KKwkJCQkJCXUzMiBiZWFjb25fZGVsYXkgPSB0aW1lc3RhbXAgLSBwcml2LT5sYXN0X2JlYWNvbl90aW1lc3RhbXA7CisJCQkJCQlpbnQgYmVhY29ucyA9IGJlYWNvbl9kZWxheSAvIChiZWFjb25faW50ZXJ2YWwgKiAxMDAwKTsKKwkJCQkJCWlmIChiZWFjb25zID4gMSkKKwkJCQkJCQlwcml2LT53c3RhdHMubWlzcy5iZWFjb24gKz0gYmVhY29ucyAtIDE7CisJCQkJCX0KKwkJCQkJcHJpdi0+bGFzdF9iZWFjb25fdGltZXN0YW1wID0gdGltZXN0YW1wOworCQkJCQloYW5kbGVfYmVhY29uX3Byb2JlKHByaXYsIGNhcGFiaWxpdHksIGNoYW5uZWwpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgPT0gU1RBVElPTl9TVEFURV9TQ0FOTklORyApIAorCQkJCXN0b3JlX2Jzc19pbmZvKHByaXYsIGhlYWRlciwgY2FwYWJpbGl0eSwgYmVhY29uX2ludGVydmFsLCBjaGFubmVsLAorCQkJCQkgICAgICAgcnNzaSwgc3NpZF9sZW5ndGgsICZiZWFjb24tPnJhdGVzX2VsX2lkLAorCQkJCQkgICAgICAgc3VidHlwZSA9PSBDODAyMTFfU1VCVFlQRV9NR01UX0JFQUNPTikgOworCQl9CisJCWJyZWFrOworCQkKKwljYXNlIEM4MDIxMV9TVUJUWVBFX01HTVRfQXV0aGVudGljYXRpb246CisKKwkJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgPT0gU1RBVElPTl9TVEFURV9BVVRIRU5USUNBVElORykKKwkJCWF1dGhlbnRpY2F0ZShwcml2LCBmcmFtZV9sZW4pOworCQorCQlicmVhazsKKwkJCisJY2FzZSBDODAyMTFfU1VCVFlQRV9NR01UX0FTU19SRVNQT05TRToKKwljYXNlIEM4MDIxMV9TVUJUWVBFX01HTVRfUkVBU1NfUkVTUE9OU0U6CisJCQorCQlpZiAocHJpdi0+c3RhdGlvbl9zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX0FTU09DSUFUSU5HIHx8IAorCQkgICAgcHJpdi0+c3RhdGlvbl9zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX1JFQVNTT0NJQVRJTkcpCisJCQlhc3NvY2lhdGUocHJpdiwgZnJhbWVfbGVuLCBzdWJ0eXBlKTsKKwkJCisJCWJyZWFrOworCisJY2FzZSBDODAyMTFfU1VCVFlQRV9NR01UX0RJU0FTU09TSUFUSU9OOgorCQlpZiAocHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkICYmIAorCQkgICAgcHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9JTkZSQSAmJiAKKwkJICAgIGlzX2ZyYW1lX2Zyb21fY3VycmVudF9ic3MocHJpdiwgaGVhZGVyKSkgeworCQkJcHJpdi0+c3RhdGlvbl93YXNfYXNzb2NpYXRlZCA9IDA7CisJCQlwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAwOworCQkJCisJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX0pPSU5OSU5HKTsKKwkJCWpvaW4ocHJpdiwgQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkUpOworCQl9CisJCQorCQlicmVhazsKKworCWNhc2UgQzgwMjExX1NVQlRZUEVfTUdNVF9EZWF1dGhlbnRpY2F0aW9uOgorCQlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9JTkZSQSAmJgorCQkgICAgaXNfZnJhbWVfZnJvbV9jdXJyZW50X2Jzcyhwcml2LCBoZWFkZXIpKSB7CisJCQlwcml2LT5zdGF0aW9uX3dhc19hc3NvY2lhdGVkID0gMDsKKworCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9KT0lOTklORyk7CisJCQlqb2luKHByaXYsIEJTU19UWVBFX0lORlJBU1RSVUNUVVJFKTsKKwkJfQorCQkKKwkJYnJlYWs7CisJfQorfQorCisvKiBydW4gd2hlbiB0aW1lciBleHBpcmVzICovCitzdGF0aWMgdm9pZCBhdG1lbF9tYW5hZ2VtZW50X3RpbWVyKHVfbG9uZyBhKQoreworICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGE7CisgIHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgCisgIC8qIENoZWNrIGlmIHRoZSBjYXJkIGhhcyBiZWVuIHlhbmtlZC4gKi8KKyAgaWYgKHByaXYtPmNhcmQgJiYgcHJpdi0+cHJlc2VudF9jYWxsYmFjayAmJiAKKyAgICAgICEoKnByaXYtPnByZXNlbnRfY2FsbGJhY2spKHByaXYtPmNhcmQpKQorCSAgcmV0dXJuOworICAKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKKworICBzd2l0Y2ggKHByaXYtPnN0YXRpb25fc3RhdGUpIHsKKwkgIAorICBjYXNlIFNUQVRJT05fU1RBVEVfQVVUSEVOVElDQVRJTkc6CisJICBpZiAocHJpdi0+QXV0aGVudGljYXRpb25SZXF1ZXN0UmV0cnlDbnQgPj0gTUFYX0FVVEhFTlRJQ0FUSU9OX1JFVFJJRVMpIHsKKwkJICBhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX01HTVRfRVJST1IpOworCQkgIHByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDA7CisJCSAgcHJpdi0+QXV0aGVudGljYXRpb25SZXF1ZXN0UmV0cnlDbnQgPSAwOworCQkgIHJlc3RhcnRfc2VhcmNoKHByaXYpOworCSAgfSBlbHNlIHsKKwkJICBwcml2LT5BdXRoZW50aWNhdGlvblJlcXVlc3RSZXRyeUNudCsrOworCQkgIHByaXYtPkN1cnJlbnRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0gPSAweDAwMDE7CisJCSAgbW9kX3RpbWVyKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyLCBqaWZmaWVzICsgTUdNVF9KSUZGSUVTKTsKKwkJICBzZW5kX2F1dGhlbnRpY2F0aW9uX3JlcXVlc3QocHJpdiwgTlVMTCwgMCk7CisJICB9CisJICAKKwkgIGJyZWFrOworCisgIGNhc2UgU1RBVElPTl9TVEFURV9BU1NPQ0lBVElORzoKKwkgIGlmIChwcml2LT5Bc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA9PSBNQVhfQVNTT0NJQVRJT05fUkVUUklFUykgeworCQkgIGF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUik7CisJCSAgcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKwkJICBwcml2LT5Bc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA9IDA7CisJCSAgcmVzdGFydF9zZWFyY2gocHJpdik7CisJICB9IGVsc2UgeworCQkgIHByaXYtPkFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250Kys7CisJCSAgbW9kX3RpbWVyKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyLCBqaWZmaWVzICsgTUdNVF9KSUZGSUVTKTsKKwkJICBzZW5kX2Fzc29jaWF0aW9uX3JlcXVlc3QocHJpdiwgMCk7CisJICB9CisKKwkgIGJyZWFrOworCQkgIAorICBjYXNlIFNUQVRJT05fU1RBVEVfUkVBU1NPQ0lBVElORzoJCisJICBpZiAocHJpdi0+UmVBc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA9PSBNQVhfQVNTT0NJQVRJT05fUkVUUklFUykgeworCQkgIGF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUik7CisJCSAgcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKwkJICBwcml2LT5SZUFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250ID0gMDsKKwkJICByZXN0YXJ0X3NlYXJjaChwcml2KTsKKwkgIH0gZWxzZSB7CisJCSAgcHJpdi0+UmVBc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCsrOworCQkgIG1vZF90aW1lcigmcHJpdi0+bWFuYWdlbWVudF90aW1lciwgamlmZmllcyArIE1HTVRfSklGRklFUyk7CisJCSAgc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYsIDEpOworCSAgfQorCisJICBicmVhazsKKyAgCisgIGRlZmF1bHQ6CisJICBicmVhazsKKyAgfQorICAKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOworfQorICAKK3N0YXRpYyB2b2lkIGF0bWVsX2NvbW1hbmRfaXJxKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCXU4IHN0YXR1cyA9IGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2NvKHByaXYsIENNRF9CTE9DS19TVEFUVVNfT0ZGU0VUKSk7CisJdTggY29tbWFuZCA9IGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2NvKHByaXYsIENNRF9CTE9DS19DT01NQU5EX09GRlNFVCkpOworCWludCBmYXN0X3NjYW47CisJCisJaWYgKHN0YXR1cyA9PSBDTURfU1RBVFVTX0lETEUgfHwgCisJICAgIHN0YXR1cyA9PSBDTURfU1RBVFVTX0lOX1BST0dSRVNTKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGNvbW1hbmQpeworCisJY2FzZSBDTURfU3RhcnQ6CisJCWlmIChzdGF0dXMgPT0gQ01EX1NUQVRVU19DT01QTEVURSkgeworCQkJcHJpdi0+c3RhdGlvbl93YXNfYXNzb2NpYXRlZCA9IHByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZDsKKwkJCWF0bWVsX2dldF9taWIocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9DVVJfQlNTSURfUE9TLAorCQkJCSAgICAgICh1OCAqKXByaXYtPkN1cnJlbnRCU1NJRCwgNik7CisJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX1JFQURZKTsKKwkJfQkJCQorCQlicmVhazsKKwkJCisJY2FzZSBDTURfU2NhbjoKKwkJZmFzdF9zY2FuID0gcHJpdi0+ZmFzdF9zY2FuOworCQlwcml2LT5mYXN0X3NjYW4gPSAwOworCQkKKwkJaWYgKHN0YXR1cyAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKSB7CisJCQlhdG1lbF9zY2FuKHByaXYsIDEpOworCQl9IGVsc2UgeworCQkJaW50IGJzc19pbmRleCA9IHJldHJpZXZlX2Jzcyhwcml2KTsKKwkJCWlmIChic3NfaW5kZXggIT0gLTEpIHsKKwkJCQlhdG1lbF9qb2luX2Jzcyhwcml2LCBic3NfaW5kZXgpOworCQkJfSBlbHNlIGlmIChwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBJV19NT0RFX0FESE9DICYmIAorCQkJCSAgIHByaXYtPlNTSURfc2l6ZSAhPSAwKSB7CisJCQkJc3RhcnQocHJpdiwgQlNTX1RZUEVfQURfSE9DKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpdi0+ZmFzdF9zY2FuID0gIWZhc3Rfc2NhbjsKKwkJCQlhdG1lbF9zY2FuKHByaXYsIDEpOworCQkJfQorCQkJcHJpdi0+c2l0ZV9zdXJ2ZXlfc3RhdGUgPSBTSVRFX1NVUlZFWV9DT01QTEVURUQ7CisJCX0KKwkJYnJlYWs7CisJCQorCWNhc2UgQ01EX1NpdGVTdXJ2ZXk6CisJCXByaXYtPmZhc3Rfc2NhbiA9IDA7CisJCQorCQlpZiAoc3RhdHVzICE9IENNRF9TVEFUVVNfQ09NUExFVEUpCisJCQlyZXR1cm47CisJCQorCQlwcml2LT5zaXRlX3N1cnZleV9zdGF0ZSA9IFNJVEVfU1VSVkVZX0NPTVBMRVRFRDsKKwkJaWYgKHByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCkgeworCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9SRUFEWSk7CQkJCQorCQl9IGVsc2UgeworCQkJYXRtZWxfc2Nhbihwcml2LCAxKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ01EX0pvaW46CisJCWlmIChzdGF0dXMgPT0gQ01EX1NUQVRVU19DT01QTEVURSkgeworCQkJaWYgKHByaXYtPm9wZXJhdGluZ19tb2RlID09IElXX01PREVfQURIT0MpIHsKKwkJCQlwcml2LT5zdGF0aW9uX3dhc19hc3NvY2lhdGVkID0gcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkOworCQkJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfUkVBRFkpOworCQkJfSBlbHNlIHsKKwkJCQlwcml2LT5BdXRoZW50aWNhdGlvblJlcXVlc3RSZXRyeUNudCA9IDA7CisJCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9BVVRIRU5USUNBVElORyk7CisJCQkJCisJCQkJbW9kX3RpbWVyKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyLCBqaWZmaWVzICsgTUdNVF9KSUZGSUVTKTsKKwkJCQlwcml2LT5DdXJyZW50QXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtID0gMHgwMDAxOworCQkJCXNlbmRfYXV0aGVudGljYXRpb25fcmVxdWVzdChwcml2LCBOVUxMLCAwKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQkKKwkJYXRtZWxfc2Nhbihwcml2LCAxKTsKKwkJCisJfQorfQorCitzdGF0aWMgaW50IGF0bWVsX3dha2V1cF9maXJtd2FyZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgaG9zdF9pbmZvX3N0cnVjdCAqaWZhY2UgPSAmcHJpdi0+aG9zdF9pbmZvOworCXUxNiBtcjEsIG1yMzsKKwlpbnQgaTsKKworCWlmIChwcml2LT5jYXJkX3R5cGUgPT0gQ0FSRF9UWVBFX1NQSV9GTEFTSCkKKwkJYXRtZWxfc2V0X2djcihwcml2LT5kZXYsIEdDUl9SRU1BUCk7CisJCisJLyogd2FrZSB1cCBvbi1ib2FyZCBwcm9jZXNzb3IgKi8KKwlhdG1lbF9jbGVhcl9nY3IocHJpdi0+ZGV2LCAweDAwNDApOworCWF0bWVsX3dyaXRlMTYocHJpdi0+ZGV2LCBCU1IsIEJTU19TUkFNKTsKKwkKKwlpZiAocHJpdi0+Y2FyZF90eXBlID09IENBUkRfVFlQRV9TUElfRkxBU0gpCisJCW1kZWxheSgxMDApOworCisJLyogYW5kIHdhaXQgZm9yIGl0ICovCisJZm9yIChpID0gIExPT1BfUkVUUllfTElNSVQ7IGk7IGktLSkgeworCQltcjEgPSBhdG1lbF9yZWFkMTYocHJpdi0+ZGV2LCBNUjEpOworCQltcjMgPSBhdG1lbF9yZWFkMTYocHJpdi0+ZGV2LCBNUjMpOworCQkKKwkJaWYgKG1yMyAmIE1BQ19CT09UX0NPTVBMRVRFKSAKKwkJCWJyZWFrOworCQlpZiAobXIxICYgTUFDX0JPT1RfQ09NUExFVEUgJiYKKwkJICAgIHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDQ0FSRCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBNQUMgZmFpbGVkIHRvIGJvb3QuXG4iLCBwcml2LT5kZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJCQorCWlmICgocHJpdi0+aG9zdF9pbmZvX2Jhc2UgPSBhdG1lbF9yZWFkMTYocHJpdi0+ZGV2LCBNUjIpKSA9PSAweGZmZmYpIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBjYXJkIG1pc3NpbmcuXG4iLCBwcml2LT5kZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJCisJLyogbm93IGNoZWNrIGZvciBjb21wbGV0aW9uIG9mIE1BQyBpbml0aWFsaXphdGlvbiB0aHJvdWdoICAKKwkgICB0aGUgRnVuQ3RybCBmaWVsZCBvZiB0aGUgSUZBQ0UsIHBvbGwgTVIxIHRvIGRldGVjdCBjb21wbGV0aW9uIG9mCSAgCisJICAgTUFDIGluaXRpYWxpemF0aW9uLCBjaGVjayBjb21wbGV0aW9uIHN0YXR1cywgc2V0IGludGVycnVwdCBtYXNrLCAgCisJICAgZW5hYmxlcyBpbnRlcnJ1cHRzIGFuZCBjYWxscyBUeCBhbmQgUnggaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICovICAKKwkKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9GVU5DX0NUUkxfT0ZGU0VUKSwgRlVOQ19DVFJMX0lOSVRfQ09NUExFVEUpOworCQorCWZvciAoaSA9ICBMT09QX1JFVFJZX0xJTUlUOyBpOyBpLS0pIHsKKwkJbXIxID0gYXRtZWxfcmVhZDE2KHByaXYtPmRldiwgTVIxKTsKKwkJbXIzID0gYXRtZWxfcmVhZDE2KHByaXYtPmRldiwgTVIzKTsKKwkJCisJCWlmIChtcjMgJiBNQUNfSU5JVF9DT01QTEVURSkgCisJCQlicmVhazsKKwkJaWYgKG1yMSAmIE1BQ19JTklUX0NPTVBMRVRFICYmCisJCSAgICBwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpCisJCQlicmVhazsKKwl9CisJCisJaWYgKGkgPT0gMCkgeworCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IE1BQyBmYWlsZWQgdG8gaW5pdGlhbGlzZS5cbiIsIHByaXYtPmRldi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBDaGVjayBmb3IgTUFDX0lOSVRfT0sgb25seSBvbiB0aGUgcmVnaXN0ZXIgdGhhdCB0aGUgTUFDX0lOSVRfT0sgd2FzIHNldCAqLworCWlmICgobXIzICYgTUFDX0lOSVRfQ09NUExFVEUpICYmCisJICAgICEoYXRtZWxfcmVhZDE2KHByaXYtPmRldiwgTVIzKSAmIE1BQ19JTklUX09LKSkgeworCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IE1BQyBmYWlsZWQgTVIzIHNlbGYtdGVzdC5cbiIsIHByaXYtPmRldi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoKG1yMSAmIE1BQ19JTklUX0NPTVBMRVRFKSAmJgorCSAgICAhKGF0bWVsX3JlYWQxNihwcml2LT5kZXYsIE1SMSkgJiBNQUNfSU5JVF9PSykpIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBNQUMgZmFpbGVkIE1SMSBzZWxmLXRlc3QuXG4iLCBwcml2LT5kZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCAodW5zaWduZWQgY2hhciAqKWlmYWNlLCAKKwkJCSAgIHByaXYtPmhvc3RfaW5mb19iYXNlLCBzaXplb2YoKmlmYWNlKSk7CisgICAgICAgIAorCWlmYWNlLT50eF9idWZmX3BvcyA9IGxlMTZfdG9fY3B1KGlmYWNlLT50eF9idWZmX3Bvcyk7CisJaWZhY2UtPnR4X2J1ZmZfc2l6ZSA9IGxlMTZfdG9fY3B1KGlmYWNlLT50eF9idWZmX3NpemUpOworCWlmYWNlLT50eF9kZXNjX3BvcyA9IGxlMTZfdG9fY3B1KGlmYWNlLT50eF9kZXNjX3Bvcyk7CisJaWZhY2UtPnR4X2Rlc2NfY291bnQgPSBsZTE2X3RvX2NwdShpZmFjZS0+dHhfZGVzY19jb3VudCk7CisJaWZhY2UtPnJ4X2J1ZmZfcG9zID0gbGUxNl90b19jcHUoaWZhY2UtPnJ4X2J1ZmZfcG9zKTsKKwlpZmFjZS0+cnhfYnVmZl9zaXplID0gbGUxNl90b19jcHUoaWZhY2UtPnJ4X2J1ZmZfc2l6ZSk7CisJaWZhY2UtPnJ4X2Rlc2NfcG9zID0gbGUxNl90b19jcHUoaWZhY2UtPnJ4X2Rlc2NfcG9zKTsKKwlpZmFjZS0+cnhfZGVzY19jb3VudCA9IGxlMTZfdG9fY3B1KGlmYWNlLT5yeF9kZXNjX2NvdW50KTsKKwlpZmFjZS0+YnVpbGRfdmVyc2lvbiA9IGxlMTZfdG9fY3B1KGlmYWNlLT5idWlsZF92ZXJzaW9uKTsKKwlpZmFjZS0+Y29tbWFuZF9wb3MgPSBsZTE2X3RvX2NwdShpZmFjZS0+Y29tbWFuZF9wb3MpOworCWlmYWNlLT5tYWpvcl92ZXJzaW9uID0gbGUxNl90b19jcHUoaWZhY2UtPm1ham9yX3ZlcnNpb24pOworCWlmYWNlLT5taW5vcl92ZXJzaW9uID0gbGUxNl90b19jcHUoaWZhY2UtPm1pbm9yX3ZlcnNpb24pOworCWlmYWNlLT5mdW5jX2N0cmwgPSBsZTE2X3RvX2NwdShpZmFjZS0+ZnVuY19jdHJsKTsKKwlpZmFjZS0+bWFjX3N0YXR1cyA9IGxlMTZfdG9fY3B1KGlmYWNlLT5tYWNfc3RhdHVzKTsKKworCXJldHVybiAxOworfQorCisvKiBkZXRlcm1pbmUgdHlwZSBvZiBtZW1vcnkgYW5kIE1BQyBhZGRyZXNzICovCitzdGF0aWMgaW50IHByb2JlX2F0bWVsX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkgCisJLyogcmVzZXQgcGNjYXJkICovCisJaWYgKHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDQ0FSRCkgCisJCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA2MCk7CisJCisJYXRtZWxfd3JpdGUxNihkZXYsIEdDUiwgMHgwMDQwKTsKKwltZGVsYXkoNTAwKTsKKwkKKwlpZiAoYXRtZWxfcmVhZDE2KGRldiwgTVIyKSA9PSAwKSB7CisJCS8qIE5vIHN0b3JlZCBmaXJtd2FyZSBzbyBsb2FkIGEgc21hbGwgc3R1YiB3aGljaCBqdXN0IAorCQkgICB0ZWxscyB1cyB0aGUgTUFDIGFkZHJlc3MgKi8KKwkJaW50IGk7CisJCXByaXYtPmNhcmRfdHlwZSA9IENBUkRfVFlQRV9FRVBST007CisJCWF0bWVsX3dyaXRlMTYoZGV2LCBCU1IsIEJTU19JUkFNKTsKKwkJYXRtZWxfY29weV90b19jYXJkKGRldiwgMCwgbWFjX3JlYWRlciwgc2l6ZW9mKG1hY19yZWFkZXIpKTsKKwkJYXRtZWxfc2V0X2djcihkZXYsIEdDUl9SRU1BUCk7CisJCWF0bWVsX2NsZWFyX2djcihwcml2LT5kZXYsIDB4MDA0MCk7CisJCWF0bWVsX3dyaXRlMTYoZGV2LCBCU1IsIEJTU19TUkFNKTsKKwkJZm9yIChpID0gIExPT1BfUkVUUllfTElNSVQ7IGk7IGktLSkgCisJCQlpZiAoYXRtZWxfcmVhZDE2KGRldiwgTVIzKSAmIE1BQ19CT09UX0NPTVBMRVRFKQorCQkJCWJyZWFrOworCQlpZiAoaSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IE1BQyBmYWlsZWQgdG8gYm9vdCBNQUMgYWRkcmVzcyByZWFkZXIuXG4iLCBkZXYtPm5hbWUpOworCQl9IGVsc2UgeworCQkJYXRtZWxfY29weV90b19ob3N0KGRldiwgZGV2LT5kZXZfYWRkciwgYXRtZWxfcmVhZDE2KGRldiwgTVIyKSwgNik7CisJCQkvKiBnb3QgYWRkcmVzcywgbm93IHNxdWFzaCBpdCBhZ2FpbiB1bnRpbCB0aGUgbmV0d29yaworCQkJICAgaW50ZXJmYWNlIGlzIG9wZW5lZCAqLworCQkJaWYgKHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDQ0FSRCkgCisJCQkJYXRtZWxfd3JpdGUxNihkZXYsIEdDUiwgMHgwMDYwKTsKKwkJCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA0MCk7CisJCQlyYyA9IDE7CisJCX0KKwl9IGVsc2UgaWYgKGF0bWVsX3JlYWQxNihkZXYsIE1SNCkgPT0gMCkgeworCQkvKiBNYWMgYWRkcmVzcyBlYXN5IGluIHRoaXMgY2FzZS4gKi8KKwkJcHJpdi0+Y2FyZF90eXBlID0gQ0FSRF9UWVBFX1BBUkFMTEVMX0ZMQVNIOworCQlhdG1lbF93cml0ZTE2KGRldiwgIEJTUiwgMSk7CQorCQlhdG1lbF9jb3B5X3RvX2hvc3QoZGV2LCBkZXYtPmRldl9hZGRyLCAweGMwMDAsIDYpOworCQlhdG1lbF93cml0ZTE2KGRldiwgIEJTUiwgMHgyMDApOworCQlyYyA9IDE7CisJfSBlbHNlIHsKKwkJLyogU3RhbmRhcmQgZmlybXdhcmUgaW4gZmxhc2gsIGJvb3QgaXQgdXAgYW5kIGFzaworCQkgICBmb3IgdGhlIE1hYyBBZGRyZXNzICovCisJCXByaXYtPmNhcmRfdHlwZSA9IENBUkRfVFlQRV9TUElfRkxBU0g7CisJCWlmIChhdG1lbF93YWtldXBfZmlybXdhcmUocHJpdikpIHsKKwkJCWF0bWVsX2dldF9taWIocHJpdiwgTWFjX0FkZHJlc3NfTWliX1R5cGUsIDAsIGRldi0+ZGV2X2FkZHIsIDYpOworCQkJCisJCQkvKiBnb3QgYWRkcmVzcywgbm93IHNxdWFzaCBpdCBhZ2FpbiB1bnRpbCB0aGUgbmV0d29yaworCQkJICAgaW50ZXJmYWNlIGlzIG9wZW5lZCAqLworCQkJaWYgKHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDQ0FSRCkgCisJCQkJYXRtZWxfd3JpdGUxNihkZXYsIEdDUiwgMHgwMDYwKTsKKwkJCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA0MCk7CisJCQlyYyA9IDE7CisJCX0KKwl9CisJCisJaWYgKHJjKSB7CisJCWlmIChkZXYtPmRldl9hZGRyWzBdID09IDB4RkYpIHsKKwkJCXU4IGRlZmF1bHRfbWFjW10gPSB7MHgwMCwweDA0LCAweDI1LCAweDAwLCAweDAwLCAweDAwfTsKKwkJCXByaW50ayhLRVJOX0FMRVJUICIlczogKioqIEludmFsaWQgTUFDIGFkZHJlc3MuIFVQR1JBREUgRmlybXdhcmUgKioqKlxuIiwgZGV2LT5uYW1lKTsKKwkJCW1lbWNweShkZXYtPmRldl9hZGRyLCBkZWZhdWx0X21hYywgNik7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1BQyBhZGRyZXNzICUuMng6JS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLAorCQkgICAgICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkJICAgICAgIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0gKTsKKwkJCisJfQorCQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfd2VwX21pYihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKKy8qIE1vdmUgdGhlIGVuY3lwdGlvbiBpbmZvcm1hdGlvbiBvbiB0aGUgTUlCIHN0cnVjdHVyZS4KKyAgIFRoaXMgcm91dGluZSBpcyBmb3IgdGhlIHByZS1XUEEgZmlybXdhcmU6IGxhdGVyIGZpcm13YXJlIGhhcworICAgYSBkaWZmZXJlbnQgZm9ybWF0IE1JQiBhbmQgYSBkaWZmZXJlbnQgcm91dGluZS4gKi8KK3sKKwlzdHJ1Y3QgeyAvKiBOQiB0aGlzIGlzIG1hdGNoZWQgdG8gdGhlIGhhcmR3YXJlLCBkb24ndCBjaGFuZ2UuICovCisJCXU4IHdlcF9pc19vbjsgICAgICAgICAgICAgICAgIAorCQl1OCBkZWZhdWx0X2tleTsgLyogMC4uMyAqLworCQl1OCByZXNlcnZlZDsKKwkJdTggZXhjbHVkZV91bmVuY3J5cHRlZDsKKwkJCisJCXUzMiBXRVBJQ1ZfZXJyb3JfY291bnQ7CisJCXUzMiBXRVBfZXhjbHVkZWRfY291bnQ7CisJCQorCQl1OCB3ZXBfa2V5c1tNQVhfRU5DUllQVElPTl9LRVlTXVsxM107CisgCQl1OCBlbmNyeXB0aW9uX2xldmVsOyAvKiAwLCAxLCAyICovCisJCXU4IHJlc2VydmVkMlszXTsgCisJfSBtaWI7CisJaW50IGk7CisKKwltaWIud2VwX2lzX29uID0gcHJpdi0+d2VwX2lzX29uOworCWlmIChwcml2LT53ZXBfaXNfb24pIHsKKwkJaWYgKHByaXYtPndlcF9rZXlfbGVuW3ByaXYtPmRlZmF1bHRfa2V5XSA+IDUpCisJCQltaWIuZW5jcnlwdGlvbl9sZXZlbCA9IDI7CisJCWVsc2UKKwkJCW1pYi5lbmNyeXB0aW9uX2xldmVsID0gMTsJCisJfSBlbHNlIHsKKwkJbWliLmVuY3J5cHRpb25fbGV2ZWwgPSAwOworCX0KKworCW1pYi5kZWZhdWx0X2tleSA9IHByaXYtPmRlZmF1bHRfa2V5OworCW1pYi5leGNsdWRlX3VuZW5jcnlwdGVkID0gcHJpdi0+ZXhjbHVkZV91bmVuY3J5cHRlZDsKKwkKKwlmb3IoaSA9IDA7IGkgPCBNQVhfRU5DUllQVElPTl9LRVlTOyAgaSsrKQorCQltZW1jcHkobWliLndlcF9rZXlzW2ldLCBwcml2LT53ZXBfa2V5c1tpXSwgMTMpOworCQkKKwlhdG1lbF9zZXRfbWliKHByaXYsIE1hY19XZXBfTWliX1R5cGUsIDAsICh1OCAqKSZtaWIsIHNpemVvZihtaWIpKTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfd3BhX21pYihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKK3sKKwkvKiBUaGlzIGlzIGZvciB0aGUgbGF0ZXIgKFdQQSBlbmFibGVkKSBmaXJtd2FyZS4gKi8JICAgCisKKwlzdHJ1Y3QgeyAvKiBOQiB0aGlzIGlzIG1hdGNoZWQgdG8gdGhlIGhhcmR3YXJlLCBkb24ndCBjaGFuZ2UuICovCisJCXU4IGNpcGhlcl9kZWZhdWx0X2tleV92YWx1ZVtNQVhfRU5DUllQVElPTl9LRVlTXVtNQVhfRU5DUllQVElPTl9LRVlfU0laRV07CisJCXU4IHJlY2VpdmVyX2FkZHJlc3NbNl07CisJCXU4IHdlcF9pc19vbjsgICAgICAgICAgICAgICAgIAorCQl1OCBkZWZhdWx0X2tleTsgLyogMC4uMyAqLworCQl1OCBncm91cF9rZXk7CisJCXU4IGV4Y2x1ZGVfdW5lbmNyeXB0ZWQ7CisJCXU4IGVuY3J5cHRpb25fdHlwZTsKKwkJdTggcmVzZXJ2ZWQ7CisJCQorCQl1MzIgV0VQSUNWX2Vycm9yX2NvdW50OworCQl1MzIgV0VQX2V4Y2x1ZGVkX2NvdW50OworCQkKKwkJdTgga2V5X1JTQ1s0XVs4XTsKKwl9IG1pYjsKKwkKKwlpbnQgaTsKKworCW1pYi53ZXBfaXNfb24gPSBwcml2LT53ZXBfaXNfb247CisJbWliLmV4Y2x1ZGVfdW5lbmNyeXB0ZWQgPSBwcml2LT5leGNsdWRlX3VuZW5jcnlwdGVkOworCW1lbWNweShtaWIucmVjZWl2ZXJfYWRkcmVzcywgcHJpdi0+Q3VycmVudEJTU0lELCA2KTsKKwkKKwkvKiB6ZXJvIGFsbCB0aGUga2V5cyBiZWZvcmUgYWRkaW5nIGluIHZhbGlkIG9uZXMuICovCisJbWVtc2V0KG1pYi5jaXBoZXJfZGVmYXVsdF9rZXlfdmFsdWUsIDAsIHNpemVvZihtaWIuY2lwaGVyX2RlZmF1bHRfa2V5X3ZhbHVlKSk7CisJCisJaWYgKHByaXYtPndlcF9pc19vbikgeworCQkvKiBUaGVyZSdzIGEgY29tbWVudCBpbiB0aGUgQXRtZWwgY29kZSB0byB0aGUgZWZmZWN0IHRoYXQgdGhpcyBpcyBvbmx5IHZhbGlkCisJCSAgIHdoZW4gc3RpbGwgdXNpbmcgV0VQLCBpdCBtYXkgbmVlZCB0byBiZSBzZXQgdG8gc29tZXRoaW5nIHRvIHVzZSBXUEEgKi8KKwkJbWVtc2V0KG1pYi5rZXlfUlNDLCAwLCBzaXplb2YobWliLmtleV9SU0MpKTsKKwkJCisJCW1pYi5kZWZhdWx0X2tleSA9IG1pYi5ncm91cF9rZXkgPSAyNTU7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfRU5DUllQVElPTl9LRVlTOyBpKyspIHsKKwkJCWlmIChwcml2LT53ZXBfa2V5X2xlbltpXSA+IDApIHsKKwkJCQltZW1jcHkobWliLmNpcGhlcl9kZWZhdWx0X2tleV92YWx1ZVtpXSwgcHJpdi0+d2VwX2tleXNbaV0sIE1BWF9FTkNSWVBUSU9OX0tFWV9TSVpFKTsKKwkJCQlpZiAoaSA9PSBwcml2LT5kZWZhdWx0X2tleSkgeworCQkJCQltaWIuZGVmYXVsdF9rZXkgPSBpOworCQkJCQltaWIuY2lwaGVyX2RlZmF1bHRfa2V5X3ZhbHVlW2ldW01BWF9FTkNSWVBUSU9OX0tFWV9TSVpFLTFdID0gNzsKKwkJCQkJbWliLmNpcGhlcl9kZWZhdWx0X2tleV92YWx1ZVtpXVtNQVhfRU5DUllQVElPTl9LRVlfU0laRS0yXSA9IHByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZTsgCisJCQkJfSBlbHNlIHsKKwkJCQkJbWliLmdyb3VwX2tleSA9IGk7CisJCQkJCXByaXYtPmdyb3VwX2NpcGhlcl9zdWl0ZSA9IHByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZTsKKwkJCQkgICAgICAgIG1pYi5jaXBoZXJfZGVmYXVsdF9rZXlfdmFsdWVbaV1bTUFYX0VOQ1JZUFRJT05fS0VZX1NJWkUtMV0gPSAxOworCQkJCQltaWIuY2lwaGVyX2RlZmF1bHRfa2V5X3ZhbHVlW2ldW01BWF9FTkNSWVBUSU9OX0tFWV9TSVpFLTJdID0gcHJpdi0+Z3JvdXBfY2lwaGVyX3N1aXRlOwkKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG1pYi5kZWZhdWx0X2tleSA9PSAyNTUpCisJCQltaWIuZGVmYXVsdF9rZXkgPSBtaWIuZ3JvdXBfa2V5ICE9IDI1NSA/IG1pYi5ncm91cF9rZXkgOiAwOworCQlpZiAobWliLmdyb3VwX2tleSA9PSAyNTUpCisJCQltaWIuZ3JvdXBfa2V5ID0gbWliLmRlZmF1bHRfa2V5OworCQkKKwl9CisJCisJYXRtZWxfc2V0X21pYihwcml2LCBNYWNfV2VwX01pYl9UeXBlLCAwLCAodTggKikmbWliLCBzaXplb2YobWliKSk7Cit9CisJCQkJCQorc3RhdGljIGludCByZXNldF9hdG1lbF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCS8qIGRvIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIHdha2UgdXAgdGhlIGhhcmR3YXJlLCBpbmNsdWRpbmcKKwkgICB3YWl0aW5nIGZvciB0aGUgbGlnaHRuaW5nIHN0cmlrZSBhbmQgdGhyb3dpbmcgdGhlIGtuaWZlIHN3aXRjaC4uLi4KKworCSAgIHNldCBhbGwgdGhlIE1pYiB2YWx1ZXMgd2hpY2ggbWF0dGVyIGluIHRoZSBjYXJkIHRvIG1hdGNoIAorCSAgIHRoZWlyIHNldHRpbmdzIGluIHRoZSBhdG1lbF9wcml2YXRlIHN0cnVjdHVyZS4gU29tZSBvZiB0aGVzZQorCSAgIGNhbiBiZSBhbHRlcmVkIG9uIHRoZSBmbHksIGJ1dCBtYW55IChXRVAsIGluZnJhc3R1Y3R1cmUgb3IgYWQtaG9jKQorCSAgIGNhbiBvbmx5IGJlIGNoYW5nZWQgYnkgdGVhcmluZyBkb3duIHRoZSB3b3JsZCBhbmQgY29taW5nIGJhY2sgdGhyb3VnaAorCSAgIGhlcmUuCisKKwkgICBUaGlzIHJvdXRpbmUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGlzaW5nIHNvbWUgCisJICAgaGFyZHdhcmUtc3BlY2lmaWMgZmllbGRzIGluIHRoZSBhdG1lbF9wcml2YXRlIHN0cnVjdHVyZSwgCisJICAgaW5jbHVkaW5nIGEgY29weSBvZiB0aGUgZmlybXdhcmUncyBob3N0aW5mbyBzdHVjdHVyZQorCSAgIHdoaWNoIGlzIHRoZSByb3V0ZSBpbnRvIHRoZSByZXN0IG9mIHRoZSBmaXJtYXJlIGRhdGFzdHJ1Y3R1cmVzLiAqLworCisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXU4IGNvbmZpZ3VyYXRpb247CisJCisJLyogZGF0YSB0byBhZGQgdG8gdGhlIGZpcm13YXJlIG5hbWVzLCBpbiBwcmlvcml0eSBvcmRlcgorCSAgIHRoaXMgaW1wbGVtZW5lbnRzIGZpcm13YXJlIHZlcnNpb25pbmcgKi8KKwkKKwlzdGF0aWMgY2hhciAqZmlybXdhcmVfbW9kaWZpZXJbXSA9IHsKKwkJIi13cGEiLAorCQkiIiwKKwkJTlVMTAorCX07CisJCQorCS8qIHJlc2V0IHBjY2FyZCAqLworCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpIAorCQlhdG1lbF93cml0ZTE2KHByaXYtPmRldiwgR0NSLCAweDAwNjApOworCQkKKwkvKiBzdG9wIGNhcmQgLCBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlhdG1lbF93cml0ZTE2KHByaXYtPmRldiwgR0NSLCAweDAwNDApOworCQkKKwlpZiAocHJpdi0+Y2FyZF90eXBlID09IENBUkRfVFlQRV9FRVBST00pIHsKKwkJLyogY29weSBpbiBmaXJtd2FyZSBpZiBuZWVkZWQgKi8KKwkJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeSA9IE5VTEw7CisJCXVuc2lnbmVkIGNoYXIgKmZ3OworCQlpbnQgbGVuID0gcHJpdi0+ZmlybXdhcmVfbGVuZ3RoOworCQlpZiAoIShmdyA9IHByaXYtPmZpcm13YXJlKSkgeworCQkJaWYgKHByaXYtPmZpcm13YXJlX3R5cGUgPT0gQVRNRUxfRldfVFlQRV9OT05FKSB7CisJCQkJaWYgKHN0cmxlbihwcml2LT5maXJtd2FyZV9pZCkgPT0gMCkgeworCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSAgICAgICAiJXM6IGNhcmQgdHlwZSBpcyB1bmtub3duOiBhc3N1bWluZyBhdDc2YzUwMiBmaXJtd2FyZSBpcyBPSy5cbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSAgICAgICAiJXM6IGlmIG5vdCwgdXNlIHRoZSBmaXJtd2FyZT0gbW9kdWxlIHBhcmFtZXRlci5cbiIsIAorCQkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQkJc3RyY3B5KHByaXYtPmZpcm13YXJlX2lkLCAiYXRtZWxfYXQ3NmM1MDIuYmluIik7CisJCQkJfQorCQkJCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgcHJpdi0+ZmlybXdhcmVfaWQsIHByaXYtPnN5c19kZXYpICE9IDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fQUxFUlQgCisJCQkJCSAgICAgICAiJXM6IGZpcm13YXJlICVzIGlzIG1pc3NpbmcsIGNhbm5vdCBjb250aW51ZS5cbiIsIAorCQkJCQkgICAgICAgZGV2LT5uYW1lLCBwcml2LT5maXJtd2FyZV9pZCk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaW50IGZ3X2luZGV4ID0gMDsKKwkJCQlpbnQgc3VjY2VzcyA9IDA7CisKKwkJCQkvKiBnZXQgZmlybXdhcmUgZmlsZW5hbWUgZW50cnkgYmFzZWQgb24gZmlybXdhcmUgdHlwZSBJRCAqLworCQkJCXdoaWxlIChmd190YWJsZVtmd19pbmRleF0uZndfdHlwZSAhPSBwcml2LT5maXJtd2FyZV90eXBlCisJCQkJCQkmJiBmd190YWJsZVtmd19pbmRleF0uZndfdHlwZSAhPSBBVE1FTF9GV19UWVBFX05PTkUpCisJCQkJCWZ3X2luZGV4Kys7CisJCQkJCisJCQkJLyogY29uc3RydWN0IHRoZSBhY3R1YWwgZmlybXdhcmUgZmlsZSBuYW1lICovCisJCQkJaWYgKGZ3X3RhYmxlW2Z3X2luZGV4XS5md190eXBlICE9IEFUTUVMX0ZXX1RZUEVfTk9ORSkgeworCQkJCQlpbnQgaTsKKwkJCQkJZm9yIChpID0gMDsgZmlybXdhcmVfbW9kaWZpZXJbaV07IGkrKykgeworCQkJCQkJc25wcmludGYocHJpdi0+ZmlybXdhcmVfaWQsIDMyLCAiJXMlcy4lcyIsIGZ3X3RhYmxlW2Z3X2luZGV4XS5md19maWxlLAorCQkJCQkJCWZpcm13YXJlX21vZGlmaWVyW2ldLCBmd190YWJsZVtmd19pbmRleF0uZndfZmlsZV9leHQpOworCQkJCQkJcHJpdi0+ZmlybXdhcmVfaWRbMzFdID0gJ1wwJzsKKwkJCQkJCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgcHJpdi0+ZmlybXdhcmVfaWQsIHByaXYtPnN5c19kZXYpID09IDApIHsKKwkJCQkJCQlzdWNjZXNzID0gMTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQkJcHJpbnRrKEtFUk5fQUxFUlQgCisJCQkJCSAgICAgICAiJXM6IGZpcm13YXJlICVzIGlzIG1pc3NpbmcsIGNhbm5vdCBzdGFydC5cbiIsIAorCQkJCQkgICAgICAgZGV2LT5uYW1lLCBwcml2LT5maXJtd2FyZV9pZCk7CisJCQkJCXByaXYtPmZpcm13YXJlX2lkWzBdID0gJ1wwJzsKKwkJCQkJcmV0dXJuIDA7CQorCQkJCX0KKwkJCX0KKwkJCQorCQkJZncgPSBmd19lbnRyeS0+ZGF0YTsKKwkJCWxlbiA9IGZ3X2VudHJ5LT5zaXplOworCQl9CisJCQorCSAgICAgICAgaWYgKGxlbiA8PSAweDYwMDApIHsKKwkJCWF0bWVsX3dyaXRlMTYocHJpdi0+ZGV2LCBCU1IsIEJTU19JUkFNKTsKKwkJCWF0bWVsX2NvcHlfdG9fY2FyZChwcml2LT5kZXYsIDAsIGZ3LCBsZW4pOworCQkJYXRtZWxfc2V0X2djcihwcml2LT5kZXYsIEdDUl9SRU1BUCk7CisJCX0gZWxzZSB7CisJCQkvKiBSZW1hcCAqLyAKKwkJCWF0bWVsX3NldF9nY3IocHJpdi0+ZGV2LCBHQ1JfUkVNQVApOworCQkJYXRtZWxfd3JpdGUxNihwcml2LT5kZXYsIEJTUiwgQlNTX0lSQU0pOworCQkJYXRtZWxfY29weV90b19jYXJkKHByaXYtPmRldiwgMCwgZncsIDB4NjAwMCk7CisJCQlhdG1lbF93cml0ZTE2KHByaXYtPmRldiwgQlNSLCAweDJmZik7CisJCQlhdG1lbF9jb3B5X3RvX2NhcmQocHJpdi0+ZGV2LCAweDgwMDAsICZmd1sweDYwMDBdLCBsZW4gLSAweDYwMDApOworCQl9CisKKwkJaWYgKGZ3X2VudHJ5KQorCQkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJfQorCisJaWYgKCFhdG1lbF93YWtldXBfZmlybXdhcmUocHJpdikpCisJCXJldHVybiAwOworCisJLyogQ2hlY2sgdGhlIHZlcnNpb24gYW5kIHNldCB0aGUgY29ycmVjdCBmbGFnIGZvciB3cGEgc3R1ZmYsCisJICAgb2xkIGFuZCBuZXcgZmlybXdhcmUgaXMgaW5jb21wYXRpYmxlLgorCSAgIFRoZSBwcmUtd3BhIDNjb20gZmlybXdhcmUgcmVwb3J0cyBtYWpvciB2ZXJzaW9uIDUsCisJICAgdGhlIHdwYSAzY29tIGZpcm13YXJlIGlzIG1ham9yIHZlcnNpb24gNCBhbmQgZG9lc24ndCBuZWVkCisJICAgdGhlIDNjb20gYnJva2VuLW5lc3MgZmlsdGVyLiAqLworCXByaXYtPnVzZV93cGEgPSAocHJpdi0+aG9zdF9pbmZvLm1ham9yX3ZlcnNpb24gPT0gNCk7CisJcHJpdi0+cmFkaW9fb25fYnJva2VuID0gKHByaXYtPmhvc3RfaW5mby5tYWpvcl92ZXJzaW9uID09IDUpOworCQorICAgICAgICAvKiB1bm1hc2sgYWxsIGlycSBzb3VyY2VzICovCisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfSU5UX01BU0tfT0ZGU0VUKSwgMHhmZik7CisJCisJLyogaW50IFR4IHN5c3RlbSBhbmQgZW5hYmxlIFR4ICovCisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19GTEFHU19PRkZTRVQsIDApLCAwKTsKKwlhdG1lbF93bWVtMzIocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19ORVhUX09GRlNFVCwgMCksIDB4ODAwMDAwMDBMKTsKKwlhdG1lbF93bWVtMTYocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19QT1NfT0ZGU0VULCAwKSwgMCk7CisJYXRtZWxfd21lbTE2KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfU0laRV9PRkZTRVQsIDApLCAwKTsKKworCXByaXYtPnR4X2Rlc2NfZnJlZSA9IHByaXYtPmhvc3RfaW5mby50eF9kZXNjX2NvdW50OwkJCisJcHJpdi0+dHhfZGVzY19oZWFkID0gMDsJCQkJCQkJCQkKKwlwcml2LT50eF9kZXNjX3RhaWwgPSAwOwkJCQkJCQkJCQorCXByaXYtPnR4X2Rlc2NfcHJldmlvdXMgPSAwOworCXByaXYtPnR4X2ZyZWVfbWVtID0gcHJpdi0+aG9zdF9pbmZvLnR4X2J1ZmZfc2l6ZTsKKwlwcml2LT50eF9idWZmX2hlYWQgPSAwOwkKKwlwcml2LT50eF9idWZmX3RhaWwgPSAwOwkKKwkJCisJY29uZmlndXJhdGlvbiA9IGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0ZVTkNfQ1RSTF9PRkZTRVQpKTsgCisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfRlVOQ19DVFJMX09GRlNFVCksIAorCQkJCSAgIGNvbmZpZ3VyYXRpb24gfCBGVU5DX0NUUkxfVHhFTkFCTEUpOworCisJLyogaW5pdCBSeCBzeXN0ZW0gYW5kIGVuYWJsZSAqLworCXByaXYtPnJ4X2Rlc2NfaGVhZCA9IDA7CisJCisJY29uZmlndXJhdGlvbiA9IGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0ZVTkNfQ1RSTF9PRkZTRVQpKTsgCisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfRlVOQ19DVFJMX09GRlNFVCksIAorCQkJCSAgIGNvbmZpZ3VyYXRpb24gfCBGVU5DX0NUUkxfUnhFTkFCTEUpOworCQkJCisJaWYgKCFwcml2LT5yYWRpb19vbl9icm9rZW4pIHsKKwkJaWYgKGF0bWVsX3NlbmRfY29tbWFuZF93YWl0KHByaXYsIENNRF9FbmFibGVSYWRpbywgTlVMTCwgMCkgPT0gCisJCSAgICBDTURfU1RBVFVTX1JFSkVDVEVEX1JBRElPX09GRikgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSAgICAgICAiJXM6IGNhbm5vdCB0dXJuIHRoZSByYWRpbyBvbi4gKEhleSByYWRpbywgeW91J3JlIGJlYXV0aWZ1bCEpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwkJfQorCX0KKwkKKwkvKiBzZXQgdXAgZW5vdWdoIE1JQiB2YWx1ZXMgdG8gcnVuLiAqLworCWF0bWVsX3NldF9taWI4KHByaXYsIExvY2FsX01pYl9UeXBlLCBMT0NBTF9NSUJfQVVUT19UWF9SQVRFX1BPUywgcHJpdi0+YXV0b190eF9yYXRlKTsKKwlhdG1lbF9zZXRfbWliOChwcml2LCBMb2NhbF9NaWJfVHlwZSwgIExPQ0FMX01JQl9UWF9QUk9NSVNDVU9VU19QT1MsICBQUk9NX01PREVfT0ZGKTsKKwlhdG1lbF9zZXRfbWliMTYocHJpdiwgTWFjX01pYl9UeXBlLCBNQUNfTUlCX1JUU19USFJFU0hPTERfUE9TLCBwcml2LT5ydHNfdGhyZXNob2xkKTsKKwlhdG1lbF9zZXRfbWliMTYocHJpdiwgTWFjX01pYl9UeXBlLCBNQUNfTUlCX0ZSQUdfVEhSRVNIT0xEX1BPUywgcHJpdi0+ZnJhZ190aHJlc2hvbGQpOworCWF0bWVsX3NldF9taWI4KHByaXYsIE1hY19NaWJfVHlwZSwgTUFDX01JQl9TSE9SVF9SRVRSWV9QT1MsIHByaXYtPnNob3J0X3JldHJ5KTsKKwlhdG1lbF9zZXRfbWliOChwcml2LCBNYWNfTWliX1R5cGUsIE1BQ19NSUJfTE9OR19SRVRSWV9QT1MsIHByaXYtPmxvbmdfcmV0cnkpOworCWF0bWVsX3NldF9taWI4KHByaXYsIExvY2FsX01pYl9UeXBlLCBMT0NBTF9NSUJfUFJFQU1CTEVfVFlQRSwgcHJpdi0+cHJlYW1ibGUpOworCWF0bWVsX3NldF9taWIocHJpdiwgTWFjX0FkZHJlc3NfTWliX1R5cGUsIE1BQ19BRERSX01JQl9NQUNfQUREUl9QT1MsIAorCQkgICAgICBwcml2LT5kZXYtPmRldl9hZGRyLCA2KTsKKwlhdG1lbF9zZXRfbWliOChwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX1BTX01PREVfUE9TLCBBQ1RJVkVfTU9ERSk7CisJYXRtZWxfc2V0X21pYjE2KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfTElTVEVOX0lOVEVSVkFMX1BPUywgMSk7CisJYXRtZWxfc2V0X21pYjE2KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfQkVBQ09OX1BFUl9QT1MsIHByaXYtPmRlZmF1bHRfYmVhY29uX3BlcmlvZCk7CisJYXRtZWxfc2V0X21pYihwcml2LCBQaHlfTWliX1R5cGUsIFBIWV9NSUJfUkFURV9TRVRfUE9TLCBhdG1lbF9iYXNpY19yYXRlcywgNCk7CisJYXRtZWxfc2V0X21pYjgocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9DVVJfUFJJVkFDWV9QT1MsIHByaXYtPndlcF9pc19vbik7CisJaWYgKHByaXYtPnVzZV93cGEpCisJCWJ1aWxkX3dwYV9taWIocHJpdik7CisJZWxzZQorCQlidWlsZF93ZXBfbWliKHByaXYpOworCQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9zZW5kX2NvbW1hbmQoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBjb21tYW5kLCB2b2lkICpjbWQsIGludCBjbWRfc2l6ZSkKK3sKKwlpZiAoY21kKQorCQlhdG1lbF9jb3B5X3RvX2NhcmQocHJpdi0+ZGV2LCBhdG1lbF9jbyhwcml2LCBDTURfQkxPQ0tfUEFSQU1FVEVSU19PRkZTRVQpLCAKKwkJCQkgICBjbWQsIGNtZF9zaXplKTsKKwkKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9jbyhwcml2LCBDTURfQkxPQ0tfQ09NTUFORF9PRkZTRVQpLCBjb21tYW5kKTsKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9jbyhwcml2LCBDTURfQkxPQ0tfU1RBVFVTX09GRlNFVCksIDApOworfQorCQorc3RhdGljIGludCBhdG1lbF9zZW5kX2NvbW1hbmRfd2FpdChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGNvbW1hbmQsIHZvaWQgKmNtZCwgaW50IGNtZF9zaXplKQoreworCWludCBpLCBzdGF0dXM7CisJCisJYXRtZWxfc2VuZF9jb21tYW5kKHByaXYsIGNvbW1hbmQsIGNtZCwgY21kX3NpemUpOworCQorCWZvciAoaSA9IDUwMDA7IGk7IGktLSkgeworCQlzdGF0dXMgPSBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9jbyhwcml2LCBDTURfQkxPQ0tfU1RBVFVTX09GRlNFVCkpOworCQlpZiAoc3RhdHVzICE9IENNRF9TVEFUVVNfSURMRSAmJiAKKwkJICAgIHN0YXR1cyAhPSBDTURfU1RBVFVTX0lOX1BST0dSRVNTKQorCQkJYnJlYWs7CisJCXVkZWxheSgyMCk7CisJfQorCQorCWlmIChpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBmYWlsZWQgdG8gY29udGFjdCBNQUMuXG4iLCBwcml2LT5kZXYtPm5hbWUpOworCQlzdGF0dXMgPSAgQ01EX1NUQVRVU19IT1NUX0VSUk9SOworCX0gZWxzZSB7IAorCQlpZiAoY29tbWFuZCAhPSBDTURfRW5hYmxlUmFkaW8pCisJCQlzdGF0dXMgPSBDTURfU1RBVFVTX0NPTVBMRVRFOworCX0KKwkKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdTggYXRtZWxfZ2V0X21pYjgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4KQoreworCXN0cnVjdCBnZXRfc2V0X21pYiBtOworCW0udHlwZSA9IHR5cGU7CisJbS5zaXplID0gMTsKKwltLmluZGV4ID0gaW5kZXg7CisKKwlhdG1lbF9zZW5kX2NvbW1hbmRfd2FpdChwcml2LCBDTURfR2V0X01JQl9WYXJzLCAmbSwgTUlCX0hFQURFUl9TSVpFICsgMSk7CisJcmV0dXJuIGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2NvKHByaXYsIENNRF9CTE9DS19QQVJBTUVURVJTX09GRlNFVCArIE1JQl9IRUFERVJfU0laRSkpOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9zZXRfbWliOChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggdHlwZSwgdTggaW5kZXgsIHU4IGRhdGEpCit7CisJc3RydWN0IGdldF9zZXRfbWliIG07CisJbS50eXBlID0gdHlwZTsKKwltLnNpemUgPSAxOworCW0uaW5kZXggPSBpbmRleDsKKwltLmRhdGFbMF0gPSBkYXRhOworCisJYXRtZWxfc2VuZF9jb21tYW5kX3dhaXQocHJpdiwgQ01EX1NldF9NSUJfVmFycywgJm0sIE1JQl9IRUFERVJfU0laRSArIDEpOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9zZXRfbWliMTYoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4LCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgZ2V0X3NldF9taWIgbTsKKwltLnR5cGUgPSB0eXBlOworCW0uc2l6ZSA9IDI7CisJbS5pbmRleCA9IGluZGV4OworCW0uZGF0YVswXSA9IGRhdGE7CisJbS5kYXRhWzFdID0gZGF0YSA+PiA4OworCisJYXRtZWxfc2VuZF9jb21tYW5kX3dhaXQocHJpdiwgQ01EX1NldF9NSUJfVmFycywgJm0sIE1JQl9IRUFERVJfU0laRSArIDIpOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9zZXRfbWliKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCB0eXBlLCB1OCBpbmRleCwgdTggKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgZ2V0X3NldF9taWIgbTsKKwltLnR5cGUgPSB0eXBlOworCW0uc2l6ZSA9IGRhdGFfbGVuOworCW0uaW5kZXggPSBpbmRleDsKKworCWlmIChkYXRhX2xlbiA+IE1JQl9NQVhfREFUQV9CWVRFUykKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBNSUIgYnVmZmVyIHRvbyBzbWFsbC5cbiIsIHByaXYtPmRldi0+bmFtZSk7CisJCisJbWVtY3B5KG0uZGF0YSwgZGF0YSwgZGF0YV9sZW4pOworCWF0bWVsX3NlbmRfY29tbWFuZF93YWl0KHByaXYsIENNRF9TZXRfTUlCX1ZhcnMsICZtLCBNSUJfSEVBREVSX1NJWkUgKyBkYXRhX2xlbik7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX2dldF9taWIoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4LCB1OCAqZGF0YSwgaW50IGRhdGFfbGVuKQoreworCXN0cnVjdCBnZXRfc2V0X21pYiBtOworCW0udHlwZSA9IHR5cGU7CisJbS5zaXplID0gZGF0YV9sZW47CisJbS5pbmRleCA9IGluZGV4OworCQorCWlmIChkYXRhX2xlbiA+IE1JQl9NQVhfREFUQV9CWVRFUykKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBNSUIgYnVmZmVyIHRvbyBzbWFsbC5cbiIsIHByaXYtPmRldi0+bmFtZSk7CisJCisJYXRtZWxfc2VuZF9jb21tYW5kX3dhaXQocHJpdiwgQ01EX0dldF9NSUJfVmFycywgJm0sIE1JQl9IRUFERVJfU0laRSArIGRhdGFfbGVuKTsKKwlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCBkYXRhLCAKKwkJCSAgIGF0bWVsX2NvKHByaXYsIENNRF9CTE9DS19QQVJBTUVURVJTX09GRlNFVCArIE1JQl9IRUFERVJfU0laRSksIGRhdGFfbGVuKTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfd3JpdGVBUihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgZGF0YSkKK3sKKwlpbnQgaTsKKwlvdXR3KGRhdGEsIGRldi0+YmFzZV9hZGRyICsgQVIpOworCS8qIEFkZHJlc3MgcmVnaXN0ZXIgYXBwZWFycyB0byBuZWVkIHNvbWUgY29udmluY2luZy4uLi4uICovCisJZm9yIChpID0gMDsgZGF0YSAhPSBpbncoZGV2LT5iYXNlX2FkZHIgKyBBUikgJiYgaTwxMDsgaSsrKQorCQlvdXR3KGRhdGEsIGRldi0+YmFzZV9hZGRyICsgQVIpOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9jb3B5X3RvX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGRlc3QsIHVuc2lnbmVkIGNoYXIgKnNyYywgdTE2IGxlbikKK3sKKwlpbnQgaTsKKwlhdG1lbF93cml0ZUFSKGRldiwgZGVzdCk7CisJaWYgKGRlc3QgJSAyKSB7CisJCWF0bWVsX3dyaXRlOChkZXYsIERSLCAqc3JjKTsKKwkJc3JjKys7IGxlbi0tOworCX0KKwlmb3IgKGkgPSBsZW47IGkgPiAxIDsgaSAtPSAyKSB7CisJCXU4IGxiID0gKnNyYysrOworCQl1OCBoYiA9ICpzcmMrKzsKKwkJYXRtZWxfd3JpdGUxNihkZXYsIERSLCBsYiB8IChoYiA8PCA4KSk7CisJfQorCWlmIChpKQorCQlhdG1lbF93cml0ZTgoZGV2LCBEUiwgKnNyYyk7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX2NvcHlfdG9faG9zdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1MTYgc3JjLCB1MTYgbGVuKQoreworCWludCBpOworCWF0bWVsX3dyaXRlQVIoZGV2LCBzcmMpOworCWlmIChzcmMgJSAyKSB7CisJCSpkZXN0ID0gYXRtZWxfcmVhZDgoZGV2LCBEUik7CisJCWRlc3QrKzsgbGVuLS07CisJfQorCWZvciAoaSA9IGxlbjsgaSA+IDEgOyBpIC09IDIpIHsKKwkJdTE2IGh3ID0gYXRtZWxfcmVhZDE2KGRldiwgRFIpOworCQkqZGVzdCsrID0gaHc7CisJCSpkZXN0KysgPSBodyA+PiA4OworCX0KKwlpZiAoaSkKKwkJKmRlc3QgPSBhdG1lbF9yZWFkOChkZXYsIERSKTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfc2V0X2djcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgbWFzaykKK3sKKwlvdXR3KGludyhkZXYtPmJhc2VfYWRkciArIEdDUikgfCBtYXNrLCBkZXYtPmJhc2VfYWRkciArIEdDUik7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX2NsZWFyX2djcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgbWFzaykKK3sKKwlvdXR3KGludyhkZXYtPmJhc2VfYWRkciArIEdDUikgJiB+bWFzaywgZGV2LT5iYXNlX2FkZHIgKyBHQ1IpOworfQorCitzdGF0aWMgaW50IGF0bWVsX2xvY2tfbWFjKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCWludCBpLCBqID0gMjA7CisgcmV0cnk6CisJZm9yIChpID0gNTAwMDsgaTsgaS0tKSB7CisJCWlmICghYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfTE9DS09VVF9IT1NUX09GRlNFVCkpKQorCQkJYnJlYWs7CisJCXVkZWxheSgyMCk7CisJfQorCQorCWlmICghaSkgcmV0dXJuIDA7IC8qIHRpbWVkIG91dCAqLworCQorCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0xPQ0tPVVRfTUFDX09GRlNFVCksIDEpOworCWlmIChhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9MT0NLT1VUX0hPU1RfT0ZGU0VUKSkpIHsKKwkJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfTE9DS09VVF9NQUNfT0ZGU0VUKSwgMCk7CisJCWlmICghai0tKSByZXR1cm4gMDsgLyogdGltZWQgb3V0ICovCisJCWdvdG8gcmV0cnk7CisJfQorCQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF93bWVtMzIoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBwb3MsIHUzMiBkYXRhKQoreworICAgICAgIAlhdG1lbF93cml0ZUFSKHByaXYtPmRldiwgcG9zKTsJCisJYXRtZWxfd3JpdGUxNihwcml2LT5kZXYsIERSLCBkYXRhKTsgLyogY2FyZCBpcyBsaXR0bGUtZW5kaWFuICovCisJYXRtZWxfd3JpdGUxNihwcml2LT5kZXYsIERSLCBkYXRhID4+IDE2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZXJlIGZvbGxvd3MgdGhlIHNvdXJjZSBmb3JtIG9mIHRoZSBNQUMgYWRkcmVzcyByZWFkaW5nIGZpcm13YXJlICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIDAKKworLyogQ29weXJpZ2h0IDIwMDMgTWF0dGhldyBULiBSdXNzb3R0byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1dCBkZXJpdmVkIGZyb20gdGhlIEF0bWVsIDc2QzUwMiBmaXJtd2FyZSB3cml0dGVuIGJ5IEF0bWVsIGFuZCAgICAgICAgICovCisvKiBpbmNsdWRlZCBpbiAiYXRtZWwgd2lyZWxlc3MgbGFuIGRyaXZlcnMiIHBhY2thZ2UgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgbmV0LnJ1c3NvdHRvLkF0bWVsTUFDRlcsIGhlcmV0byByZWZlcnJlZCB0bworICAgIGFzIEF0bWVsTUFDRlcKKworICAgIEF0bWVsTUFDRlcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgICBBdG1lbE1BQ0ZXIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCBBdG1lbE1BQ0ZXOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhpcyBmaXJtd2FyZSBzaG91bGQgd29yayBvbiB0aGUgNzZDNTAyIFJGTUQsIFJGTURfRCwgYW5kIFJGTURfRSAgICAgICAgKi8KKy8qIEl0IHdpbGwgcHJvYmFibHkgd29yayBvbiB0aGUgNzZDNTA0IGFuZCA3NkM1MDIgUkZNRF8zQ09NICAgICAgICAgICAgICAgICovCisvKiBJdCBvbmx5IHdvcmtzIG9uIFNQSSBFRVBST00gdmVyc2lvbnMgb2YgdGhlIGNhcmQuICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBUaGlzIGZpcm13YXJlIGluaXRpYWxpemVzIHRoZSBTUEkgY29udHJvbGxlciBhbmQgY2xvY2ssIHJlYWRzIHRoZSBNQUMgICAqLworLyogYWRkcmVzcyBmcm9tIHRoZSBFRVBST00gaW50byBTUkFNLCBhbmQgcHV0cyB0aGUgU1JBTSBvZmZzZXQgb2YgdGhlIE1BQyAgKi8KKy8qIGFkZHJlc3MgaW4gTVIyLCBhbmQgc2V0cyBNUjMgdG8gMHgxMCB0byBpbmRpY2F0ZSBpdCBpcyBkb25lICAgICAgICAgICAgICovCisvKiBJdCBhbHNvIHB1dHMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBFRVBST00gaW4gU1JBTSB3aXRoIHRoZSBvZmZzZXQgaW4gICAqLworLyogTVI0LCBmb3IgaW52ZXN0aWdhdGlvbmFsIHB1cnBvc2VzIChtYXliZSB3ZSBjYW4gZGV0ZXJtaW5lIGNoaXAgdHlwZSAgICAgKi8KKy8qIGZyb20gdGhhdD8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwkub3JnIDAKKyAgICAuc2V0IE1SQkFTRSwgMHg4MDAwMDAwCisJLnNldCBDUFNSX0lOSVRJQUwsIDB4RDMgLyogSVJRL0ZJUSBkaXNhYmxlZCwgQVJNIG1vZGUsIFN1cGVydmlzb3Igc3RhdGUgKi8KKwkuc2V0IENQU1JfVVNFUiwgMHhEMSAvKiBJUlEvRklRIGRpc2FibGVkLCBBUk0gbW9kZSwgVVNFUiBzdGF0ZSAqLworCS5zZXQgU1JBTV9CQVNFLCAgMHgwMjAwMDAwMAorCS5zZXQgU1BfQkFTRSwgICAgMHgwRjMwMDAwMAorCS5zZXQgVU5LX0JBU0UsICAgMHgwRjAwMDAwMCAvKiBTb21lIGludGVybmFsIGRldmljZSwgYnV0IHdoaWNoIG9uZT8gKi8KKwkuc2V0IFNQSV9DR0VOX0JBU0UsICAweDBFMDAwMDAwIC8qIFNvbWUgaW50ZXJuYWwgZGV2aWNlLCBidXQgd2hpY2ggb25lPyAqLworCS5zZXQgVU5LM19CQVNFLCAgMHgwMjAxNDAwMCAvKiBTb21lIGludGVybmFsIGRldmljZSwgYnV0IHdoaWNoIG9uZT8gKi8KKwkuc2V0IFNUQUNLX0JBU0UsIDB4NTYwMAorCS5zZXQgU1BfU1IsIDB4MTAKKwkuc2V0IFNQX1REUkUsIDIgLyogc3RhdHVzIHJlZ2lzdGVyIGJpdCAtLSBURFIgZW1wdHkgKi8KKwkuc2V0IFNQX1JEUkYsIDEgLyogc3RhdHVzIHJlZ2lzdGVyIGJpdCAtLSBSRFIgZnVsbCAqLworCS5zZXQgU1BfU1dSU1QsIDB4ODAKKwkuc2V0IFNQX1NQSUVOLCAweDEKKwkuc2V0IFNQX0NSLCAwICAgLyogY29udHJvbCByZWdpc3RlciAqLworCS5zZXQgU1BfTVIsIDQgICAvKiBtb2RlIHJlZ2lzdGVyICovCisJLnNldCBTUF9SRFIsIDB4MDggLyogUmVhZCBEYXRhIFJlZ2lzdGVyICovCisJLnNldCBTUF9URFIsIDB4MEMgLyogVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAqLworCS5zZXQgU1BfQ1NSMCwgMHgzMCAvKiBjaGlwIHNlbGVjdCByZWdpc3RlcnMgKi8KKwkuc2V0IFNQX0NTUjEsIDB4MzQKKwkuc2V0IFNQX0NTUjIsIDB4MzgKKwkuc2V0IFNQX0NTUjMsIDB4M0MKKwkuc2V0IE5WUkFNX0NNRF9SRFNSLCA1IC8qIHJlYWQgc3RhdHVzIHJlZ2lzdGVyICovCisJLnNldCBOVlJBTV9DTURfUkVBRCwgMyAvKiByZWFkIGRhdGEgKi8KKwkuc2V0IE5WUkFNX1NSX1JEWSwgMSAvKiBSRFkgYml0LiAgVGhpcyBiaXQgaXMgaW52ZXJ0ZWQgKi8KKwkuc2V0IFNQSV84Q0xPQ0tTLCAweEZGIC8qIFdyaXRpbmcgdGhpcyB0byB0aGUgVERSIGRvZXNuJ3QgZG8gYW55dGhpbmcgdG8gdGhlCisJCQkJICBzZXJpYWwgb3V0cHV0LCBzaW5jZSBTTyBpcyBub3JtYWxseSBoaWdoLiAgQnV0IGl0CisJCQkJICBkb2VzIGNhdXNlIDggY2xvY2sgY3ljbGVzIGFuZCB0aHVzIDggYml0cyB0byBiZQorCQkJCSAgY2xvY2tlZCBpbiB0byB0aGUgY2hpcC4gIFNlZSBBdG1lbCdzIFNQSQorCQkJCSAgY29udHJvbGxlciAoZS5nLiBBVDkxTTU1ODAwKSB0aW1pbmcgYW5kIDRLIAorCQkJCSAgU1BJIEVFUFJPTSBtYW51YWxzICovCisJCQkJIAorCS5zZXQgTlZSQU1fU0NSQVRDSCwgMHgwMjAwMDEwMCAgLyogYXJiaXRyYXJ5IGFyZWEgZm9yIHNjcmF0Y2hwYWQgbWVtb3J5ICovCisJLnNldCBOVlJBTV9JTUFHRSwgMHgwMjAwMDIwMAorCS5zZXQgTlZSQU1fTEVOR1RILCAweDAyMDAKKwkuc2V0IE1BQ19BRERSRVNTX01JQiwgU1JBTV9CQVNFCisJLnNldCBNQUNfQUREUkVTU19MRU5HVEgsIDYKKyAgICAgICAgLnNldCBNQUNfQk9PVF9GTEFHLCAweDEwCisJLnNldCBNUjEsIDAKKwkuc2V0IE1SMiwgNAorCS5zZXQgTVIzLCA4CisJLnNldCBNUjQsIDB4QworUkVTRVRfVkVDVE9SOgorICAgICAgICBiIFJFU0VUX0hBTkRMRVIKK1VOREVGX1ZFQ1RPUjogIAorICAgICAgICBiIEhBTFQxCitTV0lfVkVDVE9SOiAgICAgICAgICAgIAorICAgICAgICBiIEhBTFQxCitJQUJPUlRfVkVDVE9SOiAKKyAgICAgICAgYiBIQUxUMQorREFCT1JUX1ZFQ1RPUjogICAgICAgICAKK1JFU0VSVkVEX1ZFQ1RPUjogICAgCisgICAgICAgIGIgSEFMVDEKK0lSUV9WRUNUT1I6ICAgIAorICAgICAgICBiIEhBTFQxCitGSVFfVkVDVE9SOiAgICAKKwliIEhBTFQxCitIQUxUMToJYiBIQUxUMQorUkVTRVRfSEFORExFUjoKKwltb3YgICAgIHIwLCAjQ1BTUl9JTklUSUFMCisJbXNyCUNQU1JfYywgcjAJLyogVGhpcyBpcyBwcm9iYWJseSB1bm5lY2Vzc2FyeSAqLworCQkJCisvKiBJJ20gZ3Vlc3NpbmcgdGhpcyBpcyBpbml0aWFsaXppbmcgY2xvY2sgZ2VuZXJhdG9yIGVsZWN0cm9uaWNzIGZvciBTUEkgKi8KKwlsZHIJcjAsID1TUElfQ0dFTl9CQVNFCisJbW92CXIxLCAjMAorCW1vdglyMSwgcjEsIGxzbCAjMworCW9ycglyMSxyMSwgIzAKKwlzdHIJcjEsIFtyMF0KKwlsZHIJcjEsIFtyMCwgIzI4XQorCWJpYwlyMSwgcjEsICMxNgorCXN0cglyMSwgW3IwLCAjMjhdCisJbW92CXIxLCAjMQorCXN0cglyMSwgW3IwLCAjOF0KKwkKKwlsZHIJcjAsID1NUkJBU0UKKwltb3YJcjEsICMwCisJc3RyaAlyMSwgW3IwLCAjTVIxXQorCXN0cmgJcjEsIFtyMCwgI01SMl0KKwlzdHJoCXIxLCBbcjAsICNNUjNdCisJc3RyaAlyMSwgW3IwLCAjTVI0XQorCisJbW92CXNwLCAjU1RBQ0tfQkFTRQorCWJsCVNQX0lOSVQKKwltb3YJcjAsICMxMAorCWJsCURFTEFZOQorCWJsCUdFVF9NQUNfQUREUgorCWJsCUdFVF9XSE9MRV9OVlJBTQorCWxkcglyMCwgPU1SQkFTRQorCWxkcglyMSwgPU1BQ19BRERSRVNTX01JQgorCXN0cmgJcjEsIFtyMCwgI01SMl0KKwlsZHIJcjEsID1OVlJBTV9JTUFHRQorCXN0cmgJcjEsIFtyMCwgI01SNF0KKwltb3YJcjEsICNNQUNfQk9PVF9GTEFHCisJc3RyaAlyMSwgW3IwLCAjTVIzXQorSEFMVDI6CWIgSEFMVDIKKy5mdW5jIEdldF9XaG9sZV9OVlJBTSwgR0VUX1dIT0xFX05WUkFNCitHRVRfV0hPTEVfTlZSQU06CisJc3RtZGIJc3AhLCB7bHJ9CisJbW92CXIyLCAjMCAvKiAwdGggYnl0ZXMgb2YgTlZSQU0gKi8KKwltb3YJcjMsICNOVlJBTV9MRU5HVEgKKwltb3YJcjEsICMwCQkvKiBub3QgdXNlZCBpbiByb3V0aW5lICovCisJbGRyCXIwLCA9TlZSQU1fSU1BR0UKKwlibAlOVlJBTV9YRkVSCisJbGRtaWEJc3AhLCB7bHJ9CisJYngJbHIKKy5lbmRmdW5jCisJCisuZnVuYyBHZXRfTUFDX0FkZHIsIEdFVF9NQUNfQUREUgorR0VUX01BQ19BRERSOgorCXN0bWRiCXNwISwge2xyfQorCW1vdglyMiwgIzB4MTIwCS8qIGFkZHJlc3Mgb2YgTUFDIEFkZHJlc3Mgd2l0aGluIE5WUkFNICovCisJbW92CXIzLCAjTUFDX0FERFJFU1NfTEVOR1RICisJbW92CXIxLCAjMAkJLyogbm90IHVzZWQgaW4gcm91dGluZSAqLworCWxkcglyMCwgPU1BQ19BRERSRVNTX01JQgorCWJsCU5WUkFNX1hGRVIKKwlsZG1pYQlzcCEsIHtscn0KKwlieAlscgorLmVuZGZ1bmMKKy5sdG9yZworLmZ1bmMgRGVsYXk5LCBERUxBWTkKK0RFTEFZOToKKwlhZGRzCXIwLCByMCwgcjAsIExTTCAjMyAgIC8qIHIwID0gcjAgKiA5ICovCitERUxBWUxPT1A6CQorCWJlcQlERUxBWTlfZG9uZQorCXN1YnMJcjAsIHIwLCAjMQorCWIJREVMQVlMT09QCitERUxBWTlfZG9uZToJCisJYngJbHIKKy5lbmRmdW5jCQorCisuZnVuYyBTUF9Jbml0LCBTUF9JTklUCitTUF9JTklUOgorCW1vdglyMSwgI1NQX1NXUlNUCisJbGRyCXIwLCA9U1BfQkFTRQorCXN0cglyMSwgW3IwLCAjU1BfQ1JdIC8qIHJlc2V0IHRoZSBTUEkgKi8KKwltb3YJcjEsICMwCisJc3RyCXIxLCBbcjAsICNTUF9DUl0gLyogcmVsZWFzZSBTUEkgZnJvbSByZXNldCBzdGF0ZSAqLworCW1vdglyMSwgI1NQX1NQSUVOCisJc3RyCXIxLCBbcjAsICNTUF9NUl0gLyogc2V0IHRoZSBTUEkgdG8gTUFTVEVSIG1vZGUqLworCXN0cglyMSwgW3IwLCAjU1BfQ1JdIC8qIGVuYWJsZSB0aGUgU1BJICovCisKKy8qICBNeSBndWVzcyB3b3VsZCBiZSB0aGlzIHR1cm5zIG9uIHRoZSBTUEkgY2xvY2sgKi8KKwlsZHIJcjMsID1TUElfQ0dFTl9CQVNFCisJbGRyCXIxLCBbcjMsICMyOF0KKwlvcnIJcjEsIHIxLCAjMHgyMDAwCisJc3RyCXIxLCBbcjMsICMyOF0KKworCWxkcglyMSwgPTB4MjAwMGMwMQorCXN0cglyMSwgW3IwLCAjU1BfQ1NSMF0KKwlsZHIJcjEsID0weDIwMDAyMDEKKwlzdHIJcjEsIFtyMCwgI1NQX0NTUjFdCisJc3RyCXIxLCBbcjAsICNTUF9DU1IyXQorCXN0cglyMSwgW3IwLCAjU1BfQ1NSM10KKwlsZHIJcjEsIFtyMCwgI1NQX1NSXQorCWxkcglyMCwgW3IwLCAjU1BfUkRSXQorCWJ4CWxyCisuZW5kZnVuYworLmZ1bmMgTlZSQU1fSW5pdCwgTlZSQU1fSU5JVAkKK05WUkFNX0lOSVQ6CisJbGRyCXIxLCA9U1BfQkFTRQorCWxkcglyMCwgW3IxLCAjU1BfUkRSXQorCW1vdglyMCwgI05WUkFNX0NNRF9SRFNSCisJc3RyCXIwLCBbcjEsICNTUF9URFJdCitTUF9sb29wMToJCisJbGRyCXIwLCBbcjEsICNTUF9TUl0KKwl0c3QJcjAsICNTUF9URFJFCisJYmVxCVNQX2xvb3AxCisKKwltb3YJcjAsICNTUElfOENMT0NLUworCXN0cglyMCwgW3IxLCAjU1BfVERSXSAKK1NQX2xvb3AyOgkKKwlsZHIJcjAsIFtyMSwgI1NQX1NSXQorCXRzdAlyMCwgI1NQX1REUkUKKwliZXEJU1BfbG9vcDIKKworCWxkcglyMCwgW3IxLCAjU1BfUkRSXQorU1BfbG9vcDM6CQorCWxkcglyMCwgW3IxLCAjU1BfU1JdCisJdHN0CXIwLCAjU1BfUkRSRgorCWJlcQlTUF9sb29wMworCisJbGRyCXIwLCBbcjEsICNTUF9SRFJdCisJYW5kCXIwLCByMCwgIzI1NQorCWJ4CWxyCisuZW5kZnVuYworCQorLmZ1bmMgTlZSQU1fWGZlciwgTlZSQU1fWEZFUgorCS8qIHIwID0gZGVzdCBhZGRyZXNzICovCisJLyogcjEgPSBub3QgdXNlZCAqLworCS8qIHIyID0gc3JjIGFkZHJlc3Mgd2l0aGluIE5WUkFNICovCisJLyogcjMgPSBsZW5ndGggKi8KK05WUkFNX1hGRVI6CisJc3RtZGIJc3AhLCB7cjQsIHI1LCBscn0KKwltb3YJcjUsIHIwCQkvKiBzYXZlIHIwIChkZXN0IGFkZHJlc3MpICovCisJbW92CXI0LCByMwkJLyogc2F2ZSByMyAobGVuZ3RoKSAqLworCW1vdglyMCwgcjIsIExTUiAjNSAvKiAgU1BJIG1lbW9yaWVzIHB1dCBBOCBpbiB0aGUgY29tbWFuZCBmaWVsZCAqLworCWFuZAlyMCwgcjAsICM4CisJYWRkCXIwLCByMCwgI05WUkFNX0NNRF9SRUFEIAorCWxkcglyMSwgPU5WUkFNX1NDUkFUQ0gKKwlzdHJiCXIwLCBbcjEsICMwXQkvKiBzYXZlIGNvbW1hbmQgaW4gTlZSQU1fU0NSQVRDSFswXSAqLworCXN0cmIJcjIsIFtyMSwgIzFdICAgIC8qIHNhdmUgbG93IGJ5dGUgb2Ygc291cmNlIGFkZHJlc3MgaW4gTlZSQU1fU0NSQVRDSFsxXSAqLworX2xvY2FsMToJCisJYmwJTlZSQU1fSU5JVAorCXRzdAlyMCwgI05WUkFNX1NSX1JEWQorCWJuZQlfbG9jYWwxCisJbW92CXIwLCAjMjAKKwlibAlERUxBWTkKKwltb3YJcjIsIHI0CQkvKiBsZW5ndGggKi8KKwltb3YJcjEsIHI1CQkvKiBkZXN0IGFkZHJlc3MgKi8KKwltb3YJcjAsICMyCQkvKiBieXRlcyB0byB0cmFuc2ZlciBpbiBjb21tYW5kICovCisJYmwJTlZSQU1fWEZFUjIKKwlsZG1pYQlzcCEsIHtyNCwgcjUsIGxyfQorCWJ4CWxyCisuZW5kZnVuYworCisuZnVuYyBOVlJBTV9YZmVyMiwgTlZSQU1fWEZFUjIKK05WUkFNX1hGRVIyOgorCXN0bWRiCXNwISwge3I0LCByNSwgcjYsIGxyfQorCWxkcglyNCwgPVNQX0JBU0UKKwltb3YJcjMsICMwCisJY21wCXIwLCAjMAorCWJscwlfbG9jYWwyCisJbGRyCXI1LCA9TlZSQU1fU0NSQVRDSAorX2xvY2FsNDoJCisJbGRyYglyNiwgW3I1LCByM10KKwlzdHIJcjYsIFtyNCwgI1NQX1REUl0KK19sb2NhbDM6CisJbGRyCXI2LCBbcjQsICNTUF9TUl0KKwl0c3QJcjYsICNTUF9URFJFCisJYmVxCV9sb2NhbDMKKwlhZGQJcjMsIHIzLCAjMQorCWNtcAlyMywgcjAgLyogcjAgaXMgIyBvZiBieXRlcyB0byBzZW5kIG91dCAoY29tbWFuZCthZGRyKSAqLworCWJsbwlfbG9jYWw0CitfbG9jYWwyOgorCW1vdglyMywgI1NQSV84Q0xPQ0tTCisJc3RyCXIzLCBbcjQsICNTUF9URFJdCisJbGRyCXIwLCBbcjQsICNTUF9SRFJdCitfbG9jYWw1OgkKKwlsZHIJcjAsIFtyNCwgI1NQX1NSXQorCXRzdAlyMCwgI1NQX1JEUkYKKwliZXEJX2xvY2FsNQorCWxkcglyMCwgW3I0LCAjU1BfUkRSXSAvKiB3aGF0J3MgdGhpcyBieXRlPyAgSXQncyB0aGUgYnl0ZSByZWFkIHdoaWxlIHdyaXRpbmcgdGhlIFREUiAtLSBub25zZW5zZSwgYmVjYXVzZSB0aGUgTlZSQU0gZG9lc24ndCByZWFkIGFuZCB3cml0ZSBhdCB0aGUgc2FtZSB0aW1lICovCisJbW92CXIwLCAjMAorCWNtcAlyMiwgIzAgIC8qIHIyIGlzICMgb2YgYnl0ZXMgdG8gY29weSBpbiAqLworCWJscwlfbG9jYWw2CitfbG9jYWw3OgkKKwlsZHIJcjUsIFtyNCwgI1NQX1NSXQorCXRzdAlyNSwgI1NQX1REUkUKKwliZXEJX2xvY2FsNworCXN0cglyMywgW3I0LCAjU1BfVERSXSAgLyogcjMgaGFzIFNQSV84Q0xPQ0tTICovCitfbG9jYWw4OgkKKwlsZHIJcjUsIFtyNCwgI1NQX1NSXQorCXRzdAlyNSwgI1NQX1JEUkYKKwliZXEJX2xvY2FsOAorCWxkcglyNSwgW3I0LCAjU1BfUkRSXSAvKiBidXQgZGlkbid0IHdlIHJlYWQgdGhpcyBieXRlIGFib3ZlPyAqLworCXN0cmIJcjUsIFtyMV0sICMxIC8qIHBvc3RpbmRleGVkICovCisJYWRkCXIwLCByMCwgIzEKKwljbXAJcjAsIHIyCisJYmxvCV9sb2NhbDcgLyogc2luY2Ugd2UgZG9uJ3Qgc2VuZCBhbm90aGVyIGFkZHJlc3MsIHRoZSBOVlJBTSBtdXN0IGJlIGNhcGFibGUgb2Ygc2VxdWVudGlhbCByZWFkcyAqLworX2xvY2FsNjoKKwltb3YJcjAsICMyMDAKKwlibAlERUxBWTkKKwlsZG1pYQlzcCEsIHtyNCwgcjUsIHI2LCBscn0KKwlieAlscgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjUwMDBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuaApAQCAtMCwwICsxLDQzIEBACisvKioqIC0qLSBsaW51eC1jIC0qLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgRHJpdmVyIGZvciBBdG1lbCBhdDc2YzUwMiBhdDc2YzUwNCBhbmQgYXQ3NmM1MDYgd2lyZWxlc3MgY2FyZHMuCisKKyAgICAgICAgIENvcHlyaWdodCAyMDA1IERhbiBXaWxsaWFtcyBhbmQgUmVkIEhhdCwgSW5jLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIEF0bWVsIHdpcmVsZXNzIGxhbiBkcml2ZXJzOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0FUTUVMX0gKKyNkZWZpbmUgX0FUTUVMX0gKKwordHlwZWRlZiBlbnVtIHsKKwlBVE1FTF9GV19UWVBFX05PTkUgPSAwLAorCUFUTUVMX0ZXX1RZUEVfNTAyLAorCUFUTUVMX0ZXX1RZUEVfNTAyRCwKKwlBVE1FTF9GV19UWVBFXzUwMkUsCisJQVRNRUxfRldfVFlQRV81MDJfM0NPTSwKKwlBVE1FTF9GV19UWVBFXzUwNCwKKwlBVE1FTF9GV19UWVBFXzUwNF8yOTU4LAorCUFUTUVMX0ZXX1RZUEVfNTA0QV8yOTU4LAorCUFUTUVMX0ZXX1RZUEVfNTA2Cit9IEF0bWVsRldUeXBlOworCitzdHJ1Y3QgbmV0X2RldmljZSAqaW5pdF9hdG1lbF9jYXJkKHVuc2lnbmVkIHNob3J0LCBpbnQsIGNvbnN0IEF0bWVsRldUeXBlLCBzdHJ1Y3QgZGV2aWNlICosIAorCQkJCSAgICBpbnQgKCpwcmVzZW50X2Z1bmMpKHZvaWQgKiksIHZvaWQgKiApOwordm9pZCBzdG9wX2F0bWVsX2NhcmQoIHN0cnVjdCBuZXRfZGV2aWNlICosIGludCApOworaW50IGF0bWVsX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTFiNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYwpAQCAtMCwwICsxLDcwOCBAQAorLyoqKiAtKi0gbGludXgtYyAtKi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgIERyaXZlciBmb3IgQXRtZWwgYXQ3NmM1MDIgYXQ3NmM1MDQgYW5kIGF0NzZjNTA2IHdpcmVsZXNzIGNhcmRzLgorCisgICAgICAgIENvcHlyaWdodCAyMDAwLTIwMDEgQVRNRUwgQ29ycG9yYXRpb24uCisgICAgICAgIENvcHlyaWdodCAyMDAzIFNpbW9uIEtlbGxleS4KKworICAgIFRoaXMgY29kZSB3YXMgZGV2ZWxvcGVkIGZyb20gdmVyc2lvbiAyLjEuMSBvZiB0aGUgQXRtZWwgZHJpdmVycywgCisgICAgcmVsZWFzZWQgYnkgQXRtZWwgY29ycC4gdW5kZXIgdGhlIEdQTCBpbiBEZWNlbWJlciAyMDAyLiBJdCBhbHNvIAorICAgIGluY2x1ZGVzIGNvZGUgZnJvbSB0aGUgTGludXggYWlyb25ldCBkcml2ZXJzIChDKSBCZW5qYW1pbiBSZWVkLCAKKyAgICBhbmQgdGhlIExpbnV4IFBDTUNJQSBwYWNrYWdlLCAoQykgRGF2aWQgSGluZHMuIAorCisgICAgRm9yIGFsbCBxdWVyaWVzIGFib3V0IHRoaXMgY29kZSwgcGxlYXNlIGNvbnRhY3QgdGhlIGN1cnJlbnQgYXV0aG9yLCAKKyAgICBTaW1vbiBLZWxsZXkgPHNpbW9uQHRoZWtlbGxleXMub3JnLnVrPiBhbmQgbm90IEF0bWVsIENvcnBvcmF0aW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIEF0bWVsIHdpcmVsZXNzIGxhbiBkcml2ZXJzOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpZmRlZiBfX0lOX1BDTUNJQV9QQUNLQUdFX18KKyNpbmNsdWRlIDxwY21jaWEva19jb21wYXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlICJhdG1lbC5oIgorCisvKgorICAgQWxsIHRoZSBQQ01DSUEgbW9kdWxlcyB1c2UgUENNQ0lBX0RFQlVHIHRvIGNvbnRyb2wgZGVidWdnaW5nLiAgSWYKKyAgIHlvdSBkbyBub3QgZGVmaW5lIFBDTUNJQV9ERUJVRyBhdCBhbGwsIGFsbCB0aGUgZGVidWcgY29kZSB3aWxsIGJlCisgICBsZWZ0IG91dC4gIElmIHlvdSBjb21waWxlIHdpdGggUENNQ0lBX0RFQlVHPTAsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwKKyAgIGJlIHByZXNlbnQgYnV0IGRpc2FibGVkIC0tIGJ1dCBpdCBjYW4gdGhlbiBiZSBlbmFibGVkIGZvciBzcGVjaWZpYworICAgbW9kdWxlcyBhdCBsb2FkIHRpbWUgd2l0aCBhICdwY19kZWJ1Zz0jJyBvcHRpb24gdG8gaW5zbW9kLgorKi8KKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CitzdGF0aWMgY2hhciAqdmVyc2lvbiA9ICIkUmV2aXNpb246IDEuMiAkIjsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncyk7CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitNT0RVTEVfQVVUSE9SKCJTaW1vbiBLZWxsZXkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgQXRtZWwgYXQ3NmM1MHggODAyLjExIHdpcmVsZXNzIGV0aGVybmV0IGNhcmRzLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIkF0bWVsIGF0NzZjNTB4IFBDTUNJQSBjYXJkcyIpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAgIFRoZSBldmVudCgpIGZ1bmN0aW9uIGlzIHRoaXMgZHJpdmVyJ3MgQ2FyZCBTZXJ2aWNlcyBldmVudCBoYW5kbGVyLgorICAgSXQgd2lsbCBiZSBjYWxsZWQgYnkgQ2FyZCBTZXJ2aWNlcyB3aGVuIGFuIGFwcHJvcHJpYXRlIGNhcmQgc3RhdHVzCisgICBldmVudCBpcyByZWNlaXZlZC4gIFRoZSBjb25maWcoKSBhbmQgcmVsZWFzZSgpIGVudHJ5IHBvaW50cyBhcmUKKyAgIHVzZWQgdG8gY29uZmlndXJlIG9yIHJlbGVhc2UgYSBzb2NrZXQsIGluIHJlc3BvbnNlIHRvIGNhcmQKKyAgIGluc2VydGlvbiBhbmQgZWplY3Rpb24gZXZlbnRzLiAgVGhleSBhcmUgaW52b2tlZCBmcm9tIHRoZSBhdG1lbF9jcworICAgZXZlbnQgaGFuZGxlci4gCisqLworCitzdGF0aWMgdm9pZCBhdG1lbF9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCBhdG1lbF9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCBhdG1lbF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCSAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworCisvKgorICAgVGhlIGF0dGFjaCgpIGFuZCBkZXRhY2goKSBlbnRyeSBwb2ludHMgYXJlIHVzZWQgdG8gY3JlYXRlIGFuZCBkZXN0cm95CisgICAiaW5zdGFuY2VzIiBvZiB0aGUgZHJpdmVyLCB3aGVyZSBlYWNoIGluc3RhbmNlIHJlcHJlc2VudHMgZXZlcnl0aGluZworICAgbmVlZGVkIHRvIG1hbmFnZSBvbmUgYWN0dWFsIFBDTUNJQSBjYXJkLgorKi8KKworc3RhdGljIGRldl9saW5rX3QgKmF0bWVsX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIGF0bWVsX2RldGFjaChkZXZfbGlua190ICopOworCisvKgorICAgWW91J2xsIGFsc28gbmVlZCB0byBwcm90b3R5cGUgYWxsIHRoZSBmdW5jdGlvbnMgdGhhdCB3aWxsIGFjdHVhbGx5CisgICBiZSB1c2VkIHRvIHRhbGsgdG8geW91ciBkZXZpY2UuICBTZWUgJ3BjbWVtX2NzJyBmb3IgYSBnb29kIGV4YW1wbGUKKyAgIG9mIGEgZnVsbHkgc2VsZi1zdWZmaWNpZW50IGRyaXZlcjsgdGhlIG90aGVyIGRyaXZlcnMgcmVseSBtb3JlIG9yCisgICBsZXNzIG9uIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwuCisqLworCisvKgorICAgVGhlIGRldl9pbmZvIHZhcmlhYmxlIGlzIHRoZSAia2V5IiB0aGF0IGlzIHVzZWQgdG8gbWF0Y2ggdXAgdGhpcworICAgZGV2aWNlIGRyaXZlciB3aXRoIGFwcHJvcHJpYXRlIGNhcmRzLCB0aHJvdWdoIHRoZSBjYXJkIGNvbmZpZ3VyYXRpb24KKyAgIGRhdGFiYXNlLgorKi8KKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAiYXRtZWxfY3MiOworCisvKgorICAgQSBsaW5rZWQgbGlzdCBvZiAiaW5zdGFuY2VzIiBvZiB0aGUgIGF0bWVsbmV0IGRldmljZS4gIEVhY2ggYWN0dWFsCisgICBQQ01DSUEgY2FyZCBjb3JyZXNwb25kcyB0byBvbmUgZGV2aWNlIGluc3RhbmNlLCBhbmQgaXMgZGVzY3JpYmVkCisgICBieSBvbmUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKGRlZmluZWQgaW4gZHMuaCkuCisKKyAgIFlvdSBtYXkgbm90IHdhbnQgdG8gdXNlIGEgbGlua2VkIGxpc3QgZm9yIHRoaXMgLS0gZm9yIGV4YW1wbGUsIHRoZQorICAgbWVtb3J5IGNhcmQgZHJpdmVyIHVzZXMgYW4gYXJyYXkgb2YgZGV2X2xpbmtfdCBwb2ludGVycywgd2hlcmUgbWlub3IKKyAgIGRldmljZSBudW1iZXJzIGFyZSB1c2VkIHRvIGRlcml2ZSB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBpbmRleC4KKyovCisKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdCA9IE5VTEw7CisKKy8qCisgICBBIGRldl9saW5rX3Qgc3RydWN0dXJlIGhhcyBmaWVsZHMgZm9yIG1vc3QgdGhpbmdzIHRoYXQgYXJlIG5lZWRlZAorICAgdG8ga2VlcCB0cmFjayBvZiBhIHNvY2tldCwgYnV0IHRoZXJlIHdpbGwgdXN1YWxseSBiZSBzb21lIGRldmljZQorICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBhbHNvIG5lZWRzIHRvIGJlIGtlcHQgdHJhY2sgb2YuICBUaGUKKyAgICdwcml2JyBwb2ludGVyIGluIGEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8KKyAgIGEgZGV2aWNlLXNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsIGxpa2UgdGhpcy4KKworICAgQSBkcml2ZXIgbmVlZHMgdG8gcHJvdmlkZSBhIGRldl9ub2RlX3Qgc3RydWN0dXJlIGZvciBlYWNoIGRldmljZQorICAgb24gYSBjYXJkLiAgSW4gc29tZSBjYXNlcywgdGhlcmUgaXMgb25seSBvbmUgZGV2aWNlIHBlciBjYXJkIChmb3IKKyAgIGV4YW1wbGUsIGV0aGVybmV0IGNhcmRzLCBtb2RlbXMpLiAgSW4gb3RoZXIgY2FzZXMsIHRoZXJlIG1heSBiZQorICAgbWFueSBhY3R1YWwgb3IgbG9naWNhbCBkZXZpY2VzIChTQ1NJIGFkYXB0ZXJzLCBtZW1vcnkgY2FyZHMgd2l0aAorICAgbXVsdGlwbGUgcGFydGl0aW9ucykuICBUaGUgZGV2X25vZGVfdCBzdHJ1Y3R1cmVzIG5lZWQgdG8gYmUga2VwdAorICAgaW4gYSBsaW5rZWQgbGlzdCBzdGFydGluZyBhdCB0aGUgJ2RldicgZmllbGQgb2YgYSBkZXZfbGlua190CisgICBzdHJ1Y3R1cmUuICBXZSBhbGxvY2F0ZSB0aGVtIGluIHRoZSBjYXJkJ3MgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSwKKyAgIGJlY2F1c2UgdGhleSBnZW5lcmFsbHkgc2hvdWxkbid0IGJlIGFsbG9jYXRlZCBkeW5hbWljYWxseS4KKworICAgSW4gdGhpcyBjYXNlLCB3ZSBhbHNvIHByb3ZpZGUgYSBmbGFnIHRvIGluZGljYXRlIGlmIGEgZGV2aWNlIGlzCisgICAic3RvcHBlZCIgZHVlIHRvIGEgcG93ZXIgbWFuYWdlbWVudCBldmVudCwgb3IgY2FyZCBlamVjdGlvbi4gIFRoZQorICAgZGV2aWNlIElPIHJvdXRpbmVzIGNhbiB1c2UgYSBmbGFnIGxpa2UgdGhpcyB0byB0aHJvdHRsZSBJTyB0byBhCisgICBjYXJkIHRoYXQgaXMgbm90IHJlYWR5IHRvIGFjY2VwdCBpdC4KKyovCisgICAKK3R5cGVkZWYgc3RydWN0IGxvY2FsX2luZm9fdCB7CisJZGV2X25vZGVfdAlub2RlOworCXN0cnVjdCBuZXRfZGV2aWNlICpldGhfZGV2OworfSBsb2NhbF9pbmZvX3Q7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgYXRtZWxfYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkCisgIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAgCisgIFRoZSBkZXZfbGluayBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseQorICBjb25maWd1cmUgdGhlIGNhcmQgYXQgdGhpcyBwb2ludCAtLSB3ZSB3YWl0IHVudGlsIHdlIHJlY2VpdmUgYQorICBjYXJkIGluc2VydGlvbiBldmVudC4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgZGV2X2xpbmtfdCAqYXRtZWxfYXR0YWNoKHZvaWQpCit7CisJY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisJZGV2X2xpbmtfdCAqbGluazsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCWludCByZXQ7CisJCisJREVCVUcoMCwgImF0bWVsX2F0dGFjaCgpXG4iKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlICovCisJbGluayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsaW5rKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRtZWxfY3M6IG5vIG1lbW9yeSBmb3IgbmV3IGRldmljZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQobGluaywgMCwgc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSk7CisJCisJLyogSW50ZXJydXB0IHNldHVwICovCisJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworCWxpbmstPmlycS5IYW5kbGVyID0gTlVMTDsKKwkKKwkvKgorCSAgR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiBkZWZhdWx0cyBjYW4gZ28gaGVyZS4gIEluIHRoaXMKKwkgIGNsaWVudCwgd2UgYXNzdW1lIHZlcnkgbGl0dGxlLCBhbmQgcmVseSBvbiB0aGUgQ0lTIGZvciBhbG1vc3QKKwkgIGV2ZXJ5dGhpbmcuICBJbiBtb3N0IGNsaWVudHMsIG1hbnkgZGV0YWlscyAoaS5lLiwgbnVtYmVyLCBzaXplcywKKwkgIGFuZCBhdHRyaWJ1dGVzIG9mIElPIHdpbmRvd3MpIGFyZSBmaXhlZCBieSB0aGUgbmF0dXJlIG9mIHRoZQorCSAgZGV2aWNlLCBhbmQgY2FuIGJlIGhhcmQtd2lyZWQgaGVyZS4KKwkqLworCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IDA7CisJbGluay0+Y29uZi5WY2MgPSA1MDsKKwlsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKwkKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgcHJpdmF0ZSBkZXZpY2Utc3BlY2lmaWMgZGF0YSAqLworCWxvY2FsID0ga21hbGxvYyhzaXplb2YobG9jYWxfaW5mb190KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsb2NhbCkgeworCQlwcmludGsoS0VSTl9FUlIgImF0bWVsX2NzOiBubyBtZW1vcnkgZm9yIG5ldyBkZXZpY2VcbiIpOworCQlrZnJlZSAobGluayk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQobG9jYWwsIDAsIHNpemVvZihsb2NhbF9pbmZvX3QpKTsKKwlsaW5rLT5wcml2ID0gbG9jYWw7CisJCisJLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisJbGluay0+bmV4dCA9IGRldl9saXN0OworCWRldl9saXN0ID0gbGluazsKKwljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KKwkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorCQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZhdG1lbF9ldmVudDsKKwljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKwlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwkJYXRtZWxfZGV0YWNoKGxpbmspOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJcmV0dXJuIGxpbms7Cit9IC8qIGF0bWVsX2F0dGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgIHdpdGggQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YQorICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgYXRtZWxfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisJZGV2X2xpbmtfdCAqKmxpbmtwOworCQorCURFQlVHKDAsICJhdG1lbF9kZXRhY2goMHglcClcbiIsIGxpbmspOworCQorCS8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisJZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwkJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKwlpZiAoKmxpbmtwID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCWF0bWVsX3JlbGVhc2UobGluayk7CisJCQorCS8qIEJyZWFrIHRoZSBsaW5rIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCWlmIChsaW5rLT5oYW5kbGUpCisJCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisJLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgcGllY2VzICovCisJKmxpbmtwID0gbGluay0+bmV4dDsKKwlpZiAobGluay0+cHJpdikKKwkJa2ZyZWUobGluay0+cHJpdik7CisJa2ZyZWUobGluayk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgYXRtZWxfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50CisgIGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCisvKiBDYWxsLWJhY2sgZnVuY3Rpb24gdG8gaW50ZXJyb2dhdGUgUENNQ0lBLXNwZWNpZmljIGluZm9ybWF0aW9uCisgICBhYm91dCB0aGUgY3VycmVudCBleGlzdGFuY2Ugb2YgdGhlIGNhcmQgKi8KK3N0YXRpYyBpbnQgY2FyZF9wcmVzZW50KHZvaWQgKmFyZykKK3sgCisJZGV2X2xpbmtfdCAqbGluayA9IChkZXZfbGlua190ICopYXJnOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9TVVNQRU5EKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKQorCQlyZXR1cm4gMTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogbGlzdCBvZiBjYXJkcyB3ZSBrbm93IGFib3V0IGFuZCB0aGVpciBmaXJtd2FyZSByZXF1aXJlbWVudHMuCisgICBHbyBlaXRoZXIgYnkgTWFuZmlkIG9yIHZlcnNpb24gc3RyaW5ncy4KKyAgIENhcmRzIG5vdCBpbiB0aGlzIGxpc3Qgd2lsbCBuZWVkIGEgZmlybXdhcmUgcGFyYW1ldGVyIHRvIHRoZSBtb2R1bGUKKyAgIGluIGFsbCBwcm9iYWJpbGl0eS4gTm90ZSB0aGF0IHRoZSBTTUMgMjYzMiBWMiBhbmQgVjMgaGF2ZSB0aGUgc2FtZQorICAgbWFuZmlkcywgc28gd2UgaWdub3JlIHRob3NlIGFuZCB1c2UgdGhlIHZlcnNpb24xIHN0cmluZ3MuICovCisKK3N0YXRpYyBzdHJ1Y3QgeyAKKwlpbnQgbWFuZiwgY2FyZDsKKwljaGFyICp2ZXIxOworCUF0bWVsRldUeXBlIGZpcm13YXJlOworCWNoYXIgKm5hbWU7Cit9IGNhcmRfdGFibGVbXSA9IHsKKwl7IDAsIDAsICJXTEFOLzgwMi4xMWIgUEMgQ0FSRCIsIEFUTUVMX0ZXX1RZUEVfNTAyRCwgIkFjdGlvbnRlYyA4MDJDQVQxIiB9LCAgCisJeyAwLCAwLCAiQVRNRUwvQVQ3NkM1MDJBUiIsIEFUTUVMX0ZXX1RZUEVfNTAyLCAiTm9OYW1lLVJGTUQiIH0sIAorCXsgMCwgMCwgIkFUTUVML0FUNzZDNTAyQVJfRCIsIEFUTUVMX0ZXX1RZUEVfNTAyRCwgIk5vTmFtZS1yZXZEIiB9LCAKKwl7IDAsIDAsICJBVE1FTC9BVDc2QzUwMkFSX0UiLCBBVE1FTF9GV19UWVBFXzUwMkUsICJOb05hbWUtcmV2RSIgfSwKKwl7IDAsIDAsICJBVE1FTC9BVDc2QzUwNCIsIEFUTUVMX0ZXX1RZUEVfNTA0LCAiTm9OYW1lLTUwNCIgfSwKKwl7IDAsIDAsICJBVE1FTC9BVDc2QzUwNEEiLCBBVE1FTF9GV19UWVBFXzUwNEFfMjk1OCwgIk5vTmFtZS01MDRhLTI5NTgiIH0sCisJeyAwLCAwLCAiQVRNRUwvQVQ3NkM1MDRfUiIsIEFUTUVMX0ZXX1RZUEVfNTA0XzI5NTgsICJOb05hbWUtNTA0LTI5NTgiIH0sCisJeyBNQU5GSURfM0NPTSwgMHgwNjIwLCBOVUxMLCBBVE1FTF9GV19UWVBFXzUwMl8zQ09NLCAiM2NvbSAzQ1JXRTYyMDkyQiIgfSwgCisJeyBNQU5GSURfM0NPTSwgMHgwNjk2LCBOVUxMLCBBVE1FTF9GV19UWVBFXzUwMl8zQ09NLCAiM2NvbSAzQ1JTSFBXMTk2IiB9LCAKKwl7IDAsIDAsICJTTUMvMjYzMlctVjIiLCBBVE1FTF9GV19UWVBFXzUwMiwgIlNNQyAyNjMyVy1WMiIgfSwKKwl7IDAsIDAsICJTTUMvMjYzMlciLCBBVE1FTF9GV19UWVBFXzUwMkQsICJTTUMgMjYzMlctVjMiIH0sCisJeyAweGQ2MDEsIDB4MDAwNywgTlVMTCwgQVRNRUxfRldfVFlQRV81MDIsICJTaXRlY29tIFdMQU4tMDExIiB9LCAKKwl7IDB4MDFiZiwgMHgzMzAyLCBOVUxMLCBBVE1FTF9GV19UWVBFXzUwMkUsICJCZWxraW4gRjVENjAyMC1WMiIgfSwgCisJeyAwLCAwLCAiQlQvVm95YWdlciAxMDIwIExhcHRvcCBBZGFwdGVyIiwgQVRNRUxfRldfVFlQRV81MDIsICJCVCBWb3lhZ2VyIDEwMjAiIH0sCisJeyAwLCAwLCAiSUVFRSA4MDIuMTFiL1dpcmVsZXNzIExBTiBQQyBDYXJkIiwgQVRNRUxfRldfVFlQRV81MDIsICJTaWVtZW5zIEdpZ2FzZXQgUEMgQ2FyZCBJSSIgfSwKKwl7IDAsIDAsICJDTmV0L0NOV0xDIDExTWJwcyBXaXJlbGVzcyBQQyBDYXJkIFYtNSIsIEFUTUVMX0ZXX1RZUEVfNTAyRSwgIkNOZXQgQ05XTEMtODExQVJMIiB9LAorCXsgMCwgMCwgIldpcmVsZXNzL1BDX0NBUkQiLCBBVE1FTF9GV19UWVBFXzUwMkQsICJQbGFuZXQgV0wtMzU1MiIgfSwKKwl7IDAsIDAsICJPRU0vMTFNYnBzIFdpcmVsZXNzIExBTiBQQyBDYXJkIFYtMyIsIEFUTUVMX0ZXX1RZUEVfNTAyLCAiT0VNIDExTWJwcyBXTEFOIFBDTUNJQSBDYXJkIiB9LAorCXsgMCwgMCwgIjExV0FWRS8xMVdQNjExQUwtRSIsIEFUTUVMX0ZXX1RZUEVfNTAyRSwgIjExV0FWRSBXYXZlQnVkZHkiIH0sCisJeyAwLCAwLCAiTEcvTFcyMTAwTiIsIEFUTUVMX0ZXX1RZUEVfNTAyRSwgIkxHIExXMjEwME4gMTFNYnBzIFdMQU4gUENNQ0lBIENhcmQiIH0sCit9OworCitzdGF0aWMgdm9pZCBhdG1lbF9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKwljbGllbnRfaGFuZGxlX3QgaGFuZGxlOworCXR1cGxlX3QgdHVwbGU7CisJY2lzcGFyc2VfdCBwYXJzZTsKKwlsb2NhbF9pbmZvX3QgKmRldjsKKwlpbnQgbGFzdF9mbiwgbGFzdF9yZXQ7CisJdV9jaGFyIGJ1Zls2NF07CisJaW50IGNhcmRfaW5kZXggPSAtMSwgZG9uZSA9IDA7CisJCisJaGFuZGxlID0gbGluay0+aGFuZGxlOworCWRldiA9IGxpbmstPnByaXY7CisKKwlERUJVRygwLCAiYXRtZWxfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKwkKKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5UdXBsZURhdGEgPSBidWY7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCQorCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7CisJaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpID09IDApIHsKKwkJaW50IGk7CisJCWNpc3RwbF9tYW5maWRfdCAqbWFuZmlkOworCQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCQltYW5maWQgPSAmKHBhcnNlLm1hbmZpZCk7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2FyZF90YWJsZSkvc2l6ZW9mKGNhcmRfdGFibGVbMF0pOyBpKyspIHsKKwkJCWlmICghY2FyZF90YWJsZVtpXS52ZXIxICYmCisJCQkgICAgbWFuZmlkLT5tYW5mID09IGNhcmRfdGFibGVbaV0ubWFuZiAmJgorCQkJICAgIG1hbmZpZC0+Y2FyZCA9PSBjYXJkX3RhYmxlW2ldLmNhcmQpIHsKKwkJCQljYXJkX2luZGV4ID0gaTsKKwkJCQlkb25lID0gMTsKKwkJCX0KKwkJfQorCX0KKworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7CisJaWYgKCFkb25lICYmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSA9PSAwKSkgeworCQlpbnQgaSwgaiwgazsKKwkJY2lzdHBsX3ZlcnNfMV90ICp2ZXIxOworCQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCQl2ZXIxID0gJihwYXJzZS52ZXJzaW9uXzEpOworCQkKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihjYXJkX3RhYmxlKS9zaXplb2YoY2FyZF90YWJsZVswXSk7IGkrKykgeworCQkJZm9yIChqID0gMDsgaiA8IHZlcjEtPm5zOyBqKyspIHsKKwkJCQljaGFyICpwID0gY2FyZF90YWJsZVtpXS52ZXIxOworCQkJCWNoYXIgKnEgPSAmdmVyMS0+c3RyW3ZlcjEtPm9mc1tqXV07CisJCQkJaWYgKCFwKQorCQkJCQlnb3RvIG1pc21hdGNoOworCQkJCWZvciAoayA9IDA7IGsgPCBqOyBrKyspIHsKKwkJCQkJd2hpbGUgKCgqcCAhPSAnXDAnKSAmJiAoKnAgIT0gJy8nKSkgcCsrOworCQkJCQlpZiAoKnAgPT0gJ1wwJykgeworCQkJCQkJaWYgKCpxICE9ICdcMCcpCisJCQkJCQkJZ290byBtaXNtYXRjaDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXArKzsKKwkJCQkJfQorCQkJCX0KKwkJCQl3aGlsZSgoKnEgIT0gJ1wwJykgJiYgKCpwICE9ICdcMCcpICYmIAorCQkJCSAgICAgICgqcCAhPSAnLycpICYmICgqcCA9PSAqcSkpIHArKywgcSsrOworCQkJCWlmICgoKCpwICE9ICdcMCcpICYmICpwICE9ICcvJykgfHwgKnEgIT0gJ1wwJykKKwkJCQkJZ290byBtaXNtYXRjaDsKKwkJCX0KKwkJCWNhcmRfaW5kZXggPSBpOworCQkJYnJlYWs7CS8qIGRvbmUgKi8KKwkJCQorCQltaXNtYXRjaDoKKwkJCWogPSAwOyAvKiBkdW1teSBzdG10IHRvIHNodXQgdXAgY29tcGlsZXIgKi8KKwkJfQorCX0JCQorCisJLyoKKwkgIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbgorCSAgcmVnaXN0ZXJzLgorCSovCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKwkKKwkvKiBDb25maWd1cmUgY2FyZCAqLworCWxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisJCisJLyoKKwkgIEluIHRoaXMgbG9vcCwgd2Ugc2NhbiB0aGUgQ0lTIGZvciBjb25maWd1cmF0aW9uIHRhYmxlIGVudHJpZXMsCisJICBlYWNoIG9mIHdoaWNoIGRlc2NyaWJlcyBhIHZhbGlkIGNhcmQgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nCisJICB2b2x0YWdlLCBJTyB3aW5kb3csIG1lbW9yeSB3aW5kb3csIGFuZCBpbnRlcnJ1cHQgc2V0dGluZ3MuCisJICAKKwkgIFdlIG1ha2Ugbm8gYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGNhcmQgdG8gYmUgY29uZmlndXJlZDogd2UgdXNlCisJICBqdXN0IHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgaW4gdGhlIENJUy4gIEluIGFuIGlkZWFsIHdvcmxkLAorCSAgdGhpcyB3b3VsZCB3b3JrIGZvciBhbnkgUENNQ0lBIGNhcmQsIGJ1dCBpdCByZXF1aXJlcyBhIGNvbXBsZXRlCisJICBhbmQgYWNjdXJhdGUgQ0lTLiAgSW4gcHJhY3RpY2UsIGEgZHJpdmVyIHVzdWFsbHkgImtub3dzIiBtb3N0IG9mCisJICB0aGVzZSB0aGluZ3Mgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBDSVMsIGFuZCBtb3N0IGNsaWVudCBkcml2ZXJzCisJICB3aWxsIG9ubHkgdXNlIHRoZSBDSVMgdG8gZmlsbCBpbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGRldGFpbHMuCisJKi8KKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJd2hpbGUgKDEpIHsKKwkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCBkZmx0ID0geyAwIH07CisJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeSk7CisJCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpICE9IDAgfHwKKwkJCQlwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gMCkKKwkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJCisJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkgZGZsdCA9ICpjZmc7CisJCWlmIChjZmctPmluZGV4ID09IDApIGdvdG8gbmV4dF9lbnRyeTsKKwkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7CisJCQorCQkvKiBEb2VzIHRoaXMgY2FyZCBuZWVkIGF1ZGlvIG91dHB1dD8gKi8KKwkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9BVURJTykgeworCQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7CisJCQlsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOworCQl9CisJCQorCQkvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KKwkJLyogIE5vdGUgdGhhdCB0aGUgQ0lTIHZhbHVlcyBuZWVkIHRvIGJlIHJlc2NhbGVkICovCisJCWlmIChjZmctPnZjYy5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVmNjID0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCQllbHNlIGlmIChkZmx0LnZjYy5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVmNjID0gZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCQkKKwkJaWYgKGNmZy0+dnBwMS5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9CisJCQkJY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKKwkJZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQorCQkJbGluay0+Y29uZi5WcHAxID0gbGluay0+Y29uZi5WcHAyID0KKwkJCQlkZmx0LnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCQkKKwkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCisJCWlmIChjZmctPmlycS5JUlFJbmZvMSB8fCBkZmx0LmlycS5JUlFJbmZvMSkKKwkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisJCQorCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KKwkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKKwkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKKwkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKKwkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCisJCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7CisJCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkJCWlmIChpby0+bndpbiA+IDEpIHsKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IGxpbmstPmlvLkF0dHJpYnV0ZXMxOworCQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJCX0KKwkJfQorCQkKKwkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KKwkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSAhPSAwKQorCQkJZ290byBuZXh0X2VudHJ5OworCisJCS8qIElmIHdlIGdvdCB0aGlzIGZhciwgd2UncmUgY29vbCEgKi8KKwkJYnJlYWs7CisJCQorCW5leHRfZW50cnk6CisJCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJfQorCQorCS8qCisJICBBbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFzc2lnbiBhCisJICBoYW5kbGVyIHRvIHRoZSBpbnRlcnJ1cHQsIHVubGVzcyB0aGUgJ0hhbmRsZXInIG1lbWJlciBvZiB0aGUKKwkgIGlycSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQuCisJKi8KKwlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKQorCQlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKSk7CisJCisJLyoKKwkgIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCisJICB0aGUgSS9PIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZywgYW5kIHB1dHRpbmcgdGhlCisJICBjYXJkIGFuZCBob3N0IGludGVyZmFjZSBpbnRvICJNZW1vcnkgYW5kIElPIiBtb2RlLgorCSovCisJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOworCQorCWlmIChsaW5rLT5pcnEuQXNzaWduZWRJUlEgPT0gMCkgeworCQlwcmludGsoS0VSTl9BTEVSVCAKKwkJICAgICAgICJhdG1lbDogY2Fubm90IGFzc2lnbiBJUlE6IGNoZWNrIHRoYXQgQ09ORklHX0lTQSBpcyBzZXQgaW4ga2VybmVsIGNvbmZpZy4iKTsKKwkJZ290byBjc19mYWlsZWQ7CisJfQorICAgICAgIAorCSgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldiA9IAorCQlpbml0X2F0bWVsX2NhcmQobGluay0+aXJxLkFzc2lnbmVkSVJRLAorCQkJCWxpbmstPmlvLkJhc2VQb3J0MSwKKwkJCQljYXJkX2luZGV4ID09IC0xID8gQVRNRUxfRldfVFlQRV9OT05FIDogIGNhcmRfdGFibGVbY2FyZF9pbmRleF0uZmlybXdhcmUsCisJCQkJJmhhbmRsZV90b19kZXYoaGFuZGxlKSwKKwkJCQljYXJkX3ByZXNlbnQsIAorCQkJCWxpbmspOworCWlmICghKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2KSAKKwkJZ290byBjc19mYWlsZWQ7CisJCisJLyoKKwkgIEF0IHRoaXMgcG9pbnQsIHRoZSBkZXZfbm9kZV90IHN0cnVjdHVyZShzKSBuZWVkIHRvIGJlCisJICBpbml0aWFsaXplZCBhbmQgYXJyYW5nZWQgaW4gYSBsaW5rZWQgbGlzdCBhdCBsaW5rLT5kZXYuCisJKi8KKwlzdHJjcHkoZGV2LT5ub2RlLmRldl9uYW1lLCAoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYtPm5hbWUgKTsKKwlkZXYtPm5vZGUubWFqb3IgPSBkZXYtPm5vZGUubWlub3IgPSAwOworCWxpbmstPmRldiA9ICZkZXYtPm5vZGU7CisJCisJLyogRmluYWxseSwgcmVwb3J0IHdoYXQgd2UndmUgZG9uZSAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyVzaW5kZXggMHglMDJ4OiBWY2MgJWQuJWQiLAorCSAgICAgICBkZXYtPm5vZGUuZGV2X25hbWUsCisJICAgICAgIGNhcmRfaW5kZXggPT0gLTEgPyAiIiA6ICBjYXJkX3RhYmxlW2NhcmRfaW5kZXhdLm5hbWUsCisJICAgICAgIGNhcmRfaW5kZXggPT0gLTEgPyAiIiA6ICIgIiwKKwkgICAgICAgbGluay0+Y29uZi5Db25maWdJbmRleCwKKwkgICAgICAgbGluay0+Y29uZi5WY2MvMTAsIGxpbmstPmNvbmYuVmNjJTEwKTsKKwlpZiAobGluay0+Y29uZi5WcHAxKQorCQlwcmludGsoIiwgVnBwICVkLiVkIiwgbGluay0+Y29uZi5WcHAxLzEwLCBsaW5rLT5jb25mLlZwcDElMTApOworCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCisJCXByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCisJCXByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAorCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQxK2xpbmstPmlvLk51bVBvcnRzMS0xKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMyKQorCQlwcmludGsoIiAmIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDIsCisJCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDIrbGluay0+aW8uTnVtUG9ydHMyLTEpOworCXByaW50aygiXG4iKTsKKwkKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworCXJldHVybjsKKwkKKyBjc19mYWlsZWQ6CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CisJYXRtZWxfcmVsZWFzZShsaW5rKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgYXRtZWxfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUKKyAgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGF0bWVsX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2OworCQkKKwlERUJVRygwLCAiYXRtZWxfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisJCisJLyogVW5saW5rIHRoZSBkZXZpY2UgY2hhaW4gKi8KKwlsaW5rLT5kZXYgPSBOVUxMOworCQorCWlmIChkZXYpIAorCQlzdG9wX2F0bWVsX2NhcmQoZGV2LCAwKTsKKwkoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYgPSBOVUxMOyAKKwkKKwkvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXNlIHN1Y2NlZWQgb3Igbm90ICovCisJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCisJCXBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlpZiAobGluay0+aXJxLkFzc2lnbmVkSVJRKQorCQlwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAgc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLgorCisgIFdoZW4gYSBDQVJEX1JFTU9WQUwgZXZlbnQgaXMgcmVjZWl2ZWQsIHdlIGltbWVkaWF0ZWx5IHNldCBhCisgIHByaXZhdGUgZmxhZyB0byBibG9jayBmdXR1cmUgYWNjZXNzZXMgdG8gdGhpcyBkZXZpY2UuICBBbGwgdGhlCisgIGZ1bmN0aW9ucyB0aGF0IGFjdHVhbGx5IGFjY2VzcyB0aGUgZGV2aWNlIHNob3VsZCBjaGVjayB0aGlzIGZsYWcKKyAgdG8gbWFrZSBzdXJlIHRoZSBjYXJkIGlzIHN0aWxsIHByZXNlbnQuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBhdG1lbF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCSAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKwlkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IGxpbmstPnByaXY7CisJCisJREVCVUcoMSwgImF0bWVsX2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKwkKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChsb2NhbC0+ZXRoX2Rldik7CisJCQlhdG1lbF9yZWxlYXNlKGxpbmspOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCQlhdG1lbF9jb25maWcobGluayk7CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCW5ldGlmX2RldmljZV9kZXRhY2gobG9jYWwtPmV0aF9kZXYpOworCQkJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkJCWF0bWVsX29wZW4obG9jYWwtPmV0aF9kZXYpOworCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChsb2NhbC0+ZXRoX2Rldik7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfSAvKiBhdG1lbF9ldmVudCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBhdG1lbF9kcml2ZXIgPSB7CisgICAgICAgIC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorICAgICAgICAuZHJ2ICAgICAgICAgICAgPSB7CisgICAgICAgICAgICAgICAgLm5hbWUgICA9ICJhdG1lbF9jcyIsCisgICAgICAgIH0sCisgICAgICAgIC5hdHRhY2ggICAgICAgICA9IGF0bWVsX2F0dGFjaCwKKyAgICAgICAgLmRldGFjaCAgICAgICAgID0gYXRtZWxfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBhdG1lbF9jc19pbml0KHZvaWQpCit7CisgICAgICAgIHJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZhdG1lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9jc19jbGVhbnVwKHZvaWQpCit7CisgICAgICAgIHBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmYXRtZWxfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKKy8qCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAgICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBJbiBhZGRpdGlvbjoKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICAgIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgICAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgICAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICAgIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAgIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAgICBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAgICBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gICAgCisqLworCittb2R1bGVfaW5pdChhdG1lbF9jc19pbml0KTsKK21vZHVsZV9leGl0KGF0bWVsX2NzX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWIwMGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfcGNpLmMKQEAgLTAsMCArMSw4OSBAQAorLyoqKiAtKi0gbGludXgtYyAtKi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgIERyaXZlciBmb3IgQXRtZWwgYXQ3NmM1MDIgYXQ3NmM1MDQgYW5kIGF0NzZjNTA2IHdpcmVsZXNzIGNhcmRzLgorCisgICAgICAgICBDb3B5cmlnaHQgMjAwNCBTaW1vbiBLZWxsZXkuCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggQXRtZWwgd2lyZWxlc3MgbGFuIGRyaXZlcnM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSAiYXRtZWwuaCIKKworTU9EVUxFX0FVVEhPUigiU2ltb24gS2VsbGV5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1cHBvcnQgZm9yIEF0bWVsIGF0NzZjNTB4IDgwMi4xMSB3aXJlbGVzcyBldGhlcm5ldCBjYXJkcy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJBdG1lbCBhdDc2YzUwNiBQQ0kgd2lyZWxlc3MgY2FyZHMiKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNhcmRfaWRzW10gPSB7CisJeyAweDExMTQsIDB4MDUwNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNhcmRfaWRzKTsKKworc3RhdGljIGludCBhdG1lbF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBhdG1lbF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICopOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYXRtZWxfZHJpdmVyID0geworCS5uYW1lICAgICA9ICJhdG1lbCIsCisJLmlkX3RhYmxlID0gY2FyZF9pZHMsCisJLnByb2JlICAgID0gYXRtZWxfcGNpX3Byb2JlLAorCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKGF0bWVsX3BjaV9yZW1vdmUpLAorfTsKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdG1lbF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQkKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCXJldHVybiAtRU5PREVWOworCQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCQorCWRldiA9IGluaXRfYXRtZWxfY2FyZChwZGV2LT5pcnEsIHBkZXYtPnJlc291cmNlWzFdLnN0YXJ0LCAKKwkJCSAgICAgIEFUTUVMX0ZXX1RZUEVfNTA2LAorCQkJICAgICAgJnBkZXYtPmRldiwgTlVMTCwgTlVMTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCQorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYXRtZWxfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdG9wX2F0bWVsX2NhcmQocGNpX2dldF9kcnZkYXRhKHBkZXYpLCAxKTsKK30KKworc3RhdGljIGludCBfX2luaXQgYXRtZWxfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZhdG1lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRtZWxfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmF0bWVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGF0bWVsX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGF0bWVsX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaGVybWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFjM2QwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5jCkBAIC0wLDAgKzEsNTU0IEBACisvKiBoZXJtZXMuYworICoKKyAqIERyaXZlciBjb3JlIGZvciB0aGUgIkhlcm1lcyIgd2lyZWxlc3MgTUFDIGNvbnRyb2xsZXIsIGFzIHVzZWQgaW4KKyAqIHRoZSBMdWNlbnQgT3Jpbm9jbyBhbmQgQ2FibGV0cm9uIFJvYW1BYm91dCBjYXJkcy4gSXQgc2hvdWxkIGFsc28KKyAqIHdvcmsgb24gdGhlIGhmYTM4NDEgYW5kIGhmYTM4NDIgTUFDIGNvbnRyb2xsZXIgY2hpcHMgdXNlZCBpbiB0aGUKKyAqIFByaXNtIElJIGNoaXBzZXRzLgorICoKKyAqIFRoaXMgaXMgbm90IGEgY29tcGxldGUgZHJpdmVyLCBqdXN0IGxvdy1sZXZlbCBhY2Nlc3Mgcm91dGluZXMgZm9yCisgKiB0aGUgTUFDIGNvbnRyb2xsZXIgaXRzZWxmLgorICoKKyAqIEJhc2VkIG9uIHRoZSBwcmlzbTIgZHJpdmVyIGZyb20gQWJzb2x1dGUgVmFsdWUgU3lzdGVtcycgbGludXgtd2xhbgorICogcHJvamVjdCwgdGhlIExpbnV4IHd2bGFuX2NzIGRyaXZlciwgTHVjZW50J3MgSENGLUxpZ2h0CisgKiAod3ZsYW5faGNmLmMpIGxpYnJhcnksIGFuZCB0aGUgTmV0QlNEIHdpcmVsZXNzIGRyaXZlciAoaW4gbm8KKyAqIHBhcnRpY3VsYXIgb3JkZXIpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgRGF2aWQgR2lic29uLCBMaW51eGNhcmUgQXVzdHJhbGlhLgorICogKEMpIENvcHlyaWdodCBEYXZpZCBHaWJzb24sIElCTSBDb3JwLiAyMDAxLTIwMDMuCisgKiAKKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4KKyAqIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKyAqCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiCisgKiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlCisgKiB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQorICogYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIKKyAqIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkKKyAqIGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZAorICogb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlCisgKiBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKyNpbmNsdWRlICJoZXJtZXMuaCIKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJMb3ctbGV2ZWwgZHJpdmVyIGhlbHBlciBmb3IgTHVjZW50IEhlcm1lcyBjaGlwc2V0IGFuZCBQcmlzbSBJSSBIRkEzODR4IHdpcmVsZXNzIE1BQyBjb250cm9sbGVyIik7CitNT0RVTEVfQVVUSE9SKCJQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPiIKKwkiICYgRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOworCisvKiBUaGVzZSBhcmUgbWF4aW11bSB0aW1lb3V0cy4gTW9zdCBvZnRlbiwgY2FyZCB3aWwgcmVhY3QgbXVjaCBmYXN0ZXIgKi8KKyNkZWZpbmUgQ01EX0JVU1lfVElNRU9VVCAoMTAwKSAvKiBJbiBpdGVyYXRpb25zIG9mIH4xdXMgKi8KKyNkZWZpbmUgQ01EX0lOSVRfVElNRU9VVCAoNTAwMDApIC8qIGluIGl0ZXJhdGlvbnMgb2YgfjEwdXMgKi8KKyNkZWZpbmUgQ01EX0NPTVBMX1RJTUVPVVQgKDIwMDAwKSAvKiBpbiBpdGVyYXRpb25zIG9mIH4xMHVzICovCisjZGVmaW5lIEFMTE9DX0NPTVBMX1RJTUVPVVQgKDEwMDApIC8qIGluIGl0ZXJhdGlvbnMgb2YgfjEwdXMgKi8KKworLyoKKyAqIERlYnVnZ2luZyBoZWxwZXJzCisgKi8KKworI2RlZmluZSBETVNHKHN0dWZmLi4uKSBkbyB7cHJpbnRrKEtFUk5fREVCVUcgImhlcm1lcyBAICVwOiAiICwgaHctPmlvYmFzZSk7IFwKKwkJCXByaW50ayhzdHVmZik7fSB3aGlsZSAoMCkKKworI3VuZGVmIEhFUk1FU19ERUJVRworI2lmZGVmIEhFUk1FU19ERUJVRworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjZGVmaW5lIERFQlVHKGx2bCwgc3R1ZmYuLi4pIGlmICggKGx2bCkgPD0gSEVSTUVTX0RFQlVHKSBETVNHKHN0dWZmKQorCisjZWxzZSAvKiAhIEhFUk1FU19ERUJVRyAqLworCisjZGVmaW5lIERFQlVHKGx2bCwgc3R1ZmYuLi4pIGRvIHsgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qICEgSEVSTUVTX0RFQlVHICovCisKKworLyoKKyAqIEludGVybmFsIGZ1bmN0aW9ucworICovCisKKy8qIElzc3VlIGEgY29tbWFuZCB0byB0aGUgY2hpcC4gV2FpdGluZyBmb3IgaXQgdG8gY29tcGxldGUgaXMgdGhlIGNhbGxlcidzCisgICBwcm9ibGVtLgorCisgICBSZXR1cm5zIC1FQlVTWSBpZiB0aGUgY29tbWFuZCByZWdpc3RlciBpcyBidXN5LCAwIG9uIHN1Y2Nlc3MuCisKKyAgIENhbGxhYmxlIGZyb20gYW55IGNvbnRleHQuCisqLworc3RhdGljIGludCBoZXJtZXNfaXNzdWVfY21kKGhlcm1lc190ICpodywgdTE2IGNtZCwgdTE2IHBhcmFtMCkKK3sKKwlpbnQgayA9IENNRF9CVVNZX1RJTUVPVVQ7CisJdTE2IHJlZzsKKworCS8qIEZpcnN0IHdhaXQgZm9yIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHRvIHVuYnVzeSAqLworCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIENNRCk7CisJd2hpbGUgKCAocmVnICYgSEVSTUVTX0NNRF9CVVNZKSAmJiBrICkgeworCQlrLS07CisJCXVkZWxheSgxKTsKKwkJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgQ01EKTsKKwl9CisJaWYgKHJlZyAmIEhFUk1FU19DTURfQlVTWSkgeworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWhlcm1lc193cml0ZV9yZWduKGh3LCBQQVJBTTIsIDApOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBQQVJBTTEsIDApOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBQQVJBTTAsIHBhcmFtMCk7CisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIENNRCwgY21kKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGRlZmluaXRpb25zCisgKi8KKwordm9pZCBoZXJtZXNfc3RydWN0X2luaXQoaGVybWVzX3QgKmh3LCB2b2lkIF9faW9tZW0gKmFkZHJlc3MsIGludCByZWdfc3BhY2luZykKK3sKKwlody0+aW9iYXNlID0gYWRkcmVzczsKKwlody0+cmVnX3NwYWNpbmcgPSByZWdfc3BhY2luZzsKKwlody0+aW50ZW4gPSAweDA7CisKKyNpZmRlZiBIRVJNRVNfREVCVUdfQlVGRkVSCisJaHctPmRidWZwID0gMDsKKwltZW1zZXQoJmh3LT5kYnVmLCAweGZmLCBzaXplb2YoaHctPmRidWYpKTsKKwltZW1zZXQoJmh3LT5wcm9maWxlLCAwLCBzaXplb2YoaHctPnByb2ZpbGUpKTsKKyNlbmRpZgorfQorCitpbnQgaGVybWVzX2luaXQoaGVybWVzX3QgKmh3KQoreworCXUxNiBzdGF0dXMsIHJlZzsKKwlpbnQgZXJyID0gMDsKKwlpbnQgazsKKworCS8qIFdlIGRvbid0IHdhbnQgdG8gYmUgaW50ZXJydXB0ZWQgd2hpbGUgcmVzZXR0aW5nIHRoZSBjaGlwc2V0ICovCisJaHctPmludGVuID0gMHgwOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBJTlRFTiwgMCk7CisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEVWQUNLLCAweGZmZmYpOworCisJLyogTm9ybWFsbHkgaXQncyBhICJjYW4ndCBoYXBwZW4iIGZvciB0aGUgY29tbWFuZCByZWdpc3RlciB0bworICAgICAgICAgICBiZSBidXN5IHdoZW4gd2UgZ28gdG8gaXNzdWUgYSBjb21tYW5kIGJlY2F1c2Ugd2UgYXJlCisgICAgICAgICAgIHNlcmlhbGl6aW5nIGFsbCBjb21tYW5kcy4gIEhvd2V2ZXIgd2Ugd2FudCB0byBoYXZlIHNvbWUKKyAgICAgICAgICAgY2hhbmNlIG9mIHJlc2V0dGluZyB0aGUgY2FyZCBldmVuIGlmIGl0IGdldHMgaW50byBhIHN0dXBpZAorICAgICAgICAgICBzdGF0ZSwgc28gd2UgYWN0dWFsbHkgd2FpdCB0byBzZWUgaWYgdGhlIGNvbW1hbmQgcmVnaXN0ZXIKKyAgICAgICAgICAgd2lsbCB1bmJ1c3kgaXRzZWxmIGhlcmUuICovCisJayA9IENNRF9CVVNZX1RJTUVPVVQ7CisJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgQ01EKTsKKwl3aGlsZSAoayAmJiAocmVnICYgSEVSTUVTX0NNRF9CVVNZKSkgeworCQlpZiAocmVnID09IDB4ZmZmZikgLyogU3BlY2lhbCBjYXNlIC0gdGhlIGNhcmQgaGFzIHByb2JhYmx5IGJlZW4gcmVtb3ZlZCwKKwkJCQkgICAgICBzbyBkb24ndCB3YWl0IGZvciB0aGUgdGltZW91dCAqLworCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJay0tOworCQl1ZGVsYXkoMSk7CisJCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIENNRCk7CisJfQorCQorCS8qIE5vIG5lZWQgdG8gZXhwbGljaXRseSBoYW5kbGUgdGhlIHRpbWVvdXQgLSBpZiB3ZSd2ZSB0aW1lZAorCSAgIG91dCBoZXJtZXNfaXNzdWVfY21kKCkgd2lsbCBwcm9iYWJseSByZXR1cm4gLUVCVVNZIGJlbG93ICovCisKKwkvKiBBY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50YXRpb24sIEVWU1RBVCBtYXkgY29udGFpbgorCSAgIG9ic29sZXRlIGV2ZW50IG9jY3VycmVuY2UgaW5mb3JtYXRpb24uICBXZSBoYXZlIHRvIGFja25vd2xlZGdlCisJICAgaXQgYnkgd3JpdGluZyBFVkFDSy4gKi8KKwlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBFVkFDSywgcmVnKTsKKworCS8qIFdlIGRvbid0IHVzZSBoZXJtZXNfZG9jbWRfd2FpdCBoZXJlLCBiZWNhdXNlIHRoZSByZXNldCB3aXBlcworCSAgIHRoZSBtYWdpYyBjb25zdGFudCBpbiBTV1NVUFBPUlQwIGF3YXksIGFuZCBpdCBnZXRzIGNvbmZ1c2VkICovCisJZXJyID0gaGVybWVzX2lzc3VlX2NtZChodywgSEVSTUVTX0NNRF9JTklULCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKTsKKwlrID0gQ01EX0lOSVRfVElNRU9VVDsKKwl3aGlsZSAoICghIChyZWcgJiBIRVJNRVNfRVZfQ01EKSkgJiYgaykgeworCQlrLS07CisJCXVkZWxheSgxMCk7CisJCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIEVWU1RBVCk7CisJfQorCisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIFNXU1VQUE9SVDAsIEhFUk1FU19NQUdJQyk7CisKKwlpZiAoISBoZXJtZXNfcHJlc2VudChodykpIHsKKwkJREVCVUcoMCwgImhlcm1lcyBAIDB4JXg6IENhcmQgcmVtb3ZlZCBkdXJpbmcgcmVzZXQuXG4iLAorCQkgICAgICAgaHctPmlvYmFzZSk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKwkJCisJaWYgKCEgKHJlZyAmIEhFUk1FU19FVl9DTUQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGVybWVzIEAgJXA6ICIgCisJCSAgICAgICAiVGltZW91dCB3YWl0aW5nIGZvciBjYXJkIHRvIHJlc2V0IChyZWc9MHglMDR4KSFcbiIsCisJCSAgICAgICBody0+aW9iYXNlLCByZWcpOworCQllcnIgPSAtRVRJTUVET1VUOworCQlnb3RvIG91dDsKKwl9CisKKwlzdGF0dXMgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBTVEFUVVMpOworCisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEVWQUNLLCBIRVJNRVNfRVZfQ01EKTsKKworCWlmIChzdGF0dXMgJiBIRVJNRVNfU1RBVFVTX1JFU1VMVCkKKwkJZXJyID0gLUVJTzsKKworIG91dDoKKwlyZXR1cm4gZXJyOworfQorCisvKiBJc3N1ZSBhIGNvbW1hbmQgdG8gdGhlIGNoaXAsIGFuZCAoYnVzeSEpIHdhaXQgZm9yIGl0IHRvCisgKiBjb21wbGV0ZS4KKyAqCisgKiBSZXR1cm5zOiA8IDAgb24gaW50ZXJuYWwgZXJyb3IsIDAgb24gc3VjY2VzcywgPiAwIG9uIGVycm9yIHJldHVybmVkIGJ5IHRoZSBmaXJtd2FyZQorICoKKyAqIENhbGxhYmxlIGZyb20gYW55IGNvbnRleHQsIGJ1dCBsb2NraW5nIGlzIHlvdXIgcHJvYmxlbS4gKi8KK2ludCBoZXJtZXNfZG9jbWRfd2FpdChoZXJtZXNfdCAqaHcsIHUxNiBjbWQsIHUxNiBwYXJtMCwKKwkJICAgICAgc3RydWN0IGhlcm1lc19yZXNwb25zZSAqcmVzcCkKK3sKKwlpbnQgZXJyOworCWludCBrOworCXUxNiByZWc7CisJdTE2IHN0YXR1czsKKworCWVyciA9IGhlcm1lc19pc3N1ZV9jbWQoaHcsIGNtZCwgcGFybTApOworCWlmIChlcnIpIHsKKwkJaWYgKCEgaGVybWVzX3ByZXNlbnQoaHcpKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImhlcm1lcyBAICVwOiAiCisJCQkJICAgICAgICJDYXJkIHJlbW92ZWQgd2hpbGUgaXNzdWluZyBjb21tYW5kICIKKwkJCQkgICAgICAgIjB4JTA0eC5cbiIsIGh3LT5pb2Jhc2UsIGNtZCk7CisJCQllcnIgPSAtRU5PREVWOworCQl9IGVsc2UgCisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX0VSUiAiaGVybWVzIEAgJXA6ICIKKwkJCQkgICAgICAgIkVycm9yICVkIGlzc3VpbmcgY29tbWFuZCAweCUwNHguXG4iLAorCQkJCSAgICAgICBody0+aW9iYXNlLCBlcnIsIGNtZCk7CisJCWdvdG8gb3V0OworCX0KKworCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIEVWU1RBVCk7CisJayA9IENNRF9DT01QTF9USU1FT1VUOworCXdoaWxlICggKCEgKHJlZyAmIEhFUk1FU19FVl9DTUQpKSAmJiBrKSB7CisJCWstLTsKKwkJdWRlbGF5KDEwKTsKKwkJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKTsKKwl9CisKKwlpZiAoISBoZXJtZXNfcHJlc2VudChodykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGVybWVzIEAgJXA6IENhcmQgcmVtb3ZlZCAiCisJCSAgICAgICAid2hpbGUgd2FpdGluZyBmb3IgY29tbWFuZCAweCUwNHggY29tcGxldGlvbi5cbiIsCisJCSAgICAgICBody0+aW9iYXNlLCBjbWQpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisJCQorCWlmICghIChyZWcgJiBIRVJNRVNfRVZfQ01EKSkgeworCQlwcmludGsoS0VSTl9FUlIgImhlcm1lcyBAICVwOiBUaW1lb3V0IHdhaXRpbmcgZm9yICIKKwkJICAgICAgICJjb21tYW5kIDB4JTA0eCBjb21wbGV0aW9uLlxuIiwgaHctPmlvYmFzZSwgY21kKTsKKwkJZXJyID0gLUVUSU1FRE9VVDsKKwkJZ290byBvdXQ7CisJfQorCisJc3RhdHVzID0gaGVybWVzX3JlYWRfcmVnbihodywgU1RBVFVTKTsKKwlpZiAocmVzcCkgeworCQlyZXNwLT5zdGF0dXMgPSBzdGF0dXM7CisJCXJlc3AtPnJlc3AwID0gaGVybWVzX3JlYWRfcmVnbihodywgUkVTUDApOworCQlyZXNwLT5yZXNwMSA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFJFU1AxKTsKKwkJcmVzcC0+cmVzcDIgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBSRVNQMik7CisJfQorCisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEVWQUNLLCBIRVJNRVNfRVZfQ01EKTsKKworCWlmIChzdGF0dXMgJiBIRVJNRVNfU1RBVFVTX1JFU1VMVCkKKwkJZXJyID0gLUVJTzsKKworIG91dDoKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaGVybWVzX2FsbG9jYXRlKGhlcm1lc190ICpodywgdTE2IHNpemUsIHUxNiAqZmlkKQoreworCWludCBlcnIgPSAwOworCWludCBrOworCXUxNiByZWc7CisJCisJaWYgKCAoc2l6ZSA8IEhFUk1FU19BTExPQ19MRU5fTUlOKSB8fCAoc2l6ZSA+IEhFUk1FU19BTExPQ19MRU5fTUFYKSApCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gaGVybWVzX2RvY21kX3dhaXQoaHcsIEhFUk1FU19DTURfQUxMT0MsIHNpemUsIE5VTEwpOworCWlmIChlcnIpIHsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOworCWsgPSBBTExPQ19DT01QTF9USU1FT1VUOworCXdoaWxlICggKCEgKHJlZyAmIEhFUk1FU19FVl9BTExPQykpICYmIGspIHsKKwkJay0tOworCQl1ZGVsYXkoMTApOworCQlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOworCX0KKwkKKwlpZiAoISBoZXJtZXNfcHJlc2VudChodykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGVybWVzIEAgJXA6ICIKKwkJICAgICAgICJDYXJkIHJlbW92ZWQgd2FpdGluZyBmb3IgZnJhbWUgYWxsb2NhdGlvbi5cbiIsCisJCSAgICAgICBody0+aW9iYXNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCQkKKwlpZiAoISAocmVnICYgSEVSTUVTX0VWX0FMTE9DKSkgeworCQlwcmludGsoS0VSTl9FUlIgImhlcm1lcyBAICVwOiAiCisJCSAgICAgICAiVGltZW91dCB3YWl0aW5nIGZvciBmcmFtZSBhbGxvY2F0aW9uXG4iLAorCQkgICAgICAgaHctPmlvYmFzZSk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCSpmaWQgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBBTExPQ0ZJRCk7CisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEVWQUNLLCBIRVJNRVNfRVZfQUxMT0MpOworCQorCXJldHVybiAwOworfQorCisKKy8qIFNldCB1cCBhIEJBUCB0byByZWFkIGEgcGFydGljdWxhciBjaHVuayBvZiBkYXRhIGZyb20gY2FyZCdzIGludGVybmFsIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOiA8IDAgb24gaW50ZXJuYWwgZmFpbHVyZSAoZXJybm8pLCAwIG9uIHN1Y2Nlc3MsID4wIG9uIGVycm9yCisgKiBmcm9tIGZpcm13YXJlCisgKgorICogQ2FsbGFibGUgZnJvbSBhbnkgY29udGV4dCAqLworc3RhdGljIGludCBoZXJtZXNfYmFwX3NlZWsoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB1MTYgaWQsIHUxNiBvZmZzZXQpCit7CisJaW50IHNyZWcgPSBiYXAgPyBIRVJNRVNfU0VMRUNUMSA6IEhFUk1FU19TRUxFQ1QwOworCWludCBvcmVnID0gYmFwID8gSEVSTUVTX09GRlNFVDEgOiBIRVJNRVNfT0ZGU0VUMDsKKwlpbnQgazsKKwl1MTYgcmVnOworCisJLyogUGFyYW5vaWEuLiAqLworCWlmICggKG9mZnNldCA+IEhFUk1FU19CQVBfT0ZGU0VUX01BWCkgfHwgKG9mZnNldCAlIDIpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlrID0gSEVSTUVTX0JBUF9CVVNZX1RJTUVPVVQ7CisJcmVnID0gaGVybWVzX3JlYWRfcmVnKGh3LCBvcmVnKTsKKwl3aGlsZSAoKHJlZyAmIEhFUk1FU19PRkZTRVRfQlVTWSkgJiYgaykgeworCQlrLS07CisJCXVkZWxheSgxKTsKKwkJcmVnID0gaGVybWVzX3JlYWRfcmVnKGh3LCBvcmVnKTsKKwl9CisKKyNpZmRlZiBIRVJNRVNfREVCVUdfQlVGRkVSCisJaHctPnByb2ZpbGVbSEVSTUVTX0JBUF9CVVNZX1RJTUVPVVQgLSBrXSsrOworCisJaWYgKGsgPCBIRVJNRVNfQkFQX0JVU1lfVElNRU9VVCkgeworCQlzdHJ1Y3QgaGVybWVzX2RlYnVnX2VudHJ5ICplID0gCisJCQkmaHctPmRidWZbKGh3LT5kYnVmcCsrKSAlIEhFUk1FU19ERUJVR19CVUZTSVpFXTsKKwkJZS0+YmFwID0gYmFwOworCQllLT5pZCA9IGlkOworCQllLT5vZmZzZXQgPSBvZmZzZXQ7CisJCWUtPmN5Y2xlcyA9IEhFUk1FU19CQVBfQlVTWV9USU1FT1VUIC0gazsKKwl9CisjZW5kaWYKKworCWlmIChyZWcgJiBIRVJNRVNfT0ZGU0VUX0JVU1kpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJLyogTm93IHdlIGFjdHVhbGx5IHNldCB1cCB0aGUgdHJhbnNmZXIgKi8KKwloZXJtZXNfd3JpdGVfcmVnKGh3LCBzcmVnLCBpZCk7CisJaGVybWVzX3dyaXRlX3JlZyhodywgb3JlZywgb2Zmc2V0KTsKKworCS8qIFdhaXQgZm9yIHRoZSBCQVAgdG8gYmUgcmVhZHkgKi8KKwlrID0gSEVSTUVTX0JBUF9CVVNZX1RJTUVPVVQ7CisJcmVnID0gaGVybWVzX3JlYWRfcmVnKGh3LCBvcmVnKTsKKwl3aGlsZSAoIChyZWcgJiAoSEVSTUVTX09GRlNFVF9CVVNZIHwgSEVSTUVTX09GRlNFVF9FUlIpKSAmJiBrKSB7CisJCWstLTsKKwkJdWRlbGF5KDEpOworCQlyZWcgPSBoZXJtZXNfcmVhZF9yZWcoaHcsIG9yZWcpOworCX0KKworCWlmIChyZWcgIT0gb2Zmc2V0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGVybWVzIEAgJXA6IEJBUCVkIG9mZnNldCAlczogIgorCQkgICAgICAgInJlZz0weCV4IGlkPTB4JXggb2Zmc2V0PTB4JXhcbiIsIGh3LT5pb2Jhc2UsIGJhcCwKKwkJICAgICAgIChyZWcgJiBIRVJNRVNfT0ZGU0VUX0JVU1kpID8gInRpbWVvdXQiIDogImVycm9yIiwKKwkJICAgICAgIHJlZywgaWQsIG9mZnNldCk7CisKKwkJaWYgKHJlZyAmIEhFUk1FU19PRkZTRVRfQlVTWSkgeworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKworCQlyZXR1cm4gLUVJTzsJCS8qIGVycm9yIG9yIHdyb25nIG9mZnNldCAqLworCX0KKworCXJldHVybiAwOworfQorCisvKiBSZWFkIGEgYmxvY2sgb2YgZGF0YSBmcm9tIHRoZSBjaGlwJ3MgYnVmZmVyLCB2aWEgdGhlCisgKiBCQVAuIFN5bmNocm9uaXphdGlvbi9zZXJpYWxpemF0aW9uIGlzIHRoZSBjYWxsZXIncyBwcm9ibGVtLiAgbGVuCisgKiBtdXN0IGJlIGV2ZW4uCisgKgorICogUmV0dXJuczogPCAwIG9uIGludGVybmFsIGZhaWx1cmUgKGVycm5vKSwgMCBvbiBzdWNjZXNzLCA+IDAgb24gZXJyb3IgZnJvbSBmaXJtd2FyZQorICovCitpbnQgaGVybWVzX2JhcF9wcmVhZChoZXJtZXNfdCAqaHcsIGludCBiYXAsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuLAorCQkgICAgIHUxNiBpZCwgdTE2IG9mZnNldCkKK3sKKwlpbnQgZHJlZyA9IGJhcCA/IEhFUk1FU19EQVRBMSA6IEhFUk1FU19EQVRBMDsKKwlpbnQgZXJyID0gMDsKKworCWlmICggKGxlbiA8IDApIHx8IChsZW4gJSAyKSApCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gaGVybWVzX2JhcF9zZWVrKGh3LCBiYXAsIGlkLCBvZmZzZXQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogQWN0dWFsbHkgZG8gdGhlIHRyYW5zZmVyICovCisJaGVybWVzX3JlYWRfd29yZHMoaHcsIGRyZWcsIGJ1ZiwgbGVuLzIpOworCisgb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qIFdyaXRlIGEgYmxvY2sgb2YgZGF0YSB0byB0aGUgY2hpcCdzIGJ1ZmZlciwgdmlhIHRoZQorICogQkFQLiBTeW5jaHJvbml6YXRpb24vc2VyaWFsaXphdGlvbiBpcyB0aGUgY2FsbGVyJ3MgcHJvYmxlbS4gbGVuCisgKiBtdXN0IGJlIGV2ZW4uCisgKgorICogUmV0dXJuczogPCAwIG9uIGludGVybmFsIGZhaWx1cmUgKGVycm5vKSwgMCBvbiBzdWNjZXNzLCA+IDAgb24gZXJyb3IgZnJvbSBmaXJtd2FyZQorICovCitpbnQgaGVybWVzX2JhcF9wd3JpdGUoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxlbiwKKwkJICAgICAgdTE2IGlkLCB1MTYgb2Zmc2V0KQoreworCWludCBkcmVnID0gYmFwID8gSEVSTUVTX0RBVEExIDogSEVSTUVTX0RBVEEwOworCWludCBlcnIgPSAwOworCisJaWYgKCAobGVuIDwgMCkgfHwgKGxlbiAlIDIpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBoZXJtZXNfYmFwX3NlZWsoaHcsIGJhcCwgaWQsIG9mZnNldCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJCisJLyogQWN0dWFsbHkgZG8gdGhlIHRyYW5zZmVyICovCisJaGVybWVzX3dyaXRlX3dvcmRzKGh3LCBkcmVnLCBidWYsIGxlbi8yKTsKKworIG91dDoJCisJcmV0dXJuIGVycjsKK30KKworLyogUmVhZCBhIExlbmd0aC1UeXBlLVZhbHVlIHJlY29yZCBmcm9tIHRoZSBjYXJkLgorICoKKyAqIElmIGxlbmd0aCBpcyBOVUxMLCB3ZSBpZ25vcmUgdGhlIGxlbmd0aCByZWFkIGZyb20gdGhlIGNhcmQsIGFuZAorICogcmVhZCB0aGUgZW50aXJlIGJ1ZmZlciByZWdhcmRsZXNzLiBUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIHNvbWUgb2YKKyAqIHRoZSBjb25maWd1cmF0aW9uIHJlY29yZHMgYXBwZWFyIHRvIGhhdmUgaW5jb3JyZWN0IGxlbmd0aHMgaW4KKyAqIHByYWN0aWNlLgorICoKKyAqIENhbGxhYmxlIGZyb20gdXNlciBvciBiaCBjb250ZXh0LiAgKi8KK2ludCBoZXJtZXNfcmVhZF9sdHYoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB1MTYgcmlkLCB1bnNpZ25lZCBidWZzaXplLAorCQkgICAgdTE2ICpsZW5ndGgsIHZvaWQgKmJ1ZikKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgZHJlZyA9IGJhcCA/IEhFUk1FU19EQVRBMSA6IEhFUk1FU19EQVRBMDsKKwl1MTYgcmxlbmd0aCwgcnR5cGU7CisJdW5zaWduZWQgbndvcmRzOworCisJaWYgKCAoYnVmc2l6ZSA8IDApIHx8IChidWZzaXplICUgMikgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGhlcm1lc19kb2NtZF93YWl0KGh3LCBIRVJNRVNfQ01EX0FDQ0VTUywgcmlkLCBOVUxMKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gaGVybWVzX2JhcF9zZWVrKGh3LCBiYXAsIHJpZCwgMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJsZW5ndGggPSBoZXJtZXNfcmVhZF9yZWcoaHcsIGRyZWcpOworCisJaWYgKCEgcmxlbmd0aCkKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJcnR5cGUgPSBoZXJtZXNfcmVhZF9yZWcoaHcsIGRyZWcpOworCisJaWYgKGxlbmd0aCkKKwkJKmxlbmd0aCA9IHJsZW5ndGg7CisKKwlpZiAocnR5cGUgIT0gcmlkKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZXJtZXMgQCAlcDogJXMoKTogIgorCQkgICAgICAgInJpZCAoMHglMDR4KSBkb2VzIG5vdCBtYXRjaCB0eXBlICgweCUwNHgpXG4iLAorCQkgICAgICAgaHctPmlvYmFzZSwgX19GVU5DVElPTl9fLCByaWQsIHJ0eXBlKTsKKwlpZiAoSEVSTUVTX1JFQ0xFTl9UT19CWVRFUyhybGVuZ3RoKSA+IGJ1ZnNpemUpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhlcm1lcyBAICVwOiAiCisJCSAgICAgICAiVHJ1bmNhdGluZyBMVFYgcmVjb3JkIGZyb20gJWQgdG8gJWQgYnl0ZXMuICIKKwkJICAgICAgICIocmlkPTB4JTA0eCwgbGVuPTB4JTA0eClcbiIsIGh3LT5pb2Jhc2UsCisJCSAgICAgICBIRVJNRVNfUkVDTEVOX1RPX0JZVEVTKHJsZW5ndGgpLCBidWZzaXplLCByaWQsIHJsZW5ndGgpOworCisJbndvcmRzID0gbWluKCh1bnNpZ25lZClybGVuZ3RoIC0gMSwgYnVmc2l6ZSAvIDIpOworCWhlcm1lc19yZWFkX3dvcmRzKGh3LCBkcmVnLCBidWYsIG53b3Jkcyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGhlcm1lc193cml0ZV9sdHYoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB1MTYgcmlkLCAKKwkJICAgICB1MTYgbGVuZ3RoLCBjb25zdCB2b2lkICp2YWx1ZSkKK3sKKwlpbnQgZHJlZyA9IGJhcCA/IEhFUk1FU19EQVRBMSA6IEhFUk1FU19EQVRBMDsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBjb3VudDsKKworCWlmIChsZW5ndGggPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBoZXJtZXNfYmFwX3NlZWsoaHcsIGJhcCwgcmlkLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaGVybWVzX3dyaXRlX3JlZyhodywgZHJlZywgbGVuZ3RoKTsKKwloZXJtZXNfd3JpdGVfcmVnKGh3LCBkcmVnLCByaWQpOworCisJY291bnQgPSBsZW5ndGggLSAxOworCisJaGVybWVzX3dyaXRlX3dvcmRzKGh3LCBkcmVnLCB2YWx1ZSwgY291bnQpOworCisJZXJyID0gaGVybWVzX2RvY21kX3dhaXQoaHcsIEhFUk1FU19DTURfQUNDRVNTIHwgSEVSTUVTX0NNRF9XUklURSwgCisJCQkJcmlkLCBOVUxMKTsKKworCXJldHVybiBlcnI7Cit9CisKK0VYUE9SVF9TWU1CT0woaGVybWVzX3N0cnVjdF9pbml0KTsKK0VYUE9SVF9TWU1CT0woaGVybWVzX2luaXQpOworRVhQT1JUX1NZTUJPTChoZXJtZXNfZG9jbWRfd2FpdCk7CitFWFBPUlRfU1lNQk9MKGhlcm1lc19hbGxvY2F0ZSk7CisKK0VYUE9SVF9TWU1CT0woaGVybWVzX2JhcF9wcmVhZCk7CitFWFBPUlRfU1lNQk9MKGhlcm1lc19iYXBfcHdyaXRlKTsKK0VYUE9SVF9TWU1CT0woaGVybWVzX3JlYWRfbHR2KTsKK0VYUE9SVF9TWU1CT0woaGVybWVzX3dyaXRlX2x0dik7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaGVybWVzKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2hlcm1lcyh2b2lkKQoreworfQorCittb2R1bGVfaW5pdChpbml0X2hlcm1lcyk7Cittb2R1bGVfZXhpdChleGl0X2hlcm1lcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOWU4NzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXMuaApAQCAtMCwwICsxLDQ4MSBAQAorLyogaGVybWVzLmgKKyAqCisgKiBEcml2ZXIgY29yZSBmb3IgdGhlICJIZXJtZXMiIHdpcmVsZXNzIE1BQyBjb250cm9sbGVyLCBhcyB1c2VkIGluCisgKiB0aGUgTHVjZW50IE9yaW5vY28gYW5kIENhYmxldHJvbiBSb2FtQWJvdXQgY2FyZHMuIEl0IHNob3VsZCBhbHNvCisgKiB3b3JrIG9uIHRoZSBoZmEzODQxIGFuZCBoZmEzODQyIE1BQyBjb250cm9sbGVyIGNoaXBzIHVzZWQgaW4gdGhlCisgKiBQcmlzbSBJICYgSUkgY2hpcHNldHMuCisgKgorICogVGhpcyBpcyBub3QgYSBjb21wbGV0ZSBkcml2ZXIsIGp1c3QgbG93LWxldmVsIGFjY2VzcyByb3V0aW5lcyBmb3IKKyAqIHRoZSBNQUMgY29udHJvbGxlciBpdHNlbGYuCisgKgorICogQmFzZWQgb24gdGhlIHByaXNtMiBkcml2ZXIgZnJvbSBBYnNvbHV0ZSBWYWx1ZSBTeXN0ZW1zJyBsaW51eC13bGFuCisgKiBwcm9qZWN0LCB0aGUgTGludXggd3ZsYW5fY3MgZHJpdmVyLCBMdWNlbnQncyBIQ0YtTGlnaHQKKyAqICh3dmxhbl9oY2YuYykgbGlicmFyeSwgYW5kIHRoZSBOZXRCU0Qgd2lyZWxlc3MgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgRGF2aWQgR2lic29uLCBMaW51eGNhcmUgQXVzdHJhbGlhLgorICogKEMpIENvcHlyaWdodCBEYXZpZCBHaWJzb24sIElCTSBDb3JwLiAyMDAxLTIwMDMuCisgKgorICogUG9ydGlvbnMgdGFrZW4gZnJvbSBoZmEzODR4LmgsIENvcHlyaWdodCAoQykgMTk5OSBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdQTCwgdmVyc2lvbiAyLgorICovCisKKyNpZm5kZWYgX0hFUk1FU19ICisjZGVmaW5lIF9IRVJNRVNfSAorCisvKiBOb3RlcyBvbiBsb2NraW5nOgorICoKKyAqIEFzIGEgbW9kdWxlIG9mIGxvdyBsZXZlbCBoYXJkd2FyZSBhY2Nlc3Mgcm91dGluZXMsIHRoZXJlIGlzIG5vCisgKiBsb2NraW5nLiBVc2VycyBvZiB0aGlzIG1vZHVsZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhleSBzZXJpYWxpemUKKyAqIGFjY2VzcyB0byB0aGUgaGVybWVzX3Qgc3RydWN0dXJlLCBhbmQgdG8gdGhlIGhhcmR3YXJlCisqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyoKKyAqIExpbWl0cyBhbmQgY29uc3RhbnRzCisgKi8KKyNkZWZpbmUJCUhFUk1FU19BTExPQ19MRU5fTUlOCQkoNCkKKyNkZWZpbmUJCUhFUk1FU19BTExPQ19MRU5fTUFYCQkoMjQwMCkKKyNkZWZpbmUJCUhFUk1FU19MVFZfTEVOX01BWAkJKDM0KQorI2RlZmluZQkJSEVSTUVTX0JBUF9EQVRBTEVOX01BWAkJKDQwOTYpCisjZGVmaW5lCQlIRVJNRVNfQkFQX09GRlNFVF9NQVgJCSg0MDk2KQorI2RlZmluZQkJSEVSTUVTX1BPUlRJRF9NQVgJCSg3KQorI2RlZmluZQkJSEVSTUVTX05VTVBPUlRTX01BWAkJKEhFUk1FU19QT1JUSURfTUFYKzEpCisjZGVmaW5lCQlIRVJNRVNfUERSX0xFTl9NQVgJCSgyNjApCS8qIGluIGJ5dGVzLCBmcm9tIEVLICovCisjZGVmaW5lCQlIRVJNRVNfUERBX1JFQ1NfTUFYCQkoMjAwKQkvKiBhIGd1ZXNzICovCisjZGVmaW5lCQlIRVJNRVNfUERBX0xFTl9NQVgJCSgxMDI0KQkvKiBpbiBieXRlcywgZnJvbSBFSyAqLworI2RlZmluZQkJSEVSTUVTX1NDQU5SRVNVTFRfTUFYCQkoMzUpCisjZGVmaW5lCQlIRVJNRVNfQ0hJTkZPUkVTVUxUX01BWAkJKDgpCisjZGVmaW5lCQlIRVJNRVNfTUFYX01VTFRJQ0FTVAkJKDE2KQorI2RlZmluZQkJSEVSTUVTX01BR0lDCQkJKDB4N2QxZikKKworLyoKKyAqIEhlcm1lcyByZWdpc3RlciBvZmZzZXRzCisgKi8KKyNkZWZpbmUJCUhFUk1FU19DTUQJCQkoMHgwMCkKKyNkZWZpbmUJCUhFUk1FU19QQVJBTTAJCQkoMHgwMikKKyNkZWZpbmUJCUhFUk1FU19QQVJBTTEJCQkoMHgwNCkKKyNkZWZpbmUJCUhFUk1FU19QQVJBTTIJCQkoMHgwNikKKyNkZWZpbmUJCUhFUk1FU19TVEFUVVMJCQkoMHgwOCkKKyNkZWZpbmUJCUhFUk1FU19SRVNQMAkJCSgweDBBKQorI2RlZmluZQkJSEVSTUVTX1JFU1AxCQkJKDB4MEMpCisjZGVmaW5lCQlIRVJNRVNfUkVTUDIJCQkoMHgwRSkKKyNkZWZpbmUJCUhFUk1FU19JTkZPRklECQkJKDB4MTApCisjZGVmaW5lCQlIRVJNRVNfUlhGSUQJCQkoMHgyMCkKKyNkZWZpbmUJCUhFUk1FU19BTExPQ0ZJRAkJCSgweDIyKQorI2RlZmluZQkJSEVSTUVTX1RYQ09NUExGSUQJCSgweDI0KQorI2RlZmluZQkJSEVSTUVTX1NFTEVDVDAJCQkoMHgxOCkKKyNkZWZpbmUJCUhFUk1FU19PRkZTRVQwCQkJKDB4MUMpCisjZGVmaW5lCQlIRVJNRVNfREFUQTAJCQkoMHgzNikKKyNkZWZpbmUJCUhFUk1FU19TRUxFQ1QxCQkJKDB4MUEpCisjZGVmaW5lCQlIRVJNRVNfT0ZGU0VUMQkJCSgweDFFKQorI2RlZmluZQkJSEVSTUVTX0RBVEExCQkJKDB4MzgpCisjZGVmaW5lCQlIRVJNRVNfRVZTVEFUCQkJKDB4MzApCisjZGVmaW5lCQlIRVJNRVNfSU5URU4JCQkoMHgzMikKKyNkZWZpbmUJCUhFUk1FU19FVkFDSwkJCSgweDM0KQorI2RlZmluZQkJSEVSTUVTX0NPTlRST0wJCQkoMHgxNCkKKyNkZWZpbmUJCUhFUk1FU19TV1NVUFBPUlQwCQkoMHgyOCkKKyNkZWZpbmUJCUhFUk1FU19TV1NVUFBPUlQxCQkoMHgyQSkKKyNkZWZpbmUJCUhFUk1FU19TV1NVUFBPUlQyCQkoMHgyQykKKyNkZWZpbmUJCUhFUk1FU19BVVhQQUdFCQkJKDB4M0EpCisjZGVmaW5lCQlIRVJNRVNfQVVYT0ZGU0VUCQkoMHgzQykKKyNkZWZpbmUJCUhFUk1FU19BVVhEQVRBCQkJKDB4M0UpCisKKy8qCisgKiBDTUQgcmVnaXN0ZXIgYml0bWFza3MKKyAqLworI2RlZmluZQkJSEVSTUVTX0NNRF9CVVNZCQkJKDB4ODAwMCkKKyNkZWZpbmUJCUhFUk1FU19DTURfQUlORk8JCSgweDdmMDApCisjZGVmaW5lCQlIRVJNRVNfQ01EX01BQ1BPUlQJCSgweDA3MDApCisjZGVmaW5lCQlIRVJNRVNfQ01EX1JFQ0wJCQkoMHgwMTAwKQorI2RlZmluZQkJSEVSTUVTX0NNRF9XUklURQkJKDB4MDEwMCkKKyNkZWZpbmUJCUhFUk1FU19DTURfUFJPR01PREUJCSgweDAzMDApCisjZGVmaW5lCQlIRVJNRVNfQ01EX0NNRENPREUJCSgweDAwM2YpCisKKy8qCisgKiBTVEFUVVMgcmVnaXN0ZXIgYml0bWFza3MKKyAqLworI2RlZmluZQkJSEVSTUVTX1NUQVRVU19SRVNVTFQJCSgweDdmMDApCisjZGVmaW5lCQlIRVJNRVNfU1RBVFVTX0NNRENPREUJCSgweDAwM2YpCisKKy8qCisgKiBPRkZTRVQgcmVnaXN0ZXIgYml0bWFza3MKKyAqLworI2RlZmluZQkJSEVSTUVTX09GRlNFVF9CVVNZCQkoMHg4MDAwKQorI2RlZmluZQkJSEVSTUVTX09GRlNFVF9FUlIJCSgweDQwMDApCisjZGVmaW5lCQlIRVJNRVNfT0ZGU0VUX0RBVEFPRkYJCSgweDBmZmUpCisKKy8qCisgKiBFdmVudCByZWdpc3RlciBiaXRtYXNrcyAoSU5URU4sIEVWU1RBVCwgRVZBQ0spCisgKi8KKyNkZWZpbmUJCUhFUk1FU19FVl9USUNLCQkJKDB4ODAwMCkKKyNkZWZpbmUJCUhFUk1FU19FVl9XVEVSUgkJCSgweDQwMDApCisjZGVmaW5lCQlIRVJNRVNfRVZfSU5GRFJPUAkJKDB4MjAwMCkKKyNkZWZpbmUJCUhFUk1FU19FVl9JTkZPCQkJKDB4MDA4MCkKKyNkZWZpbmUJCUhFUk1FU19FVl9EVElNCQkJKDB4MDAyMCkKKyNkZWZpbmUJCUhFUk1FU19FVl9DTUQJCQkoMHgwMDEwKQorI2RlZmluZQkJSEVSTUVTX0VWX0FMTE9DCQkJKDB4MDAwOCkKKyNkZWZpbmUJCUhFUk1FU19FVl9UWEVYQwkJCSgweDAwMDQpCisjZGVmaW5lCQlIRVJNRVNfRVZfVFgJCQkoMHgwMDAyKQorI2RlZmluZQkJSEVSTUVTX0VWX1JYCQkJKDB4MDAwMSkKKworLyoKKyAqIENvbW1hbmQgY29kZXMKKyAqLworLyotLS0gQ29udHJvbGxlciBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhFUk1FU19DTURfSU5JVAkJCSgweDAwMDApCisjZGVmaW5lCQlIRVJNRVNfQ01EX0VOQUJMRQkJKDB4MDAwMSkKKyNkZWZpbmUJCUhFUk1FU19DTURfRElTQUJMRQkJKDB4MDAwMikKKyNkZWZpbmUJCUhFUk1FU19DTURfRElBRwkJCSgweDAwMDMpCisKKy8qLS0tIEJ1ZmZlciBNZ210IENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRVJNRVNfQ01EX0FMTE9DCQkoMHgwMDBBKQorI2RlZmluZQkJSEVSTUVTX0NNRF9UWAkJCSgweDAwMEIpCisKKy8qLS0tIFJlZ3VsYXRlIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRVJNRVNfQ01EX05PVElGWQkJKDB4MDAxMCkKKyNkZWZpbmUJCUhFUk1FU19DTURfSU5RVUlSRQkJKDB4MDAxMSkKKworLyotLS0gQ29uZmlndXJlIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhFUk1FU19DTURfQUNDRVNTCQkoMHgwMDIxKQorI2RlZmluZQkJSEVSTUVTX0NNRF9ET1dOTEQJCSgweDAwMjIpCisKKy8qLS0tIFNlcmlhbCBJL08gQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRVJNRVNfQ01EX1JFQURNSUYJCSgweDAwMzApCisjZGVmaW5lCQlIRVJNRVNfQ01EX1dSSVRFTUlGCQkoMHgwMDMxKQorCisvKi0tLSBEZWJ1Z2dpbmcgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSAJSEVSTUVTX0NNRF9URVNUCQkJKDB4MDAzOCkKKworCisvKiBUZXN0IGNvbW1hbmQgYXJndW1lbnRzICovCisjZGVmaW5lCQlIRVJNRVNfVEVTVF9TRVRfQ0hBTk5FTAkJMHgwODAwCisjZGVmaW5lCQlIRVJNRVNfVEVTVF9NT05JVE9SCQkweDBiMDAKKyNkZWZpbmUJCUhFUk1FU19URVNUX1NUT1AJCTB4MGYwMAorCisvKiBBdXRoZW50aWNhdGlvbiBhbGdvcml0aG1zICovCisjZGVmaW5lCQlIRVJNRVNfQVVUSF9PUEVOCQkxCisjZGVmaW5lCQlIRVJNRVNfQVVUSF9TSEFSRURfS0VZCQkyCisKKy8qIFdFUCBzZXR0aW5ncyAqLworI2RlZmluZQkJSEVSTUVTX1dFUF9QUklWQUNZX0lOVk9LRUQJMHgwMDAxCisjZGVmaW5lCQlIRVJNRVNfV0VQX0VYQ0xfVU5FTkNSWVBURUQJMHgwMDAyCisjZGVmaW5lCQlIRVJNRVNfV0VQX0hPU1RfRU5DUllQVAkJMHgwMDEwCisjZGVmaW5lCQlIRVJNRVNfV0VQX0hPU1RfREVDUllQVAkJMHgwMDgwCisKKy8qIFN5bWJvbCBob3N0c2NhbiBvcHRpb25zICovCisjZGVmaW5lCQlIRVJNRVNfSE9TVFNDQU5fU1lNQk9MXzVTRUMJMHgwMDAxCisjZGVmaW5lCQlIRVJNRVNfSE9TVFNDQU5fU1lNQk9MX09OQ0UJMHgwMDAyCisjZGVmaW5lCQlIRVJNRVNfSE9TVFNDQU5fU1lNQk9MX1BBU1NJVkUJMHgwMDQwCisjZGVmaW5lCQlIRVJNRVNfSE9TVFNDQU5fU1lNQk9MX0JDQVNUCTB4MDA4MAorCisvKgorICogRnJhbWUgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzCisgKi8KKworI2RlZmluZSBIRVJNRVNfREVTQ1JJUFRPUl9PRkZTRVQJMAorI2RlZmluZSBIRVJNRVNfODAyXzExX09GRlNFVAkJKDE0KQorI2RlZmluZSBIRVJNRVNfODAyXzNfT0ZGU0VUCQkoMTQrMzIpCisjZGVmaW5lIEhFUk1FU184MDJfMl9PRkZTRVQJCSgxNCszMisxNCkKKworI2RlZmluZSBIRVJNRVNfUlhTVEFUX0VSUgkJKDB4MDAwMykKKyNkZWZpbmUJSEVSTUVTX1JYU1RBVF9CQURDUkMJCSgweDAwMDEpCisjZGVmaW5lCUhFUk1FU19SWFNUQVRfVU5ERUNSWVBUQUJMRQkoMHgwMDAyKQorI2RlZmluZQlIRVJNRVNfUlhTVEFUX01BQ1BPUlQJCSgweDA3MDApCisjZGVmaW5lIEhFUk1FU19SWFNUQVRfUENGCQkoMHgxMDAwKQkvKiBGcmFtZSB3YXMgcmVjZWl2ZWQgaW4gQ0YgcGVyaW9kICovCisjZGVmaW5lCUhFUk1FU19SWFNUQVRfTVNHVFlQRQkJKDB4RTAwMCkKKyNkZWZpbmUJSEVSTUVTX1JYU1RBVF8xMDQyCQkoMHgyMDAwKQkvKiBSRkMtMTA0MiBmcmFtZSAqLworI2RlZmluZQlIRVJNRVNfUlhTVEFUX1RVTk5FTAkJKDB4NDAwMCkJLyogYnJpZGdlLXR1bm5lbCBlbmNvZGVkIGZyYW1lICovCisjZGVmaW5lCUhFUk1FU19SWFNUQVRfV01QCQkoMHg2MDAwKQkvKiBXYXZlbGFuLUlJIE1hbmFnZW1lbnQgUHJvdG9jb2wgZnJhbWUgKi8KKworc3RydWN0IGhlcm1lc190eF9kZXNjcmlwdG9yIHsKKwl1MTYgc3RhdHVzOworCXUxNiByZXNlcnZlZDE7CisJdTE2IHJlc2VydmVkMjsKKwl1MzIgc3dfc3VwcG9ydDsKKwl1OCByZXRyeV9jb3VudDsKKwl1OCB0eF9yYXRlOworCXUxNiB0eF9jb250cm9sOwkKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIEhFUk1FU19UWFNUQVRfUkVUUllFUlIJCSgweDAwMDEpCisjZGVmaW5lIEhFUk1FU19UWFNUQVRfQUdFREVSUgkJKDB4MDAwMikKKyNkZWZpbmUgSEVSTUVTX1RYU1RBVF9ESVNDT04JCSgweDAwMDQpCisjZGVmaW5lIEhFUk1FU19UWFNUQVRfRk9STUVSUgkJKDB4MDAwOCkKKworI2RlZmluZSBIRVJNRVNfVFhDVFJMX1RYX09LCQkoMHgwMDAyKQkvKiA/PyBpbnRlcnJ1cHQgb24gVHggY29tcGxldGUgKi8KKyNkZWZpbmUgSEVSTUVTX1RYQ1RSTF9UWF9FWAkJKDB4MDAwNCkJLyogPz8gaW50ZXJydXB0IG9uIFR4IGV4Y2VwdGlvbiAqLworI2RlZmluZSBIRVJNRVNfVFhDVFJMXzgwMl8xMQkJKDB4MDAwOCkJLyogV2Ugc3VwcGx5IDgwMi4xMSBoZWFkZXIgKi8KKyNkZWZpbmUgSEVSTUVTX1RYQ1RSTF9BTFRfUlRSWQkJKDB4MDAyMCkKKworLyogSW5xdWlyeSBjb25zdGFudHMgYW5kIGRhdGEgdHlwZXMgKi8KKworI2RlZmluZSBIRVJNRVNfSU5RX1RBTExJRVMJCSgweEYxMDApCisjZGVmaW5lIEhFUk1FU19JTlFfU0NBTgkJCSgweEYxMDEpCisjZGVmaW5lIEhFUk1FU19JTlFfQ0hBTk5FTElORk8JCSgweEYxMDIpCisjZGVmaW5lIEhFUk1FU19JTlFfSE9TVFNDQU4JCSgweEYxMDMpCisjZGVmaW5lIEhFUk1FU19JTlFfSE9TVFNDQU5fU1lNQk9MCSgweEYxMDQpCisjZGVmaW5lIEhFUk1FU19JTlFfTElOS1NUQVRVUwkJKDB4RjIwMCkKKyNkZWZpbmUgSEVSTUVTX0lOUV9TRUNfU1RBVF9BR0VSRQkoMHhGMjAyKQorCitzdHJ1Y3QgaGVybWVzX3RhbGxpZXNfZnJhbWUgeworCXUxNiBUeFVuaWNhc3RGcmFtZXM7CisJdTE2IFR4TXVsdGljYXN0RnJhbWVzOworCXUxNiBUeEZyYWdtZW50czsKKwl1MTYgVHhVbmljYXN0T2N0ZXRzOworCXUxNiBUeE11bHRpY2FzdE9jdGV0czsKKwl1MTYgVHhEZWZlcnJlZFRyYW5zbWlzc2lvbnM7CisJdTE2IFR4U2luZ2xlUmV0cnlGcmFtZXM7CisJdTE2IFR4TXVsdGlwbGVSZXRyeUZyYW1lczsKKwl1MTYgVHhSZXRyeUxpbWl0RXhjZWVkZWQ7CisJdTE2IFR4RGlzY2FyZHM7CisJdTE2IFJ4VW5pY2FzdEZyYW1lczsKKwl1MTYgUnhNdWx0aWNhc3RGcmFtZXM7CisJdTE2IFJ4RnJhZ21lbnRzOworCXUxNiBSeFVuaWNhc3RPY3RldHM7CisJdTE2IFJ4TXVsdGljYXN0T2N0ZXRzOworCXUxNiBSeEZDU0Vycm9yczsKKwl1MTYgUnhEaXNjYXJkc19Ob0J1ZmZlcjsKKwl1MTYgVHhEaXNjYXJkc1dyb25nU0E7CisJdTE2IFJ4V0VQVW5kZWNyeXB0YWJsZTsKKwl1MTYgUnhNc2dJbk1zZ0ZyYWdtZW50czsKKwl1MTYgUnhNc2dJbkJhZE1zZ0ZyYWdtZW50czsKKwkvKiBUaG9zZSBsYXN0IGFyZSBwcm9iYWJseSBub3QgYXZhaWxhYmxlIGluIHZlcnkgb2xkIGZpcm13YXJlcyAqLworCXUxNiBSeERpc2NhcmRzX1dFUElDVkVycm9yOworCXUxNiBSeERpc2NhcmRzX1dFUEV4Y2x1ZGVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEdyYWJiZWQgZnJvbSB3bGFuLW5nIC0gVGhhbmtzIE1hcmsuLi4gLSBKZWFuIElJCisgKiBUaGlzIGlzIHRoZSByZXN1bHQgb2YgYSBzY2FuIGlucXVpcnkgY29tbWFuZCAqLworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgaW5mbyBhYm91dCBhbiBBY2Nlc3MgUG9pbnQgKi8KK3N0cnVjdCBwcmlzbTJfc2Nhbl9hcGluZm8geworCXUxNiBjaGFubmVsOwkJLyogQ2hhbm5lbCB3aGVyZSB0aGUgQVAgc2l0cyAqLworCXUxNiBub2lzZTsJCS8qIE5vaXNlIGxldmVsICovCisJdTE2IGxldmVsOwkJLyogU2lnbmFsIGxldmVsICovCisJdTggYnNzaWRbRVRIX0FMRU5dOwkvKiBNQUMgYWRkcmVzcyBvZiB0aGUgQWNjZXNzIFBvaW50ICovCisJdTE2IGJlYWNvbl9pbnRlcnY7CS8qIEJlYWNvbiBpbnRlcnZhbCAqLworCXUxNiBjYXBhYmlsaXRpZXM7CS8qIENhcGFiaWxpdGllcyAqLworCXUxNiBlc3NpZF9sZW47CQkvKiBFU1NJRCBsZW5ndGggKi8KKwl1OCBlc3NpZFszMl07CQkvKiBFU1NJRCBvZiB0aGUgbmV0d29yayAqLworCXU4IHJhdGVzWzEwXTsJCS8qIEJpdCByYXRlIHN1cHBvcnRlZCAqLworCXUxNiBwcm9iZXJlc3BfcmF0ZTsJLyogRGF0YSByYXRlIG9mIHRoZSByZXNwb25zZSBmcmFtZSAqLworCXUxNiBhdGltOwkJLyogQVRJTSB3aW5kb3cgdGltZSwgS3VzIChob3N0c2NhbiBvbmx5KSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNhbWUgc3R1ZmYgZm9yIHRoZSBMdWNlbnQvQWdlcmUgY2FyZC4KKyAqIFRoYW5rcyB0byBoMWthcmkgPGgxa2FyaSBBVCBkYWNoYjBkZW4uY29tPiAtIEplYW4gSUkgKi8KK3N0cnVjdCBhZ2VyZV9zY2FuX2FwaW5mbyB7CisJdTE2IGNoYW5uZWw7CQkvKiBDaGFubmVsIHdoZXJlIHRoZSBBUCBzaXRzICovCisJdTE2IG5vaXNlOwkJLyogTm9pc2UgbGV2ZWwgKi8KKwl1MTYgbGV2ZWw7CQkvKiBTaWduYWwgbGV2ZWwgKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CS8qIE1BQyBhZGRyZXNzIG9mIHRoZSBBY2Nlc3MgUG9pbnQgKi8KKwl1MTYgYmVhY29uX2ludGVydjsJLyogQmVhY29uIGludGVydmFsICovCisJdTE2IGNhcGFiaWxpdGllczsJLyogQ2FwYWJpbGl0aWVzICovCisJLyogYml0czogMC1lc3MsIDEtaWJzcywgNC1wcml2YWN5IFt3ZXBdICovCisJdTE2IGVzc2lkX2xlbjsJCS8qIEVTU0lEIGxlbmd0aCAqLworCXU4IGVzc2lkWzMyXTsJCS8qIEVTU0lEIG9mIHRoZSBuZXR3b3JrICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogTW91c3RhZmE6IFNjYW4gc3RydWN0dXJlIGZvciBTeW1ib2wgY2FyZHMgKi8KK3N0cnVjdCBzeW1ib2xfc2Nhbl9hcGluZm8geworCXU4IGNoYW5uZWw7CQkvKiBDaGFubmVsIHdoZXJlIHRoZSBBUCBzaXRzICovCisJdTggdW5rbm93bjE7CQkvKiA4IGluIDIuOXggYW5kIDMuOXggZi93LCAwIG90aGVyd2lzZSAqLworCXUxNiBub2lzZTsJCS8qIE5vaXNlIGxldmVsICovCisJdTE2IGxldmVsOwkJLyogU2lnbmFsIGxldmVsICovCisJdTggYnNzaWRbRVRIX0FMRU5dOwkvKiBNQUMgYWRkcmVzcyBvZiB0aGUgQWNjZXNzIFBvaW50ICovCisJdTE2IGJlYWNvbl9pbnRlcnY7CS8qIEJlYWNvbiBpbnRlcnZhbCAqLworCXUxNiBjYXBhYmlsaXRpZXM7CS8qIENhcGFiaWxpdGllcyAqLworCS8qIGJpdHM6IDAtZXNzLCAxLWlic3MsIDQtcHJpdmFjeSBbd2VwXSAqLworCXUxNiBlc3NpZF9sZW47CQkvKiBFU1NJRCBsZW5ndGggKi8KKwl1OCBlc3NpZFszMl07CQkvKiBFU1NJRCBvZiB0aGUgbmV0d29yayAqLworICAgIAl1MTYgcmF0ZXNbNV07CQkvKiBCaXQgcmF0ZSBzdXBwb3J0ZWQgKi8KKwl1MTYgYmFzaWNfcmF0ZXM7CS8qIEJhc2ljIHJhdGVzIGJpdG1hc2sgKi8KKwl1OCB1bmtub3duMls2XTsJCS8qIEFsd2F5cyBGRjpGRjpGRjpGRjowMDowMCAqLworCXU4IHVua25vd24zWzhdOwkJLyogQWx3YXlzIDAsIGFwcGVhcmVkIGluIGYvdyAzLjkxLTY4ICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwordW5pb24gaGVybWVzX3NjYW5faW5mbyB7CisJc3RydWN0IGFnZXJlX3NjYW5fYXBpbmZvCWE7CisJc3RydWN0IHByaXNtMl9zY2FuX2FwaW5mbwlwOworCXN0cnVjdCBzeW1ib2xfc2Nhbl9hcGluZm8JczsKK307CisKKyNkZWZpbmUgSEVSTUVTX0xJTktTVEFUVVNfTk9UX0NPTk5FQ1RFRCAgICgweDAwMDApICAKKyNkZWZpbmUgSEVSTUVTX0xJTktTVEFUVVNfQ09OTkVDVEVEICAgICAgICgweDAwMDEpCisjZGVmaW5lIEhFUk1FU19MSU5LU1RBVFVTX0RJU0NPTk5FQ1RFRCAgICAoMHgwMDAyKQorI2RlZmluZSBIRVJNRVNfTElOS1NUQVRVU19BUF9DSEFOR0UgICAgICAgKDB4MDAwMykKKyNkZWZpbmUgSEVSTUVTX0xJTktTVEFUVVNfQVBfT1VUX09GX1JBTkdFICgweDAwMDQpCisjZGVmaW5lIEhFUk1FU19MSU5LU1RBVFVTX0FQX0lOX1JBTkdFICAgICAoMHgwMDA1KQorI2RlZmluZSBIRVJNRVNfTElOS1NUQVRVU19BU1NPQ19GQUlMRUQgICAgKDB4MDAwNikKKyAgCitzdHJ1Y3QgaGVybWVzX2xpbmtzdGF0dXMgeworCXUxNiBsaW5rc3RhdHVzOyAgICAgICAgIC8qIExpbmsgc3RhdHVzICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGhlcm1lc19yZXNwb25zZSB7CisJdTE2IHN0YXR1cywgcmVzcDAsIHJlc3AxLCByZXNwMjsKK307CisKKy8qICJJRCIgc3RydWN0dXJlIC0gdXNlZCBmb3IgRVNTSUQgYW5kIHN0YXRpb24gbmlja25hbWUgKi8KK3N0cnVjdCBoZXJtZXNfaWRzdHJpbmcgeworCXUxNiBsZW47CisJdTE2IHZhbFsxNl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGhlcm1lc19tdWx0aWNhc3QgeworCXU4IGFkZHJbSEVSTUVTX01BWF9NVUxUSUNBU1RdW0VUSF9BTEVOXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvLyAjZGVmaW5lIEhFUk1FU19ERUJVR19CVUZGRVIgMQorI2RlZmluZSBIRVJNRVNfREVCVUdfQlVGU0laRSA0MDk2CitzdHJ1Y3QgaGVybWVzX2RlYnVnX2VudHJ5IHsKKwlpbnQgYmFwOworCXUxNiBpZCwgb2Zmc2V0OworCWludCBjeWNsZXM7Cit9OworCisjaWZkZWYgX19LRVJORUxfXworCisvKiBUaW1lb3V0cyAqLworI2RlZmluZSBIRVJNRVNfQkFQX0JVU1lfVElNRU9VVCAoMTAwMDApIC8qIEluIGl0ZXJhdGlvbnMgb2YgfjF1cyAqLworCisvKiBCYXNpYyBjb250cm9sIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgaGVybWVzIHsKKwl2b2lkIF9faW9tZW0gKmlvYmFzZTsKKwlpbnQgcmVnX3NwYWNpbmc7CisjZGVmaW5lIEhFUk1FU18xNkJJVF9SRUdTUEFDSU5HCTAKKyNkZWZpbmUgSEVSTUVTXzMyQklUX1JFR1NQQUNJTkcJMQorCisJdTE2IGludGVuOyAvKiBXaGljaCBpbnRlcnJ1cHRzIHNob3VsZCBiZSBlbmFibGVkPyAqLworCisjaWZkZWYgSEVSTUVTX0RFQlVHX0JVRkZFUgorCXN0cnVjdCBoZXJtZXNfZGVidWdfZW50cnkgZGJ1ZltIRVJNRVNfREVCVUdfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBkYnVmcDsKKwl1bnNpZ25lZCBsb25nIHByb2ZpbGVbSEVSTUVTX0JBUF9CVVNZX1RJTUVPVVQrMV07CisjZW5kaWYKK30gaGVybWVzX3Q7CisKKy8qIFJlZ2lzdGVyIGFjY2VzcyBjb252ZW5pZW5jZSBtYWNyb3MgKi8KKyNkZWZpbmUgaGVybWVzX3JlYWRfcmVnKGh3LCBvZmYpIFwKKwkoaW9yZWFkMTYoKGh3KS0+aW9iYXNlICsgKCAob2ZmKSA8PCAoaHcpLT5yZWdfc3BhY2luZyApKSkKKyNkZWZpbmUgaGVybWVzX3dyaXRlX3JlZyhodywgb2ZmLCB2YWwpIFwKKwkoaW93cml0ZTE2KCh2YWwpLCAoaHcpLT5pb2Jhc2UgKyAoKG9mZikgPDwgKGh3KS0+cmVnX3NwYWNpbmcpKSkKKyNkZWZpbmUgaGVybWVzX3JlYWRfcmVnbihodywgbmFtZSkgaGVybWVzX3JlYWRfcmVnKChodyksIEhFUk1FU18jI25hbWUpCisjZGVmaW5lIGhlcm1lc193cml0ZV9yZWduKGh3LCBuYW1lLCB2YWwpIGhlcm1lc193cml0ZV9yZWcoKGh3KSwgSEVSTUVTXyMjbmFtZSwgKHZhbCkpCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3ZvaWQgaGVybWVzX3N0cnVjdF9pbml0KGhlcm1lc190ICpodywgdm9pZCBfX2lvbWVtICphZGRyZXNzLCBpbnQgcmVnX3NwYWNpbmcpOworaW50IGhlcm1lc19pbml0KGhlcm1lc190ICpodyk7CitpbnQgaGVybWVzX2RvY21kX3dhaXQoaGVybWVzX3QgKmh3LCB1MTYgY21kLCB1MTYgcGFybTAsCisJCSAgICAgIHN0cnVjdCBoZXJtZXNfcmVzcG9uc2UgKnJlc3ApOworaW50IGhlcm1lc19hbGxvY2F0ZShoZXJtZXNfdCAqaHcsIHUxNiBzaXplLCB1MTYgKmZpZCk7CisKK2ludCBoZXJtZXNfYmFwX3ByZWFkKGhlcm1lc190ICpodywgaW50IGJhcCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4sCisJCSAgICAgICB1MTYgaWQsIHUxNiBvZmZzZXQpOworaW50IGhlcm1lc19iYXBfcHdyaXRlKGhlcm1lc190ICpodywgaW50IGJhcCwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4sCisJCQl1MTYgaWQsIHUxNiBvZmZzZXQpOworaW50IGhlcm1lc19yZWFkX2x0dihoZXJtZXNfdCAqaHcsIGludCBiYXAsIHUxNiByaWQsIHVuc2lnbmVkIGJ1ZmxlbiwKKwkJICAgIHUxNiAqbGVuZ3RoLCB2b2lkICpidWYpOworaW50IGhlcm1lc193cml0ZV9sdHYoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB1MTYgcmlkLAorCQkgICAgICB1MTYgbGVuZ3RoLCBjb25zdCB2b2lkICp2YWx1ZSk7CisKKy8qIElubGluZSBmdW5jdGlvbnMgKi8KKworc3RhdGljIGlubGluZSBpbnQgaGVybWVzX3ByZXNlbnQoaGVybWVzX3QgKmh3KQoreworCXJldHVybiBoZXJtZXNfcmVhZF9yZWduKGh3LCBTV1NVUFBPUlQwKSA9PSBIRVJNRVNfTUFHSUM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZXJtZXNfc2V0X2lycW1hc2soaGVybWVzX3QgKmh3LCB1MTYgZXZlbnRzKQoreworCWh3LT5pbnRlbiA9IGV2ZW50czsKKwloZXJtZXNfd3JpdGVfcmVnbihodywgSU5URU4sIGV2ZW50cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhlcm1lc19lbmFibGVfcG9ydChoZXJtZXNfdCAqaHcsIGludCBwb3J0KQoreworCXJldHVybiBoZXJtZXNfZG9jbWRfd2FpdChodywgSEVSTUVTX0NNRF9FTkFCTEUgfCAocG9ydCA8PCA4KSwKKwkJCQkgMCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhlcm1lc19kaXNhYmxlX3BvcnQoaGVybWVzX3QgKmh3LCBpbnQgcG9ydCkKK3sKKwlyZXR1cm4gaGVybWVzX2RvY21kX3dhaXQoaHcsIEhFUk1FU19DTURfRElTQUJMRSB8IChwb3J0IDw8IDgpLCAKKwkJCQkgMCwgTlVMTCk7Cit9CisKKy8qIEluaXRpYXRlIGFuIElOUVVJUkUgY29tbWFuZCAodGFsbGllcyBvciBzY2FuKS4gIFRoZSByZXN1bHQgd2lsbCBjb21lIGFzIGFuCisgKiBpbmZvcm1hdGlvbiBmcmFtZSBpbiBfX29yaW5vY29fZXZfaW5mbygpICovCitzdGF0aWMgaW5saW5lIGludCBoZXJtZXNfaW5xdWlyZShoZXJtZXNfdCAqaHcsIHUxNiByaWQpCit7CisJcmV0dXJuIGhlcm1lc19kb2NtZF93YWl0KGh3LCBIRVJNRVNfQ01EX0lOUVVJUkUsIHJpZCwgTlVMTCk7Cit9CisKKyNkZWZpbmUgSEVSTUVTX0JZVEVTX1RPX1JFQ0xFTihuKSAoICgoKG4pKzEpLzIpICsgMSApCisjZGVmaW5lIEhFUk1FU19SRUNMRU5fVE9fQllURVMobikgKCAoKG4pLTEpICogMiApCisKKy8qIE5vdGUgdGhhdCBmb3IgdGhlIG5leHQgdHdvLCB0aGUgY291bnQgaXMgaW4gMTYtYml0IHdvcmRzLCBub3QgYnl0ZXMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoZXJtZXNfcmVhZF93b3JkcyhzdHJ1Y3QgaGVybWVzICpodywgaW50IG9mZiwgdm9pZCAqYnVmLCB1bnNpZ25lZCBjb3VudCkKK3sKKwlvZmYgPSBvZmYgPDwgaHctPnJlZ19zcGFjaW5nOworCWlvcmVhZDE2X3JlcChody0+aW9iYXNlICsgb2ZmLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhlcm1lc193cml0ZV93b3JkcyhzdHJ1Y3QgaGVybWVzICpodywgaW50IG9mZiwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBjb3VudCkKK3sKKwlvZmYgPSBvZmYgPDwgaHctPnJlZ19zcGFjaW5nOworCWlvd3JpdGUxNl9yZXAoaHctPmlvYmFzZSArIG9mZiwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZXJtZXNfY2xlYXJfd29yZHMoc3RydWN0IGhlcm1lcyAqaHcsIGludCBvZmYsIHVuc2lnbmVkIGNvdW50KQoreworCXVuc2lnbmVkIGk7CisKKwlvZmYgPSBvZmYgPDwgaHctPnJlZ19zcGFjaW5nOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWlvd3JpdGUxNigwLCBody0+aW9iYXNlICsgb2ZmKTsKK30KKworI2RlZmluZSBIRVJNRVNfUkVBRF9SRUNPUkQoaHcsIGJhcCwgcmlkLCBidWYpIFwKKwkoaGVybWVzX3JlYWRfbHR2KChodyksKGJhcCksKHJpZCksIHNpemVvZigqYnVmKSwgTlVMTCwgKGJ1ZikpKQorI2RlZmluZSBIRVJNRVNfV1JJVEVfUkVDT1JEKGh3LCBiYXAsIHJpZCwgYnVmKSBcCisJKGhlcm1lc193cml0ZV9sdHYoKGh3KSwoYmFwKSwocmlkKSxIRVJNRVNfQllURVNfVE9fUkVDTEVOKHNpemVvZigqYnVmKSksKGJ1ZikpKQorCitzdGF0aWMgaW5saW5lIGludCBoZXJtZXNfcmVhZF93b3JkcmVjKGhlcm1lc190ICpodywgaW50IGJhcCwgdTE2IHJpZCwgdTE2ICp3b3JkKQoreworCXUxNiByZWM7CisJaW50IGVycjsKKworCWVyciA9IEhFUk1FU19SRUFEX1JFQ09SRChodywgYmFwLCByaWQsICZyZWMpOworCSp3b3JkID0gbGUxNl90b19jcHUocmVjKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludCBoZXJtZXNfd3JpdGVfd29yZHJlYyhoZXJtZXNfdCAqaHcsIGludCBiYXAsIHUxNiByaWQsIHUxNiB3b3JkKQoreworCXUxNiByZWMgPSBjcHVfdG9fbGUxNih3b3JkKTsKKwlyZXR1cm4gSEVSTUVTX1dSSVRFX1JFQ09SRChodywgYmFwLCByaWQsICZyZWMpOworfQorCisjZWxzZSAvKiAhIF9fS0VSTkVMX18gKi8KKworLyogVGhlc2UgYXJlIHByb3ZpZGVkIGZvciB0aGUgYmVuZWZpdCBvZiB1c2Vyc3BhY2UgZHJpdmVycyBhbmQgdGVzdGluZyBwcm9ncmFtcworICAgd2hpY2ggdXNlIGlvcGVybSgpIG9yIGlvcGwoKSAqLworCisjZGVmaW5lIGhlcm1lc19yZWFkX3JlZyhiYXNlLCBvZmYpIChpbncoKGJhc2UpICsgKG9mZikpKQorI2RlZmluZSBoZXJtZXNfd3JpdGVfcmVnKGJhc2UsIG9mZiwgdmFsKSAob3V0dygodmFsKSwgKGJhc2UpICsgKG9mZikpKQorCisjZGVmaW5lIGhlcm1lc19yZWFkX3JlZ24oYmFzZSwgbmFtZSkgKGhlcm1lc19yZWFkX3JlZygoYmFzZSksIEhFUk1FU18jI25hbWUpKQorI2RlZmluZSBoZXJtZXNfd3JpdGVfcmVnbihiYXNlLCBuYW1lLCB2YWwpIChoZXJtZXNfd3JpdGVfcmVnKChiYXNlKSwgSEVSTUVTXyMjbmFtZSwgKHZhbCkpKQorCisvKiBOb3RlIHRoYXQgZm9yIHRoZSBuZXh0IHR3bywgdGhlIGNvdW50IGlzIGluIDE2LWJpdCB3b3Jkcywgbm90IGJ5dGVzICovCisjZGVmaW5lIGhlcm1lc19yZWFkX2RhdGEoYmFzZSwgb2ZmLCBidWYsIGNvdW50KSAoaW5zdygoYmFzZSkgKyAob2ZmKSwgKGJ1ZiksIChjb3VudCkpKQorI2RlZmluZSBoZXJtZXNfd3JpdGVfZGF0YShiYXNlLCBvZmYsIGJ1ZiwgY291bnQpIChvdXRzdygoYmFzZSkgKyAob2ZmKSwgKGJ1ZiksIChjb3VudCkpKQorCisjZW5kaWYgLyogISBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAgLyogX0hFUk1FU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXNfcmlkLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXNfcmlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0NmI0OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lc19yaWQuaApAQCAtMCwwICsxLDE0OCBAQAorI2lmbmRlZiBfSEVSTUVTX1JJRF9ICisjZGVmaW5lIF9IRVJNRVNfUklEX0gKKworLyoKKyAqIENvbmZpZ3VyYXRpb24gUklEcworICovCisjZGVmaW5lIEhFUk1FU19SSURfQ05GUE9SVFRZUEUJCQkweEZDMDAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZPV05NQUNBRERSCQkweEZDMDEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZERVNJUkVEU1NJRAkJMHhGQzAyCisjZGVmaW5lIEhFUk1FU19SSURfQ05GT1dOQ0hBTk5FTAkJMHhGQzAzCisjZGVmaW5lIEhFUk1FU19SSURfQ05GT1dOU1NJRAkJCTB4RkMwNAorI2RlZmluZSBIRVJNRVNfUklEX0NORk9XTkFUSU1XSU5ET1cJCTB4RkMwNQorI2RlZmluZSBIRVJNRVNfUklEX0NORlNZU1RFTVNDQUxFCQkweEZDMDYKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZNQVhEQVRBTEVOCQkweEZDMDcKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRFNBRERSRVNTCQkweEZDMDgKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZQTUVOQUJMRUQJCQkweEZDMDkKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZQTUVQUwkJCTB4RkMwQQorI2RlZmluZSBIRVJNRVNfUklEX0NORk1VTFRJQ0FTVFJFQ0VJVkUJCTB4RkMwQgorI2RlZmluZSBIRVJNRVNfUklEX0NORk1BWFNMRUVQRFVSQVRJT04JCTB4RkMwQworI2RlZmluZSBIRVJNRVNfUklEX0NORlBNSE9MRE9WRVJEVVJBVElPTgkweEZDMEQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZPV05OQU1FCQkJMHhGQzBFCisjZGVmaW5lIEhFUk1FU19SSURfQ05GT1dORFRJTVBFUklPRAkJMHhGQzEwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0RTQUREUkVTUzEJCTB4RkMxMQorI2RlZmluZSBIRVJNRVNfUklEX0NORldEU0FERFJFU1MyCQkweEZDMTIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRFNBRERSRVNTMwkJMHhGQzEzCisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0RTQUREUkVTUzQJCTB4RkMxNAorI2RlZmluZSBIRVJNRVNfUklEX0NORldEU0FERFJFU1M1CQkweEZDMTUKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRFNBRERSRVNTNgkJMHhGQzE2CisjZGVmaW5lIEhFUk1FU19SSURfQ05GTVVMVElDQVNUUE1CVUZGRVJJTkcJMHhGQzE3CisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0VQRU5BQkxFRF9BR0VSRQkJMHhGQzIwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GQVVUSEVOVElDQVRJT05fQUdFUkUJMHhGQzIxCisjZGVmaW5lIEhFUk1FU19SSURfQ05GTUFOREFUT1JZQlNTSURfU1lNQk9MCTB4RkMyMQorI2RlZmluZSBIRVJNRVNfUklEX0NORldFUERFRkFVTFRLRVlJRAkJMHhGQzIzCisjZGVmaW5lIEhFUk1FU19SSURfQ05GREVGQVVMVEtFWTAJCTB4RkMyNAorI2RlZmluZSBIRVJNRVNfUklEX0NORkRFRkFVTFRLRVkxCQkweEZDMjUKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZNV09ST0JVU1RfQUdFUkUJCTB4RkMyNQorI2RlZmluZSBIRVJNRVNfUklEX0NORkRFRkFVTFRLRVkyCQkweEZDMjYKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZERUZBVUxUS0VZMwkJMHhGQzI3CisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0VQRkxBR1NfSU5URVJTSUwJCTB4RkMyOAorI2RlZmluZSBIRVJNRVNfUklEX0NORldFUEtFWU1BUFBJTkdUQUJMRQkweEZDMjkKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZBVVRIRU5USUNBVElPTgkJMHhGQzJBCisjZGVmaW5lIEhFUk1FU19SSURfQ05GTUFYQVNTT0NTVEEJCTB4RkMyQgorI2RlZmluZQlIRVJNRVNfUklEX0NORktFWUxFTkdUSF9TWU1CT0wJCTB4RkMyQgorI2RlZmluZSBIRVJNRVNfUklEX0NORlRYQ09OVFJPTAkJCTB4RkMyQworI2RlZmluZSBIRVJNRVNfUklEX0NORlJPQU1JTkdNT0RFCQkweEZDMkQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZIT1NUQVVUSEVOVElDQVRJT04JMHhGQzJFCisjZGVmaW5lIEhFUk1FU19SSURfQ05GUkNWQ1JDRVJST1IJCTB4RkMzMAorI2RlZmluZSBIRVJNRVNfUklEX0NORk1NTElGRQkJCTB4RkMzMQorI2RlZmluZSBIRVJNRVNfUklEX0NORkFMVFJFVFJZQ09VTlQJCTB4RkMzMgorI2RlZmluZSBIRVJNRVNfUklEX0NORkJFQUNPTklOVAkJCTB4RkMzMworI2RlZmluZSBIRVJNRVNfUklEX0NORkFQUENGSU5GTwkJCTB4RkMzNAorI2RlZmluZSBIRVJNRVNfUklEX0NORlNUQVBDRklORk8JCTB4RkMzNQorI2RlZmluZSBIRVJNRVNfUklEX0NORlBSSU9SSVRZUVVTQUdFCQkweEZDMzcKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZUSU1DVFJMCQkJMHhGQzQwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GVEhJUlRZMlRBTExZCQkweEZDNDIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZFTkhTRUNVUklUWQkJMHhGQzQzCisjZGVmaW5lIEhFUk1FU19SSURfQ05GR1JPVVBBRERSRVNTRVMJCTB4RkM4MAorI2RlZmluZSBIRVJNRVNfUklEX0NORkNSRUFURUlCU1MJCTB4RkM4MQorI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQJMHhGQzgyCisjZGVmaW5lIEhFUk1FU19SSURfQ05GUlRTVEhSRVNIT0xECQkweEZDODMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZUWFJBVEVDT05UUk9MCQkweEZDODQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZQUk9NSVNDVU9VU01PREUJCTB4RkM4NQorI2RlZmluZSBIRVJNRVNfUklEX0NORkJBU0lDUkFURVNfU1lNQk9MCQkweEZDOEEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZQUkVBTUJMRV9TWU1CT0wJCTB4RkM4QworI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQwCTB4RkM5MAorI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQxCTB4RkM5MQorI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQyCTB4RkM5MgorI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQzCTB4RkM5MworI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQ0CTB4RkM5NAorI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQ1CTB4RkM5NQorI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQ2CTB4RkM5NgorI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRDAJCTB4RkM5NworI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRDEJCTB4RkM5OAorI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRDIJCTB4RkM5OQorI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRDMJCTB4RkM5QQorI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRDQJCTB4RkM5QgorI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRDUJCTB4RkM5QworI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRDYJCTB4RkM5RAorI2RlZmluZSBIRVJNRVNfUklEX0NORkhPU1RTQ0FOX1NZTUJPTAkJMHhGQ0FCCisjZGVmaW5lIEhFUk1FU19SSURfQ05GU0hPUlRQUkVBTUJMRQkJMHhGQ0IwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0VQS0VZU19BR0VSRQkJMHhGQ0IwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GRVhDTFVERUxPTkdQUkVBTUJMRQkweEZDQjEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZUWEtFWV9BR0VSRQkJMHhGQ0IxCisjZGVmaW5lIEhFUk1FU19SSURfQ05GQVVUSEVOVElDQVRJT05SU1BUTwkweEZDQjIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZTQ0FOU1NJRF9BR0VSRQkJMHhGQ0IyCisjZGVmaW5lIEhFUk1FU19SSURfQ05GQkFTSUNSQVRFUwkJMHhGQ0IzCisjZGVmaW5lIEhFUk1FU19SSURfQ05GU1VQUE9SVEVEUkFURVMJCTB4RkNCNAorI2RlZmluZSBIRVJNRVNfUklEX0NORlRJQ0tUSU1FCQkJMHhGQ0UwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GU0NBTlJFUVVFU1QJCTB4RkNFMQorI2RlZmluZSBIRVJNRVNfUklEX0NORkpPSU5SRVFVRVNUCQkweEZDRTIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZBVVRIRU5USUNBVEVTVEFUSU9OCTB4RkNFMworI2RlZmluZSBIRVJNRVNfUklEX0NORkNIQU5ORUxJTkZPUkVRVUVTVAkweEZDRTQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZIT1NUU0NBTgkJCTB4RkNFNQorCisvKgorICogSW5mb3JtYXRpb24gUklEcworICovCisjZGVmaW5lIEhFUk1FU19SSURfTUFYTE9BRFRJTUUJCQkweEZEMDAKKyNkZWZpbmUgSEVSTUVTX1JJRF9ET1dOTE9BREJVRkZFUgkJMHhGRDAxCisjZGVmaW5lIEhFUk1FU19SSURfUFJJSUQJCQkweEZEMDIKKyNkZWZpbmUgSEVSTUVTX1JJRF9QUklTVVBSQU5HRQkJCTB4RkQwMworI2RlZmluZSBIRVJNRVNfUklEX0NGSUFDVFJBTkdFUwkJCTB4RkQwNAorI2RlZmluZSBIRVJNRVNfUklEX05JQ1NFUk5VTQkJCTB4RkQwQQorI2RlZmluZSBIRVJNRVNfUklEX05JQ0lECQkJMHhGRDBCCisjZGVmaW5lIEhFUk1FU19SSURfTUZJU1VQUkFOR0UJCQkweEZEMEMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DRklTVVBSQU5HRQkJCTB4RkQwRAorI2RlZmluZSBIRVJNRVNfUklEX0NIQU5ORUxMSVNUCQkJMHhGRDEwCisjZGVmaW5lIEhFUk1FU19SSURfUkVHVUxBVE9SWURPTUFJTlMJCTB4RkQxMQorI2RlZmluZSBIRVJNRVNfUklEX1RFTVBUWVBFCQkJMHhGRDEyCisjZGVmaW5lIEhFUk1FU19SSURfQ0lTCQkJCTB4RkQxMworI2RlZmluZSBIRVJNRVNfUklEX1NUQUlECQkJMHhGRDIwCisjZGVmaW5lIEhFUk1FU19SSURfU1RBU1VQUkFOR0UJCQkweEZEMjEKKyNkZWZpbmUgSEVSTUVTX1JJRF9NRklBQ1RSQU5HRVMJCQkweEZEMjIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DRklBQ1RSQU5HRVMyCQkweEZEMjMKKyNkZWZpbmUgSEVSTUVTX1JJRF9TRUNPTkRBUllWRVJTSU9OX1NZTUJPTAkweEZEMjQKKyNkZWZpbmUgSEVSTUVTX1JJRF9QT1JUU1RBVFVTCQkJMHhGRDQwCisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFNTSUQJCQkweEZENDEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UQlNTSUQJCQkweEZENDIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DT01NU1FVQUxJVFkJCQkweEZENDMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UVFhSQVRFCQkweEZENDQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UQkVBQ09OSU5URVJWQUwJMHhGRDQ1CisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFNDQUxFVEhSRVNIT0xEUwkweEZENDYKKyNkZWZpbmUgSEVSTUVTX1JJRF9QUk9UT0NPTFJTUFRJTUUJCTB4RkQ0NworI2RlZmluZSBIRVJNRVNfUklEX1NIT1JUUkVUUllMSU1JVAkJMHhGRDQ4CisjZGVmaW5lIEhFUk1FU19SSURfTE9OR1JFVFJZTElNSVQJCTB4RkQ0OQorI2RlZmluZSBIRVJNRVNfUklEX01BWFRSQU5TTUlUTElGRVRJTUUJCTB4RkQ0QQorI2RlZmluZSBIRVJNRVNfUklEX01BWFJFQ0VJVkVMSUZFVElNRQkJMHhGRDRCCisjZGVmaW5lIEhFUk1FU19SSURfQ0ZQT0xMQUJMRQkJCTB4RkQ0QworI2RlZmluZSBIRVJNRVNfUklEX0FVVEhFTlRJQ0FUSU9OQUxHT1JJVEhNUwkweEZENEQKKyNkZWZpbmUgSEVSTUVTX1JJRF9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQJMHhGRDRGCisjZGVmaW5lIEhFUk1FU19SSURfREJNQ09NTVNRVUFMSVRZX0lOVEVSU0lMCTB4RkQ1MQorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRUWFJBVEUxCQkweEZEODAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UVFhSQVRFMgkJMHhGRDgxCisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFRYUkFURTMJCTB4RkQ4MgorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRUWFJBVEU0CQkweEZEODMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UVFhSQVRFNQkJMHhGRDg0CisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFRYUkFURTYJCTB4RkQ4NQorI2RlZmluZSBIRVJNRVNfUklEX09XTk1BQ0FERFIJCQkweEZEODYKKyNkZWZpbmUgSEVSTUVTX1JJRF9TQ0FOUkVTVUxUU1RBQkxFCQkweEZEODgKKyNkZWZpbmUgSEVSTUVTX1JJRF9QSFlUWVBFCQkJMHhGREMwCisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVENIQU5ORUwJCTB4RkRDMQorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRQT1dFUlNUQVRFCQkweEZEQzIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DQ0FNT0RFCQkJMHhGREMzCisjZGVmaW5lIEhFUk1FU19SSURfU1VQUE9SVEVEREFUQVJBVEVTCQkweEZEQzYKKyNkZWZpbmUgSEVSTUVTX1JJRF9CVUlMRFNFUQkJCTB4RkZGRQorI2RlZmluZSBIRVJNRVNfUklEX0ZXSUQJCQkJMHhGRkZGCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaTgyNTg2LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pODI1ODYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjY1YjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaTgyNTg2LmgKQEAgLTAsMCArMSw0MTMgQEAKKy8qCisgKiBJbnRlbCA4MjU4NiBJRUVFIDgwMi4zIEV0aGVybmV0IExBTiBDb3Byb2Nlc3Nvci4KKyAqCisgKiBTZWU6CisgKglJbnRlbCBNaWNyb2NvbW11bmljYXRpb25zIDE5OTEKKyAqCXAxLTEgdG8gcDEtMzcKKyAqCUludGVsIG9yZGVyIE5vLiAyMzE2NTgKKyAqCUlTQk4gMS01NTUxMi0xMTktNQorICoKKyAqICAgICBVbmZvcnR1bmF0ZWx5LCB0aGUgYWJvdmUgY2hhcHRlciBtZW50aW9ucyBuZWl0aGVyCisgKiB0aGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAoU0NQKSBub3IgdGhlCisgKiBJbnRlcm1lZGlhdGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAoSVNDUCksCisgKiBzbyB3ZSBwcm9iYWJseSBuZWVkIHRvIGxvb2sgZWxzZXdoZXJlIGZvciB0aGUKKyAqIHdob2xlIHN0b3J5IC0tIHNvbWUgcmVjb21tZW5kIHRoZSAiSW50ZWwgTEFOCisgKiBDb21wb25lbnRzIG1hbnVhbCIgYnV0IEkgaGF2ZSBuZWl0aGVyIGEgY29weQorICogbm9yIGEgZnVsbCByZWZlcmVuY2UuICBCdXQgImVsc2V3aGVyZSIgbWF5IGJlCisgKiBpbiB0aGUgc2FtZSBwdWJsaWNhdGlvbi4uLgorICogICAgIFRoZSBkZXNjcmlwdGlvbiBvZiBhIGxhdGVyIGRldmljZSwgdGhlCisgKiAiODI1OTZDQSBIaWdoLVBlcmZvcm1hbmNlIDMyLUJpdCBMb2NhbCBBcmVhIE5ldHdvcmsKKyAqIENvcHJvY2Vzc29yIiwgKGliaWQuIHAxLTM4IHRvIHAxLTEwOSkgZG9lcyBtZW50aW9uCisgKiB0aGUgU0NQIGFuZCBJU0NQIGFuZCBhbHNvIGhhcyBhbiBpODI1ODYgY29tcGF0aWJpbGl0eQorICogbW9kZS4gIEV2ZW4gbW9yZSB1c2VmdWwgaXMgIkFQLTIzNSBBbiA4MjU4NiBEYXRhIExpbmsKKyAqIERyaXZlciIgKGliaWQuIHAxLTMzNyB0byBwMS00MTcpLgorICovCisKKyNkZWZpbmUJSTgyNTg2X01FTVoJKDY0ICogMTAyNCkKKworI2RlZmluZQlJODI1ODZfU0NQX0FERFIJKEk4MjU4Nl9NRU1aIC0gc2l6ZW9mKHNjcF90KSkKKworI2RlZmluZQlBRERSX0xFTgk2CisjZGVmaW5lCUk4MjU4Nk5VTEwJMHhGRkZGCisKKyNkZWZpbmUJdG9mZih0LHAsZikgCSh1bnNpZ25lZCBzaG9ydCkoKHZvaWQgKikoJigodCAqKSgodm9pZCAqKTAgKyAocCkpKS0+ZikgLSAodm9pZCAqKTApCisKKy8qCisgKiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChTQ1ApLgorICovCit0eXBlZGVmIHN0cnVjdCBzY3BfdAlzY3BfdDsKK3N0cnVjdCBzY3BfdAoreworCXVuc2lnbmVkIHNob3J0CXNjcF9zeXNidXM7CS8qIDgyNTg2IGJ1cyB3aWR0aDoJKi8KKyNkZWZpbmUJCVNDUF9TWV8xNkJCVVMJKDB4MCA8PCAwKQkvKiAxNiBiaXRzICovCisjZGVmaW5lCQlTQ1BfU1lfOEJCVVMJKDB4MSA8PCAwKQkvKiAgOCBiaXRzLiAqLworCXVuc2lnbmVkIHNob3J0CXNjcF9qdW5rWzJdOwkvKiBVbnVzZWQgKi8KKwl1bnNpZ25lZCBzaG9ydAlzY3BfaXNjcGw7CS8qIGxvd2VyIDE2IGJpdHMgb2YgSVNDUF9BRERSICovCisJdW5zaWduZWQgc2hvcnQJc2NwX2lzY3BoOwkvKiB1cHBlciAxNiBiaXRzIG9mIElTQ1BfQUREUiAqLworfTsKKworLyoKKyAqIEludGVybWVkaWF0ZSBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChJU0NQKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgaXNjcF90CWlzY3BfdDsKK3N0cnVjdCBpc2NwX3QKK3sKKwl1bnNpZ25lZCBzaG9ydAlpc2NwX2J1c3k7CS8qIHNldCBieSBDUFUgYmVmb3JlIGZpcnN0IENBLAkqLworCQkJCQkvKiBjbGVhcmVkIGJ5IDgyNTg2IGFmdGVyIHJlYWQuCSovCisJdW5zaWduZWQgc2hvcnQJaXNjcF9vZmZzZXQ7CS8qIG9mZnNldCBvZiBTQ0IJCSovCisJdW5zaWduZWQgc2hvcnQJaXNjcF9iYXNlbDsJLyogYmFzZSBvZiBTQ0IJCQkqLworCXVuc2lnbmVkIHNob3J0CWlzY3BfYmFzZWg7CS8qICAiCQkJCSovCit9OworCisvKgorICogU3lzdGVtIENvbnRyb2wgQmxvY2sgKFNDQikuCisgKglUaGUgODI1ODYgd3JpdGVzIGl0cyBzdGF0dXMgdG8gc2NiX3N0YXR1cyBhbmQgdGhlbgorICoJcmFpc2VzIGFuIGludGVycnVwdCB0byBhbGVydCB0aGUgQ1BVLgorICoJVGhlIENQVSB3cml0ZXMgYSBjb21tYW5kIHRvIHNjYl9jb21tYW5kIGFuZAorICoJdGhlbiBpc3N1ZXMgYSBDaGFubmVsIEF0dGVudGlvbiAoQ0EpIHRvIGFsZXJ0IHRoZSA4MjU4Ni4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc2NiX3QJc2NiX3Q7CitzdHJ1Y3Qgc2NiX3QKK3sKKwl1bnNpZ25lZCBzaG9ydAlzY2Jfc3RhdHVzOwkvKiBTdGF0dXMgb2YgODI1ODYJCSovCisjZGVmaW5lCQlTQ0JfU1RfSU5UCSgweEYgPDwgMTIpCS8qIFNvbWUgb2Y6CQkqLworI2RlZmluZQkJU0NCX1NUX0NYCSgweDEgPDwgMTUpCS8qIENtZCBjb21wbGV0ZWQJKi8KKyNkZWZpbmUJCVNDQl9TVF9GUgkoMHgxIDw8IDE0KQkvKiBGcmFtZSByZWNlaXZlZAkqLworI2RlZmluZQkJU0NCX1NUX0NOQQkoMHgxIDw8IDEzKQkvKiBDbWQgdW5pdCBub3QgYWN0aXZlCSovCisjZGVmaW5lCQlTQ0JfU1RfUk5SCSgweDEgPDwgMTIpCS8qIFJjdiB1bml0IG5vdCByZWFkeQkqLworI2RlZmluZQkJU0NCX1NUX0pVTkswCSgweDEgPDwgMTEpCS8qIDAJCQkqLworI2RlZmluZQkJU0NCX1NUX0NVUwkoMHg3IDw8ICA4KQkvKiBDbWQgdW5pdCBzdGF0dXMJKi8KKyNkZWZpbmUJCQlTQ0JfU1RfQ1VTX0lETEUJKDAgPDwgOCkJLyogSWRsZQkJKi8KKyNkZWZpbmUJCQlTQ0JfU1RfQ1VTX1NVU1AJKDEgPDwgOCkJLyogU3VzcGVuZGVkCSovCisjZGVmaW5lCQkJU0NCX1NUX0NVU19BQ1RWCSgyIDw8IDgpCS8qIEFjdGl2ZQkqLworI2RlZmluZQkJU0NCX1NUX0pVTksxCSgweDEgPDwgIDcpCS8qIDAJCQkqLworI2RlZmluZQkJU0NCX1NUX1JVUwkoMHg3IDw8ICA0KQkvKiBSY3YgdW5pdCBzdGF0dXMJKi8KKyNkZWZpbmUJCQlTQ0JfU1RfUlVTX0lETEUJKDAgPDwgNCkJLyogSWRsZQkJKi8KKyNkZWZpbmUJCQlTQ0JfU1RfUlVTX1NVU1AJKDEgPDwgNCkJLyogU3VzcGVuZGVkCSovCisjZGVmaW5lCQkJU0NCX1NUX1JVU19OUkVTCSgyIDw8IDQpCS8qIE5vIHJlc291cmNlcwkqLworI2RlZmluZQkJCVNDQl9TVF9SVVNfUkRZCSg0IDw8IDQpCS8qIFJlYWR5CSovCisJdW5zaWduZWQgc2hvcnQJc2NiX2NvbW1hbmQ7CS8qIE5leHQgY29tbWFuZAkJCSovCisjZGVmaW5lCQlTQ0JfQ01EX0FDS19DWAkoMHgxIDw8IDE1KQkvKiBBY2sgY21kIGNvbXBsZXRpb24JKi8KKyNkZWZpbmUJCVNDQl9DTURfQUNLX0ZSCSgweDEgPDwgMTQpCS8qIEFjayBmcmFtZSByZWNlaXZlZAkqLworI2RlZmluZQkJU0NCX0NNRF9BQ0tfQ05BCSgweDEgPDwgMTMpCS8qIEFjayBDVSBub3QgYWN0aXZlCSovCisjZGVmaW5lCQlTQ0JfQ01EX0FDS19STlIJKDB4MSA8PCAxMikJLyogQWNrIFJVIG5vdCByZWFkeQkqLworI2RlZmluZQkJU0NCX0NNRF9KVU5LWAkoMHgxIDw8IDExKQkvKiBVbnVzZWQJCSovCisjZGVmaW5lCQlTQ0JfQ01EX0NVQwkoMHg3IDw8ICA4KQkvKiBDb21tYW5kIFVuaXQgY29tbWFuZAkqLworI2RlZmluZQkJCVNDQl9DTURfQ1VDX05PUAkoMCA8PCA4KQkvKiBOb3AJCSovCisjZGVmaW5lCQkJU0NCX0NNRF9DVUNfR08JKDEgPDwgOCkJLyogU3RhcnQgY2JsX29mZnNldCAqLworI2RlZmluZQkJCVNDQl9DTURfQ1VDX1JFUwkoMiA8PCA4KQkvKiBSZXN1bWUgZXhlY3V0aW9uICovCisjZGVmaW5lCQkJU0NCX0NNRF9DVUNfU1VTCSgzIDw8IDgpCS8qIFN1c3BlbmQgICAiCSovCisjZGVmaW5lCQkJU0NCX0NNRF9DVUNfQUJUCSg0IDw8IDgpCS8qIEFib3J0ICAgICAiCSovCisjZGVmaW5lCQlTQ0JfQ01EX1JFU0VUCSgweDEgPDwgIDcpCS8qIFJlc2V0IGNoaXAgKGhhcmR3YXJlKSAqLworI2RlZmluZQkJU0NCX0NNRF9SVUMJKDB4NyA8PCAgNCkJLyogUmVjZWl2ZSBVbml0IGNvbW1hbmQJKi8KKyNkZWZpbmUJCQlTQ0JfQ01EX1JVQ19OT1AJKDAgPDwgNCkJLyogTm9wCQkqLworI2RlZmluZQkJCVNDQl9DTURfUlVDX0dPCSgxIDw8IDQpCS8qIFN0YXJ0IHJmYV9vZmZzZXQgKi8KKyNkZWZpbmUJCQlTQ0JfQ01EX1JVQ19SRVMJKDIgPDwgNCkJLyogUmVzdW1lIHJlY2VwdGlvbiAqLworI2RlZmluZQkJCVNDQl9DTURfUlVDX1NVUwkoMyA8PCA0KQkvKiBTdXNwZW5kICAgIgkqLworI2RlZmluZQkJCVNDQl9DTURfUlVDX0FCVAkoNCA8PCA0KQkvKiBBYm9ydCAgICAgIgkqLworCXVuc2lnbmVkIHNob3J0CXNjYl9jYmxfb2Zmc2V0OwkvKiBPZmZzZXQgb2YgZmlyc3QgY29tbWFuZCB1bml0CSovCisJCQkJCS8qIEFjdGlvbiBDb21tYW5kCQkqLworCXVuc2lnbmVkIHNob3J0CXNjYl9yZmFfb2Zmc2V0OwkvKiBPZmZzZXQgb2YgZmlyc3QgUmVjZWl2ZQkqLworCQkJCQkvKiBGcmFtZSBEZXNjcmlwdG9yIGluIHRoZQkqLworCQkJCQkvKiBSZWNlaXZlIEZyYW1lIEFyZWEJCSovCisJdW5zaWduZWQgc2hvcnQJc2NiX2NyY2VycnM7CS8qIFByb3Blcmx5IGFsaWduZWQgZnJhbWVzCSovCisJCQkJCS8qIHJlY2VpdmVkIHdpdGggYSBDUkMgZXJyb3IJKi8KKwl1bnNpZ25lZCBzaG9ydAlzY2JfYWxuZXJyczsJLyogTWlzYWxpZ25lZCBmcmFtZXMgcmVjZWl2ZWQJKi8KKwkJCQkJLyogd2l0aCBhIENSQyBlcnJvcgkJKi8KKwl1bnNpZ25lZCBzaG9ydAlzY2JfcnNjZXJyczsJLyogRnJhbWVzIGxvc3QgZHVlIHRvIG5vIHNwYWNlCSovCisJdW5zaWduZWQgc2hvcnQJc2NiX292cm5lcnJzOwkvKiBGcmFtZXMgbG9zdCBkdWUgdG8gc2xvdyBidXMJKi8KK307CisKKyNkZWZpbmUJc2Nib2ZmKHAsZikgCXRvZmYoc2NiX3QsIHAsIGYpCisKKy8qCisgKiBUaGUgZWlnaHQgQWN0aW9uIENvbW1hbmRzLgorICovCit0eXBlZGVmIGVudW0gYWNtZF9lCWFjbWRfZTsKK2VudW0gYWNtZF9lCit7CisJYWNtZF9ub3AJPSAwLAkvKiBEbyBub3RoaW5nCQkJCSovCisJYWNtZF9pYV9zZXR1cAk9IDEsCS8qIExvYWQgYW4gKGV0aGVybmV0KSBhZGRyZXNzIGludG8gdGhlCSovCisJCQkJLyogODI1ODYJCQkJKi8KKwlhY21kX2NvbmZpZ3VyZQk9IDIsCS8qIFVwZGF0ZSB0aGUgODI1ODYgb3BlcmF0aW5nIHBhcmFtZXRlcnMgKi8KKwlhY21kX21jX3NldHVwCT0gMywJLyogTG9hZCBhIGxpc3Qgb2YgKGV0aGVybmV0KSBtdWx0aWNhc3QJKi8KKwkJCQkvKiBhZGRyZXNzZXMgaW50byB0aGUgODI1ODYJCSovCisJYWNtZF90cmFuc21pdAk9IDQsCS8qIFRyYW5zbWl0IGEgZnJhbWUJCQkqLworCWFjbWRfdGRyCT0gNSwJLyogUGVyZm9ybSBhIFRpbWUgRG9tYWluIFJlZmxlY3RvbWV0ZXIJKi8KKwkJCQkvKiB0ZXN0IG9uIHRoZSBzZXJpYWwgbGluawkJKi8KKwlhY21kX2R1bXAJPSA2LAkvKiBDb3B5IDgyNTg2IHJlZ2lzdGVycyB0byBtZW1vcnkJKi8KKwlhY21kX2RpYWdub3NlCT0gNywJLyogUnVuIGFuIGludGVybmFsIHNlbGYgdGVzdAkJKi8KK307CisKKy8qCisgKiBHZW5lcmljIEFjdGlvbiBDb21tYW5kIGhlYWRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNoX3QJYWNoX3Q7CitzdHJ1Y3QgYWNoX3QKK3sKKwl1bnNpZ25lZCBzaG9ydAlhY19zdGF0dXM7CQkvKiBDb21tYW5kIHN0YXR1czoJKi8KKyNkZWZpbmUJCUFDX1NGTERfQwkoMHgxIDw8IDE1KQkvKiBDb21tYW5kIGNvbXBsZXRlZAkqLworI2RlZmluZQkJQUNfU0ZMRF9CCSgweDEgPDwgMTQpCS8qIEJ1c3kgZXhlY3V0aW5nCSovCisjZGVmaW5lCQlBQ19TRkxEX09LCSgweDEgPDwgMTMpCS8qIENvbXBsZXRlZCBlcnJvciBmcmVlCSovCisjZGVmaW5lCQlBQ19TRkxEX0EJKDB4MSA8PCAxMikJLyogQ29tbWFuZCBhYm9ydGVkCSovCisjZGVmaW5lCQlBQ19TRkxEX0ZBSUwJKDB4MSA8PCAxMSkJLyogU2VsZnRlc3QgZmFpbGVkCSovCisjZGVmaW5lCQlBQ19TRkxEX1MxMAkoMHgxIDw8IDEwKQkvKiBObyBjYXJyaWVyIHNlbnNlCSovCisJCQkJCQkvKiBkdXJpbmcgdHJhbnNtaXNzaW9uCSovCisjZGVmaW5lCQlBQ19TRkxEX1M5CSgweDEgPDwgIDkpCS8qIFR4IHVuc3VjY2Vzc2Z1bDoJKi8KKwkJCQkJCS8qIChzdG9wcGVkKSBsb3N0IENUUwkqLworI2RlZmluZQkJQUNfU0ZMRF9TOAkoMHgxIDw8ICA4KQkvKiBUeCB1bnN1Y2Nlc3NmdWw6CSovCisJCQkJCQkvKiAoc3RvcHBlZCkgc2xvdyBETUEJKi8KKyNkZWZpbmUJCUFDX1NGTERfUzcJKDB4MSA8PCAgNykJLyogVHggZGVmZXJyZWQ6CQkqLworCQkJCQkJLyogb3RoZXIgbGluayB0cmFmZmljCSovCisjZGVmaW5lCQlBQ19TRkxEX1M2CSgweDEgPDwgIDYpCS8qIEhlYXJ0IEJlYXQ6IGNvbGxpc2lvbiAqLworCQkJCQkJLyogZGV0ZWN0IGFmdGVyIGxhc3QgdHgJKi8KKyNkZWZpbmUJCUFDX1NGTERfUzUJKDB4MSA8PCAgNSkJLyogVHggc3RvcHBlZDoJCSovCisJCQkJCQkvKiBleGNlc3NpdmUgY29sbGlzaW9ucwkqLworI2RlZmluZQkJQUNfU0ZMRF9NQVhDT0wJKDB4RiA8PCAgMCkJLyogQ29sbGlzaW9uIGNvdW50ICAJKi8KKwl1bnNpZ25lZCBzaG9ydAlhY19jb21tYW5kOwkJLyogQ29tbWFuZCBzcGVjaWZpZXI6CSovCisjZGVmaW5lCQlBQ19DRkxEX0VMCSgweDEgPDwgMTUpCS8qIEVuZCBvZiBjb21tYW5kIGxpc3QJKi8KKyNkZWZpbmUJCUFDX0NGTERfUwkoMHgxIDw8IDE0KQkvKiBTdXNwZW5kIG9uIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUJCUFDX0NGTERfSQkoMHgxIDw8IDEzKQkvKiBJbnRlcnJ1cHQgb24gY29tcGxldGlvbiAqLworI2RlZmluZQkJQUNfQ0ZMRF9DTUQJKDB4NyA8PCAgMCkJLyogYWNtZF9lCQkqLworCXVuc2lnbmVkIHNob3J0CWFjX2xpbms7CQkvKiBOZXh0IEFjdGlvbiBDb21tYW5kCSovCit9OworCisjZGVmaW5lCWFjb2ZmKHAsZikgCXRvZmYoYWNoX3QsIHAsIGYpCisKKy8qCisgKiBUaGUgTm9wIEFjdGlvbiBDb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCBhY19ub3BfdAlhY19ub3BfdDsKK3N0cnVjdCBhY19ub3BfdAoreworCWFjaF90CW5vcF9oOworfTsKKworLyoKKyAqIFRoZSBJQS1TZXR1cCBBY3Rpb24gQ29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNfaWFzX3QJYWNfaWFzX3Q7CitzdHJ1Y3QgYWNfaWFzX3QKK3sKKwlhY2hfdAkJaWFzX2g7CisJdW5zaWduZWQgY2hhcglpYXNfYWRkcltBRERSX0xFTl07IC8qIFRoZSAoZXRoZXJuZXQpIGFkZHJlc3MJKi8KK307CisKKy8qCisgKiBUaGUgQ29uZmlndXJlIEFjdGlvbiBDb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCBhY19jZmdfdAlhY19jZmdfdDsKK3N0cnVjdCBhY19jZmdfdAoreworCWFjaF90CQljZmdfaDsKKwl1bnNpZ25lZCBjaGFyCWNmZ19ieXRlX2NudDsJLyogU2l6ZSBmb2xsIGRhdGE6IDQtMTIJKi8KKyNkZWZpbmUJQUNfQ0ZHX0JZVEVfQ05UKHYpCSgoKHYpICYgMHhGKSA8PCAwKQorCXVuc2lnbmVkIGNoYXIJY2ZnX2ZpZm9saW07CS8qIEZJRk8gdGhyZXNob2xkCSovCisjZGVmaW5lCUFDX0NGR19GSUZPTElNKHYpCSgoKHYpICYgMHhGKSA8PCAwKQorCXVuc2lnbmVkIGNoYXIJY2ZnX2J5dGU4OworI2RlZmluZQlBQ19DRkdfU0FWX0JGKHYpIAkoKCh2KSAmIDB4MSkgPDwgNykJLyogU2F2ZSByeGQgYmFkIGZyYW1lcwkqLworI2RlZmluZQlBQ19DRkdfU1JEWSh2KSAJCSgoKHYpICYgMHgxKSA8PCA2KQkvKiBTUkRZL0FSRFkgcGluIG1lYW5zCSovCisJCQkJCQkJLyogZXh0ZXJuYWwgc3luYy4JKi8KKwl1bnNpZ25lZCBjaGFyCWNmZ19ieXRlOTsKKyNkZWZpbmUJQUNfQ0ZHX0VMUEJDSyh2KQkoKCh2KSAmIDB4MSkgPDwgNykJLyogRXh0ZXJuYWwgbG9vcGJhY2sJKi8KKyNkZWZpbmUJQUNfQ0ZHX0lMUEJDSyh2KQkoKCh2KSAmIDB4MSkgPDwgNikJLyogSW50ZXJuYWwgbG9vcGJhY2sJKi8KKyNkZWZpbmUJQUNfQ0ZHX1BSRUxFTih2KQkoKCh2KSAmIDB4MykgPDwgNCkJLyogUHJlYW1ibGUgbGVuZ3RoCSovCisjZGVmaW5lCQlBQ19DRkdfUExFTl8yCQkwCQkvKiAgMiBieXRlcwkqLworI2RlZmluZQkJQUNfQ0ZHX1BMRU5fNAkJMQkJLyogIDQgYnl0ZXMJKi8KKyNkZWZpbmUJCUFDX0NGR19QTEVOXzgJCTIJCS8qICA4IGJ5dGVzCSovCisjZGVmaW5lCQlBQ19DRkdfUExFTl8xNgkJMwkJLyogMTYgYnl0ZXMJKi8KKyNkZWZpbmUJQUNfQ0ZHX0FMT0ModikJCSgoKHYpICYgMHgxKSA8PCAzKQkvKiBBZGRyL2xlbiBkYXRhIGlzCSovCisJCQkJCQkJLyogZXhwbGljaXQgaW4gYnVmZmVycwkqLworI2RlZmluZQlBQ19DRkdfQUREUkxFTih2KQkoKCh2KSAmIDB4NykgPDwgMCkJLyogQnl0ZXMgcGVyIGFkZHJlc3MJKi8KKwl1bnNpZ25lZCBjaGFyCWNmZ19ieXRlMTA7CisjZGVmaW5lCUFDX0NGR19CT0ZNRVQodikJKCgodikgJiAweDEpIDw8IDcpCS8qIFVzZSBhbHRlcm5hdGUgZXhwby4JKi8KKwkJCQkJCQkvKiBiYWNrb2ZmIG1ldGhvZAkqLworI2RlZmluZQlBQ19DRkdfQUNSKHYpCQkoKCh2KSAmIDB4NykgPDwgNCkJLyogQWNjZWxlcmF0ZWQgY29udC4gcmVzLiAqLworI2RlZmluZQlBQ19DRkdfTElOUFJJTyh2KQkoKCh2KSAmIDB4NykgPDwgMCkJLyogTGluZWFyIHByaW9yaXR5CSovCisJdW5zaWduZWQgY2hhcgljZmdfaWZzOwkvKiBJbnRlcmZyYW1lIHNwYWNpbmcJCSovCisJdW5zaWduZWQgY2hhcgljZmdfc2xvdGw7CS8qIFNsb3QgdGltZSAobG93IGJ5dGUpCQkqLworCXVuc2lnbmVkIGNoYXIJY2ZnX2J5dGUxMzsKKyNkZWZpbmUJQUNfQ0ZHX1JFVFJZTlVNKHYpCSgoKHYpICYgMHhGKSA8PCA0KQkvKiBNYXguIGNvbGxpc2lvbiByZXRyeQkqLworI2RlZmluZQlBQ19DRkdfU0xUVE1ISSh2KQkoKCh2KSAmIDB4NykgPDwgMCkJLyogU2xvdCB0aW1lIChoaWdoIGJpdHMpICovCisJdW5zaWduZWQgY2hhcgljZmdfYnl0ZTE0OworI2RlZmluZQlBQ19DRkdfRkxHUEFEKHYpCSgoKHYpICYgMHgxKSA8PCA3KQkvKiBQYWQgd2l0aCBIRExDIGZsYWdzCSovCisjZGVmaW5lCUFDX0NGR19CVFNURih2KQkJKCgodikgJiAweDEpIDw8IDYpCS8qIERvIEhETEMgYml0c3R1ZmZpbmcJKi8KKyNkZWZpbmUJQUNfQ0ZHX0NSQzE2KHYpCQkoKCh2KSAmIDB4MSkgPDwgNSkJLyogMTYgYml0IENDSVRUIENSQwkqLworI2RlZmluZQlBQ19DRkdfTkNSQyh2KQkJKCgodikgJiAweDEpIDw8IDQpCS8qIEluc2VydCBubyBDUkMJKi8KKyNkZWZpbmUJQUNfQ0ZHX1ROQ1JTKHYpCQkoKCh2KSAmIDB4MSkgPDwgMykJLyogVHggZXZlbiBpZiBubyBjYXJyaWVyICovCisjZGVmaW5lCUFDX0NGR19NQU5DSCh2KQkJKCgodikgJiAweDEpIDw8IDIpCS8qIE1hbmNoZXN0ZXIgY29kaW5nCSovCisjZGVmaW5lCUFDX0NGR19CQ0RJUyh2KQkJKCgodikgJiAweDEpIDw8IDEpCS8qIERpc2FibGUgYnJvYWRjYXN0CSovCisjZGVmaW5lCUFDX0NGR19QUk0odikJCSgoKHYpICYgMHgxKSA8PCAwKQkvKiBQcm9taXNjdW91cyBtb2RlCSovCisJdW5zaWduZWQgY2hhcgljZmdfYnl0ZTE1OworI2RlZmluZQlBQ19DRkdfSUNEUyh2KQkJKCgodikgJiAweDEpIDw8IDcpCS8qIEludGVybmFsIGNvbGxpc2lvbgkqLworCQkJCQkJCS8qIGRldGVjdCBzb3VyY2UJKi8KKyNkZWZpbmUJQUNfQ0ZHX0NEVEYodikJCSgoKHYpICYgMHg3KSA8PCA0KQkvKiBDb2xsaXNpb24gZGV0ZWN0CSovCisJCQkJCQkJLyogZmlsdGVyIGluIGJpdCB0aW1lcwkqLworI2RlZmluZQlBQ19DRkdfSUNTUyh2KQkJKCgodikgJiAweDEpIDw8IDMpCS8qIEludGVybmFsIGNhcnJpZXIJKi8KKwkJCQkJCQkvKiBzZW5zZSBzb3VyY2UJCSovCisjZGVmaW5lCUFDX0NGR19DU1RGKHYpCQkoKCh2KSAmIDB4NykgPDwgMCkJLyogQ2FycmllciBzZW5zZQkqLworCQkJCQkJCS8qIGZpbHRlciBpbiBiaXQgdGltZXMJKi8KKwl1bnNpZ25lZCBzaG9ydAljZmdfbWluX2ZybV9sZW47CisjZGVmaW5lCUFDX0NGR19NTkZSTSh2KQkJKCgodikgJiAweEZGKSA8PCAwKQkvKiBNaW4uIGJ5dGVzL2ZyYW1lICg8PSAyNTUpICovCit9OworCisvKgorICogVGhlIE1DLVNldHVwIEFjdGlvbiBDb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCBhY19tY3NfdAlhY19tY3NfdDsKK3N0cnVjdCBhY19tY3NfdAoreworCWFjaF90CQltY3NfaDsKKwl1bnNpZ25lZCBzaG9ydAltY3NfY250OwkvKiBOby4gb2YgYnl0ZXMgb2YgTUMgYWRkcmVzc2VzCSovCisjaWYgMAorCXVuc2lnbmVkIGNoYXIJbWNzX2RhdGFbQUREUl9MRU5dOyAvKiBUaGUgZmlyc3QgTUMgYWRkcmVzcyAuLgkqLworCS4uLgorI2VuZGlmCit9OworCisjZGVmaW5lIEk4MjU4Nl9NQVhfTVVMVElDQVNUX0FERFJFU1NFUwkxMjgJLyogSGFyZHdhcmUgaGFzaGVkIGZpbHRlciAqLworCisvKgorICogVGhlIFRyYW5zbWl0IEFjdGlvbiBDb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCBhY190eF90CWFjX3R4X3Q7CitzdHJ1Y3QgYWNfdHhfdAoreworCWFjaF90CQl0eF9oOworCXVuc2lnbmVkIHNob3J0CXR4X3RiZF9vZmZzZXQ7CS8qIEFkZHJlc3Mgb2YgbGlzdCBvZiBidWZmZXJzLgkqLworI2lmCTAKK0xpbnV4IHBhY2tldHMgYXJlIHBhc3NlZCBkb3duIHdpdGggdGhlIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCithbmQgbGVuZ3RoL3R5cGUgZmllbGQgYWxyZWFkeSBwcmVwZW5kZWQgdG8gdGhlIGRhdGEsCitzbyB3ZSBkbyBub3QgbmVlZCB0byBpbnNlcnQgaXQuICBDb25zaXN0ZW50IHdpdGggdGhpcword2UgbXVzdCBhbHNvIHNldCB0aGUgQUNfQ0ZHX0FMT0MoLi4pIGZsYWcgZHVyaW5nIHRoZQorYWNfY2ZnX3QgYWN0aW9uIGNvbW1hbmQuCisJdW5zaWduZWQgY2hhcgl0eF9hZGRyW0FERFJfTEVOXTsgLyogVGhlIGZyYW1lIGRlc3QuIGFkZHJlc3MJKi8KKwl1bnNpZ25lZCBzaG9ydAl0eF9sZW5ndGg7CS8qIFRoZSBmcmFtZSBsZW5ndGgJCSovCisjZW5kaWYJLyogMCAqLworfTsKKworLyoKKyAqIFRoZSBUaW1lIERvbWFpbiBSZWZsZWN0b21ldGVyIEFjdGlvbiBDb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCBhY190ZHJfdAlhY190ZHJfdDsKK3N0cnVjdCBhY190ZHJfdAoreworCWFjaF90CQl0ZHJfaDsKKwl1bnNpZ25lZCBzaG9ydAl0ZHJfcmVzdWx0OwkvKiBSZXN1bHQuCSovCisjZGVmaW5lCQlBQ19URFJfTE5LX09LCSgweDEgPDwgMTUpCS8qIE5vIGxpbmsgcHJvYmxlbQkqLworI2RlZmluZQkJQUNfVERSX1hDVlJfUFJCCSgweDEgPDwgMTQpCS8qIFR4Y3ZyIGNhYmxlIHByb2JsZW0JKi8KKyNkZWZpbmUJCUFDX1REUl9FVF9PUE4JKDB4MSA8PCAxMykJLyogT3BlbiBvbiB0aGUgbGluawkqLworI2RlZmluZQkJQUNfVERSX0VUX1NSVAkoMHgxIDw8IDEyKQkvKiBTaG9ydCBvbiB0aGUgbGluawkqLworI2RlZmluZQkJQUNfVERSX1RJTUUJKDB4N0ZGIDw8IDApCS8qIERpc3RhbmNlIHRvIHByb2JsZW0JKi8KKwkJCQkJCS8qIHNpdGUJaW4gdHJhbnNtaXQJKi8KKwkJCQkJCS8qIGNsb2NrIGN5Y2xlcwkJKi8KK307CisKKy8qCisgKiBUaGUgRHVtcCBBY3Rpb24gQ29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNfZG1wX3QJYWNfZG1wX3Q7CitzdHJ1Y3QgYWNfZG1wX3QKK3sKKwlhY2hfdAkJZG1wX2g7CisJdW5zaWduZWQgc2hvcnQJZG1wX29mZnNldDsJLyogUmVzdWx0LgkqLworfTsKKworLyoKKyAqIFNpemUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgZHVtcCBjb21tYW5kLgorICovCisjZGVmaW5lCURVTVBCWVRFUwkxNzAKKworLyoKKyAqIFRoZSBEaWFnbm9zZSBBY3Rpb24gQ29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNfZGduX3QJYWNfZGduX3Q7CitzdHJ1Y3QgYWNfZGduX3QKK3sKKwlhY2hfdAkJZGduX2g7Cit9OworCisvKgorICogVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgKFRCRCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHRiZF90CXRiZF90Oworc3RydWN0IHRiZF90Cit7CisJdW5zaWduZWQgc2hvcnQJdGJkX3N0YXR1czsJCS8qIFdyaXR0ZW4gYnkgdGhlIENQVQkqLworI2RlZmluZQkJVEJEX1NUQVRVU19FT0YJKDB4MSA8PCAxNSkJLyogVGhpcyBUQkQgaXMgdGhlCSovCisJCQkJCQkvKiBsYXN0IGZvciB0aGlzIGZyYW1lCSovCisjZGVmaW5lCQlUQkRfU1RBVFVTX0FDTlQJKDB4M0ZGRiA8PCAwKQkvKiBBY3R1YWwgY291bnQgb2YgZGF0YQkqLworCQkJCQkJLyogYnl0ZXMgaW4gdGhpcyBidWZmZXIJKi8KKwl1bnNpZ25lZCBzaG9ydAl0YmRfbmV4dF9iZF9vZmZzZXQ7CS8qIE5leHQgaW4gbGlzdAkJKi8KKwl1bnNpZ25lZCBzaG9ydAl0YmRfYnVmbDsJCS8qIEJ1ZmZlciBhZGRyZXNzIChsb3cpCSovCisJdW5zaWduZWQgc2hvcnQJdGJkX2J1Zmg7CQkvKiAgICAiCSAgICAgIgkoaGlnaCkJKi8KK307CisKKy8qCisgKiBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIChSQkQpLgorICovCit0eXBlZGVmIHN0cnVjdCByYmRfdAlyYmRfdDsKK3N0cnVjdCByYmRfdAoreworCXVuc2lnbmVkIHNob3J0CXJiZF9zdGF0dXM7CQkvKiBXcml0dGVuIGJ5IHRoZSA4MjU4NgkqLworI2RlZmluZQkJUkJEX1NUQVRVU19FT0YJKDB4MSA8PCAxNSkJLyogVGhpcyBSQkQgaXMgdGhlCSovCisJCQkJCQkvKiBsYXN0IGZvciB0aGlzIGZyYW1lCSovCisjZGVmaW5lCQlSQkRfU1RBVFVTX0YJKDB4MSA8PCAxNCkJLyogQUNOVCBmaWVsZCBpcyB2YWxpZAkqLworI2RlZmluZQkJUkJEX1NUQVRVU19BQ05UCSgweDNGRkYgPDwgMCkJLyogQWN0dWFsIG5vLiBvZiBkYXRhCSovCisJCQkJCQkvKiBieXRlcyBpbiB0aGlzIGJ1ZmZlcgkqLworCXVuc2lnbmVkIHNob3J0CXJiZF9uZXh0X3JiZF9vZmZzZXQ7CS8qIE5leHQgcmJkIGluIGxpc3QJKi8KKwl1bnNpZ25lZCBzaG9ydAlyYmRfYnVmbDsJCS8qIERhdGEgcG9pbnRlciAobG93KQkqLworCXVuc2lnbmVkIHNob3J0CXJiZF9idWZoOwkJLyogICIJICAgIiAgICAoaGlnaCkJKi8KKwl1bnNpZ25lZCBzaG9ydAlyYmRfZWxfc2l6ZTsJCS8qIEVMK0RhdGEgYnVmLiBzaXplCSovCisjZGVmaW5lCQlSQkRfRUwJKDB4MSA8PCAxNSkJCS8qIFRoaXMgQkQgaXMgdGhlCSovCisJCQkJCQkvKiBsYXN0IGluIHRoZSBsaXN0CSovCisjZGVmaW5lCQlSQkRfU0laRSAoMHgzRkZGIDw8IDApCQkvKiBOby4gb2YgYnl0ZXMgdGhlCSovCisJCQkJCQkvKiBidWZmZXIgY2FuIGhvbGQJKi8KK307CisKKyNkZWZpbmUJcmJkb2ZmKHAsZikgCXRvZmYocmJkX3QsIHAsIGYpCisKKy8qCisgKiBGcmFtZSBEZXNjcmlwdG9yIChGRCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGZkX3QJZmRfdDsKK3N0cnVjdCBmZF90Cit7CisJdW5zaWduZWQgc2hvcnQJZmRfc3RhdHVzOwkJLyogV3JpdHRlbiBieSB0aGUgODI1ODYJKi8KKyNkZWZpbmUJCUZEX1NUQVRVU19DCSgweDEgPDwgMTUpCS8qIENvbXBsZXRlZCBzdG9yaW5nIGZyYW1lICovCisjZGVmaW5lCQlGRF9TVEFUVVNfQgkoMHgxIDw8IDE0KQkvKiBGRCB3YXMgY29uc3VtZWQgYnkgUlUgKi8KKyNkZWZpbmUJCUZEX1NUQVRVU19PSwkoMHgxIDw8IDEzKQkvKiBGcmFtZSByeGQgc3VjY2Vzc2Z1bGx5ICovCisjZGVmaW5lCQlGRF9TVEFUVVNfUzExCSgweDEgPDwgMTEpCS8qIENSQyBlcnJvcgkJKi8KKyNkZWZpbmUJCUZEX1NUQVRVU19TMTAJKDB4MSA8PCAxMCkJLyogQWxpZ25tZW50IGVycm9yCSovCisjZGVmaW5lCQlGRF9TVEFUVVNfUzkJKDB4MSA8PCAgOSkJLyogUmFuIG91dCBvZiByZXNvdXJjZXMJKi8KKyNkZWZpbmUJCUZEX1NUQVRVU19TOAkoMHgxIDw8ICA4KQkvKiBSeCBETUEgb3ZlcnJ1bgkqLworI2RlZmluZQkJRkRfU1RBVFVTX1M3CSgweDEgPDwgIDcpCS8qIEZyYW1lIHRvbyBzaG9ydAkqLworI2RlZmluZQkJRkRfU1RBVFVTX1M2CSgweDEgPDwgIDYpCS8qIE5vIEVPRiBmbGFnCQkqLworCXVuc2lnbmVkIHNob3J0CWZkX2NvbW1hbmQ7CQkvKiBDb21tYW5kCQkqLworI2RlZmluZQkJRkRfQ09NTUFORF9FTAkoMHgxIDw8IDE1KQkvKiBMYXN0IEZEIGluIGxpc3QJKi8KKyNkZWZpbmUJCUZEX0NPTU1BTkRfUwkoMHgxIDw8IDE0KQkvKiBTdXNwZW5kIFJVIGFmdGVyIHJ4CSovCisJdW5zaWduZWQgc2hvcnQJZmRfbGlua19vZmZzZXQ7CQkvKiBOZXh0IEZECQkqLworCXVuc2lnbmVkIHNob3J0CWZkX3JiZF9vZmZzZXQ7CQkvKiBGaXJzdCBSQkQgKGRhdGEpCSovCisJCQkJCQkvKiBQcmVwYXJlZCBieSBDUFUsCSovCisJCQkJCQkvKiB1cGRhdGVkIGJ5IDgyNTg2CSovCisjaWYJMAorSSB0aGluayB0aGUgcmVzdCBpcyB1bnVzZWQgc2luY2Ugd2UKK2hhdmUgc2V0IEFDX0NGR19BTE9DKC4uKS4gIEhvd2V2ZXIsIGp1c3QKK2luIGNhc2UsIHdlIGxlYXZlIHRoZSBzcGFjZS4KKyNlbmRpZgkvKiAwICovCisJdW5zaWduZWQgY2hhcglmZF9kZXN0W0FERFJfTEVOXTsJLyogRGVzdGluYXRpb24gYWRkcmVzcwkqLworCQkJCQkJLyogV3JpdHRlbiBieSA4MjU4NgkqLworCXVuc2lnbmVkIGNoYXIJZmRfc3JjW0FERFJfTEVOXTsJLyogU291cmNlIGFkZHJlc3MJKi8KKwkJCQkJCS8qIFdyaXR0ZW4gYnkgODI1ODYJKi8KKwl1bnNpZ25lZCBzaG9ydAlmZF9sZW5ndGg7CQkvKiBGcmFtZSBsZW5ndGggb3IgdHlwZQkqLworCQkJCQkJLyogV3JpdHRlbiBieSA4MjU4NgkqLworfTsKKworI2RlZmluZQlmZG9mZihwLGYpIAl0b2ZmKGZkX3QsIHAsIGYpCisKKy8qCisgKiBUaGlzIHNvZnR3YXJlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkCisgKiBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgd2F2ZWxhbi5jLgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pODI1OTMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2k4MjU5My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYWNiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pODI1OTMuaApAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciBJbnRlbCA4MjU5MyBDU01BL0NEIENvcmUgTEFOIENvbnRyb2xsZXIKKyAqIFRoZSBkZWZpbml0aW9ucyBhcmUgdGFrZW4gZnJvbSB0aGUgMTk5MiB1c2VycyBtYW51YWwgd2l0aCBJbnRlbAorICogb3JkZXIgbnVtYmVyIDI5NzEyNS0wMDEuCisgKgorICogL3Vzci9zcmMvcGMvUkNTL2k4MjU5My5oLHYgMS4xIDE5OTYvMDcvMTcgMTU6MjM6MTIgcm9vdCBFeHAKKyAqCisgKiBDb3B5cmlnaHQgMTk5NCwgQW5kZXJzIEtsZW1ldHMgPGtsZW1ldHNAaXQua3RoLnNlPgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCBmb3Igbm9uY29tbWVyY2lhbCBwdXJwb3NlcworICogYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyByZXRhaW5lZC4KKyAqIAorICogSElTVE9SWQorICogaTgyNTkzLmgsdgorICogUmV2aXNpb24gMS4xICAxOTk2LzA3LzE3IDE1OjIzOjEyICByb290CisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICogUmV2aXNpb24gMS4zICAxOTk1LzA0LzA1ICAxNToxMzo1OCAgYWRqCisgKiBJbml0aWFsIGFscGhhIHJlbGVhc2UKKyAqCisgKiBSZXZpc2lvbiAxLjIgIDE5OTQvMDYvMTYgIDIzOjU3OjMxICBrbGVtZXRzCisgKiBNaXJyb3JlZCBhbGwgdGhlIGZpZWxkcyBpbiB0aGUgY29uZmlndXJhdGlvbiBibG9jay4KKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTQvMDYvMDIgIDIwOjI1OjM0ICBrbGVtZXRzCisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICoKKyAqLworI2lmbmRlZglfSTgyNTkzX0gKKyNkZWZpbmUJX0k4MjU5M19ICisKKy8qIEludGVsIDgyNTkzIENTTUEvQ0QgQ29yZSBMQU4gQ29udHJvbGxlciAqLworCisvKiBQb3J0IDAgQ29tbWFuZCBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworCisvKiBFeGVjdXRpb24gb3BlcmF0aW9ucyAqLworI2RlZmluZSBPUDBfTk9QCQkJMAkvKiBDSE5MID0gMCAqLworI2RlZmluZSBPUDBfU1dJVF9UT19QT1JUXzEJMAkvKiBDSE5MID0gMSAqLworI2RlZmluZSBPUDBfSUFfU0VUVVAJCTEKKyNkZWZpbmUgT1AwX0NPTkZJR1VSRQkJMgorI2RlZmluZSBPUDBfTUNfU0VUVVAJCTMKKyNkZWZpbmUgT1AwX1RSQU5TTUlUCQk0CisjZGVmaW5lIE9QMF9URFIJCQk1CisjZGVmaW5lIE9QMF9EVU1QCQk2CisjZGVmaW5lIE9QMF9ESUFHTk9TRQkJNworI2RlZmluZSBPUDBfVFJBTlNNSVRfTk9fQ1JDCTkKKyNkZWZpbmUgT1AwX1JFVFJBTlNNSVQJCTEyCisjZGVmaW5lIE9QMF9BQk9SVAkJMTMKKy8qIFJlY2VwdGlvbiBvcGVyYXRpb25zICovCisjZGVmaW5lIE9QMF9SQ1ZfRU5BQkxFCQk4CisjZGVmaW5lIE9QMF9SQ1ZfRElTQUJMRQkJMTAKKyNkZWZpbmUgT1AwX1NUT1BfUkNWCQkxMQorLyogU3RhdHVzIHBvaW50ZXIgY29udHJvbCBvcGVyYXRpb25zICovCisjZGVmaW5lIE9QMF9GSVhfUFRSCQkxNQkvKiBDSE5MID0gMSAqLworI2RlZmluZSBPUDBfUkxTX1BUUgkJMTUJLyogQ0hOTCA9IDAgKi8KKyNkZWZpbmUgT1AwX1JFU0VUCQkxNAorCisjZGVmaW5lIENSMF9DSE5MCQkoMSA8PCA0KQkvKiAwPUNoYW5uZWwgMCwgMT1DaGFubmVsIDEgKi8KKyNkZWZpbmUgQ1IwX1NUQVRVU18wCQkweDAwCisjZGVmaW5lIENSMF9TVEFUVVNfMQkJMHgyMAorI2RlZmluZSBDUjBfU1RBVFVTXzIJCTB4NDAKKyNkZWZpbmUgQ1IwX1NUQVRVU18zCQkweDYwCisjZGVmaW5lIENSMF9JTlRfQUNLCQkoMSA8PCA3KQkvKiAwPU5vIGFjaywgMT1hY2tub3dsZWRnZSAqLworCisvKiBQb3J0IDAgU3RhdHVzIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgU1IwX05PX1JFU1VMVAkJMAkJLyogZHVtbXkgKi8KKyNkZWZpbmUgU1IwX0VWRU5UX01BU0sJCTB4MGYKKyNkZWZpbmUgU1IwX0lBX1NFVFVQX0RPTkUJMQorI2RlZmluZSBTUjBfQ09ORklHVVJFX0RPTkUJMgorI2RlZmluZSBTUjBfTUNfU0VUVVBfRE9ORQkzCisjZGVmaW5lIFNSMF9UUkFOU01JVF9ET05FCTQKKyNkZWZpbmUgU1IwX1REUl9ET05FCQk1CisjZGVmaW5lIFNSMF9EVU1QX0RPTkUJCTYKKyNkZWZpbmUgU1IwX0RJQUdOT1NFX1BBU1NFRAk3CisjZGVmaW5lIFNSMF9UUkFOU01JVF9OT19DUkNfRE9ORSA5CisjZGVmaW5lIFNSMF9SRVRSQU5TTUlUX0RPTkUJMTIKKyNkZWZpbmUgU1IwX0VYRUNVVElPTl9BQk9SVEVECTEzCisjZGVmaW5lIFNSMF9FTkRfT0ZfRlJBTUUJOAorI2RlZmluZSBTUjBfUkVDRVBUSU9OX0FCT1JURUQJMTAKKyNkZWZpbmUgU1IwX0RJQUdOT1NFX0ZBSUxFRAkxNQorI2RlZmluZSBTUjBfU1RPUF9SRUdfSElUCTExCisKKyNkZWZpbmUgU1IwX0NITkwJCSgxIDw8IDQpCisjZGVmaW5lIFNSMF9FWEVDVVRJT04JCSgxIDw8IDUpCisjZGVmaW5lIFNSMF9SRUNFUFRJT04JCSgxIDw8IDYpCisjZGVmaW5lIFNSMF9JTlRFUlJVUFQJCSgxIDw8IDcpCisjZGVmaW5lIFNSMF9CT1RIX1JYX1RYCQkoU1IwX0VYRUNVVElPTiB8IFNSMF9SRUNFUFRJT04pCisKKyNkZWZpbmUgU1IzX0VYRUNfU1RBVEVfTUFTSwkweDAzCisjZGVmaW5lIFNSM19FWEVDX0lETEUJCTAKKyNkZWZpbmUgU1IzX1RYX0FCT1JUX0lOX1BST0dSRVNTIDEKKyNkZWZpbmUgU1IzX0VYRUNfQUNUSVZFCQkyCisjZGVmaW5lIFNSM19BQk9SVF9JTl9QUk9HUkVTUwkzCisjZGVmaW5lIFNSM19FWEVDX0NITkwJCSgxIDw8IDIpCisjZGVmaW5lIFNSM19TVFBfT05fTk9fUlNSQwkoMSA8PCAzKQorI2RlZmluZSBTUjNfUkNWSU5HX05PX1JTUkMJKDEgPDwgNCkKKyNkZWZpbmUgU1IzX1JDVl9TVEFURV9NQVNLCTB4NjAKKyNkZWZpbmUgU1IzX1JDVl9JRExFCQkweDAwCisjZGVmaW5lIFNSM19SQ1ZfUkVBRFkJCTB4MjAKKyNkZWZpbmUgU1IzX1JDVl9BQ1RJVkUJCTB4NDAKKyNkZWZpbmUgU1IzX1JDVl9TVE9QX0lOX1BST0cJMHg2MAorI2RlZmluZSBTUjNfUkNWX0NITkwJCSgxIDw8IDcpCisKKy8qIFBvcnQgMSBDb21tYW5kIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgT1AxX05PUAkJCTAKKyNkZWZpbmUgT1AxX1NXSVRfVE9fUE9SVF8wCTEKKyNkZWZpbmUgT1AxX0lOVF9ESVNBQkxFCQkyCisjZGVmaW5lIE9QMV9JTlRfRU5BQkxFCQkzCisjZGVmaW5lIE9QMV9TRVRfVFMJCTUKKyNkZWZpbmUgT1AxX1JTVF9UUwkJNworI2RlZmluZSBPUDFfUE9XRVJfRE9XTgkJOAorI2RlZmluZSBPUDFfUkVTRVRfUklOR19NTkdNVAkxMQorI2RlZmluZSBPUDFfUkVTRVQJCTE0CisjZGVmaW5lIE9QMV9TRUxfUlNUCQkxNQorCisjZGVmaW5lIENSMV9TVEFUVVNfNAkJMHgwMAorI2RlZmluZSBDUjFfU1RBVFVTXzUJCTB4MjAKKyNkZWZpbmUgQ1IxX1NUQVRVU182CQkweDQwCisjZGVmaW5lIENSMV9TVE9QX1JFR19VUERBVEUJKDEgPDwgNykKKworLyogUmVjZWl2ZSBmcmFtZSBzdGF0dXMgYml0cyAqLworCisjZGVmaW5lCVJYX1JDTEQJCQkoMSA8PCAwKQorI2RlZmluZSBSWF9JQV9NQVRDSAkJKDEgPDwgMSkKKyNkZWZpbmUJUlhfTk9fQURfTUFUQ0gJCSgxIDw8IDIpCisjZGVmaW5lIFJYX05PX1NGRAkJKDEgPDwgMykKKyNkZWZpbmUgUlhfU1JUX0ZSTQkJKDEgPDwgNykKKyNkZWZpbmUgUlhfT1ZSUlVOCQkoMSA8PCA4KQorI2RlZmluZSBSWF9BTEdfRVJSCQkoMSA8PCAxMCkKKyNkZWZpbmUgUlhfQ1JDX0VSUgkJKDEgPDwgMTEpCisjZGVmaW5lIFJYX0xFTl9FUlIJCSgxIDw8IDEyKQorI2RlZmluZSBSWF9SQ1ZfT0sJCSgxIDw8IDEzKQorI2RlZmluZSBSWF9UWVBfTEVOCQkoMSA8PCAxNSkKKworLyogVHJhbnNtaXQgc3RhdHVzIGJpdHMgKi8KKworI2RlZmluZSBUWF9OQ09MX01BU0sJCTB4MGYKKyNkZWZpbmUgVFhfRlJUTAkJCSgxIDw8IDQpCisjZGVmaW5lIFRYX01BWF9DT0wJCSgxIDw8IDUpCisjZGVmaW5lIFRYX0hSVF9CRUFUCQkoMSA8PCA2KQorI2RlZmluZSBUWF9ERUZFUgkJKDEgPDwgNykKKyNkZWZpbmUgVFhfVU5EX1JVTgkJKDEgPDwgOCkKKyNkZWZpbmUgVFhfTE9TVF9DVFMJCSgxIDw8IDkpCisjZGVmaW5lIFRYX0xPU1RfQ1JTCQkoMSA8PCAxMCkKKyNkZWZpbmUgVFhfTFRDT0wJCSgxIDw8IDExKQorI2RlZmluZSBUWF9PSwkJCSgxIDw8IDEzKQorI2RlZmluZSBUWF9DT0xMCQkJKDEgPDwgMTUpCisKK3N0cnVjdCBpODI1OTNfY29uZl9ibG9jayB7CisgIHVfY2hhciBmaWZvX2xpbWl0IDogNCwKKyAgCSBmb3JnbmVzaSAgIDogMSwKKyAgCSBmaWZvXzMyICAgIDogMSwKKyAgCSBkNm1vZCAgICAgIDogMSwKKyAgCSB0aHJvdHRsZV9lbmIgOiAxOworICB1X2NoYXIgdGhyb3R0bGUgICA6IDYsCisJIGNudHJ4aW50ICAgOiAxLAorCSBjb250aW4JICAgIDogMTsKKyAgdV9jaGFyIGFkZHJfbGVuICAgOiAzLAorICAJIGFjbG9jIAkgICAgOiAxLAorIAkgcHJlYW1iX2xlbiA6IDIsCisgIAkgbG9vcGJhY2sgICA6IDI7CisgIHVfY2hhciBsaW5fcHJpbyAgIDogMywKKwkgdGJvZnN0b3AgICA6IDEsCisJIGV4cF9wcmlvICAgOiAzLAorCSBib2ZfbWV0ICAgIDogMTsKKyAgdV9jaGFyCSAgICA6IDQsCisJIGlmcm1fc3BjICAgOiA0OworICB1X2NoYXIJICAgIDogNSwKKwkgc2xvdHRpbV9sb3cgOiAzOworICB1X2NoYXIgc2xvdHRpbV9oaSA6IDMsCisJCSAgICA6IDEsCisJIG1heF9yZXRyICAgOiA0OworICB1X2NoYXIgcHJtaXNjICAgICA6IDEsCisJIGJjX2RpcyAgICAgOiAxLAorICAJCSAgICA6IDEsCisJIGNyc18xCSAgICA6IDEsCisJIG5vY3JjX2lucyAgOiAxLAorCSBjcmNfMTYzMiAgIDogMSwKKyAgCSAJICAgIDogMSwKKyAgCSBjcnNfY2R0ICAgIDogMTsKKyAgdV9jaGFyIGNzX2ZpbHRlciAgOiAzLAorCSBjcnNfc3JjICAgIDogMSwKKwkgY2RfZmlsdGVyICA6IDMsCisJCSAgICA6IDE7CisgIHVfY2hhcgkgICAgOiAyLAorICAJIG1pbl9mcl9sZW4gOiA2OworICB1X2NoYXIgbG5nX3R5cCAgICA6IDEsCisJIGxuZ19mbGQgICAgOiAxLAorCSByeGNyY194ZiAgIDogMSwKKwkgYXJ0eAkgICAgOiAxLAorCSBzYXJlYwkgICAgOiAxLAorCSB0eF9qYWJiZXIgIDogMSwJLyogd2h5IGlzIHRoaXMgY2FsbGVkIG1heF9sZW4gaW4gdGhlIG1hbnVhbD8gKi8KKwkgaGFzaF8xCSAgICA6IDEsCisgIAkgbGJwa3BvbCAgICA6IDE7CisgIHVfY2hhcgkgICAgOiA2LAorICAJIGZkeAkgICAgOiAxLAorICAJICAJICAgIDogMTsKKyAgdV9jaGFyIGR1bW15XzYgICAgOiA2LAkvKiBzdXBwb3NlZCB0byBiZSBvbmVzICovCisgIAkgbXVsdF9pYSAgICA6IDEsCisgIAkgZGlzX2JvZiAgICA6IDE7CisgIHVfY2hhciBkdW1teV8xICAgIDogMSwJLyogc3VwcG9zZWQgdG8gYmUgb25lICovCisJIHR4X2lmc19yZXRyaWcgOiAyLAorCSBtY19hbGwgICAgIDogMSwKKwkgcmN2X21vbiAgICA6IDIsCisJIGZyYWdfYWNwdCAgOiAxLAorICAJIHRzdHJ0dHJzICAgOiAxOworICB1X2NoYXIgZnJldHgJICAgIDogMSwKKwkgcnVudF9lb3AgICA6IDEsCisJIGh3X3N3X3BpbiAgOiAxLAorCSBiaWdfZW5kbiAgIDogMSwKKwkgc3luY3JxcyAgICA6IDEsCisJIHN0dGxlbiAgICAgOiAxLAorCSB0eF9lb3AgICAgIDogMSwKKyAgCSByeF9lb3AJICAgIDogMTsKKyAgdV9jaGFyIHJidWZfc2l6ZSAgOiA1LAorCSByY3ZzdG9wICAgIDogMSwKKyAgCSAJICAgIDogMjsKK307CisKKyNkZWZpbmUgSTgyNTkzX01BWF9NVUxUSUNBU1RfQUREUkVTU0VTCTEyOAkvKiBIYXJkd2FyZSBoYXNoZWQgZmlsdGVyICovCisKKyNlbmRpZiAvKiBfSTgyNTkzX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2llZWU4MDJfMTEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2llZWU4MDJfMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2RkNTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaWVlZTgwMl8xMS5oCkBAIC0wLDAgKzEsNzggQEAKKyNpZm5kZWYgX0lFRUU4MDJfMTFfSAorI2RlZmluZSBfSUVFRTgwMl8xMV9ICisKKyNkZWZpbmUgSUVFRTgwMl8xMV9EQVRBX0xFTgkJMjMwNAorLyogTWF4aW11bSBzaXplIGZvciB0aGUgTUEtVU5JVERBVEEgcHJpbWl0aXZlLCA4MDIuMTEgc3RhbmRhcmQgc2VjdGlvbgorICAgNi4yLjEuMS4yLgorCisgICBUaGUgZmlndXJlIGluIHNlY3Rpb24gNy4xLjIgc3VnZ2VzdHMgYSBib2R5IHNpemUgb2YgdXAgdG8gMjMxMgorICAgYnl0ZXMgaXMgYWxsb3dlZCwgd2hpY2ggaXMgYSBiaXQgY29uZnVzaW5nLCBJIHN1c3BlY3QgdGhpcworICAgcmVwcmVzZW50cyB0aGUgMjMwNCBieXRlcyBvZiByZWFsIGRhdGEsIHBsdXMgYSBwb3NzaWJsZSA4IGJ5dGVzIG9mCisgICBXRVAgSVYgYW5kIElDVi4gKHRoaXMgaW50ZXJwcmV0YXRpb24gc3VnZ2VzdGVkIGJ5IFJhbWlybyBCYXJyZWlybykgKi8KKworCisjZGVmaW5lIElFRUU4MDJfMTFfSExFTgkJCTMwCisjZGVmaW5lIElFRUU4MDJfMTFfRlJBTUVfTEVOCQkoSUVFRTgwMl8xMV9EQVRBX0xFTiArIElFRUU4MDJfMTFfSExFTikKKworc3RydWN0IGllZWU4MDJfMTFfaGRyIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKKwl1OCBhZGRyNFtFVEhfQUxFTl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogRnJhbWUgY29udHJvbCBmaWVsZCBjb25zdGFudHMgKi8KKyNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX1ZFUlMJCTB4MDAwMgorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfRlRZUEUJCTB4MDAwYworI2RlZmluZSBJRUVFODAyXzExX0ZDVExfU1RZUEUJCTB4MDBmMAorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfVE9EUwkJMHgwMTAwCisjZGVmaW5lIElFRUU4MDJfMTFfRkNUTF9GUk9NRFMJCTB4MDIwMAorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfTU9SRUZSQUdTCTB4MDQwMAorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfUkVUUlkJCTB4MDgwMAorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfUE0JCTB4MTAwMAorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfTU9SRURBVEEJMHgyMDAwCisjZGVmaW5lIElFRUU4MDJfMTFfRkNUTF9XRVAJCTB4NDAwMAorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfT1JERVIJCTB4ODAwMAorCisjZGVmaW5lIElFRUU4MDJfMTFfRlRZUEVfTUdNVAkJMHgwMDAwCisjZGVmaW5lIElFRUU4MDJfMTFfRlRZUEVfQ1RMCQkweDAwMDQKKyNkZWZpbmUgSUVFRTgwMl8xMV9GVFlQRV9EQVRBCQkweDAwMDgKKworLyogbWFuYWdlbWVudCAqLworI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0FTU09DX1JFUQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9BU1NPQ19SRVNQIAkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9SRUFTU09DX1JFUQkweDAwMjAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9SRUFTU09DX1JFU1AJMHgwMDMwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfUFJPQkVfUkVRCTB4MDA0MAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX1BST0JFX1JFU1AJMHgwMDUwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQkVBQ09OCQkweDAwODAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9BVElNCQkweDAwOTAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9ESVNBU1NPQwkweDAwQTAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9BVVRICQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9ERUFVVEgJCTB4MDBDMAorCisvKiBjb250cm9sICovCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfUFNQT0xMCQkweDAwQTAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9SVFMJCTB4MDBCMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0NUUwkJMHgwMEMwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQUNLCQkweDAwRDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9DRkVORAkJMHgwMEUwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQ0ZFTkRBQ0sJMHgwMEYwCisKKy8qIGRhdGEgKi8KKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9EQVRBCQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9EQVRBX0NGQUNLCTB4MDAxMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0RBVEFfQ0ZQT0xMCTB4MDAyMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0RBVEFfQ0ZBQ0tQT0xMCTB4MDAzMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX05VTExGVU5DCTB4MDA0MAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0NGQUNLCQkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9DRlBPTEwJCTB4MDA2MAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0NGQUNLUE9MTAkweDAwNzAKKworI2RlZmluZSBJRUVFODAyXzExX1NDVExfRlJBRwkJMHgwMDBGCisjZGVmaW5lIElFRUU4MDJfMTFfU0NUTF9TRVEJCTB4RkZGMAorCisjZW5kaWYgLyogX0lFRUU4MDJfMTFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjI0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMKQEAgLTAsMCArMSwxNzM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIG5ldHdhdmVfY3MuYworICogVmVyc2lvbjogICAgICAgMC40LjEKKyAqIERlc2NyaXB0aW9uOiAgIE5ldHdhdmUgQWlyU3VyZmVyIFdpcmVsZXNzIExBTiBQQyBDYXJkIGRyaXZlcgorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yczogICAgICAgSm9obiBNYXJrdXMgQmr4cm5kYWxlbiA8am9obm1AY3MudWl0Lm5vPgorICogICAgICAgICAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogICAgICAgICAgICAgICAgRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICogQ3JlYXRlZCBhdDogICAgQSBsb25nIHRpbWUgYWdvIQorICogTW9kaWZpZWQgYXQ6ICAgTW9uIE5vdiAxMCAxMTo1NDozNyAxOTk3CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTcgVW5pdmVyc2l0eSBvZiBUcm9tc/gsIE5vcndheQorICoKKyAqIFJldmlzaW9uIEhpc3Rvcnk6CisgKgorICogICAwOC1Ob3YtOTcgMTU6MTQ6NDcgICBKb2huIE1hcmt1cyBCavhybmRhbGVuIDxqb2hubUBjcy51aXQubm8+CisgKiAgICAtIEZpeGVkIHNvbWUgYnVncyBpbiBuZXR3YXZlX3J4IGFuZCBjbGVhbmVkIGl0IHVwIGEgYml0LiAKKyAqICAgICAgKE9uZSBvZiB0aGUgYnVncyB3b3VsZCBoYXZlIGRlc3Ryb3llZCBwYWNrZXRzIHdoZW4gcmVjZWl2aW5nCisgKiAgICAgIG11bHRpcGxlIHBhY2tldHMgcGVyIGludGVycnVwdCkuIAorICogICAgLSBDbGVhbmVkIHVwIHBhcnRzIG9mIG5ld2F2ZV9od194bWl0LiAKKyAqICAgIC0gQSBmZXcgZ2VuZXJhbCBjbGVhbnVwcy4gCisgKiAgIDI0LU9jdC05NyAxMzoxNzozNiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqICAgIC0gRml4ZWQgbmV0d2F2ZV9yeCByZWNlaXZlIGZ1bmN0aW9uIChnb3QgdXBkYXRlZCBkb2NzKQorICogICBPdGhlcnM6CisgKiAgICAtIENoYW5nZWQgbmFtZSBmcm9tIHhpcmNudyB0byBuZXR3YXZlLCB0YWtlIGEgbG9vayBhdCAKKyAqICAgICAgaHR0cDovL3d3dy5uZXR3YXZlLXdpcmVsZXNzLmNvbQorICogICAgLSBTb21lIHJlb3JnYW5pemluZyBvZiB0aGUgY29kZQorICogICAgLSBSZW1vdmVkIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gaW50ZXJydXB0IGhhbmRsZXIgYW5kIHRyYW5zbWl0CisgKiAgICAgIGZ1bmN0aW9uCisgKiAgICAtIFN0YXJ0ZWQgdG8gYWRkIHdpcmVsZXNzIGV4dGVuc2lvbnMsIGJ1dCBzdGlsbCBuZWVkcyBzb21lIGNvZGluZworICogICAgLSBBZGRlZCB3YXRjaGRvZyBmb3IgYmV0dGVyIGhhbmRsaW5nIG9mIHRyYW5zbWlzc2lvbiB0aW1lb3V0cyAKKyAqICAgICAgKGhvcGVmdWxseSB0aGlzIHdvcmtzIGJldHRlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVG8gaGF2ZSBzdGF0aXN0aWNzIChqdXN0IHBhY2tldHMgc2VudCkgZGVmaW5lIHRoaXMgKi8KKyN1bmRlZiBORVRXQVZFX1NUQVRTCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2lmZGVmIENPTkZJR19ORVRfUkFESU8KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiAxMiAqLworI2VuZGlmCisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisjaW5jbHVkZSA8cGNtY2lhL21lbV9vcC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2RlZmluZSBORVRXQVZFX1JFR09GRiAgICAgICAgIDB4ODAwMAorLyogVGhlIE5ldHdhdmUgSU8gcmVnaXN0ZXJzLCBvZmZzZXRzIHRvIGlvYmFzZSAqLworI2RlZmluZSBORVRXQVZFX1JFR19DT1IgICAgICAgIDB4MAorI2RlZmluZSBORVRXQVZFX1JFR19DQ1NSICAgICAgIDB4MgorI2RlZmluZSBORVRXQVZFX1JFR19BU1IgICAgICAgIDB4NAorI2RlZmluZSBORVRXQVZFX1JFR19JTVIgICAgICAgIDB4YQorI2RlZmluZSBORVRXQVZFX1JFR19QTVIgICAgICAgIDB4YworI2RlZmluZSBORVRXQVZFX1JFR19JT0xPVyAgICAgIDB4NgorI2RlZmluZSBORVRXQVZFX1JFR19JT0hJICAgICAgIDB4NworI2RlZmluZSBORVRXQVZFX1JFR19JT0NPTlRST0wgIDB4OAorI2RlZmluZSBORVRXQVZFX1JFR19EQVRBICAgICAgIDB4ZgorLyogVGhlIE5ldHdhdmUgRXh0ZW5kZWQgSU8gcmVnaXN0ZXJzLCBvZmZzZXRzIHRvIFJhbUJhc2UgKi8KKyNkZWZpbmUgTkVUV0FWRV9FUkVHX0FTQ0MgICAgICAweDExNAorI2RlZmluZSBORVRXQVZFX0VSRUdfUlNFUiAgICAgIDB4MTIwCisjZGVmaW5lIE5FVFdBVkVfRVJFR19SU0VSVyAgICAgMHgxMjQKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX1RTRVIgICAgICAweDEzMAorI2RlZmluZSBORVRXQVZFX0VSRUdfVFNFUlcgICAgIDB4MTM0CisjZGVmaW5lIE5FVFdBVkVfRVJFR19DQiAgICAgICAgMHgxMDAKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX1NQQ1EgICAgICAweDE1NAorI2RlZmluZSBORVRXQVZFX0VSRUdfU1BVICAgICAgIDB4MTU1CisjZGVmaW5lIE5FVFdBVkVfRVJFR19MSUYgICAgICAgMHgxNGUKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX0lTUExRICAgICAweDE1NgorI2RlZmluZSBORVRXQVZFX0VSRUdfSEhDICAgICAgIDB4MTU4CisjZGVmaW5lIE5FVFdBVkVfRVJFR19OSSAgICAgICAgMHgxNmUKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX01IUyAgICAgICAweDE2YgorI2RlZmluZSBORVRXQVZFX0VSRUdfVERQICAgICAgIDB4MTQwCisjZGVmaW5lIE5FVFdBVkVfRVJFR19SRFAgICAgICAgMHgxNTAKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX1BBICAgICAgICAweDE2MAorI2RlZmluZSBORVRXQVZFX0VSRUdfRUMgICAgICAgIDB4MTgwCisjZGVmaW5lIE5FVFdBVkVfRVJFR19DUkJQICAgICAgMHgxN2EKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX0FSVyAgICAgICAweDE2NgorCisvKgorICogQ29tbWFuZHMgdXNlZCBpbiB0aGUgZXh0ZW5kZWQgY29tbWFuZCBidWZmZXIKKyAqIE5FVFdBVkVfRVJFR19DQiAoMHgxMDAtMHgxMEYpIAorICovCisjZGVmaW5lIE5FVFdBVkVfQ01EX05PUCAgICAgICAgMHgwMAorI2RlZmluZSBORVRXQVZFX0NNRF9TUkMgICAgICAgIDB4MDEKKyNkZWZpbmUgTkVUV0FWRV9DTURfU1RDICAgICAgICAweDAyCisjZGVmaW5lIE5FVFdBVkVfQ01EX0FNQSAgICAgICAgMHgwMworI2RlZmluZSBORVRXQVZFX0NNRF9ETUEgICAgICAgIDB4MDQKKyNkZWZpbmUgTkVUV0FWRV9DTURfU0FNQSAgICAgICAweDA1CisjZGVmaW5lIE5FVFdBVkVfQ01EX0VSICAgICAgICAgMHgwNgorI2RlZmluZSBORVRXQVZFX0NNRF9EUiAgICAgICAgIDB4MDcKKyNkZWZpbmUgTkVUV0FWRV9DTURfVEwgICAgICAgICAweDA4CisjZGVmaW5lIE5FVFdBVkVfQ01EX1NSUCAgICAgICAgMHgwOQorI2RlZmluZSBORVRXQVZFX0NNRF9TU0sgICAgICAgIDB4MGEKKyNkZWZpbmUgTkVUV0FWRV9DTURfU01EICAgICAgICAweDBiCisjZGVmaW5lIE5FVFdBVkVfQ01EX1NBUEQgICAgICAgMHgwYworI2RlZmluZSBORVRXQVZFX0NNRF9TU1MgICAgICAgIDB4MTEKKy8qIEVuZCBvZiBDb21tYW5kIG1hcmtlciAqLworI2RlZmluZSBORVRXQVZFX0NNRF9FT0MgICAgICAgIDB4MDAKKworLyogQVNSIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgTkVUV0FWRV9BU1JfUlhSRFkgICAweDgwCisjZGVmaW5lIE5FVFdBVkVfQVNSX1RYQkEgICAgMHgwMQorCisjZGVmaW5lIFRYX1RJTUVPVVQJCSgoMzIqSFopLzEwMCkKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbXJDb25mUkZVMSA9IDB4MTA7IC8qIFJGVSBpbnRlcnJ1cHQgbWFzaywga2VlcCBoaWdoICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGltckNvbmZJRU5BID0gMHgwMjsgLyogSW50ZXJydXB0IGVuYWJsZSAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNvckNvbmZJRU5BICAgPSAweDAxOyAvKiBJbnRlcnJ1cHQgZW5hYmxlICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNvckNvbmZMVkxSRVEgPSAweDQwOyAvKiBLZWVwIGhpZ2ggKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByeENvbmZSeEVuYSAgPSAweDgwOyAvKiBSZWNlaXZlIEVuYWJsZSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByeENvbmZNQUMgICAgPSAweDIwOyAvKiBNQUMgaG9zdCByZWNlaXZlIG1vZGUqLyAKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnhDb25mUHJvICAgID0gMHgxMDsgLyogUHJvbWlzY3VvdXMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnhDb25mQU1QICAgID0gMHgwODsgLyogQWNjZXB0IE11bHRpY2FzdCBQYWNrZXRzICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ4Q29uZkJjYXN0ICA9IDB4MDQ7IC8qIEFjY2VwdCBCcm9hZGNhc3QgUGFja2V0cyAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR4Q29uZlR4RW5hICA9IDB4ODA7IC8qIFRyYW5zbWl0IEVuYWJsZSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZNQUMgICAgPSAweDIwOyAvKiBIb3N0IHNlbmRzIE1BQyBtb2RlICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR4Q29uZkVVRCAgICA9IDB4MTA7IC8qIEVuYWJsZSBVbmktRGF0YSBwYWNrZXRzICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR4Q29uZktleSAgICA9IDB4MDI7IC8qIFNjcmFtYmxlIGRhdGEgcGFja2V0cyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZMb29wICAgPSAweDAxOyAvKiBMb29wYmFjayBtb2RlICovCisKKy8qCisgICBBbGwgdGhlIFBDTUNJQSBtb2R1bGVzIHVzZSBQQ01DSUFfREVCVUcgdG8gY29udHJvbCBkZWJ1Z2dpbmcuICBJZgorICAgeW91IGRvIG5vdCBkZWZpbmUgUENNQ0lBX0RFQlVHIGF0IGFsbCwgYWxsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwgYmUKKyAgIGxlZnQgb3V0LiAgSWYgeW91IGNvbXBpbGUgd2l0aCBQQ01DSUFfREVCVUc9MCwgdGhlIGRlYnVnIGNvZGUgd2lsbAorICAgYmUgcHJlc2VudCBidXQgZGlzYWJsZWQgLS0gYnV0IGl0IGNhbiB0aGVuIGJlIGVuYWJsZWQgZm9yIHNwZWNpZmljCisgICBtb2R1bGVzIGF0IGxvYWQgdGltZSB3aXRoIGEgJ3BjX2RlYnVnPSMnIG9wdGlvbiB0byBpbnNtb2QuCisqLworCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOworbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKQorc3RhdGljIGNoYXIgKnZlcnNpb24gPQorIm5ldHdhdmVfY3MuYyAwLjMuMCBUaHUgSnVsIDE3IDE0OjM2OjAyIDE5OTcgKEpvaG4gTWFya3VzIEJq+HJuZGFsZW4pXG4iOworI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJuZXR3YXZlX2NzIjsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IHdpdGggJ2luc21vZCcgKi8KKworLyogQ2hvb3NlIHRoZSBkb21haW4sIGRlZmF1bHQgaXMgMHgxMDAgKi8KK3N0YXRpYyB1X2ludCAgZG9tYWluID0gMHgxMDA7CisKKy8qIFNjcmFtYmxlIGtleSwgcmFuZ2UgZnJvbSAweDAgdG8gMHhmZmZmLiAgCisgKiAweDAgaXMgbm8gc2NyYW1ibGluZy4gCisgKi8KK3N0YXRpYyB1X2ludCAgc2NyYW1ibGVfa2V5ID0gMHgwOworCisvKiBTaGFyZWQgbWVtb3J5IHNwZWVkLCBpbiBucy4gVGhlIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgCisgKiB0aGUgY2FyZCBzaG91bGQgbm90IGJlIHJlYWQgZmFzdGVyIHRoYW4gZXZlcnkgNDAwbnMuIAorICogVGhpcyB0aW1pbmcgc2hvdWxkIGJlIHByb3ZpZGVkIGJ5IHRoZSBIQkEuIElmIGl0IGJlY29tZXMgYSAKKyAqIHByb2JsZW0sIHRyeSBzZXR0aW5nIG1lbV9zcGVlZCB0byA0MDAuIAorICovCitzdGF0aWMgaW50IG1lbV9zcGVlZDsKKworbW9kdWxlX3BhcmFtKGRvbWFpbiwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzY3JhbWJsZV9rZXksIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWVtX3NwZWVkLCBpbnQsIDApOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogUENNQ0lBIChDYXJkIFNlcnZpY2VzKSByZWxhdGVkIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgbmV0d2F2ZV9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOyAgICAgLyogQ2FyZCByZW1vdmFsICovCitzdGF0aWMgaW50ICBuZXR3YXZlX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwgCisJCQkJCSAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CitzdGF0aWMgdm9pZCBuZXR3YXZlX3BjbWNpYV9jb25maWcoZGV2X2xpbmtfdCAqYXJnKTsgLyogUnVucyBhZnRlciBjYXJkIAorCQkJCQkJCQkJCQkJCSAgIGluc2VydGlvbiAqLworc3RhdGljIGRldl9saW5rX3QgKm5ldHdhdmVfYXR0YWNoKHZvaWQpOyAgICAgLyogQ3JlYXRlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZCBuZXR3YXZlX2RldGFjaChkZXZfbGlua190ICopOyAgICAvKiBEZXN0cm95IGluc3RhbmNlICovCisKKy8qIEhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyB2b2lkIG5ldHdhdmVfZG9yZXNldChraW9fYWRkcl90IGlvYmFzZSwgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UpOworc3RhdGljIHZvaWQgbmV0d2F2ZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogTWlzYyBkZXZpY2Ugc3R1ZmYgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOyAgLyogT3BlbiB0aGUgZGV2aWNlICovCitzdGF0aWMgaW50IG5ldHdhdmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7IC8qIENsb3NlIHRoZSBkZXZpY2UgKi8KKworLyogUGFja2V0IHRyYW5zbWlzc2lvbiBhbmQgUGFja2V0IHJlY2VwdGlvbiAqLworc3RhdGljIGludCBuZXR3YXZlX3N0YXJ0X3htaXQoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuZXR3YXZlX3J4KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogSW50ZXJydXB0IHJvdXRpbmVzICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbmV0d2F2ZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBuZXR3YXZlX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICopOworCisvKiBTdGF0aXN0aWNzICovCitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldHdhdmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBXaXJlbGVzcyBleHRlbnNpb25zICovCisjaWZkZWYgV0lSRUxFU1NfRVhUCitzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MqIG5ldHdhdmVfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCitzdGF0aWMgaW50IG5ldHdhdmVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCk7CisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoKKyAgIEEgbGlua2VkIGxpc3Qgb2YgImluc3RhbmNlcyIgb2YgdGhlIHNrZWxldG9uIGRldmljZS4gIEVhY2ggYWN0dWFsCisgICBQQ01DSUEgY2FyZCBjb3JyZXNwb25kcyB0byBvbmUgZGV2aWNlIGluc3RhbmNlLCBhbmQgaXMgZGVzY3JpYmVkCisgICBieSBvbmUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKGRlZmluZWQgaW4gZHMuaCkuCisKKyAgIFlvdSBtYXkgbm90IHdhbnQgdG8gdXNlIGEgbGlua2VkIGxpc3QgZm9yIHRoaXMgLS0gZm9yIGV4YW1wbGUsIHRoZQorICAgbWVtb3J5IGNhcmQgZHJpdmVyIHVzZXMgYW4gYXJyYXkgb2YgZGV2X2xpbmtfdCBwb2ludGVycywgd2hlcmUgbWlub3IKKyAgIGRldmljZSBudW1iZXJzIGFyZSB1c2VkIHRvIGRlcml2ZSB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBpbmRleC4KKyovCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CisKKy8qCisgICBBIGRldl9saW5rX3Qgc3RydWN0dXJlIGhhcyBmaWVsZHMgZm9yIG1vc3QgdGhpbmdzIHRoYXQgYXJlIG5lZWRlZAorICAgdG8ga2VlcCB0cmFjayBvZiBhIHNvY2tldCwgYnV0IHRoZXJlIHdpbGwgdXN1YWxseSBiZSBzb21lIGRldmljZQorICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBhbHNvIG5lZWRzIHRvIGJlIGtlcHQgdHJhY2sgb2YuICBUaGUKKyAgICdwcml2JyBwb2ludGVyIGluIGEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8KKyAgIGEgZGV2aWNlLXNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsIGxpa2UgdGhpcy4KKworICAgQSBkcml2ZXIgbmVlZHMgdG8gcHJvdmlkZSBhIGRldl9ub2RlX3Qgc3RydWN0dXJlIGZvciBlYWNoIGRldmljZQorICAgb24gYSBjYXJkLiAgSW4gc29tZSBjYXNlcywgdGhlcmUgaXMgb25seSBvbmUgZGV2aWNlIHBlciBjYXJkIChmb3IKKyAgIGV4YW1wbGUsIGV0aGVybmV0IGNhcmRzLCBtb2RlbXMpLiAgSW4gb3RoZXIgY2FzZXMsIHRoZXJlIG1heSBiZQorICAgbWFueSBhY3R1YWwgb3IgbG9naWNhbCBkZXZpY2VzIChTQ1NJIGFkYXB0ZXJzLCBtZW1vcnkgY2FyZHMgd2l0aAorICAgbXVsdGlwbGUgcGFydGl0aW9ucykuICBUaGUgZGV2X25vZGVfdCBzdHJ1Y3R1cmVzIG5lZWQgdG8gYmUga2VwdAorICAgaW4gYSBsaW5rZWQgbGlzdCBzdGFydGluZyBhdCB0aGUgJ2RldicgZmllbGQgb2YgYSBkZXZfbGlua190CisgICBzdHJ1Y3R1cmUuICBXZSBhbGxvY2F0ZSB0aGVtIGluIHRoZSBjYXJkJ3MgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSwKKyAgIGJlY2F1c2UgdGhleSBnZW5lcmFsbHkgY2FuJ3QgYmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LgorKi8KKworI2lmIFdJUkVMRVNTX0VYVCA8PSAxMgorLyogV2lyZWxlc3MgZXh0ZW5zaW9ucyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisKKy8qIFBhcnQgb2YgaXdfaGFuZGxlciBwcm90b3R5cGUgd2UgbmVlZCAqLworc3RydWN0IGl3X3JlcXVlc3RfaW5mbworeworCV9fdTE2CQljbWQ7CQkvKiBXaXJlbGVzcyBFeHRlbnNpb24gY29tbWFuZCAqLworCV9fdTE2CQlmbGFnczsJCS8qIE1vcmUgdG8gY29tZSA7LSkgKi8KK307CisKKy8qIFdpcmVsZXNzIEV4dGVuc2lvbiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IC0gSmVhbiBJSQorICogSWYgdGhlIG5ldyB3aXJlbGVzcyBkZXZpY2UgcHJpdmF0ZSBpb2N0bCByYW5nZSBpcyBub3QgZGVmaW5lZCwKKyAqIGRlZmF1bHQgdG8gc3RhbmRhcmQgZGV2aWNlIHByaXZhdGUgaW9jdGwgcmFuZ2UgKi8KKyNpZm5kZWYgU0lPQ0lXRklSU1RQUklWCisjZGVmaW5lIFNJT0NJV0ZJUlNUUFJJVglTSU9DREVWUFJJVkFURQorI2VuZGlmIC8qIFNJT0NJV0ZJUlNUUFJJViAqLworCisjZWxzZQkvKiBXSVJFTEVTU19FWFQgPD0gMTIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYJbmV0d2F2ZV9oYW5kbGVyX2RlZjsKKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPD0gMTIgKi8KKworI2RlZmluZSBTSU9DR0lQU05BUAlTSU9DSVdGSVJTVFBSSVYJKyAxCS8qIFNpdGUgU3VydmV5IFNuYXBzaG90ICovCisKKyNkZWZpbmUgTUFYX0VTQSAxMAorCit0eXBlZGVmIHN0cnVjdCBuZXRfYWRkciB7CisgICAgdV9jaGFyIGFkZHI0OFs2XTsKK30gbmV0X2FkZHI7CisKK3N0cnVjdCBzaXRlX3N1cnZleSB7CisgICAgdV9zaG9ydCBsZW5ndGg7CisgICAgdV9jaGFyICBzdHJ1Y3RfcmV2aXNpb247CisgICAgdV9jaGFyICByb2FtaW5nX3N0YXRlOworCQorICAgIHVfY2hhciAgc3BfZXhpc3RzRmxhZzsKKyAgICB1X2NoYXIgIHNwX2xpbmtfcXVhbGl0eTsKKyAgICB1X2NoYXIgIHNwX21heF9saW5rX3F1YWxpdHk7CisgICAgdV9jaGFyICBsaW5rUXVhbGl0eUdvb2RGYWlyQm91bmRhcnk7CisgICAgdV9jaGFyICBsaW5rUXVhbGl0eUZhaXJQb29yQm91bmRhcnk7CisgICAgdV9jaGFyICBzcF91dGlsaXphdGlvbjsKKyAgICB1X2NoYXIgIHNwX2dvb2RuZXNzOworICAgIHVfY2hhciAgc3BfaG90aGVhZGNvdW50OworICAgIHVfY2hhciAgcm9hbWluZ19jb25kaXRpb247CisJCisgICAgbmV0X2FkZHIgc3A7CisgICAgdV9jaGFyICAgbnVtQVBzOworICAgIG5ldF9hZGRyIG5lYXJCeUFjY2Vzc1BvaW50c1tNQVhfRVNBXTsKK307CQorICAgCit0eXBlZGVmIHN0cnVjdCBuZXR3YXZlX3ByaXZhdGUgeworICAgIGRldl9saW5rX3QgbGluazsKKyAgICBzcGlubG9ja190CXNwaW5sb2NrOwkvKiBTZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZSAoU01QKSAqLworICAgIGRldl9ub2RlX3Qgbm9kZTsKKyAgICB1X2NoYXIgICAgIF9faW9tZW0gKnJhbUJhc2U7CisgICAgaW50ICAgICAgICB0aW1lb3V0Q291bnRlcjsKKyAgICBpbnQgICAgICAgIGxhc3RFeGVjOworICAgIHN0cnVjdCB0aW1lcl9saXN0ICAgICAgd2F0Y2hkb2c7CS8qIFRvIGF2b2lkIGJsb2NraW5nIHN0YXRlICovCisgICAgc3RydWN0IHNpdGVfc3VydmV5ICAgICBuc3M7CisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisjaWZkZWYgV0lSRUxFU1NfRVhUCisgICAgc3RydWN0IGl3X3N0YXRpc3RpY3MgICBpd19zdGF0czsgICAgLyogV2lyZWxlc3Mgc3RhdHMgKi8KKyNlbmRpZgorfSBuZXR3YXZlX3ByaXZhdGU7CisKKyNpZmRlZiBORVRXQVZFX1NUQVRTCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldHdhdmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisKKy8qCisgKiBUaGUgTmV0d2F2ZSBjYXJkIGlzIGxpdHRsZS1lbmRpYW4sIHNvIHdvbid0IHdvcmsgZm9yIGJpZyBlbmRpYW4KKyAqIHN5c3RlbXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X3VpbnQxNih1X2NoYXIgX19pb21lbSAqc3RhZGRyKSAKK3sKKyAgICByZXR1cm4gcmVhZHcoc3RhZGRyKTsgLyogUmV0dXJuIG9ubHkgMTYgYml0cyAqLworfQorCitzdGF0aWMgaW5saW5lIHNob3J0IGdldF9pbnQxNih1X2NoYXIgX19pb21lbSAqIHN0YWRkcikKK3sKKyAgICByZXR1cm4gcmVhZHcoc3RhZGRyKTsKK30KKworLyogCisgKiBXYWl0IHVudGlsIHRoZSBXT0MgKFdyaXRlIE9wZXJhdGlvbiBDb21wbGV0ZSkgYml0IGluIHRoZSAKKyAqIEFTUiAoQWRhcHRlciBTdGF0dXMgUmVnaXN0ZXIpIGlzIGFzc2VydGVkLiAKKyAqIFRoaXMgc2hvdWxkIGhhdmUgYWJvcnRlZCBpZiBpdCB0YWtlcyB0b28gbG9uZyB0aW1lLiAKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdhaXRfV09DKHVuc2lnbmVkIGludCBpb2Jhc2UpCit7CisgICAgLyogU3BpbiBsb2NrICovCisgICAgd2hpbGUgKChpbmIoaW9iYXNlICsgTkVUV0FWRV9SRUdfQVNSKSAmIDB4OCkgIT0gMHg4KSA7IAorfQorCisjaWZkZWYgV0lSRUxFU1NfRVhUCitzdGF0aWMgdm9pZCBuZXR3YXZlX3NuYXBzaG90KG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiwgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UsIAorCQkJICAgICBraW9fYWRkcl90IGlvYmFzZSkgeworICAgIHVfc2hvcnQgcmVzdWx0QnVmZmVyOworCisgICAgLyogaWYgdGltZSBzaW5jZSBsYXN0IHNuYXBzaG90IGlzID4gMSBzZWMuICgxMDAgamlmZmllcz8pICB0aGVuIHRha2UgCisgICAgICogbmV3IHNuYXBzaG90LCBlbHNlIHJldHVybiBjYWNoZWQgZGF0YS4gVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgcmF0ZS4gIAorICAgICAqLworICAgIGlmICggamlmZmllcyAtIHByaXYtPmxhc3RFeGVjID4gMTAwKSB7IAorCS8qIFRha2Ugc2l0ZSBzdXJ2ZXkgIHNuYXBzaG90ICovIAorCS8qcHJpbnRrKCBLRVJOX0RFQlVHICJUYWtpbmcgbmV3IHNuYXBzaG90LiAlbGRcbiIsIGppZmZpZXMgLQorCSAgcHJpdi0+bGFzdEV4ZWMpOyAqLworCXdhaXRfV09DKGlvYmFzZSk7IAorCXdyaXRlYihORVRXQVZFX0NNRF9TU1MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsgCisJd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOyAKKwl3YWl0X1dPQyhpb2Jhc2UpOyAKKworCS8qIEdldCByZXN1bHQgYW5kIGNvcHkgdG8gY2FjaCAqLyAKKwlyZXN1bHRCdWZmZXIgPSByZWFkdyhyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NSQlApOyAKKwljb3B5X2Zyb21fcGMoICZwcml2LT5uc3MsIHJhbUJhc2UrcmVzdWx0QnVmZmVyLCAKKwkJICAgICAgc2l6ZW9mKHN0cnVjdCBzaXRlX3N1cnZleSkpOyAKKyAgICB9IAorfQorI2VuZGlmCisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX2dldF93aXJlbGVzc19zdGF0cyAoZGV2KQorICoKKyAqICAgIFdpcmVsZXNzIGV4dGVuc2lvbnMgc3RhdGlzdGljcworICoKKyAqLworc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICpuZXR3YXZlX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorewkKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGtpb19hZGRyX3QgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisgICAgc3RydWN0IGl3X3N0YXRpc3RpY3MqIHdzdGF0czsKKwkKKyAgICB3c3RhdHMgPSAmcHJpdi0+aXdfc3RhdHM7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKyAgICBuZXR3YXZlX3NuYXBzaG90KCBwcml2LCByYW1CYXNlLCBpb2Jhc2UpOworCisgICAgd3N0YXRzLT5zdGF0dXMgPSBwcml2LT5uc3Mucm9hbWluZ19zdGF0ZTsKKyAgICB3c3RhdHMtPnF1YWwucXVhbCA9IHJlYWRiKCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX1NQQ1EpOyAKKyAgICB3c3RhdHMtPnF1YWwubGV2ZWwgPSByZWFkYiggcmFtQmFzZSArIE5FVFdBVkVfRVJFR19JU1BMUSk7CisgICAgd3N0YXRzLT5xdWFsLm5vaXNlID0gcmVhZGIoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BVKSAmIDB4M2Y7CisgICAgd3N0YXRzLT5kaXNjYXJkLm53aWQgPSAwTDsKKyAgICB3c3RhdHMtPmRpc2NhcmQuY29kZSA9IDBMOworICAgIHdzdGF0cy0+ZGlzY2FyZC5taXNjID0gMEw7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworICAgIAorICAgIHJldHVybiAmcHJpdi0+aXdfc3RhdHM7Cit9CisjZW5kaWYKKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfYXR0YWNoICh2b2lkKQorICoKKyAqICAgICBDcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZyBsb2NhbCBkYXRhIAorICogICAgIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCBDYXJkIAorICogICAgIFNlcnZpY2VzLgorICoKKyAqICAgICBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKKyAqICAgICBjb25maWd1cmUgdGhlIGNhcmQgYXQgdGhpcyBwb2ludCAtLSB3ZSB3YWl0IHVudGlsIHdlIHJlY2VpdmUgYQorICogICAgIGNhcmQgaW5zZXJ0aW9uIGV2ZW50LgorICovCitzdGF0aWMgZGV2X2xpbmtfdCAqbmV0d2F2ZV9hdHRhY2godm9pZCkKK3sKKyAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2OworICAgIGludCByZXQ7CisgICAgCisgICAgREVCVUcoMCwgIm5ldHdhdmVfYXR0YWNoKClcbiIpOworICAgIAorICAgIC8qIEluaXRpYWxpemUgdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlICovCisgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZSkpOworICAgIGlmICghZGV2KQorCXJldHVybiBOVUxMOworICAgIHByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGxpbmsgPSAmcHJpdi0+bGluazsKKyAgICBsaW5rLT5wcml2ID0gZGV2OworCisgICAgLyogVGhlIGlvIHN0cnVjdHVyZSBkZXNjcmliZXMgSU8gcG9ydCBtYXBwaW5nICovCisgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTY7CisgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisgICAgLyogbGluay0+aW8uTnVtUG9ydHMyID0gMTY7IAorICAgICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OyAqLworICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gNTsKKyAgICAKKyAgICAvKiBJbnRlcnJ1cHQgc2V0dXAgKi8KKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+aXJxLkhhbmRsZXIgPSAmbmV0d2F2ZV9pbnRlcnJ1cHQ7CisgICAgCisgICAgLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiAqLworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IDUwOworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAxOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOworCisgICAgLyogTmV0d2F2ZSBwcml2YXRlIHN0cnVjdCBpbml0LiBsaW5rL2Rldi9ub2RlIGFscmVhZHkgdGFrZW4gY2FyZSBvZiwKKyAgICAgKiBvdGhlciBzdHVmZiB6ZXJvJ2QgLSBKZWFuIElJICovCisgICAgc3Bpbl9sb2NrX2luaXQoJnByaXYtPnNwaW5sb2NrKTsKKworICAgIC8qIE5ldHdhdmUgc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZuZXR3YXZlX3N0YXJ0X3htaXQ7CisgICAgZGV2LT5nZXRfc3RhdHMgID0gJm5ldHdhdmVfZ2V0X3N0YXRzOworICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKyAgICAvKiB3aXJlbGVzcyBleHRlbnNpb25zICovCisjaWZkZWYgV0lSRUxFU1NfRVhUCisgICAgZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSAmbmV0d2F2ZV9nZXRfd2lyZWxlc3Nfc3RhdHM7CisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyAgICBkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZuZXR3YXZlX2hhbmRsZXJfZGVmOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEyICovCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCisgICAgZGV2LT5kb19pb2N0bCA9ICZuZXR3YXZlX2lvY3RsOworCisgICAgZGV2LT50eF90aW1lb3V0ID0gJm5ldHdhdmVfd2F0Y2hkb2c7CisgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisKKyAgICBkZXYtPm9wZW4gPSAmbmV0d2F2ZV9vcGVuOworICAgIGRldi0+c3RvcCA9ICZuZXR3YXZlX2Nsb3NlOworICAgIGxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsKKyAgICAKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJm5ldHdhdmVfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwluZXR3YXZlX2RldGFjaChsaW5rKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbGluazsKK30gLyogbmV0d2F2ZV9hdHRhY2ggKi8KKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfZGV0YWNoIChsaW5rKQorICoKKyAqICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgKiAgICB3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAqICAgIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCisgKiAgICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyB2b2lkIG5ldHdhdmVfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworCisgICAgREVCVUcoMCwgIm5ldHdhdmVfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKyAgCisgICAgLyoKKwkgIElmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgYW5kIGFjdGl2ZSwgd2Ugd29uJ3QKKwkgIGFjdHVhbGx5IGRlbGV0ZSBpdCB5ZXQuICBJbnN0ZWFkLCBpdCBpcyBtYXJrZWQgc28gdGhhdCB3aGVuCisJICB0aGUgcmVsZWFzZSgpIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhhdCB3aWxsIHRyaWdnZXIgYSBwcm9wZXIKKwkgIGRldGFjaCgpLgorCSovCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwluZXR3YXZlX3JlbGVhc2UobGluayk7CisJCisgICAgLyogQnJlYWsgdGhlIGxpbmsgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgaWYgKGxpbmstPmhhbmRsZSkKKwlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKyAgICAKKyAgICAvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKyAgICBpZiAoKmxpbmtwID09IE5VTEwpCisgICAgICB7CisJREVCVUcoMSwgIm5ldHdhdmVfY3M6IGRldGFjaCBmYWlsLCAnJXMnIG5vdCBpbiBsaXN0XG4iLAorCSAgICAgIGxpbmstPmRldi0+ZGV2X25hbWUpOworCXJldHVybjsKKyAgICAgIH0KKworICAgIC8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIHBpZWNlcyAqLworICAgICpsaW5rcCA9IGxpbmstPm5leHQ7CisgICAgaWYgKGxpbmstPmRldikgCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICBmcmVlX25ldGRldihkZXYpOworICAgIAorfSAvKiBuZXR3YXZlX2RldGFjaCAqLworCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBwcm90b2NvbCBuYW1lCisgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlzdHJjcHkod3JxdS0+bmFtZSwgIk5ldHdhdmUiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgTmV0d29yayBJRAorICovCitzdGF0aWMgaW50IG5ldHdhdmVfc2V0X253aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCW5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworCisjaWYgV0lSRUxFU1NfRVhUID4gOAorCWlmKCF3cnF1LT5ud2lkLmRpc2FibGVkKSB7CisJICAgIGRvbWFpbiA9IHdycXUtPm53aWQudmFsdWU7CisjZWxzZQkvKiBXSVJFTEVTU19FWFQgPiA4ICovCisJaWYod3JxdS0+bndpZC5vbikgeworCSAgICBkb21haW4gPSB3cnF1LT5ud2lkLm53aWQ7CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gOCAqLworCSAgICBwcmludGsoIEtFUk5fREVCVUcgIlNldHRpbmcgZG9tYWluIHRvIDB4JXglMDJ4XG4iLCAKKwkJICAgIChkb21haW4gPj4gOCkgJiAweDAxLCBkb21haW4gJiAweGZmKTsKKwkgICAgd2FpdF9XT0MoaW9iYXNlKTsKKwkgICAgd3JpdGViKE5FVFdBVkVfQ01EX1NNRCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworCSAgICB3cml0ZWIoIGRvbWFpbiAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKwkgICAgd3JpdGViKChkb21haW4gPj44ICkgJiAweDAxLHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IrMik7CisJICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAzKTsKKwl9CisKKwkvKiBSZUVuYWJsZSBpbnRlcnJ1cHRzICYgcmVzdG9yZSBmbGFncyAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IE5ldHdvcmsgSUQKKyAqLworc3RhdGljIGludCBuZXR3YXZlX2dldF9ud2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworI2lmIFdJUkVMRVNTX0VYVCA+IDgKKwl3cnF1LT5ud2lkLnZhbHVlID0gZG9tYWluOworCXdycXUtPm53aWQuZGlzYWJsZWQgPSAwOworCXdycXUtPm53aWQuZml4ZWQgPSAxOworI2Vsc2UJLyogV0lSRUxFU1NfRVhUID4gOCAqLworCXdycXUtPm53aWQubndpZCA9IGRvbWFpbjsKKwl3cnF1LT5ud2lkLm9uID0gMTsKKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA4ICovCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgc2NyYW1ibGUga2V5CisgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9zZXRfc2NyYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkJY2hhciAqa2V5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJa2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAmIHNhdmUgZmxhZ3MgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXNjcmFtYmxlX2tleSA9IChrZXlbMF0gPDwgOCkgfCBrZXlbMV07CisJd2FpdF9XT0MoaW9iYXNlKTsKKwl3cml0ZWIoTkVUV0FWRV9DTURfU1NLLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisJd3JpdGViKHNjcmFtYmxlX2tleSAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKwl3cml0ZWIoKHNjcmFtYmxlX2tleT4+OCkgJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7CisJd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDMpOworCisJLyogUmVFbmFibGUgaW50ZXJydXB0cyAmIHJlc3RvcmUgZmxhZ3MgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworICAgIAorCXJldHVybiAwOworfQorCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBzY3JhbWJsZSBrZXkKKyAqLworc3RhdGljIGludCBuZXR3YXZlX2dldF9zY3JhbWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCQljaGFyICprZXkpCit7CisJa2V5WzFdID0gc2NyYW1ibGVfa2V5ICYgMHhmZjsKKwlrZXlbMF0gPSAoc2NyYW1ibGVfa2V5Pj44KSAmIDB4ZmY7CisjaWYgV0lSRUxFU1NfRVhUID4gOAorCXdycXUtPmVuY29kaW5nLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJd3JxdS0+ZW5jb2RpbmcubGVuZ3RoID0gMjsKKyNlbHNlIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKwl3cnF1LT5lbmNvZGluZy5tZXRob2QgPSAxOworI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKworCXJldHVybiAwOworfQorCisjaWYgV0lSRUxFU1NfRVhUID4gOAorLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgbW9kZQorICovCitzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJaWYoZG9tYWluICYgMHgxMDApCisJCXdycXUtPm1vZGUgPSBJV19NT0RFX0lORlJBOworCWVsc2UKKwkJd3JxdS0+bW9kZSA9IElXX01PREVfQURIT0M7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA4ICovCisKKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHJhbmdlIGluZm8KKyAqLworc3RhdGljIGludCBuZXR3YXZlX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFNldCB0aGUgbGVuZ3RoICh2ZXJ5IGltcG9ydGFudCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgKi8KKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCisJLyogU2V0IGFsbCB0aGUgaW5mbyB3ZSBkb24ndCBjYXJlIG9yIGRvbid0IGtub3cgYWJvdXQgdG8gemVybyAqLworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOworCisjaWYgV0lSRUxFU1NfRVhUID4gMTAKKwkvKiBTZXQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbiB2ZXJzaW9ucyAqLworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDk7CS8qIE5vdGhpbmcgZm9yIHVzIGluIHYxMCBhbmQgdjExICovCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTAgKi8KKwkJICAgCisJLyogU2V0IGluZm9ybWF0aW9uIGluIHRoZSByYW5nZSBzdHJ1Y3QgKi8KKwlyYW5nZS0+dGhyb3VnaHB1dCA9IDQ1MCAqIDEwMDA7CS8qIGRvbid0IGFyZ3VlIG9uIHRoaXMgISAqLworCXJhbmdlLT5taW5fbndpZCA9IDB4MDAwMDsKKwlyYW5nZS0+bWF4X253aWQgPSAweDAxRkY7CisKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSAwOworCQkgICAKKwlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAweDNGOworCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMjU1OworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDI1NTsKKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOworCQkgICAKKyNpZiBXSVJFTEVTU19FWFQgPiA3CisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IDE7CisJcmFuZ2UtPmJpdHJhdGVbMF0gPSAxMDAwMDAwOwkvKiAxIE1iL3MgKi8KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA3ICovCisKKyNpZiBXSVJFTEVTU19FWFQgPiA4CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSAyOwkJLyogMTYgYml0cyBzY3JhbWJsaW5nICovCisJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDE7CisJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSAxOwkvKiBPbmx5IG9uZSBrZXkgcG9zc2libGUgKi8KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogZ2V0IHNuYXBzaG90CisgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9nZXRfc25hcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWtpb19hZGRyX3QgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBUYWtlIHNuYXBzaG90IG9mIGVudmlyb25tZW50ICovCisJbmV0d2F2ZV9zbmFwc2hvdCggcHJpdiwgcmFtQmFzZSwgaW9iYXNlKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHByaXYtPm5zcy5sZW5ndGg7CisJbWVtY3B5KGV4dHJhLCAodV9jaGFyICopICZwcml2LT5uc3MsIHNpemVvZiggc3RydWN0IHNpdGVfc3VydmV5KSk7CisKKwlwcml2LT5sYXN0RXhlYyA9IGppZmZpZXM7CisKKwkvKiBSZUVuYWJsZSBpbnRlcnJ1cHRzICYgcmVzdG9yZSBmbGFncyAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgCisJcmV0dXJuKDApOworfQorCisvKgorICogU3RydWN0dXJlcyB0byBleHBvcnQgdGhlIFdpcmVsZXNzIEhhbmRsZXJzCisgKiAgICAgVGhpcyBpcyB0aGUgc3R1ZmYgdGhhdCBhcmUgdHJlYXRlZCB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyAoaXdjb25maWcpCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgbmV0d2F2ZV9wcml2YXRlX2FyZ3NbXSA9IHsKKy8qeyBjbWQsICAgICAgICAgc2V0X2FyZ3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9hcmdzLCBuYW1lIH0gKi8KKyAgeyBTSU9DR0lQU05BUCwgMCwgCisgICAgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCBzaXplb2Yoc3RydWN0IHNpdGVfc3VydmV5KSwgCisgICAgImdldHNpdGVzdXJ2ZXkiIH0sCit9OworCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCW5ldHdhdmVfaGFuZGxlcltdID0KK3sKKwlOVUxMLAkJCQkvKiBTSU9DU0lXTkFNRSAqLworCW5ldHdhdmVfZ2V0X25hbWUsCQkvKiBTSU9DR0lXTkFNRSAqLworCW5ldHdhdmVfc2V0X253aWQsCQkvKiBTSU9DU0lXTldJRCAqLworCW5ldHdhdmVfZ2V0X253aWQsCQkvKiBTSU9DR0lXTldJRCAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdGUkVRICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0ZSRVEgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXTU9ERSAqLworCW5ldHdhdmVfZ2V0X21vZGUsCQkvKiBTSU9DR0lXTU9ERSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdTRU5TICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1NFTlMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXUkFOR0UgKi8KKwluZXR3YXZlX2dldF9yYW5nZSwJCS8qIFNJT0NHSVdSQU5HRSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdQUklWICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1BSSVYgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXU1RBVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXU1RBVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXU1BZICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1NQWSAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0FQICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0FQICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdBUExJU1QgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdFU1NJRCAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdFU1NJRCAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JBVEUgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUkFURSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUlRTICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0ZSQUcgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXRlJBRyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSRVRSWSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdSRVRSWSAqLworCW5ldHdhdmVfc2V0X3NjcmFtYmxlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLworCW5ldHdhdmVfZ2V0X3NjcmFtYmxlLAkJLyogU0lPQ0dJV0VOQ09ERSAqLworfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCW5ldHdhdmVfcHJpdmF0ZV9oYW5kbGVyW10gPQoreworCU5VTEwsCQkJCS8qIFNJT0NJV0ZJUlNUUFJJViAqLworCW5ldHdhdmVfZ2V0X3NuYXAsCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAxICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCW5ldHdhdmVfaGFuZGxlcl9kZWYgPQoreworCS5udW1fc3RhbmRhcmQJPSBzaXplb2YobmV0d2F2ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlCT0gc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2YobmV0d2F2ZV9wcml2YXRlX2FyZ3MpL3NpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSwKKwkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBuZXR3YXZlX2hhbmRsZXIsCisJLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBuZXR3YXZlX3ByaXZhdGVfaGFuZGxlciwKKwkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgbmV0d2F2ZV9wcml2YXRlX2FyZ3MsCit9OworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEyICovCisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX2lvY3RsIChkZXYsIHJxLCBjbWQpCisgKgorICogICAgIFBlcmZvcm0gaW9jdGwgOiBjb25maWcgJiBpbmZvIHN0dWZmCisgKiAgICAgVGhpcyBpcyB0aGUgc3R1ZmYgdGhhdCBhcmUgdHJlYXRlZCB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyAoaXdjb25maWcpCisgKgorICovCitzdGF0aWMgaW50IG5ldHdhdmVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgLyogaW9jdGwgZGV2aWNlICovCisJCQkgc3RydWN0IGlmcmVxICpycSwJIC8qIERhdGEgcGFzc2VkICovCisJCQkgaW50CWNtZCkJICAgICAvKiBJb2N0bCBudW1iZXIgKi8KK3sKKyAgICBpbnQJCQlyZXQgPSAwOworI2lmZGVmIFdJUkVMRVNTX0VYVAorI2lmIFdJUkVMRVNTX0VYVCA8PSAxMgorICAgIHN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKyNlbmRpZgorI2VuZGlmCisJCisgICAgREVCVUcoMCwgIiVzOiAtPm5ldHdhdmVfaW9jdGwoY21kPTB4JVgpXG4iLCBkZXYtPm5hbWUsIGNtZCk7CisJCisgICAgLyogTG9vayB3aGF0IGlzIHRoZSByZXF1ZXN0ICovCisgICAgc3dpdGNoKGNtZCkgeworCS8qIC0tLS0tLS0tLS0tLS0tLSBXSVJFTEVTUyBFWFRFTlNJT05TIC0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIFdJUkVMRVNTX0VYVAorI2lmIFdJUkVMRVNTX0VYVCA8PSAxMgorICAgIGNhc2UgU0lPQ0dJV05BTUU6CisJbmV0d2F2ZV9nZXRfbmFtZShkZXYsIE5VTEwsICYod3JxLT51KSwgTlVMTCk7CisJYnJlYWs7CisgICAgY2FzZSBTSU9DU0lXTldJRDoKKwlyZXQgPSBuZXR3YXZlX3NldF9ud2lkKGRldiwgTlVMTCwgJih3cnEtPnUpLCBOVUxMKTsKKwlicmVhazsKKyAgICBjYXNlIFNJT0NHSVdOV0lEOgorCXJldCA9IG5ldHdhdmVfZ2V0X253aWQoZGV2LCBOVUxMLCAmKHdycS0+dSksIE5VTEwpOworCWJyZWFrOworI2lmIFdJUkVMRVNTX0VYVCA+IDgJLyogTm90ZSA6IFRoZSBBUEkgZGlkIGNoYW5nZS4uLiAqLworICAgIGNhc2UgU0lPQ0dJV0VOQ09ERToKKwkvKiBHZXQgc2NyYW1ibGUga2V5ICovCisJaWYod3JxLT51LmVuY29kaW5nLnBvaW50ZXIgIT0gKGNhZGRyX3QpIDApCisJICB7CisJICAgIGNoYXIJa2V5WzJdOworCSAgICByZXQgPSBuZXR3YXZlX2dldF9zY3JhbWJsZShkZXYsIE5VTEwsICYod3JxLT51KSwga2V5KTsKKwkgICAgaWYoY29weV90b191c2VyKHdycS0+dS5lbmNvZGluZy5wb2ludGVyLCBrZXksIDIpKQorCSAgICAgIHJldCA9IC1FRkFVTFQ7CisJICB9CisJYnJlYWs7CisgICAgY2FzZSBTSU9DU0lXRU5DT0RFOgorCS8qIFNldCAgc2NyYW1ibGUga2V5ICovCisJaWYod3JxLT51LmVuY29kaW5nLnBvaW50ZXIgIT0gKGNhZGRyX3QpIDApCisJICB7CisJICAgIGNoYXIJa2V5WzJdOworCSAgICBpZihjb3B5X2Zyb21fdXNlcihrZXksIHdycS0+dS5lbmNvZGluZy5wb2ludGVyLCAyKSkKKwkgICAgICB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCSAgICAgIH0KKwkgICAgcmV0ID0gbmV0d2F2ZV9zZXRfc2NyYW1ibGUoZGV2LCBOVUxMLCAmKHdycS0+dSksIGtleSk7CisJICB9CisJYnJlYWs7CisgICAgY2FzZSBTSU9DR0lXTU9ERToKKwkvKiBNb2RlIG9mIG9wZXJhdGlvbiAqLworCXJldCA9IG5ldHdhdmVfZ2V0X21vZGUoZGV2LCBOVUxMLCAmKHdycS0+dSksIE5VTEwpOworCWJyZWFrOworI2Vsc2UgLyogV0lSRUxFU1NfRVhUID4gOCAqLworICAgIGNhc2UgU0lPQ0dJV0VOQ09ERToKKwkvKiBHZXQgc2NyYW1ibGUga2V5ICovCisJcmV0ID0gbmV0d2F2ZV9nZXRfc2NyYW1ibGUoZGV2LCBOVUxMLCAmKHdycS0+dSksCisJCQkJICAgKGNoYXIgKikgJndycS0+dS5lbmNvZGluZy5jb2RlKTsKKwlicmVhazsKKyAgICBjYXNlIFNJT0NTSVdFTkNPREU6CisJLyogU2V0ICBzY3JhbWJsZSBrZXkgKi8KKwlyZXQgPSBuZXR3YXZlX3NldF9zY3JhbWJsZShkZXYsIE5VTEwsICYod3JxLT51KSwKKwkJCQkgICAoY2hhciAqKSAmd3JxLT51LmVuY29kaW5nLmNvZGUpOworCWJyZWFrOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKyAgIGNhc2UgU0lPQ0dJV1JBTkdFOgorICAgICAgIC8qIEJhc2ljIGNoZWNraW5nLi4uICovCisgICAgICAgaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkgeworICAgICAgICAgICBzdHJ1Y3QgaXdfcmFuZ2UgcmFuZ2U7CisJICAgcmV0ID0gbmV0d2F2ZV9nZXRfcmFuZ2UoZGV2LCBOVUxMLCAmKHdycS0+dSksIChjaGFyICopICZyYW5nZSk7CisJICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcmFuZ2UsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpKQorCSAgICAgICByZXQgPSAtRUZBVUxUOworICAgICAgIH0KKyAgICAgICBicmVhazsKKyAgICBjYXNlIFNJT0NHSVdQUklWOgorCS8qIEJhc2ljIGNoZWNraW5nLi4uICovCisJaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkgeworCSAgICAvKiBTZXQgdGhlIG51bWJlciBvZiBpb2N0bCBhdmFpbGFibGUgKi8KKwkgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZV9hcmdzKSAvIHNpemVvZihuZXR3YXZlX3ByaXZhdGVfYXJnc1swXSk7CisJCQkKKwkgICAgLyogQ29weSBzdHJ1Y3R1cmUgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJICAgIGlmKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJICAgICh1X2NoYXIgKikgbmV0d2F2ZV9wcml2YXRlX2FyZ3MsCisJCQkgICAgc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZV9hcmdzKSkpCisJICAgICAgcmV0ID0gLUVGQVVMVDsKKwl9IAorCWJyZWFrOworICAgIGNhc2UgU0lPQ0dJUFNOQVA6CisJaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkgeworCSAgICBjaGFyIGJ1ZmZlcltzaXplb2YoIHN0cnVjdCBzaXRlX3N1cnZleSldOworCSAgICByZXQgPSBuZXR3YXZlX2dldF9zbmFwKGRldiwgTlVMTCwgJih3cnEtPnUpLCBidWZmZXIpOworCSAgICAvKiBDb3B5IHN0cnVjdHVyZSB0byB0aGUgdXNlciBidWZmZXIgKi8KKwkgICAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIAorCQkJICAgIGJ1ZmZlciwKKwkJCSAgICBzaXplb2YoIHN0cnVjdCBzaXRlX3N1cnZleSkpKQorCSAgICAgIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkJhZCBidWZmZXIhXG4iKTsKKwkJYnJlYWs7CisJICAgICAgfQorCX0KKwlicmVhazsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPD0gMTIgKi8KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKyAgICBkZWZhdWx0OgorCXJldCA9IC1FT1BOT1RTVVBQOworICAgIH0KKwkKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV9wY21jaWFfY29uZmlnIChsaW5rKQorICoKKyAqICAgICBuZXR3YXZlX3BjbWNpYV9jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gCisgKiAgICAgZXZlbnQgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCisgKiAgICAgZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLiAKKyAqCisgKi8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBuZXR3YXZlX3BjbWNpYV9jb25maWcoZGV2X2xpbmtfdCAqbGluaykgeworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgaW50IGksIGosIGxhc3RfcmV0LCBsYXN0X2ZuOworICAgIHVfY2hhciBidWZbNjRdOworICAgIHdpbl9yZXFfdCByZXE7CisgICAgbWVtcmVxX3QgbWVtOworICAgIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gTlVMTDsKKworICAgIERFQlVHKDAsICJuZXR3YXZlX3BjbWNpYV9jb25maWcoMHglcClcbiIsIGxpbmspOworCisgICAgLyoKKyAgICAgIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbgorICAgICAgcmVnaXN0ZXJzLgorICAgICovCisgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKSBidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisKKyAgICAvKiBDb25maWd1cmUgY2FyZCAqLworICAgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKyAgICAvKgorICAgICAqICBUcnkgYWxsb2NhdGluZyBJTyBwb3J0cy4gIFRoaXMgdHJpZXMgYSBmZXcgZml4ZWQgYWRkcmVzc2VzLgorICAgICAqICBJZiB5b3Ugd2FudCwgeW91IGNhbiBhbHNvIHJlYWQgdGhlIGNhcmQncyBjb25maWcgdGFibGUgdG8KKyAgICAgKiAgcGljayBhZGRyZXNzZXMgLS0gc2VlIHRoZSBzZXJpYWwgZHJpdmVyIGZvciBhbiBleGFtcGxlLgorICAgICAqLworICAgIGZvciAoaSA9IGogPSAweDA7IGogPCAweDQwMDsgaiArPSAweDIwKSB7CisJbGluay0+aW8uQmFzZVBvcnQxID0gaiBeIDB4MzAwOworCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CisgICAgfQorICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlcXVlc3RJTywgaSk7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgTm93IGFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKKyAgICAgKiAgYWN0dWFsbHkgYXNzaWduIGEgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LgorICAgICAqLworICAgIENTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShoYW5kbGUsICZsaW5rLT5pcnEpKTsKKworICAgIC8qCisgICAgICogIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCisgICAgICogIHRoZSBJL08gd2luZG93cyBhbmQgdGhlIGludGVycnVwdCBtYXBwaW5nLgorICAgICAqLworICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKworICAgIC8qCisgICAgICogIEFsbG9jYXRlIGEgMzJLIG1lbW9yeSB3aW5kb3cuICBOb3RlIHRoYXQgdGhlIGRldl9saW5rX3QKKyAgICAgKiAgc3RydWN0dXJlIHByb3ZpZGVzIHNwYWNlIGZvciBvbmUgd2luZG93IGhhbmRsZSAtLSBpZiB5b3VyCisgICAgICogIGRldmljZSBuZWVkcyBzZXZlcmFsIHdpbmRvd3MsIHlvdSdsbCBuZWVkIHRvIGtlZXAgdHJhY2sgb2YKKyAgICAgKiAgdGhlIGhhbmRsZXMgaW4geW91ciBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBkZXYtPnByaXYuCisgICAgICovCisgICAgREVCVUcoMSwgIlNldHRpbmcgbWVtIHNwZWVkIG9mICVkXG4iLCBtZW1fc3BlZWQpOworCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84fFdJTl9NRU1PUllfVFlQRV9DTXxXSU5fRU5BQkxFOworICAgIHJlcS5CYXNlID0gMDsgcmVxLlNpemUgPSAweDgwMDA7CisgICAgcmVxLkFjY2Vzc1NwZWVkID0gbWVtX3NwZWVkOworICAgIENTX0NIRUNLKFJlcXVlc3RXaW5kb3csIHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKSk7CisgICAgbWVtLkNhcmRPZmZzZXQgPSAweDIwMDAwOyBtZW0uUGFnZSA9IDA7IAorICAgIENTX0NIRUNLKE1hcE1lbVBhZ2UsIHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWVtKSk7CisKKyAgICAvKiBTdG9yZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbW1vbiB3aW5kb3cgZnJhbWUgKi8KKyAgICByYW1CYXNlID0gaW9yZW1hcChyZXEuQmFzZSwgMHg4MDAwKTsKKyAgICBwcml2LT5yYW1CYXNlID0gcmFtQmFzZTsKKworICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisKKyAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCXByaW50ayhLRVJOX0RFQlVHICJuZXR3YXZlX2NzOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworCWdvdG8gZmFpbGVkOworICAgIH0KKworICAgIHN0cmNweShwcml2LT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworICAgIGxpbmstPmRldiA9ICZwcml2LT5ub2RlOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisKKyAgICAvKiBSZXNldCBjYXJkIGJlZm9yZSByZWFkaW5nIHBoeXNpY2FsIGFkZHJlc3MgKi8KKyAgICBuZXR3YXZlX2RvcmVzZXQoZGV2LT5iYXNlX2FkZHIsIHJhbUJhc2UpOworCisgICAgLyogUmVhZCB0aGUgZXRoZXJuZXQgYWRkcmVzcyBhbmQgZmlsbCBpbiB0aGUgTmV0d2F2ZSByZWdpc3RlcnMuICovCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgCisJZGV2LT5kZXZfYWRkcltpXSA9IHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfUEEgKyBpKTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBOZXR3YXZlOiBwb3J0ICUjM2x4LCBpcnEgJWQsIG1lbSAlbHggaWQgIgorCSAgICIlYyVjLCBod19hZGRyICIsIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLAorCSAgICh1X2xvbmcpIHJhbUJhc2UsIChpbnQpIHJlYWRiKHJhbUJhc2UrTkVUV0FWRV9FUkVHX05JKSwKKwkgICAoaW50KSByZWFkYihyYW1CYXNlK05FVFdBVkVfRVJFR19OSSsxKSk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlwcmludGsoIiUwMlglcyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaTw1KSA/ICI6IiA6ICJcbiIpKTsKKworICAgIC8qIGdldCByZXZpc2lvbiB3b3JkcyAqLworICAgIHByaW50ayhLRVJOX0RFQlVHICJOZXR3YXZlX3Jlc2V0OiByZXZpc2lvbiAlMDR4ICUwNHhcbiIsIAorCSAgIGdldF91aW50MTYocmFtQmFzZSArIE5FVFdBVkVfRVJFR19BUlcpLAorCSAgIGdldF91aW50MTYocmFtQmFzZSArIE5FVFdBVkVfRVJFR19BUlcrMikpOworICAgIHJldHVybjsKKworY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgorICAgIG5ldHdhdmVfcmVsZWFzZShsaW5rKTsKK30gLyogbmV0d2F2ZV9wY21jaWFfY29uZmlnICovCisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX3JlbGVhc2UgKGFyZykKKyAqCisgKiAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgbmV0d2F2ZV9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKKyAqICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICogICAgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgKi8KK3N0YXRpYyB2b2lkIG5ldHdhdmVfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICBERUJVRygwLCAibmV0d2F2ZV9yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworICAgIC8qIERvbid0IGJvdGhlciBjaGVja2luZyB0byBzZWUgaWYgdGhlc2Ugc3VjY2VlZCBvciBub3QgKi8KKyAgICBpZiAobGluay0+d2luKSB7CisJaW91bm1hcChwcml2LT5yYW1CYXNlKTsKKwlwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKyAgICB9CisgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV9ldmVudCAoZXZlbnQsIHByaW9yaXR5LCBhcmdzKQorICoKKyAqICAgIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICogICAgc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiAgQSBDQVJEX1JFTU9WQUwgZXZlbnQKKyAqICAgIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgKiAgICB0byB0YWxrIHRvIHRoZSBjYXJkIGFueSBtb3JlLgorICoKKyAqICAgIFdoZW4gYSBDQVJEX1JFTU9WQUwgZXZlbnQgaXMgcmVjZWl2ZWQsIHdlIGltbWVkaWF0ZWx5IHNldCBhIGZsYWcKKyAqICAgIHRvIGJsb2NrIGZ1dHVyZSBhY2Nlc3NlcyB0byB0aGlzIGRldmljZS4gIEFsbCB0aGUgZnVuY3Rpb25zIHRoYXQKKyAqICAgIGFjdHVhbGx5IGFjY2VzcyB0aGUgZGV2aWNlIHNob3VsZCBjaGVjayB0aGlzIGZsYWcgdG8gbWFrZSBzdXJlCisgKiAgICB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50LgorICoKKyAqLworc3RhdGljIGludCBuZXR3YXZlX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCSBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCQorICAgIERFQlVHKDEsICJuZXR3YXZlX2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKyAgCisgICAgc3dpdGNoIChldmVudCkgeworICAgIGNhc2UgQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFOgorCURFQlVHKDAsICJuZXR3YXZlX2NzOiByZWdpc3RyYXRpb24gY29tcGxldGVcbiIpOworCWJyZWFrOworCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCSAgICBuZXR3YXZlX3JlbGVhc2UobGluayk7CisJfQorCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJbmV0d2F2ZV9wY21jaWFfY29uZmlnKCBsaW5rKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIGlmIChsaW5rLT5vcGVuKQorCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJICAgIGlmIChsaW5rLT5vcGVuKSB7CisJCW5ldHdhdmVfcmVzZXQoZGV2KTsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCSAgICB9CisJfQorCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogbmV0d2F2ZV9ldmVudCAqLworCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV9kb3Jlc2V0IChpb0Jhc2UsIHJhbUJhc2UpCisgKgorICogICAgUHJvcGVyIGhhcmR3YXJlIHJlc2V0IG9mIHRoZSBjYXJkLgorICovCitzdGF0aWMgdm9pZCBuZXR3YXZlX2RvcmVzZXQoa2lvX2FkZHJfdCBpb0Jhc2UsIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlKQoreworICAgIC8qIFJlc2V0IGNhcmQgKi8KKyAgICB3YWl0X1dPQyhpb0Jhc2UpOworICAgIG91dGIoMHg4MCwgaW9CYXNlICsgTkVUV0FWRV9SRUdfUE1SKTsKKyAgICB3cml0ZWIoMHgwOCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19BU0NDKTsgLyogQml0IDMgaXMgV09DICovCisgICAgb3V0YigweDAsIGlvQmFzZSArIE5FVFdBVkVfUkVHX1BNUik7IC8qIHJlbGVhc2UgcmVzZXQgKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfcmVzZXQgKGRldikKKyAqCisgKiAgICBSZXNldCBhbmQgcmVzdG9yZSBhbGwgb2YgdGhlIG5ldHdhdmUgcmVnaXN0ZXJzIAorICovCitzdGF0aWMgdm9pZCBuZXR3YXZlX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKyAgICAvKiB1X2NoYXIgc3RhdGU7ICovCisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisgICAga2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIERFQlVHKDAsICJuZXR3YXZlX3Jlc2V0OiBEb25lIHdpdGggaGFyZHdhcmUgcmVzZXRcbiIpOworCisgICAgcHJpdi0+dGltZW91dENvdW50ZXIgPSAwOworCisgICAgLyogUmVzZXQgY2FyZCAqLworICAgIG5ldHdhdmVfZG9yZXNldChpb2Jhc2UsIHJhbUJhc2UpOworICAgIHByaW50ayhLRVJOX0RFQlVHICJuZXR3YXZlX3Jlc2V0OiBEb25lIHdpdGggaGFyZHdhcmUgcmVzZXRcbiIpOworCQorICAgIC8qIFdyaXRlIGEgTk9QIHRvIGNoZWNrIHRoZSBjYXJkICovCisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfTk9QLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworCQorICAgIC8qIFNldCByZWNlaXZlIGNvbmYgKi8KKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9TUkMsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKyAgICB3cml0ZWIocnhDb25mUnhFbmEgKyByeENvbmZCY2FzdCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKKyAgICAKKyAgICAvKiBTZXQgdHJhbnNtaXQgY29uZiAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX1NUQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworICAgIHdyaXRlYih0eENvbmZUeEVuYSwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKKyAgICAKKyAgICAvKiBOb3cgc2V0IHRoZSBNVSBEb21haW4gKi8KKyAgICBwcmludGsoS0VSTl9ERUJVRyAiU2V0dGluZyBkb21haW4gdG8gMHgleCUwMnhcbiIsIChkb21haW4gPj4gOCkgJiAweDAxLCBkb21haW4gJiAweGZmKTsKKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9TTUQsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKyAgICB3cml0ZWIoZG9tYWluICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworICAgIHdyaXRlYigoZG9tYWluPj44KSAmIDB4MDEsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMyk7CisJCisgICAgLyogU2V0IHNjcmFtYmxlIGtleSAqLworICAgIHByaW50ayhLRVJOX0RFQlVHICJTZXR0aW5nIHNjcmFtYmxlIGtleSB0byAweCV4XG4iLCBzY3JhbWJsZV9rZXkpOworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX1NTSywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworICAgIHdyaXRlYihzY3JhbWJsZV9rZXkgJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisgICAgd3JpdGViKChzY3JhbWJsZV9rZXk+PjgpICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDIpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAzKTsKKworICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzLCBiaXQgNCBoaWdoIHRvIGtlZXAgdW51c2VkCisgICAgICogc291cmNlIGZyb20gaW50ZXJydXB0aW5nIHVzLCBiaXQgMiBoaWdoIHRvIAorICAgICAqIHNldCBpbnRlcnJ1cHQgZW5hYmxlLCA1NjcgdG8gZW5hYmxlIFR4RE4sIAorICAgICAqIFJ4RXJyIGFuZCBSeFJkeQorICAgICAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgb3V0YihpbXJDb25mSUVOQStpbXJDb25mUkZVMSwgaW9iYXNlICsgTkVUV0FWRV9SRUdfSU1SKTsKKworICAgIC8qIEhlbnQgNCBieXRlcyBmcmEgMHgxNzAuIFNrYWwgdmFlcmUgMGEsMjksODgsMzYKKyAgICAgKiB3YWl0V09DCisgICAgICogc2tyaXYgODAgdGlsIGQwMDA6MzY4OAorICAgICAqIHNqZWtrIG9tIGRldCBibGUgODAKKyAgICAgKi8KKyAgICAKKyAgICAvKiBFbmFibGUgUmVjZWl2ZXIgKi8KKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9FUiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKwkKKyAgICAvKiBTZXQgdGhlIElFTkEgYml0IGluIENPUiAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgb3V0Yihjb3JDb25mSUVOQSArIGNvckNvbmZMVkxSRVEsIGlvYmFzZSArIE5FVFdBVkVfUkVHX0NPUik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX2h3X3htaXQgKGRhdGEsIGxlbiwgZGV2KSAgICAKKyAqLworc3RhdGljIGludCBuZXR3YXZlX2h3X3htaXQodW5zaWduZWQgY2hhciogZGF0YSwgaW50IGxlbiwKKwkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpIHsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIGludCBUeEZyZWVMaXN0LAorCSAgICAgICAgIGN1ckJ1ZmYsCisJICAgICAgICAgTWF4RGF0YSwgCisgICAgICAgICAgICAgICAgIERhdGFPZmZzZXQ7CisgICAgaW50IHRtcGNvdW50OyAKKwkKKyAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBfX2lvbWVtICogcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisgICAga2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAmIHNhdmUgZmxhZ3MgKi8KKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAgIC8qIENoZWNrIGlmIHRoZXJlIGFyZSB0cmFuc21pdCBidWZmZXJzIGF2YWlsYWJsZSAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgaWYgKChpbmIoaW9iYXNlK05FVFdBVkVfUkVHX0FTUikgJiBORVRXQVZFX0FTUl9UWEJBKSA9PSAwKSB7CisJLyogTm8gYnVmZmVycyBhdmFpbGFibGUgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAibmV0d2F2ZV9od194bWl0OiAlcyAtIG5vIHhtaXQgYnVmZmVycyBhdmFpbGFibGUuXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCisgICAgREVCVUcoMywgIlRyYW5zbWl0dGluZyB3aXRoIFNQQ1EgJXggU1BVICV4IExJRiAleCBJU1BMUSAleFxuIiwKKwkgIHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BDUSksCisJICByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1NQVSksCisJICByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0xJRiksCisJICByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0lTUExRKSk7CisKKyAgICAvKiBOb3cgdHJ5IHRvIGluc2VydCBpdCBpbnRvIHRoZSBhZGFwdGVycyBmcmVlIG1lbW9yeSAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgVHhGcmVlTGlzdCA9IGdldF91aW50MTYocmFtQmFzZSArIE5FVFdBVkVfRVJFR19URFApOworICAgIE1heERhdGEgICAgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVERQKzIpOworICAgIERhdGFPZmZzZXQgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVERQKzQpOworCQorICAgIERFQlVHKDMsICJUeEZyZWVMaXN0ICV4LCBNYXhEYXRhICV4LCBEYXRhT2Zmc2V0ICV4XG4iLAorCSAgVHhGcmVlTGlzdCwgTWF4RGF0YSwgRGF0YU9mZnNldCk7CisKKyAgICAvKiBDb3B5IHBhY2tldCB0byB0aGUgYWRhcHRlciBmcmFnbWVudCBidWZmZXJzICovCisgICAgY3VyQnVmZiA9IFR4RnJlZUxpc3Q7IAorICAgIHRtcGNvdW50ID0gMDsgCisgICAgd2hpbGUgKHRtcGNvdW50IDwgbGVuKSB7CisJaW50IHRtcGxlbiA9IGxlbiAtIHRtcGNvdW50OyAKKwljb3B5X3RvX3BjKHJhbUJhc2UgKyBjdXJCdWZmICsgRGF0YU9mZnNldCwgZGF0YSArIHRtcGNvdW50LCAKKwkJICAgKHRtcGxlbiA8IE1heERhdGEpID8gdG1wbGVuIDogTWF4RGF0YSk7CisJdG1wY291bnQgKz0gTWF4RGF0YTsKKwkJCQorCS8qIEFkdmFuY2UgdG8gbmV4dCBidWZmZXIgKi8KKwljdXJCdWZmID0gZ2V0X3VpbnQxNihyYW1CYXNlICsgY3VyQnVmZik7CisgICAgfQorICAgIAorICAgIC8qIE5vdyBpc3N1ZSB0cmFuc21pdCBsaXN0ICovCisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfVEwsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKyAgICB3cml0ZWIobGVuICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworICAgIHdyaXRlYigobGVuPj44KSAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMyk7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldHdhdmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJLyogVGhpcyBmbGFnIGluZGljYXRlIHRoYXQgdGhlIGhhcmR3YXJlIGNhbid0IHBlcmZvcm0gYSB0cmFuc21pc3Npb24uCisJICogVGhlb3JpdGljYWxseSwgTkVUMyBjaGVjayBpdCBiZWZvcmUgc2VuZGluZyBhIHBhY2tldCB0byB0aGUgZHJpdmVyLAorCSAqIGJ1dCBpbiBmYWN0IGl0IG5ldmVyIGRvIHRoYXQgYW5kIHBvb2wgY29udGludW91c2x5LgorCSAqIEFzIHRoZSB3YXRjaGRvZyB3aWxsIGFib3J0IHRvbyBsb25nIHRyYW5zbWlzc2lvbnMsIHdlIGFyZSBxdWl0ZSBzYWZlLi4uCisJICovCisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICB7CisJc2hvcnQgbGVuZ3RoID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47CisJdW5zaWduZWQgY2hhciogYnVmID0gc2tiLT5kYXRhOworCQorCWlmIChuZXR3YXZlX2h3X3htaXQoIGJ1ZiwgbGVuZ3RoLCBkZXYpID09IDEpIHsKKwkgICAgLyogU29tZSBlcnJvciwgbGV0J3MgbWFrZSB0aGVtIGNhbGwgdXMgYW5vdGhlciB0aW1lPyAqLworCSAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCX0KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICB9CisgICAgZGV2X2tmcmVlX3NrYihza2IpOworICAgIAorICAgIHJldHVybiAwOworfSAvKiBuZXR3YXZlX3N0YXJ0X3htaXQgKi8KKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfaW50ZXJydXB0IChpcnEsIGRldl9pZCwgcmVncykKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIE5ldHdhdmUgY2FyZC4gVGhpcworICogICAgcm91dGluZSB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlcjogCisgKgkgIDEuIEEgcGFja2V0IGlzIHJlY2VpdmVkLgorICoJICAyLiBBIHBhY2tldCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdHJhbnNmZXJyZWQgYW5kIHRoZSB1bml0IGlzCisgKgkgICAgIHJlYWR5IHRvIHRyYW5zbWl0IGFub3RoZXIgcGFja2V0LgorICoJICAzLiBBIGNvbW1hbmQgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBuZXR3YXZlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgIGtpb19hZGRyX3QgaW9iYXNlOworICAgIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisgICAgc3RydWN0IG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZwcml2LT5saW5rOworICAgIGludCBpOworICAgIAorICAgIGlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwlyZXR1cm4gSVJRX05PTkU7CisgICAgCisgICAgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisJCisgICAgLyogTm93IGZpbmQgd2hhdCBjYXVzZWQgdGhlIGludGVycnVwdCwgY2hlY2sgd2hpbGUgaW50ZXJydXB0cyByZWFkeSAqLworICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJdV9jaGFyIHN0YXR1czsKKwkJCisJd2FpdF9XT0MoaW9iYXNlKTsJCisJaWYgKCEoaW5iKGlvYmFzZStORVRXQVZFX1JFR19DQ1NSKSAmIDB4MDIpKQorCSAgICBicmVhazsgLyogTm9uZSBvZiB0aGUgaW50ZXJydXB0IHNvdXJjZXMgYXNzZXJ0ZWQgKG5vcm1hbCBleGl0KSAqLworCQorICAgICAgICBzdGF0dXMgPSBpbmIoaW9iYXNlICsgTkVUV0FWRV9SRUdfQVNSKTsKKwkJCisJaWYgKCFERVZfT0sobGluaykpIHsKKwkgICAgREVCVUcoMSwgIm5ldHdhdmVfaW50ZXJydXB0OiBJbnRlcnJ1cHQgd2l0aCBzdGF0dXMgMHgleCAiCisJCSAgImZyb20gcmVtb3ZlZCBvciBzdXNwZW5kZWQgY2FyZCFcbiIsIHN0YXR1cyk7CisJICAgIGJyZWFrOworCX0KKwkJCisJLyogUnhSZHkgKi8KKwlpZiAoc3RhdHVzICYgMHg4MCkgeworCSAgICBuZXR3YXZlX3J4KGRldik7CisJICAgIC8qIHdhaXRfV09DKGlvYmFzZSk7ICovCisJICAgIC8qIFJ4UmR5IGNhbm5vdCBiZSByZXNldCBkaXJlY3RseSBieSB0aGUgaG9zdCAqLworCX0KKwkvKiBSeEVyciAqLworCWlmIChzdGF0dXMgJiAweDQwKSB7CisJICAgIHVfY2hhciByc2VyOworCQkJCisJICAgIHJzZXIgPSByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1JTRVIpOwkJCQorCSAgICAKKwkgICAgaWYgKHJzZXIgJiAweDA0KSB7CisJCSsrcHJpdi0+c3RhdHMucnhfZHJvcHBlZDsgCisJCSsrcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9yczsKKwkgICAgfQorCSAgICBpZiAocnNlciAmIDB4MDIpCisJCSsrcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzOworCQkJCisJICAgIC8qIENsZWFyIHRoZSBSeEVyciBiaXQgaW4gUlNFUi4gUlNFUis0IGlzIHRoZQorCSAgICAgKiB3cml0ZSBwYXJ0LiBBbHNvIGNsZWFyIHRoZSBSeENSQyAoMHgwNCkgYW5kIAorCSAgICAgKiBSeEJpZyAoMHgwMikgYml0cyBpZiBwcmVzZW50ICovCisJICAgIHdhaXRfV09DKGlvYmFzZSk7CisJICAgIHdyaXRlYigweDQwIHwgKHJzZXIgJiAweDA2KSwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19SU0VSICsgNCk7CisKKwkgICAgLyogV3JpdGUgYml0IDYgaGlnaCB0byBBU0NDIHRvIGNsZWFyIFJ4RXJyIGluIEFTUiwKKwkgICAgICogV09DIG11c3QgYmUgc2V0IGZpcnN0ISAKKwkgICAgICovCisJICAgIHdhaXRfV09DKGlvYmFzZSk7CisJICAgIHdyaXRlYigweDQwLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0FTQ0MpOworCisJICAgIC8qIFJlbWVtYmVyIHRvIGNvdW50IHVwIHByaXYtPnN0YXRzIG9uIGVycm9yIHBhY2tldHMgKi8KKwkgICAgKytwcml2LT5zdGF0cy5yeF9lcnJvcnM7CisJfQorCS8qIFR4RE4gKi8KKwlpZiAoc3RhdHVzICYgMHgyMCkgeworCSAgICBpbnQgdHhTdGF0dXM7CisKKwkgICAgdHhTdGF0dXMgPSByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1RTRVIpOworCSAgICBERUJVRygzLCAiVHJhbnNtaXQgZG9uZS4gVFNFUiA9ICV4IGlkICV4XG4iLCAKKwkJICB0eFN0YXR1cywgcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19UU0VSICsgMSkpOworCSAgICAKKwkgICAgaWYgKHR4U3RhdHVzICYgMHgyMCkgeworCQkvKiBUcmFuc21pdHRpbmcgd2FzIG9rYXksIGNsZWFyIGJpdHMgKi8KKwkJd2FpdF9XT0MoaW9iYXNlKTsKKwkJd3JpdGViKDB4MmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVFNFUiArIDQpOworCQkrK3ByaXYtPnN0YXRzLnR4X3BhY2tldHM7CisJICAgIH0KKwkJCQorCSAgICBpZiAodHhTdGF0dXMgJiAweGQwKSB7CisJCWlmICh0eFN0YXR1cyAmIDB4ODApIHsKKwkJICAgICsrcHJpdi0+c3RhdHMuY29sbGlzaW9uczsgLyogQmVjYXVzZSBvZiAvcHJvYy9uZXQvZGV2Ki8KKwkJICAgIC8qICsrcHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnM7ICovCisJCSAgICAvKiBwcmludGsoIkNvbGxpc2lvbi4gJWxkXG4iLCBqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydCk7ICovCisJCX0KKwkJaWYgKHR4U3RhdHVzICYgMHg0MCkgCisJCSAgICArK3ByaXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzOworCQkvKiAweDgwIFR4R1UgVHJhbnNtaXQgZ2l2ZXVwIC0gbmluZSB0aW1lcyBhbmQgbm8gbHVjaworCQkgKiAweDQwIFR4Tk9BUCBObyBhY2Nlc3MgcG9pbnQuIERpc2NhcmRlZCBwYWNrZXQuCisJCSAqIDB4MTAgVHhFcnIgVHJhbnNtaXQgZXJyb3IuIEFsd2F5cyBzZXQgd2hlbiAKKwkJICogICAgICBUeEdVIGFuZCBUeE5PQVAgaXMgc2V0LiAoVGhvc2UgYXJlIHRoZSBvbmx5IG9uZXMKKwkJICogICAgICB0byBzZXQgVHhFcnIpLgorCQkgKi8KKwkJREVCVUcoMywgIm5ldHdhdmVfaW50ZXJydXB0OiBUeEROIHdpdGggZXJyb3Igc3RhdHVzICV4XG4iLCAKKwkJICAgICAgdHhTdGF0dXMpOworCQkKKwkJLyogQ2xlYXIgb3V0IFR4R1UsIFR4Tk9BUCwgVHhFcnIgYW5kIFR4VHJ5cyAqLworCQl3YWl0X1dPQyhpb2Jhc2UpOworCQl3cml0ZWIoMHhkZiAmIHR4U3RhdHVzLCByYW1CYXNlK05FVFdBVkVfRVJFR19UU0VSKzQpOworCQkrK3ByaXYtPnN0YXRzLnR4X2Vycm9yczsKKwkgICAgfQorCSAgICBERUJVRygzLCAiTmV3IHN0YXR1cyBpcyBUU0VSICV4IEFTUiAleFxuIiwKKwkJICByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1RTRVIpLAorCQkgIGluYihpb2Jhc2UgKyBORVRXQVZFX1JFR19BU1IpKTsKKworCSAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCS8qIFR4QkEsIHRoaXMgd291bGQgdHJpZ2dlciBvbiBhbGwgZXJyb3IgcGFja2V0cyByZWNlaXZlZCAqLworCS8qIGlmIChzdGF0dXMgJiAweDAxKSB7CisJICAgREVCVUcoNCwgIlRyYW5zbWl0IGJ1ZmZlcnMgYXZhaWxhYmxlLCAleFxuIiwgc3RhdHVzKTsKKwkgICB9CisJICAgKi8KKyAgICB9CisgICAgLyogSGFuZGxlZCBpZiB3ZSBsb29wZWQgYXQgbGVhc3Qgb25lIHRpbWUgLSBKZWFuIElJICovCisgICAgcmV0dXJuIElSUV9SRVRWQUwoaSk7Cit9IC8qIG5ldHdhdmVfaW50ZXJydXB0ICovCisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX3dhdGNoZG9nIChhKQorICoKKyAqICAgIFdhdGNoZG9nIDogd2hlbiB3ZSBzdGFydCBhIHRyYW5zbWlzc2lvbiwgd2Ugc2V0IGEgdGltZXIgaW4gdGhlCisgKiAgICBrZXJuZWwuICBJZiB0aGUgdHJhbnNtaXNzaW9uIGNvbXBsZXRlLCB0aGlzIHRpbWVyIGlzIGRpc2FibGVkLiBJZgorICogICAgaXQgZXhwaXJlLCB3ZSByZXNldCB0aGUgY2FyZC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIG5ldHdhdmVfd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCisgICAgREVCVUcoMSwgIiVzOiBuZXR3YXZlX3dhdGNoZG9nOiB3YXRjaGRvZyB0aW1lciBleHBpcmVkXG4iLCBkZXYtPm5hbWUpOworICAgIG5ldHdhdmVfcmVzZXQoZGV2KTsKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9IC8qIG5ldHdhdmVfd2F0Y2hkb2cgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXR3YXZlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIHVwZGF0ZV9zdGF0cyhkZXYpOworCisgICAgREVCVUcoMiwgIm5ldHdhdmU6IFNQQ1EgJXggU1BVICV4IExJRiAleCBJU1BMUSAleCBNSFMgJXggcnh0eCAleCIKKwkgICIgJXggdHggJXggJXggJXggJXhcbiIsIAorCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUENRKSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BVKSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfTElGKSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfSVNQTFEpLAorCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19NSFMpLAorCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19FQyArIDB4ZSksCisJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0VDICsgMHhmKSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweDE4KSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweDE5KSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweDFhKSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweDFiKSk7CisKKyAgICByZXR1cm4gJnByaXYtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworICAgIC8vdW5zaWduZWQgbG9uZyBmbGFnczsKKy8qICAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOyAqLworCisgICAgLy9zcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKworLyogICAgcHJpdi0+c3RhdHMucnhfcGFja2V0cyA9IHJlYWRiKHByaXYtPnJhbUJhc2UgKyAweDE4ZSk7IAorICAgIHByaXYtPnN0YXRzLnR4X3BhY2tldHMgPSByZWFkYihwcml2LT5yYW1CYXNlICsgMHgxOGYpOyAqLworCisgICAgLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG5ldHdhdmVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKKyAgICBraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIHVfY2hhciByeFN0YXR1czsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKyAgICB1bnNpZ25lZCBpbnQgY3VyQnVmZmVyLAorCQlyY3ZMaXN0OworICAgIGludCByY3ZMZW47CisgICAgaW50IHRtcGNvdW50ID0gMDsKKyAgICBpbnQgZGF0YUNvdW50LCBkYXRhT2Zmc2V0OworICAgIGludCBpOworICAgIHVfY2hhciAqcHRyOworCQorICAgIERFQlVHKDMsICJ4aW53X3J4OiBSZWNlaXZpbmcgLi4uIFxuIik7CisKKyAgICAvKiBSZWNlaXZlIG1heCAxMCBwYWNrZXRzIGZvciBub3cuICovCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkvKiBBbnkgcGFja2V0cz8gKi8KKwl3YWl0X1dPQyhpb2Jhc2UpOworCXJ4U3RhdHVzID0gcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19SU0VSKTsJCQorCWlmICggISggcnhTdGF0dXMgJiAweDgwKSkgLyogTm8gbW9yZSBwYWNrZXRzICovCisJICAgIGJyZWFrOworCQkKKwkvKiBDaGVjayBpZiBtdWx0aWNhc3QvYnJvYWRjYXN0IG9yIG90aGVyICovCisJLyogbXVsdGljYXN0ID0gKHJ4U3RhdHVzICYgMHgyMCk7ICAqLworCQkKKwkvKiBUaGUgcmVjZWl2ZSBsaXN0IHBvaW50ZXIgYW5kIGxlbmd0aCBvZiB0aGUgcGFja2V0ICovCisJd2FpdF9XT0MoaW9iYXNlKTsKKwlyY3ZMZW4gID0gZ2V0X2ludDE2KCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX1JEUCk7CisJcmN2TGlzdCA9IGdldF91aW50MTYoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfUkRQICsgMik7CisJCQorCWlmIChyY3ZMZW4gPCAwKSB7CisJICAgIHByaW50ayhLRVJOX0RFQlVHICJuZXR3YXZlX3J4OiBSZWNlaXZlIHBhY2tldCB3aXRoIGxlbiAlZFxuIiwgCisJCSAgIHJjdkxlbik7CisJICAgIHJldHVybiAwOworCX0KKwkJCisJc2tiID0gZGV2X2FsbG9jX3NrYihyY3ZMZW4rNSk7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJICAgIERFQlVHKDEsICJuZXR3YXZlX3J4OiBDb3VsZCBub3QgYWxsb2NhdGUgYW4gc2tfYnVmZiBvZiAiCisJCSAgImxlbmd0aCAlZFxuIiwgcmN2TGVuKTsKKwkgICAgKytwcml2LT5zdGF0cy5yeF9kcm9wcGVkOyAKKwkgICAgLyogVGVsbCB0aGUgYWRhcHRlciB0byBza2lwIHRoZSBwYWNrZXQgKi8KKwkgICAgd2FpdF9XT0MoaW9iYXNlKTsKKwkgICAgd3JpdGViKE5FVFdBVkVfQ01EX1NSUCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworCSAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisJICAgIHJldHVybiAwOworCX0KKworCXNrYl9yZXNlcnZlKCBza2IsIDIpOyAgLyogQWxpZ24gSVAgb24gMTYgYnl0ZSAqLworCXNrYl9wdXQoIHNrYiwgcmN2TGVuKTsKKwlza2ItPmRldiA9IGRldjsKKworCS8qIENvcHkgcGFja2V0IGZyYWdtZW50cyB0byB0aGUgc2tiIGRhdGEgYXJlYSAqLworCXB0ciA9ICh1X2NoYXIqKSBza2ItPmRhdGE7CisJY3VyQnVmZmVyID0gcmN2TGlzdDsKKwl0bXBjb3VudCA9IDA7IAorCXdoaWxlICggdG1wY291bnQgPCByY3ZMZW4pIHsKKwkgICAgLyogR2V0IGxlbmd0aCBhbmQgb2Zmc2V0IG9mIGN1cnJlbnQgYnVmZmVyICovCisJICAgIGRhdGFDb3VudCAgPSBnZXRfdWludDE2KCByYW1CYXNlK2N1ckJ1ZmZlcisyKTsKKwkgICAgZGF0YU9mZnNldCA9IGdldF91aW50MTYoIHJhbUJhc2UrY3VyQnVmZmVyKzQpOworCQkKKwkgICAgY29weV9mcm9tX3BjKCBwdHIgKyB0bXBjb3VudCwKKwkJCSAgcmFtQmFzZStjdXJCdWZmZXIrZGF0YU9mZnNldCwgZGF0YUNvdW50KTsKKworCSAgICB0bXBjb3VudCArPSBkYXRhQ291bnQ7CisJCQorCSAgICAvKiBQb2ludCB0byBuZXh0IGJ1ZmZlciAqLworCSAgICBjdXJCdWZmZXIgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBjdXJCdWZmZXIpOworCX0KKwkKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJLyogUXVldWUgcGFja2V0IGZvciBuZXR3b3JrIGxheWVyICovCisJbmV0aWZfcngoc2tiKTsKKworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJjdkxlbjsKKworCS8qIEdvdCB0aGUgcGFja2V0LCB0ZWxsIHRoZSBhZGFwdGVyIHRvIHNraXAgaXQgKi8KKwl3YWl0X1dPQyhpb2Jhc2UpOworCXdyaXRlYihORVRXQVZFX0NNRF9TUlAsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKwl3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisJREVCVUcoMywgIlBhY2tldCByZWNlcHRpb24gb2tcbiIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXR3YXZlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZwcml2LT5saW5rOworCisgICAgREVCVUcoMSwgIm5ldHdhdmVfb3Blbjogc3RhcnRpbmcuXG4iKTsKKyAgICAKKyAgICBpZiAoIURFVl9PSyhsaW5rKSkKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIGxpbmstPm9wZW4rKzsKKworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgbmV0d2F2ZV9yZXNldChkZXYpOworCQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldHdhdmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZwcml2LT5saW5rOworCisgICAgREVCVUcoMSwgIm5ldHdhdmVfY2xvc2U6IGZpbmlzaGluZy5cbiIpOworCisgICAgbGluay0+b3Blbi0tOworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgbmV0d2F2ZV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJuZXR3YXZlX2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gbmV0d2F2ZV9hdHRhY2gsCisJLmRldGFjaAkJPSBuZXR3YXZlX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmV0d2F2ZV9jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZuZXR3YXZlX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25ldHdhdmVfY3Modm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJm5ldHdhdmVfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmV0d2F2ZV9jcyk7Cittb2R1bGVfZXhpdChleGl0X25ldHdhdmVfY3MpOworCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAgIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgICBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAgIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLCBhbmQgZG8KKyAgIGJlc3QtZWZmb3J0IGZpbHRlcmluZy4KKyAqLworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBfX2lvbWVtICogcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisgICAgdV9jaGFyICByY3ZNb2RlID0gMDsKKyAgIAorI2lmZGVmIFBDTUNJQV9ERUJVRworICAgIGlmIChwY19kZWJ1ZyA+IDIpIHsKKwlzdGF0aWMgaW50IG9sZDsKKwlpZiAob2xkICE9IGRldi0+bWNfY291bnQpIHsKKwkgICAgb2xkID0gZGV2LT5tY19jb3VudDsKKwkgICAgREVCVUcoMCwgIiVzOiBzZXR0aW5nIFJ4IG1vZGUgdG8gJWQgYWRkcmVzc2VzLlxuIiwKKwkJICBkZXYtPm5hbWUsIGRldi0+bWNfY291bnQpOworCX0KKyAgICB9CisjZW5kaWYKKwkKKyAgICBpZiAoZGV2LT5tY19jb3VudCB8fCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkvKiBNdWx0aWNhc3QgTW9kZSAqLworCXJjdk1vZGUgPSByeENvbmZSeEVuYSArIHJ4Q29uZkFNUCArIHJ4Q29uZkJjYXN0OworICAgIH0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJLyogUHJvbWlzY291cyBtb2RlICovCisJcmN2TW9kZSA9IHJ4Q29uZlJ4RW5hICsgcnhDb25mUHJvICsgcnhDb25mQU1QICsgcnhDb25mQmNhc3Q7CisgICAgfSBlbHNlIHsKKwkvKiBOb3JtYWwgbW9kZSAqLworCXJjdk1vZGUgPSByeENvbmZSeEVuYSArIHJ4Q29uZkJjYXN0OworICAgIH0KKwkKKyAgICAvKiBwcmludGsoIm5ldHdhdmUgc2V0X211bHRpY2FzdF9saXN0OiByY3ZNb2RlIHRvICV4XG4iLCByY3ZNb2RlKTsqLworICAgIC8qIE5vdyBzZXQgcmVjZWl2ZSBtb2RlICovCisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfU1JDLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisgICAgd3JpdGViKHJjdk1vZGUsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7Cit9CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhMzI0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYwpAQCAtMCwwICsxLDQyNDMgQEAKKy8qIG9yaW5vY28uYyAtIChmb3JtZXJseSBrbm93biBhcyBkbGR3ZF9jcy5jIGFuZCBvcmlub2NvX2NzLmMpCisgKgorICogQSBkcml2ZXIgZm9yIEhlcm1lcyBvciBQcmlzbSAyIGNoaXBzZXQgYmFzZWQgUENNQ0lBIHdpcmVsZXNzCisgKiBhZGFwdG9ycywgd2l0aCBMdWNlbnQvQWdlcmUsIEludGVyc2lsIG9yIFN5bWJvbCBmaXJtd2FyZS4KKyAqCisgKiBDdXJyZW50IG1haW50YWluZXJzIChhcyBvZiAyOSBTZXB0ZW1iZXIgMjAwMykgYXJlOgorICogCVBhdmVsIFJvc2tpbiA8cHJvc2tpIEFUIGdudS5vcmc+CisgKiBhbmQJRGF2aWQgR2lic29uIDxoZXJtZXMgQVQgZ2lic29uLmRyb3BiZWFyLmlkLmF1PgorICoKKyAqIChDKSBDb3B5cmlnaHQgRGF2aWQgR2lic29uLCBJQk0gQ29ycG9yYXRpb24gMjAwMS0yMDAzLgorICogQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEdpYnNvbiwgTGludXhjYXJlIEF1c3RyYWxpYS4KKyAqCVdpdGggc29tZSBoZWxwIGZyb20gOgorICogQ29weXJpZ2h0IChDKSAyMDAxIEplYW4gVG91cnJpbGhlcywgSFAgTGFicworICogQ29weXJpZ2h0IChDKSAyMDAxIEJlbmphbWluIEhlcnJlbnNjaG1pZHQKKyAqCisgKiBCYXNlZCBvbiBkdW1teV9jcy5jIDEuMjcgMjAwMC8wNi8xMiAyMToyNzoyNQorICoKKyAqIFBvcnRpb25zIGJhc2VkIG9uIHd2bGFuX2NzLmMgMS4wLjYsIENvcHlyaWdodCBBbmRyZWFzIE5ldWhhdXMgPGFuZHkKKyAqIEFUIGZhc3RhLmZoLWRvcnRtdW5kLmRlPgorICogICAgICBodHRwOi8vd3d3LnN0dWQuZmgtZG9ydG11bmQuZGUvfmFuZHkvd3ZsYW4vCisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgorICogY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKKyAqIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUKKyAqIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoZSBpbml0aWFsIGRldmVsb3BlciBvZiB0aGUgb3JpZ2luYWwgY29kZSBpcyBEYXZpZCBBLiBIaW5kcworICogPGRhaGluZHMgQVQgdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgRGF2aWQKKyAqIEEuIEhpbmRzIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gSGluZHMuICBBbGwgUmlnaHRzCisgKiBSZXNlcnZlZC4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQorICogYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIKKyAqIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkKKyAqIGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZAorICogb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlCisgKiBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuICAqLworCisvKgorICogdjAuMDEgLT4gdjAuMDIgLSAyMS8zLzIwMDEgLSBKZWFuIElJCisgKglvIEFsbG93IHRvIHVzZSByZWd1bGFyIGV0aFggZGV2aWNlIG5hbWUgaW5zdGVhZCBvZiBkbGR3ZFgKKyAqCW8gV2FybmluZyBvbiBJQlNTIHdpdGggRVNTSUQ9YW55IGZvciBmaXJtd2FyZSA2LjA2CisgKglvIFB1dCBwcm9wZXIgcmFuZ2UudGhyb3VnaHB1dCB2YWx1ZXMgKG9wdGltaXN0aWMpCisgKglvIElXU1BZIHN1cHBvcnQgKElPQ1RMIGFuZCBzdGF0IGdhdGhlciBpbiBSeCBwYXRoKQorICoJbyBBbGxvdyBzZXR0aW5nIGZyZXF1ZW5jeSBpbiBBZC1Ib2MgbW9kZQorICoJbyBEaXNhYmxlIFdFUCBzZXR0aW5nIGlmICFoYXNfd2VwIHRvIHdvcmsgb24gb2xkIGZpcm13YXJlCisgKglvIEZpeCB0eHBvd2VyIHJhbmdlCisgKglvIFN0YXJ0IGFkZGluZyBzdXBwb3J0IGZvciBTYW1zdW5nL0NvbXBhcSBmaXJtd2FyZQorICoKKyAqIHYwLjAyIC0+IHYwLjAzIC0gMjMvMy8yMDAxIC0gSmVhbiBJSQorICoJbyBTdGFydCBhZGRpbmcgU3ltYm9sIHN1cHBvcnQgLSBuZWVkIHRvIGNoZWNrIGFsbCB0aGF0CisgKglvIEZpeCBQcmlzbTIvU3ltYm9sIFdFUCB0byBhY2NlcHQgMTI4IGJpdHMga2V5cworICoJbyBBZGQgU3ltYm9sIFdFUCAoYWRkIGF1dGhlbnRpY2F0aW9uIHR5cGUpCisgKglvIEFkZCBQcmlzbTIvU3ltYm9sIHJhdGUKKyAqCW8gQWRkIFBNIHRpbWVvdXQgKGhvbGRvdmVyIGR1cmF0aW9uKQorICoJbyBFbmFibGUgIml3Y29uZmlnIGV0aDAga2V5IG9mZiIgYW5kIGZyaWVuZHMgKHRvZ2dsZSBmbGFncykKKyAqCW8gRW5hYmxlICJpd2NvbmZpZyBldGgwIHBvd2VyIHVuaWNhc3QvYWxsIiAodG9nZ2xlIGZsYWdzKQorICoJbyBUcnkgd2l0aCBhbiBJbnRlbCBjYXJkLiBJdCByZXBvcnQgZmlybXdhcmUgMS4wMSwgYmVoYXZlIGxpa2UKKyAqCSAgYW4gYW50aXF1YXRlZCBmaXJtd2FyZSwgaG93ZXZlciBvbiB3aW5kb3dzIGl0IHNheXMgMi4wMC4gWXVjayAhCisgKglvIFdvcmthcm91bmQgZmlybXdhcmUgYnVnIGluIGFsbG9jYXRlIGJ1ZmZlciAoSW50ZWwgMS4wMSkKKyAqCW8gRmluaXNoIGV4dGVybmFsIHJlbmFtaW5nIHRvIG9yaW5vY28uLi4KKyAqCW8gVGVzdGluZyB3aXRoIHZhcmlvdXMgV2F2ZWxhbiBmaXJtd2FyZXMKKyAqCisgKiB2MC4wMyAtPiB2MC4wNCAtIDMwLzMvMjAwMSAtIEplYW4gSUkKKyAqCW8gVXBkYXRlIHRvIFdpcmVsZXNzIDExIC0+IGFkZCByZXRyeSBsaW1pdC9saWZldGltZSBzdXBwb3J0CisgKglvIFRlc3RlZCB3aXRoIGEgRC1MaW5rIERXTCA2NTAgY2FyZCwgZmlsbCBpbiBmaXJtd2FyZSBzdXBwb3J0CisgKglvIFdhcm5pbmcgb24gVmNjIG1pc21hdGNoIChELUxpbmsgMy4zdiBjYXJkIGluIEx1Y2VudCA1diBvbmx5IHNsb3QpCisgKglvIEZpeGVkIHRoZSBQcmlzbTIgV0VQIGJ1Z3MgdGhhdCBJIGludHJvZHVjZWQgaW4gdjAuMDMgOi0oCisgKgkgIEl0IHdvcmtzIG9uIEQtTGluayAqb25seSogYWZ0ZXIgYSB0Y3BkdW1wLiBXZWlyZC4uLgorICoJICBBbmQgc3RpbGwgZG9lc24ndCB3b3JrIG9uIEludGVsIGNhcmQuIEdycnJyLi4uCisgKglvIFVwZGF0ZSB0aGUgbW9kZSBhZnRlciBhIHNldHBvcnQzCisgKglvIEFkZCBwcmVhbWJsZSBzZXR0aW5nIGZvciBTeW1ib2wgY2FyZHMgKG5vdCB5ZXQgZW5hYmxlZCkKKyAqCW8gRG9uJ3QgY29tcGxhaW4gYXMgbXVjaCBhYm91dCBTeW1ib2wgY2FyZHMuLi4KKyAqCisgKiB2MC4wNCAtPiB2MC4wNGIgLSAyMi80LzIwMDEgLSBEYXZpZCBHaWJzb24KKyAqICAgICAgbyBSZW1vdmVkIHRoZSAnZXRoJyBwYXJhbWV0ZXIgLSBhbHdheXMgdXNlIGV0aFhYIGFzIHRoZQorICogICAgICAgIGludGVyZmFjZSBuYW1lIGluc3RlYWQgb2YgZGxkd2RYWC4gIFRoZSBvdGhlciB3YXMgcmFjeQorICogICAgICAgIGFueXdheS4KKyAqCW8gQ2xlYW4gdXAgUklEIGRlZmluaXRpb25zIGluIGhlcm1lcy5oLCBvdGhlciBjbGVhbnVwcworICoKKyAqIHYwLjA0YiAtPiB2MC4wNGMgLSAyNC80LzIwMDEgLSBKZWFuIElJCisgKglvIFRpbSBIdXJsZXkgPHRpbXN0ZXIgQVQgc2Vpa2kuYmxpenRlY2guY29tPiByZXBvcnRlZCBhIEQtTGluayBjYXJkCisgKgkgIHdpdGggdmVuZG9yIDAyIGFuZCBmaXJtd2FyZSAwLjA4LiBBZGRlZCBpbiB0aGUgY2FwYWJpbGl0aWVzLi4uCisgKglvIFRlc3RlZCBMdWNlbnQgZmlybXdhcmUgNy4yOCwgZXZlcnl0aGluZyB3b3Jrcy4uLgorICoKKyAqIHYwLjA0YyAtPiB2MC4wNSAtIDMvNS8yMDAxIC0gQmVuamFtaW4gSGVycmVuc2NobWlkdAorICoJbyBTcGluLW9mZiBQY21jaWEgY29kZS4gVGhpcyBmaWxlIGlzIHJlbmFtZWQgb3Jpbm9jby5jLAorICoJICBhbmQgb3Jpbm9jb19jcy5jIG5vdyBjb250YWlucyBvbmx5IHRoZSBQY21jaWEgc3BlY2lmaWMgc3R1ZmYKKyAqCW8gQWRkIEFpcnBvcnQgZHJpdmVyIHN1cHBvcnQgb24gdG9wIG9mIG9yaW5vY28uYyAoc2VlIGFpcnBvcnQuYykKKyAqCisgKiB2MC4wNSAtPiB2MC4wNWEgLSA0LzUvMjAwMSAtIEplYW4gSUkKKyAqCW8gUmV2ZXJ0IHRvIG9sZCBQY21jaWEgY29kZSB0byBmaXggYnJlYWthZ2Ugb2YgQmVuJ3MgY2hhbmdlcy4uLgorICoKKyAqIHYwLjA1YSAtPiB2MC4wNWIgLSA0LzUvMjAwMSAtIEplYW4gSUkKKyAqCW8gYWRkIG1vZHVsZSBwYXJhbWV0ZXIgJ2lnbm9yZV9jaXNfdmNjJyBmb3IgRC1MaW5rIEAgNVYKKyAqCW8gRC1MaW5rIGZpcm13YXJlIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aWNhc3QuIFdlIGp1c3QgcHJpbnQgYSBmZXcKKyAqCSAgZXJyb3IgbWVzc2FnZXMsIGJ1dCBvdGhlcndpc2UgZXZlcnl0aGluZyB3b3Jrcy4uLgorICoJbyBGb3IgRGF2aWQgOiBzZXQvZ2V0cG9ydDMgd29ya3MgZmluZSwganVzdCB1cGdyYWRlIGl3cHJpdi4uLgorICoKKyAqIHYwLjA1YiAtPiB2MC4wNWMgLSA1LzUvMjAwMSAtIEJlbmphbWluIEhlcnJlbnNjaG1pZHQKKyAqCW8gQWRhcHQgYWlycG9ydC5jIHRvIGxhdGVzdCBjaGFuZ2VzIGluIG9yaW5vY28uYworICoJbyBSZW1vdmUgZGVmZXJyZWQgcG93ZXIgZW5hYmxpbmcgY29kZQorICoKKyAqIHYwLjA1YyAtPiB2MC4wNWQgLSA1LzUvMjAwMSAtIEplYW4gSUkKKyAqCW8gV29ya2Fyb3VuZCB0byBTTkFQIGRlY2Fwc3VsYXRlIGZyYW1lIGZyb20gTGlua3N5cyBBUAorICoJICBvcmlnaW5hbCBwYXRjaCBmcm9tIDogRG9uZyBMaXUgPGRsaXUgQVQgcmVzZWFyY2guYmVsbC1sYWJzLmNvbT4KKyAqCSAgKG5vdGUgOiB0aGUgbWVtY21wIGJ1ZyB3YXMgbWluZSAtIGZpeGVkKQorICoJbyBSZW1vdmUgc2V0X3JldHJ5IHN0dWZmLCBubyBmaXJtd2FyZSBzdXBwb3J0IGl0IChibG9hdC0tKS4KKyAqCisgKiB2MC4wNWQgLT4gdjAuMDYgLSAyNS81LzIwMDEgLSBKZWFuIElJCisgKgkJT3JpZ2luYWwgcGF0Y2ggZnJvbSAiSG9uZyBMaW4iIDxhbGluIEFUIHJlZGhhdC5jb20+LAorICoJCSJJYW4gS2lubmVyIiA8aWtpbm5lciBBVCByZWRoYXQuY29tPgorICoJCWFuZCAiRGF2aWQgU21pdGgiIDxkc21pdGggQVQgcmVkaGF0LmNvbT4KKyAqCW8gSW5pdCBvZiBwcml2LT50eF9yYXRlX2N0cmwgaW4gZmlybXdhcmUgc3BlY2lmaWMgc2VjdGlvbi4KKyAqCW8gUHJpc20yL1N5bWJvbCByYXRlLCB1cHRvIHNob3VsZCBiZSAweEYgYW5kIG5vdCAweDE1LiBEb2ggIQorICoJbyBTcGVjdHJ1bSBjYXJkIGFsd2F5cyBuZWVkIGNvcl9yZXNldCAoZm9yIGV2ZXJ5IHJlc2V0KQorICoJbyBGaXggY29yX3Jlc2V0IHRvIG5vdCBsb3NlIGJpdCA3IGluIHRoZSByZWdpc3RlcgorICoJbyBmbHVzaF9zdGFsZV9saW5rcyB0byByZW1vdmUgem9tYmllIFBjbWNpYSBpbnN0YW5jZXMKKyAqCW8gQWNrIHByZXZpb3VzIGhlcm1lcyBldmVudCBiZWZvcmUgcmVzZXQKKyAqCQlNZSAod2l0aCBteSBsaXR0bGUgaGFuZHMpCisgKglvIEFsbG93IG9yaW5vY28uYyB0byBjYWxsIGNvcl9yZXNldCB2aWEgcHJpdi0+Y2FyZF9yZXNldF9oYW5kbGVyCisgKglvIEFkZCBwcml2LT5uZWVkX2NhcmRfcmVzZXQgdG8gdG9nZ2xlIHRoaXMgZmVhdHVyZQorICoJbyBGaXggdmFyaW91cyBidWdsZXRzIHdoZW4gc2V0dGluZyBXRVAgaW4gU3ltYm9sIGZpcm13YXJlCisgKgkgIE5vdywgZW5jcnlwdGlvbiBpcyBmdWxseSBmdW5jdGlvbmFsIG9uIFN5bWJvbCBjYXJkcy4gWW91cGkgIQorICoKKyAqIHYwLjA2IC0+IHYwLjA2YiAtIDI1LzUvMjAwMSAtIEplYW4gSUkKKyAqCW8gSUJTUyBvbiBTeW1ib2wgdXNlIHBvcnRfbW9kZSA9IDQuIFBsZWFzZSBkb24ndCBhc2suLi4KKyAqCisgKiB2MC4wNmIgLT4gdjAuMDZjIC0gMjkvNS8yMDAxIC0gSmVhbiBJSQorICoJbyBTaG93IGZpcnN0IHNweSBhZGRyZXNzIGluIC9wcm9jL25ldC93aXJlbGVzcyBmb3IgSUJTUyBtb2RlIGFzIHdlbGwKKyAqCisgKiB2MC4wNmMgLT4gdjAuMDZkIC0gNi83LzIwMDEgLSBEYXZpZCBHaWJzb24KKyAqICAgICAgbyBDaGFuZ2UgYSBidW5jaCBvZiBLRVJOX0lORk8gbWVzc2FnZXMgdG8gS0VSTl9ERUJVRywgYXMgcGVyIExpbnVzJworICogICAgICAgIHdpc2hlcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiB1bm5lY2Vzc2FyeSBtZXNzYWdlcy4KKyAqCW8gUmVtb3ZlZCBib2d1cyBtZXNzYWdlIG9uIENSQyBlcnJvci4KKyAqCW8gTWVyZ2VkIGZpeGVzIGZvciB2MC4wOCBQcmlzbSAyIGZpcm13YXJlIGZyb20gV2lsbGlhbSBXYWdob3JuCisgKgkgIDx3aWxsd2FnaG9ybiBBVCB5YWhvby5jby51az4KKyAqCW8gU2xpZ2h0IGNsZWFudXAvcmUtYXJyYW5nZW1lbnQgb2YgZmlybXdhcmUgZGV0ZWN0aW9uIGNvZGUuCisgKgorICogdjAuMDZkIC0+IHYwLjA2ZSAtIDEvOC8yMDAxIC0gRGF2aWQgR2lic29uCisgKglvIFJlbW92ZWQgc29tZSByZWR1bmRhbnQgZ2xvYmFsIGluaXRpYWxpemVycyAob3Jpbm9jb19jcy5jKS4KKyAqCW8gQWRkZWQgc29tZSBtb2R1bGUgbWV0YWRhdGEKKyAqCisgKiB2MC4wNmUgLT4gdjAuMDZmIC0gMTQvOC8yMDAxIC0gRGF2aWQgR2lic29uCisgKglvIFdvcmRpbmcgZml4IHRvIGxpY2Vuc2UKKyAqCW8gQWRkZWQgYSAndXNlX2FsdGVybmF0ZV9lbmNhcHMnIG1vZHVsZSBwYXJhbWV0ZXIgZm9yIEFQcyB3aGljaCBuZWVkIGFuCisgKgkgIG91aSBvZiAwMDowMDowMC4gIFdlIHJlYWxseSBuZWVkIGEgYmV0dGVyIHdheSBvZiBoYW5kbGluZyB0aGlzLCBidXQKKyAqCSAgdGhlIG1vZHVsZSBmbGFnIGlzIGJldHRlciB0aGFuIG5vdGhpbmcgZm9yIG5vdy4KKyAqCisgKiB2MC4wNmYgLT4gdjAuMDcgLSAyMC84LzIwMDEgLSBEYXZpZCBHaWJzb24KKyAqCW8gUmVtb3ZlZCBCQVAgZXJyb3IgcmV0cmllcyBmcm9tIGhlcm1lc19iYXBfc2VlaygpLiAgRm9yIFR4IHdlIG5vdworICoJICBsZXQgdGhlIHVwcGVyIGxheWVycyBoYW5kbGUgdGhlIHJldHJ5LCB3ZSByZXRyeSBleHBsaWNpdGx5IGluIHRoZQorICoJICBSeCBwYXRoLCBidXQgZG9uJ3QgbWFrZSBhcyBtdWNoIG5vaXNlIGFib3V0IGl0LgorICoJbyBGaXJtd2FyZSBkZXRlY3Rpb24gY2xlYW51cHMuCisgKgorICogdjAuMDcgLT4gdjAuMDdhIC0gMS8xMC8zMDAxIC0gSmVhbiBJSQorICoJbyBBZGQgY29kZSB0byByZWFkIFN5bWJvbCBmaXJtd2FyZSByZXZpc2lvbiwgaW5zcGlyZWQgYnkgbGF0ZXN0IGNvZGUKKyAqCSAgaW4gU3BlY3RydW0yNCBieSBMZWUgSm9obiBLZXlzZXItQWxsZW4gLSBUaGFua3MgTGVlICEKKyAqCW8gVGhhbmtzIHRvIEphcmVkIFZhbGVudGluZSA8aGlkZGVuIEFUIHhtaXNzaW9uLmNvbT4gZm9yICJwcm92aWRpbmciIG1lCisgKgkgIGEgM0NvbSBjYXJkIHdpdGggYSByZWNlbnQgZmlybXdhcmUsIGZpbGwgb3V0IFN5bWJvbCBmaXJtd2FyZQorICoJICBjYXBhYmlsaXRpZXMgb2YgbGF0ZXN0IHJldiAoMi4yMCksIGFzIHdlbGwgYXMgb2xkZXIgU3ltYm9sIGNhcmRzLgorICoJbyBEaXNhYmxlIFBvd2VyIE1hbmFnZW1lbnQgaW4gbmV3ZXIgU3ltYm9sIGZpcm13YXJlLCB0aGUgQVBJIAorICoJICBoYXMgY2hhbmdlZCAoZG9jdW1lbnRhdGlvbiBuZWVkZWQpLgorICoKKyAqIHYwLjA3YSAtPiB2MC4wOCAtIDMvMTAvMjAwMSAtIERhdmlkIEdpYnNvbgorICoJbyBGaXhlZCBhIHBvc3NpYmxlIGJ1ZmZlciBvdmVycnVuIGZvdW5kIGJ5IHRoZSBTdGFuZm9yZCBjaGVja2VyIChpbgorICoJICBkbGR3ZF9pb2N0bF9zZXRpd2VuY29kZSgpKS4gIENhbiBvbmx5IGJlIGNhbGxlZCBieSByb290IGFueXdheSwgc28gbm90CisgKgkgIGEgYmlnIHByb2JsZW0uCisgKglvIFR1cm5lZCBoYXNfYmlnX3dlcCBvbiBmb3IgSW50ZXJzaWwgY2FyZHMuICBUaGF0J3Mgbm90IHRydWUgZm9yIGFsbCBvZgorICoJICB0aGVtIGJ1dCB3ZSBzaG91bGQgYXQgbGVhc3QgbGV0IHRoZSBjYXBhYmxlIG9uZXMgdHJ5LgorICoJbyBXYWl0IGZvciBCVVNZIHRvIGNsZWFyIGF0IHRoZSBiZWdpbm5pbmcgb2YgaGVybWVzX2JhcF9zZWVrKCkuICBJCisgKgkgIHJlYWxpemVkIHRoYXQgbXkgYXNzdW1wdGlvbiB0aGF0IHRoZSBkcml2ZXIncyBzZXJpYWxpemF0aW9uCisgKgkgIHdvdWxkIHByZXZlbnQgdGhlIEJBUCBiZWluZyBidXN5IG9uIGVudHJ5IHdhcyBwb3NzaWJseSBmYWxzZSwgYmVjYXVzZQorICoJICB0aGluZ3Mgb3RoZXIgdGhhbiBzZWVrcyBtYXkgbWFrZSB0aGUgQkFQIGJ1c3kuCisgKglvIFVzZSAiYWx0ZXJuYXRlIiAob3VpIDAwOjAwOjAwKSBlbmNhcHN1bGF0aW9uIGJ5IGRlZmF1bHQuCisgKgkgIFNldHRpbmcgdXNlX29sZF9lbmNhcHMgd2lsbCBtaW1pYyB0aGUgb2xkIGJlaGF2aW91ciwgYnV0IEkgdGhpbmsgd2UKKyAqCSAgd2lsbCBiZSBhYmxlIHRvIGVsaW1pbmF0ZSB0aGlzLgorICoJbyBEb24ndCB0cnkgdG8gbWFrZSBfX2luaXRkYXRhIGNvbnN0ICh0aGUgdmVyc2lvbiBzdHJpbmcpLiAgVGhpcyBjYW4ndAorICoJICB3b3JrIGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgX19pbml0ZGF0YSBzZWN0aW9uaW5nIHdvcmtzLgorICoJbyBBZGRlZCBNT0RVTEVfTElDRU5TRSB0YWdzLgorICoJbyBTdXBwb3J0IGZvciBQTFggKHRyYW5zcGFyZW50IFBDTUNJQS0+UENJIGJyaWRnZSkgY2FyZHMuCisgKglvIENoYW5nZWQgdG8gdXNpbmcgdGhlIG5ldyB0eXBlLWZhc2Npc3QgbWluL21heC4KKyAqCisgKiB2MC4wOCAtPiB2MC4wOGEgLSA5LzEwLzIwMDEgLSBEYXZpZCBHaWJzb24KKyAqCW8gSW5zZXJ0ZWQgc29tZSBtaXNzaW5nIGFja25vd2xlZGdlbWVudHMvaW5mbyBpbnRvIHRoZSBDaGFuZ2Vsb2cuCisgKglvIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgbm9ybWFsaXphdGlvbiBvZiBzaWduYWwgbGV2ZWwgcmVwb3J0aW5nLgorICoJbyBGaXhlZCBiYWQgYnVnIGluIFdFUCBrZXkgaGFuZGxpbmcgb24gSW50ZXJzaWwgYW5kIFN5bWJvbCBmaXJtd2FyZSwKKyAqCSAgd2hpY2ggbGVkIHRvIGFuIGluc3RhbnQgY3Jhc2ggb24gYmlnLWVuZGlhbiBtYWNoaW5lcy4KKyAqCisgKiB2MC4wOGEgLT4gdjAuMDhiIC0gMjAvMTEvMjAwMSAtIERhdmlkIEdpYnNvbgorICoJbyBMb3RzIG9mIGNsZWFudXAgYW5kIGJ1Z2ZpeGVzIGluIG9yaW5vY29fcGx4LmMKKyAqCW8gQ2xlYW51cCB0byBoYW5kbGluZyBvZiBUeCByYXRlIHNldHRpbmcuCisgKglvIFJlbW92ZWQgc3VwcG9ydCBmb3Igb2xkIGVuY2Fwc3VsYXRpb24gbWV0aG9kLgorICoJbyBSZW1vdmVkIG9sZCAiZGxkd2QiIG5hbWVzLgorICoJbyBTcGxpdCBSSUQgY29uc3RhbnRzIGludG8gYSBuZXcgZmlsZSBoZXJtZXNfcmlkLmgKKyAqCW8gUmVuYW1lZCBSSUQgY29uc3RhbnRzIHRvIG1hdGNoIGxpbnV4LXdsYW4tbmcgYW5kIHByaXNtMi5vCisgKglvIEJ1Z2ZpeGVzIGluIGhlcm1lcy5jCisgKglvIFBva2UgdGhlIFBMWCdzIElOVENTUiByZWdpc3Rlciwgc28gaXQgYWN0dWFsbHkgc3RhcnRzCisgKgkgIGdlbmVyYXRpbmcgaW50ZXJydXB0cy4gIFRoZXNlIGNhcmRzIG1pZ2h0IGFjdHVhbGx5IHdvcmsgbm93LgorICoJbyBVcGRhdGUgdG8gd2lyZWxlc3MgZXh0ZW5zaW9ucyB2MTIgKEplYW4gSUkpCisgKglvIFN1cHBvcnQgZm9yIHRhbGxpZXMgYW5kIGlucXVpcmUgY29tbWFuZCAoSmVhbiBJSSkKKyAqCW8gQWlycG9ydCB1cGRhdGVzIGZvciBuZXdlciBQUEMga2VybmVscyAoQmVuSCkKKyAqCisgKiB2MC4wOGIgLT4gdjAuMDkgLSAyMS8xMi8yMDAxIC0gRGF2aWQgR2lic29uCisgKglvIFNvbWUgbmV3IFBDSSBJRHMgZm9yIFBMWCBjYXJkcy4KKyAqCW8gUmVtb3ZlZCBicm9rZW4gYXR0ZW1wdCB0byBkbyBBTExNVUxUSSByZWNlcHRpb24uICBKdXN0IHVzZQorICoJICBwcm9taXNjdW91cyBtb2RlIGluc3RlYWQKKyAqCW8gUHJlbGltaW5hcnkgd29yayBmb3IgbGlzdC1BUCAoSmVhbiBJSSkKKyAqCW8gQWlycG9ydCB1cGRhdGVzIGZyb20gKEJlbkgpCisgKglvIEVsaW1pbmF0ZWQgcmFjeSBod19yZWFkeSBzdHVmZgorICoJbyBGaXhlZCBnZW5lcmF0aW9uIG9mIGZha2UgZXZlbnRzIGluIGlycSBoYW5kbGVyLiAgVGhpcyBzaG91bGQKKyAqCSAgZmluYWxseSBraWxsIHRoZSBFSU8gcHJvYmxlbXMgKEplYW4gSUkgJiBkZ2lic29uKQorICoJbyBGaXhlZCBicmVha2FnZSBvZiBiaXRyYXRlIHNldC9nZXQgb24gQWdlcmUgZmlybXdhcmUgKEplYW4gSUkpCisgKgorICogdjAuMDkgLT4gdjAuMDlhIC0gMi8xLzIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gRml4ZWQgc3R1cGlkIG1pc3Rha2UgaW4gbXVsdGljYXN0IGxpc3QgaGFuZGxpbmcsIHRyaWdnZXJpbmcKKyAqCSAgYSBCVUcoKQorICoKKyAqIHYwLjA5YSAtPiB2MC4wOWIgLSAxNi8xLzIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gRml4ZWQgZXZlbiBzdHVwaWRlciBtaXN0YWtlIGluIG5ldyBpbnRlcnJ1cHQgaGFuZGxpbmcsIHdoaWNoCisgKgkgIHNlcmlvdXNseSBicm9rZSB0aGluZ3Mgb24gYmlnLWVuZGlhbiBtYWNoaW5lcy4KKyAqCW8gUmVtb3ZlZCBhIGJ1bmNoIG9mIHJlZHVuZGFudCBpbmNsdWRlcyBhbmQgZXhwb3J0cy4KKyAqCW8gUmVtb3ZlZCBhIHJlZHVuZGFudCBNT0Rfe0lOQyxERUN9X1VTRV9DT1VOVCBwYWlyIGluIGFpcnBvcnQuYworICoJbyBEb24ndCBhdHRlbXB0IHRvIGRvIGhhcmR3YXJlIGxldmVsIG11bHRpY2FzdCByZWNlcHRpb24gb24KKyAqCSAgSW50ZXJzaWwgZmlybXdhcmUsIGp1c3QgZ28gcHJvbWlzYyBpbnN0ZWFkLgorICoJbyBUeXBvIGZpeGVkIGluIGhlcm1lc19pc3N1ZV9jbWQoKQorICoJbyBFbGltaW5hdGVkIFdJUkVMRVNTX1NQWSAjaWZkZWZzCisgKglvIFN0YXR1cyBjb2RlIHJlcG9ydGVkIG9uIFR4IGV4Y2VwdGlvbnMKKyAqCW8gTW92ZWQgbmV0aWZfd2FrZV9xdWV1ZSgpIGZyb20gQUxMT0MgaW50ZXJydXB0cyB0byBUWCBhbmQgVFhFWEMKKyAqCSAgaW50ZXJydXB0cywgd2hpY2ggc2hvdWxkIGZpeCB0aGUgdGltZW91dHMgd2UncmUgc2VlaW5nLgorICoKKyAqIHYwLjA5YiAtPiB2MC4xMCAtIDI1IEZlYiAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIFJlbW92ZWQgbmVzdGVkIHN0cnVjdHVyZXMgdXNlZCBmb3IgaGVhZGVyIHBhcnNpbmcsIHNvIHRoZQorICoJICBkcml2ZXIgc2hvdWxkIG5vdyB3b3JrIHdpdGhvdXQgaGFja2VyeSBvbiBBUk0KKyAqCW8gRml4IGZvciBXRVAgaGFuZGxpbmcgb24gSW50ZXJzaWwgKEhhd2sgTmV3dG9uKQorICoJbyBFbGltaW5hdGVkIHRoZSAvcHJvYy9oZXJtZXMvZXRoWFgvcmVncyBkZWJ1Z2dpbmcgZmlsZS4gIEl0CisgKgkgIHdhcyBuZXZlciB2ZXJ5IHVzZWZ1bC4KKyAqCW8gTWFrZSBSeCBlcnJvcnMgbGVzcyBub2lzeS4KKyAqCisgKiB2MC4xMCAtPiB2MC4xMSAtIDUgQXByIDIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gTGFpZCB0aGUgZ3JvdW5kd29yayBpbiBoZXJtZXMuW2NoXSBmb3IgZGV2aWNlcyB3aGljaCBtYXAKKyAqCSAgaW50byBQQ0kgbWVtb3J5IHNwYWNlIHJhdGhlciB0aGFuIElPIHNwYWNlLgorICoJbyBGaXhlZCBidWcgaW4gbXVsdGljYXN0IGhhbmRsaW5nIChjbGVhcmVkIG11bHRpY2FzdCBsaXN0IHdoZW4KKyAqCSAgbGVhdmluZyBwcm9taXNjdW91cyBtb2RlKS4KKyAqCW8gUmVsZWdhdGVkIFR4IGVycm9yIG1lc3NhZ2VzIHRvIGRlYnVnLgorICoJbyBDbGVhbmVkIHVwIC8gY29ycmVjdGVkIGhhbmRsaW5nIG9mIGFsbG9jYXRpb24gbGVuZ3Rocy4KKyAqCW8gU2V0IE9XTlNTSUQgaW4gSUJTUyBtb2RlIGZvciBXaW5YUCBpbnRlcm9wZXJhYmlsaXR5IChqaW1jKS4KKyAqCW8gQ2hhbmdlIHRvIHVzaW5nIGFsbG9jX2V0aGVyZGV2KCkgZm9yIHN0cnVjdHVyZSBhbGxvY2F0aW9ucy4gCisgKglvIENoZWNrIGZvciBhbmQgZHJvcCB1bmRlcnNpemVkIHBhY2tldHMuCisgKglvIEZpeGVkIGEgcmFjZSBpbiBzdG9wcGluZy93YWtpbmcgdGhlIHF1ZXVlLiAgVGhpcyBzaG91bGQgZml4CisgKgkgIHRoZSB0aW1lb3V0IHByb2JsZW1zIChQYXZlbCBSb3NraW4pCisgKglvIFJldmVydGVkIHRvIG5ldGlmX3dha2VfcXVldWUoKSBvbiB0aGUgQUxMT0MgZXZlbnQuCisgKglvIEZpeGVzIGZvciByZWNlbnQgU3ltYm9sIGZpcm13YXJlcyB3aGljaCBsYWNrIEFQIGRlbnNpdHkKKyAqCSAgKFBhdmVsIFJvc2tpbikuCisgKgorICogdjAuMTEgLT4gdjAuMTFhIC0gMjkgQXByIDIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gSGFuZGxlIGRpZmZlcmVudCByZWdpc3RlciBzcGFjaW5nLCBuZWNlc3NhcnkgZm9yIFByaXNtIDIuNQorICoJICBQQ0kgYWRhcHRvcnMgKFN0ZXZlIEhpbGwpLgorICoJbyBDbGVhbmVkIHVwIGluaXRpYWxpemF0aW9uIG9mIGNhcmQgc3RydWN0dXJlcyBpbiBvcmlub2NvX2NzCisgKgkgIGFuZCBhaXJwb3J0LiAgUmVtb3ZlZCBjYXJkLT5wcml2IGZpZWxkLgorICoJbyBNYWtlIHJlc3BvbnNlIHN0cnVjdHVyZSBvcHRpb25hbCBmb3IgaGVybWVzX2RvY21kX3dhaXQoKQorICoJICBQYXZlbCBSb3NraW4pCisgKglvIEFkZGVkIFBDSSBpZCBmb3IgTm9ydGVsIGVtb2JpbGl0eSB0byBvcmlub2NvX3BseC5jLgorICoJbyBDbGVhbnVwIHRvIGhhbmRsaW5nIG9mIFN5bWJvbCdzIGFsbG9jYXRpb24gYnVnLiAoUGF2ZWwgUm9za2luKQorICoJbyBDbGVhbnVwcyB0byBmaXJtd2FyZSBjYXBhYmlsaXR5IGRldGVjdGlvbi4KKyAqCW8gQXJyYW5nZSBmb3Igb3Jpbm9jb19wY2kuYyB0byBvdmVycmlkZSBmaXJtd2FyZSBkZXRlY3Rpb24uCisgKgkgIFdlIHNob3VsZCBiZSBhYmxlIHRvIHN1cHBvcnQgdGhlIFBDSSBJbnRlcnNpbCBjYXJkcyBub3cuCisgKglvIENsZWFudXAgaGFuZGxpbmcgb2YgcmVzZXRfY29yIGFuZCBoYXJkX3Jlc2V0IChQYXZlbCBSb3NraW4pLgorICoJbyBSZW1vdmUgZXJyb25lb3VzIHVzZSBvZiBVU0VSX0JBUCBpbiB0aGUgVHhFeGMgaGFuZGxlciAoSm91bmkKKyAqCSAgTWFsaW5lbikuCisgKglvIE1ha2VmaWxlIGNoYW5nZXMgZm9yIGJldHRlciBpbnRlZ3JhdGlvbiBpbnRvIERhdmlkIEhpbmRzCisgKgkgIHBjbWNpYS1jcyBwYWNrYWdlLgorICoKKyAqIHYwLjExYSAtPiB2MC4xMWIgLSAxIE1heSAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIEJldHRlciBlcnJvciByZXBvcnRpbmcgaW4gb3Jpbm9jb19wbHhfaW5pdF9vbmUoKQorICoJbyBGaXhlZCBtdWx0aXBsZSBiYWQga2ZyZWUoKSBidWdzIGludHJvZHVjZWQgYnkgdGhlCisgKgkgIGFsbG9jX29yaW5vY29kZXYoKSBjaGFuZ2VzLgorICoKKyAqIHYwLjExYiAtPiB2MC4xMiAtIDE5IEp1biAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIFN1cHBvcnQgY2hhbmdpbmcgdGhlIE1BQyBhZGRyZXNzLgorICoJbyBDb3JyZWN0IGRpc3BsYXkgb2YgSW50ZXJzaWwgZmlybXdhcmUgcmV2aXNpb24gbnVtYmVycy4KKyAqCW8gRW50aXJlbHkgcmV2aXNlZCBsb2NraW5nIHNjaGVtZS4gIFNob3VsZCBiZSBib3RoIHNpbXBsZXIgYW5kCisgKgkgICBiZXR0ZXIuCisgKglvIE1lcmdlZCBzb21lIGNvbW1vbiBjb2RlIGluIG9yaW5vY29fcGx4LCBvcmlub2NvX3BjaSBhbmQKKyAqCSAgYWlycG9ydCBieSBjcmVhdGluZyBvcmlub2NvX2RlZmF1bHRfe29wZW4sc3RvcCxyZXNldH0oKQorICoJICB3aGljaCBhcmUgdXNlZCBhcyB0aGUgZGV2LT5vcGVuLCBkZXYtPnN0b3AsIHByaXYtPnJlc2V0CisgKgkgIGNhbGxiYWNrcyBpZiBub25lIGFyZSBzcGVjaWZpZWQgd2hlbiBhbGxvY19vcmlub2NvZGV2KCkgaXMKKyAqCSAgY2FsbGVkLgorICoJbyBSZW1vdmVkIG9yaW5vY29fcGx4X2ludGVycnVwdCgpIGFuZCBvcmlub2NvX3BjaV9pbnRlcnJ1cHQoKS4KKyAqCSAgVGhleSBkaWRuJ3QgZG8gYW55dGhpbmcuCisgKgorICogdjAuMTIgLT4gdjAuMTJhIC0gNCBKdWwgMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBTb21lIHJlYXJyYW5nZW1lbnQgb2YgY29kZS4KKyAqCW8gTnVtZXJvdXMgZml4dXBzIHRvIGxvY2tpbmcgYW5kIHJlc3QgaGFuZGxpbmcsIHBhcnRpY3VsYXJseQorICoJICBmb3IgUENNQ0lBLgorICoJbyBUaGlzIGFsbG93cyBvcGVuIGFuZCBzdG9wIG5ldF9kZXZpY2UgbWV0aG9kcyB0byBiZSBpbgorICoJICBvcmlub2NvLmMgbm93LCByYXRoZXIgdGhhbiBpbiB0aGUgaW5pdCBtb2R1bGVzLgorICoJbyBJbiBvcmlub2NvX2NzLmMgbGluay0+cHJpdiBub3cgcG9pbnRzIHRvIHRoZSBzdHJ1Y3QKKyAqCSAgbmV0X2RldmljZSBub3QgdG8gdGhlIHN0cnVjdCBvcmlub2NvX3ByaXZhdGUuCisgKglvIEFkZGVkIGEgY2hlY2sgZm9yIHVuZGVyc2l6ZWQgU05BUCBmcmFtZXMsIHdoaWNoIGNvdWxkIGNhdXNlCisgKgkgIGNyYXNoZXMuCisgKgorICogdjAuMTJhIC0+IHYwLjEyYiAtIDExIEp1bCAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIEZpeCBody0+bnVtX2luaXQgdGVzdGluZyBjb2RlLCBzbyBudW1faW5pdCBpcyBhY3R1YWxseQorICoJICBpbmNyZW1lbnRlZC4KKyAqCW8gRml4IHZlcnkgc3R1cGlkIGJ1ZyBpbiBvcmlub2NvX2NzIHdoaWNoIGJyb2tlIGNvbXBpbGUgd2l0aAorICoJICBDT05GSUdfU01QLgorICoJbyBTcXVhc2hlZCBhIHdhcm5pbmcuCisgKgorICogdjAuMTJiIC0+IHYwLjEyYyAtIDI2IEp1bCAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIENoYW5nZSB0byBDOVggc3R5bGUgZGVzaWduYXRlZCBpbml0aWFsaXplcnMuCisgKglvIEFkZCBzdXBwb3J0IGZvciAzQ29tIEFpckNvbm5lY3QgUENJLgorICoJbyBObyBsb25nZXIgaWdub3JlIHRoZSBoYXJkX3Jlc2V0IGFyZ3VtZW50IHRvCisgKgkgIGFsbG9jX29yaW5vY29kZXYoKS4gIE9vcHMuCisgKgorICogdjAuMTJjIC0+IHYwLjEzYmV0YTEgLSAxMyBTZXAgMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBSZXZlcnQgdGhlIGJyb2tlbiAwLjEyKiBsb2NraW5nIHNjaGVtZSBhbmQgZ28gdG8gYSBuZXcgeWV0CisgKgkgIHNpbXBsZXIgc2NoZW1lLgorICoJbyBEbyBmaXJtd2FyZSByZXNldHMgb25seSBpbiBvcmlub2NvX2luaXQoKSBhbmQgd2hlbiB3YWtpbmcKKyAqCSAgdGhlIGNhcmQgZnJvbSBoYXJkIHNsZWVwLgorICoKKyAqIHYwLjEzYmV0YTEgLT4gdjAuMTMgLSAyNyBTZXAgMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBSZS1pbnRyb2R1Y2VkIGZ1bGwgcmVzZXRzICh2aWEgc2NoZWR1bGVfdGFzaygpKSBvbiBUeAorICoJICB0aW1lb3V0LgorICoKKyAqIHYwLjEzIC0+IHYwLjEzYSAtIDMwIFNlcCAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIE1pbm9yIGNsZWFudXBzIHRvIGluZm8gZnJhbWUgaGFuZGxpbmcuICBBZGQgYmFzaWMgc3VwcG9ydAorICoJICBmb3IgbGlua3N0YXR1cyBpbmZvIGZyYW1lcy4KKyAqCW8gSW5jbHVkZSByZXF1aXJlZCBrZXJuZWwgaGVhZGVycyBpbiBvcmlub2NvLmgsIHRvIGF2b2lkCisgKgkgIGNvbXBpbGUgcHJvYmxlbXMuCisgKgorICogdjAuMTNhIC0+IHYwLjEzYiAtIDEwIEZlYiAyMDAzIC0gRGF2aWQgR2lic29uCisgKglvIEltcGxlbWVudGVkIGhhcmQgcmVzZXQgZm9yIEFpcnBvcnQgY2FyZHMKKyAqCW8gRXhwZXJpbWVudGFsIHN1c3BlbmQvcmVzdW1lIGltcGxlbWVudGF0aW9uIGZvciBvcmlub2NvX3BjaQorICoJbyBBYm9saXNoZWQgL3Byb2MgZGVidWdnaW5nIHN1cHBvcnQsIHJlcGxhY2VkIHdpdGggYSBkZWJ1Z2dpbmcKKyAqCSAgaXdwcml2LiAgTm93IGl0J3MgdWdseSBhbmQgc2ltcGxlIGluc3RlYWQgb2YgdWdseSBhbmQgY29tcGxleC4KKyAqCW8gQnVnZml4IGluIGhlcm1lcy5jIGlmIHRoZSBmaXJtd2FyZSByZXR1cm5lZCBhIHJlY29yZCBsZW5ndGgKKyAqCSAgb2YgMCwgd2UgY291bGQgZ28gY2xvYmJlcmluZyBtZW1vcnkuCisgKglvIEJ1Z2ZpeCBpbiBvcmlub2NvX3N0b3AoKSAtIGl0IHVzZWQgdG8gZmFpbCBpZiBod191bmF2YWlsYWJsZQorICoJICB3YXMgc2V0LCB3aGljaCB3YXMgdXN1YWxseSB0cnVlIG9uIFBDTUNJQSBob3QgcmVtb3Zlcy4KKyAqIAlvIFRyYWNrIExJTktTVEFUVVMgbWVzc2FnZXMsIHNpbGVudGx5IGRyb3AgVHggcGFja2V0cyBiZWZvcmUKKyAqIAkgIHdlIGFyZSBjb25uZWN0ZWQgKGF2b2lkcyBjb25mdXNpbmcgdGhlIGZpcm13YXJlKSwgYW5kIG9ubHkKKyAqIAkgIGdpdmUgTElOS1NUQVRVUyBwcmludGsoKXMgaWYgdGhlIHN0YXR1cyBoYXMgY2hhbmdlZC4KKyAqCisgKiB2MC4xM2IgLT4gdjAuMTNjIC0gMTEgTWFyIDIwMDMgLSBEYXZpZCBHaWJzb24KKyAqCW8gQ2xlYW51cDogdXNlIGRldiBpbnN0ZWFkIG9mIHByaXYgaW4gdmFyaW91cyBwbGFjZXMuCisgKglvIEJ1ZyBmaXg6IERvbid0IFJlbGVhc2VDb25maWd1cmF0aW9uIG9uIFJFU0VUX1BIWVNJQ0FMIGV2ZW50CisgKgkgIGlmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSAoZHJpdmVyIGluaXRpYXRlZCkgaGFyZCByZXNldC4KKyAqCW8gQnVnIGZpeDogRVRIX1pMRU4gaXMgc3VwcG9zZWQgdG8gaW5jbHVkZSB0aGUgaGVhZGVyCisgKgkgIChEaW9ueXN1cyBCbGF6YWtpcyAmIE1hbmlzaCBLYXJpcikKKyAqCW8gQ29udmVydCB0byB1c2luZyB3b3JrcXVldWVzIGluc3RlYWQgb2YgdGFza3F1ZXVlcyAoYW5kCisgKgkgIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG1hY3JvcyBmb3IgcHJlIDIuNS40MSBrZXJuZWxzKS4KKyAqCW8gRHJvcCByZWR1bmRhbnQgKEkgdGhpbmsuLi4pIE1PRF97SU5DLERFQ31fVVNFX0NPVU5UIGluCisgKgkgIGFpcnBvcnQuYworICoJbyBOZXcgb3Jpbm9jb190bWQuYyBpbml0IG1vZHVsZSBmcm9tIEpvZXJnIERvcmNoYWluIGZvcgorICoJICBUTUQ3MTYwIGJhc2VkIFBDSSB0byBQQ01DSUEgYnJpZGdlcyAoc2ltaWxhciB0bworICoJICBvcmlub2NvX3BseC5jKS4KKyAqCisgKiB2MC4xM2MgLT4gdjAuMTNkIC0gMjIgQXByIDIwMDMgLSBEYXZpZCBHaWJzb24KKyAqCW8gTWFrZSBod191bmF2YWlsYWJsZSBhIGNvdW50ZXIsIHJhdGhlciB0aGFuIGp1c3QgYSBmbGFnLCB0aGlzCisgKgkgIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBzb21lIHJhY2VzIChzdWNoIGFzIGEgY2FyZCBiZWluZworICoJICByZW1vdmVkIGluIHRoZSBtaWRkbGUgb2Ygb3Jpbm9jb19yZXNldCgpLgorICoJbyBSZXN0b3JlIFJlbGVhc2UvUmVxdWVzdENvbmZpZ3VyYXRpb24gaW4gdGhlIFBDTUNJQSBldmVudCBoYW5kbGVyCisgKgkgIHdoZW4gZGVhbGluZyB3aXRoIGEgZHJpdmVyIGluaXRpYXRlZCBoYXJkIHJlc2V0LiAgVGhpcyBpcworICoJICBuZWNlc3NhcnkgdG8gcHJldmVudCBoYW5ncyBkdWUgdG8gYSBzcHVyaW91cyBpbnRlcnJ1cHQgd2hpbGUKKyAqCSAgdGhlIHJlc2V0IGlzIGluIHByb2dyZXNzLgorICoJbyBDbGVhciB0aGUgODAyLjExIGhlYWRlciB3aGVuIHRyYW5zbWl0dGluZywgZXZlbiB0aG91Z2ggd2UKKyAqCSAgZG9uJ3QgdXNlIGl0LiAgVGhpcyBmaXhlcyBhIGxvbmcgc3RhbmRpbmcgYnVnIG9uIHNvbWUKKyAqCSAgZmlybXdhcmVzLCB3aGljaCBzZWVtIHRvIGdldCBjb25mdXNlZCBpZiB0aGF0IGlzbid0IGRvbmUuCisgKglvIEJlIGxlc3MgZWFnZXIgdG8gZGUtZW5jYXBzdWxhdGUgU05BUCBmcmFtZXMsIG9ubHkgZG8gc28gaWYKKyAqCSAgdGhlIE9VSSBpcyAwMDowMDowMCBvciAwMDowMDpmOCwgbGVhdmUgb3RoZXJzIGFsb25lLiAgVGhlIG9sZAorICoJICBiZWhhdmlvdXIgYnJva2UgQ0RQIChDaXNjbyBEaXNjb3ZlcnkgUHJvdG9jb2wpLgorICoJbyBVc2UgZGV2IGluc3RlYWQgb2YgcHJpdiBmb3IgZnJlZV9pcnEoKSBhcyB3ZWxsIGFzCisgKgkgIHJlcXVlc3RfaXJxKCkgKG9vcHMpLgorICoJbyBBdHRlbXB0IHRvIHJlc2V0IHJhdGhlciB0aGFuIGdpdmluZyB1cCBpZiB3ZSBnZXQgdG9vIG1hbnkKKyAqCSAgSVJRcy4KKyAqCW8gQ2hhbmdlZCBzZW1hbnRpY3Mgb2YgX19vcmlub2NvX2Rvd24oKSBzbyBpdCBjYW4gYmUgY2FsbGVkCisgKgkgIHNhZmVseSB3aXRoIGh3X3VuYXZhaWxhYmxlIHNldC4gIEl0IGFsc28gbm93IGNsZWFycyB0aGUKKyAqCSAgbGlua3N0YXR1cyAoc2luY2Ugd2UncmUgZ29pbmcgdG8gaGF2ZSB0byByZWFzc29jaWF0ZSkuCisgKgorICogdjAuMTNkIC0+IHYwLjEzZSAtIDEyIE1heSAyMDAzIC0gRGF2aWQgR2lic29uCisgKglvIFN1cHBvcnQgZm9yIHBvc3QtMi41LjY4IHJldHVybiB2YWx1ZXMgZnJvbSBpcnEgaGFuZGxlci4KKyAqCW8gRml4ZWQgYnVnIHdoZXJlIHVuZGVybGVuZ3RoIHBhY2tldHMgd291bGQgYmUgZG91YmxlIGNvdW50ZWQKKyAqCSAgaW4gdGhlIHJ4X2Ryb3BwZWQgc3RhdGlzdGljcy4KKyAqCW8gUHJvdmlkZWQgYSBtb2R1bGUgcGFyYW1ldGVyIHRvIHN1cHByZXNzIGxpbmtzdGF0dXMgbWVzc2FnZXMuCisgKgorICogdjAuMTNlIC0+IHYwLjE0YWxwaGExIC0gMzAgU2VwIDIwMDMgLSBEYXZpZCBHaWJzb24KKyAqCW8gUmVwbGFjZWQgcHJpdi0+Y29ubmVjdGVkIGxvZ2ljIHdpdGggbmV0aWZfY2Fycmllcl9vbi9vZmYoKQorICoJICBjYWxscy4KKyAqCW8gUmVtb3ZlIGhhc19pYnNzX2FueSBhbmQgbmV2ZXIgc2V0IHRoZSBDUkVBVEVJQlNTIFJJRCB3aGVuCisgKgkgIHRoZSBFU1NJRCBpcyBlbXB0eS4gIFRvbyBtYW55IGZpcm13YXJlcyBicmVhayBpZiB3ZSBkby4KKyAqCW8gMi42IG1lcmdlczogUmVwbGFjZSBwZGV2LT5zbG90X25hbWUgd2l0aCBwY2lfbmFtZSgpLCByZW1vdmUKKyAqCSAgX19kZXZpbml0ZGF0YSBmcm9tIFBDSSBJRCB0YWJsZXMsIHVzZSBmcmVlX25ldGRldigpLgorICoJbyBFbmFibGVkIHNoYXJlZC1rZXkgYXV0aGVudGljYXRpb24gZm9yIEFnZXJlIGZpcm13YXJlIChmcm9tCisgKgkgIFJvYmVydCBKLiBNb29yZSA8Um9iZXJ0LkouTW9vcmUgQVQgYWxsYW5iYW5rLmNvbT4KKyAqCW8gTW92ZSBuZXRpZl93YWtlX3F1ZXVlKCkgKGJhY2spIHRvIHRoZSBUeCBjb21wbGV0aW9uIGZyb20gdGhlCisgKgkgIEFMTE9DIGV2ZW50LiAgVGhpcyBzZWVtcyB0byBwcmV2ZW50L21pdGlnYXRlIHRoZSByb2xsaW5nCisgKgkgIGVycm9yIC0xMTAgcHJvYmxlbXMgYXQgbGVhc3Qgb24gc29tZSBJbnRlcnNpbCBmaXJtd2FyZXMuCisgKgkgIFRoZW9yZXRpY2FsbHkgcmVkdWNlcyBwZXJmb3JtYW5jZSwgYnV0IEkgY2FuJ3QgbWVhc3VyZSBpdC4KKyAqCSAgUGF0Y2ggZnJvbSBBbmRyZXcgVHJpZGdlbGwgPHRyaWRnZSBBVCBzYW1iYS5vcmc+CisgKgorICogdjAuMTRhbHBoYTEgLT4gdjAuMTRhbHBoYTIgLSAyMCBPY3QgMjAwMyAtIERhdmlkIEdpYnNvbgorICoJbyBDb3JyZWN0bHkgdHVybiBvZmYgc2hhcmVkLWtleSBhdXRoZW50aWNhdGlvbiB3aGVuIHJlcXVlc3RlZAorICoJICAoYnVnZml4IGZyb20gUm9iZXJ0IEouIE1vb3JlKS4KKyAqCW8gQ29ycmVjdCBhaXJwb3J0IHNsZWVwIGludGVyZmFjZXMgZm9yIGN1cnJlbnQgMi42IGtlcm5lbHMuCisgKglvIEFkZCBjb2RlIGZvciBrZXkgY2hhbmdlIHdpdGhvdXQgZGlzYWJsaW5nL2VuYWJsaW5nIHRoZSBNQUMKKyAqCSAgcG9ydC4gIFRoaXMgaXMgc3VwcG9zZWQgdG8gYWxsb3cgODAyLjF4IHRvIHdvcmsgc2FuZWx5LCBidXQKKyAqCSAgZG9lc24ndCBzZWVtIHRvIHlldC4KKyAqCisgKiBUT0RPCisgKglvIE5ldyB3aXJlbGVzcyBleHRlbnNpb25zIEFQSSAocGF0Y2ggZnJvbSBNb3VzdGFmYQorICoJICBZb3Vzc2VmLCB1cGRhdGVkIGJ5IEppbSBDYXJ0ZXIgYW5kIFBhdmVsIFJvc2tpbikuCisgKglvIEhhbmRsZSBkZS1lbmNhcHN1bGF0aW9uIHdpdGhpbiBuZXR3b3JrIGxheWVyLCBwcm92aWRlIDgwMi4xMQorICoJICBoZWFkZXJzIChwYXRjaCBmcm9tIFRob21hcyAnRGVudCcgTWlybGFjaGVyKQorICoJbyBSRiBtb25pdG9yIG1vZGUgc3VwcG9ydAorICoJbyBGaXggcG9zc2libGUgcmFjZXMgaW4gU1BZIGhhbmRsaW5nLgorICoJbyBEaXNjb25uZWN0IHdpcmVsZXNzIGV4dGVuc2lvbnMgZnJvbSBmdW5kYW1lbnRhbCBjb25maWd1cmF0aW9uLgorICoJbyAobWF5YmUpIFNvZnR3YXJlIFdFUCBzdXBwb3J0IChwYXRjaCBmcm9tIFN0YW5vIE1lZHVuYSkuCisgKglvIChtYXliZSkgVXNlIG11bHRpcGxlIFR4IGJ1ZmZlcnMgLSBkcml2ZXIgaGFuZGxpbmcgcXVldWUKKyAqCSAgcmF0aGVyIHRoYW4gZmlybXdhcmUuCisgKi8KKworLyogTG9ja2luZyBhbmQgc3luY2hyb25pemF0aW9uOgorICoKKyAqIFRoZSBiYXNpYyBwcmluY2lwbGUgaXMgdGhhdCBldmVyeXRoaW5nIGlzIHNlcmlhbGl6ZWQgdGhyb3VnaCBhCisgKiBzaW5nbGUgc3BpbmxvY2ssIHByaXYtPmxvY2suICBUaGUgbG9jayBpcyB1c2VkIGluIHVzZXIsIGJoIGFuZCBpcnEKKyAqIGNvbnRleHQsIHNvIHdoZW4gdGFrZW4gb3V0c2lkZSBoYXJkaXJxIGNvbnRleHQgaXQgc2hvdWxkIGFsd2F5cyBiZQorICogdGFrZW4gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLiAgVGhlIGxvY2sgcHJvdGVjdHMgYm90aCB0aGUKKyAqIGhhcmR3YXJlIGFuZCB0aGUgc3RydWN0IG9yaW5vY29fcHJpdmF0ZS4KKyAqCisgKiBBbm90aGVyIGZsYWcsIHByaXYtPmh3X3VuYXZhaWxhYmxlIGluZGljYXRlcyB0aGF0IHRoZSBoYXJkd2FyZSBpcworICogdW5hdmFpbGFibGUgZm9yIGFuIGV4dGVuZGVkIHBlcmlvZCBvZiB0aW1lIChlLmcuIHN1c3BlbmRlZCwgb3IgaW4KKyAqIHRoZSBtaWRkbGUgb2YgYSBoYXJkIHJlc2V0KS4gIFRoaXMgZmxhZyBpcyBwcm90ZWN0ZWQgYnkgdGhlCisgKiBzcGlubG9jay4gIEFsbCBjb2RlIHdoaWNoIHRvdWNoZXMgdGhlIGhhcmR3YXJlIHNob3VsZCBjaGVjayB0aGUKKyAqIGZsYWcgYWZ0ZXIgdGFraW5nIHRoZSBsb2NrLCBhbmQgaWYgaXQgaXMgc2V0LCBnaXZlIHVwIG9uIHdoYXRldmVyCisgKiB0aGV5IGFyZSBkb2luZyBhbmQgZHJvcCB0aGUgbG9jayBhZ2Fpbi4gIFRoZSBvcmlub2NvX2xvY2soKQorICogZnVuY3Rpb24gaGFuZGxlcyB0aGlzIChpdCB1bmxvY2tzIGFuZCByZXR1cm5zIC1FQlVTWSBpZgorICogaHdfdW5hdmFpbGFibGUgaXMgbm9uLXplcm8pLgorICovCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgIm9yaW5vY28iCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgImhlcm1lcy5oIgorI2luY2x1ZGUgImhlcm1lc19yaWQuaCIKKyNpbmNsdWRlICJvcmlub2NvLmgiCisjaW5jbHVkZSAiaWVlZTgwMl8xMS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK01PRFVMRV9BVVRIT1IoIlBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+ICYgRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIEx1Y2VudCBPcmlub2NvLCBQcmlzbSBJSSBiYXNlZCBhbmQgc2ltaWxhciB3aXJlbGVzcyBjYXJkcyIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOworCisvKiBMZXZlbCBvZiBkZWJ1Z2dpbmcuIFVzZWQgaW4gdGhlIG1hY3JvcyBpbiBvcmlub2NvLmggKi8KKyNpZmRlZiBPUklOT0NPX0RFQlVHCitpbnQgb3Jpbm9jb19kZWJ1ZyA9IE9SSU5PQ09fREVCVUc7Cittb2R1bGVfcGFyYW0ob3Jpbm9jb19kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mob3Jpbm9jb19kZWJ1ZywgIkRlYnVnIGxldmVsIik7CitFWFBPUlRfU1lNQk9MKG9yaW5vY29fZGVidWcpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgc3VwcHJlc3NfbGlua3N0YXR1czsgLyogPSAwICovCittb2R1bGVfcGFyYW0oc3VwcHJlc3NfbGlua3N0YXR1cywgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN1cHByZXNzX2xpbmtzdGF0dXMsICJEb24ndCBsb2cgbGluayBzdGF0dXMgY2hhbmdlcyIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDb21waWxlIHRpbWUgY29uZmlndXJhdGlvbiBhbmQgY29tcGF0aWJpbGl0eSBzdHVmZiAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFdlIGRvIHRoaXMgdGhpcyB3YXkgdG8gYXZvaWQgaWZkZWZzIGluIHRoZSBhY3R1YWwgY29kZSAqLworI2lmZGVmIFdJUkVMRVNTX1NQWQorI2RlZmluZSBTUFlfTlVNQkVSKHByaXYpCShwcml2LT5zcHlfbnVtYmVyKQorI2Vsc2UKKyNkZWZpbmUgU1BZX05VTUJFUihwcml2KQkwCisjZW5kaWYgLyogV0lSRUxFU1NfU1BZICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVybmFsIGNvbnN0YW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBPUklOT0NPX01JTl9NVFUJCTI1NgorI2RlZmluZSBPUklOT0NPX01BWF9NVFUJCShJRUVFODAyXzExX0RBVEFfTEVOIC0gRU5DQVBTX09WRVJIRUFEKQorCisjZGVmaW5lIFNZTUJPTF9NQVhfVkVSX0xFTgkoMTQpCisjZGVmaW5lIFVTRVJfQkFQCQkwCisjZGVmaW5lIElSUV9CQVAJCQkxCisjZGVmaW5lIE1BWF9JUlFMT09QU19QRVJfSVJRCTEwCisjZGVmaW5lIE1BWF9JUlFMT09QU19QRVJfSklGRlkJKDIwMDAwL0haKSAvKiBCYXNlZCBvbiBhIGd1ZXN0aW1hdGUgb2YKKwkJCQkJICAgICogaG93IG1hbnkgZXZlbnRzIHRoZQorCQkJCQkgICAgKiBkZXZpY2UgY291bGQKKwkJCQkJICAgICogbGVnaXRpbWF0ZWx5IGdlbmVyYXRlICovCisjZGVmaW5lIFNNQUxMX0tFWV9TSVpFCQk1CisjZGVmaW5lIExBUkdFX0tFWV9TSVpFCQkxMworI2RlZmluZSBUWF9OSUNCVUZfU0laRV9CVUcJMTU4NQkJLyogQnVnIGluIFN5bWJvbCBmaXJtd2FyZSAqLworCisjZGVmaW5lIERVTU1ZX0ZJRAkJMHhGRkZGCisKKy8qI2RlZmluZSBNQVhfTVVMVElDQVNUKHByaXYpCShwcml2LT5maXJtd2FyZV90eXBlID09IEZJUk1XQVJFX1RZUEVfQUdFUkUgPyBcCisgIEhFUk1FU19NQVhfTVVMVElDQVNUIDogMCkqLworI2RlZmluZSBNQVhfTVVMVElDQVNUKHByaXYpCShIRVJNRVNfTUFYX01VTFRJQ0FTVCkKKworI2RlZmluZSBPUklOT0NPX0lOVEVOCSAJKEhFUk1FU19FVl9SWCB8IEhFUk1FU19FVl9BTExPQyBcCisJCQkJIHwgSEVSTUVTX0VWX1RYIHwgSEVSTUVTX0VWX1RYRVhDIFwKKwkJCQkgfCBIRVJNRVNfRVZfV1RFUlIgfCBIRVJNRVNfRVZfSU5GTyBcCisJCQkJIHwgSEVSTUVTX0VWX0lORkRST1AgKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEYXRhIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBmcmVxdWVuY3kgb2YgZWFjaCBjaGFubmVsIGluIE1IeiAqLworc3RhdGljIGNvbnN0IGxvbmcgY2hhbm5lbF9mcmVxdWVuY3lbXSA9IHsKKwkyNDEyLCAyNDE3LCAyNDIyLCAyNDI3LCAyNDMyLCAyNDM3LCAyNDQyLAorCTI0NDcsIDI0NTIsIDI0NTcsIDI0NjIsIDI0NjcsIDI0NzIsIDI0ODQKK307CisjZGVmaW5lIE5VTV9DSEFOTkVMUyBBUlJBWV9TSVpFKGNoYW5uZWxfZnJlcXVlbmN5KQorCisvKiBUaGlzIHRhYmxlcyBnaXZlcyB0aGUgYWN0dWFsIG1lYW5pbmdzIG9mIHRoZSBiaXRyYXRlIElEcyByZXR1cm5lZAorICogYnkgdGhlIGZpcm13YXJlLiAqLworc3RhdGljIHN0cnVjdCB7CisJaW50IGJpdHJhdGU7IC8qIGluIDEwMHMgb2Yga2lsb2JpdHMgKi8KKwlpbnQgYXV0b21hdGljOworCXUxNiBhZ2VyZV90eHJhdGVjdHJsOworCXUxNiBpbnRlcnNpbF90eHJhdGVjdHJsOworfSBiaXRyYXRlX3RhYmxlW10gPSB7CisJezExMCwgMSwgIDMsIDE1fSwgLyogRW50cnkgMCBpcyB0aGUgZGVmYXVsdCAqLworCXsxMCwgIDAsICAxLCAgMX0sCisJezEwLCAgMSwgIDEsICAxfSwKKwl7MjAsICAwLCAgMiwgIDJ9LAorCXsyMCwgIDEsICA2LCAgM30sCisJezU1LCAgMCwgIDQsICA0fSwKKwl7NTUsICAxLCAgNywgIDd9LAorCXsxMTAsIDAsICA1LCAgOH0sCit9OworI2RlZmluZSBCSVRSQVRFX1RBQkxFX1NJWkUgQVJSQVlfU0laRShiaXRyYXRlX3RhYmxlKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEYXRhIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBoZWFkZXJfc3RydWN0IHsKKwkvKiA4MDIuMyAqLworCXU4IGRlc3RbRVRIX0FMRU5dOworCXU4IHNyY1tFVEhfQUxFTl07CisJdTE2IGxlbjsKKwkvKiA4MDIuMiAqLworCXU4IGRzYXA7CisJdTggc3NhcDsKKwl1OCBjdHJsOworCS8qIFNOQVAgKi8KKwl1OCBvdWlbM107CisJdTE2IGV0aGVydHlwZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiA4MDIuMiBMTEMvU05BUCBoZWFkZXIgdXNlZCBmb3IgRXRoZXJuZXQgZW5jYXBzdWxhdGlvbiBvdmVyIDgwMi4xMSAqLwordTggZW5jYXBzX2hkcltdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworCisjZGVmaW5lIEVOQ0FQU19PVkVSSEVBRAkJKHNpemVvZihlbmNhcHNfaGRyKSArIDIpCisKK3N0cnVjdCBoZXJtZXNfcnhfZGVzY3JpcHRvciB7CisJdTE2IHN0YXR1czsKKwl1MzIgdGltZTsKKwl1OCBzaWxlbmNlOworCXU4IHNpZ25hbDsKKwl1OCByYXRlOworCXU4IHJ4ZmxvdzsKKwl1MzIgcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgaW50IF9fb3Jpbm9jb19wcm9ncmFtX3JpZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBfX29yaW5vY29fc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBvcmlub2NvX2RlYnVnX2R1bXBfcmVjcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BvcnRfdHlwZShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCXN3aXRjaCAocHJpdi0+aXdfbW9kZSkgeworCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJcHJpdi0+cG9ydF90eXBlID0gMTsKKwkJcHJpdi0+Y3JlYXRlaWJzcyA9IDA7CisJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJaWYgKHByaXYtPnByZWZlcl9wb3J0MykgeworCQkJcHJpdi0+cG9ydF90eXBlID0gMzsKKwkJCXByaXYtPmNyZWF0ZWlic3MgPSAwOworCQl9IGVsc2UgeworCQkJcHJpdi0+cG9ydF90eXBlID0gcHJpdi0+aWJzc19wb3J0OworCQkJcHJpdi0+Y3JlYXRlaWJzcyA9IDE7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBwcml2LT5pd19tb2RlIGluIHNldF9wb3J0X3R5cGUoKVxuIiwKKwkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGV2aWNlIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG9yaW5vY29fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJZXJyID0gX19vcmlub2NvX3VwKGRldik7CisKKwlpZiAoISBlcnIpCisJCXByaXYtPm9wZW4gPSAxOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBvcmlub2NvX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMDsKKworCS8qIFdlIG11c3RuJ3QgdXNlIG9yaW5vY29fbG9jaygpIGhlcmUsIGJlY2F1c2Ugd2UgbmVlZCB0byBiZQorCSAgIGFibGUgdG8gY2xvc2UgdGhlIGludGVyZmFjZSBldmVuIGlmIGh3X3VuYXZhaWxhYmxlIGlzIHNldAorCSAgIChlLmcuIGFzIHdlJ3JlIHJlbGVhc2VkIGFmdGVyIGEgUEMgQ2FyZCByZW1vdmFsKSAqLworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOworCisJcHJpdi0+b3BlbiA9IDA7CisKKwllcnIgPSBfX29yaW5vY29fZG93bihkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqb3Jpbm9jb19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlyZXR1cm4gJnByaXYtPnN0YXRzOworfQorCitzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKm9yaW5vY29fZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBpd19zdGF0aXN0aWNzICp3c3RhdHMgPSAmcHJpdi0+d3N0YXRzOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoISBuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBnZXRfd2lyZWxlc3Nfc3RhdHMoKSBjYWxsZWQgd2hpbGUgZGV2aWNlIG5vdCBwcmVzZW50XG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIE5VTEw7IC8qIEZJWE1FOiBDYW4gd2UgZG8gYmV0dGVyIHRoYW4gdGhpcz8gKi8KKwl9CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIE5VTEw7ICAvKiBGSVhNRTogRXJnLCB3ZSd2ZSBiZWVuIHNpZ25hbGxlZCwgaG93CisJCQkgICAgICAgKiBkbyB3ZSBwcm9wYWdhdGUgdGhpcyBiYWNrIHVwPyAqLworCisJaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQltZW1zZXQoJndzdGF0cy0+cXVhbCwgMCwgc2l6ZW9mKHdzdGF0cy0+cXVhbCkpOworCQkvKiBJZiBhIHNweSBhZGRyZXNzIGlzIGRlZmluZWQsIHdlIHJlcG9ydCBzdGF0cyBvZiB0aGUKKwkJICogZmlyc3Qgc3B5IGFkZHJlc3MgLSBKZWFuIElJICovCisJCWlmIChTUFlfTlVNQkVSKHByaXYpKSB7CisJCQl3c3RhdHMtPnF1YWwucXVhbCA9IHByaXYtPnNweV9zdGF0WzBdLnF1YWw7CisJCQl3c3RhdHMtPnF1YWwubGV2ZWwgPSBwcml2LT5zcHlfc3RhdFswXS5sZXZlbDsKKwkJCXdzdGF0cy0+cXVhbC5ub2lzZSA9IHByaXYtPnNweV9zdGF0WzBdLm5vaXNlOworCQkJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSBwcml2LT5zcHlfc3RhdFswXS51cGRhdGVkOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IHsKKwkJCXUxNiBxdWFsLCBzaWduYWwsIG5vaXNlOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBjcTsKKworCQllcnIgPSBIRVJNRVNfUkVBRF9SRUNPUkQoaHcsIFVTRVJfQkFQLAorCQkJCQkgSEVSTUVTX1JJRF9DT01NU1FVQUxJVFksICZjcSk7CisJCQorCQl3c3RhdHMtPnF1YWwucXVhbCA9IChpbnQpbGUxNl90b19jcHUoY3EucXVhbCk7CisJCXdzdGF0cy0+cXVhbC5sZXZlbCA9IChpbnQpbGUxNl90b19jcHUoY3Euc2lnbmFsKSAtIDB4OTU7CisJCXdzdGF0cy0+cXVhbC5ub2lzZSA9IChpbnQpbGUxNl90b19jcHUoY3Eubm9pc2UpIC0gMHg5NTsKKwkJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSA3OworCX0KKworCS8qIFdlIGNhbid0IHJlYWxseSB3YWl0IGZvciB0aGUgdGFsbGllcyBpbnF1aXJ5IGNvbW1hbmQgdG8KKwkgKiBjb21wbGV0ZSwgc28gd2UganVzdCB1c2UgdGhlIHByZXZpb3VzIHJlc3VsdHMgYW5kIHRyaWdnZXIKKwkgKiBhIG5ldyB0YWxsaWVzIGlucXVpcnkgY29tbWFuZCBmb3IgbmV4dCB0aW1lIC0gSmVhbiBJSSAqLworCS8qIEZJWE1FOiBXZSdyZSBpbiB1c2VyIGNvbnRleHQgKEkgdGhpbms/KSwgc28gd2Ugc2hvdWxkIGp1c3QKKyAgICAgICAgICAgd2FpdCBmb3IgdGhlIHRhbGxpZXMgdG8gY29tZSB0aHJvdWdoICovCisJZXJyID0gaGVybWVzX2lucXVpcmUoaHcsIEhFUk1FU19JTlFfVEFMTElFUyk7CisgICAgICAgICAgICAgICAKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJaWYgKGVycikKKwkJcmV0dXJuIE5VTEw7CisJCQorCXJldHVybiB3c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIG9yaW5vY29fc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogb3Jpbm9jb19zZXRfbXVsdGljYXN0X2xpc3QoKSAiCisJCSAgICAgICAiY2FsbGVkIHdoZW4gaHdfdW5hdmFpbGFibGVcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlfX29yaW5vY29fc2V0X211bHRpY2FzdF9saXN0KGRldik7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKK30KKworc3RhdGljIGludCBvcmlub2NvX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIChuZXdfbXR1IDwgT1JJTk9DT19NSU5fTVRVKSB8fCAobmV3X210dSA+IE9SSU5PQ09fTUFYX01UVSkgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICggKG5ld19tdHUgKyBFTkNBUFNfT1ZFUkhFQUQgKyBJRUVFODAyXzExX0hMRU4pID4KKwkgICAgIChwcml2LT5uaWNidWZfc2l6ZSAtIEVUSF9ITEVOKSApCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFR4IHBhdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBvcmlub2NvX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCXUxNiB0eGZpZCA9IHByaXYtPnR4ZmlkOworCWNoYXIgKnA7CisJc3RydWN0IGV0aGhkciAqZWg7CisJaW50IGxlbiwgZGF0YV9sZW4sIGRhdGFfb2ZmOworCXN0cnVjdCBoZXJtZXNfdHhfZGVzY3JpcHRvciBkZXNjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlUUkFDRV9FTlRFUihkZXYtPm5hbWUpOworCisJaWYgKCEgbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFR4IG9uIHN0b3BwZWQgZGV2aWNlIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCQorCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeCB3aGlsZSB0cmFuc21pdHRlciBidXN5IVxuIiwgCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKwkKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvcmlub2NvX3htaXQoKSBjYWxsZWQgd2hpbGUgaHdfdW5hdmFpbGFibGVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWlmICghIG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQkvKiBPb3BzLCB0aGUgZmlybXdhcmUgaGFzbid0IGVzdGFibGlzaGVkIGEgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICBzaWxlbnRseSBkcm9wIHRoZSBwYWNrZXQgKHRoaXMgc2VlbXMgdG8gYmUgdGhlCisgICAgICAgICAgICAgICAgICAgc2FmZXN0IGFwcHJvYWNoKS4gKi8KKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTGVuZ3RoIG9mIHRoZSBwYWNrZXQgYm9keSAqLworCS8qIEZJWE1FOiB3aGF0IGlmIHRoZSBza2IgaXMgc21hbGxlciB0aGFuIHRoaXM/ICovCisJbGVuID0gbWF4X3QoaW50LHNrYi0+bGVuIC0gRVRIX0hMRU4sIEVUSF9aTEVOIC0gRVRIX0hMRU4pOworCisJZWggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKKworCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKKyAJZGVzYy50eF9jb250cm9sID0gY3B1X3RvX2xlMTYoSEVSTUVTX1RYQ1RSTF9UWF9PSyB8IEhFUk1FU19UWENUUkxfVFhfRVgpOworCWVyciA9IGhlcm1lc19iYXBfcHdyaXRlKGh3LCBVU0VSX0JBUCwgJmRlc2MsIHNpemVvZihkZXNjKSwgdHhmaWQsIDApOworCWlmIChlcnIpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHdyaXRpbmcgVHggZGVzY3JpcHRvciAiCisJCQkgICAgICAgInRvIEJBUFxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBDbGVhciB0aGUgODAyLjExIGhlYWRlciBhbmQgZGF0YSBsZW5ndGggZmllbGRzIC0gc29tZQorCSAqIGZpcm13YXJlcyAoZS5nLiBMdWNlbnQvQWdlcmUgOC54eCkgYXBwZWFyIHRvIGdldCBjb25mdXNlZAorCSAqIGlmIHRoaXMgaXNuJ3QgZG9uZS4gKi8KKwloZXJtZXNfY2xlYXJfd29yZHMoaHcsIEhFUk1FU19EQVRBMCwKKwkJCSAgIEhFUk1FU184MDJfM19PRkZTRVQgLSBIRVJNRVNfODAyXzExX09GRlNFVCk7CisKKwkvKiBFbmNhcHN1bGF0ZSBFdGhlcm5ldC1JSSBmcmFtZXMgKi8KKwlpZiAobnRvaHMoZWgtPmhfcHJvdG8pID4gRVRIX0RBVEFfTEVOKSB7IC8qIEV0aGVybmV0LUlJIGZyYW1lICovCisJCXN0cnVjdCBoZWFkZXJfc3RydWN0IGhkcjsKKwkJZGF0YV9sZW4gPSBsZW47CisJCWRhdGFfb2ZmID0gSEVSTUVTXzgwMl8zX09GRlNFVCArIHNpemVvZihoZHIpOworCQlwID0gc2tiLT5kYXRhICsgRVRIX0hMRU47CisKKwkJLyogODAyLjMgaGVhZGVyICovCisJCW1lbWNweShoZHIuZGVzdCwgZWgtPmhfZGVzdCwgRVRIX0FMRU4pOworCQltZW1jcHkoaGRyLnNyYywgZWgtPmhfc291cmNlLCBFVEhfQUxFTik7CisJCWhkci5sZW4gPSBodG9ucyhkYXRhX2xlbiArIEVOQ0FQU19PVkVSSEVBRCk7CisJCQorCQkvKiA4MDIuMiBoZWFkZXIgKi8KKwkJbWVtY3B5KCZoZHIuZHNhcCwgJmVuY2Fwc19oZHIsIHNpemVvZihlbmNhcHNfaGRyKSk7CisJCQkKKwkJaGRyLmV0aGVydHlwZSA9IGVoLT5oX3Byb3RvOworCQllcnIgID0gaGVybWVzX2JhcF9wd3JpdGUoaHcsIFVTRVJfQkFQLCAmaGRyLCBzaXplb2YoaGRyKSwKKwkJCQkJIHR4ZmlkLCBIRVJNRVNfODAyXzNfT0ZGU0VUKTsKKwkJaWYgKGVycikgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCB3cml0aW5nIHBhY2tldCAiCisJCQkJICAgICAgICJoZWFkZXIgdG8gQkFQXG4iLCBkZXYtPm5hbWUsIGVycik7CisJCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9IGVsc2UgeyAvKiBJRUVFIDgwMi4zIGZyYW1lICovCisJCWRhdGFfbGVuID0gbGVuICsgRVRIX0hMRU47CisJCWRhdGFfb2ZmID0gSEVSTUVTXzgwMl8zX09GRlNFVDsKKwkJcCA9IHNrYi0+ZGF0YTsKKwl9CisKKwkvKiBSb3VuZCB1cCBmb3Igb2RkIGxlbmd0aCBwYWNrZXRzICovCisJZXJyID0gaGVybWVzX2JhcF9wd3JpdGUoaHcsIFVTRVJfQkFQLCBwLCBBTElHTihkYXRhX2xlbiwgMiksCisJCQkJdHhmaWQsIGRhdGFfb2ZmKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHdyaXRpbmcgcGFja2V0IHRvIEJBUFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogRmluYWxseSwgd2UgYWN0dWFsbHkgaW5pdGlhdGUgdGhlIHNlbmQgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwllcnIgPSBoZXJtZXNfZG9jbWRfd2FpdChodywgSEVSTUVTX0NNRF9UWCB8IEhFUk1FU19DTURfUkVDTCwKKwkJCQl0eGZpZCwgTlVMTCk7CisJaWYgKGVycikgeworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCB0cmFuc21pdHRpbmcgcGFja2V0XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlzdGF0cy0+dHhfYnl0ZXMgKz0gZGF0YV9vZmYgKyBkYXRhX2xlbjsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisKKwlyZXR1cm4gMDsKKyBmYWlsOgorCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X2FsbG9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgZmlkID0gaGVybWVzX3JlYWRfcmVnbihodywgQUxMT0NGSUQpOworCisJaWYgKGZpZCAhPSBwcml2LT50eGZpZCkgeworCQlpZiAoZmlkICE9IERVTU1ZX0ZJRCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBbGxvY2F0ZSBldmVudCBvbiB1bmV4cGVjdGVkIGZpZCAoJTA0WClcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBmaWQpOworCQlyZXR1cm47CisJfQorCisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEFMTE9DRklELCBEVU1NWV9GSUQpOworfQorCitzdGF0aWMgdm9pZCBfX29yaW5vY29fZXZfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKKworCXN0YXRzLT50eF9wYWNrZXRzKys7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwloZXJtZXNfd3JpdGVfcmVnbihodywgVFhDT01QTEZJRCwgRFVNTVlfRklEKTsKK30KKworc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X3R4ZXhjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7CisJdTE2IGZpZCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFRYQ09NUExGSUQpOworCXN0cnVjdCBoZXJtZXNfdHhfZGVzY3JpcHRvciBkZXNjOworCWludCBlcnIgPSAwOworCisJaWYgKGZpZCA9PSBEVU1NWV9GSUQpCisJCXJldHVybjsgLyogTm90aGluZydzIHJlYWxseSBoYXBwZW5lZCAqLworCisJZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgJmRlc2MsIHNpemVvZihkZXNjKSwgZmlkLCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gcmVhZCBkZXNjcmlwdG9yIG9uIFR4IGVycm9yICIKKwkJICAgICAgICIoRklEPSUwNFggZXJyb3IgJWQpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBmaWQsIGVycik7CisJfSBlbHNlIHsKKwkJREVCVUcoMSwgIiVzOiBUeCBlcnJvciwgc3RhdHVzICVkXG4iLAorCQkgICAgICBkZXYtPm5hbWUsIGxlMTZfdG9fY3B1KGRlc2Muc3RhdHVzKSk7CisJfQorCQorCXN0YXRzLT50eF9lcnJvcnMrKzsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwloZXJtZXNfd3JpdGVfcmVnbihodywgVFhDT01QTEZJRCwgRFVNTVlfRklEKTsKK30KKworc3RhdGljIHZvaWQgb3Jpbm9jb190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFR4IHRpbWVvdXQhICIKKwkgICAgICAgIkFMTE9DRklEPSUwNHgsIFRYQ09NUExGSUQ9JTA0eCwgRVZTVEFUPSUwNHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgaGVybWVzX3JlYWRfcmVnbihodywgQUxMT0NGSUQpLAorCSAgICAgICBoZXJtZXNfcmVhZF9yZWduKGh3LCBUWENPTVBMRklEKSwgaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKSk7CisKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisKKwlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUnggcGF0aCAoZGF0YSBmcmFtZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEb2VzIHRoZSBmcmFtZSBoYXZlIGEgU05BUCBoZWFkZXIgaW5kaWNhdGluZyBpdCBzaG91bGQgYmUKKyAqIGRlLWVuY2Fwc3VsYXRlZCB0byBFdGhlcm5ldC1JST8gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX2V0aGVyc25hcCh2b2lkICpfaGRyKQoreworCXU4ICpoZHIgPSBfaGRyOworCisJLyogV2UgZGUtZW5jYXBzdWxhdGUgYWxsIHBhY2tldHMgd2hpY2gsIGEpIGhhdmUgU05BUCBoZWFkZXJzCisJICogKGkuZS4gU1NBUD1EU0FQPTB4YWEgYW5kIENUUkw9MHgzIGluIHRoZSA4MDIuMiBMTEMgaGVhZGVyCisJICogYW5kIHdoZXJlIGIpIHRoZSBPVUkgb2YgdGhlIFNOQVAgaGVhZGVyIGlzIDAwOjAwOjAwIG9yCisJICogMDA6MDA6ZjggLSB3ZSBuZWVkIGJvdGggYmVjYXVzZSBkaWZmZXJlbnQgQVBzIGFwcGVhciB0byB1c2UKKwkgKiBkaWZmZXJlbnQgT1VJcyBmb3Igc29tZSByZWFzb24gKi8KKwlyZXR1cm4gKG1lbWNtcChoZHIsICZlbmNhcHNfaGRyLCA1KSA9PSAwKQorCQkmJiAoIChoZHJbNV0gPT0gMHgwMCkgfHwgKGhkcls1XSA9PSAweGY4KSApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3Jpbm9jb19zcHlfZ2F0aGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciAqbWFjLAorCQkJCSAgICAgIGludCBsZXZlbCwgaW50IG5vaXNlKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJLyogR2F0aGVyIHdpcmVsZXNzIHNweSBzdGF0aXN0aWNzOiBmb3IgZWFjaCBwYWNrZXQsIGNvbXBhcmUgdGhlCisJICogc291cmNlIGFkZHJlc3Mgd2l0aCBvdXQgbGlzdCwgYW5kIGlmIG1hdGNoLCBnZXQgdGhlIHN0YXRzLi4uICovCisJZm9yIChpID0gMDsgaSA8IHByaXYtPnNweV9udW1iZXI7IGkrKykKKwkJaWYgKCFtZW1jbXAobWFjLCBwcml2LT5zcHlfYWRkcmVzc1tpXSwgRVRIX0FMRU4pKSB7CisJCQlwcml2LT5zcHlfc3RhdFtpXS5sZXZlbCA9IGxldmVsIC0gMHg5NTsKKwkJCXByaXYtPnNweV9zdGF0W2ldLm5vaXNlID0gbm9pc2UgLSAweDk1OworCQkJcHJpdi0+c3B5X3N0YXRbaV0ucXVhbCA9IChsZXZlbCA+IG5vaXNlKSA/IChsZXZlbCAtIG5vaXNlKSA6IDA7CisJCQlwcml2LT5zcHlfc3RhdFtpXS51cGRhdGVkID0gNzsKKwkJfQorfQorCitzdGF0aWMgdm9pZCBvcmlub2NvX3N0YXRfZ2F0aGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlzdHJ1Y3QgaGVybWVzX3J4X2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBVc2luZyBzcHkgc3VwcG9ydCB3aXRoIGxvdHMgb2YgUnggcGFja2V0cywgbGlrZSBpbiBhbgorCSAqIGluZnJhc3RydWN0dXJlIChBUCksIHdpbGwgcmVhbGx5IHNsb3cgZG93biBldmVyeXRoaW5nLCBiZWNhdXNlCisJICogdGhlIE1BQyBhZGRyZXNzIG11c3QgYmUgY29tcGFyZWQgdG8gZWFjaCBlbnRyeSBvZiB0aGUgc3B5IGxpc3QuCisJICogSWYgdGhlIHVzZXIgcmVhbGx5IGFza3MgZm9yIGl0IChzZXQgc29tZSBhZGRyZXNzIGluIHRoZQorCSAqIHNweSBsaXN0KSwgd2UgZG8gaXQsIGJ1dCBoZSB3aWxsIHBheSB0aGUgcHJpY2UuCisJICogTm90ZSB0aGF0IHRvIGdldCBoZXJlLCB5b3UgbmVlZCBib3RoIFdJUkVMRVNTX1NQWQorCSAqIGNvbXBpbGVkIGluIEFORCBzb21lIGFkZHJlc3NlcyBpbiB0aGUgbGlzdCAhISEKKwkgKi8KKwkvKiBOb3RlIDogZ2NjIHdpbGwgb3B0aW1pc2UgdGhlIHdob2xlIHNlY3Rpb24gYXdheSBpZgorCSAqIFdJUkVMRVNTX1NQWSBpcyBub3QgZGVmaW5lZC4uLiAtIEplYW4gSUkgKi8KKwlpZiAoU1BZX05VTUJFUihwcml2KSkgeworCQlvcmlub2NvX3NweV9nYXRoZXIoZGV2LCBza2ItPm1hYy5yYXcgKyBFVEhfQUxFTiwKKwkJCQkgICBkZXNjLT5zaWduYWwsIGRlc2MtPnNpbGVuY2UpOworCX0KK30KKworc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7CisJc3RydWN0IGl3X3N0YXRpc3RpY3MgKndzdGF0cyA9ICZwcml2LT53c3RhdHM7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdTE2IHJ4ZmlkLCBzdGF0dXM7CisJaW50IGxlbmd0aCwgZGF0YV9sZW4sIGRhdGFfb2ZmOworCWNoYXIgKnA7CisJc3RydWN0IGhlcm1lc19yeF9kZXNjcmlwdG9yIGRlc2M7CisJc3RydWN0IGhlYWRlcl9zdHJ1Y3QgaGRyOworCXN0cnVjdCBldGhoZHIgKmVoOworCWludCBlcnI7CisKKwlyeGZpZCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFJYRklEKTsKKworCWVyciA9IGhlcm1lc19iYXBfcHJlYWQoaHcsIElSUV9CQVAsICZkZXNjLCBzaXplb2YoZGVzYyksCisJCQkgICAgICAgcnhmaWQsIDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgcmVhZGluZyBSeCBkZXNjcmlwdG9yLiAiCisJCSAgICAgICAiRnJhbWUgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSwgZXJyKTsKKwkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQlnb3RvIGRyb3A7CisJfQorCisJc3RhdHVzID0gbGUxNl90b19jcHUoZGVzYy5zdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIEhFUk1FU19SWFNUQVRfRVJSKSB7CisJCWlmIChzdGF0dXMgJiBIRVJNRVNfUlhTVEFUX1VOREVDUllQVEFCTEUpIHsKKwkJCXdzdGF0cy0+ZGlzY2FyZC5jb2RlKys7CisJCQlERUJVRygxLCAiJXM6IFVuZGVjcnlwdGFibGUgZnJhbWUgb24gUnguIEZyYW1lIGRyb3BwZWQuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQlzdGF0cy0+cnhfY3JjX2Vycm9ycysrOworCQkJREVCVUcoMSwgIiVzOiBCYWQgQ1JDIG9uIFJ4LiBGcmFtZSBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCWdvdG8gZHJvcDsKKwl9CisKKwkvKiBGb3Igbm93IHdlIGlnbm9yZSB0aGUgODAyLjExIGhlYWRlciBjb21wbGV0ZWx5LCBhc3N1bWluZworICAgICAgICAgICB0aGF0IHRoZSBjYXJkJ3MgZmlybXdhcmUgaGFzIGhhbmRsZWQgYW55dGhpbmcgdml0YWwgKi8KKworCWVyciA9IGhlcm1lc19iYXBfcHJlYWQoaHcsIElSUV9CQVAsICZoZHIsIHNpemVvZihoZHIpLAorCQkJICAgICAgIHJ4ZmlkLCBIRVJNRVNfODAyXzNfT0ZGU0VUKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHJlYWRpbmcgZnJhbWUgaGVhZGVyLiAiCisJCSAgICAgICAiRnJhbWUgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSwgZXJyKTsKKwkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQlnb3RvIGRyb3A7CisJfQorCisJbGVuZ3RoID0gbnRvaHMoaGRyLmxlbik7CisJCisJLyogU2FuaXR5IGNoZWNrcyAqLworCWlmIChsZW5ndGggPCAzKSB7IC8qIE5vIGZvciBldmVuIGFuIDgwMi4yIExMQyBoZWFkZXIgKi8KKwkJLyogQXQgbGVhc3Qgb24gU3ltYm9sIGZpcm13YXJlIHdpdGggUENGIHdlIGdldCBxdWl0ZSBhCisgICAgICAgICAgICAgICAgICAgbG90IG9mIHRoZXNlIGxlZ2l0aW1hdGVseSAtIFBvbGwgZnJhbWVzIHdpdGggbm8KKyAgICAgICAgICAgICAgICAgICBkYXRhLiAqLworCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQlnb3RvIGRyb3A7CisJfQorCWlmIChsZW5ndGggPiBJRUVFODAyXzExX0RBVEFfTEVOKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdmVyc2l6ZWQgZnJhbWUgcmVjZWl2ZWQgKCVkIGJ5dGVzKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbGVuZ3RoKTsKKwkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQlnb3RvIGRyb3A7CisJfQorCisJLyogV2UgbmVlZCBzcGFjZSBmb3IgdGhlIHBhY2tldCBkYXRhIGl0c2VsZiwgcGx1cyBhbiBldGhlcm5ldAorCSAgIGhlYWRlciwgcGx1cyAyIGJ5dGVzIHNvIHdlIGNhbiBhbGlnbiB0aGUgSVAgaGVhZGVyIG9uIGEKKwkgICAzMmJpdCBib3VuZGFyeSwgcGx1cyAxIGJ5dGUgc28gd2UgY2FuIHJlYWQgaW4gb2RkIGxlbmd0aAorCSAgIHBhY2tldHMgZnJvbSB0aGUgY2FyZCwgd2hpY2ggaGFzIGFuIElPIGdyYW51bGFyaXR5IG9mIDE2CisJICAgYml0cyAqLyAgCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW5ndGgrRVRIX0hMRU4rMisxKTsKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3QgYWxsb2NhdGUgc2tiIGZvciBSeFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gZHJvcDsKKwl9CisKKwlza2JfcmVzZXJ2ZShza2IsIDIpOyAvKiBUaGlzIHdheSB0aGUgSVAgaGVhZGVyIGlzIGFsaWduZWQgKi8KKworCS8qIEhhbmRsZSBkZWNhcHN1bGF0aW9uCisJICogSW4gbW9zdCBjYXNlcywgdGhlIGZpcm13YXJlIHRlbGwgdXMgYWJvdXQgU05BUCBmcmFtZXMuCisJICogRm9yIHNvbWUgcmVhc29uLCB0aGUgU05BUCBmcmFtZXMgc2VudCBieSBMaW5rU3lzIEFQcworCSAqIGFyZSBub3QgcHJvcGVybHkgcmVjb2duaXNlZCBieSBtb3N0IGZpcm13YXJlcy4KKwkgKiBTbywgY2hlY2sgb3Vyc2VsdmVzICovCisJaWYgKCgoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9NU0dUWVBFKSA9PSBIRVJNRVNfUlhTVEFUXzEwNDIpIHx8CisJICAgICgoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9NU0dUWVBFKSA9PSBIRVJNRVNfUlhTVEFUX1RVTk5FTCkgfHwKKwkgICAgaXNfZXRoZXJzbmFwKCZoZHIpKSB7CisJCS8qIFRoZXNlIGluZGljYXRlIGEgU05BUCB3aXRoaW4gODAyLjIgTExDIHdpdGhpbgorCQkgICA4MDIuMTEgZnJhbWUgd2hpY2ggd2UnbGwgbmVlZCB0byBkZS1lbmNhcHN1bGF0ZSB0bworCQkgICB0aGUgb3JpZ2luYWwgRXRoZXJuZXRJSSBmcmFtZS4gKi8KKworCQlpZiAobGVuZ3RoIDwgRU5DQVBTX09WRVJIRUFEKSB7IC8qIE5vIHJvb20gZm9yIGZ1bGwgTExDK1NOQVAgKi8KKwkJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlnb3RvIGRyb3A7CisJCX0KKworCQkvKiBSZW1vdmUgU05BUCBoZWFkZXIsIHJlY29uc3RydWN0IEV0aGVybmV0SUkgZnJhbWUgKi8KKwkJZGF0YV9sZW4gPSBsZW5ndGggLSBFTkNBUFNfT1ZFUkhFQUQ7CisJCWRhdGFfb2ZmID0gSEVSTUVTXzgwMl8zX09GRlNFVCArIHNpemVvZihoZHIpOworCisJCWVoID0gKHN0cnVjdCBldGhoZHIgKilza2JfcHV0KHNrYiwgRVRIX0hMRU4pOworCisJCW1lbWNweShlaCwgJmhkciwgMiAqIEVUSF9BTEVOKTsKKwkJZWgtPmhfcHJvdG8gPSBoZHIuZXRoZXJ0eXBlOworCX0gZWxzZSB7CisJCS8qIEFsbCBvdGhlciBjYXNlcyBpbmRpY2F0ZSBhIGdlbnVpbmUgODAyLjMgZnJhbWUuICBObworCQkgICBkZWNhcHN1bGF0aW9uIG5lZWRlZC4gIFdlIGp1c3QgdGhyb3cgdGhlIHdob2xlCisJCSAgIHRoaW5nIGluLCBhbmQgaG9wZSB0aGUgcHJvdG9jb2wgbGF5ZXIgY2FuIGRlYWwgd2l0aAorCQkgICBpdCBhcyA4MDIuMyAqLworCQlkYXRhX2xlbiA9IGxlbmd0aDsKKwkJZGF0YV9vZmYgPSBIRVJNRVNfODAyXzNfT0ZGU0VUOworCQkvKiBGSVhNRTogd2UgcmUtcmVhZCBmcm9tIHRoZSBjYXJkIGRhdGEgd2UgYWxyZWFkeSByZWFkIGhlcmUgKi8KKwl9CisKKwlwID0gc2tiX3B1dChza2IsIGRhdGFfbGVuKTsKKwllcnIgPSBoZXJtZXNfYmFwX3ByZWFkKGh3LCBJUlFfQkFQLCBwLCBBTElHTihkYXRhX2xlbiwgMiksCisJCQkgICAgICAgcnhmaWQsIGRhdGFfb2ZmKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHJlYWRpbmcgZnJhbWUuICIKKwkJICAgICAgICJGcmFtZSBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCWdvdG8gZHJvcDsKKwl9CisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQorCS8qIFByb2Nlc3MgdGhlIHdpcmVsZXNzIHN0YXRzIGlmIG5lZWRlZCAqLworCW9yaW5vY29fc3RhdF9nYXRoZXIoZGV2LCBza2IsICZkZXNjKTsKKworCS8qIFBhc3MgdGhlIHBhY2tldCB0byB0aGUgbmV0d29ya2luZyBzdGFjayAqLworCW5ldGlmX3J4KHNrYik7CisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gbGVuZ3RoOworCisJcmV0dXJuOworCisgZHJvcDoJCisJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKworCWlmIChza2IpCisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSeCBwYXRoIChpbmZvIGZyYW1lcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHByaW50X2xpbmtzdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHN0YXR1cykKK3sKKwljaGFyICogczsKKworCWlmIChzdXBwcmVzc19saW5rc3RhdHVzKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgSEVSTUVTX0xJTktTVEFUVVNfTk9UX0NPTk5FQ1RFRDoKKwkJcyA9ICJOb3QgQ29ubmVjdGVkIjsKKwkJYnJlYWs7CisJY2FzZSBIRVJNRVNfTElOS1NUQVRVU19DT05ORUNURUQ6CisJCXMgPSAiQ29ubmVjdGVkIjsKKwkJYnJlYWs7CisJY2FzZSBIRVJNRVNfTElOS1NUQVRVU19ESVNDT05ORUNURUQ6CisJCXMgPSAiRGlzY29ubmVjdGVkIjsKKwkJYnJlYWs7CisJY2FzZSBIRVJNRVNfTElOS1NUQVRVU19BUF9DSEFOR0U6CisJCXMgPSAiQVAgQ2hhbmdlZCI7CisJCWJyZWFrOworCWNhc2UgSEVSTUVTX0xJTktTVEFUVVNfQVBfT1VUX09GX1JBTkdFOgorCQlzID0gIkFQIE91dCBvZiBSYW5nZSI7CisJCWJyZWFrOworCWNhc2UgSEVSTUVTX0xJTktTVEFUVVNfQVBfSU5fUkFOR0U6CisJCXMgPSAiQVAgSW4gUmFuZ2UiOworCQlicmVhazsKKwljYXNlIEhFUk1FU19MSU5LU1RBVFVTX0FTU09DX0ZBSUxFRDoKKwkJcyA9ICJBc3NvY2lhdGlvbiBGYWlsZWQiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzID0gIlVOS05PV04iOworCX0KKwkKKwlwcmludGsoS0VSTl9JTkZPICIlczogTmV3IGxpbmsgc3RhdHVzOiAlcyAoJTA0eClcbiIsCisJICAgICAgIGRldi0+bmFtZSwgcywgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiBpbmZvZmlkOworCXN0cnVjdCB7CisJCXUxNiBsZW47CisJCXUxNiB0eXBlOworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGluZm87CisJaW50IGxlbiwgdHlwZTsKKwlpbnQgZXJyOworCisJLyogVGhpcyBpcyBhbiBhbnN3ZXIgdG8gYW4gSU5RVUlSRSBjb21tYW5kIHRoYXQgd2UgZGlkIGVhcmxpZXIsCisJICogb3IgYW4gaW5mb3JtYXRpb24gImV2ZW50IiBnZW5lcmF0ZWQgYnkgdGhlIGNhcmQKKwkgKiBUaGUgY29udHJvbGxlciByZXR1cm4gdG8gdXMgYSBwc2V1ZG8gZnJhbWUgY29udGFpbmluZworCSAqIHRoZSBpbmZvcm1hdGlvbiBpbiBxdWVzdGlvbiAtIEplYW4gSUkgKi8KKwlpbmZvZmlkID0gaGVybWVzX3JlYWRfcmVnbihodywgSU5GT0ZJRCk7CisKKwkvKiBSZWFkIHRoZSBpbmZvIGZyYW1lIGhlYWRlciAtIGRvbid0IHRyeSB0b28gaGFyZCAqLworCWVyciA9IGhlcm1lc19iYXBfcHJlYWQoaHcsIElSUV9CQVAsICZpbmZvLCBzaXplb2YoaW5mbyksCisJCQkgICAgICAgaW5mb2ZpZCwgMCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCByZWFkaW5nIGluZm8gZnJhbWUuICIKKwkJICAgICAgICJGcmFtZSBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm47CisJfQorCQorCWxlbiA9IEhFUk1FU19SRUNMRU5fVE9fQllURVMobGUxNl90b19jcHUoaW5mby5sZW4pKTsKKwl0eXBlID0gbGUxNl90b19jcHUoaW5mby50eXBlKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSEVSTUVTX0lOUV9UQUxMSUVTOiB7CisJCXN0cnVjdCBoZXJtZXNfdGFsbGllc19mcmFtZSB0YWxsaWVzOworCQlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqd3N0YXRzID0gJnByaXYtPndzdGF0czsKKwkJCisJCWlmIChsZW4gPiBzaXplb2YodGFsbGllcykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUYWxsaWVzIGZyYW1lIHRvbyBsb25nICglZCBieXRlcylcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBsZW4pOworCQkJbGVuID0gc2l6ZW9mKHRhbGxpZXMpOworCQl9CisJCQorCQkvKiBSZWFkIGRpcmVjdGx5IHRoZSBkYXRhIChubyBzZWVrKSAqLworCQloZXJtZXNfcmVhZF93b3JkcyhodywgSEVSTUVTX0RBVEExLCAodm9pZCAqKSAmdGFsbGllcywKKwkJCQkgIGxlbiAvIDIpOyAvKiBGSVhNRTogYmxlY2ghICovCisJCQorCQkvKiBJbmNyZW1lbnQgb3VyIHZhcmlvdXMgY291bnRlcnMgKi8KKwkJLyogd3N0YXRzLT5kaXNjYXJkLm53aWQgLSBubyB3cm9uZyBCU1NJRCBzdHVmZiAqLworCQl3c3RhdHMtPmRpc2NhcmQuY29kZSArPQorCQkJbGUxNl90b19jcHUodGFsbGllcy5SeFdFUFVuZGVjcnlwdGFibGUpOworCQlpZiAobGVuID09IHNpemVvZih0YWxsaWVzKSkgIAorCQkJd3N0YXRzLT5kaXNjYXJkLmNvZGUgKz0KKwkJCQlsZTE2X3RvX2NwdSh0YWxsaWVzLlJ4RGlzY2FyZHNfV0VQSUNWRXJyb3IpICsKKwkJCQlsZTE2X3RvX2NwdSh0YWxsaWVzLlJ4RGlzY2FyZHNfV0VQRXhjbHVkZWQpOworCQl3c3RhdHMtPmRpc2NhcmQubWlzYyArPQorCQkJbGUxNl90b19jcHUodGFsbGllcy5UeERpc2NhcmRzV3JvbmdTQSk7CisJCXdzdGF0cy0+ZGlzY2FyZC5mcmFnbWVudCArPQorCQkJbGUxNl90b19jcHUodGFsbGllcy5SeE1zZ0luQmFkTXNnRnJhZ21lbnRzKTsKKwkJd3N0YXRzLT5kaXNjYXJkLnJldHJpZXMgKz0KKwkJCWxlMTZfdG9fY3B1KHRhbGxpZXMuVHhSZXRyeUxpbWl0RXhjZWVkZWQpOworCQkvKiB3c3RhdHMtPm1pc3MuYmVhY29uIC0gbm8gbWF0Y2ggKi8KKwl9CisJYnJlYWs7CisJY2FzZSBIRVJNRVNfSU5RX0xJTktTVEFUVVM6IHsKKwkJc3RydWN0IGhlcm1lc19saW5rc3RhdHVzIGxpbmtzdGF0dXM7CisJCXUxNiBuZXdzdGF0dXM7CisJCWludCBjb25uZWN0ZWQ7CisKKwkJaWYgKGxlbiAhPSBzaXplb2YobGlua3N0YXR1cykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmV4cGVjdGVkIHNpemUgZm9yIGxpbmtzdGF0dXMgZnJhbWUgKCVkIGJ5dGVzKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGxlbik7CisJCQlicmVhazsKKwkJfQorCisJCWhlcm1lc19yZWFkX3dvcmRzKGh3LCBIRVJNRVNfREFUQTEsICh2b2lkICopICZsaW5rc3RhdHVzLAorCQkJCSAgbGVuIC8gMik7CisJCW5ld3N0YXR1cyA9IGxlMTZfdG9fY3B1KGxpbmtzdGF0dXMubGlua3N0YXR1cyk7CisKKwkJY29ubmVjdGVkID0gKG5ld3N0YXR1cyA9PSBIRVJNRVNfTElOS1NUQVRVU19DT05ORUNURUQpCisJCQl8fCAobmV3c3RhdHVzID09IEhFUk1FU19MSU5LU1RBVFVTX0FQX0NIQU5HRSkKKwkJCXx8IChuZXdzdGF0dXMgPT0gSEVSTUVTX0xJTktTVEFUVVNfQVBfSU5fUkFOR0UpOworCisJCWlmIChjb25uZWN0ZWQpCisJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCWVsc2UKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwkJaWYgKG5ld3N0YXR1cyAhPSBwcml2LT5sYXN0X2xpbmtzdGF0dXMpCisJCQlwcmludF9saW5rc3RhdHVzKGRldiwgbmV3c3RhdHVzKTsKKworCQlwcml2LT5sYXN0X2xpbmtzdGF0dXMgPSBuZXdzdGF0dXM7CisJfQorCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVW5rbm93biBpbmZvcm1hdGlvbiBmcmFtZSByZWNlaXZlZDogIgorCQkgICAgICAgInR5cGUgMHglMDR4LCBsZW5ndGggJWRcbiIsIGRldi0+bmFtZSwgdHlwZSwgbGVuKTsKKwkJLyogV2UgZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYWJvdXQgaXQgKi8KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX29yaW5vY29fZXZfaW5mZHJvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBoZXJtZXNfdCAqaHcpCit7CisJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbmZvcm1hdGlvbiBmcmFtZSBsb3N0LlxuIiwgZGV2LT5uYW1lKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW50ZXJuYWwgaGFyZHdhcmUgY29udHJvbCByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgX19vcmlub2NvX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVycjsKKworCWVyciA9IF9fb3Jpbm9jb19wcm9ncmFtX3JpZHMoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIGNvbmZpZ3VyaW5nIGNhcmRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogRmlyZSB0aGluZ3MgdXAgYWdhaW4gKi8KKwloZXJtZXNfc2V0X2lycW1hc2soaHcsIE9SSU5PQ09fSU5URU4pOworCWVyciA9IGhlcm1lc19lbmFibGVfcG9ydChodywgMCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBlbmFibGluZyBNQUMgcG9ydFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBfX29yaW5vY29fZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnI7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoISBwcml2LT5od191bmF2YWlsYWJsZSkgeworCQlpZiAoISBwcml2LT5icm9rZW5fZGlzYWJsZXBvcnQpIHsKKwkJCWVyciA9IGhlcm1lc19kaXNhYmxlX3BvcnQoaHcsIDApOworCQkJaWYgKGVycikgeworCQkJCS8qIFNvbWUgZmlybXdhcmVzIChlLmcuIEludGVyc2lsIDEuMy54KSBzZWVtCisJCQkJICogdG8gaGF2ZSBwcm9ibGVtcyBkaXNhYmxpbmcgdGhlIHBvcnQsIG9oCisJCQkJICogd2VsbCwgdG9vIGJhZC4gKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRXJyb3IgJWQgZGlzYWJsaW5nIE1BQyBwb3J0XG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQkJcHJpdi0+YnJva2VuX2Rpc2FibGVwb3J0ID0gMTsKKwkJCX0KKwkJfQorCQloZXJtZXNfc2V0X2lycW1hc2soaHcsIDApOworCQloZXJtZXNfd3JpdGVfcmVnbihodywgRVZBQ0ssIDB4ZmZmZik7CisJfQorCQorCS8qIGZpcm13YXJlIHdpbGwgaGF2ZSB0byByZWFzc29jaWF0ZSAqLworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJcHJpdi0+bGFzdF9saW5rc3RhdHVzID0gMHhmZmZmOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBvcmlub2NvX3JlaW5pdF9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnI7CisKKwllcnIgPSBoZXJtZXNfaW5pdChodyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGhlcm1lc19hbGxvY2F0ZShodywgcHJpdi0+bmljYnVmX3NpemUsICZwcml2LT50eGZpZCk7CisJaWYgKGVyciA9PSAtRUlPKSB7CisJCS8qIFRyeSB3b3JrYXJvdW5kIGZvciBvbGQgU3ltYm9sIGZpcm13YXJlIGJ1ZyAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmlybXdhcmUgQUxMT0MgYnVnIGRldGVjdGVkICIKKwkJICAgICAgICIob2xkIFN5bWJvbCBmaXJtd2FyZT8pLiBUcnlpbmcgdG8gd29yayBhcm91bmQuLi4gIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCQorCQlwcml2LT5uaWNidWZfc2l6ZSA9IFRYX05JQ0JVRl9TSVpFX0JVRzsKKwkJZXJyID0gaGVybWVzX2FsbG9jYXRlKGh3LCBwcml2LT5uaWNidWZfc2l6ZSwgJnByaXYtPnR4ZmlkKTsKKwkJaWYgKGVycikKKwkJCXByaW50aygiZmFpbGVkIVxuIik7CisJCWVsc2UKKwkJCXByaW50aygib2suXG4iKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fb3Jpbm9jb19od19zZXRfYml0cmF0ZShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKworCWlmIChwcml2LT5iaXRyYXRlbW9kZSA+PSBCSVRSQVRFX1RBQkxFX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQlVHOiBJbnZhbGlkIGJpdHJhdGUgbW9kZSAlZFxuIiwKKwkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUsIHByaXYtPmJpdHJhdGVtb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChwcml2LT5maXJtd2FyZV90eXBlKSB7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0FHRVJFOgorCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GVFhSQVRFQ09OVFJPTCwKKwkJCQkJICAgYml0cmF0ZV90YWJsZVtwcml2LT5iaXRyYXRlbW9kZV0uYWdlcmVfdHhyYXRlY3RybCk7CisJCWJyZWFrOworCWNhc2UgRklSTVdBUkVfVFlQRV9JTlRFUlNJTDoKKwljYXNlIEZJUk1XQVJFX1RZUEVfU1lNQk9MOgorCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GVFhSQVRFQ09OVFJPTCwKKwkJCQkJICAgYml0cmF0ZV90YWJsZVtwcml2LT5iaXRyYXRlbW9kZV0uaW50ZXJzaWxfdHhyYXRlY3RybCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIENoYW5nZSB0aGUgV0VQIGtleXMgYW5kL29yIHRoZSBjdXJyZW50IGtleXMuICBDYW4gYmUgY2FsbGVkCisgKiBlaXRoZXIgZnJvbSBfX29yaW5vY29faHdfc2V0dXBfd2VwKCkgb3IgZGlyZWN0bHkgZnJvbQorICogb3Jpbm9jb19pb2N0bF9zZXRpd2VuY29kZSgpLiAgSW4gdGhlIGxhdGVyIGNhc2UgdGhlIGFzc29jaWF0aW9uCisgKiB3aXRoIHRoZSBBUCBpcyBub3QgYnJva2VuIChpZiB0aGUgZmlybXdhcmUgY2FuIGhhbmRsZSBpdCksCisgKiB3aGljaCBpcyBuZWVkZWQgZm9yIDgwMi4xeCBpbXBsZW1lbnRhdGlvbnMuICovCitzdGF0aWMgaW50IF9fb3Jpbm9jb19od19zZXR1cF93ZXBrZXlzKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCit7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChwcml2LT5maXJtd2FyZV90eXBlKSB7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0FHRVJFOgorCQllcnIgPSBIRVJNRVNfV1JJVEVfUkVDT1JEKGh3LCBVU0VSX0JBUCwKKwkJCQkJICBIRVJNRVNfUklEX0NORldFUEtFWVNfQUdFUkUsCisJCQkJCSAgJnByaXYtPmtleXMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORlRYS0VZX0FHRVJFLAorCQkJCQkgICBwcml2LT50eF9rZXkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0lOVEVSU0lMOgorCWNhc2UgRklSTVdBUkVfVFlQRV9TWU1CT0w6CisJCXsKKwkJCWludCBrZXlsZW47CisJCQlpbnQgaTsKKworCQkJLyogRm9yY2UgdW5pZm9ybSBrZXkgbGVuZ3RoIHRvIHdvcmsgYXJvdW5kIGZpcm13YXJlIGJ1Z3MgKi8KKwkJCWtleWxlbiA9IGxlMTZfdG9fY3B1KHByaXYtPmtleXNbcHJpdi0+dHhfa2V5XS5sZW4pOworCQkJCisJCQlpZiAoa2V5bGVuID4gTEFSR0VfS0VZX1NJWkUpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBCVUc6IEtleSAlZCBoYXMgb3ZlcnNpemUgbGVuZ3RoICVkLlxuIiwKKwkJCQkgICAgICAgcHJpdi0+bmRldi0+bmFtZSwgcHJpdi0+dHhfa2V5LCBrZXlsZW4pOworCQkJCXJldHVybiAtRTJCSUc7CisJCQl9CisKKwkJCS8qIFdyaXRlIGFsbCA0IGtleXMgKi8KKwkJCWZvcihpID0gMDsgaSA8IE9SSU5PQ09fTUFYX0tFWVM7IGkrKykgeworCQkJCWVyciA9IGhlcm1lc193cml0ZV9sdHYoaHcsIFVTRVJfQkFQLAorCQkJCQkJICAgICAgIEhFUk1FU19SSURfQ05GREVGQVVMVEtFWTAgKyBpLAorCQkJCQkJICAgICAgIEhFUk1FU19CWVRFU19UT19SRUNMRU4oa2V5bGVuKSwKKwkJCQkJCSAgICAgICBwcml2LT5rZXlzW2ldLmRhdGEpOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiBlcnI7CisJCQl9CisKKwkJCS8qIFdyaXRlIHRoZSBpbmRleCBvZiB0aGUga2V5IHVzZWQgaW4gdHJhbnNtaXNzaW9uICovCisJCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCQkgICBIRVJNRVNfUklEX0NORldFUERFRkFVTFRLRVlJRCwKKwkJCQkJCSAgIHByaXYtPnR4X2tleSk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19vcmlub2NvX2h3X3NldHVwX3dlcChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwlpbnQgbWFzdGVyX3dlcF9mbGFnOworCWludCBhdXRoX2ZsYWc7CisKKwlpZiAocHJpdi0+d2VwX29uKQorCQlfX29yaW5vY29faHdfc2V0dXBfd2Vwa2V5cyhwcml2KTsKKworCWlmIChwcml2LT53ZXBfcmVzdHJpY3QpCisJCWF1dGhfZmxhZyA9IEhFUk1FU19BVVRIX1NIQVJFRF9LRVk7CisJZWxzZQorCQlhdXRoX2ZsYWcgPSBIRVJNRVNfQVVUSF9PUEVOOworCisJc3dpdGNoIChwcml2LT5maXJtd2FyZV90eXBlKSB7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0FHRVJFOiAvKiBBZ2VyZSBzdHlsZSBXRVAgKi8KKwkJaWYgKHByaXYtPndlcF9vbikgeworCQkJLyogRW5hYmxlIHRoZSBzaGFyZWQta2V5IGF1dGhlbnRpY2F0aW9uLiAqLworCQkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkJICAgSEVSTUVTX1JJRF9DTkZBVVRIRU5USUNBVElPTl9BR0VSRSwKKwkJCQkJCSAgIGF1dGhfZmxhZyk7CisJCX0KKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORldFUEVOQUJMRURfQUdFUkUsCisJCQkJCSAgIHByaXYtPndlcF9vbik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKworCWNhc2UgRklSTVdBUkVfVFlQRV9JTlRFUlNJTDogLyogSW50ZXJzaWwgc3R5bGUgV0VQICovCisJY2FzZSBGSVJNV0FSRV9UWVBFX1NZTUJPTDogLyogU3ltYm9sIHN0eWxlIFdFUCAqLworCQlpZiAocHJpdi0+d2VwX29uKSB7CisJCQlpZiAocHJpdi0+d2VwX3Jlc3RyaWN0IHx8CisJCQkgICAgKHByaXYtPmZpcm13YXJlX3R5cGUgPT0gRklSTVdBUkVfVFlQRV9TWU1CT0wpKQorCQkJCW1hc3Rlcl93ZXBfZmxhZyA9IEhFUk1FU19XRVBfUFJJVkFDWV9JTlZPS0VEIHwKKwkJCQkJCSAgSEVSTUVTX1dFUF9FWENMX1VORU5DUllQVEVEOworCQkJZWxzZQorCQkJCW1hc3Rlcl93ZXBfZmxhZyA9IEhFUk1FU19XRVBfUFJJVkFDWV9JTlZPS0VEOworCisJCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCQkgICBIRVJNRVNfUklEX0NORkFVVEhFTlRJQ0FUSU9OLAorCQkJCQkJICAgYXV0aF9mbGFnKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfSBlbHNlCisJCQltYXN0ZXJfd2VwX2ZsYWcgPSAwOworCisJCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJCW1hc3Rlcl93ZXBfZmxhZyB8PSBIRVJNRVNfV0VQX0hPU1RfREVDUllQVDsKKworCQkvKiBNYXN0ZXIgV0VQIHNldHRpbmcgOiBvbi9vZmYgKi8KKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORldFUEZMQUdTX0lOVEVSU0lMLAorCQkJCQkgICBtYXN0ZXJfd2VwX2ZsYWcpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsJCisKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19vcmlub2NvX3Byb2dyYW1fcmlkcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyOworCXN0cnVjdCBoZXJtZXNfaWRzdHJpbmcgaWRidWY7CisKKwkvKiBTZXQgdGhlIE1BQyBhZGRyZXNzICovCisJZXJyID0gaGVybWVzX3dyaXRlX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GT1dOTUFDQUREUiwKKwkJCSAgICAgICBIRVJNRVNfQllURVNfVE9fUkVDTEVOKEVUSF9BTEVOKSwgZGV2LT5kZXZfYWRkcik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIE1BQyBhZGRyZXNzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFNldCB1cCB0aGUgbGluayBtb2RlICovCisJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORlBPUlRUWVBFLAorCQkJCSAgIHByaXYtPnBvcnRfdHlwZSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIHBvcnQgdHlwZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLyogU2V0IHRoZSBjaGFubmVsL2ZyZXF1ZW5jeSAqLworCWlmIChwcml2LT5jaGFubmVsID09IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDaGFubmVsIGlzIDAgaW4gX19vcmlub2NvX3Byb2dyYW1fcmlkcygpXG4iLCBkZXYtPm5hbWUpOworCQlpZiAocHJpdi0+Y3JlYXRlaWJzcykKKwkJCXByaXYtPmNoYW5uZWwgPSAxMDsKKwl9CisJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORk9XTkNIQU5ORUwsCisJCQkJICAgcHJpdi0+Y2hhbm5lbCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIGNoYW5uZWxcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHByaXYtPmhhc19pYnNzKSB7CisJCXUxNiBjcmVhdGVpYnNzOworCisJCWlmICgoc3RybGVuKHByaXYtPmRlc2lyZWRfZXNzaWQpID09IDApICYmIChwcml2LT5jcmVhdGVpYnNzKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRoaXMgZmlybXdhcmUgcmVxdWlyZXMgYW4gIgorCQkJICAgICAgICJFU1NJRCBpbiBJQlNTLUFkLUhvYyBtb2RlLlxuIiwgZGV2LT5uYW1lKTsKKwkJCS8qIFdpdGggd3ZsYW5fY3MsIGluIHRoaXMgY2FzZSwgd2Ugd291bGQgY3Jhc2guCisJCQkgKiBob3BlZnVsbHksIHRoaXMgZHJpdmVyIHdpbGwgYmVoYXZlIGJldHRlci4uLgorCQkJICogSmVhbiBJSSAqLworCQkJY3JlYXRlaWJzcyA9IDA7CisJCX0gZWxzZSB7CisJCQljcmVhdGVpYnNzID0gcHJpdi0+Y3JlYXRlaWJzczsKKwkJfQorCQkKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORkNSRUFURUlCU1MsCisJCQkJCSAgIGNyZWF0ZWlic3MpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIENSRUFURUlCU1NcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCS8qIFNldCB0aGUgZGVzaXJlZCBFU1NJRCAqLworCWlkYnVmLmxlbiA9IGNwdV90b19sZTE2KHN0cmxlbihwcml2LT5kZXNpcmVkX2Vzc2lkKSk7CisJbWVtY3B5KCZpZGJ1Zi52YWwsIHByaXYtPmRlc2lyZWRfZXNzaWQsIHNpemVvZihpZGJ1Zi52YWwpKTsKKwkvKiBXaW5YUCB3YW50cyBwYXJ0bmVyIHRvIGNvbmZpZ3VyZSBPV05TU0lEIGV2ZW4gaW4gSUJTUyBtb2RlLiAoamltYykgKi8KKwllcnIgPSBoZXJtZXNfd3JpdGVfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZPV05TU0lELAorCQkJICAgICAgIEhFUk1FU19CWVRFU19UT19SRUNMRU4oc3RybGVuKHByaXYtPmRlc2lyZWRfZXNzaWQpKzIpLAorCQkJICAgICAgICZpZGJ1Zik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIE9XTlNTSURcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCWVyciA9IGhlcm1lc193cml0ZV9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORkRFU0lSRURTU0lELAorCQkJICAgICAgIEhFUk1FU19CWVRFU19UT19SRUNMRU4oc3RybGVuKHByaXYtPmRlc2lyZWRfZXNzaWQpKzIpLAorCQkJICAgICAgICZpZGJ1Zik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIERFU0lSRURTU0lEXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFNldCB0aGUgc3RhdGlvbiBuYW1lICovCisJaWRidWYubGVuID0gY3B1X3RvX2xlMTYoc3RybGVuKHByaXYtPm5pY2spKTsKKwltZW1jcHkoJmlkYnVmLnZhbCwgcHJpdi0+bmljaywgc2l6ZW9mKGlkYnVmLnZhbCkpOworCWVyciA9IGhlcm1lc193cml0ZV9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORk9XTk5BTUUsCisJCQkgICAgICAgSEVSTUVTX0JZVEVTX1RPX1JFQ0xFTihzdHJsZW4ocHJpdi0+bmljaykrMiksCisJCQkgICAgICAgJmlkYnVmKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgbmlja25hbWVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogU2V0IEFQIGRlbnNpdHkgKi8KKwlpZiAocHJpdi0+aGFzX3NlbnNpdGl2aXR5KSB7CisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZTWVNURU1TQ0FMRSwKKwkJCQkJICAgcHJpdi0+YXBfZGVuc2l0eSk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFcnJvciAlZCBzZXR0aW5nIFNZU1RFTVNDQUxFLiAgIgorCQkJICAgICAgICJEaXNhYmxpbmcgc2Vuc2l0aXZpdHkgY29udHJvbFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisKKwkJCXByaXYtPmhhc19zZW5zaXRpdml0eSA9IDA7CisJCX0KKwl9CisKKwkvKiBTZXQgUlRTIHRocmVzaG9sZCAqLworCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZSVFNUSFJFU0hPTEQsCisJCQkJICAgcHJpdi0+cnRzX3RocmVzaCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIFJUUyB0aHJlc2hvbGRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogU2V0IGZyYWdtZW50YXRpb24gdGhyZXNob2xkIG9yIE1XTyByb2J1c3RuZXNzICovCisJaWYgKHByaXYtPmhhc19td28pCisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZNV09ST0JVU1RfQUdFUkUsCisJCQkJCSAgIHByaXYtPm13b19yb2J1c3QpOworCWVsc2UKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQsCisJCQkJCSAgIHByaXYtPmZyYWdfdGhyZXNoKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgZnJhZ21lbnRhdGlvblxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBTZXQgYml0cmF0ZSAqLworCWVyciA9IF9fb3Jpbm9jb19od19zZXRfYml0cmF0ZShwcml2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgYml0cmF0ZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBTZXQgcG93ZXIgbWFuYWdlbWVudCAqLworCWlmIChwcml2LT5oYXNfcG0pIHsKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORlBNRU5BQkxFRCwKKwkJCQkJICAgcHJpdi0+cG1fb24pOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIHVwIFBNXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GTVVMVElDQVNUUkVDRUlWRSwKKwkJCQkJICAgcHJpdi0+cG1fbWNhc3QpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIHVwIFBNXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORk1BWFNMRUVQRFVSQVRJT04sCisJCQkJCSAgIHByaXYtPnBtX3BlcmlvZCk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgdXAgUE1cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GUE1IT0xET1ZFUkRVUkFUSU9OLAorCQkJCQkgICBwcml2LT5wbV90aW1lb3V0KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyB1cCBQTVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJLyogU2V0IHByZWFtYmxlIC0gb25seSBmb3IgU3ltYm9sIHNvIGZhci4uLiAqLworCWlmIChwcml2LT5oYXNfcHJlYW1ibGUpIHsKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORlBSRUFNQkxFX1NZTUJPTCwKKwkJCQkJICAgcHJpdi0+cHJlYW1ibGUpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIHByZWFtYmxlXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwkvKiBTZXQgdXAgZW5jcnlwdGlvbiAqLworCWlmIChwcml2LT5oYXNfd2VwKSB7CisJCWVyciA9IF9fb3Jpbm9jb19od19zZXR1cF93ZXAocHJpdik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIGFjdGl2YXRpbmcgV0VQXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwkvKiBTZXQgcHJvbWlzY3VpdHkgLyBtdWx0aWNhc3QqLworCXByaXYtPnByb21pc2N1b3VzID0gMDsKKwlwcml2LT5tY19jb3VudCA9IDA7CisJX19vcmlub2NvX3NldF9tdWx0aWNhc3RfbGlzdChkZXYpOyAvKiBGSVhNRTogd2hhdCBhYm91dCB0aGUgeG1pdF9sb2NrICovCisKKwlyZXR1cm4gMDsKK30KKworLyogRklYTUU6IHJldHVybiBpbnQ/ICovCitzdGF0aWMgdm9pZAorX19vcmlub2NvX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcHJvbWlzYywgbWNfY291bnQ7CisKKwkvKiBUaGUgSGVybWVzIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGFuIGFsbG11bHRpIG1vZGUsIHNvIHdlIGdvCisJICogaW50byBwcm9taXNjdW91cyBtb2RlIGFuZCBsZXQgdGhlIHVwcGVyIGxldmVscyBkZWFsLiAqLworCWlmICggKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8CisJICAgICAoZGV2LT5tY19jb3VudCA+IE1BWF9NVUxUSUNBU1QocHJpdikpICkgeworCQlwcm9taXNjID0gMTsKKwkJbWNfY291bnQgPSAwOworCX0gZWxzZSB7CisJCXByb21pc2MgPSAwOworCQltY19jb3VudCA9IGRldi0+bWNfY291bnQ7CisJfQorCisJaWYgKHByb21pc2MgIT0gcHJpdi0+cHJvbWlzY3VvdXMpIHsKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORlBST01JU0NVT1VTTU9ERSwKKwkJCQkJICAgcHJvbWlzYyk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgUFJPTUlTQ1VPVVNNT0RFIHRvIDEuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJfSBlbHNlIAorCQkJcHJpdi0+cHJvbWlzY3VvdXMgPSBwcm9taXNjOworCX0KKworCWlmICghIHByb21pc2MgJiYgKG1jX2NvdW50IHx8IHByaXYtPm1jX2NvdW50KSApIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICpwID0gZGV2LT5tY19saXN0OworCQlzdHJ1Y3QgaGVybWVzX211bHRpY2FzdCBtY2xpc3Q7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBtY19jb3VudDsgaSsrKSB7CisJCQkvKiBwYXJhbm9pYTogaXMgbGlzdCBzaG9ydGVyIHRoYW4gbWNfY291bnQ/ICovCisJCQlCVUdfT04oISBwKTsKKwkJCS8qIHBhcmFub2lhOiBiYWQgYWRkcmVzcyBzaXplIGluIGxpc3Q/ICovCisJCQlCVUdfT04ocC0+ZG1pX2FkZHJsZW4gIT0gRVRIX0FMRU4pOworCQkJCisJCQltZW1jcHkobWNsaXN0LmFkZHJbaV0sIHAtPmRtaV9hZGRyLCBFVEhfQUxFTik7CisJCQlwID0gcC0+bmV4dDsKKwkJfQorCQkKKwkJaWYgKHApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTXVsdGljYXN0IGxpc3QgaXMgIgorCQkJICAgICAgICJsb25nZXIgdGhhbiBtY19jb3VudFxuIiwgZGV2LT5uYW1lKTsKKworCQllcnIgPSBoZXJtZXNfd3JpdGVfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZHUk9VUEFERFJFU1NFUywKKwkJCQkgICAgICAgSEVSTUVTX0JZVEVTX1RPX1JFQ0xFTihwcml2LT5tY19jb3VudCAqIEVUSF9BTEVOKSwKKwkJCQkgICAgICAgJm1jbGlzdCk7CisJCWlmIChlcnIpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIG11bHRpY2FzdCBsaXN0LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCWVsc2UKKwkJCXByaXYtPm1jX2NvdW50ID0gbWNfY291bnQ7CisJfQorCisJLyogU2luY2Ugd2UgY2FuIHNldCB0aGUgcHJvbWlzY3VvdXMgZmxhZyB3aGVuIGl0IHdhc24ndCBhc2tlZAorCSAgIGZvciwgbWFrZSBzdXJlIHRoZSBuZXRfZGV2aWNlIGtub3dzIGFib3V0IGl0LiAqLworCWlmIChwcml2LT5wcm9taXNjdW91cykKKwkJZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKKwllbHNlCisJCWRldi0+ZmxhZ3MgJj0gfklGRl9QUk9NSVNDOworfQorCitzdGF0aWMgaW50IG9yaW5vY29fcmVjb25maWd1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIgPSAwOworCisJaWYgKHByaXYtPmJyb2tlbl9kaXNhYmxlcG9ydCkgeworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJCQorCWVyciA9IGhlcm1lc19kaXNhYmxlX3BvcnQoaHcsIDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBkaXNhYmxlIHBvcnQgd2hpbGUgcmVjb25maWd1cmluZyBjYXJkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcHJpdi0+YnJva2VuX2Rpc2FibGVwb3J0ID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gX19vcmlub2NvX3Byb2dyYW1fcmlkcyhkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byByZWNvbmZpZ3VyZSBjYXJkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gaGVybWVzX2VuYWJsZV9wb3J0KGh3LCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gZW5hYmxlIHBvcnQgd2hpbGUgcmVjb25maWd1cmluZyBjYXJkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisgb3V0OgorCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlc2V0dGluZyBpbnN0ZWFkLi4uXG4iLCBkZXYtPm5hbWUpOworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKKwkJZXJyID0gMDsKKwl9CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCXJldHVybiBlcnI7CisKK30KKworLyogVGhpcyBtdXN0IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29udGV4dCwgd2l0aG91dCBsb2NrcyBoZWxkIC0gdXNlCisgKiBzY2hlZHVsZV93b3JrKCkgKi8KK3N0YXRpYyB2b2lkIG9yaW5vY29fcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCS8qIFdoZW4gdGhlIGhhcmR3YXJlIGJlY29tZXMgYXZhaWxhYmxlIGFnYWluLCB3aGF0ZXZlcgorCQkgKiBkZXRlY3RzIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHJlLWluaXRpYWxpemluZworCQkgKiBpdC4gU28gbm8gbmVlZCBmb3IgYW55dGhpbmcgZnVydGhlciAqLworCQlyZXR1cm47CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBTaHV0IG9mZiBpbnRlcnJ1cHRzLiAgRGVwZW5kaW5nIG9uIHdoYXQgc3RhdGUgdGhlIGhhcmR3YXJlCisJICogaXMgaW4sIHRoaXMgbWlnaHQgbm90IHdvcmssIGJ1dCB3ZSdsbCB0cnkgYW55d2F5ICovCisJaGVybWVzX3NldF9pcnFtYXNrKGh3LCAwKTsKKwloZXJtZXNfd3JpdGVfcmVnbihodywgRVZBQ0ssIDB4ZmZmZik7CisKKwlwcml2LT5od191bmF2YWlsYWJsZSsrOworCXByaXYtPmxhc3RfbGlua3N0YXR1cyA9IDB4ZmZmZjsgLyogZmlybXdhcmUgd2lsbCBoYXZlIHRvIHJlYXNzb2NpYXRlICovCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlpZiAocHJpdi0+aGFyZF9yZXNldCkKKwkJZXJyID0gKCpwcml2LT5oYXJkX3Jlc2V0KShwcml2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG9yaW5vY29fcmVzZXQ6IEVycm9yICVkICIKKwkJICAgICAgICJwZXJmb3JtaW5nICBoYXJkIHJlc2V0XG4iLCBkZXYtPm5hbWUsIGVycik7CisJCS8qIEZJWE1FOiBzaHV0ZG93biBvZiBzb21lIHNvcnQgKi8KKwkJcmV0dXJuOworCX0KKworCWVyciA9IG9yaW5vY29fcmVpbml0X2Zpcm13YXJlKGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvcmlub2NvX3Jlc2V0OiBFcnJvciAlZCByZS1pbml0aWFsaXppbmcgZmlybXdhcmVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZwcml2LT5sb2NrKTsgLyogVGhpcyBoYXMgdG8gYmUgY2FsbGVkIGZyb20gdXNlciBjb250ZXh0ICovCisKKwlwcml2LT5od191bmF2YWlsYWJsZS0tOworCisJLyogcHJpdi0+b3BlbiBvciBwcml2LT5od191bmF2YWlsYWJsZSBtaWdodCBoYXZlIGNoYW5nZWQgd2hpbGUKKwkgKiB3ZSBkcm9wcGVkIHRoZSBsb2NrICovCisJaWYgKHByaXYtPm9wZW4gJiYgKCEgcHJpdi0+aHdfdW5hdmFpbGFibGUpKSB7CisJCWVyciA9IF9fb3Jpbm9jb191cChkZXYpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvcmlub2NvX3Jlc2V0OiBFcnJvciAlZCByZWVuYWJsaW5nIGNhcmRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQl9IGVsc2UKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCX0KKworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVycnVwdCBoYW5kbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X3RpY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQoreworCXByaW50ayhLRVJOX0RFQlVHICIlczogVElDS1xuIiwgZGV2LT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X3d0ZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3sKKwkvKiBUaGlzIHNlZW1zIHRvIGhhcHBlbiBhIGZhaXIgYml0IHVuZGVyIGxvYWQsIGJ1dCBpZ25vcmluZyBpdAorCSAgIHNlZW1zIHRvIHdvcmsgZmluZS4uLiovCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNQUMgY29udHJvbGxlciBlcnJvciAoV1RFUlIpLiBJZ25vcmluZy5cbiIsCisJICAgICAgIGRldi0+bmFtZSk7Cit9CisKK2lycXJldHVybl90IG9yaW5vY29faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGNvdW50ID0gTUFYX0lSUUxPT1BTX1BFUl9JUlE7CisJdTE2IGV2c3RhdCwgZXZlbnRzOworCS8qIFRoZXNlIGFyZSB1c2VkIHRvIGRldGVjdCBhIHJ1bmF3YXkgaW50ZXJydXB0IHNpdHVhdGlvbiAqLworCS8qIElmIHdlIGdldCBtb3JlIHRoYW4gTUFYX0lSUUxPT1BTX1BFUl9KSUZGWSBpdGVyYXRpb25zIGluIGEgamlmZnksCisJICogd2UgcGFuaWMgYW5kIHNodXQgZG93biB0aGUgaGFyZHdhcmUgKi8KKwlzdGF0aWMgaW50IGxhc3RfaXJxX2ppZmZ5ID0gMDsgLyogamlmZmllcyB2YWx1ZSB0aGUgbGFzdCB0aW1lCisJCQkJCSogd2Ugd2VyZSBjYWxsZWQgKi8KKwlzdGF0aWMgaW50IGxvb3BzX3RoaXNfamlmZnkgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkgeworCQkvKiBJZiBodyBpcyB1bmF2YWlsYWJsZSAtIHdlIGRvbid0IGtub3cgaWYgdGhlIGlycSB3YXMKKwkJICogZm9yIHVzIG9yIG5vdCAqLworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJZXZzdGF0ID0gaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKTsKKwlldmVudHMgPSBldnN0YXQgJiBody0+aW50ZW47CisJaWYgKCEgZXZlbnRzKSB7CisJCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJCisJaWYgKGppZmZpZXMgIT0gbGFzdF9pcnFfamlmZnkpCisJCWxvb3BzX3RoaXNfamlmZnkgPSAwOworCWxhc3RfaXJxX2ppZmZ5ID0gamlmZmllczsKKworCXdoaWxlIChldmVudHMgJiYgY291bnQtLSkgeworCQlpZiAoKytsb29wc190aGlzX2ppZmZ5ID4gTUFYX0lSUUxPT1BTX1BFUl9KSUZGWSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IElSUSBoYW5kbGVyIGlzIGxvb3BpbmcgdG9vICIKKwkJCSAgICAgICAibXVjaCEgUmVzZXR0aW5nLlxuIiwgZGV2LT5uYW1lKTsKKwkJCS8qIERpc2FibGUgaW50ZXJydXB0cyBmb3Igbm93ICovCisJCQloZXJtZXNfc2V0X2lycW1hc2soaHcsIDApOworCQkJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfd29yayk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIENoZWNrIHRoZSBjYXJkIGhhc24ndCBiZWVuIHJlbW92ZWQgKi8KKwkJaWYgKCEgaGVybWVzX3ByZXNlbnQoaHcpKSB7CisJCQlERUJVRygwLCAib3Jpbm9jb19pbnRlcnJ1cHQoKTogY2FyZCByZW1vdmVkXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGV2ZW50cyAmIEhFUk1FU19FVl9USUNLKQorCQkJX19vcmlub2NvX2V2X3RpY2soZGV2LCBodyk7CisJCWlmIChldmVudHMgJiBIRVJNRVNfRVZfV1RFUlIpCisJCQlfX29yaW5vY29fZXZfd3RlcnIoZGV2LCBodyk7CisJCWlmIChldmVudHMgJiBIRVJNRVNfRVZfSU5GRFJPUCkKKwkJCV9fb3Jpbm9jb19ldl9pbmZkcm9wKGRldiwgaHcpOworCQlpZiAoZXZlbnRzICYgSEVSTUVTX0VWX0lORk8pCisJCQlfX29yaW5vY29fZXZfaW5mbyhkZXYsIGh3KTsKKwkJaWYgKGV2ZW50cyAmIEhFUk1FU19FVl9SWCkKKwkJCV9fb3Jpbm9jb19ldl9yeChkZXYsIGh3KTsKKwkJaWYgKGV2ZW50cyAmIEhFUk1FU19FVl9UWEVYQykKKwkJCV9fb3Jpbm9jb19ldl90eGV4YyhkZXYsIGh3KTsKKwkJaWYgKGV2ZW50cyAmIEhFUk1FU19FVl9UWCkKKwkJCV9fb3Jpbm9jb19ldl90eChkZXYsIGh3KTsKKwkJaWYgKGV2ZW50cyAmIEhFUk1FU19FVl9BTExPQykKKwkJCV9fb3Jpbm9jb19ldl9hbGxvYyhkZXYsIGh3KTsKKwkJCisJCWhlcm1lc193cml0ZV9yZWduKGh3LCBFVkFDSywgZXZlbnRzKTsKKworCQlldnN0YXQgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOworCQlldmVudHMgPSBldnN0YXQgJiBody0+aW50ZW47CisJfTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBjb21wX2lkIHsKKwl1MTYgaWQsIHZhcmlhbnQsIG1ham9yLCBtaW5vcjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgaW5saW5lIGZ3dHlwZV90IGRldGVybWluZV9maXJtd2FyZV90eXBlKHN0cnVjdCBjb21wX2lkICpuaWNfaWQpCit7CisJaWYgKG5pY19pZC0+aWQgPCAweDgwMDApCisJCXJldHVybiBGSVJNV0FSRV9UWVBFX0FHRVJFOworCWVsc2UgaWYgKG5pY19pZC0+aWQgPT0gMHg4MDAwICYmIG5pY19pZC0+bWFqb3IgPT0gMCkKKwkJcmV0dXJuIEZJUk1XQVJFX1RZUEVfU1lNQk9MOworCWVsc2UKKwkJcmV0dXJuIEZJUk1XQVJFX1RZUEVfSU5URVJTSUw7Cit9CisKKy8qIFNldCBwcml2LT5maXJtd2FyZSB0eXBlLCBkZXRlcm1pbmUgZmlybXdhcmUgcHJvcGVydGllcyAqLworc3RhdGljIGludCBkZXRlcm1pbmVfZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVycjsKKwlzdHJ1Y3QgY29tcF9pZCBuaWNfaWQsIHN0YV9pZDsKKwl1bnNpZ25lZCBpbnQgZmlybXZlcjsKKwljaGFyIHRtcFtTWU1CT0xfTUFYX1ZFUl9MRU4rMV07CisKKwkvKiBHZXQgdGhlIGhhcmR3YXJlIHZlcnNpb24gKi8KKwllcnIgPSBIRVJNRVNfUkVBRF9SRUNPUkQoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX05JQ0lELCAmbmljX2lkKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCByZWFkIGhhcmR3YXJlIGlkZW50aXR5OiBlcnJvciAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlsZTE2X3RvX2NwdXMoJm5pY19pZC5pZCk7CisJbGUxNl90b19jcHVzKCZuaWNfaWQudmFyaWFudCk7CisJbGUxNl90b19jcHVzKCZuaWNfaWQubWFqb3IpOworCWxlMTZfdG9fY3B1cygmbmljX2lkLm1pbm9yKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEhhcmR3YXJlIGlkZW50aXR5ICUwNHg6JTA0eDolMDR4OiUwNHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgbmljX2lkLmlkLCBuaWNfaWQudmFyaWFudCwKKwkgICAgICAgbmljX2lkLm1ham9yLCBuaWNfaWQubWlub3IpOworCisJcHJpdi0+ZmlybXdhcmVfdHlwZSA9IGRldGVybWluZV9maXJtd2FyZV90eXBlKCZuaWNfaWQpOworCisJLyogR2V0IHRoZSBmaXJtd2FyZSB2ZXJzaW9uICovCisJZXJyID0gSEVSTUVTX1JFQURfUkVDT1JEKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9TVEFJRCwgJnN0YV9pZCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgcmVhZCBzdGF0aW9uIGlkZW50aXR5OiBlcnJvciAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlsZTE2X3RvX2NwdXMoJnN0YV9pZC5pZCk7CisJbGUxNl90b19jcHVzKCZzdGFfaWQudmFyaWFudCk7CisJbGUxNl90b19jcHVzKCZzdGFfaWQubWFqb3IpOworCWxlMTZfdG9fY3B1cygmc3RhX2lkLm1pbm9yKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFN0YXRpb24gaWRlbnRpdHkgICUwNHg6JTA0eDolMDR4OiUwNHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgc3RhX2lkLmlkLCBzdGFfaWQudmFyaWFudCwKKwkgICAgICAgc3RhX2lkLm1ham9yLCBzdGFfaWQubWlub3IpOworCisJc3dpdGNoIChzdGFfaWQuaWQpIHsKKwljYXNlIDB4MTU6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFByaW1hcnkgZmlybXdhcmUgaXMgYWN0aXZlXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2FzZSAweDE0YjoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVGVydGlhcnkgZmlybXdhcmUgaXMgYWN0aXZlXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2FzZSAweDFmOgkvKiBJbnRlcnNpbCwgQWdlcmUsIFN5bWJvbCBTcGVjdHJ1bTI0ICovCisJY2FzZSAweDIxOgkvKiBTeW1ib2wgU3BlY3RydW0yNCBUcmlsb2d5ICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFVua25vd24gc3RhdGlvbiBJRCwgcGxlYXNlIHJlcG9ydFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWJyZWFrOworCX0KKworCS8qIERlZmF1bHQgY2FwYWJpbGl0aWVzICovCisJcHJpdi0+aGFzX3NlbnNpdGl2aXR5ID0gMTsKKwlwcml2LT5oYXNfbXdvID0gMDsKKwlwcml2LT5oYXNfcHJlYW1ibGUgPSAwOworCXByaXYtPmhhc19wb3J0MyA9IDE7CisJcHJpdi0+aGFzX2lic3MgPSAxOworCXByaXYtPmhhc193ZXAgPSAwOworCXByaXYtPmhhc19iaWdfd2VwID0gMDsKKworCS8qIERldGVybWluZSBjYXBhYmlsaXRpZXMgZnJvbSB0aGUgZmlybXdhcmUgdmVyc2lvbiAqLworCXN3aXRjaCAocHJpdi0+ZmlybXdhcmVfdHlwZSkgeworCWNhc2UgRklSTVdBUkVfVFlQRV9BR0VSRToKKwkJLyogTHVjZW50IFdhdmVsYW4gSUVFRSwgTHVjZW50IE9yaW5vY28sIENhYmxldHJvbiBSb2FtQWJvdXQsCisJCSAgIEVMU0EsIE1lbGNvLCBIUCwgSUJNLCBEZWxsIDExNTAsIENvbXBhcSAxMTAvMjEwICovCisJCXNucHJpbnRmKHByaXYtPmZ3X25hbWUsIHNpemVvZihwcml2LT5md19uYW1lKSAtIDEsCisJCQkgIkx1Y2VudC9BZ2VyZSAlZC4lMDJkIiwgc3RhX2lkLm1ham9yLCBzdGFfaWQubWlub3IpOworCisJCWZpcm12ZXIgPSAoKHVuc2lnbmVkIGxvbmcpc3RhX2lkLm1ham9yIDw8IDE2KSB8IHN0YV9pZC5taW5vcjsKKworCQlwcml2LT5oYXNfaWJzcyA9IChmaXJtdmVyID49IDB4NjAwMDYpOworCQlwcml2LT5oYXNfd2VwID0gKGZpcm12ZXIgPj0gMHg0MDAyMCk7CisJCXByaXYtPmhhc19iaWdfd2VwID0gMTsgLyogRklYTUU6IHRoaXMgaXMgd3JvbmcgLSBob3cgZG8gd2UgdGVsbAorCQkJCQkgIEdvbGQgY2FyZHMgZnJvbSB0aGUgb3RoZXJzPyAqLworCQlwcml2LT5oYXNfbXdvID0gKGZpcm12ZXIgPj0gMHg2MDAwMCk7CisJCXByaXYtPmhhc19wbSA9IChmaXJtdmVyID49IDB4NDAwMjApOyAvKiBEb24ndCB3b3JrIGluIDcuNTIgPyAqLworCQlwcml2LT5pYnNzX3BvcnQgPSAxOworCisJCS8qIFRlc3RlZCB3aXRoIEFnZXJlIGZpcm13YXJlIDoKKwkJICoJMS4xNiA7IDQuMDggOyA0LjUyIDsgNi4wNCA7IDYuMTYgOyA3LjI4ID0+IEplYW4gSUkKKwkJICogVGVzdGVkIENhYmxlVHJvbiBmaXJtd2FyZSA6IDQuMzIgPT4gQW50b24gKi8KKwkJYnJlYWs7CisJY2FzZSBGSVJNV0FSRV9UWVBFX1NZTUJPTDoKKwkJLyogU3ltYm9sICwgM0NvbSBBaXJDb25uZWN0LCBJbnRlbCwgRXJpY3Nzb24gV0xBTiAqLworCQkvKiBJbnRlbCBNQUMgOiAwMDowMjpCMzoqICovCisJCS8qIDNDb20gTUFDIDogMDA6NTA6REE6KiAqLworCQltZW1zZXQodG1wLCAwLCBzaXplb2YodG1wKSk7CisJCS8qIEdldCB0aGUgU3ltYm9sIGZpcm13YXJlIHZlcnNpb24gKi8KKwkJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwKKwkJCQkgICAgICBIRVJNRVNfUklEX1NFQ09OREFSWVZFUlNJT05fU1lNQk9MLAorCQkJCSAgICAgIFNZTUJPTF9NQVhfVkVSX0xFTiwgTlVMTCwgJnRtcCk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IEVycm9yICVkIHJlYWRpbmcgU3ltYm9sIGZpcm13YXJlIGluZm8uIFdpbGRseSBndWVzc2luZyBjYXBhYmlsaXRpZXMuLi5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJZmlybXZlciA9IDA7CisJCQl0bXBbMF0gPSAnXDAnOworCQl9IGVsc2UgeworCQkJLyogVGhlIGZpcm13YXJlIHJldmlzaW9uIGlzIGEgc3RyaW5nLCB0aGUgZm9ybWF0IGlzCisJCQkgKiBzb21ldGhpbmcgbGlrZSA6ICJWMi4yMC0wMSIuCisJCQkgKiBRdWljayBhbmQgZGlydHkgcGFyc2luZy4uLiAtIEplYW4gSUkKKwkJCSAqLworCQkJZmlybXZlciA9ICgodG1wWzFdIC0gJzAnKSA8PCAxNikgfCAoKHRtcFszXSAtICcwJykgPDwgMTIpCisJCQkJfCAoKHRtcFs0XSAtICcwJykgPDwgOCkgfCAoKHRtcFs2XSAtICcwJykgPDwgNCkKKwkJCQl8ICh0bXBbN10gLSAnMCcpOworCisJCQl0bXBbU1lNQk9MX01BWF9WRVJfTEVOXSA9ICdcMCc7CisJCX0KKworCQlzbnByaW50Zihwcml2LT5md19uYW1lLCBzaXplb2YocHJpdi0+ZndfbmFtZSkgLSAxLAorCQkJICJTeW1ib2wgJXMiLCB0bXApOworCisJCXByaXYtPmhhc19pYnNzID0gKGZpcm12ZXIgPj0gMHgyMDAwMCk7CisJCXByaXYtPmhhc193ZXAgPSAoZmlybXZlciA+PSAweDE1MDEyKTsKKwkJcHJpdi0+aGFzX2JpZ193ZXAgPSAoZmlybXZlciA+PSAweDIwMDAwKTsKKwkJcHJpdi0+aGFzX3BtID0gKGZpcm12ZXIgPj0gMHgyMDAwMCAmJiBmaXJtdmVyIDwgMHgyMjAwMCkgfHwgCisJCQkgICAgICAgKGZpcm12ZXIgPj0gMHgyOTAwMCAmJiBmaXJtdmVyIDwgMHgzMDAwMCkgfHwKKwkJCSAgICAgICBmaXJtdmVyID49IDB4MzEwMDA7CisJCXByaXYtPmhhc19wcmVhbWJsZSA9IChmaXJtdmVyID49IDB4MjAwMDApOworCQlwcml2LT5pYnNzX3BvcnQgPSA0OworCQkvKiBUZXN0ZWQgd2l0aCBJbnRlbCBmaXJtd2FyZSA6IDB4MjAwMTUgPT4gSmVhbiBJSSAqLworCQkvKiBUZXN0ZWQgd2l0aCAzQ29tIGZpcm13YXJlIDogMHgxNTAxMiAmIDB4MjIwMDEgPT4gSmVhbiBJSSAqLworCQlicmVhazsKKwljYXNlIEZJUk1XQVJFX1RZUEVfSU5URVJTSUw6CisJCS8qIEQtTGluaywgTGlua3N5cywgQWR0cm9uLCBab29tQWlyLCBhbmQgbWFueSBvdGhlcnMuLi4KKwkJICogU2Ftc3VuZywgQ29tcGFxIDEwMC8yMDAgYW5kIFByb3hpbSBhcmUgc2xpZ2h0bHkKKwkJICogZGlmZmVyZW50IGFuZCBsZXNzIHdlbGwgdGVzdGVkICovCisJCS8qIEQtTGluayBNQUMgOiAwMDo0MDowNToqICovCisJCS8qIEFkZHRyb24gTUFDIDogMDA6OTA6RDE6KiAqLworCQlzbnByaW50Zihwcml2LT5md19uYW1lLCBzaXplb2YocHJpdi0+ZndfbmFtZSkgLSAxLAorCQkJICJJbnRlcnNpbCAlZC4lZC4lZCIsIHN0YV9pZC5tYWpvciwgc3RhX2lkLm1pbm9yLAorCQkJIHN0YV9pZC52YXJpYW50KTsKKworCQlmaXJtdmVyID0gKCh1bnNpZ25lZCBsb25nKXN0YV9pZC5tYWpvciA8PCAxNikgfAorCQkJKCh1bnNpZ25lZCBsb25nKXN0YV9pZC5taW5vciA8PCA4KSB8IHN0YV9pZC52YXJpYW50OworCisJCXByaXYtPmhhc19pYnNzID0gKGZpcm12ZXIgPj0gMHgwMDA3MDApOyAvKiBGSVhNRSAqLworCQlwcml2LT5oYXNfYmlnX3dlcCA9IHByaXYtPmhhc193ZXAgPSAoZmlybXZlciA+PSAweDAwMDgwMCk7CisJCXByaXYtPmhhc19wbSA9IChmaXJtdmVyID49IDB4MDAwNzAwKTsKKworCQlpZiAoZmlybXZlciA+PSAweDAwMDgwMCkKKwkJCXByaXYtPmlic3NfcG9ydCA9IDA7CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogSW50ZXJzaWwgZmlybXdhcmUgZWFybGllciAiCisJCQkgICAgICAgInRoYW4gdjAuOC54IC0gc2V2ZXJhbCBmZWF0dXJlcyBub3Qgc3VwcG9ydGVkXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlwcml2LT5pYnNzX3BvcnQgPSAxOworCQl9CisJCWJyZWFrOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEZpcm13YXJlIGRldGVybWluZWQgYXMgJXNcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgcHJpdi0+ZndfbmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGhlcm1lc19pZHN0cmluZyBuaWNrYnVmOworCXUxNiByZWNsZW47CisJaW50IGxlbjsKKworCVRSQUNFX0VOVEVSKGRldi0+bmFtZSk7CisKKwkvKiBObyBuZWVkIHRvIGxvY2ssIHRoZSBod191bmF2YWlsYWJsZSBmbGFnIGlzIGFscmVhZHkgc2V0IGluCisJICogYWxsb2Nfb3Jpbm9jb2RldigpICovCisJcHJpdi0+bmljYnVmX3NpemUgPSBJRUVFODAyXzExX0ZSQU1FX0xFTiArIEVUSF9ITEVOOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZmlybXdhcmUgKi8KKwllcnIgPSBoZXJtZXNfaW5pdChodyk7CisJaWYgKGVyciAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBpbml0aWFsaXplIGZpcm13YXJlIChlcnIgPSAlZClcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IGRldGVybWluZV9maXJtd2FyZShkZXYpOworCWlmIChlcnIgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbmNvbXBhdGlibGUgZmlybXdhcmUsIGFib3J0aW5nXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHByaXYtPmhhc19wb3J0MykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBZC1ob2MgZGVtbyBtb2RlIHN1cHBvcnRlZFxuIiwgZGV2LT5uYW1lKTsKKwlpZiAocHJpdi0+aGFzX2lic3MpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogSUVFRSBzdGFuZGFyZCBJQlNTIGFkLWhvYyBtb2RlIHN1cHBvcnRlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJaWYgKHByaXYtPmhhc193ZXApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBXRVAgc3VwcG9ydGVkLCAiLCBkZXYtPm5hbWUpOworCQlpZiAocHJpdi0+aGFzX2JpZ193ZXApCisJCQlwcmludGsoIjEwNC1iaXQga2V5XG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCI0MC1iaXQga2V5XG4iKTsKKwl9CisKKwkvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCisJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZPV05NQUNBRERSLAorCQkJICAgICAgRVRIX0FMRU4sIE5VTEwsIGRldi0+ZGV2X2FkZHIpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCB0byByZWFkIE1BQyBhZGRyZXNzIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogTUFDIGFkZHJlc3MgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwKKwkgICAgICAgZGV2LT5kZXZfYWRkclsyXSwgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwKKwkgICAgICAgZGV2LT5kZXZfYWRkcls1XSk7CisKKwkvKiBHZXQgdGhlIHN0YXRpb24gbmFtZSAqLworCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GT1dOTkFNRSwKKwkJCSAgICAgIHNpemVvZihuaWNrYnVmKSwgJnJlY2xlbiwgJm5pY2tidWYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlYWQgc3RhdGlvbiBuYW1lXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChuaWNrYnVmLmxlbikKKwkJbGVuID0gbWluKElXX0VTU0lEX01BWF9TSVpFLCAoaW50KWxlMTZfdG9fY3B1KG5pY2tidWYubGVuKSk7CisJZWxzZQorCQlsZW4gPSBtaW4oSVdfRVNTSURfTUFYX1NJWkUsIDIgKiByZWNsZW4pOworCW1lbWNweShwcml2LT5uaWNrLCAmbmlja2J1Zi52YWwsIGxlbik7CisJcHJpdi0+bmlja1tsZW5dID0gJ1wwJzsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogU3RhdGlvbiBuYW1lIFwiJXNcIlxuIiwgZGV2LT5uYW1lLCBwcml2LT5uaWNrKTsKKworCS8qIEdldCBhbGxvd2VkIGNoYW5uZWxzICovCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ0hBTk5FTExJU1QsCisJCQkJICAmcHJpdi0+Y2hhbm5lbF9tYXNrKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWFkIGNoYW5uZWwgbGlzdCFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBHZXQgaW5pdGlhbCBBUCBkZW5zaXR5ICovCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GU1lTVEVNU0NBTEUsCisJCQkJICAmcHJpdi0+YXBfZGVuc2l0eSk7CisJaWYgKGVyciB8fCBwcml2LT5hcF9kZW5zaXR5IDwgMSB8fCBwcml2LT5hcF9kZW5zaXR5ID4gMykgeworCQlwcml2LT5oYXNfc2Vuc2l0aXZpdHkgPSAwOworCX0KKworCS8qIEdldCBpbml0aWFsIFJUUyB0aHJlc2hvbGQgKi8KKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZSVFNUSFJFU0hPTEQsCisJCQkJICAmcHJpdi0+cnRzX3RocmVzaCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVhZCBSVFMgdGhyZXNob2xkIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEdldCBpbml0aWFsIGZyYWdtZW50YXRpb24gc2V0dGluZ3MgKi8KKwlpZiAocHJpdi0+aGFzX213bykKKwkJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgSEVSTUVTX1JJRF9DTkZNV09ST0JVU1RfQUdFUkUsCisJCQkJCSAgJnByaXYtPm13b19yb2J1c3QpOworCWVsc2UKKwkJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GRlJBR01FTlRBVElPTlRIUkVTSE9MRCwKKwkJCQkJICAmcHJpdi0+ZnJhZ190aHJlc2gpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlYWQgZnJhZ21lbnRhdGlvbiBzZXR0aW5ncyFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBQb3dlciBtYW5hZ2VtZW50IHNldHVwICovCisJaWYgKHByaXYtPmhhc19wbSkgeworCQlwcml2LT5wbV9vbiA9IDA7CisJCXByaXYtPnBtX21jYXN0ID0gMTsKKwkJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgSEVSTUVTX1JJRF9DTkZNQVhTTEVFUERVUkFUSU9OLAorCQkJCQkgICZwcml2LT5wbV9wZXJpb2QpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVhZCBwb3dlciBtYW5hZ2VtZW50IHBlcmlvZCFcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgIEhFUk1FU19SSURfQ05GUE1IT0xET1ZFUkRVUkFUSU9OLAorCQkJCQkgICZwcml2LT5wbV90aW1lb3V0KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlYWQgcG93ZXIgbWFuYWdlbWVudCB0aW1lb3V0IVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBQcmVhbWJsZSBzZXR1cCAqLworCWlmIChwcml2LT5oYXNfcHJlYW1ibGUpIHsKKwkJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgSEVSTUVTX1JJRF9DTkZQUkVBTUJMRV9TWU1CT0wsCisJCQkJCSAgJnByaXYtPnByZWFtYmxlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKwkJCisJLyogU2V0IHVwIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKwlwcml2LT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkvKiBCeSBkZWZhdWx0IHVzZSBJRUVFL0lCU1MgYWQtaG9jIG1vZGUgaWYgd2UgaGF2ZSBpdCAqLworCXByaXYtPnByZWZlcl9wb3J0MyA9IHByaXYtPmhhc19wb3J0MyAmJiAoISBwcml2LT5oYXNfaWJzcyk7CisJc2V0X3BvcnRfdHlwZShwcml2KTsKKwlwcml2LT5jaGFubmVsID0gMTA7IC8qIGRlZmF1bHQgY2hhbm5lbCwgbW9yZS1vci1sZXNzIGFyYml0cmFyeSAqLworCisJcHJpdi0+cHJvbWlzY3VvdXMgPSAwOworCXByaXYtPndlcF9vbiA9IDA7CisJcHJpdi0+dHhfa2V5ID0gMDsKKworCWVyciA9IGhlcm1lc19hbGxvY2F0ZShodywgcHJpdi0+bmljYnVmX3NpemUsICZwcml2LT50eGZpZCk7CisJaWYgKGVyciA9PSAtRUlPKSB7CisJCS8qIFRyeSB3b3JrYXJvdW5kIGZvciBvbGQgU3ltYm9sIGZpcm13YXJlIGJ1ZyAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmlybXdhcmUgQUxMT0MgYnVnIGRldGVjdGVkICIKKwkJICAgICAgICIob2xkIFN5bWJvbCBmaXJtd2FyZT8pLiBUcnlpbmcgdG8gd29yayBhcm91bmQuLi4gIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCQorCQlwcml2LT5uaWNidWZfc2l6ZSA9IFRYX05JQ0JVRl9TSVpFX0JVRzsKKwkJZXJyID0gaGVybWVzX2FsbG9jYXRlKGh3LCBwcml2LT5uaWNidWZfc2l6ZSwgJnByaXYtPnR4ZmlkKTsKKwkJaWYgKGVycikKKwkJCXByaW50aygiZmFpbGVkIVxuIik7CisJCWVsc2UKKwkJCXByaW50aygib2suXG4iKTsKKwl9CisJaWYgKGVycikgeworCQlwcmludGsoIiVzOiBFcnJvciAlZCBhbGxvY2F0aW5nIFR4IGJ1ZmZlclxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBNYWtlIHRoZSBoYXJkd2FyZSBhdmFpbGFibGUsIGFzIGxvbmcgYXMgaXQgaGFzbid0IGJlZW4KKwkgKiByZW1vdmVkIGVsc2V3aGVyZSAoZS5nLiBieSBQQ01DSUEgaG90IHVucGx1ZykgKi8KKwlzcGluX2xvY2tfaXJxKCZwcml2LT5sb2NrKTsKKwlwcml2LT5od191bmF2YWlsYWJsZS0tOworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlYWR5XG4iLCBkZXYtPm5hbWUpOworCisgb3V0OgorCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2Nfb3Jpbm9jb2RldihpbnQgc2l6ZW9mX2NhcmQsCisJCQkJICAgIGludCAoKmhhcmRfcmVzZXQpKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKikpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2OworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUpICsgc2l6ZW9mX2NhcmQpOworCWlmICghIGRldikKKwkJcmV0dXJuIE5VTEw7CisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcHJpdi0+bmRldiA9IGRldjsKKwlpZiAoc2l6ZW9mX2NhcmQpCisJCXByaXYtPmNhcmQgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZyluZXRkZXZfcHJpdihkZXYpCisJCQkJICAgICAgKyBzaXplb2Yoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSkpOworCWVsc2UKKwkJcHJpdi0+Y2FyZCA9IE5VTEw7CisKKwkvKiBTZXR1cCAvIG92ZXJyaWRlIG5ldF9kZXZpY2UgZmllbGRzICovCisJZGV2LT5pbml0ID0gb3Jpbm9jb19pbml0OworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gb3Jpbm9jb194bWl0OworCWRldi0+dHhfdGltZW91dCA9IG9yaW5vY29fdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gSFo7IC8qIDEgc2Vjb25kIHRpbWVvdXQgKi8KKwlkZXYtPmdldF9zdGF0cyA9IG9yaW5vY29fZ2V0X3N0YXRzOworCWRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gb3Jpbm9jb19nZXRfd2lyZWxlc3Nfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9IG9yaW5vY29faW9jdGw7CisJZGV2LT5jaGFuZ2VfbXR1ID0gb3Jpbm9jb19jaGFuZ2VfbXR1OworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gb3Jpbm9jb19zZXRfbXVsdGljYXN0X2xpc3Q7CisJLyogd2UgdXNlIHRoZSBkZWZhdWx0IGV0aF9tYWNfYWRkciBmb3Igc2V0dGluZyB0aGUgTUFDIGFkZHIgKi8KKworCS8qIFNldCB1cCBkZWZhdWx0IGNhbGxiYWNrcyAqLworCWRldi0+b3BlbiA9IG9yaW5vY29fb3BlbjsKKwlkZXYtPnN0b3AgPSBvcmlub2NvX3N0b3A7CisJcHJpdi0+aGFyZF9yZXNldCA9IGhhcmRfcmVzZXQ7CisKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisJcHJpdi0+b3BlbiA9IDA7CisJcHJpdi0+aHdfdW5hdmFpbGFibGUgPSAxOyAvKiBvcmlub2NvX2luaXQoKSBtdXN0IGNsZWFyIHRoaXMKKwkJCQkgICAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRvdWNoZXMgdGhlCisJCQkJICAgKiBoYXJkd2FyZSAqLworCUlOSVRfV09SSygmcHJpdi0+cmVzZXRfd29yaywgKHZvaWQgKCopKHZvaWQgKikpb3Jpbm9jb19yZXNldCwgZGV2KTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJcHJpdi0+bGFzdF9saW5rc3RhdHVzID0gMHhmZmZmOworCisJcmV0dXJuIGRldjsKKworfQorCit2b2lkIGZyZWVfb3Jpbm9jb2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFdpcmVsZXNzIGV4dGVuc2lvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBvcmlub2NvX2h3X2dldF9ic3NpZChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2LAorCQkJCWNoYXIgYnVmW0VUSF9BTEVOXSkKK3sKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DVVJSRU5UQlNTSUQsCisJCQkgICAgICBFVEhfQUxFTiwgTlVMTCwgYnVmKTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faHdfZ2V0X2Vzc2lkKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsIGludCAqYWN0aXZlLAorCQkJCWNoYXIgYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdKQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgaGVybWVzX2lkc3RyaW5nIGVzc2lkYnVmOworCWNoYXIgKnAgPSAoY2hhciAqKSgmZXNzaWRidWYudmFsKTsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChzdHJsZW4ocHJpdi0+ZGVzaXJlZF9lc3NpZCkgPiAwKSB7CisJCS8qIFdlIHJlYWQgdGhlIGRlc2lyZWQgU1NJRCBmcm9tIHRoZSBoYXJkd2FyZSByYXRoZXIKKwkJICAgdGhhbiBmcm9tIHByaXYtPmRlc2lyZWRfZXNzaWQsIGp1c3QgaW4gY2FzZSB0aGUKKwkJICAgZmlybXdhcmUgaXMgYWxsb3dlZCB0byBjaGFuZ2UgaXQgb24gdXMuIEknbSBub3QKKwkJICAgc3VyZSBhYm91dCB0aGlzICovCisJCS8qIE15IGd1ZXNzIGlzIHRoYXQgdGhlIE9XTlNTSUQgc2hvdWxkIGFsd2F5cyBiZSB3aGF0ZXZlcgorCQkgKiB3ZSBzZXQgdG8gdGhlIGNhcmQsIHdoZXJlYXMgQ1VSUkVOVF9TU0lEIGlzIHRoZSBvbmUgdGhhdAorCQkgKiBtYXkgY2hhbmdlLi4uIC0gSmVhbiBJSSAqLworCQl1MTYgcmlkOworCisJCSphY3RpdmUgPSAxOworCisJCXJpZCA9IChwcml2LT5wb3J0X3R5cGUgPT0gMykgPyBIRVJNRVNfUklEX0NORk9XTlNTSUQgOgorCQkJSEVSTUVTX1JJRF9DTkZERVNJUkVEU1NJRDsKKwkJCisJCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgVVNFUl9CQVAsIHJpZCwgc2l6ZW9mKGVzc2lkYnVmKSwKKwkJCQkgICAgICBOVUxMLCAmZXNzaWRidWYpOworCQlpZiAoZXJyKQorCQkJZ290byBmYWlsX3VubG9jazsKKwl9IGVsc2UgeworCQkqYWN0aXZlID0gMDsKKworCQllcnIgPSBoZXJtZXNfcmVhZF9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NVUlJFTlRTU0lELAorCQkJCSAgICAgIHNpemVvZihlc3NpZGJ1ZiksIE5VTEwsICZlc3NpZGJ1Zik7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWxfdW5sb2NrOworCX0KKworCWxlbiA9IGxlMTZfdG9fY3B1KGVzc2lkYnVmLmxlbik7CisKKwltZW1zZXQoYnVmLCAwLCBJV19FU1NJRF9NQVhfU0laRSsxKTsKKwltZW1jcHkoYnVmLCBwLCBsZW4pOworCWJ1ZltsZW5dID0gJ1wwJzsKKworIGZhaWxfdW5sb2NrOgorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOyAgICAgICAKK30KKworc3RhdGljIGxvbmcgb3Jpbm9jb19od19nZXRfZnJlcShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCQorCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwl1MTYgY2hhbm5lbDsKKwlsb25nIGZyZXEgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwkKKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DVVJSRU5UQ0hBTk5FTCwgJmNoYW5uZWwpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogSW50ZXJzaWwgZmlybXdhcmUgMS4zLjUgcmV0dXJucyAwIHdoZW4gdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKGNoYW5uZWwgPT0gMCkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmICggKGNoYW5uZWwgPCAxKSB8fCAoY2hhbm5lbCA+IE5VTV9DSEFOTkVMUykgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDaGFubmVsIG91dCBvZiByYW5nZSAoJWQpIVxuIiwKKwkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUsIGNoYW5uZWwpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCisJfQorCWZyZXEgPSBjaGFubmVsX2ZyZXF1ZW5jeVtjaGFubmVsLTFdICogMTAwMDAwOworCisgb3V0OgorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlpZiAoZXJyID4gMCkKKwkJZXJyID0gLUVCVVNZOworCXJldHVybiBlcnIgPyBlcnIgOiBmcmVxOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faHdfZ2V0X2JpdHJhdGVsaXN0KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsCisJCQkJICAgICAgaW50ICpudW1yYXRlcywgczMyICpyYXRlcywgaW50IG1heCkKK3sKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lc19pZHN0cmluZyBsaXN0OworCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSZsaXN0LnZhbDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgbnVtOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfU1VQUE9SVEVEREFUQVJBVEVTLAorCQkJICAgICAgc2l6ZW9mKGxpc3QpLCBOVUxMLCAmbGlzdCk7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJCisJbnVtID0gbGUxNl90b19jcHUobGlzdC5sZW4pOworCSpudW1yYXRlcyA9IG51bTsKKwludW0gPSBtaW4obnVtLCBtYXgpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXJhdGVzW2ldID0gKHBbaV0gJiAweDdmKSAqIDUwMDAwMDsgLyogY29udmVydCB0byBicHMgKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGl3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICpycnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisJaW50IG1vZGU7CisJc3RydWN0IGl3X3JhbmdlIHJhbmdlOworCWludCBudW1yYXRlczsKKwlpbnQgaSwgazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJVFJBQ0VfRU5URVIoZGV2LT5uYW1lKTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcnJxLT5wb2ludGVyLCBzaXplb2YocmFuZ2UpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlycnEtPmxlbmd0aCA9IHNpemVvZihyYW5nZSk7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW1vZGUgPSBwcml2LT5pd19tb2RlOworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwltZW1zZXQoJnJhbmdlLCAwLCBzaXplb2YocmFuZ2UpKTsKKworCS8qIE11Y2ggb2YgdGhpcyBzaGFtZWxlc3NseSB0YWtlbiBmcm9tIHd2bGFuX2NzLmMuIE5vIGlkZWEKKwkgKiB3aGF0IGl0IGFsbCBtZWFucyAtZGdpYnNvbiAqLworCXJhbmdlLndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2Uud2VfdmVyc2lvbl9zb3VyY2UgPSAxMTsKKworCXJhbmdlLm1pbl9ud2lkID0gcmFuZ2UubWF4X253aWQgPSAwOyAvKiBXZSBkb24ndCB1c2UgbndpZHMgKi8KKworCS8qIFNldCBhdmFpbGFibGUgY2hhbm5lbHMvZnJlcXVlbmNpZXMgKi8KKwlyYW5nZS5udW1fY2hhbm5lbHMgPSBOVU1fQ0hBTk5FTFM7CisJayA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5VTV9DSEFOTkVMUzsgaSsrKSB7CisJCWlmIChwcml2LT5jaGFubmVsX21hc2sgJiAoMSA8PCBpKSkgeworCQkJcmFuZ2UuZnJlcVtrXS5pID0gaSArIDE7CisJCQlyYW5nZS5mcmVxW2tdLm0gPSBjaGFubmVsX2ZyZXF1ZW5jeVtpXSAqIDEwMDAwMDsKKwkJCXJhbmdlLmZyZXFba10uZSA9IDE7CisJCQlrKys7CisJCX0KKwkJCisJCWlmIChrID49IElXX01BWF9GUkVRVUVOQ0lFUykKKwkJCWJyZWFrOworCX0KKwlyYW5nZS5udW1fZnJlcXVlbmN5ID0gazsKKworCXJhbmdlLnNlbnNpdGl2aXR5ID0gMzsKKworCWlmICgobW9kZSA9PSBJV19NT0RFX0FESE9DKSAmJiAocHJpdi0+c3B5X251bWJlciA9PSAwKSl7CisJCS8qIFF1YWxpdHkgc3RhdHMgbWVhbmluZ2xlc3MgaW4gYWQtaG9jIG1vZGUgKi8KKwkJcmFuZ2UubWF4X3F1YWwucXVhbCA9IDA7CisJCXJhbmdlLm1heF9xdWFsLmxldmVsID0gMDsKKwkJcmFuZ2UubWF4X3F1YWwubm9pc2UgPSAwOworCQlyYW5nZS5hdmdfcXVhbC5xdWFsID0gMDsKKwkJcmFuZ2UuYXZnX3F1YWwubGV2ZWwgPSAwOworCQlyYW5nZS5hdmdfcXVhbC5ub2lzZSA9IDA7CisJfSBlbHNlIHsKKwkJcmFuZ2UubWF4X3F1YWwucXVhbCA9IDB4OGIgLSAweDJmOworCQlyYW5nZS5tYXhfcXVhbC5sZXZlbCA9IDB4MmYgLSAweDk1IC0gMTsKKwkJcmFuZ2UubWF4X3F1YWwubm9pc2UgPSAweDJmIC0gMHg5NSAtIDE7CisJCS8qIE5lZWQgdG8gZ2V0IGJldHRlciB2YWx1ZXMgKi8KKwkJcmFuZ2UuYXZnX3F1YWwucXVhbCA9IDB4MjQ7CisJCXJhbmdlLmF2Z19xdWFsLmxldmVsID0gMHhDMjsKKwkJcmFuZ2UuYXZnX3F1YWwubm9pc2UgPSAweDlFOworCX0KKworCWVyciA9IG9yaW5vY29faHdfZ2V0X2JpdHJhdGVsaXN0KHByaXYsICZudW1yYXRlcywKKwkJCQkJIHJhbmdlLmJpdHJhdGUsIElXX01BWF9CSVRSQVRFUyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlyYW5nZS5udW1fYml0cmF0ZXMgPSBudW1yYXRlczsKKwkKKwkvKiBTZXQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbWF4IFRDUCB0aHJvdWdocHV0IGluIGJpdC9zIHRoYXQgd2UgY2FuCisJICogZXhwZWN0IHVzaW5nIHRoaXMgaW50ZXJmYWNlLiBNYXkgYmUgdXNlIGZvciBRb1Mgc3R1ZmYuLi4KKwkgKiBKZWFuIElJICovCisJaWYobnVtcmF0ZXMgPiAyKQorCQlyYW5nZS50aHJvdWdocHV0ID0gNSAqIDEwMDAgKiAxMDAwOwkvKiB+NSBNYi9zICovCisJZWxzZQorCQlyYW5nZS50aHJvdWdocHV0ID0gMS41ICogMTAwMCAqIDEwMDA7CS8qIH4xLjUgTWIvcyAqLworCisJcmFuZ2UubWluX3J0cyA9IDA7CisJcmFuZ2UubWF4X3J0cyA9IDIzNDc7CisJcmFuZ2UubWluX2ZyYWcgPSAyNTY7CisJcmFuZ2UubWF4X2ZyYWcgPSAyMzQ2OworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJaWYgKHByaXYtPmhhc193ZXApIHsKKwkJcmFuZ2UubWF4X2VuY29kaW5nX3Rva2VucyA9IE9SSU5PQ09fTUFYX0tFWVM7CisKKwkJcmFuZ2UuZW5jb2Rpbmdfc2l6ZVswXSA9IFNNQUxMX0tFWV9TSVpFOworCQlyYW5nZS5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAxOworCisJCWlmIChwcml2LT5oYXNfYmlnX3dlcCkgeworCQkJcmFuZ2UuZW5jb2Rpbmdfc2l6ZVsxXSA9IExBUkdFX0tFWV9TSVpFOworCQkJcmFuZ2UubnVtX2VuY29kaW5nX3NpemVzID0gMjsKKwkJfQorCX0gZWxzZSB7CisJCXJhbmdlLm51bV9lbmNvZGluZ19zaXplcyA9IDA7CisJCXJhbmdlLm1heF9lbmNvZGluZ190b2tlbnMgPSAwOworCX0KKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCQkKKwlyYW5nZS5taW5fcG1wID0gMDsKKwlyYW5nZS5tYXhfcG1wID0gNjU1MzUwMDA7CisJcmFuZ2UubWluX3BtdCA9IDA7CisJcmFuZ2UubWF4X3BtdCA9IDY1NTM1ICogMTAwMDsJLyogPz8/ICovCisJcmFuZ2UucG1wX2ZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCXJhbmdlLnBtdF9mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJcmFuZ2UucG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfCBJV19QT1dFUl9VTklDQVNUX1I7CisKKwlyYW5nZS5udW1fdHhwb3dlciA9IDE7CisJcmFuZ2UudHhwb3dlclswXSA9IDE1OyAvKiAxNWRCbSAqLworCXJhbmdlLnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKKworCXJhbmdlLnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX0xJRkVUSU1FOworCXJhbmdlLnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2Uucl90aW1lX2ZsYWdzID0gSVdfUkVUUllfTElGRVRJTUU7CisJcmFuZ2UubWluX3JldHJ5ID0gMDsKKwlyYW5nZS5tYXhfcmV0cnkgPSA2NTUzNTsJLyogPz8/ICovCisJcmFuZ2UubWluX3JfdGltZSA9IDA7CisJcmFuZ2UubWF4X3JfdGltZSA9IDY1NTM1ICogMTAwMDsJLyogPz8/ICovCisKKwlpZiAoY29weV90b191c2VyKHJycS0+cG9pbnRlciwgJnJhbmdlLCBzaXplb2YocmFuZ2UpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGl3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpbmRleCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJaW50IHNldGluZGV4ID0gcHJpdi0+dHhfa2V5OworCWludCBlbmFibGUgPSBwcml2LT53ZXBfb247CisJaW50IHJlc3RyaWN0ZWQgPSBwcml2LT53ZXBfcmVzdHJpY3Q7CisJdTE2IHhsZW4gPSAwOworCWludCBlcnIgPSAwOworCWNoYXIga2V5YnVmW09SSU5PQ09fTUFYX0tFWV9TSVpFXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCEgcHJpdi0+aGFzX3dlcCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGVycS0+cG9pbnRlcikgeworCQkvKiBXZSBhY3R1YWxseSBoYXZlIGEga2V5IHRvIHNldCAtIGNoZWNrIGl0cyBsZW5ndGggKi8KKwkJaWYgKGVycS0+bGVuZ3RoID4gTEFSR0VfS0VZX1NJWkUpCisJCQlyZXR1cm4gLUUyQklHOworCisJCWlmICggKGVycS0+bGVuZ3RoID4gU01BTExfS0VZX1NJWkUpICYmICFwcml2LT5oYXNfYmlnX3dlcCApCisJCQlyZXR1cm4gLUUyQklHOworCQkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGtleWJ1ZiwgZXJxLT5wb2ludGVyLCBlcnEtPmxlbmd0aCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChlcnEtPnBvaW50ZXIpIHsKKwkJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBPUklOT0NPX01BWF9LRVlTKSkKKwkJCWluZGV4ID0gcHJpdi0+dHhfa2V5OworCisJCS8qIEFkanVzdCBrZXkgbGVuZ3RoIHRvIGEgc3VwcG9ydGVkIHZhbHVlICovCisJCWlmIChlcnEtPmxlbmd0aCA+IFNNQUxMX0tFWV9TSVpFKSB7CisJCQl4bGVuID0gTEFSR0VfS0VZX1NJWkU7CisJCX0gZWxzZSBpZiAoZXJxLT5sZW5ndGggPiAwKSB7CisJCQl4bGVuID0gU01BTExfS0VZX1NJWkU7CisJCX0gZWxzZQorCQkJeGxlbiA9IDA7CisKKwkJLyogU3dpdGNoIG9uIFdFUCBpZiBvZmYgKi8KKwkJaWYgKCghZW5hYmxlKSAmJiAoeGxlbiA+IDApKSB7CisJCQlzZXRpbmRleCA9IGluZGV4OworCQkJZW5hYmxlID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEltcG9ydGFudCBub3RlIDogaWYgdGhlIHVzZXIgZG8gIml3Y29uZmlnIGV0aDAgZW5jIG9mZiIsCisJCSAqIHdlIHdpbGwgYXJyaXZlIHRoZXJlIHdpdGggYW4gaW5kZXggb2YgLTEuIFRoaXMgaXMgdmFsaWQKKwkJICogYnV0IG5lZWQgdG8gYmUgdGFrZW4gY2FyZSBvZmYuLi4gSmVhbiBJSSAqLworCQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IE9SSU5PQ09fTUFYX0tFWVMpKSB7CisJCQlpZigoaW5kZXggIT0gLTEpIHx8IChlcnEtPmZsYWdzID09IDApKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFNldCB0aGUgaW5kZXggOiBDaGVjayB0aGF0IHRoZSBrZXkgaXMgdmFsaWQgKi8KKwkJCWlmKHByaXYtPmtleXNbaW5kZXhdLmxlbiA9PSAwKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXNldGluZGV4ID0gaW5kZXg7CisJCX0KKwl9CisKKwlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkKKwkJZW5hYmxlID0gMDsKKwlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKQorCQlyZXN0cmljdGVkID0gMDsKKwlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQorCQlyZXN0cmljdGVkID0gMTsKKworCWlmIChlcnEtPnBvaW50ZXIpIHsKKwkJcHJpdi0+a2V5c1tpbmRleF0ubGVuID0gY3B1X3RvX2xlMTYoeGxlbik7CisJCW1lbXNldChwcml2LT5rZXlzW2luZGV4XS5kYXRhLCAwLAorCQkgICAgICAgc2l6ZW9mKHByaXYtPmtleXNbaW5kZXhdLmRhdGEpKTsKKwkJbWVtY3B5KHByaXYtPmtleXNbaW5kZXhdLmRhdGEsIGtleWJ1ZiwgZXJxLT5sZW5ndGgpOworCX0KKwlwcml2LT50eF9rZXkgPSBzZXRpbmRleDsKKworCS8qIFRyeSBmYXN0IGtleSBjaGFuZ2UgaWYgY29ubmVjdGVkIGFuZCBvbmx5IGtleXMgYXJlIGNoYW5nZWQgKi8KKwlpZiAocHJpdi0+d2VwX29uICYmIGVuYWJsZSAmJiAocHJpdi0+d2VwX3Jlc3RyaWN0ID09IHJlc3RyaWN0ZWQpICYmCisJICAgIG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQllcnIgPSBfX29yaW5vY29faHdfc2V0dXBfd2Vwa2V5cyhwcml2KTsKKwkJLyogTm8gbmVlZCB0byBjb21taXQgaWYgc3VjY2Vzc2Z1bCAqLworCQlnb3RvIG91dDsKKwl9CisKKwlwcml2LT53ZXBfb24gPSBlbmFibGU7CisJcHJpdi0+d2VwX3Jlc3RyaWN0ID0gcmVzdHJpY3RlZDsKKworIG91dDoKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGl3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpbmRleCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJdTE2IHhsZW4gPSAwOworCWNoYXIga2V5YnVmW09SSU5PQ09fTUFYX0tFWV9TSVpFXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCEgcHJpdi0+aGFzX3dlcCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IE9SSU5PQ09fTUFYX0tFWVMpKQorCQlpbmRleCA9IHByaXYtPnR4X2tleTsKKworCWVycS0+ZmxhZ3MgPSAwOworCWlmICghIHByaXYtPndlcF9vbikKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJZXJxLT5mbGFncyB8PSBpbmRleCArIDE7CisKKwlpZiAocHJpdi0+d2VwX3Jlc3RyaWN0KQorCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOworCWVsc2UKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsKKworCXhsZW4gPSBsZTE2X3RvX2NwdShwcml2LT5rZXlzW2luZGV4XS5sZW4pOworCisJZXJxLT5sZW5ndGggPSB4bGVuOworCisJbWVtY3B5KGtleWJ1ZiwgcHJpdi0+a2V5c1tpbmRleF0uZGF0YSwgT1JJTk9DT19NQVhfS0VZX1NJWkUpOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCWlmIChlcnEtPnBvaW50ZXIpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihlcnEtPnBvaW50ZXIsIGtleWJ1ZiwgeGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGVzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNoYXIgZXNzaWRidWZbSVdfRVNTSURfTUFYX1NJWkUrMV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIE5vdGUgOiBFU1NJRCBpcyBpZ25vcmVkIGluIEFkLUhvYyBkZW1vIG1vZGUsIGJ1dCB3ZSBjYW4gc2V0IGl0CisJICogYW55d2F5Li4uIC0gSmVhbiBJSSAqLworCisJbWVtc2V0KCZlc3NpZGJ1ZiwgMCwgc2l6ZW9mKGVzc2lkYnVmKSk7CisKKwlpZiAoZXJxLT5mbGFncykgeworCQlpZiAoZXJxLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKKwkJCXJldHVybiAtRTJCSUc7CisJCQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmVzc2lkYnVmLCBlcnEtPnBvaW50ZXIsIGVycS0+bGVuZ3RoKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWVzc2lkYnVmW2VycS0+bGVuZ3RoXSA9ICdcMCc7CisJfQorCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwltZW1jcHkocHJpdi0+ZGVzaXJlZF9lc3NpZCwgZXNzaWRidWYsIHNpemVvZihwcml2LT5kZXNpcmVkX2Vzc2lkKSk7CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljaGFyIGVzc2lkYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCWludCBhY3RpdmU7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCVRSQUNFX0VOVEVSKGRldi0+bmFtZSk7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWVyciA9IG9yaW5vY29faHdfZ2V0X2Vzc2lkKHByaXYsICZhY3RpdmUsIGVzc2lkYnVmKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfSBlbHNlIHsKKwkJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCQlyZXR1cm4gLUVCVVNZOworCQltZW1jcHkoZXNzaWRidWYsIHByaXYtPmRlc2lyZWRfZXNzaWQsIHNpemVvZihlc3NpZGJ1ZikpOworCQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCX0KKworCWVycS0+ZmxhZ3MgPSAxOworCWVycS0+bGVuZ3RoID0gc3RybGVuKGVzc2lkYnVmKSArIDE7CisJaWYgKGVycS0+cG9pbnRlcikKKwkJaWYgKGNvcHlfdG9fdXNlcihlcnEtPnBvaW50ZXIsIGVzc2lkYnVmLCBlcnEtPmxlbmd0aCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldG5pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICpucnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJY2hhciBuaWNrYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobnJxLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKKwkJcmV0dXJuIC1FMkJJRzsKKworCW1lbXNldChuaWNrYnVmLCAwLCBzaXplb2Yobmlja2J1ZikpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKG5pY2tidWYsIG5ycS0+cG9pbnRlciwgbnJxLT5sZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW5pY2tidWZbbnJxLT5sZW5ndGhdID0gJ1wwJzsKKwkKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW1lbWNweShwcml2LT5uaWNrLCBuaWNrYnVmLCBzaXplb2YocHJpdi0+bmljaykpOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0bmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKm5ycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljaGFyIG5pY2tidWZbSVdfRVNTSURfTUFYX1NJWkUrMV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJbWVtY3B5KG5pY2tidWYsIHByaXYtPm5pY2ssIElXX0VTU0lEX01BWF9TSVpFKzEpOworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlucnEtPmxlbmd0aCA9IHN0cmxlbihuaWNrYnVmKSsxOworCisJaWYgKGNvcHlfdG9fdXNlcihucnEtPnBvaW50ZXIsIG5pY2tidWYsIHNpemVvZihuaWNrYnVmKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19mcmVxICpmcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGNoYW4gPSAtMTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogV2UgY2FuIG9ubHkgdXNlIHRoaXMgaW4gQWQtSG9jIGRlbW8gbW9kZSB0byBzZXQgdGhlIG9wZXJhdGluZworCSAqIGZyZXF1ZW5jeSwgb3IgaW4gSUJTUyBtb2RlIHRvIHNldCB0aGUgZnJlcXVlbmN5IHdoZXJlIHRoZSBJQlNTCisJICogd2lsbCBiZSBjcmVhdGVkIC0gSmVhbiBJSSAqLworCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfQURIT0MpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICggKGZycS0+ZSA9PSAwKSAmJiAoZnJxLT5tIDw9IDEwMDApICkgeworCQkvKiBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyICovCisJCWNoYW4gPSBmcnEtPm07CisJfSBlbHNlIHsKKwkJLyogU2V0dGluZyBieSBmcmVxdWVuY3kgLSBzZWFyY2ggdGhlIHRhYmxlICovCisJCWludCBtdWx0ID0gMTsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8ICg2IC0gZnJxLT5lKTsgaSsrKQorCQkJbXVsdCAqPSAxMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NIQU5ORUxTOyBpKyspCisJCQlpZiAoZnJxLT5tID09IChjaGFubmVsX2ZyZXF1ZW5jeVtpXSAqIG11bHQpKQorCQkJCWNoYW4gPSBpKzE7CisJfQorCisJaWYgKCAoY2hhbiA8IDEpIHx8IChjaGFuID4gTlVNX0NIQU5ORUxTKSB8fAorCSAgICAgISAocHJpdi0+Y2hhbm5lbF9tYXNrICYgKDEgPDwgKGNoYW4tMSkpICkgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCXByaXYtPmNoYW5uZWwgPSBjaGFuOworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHNlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpzcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXUxNiB2YWw7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFwcml2LT5oYXNfc2Vuc2l0aXZpdHkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCSAgSEVSTUVTX1JJRF9DTkZTWVNURU1TQ0FMRSwgJnZhbCk7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlzcnEtPnZhbHVlID0gdmFsOworCXNycS0+Zml4ZWQgPSAwOyAvKiBhdXRvICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHNlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpzcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHZhbCA9IHNycS0+dmFsdWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghcHJpdi0+aGFzX3NlbnNpdGl2aXR5KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoKHZhbCA8IDEpIHx8ICh2YWwgPiAzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJcHJpdi0+YXBfZGVuc2l0eSA9IHZhbDsKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpycnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHZhbCA9IHJycS0+dmFsdWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChycnEtPmRpc2FibGVkKQorCQl2YWwgPSAyMzQ3OworCisJaWYgKCAodmFsIDwgMCkgfHwgKHZhbCA+IDIzNDcpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXByaXYtPnJ0c190aHJlc2ggPSB2YWw7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKmZycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAocHJpdi0+aGFzX213bykgeworCQlpZiAoZnJxLT5kaXNhYmxlZCkKKwkJCXByaXYtPm13b19yb2J1c3QgPSAwOworCQllbHNlIHsKKwkJCWlmIChmcnEtPmZpeGVkKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGaXhlZCBmcmFnbWVudGF0aW9uIGlzICIKKwkJCQkgICAgICAgIm5vdCBzdXBwb3J0ZWQgb24gdGhpcyBmaXJtd2FyZS4gIgorCQkJCSAgICAgICAiVXNpbmcgTVdPIHJvYnVzdCBpbnN0ZWFkLlxuIiwgZGV2LT5uYW1lKTsKKwkJCXByaXYtPm13b19yb2J1c3QgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGZycS0+ZGlzYWJsZWQpCisJCQlwcml2LT5mcmFnX3RocmVzaCA9IDIzNDY7CisJCWVsc2UgeworCQkJaWYgKCAoZnJxLT52YWx1ZSA8IDI1NikgfHwgKGZycS0+dmFsdWUgPiAyMzQ2KSApCisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCQlwcml2LT5mcmFnX3RocmVzaCA9IGZycS0+dmFsdWUgJiB+MHgxOyAvKiBtdXN0IGJlIGV2ZW4gKi8KKwkJfQorCX0KKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKmZycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJdTE2IHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJCisJaWYgKHByaXYtPmhhc19td28pIHsKKwkJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgSEVSTUVTX1JJRF9DTkZNV09ST0JVU1RfQUdFUkUsCisJCQkJCSAgJnZhbCk7CisJCWlmIChlcnIpCisJCQl2YWwgPSAwOworCisJCWZycS0+dmFsdWUgPSB2YWwgPyAyMzQ3IDogMDsKKwkJZnJxLT5kaXNhYmxlZCA9ICEgdmFsOworCQlmcnEtPmZpeGVkID0gMDsKKwl9IGVsc2UgeworCQllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZGUkFHTUVOVEFUSU9OVEhSRVNIT0xELAorCQkJCQkgICZ2YWwpOworCQlpZiAoZXJyKQorCQkJdmFsID0gMDsKKworCQlmcnEtPnZhbHVlID0gdmFsOworCQlmcnEtPmRpc2FibGVkID0gKHZhbCA+PSAyMzQ2KTsKKwkJZnJxLT5maXhlZCA9IDE7CisJfQorCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmF0ZW1vZGUgPSAtMTsKKwlpbnQgYml0cmF0ZTsgLyogMTAwcyBvZiBraWxvYml0cyAqLworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJLyogQXMgdGhlIHVzZXIgc3BhY2UgZG9lc24ndCBrbm93IG91ciBoaWdoZXN0IHJhdGUsIGl0IHVzZXMgLTEKKwkgKiB0byBhc2sgdXMgdG8gc2V0IHRoZSBoaWdoZXN0IHJhdGUuICBUZXN0IGl0IHVzaW5nICJpd2NvbmZpZworCSAqIGV0aFggcmF0ZSBhdXRvIiAtIEplYW4gSUkgKi8KKwlpZiAocnJxLT52YWx1ZSA9PSAtMSkKKwkJYml0cmF0ZSA9IDExMDsKKwllbHNlIHsKKwkJaWYgKHJycS0+dmFsdWUgJSAxMDAwMDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYml0cmF0ZSA9IHJycS0+dmFsdWUgLyAxMDAwMDA7CisJfQorCisJaWYgKCAoYml0cmF0ZSAhPSAxMCkgJiYgKGJpdHJhdGUgIT0gMjApICYmCisJICAgICAoYml0cmF0ZSAhPSA1NSkgJiYgKGJpdHJhdGUgIT0gMTEwKSApCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IEJJVFJBVEVfVEFCTEVfU0laRTsgaSsrKQorCQlpZiAoIChiaXRyYXRlX3RhYmxlW2ldLmJpdHJhdGUgPT0gYml0cmF0ZSkgJiYKKwkJICAgICAoYml0cmF0ZV90YWJsZVtpXS5hdXRvbWF0aWMgPT0gISBycnEtPmZpeGVkKSApIHsKKwkJCXJhdGVtb2RlID0gaTsKKwkJCWJyZWFrOworCQl9CisJCisJaWYgKHJhdGVtb2RlID09IC0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCXByaXYtPmJpdHJhdGVtb2RlID0gcmF0ZW1vZGU7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcnJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmF0ZW1vZGU7CisJaW50IGk7CisJdTE2IHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlyYXRlbW9kZSA9IHByaXYtPmJpdHJhdGVtb2RlOworCisJQlVHX09OKChyYXRlbW9kZSA8IDApIHx8IChyYXRlbW9kZSA+PSBCSVRSQVRFX1RBQkxFX1NJWkUpKTsKKworCXJycS0+dmFsdWUgPSBiaXRyYXRlX3RhYmxlW3JhdGVtb2RlXS5iaXRyYXRlICogMTAwMDAwOworCXJycS0+Zml4ZWQgPSAhIGJpdHJhdGVfdGFibGVbcmF0ZW1vZGVdLmF1dG9tYXRpYzsKKwlycnEtPmRpc2FibGVkID0gMDsKKworCS8qIElmIHRoZSBpbnRlcmZhY2UgaXMgcnVubmluZyB3ZSB0cnkgdG8gZmluZCBtb3JlIGFib3V0IHRoZQorCSAgIGN1cnJlbnQgbW9kZSAqLworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgSEVSTUVTX1JJRF9DVVJSRU5UVFhSQVRFLCAmdmFsKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQkKKwkJc3dpdGNoIChwcml2LT5maXJtd2FyZV90eXBlKSB7CisJCWNhc2UgRklSTVdBUkVfVFlQRV9BR0VSRTogLyogTHVjZW50IHN0eWxlIHJhdGUgKi8KKwkJCS8qIE5vdGUgOiBpbiBMdWNlbnQgZmlybXdhcmUsIHRoZSByZXR1cm4gdmFsdWUgb2YKKwkJCSAqIEhFUk1FU19SSURfQ1VSUkVOVFRYUkFURSBpcyB0aGUgYml0cmF0ZSBpbiBNYi9zLAorCQkJICogYW5kIHRoZXJlZm9yZSBpcyB0b3RhbGx5IGRpZmZlcmVudCBmcm9tIHRoZQorCQkJICogZW5jb2Rpbmcgb2YgSEVSTUVTX1JJRF9DTkZUWFJBVEVDT05UUk9MLgorCQkJICogRG9uJ3QgZm9yZ2V0IHRoYXQgNk1iL3MgaXMgcmVhbGx5IDUuNU1iL3MgKi8KKwkJCWlmICh2YWwgPT0gNikKKwkJCQlycnEtPnZhbHVlID0gNTUwMDAwMDsKKwkJCWVsc2UKKwkJCQlycnEtPnZhbHVlID0gdmFsICogMTAwMDAwMDsKKwkJCWJyZWFrOworCQljYXNlIEZJUk1XQVJFX1RZUEVfSU5URVJTSUw6IC8qIEludGVyc2lsIHN0eWxlIHJhdGUgKi8KKwkJY2FzZSBGSVJNV0FSRV9UWVBFX1NZTUJPTDogLyogU3ltYm9sIHN0eWxlIHJhdGUgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBCSVRSQVRFX1RBQkxFX1NJWkU7IGkrKykKKwkJCQlpZiAoYml0cmF0ZV90YWJsZVtpXS5pbnRlcnNpbF90eHJhdGVjdHJsID09IHZhbCkgeworCQkJCQlyYXRlbW9kZSA9IGk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWlmIChpID49IEJJVFJBVEVfVEFCTEVfU0laRSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5hYmxlIHRvIGRldGVybWluZSBjdXJyZW50IGJpdHJhdGUgKDB4JTA0aHgpXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIHZhbCk7CisKKwkJCXJycS0+dmFsdWUgPSBiaXRyYXRlX3RhYmxlW3JhdGVtb2RlXS5iaXRyYXRlICogMTAwMDAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCX0KKworIG91dDoKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcHJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChwcnEtPmRpc2FibGVkKSB7CisJCXByaXYtPnBtX29uID0gMDsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHBycS0+ZmxhZ3MgJiBJV19QT1dFUl9NT0RFKSB7CisJCWNhc2UgSVdfUE9XRVJfVU5JQ0FTVF9SOgorCQkJcHJpdi0+cG1fbWNhc3QgPSAwOworCQkJcHJpdi0+cG1fb24gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgSVdfUE9XRVJfQUxMX1I6CisJCQlwcml2LT5wbV9tY2FzdCA9IDE7CisJCQlwcml2LT5wbV9vbiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBJV19QT1dFUl9PTjoKKwkJCS8qIE5vIGZsYWdzIDogYnV0IHdlIG1heSBoYXZlIGEgdmFsdWUgLSBKZWFuIElJICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVyciA9IC1FSU5WQUw7CisJCX0KKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQkKKwkJaWYgKHBycS0+ZmxhZ3MgJiBJV19QT1dFUl9USU1FT1VUKSB7CisJCQlwcml2LT5wbV9vbiA9IDE7CisJCQlwcml2LT5wbV90aW1lb3V0ID0gcHJxLT52YWx1ZSAvIDEwMDA7CisJCX0KKwkJaWYgKHBycS0+ZmxhZ3MgJiBJV19QT1dFUl9QRVJJT0QpIHsKKwkJCXByaXYtPnBtX29uID0gMTsKKwkJCXByaXYtPnBtX3BlcmlvZCA9IHBycS0+dmFsdWUgLyAxMDAwOworCQl9CisJCS8qIEl0J3MgdmFsaWQgdG8gbm90IGhhdmUgYSB2YWx1ZSBpZiB3ZSBhcmUganVzdCB0b2dnbGluZworCQkgKiB0aGUgZmxhZ3MuLi4gSmVhbiBJSSAqLworCQlpZighcHJpdi0+cG1fb24pIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQkJCQorCX0KKworIG91dDoKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcHJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwl1MTYgZW5hYmxlLCBwZXJpb2QsIHRpbWVvdXQsIG1jYXN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwkKKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZQTUVOQUJMRUQsICZlbmFibGUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJICBIRVJNRVNfUklEX0NORk1BWFNMRUVQRFVSQVRJT04sICZwZXJpb2QpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GUE1IT0xET1ZFUkRVUkFUSU9OLCAmdGltZW91dCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZNVUxUSUNBU1RSRUNFSVZFLCAmbWNhc3QpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJcHJxLT5kaXNhYmxlZCA9ICFlbmFibGU7CisJLyogTm90ZSA6IGJ5IGRlZmF1bHQsIGRpc3BsYXkgdGhlIHBlcmlvZCAqLworCWlmICgocHJxLT5mbGFncyAmIElXX1BPV0VSX1RZUEUpID09IElXX1BPV0VSX1RJTUVPVVQpIHsKKwkJcHJxLT5mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJCXBycS0+dmFsdWUgPSB0aW1lb3V0ICogMTAwMDsKKwl9IGVsc2UgeworCQlwcnEtPmZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCQlwcnEtPnZhbHVlID0gcGVyaW9kICogMTAwMDsKKwl9CisJaWYgKG1jYXN0KQorCQlwcnEtPmZsYWdzIHw9IElXX1BPV0VSX0FMTF9SOworCWVsc2UKKwkJcHJxLT5mbGFncyB8PSBJV19QT1dFUl9VTklDQVNUX1I7CisKKyBvdXQ6CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRyZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJdTE2IHNob3J0X2xpbWl0LCBsb25nX2xpbWl0LCBsaWZldGltZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfU0hPUlRSRVRSWUxJTUlULAorCQkJCSAgJnNob3J0X2xpbWl0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0xPTkdSRVRSWUxJTUlULAorCQkJCSAgJmxvbmdfbGltaXQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfTUFYVFJBTlNNSVRMSUZFVElNRSwKKwkJCQkgICZsaWZldGltZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlycnEtPmRpc2FibGVkID0gMDsJCS8qIENhbid0IGJlIGRpc2FibGVkICovCisKKwkvKiBOb3RlIDogYnkgZGVmYXVsdCwgZGlzcGxheSB0aGUgcmV0cnkgbnVtYmVyICovCisJaWYgKChycnEtPmZsYWdzICYgSVdfUkVUUllfVFlQRSkgPT0gSVdfUkVUUllfTElGRVRJTUUpIHsKKwkJcnJxLT5mbGFncyA9IElXX1JFVFJZX0xJRkVUSU1FOworCQlycnEtPnZhbHVlID0gbGlmZXRpbWUgKiAxMDAwOwkvKiA/Pz8gKi8KKwl9IGVsc2UgeworCQkvKiBCeSBkZWZhdWx0LCBkaXNwbGF5IHRoZSBtaW4gbnVtYmVyICovCisJCWlmICgocnJxLT5mbGFncyAmIElXX1JFVFJZX01BWCkpIHsKKwkJCXJycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX01BWDsKKwkJCXJycS0+dmFsdWUgPSBsb25nX2xpbWl0OworCQl9IGVsc2UgeworCQkJcnJxLT5mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCQkJcnJxLT52YWx1ZSA9IHNob3J0X2xpbWl0OworCQkJaWYoc2hvcnRfbGltaXQgIT0gbG9uZ19saW1pdCkKKwkJCQlycnEtPmZsYWdzIHw9IElXX1JFVFJZX01JTjsKKwkJfQorCX0KKworIG91dDoKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGlic3Nwb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB2YWwgPSAqKCAoaW50ICopIHdycS0+dS5uYW1lICk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJcHJpdi0+aWJzc19wb3J0ID0gdmFsIDsKKworCS8qIEFjdHVhbGx5IHVwZGF0ZSB0aGUgbW9kZSB3ZSBhcmUgdXNpbmcgKi8KKwlzZXRfcG9ydF90eXBlKHByaXYpOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGlic3Nwb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCAqdmFsID0gKGludCAqKXdycS0+dS5uYW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCSp2YWwgPSBwcml2LT5pYnNzX3BvcnQ7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0cG9ydDMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHZhbCA9ICooIChpbnQgKikgd3JxLT51Lm5hbWUgKTsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgMDogLyogVHJ5IHRvIGRvIElFRUUgYWQtaG9jIG1vZGUgKi8KKwkJaWYgKCEgcHJpdi0+aGFzX2lic3MpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlwcml2LT5wcmVmZXJfcG9ydDMgPSAwOworCQkJCisJCWJyZWFrOworCisJY2FzZSAxOiAvKiBUcnkgdG8gZG8gTHVjZW50IHByb3ByaWV0YXJ5IGFkLWhvYyBtb2RlICovCisJCWlmICghIHByaXYtPmhhc19wb3J0MykgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXByaXYtPnByZWZlcl9wb3J0MyA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoISBlcnIpCisJCS8qIEFjdHVhbGx5IHVwZGF0ZSB0aGUgbW9kZSB3ZSBhcmUgdXNpbmcgKi8KKwkJc2V0X3BvcnRfdHlwZShwcml2KTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cG9ydDMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50ICp2YWwgPSAoaW50ICopd3JxLT51Lm5hbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJKnZhbCA9IHByaXYtPnByZWZlcl9wb3J0MzsKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKiBTcHkgaXMgdXNlZCBmb3IgbGluayBxdWFsaXR5L3N0cmVuZ3RoIG1lYXN1cmVtZW50cyBpbiBBZC1Ib2MgbW9kZQorICogSmVhbiBJSSAqLworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHNweShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKnNycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgYWRkcmVzc1tJV19NQVhfU1BZXTsKKwlpbnQgbnVtYmVyID0gc3JxLT5sZW5ndGg7CisJaW50IGk7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIENoZWNrIHRoZSBudW1iZXIgb2YgYWRkcmVzc2VzICovCisJaWYgKG51bWJlciA+IElXX01BWF9TUFkpCisJCXJldHVybiAtRTJCSUc7CisKKwkvKiBHZXQgdGhlIGRhdGEgaW4gdGhlIGRyaXZlciAqLworCWlmIChzcnEtPnBvaW50ZXIpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGFkZHJlc3MsIHNycS0+cG9pbnRlciwKKwkJCQkgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIG51bWJlcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgbm9ib2R5IG1lc3Mgd2l0aCB0aGUgc3RydWN0dXJlIHdoaWxlIHdlIGRvICovCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBvcmlub2NvX2xvY2soKSBkb2Vzbid0IGRpc2FibGUgaW50ZXJydXB0cywgc28gbWFrZSBzdXJlIHRoZQorCSAqIGludGVycnVwdCByeCBwYXRoIGRvbid0IGdldCBjb25mdXNlZCB3aGlsZSB3ZSBjb3B5ICovCisJcHJpdi0+c3B5X251bWJlciA9IDA7CisKKwlpZiAobnVtYmVyID4gMCkgeworCQkvKiBFeHRyYWN0IHRoZSBhZGRyZXNzZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IG51bWJlcjsgaSsrKQorCQkJbWVtY3B5KHByaXYtPnNweV9hZGRyZXNzW2ldLCBhZGRyZXNzW2ldLnNhX2RhdGEsCisJCQkgICAgICAgRVRIX0FMRU4pOworCQkvKiBSZXNldCBzdGF0cyAqLworCQltZW1zZXQocHJpdi0+c3B5X3N0YXQsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpICogSVdfTUFYX1NQWSk7CisJCS8qIFNldCBudW1iZXIgb2YgYWRkcmVzc2VzICovCisJCXByaXYtPnNweV9udW1iZXIgPSBudW1iZXI7CisJfQorCisJLyogTm93LCBsZXQgdGhlIG90aGVycyBwbGF5ICovCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRzcHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICpzcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNvY2thZGRyIGFkZHJlc3NbSVdfTUFYX1NQWV07CisJc3RydWN0IGl3X3F1YWxpdHkgc3B5X3N0YXRbSVdfTUFYX1NQWV07CisJaW50IG51bWJlcjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwludW1iZXIgPSBwcml2LT5zcHlfbnVtYmVyOworCWlmICgobnVtYmVyID4gMCkgJiYgKHNycS0+cG9pbnRlcikpIHsKKwkJLyogQ3JlYXRlIGFkZHJlc3Mgc3RydWN0ICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgeworCQkJbWVtY3B5KGFkZHJlc3NbaV0uc2FfZGF0YSwgcHJpdi0+c3B5X2FkZHJlc3NbaV0sCisJCQkgICAgICAgRVRIX0FMRU4pOworCQkJYWRkcmVzc1tpXS5zYV9mYW1pbHkgPSBBRl9VTklYOworCQl9CisJCS8qIENvcHkgc3RhdHMgKi8KKwkJLyogSW4gdGhlb3J5LCB3ZSBzaG91bGQgZGlzYWJsZSBpcnFzIHdoaWxlIGNvcHlpbmcgdGhlIHN0YXRzCisJCSAqIGJlY2F1c2UgdGhlIHJ4IHBhdGggbWlnaHQgdXBkYXRlIGl0IGluIHRoZSBtaWRkbGUuLi4KKwkJICogQmFoLCB3aG8gY2FyZSA/IC0gSmVhbiBJSSAqLworCQltZW1jcHkoJnNweV9zdGF0LCBwcml2LT5zcHlfc3RhdCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkgKiBJV19NQVhfU1BZKTsKKwkJZm9yIChpPTA7IGkgPCBudW1iZXI7IGkrKykKKwkJCXByaXYtPnNweV9zdGF0W2ldLnVwZGF0ZWQgPSAwOworCX0KKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwkvKiBQdXNoIHN0dWZmIHRvIHVzZXIgc3BhY2UgKi8KKwlzcnEtPmxlbmd0aCA9IG51bWJlcjsKKwlpZihjb3B5X3RvX3VzZXIoc3JxLT5wb2ludGVyLCBhZGRyZXNzLAorCQkJIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICogbnVtYmVyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYoY29weV90b191c2VyKHNycS0+cG9pbnRlciArIChzaXplb2Yoc3RydWN0IHNvY2thZGRyKSpudW1iZXIpLAorCQkJJnNweV9zdGF0LCBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpICogbnVtYmVyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorb3Jpbm9jb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJxOworCWludCBlcnIgPSAwOworCWludCB0bXA7CisJaW50IGNoYW5nZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlUUkFDRV9FTlRFUihkZXYtPm5hbWUpOworCisJLyogSW4gdGhlb3J5LCB3ZSBjb3VsZCBhbGxvdyBtb3N0IG9mIHRoZSB0aGUgU0VUIHN0dWZmIHRvIGJlCisJICogZG9uZS4gSW4gcHJhY3RpY2UsIHRoZSBsYXBzZSBvZiB0aW1lIGF0IHN0YXJ0dXAgd2hlbiB0aGUKKwkgKiBjYXJkIGlzIG5vdCByZWFkeSBpcyB2ZXJ5IHNob3J0LCBzbyB3aHkgYm90aGVyLi4uICBOb3RlCisJICogdGhhdCBuZXRpZl9kZXZpY2VfcHJlc2VudCBpcyBkaWZmZXJlbnQgZnJvbSB1cC9kb3duCisJICogKGlmY29uZmlnKSwgd2hlbiB0aGUgZGV2aWNlIGlzIG5vdCB5ZXQgdXAsIGl0IGlzIHVzdWFsbHkKKwkgKiBhbHJlYWR5IHJlYWR5Li4uICBKZWFuIElJICovCisJaWYgKCEgbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dJV05BTUU6CisJCXN0cmNweSh3cnEtPnUubmFtZSwgIklFRUUgODAyLjExLURTIik7CisJCWJyZWFrOworCQkKKwljYXNlIFNJT0NHSVdBUDoKKwkJd3JxLT51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQllcnIgPSBvcmlub2NvX2h3X2dldF9ic3NpZChwcml2LCB3cnEtPnUuYXBfYWRkci5zYV9kYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdSQU5HRToKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRpd3JhbmdlKGRldiwgJndycS0+dS5kYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdNT0RFOgorCQlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJCXJldHVybiAtRUJVU1k7CisJCXN3aXRjaCAod3JxLT51Lm1vZGUpIHsKKwkJY2FzZSBJV19NT0RFX0FESE9DOgorCQkJaWYgKCEgKHByaXYtPmhhc19pYnNzIHx8IHByaXYtPmhhc19wb3J0MykgKQorCQkJCWVyciA9IC1FSU5WQUw7CisJCQllbHNlIHsKKwkJCQlwcml2LT5pd19tb2RlID0gSVdfTU9ERV9BREhPQzsKKwkJCQljaGFuZ2VkID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJCXByaXYtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOworCQkJY2hhbmdlZCA9IDE7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXNldF9wb3J0X3R5cGUocHJpdik7CisJCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXTU9ERToKKwkJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCQlyZXR1cm4gLUVCVVNZOworCQl3cnEtPnUubW9kZSA9IHByaXYtPml3X21vZGU7CisJCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXRU5DT0RFOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldGl3ZW5jb2RlKGRldiwgJndycS0+dS5lbmNvZGluZyk7CisJCWlmICghIGVycikKKwkJCWNoYW5nZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV0VOQ09ERToKKwkJaWYgKCEgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJZXJyID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldGl3ZW5jb2RlKGRldiwgJndycS0+dS5lbmNvZGluZyk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXRVNTSUQ6CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0ZXNzaWQoZGV2LCAmd3JxLT51LmVzc2lkKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXRVNTSUQ6CisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0ZXNzaWQoZGV2LCAmd3JxLT51LmVzc2lkKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdOSUNLTjoKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRuaWNrKGRldiwgJndycS0+dS5kYXRhKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXTklDS046CisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0bmljayhkZXYsICZ3cnEtPnUuZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXRlJFUToKKwkJdG1wID0gb3Jpbm9jb19od19nZXRfZnJlcShwcml2KTsKKwkJaWYgKHRtcCA8IDApIHsKKwkJCWVyciA9IHRtcDsKKwkJfSBlbHNlIHsKKwkJCXdycS0+dS5mcmVxLm0gPSB0bXA7CisJCQl3cnEtPnUuZnJlcS5lID0gMTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV0ZSRVE6CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0ZnJlcShkZXYsICZ3cnEtPnUuZnJlcSk7CisJCWlmICghIGVycikKKwkJCWNoYW5nZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV1NFTlM6CisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0c2VucyhkZXYsICZ3cnEtPnUuc2Vucyk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXU0VOUzoKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRzZW5zKGRldiwgJndycS0+dS5zZW5zKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXUlRTOgorCQl3cnEtPnUucnRzLnZhbHVlID0gcHJpdi0+cnRzX3RocmVzaDsKKwkJd3JxLT51LnJ0cy5kaXNhYmxlZCA9ICh3cnEtPnUucnRzLnZhbHVlID09IDIzNDcpOworCQl3cnEtPnUucnRzLmZpeGVkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdSVFM6CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0cnRzKGRldiwgJndycS0+dS5ydHMpOworCQlpZiAoISBlcnIpCisJCQljaGFuZ2VkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdGUkFHOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldGZyYWcoZGV2LCAmd3JxLT51LmZyYWcpOworCQlpZiAoISBlcnIpCisJCQljaGFuZ2VkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdGUkFHOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldGZyYWcoZGV2LCAmd3JxLT51LmZyYWcpOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV1JBVEU6CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0cmF0ZShkZXYsICZ3cnEtPnUuYml0cmF0ZSk7CisJCWlmICghIGVycikKKwkJCWNoYW5nZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV1JBVEU6CisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0cmF0ZShkZXYsICZ3cnEtPnUuYml0cmF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXUE9XRVI6CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0cG93ZXIoZGV2LCAmd3JxLT51LnBvd2VyKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXUE9XRVI6CisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0cG93ZXIoZGV2LCAmd3JxLT51LnBvd2VyKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdUWFBPVzoKKwkJLyogVGhlIGNhcmQgb25seSBzdXBwb3J0cyBvbmUgdHggcG93ZXIsIHNvIHRoaXMgaXMgZWFzeSAqLworCQl3cnEtPnUudHhwb3dlci52YWx1ZSA9IDE1OyAvKiBkQm0gKi8KKwkJd3JxLT51LnR4cG93ZXIuZml4ZWQgPSAxOworCQl3cnEtPnUudHhwb3dlci5kaXNhYmxlZCA9IDA7CisJCXdycS0+dS50eHBvd2VyLmZsYWdzID0gSVdfVFhQT1dfREJNOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV1JFVFJZOgorCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdSRVRSWToKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRyZXRyeShkZXYsICZ3cnEtPnUucmV0cnkpOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV1NQWToKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRzcHkoZGV2LCAmd3JxLT51LmRhdGEpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV1NQWToKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRzcHkoZGV2LCAmd3JxLT51LmRhdGEpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV1BSSVY6CisJCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKSB7CisJCQlzdHJ1Y3QgaXdfcHJpdl9hcmdzIHByaXZ0YWJbXSA9IHsKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4MCwgMCwgMCwgImZvcmNlX3Jlc2V0IiB9LAorCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHgxLCAwLCAwLCAiY2FyZF9yZXNldCIgfSwKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4MiwKKwkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkJCSAgMCwgInNldF9wb3J0MyIgfSwKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4MywgMCwKKwkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkJCSAgImdldF9wb3J0MyIgfSwKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NCwKKwkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkJCSAgMCwgInNldF9wcmVhbWJsZSIgfSwKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NSwgMCwKKwkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkJCSAgImdldF9wcmVhbWJsZSIgfSwKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NiwKKwkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkJCSAgMCwgInNldF9pYnNzcG9ydCIgfSwKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NywgMCwKKwkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkJCSAgImdldF9pYnNzcG9ydCIgfSwKKwkJCQl7IFNJT0NJV0xBU1RQUklWLCAwLCAwLCAiZHVtcF9yZWNzIiB9LAorCQkJfTsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHByaXZ0YWIpIC8gc2l6ZW9mKHByaXZ0YWJbMF0pOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwcml2dGFiLCBzaXplb2YocHJpdnRhYikpKQorCQkJCWVyciA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJICAgICAgIAorCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHgwOiAvKiBmb3JjZV9yZXNldCAqLworCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHgxOiAvKiBjYXJkX3Jlc2V0ICovCisJCWlmICghIGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCWVyciA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisJCQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEZvcmNlIHNjaGVkdWxpbmcgcmVzZXQhXG4iLCBkZXYtPm5hbWUpOworCisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dvcmspOworCQlicmVhazsKKworCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHgyOiAvKiBzZXRfcG9ydDMgKi8KKwkJaWYgKCEgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJZXJyID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldHBvcnQzKGRldiwgd3JxKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDM6IC8qIGdldF9wb3J0MyAqLworCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldHBvcnQzKGRldiwgd3JxKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4NDogLyogc2V0X3ByZWFtYmxlICovCisJCWlmICghIGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCWVyciA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogODAyLjExYiBoYXMgcmVjZW50bHkgZGVmaW5lZCBzb21lIHNob3J0IHByZWFtYmxlLgorCQkgKiBCYXNpY2FsbHksIHRoZSBQaHkgaGVhZGVyIGhhcyBiZWVuIHJlZHVjZWQgaW4gc2l6ZS4KKwkJICogVGhpcyBpbmNyZWFzZSBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBhdCBoaWdoIHJhdGVzCisJCSAqICh0aGUgcHJlYW1ibGUgaXMgdHJhbnNtaXR0ZWQgYXQgMU1iL3MpLCB1bmZvcnR1bmF0ZWx5CisJCSAqIHRoaXMgZ2l2ZSBjb21wYXRpYmlsaXR5IHRyb3VibGVzLi4uIC0gSmVhbiBJSSAqLworCQlpZihwcml2LT5oYXNfcHJlYW1ibGUpIHsKKwkJCWludCB2YWwgPSAqKCAoaW50ICopIHdycS0+dS5uYW1lICk7CisKKwkJCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQkJCXJldHVybiAtRUJVU1k7CisJCQlpZiAodmFsKQorCQkJCXByaXYtPnByZWFtYmxlID0gMTsKKwkJCWVsc2UKKwkJCQlwcml2LT5wcmVhbWJsZSA9IDA7CisJCQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCQkJY2hhbmdlZCA9IDE7CisJCX0gZWxzZQorCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCisJY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDU6IC8qIGdldF9wcmVhbWJsZSAqLworCQlpZihwcml2LT5oYXNfcHJlYW1ibGUpIHsKKwkJCWludCAqdmFsID0gKGludCAqKXdycS0+dS5uYW1lOworCisJCQlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJKnZhbCA9IHByaXYtPnByZWFtYmxlOworCQkJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwkJfSBlbHNlCisJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDY6IC8qIHNldF9pYnNzcG9ydCAqLworCQlpZiAoISBjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQllcnIgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0aWJzc3BvcnQoZGV2LCB3cnEpOworCQlpZiAoISBlcnIpCisJCQljaGFuZ2VkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4NzogLyogZ2V0X2lic3Nwb3J0ICovCisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0aWJzc3BvcnQoZGV2LCB3cnEpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0lXTEFTVFBSSVY6CisJCWVyciA9IG9yaW5vY29fZGVidWdfZHVtcF9yZWNzKGRldik7CisJCWlmIChlcnIpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZHVtcCByZWNvcmRzICglZClcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlicmVhazsKKworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJfQorCQorCWlmICghIGVyciAmJiBjaGFuZ2VkICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQllcnIgPSBvcmlub2NvX3JlY29uZmlndXJlKGRldik7CisJfQkJCisKKwlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgeworCXUxNiByaWQ7CisJY2hhciAqbmFtZTsKKwlpbnQgZGlzcGxheXR5cGU7CisjZGVmaW5lIERJU1BMQVlfV09SRFMJMAorI2RlZmluZSBESVNQTEFZX0JZVEVTCTEKKyNkZWZpbmUgRElTUExBWV9TVFJJTkcJMgorI2RlZmluZSBESVNQTEFZX1hTVFJJTkcJMworfSByZWNvcmRfdGFibGVbXSA9IHsKKyNkZWZpbmUgREVCVUdfUkVDKG5hbWUsdHlwZSkgeyBIRVJNRVNfUklEXyMjbmFtZSwgI25hbWUsIERJU1BMQVlfIyN0eXBlIH0KKwlERUJVR19SRUMoQ05GUE9SVFRZUEUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZPV05NQUNBRERSLEJZVEVTKSwKKwlERUJVR19SRUMoQ05GREVTSVJFRFNTSUQsU1RSSU5HKSwKKwlERUJVR19SRUMoQ05GT1dOQ0hBTk5FTCxXT1JEUyksCisJREVCVUdfUkVDKENORk9XTlNTSUQsU1RSSU5HKSwKKwlERUJVR19SRUMoQ05GT1dOQVRJTVdJTkRPVyxXT1JEUyksCisJREVCVUdfUkVDKENORlNZU1RFTVNDQUxFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GTUFYREFUQUxFTixXT1JEUyksCisJREVCVUdfUkVDKENORlBNRU5BQkxFRCxXT1JEUyksCisJREVCVUdfUkVDKENORlBNRVBTLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GTVVMVElDQVNUUkVDRUlWRSxXT1JEUyksCisJREVCVUdfUkVDKENORk1BWFNMRUVQRFVSQVRJT04sV09SRFMpLAorCURFQlVHX1JFQyhDTkZQTUhPTERPVkVSRFVSQVRJT04sV09SRFMpLAorCURFQlVHX1JFQyhDTkZPV05OQU1FLFNUUklORyksCisJREVCVUdfUkVDKENORk9XTkRUSU1QRVJJT0QsV09SRFMpLAorCURFQlVHX1JFQyhDTkZNVUxUSUNBU1RQTUJVRkZFUklORyxXT1JEUyksCisJREVCVUdfUkVDKENORldFUEVOQUJMRURfQUdFUkUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZNQU5EQVRPUllCU1NJRF9TWU1CT0wsV09SRFMpLAorCURFQlVHX1JFQyhDTkZXRVBERUZBVUxUS0VZSUQsV09SRFMpLAorCURFQlVHX1JFQyhDTkZERUZBVUxUS0VZMCxCWVRFUyksCisJREVCVUdfUkVDKENORkRFRkFVTFRLRVkxLEJZVEVTKSwKKwlERUJVR19SRUMoQ05GTVdPUk9CVVNUX0FHRVJFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GREVGQVVMVEtFWTIsQllURVMpLAorCURFQlVHX1JFQyhDTkZERUZBVUxUS0VZMyxCWVRFUyksCisJREVCVUdfUkVDKENORldFUEZMQUdTX0lOVEVSU0lMLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GV0VQS0VZTUFQUElOR1RBQkxFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GQVVUSEVOVElDQVRJT04sV09SRFMpLAorCURFQlVHX1JFQyhDTkZNQVhBU1NPQ1NUQSxXT1JEUyksCisJREVCVUdfUkVDKENORktFWUxFTkdUSF9TWU1CT0wsV09SRFMpLAorCURFQlVHX1JFQyhDTkZUWENPTlRST0wsV09SRFMpLAorCURFQlVHX1JFQyhDTkZST0FNSU5HTU9ERSxXT1JEUyksCisJREVCVUdfUkVDKENORkhPU1RBVVRIRU5USUNBVElPTixXT1JEUyksCisJREVCVUdfUkVDKENORlJDVkNSQ0VSUk9SLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GTU1MSUZFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GQUxUUkVUUllDT1VOVCxXT1JEUyksCisJREVCVUdfUkVDKENORkJFQUNPTklOVCxXT1JEUyksCisJREVCVUdfUkVDKENORkFQUENGSU5GTyxXT1JEUyksCisJREVCVUdfUkVDKENORlNUQVBDRklORk8sV09SRFMpLAorCURFQlVHX1JFQyhDTkZQUklPUklUWVFVU0FHRSxXT1JEUyksCisJREVCVUdfUkVDKENORlRJTUNUUkwsV09SRFMpLAorCURFQlVHX1JFQyhDTkZUSElSVFkyVEFMTFksV09SRFMpLAorCURFQlVHX1JFQyhDTkZFTkhTRUNVUklUWSxXT1JEUyksCisJREVCVUdfUkVDKENORkdST1VQQUREUkVTU0VTLEJZVEVTKSwKKwlERUJVR19SRUMoQ05GQ1JFQVRFSUJTUyxXT1JEUyksCisJREVCVUdfUkVDKENORkZSQUdNRU5UQVRJT05USFJFU0hPTEQsV09SRFMpLAorCURFQlVHX1JFQyhDTkZSVFNUSFJFU0hPTEQsV09SRFMpLAorCURFQlVHX1JFQyhDTkZUWFJBVEVDT05UUk9MLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GUFJPTUlTQ1VPVVNNT0RFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GQkFTSUNSQVRFU19TWU1CT0wsV09SRFMpLAorCURFQlVHX1JFQyhDTkZQUkVBTUJMRV9TWU1CT0wsV09SRFMpLAorCURFQlVHX1JFQyhDTkZTSE9SVFBSRUFNQkxFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GV0VQS0VZU19BR0VSRSxCWVRFUyksCisJREVCVUdfUkVDKENORkVYQ0xVREVMT05HUFJFQU1CTEUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZUWEtFWV9BR0VSRSxXT1JEUyksCisJREVCVUdfUkVDKENORkFVVEhFTlRJQ0FUSU9OUlNQVE8sV09SRFMpLAorCURFQlVHX1JFQyhDTkZCQVNJQ1JBVEVTLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GU1VQUE9SVEVEUkFURVMsV09SRFMpLAorCURFQlVHX1JFQyhDTkZUSUNLVElNRSxXT1JEUyksCisJREVCVUdfUkVDKENORlNDQU5SRVFVRVNULFdPUkRTKSwKKwlERUJVR19SRUMoQ05GSk9JTlJFUVVFU1QsV09SRFMpLAorCURFQlVHX1JFQyhDTkZBVVRIRU5USUNBVEVTVEFUSU9OLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GQ0hBTk5FTElORk9SRVFVRVNULFdPUkRTKSwKKwlERUJVR19SRUMoTUFYTE9BRFRJTUUsV09SRFMpLAorCURFQlVHX1JFQyhET1dOTE9BREJVRkZFUixXT1JEUyksCisJREVCVUdfUkVDKFBSSUlELFdPUkRTKSwKKwlERUJVR19SRUMoUFJJU1VQUkFOR0UsV09SRFMpLAorCURFQlVHX1JFQyhDRklBQ1RSQU5HRVMsV09SRFMpLAorCURFQlVHX1JFQyhOSUNTRVJOVU0sWFNUUklORyksCisJREVCVUdfUkVDKE5JQ0lELFdPUkRTKSwKKwlERUJVR19SRUMoTUZJU1VQUkFOR0UsV09SRFMpLAorCURFQlVHX1JFQyhDRklTVVBSQU5HRSxXT1JEUyksCisJREVCVUdfUkVDKENIQU5ORUxMSVNULFdPUkRTKSwKKwlERUJVR19SRUMoUkVHVUxBVE9SWURPTUFJTlMsV09SRFMpLAorCURFQlVHX1JFQyhURU1QVFlQRSxXT1JEUyksCisvKiAgCURFQlVHX1JFQyhDSVMsQllURVMpLCAqLworCURFQlVHX1JFQyhTVEFJRCxXT1JEUyksCisJREVCVUdfUkVDKENVUlJFTlRTU0lELFNUUklORyksCisJREVCVUdfUkVDKENVUlJFTlRCU1NJRCxCWVRFUyksCisJREVCVUdfUkVDKENPTU1TUVVBTElUWSxXT1JEUyksCisJREVCVUdfUkVDKENVUlJFTlRUWFJBVEUsV09SRFMpLAorCURFQlVHX1JFQyhDVVJSRU5UQkVBQ09OSU5URVJWQUwsV09SRFMpLAorCURFQlVHX1JFQyhDVVJSRU5UU0NBTEVUSFJFU0hPTERTLFdPUkRTKSwKKwlERUJVR19SRUMoUFJPVE9DT0xSU1BUSU1FLFdPUkRTKSwKKwlERUJVR19SRUMoU0hPUlRSRVRSWUxJTUlULFdPUkRTKSwKKwlERUJVR19SRUMoTE9OR1JFVFJZTElNSVQsV09SRFMpLAorCURFQlVHX1JFQyhNQVhUUkFOU01JVExJRkVUSU1FLFdPUkRTKSwKKwlERUJVR19SRUMoTUFYUkVDRUlWRUxJRkVUSU1FLFdPUkRTKSwKKwlERUJVR19SRUMoQ0ZQT0xMQUJMRSxXT1JEUyksCisJREVCVUdfUkVDKEFVVEhFTlRJQ0FUSU9OQUxHT1JJVEhNUyxXT1JEUyksCisJREVCVUdfUkVDKFBSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRCxXT1JEUyksCisJREVCVUdfUkVDKE9XTk1BQ0FERFIsQllURVMpLAorCURFQlVHX1JFQyhTQ0FOUkVTVUxUU1RBQkxFLFdPUkRTKSwKKwlERUJVR19SRUMoUEhZVFlQRSxXT1JEUyksCisJREVCVUdfUkVDKENVUlJFTlRDSEFOTkVMLFdPUkRTKSwKKwlERUJVR19SRUMoQ1VSUkVOVFBPV0VSU1RBVEUsV09SRFMpLAorCURFQlVHX1JFQyhDQ0FNT0RFLFdPUkRTKSwKKwlERUJVR19SRUMoU1VQUE9SVEVEREFUQVJBVEVTLFdPUkRTKSwKKwlERUJVR19SRUMoQlVJTERTRVEsQllURVMpLAorCURFQlVHX1JFQyhGV0lELFhTVFJJTkcpCisjdW5kZWYgREVCVUdfUkVDCit9OworCisjZGVmaW5lIERFQlVHX0xUVl9TSVpFCQkxMjgKKworc3RhdGljIGludCBvcmlub2NvX2RlYnVnX2R1bXBfcmVjcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwl1OCAqdmFsODsKKwl1MTYgKnZhbDE2OworCWludCBpLGo7CisJdTE2IGxlbmd0aDsKKwlpbnQgZXJyOworCisJLyogSSdtIG5vdCBzdXJlOiB3ZSBtaWdodCBoYXZlIGEgbG9jayBoZXJlLCBzbyB3ZSdkIGJldHRlciBnbworICAgICAgICAgICBhdG9taWMsIGp1c3QgaW4gY2FzZS4gKi8KKwl2YWw4ID0ga21hbGxvYyhERUJVR19MVFZfU0laRSArIDIsIEdGUF9BVE9NSUMpOworCWlmICghIHZhbDgpCisJCXJldHVybiAtRU5PTUVNOworCXZhbDE2ID0gKHUxNiAqKXZhbDg7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWNvcmRfdGFibGUpOyBpKyspIHsKKwkJdTE2IHJpZCA9IHJlY29yZF90YWJsZVtpXS5yaWQ7CisJCWludCBsZW47CisKKwkJbWVtc2V0KHZhbDgsIDAsIERFQlVHX0xUVl9TSVpFICsgMik7CisKKwkJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwgcmlkLCBERUJVR19MVFZfU0laRSwKKwkJCQkgICAgICAmbGVuZ3RoLCB2YWw4KTsKKwkJaWYgKGVycikgeworCQkJREVCVUcoMCwgIkVycm9yICVkIHJlYWRpbmcgUklEIDB4JTA0eFxuIiwgZXJyLCByaWQpOworCQkJY29udGludWU7CisJCX0KKwkJdmFsMTYgPSAodTE2ICopdmFsODsKKwkJaWYgKGxlbmd0aCA9PSAwKQorCQkJY29udGludWU7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiUtMTVzICgweCUwNHgpOiBsZW5ndGg9JWQgKCVkIGJ5dGVzKVx0dmFsdWU9IiwKKwkJICAgICAgIHJlY29yZF90YWJsZVtpXS5uYW1lLAorCQkgICAgICAgcmlkLCBsZW5ndGgsIChsZW5ndGgtMSkqMik7CisJCWxlbiA9IG1pbigoKGludClsZW5ndGgtMSkqMiwgREVCVUdfTFRWX1NJWkUpOworCisJCXN3aXRjaCAocmVjb3JkX3RhYmxlW2ldLmRpc3BsYXl0eXBlKSB7CisJCWNhc2UgRElTUExBWV9XT1JEUzoKKwkJCWZvciAoaiA9IDA7IGogPCBsZW4gLyAyOyBqKyspCisJCQkJcHJpbnRrKCIlMDRYLSIsIGxlMTZfdG9fY3B1KHZhbDE2W2pdKSk7CisJCQlicmVhazsKKworCQljYXNlIERJU1BMQVlfQllURVM6CisJCWRlZmF1bHQ6CisJCQlmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspCisJCQkJcHJpbnRrKCIlMDJYOiIsIHZhbDhbal0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBESVNQTEFZX1NUUklORzoKKwkJCWxlbiA9IG1pbihsZW4sIGxlMTZfdG9fY3B1KHZhbDE2WzBdKSsyKTsKKwkJCXZhbDhbbGVuXSA9ICdcMCc7CisJCQlwcmludGsoIlwiJXNcIiIsIChjaGFyICopJnZhbDE2WzFdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElTUExBWV9YU1RSSU5HOgorCQkJcHJpbnRrKCInJXMnIiwgKGNoYXIgKil2YWw4KTsKKwkJfQorCisJCXByaW50aygiXG4iKTsKKwl9CisKKwlrZnJlZSh2YWw4KTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZWJ1Z2dpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAwCitzdGF0aWMgdm9pZCBzaG93X3J4X2ZyYW1lKHN0cnVjdCBvcmlub2NvX3J4ZnJhbWVfaGRyICpmcmFtZSkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiUlggZGVzY3JpcHRvcjpcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICIgIHN0YXR1cyAgICAgID0gMHglMDR4XG4iLCBmcmFtZS0+ZGVzYy5zdGF0dXMpOworCXByaW50ayhLRVJOX0RFQlVHICIgIHRpbWUgICAgICAgID0gMHglMDh4XG4iLCBmcmFtZS0+ZGVzYy50aW1lKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBzaWxlbmNlICAgICA9IDB4JTAyeFxuIiwgZnJhbWUtPmRlc2Muc2lsZW5jZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgc2lnbmFsICAgICAgPSAweCUwMnhcbiIsIGZyYW1lLT5kZXNjLnNpZ25hbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgcmF0ZSAgICAgICAgPSAweCUwMnhcbiIsIGZyYW1lLT5kZXNjLnJhdGUpOworCXByaW50ayhLRVJOX0RFQlVHICIgIHJ4ZmxvdyAgICAgID0gMHglMDJ4XG4iLCBmcmFtZS0+ZGVzYy5yeGZsb3cpOworCXByaW50ayhLRVJOX0RFQlVHICIgIHJlc2VydmVkICAgID0gMHglMDh4XG4iLCBmcmFtZS0+ZGVzYy5yZXNlcnZlZCk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiSUVFRSA4MDIuMTEgaGVhZGVyOlxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgZnJhbWVfY3RsICAgPSAweCUwNHhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMTEuZnJhbWVfY3RsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBkdXJhdGlvbl9pZCA9IDB4JTA0eFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5kdXJhdGlvbl9pZCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgYWRkcjEgICAgICAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyMVswXSwgZnJhbWUtPnA4MDIxMS5hZGRyMVsxXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyMVsyXSwgZnJhbWUtPnA4MDIxMS5hZGRyMVszXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyMVs0XSwgZnJhbWUtPnA4MDIxMS5hZGRyMVs1XSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgYWRkcjIgICAgICAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyMlswXSwgZnJhbWUtPnA4MDIxMS5hZGRyMlsxXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyMlsyXSwgZnJhbWUtPnA4MDIxMS5hZGRyMlszXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyMls0XSwgZnJhbWUtPnA4MDIxMS5hZGRyMls1XSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgYWRkcjMgICAgICAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyM1swXSwgZnJhbWUtPnA4MDIxMS5hZGRyM1sxXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyM1syXSwgZnJhbWUtPnA4MDIxMS5hZGRyM1szXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyM1s0XSwgZnJhbWUtPnA4MDIxMS5hZGRyM1s1XSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgc2VxX2N0bCAgICAgPSAweCUwNHhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMTEuc2VxX2N0bCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgYWRkcjQgICAgICAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyNFswXSwgZnJhbWUtPnA4MDIxMS5hZGRyNFsxXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyNFsyXSwgZnJhbWUtPnA4MDIxMS5hZGRyNFszXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyNFs0XSwgZnJhbWUtPnA4MDIxMS5hZGRyNFs1XSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgZGF0YV9sZW4gICAgPSAweCUwNHhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMTEuZGF0YV9sZW4pOworCisJcHJpbnRrKEtFUk5fREVCVUcgIklFRUUgODAyLjMgaGVhZGVyOlxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgZGVzdCAgICAgICAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIzLmhfZGVzdFswXSwgZnJhbWUtPnA4MDIzLmhfZGVzdFsxXSwKKwkgICAgICAgZnJhbWUtPnA4MDIzLmhfZGVzdFsyXSwgZnJhbWUtPnA4MDIzLmhfZGVzdFszXSwKKwkgICAgICAgZnJhbWUtPnA4MDIzLmhfZGVzdFs0XSwgZnJhbWUtPnA4MDIzLmhfZGVzdFs1XSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgc3JjICAgICAgICAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIzLmhfc291cmNlWzBdLCBmcmFtZS0+cDgwMjMuaF9zb3VyY2VbMV0sCisJICAgICAgIGZyYW1lLT5wODAyMy5oX3NvdXJjZVsyXSwgZnJhbWUtPnA4MDIzLmhfc291cmNlWzNdLAorCSAgICAgICBmcmFtZS0+cDgwMjMuaF9zb3VyY2VbNF0sIGZyYW1lLT5wODAyMy5oX3NvdXJjZVs1XSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgbGVuICAgICAgICAgPSAweCUwNHhcbiIsIGZyYW1lLT5wODAyMy5oX3Byb3RvKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJJRUVFIDgwMi4yIExMQy9TTkFQIGhlYWRlcjpcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICIgIERTQVAgICAgICAgID0gMHglMDJ4XG4iLCBmcmFtZS0+cDgwMjIuZHNhcCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgU1NBUCAgICAgICAgPSAweCUwMnhcbiIsIGZyYW1lLT5wODAyMi5zc2FwKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBjdHJsICAgICAgICA9IDB4JTAyeFxuIiwgZnJhbWUtPnA4MDIyLmN0cmwpOworCXByaW50ayhLRVJOX0RFQlVHICIgIE9VSSAgICAgICAgID0gJTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMi5vdWlbMF0sIGZyYW1lLT5wODAyMi5vdWlbMV0sIGZyYW1lLT5wODAyMi5vdWlbMl0pOworCXByaW50ayhLRVJOX0RFQlVHICIgIGV0aGVydHlwZSAgPSAweCUwNHhcbiIsIGZyYW1lLT5ldGhlcnR5cGUpOworfQorI2VuZGlmIC8qIDAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTW9kdWxlIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitFWFBPUlRfU1lNQk9MKGFsbG9jX29yaW5vY29kZXYpOworRVhQT1JUX1NZTUJPTChmcmVlX29yaW5vY29kZXYpOworCitFWFBPUlRfU1lNQk9MKF9fb3Jpbm9jb191cCk7CitFWFBPUlRfU1lNQk9MKF9fb3Jpbm9jb19kb3duKTsKK0VYUE9SVF9TWU1CT0wob3Jpbm9jb19zdG9wKTsKK0VYUE9SVF9TWU1CT0wob3Jpbm9jb19yZWluaXRfZmlybXdhcmUpOworCitFWFBPUlRfU1lNQk9MKG9yaW5vY29faW50ZXJydXB0KTsKKworLyogQ2FuJ3QgYmUgZGVjbGFyZWQgImNvbnN0IiBvciB0aGUgd2hvbGUgX19pbml0ZGF0YSBzZWN0aW9uIHdpbGwKKyAqIGJlY29tZSBjb25zdCAqLworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSBEUklWRVJfTkFNRSAiICIgRFJJVkVSX1ZFUlNJT04KKwkiIChEYXZpZCBHaWJzb24gPGhlcm1lc0BnaWJzb24uZHJvcGJlYXIuaWQuYXU+LCAiCisJIlBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+LCBldCBhbCkiOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X29yaW5vY28odm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIHZlcnNpb24pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9vcmlub2NvKHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KGluaXRfb3Jpbm9jbyk7Cittb2R1bGVfZXhpdChleGl0X29yaW5vY28pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTQyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qIG9yaW5vY28uaAorICogCisgKiBDb21tb24gZGVmaW5pdGlvbnMgdG8gYWxsIHBpZWNlcyBvZiB0aGUgdmFyaW91cyBvcmlub2NvCisgKiBkcml2ZXJzCisgKi8KKworI2lmbmRlZiBfT1JJTk9DT19ICisjZGVmaW5lIF9PUklOT0NPX0gKKworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4xNGFscGhhMiIKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgImhlcm1lcy5oIgorCisvKiBUbyBlbmFibGUgZGVidWcgbWVzc2FnZXMgKi8KKy8vI2RlZmluZSBPUklOT0NPX0RFQlVHCQkzCisKKyNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvLyBlbmFibGUgaXdzcHkgc3VwcG9ydAorCisjZGVmaW5lIE9SSU5PQ09fTUFYX0tFWV9TSVpFCTE0CisjZGVmaW5lIE9SSU5PQ09fTUFYX0tFWVMJNAorCitzdHJ1Y3Qgb3Jpbm9jb19rZXkgeworCXUxNiBsZW47CS8qIGFsd2F5cyBzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbiAqLworCWNoYXIgZGF0YVtPUklOT0NPX01BWF9LRVlfU0laRV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwordHlwZWRlZiBlbnVtIHsKKwlGSVJNV0FSRV9UWVBFX0FHRVJFLAorCUZJUk1XQVJFX1RZUEVfSU5URVJTSUwsCisJRklSTVdBUkVfVFlQRV9TWU1CT0wKK30gZnd0eXBlX3Q7CisKK3N0cnVjdCBvcmlub2NvX3ByaXZhdGUgeworCXZvaWQgKmNhcmQ7CS8qIFBvaW50ZXIgdG8gY2FyZCBkZXBlbmRlbnQgc3RydWN0dXJlICovCisJaW50ICgqaGFyZF9yZXNldCkoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqKTsKKworCS8qIFN5bmNocm9uaXNhdGlvbiBzdHVmZiAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQgaHdfdW5hdmFpbGFibGU7CisJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0X3dvcms7CisKKwkvKiBkcml2ZXIgc3RhdGUgKi8KKwlpbnQgb3BlbjsKKwl1MTYgbGFzdF9saW5rc3RhdHVzOworCisJLyogTmV0IGRldmljZSBzdHVmZiAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBpd19zdGF0aXN0aWNzIHdzdGF0czsKKworCS8qIEhhcmR3YXJlIGNvbnRyb2wgdmFyaWFibGVzICovCisJaGVybWVzX3QgaHc7CisJdTE2IHR4ZmlkOworCisJLyogQ2FwYWJpbGl0aWVzIG9mIHRoZSBoYXJkd2FyZS9maXJtd2FyZSAqLworCWZ3dHlwZV90IGZpcm13YXJlX3R5cGU7CisJY2hhciBmd19uYW1lWzMyXTsKKwlpbnQgaWJzc19wb3J0OworCWludCBuaWNidWZfc2l6ZTsKKwl1MTYgY2hhbm5lbF9tYXNrOworCisJLyogQm9vbGVhbiBjYXBhYmlsaXRpZXMgKi8KKwl1bnNpZ25lZCBpbnQgaGFzX2lic3M6MTsKKwl1bnNpZ25lZCBpbnQgaGFzX3BvcnQzOjE7CisJdW5zaWduZWQgaW50IGhhc193ZXA6MTsKKwl1bnNpZ25lZCBpbnQgaGFzX2JpZ193ZXA6MTsKKwl1bnNpZ25lZCBpbnQgaGFzX213bzoxOworCXVuc2lnbmVkIGludCBoYXNfcG06MTsKKwl1bnNpZ25lZCBpbnQgaGFzX3ByZWFtYmxlOjE7CisJdW5zaWduZWQgaW50IGhhc19zZW5zaXRpdml0eToxOworCXVuc2lnbmVkIGludCBicm9rZW5fZGlzYWJsZXBvcnQ6MTsKKworCS8qIENvbmZpZ3VyYXRpb24gcGFyYW1hdGVycyAqLworCXUzMiBpd19tb2RlOworCWludCBwcmVmZXJfcG9ydDM7CisJdTE2IHdlcF9vbiwgd2VwX3Jlc3RyaWN0LCB0eF9rZXk7CisJc3RydWN0IG9yaW5vY29fa2V5IGtleXNbT1JJTk9DT19NQVhfS0VZU107CisJaW50IGJpdHJhdGVtb2RlOworIAljaGFyIG5pY2tbSVdfRVNTSURfTUFYX1NJWkUrMV07CisJY2hhciBkZXNpcmVkX2Vzc2lkW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCXUxNiBmcmFnX3RocmVzaCwgbXdvX3JvYnVzdDsKKwl1MTYgY2hhbm5lbDsKKwl1MTYgYXBfZGVuc2l0eSwgcnRzX3RocmVzaDsKKwl1MTYgcG1fb24sIHBtX21jYXN0LCBwbV9wZXJpb2QsIHBtX3RpbWVvdXQ7CisJdTE2IHByZWFtYmxlOworI2lmZGVmIFdJUkVMRVNTX1NQWQorCWludAkJCXNweV9udW1iZXI7CisJdV9jaGFyCQkJc3B5X2FkZHJlc3NbSVdfTUFYX1NQWV1bRVRIX0FMRU5dOworCXN0cnVjdCBpd19xdWFsaXR5CXNweV9zdGF0W0lXX01BWF9TUFldOworI2VuZGlmCisKKwkvKiBDb25maWd1cmF0aW9uIGRlcGVuZGVudCB2YXJpYWJsZXMgKi8KKwlpbnQgcG9ydF90eXBlLCBjcmVhdGVpYnNzOworCWludCBwcm9taXNjdW91cywgbWNfY291bnQ7Cit9OworCisjaWZkZWYgT1JJTk9DT19ERUJVRworZXh0ZXJuIGludCBvcmlub2NvX2RlYnVnOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBkbyB7IGlmIChvcmlub2NvX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncyk7IH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgkvKiBPUklOT0NPX0RFQlVHICovCisKKyNkZWZpbmUgVFJBQ0VfRU5URVIoZGV2bmFtZSkgREVCVUcoMiwgIiVzOiAtPiAlcygpXG4iLCBkZXZuYW1lLCBfX0ZVTkNUSU9OX18pOworI2RlZmluZSBUUkFDRV9FWElUKGRldm5hbWUpICBERUJVRygyLCAiJXM6IDwtICVzKClcbiIsIGRldm5hbWUsIF9fRlVOQ1RJT05fXyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEV4cG9ydGVkIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19vcmlub2NvZGV2KGludCBzaXplb2ZfY2FyZCwKKwkJCQkJICAgaW50ICgqaGFyZF9yZXNldCkoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqKSk7CitleHRlcm4gdm9pZCBmcmVlX29yaW5vY29kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IF9fb3Jpbm9jb191cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgX19vcmlub2NvX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IG9yaW5vY29fc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgb3Jpbm9jb19yZWluaXRfZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaXJxcmV0dXJuX3Qgb3Jpbm9jb19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMb2NraW5nIGFuZCBzeW5jaHJvbml6YXRpb24gZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZXNlIGZ1bmN0aW9ucyAqbXVzdCogYmUgaW5saW5lIG9yIHRoZXkgd2lsbCBicmVhayBob3JyaWJseSBvbgorICogU1BBUkMsIGR1ZSB0byBpdHMgd2VpcmQgc2VtYW50aWNzIGZvciBzYXZlL3Jlc3RvcmUgZmxhZ3MuIGV4dGVybgorICogaW5saW5lIHNob3VsZCBwcmV2ZW50IHRoZSBrZXJuZWwgZnJvbSBsaW5raW5nIG9yIG1vZHVsZSBmcm9tCisgKiBsb2FkaW5nIGlmIHRoZXkgYXJlIG5vdCBpbmxpbmVkLiAqLworZXh0ZXJuIGlubGluZSBpbnQgb3Jpbm9jb19sb2NrKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssICpmbGFncyk7CisJaWYgKHByaXYtPmh3X3VuYXZhaWxhYmxlKSB7CisJCURFQlVHKDEsICJvcmlub2NvX2xvY2soKSBjYWxsZWQgd2l0aCBod191bmF2YWlsYWJsZSAoZGV2PSVwKVxuIiwKKwkJICAgICAgIHByaXYtPm5kZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCAqZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIG9yaW5vY29fdW5sb2NrKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsCisJCQkJICB1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCAqZmxhZ3MpOworfQorCisjZW5kaWYgLyogX09SSU5PQ09fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YTgyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMKQEAgLTAsMCArMSw2MzYgQEAKKy8qIG9yaW5vY29fY3MuYyAoZm9ybWVybHkga25vd24gYXMgZGxkd2RfY3MuYykKKyAqCisgKiBBIGRyaXZlciBmb3IgIkhlcm1lcyIgY2hpcHNldCBiYXNlZCBQQ01DSUEgd2lyZWxlc3MgYWRhcHRvcnMsIHN1Y2gKKyAqIGFzIHRoZSBMdWNlbnQgV2F2ZWxhbklFRUUvT3Jpbm9jbyBjYXJkcyBhbmQgdGhlaXIgT0VNIChDYWJsZXRyb24vCisgKiBFbnRlcmFTeXMgUm9hbUFib3V0IDgwMi4xMSwgRUxTQSBBaXJsYW5jZXIsIE1lbGNvIEJ1ZmZhbG8gYW5kIG90aGVycykuCisgKiBJdCBzaG91bGQgYWxzbyBiZSB1c2FibGUgb24gdmFyaW91cyBQcmlzbSBJSSBiYXNlZCBjYXJkcyBzdWNoIGFzIHRoZQorICogTGlua3N5cywgRC1MaW5rIGFuZCBGYXJhbGxvbiBTa3lsaW5lLiBJdCBzaG91bGQgYWxzbyB3b3JrIG9uIFN5bWJvbAorICogY2FyZHMgc3VjaCBhcyB0aGUgM0NvbSBBaXJDb25uZWN0IGFuZCBFcmljc3NvbiBXTEFOLgorICogCisgKiBDb3B5cmlnaHQgbm90aWNlICYgcmVsZWFzZSBub3RlcyBpbiBmaWxlIG9yaW5vY28uYworICovCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgIm9yaW5vY29fY3MiCisjZGVmaW5lIFBGWCBEUklWRVJfTkFNRSAiOiAiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpZmRlZiAgX19JTl9QQ01DSUFfUEFDS0FHRV9fCisjaW5jbHVkZSA8cGNtY2lhL2tfY29tcGF0Lmg+CisjZW5kaWYgLyogX19JTl9QQ01DSUFfUEFDS0FHRV9fICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICJvcmlub2NvLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1vZHVsZSBzdHVmZgkJCQkJCQkgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTU9EVUxFX0FVVEhPUigiRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFBDTUNJQSBMdWNlbnQgT3Jpbm9jbywgUHJpc20gSUkgYmFzZWQgYW5kIHNpbWlsYXIgd2lyZWxlc3MgY2FyZHMiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworLyogU29tZSBELUxpbmsgY2FyZHMgaGF2ZSBidWdneSBDSVMuIFRoZXkgZG8gd29yayBhdCA1diBwcm9wZXJseSwgYnV0CisgKiBkb24ndCBoYXZlIGFueSBDSVMgZW50cnkgZm9yIGl0LiBUaGlzIHdvcmthcm91bmQgaXQuLi4gKi8KK3N0YXRpYyBpbnQgaWdub3JlX2Npc192Y2M7IC8qID0gMCAqLworbW9kdWxlX3BhcmFtKGlnbm9yZV9jaXNfdmNjLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpZ25vcmVfY2lzX3ZjYywgIkFsbG93IHZvbHRhZ2UgbWlzbWF0Y2ggYmV0d2VlbiBjYXJkIGFuZCBzb2NrZXQiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWFnaWMgY29uc3RhbnRzCQkJCQkJICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGUgZGV2X2luZm8gdmFyaWFibGUgaXMgdGhlICJrZXkiIHRoYXQgaXMgdXNlZCB0byBtYXRjaCB1cCB0aGlzCisgKiBkZXZpY2UgZHJpdmVyIHdpdGggYXBwcm9wcmlhdGUgY2FyZHMsIHRocm91Z2ggdGhlIGNhcmQKKyAqIGNvbmZpZ3VyYXRpb24gZGF0YWJhc2UuCisgKi8KK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gRFJJVkVSX05BTUU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERhdGEgc3RydWN0dXJlcwkJCQkJCSAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBQQ01DSUEgc3BlY2lmaWMgZGV2aWNlIGluZm9ybWF0aW9uIChnb2VzIGluIHRoZSBjYXJkIGZpZWxkIG9mCisgKiBzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICovCitzdHJ1Y3Qgb3Jpbm9jb19wY2NhcmQgeworCWRldl9saW5rX3QgbGluazsKKwlkZXZfbm9kZV90IG5vZGU7CisKKwkvKiBVc2VkIHRvIGhhbmRsZSBoYXJkIHJlc2V0ICovCisJLyogeXVjaywgd2UgbmVlZCB0aGlzIGhhY2sgdG8gd29yayBhcm91bmQgdGhlIGluc2FuaXR5IG9mIHRoZQorICAgICAgICAgKiBQQ01DSUEgbGF5ZXIgKi8KKwl1bnNpZ25lZCBsb25nIGhhcmRfcmVzZXRfaW5fcHJvZ3Jlc3M7IAorfTsKKworLyoKKyAqIEEgbGlua2VkIGxpc3Qgb2YgImluc3RhbmNlcyIgb2YgdGhlIGRldmljZS4gIEVhY2ggYWN0dWFsIFBDTUNJQQorICogY2FyZCBjb3JyZXNwb25kcyB0byBvbmUgZGV2aWNlIGluc3RhbmNlLCBhbmQgaXMgZGVzY3JpYmVkIGJ5IG9uZQorICogZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKGRlZmluZWQgaW4gZHMuaCkuCisgKi8KK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsgLyogPSBOVUxMICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMJCQkJCQkgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZGV2aWNlIG1ldGhvZHMgKi8KK3N0YXRpYyBpbnQgb3Jpbm9jb19jc19oYXJkX3Jlc2V0KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpOworCisvKiBQQ01DSUEgZ3VtcGYgKi8KK3N0YXRpYyB2b2lkIG9yaW5vY29fY3NfY29uZmlnKGRldl9saW5rX3QgKiBsaW5rKTsKK3N0YXRpYyB2b2lkIG9yaW5vY29fY3NfcmVsZWFzZShkZXZfbGlua190ICogbGluayk7CitzdGF0aWMgaW50IG9yaW5vY29fY3NfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqIGFyZ3MpOworCitzdGF0aWMgZGV2X2xpbmtfdCAqb3Jpbm9jb19jc19hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBvcmlub2NvX2NzX2RldGFjaChkZXZfbGlua190ICopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZpY2UgbWV0aG9kcyAgICAgCQkJCQkJICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK29yaW5vY29fY3NfaGFyZF9yZXNldChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBvcmlub2NvX3BjY2FyZCAqY2FyZCA9IHByaXYtPmNhcmQ7CisJZGV2X2xpbmtfdCAqbGluayA9ICZjYXJkLT5saW5rOworCWludCBlcnI7CisKKwkvKiBXZSBuZWVkIGF0b21pYyBvcHMgaGVyZSwgYmVjYXVzZSB3ZSdyZSBub3QgaG9sZGluZyB0aGUgbG9jayAqLworCXNldF9iaXQoMCwgJmNhcmQtPmhhcmRfcmVzZXRfaW5fcHJvZ3Jlc3MpOworCisJZXJyID0gcGNtY2lhX3Jlc2V0X2NhcmQobGluay0+aGFuZGxlLCBOVUxMKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbXNsZWVwKDEwMCk7CisJY2xlYXJfYml0KDAsICZjYXJkLT5oYXJkX3Jlc2V0X2luX3Byb2dyZXNzKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ01DSUEgc3R1ZmYgICAgIAkJCQkJCSAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZyBsb2NhbCBkYXRhCisgKiBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGggQ2FyZAorICogU2VydmljZXMuCisgKiAKKyAqIFRoZSBkZXZfbGluayBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseQorICogY29uZmlndXJlIHRoZSBjYXJkIGF0IHRoaXMgcG9pbnQgLS0gd2Ugd2FpdCB1bnRpbCB3ZSByZWNlaXZlIGEgY2FyZAorICogaW5zZXJ0aW9uIGV2ZW50LiAgKi8KK3N0YXRpYyBkZXZfbGlua190ICoKK29yaW5vY29fY3NfYXR0YWNoKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2OworCXN0cnVjdCBvcmlub2NvX3BjY2FyZCAqY2FyZDsKKwlkZXZfbGlua190ICpsaW5rOworCWNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworCWludCByZXQ7CisKKwlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIG9yaW5vY29fY3NfaGFyZF9yZXNldCk7CisJaWYgKCEgZGV2KQorCQlyZXR1cm4gTlVMTDsKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljYXJkID0gcHJpdi0+Y2FyZDsKKworCS8qIExpbmsgYm90aCBzdHJ1Y3R1cmVzIHRvZ2V0aGVyICovCisJbGluayA9ICZjYXJkLT5saW5rOworCWxpbmstPnByaXYgPSBkZXY7CisKKwkvKiBJbnRlcnJ1cHQgc2V0dXAgKi8KKwlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKwlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisJbGluay0+aXJxLkhhbmRsZXIgPSBvcmlub2NvX2ludGVycnVwdDsKKwlsaW5rLT5pcnEuSW5zdGFuY2UgPSBkZXY7IAorCisJLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiBkZWZhdWx0cyBjYW4gZ28gaGVyZS4gIEluIHRoaXMKKwkgKiBjbGllbnQsIHdlIGFzc3VtZSB2ZXJ5IGxpdHRsZSwgYW5kIHJlbHkgb24gdGhlIENJUyBmb3IKKwkgKiBhbG1vc3QgZXZlcnl0aGluZy4gIEluIG1vc3QgY2xpZW50cywgbWFueSBkZXRhaWxzIChpLmUuLAorCSAqIG51bWJlciwgc2l6ZXMsIGFuZCBhdHRyaWJ1dGVzIG9mIElPIHdpbmRvd3MpIGFyZSBmaXhlZCBieQorCSAqIHRoZSBuYXR1cmUgb2YgdGhlIGRldmljZSwgYW5kIGNhbiBiZSBoYXJkLXdpcmVkIGhlcmUuICovCisJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gMDsKKwlsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKworCS8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCS8qIEZJWE1FOiBuZWVkIGEgbG9jaz8gKi8KKwlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisJZGV2X2xpc3QgPSBsaW5rOworCisJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKwljbGllbnRfcmVnLkV2ZW50TWFzayA9CisJCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKwljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmb3Jpbm9jb19jc19ldmVudDsKKwljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7IC8qIEZJWE1FOiB3aGF0IGRvZXMgdGhpcyBtZWFuPyAqLworCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisKKwlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKwlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwkJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwkJb3Jpbm9jb19jc19kZXRhY2gobGluayk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBsaW5rOworfQkJCQkvKiBvcmlub2NvX2NzX2F0dGFjaCAqLworCisvKgorICogVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQgd2l0aAorICogQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzCisgKiBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGUgZGV2aWNlCisgKiBpcyByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQgb3Jpbm9jb19jc19kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKwlkZXZfbGlua190ICoqbGlua3A7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKwkvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworCWZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJCWlmICgqbGlua3AgPT0gbGluaykKKwkJCWJyZWFrOworCisJQlVHX09OKCpsaW5rcCA9PSBOVUxMKTsKKworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCW9yaW5vY29fY3NfcmVsZWFzZShsaW5rKTsKKworCS8qIEJyZWFrIHRoZSBsaW5rIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCWlmIChsaW5rLT5oYW5kbGUpCisJCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisJLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGFuZCBmcmVlIGl0ICovCisJKmxpbmtwID0gbGluay0+bmV4dDsKKwlERUJVRygwLCBQRlggImRldGFjaDogbGluaz0lcCBsaW5rLT5kZXY9JXBcbiIsIGxpbmssIGxpbmstPmRldik7CisJaWYgKGxpbmstPmRldikgeworCQlERUJVRygwLCBQRlggIkFib3V0IHRvIHVucmVnaXN0ZXIgbmV0IGRldmljZSAlcFxuIiwKKwkJICAgICAgZGV2KTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwl9CisJZnJlZV9vcmlub2NvZGV2KGRldik7Cit9CQkJCS8qIG9yaW5vY29fY3NfZGV0YWNoICovCisKKy8qCisgKiBvcmlub2NvX2NzX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTgorICogZXZlbnQgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCisgKiBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisgKi8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBkbyB7IFwKKwkJbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IFwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZAorb3Jpbm9jb19jc19jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwljbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBvcmlub2NvX3BjY2FyZCAqY2FyZCA9IHByaXYtPmNhcmQ7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBsYXN0X2ZuLCBsYXN0X3JldDsKKwl1X2NoYXIgYnVmWzY0XTsKKwljb25maWdfaW5mb190IGNvbmY7CisJY2lzaW5mb190IGluZm87CisJdHVwbGVfdCB0dXBsZTsKKwljaXNwYXJzZV90IHBhcnNlOworCXZvaWQgX19pb21lbSAqbWVtOworCisJQ1NfQ0hFQ0soVmFsaWRhdGVDSVMsIHBjbWNpYV92YWxpZGF0ZV9jaXMoaGFuZGxlLCAmaW5mbykpOworCisJLyoKKwkgKiBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzCisJICogY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisJICovCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5UdXBsZURhdGEgPSBidWY7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisJbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisJbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCisJLyogQ29uZmlndXJlIGNhcmQgKi8KKwlsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisJLyogTG9vayB1cCB0aGUgY3VycmVudCBWY2MgKi8KKwlDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywKKwkJIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGhhbmRsZSwgJmNvbmYpKTsKKwlsaW5rLT5jb25mLlZjYyA9IGNvbmYuVmNjOworCisJLyoKKwkgKiBJbiB0aGlzIGxvb3AsIHdlIHNjYW4gdGhlIENJUyBmb3IgY29uZmlndXJhdGlvbiB0YWJsZQorCSAqIGVudHJpZXMsIGVhY2ggb2Ygd2hpY2ggZGVzY3JpYmVzIGEgdmFsaWQgY2FyZAorCSAqIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyB2b2x0YWdlLCBJTyB3aW5kb3csIG1lbW9yeSB3aW5kb3csCisJICogYW5kIGludGVycnVwdCBzZXR0aW5ncy4KKwkgKgorCSAqIFdlIG1ha2Ugbm8gYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGNhcmQgdG8gYmUgY29uZmlndXJlZDogd2UKKwkgKiB1c2UganVzdCB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIHRoZSBDSVMuICBJbiBhbiBpZGVhbAorCSAqIHdvcmxkLCB0aGlzIHdvdWxkIHdvcmsgZm9yIGFueSBQQ01DSUEgY2FyZCwgYnV0IGl0IHJlcXVpcmVzCisJICogYSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUgQ0lTLiAgSW4gcHJhY3RpY2UsIGEgZHJpdmVyIHVzdWFsbHkKKwkgKiAia25vd3MiIG1vc3Qgb2YgdGhlc2UgdGhpbmdzIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgQ0lTLAorCSAqIGFuZCBtb3N0IGNsaWVudCBkcml2ZXJzIHdpbGwgb25seSB1c2UgdGhlIENJUyB0byBmaWxsIGluCisJICogaW1wbGVtZW50YXRpb24tZGVmaW5lZCBkZXRhaWxzLgorCSAqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl3aGlsZSAoMSkgeworCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOworCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90IGRmbHQgPSB7IC5pbmRleCA9IDAgfTsKKworCQlpZiAoIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpICE9IDApCisJCSAgICB8fCAocGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IDApKQorCQkJZ290byBuZXh0X2VudHJ5OworCisJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkKKwkJCWRmbHQgPSAqY2ZnOworCQlpZiAoY2ZnLT5pbmRleCA9PSAwKQorCQkJZ290byBuZXh0X2VudHJ5OworCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2ZnLT5pbmRleDsKKworCQkvKiBEb2VzIHRoaXMgY2FyZCBuZWVkIGF1ZGlvIG91dHB1dD8gKi8KKwkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9BVURJTykgeworCQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7CisJCQlsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOworCQl9CisKKwkJLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCisJCS8qIE5vdGUgdGhhdCB0aGUgQ0lTIHZhbHVlcyBuZWVkIHRvIGJlIHJlc2NhbGVkICovCisJCWlmIChjZmctPnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCQlpZiAoY29uZi5WY2MgIT0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApIHsKKwkJCQlERUJVRygyLCAib3Jpbm9jb19jc19jb25maWc6IFZjYyBtaXNtYXRjaCAoY29uZi5WY2MgPSAlZCwgQ0lTID0gJWQpXG4iLCAgY29uZi5WY2MsIGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKTsKKwkJCQlpZiAoIWlnbm9yZV9jaXNfdmNjKQorCQkJCQlnb3RvIG5leHRfZW50cnk7CisJCQl9CisJCX0gZWxzZSBpZiAoZGZsdC52Y2MucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgeworCQkJaWYgKGNvbmYuVmNjICE9IGRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKSB7CisJCQkJREVCVUcoMiwgIm9yaW5vY29fY3NfY29uZmlnOiBWY2MgbWlzbWF0Y2ggKGNvbmYuVmNjID0gJWQsIENJUyA9ICVkKVxuIiwgIGNvbmYuVmNjLCBkZmx0LnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMCk7CisJCQkJaWYoIWlnbm9yZV9jaXNfdmNjKQorCQkJCQlnb3RvIG5leHRfZW50cnk7CisJCQl9CisJCX0KKworCQlpZiAoY2ZnLT52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCisJCQlsaW5rLT5jb25mLlZwcDEgPSBsaW5rLT5jb25mLlZwcDIgPQorCQkJICAgIGNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKKwkJZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCisJCQlsaW5rLT5jb25mLlZwcDEgPSBsaW5rLT5jb25mLlZwcDIgPQorCQkJICAgIGRmbHQudnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKKwkJCisJCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLworCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROworCisJCS8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLworCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBsaW5rLT5pby5OdW1Qb3J0czIgPSAwOworCQlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LmlvLm53aW4gPiAwKSkgeworCQkJY2lzdHBsX2lvX3QgKmlvID0KKwkJCSAgICAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQuaW87CisJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQorCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0KKwkJCQkgICAgSU9fREFUQV9QQVRIX1dJRFRIXzE2OworCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9CisJCQkJICAgIElPX0RBVEFfUEFUSF9XSURUSF84OworCQkJbGluay0+aW8uSU9BZGRyTGluZXMgPQorCQkJICAgIGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQkJbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOworCQkJbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJCQlpZiAoaW8tPm53aW4gPiAxKSB7CisJCQkJbGluay0+aW8uQXR0cmlidXRlczIgPQorCQkJCSAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMTsKKwkJCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7CisJCQkJbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47CisJCQl9CisKKwkJCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCisJCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pICE9IDApCisJCQkJZ290byBuZXh0X2VudHJ5OworCQl9CisKKworCQkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCisKKwkJYnJlYWs7CisJCQorCW5leHRfZW50cnk6CisJCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCisJCQlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJCWxhc3RfcmV0ID0gcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKTsKKwkJaWYgKGxhc3RfcmV0ICA9PSBDU19OT19NT1JFX0lURU1TKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJHZXROZXh0VHVwbGUoKTogTm8gbWF0Y2hpbmcgIgorCQkJICAgICAgICJDSVMgY29uZmlndXJhdGlvbi4gIE1heWJlIHlvdSBuZWVkIHRoZSAiCisJCQkgICAgICAgImlnbm9yZV9jaXNfdmNjPTEgcGFyYW1ldGVyLlxuIik7CisJCQlnb3RvIGNzX2ZhaWxlZDsKKwkJfQorCX0KKworCS8qCisJICogQWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhc3NpZ24KKwkgKiBhIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdCwgdW5sZXNzIHRoZSAnSGFuZGxlcicgbWVtYmVyIG9mCisJICogdGhlIGlycSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQuCisJICovCisJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOworCisJLyogV2UgaW5pdGlhbGl6ZSB0aGUgaGVybWVzIHN0cnVjdHVyZSBiZWZvcmUgY29tcGxldGluZyBQQ01DSUEKKwkgKiBjb25maWd1cmF0aW9uIGp1c3QgaW4gY2FzZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZ2V0cworCSAqIGNhbGxlZC4gKi8KKwltZW0gPSBpb3BvcnRfbWFwKGxpbmstPmlvLkJhc2VQb3J0MSwgbGluay0+aW8uTnVtUG9ydHMxKTsKKwlpZiAoIW1lbSkKKwkJZ290byBjc19mYWlsZWQ7CisKKwloZXJtZXNfc3RydWN0X2luaXQoaHcsIG1lbSwgSEVSTUVTXzE2QklUX1JFR1NQQUNJTkcpOworCisJLyoKKwkgKiBUaGlzIGFjdHVhbGx5IGNvbmZpZ3VyZXMgdGhlIFBDTUNJQSBzb2NrZXQgLS0gc2V0dGluZyB1cAorCSAqIHRoZSBJL08gd2luZG93cyBhbmQgdGhlIGludGVycnVwdCBtYXBwaW5nLCBhbmQgcHV0dGluZyB0aGUKKwkgKiBjYXJkIGFuZCBob3N0IGludGVyZmFjZSBpbnRvICJNZW1vcnkgYW5kIElPIiBtb2RlLgorCSAqLworCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLAorCQkgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSk7CisKKwkvKiBPaywgd2UgaGF2ZSB0aGUgY29uZmlndXJhdGlvbiwgcHJlcGFyZSB0byByZWdpc3RlciB0aGUgbmV0ZGV2ICovCisJZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisJZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWNhcmQtPm5vZGUubWFqb3IgPSBjYXJkLT5ub2RlLm1pbm9yID0gMDsKKworCVNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisJLyogVGVsbCB0aGUgc3RhY2sgd2UgZXhpc3QgKi8KKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJyZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKiBBdCB0aGlzIHBvaW50LCB0aGUgZGV2X25vZGVfdCBzdHJ1Y3R1cmUocykgbmVlZHMgdG8gYmUKKwkgKiBpbml0aWFsaXplZCBhbmQgYXJyYW5nZWQgaW4gYSBsaW5rZWQgbGlzdCBhdCBsaW5rLT5kZXYuICovCisJc3RyY3B5KGNhcmQtPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisJbGluay0+ZGV2ID0gJmNhcmQtPm5vZGU7IC8qIGxpbmstPmRldiBiZWluZyBub24tTlVMTCBpcyBhbHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRfZGV2aWNlIGhhcyBiZWVuIHJlZ2lzdGVyZWQgKi8KKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworCisJLyogRmluYWxseSwgcmVwb3J0IHdoYXQgd2UndmUgZG9uZSAqLworCXByaW50ayhLRVJOX0RFQlVHICIlczogaW5kZXggMHglMDJ4OiBWY2MgJWQuJWQiLAorCSAgICAgICBkZXYtPm5hbWUsIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgsCisJICAgICAgIGxpbmstPmNvbmYuVmNjIC8gMTAsIGxpbmstPmNvbmYuVmNjICUgMTApOworCWlmIChsaW5rLT5jb25mLlZwcDEpCisJCXByaW50aygiLCBWcHAgJWQuJWQiLCBsaW5rLT5jb25mLlZwcDEgLyAxMCwKKwkJICAgICAgIGxpbmstPmNvbmYuVnBwMSAlIDEwKTsKKwlwcmludGsoIiwgaXJxICVkIiwgbGluay0+aXJxLkFzc2lnbmVkSVJRKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMxKQorCQlwcmludGsoIiwgaW8gMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MSwKKwkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MSArIGxpbmstPmlvLk51bVBvcnRzMSAtIDEpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czIpCisJCXByaW50aygiICYgMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MiwKKwkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MiArIGxpbmstPmlvLk51bVBvcnRzMiAtIDEpOworCXByaW50aygiXG4iKTsKKworCXJldHVybjsKKworIGNzX2ZhaWxlZDoKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKKworIGZhaWxlZDoKKwlvcmlub2NvX2NzX3JlbGVhc2UobGluayk7Cit9CQkJCS8qIG9yaW5vY29fY3NfY29uZmlnICovCisKKy8qCisgKiBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgb3Jpbm9jb19jc19yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZQorICogZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgKiBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKyAqLworc3RhdGljIHZvaWQKK29yaW5vY29fY3NfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBXZSdyZSBjb21taXR0ZWQgdG8gdGFraW5nIHRoZSBkZXZpY2UgYXdheSBub3csIHNvIG1hcmsgdGhlCisJICogaGFyZHdhcmUgYXMgdW5hdmFpbGFibGUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXByaXYtPmh3X3VuYXZhaWxhYmxlKys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogRG9uJ3QgYm90aGVyIGNoZWNraW5nIHRvIHNlZSBpZiB0aGVzZSBzdWNjZWVkIG9yIG5vdCAqLworCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMxKQorCQlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJaWYgKGxpbmstPmlycS5Bc3NpZ25lZElSUSkKKwkJcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7CisJaWYgKHByaXYtPmh3LmlvYmFzZSkKKwkJaW9wb3J0X3VubWFwKHByaXYtPmh3LmlvYmFzZSk7Cit9CQkJCS8qIG9yaW5vY29fY3NfcmVsZWFzZSAqLworCisvKgorICogVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuICBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyIHN0dWZmCisgKiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuCisgKi8KK3N0YXRpYyBpbnQKK29yaW5vY29fY3NfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICogYXJncykKK3sKKwlkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG9yaW5vY29fcGNjYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCQlwcml2LT5od191bmF2YWlsYWJsZSsrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJCW9yaW5vY29fY3NfY29uZmlnKGxpbmspOworCQlicmVhazsKKworCWNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJCS8qIE1hcmsgdGhlIGRldmljZSBhcyBzdG9wcGVkLCB0byBibG9jayBJTyB1bnRpbCBsYXRlciAqLworCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQkvKiBUaGlzIGlzIHByb2JhYmx5IHJhY3ksIGJ1dCBJIGNhbid0IHRoaW5rIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGJldHRlciB3YXksIHNob3J0IG9mIHJld3JpdGluZyB0aGUgUENNQ0lBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciB0byBub3Qgc3VjayA6LSggKi8KKwkJCWlmICghIHRlc3RfYml0KDAsICZjYXJkLT5oYXJkX3Jlc2V0X2luX3Byb2dyZXNzKSkgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkJCQllcnIgPSBfX29yaW5vY29fZG93bihkZXYpOworCQkJCWlmIChlcnIpCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlczogRXJyb3IgJWQgZG93bmluZyBpbnRlcmZhY2VcbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsCisJCQkJCSAgICAgICBldmVudCA9PSBDU19FVkVOVF9QTV9TVVNQRU5EID8gIlNVU1BFTkQiIDogIlJFU0VUX1BIWVNJQ0FMIiwKKwkJCQkJICAgICAgIGVycik7CisJCQkJCisJCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJCXByaXYtPmh3X3VuYXZhaWxhYmxlKys7CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQl9CisKKwkJCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJLyogRklYTUU6IHNob3VsZCB3ZSBkb3VibGUgY2hlY2sgdGhhdCB0aGlzIGlzCisJCQkgKiB0aGUgc2FtZSBjYXJkIGFzIHdlIGhhZCBiZWZvcmUgKi8KKwkJCXBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisKKwkJCWlmICghIHRlc3RfYml0KDAsICZjYXJkLT5oYXJkX3Jlc2V0X2luX3Byb2dyZXNzKSkgeworCQkJCWVyciA9IG9yaW5vY29fcmVpbml0X2Zpcm13YXJlKGRldik7CisJCQkJaWYgKGVycikgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCByZS1pbml0aWFsaXppbmcgZmlybXdhcmVcbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJCQorCQkJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkJCQlwcml2LT5od191bmF2YWlsYWJsZS0tOworCQkJCQorCQkJCWlmIChwcml2LT5vcGVuICYmICEgcHJpdi0+aHdfdW5hdmFpbGFibGUpIHsKKwkJCQkJZXJyID0gX19vcmlub2NvX3VwKGRldik7CisJCQkJCWlmIChlcnIpCisJCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCByZXN0YXJ0aW5nIGNhcmRcbiIsCisJCQkJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJCQkKKwkJCQl9CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30JCQkJLyogb3Jpbm9jb19jc19ldmVudCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24JCQkJCSAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDYW4ndCBiZSBkZWNsYXJlZCAiY29uc3QiIG9yIHRoZSB3aG9sZSBfX2luaXRkYXRhIHNlY3Rpb24gd2lsbAorICogYmVjb21lIGNvbnN0ICovCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9IERSSVZFUl9OQU1FICIgIiBEUklWRVJfVkVSU0lPTgorCSIgKERhdmlkIEdpYnNvbiA8aGVybWVzQGdpYnNvbi5kcm9wYmVhci5pZC5hdT4sICIKKwkiUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4sIGV0IGFsKSI7CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBvcmlub2NvX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gRFJJVkVSX05BTUUsCisJfSwKKwkuYXR0YWNoCQk9IG9yaW5vY29fY3NfYXR0YWNoLAorCS5kZXRhY2gJCT0gb3Jpbm9jb19jc19kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF9vcmlub2NvX2NzKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCB2ZXJzaW9uKTsKKworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZvcmlub2NvX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZXhpdF9vcmlub2NvX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZvcmlub2NvX2RyaXZlcik7CisJQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfQorCittb2R1bGVfaW5pdChpbml0X29yaW5vY29fY3MpOworbW9kdWxlX2V4aXQoZXhpdF9vcmlub2NvX2NzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzBkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BjaS5jCkBAIC0wLDAgKzEsNDE3IEBACisvKiBvcmlub2NvX3BjaS5jCisgKiAKKyAqIERyaXZlciBmb3IgUHJpc20gSUkgZGV2aWNlcyB0aGF0IGhhdmUgYSBkaXJlY3QgUENJIGludGVyZmFjZQorICogKGkuZS4sIG5vdCBpbiBhIFBjbWNpYSBvciBQTFggYnJpZGdlKQorICoKKyAqIFNwZWNpZmljYWxseSBoZXJlIHdlJ3JlIHRhbGtpbmcgYWJvdXQgdGhlIExpbmtzeXMgV01QMTEKKyAqCisgKiBDdXJyZW50IG1haW50YWluZXJzIChhcyBvZiAyOSBTZXB0ZW1iZXIgMjAwMykgYXJlOgorICogCVBhdmVsIFJvc2tpbiA8cHJvc2tpIEFUIGdudS5vcmc+CisgKiBhbmQJRGF2aWQgR2lic29uIDxoZXJtZXMgQVQgZ2lic29uLmRyb3BiZWFyLmlkLmF1PgorICoKKyAqIFNvbWUgb2YgdGhpcyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gb3Jpbm9jb19wbHguYworICoJQ29weXJpZ2h0IChDKSAyMDAxIERhbmllbCBCYXJsb3cgPGRhbiBBVCB0ZWxlbnQubmV0PgorICogU29tZSBvZiB0aGlzIGNvZGUgaXMgImluc3BpcmVkIiBieSBsaW51eC13bGFuLW5nLTAuMS4xMCwgYnV0IG5vdGhpbmcKKyAqIGhhcyBiZWVuIGNvcGllZCBmcm9tIGl0LiBsaW51eC13bGFuLW5nLTAuMS4xMCBpcyBvcmlnaW5hbGx5IDoKKyAqCUNvcHlyaWdodCAoQykgMTk5OSBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBUaGlzIGZpbGUgb3JpZ2luYWxseSB3cml0dGVuIGJ5OgorICoJQ29weXJpZ2h0IChDKSAyMDAxIEplYW4gVG91cnJpbGhlcyA8anQgQVQgaHBsLmhwLmNvbT4KKyAqIEFuZCBpcyBub3cgbWFpbnRhaW5lZCBieToKKyAqCShDKSBDb3B5cmlnaHQgRGF2aWQgR2lic29uLCBJQk0gQ29ycC4gMjAwMi0yMDAzLgorICoKKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4KKyAqIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKyAqCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiCisgKiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlCisgKiB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQorICogYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIKKyAqIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkKKyAqIGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZAorICogb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlCisgKiBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCisgKi8KKworLyoKKyAqIFRoZW9yeSBvZiBvcGVyYXRpb24uLi4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1heWJlIHlvdSBoYWQgYSBsb29rIGluIG9yaW5vY29fcGx4LiBXZWxsLCB0aGlzIGlzIHRvdGFsbHkgZGlmZmVyZW50Li4uCisgKgorICogVGhlIGNhcmQgY29udGFpbnMgb25seSBvbmUgUENJIHJlZ2lvbiwgd2hpY2ggY29udGFpbnMgYWxsIHRoZSB1c3VhbAorICogaGVybWVzIHJlZ2lzdGVycy4KKyAqCisgKiBUaGUgZHJpdmVyIHdpbGwgbWVtb3J5IG1hcCB0aGlzIHJlZ2lvbiBpbiBub3JtYWwgbWVtb3J5LiBCZWNhdXNlCisgKiB0aGUgaGVybWVzIHJlZ2lzdGVycyBhcmUgbWFwcGVkIGluIG5vcm1hbCBtZW1vcnkgYW5kIG5vdCBpbiBJU0EgSS9PCisgKiBwb3N0IHNwYWNlLCB3ZSBjYW4ndCB1c2UgdGhlIHVzdWFsIGludy9vdXR3IG1hY3JvcyBhbmQgd2UgbmVlZCB0bworICogdXNlIHJlYWR3L3dyaXRldy4KKyAqIFRoaXMgc2xpZ2h0IGRpZmZlcmVuY2UgZm9yY2UgdXMgdG8gY29tcGlsZSBvdXIgb3duIHZlcnNpb24gb2YKKyAqIGhlcm1lcy5jIHdpdGggdGhlIHJlZ2lzdGVyIGFjY2VzcyBtYWNybyBjaGFuZ2VkLiBUaGF0J3MgYSBiaXQKKyAqIGhhY2tpc2ggYnV0IHdvcmtzIGZpbmUuCisgKgorICogTm90ZSB0aGF0IHRoZSBQQ0kgcmVnaW9uIGlzIHByZXR0eSBiaWcgKDRLKS4gVGhhdCdzIG11Y2ggbW9yZSB0aGFuCisgKiB0aGUgdXN1YWwgc2V0IG9mIGhlcm1lcyByZWdpc3RlciAoMHgwIC0+IDB4M0UpLiBJJ3ZlIGdvdCBhIHN0cm9uZworICogc3VzcGljaW9uIHRoYXQgdGhlIHdob2xlIG1lbW9yeSBzcGFjZSBvZiB0aGUgYWRhcHRlciBpcyBpbiBmYWN0IGluCisgKiB0aGlzIHJlZ2lvbi4gQWNjZXNzaW5nIGRpcmVjdGx5IHRoZSBhZGFwdGVyIG1lbW9yeSBpbnN0ZWFkIG9mIGdvaW5nCisgKiB0aHJvdWdoIHRoZSB1c3VhbCByZWdpc3RlciB3b3VsZCBzcGVlZCB1cCBzaWduaWZpY2FudGVseSB0aGUKKyAqIG9wZXJhdGlvbnMuLi4KKyAqCisgKiBGaW5hbGx5LCB0aGUgY2FyZCBsb29rcyBsaWtlIHRoaXMgOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQnVzICAwLCBkZXZpY2UgIDE0LCBmdW5jdGlvbiAgMDoKKyAgICBOZXR3b3JrIGNvbnRyb2xsZXI6IFBDSSBkZXZpY2UgMTI2MDozODczIChIYXJyaXMgU2VtaWNvbmR1Y3RvcikgKHJldiAxKS4KKyAgICAgIElSUSAxMS4KKyAgICAgIE1hc3RlciBDYXBhYmxlLiAgTGF0ZW5jeT0yNDguICAKKyAgICAgIFByZWZldGNoYWJsZSAzMiBiaXQgbWVtb3J5IGF0IDB4ZmZiY2MwMDAgWzB4ZmZiY2NmZmZdLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAwOjBlLjAgTmV0d29yayBjb250cm9sbGVyOiBIYXJyaXMgU2VtaWNvbmR1Y3RvcjogVW5rbm93biBkZXZpY2UgMzg3MyAocmV2IDAxKQorICAgICAgICBTdWJzeXN0ZW06IFVua25vd24gZGV2aWNlIDE3Mzc6Mzg3NAorICAgICAgICBDb250cm9sOiBJL08rIE1lbSsgQnVzTWFzdGVyKyBTcGVjQ3ljbGUtIE1lbVdJTlYtIFZHQVNub29wLSBQYXJFcnItIFN0ZXBwaW5nLSBTRVJSLSBGYXN0QjJCLQorICAgICAgICBTdGF0dXM6IENhcCsgNjZNaHotIFVERi0gRmFzdEIyQisgUGFyRXJyLSBERVZTRUw9bWVkaXVtID5UQWJvcnQtIDxUQWJvcnQtIDxNQWJvcnQtID5TRVJSLSA8UEVSUi0KKyAgICAgICAgTGF0ZW5jeTogMjQ4IHNldCwgY2FjaGUgbGluZSBzaXplIDA4CisgICAgICAgIEludGVycnVwdDogcGluIEEgcm91dGVkIHRvIElSUSAxMQorICAgICAgICBSZWdpb24gMDogTWVtb3J5IGF0IGZmYmNjMDAwICgzMi1iaXQsIHByZWZldGNoYWJsZSkgW3NpemU9NEtdCisgICAgICAgIENhcGFiaWxpdGllczogW2RjXSBQb3dlciBNYW5hZ2VtZW50IHZlcnNpb24gMgorICAgICAgICAgICAgICAgIEZsYWdzOiBQTUVDbGstIEF1eFB3ci0gRFNJLSBEMSsgRDIrIFBNRSsKKyAgICAgICAgICAgICAgICBTdGF0dXM6IEQwIFBNRS1FbmFibGUtIERTZWw9MCBEU2NhbGU9MCBQTUUtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoYXQncyBhbGwuLgorICoKKyAqIEplYW4gSUkKKyAqLworCisjZGVmaW5lIERSSVZFUl9OQU1FICJvcmlub2NvX3BjaSIKKyNkZWZpbmUgUEZYIERSSVZFUl9OQU1FICI6ICIKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAiaGVybWVzLmgiCisjaW5jbHVkZSAib3Jpbm9jby5oIgorCisvKiBBbGwgdGhlIG1hZ2ljIHRoZXJlIGlzIGZyb20gd2xhbi1uZyAqLworLyogTWFnaWMgb2Zmc2V0IG9mIHRoZSByZXNldCByZWdpc3RlciBvZiB0aGUgUENJIGNhcmQgKi8KKyNkZWZpbmUgSEVSTUVTX1BDSV9DT1IJCSgweDI2KQorLyogTWFnaWMgYml0bWFzayB0byByZXNldCB0aGUgY2FyZCAqLworI2RlZmluZSBIRVJNRVNfUENJX0NPUl9NQVNLCSgweDAwODApCisvKiBNYWdpYyB0aW1lb3V0cyBmb3IgZG9pbmcgdGhlIHJlc2V0LgorICogVGhvc2UgdGltZXMgYXJlIHN0cmFpZ2h0IGZyb20gd2xhbi1uZywgYW5kIGl0IGlzIGNsYWltZWQgdGhhdCB0aGV5CisgKiBhcmUgbmVjZXNzYXJ5LiBBbGFuIHdpbGwga2lsbCBtZS4gVGFrZSB5b3VyIHRpbWUgYW5kIGdyYWIgYSBjb2ZmZWUuICovCisjZGVmaW5lIEhFUk1FU19QQ0lfQ09SX09OVAkoMjUwKQkJLyogbXMgKi8KKyNkZWZpbmUgSEVSTUVTX1BDSV9DT1JfT0ZGVAkoNTAwKQkJLyogbXMgKi8KKyNkZWZpbmUgSEVSTUVTX1BDSV9DT1JfQlVTWVQJKDUwMCkJCS8qIG1zICovCisKKy8qIE9yaW5vY28gUENJIHNwZWNpZmljIGRhdGEgKi8KK3N0cnVjdCBvcmlub2NvX3BjaV9jYXJkIHsKKwl2b2lkIF9faW9tZW0gKnBjaV9pb2FkZHI7Cit9OworCisvKgorICogRG8gYSBzb2Z0IHJlc2V0IG9mIHRoZSBQQ0kgY2FyZCB1c2luZyB0aGUgQ29uZmlndXJhdGlvbiBPcHRpb24gUmVnaXN0ZXIKKyAqIFdlIG5lZWQgdGhpcyB0byBnZXQgZ29pbmcuLi4KKyAqIFRoaXMgaXMgdGhlIHBhcnQgb2YgdGhlIGNvZGUgdGhhdCBpcyBzdHJvbmdseSBpbnNwaXJlZCBmcm9tIHdsYW4tbmcKKyAqCisgKiBOb3RlIDogVGhpcyBjb2RlIGlzIGRvbmUgd2l0aCBpcnEgZW5hYmxlZC4gVGhpcyBtZWFuIHRoYXQgbWFueQorICogaW50ZXJydXB0cyB3aWxsIG9jY3VyIHdoaWxlIHdlIGFyZSB0aGVyZS4gVGhpcyBpcyB3aHkgd2UgdXNlIHRoZQorICogamlmZmllcyB0byByZWd1bGF0ZSB0aW1lIGluc3RlYWQgb2YgYSBzdHJhaWdodCBtZGVsYXkoKS4gVXN1YWxseSB3ZQorICogbmVlZCBvbmx5IGFyb3VuZCAyNDUgaXRlcmF0aW9uIG9mIHRoZSBsb29wIHRvIGRvIDI1MCBtcyBkZWxheS4KKyAqCisgKiBOb3RlIGJpcyA6IERvbid0IHRyeSB0byBhY2Nlc3MgSEVSTUVTX0NNRCBkdXJpbmcgdGhlIHJlc2V0IHBoYXNlLgorICogSXQganVzdCB3b24ndCB3b3JrICEKKyAqLworc3RhdGljIGludAorb3Jpbm9jb19wY2lfY29yX3Jlc2V0KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCit7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXVuc2lnbmVkIGxvbmcJdGltZW91dDsKKwl1MTYJcmVnOworCisJLyogQXNzZXJ0IHRoZSByZXNldCB1bnRpbCB0aGUgY2FyZCBub3RpY2UgKi8KKwloZXJtZXNfd3JpdGVfcmVnbihodywgUENJX0NPUiwgSEVSTUVTX1BDSV9DT1JfTUFTSyk7CisJbWRlbGF5KEhFUk1FU19QQ0lfQ09SX09OVCk7CisKKwkvKiBHaXZlIHRpbWUgZm9yIHRoZSBjYXJkIHRvIHJlY292ZXIgZnJvbSB0aGlzIGhhcmQgZWZmb3J0ICovCisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIFBDSV9DT1IsIDB4MDAwMCk7CisJbWRlbGF5KEhFUk1FU19QQ0lfQ09SX09GRlQpOworCisJLyogVGhlIGNhcmQgaXMgcmVhZHkgd2hlbiBpdCdzIG5vIGxvbmdlciBidXN5ICovCisJdGltZW91dCA9IGppZmZpZXMgKyAoSEVSTUVTX1BDSV9DT1JfQlVTWVQgKiBIWiAvIDEwMDApOworCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIENNRCk7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmIChyZWcgJiBIRVJNRVNfQ01EX0JVU1kpKSB7CisJCW1kZWxheSgxKTsKKwkJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgQ01EKTsKKwl9CisKKwkvKiBTdGlsbCBidXN5PyAqLworCWlmIChyZWcgJiBIRVJNRVNfQ01EX0JVU1kpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQnVzeSB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbml0aWFsaXNlIGEgY2FyZC4gTW9zdGx5IHNpbWlsYXIgdG8gUExYIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgb3Jpbm9jb19wY2lfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIHBjaV9pb3JhbmdlOworCXUxNiBfX2lvbWVtICpwY2lfaW9hZGRyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHBjaV9pb2xlbjsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gTlVMTDsKKwlzdHJ1Y3Qgb3Jpbm9jb19wY2lfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSSVZFUl9OQU1FKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzXG4iKTsKKwkJZ290byBmYWlsX3Jlc291cmNlczsKKwl9CisKKwkvKiBSZXNvdXJjZSAwIGlzIG1hcHBlZCB0byB0aGUgaGVybWVzIHJlZ2lzdGVycyAqLworCXBjaV9pb3JhbmdlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCXBjaV9pb2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisJcGNpX2lvYWRkciA9IGlvcmVtYXAocGNpX2lvcmFuZ2UsIHBjaV9pb2xlbik7CisJaWYgKCFwY2lfaW9yYW5nZSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgcmVtYXAgaGFyZHdhcmUgcmVnaXN0ZXJzXG4iKTsKKwkJZ290byBmYWlsX21hcDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBuZXR3b3JrIGRldmljZSAqLworCWRldiA9IGFsbG9jX29yaW5vY29kZXYoc2l6ZW9mKCpjYXJkKSwgb3Jpbm9jb19wY2lfY29yX3Jlc2V0KTsKKwlpZiAoISBkZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2FsbG9jOworCX0KKworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNhcmQgPSBwcml2LT5jYXJkOworCWNhcmQtPnBjaV9pb2FkZHIgPSBwY2lfaW9hZGRyOworCWRldi0+bWVtX3N0YXJ0ID0gcGNpX2lvcmFuZ2U7CisJZGV2LT5tZW1fZW5kID0gcGNpX2lvcmFuZ2UgKyBwY2lfaW9sZW4gLSAxOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJaGVybWVzX3N0cnVjdF9pbml0KCZwcml2LT5odywgcGNpX2lvYWRkciwgSEVSTUVTXzMyQklUX1JFR1NQQUNJTkcpOworCisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJEZXRlY3RlZCBkZXZpY2UgJXMsIG1lbToweCVseC0weCVseCwgaXJxICVkXG4iLAorCSAgICAgICBwY2lfbmFtZShwZGV2KSwgZGV2LT5tZW1fc3RhcnQsIGRldi0+bWVtX2VuZCwgcGRldi0+aXJxKTsKKworCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgb3Jpbm9jb19pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJICBkZXYtPm5hbWUsIGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgSVJRICVkXG4iLCBwZGV2LT5pcnEpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZmFpbF9pcnE7CisJfQorCWRldi0+aXJxID0gcGRldi0+aXJxOworCisJLyogUGVyZm9ybSBhIENPUiByZXNldCB0byBzdGFydCB0aGUgY2FyZCAqLworCWVyciA9IG9yaW5vY29fcGNpX2Nvcl9yZXNldChwcml2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkluaXRpYWwgcmVzZXQgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRmFpbGVkIHRvIHJlZ2lzdGVyIG5ldCBkZXZpY2VcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlyZXR1cm4gMDsKKworIGZhaWw6CisJZnJlZV9pcnEocGRldi0+aXJxLCBkZXYpOworCisgZmFpbF9pcnE6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfb3Jpbm9jb2RldihkZXYpOworCisgZmFpbF9hbGxvYzoKKwlpb3VubWFwKHBjaV9pb2FkZHIpOworCisgZmFpbF9tYXA6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworIGZhaWxfcmVzb3VyY2VzOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBvcmlub2NvX3BjaV9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG9yaW5vY29fcGNpX2NhcmQgKmNhcmQgPSBwcml2LT5jYXJkOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9vcmlub2NvZGV2KGRldik7CisJaW91bm1hcChjYXJkLT5wY2lfaW9hZGRyKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworc3RhdGljIGludCBvcmlub2NvX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisJCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBPcmlub2NvLVBDSSBlbnRlcmluZyBzbGVlcCBtb2RlIChzdGF0ZT0lZClcbiIsCisJICAgICAgIGRldi0+bmFtZSwgc3RhdGUpOworCisJZXJyID0gb3Jpbm9jb19sb2NrKHByaXYsICZmbGFncyk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBod191bmF2YWlsYWJsZSBvbiBvcmlub2NvX3BjaV9zdXNwZW5kXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBfX29yaW5vY29fZG93bihkZXYpOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBvcmlub2NvX3BjaV9zdXNwZW5kKCk6IEVycm9yICVkIGRvd25pbmcgaW50ZXJmYWNlXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQorCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKworCXByaXYtPmh3X3VuYXZhaWxhYmxlKys7CisJCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE9yaW5vY28tUENJIHdha2luZyB1cFxuIiwgZGV2LT5uYW1lKTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKKwllcnIgPSBvcmlub2NvX3JlaW5pdF9maXJtd2FyZShkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgcmUtaW5pdGlhbGl6aW5nIGZpcm13YXJlIG9uIG9yaW5vY29fcGNpX3Jlc3VtZSgpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwlwcml2LT5od191bmF2YWlsYWJsZS0tOworCisJaWYgKHByaXYtPm9wZW4gJiYgKCEgcHJpdi0+aHdfdW5hdmFpbGFibGUpKSB7CisJCWVyciA9IF9fb3Jpbm9jb191cChkZXYpOworCQlpZiAoZXJyKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgcmVzdGFydGluZyBjYXJkIG9uIG9yaW5vY29fcGNpX3Jlc3VtZSgpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwl9CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBvcmlub2NvX3BjaV9wY2lfaWRfdGFibGVbXSA9IHsKKwkvKiBJbnRlcnNpbCBQcmlzbSAzICovCisJezB4MTI2MCwgMHgzODcyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCisJLyogSW50ZXJzaWwgUHJpc20gMi41ICovCisJezB4MTI2MCwgMHgzODczLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCisJLyogU2Ftc3VuZyBNYWdpY0xBTiBTV0wtMjIxMFAgKi8KKwl7MHgxNjdkLCAweGEwMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwKKwl7MCx9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG9yaW5vY29fcGNpX3BjaV9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBvcmlub2NvX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJJVkVSX05BTUUsCisJLmlkX3RhYmxlCT0gb3Jpbm9jb19wY2lfcGNpX2lkX3RhYmxlLAorCS5wcm9iZQkJPSBvcmlub2NvX3BjaV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG9yaW5vY29fcGNpX3JlbW92ZV9vbmUpLAorCS5zdXNwZW5kCT0gb3Jpbm9jb19wY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG9yaW5vY29fcGNpX3Jlc3VtZSwKK307CisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gRFJJVkVSX05BTUUgIiAiIERSSVZFUl9WRVJTSU9OCisJIiAoUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4sIgorCSIgRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiAmIgorCSIgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPikiOworTU9EVUxFX0FVVEhPUigiUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4gJiBEYXZpZCBHaWJzb24gPGhlcm1lc0BnaWJzb24uZHJvcGJlYXIuaWQuYXU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3Igd2lyZWxlc3MgTEFOIGNhcmRzIHVzaW5nIGRpcmVjdCBQQ0kgaW50ZXJmYWNlIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0IG9yaW5vY29fcGNpX2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIHZlcnNpb24pOworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJm9yaW5vY29fcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvcmlub2NvX3BjaV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZvcmlub2NvX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChvcmlub2NvX3BjaV9pbml0KTsKK21vZHVsZV9leGl0KG9yaW5vY29fcGNpX2V4aXQpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19wbHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGx4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiMDViOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGx4LmMKQEAgLTAsMCArMSw0MTkgQEAKKy8qIG9yaW5vY29fcGx4LmMKKyAqCisgKiBEcml2ZXIgZm9yIFByaXNtIElJIGRldmljZXMgd2hpY2ggd291bGQgdXN1YWxseSBiZSBkcml2ZW4gYnkgb3Jpbm9jb19jcywKKyAqIGJ1dCBhcmUgY29ubmVjdGVkIHRvIHRoZSBQQ0kgYnVzIGJ5IGEgUExYOTA1Mi4KKyAqCisgKiBDdXJyZW50IG1haW50YWluZXJzIChhcyBvZiAyOSBTZXB0ZW1iZXIgMjAwMykgYXJlOgorICogCVBhdmVsIFJvc2tpbiA8cHJvc2tpIEFUIGdudS5vcmc+CisgKiBhbmQJRGF2aWQgR2lic29uIDxoZXJtZXMgQVQgZ2lic29uLmRyb3BiZWFyLmlkLmF1PgorICoKKyAqIChDKSBDb3B5cmlnaHQgRGF2aWQgR2lic29uLCBJQk0gQ29ycC4gMjAwMS0yMDAzLgorICogQ29weXJpZ2h0IChDKSAyMDAxIERhbmllbCBCYXJsb3cKKyAqCisgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCisgKiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisgKgorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgorICogYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZQorICogdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKKyAqIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5CisgKiBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQKKyAqIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZQorICogcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgorCisgKiBDYXV0aW9uOiB0aGlzIGlzIGV4cGVyaW1lbnRhbCBhbmQgcHJvYmFibHkgYnVnZ3kuICBGb3Igc3VjY2VzcyBhbmQKKyAqIGZhaWx1cmUgcmVwb3J0cyBmb3IgZGlmZmVyZW50IGNhcmRzIGFuZCBhZGFwdG9ycywgc2VlCisgKiBvcmlub2NvX3BseF9wY2lfaWRfdGFibGUgbmVhciB0aGUgZW5kIG9mIHRoZSBmaWxlLiAgSWYgeW91IGhhdmUgYQorICogY2FyZCB3ZSBkb24ndCBoYXZlIHRoZSBQQ0kgaWQgZm9yLCBhbmQgbG9va3MgbGlrZSBpdCBzaG91bGQgd29yaywKKyAqIGRyb3AgbWUgbWFpbCB3aXRoIHRoZSBpZCBhbmQgIml0IHdvcmtzIi8iaXQgZG9lc24ndCB3b3JrIi4KKyAqCisgKiBOb3RlOiBpZiBldmVyeXRoaW5nIGdldHMgZGV0ZWN0ZWQgZmluZSBidXQgaXQgZG9lc24ndCBhY3R1YWxseSBzZW5kCisgKiBvciByZWNlaXZlIHBhY2tldHMsIHlvdXIgZmlyc3QgcG9ydCBvZiBjYWxsIHNob3VsZCBwcm9iYWJseSBiZSB0bworICogdHJ5IG5ld2VyIGZpcm13YXJlIGluIHRoZSBjYXJkLiAgRXNwZWNpYWxseSBpZiB5b3UncmUgZG9pbmcgQWQtSG9jCisgKiBtb2Rlcy4KKyAqCisgKiBUaGUgYWN0dWFsIGRyaXZpbmcgaXMgZG9uZSBieSBvcmlub2NvLmMsIHRoaXMgaXMganVzdCByZXNvdXJjZQorICogYWxsb2NhdGlvbiBzdHVmZi4gIFRoZSBleHBsYW5hdGlvbiBiZWxvdyBpcyBjb3VydGVzeSBvZiBSeWFuIE5pZW1pCisgKiBvbiB0aGUgbGludXgtd2xhbi1uZyBsaXN0IGF0CisgKiBodHRwOi8vYXJjaGl2ZXMubmVvaGFwc2lzLmNvbS9hcmNoaXZlcy9kZXYvbGludXgtd2xhbi8yMDAxLXExLzAwMjYuaHRtbAorICoKKyAqIFRoZSBQTFg5MDUyLWJhc2VkIGNhcmRzIChXTDExMDAwIGFuZCBzZXZlcmFsIG90aGVycykgYXJlIGEKKyAqIGRpZmZlcmVudCBiZWFzdCB0aGFuIHRoZSB1c3VhbCBQQ01DSUEtYmFzZWQgUFJJU00yIGNvbmZpZ3VyYXRpb24KKyAqIGV4cGVjdGVkIGJ5IHdsYW4tbmcuICBIZXJlJ3MgdGhlIGdlbmVyYWwgZGV0YWlscyBvbiBob3cgdGhlIFdMMTEwMDAKKyAqIFBDSSBhZGFwdGVyIHdvcmtzOgorICoKKyAqIC0gVHdvIFBDSSBJL08gYWRkcmVzcyBzcGFjZXMsIG9uZSAweDgwIGxvbmcgd2hpY2ggY29udGFpbnMgdGhlCisgKiBQTFg5MDUyIHJlZ2lzdGVycywgYW5kIG9uZSB0aGF0J3MgMHg0MCBsb25nIG1hcHBlZCB0byB0aGUgUENNQ0lBCisgKiBzbG90IEkvTyBhZGRyZXNzIHNwYWNlLgorICoKKyAqIC0gT25lIFBDSSBtZW1vcnkgYWRkcmVzcyBzcGFjZSwgbWFwcGVkIHRvIHRoZSBQQ01DSUEgbWVtb3J5IHNwYWNlCisgKiAoY29udGFpbmluZyB0aGUgQ0lTKS4KKyAqCisgKiBBZnRlciBpZGVudGlmeWluZyB0aGUgSS9PIGFuZCBtZW1vcnkgc3BhY2UsIHlvdSBjYW4gcmVhZCB0aHJvdWdoCisgKiB0aGUgbWVtb3J5IHNwYWNlIHRvIGNvbmZpcm0gdGhlIENJUydzIGRldmljZSBJRCBvciBtYW51ZmFjdHVyZXIgSUQKKyAqIHRvIG1ha2Ugc3VyZSBpdCdzIHRoZSBleHBlY3RlZCBjYXJkLiAgcUtlZXAgaW4gbWluZCB0aGF0IHRoZSBQQ01DSUEKKyAqIHNwZWMgc3BlY2lmaWVzIHRoZSBDSVMgYXMgdGhlIGxvd2VyIDggYml0cyBvZiBlYWNoIHdvcmQgcmVhZCBmcm9tCisgKiB0aGUgQ0lTLCBzbyB0byByZWFkIHRoZSBieXRlcyBvZiB0aGUgQ0lTLCByZWFkIGV2ZXJ5IG90aGVyIGJ5dGUKKyAqICgwLDIsNCwuLi4pLiBQYXNzaW5nIHRoYXQgdGVzdCwgeW91IG5lZWQgdG8gZW5hYmxlIHRoZSBJL08gYWRkcmVzcworICogc3BhY2Ugb24gdGhlIFBDTUNJQSBjYXJkIHZpYSB0aGUgUENNQ0lBIENPUiByZWdpc3Rlci4gVGhpcyBpcyB0aGUKKyAqIGZpcnN0IGJ5dGUgZm9sbG93aW5nIHRoZSBDSVMuIEluIG15IGNhc2UgKHdoaWNoIG1heSBub3QgaGF2ZSBhbnkKKyAqIHJlbGF0aW9uIHRvIHdoYXQncyBvbiB0aGUgUFJJU00yIGNhcmRzKSwgQ09SIHdhcyBhdCBvZmZzZXQgMHg4MDAKKyAqIHdpdGhpbiB0aGUgUENJIG1lbW9yeSBzcGFjZS4gV3JpdGUgMHg0MSB0byB0aGUgQ09SIHJlZ2lzdGVyIHRvCisgKiBlbmFibGUgSS9PIG1vZGUgYW5kIHRvIHNlbGVjdCBsZXZlbCB0cmlnZ2VyZWQgaW50ZXJydXB0cy4gVG8KKyAqIGNvbmZpcm0geW91IGFjdHVhbGx5IHN1Y2NlZWRlZCwgcmVhZCB0aGUgQ09SIHJlZ2lzdGVyIGJhY2sgYW5kIG1ha2UKKyAqIHN1cmUgaXQgYWN0dWFsbHkgZ290IHNldCB0byAweDQxLCBpbmNhc2UgeW91IGhhdmUgYW4gdW5leHBlY3RlZAorICogY2FyZCBpbnNlcnRlZC4KKyAqCisgKiBGb2xsb3dpbmcgdGhhdCwgeW91IGNhbiB0cmVhdCB0aGUgc2Vjb25kIFBDSSBJL08gYWRkcmVzcyBzcGFjZSAodGhlCisgKiBvbmUgdGhhdCdzIG5vdCAweDgwIGluIGxlbmd0aCkgYXMgdGhlIFBDTUNJQSBJL08gc3BhY2UuCisgKgorICogTm90ZSB0aGF0IGluIHRoZSBFdW1pdGNvbSdzIHNvdXJjZSBmb3IgdGhlaXIgZHJpdmVycywgdGhleSByZWdpc3RlcgorICogdGhlIGludGVycnVwdCBhcyBlZGdlIHRyaWdnZXJlZCB3aGVuIHJlZ2lzdGVyaW5nIGl0IHdpdGggdGhlCisgKiBXaW5kb3dzIGtlcm5lbC4gSSBkb24ndCByZWNhbGwgaG93IHRvIHJlZ2lzdGVyIGVkZ2UgdHJpZ2dlcmVkIG9uCisgKiBMaW51eCAoaWYgaXQgY2FuIGJlIGRvbmUgYXQgYWxsKS4gQnV0IGluIHNvbWUgZXhwZXJpbWVudGF0aW9uLCBJCisgKiBkb24ndCBzZWUgbXVjaCBvcGVyYXRpb25hbCBkaWZmZXJlbmNlIGJldHdlZW4gdXNpbmcgZWl0aGVyCisgKiBpbnRlcnJ1cHQgbW9kZS4gRG9uJ3QgbWVzcyB3aXRoIHRoZSBpbnRlcnJ1cHQgbW9kZSBpbiB0aGUgQ09SCisgKiByZWdpc3RlciB0aG91Z2gsIGFzIHRoZSBQTFg5MDUyIHdhbnRzIGxldmVsIHRyaWdnZXJzIHdpdGggdGhlIHdheQorICogdGhlIHNlcmlhbCBFRVBST00gY29uZmlndXJlcyBpdCBvbiB0aGUgV0wxMTAwMC4KKyAqCisgKiBUaGVyZSdzIHNvbWUgb3RoZXIgbGl0dGxlIHF1aXJrcyByZWxhdGVkIHRvIHRpbWluZyB0aGF0IEkgYnVtcGVkCisgKiBpbnRvLCBidXQgSSBkb24ndCByZWNhbGwgcmlnaHQgbm93LiBBbHNvLCB0aGVyZSdzIHR3byB2YXJpYW50cyBvZgorICogdGhlIFdMMTEwMDAgSSd2ZSBzZWVuLCByZXZpc2lvbiBBMSBhbmQgVDIuIFRoZXNlIHNlZW0gdG8gZGlmZmVyCisgKiBzbGlnaHRseSBpbiB0aGUgdGltaW5ncyBjb25maWd1cmVkIGluIHRoZSB3YWl0LXN0YXRlIGdlbmVyYXRvciBpbgorICogdGhlIFBMWDkwNTIuIFRoZXJlIGhhdmUgYWxzbyBiZWVuIHNvbWUgY29tbWVudHMgZnJvbSBFdW1pdGNvbSB0aGF0CisgKiBjYXJkcyBzaG91bGRuJ3QgYmUgaG90IHN3YXBwZWQsIGFwcGFyZW50bHkgZHVlIHRvIHJpc2sgb2YgY29va2luZworICogdGhlIFBMWDkwNTIuIEknbSB1bnN1cmUgd2h5IHRoZXkgYmVsaWV2ZSB0aGlzLCBhcyBJIGNhbid0IHNlZQorICogYW55dGhpbmcgaW4gdGhlIGRlc2lnbiB0aGF0IHdvdWxkIHJlYWxseSBjYXVzZSBhIHByb2JsZW0sIGV4Y2VwdAorICogZm9yIGNyYXNoaW5nIGRyaXZlcnMgbm90IHdyaXR0ZW4gdG8gZXhwZWN0IGl0LiBBbmQgaGF2aW5nIGRldmVsb3BlZAorICogZHJpdmVycyBmb3IgdGhlIFdMMTEwMDAsIEknZCBzYXkgaXQncyBxdWl0ZSB0cmlja3kgdG8gd3JpdGUgY29kZQorICogdGhhdCB3aWxsIHN1Y2Nlc3NmdWxseSBkZWFsIHdpdGggYSBob3QgdW5wbHVnLiBWZXJ5IG9kZCB0aGluZ3MKKyAqIGhhcHBlbiBvbiB0aGUgSS9PIHNpZGUgb2YgdGhpbmdzLiBCdXQgYW55d2F5LCBiZSB3YXJuZWQuIERlc3BpdGUKKyAqIHRoYXQsIEkndmUgaG90LXN3YXBwZWQgYSBudW1iZXIgb2YgdGltZXMgZHVyaW5nIGRlYnVnZ2luZyBhbmQKKyAqIGRyaXZlciBkZXZlbG9wbWVudCBmb3IgdmFyaW91cyByZWFzb25zIChzdHVjayBXQUlUIyBsaW5lIGFmdGVyIHRoZQorICogcmFkaW8gY2FyZCdzIGZpcm13YXJlIGxvY2tzIHVwKS4KKyAqCisgKiBIb3BlIHRoaXMgaXMgZW5vdWdoIGluZm8gZm9yIHNvbWVvbmUgdG8gYWRkIFBMWDkwNTIgc3VwcG9ydCB0byB0aGUKKyAqIHdsYW4tbmcgY2FyZC4gSW4gdGhlIGNhc2Ugb2YgdGhlIFdMMTEwMDAsIHRoZSBQQ0kgSUQncyBhcmUKKyAqIDB4MTYzOS8weDAyMDAsIHdpdGggbWF0Y2hpbmcgc3Vic3lzdGVtIElEJ3MuIE90aGVyIFBMWDkwNTItYmFzZWQKKyAqIG1hbnVmYWN0dXJlcnMgb3RoZXIgdGhhbiBFdW1pdGNvbSAob3Igb24gY2FyZHMgb3RoZXIgdGhhbiB0aGUKKyAqIFdMMTEwMDApIG1heSBoYXZlIGRpZmZlcmVudCBQQ0kgSUQncy4KKyAqCisgKiBJZiBhbnlvbmUgbmVlZHMgYW55IG1vcmUgc3BlY2lmaWMgaW5mbywgbGV0IG1lIGtub3cuIEkgaGF2ZW4ndCBoYWQKKyAqIHRpbWUgdG8gaW1wbGVtZW50IHN1cHBvcnQgbXlzZWxmIHlldCwgYW5kIHdpdGggdGhlIHdheSB0aGluZ3MgYXJlCisgKiBnb2luZywgbWlnaHQgbm90IGhhdmUgdGltZSBmb3IgYSB3aGlsZS4uCisgKi8KKworI2RlZmluZSBEUklWRVJfTkFNRSAib3Jpbm9jb19wbHgiCisjZGVmaW5lIFBGWCBEUklWRVJfTkFNRSAiOiAiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisKKyNpbmNsdWRlICJoZXJtZXMuaCIKKyNpbmNsdWRlICJvcmlub2NvLmgiCisKKyNkZWZpbmUgQ09SX09GRlNFVAkoMHgzZTApCS8qIENPUiBhdHRyaWJ1dGUgb2Zmc2V0IG9mIFByaXNtMiBQQyBjYXJkICovCisjZGVmaW5lIENPUl9WQUxVRQkoQ09SX0xFVkVMX1JFUSB8IENPUl9GVU5DX0VOQSkgLyogRW5hYmxlIFBDIGNhcmQgd2l0aCBpbnRlcnJ1cHQgaW4gbGV2ZWwgdHJpZ2dlciAqLworI2RlZmluZSBDT1JfUkVTRVQgICAgICgweDgwKQkvKiByZXNldCBiaXQgaW4gdGhlIENPUiByZWdpc3RlciAqLworI2RlZmluZSBQTFhfUkVTRVRfVElNRQkoNTAwKQkvKiBtaWxsaXNlY29uZHMgKi8KKworI2RlZmluZSBQTFhfSU5UQ1NSCQkweDRjIC8qIEludGVycnVwdCBDb250cm9sICYgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBMWF9JTlRDU1JfSU5URU4JKDE8PDYpIC8qIEludGVycnVwdCBFbmFibGUgYml0ICovCisKK3N0YXRpYyBjb25zdCB1OCBjaXNfbWFnaWNbXSA9IHsKKwkweDAxLCAweDAzLCAweDAwLCAweDAwLCAweGZmLCAweDE3LCAweDA0LCAweDY3Cit9OworCisvKiBPcmlub2NvIFBMWCBzcGVjaWZpYyBkYXRhICovCitzdHJ1Y3Qgb3Jpbm9jb19wbHhfY2FyZCB7CisJdm9pZCBfX2lvbWVtICphdHRyX21lbTsKK307CisKKy8qCisgKiBEbyBhIHNvZnQgcmVzZXQgb2YgdGhlIGNhcmQgdXNpbmcgdGhlIENvbmZpZ3VyYXRpb24gT3B0aW9uIFJlZ2lzdGVyCisgKi8KK3N0YXRpYyBpbnQgb3Jpbm9jb19wbHhfY29yX3Jlc2V0KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCit7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBvcmlub2NvX3BseF9jYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKKwl1OCBfX2lvbWVtICphdHRyX21lbSA9IGNhcmQtPmF0dHJfbWVtOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl1MTYgcmVnOworCisJd3JpdGViKENPUl9WQUxVRSB8IENPUl9SRVNFVCwgYXR0cl9tZW0gKyBDT1JfT0ZGU0VUKTsKKwltZGVsYXkoMSk7CisKKwl3cml0ZWIoQ09SX1ZBTFVFLCBhdHRyX21lbSArIENPUl9PRkZTRVQpOworCW1kZWxheSgxKTsKKworCS8qIEp1c3QgaW4gY2FzZSwgd2FpdCBtb3JlIHVudGlsIHRoZSBjYXJkIGlzIG5vIGxvbmdlciBidXN5ICovCisJdGltZW91dCA9IGppZmZpZXMgKyAoUExYX1JFU0VUX1RJTUUgKiBIWiAvIDEwMDApOworCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIENNRCk7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmIChyZWcgJiBIRVJNRVNfQ01EX0JVU1kpKSB7CisJCW1kZWxheSgxKTsKKwkJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgQ01EKTsKKwl9CisKKwkvKiBEaWQgd2UgdGltZW91dCA/ICovCisJaWYgKHJlZyAmIEhFUk1FU19DTURfQlVTWSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJCdXN5IHRpbWVvdXRcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG9yaW5vY29fcGx4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IGVyciA9IDA7CisJdTggX19pb21lbSAqYXR0cl9tZW0gPSBOVUxMOworCXUzMiBjc3JfcmVnLCBwbHhfYWRkcjsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gTlVMTDsKKwlzdHJ1Y3Qgb3Jpbm9jb19wbHhfY2FyZCAqY2FyZDsKKwl1bnNpZ25lZCBsb25nIHBjY2FyZF9pb2FkZHIgPSAwOworCXVuc2lnbmVkIGxvbmcgcGNjYXJkX2lvbGVuID0gMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwl2b2lkIF9faW9tZW0gKm1lbTsKKwlpbnQgaTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSSVZFUl9OQU1FKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzXG4iKTsKKwkJZ290byBmYWlsX3Jlc291cmNlczsKKwl9CisKKwkvKiBSZXNvdXJjZSAxIGlzIG1hcHBlZCB0byBQTFgtc3BlY2lmaWMgcmVnaXN0ZXJzICovCisJcGx4X2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisKKwkvKiBSZXNvdXJjZSAyIGlzIG1hcHBlZCB0byB0aGUgUENNQ0lBIGF0dHJpYnV0ZSBtZW1vcnkgKi8KKwlhdHRyX21lbSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLAorCQkJICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSk7CisJaWYgKCFhdHRyX21lbSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgcmVtYXAgUENNQ0lBIHNwYWNlXG4iKTsKKwkJZ290byBmYWlsX21hcF9hdHRyOworCX0KKworCS8qIFJlc291cmNlIDMgaXMgbWFwcGVkIHRvIHRoZSBQQ01DSUEgSS9PIGFkZHJlc3Mgc3BhY2UgKi8KKwlwY2NhcmRfaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpOworCXBjY2FyZF9pb2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMyk7CisKKwltZW0gPSBwY2lfaW9tYXAocGRldiwgMywgMCk7CisJaWYgKCFtZW0pIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsX21hcF9pbzsKKwl9CisKKwkvKiBBbGxvY2F0ZSBuZXR3b3JrIGRldmljZSAqLworCWRldiA9IGFsbG9jX29yaW5vY29kZXYoc2l6ZW9mKCpjYXJkKSwgb3Jpbm9jb19wbHhfY29yX3Jlc2V0KTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgbmV0d29yayBkZXZpY2VcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfYWxsb2M7CisJfQorCisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJY2FyZCA9IHByaXYtPmNhcmQ7CisJY2FyZC0+YXR0cl9tZW0gPSBhdHRyX21lbTsKKwlkZXYtPmJhc2VfYWRkciA9IHBjY2FyZF9pb2FkZHI7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwloZXJtZXNfc3RydWN0X2luaXQoJnByaXYtPmh3LCBtZW0sIEhFUk1FU18xNkJJVF9SRUdTUEFDSU5HKTsKKworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiRGV0ZWN0ZWQgT3Jpbm9jby9QcmlzbTIgUExYIGRldmljZSAiCisJICAgICAgICJhdCAlcyBpcnE6JWQsIGlvIGFkZHI6MHglbHhcbiIsIHBjaV9uYW1lKHBkZXYpLCBwZGV2LT5pcnEsCisJICAgICAgIHBjY2FyZF9pb2FkZHIpOworCisJZXJyID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBvcmlub2NvX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkgIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBhbGxvY2F0ZSBJUlEgJWRcbiIsIHBkZXYtPmlycSk7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBmYWlsX2lycTsKKwl9CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisKKwkvKiBiam9lcm46IFdlIG5lZWQgdG8gdGVsbCB0aGUgY2FyZCB0byBlbmFibGUgaW50ZXJydXB0cywgaW4KKwkgICBjYXNlIHRoZSBzZXJpYWwgZXByb20gZGlkbid0IGRvIHRoaXMgYWxyZWFkeS4gIFNlZSB0aGUKKwkgICBQTFg5MDUyIGRhdGEgYm9vaywgcDgtMSBhbmQgOC0yNCBmb3IgcmVmZXJlbmNlLiAqLworCWNzcl9yZWcgPSBpbmwocGx4X2FkZHIgKyBQTFhfSU5UQ1NSKTsKKwlpZiAoIShjc3JfcmVnICYgUExYX0lOVENTUl9JTlRFTikpIHsKKwkJY3NyX3JlZyB8PSBQTFhfSU5UQ1NSX0lOVEVOOworCQlvdXRsKGNzcl9yZWcsIHBseF9hZGRyICsgUExYX0lOVENTUik7CisJCWNzcl9yZWcgPSBpbmwocGx4X2FkZHIgKyBQTFhfSU5UQ1NSKTsKKwkJaWYgKCEoY3NyX3JlZyAmIFBMWF9JTlRDU1JfSU5URU4pKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgZW5hYmxlIGludGVycnVwdHNcbiIpOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJZXJyID0gb3Jpbm9jb19wbHhfY29yX3Jlc2V0KHByaXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSW5pdGlhbCByZXNldCBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJDSVM6ICIpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXByaW50aygiJTAyWDoiLCByZWFkYihhdHRyX21lbSArIDIqaSkpOworCX0KKwlwcmludGsoIlxuIik7CisKKwkvKiBWZXJpZnkgd2hldGhlciBhIHN1cHBvcnRlZCBQQyBjYXJkIGlzIHByZXNlbnQgKi8KKwkvKiBGSVhNRTogd2UgcHJvYmFibHkgbmVlZCB0byBiZSBzbWFydGVkIGFib3V0IHRoaXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNpc19tYWdpYyk7IGkrKykgeworCQlpZiAoY2lzX21hZ2ljW2ldICE9IHJlYWRiKGF0dHJfbWVtICsyKmkpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJUaGUgQ0lTIHZhbHVlIG9mIFByaXNtMiBQQyAiCisJCQkgICAgICAgImNhcmQgaXMgdW5leHBlY3RlZFxuIik7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgcmVnaXN0ZXIgbmV0d29yayBkZXZpY2VcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlyZXR1cm4gMDsKKworIGZhaWw6CisJZnJlZV9pcnEocGRldi0+aXJxLCBkZXYpOworCisgZmFpbF9pcnE6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfb3Jpbm9jb2RldihkZXYpOworCisgZmFpbF9hbGxvYzoKKwlwY2lfaW91bm1hcChwZGV2LCBtZW0pOworCisgZmFpbF9tYXBfaW86CisJaW91bm1hcChhdHRyX21lbSk7CisKKyBmYWlsX21hcF9hdHRyOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKKyBmYWlsX3Jlc291cmNlczoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgb3Jpbm9jb19wbHhfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBvcmlub2NvX3BseF9jYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKKwl1OCBfX2lvbWVtICphdHRyX21lbSA9IGNhcmQtPmF0dHJfbWVtOworCisJQlVHX09OKCEgZGV2KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfb3Jpbm9jb2RldihkZXYpOworCXBjaV9pb3VubWFwKHBkZXYsIHByaXYtPmh3LmlvYmFzZSk7CisJaW91bm1hcChhdHRyX21lbSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG9yaW5vY29fcGx4X3BjaV9pZF90YWJsZVtdID0geworCXsweDExMWEsIDB4MTAyMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiBTaWVtZW5zIFNwZWVkU3RyZWFtIFNTMTAyMyAqLworCXsweDEzODUsIDB4NDEwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiBOZXRnZWFyIE1BMzAxICovCisJezB4MTVlOCwgMHgwMTMwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCS8qIENvcnJlZ2EgIC0gZG9lcyB0aGlzIHdvcms/ICovCisJezB4MTYzOCwgMHgxMTAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCS8qIFNNQyBFWkNvbm5lY3QgU01DMjYwMlcsCisJCQkJCQkJICAgRXVtaXRjb20gUENJIFdMMTEwMDAsCisJCQkJCQkJICAgQWRkdHJvbiBBV0EtMTAwICovCisJezB4MTZhYiwgMHgxMTAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCS8qIEdsb2JhbCBTdW4gVGVjaCBHTDI0MTEwUCAqLworCXsweDE2YWIsIDB4MTEwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiBSZXBvcnRlZCB3b3JraW5nLCBidXQgdW5rbm93biAqLworCXsweDE2YWIsIDB4MTEwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiBMaW5rc3lzIFdEVDExICovCisJezB4MTZlYywgMHgzNjg1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCS8qIFVTUiAyNDE1ICovCisJezB4ZWM4MCwgMHhlYzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCS8qIEJlbGtpbiBGNUQ2MDAwIHRlc3RlZCBieQorCQkJCQkJCSAgIEJyZW5kYW4gVy4gTWNBZGFtcyA8cml0IEFUIGphY2tlZC1pbi5vcmc+ICovCisJezB4MTBiNywgMHg3NzcwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCS8qIDNDb20gQWlyQ29ubmVjdCBQQ0kgdGVzdGVkIGJ5CisJCQkJCQkJICAgRGFtaWVuIFBlcnNvaG4gPGRhbWllbiBBVCBwZXJzb2huLm5ldD4gKi8KKwl7MCx9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG9yaW5vY29fcGx4X3BjaV9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBvcmlub2NvX3BseF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJJVkVSX05BTUUsCisJLmlkX3RhYmxlCT0gb3Jpbm9jb19wbHhfcGNpX2lkX3RhYmxlLAorCS5wcm9iZQkJPSBvcmlub2NvX3BseF9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG9yaW5vY29fcGx4X3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSBEUklWRVJfTkFNRSAiICIgRFJJVkVSX1ZFUlNJT04KKwkiIChQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPiwiCisJIiBEYXZpZCBHaWJzb24gPGhlcm1lc0BnaWJzb24uZHJvcGJlYXIuaWQuYXU+LCIKKwkiIERhbmllbCBCYXJsb3cgPGRhbkB0ZWxlbnQubmV0PikiOworTU9EVUxFX0FVVEhPUigiRGFuaWVsIEJhcmxvdyA8ZGFuQHRlbGVudC5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3Igd2lyZWxlc3MgTEFOIGNhcmRzIHVzaW5nIHRoZSBQTFg5MDUyIFBDSSBicmlkZ2UiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgb3Jpbm9jb19wbHhfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgdmVyc2lvbik7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmb3Jpbm9jb19wbHhfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9yaW5vY29fcGx4X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm9yaW5vY29fcGx4X2RyaXZlcik7CisJc3NsZWVwKDEpOworfQorCittb2R1bGVfaW5pdChvcmlub2NvX3BseF9pbml0KTsKK21vZHVsZV9leGl0KG9yaW5vY29fcGx4X2V4aXQpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb190bWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fdG1kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4OTNmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fdG1kLmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qIG9yaW5vY29fdG1kLmMKKyAqIAorICogRHJpdmVyIGZvciBQcmlzbSBJSSBkZXZpY2VzIHdoaWNoIHdvdWxkIHVzdWFsbHkgYmUgZHJpdmVuIGJ5IG9yaW5vY29fY3MsCisgKiBidXQgYXJlIGNvbm5lY3RlZCB0byB0aGUgUENJIGJ1cyBieSBhIFRNRDcxNjAuIAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBKb2VyZyBEb3JjaGFpbiA8am9lcmcgQVQgZG9yY2hhaW4ubmV0PgorICogYmFzZWQgaGVhdmlseSB1cG9uIG9yaW5vY29fcGx4LmMgQ29weXJpZ2h0IChDKSAyMDAxIERhbmllbCBCYXJsb3cKKyAqCisgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCisgKiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisgKgorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgorICogYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZQorICogdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKKyAqIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5CisgKiBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQKKyAqIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZQorICogcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgorCisgKiBDYXV0aW9uOiB0aGlzIGlzIGV4cGVyaW1lbnRhbCBhbmQgcHJvYmFibHkgYnVnZ3kuICBGb3Igc3VjY2VzcyBhbmQKKyAqIGZhaWx1cmUgcmVwb3J0cyBmb3IgZGlmZmVyZW50IGNhcmRzIGFuZCBhZGFwdG9ycywgc2VlCisgKiBvcmlub2NvX3RtZF9wY2lfaWRfdGFibGUgbmVhciB0aGUgZW5kIG9mIHRoZSBmaWxlLiAgSWYgeW91IGhhdmUgYQorICogY2FyZCB3ZSBkb24ndCBoYXZlIHRoZSBQQ0kgaWQgZm9yLCBhbmQgbG9va3MgbGlrZSBpdCBzaG91bGQgd29yaywKKyAqIGRyb3AgbWUgbWFpbCB3aXRoIHRoZSBpZCBhbmQgIml0IHdvcmtzIi8iaXQgZG9lc24ndCB3b3JrIi4KKyAqCisgKiBOb3RlOiBpZiBldmVyeXRoaW5nIGdldHMgZGV0ZWN0ZWQgZmluZSBidXQgaXQgZG9lc24ndCBhY3R1YWxseSBzZW5kCisgKiBvciByZWNlaXZlIHBhY2tldHMsIHlvdXIgZmlyc3QgcG9ydCBvZiBjYWxsIHNob3VsZCBwcm9iYWJseSBiZSB0byAgIAorICogdHJ5IG5ld2VyIGZpcm13YXJlIGluIHRoZSBjYXJkLiAgRXNwZWNpYWxseSBpZiB5b3UncmUgZG9pbmcgQWQtSG9jCisgKiBtb2RlcworICoKKyAqIFRoZSBhY3R1YWwgZHJpdmluZyBpcyBkb25lIGJ5IG9yaW5vY28uYywgdGhpcyBpcyBqdXN0IHJlc291cmNlCisgKiBhbGxvY2F0aW9uIHN0dWZmLgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIG1vZGVsZWQgYWZ0ZXIgdGhlIG9yaW5vY29fcGx4IGRyaXZlci4gVGhlIG1haW4KKyAqIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgVE1EIGNoaXAgaGFzIG9ubHkgSU8gcG9ydCByYW5nZXMgYW5kIG5vCisgKiBtZW1vcnkgc3BhY2UsIGkuZS4gIG5vIGFjY2VzcyB0byB0aGUgQ0lTLiBDb21wYXJlZCB0byB0aGUgUExYIGNoaXAsCisgKiB0aGUgaW8gcmFuZ2UgZnVuY3Rpb25hbGl0aWVzIGFyZSBleGNoYW5nZWQuCisgKgorICogUGhlZWNvbSBzZWxscyBjYXJkcyB3aXRoIHRoZSBUTUQgY2hpcCBhcyAiQVNJQyB2ZXJzaW9uIgorICovCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgIm9yaW5vY29fdG1kIgorI2RlZmluZSBQRlggRFJJVkVSX05BTUUgIjogIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorCisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorCisjaW5jbHVkZSAiaGVybWVzLmgiCisjaW5jbHVkZSAib3Jpbm9jby5oIgorCisjZGVmaW5lIENPUl9WQUxVRQkoQ09SX0xFVkVMX1JFUSB8IENPUl9GVU5DX0VOQSkgLyogRW5hYmxlIFBDIGNhcmQgd2l0aCBpbnRlcnJ1cHQgaW4gbGV2ZWwgdHJpZ2dlciAqLworI2RlZmluZSBDT1JfUkVTRVQgICAgICgweDgwKQkvKiByZXNldCBiaXQgaW4gdGhlIENPUiByZWdpc3RlciAqLworI2RlZmluZSBUTURfUkVTRVRfVElNRQkoNTAwKQkvKiBtaWxsaXNlY29uZHMgKi8KKworLyogT3Jpbm9jbyBUTUQgc3BlY2lmaWMgZGF0YSAqLworc3RydWN0IG9yaW5vY29fdG1kX2NhcmQgeworCXUzMiB0bWRfaW87Cit9OworCisKKy8qCisgKiBEbyBhIHNvZnQgcmVzZXQgb2YgdGhlIGNhcmQgdXNpbmcgdGhlIENvbmZpZ3VyYXRpb24gT3B0aW9uIFJlZ2lzdGVyCisgKi8KK3N0YXRpYyBpbnQgb3Jpbm9jb190bWRfY29yX3Jlc2V0KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCit7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBvcmlub2NvX3RtZF9jYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKKwl1MzIgYWRkciA9IGNhcmQtPnRtZF9pbzsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdTE2IHJlZzsKKworCW91dGIoQ09SX1ZBTFVFIHwgQ09SX1JFU0VULCBhZGRyKTsKKwltZGVsYXkoMSk7CisKKwlvdXRiKENPUl9WQUxVRSwgYWRkcik7CisJbWRlbGF5KDEpOworCisJLyogSnVzdCBpbiBjYXNlLCB3YWl0IG1vcmUgdW50aWwgdGhlIGNhcmQgaXMgbm8gbG9uZ2VyIGJ1c3kgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIChUTURfUkVTRVRfVElNRSAqIEhaIC8gMTAwMCk7CisJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgQ01EKTsKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkgJiYgKHJlZyAmIEhFUk1FU19DTURfQlVTWSkpIHsKKwkJbWRlbGF5KDEpOworCQlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBDTUQpOworCX0KKworCS8qIERpZCB3ZSB0aW1lb3V0ID8gKi8KKwlpZiAocmVnICYgSEVSTUVTX0NNRF9CVVNZKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkJ1c3kgdGltZW91dFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgb3Jpbm9jb190bWRfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gTlVMTDsKKwlzdHJ1Y3Qgb3Jpbm9jb190bWRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwl2b2lkIF9faW9tZW0gKm1lbTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSSVZFUl9OQU1FKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzXG4iKTsKKwkJZ290byBmYWlsX3Jlc291cmNlczsKKwl9CisKKwltZW0gPSBwY2lfaW9tYXAocGRldiwgMiwgMCk7CisJaWYgKCEgbWVtKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9pb21hcDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBuZXR3b3JrIGRldmljZSAqLworCWRldiA9IGFsbG9jX29yaW5vY29kZXYoc2l6ZW9mKCpjYXJkKSwgb3Jpbm9jb190bWRfY29yX3Jlc2V0KTsKKwlpZiAoISBkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2FsbG9jOworCX0KKworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNhcmQgPSBwcml2LT5jYXJkOworCWNhcmQtPnRtZF9pbyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwlkZXYtPmJhc2VfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWhlcm1lc19zdHJ1Y3RfaW5pdCgmcHJpdi0+aHcsIG1lbSwgSEVSTUVTXzE2QklUX1JFR1NQQUNJTkcpOworCisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJEZXRlY3RlZCBPcmlub2NvL1ByaXNtMiBUTUQgZGV2aWNlICIKKwkgICAgICAgImF0ICVzIGlycTolZCwgaW8gYWRkcjoweCVseFxuIiwgcGNpX25hbWUocGRldiksIHBkZXYtPmlycSwKKwkgICAgICAgZGV2LT5iYXNlX2FkZHIpOworCisJZXJyID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBvcmlub2NvX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkgIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBhbGxvY2F0ZSBJUlEgJWRcbiIsIHBkZXYtPmlycSk7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBmYWlsX2lycTsKKwl9CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisKKwllcnIgPSBvcmlub2NvX3RtZF9jb3JfcmVzZXQocHJpdik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbml0aWFsIHJlc2V0IGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCByZWdpc3RlciBuZXR3b3JrIGRldmljZVxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCXJldHVybiAwOworCisgZmFpbDoKKwlmcmVlX2lycShwZGV2LT5pcnEsIGRldik7CisKKyBmYWlsX2lycToKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9vcmlub2NvZGV2KGRldik7CisKKyBmYWlsX2FsbG9jOgorCXBjaV9pb3VubWFwKHBkZXYsIG1lbSk7CisKKyBmYWlsX2lvbWFwOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKKyBmYWlsX3Jlc291cmNlczoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgb3Jpbm9jb190bWRfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisKKwlCVUdfT04oISBkZXYpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9vcmlub2NvZGV2KGRldik7CisJcGNpX2lvdW5tYXAocGRldiwgcHJpdi0+aHcuaW9iYXNlKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgb3Jpbm9jb190bWRfcGNpX2lkX3RhYmxlW10gPSB7CisJezB4MTVlOCwgMHgwMTMxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sICAgICAgLyogTkRDIGFuZCBPRU1zLCBlLmcuIHBoZWVjb20gKi8KKwl7MCx9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG9yaW5vY29fdG1kX3BjaV9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBvcmlub2NvX3RtZF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJJVkVSX05BTUUsCisJLmlkX3RhYmxlCT0gb3Jpbm9jb190bWRfcGNpX2lkX3RhYmxlLAorCS5wcm9iZQkJPSBvcmlub2NvX3RtZF9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG9yaW5vY29fdG1kX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSBEUklWRVJfTkFNRSAiICIgRFJJVkVSX1ZFUlNJT04KKwkiIChKb2VyZyBEb3JjaGFpbiA8am9lcmdAZG9yY2hhaW4ubmV0PikiOworTU9EVUxFX0FVVEhPUigiSm9lcmcgRG9yY2hhaW4gPGpvZXJnQGRvcmNoYWluLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB3aXJlbGVzcyBMQU4gY2FyZHMgdXNpbmcgdGhlIFRNRDcxNjAgUENJIGJyaWRnZSIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOworCitzdGF0aWMgaW50IF9faW5pdCBvcmlub2NvX3RtZF9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCB2ZXJzaW9uKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZvcmlub2NvX3RtZF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb3Jpbm9jb190bWRfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmb3Jpbm9jb190bWRfZHJpdmVyKTsKKwlzc2xlZXAoMSk7Cit9CisKK21vZHVsZV9pbml0KG9yaW5vY29fdG1kX2luaXQpOworbW9kdWxlX2V4aXQob3Jpbm9jb190bWRfZXhpdCk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWQzMDVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMgJElkOiBNYWtlZmlsZS5rMjYsdiAxLjcgMjAwNC8wMS8zMCAxNjoyNDowMCBhamZhIEV4cCAkCisKK3ByaXNtNTQtb2JqcyA6PSBpc2xwY2lfZXRoLm8gaXNscGNpX21ndC5vIFwKKyAgICAgICAgICAgICAgICBpc2xfMzh4eC5vIGlzbF9pb2N0bC5vIGlzbHBjaV9kZXYubyBcCisJCWlzbHBjaV9ob3RwbHVnLm8gb2lkX21ndC5vCisKK29iai0kKENPTkZJR19QUklTTTU0KSArPSBwcmlzbTU0Lm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ODFlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiAgCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHJ1c2x1Zy5ydXRnZXJzLmVkdT5fCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInByaXNtY29tcGF0LmgiCisjaW5jbHVkZSAiaXNsXzM4eHguaCIKKyNpbmNsdWRlICJpc2xwY2lfZGV2LmgiCisjaW5jbHVkZSAiaXNscGNpX21ndC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRGV2aWNlIEludGVyZmFjZSAmIENvbnRyb2wgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogaXNsMzh4eF9kaXNhYmxlX2ludGVycnVwdHMgLSBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzCisgKiBAZGV2aWNlOiBwY2kgbWVtb3J5IGJhc2UgYWRkcmVzcworICoKKyAqICBJbnN0cnVjdHMgdGhlIGRldmljZSB0byBkaXNhYmxlIGFsbCBpbnRlcnJ1cHQgcmVwb3J0aW5nIGJ5IGFzc2VydGluZyAKKyAqICB0aGUgSVJRIGxpbmUuIE5ldyBldmVudHMgbWF5IHN0aWxsIHNob3cgdXAgaW4gdGhlIGludGVycnVwdCBpZGVudGlmaWNhdGlvbgorICogIHJlZ2lzdGVyIGxvY2F0ZWQgYXQgb2Zmc2V0ICVJU0wzOFhYX0lOVF9JREVOVF9SRUcuCisgKi8KK3ZvaWQKK2lzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzKHZvaWQgX19pb21lbSAqZGV2aWNlKQoreworCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZSwgMHgwMDAwMDAwMCwgSVNMMzhYWF9JTlRfRU5fUkVHKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKK30KKwordm9pZAoraXNsMzh4eF9oYW5kbGVfc2xlZXBfcmVxdWVzdChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNvbnRyb2xfYmxvY2ssCisJCQkgICAgIGludCAqcG93ZXJzdGF0ZSwgdm9pZCBfX2lvbWVtICpkZXZpY2VfYmFzZSkKK3sKKwkvKiBkZXZpY2UgcmVxdWVzdHMgdG8gZ28gaW50byBzbGVlcCBtb2RlCisJICogY2hlY2sgd2hldGhlciB0aGUgdHJhbnNtaXQgcXVldWVzIGZvciBkYXRhIGFuZCBtYW5hZ2VtZW50IGFyZSBlbXB0eSAqLworCWlmIChpc2wzOHh4X2luX3F1ZXVlKGNvbnRyb2xfYmxvY2ssIElTTDM4WFhfQ0JfVFhfREFUQV9MUSkpCisJCS8qIGRhdGEgdHggcXVldWUgbm90IGVtcHR5ICovCisJCXJldHVybjsKKworCWlmIChpc2wzOHh4X2luX3F1ZXVlKGNvbnRyb2xfYmxvY2ssIElTTDM4WFhfQ0JfVFhfTUdNVFEpKQorCQkvKiBtYW5hZ2VtZW50IHR4IHF1ZXVlIG5vdCBlbXB0eSAqLworCQlyZXR1cm47CisKKwkvKiBjaGVjayBhbHNvIHdoZXRoZXIgcmVjZWl2ZWQgZnJhbWVzIGFyZSBwZW5kaW5nICovCisJaWYgKGlzbDM4eHhfaW5fcXVldWUoY29udHJvbF9ibG9jaywgSVNMMzhYWF9DQl9SWF9EQVRBX0xRKSkKKwkJLyogZGF0YSByeCBxdWV1ZSBub3QgZW1wdHkgKi8KKwkJcmV0dXJuOworCisJaWYgKGlzbDM4eHhfaW5fcXVldWUoY29udHJvbF9ibG9jaywgSVNMMzhYWF9DQl9SWF9NR01UUSkpCisJCS8qIG1hbmFnZW1lbnQgcnggcXVldWUgbm90IGVtcHR5ICovCisJCXJldHVybjsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19UUkFDSU5HLCAiRGV2aWNlIGdvaW5nIHRvIHNsZWVwIG1vZGVcbiIpOworI2VuZGlmCisKKwkvKiBhbGwgcXVldWVzIGFyZSBlbXB0eSwgYWxsb3cgdGhlIGRldmljZSB0byBnbyBpbnRvIHNsZWVwIG1vZGUgKi8KKwkqcG93ZXJzdGF0ZSA9IElTTDM4WFhfUFNNX1BPV0VSU0FWRV9TVEFURTsKKworCS8qIGFzc2VydCB0aGUgU2xlZXAgaW50ZXJydXB0IGluIHRoZSBEZXZpY2UgSW50ZXJydXB0IFJlZ2lzdGVyICovCisJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNlX2Jhc2UsIElTTDM4WFhfREVWX0lOVF9TTEVFUCwKKwkJCSAgSVNMMzhYWF9ERVZfSU5UX1JFRyk7CisJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7Cit9CisKK3ZvaWQKK2lzbDM4eHhfaGFuZGxlX3dha2V1cChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNvbnRyb2xfYmxvY2ssCisJCSAgICAgIGludCAqcG93ZXJzdGF0ZSwgdm9pZCBfX2lvbWVtICpkZXZpY2VfYmFzZSkKK3sKKwkvKiBkZXZpY2UgaXMgaW4gYWN0aXZlIHN0YXRlLCB1cGRhdGUgdGhlIHBvd2Vyc3RhdGUgZmxhZyAqLworCSpwb3dlcnN0YXRlID0gSVNMMzhYWF9QU01fQUNUSVZFX1NUQVRFOworCisJLyogbm93IGNoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGZyYW1lcyBwZW5kaW5nIGZvciB0aGUgY2FyZCAqLworCWlmICghaXNsMzh4eF9pbl9xdWV1ZShjb250cm9sX2Jsb2NrLCBJU0wzOFhYX0NCX1RYX0RBVEFfTFEpCisJICAgICYmICFpc2wzOHh4X2luX3F1ZXVlKGNvbnRyb2xfYmxvY2ssIElTTDM4WFhfQ0JfVFhfTUdNVFEpKQorCQlyZXR1cm47CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfQU5ZVEhJTkcsICJXYWtlIHVwIGhhbmRsZXIgdHJpZ2dlciB0aGUgZGV2aWNlXG4iKTsKKyNlbmRpZgorCisJLyogZWl0aGVyIGRhdGEgb3IgbWFuYWdlbWVudCB0cmFuc21pdCBxdWV1ZSBoYXMgYSBmcmFtZSBwZW5kaW5nCisJICogdHJpZ2dlciB0aGUgZGV2aWNlIGJ5IHNldHRpbmcgdGhlIFVwZGF0ZSBiaXQgaW4gdGhlIERldmljZSBJbnQgcmVnICovCisJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNlX2Jhc2UsIElTTDM4WFhfREVWX0lOVF9VUERBVEUsCisJCQkgIElTTDM4WFhfREVWX0lOVF9SRUcpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworfQorCit2b2lkCitpc2wzOHh4X3RyaWdnZXJfZGV2aWNlKGludCBhc2xlZXAsIHZvaWQgX19pb21lbSAqZGV2aWNlX2Jhc2UpCit7CisJc3RydWN0IHRpbWV2YWwgY3VycmVudF90aW1lOworCXUzMiByZWcsIGNvdW50ZXIgPSAwOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0ZVTkNUSU9OX0NBTExTLCAiaXNsMzh4eCB0cmlnZ2VyIGRldmljZVxuIik7CisjZW5kaWYKKworCS8qIGNoZWNrIHdoZXRoZXIgdGhlIGRldmljZSBpcyBpbiBwb3dlciBzYXZlIG1vZGUgKi8KKwlpZiAoYXNsZWVwKSB7CisJCS8qIGRldmljZSBpcyBpbiBwb3dlcnNhdmUsIHRyaWdnZXIgdGhlIGRldmljZSBmb3Igd2FrZXVwICovCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJZG9fZ2V0dGltZW9mZGF5KCZjdXJyZW50X3RpbWUpOworCQlERUJVRyhTSE9XX1RSQUNJTkcsICIlMDhsaS4lMDhsaSBEZXZpY2Ugd2FrZXVwIHRyaWdnZXJlZFxuIiwKKwkJICAgICAgY3VycmVudF90aW1lLnR2X3NlYywgKGxvbmcpY3VycmVudF90aW1lLnR2X3VzZWMpOworI2VuZGlmCisKKwkJREVCVUcoU0hPV19UUkFDSU5HLCAiJTA4bGkuJTA4bGkgRGV2aWNlIHJlZ2lzdGVyIHJlYWQgJTA4eFxuIiwKKwkJICAgICAgY3VycmVudF90aW1lLnR2X3NlYywgKGxvbmcpY3VycmVudF90aW1lLnR2X3VzZWMsCisJCSAgICAgIHJlYWRsKGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKSk7CisJCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisJCXJlZyA9IHJlYWRsKGRldmljZV9iYXNlICsgSVNMMzhYWF9JTlRfSURFTlRfUkVHKTsKKwkJaWYgKHJlZyA9PSAweGFiYWRmYWNlKSB7CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCWRvX2dldHRpbWVvZmRheSgmY3VycmVudF90aW1lKTsKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywKKwkJCSAgICAgICIlMDhsaS4lMDhsaSBEZXZpY2UgcmVnaXN0ZXIgYWJhZGZhY2VcbiIsCisJCQkgICAgICBjdXJyZW50X3RpbWUudHZfc2VjLCAobG9uZyljdXJyZW50X3RpbWUudHZfdXNlYyk7CisjZW5kaWYKKwkJCS8qIHJlYWQgdGhlIERldmljZSBTdGF0dXMgUmVnaXN0ZXIgdW50aWwgU2xlZXBtb2RlIGJpdCBpcyBzZXQgKi8KKwkJCXdoaWxlIChyZWcgPSByZWFkbChkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRyksCisJCQkgICAgICAgKHJlZyAmIElTTDM4WFhfQ1RSTF9TVEFUX1NMRUVQTU9ERSkgPT0gMCkgeworCQkJCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCQkJCWNvdW50ZXIrKzsKKwkJCX0KKworCQkJREVCVUcoU0hPV19UUkFDSU5HLAorCQkJICAgICAgIiUwOGxpLiUwOGxpIERldmljZSByZWdpc3RlciByZWFkICUwOHhcbiIsCisJCQkgICAgICBjdXJyZW50X3RpbWUudHZfc2VjLCAobG9uZyljdXJyZW50X3RpbWUudHZfdXNlYywKKwkJCSAgICAgIHJlYWRsKGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKSk7CisJCQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCQlkb19nZXR0aW1lb2ZkYXkoJmN1cnJlbnRfdGltZSk7CisJCQlERUJVRyhTSE9XX1RSQUNJTkcsCisJCQkgICAgICAiJTA4bGkuJTA4bGkgRGV2aWNlIGFzbGVlcCBjb3VudGVyICVpXG4iLAorCQkJICAgICAgY3VycmVudF90aW1lLnR2X3NlYywgKGxvbmcpY3VycmVudF90aW1lLnR2X3VzZWMsCisJCQkgICAgICBjb3VudGVyKTsKKyNlbmRpZgorCQl9CisJCS8qIGFzc2VydCB0aGUgV2FrZXVwIGludGVycnVwdCBpbiB0aGUgRGV2aWNlIEludGVycnVwdCBSZWdpc3RlciAqLworCQlpc2wzOHh4X3czMl9mbHVzaChkZXZpY2VfYmFzZSwgSVNMMzhYWF9ERVZfSU5UX1dBS0VVUCwKKwkJCQkgIElTTDM4WFhfREVWX0lOVF9SRUcpOworCQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworCQkvKiBwZXJmb3JtIGFub3RoZXIgcmVhZCBvbiB0aGUgRGV2aWNlIFN0YXR1cyBSZWdpc3RlciAqLworCQlyZWcgPSByZWFkbChkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRyk7CisJCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJZG9fZ2V0dGltZW9mZGF5KCZjdXJyZW50X3RpbWUpOworCQlERUJVRyhTSE9XX1RSQUNJTkcsICIlMDhsaS4lMDhsaSBEZXZpY2UgcmVnaXN0ZXIgcmVhZCAlMDh4XG4iLAorCQkgICAgICBjdXJyZW50X3RpbWUudHZfc2VjLCAobG9uZyljdXJyZW50X3RpbWUudHZfdXNlYywgcmVnKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCS8qIGRldmljZSBpcyAoc3RpbGwpIGF3YWtlICAqLworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCURFQlVHKFNIT1dfVFJBQ0lORywgIkRldmljZSBpcyBpbiBhY3RpdmUgc3RhdGVcbiIpOworI2VuZGlmCisJCS8qIHRyaWdnZXIgdGhlIGRldmljZSBieSBzZXR0aW5nIHRoZSBVcGRhdGUgYml0IGluIHRoZSBEZXZpY2UgSW50IHJlZyAqLworCisJCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZV9iYXNlLCBJU0wzOFhYX0RFVl9JTlRfVVBEQVRFLAorCQkJCSAgSVNMMzhYWF9ERVZfSU5UX1JFRyk7CisJCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCX0KK30KKwordm9pZAoraXNsMzh4eF9pbnRlcmZhY2VfcmVzZXQodm9pZCBfX2lvbWVtICpkZXZpY2VfYmFzZSwgZG1hX2FkZHJfdCBob3N0X2FkZHJlc3MpCit7CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0ZVTkNUSU9OX0NBTExTLCAiaXNsMzh4eF9pbnRlcmZhY2VfcmVzZXRcbiIpOworI2VuZGlmCisKKwkvKiBsb2FkIHRoZSBhZGRyZXNzIG9mIHRoZSBjb250cm9sIGJsb2NrIGluIHRoZSBkZXZpY2UgKi8KKwlpc2wzOHh4X3czMl9mbHVzaChkZXZpY2VfYmFzZSwgaG9zdF9hZGRyZXNzLCBJU0wzOFhYX0NUUkxfQkxLX0JBU0VfUkVHKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworCS8qIHNldCB0aGUgcmVzZXQgYml0IGluIHRoZSBEZXZpY2UgSW50ZXJydXB0IFJlZ2lzdGVyICovCisJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNlX2Jhc2UsIElTTDM4WFhfREVWX0lOVF9SRVNFVCwgSVNMMzhYWF9ERVZfSU5UX1JFRyk7CisJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7CisKKwkvKiBlbmFibGUgdGhlIGludGVycnVwdCBmb3IgZGV0ZWN0aW5nIGluaXRpYWxpemF0aW9uICovCisKKwkvKiBOb3RlOiBEbyBub3QgZW5hYmxlIG90aGVyIGludGVycnVwdHMgaGVyZS4gV2Ugd2FudCB0aGUKKwkgKiBkZXZpY2UgdG8gaGF2ZSBjb21lIHVwIGZpcnN0IDEwMCUgYmVmb3JlIGFsbG93aW5nIGFueSBvdGhlciAKKwkgKiBpbnRlcnJ1cHRzLiAqLworCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZV9iYXNlLCBJU0wzOFhYX0lOVF9JREVOVF9JTklULCBJU0wzOFhYX0lOVF9FTl9SRUcpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOyAgLyogYWxsb3cgY29tcGxldGUgZnVsbCByZXNldCAqLworfQorCit2b2lkCitpc2wzOHh4X2VuYWJsZV9jb21tb25faW50ZXJydXB0cyh2b2lkIF9faW9tZW0gKmRldmljZV9iYXNlKSB7CisJdTMyIHJlZzsKKwlyZWcgPSAoIElTTDM4WFhfSU5UX0lERU5UX1VQREFURSB8IAorCQkJSVNMMzhYWF9JTlRfSURFTlRfU0xFRVAgfCBJU0wzOFhYX0lOVF9JREVOVF9XQUtFVVApOworCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZV9iYXNlLCByZWcsIElTTDM4WFhfSU5UX0VOX1JFRyk7CisJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7Cit9CisKK2ludAoraXNsMzh4eF9pbl9xdWV1ZShpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNiLCBpbnQgcXVldWUpCit7CisJY29uc3QgczMyIGRlbHRhID0gKGxlMzJfdG9fY3B1KGNiLT5kcml2ZXJfY3Vycl9mcmFnW3F1ZXVlXSkgLQorCQkJICAgbGUzMl90b19jcHUoY2ItPmRldmljZV9jdXJyX2ZyYWdbcXVldWVdKSk7CisKKwkvKiBkZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBmcmFnbWVudHMgaW4gdGhlIHF1ZXVlIGRlcGVuZGluZyBvbiB0aGUgdHlwZQorCSAqIG9mIHRoZSBxdWV1ZSwgZWl0aGVyIHRyYW5zbWl0IG9yIHJlY2VpdmUgKi8KKworCUJVR19PTihkZWx0YSA8IDApOwkvKiBkcml2ZXIgcHRyIG11c3QgYmUgYWhlYWQgb2YgZGV2aWNlIHB0ciAqLworCisJc3dpdGNoIChxdWV1ZSkgeworCQkvKiBzZW5kIHF1ZXVlcyAqLworCWNhc2UgSVNMMzhYWF9DQl9UWF9NR01UUToKKwkJQlVHX09OKGRlbHRhID4gSVNMMzhYWF9DQl9NR01UX1FTSVpFKTsKKwljYXNlIElTTDM4WFhfQ0JfVFhfREFUQV9MUToKKwljYXNlIElTTDM4WFhfQ0JfVFhfREFUQV9IUToKKwkJQlVHX09OKGRlbHRhID4gSVNMMzhYWF9DQl9UWF9RU0laRSk7CisJCXJldHVybiBkZWx0YTsKKwkJYnJlYWs7CisKKwkJLyogcmVjZWl2ZSBxdWV1ZXMgKi8KKwljYXNlIElTTDM4WFhfQ0JfUlhfTUdNVFE6CisJCUJVR19PTihkZWx0YSA+IElTTDM4WFhfQ0JfTUdNVF9RU0laRSk7CisJCXJldHVybiBJU0wzOFhYX0NCX01HTVRfUVNJWkUgLSBkZWx0YTsKKwkJYnJlYWs7CisKKwljYXNlIElTTDM4WFhfQ0JfUlhfREFUQV9MUToKKwljYXNlIElTTDM4WFhfQ0JfUlhfREFUQV9IUToKKwkJQlVHX09OKGRlbHRhID4gSVNMMzhYWF9DQl9SWF9RU0laRSk7CisJCXJldHVybiBJU0wzOFhYX0NCX1JYX1FTSVpFIC0gZGVsdGE7CisJCWJyZWFrOworCX0KKwlCVUcoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNlNDkxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4eC5oCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpZm5kZWYgX0lTTF8zOFhYX0gKKyNkZWZpbmUgX0lTTF8zOFhYX0gKKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNkZWZpbmUgSVNMMzhYWF9DQl9SWF9RU0laRSAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgSVNMMzhYWF9DQl9UWF9RU0laRSAgICAgICAgICAgICAgICAgICAgIDMyCisKKy8qIElTTDM4WFggQWNjZXNzIFBvaW50IFNwZWNpZmljIGRlZmluaXRpb25zICovCisjZGVmaW5lIElTTDM4WFhfTUFYX1dEU19MSU5LUyAgICAgICAgICAgICAgICAgICA4CisKKy8qIElTTDM4eHggQ2xpZW50IFNwZWNpZmljIGRlZmluaXRpb25zICovCisjZGVmaW5lIElTTDM4WFhfUFNNX0FDVElWRV9TVEFURSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElTTDM4WFhfUFNNX1BPV0VSU0FWRV9TVEFURSAgICAgICAgICAgICAxCisKKy8qIElTTDM4WFggSG9zdCBJbnRlcmZhY2UgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgSVNMMzhYWF9QQ0lfTUVNX1NJWkUgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAKKyNkZWZpbmUgSVNMMzhYWF9NRU1PUllfV0lORE9XX1NJWkUgICAgICAgICAgICAgIDB4MDEwMDAKKyNkZWZpbmUgSVNMMzhYWF9ERVZfRklSTVdBUkVfQUREUkVTICAgICAgICAgICAgIDB4MjAwMDAKKyNkZWZpbmUgSVNMMzhYWF9XUklURUlPX0RFTEFZICAgICAgICAgICAgICAgICAgIDEwCS8qIGluIHVzICovCisjZGVmaW5lIElTTDM4WFhfUkVTRVRfREVMQVkgICAgICAgICAgICAgICAgICAgICA1MAkvKiBpbiBtcyAqLworI2RlZmluZSBJU0wzOFhYX1dBSVRfQ1lDTEUgICAgICAgICAgICAgICAgICAgICAgMTAJLyogaW4gMTBtcyAqLworI2RlZmluZSBJU0wzOFhYX01BWF9XQUlUX0NZQ0xFUyAgICAgICAgICAgICAgICAgMTAKKworLyogUENJIE1lbW9yeSBBcmVhICovCisjZGVmaW5lIElTTDM4WFhfSEFSRFdBUkVfUkVHICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgSVNMMzhYWF9DQVJEQlVTX0NJUyAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBJU0wzOFhYX0RJUkVDVF9NRU1fV0lOICAgICAgICAgICAgICAgICAgMHgxMDAwCisKKy8qIEhhcmR3YXJlIHJlZ2lzdGVycyAqLworI2RlZmluZSBJU0wzOFhYX0RFVl9JTlRfUkVHICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIElTTDM4WFhfSU5UX0lERU5UX1JFRyAgICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgSVNMMzhYWF9JTlRfQUNLX1JFRyAgICAgICAgICAgICAgICAgICAgIDB4MDAxNAorI2RlZmluZSBJU0wzOFhYX0lOVF9FTl9SRUcgICAgICAgICAgICAgICAgICAgICAgMHgwMDE4CisjZGVmaW5lIElTTDM4WFhfR0VOX1BVUlBfQ09NX1JFR18xICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgSVNMMzhYWF9HRU5fUFVSUF9DT01fUkVHXzIgICAgICAgICAgICAgIDB4MDAyNAorI2RlZmluZSBJU0wzOFhYX0NUUkxfQkxLX0JBU0VfUkVHICAgICAgICAgICAgICAgSVNMMzhYWF9HRU5fUFVSUF9DT01fUkVHXzEKKyNkZWZpbmUgSVNMMzhYWF9ESVJfTUVNX0JBU0VfUkVHICAgICAgICAgICAgICAgIDB4MDAzMAorI2RlZmluZSBJU0wzOFhYX0NUUkxfU1RBVF9SRUcgICAgICAgICAgICAgICAgICAgMHgwMDc4CisKKy8qIEhpZ2ggZW5kIG1vYm9zIHF1ZXVlIHVwIHBjaSB3cml0ZXMsIHRoZSBmb2xsb3dpbmcKKyAqIGlzIHVzZWQgdG8gInJlYWQiIGZyb20gYWZ0ZXIgYSB3cml0ZSB0byBmb3JjZSBmbHVzaCAqLworI2RlZmluZSBJU0wzOFhYX1BDSV9QT1NUSU5HX0ZMVVNICQlJU0wzOFhYX0lOVF9FTl9SRUcKKworLyoqCisgKiBpc2wzOHh4X3czMl9mbHVzaCAtIFBDSSBpb21lbSB3cml0ZSBoZWxwZXIKKyAqIEBiYXNlOiAoaG9zdCkgbWVtb3J5IGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlCisgKiBAdmFsOiAzMmJpdCB2YWx1ZSAoaG9zdCBvcmRlcikgdG8gd3JpdGUKKyAqIEBvZmZzZXQ6IGJ5dGUgb2Zmc2V0IGludG8gQGJhc2UgdG8gd3JpdGUgdmFsdWUgdG8KKyAqIAorICogIFRoaXMgaGVscGVyIHRha2VzIGNhcmUgb2Ygd3JpdGluZyBhIDMyYml0IGRhdHVtIHRvIHRoZQorICogIHNwZWNpZmllZCBvZmZzZXQgaW50byB0aGUgZGV2aWNlJ3MgcGNpIG1lbW9yeSBzcGFjZSwgYW5kIG1ha2luZyBzdXJlIAorICogIHRoZSBwY2kgbWVtb3J5IGJ1ZmZlcnMgZ2V0IGZsdXNoZWQgYnkgcGVyZm9ybWluZyBvbmUgaGFybWxlc3MgcmVhZCAKKyAqICBmcm9tIHRoZSAlSVNMMzhYWF9QQ0lfUE9TVElOR19GTFVTSCBvZmZzZXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoraXNsMzh4eF93MzJfZmx1c2godm9pZCBfX2lvbWVtICpiYXNlLCB1MzIgdmFsLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwl3cml0ZWwodmFsLCBiYXNlICsgb2Zmc2V0KTsKKwkodm9pZCkgcmVhZGwoYmFzZSArIElTTDM4WFhfUENJX1BPU1RJTkdfRkxVU0gpOworfQorCisvKiBEZXZpY2UgSW50ZXJydXB0IHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgSVNMMzhYWF9ERVZfSU5UX1JFU0VUICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBJU0wzOFhYX0RFVl9JTlRfVVBEQVRFICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIElTTDM4WFhfREVWX0lOVF9XQUtFVVAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgSVNMMzhYWF9ERVZfSU5UX1NMRUVQICAgICAgICAgICAgICAgICAgIDB4MDAxMAorCisvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24vQWNrbm93bGVkZ2UvRW5hYmxlIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgSVNMMzhYWF9JTlRfSURFTlRfVVBEQVRFICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBJU0wzOFhYX0lOVF9JREVOVF9JTklUICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIElTTDM4WFhfSU5UX0lERU5UX1dBS0VVUCAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgSVNMMzhYWF9JTlRfSURFTlRfU0xFRVAgICAgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBJU0wzOFhYX0lOVF9TT1VSQ0VTICAgICAgICAgICAgICAgICAgICAgMHgwMDFFCisKKy8qIENvbnRyb2wvU3RhdHVzIHJlZ2lzdGVyIGJpdHMgKi8KKy8qIExvb2tzIGxpa2UgdGhlcmUgYXJlIG90aGVyIG1lYW5pbmdmdWwgYml0cworICAgIDB4MjAwMDQ0MDAgc2VlbiBpbiBub3JtYWwgb3BlcmF0aW9uLAorICAgIDB4MjAwMDQ0ZGIgYXQgJ3RpbWVvdXQgd2FpdGluZyBmb3IgbWdtdCByZXNwb25zZScKKyovCisjZGVmaW5lIElTTDM4WFhfQ1RSTF9TVEFUX1NMRUVQTU9ERSAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lCUlTTDM4WFhfQ1RSTF9TVEFUX0NMS1JVTgkJMHgwMDgwMDAwMAorI2RlZmluZSBJU0wzOFhYX0NUUkxfU1RBVF9SRVNFVCAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBJU0wzOFhYX0NUUkxfU1RBVF9SQU1CT09UICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBJU0wzOFhYX0NUUkxfU1RBVF9TVEFSVEhBTFRFRCAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBJU0wzOFhYX0NUUkxfU1RBVF9IT1NUX09WRVJSSURFICAgICAgICAgMHg4MDAwMDAwMAorCisvKiBDb250cm9sIEJsb2NrIGRlZmluaXRpb25zICovCisjZGVmaW5lIElTTDM4WFhfQ0JfUlhfREFUQV9MUSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElTTDM4WFhfQ0JfVFhfREFUQV9MUSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElTTDM4WFhfQ0JfUlhfREFUQV9IUSAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIElTTDM4WFhfQ0JfVFhfREFUQV9IUSAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIElTTDM4WFhfQ0JfUlhfTUdNVFEgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElTTDM4WFhfQ0JfVFhfTUdNVFEgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIElTTDM4WFhfQ0JfUUNPVU5UICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIElTTDM4WFhfQ0JfTUdNVF9RU0laRSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElTTDM4WFhfTUlOX1FUSFJFU0hPTEQgICAgICAgICAgICAgICAgICA0CS8qIGZyYWdtZW50cyAqLworCisvKiBNZW1vcnkgTWFuYWdlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBNR01UX0ZSQU1FX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgMTUwMAkvKiA+PSBzaXplIHN0cnVjdCBvYmpfYnNzbGlzdCAqLworI2RlZmluZSBNR01UX1RYX0ZSQU1FX0NPVU5UICAgICAgICAgICAgICAgICAgICAgMjQJLyogbWF4IDQgKyBzcGFyZSA0ICsgOCBpbml0ICovCisjZGVmaW5lIE1HTVRfUlhfRlJBTUVfQ09VTlQgICAgICAgICAgICAgICAgICAgICAyNAkvKiA0KjQgKyBzcGFyZSA4ICovCisjZGVmaW5lIE1HTVRfRlJBTUVfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAoTUdNVF9UWF9GUkFNRV9DT1VOVCArIE1HTVRfUlhfRlJBTUVfQ09VTlQpCisjZGVmaW5lIENPTlRST0xfQkxPQ0tfU0laRSAgICAgICAgICAgICAgICAgICAgICAxMDI0CS8qIHNob3VsZCBiZSBlbm91Z2ggKi8KKyNkZWZpbmUgUFNNX0ZSQU1FX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MzYKKyNkZWZpbmUgUFNNX01JTklNQUxfU1RBVElPTl9DT1VOVCAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIFBTTV9GUkFNRV9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICBQU01fTUlOSU1BTF9TVEFUSU9OX0NPVU5UCisjZGVmaW5lIFBTTV9CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBQU01fRlJBTUVfU0laRSAqIFBTTV9GUkFNRV9DT1VOVAorI2RlZmluZSBNQVhfVFJBUF9SWF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBIT1NUX01FTV9CTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVFJPTF9CTE9DS19TSVpFICsgUFNNX0JVRkZFUl9TSVpFCisKKy8qIEZyYWdtZW50IHBhY2thZ2UgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRlJBR01FTlRfRkxBR19NRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNQVhfRlJBR01FTlRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgMTUzNgorCisvKiBJbiBtb25pdG9yIG1vZGUgZnJhbWVzIGhhdmUgYSBoZWFkZXIuIEkgZG9uJ3Qga25vdyBleGFjdGx5IGhvdyBiaWcgdGhvc2UKKyAqIGZyYW1lIGNhbiBiZSBidXQgSSd2ZSBuZXZlciBzZWVuIGFueSBmcmFtZSBiaWdnZXIgdGhhbiAxNTg0Li4uIDoKKyAqLworI2RlZmluZSBNQVhfRlJBR01FTlRfU0laRV9SWAkgICAgICAgICAgICAgICAgMTYwMAorCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIGFkZHJlc3M7CQkvKiBwaHlzaWNhbCBhZGRyZXNzIG9uIGhvc3QgKi8KKwl1MTYgc2l6ZTsJCS8qIHBhY2tldCBzaXplICovCisJdTE2IGZsYWdzOwkJLyogc2V0IG9mIGJpdC13aXNlIGZsYWdzICovCit9IGlzbDM4eHhfZnJhZ21lbnQ7CisKK3N0cnVjdCBpc2wzOHh4X2NiIHsKKwl1MzIgZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1FDT1VOVF07CisJdTMyIGRldmljZV9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9RQ09VTlRdOworCWlzbDM4eHhfZnJhZ21lbnQgcnhfZGF0YV9sb3dbSVNMMzhYWF9DQl9SWF9RU0laRV07CisJaXNsMzh4eF9mcmFnbWVudCB0eF9kYXRhX2xvd1tJU0wzOFhYX0NCX1RYX1FTSVpFXTsKKwlpc2wzOHh4X2ZyYWdtZW50IHJ4X2RhdGFfaGlnaFtJU0wzOFhYX0NCX1JYX1FTSVpFXTsKKwlpc2wzOHh4X2ZyYWdtZW50IHR4X2RhdGFfaGlnaFtJU0wzOFhYX0NCX1RYX1FTSVpFXTsKKwlpc2wzOHh4X2ZyYWdtZW50IHJ4X2RhdGFfbWdtdFtJU0wzOFhYX0NCX01HTVRfUVNJWkVdOworCWlzbDM4eHhfZnJhZ21lbnQgdHhfZGF0YV9tZ210W0lTTDM4WFhfQ0JfTUdNVF9RU0laRV07Cit9OworCit0eXBlZGVmIHN0cnVjdCBpc2wzOHh4X2NiIGlzbDM4eHhfY29udHJvbF9ibG9jazsKKworLyogZGV0ZXJtaW5lIG51bWJlciBvZiBlbnRyaWVzIGN1cnJlbnRseSBpbiBxdWV1ZSAqLworaW50IGlzbDM4eHhfaW5fcXVldWUoaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjYiwgaW50IHF1ZXVlKTsKKwordm9pZCBpc2wzOHh4X2Rpc2FibGVfaW50ZXJydXB0cyh2b2lkIF9faW9tZW0gKik7Cit2b2lkIGlzbDM4eHhfZW5hYmxlX2NvbW1vbl9pbnRlcnJ1cHRzKHZvaWQgX19pb21lbSAqKTsKKwordm9pZCBpc2wzOHh4X2hhbmRsZV9zbGVlcF9yZXF1ZXN0KGlzbDM4eHhfY29udHJvbF9ibG9jayAqLCBpbnQgKiwKKwkJCQkgIHZvaWQgX19pb21lbSAqKTsKK3ZvaWQgaXNsMzh4eF9oYW5kbGVfd2FrZXVwKGlzbDM4eHhfY29udHJvbF9ibG9jayAqLCBpbnQgKiwgdm9pZCBfX2lvbWVtICopOwordm9pZCBpc2wzOHh4X3RyaWdnZXJfZGV2aWNlKGludCwgdm9pZCBfX2lvbWVtICopOwordm9pZCBpc2wzOHh4X2ludGVyZmFjZV9yZXNldCh2b2lkIF9faW9tZW0gKiwgZG1hX2FkZHJfdCk7CisKKyNlbmRpZgkJCQkvKiBfSVNMXzM4WFhfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyOWE5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKQEAgLTAsMCArMSwyNzUwIEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCisgKiAgICAgICAgICAgIChDKSAyMDAzLDIwMDQgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4KKyAqICAgICAgICAgICAgKEMpIDIwMDMgSGVyYmVydCBWYWxlcmlvIFJpZWRlbCA8aHZyQGdudS5vcmc+CisgKiAgICAgICAgICAgIChDKSAyMDAzIEx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAcnVzbHVnLnJ1dGdlcnMuZWR1PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInByaXNtY29tcGF0LmgiCisjaW5jbHVkZSAiaXNsX2lvY3RsLmgiCisjaW5jbHVkZSAiaXNscGNpX21ndC5oIgorI2luY2x1ZGUgImlzbF9vaWQuaCIJCS8qIGFkZGl0aW9uYWwgdHlwZXMgYW5kIGRlZnMgZm9yIGlzbDM4eHggZncgKi8KKyNpbmNsdWRlICJvaWRfbWd0LmgiCisKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgkvKiBOZXcgZHJpdmVyIEFQSSAqLworCisKK3N0YXRpYyB2b2lkIHByaXNtNTRfd3BhX2llX2FkZChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgdTggKmJzc2lkLAorCQkJCXU4ICp3cGFfaWUsIHNpemVfdCB3cGFfaWVfbGVuKTsKK3N0YXRpYyBzaXplX3QgcHJpc201NF93cGFfaWVfZ2V0KGlzbHBjaV9wcml2YXRlICpwcml2LCB1OCAqYnNzaWQsIHU4ICp3cGFfaWUpOworc3RhdGljIGludCBwcmlzbTU0X3NldF93cGEoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqLAorCQkJCV9fdTMyICosIGNoYXIgKik7CisKKworLyoqCisgKiBwcmlzbTU0X21pYl9tb2RlX2hlbHBlciAtIE1JQiBjaGFuZ2UgbW9kZSBoZWxwZXIgZnVuY3Rpb24KKyAqIEBtaWI6IHRoZSAmc3RydWN0IGlzbHBjaV9taWIgb2JqZWN0IHRvIG1vZGlmeQorICogQGl3X21vZGU6IG5ldyBtb2RlICglSVdfTU9ERV8qKQorICogCisgKiAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiwgaGVuY2UgaXQgZG9lcyBub3QgbG9jay4gTWFrZSBzdXJlCisgKiAgY2FsbGVyIGRlYWxzIHdpdGggbG9ja2luZyAqaWYqIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSAKKyAqICBtb2RlLWRlcGVuZGVudCBtaWIgdmFsdWVzIGFuZCBkb2VzIHRoZSBtYXBwaW5nIG9mIHRoZSBMaW51eCAKKyAqICBXaXJlbGVzcyBBUEkgbW9kZXMgdG8gRGV2aWNlIGZpcm13YXJlIG1vZGVzLiBJdCBhbHNvIGNoZWNrcyBmb3IgCisgKiAgY29ycmVjdCB2YWxpZCBMaW51eCB3aXJlbGVzcyBtb2Rlcy4gCisgKi8KK3N0YXRpYyBpbnQKK3ByaXNtNTRfbWliX21vZGVfaGVscGVyKGlzbHBjaV9wcml2YXRlICpwcml2LCB1MzIgaXdfbW9kZSkKK3sKKwl1MzIgY29uZmlnID0gSU5MX0NPTkZJR19NQU5VQUxSVU47CisJdTMyIG1vZGUsIGJzc3R5cGU7CisKKwkvKiBGb3Igbm93LCBqdXN0IGNhdGNoIGVhcmx5IHRoZSBSZXBlYXRlciBhbmQgU2Vjb25kYXJ5IG1vZGVzIGhlcmUgKi8KKwlpZiAoaXdfbW9kZSA9PSBJV19NT0RFX1JFUEVBVCB8fCBpd19tb2RlID09IElXX01PREVfU0VDT05EKSB7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXMoKTogU29ycnksIFJlcGVhdGVyIG1vZGUgYW5kIFNlY29uZGFyeSBtb2RlICIKKwkJICAgICAgICJhcmUgbm90IHlldCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcml2LT5pd19tb2RlID0gaXdfbW9kZTsKKworCXN3aXRjaCAoaXdfbW9kZSkgeworCWNhc2UgSVdfTU9ERV9BVVRPOgorCQltb2RlID0gSU5MX01PREVfQ0xJRU5UOworCQlic3N0eXBlID0gRE9UMTFfQlNTVFlQRV9BTlk7CisJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJbW9kZSA9IElOTF9NT0RFX0NMSUVOVDsKKwkJYnNzdHlwZSA9IERPVDExX0JTU1RZUEVfSUJTUzsKKwkJYnJlYWs7CisJY2FzZSBJV19NT0RFX0lORlJBOgorCQltb2RlID0gSU5MX01PREVfQ0xJRU5UOworCQlic3N0eXBlID0gRE9UMTFfQlNTVFlQRV9JTkZSQTsKKwkJYnJlYWs7CisJY2FzZSBJV19NT0RFX01BU1RFUjoKKwkJbW9kZSA9IElOTF9NT0RFX0FQOworCQlic3N0eXBlID0gRE9UMTFfQlNTVFlQRV9JTkZSQTsKKwkJYnJlYWs7CisJY2FzZSBJV19NT0RFX01PTklUT1I6CisJCW1vZGUgPSBJTkxfTU9ERV9QUk9NSVNDVU9VUzsKKwkJYnNzdHlwZSA9IERPVDExX0JTU1RZUEVfQU5ZOworCQljb25maWcgfD0gSU5MX0NPTkZJR19SWEFOTkVYOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoaW5pdF93ZHMpCisJCWNvbmZpZyB8PSBJTkxfQ09ORklHX1dEUzsKKwltZ3Rfc2V0KHByaXYsIERPVDExX09JRF9CU1NUWVBFLCAmYnNzdHlwZSk7CisJbWd0X3NldChwcml2LCBPSURfSU5MX0NPTkZJRywgJmNvbmZpZyk7CisJbWd0X3NldChwcml2LCBPSURfSU5MX01PREUsICZtb2RlKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHByaXNtNTRfbWliX2luaXQgLSBmaWxsIE1JQiBjYWNoZSB3aXRoIGRlZmF1bHRzCisgKgorICogIHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHN0cnVjdCBnaXZlbiBhcyBAbWliIHdpdGggZGVmYXVsdHMsCisgKiAgb2Ygd2hpY2ggbWFueSBhcmUgcmV0cmlldmVkIGZyb20gdGhlIGdsb2JhbCBtb2R1bGUgcGFyYW1ldGVyCisgKiAgdmFyaWFibGVzLiAgCisgKi8KKwordm9pZAorcHJpc201NF9taWJfaW5pdChpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwl1MzIgY2hhbm5lbCwgYXV0aGVuLCB3ZXAsIGZpbHRlciwgZG90MXgsIG1sbWUsIGNvbmZvcm1hbmNlLCBwb3dlciwgbW9kZTsKKwlzdHJ1Y3Qgb2JqX2J1ZmZlciBwc21fYnVmZmVyID0geworCQkuc2l6ZSA9IFBTTV9CVUZGRVJfU0laRSwKKwkJLmFkZHIgPSBwcml2LT5kZXZpY2VfcHNtX2J1ZmZlcgorCX07CisKKwljaGFubmVsID0gQ0FSRF9ERUZBVUxUX0NIQU5ORUw7CisJYXV0aGVuID0gQ0FSRF9ERUZBVUxUX0FVVEhFTjsKKwl3ZXAgPSBDQVJEX0RFRkFVTFRfV0VQOworCWZpbHRlciA9IENBUkRfREVGQVVMVF9GSUxURVI7IC8qICgwKSBEbyBub3QgZmlsdGVyIHVuLWVuY3J5cHRlZCBkYXRhICovCisJZG90MXggPSBDQVJEX0RFRkFVTFRfRE9UMVg7IAorCW1sbWUgPSBDQVJEX0RFRkFVTFRfTUxNRV9NT0RFOworCWNvbmZvcm1hbmNlID0gQ0FSRF9ERUZBVUxUX0NPTkZPUk1BTkNFOworCXBvd2VyID0gMTI3OworCW1vZGUgPSBDQVJEX0RFRkFVTFRfSVdfTU9ERTsKKworCW1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX0NIQU5ORUwsICZjaGFubmVsKTsKKwltZ3Rfc2V0KHByaXYsIERPVDExX09JRF9BVVRIRU5BQkxFLCAmYXV0aGVuKTsKKwltZ3Rfc2V0KHByaXYsIERPVDExX09JRF9QUklWQUNZSU5WT0tFRCwgJndlcCk7CisJbWd0X3NldChwcml2LCBET1QxMV9PSURfUFNNQlVGRkVSLCAmcHNtX2J1ZmZlcik7CisJbWd0X3NldChwcml2LCBET1QxMV9PSURfRVhVTkVOQ1JZUFRFRCwgJmZpbHRlcik7CisJbWd0X3NldChwcml2LCBET1QxMV9PSURfRE9UMVhFTkFCTEUsICZkb3QxeCk7CisJbWd0X3NldChwcml2LCBET1QxMV9PSURfTUxNRUFVVE9MRVZFTCwgJm1sbWUpOworCW1ndF9zZXQocHJpdiwgT0lEX0lOTF9ET1QxMURfQ09ORk9STUFOQ0UsICZjb25mb3JtYW5jZSk7CisJbWd0X3NldChwcml2LCBPSURfSU5MX09VVFBVVFBPV0VSLCAmcG93ZXIpOworCisJLyogVGhpcyBzZXRzIGFsbCBvZiB0aGUgbW9kZS1kZXBlbmRlbnQgdmFsdWVzICovCisJcHJpc201NF9taWJfbW9kZV9oZWxwZXIocHJpdiwgbW9kZSk7Cit9CisKKy8qIHRoaXMgd2lsbCBiZSBleGVjdXRlZCBvdXRzaWRlIG9mIGF0b21pYyBjb250ZXh0IHRoYW5rcyB0bworICogc2NoZWR1bGVfd29yaygpLCB0aHVzIHdlIGNhbiBhcyB3ZWxsIHVzZSBzbGVlcGluZyBzZW1hcGhvcmUKKyAqIGxvY2tpbmcgKi8KK3ZvaWQKK3ByaXNtNTRfdXBkYXRlX3N0YXRzKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCWNoYXIgKmRhdGE7CisJaW50IGo7CisJc3RydWN0IG9ial9ic3MgYnNzLCAqYnNzMjsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnByaXYtPnN0YXRzX3NlbSkpCisJCXJldHVybjsKKworLyogTm9pc2UgZmxvb3IuCisgKiBJJ20gbm90IHN1cmUgaWYgdGhlIHVuaXQgaXMgZEJtLgorICogTm90ZSA6IElmIHdlIGFyZSBub3QgY29ubmVjdGVkLCB0aGlzIHZhbHVlIHNlZW1zIHRvIGJlIGlycmVsZXZhbnQuICovCisKKwltZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX05PSVNFRkxPT1IsIDAsIE5VTEwsICZyKTsKKwlwcml2LT5sb2NhbF9pd3N0YXRpc3RpY3MucXVhbC5ub2lzZSA9IHIudTsKKworLyogR2V0IHRoZSByc3NpIG9mIHRoZSBsaW5rLiBUbyBkbyB0aGlzIHdlIG5lZWQgdG8gcmV0cmlldmUgYSBic3MuICovCisKKwkvKiBGaXJzdCBnZXQgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBBUCB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoLiAqLworCW1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQlNTSUQsIDAsIE5VTEwsICZyKTsKKwlkYXRhID0gci5wdHI7CisKKwkvKiBjb3B5IHRoaXMgTUFDIHRvIHRoZSBic3MgKi8KKwltZW1jcHkoYnNzLmFkZHJlc3MsIGRhdGEsIDYpOworCWtmcmVlKGRhdGEpOworCisJLyogbm93IGFzayBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYnNzICovCisJaiA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQlNTRklORCwgMCwgKHZvaWQgKikgJmJzcywgJnIpOworCWJzczIgPSByLnB0cjsKKwkvKiByZXBvcnQgdGhlIHJzc2kgYW5kIHVzZSBpdCB0byBjYWxjdWxhdGUKKwkgKiAgbGluayBxdWFsaXR5IHRocm91Z2ggYSBzaWduYWwtbm9pc2UKKwkgKiAgcmF0aW8gKi8KKwlwcml2LT5sb2NhbF9pd3N0YXRpc3RpY3MucXVhbC5sZXZlbCA9IGJzczItPnJzc2k7CisJcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwucXVhbCA9CisJICAgIGJzczItPnJzc2kgLSBwcml2LT5pd3N0YXRpc3RpY3MucXVhbC5ub2lzZTsKKworCWtmcmVlKGJzczIpOworCisJLyogcmVwb3J0IHRoYXQgdGhlIHN0YXRzIGFyZSBuZXcgKi8KKwlwcml2LT5sb2NhbF9pd3N0YXRpc3RpY3MucXVhbC51cGRhdGVkID0gMHg3OworCisvKiBSeCA6IHVuYWJsZSB0byBkZWNyeXB0IHRoZSBNUERVICovCisJbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9QUklWUlhGQUlMRUQsIDAsIE5VTEwsICZyKTsKKwlwcml2LT5sb2NhbF9pd3N0YXRpc3RpY3MuZGlzY2FyZC5jb2RlID0gci51OworCisvKiBUeCA6IE1heCBNQUMgcmV0cmllcyBudW0gcmVhY2hlZCAqLworCW1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfTVBEVVRYRkFJTEVELCAwLCBOVUxMLCAmcik7CisJcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLmRpc2NhcmQucmV0cmllcyA9IHIudTsKKworCXVwKCZwcml2LT5zdGF0c19zZW0pOworCisJcmV0dXJuOworfQorCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqCitwcmlzbTU0X2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJLyogSWYgdGhlIHN0YXRzIGFyZSBiZWluZyB1cGRhdGVkIHJldHVybiBvbGQgZGF0YSAqLworCWlmIChkb3duX3RyeWxvY2soJnByaXYtPnN0YXRzX3NlbSkgPT0gMCkgeworCQltZW1jcHkoJnByaXYtPml3c3RhdGlzdGljcywgJnByaXYtPmxvY2FsX2l3c3RhdGlzdGljcywKKwkJICAgICAgIHNpemVvZiAoc3RydWN0IGl3X3N0YXRpc3RpY3MpKTsKKwkJLyogVGhleSB3b24ndCBiZSBtYXJrZWQgdXBkYXRlZCBmb3IgdGhlIG5leHQgdGltZSAqLworCQlwcml2LT5sb2NhbF9pd3N0YXRpc3RpY3MucXVhbC51cGRhdGVkID0gMDsKKwkJdXAoJnByaXYtPnN0YXRzX3NlbSk7CisJfSBlbHNlCisJCXByaXYtPml3c3RhdGlzdGljcy5xdWFsLnVwZGF0ZWQgPSAwOworCisJLyogVXBkYXRlIG91ciB3aXJlbGVzcyBzdGF0cywgYnV0IGRvIG5vdCBzY2hlZHVsZSB0byBvZnRlbiAKKwkgKiAobWF4IDEgSFopICovCisJaWYgKChwcml2LT5zdGF0c190aW1lc3RhbXAgPT0gMCkgfHwKKwkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT5zdGF0c190aW1lc3RhbXAgKyAxICogSFopKSB7CisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnN0YXRzX3dvcmspOworCQlwcml2LT5zdGF0c190aW1lc3RhbXAgPSBqaWZmaWVzOworCX0KKworCXJldHVybiAmcHJpdi0+aXdzdGF0aXN0aWNzOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkgICAgICAgY2hhciAqY3dycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCS8qIHNpbXBseSByZS1zZXQgdGhlIGxhc3Qgc2V0IFNTSUQsIHRoaXMgc2hvdWxkIGNvbW1pdCBtb3N0IHN0dWZmICovCisKKwkvKiBDb21taXQgaW4gTW9uaXRvciBtb2RlIGlzIG5vdCBuZWNlc3NhcnksIGFsc28gc2V0dGluZyBlc3NpZAorCSAqIGluIE1vbml0b3IgbW9kZSBkb2VzIG5vdCBtYWtlIHNlbnNlIGFuZCBpc24ndCBhbGxvd2VkIGZvciB0aGlzCisJICogZGV2aWNlJ3MgZmlybXdhcmUgKi8KKwlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01PTklUT1IpCisJCXJldHVybiBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1NTSUQsIDAsIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgY2hhciAqY3dycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwljaGFyICpjYXBhYmlsaXRpZXM7CisJdW5pb24gb2lkX3Jlc190IHI7CisJaW50IHJ2YWx1ZTsKKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpIDwgUFJWX1NUQVRFX0lOSVQpIHsKKwkJc3RybmNweShjd3JxLCAiTk9UIFJFQURZISIsIElGTkFNU0laKTsKKwkJcmV0dXJuIDA7CisJfQorCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBPSURfSU5MX1BIWUNBUEFCSUxJVElFUywgMCwgTlVMTCwgJnIpOworCisJc3dpdGNoIChyLnUpIHsKKwljYXNlIElOTF9QSFlDQVBfNTAwME1IWjoKKwkJY2FwYWJpbGl0aWVzID0gIklFRUUgODAyLjExYS9iL2ciOworCQlicmVhazsKKwljYXNlIElOTF9QSFlDQVBfRkFBOgorCQljYXBhYmlsaXRpZXMgPSAiSUVFRSA4MDIuMTFiL2cgLSBGQUEgU3VwcG9ydCI7CisJCWJyZWFrOworCWNhc2UgSU5MX1BIWUNBUF8yNDAwTUhaOgorCWRlZmF1bHQ6CisJCWNhcGFiaWxpdGllcyA9ICJJRUVFIDgwMi4xMWIvZyI7CS8qIERlZmF1bHQgKi8KKwkJYnJlYWs7CisJfQorCXN0cm5jcHkoY3dycSwgY2FwYWJpbGl0aWVzLCBJRk5BTVNJWik7CisJcmV0dXJuIHJ2YWx1ZTsKK30KKworc3RhdGljIGludAorcHJpc201NF9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIHN0cnVjdCBpd19mcmVxICpmd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCBydmFsdWU7CisJdTMyIGM7CisKKwlpZiAoZndycS0+bSA8IDEwMDApCisJCS8qIHdlIGhhdmUgYSBjaGFubmVsIG51bWJlciAqLworCQljID0gZndycS0+bTsKKwllbHNlCisJCWMgPSAoZndycS0+ZSA9PSAxKSA/IGNoYW5uZWxfb2ZfZnJlcShmd3JxLT5tIC8gMTAwMDAwKSA6IDA7CisKKwlydmFsdWUgPSBjID8gbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9DSEFOTkVMLCAwLCAmYykgOiAtRUlOVkFMOworCisJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworCXJldHVybiAocnZhbHVlID8gcnZhbHVlIDogLUVJTlBST0dSRVNTKTsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIHN0cnVjdCBpd19mcmVxICpmd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXVuaW9uIG9pZF9yZXNfdCByOworCWludCBydmFsdWU7CisKKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0NIQU5ORUwsIDAsIE5VTEwsICZyKTsKKwlmd3JxLT5pID0gci51OworCXJ2YWx1ZSB8PSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0ZSRVFVRU5DWSwgMCwgTlVMTCwgJnIpOworCWZ3cnEtPm0gPSByLnU7CisJZndycS0+ZSA9IDM7CisKKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXUzMiBtbG1lYXV0b2xldmVsID0gQ0FSRF9ERUZBVUxUX01MTUVfTU9ERTsKKworCS8qIExldCdzIHNlZSBpZiB0aGUgdXNlciBwYXNzZWQgYSB2YWxpZCBMaW51eCBXaXJlbGVzcyBtb2RlICovCisJaWYgKCp1d3JxID4gSVdfTU9ERV9NT05JVE9SIHx8ICp1d3JxIDwgSVdfTU9ERV9BVVRPKSB7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6ICVzKCkgWW91IHBhc3NlZCBhIG5vbi12YWxpZCBpbml0X21vZGUuXG4iLAorCQkgICAgICAgcHJpdi0+bmRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG93bl93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisKKwlpZiAocHJpc201NF9taWJfbW9kZV9oZWxwZXIocHJpdiwgKnV3cnEpKSB7CisJCXVwX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCS8qIHRoZSBBQ0wgY29kZSBuZWVkcyBhbiBpbnRlcm1lZGlhdGUgbWxtZWF1dG9sZXZlbC4gVGhlIHdwYSBzdHVmZiBhbgorCSAqIGV4dGVuZGVkIG9uZS4KKwkgKi8KKwlpZiAoKCp1d3JxID09IElXX01PREVfTUFTVEVSKSAmJiAocHJpdi0+YWNsLnBvbGljeSAhPSBNQUNfUE9MSUNZX09QRU4pKQorCQltbG1lYXV0b2xldmVsID0gRE9UMTFfTUxNRV9JTlRFUk1FRElBVEU7CisJaWYgKHByaXYtPndwYSkKKwkJbWxtZWF1dG9sZXZlbCA9IERPVDExX01MTUVfRVhURU5ERUQ7CisKKwltZ3Rfc2V0KHByaXYsIERPVDExX09JRF9NTE1FQVVUT0xFVkVMLCAmbWxtZWF1dG9sZXZlbCk7CisKKwlpZiAobWd0X2NvbW1pdChwcml2KSkgeworCQl1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisJCXJldHVybiAtRUlPOworCX0KKwlwcml2LT5uZGV2LT50eXBlID0gKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCSAgICA/IHByaXYtPm1vbml0b3JfdHlwZSA6IEFSUEhSRF9FVEhFUjsKKwl1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVXNlIG1pYiBjYWNoZSAqLworc3RhdGljIGludAorcHJpc201NF9nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIF9fdTMyICogdXdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCUJVR19PTigocHJpdi0+aXdfbW9kZSA8IElXX01PREVfQVVUTykgfHwgKHByaXYtPml3X21vZGUgPgorCQkJCQkJICBJV19NT0RFX01PTklUT1IpKTsKKwkqdXdycSA9IHByaXYtPml3X21vZGU7CisKKwlyZXR1cm4gMDsKK30KKworLyogd2UgdXNlIERPVDExX09JRF9FRFRIUkVTSE9MRC4gRnJvbSB3aGF0IEkgZ3Vlc3MgdGhlIGNhcmQgd2lsbCBub3QgdHJ5IHRvCisgKiBlbWl0IGRhdGEgaWYgKHNlbnNpdGl2aXR5ID4gcnNzaSAtIG5vaXNlKSAoaW4gZEJtKS4KKyAqIHByaXNtNTRfc2V0X3NlbnMgZG9lcyBub3Qgc2VlbSB0byB3b3JrLgorICovCisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJdTMyIHNlbnM7CisKKwkvKiBieSBkZWZhdWx0ICB0aGUgY2FyZCBzZXRzIHRoaXMgdG8gMjAuICovCisJc2VucyA9IHZ3cnEtPmRpc2FibGVkID8gMjAgOiB2d3JxLT52YWx1ZTsKKworCXJldHVybiBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0VEVEhSRVNIT0xELCAwLCAmc2Vucyk7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJdW5pb24gb2lkX3Jlc190IHI7CisJaW50IHJ2YWx1ZTsKKworCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfRURUSFJFU0hPTEQsIDAsIE5VTEwsICZyKTsKKworCXZ3cnEtPnZhbHVlID0gci51OworCXZ3cnEtPmRpc2FibGVkID0gKHZ3cnEtPnZhbHVlID09IDApOworCXZ3cnEtPmZpeGVkID0gMTsKKworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1OCAqZGF0YTsKKwlpbnQgaSwgbSwgcnZhbHVlOworCXN0cnVjdCBvYmpfZnJlcXVlbmNpZXMgKmZyZXE7CisJdW5pb24gb2lkX3Jlc190IHI7CisKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZiAoc3RydWN0IGl3X3JhbmdlKSk7CisJZHdycS0+bGVuZ3RoID0gc2l6ZW9mIChzdHJ1Y3QgaXdfcmFuZ2UpOworCisJLyogc2V0IHRoZSB3aXJlbGVzcyBleHRlbnNpb24gdmVyc2lvbiBudW1iZXIgKi8KKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSBTVVBQT1JURURfV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCisJLyogTm93IHRoZSBlbmNvZGluZyBjYXBhYmlsaXRpZXMgKi8KKwlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMzsKKwkvKiA2NCg0MCkgYml0cyBXRVAgKi8KKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7CisJLyogMTI4KDEwNCkgYml0cyBXRVAgKi8KKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IDEzOworCS8qIDI1NiBiaXRzIGZvciBXUEEtUFNLICovCisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMl0gPSAzMjsKKwkvKiA0IGtleXMgYXJlIGFsbG93ZWQgKi8KKwlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDQ7CisKKwkvKiB3ZSBkb24ndCBrbm93IHRoZSBxdWFsaXR5IHJhbmdlLi4uICovCisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsKKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMDsKKwkvKiB0aGVzZSB2YWx1ZSBkZXNjcmliZSBhbiBhdmVyYWdlIHF1YWxpdHkuIE5lZWRzIG1vcmUgdHdlYWtpbmcuLi4gKi8KKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAtODA7CS8qIC04MCBkQm0gKi8KKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOwkvKiBkb24ndCBrbm93IHdoYXQgdG8gcHV0IGhlcmUgKi8KKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDA7CisKKwlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAyMDA7CisKKwkvKiByZXRyeSBsaW1pdCBjYXBhYmlsaXRpZXMgKi8KKwlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTElGRVRJTUU7CisJcmFuZ2UtPnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPnJfdGltZV9mbGFncyA9IElXX1JFVFJZX0xJRkVUSU1FOworCisJLyogSSBkb24ndCBrbm93IHRoZSByYW5nZS4gUHV0IHN0dXBpZCB0aGluZ3MgaGVyZSAqLworCXJhbmdlLT5taW5fcmV0cnkgPSAxOworCXJhbmdlLT5tYXhfcmV0cnkgPSA2NTUzNTsKKwlyYW5nZS0+bWluX3JfdGltZSA9IDEwMjQ7CisJcmFuZ2UtPm1heF9yX3RpbWUgPSA2NTUzNSAqIDEwMjQ7CisKKwkvKiB0eHBvd2VyIGlzIHN1cHBvcnRlZCBpbiBkQm0ncyAqLworCXJhbmdlLT50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19EQk07CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNgorCS8qIEV2ZW50IGNhcGFiaWxpdHkgKGtlcm5lbCArIGRyaXZlcikgKi8KKwlyYW5nZS0+ZXZlbnRfY2FwYVswXSA9IChJV19FVkVOVF9DQVBBX0tfMCB8CisJSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdUSFJTUFkpIHwKKwlJV19FVkVOVF9DQVBBX01BU0soU0lPQ0dJV0FQKSk7CisJcmFuZ2UtPmV2ZW50X2NhcGFbMV0gPSBJV19FVkVOVF9DQVBBX0tfMTsKKwlyYW5nZS0+ZXZlbnRfY2FwYVs0XSA9IElXX0VWRU5UX0NBUEFfTUFTSyhJV0VWQ1VTVE9NKTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNiAqLworCisJaWYgKGlzbHBjaV9nZXRfc3RhdGUocHJpdikgPCBQUlZfU1RBVEVfSU5JVCkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZXF1ZXN0IHRoZSBkZXZpY2UgZm9yIHRoZSBzdXBwb3J0ZWQgZnJlcXVlbmNpZXMKKwkgKiBub3QgcmVhbGx5IHJlbGV2YW50IHNpbmNlIHNvbWUgZGV2aWNlcyB3aWxsIHJlcG9ydCB0aGUgNSBHSHogYmFuZAorCSAqIGZyZXF1ZW5jaWVzIGV2ZW4gaWYgdGhleSBkb24ndCBzdXBwb3J0IHRoZW0uCisJICovCisJcnZhbHVlID0KKwkgICAgbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9TVVBQT1JURURGUkVRVUVOQ0lFUywgMCwgTlVMTCwgJnIpOworCWZyZXEgPSByLnB0cjsKKworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSBmcmVxLT5ucjsKKwlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IGZyZXEtPm5yOworCisJbSA9IG1pbihJV19NQVhfRlJFUVVFTkNJRVMsIChpbnQpIGZyZXEtPm5yKTsKKwlmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7CisJCXJhbmdlLT5mcmVxW2ldLm0gPSBmcmVxLT5taHpbaV07CisJCXJhbmdlLT5mcmVxW2ldLmUgPSA2OworCQlyYW5nZS0+ZnJlcVtpXS5pID0gY2hhbm5lbF9vZl9mcmVxKGZyZXEtPm1oeltpXSk7CisJfQorCWtmcmVlKGZyZXEpOworCisJcnZhbHVlIHw9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfU1VQUE9SVEVEUkFURVMsIDAsIE5VTEwsICZyKTsKKwlkYXRhID0gci5wdHI7CisKKwkvKiBXZSBnb3QgYW4gYXJyYXkgb2YgY2hhci4gSXQgaXMgTlVMTCB0ZXJtaW5hdGVkLiAqLworCWkgPSAwOworCXdoaWxlICgoaSA8IElXX01BWF9CSVRSQVRFUykgJiYgKCpkYXRhICE9IDApKSB7CisJCS8qICAgICAgIHRoZSByZXN1bHQgbXVzdCBiZSBpbiBicHMuIFRoZSBjYXJkIGdpdmVzIHVzIDUwMEticHMgKi8KKwkJcmFuZ2UtPmJpdHJhdGVbaV0gPSAqZGF0YSAqIDUwMDAwMDsKKwkJaSsrOworCQlkYXRhKys7CisJfQorCXJhbmdlLT5udW1fYml0cmF0ZXMgPSBpOworCWtmcmVlKHIucHRyKTsKKworCXJldHVybiBydmFsdWU7Cit9CisKKy8qIFNldCBBUCBhZGRyZXNzKi8KKworc3RhdGljIGludAorcHJpc201NF9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJY2hhciBic3NpZFs2XTsKKwlpbnQgcnZhbHVlOworCisJaWYgKGF3cnEtPnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogcHJlcGFyZSB0aGUgc3RydWN0dXJlIGZvciB0aGUgc2V0IG9iamVjdCAqLworCW1lbWNweSgmYnNzaWRbMF0sIGF3cnEtPnNhX2RhdGEsIDYpOworCisJLyogc2V0IHRoZSBic3NpZCAtLSBkb2VzIHRoaXMgbWFrZSBzZW5zZSB3aGVuIGluIEFQIG1vZGU/ICovCisJcnZhbHVlID0gbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9CU1NJRCwgMCwgJmJzc2lkKTsKKworCXJldHVybiAocnZhbHVlID8gcnZhbHVlIDogLUVJTlBST0dSRVNTKTsJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKiBnZXQgQVAgYWRkcmVzcyovCisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IHNvY2thZGRyICphd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXVuaW9uIG9pZF9yZXNfdCByOworCWludCBydmFsdWU7CisKKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0JTU0lELCAwLCBOVUxMLCAmcik7CisJbWVtY3B5KGF3cnEtPnNhX2RhdGEsIHIucHRyLCA2KTsKKwlhd3JxLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJa2ZyZWUoci5wdHIpOworCisJcmV0dXJuIHJ2YWx1ZTsKK30KKworc3RhdGljIGludAorcHJpc201NF9zZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwkvKiBoZWhlIHRoZSBkZXZpY2UgZG9lcyB0aGlzIGF1dG9tYWdpY2FseSAqLworCXJldHVybiAwOworfQorCisvKiBhIGxpdHRsZSBoZWxwZXIgdGhhdCB3aWxsIHRyYW5zbGF0ZSBvdXIgZGF0YSBpbnRvIGEgY2FyZCBpbmRlcGVuZGVudAorICogZm9ybWF0IHRoYXQgdGhlIFdpcmVsZXNzIFRvb2xzIHdpbGwgdW5kZXJzdGFuZC4gVGhpcyB3YXMgaW5zcGlyZWQgYnkKKyAqIHRoZSAiQWlyb25ldCBkcml2ZXIgZm9yIDQ1MDAgYW5kIDQ4MDAgc2VyaWVzIGNhcmRzIiAoR1BMKQorICovCisKK3N0YXRpYyBjaGFyICoKK3ByaXNtNTRfdHJhbnNsYXRlX2JzcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgY2hhciAqY3VycmVudF9ldiwKKwkJICAgICAgY2hhciAqZW5kX2J1Ziwgc3RydWN0IG9ial9ic3MgKmJzcywgY2hhciBub2lzZSkKK3sKKwlzdHJ1Y3QgaXdfZXZlbnQgaXdlOwkvKiBUZW1wb3JhcnkgYnVmZmVyICovCisJc2hvcnQgY2FwOworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwkvKiBUaGUgZmlyc3QgZW50cnkgbXVzdCBiZSB0aGUgTUFDIGFkZHJlc3MgKi8KKwltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBic3MtPmFkZHJlc3MsIDYpOworCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJY3VycmVudF9ldiA9CisJICAgIGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKworCS8qIFRoZSBmb2xsb3dpbmcgZW50cmllcyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgc2FtZSBvcmRlciB3ZSBnaXZlIHRoZW0gKi8KKworCS8qIFRoZSBFU1NJRC4gKi8KKwlpd2UudS5kYXRhLmxlbmd0aCA9IGJzcy0+c3NpZC5sZW5ndGg7CisJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJICAmaXdlLCBic3MtPnNzaWQub2N0ZXRzKTsKKworCS8qIENhcGFiaWxpdGllcyAqLworI2RlZmluZSBDQVBfRVNTIDB4MDEKKyNkZWZpbmUgQ0FQX0lCU1MgMHgwMgorI2RlZmluZSBDQVBfQ1JZUFQgMHgxMAorCisJLyogTW9kZSAqLworCWNhcCA9IGJzcy0+Y2FwaW5mbzsKKwlpd2UudS5tb2RlID0gMDsKKwlpZiAoY2FwICYgQ0FQX0VTUykKKwkJaXdlLnUubW9kZSA9IElXX01PREVfTUFTVEVSOworCWVsc2UgaWYgKGNhcCAmIENBUF9JQlNTKQorCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BREhPQzsKKwlpd2UuY21kID0gU0lPQ0dJV01PREU7CisJaWYgKGl3ZS51Lm1vZGUpCisJCWN1cnJlbnRfZXYgPQorCQkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJIElXX0VWX1VJTlRfTEVOKTsKKworCS8qIEVuY3J5cHRpb24gY2FwYWJpbGl0eSAqLworCWlmIChjYXAgJiBDQVBfQ1JZUFQpCisJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwllbHNlCisJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJaXdlLnUuZGF0YS5sZW5ndGggPSAwOworCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBOVUxMKTsKKworCS8qIEFkZCBmcmVxdWVuY3kuIChzaG9ydCkgYnNzLT5jaGFubmVsIGlzIHRoZSBmcmVxdWVuY3kgaW4gTUh6ICovCisJaXdlLnUuZnJlcS5tID0gYnNzLT5jaGFubmVsOworCWl3ZS51LmZyZXEuZSA9IDY7CisJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworCWN1cnJlbnRfZXYgPQorCSAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisKKwkvKiBBZGQgcXVhbGl0eSBzdGF0aXN0aWNzICovCisJaXdlLnUucXVhbC5sZXZlbCA9IGJzcy0+cnNzaTsKKwlpd2UudS5xdWFsLm5vaXNlID0gbm9pc2U7CisJLyogZG8gYSBzaW1wbGUgU05SIGZvciBxdWFsaXR5ICovCisJaXdlLnUucXVhbC5xdWFsID0gYnNzLT5yc3NpIC0gbm9pc2U7CisJaXdlLmNtZCA9IElXRVZRVUFMOworCWN1cnJlbnRfZXYgPQorCSAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisKKwlpZiAocHJpdi0+d3BhKSB7CisJCXU4IHdwYV9pZVtNQVhfV1BBX0lFX0xFTl07CisJCWNoYXIgKmJ1ZiwgKnA7CisJCXNpemVfdCB3cGFfaWVfbGVuOworCQlpbnQgaTsKKworCQl3cGFfaWVfbGVuID0gcHJpc201NF93cGFfaWVfZ2V0KHByaXYsIGJzcy0+YWRkcmVzcywgd3BhX2llKTsKKwkJaWYgKHdwYV9pZV9sZW4gPiAwICYmCisJCSAgICAoYnVmID0ga21hbGxvYyh3cGFfaWVfbGVuICogMiArIDEwLCBHRlBfQVRPTUlDKSkpIHsKKwkJCXAgPSBidWY7CisJCQlwICs9IHNwcmludGYocCwgIndwYV9pZT0iKTsKKwkJCWZvciAoaSA9IDA7IGkgPCB3cGFfaWVfbGVuOyBpKyspIHsKKwkJCQlwICs9IHNwcmludGYocCwgIiUwMngiLCB3cGFfaWVbaV0pOworCQkJfQorCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZiAoaXdlKSk7CisJCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisJCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJCQkgICZpd2UsIGJ1Zik7CisJCQlrZnJlZShidWYpOworCQl9CisJfQorCXJldHVybiBjdXJyZW50X2V2OworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCBpLCBydmFsdWU7CisJc3RydWN0IG9ial9ic3NsaXN0ICpic3NsaXN0OworCXUzMiBub2lzZSA9IDA7CisJY2hhciAqY3VycmVudF9ldiA9IGV4dHJhOworCXVuaW9uIG9pZF9yZXNfdCByOworCisJaWYgKGlzbHBjaV9nZXRfc3RhdGUocHJpdikgPCBQUlZfU1RBVEVfSU5JVCkgeworCQkvKiBkZXZpY2UgaXMgbm90IHJlYWR5LCBmYWlsIGdlbnRseSAqLworCQlkd3JxLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBmaXJzdCBnZXQgdGhlIG5vaXNlIHZhbHVlLiBXZSB3aWxsIHVzZSBpdCB0byByZXBvcnQgdGhlIGxpbmsgcXVhbGl0eSAqLworCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfTk9JU0VGTE9PUiwgMCwgTlVMTCwgJnIpOworCW5vaXNlID0gci51OworCisJLyogQXNrIHRoZSBkZXZpY2UgZm9yIGEgbGlzdCBvZiBrbm93biBic3MuCisJKiBUaGUgb2xkIEFQSSwgdXNpbmcgU0lPQ0dJV0FQTElTVCwgaGFkIGEgaGFyZCBsaW1pdCBvZiBJV19NQVhfQVA9NjQuCisJKiBUaGUgbmV3IEFQSSwgdXNpbmcgU0lPQ0dJV1NDQU4sIGlzIG9ubHkgbGltaXRlZCBieSB0aGUgYnVmZmVyIHNpemUuCisJKiBXRS0xNC0+V0UtMTYsIHRoZSBidWZmZXIgaXMgbGltaXRlZCB0byBJV19TQ0FOX01BWF9EQVRBIGJ5dGVzLgorCSogU3RhcnRpbmcgd2l0aCBXRS0xNywgdGhlIGJ1ZmZlciBjYW4gYmUgYXMgYmlnIGFzIG5lZWRlZC4KKwkqIEJ1dCB0aGUgZGV2aWNlIHdvbid0IHJlcHBvcnQgYW55dGhpbmcgaWYgeW91IGNoYW5nZSB0aGUgdmFsdWUKKwkqIG9mIElXTUFYX0JTUz0yNC4gKi8KKwkKKwlydmFsdWUgfD0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9CU1NMSVNULCAwLCBOVUxMLCAmcik7CisJYnNzbGlzdCA9IHIucHRyOworCisJLyogb2sgbm93LCBzY2FuIHRoZSBsaXN0IGFuZCB0cmFuc2xhdGUgaXRzIGluZm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgKGludCkgYnNzbGlzdC0+bnI7IGkrKykgeworCQljdXJyZW50X2V2ID0gcHJpc201NF90cmFuc2xhdGVfYnNzKG5kZXYsIGN1cnJlbnRfZXYsCisJCQkJCQkgICBleHRyYSArIGR3cnEtPmxlbmd0aCwKKwkJCQkJCSAgICYoYnNzbGlzdC0+YnNzbGlzdFtpXSksCisJCQkJCQkgICBub2lzZSk7CisjaWYgV0lSRUxFU1NfRVhUID4gMTYKKwkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgc3BhY2UgZm9yIG9uZSBtb3JlIGVudHJ5ICovCisJCWlmKChleHRyYSArIGR3cnEtPmxlbmd0aCAtIGN1cnJlbnRfZXYpIDw9IElXX0VWX0FERFJfTEVOKSB7CisJCQkvKiBBc2sgdXNlciBzcGFjZSB0byB0cnkgYWdhaW4gd2l0aCBhIGJpZ2dlciBidWZmZXIgKi8KKwkJCXJ2YWx1ZSA9IC1FMkJJRzsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTYgKi8KKwl9CisKKwlrZnJlZShic3NsaXN0KTsKKwlkd3JxLT5sZW5ndGggPSAoY3VycmVudF9ldiAtIGV4dHJhKTsKKwlkd3JxLT5mbGFncyA9IDA7CS8qIHRvZG8gKi8KKworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3Qgb2JqX3NzaWQgZXNzaWQ7CisKKwltZW1zZXQoZXNzaWQub2N0ZXRzLCAwLCAzMyk7CisKKwkvKiBDaGVjayBpZiB3ZSB3ZXJlIGFza2VkIGZvciBgYW55JyAqLworCWlmIChkd3JxLT5mbGFncyAmJiBkd3JxLT5sZW5ndGgpIHsKKwkJaWYgKGR3cnEtPmxlbmd0aCA+IG1pbigzMywgSVdfRVNTSURfTUFYX1NJWkUgKyAxKSkKKwkJCXJldHVybiAtRTJCSUc7CisJCWVzc2lkLmxlbmd0aCA9IGR3cnEtPmxlbmd0aCAtIDE7CisJCW1lbWNweShlc3NpZC5vY3RldHMsIGV4dHJhLCBkd3JxLT5sZW5ndGgpOworCX0gZWxzZQorCQllc3NpZC5sZW5ndGggPSAwOworCisJaWYgKHByaXYtPml3X21vZGUgIT0gSVdfTU9ERV9NT05JVE9SKQorCQlyZXR1cm4gbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9TU0lELCAwLCAmZXNzaWQpOworCisJLyogSWYgaW4gbW9uaXRvciBtb2RlLCBqdXN0IHNhdmUgdG8gbWliICovCisJbWd0X3NldChwcml2LCBET1QxMV9PSURfU1NJRCwgJmVzc2lkKTsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IG9ial9zc2lkICplc3NpZDsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKwlpbnQgcnZhbHVlOworCisJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9TU0lELCAwLCBOVUxMLCAmcik7CisJZXNzaWQgPSByLnB0cjsKKworCWlmIChlc3NpZC0+bGVuZ3RoKSB7CisJCWR3cnEtPmZsYWdzID0gMTsJLyogc2V0IEVTU0lEIHRvIE9OIGZvciBXaXJlbGVzcyBFeHRlbnNpb25zICovCisJCS8qIGlmIGl0IGlzIHRvIGJpZywgdHJ1bmsgaXQgKi8KKwkJZHdycS0+bGVuZ3RoID0gbWluKElXX0VTU0lEX01BWF9TSVpFLCBlc3NpZC0+bGVuZ3RoICsgMSk7CisJfSBlbHNlIHsKKwkJZHdycS0+ZmxhZ3MgPSAwOworCQlkd3JxLT5sZW5ndGggPSAwOworCX0KKwllc3NpZC0+b2N0ZXRzW2Vzc2lkLT5sZW5ndGhdID0gJ1wwJzsKKwltZW1jcHkoZXh0cmEsIGVzc2lkLT5vY3RldHMsIGR3cnEtPmxlbmd0aCk7CisJa2ZyZWUoZXNzaWQpOworCisJcmV0dXJuIHJ2YWx1ZTsKK30KKworLyogUHJvdmlkZXMgbm8gZnVuY3Rpb25hbGl0eSwganVzdCBjb21wbGV0ZXMgdGhlIGlvY3RsLiBJbiBlc3NlbmNlIHRoaXMgaXMgYSAKKyAqIGp1c3QgYSBjb3NtZXRpYyBpb2N0bC4KKyAqLworc3RhdGljIGludAorcHJpc201NF9zZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCWlmIChkd3JxLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKKwkJcmV0dXJuIC1FMkJJRzsKKworCWRvd25fd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCW1lbXNldChwcml2LT5uaWNrbmFtZSwgMCwgc2l6ZW9mIChwcml2LT5uaWNrbmFtZSkpOworCW1lbWNweShwcml2LT5uaWNrbmFtZSwgZXh0cmEsIGR3cnEtPmxlbmd0aCk7CisJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlkd3JxLT5sZW5ndGggPSAwOworCisJZG93bl9yZWFkKCZwcml2LT5taWJfc2VtKTsKKwlkd3JxLT5sZW5ndGggPSBzdHJsZW4ocHJpdi0+bmlja25hbWUpICsgMTsKKwltZW1jcHkoZXh0cmEsIHByaXYtPm5pY2tuYW1lLCBkd3JxLT5sZW5ndGgpOworCXVwX3JlYWQoJnByaXYtPm1pYl9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCB0aGUgYWxsb3dlZCBCaXRyYXRlcyAqLworCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXUzMiByYXRlLCBwcm9maWxlOworCWNoYXIgKmRhdGE7CisJaW50IHJldCwgaTsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKworCWlmICh2d3JxLT52YWx1ZSA9PSAtMSkgeworCQkvKiBhdXRvIG1vZGUuIE5vIGxpbWl0LiAqLworCQlwcm9maWxlID0gMTsKKwkJcmV0dXJuIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUFJPRklMRVMsIDAsICZwcm9maWxlKTsKKwl9CisKKwlyZXQgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1NVUFBPUlRFRFJBVEVTLCAwLCBOVUxMLCAmcik7CisJaWYgKHJldCkgeworCQlrZnJlZShyLnB0cik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmF0ZSA9ICh1MzIpICh2d3JxLT52YWx1ZSAvIDUwMDAwMCk7CisJZGF0YSA9IHIucHRyOworCWkgPSAwOworCisJd2hpbGUgKGRhdGFbaV0pIHsKKwkJaWYgKHJhdGUgJiYgKGRhdGFbaV0gPT0gcmF0ZSkpIHsKKwkJCWJyZWFrOworCQl9CisJCWlmICh2d3JxLT52YWx1ZSA9PSBpKSB7CisJCQlicmVhazsKKwkJfQorCQlkYXRhW2ldIHw9IDB4ODA7CisJCWkrKzsKKwl9CisKKwlpZiAoIWRhdGFbaV0pIHsKKwkJa2ZyZWUoci5wdHIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhW2ldIHw9IDB4ODA7CisJZGF0YVtpICsgMV0gPSAwOworCisJLyogTm93LCBjaGVjayBpZiB3ZSB3YW50IGEgZml4ZWQgb3IgYXV0byB2YWx1ZSAqLworCWlmICh2d3JxLT5maXhlZCkgeworCQlkYXRhWzBdID0gZGF0YVtpXTsKKwkJZGF0YVsxXSA9IDA7CisJfQorCisvKgorCWkgPSAwOworCXByaW50aygicHJpc201NCByYXRlOiAiKTsKKwl3aGlsZShkYXRhW2ldKSB7CisJCXByaW50aygiJXUgIiwgZGF0YVtpXSk7CisJCWkrKzsKKwl9CisJcHJpbnRrKCIwXG4iKTsKKyovCisJcHJvZmlsZSA9IC0xOworCXJldCA9IG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUFJPRklMRVMsIDAsICZwcm9maWxlKTsKKwlyZXQgfD0gbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9FWFRFTkRFRFJBVEVTLCAwLCBkYXRhKTsKKwlyZXQgfD0gbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9SQVRFUywgMCwgZGF0YSk7CisKKwlrZnJlZShyLnB0cik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBHZXQgdGhlIGN1cnJlbnQgYml0IHJhdGUgKi8KK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCBydmFsdWU7CisJY2hhciAqZGF0YTsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKworCS8qIEdldCB0aGUgY3VycmVudCBiaXQgcmF0ZSAqLworCWlmICgocnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIEdFTl9PSURfTElOS1NUQVRFLCAwLCBOVUxMLCAmcikpKQorCQlyZXR1cm4gcnZhbHVlOworCXZ3cnEtPnZhbHVlID0gci51ICogNTAwMDAwOworCisJLyogcmVxdWVzdCB0aGUgZGV2aWNlIGZvciB0aGUgZW5hYmxlZCByYXRlcyAqLworCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUkFURVMsIDAsIE5VTEwsICZyKTsKKwlpZiAocnZhbHVlKSB7CisJCWtmcmVlKHIucHRyKTsKKwkJcmV0dXJuIHJ2YWx1ZTsKKwl9CisJZGF0YSA9IHIucHRyOworCXZ3cnEtPmZpeGVkID0gKGRhdGFbMF0gIT0gMCkgJiYgKGRhdGFbMV0gPT0gMCk7CisJa2ZyZWUoci5wdHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJcmV0dXJuIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUlRTVEhSRVNILCAwLCAmdndycS0+dmFsdWUpOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKwlpbnQgcnZhbHVlOworCisJLyogZ2V0IHRoZSBydHMgdGhyZXNob2xkICovCisJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9SVFNUSFJFU0gsIDAsIE5VTEwsICZyKTsKKwl2d3JxLT52YWx1ZSA9IHIudTsKKworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlyZXR1cm4gbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9GUkFHVEhSRVNILCAwLCAmdndycS0+dmFsdWUpOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXVuaW9uIG9pZF9yZXNfdCByOworCWludCBydmFsdWU7CisKKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0ZSQUdUSFJFU0gsIDAsIE5VTEwsICZyKTsKKwl2d3JxLT52YWx1ZSA9IHIudTsKKworCXJldHVybiBydmFsdWU7Cit9CisKKy8qIEhlcmUgd2UgaGF2ZSAobWluLG1heCkgPSBtYXggcmV0cmllcyBmb3IgKHNtYWxsIGZyYW1lcywgYmlnIGZyYW1lcykuIFdoZXJlCisgKiBiaWcgZnJhbWUgPD0+ICBiaWdnZXIgdGhhbiB0aGUgcnRzIHRocmVzaG9sZAorICogc21hbGwgZnJhbWUgPD0+ICBzbWFsbGVyIHRoYW4gdGhlIHJ0cyB0aHJlc2hvbGQKKyAqIFRoaXMgaXMgbm90IHJlYWxseSB0aGUgYmVoYXZpb3IgZXhwZWN0ZWQgYnkgdGhlIHdpcmVsZXNzIHRvb2wgYnV0IGl0IHNlZW1zCisgKiB0byBiZSBhIGNvbW1vbiBiZWhhdmlvciBpbiBvdGhlciBkcml2ZXJzLgorICovCisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MzIgc2xpbWl0ID0gMCwgbGxpbWl0ID0gMDsJLyogc2hvcnQgYW5kIGxvbmcgbGltaXQgKi8KKwl1MzIgbGlmZXRpbWUgPSAwOworCWludCBydmFsdWUgPSAwOworCisJaWYgKHZ3cnEtPmRpc2FibGVkKQorCQkvKiB3ZSBjYW5ub3QgZGlzYWJsZSB0aGlzIGZlYXR1cmUgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9MSU1JVCkgeworCQlpZiAodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9NSU4pCisJCQlzbGltaXQgPSB2d3JxLT52YWx1ZTsKKwkJZWxzZSBpZiAodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9NQVgpCisJCQlsbGltaXQgPSB2d3JxLT52YWx1ZTsKKwkJZWxzZSB7CisJCQkvKiB3ZSBhcmUgYXNrZWQgdG8gc2V0IGJvdGggKi8KKwkJCXNsaW1pdCA9IHZ3cnEtPnZhbHVlOworCQkJbGxpbWl0ID0gdndycS0+dmFsdWU7CisJCX0KKwl9CisJaWYgKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTElGRVRJTUUpCisJCS8qIFdpcmVsZXNzIHRvb2xzIHVzZSB1cyB1bml0IHdoaWxlIHRoZSBkZXZpY2UgdXNlcyAxMDI0IHVzIHVuaXQgKi8KKwkJbGlmZXRpbWUgPSB2d3JxLT52YWx1ZSAvIDEwMjQ7CisKKwkvKiBub3cgc2V0IHdoYXQgaXMgcmVxdWVzdGVkICovCisJaWYgKHNsaW1pdCkKKwkJcnZhbHVlID0KKwkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfU0hPUlRSRVRSSUVTLCAwLCAmc2xpbWl0KTsKKwlpZiAobGxpbWl0KQorCQlydmFsdWUgfD0KKwkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfTE9OR1JFVFJJRVMsIDAsICZsbGltaXQpOworCWlmIChsaWZldGltZSkKKwkJcnZhbHVlIHw9CisJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX01BWFRYTElGRVRJTUUsIDAsCisJCQkJICAgICZsaWZldGltZSk7CisJcmV0dXJuIHJ2YWx1ZTsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXVuaW9uIG9pZF9yZXNfdCByOworCWludCBydmFsdWUgPSAwOworCXZ3cnEtPmRpc2FibGVkID0gMDsJLyogSXQgY2Fubm90IGJlIGRpc2FibGVkICovCisKKwlpZiAoKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfVFlQRSkgPT0gSVdfUkVUUllfTElGRVRJTUUpIHsKKwkJLyogd2UgYXJlIGFza2VkIGZvciB0aGUgbGlmZSB0aW1lICovCisJCXJ2YWx1ZSA9CisJCSAgICBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX01BWFRYTElGRVRJTUUsIDAsIE5VTEwsICZyKTsKKwkJdndycS0+dmFsdWUgPSByLnUgKiAxMDI0OworCQl2d3JxLT5mbGFncyA9IElXX1JFVFJZX0xJRkVUSU1FOworCX0gZWxzZSBpZiAoKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTUFYKSkgeworCQkvKiB3ZSBhcmUgYXNrZWQgZm9yIHRoZSBsb25nIHJldHJ5IGxpbWl0ICovCisJCXJ2YWx1ZSB8PQorCQkgICAgbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9MT05HUkVUUklFUywgMCwgTlVMTCwgJnIpOworCQl2d3JxLT52YWx1ZSA9IHIudTsKKwkJdndycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX01BWDsKKwl9IGVsc2UgeworCQkvKiBkZWZhdWx0LiBnZXQgdGhlICBzaG9ydCByZXRyeSBsaW1pdCAqLworCQlydmFsdWUgfD0KKwkJICAgIG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfU0hPUlRSRVRSSUVTLCAwLCBOVUxMLCAmcik7CisJCXZ3cnEtPnZhbHVlID0gci51OworCQl2d3JxLT5mbGFncyA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTUlOOworCX0KKworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCBydmFsdWUgPSAwLCBmb3JjZSA9IDA7CisJaW50IGF1dGhlbiA9IERPVDExX0FVVEhfT1MsIGludm9rZSA9IDAsIGV4dW5lbmNyeXB0ID0gMDsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKworCS8qIHdpdGggdGhlIG5ldyBBUEksIGl0J3MgaW1wb3NzaWJsZSB0byBnZXQgYSBOVUxMIHBvaW50ZXIuCisJICogTmV3IHZlcnNpb24gb2YgaXdjb25maWcgc2V0IHRoZSBJV19FTkNPREVfTk9LRVkgZmxhZworCSAqIHdoZW4gbm8ga2V5IGlzIGdpdmVuLCBidXQgb2xkZXIgdmVyc2lvbnMgZG9uJ3QuICovCisKKwlpZiAoZHdycS0+bGVuZ3RoID4gMCkgeworCQkvKiB3ZSBoYXZlIGEga2V5IHRvIHNldCAqLworCQlpbnQgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaW50IGN1cnJlbnRfaW5kZXg7CisJCXN0cnVjdCBvYmpfa2V5IGtleSA9IHsgRE9UMTFfUFJJVl9XRVAsIDAsICIiIH07CisKKwkJLyogZ2V0IHRoZSBjdXJyZW50IGtleSBpbmRleCAqLworCQlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0RFRktFWUlELCAwLCBOVUxMLCAmcik7CisJCWN1cnJlbnRfaW5kZXggPSByLnU7CisJCS8qIFZlcmlmeSB0aGF0IHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCisJCWlmICghKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSkgeworCQkJa2V5Lmxlbmd0aCA9IGR3cnEtPmxlbmd0aCA+IHNpemVvZiAoa2V5LmtleSkgPworCQkJICAgIHNpemVvZiAoa2V5LmtleSkgOiBkd3JxLT5sZW5ndGg7CisJCQltZW1jcHkoa2V5LmtleSwgZXh0cmEsIGtleS5sZW5ndGgpOworCQkJaWYgKGtleS5sZW5ndGggPT0gMzIpCisJCQkJLyogd2Ugd2FudCBXUEEtUFNLICovCisJCQkJa2V5LnR5cGUgPSBET1QxMV9QUklWX1RLSVA7CisJCQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID4gMykpCisJCQkJLyogbm8gaW5kZXggcHJvdmlkZWQgdXNlIHRoZSBjdXJyZW50IG9uZSAqLworCQkJCWluZGV4ID0gY3VycmVudF9pbmRleDsKKworCQkJLyogbm93IHNlbmQgdGhlIGtleSB0byB0aGUgY2FyZCAgKi8KKwkJCXJ2YWx1ZSB8PQorCQkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfREVGS0VZWCwgaW5kZXgsCisJCQkJCSAgICAma2V5KTsKKwkJfQorCQkvKgorCQkgKiBJZiBhIHZhbGlkIGtleSBpcyBzZXQsIGVuY3J5cHRpb24gc2hvdWxkIGJlIGVuYWJsZWQgCisJCSAqICh1c2VyIG1heSB0dXJuIGl0IG9mZiBsYXRlcikuCisJCSAqIFRoaXMgaXMgYWxzbyBob3cgIml3Y29uZmlnIGV0aFgga2V5IG9uIiB3b3JrcworCQkgKi8KKwkJaWYgKChpbmRleCA9PSBjdXJyZW50X2luZGV4KSAmJiAoa2V5Lmxlbmd0aCA+IDApKQorCQkJZm9yY2UgPSAxOworCX0gZWxzZSB7CisJCWludCBpbmRleCA9IChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQlpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8PSAzKSkgeworCQkJLyogd2Ugd2FudCB0byBzZXQgdGhlIGtleSBpbmRleCAqLworCQkJcnZhbHVlIHw9CisJCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9ERUZLRVlJRCwgMCwKKwkJCQkJICAgICZpbmRleCk7CisJCX0gZWxzZSB7CisJCQlpZiAoIWR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHsKKwkJCQkvKiB3ZSBjYW5ub3QgZG8gYW55dGhpbmcuIENvbXBsYWluLiAqLworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCS8qIG5vdyByZWFkIHRoZSBmbGFncyAqLworCWlmIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgeworCQkvKiBFbmNvZGluZyBkaXNhYmxlZCwgCisJCSAqIGF1dGhlbiA9IERPVDExX0FVVEhfT1M7CisJCSAqIGludm9rZSA9IDA7CisJCSAqIGV4dW5lbmNyeXB0ID0gMDsgKi8KKwl9CisJaWYgKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pCisJCS8qIEVuY29kZSBidXQgYWNjZXB0IG5vbi1lbmNvZGVkIHBhY2tldHMuIE5vIGF1dGggKi8KKwkJaW52b2tlID0gMTsKKwlpZiAoKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpIHx8IGZvcmNlKSB7CisJCS8qIFJlZnVzZSBub24tZW5jb2RlZCBwYWNrZXRzLiBBdXRoICovCisJCWF1dGhlbiA9IERPVDExX0FVVEhfQk9USDsKKwkJaW52b2tlID0gMTsKKwkJZXh1bmVuY3J5cHQgPSAxOworCX0KKwkvKiBkbyB0aGUgY2hhbmdlIGlmIHJlcXVlc3RlZCAgKi8KKwlpZiAoKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHx8IGZvcmNlKSB7CisJCXJ2YWx1ZSB8PQorCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9BVVRIRU5BQkxFLCAwLCAmYXV0aGVuKTsKKwkJcnZhbHVlIHw9CisJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1BSSVZBQ1lJTlZPS0VELCAwLCAmaW52b2tlKTsKKwkJcnZhbHVlIHw9CisJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsIDAsCisJCQkJICAgICZleHVuZW5jcnlwdCk7CisJfQorCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBvYmpfa2V5ICprZXk7CisJdTMyIGRldmluZGV4LCBpbmRleCA9IChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCXUzMiBhdXRoZW4gPSAwLCBpbnZva2UgPSAwLCBleHVuZW5jcnlwdCA9IDA7CisJaW50IHJ2YWx1ZTsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKworCS8qIGZpcnN0IGdldCB0aGUgZmxhZ3MgKi8KKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0FVVEhFTkFCTEUsIDAsIE5VTEwsICZyKTsKKwlhdXRoZW4gPSByLnU7CisJcnZhbHVlIHw9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUFJJVkFDWUlOVk9LRUQsIDAsIE5VTEwsICZyKTsKKwlpbnZva2UgPSByLnU7CisJcnZhbHVlIHw9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfRVhVTkVOQ1JZUFRFRCwgMCwgTlVMTCwgJnIpOworCWV4dW5lbmNyeXB0ID0gci51OworCisJaWYgKGludm9rZSAmJiAoYXV0aGVuID09IERPVDExX0FVVEhfQk9USCkgJiYgZXh1bmVuY3J5cHQpCisJCWR3cnEtPmZsYWdzID0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CisJZWxzZSBpZiAoKGF1dGhlbiA9PSBET1QxMV9BVVRIX09TKSAmJiAhZXh1bmVuY3J5cHQpIHsKKwkJaWYgKGludm9rZSkKKwkJCWR3cnEtPmZsYWdzID0gSVdfRU5DT0RFX09QRU47CisJCWVsc2UKKwkJCWR3cnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCX0gZWxzZQorCQkvKiBUaGUgY2FyZCBzaG91bGQgbm90IHdvcmsgaW4gdGhpcyBzdGF0ZSAqLworCQlkd3JxLT5mbGFncyA9IDA7CisKKwkvKiBnZXQgdGhlIGN1cnJlbnQgZGV2aWNlIGtleSBpbmRleCAqLworCXJ2YWx1ZSB8PSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0RFRktFWUlELCAwLCBOVUxMLCAmcik7CisJZGV2aW5kZXggPSByLnU7CisJLyogTm93IGdldCB0aGUga2V5LCByZXR1cm4gaXQgKi8KKwlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID4gMykpCisJCS8qIG5vIGluZGV4IHByb3ZpZGVkLCB1c2UgdGhlIGN1cnJlbnQgb25lICovCisJCWluZGV4ID0gZGV2aW5kZXg7CisJcnZhbHVlIHw9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfREVGS0VZWCwgaW5kZXgsIE5VTEwsICZyKTsKKwlrZXkgPSByLnB0cjsKKwlkd3JxLT5sZW5ndGggPSBrZXktPmxlbmd0aDsKKwltZW1jcHkoZXh0cmEsIGtleS0+a2V5LCBkd3JxLT5sZW5ndGgpOworCWtmcmVlKGtleSk7CisJLyogcmV0dXJuIHRoZSB1c2VkIGtleSBpbmRleCAqLworCWR3cnEtPmZsYWdzIHw9IGRldmluZGV4ICsgMTsKKworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X3R4cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJdW5pb24gb2lkX3Jlc190IHI7CisJaW50IHJ2YWx1ZTsKKworCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBPSURfSU5MX09VVFBVVFBPV0VSLCAwLCBOVUxMLCAmcik7CisJLyogaW50ZXJzaWwgZmlybXdhcmUgb3BlcmF0ZXMgaW4gMC4yNSBkQm0gKDEvNCBkQm0pICovCisJdndycS0+dmFsdWUgPSAoczMyKSByLnUgLyA0OworCXZ3cnEtPmZpeGVkID0gMTsKKwkvKiByYWRpbyBpcyBub3QgdHVybmVkIG9mCisJICogYnR3OiBob3cgaXMgcG9zc2libGUgdG8gdHVybiBvZmYgb25seSB0aGUgcmFkaW8gCisJICovCisJdndycS0+ZGlzYWJsZWQgPSAwOworCisJcmV0dXJuIHJ2YWx1ZTsKK30KKworc3RhdGljIGludAorcHJpc201NF9zZXRfdHhwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzMzIgdSA9IHZ3cnEtPnZhbHVlOworCisJLyogaW50ZXJzaWwgZmlybXdhcmUgb3BlcmF0ZXMgaW4gMC4yNSBkQm0gKDEvNCkgKi8KKwl1ICo9IDQ7CisJaWYgKHZ3cnEtPmRpc2FibGVkKSB7CisJCS8qIGRvbid0IGtub3cgaG93IHRvIGRpc2FibGUgcmFkaW8gKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIlczogJXMoKSBkaXNhYmxpbmcgcmFkaW8gaXMgbm90IHlldCBzdXBwb3J0ZWQuXG4iLAorCQkgICAgICAgcHJpdi0+bmRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9IGVsc2UgaWYgKHZ3cnEtPmZpeGVkKQorCQkvKiBjdXJyZW50bHkgb25seSBmaXhlZCB2YWx1ZSBpcyBzdXBwb3J0ZWQgKi8KKwkJcmV0dXJuIG1ndF9zZXRfcmVxdWVzdChwcml2LCBPSURfSU5MX09VVFBVVFBPV0VSLCAwLCAmdSk7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6ICVzKCkgYXV0byBwb3dlciB3aWxsIGJlIGltcGxlbWVudGVkIGxhdGVyLlxuIiwKKwkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCSAgICAgIF9fdTMyICogdXdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3Jlc2V0KG5ldGRldl9wcml2KG5kZXYpLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9vaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJdW5pb24gb2lkX3Jlc190IHI7CisJaW50IHJ2YWx1ZTsKKwllbnVtIG9pZF9udW1fdCBuID0gZHdycS0+ZmxhZ3M7CisKKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QoKGlzbHBjaV9wcml2YXRlICopIG5kZXYtPnByaXYsIG4sIDAsIE5VTEwsICZyKTsKKwlkd3JxLT5sZW5ndGggPSBtZ3RfcmVzcG9uc2VfdG9fc3RyKG4sICZyLCBleHRyYSk7CisJaWYgKChpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSkgIT0gT0lEX1RZUEVfVTMyKQorCQlrZnJlZShyLnB0cik7CisJcmV0dXJuIHJ2YWx1ZTsKK30KKworc3RhdGljIGludAorcHJpc201NF9zZXRfdTMyKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlfX3UzMiAqIHV3cnEsIGNoYXIgKmV4dHJhKQoreworCXUzMiBvaWQgPSB1d3JxWzBdLCB1ID0gdXdycVsxXTsKKworCXJldHVybiBtZ3Rfc2V0X3JlcXVlc3QoKGlzbHBjaV9wcml2YXRlICopIG5kZXYtPnByaXYsIG9pZCwgMCwgJnUpOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9yYXcoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJdTMyIG9pZCA9IGR3cnEtPmZsYWdzOworCisJcmV0dXJuIG1ndF9zZXRfcmVxdWVzdCgoaXNscGNpX3ByaXZhdGUgKikgbmRldi0+cHJpdiwgb2lkLCAwLCBleHRyYSk7Cit9CisKK3ZvaWQKK3ByaXNtNTRfYWNsX2luaXQoc3RydWN0IGlzbHBjaV9hY2wgKmFjbCkKK3sKKwlzZW1hX2luaXQoJmFjbC0+c2VtLCAxKTsKKwlJTklUX0xJU1RfSEVBRCgmYWNsLT5tYWNfbGlzdCk7CisJYWNsLT5zaXplID0gMDsKKwlhY2wtPnBvbGljeSA9IE1BQ19QT0xJQ1lfT1BFTjsKK30KKworc3RhdGljIHZvaWQKK3ByaXNtNTRfY2xlYXJfbWFjKHN0cnVjdCBpc2xwY2lfYWNsICphY2wpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKKwlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFjbC0+c2VtKSkKKwkJcmV0dXJuOworCisJaWYgKGFjbC0+c2l6ZSA9PSAwKSB7CisJCXVwKCZhY2wtPnNlbSk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKHB0ciA9IGFjbC0+bWFjX2xpc3QubmV4dCwgbmV4dCA9IHB0ci0+bmV4dDsKKwkgICAgIHB0ciAhPSAmYWNsLT5tYWNfbGlzdDsgcHRyID0gbmV4dCwgbmV4dCA9IHB0ci0+bmV4dCkgeworCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWFjX2VudHJ5LCBfbGlzdCk7CisJCWxpc3RfZGVsKHB0cik7CisJCWtmcmVlKGVudHJ5KTsKKwl9CisJYWNsLT5zaXplID0gMDsKKwl1cCgmYWNsLT5zZW0pOworfQorCit2b2lkCitwcmlzbTU0X2FjbF9jbGVhbihzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsKQoreworCXByaXNtNTRfY2xlYXJfbWFjKGFjbCk7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfYWRkX21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IHNvY2thZGRyICphd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBpc2xwY2lfYWNsICphY2wgPSAmcHJpdi0+YWNsOworCXN0cnVjdCBtYWNfZW50cnkgKmVudHJ5OworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgZXh0cmE7CisKKwlpZiAoYWRkci0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJZW50cnkgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IG1hY19lbnRyeSksIEdGUF9LRVJORUwpOworCWlmIChlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweShlbnRyeS0+YWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWNsLT5zZW0pKSB7CisJCWtmcmVlKGVudHJ5KTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJbGlzdF9hZGRfdGFpbCgmZW50cnktPl9saXN0LCAmYWNsLT5tYWNfbGlzdCk7CisJYWNsLT5zaXplKys7CisJdXAoJmFjbC0+c2VtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2RlbF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBzb2NrYWRkciAqYXdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsID0gJnByaXYtPmFjbDsKKwlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSBleHRyYTsKKworCWlmIChhZGRyLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhY2wtPnNlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJZm9yIChwdHIgPSBhY2wtPm1hY19saXN0Lm5leHQ7IHB0ciAhPSAmYWNsLT5tYWNfbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtYWNfZW50cnksIF9saXN0KTsKKworCQlpZiAobWVtY21wKGVudHJ5LT5hZGRyLCBhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTikgPT0gMCkgeworCQkJbGlzdF9kZWwocHRyKTsKKwkJCWFjbC0+c2l6ZS0tOworCQkJa2ZyZWUoZW50cnkpOworCQkJdXAoJmFjbC0+c2VtKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXVwKCZhY2wtPnNlbSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBpc2xwY2lfYWNsICphY2wgPSAmcHJpdi0+YWNsOworCXN0cnVjdCBtYWNfZW50cnkgKmVudHJ5OworCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmRzdCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgZXh0cmE7CisKKwlkd3JxLT5sZW5ndGggPSAwOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWNsLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJZm9yIChwdHIgPSBhY2wtPm1hY19saXN0Lm5leHQ7IHB0ciAhPSAmYWNsLT5tYWNfbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtYWNfZW50cnksIF9saXN0KTsKKworCQltZW1jcHkoZHN0LT5zYV9kYXRhLCBlbnRyeS0+YWRkciwgRVRIX0FMRU4pOworCQlkc3QtPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJZHdycS0+bGVuZ3RoKys7CisJCWRzdCsrOworCX0KKwl1cCgmYWNsLT5zZW0pOworCXJldHVybiAwOworfQorCisvKiBTZXR0aW5nIHBvbGljeSBhbHNvIGNsZWFycyB0aGUgTUFDIGFjbCwgZXZlbiBpZiB3ZSBkb24ndCBjaGFuZ2UgdGhlIGRlZmF1dAorICogcG9saWN5CisgKi8KKworc3RhdGljIGludAorcHJpc201NF9zZXRfcG9saWN5KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBfX3UzMiAqIHV3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGlzbHBjaV9hY2wgKmFjbCA9ICZwcml2LT5hY2w7CisJdTMyIG1sbWVhdXRvbGV2ZWw7CisKKwlwcmlzbTU0X2NsZWFyX21hYyhhY2wpOworCisJaWYgKCgqdXdycSA8IE1BQ19QT0xJQ1lfT1BFTikgfHwgKCp1d3JxID4gTUFDX1BPTElDWV9SRUpFQ1QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd25fd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCisJYWNsLT5wb2xpY3kgPSAqdXdycTsKKworCS8qIHRoZSBBQ0wgY29kZSBuZWVkcyBhbiBpbnRlcm1lZGlhdGUgbWxtZWF1dG9sZXZlbCAqLworCWlmICgocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgJiYKKwkgICAgKGFjbC0+cG9saWN5ICE9IE1BQ19QT0xJQ1lfT1BFTikpCisJCW1sbWVhdXRvbGV2ZWwgPSBET1QxMV9NTE1FX0lOVEVSTUVESUFURTsKKwllbHNlCisJCW1sbWVhdXRvbGV2ZWwgPSBDQVJEX0RFRkFVTFRfTUxNRV9NT0RFOworCWlmIChwcml2LT53cGEpCisJCW1sbWVhdXRvbGV2ZWwgPSBET1QxMV9NTE1FX0VYVEVOREVEOworCW1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX01MTUVBVVRPTEVWRUwsICZtbG1lYXV0b2xldmVsKTsKKwkvKiByZXN0YXJ0IHRoZSBjYXJkIHdpdGggb3VyIG5ldyBwb2xpY3kgKi8KKwlpZiAobWd0X2NvbW1pdChwcml2KSkgeworCQl1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisJCXJldHVybiAtRUlPOworCX0KKwl1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfcG9saWN5KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBfX3UzMiAqIHV3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGlzbHBjaV9hY2wgKmFjbCA9ICZwcml2LT5hY2w7CisKKwkqdXdycSA9IGFjbC0+cG9saWN5OworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiAxIG9ubHkgaWYgY2xpZW50IHNob3VsZCBiZSBhY2NlcHRlZC4gKi8KKworc3RhdGljIGludAorcHJpc201NF9tYWNfYWNjZXB0KHN0cnVjdCBpc2xwY2lfYWNsICphY2wsIGNoYXIgKm1hYykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IG1hY19lbnRyeSAqZW50cnk7CisJaW50IHJlcyA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhY2wtPnNlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlpZiAoYWNsLT5wb2xpY3kgPT0gTUFDX1BPTElDWV9PUEVOKSB7CisJCXVwKCZhY2wtPnNlbSk7CisJCXJldHVybiAxOworCX0KKworCWZvciAocHRyID0gYWNsLT5tYWNfbGlzdC5uZXh0OyBwdHIgIT0gJmFjbC0+bWFjX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgeworCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWFjX2VudHJ5LCBfbGlzdCk7CisJCWlmIChtZW1jbXAoZW50cnktPmFkZHIsIG1hYywgRVRIX0FMRU4pID09IDApIHsKKwkJCXJlcyA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXMgPSAoYWNsLT5wb2xpY3kgPT0gTUFDX1BPTElDWV9BQ0NFUFQpID8gIXJlcyA6IHJlczsKKwl1cCgmYWNsLT5zZW0pOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludAorcHJpc201NF9raWNrX2FsbChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IG9ial9tbG1lICptbG1lOworCWludCBydmFsdWU7CisKKwltbG1lID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBvYmpfbWxtZSksIEdGUF9LRVJORUwpOworCWlmIChtbG1lID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogVGVsbCB0aGUgY2FyZCB0byBraWNrIGV2ZXJ5IGNsaWVudCAqLworCW1sbWUtPmlkID0gMDsKKwlydmFsdWUgPQorCSAgICBtZ3Rfc2V0X3JlcXVlc3QobmV0ZGV2X3ByaXYobmRldiksIERPVDExX09JRF9ESVNBU1NPQ0lBVEUsIDAsIG1sbWUpOworCWtmcmVlKG1sbWUpOworCisJcmV0dXJuIHJ2YWx1ZTsKK30KKworc3RhdGljIGludAorcHJpc201NF9raWNrX21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIHN0cnVjdCBzb2NrYWRkciAqYXdycSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IG9ial9tbG1lICptbG1lOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgZXh0cmE7CisJaW50IHJ2YWx1ZTsKKworCWlmIChhZGRyLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwltbG1lID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBvYmpfbWxtZSksIEdGUF9LRVJORUwpOworCWlmIChtbG1lID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogVGVsbCB0aGUgY2FyZCB0byBvbmx5IGtpY2sgdGhlIGNvcnJlc3BvbmRpbmcgYmFzdGFyZCAqLworCW1lbWNweShtbG1lLT5hZGRyZXNzLCBhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7CisJbWxtZS0+aWQgPSAtMTsKKwlydmFsdWUgPQorCSAgICBtZ3Rfc2V0X3JlcXVlc3QobmV0ZGV2X3ByaXYobmRldiksIERPVDExX09JRF9ESVNBU1NPQ0lBVEUsIDAsIG1sbWUpOworCisJa2ZyZWUobWxtZSk7CisKKwlyZXR1cm4gcnZhbHVlOworfQorCisvKiBUcmFuc2xhdGUgYSBUUkFQIG9pZCBpbnRvIGEgd2lyZWxlc3MgZXZlbnQuIENhbGxlZCBpbiBpc2xwY2lfbWd0X3JlY2VpdmUuICovCisKK3N0YXRpYyB2b2lkCitmb3JtYXRfZXZlbnQoaXNscGNpX3ByaXZhdGUgKnByaXYsIGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnN0ciwKKwkgICAgIGNvbnN0IHN0cnVjdCBvYmpfbWxtZSAqbWxtZSwgdTE2ICpsZW5ndGgsIGludCBlcnJvcikKK3sKKwljb25zdCB1OCAqYSA9IG1sbWUtPmFkZHJlc3M7CisJaW50IG4gPSBzbnByaW50ZihkZXN0LCBJV19DVVNUT01fTUFYLAorCQkJICIlcyAlcyAlMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWCAlcyAoJTIuMlgpIiwKKwkJCSBzdHIsCisJCQkgKChwcml2LT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSA/ICJmcm9tIiA6ICJ0byIpLAorCQkJIGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0sCisJCQkgKGVycm9yID8gKG1sbWUtPmNvZGUgPyAiIDogUkVKRUNURUQgIiA6ICIgOiBBQ0NFUFRFRCAiKQorCQkJICA6ICIiKSwgbWxtZS0+Y29kZSk7CisJQlVHX09OKG4gPiBJV19DVVNUT01fTUFYKTsKKwkqbGVuZ3RoID0gbjsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfZm9ybWF0dGVkX2V2ZW50KGlzbHBjaV9wcml2YXRlICpwcml2LCBjb25zdCBjaGFyICpzdHIsCisJCSAgICAgY29uc3Qgc3RydWN0IG9ial9tbG1lICptbG1lLCBpbnQgZXJyb3IpCit7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCWNoYXIgKm1lbXB0cjsKKworCW1lbXB0ciA9IGttYWxsb2MoSVdfQ1VTVE9NX01BWCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZW1wdHIpCisJCXJldHVybjsKKwl3cnF1LmRhdGEucG9pbnRlciA9IG1lbXB0cjsKKwl3cnF1LmRhdGEubGVuZ3RoID0gMDsKKwlmb3JtYXRfZXZlbnQocHJpdiwgbWVtcHRyLCBzdHIsIG1sbWUsICZ3cnF1LmRhdGEubGVuZ3RoLAorCQkgICAgIGVycm9yKTsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPm5kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBtZW1wdHIpOworCWtmcmVlKG1lbXB0cik7Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX3NpbXBsZV9ldmVudChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgY29uc3QgY2hhciAqc3RyKQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwljaGFyICptZW1wdHI7CisJaW50IG4gPSBzdHJsZW4oc3RyKTsKKworCW1lbXB0ciA9IGttYWxsb2MoSVdfQ1VTVE9NX01BWCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZW1wdHIpCisJCXJldHVybjsKKwlCVUdfT04obiA+IElXX0NVU1RPTV9NQVgpOworCXdycXUuZGF0YS5wb2ludGVyID0gbWVtcHRyOworCXdycXUuZGF0YS5sZW5ndGggPSBuOworCXN0cmNweShtZW1wdHIsIHN0cik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChwcml2LT5uZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgbWVtcHRyKTsKKwlrZnJlZShtZW1wdHIpOworfQorCitzdGF0aWMgdm9pZAorbGlua19jaGFuZ2VkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1MzIgYml0cmF0ZSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJaWYgKGJpdHJhdGUpIHsKKwkJaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgeworCQkJdW5pb24gaXdyZXFfZGF0YSB1d3JxOworCQkJcHJpc201NF9nZXRfd2FwKG5kZXYsIE5VTEwsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnV3cnEsCisJCQkJCU5VTEwpOworCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChuZGV2LCBTSU9DR0lXQVAsICZ1d3JxLCBOVUxMKTsKKwkJfSBlbHNlCisJCQlzZW5kX3NpbXBsZV9ldmVudChuZXRkZXZfcHJpdihuZGV2KSwKKwkJCQkJICAiTGluayBlc3RhYmxpc2hlZCIpOworCX0gZWxzZQorCQlzZW5kX3NpbXBsZV9ldmVudChuZXRkZXZfcHJpdihuZGV2KSwgIkxpbmsgbG9zdCIpOworfQorCisvKiBCZWFjb24vUHJvYmVSZXNwIHBheWxvYWQgaGVhZGVyICovCitzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbl9waGRyIHsKKwl1OCB0aW1lc3RhbXBbOF07CisJdTE2IGJlYWNvbl9pbnQ7CisJdTE2IGNhcGFiX2luZm87Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBXTEFOX0VJRF9HRU5FUklDIDB4ZGQKK3N0YXRpYyB1OCB3cGFfb2lkWzRdID0geyAweDAwLCAweDUwLCAweGYyLCAxIH07CisKKyNkZWZpbmUgTUFDMlNUUihhKSAoYSlbMF0sIChhKVsxXSwgKGEpWzJdLCAoYSlbM10sIChhKVs0XSwgKGEpWzVdCisjZGVmaW5lIE1BQ1NUUiAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiCisKK3N0YXRpYyB2b2lkCitwcmlzbTU0X3dwYV9pZV9hZGQoaXNscGNpX3ByaXZhdGUgKnByaXYsIHU4ICpic3NpZCwKKwkJICAgdTggKndwYV9pZSwgc2l6ZV90IHdwYV9pZV9sZW4pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBpc2xwY2lfYnNzX3dwYV9pZSAqYnNzID0gTlVMTDsKKworCWlmICh3cGFfaWVfbGVuID4gTUFYX1dQQV9JRV9MRU4pCisJCXdwYV9pZV9sZW4gPSBNQVhfV1BBX0lFX0xFTjsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnByaXYtPndwYV9zZW0pKQorCQlyZXR1cm47CisKKwkvKiB0cnkgdG8gdXNlIGV4aXN0aW5nIGVudHJ5ICovCisJbGlzdF9mb3JfZWFjaChwdHIsICZwcml2LT5ic3Nfd3BhX2xpc3QpIHsKKwkJYnNzID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBpc2xwY2lfYnNzX3dwYV9pZSwgbGlzdCk7CisJCWlmIChtZW1jbXAoYnNzLT5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKSA9PSAwKSB7CisJCQlsaXN0X21vdmUoJmJzcy0+bGlzdCwgJnByaXYtPmJzc193cGFfbGlzdCk7CisJCQlicmVhazsKKwkJfQorCQlic3MgPSBOVUxMOworCX0KKworCWlmIChic3MgPT0gTlVMTCkgeworCQkvKiBhZGQgYSBuZXcgQlNTIGVudHJ5OyBpZiBtYXggbnVtYmVyIG9mIGVudHJpZXMgaXMgYWxyZWFkeQorCQkgKiByZWFjaGVkLCByZXBsYWNlIHRoZSBsZWFzdCByZWNlbnRseSB1cGRhdGVkICovCisJCWlmIChwcml2LT5udW1fYnNzX3dwYSA+PSBNQVhfQlNTX1dQQV9JRV9DT1VOVCkgeworCQkJYnNzID0gbGlzdF9lbnRyeShwcml2LT5ic3Nfd3BhX2xpc3QucHJldiwKKwkJCQkJIHN0cnVjdCBpc2xwY2lfYnNzX3dwYV9pZSwgbGlzdCk7CisJCQlsaXN0X2RlbCgmYnNzLT5saXN0KTsKKwkJfSBlbHNlIHsKKwkJCWJzcyA9IGttYWxsb2Moc2l6ZW9mICgqYnNzKSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoYnNzICE9IE5VTEwpIHsKKwkJCQlwcml2LT5udW1fYnNzX3dwYSsrOworCQkJCW1lbXNldChic3MsIDAsIHNpemVvZiAoKmJzcykpOworCQkJfQorCQl9CisJCWlmIChic3MgIT0gTlVMTCkgeworCQkJbWVtY3B5KGJzcy0+YnNzaWQsIGJzc2lkLCBFVEhfQUxFTik7CisJCQlsaXN0X2FkZCgmYnNzLT5saXN0LCAmcHJpdi0+YnNzX3dwYV9saXN0KTsKKwkJfQorCX0KKworCWlmIChic3MgIT0gTlVMTCkgeworCQltZW1jcHkoYnNzLT53cGFfaWUsIHdwYV9pZSwgd3BhX2llX2xlbik7CisJCWJzcy0+d3BhX2llX2xlbiA9IHdwYV9pZV9sZW47CisJCWJzcy0+bGFzdF91cGRhdGUgPSBqaWZmaWVzOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJGYWlsZWQgdG8gYWRkIEJTUyBXUEEgZW50cnkgZm9yICIgTUFDU1RSCisJCSAgICAgICAiXG4iLCBNQUMyU1RSKGJzc2lkKSk7CisJfQorCisJLyogZXhwaXJlIG9sZCBlbnRyaWVzIGZyb20gV1BBIGxpc3QgKi8KKwl3aGlsZSAocHJpdi0+bnVtX2Jzc193cGEgPiAwKSB7CisJCWJzcyA9IGxpc3RfZW50cnkocHJpdi0+YnNzX3dwYV9saXN0LnByZXYsCisJCQkJIHN0cnVjdCBpc2xwY2lfYnNzX3dwYV9pZSwgbGlzdCk7CisJCWlmICghdGltZV9hZnRlcihqaWZmaWVzLCBic3MtPmxhc3RfdXBkYXRlICsgNjAgKiBIWikpCisJCQlicmVhazsKKworCQlsaXN0X2RlbCgmYnNzLT5saXN0KTsKKwkJcHJpdi0+bnVtX2Jzc193cGEtLTsKKwkJa2ZyZWUoYnNzKTsKKwl9CisKKwl1cCgmcHJpdi0+d3BhX3NlbSk7Cit9CisKK3N0YXRpYyBzaXplX3QKK3ByaXNtNTRfd3BhX2llX2dldChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgdTggKmJzc2lkLCB1OCAqd3BhX2llKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKKwlzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUgKmJzcyA9IE5VTEw7CisJc2l6ZV90IGxlbiA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZwcml2LT53cGFfc2VtKSkKKwkJcmV0dXJuIDA7CisKKwlsaXN0X2Zvcl9lYWNoKHB0ciwgJnByaXYtPmJzc193cGFfbGlzdCkgeworCQlic3MgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGlzbHBjaV9ic3Nfd3BhX2llLCBsaXN0KTsKKwkJaWYgKG1lbWNtcChic3MtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pID09IDApCisJCQlicmVhazsKKwkJYnNzID0gTlVMTDsKKwl9CisJaWYgKGJzcykgeworCQlsZW4gPSBic3MtPndwYV9pZV9sZW47CisJCW1lbWNweSh3cGFfaWUsIGJzcy0+d3BhX2llLCBsZW4pOworCX0KKwl1cCgmcHJpdi0+d3BhX3NlbSk7CisKKwlyZXR1cm4gbGVuOworfQorCit2b2lkCitwcmlzbTU0X3dwYV9pZV9pbml0KGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCUlOSVRfTElTVF9IRUFEKCZwcml2LT5ic3Nfd3BhX2xpc3QpOworCXNlbWFfaW5pdCgmcHJpdi0+d3BhX3NlbSwgMSk7Cit9CisKK3ZvaWQKK3ByaXNtNTRfd3BhX2llX2NsZWFuKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuLCAmcHJpdi0+YnNzX3dwYV9saXN0KSB7CisJCXN0cnVjdCBpc2xwY2lfYnNzX3dwYV9pZSAqYnNzOworCQlic3MgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGlzbHBjaV9ic3Nfd3BhX2llLCBsaXN0KTsKKwkJa2ZyZWUoYnNzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmlzbTU0X3Byb2Nlc3NfYnNzX2RhdGEoaXNscGNpX3ByaXZhdGUgKnByaXYsIHUzMiBvaWQsIHU4ICphZGRyLAorCQkJIHU4ICpwYXlsb2FkLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpZWVlODAyMTFfYmVhY29uX3BoZHIgKmhkcjsKKwl1OCAqcG9zLCAqZW5kOworCisJaWYgKCFwcml2LT53cGEpCisJCXJldHVybjsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbl9waGRyICopIHBheWxvYWQ7CisJcG9zID0gKHU4ICopIChoZHIgKyAxKTsKKwllbmQgPSBwYXlsb2FkICsgbGVuOworCXdoaWxlIChwb3MgPCBlbmQpIHsKKwkJaWYgKHBvcyArIDIgKyBwb3NbMV0gPiBlbmQpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJQYXJzaW5nIEJlYWNvbi9Qcm9iZVJlc3AgZmFpbGVkICIKKwkJCSAgICAgICAiZm9yICIgTUFDU1RSICJcbiIsIE1BQzJTVFIoYWRkcikpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChwb3NbMF0gPT0gV0xBTl9FSURfR0VORVJJQyAmJiBwb3NbMV0gPj0gNCAmJgorCQkgICAgbWVtY21wKHBvcyArIDIsIHdwYV9vaWQsIDQpID09IDApIHsKKwkJCXByaXNtNTRfd3BhX2llX2FkZChwcml2LCBhZGRyLCBwb3MsIHBvc1sxXSArIDIpOworCQkJcmV0dXJuOworCQl9CisJCXBvcyArPSAyICsgcG9zWzFdOworCX0KK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9yZXF1ZXN0KGlzbHBjaV9wcml2YXRlICpwcml2LCBzdHJ1Y3Qgb2JqX21sbWUgKm1sbWUsIGVudW0gb2lkX251bV90IG9pZCkKK3sKKwlpZiAoKChtbG1lLT5zdGF0ZSA9PSBET1QxMV9TVEFURV9BVVRISU5HKSB8fAorCSAgICAgKG1sbWUtPnN0YXRlID09IERPVDExX1NUQVRFX0FTU09DSU5HKSkKKwkgICAgJiYgbWd0X21sbWVfYW5zd2VyKHByaXYpKSB7CisJCS8qIFNvbWVvbmUgaXMgcmVxdWVzdGluZyBhdXRoIGFuZCB3ZSBtdXN0IHJlc3BvbmQuIEp1c3Qgc2VuZCBiYWNrCisJCSAqIHRoZSB0cmFwIHdpdGggZXJyb3IgY29kZSBzZXQgYWNjb3JkaW5nbHkuCisJCSAqLworCQltbG1lLT5jb2RlID0gcHJpc201NF9tYWNfYWNjZXB0KCZwcml2LT5hY2wsCisJCQkJCQltbG1lLT5hZGRyZXNzKSA/IDAgOiAxOworCQltZ3Rfc2V0X3JlcXVlc3QocHJpdiwgb2lkLCAwLCBtbG1lKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfcHJvY2Vzc190cmFwX2hlbHBlcihpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgZW51bSBvaWRfbnVtX3Qgb2lkLAorCQkJICAgIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IG9ial9tbG1lICptbG1lID0gKHN0cnVjdCBvYmpfbWxtZSAqKSBkYXRhOworCXN0cnVjdCBvYmpfbWxtZWV4ICptbG1lZXggPSAoc3RydWN0IG9ial9tbG1lZXggKikgZGF0YTsKKwlzdHJ1Y3Qgb2JqX21sbWVleCAqY29uZmlybTsKKwl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOworCWludCB3cGFfaWVfbGVuOworCXNpemVfdCBsZW4gPSAwOyAvKiB1MTYsIGJldHRlcj8gKi8KKwl1OCAqcGF5bG9hZCA9IE5VTEwsICpwb3MgPSBOVUxMOworCWludCByZXQ7CisKKwkvKiBJIHRoaW5rIGFsbCB0cmFwYWJsZSBvYmplY3RzIGFyZSBsaXN0ZWQgaGVyZS4KKwkgKiBTb21lIG9pZHMgaGF2ZSBhIEVYIHZlcnNpb24uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhleSBhcmUgZW1pdHRlZAorCSAqIGluIERPVDExX01MTUVfRVhURU5ERUQgbW9kZSAoc2V0IHdpdGggRE9UMTFfT0lEX01MTUVBVVRPTEVWRUwpCisJICogd2l0aCBtb3JlIGluZm8uCisJICogVGhlIGZldyBldmVudHMgYWxyZWFkeSBkZWZpbmVkIGJ5IHRoZSB3aXJlbGVzcyB0b29scyBhcmUgbm90IHJlYWxseQorCSAqIHN1aXRlZC4gV2UgdXNlIHRoZSBtb3JlIGZsZXhpYmxlIGN1c3RvbSBldmVudCBmYWNpbGl0eS4KKwkgKi8KKworCWlmIChvaWQgPj0gRE9UMTFfT0lEX0JFQUNPTikgeworCQlsZW4gPSBtbG1lZXgtPnNpemU7CisJCXBheWxvYWQgPSBwb3MgPSBtbG1lZXgtPmRhdGE7CisJfQorCisJLyogSSBmZWFyIHByaXNtNTRfcHJvY2Vzc19ic3NfZGF0YSB3b24ndCB3b3JrIHdpdGggYmlnIGVuZGlhbiBkYXRhICovCisJaWYgKChvaWQgPT0gRE9UMTFfT0lEX0JFQUNPTikgfHwgKG9pZCA9PSBET1QxMV9PSURfUFJPQkUpKQorCQlwcmlzbTU0X3Byb2Nlc3NfYnNzX2RhdGEocHJpdiwgb2lkLCBtbG1lZXgtPmFkZHJlc3MsCisJCQkJCSBwYXlsb2FkLCBsZW4pOworCisJbWd0X2xlX3RvX2NwdShpc2xfb2lkW29pZF0uZmxhZ3MgJiBPSURfRkxBR19UWVBFLCAodm9pZCAqKSBtbG1lKTsKKworCXN3aXRjaCAob2lkKSB7CisKKwljYXNlIEdFTl9PSURfTElOS1NUQVRFOgorCQlsaW5rX2NoYW5nZWQocHJpdi0+bmRldiwgKHUzMikgKmRhdGEpOworCQlicmVhazsKKworCWNhc2UgRE9UMTFfT0lEX01JQ0ZBSUxVUkU6CisJCXNlbmRfc2ltcGxlX2V2ZW50KHByaXYsICJNaWMgZmFpbHVyZSIpOworCQlicmVhazsKKworCWNhc2UgRE9UMTFfT0lEX0RFQVVUSEVOVElDQVRFOgorCQlzZW5kX2Zvcm1hdHRlZF9ldmVudChwcml2LCAiRGVBdXRoZW50aWNhdGUgcmVxdWVzdCIsIG1sbWUsIDApOworCQlicmVhazsKKworCWNhc2UgRE9UMTFfT0lEX0FVVEhFTlRJQ0FURToKKwkJaGFuZGxlX3JlcXVlc3QocHJpdiwgbWxtZSwgb2lkKTsKKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIkF1dGhlbnRpY2F0ZSByZXF1ZXN0IiwgbWxtZSwgMSk7CisJCWJyZWFrOworCisJY2FzZSBET1QxMV9PSURfRElTQVNTT0NJQVRFOgorCQlzZW5kX2Zvcm1hdHRlZF9ldmVudChwcml2LCAiRGlzYXNzb2NpYXRlIHJlcXVlc3QiLCBtbG1lLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9BU1NPQ0lBVEU6CisJCWhhbmRsZV9yZXF1ZXN0KHByaXYsIG1sbWUsIG9pZCk7CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJBc3NvY2lhdGUgcmVxdWVzdCIsIG1sbWUsIDEpOworCQlicmVhazsKKworCWNhc2UgRE9UMTFfT0lEX1JFQVNTT0NJQVRFOgorCQloYW5kbGVfcmVxdWVzdChwcml2LCBtbG1lLCBvaWQpOworCQlzZW5kX2Zvcm1hdHRlZF9ldmVudChwcml2LCAiUmVBc3NvY2lhdGUgcmVxdWVzdCIsIG1sbWUsIDEpOworCQlicmVhazsKKworCWNhc2UgRE9UMTFfT0lEX0JFQUNPTjoKKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwKKwkJCQkgICAgICJSZWNlaXZlZCBhIGJlYWNvbiBmcm9tIGFuIHVua293biBBUCIsCisJCQkJICAgICBtbG1lLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9QUk9CRToKKwkJLyogd2UgcmVjZWl2ZWQgYSBwcm9iZSBmcm9tIGEgY2xpZW50LiAqLworCQlzZW5kX2Zvcm1hdHRlZF9ldmVudChwcml2LCAiUmVjZWl2ZWQgYSBwcm9iZSBmcm9tIGNsaWVudCIsIG1sbWUsCisJCQkJICAgICAwKTsKKwkJYnJlYWs7CisKKwkJLyogTm90ZSA6ICJtbG1lIiBpcyBhY3R1YWxseSBhICJzdHJ1Y3Qgb2JqX21sbWVleCAqIiBoZXJlLCBidXQgdGhpcworCQkgKiBpcyBiYWNrd2FyZCBjb21wYXRpYmxlIGxheW91dC13aXNlIHdpdGggInN0cnVjdCBvYmpfbWxtZSIuCisJCSAqLworCisJY2FzZSBET1QxMV9PSURfREVBVVRIRU5USUNBVEVFWDoKKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIkRlQXV0aGVudGljYXRlIHJlcXVlc3QiLCBtbG1lLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9BVVRIRU5USUNBVEVFWDoKKwkJaGFuZGxlX3JlcXVlc3QocHJpdiwgbWxtZSwgb2lkKTsKKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIkF1dGhlbnRpY2F0ZSByZXF1ZXN0IChleCkiLCBtbG1lLCAxKTsKKworCQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUiAKKwkJCQkmJiBtbG1lZXgtPnN0YXRlICE9IERPVDExX1NUQVRFX0FVVEhJTkcpCisJCQlicmVhazsKKworCQljb25maXJtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9ial9tbG1lZXgpICsgNiwgR0ZQX0FUT01JQyk7CisKKwkJaWYgKCFjb25maXJtKSAKKwkJCWJyZWFrOworCisJCW1lbWNweSgmY29uZmlybS0+YWRkcmVzcywgbWxtZWV4LT5hZGRyZXNzLCBFVEhfQUxFTik7CisJCXByaW50ayhLRVJOX0RFQlVHICJBdXRoZW50aWNhdGUgZnJvbTogYWRkcmVzczpcdCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCAKKwkJCQltbG1lZXgtPmFkZHJlc3NbMF0sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzFdLAorCQkJCW1sbWVleC0+YWRkcmVzc1syXSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbM10sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzRdLAorCQkJCW1sbWVleC0+YWRkcmVzc1s1XQorCQkJCSk7CisJCWNvbmZpcm0tPmlkID0gLTE7IC8qIG9yIG1sbWVleC0+aWQgPyAqLworCQljb25maXJtLT5zdGF0ZSA9IDA7IC8qIG5vdCB1c2VkICovCisJCWNvbmZpcm0tPmNvZGUgPSAwOworCQljb25maXJtLT5zaXplID0gNjsKKwkJY29uZmlybS0+ZGF0YVswXSA9IDB4MDA7CisJCWNvbmZpcm0tPmRhdGFbMV0gPSAweDAwOworCQljb25maXJtLT5kYXRhWzJdID0gMHgwMjsKKwkJY29uZmlybS0+ZGF0YVszXSA9IDB4MDA7CisJCWNvbmZpcm0tPmRhdGFbNF0gPSAweDAwOworCQljb25maXJtLT5kYXRhWzVdID0gMHgwMDsKKworCQlyZXQgPSBtZ3Rfc2V0X3Zhcmxlbihwcml2LCBET1QxMV9PSURfQVNTT0NJQVRFRVgsIGNvbmZpcm0sIDYpOworCisJCWtmcmVlKGNvbmZpcm0pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9ESVNBU1NPQ0lBVEVFWDoKKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIkRpc2Fzc29jaWF0ZSByZXF1ZXN0IChleCkiLCBtbG1lLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9BU1NPQ0lBVEVFWDoKKwkJaGFuZGxlX3JlcXVlc3QocHJpdiwgbWxtZSwgb2lkKTsKKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIkFzc29jaWF0ZSByZXF1ZXN0IChleCkiLCBtbG1lLCAxKTsKKworCQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUiAKKwkJCQkmJiBtbG1lZXgtPnN0YXRlICE9IERPVDExX1NUQVRFX0FVVEhJTkcpCisJCQlicmVhazsKKwkJCisJCWNvbmZpcm0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb2JqX21sbWVleCksIEdGUF9BVE9NSUMpOworCisJCWlmICghY29uZmlybSkKKwkJCWJyZWFrOworCisJCW1lbWNweSgmY29uZmlybS0+YWRkcmVzcywgbWxtZWV4LT5hZGRyZXNzLCBFVEhfQUxFTik7CisKKwkJY29uZmlybS0+aWQgPSAoKHN0cnVjdCBvYmpfbWxtZWV4ICopbWxtZSktPmlkOworCQljb25maXJtLT5zdGF0ZSA9IDA7IC8qIG5vdCB1c2VkICovCisJCWNvbmZpcm0tPmNvZGUgPSAwOworCisJCXdwYV9pZV9sZW4gPSBwcmlzbTU0X3dwYV9pZV9nZXQocHJpdiwgbWxtZWV4LT5hZGRyZXNzLCB3cGFfaWUpOworCisJCWlmICghd3BhX2llX2xlbikgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIk5vIFdQQSBJRSBmb3VuZCBmcm9tICIKKwkJCQkJImFkZHJlc3M6XHQlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgCisJCQkJbWxtZWV4LT5hZGRyZXNzWzBdLAorCQkJCW1sbWVleC0+YWRkcmVzc1sxXSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbMl0sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzNdLAorCQkJCW1sbWVleC0+YWRkcmVzc1s0XSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbNV0KKwkJCQkpOworCQkJa2ZyZWUoY29uZmlybSk7CisJCQlicmVhazsKKwkJfQorCisJCWNvbmZpcm0tPnNpemUgPSB3cGFfaWVfbGVuOworCQltZW1jcHkoJmNvbmZpcm0tPmRhdGEsIHdwYV9pZSwgd3BhX2llX2xlbik7CisKKwkJbWd0X3NldF92YXJsZW4ocHJpdiwgb2lkLCBjb25maXJtLCB3cGFfaWVfbGVuKTsKKworCQlrZnJlZShjb25maXJtKTsKKwkJCisJCWJyZWFrOworCisJY2FzZSBET1QxMV9PSURfUkVBU1NPQ0lBVEVFWDoKKwkJaGFuZGxlX3JlcXVlc3QocHJpdiwgbWxtZSwgb2lkKTsKKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIlJlYXNzb2NpYXRlIHJlcXVlc3QgKGV4KSIsIG1sbWUsIDEpOworCisJCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfTUFTVEVSIAorCQkJCSYmIG1sbWVleC0+c3RhdGUgIT0gRE9UMTFfU1RBVEVfQVNTT0NJTkcpCisJCQlicmVhazsKKworCQljb25maXJtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9ial9tbG1lZXgpLCBHRlBfQVRPTUlDKTsKKworCQlpZiAoIWNvbmZpcm0pCisJCQlicmVhazsKKworCQltZW1jcHkoJmNvbmZpcm0tPmFkZHJlc3MsIG1sbWVleC0+YWRkcmVzcywgRVRIX0FMRU4pOworCisJCWNvbmZpcm0tPmlkID0gbWxtZWV4LT5pZDsKKwkJY29uZmlybS0+c3RhdGUgPSAwOyAvKiBub3QgdXNlZCAqLworCQljb25maXJtLT5jb2RlID0gMDsKKworCQl3cGFfaWVfbGVuID0gcHJpc201NF93cGFfaWVfZ2V0KHByaXYsIG1sbWVleC0+YWRkcmVzcywgd3BhX2llKTsKKworCQlpZiAoIXdwYV9pZV9sZW4pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJObyBXUEEgSUUgZm91bmQgZnJvbSAiCisJCQkJCSJhZGRyZXNzOlx0JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIAorCQkJCW1sbWVleC0+YWRkcmVzc1swXSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbMV0sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzJdLAorCQkJCW1sbWVleC0+YWRkcmVzc1szXSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbNF0sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzVdCisJCQkJKTsKKwkJCWtmcmVlKGNvbmZpcm0pOworCQkJYnJlYWs7CisJCX0KKworCQljb25maXJtLT5zaXplID0gd3BhX2llX2xlbjsgCisJCW1lbWNweSgmY29uZmlybS0+ZGF0YSwgd3BhX2llLCB3cGFfaWVfbGVuKTsKKworCQltZ3Rfc2V0X3Zhcmxlbihwcml2LCBvaWQsIGNvbmZpcm0sIHdwYV9pZV9sZW4pOworCisJCWtmcmVlKGNvbmZpcm0pOworCQkKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByb2Nlc3MgYSBkZXZpY2UgdHJhcC4gIFRoaXMgaXMgY2FsbGVkIHZpYSBzY2hlZHVsZV93b3JrKCksIG91dHNpZGUgb2YKKyAqIGludGVycnVwdCBjb250ZXh0LCBubyBsb2NrcyBoZWxkLgorICovCit2b2lkCitwcmlzbTU0X3Byb2Nlc3NfdHJhcCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpmcmFtZSA9IGRhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBmcmFtZS0+bmRldjsKKwllbnVtIG9pZF9udW1fdCBuID0gbWd0X29pZHRvbnVtKGZyYW1lLT5oZWFkZXItPm9pZCk7CisKKwlpZiAobiAhPSBPSURfTlVNX0xBU1QpCisJCXByaXNtNTRfcHJvY2Vzc190cmFwX2hlbHBlcihuZXRkZXZfcHJpdihuZGV2KSwgbiwgZnJhbWUtPmRhdGEpOworCWlzbHBjaV9tZ3RfcmVsZWFzZShmcmFtZSk7Cit9CisKK2ludAorcHJpc201NF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmFkZHIpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKG5kZXYtPmFkZHJfbGVuICE9IDYpCisJCXJldHVybiAtRUlOVkFMOworCXJldCA9IG1ndF9zZXRfcmVxdWVzdChwcml2LCBHRU5fT0lEX01BQ0FERFJFU1MsIDAsCisJCQkgICAgICAmKChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkciktPnNhX2RhdGEpOworCWlmICghcmV0KQorCQltZW1jcHkocHJpdi0+bmRldi0+ZGV2X2FkZHIsCisJCSAgICAgICAmKChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkciktPnNhX2RhdGEsIDYpOworCisJcmV0dXJuIHJldDsKK30KKworLyogTm90ZTogY3VycmVudGx5LCB1c2UgaG9zdGFwZCBpb2N0bCBmcm9tIHRoZSBIb3N0IEFQIGRyaXZlciBmb3IgV1BBCisgKiBzdXBwb3J0LiBUaGlzIGlzIHRvIGJlIHJlcGxhY2VkIHdpdGggTGludXggd2lyZWxlc3MgZXh0ZW5zaW9ucyBvbmNlIHRoZXkKKyAqIGdldCBXUEEgc3VwcG9ydC4gKi8KKworLyogTm90ZSBJSTogcGxlYXNlIGxlYXZlIGFsbCB0aGlzIHRvZ2V0aGVyIGFzIGl0IHdpbGwgYmUgZWFzaWVyIHRvIHJlbW92ZSBsYXRlciwKKyAqIG9uY2Ugd2lyZWxlc3MgZXh0ZW5zaW9ucyBhZGQgV1BBIHN1cHBvcnQgLW1jZ3JvZiAqLworCisvKiBQUklTTTU0X0hPU1RBUEQgaW9jdGwoKSBjbWQ6ICovCitlbnVtIHsKKwlQUklTTTJfU0VUX0VOQ1JZUFRJT04gPSA2LAorCVBSSVNNMl9IT1NUQVBEX1NFVF9HRU5FUklDX0VMRU1FTlQgPSAxMiwKKwlQUklTTTJfSE9TVEFQRF9NTE1FID0gMTMsCisJUFJJU00yX0hPU1RBUERfU0NBTl9SRVEgPSAxNCwKK307CisKKyNkZWZpbmUgUFJJU001NF9TRVRfV1BBCQkJU0lPQ0lXRklSU1RQUklWKzEyCisjZGVmaW5lIFBSSVNNNTRfSE9TVEFQRAkJCVNJT0NJV0ZJUlNUUFJJVisyNQorI2RlZmluZSBQUklTTTU0X0RST1BfVU5FTkNSWVBURUQJU0lPQ0lXRklSU1RQUklWKzI2CisKKyNkZWZpbmUgUFJJU00yX0hPU1RBUERfTUFYX0JVRl9TSVpFIDEwMjQKKyNkZWZpbmUgUFJJU00yX0hPU1RBUERfR0VORVJJQ19FTEVNRU5UX0hEUl9MRU4gXAorKChpbnQpICgmKChzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKikgMCktPnUuZ2VuZXJpY19lbGVtLmRhdGEpKQorCisvKiBNYXhpbXVtIGxlbmd0aCBmb3IgYWxnb3JpdGhtIG5hbWVzICgtMSBmb3IgbnVsIHRlcm1pbmF0aW9uKSAKKyAqIHVzZWQgaW4gaW9jdGwoKSAqLworI2RlZmluZSBIT1NUQVBfQ1JZUFRfQUxHX05BTUVfTEVOIDE2CisJCitzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0geworCXUzMiBjbWQ7CisJdTggc3RhX2FkZHJbRVRIX0FMRU5dOworCXVuaW9uIHsKKwkgICAgICAgc3RydWN0IHsKKwkJICAgICAgIHU4IGFsZ1tIT1NUQVBfQ1JZUFRfQUxHX05BTUVfTEVOXTsKKwkJICAgICAgIHUzMiBmbGFnczsKKwkJICAgICAgIHUzMiBlcnI7CisJCSAgICAgICB1OCBpZHg7CisJCSAgICAgICB1OCBzZXFbOF07IC8qIHNlcXVlbmNlIGNvdW50ZXIgKHNldDogUlgsIGdldDogVFgpICovCisJCSAgICAgICB1MTYga2V5X2xlbjsKKwkJICAgICAgIHU4IGtleVswXTsKKwkJICAgICAgIH0gY3J5cHQ7CisgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICB1OCBsZW47CisgICAgICAgICAgICAgICAgICAgICAgIHU4IGRhdGFbMF07CisgICAgICAgICAgICAgICB9IGdlbmVyaWNfZWxlbTsKKyAgICAgICAgICAgICAgIHN0cnVjdCB7CisjZGVmaW5lIE1MTUVfU1RBX0RFQVVUSCAwCisjZGVmaW5lIE1MTUVfU1RBX0RJU0FTU09DIDEKKyAgICAgICAgICAgICAgICAgICAgICAgdTE2IGNtZDsKKyAgICAgICAgICAgICAgICAgICAgICAgdTE2IHJlYXNvbl9jb2RlOworICAgICAgICAgICAgICAgfSBtbG1lOworICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgdTggc3NpZF9sZW47CisgICAgICAgICAgICAgICAgICAgICAgIHU4IHNzaWRbMzJdOworICAgICAgICAgICAgICAgfSBzY2FuX3JlcTsKKyAgICAgICB9IHU7Cit9OworCisKK3N0YXRpYyBpbnQKK3ByaXNtMl9pb2N0bF9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0sCisJaW50IHBhcmFtX2xlbikKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJ2YWx1ZSA9IDAsIGZvcmNlID0gMDsKKwlpbnQgYXV0aGVuID0gRE9UMTFfQVVUSF9PUywgaW52b2tlID0gMCwgZXh1bmVuY3J5cHQgPSAwOworCXVuaW9uIG9pZF9yZXNfdCByOworCisJLyogd2l0aCB0aGUgbmV3IEFQSSwgaXQncyBpbXBvc3NpYmxlIHRvIGdldCBhIE5VTEwgcG9pbnRlci4KKwkgKiBOZXcgdmVyc2lvbiBvZiBpd2NvbmZpZyBzZXQgdGhlIElXX0VOQ09ERV9OT0tFWSBmbGFnCisJICogd2hlbiBubyBrZXkgaXMgZ2l2ZW4sIGJ1dCBvbGRlciB2ZXJzaW9ucyBkb24ndC4gKi8KKworCWlmIChwYXJhbS0+dS5jcnlwdC5rZXlfbGVuID4gMCkgeworCQkvKiB3ZSBoYXZlIGEga2V5IHRvIHNldCAqLworCQlpbnQgaW5kZXggPSBwYXJhbS0+dS5jcnlwdC5pZHg7CisJCWludCBjdXJyZW50X2luZGV4OworCQlzdHJ1Y3Qgb2JqX2tleSBrZXkgPSB7IERPVDExX1BSSVZfVEtJUCwgMCwgIiIgfTsKKworCQkvKiBnZXQgdGhlIGN1cnJlbnQga2V5IGluZGV4ICovCisJCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfREVGS0VZSUQsIDAsIE5VTEwsICZyKTsKKwkJY3VycmVudF9pbmRleCA9IHIudTsKKwkJLyogVmVyaWZ5IHRoYXQgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KKwkJaWYgKCEocGFyYW0tPnUuY3J5cHQuZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpKSB7CisJCQlrZXkubGVuZ3RoID0gcGFyYW0tPnUuY3J5cHQua2V5X2xlbiA+IHNpemVvZiAocGFyYW0tPnUuY3J5cHQua2V5KSA/CisJCQkgICAgc2l6ZW9mIChwYXJhbS0+dS5jcnlwdC5rZXkpIDogcGFyYW0tPnUuY3J5cHQua2V5X2xlbjsKKwkJCW1lbWNweShrZXkua2V5LCBwYXJhbS0+dS5jcnlwdC5rZXksIGtleS5sZW5ndGgpOworCQkJaWYgKGtleS5sZW5ndGggPT0gMzIpCisJCQkJLyogd2Ugd2FudCBXUEEtUFNLICovCisJCQkJa2V5LnR5cGUgPSBET1QxMV9QUklWX1RLSVA7CisJCQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID4gMykpCisJCQkJLyogbm8gaW5kZXggcHJvdmlkZWQgdXNlIHRoZSBjdXJyZW50IG9uZSAqLworCQkJCWluZGV4ID0gY3VycmVudF9pbmRleDsKKworCQkJLyogbm93IHNlbmQgdGhlIGtleSB0byB0aGUgY2FyZCAgKi8KKwkJCXJ2YWx1ZSB8PQorCQkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfREVGS0VZWCwgaW5kZXgsCisJCQkJCSAgICAma2V5KTsKKwkJfQorCQkvKgorCQkgKiBJZiBhIHZhbGlkIGtleSBpcyBzZXQsIGVuY3J5cHRpb24gc2hvdWxkIGJlIGVuYWJsZWQgCisJCSAqICh1c2VyIG1heSB0dXJuIGl0IG9mZiBsYXRlcikuCisJCSAqIFRoaXMgaXMgYWxzbyBob3cgIml3Y29uZmlnIGV0aFgga2V5IG9uIiB3b3JrcworCQkgKi8KKwkJaWYgKChpbmRleCA9PSBjdXJyZW50X2luZGV4KSAmJiAoa2V5Lmxlbmd0aCA+IDApKQorCQkJZm9yY2UgPSAxOworCX0gZWxzZSB7CisJCWludCBpbmRleCA9IChwYXJhbS0+dS5jcnlwdC5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQlpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8PSAzKSkgeworCQkJLyogd2Ugd2FudCB0byBzZXQgdGhlIGtleSBpbmRleCAqLworCQkJcnZhbHVlIHw9CisJCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9ERUZLRVlJRCwgMCwKKwkJCQkJICAgICZpbmRleCk7CisJCX0gZWxzZSB7CisJCQlpZiAoIXBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHsKKwkJCQkvKiB3ZSBjYW5ub3QgZG8gYW55dGhpbmcuIENvbXBsYWluLiAqLworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCS8qIG5vdyByZWFkIHRoZSBmbGFncyAqLworCWlmIChwYXJhbS0+dS5jcnlwdC5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgeworCQkvKiBFbmNvZGluZyBkaXNhYmxlZCwgCisJCSAqIGF1dGhlbiA9IERPVDExX0FVVEhfT1M7CisJCSAqIGludm9rZSA9IDA7CisJCSAqIGV4dW5lbmNyeXB0ID0gMDsgKi8KKwl9CisJaWYgKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX09QRU4pCisJCS8qIEVuY29kZSBidXQgYWNjZXB0IG5vbi1lbmNvZGVkIHBhY2tldHMuIE5vIGF1dGggKi8KKwkJaW52b2tlID0gMTsKKwlpZiAoKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpIHx8IGZvcmNlKSB7CisJCS8qIFJlZnVzZSBub24tZW5jb2RlZCBwYWNrZXRzLiBBdXRoICovCisJCWF1dGhlbiA9IERPVDExX0FVVEhfQk9USDsKKwkJaW52b2tlID0gMTsKKwkJZXh1bmVuY3J5cHQgPSAxOworCX0KKwkvKiBkbyB0aGUgY2hhbmdlIGlmIHJlcXVlc3RlZCAgKi8KKwlpZiAoKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHx8IGZvcmNlKSB7CisJCXJ2YWx1ZSB8PQorCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9BVVRIRU5BQkxFLCAwLCAmYXV0aGVuKTsKKwkJcnZhbHVlIHw9CisJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1BSSVZBQ1lJTlZPS0VELCAwLCAmaW52b2tlKTsKKwkJcnZhbHVlIHw9CisJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsIDAsCisJCQkJICAgICZleHVuZW5jcnlwdCk7CisJfQorCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtMl9pb2N0bF9zZXRfZ2VuZXJpY19lbGVtZW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCXN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0sCisJaW50IHBhcmFtX2xlbikKK3sKKyAgICAgICBpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworICAgICAgIGludCBtYXhfbGVuLCBsZW4sIGFsZW4sIHJldD0wOworICAgICAgIHN0cnVjdCBvYmpfYXR0YWNobWVudCAqYXR0YWNoOworCisgICAgICAgbGVuID0gcGFyYW0tPnUuZ2VuZXJpY19lbGVtLmxlbjsKKyAgICAgICBtYXhfbGVuID0gcGFyYW1fbGVuIC0gUFJJU00yX0hPU1RBUERfR0VORVJJQ19FTEVNRU5UX0hEUl9MRU47CisgICAgICAgaWYgKG1heF9sZW4gPCAwIHx8IG1heF9sZW4gPCBsZW4pCisgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgIGFsZW4gPSBzaXplb2YoKmF0dGFjaCkgKyBsZW47CisgICAgICAgYXR0YWNoID0ga21hbGxvYyhhbGVuLCBHRlBfS0VSTkVMKTsKKyAgICAgICBpZiAoYXR0YWNoID09IE5VTEwpCisgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgICAgIG1lbXNldChhdHRhY2gsIDAsIGFsZW4pOworI2RlZmluZSBXTEFOX0ZDX1RZUEVfTUdNVCAwCisjZGVmaW5lIFdMQU5fRkNfU1RZUEVfQVNTT0NfUkVRIDAKKyNkZWZpbmUgV0xBTl9GQ19TVFlQRV9SRUFTU09DX1JFUSAyCisKKyAgICAgICAvKiBOb3RlOiBlbmRpYW5uZXNzIGlzIGNvdmVyZWQgYnkgbWd0X3NldF92YXJsZW4gKi8KKworICAgICAgIGF0dGFjaC0+dHlwZSA9IChXTEFOX0ZDX1RZUEVfTUdNVCA8PCAyKSB8CisgICAgICAgICAgICAgICAoV0xBTl9GQ19TVFlQRV9BU1NPQ19SRVEgPDwgNCk7CisgICAgICAgYXR0YWNoLT5pZCA9IC0xOworICAgICAgIGF0dGFjaC0+c2l6ZSA9IGxlbjsKKyAgICAgICBtZW1jcHkoYXR0YWNoLT5kYXRhLCBwYXJhbS0+dS5nZW5lcmljX2VsZW0uZGF0YSwgbGVuKTsKKworICAgICAgIHJldCA9IG1ndF9zZXRfdmFybGVuKHByaXYsIERPVDExX09JRF9BVFRBQ0hNRU5ULCBhdHRhY2gsIGxlbik7CisKKyAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgICAgIGF0dGFjaC0+dHlwZSA9IChXTEFOX0ZDX1RZUEVfTUdNVCA8PCAyKSB8CisgICAgICAgICAgICAgICAgICAgICAgIChXTEFOX0ZDX1NUWVBFX1JFQVNTT0NfUkVRIDw8IDQpOworCisJICAgICAgIHJldCA9IG1ndF9zZXRfdmFybGVuKHByaXYsIERPVDExX09JRF9BVFRBQ0hNRU5ULCBhdHRhY2gsIGxlbik7CisKKwkgICAgICAgaWYgKHJldCA9PSAwKSAKKwkJICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogV1BBIElFIEF0dGFjaG1lbnQgd2FzIHNldFxuIiwKKwkJCQkgICAgICAgbmRldi0+bmFtZSk7CisgICAgICAgfQorCisgICAgICAga2ZyZWUoYXR0YWNoKTsKKyAgICAgICByZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBpbnQKK3ByaXNtMl9pb2N0bF9tbG1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0pCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW50CitwcmlzbTJfaW9jdGxfc2Nhbl9yZXEoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IGksIHJ2YWx1ZTsKKwlzdHJ1Y3Qgb2JqX2Jzc2xpc3QgKmJzc2xpc3Q7CisJdTMyIG5vaXNlID0gMDsKKwljaGFyICpleHRyYSA9ICIiOworCWNoYXIgKmN1cnJlbnRfZXYgPSAiZm9vIjsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpIDwgUFJWX1NUQVRFX0lOSVQpIHsKKwkJLyogZGV2aWNlIGlzIG5vdCByZWFkeSwgZmFpbCBnZW50bHkgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyogZmlyc3QgZ2V0IHRoZSBub2lzZSB2YWx1ZS4gV2Ugd2lsbCB1c2UgaXQgdG8gcmVwb3J0IHRoZSBsaW5rIHF1YWxpdHkgKi8KKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX05PSVNFRkxPT1IsIDAsIE5VTEwsICZyKTsKKwlub2lzZSA9IHIudTsKKworCS8qIEFzayB0aGUgZGV2aWNlIGZvciBhIGxpc3Qgb2Yga25vd24gYnNzLiBXZSBjYW4gcmVwb3J0IGF0IG1vc3QKKwkgKiBJV19NQVhfQVA9NjQgdG8gdGhlIHJhbmdlIHN0cnVjdC4gQnV0IHRoZSBkZXZpY2Ugd29uJ3QgcmVwcG9ydCBhbnl0aGluZworCSAqIGlmIHlvdSBjaGFuZ2UgdGhlIHZhbHVlIG9mIElXTUFYX0JTUz0yNC4KKwkgKi8KKwlydmFsdWUgfD0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9CU1NMSVNULCAwLCBOVUxMLCAmcik7CisJYnNzbGlzdCA9IHIucHRyOworCisJLyogb2sgbm93LCBzY2FuIHRoZSBsaXN0IGFuZCB0cmFuc2xhdGUgaXRzIGluZm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWluKElXX01BWF9BUCwgKGludCkgYnNzbGlzdC0+bnIpOyBpKyspCisJCWN1cnJlbnRfZXYgPSBwcmlzbTU0X3RyYW5zbGF0ZV9ic3MobmRldiwgY3VycmVudF9ldiwKKwkJCQkJCSAgIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwKKwkJCQkJCSAgICYoYnNzbGlzdC0+YnNzbGlzdFtpXSksCisJCQkJCQkgICBub2lzZSk7CisJa2ZyZWUoYnNzbGlzdCk7CisKKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2hvc3RhcGQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19wb2ludCAqcCkKK3sKKyAgICAgICBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtOworICAgICAgIGludCByZXQgPSAwOworICAgICAgIHUzMiB1d3JxOworCisgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgInByaXNtNTRfaG9zdGFwZCAtIGxlbj0lZFxuIiwgcC0+bGVuZ3RoKTsKKyAgICAgICBpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSkgfHwKKyAgICAgICAgICAgcC0+bGVuZ3RoID4gUFJJU00yX0hPU1RBUERfTUFYX0JVRl9TSVpFIHx8ICFwLT5wb2ludGVyKQorICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICBwYXJhbSA9IChzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKikga21hbGxvYyhwLT5sZW5ndGgsIEdGUF9LRVJORUwpOworICAgICAgIGlmIChwYXJhbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisKKyAgICAgICBpZiAoY29weV9mcm9tX3VzZXIocGFyYW0sIHAtPnBvaW50ZXIsIHAtPmxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgIGtmcmVlKHBhcmFtKTsKKyAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgIH0KKworICAgICAgIHN3aXRjaCAocGFyYW0tPmNtZCkgeworICAgICAgIGNhc2UgUFJJU00yX1NFVF9FTkNSWVBUSU9OOgorCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgc3VwcGxpY2FudCBzZXQgZW5jcnlwdGlvbiByZXF1ZXN0XG4iLAorCQkJICAgICAgIG5kZXYtPm5hbWUpOworICAgICAgICAgICAgICAgcmV0ID0gcHJpc20yX2lvY3RsX3NldF9lbmNyeXB0aW9uKG5kZXYsIHBhcmFtLCBwLT5sZW5ndGgpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBQUklTTTJfSE9TVEFQRF9TRVRfR0VORVJJQ19FTEVNRU5UOgorCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgc3VwcGxpY2FudCBzZXQgV1BBIElFIHJlcXVlc3RcbiIsCisJCQkgICAgICAgbmRldi0+bmFtZSk7CisgICAgICAgICAgICAgICByZXQgPSBwcmlzbTJfaW9jdGxfc2V0X2dlbmVyaWNfZWxlbWVudChuZGV2LCBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmxlbmd0aCk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIFBSSVNNMl9IT1NUQVBEX01MTUU6CisJICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogQ2F1Z2h0IFdQQSBzdXBwbGljYW50IE1MTUUgcmVxdWVzdFxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgIHJldCA9IHByaXNtMl9pb2N0bF9tbG1lKG5kZXYsIHBhcmFtKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgUFJJU00yX0hPU1RBUERfU0NBTl9SRVE6CisJICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogQ2F1Z2h0IFdQQSBzdXBwbGljYW50IHNjYW4gcmVxdWVzdFxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgIHJldCA9IHByaXNtMl9pb2N0bF9zY2FuX3JlcShuZGV2LCBwYXJhbSk7CisgICAgICAgICAgICAgICBicmVhazsKKwljYXNlIFBSSVNNNTRfU0VUX1dQQToKKwkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDYXVnaHQgV1BBIHN1cHBsaWNhbnQgd3BhIGluaXQgcmVxdWVzdFxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkgICAgICAgdXdycSA9IDE7CisJICAgICAgIHJldCA9IHByaXNtNTRfc2V0X3dwYShuZGV2LCBOVUxMLCAmdXdycSwgTlVMTCk7CisJICAgICAgIGJyZWFrOworCWNhc2UgUFJJU001NF9EUk9QX1VORU5DUllQVEVEOgorCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgZHJvcCB1bmVuY3J5cHRlZCByZXF1ZXN0XG4iLAorCQkJICAgICAgIG5kZXYtPm5hbWUpOworI2lmIDAKKwkgICAgICAgdXdycSA9IDB4MDE7CisJICAgICAgIG1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsICZ1d3JxKTsKKwkgICAgICAgZG93bl93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisJICAgICAgIG1ndF9jb21taXQocHJpdik7CisJICAgICAgIHVwX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKyNlbmRpZgorCSAgICAgICAvKiBOb3QgbmVjZXNzYXJ5LCBhcyBzZXRfd3BhIGRvZXMgaXQsIHNob3VsZCB3ZSBqdXN0IGRvIGl0IGhlcmUgdGhvdWdoPyAqLworCSAgICAgICByZXQgPSAwOworCSAgICAgICBicmVhazsKKyAgICAgICBkZWZhdWx0OgorCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBhIFdQQSBzdXBwbGljYW50IHJlcXVlc3QgdGhhdCBpcyBub3Qgc3VwcG9ydGVkXG4iLAorCQkJICAgICAgIG5kZXYtPm5hbWUpOworICAgICAgICAgICAgICAgcmV0ID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKyAgICAgICBpZiAocmV0ID09IDAgJiYgY29weV90b191c2VyKHAtPnBvaW50ZXIsIHBhcmFtLCBwLT5sZW5ndGgpKQorICAgICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKKworICAgICAgIGtmcmVlKHBhcmFtKTsKKworICAgICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3dwYShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXUzMiBtbG1lLCBhdXRoZW4sIGRvdDF4LCBmaWx0ZXIsIHdlcDsKKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpIDwgUFJWX1NUQVRFX0lOSVQpCisJCXJldHVybiAwOworCisJd2VwID0gMTsgLyogRm9yIHByaXZhY3kgaW52b2tlZCAqLworCWZpbHRlciA9IDE7IC8qIEZpbHRlciBvdXQgYWxsIHVuZW5jcnlwdGVkIGZyYW1lcyAqLworCWRvdDF4ID0gMHgwMTsgLyogVG8gZW5hYmxlIGVhcCBmaWx0ZXIgKi8KKwltbG1lID0gRE9UMTFfTUxNRV9FWFRFTkRFRDsKKwlhdXRoZW4gPSBET1QxMV9BVVRIX09TOyAvKiBPbmx5IFdFUCB1c2VzIF9TSyBhbmQgX0JPVEggKi8KKworCWRvd25fd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCXByaXYtPndwYSA9ICp1d3JxOworCisJc3dpdGNoIChwcml2LT53cGEpIHsKKwkJZGVmYXVsdDoKKwkJY2FzZSAwOiAvKiBDbGVhcnMvZGlzYWJsZXMgV1BBIGFuZCBmcmllbmRzICovCisJCQl3ZXAgPSAwOworCQkJZmlsdGVyID0gMDsgLyogRG8gbm90IGZpbHRlciB1bi1lbmNyeXB0ZWQgZGF0YSAqLworCQkJZG90MXggPSAwOworCQkJbWxtZSA9IERPVDExX01MTUVfQVVUTzsKKwkJCXByaW50aygiJXM6IERpc2FibGluZyBXUEFcbiIsIG5kZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMjogCisJCWNhc2UgMTogLyogV1BBICovCisJCQlwcmludGsoIiVzOiBFbmFibGluZyBXUEFcbiIsIG5kZXYtPm5hbWUpOworCQkJYnJlYWs7CisJfQorCXVwX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKworCW1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQVVUSEVOQUJMRSwgMCwgJmF1dGhlbik7CisJbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9QUklWQUNZSU5WT0tFRCwgMCwgJndlcCk7CisJbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9FWFVORU5DUllQVEVELCAwLCAmZmlsdGVyKTsKKwltZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0RPVDFYRU5BQkxFLCAwLCAmZG90MXgpOworCW1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfTUxNRUFVVE9MRVZFTCwgMCwgJm1sbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X3dwYShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCSp1d3JxID0gcHJpdi0+d3BhOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9wcmlzbWhkcihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICBfX3UzMiAqIHV3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJcHJpdi0+bW9uaXRvcl90eXBlID0KKwkgICAgKCp1d3JxID8gQVJQSFJEX0lFRUU4MDIxMV9QUklTTSA6IEFSUEhSRF9JRUVFODAyMTEpOworCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJcHJpdi0+bmRldi0+dHlwZSA9IHByaXYtPm1vbml0b3JfdHlwZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9wcmlzbWhkcihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICBfX3UzMiAqIHV3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJKnV3cnEgPSAocHJpdi0+bW9uaXRvcl90eXBlID09IEFSUEhSRF9JRUVFODAyMTFfUFJJU00pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2RlYnVnX29pZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICBfX3UzMiAqIHV3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlwcml2LT5wcml2X29pZCA9ICp1d3JxOworCXByaW50aygiJXM6IG9pZCAweCUwOFhcbiIsIG5kZXYtPm5hbWUsICp1d3JxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2RlYnVnX2dldF9vaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqcmVzcG9uc2U7CisJaW50IHJldCA9IC1FSU87CisKKwlwcmludGsoIiVzOiBnZXRfb2lkIDB4JTA4WFxuIiwgbmRldi0+bmFtZSwgcHJpdi0+cHJpdl9vaWQpOworCWRhdGEtPmxlbmd0aCA9IDA7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfSU5JVCkgeworCQlyZXQgPQorCQkgICAgaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfR0VULAorCQkJCQkgICBwcml2LT5wcml2X29pZCwgZXh0cmEsIDI1NiwKKwkJCQkJICAgJnJlc3BvbnNlKTsKKwkJcHJpbnRrKCIlczogcmV0OiAlaVxuIiwgbmRldi0+bmFtZSwgcmV0KTsKKwkJaWYgKHJldCB8fCAhcmVzcG9uc2UKKwkJICAgIHx8IHJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbiA9PSBQSU1GT1JfT1BfRVJST1IpIHsKKwkJCWlmIChyZXNwb25zZSkgeworCQkJCWlzbHBjaV9tZ3RfcmVsZWFzZShyZXNwb25zZSk7CisJCQl9CisJCQlwcmludGsoIiVzOiBFSU9cbiIsIG5kZXYtPm5hbWUpOworCQkJcmV0ID0gLUVJTzsKKwkJfQorCQlpZiAoIXJldCkgeworCQkJZGF0YS0+bGVuZ3RoID0gcmVzcG9uc2UtPmhlYWRlci0+bGVuZ3RoOworCQkJbWVtY3B5KGV4dHJhLCByZXNwb25zZS0+ZGF0YSwgZGF0YS0+bGVuZ3RoKTsKKwkJCWlzbHBjaV9tZ3RfcmVsZWFzZShyZXNwb25zZSk7CisJCQlwcmludGsoIiVzOiBsZW46ICVpXG4iLCBuZGV2LT5uYW1lLCBkYXRhLT5sZW5ndGgpOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorcHJpc201NF9kZWJ1Z19zZXRfb2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKnJlc3BvbnNlOworCWludCByZXQgPSAwLCByZXNwb25zZV9vcCA9IFBJTUZPUl9PUF9FUlJPUjsKKworCXByaW50aygiJXM6IHNldF9vaWQgMHglMDhYXHRsZW46ICVkXG4iLCBuZGV2LT5uYW1lLCBwcml2LT5wcml2X29pZCwKKwkgICAgICAgZGF0YS0+bGVuZ3RoKTsKKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpID49IFBSVl9TVEFURV9JTklUKSB7CisJCXJldCA9CisJCSAgICBpc2xwY2lfbWd0X3RyYW5zYWN0aW9uKHByaXYtPm5kZXYsIFBJTUZPUl9PUF9TRVQsCisJCQkJCSAgIHByaXYtPnByaXZfb2lkLCBleHRyYSwgZGF0YS0+bGVuZ3RoLAorCQkJCQkgICAmcmVzcG9uc2UpOworCQlwcmludGsoIiVzOiByZXQ6ICVpXG4iLCBuZGV2LT5uYW1lLCByZXQpOworCQlpZiAocmV0IHx8ICFyZXNwb25zZQorCQkgICAgfHwgcmVzcG9uc2UtPmhlYWRlci0+b3BlcmF0aW9uID09IFBJTUZPUl9PUF9FUlJPUikgeworCQkJaWYgKHJlc3BvbnNlKSB7CisJCQkJaXNscGNpX21ndF9yZWxlYXNlKHJlc3BvbnNlKTsKKwkJCX0KKwkJCXByaW50aygiJXM6IEVJT1xuIiwgbmRldi0+bmFtZSk7CisJCQlyZXQgPSAtRUlPOworCQl9CisJCWlmICghcmV0KSB7CisJCQlyZXNwb25zZV9vcCA9IHJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbjsKKwkJCXByaW50aygiJXM6IHJlc3BvbnNlX29wOiAlaVxuIiwgbmRldi0+bmFtZSwKKwkJCSAgICAgICByZXNwb25zZV9vcCk7CisJCQlpc2xwY2lfbWd0X3JlbGVhc2UocmVzcG9uc2UpOworCQl9CisJfQorCisJcmV0dXJuIChyZXQgPyByZXQgOiAtRUlOUFJPR1JFU1MpOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9zcHkoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXVuaW9uIGl3cmVxX2RhdGEgKnV3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJdTMyIHUsIG9pZCA9IE9JRF9JTkxfQ09ORklHOworCisJZG93bl93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisJbWd0X2dldChwcml2LCBPSURfSU5MX0NPTkZJRywgJnUpOworCisJaWYgKCh1d3JxLT5kYXRhLmxlbmd0aCA9PSAwKSAmJiAocHJpdi0+c3B5X2RhdGEuc3B5X251bWJlciA+IDApKQorCQkvKiBkaXNhYmxlIHNweSAqLworCQl1ICY9IH5JTkxfQ09ORklHX1JYQU5ORVg7CisJZWxzZSBpZiAoKHV3cnEtPmRhdGEubGVuZ3RoID4gMCkgJiYgKHByaXYtPnNweV9kYXRhLnNweV9udW1iZXIgPT0gMCkpCisJCS8qIGVuYWJsZSBzcHkgKi8KKwkJdSB8PSBJTkxfQ09ORklHX1JYQU5ORVg7CisKKwltZ3Rfc2V0KHByaXYsIE9JRF9JTkxfQ09ORklHLCAmdSk7CisJbWd0X2NvbW1pdF9saXN0KHByaXYsICZvaWQsIDEpOworCXVwX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKworCXJldHVybiBpd19oYW5kbGVyX3NldF9zcHkobmRldiwgaW5mbywgdXdycSwgZXh0cmEpOworfQorCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBwcmlzbTU0X2hhbmRsZXJbXSA9IHsKKwkoaXdfaGFuZGxlcikgcHJpc201NF9jb21taXQsCS8qIFNJT0NTSVdDT01NSVQgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfbmFtZSwJLyogU0lPQ0dJV05BTUUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV05XSUQgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ0dJV05XSUQgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfZnJlcSwJLyogU0lPQ1NJV0ZSRVEgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfZnJlcSwJLyogU0lPQ0dJV0ZSRVEgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfbW9kZSwJLyogU0lPQ1NJV01PREUgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfbW9kZSwJLyogU0lPQ0dJV01PREUgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfc2VucywJLyogU0lPQ1NJV1NFTlMgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfc2VucywJLyogU0lPQ0dJV1NFTlMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1JBTkdFICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X3JhbmdlLAkvKiBTSU9DR0lXUkFOR0UgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1BSSVYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ0dJV1BSSVYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1NUQVRTICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdTVEFUUyAqLworCXByaXNtNTRfc2V0X3NweSwJLyogU0lPQ1NJV1NQWSAqLworCWl3X2hhbmRsZXJfZ2V0X3NweSwJLyogU0lPQ0dJV1NQWSAqLworCWl3X2hhbmRsZXJfc2V0X3RocnNweSwJLyogU0lPQ1NJV1RIUlNQWSAqLworCWl3X2hhbmRsZXJfZ2V0X3RocnNweSwJLyogU0lPQ0dJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF93YXAsCS8qIFNJT0NTSVdBUCAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF93YXAsCS8qIFNJT0NHSVdBUCAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdBUExJU1QgZGVwcmVjaWF0ZWQgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfc2NhbiwJLyogU0lPQ1NJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfc2NhbiwJLyogU0lPQ0dJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfZXNzaWQsCS8qIFNJT0NTSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF9lc3NpZCwJLyogU0lPQ0dJV0VTU0lEICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X25pY2ssCS8qIFNJT0NTSVdOSUNLTiAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF9uaWNrLAkvKiBTSU9DR0lXTklDS04gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3JhdGUsCS8qIFNJT0NTSVdSQVRFICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X3JhdGUsCS8qIFNJT0NHSVdSQVRFICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3J0cywJLyogU0lPQ1NJV1JUUyAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF9ydHMsCS8qIFNJT0NHSVdSVFMgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfZnJhZywJLyogU0lPQ1NJV0ZSQUcgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfZnJhZywJLyogU0lPQ0dJV0ZSQUcgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfdHhwb3dlciwJLyogU0lPQ1NJV1RYUE9XICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X3R4cG93ZXIsCS8qIFNJT0NHSVdUWFBPVyAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF9yZXRyeSwJLyogU0lPQ1NJV1JFVFJZICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X3JldHJ5LAkvKiBTSU9DR0lXUkVUUlkgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfZW5jb2RlLAkvKiBTSU9DU0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X2VuY29kZSwJLyogU0lPQ0dJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXUE9XRVIgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ0dJV1BPV0VSICovCit9OworCisvKiBUaGUgbG93IG9yZGVyIGJpdCBpZGVudGlmeSBhIFNFVCAoMCkgb3IgYSBHRVQgKDEpIGlvY3RsLiAgKi8KKworI2RlZmluZSBQUklTTTU0X1JFU0VUCQlTSU9DSVdGSVJTVFBSSVYKKyNkZWZpbmUgUFJJU001NF9HRVRfUE9MSUNZCVNJT0NJV0ZJUlNUUFJJVisxCisjZGVmaW5lIFBSSVNNNTRfU0VUX1BPTElDWQlTSU9DSVdGSVJTVFBSSVYrMgorI2RlZmluZSBQUklTTTU0X0dFVF9NQUMJCVNJT0NJV0ZJUlNUUFJJViszCisjZGVmaW5lIFBSSVNNNTRfQUREX01BQwkJU0lPQ0lXRklSU1RQUklWKzQKKworI2RlZmluZSBQUklTTTU0X0RFTF9NQUMJCVNJT0NJV0ZJUlNUUFJJVis2CisKKyNkZWZpbmUgUFJJU001NF9LSUNLX01BQwlTSU9DSVdGSVJTVFBSSVYrOAorCisjZGVmaW5lIFBSSVNNNTRfS0lDS19BTEwJU0lPQ0lXRklSU1RQUklWKzEwCisKKyNkZWZpbmUgUFJJU001NF9HRVRfV1BBCQlTSU9DSVdGSVJTVFBSSVYrMTEKKyNkZWZpbmUgUFJJU001NF9TRVRfV1BBCQlTSU9DSVdGSVJTVFBSSVYrMTIKKworI2RlZmluZSBQUklTTTU0X0RCR19PSUQJCVNJT0NJV0ZJUlNUUFJJVisxNAorI2RlZmluZSBQUklTTTU0X0RCR19HRVRfT0lECVNJT0NJV0ZJUlNUUFJJVisxNQorI2RlZmluZSBQUklTTTU0X0RCR19TRVRfT0lECVNJT0NJV0ZJUlNUUFJJVisxNgorCisjZGVmaW5lIFBSSVNNNTRfR0VUX09JRAkJU0lPQ0lXRklSU1RQUklWKzE3CisjZGVmaW5lIFBSSVNNNTRfU0VUX09JRF9VMzIJU0lPQ0lXRklSU1RQUklWKzE4CisjZGVmaW5lCVBSSVNNNTRfU0VUX09JRF9TVFIJU0lPQ0lXRklSU1RQUklWKzIwCisjZGVmaW5lCVBSSVNNNTRfU0VUX09JRF9BRERSCVNJT0NJV0ZJUlNUUFJJVisyMgorCisjZGVmaW5lIFBSSVNNNTRfR0VUX1BSSVNNSERSCVNJT0NJV0ZJUlNUUFJJVisyMworI2RlZmluZSBQUklTTTU0X1NFVF9QUklTTUhEUglTSU9DSVdGSVJTVFBSSVYrMjQKKworI2RlZmluZSBJV1BSSVZfU0VUX1UzMihuLHgpCXsgbiwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzXyJ4IH0KKyNkZWZpbmUgSVdQUklWX1NFVF9TU0lEKG4seCkJeyBuLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzXyJ4IH0KKyNkZWZpbmUgSVdQUklWX1NFVF9BRERSKG4seCkJeyBuLCBJV19QUklWX1RZUEVfQUREUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzXyJ4IH0KKyNkZWZpbmUgSVdQUklWX0dFVChuLHgpCXsgbiwgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCBQUklWX1NUUl9TSVpFLCAiZ18ieCB9CisKKyNkZWZpbmUgSVdQUklWX1UzMihuLHgpCQlJV1BSSVZfU0VUX1UzMihuLHgpLCBJV1BSSVZfR0VUKG4seCkKKyNkZWZpbmUgSVdQUklWX1NTSUQobix4KQlJV1BSSVZfU0VUX1NTSUQobix4KSwgSVdQUklWX0dFVChuLHgpCisjZGVmaW5lIElXUFJJVl9BRERSKG4seCkJSVdQUklWX1NFVF9BRERSKG4seCksIElXUFJJVl9HRVQobix4KQorCisvKiBOb3RlIDogbGltaXRlZCB0byAxMjggcHJpdmF0ZSBpb2N0bHMgKHdpcmVsZXNzIHRvb2xzIDI2KSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyBwcmlzbTU0X3ByaXZhdGVfYXJnc1tdID0geworLyp7IGNtZCwgc2V0X2FyZ3MsIGdldF9hcmdzLCBuYW1lIH0gKi8KKwl7UFJJU001NF9SRVNFVCwgMCwgMCwgInJlc2V0In0sCisJe1BSSVNNNTRfR0VUX1BSSVNNSERSLCAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9wcmlzbWhkciJ9LAorCXtQUklTTTU0X1NFVF9QUklTTUhEUiwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsCisJICJzZXRfcHJpc21oZHIifSwKKwl7UFJJU001NF9HRVRfUE9MSUNZLCAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldFBvbGljeSJ9LAorCXtQUklTTTU0X1NFVF9QT0xJQ1ksIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLAorCSAic2V0UG9saWN5In0sCisJe1BSSVNNNTRfR0VUX01BQywgMCwgSVdfUFJJVl9UWVBFX0FERFIgfCA2NCwgImdldE1hYyJ9LAorCXtQUklTTTU0X0FERF9NQUMsIElXX1BSSVZfVFlQRV9BRERSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwKKwkgImFkZE1hYyJ9LAorCXtQUklTTTU0X0RFTF9NQUMsIElXX1BSSVZfVFlQRV9BRERSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwKKwkgImRlbE1hYyJ9LAorCXtQUklTTTU0X0tJQ0tfTUFDLCBJV19QUklWX1RZUEVfQUREUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsCisJICJraWNrTWFjIn0sCisJe1BSSVNNNTRfS0lDS19BTEwsIDAsIDAsICJraWNrQWxsIn0sCisJe1BSSVNNNTRfR0VUX1dQQSwgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfd3BhIn0sCisJe1BSSVNNNTRfU0VUX1dQQSwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsCisJICJzZXRfd3BhIn0sCisJe1BSSVNNNTRfREJHX09JRCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsCisJICJkYmdfb2lkIn0sCisJe1BSSVNNNTRfREJHX0dFVF9PSUQsIDAsIElXX1BSSVZfVFlQRV9CWVRFIHwgMjU2LCAiZGJnX2dldF9vaWQifSwKKwl7UFJJU001NF9EQkdfU0VUX09JRCwgSVdfUFJJVl9UWVBFX0JZVEUgfCAyNTYsIDAsICJkYmdfc2V0X29pZCJ9LAorCS8qIC0tLSBzdWItaW9jdGxzIGhhbmRsZXJzIC0tLSAqLworCXtQUklTTTU0X0dFVF9PSUQsCisJIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgUFJJVl9TVFJfU0laRSwgIiJ9LAorCXtQUklTTTU0X1NFVF9PSURfVTMyLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgIiJ9LAorCXtQUklTTTU0X1NFVF9PSURfU1RSLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICIifSwKKwl7UFJJU001NF9TRVRfT0lEX0FERFIsCisJIElXX1BSSVZfVFlQRV9BRERSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgIiJ9LAorCS8qIC0tLSBzdWItaW9jdGxzIGRlZmluaXRpb25zIC0tLSAqLworCUlXUFJJVl9BRERSKEdFTl9PSURfTUFDQUREUkVTUywgImFkZHIiKSwKKwlJV1BSSVZfR0VUKEdFTl9PSURfTElOS1NUQVRFLCAibGlua3N0YXRlIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfQlNTVFlQRSwgImJzc3R5cGUiKSwKKwlJV1BSSVZfQUREUihET1QxMV9PSURfQlNTSUQsICJic3NpZCIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX1NUQVRFLCAic3RhdGUiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9BSUQsICJhaWQiKSwKKworCUlXUFJJVl9TU0lEKERPVDExX09JRF9TU0lET1ZFUlJJREUsICJzc2lkb3ZlcnJpZGUiKSwKKworCUlXUFJJVl9VMzIoRE9UMTFfT0lEX01FRElVTUxJTUlULCAibWVkbGltaXQiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9CRUFDT05QRVJJT0QsICJiZWFjb24iKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9EVElNUEVSSU9ELCAiZHRpbXBlcmlvZCIpLAorCisJSVdQUklWX1UzMihET1QxMV9PSURfQVVUSEVOQUJMRSwgImF1dGhlbmFibGUiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9QUklWQUNZSU5WT0tFRCwgInByaXZpbnZvayIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsICJleHVuZW5jcnlwdCIpLAorCisJSVdQUklWX1UzMihET1QxMV9PSURfUkVLRVlUSFJFU0hPTEQsICJyZWtleXRocmVzaCIpLAorCisJSVdQUklWX1UzMihET1QxMV9PSURfTUFYVFhMSUZFVElNRSwgIm1heHR4bGlmZSIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX01BWFJYTElGRVRJTUUsICJtYXhyeGxpZmUiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9BTE9GVF9GSVhFRFJBVEUsICJmaXhlZHJhdGUiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9NQVhGUkFNRUJVUlNULCAiZnJhbWVidXJzdCIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX1BTTSwgInBzbSIpLAorCisJSVdQUklWX1UzMihET1QxMV9PSURfQlJJREdFTE9DQUwsICJicmlkZ2UiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9DTElFTlRTLCAiY2xpZW50cyIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0NMSUVOVFNBU1NPQ0lBVEVELCAiY2xpZW50YXNzb2MiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9ET1QxWEVOQUJMRSwgImRvdDF4ZW5hYmxlIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfQU5URU5OQVJYLCAicnhhbnQiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9BTlRFTk5BVFgsICJ0eGFudCIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0FOVEVOTkFESVZFUlNJVFksICJhbnRkaXZlcnMiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9FRFRIUkVTSE9MRCwgImVkdGhyZXNoIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfUFJFQU1CTEVTRVRUSU5HUywgInByZWFtYmxlIiksCisJSVdQUklWX0dFVChET1QxMV9PSURfUkFURVMsICJyYXRlcyIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX09VVFBVVFBPV0VSLCAiLjExb3V0cG93ZXIiKSwKKwlJV1BSSVZfR0VUKERPVDExX09JRF9TVVBQT1JURURSQVRFUywgInN1cHByYXRlcyIpLAorCUlXUFJJVl9HRVQoRE9UMTFfT0lEX1NVUFBPUlRFREZSRVFVRU5DSUVTLCAic3VwcGZyZXEiKSwKKworCUlXUFJJVl9VMzIoRE9UMTFfT0lEX05PSVNFRkxPT1IsICJub2lzZWZsb29yIiksCisJSVdQUklWX0dFVChET1QxMV9PSURfRlJFUVVFTkNZQUNUSVZJVFksICJmcmVxYWN0aXZpdHkiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9OT05FUlBQUk9URUNUSU9OLCAibm9uZXJwcHJvdGVjIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfUFJPRklMRVMsICJwcm9maWxlIiksCisJSVdQUklWX0dFVChET1QxMV9PSURfRVhURU5ERURSQVRFUywgImV4dHJhdGVzIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfTUxNRUFVVE9MRVZFTCwgIm1sbWVsZXZlbCIpLAorCisJSVdQUklWX0dFVChET1QxMV9PSURfQlNTUywgImJzc3MiKSwKKwlJV1BSSVZfR0VUKERPVDExX09JRF9CU1NMSVNULCAiYnNzbGlzdCIpLAorCUlXUFJJVl9VMzIoT0lEX0lOTF9NT0RFLCAibW9kZSIpLAorCUlXUFJJVl9VMzIoT0lEX0lOTF9DT05GSUcsICJjb25maWciKSwKKwlJV1BSSVZfVTMyKE9JRF9JTkxfRE9UMTFEX0NPTkZPUk1BTkNFLCAiLjExZGNvbmZvcm0iKSwKKwlJV1BSSVZfR0VUKE9JRF9JTkxfUEhZQ0FQQUJJTElUSUVTLCAicGh5Y2FwYSIpLAorCUlXUFJJVl9VMzIoT0lEX0lOTF9PVVRQVVRQT1dFUiwgIm91dHBvd2VyIiksCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBwcmlzbTU0X3ByaXZhdGVfaGFuZGxlcltdID0geworCShpd19oYW5kbGVyKSBwcmlzbTU0X3Jlc2V0LAorCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF9wb2xpY3ksCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3BvbGljeSwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfbWFjLAorCShpd19oYW5kbGVyKSBwcmlzbTU0X2FkZF9tYWMsCisJKGl3X2hhbmRsZXIpIE5VTEwsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZGVsX21hYywKKwkoaXdfaGFuZGxlcikgTlVMTCwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9raWNrX21hYywKKwkoaXdfaGFuZGxlcikgTlVMTCwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9raWNrX2FsbCwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfd3BhLAorCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF93cGEsCisJKGl3X2hhbmRsZXIpIE5VTEwsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZGVidWdfb2lkLAorCShpd19oYW5kbGVyKSBwcmlzbTU0X2RlYnVnX2dldF9vaWQsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZGVidWdfc2V0X29pZCwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfb2lkLAorCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF91MzIsCisJKGl3X2hhbmRsZXIpIE5VTEwsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3JhdywKKwkoaXdfaGFuZGxlcikgTlVMTCwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfcmF3LAorCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF9wcmlzbWhkciwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfcHJpc21oZHIsCit9OworCitjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcHJpc201NF9oYW5kbGVyX2RlZiA9IHsKKwkubnVtX3N0YW5kYXJkID0gc2l6ZW9mIChwcmlzbTU0X2hhbmRsZXIpIC8gc2l6ZW9mIChpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGUgPSBzaXplb2YgKHByaXNtNTRfcHJpdmF0ZV9oYW5kbGVyKSAvIHNpemVvZiAoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlX2FyZ3MgPQorCSAgICBzaXplb2YgKHByaXNtNTRfcHJpdmF0ZV9hcmdzKSAvIHNpemVvZiAoc3RydWN0IGl3X3ByaXZfYXJncyksCisJLnN0YW5kYXJkID0gKGl3X2hhbmRsZXIgKikgcHJpc201NF9oYW5kbGVyLAorCS5wcml2YXRlID0gKGl3X2hhbmRsZXIgKikgcHJpc201NF9wcml2YXRlX2hhbmRsZXIsCisJLnByaXZhdGVfYXJncyA9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIHByaXNtNTRfcHJpdmF0ZV9hcmdzLAorI2lmIFdJUkVMRVNTX0VYVCA9PSAxNgorCS5zcHlfb2Zmc2V0ID0gb2Zmc2V0b2YoaXNscGNpX3ByaXZhdGUsIHNweV9kYXRhKSwKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPT0gMTYgKi8KK307CisKKy8qIEZvciB3cGFfc3VwcGxpY2FudCAqLworCitpbnQKK3ByaXNtNTRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworCWludCByZXQgPSAtMTsKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFBSSVNNNTRfSE9TVEFQRDoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCQlyZXQgPSBwcmlzbTU0X2hvc3RhcGQobmRldiwgJndycS0+dS5kYXRhKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZkNWNkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgorICogICAgICAgICAgICAoQykgMjAwMyBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgorICogICAgICAgICAgICAoQykgMjAwMyBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHJ1c2x1Zy5ydXRnZXJzLmVkdT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfSVNMX0lPQ1RMX0gKKyNkZWZpbmUgX0lTTF9JT0NUTF9ICisKKyNpbmNsdWRlICJpc2xwY2lfbWd0LmgiCisjaW5jbHVkZSAiaXNscGNpX2Rldi5oIgorCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JLyogTmV3IGRyaXZlciBBUEkgKi8KKworI2RlZmluZSBTVVBQT1JURURfV0lSRUxFU1NfRVhUICAgICAgICAgICAgICAgICAgMTYKKwordm9pZCBwcmlzbTU0X21pYl9pbml0KGlzbHBjaV9wcml2YXRlICopOworCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcHJpc201NF9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIHByaXNtNTRfdXBkYXRlX3N0YXRzKGlzbHBjaV9wcml2YXRlICopOworCit2b2lkIHByaXNtNTRfYWNsX2luaXQoc3RydWN0IGlzbHBjaV9hY2wgKik7Cit2b2lkIHByaXNtNTRfYWNsX2NsZWFuKHN0cnVjdCBpc2xwY2lfYWNsICopOworCit2b2lkIHByaXNtNTRfcHJvY2Vzc190cmFwKHZvaWQgKik7CisKK3ZvaWQgcHJpc201NF93cGFfaWVfaW5pdChpc2xwY2lfcHJpdmF0ZSAqcHJpdik7Cit2b2lkIHByaXNtNTRfd3BhX2llX2NsZWFuKGlzbHBjaV9wcml2YXRlICpwcml2KTsKKworaW50IHByaXNtNTRfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICosIHZvaWQgKik7CisKK2ludCBwcmlzbTU0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZnJlcSAqLCBpbnQpOworCitleHRlcm4gY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHByaXNtNTRfaGFuZGxlcl9kZWY7CisKKyNlbmRpZgkJCQkvKiBfSVNMX0lPQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX29pZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfb2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5ZWRmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX29pZC5oCkBAIC0wLDAgKzEsNTA3IEBACisvKgorICoKKyAqICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgSGVyYmVydCBWYWxlcmlvIFJpZWRlbCA8aHZyQGdudS5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAcnVzbHVnLnJ1dGdlcnMuZWR1PgorICogIENvcHlyaWdodCAoQykgMjAwNCBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaWYgIWRlZmluZWQoX0lTTF9PSURfSCkKKyNkZWZpbmUgX0lTTF9PSURfSAorCisvKiAKKyAqIE1JQiByZWxhdGVkIGNvbnN0YW50IGFuZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIGNvbW11bmljYXRpbmcKKyAqIHdpdGggdGhlIGRldmljZSBmaXJtd2FyZQorICovCisKK3N0cnVjdCBvYmpfc3NpZCB7CisJdTggbGVuZ3RoOworCWNoYXIgb2N0ZXRzWzMzXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgb2JqX2tleSB7CisJdTggdHlwZTsJCS8qIGRvdDExX3ByaXZfdCAqLworCXU4IGxlbmd0aDsKKwljaGFyIGtleVszMl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG9ial9tbG1lIHsKKwl1OCBhZGRyZXNzWzZdOworCXUxNiBpZDsKKwl1MTYgc3RhdGU7CisJdTE2IGNvZGU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG9ial9tbG1lZXggeworCXU4IGFkZHJlc3NbNl07CisJdTE2IGlkOworCXUxNiBzdGF0ZTsKKwl1MTYgY29kZTsKKwl1MTYgc2l6ZTsKKwl1OCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBvYmpfYnVmZmVyIHsKKwl1MzIgc2l6ZTsKKwl1MzIgYWRkcjsJCS8qIDMyYml0IGJ1cyBhZGRyZXNzICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG9ial9ic3MgeworCXU4IGFkZHJlc3NbNl07CisJaW50OjE2OwkJCS8qIHBhZGRpbmcgKi8KKworCWNoYXIgc3RhdGU7CisJY2hhciByZXNlcnZlZDsKKwlzaG9ydCBhZ2U7CisKKwljaGFyIHF1YWxpdHk7CisJY2hhciByc3NpOworCisJc3RydWN0IG9ial9zc2lkIHNzaWQ7CisJc2hvcnQgY2hhbm5lbDsKKwljaGFyIGJlYWNvbl9wZXJpb2Q7CisJY2hhciBkdGltX3BlcmlvZDsKKwlzaG9ydCBjYXBpbmZvOworCXNob3J0IHJhdGVzOworCXNob3J0IGJhc2ljX3JhdGVzOworCWludDoxNjsJCQkvKiBwYWRkaW5nICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG9ial9ic3NsaXN0IHsKKwl1MzIgbnI7CisJc3RydWN0IG9ial9ic3MgYnNzbGlzdFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgb2JqX2ZyZXF1ZW5jaWVzIHsKKwl1MTYgbnI7CisJdTE2IG1oelswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgb2JqX2F0dGFjaG1lbnQgeworCWNoYXIgdHlwZTsKKwljaGFyIHJlc2VydmVkOworCXNob3J0IGlkOworCXNob3J0IHNpemU7CisJY2hhciBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogCisgKiBpbiBjYXNlIGV2ZXJ5dGhpbmcncyBvaywgdGhlIGlubGluZWQgZnVuY3Rpb24gYmVsb3cgd2lsbCBiZQorICogb3B0aW1pemVkIGF3YXkgYnkgdGhlIGNvbXBpbGVyLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19idWdfb25fd3Jvbmdfc3RydWN0X3NpemVzKHZvaWQpCit7CisJQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9zc2lkKSAhPSAzNCk7CisJQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9rZXkpICE9IDM0KTsKKwlCVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX21sbWUpICE9IDEyKTsKKwlCVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX21sbWVleCkgIT0gMTQpOworCUJVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfYnVmZmVyKSAhPSA4KTsKKwlCVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX2JzcykgIT0gNjApOworCUJVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfYnNzbGlzdCkgIT0gNCk7CisJQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9mcmVxdWVuY2llcykgIT0gMik7Cit9CisKK2VudW0gZG90MTFfc3RhdGVfdCB7CisJRE9UMTFfU1RBVEVfTk9ORSA9IDAsCisJRE9UMTFfU1RBVEVfQVVUSElORyA9IDEsCisJRE9UMTFfU1RBVEVfQVVUSCA9IDIsCisJRE9UMTFfU1RBVEVfQVNTT0NJTkcgPSAzLAorCisJRE9UMTFfU1RBVEVfQVNTT0MgPSA1LAorCURPVDExX1NUQVRFX0lCU1MgPSA2LAorCURPVDExX1NUQVRFX1dEUyA9IDcKK307CisKK2VudW0gZG90MTFfYnNzdHlwZV90IHsKKwlET1QxMV9CU1NUWVBFX05PTkUgPSAwLAorCURPVDExX0JTU1RZUEVfSU5GUkEgPSAxLAorCURPVDExX0JTU1RZUEVfSUJTUyA9IDIsCisJRE9UMTFfQlNTVFlQRV9BTlkgPSAzCit9OworCitlbnVtIGRvdDExX2F1dGhfdCB7CisJRE9UMTFfQVVUSF9OT05FID0gMCwKKwlET1QxMV9BVVRIX09TID0gMSwKKwlET1QxMV9BVVRIX1NLID0gMiwKKwlET1QxMV9BVVRIX0JPVEggPSAzCit9OworCitlbnVtIGRvdDExX21sbWVfdCB7CisJRE9UMTFfTUxNRV9BVVRPID0gMCwKKwlET1QxMV9NTE1FX0lOVEVSTUVESUFURSA9IDEsCisJRE9UMTFfTUxNRV9FWFRFTkRFRCA9IDIKK307CisKK2VudW0gZG90MTFfcHJpdl90IHsKKwlET1QxMV9QUklWX1dFUCA9IDAsCisJRE9UMTFfUFJJVl9US0lQID0gMQorfTsKKworLyogUHJpc20gIk5pdHJvIiAvIEZyYW1lYnVyc3QgLyAiUGFja2V0IEZyYW1lIEdyb3VwaW5nIgorICogVmFsdWUgaXMgaW4gbWljcm9zZWNvbmRzLiBSZXByZXNlbnRzIHRoZSAjIG1pY3Jvc2Vjb25kcworICogdGhlIGZpcm13YXJlIHdpbGwgdGFrZSB0byBncm91cCBmcmFtZXMgYmVmb3JlIHNlbmRpbmcgb3V0IHRoZW4gb3V0IAorICogdG9nZXRoZXIgd2l0aCBhIENTTUEgY29udGVudGlvbi4gV2l0aG91dCB0aGlzIGFsbCBmcmFtZXMgYXJlCisgKiBzZW50IHdpdGggYSBDU01BIGNvbnRlbnRpb24uIAorICogQmlibGlvZ3JhcGh5OiAKKyAqIGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvUGFwZXJzL1BhY2tldC5GcmFtZS5Hcm91cGluZy5odG1sCisgKi8KK2VudW0gZG90MTFfbWF4ZnJhbWVidXJzdF90IHsgCisJLyogVmFsdWVzIGZvciBET1QxMV9PSURfTUFYRlJBTUVCVVJTVCAqLworCURPVDExX01BWEZSQU1FQlVSU1RfT0ZGID0gMCwgLyogQ2FyZCBmaXJtd2FyZSBkZWZhdWx0ICovCisJRE9UMTFfTUFYRlJBTUVCVVJTVF9NSVhFRF9TQUZFID0gNjUwLCAvKiA4MDIuMTEgYSxiLGcgc2FmZSAqLworCURPVDExX01BWEZSQU1FQlVSU1RfSURFQUwgPSAxMzAwLCAvKiBUaGVvcmV0aWNhbCBpZGVhbCBsZXZlbCAqLworCURPVDExX01BWEZSQU1FQlVSU1RfTUFYID0gNTAwMCwgLyogVXNlIHRoaXMgYXMgbWF4LAorCQkqIE5vdGU6IGZpcm13YXJlIGFsbG93cyBmb3IgZ3JlYXRlciB2YWx1ZXMuIFRoaXMgaXMgYQorCQkqIHJlY29tbWVuZGVkIG1heC4gSSdsbCB1cGRhdGUgdGhpcyBhcyBJIGZpbmQKKwkJKiBvdXQgd2hhdCB0aGUgcmVhbCBNQVggaXMuIEFsc28gbm90ZSB0aGF0IHlvdSBkb24ndCBuZWNlc3NhcmlseQorCQkqIGdldCBiZXR0ZXIgcmVzdWx0cyB3aXRoIGEgZ3JlYXRlciB2YWx1ZSBoZXJlLgorCQkqLworfTsKKworLyogU3VwcG9ydCBmb3IgODAyLjExIGxvbmcgYW5kIHNob3J0IGZyYW1lIHByZWFtYmxlcy4KKyAqIExvbmcJIHByZWFtYmxlIHVzZXMgMTI4LWJpdCBzeW5jIGZpZWxkLCA4LWJpdCAgQ1JDCisgKiBTaG9ydCBwcmVhbWJsZSB1c2VzIDU2LWJpdCAgc3luYyBmaWVsZCwgMTYtYml0IENSQworICogCisgKiA4MDIuMTFhIC0tIG5vdCBzdXJlLCBib3RoIG9wdGlvbmFsbHkgPworICogODAyLjExYiBzdXBwb3J0cyBsb25nIGFuZCBvcHRpb25hbGx5IHNob3J0IAorICogODAyLjExZyBzdXBwb3J0cyBib3RoICovCitlbnVtIGRvdDExX3ByZWFtYmxlc2V0dGluZ3NfdCB7CisJRE9UMTFfUFJFQU1CTEVTRVRUSU5HX0xPTkcgPSAwLAorCQkvKiBBbGxvd3MgKm9ubHkqIGxvbmcgODAyLjExIHByZWFtYmxlcyAqLworCURPVDExX1BSRUFNQkxFU0VUVElOR19TSE9SVCA9IDEsCisJCS8qIEFsbG93cyAqb25seSogc2hvcnQgODAyLjExIHByZWFtYmxlcyAqLworCURPVDExX1BSRUFNQkxFU0VUVElOR19EWU5BTUlDID0gMgorCQkvKiBBdXRvbWF0aUdpY2FsbHkgc2V0ICovCit9OworCisvKiBTdXBwb3J0IGZvciA4MDIuMTEgc2xvdCB0aW1pbmcgKHRpbWUgYmV0d2VlbiBwYWNrZXRzKS4KKyAqCisgKiBMb25nIHVzZXMgODAyLjExYSBzbG90IHRpbWluZyAgKDkgdXNlYyA/KQorICogU2hvcnQgdXNlcyA4MDIuMTFiIHNsb3QgdGltaW5nICgyMCB1c2UgPykgKi8KK2VudW0gZG90MTFfc2xvdHNldHRpbmdzX3QgeworCURPVDExX1NMT1RTRVRUSU5HU19MT05HID0gMCwgCisJCS8qIEFsbG93cyAqb25seSogbG9uZyA4MDIuMTFiIHNsb3QgdGltaW5nICovCisJRE9UMTFfU0xPVFNFVFRJTkdTX1NIT1JUID0gMSwKKwkJLyogQWxsb3dzICpvbmx5KiBsb25nIDgwMi4xMWEgc2xvdCB0aW1pbmcgKi8KKwlET1QxMV9TTE9UU0VUVElOR1NfRFlOQU1JQyA9IDIKKwkJLyogQXV0b21hdGlHaWNhbGx5IHNldCAqLworfTsKKworLyogQWxsIHlvdSBuZWVkIHRvIGtub3csIEVSUCBpcyAiRXh0ZW5kZWQgUmF0ZSBQSFkiLgorICogQW4gRXh0ZW5kZWQgUmF0ZSBQSFkgKEVSUCkgU1RBIG9yIEFQIHNoYWxsIHN1cHBvcnQgdGhyZWUgZGlmZmVyZW50IAorICogcHJlYW1ibGUgYW5kIGhlYWRlciBmb3JtYXRzOgorICogTG9uZyAgcHJlYW1ibGUgKHJlZmVyIHRvIGFib3ZlKQorICogU2hvcnQgcHJlYW1ibGUgKHJlZmVyIHRvIGFib3ZlKQorICogT0ZETSAgcHJlYW1ibGUgKCA/ICkKKyAqCisgKiBJJ20gYXNzdW1pbmcgaGVyZSBQcm90ZWN0aW9uIHRlbGxzIHRoZSBBUAorICogdG8gYmUgY2FyZWZ1bCwgYSBTVEEgd2hpY2ggY2Fubm90IGhhbmRsZSB0aGUgbG9uZyBwcmUtYW1ibGUKKyAqIGhhcyBqb2luZWQuCisgKi8KK2VudW0gZG8xMV9ub25lcnBzdGF0dXNfdCB7CisJRE9UMTFfRVJQU1RBVF9OT05FUFJFU0VOVCA9IDAsCisJRE9UMTFfRVJQU1RBVF9VU0VQUk9URUNUSU9OID0gMQorfTsKKworLyogKEVSUCBpcyAiRXh0ZW5kZWQgUmF0ZSBQSFkiKSBXYXkgdG8gcmVhZCBOT05FUlAgaXMgTk9OLUVSUC0qCisgKiBUaGUga2V5IGhlcmUgaXMgRE9UMTEgTk9OIEVSUCBORVZFUiBwcm90ZWN0cyBhZ2FpbnN0CisgKiBOT04gRVJQIFNUQSdzLiBZb3UgKmRvbid0KiB3YW50IHRoaXMgdW5sZXNzCisgKiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuIEl0IG1lYW5zIHlvdSB3aWxsIG9ubHkgCisgKiBnZXQgRXh0ZW5kZWQgUmF0ZSBjYXBhYmlsaXRpZXMgKi8KK2VudW0gZG90MTFfbm9uZXJwcHJvdGVjdGlvbl90IHsKKwlET1QxMV9OT05FUlBfTkVWRVIgPSAwLAorCURPVDExX05PTkVSUF9BTFdBWVMgPSAxLAorCURPVDExX05PTkVSUF9EWU5BTUlDID0gMgorfTsKKworLyogUHJlc2V0IE9JRCBjb25maWd1cmF0aW9uIGZvciA4MDIuMTEgbW9kZXMgCisgKiBOb3RlOiBET1QxMV9PSURfQ1dbTUlOfE1BWF0gaG9sZCB0aGUgdmFsdWVzIG9mIHRoZSAKKyAqIERDUyBNSU58TUFYIGJhY2tvZmYgdXNlZCAqLworZW51bSBkb3QxMV9wcm9maWxlX3QgeyAvKiBBbmQgc2V0L2FsbG93ZWQgdmFsdWVzICovCisJLyogQWxsb3dlZCB2YWx1ZXMgZm9yIERPVDExX09JRF9QUk9GSUxFUyAqLworCURPVDExX1BST0ZJTEVfQl9PTkxZID0gMCwKKwkJLyogRE9UMTFfT0lEX1JBVEVTOiAxLCAyLCA1LjUsIDExTWJwcyAKKwkJICogRE9UMTFfT0lEX1BSRUFNQkxFU0VUVElOR1M6IERPVDExX1BSRUFNQkxFU0VUVElOR19EWU5BTUlDCisJCSAqIERPVDExX09JRF9DV01JTjogMzEKKwkJICogRE9UMTFfT0lEX05PTkVQUk9URUNUSU9OOiBET1QxMV9OT0VSUF9EWU5BTUlDCisJCSAqIERPVDExX09JRF9TTE9UU0VUVElOR1M6IERPVDExX1NMT1RTRVRUSU5HU19MT05HCisJCSAqLworCURPVDExX1BST0ZJTEVfTUlYRURfR19XSUZJID0gMSwKKwkJLyogRE9UMTFfT0lEX1JBVEVTOiAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0TWJzCisJCSAqIERPVDExX09JRF9QUkVBTUJMRVNFVFRJTkdTOiBET1QxMV9QUkVBTUJMRVNFVFRJTkdfRFlOQU1JQworCQkgKiBET1QxMV9PSURfQ1dNSU46IDE1CisJCSAqIERPVDExX09JRF9OT05FUFJPVEVDVElPTjogRE9UMTFfTk9FUlBfRFlOQU1JQworCQkgKiBET1QxMV9PSURfU0xPVFNFVFRJTkdTOiBET1QxMV9TTE9UU0VUVElOR1NfRFlOQU1JQworCQkgKi8KKwlET1QxMV9QUk9GSUxFX01JWEVEX0xPTkcgPSAyLCAvKiAiTG9uZyByYW5nZSIgKi8KKwkJLyogU2FtZSBhcyBQcm9maWxlIE1JWEVEX0dfV0lGSSAqLworCURPVDExX1BST0ZJTEVfR19PTkxZID0gMywKKwkJLyogU2FtZSBhcyBQcm9maWxlIE1JWEVEX0dfV0lGSSAqLworCURPVDExX1BST0ZJTEVfVEVTVCA9IDQsCisJCS8qIFNhbWUgYXMgUHJvZmlsZSBNSVhFRF9HX1dJRkkgZXhjZXB0OgorCQkgKiBET1QxMV9PSURfUFJFQU1CTEVTRVRUSU5HUzogRE9UMTFfUFJFQU1CTEVTRVRUSU5HX1NIT1JUCisJCSAqIERPVDExX09JRF9OT05FUFJPVEVDVElPTjogRE9UMTFfTk9FUlBfTkVWRVIKKwkJICogRE9UMTFfT0lEX1NMT1RTRVRUSU5HUzogRE9UMTFfU0xPVFNFVFRJTkdTX1NIT1JUCisJCSAqLworCURPVDExX1BST0ZJTEVfQl9XSUZJID0gNSwKKwkJLyogU2FtZSBhcyBQcm9maWxlIEJfT05MWSAqLworCURPVDExX1BST0ZJTEVfQV9PTkxZID0gNiwKKwkJLyogU2FtZSBhcyBQcm9maWxlIE1JWEVEX0dfV0lGSSBleGNlcHQ6CisJCSAqIERPVDExX09JRF9SQVRFUzogNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NE1icworCQkgKi8KKwlET1QxMV9QUk9GSUxFX01JWEVEX1NIT1JUID0gNworCQkvKiBTYW1lIGFzIE1JWEVEX0dfV0lGSSAqLworfTsKKworCisvKiBUaGUgZG90MTFkIGNvbmZvcm1hbmNlIGxldmVsIGNvbmZpZ3VyZXMgdGhlIDgwMi4xMWQgY29uZm9ybWFuY2UgbGV2ZWxzLgorICogVGhlIGZvbGxvd2luZyBjb25mb3JtYW5jZSBsZXZlbHMgZXhpc3Q6Ki8KK2VudW0gb2lkX2lubF9jb25mb3JtYW5jZV90IHsKKwlPSURfSU5MX0NPTkZPUk1BTkNFX05PTkUgPSAwLAkvKiBQZXJmb3JtIGFjdGl2ZSBzY2FubmluZyAqLworCU9JRF9JTkxfQ09ORk9STUFOQ0VfU1RSSUNUID0gMSwJLyogU3RyaWN0bHkgYWRoZXJlIHRvIDgwMi4xMWQgKi8KKwlPSURfSU5MX0NPTkZPUk1BTkNFX0ZMRVhJQkxFID0gMiwJLyogVXNlIHBhc3NlZCA4MDIuMTFkIGluZm8gdG8KKwkJKiBkZXRlcm1pbmUgY2hhbm5lbCBBTkQvT1IganVzdCBtYWtlIGFzc3VtcHRpb24gdGhhdCBhY3RpdmUgCisJCSogY2hhbm5lbHMgYXJlIHZhbGlkICBjaGFubmVscyAqLworfTsKKworZW51bSBvaWRfaW5sX21vZGVfdCB7CisJSU5MX01PREVfTk9ORSA9IC0xLAorCUlOTF9NT0RFX1BST01JU0NVT1VTID0gMCwKKwlJTkxfTU9ERV9DTElFTlQgPSAxLAorCUlOTF9NT0RFX0FQID0gMiwKKwlJTkxfTU9ERV9TTklGRkVSID0gMworfTsKKworZW51bSBvaWRfaW5sX2NvbmZpZ190IHsKKwlJTkxfQ09ORklHX05PVEhJTkcgPSAweDAwLAorCUlOTF9DT05GSUdfTUFOVUFMUlVOID0gMHgwMSwKKwlJTkxfQ09ORklHX0ZSQU1FVFJBUCA9IDB4MDIsCisJSU5MX0NPTkZJR19SWEFOTkVYID0gMHgwNCwKKwlJTkxfQ09ORklHX1RYQU5ORVggPSAweDA4LAorCUlOTF9DT05GSUdfV0RTID0gMHgxMAorfTsKKworZW51bSBvaWRfaW5sX3BoeWNhcF90IHsKKwlJTkxfUEhZQ0FQXzI0MDBNSFogPSAxLAorCUlOTF9QSFlDQVBfNTAwME1IWiA9IDIsCisJSU5MX1BIWUNBUF9GQUEgPSAweDgwMDAwMDAwLAkvKiBNZWFucyBjYXJkIHN1cHBvcnRzIHRoZSBGQUEgc3dpdGNoICovCit9OworCisKK2VudW0gb2lkX251bV90IHsKKwlHRU5fT0lEX01BQ0FERFJFU1MgPSAwLAorCUdFTl9PSURfTElOS1NUQVRFLAorCUdFTl9PSURfV0FUQ0hET0csCisJR0VOX09JRF9NSUJPUCwKKwlHRU5fT0lEX09QVElPTlMsCisJR0VOX09JRF9MRURDT05GSUcsCisKKwkvKiA4MDIuMTEgKi8KKwlET1QxMV9PSURfQlNTVFlQRSwKKwlET1QxMV9PSURfQlNTSUQsCisJRE9UMTFfT0lEX1NTSUQsCisJRE9UMTFfT0lEX1NUQVRFLAorCURPVDExX09JRF9BSUQsCisJRE9UMTFfT0lEX0NPVU5UUllTVFJJTkcsCisJRE9UMTFfT0lEX1NTSURPVkVSUklERSwKKworCURPVDExX09JRF9NRURJVU1MSU1JVCwKKwlET1QxMV9PSURfQkVBQ09OUEVSSU9ELAorCURPVDExX09JRF9EVElNUEVSSU9ELAorCURPVDExX09JRF9BVElNV0lORE9XLAorCURPVDExX09JRF9MSVNURU5JTlRFUlZBTCwKKwlET1QxMV9PSURfQ0ZQUEVSSU9ELAorCURPVDExX09JRF9DRlBEVVJBVElPTiwKKworCURPVDExX09JRF9BVVRIRU5BQkxFLAorCURPVDExX09JRF9QUklWQUNZSU5WT0tFRCwKKwlET1QxMV9PSURfRVhVTkVOQ1JZUFRFRCwKKwlET1QxMV9PSURfREVGS0VZSUQsCisJRE9UMTFfT0lEX0RFRktFWVgsCS8qIERPVDExX09JRF9ERUZLRVkxLC4uLkRPVDExX09JRF9ERUZLRVk0ICovCisJRE9UMTFfT0lEX1NUQUtFWSwKKwlET1QxMV9PSURfUkVLRVlUSFJFU0hPTEQsCisJRE9UMTFfT0lEX1NUQVNDLAorCisJRE9UMTFfT0lEX1BSSVZUWFJFSkVDVEVELAorCURPVDExX09JRF9QUklWUlhQTEFJTiwKKwlET1QxMV9PSURfUFJJVlJYRkFJTEVELAorCURPVDExX09JRF9QUklWUlhOT0tFWSwKKworCURPVDExX09JRF9SVFNUSFJFU0gsCisJRE9UMTFfT0lEX0ZSQUdUSFJFU0gsCisJRE9UMTFfT0lEX1NIT1JUUkVUUklFUywKKwlET1QxMV9PSURfTE9OR1JFVFJJRVMsCisJRE9UMTFfT0lEX01BWFRYTElGRVRJTUUsCisJRE9UMTFfT0lEX01BWFJYTElGRVRJTUUsCisJRE9UMTFfT0lEX0FVVEhSRVNQVElNRU9VVCwKKwlET1QxMV9PSURfQVNTT0NSRVNQVElNRU9VVCwKKworCURPVDExX09JRF9BTE9GVF9UQUJMRSwKKwlET1QxMV9PSURfQUxPRlRfQ1RSTF9UQUJMRSwKKwlET1QxMV9PSURfQUxPRlRfUkVUUkVBVCwKKwlET1QxMV9PSURfQUxPRlRfUFJPR1JFU1MsCisJRE9UMTFfT0lEX0FMT0ZUX0ZJWEVEUkFURSwKKwlET1QxMV9PSURfQUxPRlRfUlNTSUdSQVBILAorCURPVDExX09JRF9BTE9GVF9DT05GSUcsCisKKwlET1QxMV9PSURfVkRDRlgsCisJRE9UMTFfT0lEX01BWEZSQU1FQlVSU1QsCisKKwlET1QxMV9PSURfUFNNLAorCURPVDExX09JRF9DQU1USU1FT1VULAorCURPVDExX09JRF9SRUNFSVZFRFRJTVMsCisJRE9UMTFfT0lEX1JPQU1QUkVGRVJFTkNFLAorCisJRE9UMTFfT0lEX0JSSURHRUxPQ0FMLAorCURPVDExX09JRF9DTElFTlRTLAorCURPVDExX09JRF9DTElFTlRTQVNTT0NJQVRFRCwKKwlET1QxMV9PSURfQ0xJRU5UWCwJLyogRE9UMTFfT0lEX0NMSUVOVFgsLi4uRE9UMTFfT0lEX0NMSUVOVDIwMDcgKi8KKworCURPVDExX09JRF9DTElFTlRGSU5ELAorCURPVDExX09JRF9XRFNMSU5LQURELAorCURPVDExX09JRF9XRFNMSU5LUkVNT1ZFLAorCURPVDExX09JRF9FQVBBVVRIU1RBLAorCURPVDExX09JRF9FQVBVTkFVVEhTVEEsCisJRE9UMTFfT0lEX0RPVDFYRU5BQkxFLAorCURPVDExX09JRF9NSUNGQUlMVVJFLAorCURPVDExX09JRF9SRUtFWUlORElDQVRFLAorCisJRE9UMTFfT0lEX01QRFVUWFNVQ0NFU1NGVUwsCisJRE9UMTFfT0lEX01QRFVUWE9ORVJFVFJZLAorCURPVDExX09JRF9NUERVVFhNVUxUSVBMRVJFVFJJRVMsCisJRE9UMTFfT0lEX01QRFVUWEZBSUxFRCwKKwlET1QxMV9PSURfTVBEVVJYU1VDQ0VTU0ZVTCwKKwlET1QxMV9PSURfTVBEVVJYRFVQUywKKwlET1QxMV9PSURfUlRTU1VDQ0VTU0ZVTCwKKwlET1QxMV9PSURfUlRTRkFJTEVELAorCURPVDExX09JRF9BQ0tGQUlMRUQsCisJRE9UMTFfT0lEX0ZSQU1FUkVDRUlWRVMsCisJRE9UMTFfT0lEX0ZSQU1FRVJST1JTLAorCURPVDExX09JRF9GUkFNRUFCT1JUUywKKwlET1QxMV9PSURfRlJBTUVBQk9SVFNQSFksCisKKwlET1QxMV9PSURfU0xPVFRJTUUsCisJRE9UMTFfT0lEX0NXTUlOLCAvKiBNSU4gRENTIGJhY2tvZmYgKi8KKwlET1QxMV9PSURfQ1dNQVgsIC8qIE1BWCBEQ1MgYmFja29mZiAqLworCURPVDExX09JRF9BQ0tXSU5ET1csCisJRE9UMTFfT0lEX0FOVEVOTkFSWCwKKwlET1QxMV9PSURfQU5URU5OQVRYLAorCURPVDExX09JRF9BTlRFTk5BRElWRVJTSVRZLAorCURPVDExX09JRF9DSEFOTkVMLAorCURPVDExX09JRF9FRFRIUkVTSE9MRCwKKwlET1QxMV9PSURfUFJFQU1CTEVTRVRUSU5HUywKKwlET1QxMV9PSURfUkFURVMsCisJRE9UMTFfT0lEX0NDQU1PREVTVVBQT1JURUQsCisJRE9UMTFfT0lEX0NDQU1PREUsCisJRE9UMTFfT0lEX1JTU0lWRUNUT1IsCisJRE9UMTFfT0lEX09VVFBVVFBPV0VSVEFCTEUsCisJRE9UMTFfT0lEX09VVFBVVFBPV0VSLAorCURPVDExX09JRF9TVVBQT1JURURSQVRFUywKKwlET1QxMV9PSURfRlJFUVVFTkNZLAorCURPVDExX09JRF9TVVBQT1JURURGUkVRVUVOQ0lFUywKKwlET1QxMV9PSURfTk9JU0VGTE9PUiwKKwlET1QxMV9PSURfRlJFUVVFTkNZQUNUSVZJVFksCisJRE9UMTFfT0lEX0lRQ0FMSUJSQVRJT05UQUJMRSwKKwlET1QxMV9PSURfTk9ORVJQUFJPVEVDVElPTiwKKwlET1QxMV9PSURfU0xPVFNFVFRJTkdTLAorCURPVDExX09JRF9OT05FUlBUSU1FT1VULAorCURPVDExX09JRF9QUk9GSUxFUywKKwlET1QxMV9PSURfRVhURU5ERURSQVRFUywKKworCURPVDExX09JRF9ERUFVVEhFTlRJQ0FURSwKKwlET1QxMV9PSURfQVVUSEVOVElDQVRFLAorCURPVDExX09JRF9ESVNBU1NPQ0lBVEUsCisJRE9UMTFfT0lEX0FTU09DSUFURSwKKwlET1QxMV9PSURfU0NBTiwKKwlET1QxMV9PSURfQkVBQ09OLAorCURPVDExX09JRF9QUk9CRSwKKwlET1QxMV9PSURfREVBVVRIRU5USUNBVEVFWCwKKwlET1QxMV9PSURfQVVUSEVOVElDQVRFRVgsCisJRE9UMTFfT0lEX0RJU0FTU09DSUFURUVYLAorCURPVDExX09JRF9BU1NPQ0lBVEVFWCwKKwlET1QxMV9PSURfUkVBU1NPQ0lBVEUsCisJRE9UMTFfT0lEX1JFQVNTT0NJQVRFRVgsCisKKwlET1QxMV9PSURfTk9ORVJQU1RBVFVTLAorCisJRE9UMTFfT0lEX1NUQVRJTUVPVVQsCisJRE9UMTFfT0lEX01MTUVBVVRPTEVWRUwsCisJRE9UMTFfT0lEX0JTU1RJTUVPVVQsCisJRE9UMTFfT0lEX0FUVEFDSE1FTlQsCisJRE9UMTFfT0lEX1BTTUJVRkZFUiwKKworCURPVDExX09JRF9CU1NTLAorCURPVDExX09JRF9CU1NYLAkJLypET1QxMV9PSURfQlNTMSwuLi4sRE9UMTFfT0lEX0JTUzY0ICovCisJRE9UMTFfT0lEX0JTU0ZJTkQsCisJRE9UMTFfT0lEX0JTU0xJU1QsCisKKwlPSURfSU5MX1RVTk5FTCwKKwlPSURfSU5MX01FTUFERFIsCisJT0lEX0lOTF9NRU1PUlksCisJT0lEX0lOTF9NT0RFLAorCU9JRF9JTkxfQ09NUE9ORU5UX05SLAorCU9JRF9JTkxfVkVSU0lPTiwKKwlPSURfSU5MX0lOVEVSRkFDRV9JRCwKKwlPSURfSU5MX0NPTVBPTkVOVF9JRCwKKwlPSURfSU5MX0NPTkZJRywKKwlPSURfSU5MX0RPVDExRF9DT05GT1JNQU5DRSwKKwlPSURfSU5MX1BIWUNBUEFCSUxJVElFUywKKwlPSURfSU5MX09VVFBVVFBPV0VSLAorCisJT0lEX05VTV9MQVNUCit9OworCisjZGVmaW5lIE9JRF9GTEFHX0NBQ0hFRAkJMHg4MAorI2RlZmluZSBPSURfRkxBR19UWVBFCQkweDdmCisKKyNkZWZpbmUgT0lEX1RZUEVfVTMyCQkweDAxCisjZGVmaW5lIE9JRF9UWVBFX1NTSUQJCTB4MDIKKyNkZWZpbmUgT0lEX1RZUEVfS0VZCQkweDAzCisjZGVmaW5lIE9JRF9UWVBFX0JVRkZFUgkJMHgwNAorI2RlZmluZSBPSURfVFlQRV9CU1MJCTB4MDUKKyNkZWZpbmUgT0lEX1RZUEVfQlNTTElTVAkweDA2CisjZGVmaW5lIE9JRF9UWVBFX0ZSRVFVRU5DSUVTCTB4MDcKKyNkZWZpbmUgT0lEX1RZUEVfTUxNRQkJMHgwOAorI2RlZmluZSBPSURfVFlQRV9NTE1FRVgJCTB4MDkKKyNkZWZpbmUgT0lEX1RZUEVfQUREUgkJMHgwQQorI2RlZmluZSBPSURfVFlQRV9SQVcJCTB4MEIKKyNkZWZpbmUgT0lEX1RZUEVfQVRUQUNICQkweDBDCisKKy8qIE9JRF9UWVBFX01MTUVFWCBpcyBzcGVjaWFsIGJlY2F1c2Ugb2YgYSB2YXJpYWJsZSBzaXplIGZpZWxkIHdoZW4gc2VuZGluZy4KKyAqIE5vdCB5ZXQgaW1wbGVtZW50ZWQgKG5vdCB1c2VkIGluIGRyaXZlciBhbnl3YXkpLgorICovCisKK3N0cnVjdCBvaWRfdCB7CisJZW51bSBvaWRfbnVtX3Qgb2lkOworCXNob3J0IHJhbmdlOwkJLyogdG8gZGVmaW5lIGEgcmFuZ2Ugb2Ygb2lkICovCisJc2hvcnQgc2l6ZTsJCS8qIG1heCBzaXplIG9mIHRoZSBhc3NvY2lhdGVkIGRhdGEgKi8KKwljaGFyIGZsYWdzOworfTsKKwordW5pb24gb2lkX3Jlc190IHsKKwl2b2lkICpwdHI7CisJdTMyIHU7Cit9OworCisjZGVmaW5lCUlXTUFYX0JJVFJBVEVTCTIwCisjZGVmaW5lCUlXTUFYX0JTUwkyNAorI2RlZmluZSBJV01BWF9GUkVRCTMwCisjZGVmaW5lIFBSSVZfU1RSX1NJWkUJMTAyNAorCisjZW5kaWYJCQkJLyogIWRlZmluZWQoX0lTTF9PSURfSCkgKi8KKy8qIEVPRiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmFiMDdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKQEAgLTAsMCArMSw5NTYgQEAKKy8qCisgKiAgCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgSGVyYmVydCBWYWxlcmlvIFJpZWRlbCA8aHZyQGdudS5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAcnVzbHVnLnJ1dGdlcnMuZWR1PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJwcmlzbWNvbXBhdC5oIgorI2luY2x1ZGUgImlzbF8zOHh4LmgiCisjaW5jbHVkZSAiaXNsX2lvY3RsLmgiCisjaW5jbHVkZSAiaXNscGNpX2Rldi5oIgorI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIKKyNpbmNsdWRlICJpc2xwY2lfZXRoLmgiCisjaW5jbHVkZSAib2lkX21ndC5oIgorCisjZGVmaW5lIElTTDM4NzdfSU1BR0VfRklMRQkiaXNsMzg3NyIKKyNkZWZpbmUgSVNMMzg4Nl9JTUFHRV9GSUxFCSJpc2wzODg2IgorI2RlZmluZSBJU0wzODkwX0lNQUdFX0ZJTEUJImlzbDM4OTAiCisKK3N0YXRpYyBpbnQgcHJpc201NF9icmluZ19kb3duKGlzbHBjaV9wcml2YXRlICopOworc3RhdGljIGludCBpc2xwY2lfYWxsb2NfbWVtb3J5KGlzbHBjaV9wcml2YXRlICopOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppc2xwY2lfc3RhdGlzdGljcyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworLyogVGVtcG9yYXJ5IGR1bW15IE1BQyBhZGRyZXNzIHRvIHVzZSB1bnRpbCBmaXJtd2FyZSBpcyBsb2FkZWQuCisgKiBUaGUgaWRlYSB0aGVyZSBpcyB0aGF0IHNvbWUgdG9vbHMgKHN1Y2ggYXMgbmFtZWlmKSBtYXkgcXVlcnkKKyAqIHRoZSBNQUMgYWRkcmVzcyBiZWZvcmUgdGhlIG5ldGRldiBpcyAnb3BlbicuIEJ5IHVzaW5nIGEgdmFsaWQKKyAqIE9VSSBwcmVmaXgsIHRoZXkgY2FuIHByb2Nlc3MgdGhlIG5ldGRldiBwcm9wZXJseS4KKyAqIE9mIGNvdXJzZSwgdGhpcyBpcyBub3QgdGhlIGZpbmFsL3JlYWwgTUFDIGFkZHJlc3MuIEl0IGRvZXNuJ3QKKyAqIG1hdHRlciwgYXMgeW91IGFyZSBzdXBwb3NlIHRvIGJlIGFibGUgdG8gY2hhbmdlIGl0IGFueXRpbWUgdmlhCisgKiBuZGV2LT5zZXRfbWFjX2FkZHJlc3MuIEplYW4gSUkgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyCWR1bW15X21hY1s2XSA9IHsgMHgwMCwgMHgzMCwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCitzdGF0aWMgaW50Citpc2xfdXBsb2FkX2Zpcm13YXJlKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCXUzMiByZWcsIHJjOworCXZvaWQgX19pb21lbSAqZGV2aWNlX2Jhc2UgPSBwcml2LT5kZXZpY2VfYmFzZTsKKworCS8qIGNsZWFyIHRoZSBSQU1Cb290IGFuZCB0aGUgUmVzZXQgYml0ICovCisJcmVnID0gcmVhZGwoZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQ7CisJcmVnICY9IH5JU0wzOFhYX0NUUkxfU1RBVF9SQU1CT09UOworCXdyaXRlbChyZWcsIGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsKKwl3bWIoKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworCS8qIHNldCB0aGUgUmVzZXQgYml0IHdpdGhvdXQgcmVhZGluZyB0aGUgcmVnaXN0ZXIgISAqLworCXJlZyB8PSBJU0wzOFhYX0NUUkxfU1RBVF9SRVNFVDsKKwl3cml0ZWwocmVnLCBkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRyk7CisJd21iKCk7CisJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7CisKKwkvKiBjbGVhciB0aGUgUmVzZXQgYml0ICovCisJcmVnICY9IH5JU0wzOFhYX0NUUkxfU1RBVF9SRVNFVDsKKwl3cml0ZWwocmVnLCBkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRyk7CisJd21iKCk7CisKKwkvKiB3YWl0IGEgd2hpbGUgZm9yIHRoZSBkZXZpY2UgdG8gcmVib290ICovCisJbWRlbGF5KDUwKTsKKworCXsKKwkJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeSA9IE5VTEw7CisJCWxvbmcgZndfbGVuOworCQljb25zdCB1MzIgKmZ3X3B0cjsKKworCQlyYyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBwcml2LT5maXJtd2FyZSwgUFJJU01fRldfUERFVik7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiByZXF1ZXN0X2Zpcm13YXJlKCkgZmFpbGVkIGZvciAnJXMnXG4iLAorCQkJICAgICAgICJwcmlzbTU0IiwgcHJpdi0+ZmlybXdhcmUpOworCQkJcmV0dXJuIHJjOworCQl9CisJCS8qIHByZXBhcmUgdGhlIERpcmVjdCBNZW1vcnkgQmFzZSByZWdpc3RlciAqLworCQlyZWcgPSBJU0wzOFhYX0RFVl9GSVJNV0FSRV9BRERSRVM7CisKKwkJZndfcHRyID0gKHUzMiAqKSBmd19lbnRyeS0+ZGF0YTsKKwkJZndfbGVuID0gZndfZW50cnktPnNpemU7CisKKwkJaWYgKGZ3X2xlbiAlIDQpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogZmlybXdhcmUgJyVzJyBzaXplIGlzIG5vdCBtdWx0aXBsZSBvZiAzMmJpdCwgYWJvcnRpbmchXG4iLAorCQkJICAgICAgICJwcmlzbTU0IiwgcHJpdi0+ZmlybXdhcmUpOworCQkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJCQlyZXR1cm4gLUVJTFNFUTsgLyogSWxsZWdhbCBieXRlIHNlcXVlbmNlICAqLzsKKwkJfQorCisJCXdoaWxlIChmd19sZW4gPiAwKSB7CisJCQlsb25nIF9md19sZW4gPQorCQkJICAgIChmd19sZW4gPgorCQkJICAgICBJU0wzOFhYX01FTU9SWV9XSU5ET1dfU0laRSkgPworCQkJICAgIElTTDM4WFhfTUVNT1JZX1dJTkRPV19TSVpFIDogZndfbGVuOworCQkJdTMyIF9faW9tZW0gKmRldl9md19wdHIgPSBkZXZpY2VfYmFzZSArIElTTDM4WFhfRElSRUNUX01FTV9XSU47CisKKwkJCS8qIHNldCB0aGUgY2FyZHMgYmFzZSBhZGRyZXNzIGZvciB3cml0dGluZyB0aGUgZGF0YSAqLworCQkJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNlX2Jhc2UsIHJlZywKKwkJCQkJICBJU0wzOFhYX0RJUl9NRU1fQkFTRV9SRUcpOworCQkJd21iKCk7CS8qIGJlIHBhcmFub2lkICovCisKKwkJCS8qIGluY3JlbWVudCB0aGUgd3JpdGUgYWRkcmVzcyBmb3IgbmV4dCBpdGVyYXRpb24gKi8KKwkJCXJlZyArPSBfZndfbGVuOworCQkJZndfbGVuIC09IF9md19sZW47CisKKwkJCS8qIHdyaXRlIHRoZSBkYXRhIHRvIHRoZSBEaXJlY3QgTWVtb3J5IFdpbmRvdyAzMmJpdC13aXNlICovCisJCQkvKiBtZW1jcHlfdG9pbygpIGRvZXNuJ3QgZ3VhcmFudGVlIDMyYml0IHdyaXRlcyA6LXwgKi8KKwkJCXdoaWxlIChfZndfbGVuID4gMCkgeworCQkJCS8qIHVzZSBub24tc3dhcHBpbmcgd3JpdGVsKCkgKi8KKwkJCQlfX3Jhd193cml0ZWwoKmZ3X3B0ciwgZGV2X2Z3X3B0cik7CisJCQkJZndfcHRyKyssIGRldl9md19wdHIrKzsKKwkJCQlfZndfbGVuIC09IDQ7CisJCQl9CisKKwkJCS8qIGZsdXNoIFBDSSBwb3N0aW5nICovCisJCQkodm9pZCkgcmVhZGwoZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX1BDSV9QT1NUSU5HX0ZMVVNIKTsKKwkJCXdtYigpOwkvKiBiZSBwYXJhbm9pZCBhZ2FpbiAqLworCisJCQlCVUdfT04oX2Z3X2xlbiAhPSAwKTsKKwkJfQorCisJCUJVR19PTihmd19sZW4gIT0gMCk7CisKKwkJLyogRmlybXdhcmUgdmVyc2lvbiBpcyBhdCBvZmZzZXQgNDAgKGFsc28gZm9yICJuZXdtYWMiKSAqLworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZpcm13YXJlIHZlcnNpb246ICUuOHNcbiIsCisJCSAgICAgICBwcml2LT5uZGV2LT5uYW1lLCBmd19lbnRyeS0+ZGF0YSArIDQwKTsKKworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKKwl9CisKKwkvKiBub3cgcmVzZXQgdGhlIGRldmljZQorCSAqIGNsZWFyIHRoZSBSZXNldCAmIENsa1J1biBiaXQsIHNldCB0aGUgUkFNQm9vdCBiaXQgKi8KKwlyZWcgPSByZWFkbChkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRyk7CisJcmVnICY9IH5JU0wzOFhYX0NUUkxfU1RBVF9DTEtSVU47CisJcmVnICY9IH5JU0wzOFhYX0NUUkxfU1RBVF9SRVNFVDsKKwlyZWcgfD0gSVNMMzhYWF9DVFJMX1NUQVRfUkFNQk9PVDsKKwlpc2wzOHh4X3czMl9mbHVzaChkZXZpY2VfYmFzZSwgcmVnLCBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCXdtYigpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisJLyogc2V0IHRoZSByZXNldCBiaXQgbGF0Y2hlcyB0aGUgaG9zdCBvdmVycmlkZSBhbmQgUkFNQm9vdCBiaXRzCisJICogaW50byB0aGUgZGV2aWNlIGZvciBvcGVyYXRpb24gd2hlbiB0aGUgcmVzZXQgYml0IGlzIHJlc2V0ICovCisJcmVnIHw9IElTTDM4WFhfQ1RSTF9TVEFUX1JFU0VUOworCXdyaXRlbChyZWcsIGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsKKwkvKiBkb24ndCBkbyBmbHVzaCBQQ0kgcG9zdGluZyBoZXJlISAqLworCXdtYigpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisJLyogY2xlYXIgdGhlIHJlc2V0IGJpdCBzaG91bGQgc3RhcnQgdGhlIHdob2xlIGNpcmN1cyAqLworCXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQ7CisJd3JpdGVsKHJlZywgZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCS8qIGRvbid0IGRvIGZsdXNoIFBDSSBwb3N0aW5nIGhlcmUhICovCisJd21iKCk7CisJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIERldmljZSBJbnRlcnJ1cHQgSGFuZGxlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpcnFyZXR1cm5fdAoraXNscGNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpjb25maWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiByZWc7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBjb25maWc7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwcml2LT5uZGV2OworCXZvaWQgX19pb21lbSAqZGV2aWNlID0gcHJpdi0+ZGV2aWNlX2Jhc2U7CisJaW50IHBvd2Vyc3RhdGUgPSBJU0wzOFhYX1BTTV9QT1dFUlNBVkVfU1RBVEU7CisKKwkvKiBsb2NrIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCXNwaW5fbG9jaygmcHJpdi0+c2xvY2spOworCisJLyogcmVjZWl2ZWQgYW4gaW50ZXJydXB0IHJlcXVlc3Qgb24gYSBzaGFyZWQgSVJRIGxpbmUKKwkgKiBmaXJzdCBjaGVjayB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgaW4gc2xlZXAgbW9kZSAqLworCXJlZyA9IHJlYWRsKGRldmljZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRyk7CisJaWYgKHJlZyAmIElTTDM4WFhfQ1RSTF9TVEFUX1NMRUVQTU9ERSkKKwkJLyogZGV2aWNlIGlzIGluIHNsZWVwIG1vZGUsIElSUSB3YXMgZ2VuZXJhdGVkIGJ5IHNvbWVvbmUgZWxzZSAqLworCXsKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQlERUJVRyhTSE9XX1RSQUNJTkcsICJBc3N1bWluZyBzb21lb25lIGVsc2UgY2FsbGVkIHRoZSBJUlFcbiIpOworI2VuZGlmCisJCXNwaW5fdW5sb2NrKCZwcml2LT5zbG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKworCS8qIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYW55IHNvdXJjZSBvZiBpbnRlcnJ1cHQgb24gdGhlIGRldmljZSAqLworCXJlZyA9IHJlYWRsKGRldmljZSArIElTTDM4WFhfSU5UX0lERU5UX1JFRyk7CisKKwkvKiBhbHNvIGNoZWNrIHRoZSBjb250ZW50cyBvZiB0aGUgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciwgYmVjYXVzZSB0aGlzCisJICogd2lsbCBmaWx0ZXIgb3V0IGludGVycnVwdCBzb3VyY2VzIGZyb20gb3RoZXIgZGV2aWNlcyBvbiB0aGUgc2FtZSBpcnEgISAqLworCXJlZyAmPSByZWFkbChkZXZpY2UgKyBJU0wzOFhYX0lOVF9FTl9SRUcpOworCXJlZyAmPSBJU0wzOFhYX0lOVF9TT1VSQ0VTOworCisJaWYgKHJlZyAhPSAwKSB7CisJCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpICE9IFBSVl9TVEFURV9TTEVFUCkKKwkJCXBvd2Vyc3RhdGUgPSBJU0wzOFhYX1BTTV9BQ1RJVkVfU1RBVEU7CisKKwkJLyogcmVzZXQgdGhlIHJlcXVlc3QgYml0cyBpbiB0aGUgSWRlbnRpZmljYXRpb24gcmVnaXN0ZXIgKi8KKwkJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNlLCByZWcsIElTTDM4WFhfSU5UX0FDS19SRUcpOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywKKwkJICAgICAgIklSUTogSWRlbnRpZmljYXRpb24gcmVnaXN0ZXIgMHglcCAweCV4IFxuIiwgZGV2aWNlLCByZWcpOworI2VuZGlmCisKKwkJLyogY2hlY2sgZm9yIGVhY2ggYml0IGluIHRoZSByZWdpc3RlciBzZXBhcmF0ZWx5ICovCisJCWlmIChyZWcgJiBJU0wzOFhYX0lOVF9JREVOVF9VUERBVEUpIHsKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQkJLyogUXVldWUgaGFzIGJlZW4gdXBkYXRlZCAqLworCQkJREVCVUcoU0hPV19UUkFDSU5HLCAiSVJROiBVcGRhdGUgZmxhZyBcbiIpOworCisJCQlERUJVRyhTSE9XX1FVRVVFX0lOREVYRVMsCisJCQkgICAgICAiQ0IgZHJ2IFFzOiBbJWldWyVpXVslaV1bJWldWyVpXVslaV1cbiIsCisJCQkgICAgICBsZTMyX3RvX2NwdShwcml2LT5jb250cm9sX2Jsb2NrLT4KKwkJCQkJICBkcml2ZXJfY3Vycl9mcmFnWzBdKSwKKwkJCSAgICAgIGxlMzJfdG9fY3B1KHByaXYtPmNvbnRyb2xfYmxvY2stPgorCQkJCQkgIGRyaXZlcl9jdXJyX2ZyYWdbMV0pLAorCQkJICAgICAgbGUzMl90b19jcHUocHJpdi0+Y29udHJvbF9ibG9jay0+CisJCQkJCSAgZHJpdmVyX2N1cnJfZnJhZ1syXSksCisJCQkgICAgICBsZTMyX3RvX2NwdShwcml2LT5jb250cm9sX2Jsb2NrLT4KKwkJCQkJICBkcml2ZXJfY3Vycl9mcmFnWzNdKSwKKwkJCSAgICAgIGxlMzJfdG9fY3B1KHByaXYtPmNvbnRyb2xfYmxvY2stPgorCQkJCQkgIGRyaXZlcl9jdXJyX2ZyYWdbNF0pLAorCQkJICAgICAgbGUzMl90b19jcHUocHJpdi0+Y29udHJvbF9ibG9jay0+CisJCQkJCSAgZHJpdmVyX2N1cnJfZnJhZ1s1XSkKKwkJCSAgICApOworCisJCQlERUJVRyhTSE9XX1FVRVVFX0lOREVYRVMsCisJCQkgICAgICAiQ0IgZGV2IFFzOiBbJWldWyVpXVslaV1bJWldWyVpXVslaV1cbiIsCisJCQkgICAgICBsZTMyX3RvX2NwdShwcml2LT5jb250cm9sX2Jsb2NrLT4KKwkJCQkJICBkZXZpY2VfY3Vycl9mcmFnWzBdKSwKKwkJCSAgICAgIGxlMzJfdG9fY3B1KHByaXYtPmNvbnRyb2xfYmxvY2stPgorCQkJCQkgIGRldmljZV9jdXJyX2ZyYWdbMV0pLAorCQkJICAgICAgbGUzMl90b19jcHUocHJpdi0+Y29udHJvbF9ibG9jay0+CisJCQkJCSAgZGV2aWNlX2N1cnJfZnJhZ1syXSksCisJCQkgICAgICBsZTMyX3RvX2NwdShwcml2LT5jb250cm9sX2Jsb2NrLT4KKwkJCQkJICBkZXZpY2VfY3Vycl9mcmFnWzNdKSwKKwkJCSAgICAgIGxlMzJfdG9fY3B1KHByaXYtPmNvbnRyb2xfYmxvY2stPgorCQkJCQkgIGRldmljZV9jdXJyX2ZyYWdbNF0pLAorCQkJICAgICAgbGUzMl90b19jcHUocHJpdi0+Y29udHJvbF9ibG9jay0+CisJCQkJCSAgZGV2aWNlX2N1cnJfZnJhZ1s1XSkKKwkJCSAgICApOworI2VuZGlmCisKKwkJCS8qIGNsZWFudXAgdGhlIGRhdGEgbG93IHRyYW5zbWl0IHF1ZXVlICovCisJCQlpc2xwY2lfZXRoX2NsZWFudXBfdHJhbnNtaXQocHJpdiwgcHJpdi0+Y29udHJvbF9ibG9jayk7CisKKwkJCS8qIGRldmljZSBpcyBpbiBhY3RpdmUgc3RhdGUsIHVwZGF0ZSB0aGUKKwkJCSAqIHBvd2Vyc3RhdGUgZmxhZyBpZiBuZWNlc3NhcnkgKi8KKwkJCXBvd2Vyc3RhdGUgPSBJU0wzOFhYX1BTTV9BQ1RJVkVfU1RBVEU7CisKKwkJCS8qIGNoZWNrIGFsbCB0aHJlZSBxdWV1ZXMgaW4gcHJpb3JpdHkgb3JkZXIKKwkJCSAqIGNhbGwgdGhlIFBJTUZPUiByZWNlaXZlIGZ1bmN0aW9uIHVudGlsIHRoZQorCQkJICogcXVldWUgaXMgZW1wdHkgKi8KKwkJCWlmIChpc2wzOHh4X2luX3F1ZXVlKHByaXYtPmNvbnRyb2xfYmxvY2ssCisJCQkJCQlJU0wzOFhYX0NCX1JYX01HTVRRKSAhPSAwKSB7CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCQlERUJVRyhTSE9XX1RSQUNJTkcsCisJCQkJICAgICAgIlJlY2VpdmVkIGZyYW1lIGluIE1hbmFnZW1lbnQgUXVldWVcbiIpOworI2VuZGlmCisJCQkJaXNscGNpX21ndF9yZWNlaXZlKG5kZXYpOworCisJCQkJaXNscGNpX21ndF9jbGVhbnVwX3RyYW5zbWl0KG5kZXYpOworCisJCQkJLyogUmVmaWxsIHNsb3RzIGluIHJlY2VpdmUgcXVldWUgKi8KKwkJCQlpc2xwY2lfbWdtdF9yeF9maWxsKG5kZXYpOworCisJCQkJLyogbm8gbmVlZCB0byB0cmlnZ2VyIHRoZSBkZXZpY2UsIG5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNscGNpX21ndF90cmFuc2FjdGlvbiBkb2VzIGl0ICovCisJCQl9CisKKwkJCXdoaWxlIChpc2wzOHh4X2luX3F1ZXVlKHByaXYtPmNvbnRyb2xfYmxvY2ssCisJCQkJCQlJU0wzOFhYX0NCX1JYX0RBVEFfTFEpICE9IDApIHsKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQkJCURFQlVHKFNIT1dfVFJBQ0lORywKKwkJCQkgICAgICAiUmVjZWl2ZWQgZnJhbWUgaW4gRGF0YSBMb3cgUXVldWUgXG4iKTsKKyNlbmRpZgorCQkJCWlzbHBjaV9ldGhfcmVjZWl2ZShwcml2KTsKKwkJCX0KKworCQkJLyogY2hlY2sgd2hldGhlciB0aGUgZGF0YSB0cmFuc21pdCBxdWV1ZXMgd2VyZSBmdWxsICovCisJCQlpZiAocHJpdi0+ZGF0YV9sb3dfdHhfZnVsbCkgeworCQkJCS8qIGNoZWNrIHdoZXRoZXIgdGhlIHRyYW5zbWl0IGlzIG5vdCBmdWxsIGFueW1vcmUgKi8KKwkJCQlpZiAoSVNMMzhYWF9DQl9UWF9RU0laRSAtCisJCQkJICAgIGlzbDM4eHhfaW5fcXVldWUocHJpdi0+Y29udHJvbF9ibG9jaywKKwkJCQkJCSAgICAgSVNMMzhYWF9DQl9UWF9EQVRBX0xRKSA+PQorCQkJCSAgICBJU0wzOFhYX01JTl9RVEhSRVNIT0xEKSB7CisJCQkJCS8qIG5vcGUsIHRoZSBkcml2ZXIgaXMgcmVhZHkgZm9yIG1vcmUgbmV0d29yayBmcmFtZXMgKi8KKwkJCQkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5uZGV2KTsKKworCQkJCQkvKiByZXNldCB0aGUgZnVsbCBmbGFnICovCisJCQkJCXByaXYtPmRhdGFfbG93X3R4X2Z1bGwgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChyZWcgJiBJU0wzOFhYX0lOVF9JREVOVF9JTklUKSB7CisJCQkvKiBEZXZpY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQkJREVCVUcoU0hPV19UUkFDSU5HLAorCQkJICAgICAgIklSUTogSW5pdCBmbGFnLCBkZXZpY2UgaW5pdGlhbGl6ZWQgXG4iKTsKKyNlbmRpZgorCQkJd2FrZV91cCgmcHJpdi0+cmVzZXRfZG9uZSk7CisJCX0KKworCQlpZiAocmVnICYgSVNMMzhYWF9JTlRfSURFTlRfU0xFRVApIHsKKwkJCS8qIERldmljZSBpbnRlbmRzIHRvIG1vdmUgdG8gcG93ZXJzYXZlIHN0YXRlICovCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywgIklSUTogU2xlZXAgZmxhZyBcbiIpOworI2VuZGlmCisJCQlpc2wzOHh4X2hhbmRsZV9zbGVlcF9yZXF1ZXN0KHByaXYtPmNvbnRyb2xfYmxvY2ssCisJCQkJCQkgICAgICZwb3dlcnN0YXRlLAorCQkJCQkJICAgICBwcml2LT5kZXZpY2VfYmFzZSk7CisJCX0KKworCQlpZiAocmVnICYgSVNMMzhYWF9JTlRfSURFTlRfV0FLRVVQKSB7CisJCQkvKiBEZXZpY2UgaGFzIGJlZW4gd29rZW4gdXAgdG8gYWN0aXZlIHN0YXRlICovCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywgIklSUTogV2FrZXVwIGZsYWcgXG4iKTsKKyNlbmRpZgorCisJCQlpc2wzOHh4X2hhbmRsZV93YWtldXAocHJpdi0+Y29udHJvbF9ibG9jaywKKwkJCQkJICAgICAgJnBvd2Vyc3RhdGUsIHByaXYtPmRldmljZV9iYXNlKTsKKwkJfQorCX0gZWxzZSB7CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJREVCVUcoU0hPV19UUkFDSU5HLCAiQXNzdW1pbmcgc29tZW9uZSBlbHNlIGNhbGxlZCB0aGUgSVJRXG4iKTsKKyNlbmRpZgorCQlzcGluX3VubG9jaygmcHJpdi0+c2xvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJLyogc2xlZXAgLT4gcmVhZHkgKi8KKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA9PSBQUlZfU1RBVEVfU0xFRVAKKwkgICAgJiYgcG93ZXJzdGF0ZSA9PSBJU0wzOFhYX1BTTV9BQ1RJVkVfU1RBVEUpCisJCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX1JFQURZKTsKKworCS8qICFzbGVlcCAtPiBzbGVlcCAqLworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpICE9IFBSVl9TVEFURV9TTEVFUAorCSAgICAmJiBwb3dlcnN0YXRlID09IElTTDM4WFhfUFNNX1BPV0VSU0FWRV9TVEFURSkKKwkJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfU0xFRVApOworCisJLyogdW5sb2NrIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCXNwaW5fdW5sb2NrKCZwcml2LT5zbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBOZXR3b3JrIEludGVyZmFjZSBDb250cm9sICYgU3RhdGlzdGljYWwgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50Citpc2xwY2lfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwl1MzIgcmM7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCS8qIHJlc2V0IGRhdGEgc3RydWN0dXJlcywgdXBsb2FkIGZpcm13YXJlIGFuZCByZXNldCBkZXZpY2UgKi8KKwlyYyA9IGlzbHBjaV9yZXNldChwcml2LDEpOworCWlmIChyYykgeworCQlwcmlzbTU0X2JyaW5nX2Rvd24ocHJpdik7CisJCXJldHVybiByYzsgLyogUmV0dXJucyBpbmZvcm1hdGl2ZSBtZXNzYWdlICovCisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUobmRldik7CisvKiAgICAgIG5ldGlmX21hcmtfdXAoIG5kZXYgKTsgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpc2xwY2lfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogaXNscGNpX2Nsb3NlICgpXG4iLCBuZGV2LT5uYW1lKTsKKworCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisKKwlyZXR1cm4gcHJpc201NF9icmluZ19kb3duKHByaXYpOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2JyaW5nX2Rvd24oaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpkZXZpY2VfYmFzZSA9IHByaXYtPmRldmljZV9iYXNlOworCXUzMiByZWc7CisJLyogd2UgYXJlIGdvaW5nIHRvIHNodXRkb3duIHRoZSBkZXZpY2UgKi8KKwlpc2xwY2lfc2V0X3N0YXRlKHByaXYsIFBSVl9TVEFURV9QUkVCT09UKTsKKworCS8qIGRpc2FibGUgYWxsIGRldmljZSBpbnRlcnJ1cHRzIGluIGNhc2UgdGhleSB3ZXJlbid0ICovCisJaXNsMzh4eF9kaXNhYmxlX2ludGVycnVwdHMocHJpdi0+ZGV2aWNlX2Jhc2UpOyAgCisKKwkvKiBGb3Igc2FmZXR5IHJlYXNvbnMsIHdlIG1heSB3YW50IHRvIGVuc3VyZSB0aGF0IG5vIERNQSB0cmFuc2ZlciBpcworCSAqIGN1cnJlbnRseSBpbiBwcm9ncmVzcyBieSBlbXB0eWluZyB0aGUgVFggYW5kIFJYIHF1ZXVlcy4gKi8KKworCS8qIHdhaXQgdW50aWwgaW50ZXJydXB0cyBoYXZlIGZpbmlzaGVkIGV4ZWN1dGluZyBvbiBvdGhlciBDUFVzICovCisJc3luY2hyb25pemVfaXJxKHByaXYtPnBkZXYtPmlycSk7CisKKwlyZWcgPSByZWFkbChkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRyk7CisJcmVnICY9IH4oSVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQgfCBJU0wzOFhYX0NUUkxfU1RBVF9SQU1CT09UKTsKKwl3cml0ZWwocmVnLCBkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRyk7CisJd21iKCk7CisJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7CisKKwlyZWcgfD0gSVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQ7CisJd3JpdGVsKHJlZywgZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCXdtYigpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisJLyogY2xlYXIgdGhlIFJlc2V0IGJpdCAqLworCXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQ7CisJd3JpdGVsKHJlZywgZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCXdtYigpOworCisJLyogd2FpdCBhIHdoaWxlIGZvciB0aGUgZGV2aWNlIHRvIHJlc2V0ICovCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoNTAqSFovMTAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNscGNpX3VwbG9hZF9mdyhpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwlpc2xwY2lfc3RhdGVfdCBvbGRfc3RhdGU7CisJdTMyIHJjOworCisJb2xkX3N0YXRlID0gaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfQk9PVCk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHVwbG9hZGluZyBmaXJtd2FyZS4uLlxuIiwgcHJpdi0+bmRldi0+bmFtZSk7CisKKwlyYyA9IGlzbF91cGxvYWRfZmlybXdhcmUocHJpdik7CisJaWYgKHJjKSB7CisJCS8qIGVycm9yIHVwbG9hZGluZyB0aGUgZmlybXdhcmUgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IHVwbG9hZCBmaXJtd2FyZSAoJyVzJylcbiIsCisJCSAgICAgICBwcml2LT5uZGV2LT5uYW1lLCBwcml2LT5maXJtd2FyZSk7CisKKwkJaXNscGNpX3NldF9zdGF0ZShwcml2LCBvbGRfc3RhdGUpOworCQlyZXR1cm4gcmM7CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmaXJtd2FyZSB1cGxvYWQgY29tcGxldGVcbiIsCisJICAgICAgIHByaXYtPm5kZXYtPm5hbWUpOworCisJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfUE9TVEJPT1QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzbHBjaV9yZXNldF9pZihpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwlsb25nIHJlbWFpbmluZzsKKwlpbnQgcmVzdWx0ID0gLUVUSU1FOworCWludCBjb3VudDsKKworCURFRklORV9XQUlUKHdhaXQpOworCXByZXBhcmVfdG9fd2FpdCgmcHJpdi0+cmVzZXRfZG9uZSwgJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkKKwkvKiBub3cgdGhlIGxhc3Qgc3RlcCBpcyB0byByZXNldCB0aGUgaW50ZXJmYWNlICovCisJaXNsMzh4eF9pbnRlcmZhY2VfcmVzZXQocHJpdi0+ZGV2aWNlX2Jhc2UsIHByaXYtPmRldmljZV9ob3N0X2FkZHJlc3MpOworCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX1BSRUlOSVQpOworCisgICAgICAgIGZvcihjb3VudCA9IDA7IGNvdW50IDwgMiAmJiByZXN1bHQ7IGNvdW50KyspIHsKKwkJLyogVGhlIHNvZnR3YXJlIHJlc2V0IGFja25vd2xlZGdlIG5lZWRzIGFib3V0IDIyMCBtc2VjIGhlcmUuCisJCSAqIEJlIGNvbnNlcnZhdGl2ZSBhbmQgd2FpdCBmb3IgdXAgdG8gb25lIHNlY29uZC4gKi8KKwkKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlyZW1haW5pbmcgPSBzY2hlZHVsZV90aW1lb3V0KEhaKTsKKworCQlpZihyZW1haW5pbmcgPiAwKSB7CisJCQlyZXN1bHQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBJZiB3ZSdyZSBoZXJlIGl0J3MgYmVjYXVzZSBvdXIgSVJRIGhhc24ndCB5ZXQgZ29uZSB0aHJvdWdoLiAKKwkJICogUmV0cnkgYSBiaXQgbW9yZS4uLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gJ3Jlc2V0IGNvbXBsZXRlJyBJUlEgc2VlbiAtIHJldHJ5aW5nXG4iLAorCQkJcHJpdi0+bmRldi0+bmFtZSk7CisJfQorCisJZmluaXNoX3dhaXQoJnByaXYtPnJlc2V0X2RvbmUsICZ3YWl0KTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW50ZXJmYWNlIHJlc2V0IGZhaWx1cmVcbiIsIHByaXYtPm5kZXYtPm5hbWUpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX0lOSVQpOworCisJLyogTm93IHRoYXQgdGhlIGRldmljZSBpcyAxMDAlIHVwLCBsZXQncyBhbGxvdworCSAqIGZvciB0aGUgb3RoZXIgaW50ZXJydXB0cyAtLQorCSAqIE5PVEU6IHRoaXMgaXMgbm90ICp5ZXQqIHRydWUgc2luY2Ugd2UndmUgb25seSBhbGxvd2VkIHRoZSAKKwkgKiBJTklUIGludGVycnVwdCBvbiB0aGUgSVJRIGxpbmUuIFdlIGNhbiBwZXJoYXBzIHBvbGwKKwkgKiB0aGUgSVJRIGxpbmUgdW50aWwgd2Uga25vdyBmb3Igc3VyZSB0aGUgcmVzZXQgd2VudCB0aHJvdWdoICovCisJaXNsMzh4eF9lbmFibGVfY29tbW9uX2ludGVycnVwdHMocHJpdi0+ZGV2aWNlX2Jhc2UpOworCisJZG93bl93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisJcmVzdWx0ID0gbWd0X2NvbW1pdChwcml2KTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludGVyZmFjZSByZXNldCBmYWlsdXJlXG4iLCBwcml2LT5uZGV2LT5uYW1lKTsKKwkJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwl1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisKKwlpc2xwY2lfc2V0X3N0YXRlKHByaXYsIFBSVl9TVEFURV9SRUFEWSk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludGVyZmFjZSByZXNldCBjb21wbGV0ZVxuIiwgcHJpdi0+bmRldi0+bmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludAoraXNscGNpX3Jlc2V0KGlzbHBjaV9wcml2YXRlICpwcml2LCBpbnQgcmVsb2FkX2Zpcm13YXJlKQoreworCWlzbDM4eHhfY29udHJvbF9ibG9jayAqY2IgPSAgICAvKiB2b2xhdGlsZSBub3QgbmVlZGVkICovCisJCShpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKikgcHJpdi0+Y29udHJvbF9ibG9jazsKKwl1bnNpZ25lZCBjb3VudGVyOworCWludCByYzsKKworCWlmIChyZWxvYWRfZmlybXdhcmUpCisJCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX1BSRUJPT1QpOworCWVsc2UKKwkJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfUE9TVEJPT1QpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZXNldHRpbmcgZGV2aWNlLi4uXG4iLCBwcml2LT5uZGV2LT5uYW1lKTsKKworCS8qIGRpc2FibGUgYWxsIGRldmljZSBpbnRlcnJ1cHRzIGluIGNhc2UgdGhleSB3ZXJlbid0ICovCisJaXNsMzh4eF9kaXNhYmxlX2ludGVycnVwdHMocHJpdi0+ZGV2aWNlX2Jhc2UpOworCisJLyogZmx1c2ggYWxsIG1hbmFnZW1lbnQgcXVldWVzICovCisJcHJpdi0+aW5kZXhfbWdtdF90eCA9IDA7CisJcHJpdi0+aW5kZXhfbWdtdF9yeCA9IDA7CisKKwkvKiBjbGVhciB0aGUgaW5kZXhlcyBpbiB0aGUgZnJhbWUgcG9pbnRlciAqLworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBJU0wzOFhYX0NCX1FDT1VOVDsgY291bnRlcisrKSB7CisJCWNiLT5kcml2ZXJfY3Vycl9mcmFnW2NvdW50ZXJdID0gY3B1X3RvX2xlMzIoMCk7CisJCWNiLT5kZXZpY2VfY3Vycl9mcmFnW2NvdW50ZXJdID0gY3B1X3RvX2xlMzIoMCk7CisJfQorCisJLyogcmVzZXQgdGhlIG1nbXQgcmVjZWl2ZSBxdWV1ZSAqLworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBJU0wzOFhYX0NCX01HTVRfUVNJWkU7IGNvdW50ZXIrKykgeworCQlpc2wzOHh4X2ZyYWdtZW50ICpmcmFnID0gJmNiLT5yeF9kYXRhX21nbXRbY291bnRlcl07CisJCWZyYWctPnNpemUgPSBjcHVfdG9fbGUxNihNR01UX0ZSQU1FX1NJWkUpOworCQlmcmFnLT5mbGFncyA9IDA7CisJCWZyYWctPmFkZHJlc3MgPSBjcHVfdG9fbGUzMihwcml2LT5tZ210X3J4W2NvdW50ZXJdLnBjaV9hZGRyKTsKKwl9CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgSVNMMzhYWF9DQl9SWF9RU0laRTsgY291bnRlcisrKSB7CisJCWNiLT5yeF9kYXRhX2xvd1tjb3VudGVyXS5hZGRyZXNzID0KKwkJICAgIGNwdV90b19sZTMyKCh1MzIpIHByaXYtPnBjaV9tYXBfcnhfYWRkcmVzc1tjb3VudGVyXSk7CisJfQorCisJLyogc2luY2UgdGhlIHJlY2VpdmUgcXVldWVzIGFyZSBmaWxsZWQgd2l0aCBlbXB0eSBmcmFnbWVudHMsIG5vdyB3ZSBjYW4KKwkgKiBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXhlcyBpbiB0aGUgQ29udHJvbCBCbG9jayAqLworCXByaXYtPmNvbnRyb2xfYmxvY2stPmRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9SWF9EQVRBX0xRXSA9CisJICAgIGNwdV90b19sZTMyKElTTDM4WFhfQ0JfUlhfUVNJWkUpOworCXByaXYtPmNvbnRyb2xfYmxvY2stPmRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9SWF9NR01UUV0gPQorCSAgICBjcHVfdG9fbGUzMihJU0wzOFhYX0NCX01HTVRfUVNJWkUpOworCisJLyogcmVzZXQgdGhlIHJlbWFpbmluZyByZWFsIGluZGV4IHJlZ2lzdGVycyBhbmQgZnVsbCBmbGFncyAqLworCXByaXYtPmZyZWVfZGF0YV9yeCA9IDA7CisJcHJpdi0+ZnJlZV9kYXRhX3R4ID0gMDsKKwlwcml2LT5kYXRhX2xvd190eF9mdWxsID0gMDsKKworCWlmIChyZWxvYWRfZmlybXdhcmUpIHsgLyogU2hvdWxkIHdlIGxvYWQgdGhlIGZpcm13YXJlID8gKi8KKwkvKiBub3cgdGhhdCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBjbGVhbmVkIHVwLCB1cGxvYWQKKwkgKiBmaXJtd2FyZSBhbmQgcmVzZXQgaW50ZXJmYWNlICovCisJCXJjID0gaXNscGNpX3VwbG9hZF9mdyhwcml2KTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpc2xwY2lfcmVzZXQ6IGZhaWx1cmVcbiIsCisJCQkJcHJpdi0+bmRldi0+bmFtZSk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwkvKiBmaW5hbGx5IHJlc2V0IGludGVyZmFjZSAqLworCXJjID0gaXNscGNpX3Jlc2V0X2lmKHByaXYpOworCWlmIChyYykKKwkJcHJpbnRrKEtFUk5fRVJSICJwcmlzbTU0OiBZb3VyIGNhcmQvc29ja2V0IG1heSBiZSBmYXVsdHksIG9yIElSUSBsaW5lIHRvbyBidXN5IDooXG4iKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitpc2xwY2lfc3RhdGlzdGljcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0ZVTkNUSU9OX0NBTExTLCAiaXNscGNpX3N0YXRpc3RpY3NcbiIpOworI2VuZGlmCisKKwlyZXR1cm4gJnByaXYtPnN0YXRpc3RpY3M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBOZXR3b3JrIGRldmljZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXNscGNpX2FsbG9jX21lbW9yeShpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgY291bnRlcjsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJcHJpbnRrKEtFUk5fREVCVUcgImlzbHBjaV9hbGxvY19tZW1vcnlcbiIpOworI2VuZGlmCisKKwkvKiByZW1hcCB0aGUgUENJIGRldmljZSBiYXNlIGFkZHJlc3MgdG8gYWNjZXNzYWJsZSAqLworCWlmICghKHByaXYtPmRldmljZV9iYXNlID0KKwkgICAgICBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwcml2LT5wZGV2LCAwKSwKKwkJICAgICAgSVNMMzhYWF9QQ0lfTUVNX1NJWkUpKSkgeworCQkvKiBlcnJvciBpbiByZW1hcHBpbmcgdGhlIFBDSSBkZXZpY2UgbWVtb3J5IGFkZHJlc3MgcmFuZ2UgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJQQ0kgbWVtb3J5IHJlbWFwcGluZyBmYWlsZWQgXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIG1lbW9yeSBsYXlvdXQgZm9yIGNvbnNpc3RlbnQgRE1BIHJlZ2lvbjoKKwkgKgorCSAqIEFyZWEgMTogQ29udHJvbCBCbG9jayBmb3IgdGhlIGRldmljZSBpbnRlcmZhY2UKKwkgKiBBcmVhIDI6IFBvd2VyIFNhdmUgTW9kZSBCdWZmZXIgZm9yIHRlbXBvcmFyeSBmcmFtZSBzdG9yYWdlLiBCZSBhd2FyZSB0aGF0CisJICogICAgICAgICB0aGUgbnVtYmVyIG9mIHN1cHBvcnRlZCBzdGF0aW9ucyBpbiB0aGUgQVAgZGV0ZXJtaW5lcyB0aGUgbWluaW1hbAorCSAqICAgICAgICAgc2l6ZSBvZiB0aGUgYnVmZmVyICEKKwkgKi8KKworCS8qIHBlcmZvcm0gdGhlIGFsbG9jYXRpb24gKi8KKwlwcml2LT5kcml2ZXJfbWVtX2FkZHJlc3MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwcml2LT5wZGV2LAorCQkJCQkJCUhPU1RfTUVNX0JMT0NLLAorCQkJCQkJCSZwcml2LT4KKwkJCQkJCQlkZXZpY2VfaG9zdF9hZGRyZXNzKTsKKworCWlmICghcHJpdi0+ZHJpdmVyX21lbV9hZGRyZXNzKSB7CisJCS8qIGVycm9yIGFsbG9jYXRpbmcgdGhlIGJsb2NrIG9mIFBDSSBtZW1vcnkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IGFsbG9jYXRlIERNQSBtZW1vcnksIGFib3J0aW5nISIsCisJCSAgICAgICAicHJpc201NCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogYXNzaWduIHRoZSBDb250cm9sIEJsb2NrIHRvIHRoZSBmaXJzdCBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgYXJlYSAqLworCXByaXYtPmNvbnRyb2xfYmxvY2sgPQorCSAgICAoaXNsMzh4eF9jb250cm9sX2Jsb2NrICopIHByaXYtPmRyaXZlcl9tZW1fYWRkcmVzczsKKworCS8qIHNldCB0aGUgUG93ZXIgU2F2ZSBCdWZmZXIgcG9pbnRlciBkaXJlY3RseSBiZWhpbmQgdGhlIENCICovCisJcHJpdi0+ZGV2aWNlX3BzbV9idWZmZXIgPQorCQlwcml2LT5kZXZpY2VfaG9zdF9hZGRyZXNzICsgQ09OVFJPTF9CTE9DS19TSVpFOworCisJLyogbWFrZSBzdXJlIGFsbCBidWZmZXIgcG9pbnRlcnMgYXJlIGluaXRpYWxpemVkICovCisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IElTTDM4WFhfQ0JfUUNPVU5UOyBjb3VudGVyKyspIHsKKwkJcHJpdi0+Y29udHJvbF9ibG9jay0+ZHJpdmVyX2N1cnJfZnJhZ1tjb3VudGVyXSA9IGNwdV90b19sZTMyKDApOworCQlwcml2LT5jb250cm9sX2Jsb2NrLT5kZXZpY2VfY3Vycl9mcmFnW2NvdW50ZXJdID0gY3B1X3RvX2xlMzIoMCk7CisJfQorCisJcHJpdi0+aW5kZXhfbWdtdF9yeCA9IDA7CisJbWVtc2V0KHByaXYtPm1nbXRfcngsIDAsIHNpemVvZihwcml2LT5tZ210X3J4KSk7CisJbWVtc2V0KHByaXYtPm1nbXRfdHgsIDAsIHNpemVvZihwcml2LT5tZ210X3R4KSk7CisKKwkvKiBhbGxvY2F0ZSByeCBxdWV1ZSBmb3IgbWFuYWdlbWVudCBmcmFtZXMgKi8KKwlpZiAoaXNscGNpX21nbXRfcnhfZmlsbChwcml2LT5uZGV2KSA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwkvKiBub3cgZ2V0IHRoZSBkYXRhIHJ4IHNrYidzICovCisJbWVtc2V0KHByaXYtPmRhdGFfbG93X3J4LCAwLCBzaXplb2YgKHByaXYtPmRhdGFfbG93X3J4KSk7CisJbWVtc2V0KHByaXYtPnBjaV9tYXBfcnhfYWRkcmVzcywgMCwgc2l6ZW9mIChwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3MpKTsKKworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBJU0wzOFhYX0NCX1JYX1FTSVpFOyBjb3VudGVyKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkvKiBhbGxvY2F0ZSBhbiBza19idWZmIGZvciByZWNlaXZlZCBkYXRhIGZyYW1lcyBzdG9yYWdlCisJCSAqIGVhY2ggZnJhbWUgb24gcmVjZWl2ZSBzaXplIGNvbnNpc3RzIG9mIDEgZnJhZ21lbnQKKwkJICogaW5jbHVkZSBhbnkgcmVxdWlyZWQgYWxsaWdubWVudCBvcGVyYXRpb25zICovCisJCWlmICghKHNrYiA9IGRldl9hbGxvY19za2IoTUFYX0ZSQUdNRU5UX1NJWkVfUlggKyAyKSkpIHsKKwkJCS8qIGVycm9yIGFsbG9jYXRpbmcgYW4gc2tfYnVmZiBzdHJ1Y3R1cmUgZWxlbWVudHMgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYWxsb2NhdGluZyBza2IuXG4iKTsKKwkJCXNrYiA9IE5VTEw7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCXNrYl9yZXNlcnZlKHNrYiwgKDQgLSAobG9uZykgc2tiLT5kYXRhKSAmIDB4MDMpOworCQkvKiBhZGQgdGhlIG5ldyBhbGxvY2F0ZWQgc2tfYnVmZiB0byB0aGUgYnVmZmVyIGFycmF5ICovCisJCXByaXYtPmRhdGFfbG93X3J4W2NvdW50ZXJdID0gc2tiOworCisJCS8qIG1hcCB0aGUgYWxsb2NhdGVkIHNrYiBkYXRhIGFyZWEgdG8gcGNpICovCisJCXByaXYtPnBjaV9tYXBfcnhfYWRkcmVzc1tjb3VudGVyXSA9CisJCSAgICBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LCAodm9pZCAqKSBza2ItPmRhdGEsCisJCQkJICAgTUFYX0ZSQUdNRU5UX1NJWkVfUlggKyAyLAorCQkJCSAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWlmICghcHJpdi0+cGNpX21hcF9yeF9hZGRyZXNzW2NvdW50ZXJdKSB7CisJCQkvKiBlcnJvciBtYXBwaW5nIHRoZSBidWZmZXIgdG8gZGV2aWNlCisJCQkgICBhY2Nlc3NhYmxlIG1lbW9yeSBhZGRyZXNzICovCisJCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBtYXAgc2tiIERNQSdhYmxlXG4iKTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwl9CisKKwlwcmlzbTU0X2FjbF9pbml0KCZwcml2LT5hY2wpOworCXByaXNtNTRfd3BhX2llX2luaXQocHJpdik7CisJaWYgKG1ndF9pbml0KHByaXYpKSAKKwkJZ290byBvdXRfZnJlZTsKKworCXJldHVybiAwOworIG91dF9mcmVlOgorCWlzbHBjaV9mcmVlX21lbW9yeShwcml2KTsKKwlyZXR1cm4gLTE7Cit9CisKK2ludAoraXNscGNpX2ZyZWVfbWVtb3J5KGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCWludCBjb3VudGVyOworCisJaWYgKHByaXYtPmRldmljZV9iYXNlKQorCQlpb3VubWFwKHByaXYtPmRldmljZV9iYXNlKTsKKwlwcml2LT5kZXZpY2VfYmFzZSA9IE5VTEw7CisKKwkvKiBmcmVlIGNvbnNpc3RlbnQgRE1BIGFyZWEuLi4gKi8KKwlpZiAocHJpdi0+ZHJpdmVyX21lbV9hZGRyZXNzKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYtPnBkZXYsIEhPU1RfTUVNX0JMT0NLLAorCQkJCSAgICBwcml2LT5kcml2ZXJfbWVtX2FkZHJlc3MsCisJCQkJICAgIHByaXYtPmRldmljZV9ob3N0X2FkZHJlc3MpOworCisJLyogY2xlYXIgc29tZSBkYW5nbGluZyBwb2ludGVycyAqLworCXByaXYtPmRyaXZlcl9tZW1fYWRkcmVzcyA9IE5VTEw7CisJcHJpdi0+ZGV2aWNlX2hvc3RfYWRkcmVzcyA9IDA7CisJcHJpdi0+ZGV2aWNlX3BzbV9idWZmZXIgPSAwOworCXByaXYtPmNvbnRyb2xfYmxvY2sgPSBOVUxMOworCisgICAgICAgIC8qIGNsZWFuIHVwIG1nbXQgcnggYnVmZmVycyAqLworICAgICAgICBmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgSVNMMzhYWF9DQl9NR01UX1FTSVpFOyBjb3VudGVyKyspIHsKKwkJc3RydWN0IGlzbHBjaV9tZW1idWYgKmJ1ZiA9ICZwcml2LT5tZ210X3J4W2NvdW50ZXJdOworCQlpZiAoYnVmLT5wY2lfYWRkcikKKwkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgYnVmLT5wY2lfYWRkciwKKwkJCQkJIGJ1Zi0+c2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJYnVmLT5wY2lfYWRkciA9IDA7CisJCWlmIChidWYtPm1lbSkKKwkJCWtmcmVlKGJ1Zi0+bWVtKTsKKwkJYnVmLT5zaXplID0gMDsKKwkJYnVmLT5tZW0gPSBOVUxMOworICAgICAgICB9CisKKwkvKiBjbGVhbiB1cCBkYXRhIHJ4IGJ1ZmZlcnMgKi8KKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgSVNMMzhYWF9DQl9SWF9RU0laRTsgY291bnRlcisrKSB7CisJCWlmIChwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbY291bnRlcl0pCisJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsCisJCQkJCSBwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbY291bnRlcl0sCisJCQkJCSBNQVhfRlJBR01FTlRfU0laRV9SWCArIDIsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbY291bnRlcl0gPSAwOworCisJCWlmIChwcml2LT5kYXRhX2xvd19yeFtjb3VudGVyXSkKKwkJCWRldl9rZnJlZV9za2IocHJpdi0+ZGF0YV9sb3dfcnhbY291bnRlcl0pOworCQlwcml2LT5kYXRhX2xvd19yeFtjb3VudGVyXSA9IE5VTEw7CisJfQorCisJLyogRnJlZSB0aGUgYWNjZXMgY29udHJvbCBsaXN0IGFuZCB0aGUgV1BBIGxpc3QgKi8KKwlwcmlzbTU0X2FjbF9jbGVhbigmcHJpdi0+YWNsKTsKKwlwcmlzbTU0X3dwYV9pZV9jbGVhbihwcml2KTsKKwltZ3RfY2xlYW4ocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCitpc2xwY2lfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogcHV0IGRldmljZSBpbnRvIHByb21pc2MgbW9kZSBhbmQgbGV0IG5ldHdvcmsgbGF5ZXIgaGFuZGxlIGl0ICovCit9CisjZW5kaWYKKworc3RydWN0IG5ldF9kZXZpY2UgKgoraXNscGNpX3NldHVwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlzbHBjaV9wcml2YXRlICpwcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mIChpc2xwY2lfcHJpdmF0ZSkpOworCisJaWYgKCFuZGV2KQorCQlyZXR1cm4gbmRldjsKKworCVNFVF9NT0RVTEVfT1dORVIobmRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5kZXYpOworI2lmIGRlZmluZWQoU0VUX05FVERFVl9ERVYpCisJU0VUX05FVERFVl9ERVYobmRldiwgJnBkZXYtPmRldik7CisjZW5kaWYKKworCS8qIHNldHVwIHRoZSBzdHJ1Y3R1cmUgbWVtYmVycyAqLworCW5kZXYtPmJhc2VfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwluZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisKKwkvKiBpbml0aWFsaXplIHRoZSBmdW5jdGlvbiBwb2ludGVycyAqLworCW5kZXYtPm9wZW4gPSAmaXNscGNpX29wZW47CisJbmRldi0+c3RvcCA9ICZpc2xwY2lfY2xvc2U7CisJbmRldi0+Z2V0X3N0YXRzID0gJmlzbHBjaV9zdGF0aXN0aWNzOworCW5kZXYtPmdldF93aXJlbGVzc19zdGF0cyA9ICZwcmlzbTU0X2dldF93aXJlbGVzc19zdGF0czsKKwluZGV2LT5kb19pb2N0bCA9ICZwcmlzbTU0X2lvY3RsOworCW5kZXYtPndpcmVsZXNzX2hhbmRsZXJzID0KKwkgICAgKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSAmcHJpc201NF9oYW5kbGVyX2RlZjsKKworCW5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZpc2xwY2lfZXRoX3RyYW5zbWl0OworCS8qIG5kZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZpc2xwY2lfc2V0X211bHRpY2FzdF9saXN0OyAqLworCW5kZXYtPmFkZHJfbGVuID0gRVRIX0FMRU47CisJbmRldi0+c2V0X21hY19hZGRyZXNzID0gJnByaXNtNTRfc2V0X21hY19hZGRyZXNzOworCS8qIEdldCBhIG5vbi16ZXJvIGR1bW15IE1BQyBhZGRyZXNzIGZvciBuYW1laWYuIEplYW4gSUkgKi8KKwltZW1jcHkobmRldi0+ZGV2X2FkZHIsIGR1bW15X21hYywgNik7CisKKyNpZmRlZiBIQVZFX1RYX1RJTUVPVVQKKwluZGV2LT53YXRjaGRvZ190aW1lbyA9IElTTFBDSV9UWF9USU1FT1VUOworCW5kZXYtPnR4X3RpbWVvdXQgPSAmaXNscGNpX2V0aF90eF90aW1lb3V0OworI2VuZGlmCisKKwkvKiBhbGxvY2F0ZSBhIHByaXZhdGUgZGV2aWNlIHN0cnVjdHVyZSB0byB0aGUgbmV0d29yayBkZXZpY2UgICovCisJcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXByaXYtPm5kZXYgPSBuZGV2OworCXByaXYtPnBkZXYgPSBwZGV2OworCXByaXYtPm1vbml0b3JfdHlwZSA9IEFSUEhSRF9JRUVFODAyMTE7CisJcHJpdi0+bmRldi0+dHlwZSA9IChwcml2LT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgPworCQlwcml2LT5tb25pdG9yX3R5cGUgOiBBUlBIUkRfRVRIRVI7CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNgorCS8qIEFkZCBwb2ludGVycyB0byBlbmFibGUgaXdzcHkgc3VwcG9ydC4gKi8KKwlwcml2LT53aXJlbGVzc19kYXRhLnNweV9kYXRhID0gJnByaXYtPnNweV9kYXRhOworCW5kZXYtPndpcmVsZXNzX2RhdGEgPSAmcHJpdi0+d2lyZWxlc3NfZGF0YTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNiAqLworCisJLyogc2F2ZSB0aGUgc3RhcnQgYW5kIGVuZCBhZGRyZXNzIG9mIHRoZSBQQ0kgbWVtb3J5IGFyZWEgKi8KKwluZGV2LT5tZW1fc3RhcnQgPSAodW5zaWduZWQgbG9uZykgcHJpdi0+ZGV2aWNlX2Jhc2U7CisJbmRldi0+bWVtX2VuZCA9IG5kZXYtPm1lbV9zdGFydCArIElTTDM4WFhfUENJX01FTV9TSVpFOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX1RSQUNJTkcsICJQQ0kgTWVtb3J5IHJlbWFwcGVkIHRvIDB4JXBcbiIsIHByaXYtPmRldmljZV9iYXNlKTsKKyNlbmRpZgorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJpdi0+cmVzZXRfZG9uZSk7CisKKwkvKiBpbml0IHRoZSBxdWV1ZSByZWFkIGxvY2tzLCBwcm9jZXNzIHdhaXQgY291bnRlciAqLworCXNlbWFfaW5pdCgmcHJpdi0+bWdtdF9zZW0sIDEpOworCXByaXYtPm1nbXRfcmVjZWl2ZWQgPSBOVUxMOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPm1nbXRfd3F1ZXVlKTsKKwlzZW1hX2luaXQoJnByaXYtPnN0YXRzX3NlbSwgMSk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnNsb2NrKTsKKworCS8qIGluaXQgc3RhdGUgbWFjaGluZSB3aXRoIG9mZiMxIHN0YXRlICovCisJcHJpdi0+c3RhdGUgPSBQUlZfU1RBVEVfT0ZGOworCXByaXYtPnN0YXRlX29mZiA9IDE7CisKKwkvKiBpbml0aWFsaXplIHdvcmtxdWV1ZSdzICovCisJSU5JVF9XT1JLKCZwcml2LT5zdGF0c193b3JrLAorCQkgICh2b2lkICgqKSh2b2lkICopKSBwcmlzbTU0X3VwZGF0ZV9zdGF0cywgcHJpdik7CisJcHJpdi0+c3RhdHNfdGltZXN0YW1wID0gMDsKKworCUlOSVRfV09SSygmcHJpdi0+cmVzZXRfdGFzaywgaXNscGNpX2RvX3Jlc2V0X2FuZF93YWtlLCBwcml2KTsKKwlwcml2LT5yZXNldF90YXNrX3BlbmRpbmcgPSAwOworCisJLyogYWxsb2NhdGUgdmFyaW91cyBtZW1vcnkgYXJlYXMgKi8KKwlpZiAoaXNscGNpX2FsbG9jX21lbW9yeShwcml2KSkKKwkJZ290byBkb19mcmVlX25ldGRldjsKKworCS8qIHNlbGVjdCB0aGUgZmlybXdhcmUgZmlsZSBkZXBlbmRpbmcgb24gdGhlIGRldmljZSBpZCAqLworCXN3aXRjaCAocGRldi0+ZGV2aWNlKSB7CisJY2FzZSAweDM4Nzc6CisJCXN0cmNweShwcml2LT5maXJtd2FyZSwgSVNMMzg3N19JTUFHRV9GSUxFKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4Mzg4NjoKKwkJc3RyY3B5KHByaXYtPmZpcm13YXJlLCBJU0wzODg2X0lNQUdFX0ZJTEUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN0cmNweShwcml2LT5maXJtd2FyZSwgSVNMMzg5MF9JTUFHRV9GSUxFKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJlZ2lzdGVyX25ldGRldihuZGV2KSkgeworCQlERUJVRyhTSE9XX0VSUk9SX01FU1NBR0VTLAorCQkgICAgICAiRVJST1I6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZCBcbiIpOworCQlnb3RvIGRvX2lzbHBjaV9mcmVlX21lbW9yeTsKKwl9CisKKwlyZXR1cm4gbmRldjsKKworICAgICAgZG9faXNscGNpX2ZyZWVfbWVtb3J5OgorCWlzbHBjaV9mcmVlX21lbW9yeShwcml2KTsKKyAgICAgIGRvX2ZyZWVfbmV0ZGV2OgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX25ldGRldihuZGV2KTsKKwlwcml2ID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKK30KKworaXNscGNpX3N0YXRlX3QKK2lzbHBjaV9zZXRfc3RhdGUoaXNscGNpX3ByaXZhdGUgKnByaXYsIGlzbHBjaV9zdGF0ZV90IG5ld19zdGF0ZSkKK3sKKwlpc2xwY2lfc3RhdGVfdCBvbGRfc3RhdGU7CisKKwkvKiBsb2NrICovCisJb2xkX3N0YXRlID0gcHJpdi0+c3RhdGU7CisKKwkvKiB0aGlzIG1lYW5zIGVpdGhlciBhIHJhY2UgY29uZGl0aW9uIG9yIHNvbWUgc2VyaW91cyBlcnJvciBpbgorCSAqIHRoZSBkcml2ZXIgY29kZSAqLworCXN3aXRjaCAobmV3X3N0YXRlKSB7CisJY2FzZSBQUlZfU1RBVEVfT0ZGOgorCQlwcml2LT5zdGF0ZV9vZmYrKzsKKwlkZWZhdWx0OgorCQlwcml2LT5zdGF0ZSA9IG5ld19zdGF0ZTsKKwkJYnJlYWs7CisKKwljYXNlIFBSVl9TVEFURV9QUkVCT09UOgorCQkvKiB0aGVyZSBhcmUgYWN0dWFsbHkgbWFueSBvZmYtc3RhdGVzLCBlbnVtZXJhdGVkIGJ5CisJCSAqIHN0YXRlX29mZiAqLworCQlpZiAob2xkX3N0YXRlID09IFBSVl9TVEFURV9PRkYpCisJCQlwcml2LT5zdGF0ZV9vZmYtLTsKKworCQkvKiBvbmx5IGlmIGh3X3VuYXZhaWxhYmxlIGlzIHplcm8gbm93IGl0IG1lYW5zIHdlIGVpdGhlcgorCQkgKiB3ZXJlIGluIG9mZiMxIHN0YXRlLCBvciBjYW1lIGhlcmUgZnJvbQorCQkgKiBzb21ld2hlcmUgZWxzZSAqLworCQlpZiAoIXByaXYtPnN0YXRlX29mZikKKwkJCXByaXYtPnN0YXRlID0gbmV3X3N0YXRlOworCQlicmVhazsKKwl9OworI2lmIDAKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHN0YXRlIHRyYW5zaXRpb24gJWQgLT4gJWQgKG9mZiMlZClcbiIsCisJICAgICAgIHByaXYtPm5kZXYtPm5hbWUsIG9sZF9zdGF0ZSwgbmV3X3N0YXRlLCBwcml2LT5zdGF0ZV9vZmYpOworI2VuZGlmCisKKwkvKiBpbnZhcmlhbnRzICovCisJQlVHX09OKHByaXYtPnN0YXRlX29mZiA8IDApOworCUJVR19PTihwcml2LT5zdGF0ZV9vZmYgJiYgKHByaXYtPnN0YXRlICE9IFBSVl9TVEFURV9PRkYpKTsKKwlCVUdfT04oIXByaXYtPnN0YXRlX29mZiAmJiAocHJpdi0+c3RhdGUgPT0gUFJWX1NUQVRFX09GRikpOworCisJLyogdW5sb2NrICovCisJcmV0dXJuIG9sZF9zdGF0ZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhMTAxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5oCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuIAorICogIENvcHlyaWdodCAoQykgMjAwMyBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAZ251Lm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBydXNsdWcucnV0Z2Vycy5lZHU+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEF1cmVsaWVuIEFsbGVhdW1lIDxzbHRzQGZyZWUuZnI+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpZm5kZWYgX0lTTFBDSV9ERVZfSAorI2RlZmluZSBfSVNMUENJX0RFVl9ICisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgImlzbF8zOHh4LmgiCisjaW5jbHVkZSAiaXNsX29pZC5oIgorI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIKKworLyogc29tZSBzdGF0ZXMgbWlnaHQgbm90IGJlIHN1cGVyZmxvdXMgYW5kIG1heSBiZSByZW1vdmVkIHdoZW4KKyAgIGRlc2lnbiBpcyBmaW5hbGl6ZWQgKGh2cikgKi8KK3R5cGVkZWYgZW51bSB7CisJUFJWX1NUQVRFX09GRiA9IDAsCS8qIHRoaXMgbWVhbnMgaHdfdW5hdmFpbGFibGUgaXMgIT0gMCAqLworCVBSVl9TVEFURV9QUkVCT09ULAkvKiB3ZSBhcmUgaW4gYSBwcmUtYm9vdCBzdGF0ZSAoZW1wdHkgUkFNKSAqLworCVBSVl9TVEFURV9CT09ULAkJLyogYm9vdCBzdGF0ZSAoZncgdXBsb2FkLCBydW4gZncpICovCisJUFJWX1NUQVRFX1BPU1RCT09ULAkvKiBhZnRlciBib290IHN0YXRlLCBuZWVkIHJlc2V0IG5vdyAqLworCVBSVl9TVEFURV9QUkVJTklULAkvKiBwcmUtaW5pdCBzdGF0ZSAqLworCVBSVl9TVEFURV9JTklULAkJLyogaW5pdCBzdGF0ZSAocmVzdG9yZSBNSUIgYmFja3VwIHRvIGRldmljZSkgKi8KKwlQUlZfU1RBVEVfUkVBRFksCS8qIGRyaXZlciZkZXZpY2UgYXJlIGluIG9wZXJhdGlvbmFsIHN0YXRlICovCisJUFJWX1NUQVRFX1NMRUVQCQkvKiBkZXZpY2UgaW4gc2xlZXAgbW9kZSAqLworfSBpc2xwY2lfc3RhdGVfdDsKKworLyogQUNMIHVzaW5nIE1BQyBhZGRyZXNzICovCitzdHJ1Y3QgbWFjX2VudHJ5IHsKKyAgIHN0cnVjdCBsaXN0X2hlYWQgX2xpc3Q7CisgICBjaGFyIGFkZHJbRVRIX0FMRU5dOworfTsKKworc3RydWN0IGlzbHBjaV9hY2wgeworICAgZW51bSB7IE1BQ19QT0xJQ1lfT1BFTj0wLCBNQUNfUE9MSUNZX0FDQ0VQVD0xLCBNQUNfUE9MSUNZX1JFSkVDVD0yIH0gcG9saWN5OworICAgc3RydWN0IGxpc3RfaGVhZCBtYWNfbGlzdDsgIC8qIGEgbGlzdCBvZiBtYWNfZW50cnkgKi8KKyAgIGludCBzaXplOyAgIC8qIHNpemUgb2YgcXVldWUgKi8KKyAgIHN0cnVjdCBzZW1hcGhvcmUgc2VtOyAgIC8qIGFjY2Vzc2VkIGluIGlvY3RscyBhbmQgdHJhcF93b3JrICovCit9OworCitzdHJ1Y3QgaXNscGNpX21lbWJ1ZiB7CisJaW50IHNpemU7ICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgbWVtb3J5ICovCisJdm9pZCAqbWVtOyAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3Mgb2YgbWVtb3J5IGFzIHNlZW4gYnkgQ1BVICovCisJZG1hX2FkZHJfdCBwY2lfYWRkcjsgICAgICAgIC8qIGFkZHJlc3Mgb2YgbWVtb3J5IGFzIHNlZW4gYnkgZGV2aWNlICovCit9OworCisjZGVmaW5lIE1BWF9CU1NfV1BBX0lFX0NPVU5UIDY0CisjZGVmaW5lIE1BWF9XUEFfSUVfTEVOIDY0CitzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlOworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOworCXNpemVfdCB3cGFfaWVfbGVuOworCQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXNwaW5sb2NrX3Qgc2xvY2s7CS8qIGdlbmVyaWMgc3BpbmxvY2s7ICovCisJCisJdTMyIHByaXZfb2lkOworCisJLyogb3VyIG1pYiBjYWNoZSAqLworCXUzMiBpd19tb2RlOworICAgICAgICBzdHJ1Y3Qgcndfc2VtYXBob3JlIG1pYl9zZW07CisJdm9pZCAqKm1pYjsKKwljaGFyIG5pY2tuYW1lW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCQorCS8qIFRha2UgY2FyZSBvZiB0aGUgd2lyZWxlc3Mgc3RhdHMgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3RhdHNfd29yazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHN0YXRzX3NlbTsKKwkvKiByZW1lbWJlciB3aGVuIHdlIGxhc3QgdXBkYXRlZCB0aGUgc3RhdHMgKi8KKwl1bnNpZ25lZCBsb25nIHN0YXRzX3RpbWVzdGFtcDsKKwkvKiBUaGUgZmlyc3QgaXMgYWNjZXNzZWQgdW5kZXIgc2VtYXBob3JlIGxvY2tpbmcuCisJICogVGhlIHNlY29uZCBpcyB0aGUgY2xlYW4gb25lIHdlIHJldHVybiB0byBpd2NvbmZpZy4KKwkgKi8KKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyBsb2NhbF9pd3N0YXRpc3RpY3M7CisJc3RydWN0IGl3X3N0YXRpc3RpY3MgaXdzdGF0aXN0aWNzOworCisJc3RydWN0IGl3X3NweV9kYXRhIHNweV9kYXRhOyAvKiBpd3NweSBzdXBwb3J0ICovCisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNgorCXN0cnVjdCBpd19wdWJsaWNfZGF0YSB3aXJlbGVzc19kYXRhOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE2ICovCisKKwlpbnQgbW9uaXRvcl90eXBlOyAvKiBBUlBIUkRfSUVFRTgwMjExIG9yIEFSUEhSRF9JRUVFODAyMTFfUFJJU00gKi8KKworCXN0cnVjdCBpc2xwY2lfYWNsIGFjbDsKKworCS8qIFBDSSBidXMgYWxsb2NhdGlvbiAmIGNvbmZpZ3VyYXRpb24gbWVtYmVycyAqLworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkvKiBQQ0kgc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisJY2hhciBmaXJtd2FyZVszM107CisKKwl2b2lkIF9faW9tZW0gKmRldmljZV9iYXNlOwkvKiBpb3JlbWFwcGVkIGRldmljZSBiYXNlIGFkZHJlc3MgKi8KKworCS8qIGNvbnNpc3RlbnQgRE1BIHJlZ2lvbiAqLworCXZvaWQgKmRyaXZlcl9tZW1fYWRkcmVzczsJLyogYmFzZSBETUEgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgZGV2aWNlX2hvc3RfYWRkcmVzczsJLyogYmFzZSBETUEgYWRkcmVzcyAoYnVzIGFkZHJlc3MpICovCisJZG1hX2FkZHJfdCBkZXZpY2VfcHNtX2J1ZmZlcjsJLyogaG9zdCBtZW1vcnkgZm9yIFBTTSBidWZmZXJpbmcgKGJ1cyBhZGRyZXNzKSAqLworCisJLyogb3VyIG5ldHdvcmtfZGV2aWNlIHN0cnVjdHVyZSAgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKworCS8qIGRldmljZSBxdWV1ZSBpbnRlcmZhY2UgbWVtYmVycyAqLworCXN0cnVjdCBpc2wzOHh4X2NiICpjb250cm9sX2Jsb2NrOwkvKiBkZXZpY2UgY29udHJvbCBibG9jayAKKwkJCQkJCQkgICAoPT0gZHJpdmVyX21lbV9hZGRyZXNzISkgKi8KKworCS8qIEVhY2ggcXVldWUgaGFzIHRocmVlIGluZGV4ZXM6CisJICogICBmcmVlL2luZGV4X21nbXQvZGF0YV9yeC90eCAoY2FsbGVkIGluZGV4LCBzZWUgYmVsb3cpLAorCSAqICAgZHJpdmVyX2N1cnJfZnJhZywgYW5kIGRldmljZV9jdXJyX2ZyYWcgKGluIHRoZSBjb250cm9sIGJsb2NrKQorCSAqIEFsbCBpbmRleGVzIGFyZSBldmVyLWluY3JlYXNpbmcsIGJ1dCBpbnRlcnByZXRlZCBtb2R1bG8gdGhlCisJICogZGV2aWNlIHF1ZXVlIHNpemUgd2hlbiB1c2VkLgorCSAqICAgaW5kZXggPD0gZGV2aWNlX2N1cnJfZnJhZyA8PSBkcml2ZXJfY3Vycl9mcmFnICBhdCBhbGwgdGltZXMKKwkgKiBGb3IgcnggcXVldWVzLCBbaW5kZXgsIGRldmljZV9jdXJyX2ZyYWcpIGNvbnRhaW5zIGZyYWdtZW50cworCSAqIHRoYXQgdGhlIGludGVycnVwdCBwcm9jZXNzaW5nIG5lZWRzIHRvIGhhbmRsZSAob3duZWQgYnkgZHJpdmVyKS4KKwkgKiBbZGV2aWNlX2N1cnJfZnJhZywgZHJpdmVyX2N1cnJfZnJhZykgaXMgdGhlIGZyZWUgc3BhY2UgaW4gdGhlCisJICogcnggcXVldWUsIHdhaXRpbmcgZm9yIGRhdGEgKG93bmVkIGJ5IGRldmljZSkuICBUaGUgZHJpdmVyCisJICogaW5jcmVtZW50cyBkcml2ZXJfY3Vycl9mcmFnIHRvIGluZGljYXRlIHRvIHRoZSBkZXZpY2UgdGhhdCBtb3JlCisJICogYnVmZmVycyBhcmUgYXZhaWxhYmxlLgorCSAqIElmIGRldmljZV9jdXJyX2ZyYWcgPT0gZHJpdmVyX2N1cnJfZnJhZywgbm8gbW9yZSByeCBidWZmZXJzIGFyZQorCSAqIGF2YWlsYWJsZSwgYW5kIHRoZSByeCBETUEgZW5naW5lIG9mIHRoZSBkZXZpY2UgaXMgaGFsdGVkLgorCSAqIEZvciB0eCBxdWV1ZXMsIFtpbmRleCwgZGV2aWNlX2N1cnJfZnJhZykgY29udGFpbnMgZnJhZ21lbnRzCisJICogd2hlcmUgdHggaXMgZG9uZTsgdGhleSBuZWVkIHRvIGJlIGZyZWVkIChvd25lZCBieSBkcml2ZXIpLgorCSAqIFtkZXZpY2VfY3Vycl9mcmFnLCBkcml2ZXJfY3Vycl9mcmFnKSBjb250YWlucyB0aGUgZnJhbWVzCisJICogdGhhdCBhcmUgYmVpbmcgdHJhbnNmZXJyZWQgKG93bmVkIGJ5IGRldmljZSkuICBUaGUgZHJpdmVyCisJICogaW5jcmVtZW50cyBkcml2ZXJfY3Vycl9mcmFnIHRvIGluZGljYXRlIHRoYXQgbW9yZSB0eCB3b3JrCisJICogbmVlZHMgdG8gYmUgZG9uZS4KKwkgKi8KKwl1MzIgaW5kZXhfbWdtdF9yeDsgICAgICAgICAgICAgIC8qIHJlYWwgaW5kZXggbWdtdCByeCBxdWV1ZSAqLworCXUzMiBpbmRleF9tZ210X3R4OyAgICAgICAgICAgICAgLyogcmVhZCBpbmRleCBtZ210IHR4IHF1ZXVlICovCisJdTMyIGZyZWVfZGF0YV9yeDsJLyogZnJlZSBwb2ludGVyIGRhdGEgcnggcXVldWUgKi8KKwl1MzIgZnJlZV9kYXRhX3R4OwkvKiBmcmVlIHBvaW50ZXIgZGF0YSB0eCBxdWV1ZSAqLworCXUzMiBkYXRhX2xvd190eF9mdWxsOwkvKiBmdWxsIGRldGVjdGVkIGZsYWcgKi8KKworCS8qIGZyYW1lIG1lbW9yeSBidWZmZXJzIGZvciB0aGUgZGV2aWNlIHF1ZXVlcyAqLworCXN0cnVjdCBpc2xwY2lfbWVtYnVmIG1nbXRfdHhbSVNMMzhYWF9DQl9NR01UX1FTSVpFXTsKKwlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiBtZ210X3J4W0lTTDM4WFhfQ0JfTUdNVF9RU0laRV07CisJc3RydWN0IHNrX2J1ZmYgKmRhdGFfbG93X3R4W0lTTDM4WFhfQ0JfVFhfUVNJWkVdOworCXN0cnVjdCBza19idWZmICpkYXRhX2xvd19yeFtJU0wzOFhYX0NCX1JYX1FTSVpFXTsKKwlkbWFfYWRkcl90IHBjaV9tYXBfdHhfYWRkcmVzc1tJU0wzOFhYX0NCX1RYX1FTSVpFXTsKKwlkbWFfYWRkcl90IHBjaV9tYXBfcnhfYWRkcmVzc1tJU0wzOFhYX0NCX1JYX1FTSVpFXTsKKworCS8qIGRyaXZlciBuZXR3b3JrIGludGVyZmFjZSBtZW1iZXJzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdGlzdGljczsKKworCS8qIHdhaXQgZm9yIGEgcmVzZXQgaW50ZXJydXB0ICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVzZXRfZG9uZTsKKworCS8qIHVzZWQgYnkgaXNscGNpX21ndF90cmFuc2FjdGlvbiAqLworCXN0cnVjdCBzZW1hcGhvcmUgbWdtdF9zZW07IC8qIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gbWFpbGJveCBhbmQgd3F1ZXVlICovCisJc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKm1nbXRfcmVjZWl2ZWQ7CSAgLyogbWJveCBmb3IgaW5jb21pbmcgZnJhbWUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBtZ210X3dxdWV1ZTsgICAgICAgICAgICAvKiB3YWl0cXVldWUgZm9yIG1ib3ggKi8KKworCS8qIHN0YXRlIG1hY2hpbmUgKi8KKwlpc2xwY2lfc3RhdGVfdCBzdGF0ZTsKKwlpbnQgc3RhdGVfb2ZmOwkJLyogZW51bWVyYXRpb24gb2Ygb2ZmLXN0YXRlLCBpZiAwIHRoZW4KKwkJCQkgKiB3ZSdyZSBub3QgaW4gYW55IG9mZi1zdGF0ZSAqLworCisJLyogV1BBIHN0dWZmICovCisJaW50IHdwYTsgLyogV1BBIG1vZGUgZW5hYmxlZCAqLworCXN0cnVjdCBsaXN0X2hlYWQgYnNzX3dwYV9saXN0OworCWludCBudW1fYnNzX3dwYTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHdwYV9zZW07CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfdGFzazsKKwlpbnQgcmVzZXRfdGFza19wZW5kaW5nOworfSBpc2xwY2lfcHJpdmF0ZTsKKworc3RhdGljIGlubGluZSBpc2xwY2lfc3RhdGVfdAoraXNscGNpX2dldF9zdGF0ZShpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwkvKiBsb2NrICovCisJcmV0dXJuIHByaXYtPnN0YXRlOworCS8qIHVubG9jayAqLworfQorCitpc2xwY2lfc3RhdGVfdCBpc2xwY2lfc2V0X3N0YXRlKGlzbHBjaV9wcml2YXRlICpwcml2LCBpc2xwY2lfc3RhdGVfdCBuZXdfc3RhdGUpOworCisjZGVmaW5lIElTTFBDSV9UWF9USU1FT1VUICAgICAgICAgICAgICAgKDIqSFopCisKK2lycXJldHVybl90IGlzbHBjaV9pbnRlcnJ1cHQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworCitpbnQgcHJpc201NF9wb3N0X3NldHVwKGlzbHBjaV9wcml2YXRlICosIGludCk7CitpbnQgaXNscGNpX3Jlc2V0KGlzbHBjaV9wcml2YXRlICosIGludCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraXNscGNpX3RyaWdnZXIoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJaXNsMzh4eF90cmlnZ2VyX2RldmljZShpc2xwY2lfZ2V0X3N0YXRlKHByaXYpID09IFBSVl9TVEFURV9TTEVFUCwKKwkJCSAgICAgICBwcml2LT5kZXZpY2VfYmFzZSk7Cit9CisKK2ludCBpc2xwY2lfZnJlZV9tZW1vcnkoaXNscGNpX3ByaXZhdGUgKik7CitzdHJ1Y3QgbmV0X2RldmljZSAqaXNscGNpX3NldHVwKHN0cnVjdCBwY2lfZGV2ICopOworI2VuZGlmCQkJCS8qIF9JU0xQQ0lfREVWX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1MmU5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCkBAIC0wLDAgKzEsNTE5IEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEF1cmVsaWVuIEFsbGVhdW1lIDxzbHRzQGZyZWUuZnI+CisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKworI2luY2x1ZGUgInByaXNtY29tcGF0LmgiCisjaW5jbHVkZSAiaXNsXzM4eHguaCIKKyNpbmNsdWRlICJpc2xwY2lfZXRoLmgiCisjaW5jbHVkZSAiaXNscGNpX21ndC5oIgorI2luY2x1ZGUgIm9pZF9tZ3QuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIE5ldHdvcmsgSW50ZXJmYWNlIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAoraXNscGNpX2V0aF9jbGVhbnVwX3RyYW5zbWl0KGlzbHBjaV9wcml2YXRlICpwcml2LAorCQkJICAgIGlzbDM4eHhfY29udHJvbF9ibG9jayAqY29udHJvbF9ibG9jaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiBpbmRleDsKKworCS8qIGNvbXBhcmUgdGhlIGNvbnRyb2wgYmxvY2sgcmVhZCBwb2ludGVyIHdpdGggdGhlIGZyZWUgcG9pbnRlciAqLworCXdoaWxlIChwcml2LT5mcmVlX2RhdGFfdHggIT0KKwkgICAgICAgbGUzMl90b19jcHUoY29udHJvbF9ibG9jay0+CisJCQkgICBkZXZpY2VfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfVFhfREFUQV9MUV0pKSB7CisJCS8qIHJlYWQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBmcmFnbWVudCB0byBiZSBmcmVlZCAqLworCQlpbmRleCA9IHByaXYtPmZyZWVfZGF0YV90eCAlIElTTDM4WFhfQ0JfVFhfUVNJWkU7CisKKwkJLyogY2hlY2sgZm9yIGhvbGVzIGluIHRoZSBhcnJheXMgY2F1c2VkIGJ5IG11bHRpIGZyYWdtZW50IGZyYW1lcyAKKwkJICogc2VhcmNoaW5nIGZvciB0aGUgbGFzdCBmcmFnbWVudCBvZiBhIGZyYW1lICovCisJCWlmIChwcml2LT5wY2lfbWFwX3R4X2FkZHJlc3NbaW5kZXhdICE9IChkbWFfYWRkcl90KSBOVUxMKSB7CisJCQkvKiBlbnRyeSBpcyB0aGUgbGFzdCBmcmFnbWVudCBvZiBhIGZyYW1lCisJCQkgKiBmcmVlIHRoZSBza2Igc3RydWN0dXJlIGFuZCB1bm1hcCBwY2kgbWVtb3J5ICovCisJCQlza2IgPSBwcml2LT5kYXRhX2xvd190eFtpbmRleF07CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQkJREVCVUcoU0hPV19UUkFDSU5HLAorCQkJICAgICAgImNsZWFudXAgc2tiICVwIHNrYi0+ZGF0YSAlcCBza2ItPmxlbiAldSB0cnVlc2l6ZSAldVxuICIsCisJCQkgICAgICBza2IsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIHNrYi0+dHJ1ZXNpemUpOworI2VuZGlmCisKKwkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwKKwkJCQkJIHByaXYtPnBjaV9tYXBfdHhfYWRkcmVzc1tpbmRleF0sCisJCQkJCSBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJc2tiID0gTlVMTDsKKwkJfQorCQkvKiBpbmNyZW1lbnQgdGhlIGZyZWUgZGF0YSBsb3cgcXVldWUgcG9pbnRlciAqLworCQlwcml2LT5mcmVlX2RhdGFfdHgrKzsKKwl9Cit9CisKK2ludAoraXNscGNpX2V0aF90cmFuc21pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWlzbDM4eHhfY29udHJvbF9ibG9jayAqY2IgPSBwcml2LT5jb250cm9sX2Jsb2NrOworCXUzMiBpbmRleDsKKwlkbWFfYWRkcl90IHBjaV9tYXBfYWRkcmVzczsKKwlpbnQgZnJhbWVfc2l6ZTsKKwlpc2wzOHh4X2ZyYWdtZW50ICpmcmFnbWVudDsKKwlpbnQgb2Zmc2V0OworCXN0cnVjdCBza19idWZmICpuZXdza2I7CisJaW50IG5ld3NrYl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHdkc19tYWNbNl07CisJdTMyIGN1cnJfZnJhZzsKKwlpbnQgZXJyID0gMDsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywgImlzbHBjaV9ldGhfdHJhbnNtaXQgXG4iKTsKKyNlbmRpZgorCisJLyogbG9jayB0aGUgZHJpdmVyIGNvZGUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c2xvY2ssIGZsYWdzKTsKKworCS8qIGRldGVybWluZSB0aGUgYW1vdW50IG9mIGZyYWdtZW50cyBuZWVkZWQgdG8gc3RvcmUgdGhlIGZyYW1lICovCisKKwlmcmFtZV9zaXplID0gc2tiLT5sZW4gPCBFVEhfWkxFTiA/IEVUSF9aTEVOIDogc2tiLT5sZW47CisJaWYgKGluaXRfd2RzKQorCQlmcmFtZV9zaXplICs9IDY7CisKKwkvKiBjaGVjayB3aGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBxdWV1ZSBoYXMgZW5vdWdoIGZyYWdtZW50cyBmb3IgdGhlIGZyYW1lICovCisJY3Vycl9mcmFnID0gbGUzMl90b19jcHUoY2ItPmRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9UWF9EQVRBX0xRXSk7CisJaWYgKHVubGlrZWx5KGN1cnJfZnJhZyAtIHByaXYtPmZyZWVfZGF0YV90eCA+PSBJU0wzOFhYX0NCX1RYX1FTSVpFKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0cmFuc21pdCBkZXZpY2UgcXVldWUgZnVsbCB3aGVuIGF3YWtlXG4iLAorCQkgICAgICAgbmRldi0+bmFtZSk7CisJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisKKwkJLyogdHJpZ2dlciB0aGUgZGV2aWNlICovCisJCWlzbDM4eHhfdzMyX2ZsdXNoKHByaXYtPmRldmljZV9iYXNlLCBJU0wzOFhYX0RFVl9JTlRfVVBEQVRFLAorCQkJCSAgSVNMMzhYWF9ERVZfSU5UX1JFRyk7CisJCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBkcm9wX2ZyZWU7CisJfQorCS8qIENoZWNrIGFsaWdubWVudCBhbmQgV0RTIGZyYW1lIGZvcm1hdHRpbmcuIFRoZSBzdGFydCBvZiB0aGUgcGFja2V0IHNob3VsZAorCSAqIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIElmIFdEUyBpcyBlbmFibGVkIGFkZCBhbm90aGVyIDYgYnl0ZXMKKwkgKiBhbmQgYWRkIFdEUyBhZGRyZXNzIGluZm9ybWF0aW9uICovCisJaWYgKGxpa2VseSgoKGxvbmcpIHNrYi0+ZGF0YSAmIDB4MDMpIHwgaW5pdF93ZHMpKSB7CisJCS8qIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZCBhbmQgcmUtYWxsaWduICovCisJCW9mZnNldCA9ICg0IC0gKGxvbmcpIHNrYi0+ZGF0YSkgJiAweDAzOworCQlvZmZzZXQgKz0gaW5pdF93ZHMgPyA2IDogMDsKKworCQkvKiBjaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IHNrYiBjYW4gYmUgdXNlZCAgKi8KKwkJaWYgKCFza2JfY2xvbmVkKHNrYikgJiYgKHNrYl90YWlscm9vbShza2IpID49IG9mZnNldCkpIHsKKwkJCXVuc2lnbmVkIGNoYXIgKnNyYyA9IHNrYi0+ZGF0YTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCQlERUJVRyhTSE9XX1RSQUNJTkcsICJza2Igb2Zmc2V0ICVpIHdkcyAlaVxuIiwgb2Zmc2V0LAorCQkJICAgICAgaW5pdF93ZHMpOworI2VuZGlmCisKKwkJCS8qIGFsaWduIHRoZSBidWZmZXIgb24gNC1ieXRlIGJvdW5kYXJ5ICovCisJCQlza2JfcmVzZXJ2ZShza2IsICg0IC0gKGxvbmcpIHNrYi0+ZGF0YSkgJiAweDAzKTsKKwkJCWlmIChpbml0X3dkcykgeworCQkJCS8qIHdkcyByZXF1aXJlcyBhbiBhZGRpdGlvbmFsIGFkZHJlc3MgZmllbGQgb2YgNiBieXRlcyAqLworCQkJCXNrYl9wdXQoc2tiLCA2KTsKKyNpZmRlZiBJU0xQQ0lfRVRIX0RFQlVHCisJCQkJcHJpbnRrKCJpc2xwY2lfZXRoX3RyYW5zbWl0Ondkc19tYWNcbiIpOworI2VuZGlmCisJCQkJbWVtbW92ZShza2ItPmRhdGEgKyA2LCBzcmMsIHNrYi0+bGVuKTsKKwkJCQltZW1jcHkoc2tiLT5kYXRhLCB3ZHNfbWFjLCA2KTsKKwkJCX0gZWxzZSB7CisJCQkJbWVtbW92ZShza2ItPmRhdGEsIHNyYywgc2tiLT5sZW4pOworCQkJfQorCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywgIm1lbW1vdmUgJXAgJXAgJWkgXG4iLCBza2ItPmRhdGEsCisJCQkgICAgICBzcmMsIHNrYi0+bGVuKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJbmV3c2tiID0KKwkJCSAgICBkZXZfYWxsb2Nfc2tiKGluaXRfd2RzID8gc2tiLT5sZW4gKyA2IDogc2tiLT5sZW4pOworCQkJaWYgKHVubGlrZWx5KG5ld3NrYiA9PSBOVUxMKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBhbGxvY2F0ZSBza2JcbiIsCisJCQkJICAgICAgIG5kZXYtPm5hbWUpOworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJZ290byBkcm9wX2ZyZWU7CisJCQl9CisJCQluZXdza2Jfb2Zmc2V0ID0gKDQgLSAobG9uZykgbmV3c2tiLT5kYXRhKSAmIDB4MDM7CisKKwkJCS8qIENoZWNrIGlmIG5ld3NrYi0+ZGF0YSBpcyBhbGlnbmVkICovCisJCQlpZiAobmV3c2tiX29mZnNldCkKKwkJCQlza2JfcmVzZXJ2ZShuZXdza2IsIG5ld3NrYl9vZmZzZXQpOworCisJCQlza2JfcHV0KG5ld3NrYiwgaW5pdF93ZHMgPyBza2ItPmxlbiArIDYgOiBza2ItPmxlbik7CisJCQlpZiAoaW5pdF93ZHMpIHsKKwkJCQltZW1jcHkobmV3c2tiLT5kYXRhICsgNiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCQkJbWVtY3B5KG5ld3NrYi0+ZGF0YSwgd2RzX21hYywgNik7CisjaWZkZWYgSVNMUENJX0VUSF9ERUJVRworCQkJCXByaW50aygiaXNscGNpX2V0aF90cmFuc21pdDp3ZHNfbWFjXG4iKTsKKyNlbmRpZgorCQkJfSBlbHNlCisJCQkJbWVtY3B5KG5ld3NrYi0+ZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQkJREVCVUcoU0hPV19UUkFDSU5HLCAibWVtY3B5ICVwICVwICVpIHdkcyAlaVxuIiwKKwkJCSAgICAgIG5ld3NrYi0+ZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbiwgaW5pdF93ZHMpOworI2VuZGlmCisKKwkJCW5ld3NrYi0+ZGV2ID0gc2tiLT5kZXY7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlza2IgPSBuZXdza2I7CisJCX0KKwl9CisJLyogZGlzcGxheSB0aGUgYnVmZmVyIGNvbnRlbnRzIGZvciBkZWJ1Z2dpbmcgKi8KKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfQlVGRkVSX0NPTlRFTlRTLCAiXG50eCAlcCAiLCBza2ItPmRhdGEpOworCWRpc3BsYXlfYnVmZmVyKChjaGFyICopIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworI2VuZGlmCisKKwkvKiBtYXAgdGhlIHNrYiBidWZmZXIgdG8gcGNpIG1lbW9yeSBmb3IgRE1BIG9wZXJhdGlvbiAqLworCXBjaV9tYXBfYWRkcmVzcyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsCisJCQkJCSAodm9pZCAqKSBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKHVubGlrZWx5KHBjaV9tYXBfYWRkcmVzcyA9PSAwKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2Fubm90IG1hcCBidWZmZXIgdG8gUENJXG4iLAorCQkgICAgICAgbmRldi0+bmFtZSk7CisKKwkJZXJyID0gLUVJTzsKKwkJZ290byBkcm9wX2ZyZWU7CisJfQorCS8qIFBsYWNlIHRoZSBmcmFnbWVudCBpbiB0aGUgY29udHJvbCBibG9jayBzdHJ1Y3R1cmUuICovCisJaW5kZXggPSBjdXJyX2ZyYWcgJSBJU0wzOFhYX0NCX1RYX1FTSVpFOworCWZyYWdtZW50ID0gJmNiLT50eF9kYXRhX2xvd1tpbmRleF07CisKKwlwcml2LT5wY2lfbWFwX3R4X2FkZHJlc3NbaW5kZXhdID0gcGNpX21hcF9hZGRyZXNzOworCS8qIHN0b3JlIHRoZSBza2IgYWRkcmVzcyBmb3IgZnV0dXJlIGZyZWVpbmcgICovCisJcHJpdi0+ZGF0YV9sb3dfdHhbaW5kZXhdID0gc2tiOworCS8qIHNldCB0aGUgcHJvcGVyIGZyYWdtZW50IHN0YXJ0IGFkZHJlc3MgYW5kIHNpemUgaW5mb3JtYXRpb24gKi8KKwlmcmFnbWVudC0+c2l6ZSA9IGNwdV90b19sZTE2KGZyYW1lX3NpemUpOworCWZyYWdtZW50LT5mbGFncyA9IGNwdV90b19sZTE2KDApOwkvKiBzZXQgdG8gMSBpZiBtb3JlIGZyYWdtZW50cyAqLworCWZyYWdtZW50LT5hZGRyZXNzID0gY3B1X3RvX2xlMzIocGNpX21hcF9hZGRyZXNzKTsKKwljdXJyX2ZyYWcrKzsKKworCS8qIFRoZSBmcmFnbWVudCBhZGRyZXNzIGluIHRoZSBjb250cm9sIGJsb2NrIG11c3QgaGF2ZSBiZWVuCisJICogd3JpdHRlbiBiZWZvcmUgYW5ub3VuY2luZyB0aGUgZnJhbWUgYnVmZmVyIHRvIGRldmljZS4gKi8KKwl3bWIoKTsKKwljYi0+ZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1RYX0RBVEFfTFFdID0gY3B1X3RvX2xlMzIoY3Vycl9mcmFnKTsKKworCWlmIChjdXJyX2ZyYWcgLSBwcml2LT5mcmVlX2RhdGFfdHggKyBJU0wzOFhYX01JTl9RVEhSRVNIT0xECisJICAgID4gSVNMMzhYWF9DQl9UWF9RU0laRSkgeworCQkvKiBzdG9wIHNlbmRzIGZyb20gdXBwZXIgbGF5ZXJzICovCisJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisKKwkJLyogc2V0IHRoZSBmdWxsIGZsYWcgZm9yIHRoZSB0cmFuc21pc3Npb24gcXVldWUgKi8KKwkJcHJpdi0+ZGF0YV9sb3dfdHhfZnVsbCA9IDE7CisJfQorCisJLyogdHJpZ2dlciB0aGUgZGV2aWNlICovCisJaXNscGNpX3RyaWdnZXIocHJpdik7CisKKwkvKiB1bmxvY2sgdGhlIGRyaXZlciBjb2RlICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2xvY2ssIGZsYWdzKTsKKworCS8qIHNldCB0aGUgdHJhbnNtaXNzaW9uIHRpbWUgKi8KKwluZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcHJpdi0+c3RhdGlzdGljcy50eF9wYWNrZXRzKys7CisJcHJpdi0+c3RhdGlzdGljcy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCXJldHVybiAwOworCisgICAgICBkcm9wX2ZyZWU6CisJLyogZnJlZSB0aGUgc2tidWYgc3RydWN0dXJlIGJlZm9yZSBhYm9ydGluZyAqLworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlza2IgPSBOVUxMOworCisJcHJpdi0+c3RhdGlzdGljcy50eF9kcm9wcGVkKys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludAoraXNscGNpX21vbml0b3JfcngoaXNscGNpX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBza19idWZmICoqc2tiKQoreworCS8qIFRoZSBjYXJkIHJlcG9ydHMgZnVsbCA4MDIuMTEgcGFja2V0cyBidXQgd2l0aCBhIDIwIGJ5dGVzCisJICogaGVhZGVyIGFuZCB3aXRob3V0IHRoZSBGQ1MuIEJ1dCB0aGVyZSBhIGlzIGEgYml0IHRoYXQKKwkgKiBpbmRpY2F0ZXMgaWYgdGhlIHBhY2tldCBpcyBjb3JydXB0ZWQgOi0pICovCisJc3RydWN0IHJmbW9uX2hlYWRlciAqaGRyID0gKHN0cnVjdCByZm1vbl9oZWFkZXIgKikgKCpza2IpLT5kYXRhOworCWlmIChoZHItPmZsYWdzICYgMHgwMSkKKwkJLyogVGhpcyBvbmUgaXMgYmFkLiBEcm9wIGl0ICEgKi8KKwkJcmV0dXJuIC0xOworCWlmIChwcml2LT5uZGV2LT50eXBlID09IEFSUEhSRF9JRUVFODAyMTFfUFJJU00pIHsKKwkJc3RydWN0IGF2c184MDIxMV8xX2hlYWRlciAqYXZzOworCQkvKiBleHRyYWN0IHRoZSByZWxldmFudCBkYXRhIGZyb20gdGhlIGhlYWRlciAqLworCQl1MzIgY2xvY2sgPSBsZTMyX3RvX2NwdShoZHItPmNsb2NrKTsKKwkJdTggcmF0ZSA9IGhkci0+cmF0ZTsKKwkJdTE2IGZyZXEgPSBsZTE2X3RvX2NwdShoZHItPmZyZXEpOworCQl1OCByc3NpID0gaGRyLT5yc3NpOworCisJCXNrYl9wdWxsKCpza2IsIHNpemVvZiAoc3RydWN0IHJmbW9uX2hlYWRlcikpOworCisJCWlmIChza2JfaGVhZHJvb20oKnNrYikgPCBzaXplb2YgKHN0cnVjdCBhdnNfODAyMTFfMV9oZWFkZXIpKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiID0gc2tiX2NvcHlfZXhwYW5kKCpza2IsCisJCQkJCQkJCSBzaXplb2YgKHN0cnVjdAorCQkJCQkJCQkJIGF2c184MDIxMV8xX2hlYWRlciksCisJCQkJCQkJCSAwLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChuZXdza2IpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycSgqc2tiKTsKKwkJCQkqc2tiID0gbmV3c2tiOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIC0xOworCQkJLyogVGhpcyBiZWhhdmlvciBpcyBub3QgdmVyeSBzdWJ0aWxlLi4uICovCisJCX0KKworCQkvKiBtYWtlIHJvb20gZm9yIHRoZSBuZXcgaGVhZGVyIGFuZCBmaWxsIGl0LiAqLworCQlhdnMgPQorCQkgICAgKHN0cnVjdCBhdnNfODAyMTFfMV9oZWFkZXIgKikgc2tiX3B1c2goKnNrYiwKKwkJCQkJCQkgICBzaXplb2YgKHN0cnVjdAorCQkJCQkJCQkgICBhdnNfODAyMTFfMV9oZWFkZXIpKTsKKwkJCisJCWF2cy0+dmVyc2lvbiA9IGNwdV90b19iZTMyKFA4MDIxMUNBUFRVUkVfVkVSU0lPTik7CisJCWF2cy0+bGVuZ3RoID0gY3B1X3RvX2JlMzIoc2l6ZW9mIChzdHJ1Y3QgYXZzXzgwMjExXzFfaGVhZGVyKSk7CisJCWF2cy0+bWFjdGltZSA9IGNwdV90b19iZTY0KGxlNjRfdG9fY3B1KGNsb2NrKSk7CisJCWF2cy0+aG9zdHRpbWUgPSBjcHVfdG9fYmU2NChqaWZmaWVzKTsKKwkJYXZzLT5waHl0eXBlID0gY3B1X3RvX2JlMzIoNik7CS8qT0ZETTogNiBmb3IgKGcpLCA4IGZvciAoYSkgKi8KKwkJYXZzLT5jaGFubmVsID0gY3B1X3RvX2JlMzIoY2hhbm5lbF9vZl9mcmVxKGZyZXEpKTsKKwkJYXZzLT5kYXRhcmF0ZSA9IGNwdV90b19iZTMyKHJhdGUgKiA1KTsKKwkJYXZzLT5hbnRlbm5hID0gY3B1X3RvX2JlMzIoMCk7CS8qdW5rbm93biAqLworCQlhdnMtPnByaW9yaXR5ID0gY3B1X3RvX2JlMzIoMCk7CS8qdW5rbm93biAqLworCQlhdnMtPnNzaV90eXBlID0gY3B1X3RvX2JlMzIoMyk7CS8qMjogZEJtLCAzOiByYXcgUlNTSSAqLworCQlhdnMtPnNzaV9zaWduYWwgPSBjcHVfdG9fYmUzMihyc3NpICYgMHg3Zik7CisJCWF2cy0+c3NpX25vaXNlID0gY3B1X3RvX2JlMzIocHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwubm9pc2UpOwkvKmJldHRlciB0aGFuICd1bmRlZmluZWQnLCBJIGFzc3VtZSAqLworCQlhdnMtPnByZWFtYmxlID0gY3B1X3RvX2JlMzIoMCk7CS8qdW5rbm93biAqLworCQlhdnMtPmVuY29kaW5nID0gY3B1X3RvX2JlMzIoMCk7CS8qdW5rbm93biAqLworCX0gZWxzZQorCQlza2JfcHVsbCgqc2tiLCBzaXplb2YgKHN0cnVjdCByZm1vbl9oZWFkZXIpKTsKKworCSgqc2tiKS0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF84MDJfMik7CisJKCpza2IpLT5tYWMucmF3ID0gKCpza2IpLT5kYXRhOworCSgqc2tiKS0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoraXNscGNpX2V0aF9yZWNlaXZlKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcHJpdi0+bmRldjsKKwlpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNvbnRyb2xfYmxvY2sgPSBwcml2LT5jb250cm9sX2Jsb2NrOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTE2IHNpemU7CisJdTMyIGluZGV4LCBvZmZzZXQ7CisJdW5zaWduZWQgY2hhciAqc3JjOworCWludCBkaXNjYXJkID0gMDsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywgImlzbHBjaV9ldGhfcmVjZWl2ZSBcbiIpOworI2VuZGlmCisKKwkvKiB0aGUgZGV2aWNlIGhhcyB3cml0dGVuIGFuIEV0aGVybmV0IGZyYW1lIGluIHRoZSBkYXRhIGFyZWEKKwkgKiBvZiB0aGUgc2tfYnVmZiB3aXRob3V0IHVwZGF0aW5nIHRoZSBzdHJ1Y3R1cmUsIGRvIGl0IG5vdyAqLworCWluZGV4ID0gcHJpdi0+ZnJlZV9kYXRhX3J4ICUgSVNMMzhYWF9DQl9SWF9RU0laRTsKKwlzaXplID0gbGUxNl90b19jcHUoY29udHJvbF9ibG9jay0+cnhfZGF0YV9sb3dbaW5kZXhdLnNpemUpOworCXNrYiA9IHByaXYtPmRhdGFfbG93X3J4W2luZGV4XTsKKwlvZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcpCisJCSAgbGUzMl90b19jcHUoY29udHJvbF9ibG9jay0+cnhfZGF0YV9sb3dbaW5kZXhdLmFkZHJlc3MpIC0KKwkJICAodW5zaWduZWQgbG9uZykgc2tiLT5kYXRhKSAmIDM7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfVFJBQ0lORywKKwkgICAgICAiZnJxLT5hZGRyICV4IHNrYi0+ZGF0YSAlcCBza2ItPmxlbiAldSBvZmZzZXQgJXUgdHJ1ZXNpemUgJXVcbiAiLAorCSAgICAgIGNvbnRyb2xfYmxvY2stPnJ4X2RhdGFfbG93W3ByaXYtPmZyZWVfZGF0YV9yeF0uYWRkcmVzcywgc2tiLT5kYXRhLAorCSAgICAgIHNrYi0+bGVuLCBvZmZzZXQsIHNrYi0+dHJ1ZXNpemUpOworI2VuZGlmCisKKwkvKiBkZWxldGUgdGhlIHN0cmVhbWluZyBETUEgbWFwcGluZyBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgc2tiICovCisJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LAorCQkJIHByaXYtPnBjaV9tYXBfcnhfYWRkcmVzc1tpbmRleF0sCisJCQkgTUFYX0ZSQUdNRU5UX1NJWkVfUlggKyAyLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJLyogdXBkYXRlIHRoZSBza2Igc3RydWN0dXJlIGFuZCBhbGxpZ24gdGhlIGJ1ZmZlciAqLworCXNrYl9wdXQoc2tiLCBzaXplKTsKKwlpZiAob2Zmc2V0KSB7CisJCS8qIHNoaWZ0IHRoZSBidWZmZXIgYWxsb2NhdGlvbiBvZmZzZXQgYnl0ZXMgdG8gZ2V0IHRoZSByaWdodCBmcmFtZSAqLworCQlza2JfcHVsbChza2IsIDIpOworCQlza2JfcHV0KHNrYiwgMik7CisJfQorI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJLyogZGlzcGxheSB0aGUgYnVmZmVyIGNvbnRlbnRzIGZvciBkZWJ1Z2dpbmcgKi8KKwlERUJVRyhTSE9XX0JVRkZFUl9DT05URU5UUywgIlxucnggJXAgIiwgc2tiLT5kYXRhKTsKKwlkaXNwbGF5X2J1ZmZlcigoY2hhciAqKSBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKyNlbmRpZgorCisJLyogY2hlY2sgd2hldGhlciBXRFMgaXMgZW5hYmxlZCBhbmQgd2hldGhlciB0aGUgZGF0YSBmcmFtZSBpcyBhIFdEUyBmcmFtZSAqLworCisJaWYgKGluaXRfd2RzKSB7CisJCS8qIFdEUyBlbmFibGVkLCBjaGVjayBmb3IgdGhlIHdkcyBhZGRyZXNzIG9uIHRoZSBmaXJzdCA2IGJ5dGVzIG9mIHRoZSBidWZmZXIgKi8KKwkJc3JjID0gc2tiLT5kYXRhICsgNjsKKwkJbWVtbW92ZShza2ItPmRhdGEsIHNyYywgc2tiLT5sZW4gLSA2KTsKKwkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDYpOworCX0KKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfVFJBQ0lORywgIkZyYWdtZW50IHNpemUgJWkgaW4gc2tiIGF0ICVwXG4iLCBzaXplLCBza2IpOworCURFQlVHKFNIT1dfVFJBQ0lORywgIlNrYiBkYXRhIGF0ICVwLCBsZW5ndGggJWlcbiIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJLyogZGlzcGxheSB0aGUgYnVmZmVyIGNvbnRlbnRzIGZvciBkZWJ1Z2dpbmcgKi8KKwlERUJVRyhTSE9XX0JVRkZFUl9DT05URU5UUywgIlxucnggJXAgIiwgc2tiLT5kYXRhKTsKKwlkaXNwbGF5X2J1ZmZlcigoY2hhciAqKSBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKyNlbmRpZgorCisJLyogZG8gc29tZSBhZGRpdGlvbmFsIHNrX2J1ZmYgYW5kIG5ldHdvcmsgbGF5ZXIgcGFyYW1ldGVycyAqLworCXNrYi0+ZGV2ID0gbmRldjsKKworCS8qIHRha2UgY2FyZSBvZiBtb25pdG9yIG1vZGUgYW5kIHNweSBtb25pdG9yaW5nLiAqLworCWlmICh1bmxpa2VseShwcml2LT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikpCisJCWRpc2NhcmQgPSBpc2xwY2lfbW9uaXRvcl9yeChwcml2LCAmc2tiKTsKKwllbHNlIHsKKwkJaWYgKHVubGlrZWx5KHNrYi0+ZGF0YVsyICogRVRIX0FMRU5dID09IDApKSB7CisJCQkvKiBUaGUgcGFja2V0IGhhcyBhIHJ4X2FubmV4LiBSZWFkIGl0IGZvciBzcHkgbW9uaXRvcmluZywgVGhlbgorCQkJICogcmVtb3ZlIGl0LCB3aGlsZSBrZWVwaW5nIHRoZSAyIGxlYWRpbmcgTUFDIGFkZHIuCisJCQkgKi8KKwkJCXN0cnVjdCBpd19xdWFsaXR5IHdzdGF0czsKKwkJCXN0cnVjdCByeF9hbm5leF9oZWFkZXIgKmFubmV4ID0KKwkJCSAgICAoc3RydWN0IHJ4X2FubmV4X2hlYWRlciAqKSBza2ItPmRhdGE7CisJCQl3c3RhdHMubGV2ZWwgPSBhbm5leC0+cmZtb24ucnNzaTsKKwkJCS8qIFRoZSBub2lzZSB2YWx1ZSBjYW4gYmUgYSBiaXQgb3V0ZGF0ZWQgaWYgbm9ib2R5J3MgCisJCQkgKiByZWFkaW5nIHdpcmVsZXNzIHN0YXRzLi4uICovCisJCQl3c3RhdHMubm9pc2UgPSBwcml2LT5sb2NhbF9pd3N0YXRpc3RpY3MucXVhbC5ub2lzZTsKKwkJCXdzdGF0cy5xdWFsID0gd3N0YXRzLmxldmVsIC0gd3N0YXRzLm5vaXNlOworCQkJd3N0YXRzLnVwZGF0ZWQgPSAweDA3OworCQkJLyogVXBkYXRlIHNweSByZWNvcmRzICovCisJCQl3aXJlbGVzc19zcHlfdXBkYXRlKG5kZXYsIGFubmV4LT5hZGRyMiwgJndzdGF0cyk7CisKKwkJCW1lbWNweShza2ItPmRhdGEgKyBzaXplb2YgKHN0cnVjdCByZm1vbl9oZWFkZXIpLAorCQkJICAgICAgIHNrYi0+ZGF0YSwgMiAqIEVUSF9BTEVOKTsKKwkJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mIChzdHJ1Y3QgcmZtb25faGVhZGVyKSk7CisJCX0KKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmRldik7CisJfQorCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwlwcml2LT5zdGF0aXN0aWNzLnJ4X3BhY2tldHMrKzsKKwlwcml2LT5zdGF0aXN0aWNzLnJ4X2J5dGVzICs9IHNpemU7CisKKwkvKiBkZWxpdmVyIHRoZSBza2IgdG8gdGhlIG5ldHdvcmsgbGF5ZXIgKi8KKyNpZmRlZiBJU0xQQ0lfRVRIX0RFQlVHCisJcHJpbnRrCisJICAgICgiaXNscGNpX2V0aF9yZWNlaXZlOm5ldGlmX3J4ICUyLjJYICUyLjJYICUyLjJYICUyLjJYICUyLjJYICUyLjJYXG4iLAorCSAgICAgc2tiLT5kYXRhWzBdLCBza2ItPmRhdGFbMV0sIHNrYi0+ZGF0YVsyXSwgc2tiLT5kYXRhWzNdLAorCSAgICAgc2tiLT5kYXRhWzRdLCBza2ItPmRhdGFbNV0pOworI2VuZGlmCisJaWYgKHVubGlrZWx5KGRpc2NhcmQpKSB7CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCXNrYiA9IE5VTEw7CisJfSBlbHNlCisJCW5ldGlmX3J4KHNrYik7CisKKwkvKiBpbmNyZW1lbnQgdGhlIHJlYWQgaW5kZXggZm9yIHRoZSByeCBkYXRhIGxvdyBxdWV1ZSAqLworCXByaXYtPmZyZWVfZGF0YV9yeCsrOworCisJLyogYWRkIG9uZSBvciBtb3JlIHNrX2J1ZmYgc3RydWN0dXJlcyAqLworCXdoaWxlIChpbmRleCA9CisJICAgICAgIGxlMzJfdG9fY3B1KGNvbnRyb2xfYmxvY2stPgorCQkJICAgZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1JYX0RBVEFfTFFdKSwKKwkgICAgICAgaW5kZXggLSBwcml2LT5mcmVlX2RhdGFfcnggPCBJU0wzOFhYX0NCX1JYX1FTSVpFKSB7CisJCS8qIGFsbG9jYXRlIGFuIHNrX2J1ZmYgZm9yIHJlY2VpdmVkIGRhdGEgZnJhbWVzIHN0b3JhZ2UKKwkJICogaW5jbHVkZSBhbnkgcmVxdWlyZWQgYWxsaWdubWVudCBvcGVyYXRpb25zICovCisJCXNrYiA9IGRldl9hbGxvY19za2IoTUFYX0ZSQUdNRU5UX1NJWkVfUlggKyAyKTsKKwkJaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMKSkgeworCQkJLyogZXJyb3IgYWxsb2NhdGluZyBhbiBza19idWZmIHN0cnVjdHVyZSBlbGVtZW50cyAqLworCQkJREVCVUcoU0hPV19FUlJPUl9NRVNTQUdFUywgIkVycm9yIGFsbG9jYXRpbmcgc2tiIFxuIik7CisJCQlicmVhazsKKwkJfQorCQlza2JfcmVzZXJ2ZShza2IsICg0IC0gKGxvbmcpIHNrYi0+ZGF0YSkgJiAweDAzKTsKKwkJLyogc3RvcmUgdGhlIG5ldyBza2Igc3RydWN0dXJlIHBvaW50ZXIgKi8KKwkJaW5kZXggPSBpbmRleCAlIElTTDM4WFhfQ0JfUlhfUVNJWkU7CisJCXByaXYtPmRhdGFfbG93X3J4W2luZGV4XSA9IHNrYjsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCURFQlVHKFNIT1dfVFJBQ0lORywKKwkJICAgICAgIm5ldyBhbGxvYyBza2IgJXAgc2tiLT5kYXRhICVwIHNrYi0+bGVuICV1IGluZGV4ICV1IHRydWVzaXplICV1XG4gIiwKKwkJICAgICAgc2tiLCBza2ItPmRhdGEsIHNrYi0+bGVuLCBpbmRleCwgc2tiLT50cnVlc2l6ZSk7CisjZW5kaWYKKworCQkvKiBzZXQgdGhlIHN0cmVhbWluZyBETUEgbWFwcGluZyBmb3IgcHJvcGVyIFBDSSBidXMgb3BlcmF0aW9uICovCisJCXByaXYtPnBjaV9tYXBfcnhfYWRkcmVzc1tpbmRleF0gPQorCQkgICAgcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgKHZvaWQgKikgc2tiLT5kYXRhLAorCQkJCSAgIE1BWF9GUkFHTUVOVF9TSVpFX1JYICsgMiwKKwkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlpZiAodW5saWtlbHkocHJpdi0+cGNpX21hcF9yeF9hZGRyZXNzW2luZGV4XSA9PSAoZG1hX2FkZHJfdCkgTlVMTCkpIHsKKwkJCS8qIGVycm9yIG1hcHBpbmcgdGhlIGJ1ZmZlciB0byBkZXZpY2UgYWNjZXNzYWJsZSBtZW1vcnkgYWRkcmVzcyAqLworCQkJREVCVUcoU0hPV19FUlJPUl9NRVNTQUdFUywKKwkJCSAgICAgICJFcnJvciBtYXBwaW5nIERNQSBhZGRyZXNzXG4iKTsKKworCQkJLyogZnJlZSB0aGUgc2tidWYgc3RydWN0dXJlIGJlZm9yZSBhYm9ydGluZyAqLworCQkJZGV2X2tmcmVlX3NrYl9pcnEoKHN0cnVjdCBza19idWZmICopIHNrYik7CisJCQlza2IgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJLyogdXBkYXRlIHRoZSBmcmFnbWVudCBhZGRyZXNzICovCisJCWNvbnRyb2xfYmxvY2stPnJ4X2RhdGFfbG93W2luZGV4XS5hZGRyZXNzID0gY3B1X3RvX2xlMzIoKHUzMikKKwkJCQkJCQkJCXByaXYtPgorCQkJCQkJCQkJcGNpX21hcF9yeF9hZGRyZXNzCisJCQkJCQkJCQlbaW5kZXhdKTsKKwkJd21iKCk7CisKKwkJLyogaW5jcmVtZW50IHRoZSBkcml2ZXIgcmVhZCBwb2ludGVyICovCisJCWFkZF9sZTMycCgodTMyICopICZjb250cm9sX2Jsb2NrLT4KKwkJCSAgZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1JYX0RBVEFfTFFdLCAxKTsKKwl9CisKKwkvKiB0cmlnZ2VyIHRoZSBkZXZpY2UgKi8KKwlpc2xwY2lfdHJpZ2dlcihwcml2KTsKKworCXJldHVybiAwOworfQorCit2b2lkCitpc2xwY2lfZG9fcmVzZXRfYW5kX3dha2Uodm9pZCAqZGF0YSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IChpc2xwY2lfcHJpdmF0ZSAqKSBkYXRhOworCWlzbHBjaV9yZXNldChwcml2LCAxKTsKKwluZXRpZl93YWtlX3F1ZXVlKHByaXYtPm5kZXYpOworCXByaXYtPnJlc2V0X3Rhc2tfcGVuZGluZyA9IDA7Cit9CisKK3ZvaWQKK2lzbHBjaV9ldGhfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0aXN0aWNzID0gJnByaXYtPnN0YXRpc3RpY3M7CisKKwkvKiBpbmNyZW1lbnQgdGhlIHRyYW5zbWl0IGVycm9yIGNvdW50ZXIgKi8KKwlzdGF0aXN0aWNzLT50eF9lcnJvcnMrKzsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0eF90aW1lb3V0IiwgbmRldi0+bmFtZSk7CisJaWYgKCFwcml2LT5yZXNldF90YXNrX3BlbmRpbmcpIHsKKwkJcHJpdi0+cmVzZXRfdGFza19wZW5kaW5nID0gMTsKKwkJcHJpbnRrKCIsIHNjaGVkdWxpbmcgYSByZXNldCIpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF90YXNrKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzlkN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9JU0xQQ0lfRVRIX0gKKyNkZWZpbmUgX0lTTFBDSV9FVEhfSAorCisjaW5jbHVkZSAiaXNsXzM4eHguaCIKKyNpbmNsdWRlICJpc2xwY2lfZGV2LmgiCisKK3N0cnVjdCByZm1vbl9oZWFkZXIgeworCXUxNiB1bmswOwkJLyogPSAweDAwMDAgKi8KKwl1MTYgbGVuZ3RoOwkJLyogPSAweDE0MDAgKi8KKwl1MzIgY2xvY2s7CQkvKiAxTUh6IGNsb2NrICovCisJdTggZmxhZ3M7CisJdTggdW5rMTsKKwl1OCByYXRlOworCXU4IHVuazI7CisJdTE2IGZyZXE7CisJdTE2IHVuazM7CisJdTggcnNzaTsKKwl1OCBwYWRkaW5nWzNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCByeF9hbm5leF9oZWFkZXIgeworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJc3RydWN0IHJmbW9uX2hlYWRlciByZm1vbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiB3bGFuLW5nIChhbmQgaG9wZWZ1bGx5IG90aGVycykgQVZTIGhlYWRlciwgdmVyc2lvbiBvbmUuICBGaWVsZHMgaW4KKyAqIG5ldHdvcmsgYnl0ZSBvcmRlci4gKi8KKyNkZWZpbmUgUDgwMjExQ0FQVFVSRV9WRVJTSU9OIDB4ODAyMTEwMDEKKworc3RydWN0IGF2c184MDIxMV8xX2hlYWRlciB7CisJdWludDMyX3QgdmVyc2lvbjsKKwl1aW50MzJfdCBsZW5ndGg7CisJdWludDY0X3QgbWFjdGltZTsKKwl1aW50NjRfdCBob3N0dGltZTsKKwl1aW50MzJfdCBwaHl0eXBlOworCXVpbnQzMl90IGNoYW5uZWw7CisJdWludDMyX3QgZGF0YXJhdGU7CisJdWludDMyX3QgYW50ZW5uYTsKKwl1aW50MzJfdCBwcmlvcml0eTsKKwl1aW50MzJfdCBzc2lfdHlwZTsKKwlpbnQzMl90IHNzaV9zaWduYWw7CisJaW50MzJfdCBzc2lfbm9pc2U7CisJdWludDMyX3QgcHJlYW1ibGU7CisJdWludDMyX3QgZW5jb2Rpbmc7Cit9OworCit2b2lkIGlzbHBjaV9ldGhfY2xlYW51cF90cmFuc21pdChpc2xwY2lfcHJpdmF0ZSAqLCBpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKik7CitpbnQgaXNscGNpX2V0aF90cmFuc21pdChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK2ludCBpc2xwY2lfZXRoX3JlY2VpdmUoaXNscGNpX3ByaXZhdGUgKik7Cit2b2lkIGlzbHBjaV9ldGhfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3ZvaWQgaXNscGNpX2RvX3Jlc2V0X2FuZF93YWtlKHZvaWQgKmRhdGEpOworCisjZW5kaWYJCQkJLyogX0lTTF9HRU5fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfaG90cGx1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfaG90cGx1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZDRkMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ob3RwbHVnLmMKQEAgLTAsMCArMSwzMzkgQEAKKy8qCisgKiAgCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgSGVyYmVydCBWYWxlcmlvIFJpZWRlbCA8aHZyQGdudS5vcmc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+IC8qIEZvciBfX2luaXQsIF9fZXhpdCAqLworCisjaW5jbHVkZSAicHJpc21jb21wYXQuaCIKKyNpbmNsdWRlICJpc2xwY2lfZGV2LmgiCisjaW5jbHVkZSAiaXNscGNpX21ndC5oIgkJLyogZm9yIHBjX2RlYnVnICovCisjaW5jbHVkZSAiaXNsX29pZC5oIgorCisjZGVmaW5lIERSVl9OQU1FCSJwcmlzbTU0IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4yIgorCitNT0RVTEVfQVVUSE9SKCJbSW50ZXJzaWxdIFIuQmFzdGluZ3MgYW5kIFcuVGVybW9yc2h1aXplbiwgVGhlIHByaXNtNTQub3JnIERldmVsb3BtZW50IFRlYW0gPHByaXNtNTQtZGV2ZWxAcHJpc201NC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRoZSBQcmlzbTU0IDgwMi4xMSBXaXJlbGVzcyBMQU4gYWRhcHRlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50CWluaXRfcGNpdG0gPSAwOworbW9kdWxlX3BhcmFtKGluaXRfcGNpdG0sIGludCwgMCk7CisKKy8qIEluIHRoaXMgb3JkZXI6IHZlbmRvciwgZGV2aWNlLCBzdWJ2ZW5kb3IsIHN1YmRldmljZSwgY2xhc3MsIGNsYXNzX21hc2ssCisgKiBkcml2ZXJfZGF0YSAKKyAqIElmIHlvdSBoYXZlIGFuIHVwZGF0ZSBmb3IgdGhpcyBwbGVhc2UgY29udGFjdCBwcmlzbTU0LWRldmVsQHByaXNtNTQub3JnIAorICogVGhlIGxhdGVzdCBsaXN0IGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vcHJpc201NC5vcmcvc3VwcG9ydGVkX2NhcmRzLnBocCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHByaXNtNTRfaWRfdGJsW10gPSB7CisJLyogSW50ZXJzaWwgUFJJU00gRHVldHRlL1ByaXNtIEdUIFdpcmVsZXNzIExBTiBhZGFwdGVyICovCisJeworCSAweDEyNjAsIDB4Mzg5MCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkgMCwgMCwgMAorCX0sCisKKwkvKiAzQ09NIDNDUldFMTU0RzcyIFdpcmVsZXNzIExBTiBhZGFwdGVyICovCisJeworCSAweDEwYjcsIDB4NjAwMSwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkgMCwgMCwgMAorCX0sCisKKwkvKiBJbnRlcnNpbCBQUklTTSBJbmRpZ28gV2lyZWxlc3MgTEFOIGFkYXB0ZXIgKi8KKwl7CisJIDB4MTI2MCwgMHgzODc3LAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSAwLCAwLCAwCisJfSwKKworCS8qIEludGVyc2lsIFBSSVNNIEphdmVsaW4vWGJvdyBXaXJlbGVzcyBMQU4gYWRhcHRlciAqLworCXsKKwkgMHgxMjYwLCAweDM4ODYsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJIDAsIDAsIDAKKwl9LAorCisJLyogRW5kIG9mIGxpc3QgKi8KKwl7MCwwLDAsMCwwLDAsMH0KK307CisKKy8qIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugd2l0aCB0aGUgSG90cGx1ZyBmYWNpbGl0aWVzIG9mIHRoZSBrZXJuZWwgKi8KK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwcmlzbTU0X2lkX3RibCk7CisKK3N0YXRpYyBpbnQgcHJpc201NF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqKTsKK3N0YXRpYyB2b2lkIHByaXNtNTRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICopOworc3RhdGljIGludCBwcmlzbTU0X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKiwgdTMyIHN0YXRlKTsKK3N0YXRpYyBpbnQgcHJpc201NF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwcmlzbTU0X2RyaXZlciA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAorCS5pZF90YWJsZSA9IHByaXNtNTRfaWRfdGJsLAorCS5wcm9iZSA9IHByaXNtNTRfcHJvYmUsCisJLnJlbW92ZSA9IHByaXNtNTRfcmVtb3ZlLAorCS5zdXNwZW5kID0gcHJpc201NF9zdXNwZW5kLAorCS5yZXN1bWUgPSBwcmlzbTU0X3Jlc3VtZSwKKwkvKiAuZW5hYmxlX3dha2UgOyB3ZSBkb24ndCBzdXBwb3J0IHRoaXMgeWV0ICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgTW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQKK3ByaXNtNTRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwl1OCBsYXRlbmN5X3RtcjsKKwl1MzIgbWVtX2FkZHI7CisJaXNscGNpX3ByaXZhdGUgKnByaXY7CisJaW50IHJ2YWx1ZTsKKworCS8qIEVuYWJsZSB0aGUgcGNpIGRldmljZSAqLworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwY2lfZW5hYmxlX2RldmljZSgpIGZhaWxlZC5cbiIsIERSVl9OQU1FKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogY2hlY2sgd2hldGhlciB0aGUgbGF0ZW5jeSB0aW1lciBpcyBzZXQgY29ycmVjdGx5ICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsICZsYXRlbmN5X3Rtcik7CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX1RSQUNJTkcsICJsYXRlbmN5IHRpbWVyOiAleFxuIiwgbGF0ZW5jeV90bXIpOworI2VuZGlmCisJaWYgKGxhdGVuY3lfdG1yIDwgUENJREVWSUNFX0xBVEVOQ1lfVElNRVJfTUlOKSB7CisJCS8qIHNldCB0aGUgbGF0ZW5jeSB0aW1lciAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsCisJCQkJICAgICAgUENJREVWSUNFX0xBVEVOQ1lfVElNRVJfVkFMKTsKKwl9CisKKwkvKiBlbmFibGUgUENJIERNQSAqLworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IDMyLWJpdCBQQ0kgRE1BIG5vdCBzdXBwb3J0ZWQiLCBEUlZfTkFNRSk7CisJCWdvdG8gZG9fcGNpX2Rpc2FibGVfZGV2aWNlOworICAgICAgICB9CisKKwkvKiAweDQwIGlzIHRoZSBwcm9ncmFtbWFibGUgdGltZXIgdG8gY29uZmlndXJlIHRoZSByZXNwb25zZSB0aW1lb3V0IChUUkRZX1RJTUVPVVQpCisJICogMHg0MSBpcyB0aGUgcHJvZ3JhbW1hYmxlIHRpbWVyIHRvIGNvbmZpZ3VyZSB0aGUgcmV0cnkgdGltZW91dCAoUkVUUllfVElNRU9VVCkKKwkgKiAJVGhlIFJFVFJZX1RJTUVPVVQgaXMgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiByZXRyaWVzIHRoYXQgdGhlIGNvcmUsIGFzIGEKKwkgKiAJTWFzdGVyLCB3aWxsIHBlcmZvcm0gYmVmb3JlIGFiYW5kb25pbmcgYSBjeWNsZS4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yCisJICogCVJFVFJZX1RJTUVPVVQgaXMgMHg4MCwgd2hpY2ggZmFyIGV4Y2VlZHMgdGhlIFBDSSAyLjEgcmVxdWlyZW1lbnQgZm9yIG5ldworCSAqIAlkZXZpY2VzLiBBIHdyaXRlIG9mIHplcm8gdG8gdGhlIFJFVFJZX1RJTUVPVVQgcmVnaXN0ZXIgZGlzYWJsZXMgdGhpcworCSAqIAlmdW5jdGlvbiB0byBhbGxvdyB1c2Ugd2l0aCBhbnkgbm9uLWNvbXBsaWFudCBsZWdhY3kgZGV2aWNlcyB0aGF0IG1heQorCSAqIAlleGVjdXRlIG1vcmUgcmV0cmllcy4KKwkgKgorCSAqIAlXcml0aW5nIHplcm8gdG8gYm90aCB0aGVzZSB0d28gcmVnaXN0ZXJzIHdpbGwgZGlzYWJsZSBib3RoIHRpbWVvdXRzIGFuZAorCSAqIAkqY2FuKiBzb2x2ZSBwcm9ibGVtcyBjYXVzZWQgYnkgZGV2aWNlcyB0aGF0IGFyZSBzbG93IHRvIHJlc3BvbmQuCisJICoJTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSAtIE1TVworCSAqLworCWlmICggaW5pdF9wY2l0bSA+PSAwICkgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MCwgKHU4KWluaXRfcGNpdG0pOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MSwgKHU4KWluaXRfcGNpdG0pOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIlBDSSBUUkRZL1JFVFJZIHVuY2hhbmdlZFxuIik7CisJfQorCisJLyogcmVxdWVzdCB0aGUgcGNpIGRldmljZSBJL08gcmVnaW9ucyAqLworCXJ2YWx1ZSA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChydmFsdWUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcGNpX3JlcXVlc3RfcmVnaW9ucyBmYWlsdXJlIChyYz0lZClcbiIsCisJCSAgICAgICBEUlZfTkFNRSwgcnZhbHVlKTsKKwkJZ290byBkb19wY2lfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJLyogY2hlY2sgaWYgdGhlIG1lbW9yeSB3aW5kb3cgaXMgaW5kZWVkIHNldCAqLworCXJ2YWx1ZSA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsICZtZW1fYWRkcik7CisJaWYgKHJ2YWx1ZSB8fCAhbWVtX2FkZHIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIGRldmljZSBtZW1vcnkgcmVnaW9uIG5vdCBjb25maWd1cmVkOyBmaXggeW91ciBCSU9TIG9yIENhcmRCdXMgYnJpZGdlL2RyaXZlcnNcbiIsCisJCSAgICAgICBEUlZfTkFNRSk7CisJCWdvdG8gZG9fcGNpX3JlbGVhc2VfcmVnaW9uczsKKwl9CisKKwkvKiBlbmFibGUgUENJIGJ1cy1tYXN0ZXJpbmcgKi8KKwlERUJVRyhTSE9XX1RSQUNJTkcsICIlczogcGNpX3NldF9tYXN0ZXIocGRldilcbiIsIERSVl9OQU1FKTsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qIGVuYWJsZSBNV0kgKi8KKwlwY2lfc2V0X213aShwZGV2KTsKKworCS8qIHNldHVwIHRoZSBuZXR3b3JrIGRldmljZSBpbnRlcmZhY2UgYW5kIGl0cyBzdHJ1Y3R1cmUgKi8KKwlpZiAoIShuZGV2ID0gaXNscGNpX3NldHVwKHBkZXYpKSkgeworCQkvKiBlcnJvciBjb25maWd1cmluZyB0aGUgZHJpdmVyIGFzIGEgbmV0d29yayBkZXZpY2UgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IGNvbmZpZ3VyZSBuZXR3b3JrIGRldmljZVxuIiwKKwkJICAgICAgIERSVl9OQU1FKTsKKwkJZ290byBkb19wY2lfcmVsZWFzZV9yZWdpb25zOworCX0KKworCXByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpc2xwY2lfc2V0X3N0YXRlKHByaXYsIFBSVl9TVEFURV9QUkVCT09UKTsgLyogd2UgYXJlIGF0dGVtcHRpbmcgdG8gYm9vdCAqLworCisJLyogY2FyZCBpcyBpbiB1bmtub3duIHN0YXRlIHlldCwgbWlnaHQgaGF2ZSBzb21lIGludGVycnVwdHMgcGVuZGluZyAqLworCWlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYtPmRldmljZV9iYXNlKTsKKworCS8qIHJlcXVlc3QgZm9yIHRoZSBpbnRlcnJ1cHQgYmVmb3JlIHVwbG9hZGluZyB0aGUgZmlybXdhcmUgKi8KKwlydmFsdWUgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsICZpc2xwY2lfaW50ZXJydXB0LAorCQkJICAgICBTQV9TSElSUSwgbmRldi0+bmFtZSwgcHJpdik7CisKKwlpZiAocnZhbHVlKSB7CisJCS8qIGVycm9yLCBjb3VsZCBub3QgaG9vayB0aGUgaGFuZGxlciB0byB0aGUgaXJxICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBpbnN0YWxsIElSUSBoYW5kbGVyXG4iLAorCQkgICAgICAgbmRldi0+bmFtZSk7CisJCWdvdG8gZG9fdW5yZWdpc3Rlcl9uZXRkZXY7CisJfQorCisJLyogZmlybXdhcmUgdXBsb2FkIGlzIHRyaWdnZXJlZCBpbiBpc2xwY2lfb3BlbiAqLworCisJcmV0dXJuIDA7CisKKyAgICAgIGRvX3VucmVnaXN0ZXJfbmV0ZGV2OgorCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCWlzbHBjaV9mcmVlX21lbW9yeShwcml2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9uZXRkZXYobmRldik7CisJcHJpdiA9IE5VTEw7CisgICAgICBkb19wY2lfcmVsZWFzZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisgICAgICBkb19wY2lfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiAtRUlPOworfQorCisvKiBzZXQgYnkgY2xlYW51cF9tb2R1bGUgKi8KK3N0YXRpYyB2b2xhdGlsZSBpbnQgX19pbl9jbGVhbnVwX21vZHVsZSA9IDA7CisKKy8qIHRoaXMgb25lIHJlbW92ZXMgb25lKCEhKSBpbnN0YW5jZSBvbmx5ICovCit2b2lkCitwcmlzbTU0X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5kZXYgPyBuZXRkZXZfcHJpdihuZGV2KSA6IE5VTEw7CisJQlVHX09OKCFwcml2KTsKKworCWlmICghX19pbl9jbGVhbnVwX21vZHVsZSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGhvdCB1bnBsdWcgZGV0ZWN0ZWRcbiIsIG5kZXYtPm5hbWUpOworCQlpc2xwY2lfc2V0X3N0YXRlKHByaXYsIFBSVl9TVEFURV9PRkYpOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVtb3ZpbmcgZGV2aWNlXG4iLCBuZGV2LT5uYW1lKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCisJLyogZnJlZSB0aGUgaW50ZXJydXB0IHJlcXVlc3QgKi8KKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpICE9IFBSVl9TVEFURV9PRkYpIHsKKwkJaXNsMzh4eF9kaXNhYmxlX2ludGVycnVwdHMocHJpdi0+ZGV2aWNlX2Jhc2UpOworCQlpc2xwY2lfc2V0X3N0YXRlKHByaXYsIFBSVl9TVEFURV9PRkYpOworCQkvKiBUaGlzIGJlbGxvdyBjYXVzZXMgYSBsb2NrdXAgYXQgcm1tb2QgdGltZS4gSXQgbWlnaHQgYmUKKwkJICogYmVjYXVzZSBzb21lIGludGVycnVwdHMgc3RpbGwgbGluZ2VyIGFmdGVyIHJtbW9kIHRpbWUsIAorCQkgKiBzZWUgYnVnICMxNyAqLworCQkvKiBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDMpOyovCS8qIHRyeSB0byBwb3dlci1vZmYgKi8KKwl9CisKKwlmcmVlX2lycShwZGV2LT5pcnEsIHByaXYpOworCisJLyogZnJlZSB0aGUgUENJIG1lbW9yeSBhbmQgdW5tYXAgdGhlIHJlbWFwcGVkIHBhZ2UgKi8KKwlpc2xwY2lfZnJlZV9tZW1vcnkocHJpdik7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9uZXRkZXYobmRldik7CisJcHJpdiA9IE5VTEw7CisKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCitpbnQKK3ByaXNtNTRfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmRldiA/IG5ldGRldl9wcml2KG5kZXYpIDogTlVMTDsKKwlCVUdfT04oIXByaXYpOworCisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogZ290IHN1c3BlbmQgcmVxdWVzdCAoc3RhdGUgJWQpXG4iLAorCSAgICAgICBuZGV2LT5uYW1lLCBzdGF0ZSk7CisKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKworCS8qIHRlbGwgdGhlIGRldmljZSBub3QgdG8gdHJpZ2dlciBpbnRlcnJ1cHRzIGZvciBub3cuLi4gKi8KKwlpc2wzOHh4X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2LT5kZXZpY2VfYmFzZSk7CisKKwkvKiBmcm9tIG5vdyBvbiBhc3N1bWUgdGhlIGhhcmR3YXJlIHdhcyBhbHJlYWR5IHBvd2VyZWQgZG93bgorCSAgIGFuZCBkb24ndCB0b3VjaCBpdCBhbnltb3JlICovCisJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfT0ZGKTsKKworCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJbmV0aWZfZGV2aWNlX2RldGFjaChuZGV2KTsKKworCXJldHVybiAwOworfQorCitpbnQKK3ByaXNtNTRfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmRldiA/IG5ldGRldl9wcml2KG5kZXYpIDogTlVMTDsKKwlCVUdfT04oIXByaXYpOworCisJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBnb3QgcmVzdW1lIHJlcXVlc3RcbiIsIG5kZXYtPm5hbWUpOworCisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKKwkvKiBhbHJpZ2h0IGxldCdzIGdvIGludG8gdGhlIFBSRUJPT1Qgc3RhdGUgKi8KKwlpc2xwY2lfcmVzZXQocHJpdiwgMSk7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5kZXYpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0CitwcmlzbTU0X21vZHVsZV9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiTG9hZGVkICVzIGRyaXZlciwgdmVyc2lvbiAlc1xuIiwKKwkgICAgICAgRFJWX05BTUUsIERSVl9WRVJTSU9OKTsKKworCV9fYnVnX29uX3dyb25nX3N0cnVjdF9zaXplcyAoKTsKKworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnByaXNtNTRfZHJpdmVyKTsKK30KKworLyogYnkgdGhlIHRpbWUgcHJpc201NF9tb2R1bGVfZXhpdCgpIHRlcm1pbmF0ZXMsIGFzIGEgcG9zdGNvbmRpdGlvbgorICogYWxsIGluc3RhbmNlcyB3aWxsIGhhdmUgYmVlbiBkZXN0cm95ZWQgYnkgY2FsbHMgdG8KKyAqIHByaXNtNTRfcmVtb3ZlKCkgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdAorcHJpc201NF9tb2R1bGVfZXhpdCh2b2lkKQoreworCV9faW5fY2xlYW51cF9tb2R1bGUgPSAxOworCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwcmlzbTU0X2RyaXZlcik7CisKKwlwcmludGsoS0VSTl9JTkZPICJVbmxvYWRlZCAlcyBkcml2ZXJcbiIsIERSVl9OQU1FKTsKKworCV9faW5fY2xlYW51cF9tb2R1bGUgPSAwOworfQorCisvKiByZWdpc3RlciBlbnRyeSBwb2ludHMgKi8KK21vZHVsZV9pbml0KHByaXNtNTRfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQocHJpc201NF9tb2R1bGVfZXhpdCk7CisvKiBFT0YgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfbWd0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmMmU1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jCkBAIC0wLDAgKzEsNTEzIEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDQgSmVucyBNYXVyZXIgPEplbnMuTWF1cmVyQGdteC5uZXQ+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKworI2luY2x1ZGUgInByaXNtY29tcGF0LmgiCisjaW5jbHVkZSAiaXNsXzM4eHguaCIKKyNpbmNsdWRlICJpc2xwY2lfbWd0LmgiCisjaW5jbHVkZSAiaXNsX29pZC5oIgkJLyogYWRkaXRpb25hbCB0eXBlcyBhbmQgZGVmcyBmb3IgaXNsMzh4eCBmdyAqLworI2luY2x1ZGUgImlzbF9pb2N0bC5oIgorCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICBHbG9iYWwgdmFyaWFibGUgZGVmaW5pdGlvbiBzZWN0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgcGNfZGVidWcgPSBWRVJCT1NFOworbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRHJpdmVyIGdlbmVyYWwgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKK3ZvaWQKK2Rpc3BsYXlfYnVmZmVyKGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKK3sKKwlpZiAoKHBjX2RlYnVnICYgU0hPV19CVUZGRVJfQ09OVEVOVFMpID09IDApCisJCXJldHVybjsKKworCXdoaWxlIChsZW5ndGggPiAwKSB7CisJCXByaW50aygiWyUwMnhdIiwgKmJ1ZmZlciAmIDI1NSk7CisJCWxlbmd0aC0tOworCQlidWZmZXIrKzsKKwl9CisKKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgUXVldWUgaGFuZGxpbmcgZm9yIG1hbmFnZW1lbnQgZnJhbWVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgUElNRk9SIG1hbmFnZW1lbnQgZnJhbWUgaGVhZGVyLgorICovCitzdGF0aWMgdm9pZAorcGltZm9yX2VuY29kZV9oZWFkZXIoaW50IG9wZXJhdGlvbiwgdTMyIG9pZCwgdTMyIGxlbmd0aCwgcGltZm9yX2hlYWRlcl90ICpoKQoreworCWgtPnZlcnNpb24gPSBQSU1GT1JfVkVSU0lPTjsKKwloLT5vcGVyYXRpb24gPSBvcGVyYXRpb247CisJaC0+ZGV2aWNlX2lkID0gUElNRk9SX0RFVl9JRF9NSExJX01JQjsKKwloLT5mbGFncyA9IDA7CisJaC0+b2lkID0gY3B1X3RvX2JlMzIob2lkKTsKKwloLT5sZW5ndGggPSBjcHVfdG9fYmUzMihsZW5ndGgpOworfQorCisvKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGFuYWx5emUgYSBQSU1GT1IgbWFuYWdlbWVudCBmcmFtZSBoZWFkZXIuCisgKi8KK3N0YXRpYyBwaW1mb3JfaGVhZGVyX3QgKgorcGltZm9yX2RlY29kZV9oZWFkZXIodm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlwaW1mb3JfaGVhZGVyX3QgKmggPSBkYXRhOworCisJd2hpbGUgKCh2b2lkICopIGggPCBkYXRhICsgbGVuKSB7CisJCWlmIChoLT5mbGFncyAmIFBJTUZPUl9GTEFHX0xJVFRMRV9FTkRJQU4pIHsKKwkJCWxlMzJfdG9fY3B1cygmaC0+b2lkKTsKKwkJCWxlMzJfdG9fY3B1cygmaC0+bGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCWJlMzJfdG9fY3B1cygmaC0+b2lkKTsKKwkJCWJlMzJfdG9fY3B1cygmaC0+bGVuZ3RoKTsKKwkJfQorCQlpZiAoaC0+b2lkICE9IE9JRF9JTkxfVFVOTkVMKQorCQkJcmV0dXJuIGg7CisJCWgrKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBGaWxsIHRoZSByZWNlaXZlIHF1ZXVlIGZvciBtYW5hZ2VtZW50IGZyYW1lcyB3aXRoIGZyZXNoIGJ1ZmZlcnMuCisgKi8KK2ludAoraXNscGNpX21nbXRfcnhfZmlsbChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWlzbDM4eHhfY29udHJvbF9ibG9jayAqY2IgPQkvKiB2b2xhdGlsZSBub3QgbmVlZGVkICovCisJICAgIChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKikgcHJpdi0+Y29udHJvbF9ibG9jazsKKwl1MzIgY3VyciA9IGxlMzJfdG9fY3B1KGNiLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfUlhfTUdNVFFdKTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywgImlzbHBjaV9tZ210X3J4X2ZpbGwgXG4iKTsKKyNlbmRpZgorCisJd2hpbGUgKGN1cnIgLSBwcml2LT5pbmRleF9tZ210X3J4IDwgSVNMMzhYWF9DQl9NR01UX1FTSVpFKSB7CisJCXUzMiBpbmRleCA9IGN1cnIgJSBJU0wzOFhYX0NCX01HTVRfUVNJWkU7CisJCXN0cnVjdCBpc2xwY2lfbWVtYnVmICpidWYgPSAmcHJpdi0+bWdtdF9yeFtpbmRleF07CisJCWlzbDM4eHhfZnJhZ21lbnQgKmZyYWcgPSAmY2ItPnJ4X2RhdGFfbWdtdFtpbmRleF07CisKKwkJaWYgKGJ1Zi0+bWVtID09IE5VTEwpIHsKKwkJCWJ1Zi0+bWVtID0ga21hbGxvYyhNR01UX0ZSQU1FX1NJWkUsIEdGUF9BVE9NSUMpOworCQkJaWYgKCFidWYtPm1lbSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgIkVycm9yIGFsbG9jYXRpbmcgbWFuYWdlbWVudCBmcmFtZS5cbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnVmLT5zaXplID0gTUdNVF9GUkFNRV9TSVpFOworCQl9CisJCWlmIChidWYtPnBjaV9hZGRyID09IDApIHsKKwkJCWJ1Zi0+cGNpX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LCBidWYtPm1lbSwKKwkJCQkJCSAgICAgICBNR01UX0ZSQU1FX1NJWkUsCisJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWlmICghYnVmLT5wY2lfYWRkcikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgIkZhaWxlZCB0byBtYWtlIG1lbW9yeSBETUEnYWJsZVxuLiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQl9CisKKwkJLyogYmUgc2FmZTogYWx3YXlzIHJlc2V0IGNvbnRyb2wgYmxvY2sgaW5mb3JtYXRpb24gKi8KKwkJZnJhZy0+c2l6ZSA9IGNwdV90b19sZTE2KE1HTVRfRlJBTUVfU0laRSk7CisJCWZyYWctPmZsYWdzID0gMDsKKwkJZnJhZy0+YWRkcmVzcyA9IGNwdV90b19sZTMyKGJ1Zi0+cGNpX2FkZHIpOworCQljdXJyKys7CisKKwkJLyogVGhlIGZyYWdtZW50IGFkZHJlc3MgaW4gdGhlIGNvbnRyb2wgYmxvY2sgbXVzdCBoYXZlCisJCSAqIGJlZW4gd3JpdHRlbiBiZWZvcmUgYW5ub3VuY2luZyB0aGUgZnJhbWUgYnVmZmVyIHRvCisJCSAqIGRldmljZSAqLworCQl3bWIoKTsKKwkJY2ItPmRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9SWF9NR01UUV0gPSBjcHVfdG9fbGUzMihjdXJyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDcmVhdGUgYW5kIHRyYW5zbWl0IGEgbWFuYWdlbWVudCBmcmFtZSB1c2luZyAib3BlcmF0aW9uIiBhbmQgIm9pZCIsCisgKiB3aXRoIGFyZ3VtZW50cyBkYXRhL2xlbmd0aC4KKyAqIFdlIGVpdGhlciByZXR1cm4gYW4gZXJyb3IgYW5kIGZyZWUgdGhlIGZyYW1lLCBvciB3ZSByZXR1cm4gMCBhbmQKKyAqIGlzbHBjaV9tZ3RfY2xlYW51cF90cmFuc21pdCgpIGZyZWVzIHRoZSBmcmFtZSBpbiB0aGUgdHgtZG9uZQorICogaW50ZXJydXB0LgorICovCitzdGF0aWMgaW50Citpc2xwY2lfbWd0X3RyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBpbnQgb3BlcmF0aW9uLCB1bnNpZ25lZCBsb25nIG9pZCwKKwkJICAgIHZvaWQgKmRhdGEsIGludCBsZW5ndGgpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNiID0KKwkgICAgKGlzbDM4eHhfY29udHJvbF9ibG9jayAqKSBwcml2LT5jb250cm9sX2Jsb2NrOworCXZvaWQgKnA7CisJaW50IGVyciA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpc2wzOHh4X2ZyYWdtZW50ICpmcmFnOworCXN0cnVjdCBpc2xwY2lfbWVtYnVmIGJ1ZjsKKwl1MzIgY3Vycl9mcmFnOworCWludCBpbmRleDsKKwlpbnQgZnJhZ19sZW4gPSBsZW5ndGggKyBQSU1GT1JfSEVBREVSX1NJWkU7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsICJpc2xwY2lfbWd0X3RyYW5zbWl0XG4iKTsKKyNlbmRpZgorCisJaWYgKGZyYWdfbGVuID4gTUdNVF9GUkFNRV9TSVpFKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogbWdtdCBmcmFtZSB0b28gbGFyZ2UgJWRcbiIsCisJCSAgICAgICBuZGV2LT5uYW1lLCBmcmFnX2xlbik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZXJyID0gLUVOT01FTTsKKwlwID0gYnVmLm1lbSA9IGttYWxsb2MoZnJhZ19sZW4sIEdGUF9LRVJORUwpOworCWlmICghYnVmLm1lbSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNhbm5vdCBhbGxvY2F0ZSBtZ210IGZyYW1lXG4iLAorCQkgICAgICAgbmRldi0+bmFtZSk7CisJCWdvdG8gZXJyb3I7CisJfQorCWJ1Zi5zaXplID0gZnJhZ19sZW47CisKKwkvKiBjcmVhdGUgdGhlIGhlYWRlciBkaXJlY3RseSBpbiB0aGUgZnJhZ21lbnQgZGF0YSBhcmVhICovCisJcGltZm9yX2VuY29kZV9oZWFkZXIob3BlcmF0aW9uLCBvaWQsIGxlbmd0aCwgKHBpbWZvcl9oZWFkZXJfdCAqKSBwKTsKKwlwICs9IFBJTUZPUl9IRUFERVJfU0laRTsKKworCWlmIChkYXRhKQorCQltZW1jcHkocCwgZGF0YSwgbGVuZ3RoKTsKKwllbHNlCisJCW1lbXNldChwLCAwLCBsZW5ndGgpOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwl7CisJCXBpbWZvcl9oZWFkZXJfdCAqaCA9IGJ1Zi5tZW07CisJCURFQlVHKFNIT1dfUElNRk9SX0ZSQU1FUywKKwkJICAgICAgIlBJTUZPUjogb3AgJWksIG9pZCAweCUwOGx4LCBkZXZpY2UgJWksIGZsYWdzIDB4JXggbGVuZ3RoIDB4JXggXG4iLAorCQkgICAgICBoLT5vcGVyYXRpb24sIG9pZCwgaC0+ZGV2aWNlX2lkLCBoLT5mbGFncywgbGVuZ3RoKTsKKworCQkvKiBkaXNwbGF5IHRoZSBidWZmZXIgY29udGVudHMgZm9yIGRlYnVnZ2luZyAqLworCQlkaXNwbGF5X2J1ZmZlcigoY2hhciAqKSBoLCBzaXplb2YgKHBpbWZvcl9oZWFkZXJfdCkpOworCQlkaXNwbGF5X2J1ZmZlcihwLCBsZW5ndGgpOworCX0KKyNlbmRpZgorCisJZXJyID0gLUVOT01FTTsKKwlidWYucGNpX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LCBidWYubWVtLCBmcmFnX2xlbiwKKwkJCQkgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwlpZiAoIWJ1Zi5wY2lfYWRkcikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2Fubm90IG1hcCBQQ0kgbWVtb3J5IGZvciBtZ210XG4iLAorCQkgICAgICAgbmRldi0+bmFtZSk7CisJCWdvdG8gZXJyb3JfZnJlZTsKKwl9CisKKwkvKiBQcm90ZWN0IHRoZSBjb250cm9sIGJsb2NrIG1vZGlmaWNhdGlvbnMgYWdhaW5zdCBpbnRlcnJ1cHRzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zbG9jaywgZmxhZ3MpOworCWN1cnJfZnJhZyA9IGxlMzJfdG9fY3B1KGNiLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfVFhfTUdNVFFdKTsKKwlpZiAoY3Vycl9mcmFnIC0gcHJpdi0+aW5kZXhfbWdtdF90eCA+PSBJU0wzOFhYX0NCX01HTVRfUVNJWkUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1nbXQgdHggcXVldWUgaXMgc3RpbGwgZnVsbFxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQlnb3RvIGVycm9yX3VubG9jazsKKwl9CisKKwkvKiBjb21taXQgdGhlIGZyYW1lIHRvIHRoZSB0eCBkZXZpY2UgcXVldWUgKi8KKwlpbmRleCA9IGN1cnJfZnJhZyAlIElTTDM4WFhfQ0JfTUdNVF9RU0laRTsKKwlwcml2LT5tZ210X3R4W2luZGV4XSA9IGJ1ZjsKKwlmcmFnID0gJmNiLT50eF9kYXRhX21nbXRbaW5kZXhdOworCWZyYWctPnNpemUgPSBjcHVfdG9fbGUxNihmcmFnX2xlbik7CisJZnJhZy0+ZmxhZ3MgPSAwOwkvKiBmb3IgYW55IG90aGVyIHRoYW4gdGhlIGxhc3QgZnJhZ21lbnQsIHNldCB0byAxICovCisJZnJhZy0+YWRkcmVzcyA9IGNwdV90b19sZTMyKGJ1Zi5wY2lfYWRkcik7CisKKwkvKiBUaGUgZnJhZ21lbnQgYWRkcmVzcyBpbiB0aGUgY29udHJvbCBibG9jayBtdXN0IGhhdmUKKwkgKiBiZWVuIHdyaXR0ZW4gYmVmb3JlIGFubm91bmNpbmcgdGhlIGZyYW1lIGJ1ZmZlciB0bworCSAqIGRldmljZSAqLworCXdtYigpOworCWNiLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfVFhfTUdNVFFdID0gY3B1X3RvX2xlMzIoY3Vycl9mcmFnICsgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2xvY2ssIGZsYWdzKTsKKworCS8qIHRyaWdnZXIgdGhlIGRldmljZSAqLworCWlzbHBjaV90cmlnZ2VyKHByaXYpOworCXJldHVybiAwOworCisgICAgICBlcnJvcl91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2xvY2ssIGZsYWdzKTsKKyAgICAgIGVycm9yX2ZyZWU6CisJa2ZyZWUoYnVmLm1lbSk7CisgICAgICBlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogUmVjZWl2ZSBhIG1hbmFnZW1lbnQgZnJhbWUgZnJvbSB0aGUgZGV2aWNlLgorICogVGhpcyBjYW4gYmUgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiB0cmFwcywgYW5kIGF0IG1vc3Qgb25lIHJlc3BvbnNlCisgKiBmcmFtZSBmb3IgYSBwcmV2aW91cyByZXF1ZXN0IHNlbnQgdmlhIGlzbHBjaV9tZ3RfdHJhbnNtaXQoKS4KKyAqLworaW50Citpc2xwY2lfbWd0X3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNiID0KKwkgICAgKGlzbDM4eHhfY29udHJvbF9ibG9jayAqKSBwcml2LT5jb250cm9sX2Jsb2NrOworCXUzMiBjdXJyX2ZyYWc7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsICJpc2xwY2lfbWd0X3JlY2VpdmUgXG4iKTsKKyNlbmRpZgorCisJLyogT25seSBvbmNlIHBlciBpbnRlcnJ1cHQsIGRldGVybWluZSBmcmFnbWVudCByYW5nZSB0bworCSAqIHByb2Nlc3MuICBUaGlzIGF2b2lkcyBhbiBlbmRsZXNzIGxvb3AgKGkuZS4gbG9ja3VwKSBpZgorCSAqIGZyYW1lcyBjb21lIGluIGZhc3RlciB0aGFuIHdlIGNhbiBwcm9jZXNzIHRoZW0uICovCisJY3Vycl9mcmFnID0gbGUzMl90b19jcHUoY2ItPmRldmljZV9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9SWF9NR01UUV0pOworCWJhcnJpZXIoKTsKKworCWZvciAoOyBwcml2LT5pbmRleF9tZ210X3J4IDwgY3Vycl9mcmFnOyBwcml2LT5pbmRleF9tZ210X3J4KyspIHsKKwkJcGltZm9yX2hlYWRlcl90ICpoZWFkZXI7CisJCXUzMiBpbmRleCA9IHByaXYtPmluZGV4X21nbXRfcnggJSBJU0wzOFhYX0NCX01HTVRfUVNJWkU7CisJCXN0cnVjdCBpc2xwY2lfbWVtYnVmICpidWYgPSAmcHJpdi0+bWdtdF9yeFtpbmRleF07CisJCXUxNiBmcmFnX2xlbjsKKwkJaW50IHNpemU7CisJCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpmcmFtZTsKKworCQkvKiBJIGhhdmUgbm8gaWRlYSAoYW5kIG5vIGRvY3VtZW50YXRpb24pIGlmIGZsYWdzICE9IDAKKwkJICogaXMgcG9zc2libGUuICBEcm9wIHRoZSBmcmFtZSwgcmV1c2UgdGhlIGJ1ZmZlci4gKi8KKwkJaWYgKGxlMTZfdG9fY3B1KGNiLT5yeF9kYXRhX21nbXRbaW5kZXhdLmZsYWdzKSAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5rbm93biBmbGFncyAweCUwNHhcbiIsCisJCQkgICAgICAgbmRldi0+bmFtZSwKKwkJCSAgICAgICBsZTE2X3RvX2NwdShjYi0+cnhfZGF0YV9tZ210W2luZGV4XS5mbGFncykpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBUaGUgZGV2aWNlIG9ubHkgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyKHMpIGhlcmUuICovCisJCWZyYWdfbGVuID0gbGUxNl90b19jcHUoY2ItPnJ4X2RhdGFfbWdtdFtpbmRleF0uc2l6ZSk7CisKKwkJLyoKKwkJICogV2UgYXBwZWFyIHRvIGhhdmUgbm8gd2F5IHRvIHRlbGwgdGhlIGRldmljZSB0aGUKKwkJICogc2l6ZSBvZiBhIHJlY2VpdmUgYnVmZmVyLiAgVGh1cywgaWYgdGhpcyBjaGVjaworCQkgKiB0cmlnZ2Vycywgd2UgbGlrZWx5IGhhdmUga2VybmVsIGhlYXAgY29ycnVwdGlvbi4gKi8KKwkJaWYgKGZyYWdfbGVuID4gTUdNVF9GUkFNRV9TSVpFKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIiVzOiBCb2d1cyBwYWNrZXQgc2l6ZSBvZiAlZCAoJSN4KS5cbiIsCisJCQkJbmRldi0+bmFtZSwgZnJhZ19sZW4sIGZyYWdfbGVuKTsKKwkJCWZyYWdfbGVuID0gTUdNVF9GUkFNRV9TSVpFOworCQl9CisKKwkJLyogRW5zdXJlIHRoZSByZXN1bHRzIG9mIGRldmljZSBETUEgYXJlIHZpc2libGUgdG8gdGhlIENQVS4gKi8KKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHByaXYtPnBkZXYsIGJ1Zi0+cGNpX2FkZHIsCisJCQkJCSAgICBidWYtPnNpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJLyogUGVyZm9ybSBlbmRpYW5lc3MgY29udmVyc2lvbiBmb3IgUElNRk9SIGhlYWRlciBpbi1wbGFjZS4gKi8KKwkJaGVhZGVyID0gcGltZm9yX2RlY29kZV9oZWFkZXIoYnVmLT5tZW0sIGZyYWdfbGVuKTsKKwkJaWYgKCFoZWFkZXIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBubyBQSU1GT1IgaGVhZGVyIGZvdW5kXG4iLAorCQkJICAgICAgIG5kZXYtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBUaGUgZGV2aWNlIElEIGZyb20gdGhlIFBJTUZPUiBwYWNrZXQgcmVjZWl2ZWQgZnJvbQorCQkgKiB0aGUgTVZDIGlzIGFsd2F5cyAwLiAgV2UgZm9yd2FyZCBhIHNlbnNpYmxlIGRldmljZV9pZC4KKwkJICogTm90IHRoYXQgYW55b25lIHVwc3RyZWFtIHdvdWxkIGNhcmUuLi4gKi8KKwkJaGVhZGVyLT5kZXZpY2VfaWQgPSBwcml2LT5uZGV2LT5pZmluZGV4OworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJREVCVUcoU0hPV19QSU1GT1JfRlJBTUVTLAorCQkgICAgICAiUElNRk9SOiBvcCAlaSwgb2lkIDB4JTA4eCwgZGV2aWNlICVpLCBmbGFncyAweCV4IGxlbmd0aCAweCV4IFxuIiwKKwkJICAgICAgaGVhZGVyLT5vcGVyYXRpb24sIGhlYWRlci0+b2lkLCBoZWFkZXItPmRldmljZV9pZCwKKwkJICAgICAgaGVhZGVyLT5mbGFncywgaGVhZGVyLT5sZW5ndGgpOworCisJCS8qIGRpc3BsYXkgdGhlIGJ1ZmZlciBjb250ZW50cyBmb3IgZGVidWdnaW5nICovCisJCWRpc3BsYXlfYnVmZmVyKChjaGFyICopIGhlYWRlciwgUElNRk9SX0hFQURFUl9TSVpFKTsKKwkJZGlzcGxheV9idWZmZXIoKGNoYXIgKikgaGVhZGVyICsgUElNRk9SX0hFQURFUl9TSVpFLAorCQkJICAgICAgIGhlYWRlci0+bGVuZ3RoKTsKKyNlbmRpZgorCisJCS8qIG5vYm9keSBzZW5kcyB0aGVzZSAqLworCQlpZiAoaGVhZGVyLT5mbGFncyAmIFBJTUZPUl9GTEFHX0FQUExJQ19PUklHSU4pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkgICAgICAgIiVzOiBlcnJhbnQgUElNRk9SIGFwcGxpY2F0aW9uIGZyYW1lXG4iLAorCQkJICAgICAgIG5kZXYtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBEZXRlcm1pbmUgZnJhbWUgc2l6ZSwgc2tpcHBpbmcgT0lEX0lOTF9UVU5ORUwgaGVhZGVycy4gKi8KKwkJc2l6ZSA9IFBJTUZPUl9IRUFERVJfU0laRSArIGhlYWRlci0+bGVuZ3RoOworCQlmcmFtZSA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSkgKyBzaXplLAorCQkJCUdGUF9BVE9NSUMpOworCQlpZiAoIWZyYW1lKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBPdXQgb2YgbWVtb3J5LCBjYW5ub3QgaGFuZGxlIG9pZCAweCUwOHhcbiIsCisJCQkgICAgICAgbmRldi0+bmFtZSwgaGVhZGVyLT5vaWQpOworCQkJY29udGludWU7CisJCX0KKwkJZnJhbWUtPm5kZXYgPSBuZGV2OworCQltZW1jcHkoJmZyYW1lLT5idWYsIGhlYWRlciwgc2l6ZSk7CisJCWZyYW1lLT5oZWFkZXIgPSAocGltZm9yX2hlYWRlcl90ICopIGZyYW1lLT5idWY7CisJCWZyYW1lLT5kYXRhID0gZnJhbWUtPmJ1ZiArIFBJTUZPUl9IRUFERVJfU0laRTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCURFQlVHKFNIT1dfUElNRk9SX0ZSQU1FUywKKwkJICAgICAgImZyYW1lOiBoZWFkZXI6ICVwLCBkYXRhOiAlcCwgc2l6ZTogJWRcbiIsCisJCSAgICAgIGZyYW1lLT5oZWFkZXIsIGZyYW1lLT5kYXRhLCBzaXplKTsKKyNlbmRpZgorCisJCWlmIChoZWFkZXItPm9wZXJhdGlvbiA9PSBQSU1GT1JfT1BfVFJBUCkgeworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICJUUkFQOiBvaWQgMHgleCwgZGV2aWNlICVpLCBmbGFncyAweCV4IGxlbmd0aCAlaVxuIiwKKwkJCSAgICAgICBoZWFkZXItPm9pZCwgaGVhZGVyLT5kZXZpY2VfaWQsIGhlYWRlci0+ZmxhZ3MsCisJCQkgICAgICAgaGVhZGVyLT5sZW5ndGgpOworI2VuZGlmCisKKwkJCS8qIENyZWF0ZSB3b3JrIHRvIGhhbmRsZSB0cmFwIG91dCBvZiBpbnRlcnJ1cHQKKwkJCSAqIGNvbnRleHQuICovCisJCQlJTklUX1dPUksoJmZyYW1lLT53cywgcHJpc201NF9wcm9jZXNzX3RyYXAsIGZyYW1lKTsKKwkJCXNjaGVkdWxlX3dvcmsoJmZyYW1lLT53cyk7CisKKwkJfSBlbHNlIHsKKwkJCS8qIFNpZ25hbCB0aGUgb25lIHdhaXRpbmcgcHJvY2VzcyB0aGF0IGEgcmVzcG9uc2UKKwkJCSAqIGhhcyBiZWVuIHJlY2VpdmVkLiAqLworCQkJaWYgKChmcmFtZSA9IHhjaGcoJnByaXYtPm1nbXRfcmVjZWl2ZWQsIGZyYW1lKSkgIT0gTlVMTCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgIiVzOiBtZ210IHJlc3BvbnNlIG5vdCBjb2xsZWN0ZWRcbiIsCisJCQkJICAgICAgIG5kZXYtPm5hbWUpOworCQkJCWtmcmVlKGZyYW1lKTsKKwkJCX0KKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQkJREVCVUcoU0hPV19UUkFDSU5HLCAiV2FrZSB1cCBNZ210IFF1ZXVlXG4iKTsKKyNlbmRpZgorCQkJd2FrZV91cCgmcHJpdi0+bWdtdF93cXVldWUpOworCQl9CisKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENsZWFudXAgdGhlIHRyYW5zbWl0IHF1ZXVlIGJ5IGZyZWVpbmcgYWxsIGZyYW1lcyBoYW5kbGVkIGJ5IHRoZSBkZXZpY2UuCisgKi8KK3ZvaWQKK2lzbHBjaV9tZ3RfY2xlYW51cF90cmFuc21pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWlzbDM4eHhfY29udHJvbF9ibG9jayAqY2IgPQkvKiB2b2xhdGlsZSBub3QgbmVlZGVkICovCisJICAgIChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKikgcHJpdi0+Y29udHJvbF9ibG9jazsKKwl1MzIgY3Vycl9mcmFnOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0ZVTkNUSU9OX0NBTExTLCAiaXNscGNpX21ndF9jbGVhbnVwX3RyYW5zbWl0XG4iKTsKKyNlbmRpZgorCisJLyogT25seSBvbmNlIHBlciBjbGVhbnVwLCBkZXRlcm1pbmUgZnJhZ21lbnQgcmFuZ2UgdG8KKwkgKiBwcm9jZXNzLiAgVGhpcyBhdm9pZHMgYW4gZW5kbGVzcyBsb29wIChpLmUuIGxvY2t1cCkgaWYKKwkgKiB0aGUgZGV2aWNlIGJlY2FtZSBjb25mdXNlZCwgaW5jcmVtZW50aW5nIGRldmljZV9jdXJyX2ZyYWcKKwkgKiByYXBpZGx5LiAqLworCWN1cnJfZnJhZyA9IGxlMzJfdG9fY3B1KGNiLT5kZXZpY2VfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfVFhfTUdNVFFdKTsKKwliYXJyaWVyKCk7CisKKwlmb3IgKDsgcHJpdi0+aW5kZXhfbWdtdF90eCA8IGN1cnJfZnJhZzsgcHJpdi0+aW5kZXhfbWdtdF90eCsrKSB7CisJCWludCBpbmRleCA9IHByaXYtPmluZGV4X21nbXRfdHggJSBJU0wzOFhYX0NCX01HTVRfUVNJWkU7CisJCXN0cnVjdCBpc2xwY2lfbWVtYnVmICpidWYgPSAmcHJpdi0+bWdtdF90eFtpbmRleF07CisJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgYnVmLT5wY2lfYWRkciwgYnVmLT5zaXplLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJYnVmLT5wY2lfYWRkciA9IDA7CisJCWtmcmVlKGJ1Zi0+bWVtKTsKKwkJYnVmLT5tZW0gPSBOVUxMOworCQlidWYtPnNpemUgPSAwOworCX0KK30KKworLyoKKyAqIFBlcmZvcm0gb25lIHJlcXVlc3QtcmVzcG9uc2UgdHJhbnNhY3Rpb24gdG8gdGhlIGRldmljZS4KKyAqLworaW50Citpc2xwY2lfbWd0X3RyYW5zYWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkgICAgICAgaW50IG9wZXJhdGlvbiwgdW5zaWduZWQgbG9uZyBvaWQsCisJCSAgICAgICB2b2lkICpzZW5kZGF0YSwgaW50IHNlbmRsZW4sCisJCSAgICAgICBzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqKnJlY3ZmcmFtZSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWNvbnN0IGxvbmcgd2FpdF9jeWNsZV9qaWZmaWVzID0gKElTTDM4WFhfV0FJVF9DWUNMRSAqIDEwICogSFopIC8gMTAwMDsKKwlsb25nIHRpbWVvdXRfbGVmdCA9IElTTDM4WFhfTUFYX1dBSVRfQ1lDTEVTICogd2FpdF9jeWNsZV9qaWZmaWVzOworCWludCBlcnI7CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwkqcmVjdmZyYW1lID0gTlVMTDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnByaXYtPm1nbXRfc2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXByZXBhcmVfdG9fd2FpdCgmcHJpdi0+bWdtdF93cXVldWUsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJZXJyID0gaXNscGNpX21ndF90cmFuc21pdChuZGV2LCBvcGVyYXRpb24sIG9pZCwgc2VuZGRhdGEsIHNlbmRsZW4pOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVUSU1FRE9VVDsKKwl3aGlsZSAodGltZW91dF9sZWZ0ID4gMCkgeworCQlpbnQgdGltZWxlZnQ7CisJCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpmcmFtZTsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXRpbWVsZWZ0ID0gc2NoZWR1bGVfdGltZW91dCh3YWl0X2N5Y2xlX2ppZmZpZXMpOworCQlmcmFtZSA9IHhjaGcoJnByaXYtPm1nbXRfcmVjZWl2ZWQsIE5VTEwpOworCQlpZiAoZnJhbWUpIHsKKwkJCWlmIChmcmFtZS0+aGVhZGVyLT5vaWQgPT0gb2lkKSB7CisJCQkJKnJlY3ZmcmFtZSA9IGZyYW1lOworCQkJCWVyciA9IDA7CisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogZXhwZWN0aW5nIG9pZCAweCV4LCByZWNlaXZlZCAweCV4LlxuIiwKKwkJCQkgICAgICAgbmRldi0+bmFtZSwgKHVuc2lnbmVkIGludCkgb2lkLAorCQkJCSAgICAgICBmcmFtZS0+aGVhZGVyLT5vaWQpOworCQkJCWtmcmVlKGZyYW1lKTsKKwkJCQlmcmFtZSA9IE5VTEw7CisJCQl9CisJCX0KKwkJaWYgKHRpbWVsZWZ0ID09IDApIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIG1nbXQgcmVzcG9uc2UgJWx1LCAiCisJCQkJInRyaWdnZXJpbmcgZGV2aWNlXG4iLAorCQkJCW5kZXYtPm5hbWUsIHRpbWVvdXRfbGVmdCk7CisJCQlpc2xwY2lfdHJpZ2dlcihwcml2KTsKKwkJfQorCQl0aW1lb3V0X2xlZnQgKz0gdGltZWxlZnQgLSB3YWl0X2N5Y2xlX2ppZmZpZXM7CisJfQorCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIG1nbXQgcmVzcG9uc2VcbiIsCisJICAgICAgIG5kZXYtPm5hbWUpOworCisJLyogVE9ETzogd2Ugc2hvdWxkIHJlc2V0IHRoZSBkZXZpY2UgaGVyZSAqLyAgICAgCisgb3V0OgorCWZpbmlzaF93YWl0KCZwcml2LT5tZ210X3dxdWV1ZSwgJndhaXQpOworCXVwKCZwcml2LT5tZ210X3NlbSk7CisJcmV0dXJuIGVycjsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfbWd0LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTgyYmUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfbWd0LmgKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiAgCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBydXNsdWcucnV0Z2Vycy5lZHU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpZm5kZWYgX0lTTFBDSV9NR1RfSAorI2RlZmluZSBfSVNMUENJX01HVF9ICisKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisvKgorICogIEZ1bmN0aW9uIGRlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBLX0RFQlVHKGYsIG0sIGFyZ3MuLi4pIGRvIHsgaWYoZiAmIG0pIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpOyB9IHdoaWxlKDApCisjZGVmaW5lIERFQlVHKGYsIGFyZ3MuLi4pIEtfREVCVUcoZiwgcGNfZGVidWcsIGFyZ3MpCisKK2V4dGVybiBpbnQgcGNfZGVidWc7CisjZGVmaW5lIGluaXRfd2RzIDAJLyogaGVscCBjb21waWxlciBvcHRpbWl6ZSBhd2F5IGRlYWQgY29kZSAqLworCisKKy8qIEdlbmVyYWwgZHJpdmVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIFBDSURFVklDRV9MQVRFTkNZX1RJTUVSX01JTiAJCTB4NDAKKyNkZWZpbmUgUENJREVWSUNFX0xBVEVOQ1lfVElNRVJfVkFMIAkJMHg1MAorCisvKiBEZWJ1Z2dpbmcgdmVyYm9zZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTSE9XX05PVEhJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAkvKiBvdmVycnVsZXMgZXZlcnl0aGluZyAqLworI2RlZmluZSBTSE9XX0FOWVRISU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRgorI2RlZmluZSBTSE9XX0VSUk9SX01FU1NBR0VTICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTSE9XX1RSQVBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBTSE9XX0ZVTkNUSU9OX0NBTExTICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBTSE9XX1RSQUNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBTSE9XX1FVRVVFX0lOREVYRVMgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBTSE9XX1BJTUZPUl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBTSE9XX0JVRkZFUl9DT05URU5UUyAgICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBWRVJCT1NFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorCisvKiBEZWZhdWx0IGNhcmQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX01PREUgICAgICAgICAgICAgICAgICAgICAgIElOTF9NT0RFX0NMSUVOVAorI2RlZmluZSBDQVJEX0RFRkFVTFRfSVdfTU9ERQkJCUlXX01PREVfSU5GUkEKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0JTU1RZUEUgICAgICAgICAgICAgICAgICAgIERPVDExX0JTU1RZUEVfSU5GUkEKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0NMSUVOVF9TU0lECQkiIgorI2RlZmluZSBDQVJEX0RFRkFVTFRfQVBfU1NJRAkJCSJkZWZhdWx0IgorI2RlZmluZSBDQVJEX0RFRkFVTFRfS0VZMSAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRfa2V5XzEiCisjZGVmaW5lIENBUkRfREVGQVVMVF9LRVkyICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdF9rZXlfMiIKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0tFWTMgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0X2tleV8zIgorI2RlZmluZSBDQVJEX0RFRkFVTFRfS0VZNCAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRfa2V5XzQiCisjZGVmaW5lIENBUkRfREVGQVVMVF9XRVAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENBUkRfREVGQVVMVF9GSUxURVIgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENBUkRfREVGQVVMVF9XRFMgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lCUNBUkRfREVGQVVMVF9BVVRIRU4gICAgICAgICAgICAgICAgICAgICBET1QxMV9BVVRIX09TCisjZGVmaW5lCUNBUkRfREVGQVVMVF9ET1QxWAkJCTAKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX01MTUVfTU9ERQkJCURPVDExX01MTUVfQVVUTworI2RlZmluZSBDQVJEX0RFRkFVTFRfQ09ORk9STUFOQ0UgICAgICAgICAgICAgICAgT0lEX0lOTF9DT05GT1JNQU5DRV9OT05FCisjZGVmaW5lIENBUkRfREVGQVVMVF9QUk9GSUxFCQkJRE9UMTFfUFJPRklMRV9NSVhFRF9HX1dJRkkKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX01BWEZSQU1FQlVSU1QJCURPVDExX01BWEZSQU1FQlVSU1RfTUlYRURfU0FGRQorCisvKiBQSU1GT1IgcGFja2FnZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBQSU1GT1JfRVRIRVJUWVBFICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODI4CisjZGVmaW5lIFBJTUZPUl9IRUFERVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBQSU1GT1JfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQSU1GT1JfT1BfR0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQSU1GT1JfT1BfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQSU1GT1JfT1BfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBQSU1GT1JfT1BfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBQSU1GT1JfT1BfVFJBUCAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBQSU1GT1JfT1BfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgNQkvKiB0aWxsIDI1NSAqLworI2RlZmluZSBQSU1GT1JfREVWX0lEX01ITElfTUlCICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQSU1GT1JfRkxBR19BUFBMSUNfT1JJR0lOICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBQSU1GT1JfRkxBR19MSVRUTEVfRU5ESUFOICAgICAgICAgICAgICAgMHgwMgorCitzdGF0aWMgaW5saW5lIHZvaWQKK2FkZF9sZTMycCh1MzIgKiBsZV9udW1iZXIsIHUzMiBhZGQpCit7CisJKmxlX251bWJlciA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1cChsZV9udW1iZXIpICsgYWRkKTsKK30KKwordm9pZCBkaXNwbGF5X2J1ZmZlcihjaGFyICosIGludCk7CisKKy8qCisgKiAgVHlwZSBkZWZpbml0aW9uIHNlY3Rpb24KKyAqCisgKiAgdGhlIHN0cnVjdHVyZSBkZWZpbmVzIG9ubHkgdGhlIGhlYWRlciBhbGxvd2luZyBjb3B5bGVzcworICogIGZyYW1lIGhhbmRsaW5nCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1OCB2ZXJzaW9uOworCXU4IG9wZXJhdGlvbjsKKwl1MzIgb2lkOworCXU4IGRldmljZV9pZDsKKwl1OCBmbGFnczsKKwl1MzIgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKK3BpbWZvcl9oZWFkZXJfdDsKKworLyogQSByZWNlaXZlZCBhbmQgaW50ZXJydXB0LXByb2Nlc3NlZCBtYW5hZ2VtZW50IGZyYW1lLCBlaXRoZXIgZm9yCisgKiBzY2hlZHVsZV93b3JrKHByaXNtNTRfcHJvY2Vzc190cmFwKSBvciBmb3IgcHJpdi0+bWdtdF9yZWNlaXZlZCwKKyAqIHByb2Nlc3NlZCBieSBpc2xwY2lfbWd0X3RyYW5zYWN0aW9uKCkuICovCitzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7ICAgICAgLyogcG9pbnRlciB0byBuZXR3b3JrIGRldmljZSAqLworCXBpbWZvcl9oZWFkZXJfdCAqaGVhZGVyOyAgICAgIC8qIHBheWxvYWQgaGVhZGVyLCBwb2ludHMgaW50byBidWYgKi8KKwl2b2lkICpkYXRhOwkJICAgICAgLyogcGF5bG9hZCBleCBoZWFkZXIsIHBvaW50cyBpbnRvIGJ1ZiAqLworICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3M7CSAgICAgIC8qIGFyZ3VtZW50IGZvciBzY2hlZHVsZV93b3JrKCkgKi8KKwljaGFyIGJ1ZlswXTsJCSAgICAgIC8qIGZyYWdtZW50IGJ1ZmZlciAqLworfTsKKworaW50Citpc2xwY2lfbWd0X3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpOworCitpbnQKK2lzbHBjaV9tZ210X3J4X2ZpbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpOworCit2b2lkCitpc2xwY2lfbWd0X2NsZWFudXBfdHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpOworCitpbnQKK2lzbHBjaV9tZ3RfdHJhbnNhY3Rpb24oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBvcGVyYXRpb24sIHVuc2lnbmVkIGxvbmcgb2lkLAorCQkgICAgICAgdm9pZCAqc2VuZGRhdGEsIGludCBzZW5kbGVuLAorCQkgICAgICAgc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKipyZWN2ZnJhbWUpOworCitzdGF0aWMgaW5saW5lIHZvaWQKK2lzbHBjaV9tZ3RfcmVsZWFzZShzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqZnJhbWUpCit7CisgICAgICAgIGtmcmVlKGZyYW1lKTsKK30KKworI2VuZGlmCQkJCS8qIF9JU0xQQ0lfTUdUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxMjNlMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5jCkBAIC0wLDAgKzEsOTA3IEBACisvKiAgIAorICogIENvcHlyaWdodCAoQykgMjAwMywyMDA0IEF1cmVsaWVuIEFsbGVhdW1lIDxzbHRzQGZyZWUuZnI+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJwcmlzbWNvbXBhdC5oIgorI2luY2x1ZGUgImlzbHBjaV9kZXYuaCIKKyNpbmNsdWRlICJpc2xwY2lfbWd0LmgiCisjaW5jbHVkZSAiaXNsX29pZC5oIgorI2luY2x1ZGUgIm9pZF9tZ3QuaCIKKyNpbmNsdWRlICJpc2xfaW9jdGwuaCIKKworLyogdG8gY29udmVydCBiZXR3ZWVuIGNoYW5uZWwgYW5kIGZyZXEgKi8KK3N0YXRpYyBjb25zdCBpbnQgZnJlcXVlbmN5X2xpc3RfYmdbXSA9IHsgMjQxMiwgMjQxNywgMjQyMiwgMjQyNywgMjQzMiwKKwkyNDM3LCAyNDQyLCAyNDQ3LCAyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LCAyNDcyLCAyNDg0Cit9OworCitpbnQKK2NoYW5uZWxfb2ZfZnJlcShpbnQgZikKK3sKKwlpbnQgYyA9IDA7CisKKwlpZiAoKGYgPj0gMjQxMikgJiYgKGYgPD0gMjQ4NCkpIHsKKwkJd2hpbGUgKChjIDwgMTQpICYmIChmICE9IGZyZXF1ZW5jeV9saXN0X2JnW2NdKSkKKwkJCWMrKzsKKwkJcmV0dXJuIChjID49IDE0KSA/IDAgOiArK2M7CisJfSBlbHNlIGlmICgoZiA+PSAoaW50KSA1MDAwKSAmJiAoZiA8PSAoaW50KSA2MDAwKSkgeworCQlyZXR1cm4gKCAoZiAtIDUwMDApIC8gNSApOworCX0gZWxzZQorCQlyZXR1cm4gMDsKK30KKworI2RlZmluZSBPSURfU1RSVUNUKG5hbWUsb2lkLHMsdCkgW25hbWVdID0ge29pZCwgMCwgc2l6ZW9mKHMpLCB0fQorI2RlZmluZSBPSURfU1RSVUNUX0MobmFtZSxvaWQscyx0KSBPSURfU1RSVUNUKG5hbWUsb2lkLHMsdCB8IE9JRF9GTEFHX0NBQ0hFRCkKKyNkZWZpbmUgT0lEX1UzMihuYW1lLG9pZCkgT0lEX1NUUlVDVChuYW1lLG9pZCx1MzIsT0lEX1RZUEVfVTMyKQorI2RlZmluZSBPSURfVTMyX0MobmFtZSxvaWQpIE9JRF9TVFJVQ1RfQyhuYW1lLG9pZCx1MzIsT0lEX1RZUEVfVTMyKQorI2RlZmluZSBPSURfU1RSVUNUX01MTUUobmFtZSxvaWQpIE9JRF9TVFJVQ1QobmFtZSxvaWQsc3RydWN0IG9ial9tbG1lLE9JRF9UWVBFX01MTUUpCisjZGVmaW5lIE9JRF9TVFJVQ1RfTUxNRUVYKG5hbWUsb2lkKSBPSURfU1RSVUNUKG5hbWUsb2lkLHN0cnVjdCBvYmpfbWxtZWV4LE9JRF9UWVBFX01MTUVFWCkKKworI2RlZmluZSBPSURfVU5LTk9XTihuYW1lLG9pZCkgT0lEX1NUUlVDVChuYW1lLG9pZCwwLDApCisKK3N0cnVjdCBvaWRfdCBpc2xfb2lkW10gPSB7CisJT0lEX1NUUlVDVChHRU5fT0lEX01BQ0FERFJFU1MsIDB4MDAwMDAwMDAsIHU4WzZdLCBPSURfVFlQRV9BRERSKSwKKwlPSURfVTMyKEdFTl9PSURfTElOS1NUQVRFLCAweDAwMDAwMDAxKSwKKwlPSURfVU5LTk9XTihHRU5fT0lEX1dBVENIRE9HLCAweDAwMDAwMDAyKSwKKwlPSURfVU5LTk9XTihHRU5fT0lEX01JQk9QLCAweDAwMDAwMDAzKSwKKwlPSURfVU5LTk9XTihHRU5fT0lEX09QVElPTlMsIDB4MDAwMDAwMDQpLAorCU9JRF9VTktOT1dOKEdFTl9PSURfTEVEQ09ORklHLCAweDAwMDAwMDA1KSwKKworCS8qIDgwMi4xMSAqLworCU9JRF9VMzJfQyhET1QxMV9PSURfQlNTVFlQRSwgMHgxMDAwMDAwMCksCisJT0lEX1NUUlVDVF9DKERPVDExX09JRF9CU1NJRCwgMHgxMDAwMDAwMSwgdThbNl0sIE9JRF9UWVBFX1JBVyksCisJT0lEX1NUUlVDVF9DKERPVDExX09JRF9TU0lELCAweDEwMDAwMDAyLCBzdHJ1Y3Qgb2JqX3NzaWQsCisJCSAgICAgT0lEX1RZUEVfU1NJRCksCisJT0lEX1UzMihET1QxMV9PSURfU1RBVEUsIDB4MTAwMDAwMDMpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FJRCwgMHgxMDAwMDAwNCksCisJT0lEX1NUUlVDVChET1QxMV9PSURfQ09VTlRSWVNUUklORywgMHgxMDAwMDAwNSwgdThbNF0sIE9JRF9UWVBFX1JBVyksCisJT0lEX1NUUlVDVF9DKERPVDExX09JRF9TU0lET1ZFUlJJREUsIDB4MTAwMDAwMDYsIHN0cnVjdCBvYmpfc3NpZCwKKwkJICAgICBPSURfVFlQRV9TU0lEKSwKKworCU9JRF9VMzIoRE9UMTFfT0lEX01FRElVTUxJTUlULCAweDExMDAwMDAwKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX0JFQUNPTlBFUklPRCwgMHgxMTAwMDAwMSksCisJT0lEX1UzMihET1QxMV9PSURfRFRJTVBFUklPRCwgMHgxMTAwMDAwMiksCisJT0lEX1UzMihET1QxMV9PSURfQVRJTVdJTkRPVywgMHgxMTAwMDAwMyksCisJT0lEX1UzMihET1QxMV9PSURfTElTVEVOSU5URVJWQUwsIDB4MTEwMDAwMDQpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0NGUFBFUklPRCwgMHgxMTAwMDAwNSksCisJT0lEX1UzMihET1QxMV9PSURfQ0ZQRFVSQVRJT04sIDB4MTEwMDAwMDYpLAorCisJT0lEX1UzMl9DKERPVDExX09JRF9BVVRIRU5BQkxFLCAweDEyMDAwMDAwKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX1BSSVZBQ1lJTlZPS0VELCAweDEyMDAwMDAxKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsIDB4MTIwMDAwMDIpLAorCU9JRF9VMzJfQyhET1QxMV9PSURfREVGS0VZSUQsIDB4MTIwMDAwMDMpLAorCVtET1QxMV9PSURfREVGS0VZWF0gPSB7MHgxMjAwMDAwNCwgMywgc2l6ZW9mIChzdHJ1Y3Qgb2JqX2tleSksCisJCQkgICAgICAgT0lEX0ZMQUdfQ0FDSEVEIHwgT0lEX1RZUEVfS0VZfSwJLyogRE9UMTFfT0lEX0RFRktFWTEsLi4uRE9UMTFfT0lEX0RFRktFWTQgKi8KKwlPSURfVU5LTk9XTihET1QxMV9PSURfU1RBS0VZLCAweDEyMDAwMDA4KSwKKwlPSURfVTMyKERPVDExX09JRF9SRUtFWVRIUkVTSE9MRCwgMHgxMjAwMDAwOSksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX1NUQVNDLCAweDEyMDAwMDBhKSwKKworCU9JRF9VMzIoRE9UMTFfT0lEX1BSSVZUWFJFSkVDVEVELCAweDFhMDAwMDAwKSwKKwlPSURfVTMyKERPVDExX09JRF9QUklWUlhQTEFJTiwgMHgxYTAwMDAwMSksCisJT0lEX1UzMihET1QxMV9PSURfUFJJVlJYRkFJTEVELCAweDFhMDAwMDAyKSwKKwlPSURfVTMyKERPVDExX09JRF9QUklWUlhOT0tFWSwgMHgxYTAwMDAwMyksCisKKwlPSURfVTMyX0MoRE9UMTFfT0lEX1JUU1RIUkVTSCwgMHgxMzAwMDAwMCksCisJT0lEX1UzMl9DKERPVDExX09JRF9GUkFHVEhSRVNILCAweDEzMDAwMDAxKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX1NIT1JUUkVUUklFUywgMHgxMzAwMDAwMiksCisJT0lEX1UzMl9DKERPVDExX09JRF9MT05HUkVUUklFUywgMHgxMzAwMDAwMyksCisJT0lEX1UzMl9DKERPVDExX09JRF9NQVhUWExJRkVUSU1FLCAweDEzMDAwMDA0KSwKKwlPSURfVTMyKERPVDExX09JRF9NQVhSWExJRkVUSU1FLCAweDEzMDAwMDA1KSwKKwlPSURfVTMyKERPVDExX09JRF9BVVRIUkVTUFRJTUVPVVQsIDB4MTMwMDAwMDYpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FTU09DUkVTUFRJTUVPVVQsIDB4MTMwMDAwMDcpLAorCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX0FMT0ZUX1RBQkxFLCAweDFkMDAwMDAwKSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfQUxPRlRfQ1RSTF9UQUJMRSwgMHgxZDAwMDAwMSksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX0FMT0ZUX1JFVFJFQVQsIDB4MWQwMDAwMDIpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9BTE9GVF9QUk9HUkVTUywgMHgxZDAwMDAwMyksCisJT0lEX1UzMihET1QxMV9PSURfQUxPRlRfRklYRURSQVRFLCAweDFkMDAwMDA0KSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfQUxPRlRfUlNTSUdSQVBILCAweDFkMDAwMDA1KSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfQUxPRlRfQ09ORklHLCAweDFkMDAwMDA2KSwKKworCVtET1QxMV9PSURfVkRDRlhdID0gezB4MWIwMDAwMDAsIDcsIDAsIDB9LAorCU9JRF9VMzIoRE9UMTFfT0lEX01BWEZSQU1FQlVSU1QsIDB4MWIwMDAwMDgpLAorCisJT0lEX1UzMihET1QxMV9PSURfUFNNLCAweDE0MDAwMDAwKSwKKwlPSURfVTMyKERPVDExX09JRF9DQU1USU1FT1VULCAweDE0MDAwMDAxKSwKKwlPSURfVTMyKERPVDExX09JRF9SRUNFSVZFRFRJTVMsIDB4MTQwMDAwMDIpLAorCU9JRF9VMzIoRE9UMTFfT0lEX1JPQU1QUkVGRVJFTkNFLCAweDE0MDAwMDAzKSwKKworCU9JRF9VMzIoRE9UMTFfT0lEX0JSSURHRUxPQ0FMLCAweDE1MDAwMDAwKSwKKwlPSURfVTMyKERPVDExX09JRF9DTElFTlRTLCAweDE1MDAwMDAxKSwKKwlPSURfVTMyKERPVDExX09JRF9DTElFTlRTQVNTT0NJQVRFRCwgMHgxNTAwMDAwMiksCisJW0RPVDExX09JRF9DTElFTlRYXSA9IHsweDE1MDAwMDAzLCAyMDA2LCAwLCAwfSwJLyogRE9UMTFfT0lEX0NMSUVOVFgsLi4uRE9UMTFfT0lEX0NMSUVOVDIwMDcgKi8KKworCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX0NMSUVOVEZJTkQsIDB4MTUwMDA3REIsIHU4WzZdLCBPSURfVFlQRV9BRERSKSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9XRFNMSU5LQURELCAweDE1MDAwN0RDLCB1OFs2XSwgT0lEX1RZUEVfQUREUiksCisJT0lEX1NUUlVDVChET1QxMV9PSURfV0RTTElOS1JFTU9WRSwgMHgxNTAwMDdERCwgdThbNl0sIE9JRF9UWVBFX0FERFIpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX0VBUEFVVEhTVEEsIDB4MTUwMDA3REUsIHU4WzZdLCBPSURfVFlQRV9BRERSKSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9FQVBVTkFVVEhTVEEsIDB4MTUwMDA3REYsIHU4WzZdLCBPSURfVFlQRV9BRERSKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX0RPVDFYRU5BQkxFLCAweDE1MDAwN0UwKSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfTUlDRkFJTFVSRSwgMHgxNTAwMDdFMSksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX1JFS0VZSU5ESUNBVEUsIDB4MTUwMDA3RTIpLAorCisJT0lEX1UzMihET1QxMV9PSURfTVBEVVRYU1VDQ0VTU0ZVTCwgMHgxNjAwMDAwMCksCisJT0lEX1UzMihET1QxMV9PSURfTVBEVVRYT05FUkVUUlksIDB4MTYwMDAwMDEpLAorCU9JRF9VMzIoRE9UMTFfT0lEX01QRFVUWE1VTFRJUExFUkVUUklFUywgMHgxNjAwMDAwMiksCisJT0lEX1UzMihET1QxMV9PSURfTVBEVVRYRkFJTEVELCAweDE2MDAwMDAzKSwKKwlPSURfVTMyKERPVDExX09JRF9NUERVUlhTVUNDRVNTRlVMLCAweDE2MDAwMDA0KSwKKwlPSURfVTMyKERPVDExX09JRF9NUERVUlhEVVBTLCAweDE2MDAwMDA1KSwKKwlPSURfVTMyKERPVDExX09JRF9SVFNTVUNDRVNTRlVMLCAweDE2MDAwMDA2KSwKKwlPSURfVTMyKERPVDExX09JRF9SVFNGQUlMRUQsIDB4MTYwMDAwMDcpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FDS0ZBSUxFRCwgMHgxNjAwMDAwOCksCisJT0lEX1UzMihET1QxMV9PSURfRlJBTUVSRUNFSVZFUywgMHgxNjAwMDAwOSksCisJT0lEX1UzMihET1QxMV9PSURfRlJBTUVFUlJPUlMsIDB4MTYwMDAwMEEpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0ZSQU1FQUJPUlRTLCAweDE2MDAwMDBCKSwKKwlPSURfVTMyKERPVDExX09JRF9GUkFNRUFCT1JUU1BIWSwgMHgxNjAwMDAwQyksCisKKwlPSURfVTMyKERPVDExX09JRF9TTE9UVElNRSwgMHgxNzAwMDAwMCksCisJT0lEX1UzMihET1QxMV9PSURfQ1dNSU4sIDB4MTcwMDAwMDEpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0NXTUFYLCAweDE3MDAwMDAyKSwKKwlPSURfVTMyKERPVDExX09JRF9BQ0tXSU5ET1csIDB4MTcwMDAwMDMpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FOVEVOTkFSWCwgMHgxNzAwMDAwNCksCisJT0lEX1UzMihET1QxMV9PSURfQU5URU5OQVRYLCAweDE3MDAwMDA1KSwKKwlPSURfVTMyKERPVDExX09JRF9BTlRFTk5BRElWRVJTSVRZLCAweDE3MDAwMDA2KSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX0NIQU5ORUwsIDB4MTcwMDAwMDcpLAorCU9JRF9VMzJfQyhET1QxMV9PSURfRURUSFJFU0hPTEQsIDB4MTcwMDAwMDgpLAorCU9JRF9VMzIoRE9UMTFfT0lEX1BSRUFNQkxFU0VUVElOR1MsIDB4MTcwMDAwMDkpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX1JBVEVTLCAweDE3MDAwMDBBLCB1OFtJV01BWF9CSVRSQVRFUyArIDFdLAorCQkgICBPSURfVFlQRV9SQVcpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0NDQU1PREVTVVBQT1JURUQsIDB4MTcwMDAwMEIpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0NDQU1PREUsIDB4MTcwMDAwMEMpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9SU1NJVkVDVE9SLCAweDE3MDAwMDBEKSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfT1VUUFVUUE9XRVJUQUJMRSwgMHgxNzAwMDAwRSksCisJT0lEX1UzMihET1QxMV9PSURfT1VUUFVUUE9XRVIsIDB4MTcwMDAwMEYpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX1NVUFBPUlRFRFJBVEVTLCAweDE3MDAwMDEwLAorCQkgICB1OFtJV01BWF9CSVRSQVRFUyArIDFdLCBPSURfVFlQRV9SQVcpLAorCU9JRF9VMzJfQyhET1QxMV9PSURfRlJFUVVFTkNZLCAweDE3MDAwMDExKSwKKwlbRE9UMTFfT0lEX1NVUFBPUlRFREZSRVFVRU5DSUVTXSA9CisJICAgIHsweDE3MDAwMDEyLCAwLCBzaXplb2YgKHN0cnVjdCBvYmpfZnJlcXVlbmNpZXMpCisJICAgICArIHNpemVvZiAodTE2KSAqIElXTUFYX0ZSRVEsIE9JRF9UWVBFX0ZSRVFVRU5DSUVTfSwKKworCU9JRF9VMzIoRE9UMTFfT0lEX05PSVNFRkxPT1IsIDB4MTcwMDAwMTMpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX0ZSRVFVRU5DWUFDVElWSVRZLCAweDE3MDAwMDE0LCB1OFtJV01BWF9GUkVRICsgMV0sCisJCSAgIE9JRF9UWVBFX1JBVyksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX0lRQ0FMSUJSQVRJT05UQUJMRSwgMHgxNzAwMDAxNSksCisJT0lEX1UzMihET1QxMV9PSURfTk9ORVJQUFJPVEVDVElPTiwgMHgxNzAwMDAxNiksCisJT0lEX1UzMihET1QxMV9PSURfU0xPVFNFVFRJTkdTLCAweDE3MDAwMDE3KSwKKwlPSURfVTMyKERPVDExX09JRF9OT05FUlBUSU1FT1VULCAweDE3MDAwMDE4KSwKKwlPSURfVTMyKERPVDExX09JRF9QUk9GSUxFUywgMHgxNzAwMDAxOSksCisJT0lEX1NUUlVDVChET1QxMV9PSURfRVhURU5ERURSQVRFUywgMHgxNzAwMDAyMCwKKwkJICAgdThbSVdNQVhfQklUUkFURVMgKyAxXSwgT0lEX1RZUEVfUkFXKSwKKworCU9JRF9TVFJVQ1RfTUxNRShET1QxMV9PSURfREVBVVRIRU5USUNBVEUsIDB4MTgwMDAwMDApLAorCU9JRF9TVFJVQ1RfTUxNRShET1QxMV9PSURfQVVUSEVOVElDQVRFLCAweDE4MDAwMDAxKSwKKwlPSURfU1RSVUNUX01MTUUoRE9UMTFfT0lEX0RJU0FTU09DSUFURSwgMHgxODAwMDAwMiksCisJT0lEX1NUUlVDVF9NTE1FKERPVDExX09JRF9BU1NPQ0lBVEUsIDB4MTgwMDAwMDMpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9TQ0FOLCAweDE4MDAwMDA0KSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfQkVBQ09OLCAweDE4MDAwMDA1KSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfUFJPQkUsIDB4MTgwMDAwMDYpLAorCU9JRF9TVFJVQ1RfTUxNRUVYKERPVDExX09JRF9ERUFVVEhFTlRJQ0FURUVYLCAweDE4MDAwMDA3KSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfQVVUSEVOVElDQVRFRVgsIDB4MTgwMDAwMDgpLAorCU9JRF9TVFJVQ1RfTUxNRUVYKERPVDExX09JRF9ESVNBU1NPQ0lBVEVFWCwgMHgxODAwMDAwOSksCisJT0lEX1NUUlVDVF9NTE1FRVgoRE9UMTFfT0lEX0FTU09DSUFURUVYLCAweDE4MDAwMDBBKSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfUkVBU1NPQ0lBVEUsIDB4MTgwMDAwMEIpLAorCU9JRF9TVFJVQ1RfTUxNRUVYKERPVDExX09JRF9SRUFTU09DSUFURUVYLCAweDE4MDAwMDBDKSwKKworCU9JRF9VMzIoRE9UMTFfT0lEX05PTkVSUFNUQVRVUywgMHgxRTAwMDAwMCksCisKKwlPSURfVTMyKERPVDExX09JRF9TVEFUSU1FT1VULCAweDE5MDAwMDAwKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX01MTUVBVVRPTEVWRUwsIDB4MTkwMDAwMDEpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0JTU1RJTUVPVVQsIDB4MTkwMDAwMDIpLAorCVtET1QxMV9PSURfQVRUQUNITUVOVF0gPSB7MHgxOTAwMDAwMywgMCwKKwkJc2l6ZW9mKHN0cnVjdCBvYmpfYXR0YWNobWVudCksIE9JRF9UWVBFX0FUVEFDSH0sCisJT0lEX1NUUlVDVF9DKERPVDExX09JRF9QU01CVUZGRVIsIDB4MTkwMDAwMDQsIHN0cnVjdCBvYmpfYnVmZmVyLAorCQkgICAgIE9JRF9UWVBFX0JVRkZFUiksCisKKwlPSURfVTMyKERPVDExX09JRF9CU1NTLCAweDFDMDAwMDAwKSwKKwlbRE9UMTFfT0lEX0JTU1hdID0gezB4MUMwMDAwMDEsIDYzLCBzaXplb2YgKHN0cnVjdCBvYmpfYnNzKSwKKwkJCSAgICBPSURfVFlQRV9CU1N9LAkvKkRPVDExX09JRF9CU1MxLC4uLixET1QxMV9PSURfQlNTNjQgKi8KKwlPSURfU1RSVUNUKERPVDExX09JRF9CU1NGSU5ELCAweDFDMDAwMDQyLCBzdHJ1Y3Qgb2JqX2JzcywgT0lEX1RZUEVfQlNTKSwKKwlbRE9UMTFfT0lEX0JTU0xJU1RdID0gezB4MUMwMDAwNDMsIDAsIHNpemVvZiAoc3RydWN0CisJCQkJCQkgICAgICBvYmpfYnNzbGlzdCkgKworCQkJICAgICAgIHNpemVvZiAoc3RydWN0IG9ial9ic3NbSVdNQVhfQlNTXSksCisJCQkgICAgICAgT0lEX1RZUEVfQlNTTElTVH0sCisKKwlPSURfVU5LTk9XTihPSURfSU5MX1RVTk5FTCwgMHhGRjAyMDAwMCksCisJT0lEX1VOS05PV04oT0lEX0lOTF9NRU1BRERSLCAweEZGMDIwMDAxKSwKKwlPSURfVU5LTk9XTihPSURfSU5MX01FTU9SWSwgMHhGRjAyMDAwMiksCisJT0lEX1UzMl9DKE9JRF9JTkxfTU9ERSwgMHhGRjAyMDAwMyksCisJT0lEX1VOS05PV04oT0lEX0lOTF9DT01QT05FTlRfTlIsIDB4RkYwMjAwMDQpLAorCU9JRF9TVFJVQ1QoT0lEX0lOTF9WRVJTSU9OLCAweEZGMDIwMDA1LCB1OFs4XSwgT0lEX1RZUEVfUkFXKSwKKwlPSURfVU5LTk9XTihPSURfSU5MX0lOVEVSRkFDRV9JRCwgMHhGRjAyMDAwNiksCisJT0lEX1VOS05PV04oT0lEX0lOTF9DT01QT05FTlRfSUQsIDB4RkYwMjAwMDcpLAorCU9JRF9VMzJfQyhPSURfSU5MX0NPTkZJRywgMHhGRjAyMDAwOCksCisJT0lEX1UzMl9DKE9JRF9JTkxfRE9UMTFEX0NPTkZPUk1BTkNFLCAweEZGMDIwMDBDKSwKKwlPSURfVTMyKE9JRF9JTkxfUEhZQ0FQQUJJTElUSUVTLCAweEZGMDIwMDBEKSwKKwlPSURfVTMyX0MoT0lEX0lOTF9PVVRQVVRQT1dFUiwgMHhGRjAyMDAwRiksCisKK307CisKK2ludAorbWd0X2luaXQoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGk7CisKKwlwcml2LT5taWIgPSBrbWFsbG9jKE9JRF9OVU1fTEFTVCAqIHNpemVvZiAodm9pZCAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5taWIpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHByaXYtPm1pYiwgMCwgT0lEX05VTV9MQVNUICogc2l6ZW9mICh2b2lkICopKTsKKworCS8qIEFsbG9jIHRoZSBjYWNoZSAqLworCWZvciAoaSA9IDA7IGkgPCBPSURfTlVNX0xBU1Q7IGkrKykgeworCQlpZiAoaXNsX29pZFtpXS5mbGFncyAmIE9JRF9GTEFHX0NBQ0hFRCkgeworCQkJcHJpdi0+bWliW2ldID0ga21hbGxvYyhpc2xfb2lkW2ldLnNpemUgKgorCQkJCQkgICAgICAgKGlzbF9vaWRbaV0ucmFuZ2UgKyAxKSwKKwkJCQkJICAgICAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFwcml2LT5taWJbaV0pCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQltZW1zZXQocHJpdi0+bWliW2ldLCAwLAorCQkJICAgICAgIGlzbF9vaWRbaV0uc2l6ZSAqIChpc2xfb2lkW2ldLnJhbmdlICsgMSkpOworCQl9IGVsc2UKKwkJCXByaXYtPm1pYltpXSA9IE5VTEw7CisJfQorCisJaW5pdF9yd3NlbSgmcHJpdi0+bWliX3NlbSk7CisJcHJpc201NF9taWJfaW5pdChwcml2KTsKKworCXJldHVybiAwOworfQorCit2b2lkCittZ3RfY2xlYW4oaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGk7CisKKwlpZiAoIXByaXYtPm1pYikKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBPSURfTlVNX0xBU1Q7IGkrKykKKwkJaWYgKHByaXYtPm1pYltpXSkgeworCQkJa2ZyZWUocHJpdi0+bWliW2ldKTsKKwkJCXByaXYtPm1pYltpXSA9IE5VTEw7CisJCX0KKwlrZnJlZShwcml2LT5taWIpOworCXByaXYtPm1pYiA9IE5VTEw7Cit9CisKK3ZvaWQKK21ndF9sZV90b19jcHUoaW50IHR5cGUsIHZvaWQgKmRhdGEpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBPSURfVFlQRV9VMzI6CisJCSoodTMyICopIGRhdGEgPSBsZTMyX3RvX2NwdSgqKHUzMiAqKSBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBPSURfVFlQRV9CVUZGRVI6eworCQkJc3RydWN0IG9ial9idWZmZXIgKmJ1ZmYgPSBkYXRhOworCQkJYnVmZi0+c2l6ZSA9IGxlMzJfdG9fY3B1KGJ1ZmYtPnNpemUpOworCQkJYnVmZi0+YWRkciA9IGxlMzJfdG9fY3B1KGJ1ZmYtPmFkZHIpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0JTUzp7CisJCQlzdHJ1Y3Qgb2JqX2JzcyAqYnNzID0gZGF0YTsKKwkJCWJzcy0+YWdlID0gbGUxNl90b19jcHUoYnNzLT5hZ2UpOworCQkJYnNzLT5jaGFubmVsID0gbGUxNl90b19jcHUoYnNzLT5jaGFubmVsKTsKKwkJCWJzcy0+Y2FwaW5mbyA9IGxlMTZfdG9fY3B1KGJzcy0+Y2FwaW5mbyk7CisJCQlic3MtPnJhdGVzID0gbGUxNl90b19jcHUoYnNzLT5yYXRlcyk7CisJCQlic3MtPmJhc2ljX3JhdGVzID0gbGUxNl90b19jcHUoYnNzLT5iYXNpY19yYXRlcyk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfQlNTTElTVDp7CisJCQlzdHJ1Y3Qgb2JqX2Jzc2xpc3QgKmxpc3QgPSBkYXRhOworCQkJaW50IGk7CisJCQlsaXN0LT5uciA9IGxlMzJfdG9fY3B1KGxpc3QtPm5yKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5ucjsgaSsrKQorCQkJCW1ndF9sZV90b19jcHUoT0lEX1RZUEVfQlNTLCAmbGlzdC0+YnNzbGlzdFtpXSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfRlJFUVVFTkNJRVM6eworCQkJc3RydWN0IG9ial9mcmVxdWVuY2llcyAqZnJlcSA9IGRhdGE7CisJCQlpbnQgaTsKKwkJCWZyZXEtPm5yID0gbGUxNl90b19jcHUoZnJlcS0+bnIpOworCQkJZm9yIChpID0gMDsgaSA8IGZyZXEtPm5yOyBpKyspCisJCQkJZnJlcS0+bWh6W2ldID0gbGUxNl90b19jcHUoZnJlcS0+bWh6W2ldKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9NTE1FOnsKKwkJCXN0cnVjdCBvYmpfbWxtZSAqbWxtZSA9IGRhdGE7CisJCQltbG1lLT5pZCA9IGxlMTZfdG9fY3B1KG1sbWUtPmlkKTsKKwkJCW1sbWUtPnN0YXRlID0gbGUxNl90b19jcHUobWxtZS0+c3RhdGUpOworCQkJbWxtZS0+Y29kZSA9IGxlMTZfdG9fY3B1KG1sbWUtPmNvZGUpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX01MTUVFWDp7CisJCQlzdHJ1Y3Qgb2JqX21sbWVleCAqbWxtZSA9IGRhdGE7CisJCQltbG1lLT5pZCA9IGxlMTZfdG9fY3B1KG1sbWUtPmlkKTsKKwkJCW1sbWUtPnN0YXRlID0gbGUxNl90b19jcHUobWxtZS0+c3RhdGUpOworCQkJbWxtZS0+Y29kZSA9IGxlMTZfdG9fY3B1KG1sbWUtPmNvZGUpOworCQkJbWxtZS0+c2l6ZSA9IGxlMTZfdG9fY3B1KG1sbWUtPnNpemUpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0FUVEFDSDp7CisJCQlzdHJ1Y3Qgb2JqX2F0dGFjaG1lbnQgKmF0dGFjaCA9IGRhdGE7CisJCQlhdHRhY2gtPmlkID0gbGUxNl90b19jcHUoYXR0YWNoLT5pZCk7CisJCQlhdHRhY2gtPnNpemUgPSBsZTE2X3RvX2NwdShhdHRhY2gtPnNpemUpOzsgCisJCQlicmVhazsKKwl9CisJY2FzZSBPSURfVFlQRV9TU0lEOgorCWNhc2UgT0lEX1RZUEVfS0VZOgorCWNhc2UgT0lEX1RZUEVfQUREUjoKKwljYXNlIE9JRF9UWVBFX1JBVzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorbWd0X2NwdV90b19sZShpbnQgdHlwZSwgdm9pZCAqZGF0YSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE9JRF9UWVBFX1UzMjoKKwkJKih1MzIgKikgZGF0YSA9IGNwdV90b19sZTMyKCoodTMyICopIGRhdGEpOworCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX0JVRkZFUjp7CisJCQlzdHJ1Y3Qgb2JqX2J1ZmZlciAqYnVmZiA9IGRhdGE7CisJCQlidWZmLT5zaXplID0gY3B1X3RvX2xlMzIoYnVmZi0+c2l6ZSk7CisJCQlidWZmLT5hZGRyID0gY3B1X3RvX2xlMzIoYnVmZi0+YWRkcik7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfQlNTOnsKKwkJCXN0cnVjdCBvYmpfYnNzICpic3MgPSBkYXRhOworCQkJYnNzLT5hZ2UgPSBjcHVfdG9fbGUxNihic3MtPmFnZSk7CisJCQlic3MtPmNoYW5uZWwgPSBjcHVfdG9fbGUxNihic3MtPmNoYW5uZWwpOworCQkJYnNzLT5jYXBpbmZvID0gY3B1X3RvX2xlMTYoYnNzLT5jYXBpbmZvKTsKKwkJCWJzcy0+cmF0ZXMgPSBjcHVfdG9fbGUxNihic3MtPnJhdGVzKTsKKwkJCWJzcy0+YmFzaWNfcmF0ZXMgPSBjcHVfdG9fbGUxNihic3MtPmJhc2ljX3JhdGVzKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9CU1NMSVNUOnsKKwkJCXN0cnVjdCBvYmpfYnNzbGlzdCAqbGlzdCA9IGRhdGE7CisJCQlpbnQgaTsKKwkJCWxpc3QtPm5yID0gY3B1X3RvX2xlMzIobGlzdC0+bnIpOworCQkJZm9yIChpID0gMDsgaSA8IGxpc3QtPm5yOyBpKyspCisJCQkJbWd0X2NwdV90b19sZShPSURfVFlQRV9CU1MsICZsaXN0LT5ic3NsaXN0W2ldKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9GUkVRVUVOQ0lFUzp7CisJCQlzdHJ1Y3Qgb2JqX2ZyZXF1ZW5jaWVzICpmcmVxID0gZGF0YTsKKwkJCWludCBpOworCQkJZnJlcS0+bnIgPSBjcHVfdG9fbGUxNihmcmVxLT5ucik7CisJCQlmb3IgKGkgPSAwOyBpIDwgZnJlcS0+bnI7IGkrKykKKwkJCQlmcmVxLT5taHpbaV0gPSBjcHVfdG9fbGUxNihmcmVxLT5taHpbaV0pOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX01MTUU6eworCQkJc3RydWN0IG9ial9tbG1lICptbG1lID0gZGF0YTsKKwkJCW1sbWUtPmlkID0gY3B1X3RvX2xlMTYobWxtZS0+aWQpOworCQkJbWxtZS0+c3RhdGUgPSBjcHVfdG9fbGUxNihtbG1lLT5zdGF0ZSk7CisJCQltbG1lLT5jb2RlID0gY3B1X3RvX2xlMTYobWxtZS0+Y29kZSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfTUxNRUVYOnsKKwkJCXN0cnVjdCBvYmpfbWxtZWV4ICptbG1lID0gZGF0YTsKKwkJCW1sbWUtPmlkID0gY3B1X3RvX2xlMTYobWxtZS0+aWQpOworCQkJbWxtZS0+c3RhdGUgPSBjcHVfdG9fbGUxNihtbG1lLT5zdGF0ZSk7CisJCQltbG1lLT5jb2RlID0gY3B1X3RvX2xlMTYobWxtZS0+Y29kZSk7CisJCQltbG1lLT5zaXplID0gY3B1X3RvX2xlMTYobWxtZS0+c2l6ZSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfQVRUQUNIOnsKKwkJCXN0cnVjdCBvYmpfYXR0YWNobWVudCAqYXR0YWNoID0gZGF0YTsKKwkJCWF0dGFjaC0+aWQgPSBjcHVfdG9fbGUxNihhdHRhY2gtPmlkKTsKKwkJCWF0dGFjaC0+c2l6ZSA9IGNwdV90b19sZTE2KGF0dGFjaC0+c2l6ZSk7OyAKKwkJCWJyZWFrOworCX0KKwljYXNlIE9JRF9UWVBFX1NTSUQ6CisJY2FzZSBPSURfVFlQRV9LRVk6CisJY2FzZSBPSURfVFlQRV9BRERSOgorCWNhc2UgT0lEX1RZUEVfUkFXOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKKy8qIE5vdGUgOiBkYXRhIGlzIG1vZGlmaWVkIGR1cmluZyB0aGlzIGZ1bmN0aW9uICovCisKK2ludAorbWd0X3NldF9yZXF1ZXN0KGlzbHBjaV9wcml2YXRlICpwcml2LCBlbnVtIG9pZF9udW1fdCBuLCBpbnQgZXh0cmEsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKnJlc3BvbnNlID0gTlVMTDsKKwlpbnQgcmVzcG9uc2Vfb3AgPSBQSU1GT1JfT1BfRVJST1I7CisJaW50IGRsZW47CisJdm9pZCAqY2FjaGUsICpfZGF0YSA9IGRhdGE7CisJdTMyIG9pZDsKKworCUJVR19PTihPSURfTlVNX0xBU1QgPD0gbik7CisJQlVHX09OKGV4dHJhID4gaXNsX29pZFtuXS5yYW5nZSk7CisKKwlpZiAoIXByaXYtPm1pYikKKwkJLyogbWVtb3J5IGhhcyBiZWVuIGZyZWVkICovCisJCXJldHVybiAtMTsKKworCWRsZW4gPSBpc2xfb2lkW25dLnNpemU7CisJY2FjaGUgPSBwcml2LT5taWJbbl07CisJY2FjaGUgKz0gKGNhY2hlID8gZXh0cmEgKiBkbGVuIDogMCk7CisJb2lkID0gaXNsX29pZFtuXS5vaWQgKyBleHRyYTsKKworCWlmIChfZGF0YSA9PSBOVUxMKQorCQkvKiB3ZSBhcmUgcmVxdWVzdGVkIHRvIHJlLXNldCBhIGNhY2hlZCB2YWx1ZSAqLworCQlfZGF0YSA9IGNhY2hlOworCWVsc2UKKwkJbWd0X2NwdV90b19sZShpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgX2RhdGEpOworCS8qIElmIHdlIGFyZSBnb2luZyB0byB3cml0ZSB0byB0aGUgY2FjaGUsIHdlIGRvbid0IHdhbnQgYW55b25lIHRvIHJlYWQKKwkgKiBpdCAtPiBhY3F1aXJlIHdyaXRlIGxvY2suCisJICogRWxzZSB3ZSBjb3VsZCBhY3F1aXJlIGEgcmVhZCBsb2NrIHRvIGJlIHN1cmUgd2UgZG9uJ3QgYm90aGVyIHRoZQorCSAqIGNvbW1pdCBwcm9jZXNzICh3aGljaCB0YWtlcyBhIHdyaXRlIGxvY2spLiBCdXQgSSdtIG5vdCBzdXJlIGlmIGl0J3MKKwkgKiBuZWVkZWQuCisJICovCisJaWYgKGNhY2hlKQorCQlkb3duX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpID49IFBSVl9TVEFURV9SRUFEWSkgeworCQlyZXQgPSBpc2xwY2lfbWd0X3RyYW5zYWN0aW9uKHByaXYtPm5kZXYsIFBJTUZPUl9PUF9TRVQsIG9pZCwKKwkJCQkJICAgICBfZGF0YSwgZGxlbiwgJnJlc3BvbnNlKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXJlc3BvbnNlX29wID0gcmVzcG9uc2UtPmhlYWRlci0+b3BlcmF0aW9uOworCQkJaXNscGNpX21ndF9yZWxlYXNlKHJlc3BvbnNlKTsKKwkJfQorCQlpZiAocmV0IHx8IHJlc3BvbnNlX29wID09IFBJTUZPUl9PUF9FUlJPUikKKwkJCXJldCA9IC1FSU87CisJfSBlbHNlIGlmICghY2FjaGUpCisJCXJldCA9IC1FSU87CisKKwlpZiAoY2FjaGUpIHsKKwkJaWYgKCFyZXQgJiYgZGF0YSkKKwkJCW1lbWNweShjYWNoZSwgX2RhdGEsIGRsZW4pOworCQl1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisJfQorCisJLyogcmUtc2V0IGdpdmVuIGRhdGEgdG8gd2hhdCBpdCB3YXMgKi8KKwlpZiAoZGF0YSkKKwkJbWd0X2xlX3RvX2NwdShpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBOb25lIG9mIHRoZXNlIGFyZSBjYWNoZWQgKi8KK2ludAorbWd0X3NldF92YXJsZW4oaXNscGNpX3ByaXZhdGUgKnByaXYsIGVudW0gb2lkX251bV90IG4sIHZvaWQgKmRhdGEsIGludCBleHRyYV9sZW4pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKnJlc3BvbnNlOworCWludCByZXNwb25zZV9vcCA9IFBJTUZPUl9PUF9FUlJPUjsKKwlpbnQgZGxlbjsKKwl1MzIgb2lkOworCisJQlVHX09OKE9JRF9OVU1fTEFTVCA8PSBuKTsKKworCWRsZW4gPSBpc2xfb2lkW25dLnNpemU7CisJb2lkID0gaXNsX29pZFtuXS5vaWQ7CisKKwltZ3RfY3B1X3RvX2xlKGlzbF9vaWRbbl0uZmxhZ3MgJiBPSURfRkxBR19UWVBFLCBkYXRhKTsKKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpID49IFBSVl9TVEFURV9SRUFEWSkgeworCQlyZXQgPSBpc2xwY2lfbWd0X3RyYW5zYWN0aW9uKHByaXYtPm5kZXYsIFBJTUZPUl9PUF9TRVQsIG9pZCwKKwkJCQkJICAgICBkYXRhLCBkbGVuICsgZXh0cmFfbGVuLCAmcmVzcG9uc2UpOworCQlpZiAoIXJldCkgeworCQkJcmVzcG9uc2Vfb3AgPSByZXNwb25zZS0+aGVhZGVyLT5vcGVyYXRpb247CisJCQlpc2xwY2lfbWd0X3JlbGVhc2UocmVzcG9uc2UpOworCQl9CisJCWlmIChyZXQgfHwgcmVzcG9uc2Vfb3AgPT0gUElNRk9SX09QX0VSUk9SKQorCQkJcmV0ID0gLUVJTzsKKwl9IGVsc2UgCisJCXJldCA9IC1FSU87CisKKwkvKiByZS1zZXQgZ2l2ZW4gZGF0YSB0byB3aGF0IGl0IHdhcyAqLworCWlmIChkYXRhKQorCQltZ3RfbGVfdG9fY3B1KGlzbF9vaWRbbl0uZmxhZ3MgJiBPSURfRkxBR19UWVBFLCBkYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludAorbWd0X2dldF9yZXF1ZXN0KGlzbHBjaV9wcml2YXRlICpwcml2LCBlbnVtIG9pZF9udW1fdCBuLCBpbnQgZXh0cmEsIHZvaWQgKmRhdGEsCisJCXVuaW9uIG9pZF9yZXNfdCAqcmVzKQoreworCisJaW50IHJldCA9IC1FSU87CisJaW50IHJlc2xlbiA9IDA7CisJc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKnJlc3BvbnNlID0gTlVMTDsKKworCWludCBkbGVuOworCXZvaWQgKmNhY2hlLCAqX3JlcyA9IE5VTEw7CisJdTMyIG9pZDsKKworCUJVR19PTihPSURfTlVNX0xBU1QgPD0gbik7CisJQlVHX09OKGV4dHJhID4gaXNsX29pZFtuXS5yYW5nZSk7CisKKwlyZXMtPnB0ciA9IE5VTEw7CisKKwlpZiAoIXByaXYtPm1pYikKKwkJLyogbWVtb3J5IGhhcyBiZWVuIGZyZWVkICovCisJCXJldHVybiAtMTsKKworCWRsZW4gPSBpc2xfb2lkW25dLnNpemU7CisJY2FjaGUgPSBwcml2LT5taWJbbl07CisJY2FjaGUgKz0gY2FjaGUgPyBleHRyYSAqIGRsZW4gOiAwOworCW9pZCA9IGlzbF9vaWRbbl0ub2lkICsgZXh0cmE7CisJcmVzbGVuID0gZGxlbjsKKworCWlmIChjYWNoZSkKKwkJZG93bl9yZWFkKCZwcml2LT5taWJfc2VtKTsKKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpID49IFBSVl9TVEFURV9SRUFEWSkgeworCQlyZXQgPSBpc2xwY2lfbWd0X3RyYW5zYWN0aW9uKHByaXYtPm5kZXYsIFBJTUZPUl9PUF9HRVQsCisJCQkJCSAgICAgb2lkLCBkYXRhLCBkbGVuLCAmcmVzcG9uc2UpOworCQlpZiAocmV0IHx8ICFyZXNwb25zZSB8fAorCQkgICAgcmVzcG9uc2UtPmhlYWRlci0+b3BlcmF0aW9uID09IFBJTUZPUl9PUF9FUlJPUikgeworCQkJaWYgKHJlc3BvbnNlKQorCQkJCWlzbHBjaV9tZ3RfcmVsZWFzZShyZXNwb25zZSk7CisJCQlyZXQgPSAtRUlPOworCQl9CisJCWlmICghcmV0KSB7CisJCQlfcmVzID0gcmVzcG9uc2UtPmRhdGE7CisJCQlyZXNsZW4gPSByZXNwb25zZS0+aGVhZGVyLT5sZW5ndGg7CisJCX0KKwl9IGVsc2UgaWYgKGNhY2hlKSB7CisJCV9yZXMgPSBjYWNoZTsKKwkJcmV0ID0gMDsKKwl9CisJaWYgKChpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSkgPT0gT0lEX1RZUEVfVTMyKQorCQlyZXMtPnUgPSByZXQgPyAwIDogbGUzMl90b19jcHUoKih1MzIgKikgX3Jlcyk7CisJZWxzZSB7CisJCXJlcy0+cHRyID0ga21hbGxvYyhyZXNsZW4sIEdGUF9LRVJORUwpOworCQlCVUdfT04ocmVzLT5wdHIgPT0gTlVMTCk7CisJCWlmIChyZXQpCisJCQltZW1zZXQocmVzLT5wdHIsIDAsIHJlc2xlbik7CisJCWVsc2UgeworCQkJbWVtY3B5KHJlcy0+cHRyLCBfcmVzLCByZXNsZW4pOworCQkJbWd0X2xlX3RvX2NwdShpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwKKwkJCQkgICAgICByZXMtPnB0cik7CisJCX0KKwl9CisJaWYgKGNhY2hlKQorCQl1cF9yZWFkKCZwcml2LT5taWJfc2VtKTsKKworCWlmIChyZXNwb25zZSAmJiAhcmV0KQorCQlpc2xwY2lfbWd0X3JlbGVhc2UocmVzcG9uc2UpOworCisJaWYgKHJlc2xlbiA+IGlzbF9vaWRbbl0uc2l6ZSkKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJtZ3RfZ2V0X3JlcXVlc3QoMHgleCk6IHJlY2VpdmVkIGRhdGEgbGVuZ3RoIHdhcyBiaWdnZXIgIgorCQkgICAgICAgInRoYW4gZXhwZWN0ZWQgKCVkID4gJWQpLiBNZW1vcnkgaXMgcHJvYmFibHkgY29ycnVwdGVkLi4uIiwKKwkJICAgICAgIG9pZCwgcmVzbGVuLCBpc2xfb2lkW25dLnNpemUpOworCisJcmV0dXJuIHJldDsKK30KKworLyogbG9jayBvdXRzaWRlICovCitpbnQKK21ndF9jb21taXRfbGlzdChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgZW51bSBvaWRfbnVtX3QgKmwsIGludCBuKQoreworCWludCBpLCByZXQgPSAwOworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpyZXNwb25zZTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJc3RydWN0IG9pZF90ICp0ID0gJihpc2xfb2lkW2xbaV1dKTsKKwkJdm9pZCAqZGF0YSA9IHByaXYtPm1pYltsW2ldXTsKKwkJaW50IGogPSAwOworCQl1MzIgb2lkID0gdC0+b2lkOworCQlCVUdfT04oZGF0YSA9PSBOVUxMKTsKKwkJd2hpbGUgKGogPD0gdC0+cmFuZ2UpIHsKKwkJCWludCByID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfU0VULAorCQkJCQkJICAgICAgb2lkLCBkYXRhLCB0LT5zaXplLAorCQkJCQkJICAgICAgJnJlc3BvbnNlKTsKKwkJCWlmIChyZXNwb25zZSkgeworCQkJCXIgfD0gKHJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbiA9PSBQSU1GT1JfT1BfRVJST1IpOworCQkJCWlzbHBjaV9tZ3RfcmVsZWFzZShyZXNwb25zZSk7CisJCQl9CisJCQlpZiAocikKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZ3RfY29tbWl0X2xpc3Q6IGZhaWx1cmUuICIKKwkJCQkJIm9pZD0lMDh4IGVycj0lZFxuIiwKKwkJCQkJcHJpdi0+bmRldi0+bmFtZSwgb2lkLCByKTsKKwkJCXJldCB8PSByOworCQkJaisrOworCQkJb2lkKys7CisJCQlkYXRhICs9IHQtPnNpemU7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogTG9jayBvdXRzaWRlICovCisKK3ZvaWQKK21ndF9zZXQoaXNscGNpX3ByaXZhdGUgKnByaXYsIGVudW0gb2lkX251bV90IG4sIHZvaWQgKmRhdGEpCit7CisJQlVHX09OKE9JRF9OVU1fTEFTVCA8PSBuKTsKKwlCVUdfT04ocHJpdi0+bWliW25dID09IE5VTEwpOworCisJbWVtY3B5KHByaXYtPm1pYltuXSwgZGF0YSwgaXNsX29pZFtuXS5zaXplKTsKKwltZ3RfY3B1X3RvX2xlKGlzbF9vaWRbbl0uZmxhZ3MgJiBPSURfRkxBR19UWVBFLCBwcml2LT5taWJbbl0pOworfQorCit2b2lkCittZ3RfZ2V0KGlzbHBjaV9wcml2YXRlICpwcml2LCBlbnVtIG9pZF9udW1fdCBuLCB2b2lkICpyZXMpCit7CisJQlVHX09OKE9JRF9OVU1fTEFTVCA8PSBuKTsKKwlCVUdfT04ocHJpdi0+bWliW25dID09IE5VTEwpOworCUJVR19PTihyZXMgPT0gTlVMTCk7CisKKwltZW1jcHkocmVzLCBwcml2LT5taWJbbl0sIGlzbF9vaWRbbl0uc2l6ZSk7CisJbWd0X2xlX3RvX2NwdShpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgcmVzKTsKK30KKworLyogQ29tbWl0cyB0aGUgY2FjaGUuIExvY2sgb3V0c2lkZS4gKi8KKworc3RhdGljIGVudW0gb2lkX251bV90IGNvbW1pdF9wYXJ0MVtdID0geworCU9JRF9JTkxfQ09ORklHLAorCU9JRF9JTkxfTU9ERSwKKwlET1QxMV9PSURfQlNTVFlQRSwKKwlET1QxMV9PSURfQ0hBTk5FTCwKKwlET1QxMV9PSURfTUxNRUFVVE9MRVZFTAorfTsKKworc3RhdGljIGVudW0gb2lkX251bV90IGNvbW1pdF9wYXJ0MltdID0geworCURPVDExX09JRF9TU0lELAorCURPVDExX09JRF9QU01CVUZGRVIsCisJRE9UMTFfT0lEX0FVVEhFTkFCTEUsCisJRE9UMTFfT0lEX1BSSVZBQ1lJTlZPS0VELAorCURPVDExX09JRF9FWFVORU5DUllQVEVELAorCURPVDExX09JRF9ERUZLRVlYLAkvKiBNVUxUSVBMRSAqLworCURPVDExX09JRF9ERUZLRVlJRCwKKwlET1QxMV9PSURfRE9UMVhFTkFCTEUsCisJT0lEX0lOTF9ET1QxMURfQ09ORk9STUFOQ0UsCisJLyogRG8gbm90IGluaXRpYWxpemUgdGhpcyAtIGZ3IDwgMS4wLjQuMyByZWplY3RzIGl0CisJT0lEX0lOTF9PVVRQVVRQT1dFUiwKKwkqLworfTsKKworLyogdXBkYXRlIHRoZSBNQUMgYWRkci4gKi8KK3N0YXRpYyBpbnQKK21ndF91cGRhdGVfYWRkcihpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqcmVzOworCWludCByZXQ7CisKKwlyZXQgPSBpc2xwY2lfbWd0X3RyYW5zYWN0aW9uKHByaXYtPm5kZXYsIFBJTUZPUl9PUF9HRVQsCisJCQkJICAgICBpc2xfb2lkW0dFTl9PSURfTUFDQUREUkVTU10ub2lkLCBOVUxMLAorCQkJCSAgICAgaXNsX29pZFtHRU5fT0lEX01BQ0FERFJFU1NdLnNpemUsICZyZXMpOworCisJaWYgKChyZXQgPT0gMCkgJiYgcmVzICYmIChyZXMtPmhlYWRlci0+b3BlcmF0aW9uICE9IFBJTUZPUl9PUF9FUlJPUikpCisJCW1lbWNweShwcml2LT5uZGV2LT5kZXZfYWRkciwgcmVzLT5kYXRhLCA2KTsKKwllbHNlCisJCXJldCA9IC1FSU87CisJaWYgKHJlcykKKwkJaXNscGNpX21ndF9yZWxlYXNlKHJlcyk7CisKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZ3RfdXBkYXRlX2FkZHI6IGZhaWx1cmVcbiIsIHByaXYtPm5kZXYtPm5hbWUpOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgVkVDX1NJWkUoYSkgKHNpemVvZihhKS9zaXplb2YoYVswXSkpCisKK2ludAorbWd0X2NvbW1pdChpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgcnZhbHVlOworCXUzMiB1OworCisJaWYgKGlzbHBjaV9nZXRfc3RhdGUocHJpdikgPCBQUlZfU1RBVEVfSU5JVCkKKwkJcmV0dXJuIDA7CisKKwlydmFsdWUgPSBtZ3RfY29tbWl0X2xpc3QocHJpdiwgY29tbWl0X3BhcnQxLCBWRUNfU0laRShjb21taXRfcGFydDEpKTsKKworCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfTU9OSVRPUikKKwkJcnZhbHVlIHw9IG1ndF9jb21taXRfbGlzdChwcml2LCBjb21taXRfcGFydDIsIFZFQ19TSVpFKGNvbW1pdF9wYXJ0MikpOworCisJdSA9IE9JRF9JTkxfTU9ERTsKKwlydmFsdWUgfD0gbWd0X2NvbW1pdF9saXN0KHByaXYsICZ1LCAxKTsKKwlydmFsdWUgfD0gbWd0X3VwZGF0ZV9hZGRyKHByaXYpOworCisJaWYgKHJ2YWx1ZSkgeworCQkvKiBzb21lIHJlcXVlc3QgaGF2ZSBmYWlsZWQuIFRoZSBkZXZpY2UgbWlnaHQgYmUgaW4gYW4KKwkJICAgaW5jb2hlcmVudCBzdGF0ZS4gV2Ugc2hvdWxkIHJlc2V0IGl0ICEgKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBtZ3RfY29tbWl0OiBmYWlsdXJlXG4iLCBwcml2LT5uZGV2LT5uYW1lKTsKKwl9CisJcmV0dXJuIHJ2YWx1ZTsKK30KKworLyogVGhlIGZvbGxvd2luZyBPSURzIG5lZWQgdG8gYmUgInVubGF0Y2hlZCI6CisgKgorICogTUVESVVNTElNSVQsQkVBQ09OUEVSSU9ELERUSU1QRVJJT0QsQVRJTVdJTkRPVyxMSVNURU5JTlRFUlZBTAorICogRlJFUVVFTkNZLEVYVEVOREVEUkFURVMuCisgKgorICogVGhlIHdheSB0byBkbyB0aGlzIGlzIHRvIHNldCBFU1NJRC4gTm90ZSB0aG91Z2ggdGhhdCB0aGV5IG1heSBnZXQgCisgKiB1bmxhdGNoIGJlZm9yZSB0aG91Z2ggYnkgc2V0dGluZyBhbm90aGVyIE9JRC4gKi8KKyNpZiAwCit2b2lkCittZ3RfdW5sYXRjaF9hbGwoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJdTMyIHU7CisJaW50IHJ2YWx1ZSA9IDA7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA8IFBSVl9TVEFURV9JTklUKQorCQlyZXR1cm47CisKKwl1ID0gRE9UMTFfT0lEX1NTSUQ7CisJcnZhbHVlID0gbWd0X2NvbW1pdF9saXN0KHByaXYsICZ1LCAxKTsKKwkvKiBOZWNlc3NhcnkgaWYgaW4gTUFOVUFMIFJVTiBtb2RlPyAqLworI2lmIDAKKwl1ID0gT0lEX0lOTF9NT0RFOworCXJ2YWx1ZSB8PSBtZ3RfY29tbWl0X2xpc3QocHJpdiwgJnUsIDEpOworCisJdSA9IERPVDExX09JRF9NTE1FQVVUT0xFVkVMOworCXJ2YWx1ZSB8PSBtZ3RfY29tbWl0X2xpc3QocHJpdiwgJnUsIDEpOworCisJdSA9IE9JRF9JTkxfTU9ERTsKKwlydmFsdWUgfD0gbWd0X2NvbW1pdF9saXN0KHByaXYsICZ1LCAxKTsKKyNlbmRpZgorCisJaWYgKHJ2YWx1ZSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBVbmxhdGNoaW5nIE9JRHMgZmFpbGVkXG4iLCBwcml2LT5uZGV2LT5uYW1lKTsKK30KKyNlbmRpZgorCisvKiBUaGlzIHdpbGwgdGVsbCB5b3UgaWYgeW91IGFyZSBhbGxvd2VkIHRvIGFuc3dlciBhIG1sbWUoZXgpIHJlcXVlc3QgLiovCisKK2ludAorbWd0X21sbWVfYW5zd2VyKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCXUzMiBtbG1lYXV0b2xldmVsOworCS8qIEFjcXVpcmUgYSByZWFkIGxvY2sgYmVjYXVzZSBpZiB3ZSBhcmUgaW4gYSBtb2RlIGNoYW5nZSwgaXQncworCSAqIHBvc3NpYmxlIHRvIGFuc3dlciB0cnVlLCB3aGlsZSB0aGUgY2FyZCBpcyBsZWF2aW5nIG1hc3RlciB0byBtYW5hZ2VkCisJICogbW9kZS4gQW5zd2VyaW5nIHRvIGEgbWxtZSBpbiB0aGlzIHNpdHVhdGlvbiBjb3VsZCBoYW5nIHRoZSBjYXJkLgorCSAqLworCWRvd25fcmVhZCgmcHJpdi0+bWliX3NlbSk7CisJbWxtZWF1dG9sZXZlbCA9CisJICAgIGxlMzJfdG9fY3B1KCoodTMyICopIHByaXYtPm1pYltET1QxMV9PSURfTUxNRUFVVE9MRVZFTF0pOworCXVwX3JlYWQoJnByaXYtPm1pYl9zZW0pOworCisJcmV0dXJuICgocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgJiYKKwkJKG1sbWVhdXRvbGV2ZWwgPj0gRE9UMTFfTUxNRV9JTlRFUk1FRElBVEUpKTsKK30KKworZW51bSBvaWRfbnVtX3QKK21ndF9vaWR0b251bSh1MzIgb2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE9JRF9OVU1fTEFTVDsgaSsrKQorCQlpZiAoaXNsX29pZFtpXS5vaWQgPT0gb2lkKQorCQkJcmV0dXJuIGk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAibG9va2luZyBmb3IgYW4gdW5rbm93biBvaWQgMHgleCIsIG9pZCk7CisKKwlyZXR1cm4gT0lEX05VTV9MQVNUOworfQorCitpbnQKK21ndF9yZXNwb25zZV90b19zdHIoZW51bSBvaWRfbnVtX3QgbiwgdW5pb24gb2lkX3Jlc190ICpyLCBjaGFyICpzdHIpCit7CisJc3dpdGNoIChpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSkgeworCWNhc2UgT0lEX1RZUEVfVTMyOgorCQlyZXR1cm4gc25wcmludGYoc3RyLCBQUklWX1NUUl9TSVpFLCAiJXVcbiIsIHItPnUpOworCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX0JVRkZFUjp7CisJCQlzdHJ1Y3Qgb2JqX2J1ZmZlciAqYnVmZiA9IHItPnB0cjsKKwkJCXJldHVybiBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsCisJCQkJCSJzaXplPSV1XG5hZGRyPTB4JVhcbiIsIGJ1ZmYtPnNpemUsCisJCQkJCWJ1ZmYtPmFkZHIpOworCQl9CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfQlNTOnsKKwkJCXN0cnVjdCBvYmpfYnNzICpic3MgPSByLT5wdHI7CisJCQlyZXR1cm4gc25wcmludGYoc3RyLCBQUklWX1NUUl9TSVpFLAorCQkJCQkiYWdlPSV1XG5jaGFubmVsPSV1XG4iCisJCQkJCSJjYXBpbmZvPTB4JVhcbnJhdGVzPTB4JVhcbiIKKwkJCQkJImJhc2ljX3JhdGVzPTB4JVhcbiIsIGJzcy0+YWdlLAorCQkJCQlic3MtPmNoYW5uZWwsIGJzcy0+Y2FwaW5mbywKKwkJCQkJYnNzLT5yYXRlcywgYnNzLT5iYXNpY19yYXRlcyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPSURfVFlQRV9CU1NMSVNUOnsKKwkJCXN0cnVjdCBvYmpfYnNzbGlzdCAqbGlzdCA9IHItPnB0cjsKKwkJCWludCBpLCBrOworCQkJayA9IHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwgIm5yPSV1XG4iLCBsaXN0LT5ucik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGlzdC0+bnI7IGkrKykKKwkJCQlrICs9IHNucHJpbnRmKHN0ciArIGssIFBSSVZfU1RSX1NJWkUgLSBrLAorCQkJCQkgICAgICAiYnNzWyV1XSA6IFxuYWdlPSV1XG5jaGFubmVsPSV1XG4iCisJCQkJCSAgICAgICJjYXBpbmZvPTB4JVhcbnJhdGVzPTB4JVhcbiIKKwkJCQkJICAgICAgImJhc2ljX3JhdGVzPTB4JVhcbiIsCisJCQkJCSAgICAgIGksIGxpc3QtPmJzc2xpc3RbaV0uYWdlLAorCQkJCQkgICAgICBsaXN0LT5ic3NsaXN0W2ldLmNoYW5uZWwsCisJCQkJCSAgICAgIGxpc3QtPmJzc2xpc3RbaV0uY2FwaW5mbywKKwkJCQkJICAgICAgbGlzdC0+YnNzbGlzdFtpXS5yYXRlcywKKwkJCQkJICAgICAgbGlzdC0+YnNzbGlzdFtpXS5iYXNpY19yYXRlcyk7CisJCQlyZXR1cm4gazsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX0ZSRVFVRU5DSUVTOnsKKwkJCXN0cnVjdCBvYmpfZnJlcXVlbmNpZXMgKmZyZXEgPSByLT5wdHI7CisJCQlpbnQgaSwgdDsKKwkJCXByaW50aygibnIgOiAldVxuIiwgZnJlcS0+bnIpOworCQkJdCA9IHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwgIm5yPSV1XG4iLCBmcmVxLT5ucik7CisJCQlmb3IgKGkgPSAwOyBpIDwgZnJlcS0+bnI7IGkrKykKKwkJCQl0ICs9IHNucHJpbnRmKHN0ciArIHQsIFBSSVZfU1RSX1NJWkUgLSB0LAorCQkJCQkgICAgICAibWh6WyV1XT0ldVxuIiwgaSwgZnJlcS0+bWh6W2ldKTsKKwkJCXJldHVybiB0OworCQl9CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfTUxNRTp7CisJCQlzdHJ1Y3Qgb2JqX21sbWUgKm1sbWUgPSByLT5wdHI7CisJCQlyZXR1cm4gc25wcmludGYoc3RyLCBQUklWX1NUUl9TSVpFLAorCQkJCQkiaWQ9MHglWFxuc3RhdGU9MHglWFxuY29kZT0weCVYXG4iLAorCQkJCQltbG1lLT5pZCwgbWxtZS0+c3RhdGUsIG1sbWUtPmNvZGUpOworCQl9CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfTUxNRUVYOnsKKwkJCXN0cnVjdCBvYmpfbWxtZWV4ICptbG1lID0gci0+cHRyOworCQkJcmV0dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwKKwkJCQkJImlkPTB4JVhcbnN0YXRlPTB4JVhcbiIKKwkJCQkJImNvZGU9MHglWFxuc2l6ZT0weCVYXG4iLCBtbG1lLT5pZCwKKwkJCQkJbWxtZS0+c3RhdGUsIG1sbWUtPmNvZGUsIG1sbWUtPnNpemUpOworCQl9CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfQVRUQUNIOnsKKwkJCXN0cnVjdCBvYmpfYXR0YWNobWVudCAqYXR0YWNoID0gci0+cHRyOworCQkJcmV0dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwKKwkJCQkJImlkPSVkXG5zaXplPSVkXG4iLAorCQkJCQlhdHRhY2gtPmlkLAorCQkJCQlhdHRhY2gtPnNpemUpOworCQl9CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfU1NJRDp7CisJCQlzdHJ1Y3Qgb2JqX3NzaWQgKnNzaWQgPSByLT5wdHI7CisJCQlyZXR1cm4gc25wcmludGYoc3RyLCBQUklWX1NUUl9TSVpFLAorCQkJCQkibGVuZ3RoPSV1XG5vY3RldHM9JS4qc1xuIiwKKwkJCQkJc3NpZC0+bGVuZ3RoLCBzc2lkLT5sZW5ndGgsCisJCQkJCXNzaWQtPm9jdGV0cyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPSURfVFlQRV9LRVk6eworCQkJc3RydWN0IG9ial9rZXkgKmtleSA9IHItPnB0cjsKKwkJCWludCB0LCBpOworCQkJdCA9IHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwKKwkJCQkgICAgICJ0eXBlPTB4JVhcbmxlbmd0aD0weCVYXG5rZXk9MHgiLAorCQkJCSAgICAga2V5LT50eXBlLCBrZXktPmxlbmd0aCk7CisJCQlmb3IgKGkgPSAwOyBpIDwga2V5LT5sZW5ndGg7IGkrKykKKwkJCQl0ICs9IHNucHJpbnRmKHN0ciArIHQsIFBSSVZfU1RSX1NJWkUgLSB0LAorCQkJCQkgICAgICAiJTAyWDoiLCBrZXktPmtleVtpXSk7CisJCQl0ICs9IHNucHJpbnRmKHN0ciArIHQsIFBSSVZfU1RSX1NJWkUgLSB0LCAiXG4iKTsKKwkJCXJldHVybiB0OworCQl9CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfUkFXOgorCWNhc2UgT0lEX1RZUEVfQUREUjp7CisJCQl1bnNpZ25lZCBjaGFyICpidWZmID0gci0+cHRyOworCQkJaW50IHQsIGk7CisJCQl0ID0gc25wcmludGYoc3RyLCBQUklWX1NUUl9TSVpFLCAiaGV4IGRhdGE9Iik7CisJCQlmb3IgKGkgPSAwOyBpIDwgaXNsX29pZFtuXS5zaXplOyBpKyspCisJCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwKKwkJCQkJICAgICAgIiUwMlg6IiwgYnVmZltpXSk7CisJCQl0ICs9IHNucHJpbnRmKHN0ciArIHQsIFBSSVZfU1RSX1NJWkUgLSB0LCAiXG4iKTsKKwkJCXJldHVybiB0OworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjOGEyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEF1cmVsaWVuIEFsbGVhdW1lIDxzbHRzQGZyZWUuZnI+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpZiAhZGVmaW5lZChfT0lEX01HVF9IKQorI2RlZmluZSBfT0lEX01HVF9ICisKKyNpbmNsdWRlICJpc2xfb2lkLmgiCisjaW5jbHVkZSAiaXNscGNpX2Rldi5oIgorCitleHRlcm4gc3RydWN0IG9pZF90IGlzbF9vaWRbXTsKKworaW50IG1ndF9pbml0KGlzbHBjaV9wcml2YXRlICopOworCit2b2lkIG1ndF9jbGVhbihpc2xwY2lfcHJpdmF0ZSAqKTsKKworLyogSSBkb24ndCBrbm93IHdoZXJlIHRvIHB1dCB0aGVzZSAyICovCitleHRlcm4gY29uc3QgaW50IGZyZXF1ZW5jeV9saXN0X2FbXTsKK2ludCBjaGFubmVsX29mX2ZyZXEoaW50KTsKKwordm9pZCBtZ3RfbGVfdG9fY3B1KGludCwgdm9pZCAqKTsKKworaW50IG1ndF9zZXRfcmVxdWVzdChpc2xwY2lfcHJpdmF0ZSAqLCBlbnVtIG9pZF9udW1fdCwgaW50LCB2b2lkICopOworaW50IG1ndF9zZXRfdmFybGVuKGlzbHBjaV9wcml2YXRlICosIGVudW0gb2lkX251bV90LCB2b2lkICosIGludCk7CisKKworaW50IG1ndF9nZXRfcmVxdWVzdChpc2xwY2lfcHJpdmF0ZSAqLCBlbnVtIG9pZF9udW1fdCwgaW50LCB2b2lkICosCisJCSAgICB1bmlvbiBvaWRfcmVzX3QgKik7CisKK2ludCBtZ3RfY29tbWl0X2xpc3QoaXNscGNpX3ByaXZhdGUgKiwgZW51bSBvaWRfbnVtX3QgKiwgaW50KTsKKwordm9pZCBtZ3Rfc2V0KGlzbHBjaV9wcml2YXRlICosIGVudW0gb2lkX251bV90LCB2b2lkICopOworCit2b2lkIG1ndF9nZXQoaXNscGNpX3ByaXZhdGUgKiwgZW51bSBvaWRfbnVtX3QsIHZvaWQgKik7CisKK2ludCBtZ3RfY29tbWl0KGlzbHBjaV9wcml2YXRlICopOworCitpbnQgbWd0X21sbWVfYW5zd2VyKGlzbHBjaV9wcml2YXRlICopOworCitlbnVtIG9pZF9udW1fdCBtZ3Rfb2lkdG9udW0odTMyIG9pZCk7CisKK2ludCBtZ3RfcmVzcG9uc2VfdG9fc3RyKGVudW0gb2lkX251bV90LCB1bmlvbiBvaWRfcmVzX3QgKiwgY2hhciAqKTsKKworI2VuZGlmCQkJCS8qICFkZWZpbmVkKF9PSURfTUdUX0gpICovCisvKiBFT0YgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvcHJpc21jb21wYXQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvcHJpc21jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTU0MWMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9wcmlzbWNvbXBhdC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qICAKKyAqICAoQykgMjAwNCBNYXJnaXQgU2NodWJlcnQtV2hpbGUgPG1hcmdpdHN3QHQtb25saW5lLmRlPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisvKiAgCisgKglDb21wYXRpYmlsaXR5IGhlYWRlciBmaWxlIHRvIGFpZCBzdXBwb3J0IG9mIGRpZmZlcmVudCBrZXJuZWwgdmVyc2lvbnMKKyAqLworCisjaWZkZWYgUFJJU001NF9DT01QQVQyNAorI2luY2x1ZGUgInByaXNtY29tcGF0MjQuaCIKKyNlbHNlCS8qIFBSSVNNNTRfQ09NUEFUMjQgKi8KKworI2lmbmRlZiBfUFJJU01fQ09NUEFUX0gKKyNkZWZpbmUgX1BSSVNNX0NPTVBBVF9ICisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKworI2lmbmRlZiBfX2lvbWVtCisjZGVmaW5lIF9faW9tZW0KKyNlbmRpZgorCisjZGVmaW5lIFBSSVNNX0ZXX1BERVYJCSZwcml2LT5wZGV2LT5kZXYKKworI2VuZGlmCQkJCS8qIF9QUklTTV9DT01QQVRfSCAqLworI2VuZGlmCQkJCS8qIFBSSVNNNTRfQ09NUEFUMjQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1YmRhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCkBAIC0wLDAgKzEsMjk1NyBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIEEgIFBDTUNJQSBjbGllbnQgZHJpdmVyIGZvciB0aGUgUmF5bGluayB3aXJlbGVzcyBMQU4gY2FyZC4KKyAqIFRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhpcyBtb2R1bGUgd2FzIHRoZSBza2VsZXRvbi5jIGluIHRoZQorICogUENNQ0lBIDIuOS4xMiBwYWNrYWdlIHdyaXR0ZW4gYnkgRGF2aWQgSGluZHMsIGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0CisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OCAgQ29yZXkgVGhvbWFzIChjb3JleUB3b3JsZC5zdGQuY29tKQorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb25seSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBJdCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogQ2hhbmdlczoKKyAqIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiAtIDA4LzA4LzIwMDAKKyAqIC0gcmVvcmdhbml6ZSBrbWFsbG9jcyBpbiByYXlfYXR0YWNoLCBjaGVja2luZyBhbGwgZm9yIGZhaWx1cmUKKyAqICAgYW5kIHJlbGVhc2luZyB0aGUgcHJldmlvdXMgYWxsb2NhdGlvbnMgaWYgb25lIGZhaWxzCisgKgorICogRGFuaWVsZSBCZWxsdWNjaSA8YmVsbHVjZGFAdGlzY2FsaS5pdD4gLSAwNy8xMC8yMDAzCisgKiAtIEF1ZGl0IGNvcHlfdG9fdXNlciBpbiBpb2N0bChTSU9DR0lXRVNTSUQpCisgKiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisjaW5jbHVkZSA8cGNtY2lhL21lbV9vcC5oPgorCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogV2FybmluZyA6IHRoZXNlIHN0dWZmIHdpbGwgc2xvdyBkb3duIHRoZSBkcml2ZXIuLi4gKi8KKyNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvKiBFbmFibGUgc3B5aW5nIGFkZHJlc3NlcyAqLworLyogRGVmaW5pdGlvbnMgd2UgbmVlZCBmb3Igc3B5ICovCit0eXBlZGVmIHN0cnVjdCBpd19zdGF0aXN0aWNzCWl3X3N0YXRzOwordHlwZWRlZiBzdHJ1Y3QgaXdfcXVhbGl0eQlpd19xdWFsOwordHlwZWRlZiB1X2NoYXIJbWFjX2FkZHJbRVRIX0FMRU5dOwkvKiBIYXJkd2FyZSBhZGRyZXNzICovCisKKyNpbmNsdWRlICJyYXljdGwuaCIKKyNpbmNsdWRlICJyYXlfY3MuaCIKKworLyogQWxsIHRoZSBQQ01DSUEgbW9kdWxlcyB1c2UgUENNQ0lBX0RFQlVHIHRvIGNvbnRyb2wgZGVidWdnaW5nLiAgSWYKKyAgIHlvdSBkbyBub3QgZGVmaW5lIFBDTUNJQV9ERUJVRyBhdCBhbGwsIGFsbCB0aGUgZGVidWcgY29kZSB3aWxsIGJlCisgICBsZWZ0IG91dC4gIElmIHlvdSBjb21waWxlIHdpdGggUENNQ0lBX0RFQlVHPTAsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwKKyAgIGJlIHByZXNlbnQgYnV0IGRpc2FibGVkIC0tIGJ1dCBpdCBjYW4gdGhlbiBiZSBlbmFibGVkIGZvciBzcGVjaWZpYworICAgbW9kdWxlcyBhdCBsb2FkIHRpbWUgd2l0aCBhICdwY19kZWJ1Zz0jJyBvcHRpb24gdG8gaW5zbW9kLgorKi8KKworI2lmZGVmIFJBWUxJTktfREVCVUcKKyNkZWZpbmUgUENNQ0lBX0RFQlVHIFJBWUxJTktfREVCVUcKKyNlbmRpZgorI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIGludCByYXlfZGVidWc7CitzdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOworbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOworLyogI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKTsgKi8KKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKGFyZ3MpOworI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorLyoqIFByb3RvdHlwZXMgYmFzZWQgb24gUENNQ0lBIHNrZWxldG9uIGRyaXZlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcmF5X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkIHJheV9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCByYXlfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LCBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworc3RhdGljIGRldl9saW5rX3QgKnJheV9hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCByYXlfZGV0YWNoKGRldl9saW5rX3QgKik7CisKKy8qKioqKiBQcm90b3R5cGVzIGluZGljYXRlZCBieSBkZXZpY2Ugc3RydWN0dXJlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcmF5X2Rldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcmF5X2Rldl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpyYXlfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCByYXlfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJheV9kZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKKworc3RhdGljIGludCByYXlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcmF5X2Rldl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcmF5X3VwZGF0ZV9tdWx0aV9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhbGwpOworc3RhdGljIGludCB0cmFuc2xhdGVfZnJhbWUocmF5X2Rldl90ICpsb2NhbCwgc3RydWN0IHR4X21zZyBfX2lvbWVtICpwdHgsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbik7CitzdGF0aWMgdm9pZCByYXlfYnVpbGRfaGVhZGVyKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCB0eF9tc2cgX19pb21lbSAqcHR4LCBVQ0hBUiBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhKTsKK3N0YXRpYyB2b2lkIHVudHJhbnNsYXRlKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCBza19idWZmICpza2IsIGludCBsZW4pOworI2lmIFdJUkVMRVNTX0VYVCA+IDcJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0IGluIHRoZSBrZXJuZWwgKi8KK3N0YXRpYyBpd19zdGF0cyAqIHJheV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpOworI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDcgKi8KKworLyoqKioqIFByb3RvdHlwZXMgZm9yIHJheWxpbmsgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBhc2NfdG9faW50KGNoYXIgYSk7CitzdGF0aWMgdm9pZCBhdXRoZW50aWNhdGUocmF5X2Rldl90ICpsb2NhbCk7CitzdGF0aWMgaW50IGJ1aWxkX2F1dGhfZnJhbWUocmF5X2Rldl90ICpsb2NhbCwgVUNIQVIgKmRlc3QsIGludCBhdXRoX3R5cGUpOworc3RhdGljIHZvaWQgYXV0aGVudGljYXRlX3RpbWVvdXQodV9sb25nKTsKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfY2NzKHJheV9kZXZfdCAqbG9jYWwpOworc3RhdGljIGludCBnZXRfZnJlZV90eF9jY3MocmF5X2Rldl90ICpsb2NhbCk7CitzdGF0aWMgdm9pZCBpbml0X3N0YXJ0dXBfcGFyYW1zKHJheV9kZXZfdCAqbG9jYWwpOworc3RhdGljIGludCBwYXJzZV9hZGRyKGNoYXIgKmluX3N0ciwgVUNIQVIgKm91dCk7CitzdGF0aWMgaW50IHJheV9od194bWl0KHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCBsZW4sIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIFVDSEFSIHR5cGUpOworc3RhdGljIGludCByYXlfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaW50ZXJydXB0X2VjZihyYXlfZGV2X3QgKmxvY2FsLCBpbnQgY2NzKTsKK3N0YXRpYyB2b2lkIHJheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJheV91cGRhdGVfcGFybShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBVQ0hBUiBvYmppZCwgVUNIQVIgKnZhbHVlLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIHZlcmlmeV9kbF9zdGFydHVwKHVfbG9uZyk7CisKKy8qIFByb3RvdHlwZXMgZm9yIGludGVycnB0IHRpbWUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaXJxcmV0dXJuX3QgcmF5X2ludGVycnVwdCAoaW50IHJlZywgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBjbGVhcl9pbnRlcnJ1cHQocmF5X2Rldl90ICpsb2NhbCk7CitzdGF0aWMgdm9pZCByeF9kZWF1dGhlbnRpY2F0ZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3MsIAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGt0X2FkZHIsIGludCByeF9sZW4pOworc3RhdGljIGludCBjb3B5X2Zyb21fcnhfYnVmZihyYXlfZGV2X3QgKmxvY2FsLCBVQ0hBUiAqZGVzdCwgaW50IHBrdF9hZGRyLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIHJheV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCByYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3MpOworc3RhdGljIHZvaWQgcmVsZWFzZV9mcmFnX2NoYWluKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcyk7CitzdGF0aWMgdm9pZCByeF9hdXRoZW50aWNhdGUocmF5X2Rldl90ICpsb2NhbCwgc3RydWN0IHJjcyBfX2lvbWVtICpwcmNzLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBrdF9hZGRyLCBpbnQgcnhfbGVuKTsKK3N0YXRpYyB2b2lkIHJ4X2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHJjcyBfX2lvbWVtICpwcmNzLCB1bnNpZ25lZCBpbnQgcGt0X2FkZHIsIAorICAgICAgICAgICAgIGludCByeF9sZW4pOworc3RhdGljIHZvaWQgYXNzb2NpYXRlKHJheV9kZXZfdCAqbG9jYWwpOworCisvKiBDYXJkIGNvbW1hbmQgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGRsX3N0YXJ0dXBfcGFyYW1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgam9pbl9uZXQodV9sb25nIGxvY2FsKTsKK3N0YXRpYyB2b2lkIHN0YXJ0X25ldCh1X2xvbmcgbG9jYWwpOworLyogdm9pZCBzdGFydF9uZXQocmF5X2Rldl90ICpsb2NhbCk7ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IHdpdGggJ2luc21vZCcgKi8KKworLyogQURIT0M9MCwgSW5mcmFzdHJ1Y3R1cmU9MSAqLworc3RhdGljIGludCBuZXRfdHlwZSA9IEFESE9DOworCisvKiBIb3AgZHdlbGwgdGltZSBpbiBLdXMgKDEwMjQgdXMgdW5pdHMgZGVmaW5lZCBieSA4MDIuMTEpICovCitzdGF0aWMgaW50IGhvcF9kd2VsbCA9IDEyODsKKworLyogQmVhY29uIHBlcmlvZCBpbiBLdXMgKi8KK3N0YXRpYyBpbnQgYmVhY29uX3BlcmlvZCA9IDI1NjsKKworLyogcG93ZXIgc2F2ZSBtb2RlICgwID0gb2ZmLCAxID0gc2F2ZSBwb3dlcikgKi8KK3N0YXRpYyBpbnQgcHNtOworCisvKiBTdHJpbmcgZm9yIG5ldHdvcmsncyBFeHRlbmRlZCBTZXJ2aWNlIFNldCBJRC4gMzIgQ2hhcmFjdGVycyBtYXggKi8KK3N0YXRpYyBjaGFyICplc3NpZDsKKworLyogRGVmYXVsdCB0byBlbmNhcHN1bGF0aW9uIHVubGVzcyB0cmFuc2xhdGlvbiByZXF1ZXN0ZWQgKi8KK3N0YXRpYyBpbnQgdHJhbnNsYXRlID0gMTsKKworc3RhdGljIGludCBjb3VudHJ5ID0gVVNBOworCitzdGF0aWMgaW50IHNuaWZmZXI7CisKK3N0YXRpYyBpbnQgYmM7CisKKy8qIDQ4IGJpdCBwaHlzaWNhbCBjYXJkIGFkZHJlc3MgaWYgb3ZlcnJpZGluZyBjYXJkJ3MgcmVhbCBwaHlzaWNhbAorICogYWRkcmVzcyBpcyByZXF1aXJlZC4gIFNpbmNlIElFRUUgODAyLjExIGFkZHJlc3NlcyBhcmUgNDggYml0cworICogbGlrZSBldGhlcm5ldCwgYW4gaW50IGNhbid0IGJlIHVzZWQsIHNvIGEgc3RyaW5nIGlzIHVzZWQuIFRvCisgKiBhbGxvdyB1c2Ugb2YgYWRkcmVzc2VzIHN0YXJ0aW5nIHdpdGggYSBkZWNpbWFsIGRpZ2l0LCB0aGUgZmlyc3QKKyAqIGNoYXJhY3RlciBtdXN0IGJlIGEgbGV0dGVyIGFuZCB3aWxsIGJlIGlnbm9yZWQuIFRoaXMgbGV0dGVyIGlzCisgKiBmb2xsb3dlZCBieSB1cCB0byAxMiBoZXggZGlnaXRzIHdoaWNoIGFyZSB0aGUgYWRkcmVzcy4gIElmIGxlc3MKKyAqIHRoYW4gMTIgZGlnaXRzIGFyZSB1c2VkLCB0aGUgYWRkcmVzcyB3aWxsIGJlIGxlZnQgZmlsbGVkIHdpdGggMCdzLgorICogTm90ZSB0aGF0IGJpdCAwIG9mIHRoZSBmaXJzdCBieXRlIGlzIHRoZSBicm9hZGNhc3QgYml0LCBhbmQgZXZpbAorICogdGhpbmdzIHdpbGwgaGFwcGVuIGlmIGl0IGlzIG5vdCAwIGluIGEgY2FyZCBhZGRyZXNzLgorICovCitzdGF0aWMgY2hhciAqcGh5X2FkZHIgPSBOVUxMOworCisKKy8qIFRoZSBkZXZfaW5mbyB2YXJpYWJsZSBpcyB0aGUgImtleSIgdGhhdCBpcyB1c2VkIHRvIG1hdGNoIHVwIHRoaXMKKyAgIGRldmljZSBkcml2ZXIgd2l0aCBhcHByb3ByaWF0ZSBjYXJkcywgdGhyb3VnaCB0aGUgY2FyZCBjb25maWd1cmF0aW9uCisgICBkYXRhYmFzZS4KKyovCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJyYXlfY3MiOworCisvKiBBIGxpbmtlZCBsaXN0IG9mICJpbnN0YW5jZXMiIG9mIHRoZSByYXkgZGV2aWNlLiAgRWFjaCBhY3R1YWwKKyAgIFBDTUNJQSBjYXJkIGNvcnJlc3BvbmRzIHRvIG9uZSBkZXZpY2UgaW5zdGFuY2UsIGFuZCBpcyBkZXNjcmliZWQKKyAgIGJ5IG9uZSBkZXZfbGlua190IHN0cnVjdHVyZSAoZGVmaW5lZCBpbiBkcy5oKS4KKyovCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3QgPSBOVUxMOworCisvKiBBIGRldl9saW5rX3Qgc3RydWN0dXJlIGhhcyBmaWVsZHMgZm9yIG1vc3QgdGhpbmdzIHRoYXQgYXJlIG5lZWRlZAorICAgdG8ga2VlcCB0cmFjayBvZiBhIHNvY2tldCwgYnV0IHRoZXJlIHdpbGwgdXN1YWxseSBiZSBzb21lIGRldmljZQorICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBhbHNvIG5lZWRzIHRvIGJlIGtlcHQgdHJhY2sgb2YuICBUaGUKKyAgICdwcml2JyBwb2ludGVyIGluIGEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8KKyAgIGEgZGV2aWNlLXNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsIGxpa2UgdGhpcy4KKyovCitzdGF0aWMgdW5zaWduZWQgaW50IHJheV9tZW1fc3BlZWQgPSA1MDA7CisKK01PRFVMRV9BVVRIT1IoIkNvcmV5IFRob21hcyA8Y29yZXlAd29ybGQuc3RkLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmF5bGluay9XZWJHZWFyIHdpcmVsZXNzIExBTiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKG5ldF90eXBlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGhvcF9kd2VsbCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShiZWFjb25fcGVyaW9kLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHBzbSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShlc3NpZCwgY2hhcnAsIDApOworbW9kdWxlX3BhcmFtKHRyYW5zbGF0ZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjb3VudHJ5LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNuaWZmZXIsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oYmMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocGh5X2FkZHIsIGNoYXJwLCAwKTsKK21vZHVsZV9wYXJhbShyYXlfbWVtX3NwZWVkLCBpbnQsIDApOworCitzdGF0aWMgVUNIQVIgYjVfZGVmYXVsdF9zdGFydHVwX3Bhcm1zW10gPSB7CisgICAgMCwgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZGhvYyBzdGF0aW9uICovCisgICAnTCcsJ0knLCdOJywnVScsJ1gnLCAwLCAgMCwgIDAsICAvKiAzMiBjaGFyIEVTU0lEICovCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgMSwgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY3RpdmUgc2NhbiwgQ0EgTW9kZSAqLworICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgICAgICAgICAgLyogTm8gZGVmYXVsdCBNQUMgYWRkciAgKi8KKyAgICAweDdmLCAweGZmLCAgICAgICAgICAgICAgICAgICAgIC8qIEZyYWcgdGhyZXNob2xkICovCisgICAgMHgwMCwgMHg4MCwgICAgICAgICAgICAgICAgICAgICAvKiBIb3AgdGltZSAxMjggS3VzKi8KKyAgICAweDAxLCAweDAwLCAgICAgICAgICAgICAgICAgICAgIC8qIEJlYWNvbiBwZXJpb2QgMjU2IEt1cyAqLworICAgIDB4MDEsIDB4MDcsIDB4YTMsICAgICAgICAgICAgICAgLyogRFRJTSwgcmV0cmllcywgYWNrIHRpbWVvdXQqLworICAgIDB4MWQsIDB4ODIsIDB4NGUsICAgICAgICAgICAgICAgLyogU0lGUywgRElGUywgUElGUyAqLworICAgIDB4N2YsIDB4ZmYsICAgICAgICAgICAgICAgICAgICAgLyogUlRTIHRocmVzaG9sZCAqLworICAgIDB4MDQsIDB4ZTIsIDB4MzgsIDB4QTQsICAgICAgICAgLyogc2Nhbl9kd2VsbCwgbWF4X3NjYW5fZHdlbGwgKi8KKyAgICAweDA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzc29jIHJlc3AgdGltZW91dCB0aHJlc2ggKi8KKyAgICAweDA4LCAweDAyLCAweDA4LCAgICAgICAgICAgICAgIC8qIGFkaG9jLCBpbmZyYSwgc3VwZXIgY3ljbGUgbWF4Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb21pc2N1b3VzIG1vZGUgKi8KKyAgICAweDBjLCAweDBiZCwgICAgICAgICAgICAgICAgICAgIC8qIFVuaXF1ZSB3b3JkICovCisgICAgMHgzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTbG90IHRpbWUgKi8KKyAgICAweGZmLCAweGZmLCAgICAgICAgICAgICAgICAgICAgIC8qIHJvYW0tbG93IHNuciwgbG93IHNuciBjb3VudCAqLworICAgIDB4MDUsIDB4ZmYsICAgICAgICAgICAgICAgICAgICAgLyogSW5mcmEsIGFkaG9jIG1pc3NlZCBiY24gdGhyZXNoICovCisgICAgMHgwMSwgMHgwYiwgMHg0ZiwgICAgICAgICAgICAgICAvKiBVU0EsIGhvcCBwYXR0ZXJuLCBob3AgcGF0IGxlbmd0aCAqLworLyogYjQgLSBiNSBkaWZmZXJlbmNlcyBzdGFydCBoZXJlICovCisgICAgMHgwMCwgMHgzZiwgICAgICAgICAgICAgICAgICAgICAvKiBDVyBtYXggKi8KKyAgICAweDAwLCAweDBmLCAgICAgICAgICAgICAgICAgICAgIC8qIENXIG1pbiAqLworICAgIDB4MDQsIDB4MDgsICAgICAgICAgICAgICAgICAgICAgLyogTm9pc2UgZ2FpbiwgbGltaXQgb2Zmc2V0ICovCisgICAgMHgyOCwgMHgyOCwgICAgICAgICAgICAgICAgICAgICAvKiBkZXQgcnNzaSwgbWVkIGJ1c3kgb2Zmc2V0cyAqLworICAgIDcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGV0IHN5bmMgdGhyZXNoICovCisgICAgMCwgMiwgMiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXN0IG1vZGUsIG1pbiwgbWF4ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGxvdyBicm9hZGNhc3QgU1NJRCBwcm9iZSByZXNwICovCisgICAgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcml2YWN5IG11c3Qgc3RhcnQsIGNhbiBqb2luICovCisgICAgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCAgICAgICAgICAvKiBiYXNpYyByYXRlIHNldCAqLworfTsKKworc3RhdGljIFVDSEFSIGI0X2RlZmF1bHRfc3RhcnR1cF9wYXJtc1tdID0geworICAgIDAsICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRob2Mgc3RhdGlvbiAqLworICAgJ0wnLCdJJywnTicsJ1UnLCdYJywgMCwgIDAsICAwLCAgLyogMzIgY2hhciBFU1NJRCAqLworICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDEsICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0aXZlIHNjYW4sIENBIE1vZGUgKi8KKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAgICAgICAgIC8qIE5vIGRlZmF1bHQgTUFDIGFkZHIgICovCisgICAgMHg3ZiwgMHhmZiwgICAgICAgICAgICAgICAgICAgICAvKiBGcmFnIHRocmVzaG9sZCAqLworICAgIDB4MDIsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgLyogSG9wIHRpbWUgKi8KKyAgICAweDAwLCAweDAxLCAgICAgICAgICAgICAgICAgICAgIC8qIEJlYWNvbiBwZXJpb2QgKi8KKyAgICAweDAxLCAweDA3LCAweGEzLCAgICAgICAgICAgICAgIC8qIERUSU0sIHJldHJpZXMsIGFjayB0aW1lb3V0Ki8KKyAgICAweDFkLCAweDgyLCAweGNlLCAgICAgICAgICAgICAgIC8qIFNJRlMsIERJRlMsIFBJRlMgKi8KKyAgICAweDdmLCAweGZmLCAgICAgICAgICAgICAgICAgICAgIC8qIFJUUyB0aHJlc2hvbGQgKi8KKyAgICAweGZiLCAweDFlLCAweGM3LCAweDVjLCAgICAgICAgIC8qIHNjYW5fZHdlbGwsIG1heF9zY2FuX2R3ZWxsICovCisgICAgMHgwNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3NvYyByZXNwIHRpbWVvdXQgdGhyZXNoICovCisgICAgMHgwNCwgMHgwMiwgMHg0LCAgICAgICAgICAgICAgICAvKiBhZGhvYywgaW5mcmEsIHN1cGVyIGN5Y2xlIG1heCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9taXNjdW91cyBtb2RlICovCisgICAgMHgwYywgMHgwYmQsICAgICAgICAgICAgICAgICAgICAvKiBVbmlxdWUgd29yZCAqLworICAgIDB4NGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2xvdCB0aW1lIChUQkQgc2VlbXMgd3JvbmcpKi8KKyAgICAweGZmLCAweGZmLCAgICAgICAgICAgICAgICAgICAgIC8qIHJvYW0tbG93IHNuciwgbG93IHNuciBjb3VudCAqLworICAgIDB4MDUsIDB4ZmYsICAgICAgICAgICAgICAgICAgICAgLyogSW5mcmEsIGFkaG9jIG1pc3NlZCBiY24gdGhyZXNoICovCisgICAgMHgwMSwgMHgwYiwgMHg0ZSwgICAgICAgICAgICAgICAvKiBVU0EsIGhvcCBwYXR0ZXJuLCBob3AgcGF0IGxlbmd0aCAqLworLyogYjQgLSBiNSBkaWZmZXJlbmNlcyBzdGFydCBoZXJlICovCisgICAgMHgzZiwgMHgwZiwgICAgICAgICAgICAgICAgICAgICAvKiBDVyBtYXgsIG1pbiAqLworICAgIDB4MDQsIDB4MDgsICAgICAgICAgICAgICAgICAgICAgLyogTm9pc2UgZ2FpbiwgbGltaXQgb2Zmc2V0ICovCisgICAgMHgyOCwgMHgyOCwgICAgICAgICAgICAgICAgICAgICAvKiBkZXQgcnNzaSwgbWVkIGJ1c3kgb2Zmc2V0cyAqLworICAgIDcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGV0IHN5bmMgdGhyZXNoICovCisgICAgMCwgMiwgMiAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXN0IG1vZGUsIG1pbiwgbWF4Ki8KK307CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdW5zaWduZWQgY2hhciBldGgyX2xsY1tdID0gezB4YWEsIDB4YWEsIDMsIDAsIDAsIDB9OworCitzdGF0aWMgY2hhciBob3BfcGF0dGVybl9sZW5ndGhbXSA9IHsgMSwKKwkgICAgIFVTQV9IT1BfTU9ELCAgICAgICAgICAgICBFVVJPUEVfSE9QX01PRCwKKwkgICAgIEpBUEFOX0hPUF9NT0QsICAgICAgICAgICBLT1JFQV9IT1BfTU9ELAorCSAgICAgU1BBSU5fSE9QX01PRCwgICAgICAgICAgIEZSQU5DRV9IT1BfTU9ELAorCSAgICAgSVNSQUVMX0hPUF9NT0QsICAgICAgICAgIEFVU1RSQUxJQV9IT1BfTU9ELAorCSAgICAgSkFQQU5fVEVTVF9IT1BfTU9ECit9OworCitzdGF0aWMgY2hhciByY3NpZFtdID0gIlJheWxpbmsvV2ViR2VhciB3aXJlbGVzcyBMQU4gLSBDb3JleSA8VGhvbWFzIGNvcmV5QHdvcmxkLnN0ZC5jb20+IjsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIHJheV9hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworICAgIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZAorICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAgICBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKKyAgICBjb25maWd1cmUgdGhlIGNhcmQgYXQgdGhpcyBwb2ludCAtLSB3ZSB3YWl0IHVudGlsIHdlIHJlY2VpdmUgYQorICAgIGNhcmQgaW5zZXJ0aW9uIGV2ZW50LgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGRldl9saW5rX3QgKnJheV9hdHRhY2godm9pZCkKK3sKKyAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHJheV9kZXZfdCAqbG9jYWw7CisgICAgaW50IHJldDsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIAorICAgIERFQlVHKDEsICJyYXlfYXR0YWNoKClcbiIpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKi8KKyAgICBsaW5rID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpLCBHRlBfS0VSTkVMKTsKKworICAgIGlmICghbGluaykKKwkgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgcHJpdmF0ZSBkZXZpY2Utc3BlY2lmaWMgZGF0YSAqLworICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihyYXlfZGV2X3QpKTsKKworICAgIGlmICghZGV2KQorCSAgICBnb3RvIGZhaWxfYWxsb2NfZGV2OworCisgICAgbG9jYWwgPSBkZXYtPnByaXY7CisKKyAgICBtZW1zZXQobGluaywgMCwgc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSk7CisKKyAgICAvKiBUaGUgaW8gc3RydWN0dXJlIGRlc2NyaWJlcyBJTyBwb3J0IG1hcHBpbmcuIE5vbmUgdXNlZCBoZXJlICovCisgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMDsKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OworICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gNTsKKworICAgIC8qIEludGVycnVwdCBzZXR1cC4gRm9yIFBDTUNJQSwgZHJpdmVyIHRha2VzIHdoYXQncyBnaXZlbiAqLworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworICAgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKyAgICBsaW5rLT5pcnEuSGFuZGxlciA9ICZyYXlfaW50ZXJydXB0OworCisgICAgLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiAqLworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IDUwOworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAxOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOworCisgICAgbGluay0+cHJpdiA9IGRldjsKKyAgICBsaW5rLT5pcnEuSW5zdGFuY2UgPSBkZXY7CisgICAgCisgICAgbG9jYWwtPmZpbmRlciA9IGxpbms7CisgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9JTlNFUlRFRDsKKyAgICBsb2NhbC0+YXV0aGVudGljYXRpb25fc3RhdGUgPSBVTkFVVEhFTlRJQ0FURUQ7CisgICAgbG9jYWwtPm51bV9tdWx0aSA9IDA7CisgICAgREVCVUcoMiwicmF5X2F0dGFjaCBsaW5rID0gJXAsICBkZXYgPSAlcCwgIGxvY2FsID0gJXAsIGludHIgPSAlcFxuIiwKKyAgICAgICAgICBsaW5rLGRldixsb2NhbCwmcmF5X2ludGVycnVwdCk7CisKKyAgICAvKiBSYXlsaW5rIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZyYXlfZGV2X3N0YXJ0X3htaXQ7CisgICAgZGV2LT5zZXRfY29uZmlnID0gJnJheV9kZXZfY29uZmlnOworICAgIGRldi0+Z2V0X3N0YXRzICA9ICZyYXlfZ2V0X3N0YXRzOworICAgIGRldi0+ZG9faW9jdGwgPSAmcmF5X2Rldl9pb2N0bDsKKyAgICBTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbmV0ZGV2X2V0aHRvb2xfb3BzKTsKKyNpZiBXSVJFTEVTU19FWFQgPiA3CS8qIElmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdCBpbiB0aGUga2VybmVsICovCisgICAgZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSByYXlfZ2V0X3dpcmVsZXNzX3N0YXRzOworI2VuZGlmCisKKyAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisKKyAgICBERUJVRygyLCJyYXlfY3MgcmF5X2F0dGFjaCBjYWxsaW5nIGV0aGVyX3NldHVwLilcbiIpOworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBkZXYtPmluaXQgPSAmcmF5X2Rldl9pbml0OworICAgIGRldi0+b3BlbiA9ICZyYXlfb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmcmF5X2Rldl9jbG9zZTsKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorICAgICAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisgICAgICAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisgICAgICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnJheV9ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKworICAgIERFQlVHKDIsInJheV9jcyByYXlfYXR0YWNoIGNhbGxpbmcgcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCguLi4pXG4iKTsKKworICAgIGluaXRfdGltZXIoJmxvY2FsLT50aW1lcik7CisKKyAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgcHJpbnRrKCJyYXlfY3MgcmF5X2F0dGFjaCBSZWdpc3RlckNsaWVudCB1bmhhcHB5IC0gZGV0YWNoaW5nXG4iKTsKKyAgICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKyAgICAgICAgcmF5X2RldGFjaChsaW5rKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIERFQlVHKDIsInJheV9jcyByYXlfYXR0YWNoIGVuZGluZ1xuIik7CisgICAgcmV0dXJuIGxpbms7CisKK2ZhaWxfYWxsb2NfZGV2OgorICAgIGtmcmVlKGxpbmspOworICAgIHJldHVybiBOVUxMOworfSAvKiByYXlfYXR0YWNoICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAgICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICAgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIHJheV9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBkZXZfbGlua190ICoqbGlua3A7CisKKyAgICBERUJVRygxLCAicmF5X2RldGFjaCgweCVwKVxuIiwgbGluayk7CisgICAgCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorICAgICAgICBpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworICAgIGlmICgqbGlua3AgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogSWYgdGhlIGRldmljZSBpcyBjdXJyZW50bHkgY29uZmlndXJlZCBhbmQgYWN0aXZlLCB3ZSB3b24ndAorICAgICAgYWN0dWFsbHkgZGVsZXRlIGl0IHlldC4gIEluc3RlYWQsIGl0IGlzIG1hcmtlZCBzbyB0aGF0IHdoZW4KKyAgICAgIHRoZSByZWxlYXNlKCkgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGF0IHdpbGwgdHJpZ2dlciBhIHByb3BlcgorICAgICAgZGV0YWNoKCkuCisgICAgKi8KKyAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorICAgICAgICByYXlfcmVsZWFzZShsaW5rKTsKKworICAgIC8qIEJyZWFrIHRoZSBsaW5rIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworICAgIGlmIChsaW5rLT5oYW5kbGUpCisgICAgICAgIHBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworICAgIAorICAgIC8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIHBpZWNlcyAqLworICAgICpsaW5rcCA9IGxpbmstPm5leHQ7CisgICAgaWYgKGxpbmstPnByaXYpIHsKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisJaWYgKGxpbmstPmRldikgdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICAgICAgZnJlZV9uZXRkZXYoZGV2KTsKKyAgICB9CisgICAga2ZyZWUobGluayk7CisgICAgREVCVUcoMiwicmF5X2NzIHJheV9kZXRhY2ggZW5kaW5nXG4iKTsKK30gLyogcmF5X2RldGFjaCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIHJheV9jb25maWcoKSBpcyBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorICAgIGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICAgIGV0aGVybmV0IGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgTUFYX1RVUExFX1NJWkUgMTI4CitzdGF0aWMgdm9pZCByYXlfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgaW50IGxhc3RfZm4gPSAwLCBsYXN0X3JldCA9IDA7CisgICAgaW50IGk7CisgICAgdV9jaGFyIGJ1ZltNQVhfVFVQTEVfU0laRV07CisgICAgd2luX3JlcV90IHJlcTsKKyAgICBtZW1yZXFfdCBtZW07CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWxpbmstPnByaXY7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisKKyAgICBERUJVRygxLCAicmF5X2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgICAvKiBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24gcmVncyAqLworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBNQVhfVFVQTEVfU0laRTsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKworICAgIC8qIERldGVybWluZSBjYXJkIHR5cGUgYW5kIGZpcm13YXJlIHZlcnNpb24gKi8KKyAgICBidWZbMF0gPSBidWZbTUFYX1RVUExFX1NJWkUgLSAxXSA9IDA7CisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX1ZFUlNfMTsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IE1BWF9UVVBMRV9TSVpFOworICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMjsKKyAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCisgICAgZm9yIChpPTA7IGk8dHVwbGUuVHVwbGVEYXRhTGVuIC0gNDsgaSsrKSAKKyAgICAgICAgaWYgKGJ1ZltpXSA9PSAwKSBidWZbaV0gPSAnICc7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAicmF5X2NzIERldGVjdGVkOiAlc1xuIixidWYpOworCisgICAgLyogQ29uZmlndXJlIGNhcmQgKi8KKyAgICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisgICAgLyogTm93IGFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBhc3NpZ24gYSBoYW5kbGVyIHRvIHRoZSBpbnRlcnJ1cHQuCisgICAgKi8KKyAgICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKSk7CisgICAgZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisgICAgCisgICAgLyogVGhpcyBhY3R1YWxseSBjb25maWd1cmVzIHRoZSBQQ01DSUEgc29ja2V0IC0tIHNldHRpbmcgdXAKKyAgICAgICB0aGUgSS9PIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZy4KKyAgICAqLworICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKworLyoqKiBTZXQgdXAgMzJrIHdpbmRvdyBmb3Igc2hhcmVkIG1lbW9yeSAodHJhbnNtaXQgYW5kIGNvbnRyb2wpICoqKioqKioqKioqKi8KKyAgICByZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzggfCBXSU5fTUVNT1JZX1RZUEVfQ00gfCBXSU5fRU5BQkxFIHwgV0lOX1VTRV9XQUlUOworICAgIHJlcS5CYXNlID0gMDsKKyAgICByZXEuU2l6ZSA9IDB4ODAwMDsKKyAgICByZXEuQWNjZXNzU3BlZWQgPSByYXlfbWVtX3NwZWVkOworICAgIENTX0NIRUNLKFJlcXVlc3RXaW5kb3csIHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKSk7CisgICAgbWVtLkNhcmRPZmZzZXQgPSAweDAwMDA7IG1lbS5QYWdlID0gMDsKKyAgICBDU19DSEVDSyhNYXBNZW1QYWdlLCBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmstPndpbiwgJm1lbSkpOworICAgIGxvY2FsLT5zcmFtID0gaW9yZW1hcChyZXEuQmFzZSxyZXEuU2l6ZSk7CisKKy8qKiogU2V0IHVwIDE2ayB3aW5kb3cgZm9yIHNoYXJlZCBtZW1vcnkgKHJlY2VpdmUgYnVmZmVyKSAqKioqKioqKioqKioqKiovCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84IHwgV0lOX01FTU9SWV9UWVBFX0NNIHwgV0lOX0VOQUJMRSB8IFdJTl9VU0VfV0FJVDsKKyAgICByZXEuQmFzZSA9IDA7CisgICAgcmVxLlNpemUgPSAweDQwMDA7CisgICAgcmVxLkFjY2Vzc1NwZWVkID0gcmF5X21lbV9zcGVlZDsKKyAgICBDU19DSEVDSyhSZXF1ZXN0V2luZG93LCBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxvY2FsLT5ybWVtX2hhbmRsZSkpOworICAgIG1lbS5DYXJkT2Zmc2V0ID0gMHg4MDAwOyBtZW0uUGFnZSA9IDA7CisgICAgQ1NfQ0hFQ0soTWFwTWVtUGFnZSwgcGNtY2lhX21hcF9tZW1fcGFnZShsb2NhbC0+cm1lbV9oYW5kbGUsICZtZW0pKTsKKyAgICBsb2NhbC0+cm1lbSA9IGlvcmVtYXAocmVxLkJhc2UscmVxLlNpemUpOworCisvKioqIFNldCB1cCB3aW5kb3cgZm9yIGF0dHJpYnV0ZSBtZW1vcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84IHwgV0lOX01FTU9SWV9UWVBFX0FNIHwgV0lOX0VOQUJMRSB8IFdJTl9VU0VfV0FJVDsKKyAgICByZXEuQmFzZSA9IDA7CisgICAgcmVxLlNpemUgPSAweDEwMDA7CisgICAgcmVxLkFjY2Vzc1NwZWVkID0gcmF5X21lbV9zcGVlZDsKKyAgICBDU19DSEVDSyhSZXF1ZXN0V2luZG93LCBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxvY2FsLT5hbWVtX2hhbmRsZSkpOworICAgIG1lbS5DYXJkT2Zmc2V0ID0gMHgwMDAwOyBtZW0uUGFnZSA9IDA7CisgICAgQ1NfQ0hFQ0soTWFwTWVtUGFnZSwgcGNtY2lhX21hcF9tZW1fcGFnZShsb2NhbC0+YW1lbV9oYW5kbGUsICZtZW0pKTsKKyAgICBsb2NhbC0+YW1lbSA9IGlvcmVtYXAocmVxLkJhc2UscmVxLlNpemUpOworCisgICAgREVCVUcoMywicmF5X2NvbmZpZyBzcmFtPSVwXG4iLGxvY2FsLT5zcmFtKTsKKyAgICBERUJVRygzLCJyYXlfY29uZmlnIHJtZW09JXBcbiIsbG9jYWwtPnJtZW0pOworICAgIERFQlVHKDMsInJheV9jb25maWcgYW1lbT0lcFxuIixsb2NhbC0+YW1lbSk7CisgICAgaWYgKHJheV9pbml0KGRldikgPCAwKSB7CisgICAgICAgIHJheV9yZWxlYXNlKGxpbmspOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKyAgICBpID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgaWYgKGkgIT0gMCkgeworICAgICAgICBwcmludGsoInJheV9jb25maWcgcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKyAgICAgICAgcmF5X3JlbGVhc2UobGluayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJjcHkobG9jYWwtPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisgICAgbGluay0+ZGV2ID0gJmxvY2FsLT5ub2RlOworCisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogUmF5TGluaywgaXJxICVkLCBod19hZGRyICIsCisgICAgICAgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICBwcmludGsoIiUwMlglcyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaTw1KSA/ICI6IiA6ICJcbiIpKTsKKworICAgIHJldHVybjsKKworY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworCisgICAgcmF5X3JlbGVhc2UobGluayk7Cit9IC8qIHJheV9jb25maWcgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY2NzIF9faW9tZW0gKmNjc19iYXNlKHJheV9kZXZfdCAqZGV2KQoreworCXJldHVybiBkZXYtPnNyYW0gKyBDQ1NfQkFTRTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmNzIF9faW9tZW0gKnJjc19iYXNlKHJheV9kZXZfdCAqZGV2KQoreworCS8qCisJICogVGhpcyBsb29rcyBub25zZW5zaWNhbCwgc2luY2UgdGhlcmUgaXMgYSBzZXBhcmF0ZQorCSAqIFJDU19CQVNFLiBCdXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhICJzdHJ1Y3QgcmNzIgorCSAqIGFuZCBhICJzdHJ1Y3QgY2NzIiBlbmRzIHVwIGJlaW5nIGluIHRoZSBfaW5kZXhfIG9mZgorCSAqIHRoZSBiYXNlLCBzbyB0aGUgYmFzZSBwb2ludGVyIGlzIHRoZSBzYW1lIGZvciBib3RoCisJICogY2NzL3Jjcy4KKwkgKi8KKwlyZXR1cm4gZGV2LT5zcmFtICsgQ0NTX0JBU0U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgcmF5X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpbnQgaTsKKyAgICBVQ0hBUiAqcDsKKyAgICBzdHJ1Y3QgY2NzIF9faW9tZW0gKnBjY3M7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgREVCVUcoMSwgInJheV9pbml0KDB4JXApXG4iLCBkZXYpOworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDAsInJheV9pbml0IC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGxvY2FsLT5uZXRfdHlwZSA9IG5ldF90eXBlOworICAgIGxvY2FsLT5zdGFfdHlwZSA9IFRZUEVfU1RBOworCisgICAgLyogQ29weSB0aGUgc3RhcnR1cCByZXN1bHRzIHRvIGxvY2FsIG1lbW9yeSAqLworICAgIG1lbWNweV9mcm9taW8oJmxvY2FsLT5zdGFydHVwX3JlcywgbG9jYWwtPnNyYW0gKyBFQ0ZfVE9fSE9TVF9CQVNFLFwKKyAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzdGFydHVwX3Jlc182KSk7CisKKyAgICAvKiBDaGVjayBQb3dlciB1cCB0ZXN0IHN0YXR1cyBhbmQgZ2V0IG1hYyBhZGRyZXNzIGZyb20gY2FyZCAqLworICAgIGlmIChsb2NhbC0+c3RhcnR1cF9yZXMuc3RhcnR1cF93b3JkICE9IDB4ODApIHsKKyAgICBwcmludGsoS0VSTl9JTkZPICJyYXlfaW5pdCBFUlJPUiBjYXJkIHN0YXR1cyA9ICUyeFxuIiwKKyAgICAgICAgICAgbG9jYWwtPnN0YXJ0dXBfcmVzLnN0YXJ0dXBfd29yZCk7CisgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfSU5JVF9FUlJPUjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGxvY2FsLT5md192ZXIgPSBsb2NhbC0+c3RhcnR1cF9yZXMuZmlybXdhcmVfdmVyc2lvblswXTsKKyAgICBsb2NhbC0+ZndfYmxkID0gbG9jYWwtPnN0YXJ0dXBfcmVzLmZpcm13YXJlX3ZlcnNpb25bMV07CisgICAgbG9jYWwtPmZ3X3ZhciA9IGxvY2FsLT5zdGFydHVwX3Jlcy5maXJtd2FyZV92ZXJzaW9uWzJdOworICAgIERFQlVHKDEsInJheV9pbml0IGZpcm13YXJlIHZlcnNpb24gJWQuJWQgXG4iLGxvY2FsLT5md192ZXIsIGxvY2FsLT5md19ibGQpOworCisgICAgbG9jYWwtPnRpYl9sZW5ndGggPSAweDIwOworICAgIGlmICgobG9jYWwtPmZ3X3ZlciA9PSA1KSAmJiAobG9jYWwtPmZ3X2JsZCA+PSAzMCkpCisgICAgICAgIGxvY2FsLT50aWJfbGVuZ3RoID0gbG9jYWwtPnN0YXJ0dXBfcmVzLnRpYl9sZW5ndGg7CisgICAgREVCVUcoMiwicmF5X2luaXQgdGliX2xlbmd0aCA9IDB4JTAyeFxuIiwgbG9jYWwtPnRpYl9sZW5ndGgpOworICAgIC8qIEluaXRpYWxpemUgQ0NTJ3MgdG8gYnVmZmVyIGZyZWUgc3RhdGUgKi8KKyAgICBwY2NzID0gY2NzX2Jhc2UobG9jYWwpOworICAgIGZvciAoaT0wOyAgaTxOVU1CRVJfT0ZfQ0NTOyAgaSsrKSB7CisgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0ZSRUUsICYocGNjcysrKS0+YnVmZmVyX3N0YXR1cyk7CisgICAgfQorICAgIGluaXRfc3RhcnR1cF9wYXJhbXMobG9jYWwpOworCisgICAgLyogY29weSBtYWMgYWRkcmVzcyB0byBzdGFydHVwIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAocGFyc2VfYWRkcihwaHlfYWRkciwgbG9jYWwtPnNwYXJtLmI0LmFfbWFjX2FkZHIpKQorICAgIHsKKyAgICAgICAgcCA9IGxvY2FsLT5zcGFybS5iNC5hX21hY19hZGRyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtZW1jcHkoJmxvY2FsLT5zcGFybS5iNC5hX21hY19hZGRyLAorICAgICAgICAgICAgICAgJmxvY2FsLT5zdGFydHVwX3Jlcy5zdGF0aW9uX2FkZHIsIEFERFJMRU4pOworICAgICAgICBwID0gbG9jYWwtPnNwYXJtLmI0LmFfbWFjX2FkZHI7CisgICAgfQorCisgICAgY2xlYXJfaW50ZXJydXB0KGxvY2FsKTsgLyogQ2xlYXIgYW55IGludGVycnVwdCBmcm9tIHRoZSBjYXJkICovCisgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9BV0FJVElOR19QQVJBTTsKKyAgICBERUJVRygyLCJyYXlfaW5pdCBlbmRpbmdcbiIpOworICAgIHJldHVybiAwOworfSAvKiByYXlfaW5pdCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogRG93bmxvYWQgc3RhcnR1cCBwYXJhbWV0ZXJzIHRvIHRoZSBjYXJkIGFuZCBjb21tYW5kIGl0IHRvIHJlYWQgdGhlbSAgICAgICAqLworc3RhdGljIGludCBkbF9zdGFydHVwX3BhcmFtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGludCBjY3NpbmRleDsKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKyAgICBzdHJ1Y3QgY2NzIF9faW9tZW0gKnBjY3M7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisKKyAgICBERUJVRygxLCJkbF9zdGFydHVwX3BhcmFtcyBlbnRlcmVkXG4iKTsKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfY3MgZGxfc3RhcnR1cF9wYXJhbXMgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIAorICAgIC8qIENvcHkgcGFyYW1ldGVycyB0byBob3N0IHRvIEVDRiBhcmVhICovCisgICAgaWYgKGxvY2FsLT5md192ZXIgPT0gMHg1NSkgCisgICAgICAgIG1lbWNweV90b2lvKGxvY2FsLT5zcmFtICsgSE9TVF9UT19FQ0ZfQkFTRSwgJmxvY2FsLT5zcGFybS5iNCwKKyAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgYjRfc3RhcnR1cF9wYXJhbXMpKTsKKyAgICBlbHNlCisgICAgICAgIG1lbWNweV90b2lvKGxvY2FsLT5zcmFtICsgSE9TVF9UT19FQ0ZfQkFTRSwgJmxvY2FsLT5zcGFybS5iNSwKKyAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgYjVfc3RhcnR1cF9wYXJhbXMpKTsKKworICAgIAorICAgIC8qIEZpbGwgaW4gdGhlIENDUyBmaWVsZHMgZm9yIHRoZSBFQ0YgKi8KKyAgICBpZiAoKGNjc2luZGV4ID0gZ2V0X2ZyZWVfY2NzKGxvY2FsKSkgPCAwKSByZXR1cm4gLTE7CisgICAgbG9jYWwtPmRsX3BhcmFtX2NjcyA9IGNjc2luZGV4OworICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKyAgICB3cml0ZWIoQ0NTX0RPV05MT0FEX1NUQVJUVVBfUEFSQU1TLCAmcGNjcy0+Y21kKTsKKyAgICBERUJVRygyLCJkbF9zdGFydHVwX3BhcmFtcyBzdGFydCBjY3NpbmRleCA9ICVkXG4iLCBsb2NhbC0+ZGxfcGFyYW1fY2NzKTsKKyAgICAvKiBJbnRlcnJ1cHQgdGhlIGZpcm13YXJlIHRvIHByb2Nlc3MgdGhlIGNvbW1hbmQgKi8KKyAgICBpZiAoaW50ZXJydXB0X2VjZihsb2NhbCwgY2NzaW5kZXgpKSB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gInJheSBkbF9zdGFydHVwX3BhcmFtcyBmYWlsZWQgLSAiCisgICAgICAgICAgICJFQ0Ygbm90IHJlYWR5IGZvciBpbnRyXG4iKTsKKyAgICAgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9ETF9QQVJBTV9FUlJPUjsKKyAgICAgICAgd3JpdGViKENDU19CVUZGRVJfRlJFRSwgJihwY2NzKyspLT5idWZmZXJfc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKyAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0RMX1BBUkFNOworICAgIC8qIFN0YXJ0IGtlcm5lbCB0aW1lciB0byB3YWl0IGZvciBkbCBzdGFydHVwIHRvIGNvbXBsZXRlLiAqLworICAgIGxvY2FsLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaLzI7CisgICAgbG9jYWwtPnRpbWVyLmRhdGEgPSAobG9uZylsb2NhbDsKKyAgICBsb2NhbC0+dGltZXIuZnVuY3Rpb24gPSAmdmVyaWZ5X2RsX3N0YXJ0dXA7CisgICAgYWRkX3RpbWVyKCZsb2NhbC0+dGltZXIpOworICAgIERFQlVHKDIsInJheV9jcyBkbF9zdGFydHVwX3BhcmFtcyBzdGFydGVkIHRpbWVyIGZvciB2ZXJpZnlfZGxfc3RhcnR1cFxuIik7CisgICAgcmV0dXJuIDA7Cit9IC8qIGRsX3N0YXJ0dXBfcGFyYW1zICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBpbml0X3N0YXJ0dXBfcGFyYW1zKHJheV9kZXZfdCAqbG9jYWwpCit7CisgICAgaW50IGk7IAorCisgICAgaWYgKGNvdW50cnkgPiBKQVBBTl9URVNUKSBjb3VudHJ5ID0gVVNBOworICAgIGVsc2UKKyAgICAgICAgaWYgKGNvdW50cnkgPCBVU0EpIGNvdW50cnkgPSBVU0E7CisgICAgLyogc3RydWN0dXJlIGZvciBob3AgdGltZSBhbmQgYmVhY29uIHBlcmlvZCBpcyBkZWZpbmVkIGhlcmUgdXNpbmcgCisgICAgICogTmV3IDgwMi4xMUQ2LjEgZm9ybWF0LiAgQ2FyZCBmaXJtd2FyZSBpcyBzdGlsbCB1c2luZyBvbGQgZm9ybWF0CisgICAgICogdW50aWwgdmVyc2lvbiA2LgorICAgICAqICAgIEJlZm9yZSAgICAgICAgICAgICAgICAgICAgQWZ0ZXIKKyAgICAgKiAgICBhX2hvcF90aW1lIG1zIGJ5dGUgICAgICAgIGFfaG9wX3RpbWUgbXMgYnl0ZQorICAgICAqICAgIGFfaG9wX3RpbWUgMnMgYnl0ZSAgICAgICAgYV9ob3BfdGltZSBscyBieXRlCisgICAgICogICAgYV9ob3BfdGltZSBscyBieXRlICAgICAgICBhX2JlYWNvbl9wZXJpb2QgbXMgYnl0ZQorICAgICAqICAgIGFfYmVhY29uX3BlcmlvZCAgICAgICAgICAgYV9iZWFjb25fcGVyaW9kIGxzIGJ5dGUKKyAgICAgKgorICAgICAqICAgIGFfaG9wX3RpbWUgPSB1UyAgICAgICAgICAgYV9ob3BfdGltZSA9IEt1UworICAgICAqICAgIGFfYmVhY29uX3BlcmlvZCA9IGhvcHMgICAgYV9iZWFjb25fcGVyaW9kID0gS3VTCisgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2NG1zID0gMDEwMDAwICovCisgICAgaWYgKGxvY2FsLT5md192ZXIgPT0gMHg1NSkgIHsKKyAgICAgICAgbWVtY3B5KChVQ0hBUiAqKSZsb2NhbC0+c3Bhcm0uYjQsIGI0X2RlZmF1bHRfc3RhcnR1cF9wYXJtcywgCisgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGI0X3N0YXJ0dXBfcGFyYW1zKSk7CisgICAgICAgIC8qIFRyYW5zbGF0ZSBzYW5lIGt1cyBpbnB1dCB2YWx1ZXMgdG8gb2xkIGJ1aWxkIDQvNSBmb3JtYXQgKi8KKyAgICAgICAgLyogaSA9IGhvcCB0aW1lIGluIHVTIHRydW5jYXRlZCB0byAzIGJ5dGVzICovCisgICAgICAgIGkgPSAoaG9wX2R3ZWxsICogMTAyNCkgJiAweGZmZmZmZjsKKyAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfaG9wX3RpbWVbMF0gPSAoaSA+PiAxNikgJiAweGZmOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjQuYV9ob3BfdGltZVsxXSA9IChpID4+IDgpICYgMHhmZjsKKyAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfYmVhY29uX3BlcmlvZFswXSA9IDA7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2JlYWNvbl9wZXJpb2RbMV0gPQorICAgICAgICAgICAgKChiZWFjb25fcGVyaW9kL2hvcF9kd2VsbCkgLSAxKSAmIDB4ZmY7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2N1cnJfY291bnRyeV9jb2RlID0gY291bnRyeTsKKyAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfaG9wX3BhdHRlcm5fbGVuZ3RoID0gCisgICAgICAgICAgICBob3BfcGF0dGVybl9sZW5ndGhbKGludCljb3VudHJ5XSAtIDE7CisgICAgICAgIGlmIChiYykKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfYWNrX3RpbWVvdXQgPSAweDUwOworICAgICAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfc2lmcyA9IDB4M2Y7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7ICAgIC8qIFZlcnNpb24gNSB1c2VzIHJlYWwga3VzIHZhbHVlcyAqLworICAgICAgICBtZW1jcHkoKFVDSEFSICopJmxvY2FsLT5zcGFybS5iNSwgYjVfZGVmYXVsdF9zdGFydHVwX3Bhcm1zLCAKKyAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgYjVfc3RhcnR1cF9wYXJhbXMpKTsKKworICAgICAgICBsb2NhbC0+c3Bhcm0uYjUuYV9ob3BfdGltZVswXSA9IChob3BfZHdlbGwgPj4gOCkgJiAweGZmOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjUuYV9ob3BfdGltZVsxXSA9IGhvcF9kd2VsbCAmIDB4ZmY7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX2JlYWNvbl9wZXJpb2RbMF0gPSAoYmVhY29uX3BlcmlvZCA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX2JlYWNvbl9wZXJpb2RbMV0gPSBiZWFjb25fcGVyaW9kICYgMHhmZjsKKyAgICAgICAgaWYgKHBzbSkKKyAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX3Bvd2VyX21ndF9zdGF0ZSA9IDE7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX2N1cnJfY291bnRyeV9jb2RlID0gY291bnRyeTsKKyAgICAgICAgbG9jYWwtPnNwYXJtLmI1LmFfaG9wX3BhdHRlcm5fbGVuZ3RoID0gCisgICAgICAgICAgICBob3BfcGF0dGVybl9sZW5ndGhbKGludCljb3VudHJ5XTsKKyAgICB9CisgICAgCisgICAgbG9jYWwtPnNwYXJtLmI0LmFfbmV0d29ya190eXBlID0gbmV0X3R5cGUgJiAweDAxOworICAgIGxvY2FsLT5zcGFybS5iNC5hX2FjdGluZ19hc19hcF9zdGF0dXMgPSBUWVBFX1NUQTsKKworICAgIGlmIChlc3NpZCAhPSBOVUxMKQorICAgICAgICBzdHJuY3B5KGxvY2FsLT5zcGFybS5iNC5hX2N1cnJlbnRfZXNzX2lkLCBlc3NpZCwgRVNTSURfU0laRSk7Cit9IC8qIGluaXRfc3RhcnR1cF9wYXJhbXMgKi8gCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCB2ZXJpZnlfZGxfc3RhcnR1cCh1X2xvbmcgZGF0YSkKK3sKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRhdGE7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzID0gY2NzX2Jhc2UobG9jYWwpICsgbG9jYWwtPmRsX3BhcmFtX2NjczsKKyAgICBVQ0hBUiBzdGF0dXM7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfY3MgdmVyaWZ5X2RsX3N0YXJ0dXAgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorI2lmZGVmIFBDTUNJQV9ERUJVRworICAgIGlmIChwY19kZWJ1ZyA+IDIpIHsKKyAgICBpbnQgaTsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAidmVyaWZ5X2RsX3N0YXJ0dXAgcGFyYW1ldGVycyBzZW50IHZpYSBjY3MgJWQ6XG4iLAorICAgICAgICAgICBsb2NhbC0+ZGxfcGFyYW1fY2NzKTsKKyAgICAgICAgZm9yIChpPTA7IGk8c2l6ZW9mKHN0cnVjdCBiNV9zdGFydHVwX3BhcmFtcyk7IGkrKykgeworICAgICAgICAgICAgcHJpbnRrKCIgJTJ4IiwgKHVuc2lnbmVkIGludCkgcmVhZGIobG9jYWwtPnNyYW0gKyBIT1NUX1RPX0VDRl9CQVNFICsgaSkpOworICAgICAgICB9CisgICAgcHJpbnRrKCJcbiIpOworICAgIH0KKyNlbmRpZgorCisgICAgc3RhdHVzID0gcmVhZGIoJnBjY3MtPmJ1ZmZlcl9zdGF0dXMpOworICAgIGlmIChzdGF0dXMhPSBDQ1NfQlVGRkVSX0ZSRUUpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJEb3dubG9hZCBzdGFydHVwIHBhcmFtcyBmYWlsZWQuICBTdGF0dXMgPSAlZFxuIiwKKyAgICAgICAgICAgc3RhdHVzKTsKKyAgICAgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9ETF9QQVJBTV9FUlJPUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobG9jYWwtPnNwYXJtLmI0LmFfbmV0d29ya190eXBlID09IEFESE9DKQorICAgICAgICBzdGFydF9uZXQoKHVfbG9uZylsb2NhbCk7CisgICAgZWxzZQorICAgICAgICBqb2luX25ldCgodV9sb25nKWxvY2FsKTsKKworICAgIHJldHVybjsKK30gLyogZW5kIHZlcmlmeV9kbF9zdGFydHVwICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBDb21tYW5kIGNhcmQgdG8gc3RhcnQgYSBuZXR3b3JrICovCitzdGF0aWMgdm9pZCBzdGFydF9uZXQodV9sb25nIGRhdGEpCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkYXRhOworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKyAgICBpbnQgY2NzaW5kZXg7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIHN0YXJ0X25ldCAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogRmlsbCBpbiB0aGUgQ0NTIGZpZWxkcyBmb3IgdGhlIEVDRiAqLworICAgIGlmICgoY2NzaW5kZXggPSBnZXRfZnJlZV9jY3MobG9jYWwpKSA8IDApIHJldHVybjsKKyAgICBwY2NzID0gY2NzX2Jhc2UobG9jYWwpICsgY2NzaW5kZXg7CisgICAgd3JpdGViKENDU19TVEFSVF9ORVRXT1JLLCAmcGNjcy0+Y21kKTsKKyAgICB3cml0ZWIoMCwgJnBjY3MtPnZhci5zdGFydF9uZXR3b3JrLnVwZGF0ZV9wYXJhbSk7CisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygxLCJyYXkgc3RhcnQgbmV0IGZhaWxlZCAtIGNhcmQgbm90IHJlYWR5IGZvciBpbnRyXG4iKTsKKyAgICAgICAgd3JpdGViKENDU19CVUZGRVJfRlJFRSwgJihwY2NzKyspLT5idWZmZXJfc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0RPSU5HX0FDUTsKKyAgICByZXR1cm47Cit9IC8qIGVuZCBzdGFydF9uZXQgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIENvbW1hbmQgY2FyZCB0byBqb2luIGEgbmV0d29yayAqLworc3RhdGljIHZvaWQgam9pbl9uZXQodV9sb25nIGRhdGEpCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkYXRhOworCisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzOworICAgIGludCBjY3NpbmRleDsKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKyAgICAKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfY3Mgam9pbl9uZXQgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIEZpbGwgaW4gdGhlIENDUyBmaWVsZHMgZm9yIHRoZSBFQ0YgKi8KKyAgICBpZiAoKGNjc2luZGV4ID0gZ2V0X2ZyZWVfY2NzKGxvY2FsKSkgPCAwKSByZXR1cm47CisgICAgcGNjcyA9IGNjc19iYXNlKGxvY2FsKSArIGNjc2luZGV4OworICAgIHdyaXRlYihDQ1NfSk9JTl9ORVRXT1JLLCAmcGNjcy0+Y21kKTsKKyAgICB3cml0ZWIoMCwgJnBjY3MtPnZhci5qb2luX25ldHdvcmsudXBkYXRlX3BhcmFtKTsKKyAgICB3cml0ZWIoMCwgJnBjY3MtPnZhci5qb2luX25ldHdvcmsubmV0X2luaXRpYXRlZCk7CisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygxLCJyYXkgam9pbiBuZXQgZmFpbGVkIC0gY2FyZCBub3QgcmVhZHkgZm9yIGludHJcbiIpOworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmKHBjY3MrKyktPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfRE9JTkdfQUNROworICAgIHJldHVybjsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCByYXlfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUgbmV0CisgICAgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgICAgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByYXlfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OyAKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gZGV2LT5wcml2OworICAgIGludCBpOworICAgIAorICAgIERFQlVHKDEsICJyYXlfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisKKyAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7CisKKyAgICBpb3VubWFwKGxvY2FsLT5zcmFtKTsKKyAgICBpb3VubWFwKGxvY2FsLT5ybWVtKTsKKyAgICBpb3VubWFwKGxvY2FsLT5hbWVtKTsKKyAgICAvKiBEbyBib3RoZXIgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXNlIHN1Y2NlZWQgb3Igbm90ICovCisgICAgaSA9IHBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworICAgIGlmICggaSAhPSBDU19TVUNDRVNTICkgREVCVUcoMCwiUmVsZWFzZVdpbmRvdyhsaW5rLT53aW4pIHJldCA9ICV4XG4iLGkpOworICAgIGkgPSBwY21jaWFfcmVsZWFzZV93aW5kb3cobG9jYWwtPmFtZW1faGFuZGxlKTsKKyAgICBpZiAoIGkgIT0gQ1NfU1VDQ0VTUyApIERFQlVHKDAsIlJlbGVhc2VXaW5kb3cobG9jYWwtPmFtZW0pIHJldCA9ICV4XG4iLGkpOworICAgIGkgPSBwY21jaWFfcmVsZWFzZV93aW5kb3cobG9jYWwtPnJtZW1faGFuZGxlKTsKKyAgICBpZiAoIGkgIT0gQ1NfU1VDQ0VTUyApIERFQlVHKDAsIlJlbGVhc2VXaW5kb3cobG9jYWwtPnJtZW0pIHJldCA9ICV4XG4iLGkpOworICAgIGkgPSBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgaWYgKCBpICE9IENTX1NVQ0NFU1MgKSBERUJVRygwLCJSZWxlYXNlQ29uZmlndXJhdGlvbiByZXQgPSAleFxuIixpKTsKKyAgICBpID0gcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisgICAgaWYgKCBpICE9IENTX1NVQ0NFU1MgKSBERUJVRygwLCJSZWxlYXNlSVJRIHJldCA9ICV4XG4iLGkpOworCisgICAgREVCVUcoMiwicmF5X3JlbGVhc2UgZW5kaW5nXG4iKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICAgIHN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4gIEEgQ0FSRF9SRU1PVkFMIGV2ZW50CisgICAgYWxzbyBzZXRzIHNvbWUgZmxhZ3MgdG8gZGlzY291cmFnZSB0aGUgbmV0IGRyaXZlcnMgZnJvbSB0cnlpbmcKKyAgICB0byB0YWxrIHRvIHRoZSBjYXJkIGFueSBtb3JlLgorCisgICAgV2hlbiBhIENBUkRfUkVNT1ZBTCBldmVudCBpcyByZWNlaXZlZCwgd2UgaW1tZWRpYXRlbHkgc2V0IGEgZmxhZworICAgIHRvIGJsb2NrIGZ1dHVyZSBhY2Nlc3NlcyB0byB0aGlzIGRldmljZS4gIEFsbCB0aGUgZnVuY3Rpb25zIHRoYXQKKyAgICBhY3R1YWxseSBhY2Nlc3MgdGhlIGRldmljZSBzaG91bGQgY2hlY2sgdGhpcyBmbGFnIHRvIG1ha2Ugc3VyZQorICAgIHRoZSBjYXJkIGlzIHN0aWxsIHByZXNlbnQuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIERFQlVHKDEsICJyYXlfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworICAgIAorICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKyAgICAgICAgbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworICAgICAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisgICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgcmF5X3JlbGVhc2UobGluayk7CisgICAgICAgICAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKyAgICAgICAgbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisgICAgICAgIHJheV9jb25maWcobGluayk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKyAgICAgICAgbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisgICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKyAgICAgICAgICAgIGlmIChsaW5rLT5vcGVuKQorICAgICAgICAgICAgCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKworICAgICAgICAgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorICAgICAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKyAgICAgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworICAgICAgICAgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKyAgICAgICAgICAgIGlmIChsaW5rLT5vcGVuKSB7CisgICAgICAgICAgICAgICAgcmF5X3Jlc2V0KGRldik7CisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgICAgREVCVUcoMiwicmF5X2V2ZW50IGVuZGluZ1xuIik7Cit9IC8qIHJheV9ldmVudCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IHJheV9kZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworI2lmZGVmIFJBWV9JTU1FRElBVEVfSU5JVAorICAgIGludCBpOworI2VuZGlmCS8qIFJBWV9JTU1FRElBVEVfSU5JVCAqLworICAgIHJheV9kZXZfdCAqbG9jYWwgPSBkZXYtPnByaXY7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisKKyAgICBERUJVRygxLCJyYXlfZGV2X2luaXQoZGV2PSVwKVxuIixkZXYpOworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV9kZXZfaW5pdCAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisjaWZkZWYgUkFZX0lNTUVESUFURV9JTklUCisgICAgLyogRG93bmxvYWQgc3RhcnR1cCBwYXJhbWV0ZXJzICovCisgICAgaWYgKCAoaSA9IGRsX3N0YXJ0dXBfcGFyYW1zKGRldikpIDwgMCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gInJheV9kZXZfaW5pdCBkbF9zdGFydHVwX3BhcmFtcyBmYWlsZWQgLSAiCisgICAgICAgICAgICJyZXR1cm5zIDB4JXhcbiIsaSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisjZWxzZQkvKiBSQVlfSU1NRURJQVRFX0lOSVQgKi8KKyAgICAvKiBQb3N0cG9uZSB0aGUgY2FyZCBpbml0IHNvIHRoYXQgd2UgY2FuIHN0aWxsIGNvbmZpZ3VyZSB0aGUgY2FyZCwKKyAgICAgKiBmb3IgZXhhbXBsZSB1c2luZyB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucy4gVGhlIGluaXQgd2lsbCBoYXBwZW4KKyAgICAgKiBpbiByYXlfb3BlbigpIC0gSmVhbiBJSSAqLworICAgIERFQlVHKDEsInJheV9kZXZfaW5pdDogcG9zdHBvbmluZyBjYXJkIGluaXQgdG8gcmF5X29wZW4oKSA7IFN0YXR1cyA9ICVkXG4iLAorCSAgbG9jYWwtPmNhcmRfc3RhdHVzKTsKKyNlbmRpZgkvKiBSQVlfSU1NRURJQVRFX0lOSVQgKi8KKworICAgIC8qIGNvcHkgbWFjIGFuZCBicm9hZGNhc3QgYWRkcmVzc2VzIHRvIGxpbnV4IGRldmljZSAqLworICAgIG1lbWNweSgmZGV2LT5kZXZfYWRkciwgJmxvY2FsLT5zcGFybS5iNC5hX21hY19hZGRyLCBBRERSTEVOKTsKKyAgICBtZW1zZXQoZGV2LT5icm9hZGNhc3QsIDB4ZmYsIEVUSF9BTEVOKTsKKworICAgIERFQlVHKDIsInJheV9kZXZfaW5pdCBlbmRpbmdcbiIpOworICAgIHJldHVybiAwOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCByYXlfZGV2X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKK3sKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gZGV2LT5wcml2OworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICAgIC8qIER1bW15IHJvdXRpbmUgdG8gc2F0aXNmeSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgREVCVUcoMSwicmF5X2Rldl9jb25maWcoZGV2PSVwLGlmbWFwPSVwKVxuIixkZXYsbWFwKTsKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfZGV2X2NvbmZpZyAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgcmF5X2Rldl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IGRldi0+cHJpdjsKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKyAgICBzaG9ydCBsZW5ndGggPSBza2ItPmxlbjsKKworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV9kZXZfc3RhcnRfeG1pdCAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgREVCVUcoMywicmF5X2Rldl9zdGFydF94bWl0KHNrYj0lcCwgZGV2PSVwKVxuIixza2IsZGV2KTsKKyAgICBpZiAobG9jYWwtPmF1dGhlbnRpY2F0aW9uX3N0YXRlID09IE5FRURfVE9fQVVUSCkgeworICAgICAgICBERUJVRygwLCJyYXlfY3MgU2VuZGluZyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0LlxuIik7CisgICAgICAgIGlmICghYnVpbGRfYXV0aF9mcmFtZSAobG9jYWwsIGxvY2FsLT5hdXRoX2lkLCBPUEVOX0FVVEhfUkVRVUVTVCkpIHsKKyAgICAgICAgICAgIGxvY2FsLT5hdXRoZW50aWNhdGlvbl9zdGF0ZSA9IEFVVEhFTlRJQ0FURUQ7CisgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsZW5ndGggPCBFVEhfWkxFTikKKyAgICB7CisgICAgCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKyAgICAJaWYgKHNrYiA9PSBOVUxMKQorICAgIAkJcmV0dXJuIDA7CisgICAgCWxlbmd0aCA9IEVUSF9aTEVOOworICAgIH0KKyAgICBzd2l0Y2ggKHJheV9od194bWl0KCBza2ItPmRhdGEsIGxlbmd0aCwgZGV2LCBEQVRBX1RZUEUpKSB7CisgICAgICAgIGNhc2UgWE1JVF9OT19DQ1M6CisgICAgICAgIGNhc2UgWE1JVF9ORUVEX0FVVEg6CisJICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIFhNSVRfTk9fSU5UUjoKKyAgICAgICAgY2FzZSBYTUlUX01TR19CQUQ6CisgICAgICAgIGNhc2UgWE1JVF9PSzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworICAgICAgICAgICAgZGV2X2tmcmVlX3NrYihza2IpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiByYXlfZGV2X3N0YXJ0X3htaXQgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgcmF5X2h3X3htaXQodW5zaWduZWQgY2hhciogZGF0YSwgaW50IGxlbiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgCisgICAgICAgICAgICAgICAgVUNIQVIgbXNnX3R5cGUpCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzOworICAgIGludCBjY3NpbmRleDsKKyAgICBpbnQgb2Zmc2V0OworICAgIHN0cnVjdCB0eF9tc2cgX19pb21lbSAqcHR4OyAvKiBBZGRyZXNzIG9mIHhtaXQgYnVmZmVyIGluIFBDIHNwYWNlICovCisgICAgc2hvcnQgaW50IGFkZHI7ICAgICAvKiBBZGRyZXNzIG9mIHhtaXQgYnVmZmVyIGluIGNhcmQgc3BhY2UgKi8KKyAgICAKKyAgICBERUJVRygzLCJyYXlfaHdfeG1pdChkYXRhPSVwLCBsZW49JWQsIGRldj0lcClcbiIsZGF0YSxsZW4sZGV2KTsKKyAgICBpZiAobGVuICsgVFhfSEVBREVSX0xFTkdUSCA+IFRYX0JVRl9TSVpFKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAicmF5X2h3X3htaXQgcGFja2V0IHRvbyBsYXJnZTogJWQgYnl0ZXNcbiIsbGVuKTsKKyAgICAgICAgcmV0dXJuIFhNSVRfTVNHX0JBRDsKKyAgICB9CisJc3dpdGNoIChjY3NpbmRleCA9IGdldF9mcmVlX3R4X2Njcyhsb2NhbCkpIHsKKwljYXNlIEVDQ1NCVVNZOgorCQlERUJVRygyLCJyYXlfaHdfeG1pdCB0eF9jY3MgdGFibGUgYnVzeVxuIik7CisJY2FzZSBFQ0NTRlVMTDoKKyAgICAgICAgREVCVUcoMiwicmF5X2h3X3htaXQgTm8gZnJlZSB0eCBjY3NcbiIpOworCWNhc2UgRUNBUkRHT05FOgorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICAgICAgcmV0dXJuIFhNSVRfTk9fQ0NTOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKyAgICBhZGRyID0gVFhfQlVGX0JBU0UgKyAoY2NzaW5kZXggPDwgMTEpOworCisgICAgaWYgKG1zZ190eXBlID09IERBVEFfVFlQRSkgeworICAgICAgICBsb2NhbC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOworICAgICAgICBsb2NhbC0+c3RhdHMudHhfcGFja2V0cysrOworICAgIH0KKworICAgIHB0eCA9IGxvY2FsLT5zcmFtICsgYWRkcjsKKworICAgIHJheV9idWlsZF9oZWFkZXIobG9jYWwsIHB0eCwgbXNnX3R5cGUsIGRhdGEpOworICAgIGlmICh0cmFuc2xhdGUpIHsKKyAgICAgICAgb2Zmc2V0ID0gdHJhbnNsYXRlX2ZyYW1lKGxvY2FsLCBwdHgsIGRhdGEsIGxlbik7CisgICAgfQorICAgIGVsc2UgeyAvKiBFbmNhcHN1bGF0ZSBmcmFtZSAqLworICAgICAgICAvKiBUQkQgVElCIGxlbmd0aCB3aWxsIG1vdmUgYWRkcmVzcyBvZiBwdHgtPnZhciAqLworICAgICAgICBtZW1jcHlfdG9pbygmcHR4LT52YXIsIGRhdGEsIGxlbik7CisgICAgICAgIG9mZnNldCA9IDA7CisgICAgfQorCisgICAgLyogZmlsbCBpbiB0aGUgQ0NTICovCisgICAgcGNjcyA9IGNjc19iYXNlKGxvY2FsKSArIGNjc2luZGV4OworICAgIGxlbiArPSBUWF9IRUFERVJfTEVOR1RIICsgb2Zmc2V0OworICAgIHdyaXRlYihDQ1NfVFhfUkVRVUVTVCwgJnBjY3MtPmNtZCk7CisgICAgd3JpdGViKGFkZHIgPj4gOCwgJnBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfcHRyWzBdKTsKKyAgICB3cml0ZWIobG9jYWwtPnRpYl9sZW5ndGgsICZwY2NzLT52YXIudHhfcmVxdWVzdC50eF9kYXRhX3B0clsxXSk7CisgICAgd3JpdGViKGxlbiA+PiA4LCAmcGNjcy0+dmFyLnR4X3JlcXVlc3QudHhfZGF0YV9sZW5ndGhbMF0pOworICAgIHdyaXRlYihsZW4gJiAweGZmLCAmcGNjcy0+dmFyLnR4X3JlcXVlc3QudHhfZGF0YV9sZW5ndGhbMV0pOworLyogVEJEIHN0aWxsIG5lZWQgcHNtX2NhbT8gKi8KKyAgICB3cml0ZWIoUFNNX0NBTSwgJnBjY3MtPnZhci50eF9yZXF1ZXN0LnBvd19zYXZfbW9kZSk7CisgICAgd3JpdGViKGxvY2FsLT5uZXRfZGVmYXVsdF90eF9yYXRlLCAmcGNjcy0+dmFyLnR4X3JlcXVlc3QudHhfcmF0ZSk7CisgICAgd3JpdGViKDAsICZwY2NzLT52YXIudHhfcmVxdWVzdC5hbnRlbm5hKTsKKyAgICBERUJVRygzLCJyYXlfaHdfeG1pdCBkZWZhdWx0X3R4X3JhdGUgPSAweCV4XG4iLFwKKyAgICAgICAgICBsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSk7CisKKyAgICAvKiBJbnRlcnJ1cHQgdGhlIGZpcm13YXJlIHRvIHByb2Nlc3MgdGhlIGNvbW1hbmQgKi8KKyAgICBpZiAoaW50ZXJydXB0X2VjZihsb2NhbCwgY2NzaW5kZXgpKSB7CisgICAgICAgIERFQlVHKDIsInJheV9od194bWl0IGZhaWxlZCAtIEVDRiBub3QgcmVhZHkgZm9yIGludHJcbiIpOworLyogVEJEIHZlcnkgaW5lZmZpY2llbnQgdG8gY29weSBwYWNrZXQgdG8gYnVmZmVyLCBhbmQgdGhlbiBub3QKKyAgIHNlbmQgaXQsIGJ1dCB0aGUgYWx0ZXJuYXRpdmUgaXMgdG8gcXVldWUgdGhlIG1lc3NhZ2VzIGFuZCB0aGF0CisgICB3b24ndCBiZSBkb25lIGZvciBhIHdoaWxlLiAgTWF5YmUgc2V0IHRidXN5IHVudGlsIGEgQ0NTIGlzIGZyZWU/CisqLworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmcGNjcy0+YnVmZmVyX3N0YXR1cyk7CisgICAgICAgIHJldHVybiBYTUlUX05PX0lOVFI7CisgICAgfQorICAgIHJldHVybiBYTUlUX09LOworfSAvKiBlbmQgcmF5X2h3X3htaXQgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgdHJhbnNsYXRlX2ZyYW1lKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCB0eF9tc2cgX19pb21lbSAqcHR4LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKQoreworICAgIHVuc2lnbmVkIHNob3J0IGludCBwcm90byA9ICgoc3RydWN0IGV0aGhkciAqKWRhdGEpLT5oX3Byb3RvOworICAgIGlmIChudG9ocyhwcm90bykgPj0gMTUzNikgeyAvKiBESVggSUkgZXRoZXJuZXQgZnJhbWUgKi8KKyAgICAgICAgREVCVUcoMywicmF5X2NzIHRyYW5zbGF0ZV9mcmFtZSBESVggSUlcbiIpOworICAgICAgICAvKiBDb3B5IExMQyBoZWFkZXIgdG8gY2FyZCBidWZmZXIgKi8KKyAgICAgICAgbWVtY3B5X3RvaW8oJnB0eC0+dmFyLCBldGgyX2xsYywgc2l6ZW9mKGV0aDJfbGxjKSk7CisgICAgICAgIG1lbWNweV90b2lvKCAoKHZvaWQgX19pb21lbSAqKSZwdHgtPnZhcikgKyBzaXplb2YoZXRoMl9sbGMpLCAoVUNIQVIgKikmcHJvdG8sIDIpOworICAgICAgICBpZiAoKHByb3RvID09IDB4ZjM4MCkgfHwgKHByb3RvID09IDB4Mzc4MSkpIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHNlbGVjdGl2ZSB0cmFuc2xhdGlvbiB0YWJsZSwgb25seSAyIGVudHJpZXMgKi8KKyAgICAgICAgICAgIHdyaXRlYigweGY4LCAmKChzdHJ1Y3Qgc25hcGhkcl90IF9faW9tZW0gKilwdHgtPnZhciktPm9yZ1szXSk7CisgICAgICAgIH0KKyAgICAgICAgLyogQ29weSBib2R5IG9mIGV0aGVybmV0IHBhY2tldCB3aXRob3V0IGV0aGVybmV0IGhlYWRlciAqLworICAgICAgICBtZW1jcHlfdG9pbygodm9pZCBfX2lvbWVtICopJnB0eC0+dmFyICsgc2l6ZW9mKHN0cnVjdCBzbmFwaGRyX3QpLCBcCisgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBFVEhfSExFTiwgIGxlbiAtIEVUSF9ITEVOKTsKKyAgICAgICAgcmV0dXJuIChpbnQpIHNpemVvZihzdHJ1Y3Qgc25hcGhkcl90KSAtIEVUSF9ITEVOOworICAgIH0KKyAgICBlbHNlIHsgLyogYWxyZWFkeSAgODAyIHR5cGUsIGFuZCBwcm90byBpcyBsZW5ndGggKi8KKyAgICAgICAgREVCVUcoMywicmF5X2NzIHRyYW5zbGF0ZV9mcmFtZSA4MDJcbiIpOworICAgICAgICBpZiAocHJvdG8gPT0gMHhmZmZmKSB7IC8qIGV2aWwgbmV0d2FyZSBJUFggODAyLjMgd2l0aG91dCBMTEMgKi8KKyAgICAgICAgREVCVUcoMywicmF5X2NzIHRyYW5zbGF0ZV9mcmFtZSBldmlsIElQWFxuIik7CisgICAgICAgICAgICBtZW1jcHlfdG9pbygmcHR4LT52YXIsIGRhdGEgKyBFVEhfSExFTiwgIGxlbiAtIEVUSF9ITEVOKTsKKyAgICAgICAgICAgIHJldHVybiAwIC0gRVRIX0hMRU47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5X3RvaW8oJnB0eC0+dmFyLCBkYXRhICsgRVRIX0hMRU4sICBsZW4gLSBFVEhfSExFTik7CisgICAgICAgIHJldHVybiAwIC0gRVRIX0hMRU47CisgICAgfQorICAgIC8qIFRCRCBkbyBvdGhlciBmcmFtZSB0eXBlcyAqLworfSAvKiBlbmQgdHJhbnNsYXRlX2ZyYW1lICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByYXlfYnVpbGRfaGVhZGVyKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCB0eF9tc2cgX19pb21lbSAqcHR4LCBVQ0hBUiBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhKQoreworICAgIHdyaXRlYihQUk9UT0NPTF9WRVIgfCBtc2dfdHlwZSwgJnB0eC0+bWFjLmZyYW1lX2N0bF8xKTsKKy8qKiogSUVFRSA4MDIuMTEgQWRkcmVzcyBmaWVsZCBhc3NpZ25tZW50cyAqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgVE9EUyBGUk9NRFMgICBhZGRyXzEgICAgIGFkZHJfMiAgICAgICAgICBhZGRyXzMgICBhZGRyXzQKK0FkaG9jICAgICAgICAgICAwICAgIDAgICAgICAgIGRlc3QgICAgICAgc3JjICh0ZXJtaW5hbCkgIEJTU0lEICAgIE4vQQorQVAgdG8gVGVybWluYWwgIDAgICAgMSAgICAgICAgZGVzdCAgICAgICBBUChCU1NJRCkgICAgICAgc291cmNlICAgTi9BCitUZXJtaW5hbCB0byBBUCAgMSAgICAwICAgICAgICBBUChCU1NJRCkgIHNyYyAodGVybWluYWwpICBkZXN0ICAgICBOL0EKK0FQIHRvIEFQICAgICAgICAxICAgIDEgICAgICAgIGRlc3QgQVAgICAgc3JjIEFQICAgICAgICAgIGRlc3QgICAgIHNvdXJjZSAgICAgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAobG9jYWwtPm5ldF90eXBlID09IEFESE9DKSB7ICAgCisgICAgICAgIHdyaXRlYigwLCAmcHR4LT5tYWMuZnJhbWVfY3RsXzIpOworICAgICAgICBtZW1jcHlfdG9pbyhwdHgtPm1hYy5hZGRyXzEsICgoc3RydWN0IGV0aGhkciAqKWRhdGEpLT5oX2Rlc3QsIDIgKiBBRERSTEVOKTsKKyAgICAgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8zLCBsb2NhbC0+YnNzX2lkLCBBRERSTEVOKTsKKyAgICB9CisgICAgZWxzZSAvKiBpbmZyYXN0cnVjdHVyZSAqLworICAgIHsKKyAgICAgICAgaWYgKGxvY2FsLT5zcGFybS5iNC5hX2FjdGluZ19hc19hcF9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlYihGQzJfRlJPTV9EUywgJnB0eC0+bWFjLmZyYW1lX2N0bF8yKTsKKyAgICAgICAgICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMSwgKChzdHJ1Y3QgZXRoaGRyICopZGF0YSktPmhfZGVzdCwgQUREUkxFTik7CisgICAgICAgICAgICBtZW1jcHlfdG9pbyhwdHgtPm1hYy5hZGRyXzIsIGxvY2FsLT5ic3NfaWQsIDYpOworICAgICAgICAgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8zLCAoKHN0cnVjdCBldGhoZHIgKilkYXRhKS0+aF9zb3VyY2UsIEFERFJMRU4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogVGVybWluYWwgKi8KKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGViKEZDMl9UT19EUywgJnB0eC0+bWFjLmZyYW1lX2N0bF8yKTsKKyAgICAgICAgICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMSwgbG9jYWwtPmJzc19pZCwgQUREUkxFTik7CisgICAgICAgICAgICBtZW1jcHlfdG9pbyhwdHgtPm1hYy5hZGRyXzIsICgoc3RydWN0IGV0aGhkciAqKWRhdGEpLT5oX3NvdXJjZSwgQUREUkxFTik7CisgICAgICAgICAgICBtZW1jcHlfdG9pbyhwdHgtPm1hYy5hZGRyXzMsICgoc3RydWN0IGV0aGhkciAqKWRhdGEpLT5oX2Rlc3QsIEFERFJMRU4pOworICAgICAgICB9CisgICAgfQorfSAvKiBlbmQgZW5jYXBzdWxhdGVfZnJhbWUgKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgInJheV9jcyIpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgcmF5X2Rldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKyAgICBpbnQgZXJyID0gMDsKKyNpZiBXSVJFTEVTU19FWFQgPiA3CisgICAgc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopIGlmcjsKKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA3ICovCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgc3RydWN0IHNvY2thZGRyCWFkZHJlc3NbSVdfTUFYX1NQWV07CisjZW5kaWYJLyogV0lSRUxFU1NfU1BZICovCisKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfZGV2X2lvY3RsIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBERUJVRygyLCJyYXlfY3MgSU9DVEwgZGV2PSVwLCBpZnI9JXAsIGNtZCA9IDB4JXhcbiIsZGV2LGlmcixjbWQpOworICAgIC8qIFZhbGlkYXRlIHRoZSBjb21tYW5kICovCisgICAgc3dpdGNoIChjbWQpCisgICAgeworI2lmIFdJUkVMRVNTX0VYVCA+IDcKKyAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLSBXSVJFTEVTUyBFWFRFTlNJT05TIC0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgLyogR2V0IG5hbWUgKi8KKyAgICBjYXNlIFNJT0NHSVdOQU1FOgorICAgICAgc3RyY3B5KHdycS0+dS5uYW1lLCAiSUVFRSA4MDIuMTEtRkgiKTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBHZXQgZnJlcXVlbmN5L2NoYW5uZWwgKi8KKyAgICBjYXNlIFNJT0NHSVdGUkVROgorICAgICAgd3JxLT51LmZyZXEubSA9IGxvY2FsLT5zcGFybS5iNS5hX2hvcF9wYXR0ZXJuOworICAgICAgd3JxLT51LmZyZXEuZSA9IDA7CisgICAgICBicmVhazsKKworICAgICAgLyogU2V0IGZyZXF1ZW5jeS9jaGFubmVsICovCisgICAgY2FzZSBTSU9DU0lXRlJFUToKKyAgICAgIC8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KKyAgICAgIGlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQorCXsKKwkgIGVyciA9IC1FQlVTWTsKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogU2V0dGluZyBieSBjaGFubmVsIG51bWJlciAqLworICAgICAgaWYgKCh3cnEtPnUuZnJlcS5tID4gVVNBX0hPUF9NT0QpIHx8ICh3cnEtPnUuZnJlcS5lID4gMCkpCisJZXJyID0gLUVPUE5PVFNVUFA7CisgICAgICBlbHNlCisJICBsb2NhbC0+c3Bhcm0uYjUuYV9ob3BfcGF0dGVybiA9IHdycS0+dS5mcmVxLm07CisgICAgICBicmVhazsKKworICAgICAgLyogR2V0IGN1cnJlbnQgbmV0d29yayBuYW1lIChFU1NJRCkgKi8KKyAgICBjYXNlIFNJT0NHSVdFU1NJRDoKKyAgICAgIGlmICh3cnEtPnUuZGF0YS5wb2ludGVyKQorCXsKKwkgIGNoYXIgZXNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKwkgIC8qIEdldCB0aGUgZXNzaWQgdGhhdCB3YXMgc2V0ICovCisJICBtZW1jcHkoZXNzaWQsIGxvY2FsLT5zcGFybS5iNS5hX2N1cnJlbnRfZXNzX2lkLAorCQkgSVdfRVNTSURfTUFYX1NJWkUpOworCSAgZXNzaWRbSVdfRVNTSURfTUFYX1NJWkVdID0gJ1wwJzsKKworCSAgLyogUHVzaCBpdCBvdXQgISAqLworCSAgd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKGVzc2lkKSArIDE7CisJICB3cnEtPnUuZGF0YS5mbGFncyA9IDE7IC8qIGFjdGl2ZSAqLworCSAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBlc3NpZCwgc2l6ZW9mKGVzc2lkKSkpCisJCSAgZXJyID0gLUVGQVVMVDsKKwl9CisgICAgICBicmVhazsKKworICAgICAgLyogU2V0IGRlc2lyZWQgbmV0d29yayBuYW1lIChFU1NJRCkgKi8KKyAgICBjYXNlIFNJT0NTSVdFU1NJRDoKKyAgICAgIC8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KKyAgICAgIGlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQorCXsKKwkgIGVyciA9IC1FQlVTWTsKKwkgIGJyZWFrOworCX0KKworCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKQorCXsKKwkgICAgY2hhcgljYXJkX2Vzc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CisJICAgIAorCSAgICAvKiBDaGVjayBpZiB3ZSBhc2tlZCBmb3IgYGFueScgKi8KKwkgICAgaWYod3JxLT51LmRhdGEuZmxhZ3MgPT0gMCkKKwkgICAgeworCQkvKiBDb3JleSA6IGNhbiB5b3UgZG8gdGhhdCA/ICovCisJCWVyciA9IC1FT1BOT1RTVVBQOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nICovCisJCWlmKHdycS0+dS5kYXRhLmxlbmd0aCA+CisJCSAgIElXX0VTU0lEX01BWF9TSVpFICsgMSkKKwkJeworCQkgICAgZXJyID0gLUUyQklHOworCQkgICAgYnJlYWs7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKGNhcmRfZXNzaWQsCisJCQkJICAgd3JxLT51LmRhdGEucG9pbnRlciwKKwkJCQkgICB3cnEtPnUuZGF0YS5sZW5ndGgpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJY2FyZF9lc3NpZFtJV19FU1NJRF9NQVhfU0laRV0gPSAnXDAnOworCisJCS8qIFNldCB0aGUgRVNTSUQgaW4gdGhlIGNhcmQgKi8KKwkJbWVtY3B5KGxvY2FsLT5zcGFybS5iNS5hX2N1cnJlbnRfZXNzX2lkLCBjYXJkX2Vzc2lkLAorCQkgICAgICAgSVdfRVNTSURfTUFYX1NJWkUpOworCSAgICB9CisJfQorCWJyZWFrOworCisgICAgICAvKiBHZXQgY3VycmVudCBBY2Nlc3MgUG9pbnQgKEJTU0lEIGluIG91ciBjYXNlKSAqLworICAgIGNhc2UgU0lPQ0dJV0FQOgorICAgICAgbWVtY3B5KHdycS0+dS5hcF9hZGRyLnNhX2RhdGEsIGxvY2FsLT5ic3NfaWQsIEVUSF9BTEVOKTsKKyAgICAgIHdycS0+dS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgYml0LXJhdGUgKi8KKyAgICBjYXNlIFNJT0NHSVdSQVRFOgorICAgICAgaWYobG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUgPT0gMykKKwl3cnEtPnUuYml0cmF0ZS52YWx1ZSA9IDIwMDAwMDA7CQkvKiBIdW0uLi4gKi8KKyAgICAgIGVsc2UKKwl3cnEtPnUuYml0cmF0ZS52YWx1ZSA9IGxvY2FsLT5uZXRfZGVmYXVsdF90eF9yYXRlICogNTAwMDAwOworICAgICAgd3JxLT51LmJpdHJhdGUuZml4ZWQgPSAwOwkJLyogV2UgYXJlIGluIGF1dG8gbW9kZSAqLworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFNldCB0aGUgZGVzaXJlZCBiaXQtcmF0ZSAqLworICAgIGNhc2UgU0lPQ1NJV1JBVEU6CisgICAgICAvKiBDaGVjayBpZiByYXRlIGlzIGluIHJhbmdlICovCisgICAgICBpZigod3JxLT51LmJpdHJhdGUudmFsdWUgIT0gMTAwMDAwMCkgJiYKKwkgKHdycS0+dS5iaXRyYXRlLnZhbHVlICE9IDIwMDAwMDApKQorCXsKKwkgIGVyciA9IC1FSU5WQUw7CisJICBicmVhazsKKwl9CisgICAgICAvKiBIYWNrIGZvciAxLjUgTWIvcyBpbnN0ZWFkIG9mIDIgTWIvcyAqLworICAgICAgaWYoKGxvY2FsLT5md192ZXIgPT0gMHg1NSkgJiYJCS8qIFBsZWFzZSBjaGVjayAqLworCSAod3JxLT51LmJpdHJhdGUudmFsdWUgPT0gMjAwMDAwMCkpCisJbG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUgPSAzOworICAgICAgZWxzZQorCWxvY2FsLT5uZXRfZGVmYXVsdF90eF9yYXRlID0gd3JxLT51LmJpdHJhdGUudmFsdWUvNTAwMDAwOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBSVFMgdGhyZXNob2xkICovCisgICAgY2FzZSBTSU9DR0lXUlRTOgorICAgICAgd3JxLT51LnJ0cy52YWx1ZSA9IChsb2NhbC0+c3Bhcm0uYjUuYV9ydHNfdGhyZXNob2xkWzBdIDw8IDgpCisJKyBsb2NhbC0+c3Bhcm0uYjUuYV9ydHNfdGhyZXNob2xkWzFdOworI2lmIFdJUkVMRVNTX0VYVCA+IDgKKyAgICAgIHdycS0+dS5ydHMuZGlzYWJsZWQgPSAod3JxLT51LnJ0cy52YWx1ZSA9PSAzMjc2Nyk7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLworICAgICAgd3JxLT51LnJ0cy5maXhlZCA9IDE7CisgICAgICBicmVhazsKKworICAgICAgLyogU2V0IHRoZSBkZXNpcmVkIFJUUyB0aHJlc2hvbGQgKi8KKyAgICBjYXNlIFNJT0NTSVdSVFM6CisgICAgeworCWludCBydGhyID0gd3JxLT51LnJ0cy52YWx1ZTsKKworICAgICAgLyogUmVqZWN0IGlmIGNhcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZCAqLworICAgICAgaWYobG9jYWwtPmNhcmRfc3RhdHVzICE9IENBUkRfQVdBSVRJTkdfUEFSQU0pCisJeworCSAgZXJyID0gLUVCVVNZOworCSAgYnJlYWs7CisJfQorCisJLyogaWYod3JxLT51LnJ0cy5maXhlZCA9PSAwKSB3ZSBzaG91bGQgY29tcGxhaW4gKi8KKyNpZiBXSVJFTEVTU19FWFQgPiA4CisJaWYod3JxLT51LnJ0cy5kaXNhYmxlZCkKKwkgICAgcnRociA9IDMyNzY3OworCWVsc2UKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisJICAgIGlmKChydGhyIDwgMCkgfHwgKHJ0aHIgPiAyMzQ3KSkgLyogV2hhdCdzIHRoZSBtYXggcGFja2V0IHNpemUgPz8/ICovCisJICAgIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJICAgIH0KKwlsb2NhbC0+c3Bhcm0uYjUuYV9ydHNfdGhyZXNob2xkWzBdID0gKHJ0aHIgPj4gOCkgJiAweEZGOworCWxvY2FsLT5zcGFybS5iNS5hX3J0c190aHJlc2hvbGRbMV0gPSBydGhyICYgMHhGRjsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCAqLworICAgIGNhc2UgU0lPQ0dJV0ZSQUc6CisgICAgICB3cnEtPnUuZnJhZy52YWx1ZSA9IChsb2NhbC0+c3Bhcm0uYjUuYV9mcmFnX3RocmVzaG9sZFswXSA8PCA4KQorCSsgbG9jYWwtPnNwYXJtLmI1LmFfZnJhZ190aHJlc2hvbGRbMV07CisjaWYgV0lSRUxFU1NfRVhUID4gOAorICAgICAgd3JxLT51LmZyYWcuZGlzYWJsZWQgPSAod3JxLT51LmZyYWcudmFsdWUgPT0gMzI3NjcpOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKyAgICAgIHdycS0+dS5mcmFnLmZpeGVkID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBTZXQgdGhlIGRlc2lyZWQgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgKi8KKyAgICBjYXNlIFNJT0NTSVdGUkFHOgorICAgIHsKKwlpbnQgZnRociA9IHdycS0+dS5mcmFnLnZhbHVlOworCisgICAgICAvKiBSZWplY3QgaWYgY2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkICovCisgICAgICBpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwl7CisJICBlcnIgPSAtRUJVU1k7CisJICBicmVhazsKKwl9CisKKwkvKiBpZih3cnEtPnUuZnJhZy5maXhlZCA9PSAwKSBzaG91bGQgY29tcGxhaW4gKi8KKyNpZiBXSVJFTEVTU19FWFQgPiA4CisJaWYod3JxLT51LmZyYWcuZGlzYWJsZWQpCisJICAgIGZ0aHIgPSAzMjc2NzsKKwllbHNlCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLworCSAgICBpZigoZnRociA8IDI1NikgfHwgKGZ0aHIgPiAyMzQ3KSkgLyogVG8gY2hlY2sgb3V0ICEgKi8KKwkgICAgeworCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKKwkgICAgfQorCWxvY2FsLT5zcGFybS5iNS5hX2ZyYWdfdGhyZXNob2xkWzBdID0gKGZ0aHIgPj4gOCkgJiAweEZGOworCWxvY2FsLT5zcGFybS5iNS5hX2ZyYWdfdGhyZXNob2xkWzFdID0gZnRociAmIDB4RkY7CisgICAgfQorICAgIGJyZWFrOworCisjZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gNyAqLworI2lmIFdJUkVMRVNTX0VYVCA+IDgKKworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IG1vZGUgb2Ygb3BlcmF0aW9uICovCisgICAgY2FzZSBTSU9DR0lXTU9ERToKKyAgICAgIGlmKGxvY2FsLT5zcGFybS5iNS5hX25ldHdvcmtfdHlwZSkKKwl3cnEtPnUubW9kZSA9IElXX01PREVfSU5GUkE7CisgICAgICBlbHNlCisJd3JxLT51Lm1vZGUgPSBJV19NT0RFX0FESE9DOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFNldCB0aGUgY3VycmVudCBtb2RlIG9mIG9wZXJhdGlvbiAqLworICAgIGNhc2UgU0lPQ1NJV01PREU6CisgICAgeworCWNoYXIgY2FyZF9tb2RlID0gMTsKKwkKKyAgICAgIC8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KKyAgICAgIGlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQorCXsKKwkgIGVyciA9IC1FQlVTWTsKKwkgIGJyZWFrOworCX0KKworCXN3aXRjaCAod3JxLT51Lm1vZGUpCisJeworCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkgICAgY2FyZF9tb2RlID0gMDsKKwkgICAgLy8gRmFsbCB0aHJvdWdoCisJY2FzZSBJV19NT0RFX0lORlJBOgorCSAgICBsb2NhbC0+c3Bhcm0uYjUuYV9uZXR3b3JrX3R5cGUgPSBjYXJkX21vZGU7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGVyciA9IC1FSU5WQUw7CisJfQorICAgIH0KKyAgICBicmVhazsKKworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKyNpZiBXSVJFTEVTU19FWFQgPiA3CisgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gSVdTUFkgU1VQUE9SVCAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qIERlZmluZSB0aGUgcmFuZ2UgKHZhcmlhdGlvbnMpIG9mIGFib3ZlIHBhcmFtZXRlcnMgKi8KKyAgICBjYXNlIFNJT0NHSVdSQU5HRToKKyAgICAgIC8qIEJhc2ljIGNoZWNraW5nLi4uICovCisgICAgICBpZih3cnEtPnUuZGF0YS5wb2ludGVyICE9IChjYWRkcl90KSAwKQorCXsKKwkgIHN0cnVjdCBpd19yYW5nZQlyYW5nZTsKKwkgIG1lbXNldCgoY2hhciAqKSAmcmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCSAgLyogU2V0IHRoZSBsZW5ndGggKHZlcnkgaW1wb3J0YW50IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSAqLworCSAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMAorCSAgLyogU2V0IHRoZSBXaXJlbGVzcyBFeHRlbnNpb24gdmVyc2lvbnMgKi8KKwkgIHJhbmdlLndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJICByYW5nZS53ZV92ZXJzaW9uX3NvdXJjZSA9IDk7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTAgKi8KKworCSAgLyogU2V0IGluZm9ybWF0aW9uIGluIHRoZSByYW5nZSBzdHJ1Y3QgKi8KKwkgIHJhbmdlLnRocm91Z2hwdXQgPSAxLjEgKiAxMDAwICogMTAwMDsJLyogUHV0IHRoZSByaWdodCBudW1iZXIgaGVyZSAqLworCSAgcmFuZ2UubnVtX2NoYW5uZWxzID0gaG9wX3BhdHRlcm5fbGVuZ3RoWyhpbnQpY291bnRyeV07IAorCSAgcmFuZ2UubnVtX2ZyZXF1ZW5jeSA9IDA7CisJICByYW5nZS5tYXhfcXVhbC5xdWFsID0gMDsKKwkgIHJhbmdlLm1heF9xdWFsLmxldmVsID0gMjU1OwkvKiBXaGF0J3MgdGhlIGNvcnJlY3QgdmFsdWUgPyAqLworCSAgcmFuZ2UubWF4X3F1YWwubm9pc2UgPSAyNTU7CS8qIElkZW0gKi8KKwkgIHJhbmdlLm51bV9iaXRyYXRlcyA9IDI7CisJICByYW5nZS5iaXRyYXRlWzBdID0gMTAwMDAwMDsJLyogMSBNYi9zICovCisJICByYW5nZS5iaXRyYXRlWzFdID0gMjAwMDAwMDsJLyogMiBNYi9zICovCisKKwkgIC8qIENvcHkgc3RydWN0dXJlIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCSAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZyYW5nZSwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpKQorCSAgICBlcnIgPSAtRUZBVUxUOworCX0KKyAgICAgIGJyZWFrOworCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgICAvKiBTZXQgYWRkcmVzc2VzIHRvIHNweSAqLworICAgIGNhc2UgU0lPQ1NJV1NQWToKKyAgICAgIC8qIENoZWNrIHRoZSBudW1iZXIgb2YgYWRkcmVzc2VzICovCisgICAgICBpZih3cnEtPnUuZGF0YS5sZW5ndGggPiBJV19NQVhfU1BZKQorCXsKKwkgIGVyciA9IC1FMkJJRzsKKwkgIGJyZWFrOworCX0KKyAgICAgIGxvY2FsLT5zcHlfbnVtYmVyID0gd3JxLT51LmRhdGEubGVuZ3RoOworCisgICAgICAvKiBJZiB0aGVyZSBpcyBzb21lIGFkZHJlc3NlcyB0byBjb3B5ICovCisgICAgICBpZihsb2NhbC0+c3B5X251bWJlciA+IDApCisJeworCSAgaW50CQkJaTsKKworCSAgLyogQ29weSBhZGRyZXNzZXMgdG8gdGhlIGRyaXZlciAqLworCSAgaWYoY29weV9mcm9tX3VzZXIoYWRkcmVzcywgd3JxLT51LmRhdGEucG9pbnRlciwKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIGxvY2FsLT5zcHlfbnVtYmVyKSkKKwkgICAgeworCSAgICAgIGVyciA9IC1FRkFVTFQ7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgLyogQ29weSBhZGRyZXNzZXMgdG8gdGhlIGxwIHN0cnVjdHVyZSAqLworCSAgZm9yKGkgPSAwOyBpIDwgbG9jYWwtPnNweV9udW1iZXI7IGkrKykKKwkgICAgbWVtY3B5KGxvY2FsLT5zcHlfYWRkcmVzc1tpXSwgYWRkcmVzc1tpXS5zYV9kYXRhLCBFVEhfQUxFTik7CisKKwkgIC8qIFJlc2V0IHN0cnVjdHVyZS4uLiAqLworCSAgbWVtc2V0KGxvY2FsLT5zcHlfc3RhdCwgMHgwMCwgc2l6ZW9mKGl3X3F1YWwpICogSVdfTUFYX1NQWSk7CisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisJICBwcmludGsoS0VSTl9ERUJVRyAiU2V0U3B5IC0gU2V0IG9mIG5ldyBhZGRyZXNzZXMgaXMgOlxuIik7CisJICBmb3IoaSA9IDA7IGkgPCBsb2NhbC0+c3B5X251bWJlcjsgaSsrKQorCSAgICBwcmludGsoS0VSTl9ERUJVRyAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJCSAgIGxvY2FsLT5zcHlfYWRkcmVzc1tpXVswXSwKKwkJICAgbG9jYWwtPnNweV9hZGRyZXNzW2ldWzFdLAorCQkgICBsb2NhbC0+c3B5X2FkZHJlc3NbaV1bMl0sCisJCSAgIGxvY2FsLT5zcHlfYWRkcmVzc1tpXVszXSwKKwkJICAgbG9jYWwtPnNweV9hZGRyZXNzW2ldWzRdLAorCQkgICBsb2NhbC0+c3B5X2FkZHJlc3NbaV1bNV0pOworI2VuZGlmCS8qIERFQlVHX0lPQ1RMX0lORk8gKi8KKwl9CisgICAgICBicmVhazsKKworICAgICAgLyogR2V0IHRoZSBzcHkgbGlzdCBhbmQgc3B5IHN0YXRzICovCisgICAgY2FzZSBTSU9DR0lXU1BZOgorICAgICAgLyogU2V0IHRoZSBudW1iZXIgb2YgYWRkcmVzc2VzICovCisgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBsb2NhbC0+c3B5X251bWJlcjsKKworICAgICAgLyogSWYgdGhlIHVzZXIgd2FudCB0byBoYXZlIHRoZSBhZGRyZXNzZXMgYmFjay4uLiAqLworICAgICAgaWYoKGxvY2FsLT5zcHlfbnVtYmVyID4gMCkgJiYgKHdycS0+dS5kYXRhLnBvaW50ZXIgIT0gKGNhZGRyX3QpIDApKQorCXsKKwkgIGludAkJCWk7CisKKwkgIC8qIENvcHkgYWRkcmVzc2VzIGZyb20gdGhlIGxwIHN0cnVjdHVyZSAqLworCSAgZm9yKGkgPSAwOyBpIDwgbG9jYWwtPnNweV9udW1iZXI7IGkrKykKKwkgICAgeworCSAgICAgIG1lbWNweShhZGRyZXNzW2ldLnNhX2RhdGEsIGxvY2FsLT5zcHlfYWRkcmVzc1tpXSwgRVRIX0FMRU4pOworCSAgICAgIGFkZHJlc3NbaV0uc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCSAgICB9CisKKwkgIC8qIENvcHkgYWRkcmVzc2VzIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCSAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIGFkZHJlc3MsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIGxvY2FsLT5zcHlfbnVtYmVyKSkKKwkgICAgeworCSAgICAgIGVyciA9IC1FRkFVTFQ7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgLyogQ29weSBzdGF0cyB0byB0aGUgdXNlciBidWZmZXIgKGp1c3QgYWZ0ZXIpICovCisJICBpZihjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciArCisJCSAgICAgICAoc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiBsb2NhbC0+c3B5X251bWJlciksCisJCSAgICAgICBsb2NhbC0+c3B5X3N0YXQsIHNpemVvZihpd19xdWFsKSAqIGxvY2FsLT5zcHlfbnVtYmVyKSkKKwkgICAgeworCSAgICAgIGVyciA9IC1FRkFVTFQ7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgLyogUmVzZXQgdXBkYXRlZCBmbGFncyAqLworCSAgZm9yKGkgPSAwOyBpIDwgbG9jYWwtPnNweV9udW1iZXI7IGkrKykKKwkgICAgbG9jYWwtPnNweV9zdGF0W2ldLnVwZGF0ZWQgPSAweDA7CisJfQkvKiBpZihwb2ludGVyICE9IE5VTEwpICovCisKKyAgICAgIGJyZWFrOworI2VuZGlmCS8qIFdJUkVMRVNTX1NQWSAqLworCisgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gUFJJVkFURSBJT0NUTCAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZm5kZWYgU0lPQ0lXRklSU1RQUklWCisjZGVmaW5lIFNJT0NJV0ZJUlNUUFJJVglTSU9DREVWUFJJVkFURQorI2VuZGlmIC8qIFNJT0NJV0ZJUlNUUFJJViAqLworI2RlZmluZSBTSU9DU0lQRlJBTUlORwlTSU9DSVdGSVJTVFBSSVYJCS8qIFNldCBmcmFtaW5nIG1vZGUgKi8KKyNkZWZpbmUgU0lPQ0dJUEZSQU1JTkcJU0lPQ0lXRklSU1RQUklWICsgMQkvKiBHZXQgZnJhbWluZyBtb2RlICovCisjZGVmaW5lIFNJT0NHSVBDT1VOVFJZCVNJT0NJV0ZJUlNUUFJJViArIDMJLyogR2V0IGNvdW50cnkgY29kZSAqLworICAgIGNhc2UgU0lPQ1NJUEZSQU1JTkc6CisgICAgICBpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkJLyogRm9yIHByaXZhdGUgSU9DVExzLCB3ZSBuZWVkIHRvIGNoZWNrIHBlcm1pc3Npb25zICovCisJeworCSAgZXJyID0gLUVQRVJNOworCSAgYnJlYWs7CisJfQorICAgICAgdHJhbnNsYXRlID0gKih3cnEtPnUubmFtZSk7CS8qIFNldCBmcmFtaW5nIG1vZGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0lPQ0dJUEZSQU1JTkc6CisgICAgICAqKHdycS0+dS5uYW1lKSA9IHRyYW5zbGF0ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0lPQ0dJUENPVU5UUlk6CisgICAgICAqKHdycS0+dS5uYW1lKSA9IGNvdW50cnk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNJT0NHSVdQUklWOgorICAgICAgLyogRXhwb3J0IG91ciAicHJpdmF0ZSIgaW50ZXJjYWNlICovCisgICAgICBpZih3cnEtPnUuZGF0YS5wb2ludGVyICE9IChjYWRkcl90KSAwKQorCXsKKwkgIHN0cnVjdCBpd19wcml2X2FyZ3MJcHJpdltdID0KKwkgIHsJLyogY21kLAkJc2V0X2FyZ3MsCWdldF9hcmdzLAluYW1lICovCisJICAgIHsgU0lPQ1NJUEZSQU1JTkcsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9mcmFtaW5nIiB9LAorCSAgICB7IFNJT0NHSVBGUkFNSU5HLCAwLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRfZnJhbWluZyIgfSwKKwkgICAgeyBTSU9DR0lQQ09VTlRSWSwgMCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0X2NvdW50cnkiIH0sCisJICB9OworCSAgLyogU2V0IHRoZSBudW1iZXIgb2YgaW9jdGwgYXZhaWxhYmxlICovCisJICB3cnEtPnUuZGF0YS5sZW5ndGggPSAzOworCSAgLyogQ29weSBzdHJ1Y3R1cmUgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJICBpZihjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgKHVfY2hhciAqKSBwcml2LAorCQkgICAgICAgc2l6ZW9mKHByaXYpKSkKKwkgICAgZXJyID0gLUVGQVVMVDsKKwl9CisgICAgICBicmVhazsKKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA3ICovCisKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREVCVUcoMCwicmF5X2Rldl9pb2N0bCBjbWQgPSAweCV4XG4iLCBjbWQpOworICAgICAgICAgICAgZXJyID0gLUVPUE5PVFNVUFA7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9IC8qIGVuZCByYXlfZGV2X2lvY3RsICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaWYgV0lSRUxFU1NfRVhUID4gNwkvKiBJZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3QgaW4gdGhlIGtlcm5lbCAqLworc3RhdGljIGl3X3N0YXRzICogcmF5X2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgcmF5X2Rldl90ICoJbG9jYWwgPSAocmF5X2Rldl90ICopIGRldi0+cHJpdjsKKyAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgIHN0cnVjdCBzdGF0dXMgX19pb21lbSAqcCA9IGxvY2FsLT5zcmFtICsgU1RBVFVTX0JBU0U7CisKKyAgaWYobG9jYWwgPT0gKHJheV9kZXZfdCAqKSBOVUxMKQorICAgIHJldHVybiAoaXdfc3RhdHMgKikgTlVMTDsKKworICBsb2NhbC0+d3N0YXRzLnN0YXR1cyA9IGxvY2FsLT5jYXJkX3N0YXR1czsKKyNpZmRlZiBXSVJFTEVTU19TUFkKKyAgaWYoKGxvY2FsLT5zcHlfbnVtYmVyID4gMCkgJiYgKGxvY2FsLT5zcGFybS5iNS5hX25ldHdvcmtfdHlwZSA9PSAwKSkKKyAgICB7CisgICAgICAvKiBHZXQgaXQgZnJvbSB0aGUgZmlyc3Qgbm9kZSBpbiBzcHkgbGlzdCAqLworICAgICAgbG9jYWwtPndzdGF0cy5xdWFsLnF1YWwgPSBsb2NhbC0+c3B5X3N0YXRbMF0ucXVhbDsKKyAgICAgIGxvY2FsLT53c3RhdHMucXVhbC5sZXZlbCA9IGxvY2FsLT5zcHlfc3RhdFswXS5sZXZlbDsKKyAgICAgIGxvY2FsLT53c3RhdHMucXVhbC5ub2lzZSA9IGxvY2FsLT5zcHlfc3RhdFswXS5ub2lzZTsKKyAgICAgIGxvY2FsLT53c3RhdHMucXVhbC51cGRhdGVkID0gbG9jYWwtPnNweV9zdGF0WzBdLnVwZGF0ZWQ7CisgICAgfQorI2VuZGlmIC8qIFdJUkVMRVNTX1NQWSAqLworCisgIGlmKChsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgIGxvY2FsLT53c3RhdHMucXVhbC5ub2lzZSA9IHJlYWRiKCZwLT5yeG5vaXNlKTsKKyAgICBsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCB8PSA0OworICB9CisKKyAgcmV0dXJuICZsb2NhbC0+d3N0YXRzOworfSAvKiBlbmQgcmF5X2dldF93aXJlbGVzc19zdGF0cyAqLworI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDcgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgcmF5X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIAorICAgIERFQlVHKDEsICJyYXlfb3BlbignJXMnKVxuIiwgZGV2LT5uYW1lKTsKKworICAgIGZvciAobGluayA9IGRldl9saXN0OyBsaW5rOyBsaW5rID0gbGluay0+bmV4dCkKKyAgICAgICAgaWYgKGxpbmstPnByaXYgPT0gZGV2KSBicmVhazsKKyAgICBpZiAoIURFVl9PSyhsaW5rKSkgeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBpZiAobGluay0+b3BlbiA9PSAwKSBsb2NhbC0+bnVtX211bHRpID0gMDsKKyAgICBsaW5rLT5vcGVuKys7CisKKyAgICAvKiBJZiB0aGUgY2FyZCBpcyBub3Qgc3RhcnRlZCwgdGltZSB0byBzdGFydCBpdCAhIC0gSmVhbiBJSSAqLworICAgIGlmKGxvY2FsLT5jYXJkX3N0YXR1cyA9PSBDQVJEX0FXQUlUSU5HX1BBUkFNKSB7CisJaW50IGk7CisKKwlERUJVRygxLCJyYXlfb3BlbjogZG9pbmcgaW5pdCBub3cgIVxuIik7CisKKwkvKiBEb3dubG9hZCBzdGFydHVwIHBhcmFtZXRlcnMgKi8KKwlpZiAoIChpID0gZGxfc3RhcnR1cF9wYXJhbXMoZGV2KSkgPCAwKQorCSAgeworCSAgICBwcmludGsoS0VSTl9JTkZPICJyYXlfZGV2X2luaXQgZGxfc3RhcnR1cF9wYXJhbXMgZmFpbGVkIC0gIgorCQkgICAicmV0dXJucyAweCV4XG4iLGkpOworCSAgICByZXR1cm4gLTE7CisJICB9CisgICAgIH0KKworICAgIGlmIChzbmlmZmVyKSBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgZWxzZSAgICAgICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKyAgICBERUJVRygyLCJyYXlfb3BlbiBlbmRpbmdcbiIpOworICAgIHJldHVybiAwOworfSAvKiBlbmQgcmF5X29wZW4gKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgcmF5X2Rldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGRldl9saW5rX3QgKmxpbms7CisKKyAgICBERUJVRygxLCAicmF5X2Rldl9jbG9zZSgnJXMnKVxuIiwgZGV2LT5uYW1lKTsKKworICAgIGZvciAobGluayA9IGRldl9saXN0OyBsaW5rOyBsaW5rID0gbGluay0+bmV4dCkKKyAgICAgICAgaWYgKGxpbmstPnByaXYgPT0gZGV2KSBicmVhazsKKyAgICBpZiAobGluayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLUVOT0RFVjsKKworICAgIGxpbmstPm9wZW4tLTsKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICAvKiBJbiBoZXJlLCB3ZSBzaG91bGQgc3RvcCB0aGUgaGFyZHdhcmUgKHN0b3AgY2FyZCBmcm9tIGJlZWluZyBhY3RpdmUpCisgICAgICogYW5kIHNldCBsb2NhbC0+Y2FyZF9zdGF0dXMgdG8gQ0FSRF9BV0FJVElOR19QQVJBTSwgc28gdGhhdCB3aGlsZSB0aGUKKyAgICAgKiBjYXJkIGlzIGNsb3NlZCB3ZSBjYW4gY2hhZ2UgaXRzIGNvbmZpZ3VyYXRpb24uCisgICAgICogUHJvYmFibHkgYWxzbyBuZWVkIGEgQ09SIHJlc2V0IHRvIGdldCBzYW5lIHN0YXRlIC0gSmVhbiBJSSAqLworCisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCByYXlfZGV2X2Nsb3NlICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByYXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworICAgIERFQlVHKDEsInJheV9yZXNldCBlbnRlcmVkXG4iKTsKKyAgICByZXR1cm47Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBDYXVzZSBhIGZpcm13YXJlIGludGVycnVwdCBpZiBpdCBpcyByZWFkeSBmb3Igb25lICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gbm9uemVybyBpZiBub3QgcmVhZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMgaW50IGludGVycnVwdF9lY2YocmF5X2Rldl90ICpsb2NhbCwgaW50IGNjcykKK3sKKyAgICBpbnQgaSA9IDUwOworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIGludGVycnVwdF9lY2YgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIERFQlVHKDIsImludGVycnVwdF9lY2YobG9jYWw9JXAsIGNjcyA9IDB4JXhcbiIsbG9jYWwsY2NzKTsKKworICAgIHdoaWxlICggaSAmJiAKKyAgICAgICAgICAgIChyZWFkYihsb2NhbC0+YW1lbSArIENJU19PRkZTRVQgKyBFQ0ZfSU5UUl9PRkZTRVQpICYgRUNGX0lOVFJfU0VUKSkKKyAgICAgICAgaS0tOworICAgIGlmIChpID09IDApIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIGludGVycnVwdF9lY2YgY2FyZCBub3QgcmVhZHkgZm9yIGludGVycnVwdFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisJLyogRmlsbCB0aGUgbWFpbGJveCwgdGhlbiBraWNrIHRoZSBjYXJkICovCisgICAgd3JpdGViKGNjcywgbG9jYWwtPnNyYW0gKyBTQ0JfQkFTRSk7CisgICAgd3JpdGViKEVDRl9JTlRSX1NFVCwgbG9jYWwtPmFtZW0gKyBDSVNfT0ZGU0VUICsgRUNGX0lOVFJfT0ZGU0VUKTsKKyAgICByZXR1cm4gMDsKK30gLyogaW50ZXJydXB0X2VjZiAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogR2V0IG5leHQgZnJlZSB0cmFuc21pdCBDQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIC0gaW5kZXggb2YgY3VycmVudCB0eCBjY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCBnZXRfZnJlZV90eF9jY3MocmF5X2Rldl90ICpsb2NhbCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgY2NzIF9faW9tZW0gKnBjY3MgPSBjY3NfYmFzZShsb2NhbCk7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfY3MgZ2V0X2ZyZWVfdHhfY2NzIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIEVDQVJER09ORTsKKyAgICB9CisKKyAgICBpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCZsb2NhbC0+dHhfY2NzX2xvY2spKSB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyB0eF9jY3NfbG9jayBidXN5XG4iKTsKKyAgICAgICAgcmV0dXJuIEVDQ1NCVVNZOworICAgIH0gCisKKyAgICBmb3IgKGk9MDsgaSA8IE5VTUJFUl9PRl9UWF9DQ1M7IGkrKykgeworICAgICAgICBpZiAocmVhZGIoJihwY2NzK2kpLT5idWZmZXJfc3RhdHVzKSA9PSBDQ1NfQlVGRkVSX0ZSRUUpIHsKKyAgICAgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0JVU1ksICYocGNjcytpKS0+YnVmZmVyX3N0YXR1cyk7CisgICAgICAgICAgICB3cml0ZWIoQ0NTX0VORF9MSVNULCAmKHBjY3MraSktPmxpbmspOworCQkJbG9jYWwtPnR4X2Njc19sb2NrID0gMDsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorCWxvY2FsLT50eF9jY3NfbG9jayA9IDA7CisgICAgREVCVUcoMiwicmF5X2NzIEVSUk9SIG5vIGZyZWUgdHggQ0NTIGZvciByYXlsaW5rIGNhcmRcbiIpOworICAgIHJldHVybiBFQ0NTRlVMTDsKK30gLyogZ2V0X2ZyZWVfdHhfY2NzICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBHZXQgbmV4dCBmcmVlIENDUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gLSBpbmRleCBvZiBjdXJyZW50IGNjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMgaW50IGdldF9mcmVlX2NjcyhyYXlfZGV2X3QgKmxvY2FsKQoreworICAgIGludCBpOworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjcyA9IGNjc19iYXNlKGxvY2FsKTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBnZXRfZnJlZV9jY3MgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm4gRUNBUkRHT05FOworICAgIH0KKyAgICBpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCZsb2NhbC0+Y2NzX2xvY2spKSB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyBjY3NfbG9jayBidXN5XG4iKTsKKyAgICAgICAgcmV0dXJuIEVDQ1NCVVNZOworICAgIH0gCisKKyAgICBmb3IgKGkgPSBOVU1CRVJfT0ZfVFhfQ0NTOyBpIDwgTlVNQkVSX09GX0NDUzsgaSsrKSB7CisgICAgICAgIGlmIChyZWFkYigmKHBjY3MraSktPmJ1ZmZlcl9zdGF0dXMpID09IENDU19CVUZGRVJfRlJFRSkgeworICAgICAgICAgICAgd3JpdGViKENDU19CVUZGRVJfQlVTWSwgJihwY2NzK2kpLT5idWZmZXJfc3RhdHVzKTsKKyAgICAgICAgICAgIHdyaXRlYihDQ1NfRU5EX0xJU1QsICYocGNjcytpKS0+bGluayk7CisJCQlsb2NhbC0+Y2NzX2xvY2sgPSAwOworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisJbG9jYWwtPmNjc19sb2NrID0gMDsKKyAgICBERUJVRygxLCJyYXlfY3MgRVJST1Igbm8gZnJlZSBDQ1MgZm9yIHJheWxpbmsgY2FyZFxuIik7CisgICAgcmV0dXJuIEVDQ1NGVUxMOworfSAvKiBnZXRfZnJlZV9jY3MgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIGF1dGhlbnRpY2F0ZV90aW1lb3V0KHVfbG9uZyBkYXRhKQoreworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGF0YTsKKyAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAicmF5X2NzIEF1dGhlbnRpY2F0aW9uIHdpdGggYWNjZXNzIHBvaW50IGZhaWxlZCIKKyAgICAgICAiIC0gdGltZW91dFxuIik7CisgICAgam9pbl9uZXQoKHVfbG9uZylsb2NhbCk7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IGFzY190b19pbnQoY2hhciBhKQoreworICAgIGlmIChhIDwgJzAnKSByZXR1cm4gLTE7CisgICAgaWYgKGEgPD0gJzknKSByZXR1cm4gKGEgLSAnMCcpOworICAgIGlmIChhIDwgJ0EnKSByZXR1cm4gLTE7CisgICAgaWYgKGEgPD0gJ0YnKSByZXR1cm4gKDEwICsgYSAtICdBJyk7CisgICAgaWYgKGEgPCAnYScpIHJldHVybiAtMTsKKyAgICBpZiAoYSA8PSAnZicpIHJldHVybiAoMTAgKyBhIC0gJ2EnKTsKKyAgICByZXR1cm4gLTE7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHBhcnNlX2FkZHIoY2hhciAqaW5fc3RyLCBVQ0hBUiAqb3V0KQoreworICAgIGludCBsZW47CisgICAgaW50IGksaixrOworICAgIGludCBzdGF0dXM7CisgICAgCisgICAgaWYgKGluX3N0ciA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICBpZiAoKGxlbiA9IHN0cmxlbihpbl9zdHIpKSA8IDIpIHJldHVybiAwOworICAgIG1lbXNldChvdXQsIDAsIEFERFJMRU4pOworCisgICAgc3RhdHVzID0gMTsKKyAgICBqID0gbGVuIC0gMTsKKyAgICBpZiAoaiA+IDEyKSBqID0gMTI7CisgICAgaSA9IDU7CisgICAgCisgICAgd2hpbGUgKGogPiAwKQorICAgIHsKKyAgICAgICAgaWYgKChrID0gYXNjX3RvX2ludChpbl9zdHJbai0tXSkpICE9IC0xKSBvdXRbaV0gPSBrOworICAgICAgICBlbHNlIHJldHVybiAwOworCisgICAgICAgIGlmIChqID09IDApIGJyZWFrOworICAgICAgICBpZiAoKGsgPSBhc2NfdG9faW50KGluX3N0cltqLS1dKSkgIT0gLTEpIG91dFtpXSArPSBrIDw8IDQ7CisgICAgICAgIGVsc2UgcmV0dXJuIDA7CisgICAgICAgIGlmICghaS0tKSBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcmF5X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICAgIHN0cnVjdCBzdGF0dXMgX19pb21lbSAqcCA9IGxvY2FsLT5zcmFtICsgU1RBVFVTX0JBU0U7CisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIG5ldF9kZXZpY2Vfc3RhdHMgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm4gJmxvY2FsLT5zdGF0czsKKyAgICB9CisgICAgaWYgKHJlYWRiKCZwLT5tcnhfb3ZlcmZsb3dfZm9yX2hvc3QpKQorICAgIHsKKyAgICAgICAgbG9jYWwtPnN0YXRzLnJ4X292ZXJfZXJyb3JzICs9IG50b2hzKHJlYWRiKCZwLT5tcnhfb3ZlcmZsb3cpKTsKKyAgICAgICAgd3JpdGViKDAsJnAtPm1yeF9vdmVyZmxvdyk7CisgICAgICAgIHdyaXRlYigwLCZwLT5tcnhfb3ZlcmZsb3dfZm9yX2hvc3QpOworICAgIH0KKyAgICBpZiAocmVhZGIoJnAtPm1yeF9jaGVja3N1bV9lcnJvcl9mb3JfaG9zdCkpCisgICAgeworICAgICAgICBsb2NhbC0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSBudG9ocyhyZWFkYigmcC0+bXJ4X2NoZWNrc3VtX2Vycm9yKSk7CisgICAgICAgIHdyaXRlYigwLCZwLT5tcnhfY2hlY2tzdW1fZXJyb3IpOworICAgICAgICB3cml0ZWIoMCwmcC0+bXJ4X2NoZWNrc3VtX2Vycm9yX2Zvcl9ob3N0KTsKKyAgICB9CisgICAgaWYgKHJlYWRiKCZwLT5yeF9oZWNfZXJyb3JfZm9yX2hvc3QpKQorICAgIHsKKyAgICAgICAgbG9jYWwtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPSBudG9ocyhyZWFkYigmcC0+cnhfaGVjX2Vycm9yKSk7CisgICAgICAgIHdyaXRlYigwLCZwLT5yeF9oZWNfZXJyb3IpOworICAgICAgICB3cml0ZWIoMCwmcC0+cnhfaGVjX2Vycm9yX2Zvcl9ob3N0KTsKKyAgICB9CisgICAgcmV0dXJuICZsb2NhbC0+c3RhdHM7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByYXlfdXBkYXRlX3Bhcm0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgVUNIQVIgb2JqaWQsIFVDSEFSICp2YWx1ZSwgaW50IGxlbikKK3sKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKyAgICBpbnQgY2NzaW5kZXg7CisgICAgaW50IGk7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzOworCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X3VwZGF0ZV9wYXJtIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgoY2NzaW5kZXggPSBnZXRfZnJlZV9jY3MobG9jYWwpKSA8IDApCisgICAgeworICAgICAgICBERUJVRygwLCJyYXlfdXBkYXRlX3Bhcm0gLSBObyBmcmVlIGNjc1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcGNjcyA9IGNjc19iYXNlKGxvY2FsKSArIGNjc2luZGV4OworICAgIHdyaXRlYihDQ1NfVVBEQVRFX1BBUkFNUywgJnBjY3MtPmNtZCk7CisgICAgd3JpdGViKG9iamlkLCAmcGNjcy0+dmFyLnVwZGF0ZV9wYXJhbS5vYmplY3RfaWQpOworICAgIHdyaXRlYigxLCAmcGNjcy0+dmFyLnVwZGF0ZV9wYXJhbS5udW1iZXJfb2JqZWN0cyk7CisgICAgd3JpdGViKDAsICZwY2NzLT52YXIudXBkYXRlX3BhcmFtLmZhaWx1cmVfY2F1c2UpOworICAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisgICAgICAgIHdyaXRlYih2YWx1ZVtpXSwgbG9jYWwtPnNyYW0gKyBIT1NUX1RPX0VDRl9CQVNFKTsKKyAgICB9CisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygwLCJyYXlfY3MgYXNzb2NpYXRlIGZhaWxlZCAtIEVDRiBub3QgcmVhZHkgZm9yIGludHJcbiIpOworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmKHBjY3MrKyktPmJ1ZmZlcl9zdGF0dXMpOworICAgIH0KK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIHJheV91cGRhdGVfbXVsdGlfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWxsKQoreworICAgIHN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pLCAqKmRtaXA7CisgICAgaW50IGNjc2luZGV4OworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKyAgICBpbnQgaSA9IDA7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgdm9pZCBfX2lvbWVtICpwID0gbG9jYWwtPnNyYW0gKyBIT1NUX1RPX0VDRl9CQVNFOworCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X3VwZGF0ZV9tdWx0aV9saXN0IC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIAorICAgICAgICBERUJVRygyLCJyYXlfdXBkYXRlX211bHRpX2xpc3QoJXApXG4iLGRldik7CisgICAgaWYgKChjY3NpbmRleCA9IGdldF9mcmVlX2Njcyhsb2NhbCkpIDwgMCkKKyAgICB7CisgICAgICAgIERFQlVHKDEsInJheV91cGRhdGVfbXVsdGkgLSBObyBmcmVlIGNjc1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcGNjcyA9IGNjc19iYXNlKGxvY2FsKSArIGNjc2luZGV4OworICAgIHdyaXRlYihDQ1NfVVBEQVRFX01VTFRJQ0FTVF9MSVNULCAmcGNjcy0+Y21kKTsKKworICAgIGlmIChhbGwpIHsKKyAgICAgICAgd3JpdGViKDB4ZmYsICZwY2NzLT52YXIpOworICAgICAgICBsb2NhbC0+bnVtX211bHRpID0gMHhmZjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIENvcHkgdGhlIGtlcm5lbCdzIGxpc3Qgb2YgTUMgYWRkcmVzc2VzIHRvIGNhcmQgKi8KKyAgICAgICAgZm9yIChkbWlwPSZkZXYtPm1jX2xpc3Q7IChkbWk9KmRtaXApIT1OVUxMOyBkbWlwPSZkbWktPm5leHQpIHsKKyAgICAgICAgICAgIG1lbWNweV90b2lvKHAsIGRtaS0+ZG1pX2FkZHIsIEVUSF9BTEVOKTsKKyAgICAgICAgICAgIERFQlVHKDEsInJheV91cGRhdGVfbXVsdGkgYWRkIGFkZHIgJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLGRtaS0+ZG1pX2FkZHJbMF0sZG1pLT5kbWlfYWRkclsxXSxkbWktPmRtaV9hZGRyWzJdLGRtaS0+ZG1pX2FkZHJbM10sZG1pLT5kbWlfYWRkcls0XSxkbWktPmRtaV9hZGRyWzVdKTsKKyAgICAgICAgICAgIHAgKz0gRVRIX0FMRU47CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPiAyNTYvQUREUkxFTikgaSA9IDI1Ni9BRERSTEVOOworICAgICAgICB3cml0ZWIoKFVDSEFSKWksICZwY2NzLT52YXIpOworICAgICAgICBERUJVRygxLCJyYXlfY3MgdXBkYXRlX211bHRpICVkIGFkZHJlc3NlcyBpbiBsaXN0XG4iLCBpKTsKKyAgICAgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgICAgIGxvY2FsLT5udW1fbXVsdGkgPSBpOworICAgIH0KKyAgICBpZiAoaW50ZXJydXB0X2VjZihsb2NhbCwgY2NzaW5kZXgpKSB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyB1cGRhdGVfbXVsdGkgZmFpbGVkIC0gRUNGIG5vdCByZWFkeSBmb3IgaW50clxuIik7CisgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0ZSRUUsICYocGNjcysrKS0+YnVmZmVyX3N0YXR1cyk7CisgICAgfQorfSAvKiBlbmQgcmF5X3VwZGF0ZV9tdWx0aV9saXN0ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKyAgICBVQ0hBUiBwcm9taXNjOworCisgICAgREVCVUcoMiwicmF5X2NzIHNldF9tdWx0aWNhc3RfbGlzdCglcClcbiIsZGV2KTsKKworICAgIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisgICAgeworICAgICAgICBpZiAobG9jYWwtPnNwYXJtLmI1LmFfcHJvbWlzY3VvdXNfbW9kZSA9PSAwKSB7CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3Mgc2V0X211bHRpY2FzdF9saXN0IHByb21pc2Mgb25cbiIpOworICAgICAgICAgICAgbG9jYWwtPnNwYXJtLmI1LmFfcHJvbWlzY3VvdXNfbW9kZSA9IDE7CisgICAgICAgICAgICBwcm9taXNjID0gMTsKKyAgICAgICAgICAgIHJheV91cGRhdGVfcGFybShkZXYsICBPQkpJRF9wcm9taXNjdW91c19tb2RlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb21pc2MsIHNpemVvZihwcm9taXNjKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChsb2NhbC0+c3Bhcm0uYjUuYV9wcm9taXNjdW91c19tb2RlID09IDEpIHsKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBzZXRfbXVsdGljYXN0X2xpc3QgcHJvbWlzYyBvZmZcbiIpOworICAgICAgICAgICAgbG9jYWwtPnNwYXJtLmI1LmFfcHJvbWlzY3VvdXNfbW9kZSA9IDA7CisgICAgICAgICAgICBwcm9taXNjID0gMDsKKyAgICAgICAgICAgIHJheV91cGRhdGVfcGFybShkZXYsICBPQkpJRF9wcm9taXNjdW91c19tb2RlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb21pc2MsIHNpemVvZihwcm9taXNjKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgcmF5X3VwZGF0ZV9tdWx0aV9saXN0KGRldiwgMSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGxvY2FsLT5udW1fbXVsdGkgIT0gZGV2LT5tY19jb3VudCkgcmF5X3VwZGF0ZV9tdWx0aV9saXN0KGRldiwgMCk7CisgICAgfQorfSAvKiBlbmQgc2V0X211bHRpY2FzdF9saXN0ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBBbGwgcm91dGluZXMgYmVsb3cgaGVyZSBhcmUgcnVuIGF0IGludGVycnVwdCB0aW1lLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGlycXJldHVybl90IHJheV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHJheV9kZXZfdCAqbG9jYWw7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzOworICAgIHN0cnVjdCByY3MgX19pb21lbSAqcHJjczsKKyAgICBVQ0hBUiByY3NpbmRleDsKKyAgICBVQ0hBUiB0bXA7CisgICAgVUNIQVIgY21kOworICAgIFVDSEFSIHN0YXR1czsKKworICAgIGlmIChkZXYgPT0gTlVMTCkgLyogTm90ZSB0aGF0IHdlIHdhbnQgaW50ZXJydXB0cyB3aXRoIGRldi0+c3RhcnQgPT0gMCAqLworCXJldHVybiBJUlFfTk9ORTsKKworICAgIERFQlVHKDQsInJheV9jczogaW50ZXJydXB0IGZvciAqZGV2PSVwXG4iLGRldik7CisKKyAgICBsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgbGluayA9IChkZXZfbGlua190ICopbG9jYWwtPmZpbmRlcjsKKyAgICBpZiAoICEgKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpIHx8IGxpbmstPnN0YXRlICYgREVWX1NVU1BFTkQgKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBpbnRlcnJ1cHQgZnJvbSBkZXZpY2Ugbm90IHByZXNlbnQgb3Igc3VzcGVuZGVkLlxuIik7CisgICAgICAgIHJldHVybiBJUlFfTk9ORTsKKyAgICB9CisgICAgcmNzaW5kZXggPSByZWFkYigmKChzdHJ1Y3Qgc2NiIF9faW9tZW0gKikobG9jYWwtPnNyYW0pKS0+cmNzX2luZGV4KTsKKworICAgIGlmIChyY3NpbmRleCA+PSAoTlVNQkVSX09GX0NDUyArIE5VTUJFUl9PRl9SQ1MpKQorICAgIHsKKyAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCBiYWQgcmNzaW5kZXggPSAweCV4XG4iLHJjc2luZGV4KTsKKyAgICAgICAgY2xlYXJfaW50ZXJydXB0KGxvY2FsKTsKKyAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworICAgIH0KKyAgICBpZiAocmNzaW5kZXggPCBOVU1CRVJfT0ZfQ0NTKSAvKiBJZiBpdCdzIGEgcmV0dXJuZWQgQ0NTICovCisgICAgeworICAgICAgICBwY2NzID0gY2NzX2Jhc2UobG9jYWwpICsgcmNzaW5kZXg7CisgICAgICAgIGNtZCA9IHJlYWRiKCZwY2NzLT5jbWQpOworICAgICAgICBzdGF0dXMgPSByZWFkYigmcGNjcy0+YnVmZmVyX3N0YXR1cyk7CisgICAgICAgIHN3aXRjaCAoY21kKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQ0NTX0RPV05MT0FEX1NUQVJUVVBfUEFSQU1TOiAvKiBIYXBwZW5zIGluIGZpcm13YXJlIHNvbWVkYXkgKi8KKyAgICAgICAgICAgIGRlbF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ0NTX0NPTU1BTkRfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IGRvd25sb2FkX3N0YXJ0dXBfcGFyYW1ldGVycyBPS1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IGRvd25sb2FkX3N0YXJ0dXBfcGFyYW1ldGVycyBmYWlsXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19VUERBVEVfUEFSQU1TOgorICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCB1cGRhdGUgcGFyYW1zIGRvbmVcbiIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDQ1NfQ09NTUFORF9DT01QTEVURSkgeworICAgICAgICAgICAgICAgIHRtcCA9IHJlYWRiKCZwY2NzLT52YXIudXBkYXRlX3BhcmFtLmZhaWx1cmVfY2F1c2UpOworICAgICAgICAgICAgREVCVUcoMCwicmF5X2NzIGludGVycnVwdCB1cGRhdGUgcGFyYW1zIGZhaWxlZCAtIHJlYXNvbiAlZFxuIix0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0NTX1JFUE9SVF9QQVJBTVM6CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IHJlcG9ydCBwYXJhbXMgZG9uZVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfVVBEQVRFX01VTFRJQ0FTVF9MSVNUOiAvKiBOb3RlIHRoYXQgdGhpcyBDQ1MgaXNuJ3QgcmV0dXJuZWQgKi8KKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgQ0NTIFVwZGF0ZSBNdWx0aWNhc3QgTGlzdCBkb25lXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19VUERBVEVfUE9XRVJfU0FWSU5HU19NT0RFOgorICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCB1cGRhdGUgcG93ZXIgc2F2ZSBtb2RlIGRvbmVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0NTX1NUQVJUX05FVFdPUks6CisgICAgICAgIGNhc2UgQ0NTX0pPSU5fTkVUV09SSzoKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ0NTX0NPTU1BTkRfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVhZGIoJnBjY3MtPnZhci5zdGFydF9uZXR3b3JrLm5ldF9pbml0aWF0ZWQpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoMCwicmF5X2NzIGludGVycnVwdCBuZXR3b3JrIFwiJXNcIiBzdGFydGVkXG4iLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfY3VycmVudF9lc3NfaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoMCwicmF5X2NzIGludGVycnVwdCBuZXR3b3JrIFwiJXNcIiBqb2luZWRcbiIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC0+c3Bhcm0uYjQuYV9jdXJyZW50X2Vzc19pZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbWNweV9mcm9taW8oJmxvY2FsLT5ic3NfaWQscGNjcy0+dmFyLnN0YXJ0X25ldHdvcmsuYnNzaWQsQUREUkxFTik7CisKKyAgICAgICAgICAgICAgICBpZiAobG9jYWwtPmZ3X3ZlciA9PSAweDU1KSBsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSA9IDM7CisgICAgICAgICAgICAgICAgZWxzZSBsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRiKCZwY2NzLT52YXIuc3RhcnRfbmV0d29yay5uZXRfZGVmYXVsdF90eF9yYXRlKTsKKyAgICAgICAgICAgICAgICBsb2NhbC0+ZW5jcnlwdGlvbiA9IHJlYWRiKCZwY2NzLT52YXIuc3RhcnRfbmV0d29yay5lbmNyeXB0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNuaWZmZXIgJiYgKGxvY2FsLT5uZXRfdHlwZSA9PSBJTkZSQSkKKyAgICAgICAgICAgICAgICAgICAgJiYgIShsb2NhbC0+c3Bhcm0uYjQuYV9hY3RpbmdfYXNfYXBfc3RhdHVzKSkgeworICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGUobG9jYWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0FDUV9DT01QTEVURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfQUNRX0ZBSUxFRDsKKworICAgICAgICAgICAgICAgIGRlbF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKyAgICAgICAgICAgICAgICBsb2NhbC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWio1OworICAgICAgICAgICAgICAgIGxvY2FsLT50aW1lci5kYXRhID0gKGxvbmcpbG9jYWw7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDQ1NfU1RBUlRfTkVUV09SSykgeworICAgICAgICAgICAgICAgICAgICBERUJVRygwLCJyYXlfY3MgaW50ZXJydXB0IG5ldHdvcmsgXCIlc1wiIHN0YXJ0IGZhaWxlZFxuIixcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2N1cnJlbnRfZXNzX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWwtPnRpbWVyLmZ1bmN0aW9uID0gJnN0YXJ0X25ldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBpbnRlcnJ1cHQgbmV0d29yayBcIiVzXCIgam9pbiBmYWlsZWRcbiIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC0+c3Bhcm0uYjQuYV9jdXJyZW50X2Vzc19pZCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsLT50aW1lci5mdW5jdGlvbiA9ICZqb2luX25ldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkX3RpbWVyKCZsb2NhbC0+dGltZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0NTX1NUQVJUX0FTU09DSUFUSU9OOgorICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDQ1NfQ09NTUFORF9DT01QTEVURSkgeworICAgICAgICAgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfQVNTT0NfQ09NUExFVEU7CisgICAgICAgICAgICAgICAgREVCVUcoMCwicmF5X2NzIGFzc29jaWF0aW9uIHN1Y2Nlc3NmdWxcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBhc3NvY2lhdGlvbiBmYWlsZWQsXG4iKTsKKyAgICAgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0FTU09DX0ZBSUxFRDsKKyAgICAgICAgICAgICAgICBqb2luX25ldCgodV9sb25nKWxvY2FsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19UWF9SRVFVRVNUOgorICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDQ1NfQ09NTUFORF9DT01QTEVURSkgeworICAgICAgICAgICAgICAgIERFQlVHKDMsInJheV9jcyBpbnRlcnJ1cHQgdHggcmVxdWVzdCBjb21wbGV0ZVxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IHR4IHJlcXVlc3QgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc25pZmZlcikgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICAgICAgICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19URVNUX01FTU9SWToKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgbWVtIHRlc3QgZG9uZVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfU0hVVERPV046CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IFVuZXhwZWN0ZWQgQ0NTIHJldHVybmVkIC0gU2h1dGRvd25cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0NTX0RVTVBfTUVNT1JZOgorICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCBkdW1wIG1lbW9yeSBkb25lXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19TVEFSVF9USU1FUjoKKyAgICAgICAgICAgIERFQlVHKDIsInJheV9jcyBpbnRlcnJ1cHQgRElORyAtIHJheWxpbmsgdGltZXIgZXhwaXJlZFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgVW5leHBlY3RlZCBDQ1MgMHgleCByZXR1cm5lZCAweCV4XG4iLFwKKyAgICAgICAgICAgICAgICAgIHJjc2luZGV4LCBjbWQpOworICAgICAgICB9CisgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0ZSRUUsICZwY2NzLT5idWZmZXJfc3RhdHVzKTsKKyAgICB9CisgICAgZWxzZSAvKiBJdCdzIGFuIFJDUyAqLworICAgIHsKKyAgICAgICAgcHJjcyA9IHJjc19iYXNlKGxvY2FsKSArIHJjc2luZGV4OworICAgIAorICAgICAgICBzd2l0Y2ggKHJlYWRiKCZwcmNzLT5pbnRlcnJ1cHRfaWQpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgUFJPQ0VTU19SWF9QQUNLRVQ6CisgICAgICAgICAgICByYXlfcngoZGV2LCBsb2NhbCwgcHJjcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUpPSU5fTkVUX0NPTVBMRVRFOgorICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCByZWpvaW4gbmV0IGNvbXBsZXRlXG4iKTsKKyAgICAgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfQUNRX0NPTVBMRVRFOworICAgICAgICAgICAgLyogZG8gd2UgbmVlZCB0byBjbGVhciB0eCBidWZmZXJzIENDUydzPyAqLworICAgICAgICAgICAgaWYgKGxvY2FsLT5zcGFybS5iNC5hX25ldHdvcmtfdHlwZSA9PSBBREhPQykgeworICAgICAgICAgICAgICAgIGlmICghc25pZmZlcikgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweV9mcm9taW8oJmxvY2FsLT5ic3NfaWQsIHByY3MtPnZhci5yZWpvaW5fbmV0X2NvbXBsZXRlLmJzc2lkLCBBRERSTEVOKTsKKyAgICAgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgbmV3IEJTU0lEID0gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLFwKKyAgICAgICAgICAgICAgICAgICAgICBsb2NhbC0+YnNzX2lkWzBdLCBsb2NhbC0+YnNzX2lkWzFdLCBsb2NhbC0+YnNzX2lkWzJdLFwKKyAgICAgICAgICAgICAgICAgICAgICBsb2NhbC0+YnNzX2lkWzNdLCBsb2NhbC0+YnNzX2lkWzRdLCBsb2NhbC0+YnNzX2lkWzVdKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNuaWZmZXIpIGF1dGhlbnRpY2F0ZShsb2NhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBST0FNSU5HX0lOSVRJQVRFRDoKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgcm9hbWluZyBpbml0aWF0ZWRcbiIpOyAKKyAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICAgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfRE9JTkdfQUNROworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSkFQQU5fQ0FMTF9TSUdOX1JYRDoKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgamFwYW4gY2FsbCBzaWduIHJ4XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIFVuZXhwZWN0ZWQgaW50ZXJydXB0IGZvciBSQ1MgMHgleCBjbWQgPSAweCV4XG4iLFwKKyAgICAgICAgICAgICAgICAgIHJjc2luZGV4LCAodW5zaWduZWQgaW50KSByZWFkYigmcHJjcy0+aW50ZXJydXB0X2lkKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmcHJjcy0+YnVmZmVyX3N0YXR1cyk7CisgICAgfQorICAgIGNsZWFyX2ludGVycnVwdChsb2NhbCk7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfSAvKiByYXlfaW50ZXJydXB0ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByYXlfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgcmF5X2Rldl90ICpsb2NhbCwgc3RydWN0IHJjcyBfX2lvbWVtICpwcmNzKQoreworICAgIGludCByeF9sZW47CisgICAgdW5zaWduZWQgaW50IHBrdF9hZGRyOworICAgIHZvaWQgX19pb21lbSAqcG1zZzsKKyAgICBERUJVRyg0LCJyYXlfcnggcHJvY2VzcyByeCBwYWNrZXRcbiIpOworCisgICAgLyogQ2FsY3VsYXRlIGFkZHJlc3Mgb2YgcGFja2V0IHdpdGhpbiBSeCBidWZmZXIgKi8KKyAgICBwa3RfYWRkciA9ICgocmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQucnhfZGF0YV9wdHJbMF0pIDw8IDgpCisgICAgICAgICAgICAgICAgKyByZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC5yeF9kYXRhX3B0clsxXSkpICYgUlhfQlVGRl9FTkQ7CisgICAgLyogTGVuZ3RoIG9mIGZpcnN0IHBhY2tldCBmcmFnbWVudCAqLworICAgIHJ4X2xlbiA9IChyZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC5yeF9kYXRhX2xlbmd0aFswXSkgPDwgOCkKKyAgICAgICAgKyByZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC5yeF9kYXRhX2xlbmd0aFsxXSk7CisKKyAgICBsb2NhbC0+bGFzdF9yc2wgPSByZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC5yeF9zaWdfbGV2KTsKKyAgICBwbXNnID0gbG9jYWwtPnJtZW0gKyBwa3RfYWRkcjsKKyAgICBzd2l0Y2gocmVhZGIocG1zZykpCisgICAgeworICAgIGNhc2UgREFUQV9UWVBFOgorICAgICAgICBERUJVRyg0LCJyYXlfcnggZGF0YSB0eXBlXG4iKTsKKyAgICAgICAgcnhfZGF0YShkZXYsIHByY3MsIHBrdF9hZGRyLCByeF9sZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVVEhFTlRJQ19UWVBFOgorICAgICAgICBERUJVRyg0LCJyYXlfcnggYXV0aGVudGljIHR5cGVcbiIpOworICAgICAgICBpZiAoc25pZmZlcikgcnhfZGF0YShkZXYsIHByY3MsIHBrdF9hZGRyLCByeF9sZW4pOworICAgICAgICBlbHNlIHJ4X2F1dGhlbnRpY2F0ZShsb2NhbCwgcHJjcywgcGt0X2FkZHIsIHJ4X2xlbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgREVBVVRIRU5USUNfVFlQRToKKyAgICAgICAgREVCVUcoNCwicmF5X3J4IGRlYXV0aCB0eXBlXG4iKTsKKyAgICAgICAgaWYgKHNuaWZmZXIpIHJ4X2RhdGEoZGV2LCBwcmNzLCBwa3RfYWRkciwgcnhfbGVuKTsKKyAgICAgICAgZWxzZSByeF9kZWF1dGhlbnRpY2F0ZShsb2NhbCwgcHJjcywgcGt0X2FkZHIsIHJ4X2xlbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTlVMTF9NU0dfVFlQRToKKyAgICAgICAgREVCVUcoMywicmF5X2NzIHJ4IE5VTEwgbXNnXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCRUFDT05fVFlQRToKKyAgICAgICAgREVCVUcoNCwicmF5X3J4IGJlYWNvbiB0eXBlXG4iKTsKKyAgICAgICAgaWYgKHNuaWZmZXIpIHJ4X2RhdGEoZGV2LCBwcmNzLCBwa3RfYWRkciwgcnhfbGVuKTsKKworICAgICAgICBjb3B5X2Zyb21fcnhfYnVmZihsb2NhbCwgKFVDSEFSICopJmxvY2FsLT5sYXN0X2JjbiwgcGt0X2FkZHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICByeF9sZW4gPCBzaXplb2Yoc3RydWN0IGJlYWNvbl9yeCkgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnhfbGVuIDogc2l6ZW9mKHN0cnVjdCBiZWFjb25fcngpKTsKKworCWxvY2FsLT5iZWFjb25fcnhlZCA9IDE7CisgICAgICAgIC8qIEdldCB0aGUgc3RhdGlzdGljcyBzbyB0aGUgY2FyZCBjb3VudGVycyBuZXZlciBvdmVyZmxvdyAqLworICAgICAgICByYXlfZ2V0X3N0YXRzKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBERUJVRygwLCJyYXlfY3MgdW5rbm93biBwa3QgdHlwZSAlMnhcbiIsICh1bnNpZ25lZCBpbnQpIHJlYWRiKHBtc2cpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCit9IC8qIGVuZCByYXlfcnggKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIHJ4X2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHJjcyBfX2lvbWVtICpwcmNzLCB1bnNpZ25lZCBpbnQgcGt0X2FkZHIsIAorICAgICAgICAgICAgIGludCByeF9sZW4pCit7CisgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisgICAgc3RydWN0IHJjcyBfX2lvbWVtICpwcmNzbGluayA9IHByY3M7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IGRldi0+cHJpdjsKKyAgICBVQ0hBUiAqcnhfcHRyOworICAgIGludCB0b3RhbF9sZW47CisgICAgaW50IHRtcDsKKyNpZmRlZiBXSVJFTEVTU19TUFkKKyAgICBpbnQgc2lnbGV2ID0gbG9jYWwtPmxhc3RfcnNsOworICAgIHVfY2hhciBsaW5rc3JjYWRkcltFVEhfQUxFTl07CS8qIE90aGVyIGVuZCBvZiB0aGUgd2lyZWxlc3MgbGluayAqLworI2VuZGlmCisKKyAgICBpZiAoIXNuaWZmZXIpIHsKKyAgICAgICAgaWYgKHRyYW5zbGF0ZSkgeworLyogVEJEIGxlbmd0aCBuZWVkcyBmaXhpbmcgZm9yIHRyYW5zbGF0ZWQgaGVhZGVyICovCisgICAgICAgICAgICBpZiAocnhfbGVuIDwgKEVUSF9ITEVOICsgUlhfTUFDX0hFQURFUl9MRU5HVEgpIHx8CisgICAgICAgICAgICAgICAgcnhfbGVuID4gKGRldi0+bXR1ICsgUlhfTUFDX0hFQURFUl9MRU5HVEggKyBFVEhfSExFTiArIEZDU19MRU4pKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERUJVRygwLCJyYXlfY3MgaW52YWxpZCBwYWNrZXQgbGVuZ3RoICVkIHJlY2VpdmVkIFxuIixyeF9sZW4pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIGVuY2Fwc3VsYXRlZCBldGhlcm5ldCAqLyB7CisgICAgICAgICAgICBpZiAocnhfbGVuIDwgKEVUSF9ITEVOICsgUlhfTUFDX0hFQURFUl9MRU5HVEgpIHx8CisgICAgICAgICAgICAgICAgcnhfbGVuID4gKGRldi0+bXR1ICsgUlhfTUFDX0hFQURFUl9MRU5HVEggKyBFVEhfSExFTiArIEZDU19MRU4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBpbnZhbGlkIHBhY2tldCBsZW5ndGggJWQgcmVjZWl2ZWQgXG4iLHJ4X2xlbik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIERFQlVHKDQsInJheV9jcyByeF9kYXRhIHBhY2tldFxuIik7CisgICAgLyogSWYgZnJhZ21lbnRlZCBwYWNrZXQsIHZlcmlmeSBzaXplcyBvZiBmcmFnbWVudHMgYWRkIHVwICovCisgICAgaWYgKHJlYWRiKCZwcmNzLT52YXIucnhfcGFja2V0Lm5leHRfZnJhZ19yY3NfaW5kZXgpICE9IDB4RkYpIHsKKyAgICAgICAgREVCVUcoMSwicmF5X2NzIHJ4J2VkIGZyYWdtZW50XG4iKTsKKyAgICAgICAgdG1wID0gKHJlYWRiKCZwcmNzLT52YXIucnhfcGFja2V0LnRvdGFscGFja2V0bGVuZ3RoWzBdKSA8PCA4KQorICAgICAgICAgICAgKyAgcmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQudG90YWxwYWNrZXRsZW5ndGhbMV0pOworICAgICAgICB0b3RhbF9sZW4gPSB0bXA7CisgICAgICAgIHByY3NsaW5rID0gcHJjczsKKyAgICAgICAgZG8geworICAgICAgICAgICAgdG1wIC09IChyZWFkYigmcHJjc2xpbmstPnZhci5yeF9wYWNrZXQucnhfZGF0YV9sZW5ndGhbMF0pIDw8IDgpCisgICAgICAgICAgICAgICAgKyAgIHJlYWRiKCZwcmNzbGluay0+dmFyLnJ4X3BhY2tldC5yeF9kYXRhX2xlbmd0aFsxXSk7CisgICAgICAgICAgICBpZiAocmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0Lm5leHRfZnJhZ19yY3NfaW5kZXgpID09IDB4RkYKKyAgICAgICAgICAgICAgICB8fCB0bXAgPCAwKSBicmVhazsKKyAgICAgICAgICAgIHByY3NsaW5rID0gcmNzX2Jhc2UobG9jYWwpCisgICAgICAgICAgICAgICAgKyByZWFkYigmcHJjc2xpbmstPmxpbmtfZmllbGQpOworICAgICAgICB9IHdoaWxlICgxKTsKKworICAgICAgICBpZiAodG1wIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgREVCVUcoMCwicmF5X2NzIHJ4X2RhdGEgZnJhZ21lbnQgbGVuZ3RocyBkb24ndCBhZGQgdXBcbiIpOworICAgICAgICAgICAgbG9jYWwtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsgCisgICAgICAgICAgICByZWxlYXNlX2ZyYWdfY2hhaW4obG9jYWwsIHByY3MpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeyAvKiBTaW5nbGUgdW5mcmFnbWVudGVkIHBhY2tldCAqLworICAgICAgICB0b3RhbF9sZW4gPSByeF9sZW47CisgICAgfQorCisgICAgc2tiID0gZGV2X2FsbG9jX3NrYiggdG90YWxfbGVuKzUgKTsKKyAgICBpZiAoc2tiID09IE5VTEwpCisgICAgeworICAgICAgICBERUJVRygwLCJyYXlfY3MgcnhfZGF0YSBjb3VsZCBub3QgYWxsb2NhdGUgc2tiXG4iKTsKKyAgICAgICAgbG9jYWwtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsgCisgICAgICAgIGlmIChyZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC5uZXh0X2ZyYWdfcmNzX2luZGV4KSAhPSAweEZGKQorICAgICAgICAgICAgcmVsZWFzZV9mcmFnX2NoYWluKGxvY2FsLCBwcmNzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBza2JfcmVzZXJ2ZSggc2tiLCAyKTsgICAvKiBBbGlnbiBJUCBvbiAxNiBieXRlIChUQkQgY2hlY2sgdGhpcykqLworICAgIHNrYi0+ZGV2ID0gZGV2OworCisgICAgREVCVUcoNCwicmF5X2NzIHJ4X2RhdGEgdG90YWxfbGVuID0gJXgsIHJ4X2xlbiA9ICV4XG4iLHRvdGFsX2xlbixyeF9sZW4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFJlc2VydmUgZW5vdWdoIHJvb20gZm9yIHRoZSB3aG9sZSBkYW1uIHBhY2tldC4gKi8KKyAgICByeF9wdHIgPSBza2JfcHV0KCBza2IsIHRvdGFsX2xlbik7CisgICAgLyogQ29weSB0aGUgd2hvbGUgcGFja2V0IHRvIHNrX2J1ZmYgKi8KKyAgICByeF9wdHIgKz0gY29weV9mcm9tX3J4X2J1ZmYobG9jYWwsIHJ4X3B0ciwgcGt0X2FkZHIgJiBSWF9CVUZGX0VORCwgcnhfbGVuKTsKKyAgICAvKiBHZXQgc291cmNlIGFkZHJlc3MgKi8KKyNpZmRlZiBXSVJFTEVTU19TUFkKKyAgICBtZW1jcHkobGlua3NyY2FkZHIsICgoc3RydWN0IG1hY19oZWFkZXIgKilza2ItPmRhdGEpLT5hZGRyXzIsIEVUSF9BTEVOKTsKKyNlbmRpZgorICAgIC8qIE5vdywgZGVhbCB3aXRoIGVuY2Fwc3VsYXRpb24vdHJhbnNsYXRpb24vc25pZmZlciAqLworICAgIGlmICghc25pZmZlcikgeworICAgICAgICBpZiAoIXRyYW5zbGF0ZSkgeyAKKyAgICAgICAgICAgIC8qIEVuY2Fwc3VsYXRlZCBldGhlcm5ldCwgc28ganVzdCBsb3Agb2ZmIDgwMi4xMSBNQUMgaGVhZGVyICovCisvKiBUQkQgcmVzZXJ2ZSAgICAgICAgICAgIHNrYl9yZXNlcnZlKCBza2IsIFJYX01BQ19IRUFERVJfTEVOR1RIKTsgKi8KKyAgICAgICAgICAgIHNrYl9wdWxsKCBza2IsIFJYX01BQ19IRUFERVJfTEVOR1RIKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIERvIHRyYW5zbGF0aW9uICovCisgICAgICAgICAgICB1bnRyYW5zbGF0ZShsb2NhbCwgc2tiLCB0b3RhbF9sZW4pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgCisgICAgeyAgLyogc25pZmZlciBtb2RlLCBzbyBqdXN0IHBhc3Mgd2hvbGUgcGFja2V0ICovICB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIE5vdyBwaWNrIHVwIHRoZSByZXN0IG9mIHRoZSBmcmFnbWVudHMgaWYgYW55ICovCisgICAgdG1wID0gMTc7IAorICAgIGlmIChyZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC5uZXh0X2ZyYWdfcmNzX2luZGV4KSAhPSAweEZGKSB7CisgICAgICAgIHByY3NsaW5rID0gcHJjczsKKyAgICAgICAgREVCVUcoMSwicmF5X2NzIHJ4X2RhdGEgaW4gZnJhZ21lbnQgbG9vcFxuIik7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHByY3NsaW5rID0gcmNzX2Jhc2UobG9jYWwpCisgICAgICAgICAgICAgICAgKyByZWFkYigmcHJjc2xpbmstPnZhci5yeF9wYWNrZXQubmV4dF9mcmFnX3Jjc19pbmRleCk7CisgICAgICAgICAgICByeF9sZW4gPSAoKCByZWFkYigmcHJjc2xpbmstPnZhci5yeF9wYWNrZXQucnhfZGF0YV9sZW5ndGhbMF0pIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgKyByZWFkYigmcHJjc2xpbmstPnZhci5yeF9wYWNrZXQucnhfZGF0YV9sZW5ndGhbMV0pKQorICAgICAgICAgICAgICAgICYgUlhfQlVGRl9FTkQ7CisgICAgICAgICAgICBwa3RfYWRkciA9ICgoIHJlYWRiKCZwcmNzbGluay0+dmFyLnJ4X3BhY2tldC5yeF9kYXRhX3B0clswXSkgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0LnJ4X2RhdGFfcHRyWzFdKSkKKyAgICAgICAgICAgICAgICAmIFJYX0JVRkZfRU5EOworCisgICAgICAgICAgICByeF9wdHIgKz0gY29weV9mcm9tX3J4X2J1ZmYobG9jYWwsIHJ4X3B0ciwgcGt0X2FkZHIsIHJ4X2xlbik7CisKKyAgICAgICAgfSB3aGlsZSAodG1wLS0gJiYgCisgICAgICAgICAgICAgICAgIHJlYWRiKCZwcmNzbGluay0+dmFyLnJ4X3BhY2tldC5uZXh0X2ZyYWdfcmNzX2luZGV4KSAhPSAweEZGKTsKKyAgICAgICAgcmVsZWFzZV9mcmFnX2NoYWluKGxvY2FsLCBwcmNzKTsKKyAgICB9CisKKyAgICBza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisgICAgbmV0aWZfcngoc2tiKTsKKyAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworICAgIGxvY2FsLT5zdGF0cy5yeF9wYWNrZXRzKys7CisgICAgbG9jYWwtPnN0YXRzLnJ4X2J5dGVzICs9IHRvdGFsX2xlbjsKKworICAgIC8qIEdhdGhlciBzaWduYWwgc3RyZW5ndGggcGVyIGFkZHJlc3MgKi8KKyNpZmRlZiBXSVJFTEVTU19TUFkKKyAgICAvKiBGb3IgdGhlIEFjY2VzcyBQb2ludCBvciB0aGUgbm9kZSBoYXZpbmcgc3RhcnRlZCB0aGUgYWQtaG9jIG5ldAorICAgICAqIG5vdGUgOiBhZC1ob2Mgd29yayBvbmx5IGluIHNvbWUgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMsIGJ1dCB3ZQorICAgICAqIGtsdWRnZSBpbiByYXlfZ2V0X3dpcmVsZXNzX3N0YXRzLi4uICovCisgICAgaWYoIW1lbWNtcChsaW5rc3JjYWRkciwgbG9jYWwtPmJzc19pZCwgRVRIX0FMRU4pKQorICAgICAgeworCS8qIFVwZGF0ZSBzdGF0aXN0aWNzICovCisJLypsb2NhbC0+d3N0YXRzLnF1YWwucXVhbCA9IG5vbmUgPyAqLworCWxvY2FsLT53c3RhdHMucXVhbC5sZXZlbCA9IHNpZ2xldjsKKwkvKmxvY2FsLT53c3RhdHMucXVhbC5ub2lzZSA9IG5vbmUgPyAqLworCWxvY2FsLT53c3RhdHMucXVhbC51cGRhdGVkID0gMHgyOworICAgICAgfQorICAgIC8qIE5vdywgZm9yIHRoZSBhZGRyZXNzZXMgaW4gdGhlIHNweSBsaXN0ICovCisgICAgeworICAgICAgaW50CWk7CisgICAgICAvKiBMb29rIGFsbCBhZGRyZXNzZXMgKi8KKyAgICAgIGZvcihpID0gMDsgaSA8IGxvY2FsLT5zcHlfbnVtYmVyOyBpKyspCisJLyogSWYgbWF0Y2ggKi8KKwlpZighbWVtY21wKGxpbmtzcmNhZGRyLCBsb2NhbC0+c3B5X2FkZHJlc3NbaV0sIEVUSF9BTEVOKSkKKwkgIHsKKwkgICAgLyogVXBkYXRlIHN0YXRpc3RpY3MgKi8KKwkgICAgLypsb2NhbC0+c3B5X3N0YXRbaV0ucXVhbCA9IG5vbmUgPyAqLworCSAgICBsb2NhbC0+c3B5X3N0YXRbaV0ubGV2ZWwgPSBzaWdsZXY7CisJICAgIC8qbG9jYWwtPnNweV9zdGF0W2ldLm5vaXNlID0gbm9uZSA/ICovCisJICAgIGxvY2FsLT5zcHlfc3RhdFtpXS51cGRhdGVkID0gMHgyOworCSAgfQorICAgIH0KKyNlbmRpZgkvKiBXSVJFTEVTU19TUFkgKi8KK30gLyogZW5kIHJ4X2RhdGEgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIHVudHJhbnNsYXRlKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCBza19idWZmICpza2IsIGludCBsZW4pCit7CisgICAgc25hcGhkcl90ICpwc25hcCA9IChzbmFwaGRyX3QgKikoc2tiLT5kYXRhICsgUlhfTUFDX0hFQURFUl9MRU5HVEgpOworICAgIHN0cnVjdCBtYWNfaGVhZGVyICpwbWFjID0gKHN0cnVjdCBtYWNfaGVhZGVyICopc2tiLT5kYXRhOworICAgIHVuc2lnbmVkIHNob3J0IHR5cGUgPSAqKHVuc2lnbmVkIHNob3J0ICopcHNuYXAtPmV0aGVydHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgeHNhcCA9ICoodW5zaWduZWQgaW50ICopcHNuYXAgJiAweDAwZmZmZmZmOworICAgIHVuc2lnbmVkIGludCBvcmcgPSAoKih1bnNpZ25lZCBpbnQgKilwc25hcC0+b3JnKSAmIDB4MDBmZmZmZmY7CisgICAgaW50IGRlbHRhOworICAgIHN0cnVjdCBldGhoZHIgKnBldGg7CisgICAgVUNIQVIgc3JjYWRkcltBRERSTEVOXTsKKyAgICBVQ0hBUiBkZXN0YWRkcltBRERSTEVOXTsKKworICAgIGlmIChwbWFjLT5mcmFtZV9jdGxfMiAmIEZDMl9GUk9NX0RTKSB7CisJaWYgKHBtYWMtPmZyYW1lX2N0bF8yICYgRkMyX1RPX0RTKSB7IC8qIEFQIHRvIEFQICovCisJICAgIG1lbWNweShkZXN0YWRkciwgcG1hYy0+YWRkcl8zLCBBRERSTEVOKTsKKwkgICAgbWVtY3B5KHNyY2FkZHIsICgodW5zaWduZWQgY2hhciAqKXBtYWMtPmFkZHJfMykgKyBBRERSTEVOLCBBRERSTEVOKTsKKwl9IGVsc2UgeyAvKiBBUCB0byB0ZXJtaW5hbCAqLworCSAgICBtZW1jcHkoZGVzdGFkZHIsIHBtYWMtPmFkZHJfMSwgQUREUkxFTik7CisJICAgIG1lbWNweShzcmNhZGRyLCBwbWFjLT5hZGRyXzMsIEFERFJMRU4pOyAKKwl9CisgICAgfSBlbHNlIHsgLyogVGVybWluYWwgdG8gQVAgKi8KKwlpZiAocG1hYy0+ZnJhbWVfY3RsXzIgJiBGQzJfVE9fRFMpIHsKKwkgICAgbWVtY3B5KGRlc3RhZGRyLCBwbWFjLT5hZGRyXzMsIEFERFJMRU4pOworCSAgICBtZW1jcHkoc3JjYWRkciwgcG1hYy0+YWRkcl8yLCBBRERSTEVOKTsgCisJfSBlbHNlIHsgLyogQWRob2MgKi8KKwkgICAgbWVtY3B5KGRlc3RhZGRyLCBwbWFjLT5hZGRyXzEsIEFERFJMRU4pOworCSAgICBtZW1jcHkoc3JjYWRkciwgcG1hYy0+YWRkcl8yLCBBRERSTEVOKTsgCisJfQorICAgIH0KKworI2lmZGVmIFBDTUNJQV9ERUJVRworICAgIGlmIChwY19kZWJ1ZyA+IDMpIHsKKyAgICBpbnQgaTsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAic2tiLT5kYXRhIGJlZm9yZSB1bnRyYW5zbGF0ZSIpOworICAgIGZvciAoaT0wO2k8NjQ7aSsrKSAKKyAgICAgICAgcHJpbnRrKCIlMDJ4ICIsc2tiLT5kYXRhW2ldKTsKKyAgICBwcmludGsoIlxuIiBLRVJOX0RFQlVHICJ0eXBlID0gJTA4eCwgeHNhcCA9ICUwOHgsIG9yZyA9ICUwOHhcbiIsCisgICAgICAgICAgIHR5cGUseHNhcCxvcmcpOworICAgIHByaW50ayhLRVJOX0RFQlVHICJ1bnRyYW5zbGF0ZSBza2ItPmRhdGEgPSAlcFxuIixza2ItPmRhdGEpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCB4c2FwICE9IFNOQVBfSUQpIHsKKyAgICAgICAgLyogbm90IGEgc25hcCB0eXBlIHNvIGxlYXZlIGl0IGFsb25lICovCisgICAgICAgIERFQlVHKDMsInJheV9jcyB1bnRyYW5zbGF0ZSBOT1QgU05BUCAleFxuIiwgKih1bnNpZ25lZCBpbnQgKilwc25hcCAmIDB4MDBmZmZmZmYpOworCisgICAgICAgIGRlbHRhID0gUlhfTUFDX0hFQURFUl9MRU5HVEggLSBFVEhfSExFTjsKKyAgICAgICAgcGV0aCA9IChzdHJ1Y3QgZXRoaGRyICopKHNrYi0+ZGF0YSArIGRlbHRhKTsKKyAgICAgICAgcGV0aC0+aF9wcm90byA9IGh0b25zKGxlbiAtIFJYX01BQ19IRUFERVJfTEVOR1RIKTsKKyAgICB9CisgICAgZWxzZSB7IC8qIEl0cyBhIFNOQVAgKi8KKyAgICAgICAgaWYgKG9yZyA9PSBCUklER0VfRU5DQVApIHsgLyogRXRoZXJJSSBhbmQgbnVrZSB0aGUgTExDICAqLworICAgICAgICBERUJVRygzLCJyYXlfY3MgdW50cmFuc2xhdGUgQnJpZGdlIGVuY2FwXG4iKTsKKyAgICAgICAgICAgIGRlbHRhID0gUlhfTUFDX0hFQURFUl9MRU5HVEggCisgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IHNuYXBoZHJfdCkgLSBFVEhfSExFTjsKKyAgICAgICAgICAgIHBldGggPSAoc3RydWN0IGV0aGhkciAqKShza2ItPmRhdGEgKyBkZWx0YSk7CisgICAgICAgICAgICBwZXRoLT5oX3Byb3RvID0gdHlwZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvcmcgPT0gUkZDMTA0Ml9FTkNBUCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgUkFZX0lQWF9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQVBQTEVBUlBfVFlQRToKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoMywicmF5X2NzIHVudHJhbnNsYXRlIFJGQyBJUFgvQUFSUFxuIik7CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gUlhfTUFDX0hFQURFUl9MRU5HVEggLSBFVEhfSExFTjsKKyAgICAgICAgICAgICAgICAgICAgcGV0aCA9IChzdHJ1Y3QgZXRoaGRyICopKHNrYi0+ZGF0YSArIGRlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgcGV0aC0+aF9wcm90byA9IGh0b25zKGxlbiAtIFJYX01BQ19IRUFERVJfTEVOR1RIKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoMywicmF5X2NzIHVudHJhbnNsYXRlIFJGQyBkZWZhdWx0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBSWF9NQUNfSEVBREVSX0xFTkdUSCArIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzbmFwaGRyX3QpIC0gRVRIX0hMRU47CisgICAgICAgICAgICAgICAgICAgIHBldGggPSAoc3RydWN0IGV0aGhkciAqKShza2ItPmRhdGEgKyBkZWx0YSk7CisgICAgICAgICAgICAgICAgICAgIHBldGgtPmhfcHJvdG8gPSB0eXBlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGsoInJheV9jcyB1bnRyYW5zbGF0ZSB2ZXJ5IGNvbmZ1c2VkIGJ5IHBhY2tldFxuIik7CisgICAgICAgICAgICAgICAgZGVsdGEgPSBSWF9NQUNfSEVBREVSX0xFTkdUSCAtIEVUSF9ITEVOOworICAgICAgICAgICAgICAgIHBldGggPSAoc3RydWN0IGV0aGhkciAqKShza2ItPmRhdGEgKyBkZWx0YSk7CisgICAgICAgICAgICAgICAgcGV0aC0+aF9wcm90byA9IHR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisvKiBUQkQgcmVzZXJ2ZSAgc2tiX3Jlc2VydmUoc2tiLCBkZWx0YSk7ICovCisgICAgc2tiX3B1bGwoc2tiLCBkZWx0YSk7CisgICAgREVCVUcoMywidW50cmFuc2xhdGUgYWZ0ZXIgc2tiX3B1bGwoJWQpLCBza2ItPmRhdGEgPSAlcFxuIixkZWx0YSxza2ItPmRhdGEpOworICAgIG1lbWNweShwZXRoLT5oX2Rlc3QsIGRlc3RhZGRyLCBBRERSTEVOKTsKKyAgICBtZW1jcHkocGV0aC0+aF9zb3VyY2UsIHNyY2FkZHIsIEFERFJMRU4pOworI2lmZGVmIFBDTUNJQV9ERUJVRworICAgIGlmIChwY19kZWJ1ZyA+IDMpIHsKKyAgICBpbnQgaTsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAic2tiLT5kYXRhIGFmdGVyIHVudHJhbnNsYXRlOiIpOworICAgIGZvciAoaT0wO2k8NjQ7aSsrKQorICAgICAgICBwcmludGsoIiUwMnggIixza2ItPmRhdGFbaV0pOworICAgIHByaW50aygiXG4iKTsKKyAgICB9CisjZW5kaWYKK30gLyogZW5kIHVudHJhbnNsYXRlICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBDb3B5IGRhdGEgZnJvbSBjaXJjdWxhciByZWNlaXZlIGJ1ZmZlciB0byBQQyBtZW1vcnkuCisgKiBkZXN0ICAgICA9IGRlc3RpbmF0aW9uIGFkZHJlc3MgaW4gUEMgbWVtb3J5CisgKiBwa3RfYWRkciA9IHNvdXJjZSBhZGRyZXNzIGluIHJlY2VpdmUgYnVmZmVyCisgKiBsZW4gICAgICA9IGxlbmd0aCBvZiBwYWNrZXQgdG8gY29weQorICovCitzdGF0aWMgaW50IGNvcHlfZnJvbV9yeF9idWZmKHJheV9kZXZfdCAqbG9jYWwsIFVDSEFSICpkZXN0LCBpbnQgcGt0X2FkZHIsIGludCBsZW5ndGgpCit7CisgICAgaW50IHdyYXBfYnl0ZXMgPSAocGt0X2FkZHIgKyBsZW5ndGgpIC0gKFJYX0JVRkZfRU5EICsgMSk7CisgICAgaWYgKHdyYXBfYnl0ZXMgPD0gMCkKKyAgICB7CisgICAgICAgIG1lbWNweV9mcm9taW8oZGVzdCxsb2NhbC0+cm1lbSArIHBrdF9hZGRyLGxlbmd0aCk7CisgICAgfQorICAgIGVsc2UgLyogUGFja2V0IHdyYXBwZWQgaW4gY2lyY3VsYXIgYnVmZmVyICovCisgICAgeworICAgICAgICBtZW1jcHlfZnJvbWlvKGRlc3QsbG9jYWwtPnJtZW0rcGt0X2FkZHIsbGVuZ3RoIC0gd3JhcF9ieXRlcyk7CisgICAgICAgIG1lbWNweV9mcm9taW8oZGVzdCArIGxlbmd0aCAtIHdyYXBfYnl0ZXMsIGxvY2FsLT5ybWVtLCB3cmFwX2J5dGVzKTsKKyAgICB9CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIHJlbGVhc2VfZnJhZ19jaGFpbihyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgcmNzIF9faW9tZW0gKiBwcmNzKQoreworICAgIHN0cnVjdCByY3MgX19pb21lbSAqcHJjc2xpbmsgPSBwcmNzOworICAgIGludCB0bXAgPSAxNzsKKyAgICB1bnNpZ25lZCByY3NpbmRleCA9IHJlYWRiKCZwcmNzLT52YXIucnhfcGFja2V0Lm5leHRfZnJhZ19yY3NfaW5kZXgpOworCisgICAgd2hpbGUgKHRtcC0tKSB7CisgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0ZSRUUsICZwcmNzbGluay0+YnVmZmVyX3N0YXR1cyk7CisgICAgICAgIGlmIChyY3NpbmRleCA+PSAoTlVNQkVSX09GX0NDUyArIE5VTUJFUl9PRl9SQ1MpKSB7CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IGJhZCByY3NpbmRleCA9IDB4JXhcbiIscmNzaW5kZXgpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgCisgICAgICAgIH0gICAKKyAgICAgICAgcHJjc2xpbmsgPSByY3NfYmFzZShsb2NhbCkgKyByY3NpbmRleDsKKyAgICAgICAgcmNzaW5kZXggPSByZWFkYigmcHJjc2xpbmstPnZhci5yeF9wYWNrZXQubmV4dF9mcmFnX3Jjc19pbmRleCk7CisgICAgfQorICAgIHdyaXRlYihDQ1NfQlVGRkVSX0ZSRUUsICZwcmNzbGluay0+YnVmZmVyX3N0YXR1cyk7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBhdXRoZW50aWNhdGUocmF5X2Rldl90ICpsb2NhbCkKK3sKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKyAgICBERUJVRygwLCJyYXlfY3MgU3RhcnRpbmcgYXV0aGVudGljYXRpb24uXG4iKTsKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfY3MgYXV0aGVudGljYXRlIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRlbF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKyAgICBpZiAoYnVpbGRfYXV0aF9mcmFtZShsb2NhbCwgbG9jYWwtPmJzc19pZCwgT1BFTl9BVVRIX1JFUVVFU1QpKSB7CisgICAgICAgIGxvY2FsLT50aW1lci5mdW5jdGlvbiA9ICZqb2luX25ldDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxvY2FsLT50aW1lci5mdW5jdGlvbiA9ICZhdXRoZW50aWNhdGVfdGltZW91dDsKKyAgICB9CisgICAgbG9jYWwtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFoqMjsKKyAgICBsb2NhbC0+dGltZXIuZGF0YSA9IChsb25nKWxvY2FsOworICAgIGFkZF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKyAgICBsb2NhbC0+YXV0aGVudGljYXRpb25fc3RhdGUgPSBBV0FJVElOR19SRVNQT05TRTsKK30gLyogZW5kIGF1dGhlbnRpY2F0ZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcnhfYXV0aGVudGljYXRlKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwa3RfYWRkciwgaW50IHJ4X2xlbikKK3sKKyAgICBVQ0hBUiBidWZmWzI1Nl07CisgICAgc3RydWN0IHJ4X21zZyAqbXNnID0gKHN0cnVjdCByeF9tc2cgKilidWZmOworICAgIAorICAgIGRlbF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKworICAgIGNvcHlfZnJvbV9yeF9idWZmKGxvY2FsLCBidWZmLCBwa3RfYWRkciwgcnhfbGVuICYgMHhmZik7CisgICAgLyogaWYgd2UgYXJlIHRyeWluZyB0byBnZXQgYXV0aGVudGljYXRlZCAqLworICAgIGlmIChsb2NhbC0+c3Bhcm0uYjQuYV9uZXR3b3JrX3R5cGUgPT0gQURIT0MpIHsKKyAgICAgICAgREVCVUcoMSwicmF5X2NzIHJ4X2F1dGggdmFyPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgbXNnLT52YXJbMF0sbXNnLT52YXJbMV0sbXNnLT52YXJbMl0sbXNnLT52YXJbM10sbXNnLT52YXJbNF0sbXNnLT52YXJbNV0pOworICAgICAgICBpZiAobXNnLT52YXJbMl0gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBERUJVRygwLCJyYXlfY3MgU2VuZGluZyBhdXRoZW50aWNhdGlvbiByZXNwb25zZS5cbiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1aWxkX2F1dGhfZnJhbWUgKGxvY2FsLCBtc2ctPm1hYy5hZGRyXzIsIE9QRU5fQVVUSF9SRVNQT05TRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLT5hdXRoZW50aWNhdGlvbl9zdGF0ZSA9IE5FRURfVE9fQVVUSDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShsb2NhbC0+YXV0aF9pZCwgbXNnLT5tYWMuYWRkcl8yLCBBRERSTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogSW5mcmFzdHJ1Y3R1cmUgbmV0d29yayAqLworICAgIHsKKyAgICAgICAgaWYgKGxvY2FsLT5hdXRoZW50aWNhdGlvbl9zdGF0ZSA9PSBBV0FJVElOR19SRVNQT05TRSkgeworICAgICAgICAgICAgLyogVmVyaWZ5IGF1dGhlbnRpY2F0aW9uIHNlcXVlbmNlICMyIGFuZCBzdWNjZXNzICovCisgICAgICAgICAgICBpZiAobXNnLT52YXJbMl0gPT0gMikgeworICAgICAgICAgICAgICAgIGlmICgobXNnLT52YXJbM10gfCBtc2ctPnZhcls0XSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBERUJVRygxLCJBdXRoZW50aWNhdGlvbiBzdWNjZXNzZnVsXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9BVVRIX0NPTVBMRVRFOworICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGUobG9jYWwpOworICAgICAgICAgICAgICAgICAgICBsb2NhbC0+YXV0aGVudGljYXRpb25fc3RhdGUgPSBBVVRIRU5USUNBVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoMCwiQXV0aGVudGljYXRpb24gcmVmdXNlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfQVVUSF9SRUZVU0VEOworICAgICAgICAgICAgICAgICAgICBqb2luX25ldCgodV9sb25nKWxvY2FsKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWwtPmF1dGhlbnRpY2F0aW9uX3N0YXRlID0gVU5BVVRIRU5USUNBVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfSAvKiBlbmQgcnhfYXV0aGVudGljYXRlICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBhc3NvY2lhdGUocmF5X2Rldl90ICpsb2NhbCkKK3sKKyAgICBzdHJ1Y3QgY2NzIF9faW9tZW0gKnBjY3M7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgaW50IGNjc2luZGV4OworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBhc3NvY2lhdGUgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIElmIG5vIHR4IGJ1ZmZlcnMgYXZhaWxhYmxlLCByZXR1cm4qLworICAgIGlmICgoY2NzaW5kZXggPSBnZXRfZnJlZV9jY3MobG9jYWwpKSA8IDApCisgICAgeworLyogVEJEIHNob3VsZCBuZXZlciBiZSBoZXJlIGJ1dC4uLiB3aGF0IGlmIHdlIGFyZT8gKi8KKyAgICAgICAgREVCVUcoMSwicmF5X2NzIGFzc29jaWF0ZSAtIE5vIGZyZWUgY2NzXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBERUJVRygxLCJyYXlfY3MgU3RhcnRpbmcgYXNzb2NpYXRpb24gd2l0aCBhY2Nlc3MgcG9pbnRcbiIpOworICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKyAgICAvKiBmaWxsIGluIHRoZSBDQ1MgKi8KKyAgICB3cml0ZWIoQ0NTX1NUQVJUX0FTU09DSUFUSU9OLCAmcGNjcy0+Y21kKTsKKyAgICAvKiBJbnRlcnJ1cHQgdGhlIGZpcm13YXJlIHRvIHByb2Nlc3MgdGhlIGNvbW1hbmQgKi8KKyAgICBpZiAoaW50ZXJydXB0X2VjZihsb2NhbCwgY2NzaW5kZXgpKSB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyBhc3NvY2lhdGUgZmFpbGVkIC0gRUNGIG5vdCByZWFkeSBmb3IgaW50clxuIik7CisgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0ZSRUUsICYocGNjcysrKS0+YnVmZmVyX3N0YXR1cyk7CisKKyAgICAgICAgZGVsX3RpbWVyKCZsb2NhbC0+dGltZXIpOworICAgICAgICBsb2NhbC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWioyOworICAgICAgICBsb2NhbC0+dGltZXIuZGF0YSA9IChsb25nKWxvY2FsOworICAgICAgICBsb2NhbC0+dGltZXIuZnVuY3Rpb24gPSAmam9pbl9uZXQ7CisgICAgICAgIGFkZF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKyAgICAgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9BU1NPQ19GQUlMRUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFzbmlmZmVyKSBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCit9IC8qIGVuZCBhc3NvY2lhdGUgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIHJ4X2RlYXV0aGVudGljYXRlKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcywgCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwa3RfYWRkciwgaW50IHJ4X2xlbikKK3sKKy8qICBVQ0hBUiBidWZmWzI1Nl07CisgICAgc3RydWN0IHJ4X21zZyAqbXNnID0gKHN0cnVjdCByeF9tc2cgKilidWZmOworKi8KKyAgICBERUJVRygwLCJEZWF1dGhlbnRpY2F0aW9uIGZyYW1lIHJlY2VpdmVkXG4iKTsKKyAgICBsb2NhbC0+YXV0aGVudGljYXRpb25fc3RhdGUgPSBVTkFVVEhFTlRJQ0FURUQ7CisgICAgLyogTmVlZCB0byByZWF1dGhlbnRpY2F0ZSBvciByZWpvaW4gZGVwZW5kaW5nIG9uIHJlYXNvbiBjb2RlICovCisvKiAgY29weV9mcm9tX3J4X2J1ZmYobG9jYWwsIGJ1ZmYsIHBrdF9hZGRyLCByeF9sZW4gJiAweGZmKTsKKyAqLworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgY2xlYXJfaW50ZXJydXB0KHJheV9kZXZfdCAqbG9jYWwpCit7CisgICAgd3JpdGViKDAsIGxvY2FsLT5hbWVtICsgQ0lTX09GRlNFVCArIEhDU19JTlRSX09GRlNFVCk7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyNkZWZpbmUgTUFYREFUQSAoUEFHRV9TSVpFIC0gODApCisKK3N0YXRpYyBjaGFyICpjYXJkX3N0YXR1c1tdID0geworICAgICJDYXJkIGluc2VydGVkIC0gdW5pbml0aWFsaXplZCIsICAgICAvKiAwICovCisgICAgIkNhcmQgbm90IGRvd25sb2FkZWQiLCAgICAgICAgICAgICAgIC8qIDEgKi8KKyAgICAiV2FpdGluZyBmb3IgZG93bmxvYWQgcGFyYW1ldGVycyIsICAgLyogMiAqLworICAgICJDYXJkIGRvaW5nIGFjcXVpc2l0aW9uIiwgICAgICAgICAgICAvKiAzICovCisgICAgIkFjcXVpc2l0aW9uIGNvbXBsZXRlIiwgICAgICAgICAgICAgIC8qIDQgKi8KKyAgICAiQXV0aGVudGljYXRpb24gY29tcGxldGUiLCAgICAgICAgICAgLyogNSAqLworICAgICJBc3NvY2lhdGlvbiBjb21wbGV0ZSIsICAgICAgICAgICAgICAvKiA2ICovCisgICAgIj8/PyIsICI/Pz8iLCAiPz8/IiwgIj8/PyIsICAgICAgICAgIC8qIDcgOCA5IDEwIHVuZGVmaW5lZCAqLworICAgICJDYXJkIGluaXQgZXJyb3IiLCAgICAgICAgICAgICAgICAgICAvKiAxMSAqLworICAgICJEb3dubG9hZCBwYXJhbWV0ZXJzIGVycm9yIiwgICAgICAgICAvKiAxMiAqLworICAgICI/Pz8iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMyAqLworICAgICJBY3F1aXNpdGlvbiBmYWlsZWQiLCAgICAgICAgICAgICAgICAvKiAxNCAqLworICAgICJBdXRoZW50aWNhdGlvbiByZWZ1c2VkIiwgICAgICAgICAgICAvKiAxNSAqLworICAgICJBc3NvY2lhdGlvbiBmYWlsZWQiICAgICAgICAgICAgICAgICAvKiAxNiAqLworfTsKKworc3RhdGljIGNoYXIgKm5ldHR5cGVbXSA9IHsiQWRob2MiLCAiSW5mcmEgIn07CitzdGF0aWMgY2hhciAqZnJhbWluZ1tdID0geyJFbmNhcHN1bGF0aW9uIiwgIlRyYW5zbGF0aW9uIn0KKzsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgcmF5X2NzX3Byb2NfcmVhZChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuKQoreworLyogUHJpbnQgY3VycmVudCB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdmlhIG90aGVyIG1lYW5zCisgKiBlZyBpZmNvbmZpZyAKKyAqLworICAgIGludCBpOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICByYXlfZGV2X3QgKmxvY2FsOworICAgIFVDSEFSICpwOworICAgIHN0cnVjdCBmcmVxX2hvcF9lbGVtZW50ICpwZmg7CisgICAgVUNIQVIgY1szM107CisKKyAgICBsaW5rID0gZGV2X2xpc3Q7CisgICAgaWYgKCFsaW5rKQorICAgIAlyZXR1cm4gMDsKKyAgICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilsaW5rLT5wcml2OworICAgIGlmICghZGV2KQorICAgIAlyZXR1cm4gMDsKKyAgICBsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgaWYgKCFsb2NhbCkKKyAgICAJcmV0dXJuIDA7CisKKyAgICBsZW4gPSAwOworCisgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiUmF5bGluayBXaXJlbGVzcyBMQU4gZHJpdmVyIHN0YXR1c1xuIik7CisgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJXNcbiIsIHJjc2lkKTsKKyAgICAvKiBidWlsZCA0IGRvZXMgbm90IHJlcG9ydCB2ZXJzaW9uLCBhbmQgZmllbGQgaXMgMHg1NSBhZnRlciBtZW10ZXN0ICovCisgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiRmlybXdhcmUgdmVyc2lvbiAgICAgPSAiKTsKKyAgICBpZiAobG9jYWwtPmZ3X3ZlciA9PSAweDU1KQorICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICI0IC0gVXNlIGR1bXBfY2lzIGZvciBtb3JlIGRldGFpbHNcbiIpOworICAgIGVsc2UKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJTJkLiUwMmQuJTAyZFxuIiwKKyAgICAgICAgICAgICAgICAgICBsb2NhbC0+ZndfdmVyLCBsb2NhbC0+ZndfYmxkLCBsb2NhbC0+ZndfdmFyKTsKKworICAgIGZvciAoaT0wOyBpPDMyOyBpKyspIGNbaV0gPSBsb2NhbC0+c3Bhcm0uYjUuYV9jdXJyZW50X2Vzc19pZFtpXTsKKyAgICBjWzMyXSA9IDA7CisgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJXMgbmV0d29yayBFU1NJRCA9IFwiJXNcIlxuIiwgCisgICAgICAgICAgICAgICAgICAgbmV0dHlwZVtsb2NhbC0+c3Bhcm0uYjUuYV9uZXR3b3JrX3R5cGVdLCBjKTsKKworICAgIHAgPSBsb2NhbC0+YnNzX2lkOworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgCisgICAgICAgICAgICAgICAgICAgIkJTU0lEICAgICAgICAgICAgICAgID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgcFswXSxwWzFdLHBbMl0scFszXSxwWzRdLHBbNV0pOworCisgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiQ291bnRyeSBjb2RlICAgICAgICAgPSAlZFxuIiwgCisgICAgICAgICAgICAgICAgICAgbG9jYWwtPnNwYXJtLmI1LmFfY3Vycl9jb3VudHJ5X2NvZGUpOworCisgICAgaSA9IGxvY2FsLT5jYXJkX3N0YXR1czsKKyAgICBpZiAoaSA8IDApIGkgPSAxMDsKKyAgICBpZiAoaSA+IDE2KSBpID0gMTA7CisgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiQ2FyZCBzdGF0dXMgICAgICAgICAgPSAlc1xuIiwgY2FyZF9zdGF0dXNbaV0pOworCisgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiRnJhbWluZyBtb2RlICAgICAgICAgPSAlc1xuIixmcmFtaW5nW3RyYW5zbGF0ZV0pOworCisgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiTGFzdCBwa3Qgc2lnbmFsIGx2bCAgPSAlZFxuIiwgbG9jYWwtPmxhc3RfcnNsKTsKKworICAgIGlmIChsb2NhbC0+YmVhY29uX3J4ZWQpIHsKKwkvKiBQdWxsIHNvbWUgZmllbGRzIG91dCBvZiBsYXN0IGJlYWNvbiByZWNlaXZlZCAqLworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkJlYWNvbiBJbnRlcnZhbCAgICAgID0gJWQgS3VzXG4iLCAKKwkJICAgICAgIGxvY2FsLT5sYXN0X2Jjbi5iZWFjb25faW50dmxbMF0KKwkJICAgICAgICsgMjU2ICogbG9jYWwtPmxhc3RfYmNuLmJlYWNvbl9pbnR2bFsxXSk7CisgICAgCisgICAgcCA9IGxvY2FsLT5sYXN0X2Jjbi5lbGVtZW50czsKKyAgICBpZiAocFswXSA9PSBDX0VTU0lEX0VMRU1FTlRfSUQpIHAgKz0gcFsxXSArIDI7CisgICAgZWxzZSB7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlBhcnNlIGJlYWNvbiBmYWlsZWQgYXQgZXNzaWQgZWxlbWVudCBpZCA9ICVkXG4iLHBbMF0pOworICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKworICAgIGlmIChwWzBdID09IENfU1VQUE9SVEVEX1JBVEVTX0VMRU1FTlRfSUQpIHsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiU3VwcG9ydGVkIHJhdGUgY29kZXMgPSAiKTsKKyAgICAgICAgZm9yIChpPTI7IGk8cFsxXSArIDI7IGkrKykgCisgICAgICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIweCUwMnggIiwgcFtpXSk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlxuIik7CisgICAgICAgIHAgKz0gcFsxXSArIDI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJQYXJzZSBiZWFjb24gZmFpbGVkIGF0IHJhdGVzIGVsZW1lbnRcbiIpOworICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKworCWlmIChwWzBdID09IENfRkhfUEFSQU1fU0VUX0VMRU1FTlRfSUQpIHsKKwkgICAgcGZoID0gKHN0cnVjdCBmcmVxX2hvcF9lbGVtZW50ICopcDsKKwkgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSG9wIGR3ZWxsICAgICAgICAgICAgPSAlZCBLdXNcbiIsCisJCQkgICBwZmgtPmR3ZWxsX3RpbWVbMF0gKyAyNTYgKiBwZmgtPmR3ZWxsX3RpbWVbMV0pOworCSAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJIb3Agc2V0ICAgICAgICAgICAgICA9ICVkIFxuIiwgcGZoLT5ob3Bfc2V0KTsKKwkgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSG9wIHBhdHRlcm4gICAgICAgICAgPSAlZCBcbiIsIHBmaC0+aG9wX3BhdHRlcm4pOworCSAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJIb3AgaW5kZXggICAgICAgICAgICA9ICVkIFxuIiwgcGZoLT5ob3BfaW5kZXgpOworCSAgICBwICs9IHBbMV0gKyAyOworCX0KKwllbHNlIHsKKwkgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiUGFyc2UgYmVhY29uIGZhaWxlZCBhdCBGSCBwYXJhbSBlbGVtZW50XG4iKTsKKwkgICAgcmV0dXJuIGxlbjsKKwl9CisgICAgfSBlbHNlIHsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJObyBiZWFjb25zIHJlY2VpdmVkXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKK30KKworI2VuZGlmCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IGJ1aWxkX2F1dGhfZnJhbWUocmF5X2Rldl90ICpsb2NhbCwgVUNIQVIgKmRlc3QsIGludCBhdXRoX3R5cGUpCit7CisgICAgaW50IGFkZHI7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzOworICAgIHN0cnVjdCB0eF9tc2cgX19pb21lbSAqcHR4OworICAgIGludCBjY3NpbmRleDsKKworICAgIC8qIElmIG5vIHR4IGJ1ZmZlcnMgYXZhaWxhYmxlLCByZXR1cm4gKi8KKyAgICBpZiAoKGNjc2luZGV4ID0gZ2V0X2ZyZWVfdHhfY2NzKGxvY2FsKSkgPCAwKQorICAgIHsKKyAgICAgICAgREVCVUcoMSwicmF5X2NzIHNlbmQgYXV0aGVudGljYXRlIC0gTm8gZnJlZSB0eCBjY3NcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcGNjcyA9IGNjc19iYXNlKGxvY2FsKSArIGNjc2luZGV4OworCisgICAgLyogQWRkcmVzcyBpbiBjYXJkIHNwYWNlICovCisgICAgYWRkciA9IFRYX0JVRl9CQVNFICsgKGNjc2luZGV4IDw8IDExKTsKKyAgICAvKiBmaWxsIGluIHRoZSBDQ1MgKi8KKyAgICB3cml0ZWIoQ0NTX1RYX1JFUVVFU1QsICZwY2NzLT5jbWQpOworICAgIHdyaXRlYihhZGRyID4+IDgsIHBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfcHRyKTsKKyAgICB3cml0ZWIoMHgyMCwgcGNjcy0+dmFyLnR4X3JlcXVlc3QudHhfZGF0YV9wdHIgKyAxKTsKKyAgICB3cml0ZWIoVFhfQVVUSEVOVElDQVRFX0xFTkdUSF9NU0IsIHBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfbGVuZ3RoKTsKKyAgICB3cml0ZWIoVFhfQVVUSEVOVElDQVRFX0xFTkdUSF9MU0IscGNjcy0+dmFyLnR4X3JlcXVlc3QudHhfZGF0YV9sZW5ndGggKyAxKTsKKyAgICB3cml0ZWIoMCwgJnBjY3MtPnZhci50eF9yZXF1ZXN0LnBvd19zYXZfbW9kZSk7CisKKyAgICBwdHggPSBsb2NhbC0+c3JhbSArIGFkZHI7CisgICAgLyogZmlsbCBpbiB0aGUgbWFjIGhlYWRlciAqLworICAgIHdyaXRlYihQUk9UT0NPTF9WRVIgfCBBVVRIRU5USUNfVFlQRSwgJnB0eC0+bWFjLmZyYW1lX2N0bF8xKTsKKyAgICB3cml0ZWIoMCwgJnB0eC0+bWFjLmZyYW1lX2N0bF8yKTsKKworICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMSwgZGVzdCwgQUREUkxFTik7CisgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8yLCBsb2NhbC0+c3Bhcm0uYjQuYV9tYWNfYWRkciwgQUREUkxFTik7CisgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8zLCBsb2NhbC0+YnNzX2lkLCBBRERSTEVOKTsKKworICAgIC8qIEZpbGwgaW4gbXNnIGJvZHkgd2l0aCBwcm90b2NvbCAwMCAwMCwgc2VxdWVuY2UgMDEgMDAgLHN0YXR1cyAwMCAwMCAqLworICAgIG1lbXNldF9pbyhwdHgtPnZhciwgMCwgNik7CisgICAgd3JpdGViKGF1dGhfdHlwZSAmIDB4ZmYsIHB0eC0+dmFyICsgMik7CisKKyAgICAvKiBJbnRlcnJ1cHQgdGhlIGZpcm13YXJlIHRvIHByb2Nlc3MgdGhlIGNvbW1hbmQgKi8KKyAgICBpZiAoaW50ZXJydXB0X2VjZihsb2NhbCwgY2NzaW5kZXgpKSB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyBzZW5kIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZmFpbGVkIC0gRUNGIG5vdCByZWFkeSBmb3IgaW50clxuIik7CisgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0ZSRUUsICYocGNjcysrKS0+YnVmZmVyX3N0YXR1cyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIEVuZCBidWlsZF9hdXRoX2ZyYW1lICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHZvaWQgcmF5Y3Nfd3JpdGUoY29uc3QgY2hhciAqbmFtZSwgd3JpdGVfcHJvY190ICp3LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIGVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkobmFtZSwgU19JRlJFRyB8IFNfSVdVU1IsIE5VTEwpOworCWlmIChlbnRyeSkgeworCQllbnRyeS0+d3JpdGVfcHJvYyA9IHc7CisJCWVudHJ5LT5kYXRhID0gZGF0YTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZXNzaWQoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJc3RhdGljIGNoYXIgcHJvY19lc3NpZFszM107CisJaW50IGxlbiA9IGNvdW50OworCisJaWYgKGxlbiA+IDMyKQorCQlsZW4gPSAzMjsKKwltZW1zZXQocHJvY19lc3NpZCwgMCwgMzMpOworCWlmIChjb3B5X2Zyb21fdXNlcihwcm9jX2Vzc2lkLCBidWZmZXIsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWVzc2lkID0gcHJvY19lc3NpZDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfaW50KHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCXN0YXRpYyBjaGFyIHByb2NfbnVtYmVyWzEwXTsKKwljaGFyICpwOworCWludCBuciwgbGVuOworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY291bnQgPiA5KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY29weV9mcm9tX3VzZXIocHJvY19udW1iZXIsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlwID0gcHJvY19udW1iZXI7CisJbnIgPSAwOworCWxlbiA9IGNvdW50OworCWRvIHsKKwkJdW5zaWduZWQgaW50IGMgPSAqcCAtICcwJzsKKwkJaWYgKGMgPiA5KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW5yID0gbnIqMTAgKyBjOworCQlwKys7CisJfSB3aGlsZSAoLS1sZW4pOworCSooaW50ICopZGF0YSA9IG5yOworCXJldHVybiBjb3VudDsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgcmF5X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gInJheV9jcyIsCisJfSwKKwkuYXR0YWNoCQk9IHJheV9hdHRhY2gsCisJLmRldGFjaAkJPSByYXlfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9yYXlfY3Modm9pZCkKK3sKKyAgICBpbnQgcmM7CisgICAgCisgICAgREVCVUcoMSwgIiVzXG4iLCByY3NpZCk7CisgICAgcmMgPSBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZyYXlfZHJpdmVyKTsKKyAgICBERUJVRygxLCAicmF5bGluayBpbml0X21vZHVsZSByZWdpc3Rlcl9wY21jaWFfZHJpdmVyIHJldHVybnMgMHgleFxuIixyYyk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworICAgIHByb2NfbWtkaXIoImRyaXZlci9yYXlfY3MiLCBOVUxMKTsKKworICAgIGNyZWF0ZV9wcm9jX2luZm9fZW50cnkoImRyaXZlci9yYXlfY3MvcmF5X2NzIiwgMCwgTlVMTCwgJnJheV9jc19wcm9jX3JlYWQpOworICAgIHJheWNzX3dyaXRlKCJkcml2ZXIvcmF5X2NzL2Vzc2lkIiwgd3JpdGVfZXNzaWQsIE5VTEwpOworICAgIHJheWNzX3dyaXRlKCJkcml2ZXIvcmF5X2NzL25ldF90eXBlIiwgd3JpdGVfaW50LCAmbmV0X3R5cGUpOworICAgIHJheWNzX3dyaXRlKCJkcml2ZXIvcmF5X2NzL3RyYW5zbGF0ZSIsIHdyaXRlX2ludCwgJnRyYW5zbGF0ZSk7CisjZW5kaWYKKyAgICBpZiAodHJhbnNsYXRlICE9IDApIHRyYW5zbGF0ZSA9IDE7CisgICAgcmV0dXJuIDA7Cit9IC8qIGluaXRfcmF5X2NzICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcmF5X2NzKHZvaWQpCit7CisgICAgREVCVUcoMCwgInJheV9jczogY2xlYW51cF9tb2R1bGVcbiIpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyAgICByZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVyL3JheV9jcy9yYXlfY3MiLCBOVUxMKTsKKyAgICByZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVyL3JheV9jcy9lc3NpZCIsIE5VTEwpOworICAgIHJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvcmF5X2NzL25ldF90eXBlIiwgTlVMTCk7CisgICAgcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9yYXlfY3MvdHJhbnNsYXRlIiwgTlVMTCk7CisgICAgcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9yYXlfY3MiLCBOVUxMKTsKKyNlbmRpZgorCisgICAgcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZyYXlfZHJpdmVyKTsKKyAgICBCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9IC8qIGV4aXRfcmF5X2NzICovCisKK21vZHVsZV9pbml0KGluaXRfcmF5X2NzKTsKK21vZHVsZV9leGl0KGV4aXRfcmF5X2NzKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzdhZmExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmgKQEAgLTAsMCArMSw3OCBAQAorLyogUmF5dGhlb24gd2lyZWxlc3MgTEFOIFBDTUNJQSBjYXJkIGRyaXZlciBmb3IgTGludXggCisgICBBICBQQ01DSUEgY2xpZW50IGRyaXZlciBmb3IgdGhlIFJheWxpbmsgd2lyZWxlc3MgbmV0d29yayBjYXJkCisgICBXcml0dGVuIGJ5IENvcmV5IFRob21hcworKi8KKworI2lmbmRlZiBSQVlMSU5LX0gKKworc3RydWN0IGJlYWNvbl9yeCB7CisgICAgc3RydWN0IG1hY19oZWFkZXIgbWFjOworICAgIFVDSEFSIHRpbWVzdGFtcFs4XTsKKyAgICBVQ0hBUiBiZWFjb25faW50dmxbMl07CisgICAgVUNIQVIgY2FwYWJpbGl0eVsyXTsKKyAgICBVQ0hBUiBlbGVtZW50c1tzaXplb2Yoc3RydWN0IGVzc2lkX2VsZW1lbnQpIAorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IHJhdGVzX2VsZW1lbnQpCisgICAgICAgICAgICAgICAgICArIHNpemVvZihzdHJ1Y3QgZnJlcV9ob3BfZWxlbWVudCkgCisgICAgICAgICAgICAgICAgICArIHNpemVvZihzdHJ1Y3QgamFwYW5fY2FsbF9zaWduX2VsZW1lbnQpCisgICAgICAgICAgICAgICAgICArIHNpemVvZihzdHJ1Y3QgdGltX2VsZW1lbnQpXTsKK307CisKKy8qIFJldHVybiB2YWx1ZXMgZm9yIGdldF9mcmVleyxfdHh9X2NjcyAqLworI2RlZmluZSBFQ0NTRlVMTCAgKC0xKQorI2RlZmluZSBFQ0NTQlVTWSAgKC0yKQorI2RlZmluZSBFQ0FSREdPTkUgKC0zKQorCit0eXBlZGVmIHN0cnVjdCByYXlfZGV2X3QgeworICAgIGludCBjYXJkX3N0YXR1czsKKyAgICBpbnQgYXV0aGVudGljYXRpb25fc3RhdGU7CisgICAgZGV2X25vZGVfdCAgbm9kZTsKKyAgICB3aW5kb3dfaGFuZGxlX3QgYW1lbV9oYW5kbGU7ICAgLyogaGFuZGxlIHRvIHdpbmRvdyBmb3IgYXR0cmlidXRlIG1lbW9yeSAgKi8KKyAgICB3aW5kb3dfaGFuZGxlX3Qgcm1lbV9oYW5kbGU7ICAgLyogaGFuZGxlIHRvIHdpbmRvdyBmb3IgcnggYnVmZmVyIG9uIGNhcmQgKi8KKyAgICB2b2lkIF9faW9tZW0gKnNyYW07ICAgICAgICAgICAgLyogcG9pbnRlciB0byBiZWdpbm5pbmcgb2Ygc2hhcmVkIFJBTSAgICAgKi8KKyAgICB2b2lkIF9faW9tZW0gKmFtZW07ICAgICAgICAgICAgLyogcG9pbnRlciB0byBhdHRyaWJ1dGUgbWVtIHdpbmRvdyAgICAgICAgKi8KKyAgICB2b2lkIF9faW9tZW0gKnJtZW07ICAgICAgICAgICAgLyogcG9pbnRlciB0byByZWNlaXZlIGJ1ZmZlciB3aW5kb3cgICAgICAgKi8KKyAgICBkZXZfbGlua190ICpmaW5kZXI7ICAgICAgICAgICAgLyogcG9pbnRlciBiYWNrIHRvIGRldl9saW5rX3QgZm9yIGNhcmQgICAgKi8KKyAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKyAgICBsb25nIHR4X2Njc19sb2NrOworICAgIGxvbmcgY2NzX2xvY2s7CisgICAgaW50ICAgZGxfcGFyYW1fY2NzOworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IGI0X3N0YXJ0dXBfcGFyYW1zIGI0OworICAgICAgICBzdHJ1Y3QgYjVfc3RhcnR1cF9wYXJhbXMgYjU7CisgICAgfSBzcGFybTsKKyAgICBpbnQgdGltZW91dF9mbGFnOworICAgIFVDSEFSIHN1cHBvcnRlZF9yYXRlc1s4XTsKKyAgICBVQ0hBUiBqYXBhbl9jYWxsX3NpZ25bMTJdOworICAgIHN0cnVjdCBzdGFydHVwX3Jlc182IHN0YXJ0dXBfcmVzOworICAgIGludCBudW1fbXVsdGk7CisgICAgLyogTmV0d29yayBwYXJhbWV0ZXJzIGZyb20gc3RhcnQvam9pbiAqLworICAgIFVDSEFSIGJzc19pZFs2XTsKKyAgICBVQ0hBUiBhdXRoX2lkWzZdOworICAgIFVDSEFSIG5ldF9kZWZhdWx0X3R4X3JhdGU7CisgICAgVUNIQVIgZW5jcnlwdGlvbjsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworICAgIFVDSEFSIG5ldF90eXBlOworICAgIFVDSEFSIHN0YV90eXBlOworICAgIFVDSEFSIGZ3X3ZlcjsKKyAgICBVQ0hBUiBmd19ibGQ7CisgICAgVUNIQVIgZndfdmFyOworICAgIFVDSEFSIEFTSUNfdmVyc2lvbjsKKyAgICBVQ0hBUiBhc3NvY19pZFsyXTsKKyAgICBVQ0hBUiB0aWJfbGVuZ3RoOworICAgIFVDSEFSIGxhc3RfcnNsOworICAgIGludCBiZWFjb25fcnhlZDsKKyAgICBzdHJ1Y3QgYmVhY29uX3J4IGxhc3RfYmNuOworI2lmZGVmIFdJUkVMRVNTX0VYVAorICAgIGl3X3N0YXRzCXdzdGF0czsJCS8qIFdpcmVsZXNzIHNwZWNpZmljIHN0YXRzICovCisjZW5kaWYKKyNpZmRlZiBXSVJFTEVTU19TUFkKKyAgICBpbnQJCXNweV9udW1iZXI7CQkvKiBOdW1iZXIgb2YgYWRkcmVzc2VzIHRvIHNweSAqLworICAgIG1hY19hZGRyCXNweV9hZGRyZXNzW0lXX01BWF9TUFkgKyAxXTsJLyogVGhlIGFkZHJlc3NlcyB0byBzcHkgKi8KKyAgICBpd19xdWFsCXNweV9zdGF0W0lXX01BWF9TUFkgKyAxXTsJLyogU3RhdGlzdGljcyBnYXRoZXJlZCAqLworI2VuZGlmCS8qIFdJUkVMRVNTX1NQWSAqLworCit9IHJheV9kZXZfdDsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmIC8qIFJBWUxJTktfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5Y3RsLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXljdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWQ5YjI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5Y3RsLmgKQEAgLTAsMCArMSw3MzIgQEAKKyNpZm5kZWYgUkFZTElOS19ICisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBVQ0hBUjsKKworLyoqKioqKiBJRUVFIDgwMi4xMSBjb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBBRERSTEVOICAgICAgICAgICA2CisvKiBGcmFtZSBjb250cm9sIDEgYml0IGZpZWxkcyAqLworI2RlZmluZSBQUk9UT0NPTF9WRVIgICAgICAweDAwCisjZGVmaW5lIERBVEFfVFlQRSAgICAgICAgIDB4MDgKKyNkZWZpbmUgQVNTT0NfUkVRX1RZUEUgICAgMHgwMAorI2RlZmluZSBBU1NPQ19SRVNQX1RZUEUgICAweDEwCisjZGVmaW5lIFJFQVNTT0NfUkVRX1RZUEUgIDB4MjAKKyNkZWZpbmUgUkVBU1NPQ19SRVNQX1RZUEUgMHgzMAorI2RlZmluZSBOVUxMX01TR19UWVBFICAgICAweDQ4CisjZGVmaW5lIEJFQUNPTl9UWVBFICAgICAgIDB4ODAKKyNkZWZpbmUgRElTQVNTT0NfVFlQRSAgICAgMHhBMAorI2RlZmluZSBQU1BPTExfVFlQRSAgICAgICAweEE0CisjZGVmaW5lIEFVVEhFTlRJQ19UWVBFICAgIDB4QjAKKyNkZWZpbmUgREVBVVRIRU5USUNfVFlQRSAgMHhDMAorLyogRnJhbWUgY29udHJvbCAyIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgRkMyX1RPX0RTICAgICAgICAgMHgwMQorI2RlZmluZSBGQzJfRlJPTV9EUyAgICAgICAweDAyCisjZGVmaW5lIEZDMl9NT1JFX0ZSQUcgICAgIDB4MDQKKyNkZWZpbmUgRkMyX1JFVFJZICAgICAgICAgMHgwOAorI2RlZmluZSBGQzJfUFNNICAgICAgICAgICAweDEwCisjZGVmaW5lIEZDMl9NT1JFX0RBVEEgICAgIDB4MjAKKyNkZWZpbmUgRkMyX1dFUCAgICAgICAgICAgMHg0MAorI2RlZmluZSBGQzJfT1JERVIgICAgICAgICAweDgwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiA4MDIuMTEgZWxlbWVudCBJRCdzIGFuZCBsZW5ndGhzICovCisjZGVmaW5lIENfQlBfQ0FQQUJJTElUWV9FU1MgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBDX0JQX0NBUEFCSUxJVFlfSUJTUyAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQ19CUF9DQVBBQklMSVRZX0NGX1BPTExBQkxFICAgICAweDA0CisjZGVmaW5lIENfQlBfQ0FQQUJJTElUWV9DRl9QT0xMX1JFUVVFU1QgMHgwOAorI2RlZmluZSBDX0JQX0NBUEFCSUxJVFlfUFJJVkFDWSAgICAgICAgIDB4MTAKKworI2RlZmluZSBDX0VTU0lEX0VMRU1FTlRfSUQgICAgICAgICAgICAgICAwCisjZGVmaW5lIENfRVNTSURfRUxFTUVOVF9NQVhfTEVOR1RIICAgICAgIDMyCisKKyNkZWZpbmUgQ19TVVBQT1JURURfUkFURVNfRUxFTUVOVF9JRCAgICAgMQorI2RlZmluZSBDX1NVUFBPUlRFRF9SQVRFU19FTEVNRU5UX0xFTkdUSCAyCisKKyNkZWZpbmUgQ19GSF9QQVJBTV9TRVRfRUxFTUVOVF9JRCAgICAgICAgMgorI2RlZmluZSBDX0ZIX1BBUkFNX1NFVF9FTEVNRU5UX0xOR1RIICAgICA1CisKKyNkZWZpbmUgQ19DRl9QQVJBTV9TRVRfRUxFTUVOVF9JRCAgICAgICAgNAorI2RlZmluZSBDX0NGX1BBUkFNX1NFVF9FTEVNRU5UX0xOR1RIICAgICA2CisKKyNkZWZpbmUgQ19USU1fRUxFTUVOVF9JRCAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBDX1RJTV9CSVRNQVBfTEVOR1RIICAgICAgICAgICAgMjUxCisjZGVmaW5lIENfVElNX0JNQ0FTVF9CSVQgICAgICAgICAgICAgIDB4MDEKKworI2RlZmluZSBDX0lCU1NfRUxFTUVOVF9JRCAgICAgICAgICAgICAgICA2CisjZGVmaW5lIENfSUJTU19FTEVNRU5UX0xFTkdUSCAgICAgICAgICAgIDIKKworI2RlZmluZSBDX0pBUEFOX0NBTExfU0lHTl9FTEVNRU5UX0lEICAgIDUxCisjZGVmaW5lIENfSkFQQU5fQ0FMTF9TSUdOX0VMRU1FTlRfTE5HVEggMTIKKworI2RlZmluZSBDX0RJU0FTU09DX1JFQVNPTl9DT0RFX0xFTiAgICAgICAyCisjZGVmaW5lIENfRElTQVNTT0NfUkVBU09OX0NPREVfREVGQVVMVCAgIDgKKworI2RlZmluZSBDX0NSQ19MRU4gICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIENfTlVNX1NVUFBPUlRFRF9SQVRFUyAgICAgICAgICAgIDggCisvKioqKioqIElFRUUgODAyLjExIG1hYyBoZWFkZXIgZm9yIHR5cGUgZGF0YSBwYWNrZXRzICoqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgbWFjX2hlYWRlciB7CisgIFVDSEFSIGZyYW1lX2N0bF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIFVDSEFSIGZyYW1lX2N0bF8yOworICBVQ0hBUiBkdXJhdGlvbl9sc2I7CisgIFVDSEFSIGR1cmF0aW9uX21zYjsKKyAgVUNIQVIgYWRkcl8xW0FERFJMRU5dOworICBVQ0hBUiBhZGRyXzJbQUREUkxFTl07CisgIFVDSEFSIGFkZHJfM1tBRERSTEVOXTsKKyAgVUNIQVIgc2VxX2ZyYWdfbnVtWzJdOworLyogIFVDSEFSIGFkZHJfNFtBRERSTEVOXTsgKi8vKiBvbmx5IHByZXNlbnQgZm9yIEFQIHRvIEFQIChUTyBEUyBhbmQgRlJPTSBEUyAqLworfTsKKy8qKioqKiogSUVFRSA4MDIuMTEgZnJhbWUgZWxlbWVudCBzdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBlc3NpZF9lbGVtZW50Cit7CisgIFVDSEFSIGlkOworICBVQ0hBUiBsZW5ndGg7CisgIFVDSEFSIHRleHRbQ19FU1NJRF9FTEVNRU5UX01BWF9MRU5HVEhdOworfTsKK3N0cnVjdCByYXRlc19lbGVtZW50Cit7CisgIFVDSEFSIGlkOworICBVQ0hBUiBsZW5ndGg7CisgIFVDSEFSIHZhbHVlWzhdOworfTsKK3N0cnVjdCBmcmVxX2hvcF9lbGVtZW50Cit7CisgIFVDSEFSIGlkOworICBVQ0hBUiBsZW5ndGg7CisgIFVDSEFSIGR3ZWxsX3RpbWVbMl07CisgIFVDSEFSIGhvcF9zZXQ7CisgIFVDSEFSIGhvcF9wYXR0ZXJuOworICBVQ0hBUiBob3BfaW5kZXg7Cit9Oworc3RydWN0IHRpbV9lbGVtZW50Cit7CisgIFVDSEFSIGlkOworICBVQ0hBUiBsZW5ndGg7CisgIFVDSEFSIGR0aW1fY291bnQ7CisgIFVDSEFSIGR0aW1fcGVyaW9kOyAgICAKKyAgVUNIQVIgYml0bWFwX2NvbnRyb2w7CisgIFVDSEFSIHRpbVtDX1RJTV9CSVRNQVBfTEVOR1RIXTsKK307CitzdHJ1Y3QgaWJzc19lbGVtZW50Cit7CisgIFVDSEFSIGlkOworICBVQ0hBUiBsZW5ndGg7CisgIFVDSEFSIGF0aW1fd2luZG93WzJdOworfTsKK3N0cnVjdCBqYXBhbl9jYWxsX3NpZ25fZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiBjYWxsX3NpZ25bMTJdOworfTsKKy8qKioqKiogQmVhY29uIG1lc3NhZ2Ugc3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIC5lbGVtZW50cyBpcyBhIGxhcmdlIGx1bXAgb2YgbWF4IHNpemUgYmVjYXVzZSBlbGVtZW50cyBhcmUgdmFyaWFibGUgc2l6ZSAgKi8KK3N0cnVjdCBpbmZyYV9iZWFjb24KK3sKKyAgICBVQ0hBUiB0aW1lc3RhbXBbOF07CisgICAgVUNIQVIgYmVhY29uX2ludHZsWzJdOworICAgIFVDSEFSIGNhcGFiaWxpdHlbMl07CisgICAgVUNIQVIgZWxlbWVudHNbc2l6ZW9mKHN0cnVjdCBlc3NpZF9lbGVtZW50KSAKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCByYXRlc19lbGVtZW50KQorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGZyZXFfaG9wX2VsZW1lbnQpIAorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGphcGFuX2NhbGxfc2lnbl9lbGVtZW50KQorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IHRpbV9lbGVtZW50KV07Cit9Oworc3RydWN0IGFkaG9jX2JlYWNvbgoreworICAgIFVDSEFSIHRpbWVzdGFtcFs4XTsKKyAgICBVQ0hBUiBiZWFjb25faW50dmxbMl07CisgICAgVUNIQVIgY2FwYWJpbGl0eVsyXTsKKyAgICBVQ0hBUiBlbGVtZW50c1tzaXplb2Yoc3RydWN0IGVzc2lkX2VsZW1lbnQpIAorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IHJhdGVzX2VsZW1lbnQpCisgICAgICAgICAgICAgICAgICArIHNpemVvZihzdHJ1Y3QgZnJlcV9ob3BfZWxlbWVudCkgCisgICAgICAgICAgICAgICAgICArIHNpemVvZihzdHJ1Y3QgamFwYW5fY2FsbF9zaWduX2VsZW1lbnQpCisgICAgICAgICAgICAgICAgICArIHNpemVvZihzdHJ1Y3QgaWJzc19lbGVtZW50KV07Cit9OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogI2RlZmluZSBDX01BQ19IRFJfMl9XRVAgMHg0MCAqLworLyogVFgvUlggQ0NTIGNvbnN0YW50cyAqLworI2RlZmluZSBUWF9IRUFERVJfTEVOR1RIIDB4MUMKKyNkZWZpbmUgUlhfTUFDX0hFQURFUl9MRU5HVEggMHgxOAorI2RlZmluZSBUWF9BVVRIRU5USUNBVEVfTEVOR1RIIChUWF9IRUFERVJfTEVOR1RIICsgNikKKyNkZWZpbmUgVFhfQVVUSEVOVElDQVRFX0xFTkdUSF9NU0IgKFRYX0FVVEhFTlRJQ0FURV9MRU5HVEggPj4gOCkKKyNkZWZpbmUgVFhfQVVUSEVOVElDQVRFX0xFTkdUSF9MU0IgKFRYX0FVVEhFTlRJQ0FURV9MRU5HVEggJiAweGZmKQorI2RlZmluZSBUWF9ERUFVVEhFTlRJQ0FURV9MRU5HVEggKFRYX0hFQURFUl9MRU5HVEggKyAyKQorI2RlZmluZSBUWF9ERUFVVEhFTlRJQ0FURV9MRU5HVEhfTVNCIChUWF9BVVRIRU5USUNBVEVfTEVOR1RIID4+IDgpCisjZGVmaW5lIFRYX0RFQVVUSEVOVElDQVRFX0xFTkdUSF9MU0IgKFRYX0FVVEhFTlRJQ0FURV9MRU5HVEggJiAweGZmKQorI2RlZmluZSBGQ1NfTEVOICAgICAgICAgICA0CisKKyNkZWZpbmUgQURIT0MgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5GUkEgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBUWVBFX1NUQSAgICAgICAgICAgICAgMAorI2RlZmluZSBUWVBFX0FQICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFBBU1NJVkVfU0NBTiAgICAgICAgICAxCisjZGVmaW5lIEFDVElWRV9TQ0FOICAgICAgICAgICAxCisKKyNkZWZpbmUgUFNNX0NBTSAgICAgICAgICAgICAgIDAKKworLyogQ291bnRyeSBjb2RlcyAqLworI2RlZmluZSBVU0EgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBFVVJPUEUgICAgICAgICAgICAgICAgMgorI2RlZmluZSBKQVBBTiAgICAgICAgICAgICAgICAgMworI2RlZmluZSBLT1JFQSAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBTUEFJTiAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBGUkFOQ0UgICAgICAgICAgICAgICAgNgorI2RlZmluZSBJU1JBRUwgICAgICAgICAgICAgICAgNworI2RlZmluZSBBVVNUUkFMSUEgICAgICAgICAgICAgOAorI2RlZmluZSBKQVBBTl9URVNUICAgICAgICAgICAgOQorCisvKiBIb3AgcGF0dGVybiBsZW5ndGhzICovCisjZGVmaW5lIFVTQV9IT1BfTU9EICAgICAgICAgIDc5IAorI2RlZmluZSBFVVJPUEVfSE9QX01PRCAgICAgICA3OSAKKyNkZWZpbmUgSkFQQU5fSE9QX01PRCAgICAgICAgMjMKKyNkZWZpbmUgS09SRUFfSE9QX01PRCAgICAgICAgMjMKKyNkZWZpbmUgU1BBSU5fSE9QX01PRCAgICAgICAgMjcKKyNkZWZpbmUgRlJBTkNFX0hPUF9NT0QgICAgICAgMzUKKyNkZWZpbmUgSVNSQUVMX0hPUF9NT0QgICAgICAgMzUKKyNkZWZpbmUgQVVTVFJBTElBX0hPUF9NT0QgICAgNDcKKyNkZWZpbmUgSkFQQU5fVEVTVF9IT1BfTU9EICAgMjMKKworI2RlZmluZSBFU1NJRF9TSVpFICAgICAgICAgICAzMgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDSVMgUmVnaXN0ZXIgQ29uc3RhbnRzICovCisjZGVmaW5lIENJU19PRkZTRVQgICAgICAgICAgICAgMHgwZjAwCisvKiBDb25maWd1cmF0aW9uIE9wdGlvbiBSZWdpc3RlciAoMHgwRjAwKSAqLworI2RlZmluZSBDT1JfT0ZGU0VUICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQ09SX1NPRlRfUkVTRVQgICAgICAgICAweDgwCisjZGVmaW5lIENPUl9MRVZFTF9JUlEgICAgICAgICAgMHg0MAorI2RlZmluZSBDT1JfQ09ORklHX05VTSAgICAgICAgIDB4MDEKKyNkZWZpbmUgQ09SX0RFRkFVTFQgICAgICAgICAgICAoQ09SX0xFVkVMX0lSUSB8IENPUl9DT05GSUdfTlVNKQorCisvKiBDYXJkIENvbmZpZ3VyYXRpb24gYW5kIFN0YXR1cyBSZWdpc3RlciAoMHgwRjAxKSAqLworI2RlZmluZSBDQ1NSX09GRlNFVCAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQ0NTUl9IT1NUX0lOVFJfUEVORElORyAweDAxCisjZGVmaW5lIENDU1JfUE9XRVJfRE9XTiAgICAgICAgMHgwNAorCisvKiBIQ1MgSW50ZXJydXB0IFJlZ2lzdGVyICgweDBGMDUpICovCisjZGVmaW5lIEhDU19JTlRSX09GRlNFVCAgICAgICAgMHgwNQorLyogI2RlZmluZSBIQ1NfSU5UUl9PRkZTRVQgICAgICAgIDB4MEEgKi8KKyNkZWZpbmUgSENTX0lOVFJfQ0xFQVIgICAgICAgICAweDAwCisKKy8qIEVDRiBJbnRlcnJ1cHQgUmVnaXN0ZXIgKDB4MEYwNikgKi8KKyNkZWZpbmUgRUNGX0lOVFJfT0ZGU0VUICAgICAgICAweDA2CisvKiAjZGVmaW5lIEVDRl9JTlRSX09GRlNFVCAgICAgICAgMHgwQyAqLworI2RlZmluZSBFQ0ZfSU5UUl9TRVQgICAgICAgICAgIDB4MDEKKworLyogQXV0aG9yaXphdGlvbiBSZWdpc3RlciAwICgweDBGMDgpICovCisjZGVmaW5lIEFVVEhfMF9PTiAgICAgICAgICAgICAgMHg1NworCisvKiBBdXRob3JpemF0aW9uIFJlZ2lzdGVyIDEgKDB4MEYwOSkgKi8KKyNkZWZpbmUgQVVUSF8xX09OICAgICAgICAgICAgICAweDgyCisKKy8qIFByb2dyYW0gTW9kZSBSZWdpc3RlciAoMHgwRjBBKSAqLworI2RlZmluZSBQQzJQTSAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUEMyQ0FMICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFBDMk1MU0UgICAgICAgICAgICAgICAgMHgyMAorCisvKiBQQyBUZXN0IE1vZGUgUmVnaXN0ZXIgKDB4MEYwQikgKi8KKyNkZWZpbmUgUENfVEVTVF9NT0RFICAgICAgICAgICAweDA4CisKKy8qIEZyZXF1ZW5jeSBDb250cm9sIFdvcmQgKDB4MEYxMCkgKi8KKy8qIFJhbmdlIDB4MDIgLSAweEE2ICovCisKKy8qIFRlc3QgTW9kZSBDb250cm9sIDEtNCAoMHgwRjE0IC0gMHgwRjE3KSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU2hhcmVkIFJBTSBBcmVhICovCisjZGVmaW5lIFNDQl9CQVNFICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFNUQVRVU19CQVNFICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEhPU1RfVE9fRUNGX0JBU0UgICAgICAgMHgwMjAwCisjZGVmaW5lIEVDRl9UT19IT1NUX0JBU0UgICAgICAgMHgwMzAwCisjZGVmaW5lIENDU19CQVNFICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFJDU19CQVNFICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIElORlJBX1RJTV9CQVNFICAgICAgICAgMHgwQzAwCisjZGVmaW5lIFNTSURfTElTVF9CQVNFICAgICAgICAgMHgwRDAwCisjZGVmaW5lIFRYX0JVRl9CQVNFICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFJYX0JVRl9CQVNFICAgICAgICAgICAgMHg4MDAwCisKKyNkZWZpbmUgTlVNQkVSX09GX0NDUyAgICA2NAorI2RlZmluZSBOVU1CRVJfT0ZfUkNTICAgIDY0CisvKiNkZWZpbmUgTlVNQkVSX09GX1RYX0NDUyAxNCAqLworI2RlZmluZSBOVU1CRVJfT0ZfVFhfQ0NTIDE0CisKKyNkZWZpbmUgVFhfQlVGX1NJWkUgICAgICAoMjA0OCAtIHNpemVvZihzdHJ1Y3QgdHhfbXNnKSkKKyNkZWZpbmUgUlhfQlVGRl9FTkQgICAgICAweDNGRkYKKy8qIFZhbHVlcyBmb3IgYnVmZmVyX3N0YXR1cyAqLworI2RlZmluZSBDQ1NfQlVGRkVSX0ZSRUUgICAgICAgMAorI2RlZmluZSBDQ1NfQlVGRkVSX0JVU1kgICAgICAgMQorI2RlZmluZSBDQ1NfQ09NTUFORF9DT01QTEVURSAgMgorI2RlZmluZSBDQ1NfQ09NTUFORF9GQUlMRUQgICAgMworCisvKiBWYWx1ZXMgZm9yIGNtZCAqLworI2RlZmluZSBDQ1NfRE9XTkxPQURfU1RBUlRVUF9QQVJBTVMgICAgMQorI2RlZmluZSBDQ1NfVVBEQVRFX1BBUkFNUyAgICAgICAgICAgICAgMgorI2RlZmluZSBDQ1NfUkVQT1JUX1BBUkFNUyAgICAgICAgICAgICAgMworI2RlZmluZSBDQ1NfVVBEQVRFX01VTFRJQ0FTVF9MSVNUICAgICAgNAorI2RlZmluZSBDQ1NfVVBEQVRFX1BPV0VSX1NBVklOR1NfTU9ERSAgNQorI2RlZmluZSBDQ1NfU1RBUlRfTkVUV09SSyAgICAgICAgICAgICAgNgorI2RlZmluZSBDQ1NfSk9JTl9ORVRXT1JLICAgICAgICAgICAgICAgNworI2RlZmluZSBDQ1NfU1RBUlRfQVNTT0NJQVRJT04gICAgICAgICAgOAorI2RlZmluZSBDQ1NfVFhfUkVRVUVTVCAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBDQ1NfVEVTVF9NRU1PUlkgICAgICAgICAgICAgIDB4YQorI2RlZmluZSBDQ1NfU0hVVERPV04gICAgICAgICAgICAgICAgIDB4YgorI2RlZmluZSBDQ1NfRFVNUF9NRU1PUlkgICAgICAgICAgICAgIDB4YworI2RlZmluZSBDQ1NfU1RBUlRfVElNRVIgICAgICAgICAgICAgIDB4ZQorI2RlZmluZSBDQ1NfTEFTVF9DTUQgICAgICAgICAgICAgICAgIENDU19TVEFSVF9USU1FUgorCisvKiBWYWx1ZXMgZm9yIGxpbmsgZmllbGQgKi8KKyNkZWZpbmUgQ0NTX0VORF9MSVNUICAgICAgICAgICAgICAgICAweGZmCisKKy8qIHZhbHVlcyBmb3IgYnVmZmVyX3N0YXR1cyBmaWVsZCAqLworI2RlZmluZSBSQ1NfQlVGRkVSX0ZSRUUgICAgICAgMAorI2RlZmluZSBSQ1NfQlVGRkVSX0JVU1kgICAgICAgMQorI2RlZmluZSBSQ1NfQ09NUExFVEUgICAgICAgICAgMgorI2RlZmluZSBSQ1NfRkFJTEVEICAgICAgICAgICAgMworI2RlZmluZSBSQ1NfQlVGRkVSX1JFTEVBU0UgICAgMHhGRgorCisvKiB2YWx1ZXMgZm9yIGludGVycnVwdF9pZCBmaWVsZCAqLworI2RlZmluZSBQUk9DRVNTX1JYX1BBQ0tFVCAgICAgICAgICAgMHg4MCAvKiAqLworI2RlZmluZSBSRUpPSU5fTkVUX0NPTVBMRVRFICAgICAgICAgMHg4MSAvKiBSQ1MgSUQ6IFJlam9pbiBOZXQgQ29tcGxldGUgKi8KKyNkZWZpbmUgUk9BTUlOR19JTklUSUFURUQgICAgICAgICAgIDB4ODIgLyogUkNTIElEOiBSb2FtaW5nIEluaXRpYXRlZCAgICovCisjZGVmaW5lIEpBUEFOX0NBTExfU0lHTl9SWEQgICAgICAgICAweDgzIC8qIFJDUyBJRDogTmV3IEphcGFuIENhbGwgU2lnbiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNZW1vcnkgdHlwZXMgZm9yIGR1bXAgbWVtb3J5IGNvbW1hbmQgKi8KKyNkZWZpbmUgQ19NRU1fUFJPRyAgMAorI2RlZmluZSBDX01FTV9YREFUQSAxCisjZGVmaW5lIENfTUVNX1NGUiAgIDIKKyNkZWZpbmUgQ19NRU1fSURBVEEgMworCisvKioqIFJldHVybiB2YWx1ZXMgZm9yIGh3X3htaXQgKioqKioqKioqKi8KKyNkZWZpbmUgWE1JVF9PSyAgICAgICAgKDApCisjZGVmaW5lIFhNSVRfTVNHX0JBRCAgICgtMSkKKyNkZWZpbmUgWE1JVF9OT19DQ1MgICAgKC0yKQorI2RlZmluZSBYTUlUX05PX0lOVFIgICAoLTMpCisjZGVmaW5lIFhNSVRfTkVFRF9BVVRIICgtNCkKKworLyoqKiBWYWx1ZXMgZm9yIGNhcmQgc3RhdHVzICovCisjZGVmaW5lIENBUkRfSU5TRVJURUQgICAgICAgKDApCisKKyNkZWZpbmUgQ0FSRF9BV0FJVElOR19QQVJBTSAoMSkKKyNkZWZpbmUgQ0FSRF9JTklUX0VSUk9SICAgICAoMTEpCisKKyNkZWZpbmUgQ0FSRF9ETF9QQVJBTSAgICAgICAoMikKKyNkZWZpbmUgQ0FSRF9ETF9QQVJBTV9FUlJPUiAoMTIpCisKKyNkZWZpbmUgQ0FSRF9ET0lOR19BQ1EgICAgICAoMykKKworI2RlZmluZSBDQVJEX0FDUV9DT01QTEVURSAgICg0KQorI2RlZmluZSBDQVJEX0FDUV9GQUlMRUQgICAgICgxNCkKKworI2RlZmluZSBDQVJEX0FVVEhfQ09NUExFVEUgICg1KQorI2RlZmluZSBDQVJEX0FVVEhfUkVGVVNFRCAgICgxNSkKKworI2RlZmluZSBDQVJEX0FTU09DX0NPTVBMRVRFICg2KQorI2RlZmluZSBDQVJEX0FTU09DX0ZBSUxFRCAgICgxNikKKworLyoqKiBWYWx1ZXMgZm9yIGF1dGhlbnRpY2F0aW9uX3N0YXRlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBVTkFVVEhFTlRJQ0FURUQgICAgICgwKQorI2RlZmluZSBBV0FJVElOR19SRVNQT05TRSAgICgxKQorI2RlZmluZSBBVVRIRU5USUNBVEVEICAgICAgICgyKQorI2RlZmluZSBORUVEX1RPX0FVVEggICAgICAgICgzKQorCisvKioqIFZhbHVlcyBmb3IgYXV0aGVudGljYXRpb24gdHlwZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE9QRU5fQVVUSF9SRVFVRVNUICAgKDEpCisjZGVmaW5lIE9QRU5fQVVUSF9SRVNQT05TRSAgKDIpCisjZGVmaW5lIEJST0FEQ0FTVF9ERUFVVEggICAgKDB4YzApCisvKioqIFZhbHVlcyBmb3IgdGltZXIgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFRPRE9fTk9USElORyAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFRPRE9fVkVSSUZZX0RMX1NUQVJUICAgICAgKC0xKQorI2RlZmluZSBUT0RPX1NUQVJUX05FVCAgICAgICAgICAgICgtMikKKyNkZWZpbmUgVE9ET19KT0lOX05FVCAgICAgICAgICAgICAoLTMpCisjZGVmaW5lIFRPRE9fQVVUSEVOVElDQVRFX1RJTUVPVVQgKC00KQorI2RlZmluZSBUT0RPX1NFTkRfQ0NTICAgICAgICAgICAgICgtNSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBhcmFtZXRlciBwYXNzaW5nIHN0cnVjdHVyZSBmb3IgdXBkYXRlL3JlcG9ydCBwYXJhbWV0ZXIgQ0NTJ3MgKi8KK3N0cnVjdCBvYmplY3RfaWQgeworICAgIHZvaWQgICAgICAgICAgKm9iamVjdF9hZGRyOworICAgIHVuc2lnbmVkIGNoYXIgb2JqZWN0X2xlbmd0aDsKK307CisKKyNkZWZpbmUgT0JKSURfbmV0d29ya190eXBlICAgICAgICAgICAgMAorI2RlZmluZSBPQkpJRF9hY3RpbmdfYXNfYXBfc3RhdHVzICAgICAxCisjZGVmaW5lIE9CSklEX2N1cnJlbnRfZXNzX2lkICAgICAgICAgIDIKKyNkZWZpbmUgT0JKSURfc2Nhbm5pbmdfbW9kZSAgICAgICAgICAgMworI2RlZmluZSBPQkpJRF9wb3dlcl9tZ3Rfc3RhdGUgICAgICAgICA0CisjZGVmaW5lIE9CSklEX21hY19hZGRyZXNzICAgICAgICAgICAgIDUKKyNkZWZpbmUgT0JKSURfZnJhZ190aHJlc2hvbGQgICAgICAgICAgNgorI2RlZmluZSBPQkpJRF9ob3BfdGltZSAgICAgICAgICAgICAgICA3CisjZGVmaW5lIE9CSklEX2JlYWNvbl9wZXJpb2QgICAgICAgICAgIDgKKyNkZWZpbmUgT0JKSURfZHRpbV9wZXJpb2QgICAgICAgICAgICAgOQorI2RlZmluZSBPQkpJRF9yZXRyeV9tYXggICAgICAgICAgICAgIDEwCisjZGVmaW5lIE9CSklEX2Fja190aW1lb3V0ICAgICAgICAgICAgMTEKKyNkZWZpbmUgT0JKSURfc2lmcyAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBPQkpJRF9kaWZzICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIE9CSklEX3BpZnMgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgT0JKSURfcnRzX3RocmVzaG9sZCAgICAgICAgICAxNQorI2RlZmluZSBPQkpJRF9zY2FuX2R3ZWxsX3RpbWUgICAgICAgIDE2CisjZGVmaW5lIE9CSklEX21heF9zY2FuX2R3ZWxsX3RpbWUgICAgMTcKKyNkZWZpbmUgT0JKSURfYXNzb2NfcmVzcF90aW1lb3V0ICAgICAxOAorI2RlZmluZSBPQkpJRF9hZGhvY19zY2FuX2N5Y2xlX21heCAgIDE5CisjZGVmaW5lIE9CSklEX2luZnJhX3NjYW5fY3ljbGVfbWF4ICAgMjAKKyNkZWZpbmUgT0JKSURfaW5mcmFfc3VwZXJfY3ljbGVfbWF4ICAyMQorI2RlZmluZSBPQkpJRF9wcm9taXNjdW91c19tb2RlICAgICAgIDIyCisjZGVmaW5lIE9CSklEX3VuaXF1ZV93b3JkICAgICAgICAgICAgMjMKKyNkZWZpbmUgT0JKSURfc2xvdF90aW1lICAgICAgICAgICAgICAyNAorI2RlZmluZSBPQkpJRF9yb2FtaW5nX2xvd19zbnIgICAgICAgIDI1CisjZGVmaW5lIE9CSklEX2xvd19zbnJfY291bnRfdGhyZXNoICAgMjYKKyNkZWZpbmUgT0JKSURfaW5mcmFfbWlzc2VkX2JjbiAgICAgICAyNworI2RlZmluZSBPQkpJRF9hZGhvY19taXNzZWRfYmNuICAgICAgIDI4CisjZGVmaW5lIE9CSklEX2N1cnJfY291bnRyeV9jb2RlICAgICAgMjkKKyNkZWZpbmUgT0JKSURfaG9wX3BhdHRlcm4gICAgICAgICAgICAzMAorI2RlZmluZSBPQkpJRF9yZXNlcnZlZCAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIE9CSklEX2N3X21heF9tc2IgICAgICAgICAgICAgMzIKKyNkZWZpbmUgT0JKSURfY3dfbWluX21zYiAgICAgICAgICAgICAzMworI2RlZmluZSBPQkpJRF9ub2lzZV9maWx0ZXJfZ2FpbiAgICAgIDM0CisjZGVmaW5lIE9CSklEX25vaXNlX2xpbWl0X29mZnNldCAgICAgMzUKKyNkZWZpbmUgT0JKSURfZGV0X3Jzc2lfdGhyZXNoX29mZnNldCAzNgorI2RlZmluZSBPQkpJRF9tZWRfYnVzeV90aHJlc2hfb2Zmc2V0IDM3CisjZGVmaW5lIE9CSklEX2RldF9zeW5jX3RocmVzaCAgICAgICAgMzgKKyNkZWZpbmUgT0JKSURfdGVzdF9tb2RlICAgICAgICAgICAgICAzOQorI2RlZmluZSBPQkpJRF90ZXN0X21pbl9jaGFuX251bSAgICAgIDQwCisjZGVmaW5lIE9CSklEX3Rlc3RfbWF4X2NoYW5fbnVtICAgICAgNDEKKyNkZWZpbmUgT0JKSURfYWxsb3dfYmNhc3RfSURfcHJicnNwICA0MgorI2RlZmluZSBPQkpJRF9wcml2YWN5X211c3Rfc3RhcnQgICAgIDQzCisjZGVmaW5lIE9CSklEX3ByaXZhY3lfY2FuX2pvaW4gICAgICAgNDQKKyNkZWZpbmUgT0JKSURfYmFzaWNfcmF0ZV9zZXQgICAgICAgICA0NQorCisvKioqKiBDb25maWd1cmF0aW9uL1N0YXR1cy9Db250cm9sIEFyZWEgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgU3lzdGVtIENvbnRyb2wgQmxvY2sgKFNDQikgQXJlYQorICogICAgTG9jYXRlZCBhdCBTaGFyZWQgUkFNIG9mZnNldCAwCisgKi8KK3N0cnVjdCBzY2IgeworICAgIFVDSEFSIGNjc19pbmRleDsKKyAgICBVQ0hBUiByY3NfaW5kZXg7Cit9OworCisvKioqKioqIFN0YXR1cyBhcmVhIGF0IFNoYXJlZCBSQU0gb2Zmc2V0IDB4MDEwMCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3Qgc3RhdHVzIHsKKyAgICBVQ0hBUiBtcnhfb3ZlcmZsb3dfZm9yX2hvc3Q7ICAgICAgICAgLyogMD1FQ0YgbWF5IHdyaXRlLCAxPWhvc3QgbWF5IHdyaXRlKi8KKyAgICBVQ0hBUiBtcnhfY2hlY2tzdW1fZXJyb3JfZm9yX2hvc3Q7ICAgLyogMD1FQ0YgbWF5IHdyaXRlLCAxPWhvc3QgbWF5IHdyaXRlKi8KKyAgICBVQ0hBUiByeF9oZWNfZXJyb3JfZm9yX2hvc3Q7ICAgICAgICAgLyogMD1FQ0YgbWF5IHdyaXRlLCAxPWhvc3QgbWF5IHdyaXRlKi8KKyAgICBVQ0hBUiByZXNlcnZlZDE7CisgICAgc2hvcnQgbXJ4X292ZXJmbG93OyAgICAgICAgICAgICAgICAgIC8qIEVDRiBpbmNyZW1lbnRzIG9uIHJ4IG92ZXJmbG93ICAgICovCisgICAgc2hvcnQgbXJ4X2NoZWNrc3VtX2Vycm9yOyAgICAgICAgICAgIC8qIEVDRiBpbmNyZW1lbnRzIG9uIHJ4IENSQyBlcnJvciAgICovCisgICAgc2hvcnQgcnhfaGVjX2Vycm9yOyAgICAgICAgICAgICAgICAgIC8qIEVDRiBpbmNzIG9uIG1hYyBoZWFkZXIgQ1JDIGVycm9yICovCisgICAgVUNIQVIgcnhub2lzZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEF2ZXJhZ2UgUlNMIG1lYXN1cmVtZW50ICAgICAgICAgICovCit9OworCisvKioqKioqIEhvc3QtdG8tRUNGIERhdGEgQXJlYSBhdCBTaGFyZWQgUkFNIG9mZnNldCAweDIwMCAqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgaG9zdF90b19lY2ZfYXJlYSB7CisgICAgCit9OworCisvKioqKioqIEVDRi10by1Ib3N0IERhdGEgQXJlYSBhdCBTaGFyZWQgUkFNIG9mZnNldCAweDAzMDAgKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3Qgc3RhcnR1cF9yZXNfNTE4IHsKKyAgICBVQ0hBUiBzdGFydHVwX3dvcmQ7CisgICAgVUNIQVIgc3RhdGlvbl9hZGRyW0FERFJMRU5dOworICAgIFVDSEFSIGNhbGNfcHJvZ19jaGtzdW07CisgICAgVUNIQVIgY2FsY19jaXNfY2hrc3VtOworICAgIFVDSEFSIGVjZl9zcGFyZVs3XTsKKyAgICBVQ0hBUiBqYXBhbl9jYWxsX3NpZ25bMTJdOworfTsKKworc3RydWN0IHN0YXJ0dXBfcmVzXzYgeworICAgIFVDSEFSIHN0YXJ0dXBfd29yZDsKKyAgICBVQ0hBUiBzdGF0aW9uX2FkZHJbQUREUkxFTl07CisgICAgVUNIQVIgcmVzZXJ2ZWQ7CisgICAgVUNIQVIgc3VwcF9yYXRlc1s4XTsKKyAgICBVQ0hBUiBqYXBhbl9jYWxsX3NpZ25bMTJdOworICAgIFVDSEFSIGNhbGNfcHJvZ19jaGtzdW07CisgICAgVUNIQVIgY2FsY19jaXNfY2hrc3VtOworICAgIFVDSEFSIGZpcm13YXJlX3ZlcnNpb25bM107CisgICAgVUNIQVIgYXNpY192ZXJzaW9uOworICAgIFVDSEFSIHRpYl9sZW5ndGg7Cit9OworCitzdHJ1Y3Qgc3RhcnRfam9pbl9uZXRfcGFyYW1zIHsKKyAgICBVQ0hBUiBuZXRfdHlwZTsKKyAgICBVQ0hBUiBzc2lkW0VTU0lEX1NJWkVdOworICAgIFVDSEFSIHJlc2VydmVkOworICAgIFVDSEFSIHByaXZhY3lfY2FuX2pvaW47Cit9OworCisvKioqKioqIENvbW1hbmQgQ29udHJvbCBTdHJ1Y3R1cmUgYXJlYSBhdCBTaGFyZWQgcmFtIG9mZnNldCAweDA0MDAgKioqKioqKioqKiovCisvKiBTdHJ1Y3R1cmVzIGZvciBjb21tYW5kIHNwZWNpZmljIHBhcmFtZXRlcnMgKGNjcy52YXIpICovCitzdHJ1Y3QgdXBkYXRlX3BhcmFtX2NtZCB7CisgICAgVUNIQVIgb2JqZWN0X2lkOworICAgIFVDSEFSIG51bWJlcl9vYmplY3RzOworICAgIFVDSEFSIGZhaWx1cmVfY2F1c2U7Cit9Oworc3RydWN0IHJlcG9ydF9wYXJhbV9jbWQgeworICAgIFVDSEFSIG9iamVjdF9pZDsKKyAgICBVQ0hBUiBudW1iZXJfb2JqZWN0czsKKyAgICBVQ0hBUiBmYWlsdXJlX2NhdXNlOworICAgIFVDSEFSIGxlbmd0aDsKK307CitzdHJ1Y3Qgc3RhcnRfbmV0d29ya19jbWQgeworICAgIFVDSEFSIHVwZGF0ZV9wYXJhbTsKKyAgICBVQ0hBUiBic3NpZFtBRERSTEVOXTsKKyAgICBVQ0hBUiBuZXRfaW5pdGlhdGVkOworICAgIFVDSEFSIG5ldF9kZWZhdWx0X3R4X3JhdGU7CisgICAgVUNIQVIgZW5jcnlwdGlvbjsKK307CitzdHJ1Y3Qgam9pbl9uZXR3b3JrX2NtZCB7CisgICAgVUNIQVIgdXBkYXRlX3BhcmFtOworICAgIFVDSEFSIGJzc2lkW0FERFJMRU5dOworICAgIFVDSEFSIG5ldF9pbml0aWF0ZWQ7CisgICAgVUNIQVIgbmV0X2RlZmF1bHRfdHhfcmF0ZTsKKyAgICBVQ0hBUiBlbmNyeXB0aW9uOworfTsKK3N0cnVjdCB0eF9yZXF1ZXN0ZWRfY21kIHsKKyAKKyAgICBVQ0hBUiB0eF9kYXRhX3B0clsyXTsKKyAgICBVQ0hBUiB0eF9kYXRhX2xlbmd0aFsyXTsKKyAgICBVQ0hBUiBob3N0X3Jlc2VydmVkWzJdOworICAgIFVDSEFSIHJlc2VydmVkWzNdOworICAgIFVDSEFSIHR4X3JhdGU7CisgICAgVUNIQVIgcG93X3Nhdl9tb2RlOworICAgIFVDSEFSIHJldHJpZXM7CisgICAgVUNIQVIgYW50ZW5uYTsKK307CitzdHJ1Y3QgdHhfcmVxdWVzdGVkX2NtZF80IHsKKyAKKyAgICBVQ0hBUiB0eF9kYXRhX3B0clsyXTsKKyAgICBVQ0hBUiB0eF9kYXRhX2xlbmd0aFsyXTsKKyAgICBVQ0hBUiBkZXN0X2FkZHJbQUREUkxFTl07CisgICAgVUNIQVIgcG93X3Nhdl9tb2RlOworICAgIFVDSEFSIHJldHJpZXM7CisgICAgVUNIQVIgc3RhdGlvbl9pZDsKK307CitzdHJ1Y3QgbWVtb3J5X2R1bXBfY21kIHsKKyAgICBVQ0hBUiBtZW1vcnlfdHlwZTsKKyAgICBVQ0hBUiBtZW1vcnlfcHRyWzJdOworICAgIFVDSEFSIGxlbmd0aDsKK307CitzdHJ1Y3QgdXBkYXRlX2Fzc29jaWF0aW9uX2NtZCB7CisgICAgVUNIQVIgc3RhdHVzOworICAgIFVDSEFSIGFpZFsyXTsKK307CitzdHJ1Y3Qgc3RhcnRfdGltZXJfY21kIHsKKyAgICBVQ0hBUiBkdXJhdGlvblsyXTsKK307CisKK3N0cnVjdCBjY3MgeworICAgIFVDSEFSIGJ1ZmZlcl9zdGF0dXM7ICAgICAgICAgICAgICAgICAvKiAwID0gYnVmZmVyIGZyZWUsIDEgPSBidWZmZXIgYnVzeSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyID0gY29tbWFuZCBjb21wbGV0ZSwgMyA9IGZhaWxlZCAqLworICAgIFVDSEFSIGNtZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIHRvIEVDRiAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGxpbms7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW5rIHRvIG5leHQgQ0NTLCBGRj1lbmQgb2YgbGlzdCAqLworICAgIC8qIGNvbW1hbmQgc3BlY2lmaWMgcGFyYW1ldGVycyAgICAgICovCisgICAgdW5pb24geworICAgICAgICBjaGFyIHJlc2VydmVkWzEzXTsKKyAgICAgICAgc3RydWN0IHVwZGF0ZV9wYXJhbV9jbWQgdXBkYXRlX3BhcmFtOworICAgICAgICBzdHJ1Y3QgcmVwb3J0X3BhcmFtX2NtZCByZXBvcnRfcGFyYW07CisgICAgICAgIFVDSEFSIG51bW11bHRpY2FzdDsKKyAgICAgICAgVUNIQVIgbW9kZTsKKyAgICAgICAgc3RydWN0IHN0YXJ0X25ldHdvcmtfY21kIHN0YXJ0X25ldHdvcms7CisgICAgICAgIHN0cnVjdCBqb2luX25ldHdvcmtfY21kIGpvaW5fbmV0d29yazsKKyAgICAgICAgc3RydWN0IHR4X3JlcXVlc3RlZF9jbWQgdHhfcmVxdWVzdDsKKyAgICAgICAgc3RydWN0IG1lbW9yeV9kdW1wX2NtZCBtZW1vcnlfZHVtcDsKKyAgICAgICAgc3RydWN0IHVwZGF0ZV9hc3NvY2lhdGlvbl9jbWQgdXBkYXRlX2Fzc29jOworICAgICAgICBzdHJ1Y3Qgc3RhcnRfdGltZXJfY21kIHN0YXJ0X3RpbWVyOworICAgIH0gdmFyOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVHJhbnNtaXQgYnVmZmVyIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCB0aWJfc3RydWN0dXJlIHsKKyAgICBVQ0hBUiBjY3NfaW5kZXg7CisgICAgVUNIQVIgcHNtOworICAgIFVDSEFSIHBhc3NfZmFpbDsKKyAgICBVQ0hBUiByZXRyeV9jb3VudDsKKyAgICBVQ0hBUiBtYXhfcmV0cmllczsKKyAgICBVQ0hBUiBmcmFnc19yZW1haW5pbmc7CisgICAgVUNIQVIgbm9fcmI7CisgICAgVUNIQVIgcnRzX3JlcWQ7CisgICAgVUNIQVIgY3NtYV90eF9jbnRybF8yOworICAgIFVDSEFSIHNpZnNfdHhfY250cmxfMjsKKyAgICBVQ0hBUiB0eF9kbWFfYWRkcl8xWzJdOworICAgIFVDSEFSIHR4X2RtYV9hZGRyXzJbMl07CisgICAgVUNIQVIgdmFyX2R1cl8ybWh6WzJdOworICAgIFVDSEFSIHZhcl9kdXJfMW1oelsyXTsKKyAgICBVQ0hBUiBtYXhfZHVyXzJtaHpbMl07CisgICAgVUNIQVIgbWF4X2R1cl8xbWh6WzJdOworICAgIFVDSEFSIGhkcl9sZW47CisgICAgVUNIQVIgbWF4X2ZyYWdfbGVuWzJdOworICAgIFVDSEFSIHZhcl9sZW5bMl07CisgICAgVUNIQVIgcGh5X2hkcl80OworICAgIFVDSEFSIG1hY19oZHJfMTsKKyAgICBVQ0hBUiBtYWNfaGRyXzI7CisgICAgVUNIQVIgc2lkWzJdOworfTsKKworc3RydWN0IHBoeV9oZWFkZXIgeworICAgIFVDSEFSIHNmZFsyXTsKKyAgICBVQ0hBUiBoZHJfMzsKKyAgICBVQ0hBUiBoZHJfNDsKK307CitzdHJ1Y3QgcnhfbXNnIHsKKyAgICBzdHJ1Y3QgbWFjX2hlYWRlciBtYWM7CisgICAgVUNIQVIgIHZhclsxXTsKK307CisKK3N0cnVjdCB0eF9tc2cgeworICAgIHN0cnVjdCB0aWJfc3RydWN0dXJlIHRpYjsKKyAgICBzdHJ1Y3QgcGh5X2hlYWRlciBwaHk7CisgICAgc3RydWN0IG1hY19oZWFkZXIgbWFjOworICAgIFVDSEFSICB2YXJbMV07Cit9OworCisvKioqKioqIEVDRiBSZWNlaXZlIENvbnRyb2wgU3R1Y3R1cmUgKFJDUykgQXJlYSBhdCBTaGFyZWQgUkFNIG9mZnNldCAweDA4MDAgICovCisvKiBTdHJ1Y3R1cmVzIGZvciBjb21tYW5kIHNwZWNpZmljIHBhcmFtZXRlcnMgKHJjcy52YXIpICovCitzdHJ1Y3QgcnhfcGFja2V0X2NtZCB7CisgICAgVUNIQVIgcnhfZGF0YV9wdHJbMl07CisgICAgVUNIQVIgcnhfZGF0YV9sZW5ndGhbMl07CisgICAgVUNIQVIgcnhfc2lnX2xldjsKKyAgICBVQ0hBUiBuZXh0X2ZyYWdfcmNzX2luZGV4OworICAgIFVDSEFSIHRvdGFscGFja2V0bGVuZ3RoWzJdOworfTsKK3N0cnVjdCByZWpvaW5fbmV0X2NtcGx0X2NtZCB7CisgICAgVUNIQVIgcmVzZXJ2ZWQ7CisgICAgVUNIQVIgYnNzaWRbQUREUkxFTl07Cit9Oworc3RydWN0IGphcGFuX2NhbGxfc2lnbl9yeGQgeworICAgIFVDSEFSIHJ4ZF9jYWxsX3NpZ25bOF07CisgICAgVUNIQVIgcmVzZXJ2ZWRbNV07Cit9OworCitzdHJ1Y3QgcmNzIHsKKyAgICBVQ0hBUiBidWZmZXJfc3RhdHVzOworICAgIFVDSEFSIGludGVycnVwdF9pZDsKKyAgICBVQ0hBUiBsaW5rX2ZpZWxkOworICAgIC8qIGNvbW1hbmQgc3BlY2lmaWMgcGFyYW1ldGVycyAgICAgICovCisgICAgdW5pb24geworICAgICAgICBVQ0hBUiByZXNlcnZlZFsxM107IAorICAgICAgICBzdHJ1Y3QgcnhfcGFja2V0X2NtZCByeF9wYWNrZXQ7CisgICAgICAgIHN0cnVjdCByZWpvaW5fbmV0X2NtcGx0X2NtZCByZWpvaW5fbmV0X2NvbXBsZXRlOworICAgICAgICBzdHJ1Y3QgamFwYW5fY2FsbF9zaWduX3J4ZCBqYXBhbl9jYWxsX3NpZ247CisgICAgfSB2YXI7Cit9OworCisvKioqKioqIFN0YXJ0dXAgcGFyYW1ldGVyIHN0cnVjdHVyZXMgZm9yIGJvdGggdmVyc2lvbnMgb2YgZmlybXdhcmUgKioqKioqKioqKiovCitzdHJ1Y3QgYjRfc3RhcnR1cF9wYXJhbXMgeworICAgIFVDSEFSIGFfbmV0d29ya190eXBlOyAgICAgICAgICAgICAgICAvKiBDX0FESE9DLCBDX0lORlJBICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfYWN0aW5nX2FzX2FwX3N0YXR1czsgICAgICAgICAvKiBDX1RZUEVfU1RBLCBDX1RZUEVfQVAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfY3VycmVudF9lc3NfaWRbRVNTSURfU0laRV07ICAvKiBOdWxsIHRlcm1pbmF0ZWQgdW5sZXNzIDMyIGxvbmcgICAqLworICAgIFVDSEFSIGFfc2Nhbm5pbmdfbW9kZTsgICAgICAgICAgICAgICAvKiBwYXNzaXZlIDAsIGFjdGl2ZSAxICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfcG93ZXJfbWd0X3N0YXRlOyAgICAgICAgICAgICAvKiBDQU0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbWFjX2FkZHJbQUREUkxFTl07ICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfZnJhZ190aHJlc2hvbGRbMl07ICAgICAgICAgICAvKiA1MTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfaG9wX3RpbWVbMl07ICAgICAgICAgICAgICAgICAvKiAxNmsgKiAyKipuLCBuPTAtNCBpbiBLdXMgICAgICAgICAqLworICAgIFVDSEFSIGFfYmVhY29uX3BlcmlvZFsyXTsgICAgICAgICAgICAvKiBuICogYV9ob3BfdGltZSAgaW4gS3VzICAgICAgICAgICAqLworICAgIFVDSEFSIGFfZHRpbV9wZXJpb2Q7ICAgICAgICAgICAgICAgICAvKiBpbiBiZWFjb25zICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfcmV0cnlfbWF4OyAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfYWNrX3RpbWVvdXQ7ICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfc2lmczsgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfZGlmczsgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfcGlmczsgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfcnRzX3RocmVzaG9sZFsyXTsgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfc2Nhbl9kd2VsbF90aW1lWzJdOyAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbWF4X3NjYW5fZHdlbGxfdGltZVsyXTsgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfYXNzb2NfcmVzcF90aW1lb3V0X3RocmVzaDsgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfYWRob2Nfc2Nhbl9jeWNsZV9tYXg7ICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfaW5mcmFfc2Nhbl9jeWNsZV9tYXg7ICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfaW5mcmFfc3VwZXJfc2Nhbl9jeWNsZV9tYXg7ICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfcHJvbWlzY3VvdXNfbW9kZTsgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfdW5pcXVlX3dvcmRbMl07ICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfc2xvdF90aW1lOyAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfcm9hbWluZ19sb3dfc25yX3RocmVzaDsgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbG93X3Nucl9jb3VudF90aHJlc2g7ICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfaW5mcmFfbWlzc2VkX2Jjbl90aHJlc2g7ICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfYWRob2NfbWlzc2VkX2Jjbl90aHJlc2g7ICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfY3Vycl9jb3VudHJ5X2NvZGU7ICAgICAgICAgICAvKiBDX1VTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfaG9wX3BhdHRlcm47ICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfaG9wX3BhdHRlcm5fbGVuZ3RoOyAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogYjQgLSBiNSBkaWZmZXJlbmNlcyBzdGFydCBoZXJlICovCisgICAgVUNIQVIgYV9jd19tYXg7ICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9jd19taW47ICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ub2lzZV9maWx0ZXJfZ2FpbjsgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ub2lzZV9saW1pdF9vZmZzZXQ7ICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9kZXRfcnNzaV90aHJlc2hfb2Zmc2V0OyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9tZWRfYnVzeV90aHJlc2hfb2Zmc2V0OyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9kZXRfc3luY190aHJlc2g7ICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV90ZXN0X21vZGU7ICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV90ZXN0X21pbl9jaGFuX251bTsgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV90ZXN0X21heF9jaGFuX251bTsgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9yeF90eF9kZWxheTsgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9jdXJyZW50X2Jzc19pZFtBRERSTEVOXTsgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ob3Bfc2V0OyAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9Oworc3RydWN0IGI1X3N0YXJ0dXBfcGFyYW1zIHsKKyAgICBVQ0hBUiBhX25ldHdvcmtfdHlwZTsgICAgICAgICAgICAgICAgLyogQ19BREhPQywgQ19JTkZSQSAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FjdGluZ19hc19hcF9zdGF0dXM7ICAgICAgICAgLyogQ19UWVBFX1NUQSwgQ19UWVBFX0FQICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2N1cnJlbnRfZXNzX2lkW0VTU0lEX1NJWkVdOyAgLyogTnVsbCB0ZXJtaW5hdGVkIHVubGVzcyAzMiBsb25nICAgKi8KKyAgICBVQ0hBUiBhX3NjYW5uaW5nX21vZGU7ICAgICAgICAgICAgICAgLyogcGFzc2l2ZSAwLCBhY3RpdmUgMSAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Bvd2VyX21ndF9zdGF0ZTsgICAgICAgICAgICAgLyogQ0FNIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX21hY19hZGRyW0FERFJMRU5dOyAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2ZyYWdfdGhyZXNob2xkWzJdOyAgICAgICAgICAgLyogNTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2hvcF90aW1lWzJdOyAgICAgICAgICAgICAgICAgLyogMTZrICogMioqbiwgbj0wLTQgaW4gS3VzICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2JlYWNvbl9wZXJpb2RbMl07ICAgICAgICAgICAgLyogbiAqIGFfaG9wX3RpbWUgIGluIEt1cyAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2R0aW1fcGVyaW9kOyAgICAgICAgICAgICAgICAgLyogaW4gYmVhY29ucyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3JldHJ5X21heDsgICAgICAgICAgICAgICAgICAgLyogNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2Fja190aW1lb3V0OyAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3NpZnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2RpZnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3BpZnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3J0c190aHJlc2hvbGRbMl07ICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3NjYW5fZHdlbGxfdGltZVsyXTsgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX21heF9zY2FuX2R3ZWxsX3RpbWVbMl07ICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2Fzc29jX3Jlc3BfdGltZW91dF90aHJlc2g7ICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FkaG9jX3NjYW5fY3ljbGVfbWF4OyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2luZnJhX3NjYW5fY3ljbGVfbWF4OyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2luZnJhX3N1cGVyX3NjYW5fY3ljbGVfbWF4OyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Byb21pc2N1b3VzX21vZGU7ICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3VuaXF1ZV93b3JkWzJdOyAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Nsb3RfdGltZTsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3JvYW1pbmdfbG93X3Nucl90aHJlc2g7ICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2xvd19zbnJfY291bnRfdGhyZXNoOyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2luZnJhX21pc3NlZF9iY25fdGhyZXNoOyAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FkaG9jX21pc3NlZF9iY25fdGhyZXNoOyAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2N1cnJfY291bnRyeV9jb2RlOyAgICAgICAgICAgLyogQ19VU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2hvcF9wYXR0ZXJuOyAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2hvcF9wYXR0ZXJuX2xlbmd0aDsgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGI0IC0gYjUgZGlmZmVyZW5jZXMgc3RhcnQgaGVyZSAqLworICAgIFVDSEFSIGFfY3dfbWF4WzJdOyAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfY3dfbWluWzJdOyAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbm9pc2VfZmlsdGVyX2dhaW47ICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbm9pc2VfbGltaXRfb2Zmc2V0OyAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfZGV0X3Jzc2lfdGhyZXNoX29mZnNldDsgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbWVkX2J1c3lfdGhyZXNoX29mZnNldDsgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfZGV0X3N5bmNfdGhyZXNoOyAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfdGVzdF9tb2RlOyAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfdGVzdF9taW5fY2hhbl9udW07ICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfdGVzdF9tYXhfY2hhbl9udW07ICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfYWxsb3dfYmNhc3RfU1NJRF9wcm9iZV9yc3A7CisgICAgVUNIQVIgYV9wcml2YWN5X211c3Rfc3RhcnQ7CisgICAgVUNIQVIgYV9wcml2YWN5X2Nhbl9qb2luOworICAgIFVDSEFSIGFfYmFzaWNfcmF0ZV9zZXRbOF07Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFJBWV9JT0NHX1BBUk1TIChTSU9DREVWUFJJVkFURSkKKyNkZWZpbmUgUkFZX0lPQ1NfUEFSTVMgKFNJT0NERVZQUklWQVRFICsgMSkKKyNkZWZpbmUgUkFZX0RPX0NNRCAgICAgKFNJT0NERVZQUklWQVRFICsgMikKKworLyoqKioqKiBldGhlcm5ldCA8LT4gODAyLjExIHRyYW5zbGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3Qgc25hcGhkcl90Cit7CisgIFVDSEFSICAgZHNhcDsKKyAgVUNIQVIgICBzc2FwOworICBVQ0hBUiAgIGN0cmw7CisgIFVDSEFSICAgb3JnWzNdOworICBVQ0hBUiAgIGV0aGVydHlwZVsyXTsKK30gc25hcGhkcl90OworCisjZGVmaW5lIEJSSURHRV9FTkNBUCAgMHhmODAwMDAKKyNkZWZpbmUgUkZDMTA0Ml9FTkNBUCAwCisjZGVmaW5lIFNOQVBfSUQgICAgICAgMHgwMDAzYWFhYQorI2RlZmluZSBSQVlfSVBYX1RZUEUgIDB4ODEzNworI2RlZmluZSBBUFBMRUFSUF9UWVBFIDB4ODBmMworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmIC8qICNpZm5kZWYgUkFZTElOS19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9zdHJpcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3RyaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzhjZjI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMKQEAgLTAsMCArMSwyODQzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTYgVGhlIEJvYXJkIG9mIFRydXN0ZWVzIG9mIFRoZSBMZWxhbmQgU3RhbmZvcmQKKyAqIEp1bmlvciBVbml2ZXJzaXR5LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKKyAqIGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuICBTdGFuZm9yZCBVbml2ZXJzaXR5CisgKiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMKKyAqIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dAorICogZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIHN0cmlwLmMJVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBTdGFybW9kZSBSYWRpbyBJUCAoU1RSSVApCisgKgkJZm9yIGtlcm5lbC1iYXNlZCBkZXZpY2VzIGxpa2UgVFRZLiAgSXQgaW50ZXJmYWNlcyBiZXR3ZWVuIGEKKyAqCQlyYXcgVFRZLCBhbmQgdGhlIGtlcm5lbCdzIElORVQgcHJvdG9jb2wgbGF5ZXJzICh2aWEgRERJKS4KKyAqCisgKiBWZXJzaW9uOglAKCMpc3RyaXAuYwkxLjMJSnVseSAxOTk3CisgKgorICogQXV0aG9yOglTdHVhcnQgQ2hlc2hpcmUgPGNoZXNoaXJlQGNzLnN0YW5mb3JkLmVkdT4KKyAqCisgKiBGaXhlczoJdjAuOSAxMnRoIEZlYiAxOTk2IChTQykKKyAqCQlOZXcgYnl0ZSBzdHVmZmluZyAoMis2IHJ1bi1sZW5ndGggZW5jb2RpbmcpCisgKgkJTmV3IHdhdGNoZG9nIHRpbWVyIHRhc2sKKyAqCQlOZXcgUHJvdG9jb2wga2V5IChTSVAwKQorICoJCQorICoJCXYwLjkuMSAzcmQgTWFyY2ggMTk5NiAoU0MpCisgKgkJQ2hhbmdlZCB0byBkeW5hbWljIGRldmljZSBhbGxvY2F0aW9uIC0tIG5vIG1vcmUgY29tcGlsZQorICoJCXRpbWUgKG9yIGJvb3QgdGltZSkgbGltaXQgb24gdGhlIG51bWJlciBvZiBTVFJJUCBkZXZpY2VzLgorICoJCQorICoJCXYwLjkuMiAxM3RoIE1hcmNoIDE5OTYgKFNDKQorICoJCVVzZXMgYXJwIGNhY2hlIGxvb2t1cHMgKGJ1dCBkb2Vzbid0IHNlbmQgYXJwIHBhY2tldHMgeWV0KQorICoJCQorICoJCXYwLjkuMyAxN3RoIEFwcmlsIDE5OTYgKFNDKQorICoJCUZpeGVkIGJ1ZyB3aGVyZSBTVFJfRVJST1IgZmxhZyB3YXMgZ2V0dGluZyBzZXQgdW5uZWNjZXNzYXJpbHkKKyAqCQkoY2F1c2luZyBvdGhlcndpc2UgZ29vZCBwYWNrZXRzIHRvIGJlIHVubmVjY2Vzc2FyaWx5IGRyb3BwZWQpCisgKgkJCisgKgkJdjAuOS40IDI3dGggQXByaWwgMTk5NiAoU0MpCisgKgkJRmlyc3QgYXR0ZW1wdCBhdCB1c2luZyAiJkNPTU1BTkQiIFN0YXJtb2RlIEFUIGNvbW1hbmRzCisgKgkJCisgKgkJdjAuOS41IDI5dGggTWF5IDE5OTYgKFNDKQorICoJCUZpcnN0IGF0dGVtcHQgYXQgc2VuZGluZyAodW5pY2FzdCkgQVJQIHBhY2tldHMKKyAqCQkKKyAqCQl2MC45LjYgNXRoIEp1bmUgMTk5NiAoRWxsaW90KQorICoJCVB1dCAibWVzc2FnZSBsZXZlbCIgdGFncyBpbiBldmVyeSAicHJpbnRrIiBzdGF0ZW1lbnQKKyAqCQkKKyAqCQl2MC45LjcgMTN0aCBKdW5lIDE5OTYgKGxhaWspCisgKgkJQWRkZWQgc3VwcG9ydCBmb3IgdGhlIC9wcm9jIGZzCisgKgorICogICAgICAgICAgICAgIHYwLjkuOCBKdWx5IDE5OTYgKE1lbWEpCisgKiAgICAgICAgICAgICAgQWRkZWQgcGFja2V0IGxvZ2dpbmcKKyAqCisgKiAgICAgICAgICAgICAgdjEuMCBOb3ZlbWJlciAxOTk2IChTQykKKyAqICAgICAgICAgICAgICBGaXhlZCAoc2V2ZXJlKSBtZW1vcnkgbGVha3MgaW4gdGhlIC9wcm9jIGZzIGNvZGUKKyAqICAgICAgICAgICAgICBGaXhlZCByYWNlIGNvbmRpdGlvbnMgaW4gdGhlIGxvZ2dpbmcgY29kZQorICoKKyAqICAgICAgICAgICAgICB2MS4xIEphbnVhcnkgMTk5NyAoU0MpCisgKiAgICAgICAgICAgICAgRGVsZXRlZCBwYWNrZXQgbG9nZ2luZyAodXNlIHRjcGR1bXAgaW5zdGVhZCkKKyAqICAgICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBNZXRyaWNvbSBGaXJtd2FyZSB2MjA0IGZlYXR1cmVzCisgKiAgICAgICAgICAgICAgKGxpa2UgbWVzc2FnZSBjaGVja3N1bXMpCisgKgorICogICAgICAgICAgICAgIHYxLjIgSmFudWFyeSAxOTk3IChTQykKKyAqICAgICAgICAgICAgICBQdXQgcG9ydGFibGVzIGxpc3QgYmFjayBpbgorICoKKyAqICAgICAgICAgICAgICB2MS4zIEp1bHkgMTk5NyAoU0MpCisgKiAgICAgICAgICAgICAgTWFkZSBTVFJJUCBkcml2ZXIgc2V0IHRoZSByYWRpbydzIGJhdWQgcmF0ZSBhdXRvbWF0aWNhbGx5LgorICogICAgICAgICAgICAgIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcmlseSB0byBtYW51YWxseSBzZXQgdGhlIHJhZGlvJ3MKKyAqICAgICAgICAgICAgICByYXRlIHBlcm1hbmVudGx5IHRvIDExNTIwMCAtLSB0aGUgZHJpdmVyIGhhbmRsZXMgc2V0dGluZworICogICAgICAgICAgICAgIHRoZSByYXRlIGF1dG9tYXRpY2FsbHkuCisgKi8KKworI2lmZGVmIE1PRFVMRQorc3RhdGljIGNvbnN0IGNoYXIgU3RyaXBWZXJzaW9uW10gPSAiMS4zQS1TVFVBUlQuQ0hFU0hJUkUtTU9EVUxBUiI7CisjZWxzZQorc3RhdGljIGNvbnN0IGNoYXIgU3RyaXBWZXJzaW9uW10gPSAiMS4zQS1TVFVBUlQuQ0hFU0hJUkUiOworI2VuZGlmCisKKyNkZWZpbmUgVElDS0xFX1RJTUVSUyAwCisjZGVmaW5lIEVYVF9DT1VOVEVSUyAxCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEhlYWRlciBmaWxlcwkJCQkJCQkJKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworIyBpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3N0cmlwLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsUC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFVzZWZ1bCBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucwkJCQkJKi8KKworLyoKKyAqIEEgTWV0cmljb21LZXkgaWRlbnRpZmllcyB0aGUgcHJvdG9jb2wgYmVpbmcgY2FycmllZCBpbnNpZGUgYSBNZXRyaWNvbQorICogU3Rhcm1vZGUgcGFja2V0LgorICovCisKK3R5cGVkZWYgdW5pb24geworCV9fdTggY1s0XTsKKwlfX3UzMiBsOworfSBNZXRyaWNvbUtleTsKKworLyoKKyAqIEFuIElQIGFkZHJlc3MgY2FuIGJlIHZpZXdlZCBhcyBmb3VyIGJ5dGVzIGluIG1lbW9yeSAod2hpY2ggaXMgd2hhdCBpdCBpcykgb3IgYXMKKyAqIGEgc2luZ2xlIDMyLWJpdCBsb25nICh3aGljaCBpcyBjb252ZW5pZW50IGZvciBhc3NpZ25tZW50LCBlcXVhbGl0eSB0ZXN0aW5nIGV0Yy4pCisgKi8KKwordHlwZWRlZiB1bmlvbiB7CisJX191OCBiWzRdOworCV9fdTMyIGw7Cit9IElQYWRkcjsKKworLyoKKyAqIEEgTWV0cmljb21BZGRyZXNzU3RyaW5nIGlzIHVzZWQgdG8gaG9sZCBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZgorICogYSBNZXRyaWNvbSBhZGRyZXNzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX3U4IGNbMjRdOworfSBNZXRyaWNvbUFkZHJlc3NTdHJpbmc7CisKKy8qIEVuY2Fwc3VsYXRpb24gY2FuIGV4cGFuZCBwYWNrZXQgb2Ygc2l6ZSB4IHRvIDY1LzY0eCArIDEKKyAqIFNlbnQgcGFja2V0IGxvb2tzIGxpa2UgIjxDUj4qPGFkZHJlc3M+KjxrZXk+PGVuY2FwcyBwYXlsb2FkPjxDUj4iCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgMSAgIDEtMTggIDEgIDQgICAgICAgICA/ICAgICAgICAgMQorICogZWcuICAgICAgICAgICAgICAgICAgICAgPENSPiowMDAwLTEyMzQqU0lQMDxlbmNhcHMgcGF5bG9hZD48Q1I+CisgKiBXZSBhbGxvdyAzMSBieXRlcyBmb3IgdGhlIHN0YXJzLCB0aGUga2V5LCB0aGUgYWRkcmVzcyBhbmQgdGhlIDxDUj5zCisgKi8KKyNkZWZpbmUgU1RSSVBfRU5DQVBfU0laRShYKSAoMzIgKyAoWCkqNjVMLzY0TCkKKworLyoKKyAqIEEgU1RSSVBfSGVhZGVyIGlzIG5ldmVyIHJlYWxseSBzZW50IG92ZXIgdGhlIHJhZGlvLCBidXQgbWFraW5nIGEgZHVtbXkKKyAqIGhlYWRlciBmb3IgaW50ZXJuYWwgdXNlIHdpdGhpbiB0aGUga2VybmVsIHRoYXQgbG9va3MgbGlrZSBhbiBFdGhlcm5ldAorICogaGVhZGVyIG1ha2VzIGNlcnRhaW4gb3RoZXIgc29mdHdhcmUgaGFwcGllci4gRm9yIGV4YW1wbGUsIHRjcGR1bXAKKyAqIGFscmVhZHkgdW5kZXJzdGFuZHMgRXRoZXJuZXQgaGVhZGVycy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJTWV0cmljb21BZGRyZXNzIGRzdF9hZGRyOwkvKiBEZXN0aW5hdGlvbiBhZGRyZXNzLCBlLmcuICIwMDAwLTEyMzQiICAgKi8KKwlNZXRyaWNvbUFkZHJlc3Mgc3JjX2FkZHI7CS8qIFNvdXJjZSBhZGRyZXNzLCBlLmcuICIwMDAwLTU2NzgiICAgICAgICAqLworCXVuc2lnbmVkIHNob3J0IHByb3RvY29sOwkvKiBUaGUgcHJvdG9jb2wgdHlwZSwgdXNpbmcgRXRoZXJuZXQgY29kZXMgKi8KK30gU1RSSVBfSGVhZGVyOworCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciBjWzYwXTsKK30gTWV0cmljb21Ob2RlOworCisjZGVmaW5lIE5PREVfVEFCTEVfU0laRSAzMgordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCB0aW1ldmFsIHRpbWVzdGFtcDsKKwlpbnQgbnVtX25vZGVzOworCU1ldHJpY29tTm9kZSBub2RlW05PREVfVEFCTEVfU0laRV07Cit9IE1ldHJpY29tTm9kZVRhYmxlOworCitlbnVtIHsgRkFMU0UgPSAwLCBUUlVFID0gMSB9OworCisvKgorICogSG9sZHMgdGhlIHJhZGlvJ3MgZmlybXdhcmUgdmVyc2lvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgY1s1MF07Cit9IEZpcm13YXJlVmVyc2lvbjsKKworLyoKKyAqIEhvbGRzIHRoZSByYWRpbydzIHNlcmlhbCBudW1iZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIGNbMThdOworfSBTZXJpYWxOdW1iZXI7CisKKy8qCisgKiBIb2xkcyB0aGUgcmFkaW8ncyBiYXR0ZXJ5IHZvbHRhZ2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIGNbMTFdOworfSBCYXR0ZXJ5Vm9sdGFnZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgY1s4XTsKK30gY2hhcjg7CisKK2VudW0geworCU5vU3RydWN0dXJlID0gMCwJLyogUmVhbGx5IG9sZCBmaXJtd2FyZSAqLworCVN0cnVjdHVyZWRNZXNzYWdlcyA9IDEsCS8qIFBhcnNhYmxlIEFUIHJlc3BvbnNlIG1zZ3MgKi8KKwlDaGVja3N1bW1lZE1lc3NhZ2VzID0gMgkvKiBQYXJzYWJsZSBBVCByZXNwb25zZSBtc2dzIHdpdGggY2hlY2tzdW1zICovCit9IEZpcm13YXJlTGV2ZWw7CisKK3N0cnVjdCBzdHJpcCB7CisJaW50IG1hZ2ljOworCS8qCisJICogVGhlc2UgYXJlIHBvaW50ZXJzIHRvIHRoZSBtYWxsb2MoKWVkIGZyYW1lIGJ1ZmZlcnMuCisJICovCisKKwl1bnNpZ25lZCBjaGFyICpyeF9idWZmOwkvKiBidWZmZXIgZm9yIHJlY2VpdmVkIElQIHBhY2tldCAqLworCXVuc2lnbmVkIGNoYXIgKnN4X2J1ZmY7CS8qIGJ1ZmZlciBmb3IgcmVjZWl2ZWQgc2VyaWFsIGRhdGEgKi8KKwlpbnQgc3hfY291bnQ7CQkvKiByZWNlaXZlZCBzZXJpYWwgZGF0YSBjb3VudGVyICovCisJaW50IHN4X3NpemU7CQkvKiBTZXJpYWwgYnVmZmVyIHNpemUgICAgICAgICAgICovCisJdW5zaWduZWQgY2hhciAqdHhfYnVmZjsJLyogdHJhbnNtaXR0ZXIgYnVmZmVyICAgICAgICAgICAqLworCXVuc2lnbmVkIGNoYXIgKnR4X2hlYWQ7CS8qIHBvaW50ZXIgdG8gbmV4dCBieXRlIHRvIFhNSVQgKi8KKwlpbnQgdHhfbGVmdDsJCS8qIGJ5dGVzIGxlZnQgaW4gWE1JVCBxdWV1ZSAgICAgKi8KKwlpbnQgdHhfc2l6ZTsJCS8qIFNlcmlhbCBidWZmZXIgc2l6ZSAgICAgICAgICAgKi8KKworCS8qCisJICogU1RSSVAgaW50ZXJmYWNlIHN0YXRpc3RpY3MuCisJICovCisKKwl1bnNpZ25lZCBsb25nIHJ4X3BhY2tldHM7CS8qIGluYm91bmQgZnJhbWVzIGNvdW50ZXIgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIHR4X3BhY2tldHM7CS8qIG91dGJvdW5kIGZyYW1lcyBjb3VudGVyICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2Vycm9yczsJLyogUGFyaXR5LCBldGMuIGVycm9ycyAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgdHhfZXJyb3JzOwkvKiBQbGFubmVkIHN0dWZmICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyByeF9kcm9wcGVkOwkvKiBObyBtZW1vcnkgZm9yIHNrYiAgICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyB0eF9kcm9wcGVkOwkvKiBXaGVuIE1UVSBjaGFuZ2UgICAgICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyByeF9vdmVyX2Vycm9yczsJLyogRnJhbWUgYmlnZ2VyIHRoZW4gU1RSSVAgYnVmLiAqLworCisJdW5zaWduZWQgbG9uZyBwcHNfdGltZXI7CS8qIFRpbWVyIHRvIGRldGVybWluZSBwcHMgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X3Bwc19jb3VudDsJLyogQ291bnRlciB0byBkZXRlcm1pbmUgcHBzICAgICAqLworCXVuc2lnbmVkIGxvbmcgdHhfcHBzX2NvdW50OwkvKiBDb3VudGVyIHRvIGRldGVybWluZSBwcHMgICAgICovCisJdW5zaWduZWQgbG9uZyBzeF9wcHNfY291bnQ7CS8qIENvdW50ZXIgdG8gZGV0ZXJtaW5lIHBwcyAgICAgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2F2ZXJhZ2VfcHBzOwkvKiByeCBwYWNrZXRzIHBlciBzZWNvbmQgKiA4ICAgICovCisJdW5zaWduZWQgbG9uZyB0eF9hdmVyYWdlX3BwczsJLyogdHggcGFja2V0cyBwZXIgc2Vjb25kICogOCAgICAqLworCXVuc2lnbmVkIGxvbmcgc3hfYXZlcmFnZV9wcHM7CS8qIHNlbnQgcGFja2V0cyBwZXIgc2Vjb25kICogOCAgKi8KKworI2lmZGVmIEVYVF9DT1VOVEVSUworCXVuc2lnbmVkIGxvbmcgcnhfYnl0ZXM7CQkvKiB0b3RhbCByZWNlaXZlZCBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgdHhfYnl0ZXM7CQkvKiB0b3RhbCByZWNlaXZlZCBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgcnhfcmJ5dGVzOwkvKiBieXRlcyB0aHJ1IHJhZGlvIGkvZiAqLworCXVuc2lnbmVkIGxvbmcgdHhfcmJ5dGVzOwkvKiBieXRlcyB0aHJ1IHJhZGlvIGkvZiAqLworCXVuc2lnbmVkIGxvbmcgcnhfc2J5dGVzOwkvKiB0b3QgYnl0ZXMgdGhydSBzZXJpYWwgaS9mICovCisJdW5zaWduZWQgbG9uZyB0eF9zYnl0ZXM7CS8qIHRvdCBieXRlcyB0aHJ1IHNlcmlhbCBpL2YgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2VieXRlczsJLyogdG90IHN0YXQvZXJyIGJ5dGVzICovCisJdW5zaWduZWQgbG9uZyB0eF9lYnl0ZXM7CS8qIHRvdCBzdGF0L2VyciBieXRlcyAqLworI2VuZGlmCisKKwkvKgorCSAqIEludGVybmFsIHZhcmlhYmxlcy4KKwkgKi8KKworCXN0cnVjdCBsaXN0X2hlYWQgIGxpc3Q7CQkvKiBMaW5rZWQgbGlzdCBvZiBkZXZpY2VzICovCisKKwlpbnQgZGlzY2FyZDsJCQkvKiBTZXQgaWYgc2VyaWFsIGVycm9yICAgICAgICAgICovCisJaW50IHdvcmtpbmc7CQkJLyogSXMgcmFkaW8gd29ya2luZyBjb3JyZWN0bHk/ICAqLworCWludCBmaXJtd2FyZV9sZXZlbDsJCS8qIE1lc3NhZ2Ugc3RydWN0dXJpbmcgbGV2ZWwgICAgKi8KKwlpbnQgbmV4dF9jb21tYW5kOwkJLyogTmV4dCBwZXJpb2RpYyBjb21tYW5kICAgICAgICAqLworCXVuc2lnbmVkIGludCB1c2VyX2JhdWQ7CQkvKiBUaGUgdXNlci1zZWxlY3RlZCBiYXVkIHJhdGUgICovCisJaW50IG10dTsJCQkvKiBPdXIgbXR1ICh0byBzcG90IGNoYW5nZXMhKSAgICovCisJbG9uZyB3YXRjaGRvZ19kb3Byb2JlOwkJLyogTmV4dCB0aW1lIHRvIHRlc3QgdGhlIHJhZGlvICAqLworCWxvbmcgd2F0Y2hkb2dfZG9yZXNldDsJCS8qIFRpbWUgdG8gZG8gbmV4dCByZXNldCAgICAgICAgKi8KKwlsb25nIGdyYXR1aXRvdXNfYXJwOwkJLyogVGltZSB0byBzZW5kIG5leHQgQVJQIHJlZnJlc2ggKi8KKwlsb25nIGFycF9pbnRlcnZhbDsJCS8qIE5leHQgQVJQIGludGVydmFsICAgICAgICAgICAgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBpZGxlX3RpbWVyOwkvKiBGb3IgcGVyaW9kaWMgd2FrZXVwIGNhbGxzICAgICovCisJTWV0cmljb21BZGRyZXNzIHRydWVfZGV2X2FkZHI7CS8qIFRydWUgYWRkcmVzcyBvZiByYWRpbyAgICAgICAgKi8KKwlpbnQgbWFudWFsX2Rldl9hZGRyOwkJLyogSGFjazogU2VlIG5vdGUgYmVsb3cgICAgICAgICAqLworCisJRmlybXdhcmVWZXJzaW9uIGZpcm13YXJlX3ZlcnNpb247CS8qIFRoZSByYWRpbydzIGZpcm13YXJlIHZlcnNpb24gKi8KKwlTZXJpYWxOdW1iZXIgc2VyaWFsX251bWJlcjsJLyogVGhlIHJhZGlvJ3Mgc2VyaWFsIG51bWJlciAgICAqLworCUJhdHRlcnlWb2x0YWdlIGJhdHRlcnlfdm9sdGFnZTsJLyogVGhlIHJhZGlvJ3MgYmF0dGVyeSB2b2x0YWdlICAqLworCisJLyoKKwkgKiBPdGhlciB1c2VmdWwgc3RydWN0dXJlcy4KKwkgKi8KKworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CQkvKiBwdHIgdG8gVFRZIHN0cnVjdHVyZSAgICAgICAgICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsJCS8qIE91ciBkZXZpY2Ugc3RydWN0dXJlICAgICAgICAgKi8KKworCS8qCisJICogTmVpZ2hib3VyIHJhZGlvIHJlY29yZHMKKwkgKi8KKworCU1ldHJpY29tTm9kZVRhYmxlIHBvcnRhYmxlczsKKwlNZXRyaWNvbU5vZGVUYWJsZSBwb2xldG9wczsKK307CisKKy8qCisgKiBOb3RlOiBtYW51YWxfZGV2X2FkZHIgaGFjaworICogCisgKiBJdCBpcyBub3QgcG9zc2libGUgdG8gY2hhbmdlIHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9mIGEgTWV0cmljb20gcmFkaW8sCisgKiBvciB0byBzZW5kIHBhY2tldHMgd2l0aCBhIHVzZXItc3BlY2lmaWVkIGhhcmR3YXJlIHNvdXJjZSBhZGRyZXNzLCB0aHVzCisgKiB0cnlpbmcgdG8gbWFudWFsbHkgc2V0IGEgaGFyZHdhcmUgc291cmNlIGFkZHJlc3MgaXMgYSBxdWVzdGlvbmFibGUKKyAqIHRoaW5nIHRvIGRvLiAgSG93ZXZlciwgaWYgdGhlIHVzZXIgKmRvZXMqIG1hbnVhbGx5IHNldCB0aGUgaGFyZHdhcmUKKyAqIHNvdXJjZSBhZGRyZXNzIG9mIGEgU1RSSVAgaW50ZXJmYWNlLCB0aGVuIHRoZSBrZXJuZWwgd2lsbCBiZWxpZXZlIGl0LAorICogYW5kIHVzZSBpdCBpbiBjZXJ0YWluIHBsYWNlcy4gRm9yIGV4YW1wbGUsIHRoZSBoYXJkd2FyZSBhZGRyZXNzIGxpc3RlZAorICogYnkgaWZjb25maWcgd2lsbCBiZSB0aGUgbWFudWFsIGFkZHJlc3MsIG5vdCB0aGUgdHJ1ZSBvbmUuCisgKiAoQm90aCBhZGRyZXNzZXMgYXJlIGxpc3RlZCBpbiAvcHJvYy9uZXQvc3RyaXAuKQorICogQWxzbywgQVJQIHBhY2tldHMgd2lsbCBiZSBzZW50IG91dCBnaXZpbmcgdGhlIHVzZXItc3BlY2lmaWVkIGFkZHJlc3MgYXMKKyAqIHRoZSBzb3VyY2UgYWRkcmVzcywgbm90IHRoZSByZWFsIGFkZHJlc3MuIFRoaXMgaXMgZGFuZ2Vyb3VzLCBiZWNhdXNlCisgKiBpdCBtZWFucyB5b3Ugd29uJ3QgcmVjZWl2ZSBhbnkgcmVwbGllcyAtLSB0aGUgQVJQIHJlcGxpZXMgd2lsbCBnbyB0bworICogdGhlIHNwZWNpZmllZCBhZGRyZXNzLCB3aGljaCB3aWxsIGJlIHNvbWUgb3RoZXIgcmFkaW8uIFRoZSBjYXNlIHdoZXJlCisgKiB0aGlzIGlzIHVzZWZ1bCBpcyB3aGVuIHRoYXQgb3RoZXIgcmFkaW8gaXMgYWxzbyBjb25uZWN0ZWQgdG8gdGhlIHNhbWUKKyAqIG1hY2hpbmUuIFRoaXMgYWxsb3dzIHlvdSB0byBjb25uZWN0IGEgcGFpciBvZiByYWRpb3MgdG8gb25lIG1hY2hpbmUsCisgKiBhbmQgdG8gdXNlIG9uZSBleGNsdXNpdmVseSBmb3IgaW5ib3VuZCB0cmFmZmljLCBhbmQgdGhlIG90aGVyCisgKiBleGNsdXNpdmVseSBmb3Igb3V0Ym91bmQgdHJhZmZpYy4gUHJldHR5IG5lYXQsIGh1aD8KKyAqIAorICogSGVyZSdzIHRoZSBmdWxsIHByb2NlZHVyZSB0byBzZXQgdGhpcyB1cDoKKyAqIAorICogMS4gInNsYXR0YWNoIiB0d28gaW50ZXJmYWNlcywgZS5nLiBzdDAgZm9yIG91dGdvaW5nIHBhY2tldHMsCisgKiAgICBhbmQgc3QxIGZvciBpbmNvbWluZyBwYWNrZXRzCisgKiAKKyAqIDIuICJpZmNvbmZpZyIgc3QwIChvdXRib3VuZCByYWRpbykgdG8gaGF2ZSB0aGUgaGFyZHdhcmUgYWRkcmVzcworICogICAgd2hpY2ggaXMgdGhlIHJlYWwgaGFyZHdhcmUgYWRkcmVzcyBvZiBzdDEgKGluYm91bmQgcmFkaW8pLgorICogICAgTm93IHdoZW4gaXQgc2VuZHMgb3V0IHBhY2tldHMsIGl0IHdpbGwgbWFzcXVlcmFkZSBhcyBzdDEsIGFuZAorICogICAgcmVwbGllcyB3aWxsIGJlIHNlbnQgdG8gdGhhdCByYWRpbywgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIHdhbnQuCisgKiAKKyAqIDMuIFNldCB0aGUgcm91dGUgdGFibGUgZW50cnkgKCJyb3V0ZSBhZGQgZGVmYXVsdCAuLi4iIG9yCisgKiAgICAicm91dGUgYWRkIC1uZXQgLi4uIiwgYXMgYXBwcm9wcmlhdGUpIHRvIHNlbmQgcGFja2V0cyB2aWEgdGhlIHN0MAorICogICAgaW50ZXJmYWNlIChvdXRib3VuZCByYWRpbykuIERvIG5vdCBhZGQgYW55IHJvdXRlIHdoaWNoIHNlbmRzIHBhY2tldHMKKyAqICAgIG91dCB2aWEgdGhlIHN0MSBpbnRlcmZhY2UgLS0gdGhhdCByYWRpbyBpcyBmb3IgaW5ib3VuZCB0cmFmZmljIG9ubHkuCisgKiAKKyAqIDQuICJpZmNvbmZpZyIgc3QxIChpbmJvdW5kIHJhZGlvKSB0byBoYXZlIGhhcmR3YXJlIGFkZHJlc3MgemVyby4KKyAqICAgIFRoaXMgdGVsbHMgdGhlIFNUUklQIGRyaXZlciB0byAic2h1dCBkb3duIiB0aGF0IGludGVyZmFjZSBhbmQgbm90CisgKiAgICBzZW5kIGFueSBwYWNrZXRzIHRocm91Z2ggaXQuIEluIHBhcnRpY3VsYXIsIGl0IHN0b3BzIHNlbmRpbmcgdGhlCisgKiAgICBwZXJpb2RpYyBncmF0dWl0b3VzIEFSUCBwYWNrZXRzIHRoYXQgYSBTVFJJUCBpbnRlcmZhY2Ugbm9ybWFsbHkgc2VuZHMuCisgKiAgICBBbHNvLCB3aGVuIHBhY2tldHMgYXJyaXZlIG9uIHRoYXQgaW50ZXJmYWNlLCBpdCB3aWxsIHNlYXJjaCB0aGUKKyAqICAgIGludGVyZmFjZSBsaXN0IHRvIHNlZSBpZiB0aGVyZSBpcyBhbm90aGVyIGludGVyZmFjZSB3aG8ncyBtYW51YWwKKyAqICAgIGhhcmR3YXJlIGFkZHJlc3MgbWF0Y2hlcyBpdHMgb3duIHJlYWwgYWRkcmVzcyAoaS5lLiBzdDAgaW4gdGhpcworICogICAgZXhhbXBsZSkgYW5kIGlmIHNvIGl0IHdpbGwgdHJhbnNmZXIgb3duZXJzaGlwIG9mIHRoZSBza2J1ZmYgdG8KKyAqICAgIHRoYXQgaW50ZXJmYWNlLCBzbyB0aGF0IGl0IGxvb2tzIHRvIHRoZSBrZXJuZWwgYXMgaWYgdGhlIHBhY2tldAorICogICAgYXJyaXZlZCBvbiB0aGF0IGludGVyZmFjZS4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3aGVuIHRoZQorICogICAga2VybmVsIHNlbmRzIGFuIEFSUCBwYWNrZXQgb24gc3QwLCBpdCBleHBlY3RzIHRvIGdldCBhIHJlcGx5IG9uCisgKiAgICBzdDAsIGFuZCBpZiBpdCBzZWVzIHRoZSByZXBseSBjb21lIGZyb20gc3QxIHRoZW4gaXQgd2lsbCBpZ25vcmUKKyAqICAgIGl0ICh0byBiZSBhY2N1cmF0ZSwgaXQgcHV0cyB0aGUgZW50cnkgaW4gdGhlIEFSUCB0YWJsZSwgYnV0CisgKiAgICBsYWJlbGxlZCBpbiBzdWNoIGEgd2F5IHRoYXQgc3QwIGNhbid0IHVzZSBpdCkuCisgKiAKKyAqIFRoYW5rcyB0byBQZXRyb3MgTWFuaWF0aXMgZm9yIGNvbWluZyB1cCB3aXRoIHRoZSBpZGVhIG9mIHNwbGl0dGluZworICogaW5ib3VuZCBhbmQgb3V0Ym91bmQgdHJhZmZpYyBiZXR3ZWVuIHR3byBpbnRlcmZhY2VzLCB3aGljaCB0dXJuZWQKKyAqIG91dCB0byBiZSByZWFsbHkgZWFzeSB0byBpbXBsZW1lbnQsIGV2ZW4gaWYgaXQgaXMgYSBiaXQgb2YgYSBoYWNrLgorICogCisgKiBIYXZpbmcgc2V0IGEgbWFudWFsIGFkZHJlc3Mgb24gYW4gaW50ZXJmYWNlLCB5b3UgY2FuIHJlc3RvcmUgaXQKKyAqIHRvIGF1dG9tYXRpYyBvcGVyYXRpb24gKHdoZXJlIHRoZSBhZGRyZXNzIGlzIGF1dG9tYXRpY2FsbHkga2VwdAorICogY29uc2lzdGVudCB3aXRoIHRoZSByZWFsIGFkZHJlc3Mgb2YgdGhlIHJhZGlvKSBieSBzZXR0aW5nIGEgbWFudWFsCisgKiBhZGRyZXNzIG9mIGFsbCBvbmVzLCBlLmcuICJpZmNvbmZpZyBzdDAgaHcgc3RyaXAgRkZGRkZGRkZGRkZGIgorICogVGhpcyAndHVybnMgb2ZmJyBtYW51YWwgb3ZlcnJpZGUgbW9kZSBmb3IgdGhlIGRldmljZSBhZGRyZXNzLgorICogCisgKiBOb3RlOiBUaGUgSUVFRSA4MDIgaGVhZGVycyByZXBvcnRlZCBpbiB0Y3BkdW1wIHdpbGwgc2hvdyB0aGUgKnJlYWwqCisgKiByYWRpbyBhZGRyZXNzZXMgdGhlIHBhY2tldHMgd2VyZSBzZW50IGFuZCByZWNlaXZlZCBmcm9tLCBzbyB0aGF0IHlvdQorICogY2FuIHNlZSB3aGF0IGlzIHJlYWxseSBnb2luZyBvbiB3aXRoIHBhY2tldHMsIGFuZCB3aGljaCBpbnRlcmZhY2VzCisgKiB0aGV5IGFyZSByZWFsbHkgZ29pbmcgdGhyb3VnaC4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDb25zdGFudHMJCQkJCQkJCSovCisKKy8qCisgKiBDb21tYW5kU3RyaW5nMSB3b3JrcyBvbiBhbGwgcmFkaW9zCisgKiBPdGhlciBDb21tYW5kU3RyaW5ncyBhcmUgb25seSB1c2VkIHdpdGggZmlybXdhcmUgdGhhdCBwcm92aWRlcyBzdHJ1Y3R1cmVkIHJlc3BvbnNlcy4KKyAqIAorICogYXRzMzE5PTEgRW5hYmxlcyBJbmZvIG1lc3NhZ2UgZm9yIG5vZGUgYWRkaXRpb25zIGFuZCBkZWxldGlvbnMKKyAqIGF0czMxOT0yIEVuYWJsZXMgSW5mbyBtZXNzYWdlIGZvciBhIG5ldyBiZXN0IG5vZGUKKyAqIGF0czMxOT00IEVuYWJsZXMgY2hlY2tzdW1zCisgKiBhdHMzMTk9OCBFbmFibGVzIEFDSyBtZXNzYWdlcworICovCisKK3N0YXRpYyBjb25zdCBpbnQgTWF4Q29tbWFuZFN0cmluZ0xlbmd0aCA9IDMyOworc3RhdGljIGNvbnN0IGludCBDb21wYXRpYmlsaXR5Q29tbWFuZCA9IDE7CisKK3N0YXRpYyBjb25zdCBjaGFyIENvbW1hbmRTdHJpbmcwW10gPSAiKiZDT01NQU5EKkFUUzMxOT03IjsJLyogVHVybiBvbiBjaGVja3N1bXMgJiBpbmZvIG1lc3NhZ2VzICovCitzdGF0aWMgY29uc3QgY2hhciBDb21tYW5kU3RyaW5nMVtdID0gIiomQ09NTUFORCpBVFMzMDU/IjsJLyogUXVlcnkgcmFkaW8gbmFtZSAqLworc3RhdGljIGNvbnN0IGNoYXIgQ29tbWFuZFN0cmluZzJbXSA9ICIqJkNPTU1BTkQqQVRTMzI1PyI7CS8qIFF1ZXJ5IGJhdHRlcnkgdm9sdGFnZSAqLworc3RhdGljIGNvbnN0IGNoYXIgQ29tbWFuZFN0cmluZzNbXSA9ICIqJkNPTU1BTkQqQVRTMzAwPyI7CS8qIFF1ZXJ5IHZlcnNpb24gaW5mb3JtYXRpb24gKi8KK3N0YXRpYyBjb25zdCBjaGFyIENvbW1hbmRTdHJpbmc0W10gPSAiKiZDT01NQU5EKkFUUzMxMT8iOwkvKiBRdWVyeSBwb2xldG9wIGxpc3QgKi8KK3N0YXRpYyBjb25zdCBjaGFyIENvbW1hbmRTdHJpbmc1W10gPSAiKiZDT01NQU5EKkFUfkxBIjsJCS8qIFF1ZXJ5IHBvcnRhYmxlcyBsaXN0ICovCit0eXBlZGVmIHN0cnVjdCB7CisJY29uc3QgY2hhciAqc3RyaW5nOworCWxvbmcgbGVuZ3RoOworfSBTdHJpbmdEZXNjcmlwdG9yOworCitzdGF0aWMgY29uc3QgU3RyaW5nRGVzY3JpcHRvciBDb21tYW5kU3RyaW5nW10gPSB7CisJe0NvbW1hbmRTdHJpbmcwLCBzaXplb2YoQ29tbWFuZFN0cmluZzApIC0gMX0sCisJe0NvbW1hbmRTdHJpbmcxLCBzaXplb2YoQ29tbWFuZFN0cmluZzEpIC0gMX0sCisJe0NvbW1hbmRTdHJpbmcyLCBzaXplb2YoQ29tbWFuZFN0cmluZzIpIC0gMX0sCisJe0NvbW1hbmRTdHJpbmczLCBzaXplb2YoQ29tbWFuZFN0cmluZzMpIC0gMX0sCisJe0NvbW1hbmRTdHJpbmc0LCBzaXplb2YoQ29tbWFuZFN0cmluZzQpIC0gMX0sCisJe0NvbW1hbmRTdHJpbmc1LCBzaXplb2YoQ29tbWFuZFN0cmluZzUpIC0gMX0KK307CisKKyNkZWZpbmUgR09UX0FMTF9SQURJT19JTkZPKFMpICAgICAgXAorICAgICgoUyktPmZpcm13YXJlX3ZlcnNpb24uY1swXSAmJiBcCisgICAgIChTKS0+YmF0dGVyeV92b2x0YWdlLmNbMF0gICYmIFwKKyAgICAgbWVtY21wKCYoUyktPnRydWVfZGV2X2FkZHIsIHplcm9fYWRkcmVzcy5jLCBzaXplb2YoemVyb19hZGRyZXNzKSkpCisKK3N0YXRpYyBjb25zdCBjaGFyIGhleHRhYmxlWzE2XSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKworc3RhdGljIGNvbnN0IE1ldHJpY29tQWRkcmVzcyB6ZXJvX2FkZHJlc3M7CitzdGF0aWMgY29uc3QgTWV0cmljb21BZGRyZXNzIGJyb2FkY2FzdF9hZGRyZXNzID0KKyAgICB7IHsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGfSB9OworCitzdGF0aWMgY29uc3QgTWV0cmljb21LZXkgU0lQMEtleSA9IHsgIlNJUDAiIH07CitzdGF0aWMgY29uc3QgTWV0cmljb21LZXkgQVJQMEtleSA9IHsgIkFSUDAiIH07CitzdGF0aWMgY29uc3QgTWV0cmljb21LZXkgQVRSX0tleSA9IHsgIkFUUiAiIH07CitzdGF0aWMgY29uc3QgTWV0cmljb21LZXkgQUNLX0tleSA9IHsgIkFDS18iIH07CitzdGF0aWMgY29uc3QgTWV0cmljb21LZXkgSU5GX0tleSA9IHsgIklORl8iIH07CitzdGF0aWMgY29uc3QgTWV0cmljb21LZXkgRVJSX0tleSA9IHsgIkVSUl8iIH07CisKK3N0YXRpYyBjb25zdCBsb25nIE1heEFSUEludGVydmFsID0gNjAgKiBIWjsJLyogT25lIG1pbnV0ZSAqLworCisvKgorICogTWF4aW11bSBTdGFybW9kZSBwYWNrZXQgbGVuZ3RoIGlzIDExODMgYnl0ZXMuIEFsbG93aW5nIDQgYnl0ZXMgZm9yCisgKiBwcm90b2NvbCBrZXksIDQgYnl0ZXMgZm9yIGNoZWNrc3VtLCBvbmUgYnl0ZSBmb3IgQ1IsIGFuZCA2NS82NCBleHBhbnNpb24KKyAqIGZvciBTVFJJUCBlbmNvZGluZywgdGhhdCB0cmFuc2xhdGVzIHRvIGEgbWF4aW11bSBwYXlsb2FkIE1UVSBvZiAxMTU1LgorICogTm90ZTogQSBzdGFuZGFyZCBORlMgMUsgZGF0YSBwYWNrZXQgaXMgYSB0b3RhbCBvZiAweDQ4MCAoMTE1MikgYnl0ZXMKKyAqIGxvbmcsIGluY2x1ZGluZyBJUCBoZWFkZXIsIFVEUCBoZWFkZXIsIGFuZCBORlMgaGVhZGVyLiBTZXR0aW5nIHRoZSBTVFJJUAorICogTVRVIHRvIDExNTIgYWxsb3dzIHVzIHRvIHNlbmQgZGVmYXVsdCBzaXplZCBORlMgcGFja2V0cyB3aXRob3V0IGZyYWdtZW50YXRpb24uCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNQVhfU0VORF9NVFUgPSAxMTUyOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1BWF9SRUNWX01UVSA9IDE1MDA7CS8qIEhvcGluZyBmb3IgRXRoZXJuZXQgc2l6ZWQgcGFja2V0cyBpbiB0aGUgZnV0dXJlISAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IERFRkFVTFRfU1RSSVBfTVRVID0gMTE1MjsKK3N0YXRpYyBjb25zdCBpbnQgU1RSSVBfTUFHSUMgPSAweDUzMDM7CitzdGF0aWMgY29uc3QgbG9uZyBMb25nVGltZSA9IDB4N0ZGRkZGRkY7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHbG9iYWwgdmFyaWFibGVzCQkJCQkJCSovCisKK3N0YXRpYyBMSVNUX0hFQUQoc3RyaXBfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN0cmlwX2xvY2spOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWFjcm9zCQkJCQkJCQkqLworCisvKiBSZXR1cm5zIFRSVUUgaWYgdGV4dCBUIGJlZ2lucyB3aXRoIHByZWZpeCBQICovCisjZGVmaW5lIGhhc19wcmVmaXgoVCxMLFApICgoKEwpID49IHNpemVvZihQKS0xKSAmJiAhc3RybmNtcCgoVCksIChQKSwgc2l6ZW9mKFApLTEpKQorCisvKiBSZXR1cm5zIFRSVUUgaWYgdGV4dCBUIG9mIGxlbmd0aCBMIGlzIGVxdWFsIHRvIHN0cmluZyBTICovCisjZGVmaW5lIHRleHRfZXF1YWwoVCxMLFMpICgoKEwpID09IHNpemVvZihTKS0xKSAmJiAhc3RybmNtcCgoVCksIChTKSwgc2l6ZW9mKFMpLTEpKQorCisjZGVmaW5lIFJFQURIRVgoWCkgKChYKT49JzAnICYmIChYKTw9JzknID8gKFgpLScwJyA6ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoWCk+PSdhJyAmJiAoWCk8PSdmJyA/IChYKS0nYScrMTAgOiAgIFwKKyAgICAgICAgICAgICAgICAgICAgKFgpPj0nQScgJiYgKFgpPD0nRicgPyAoWCktJ0EnKzEwIDogMCApCisKKyNkZWZpbmUgUkVBREhFWDE2KFgpICgoX191MTYpKFJFQURIRVgoWCkpKQorCisjZGVmaW5lIFJFQURERUMoWCkgKChYKT49JzAnICYmIChYKTw9JzknID8gKFgpLScwJyA6IDApCisKKyNkZWZpbmUgQVJSQVlfRU5EKFgpICgmKChYKVtBUlJBWV9TSVpFKFgpXSkpCisKKyNkZWZpbmUgSklGRklFX1RPX1NFQyhYKSAoKFgpIC8gSFopCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFV0aWxpdHkgcm91dGluZXMJCQkJCQkJKi8KKworc3RhdGljIGludCBhcnBfcXVlcnkodW5zaWduZWQgY2hhciAqaGFkZHIsIHUzMiBwYWRkciwKKwkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoYm9yX2VudHJ5OworCisJbmVpZ2hib3JfZW50cnkgPSBuZWlnaF9sb29rdXAoJmFycF90YmwsICZwYWRkciwgZGV2KTsKKworCWlmIChuZWlnaGJvcl9lbnRyeSAhPSBOVUxMKSB7CisJCW5laWdoYm9yX2VudHJ5LT51c2VkID0gamlmZmllczsKKwkJaWYgKG5laWdoYm9yX2VudHJ5LT5udWRfc3RhdGUgJiBOVURfVkFMSUQpIHsKKwkJCW1lbWNweShoYWRkciwgbmVpZ2hib3JfZW50cnktPmhhLCBkZXYtPmFkZHJfbGVuKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBEdW1wRGF0YShjaGFyICptc2csIHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywgX191OCAqIHB0ciwKKwkJICAgICBfX3U4ICogZW5kKQoreworCXN0YXRpYyBjb25zdCBpbnQgTUFYX0R1bXBEYXRhID0gODA7CisJX191OCBwa3RfdGV4dFtNQVhfRHVtcERhdGFdLCAqcCA9IHBrdF90ZXh0OworCisJKnArKyA9ICdcIic7CisKKwl3aGlsZSAocHRyIDwgZW5kICYmIHAgPCAmcGt0X3RleHRbTUFYX0R1bXBEYXRhIC0gNF0pIHsKKwkJaWYgKCpwdHIgPT0gJ1xcJykgeworCQkJKnArKyA9ICdcXCc7CisJCQkqcCsrID0gJ1xcJzsKKwkJfSBlbHNlIHsKKwkJCWlmICgqcHRyID49IDMyICYmICpwdHIgPD0gMTI2KSB7CisJCQkJKnArKyA9ICpwdHI7CisJCQl9IGVsc2UgeworCQkJCXNwcmludGYocCwgIlxcJTAyWCIsICpwdHIpOworCQkJCXAgKz0gMzsKKwkJCX0KKwkJfQorCQlwdHIrKzsKKwl9CisKKwlpZiAocHRyID09IGVuZCkKKwkJKnArKyA9ICdcIic7CisJKnArKyA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJS0xM3Mlc1xuIiwgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBtc2csIHBrdF90ZXh0KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQnl0ZSBzdHVmZmluZy91bnN0dWZmaW5nIHJvdXRpbmVzCQkJCQkqLworCisvKiBTdHVmZmluZyBzY2hlbWU6CisgKiAwMCAgICBVbnVzZWQgKHJlc2VydmVkIGNoYXJhY3RlcikKKyAqIDAxLTNGIFJ1biBvZiAyLTY0IGRpZmZlcmVudCBjaGFyYWN0ZXJzCisgKiA0MC03RiBSdW4gb2YgMS02NCBkaWZmZXJlbnQgY2hhcmFjdGVycyBwbHVzIGEgc2luZ2xlIHplcm8gYXQgdGhlIGVuZAorICogODAtQkYgUnVuIG9mIDEtNjQgb2YgdGhlIHNhbWUgY2hhcmFjdGVyCisgKiBDMC1GRiBSdW4gb2YgMS02NCB6ZXJvZXMgKEFTQ0lJIDApCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKwlTdHVmZl9EaWZmID0gMHgwMCwKKwlTdHVmZl9EaWZmWmVybyA9IDB4NDAsCisJU3R1ZmZfU2FtZSA9IDB4ODAsCisJU3R1ZmZfWmVybyA9IDB4QzAsCisJU3R1ZmZfTm9Db2RlID0gMHhGRiwJLyogU3BlY2lhbCBjb2RlLCBtZWFuaW5nIG5vIGNvZGUgc2VsZWN0ZWQgKi8KKworCVN0dWZmX0NvZGVNYXNrID0gMHhDMCwKKwlTdHVmZl9Db3VudE1hc2sgPSAweDNGLAorCVN0dWZmX01heENvdW50ID0gMHgzRiwKKwlTdHVmZl9NYWdpYyA9IDB4MEQJLyogVGhlIHZhbHVlIHdlIGFyZSBlbGltaW5hdGluZyAqLworfSBTdHVmZmluZ0NvZGU7CisKKy8qIFN0dWZmRGF0YSBlbmNvZGVzIHRoZSBkYXRhIHN0YXJ0aW5nIGF0ICJzcmMiIGZvciAibGVuZ3RoIiBieXRlcy4KKyAqIEl0IHdyaXRlcyBpdCB0byB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgImRzdCIgKHdoaWNoIG11c3QgYmUgYXQgbGVhc3QKKyAqIGFzIGxvbmcgYXMgMSArIDY1LzY0IG9mIHRoZSBpbnB1dCBsZW5ndGgpLiBUaGUgb3V0cHV0IG1heSBiZSB1cCB0byAxLjYlCisgKiBsYXJnZXIgdGhhbiB0aGUgaW5wdXQgZm9yIHBhdGhvbG9naWNhbCBpbnB1dCwgYnV0IHdpbGwgdXN1YWxseSBiZSBzbWFsbGVyLgorICogU3R1ZmZEYXRhIHJldHVybnMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgZHN0IHBvaW50ZXIgYXMgaXRzIHJlc3VsdC4KKyAqICJjb2RlX3B0cl9wdHIiIHBvaW50cyB0byBhICJfX3U4ICoiIHdoaWNoIGlzIHVzZWQgdG8gaG9sZCBlbmNvZGluZyBzdGF0ZQorICogYmV0d2VlbiBjYWxscywgYWxsb3dpbmcgYW4gZW5jb2RlZCBwYWNrZXQgdG8gYmUgaW5jcmVtZW50YWxseSBidWlsdCB1cAorICogZnJvbSBzbWFsbCBwYXJ0cy4gT24gdGhlIGZpcnN0IGNhbGwsIHRoZSAiX191OCAqIiBwb2ludGVkIHRvIHNob3VsZCBiZQorICogaW5pdGlhbGl6ZWQgdG8gTlVMTDsgYmV0d2VlbiBzdWJzZXF1ZW50IGNhbGxzIHRoZSBjYWxsaW5nIHJvdXRpbmUgc2hvdWxkCisgKiBsZWF2ZSB0aGUgdmFsdWUgYWxvbmUgYW5kIHNpbXBseSBwYXNzIGl0IGJhY2sgdW5jaGFuZ2VkIHNvIHRoYXQgdGhlCisgKiBlbmNvZGVyIGNhbiByZWNvdmVyIGl0cyBjdXJyZW50IHN0YXRlLgorICovCisKKyNkZWZpbmUgU3R1ZmZEYXRhX0ZpbmlzaEJsb2NrKFgpIFwKKygqY29kZV9wdHIgPSAoWCkgXiBTdHVmZl9NYWdpYywgY29kZSA9IFN0dWZmX05vQ29kZSkKKworc3RhdGljIF9fdTggKlN0dWZmRGF0YShfX3U4ICogc3JjLCBfX3UzMiBsZW5ndGgsIF9fdTggKiBkc3QsCisJCSAgICAgICBfX3U4ICoqIGNvZGVfcHRyX3B0cikKK3sKKwlfX3U4ICplbmQgPSBzcmMgKyBsZW5ndGg7CisJX191OCAqY29kZV9wdHIgPSAqY29kZV9wdHJfcHRyOworCV9fdTggY29kZSA9IFN0dWZmX05vQ29kZSwgY291bnQgPSAwOworCisJaWYgKCFsZW5ndGgpCisJCXJldHVybiAoZHN0KTsKKworCWlmIChjb2RlX3B0cikgeworCQkvKgorCQkgKiBSZWNvdmVyIHN0YXRlIGZyb20gbGFzdCBjYWxsLCBpZiBhcHBsaWNhYmxlCisJCSAqLworCQljb2RlID0gKCpjb2RlX3B0ciBeIFN0dWZmX01hZ2ljKSAmIFN0dWZmX0NvZGVNYXNrOworCQljb3VudCA9ICgqY29kZV9wdHIgXiBTdHVmZl9NYWdpYykgJiBTdHVmZl9Db3VudE1hc2s7CisJfQorCisJd2hpbGUgKHNyYyA8IGVuZCkgeworCQlzd2l0Y2ggKGNvZGUpIHsKKwkJCS8qIFN0dWZmX05vQ29kZTogSWYgbm8gY3VycmVudCBjb2RlLCBzZWxlY3Qgb25lICovCisJCWNhc2UgU3R1ZmZfTm9Db2RlOgorCQkJLyogUmVjb3JkIHdoZXJlIHdlJ3JlIGdvaW5nIHRvIHB1dCB0aGlzIGNvZGUgKi8KKwkJCWNvZGVfcHRyID0gZHN0Kys7CisJCQljb3VudCA9IDA7CS8qIFJlc2V0IHRoZSBjb3VudCAoemVybyBtZWFucyBvbmUgaW5zdGFuY2UpICovCisJCQkvKiBUZW50YXRpdmVseSBzdGFydCBhIG5ldyBibG9jayAqLworCQkJaWYgKCpzcmMgPT0gMCkgeworCQkJCWNvZGUgPSBTdHVmZl9aZXJvOworCQkJCXNyYysrOworCQkJfSBlbHNlIHsKKwkJCQljb2RlID0gU3R1ZmZfU2FtZTsKKwkJCQkqZHN0KysgPSAqc3JjKysgXiBTdHVmZl9NYWdpYzsKKwkJCX0KKwkJCS8qIE5vdGU6IFdlIG9wdGltaXN0aWNhbGx5IGFzc3VtZSBydW4gb2Ygc2FtZSAtLSAqLworCQkJLyogd2hpY2ggd2lsbCBiZSBmaXhlZCBsYXRlciBpbiBTdHVmZl9TYW1lICovCisJCQkvKiBpZiBpdCB0dXJucyBvdXQgbm90IHRvIGJlIHRydWUuICovCisJCQlicmVhazsKKworCQkJLyogU3R1ZmZfWmVybzogV2UgYWxyZWFkeSBoYXZlIGF0IGxlYXN0IG9uZSB6ZXJvIGVuY29kZWQgKi8KKwkJY2FzZSBTdHVmZl9aZXJvOgorCQkJLyogSWYgYW5vdGhlciB6ZXJvLCBjb3VudCBpdCwgZWxzZSBmaW5pc2ggdGhpcyBjb2RlIGJsb2NrICovCisJCQlpZiAoKnNyYyA9PSAwKSB7CisJCQkJY291bnQrKzsKKwkJCQlzcmMrKzsKKwkJCX0gZWxzZSB7CisJCQkJU3R1ZmZEYXRhX0ZpbmlzaEJsb2NrKFN0dWZmX1plcm8gKyBjb3VudCk7CisJCQl9CisJCQlicmVhazsKKworCQkJLyogU3R1ZmZfU2FtZTogV2UgYWxyZWFkeSBoYXZlIGF0IGxlYXN0IG9uZSBieXRlIGVuY29kZWQgKi8KKwkJY2FzZSBTdHVmZl9TYW1lOgorCQkJLyogSWYgYW5vdGhlciBvbmUgdGhlIHNhbWUsIGNvdW50IGl0ICovCisJCQlpZiAoKCpzcmMgXiBTdHVmZl9NYWdpYykgPT0gY29kZV9wdHJbMV0pIHsKKwkJCQljb3VudCsrOworCQkJCXNyYysrOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZWxzZSwgdGhpcyBieXRlIGRvZXMgbm90IG1hdGNoIHRoaXMgYmxvY2suICovCisJCQkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgdHdvIG9yIG1vcmUgYnl0ZXMgZW5jb2RlZCwgZmluaXNoIHRoaXMgY29kZSBibG9jayAqLworCQkJaWYgKGNvdW50KSB7CisJCQkJU3R1ZmZEYXRhX0ZpbmlzaEJsb2NrKFN0dWZmX1NhbWUgKyBjb3VudCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBlbHNlLCB3ZSBvbmx5IGhhdmUgb25lIHNvIGZhciwgc28gc3dpdGNoIHRvIFN0dWZmX0RpZmYgY29kZSAqLworCQkJY29kZSA9IFN0dWZmX0RpZmY7CisJCQkvKiBhbmQgZmFsbCB0aHJvdWdoIHRvIFN0dWZmX0RpZmYgY2FzZSBiZWxvdworCQkJICogTm90ZSBjdW5uaW5nIGNsZXZlcm5lc3MgaGVyZTogY2FzZSBTdHVmZl9EaWZmIGNvbXBhcmVzIAorCQkJICogdGhlIGN1cnJlbnQgY2hhcmFjdGVyIHdpdGggdGhlIHByZXZpb3VzIHR3byB0byBzZWUgaWYgaXQKKwkJCSAqIGhhcyBhIHJ1biBvZiB0aHJlZSB0aGUgc2FtZS4gV29uJ3QgdGhpcyBiZSBhbiBlcnJvciBpZgorCQkJICogdGhlcmUgYXJlbid0IHR3byBwcmV2aW91cyBjaGFyYWN0ZXJzIHN0b3JlZCB0byBjb21wYXJlIHdpdGg/CisJCQkgKiBOby4gQmVjYXVzZSB3ZSBrbm93IHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyAqbm90KiB0aGUgc2FtZQorCQkJICogYXMgdGhlIHByZXZpb3VzIG9uZSwgdGhlIGZpcnN0IHRlc3QgYmVsb3cgd2lsbCBuZWNlc3NhcmlseQorCQkJICogZmFpbCBhbmQgdGhlIHNlbmQgaGFsZiBvZiB0aGUgImlmIiB3b24ndCBiZSBleGVjdXRlZC4KKwkJCSAqLworCisJCQkvKiBTdHVmZl9EaWZmOiBXZSBoYXZlIGF0IGxlYXN0IHR3byAqZGlmZmVyZW50KiBieXRlcyBlbmNvZGVkICovCisJCWNhc2UgU3R1ZmZfRGlmZjoKKwkJCS8qIElmIHRoaXMgaXMgYSB6ZXJvLCBtdXN0IGVuY29kZSBhIFN0dWZmX0RpZmZaZXJvLCBhbmQgYmVnaW4gYSBuZXcgYmxvY2sgKi8KKwkJCWlmICgqc3JjID09IDApIHsKKwkJCQlTdHVmZkRhdGFfRmluaXNoQmxvY2soU3R1ZmZfRGlmZlplcm8gKworCQkJCQkJICAgICAgY291bnQpOworCQkJfQorCQkJLyogZWxzZSwgaWYgd2UgaGF2ZSB0aHJlZSBpbiBhIHJvdywgaXQgaXMgd29ydGggc3RhcnRpbmcgYSBTdHVmZl9TYW1lIGJsb2NrICovCisJCQllbHNlIGlmICgoKnNyYyBeIFN0dWZmX01hZ2ljKSA9PSBkc3RbLTFdCisJCQkJICYmIGRzdFstMV0gPT0gZHN0Wy0yXSkgeworCQkJCS8qIEJhY2sgb2ZmIHRoZSBsYXN0IHR3byBjaGFyYWN0ZXJzIHdlIGVuY29kZWQgKi8KKwkJCQljb2RlICs9IGNvdW50IC0gMjsKKwkJCQkvKiBOb3RlOiAiU3R1ZmZfRGlmZiArIDAiIGlzIGFuIGlsbGVnYWwgY29kZSAqLworCQkJCWlmIChjb2RlID09IFN0dWZmX0RpZmYgKyAwKSB7CisJCQkJCWNvZGUgPSBTdHVmZl9TYW1lICsgMDsKKwkJCQl9CisJCQkJU3R1ZmZEYXRhX0ZpbmlzaEJsb2NrKGNvZGUpOworCQkJCWNvZGVfcHRyID0gZHN0IC0gMjsKKwkJCQkvKiBkc3RbLTFdIGFscmVhZHkgaG9sZHMgdGhlIGNvcnJlY3QgdmFsdWUgKi8KKwkJCQljb3VudCA9IDI7CS8qIDIgbWVhbnMgdGhyZWUgYnl0ZXMgZW5jb2RlZCAqLworCQkJCWNvZGUgPSBTdHVmZl9TYW1lOworCQkJfQorCQkJLyogZWxzZSwgYW5vdGhlciBkaWZmZXJlbnQgYnl0ZSwgc28gYWRkIGl0IHRvIHRoZSBibG9jayAqLworCQkJZWxzZSB7CisJCQkJKmRzdCsrID0gKnNyYyBeIFN0dWZmX01hZ2ljOworCQkJCWNvdW50Kys7CisJCQl9CisJCQlzcmMrKzsJLyogQ29uc3VtZSB0aGUgYnl0ZSAqLworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvdW50ID09IFN0dWZmX01heENvdW50KSB7CisJCQlTdHVmZkRhdGFfRmluaXNoQmxvY2soY29kZSArIGNvdW50KTsKKwkJfQorCX0KKwlpZiAoY29kZSA9PSBTdHVmZl9Ob0NvZGUpIHsKKwkJKmNvZGVfcHRyX3B0ciA9IE5VTEw7CisJfSBlbHNlIHsKKwkJKmNvZGVfcHRyX3B0ciA9IGNvZGVfcHRyOworCQlTdHVmZkRhdGFfRmluaXNoQmxvY2soY29kZSArIGNvdW50KTsKKwl9CisJcmV0dXJuIChkc3QpOworfQorCisvKgorICogVW5TdHVmZkRhdGEgZGVjb2RlcyB0aGUgZGF0YSBhdCAic3JjIiwgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSAiZW5kIi4KKyAqIEl0IHdyaXRlcyB0aGUgZGVjb2RlZCBkYXRhIGludG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5ICJkc3QiLCB1cCB0byBhCisgKiBtYXhpbXVtIG9mICJkc3RfbGVuZ3RoIiwgYW5kIHJldHVybnMgdGhlIG5ldyB2YWx1ZSBvZiAic3JjIiBzbyB0aGF0IGEKKyAqIGZvbGxvdy1vbiBjYWxsIGNhbiByZWFkIG1vcmUgZGF0YSwgY29udGludWluZyBmcm9tIHdoZXJlIHRoZSBmaXJzdCBsZWZ0IG9mZi4KKyAqIAorICogVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIHJlc3VsdHM6CisgKiAxLiBUaGUgc291cmNlIGRhdGEgcnVucyBvdXQgYmVmb3JlIGV4dHJhY3RpbmcgImRzdF9sZW5ndGgiIGJ5dGVzOgorICogICAgVW5TdHVmZkRhdGEgcmV0dXJucyBOVUxMIHRvIGluZGljYXRlIGZhaWx1cmUuCisgKiAyLiBUaGUgc291cmNlIGRhdGEgcHJvZHVjZXMgZXhhY3RseSAiZHN0X2xlbmd0aCIgYnl0ZXM6CisgKiAgICBVblN0dWZmRGF0YSByZXR1cm5zIG5ld19zcmMgPSBlbmQgdG8gaW5kaWNhdGUgdGhhdCBhbGwgYnl0ZXMgd2VyZSBjb25zdW1lZC4KKyAqIDMuICJkc3RfbGVuZ3RoIiBieXRlcyBhcmUgZXh0cmFjdGVkLCB3aXRoIG1vcmUgcmVtYWluaW5nLgorICogICAgVW5TdHVmZkRhdGEgcmV0dXJucyBuZXdfc3JjIDwgZW5kIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgYXJlIG1vcmUgYnl0ZXMKKyAqICAgIHRvIGJlIHJlYWQuCisgKiAKKyAqIE5vdGU6IFRoZSBkZWNvZGluZyBtYXkgYmUgZGVzdHJ1Y3RpdmUsIGluIHRoYXQgaXQgbWF5IGFsdGVyIHRoZSBzb3VyY2UKKyAqIGRhdGEgaW4gdGhlIHByb2Nlc3Mgb2YgZGVjb2RpbmcgaXQgKHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGFsbG93IGEgZm9sbG93LW9uCisgKiBjYWxsIHRvIHJlc3VtZSBjb3JyZWN0bHkpLgorICovCisKK3N0YXRpYyBfX3U4ICpVblN0dWZmRGF0YShfX3U4ICogc3JjLCBfX3U4ICogZW5kLCBfX3U4ICogZHN0LAorCQkJIF9fdTMyIGRzdF9sZW5ndGgpCit7CisJX191OCAqZHN0X2VuZCA9IGRzdCArIGRzdF9sZW5ndGg7CisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCFzcmMgfHwgIWVuZCB8fCAhZHN0IHx8ICFkc3RfbGVuZ3RoKQorCQlyZXR1cm4gKE5VTEwpOworCXdoaWxlIChzcmMgPCBlbmQgJiYgZHN0IDwgZHN0X2VuZCkgeworCQlpbnQgY291bnQgPSAoKnNyYyBeIFN0dWZmX01hZ2ljKSAmIFN0dWZmX0NvdW50TWFzazsKKwkJc3dpdGNoICgoKnNyYyBeIFN0dWZmX01hZ2ljKSAmIFN0dWZmX0NvZGVNYXNrKSB7CisJCWNhc2UgU3R1ZmZfRGlmZjoKKwkJCWlmIChzcmMgKyAxICsgY291bnQgPj0gZW5kKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlkbyB7CisJCQkJKmRzdCsrID0gKisrc3JjIF4gU3R1ZmZfTWFnaWM7CisJCQl9CisJCQl3aGlsZSAoLS1jb3VudCA+PSAwICYmIGRzdCA8IGRzdF9lbmQpOworCQkJaWYgKGNvdW50IDwgMCkKKwkJCQlzcmMgKz0gMTsKKwkJCWVsc2UgeworCQkJCWlmIChjb3VudCA9PSAwKQorCQkJCQkqc3JjID0gU3R1ZmZfU2FtZSBeIFN0dWZmX01hZ2ljOworCQkJCWVsc2UKKwkJCQkJKnNyYyA9CisJCQkJCSAgICAoU3R1ZmZfRGlmZiArCisJCQkJCSAgICAgY291bnQpIF4gU3R1ZmZfTWFnaWM7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTdHVmZl9EaWZmWmVybzoKKwkJCWlmIChzcmMgKyAxICsgY291bnQgPj0gZW5kKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlkbyB7CisJCQkJKmRzdCsrID0gKisrc3JjIF4gU3R1ZmZfTWFnaWM7CisJCQl9CisJCQl3aGlsZSAoLS1jb3VudCA+PSAwICYmIGRzdCA8IGRzdF9lbmQpOworCQkJaWYgKGNvdW50IDwgMCkKKwkJCQkqc3JjID0gU3R1ZmZfWmVybyBeIFN0dWZmX01hZ2ljOworCQkJZWxzZQorCQkJCSpzcmMgPQorCQkJCSAgICAoU3R1ZmZfRGlmZlplcm8gKyBjb3VudCkgXiBTdHVmZl9NYWdpYzsKKwkJCWJyZWFrOworCQljYXNlIFN0dWZmX1NhbWU6CisJCQlpZiAoc3JjICsgMSA+PSBlbmQpCisJCQkJcmV0dXJuIChOVUxMKTsKKwkJCWRvIHsKKwkJCQkqZHN0KysgPSBzcmNbMV0gXiBTdHVmZl9NYWdpYzsKKwkJCX0KKwkJCXdoaWxlICgtLWNvdW50ID49IDAgJiYgZHN0IDwgZHN0X2VuZCk7CisJCQlpZiAoY291bnQgPCAwKQorCQkJCXNyYyArPSAyOworCQkJZWxzZQorCQkJCSpzcmMgPSAoU3R1ZmZfU2FtZSArIGNvdW50KSBeIFN0dWZmX01hZ2ljOworCQkJYnJlYWs7CisJCWNhc2UgU3R1ZmZfWmVybzoKKwkJCWRvIHsKKwkJCQkqZHN0KysgPSAwOworCQkJfQorCQkJd2hpbGUgKC0tY291bnQgPj0gMCAmJiBkc3QgPCBkc3RfZW5kKTsKKwkJCWlmIChjb3VudCA8IDApCisJCQkJc3JjICs9IDE7CisJCQllbHNlCisJCQkJKnNyYyA9IChTdHVmZl9aZXJvICsgY291bnQpIF4gU3R1ZmZfTWFnaWM7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZHN0IDwgZHN0X2VuZCkKKwkJcmV0dXJuIChOVUxMKTsKKwllbHNlCisJCXJldHVybiAoc3JjKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogR2VuZXJhbCByb3V0aW5lcyBmb3IgU1RSSVAJCQkJCQkqLworCisvKgorICogZ2V0X2JhdWQgcmV0dXJucyB0aGUgY3VycmVudCBiYXVkIHJhdGUsIGFzIG9uZSBvZiB0aGUgY29uc3RhbnRzIGRlZmluZWQgaW4KKyAqIHRlcm1iaXRzLmgKKyAqIElmIHRoZSB1c2VyIGhhcyBpc3N1ZWQgYSBiYXVkIHJhdGUgb3ZlcnJpZGUgdXNpbmcgdGhlICdzZXRzZXJpYWwnIGNvbW1hbmQKKyAqIGFuZCB0aGUgbG9naWNhbCBjdXJyZW50IHJhdGUgaXMgc2V0IHRvIDM4LjQsIHRoZW4gdGhlIHRydWUgYmF1ZCByYXRlCisgKiBjdXJyZW50bHkgaW4gZWZmZWN0ICg1Ny42IG9yIDExNS4yKSBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfYmF1ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmICghdHR5IHx8ICF0dHktPnRlcm1pb3MpCisJCXJldHVybiAoMCk7CisJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgPT0gQjM4NDAwICYmIHR0eS0+ZHJpdmVyX2RhdGEpIHsKKwkJc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbyA9CisJCSAgICAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCQlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKKwkJCXJldHVybiAoQjU3NjAwKTsKKwkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQorCQkJcmV0dXJuIChCMTE1MjAwKTsKKwl9CisJcmV0dXJuICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCk7Cit9CisKKy8qCisgKiBzZXRfYmF1ZCBzZXRzIHRoZSBiYXVkIHJhdGUgdG8gdGhlIHJhdGUgZGVmaW5lZCBieSBiYXVkY29kZQorICogTm90ZTogVGhlIHJhdGUgQjM4NDAwIHNob3VsZCBiZSBhdm9pZGVkLCBiZWNhdXNlIHRoZSB1c2VyIG1heSBoYXZlCisgKiBpc3N1ZWQgYSAnc2V0c2VyaWFsJyBzcGVlZCBvdmVycmlkZSB0byBtYXAgdGhhdCB0byBhIGRpZmZlcmVudCBzcGVlZC4KKyAqIFdlIGNvdWxkIGFjaGlldmUgYSB0cnVlIHJhdGUgb2YgMzg0MDAgaWYgd2UgbmVlZGVkIHRvIGJ5IGNhbmNlbGxpbmcKKyAqIGFueSB1c2VyIHNwZWVkIG92ZXJyaWRlIHRoYXQgaXMgaW4gcGxhY2UsIGJ1dCB0aGF0IG1pZ2h0IGFubm95IHRoZQorICogdXNlciwgc28gaXQgaXMgc2ltcGxlc3QgdG8ganVzdCBhdm9pZCB1c2luZyAzODQwMC4KKyAqLworc3RhdGljIHZvaWQgc2V0X2JhdWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGJhdWRjb2RlKQoreworCXN0cnVjdCB0ZXJtaW9zIG9sZF90ZXJtaW9zID0gKih0dHktPnRlcm1pb3MpOworCXR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+Q0JBVUQ7CS8qIENsZWFyIHRoZSBvbGQgYmF1ZCBzZXR0aW5nICovCisJdHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IGJhdWRjb2RlOwkvKiBTZXQgdGhlIG5ldyBiYXVkIHNldHRpbmcgKi8KKwl0dHktPmRyaXZlci0+c2V0X3Rlcm1pb3ModHR5LCAmb2xkX3Rlcm1pb3MpOworfQorCisvKgorICogQ29udmVydCBhIHN0cmluZyB0byBhIE1ldHJpY29tIEFkZHJlc3MuCisgKi8KKworI2RlZmluZSBJU19SQURJT19BRERSRVNTKHApICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpc2RpZ2l0KChwKVswXSkgJiYgaXNkaWdpdCgocClbMV0pICYmIGlzZGlnaXQoKHApWzJdKSAmJiBpc2RpZ2l0KChwKVszXSkgJiYgXAorICAocClbNF0gPT0gJy0nICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpc2RpZ2l0KChwKVs1XSkgJiYgaXNkaWdpdCgocClbNl0pICYmIGlzZGlnaXQoKHApWzddKSAmJiBpc2RpZ2l0KChwKVs4XSkgICAgKQorCitzdGF0aWMgaW50IHN0cmluZ190b19yYWRpb19hZGRyZXNzKE1ldHJpY29tQWRkcmVzcyAqIGFkZHIsIF9fdTggKiBwKQoreworCWlmICghSVNfUkFESU9fQUREUkVTUyhwKSkKKwkJcmV0dXJuICgxKTsKKwlhZGRyLT5jWzBdID0gMDsKKwlhZGRyLT5jWzFdID0gMDsKKwlhZGRyLT5jWzJdID0gUkVBREhFWChwWzBdKSA8PCA0IHwgUkVBREhFWChwWzFdKTsKKwlhZGRyLT5jWzNdID0gUkVBREhFWChwWzJdKSA8PCA0IHwgUkVBREhFWChwWzNdKTsKKwlhZGRyLT5jWzRdID0gUkVBREhFWChwWzVdKSA8PCA0IHwgUkVBREhFWChwWzZdKTsKKwlhZGRyLT5jWzVdID0gUkVBREhFWChwWzddKSA8PCA0IHwgUkVBREhFWChwWzhdKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogQ29udmVydCBhIE1ldHJpY29tIEFkZHJlc3MgdG8gYSBzdHJpbmcuCisgKi8KKworc3RhdGljIF9fdTggKnJhZGlvX2FkZHJlc3NfdG9fc3RyaW5nKGNvbnN0IE1ldHJpY29tQWRkcmVzcyAqIGFkZHIsCisJCQkJICAgICBNZXRyaWNvbUFkZHJlc3NTdHJpbmcgKiBwKQoreworCXNwcmludGYocC0+YywgIiUwMlglMDJYLSUwMlglMDJYIiwgYWRkci0+Y1syXSwgYWRkci0+Y1szXSwKKwkJYWRkci0+Y1s0XSwgYWRkci0+Y1s1XSk7CisJcmV0dXJuIChwLT5jKTsKK30KKworLyoKKyAqIE5vdGU6IE11c3QgbWFrZSBzdXJlIHN4X3NpemUgaXMgYmlnIGVub3VnaCB0byByZWNlaXZlIGEgc3R1ZmZlZAorICogTUFYX1JFQ1ZfTVRVIHBhY2tldC4gQWRkaXRpb25hbGx5LCB3ZSBhbHNvIHdhbnQgdG8gZW5zdXJlIHRoYXQgaXQncworICogYmlnIGVub3VnaCB0byByZWNlaXZlIGEgbGFyZ2UgcmFkaW8gbmVpZ2hib3VyIGxpc3QgKGN1cnJlbnRseSA0SykuCisgKi8KKworc3RhdGljIGludCBhbGxvY2F0ZV9idWZmZXJzKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywgaW50IG10dSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3RyaXBfaW5mby0+ZGV2OworCWludCBzeF9zaXplID0gbWF4X3QoaW50LCBTVFJJUF9FTkNBUF9TSVpFKE1BWF9SRUNWX01UVSksIDQwOTYpOworCWludCB0eF9zaXplID0gU1RSSVBfRU5DQVBfU0laRShtdHUpICsgTWF4Q29tbWFuZFN0cmluZ0xlbmd0aDsKKwlfX3U4ICpyID0ga21hbGxvYyhNQVhfUkVDVl9NVFUsIEdGUF9BVE9NSUMpOworCV9fdTggKnMgPSBrbWFsbG9jKHN4X3NpemUsIEdGUF9BVE9NSUMpOworCV9fdTggKnQgPSBrbWFsbG9jKHR4X3NpemUsIEdGUF9BVE9NSUMpOworCWlmIChyICYmIHMgJiYgdCkgeworCQlzdHJpcF9pbmZvLT5yeF9idWZmID0gcjsKKwkJc3RyaXBfaW5mby0+c3hfYnVmZiA9IHM7CisJCXN0cmlwX2luZm8tPnR4X2J1ZmYgPSB0OworCQlzdHJpcF9pbmZvLT5zeF9zaXplID0gc3hfc2l6ZTsKKwkJc3RyaXBfaW5mby0+dHhfc2l6ZSA9IHR4X3NpemU7CisJCXN0cmlwX2luZm8tPm10dSA9IGRldi0+bXR1ID0gbXR1OworCQlyZXR1cm4gKDEpOworCX0KKwlpZiAocikKKwkJa2ZyZWUocik7CisJaWYgKHMpCisJCWtmcmVlKHMpOworCWlmICh0KQorCQlrZnJlZSh0KTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogTVRVIGhhcyBiZWVuIGNoYW5nZWQgYnkgdGhlIElQIGxheWVyLiAKKyAqIFdlIGNvdWxkIGJlIGluCisgKiBhbiB1cGNhbGwgZnJvbSB0aGUgdHR5IGRyaXZlciwgb3IgaW4gYW4gaXAgcGFja2V0IHF1ZXVlLgorICovCitzdGF0aWMgaW50IHN0cmlwX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgb2xkX210dSA9IHN0cmlwX2luZm8tPm10dTsKKwl1bnNpZ25lZCBjaGFyICpvcmJ1ZmYgPSBzdHJpcF9pbmZvLT5yeF9idWZmOworCXVuc2lnbmVkIGNoYXIgKm9zYnVmZiA9IHN0cmlwX2luZm8tPnN4X2J1ZmY7CisJdW5zaWduZWQgY2hhciAqb3RidWZmID0gc3RyaXBfaW5mby0+dHhfYnVmZjsKKworCWlmIChuZXdfbXR1ID4gTUFYX1NFTkRfTVRVKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBNVFUgZXhjZWVkcyBtYXhpbXVtIGFsbG93YWJsZSAoJWQpLCBNVFUgY2hhbmdlIGNhbmNlbGxlZC5cbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIE1BWF9TRU5EX01UVSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19iaCgmc3RyaXBfbG9jayk7CisJaWYgKCFhbGxvY2F0ZV9idWZmZXJzKHN0cmlwX2luZm8sIG5ld19tdHUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBncm93IHN0cmlwIGJ1ZmZlcnMsIE1UVSBjaGFuZ2UgY2FuY2VsbGVkLlxuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7CisJCXNwaW5fdW5sb2NrX2JoKCZzdHJpcF9sb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKHN0cmlwX2luZm8tPnN4X2NvdW50KSB7CisJCWlmIChzdHJpcF9pbmZvLT5zeF9jb3VudCA8PSBzdHJpcF9pbmZvLT5zeF9zaXplKQorCQkJbWVtY3B5KHN0cmlwX2luZm8tPnN4X2J1ZmYsIG9zYnVmZiwKKwkJCSAgICAgICBzdHJpcF9pbmZvLT5zeF9jb3VudCk7CisJCWVsc2UgeworCQkJc3RyaXBfaW5mby0+ZGlzY2FyZCA9IHN0cmlwX2luZm8tPnN4X2NvdW50OworCQkJc3RyaXBfaW5mby0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJfQorCX0KKworCWlmIChzdHJpcF9pbmZvLT50eF9sZWZ0KSB7CisJCWlmIChzdHJpcF9pbmZvLT50eF9sZWZ0IDw9IHN0cmlwX2luZm8tPnR4X3NpemUpCisJCQltZW1jcHkoc3RyaXBfaW5mby0+dHhfYnVmZiwgc3RyaXBfaW5mby0+dHhfaGVhZCwKKwkJCSAgICAgICBzdHJpcF9pbmZvLT50eF9sZWZ0KTsKKwkJZWxzZSB7CisJCQlzdHJpcF9pbmZvLT50eF9sZWZ0ID0gMDsKKwkJCXN0cmlwX2luZm8tPnR4X2Ryb3BwZWQrKzsKKwkJfQorCX0KKwlzdHJpcF9pbmZvLT50eF9oZWFkID0gc3RyaXBfaW5mby0+dHhfYnVmZjsKKwlzcGluX3VubG9ja19iaCgmc3RyaXBfbG9jayk7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBzdHJpcCBNVFUgY2hhbmdlZCBmb20gJWQgdG8gJWQuXG4iLAorCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIG9sZF9tdHUsIHN0cmlwX2luZm8tPm10dSk7CisKKwlpZiAob3JidWZmKQorCQlrZnJlZShvcmJ1ZmYpOworCWlmIChvc2J1ZmYpCisJCWtmcmVlKG9zYnVmZik7CisJaWYgKG90YnVmZikKKwkJa2ZyZWUob3RidWZmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdHJpcF91bmxvY2soc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvKQoreworCS8qCisJICogU2V0IHRoZSB0aW1lciB0byBnbyBvZmYgaW4gb25lIHNlY29uZC4KKwkgKi8KKwlzdHJpcF9pbmZvLT5pZGxlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMSAqIEhaOworCWFkZF90aW1lcigmc3RyaXBfaW5mby0+aWRsZV90aW1lcik7CisJbmV0aWZfd2FrZV9xdWV1ZShzdHJpcF9pbmZvLT5kZXYpOworfQorCisKKworLyoKKyAqIElmIHRoZSB0aW1lIGlzIGluIHRoZSBuZWFyIGZ1dHVyZSwgdGltZV9kZWx0YSBwcmludHMgdGhlIG51bWJlciBvZgorICogc2Vjb25kcyB0byBnbyBpbnRvIHRoZSBidWZmZXIgYW5kIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlci4KKyAqIElmIHRoZSB0aW1lIGlzIG5vdCBpbiB0aGUgbmVhciBmdXR1cmUsIGl0IHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlCisgKiBzdHJpbmcgIk5vdCBzY2hlZHVsZWQiIFRoZSBidWZmZXIgbXVzdCBiZSBsb25nIGVub3VnaCB0byBjb250YWluIHRoZQorICogYXNjaWkgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlciBwbHVzIDkgY2hhcmFjdGVzIGZvciB0aGUgIiBzZWNvbmRzIgorICogYW5kIHRoZSBudWxsIGNoYXJhY3Rlci4KKyAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgY2hhciAqdGltZV9kZWx0YShjaGFyIGJ1ZmZlcltdLCBsb25nIHRpbWUpCit7CisJdGltZSAtPSBqaWZmaWVzOworCWlmICh0aW1lID4gTG9uZ1RpbWUgLyAyKQorCQlyZXR1cm4gKCJOb3Qgc2NoZWR1bGVkIik7CisJaWYgKHRpbWUgPCAwKQorCQl0aW1lID0gMDsJLyogRG9uJ3QgcHJpbnQgbmVnYXRpdmUgdGltZXMgKi8KKwlzcHJpbnRmKGJ1ZmZlciwgIiVsZCBzZWNvbmRzIiwgdGltZSAvIEhaKTsKKwlyZXR1cm4gKGJ1ZmZlcik7Cit9CisKKy8qIGdldCBOdGggZWxlbWVudCBvZiB0aGUgbGlua2VkIGxpc3QgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2dldF9pZHgobG9mZl90IHBvcykgCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlpbnQgaSA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX3JjdShsLCAmc3RyaXBfbGlzdCkgeworCQlpZiAocG9zID09IGkpCisJCQlyZXR1cm4gbGlzdF9lbnRyeShsLCBzdHJ1Y3Qgc3RyaXAsIGxpc3QpOworCQkrK2k7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqc3RyaXBfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlyY3VfcmVhZF9sb2NrKCk7CisJcmV0dXJuICpwb3MgPyBzdHJpcF9nZXRfaWR4KCpwb3MgLSAxKSA6IFNFUV9TVEFSVF9UT0tFTjsKK30KKworc3RhdGljIHZvaWQgKnN0cmlwX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCXN0cnVjdCBzdHJpcCAqczsKKworCSsrKnBvczsKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXJldHVybiBzdHJpcF9nZXRfaWR4KDEpOworCisJcyA9IHY7CisJbCA9ICZzLT5saXN0OworCWxpc3RfZm9yX2VhY2hfY29udGludWVfcmN1KGwsICZzdHJpcF9saXN0KSB7CisJCXJldHVybiBsaXN0X2VudHJ5KGwsIHN0cnVjdCBzdHJpcCwgbGlzdCk7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzdHJpcF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworc3RhdGljIHZvaWQgc3RyaXBfc2VxX25laWdoYm91cnMoc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkgICBjb25zdCBNZXRyaWNvbU5vZGVUYWJsZSAqIHRhYmxlLAorCQkJICAgY29uc3QgY2hhciAqdGl0bGUpCit7CisJLyogV2Ugd3JhcCB0aGlzIGluIGEgZG8vd2hpbGUgbG9vcCwgc28gaWYgdGhlIHRhYmxlIGNoYW5nZXMgKi8KKwkvKiB3aGlsZSB3ZSdyZSByZWFkaW5nIGl0LCB3ZSBqdXN0IGdvIGFyb3VuZCBhbmQgdHJ5IGFnYWluLiAqLworCXN0cnVjdCB0aW1ldmFsIHQ7CisKKwlkbyB7CisJCWludCBpOworCQl0ID0gdGFibGUtPnRpbWVzdGFtcDsKKwkJaWYgKHRhYmxlLT5udW1fbm9kZXMpCisJCQlzZXFfcHJpbnRmKHNlcSwgIlxuICVzXG4iLCB0aXRsZSk7CisJCWZvciAoaSA9IDA7IGkgPCB0YWJsZS0+bnVtX25vZGVzOyBpKyspIHsKKwkJCU1ldHJpY29tTm9kZSBub2RlOworCisJCQlzcGluX2xvY2tfYmgoJnN0cmlwX2xvY2spOworCQkJbm9kZSA9IHRhYmxlLT5ub2RlW2ldOworCQkJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworCQkJc2VxX3ByaW50ZihzZXEsICIgICVzXG4iLCBub2RlLmMpOworCQl9CisJfSB3aGlsZSAodGFibGUtPnRpbWVzdGFtcC50dl9zZWMgIT0gdC50dl9zZWMKKwkJIHx8IHRhYmxlLT50aW1lc3RhbXAudHZfdXNlYyAhPSB0LnR2X3VzZWMpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBwcmludHMgcmFkaW8gc3RhdHVzIGluZm9ybWF0aW9uIHZpYSB0aGUgc2VxX2ZpbGUKKyAqIGludGVyZmFjZS4gIFRoZSBpbnRlcmZhY2UgdGFrZXMgY2FyZSBvZiBidWZmZXIgc2l6ZSBhbmQgb3ZlcgorICogcnVuIGlzc3Vlcy4gCisgKgorICogVGhlIGJ1ZmZlciBpbiBzZXFfZmlsZSBpcyBQQUdFU0laRSAoNEspIAorICogc28gdGhpcyByb3V0aW5lIHNob3VsZCBuZXZlciBwcmludCBtb3JlIG9yIGl0IHdpbGwgZ2V0IHRydW5jYXRlZC4KKyAqIFdpdGggdGhlIG1heGltdW0gb2YgMzIgcG9ydGFibGVzIGFuZCAzMiBwb2xldG9wcworICogcmVwb3J0ZWQsIHRoZSByb3V0aW5lIG91dHB1dHMgMzEwNyBieXRlcyBpbnRvIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIHN0cmlwX3NlcV9zdGF0dXNfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgCisJCQkJICBjb25zdCBzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8pCit7CisJY2hhciB0ZW1wWzMyXTsKKwlNZXRyaWNvbUFkZHJlc3NTdHJpbmcgYWRkcl9zdHJpbmc7CisKKwkvKiBGaXJzdCwgd2UgbXVzdCBjb3B5IGFsbCBvZiBvdXIgZGF0YSB0byBhIHNhZmUgcGxhY2UsICovCisJLyogaW4gY2FzZSBhIHNlcmlhbCBpbnRlcnJ1cHQgY29tZXMgaW4gYW5kIGNoYW5nZXMgaXQuICAqLworCWludCB0eF9sZWZ0ID0gc3RyaXBfaW5mby0+dHhfbGVmdDsKKwl1bnNpZ25lZCBsb25nIHJ4X2F2ZXJhZ2VfcHBzID0gc3RyaXBfaW5mby0+cnhfYXZlcmFnZV9wcHM7CisJdW5zaWduZWQgbG9uZyB0eF9hdmVyYWdlX3BwcyA9IHN0cmlwX2luZm8tPnR4X2F2ZXJhZ2VfcHBzOworCXVuc2lnbmVkIGxvbmcgc3hfYXZlcmFnZV9wcHMgPSBzdHJpcF9pbmZvLT5zeF9hdmVyYWdlX3BwczsKKwlpbnQgd29ya2luZyA9IHN0cmlwX2luZm8tPndvcmtpbmc7CisJaW50IGZpcm13YXJlX2xldmVsID0gc3RyaXBfaW5mby0+ZmlybXdhcmVfbGV2ZWw7CisJbG9uZyB3YXRjaGRvZ19kb3Byb2JlID0gc3RyaXBfaW5mby0+d2F0Y2hkb2dfZG9wcm9iZTsKKwlsb25nIHdhdGNoZG9nX2RvcmVzZXQgPSBzdHJpcF9pbmZvLT53YXRjaGRvZ19kb3Jlc2V0OworCWxvbmcgZ3JhdHVpdG91c19hcnAgPSBzdHJpcF9pbmZvLT5ncmF0dWl0b3VzX2FycDsKKwlsb25nIGFycF9pbnRlcnZhbCA9IHN0cmlwX2luZm8tPmFycF9pbnRlcnZhbDsKKwlGaXJtd2FyZVZlcnNpb24gZmlybXdhcmVfdmVyc2lvbiA9IHN0cmlwX2luZm8tPmZpcm13YXJlX3ZlcnNpb247CisJU2VyaWFsTnVtYmVyIHNlcmlhbF9udW1iZXIgPSBzdHJpcF9pbmZvLT5zZXJpYWxfbnVtYmVyOworCUJhdHRlcnlWb2x0YWdlIGJhdHRlcnlfdm9sdGFnZSA9IHN0cmlwX2luZm8tPmJhdHRlcnlfdm9sdGFnZTsKKwljaGFyICppZl9uYW1lID0gc3RyaXBfaW5mby0+ZGV2LT5uYW1lOworCU1ldHJpY29tQWRkcmVzcyB0cnVlX2Rldl9hZGRyID0gc3RyaXBfaW5mby0+dHJ1ZV9kZXZfYWRkcjsKKwlNZXRyaWNvbUFkZHJlc3MgZGV2X2Rldl9hZGRyID0KKwkgICAgKihNZXRyaWNvbUFkZHJlc3MgKikgc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkcjsKKwlpbnQgbWFudWFsX2Rldl9hZGRyID0gc3RyaXBfaW5mby0+bWFudWFsX2Rldl9hZGRyOworI2lmZGVmIEVYVF9DT1VOVEVSUworCXVuc2lnbmVkIGxvbmcgcnhfYnl0ZXMgPSBzdHJpcF9pbmZvLT5yeF9ieXRlczsKKwl1bnNpZ25lZCBsb25nIHR4X2J5dGVzID0gc3RyaXBfaW5mby0+dHhfYnl0ZXM7CisJdW5zaWduZWQgbG9uZyByeF9yYnl0ZXMgPSBzdHJpcF9pbmZvLT5yeF9yYnl0ZXM7CisJdW5zaWduZWQgbG9uZyB0eF9yYnl0ZXMgPSBzdHJpcF9pbmZvLT50eF9yYnl0ZXM7CisJdW5zaWduZWQgbG9uZyByeF9zYnl0ZXMgPSBzdHJpcF9pbmZvLT5yeF9zYnl0ZXM7CisJdW5zaWduZWQgbG9uZyB0eF9zYnl0ZXMgPSBzdHJpcF9pbmZvLT50eF9zYnl0ZXM7CisJdW5zaWduZWQgbG9uZyByeF9lYnl0ZXMgPSBzdHJpcF9pbmZvLT5yeF9lYnl0ZXM7CisJdW5zaWduZWQgbG9uZyB0eF9lYnl0ZXMgPSBzdHJpcF9pbmZvLT50eF9lYnl0ZXM7CisjZW5kaWYKKworCXNlcV9wcmludGYoc2VxLCAiXG5JbnRlcmZhY2UgbmFtZVx0XHQlc1xuIiwgaWZfbmFtZSk7CisJc2VxX3ByaW50ZihzZXEsICIgUmFkaW8gd29ya2luZzpcdFx0JXNcbiIsIHdvcmtpbmcgPyAiWWVzIiA6ICJObyIpOworCXJhZGlvX2FkZHJlc3NfdG9fc3RyaW5nKCZ0cnVlX2Rldl9hZGRyLCAmYWRkcl9zdHJpbmcpOworCXNlcV9wcmludGYoc2VxLCAiIFJhZGlvIGFkZHJlc3M6XHRcdCVzXG4iLCBhZGRyX3N0cmluZy5jKTsKKwlpZiAobWFudWFsX2Rldl9hZGRyKSB7CisJCXJhZGlvX2FkZHJlc3NfdG9fc3RyaW5nKCZkZXZfZGV2X2FkZHIsICZhZGRyX3N0cmluZyk7CisJCXNlcV9wcmludGYoc2VxLCAiIERldmljZSBhZGRyZXNzOlx0JXNcbiIsIGFkZHJfc3RyaW5nLmMpOworCX0KKwlzZXFfcHJpbnRmKHNlcSwgIiBGaXJtd2FyZSB2ZXJzaW9uOlx0JXMiLCAhd29ya2luZyA/ICJVbmtub3duIiA6CisJCSAgICAgIWZpcm13YXJlX2xldmVsID8gIlNob3VsZCBiZSB1cGdyYWRlZCIgOgorCQkgICAgIGZpcm13YXJlX3ZlcnNpb24uYyk7CisJaWYgKGZpcm13YXJlX2xldmVsID49IENoZWNrc3VtbWVkTWVzc2FnZXMpCisJCXNlcV9wcmludGYoc2VxLCAiIChDaGVja3N1bXMgRW5hYmxlZCkiKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisJc2VxX3ByaW50ZihzZXEsICIgU2VyaWFsIG51bWJlcjpcdFx0JXNcbiIsIHNlcmlhbF9udW1iZXIuYyk7CisJc2VxX3ByaW50ZihzZXEsICIgQmF0dGVyeSB2b2x0YWdlOlx0JXNcbiIsIGJhdHRlcnlfdm9sdGFnZS5jKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiBUcmFuc21pdCBxdWV1ZSAoYnl0ZXMpOiVkXG4iLCB0eF9sZWZ0KTsKKwlzZXFfcHJpbnRmKHNlcSwgIiBSZWNlaXZlIHBhY2tldCByYXRlOiAgICVsZCBwYWNrZXRzIHBlciBzZWNvbmRcbiIsCisJCSAgICAgcnhfYXZlcmFnZV9wcHMgLyA4KTsKKwlzZXFfcHJpbnRmKHNlcSwgIiBUcmFuc21pdCBwYWNrZXQgcmF0ZTogICVsZCBwYWNrZXRzIHBlciBzZWNvbmRcbiIsCisJCSAgICAgdHhfYXZlcmFnZV9wcHMgLyA4KTsKKwlzZXFfcHJpbnRmKHNlcSwgIiBTZW50IHBhY2tldCByYXRlOiAgICAgICVsZCBwYWNrZXRzIHBlciBzZWNvbmRcbiIsCisJCSAgICAgc3hfYXZlcmFnZV9wcHMgLyA4KTsKKwlzZXFfcHJpbnRmKHNlcSwgIiBOZXh0IHdhdGNoZG9nIHByb2JlOlx0JXNcbiIsCisJCSAgICAgdGltZV9kZWx0YSh0ZW1wLCB3YXRjaGRvZ19kb3Byb2JlKSk7CisJc2VxX3ByaW50ZihzZXEsICIgTmV4dCB3YXRjaGRvZyByZXNldDpcdCVzXG4iLAorCQkgICAgIHRpbWVfZGVsdGEodGVtcCwgd2F0Y2hkb2dfZG9yZXNldCkpOworCXNlcV9wcmludGYoc2VxLCAiIE5leHQgZ3JhdHVpdG91cyBBUlA6XHQiKTsKKworCWlmICghbWVtY21wCisJICAgIChzdHJpcF9pbmZvLT5kZXYtPmRldl9hZGRyLCB6ZXJvX2FkZHJlc3MuYywKKwkgICAgIHNpemVvZih6ZXJvX2FkZHJlc3MpKSkKKwkJc2VxX3ByaW50ZihzZXEsICJEaXNhYmxlZFxuIik7CisJZWxzZSB7CisJCXNlcV9wcmludGYoc2VxLCAiJXNcbiIsIHRpbWVfZGVsdGEodGVtcCwgZ3JhdHVpdG91c19hcnApKTsKKwkJc2VxX3ByaW50ZihzZXEsICIgTmV4dCBBUlAgaW50ZXJ2YWw6XHQlbGQgc2Vjb25kc1xuIiwKKwkJCSAgICAgSklGRklFX1RPX1NFQyhhcnBfaW50ZXJ2YWwpKTsKKwl9CisKKwlpZiAod29ya2luZykgeworI2lmZGVmIEVYVF9DT1VOVEVSUworCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisJCXNlcV9wcmludGYoc2VxLAorCQkJICAgICAiIFRvdGFsIGJ5dGVzOiAgICAgICAgIFx0cng6XHQlbHVcdHR4Olx0JWx1XG4iLAorCQkJICAgICByeF9ieXRlcywgdHhfYnl0ZXMpOworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICAgIiAgdGhydSByYWRpbzogICAgICAgICBcdHJ4Olx0JWx1XHR0eDpcdCVsdVxuIiwKKwkJCSAgICAgcnhfcmJ5dGVzLCB0eF9yYnl0ZXMpOworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICAgIiAgdGhydSBzZXJpYWwgcG9ydDogICBcdHJ4Olx0JWx1XHR0eDpcdCVsdVxuIiwKKwkJCSAgICAgcnhfc2J5dGVzLCB0eF9zYnl0ZXMpOworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICAgIiBUb3RhbCBzdGF0L2VyciBieXRlczpcdHJ4Olx0JWx1XHR0eDpcdCVsdVxuIiwKKwkJCSAgICAgcnhfZWJ5dGVzLCB0eF9lYnl0ZXMpOworI2VuZGlmCisJCXN0cmlwX3NlcV9uZWlnaGJvdXJzKHNlcSwgJnN0cmlwX2luZm8tPnBvbGV0b3BzLAorCQkJCQkiUG9sZXRvcHM6Iik7CisJCXN0cmlwX3NlcV9uZWlnaGJvdXJzKHNlcSwgJnN0cmlwX2luZm8tPnBvcnRhYmxlcywKKwkJCQkJIlBvcnRhYmxlczoiKTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9ydHMgc3RhdHVzIGluZm9ybWF0aW9uIGZyb20gdGhlIFNUUklQIGRyaXZlciB0aHJvdWdoCisgKiB0aGUgL3Byb2MgZmlsZSBzeXN0ZW0uCisgKi8KK3N0YXRpYyBpbnQgc3RyaXBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlzZXFfcHJpbnRmKHNlcSwgInN0cmlwX3ZlcnNpb246ICVzXG4iLCBTdHJpcFZlcnNpb24pOworCWVsc2UKKwkJc3RyaXBfc2VxX3N0YXR1c19pbmZvKHNlcSwgKGNvbnN0IHN0cnVjdCBzdHJpcCAqKXYpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgc3RyaXBfc2VxX29wcyA9IHsKKwkuc3RhcnQgPSBzdHJpcF9zZXFfc3RhcnQsCisJLm5leHQgID0gc3RyaXBfc2VxX25leHQsCisJLnN0b3AgID0gc3RyaXBfc2VxX3N0b3AsCisJLnNob3cgID0gc3RyaXBfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IHN0cmlwX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmc3RyaXBfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN0cmlwX3NlcV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICA9IHN0cmlwX3NlcV9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisjZW5kaWYKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTZW5kaW5nIHJvdXRpbmVzCQkJCQkJCSovCisKK3N0YXRpYyB2b2lkIFJlc2V0UmFkaW8oc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBzdHJpcF9pbmZvLT50dHk7CisJc3RhdGljIGNvbnN0IGNoYXIgaW5pdFtdID0gImF0ZTBxMWR0KipzdGFybW9kZVxyKioiOworCVN0cmluZ0Rlc2NyaXB0b3IgcyA9IHsgaW5pdCwgc2l6ZW9mKGluaXQpIC0gMSB9OworCisJLyogCisJICogSWYgdGhlIHJhZGlvIGlzbid0IHdvcmtpbmcgYW55bW9yZSwKKwkgKiB3ZSBzaG91bGQgY2xlYXIgdGhlIG9sZCBzdGF0dXMgaW5mb3JtYXRpb24uCisJICovCisJaWYgKHN0cmlwX2luZm8tPndvcmtpbmcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIHJlc3BvbnNlOiBSZXNldHRpbmcgcmFkaW8uXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwkJc3RyaXBfaW5mby0+ZmlybXdhcmVfdmVyc2lvbi5jWzBdID0gJ1wwJzsKKwkJc3RyaXBfaW5mby0+c2VyaWFsX251bWJlci5jWzBdID0gJ1wwJzsKKwkJc3RyaXBfaW5mby0+YmF0dGVyeV92b2x0YWdlLmNbMF0gPSAnXDAnOworCQlzdHJpcF9pbmZvLT5wb3J0YWJsZXMubnVtX25vZGVzID0gMDsKKwkJZG9fZ2V0dGltZW9mZGF5KCZzdHJpcF9pbmZvLT5wb3J0YWJsZXMudGltZXN0YW1wKTsKKwkJc3RyaXBfaW5mby0+cG9sZXRvcHMubnVtX25vZGVzID0gMDsKKwkJZG9fZ2V0dGltZW9mZGF5KCZzdHJpcF9pbmZvLT5wb2xldG9wcy50aW1lc3RhbXApOworCX0KKworCXN0cmlwX2luZm8tPnBwc190aW1lciA9IGppZmZpZXM7CisJc3RyaXBfaW5mby0+cnhfcHBzX2NvdW50ID0gMDsKKwlzdHJpcF9pbmZvLT50eF9wcHNfY291bnQgPSAwOworCXN0cmlwX2luZm8tPnN4X3Bwc19jb3VudCA9IDA7CisJc3RyaXBfaW5mby0+cnhfYXZlcmFnZV9wcHMgPSAwOworCXN0cmlwX2luZm8tPnR4X2F2ZXJhZ2VfcHBzID0gMDsKKwlzdHJpcF9pbmZvLT5zeF9hdmVyYWdlX3BwcyA9IDA7CisKKwkvKiBNYXJrIHJhZGlvIGFkZHJlc3MgYXMgdW5rbm93biAqLworCSooTWV0cmljb21BZGRyZXNzICopICYgc3RyaXBfaW5mby0+dHJ1ZV9kZXZfYWRkciA9IHplcm9fYWRkcmVzczsKKwlpZiAoIXN0cmlwX2luZm8tPm1hbnVhbF9kZXZfYWRkcikKKwkJKihNZXRyaWNvbUFkZHJlc3MgKikgc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciA9CisJCSAgICB6ZXJvX2FkZHJlc3M7CisJc3RyaXBfaW5mby0+d29ya2luZyA9IEZBTFNFOworCXN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsID0gTm9TdHJ1Y3R1cmU7CisJc3RyaXBfaW5mby0+bmV4dF9jb21tYW5kID0gQ29tcGF0aWJpbGl0eUNvbW1hbmQ7CisJc3RyaXBfaW5mby0+d2F0Y2hkb2dfZG9wcm9iZSA9IGppZmZpZXMgKyAxMCAqIEhaOworCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcmVzZXQgPSBqaWZmaWVzICsgMSAqIEhaOworCisJLyogSWYgdGhlIHVzZXIgaGFzIHNlbGVjdGVkIGEgYmF1ZCByYXRlIGFib3ZlIDM4LjQgc2VlIHdoYXQgbWFnaWMgd2UgaGF2ZSB0byBkbyAqLworCWlmIChzdHJpcF9pbmZvLT51c2VyX2JhdWQgPiBCMzg0MDApIHsKKwkJLyoKKwkJICogU3VidGxlIHN0dWZmOiBQYXkgYXR0ZW50aW9uIDotKQorCQkgKiBJZiB0aGUgc2VyaWFsIHBvcnQgaXMgY3VycmVudGx5IGF0IHRoZSB1c2VyJ3Mgc2VsZWN0ZWQgKD4zOC40KSByYXRlLAorCQkgKiB0aGVuIHdlIHRlbXBvcmFyaWx5IHN3aXRjaCB0byAxOS4yIGFuZCBpc3N1ZSB0aGUgQVRTMzA0IGNvbW1hbmQKKwkJICogdG8gdGVsbCB0aGUgcmFkaW8gdG8gc3dpdGNoIHRvIHRoZSB1c2VyJ3Mgc2VsZWN0ZWQgcmF0ZS4KKwkJICogSWYgdGhlIHNlcmlhbCBwb3J0IGlzIG5vdCBjdXJyZW50bHkgYXQgdGhhdCByYXRlLCB0aGF0IG1lYW5zIHdlIGp1c3QKKwkJICogaXNzdWVkIHRoZSBBVFMzMDQgY29tbWFuZCBsYXN0IHRpbWUgdGhyb3VnaCwgc28gdGhpcyB0aW1lIHdlIHJlc3RvcmUKKwkJICogdGhlIHVzZXIncyBzZWxlY3RlZCByYXRlIGFuZCBpc3N1ZSB0aGUgbm9ybWFsIHN0YXJtb2RlIHJlc2V0IHN0cmluZy4KKwkJICovCisJCWlmIChzdHJpcF9pbmZvLT51c2VyX2JhdWQgPT0gZ2V0X2JhdWQodHR5KSkgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgYjBbXSA9ICJhdGUwcTFzMzA0PTU3NjAwXHIiOworCQkJc3RhdGljIGNvbnN0IGNoYXIgYjFbXSA9ICJhdGUwcTFzMzA0PTExNTIwMFxyIjsKKwkJCXN0YXRpYyBjb25zdCBTdHJpbmdEZXNjcmlwdG9yIGJhdWRzdHJpbmdbMl0gPQorCQkJICAgIHsge2IwLCBzaXplb2YoYjApIC0gMX0KKwkJCSwge2IxLCBzaXplb2YoYjEpIC0gMX0KKwkJCX07CisJCQlzZXRfYmF1ZCh0dHksIEIxOTIwMCk7CisJCQlpZiAoc3RyaXBfaW5mby0+dXNlcl9iYXVkID09IEI1NzYwMCkKKwkJCQlzID0gYmF1ZHN0cmluZ1swXTsKKwkJCWVsc2UgaWYgKHN0cmlwX2luZm8tPnVzZXJfYmF1ZCA9PSBCMTE1MjAwKQorCQkJCXMgPSBiYXVkc3RyaW5nWzFdOworCQkJZWxzZQorCQkJCXMgPSBiYXVkc3RyaW5nWzFdOwkvKiBGb3Igbm93ICovCisJCX0gZWxzZQorCQkJc2V0X2JhdWQodHR5LCBzdHJpcF9pbmZvLT51c2VyX2JhdWQpOworCX0KKworCXR0eS0+ZHJpdmVyLT53cml0ZSh0dHksIHMuc3RyaW5nLCBzLmxlbmd0aCk7CisjaWZkZWYgRVhUX0NPVU5URVJTCisJc3RyaXBfaW5mby0+dHhfZWJ5dGVzICs9IHMubGVuZ3RoOworI2VuZGlmCit9CisKKy8qCisgKiBDYWxsZWQgYnkgdGhlIGRyaXZlciB3aGVuIHRoZXJlJ3Mgcm9vbSBmb3IgbW9yZSBkYXRhLiAgSWYgd2UgaGF2ZQorICogbW9yZSBwYWNrZXRzIHRvIHNlbmQsIHdlIHNlbmQgdGhlbSBoZXJlLgorICovCisKK3N0YXRpYyB2b2lkIHN0cmlwX3dyaXRlX3NvbWVfbW9yZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IChzdHJ1Y3Qgc3RyaXAgKikgdHR5LT5kaXNjX2RhdGE7CisKKwkvKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgY29ubmVjdGVkLiAqLworCWlmICghc3RyaXBfaW5mbyB8fCBzdHJpcF9pbmZvLT5tYWdpYyAhPSBTVFJJUF9NQUdJQyB8fAorCSAgICAhbmV0aWZfcnVubmluZyhzdHJpcF9pbmZvLT5kZXYpKQorCQlyZXR1cm47CisKKwlpZiAoc3RyaXBfaW5mby0+dHhfbGVmdCA+IDApIHsKKwkJaW50IG51bV93cml0dGVuID0KKwkJICAgIHR0eS0+ZHJpdmVyLT53cml0ZSh0dHksIHN0cmlwX2luZm8tPnR4X2hlYWQsCisJCQkJICAgICAgc3RyaXBfaW5mby0+dHhfbGVmdCk7CisJCXN0cmlwX2luZm8tPnR4X2xlZnQgLT0gbnVtX3dyaXR0ZW47CisJCXN0cmlwX2luZm8tPnR4X2hlYWQgKz0gbnVtX3dyaXR0ZW47CisjaWZkZWYgRVhUX0NPVU5URVJTCisJCXN0cmlwX2luZm8tPnR4X3NieXRlcyArPSBudW1fd3JpdHRlbjsKKyNlbmRpZgorCX0gZWxzZSB7CQkvKiBFbHNlIHN0YXJ0IHRyYW5zbWlzc2lvbiBvZiBhbm90aGVyIHBhY2tldCAqLworCisJCXR0eS0+ZmxhZ3MgJj0gfigxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCQlzdHJpcF91bmxvY2soc3RyaXBfaW5mbyk7CisJfQorfQorCitzdGF0aWMgX191OCAqYWRkX2NoZWNrc3VtKF9fdTggKiBidWZmZXIsIF9fdTggKiBlbmQpCit7CisJX191MTYgc3VtID0gMDsKKwlfX3U4ICpwID0gYnVmZmVyOworCXdoaWxlIChwIDwgZW5kKQorCQlzdW0gKz0gKnArKzsKKwllbmRbM10gPSBoZXh0YWJsZVtzdW0gJiAweEZdOworCXN1bSA+Pj0gNDsKKwllbmRbMl0gPSBoZXh0YWJsZVtzdW0gJiAweEZdOworCXN1bSA+Pj0gNDsKKwllbmRbMV0gPSBoZXh0YWJsZVtzdW0gJiAweEZdOworCXN1bSA+Pj0gNDsKKwllbmRbMF0gPSBoZXh0YWJsZVtzdW0gJiAweEZdOworCXJldHVybiAoZW5kICsgNCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpzdHJpcF9tYWtlX3BhY2tldCh1bnNpZ25lZCBjaGFyICpidWZmZXIsCisJCQkJCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfX3U4ICpwdHIgPSBidWZmZXI7CisJX191OCAqc3R1ZmZzdGF0ZSA9IE5VTEw7CisJU1RSSVBfSGVhZGVyICpoZWFkZXIgPSAoU1RSSVBfSGVhZGVyICopIHNrYi0+ZGF0YTsKKwlNZXRyaWNvbUFkZHJlc3MgaGFkZHIgPSBoZWFkZXItPmRzdF9hZGRyOworCWludCBsZW4gPSBza2ItPmxlbiAtIHNpemVvZihTVFJJUF9IZWFkZXIpOworCU1ldHJpY29tS2V5IGtleTsKKworCS8qSGV4RHVtcCgic3RyaXBfbWFrZV9wYWNrZXQiLCBzdHJpcF9pbmZvLCBza2ItPmRhdGEsIHNrYi0+ZGF0YSArIHNrYi0+bGVuKTsgKi8KKworCWlmIChoZWFkZXItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKKwkJa2V5ID0gU0lQMEtleTsKKwllbHNlIGlmIChoZWFkZXItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0FSUCkpCisJCWtleSA9IEFSUDBLZXk7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBzdHJpcF9tYWtlX3BhY2tldDogVW5rbm93biBwYWNrZXQgdHlwZSAweCUwNFhcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIG50b2hzKGhlYWRlci0+cHJvdG9jb2wpKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlpZiAobGVuID4gc3RyaXBfaW5mby0+bXR1KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBEcm9wcGluZyBvdmVyc2l6ZWQgdHJhbnNtaXQgcGFja2V0OiAlZCBieXRlc1xuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgbGVuKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKgorCSAqIElmIHdlJ3JlIHNlbmRpbmcgdG8gb3Vyc2VsdmVzLCBkaXNjYXJkIHRoZSBwYWNrZXQuCisJICogKE1ldHJpY29tIHJhZGlvcyBjaG9rZSBpZiB0aGV5IHRyeSB0byBzZW5kIGEgcGFja2V0IHRvIHRoZWlyIG93biBhZGRyZXNzLikKKwkgKi8KKwlpZiAoIW1lbWNtcChoYWRkci5jLCBzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyLmMsIHNpemVvZihoYWRkcikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IERyb3BwaW5nIHBhY2tldCBhZGRyZXNzZWQgdG8gc2VsZlxuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgYnJvYWRjYXN0IHBhY2tldCwgc2VuZCBpdCB0byBvdXIgZGVzaWduYXRlZCBNZXRyaWNvbQorCSAqICdicm9hZGNhc3QgaHViJyByYWRpbyAoRmlyc3QgYnl0ZSBvZiBhZGRyZXNzIGJlaW5nIDB4RkYgbWVhbnMgYnJvYWRjYXN0KQorCSAqLworCWlmIChoYWRkci5jWzBdID09IDB4RkYpIHsKKwkJdTMyIGJyZCA9IDA7CisJCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKworCQlyY3VfcmVhZF9sb2NrKCk7CisJCWluX2RldiA9IF9faW5fZGV2X2dldChzdHJpcF9pbmZvLT5kZXYpOworCQlpZiAoaW5fZGV2ID09IE5VTEwpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKGluX2Rldi0+aWZhX2xpc3QpCisJCQlicmQgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfYnJvYWRjYXN0OworCQlyY3VfcmVhZF91bmxvY2soKTsKKworCQkvKiBhcnBfcXVlcnkgcmV0dXJucyAxIGlmIGl0IHN1Y2NlZWRzIGluIGxvb2tpbmcgdXAgdGhlIGFkZHJlc3MsIDAgaWYgaXQgZmFpbHMgKi8KKwkJaWYgKCFhcnBfcXVlcnkoaGFkZHIuYywgYnJkLCBzdHJpcF9pbmZvLT5kZXYpKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiJXM6IFVuYWJsZSB0byBzZW5kIHBhY2tldCAobm8gYnJvYWRjYXN0IGh1YiBjb25maWd1cmVkKVxuIiwKKwkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCQkvKgorCQkgKiBJZiB3ZSBhcmUgdGhlIGJyb2FkY2FzdCBodWIsIGRvbid0IGJvdGhlciBzZW5kaW5nIHRvIG91cnNlbHZlcy4KKwkJICogKE1ldHJpY29tIHJhZGlvcyBjaG9rZSBpZiB0aGV5IHRyeSB0byBzZW5kIGEgcGFja2V0IHRvIHRoZWlyIG93biBhZGRyZXNzLikKKwkJICovCisJCWlmICghbWVtY21wCisJCSAgICAoaGFkZHIuYywgc3RyaXBfaW5mby0+dHJ1ZV9kZXZfYWRkci5jLCBzaXplb2YoaGFkZHIpKSkKKwkJCXJldHVybiAoTlVMTCk7CisJfQorCisJKnB0cisrID0gMHgwRDsKKwkqcHRyKysgPSAnKic7CisJKnB0cisrID0gaGV4dGFibGVbaGFkZHIuY1syXSA+PiA0XTsKKwkqcHRyKysgPSBoZXh0YWJsZVtoYWRkci5jWzJdICYgMHhGXTsKKwkqcHRyKysgPSBoZXh0YWJsZVtoYWRkci5jWzNdID4+IDRdOworCSpwdHIrKyA9IGhleHRhYmxlW2hhZGRyLmNbM10gJiAweEZdOworCSpwdHIrKyA9ICctJzsKKwkqcHRyKysgPSBoZXh0YWJsZVtoYWRkci5jWzRdID4+IDRdOworCSpwdHIrKyA9IGhleHRhYmxlW2hhZGRyLmNbNF0gJiAweEZdOworCSpwdHIrKyA9IGhleHRhYmxlW2hhZGRyLmNbNV0gPj4gNF07CisJKnB0cisrID0gaGV4dGFibGVbaGFkZHIuY1s1XSAmIDB4Rl07CisJKnB0cisrID0gJyonOworCSpwdHIrKyA9IGtleS5jWzBdOworCSpwdHIrKyA9IGtleS5jWzFdOworCSpwdHIrKyA9IGtleS5jWzJdOworCSpwdHIrKyA9IGtleS5jWzNdOworCisJcHRyID0KKwkgICAgU3R1ZmZEYXRhKHNrYi0+ZGF0YSArIHNpemVvZihTVFJJUF9IZWFkZXIpLCBsZW4sIHB0ciwKKwkJICAgICAgJnN0dWZmc3RhdGUpOworCisJaWYgKHN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsID49IENoZWNrc3VtbWVkTWVzc2FnZXMpCisJCXB0ciA9IGFkZF9jaGVja3N1bShidWZmZXIgKyAxLCBwdHIpOworCisJKnB0cisrID0gMHgwRDsKKwlyZXR1cm4gKHB0cik7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmlwX3NlbmQoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCU1ldHJpY29tQWRkcmVzcyBoYWRkcjsKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSBzdHJpcF9pbmZvLT50eF9idWZmOworCWludCBkb3Jlc2V0ID0gKGxvbmcpIGppZmZpZXMgLSBzdHJpcF9pbmZvLT53YXRjaGRvZ19kb3Jlc2V0ID49IDA7CisJaW50IGRvcHJvYmUgPSAobG9uZykgamlmZmllcyAtIHN0cmlwX2luZm8tPndhdGNoZG9nX2RvcHJvYmUgPj0gMAorCSAgICAmJiAhZG9yZXNldDsKKwl1MzIgYWRkciwgYnJkOworCisJLyoKKwkgKiAxLiBJZiB3ZSBoYXZlIGEgcGFja2V0LCBlbmNhcHN1bGF0ZSBpdCBhbmQgcHV0IGl0IGluIHRoZSBidWZmZXIKKwkgKi8KKwlpZiAoc2tiKSB7CisJCWNoYXIgKm5ld3B0ciA9IHN0cmlwX21ha2VfcGFja2V0KHB0ciwgc3RyaXBfaW5mbywgc2tiKTsKKwkJc3RyaXBfaW5mby0+dHhfcHBzX2NvdW50Kys7CisJCWlmICghbmV3cHRyKQorCQkJc3RyaXBfaW5mby0+dHhfZHJvcHBlZCsrOworCQllbHNlIHsKKwkJCXB0ciA9IG5ld3B0cjsKKwkJCXN0cmlwX2luZm8tPnN4X3Bwc19jb3VudCsrOworCQkJc3RyaXBfaW5mby0+dHhfcGFja2V0cysrOwkvKiBDb3VudCBhbm90aGVyIHN1Y2Nlc3NmdWwgcGFja2V0ICovCisjaWZkZWYgRVhUX0NPVU5URVJTCisJCQlzdHJpcF9pbmZvLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCXN0cmlwX2luZm8tPnR4X3JieXRlcyArPSBwdHIgLSBzdHJpcF9pbmZvLT50eF9idWZmOworI2VuZGlmCisJCQkvKkR1bXBEYXRhKCJTZW5kaW5nOiIsIHN0cmlwX2luZm8sIHN0cmlwX2luZm8tPnR4X2J1ZmYsIHB0cik7ICovCisJCQkvKkhleER1bXAoIlNlbmRpbmciLCBzdHJpcF9pbmZvLCBzdHJpcF9pbmZvLT50eF9idWZmLCBwdHIpOyAqLworCQl9CisJfQorCisJLyoKKwkgKiAyLiBJZiBpdCBpcyB0aW1lIGZvciBhbm90aGVyIHRpY2tsZSwgdGFjayBpdCBvbiwgYWZ0ZXIgdGhlIHBhY2tldAorCSAqLworCWlmIChkb3Byb2JlKSB7CisJCVN0cmluZ0Rlc2NyaXB0b3IgdHMgPSBDb21tYW5kU3RyaW5nW3N0cmlwX2luZm8tPm5leHRfY29tbWFuZF07CisjaWYgVElDS0xFX1RJTUVSUworCQl7CisJCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJCWRvX2dldHRpbWVvZmRheSgmdHYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiKioqKiBTZW5kaW5nIHRpY2tsZSBzdHJpbmcgJWQgICAgICBhdCAlMDJkLiUwNmRcbiIsCisJCQkgICAgICAgc3RyaXBfaW5mby0+bmV4dF9jb21tYW5kLCB0di50dl9zZWMgJSAxMDAsCisJCQkgICAgICAgdHYudHZfdXNlYyk7CisJCX0KKyNlbmRpZgorCQlpZiAocHRyID09IHN0cmlwX2luZm8tPnR4X2J1ZmYpCisJCQkqcHRyKysgPSAweDBEOworCisJCSpwdHIrKyA9ICcqJzsJLyogRmlyc3Qgc2VuZCAiKioiIHRvIHByb3Zva2UgYW4gZXJyb3IgbWVzc2FnZSAqLworCQkqcHRyKysgPSAnKic7CisKKwkJLyogVGhlbiBhZGQgdGhlIGNvbW1hbmQgKi8KKwkJbWVtY3B5KHB0ciwgdHMuc3RyaW5nLCB0cy5sZW5ndGgpOworCisJCS8qIEFkZCBhIGNoZWNrc3VtID8gKi8KKwkJaWYgKHN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsIDwgQ2hlY2tzdW1tZWRNZXNzYWdlcykKKwkJCXB0ciArPSB0cy5sZW5ndGg7CisJCWVsc2UKKwkJCXB0ciA9IGFkZF9jaGVja3N1bShwdHIsIHB0ciArIHRzLmxlbmd0aCk7CisKKwkJKnB0cisrID0gMHgwRDsJLyogVGVybWluYXRlIHRoZSBjb21tYW5kIHdpdGggYSA8Q1I+ICovCisKKwkJLyogQ3ljbGUgdG8gbmV4dCBwZXJpb2RpYyBjb21tYW5kPyAqLworCQlpZiAoc3RyaXBfaW5mby0+ZmlybXdhcmVfbGV2ZWwgPj0gU3RydWN0dXJlZE1lc3NhZ2VzKQorCQkJaWYgKCsrc3RyaXBfaW5mby0+bmV4dF9jb21tYW5kID49CisJCQkgICAgQVJSQVlfU0laRShDb21tYW5kU3RyaW5nKSkKKwkJCQlzdHJpcF9pbmZvLT5uZXh0X2NvbW1hbmQgPSAwOworI2lmZGVmIEVYVF9DT1VOVEVSUworCQlzdHJpcF9pbmZvLT50eF9lYnl0ZXMgKz0gdHMubGVuZ3RoOworI2VuZGlmCisJCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcHJvYmUgPSBqaWZmaWVzICsgMTAgKiBIWjsKKwkJc3RyaXBfaW5mby0+d2F0Y2hkb2dfZG9yZXNldCA9IGppZmZpZXMgKyAxICogSFo7CisJCS8qcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJvdXRpbmUgcmFkaW8gdGVzdC5cbiIsIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7ICovCisJfQorCisJLyoKKwkgKiAzLiBTZXQgdXAgdGhlIHN0cmlwX2luZm8gcmVhZHkgdG8gc2VuZCB0aGUgZGF0YSAoaWYgYW55KS4KKwkgKi8KKwlzdHJpcF9pbmZvLT50eF9oZWFkID0gc3RyaXBfaW5mby0+dHhfYnVmZjsKKwlzdHJpcF9pbmZvLT50eF9sZWZ0ID0gcHRyIC0gc3RyaXBfaW5mby0+dHhfYnVmZjsKKwlzdHJpcF9pbmZvLT50dHktPmZsYWdzIHw9ICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCisJLyoKKwkgKiA0LiBEZWJ1Z2dpbmcgY2hlY2sgdG8gbWFrZSBzdXJlIHdlJ3JlIG5vdCBvdmVyZmxvd2luZyB0aGUgYnVmZmVyLgorCSAqLworCWlmIChzdHJpcF9pbmZvLT50eF9zaXplIC0gc3RyaXBfaW5mby0+dHhfbGVmdCA8IDIwKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTZW5kaW5nJTVkIGJ5dGVzOyU1ZCBieXRlcyBmcmVlLlxuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgc3RyaXBfaW5mby0+dHhfbGVmdCwKKwkJICAgICAgIHN0cmlwX2luZm8tPnR4X3NpemUgLSBzdHJpcF9pbmZvLT50eF9sZWZ0KTsKKworCS8qCisJICogNS4gSWYgd2F0Y2hkb2cgaGFzIGV4cGlyZWQsIHJlc2V0IHRoZSByYWRpby4gTm90ZTogaWYgdGhlcmUncyBkYXRhIHdhaXRpbmcgaW4KKwkgKiB0aGUgYnVmZmVyLCBzdHJpcF93cml0ZV9zb21lX21vcmUgd2lsbCBzZW5kIGl0IGFmdGVyIHRoZSByZXNldCBoYXMgZmluaXNoZWQKKwkgKi8KKwlpZiAoZG9yZXNldCkgeworCQlSZXNldFJhZGlvKHN0cmlwX2luZm8pOworCQlyZXR1cm47CisJfQorCisJaWYgKDEpIHsKKwkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCisJCWJyZCA9IGFkZHIgPSAwOworCQlyY3VfcmVhZF9sb2NrKCk7CisJCWluX2RldiA9IF9faW5fZGV2X2dldChzdHJpcF9pbmZvLT5kZXYpOworCQlpZiAoaW5fZGV2KSB7CisJCQlpZiAoaW5fZGV2LT5pZmFfbGlzdCkgeworCQkJCWJyZCA9IGluX2Rldi0+aWZhX2xpc3QtPmlmYV9icm9hZGNhc3Q7CisJCQkJYWRkciA9IGluX2Rldi0+aWZhX2xpc3QtPmlmYV9sb2NhbDsKKwkJCX0KKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CisKKworCS8qCisJICogNi4gSWYgaXQgaXMgdGltZSBmb3IgYSBwZXJpb2RpYyBBUlAsIHF1ZXVlIG9uZSB1cCB0byBiZSBzZW50LgorCSAqIFdlIG9ubHkgZG8gdGhpcyBpZjoKKwkgKiAgMS4gVGhlIHJhZGlvIGlzIHdvcmtpbmcKKwkgKiAgMi4gSXQncyB0aW1lIHRvIHNlbmQgYW5vdGhlciBwZXJpb2RpYyBBUlAKKwkgKiAgMy4gV2UgcmVhbGx5IGtub3cgd2hhdCBvdXIgYWRkcmVzcyBpcyAoYW5kIGl0IGlzIG5vdCBtYW51YWxseSBzZXQgdG8gemVybykKKwkgKiAgNC4gV2UgaGF2ZSBhIGRlc2lnbmF0ZWQgYnJvYWRjYXN0IGFkZHJlc3MgY29uZmlndXJlZAorCSAqIElmIHdlIHF1ZXVlIHVwIGFuIEFSUCBwYWNrZXQgd2hlbiB3ZSBkb24ndCBoYXZlIGEgZGVzaWduYXRlZCBicm9hZGNhc3QKKwkgKiBhZGRyZXNzIGNvbmZpZ3VyZWQsIHRoZW4gdGhlIHBhY2tldCB3aWxsIGp1c3QgaGF2ZSB0byBiZSBkaXNjYXJkZWQgaW4KKwkgKiBzdHJpcF9tYWtlX3BhY2tldC4gVGhpcyBpcyBub3QgZmF0YWwsIGJ1dCBpdCBjYXVzZXMgbWlzbGVhZGluZyBpbmZvcm1hdGlvbgorCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0Y3BkdW1wLiB0Y3BkdW1wIHdpbGwgcmVwb3J0IHRoYXQgcGVyaW9kaWMgQVBScyBhcmUKKwkgKiBiZWluZyBzZW50LCB3aGVuIGluIGZhY3QgdGhleSBhcmUgbm90LCBiZWNhdXNlIHRoZXkgYXJlIGFsbCBiZWluZyBkcm9wcGVkCisJICogaW4gdGhlIHN0cmlwX21ha2VfcGFja2V0IHJvdXRpbmUuCisJICovCisJaWYgKHN0cmlwX2luZm8tPndvcmtpbmcKKwkgICAgJiYgKGxvbmcpIGppZmZpZXMgLSBzdHJpcF9pbmZvLT5ncmF0dWl0b3VzX2FycCA+PSAwCisJICAgICYmIG1lbWNtcChzdHJpcF9pbmZvLT5kZXYtPmRldl9hZGRyLCB6ZXJvX2FkZHJlc3MuYywKKwkJICAgICAgc2l6ZW9mKHplcm9fYWRkcmVzcykpCisJICAgICYmIGFycF9xdWVyeShoYWRkci5jLCBicmQsIHN0cmlwX2luZm8tPmRldikpIHsKKwkJLypwcmludGsoS0VSTl9JTkZPICIlczogU2VuZGluZyBncmF0dWl0b3VzIEFSUCB3aXRoIGludGVydmFsICVsZFxuIiwKKwkJICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBzdHJpcF9pbmZvLT5hcnBfaW50ZXJ2YWwgLyBIWik7ICovCisJCXN0cmlwX2luZm8tPmdyYXR1aXRvdXNfYXJwID0KKwkJICAgIGppZmZpZXMgKyBzdHJpcF9pbmZvLT5hcnBfaW50ZXJ2YWw7CisJCXN0cmlwX2luZm8tPmFycF9pbnRlcnZhbCAqPSAyOworCQlpZiAoc3RyaXBfaW5mby0+YXJwX2ludGVydmFsID4gTWF4QVJQSW50ZXJ2YWwpCisJCQlzdHJpcF9pbmZvLT5hcnBfaW50ZXJ2YWwgPSBNYXhBUlBJbnRlcnZhbDsKKwkJaWYgKGFkZHIpCisJCQlhcnBfc2VuZChBUlBPUF9SRVBMWSwgRVRIX1BfQVJQLCBhZGRyLAkvKiBUYXJnZXQgYWRkcmVzcyBvZiBBUlAgcGFja2V0IGlzIG91ciBhZGRyZXNzICovCisJCQkJIHN0cmlwX2luZm8tPmRldiwJLyogRGV2aWNlIHRvIHNlbmQgcGFja2V0IG9uICovCisJCQkJIGFkZHIsCS8qIFNvdXJjZSBJUCBhZGRyZXNzIHRoaXMgQVJQIHBhY2tldCBjb21lcyBmcm9tICovCisJCQkJIE5VTEwsCS8qIERlc3RpbmF0aW9uIEhXIGFkZHJlc3MgaXMgTlVMTCAoYnJvYWRjYXN0IGl0KSAqLworCQkJCSBzdHJpcF9pbmZvLT5kZXYtPmRldl9hZGRyLAkvKiBTb3VyY2UgSFcgYWRkcmVzcyBpcyBvdXIgSFcgYWRkcmVzcyAqLworCQkJCSBzdHJpcF9pbmZvLT5kZXYtPmRldl9hZGRyKTsJLyogVGFyZ2V0IEhXIGFkZHJlc3MgaXMgb3VyIEhXIGFkZHJlc3MgKHJlZHVuZGFudCkgKi8KKwl9CisKKwkvKgorCSAqIDcuIEFsbCByZWFkeS4gU3RhcnQgdGhlIHRyYW5zbWlzc2lvbgorCSAqLworCXN0cmlwX3dyaXRlX3NvbWVfbW9yZShzdHJpcF9pbmZvLT50dHkpOworfQorCisvKiBFbmNhcHN1bGF0ZSBhIGRhdGFncmFtIGFuZCBraWNrIGl0IGludG8gYSBUVFkgcXVldWUuICovCitzdGF0aWMgaW50IHN0cmlwX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogeG1pdCBjYWxsIHdoZW4gaWZhY2UgaXMgZG93blxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAoMSk7CisJfQorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJZGVsX3RpbWVyKCZzdHJpcF9pbmZvLT5pZGxlX3RpbWVyKTsKKworCisJaWYgKGppZmZpZXMgLSBzdHJpcF9pbmZvLT5wcHNfdGltZXIgPiBIWikgeworCQl1bnNpZ25lZCBsb25nIHQgPSBqaWZmaWVzIC0gc3RyaXBfaW5mby0+cHBzX3RpbWVyOworCQl1bnNpZ25lZCBsb25nIHJ4X3Bwc19jb3VudCA9IChzdHJpcF9pbmZvLT5yeF9wcHNfY291bnQgKiBIWiAqIDggKyB0IC8gMikgLyB0OworCQl1bnNpZ25lZCBsb25nIHR4X3Bwc19jb3VudCA9IChzdHJpcF9pbmZvLT50eF9wcHNfY291bnQgKiBIWiAqIDggKyB0IC8gMikgLyB0OworCQl1bnNpZ25lZCBsb25nIHN4X3Bwc19jb3VudCA9IChzdHJpcF9pbmZvLT5zeF9wcHNfY291bnQgKiBIWiAqIDggKyB0IC8gMikgLyB0OworCisJCXN0cmlwX2luZm8tPnBwc190aW1lciA9IGppZmZpZXM7CisJCXN0cmlwX2luZm8tPnJ4X3Bwc19jb3VudCA9IDA7CisJCXN0cmlwX2luZm8tPnR4X3Bwc19jb3VudCA9IDA7CisJCXN0cmlwX2luZm8tPnN4X3Bwc19jb3VudCA9IDA7CisKKwkJc3RyaXBfaW5mby0+cnhfYXZlcmFnZV9wcHMgPSAoc3RyaXBfaW5mby0+cnhfYXZlcmFnZV9wcHMgKyByeF9wcHNfY291bnQgKyAxKSAvIDI7CisJCXN0cmlwX2luZm8tPnR4X2F2ZXJhZ2VfcHBzID0gKHN0cmlwX2luZm8tPnR4X2F2ZXJhZ2VfcHBzICsgdHhfcHBzX2NvdW50ICsgMSkgLyAyOworCQlzdHJpcF9pbmZvLT5zeF9hdmVyYWdlX3BwcyA9IChzdHJpcF9pbmZvLT5zeF9hdmVyYWdlX3BwcyArIHN4X3Bwc19jb3VudCArIDEpIC8gMjsKKworCQlpZiAocnhfcHBzX2NvdW50IC8gOCA+PSAxMCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBXQVJOSU5HOiBSZWNlaXZpbmcgJWxkIHBhY2tldHMgcGVyIHNlY29uZC5cbiIsCisJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCByeF9wcHNfY291bnQgLyA4KTsKKwkJaWYgKHR4X3Bwc19jb3VudCAvIDggPj0gMTApCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogV0FSTklORzogVHggICAgICAgICVsZCBwYWNrZXRzIHBlciBzZWNvbmQuXG4iLAorCQkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgdHhfcHBzX2NvdW50IC8gOCk7CisJCWlmIChzeF9wcHNfY291bnQgLyA4ID49IDEwKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFdBUk5JTkc6IFNlbmRpbmcgICAlbGQgcGFja2V0cyBwZXIgc2Vjb25kLlxuIiwKKwkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHN4X3Bwc19jb3VudCAvIDgpOworCX0KKworCXNwaW5fbG9ja19iaCgmc3RyaXBfbG9jayk7CisKKwlzdHJpcF9zZW5kKHN0cmlwX2luZm8sIHNrYik7CisKKwlzcGluX3VubG9ja19iaCgmc3RyaXBfbG9jayk7CisKKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJZGxlVGFzayBwZXJpb2RpY2FsbHkgY2FsbHMgc3RyaXBfeG1pdCwgc28gZXZlbiB3aGVuIHdlIGhhdmUgbm8gSVAgcGFja2V0cworICogdG8gc2VuZCBmb3IgYW4gZXh0ZW5kZWQgcGVyaW9kIG9mIHRpbWUsIHRoZSB3YXRjaGRvZyBwcm9jZXNzaW5nIHN0aWxsIGdldHMKKyAqIGRvbmUgdG8gZW5zdXJlIHRoYXQgdGhlIHJhZGlvIHN0YXlzIGluIFN0YXJtb2RlCisgKi8KKworc3RhdGljIHZvaWQgc3RyaXBfSWRsZVRhc2sodW5zaWduZWQgbG9uZyBwYXJhbWV0ZXIpCit7CisJc3RyaXBfeG1pdChOVUxMLCAoc3RydWN0IG5ldF9kZXZpY2UgKikgcGFyYW1ldGVyKTsKK30KKworLyoKKyAqIENyZWF0ZSB0aGUgTUFDIGhlYWRlciBmb3IgYW4gYXJiaXRyYXJ5IHByb3RvY29sIGxheWVyCisgKgorICogc2FkZHIhPU5VTEwgICAgICAgIG1lYW5zIHVzZSB0aGlzIHNwZWNpZmljIGFkZHJlc3MgKG4vYSBmb3IgTWV0cmljb20pCisgKiBzYWRkcj09TlVMTCAgICAgICAgbWVhbnMgdXNlIGRlZmF1bHQgZGV2aWNlIHNvdXJjZSBhZGRyZXNzCisgKiBkYWRkciE9TlVMTCAgICAgICAgbWVhbnMgdXNlIHRoaXMgZGVzdGluYXRpb24gYWRkcmVzcworICogZGFkZHI9PU5VTEwgICAgICAgIG1lYW5zIGxlYXZlIGRlc3RpbmF0aW9uIGFkZHJlc3MgYWxvbmUKKyAqICAgICAgICAgICAgICAgICAoZS5nLiB1bnJlc29sdmVkIGFycCAtLSBrZXJuZWwgd2lsbCBjYWxsCisgKiAgICAgICAgICAgICAgICAgcmVidWlsZF9oZWFkZXIgbGF0ZXIgdG8gZmlsbCBpbiB0aGUgYWRkcmVzcykKKyAqLworCitzdGF0aWMgaW50IHN0cmlwX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLAorCQkJdW5zaWduZWQgbGVuKQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IG5ldGRldl9wcml2KGRldik7CisJU1RSSVBfSGVhZGVyICpoZWFkZXIgPSAoU1RSSVBfSGVhZGVyICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKFNUUklQX0hlYWRlcikpOworCisJLypwcmludGsoS0VSTl9JTkZPICIlczogc3RyaXBfaGVhZGVyIDB4JTA0WCAlc1xuIiwgZGV2LT5uYW1lLCB0eXBlLAorCSAgIHR5cGUgPT0gRVRIX1BfSVAgPyAiSVAiIDogdHlwZSA9PSBFVEhfUF9BUlAgPyAiQVJQIiA6ICIiKTsgKi8KKworCWhlYWRlci0+c3JjX2FkZHIgPSBzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyOworCWhlYWRlci0+cHJvdG9jb2wgPSBodG9ucyh0eXBlKTsKKworCS8qSGV4RHVtcCgic3RyaXBfaGVhZGVyIiwgbmV0ZGV2X3ByaXYoZGV2KSwgc2tiLT5kYXRhLCBza2ItPmRhdGEgKyBza2ItPmxlbik7ICovCisKKwlpZiAoIWRhZGRyKQorCQlyZXR1cm4gKC1kZXYtPmhhcmRfaGVhZGVyX2xlbik7CisKKwloZWFkZXItPmRzdF9hZGRyID0gKihNZXRyaWNvbUFkZHJlc3MgKikgZGFkZHI7CisJcmV0dXJuIChkZXYtPmhhcmRfaGVhZGVyX2xlbik7Cit9CisKKy8qCisgKiBSZWJ1aWxkIHRoZSBNQUMgaGVhZGVyLiBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbiBBUlAKKyAqIChvciBpbiBmdXR1cmUgb3RoZXIgYWRkcmVzcyByZXNvbHV0aW9uKSBoYXMgY29tcGxldGVkIG9uIHRoaXMKKyAqIHNrX2J1ZmYuIFdlIG5vdyBsZXQgQVJQIGZpbGwgaW4gdGhlIG90aGVyIGZpZWxkcy4KKyAqIEkgdGhpbmsgdGhpcyBzaG91bGQgcmV0dXJuIHplcm8gaWYgcGFja2V0IGlzIHJlYWR5IHRvIHNlbmQsCisgKiBvciBub24temVybyBpZiBpdCBuZWVkcyBtb3JlIHRpbWUgdG8gZG8gYW4gYWRkcmVzcyBsb29rdXAKKyAqLworCitzdGF0aWMgaW50IHN0cmlwX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisjaWZkZWYgQ09ORklHX0lORVQKKwlTVFJJUF9IZWFkZXIgKmhlYWRlciA9IChTVFJJUF9IZWFkZXIgKikgc2tiLT5kYXRhOworCisJLyogQXJwIGZpbmQgcmV0dXJucyB6ZXJvIGlmIGlmIGtub3dzIHRoZSBhZGRyZXNzLCAqLworCS8qIG9yIGlmIGl0IGRvZXNuJ3Qga25vdyB0aGUgYWRkcmVzcyBpdCBzZW5kcyBhbiBBUlAgcGFja2V0IGFuZCByZXR1cm5zIG5vbi16ZXJvICovCisJcmV0dXJuIGFycF9maW5kKGhlYWRlci0+ZHN0X2FkZHIuYywgc2tiKSA/IDEgOiAwOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSZWNlaXZpbmcgcm91dGluZXMJCQkJCQkJKi8KKworc3RhdGljIGludCBzdHJpcF9yZWNlaXZlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm4gMHgxMDAwMDsJCS8qIFdlIGNhbiBoYW5kbGUgYW4gaW5maW5pdGUgYW1vdW50IG9mIGRhdGEuIDotKSAqLworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIHJlc3BvbnNlIHRvIHRoZSBBVFMzMDA/IGNvbW1hbmQsCisgKiBleHRyYWN0aW5nIHRoZSByYWRpbyB2ZXJzaW9uIGFuZCBzZXJpYWwgbnVtYmVyLgorICovCitzdGF0aWMgdm9pZCBnZXRfcmFkaW9fdmVyc2lvbihzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIF9fdTggKiBwdHIsIF9fdTggKiBlbmQpCit7CisJX191OCAqcCwgKnZhbHVlX2JlZ2luLCAqdmFsdWVfZW5kOworCWludCBsZW47CisKKwkvKiBEZXRlcm1pbmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Vjb25kIGxpbmUgb2YgdGhlIHBheWxvYWQgKi8KKwlwID0gcHRyOworCXdoaWxlIChwIDwgZW5kICYmICpwICE9IDEwKQorCQlwKys7CisJaWYgKHAgPj0gZW5kKQorCQlyZXR1cm47CisJcCsrOworCXZhbHVlX2JlZ2luID0gcDsKKworCS8qIERldGVybWluZSB0aGUgZW5kIG9mIGxpbmUgKi8KKwl3aGlsZSAocCA8IGVuZCAmJiAqcCAhPSAxMCkKKwkJcCsrOworCWlmIChwID49IGVuZCkKKwkJcmV0dXJuOworCXZhbHVlX2VuZCA9IHA7CisJcCsrOworCisJbGVuID0gdmFsdWVfZW5kIC0gdmFsdWVfYmVnaW47CisJbGVuID0gbWluX3QoaW50LCBsZW4sIHNpemVvZihGaXJtd2FyZVZlcnNpb24pIC0gMSk7CisJaWYgKHN0cmlwX2luZm8tPmZpcm13YXJlX3ZlcnNpb24uY1swXSA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogUmFkaW8gRmlybXdhcmU6ICUuKnNcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIGxlbiwgdmFsdWVfYmVnaW4pOworCXNwcmludGYoc3RyaXBfaW5mby0+ZmlybXdhcmVfdmVyc2lvbi5jLCAiJS4qcyIsIGxlbiwgdmFsdWVfYmVnaW4pOworCisJLyogTG9vayBmb3IgdGhlIGZpcnN0IGNvbG9uICovCisJd2hpbGUgKHAgPCBlbmQgJiYgKnAgIT0gJzonKQorCQlwKys7CisJaWYgKHAgPj0gZW5kKQorCQlyZXR1cm47CisJLyogU2tpcCBvdmVyIHRoZSBzcGFjZSAqLworCXAgKz0gMjsKKwlsZW4gPSBzaXplb2YoU2VyaWFsTnVtYmVyKSAtIDE7CisJaWYgKHAgKyBsZW4gPD0gZW5kKSB7CisJCXNwcmludGYoc3RyaXBfaW5mby0+c2VyaWFsX251bWJlci5jLCAiJS4qcyIsIGxlbiwgcCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJTVFJJUDogcmFkaW8gc2VyaWFsIG51bWJlciBzaG9ydGVyICglemQpIHRoYW4gZXhwZWN0ZWQgKCVkKVxuIiwKKwkJICAgICAgIGVuZCAtIHAsIGxlbik7CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIHJlc3BvbnNlIHRvIHRoZSBBVFMzMjU/IGNvbW1hbmQsCisgKiBleHRyYWN0aW5nIHRoZSByYWRpbyBiYXR0ZXJ5IHZvbHRhZ2UuCisgKi8KK3N0YXRpYyB2b2lkIGdldF9yYWRpb192b2x0YWdlKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywgX191OCAqIHB0ciwgX191OCAqIGVuZCkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gc2l6ZW9mKEJhdHRlcnlWb2x0YWdlKSAtIDE7CisJaWYgKHB0ciArIGxlbiA8PSBlbmQpIHsKKwkJc3ByaW50ZihzdHJpcF9pbmZvLT5iYXR0ZXJ5X3ZvbHRhZ2UuYywgIiUuKnMiLCBsZW4sIHB0cik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJTVFJJUDogcmFkaW8gdm9sdGFnZSBzdHJpbmcgc2hvcnRlciAoJXpkKSB0aGFuIGV4cGVjdGVkICglZClcbiIsCisJCSAgICAgICBlbmQgLSBwdHIsIGxlbik7CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIHJlc3BvbnNlcyB0byB0aGUgQVR+TEEgYW5kIEFUUzMxMSBjb21tYW5kcywKKyAqIHdoaWNoIGxpc3QgdGhlIHJhZGlvJ3MgbmVpZ2hib3Vycy4KKyAqLworc3RhdGljIHZvaWQgZ2V0X3JhZGlvX25laWdoYm91cnMoTWV0cmljb21Ob2RlVGFibGUgKiB0YWJsZSwgX191OCAqIHB0ciwgX191OCAqIGVuZCkKK3sKKwl0YWJsZS0+bnVtX25vZGVzID0gMDsKKwl3aGlsZSAocHRyIDwgZW5kICYmIHRhYmxlLT5udW1fbm9kZXMgPCBOT0RFX1RBQkxFX1NJWkUpIHsKKwkJTWV0cmljb21Ob2RlICpub2RlID0gJnRhYmxlLT5ub2RlW3RhYmxlLT5udW1fbm9kZXMrK107CisJCWNoYXIgKmRzdCA9IG5vZGUtPmMsICpsaW1pdCA9IGRzdCArIHNpemVvZigqbm9kZSkgLSAxOworCQl3aGlsZSAocHRyIDwgZW5kICYmICpwdHIgPD0gMzIpCisJCQlwdHIrKzsKKwkJd2hpbGUgKHB0ciA8IGVuZCAmJiBkc3QgPCBsaW1pdCAmJiAqcHRyICE9IDEwKQorCQkJKmRzdCsrID0gKnB0cisrOworCQkqZHN0KysgPSAwOworCQl3aGlsZSAocHRyIDwgZW5kICYmIHB0clstMV0gIT0gMTApCisJCQlwdHIrKzsKKwl9CisJZG9fZ2V0dGltZW9mZGF5KCZ0YWJsZS0+dGltZXN0YW1wKTsKK30KKworc3RhdGljIGludCBnZXRfcmFkaW9fYWRkcmVzcyhzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIF9fdTggKiBwKQoreworCU1ldHJpY29tQWRkcmVzcyBhZGRyOworCisJaWYgKHN0cmluZ190b19yYWRpb19hZGRyZXNzKCZhZGRyLCBwKSkKKwkJcmV0dXJuICgxKTsKKworCS8qIFNlZSBpZiBvdXIgcmFkaW8gYWRkcmVzcyBoYXMgY2hhbmdlZCAqLworCWlmIChtZW1jbXAoc3RyaXBfaW5mby0+dHJ1ZV9kZXZfYWRkci5jLCBhZGRyLmMsIHNpemVvZihhZGRyKSkpIHsKKwkJTWV0cmljb21BZGRyZXNzU3RyaW5nIGFkZHJfc3RyaW5nOworCQlyYWRpb19hZGRyZXNzX3RvX3N0cmluZygmYWRkciwgJmFkZHJfc3RyaW5nKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJhZGlvIGFkZHJlc3MgPSAlc1xuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgYWRkcl9zdHJpbmcuYyk7CisJCXN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHIgPSBhZGRyOworCQlpZiAoIXN0cmlwX2luZm8tPm1hbnVhbF9kZXZfYWRkcikKKwkJCSooTWV0cmljb21BZGRyZXNzICopIHN0cmlwX2luZm8tPmRldi0+ZGV2X2FkZHIgPQorCQkJICAgIGFkZHI7CisJCS8qIEdpdmUgdGhlIHJhZGlvIGEgZmV3IHNlY29uZHMgdG8gZ2V0IGl0cyBoZWFkIHN0cmFpZ2h0LCB0aGVuIHNlbmQgYW4gYXJwICovCisJCXN0cmlwX2luZm8tPmdyYXR1aXRvdXNfYXJwID0gamlmZmllcyArIDE1ICogSFo7CisJCXN0cmlwX2luZm8tPmFycF9pbnRlcnZhbCA9IDEgKiBIWjsKKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCB2ZXJpZnlfY2hlY2tzdW0oc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvKQoreworCV9fdTggKnAgPSBzdHJpcF9pbmZvLT5zeF9idWZmOworCV9fdTggKmVuZCA9IHN0cmlwX2luZm8tPnN4X2J1ZmYgKyBzdHJpcF9pbmZvLT5zeF9jb3VudCAtIDQ7CisJdV9zaG9ydCBzdW0gPQorCSAgICAoUkVBREhFWDE2KGVuZFswXSkgPDwgMTIpIHwgKFJFQURIRVgxNihlbmRbMV0pIDw8IDgpIHwKKwkgICAgKFJFQURIRVgxNihlbmRbMl0pIDw8IDQpIHwgKFJFQURIRVgxNihlbmRbM10pKTsKKwl3aGlsZSAocCA8IGVuZCkKKwkJc3VtIC09ICpwKys7CisJaWYgKHN1bSA9PSAwICYmIHN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsID09IFN0cnVjdHVyZWRNZXNzYWdlcykgeworCQlzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA9IENoZWNrc3VtbWVkTWVzc2FnZXM7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSYWRpbyBwcm92aWRlcyBtZXNzYWdlIGNoZWNrc3Vtc1xuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7CisJfQorCXJldHVybiAoc3VtID09IDApOworfQorCitzdGF0aWMgdm9pZCBSZWN2RXJyKGNoYXIgKm1zZywgc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvKQoreworCV9fdTggKnB0ciA9IHN0cmlwX2luZm8tPnN4X2J1ZmY7CisJX191OCAqZW5kID0gc3RyaXBfaW5mby0+c3hfYnVmZiArIHN0cmlwX2luZm8tPnN4X2NvdW50OworCUR1bXBEYXRhKG1zZywgc3RyaXBfaW5mbywgcHRyLCBlbmQpOworCXN0cmlwX2luZm8tPnJ4X2Vycm9ycysrOworfQorCitzdGF0aWMgdm9pZCBSZWN2RXJyX01lc3NhZ2Uoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBfX3U4ICogc2VuZGVybmFtZSwKKwkJCSAgICBjb25zdCBfX3U4ICogbXNnLCB1X2xvbmcgbGVuKQoreworCWlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDAxIikpIHsJLyogTm90IGluIFN0YXJNb2RlISAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSYWRpbyAlcyBpcyBub3QgaW4gU3Rhck1vZGVcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHNlbmRlcm5hbWUpOworCX0KKworCWVsc2UgaWYgKGhhc19wcmVmaXgobXNnLCBsZW4sICIwMDIiKSkgewkvKiBSZW1hcCBoYW5kbGUgKi8KKwkJLyogV2UgaWdub3JlICJSZW1hcCBoYW5kbGUiIG1lc3NhZ2VzIGZvciBub3cgKi8KKwl9CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDAzIikpIHsJLyogQ2FuJ3QgcmVzb2x2ZSBuYW1lICovCisJCVJlY3ZFcnIoIkVycm9yIE1zZzoiLCBzdHJpcF9pbmZvKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERlc3RpbmF0aW9uIHJhZGlvIG5hbWUgaXMgdW5rbm93blxuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7CisJfQorCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAwNCIpKSB7CS8qIE5hbWUgdG9vIHNtYWxsIG9yIG1pc3NpbmcgKi8KKwkJc3RyaXBfaW5mby0+d2F0Y2hkb2dfZG9yZXNldCA9IGppZmZpZXMgKyBMb25nVGltZTsKKyNpZiBUSUNLTEVfVElNRVJTCisJCXsKKwkJCXN0cnVjdCB0aW1ldmFsIHR2OworCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIioqKiogR290IEVSUl8wMDQgcmVzcG9uc2UgICAgICAgICBhdCAlMDJkLiUwNmRcbiIsCisJCQkgICAgICAgdHYudHZfc2VjICUgMTAwLCB0di50dl91c2VjKTsKKwkJfQorI2VuZGlmCisJCWlmICghc3RyaXBfaW5mby0+d29ya2luZykgeworCQkJc3RyaXBfaW5mby0+d29ya2luZyA9IFRSVUU7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmFkaW8gbm93IGluIHN0YXJtb2RlXG4iLAorCQkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7CisJCQkvKgorCQkJICogSWYgdGhlIHJhZGlvIGhhcyBqdXN0IGVudGVyZWQgYSB3b3JraW5nIHN0YXRlLCB3ZSBzaG91bGQgZG8gb3VyIGZpcnN0CisJCQkgKiBwcm9iZSBBU0FQLCBzbyB0aGF0IHdlIGZpbmQgb3V0IG91ciByYWRpbyBhZGRyZXNzIGV0Yy4gd2l0aG91dCBkZWxheS4KKwkJCSAqLworCQkJc3RyaXBfaW5mby0+d2F0Y2hkb2dfZG9wcm9iZSA9IGppZmZpZXM7CisJCX0KKwkJaWYgKHN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsID09IE5vU3RydWN0dXJlICYmIHNlbmRlcm5hbWUpIHsKKwkJCXN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsID0gU3RydWN0dXJlZE1lc3NhZ2VzOworCQkJc3RyaXBfaW5mby0+bmV4dF9jb21tYW5kID0gMDsJLyogVHJ5IHRvIGVuYWJsZSBjaGVja3N1bXMgQVNBUCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICIlczogUmFkaW8gcHJvdmlkZXMgc3RydWN0dXJlZCBtZXNzYWdlc1xuIiwKKwkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCQl9CisJCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA+PSBTdHJ1Y3R1cmVkTWVzc2FnZXMpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGlzIG1lc3NhZ2UgaGFzIGEgdmFsaWQgY2hlY2tzdW0gb24gdGhlIGVuZCwgdGhlbiB0aGUgY2FsbCB0byB2ZXJpZnlfY2hlY2tzdW0KKwkJCSAqIHdpbGwgZWxldmF0ZSB0aGUgZmlybXdhcmVfbGV2ZWwgdG8gQ2hlY2tzdW1tZWRNZXNzYWdlcyBmb3IgdXMuIChUaGUgYWN0dWFsIHJldHVybgorCQkJICogY29kZSBmcm9tIHZlcmlmeV9jaGVja3N1bSBpcyBpZ25vcmVkIGhlcmUuKQorCQkJICovCisJCQl2ZXJpZnlfY2hlY2tzdW0oc3RyaXBfaW5mbyk7CisJCQkvKgorCQkJICogSWYgdGhlIHJhZGlvIGhhcyBzdHJ1Y3R1cmVkIG1lc3NhZ2VzIGJ1dCB3ZSBkb24ndCB5ZXQgaGF2ZSBhbGwgb3VyIGluZm9ybWF0aW9uIGFib3V0IGl0LAorCQkJICogd2Ugc2hvdWxkIGRvIHByb2JlcyB3aXRob3V0IGRlbGF5LCB1bnRpbCB3ZSBoYXZlIGdhdGhlcmVkIGFsbCB0aGUgaW5mb3JtYXRpb24KKwkJCSAqLworCQkJaWYgKCFHT1RfQUxMX1JBRElPX0lORk8oc3RyaXBfaW5mbykpCisJCQkJc3RyaXBfaW5mby0+d2F0Y2hkb2dfZG9wcm9iZSA9IGppZmZpZXM7CisJCX0KKwl9CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDA1IikpCS8qIEJhZCBjb3VudCBzcGVjaWZpY2F0aW9uICovCisJCVJlY3ZFcnIoIkVycm9yIE1zZzoiLCBzdHJpcF9pbmZvKTsKKworCWVsc2UgaWYgKGhhc19wcmVmaXgobXNnLCBsZW4sICIwMDYiKSkJLyogSGVhZGVyIHRvbyBiaWcgKi8KKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAwNyIpKSB7CS8qIEJvZHkgdG9vIGJpZyAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBFcnJvciEgUGFja2V0IHNpemUgdG9vIGJpZyBmb3IgcmFkaW8uXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwl9CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDA4IikpIHsJLyogQmFkIGNoYXJhY3RlciBpbiBuYW1lICovCisJCVJlY3ZFcnIoIkVycm9yIE1zZzoiLCBzdHJpcF9pbmZvKTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IFJhZGlvIG5hbWUgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCX0KKworCWVsc2UgaWYgKGhhc19wcmVmaXgobXNnLCBsZW4sICIwMDkiKSkJLyogTm8gY291bnQgb3IgbGluZSB0ZXJtaW5hdG9yICovCisJCVJlY3ZFcnIoIkVycm9yIE1zZzoiLCBzdHJpcF9pbmZvKTsKKworCWVsc2UgaWYgKGhhc19wcmVmaXgobXNnLCBsZW4sICIwMTAiKSkJLyogSW52YWxpZCBjaGVja3N1bSAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDExIikpCS8qIENoZWNrc3VtIGRpZG4ndCBtYXRjaCAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDEyIikpCS8qIEZhaWxlZCB0byB0cmFuc21pdCBwYWNrZXQgKi8KKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworCisJZWxzZQorCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfQVRfcmVzcG9uc2Uoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBfX3U4ICogcHRyLAorCQkJCV9fdTggKiBlbmQpCit7CisJdV9sb25nIGxlbjsKKwlfX3U4ICpwID0gcHRyOworCXdoaWxlIChwIDwgZW5kICYmIHBbLTFdICE9IDEwKQorCQlwKys7CQkvKiBTa2lwIHBhc3QgZmlyc3QgbmV3bGluZSBjaGFyYWN0ZXIgKi8KKwkvKiBOb3cgcHRyIHBvaW50cyB0byB0aGUgQVQgY29tbWFuZCwgYW5kIHAgcG9pbnRzIHRvIHRoZSB0ZXh0IG9mIHRoZSByZXNwb25zZS4gKi8KKwlsZW4gPSBwIC0gcHRyOworCisjaWYgVElDS0xFX1RJTUVSUworCXsKKwkJc3RydWN0IHRpbWV2YWwgdHY7CisJCWRvX2dldHRpbWVvZmRheSgmdHYpOworCQlwcmludGsoS0VSTl9JTkZPICIqKioqIEdvdCBBVCByZXNwb25zZSAlLjdzICAgICAgYXQgJTAyZC4lMDZkXG4iLAorCQkgICAgICAgcHRyLCB0di50dl9zZWMgJSAxMDAsIHR2LnR2X3VzZWMpOworCX0KKyNlbmRpZgorCisJaWYgKGhhc19wcmVmaXgocHRyLCBsZW4sICJBVFMzMDA/IikpCisJCWdldF9yYWRpb192ZXJzaW9uKHN0cmlwX2luZm8sIHAsIGVuZCk7CisJZWxzZSBpZiAoaGFzX3ByZWZpeChwdHIsIGxlbiwgIkFUUzMwNT8iKSkKKwkJZ2V0X3JhZGlvX2FkZHJlc3Moc3RyaXBfaW5mbywgcCk7CisJZWxzZSBpZiAoaGFzX3ByZWZpeChwdHIsIGxlbiwgIkFUUzMxMT8iKSkKKwkJZ2V0X3JhZGlvX25laWdoYm91cnMoJnN0cmlwX2luZm8tPnBvbGV0b3BzLCBwLCBlbmQpOworCWVsc2UgaWYgKGhhc19wcmVmaXgocHRyLCBsZW4sICJBVFMzMTk9NyIpKQorCQl2ZXJpZnlfY2hlY2tzdW0oc3RyaXBfaW5mbyk7CisJZWxzZSBpZiAoaGFzX3ByZWZpeChwdHIsIGxlbiwgIkFUUzMyNT8iKSkKKwkJZ2V0X3JhZGlvX3ZvbHRhZ2Uoc3RyaXBfaW5mbywgcCwgZW5kKTsKKwllbHNlIGlmIChoYXNfcHJlZml4KHB0ciwgbGVuLCAiQVR+TEEiKSkKKwkJZ2V0X3JhZGlvX25laWdoYm91cnMoJnN0cmlwX2luZm8tPnBvcnRhYmxlcywgcCwgZW5kKTsKKwllbHNlCisJCVJlY3ZFcnIoIlVua25vd24gQVQgUmVzcG9uc2U6Iiwgc3RyaXBfaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfQUNLKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywgX191OCAqIHB0ciwgX191OCAqIGVuZCkKK3sKKwkvKiBDdXJyZW50bHkgd2UgZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCBBQ0tzIGZyb20gdGhlIHJhZGlvICovCit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfSW5mbyhzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIF9fdTggKiBwdHIsIF9fdTggKiBlbmQpCit7CisJaWYgKHB0ciArIDE2ID4gZW5kKQorCQlSZWN2RXJyKCJCYWQgSW5mbyBNc2c6Iiwgc3RyaXBfaW5mbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZ2V0X3N0cmlwX2RldihzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8pCit7CisJLyogSWYgb3VyIGhhcmR3YXJlIGFkZHJlc3MgaXMgKm1hbnVhbGx5IHNldCogdG8gemVybywgYW5kIHdlIGtub3cgb3VyICovCisJLyogcmVhbCByYWRpbyBoYXJkd2FyZSBhZGRyZXNzLCB0cnkgdG8gZmluZCBhbm90aGVyIHN0cmlwIGRldmljZSB0aGF0IGhhcyBiZWVuICovCisJLyogbWFudWFsbHkgc2V0IHRvIHRoYXQgYWRkcmVzcyB0aGF0IHdlIGNhbiAndHJhbnNmZXIgb3duZXJzaGlwJyBvZiB0aGlzIHBhY2tldCB0byAgKi8KKwlpZiAoc3RyaXBfaW5mby0+bWFudWFsX2Rldl9hZGRyICYmCisJICAgICFtZW1jbXAoc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciwgemVyb19hZGRyZXNzLmMsCisJCSAgICBzaXplb2YoemVyb19hZGRyZXNzKSkKKwkgICAgJiYgbWVtY21wKCZzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyLCB6ZXJvX2FkZHJlc3MuYywKKwkJICAgICAgc2l6ZW9mKHplcm9fYWRkcmVzcykpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCXJlYWRfbG9ja19iaCgmZGV2X2Jhc2VfbG9jayk7CisJCWRldiA9IGRldl9iYXNlOworCQl3aGlsZSAoZGV2KSB7CisJCQlpZiAoZGV2LT50eXBlID09IHN0cmlwX2luZm8tPmRldi0+dHlwZSAmJgorCQkJICAgICFtZW1jbXAoZGV2LT5kZXZfYWRkciwKKwkJCQkgICAgJnN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHIsCisJCQkJICAgIHNpemVvZihNZXRyaWNvbUFkZHJlc3MpKSkgeworCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkgICAgICAgIiVzOiBUcmFuc2ZlcnJlZCBwYWNrZXQgb3duZXJzaGlwIHRvICVzLlxuIiwKKwkJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBkZXYtPm5hbWUpOworCQkJCXJlYWRfdW5sb2NrX2JoKCZkZXZfYmFzZV9sb2NrKTsKKwkJCQlyZXR1cm4gKGRldik7CisJCQl9CisJCQlkZXYgPSBkZXYtPm5leHQ7CisJCX0KKwkJcmVhZF91bmxvY2tfYmgoJmRldl9iYXNlX2xvY2spOworCX0KKwlyZXR1cm4gKHN0cmlwX2luZm8tPmRldik7Cit9CisKKy8qCisgKiBTZW5kIG9uZSBjb21wbGV0ZWx5IGRlY2Fwc3VsYXRlZCBkYXRhZ3JhbSB0byB0aGUgbmV4dCBsYXllci4KKyAqLworCitzdGF0aWMgdm9pZCBkZWxpdmVyX3BhY2tldChzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIFNUUklQX0hlYWRlciAqIGhlYWRlciwKKwkJCSAgIF9fdTE2IHBhY2tldGxlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2YoU1RSSVBfSGVhZGVyKSArIHBhY2tldGxlbik7CisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCQlzdHJpcF9pbmZvLT5yeF9kcm9wcGVkKys7CisJfSBlbHNlIHsKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLCBzaXplb2YoU1RSSVBfSGVhZGVyKSksIGhlYWRlciwKKwkJICAgICAgIHNpemVvZihTVFJJUF9IZWFkZXIpKTsKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwYWNrZXRsZW4pLCBzdHJpcF9pbmZvLT5yeF9idWZmLAorCQkgICAgICAgcGFja2V0bGVuKTsKKwkJc2tiLT5kZXYgPSBnZXRfc3RyaXBfZGV2KHN0cmlwX2luZm8pOworCQlza2ItPnByb3RvY29sID0gaGVhZGVyLT5wcm90b2NvbDsKKwkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCisJCS8qIEhhdmluZyBwdXQgYSBmYWtlIGhlYWRlciBvbiB0aGUgZnJvbnQgb2YgdGhlIHNrX2J1ZmYgZm9yIHRoZSAqLworCQkvKiBiZW5lZml0IG9mIHRvb2xzIGxpa2UgdGNwZHVtcCwgc2tiX3B1bGwgbm93ICdjb25zdW1lcycgdGhhdCAgKi8KKwkJLyogZmFrZSBoZWFkZXIgYmVmb3JlIHdlIGhhbmQgdGhlIHBhY2tldCB1cCB0byB0aGUgbmV4dCBsYXllci4gICovCisJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKFNUUklQX0hlYWRlcikpOworCisJCS8qIEZpbmFsbHksIGhhbmQgdGhlIHBhY2tldCB1cCB0byB0aGUgbmV4dCBsYXllciAoZS5nLiBJUCBvciBBUlAsIGV0Yy4pICovCisJCXN0cmlwX2luZm8tPnJ4X3BhY2tldHMrKzsKKwkJc3RyaXBfaW5mby0+cnhfcHBzX2NvdW50Kys7CisjaWZkZWYgRVhUX0NPVU5URVJTCisJCXN0cmlwX2luZm8tPnJ4X2J5dGVzICs9IHBhY2tldGxlbjsKKyNlbmRpZgorCQlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW5ldGlmX3J4KHNrYik7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX0lQX3BhY2tldChzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sCisJCQkgICAgICBTVFJJUF9IZWFkZXIgKiBoZWFkZXIsIF9fdTggKiBwdHIsCisJCQkgICAgICBfX3U4ICogZW5kKQoreworCV9fdTE2IHBhY2tldGxlbjsKKworCS8qIERlY29kZSBzdGFydCBvZiB0aGUgSVAgcGFja2V0IGhlYWRlciAqLworCXB0ciA9IFVuU3R1ZmZEYXRhKHB0ciwgZW5kLCBzdHJpcF9pbmZvLT5yeF9idWZmLCA0KTsKKwlpZiAoIXB0cikgeworCQlSZWN2RXJyKCJJUCBQYWNrZXQgdG9vIHNob3J0Iiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwlwYWNrZXRsZW4gPSAoKF9fdTE2KSBzdHJpcF9pbmZvLT5yeF9idWZmWzJdIDw8IDgpIHwgc3RyaXBfaW5mby0+cnhfYnVmZlszXTsKKworCWlmIChwYWNrZXRsZW4gPiBNQVhfUkVDVl9NVFUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERyb3BwaW5nIG92ZXJzaXplZCByZWNlaXZlZCBJUCBwYWNrZXQ6ICVkIGJ5dGVzXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBwYWNrZXRsZW4pOworCQlzdHJpcF9pbmZvLT5yeF9kcm9wcGVkKys7CisJCXJldHVybjsKKwl9CisKKwkvKnByaW50ayhLRVJOX0lORk8gIiVzOiBHb3QgJWQgYnl0ZSBJUCBwYWNrZXRcbiIsIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgcGFja2V0bGVuKTsgKi8KKworCS8qIERlY29kZSByZW1haW5kZXIgb2YgdGhlIElQIHBhY2tldCAqLworCXB0ciA9CisJICAgIFVuU3R1ZmZEYXRhKHB0ciwgZW5kLCBzdHJpcF9pbmZvLT5yeF9idWZmICsgNCwgcGFja2V0bGVuIC0gNCk7CisJaWYgKCFwdHIpIHsKKwkJUmVjdkVycigiSVAgUGFja2V0IHRvbyBzaG9ydCIsIHN0cmlwX2luZm8pOworCQlyZXR1cm47CisJfQorCisJaWYgKHB0ciA8IGVuZCkgeworCQlSZWN2RXJyKCJJUCBQYWNrZXQgdG9vIGxvbmciLCBzdHJpcF9pbmZvKTsKKwkJcmV0dXJuOworCX0KKworCWhlYWRlci0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisKKwlkZWxpdmVyX3BhY2tldChzdHJpcF9pbmZvLCBoZWFkZXIsIHBhY2tldGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfQVJQX3BhY2tldChzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sCisJCQkgICAgICAgU1RSSVBfSGVhZGVyICogaGVhZGVyLCBfX3U4ICogcHRyLAorCQkJICAgICAgIF9fdTggKiBlbmQpCit7CisJX191MTYgcGFja2V0bGVuOworCXN0cnVjdCBhcnBoZHIgKmFycGhkciA9IChzdHJ1Y3QgYXJwaGRyICopIHN0cmlwX2luZm8tPnJ4X2J1ZmY7CisKKwkvKiBEZWNvZGUgc3RhcnQgb2YgdGhlIEFSUCBwYWNrZXQgKi8KKwlwdHIgPSBVblN0dWZmRGF0YShwdHIsIGVuZCwgc3RyaXBfaW5mby0+cnhfYnVmZiwgOCk7CisJaWYgKCFwdHIpIHsKKwkJUmVjdkVycigiQVJQIFBhY2tldCB0b28gc2hvcnQiLCBzdHJpcF9pbmZvKTsKKwkJcmV0dXJuOworCX0KKworCXBhY2tldGxlbiA9IDggKyAoYXJwaGRyLT5hcl9obG4gKyBhcnBoZHItPmFyX3BsbikgKiAyOworCisJaWYgKHBhY2tldGxlbiA+IE1BWF9SRUNWX01UVSkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IERyb3BwaW5nIG92ZXJzaXplZCByZWNlaXZlZCBBUlAgcGFja2V0OiAlZCBieXRlc1xuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgcGFja2V0bGVuKTsKKwkJc3RyaXBfaW5mby0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJLypwcmludGsoS0VSTl9JTkZPICIlczogR290ICVkIGJ5dGUgQVJQICVzXG4iLAorCSAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgcGFja2V0bGVuLAorCSAgIG50b2hzKGFycGhkci0+YXJfb3ApID09IEFSUE9QX1JFUVVFU1QgPyAicmVxdWVzdCIgOiAicmVwbHkiKTsgKi8KKworCS8qIERlY29kZSByZW1haW5kZXIgb2YgdGhlIEFSUCBwYWNrZXQgKi8KKwlwdHIgPQorCSAgICBVblN0dWZmRGF0YShwdHIsIGVuZCwgc3RyaXBfaW5mby0+cnhfYnVmZiArIDgsIHBhY2tldGxlbiAtIDgpOworCWlmICghcHRyKSB7CisJCVJlY3ZFcnIoIkFSUCBQYWNrZXQgdG9vIHNob3J0Iiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocHRyIDwgZW5kKSB7CisJCVJlY3ZFcnIoIkFSUCBQYWNrZXQgdG9vIGxvbmciLCBzdHJpcF9pbmZvKTsKKwkJcmV0dXJuOworCX0KKworCWhlYWRlci0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BUlApOworCisJZGVsaXZlcl9wYWNrZXQoc3RyaXBfaW5mbywgaGVhZGVyLCBwYWNrZXRsZW4pOworfQorCisvKgorICogcHJvY2Vzc190ZXh0X21lc3NhZ2UgcHJvY2Vzc2VzIGEgPENSPi10ZXJtaW5hdGVkIGJsb2NrIG9mIGRhdGEgcmVjZWl2ZWQKKyAqIGZyb20gdGhlIHJhZGlvIHRoYXQgZG9lc24ndCBiZWdpbiB3aXRoIGEgJyonIGNoYXJhY3Rlci4gQWxsIG5vcm1hbAorICogU3Rhcm1vZGUgY29tbXVuaWNhdGlvbiBtZXNzYWdlcyB3aXRoIHRoZSByYWRpbyBiZWdpbiB3aXRoIGEgJyonLAorICogc28gYW55IHRleHQgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZXMgYSBzZXJpYWwgcG9ydCBlcnJvciwgYSByYWRpbyB0aGF0CisgKiBpcyBpbiBIYXllcyBjb21tYW5kIG1vZGUgaW5zdGVhZCBvZiBTdGFybW9kZSwgb3IgYSByYWRpbyB3aXRoIHJlYWxseQorICogb2xkIGZpcm13YXJlIHRoYXQgZG9lc24ndCBmcmFtZSBpdHMgU3Rhcm1vZGUgcmVzcG9uc2VzIHByb3Blcmx5LgorICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX3RleHRfbWVzc2FnZShzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8pCit7CisJX191OCAqbXNnID0gc3RyaXBfaW5mby0+c3hfYnVmZjsKKwlpbnQgbGVuID0gc3RyaXBfaW5mby0+c3hfY291bnQ7CisKKwkvKiBDaGVjayBmb3IgYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlIGl0IG1pZ2h0IGJlIG91ciByYWRpbyBuYW1lICovCisJLyogKFRoaXMgaXMgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZmlybXdhcmUpICAqLworCWlmIChsZW4gPT0gOSAmJiBnZXRfcmFkaW9fYWRkcmVzcyhzdHJpcF9pbmZvLCBtc2cpID09IDApCisJCXJldHVybjsKKworCWlmICh0ZXh0X2VxdWFsKG1zZywgbGVuLCAiT0siKSkKKwkJcmV0dXJuOwkJLyogSWdub3JlICdPSycgcmVzcG9uc2VzIGZyb20gcHJpb3IgY29tbWFuZHMgKi8KKwlpZiAodGV4dF9lcXVhbChtc2csIGxlbiwgIkVSUk9SIikpCisJCXJldHVybjsJCS8qIElnbm9yZSAnRVJST1InIG1lc3NhZ2VzICovCisJaWYgKGhhc19wcmVmaXgobXNnLCBsZW4sICJhdGUwcTEiKSkKKwkJcmV0dXJuOwkJLyogSWdub3JlIGNoYXJhY3RlciBlY2hvIGJhY2sgZnJvbSB0aGUgcmFkaW8gKi8KKworCS8qIENhdGNoIG90aGVyIGVycm9yIG1lc3NhZ2VzICovCisJLyogKFRoaXMgaXMgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZmlybXdhcmUpICovCisJaWYgKGhhc19wcmVmaXgobXNnLCBsZW4sICJFUlJfIikpIHsKKwkJUmVjdkVycl9NZXNzYWdlKHN0cmlwX2luZm8sIE5VTEwsICZtc2dbNF0sIGxlbiAtIDQpOworCQlyZXR1cm47CisJfQorCisJUmVjdkVycigiTm8gaW5pdGlhbCAqIiwgc3RyaXBfaW5mbyk7Cit9CisKKy8qCisgKiBwcm9jZXNzX21lc3NhZ2UgcHJvY2Vzc2VzIGEgPENSPi10ZXJtaW5hdGVkIGJsb2NrIG9mIGRhdGEgcmVjZWl2ZWQKKyAqIGZyb20gdGhlIHJhZGlvLiBJZiB0aGUgcmFkaW8gaXMgbm90IGluIFN0YXJtb2RlIG9yIGhhcyBvbGQgZmlybXdhcmUsCisgKiBpdCBtYXkgYmUgYSBsaW5lIG9mIHRleHQgaW4gcmVzcG9uc2UgdG8gYW4gQVQgY29tbWFuZC4gSWRlYWxseSwgd2l0aAorICogYSBjdXJyZW50IHJhZGlvIHRoYXQncyBwcm9wZXJseSBpbiBTdGFybW9kZSwgYWxsIGRhdGEgcmVjZWl2ZWQgc2hvdWxkCisgKiBiZSBwcm9wZXJseSBmcmFtZWQgYW5kIGNoZWNrc3VtbWVkIHJhZGlvIG1lc3NhZ2UgYmxvY2tzLCBjb250YWluaW5nCisgKiBlaXRoZXIgYSBzdGFybW9kZSBwYWNrZXQsIG9yIGEgb3RoZXIgY29tbXVuaWNhdGlvbiBmcm9tIHRoZSByYWRpbworICogZmlybXdhcmUsIGxpa2UgIklORl8iIEluZm8gbWVzc2FnZXMgYW5kICZDT01NQU5EIHJlc3BvbnNlcy4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19tZXNzYWdlKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwlTVFJJUF9IZWFkZXIgaGVhZGVyID0geyB6ZXJvX2FkZHJlc3MsIHplcm9fYWRkcmVzcywgMCB9OworCV9fdTggKnB0ciA9IHN0cmlwX2luZm8tPnN4X2J1ZmY7CisJX191OCAqZW5kID0gc3RyaXBfaW5mby0+c3hfYnVmZiArIHN0cmlwX2luZm8tPnN4X2NvdW50OworCV9fdTggc2VuZGVybmFtZVszMl0sICpzcHRyID0gc2VuZGVybmFtZTsKKwlNZXRyaWNvbUtleSBrZXk7CisKKwkvKkhleER1bXAoIlJlY2VpdmluZyIsIHN0cmlwX2luZm8sIHB0ciwgZW5kKTsgKi8KKworCS8qIENoZWNrIGZvciBzdGFydCBvZiBhZGRyZXNzIG1hcmtlciwgYW5kIHRoZW4gc2tpcCBvdmVyIGl0ICovCisJaWYgKCpwdHIgPT0gJyonKQorCQlwdHIrKzsKKwllbHNlIHsKKwkJcHJvY2Vzc190ZXh0X21lc3NhZ2Uoc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDb3B5IG91dCB0aGUgcmV0dXJuIGFkZHJlc3MgKi8KKwl3aGlsZSAocHRyIDwgZW5kICYmICpwdHIgIT0gJyonCisJICAgICAgICYmIHNwdHIgPCBBUlJBWV9FTkQoc2VuZGVybmFtZSkgLSAxKQorCQkqc3B0cisrID0gKnB0cisrOworCSpzcHRyID0gMDsJCS8qIE51bGwgdGVybWluYXRlIHRoZSBzZW5kZXIgbmFtZSAqLworCisJLyogQ2hlY2sgZm9yIGVuZCBvZiBhZGRyZXNzIG1hcmtlciwgYW5kIHNraXAgb3ZlciBpdCAqLworCWlmIChwdHIgPj0gZW5kIHx8ICpwdHIgIT0gJyonKSB7CisJCVJlY3ZFcnIoIk5vIHNlY29uZCAqIiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisJcHRyKys7CQkJLyogU2tpcCB0aGUgc2Vjb25kICcqJyAqLworCisJLyogSWYgdGhlIHNlbmRlciBuYW1lIGlzICImQ09NTUFORCIsIGlnbm9yZSB0aGlzICdwYWNrZXQnICAgICAgICovCisJLyogKFRoaXMgaXMgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZmlybXdhcmUpICovCisJaWYgKCFzdHJjbXAoc2VuZGVybmFtZSwgIiZDT01NQU5EIikpIHsKKwkJc3RyaXBfaW5mby0+ZmlybXdhcmVfbGV2ZWwgPSBOb1N0cnVjdHVyZTsKKwkJc3RyaXBfaW5mby0+bmV4dF9jb21tYW5kID0gQ29tcGF0aWJpbGl0eUNvbW1hbmQ7CisJCXJldHVybjsKKwl9CisKKwlpZiAocHRyICsgNCA+IGVuZCkgeworCQlSZWN2RXJyKCJObyBwcm90byBrZXkiLCBzdHJpcF9pbmZvKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEdldCB0aGUgcHJvdG9jb2wga2V5IG91dCBvZiB0aGUgYnVmZmVyICovCisJa2V5LmNbMF0gPSAqcHRyKys7CisJa2V5LmNbMV0gPSAqcHRyKys7CisJa2V5LmNbMl0gPSAqcHRyKys7CisJa2V5LmNbM10gPSAqcHRyKys7CisKKwkvKiBJZiB3ZSdyZSB1c2luZyBjaGVja3N1bXMsIHZlcmlmeSB0aGUgY2hlY2tzdW0gYXQgdGhlIGVuZCBvZiB0aGUgcGFja2V0ICovCisJaWYgKHN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsID49IENoZWNrc3VtbWVkTWVzc2FnZXMpIHsKKwkJZW5kIC09IDQ7CS8qIENob3AgdGhlIGxhc3QgZm91ciBieXRlcyBvZmYgdGhlIHBhY2tldCAodGhleSdyZSB0aGUgY2hlY2tzdW0pICovCisJCWlmIChwdHIgPiBlbmQpIHsKKwkJCVJlY3ZFcnIoIk1pc3NpbmcgQ2hlY2tzdW0iLCBzdHJpcF9pbmZvKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIXZlcmlmeV9jaGVja3N1bShzdHJpcF9pbmZvKSkgeworCQkJUmVjdkVycigiQmFkIENoZWNrc3VtIiwgc3RyaXBfaW5mbyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKnByaW50ayhLRVJOX0lORk8gIiVzOiBHb3QgcGFja2V0IGZyb20gXCIlc1wiLlxuIiwgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBzZW5kZXJuYW1lKTsgKi8KKworCS8qCisJICogRmlsbCBpbiAocHNldWRvKSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyBpbiB0aGUgcGFja2V0LgorCSAqIFdlIGFzc3VtZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHdhcyBvdXIgYWRkcmVzcyAodGhlIHJhZGlvIGRvZXMgbm90CisJICogdGVsbCB1cyB0aGlzKS4gSWYgdGhlIHJhZGlvIHN1cHBsaWVzIGEgc291cmNlIGFkZHJlc3MsIHRoZW4gd2UgdXNlIGl0LgorCSAqLworCWhlYWRlci5kc3RfYWRkciA9IHN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHI7CisJc3RyaW5nX3RvX3JhZGlvX2FkZHJlc3MoJmhlYWRlci5zcmNfYWRkciwgc2VuZGVybmFtZSk7CisKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwlpZiAoa2V5LmwgPT0gU0lQMEtleS5sKSB7CisJCXN0cmlwX2luZm8tPnJ4X3JieXRlcyArPSAoZW5kIC0gcHRyKTsKKwkJcHJvY2Vzc19JUF9wYWNrZXQoc3RyaXBfaW5mbywgJmhlYWRlciwgcHRyLCBlbmQpOworCX0gZWxzZSBpZiAoa2V5LmwgPT0gQVJQMEtleS5sKSB7CisJCXN0cmlwX2luZm8tPnJ4X3JieXRlcyArPSAoZW5kIC0gcHRyKTsKKwkJcHJvY2Vzc19BUlBfcGFja2V0KHN0cmlwX2luZm8sICZoZWFkZXIsIHB0ciwgZW5kKTsKKwl9IGVsc2UgaWYgKGtleS5sID09IEFUUl9LZXkubCkgeworCQlzdHJpcF9pbmZvLT5yeF9lYnl0ZXMgKz0gKGVuZCAtIHB0cik7CisJCXByb2Nlc3NfQVRfcmVzcG9uc2Uoc3RyaXBfaW5mbywgcHRyLCBlbmQpOworCX0gZWxzZSBpZiAoa2V5LmwgPT0gQUNLX0tleS5sKSB7CisJCXN0cmlwX2luZm8tPnJ4X2VieXRlcyArPSAoZW5kIC0gcHRyKTsKKwkJcHJvY2Vzc19BQ0soc3RyaXBfaW5mbywgcHRyLCBlbmQpOworCX0gZWxzZSBpZiAoa2V5LmwgPT0gSU5GX0tleS5sKSB7CisJCXN0cmlwX2luZm8tPnJ4X2VieXRlcyArPSAoZW5kIC0gcHRyKTsKKwkJcHJvY2Vzc19JbmZvKHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwl9IGVsc2UgaWYgKGtleS5sID09IEVSUl9LZXkubCkgeworCQlzdHJpcF9pbmZvLT5yeF9lYnl0ZXMgKz0gKGVuZCAtIHB0cik7CisJCVJlY3ZFcnJfTWVzc2FnZShzdHJpcF9pbmZvLCBzZW5kZXJuYW1lLCBwdHIsIGVuZCAtIHB0cik7CisJfSBlbHNlCisJCVJlY3ZFcnIoIlVucmVjb2duaXplZCBwcm90b2NvbCBrZXkiLCBzdHJpcF9pbmZvKTsKKyNlbHNlCisJaWYgKGtleS5sID09IFNJUDBLZXkubCkKKwkJcHJvY2Vzc19JUF9wYWNrZXQoc3RyaXBfaW5mbywgJmhlYWRlciwgcHRyLCBlbmQpOworCWVsc2UgaWYgKGtleS5sID09IEFSUDBLZXkubCkKKwkJcHJvY2Vzc19BUlBfcGFja2V0KHN0cmlwX2luZm8sICZoZWFkZXIsIHB0ciwgZW5kKTsKKwllbHNlIGlmIChrZXkubCA9PSBBVFJfS2V5LmwpCisJCXByb2Nlc3NfQVRfcmVzcG9uc2Uoc3RyaXBfaW5mbywgcHRyLCBlbmQpOworCWVsc2UgaWYgKGtleS5sID09IEFDS19LZXkubCkKKwkJcHJvY2Vzc19BQ0soc3RyaXBfaW5mbywgcHRyLCBlbmQpOworCWVsc2UgaWYgKGtleS5sID09IElORl9LZXkubCkKKwkJcHJvY2Vzc19JbmZvKHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwllbHNlIGlmIChrZXkubCA9PSBFUlJfS2V5LmwpCisJCVJlY3ZFcnJfTWVzc2FnZShzdHJpcF9pbmZvLCBzZW5kZXJuYW1lLCBwdHIsIGVuZCAtIHB0cik7CisJZWxzZQorCQlSZWN2RXJyKCJVbnJlY29nbml6ZWQgcHJvdG9jb2wga2V5Iiwgc3RyaXBfaW5mbyk7CisjZW5kaWYKK30KKworI2RlZmluZSBUVFlFUlJPUihYKSAoKFgpID09IFRUWV9CUkVBSyAgID8gIkJyZWFrIiAgICAgICAgICAgIDogXAorICAgICAgICAgICAgICAgICAgICAgKFgpID09IFRUWV9GUkFNRSAgID8gIkZyYW1pbmcgRXJyb3IiICAgIDogXAorICAgICAgICAgICAgICAgICAgICAgKFgpID09IFRUWV9QQVJJVFkgID8gIlBhcml0eSBFcnJvciIgICAgIDogXAorICAgICAgICAgICAgICAgICAgICAgKFgpID09IFRUWV9PVkVSUlVOID8gIkhhcmR3YXJlIE92ZXJydW4iIDogIlVua25vd24gRXJyb3IiKQorCisvKgorICogSGFuZGxlIHRoZSAncmVjZWl2ZXIgZGF0YSByZWFkeScgaW50ZXJydXB0LgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlICd0dHlfaW8nIG1vZHVsZSBpbiB0aGUga2VybmVsIHdoZW4KKyAqIGEgYmxvY2sgb2YgU1RSSVAgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCwgd2hpY2ggY2FuIG5vdyBiZSBkZWNhcHN1bGF0ZWQKKyAqIGFuZCBzZW50IG9uIHRvIHNvbWUgSVAgbGF5ZXIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAqLworCitzdGF0aWMgdm9pZCBzdHJpcF9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwKKwkJICBjaGFyICpmcCwgaW50IGNvdW50KQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IChzdHJ1Y3Qgc3RyaXAgKikgdHR5LT5kaXNjX2RhdGE7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZW5kID0gY3AgKyBjb3VudDsKKworCWlmICghc3RyaXBfaW5mbyB8fCBzdHJpcF9pbmZvLT5tYWdpYyAhPSBTVFJJUF9NQUdJQworCSAgICB8fCAhbmV0aWZfcnVubmluZyhzdHJpcF9pbmZvLT5kZXYpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfYmgoJnN0cmlwX2xvY2spOworI2lmIDAKKwl7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIioqKiogc3RyaXBfcmVjZWl2ZV9idWY6ICUzZCBieXRlcyBhdCAlMDJkLiUwNmRcbiIsCisJCSAgICAgICBjb3VudCwgdHYudHZfc2VjICUgMTAwLCB0di50dl91c2VjKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIEVYVF9DT1VOVEVSUworCXN0cmlwX2luZm8tPnJ4X3NieXRlcyArPSBjb3VudDsKKyNlbmRpZgorCisJLyogUmVhZCB0aGUgY2hhcmFjdGVycyBvdXQgb2YgdGhlIGJ1ZmZlciAqLworCXdoaWxlIChjcCA8IGVuZCkgeworCQlpZiAoZnAgJiYgKmZwKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIG9uIHNlcmlhbCBwb3J0XG4iLAorCQkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgVFRZRVJST1IoKmZwKSk7CisJCWlmIChmcCAmJiAqZnArKyAmJiAhc3RyaXBfaW5mby0+ZGlzY2FyZCkgewkvKiBJZiB0aGVyZSdzIGEgc2VyaWFsIGVycm9yLCByZWNvcmQgaXQgKi8KKwkJCS8qIElmIHdlIGhhdmUgc29tZSBjaGFyYWN0ZXJzIGluIHRoZSBidWZmZXIsIGRpc2NhcmQgdGhlbSAqLworCQkJc3RyaXBfaW5mby0+ZGlzY2FyZCA9IHN0cmlwX2luZm8tPnN4X2NvdW50OworCQkJc3RyaXBfaW5mby0+cnhfZXJyb3JzKys7CisJCX0KKworCQkvKiBMZWFkaW5nIGNvbnRyb2wgY2hhcmFjdGVycyAoQ1IsIE5MLCBUYWIsIGV0Yy4pIGFyZSBpZ25vcmVkICovCisJCWlmIChzdHJpcF9pbmZvLT5zeF9jb3VudCA+IDAgfHwgKmNwID49ICcgJykgeworCQkJaWYgKCpjcCA9PSAweDBEKSB7CS8qIElmIGVuZCBvZiBwYWNrZXQsIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggaXQgKi8KKwkJCQlpZiAoc3RyaXBfaW5mby0+c3hfY291bnQgPiAzMDAwKQorCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSAgICAgICAiJXM6IEN1dCBhICVkIGJ5dGUgcGFja2V0ICglemQgYnl0ZXMgcmVtYWluaW5nKSVzXG4iLAorCQkJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLAorCQkJCQkgICAgICAgc3RyaXBfaW5mby0+c3hfY291bnQsCisJCQkJCSAgICAgICBlbmQgLSBjcCAtIDEsCisJCQkJCSAgICAgICBzdHJpcF9pbmZvLT4KKwkJCQkJICAgICAgIGRpc2NhcmQgPyAiIChkaXNjYXJkZWQpIiA6CisJCQkJCSAgICAgICAiIik7CisJCQkJaWYgKHN0cmlwX2luZm8tPnN4X2NvdW50ID4KKwkJCQkgICAgc3RyaXBfaW5mby0+c3hfc2l6ZSkgeworCQkJCQlzdHJpcF9pbmZvLT5yeF9vdmVyX2Vycm9ycysrOworCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSAgICAgICAiJXM6IHN4X2J1ZmYgb3ZlcmZsb3cgKCVkIGJ5dGVzIHRvdGFsKVxuIiwKKwkJCQkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwKKwkJCQkJICAgICAgIHN0cmlwX2luZm8tPnN4X2NvdW50KTsKKwkJCQl9IGVsc2UgaWYgKHN0cmlwX2luZm8tPmRpc2NhcmQpCisJCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJICAgICAgICIlczogRGlzY2FyZGluZyBiYWQgcGFja2V0ICglZC8lZClcbiIsCisJCQkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsCisJCQkJCSAgICAgICBzdHJpcF9pbmZvLT5kaXNjYXJkLAorCQkJCQkgICAgICAgc3RyaXBfaW5mby0+c3hfY291bnQpOworCQkJCWVsc2UKKwkJCQkJcHJvY2Vzc19tZXNzYWdlKHN0cmlwX2luZm8pOworCQkJCXN0cmlwX2luZm8tPmRpc2NhcmQgPSAwOworCQkJCXN0cmlwX2luZm8tPnN4X2NvdW50ID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJLyogTWFrZSBzdXJlIHdlIGhhdmUgc3BhY2UgaW4gdGhlIGJ1ZmZlciAqLworCQkJCWlmIChzdHJpcF9pbmZvLT5zeF9jb3VudCA8CisJCQkJICAgIHN0cmlwX2luZm8tPnN4X3NpemUpCisJCQkJCXN0cmlwX2luZm8tPnN4X2J1ZmZbc3RyaXBfaW5mby0+CisJCQkJCQkJICAgIHN4X2NvdW50XSA9CisJCQkJCSAgICAqY3A7CisJCQkJc3RyaXBfaW5mby0+c3hfY291bnQrKzsKKwkJCX0KKwkJfQorCQljcCsrOworCX0KKwlzcGluX3VubG9ja19iaCgmc3RyaXBfbG9jayk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEdlbmVyYWwgY29udHJvbCByb3V0aW5lcwkJCQkJCSovCisKK3N0YXRpYyBpbnQgc2V0X21hY19hZGRyZXNzKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywKKwkJCSAgIE1ldHJpY29tQWRkcmVzcyAqIGFkZHIpCit7CisJLyoKKwkgKiBXZSdyZSB1c2luZyBhIG1hbnVhbGx5IHNwZWNpZmllZCBhZGRyZXNzIGlmIHRoZSBhZGRyZXNzIGlzIHNldAorCSAqIHRvIGFueXRoaW5nIG90aGVyIHRoYW4gYWxsIG9uZXMuIFNldHRpbmcgdGhlIGFkZHJlc3MgdG8gYWxsIG9uZXMKKwkgKiBkaXNhYmxlcyBtYW51YWwgbW9kZSBhbmQgZ29lcyBiYWNrIHRvIGF1dG9tYXRpYyBhZGRyZXNzIGRldGVybWluYXRpb24KKwkgKiAodHJhY2tpbmcgdGhlIHRydWUgYWRkcmVzcyB0aGF0IHRoZSByYWRpbyBoYXMpLgorCSAqLworCXN0cmlwX2luZm8tPm1hbnVhbF9kZXZfYWRkciA9CisJICAgIG1lbWNtcChhZGRyLT5jLCBicm9hZGNhc3RfYWRkcmVzcy5jLAorCQkgICBzaXplb2YoYnJvYWRjYXN0X2FkZHJlc3MpKTsKKwlpZiAoc3RyaXBfaW5mby0+bWFudWFsX2Rldl9hZGRyKQorCQkqKE1ldHJpY29tQWRkcmVzcyAqKSBzdHJpcF9pbmZvLT5kZXYtPmRldl9hZGRyID0gKmFkZHI7CisJZWxzZQorCQkqKE1ldHJpY29tQWRkcmVzcyAqKSBzdHJpcF9pbmZvLT5kZXYtPmRldl9hZGRyID0KKwkJICAgIHN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RyaXBfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gYWRkcjsKKwlwcmludGsoS0VSTl9JTkZPICIlczogc3RyaXBfc2V0X2Rldl9tYWNfYWRkcmVzcyBjYWxsZWRcbiIsIGRldi0+bmFtZSk7CisJc2V0X21hY19hZGRyZXNzKHN0cmlwX2luZm8sIChNZXRyaWNvbUFkZHJlc3MgKikgc2EtPnNhX2RhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0cmlwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IG5ldGRldl9wcml2KGRldik7CisJc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisKKwlzdGF0cy5yeF9wYWNrZXRzID0gc3RyaXBfaW5mby0+cnhfcGFja2V0czsKKwlzdGF0cy50eF9wYWNrZXRzID0gc3RyaXBfaW5mby0+dHhfcGFja2V0czsKKwlzdGF0cy5yeF9kcm9wcGVkID0gc3RyaXBfaW5mby0+cnhfZHJvcHBlZDsKKwlzdGF0cy50eF9kcm9wcGVkID0gc3RyaXBfaW5mby0+dHhfZHJvcHBlZDsKKwlzdGF0cy50eF9lcnJvcnMgPSBzdHJpcF9pbmZvLT50eF9lcnJvcnM7CisJc3RhdHMucnhfZXJyb3JzID0gc3RyaXBfaW5mby0+cnhfZXJyb3JzOworCXN0YXRzLnJ4X292ZXJfZXJyb3JzID0gc3RyaXBfaW5mby0+cnhfb3Zlcl9lcnJvcnM7CisJcmV0dXJuICgmc3RhdHMpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBPcGVuaW5nIGFuZCBjbG9zaW5nCQkJCQkJCSovCisKKy8qCisgKiBIZXJlJ3MgdGhlIG9yZGVyIHRoaW5ncyBoYXBwZW46CisgKiBXaGVuIHRoZSB1c2VyIHJ1bnMgInNsYXR0YWNoIC1wIHN0cmlwIC4uLiIKKyAqICAxLiBUaGUgVFRZIG1vZHVsZSBjYWxscyBzdHJpcF9vcGVuCisgKiAgMi4gc3RyaXBfb3BlbiBjYWxscyBzdHJpcF9hbGxvYworICogIDMuICAgICAgICAgICAgICAgICAgc3RyaXBfYWxsb2MgY2FsbHMgcmVnaXN0ZXJfbmV0ZGV2CisgKiAgNC4gICAgICAgICAgICAgICAgICByZWdpc3Rlcl9uZXRkZXYgY2FsbHMgc3RyaXBfZGV2X2luaXQKKyAqICA1LiB0aGVuIHN0cmlwX29wZW4gZmluaXNoZXMgc2V0dGluZyB1cCB0aGUgc3RyaXBfaW5mbworICoKKyAqIFdoZW4gdGhlIHVzZXIgcnVucyAiaWZjb25maWcgc3Q8eD4gdXAgYWRkcmVzcyBuZXRtYXNrIC4uLiIKKyAqICA2LiBzdHJpcF9vcGVuX2xvdyBnZXRzIGNhbGxlZAorICoKKyAqIFdoZW4gdGhlIHVzZXIgcnVucyAiaWZjb25maWcgc3Q8eD4gZG93biIKKyAqICA3LiBzdHJpcF9jbG9zZV9sb3cgZ2V0cyBjYWxsZWQKKyAqCisgKiBXaGVuIHRoZSB1c2VyIGtpbGxzIHRoZSBzbGF0dGFjaCBwcm9jZXNzCisgKiAgOC4gc3RyaXBfY2xvc2UgZ2V0cyBjYWxsZWQKKyAqICA5LiBzdHJpcF9jbG9zZSBjYWxscyBkZXZfY2xvc2UKKyAqIDEwLiBpZiB0aGUgZGV2aWNlIGlzIHN0aWxsIHVwLCB0aGVuIGRldl9jbG9zZSBjYWxscyBzdHJpcF9jbG9zZV9sb3cKKyAqIDExLiBzdHJpcF9jbG9zZSBjYWxscyBzdHJpcF9mcmVlCisgKi8KKworLyogT3BlbiB0aGUgbG93LWxldmVsIHBhcnQgb2YgdGhlIFNUUklQIGNoYW5uZWwuIEVhc3khICovCisKK3N0YXRpYyBpbnQgc3RyaXBfb3Blbl9sb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHN0cmlwX2luZm8tPnR0eSA9PSBOVUxMKQorCQlyZXR1cm4gKC1FTk9ERVYpOworCisJaWYgKCFhbGxvY2F0ZV9idWZmZXJzKHN0cmlwX2luZm8sIGRldi0+bXR1KSkKKwkJcmV0dXJuICgtRU5PTUVNKTsKKworCXN0cmlwX2luZm8tPnN4X2NvdW50ID0gMDsKKwlzdHJpcF9pbmZvLT50eF9sZWZ0ID0gMDsKKworCXN0cmlwX2luZm8tPmRpc2NhcmQgPSAwOworCXN0cmlwX2luZm8tPndvcmtpbmcgPSBGQUxTRTsKKwlzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA9IE5vU3RydWN0dXJlOworCXN0cmlwX2luZm8tPm5leHRfY29tbWFuZCA9IENvbXBhdGliaWxpdHlDb21tYW5kOworCXN0cmlwX2luZm8tPnVzZXJfYmF1ZCA9IGdldF9iYXVkKHN0cmlwX2luZm8tPnR0eSk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogSW5pdGlhbGl6aW5nIFJhZGlvLlxuIiwKKwkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwlSZXNldFJhZGlvKHN0cmlwX2luZm8pOworCXN0cmlwX2luZm8tPmlkbGVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxICogSFo7CisJYWRkX3RpbWVyKCZzdHJpcF9pbmZvLT5pZGxlX3RpbWVyKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogQ2xvc2UgdGhlIGxvdy1sZXZlbCBwYXJ0IG9mIHRoZSBTVFJJUCBjaGFubmVsLiBFYXN5IQorICovCisKK3N0YXRpYyBpbnQgc3RyaXBfY2xvc2VfbG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChzdHJpcF9pbmZvLT50dHkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQlVTWTsKKwlzdHJpcF9pbmZvLT50dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qCisJICogRnJlZSBhbGwgU1RSSVAgZnJhbWUgYnVmZmVycy4KKwkgKi8KKwlpZiAoc3RyaXBfaW5mby0+cnhfYnVmZikgeworCQlrZnJlZShzdHJpcF9pbmZvLT5yeF9idWZmKTsKKwkJc3RyaXBfaW5mby0+cnhfYnVmZiA9IE5VTEw7CisJfQorCWlmIChzdHJpcF9pbmZvLT5zeF9idWZmKSB7CisJCWtmcmVlKHN0cmlwX2luZm8tPnN4X2J1ZmYpOworCQlzdHJpcF9pbmZvLT5zeF9idWZmID0gTlVMTDsKKwl9CisJaWYgKHN0cmlwX2luZm8tPnR4X2J1ZmYpIHsKKwkJa2ZyZWUoc3RyaXBfaW5mby0+dHhfYnVmZik7CisJCXN0cmlwX2luZm8tPnR4X2J1ZmYgPSBOVUxMOworCX0KKwlkZWxfdGltZXIoJnN0cmlwX2luZm8tPmlkbGVfdGltZXIpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBEREkgd2hlbiB0aGUKKyAqIChkeW5hbWljYWxseSBhc3NpZ25lZCkgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAqLworCitzdGF0aWMgdm9pZCBzdHJpcF9kZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKgorCSAqIEZpbmlzaCBzZXR0aW5nIHVwIHRoZSBERVZJQ0UgaW5mby4KKwkgKi8KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSAwOworCWRldi0+bGFzdF9yeCA9IDA7CisJZGV2LT50eF9xdWV1ZV9sZW4gPSAzMDsJLyogRHJvcCBhZnRlciAzMCBmcmFtZXMgcXVldWVkICovCisKKwlkZXYtPmZsYWdzID0gMDsKKwlkZXYtPm10dSA9IERFRkFVTFRfU1RSSVBfTVRVOworCWRldi0+dHlwZSA9IEFSUEhSRF9NRVRSSUNPTTsJLyogZHRhbmcgKi8KKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IHNpemVvZihTVFJJUF9IZWFkZXIpOworCS8qCisJICogIGRldi0+cHJpdiAgICAgICAgICAgICBBbHJlYWR5IGhvbGRzIGEgcG9pbnRlciB0byBvdXIgc3RydWN0IHN0cmlwCisJICovCisKKwkqKE1ldHJpY29tQWRkcmVzcyAqKSAmIGRldi0+YnJvYWRjYXN0ID0gYnJvYWRjYXN0X2FkZHJlc3M7CisJZGV2LT5kZXZfYWRkclswXSA9IDA7CisJZGV2LT5hZGRyX2xlbiA9IHNpemVvZihNZXRyaWNvbUFkZHJlc3MpOworCisJLyoKKwkgKiBQb2ludGVycyB0byBpbnRlcmZhY2Ugc2VydmljZSByb3V0aW5lcy4KKwkgKi8KKworCWRldi0+b3BlbiA9IHN0cmlwX29wZW5fbG93OworCWRldi0+c3RvcCA9IHN0cmlwX2Nsb3NlX2xvdzsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHN0cmlwX3htaXQ7CisJZGV2LT5oYXJkX2hlYWRlciA9IHN0cmlwX2hlYWRlcjsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyID0gc3RyaXBfcmVidWlsZF9oZWFkZXI7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBzdHJpcF9zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5nZXRfc3RhdHMgPSBzdHJpcF9nZXRfc3RhdHM7CisJZGV2LT5jaGFuZ2VfbXR1ID0gc3RyaXBfY2hhbmdlX210dTsKK30KKworLyoKKyAqIEZyZWUgYSBTVFJJUCBjaGFubmVsLgorICovCisKK3N0YXRpYyB2b2lkIHN0cmlwX2ZyZWUoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvKQoreworCXNwaW5fbG9ja19iaCgmc3RyaXBfbG9jayk7CisJbGlzdF9kZWxfcmN1KCZzdHJpcF9pbmZvLT5saXN0KTsKKwlzcGluX3VubG9ja19iaCgmc3RyaXBfbG9jayk7CisKKwlzdHJpcF9pbmZvLT5tYWdpYyA9IDA7CisKKwlmcmVlX25ldGRldihzdHJpcF9pbmZvLT5kZXYpOworfQorCisKKy8qCisgKiBBbGxvY2F0ZSBhIG5ldyBmcmVlIFNUUklQIGNoYW5uZWwKKyAqLworc3RhdGljIHN0cnVjdCBzdHJpcCAqc3RyaXBfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvOworCisJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3Qgc3RyaXApLCAic3QlZCIsCisJCQkgICBzdHJpcF9kZXZfc2V0dXApOworCisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOwkvKiBJZiBubyBtb3JlIG1lbW9yeSwgcmV0dXJuICovCisKKworCXN0cmlwX2luZm8gPSBkZXYtPnByaXY7CisJc3RyaXBfaW5mby0+ZGV2ID0gZGV2OworCisJc3RyaXBfaW5mby0+bWFnaWMgPSBTVFJJUF9NQUdJQzsKKwlzdHJpcF9pbmZvLT50dHkgPSBOVUxMOworCisJc3RyaXBfaW5mby0+Z3JhdHVpdG91c19hcnAgPSBqaWZmaWVzICsgTG9uZ1RpbWU7CisJc3RyaXBfaW5mby0+YXJwX2ludGVydmFsID0gMDsKKwlpbml0X3RpbWVyKCZzdHJpcF9pbmZvLT5pZGxlX3RpbWVyKTsKKwlzdHJpcF9pbmZvLT5pZGxlX3RpbWVyLmRhdGEgPSAobG9uZykgZGV2OworCXN0cmlwX2luZm8tPmlkbGVfdGltZXIuZnVuY3Rpb24gPSBzdHJpcF9JZGxlVGFzazsKKworCisJc3Bpbl9sb2NrX2JoKCZzdHJpcF9sb2NrKTsKKyByZXNjYW46CisJLyoKKwkgKiBTZWFyY2ggdGhlIGxpc3QgdG8gZmluZCB3aGVyZSB0byBwdXQgb3VyIG5ldyBlbnRyeQorCSAqIChhbmQgaW4gdGhlIHByb2Nlc3MgZGVjaWRlIHdoYXQgY2hhbm5lbCBudW1iZXIgaXQgaXMKKwkgKiBnb2luZyB0byBiZSkKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoKG4sICZzdHJpcF9saXN0KSB7CisJCXN0cnVjdCBzdHJpcCAqcyA9IGhsaXN0X2VudHJ5KG4sIHN0cnVjdCBzdHJpcCwgbGlzdCk7CisKKwkJaWYgKHMtPmRldi0+YmFzZV9hZGRyID09IGRldi0+YmFzZV9hZGRyKSB7CisJCQkrK2Rldi0+YmFzZV9hZGRyOworCQkJZ290byByZXNjYW47CisJCX0KKwl9CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgInN0JWxkIiwgZGV2LT5iYXNlX2FkZHIpOworCisJbGlzdF9hZGRfdGFpbF9yY3UoJnN0cmlwX2luZm8tPmxpc3QsICZzdHJpcF9saXN0KTsKKwlzcGluX3VubG9ja19iaCgmc3RyaXBfbG9jayk7CisKKwlyZXR1cm4gc3RyaXBfaW5mbzsKK30KKworLyoKKyAqIE9wZW4gdGhlIGhpZ2gtbGV2ZWwgcGFydCBvZiB0aGUgU1RSSVAgY2hhbm5lbC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBUVFkgbW9kdWxlIHdoZW4gdGhlCisgKiBTVFJJUCBsaW5lIGRpc2NpcGxpbmUgaXMgY2FsbGVkIGZvci4gIEJlY2F1c2Ugd2UgYXJlCisgKiBzdXJlIHRoZSB0dHkgbGluZSBleGlzdHMsIHdlIG9ubHkgaGF2ZSB0byBsaW5rIGl0IHRvCisgKiBhIGZyZWUgU1RSSVAgY2hhbm5lbC4uLgorICovCisKK3N0YXRpYyBpbnQgc3RyaXBfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IChzdHJ1Y3Qgc3RyaXAgKikgdHR5LT5kaXNjX2RhdGE7CisKKwkvKgorCSAqIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBub3QgYWxyZWFkeSBjb25uZWN0ZWQuCisJICovCisKKwlpZiAoc3RyaXBfaW5mbyAmJiBzdHJpcF9pbmZvLT5tYWdpYyA9PSBTVFJJUF9NQUdJQykKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwkvKgorCSAqIE9LLiAgRmluZCBhIGZyZWUgU1RSSVAgY2hhbm5lbCB0byB1c2UuCisJICovCisJaWYgKChzdHJpcF9pbmZvID0gc3RyaXBfYWxsb2MoKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTkZJTEU7CisKKwkvKgorCSAqIFJlZ2lzdGVyIG91ciBuZXdseSBjcmVhdGVkIGRldmljZSBzbyBpdCBjYW4gYmUgaWZjb25maWcnZAorCSAqIHN0cmlwX2Rldl9pbml0KCkgd2lsbCBiZSBjYWxsZWQgYXMgYSBzaWRlLWVmZmVjdAorCSAqLworCisJaWYgKHJlZ2lzdGVyX25ldGRldihzdHJpcF9pbmZvLT5kZXYpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzdHJpcDogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkLlxuIik7CisJCXN0cmlwX2ZyZWUoc3RyaXBfaW5mbyk7CisJCXJldHVybiAtRU5GSUxFOworCX0KKworCXN0cmlwX2luZm8tPnR0eSA9IHR0eTsKKwl0dHktPmRpc2NfZGF0YSA9IHN0cmlwX2luZm87CisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKworCS8qCisJICogUmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzCisJICovCisKKwlzdHJpcF9pbmZvLT5kZXYtPnR5cGUgPSBBUlBIUkRfTUVUUklDT007CS8qIGR0YW5nICovCisKKwkvKgorCSAqIFNldCB0dHkgb3B0aW9ucworCSAqLworCisJdHR5LT50ZXJtaW9zLT5jX2lmbGFnIHw9IElHTkJSSyB8IElHTlBBUjsJLyogSWdub3JlIGJyZWFrcyBhbmQgcGFyaXR5IGVycm9ycy4gKi8KKwl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgfD0gQ0xPQ0FMOwkvKiBJZ25vcmUgbW9kZW0gY29udHJvbCBzaWduYWxzLiAqLworCXR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+SFVQQ0w7CS8qIERvbid0IGNsb3NlIG9uIGh1cCAqLworCisJcHJpbnRrKEtFUk5fSU5GTyAiU1RSSVA6IGRldmljZSBcIiVzXCIgYWN0aXZhdGVkXG4iLAorCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCisJLyoKKwkgKiBEb25lLiAgV2UgaGF2ZSBsaW5rZWQgdGhlIFRUWSBsaW5lIHRvIGEgY2hhbm5lbC4KKwkgKi8KKwlyZXR1cm4gKHN0cmlwX2luZm8tPmRldi0+YmFzZV9hZGRyKTsKK30KKworLyoKKyAqIENsb3NlIGRvd24gYSBTVFJJUCBjaGFubmVsLgorICogVGhpcyBtZWFucyBmbHVzaGluZyBvdXQgYW55IHBlbmRpbmcgcXVldWVzLCBhbmQgdGhlbiByZXN0b3JpbmcgdGhlCisgKiBUVFkgbGluZSBkaXNjaXBsaW5lIHRvIHdoYXQgaXQgd2FzIGJlZm9yZSBpdCBnb3QgaG9va2VkIHRvIFNUUklQCisgKiAod2hpY2ggdXN1YWxseSBpcyBUVFkgYWdhaW4pLgorICovCisKK3N0YXRpYyB2b2lkIHN0cmlwX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvID0gKHN0cnVjdCBzdHJpcCAqKSB0dHktPmRpc2NfZGF0YTsKKworCS8qCisJICogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIGNvbm5lY3RlZC4KKwkgKi8KKworCWlmICghc3RyaXBfaW5mbyB8fCBzdHJpcF9pbmZvLT5tYWdpYyAhPSBTVFJJUF9NQUdJQykKKwkJcmV0dXJuOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoc3RyaXBfaW5mby0+ZGV2KTsKKworCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKKwlzdHJpcF9pbmZvLT50dHkgPSBOVUxMOworCXByaW50ayhLRVJOX0lORk8gIlNUUklQOiBkZXZpY2UgXCIlc1wiIGNsb3NlZCBkb3duXG4iLAorCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCXN0cmlwX2ZyZWUoc3RyaXBfaW5mbyk7CisJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQZXJmb3JtIEkvTyBjb250cm9sIGNhbGxzIG9uIGFuIGFjdGl2ZSBTVFJJUCBjaGFubmVsLgkJKi8KKworc3RhdGljIGludCBzdHJpcF9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IChzdHJ1Y3Qgc3RyaXAgKikgdHR5LT5kaXNjX2RhdGE7CisKKwkvKgorCSAqIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuCisJICovCisKKwlpZiAoIXN0cmlwX2luZm8gfHwgc3RyaXBfaW5mby0+bWFnaWMgIT0gU1RSSVBfTUFHSUMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHSUZOQU1FOgorCQlpZihjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopIGFyZywgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBzdHJsZW4oc3RyaXBfaW5mby0+ZGV2LT5uYW1lKSArIDEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NJRkhXQUREUjoKKwl7CisJCU1ldHJpY29tQWRkcmVzcyBhZGRyOworCQkvL3ByaW50ayhLRVJOX0lORk8gIiVzOiBTSU9DU0lGSFdBRERSXG4iLCBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCQlpZihjb3B5X2Zyb21fdXNlcigmYWRkciwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKE1ldHJpY29tQWRkcmVzcykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBzZXRfbWFjX2FkZHJlc3Moc3RyaXBfaW5mbywgJmFkZHIpOworCX0KKwkvKgorCSAqIEFsbG93IHN0dHkgdG8gcmVhZCwgYnV0IG5vdCBzZXQsIHRoZSBzZXJpYWwgcG9ydAorCSAqLworCisJY2FzZSBUQ0dFVFM6CisJY2FzZSBUQ0dFVEE6CisJCXJldHVybiBuX3R0eV9pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbml0aWFsaXphdGlvbgkJCQkJCQkqLworCitzdGF0aWMgc3RydWN0IHR0eV9sZGlzYyBzdHJpcF9sZGlzYyA9IHsKKwkubWFnaWMgPSBUVFlfTERJU0NfTUFHSUMsCisJLm5hbWUgPSAic3RyaXAiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gc3RyaXBfb3BlbiwKKwkuY2xvc2UgPSBzdHJpcF9jbG9zZSwKKwkuaW9jdGwgPSBzdHJpcF9pb2N0bCwKKwkucmVjZWl2ZV9idWYgPSBzdHJpcF9yZWNlaXZlX2J1ZiwKKwkucmVjZWl2ZV9yb29tID0gc3RyaXBfcmVjZWl2ZV9yb29tLAorCS53cml0ZV93YWtldXAgPSBzdHJpcF93cml0ZV9zb21lX21vcmUsCit9OworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgU1RSSVAgZHJpdmVyLgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhdCBib290IHRpbWUsIHRvIGJvb3RzdHJhcCB0aGUgbXVsdGktY2hhbm5lbAorICogU1RSSVAgZHJpdmVyCisgKi8KKworc3RhdGljIGNoYXIgc2lnbm9uW10gX19pbml0ZGF0YSA9CisgICAgS0VSTl9JTkZPICJTVFJJUDogVmVyc2lvbiAlcyAodW5saW1pdGVkIGNoYW5uZWxzKVxuIjsKKworc3RhdGljIGludCBfX2luaXQgc3RyaXBfaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCisJcHJpbnRrKHNpZ25vbiwgU3RyaXBWZXJzaW9uKTsKKworCQorCS8qCisJICogRmlsbCBpbiBvdXIgbGluZSBwcm90b2NvbCBkaXNjaXBsaW5lLCBhbmQgcmVnaXN0ZXIgaXQKKwkgKi8KKwlpZiAoKHN0YXR1cyA9IHR0eV9yZWdpc3Rlcl9sZGlzYyhOX1NUUklQLCAmc3RyaXBfbGRpc2MpKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJTVFJJUDogY2FuJ3QgcmVnaXN0ZXIgbGluZSBkaXNjaXBsaW5lIChlcnIgPSAlZClcbiIsCisJCSAgICAgICBzdGF0dXMpOworCisJLyoKKwkgKiBSZWdpc3RlciB0aGUgc3RhdHVzIGZpbGUgd2l0aCAvcHJvYworCSAqLworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJzdHJpcCIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmc3RyaXBfc2VxX2ZvcHMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworbW9kdWxlX2luaXQoc3RyaXBfaW5pdF9kcml2ZXIpOworCitzdGF0aWMgY29uc3QgY2hhciBzaWdub2ZmW10gX19leGl0ZGF0YSA9CisgICAgS0VSTl9JTkZPICJTVFJJUDogTW9kdWxlIFVubG9hZGVkXG4iOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc3RyaXBfZXhpdF9kcml2ZXIodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCpuOworCisJLyogbW9kdWxlIHJlZiBjb3VudCBydWxlcyBhc3N1cmUgdGhhdCBhbGwgZW50cmllcyBhcmUgdW5yZWdpc3RlcmVkICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZzdHJpcF9saXN0KSB7CisJCXN0cnVjdCBzdHJpcCAqcyA9IGxpc3RfZW50cnkocCwgc3RydWN0IHN0cmlwLCBsaXN0KTsKKwkJc3RyaXBfZnJlZShzKTsKKwl9CisKKwkvKiBVbnJlZ2lzdGVyIHdpdGggdGhlIC9wcm9jL25ldCBmaWxlIGhlcmUuICovCisJcHJvY19uZXRfcmVtb3ZlKCJzdHJpcCIpOworCisJaWYgKChpID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fU1RSSVAsIE5VTEwpKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJTVFJJUDogY2FuJ3QgdW5yZWdpc3RlciBsaW5lIGRpc2NpcGxpbmUgKGVyciA9ICVkKVxuIiwgaSk7CisKKwlwcmludGsoc2lnbm9mZik7Cit9CisKK21vZHVsZV9leGl0KHN0cmlwX2V4aXRfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiU3R1YXJ0IENoZXNoaXJlIDxjaGVzaGlyZUBjcy5zdGFuZm9yZC5lZHU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN0YXJtb2RlIFJhZGlvIElQIChTVFJJUCkgRGV2aWNlIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworCitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiU3Rhcm1vZGUgUmFkaW8gSVAgKFNUUklQKSBtb2RlbSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdG9kby50eHQgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90b2RvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjIzNDAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdG9kby50eHQKQEAgLTAsMCArMSwxNSBAQAorCVdpcmVsZXNzIFRvZG8KKwktLS0tLS0tLS0tLS0tCisKKzEpIEJyaW5nIG90aGVyIGtlcm5lbCBXaXJlbGVzcyBMQU4gZHJpdmVycyBoZXJlCisJQ29tcGxldGVkCisKKzIpIEJyaW5nIG5ldyBXaXJlbGVzcyBMQU4gZHJpdmVyIG5vdCB5ZXQgaW4gdGhlIGtlcm5lbCB0aGVyZQorCVNlZSBteSB3ZWIgcGFnZSBmb3IgZGV0YWlscworCUluIHBhcnRpY3VsYXIgOiBIb3N0QVAKKworMykgTWlzYworCW8gTWFyayB3YXZlbGFuLCB3YXZlbGFuX2NzLCBuZXR3YXZlX2NzIGRyaXZlcnMgYXMgb2Jzb2xldGUKKwlvIE1heWJlIGFybGFuLmMsIHJheV9jcy5jIGFuZCBzdHJpcC5jIGFsc28gZGVzZXJ2ZSB0byBiZSBvYnNvbGV0ZQorCisJSmVhbiBJSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNWUyMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmMKQEAgLTAsMCArMSw0NDUyIEBACisvKgorICoJV2F2ZUxBTiBJU0EgZHJpdmVyCisgKgorICoJCUplYW4gSUkgLSBIUExCICc5NgorICoKKyAqIFJlb3JnYW5pc2F0aW9uIGFuZCBleHRlbnNpb24gb2YgdGhlIGRyaXZlci4KKyAqIE9yaWdpbmFsIGNvcHlyaWdodCBmb2xsb3dzIChhbHNvIHNlZSB0aGUgZW5kIG9mIHRoaXMgZmlsZSkuCisgKiBTZWUgd2F2ZWxhbi5wLmggZm9yIGRldGFpbHMuCisgKgorICoKKyAqCisgKiBBVCZUIEdJUyAobmVlIE5DUikgV2F2ZUxBTiBjYXJkOgorICoJQW4gRXRoZXJuZXQtbGlrZSByYWRpbyB0cmFuc2NlaXZlcgorICoJY29udHJvbGxlZCBieSBhbiBJbnRlbCA4MjU4NiBjb3Byb2Nlc3Nvci4KKyAqLworCisjaW5jbHVkZSAid2F2ZWxhbi5wLmgiCQkvKiBQcml2YXRlIGhlYWRlciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNSVNDIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFN1YnJvdXRpbmVzIHdoaWNoIHdvbid0IGZpdCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXRlZ29yeQorICogKFdhdmVMQU4gbW9kZW0gb3IgaTgyNTg2KQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUcmFuc2xhdGUgaXJxIG51bWJlciB0byBQU0EgaXJxIHBhcmFtZXRlcgorICovCitzdGF0aWMgdTggd3ZfaXJxX3RvX3BzYShpbnQgaXJxKQoreworCWlmIChpcnEgPCAwIHx8IGlycSA+PSBORUxTKGlycXZhbHMpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBpcnF2YWxzW2lycV07Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUcmFuc2xhdGUgUFNBIGlycSBwYXJhbWV0ZXIgdG8gaXJxIG51bWJlciAKKyAqLworc3RhdGljIGludCBfX2luaXQgd3ZfcHNhX3RvX2lycSh1OCBpcnF2YWwpCit7CisJaW50IGlycTsKKworCWZvciAoaXJxID0gMDsgaXJxIDwgTkVMUyhpcnF2YWxzKTsgaXJxKyspCisJCWlmIChpcnF2YWxzW2lycV0gPT0gaXJxdmFsKQorCQkJcmV0dXJuIGlycTsKKworCXJldHVybiAtMTsKK30KKworI2lmZGVmIFNUUlVDVF9DSEVDSworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNhbml0eSByb3V0aW5lIHRvIHZlcmlmeSB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgV2F2ZUxBTiBpbnRlcmZhY2UKKyAqIHN0cnVjdHVyZXMuCisgKi8KK3N0YXRpYyBjaGFyICp3dl9zdHJ1Y3RfY2hlY2sodm9pZCkKK3sKKyNkZWZpbmUJU0ModCxzLG4pCWlmIChzaXplb2YodCkgIT0gcykgcmV0dXJuKG4pOworCisJU0MocHNhX3QsIFBTQV9TSVpFLCAicHNhX3QiKTsKKwlTQyhtbXdfdCwgTU1XX1NJWkUsICJtbXdfdCIpOworCVNDKG1tcl90LCBNTVJfU0laRSwgIm1tcl90Iik7CisJU0MoaGFfdCwgSEFfU0laRSwgImhhX3QiKTsKKworI3VuZGVmCVNDCisKKwlyZXR1cm4gKChjaGFyICopIE5VTEwpOworfQkJCQkvKiB3dl9zdHJ1Y3RfY2hlY2sgKi8KKyNlbmRpZgkJCQkvKiBTVFJVQ1RfQ0hFQ0sgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiBIT1NUIEFEQVBURVIgU1VCUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFVzZWZ1bCBzdWJyb3V0aW5lcyB0byBtYW5hZ2UgdGhlIFdhdmVMQU4gSVNBIGludGVyZmFjZQorICoKKyAqIE9uZSBtYWpvciBkaWZmZXJlbmNlIHdpdGggdGhlIFBDTUNJQSBoYXJkd2FyZSAoZXhjZXB0IHRoZSBwb3J0IG1hcHBpbmcpCisgKiBpcyB0aGF0IHdlIGhhdmUgdG8ga2VlcCB0aGUgc3RhdGUgb2YgdGhlIEhvc3QgQ29udHJvbCBSZWdpc3RlcgorICogYmVjYXVzZSBvZiB0aGUgaW50ZXJydXB0IGVuYWJsZSAmIGJ1cyBzaXplIGZsYWdzLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWFkIGZyb20gY2FyZCdzIEhvc3QgQWRhcHRvciBTdGF0dXMgUmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTE2IGhhc3JfcmVhZCh1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwlyZXR1cm4gKGludyhIQVNSKGlvYWRkcikpKTsKK30JCQkJLyogaGFzcl9yZWFkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSB0byBjYXJkJ3MgSG9zdCBBZGFwdGVyIENvbW1hbmQgUmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoYWNyX3dyaXRlKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MTYgaGFjcikKK3sKKwlvdXR3KGhhY3IsIEhBQ1IoaW9hZGRyKSk7Cit9CQkJCS8qIGhhY3Jfd3JpdGUgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIHRvIGNhcmQncyBIb3N0IEFkYXB0ZXIgQ29tbWFuZCBSZWdpc3Rlci4gSW5jbHVkZSBhIGRlbGF5IGZvcgorICogdGhvc2UgdGltZXMgd2hlbiBpdCBpcyBuZWVkZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoYWNyX3dyaXRlX3Nsb3codW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBoYWNyKQoreworCWhhY3Jfd3JpdGUoaW9hZGRyLCBoYWNyKTsKKwkvKiBkZWxheSBtaWdodCBvbmx5IGJlIG5lZWRlZCBzb21ldGltZXMgKi8KKwltZGVsYXkoMSk7Cit9CQkJCS8qIGhhY3Jfd3JpdGVfc2xvdyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU2V0IHRoZSBjaGFubmVsIGF0dGVudGlvbiBiaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY2hhbl9hdHRuKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MTYgaGFjcikKK3sKKwloYWNyX3dyaXRlKGlvYWRkciwgaGFjciB8IEhBQ1JfQ0EpOworfQkJCQkvKiBzZXRfY2hhbl9hdHRuICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZXNldCwgYW5kIHRoZW4gc2V0IGhvc3QgYWRhcHRvciBpbnRvIGRlZmF1bHQgbW9kZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHd2X2hhY3JfcmVzZXQodW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CisJaGFjcl93cml0ZV9zbG93KGlvYWRkciwgSEFDUl9SRVNFVCk7CisJaGFjcl93cml0ZShpb2FkZHIsIEhBQ1JfREVGQVVMVCk7Cit9CQkJCS8qIHd2X2hhY3JfcmVzZXQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNldCB0aGUgSS9PIHRyYW5zZmVyIG92ZXIgdGhlIElTQSBidXMgdG8gOC1iaXQgbW9kZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfMTZfb2ZmKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MTYgaGFjcikKK3sKKwloYWNyICY9IH5IQUNSXzE2QklUUzsKKwloYWNyX3dyaXRlKGlvYWRkciwgaGFjcik7Cit9CQkJCS8qIHd2XzE2X29mZiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU2V0IHRoZSBJL08gdHJhbnNmZXIgb3ZlciB0aGUgSVNBIGJ1cyB0byA4LWJpdCBtb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3dl8xNl9vbih1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IpCit7CisJaGFjciB8PSBIQUNSXzE2QklUUzsKKwloYWNyX3dyaXRlKGlvYWRkciwgaGFjcik7Cit9CQkJCS8qIHd2XzE2X29uICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBEaXNhYmxlIGludGVycnVwdHMgb24gdGhlIFdhdmVMQU4gaGFyZHdhcmUuCisgKiAoY2FsbGVkIGJ5IHd2XzgyNTg2X3N0b3AoKSkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHd2X2ludHNfb2ZmKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCQorCWxwLT5oYWNyICY9IH5IQUNSX0lOVFJPTjsKKwloYWNyX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IpOworfQkJCQkvKiB3dl9pbnRzX29mZiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRW5hYmxlIGludGVycnVwdHMgb24gdGhlIFdhdmVMQU4gaGFyZHdhcmUuCisgKiAoY2FsbGVkIGJ5IHd2X2h3X3Jlc2V0KCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3dl9pbnRzX29uKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJbHAtPmhhY3IgfD0gSEFDUl9JTlRST047CisJaGFjcl93cml0ZShpb2FkZHIsIGxwLT5oYWNyKTsKK30JCQkJLyogd3ZfaW50c19vbiAqLworCisvKioqKioqKioqKioqKioqKioqKiBNT0RFTSBNQU5BR0VNRU5UIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKiovCisvKgorICogVXNlZnVsIHN1YnJvdXRpbmVzIHRvIG1hbmFnZSB0aGUgbW9kZW0gb2YgdGhlIFdhdmVMQU4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCB0aGUgUGFyYW1ldGVyIFN0b3JhZ2UgQXJlYSBmcm9tIHRoZSBXYXZlTEFOIGNhcmQncyBtZW1vcnkKKyAqLworLyoKKyAqIFJlYWQgYnl0ZXMgZnJvbSB0aGUgUFNBLgorICovCitzdGF0aWMgdm9pZCBwc2FfcmVhZCh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IsIGludCBvLAkvKiBvZmZzZXQgaW4gUFNBICovCisJCSAgICAgdTggKiBiLAkvKiBidWZmZXIgdG8gZmlsbCAqLworCQkgICAgIGludCBuKQorewkJCQkvKiBzaXplIHRvIHJlYWQgKi8KKwl3dl8xNl9vZmYoaW9hZGRyLCBoYWNyKTsKKworCXdoaWxlIChuLS0gPiAwKSB7CisJCW91dHcobywgUElPUjIoaW9hZGRyKSk7CisJCW8rKzsKKwkJKmIrKyA9IGluYihQSU9QMihpb2FkZHIpKTsKKwl9CisKKwl3dl8xNl9vbihpb2FkZHIsIGhhY3IpOworfQkJCQkvKiBwc2FfcmVhZCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV3JpdGUgdGhlIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgdG8gdGhlIFdhdmVMQU4gY2FyZCdzIG1lbW9yeS4KKyAqLworc3RhdGljIHZvaWQgcHNhX3dyaXRlKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MTYgaGFjciwgaW50IG8sCS8qIE9mZnNldCBpbiBQU0EgKi8KKwkJICAgICAgdTggKiBiLAkvKiBCdWZmZXIgaW4gbWVtb3J5ICovCisJCSAgICAgIGludCBuKQorewkJCQkvKiBMZW5ndGggb2YgYnVmZmVyICovCisJaW50IGNvdW50ID0gMDsKKworCXd2XzE2X29mZihpb2FkZHIsIGhhY3IpOworCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJb3V0dyhvLCBQSU9SMihpb2FkZHIpKTsKKwkJbysrOworCisJCW91dGIoKmIsIFBJT1AyKGlvYWRkcikpOworCQliKys7CisKKwkJLyogV2FpdCBmb3IgdGhlIG1lbW9yeSB0byBmaW5pc2ggaXRzIHdyaXRlIGN5Y2xlICovCisJCWNvdW50ID0gMDsKKwkJd2hpbGUgKChjb3VudCsrIDwgMTAwKSAmJgorCQkgICAgICAgKGhhc3JfcmVhZChpb2FkZHIpICYgSEFTUl9QU0FfQlVTWSkpIG1kZWxheSgxKTsKKwl9CisKKwl3dl8xNl9vbihpb2FkZHIsIGhhY3IpOworfQkJCQkvKiBwc2Ffd3JpdGUgKi8KKworI2lmZGVmIFNFVF9QU0FfQ1JDCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ2FsY3VsYXRlIHRoZSBQU0EgQ1JDCisgKiBUaGFua3MgdG8gVmFsc3RlciwgTmljbyA8TlZBTFNURVJAd2NuZC5ubC5sdWNlbnQuY29tPiBmb3IgdGhlIGNvZGUKKyAqIE5PVEU6IEJ5IHNwZWNpZnlpbmcgYSBsZW5ndGggaW5jbHVkaW5nIHRoZSBDUkMgcG9zaXRpb24gdGhlCisgKiByZXR1cm5lZCB2YWx1ZSBzaG91bGQgYmUgemVyby4gKGkuZS4gYSBjb3JyZWN0IGNoZWNrc3VtIGluIHRoZSBQU0EpCisgKgorICogVGhlIFdpbmRvd3MgZHJpdmVycyBkb24ndCB1c2UgdGhlIENSQywgYnV0IHRoZSBBUCBhbmQgdGhlIFB0UCB0b29sCisgKiBkZXBlbmQgb24gaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTE2IHBzYV9jcmModTggKiBwc2EsCS8qIFRoZSBQU0EgKi8KKwkJCSAgICAgIGludCBzaXplKQorewkJCQkvKiBOdW1iZXIgb2Ygc2hvcnQgZm9yIENSQyAqLworCWludCBieXRlX2NudDsJCS8qIExvb3Agb24gdGhlIFBTQSAqLworCXUxNiBjcmNfYnl0ZXMgPSAwOwkvKiBEYXRhIGluIHRoZSBQU0EgKi8KKwlpbnQgYml0X2NudDsJCS8qIExvb3Agb24gdGhlIGJpdHMgb2YgdGhlIHNob3J0ICovCisKKwlmb3IgKGJ5dGVfY250ID0gMDsgYnl0ZV9jbnQgPCBzaXplOyBieXRlX2NudCsrKSB7CisJCWNyY19ieXRlcyBePSBwc2FbYnl0ZV9jbnRdOwkvKiBJdHMgYW4geG9yICovCisKKwkJZm9yIChiaXRfY250ID0gMTsgYml0X2NudCA8IDk7IGJpdF9jbnQrKykgeworCQkJaWYgKGNyY19ieXRlcyAmIDB4MDAwMSkKKwkJCQljcmNfYnl0ZXMgPSAoY3JjX2J5dGVzID4+IDEpIF4gMHhBMDAxOworCQkJZWxzZQorCQkJCWNyY19ieXRlcyA+Pj0gMTsKKwkJfQorCX0KKworCXJldHVybiBjcmNfYnl0ZXM7Cit9CQkJCS8qIHBzYV9jcmMgKi8KKyNlbmRpZgkJCQkvKiBTRVRfUFNBX0NSQyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogdXBkYXRlIHRoZSBjaGVja3N1bSBmaWVsZCBpbiB0aGUgV2F2ZWxhbidzIFBTQQorICovCitzdGF0aWMgdm9pZCB1cGRhdGVfcHNhX2NoZWNrc3VtKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IpCit7CisjaWZkZWYgU0VUX1BTQV9DUkMKKwlwc2FfdCBwc2E7CisJdTE2IGNyYzsKKworCS8qIHJlYWQgdGhlIHBhcmFtZXRlciBzdG9yYWdlIGFyZWEgKi8KKwlwc2FfcmVhZChpb2FkZHIsIGhhY3IsIDAsICh1bnNpZ25lZCBjaGFyICopICZwc2EsIHNpemVvZihwc2EpKTsKKworCS8qIHVwZGF0ZSB0aGUgY2hlY2tzdW0gKi8KKwljcmMgPSBwc2FfY3JjKCh1bnNpZ25lZCBjaGFyICopICZwc2EsCisJCSAgICAgIHNpemVvZihwc2EpIC0gc2l6ZW9mKHBzYS5wc2FfY3JjWzBdKSAtCisJCSAgICAgIHNpemVvZihwc2EucHNhX2NyY1sxXSkKKwkJICAgICAgLSBzaXplb2YocHNhLnBzYV9jcmNfc3RhdHVzKSk7CisKKwlwc2EucHNhX2NyY1swXSA9IGNyYyAmIDB4RkY7CisJcHNhLnBzYV9jcmNbMV0gPSAoY3JjICYgMHhGRjAwKSA+PiA4OworCisJLyogV3JpdGUgaXQgISAqLworCXBzYV93cml0ZShpb2FkZHIsIGhhY3IsIChjaGFyICopICZwc2EucHNhX2NyYyAtIChjaGFyICopICZwc2EsCisJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfY3JjLCAyKTsKKworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHVwZGF0ZV9wc2FfY2hlY2tzdW0oKTogY3JjID0gMHglMDJ4JTAyeFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBwc2EucHNhX2NyY1swXSwgcHNhLnBzYV9jcmNbMV0pOworCisJLyogQ2hlY2sgYWdhaW4gKGx1eHVyeSAhKSAqLworCWNyYyA9IHBzYV9jcmMoKHVuc2lnbmVkIGNoYXIgKikgJnBzYSwKKwkJICAgICAgc2l6ZW9mKHBzYSkgLSBzaXplb2YocHNhLnBzYV9jcmNfc3RhdHVzKSk7CisKKwlpZiAoY3JjICE9IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogdXBkYXRlX3BzYV9jaGVja3N1bSgpOiBDUkMgZG9lcyBub3QgYWdyZWUgd2l0aCBQU0EgZGF0YSAoZXZlbiBhZnRlciByZWNhbGN1bGF0aW5nKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYJCQkJLyogREVCVUdfSU9DVExfSU5GTyAqLworI2VuZGlmCQkJCS8qIFNFVF9QU0FfQ1JDICovCit9CQkJCS8qIHVwZGF0ZV9wc2FfY2hlY2tzdW0gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIDEgYnl0ZSB0byB0aGUgTU1DLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbW1jX291dCh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IG8sIHU4IGQpCit7CisJaW50IGNvdW50ID0gMDsKKworCS8qIFdhaXQgZm9yIE1NQyB0byBnbyBpZGxlICovCisJd2hpbGUgKChjb3VudCsrIDwgMTAwKSAmJiAoaW53KEhBU1IoaW9hZGRyKSkgJiBIQVNSX01NQ19CVVNZKSkKKwkJdWRlbGF5KDEwKTsKKworCW91dHcoKHUxNikgKCgodTE2KSBkIDw8IDgpIHwgKG8gPDwgMSkgfCAxKSwgTU1DUihpb2FkZHIpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJvdXRpbmUgdG8gd3JpdGUgYnl0ZXMgdG8gdGhlIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KKyAqIFdlIHN0YXJ0IGF0IHRoZSBlbmQgYmVjYXVzZSBpdCBpcyB0aGUgd2F5IGl0IHNob3VsZCBiZSEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1tY193cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTggbywgdTggKiBiLCBpbnQgbikKK3sKKwlvICs9IG47CisJYiArPSBuOworCisJd2hpbGUgKG4tLSA+IDApCisJCW1tY19vdXQoaW9hZGRyLCAtLW8sICooLS1iKSk7Cit9CQkJCS8qIG1tY193cml0ZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCBhIGJ5dGUgZnJvbSB0aGUgTU1DLgorICogT3B0aW1pc2VkIHZlcnNpb24gZm9yIDEgYnl0ZSwgYXZvaWQgdXNpbmcgbWVtb3J5LgorICovCitzdGF0aWMgaW5saW5lIHU4IG1tY19pbih1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IG8pCit7CisJaW50IGNvdW50ID0gMDsKKworCXdoaWxlICgoY291bnQrKyA8IDEwMCkgJiYgKGludyhIQVNSKGlvYWRkcikpICYgSEFTUl9NTUNfQlVTWSkpCisJCXVkZWxheSgxMCk7CisJb3V0dyhvIDw8IDEsIE1NQ1IoaW9hZGRyKSk7CisKKwl3aGlsZSAoKGNvdW50KysgPCAxMDApICYmIChpbncoSEFTUihpb2FkZHIpKSAmIEhBU1JfTU1DX0JVU1kpKQorCQl1ZGVsYXkoMTApOworCXJldHVybiAodTgpIChpbncoTU1DUihpb2FkZHIpKSA+PiA4KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJvdXRpbmUgdG8gcmVhZCBieXRlcyBmcm9tIHRoZSBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gaXMgY29tcGxpY2F0ZWQgYnkgYSBsYWNrIG9mIGFkZHJlc3MgbGluZXMsCisgKiB3aGljaCBwcmV2ZW50cyBkZWNvZGluZyBvZiB0aGUgbG93LW9yZGVyIGJpdC4KKyAqIChjb2RlIGhhcyBqdXN0IGJlZW4gbW92ZWQgaW4gdGhlIGFib3ZlIGZ1bmN0aW9uKQorICogV2Ugc3RhcnQgYXQgdGhlIGVuZCBiZWNhdXNlIGl0IGlzIHRoZSB3YXkgaXQgc2hvdWxkIGJlIQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbW1jX3JlYWQodW5zaWduZWQgbG9uZyBpb2FkZHIsIHU4IG8sIHU4ICogYiwgaW50IG4pCit7CisJbyArPSBuOworCWIgKz0gbjsKKworCXdoaWxlIChuLS0gPiAwKQorCQkqKC0tYikgPSBtbWNfaW4oaW9hZGRyLCAtLW8pOworfQkJCQkvKiBtbWNfcmVhZCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2V0IHRoZSB0eXBlIG9mIGVuY3J5cHRpb24gYXZhaWxhYmxlLgorICovCitzdGF0aWMgaW5saW5lIGludCBtbWNfZW5jcih1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sJCQkJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwlpbnQgdGVtcDsKKworCXRlbXAgPSBtbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2Rlc19hdmFpbCkpOworCWlmICgodGVtcCAhPSBNTVJfREVTX0FWQUlMX0RFUykgJiYgKHRlbXAgIT0gTU1SX0RFU19BVkFJTF9BRVMpKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiB0ZW1wOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2FpdCBmb3IgdGhlIGZyZXF1ZW5jeSBFRVBST00gdG8gY29tcGxldGUgYSBjb21tYW5kLgorICogSSBob3BlIHRoaXMgb25lIHdpbGwgYmUgb3B0aW1hbGx5IGlubGluZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmZWVfd2FpdCh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkJCSAgICBpbnQgZGVsYXksCS8qIEJhc2UgZGVsYXkgdG8gd2FpdCBmb3IgKi8KKwkJCSAgICBpbnQgbnVtYmVyKQorewkJCQkvKiBOdW1iZXIgb2YgdGltZSB0byB3YWl0ICovCisJaW50IGNvdW50ID0gMDsJCS8qIFdhaXQgb25seSBhIGxpbWl0ZWQgdGltZSAqLworCisJd2hpbGUgKChjb3VudCsrIDwgbnVtYmVyKSAmJgorCSAgICAgICAobW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCQlNTVJfRkVFX1NUQVRVU19CVVNZKSkgdWRlbGF5KGRlbGF5KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgYnl0ZXMgZnJvbSB0aGUgRnJlcXVlbmN5IEVFUFJPTSAoZnJlcXVlbmN5IHNlbGVjdCBjYXJkcykuCisgKi8KK3N0YXRpYyB2b2lkIGZlZV9yZWFkKHVuc2lnbmVkIGxvbmcgaW9hZGRyLAkvKiBJL08gcG9ydCBvZiB0aGUgY2FyZCAqLworCQkgICAgIHUxNiBvLAkvKiBkZXN0aW5hdGlvbiBvZmZzZXQgKi8KKwkJICAgICB1MTYgKiBiLAkvKiBkYXRhIGJ1ZmZlciAqLworCQkgICAgIGludCBuKQorewkJCQkvKiBudW1iZXIgb2YgcmVnaXN0ZXJzICovCisJYiArPSBuOwkJCS8qIFBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGFyZWEgKi8KKworCS8qIFdyaXRlIHRoZSBhZGRyZXNzICovCisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCBvICsgbiAtIDEpOworCisJLyogTG9vcCBvbiBhbGwgYnVmZmVyICovCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJLyogV3JpdGUgdGhlIHJlYWQgY29tbWFuZCAqLworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksCisJCQlNTVdfRkVFX0NUUkxfUkVBRCk7CisKKwkJLyogV2FpdCB1bnRpbCBFRVBST00gaXMgcmVhZHkgKHNob3VsZCBiZSBxdWljaykuICovCisJCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisKKwkJLyogUmVhZCB0aGUgdmFsdWUuICovCisJCSotLWIgPSAoKG1tY19pbihpb2FkZHIsIG1tcm9mZigwLCBtbXJfZmVlX2RhdGFfaCkpIDw8IDgpIHwKKwkJCW1tY19pbihpb2FkZHIsIG1tcm9mZigwLCBtbXJfZmVlX2RhdGFfbCkpKTsKKwl9Cit9CisKKyNpZmRlZiBXSVJFTEVTU19FWFQJCS8qIGlmIHRoZSB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3RzIGluIHRoZSBrZXJuZWwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIGJ5dGVzIGZyb20gdGhlIEZyZXF1ZW5jeSBFRVBST00gKGZyZXF1ZW5jeSBzZWxlY3QgY2FyZHMpLgorICogVGhpcyBpcyBhIGJpdCBjb21wbGljYXRlZCwgYmVjYXVzZSB0aGUgZnJlcXVlbmN5IEVFUFJPTSBoYXMgdG8KKyAqIGJlIHVucHJvdGVjdGVkIGFuZCB0aGUgd3JpdGUgZW5hYmxlZC4KKyAqIEplYW4gSUkKKyAqLworc3RhdGljIHZvaWQgZmVlX3dyaXRlKHVuc2lnbmVkIGxvbmcgaW9hZGRyLAkvKiBJL08gcG9ydCBvZiB0aGUgY2FyZCAqLworCQkgICAgICB1MTYgbywJLyogZGVzdGluYXRpb24gb2Zmc2V0ICovCisJCSAgICAgIHUxNiAqIGIsCS8qIGRhdGEgYnVmZmVyICovCisJCSAgICAgIGludCBuKQorewkJCQkvKiBudW1iZXIgb2YgcmVnaXN0ZXJzICovCisJYiArPSBuOwkJCS8qIFBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGFyZWEuICovCisKKyNpZmRlZiBFRVBST01fSVNfUFJPVEVDVEVECS8qIGRpc2FibGVkICovCisjaWZkZWYgRE9FU05UX1NFRU1fVE9fV09SSwkvKiBkaXNhYmxlZCAqLworCS8qIEFzayB0byByZWFkIHRoZSBwcm90ZWN0ZWQgcmVnaXN0ZXIgKi8KKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9QUlJFQUQpOworCisJZmVlX3dhaXQoaW9hZGRyLCAxMCwgMTAwKTsKKworCS8qIFJlYWQgdGhlIHByb3RlY3RlZCByZWdpc3Rlci4gKi8KKwlwcmludGsoIlByb3RlY3RlZCAyOiAgJTAyWC0lMDJYXG4iLAorCSAgICAgICBtbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9kYXRhX2gpKSwKKwkgICAgICAgbW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9mZWVfZGF0YV9sKSkpOworI2VuZGlmCQkJCS8qIERPRVNOVF9TRUVNX1RPX1dPUksgKi8KKworCS8qIEVuYWJsZSBwcm90ZWN0ZWQgcmVnaXN0ZXIuICovCisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCBNTVdfRkVFX0FERFJfRU4pOworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSRU4pOworCisJZmVlX3dhaXQoaW9hZGRyLCAxMCwgMTAwKTsKKworCS8qIFVucHJvdGVjdCBhcmVhLiAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgbyArIG4pOworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSV1JJVEUpOworI2lmZGVmIERPRVNOVF9TRUVNX1RPX1dPUksJLyogZGlzYWJsZWQgKi8KKwkvKiBvciB1c2U6ICovCisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfUFJDTEVBUik7CisjZW5kaWYJCQkJLyogRE9FU05UX1NFRU1fVE9fV09SSyAqLworCisJZmVlX3dhaXQoaW9hZGRyLCAxMCwgMTAwKTsKKyNlbmRpZgkJCQkvKiBFRVBST01fSVNfUFJPVEVDVEVEICovCisKKwkvKiBXcml0ZSBlbmFibGUuICovCisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCBNTVdfRkVFX0FERFJfRU4pOworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1dSRU4pOworCisJZmVlX3dhaXQoaW9hZGRyLCAxMCwgMTAwKTsKKworCS8qIFdyaXRlIHRoZSBFRVBST00gYWRkcmVzcy4gKi8KKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIG8gKyBuIC0gMSk7CisKKwkvKiBMb29wIG9uIGFsbCBidWZmZXIgKi8KKwl3aGlsZSAobi0tID4gMCkgeworCQkvKiBXcml0ZSB0aGUgdmFsdWUuICovCisJCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9kYXRhX2gpLCAoKi0tYikgPj4gOCk7CisJCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9kYXRhX2wpLCAqYiAmIDB4RkYpOworCisJCS8qIFdyaXRlIHRoZSB3cml0ZSBjb21tYW5kLiAqLworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksCisJCQlNTVdfRkVFX0NUUkxfV1JJVEUpOworCisJCS8qIFdhdmVMQU4gZG9jdW1lbnRhdGlvbiBzYXlzIHRvIHdhaXQgYXQgbGVhc3QgMTAgbXMgZm9yIEVFQlVTWSA9IDAgKi8KKwkJbWRlbGF5KDEwKTsKKwkJZmVlX3dhaXQoaW9hZGRyLCAxMCwgMTAwKTsKKwl9CisKKwkvKiBXcml0ZSBkaXNhYmxlLiAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgTU1XX0ZFRV9BRERSX0RTKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9XRFMpOworCisJZmVlX3dhaXQoaW9hZGRyLCAxMCwgMTAwKTsKKworI2lmZGVmIEVFUFJPTV9JU19QUk9URUNURUQJLyogZGlzYWJsZWQgKi8KKwkvKiBSZXByb3RlY3QgRUVQUk9NLiAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgMHgwMCk7CisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfUFJXUklURSk7CisKKwlmZWVfd2FpdChpb2FkZHIsIDEwLCAxMDApOworI2VuZGlmCQkJCS8qIEVFUFJPTV9JU19QUk9URUNURUQgKi8KK30KKyNlbmRpZgkJCQkvKiBXSVJFTEVTU19FWFQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBJODI1ODYgU1VCUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBVc2VmdWwgc3Vicm91dGluZXMgdG8gbWFuYWdlIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgYnl0ZXMgZnJvbSB0aGUgb24tYm9hcmQgUkFNLgorICogV2h5IGRvZXMgaW5saW5pbmcgdGhpcyBmdW5jdGlvbiBtYWtlIGl0IGZhaWw/CisgKi8KK3N0YXRpYyAvKmlubGluZSAqLyB2b2lkIG9icmFtX3JlYWQodW5zaWduZWQgbG9uZyBpb2FkZHIsCisJCQkJICAgdTE2IG8sIHU4ICogYiwgaW50IG4pCit7CisJb3V0dyhvLCBQSU9SMShpb2FkZHIpKTsKKwlpbnN3KFBJT1AxKGlvYWRkciksICh1bnNpZ25lZCBzaG9ydCAqKSBiLCAobiArIDEpID4+IDEpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV3JpdGUgYnl0ZXMgdG8gdGhlIG9uLWJvYXJkIFJBTS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG9icmFtX3dyaXRlKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MTYgbywgdTggKiBiLCBpbnQgbikKK3sKKwlvdXR3KG8sIFBJT1IxKGlvYWRkcikpOworCW91dHN3KFBJT1AxKGlvYWRkciksICh1bnNpZ25lZCBzaG9ydCAqKSBiLCAobiArIDEpID4+IDEpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQWNrbm93bGVkZ2UgdGhlIHJlYWRpbmcgb2YgdGhlIHN0YXR1cyBpc3N1ZWQgYnkgdGhlIGk4MjU4Ni4KKyAqLworc3RhdGljIHZvaWQgd3ZfYWNrKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXUxNiBzY2JfY3M7CisJaW50IGk7CisKKwlvYnJhbV9yZWFkKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9zdGF0dXMpLAorCQkgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NzLCBzaXplb2Yoc2NiX2NzKSk7CisJc2NiX2NzICY9IFNDQl9TVF9JTlQ7CisKKwlpZiAoc2NiX2NzID09IDApCisJCXJldHVybjsKKworCW9icmFtX3dyaXRlKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9jb21tYW5kKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZzY2JfY3MsIHNpemVvZihzY2JfY3MpKTsKKworCXNldF9jaGFuX2F0dG4oaW9hZGRyLCBscC0+aGFjcik7CisKKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKSB7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX2NvbW1hbmQpLAorCQkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnNjYl9jcywgc2l6ZW9mKHNjYl9jcykpOworCQlpZiAoc2NiX2NzID09IDApCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTApOworCX0KKwl1ZGVsYXkoMTAwKTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCWlmIChpIDw9IDApCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd3ZfYWNrKCk6IGJvYXJkIG5vdCBhY2NlcHRpbmcgY29tbWFuZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTZXQgY2hhbm5lbCBhdHRlbnRpb24gYml0IGFuZCBidXN5IHdhaXQgdW50aWwgY29tbWFuZCBoYXMKKyAqIGNvbXBsZXRlZCwgdGhlbiBhY2tub3dsZWRnZSBjb21wbGV0aW9uIG9mIHRoZSBjb21tYW5kLgorICovCitzdGF0aWMgaW5saW5lIGludCB3dl9zeW5jaHJvbm91c19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgc2NiX2NtZDsKKwlhY2hfdCBjYjsKKwlpbnQgaTsKKworCXNjYl9jbWQgPSBTQ0JfQ01EX0NVQyAmIFNDQl9DTURfQ1VDX0dPOworCW9icmFtX3dyaXRlKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9jb21tYW5kKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZzY2JfY21kLCBzaXplb2Yoc2NiX2NtZCkpOworCisJc2V0X2NoYW5fYXR0bihpb2FkZHIsIGxwLT5oYWNyKTsKKworCWZvciAoaSA9IDEwMDA7IGkgPiAwOyBpLS0pIHsKKwkJb2JyYW1fcmVhZChpb2FkZHIsIE9GRlNFVF9DVSwgKHVuc2lnbmVkIGNoYXIgKikgJmNiLAorCQkJICAgc2l6ZW9mKGNiKSk7CisJCWlmIChjYi5hY19zdGF0dXMgJiBBQ19TRkxEX0MpCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTApOworCX0KKwl1ZGVsYXkoMTAwKTsKKworCWlmIChpIDw9IDAgfHwgIShjYi5hY19zdGF0dXMgJiBBQ19TRkxEX09LKSkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgZmFpbGVkOyBzdGF0dXMgPSAweCV4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBzdHIsIGNiLmFjX3N0YXR1cyk7CisjZW5kaWYKKyNpZmRlZiBERUJVR19JODI1ODZfU0hPVworCQl3dl9zY2Jfc2hvdyhpb2FkZHIpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBBY2sgdGhlIHN0YXR1cyAqLworCXd2X2FjayhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBDb25maWd1cmF0aW9uIGNvbW1hbmRzIGNvbXBsZXRpb24gaW50ZXJydXB0LgorICogQ2hlY2sgaWYgZG9uZSwgYW5kIGlmIE9LLgorICovCitzdGF0aWMgaW5saW5lIGludAord3ZfY29uZmlnX2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBsb25nIGlvYWRkciwgbmV0X2xvY2FsICogbHApCit7CisJdW5zaWduZWQgc2hvcnQgbWNzX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCWludCByZXQ7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfY29uZmlnX2NvbXBsZXRlKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCW1jc19hZGRyID0gbHAtPnR4X2ZpcnN0X2luX3VzZSArIHNpemVvZihhY190eF90KSArIHNpemVvZihhY19ub3BfdCkKKwkgICAgKyBzaXplb2YodGJkX3QpICsgc2l6ZW9mKGFjX2NmZ190KSArIHNpemVvZihhY19pYXNfdCk7CisKKwkvKiBSZWFkIHRoZSBzdGF0dXMgb2YgdGhlIGxhc3QgY29tbWFuZCAoc2V0IG1jIGxpc3QpLiAqLworCW9icmFtX3JlYWQoaW9hZGRyLCBhY29mZihtY3NfYWRkciwgYWNfc3RhdHVzKSwKKwkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpOworCisJLyogSWYgbm90IGNvbXBsZXRlZCAtPiBleGl0ICovCisJaWYgKChzdGF0dXMgJiBBQ19TRkxEX0MpID09IDApCisJCXJldCA9IDA7CS8qIE5vdCByZWFkeSB0byBiZSBzY3JhcHBlZCAqLworCWVsc2UgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQl1bnNpZ25lZCBzaG9ydCBjZmdfYWRkcjsKKwkJdW5zaWduZWQgc2hvcnQgaWFzX2FkZHI7CisKKwkJLyogQ2hlY2sgbWNfY29uZmlnIGNvbW1hbmQgKi8KKwkJaWYgKChzdGF0dXMgJiBBQ19TRkxEX09LKSAhPSBBQ19TRkxEX09LKQorCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICIlczogd3ZfY29uZmlnX2NvbXBsZXRlKCk6IHNldF9tdWx0aWNhc3RfYWRkcmVzcyBmYWlsZWQ7IHN0YXR1cyA9IDB4JXhcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCisJCS8qIGNoZWNrIGlhLWNvbmZpZyBjb21tYW5kICovCisJCWlhc19hZGRyID0gbWNzX2FkZHIgLSBzaXplb2YoYWNfaWFzX3QpOworCQlvYnJhbV9yZWFkKGlvYWRkciwgYWNvZmYoaWFzX2FkZHIsIGFjX3N0YXR1cyksCisJCQkgICAodW5zaWduZWQgY2hhciAqKSAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSk7CisJCWlmICgoc3RhdHVzICYgQUNfU0ZMRF9PSykgIT0gQUNfU0ZMRF9PSykKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiJXM6IHd2X2NvbmZpZ19jb21wbGV0ZSgpOiBzZXRfTUFDX2FkZHJlc3MgZmFpbGVkOyBzdGF0dXMgPSAweCV4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKworCQkvKiBDaGVjayBjb25maWcgY29tbWFuZC4gKi8KKwkJY2ZnX2FkZHIgPSBpYXNfYWRkciAtIHNpemVvZihhY19jZmdfdCk7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBhY29mZihjZmdfYWRkciwgYWNfc3RhdHVzKSwKKwkJCSAgICh1bnNpZ25lZCBjaGFyICopICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKKwkJaWYgKChzdGF0dXMgJiBBQ19TRkxEX09LKSAhPSBBQ19TRkxEX09LKQorCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICIlczogd3ZfY29uZmlnX2NvbXBsZXRlKCk6IGNvbmZpZ3VyZSBmYWlsZWQ7IHN0YXR1cyA9IDB4JXhcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworI2VuZGlmCS8qIERFQlVHX0NPTkZJR19FUlJPUiAqLworCisJCXJldCA9IDE7CS8qIFJlYWR5IHRvIGJlIHNjcmFwcGVkICovCisJfQorCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X2NvbmZpZ19jb21wbGV0ZSgpIC0gJWRcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgcmV0KTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBDb21tYW5kIGNvbXBsZXRpb24gaW50ZXJydXB0LgorICogUmVjbGFpbSBhcyBtYW55IGZyZWVkIHR4IGJ1ZmZlcnMgYXMgd2UgY2FuLgorICogKGNhbGxlZCBpbiB3YXZlbGFuX2ludGVycnVwdCgpKS4KKyAqIE5vdGUgOiB0aGUgc3BpbmxvY2sgaXMgYWxyZWFkeSBncmFiYmVkIGZvciB1cy4KKyAqLworc3RhdGljIGludCB3dl9jb21wbGV0ZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBpb2FkZHIsIG5ldF9sb2NhbCAqIGxwKQoreworCWludCBucmVhcGVkID0gMDsKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9jb21wbGV0ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKiBMb29wIG9uIGFsbCB0aGUgdHJhbnNtaXQgYnVmZmVycyAqLworCXdoaWxlIChscC0+dHhfZmlyc3RfaW5fdXNlICE9IEk4MjU4Nk5VTEwpIHsKKwkJdW5zaWduZWQgc2hvcnQgdHhfc3RhdHVzOworCisJCS8qIFJlYWQgdGhlIGZpcnN0IHRyYW5zbWl0IGJ1ZmZlciAqLworCQlvYnJhbV9yZWFkKGlvYWRkciwgYWNvZmYobHAtPnR4X2ZpcnN0X2luX3VzZSwgYWNfc3RhdHVzKSwKKwkJCSAgICh1bnNpZ25lZCBjaGFyICopICZ0eF9zdGF0dXMsCisJCQkgICBzaXplb2YodHhfc3RhdHVzKSk7CisKKwkJLyogSWYgbm90IGNvbXBsZXRlZCAtPiBleGl0ICovCisJCWlmICgodHhfc3RhdHVzICYgQUNfU0ZMRF9DKSA9PSAwKQorCQkJYnJlYWs7CisKKwkJLyogSGFjayBmb3IgcmVjb25maWd1cmF0aW9uICovCisJCWlmICh0eF9zdGF0dXMgPT0gMHhGRkZGKQorCQkJaWYgKCF3dl9jb25maWdfY29tcGxldGUoZGV2LCBpb2FkZHIsIGxwKSkKKwkJCQlicmVhazsJLyogTm90IGNvbXBsZXRlZCAqLworCisJCS8qIFdlIG5vdyByZW1vdmUgdGhpcyBidWZmZXIgKi8KKwkJbnJlYXBlZCsrOworCQktLWxwLT50eF9uX2luX3VzZTsKKworLyoKK2lmIChscC0+dHhfbl9pbl91c2UgPiAwKQorCXByaW50aygiJWMiLCAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprIltscC0+dHhfbl9pbl91c2VdKTsKKyovCisKKwkJLyogV2FzIGl0IHRoZSBsYXN0IG9uZT8gKi8KKwkJaWYgKGxwLT50eF9uX2luX3VzZSA8PSAwKQorCQkJbHAtPnR4X2ZpcnN0X2luX3VzZSA9IEk4MjU4Nk5VTEw7CisJCWVsc2UgeworCQkJLyogTmV4dCBvbmUgaW4gdGhlIGNoYWluICovCisJCQlscC0+dHhfZmlyc3RfaW5fdXNlICs9IFRYQkxPQ0taOworCQkJaWYgKGxwLT50eF9maXJzdF9pbl91c2UgPj0KKwkJCSAgICBPRkZTRVRfQ1UgKworCQkJICAgIE5UWEJMT0NLUyAqIFRYQkxPQ0taKSBscC0+dHhfZmlyc3RfaW5fdXNlIC09CisJCQkJICAgIE5UWEJMT0NLUyAqIFRYQkxPQ0taOworCQl9CisKKwkJLyogSGFjayBmb3IgcmVjb25maWd1cmF0aW9uICovCisJCWlmICh0eF9zdGF0dXMgPT0gMHhGRkZGKQorCQkJY29udGludWU7CisKKwkJLyogTm93LCBjaGVjayBzdGF0dXMgb2YgdGhlIGZpbmlzaGVkIGNvbW1hbmQgKi8KKwkJaWYgKHR4X3N0YXR1cyAmIEFDX1NGTERfT0spIHsKKwkJCWludCBuY29sbGlzaW9uczsKKworCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCW5jb2xsaXNpb25zID0gdHhfc3RhdHVzICYgQUNfU0ZMRF9NQVhDT0w7CisJCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSBuY29sbGlzaW9uczsKKyNpZmRlZiBERUJVR19UWF9JTkZPCisJCQlpZiAobmNvbGxpc2lvbnMgPiAwKQorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfY29tcGxldGUoKTogdHggY29tcGxldGVkIGFmdGVyICVkIGNvbGxpc2lvbnMuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIG5jb2xsaXNpb25zKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIEFDX1NGTERfUzEwKSB7CisJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfY29tcGxldGUoKTogdHggZXJyb3I6IG5vIENTLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJfQorCQkJaWYgKHR4X3N0YXR1cyAmIEFDX1NGTERfUzkpIHsKKwkJCQlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19UWF9GQUlMCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiVzOiB3dl9jb21wbGV0ZSgpOiB0eCBlcnJvcjogbG9zdCBDVFMuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisJCQlpZiAodHhfc3RhdHVzICYgQUNfU0ZMRF9TOCkgeworCQkJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworI2lmZGVmIERFQlVHX1RYX0ZBSUwKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IHd2X2NvbXBsZXRlKCk6IHR4IGVycm9yOiBzbG93IERNQS5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCX0KKwkJCWlmICh0eF9zdGF0dXMgJiBBQ19TRkxEX1M2KSB7CisJCQkJbHAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19UWF9GQUlMCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiVzOiB3dl9jb21wbGV0ZSgpOiB0eCBlcnJvcjogaGVhcnQgYmVhdC5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCX0KKwkJCWlmICh0eF9zdGF0dXMgJiBBQ19TRkxEX1M1KSB7CisJCQkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfY29tcGxldGUoKTogdHggZXJyb3I6IHRvbyBtYW55IGNvbGxpc2lvbnMuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisJCX0KKworI2lmZGVmIERFQlVHX1RYX0lORk8KKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIlczogd3ZfY29tcGxldGUoKTogdHggY29tcGxldGVkLCB0eF9zdGF0dXMgMHglMDR4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCB0eF9zdGF0dXMpOworI2VuZGlmCisJfQorCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwlpZiAobnJlYXBlZCA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfY29tcGxldGUoKTogcmVhcGVkICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBucmVhcGVkKTsKKyNlbmRpZgorCisJLyoKKwkgKiBJbmZvcm0gdXBwZXIgbGF5ZXJzLgorCSAqLworCWlmIChscC0+dHhfbl9pbl91c2UgPCBOVFhCTE9DS1MgLSAxKSB7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X2NvbXBsZXRlKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gbnJlYXBlZDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlY29uZmlndXJlIHRoZSBpODI1ODYsIG9yIGF0IGxlYXN0IGFzayBmb3IgaXQuCisgKiBCZWNhdXNlIHd2XzgyNTg2X2NvbmZpZyB1c2VzIGEgdHJhbnNtaXNzaW9uIGJ1ZmZlciwgd2UgbXVzdCBkbyBpdAorICogd2hlbiB3ZSBhcmUgc3VyZSB0aGF0IHRoZXJlIGlzIG9uZSBsZWZ0LCBzbyB3ZSBkbyBpdCBub3cKKyAqIG9yIGluIHdhdmVsYW5fcGFja2V0X3htaXQoKSAoSSBjYW4ndCBmaW5kIGFueSBiZXR0ZXIgcGxhY2UsCisgKiB3YXZlbGFuX2ludGVycnVwdCBpcyBub3QgYW4gb3B0aW9uKSwgc28geW91IG1heSBleHBlcmllbmNlCisgKiBkZWxheXMgc29tZXRpbWVzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfODI1ODZfcmVjb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBBcm0gdGhlIGZsYWcsIHdpbGwgYmUgY2xlYXJkIGluIHd2XzgyNTg2X2NvbmZpZygpICovCisJbHAtPnJlY29uZmlnXzgyNTg2ID0gMTsKKworCS8qIENoZWNrIGlmIHdlIGNhbiBkbyBpdCBub3cgISAqLworCWlmKChuZXRpZl9ydW5uaW5nKGRldikpICYmICEobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCS8qIE1heSBmYWlsICovCisJCXd2XzgyNTg2X2NvbmZpZyhkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwl9CisJZWxzZSB7CisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIlczogd3ZfODI1ODZfcmVjb25maWcoKTogZGVsYXllZCAoc3RhdGUgPSAlbFgpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZGV2LT5zdGF0ZSk7CisjZW5kaWYKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKiogREVCVUcgJiBJTkZPIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCBpbiB0aGUgY29kZSB0byBzaG93IGluZm9ybWF0aW9uIGZvciBkZWJ1Z2dpbmcuCisgKiBNb3N0IG9mIHRoZSB0aW1lLCBpdCBkdW1wcyB0aGUgY29udGVudHMgb2YgaGFyZHdhcmUgc3RydWN0dXJlcy4KKyAqLworCisjaWZkZWYgREVCVUdfUFNBX1NIT1cKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBQcmludCB0aGUgZm9ybWF0dGVkIGNvbnRlbnRzIG9mIHRoZSBQYXJhbWV0ZXIgU3RvcmFnZSBBcmVhLgorICovCitzdGF0aWMgdm9pZCB3dl9wc2Ffc2hvdyhwc2FfdCAqIHApCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIiMjIyMjIFdhdmVMQU4gUFNBIGNvbnRlbnRzOiAjIyMjI1xuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgInBzYV9pb19iYXNlX2FkZHJfMTogMHglMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCSAgICAgICBwLT5wc2FfaW9fYmFzZV9hZGRyXzEsCisJICAgICAgIHAtPnBzYV9pb19iYXNlX2FkZHJfMiwKKwkgICAgICAgcC0+cHNhX2lvX2Jhc2VfYWRkcl8zLCBwLT5wc2FfaW9fYmFzZV9hZGRyXzQpOworCXByaW50ayhLRVJOX0RFQlVHICJwc2FfcmVtX2Jvb3RfYWRkcl8xOiAweCUwMlggJTAyWCAlMDJYXG4iLAorCSAgICAgICBwLT5wc2FfcmVtX2Jvb3RfYWRkcl8xLAorCSAgICAgICBwLT5wc2FfcmVtX2Jvb3RfYWRkcl8yLCBwLT5wc2FfcmVtX2Jvb3RfYWRkcl8zKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX2hvbGlfcGFyYW1zOiAweCUwMngsICIsIHAtPnBzYV9ob2xpX3BhcmFtcyk7CisJcHJpbnRrKCJwc2FfaW50X3JlcV9ubzogJWRcbiIsIHAtPnBzYV9pbnRfcmVxX25vKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJwc2FfdW51c2VkMFtdOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSAgICAgICBwLT5wc2FfdW51c2VkMFswXSwgcC0+cHNhX3VudXNlZDBbMV0sIHAtPnBzYV91bnVzZWQwWzJdLAorCSAgICAgICBwLT5wc2FfdW51c2VkMFszXSwgcC0+cHNhX3VudXNlZDBbNF0sIHAtPnBzYV91bnVzZWQwWzVdLAorCSAgICAgICBwLT5wc2FfdW51c2VkMFs2XSk7CisjZW5kaWYJCQkJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAicHNhX3VuaXZfbWFjX2FkZHJbXTogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIHAtPnBzYV91bml2X21hY19hZGRyWzBdLCBwLT5wc2FfdW5pdl9tYWNfYWRkclsxXSwKKwkgICAgICAgcC0+cHNhX3VuaXZfbWFjX2FkZHJbMl0sIHAtPnBzYV91bml2X21hY19hZGRyWzNdLAorCSAgICAgICBwLT5wc2FfdW5pdl9tYWNfYWRkcls0XSwgcC0+cHNhX3VuaXZfbWFjX2FkZHJbNV0pOworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJwc2FfbG9jYWxfbWFjX2FkZHJbXTogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIHAtPnBzYV9sb2NhbF9tYWNfYWRkclswXSwgcC0+cHNhX2xvY2FsX21hY19hZGRyWzFdLAorCSAgICAgICBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbMl0sIHAtPnBzYV9sb2NhbF9tYWNfYWRkclszXSwKKwkgICAgICAgcC0+cHNhX2xvY2FsX21hY19hZGRyWzRdLCBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbNV0pOworCXByaW50ayhLRVJOX0RFQlVHICJwc2FfdW5pdl9sb2NhbF9zZWw6ICVkLCAiLAorCSAgICAgICBwLT5wc2FfdW5pdl9sb2NhbF9zZWwpOworCXByaW50aygicHNhX2NvbXBfbnVtYmVyOiAlZCwgIiwgcC0+cHNhX2NvbXBfbnVtYmVyKTsKKwlwcmludGsoInBzYV90aHJfcHJlX3NldDogMHglMDJ4XG4iLCBwLT5wc2FfdGhyX3ByZV9zZXQpOworCXByaW50ayhLRVJOX0RFQlVHICJwc2FfZmVhdHVyZV9zZWxlY3QvZGVjYXlfcHJtOiAweCUwMngsICIsCisJICAgICAgIHAtPnBzYV9mZWF0dXJlX3NlbGVjdCk7CisJcHJpbnRrKCJwc2Ffc3ViYmFuZC9kZWNheV91cGRhdGVfcHJtOiAlZFxuIiwgcC0+cHNhX3N1YmJhbmQpOworCXByaW50ayhLRVJOX0RFQlVHICJwc2FfcXVhbGl0eV90aHI6IDB4JTAyeCwgIiwgcC0+cHNhX3F1YWxpdHlfdGhyKTsKKwlwcmludGsoInBzYV9tb2RfZGVsYXk6IDB4JTAyeFxuIiwgcC0+cHNhX21vZF9kZWxheSk7CisJcHJpbnRrKEtFUk5fREVCVUcgInBzYV9ud2lkOiAweCUwMnglMDJ4LCAiLCBwLT5wc2FfbndpZFswXSwKKwkgICAgICAgcC0+cHNhX253aWRbMV0pOworCXByaW50aygicHNhX253aWRfc2VsZWN0OiAlZFxuIiwgcC0+cHNhX253aWRfc2VsZWN0KTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX2VuY3J5cHRpb25fc2VsZWN0OiAlZCwgIiwKKwkgICAgICAgcC0+cHNhX2VuY3J5cHRpb25fc2VsZWN0KTsKKwlwcmludGsKKwkgICAgKCJwc2FfZW5jcnlwdGlvbl9rZXlbXTogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzBdLCBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbMV0sCisJICAgICBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbMl0sIHAtPnBzYV9lbmNyeXB0aW9uX2tleVszXSwKKwkgICAgIHAtPnBzYV9lbmNyeXB0aW9uX2tleVs0XSwgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzVdLAorCSAgICAgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzZdLCBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbN10pOworCXByaW50ayhLRVJOX0RFQlVHICJwc2FfZGF0YWJ1c193aWR0aDogJWRcbiIsIHAtPnBzYV9kYXRhYnVzX3dpZHRoKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX2NhbGxfY29kZS9hdXRvX3NxdWVsY2g6IDB4JTAyeCwgIiwKKwkgICAgICAgcC0+cHNhX2NhbGxfY29kZVswXSk7CisJcHJpbnRrCisJICAgICgicHNhX2NhbGxfY29kZVtdOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJICAgICBwLT5wc2FfY2FsbF9jb2RlWzBdLCBwLT5wc2FfY2FsbF9jb2RlWzFdLCBwLT5wc2FfY2FsbF9jb2RlWzJdLAorCSAgICAgcC0+cHNhX2NhbGxfY29kZVszXSwgcC0+cHNhX2NhbGxfY29kZVs0XSwgcC0+cHNhX2NhbGxfY29kZVs1XSwKKwkgICAgIHAtPnBzYV9jYWxsX2NvZGVbNl0sIHAtPnBzYV9jYWxsX2NvZGVbN10pOworI2lmZGVmIERFQlVHX1NIT1dfVU5VU0VECisJcHJpbnRrKEtFUk5fREVCVUcgInBzYV9yZXNlcnZlZFtdOiAlMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSAgICAgICBwLT5wc2FfcmVzZXJ2ZWRbMF0sCisJICAgICAgIHAtPnBzYV9yZXNlcnZlZFsxXSwgcC0+cHNhX3Jlc2VydmVkWzJdLCBwLT5wc2FfcmVzZXJ2ZWRbM10pOworI2VuZGlmCQkJCS8qIERFQlVHX1NIT1dfVU5VU0VEICovCisJcHJpbnRrKEtFUk5fREVCVUcgInBzYV9jb25mX3N0YXR1czogJWQsICIsIHAtPnBzYV9jb25mX3N0YXR1cyk7CisJcHJpbnRrKCJwc2FfY3JjOiAweCUwMnglMDJ4LCAiLCBwLT5wc2FfY3JjWzBdLCBwLT5wc2FfY3JjWzFdKTsKKwlwcmludGsoInBzYV9jcmNfc3RhdHVzOiAweCUwMnhcbiIsIHAtPnBzYV9jcmNfc3RhdHVzKTsKK30JCQkJLyogd3ZfcHNhX3Nob3cgKi8KKyNlbmRpZgkJCQkvKiBERUJVR19QU0FfU0hPVyAqLworCisjaWZkZWYgREVCVUdfTU1DX1NIT1cKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBQcmludCB0aGUgZm9ybWF0dGVkIHN0YXR1cyBvZiB0aGUgTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyLgorICogVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSBjb21wbGV0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHd2X21tY19zaG93KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCW1tcl90IG07CisKKwkvKiBCYXNpYyBjaGVjayAqLworCWlmIChoYXNyX3JlYWQoaW9hZGRyKSAmIEhBU1JfTk9fQ0xLKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogd3ZfbW1jX3Nob3c6IG1vZGVtIG5vdCBjb25uZWN0ZWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJLyogUmVhZCB0aGUgbW1jICovCisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZnJlZXplKSwgMSk7CisJbW1jX3JlYWQoaW9hZGRyLCAwLCAodTggKikgJiBtLCBzaXplb2YobSkpOworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZyZWV6ZSksIDApOworCisjaWZkZWYgV0lSRUxFU1NfRVhUCQkvKiBpZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3RzIGluIHRoZSBrZXJuZWwgKi8KKwkvKiBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIHN0YXRpc3RpY3MgKi8KKwlscC0+d3N0YXRzLmRpc2NhcmQubndpZCArPQorCSAgICAobS5tbXJfd3JvbmdfbndpZF9oIDw8IDgpIHwgbS5tbXJfd3JvbmdfbndpZF9sOworI2VuZGlmCQkJCS8qIFdJUkVMRVNTX0VYVCAqLworCisJcHJpbnRrKEtFUk5fREVCVUcgIiMjIyMjIFdhdmVMQU4gbW9kZW0gc3RhdHVzIHJlZ2lzdGVyczogIyMjIyNcbiIpOworI2lmZGVmIERFQlVHX1NIT1dfVU5VU0VECisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIm1tY191bnVzZWQwW106ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgICAgICAgbS5tbXJfdW51c2VkMFswXSwgbS5tbXJfdW51c2VkMFsxXSwgbS5tbXJfdW51c2VkMFsyXSwKKwkgICAgICAgbS5tbXJfdW51c2VkMFszXSwgbS5tbXJfdW51c2VkMFs0XSwgbS5tbXJfdW51c2VkMFs1XSwKKwkgICAgICAgbS5tbXJfdW51c2VkMFs2XSwgbS5tbXJfdW51c2VkMFs3XSk7CisjZW5kaWYJCQkJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiRW5jcnlwdGlvbiBhbGdvcml0aG06ICUwMlggLSBTdGF0dXM6ICUwMlhcbiIsCisJICAgICAgIG0ubW1yX2Rlc19hdmFpbCwgbS5tbXJfZGVzX3N0YXR1cyk7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKwlwcmludGsoS0VSTl9ERUJVRyAibW1jX3VudXNlZDFbXTogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSAgICAgICBtLm1tcl91bnVzZWQxWzBdLAorCSAgICAgICBtLm1tcl91bnVzZWQxWzFdLAorCSAgICAgICBtLm1tcl91bnVzZWQxWzJdLCBtLm1tcl91bnVzZWQxWzNdLCBtLm1tcl91bnVzZWQxWzRdKTsKKyNlbmRpZgkJCQkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworCXByaW50ayhLRVJOX0RFQlVHICJkY2Vfc3RhdHVzOiAweCV4IFslcyVzJXMlc11cbiIsCisJICAgICAgIG0ubW1yX2RjZV9zdGF0dXMsCisJICAgICAgIChtLgorCQltbXJfZGNlX3N0YXR1cyAmIE1NUl9EQ0VfU1RBVFVTX1JYX0JVU1kpID8KKwkgICAgICAgImVuZXJneSBkZXRlY3RlZCwiIDogIiIsCisJICAgICAgIChtLgorCQltbXJfZGNlX3N0YXR1cyAmIE1NUl9EQ0VfU1RBVFVTX0xPT1BUX0lORCkgPworCSAgICAgICAibG9vcCB0ZXN0IGluZGljYXRlZCwiIDogIiIsCisJICAgICAgIChtLgorCQltbXJfZGNlX3N0YXR1cyAmIE1NUl9EQ0VfU1RBVFVTX1RYX0JVU1kpID8KKwkgICAgICAgInRyYW5zbWl0dGVyIG9uLCIgOiAiIiwKKwkgICAgICAgKG0uCisJCW1tcl9kY2Vfc3RhdHVzICYgTU1SX0RDRV9TVEFUVVNfSkJSX0VYUElSRUQpID8KKwkgICAgICAgImphYmJlciB0aW1lciBleHBpcmVkLCIgOiAiIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIkRzcCBJRDogJTAyWFxuIiwgbS5tbXJfZHNwX2lkKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorCXByaW50ayhLRVJOX0RFQlVHICJtbWNfdW51c2VkMltdOiAlMDJYOiUwMlhcbiIsCisJICAgICAgIG0ubW1yX3VudXNlZDJbMF0sIG0ubW1yX3VudXNlZDJbMV0pOworI2VuZGlmCQkJCS8qIERFQlVHX1NIT1dfVU5VU0VEICovCisJcHJpbnRrKEtFUk5fREVCVUcgIiMgY29ycmVjdF9ud2lkOiAlZCwgIyB3cm9uZ19ud2lkOiAlZFxuIiwKKwkgICAgICAgKG0ubW1yX2NvcnJlY3RfbndpZF9oIDw8IDgpIHwgbS5tbXJfY29ycmVjdF9ud2lkX2wsCisJICAgICAgIChtLm1tcl93cm9uZ19ud2lkX2ggPDwgOCkgfCBtLm1tcl93cm9uZ19ud2lkX2wpOworCXByaW50ayhLRVJOX0RFQlVHICJ0aHJfcHJlX3NldDogMHgleCBbY3VycmVudCBzaWduYWwgJXNdXG4iLAorCSAgICAgICBtLm1tcl90aHJfcHJlX3NldCAmIE1NUl9USFJfUFJFX1NFVCwKKwkgICAgICAgKG0uCisJCW1tcl90aHJfcHJlX3NldCAmIE1NUl9USFJfUFJFX1NFVF9DVVIpID8gImFib3ZlIiA6CisJICAgICAgICJiZWxvdyIpOworCXByaW50ayhLRVJOX0RFQlVHICJzaWduYWxfbHZsOiAlZCBbJXNdLCAiLAorCSAgICAgICBtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkwsCisJICAgICAgIChtLgorCQltbXJfc2lnbmFsX2x2bCAmIE1NUl9TSUdOQUxfTFZMX1ZBTElEKSA/ICJuZXcgbXNnIiA6CisJICAgICAgICJubyBuZXcgbXNnIik7CisJcHJpbnRrKCJzaWxlbmNlX2x2bDogJWQgWyVzXSwgIiwKKwkgICAgICAgbS5tbXJfc2lsZW5jZV9sdmwgJiBNTVJfU0lMRU5DRV9MVkwsCisJICAgICAgIChtLgorCQltbXJfc2lsZW5jZV9sdmwgJiBNTVJfU0lMRU5DRV9MVkxfVkFMSUQpID8gInVwZGF0ZSBkb25lIiA6CisJICAgICAgICJubyBuZXcgdXBkYXRlIik7CisJcHJpbnRrKCJzZ25sX3F1YWw6IDB4JXggWyVzXVxuIiwgbS5tbXJfc2dubF9xdWFsICYgTU1SX1NHTkxfUVVBTCwKKwkgICAgICAgKG0uCisJCW1tcl9zZ25sX3F1YWwgJiBNTVJfU0dOTF9RVUFMX0FOVCkgPyAiQW50ZW5uYSAxIiA6CisJICAgICAgICJBbnRlbm5hIDAiKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorCXByaW50ayhLRVJOX0RFQlVHICJuZXR3X2lkX2w6ICV4XG4iLCBtLm1tcl9uZXR3X2lkX2wpOworI2VuZGlmCQkJCS8qIERFQlVHX1NIT1dfVU5VU0VEICovCit9CQkJCS8qIHd2X21tY19zaG93ICovCisjZW5kaWYJCQkJLyogREVCVUdfTU1DX1NIT1cgKi8KKworI2lmZGVmIERFQlVHX0k4MjU4Nl9TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGxhc3QgYmxvY2sgb2YgdGhlIGk4MjU4NiBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkIHd2X3NjYl9zaG93KHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXNjYl90IHNjYjsKKworCW9icmFtX3JlYWQoaW9hZGRyLCBPRkZTRVRfU0NCLCAodW5zaWduZWQgY2hhciAqKSAmc2NiLAorCQkgICBzaXplb2Yoc2NiKSk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiIyMjIyMgV2F2ZUxBTiBzeXN0ZW0gY29udHJvbCBibG9jazogIyMjIyNcbiIpOworCisJcHJpbnRrKEtFUk5fREVCVUcgInN0YXR1czogIik7CisJcHJpbnRrKCJzdGF0IDB4JXhbJXMlcyVzJXNdICIsCisJICAgICAgIChzY2IuCisJCXNjYl9zdGF0dXMgJiAoU0NCX1NUX0NYIHwgU0NCX1NUX0ZSIHwgU0NCX1NUX0NOQSB8CisJCQkgICAgICBTQ0JfU1RfUk5SKSkgPj4gMTIsCisJICAgICAgIChzY2IuCisJCXNjYl9zdGF0dXMgJiBTQ0JfU1RfQ1gpID8gImNvbW1hbmQgY29tcGxldGlvbiBpbnRlcnJ1cHQsIiA6CisJICAgICAgICIiLCAoc2NiLnNjYl9zdGF0dXMgJiBTQ0JfU1RfRlIpID8gImZyYW1lIHJlY2VpdmVkLCIgOiAiIiwKKwkgICAgICAgKHNjYi4KKwkJc2NiX3N0YXR1cyAmIFNDQl9TVF9DTkEpID8gImNvbW1hbmQgdW5pdCBub3QgYWN0aXZlLCIgOiAiIiwKKwkgICAgICAgKHNjYi4KKwkJc2NiX3N0YXR1cyAmIFNDQl9TVF9STlIpID8gInJlY2VpdmluZyB1bml0IG5vdCByZWFkeSwiIDoKKwkgICAgICAgIiIpOworCXByaW50aygiY3VzIDB4JXhbJXMlcyVzXSAiLCAoc2NiLnNjYl9zdGF0dXMgJiBTQ0JfU1RfQ1VTKSA+PiA4LAorCSAgICAgICAoKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX0NVUykgPT0KKwkJU0NCX1NUX0NVU19JRExFKSA/ICJpZGxlIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX0NVUykgPT0KKwkJU0NCX1NUX0NVU19TVVNQKSA/ICJzdXNwZW5kZWQiIDogIiIsCisJICAgICAgICgoc2NiLnNjYl9zdGF0dXMgJiBTQ0JfU1RfQ1VTKSA9PQorCQlTQ0JfU1RfQ1VTX0FDVFYpID8gImFjdGl2ZSIgOiAiIik7CisJcHJpbnRrKCJydXMgMHgleFslcyVzJXMlc11cbiIsIChzY2Iuc2NiX3N0YXR1cyAmIFNDQl9TVF9SVVMpID4+IDQsCisJICAgICAgICgoc2NiLnNjYl9zdGF0dXMgJiBTQ0JfU1RfUlVTKSA9PQorCQlTQ0JfU1RfUlVTX0lETEUpID8gImlkbGUiIDogIiIsCisJICAgICAgICgoc2NiLnNjYl9zdGF0dXMgJiBTQ0JfU1RfUlVTKSA9PQorCQlTQ0JfU1RfUlVTX1NVU1ApID8gInN1c3BlbmRlZCIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX3N0YXR1cyAmIFNDQl9TVF9SVVMpID09CisJCVNDQl9TVF9SVVNfTlJFUykgPyAibm8gcmVzb3VyY2VzIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX1JVUykgPT0KKwkJU0NCX1NUX1JVU19SRFkpID8gInJlYWR5IiA6ICIiKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJjb21tYW5kOiAiKTsKKwlwcmludGsoImFjayAweCV4WyVzJXMlcyVzXSAiLAorCSAgICAgICAoc2NiLgorCQlzY2JfY29tbWFuZCAmIChTQ0JfQ01EX0FDS19DWCB8IFNDQl9DTURfQUNLX0ZSIHwKKwkJCSAgICAgICBTQ0JfQ01EX0FDS19DTkEgfCBTQ0JfQ01EX0FDS19STlIpKSA+PiAxMiwKKwkgICAgICAgKHNjYi4KKwkJc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX0FDS19DWCkgPyAiYWNrIGNtZCBjb21wbGV0aW9uLCIgOiAiIiwKKwkgICAgICAgKHNjYi4KKwkJc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX0FDS19GUikgPyAiYWNrIGZyYW1lIHJlY2VpdmVkLCIgOiAiIiwKKwkgICAgICAgKHNjYi4KKwkJc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX0FDS19DTkEpID8gImFjayBDVSBub3QgYWN0aXZlLCIgOiAiIiwKKwkgICAgICAgKHNjYi4KKwkJc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX0FDS19STlIpID8gImFjayBSVSBub3QgcmVhZHksIiA6ICIiKTsKKwlwcmludGsoImN1YyAweCV4WyVzJXMlcyVzJXNdICIsCisJICAgICAgIChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX0NVQykgPj4gOCwKKwkgICAgICAgKChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX0NVQykgPT0KKwkJU0NCX0NNRF9DVUNfTk9QKSA/ICJub3AiIDogIiIsCisJICAgICAgICgoc2NiLnNjYl9jb21tYW5kICYgU0NCX0NNRF9DVUMpID09CisJCVNDQl9DTURfQ1VDX0dPKSA/ICJzdGFydCBjYmxfb2Zmc2V0IiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfQ1VDKSA9PQorCQlTQ0JfQ01EX0NVQ19SRVMpID8gInJlc3VtZSBleGVjdXRpb24iIDogIiIsCisJICAgICAgICgoc2NiLnNjYl9jb21tYW5kICYgU0NCX0NNRF9DVUMpID09CisJCVNDQl9DTURfQ1VDX1NVUykgPyAic3VzcGVuZCBleGVjdXRpb24iIDogIiIsCisJICAgICAgICgoc2NiLnNjYl9jb21tYW5kICYgU0NCX0NNRF9DVUMpID09CisJCVNDQl9DTURfQ1VDX0FCVCkgPyAiYWJvcnQgZXhlY3V0aW9uIiA6ICIiKTsKKwlwcmludGsoInJ1YyAweCV4WyVzJXMlcyVzJXNdXG4iLAorCSAgICAgICAoc2NiLnNjYl9jb21tYW5kICYgU0NCX0NNRF9SVUMpID4+IDQsCisJICAgICAgICgoc2NiLnNjYl9jb21tYW5kICYgU0NCX0NNRF9SVUMpID09CisJCVNDQl9DTURfUlVDX05PUCkgPyAibm9wIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfUlVDKSA9PQorCQlTQ0JfQ01EX1JVQ19HTykgPyAic3RhcnQgcmZhX29mZnNldCIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX1JVQykgPT0KKwkJU0NCX0NNRF9SVUNfUkVTKSA/ICJyZXN1bWUgcmVjZXB0aW9uIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfUlVDKSA9PQorCQlTQ0JfQ01EX1JVQ19TVVMpID8gInN1c3BlbmQgcmVjZXB0aW9uIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfUlVDKSA9PQorCQlTQ0JfQ01EX1JVQ19BQlQpID8gImFib3J0IHJlY2VwdGlvbiIgOiAiIik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiY2JsX29mZnNldCAweCV4ICIsIHNjYi5zY2JfY2JsX29mZnNldCk7CisJcHJpbnRrKCJyZmFfb2Zmc2V0IDB4JXhcbiIsIHNjYi5zY2JfcmZhX29mZnNldCk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiY3JjZXJycyAlZCAiLCBzY2Iuc2NiX2NyY2VycnMpOworCXByaW50aygiYWxuZXJycyAlZCAiLCBzY2Iuc2NiX2FsbmVycnMpOworCXByaW50aygicnNjZXJycyAlZCAiLCBzY2Iuc2NiX3JzY2VycnMpOworCXByaW50aygib3ZybmVycnMgJWRcbiIsIHNjYi5zY2Jfb3ZybmVycnMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBzdGF0dXMgb2YgdGhlIGk4MjU4NidzIHJlY2VpdmUgdW5pdC4KKyAqLworc3RhdGljIHZvaWQgd3ZfcnVfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwkvKiBuZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7ICovCisKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiIyMjIyMgV2F2ZUxBTiBpODI1ODYgcmVjZWl2ZXIgdW5pdCBzdGF0dXM6ICMjIyMjXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicnU6Iik7CisJLyoKKwkgKiBOb3QgaW1wbGVtZW50ZWQgeWV0CisJICovCisJcHJpbnRrKCJcbiIpOworfQkJCQkvKiB3dl9ydV9zaG93ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBEaXNwbGF5IGluZm8gYWJvdXQgb25lIGNvbnRyb2wgYmxvY2sgb2YgdGhlIGk4MjU4NiBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkIHd2X2N1X3Nob3dfb25lKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBuZXRfbG9jYWwgKiBscCwgaW50IGksIHUxNiBwKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCWFjX3R4X3QgYWN0eDsKKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJcHJpbnRrKCIlZDogMHgleDoiLCBpLCBwKTsKKworCW9icmFtX3JlYWQoaW9hZGRyLCBwLCAodW5zaWduZWQgY2hhciAqKSAmYWN0eCwgc2l6ZW9mKGFjdHgpKTsKKwlwcmludGsoIiBzdGF0dXM9MHgleCwiLCBhY3R4LnR4X2guYWNfc3RhdHVzKTsKKwlwcmludGsoIiBjb21tYW5kPTB4JXgsIiwgYWN0eC50eF9oLmFjX2NvbW1hbmQpOworCisJLyoKKwkgICB7CisJICAgdGJkX3QgICAgICB0YmQ7CisKKwkgICBvYnJhbV9yZWFkKGlvYWRkciwgYWN0eC50eF90YmRfb2Zmc2V0LCAodW5zaWduZWQgY2hhciAqKSZ0YmQsIHNpemVvZih0YmQpKTsKKwkgICBwcmludGsoIiB0YmRfc3RhdHVzPTB4JXgsIiwgdGJkLnRiZF9zdGF0dXMpOworCSAgIH0KKwkgKi8KKworCXByaW50aygifCIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgc3RhdHVzIG9mIHRoZSBjb21tYW5kIHVuaXQgb2YgdGhlIGk4MjU4Ni4KKyAqLworc3RhdGljIHZvaWQgd3ZfY3Vfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgaW50IGk7CisJdTE2IHA7CisKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiIyMjIyMgV2F2ZUxBTiBpODI1ODYgY29tbWFuZCB1bml0IHN0YXR1czogIyMjIyNcbiIpOworCisJcHJpbnRrKEtFUk5fREVCVUcpOworCWZvciAoaSA9IDAsIHAgPSBscC0+dHhfZmlyc3RfaW5fdXNlOyBpIDwgTlRYQkxPQ0tTOyBpKyspIHsKKwkJd3ZfY3Vfc2hvd19vbmUoZGV2LCBscCwgaSwgcCk7CisKKwkJcCArPSBUWEJMT0NLWjsKKwkJaWYgKHAgPj0gT0ZGU0VUX0NVICsgTlRYQkxPQ0tTICogVFhCTE9DS1opCisJCQlwIC09IE5UWEJMT0NLUyAqIFRYQkxPQ0taOworCX0KKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYJCQkJLyogREVCVUdfSTgyNTg2X1NIT1cgKi8KKworI2lmZGVmIERFQlVHX0RFVklDRV9TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBzdGF0dXMgb2YgdGhlIFdhdmVMQU4gUENNQ0lBIGRldmljZSBkcml2ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHd2X2Rldl9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXByaW50ayhLRVJOX0RFQlVHICJkZXY6Iik7CisJcHJpbnRrKCIgc3RhdGU9JWxYLCIsIGRldi0+c3RhdGUpOworCXByaW50aygiIHRyYW5zX3N0YXJ0PSVsZCwiLCBkZXYtPnRyYW5zX3N0YXJ0KTsKKwlwcmludGsoIiBmbGFncz0weCV4LCIsIGRldi0+ZmxhZ3MpOworCXByaW50aygiXG4iKTsKK30JCQkJLyogd3ZfZGV2X3Nob3cgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgc3RhdHVzIG9mIHRoZSBXYXZlTEFOIFBDTUNJQSBkZXZpY2UgZHJpdmVyJ3MKKyAqIHByaXZhdGUgaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIHd2X2xvY2FsX3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJbmV0X2xvY2FsICpscDsKKworCWxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwlwcmludGsoS0VSTl9ERUJVRyAibG9jYWw6Iik7CisJcHJpbnRrKCIgdHhfbl9pbl91c2U9JWQsIiwgbHAtPnR4X25faW5fdXNlKTsKKwlwcmludGsoIiBoYWNyPTB4JXgsIiwgbHAtPmhhY3IpOworCXByaW50aygiIHJ4X2hlYWQ9MHgleCwiLCBscC0+cnhfaGVhZCk7CisJcHJpbnRrKCIgcnhfbGFzdD0weCV4LCIsIGxwLT5yeF9sYXN0KTsKKwlwcmludGsoIiB0eF9maXJzdF9mcmVlPTB4JXgsIiwgbHAtPnR4X2ZpcnN0X2ZyZWUpOworCXByaW50aygiIHR4X2ZpcnN0X2luX3VzZT0weCV4LCIsIGxwLT50eF9maXJzdF9pbl91c2UpOworCXByaW50aygiXG4iKTsKK30JCQkJLyogd3ZfbG9jYWxfc2hvdyAqLworI2VuZGlmCQkJCS8qIERFQlVHX0RFVklDRV9TSE9XICovCisKKyNpZiBkZWZpbmVkKERFQlVHX1JYX0lORk8pIHx8IGRlZmluZWQoREVCVUdfVFhfSU5GTykKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBEdW1wIHBhY2tldCBoZWFkZXIgKGFuZCBjb250ZW50IGlmIG5lY2Vzc2FyeSkgb24gdGhlIHNjcmVlbgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfcGFja2V0X2luZm8odTggKiBwLAkvKiBQYWNrZXQgdG8gZHVtcCAqLworCQkJCSAgaW50IGxlbmd0aCwJLyogTGVuZ3RoIG9mIHRoZSBwYWNrZXQgKi8KKwkJCQkgIGNoYXIgKm1zZzEsCS8qIE5hbWUgb2YgdGhlIGRldmljZSAqLworCQkJCSAgY2hhciAqbXNnMikKK3sJCQkJLyogTmFtZSBvZiB0aGUgZnVuY3Rpb24gKi8KKwlpbnQgaTsKKwlpbnQgbWF4aTsKKworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICIlczogJXMoKTogZGVzdCAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCwgbGVuZ3RoICVkXG4iLAorCSAgICAgICBtc2cxLCBtc2cyLCBwWzBdLCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdLCBsZW5ndGgpOworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICIlczogJXMoKTogc3JjICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYLCB0eXBlIDB4JTAyWCUwMlhcbiIsCisJICAgICAgIG1zZzEsIG1zZzIsIHBbNl0sIHBbN10sIHBbOF0sIHBbOV0sIHBbMTBdLCBwWzExXSwgcFsxMl0sCisJICAgICAgIHBbMTNdKTsKKworI2lmZGVmIERFQlVHX1BBQ0tFVF9EVU1QCisKKwlwcmludGsoS0VSTl9ERUJVRyAiZGF0YT1cIiIpOworCisJaWYgKChtYXhpID0gbGVuZ3RoKSA+IERFQlVHX1BBQ0tFVF9EVU1QKQorCQltYXhpID0gREVCVUdfUEFDS0VUX0RVTVA7CisJZm9yIChpID0gMTQ7IGkgPCBtYXhpOyBpKyspCisJCWlmIChwW2ldID49ICcgJyAmJiBwW2ldIDw9ICd+JykKKwkJCXByaW50aygiICVjIiwgcFtpXSk7CisJCWVsc2UKKwkJCXByaW50aygiJTAyWCIsIHBbaV0pOworCWlmIChtYXhpIDwgbGVuZ3RoKQorCQlwcmludGsoIi4uIik7CisJcHJpbnRrKCJcIlxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CisjZW5kaWYJCQkJLyogREVCVUdfUEFDS0VUX0RVTVAgKi8KK30KKyNlbmRpZgkJCQkvKiBkZWZpbmVkKERFQlVHX1JYX0lORk8pIHx8IGRlZmluZWQoREVCVUdfVFhfSU5GTykgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIHdoaWNoIGlzIGRpc3BsYXllZCBieSB0aGUgZHJpdmVyIGF0IHN0YXJ0dXAuCisgKiBUaGVyZSBhcmUgbG90cyBvZiBmbGFncyBmb3IgY29uZmlndXJpbmcgaXQgdG8geW91ciBsaWtpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3dl9pbml0X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXBzYV90IHBzYTsKKwlpbnQgaTsKKworCS8qIFJlYWQgdGhlIHBhcmFtZXRlciBzdG9yYWdlIGFyZWEgKi8KKwlwc2FfcmVhZChpb2FkZHIsIGxwLT5oYWNyLCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisKKyNpZmRlZiBERUJVR19QU0FfU0hPVworCXd2X3BzYV9zaG93KCZwc2EpOworI2VuZGlmCisjaWZkZWYgREVCVUdfTU1DX1NIT1cKKwl3dl9tbWNfc2hvdyhkZXYpOworI2VuZGlmCisjaWZkZWYgREVCVUdfSTgyNTg2X1NIT1cKKwl3dl9jdV9zaG93KGRldik7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0JBU0lDX1NIT1cKKwkvKiBOb3csIGxldCdzIGdvIGZvciB0aGUgYmFzaWMgc3R1ZmYuICovCisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogV2F2ZUxBTiBhdCAlI3gsIiwgZGV2LT5uYW1lLCBpb2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCBXQVZFTEFOX0FERFJfU0laRTsgaSsrKQorCQlwcmludGsoIiVzJTAyWCIsIChpID09IDApID8gIiAiIDogIjoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiwgSVJRICVkIiwgZGV2LT5pcnEpOworCisJLyogUHJpbnQgY3VycmVudCBuZXR3b3JrIElELiAqLworCWlmIChwc2EucHNhX253aWRfc2VsZWN0KQorCQlwcmludGsoIiwgbndpZCAweCUwMlgtJTAyWCIsIHBzYS5wc2FfbndpZFswXSwKKwkJICAgICAgIHBzYS5wc2FfbndpZFsxXSk7CisJZWxzZQorCQlwcmludGsoIiwgbndpZCBvZmYiKTsKKworCS8qIElmIDIuMDAgY2FyZCAqLworCWlmICghKG1tY19pbihpb2FkZHIsIG1tcm9mZigwLCBtbXJfZmVlX3N0YXR1cykpICYKKwkgICAgICAoTU1SX0ZFRV9TVEFUVVNfRFdMRCB8IE1NUl9GRUVfU1RBVFVTX0JVU1kpKSkgeworCQl1bnNpZ25lZCBzaG9ydCBmcmVxOworCisJCS8qIEFzayB0aGUgRUVQUk9NIHRvIHJlYWQgdGhlIGZyZXF1ZW5jeSBmcm9tIHRoZSBmaXJzdCBhcmVhLiAqLworCQlmZWVfcmVhZChpb2FkZHIsIDB4MDAsICZmcmVxLCAxKTsKKworCQkvKiBQcmludCBmcmVxdWVuY3kgKi8KKwkJcHJpbnRrKCIsIDIuMDAsICVsZCIsIChmcmVxID4+IDYpICsgMjQwMEwpOworCisJCS8qIEhhY2shICovCisJCWlmIChmcmVxICYgMHgyMCkKKwkJCXByaW50aygiLjUiKTsKKwl9IGVsc2UgeworCQlwcmludGsoIiwgUEMiKTsKKwkJc3dpdGNoIChwc2EucHNhX2NvbXBfbnVtYmVyKSB7CisJCWNhc2UgUFNBX0NPTVBfUENfQVRfOTE1OgorCQljYXNlIFBTQV9DT01QX1BDX0FUXzI0MDA6CisJCQlwcmludGsoIi1BVCIpOworCQkJYnJlYWs7CisJCWNhc2UgUFNBX0NPTVBfUENfTUNfOTE1OgorCQljYXNlIFBTQV9DT01QX1BDX01DXzI0MDA6CisJCQlwcmludGsoIi1NQyIpOworCQkJYnJlYWs7CisJCWNhc2UgUFNBX0NPTVBfUENNQ0lBXzkxNToKKwkJCXByaW50aygiTUNJQSIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoIj8iKTsKKwkJfQorCQlwcmludGsoIiwgIik7CisJCXN3aXRjaCAocHNhLnBzYV9zdWJiYW5kKSB7CisJCWNhc2UgUFNBX1NVQkJBTkRfOTE1OgorCQkJcHJpbnRrKCI5MTUiKTsKKwkJCWJyZWFrOworCQljYXNlIFBTQV9TVUJCQU5EXzI0MjU6CisJCQlwcmludGsoIjI0MjUiKTsKKwkJCWJyZWFrOworCQljYXNlIFBTQV9TVUJCQU5EXzI0NjA6CisJCQlwcmludGsoIjI0NjAiKTsKKwkJCWJyZWFrOworCQljYXNlIFBTQV9TVUJCQU5EXzI0ODQ6CisJCQlwcmludGsoIjI0ODQiKTsKKwkJCWJyZWFrOworCQljYXNlIFBTQV9TVUJCQU5EXzI0MzBfNToKKwkJCXByaW50aygiMjQzMC41Iik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiPyIpOworCQl9CisJfQorCisJcHJpbnRrKCIgTUh6XG4iKTsKKyNlbmRpZgkJCQkvKiBERUJVR19CQVNJQ19TSE9XICovCisKKyNpZmRlZiBERUJVR19WRVJTSU9OX1NIT1cKKwkvKiBQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisJcHJpbnRrKEtFUk5fTk9USUNFICIlcyIsIHZlcnNpb24pOworI2VuZGlmCit9CQkJCS8qIHd2X2luaXRfaW5mbyAqLworCisvKioqKioqKioqKioqKioqKioqKioqIElPQ1RMLCBTVEFUUyAmIFJFQ09ORklHICoqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBXZSBmb3VuZCBoZXJlIHJvdXRpbmVzIHRoYXQgYXJlIGNhbGxlZCBieSBMaW51eCBvbiBkaWZmZXJlbnQKKyAqIG9jY2FzaW9ucyBhZnRlciB0aGUgY29uZmlndXJhdGlvbiBhbmQgbm90IGZvciB0cmFuc21pdHRpbmcgZGF0YQorICogVGhlc2UgbWF5IGJlIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHVzZSBpZmNvbmZpZywgL3Byb2MvbmV0L2RldgorICogb3Igd2lyZWxlc3MgZXh0ZW5zaW9ucworICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgRXRoZXJuZXQgc3RhdGlzdGljcy4gVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlCisgKiBjYXJkIG9wZW4gb3IgY2xvc2VkLgorICogVXNlZCB3aGVuIHRoZSB1c2VyIHJlYWQgL3Byb2MvbmV0L2RldgorICovCitzdGF0aWMgZW5fc3RhdHMgKndhdmVsYW5fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworI2lmZGVmIERFQlVHX0lPQ1RMX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8PndhdmVsYW5fZ2V0X3N0YXRzKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCXJldHVybiAoJigobmV0X2xvY2FsICopIGRldi0+cHJpdiktPnN0YXRzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICogbnVtX2FkZHJzID09IC0xCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKyAqIG51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICogbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsCisgKgkJCWFuZCBkbyBiZXN0LWVmZm9ydCBmaWx0ZXJpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHdhdmVsYW5fc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworI2lmZGVmIERFQlVHX0lPQ1RMX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fc2V0X211bHRpY2FzdF9saXN0KClcbiIsCisJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiJXM6IHdhdmVsYW5fc2V0X211bHRpY2FzdF9saXN0KCk6IHNldHRpbmcgUnggbW9kZSAlMDJYIHRvICVkIGFkZHJlc3Nlcy5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgZGV2LT5mbGFncywgZGV2LT5tY19jb3VudCk7CisjZW5kaWYKKworCS8qIEFyZSB3ZSBhc2tpbmcgZm9yIHByb21pc2N1b3VzIG1vZGUsCisJICogb3IgYWxsIG11bHRpY2FzdCBhZGRyZXNzZXMgKHdlIGRvbid0IGhhdmUgdGhhdCEpCisJICogb3IgdG9vIG1hbnkgbXVsdGljYXN0IGFkZHJlc3NlcyBmb3IgdGhlIGhhcmR3YXJlIGZpbHRlcj8gKi8KKwlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgfHwKKwkgICAgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8CisJICAgIChkZXYtPm1jX2NvdW50ID4gSTgyNTg2X01BWF9NVUxUSUNBU1RfQUREUkVTU0VTKSkgeworCQkvKgorCQkgKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZTogcmVjZWl2ZSBhbGwgcGFja2V0cy4KKwkJICovCisJCWlmICghbHAtPnByb21pc2N1b3VzKSB7CisJCQlscC0+cHJvbWlzY3VvdXMgPSAxOworCQkJbHAtPm1jX2NvdW50ID0gMDsKKworCQkJd3ZfODI1ODZfcmVjb25maWcoZGV2KTsKKworCQkJLyogVGVsbCB0aGUga2VybmVsIHRoYXQgd2UgYXJlIGRvaW5nIGEgcmVhbGx5IGJhZCBqb2IuICovCisJCQlkZXYtPmZsYWdzIHw9IElGRl9QUk9NSVNDOworCQl9CisJfSBlbHNlCisJCS8qIEFyZSB0aGVyZSBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIHNlbmQ/ICovCisJaWYgKGRldi0+bWNfbGlzdCAhPSAoc3RydWN0IGRldl9tY19saXN0ICopIE5VTEwpIHsKKwkJLyoKKwkJICogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlLCBidXQgcmVjZWl2ZSBhbGwgcGFja2V0cworCQkgKiBpbiBtdWx0aWNhc3QgbGlzdAorCQkgKi8KKyNpZmRlZiBNVUxUSUNBU1RfQVZPSUQKKwkJaWYgKGxwLT5wcm9taXNjdW91cyB8fCAoZGV2LT5tY19jb3VudCAhPSBscC0+bWNfY291bnQpKQorI2VuZGlmCisJCXsKKwkJCWxwLT5wcm9taXNjdW91cyA9IDA7CisJCQlscC0+bWNfY291bnQgPSBkZXYtPm1jX2NvdW50OworCisJCQl3dl84MjU4Nl9yZWNvbmZpZyhkZXYpOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU3dpdGNoIHRvIG5vcm1hbCBtb2RlOiBkaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgYW5kIAorCQkgKiBjbGVhciB0aGUgbXVsdGljYXN0IGxpc3QuCisJCSAqLworCQlpZiAobHAtPnByb21pc2N1b3VzIHx8IGxwLT5tY19jb3VudCA9PSAwKSB7CisJCQlscC0+cHJvbWlzY3VvdXMgPSAwOworCQkJbHAtPm1jX2NvdW50ID0gMDsKKworCQkJd3ZfODI1ODZfcmVjb25maWcoZGV2KTsKKwkJfQorCX0KKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdCgpXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZXhpc3QuCisgKiAoTm90ZSA6IGl0IHdhcyBhIG5pY2Ugd2F5IHRvIHRlc3QgdGhlIHJlY29uZmlndXJlIHN0dWZmLi4uKQorICovCisjaWZkZWYgU0VUX01BQ19BRERSRVNTCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzb2NrYWRkciAqbWFjID0gYWRkcjsKKworCS8qIENvcHkgdGhlIGFkZHJlc3MuICovCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIG1hYy0+c2FfZGF0YSwgV0FWRUxBTl9BRERSX1NJWkUpOworCisJLyogUmVjb25maWd1cmUgdGhlIGJlYXN0LiAqLworCXd2XzgyNTg2X3JlY29uZmlnKGRldik7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkJCQkvKiBTRVRfTUFDX0FERFJFU1MgKi8KKworI2lmZGVmIFdJUkVMRVNTX0VYVAkJLyogaWYgd2lyZWxlc3MgZXh0ZW5zaW9ucyBleGlzdCBpbiB0aGUga2VybmVsICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGcmVxdWVuY3kgc2V0dGluZyAoZm9yIGhhcmR3YXJlIGNhcGFibGUgb2YgaXQpCisgKiBJdCdzIGEgYml0IGNvbXBsaWNhdGVkIGFuZCB5b3UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gbG9vayBpbnRvIGl0LgorICogKGNhbGxlZCBpbiB3YXZlbGFuX2lvY3RsKQorICovCitzdGF0aWMgaW5saW5lIGludCB3dl9zZXRfZnJlcXVlbmN5KHVuc2lnbmVkIGxvbmcgaW9hZGRyLAkvKiBJL08gcG9ydCBvZiB0aGUgY2FyZCAqLworCQkJCSAgIGl3X2ZyZXEgKiBmcmVxdWVuY3kpCit7CisJY29uc3QgaW50IEJBTkRfTlVNID0gMTA7CS8qIE51bWJlciBvZiBiYW5kcyAqLworCWxvbmcgZnJlcSA9IDBMOwkJLyogb2Zmc2V0IHRvIDIuNCBHSHogaW4gLjUgTUh6ICovCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCWludCBpOworI2VuZGlmCisKKwkvKiBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSAqLworCS8qIFRoZW9yZXRpY2FsbHksIHlvdSBtYXkgc2V0IGFueSBmcmVxdWVuY3kgYmV0d2VlbgorCSAqIHRoZSB0d28gbGltaXRzIHdpdGggYSAwLjUgTUh6IHByZWNpc2lvbi4gSW4gcHJhY3RpY2UsCisJICogSSBkb24ndCB3YW50IHlvdSB0byBoYXZlIHRyb3VibGUgd2l0aCBsb2NhbCByZWd1bGF0aW9ucy4KKwkgKi8KKwlpZiAoKGZyZXF1ZW5jeS0+ZSA9PSAxKSAmJgorCSAgICAoZnJlcXVlbmN5LT5tID49IChpbnQpIDIuNDEyZTgpCisJICAgICYmIChmcmVxdWVuY3ktPm0gPD0gKGludCkgMi40ODdlOCkpIHsKKwkJZnJlcSA9ICgoZnJlcXVlbmN5LT5tIC8gMTAwMDApIC0gMjQwMDBMKSAvIDU7CisJfQorCisJLyogU2V0dGluZyBieSBjaGFubmVsIChzYW1lIGFzIHdmcmVxc2VsKSAqLworCS8qIFdhcm5pbmc6IGVhY2ggY2hhbm5lbCBpcyAyMiBNSHogd2lkZSwgc28gc29tZSBvZiB0aGUgY2hhbm5lbHMKKwkgKiB3aWxsIGludGVyZmVyZS4gKi8KKwlpZiAoKGZyZXF1ZW5jeS0+ZSA9PSAwKSAmJiAoZnJlcXVlbmN5LT5tIDwgQkFORF9OVU0pKSB7CisJCS8qIEdldCBmcmVxdWVuY3kgb2Zmc2V0LiAqLworCQlmcmVxID0gY2hhbm5lbF9iYW5kc1tmcmVxdWVuY3ktPm1dID4+IDE7CisJfQorCisJLyogVmVyaWZ5IHRoYXQgdGhlIGZyZXF1ZW5jeSBpcyBhbGxvd2VkLiAqLworCWlmIChmcmVxICE9IDBMKSB7CisJCXUxNiB0YWJsZVsxMF07CS8qIEF1dGhvcml6ZWQgZnJlcXVlbmN5IHRhYmxlICovCisKKwkJLyogUmVhZCB0aGUgZnJlcXVlbmN5IHRhYmxlLiAqLworCQlmZWVfcmVhZChpb2FkZHIsIDB4NzEsIHRhYmxlLCAxMCk7CisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHICJGcmVxdWVuY3kgdGFibGU6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJcHJpbnRrKCIgJTA0WCIsIHRhYmxlW2ldKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisjZW5kaWYKKworCQkvKiBMb29rIGluIHRoZSB0YWJsZSB0byBzZWUgd2hldGhlciB0aGUgZnJlcXVlbmN5IGlzIGFsbG93ZWQuICovCisJCWlmICghKHRhYmxlWzkgLSAoKGZyZXEgLSAyNCkgLyAxNildICYKKwkJICAgICAgKDEgPDwgKChmcmVxIC0gMjQpICUgMTYpKSkpIHJldHVybiAtRUlOVkFMOwkvKiBub3QgYWxsb3dlZCAqLworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGlmIHdlIGdldCBhIHVzYWJsZSBmcmVxdWVuY3kgKi8KKwlpZiAoZnJlcSAhPSAwTCkgeworCQl1bnNpZ25lZCBzaG9ydCBhcmVhWzE2XTsKKwkJdW5zaWduZWQgc2hvcnQgZGFjWzJdOworCQl1bnNpZ25lZCBzaG9ydCBhcmVhX3ZlcmlmeVsxNl07CisJCXVuc2lnbmVkIHNob3J0IGRhY192ZXJpZnlbMl07CisJCS8qIENvcnJlc3BvbmRpbmcgZ2FpbiAoaW4gdGhlIHBvd2VyIGFkanVzdCB2YWx1ZSB0YWJsZSkKKwkJICogU2VlIEFUJlQgV2F2ZUxBTiBEYXRhIE1hbnVhbCwgUkVGIDQwNy0wMjQ2ODkvRSwgcGFnZSAzLTgKKwkJICogYW5kIFdDSU4wNjJELkRPQywgcGFnZSA2LjIuOS4gKi8KKwkJdW5zaWduZWQgc2hvcnQgcG93ZXJfbGltaXRbXSA9IHsgNDAsIDgwLCAxMjAsIDE2MCwgMCB9OworCQlpbnQgcG93ZXJfYmFuZCA9IDA7CS8qIFNlbGVjdGVkIGJhbmQgKi8KKwkJdW5zaWduZWQgc2hvcnQgcG93ZXJfYWRqdXN0OwkvKiBDb3JyZWN0IHZhbHVlICovCisKKwkJLyogU2VhcmNoIGZvciB0aGUgZ2Fpbi4gKi8KKwkJcG93ZXJfYmFuZCA9IDA7CisJCXdoaWxlICgoZnJlcSA+IHBvd2VyX2xpbWl0W3Bvd2VyX2JhbmRdKSAmJgorCQkgICAgICAgKHBvd2VyX2xpbWl0WysrcG93ZXJfYmFuZF0gIT0gMCkpOworCisJCS8qIFJlYWQgdGhlIGZpcnN0IGFyZWEuICovCisJCWZlZV9yZWFkKGlvYWRkciwgMHgwMCwgYXJlYSwgMTYpOworCisJCS8qIFJlYWQgdGhlIERBQy4gKi8KKwkJZmVlX3JlYWQoaW9hZGRyLCAweDYwLCBkYWMsIDIpOworCisJCS8qIFJlYWQgdGhlIG5ldyBwb3dlciBhZGp1c3QgdmFsdWUuICovCisJCWZlZV9yZWFkKGlvYWRkciwgMHg2QiAtIChwb3dlcl9iYW5kID4+IDEpLCAmcG93ZXJfYWRqdXN0LAorCQkJIDEpOworCQlpZiAocG93ZXJfYmFuZCAmIDB4MSkKKwkJCXBvd2VyX2FkanVzdCA+Pj0gODsKKwkJZWxzZQorCQkJcG93ZXJfYWRqdXN0ICY9IDB4RkY7CisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOIEVFUFJPTSBBcmVhIDE6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJcHJpbnRrKCIgJTA0WCIsIGFyZWFbaV0pOworCQl9CisJCXByaW50aygiXG4iKTsKKworCQlwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTiBFRVBST00gREFDOiAlMDRYICUwNFhcbiIsCisJCSAgICAgICBkYWNbMF0sIGRhY1sxXSk7CisjZW5kaWYKKworCQkvKiBGcmVxdWVuY3kgb2Zmc2V0IChmb3IgaW5mbyBvbmx5KSAqLworCQlhcmVhWzBdID0gKChmcmVxIDw8IDUpICYgMHhGRkUwKSB8IChhcmVhWzBdICYgMHgxRik7CisKKwkJLyogUmVjZWl2ZXIgUHJpbmNpcGxlIG1haW4gZGl2aWRlciBjb2VmZmljaWVudCAqLworCQlhcmVhWzNdID0gKGZyZXEgPj4gMSkgKyAyNDAwTCAtIDM1Mkw7CisJCWFyZWFbMl0gPSAoKGZyZXEgJiAweDEpIDw8IDQpIHwgKGFyZWFbMl0gJiAweEZGRUYpOworCisJCS8qIFRyYW5zbWl0dGVyIE1haW4gZGl2aWRlciBjb2VmZmljaWVudCAqLworCQlhcmVhWzEzXSA9IChmcmVxID4+IDEpICsgMjQwMEw7CisJCWFyZWFbMTJdID0gKChmcmVxICYgMHgxKSA8PCA0KSB8IChhcmVhWzJdICYgMHhGRkVGKTsKKworCQkvKiBPdGhlciBwYXJ0cyBvZiB0aGUgYXJlYSBhcmUgZmxhZ3MsIGJpdCBzdHJlYW1zIG9yIHVudXNlZC4gKi8KKworCQkvKiBTZXQgdGhlIHZhbHVlIGluIHRoZSBEQUMuICovCisJCWRhY1sxXSA9ICgocG93ZXJfYWRqdXN0ID4+IDEpICYgMHg3RikgfCAoZGFjWzFdICYgMHhGRjgwKTsKKwkJZGFjWzBdID0gKChwb3dlcl9hZGp1c3QgJiAweDEpIDw8IDQpIHwgKGRhY1swXSAmIDB4RkZFRik7CisKKwkJLyogV3JpdGUgdGhlIGZpcnN0IGFyZWEuICovCisJCWZlZV93cml0ZShpb2FkZHIsIDB4MDAsIGFyZWEsIDE2KTsKKworCQkvKiBXcml0ZSB0aGUgREFDLiAqLworCQlmZWVfd3JpdGUoaW9hZGRyLCAweDYwLCBkYWMsIDIpOworCisJCS8qIFdlIG5vdyBzaG91bGQgdmVyaWZ5IGhlcmUgdGhhdCB0aGUgd3JpdGluZyBvZiB0aGUgRUVQUk9NIHdlbnQgT0suICovCisKKwkJLyogUmVyZWFkIHRoZSBmaXJzdCBhcmVhLiAqLworCQlmZWVfcmVhZChpb2FkZHIsIDB4MDAsIGFyZWFfdmVyaWZ5LCAxNik7CisKKwkJLyogUmVyZWFkIHRoZSBEQUMuICovCisJCWZlZV9yZWFkKGlvYWRkciwgMHg2MCwgZGFjX3ZlcmlmeSwgMik7CisKKwkJLyogQ29tcGFyZS4gKi8KKwkJaWYgKG1lbWNtcChhcmVhLCBhcmVhX3ZlcmlmeSwgMTYgKiAyKSB8fAorCQkgICAgbWVtY21wKGRhYywgZGFjX3ZlcmlmeSwgMiAqIDIpKSB7CisjaWZkZWYgREVCVUdfSU9DVExfRVJST1IKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiV2F2ZUxBTjogd3Zfc2V0X2ZyZXF1ZW5jeTogdW5hYmxlIHRvIHdyaXRlIG5ldyBmcmVxdWVuY3kgdG8gRUVQUk9NKD8pLlxuIik7CisjZW5kaWYKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCisJCS8qIFdlIG11c3QgZG93bmxvYWQgdGhlIGZyZXF1ZW5jeSBwYXJhbWV0ZXJzIHRvIHRoZQorCQkgKiBzeW50aGVzaXplcnMgKGZyb20gdGhlIEVFUFJPTSAtIGFyZWEgMSkKKwkJICogTm90ZTogYXMgdGhlIEVFUFJPTSBpcyBhdXRvbWF0aWNhbGx5IGRlY3JlbWVudGVkLCB3ZSBzZXQgdGhlIGVuZAorCQkgKiBpZiB0aGUgYXJlYS4uLiAqLworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIDB4MEYpOworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksCisJCQlNTVdfRkVFX0NUUkxfUkVBRCB8IE1NV19GRUVfQ1RSTF9EV0xEKTsKKworCQkvKiBXYWl0IHVudGlsIHRoZSBkb3dubG9hZCBpcyBmaW5pc2hlZC4gKi8KKwkJZmVlX3dhaXQoaW9hZGRyLCAxMDAsIDEwMCk7CisKKwkJLyogV2UgbXVzdCBub3cgZG93bmxvYWQgdGhlIHBvd2VyIGFkanVzdCB2YWx1ZSAoZ2FpbikgdG8KKwkJICogdGhlIHN5bnRoZXNpemVycyAoZnJvbSB0aGUgRUVQUk9NIC0gYXJlYSA3IC0gREFDKS4gKi8KKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCAweDYxKTsKKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLAorCQkJTU1XX0ZFRV9DVFJMX1JFQUQgfCBNTVdfRkVFX0NUUkxfRFdMRCk7CisKKwkJLyogV2FpdCBmb3IgdGhlIGRvd25sb2FkIHRvIGZpbmlzaC4gKi8KKwkJZmVlX3dhaXQoaW9hZGRyLCAxMDAsIDEwMCk7CisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisJCS8qIFZlcmlmaWNhdGlvbiBvZiB3aGF0IHdlIGhhdmUgZG9uZSAqLworCisJCXByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOIEVFUFJPTSBBcmVhIDE6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJcHJpbnRrKCIgJTA0WCIsIGFyZWFfdmVyaWZ5W2ldKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU4gRUVQUk9NIERBQzogICUwNFggJTA0WFxuIiwKKwkJICAgICAgIGRhY192ZXJpZnlbMF0sIGRhY192ZXJpZnlbMV0pOworI2VuZGlmCisKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOwkvKiBCYWgsIG5ldmVyIGdldCB0aGVyZS4uLiAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2l2ZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZnJlcXVlbmNpZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHd2X2ZyZXF1ZW5jeV9saXN0KHVuc2lnbmVkIGxvbmcgaW9hZGRyLAkvKiBJL08gcG9ydCBvZiB0aGUgY2FyZCAqLworCQkJCSAgICBpd19mcmVxICogbGlzdCwJLyogTGlzdCBvZiBmcmVxdWVuY2llcyB0byBmaWxsICovCisJCQkJICAgIGludCBtYXgpCit7CQkJCS8qIE1heGltdW0gbnVtYmVyIG9mIGZyZXF1ZW5jaWVzICovCisJdTE2IHRhYmxlWzEwXTsJLyogQXV0aG9yaXplZCBmcmVxdWVuY3kgdGFibGUgKi8KKwlsb25nIGZyZXEgPSAwTDsJCS8qIG9mZnNldCB0byAyLjQgR0h6IGluIC41IE1IeiArIDEyIE1IeiAqLworCWludCBpOwkJCS8qIGluZGV4IGluIHRoZSB0YWJsZSAqLworCWludCBjID0gMDsJCS8qIENoYW5uZWwgbnVtYmVyICovCisKKwkvKiBSZWFkIHRoZSBmcmVxdWVuY3kgdGFibGUuICovCisJZmVlX3JlYWQoaW9hZGRyLCAweDcxIC8qIGZyZXF1ZW5jeSB0YWJsZSAqLyAsIHRhYmxlLCAxMCk7CisKKwkvKiBDaGVjayBhbGwgZnJlcXVlbmNpZXMuICovCisJaSA9IDA7CisJZm9yIChmcmVxID0gMDsgZnJlcSA8IDE1MDsgZnJlcSsrKQorCQkvKiBMb29rIGluIHRoZSB0YWJsZSBpZiB0aGUgZnJlcXVlbmN5IGlzIGFsbG93ZWQgKi8KKwkJaWYgKHRhYmxlWzkgLSAoZnJlcSAvIDE2KV0gJiAoMSA8PCAoZnJlcSAlIDE2KSkpIHsKKwkJCS8qIENvbXB1dGUgYXBwcm94aW1hdGUgY2hhbm5lbCBudW1iZXIgKi8KKwkJCXdoaWxlICgoKChjaGFubmVsX2JhbmRzW2NdID4+IDEpIC0gMjQpIDwgZnJlcSkgJiYKKwkJCSAgICAgICAoYyA8IE5FTFMoY2hhbm5lbF9iYW5kcykpKQorCQkJCWMrKzsKKwkJCWxpc3RbaV0uaSA9IGM7CS8qIFNldCB0aGUgbGlzdCBpbmRleCAqLworCisJCQkvKiBwdXQgaW4gdGhlIGxpc3QgKi8KKwkJCWxpc3RbaV0ubSA9ICgoKGZyZXEgKyAyNCkgKiA1KSArIDI0MDAwTCkgKiAxMDAwMDsKKwkJCWxpc3RbaSsrXS5lID0gMTsKKworCQkJLyogQ2hlY2sgbnVtYmVyLiAqLworCQkJaWYgKGkgPj0gbWF4KQorCQkJCXJldHVybiAoaSk7CisJCX0KKworCXJldHVybiAoaSk7Cit9CisKKyNpZmRlZiBJV19XSVJFTEVTU19TUFkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBHYXRoZXIgd2lyZWxlc3Mgc3B5IHN0YXRpc3RpY3M6ICBmb3IgZWFjaCBwYWNrZXQsIGNvbXBhcmUgdGhlIHNvdXJjZQorICogYWRkcmVzcyB3aXRoIG91ciBsaXN0LCBhbmQgaWYgdGhleSBtYXRjaCwgZ2V0IHRoZSBzdGF0aXN0aWNzLgorICogU29ycnksIGJ1dCB0aGlzIGZ1bmN0aW9uIHJlYWxseSBuZWVkcyB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdsX3NweV9nYXRoZXIoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsCisJCQkJIHU4ICoJbWFjLAkvKiBNQUMgYWRkcmVzcyAqLworCQkJCSB1OCAqCXN0YXRzKQkvKiBTdGF0aXN0aWNzIHRvIGdhdGhlciAqLworeworCXN0cnVjdCBpd19xdWFsaXR5IHdzdGF0czsKKworCXdzdGF0cy5xdWFsID0gc3RhdHNbMl0gJiBNTVJfU0dOTF9RVUFMOworCXdzdGF0cy5sZXZlbCA9IHN0YXRzWzBdICYgTU1SX1NJR05BTF9MVkw7CisJd3N0YXRzLm5vaXNlID0gc3RhdHNbMV0gJiBNTVJfU0lMRU5DRV9MVkw7CisJd3N0YXRzLnVwZGF0ZWQgPSAweDc7CisKKwkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KKwl3aXJlbGVzc19zcHlfdXBkYXRlKGRldiwgbWFjLCAmd3N0YXRzKTsKK30KKyNlbmRpZiAvKiBJV19XSVJFTEVTU19TUFkgKi8KKworI2lmZGVmIEhJU1RPR1JBTQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhIGhpc3RvZ3JhbSBvZiB0aGUgc2lnbmFsIGxldmVsLgorICogQXMgdGhlIG5vaXNlIGlzIHF1aXRlIGNvbnN0YW50LCBpdCdzIGxpa2UgZG9pbmcgaXQgb24gdGhlIFNOUi4KKyAqIFdlIGhhdmUgZGVmaW5lZCBhIHNldCBvZiBpbnRlcnZhbCAobHAtPmhpc19yYW5nZSksIGFuZCBlYWNoIHRpbWUKKyAqIHRoZSBsZXZlbCBnb2VzIGluIHRoYXQgaW50ZXJ2YWwsIHdlIGluY3JlbWVudCB0aGUgY291bnQgKGxwLT5oaXNfc3VtKS4KKyAqIFdpdGggdGhpcyBoaXN0b2dyYW0geW91IG1heSBkZXRlY3QgaWYgb25lIFdhdmVMQU4gaXMgcmVhbGx5IHdlYWssCisgKiBvciB5b3UgbWF5IGFsc28gY2FsY3VsYXRlIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGxldmVsLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd2xfaGlzX2dhdGhlcihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdTggKiBzdGF0cykKK3sJCQkJLyogU3RhdGlzdGljcyB0byBnYXRoZXIgKi8KKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdTggbGV2ZWwgPSBzdGF0c1swXSAmIE1NUl9TSUdOQUxfTFZMOworCWludCBpOworCisJLyogRmluZCB0aGUgY29ycmVjdCBpbnRlcnZhbC4gKi8KKwlpID0gMDsKKwl3aGlsZSAoKGkgPCAobHAtPmhpc19udW1iZXIgLSAxKSkKKwkgICAgICAgJiYgKGxldmVsID49IGxwLT5oaXNfcmFuZ2VbaSsrXSkpOworCisJLyogSW5jcmVtZW50IGludGVydmFsIGNvdW50ZXIuICovCisJKGxwLT5oaXNfc3VtW2ldKSsrOworfQorI2VuZGlmIC8qIEhJU1RPR1JBTSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBwcm90b2NvbCBuYW1lCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlzdHJjcHkod3JxdS0+bmFtZSwgIldhdmVMQU4iKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgTldJRAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X253aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKwlwc2FfdCBwc2E7CisJbW1fdCBtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIFNldCBOV0lEIGluIFdhdmVMQU4uICovCisJaWYgKCF3cnF1LT5ud2lkLmRpc2FibGVkKSB7CisJCS8qIFNldCBOV0lEIGluIHBzYSAqLworCQlwc2EucHNhX253aWRbMF0gPSAod3JxdS0+bndpZC52YWx1ZSAmIDB4RkYwMCkgPj4gODsKKwkJcHNhLnBzYV9ud2lkWzFdID0gd3JxdS0+bndpZC52YWx1ZSAmIDB4RkY7CisJCXBzYS5wc2FfbndpZF9zZWxlY3QgPSAweDAxOworCQlwc2Ffd3JpdGUoaW9hZGRyLCBscC0+aGFjciwKKwkJCSAgKGNoYXIgKikgcHNhLnBzYV9ud2lkIC0gKGNoYXIgKikgJnBzYSwKKwkJCSAgKHVuc2lnbmVkIGNoYXIgKikgcHNhLnBzYV9ud2lkLCAzKTsKKworCQkvKiBTZXQgTldJRCBpbiBtbWMuICovCisJCW0udy5tbXdfbmV0d19pZF9sID0gcHNhLnBzYV9ud2lkWzFdOworCQltLncubW13X25ldHdfaWRfaCA9IHBzYS5wc2FfbndpZFswXTsKKwkJbW1jX3dyaXRlKGlvYWRkciwKKwkJCSAgKGNoYXIgKikgJm0udy5tbXdfbmV0d19pZF9sIC0KKwkJCSAgKGNoYXIgKikgJm0sCisJCQkgICh1bnNpZ25lZCBjaGFyICopICZtLncubW13X25ldHdfaWRfbCwgMik7CisJCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2xvb3B0X3NlbCksIDB4MDApOworCX0gZWxzZSB7CisJCS8qIERpc2FibGUgTldJRCBpbiB0aGUgcHNhLiAqLworCQlwc2EucHNhX253aWRfc2VsZWN0ID0gMHgwMDsKKwkJcHNhX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IsCisJCQkgIChjaGFyICopICZwc2EucHNhX253aWRfc2VsZWN0IC0KKwkJCSAgKGNoYXIgKikgJnBzYSwKKwkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfbndpZF9zZWxlY3QsCisJCQkgIDEpOworCisJCS8qIERpc2FibGUgTldJRCBpbiB0aGUgbW1jIChubyBmaWx0ZXJpbmcpLiAqLworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19sb29wdF9zZWwpLAorCQkJTU1XX0xPT1BUX1NFTF9ESVNfTldJRCk7CisJfQorCS8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworCXVwZGF0ZV9wc2FfY2hlY2tzdW0oZGV2LCBpb2FkZHIsIGxwLT5oYWNyKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgTldJRCAKKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9ud2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIFJlYWQgdGhlIE5XSUQuICovCisJcHNhX3JlYWQoaW9hZGRyLCBscC0+aGFjciwKKwkJIChjaGFyICopIHBzYS5wc2FfbndpZCAtIChjaGFyICopICZwc2EsCisJCSAodW5zaWduZWQgY2hhciAqKSBwc2EucHNhX253aWQsIDMpOworCXdycXUtPm53aWQudmFsdWUgPSAocHNhLnBzYV9ud2lkWzBdIDw8IDgpICsgcHNhLnBzYV9ud2lkWzFdOworCXdycXUtPm53aWQuZGlzYWJsZWQgPSAhKHBzYS5wc2FfbndpZF9zZWxlY3QpOworCXdycXUtPm53aWQuZml4ZWQgPSAxOwkvKiBTdXBlcmZsdW91cyAqLworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKS4gKi8KKwlpZiAoIShtbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisJICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpCisJCXJldCA9IHd2X3NldF9mcmVxdWVuY3koaW9hZGRyLCAmKHdycXUtPmZyZXEpKTsKKwllbHNlCisJCXJldCA9IC1FT1BOT1RTVVBQOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIEF0dGVtcHQgdG8gcmVjb2duaXNlIDIuMDAgY2FyZHMgKDIuNCBHSHogZnJlcXVlbmN5IHNlbGVjdGFibGUpLgorCSAqIERvZXMgaXQgd29yayBmb3IgZXZlcnlib2R5LCBlc3BlY2lhbGx5IG9sZCBjYXJkcz8gKi8KKwlpZiAoIShtbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisJICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpIHsKKwkJdW5zaWduZWQgc2hvcnQgZnJlcTsKKworCQkvKiBBc2sgdGhlIEVFUFJPTSB0byByZWFkIHRoZSBmcmVxdWVuY3kgZnJvbSB0aGUgZmlyc3QgYXJlYS4gKi8KKwkJZmVlX3JlYWQoaW9hZGRyLCAweDAwLCAmZnJlcSwgMSk7CisJCXdycXUtPmZyZXEubSA9ICgoZnJlcSA+PiA1KSAqIDUgKyAyNDAwMEwpICogMTAwMDA7CisJCXdycXUtPmZyZXEuZSA9IDE7CisJfSBlbHNlIHsKKwkJcHNhX3JlYWQoaW9hZGRyLCBscC0+aGFjciwKKwkJCSAoY2hhciAqKSAmcHNhLnBzYV9zdWJiYW5kIC0gKGNoYXIgKikgJnBzYSwKKwkJCSAodW5zaWduZWQgY2hhciAqKSAmcHNhLnBzYV9zdWJiYW5kLCAxKTsKKworCQlpZiAocHNhLnBzYV9zdWJiYW5kIDw9IDQpIHsKKwkJCXdycXUtPmZyZXEubSA9IGZpeGVkX2JhbmRzW3BzYS5wc2Ffc3ViYmFuZF07CisJCQl3cnF1LT5mcmVxLmUgPSAocHNhLnBzYV9zdWJiYW5kICE9IDApOworCQl9IGVsc2UKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgbGV2ZWwgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBTZXQgdGhlIGxldmVsIHRocmVzaG9sZC4gKi8KKwkvKiBXZSBzaG91bGQgY29tcGxhaW4gbG91ZGx5IGlmIHdycXUtPnNlbnMuZml4ZWQgPSAwLCBiZWNhdXNlIHdlCisJICogY2FuJ3Qgc2V0IGF1dG8gbW9kZS4uLiAqLworCXBzYS5wc2FfdGhyX3ByZV9zZXQgPSB3cnF1LT5zZW5zLnZhbHVlICYgMHgzRjsKKwlwc2Ffd3JpdGUoaW9hZGRyLCBscC0+aGFjciwKKwkJICAoY2hhciAqKSAmcHNhLnBzYV90aHJfcHJlX3NldCAtIChjaGFyICopICZwc2EsCisJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfdGhyX3ByZV9zZXQsIDEpOworCS8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworCXVwZGF0ZV9wc2FfY2hlY2tzdW0oZGV2LCBpb2FkZHIsIGxwLT5oYWNyKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td190aHJfcHJlX3NldCksCisJCXBzYS5wc2FfdGhyX3ByZV9zZXQpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBsZXZlbCB0aHJlc2hvbGQKKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIFJlYWQgdGhlIGxldmVsIHRocmVzaG9sZC4gKi8KKwlwc2FfcmVhZChpb2FkZHIsIGxwLT5oYWNyLAorCQkgKGNoYXIgKikgJnBzYS5wc2FfdGhyX3ByZV9zZXQgLSAoY2hhciAqKSAmcHNhLAorCQkgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfdGhyX3ByZV9zZXQsIDEpOworCXdycXUtPnNlbnMudmFsdWUgPSBwc2EucHNhX3Rocl9wcmVfc2V0ICYgMHgzRjsKKwl3cnF1LT5zZW5zLmZpeGVkID0gMTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgZW5jcnlwdGlvbiBrZXkKKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICAgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXBzYV90IHBzYTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBpZiBjYXBhYmxlIG9mIGVuY3J5cHRpb24gKi8KKwlpZiAoIW1tY19lbmNyKGlvYWRkcikpIHsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCisJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGtleSAqLworCWlmKCh3cnF1LT5lbmNvZGluZy5sZW5ndGggIT0gOCkgJiYgKHdycXUtPmVuY29kaW5nLmxlbmd0aCAhPSAwKSkgeworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCWlmKCFyZXQpIHsKKwkJLyogQmFzaWMgY2hlY2tpbmcuLi4gKi8KKwkJaWYgKHdycXUtPmVuY29kaW5nLmxlbmd0aCA9PSA4KSB7CisJCQkvKiBDb3B5IHRoZSBrZXkgaW4gdGhlIGRyaXZlciAqLworCQkJbWVtY3B5KHBzYS5wc2FfZW5jcnlwdGlvbl9rZXksIGV4dHJhLAorCQkJICAgICAgIHdycXUtPmVuY29kaW5nLmxlbmd0aCk7CisJCQlwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0ID0gMTsKKworCQkJcHNhX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IsCisJCQkJICAoY2hhciAqKSAmcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCAtCisJCQkJICAoY2hhciAqKSAmcHNhLAorCQkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS4KKwkJCQkgIHBzYV9lbmNyeXB0aW9uX3NlbGVjdCwgOCArIDEpOworCisJCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19lbmNyX2VuYWJsZSksCisJCQkJTU1XX0VOQ1JfRU5BQkxFX0VOIHwgTU1XX0VOQ1JfRU5BQkxFX01PREUpOworCQkJbW1jX3dyaXRlKGlvYWRkciwgbW13b2ZmKDAsIG1td19lbmNyX2tleSksCisJCQkJICAodW5zaWduZWQgY2hhciAqKSAmcHNhLgorCQkJCSAgcHNhX2VuY3J5cHRpb25fa2V5LCA4KTsKKwkJfQorCisJCS8qIGRpc2FibGUgZW5jcnlwdGlvbiAqLworCQlpZiAod3JxdS0+ZW5jb2RpbmcuZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwkJCXBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgPSAwOworCQkJcHNhX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IsCisJCQkJICAoY2hhciAqKSAmcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCAtCisJCQkJICAoY2hhciAqKSAmcHNhLAorCQkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS4KKwkJCQkgIHBzYV9lbmNyeXB0aW9uX3NlbGVjdCwgMSk7CisKKwkJCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2VuY3JfZW5hYmxlKSwgMCk7CisJCX0KKwkJLyogdXBkYXRlIHRoZSBXYXZlbGFuIGNoZWNrc3VtICovCisJCXVwZGF0ZV9wc2FfY2hlY2tzdW0oZGV2LCBpb2FkZHIsIGxwLT5oYWNyKTsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IGVuY3J5cHRpb24ga2V5CisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIENoZWNrIGlmIGVuY3J5cHRpb24gaXMgYXZhaWxhYmxlICovCisJaWYgKCFtbWNfZW5jcihpb2FkZHIpKSB7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0gZWxzZSB7CisJCS8qIFJlYWQgdGhlIGVuY3J5cHRpb24ga2V5ICovCisJCXBzYV9yZWFkKGlvYWRkciwgbHAtPmhhY3IsCisJCQkgKGNoYXIgKikgJnBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgLQorCQkJIChjaGFyICopICZwc2EsCisJCQkgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS4KKwkJCSBwc2FfZW5jcnlwdGlvbl9zZWxlY3QsIDEgKyA4KTsKKworCQkvKiBlbmNyeXB0aW9uIGlzIGVuYWJsZWQgPyAqLworCQlpZiAocHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCkKKwkJCXdycXUtPmVuY29kaW5nLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCWVsc2UKKwkJCXdycXUtPmVuY29kaW5nLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQl3cnF1LT5lbmNvZGluZy5mbGFncyB8PSBtbWNfZW5jcihpb2FkZHIpOworCisJCS8qIENvcHkgdGhlIGtleSB0byB0aGUgdXNlciBidWZmZXIgKi8KKwkJd3JxdS0+ZW5jb2RpbmcubGVuZ3RoID0gODsKKwkJbWVtY3B5KGV4dHJhLCBwc2EucHNhX2VuY3J5cHRpb25fa2V5LCB3cnF1LT5lbmNvZGluZy5sZW5ndGgpOworCX0KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgcmFuZ2UgaW5mbworICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFNldCB0aGUgbGVuZ3RoICh2ZXJ5IGltcG9ydGFudCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgKi8KKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCisJLyogU2V0IGFsbCB0aGUgaW5mbyB3ZSBkb24ndCBjYXJlIG9yIGRvbid0IGtub3cgYWJvdXQgdG8gemVybyAqLworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOworCisJLyogU2V0IHRoZSBXaXJlbGVzcyBFeHRlbnNpb24gdmVyc2lvbnMgKi8KKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSA5OworCisJLyogU2V0IGluZm9ybWF0aW9uIGluIHRoZSByYW5nZSBzdHJ1Y3QuICAqLworCXJhbmdlLT50aHJvdWdocHV0ID0gMS42ICogMTAwMCAqIDEwMDA7CS8qIGRvbid0IGFyZ3VlIG9uIHRoaXMgISAqLworCXJhbmdlLT5taW5fbndpZCA9IDB4MDAwMDsKKwlyYW5nZS0+bWF4X253aWQgPSAweEZGRkY7CisKKwlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAweDNGOworCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gTU1SX1NHTkxfUVVBTDsKKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSBNTVJfU0lHTkFMX0xWTDsKKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSBNTVJfU0lMRU5DRV9MVkw7CisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSBNTVJfU0dOTF9RVUFMOyAvKiBBbHdheXMgbWF4ICovCisJLyogTmVlZCB0byBnZXQgYmV0dGVyIHZhbHVlcyBmb3IgdGhvc2UgdHdvICovCisJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMzA7CisJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gODsKKworCXJhbmdlLT5udW1fYml0cmF0ZXMgPSAxOworCXJhbmdlLT5iaXRyYXRlWzBdID0gMjAwMDAwMDsJLyogMiBNYi9zICovCisKKwkvKiBFdmVudCBjYXBhYmlsaXR5IChrZXJuZWwgKyBkcml2ZXIpICovCisJcmFuZ2UtPmV2ZW50X2NhcGFbMF0gPSAoSVdfRVZFTlRfQ0FQQV9NQVNLKDB4OEIwMikgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSygweDhCMDQpKTsKKwlyYW5nZS0+ZXZlbnRfY2FwYVsxXSA9IElXX0VWRU5UX0NBUEFfS18xOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKS4gKi8KKwlpZiAoIShtbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisJICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpIHsKKwkJcmFuZ2UtPm51bV9jaGFubmVscyA9IDEwOworCQlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IHd2X2ZyZXF1ZW5jeV9saXN0KGlvYWRkciwgcmFuZ2UtPmZyZXEsCisJCQkJCQkJSVdfTUFYX0ZSRVFVRU5DSUVTKTsKKwl9IGVsc2UKKwkJcmFuZ2UtPm51bV9jaGFubmVscyA9IHJhbmdlLT5udW1fZnJlcXVlbmN5ID0gMDsKKworCS8qIEVuY3J5cHRpb24gc3VwcG9ydGVkID8gKi8KKwlpZiAobW1jX2VuY3IoaW9hZGRyKSkgeworCQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDg7CS8qIERFUyA9IDY0IGJpdHMga2V5ICovCisJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAxOworCQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDE7CS8qIE9ubHkgb25lIGtleSBwb3NzaWJsZSAqLworCX0gZWxzZSB7CisJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAwOworCQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDA7CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogc2V0IHF1YWxpdHkgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfcXRocihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwlwc2EucHNhX3F1YWxpdHlfdGhyID0gKihleHRyYSkgJiAweDBGOworCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkgIChjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyIC0gKGNoYXIgKikgJnBzYSwKKwkJICAodW5zaWduZWQgY2hhciAqKSAmcHNhLnBzYV9xdWFsaXR5X3RociwgMSk7CisJLyogdXBkYXRlIHRoZSBXYXZlbGFuIGNoZWNrc3VtICovCisJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYsIGlvYWRkciwgbHAtPmhhY3IpOworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X3F1YWxpdHlfdGhyKSwKKwkJcHNhLnBzYV9xdWFsaXR5X3Rocik7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogZ2V0IHF1YWxpdHkgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfcXRocihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwlwc2FfcmVhZChpb2FkZHIsIGxwLT5oYWNyLAorCQkgKGNoYXIgKikgJnBzYS5wc2FfcXVhbGl0eV90aHIgLSAoY2hhciAqKSAmcHNhLAorCQkgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfcXVhbGl0eV90aHIsIDEpOworCSooZXh0cmEpID0gcHNhLnBzYV9xdWFsaXR5X3RociAmIDB4MEY7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgSElTVE9HUkFNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogc2V0IGhpc3RvZ3JhbQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X2hpc3RvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgIGNoYXIgKmV4dHJhKQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCisJLyogQ2hlY2sgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMuICovCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gMTYpIHsKKwkJcmV0dXJuKC1FMkJJRyk7CisJfQorCisJLyogRGlzYWJsZSBoaXN0byB3aGlsZSB3ZSBjb3B5IHRoZSBhZGRyZXNzZXMuCisJICogQXMgd2UgZG9uJ3QgZGlzYWJsZSBpbnRlcnJ1cHRzLCB3ZSBuZWVkIHRvIGRvIHRoaXMgKi8KKwlscC0+aGlzX251bWJlciA9IDA7CisKKwkvKiBBcmUgdGhlcmUgcmFuZ2VzIHRvIGNvcHk/ICovCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gMCkgeworCQkvKiBDb3B5IGludGVydmFsIHJhbmdlcyB0byB0aGUgZHJpdmVyICovCisJCW1lbWNweShscC0+aGlzX3JhbmdlLCBleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgpOworCisJCXsKKwkJICBpbnQgaTsKKwkJICBwcmludGsoS0VSTl9ERUJVRyAiSGlzdG8gOiIpOworCQkgIGZvcihpID0gMDsgaSA8IHdycXUtPmRhdGEubGVuZ3RoOyBpKyspCisJCSAgICBwcmludGsoIiAlZCIsIGxwLT5oaXNfcmFuZ2VbaV0pOworCQkgIHByaW50aygiXG4iKTsKKwkJfQorCisJCS8qIFJlc2V0IHJlc3VsdCBzdHJ1Y3R1cmUuICovCisJCW1lbXNldChscC0+aGlzX3N1bSwgMHgwMCwgc2l6ZW9mKGxvbmcpICogMTYpOworCX0KKworCS8qIE5vdyB3ZSBjYW4gc2V0IHRoZSBudW1iZXIgb2YgcmFuZ2VzICovCisJbHAtPmhpc19udW1iZXIgPSB3cnF1LT5kYXRhLmxlbmd0aDsKKworCXJldHVybigwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IGdldCBoaXN0b2dyYW0KKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9oaXN0byhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKworCS8qIFNldCB0aGUgbnVtYmVyIG9mIGludGVydmFscy4gKi8KKwl3cnF1LT5kYXRhLmxlbmd0aCA9IGxwLT5oaXNfbnVtYmVyOworCisJLyogR2l2ZSBiYWNrIHRoZSBkaXN0cmlidXRpb24gc3RhdGlzdGljcyAqLworCWlmKGxwLT5oaXNfbnVtYmVyID4gMCkKKwkJbWVtY3B5KGV4dHJhLCBscC0+aGlzX3N1bSwgc2l6ZW9mKGxvbmcpICogbHAtPmhpc19udW1iZXIpOworCisJcmV0dXJuKDApOworfQorI2VuZGlmCQkJLyogSElTVE9HUkFNICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTdHJ1Y3R1cmVzIHRvIGV4cG9ydCB0aGUgV2lyZWxlc3MgSGFuZGxlcnMKKyAqLworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJd2F2ZWxhbl9oYW5kbGVyW10gPQoreworCU5VTEwsCQkJCS8qIFNJT0NTSVdOQU1FICovCisJd2F2ZWxhbl9nZXRfbmFtZSwJCS8qIFNJT0NHSVdOQU1FICovCisJd2F2ZWxhbl9zZXRfbndpZCwJCS8qIFNJT0NTSVdOV0lEICovCisJd2F2ZWxhbl9nZXRfbndpZCwJCS8qIFNJT0NHSVdOV0lEICovCisJd2F2ZWxhbl9zZXRfZnJlcSwJCS8qIFNJT0NTSVdGUkVRICovCisJd2F2ZWxhbl9nZXRfZnJlcSwJCS8qIFNJT0NHSVdGUkVRICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV01PREUgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXTU9ERSAqLworCXdhdmVsYW5fc2V0X3NlbnMsCQkvKiBTSU9DU0lXU0VOUyAqLworCXdhdmVsYW5fZ2V0X3NlbnMsCQkvKiBTSU9DR0lXU0VOUyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSQU5HRSAqLworCXdhdmVsYW5fZ2V0X3JhbmdlLAkJLyogU0lPQ0dJV1JBTkdFICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1BSSVYgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUFJJViAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdTVEFUUyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdTVEFUUyAqLworCWl3X2hhbmRsZXJfc2V0X3NweSwJCS8qIFNJT0NTSVdTUFkgKi8KKwlpd19oYW5kbGVyX2dldF9zcHksCQkvKiBTSU9DR0lXU1BZICovCisJaXdfaGFuZGxlcl9zZXRfdGhyc3B5LAkJLyogU0lPQ1NJV1RIUlNQWSAqLworCWl3X2hhbmRsZXJfZ2V0X3RocnNweSwJCS8qIFNJT0NHSVdUSFJTUFkgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXQVAgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXQVAgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0FQTElTVCAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0VTU0lEICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0VTU0lEICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV05JQ0tOICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV05JQ0tOICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXUkFURSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdSQVRFICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JUUyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdSVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXRlJBRyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdGUkFHICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1RYUE9XICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1RYUE9XICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JFVFJZICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1JFVFJZICovCisJLyogQnVtbWVyICEgV2h5IHRob3NlIGFyZSBvbmx5IGF0IHRoZSBlbmQgPz8/ICovCisJd2F2ZWxhbl9zZXRfZW5jb2RlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLworCXdhdmVsYW5fZ2V0X2VuY29kZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KK307CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCQl3YXZlbGFuX3ByaXZhdGVfaGFuZGxlcltdID0KK3sKKwl3YXZlbGFuX3NldF9xdGhyLAkJLyogU0lPQ0lXRklSU1RQUklWICovCisJd2F2ZWxhbl9nZXRfcXRociwJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDEgKi8KKyNpZmRlZiBISVNUT0dSQU0KKwl3YXZlbGFuX3NldF9oaXN0bywJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDIgKi8KKwl3YXZlbGFuX2dldF9oaXN0bywJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDMgKi8KKyNlbmRpZgkvKiBISVNUT0dSQU0gKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIHdhdmVsYW5fcHJpdmF0ZV9hcmdzW10gPSB7CisvKnsgY21kLCAgICAgICAgIHNldF9hcmdzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYXJncywgbmFtZSB9ICovCisgIHsgU0lPQ1NJUFFUSFIsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldHF1YWx0aHIiIH0sCisgIHsgU0lPQ0dJUFFUSFIsIDAsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldHF1YWx0aHIiIH0sCisgIHsgU0lPQ1NJUEhJU1RPLCBJV19QUklWX1RZUEVfQllURSB8IDE2LCAgICAgICAgICAgICAgICAgICAgMCwgInNldGhpc3RvIiB9LAorICB7IFNJT0NHSVBISVNUTywgMCwgICAgICAgICAgICAgICAgICAgICBJV19QUklWX1RZUEVfSU5UIHwgMTYsICJnZXRoaXN0byIgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYJd2F2ZWxhbl9oYW5kbGVyX2RlZiA9Cit7CisJLm51bV9zdGFuZGFyZAk9IHNpemVvZih3YXZlbGFuX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGUJPSBzaXplb2Yod2F2ZWxhbl9wcml2YXRlX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZih3YXZlbGFuX3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorCS5zdGFuZGFyZAk9IHdhdmVsYW5faGFuZGxlciwKKwkucHJpdmF0ZQk9IHdhdmVsYW5fcHJpdmF0ZV9oYW5kbGVyLAorCS5wcml2YXRlX2FyZ3MJPSB3YXZlbGFuX3ByaXZhdGVfYXJncywKKwkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gd2F2ZWxhbl9nZXRfd2lyZWxlc3Nfc3RhdHMsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2V0IHdpcmVsZXNzIHN0YXRpc3RpY3MuCisgKiBDYWxsZWQgYnkgL3Byb2MvbmV0L3dpcmVsZXNzCisgKi8KK3N0YXRpYyBpd19zdGF0cyAqd2F2ZWxhbl9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJbW1yX3QgbTsKKwlpd19zdGF0cyAqd3N0YXRzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX2dldF93aXJlbGVzc19zdGF0cygpXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKiBDaGVjayAqLworCWlmIChscCA9PSAobmV0X2xvY2FsICopIE5VTEwpCisJCXJldHVybiAoaXdfc3RhdHMgKikgTlVMTDsKKwkKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCXdzdGF0cyA9ICZscC0+d3N0YXRzOworCisJLyogR2V0IGRhdGEgZnJvbSB0aGUgbW1jLiAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZyZWV6ZSksIDEpOworCisJbW1jX3JlYWQoaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2RjZV9zdGF0dXMpLCAmbS5tbXJfZGNlX3N0YXR1cywgMSk7CisJbW1jX3JlYWQoaW9hZGRyLCBtbXJvZmYoMCwgbW1yX3dyb25nX253aWRfbCksICZtLm1tcl93cm9uZ19ud2lkX2wsCisJCSAyKTsKKwltbWNfcmVhZChpb2FkZHIsIG1tcm9mZigwLCBtbXJfdGhyX3ByZV9zZXQpLCAmbS5tbXJfdGhyX3ByZV9zZXQsCisJCSA0KTsKKworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZyZWV6ZSksIDApOworCisJLyogQ29weSBkYXRhIHRvIHdpcmVsZXNzIHN0dWZmLiAqLworCXdzdGF0cy0+c3RhdHVzID0gbS5tbXJfZGNlX3N0YXR1cyAmIE1NUl9EQ0VfU1RBVFVTOworCXdzdGF0cy0+cXVhbC5xdWFsID0gbS5tbXJfc2dubF9xdWFsICYgTU1SX1NHTkxfUVVBTDsKKwl3c3RhdHMtPnF1YWwubGV2ZWwgPSBtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkw7CisJd3N0YXRzLT5xdWFsLm5vaXNlID0gbS5tbXJfc2lsZW5jZV9sdmwgJiBNTVJfU0lMRU5DRV9MVkw7CisJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSAoKChtLiBtbXJfc2lnbmFsX2x2bCAmIE1NUl9TSUdOQUxfTFZMX1ZBTElEKSA+PiA3KSAKKwkJCXwgKChtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkxfVkFMSUQpID4+IDYpIAorCQkJfCAoKG0ubW1yX3NpbGVuY2VfbHZsICYgTU1SX1NJTEVOQ0VfTFZMX1ZBTElEKSA+PiA1KSk7CisJd3N0YXRzLT5kaXNjYXJkLm53aWQgKz0gKG0ubW1yX3dyb25nX253aWRfaCA8PCA4KSB8IG0ubW1yX3dyb25nX253aWRfbDsKKwl3c3RhdHMtPmRpc2NhcmQuY29kZSA9IDBMOworCXdzdGF0cy0+ZGlzY2FyZC5taXNjID0gMEw7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworI2lmZGVmIERFQlVHX0lPQ1RMX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKClcbiIsCisJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gJmxwLT53c3RhdHM7Cit9CisjZW5kaWYJCQkJLyogV0lSRUxFU1NfRVhUICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFBBQ0tFVCBSRUNFUFRJT04gKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIHBhcnQgZGVhbHMgd2l0aCByZWNlaXZpbmcgdGhlIHBhY2tldHMuCisgKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZ2V0cyBhbiBpbnRlcnJ1cHQgd2hlbiBhIHBhY2tldCBoYXMgYmVlbgorICogc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGFuZCBjYWxscyB0aGlzIHBhcnQuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgcm91dGluZSBkb2VzIHRoZSBhY3R1YWwgY29weWluZyBvZiBkYXRhIChpbmNsdWRpbmcgdGhlIEV0aGVybmV0CisgKiBoZWFkZXIgc3RydWN0dXJlKSBmcm9tIHRoZSBXYXZlTEFOIGNhcmQgdG8gYW4gc2tfYnVmZiBjaGFpbiB0aGF0CisgKiB3aWxsIGJlIHBhc3NlZCB1cCB0byB0aGUgbmV0d29yayBpbnRlcmZhY2UgbGF5ZXIuIE5PVEU6IHdlCisgKiBjdXJyZW50bHkgZG9uJ3QgaGFuZGxlIHRyYWlsZXIgcHJvdG9jb2xzIChuZWl0aGVyIGRvZXMgdGhlIHJlc3Qgb2YKKyAqIHRoZSBuZXR3b3JrIGludGVyZmFjZSksIHNvIGlmIHRoYXQgaXMgbmVlZGVkLCBpdCB3aWxsIChhdCBsZWFzdCBpbgorICogcGFydCkgYmUgYWRkZWQgaGVyZS4gIFRoZSBjb250ZW50cyBvZiB0aGUgcmVjZWl2ZSByaW5nIGJ1ZmZlciBhcmUKKyAqIGNvcGllZCB0byBhIG1lc3NhZ2UgY2hhaW4gdGhhdCBpcyB0aGVuIHBhc3NlZCB0byB0aGUga2VybmVsLgorICoKKyAqIE5vdGU6IGlmIGFueSBlcnJvcnMgb2NjdXIsIHRoZSBwYWNrZXQgaXMgImRyb3BwZWQgb24gdGhlIGZsb29yIi4KKyAqIChjYWxsZWQgYnkgd3ZfcGFja2V0X3JjdigpKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3d2X3BhY2tldF9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCB1MTYgYnVmX29mZiwgaW50IHNrc2l6ZSkKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisjaWZkZWYgREVCVUdfUlhfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfcGFja2V0X3JlYWQoMHglWCwgJWQpXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGJ1Zl9vZmYsIHNrc2l6ZSk7CisjZW5kaWYKKworCS8qIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIGRhdGEgKi8KKwlpZiAoKHNrYiA9IGRldl9hbGxvY19za2Ioc2tzaXplKSkgPT0gKHN0cnVjdCBza19idWZmICopIE5VTEwpIHsKKyNpZmRlZiBERUJVR19SWF9FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHd2X3BhY2tldF9yZWFkKCk6IGNvdWxkIG5vdCBhbGxvY19za2IoJWQsIEdGUF9BVE9NSUMpLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgc2tzaXplKTsKKyNlbmRpZgorCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJc2tiLT5kZXYgPSBkZXY7CisKKwkvKiBDb3B5IHRoZSBwYWNrZXQgdG8gdGhlIGJ1ZmZlci4gKi8KKwlvYnJhbV9yZWFkKGlvYWRkciwgYnVmX29mZiwgc2tiX3B1dChza2IsIHNrc2l6ZSksIHNrc2l6ZSk7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworI2lmZGVmIERFQlVHX1JYX0lORk8KKwl3dl9wYWNrZXRfaW5mbyhza2ItPm1hYy5yYXcsIHNrc2l6ZSwgZGV2LT5uYW1lLCAid3ZfcGFja2V0X3JlYWQiKTsKKyNlbmRpZgkJCQkvKiBERUJVR19SWF9JTkZPICovCisKKwkvKiBTdGF0aXN0aWNzLWdhdGhlcmluZyBhbmQgYXNzb2NpYXRlZCBzdHVmZi4KKwkgKiBJdCBzZWVtIGEgYml0IG1lc3N5IHdpdGggYWxsIHRoZSBkZWZpbmUsIGJ1dCBpdCdzIHJlYWxseQorCSAqIHNpbXBsZS4uLiAqLworCWlmICgKKyNpZmRlZiBJV19XSVJFTEVTU19TUFkJCS8qIGRlZmluZWQgaW4gaXdfaGFuZGxlci5oICovCisJCSAgIChscC0+c3B5X2RhdGEuc3B5X251bWJlciA+IDApIHx8CisjZW5kaWYgLyogSVdfV0lSRUxFU1NfU1BZICovCisjaWZkZWYgSElTVE9HUkFNCisJCSAgIChscC0+aGlzX251bWJlciA+IDApIHx8CisjZW5kaWYgLyogSElTVE9HUkFNICovCisJCSAgIDApIHsKKwkJdTggc3RhdHNbM107CS8qIHNpZ25hbCBsZXZlbCwgbm9pc2UgbGV2ZWwsIHNpZ25hbCBxdWFsaXR5ICovCisKKwkJLyogUmVhZCBzaWduYWwgbGV2ZWwsIHNpbGVuY2UgbGV2ZWwgYW5kIHNpZ25hbCBxdWFsaXR5IGJ5dGVzICovCisJCS8qIE5vdGU6IGluIHRoZSBQQ01DSUEgaGFyZHdhcmUsIHRoZXNlIGFyZSBwYXJ0IG9mIHRoZSBmcmFtZS4KKwkJICogSXQgc2VlbXMgdGhhdCBmb3IgdGhlIElTQSBoYXJkd2FyZSwgaXQncyBub3doZXJlIHRvIGJlCisJCSAqIGZvdW5kIGluIHRoZSBmcmFtZSwgc28gSSdtIG9ibGlnZWQgdG8gZG8gdGhpcyAoaXQgaGFzIGEKKwkJICogc2lkZSBlZmZlY3Qgb24gL3Byb2MvbmV0L3dpcmVsZXNzKS4KKwkJICogQW55IGlkZWFzPworCQkgKi8KKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZnJlZXplKSwgMSk7CisJCW1tY19yZWFkKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9zaWduYWxfbHZsKSwgc3RhdHMsIDMpOworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAwKTsKKworI2lmZGVmIERFQlVHX1JYX0lORk8KKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIlczogd3ZfcGFja2V0X3JlYWQoKTogU2lnbmFsIGxldmVsICVkLzYzLCBTaWxlbmNlIGxldmVsICVkLzYzLCBzaWduYWwgcXVhbGl0eSAlZC8xNlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgc3RhdHNbMF0gJiAweDNGLCBzdGF0c1sxXSAmIDB4M0YsCisJCSAgICAgICBzdGF0c1syXSAmIDB4MEYpOworI2VuZGlmCisKKwkJLyogU3B5aW5nIHN0dWZmICovCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCisJCXdsX3NweV9nYXRoZXIoZGV2LCBza2ItPm1hYy5yYXcgKyBXQVZFTEFOX0FERFJfU0laRSwKKwkJCSAgICAgIHN0YXRzKTsKKyNlbmRpZiAvKiBJV19XSVJFTEVTU19TUFkgKi8KKyNpZmRlZiBISVNUT0dSQU0KKwkJd2xfaGlzX2dhdGhlcihkZXYsIHN0YXRzKTsKKyNlbmRpZiAvKiBISVNUT0dSQU0gKi8KKwl9CisKKwkvKgorCSAqIEhhbmQgdGhlIHBhY2tldCB0byB0aGUgbmV0d29yayBtb2R1bGUuCisJICovCisJbmV0aWZfcngoc2tiKTsKKworCS8qIEtlZXAgc3RhdGlzdGljcyB1cCB0byBkYXRlICovCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlscC0+c3RhdHMucnhfcGFja2V0cysrOworCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBza3NpemU7CisKKyNpZmRlZiBERUJVR19SWF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9wYWNrZXRfcmVhZCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUcmFuc2ZlciBhcyBtYW55IHBhY2tldHMgYXMgd2UgY2FuCisgKiBmcm9tIHRoZSBkZXZpY2UgUkFNLgorICogKGNhbGxlZCBpbiB3YXZlbGFuX2ludGVycnVwdCgpKS4KKyAqIE5vdGUgOiB0aGUgc3BpbmxvY2sgaXMgYWxyZWFkeSBncmFiYmVkIGZvciB1cy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHd2X3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJZmRfdCBmZDsKKwlyYmRfdCByYmQ7CisJaW50IG5yZWFwZWQgPSAwOworCisjaWZkZWYgREVCVUdfUlhfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfcmVjZWl2ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKiBMb29wIG9uIGVhY2ggcmVjZWl2ZWQgcGFja2V0LiAqLworCWZvciAoOzspIHsKKwkJb2JyYW1fcmVhZChpb2FkZHIsIGxwLT5yeF9oZWFkLCAodW5zaWduZWQgY2hhciAqKSAmZmQsCisJCQkgICBzaXplb2YoZmQpKTsKKworCQkvKiBOb3RlIGFib3V0IHRoZSBzdGF0dXMgOgorCQkgKiBJdCBzdGFydCB1cCB0byBiZSAwICh0aGUgdmFsdWUgd2Ugc2V0KS4gVGhlbiwgd2hlbiB0aGUgUlUKKwkJICogZ3JhYiB0aGUgYnVmZmVyIHRvIHByZXBhcmUgZm9yIHJlY2VwdGlvbiwgaXQgc2V0cyB0aGUKKwkJICogRkRfU1RBVFVTX0IgZmxhZy4gV2hlbiB0aGUgUlUgaGFzIGZpbmlzaGVkIHJlY2VpdmluZyB0aGUKKwkJICogZnJhbWUsIGl0IGNsZWFycyBGRF9TVEFUVVNfQiwgc2V0IEZEX1NUQVRVU19DIHRvIGluZGljYXRlCisJCSAqIGNvbXBsZXRpb24gYW5kIHNldCB0aGUgb3RoZXIgZmxhZ3MgdG8gaW5kaWNhdGUgdGhlIGV2ZW50dWFsCisJCSAqIGVycm9ycy4gRkRfU1RBVFVTX09LIGluZGljYXRlcyB0aGF0IHRoZSByZWNlcHRpb24gd2FzIE9LLgorCQkgKi8KKworCQkvKiBJZiB0aGUgY3VycmVudCBmcmFtZSBpcyBub3QgY29tcGxldGUsIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kLiAqLworCQlpZiAoKGZkLmZkX3N0YXR1cyAmIEZEX1NUQVRVU19DKSAhPSBGRF9TVEFUVVNfQykKKwkJCWJyZWFrOwkvKiBUaGlzIGlzIGhvdyB3ZSBleGl0IHRoZSBsb29wLiAqLworCisJCW5yZWFwZWQrKzsKKworCQkvKiBDaGVjayB3aGV0aGVyIGZyYW1lIHdhcyBjb3JyZWN0bHkgcmVjZWl2ZWQuICovCisJCWlmICgoZmQuZmRfc3RhdHVzICYgRkRfU1RBVFVTX09LKSA9PSBGRF9TVEFUVVNfT0spIHsKKwkJCS8qIERvZXMgdGhlIGZyYW1lIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBkYXRhPyAgTGV0J3MgY2hlY2suICovCisJCQlpZiAoZmQuZmRfcmJkX29mZnNldCAhPSBJODI1ODZOVUxMKSB7CisJCQkJLyogUmVhZCB0aGUgcmVjZWl2ZSBidWZmZXIgZGVzY3JpcHRvciAqLworCQkJCW9icmFtX3JlYWQoaW9hZGRyLCBmZC5mZF9yYmRfb2Zmc2V0LAorCQkJCQkgICAodW5zaWduZWQgY2hhciAqKSAmcmJkLAorCQkJCQkgICBzaXplb2YocmJkKSk7CisKKyNpZmRlZiBERUJVR19SWF9FUlJPUgorCQkJCWlmICgocmJkLnJiZF9zdGF0dXMgJiBSQkRfU1RBVFVTX0VPRikgIT0KKwkJCQkgICAgUkJEX1NUQVRVU19FT0YpIHByaW50ayhLRVJOX0lORk8KKwkJCQkJCQkgICAiJXM6IHd2X3JlY2VpdmUoKTogbWlzc2luZyBFT0YgZmxhZy5cbiIsCisJCQkJCQkJICAgZGV2LT5uYW1lKTsKKworCQkJCWlmICgocmJkLnJiZF9zdGF0dXMgJiBSQkRfU1RBVFVTX0YpICE9CisJCQkJICAgIFJCRF9TVEFUVVNfRikgcHJpbnRrKEtFUk5fSU5GTworCQkJCQkJCSAiJXM6IHd2X3JlY2VpdmUoKTogbWlzc2luZyBGIGZsYWcuXG4iLAorCQkJCQkJCSBkZXYtPm5hbWUpOworI2VuZGlmCQkJCS8qIERFQlVHX1JYX0VSUk9SICovCisKKwkJCQkvKiBSZWFkIHRoZSBwYWNrZXQgYW5kIHRyYW5zbWl0IHRvIExpbnV4ICovCisJCQkJd3ZfcGFja2V0X3JlYWQoZGV2LCByYmQucmJkX2J1ZmwsCisJCQkJCSAgICAgICByYmQuCisJCQkJCSAgICAgICByYmRfc3RhdHVzICYKKwkJCQkJICAgICAgIFJCRF9TVEFUVVNfQUNOVCk7CisJCQl9CisjaWZkZWYgREVCVUdfUlhfRVJST1IKKwkJCWVsc2UJLyogaWYgZnJhbWUgaGFzIG5vIGRhdGEgKi8KKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiBmcmFtZSBoYXMgbm8gZGF0YS5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJfSBlbHNlIHsJLyogSWYgcmVjZXB0aW9uIHdhcyBubyBzdWNjZXNzZnVsICovCisKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKworI2lmZGVmIERFQlVHX1JYX0lORk8KKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkgICAgICAgIiVzOiB3dl9yZWNlaXZlKCk6IGZyYW1lIG5vdCByZWNlaXZlZCBzdWNjZXNzZnVsbHkgKCVYKS5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBmZC5mZF9zdGF0dXMpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19SWF9FUlJPUgorCQkJaWYgKChmZC5mZF9zdGF0dXMgJiBGRF9TVEFUVVNfUzYpICE9IDApCisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICAgICAiJXM6IHd2X3JlY2VpdmUoKTogbm8gRU9GIGZsYWcuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkJCWlmICgoZmQuZmRfc3RhdHVzICYgRkRfU1RBVFVTX1M3KSAhPSAwKSB7CisJCQkJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19SWF9GQUlMCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiVzOiB3dl9yZWNlaXZlKCk6IGZyYW1lIHRvbyBzaG9ydC5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCX0KKworCQkJaWYgKChmZC5mZF9zdGF0dXMgJiBGRF9TVEFUVVNfUzgpICE9IDApIHsKKwkJCQlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19SWF9GQUlMCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiVzOiB3dl9yZWNlaXZlKCk6IHJ4IERNQSBvdmVycnVuLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJfQorCisJCQlpZiAoKGZkLmZkX3N0YXR1cyAmIEZEX1NUQVRVU19TOSkgIT0gMCkgeworCQkJCWxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworI2lmZGVmIERFQlVHX1JYX0ZBSUwKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IHd2X3JlY2VpdmUoKTogcmFuIG91dCBvZiByZXNvdXJjZXMuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisKKwkJCWlmICgoZmQuZmRfc3RhdHVzICYgRkRfU1RBVFVTX1MxMCkgIT0gMCkgeworCQkJCWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19SWF9GQUlMCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiVzOiB3dl9yZWNlaXZlKCk6IGFsaWdubWVudCBlcnJvci5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCX0KKworCQkJaWYgKChmZC5mZF9zdGF0dXMgJiBGRF9TVEFUVVNfUzExKSAhPSAwKSB7CisJCQkJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19SWF9GQUlMCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiVzOiB3dl9yZWNlaXZlKCk6IENSQyBlcnJvci5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCX0KKwkJfQorCisJCWZkLmZkX3N0YXR1cyA9IDA7CisJCW9icmFtX3dyaXRlKGlvYWRkciwgZmRvZmYobHAtPnJ4X2hlYWQsIGZkX3N0YXR1cyksCisJCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJmZkLmZkX3N0YXR1cywKKwkJCSAgICBzaXplb2YoZmQuZmRfc3RhdHVzKSk7CisKKwkJZmQuZmRfY29tbWFuZCA9IEZEX0NPTU1BTkRfRUw7CisJCW9icmFtX3dyaXRlKGlvYWRkciwgZmRvZmYobHAtPnJ4X2hlYWQsIGZkX2NvbW1hbmQpLAorCQkJICAgICh1bnNpZ25lZCBjaGFyICopICZmZC5mZF9jb21tYW5kLAorCQkJICAgIHNpemVvZihmZC5mZF9jb21tYW5kKSk7CisKKwkJZmQuZmRfY29tbWFuZCA9IDA7CisJCW9icmFtX3dyaXRlKGlvYWRkciwgZmRvZmYobHAtPnJ4X2xhc3QsIGZkX2NvbW1hbmQpLAorCQkJICAgICh1bnNpZ25lZCBjaGFyICopICZmZC5mZF9jb21tYW5kLAorCQkJICAgIHNpemVvZihmZC5mZF9jb21tYW5kKSk7CisKKwkJbHAtPnJ4X2xhc3QgPSBscC0+cnhfaGVhZDsKKwkJbHAtPnJ4X2hlYWQgPSBmZC5mZF9saW5rX29mZnNldDsKKwl9CQkJLyogZm9yKDs7KSAtPiBsb29wIG9uIGFsbCBmcmFtZXMgKi8KKworI2lmZGVmIERFQlVHX1JYX0lORk8KKwlpZiAobnJlYXBlZCA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfcmVjZWl2ZSgpOiByZWFwZWQgJWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIG5yZWFwZWQpOworI2VuZGlmCisjaWZkZWYgREVCVUdfUlhfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcmVjZWl2ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBQQUNLRVQgVFJBTlNNSVNTSU9OICoqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoaXMgcGFydCBkZWFscyB3aXRoIHNlbmRpbmcgcGFja2V0cyB0aHJvdWdoIHRoZSBXYXZlTEFOLgorICoKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGZpbGxzIGluIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcnMgYW5kIG1lbW9yeQorICogbG9jYXRpb25zIG9uIHRoZSBXYXZlTEFOIGNhcmQgYW5kIHN0YXJ0cyB0aGUgY2FyZCBvZmYgb24KKyAqIHRoZSB0cmFuc21pdC4KKyAqCisgKiBUaGUgcHJpbmNpcGxlOgorICogRWFjaCBibG9jayBjb250YWlucyBhIHRyYW5zbWl0IGNvbW1hbmQsIGEgTk9QIGNvbW1hbmQsCisgKiBhIHRyYW5zbWl0IGJsb2NrIGRlc2NyaXB0b3IgYW5kIGEgYnVmZmVyLgorICogVGhlIENVIHJlYWQgdGhlIHRyYW5zbWl0IGJsb2NrIHdoaWNoIHBvaW50IHRvIHRoZSB0YmQsCisgKiByZWFkIHRoZSB0YmQgYW5kIHRoZSBjb250ZW50IG9mIHRoZSBidWZmZXIuCisgKiBXaGVuIGl0IGhhcyBmaW5pc2ggd2l0aCBpdCwgaXQgZ29lcyB0byB0aGUgbmV4dCBjb21tYW5kCisgKiB3aGljaCBpbiBvdXIgY2FzZSBpcyB0aGUgTk9QLiBUaGUgTk9QIHBvaW50cyBvbiBpdHNlbGYsCisgKiBzbyB0aGUgQ1Ugc3RvcCBoZXJlLgorICogV2hlbiB3ZSBhZGQgdGhlIG5leHQgYmxvY2ssIHdlIG1vZGlmeSB0aGUgcHJldmlvdXMgbm9wCisgKiB0byBtYWtlIGl0IHBvaW50IG9uIHRoZSBuZXcgdHggY29tbWFuZC4KKyAqIFNpbXBsZSwgaXNuJ3QgaXQgPworICoKKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9wYWNrZXRfeG1pdCgpKQorICovCitzdGF0aWMgaW5saW5lIGludCB3dl9wYWNrZXRfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHZvaWQgKmJ1Ziwgc2hvcnQgbGVuZ3RoKQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIHNob3J0IHR4YmxvY2s7CisJdW5zaWduZWQgc2hvcnQgdHhwcmVkOworCXVuc2lnbmVkIHNob3J0IHR4X2FkZHI7CisJdW5zaWduZWQgc2hvcnQgbm9wX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgdGJkX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgYnVmX2FkZHI7CisJYWNfdHhfdCB0eDsKKwlhY19ub3BfdCBub3A7CisJdGJkX3QgdGJkOworCWludCBjbGVuID0gbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBERUJVR19UWF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9wYWNrZXRfd3JpdGUoJWQpXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIGxlbmd0aCk7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIG5vdGhpbmcgYmFkIGhhcyBoYXBwZW5lZCAqLworCWlmIChscC0+dHhfbl9pbl91c2UgPT0gKE5UWEJMT0NLUyAtIDEpKSB7CisjaWZkZWYgREVCVUdfVFhfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X3BhY2tldF93cml0ZSgpOiBUeCBxdWV1ZSBmdWxsLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybiAxOworCX0KKworCS8qIENhbGN1bGF0ZSBhZGRyZXNzZXMgb2YgbmV4dCBibG9jayBhbmQgcHJldmlvdXMgYmxvY2suICovCisJdHhibG9jayA9IGxwLT50eF9maXJzdF9mcmVlOworCXR4cHJlZCA9IHR4YmxvY2sgLSBUWEJMT0NLWjsKKwlpZiAodHhwcmVkIDwgT0ZGU0VUX0NVKQorCQl0eHByZWQgKz0gTlRYQkxPQ0tTICogVFhCTE9DS1o7CisJbHAtPnR4X2ZpcnN0X2ZyZWUgKz0gVFhCTE9DS1o7CisJaWYgKGxwLT50eF9maXJzdF9mcmVlID49IE9GRlNFVF9DVSArIE5UWEJMT0NLUyAqIFRYQkxPQ0taKQorCQlscC0+dHhfZmlyc3RfZnJlZSAtPSBOVFhCTE9DS1MgKiBUWEJMT0NLWjsKKworCWxwLT50eF9uX2luX3VzZSsrOworCisJLyogQ2FsY3VsYXRlIGFkZHJlc3NlcyBvZiB0aGUgZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBibG9jay4gKi8KKwl0eF9hZGRyID0gdHhibG9jazsKKwlub3BfYWRkciA9IHR4X2FkZHIgKyBzaXplb2YodHgpOworCXRiZF9hZGRyID0gbm9wX2FkZHIgKyBzaXplb2Yobm9wKTsKKwlidWZfYWRkciA9IHRiZF9hZGRyICsgc2l6ZW9mKHRiZCk7CisKKwkvKgorCSAqIFRyYW5zbWl0IGNvbW1hbmQKKwkgKi8KKwl0eC50eF9oLmFjX3N0YXR1cyA9IDA7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCB0b2ZmKGFjX3R4X3QsIHR4X2FkZHIsIHR4X2guYWNfc3RhdHVzKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZ0eC50eF9oLmFjX3N0YXR1cywKKwkJICAgIHNpemVvZih0eC50eF9oLmFjX3N0YXR1cykpOworCisJLyoKKwkgKiBOT1AgY29tbWFuZAorCSAqLworCW5vcC5ub3BfaC5hY19zdGF0dXMgPSAwOworCW9icmFtX3dyaXRlKGlvYWRkciwgdG9mZihhY19ub3BfdCwgbm9wX2FkZHIsIG5vcF9oLmFjX3N0YXR1cyksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmbm9wLm5vcF9oLmFjX3N0YXR1cywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfc3RhdHVzKSk7CisJbm9wLm5vcF9oLmFjX2xpbmsgPSBub3BfYWRkcjsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19saW5rKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZub3Aubm9wX2guYWNfbGluaywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfbGluaykpOworCisJLyoKKwkgKiBUcmFuc21pdCBidWZmZXIgZGVzY3JpcHRvcgorCSAqLworCXRiZC50YmRfc3RhdHVzID0gVEJEX1NUQVRVU19FT0YgfCAoVEJEX1NUQVRVU19BQ05UICYgY2xlbik7CisJdGJkLnRiZF9uZXh0X2JkX29mZnNldCA9IEk4MjU4Nk5VTEw7CisJdGJkLnRiZF9idWZsID0gYnVmX2FkZHI7CisJdGJkLnRiZF9idWZoID0gMDsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRiZF9hZGRyLCAodW5zaWduZWQgY2hhciAqKSAmdGJkLCBzaXplb2YodGJkKSk7CisKKwkvKgorCSAqIERhdGEKKwkgKi8KKwlvYnJhbV93cml0ZShpb2FkZHIsIGJ1Zl9hZGRyLCBidWYsIGxlbmd0aCk7CisKKwkvKgorCSAqIE92ZXJ3cml0ZSB0aGUgcHJlZGVjZXNzb3IgTk9QIGxpbmsKKwkgKiBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGlzIHR4YmxvY2suCisJICovCisJbm9wX2FkZHIgPSB0eHByZWQgKyBzaXplb2YodHgpOworCW5vcC5ub3BfaC5hY19zdGF0dXMgPSAwOworCW9icmFtX3dyaXRlKGlvYWRkciwgdG9mZihhY19ub3BfdCwgbm9wX2FkZHIsIG5vcF9oLmFjX3N0YXR1cyksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmbm9wLm5vcF9oLmFjX3N0YXR1cywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfc3RhdHVzKSk7CisJbm9wLm5vcF9oLmFjX2xpbmsgPSB0eGJsb2NrOworCW9icmFtX3dyaXRlKGlvYWRkciwgdG9mZihhY19ub3BfdCwgbm9wX2FkZHIsIG5vcF9oLmFjX2xpbmspLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJm5vcC5ub3BfaC5hY19saW5rLAorCQkgICAgc2l6ZW9mKG5vcC5ub3BfaC5hY19saW5rKSk7CisKKwkvKiBNYWtlIHN1cmUgdGhlIHdhdGNoZG9nIHdpbGwga2VlcCBxdWlldCBmb3IgYSB3aGlsZSAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogS2VlcCBzdGF0cyB1cCB0byBkYXRlLiAqLworCWxwLT5zdGF0cy50eF9ieXRlcyArPSBsZW5ndGg7CisKKwlpZiAobHAtPnR4X2ZpcnN0X2luX3VzZSA9PSBJODI1ODZOVUxMKQorCQlscC0+dHhfZmlyc3RfaW5fdXNlID0gdHhibG9jazsKKworCWlmIChscC0+dHhfbl9pbl91c2UgPCBOVFhCTE9DS1MgLSAxKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKyNpZmRlZiBERUJVR19UWF9JTkZPCisJd3ZfcGFja2V0X2luZm8oKHU4ICopIGJ1ZiwgbGVuZ3RoLCBkZXYtPm5hbWUsCisJCSAgICAgICAid3ZfcGFja2V0X3dyaXRlIik7CisjZW5kaWYJCQkJLyogREVCVUdfVFhfSU5GTyAqLworCisjaWZkZWYgREVCVUdfVFhfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcGFja2V0X3dyaXRlKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHdlIHdhbnQgdG8gc2VuZCBhIHBhY2tldCAoTkVUMyBjYWxsYmFjaykKKyAqIEluIHRoaXMgcm91dGluZSwgd2UgY2hlY2sgaWYgdGhlIGhhcndhcmUgaXMgcmVhZHkgdG8gYWNjZXB0CisgKiB0aGUgcGFja2V0LiAgV2UgYWxzbyBwcmV2ZW50IHJlZW50cmFuY2UuICBUaGVuIHdlIGNhbGwgdGhlIGZ1bmN0aW9uCisgKiB0byBzZW5kIHRoZSBwYWNrZXQuCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIERFQlVHX1RYX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fcGFja2V0X3htaXQoMHglWClcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgKHVuc2lnbmVkKSBza2IpOworI2VuZGlmCisKKwkvKgorCSAqIEJsb2NrIGEgdGltZXItYmFzZWQgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4KKwkgKiBJbiBvdGhlciB3b3JkcywgcHJldmVudCByZWVudGVyaW5nIHRoaXMgcm91dGluZS4KKwkgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBJZiBzb21lYm9keSBoYXMgYXNrZWQgdG8gcmVjb25maWd1cmUgdGhlIGNvbnRyb2xsZXIsIAorCSAqIHdlIGNhbiBkbyBpdCBub3cuCisJICovCisJaWYgKGxwLT5yZWNvbmZpZ184MjU4NikgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCXd2XzgyNTg2X2NvbmZpZyhkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJLyogQ2hlY2sgdGhhdCB3ZSBjYW4gY29udGludWUgKi8KKwkJaWYgKGxwLT50eF9uX2luX3VzZSA9PSAoTlRYQkxPQ0tTIC0gMSkpCisJCQlyZXR1cm4gMTsKKwl9CisjaWZkZWYgREVCVUdfVFhfRVJST1IKKwlpZiAoc2tiLT5uZXh0KQorCQlwcmludGsoS0VSTl9JTkZPICJza2IgaGFzIG5leHRcbiIpOworI2VuZGlmCisKKwkvKiBEbyB3ZSBuZWVkIHNvbWUgcGFkZGluZz8gKi8KKwkvKiBOb3RlIDogb24gd2lyZWxlc3MgdGhlIHByb3BhZ2F0aW9uIHRpbWUgaXMgaW4gdGhlIG9yZGVyIG9mIDF1cywKKwkgKiBhbmQgd2UgZG9uJ3QgaGF2ZSB0aGUgRXRoZXJuZXQgc3BlY2lmaWMgcmVxdWlyZW1lbnQgb2YgYmVlaW5nCisJICogYWJsZSB0byBkZXRlY3QgY29sbGlzaW9ucywgdGhlcmVmb3JlIGluIHRoZW9yeSB3ZSBkb24ndCByZWFsbHkKKwkgKiBuZWVkIHRvIHBhZC4gSmVhbiBJSSAqLworCWlmIChza2ItPmxlbiA8IEVUSF9aTEVOKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogV3JpdGUgcGFja2V0IG9uIHRoZSBjYXJkICovCisJaWYod3ZfcGFja2V0X3dyaXRlKGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbikpCisJCXJldHVybiAxOwkvKiBXZSBmYWlsZWQgKi8KKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworI2lmZGVmIERFQlVHX1RYX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fcGFja2V0X3htaXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogSEFSRFdBUkUgQ09ORklHVVJBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIHBhcnQgZG9lcyB0aGUgcmVhbCBqb2Igb2Ygc3RhcnRpbmcgYW5kIGNvbmZpZ3VyaW5nIHRoZSBoYXJkd2FyZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSb3V0aW5lIHRvIGluaXRpYWxpemUgdGhlIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KKyAqIChjYWxsZWQgYnkgd3ZfaHdfcmVzZXQoKSkKKyAqLworc3RhdGljIGlubGluZSBpbnQgd3ZfbW1jX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJcHNhX3QgcHNhOworCW1td190IG07CisJaW50IGNvbmZpZ3VyZWQ7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfbW1jX2luaXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogUmVhZCB0aGUgcGFyYW1ldGVyIHN0b3JhZ2UgYXJlYS4gKi8KKwlwc2FfcmVhZChpb2FkZHIsIGxwLT5oYWNyLCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisKKyNpZmRlZiBVU0VfUFNBX0NPTkZJRworCWNvbmZpZ3VyZWQgPSBwc2EucHNhX2NvbmZfc3RhdHVzICYgMTsKKyNlbHNlCisJY29uZmlndXJlZCA9IDA7CisjZW5kaWYKKworCS8qIElzIHRoZSBQU0EgaXMgbm90IGNvbmZpZ3VyZWQgKi8KKwlpZiAoIWNvbmZpZ3VyZWQpIHsKKwkJLyogVXNlciB3aWxsIGJlIGFibGUgdG8gY29uZmlndXJlIE5XSUQgbGF0ZXIgKHdpdGggaXdjb25maWcpLiAqLworCQlwc2EucHNhX253aWRbMF0gPSAwOworCQlwc2EucHNhX253aWRbMV0gPSAwOworCisJCS8qIG5vIE5XSUQgY2hlY2tpbmcgc2luY2UgTldJRCBpcyBub3Qgc2V0ICovCisJCXBzYS5wc2FfbndpZF9zZWxlY3QgPSAwOworCisJCS8qIERpc2FibGUgZW5jcnlwdGlvbiAqLworCQlwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0ID0gMDsKKworCQkvKiBTZXQgdG8gc3RhbmRhcmQgdmFsdWVzOgorCQkgKiAweDA0IGZvciBBVCwKKwkJICogMHgwMSBmb3IgTUNBLAorCQkgKiAweDA0IGZvciBQQ01DSUEgYW5kIDIuMDAgY2FyZCAoQVQmVCA0MDctMDI0Njg5L0UgZG9jdW1lbnQpCisJCSAqLworCQlpZiAocHNhLnBzYV9jb21wX251bWJlciAmIDEpCisJCQlwc2EucHNhX3Rocl9wcmVfc2V0ID0gMHgwMTsKKwkJZWxzZQorCQkJcHNhLnBzYV90aHJfcHJlX3NldCA9IDB4MDQ7CisJCXBzYS5wc2FfcXVhbGl0eV90aHIgPSAweDAzOworCisJCS8qIEl0IGlzIGNvbmZpZ3VyZWQgKi8KKwkJcHNhLnBzYV9jb25mX3N0YXR1cyB8PSAxOworCisjaWZkZWYgVVNFX1BTQV9DT05GSUcKKwkJLyogV3JpdGUgdGhlIHBzYS4gKi8KKwkJcHNhX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IsCisJCQkgIChjaGFyICopIHBzYS5wc2FfbndpZCAtIChjaGFyICopICZwc2EsCisJCQkgICh1bnNpZ25lZCBjaGFyICopIHBzYS5wc2FfbndpZCwgNCk7CisJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJICAoY2hhciAqKSAmcHNhLnBzYV90aHJfcHJlX3NldCAtIChjaGFyICopICZwc2EsCisJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0LCAxKTsKKwkJcHNhX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IsCisJCQkgIChjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyIC0gKGNoYXIgKikgJnBzYSwKKwkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfcXVhbGl0eV90aHIsIDEpOworCQlwc2Ffd3JpdGUoaW9hZGRyLCBscC0+aGFjciwKKwkJCSAgKGNoYXIgKikgJnBzYS5wc2FfY29uZl9zdGF0dXMgLSAoY2hhciAqKSAmcHNhLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmcHNhLnBzYV9jb25mX3N0YXR1cywgMSk7CisJCS8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworCQl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldiwgaW9hZGRyLCBscC0+aGFjcik7CisjZW5kaWYKKwl9CisKKwkvKiBaZXJvIHRoZSBtbWMgc3RydWN0dXJlLiAqLworCW1lbXNldCgmbSwgMHgwMCwgc2l6ZW9mKG0pKTsKKworCS8qIENvcHkgUFNBIGluZm8gdG8gdGhlIG1tYy4gKi8KKwltLm1td19uZXR3X2lkX2wgPSBwc2EucHNhX253aWRbMV07CisJbS5tbXdfbmV0d19pZF9oID0gcHNhLnBzYV9ud2lkWzBdOworCisJaWYgKHBzYS5wc2FfbndpZF9zZWxlY3QgJiAxKQorCQltLm1td19sb29wdF9zZWwgPSAweDAwOworCWVsc2UKKwkJbS5tbXdfbG9vcHRfc2VsID0gTU1XX0xPT1BUX1NFTF9ESVNfTldJRDsKKworCW1lbWNweSgmbS5tbXdfZW5jcl9rZXksICZwc2EucHNhX2VuY3J5cHRpb25fa2V5LAorCSAgICAgICBzaXplb2YobS5tbXdfZW5jcl9rZXkpKTsKKworCWlmIChwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0KQorCQltLm1td19lbmNyX2VuYWJsZSA9CisJCSAgICBNTVdfRU5DUl9FTkFCTEVfRU4gfCBNTVdfRU5DUl9FTkFCTEVfTU9ERTsKKwllbHNlCisJCW0ubW13X2VuY3JfZW5hYmxlID0gMDsKKworCW0ubW13X3Rocl9wcmVfc2V0ID0gcHNhLnBzYV90aHJfcHJlX3NldCAmIDB4M0Y7CisJbS5tbXdfcXVhbGl0eV90aHIgPSBwc2EucHNhX3F1YWxpdHlfdGhyICYgMHgwRjsKKworCS8qCisJICogU2V0IGRlZmF1bHQgbW9kZW0gY29udHJvbCBwYXJhbWV0ZXJzLgorCSAqIFNlZSBOQ1IgZG9jdW1lbnQgNDA3LTAwMjQzMjYgUmV2LiBBLgorCSAqLworCW0ubW13X2phYmJlcl9lbmFibGUgPSAweDAxOworCW0ubW13X2ZyZWV6ZSA9IDA7CisJbS5tbXdfYW50ZW5fc2VsID0gTU1XX0FOVEVOX1NFTF9BTEdfRU47CisJbS5tbXdfaWZzID0gMHgyMDsKKwltLm1td19tb2RfZGVsYXkgPSAweDA0OworCW0ubW13X2phbV90aW1lID0gMHgzODsKKworCW0ubW13X2Rlc19pb19pbnZlcnQgPSAwOworCW0ubW13X2RlY2F5X3BybSA9IDA7CisJbS5tbXdfZGVjYXlfdXBkYXRfcHJtID0gMDsKKworCS8qIFdyaXRlIGFsbCBpbmZvIHRvIE1NQy4gKi8KKwltbWNfd3JpdGUoaW9hZGRyLCAwLCAodTggKikgJiBtLCBzaXplb2YobSkpOworCisJLyogVGhlIGZvbGxvd2luZyBjb2RlIHN0YXJ0cyB0aGUgbW9kZW0gb2YgdGhlIDIuMDAgZnJlcXVlbmN5CisJICogc2VsZWN0YWJsZSBjYXJkcyBhdCBwb3dlciBvbi4gIEl0J3Mgbm90IHN0cmljdGx5IG5lZWRlZCBmb3IgdGhlCisJICogZm9sbG93aW5nIGJvb3RzLgorCSAqIFRoZSBvcmlnaW5hbCBwYXRjaCB3YXMgYnkgSm9lIEZpbm5leSBmb3IgdGhlIFBDTUNJQSBkcml2ZXIsIGJ1dAorCSAqIEkndmUgY2xlYW5lZCBpdCB1cCBhIGJpdCBhbmQgYWRkZWQgZG9jdW1lbnRhdGlvbi4KKwkgKiBUaGFua3MgdG8gTG9la2UgQnJlZGVydmVsZCBmcm9tIEx1Y2VudCBmb3IgdGhlIGluZm8uCisJICovCisKKwkvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKQorCSAqIERvZXMgaXQgd29yayBmb3IgZXZlcnlib2R5LCBlc3BlY2lhbGx5IG9sZCBjYXJkcz8gKi8KKwkvKiBOb3RlOiBXRlJFUVNFTCB2ZXJpZmllcyB0aGF0IGl0IGlzIGFibGUgdG8gcmVhZCBhIHNlbnNpYmxlCisJICogZnJlcXVlbmN5IGZyb20gRUVQUk9NIChhZGRyZXNzIDB4MDApIGFuZCB0aGF0IE1NUl9GRUVfU1RBVFVTX0lECisJICogaXMgMHhBIChYaWxpbnggdmVyc2lvbikgb3IgMHhCIChBcmlhZG5lIHZlcnNpb24pLgorCSAqIE15IHRlc3QgaXMgbW9yZSBjcnVkZSBidXQgZG9lcyB3b3JrLiAqLworCWlmICghKG1tY19pbihpb2FkZHIsIG1tcm9mZigwLCBtbXJfZmVlX3N0YXR1cykpICYKKwkgICAgICAoTU1SX0ZFRV9TVEFUVVNfRFdMRCB8IE1NUl9GRUVfU1RBVFVTX0JVU1kpKSkgeworCQkvKiBXZSBtdXN0IGRvd25sb2FkIHRoZSBmcmVxdWVuY3kgcGFyYW1ldGVycyB0byB0aGUKKwkJICogc3ludGhlc2l6ZXJzIChmcm9tIHRoZSBFRVBST00gLSBhcmVhIDEpCisJCSAqIE5vdGU6IGFzIHRoZSBFRVBST00gaXMgYXV0b21hdGljYWxseSBkZWNyZW1lbnRlZCwgd2Ugc2V0IHRoZSBlbmQKKwkJICogaWYgdGhlIGFyZWEuLi4gKi8KKwkJbS5tbXdfZmVlX2FkZHIgPSAweDBGOworCQltLm1td19mZWVfY3RybCA9IE1NV19GRUVfQ1RSTF9SRUFEIHwgTU1XX0ZFRV9DVFJMX0RXTEQ7CisJCW1tY193cml0ZShpb2FkZHIsIChjaGFyICopICZtLm1td19mZWVfY3RybCAtIChjaGFyICopICZtLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmbS5tbXdfZmVlX2N0cmwsIDIpOworCisJCS8qIFdhaXQgdW50aWwgdGhlIGRvd25sb2FkIGlzIGZpbmlzaGVkLiAqLworCQlmZWVfd2FpdChpb2FkZHIsIDEwMCwgMTAwKTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisJCS8qIFRoZSBmcmVxdWVuY3kgd2FzIGluIHRoZSBsYXN0IHdvcmQgZG93bmxvYWRlZC4gKi8KKwkJbW1jX3JlYWQoaW9hZGRyLCAoY2hhciAqKSAmbS5tbXdfZmVlX2RhdGFfbCAtIChjaGFyICopICZtLAorCQkJICh1bnNpZ25lZCBjaGFyICopICZtLm1td19mZWVfZGF0YV9sLCAyKTsKKworCQkvKiBQcmludCBzb21lIGluZm8gZm9yIHRoZSB1c2VyLiAqLworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiBXYXZlTEFOIDIuMDAgcmVjb2duaXNlZCAoZnJlcXVlbmN5IHNlbGVjdCkuICBDdXJyZW50IGZyZXF1ZW5jeSA9ICVsZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwKKwkJICAgICAgICgobS4KKwkJCSBtbXdfZmVlX2RhdGFfaCA8PCA0KSB8IChtLm1td19mZWVfZGF0YV9sID4+IDQpKSAqCisJCSAgICAgICA1IC8gMiArIDI0MDAwTCk7CisjZW5kaWYKKworCQkvKiBXZSBtdXN0IG5vdyBkb3dubG9hZCB0aGUgcG93ZXIgYWRqdXN0IHZhbHVlIChnYWluKSB0bworCQkgKiB0aGUgc3ludGhlc2l6ZXJzIChmcm9tIHRoZSBFRVBST00gLSBhcmVhIDcgLSBEQUMpLiAqLworCQltLm1td19mZWVfYWRkciA9IDB4NjE7CisJCW0ubW13X2ZlZV9jdHJsID0gTU1XX0ZFRV9DVFJMX1JFQUQgfCBNTVdfRkVFX0NUUkxfRFdMRDsKKwkJbW1jX3dyaXRlKGlvYWRkciwgKGNoYXIgKikgJm0ubW13X2ZlZV9jdHJsIC0gKGNoYXIgKikgJm0sCisJCQkgICh1bnNpZ25lZCBjaGFyICopICZtLm1td19mZWVfY3RybCwgMik7CisKKwkJLyogV2FpdCB1bnRpbCB0aGUgZG93bmxvYWQgaXMgZmluaXNoZWQuICovCisJfQorCS8qIGlmIDIuMDAgY2FyZCAqLworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9tbWNfaW5pdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBDb25zdHJ1Y3QgdGhlIGZkIGFuZCByYmQgc3RydWN0dXJlcy4KKyAqIFN0YXJ0IHRoZSByZWNlaXZlIHVuaXQuCisgKiAoY2FsbGVkIGJ5IHd2X2h3X3Jlc2V0KCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHd2X3J1X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXUxNiBzY2JfY3M7CisJZmRfdCBmZDsKKwlyYmRfdCByYmQ7CisJdTE2IHJ4OworCXUxNiByeF9uZXh0OworCWludCBpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3J1X3N0YXJ0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCW9icmFtX3JlYWQoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX3N0YXR1cyksCisJCSAgICh1bnNpZ25lZCBjaGFyICopICZzY2JfY3MsIHNpemVvZihzY2JfY3MpKTsKKwlpZiAoKHNjYl9jcyAmIFNDQl9TVF9SVVMpID09IFNDQl9TVF9SVVNfUkRZKQorCQlyZXR1cm4gMDsKKworCWxwLT5yeF9oZWFkID0gT0ZGU0VUX1JVOworCisJZm9yIChpID0gMCwgcnggPSBscC0+cnhfaGVhZDsgaSA8IE5SWEJMT0NLUzsgaSsrLCByeCA9IHJ4X25leHQpIHsKKwkJcnhfbmV4dCA9CisJCSAgICAoaSA9PSBOUlhCTE9DS1MgLSAxKSA/IGxwLT5yeF9oZWFkIDogcnggKyBSWEJMT0NLWjsKKworCQlmZC5mZF9zdGF0dXMgPSAwOworCQlmZC5mZF9jb21tYW5kID0gKGkgPT0gTlJYQkxPQ0tTIC0gMSkgPyBGRF9DT01NQU5EX0VMIDogMDsKKwkJZmQuZmRfbGlua19vZmZzZXQgPSByeF9uZXh0OworCQlmZC5mZF9yYmRfb2Zmc2V0ID0gcnggKyBzaXplb2YoZmQpOworCQlvYnJhbV93cml0ZShpb2FkZHIsIHJ4LCAodW5zaWduZWQgY2hhciAqKSAmZmQsIHNpemVvZihmZCkpOworCisJCXJiZC5yYmRfc3RhdHVzID0gMDsKKwkJcmJkLnJiZF9uZXh0X3JiZF9vZmZzZXQgPSBJODI1ODZOVUxMOworCQlyYmQucmJkX2J1ZmwgPSByeCArIHNpemVvZihmZCkgKyBzaXplb2YocmJkKTsKKwkJcmJkLnJiZF9idWZoID0gMDsKKwkJcmJkLnJiZF9lbF9zaXplID0gUkJEX0VMIHwgKFJCRF9TSVpFICYgTUFYREFUQVopOworCQlvYnJhbV93cml0ZShpb2FkZHIsIHJ4ICsgc2l6ZW9mKGZkKSwKKwkJCSAgICAodW5zaWduZWQgY2hhciAqKSAmcmJkLCBzaXplb2YocmJkKSk7CisKKwkJbHAtPnJ4X2xhc3QgPSByeDsKKwl9CisKKwlvYnJhbV93cml0ZShpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfcmZhX29mZnNldCksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmbHAtPnJ4X2hlYWQsIHNpemVvZihscC0+cnhfaGVhZCkpOworCisJc2NiX2NzID0gU0NCX0NNRF9SVUNfR087CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX2NvbW1hbmQpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJnNjYl9jcywgc2l6ZW9mKHNjYl9jcykpOworCisJc2V0X2NoYW5fYXR0bihpb2FkZHIsIGxwLT5oYWNyKTsKKworCWZvciAoaSA9IDEwMDA7IGkgPiAwOyBpLS0pIHsKKwkJb2JyYW1fcmVhZChpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY29tbWFuZCksCisJCQkgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NzLCBzaXplb2Yoc2NiX2NzKSk7CisJCWlmIChzY2JfY3MgPT0gMCkKKwkJCWJyZWFrOworCisJCXVkZWxheSgxMCk7CisJfQorCisJaWYgKGkgPD0gMCkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5fcnVfc3RhcnQoKTogYm9hcmQgbm90IGFjY2VwdGluZyBjb21tYW5kLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuIC0xOworCX0KKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcnVfc3RhcnQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogSW5pdGlhbGlzZSB0aGUgdHJhbnNtaXQgYmxvY2tzLgorICogU3RhcnQgdGhlIGNvbW1hbmQgdW5pdCBleGVjdXRpbmcgdGhlIE5PUAorICogc2VsZi1sb29wIG9mIHRoZSBmaXJzdCB0cmFuc21pdCBibG9jay4KKyAqCisgKiBIZXJlIHdlIGNyZWF0ZSB0aGUgbGlzdCBvZiBzZW5kIGJ1ZmZlcnMgdXNlZCB0byB0cmFuc21pdCBwYWNrZXRzCisgKiBiZXR3ZWVuIHRoZSBQQyBhbmQgdGhlIGNvbW1hbmQgdW5pdC4gRm9yIGVhY2ggYnVmZmVyLCB3ZSBjcmVhdGUgYQorICogYnVmZmVyIGRlc2NyaXB0b3IgKHBvaW50aW5nIG9uIHRoZSBidWZmZXIpLCBhIHRyYW5zbWl0IGNvbW1hbmQKKyAqIChwb2ludGluZyB0byB0aGUgYnVmZmVyIGRlc2NyaXB0b3IpIGFuZCBhIE5PUCBjb21tYW5kLgorICogVGhlIHRyYW5zbWl0IGNvbW1hbmQgaXMgbGlua2VkIHRvIHRoZSBOT1AsIGFuZCB0aGUgTk9QIHRvIGl0c2VsZi4KKyAqIFdoZW4gd2Ugd2lsbCBoYXZlIGZpbmlzaGVkIGV4ZWN1dGluZyB0aGUgdHJhbnNtaXQgY29tbWFuZCwgd2Ugd2lsbAorICogdGhlbiBsb29wIG9uIHRoZSBOT1AuIEJ5IHJlbGVhc2luZyB0aGUgTk9QIGxpbmsgdG8gYSBuZXcgY29tbWFuZCwKKyAqIHdlIG1heSBzZW5kIGFub3RoZXIgYnVmZmVyLgorICoKKyAqIChjYWxsZWQgYnkgd3ZfaHdfcmVzZXQoKSkKKyAqLworc3RhdGljIGlubGluZSBpbnQgd3ZfY3Vfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisJdTE2IHR4YmxvY2s7CisJdTE2IGZpcnN0X25vcDsKKwl1MTYgc2NiX2NzOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X2N1X3N0YXJ0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCWxwLT50eF9maXJzdF9mcmVlID0gT0ZGU0VUX0NVOworCWxwLT50eF9maXJzdF9pbl91c2UgPSBJODI1ODZOVUxMOworCisJZm9yIChpID0gMCwgdHhibG9jayA9IE9GRlNFVF9DVTsKKwkgICAgIGkgPCBOVFhCTE9DS1M7IGkrKywgdHhibG9jayArPSBUWEJMT0NLWikgeworCQlhY190eF90IHR4OworCQlhY19ub3BfdCBub3A7CisJCXRiZF90IHRiZDsKKwkJdW5zaWduZWQgc2hvcnQgdHhfYWRkcjsKKwkJdW5zaWduZWQgc2hvcnQgbm9wX2FkZHI7CisJCXVuc2lnbmVkIHNob3J0IHRiZF9hZGRyOworCQl1bnNpZ25lZCBzaG9ydCBidWZfYWRkcjsKKworCQl0eF9hZGRyID0gdHhibG9jazsKKwkJbm9wX2FkZHIgPSB0eF9hZGRyICsgc2l6ZW9mKHR4KTsKKwkJdGJkX2FkZHIgPSBub3BfYWRkciArIHNpemVvZihub3ApOworCQlidWZfYWRkciA9IHRiZF9hZGRyICsgc2l6ZW9mKHRiZCk7CisKKwkJdHgudHhfaC5hY19zdGF0dXMgPSAwOworCQl0eC50eF9oLmFjX2NvbW1hbmQgPSBhY21kX3RyYW5zbWl0IHwgQUNfQ0ZMRF9JOworCQl0eC50eF9oLmFjX2xpbmsgPSBub3BfYWRkcjsKKwkJdHgudHhfdGJkX29mZnNldCA9IHRiZF9hZGRyOworCQlvYnJhbV93cml0ZShpb2FkZHIsIHR4X2FkZHIsICh1bnNpZ25lZCBjaGFyICopICZ0eCwKKwkJCSAgICBzaXplb2YodHgpKTsKKworCQlub3Aubm9wX2guYWNfc3RhdHVzID0gMDsKKwkJbm9wLm5vcF9oLmFjX2NvbW1hbmQgPSBhY21kX25vcDsKKwkJbm9wLm5vcF9oLmFjX2xpbmsgPSBub3BfYWRkcjsKKwkJb2JyYW1fd3JpdGUoaW9hZGRyLCBub3BfYWRkciwgKHVuc2lnbmVkIGNoYXIgKikgJm5vcCwKKwkJCSAgICBzaXplb2Yobm9wKSk7CisKKwkJdGJkLnRiZF9zdGF0dXMgPSBUQkRfU1RBVFVTX0VPRjsKKwkJdGJkLnRiZF9uZXh0X2JkX29mZnNldCA9IEk4MjU4Nk5VTEw7CisJCXRiZC50YmRfYnVmbCA9IGJ1Zl9hZGRyOworCQl0YmQudGJkX2J1ZmggPSAwOworCQlvYnJhbV93cml0ZShpb2FkZHIsIHRiZF9hZGRyLCAodW5zaWduZWQgY2hhciAqKSAmdGJkLAorCQkJICAgIHNpemVvZih0YmQpKTsKKwl9CisKKwlmaXJzdF9ub3AgPQorCSAgICBPRkZTRVRfQ1UgKyAoTlRYQkxPQ0tTIC0gMSkgKiBUWEJMT0NLWiArIHNpemVvZihhY190eF90KTsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY2JsX29mZnNldCksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmZmlyc3Rfbm9wLCBzaXplb2YoZmlyc3Rfbm9wKSk7CisKKwlzY2JfY3MgPSBTQ0JfQ01EX0NVQ19HTzsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY29tbWFuZCksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NzLCBzaXplb2Yoc2NiX2NzKSk7CisKKwlzZXRfY2hhbl9hdHRuKGlvYWRkciwgbHAtPmhhY3IpOworCisJZm9yIChpID0gMTAwMDsgaSA+IDA7IGktLSkgeworCQlvYnJhbV9yZWFkKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9jb21tYW5kKSwKKwkJCSAgICh1bnNpZ25lZCBjaGFyICopICZzY2JfY3MsIHNpemVvZihzY2JfY3MpKTsKKwkJaWYgKHNjYl9jcyA9PSAwKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlpZiAoaSA8PSAwKSB7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd2F2ZWxhbl9jdV9zdGFydCgpOiBib2FyZCBub3QgYWNjZXB0aW5nIGNvbW1hbmQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJbHAtPnR4X25faW5fdXNlID0gMDsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9jdV9zdGFydCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgZG9lcyBhIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFdhdmVMQU4gCisgKiBjb250cm9sbGVyIChpODI1ODYpLgorICoKKyAqIEl0IGluaXRpYWxpc2VzIHRoZSBzY3AsIGlzY3AgYW5kIHNjYiBzdHJ1Y3R1cmUKKyAqIFRoZSBmaXJzdCB0d28gYXJlIGp1c3QgcG9pbnRlcnMgdG8gdGhlIG5leHQuCisgKiBUaGUgbGFzdCBvbmUgaXMgdXNlZCBmb3IgYmFzaWMgY29uZmlndXJhdGlvbiBhbmQgZm9yIGJhc2ljCisgKiBjb21tdW5pY2F0aW9uIChpbnRlcnJ1cHQgc3RhdHVzKS4KKyAqCisgKiAoY2FsbGVkIGJ5IHd2X2h3X3Jlc2V0KCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHd2XzgyNTg2X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXNjcF90IHNjcDsJCS8qIHN5c3RlbSBjb25maWd1cmF0aW9uIHBvaW50ZXIgKi8KKwlpc2NwX3QgaXNjcDsJCS8qIGludGVybWVkaWF0ZSBzY3AgKi8KKwlzY2JfdCBzY2I7CQkvKiBzeXN0ZW0gY29udHJvbCBibG9jayAqLworCWFjaF90IGNiOwkJLyogQWN0aW9uIGNvbW1hbmQgaGVhZGVyICovCisJdTggemVyb2VzWzUxMl07CisJaW50IGk7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfODI1ODZfc3RhcnQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyoKKwkgKiBDbGVhciB0aGUgb25ib2FyZCBSQU0uCisJICovCisJbWVtc2V0KCZ6ZXJvZXNbMF0sIDB4MDAsIHNpemVvZih6ZXJvZXMpKTsKKwlmb3IgKGkgPSAwOyBpIDwgSTgyNTg2X01FTVo7IGkgKz0gc2l6ZW9mKHplcm9lcykpCisJCW9icmFtX3dyaXRlKGlvYWRkciwgaSwgJnplcm9lc1swXSwgc2l6ZW9mKHplcm9lcykpOworCisJLyoKKwkgKiBDb25zdHJ1Y3QgdGhlIGNvbW1hbmQgdW5pdCBzdHJ1Y3R1cmVzOgorCSAqIHNjcCwgaXNjcCwgc2NiLCBjYi4KKwkgKi8KKwltZW1zZXQoJnNjcCwgMHgwMCwgc2l6ZW9mKHNjcCkpOworCXNjcC5zY3Bfc3lzYnVzID0gU0NQX1NZXzE2QkJVUzsKKwlzY3Auc2NwX2lzY3BsID0gT0ZGU0VUX0lTQ1A7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBPRkZTRVRfU0NQLCAodW5zaWduZWQgY2hhciAqKSAmc2NwLAorCQkgICAgc2l6ZW9mKHNjcCkpOworCisJbWVtc2V0KCZpc2NwLCAweDAwLCBzaXplb2YoaXNjcCkpOworCWlzY3AuaXNjcF9idXN5ID0gMTsKKwlpc2NwLmlzY3Bfb2Zmc2V0ID0gT0ZGU0VUX1NDQjsKKwlvYnJhbV93cml0ZShpb2FkZHIsIE9GRlNFVF9JU0NQLCAodW5zaWduZWQgY2hhciAqKSAmaXNjcCwKKwkJICAgIHNpemVvZihpc2NwKSk7CisKKwkvKiBPdXIgZmlyc3QgY29tbWFuZCBpcyB0byByZXNldCB0aGUgaTgyNTg2LiAqLworCW1lbXNldCgmc2NiLCAweDAwLCBzaXplb2Yoc2NiKSk7CisJc2NiLnNjYl9jb21tYW5kID0gU0NCX0NNRF9SRVNFVDsKKwlzY2Iuc2NiX2NibF9vZmZzZXQgPSBPRkZTRVRfQ1U7CisJc2NiLnNjYl9yZmFfb2Zmc2V0ID0gT0ZGU0VUX1JVOworCW9icmFtX3dyaXRlKGlvYWRkciwgT0ZGU0VUX1NDQiwgKHVuc2lnbmVkIGNoYXIgKikgJnNjYiwKKwkJICAgIHNpemVvZihzY2IpKTsKKworCXNldF9jaGFuX2F0dG4oaW9hZGRyLCBscC0+aGFjcik7CisKKwkvKiBXYWl0IGZvciBjb21tYW5kIHRvIGZpbmlzaC4gKi8KKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKSB7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBPRkZTRVRfSVNDUCwgKHVuc2lnbmVkIGNoYXIgKikgJmlzY3AsCisJCQkgICBzaXplb2YoaXNjcCkpOworCisJCWlmIChpc2NwLmlzY3BfYnVzeSA9PSAodW5zaWduZWQgc2hvcnQpIDApCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTApOworCX0KKworCWlmIChpIDw9IDApIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3dl84MjU4Nl9zdGFydCgpOiBpc2NwX2J1c3kgdGltZW91dC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBDaGVjayBjb21tYW5kIGNvbXBsZXRpb24uICovCisJZm9yIChpID0gMTU7IGkgPiAwOyBpLS0pIHsKKwkJb2JyYW1fcmVhZChpb2FkZHIsIE9GRlNFVF9TQ0IsICh1bnNpZ25lZCBjaGFyICopICZzY2IsCisJCQkgICBzaXplb2Yoc2NiKSk7CisKKwkJaWYgKHNjYi5zY2Jfc3RhdHVzID09IChTQ0JfU1RfQ1ggfCBTQ0JfU1RfQ05BKSkKKwkJCWJyZWFrOworCisJCXVkZWxheSgxMCk7CisJfQorCisJaWYgKGkgPD0gMCkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHd2XzgyNTg2X3N0YXJ0KCk6IHN0YXR1czogZXhwZWN0ZWQgMHglMDJ4LCBnb3QgMHglMDJ4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgU0NCX1NUX0NYIHwgU0NCX1NUX0NOQSwgc2NiLnNjYl9zdGF0dXMpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisKKwl3dl9hY2soZGV2KTsKKworCS8qIFNldCB0aGUgYWN0aW9uIGNvbW1hbmQgaGVhZGVyLiAqLworCW1lbXNldCgmY2IsIDB4MDAsIHNpemVvZihjYikpOworCWNiLmFjX2NvbW1hbmQgPSBBQ19DRkxEX0VMIHwgKEFDX0NGTERfQ01EICYgYWNtZF9kaWFnbm9zZSk7CisJY2IuYWNfbGluayA9IE9GRlNFVF9DVTsKKwlvYnJhbV93cml0ZShpb2FkZHIsIE9GRlNFVF9DVSwgKHVuc2lnbmVkIGNoYXIgKikgJmNiLCBzaXplb2YoY2IpKTsKKworCWlmICh3dl9zeW5jaHJvbm91c19jbWQoZGV2LCAiZGlhZygpIikgPT0gLTEpCisJCXJldHVybiAtMTsKKworCW9icmFtX3JlYWQoaW9hZGRyLCBPRkZTRVRfQ1UsICh1bnNpZ25lZCBjaGFyICopICZjYiwgc2l6ZW9mKGNiKSk7CisJaWYgKGNiLmFjX3N0YXR1cyAmIEFDX1NGTERfRkFJTCkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHd2XzgyNTg2X3N0YXJ0KCk6IGk4MjU4NiBTZWxmIFRlc3QgZmFpbGVkLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuIC0xOworCX0KKyNpZmRlZiBERUJVR19JODI1ODZfU0hPVworCXd2X3NjYl9zaG93KGlvYWRkcik7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl84MjU4Nl9zdGFydCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgZG9lcyBhIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFdhdmVMQU4KKyAqIGNvbnRyb2xsZXIgKGk4MjU4NikuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGEgdmlvbGVudCBoYWNrLiBXZSB1c2UgdGhlIGZpcnN0IGZyZWUgdHJhbnNtaXQgYmxvY2sKKyAqIHRvIG1ha2Ugb3VyIGNvbmZpZ3VyYXRpb24uIEluIHRoZSBidWZmZXIgYXJlYSwgd2UgY3JlYXRlIHRoZSB0aHJlZQorICogY29uZmlndXJhdGlvbiBjb21tYW5kcyAobGlua2VkKS4gV2UgbWFrZSB0aGUgcHJldmlvdXMgTk9QIHBvaW50IHRvCisgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgaW5zdGVhZCBvZiB0aGUgdHggY29tbWFuZC4gQWZ0ZXIsIHdlIGdvCisgKiBhcyB1c3VhbCB0byB0aGUgTk9QIGNvbW1hbmQuCisgKiBOb3RlIHRoYXQgb25seSB0aGUgbGFzdCBjb21tYW5kIChtY19zZXQpIHdpbGwgZ2VuZXJhdGUgYW4gaW50ZXJydXB0LgorICoKKyAqIChjYWxsZWQgYnkgd3ZfaHdfcmVzZXQoKSwgd3ZfODI1ODZfcmVjb25maWcoKSwgd2F2ZWxhbl9wYWNrZXRfeG1pdCgpKQorICovCitzdGF0aWMgdm9pZCB3dl84MjU4Nl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgdHhibG9jazsKKwl1bnNpZ25lZCBzaG9ydCB0eHByZWQ7CisJdW5zaWduZWQgc2hvcnQgdHhfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCBub3BfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCB0YmRfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCBjZmdfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCBpYXNfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCBtY3NfYWRkcjsKKwlhY190eF90IHR4OworCWFjX25vcF90IG5vcDsKKwlhY19jZmdfdCBjZmc7CQkvKiBDb25maWd1cmUgYWN0aW9uICovCisJYWNfaWFzX3QgaWFzOwkJLyogSUEtc2V0dXAgYWN0aW9uICovCisJYWNfbWNzX3QgbWNzOwkJLyogTXVsdGljYXN0IHNldHVwICovCisJc3RydWN0IGRldl9tY19saXN0ICpkbWk7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfODI1ODZfY29uZmlnKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qIENoZWNrIG5vdGhpbmcgYmFkIGhhcyBoYXBwZW5lZCAqLworCWlmIChscC0+dHhfbl9pbl91c2UgPT0gKE5UWEJMT0NLUyAtIDEpKSB7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB3dl84MjU4Nl9jb25maWcoKTogVHggcXVldWUgZnVsbC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybjsKKwl9CisKKwkvKiBDYWxjdWxhdGUgYWRkcmVzc2VzIG9mIG5leHQgYmxvY2sgYW5kIHByZXZpb3VzIGJsb2NrLiAqLworCXR4YmxvY2sgPSBscC0+dHhfZmlyc3RfZnJlZTsKKwl0eHByZWQgPSB0eGJsb2NrIC0gVFhCTE9DS1o7CisJaWYgKHR4cHJlZCA8IE9GRlNFVF9DVSkKKwkJdHhwcmVkICs9IE5UWEJMT0NLUyAqIFRYQkxPQ0taOworCWxwLT50eF9maXJzdF9mcmVlICs9IFRYQkxPQ0taOworCWlmIChscC0+dHhfZmlyc3RfZnJlZSA+PSBPRkZTRVRfQ1UgKyBOVFhCTE9DS1MgKiBUWEJMT0NLWikKKwkJbHAtPnR4X2ZpcnN0X2ZyZWUgLT0gTlRYQkxPQ0tTICogVFhCTE9DS1o7CisKKwlscC0+dHhfbl9pbl91c2UrKzsKKworCS8qIENhbGN1bGF0ZSBhZGRyZXNzZXMgb2YgdGhlIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgYmxvY2suICovCisJdHhfYWRkciA9IHR4YmxvY2s7CisJbm9wX2FkZHIgPSB0eF9hZGRyICsgc2l6ZW9mKHR4KTsKKwl0YmRfYWRkciA9IG5vcF9hZGRyICsgc2l6ZW9mKG5vcCk7CisJY2ZnX2FkZHIgPSB0YmRfYWRkciArIHNpemVvZih0YmRfdCk7CS8qIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyICovCisJaWFzX2FkZHIgPSBjZmdfYWRkciArIHNpemVvZihjZmcpOworCW1jc19hZGRyID0gaWFzX2FkZHIgKyBzaXplb2YoaWFzKTsKKworCS8qCisJICogVHJhbnNtaXQgY29tbWFuZAorCSAqLworCXR4LnR4X2guYWNfc3RhdHVzID0gMHhGRkZGOwkvKiBGYWtlIGNvbXBsZXRpb24gdmFsdWUgKi8KKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfdHhfdCwgdHhfYWRkciwgdHhfaC5hY19zdGF0dXMpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJnR4LnR4X2guYWNfc3RhdHVzLAorCQkgICAgc2l6ZW9mKHR4LnR4X2guYWNfc3RhdHVzKSk7CisKKwkvKgorCSAqIE5PUCBjb21tYW5kCisJICovCisJbm9wLm5vcF9oLmFjX3N0YXR1cyA9IDA7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCB0b2ZmKGFjX25vcF90LCBub3BfYWRkciwgbm9wX2guYWNfc3RhdHVzKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZub3Aubm9wX2guYWNfc3RhdHVzLAorCQkgICAgc2l6ZW9mKG5vcC5ub3BfaC5hY19zdGF0dXMpKTsKKwlub3Aubm9wX2guYWNfbGluayA9IG5vcF9hZGRyOworCW9icmFtX3dyaXRlKGlvYWRkciwgdG9mZihhY19ub3BfdCwgbm9wX2FkZHIsIG5vcF9oLmFjX2xpbmspLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJm5vcC5ub3BfaC5hY19saW5rLAorCQkgICAgc2l6ZW9mKG5vcC5ub3BfaC5hY19saW5rKSk7CisKKwkvKiBDcmVhdGUgYSBjb25maWd1cmUgYWN0aW9uLiAqLworCW1lbXNldCgmY2ZnLCAweDAwLCBzaXplb2YoY2ZnKSk7CisKKwkvKgorCSAqIEZvciBMaW51eCB3ZSBpbnZlcnQgQUNfQ0ZHX0FMT0MoKSBzbyBhcyB0byBjb25mb3JtCisJICogdG8gdGhlIHdheSB0aGF0IG5ldCBwYWNrZXRzIHJlYWNoIHVzIGZyb20gYWJvdmUuCisJICogKFNlZSBhbHNvIGFjX3R4X3QuKQorCSAqCisJICogVXBkYXRlZCBmcm9tIFdhdmVsYW4gTWFudWFsIFdDSU4wODVCCisJICovCisJY2ZnLmNmZ19ieXRlX2NudCA9CisJICAgIEFDX0NGR19CWVRFX0NOVChzaXplb2YoYWNfY2ZnX3QpIC0gc2l6ZW9mKGFjaF90KSk7CisJY2ZnLmNmZ19maWZvbGltID0gQUNfQ0ZHX0ZJRk9MSU0oNCk7CisJY2ZnLmNmZ19ieXRlOCA9IEFDX0NGR19TQVZfQkYoMSkgfCBBQ19DRkdfU1JEWSgwKTsKKwljZmcuY2ZnX2J5dGU5ID0gQUNfQ0ZHX0VMUEJDSygwKSB8CisJICAgIEFDX0NGR19JTFBCQ0soMCkgfAorCSAgICBBQ19DRkdfUFJFTEVOKEFDX0NGR19QTEVOXzIpIHwKKwkgICAgQUNfQ0ZHX0FMT0MoMSkgfCBBQ19DRkdfQUREUkxFTihXQVZFTEFOX0FERFJfU0laRSk7CisJY2ZnLmNmZ19ieXRlMTAgPSBBQ19DRkdfQk9GTUVUKDEpIHwKKwkgICAgQUNfQ0ZHX0FDUig2KSB8IEFDX0NGR19MSU5QUklPKDApOworCWNmZy5jZmdfaWZzID0gMHgyMDsKKwljZmcuY2ZnX3Nsb3RsID0gMHgwQzsKKwljZmcuY2ZnX2J5dGUxMyA9IEFDX0NGR19SRVRSWU5VTSgxNSkgfCBBQ19DRkdfU0xUVE1ISSgwKTsKKwljZmcuY2ZnX2J5dGUxNCA9IEFDX0NGR19GTEdQQUQoMCkgfAorCSAgICBBQ19DRkdfQlRTVEYoMCkgfAorCSAgICBBQ19DRkdfQ1JDMTYoMCkgfAorCSAgICBBQ19DRkdfTkNSQygwKSB8CisJICAgIEFDX0NGR19UTkNSUygxKSB8CisJICAgIEFDX0NGR19NQU5DSCgwKSB8CisJICAgIEFDX0NGR19CQ0RJUygwKSB8IEFDX0NGR19QUk0obHAtPnByb21pc2N1b3VzKTsKKwljZmcuY2ZnX2J5dGUxNSA9IEFDX0NGR19JQ0RTKDApIHwKKwkgICAgQUNfQ0ZHX0NEVEYoMCkgfCBBQ19DRkdfSUNTUygwKSB8IEFDX0NGR19DU1RGKDApOworLyoKKyAgY2ZnLmNmZ19taW5fZnJtX2xlbiA9IEFDX0NGR19NTkZSTSg2NCk7CisqLworCWNmZy5jZmdfbWluX2ZybV9sZW4gPSBBQ19DRkdfTU5GUk0oOCk7CisKKwljZmcuY2ZnX2guYWNfY29tbWFuZCA9IChBQ19DRkxEX0NNRCAmIGFjbWRfY29uZmlndXJlKTsKKwljZmcuY2ZnX2guYWNfbGluayA9IGlhc19hZGRyOworCW9icmFtX3dyaXRlKGlvYWRkciwgY2ZnX2FkZHIsICh1bnNpZ25lZCBjaGFyICopICZjZmcsIHNpemVvZihjZmcpKTsKKworCS8qIFNldCB1cCB0aGUgTUFDIGFkZHJlc3MgKi8KKwltZW1zZXQoJmlhcywgMHgwMCwgc2l6ZW9mKGlhcykpOworCWlhcy5pYXNfaC5hY19jb21tYW5kID0gKEFDX0NGTERfQ01EICYgYWNtZF9pYV9zZXR1cCk7CisJaWFzLmlhc19oLmFjX2xpbmsgPSBtY3NfYWRkcjsKKwltZW1jcHkoJmlhcy5pYXNfYWRkclswXSwgKHVuc2lnbmVkIGNoYXIgKikgJmRldi0+ZGV2X2FkZHJbMF0sCisJICAgICAgIHNpemVvZihpYXMuaWFzX2FkZHIpKTsKKwlvYnJhbV93cml0ZShpb2FkZHIsIGlhc19hZGRyLCAodW5zaWduZWQgY2hhciAqKSAmaWFzLCBzaXplb2YoaWFzKSk7CisKKwkvKiBJbml0aWFsaXplIGFkYXB0ZXIncyBFdGhlcm5ldCBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisJbWVtc2V0KCZtY3MsIDB4MDAsIHNpemVvZihtY3MpKTsKKwltY3MubWNzX2guYWNfY29tbWFuZCA9IEFDX0NGTERfSSB8IChBQ19DRkxEX0NNRCAmIGFjbWRfbWNfc2V0dXApOworCW1jcy5tY3NfaC5hY19saW5rID0gbm9wX2FkZHI7CisJbWNzLm1jc19jbnQgPSBXQVZFTEFOX0FERFJfU0laRSAqIGxwLT5tY19jb3VudDsKKwlvYnJhbV93cml0ZShpb2FkZHIsIG1jc19hZGRyLCAodW5zaWduZWQgY2hhciAqKSAmbWNzLCBzaXplb2YobWNzKSk7CisKKwkvKiBBbnkgYWRkcmVzcyB0byBzZXQ/ICovCisJaWYgKGxwLT5tY19jb3VudCkgeworCQlmb3IgKGRtaSA9IGRldi0+bWNfbGlzdDsgZG1pOyBkbWkgPSBkbWktPm5leHQpCisJCQlvdXRzdyhQSU9QMShpb2FkZHIpLCAodTE2ICopIGRtaS0+ZG1pX2FkZHIsCisJCQkgICAgICBXQVZFTEFOX0FERFJfU0laRSA+PiAxKTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IHd2XzgyNTg2X2NvbmZpZygpOiBzZXQgJWQgbXVsdGljYXN0IGFkZHJlc3NlczpcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGxwLT5tY19jb3VudCk7CisJCWZvciAoZG1pID0gZGV2LT5tY19saXN0OyBkbWk7IGRtaSA9IGRtaS0+bmV4dCkKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkgICAgICAgIiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCSAgICAgICBkbWktPmRtaV9hZGRyWzBdLCBkbWktPmRtaV9hZGRyWzFdLAorCQkJICAgICAgIGRtaS0+ZG1pX2FkZHJbMl0sIGRtaS0+ZG1pX2FkZHJbM10sCisJCQkgICAgICAgZG1pLT5kbWlfYWRkcls0XSwgZG1pLT5kbWlfYWRkcls1XSk7CisjZW5kaWYKKwl9CisKKwkvKgorCSAqIE92ZXJ3cml0ZSB0aGUgcHJlZGVjZXNzb3IgTk9QIGxpbmsKKwkgKiBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY29uZmlndXJlIGFjdGlvbi4KKwkgKi8KKwlub3BfYWRkciA9IHR4cHJlZCArIHNpemVvZih0eCk7CisJbm9wLm5vcF9oLmFjX3N0YXR1cyA9IDA7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCB0b2ZmKGFjX25vcF90LCBub3BfYWRkciwgbm9wX2guYWNfc3RhdHVzKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZub3Aubm9wX2guYWNfc3RhdHVzLAorCQkgICAgc2l6ZW9mKG5vcC5ub3BfaC5hY19zdGF0dXMpKTsKKwlub3Aubm9wX2guYWNfbGluayA9IGNmZ19hZGRyOworCW9icmFtX3dyaXRlKGlvYWRkciwgdG9mZihhY19ub3BfdCwgbm9wX2FkZHIsIG5vcF9oLmFjX2xpbmspLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJm5vcC5ub3BfaC5hY19saW5rLAorCQkgICAgc2l6ZW9mKG5vcC5ub3BfaC5hY19saW5rKSk7CisKKwkvKiBKb2IgZG9uZSwgY2xlYXIgdGhlIGZsYWcgKi8KKwlscC0+cmVjb25maWdfODI1ODYgPSAwOworCisJaWYgKGxwLT50eF9maXJzdF9pbl91c2UgPT0gSTgyNTg2TlVMTCkKKwkJbHAtPnR4X2ZpcnN0X2luX3VzZSA9IHR4YmxvY2s7CisKKwlpZiAobHAtPnR4X25faW5fdXNlID09IChOVFhCTE9DS1MgLSAxKSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2XzgyNTg2X2NvbmZpZygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUsIGNhbGxlZCBieSB3YXZlbGFuX2Nsb3NlKCksIGdyYWNlZnVsbHkgc3RvcHMgdGhlIAorICogV2F2ZUxBTiBjb250cm9sbGVyIChpODI1ODYpLgorICogKGNhbGxlZCBieSB3YXZlbGFuX2Nsb3NlKCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3dl84MjU4Nl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXUxNiBzY2JfY21kOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2XzgyNTg2X3N0b3AoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogU3VzcGVuZCBib3RoIGNvbW1hbmQgdW5pdCBhbmQgcmVjZWl2ZSB1bml0LiAqLworCXNjYl9jbWQgPQorCSAgICAoU0NCX0NNRF9DVUMgJiBTQ0JfQ01EX0NVQ19TVVMpIHwgKFNDQl9DTURfUlVDICYKKwkJCQkJICAgICAgIFNDQl9DTURfUlVDX1NVUyk7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX2NvbW1hbmQpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJnNjYl9jbWQsIHNpemVvZihzY2JfY21kKSk7CisJc2V0X2NoYW5fYXR0bihpb2FkZHIsIGxwLT5oYWNyKTsKKworCS8qIE5vIG1vcmUgaW50ZXJydXB0cyAqLworCXd2X2ludHNfb2ZmKGRldik7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfODI1ODZfc3RvcCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUb3RhbGx5IHJlc2V0IHRoZSBXYXZlTEFOIGFuZCByZXN0YXJ0IGl0LgorICogUGVyZm9ybXMgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgorICoJMS4gQSBwb3dlciByZXNldCAocmVzZXQgRE1BKQorICoJMi4gSW5pdGlhbGl6ZSB0aGUgcmFkaW8gbW9kZW0gKHVzaW5nIHd2X21tY19pbml0KQorICoJMy4gUmVzZXQgJiBDb25maWd1cmUgTEFOIGNvbnRyb2xsZXIgKHVzaW5nIHd2XzgyNTg2X3N0YXJ0KQorICoJNC4gU3RhcnQgdGhlIExBTiBjb250cm9sbGVyJ3MgY29tbWFuZCB1bml0CisgKgk1LiBTdGFydCB0aGUgTEFOIGNvbnRyb2xsZXIncyByZWNlaXZlIHVuaXQKKyAqIChjYWxsZWQgYnkgd2F2ZWxhbl9pbnRlcnJ1cHQoKSwgd2F2ZWxhbl93YXRjaGRvZygpICYgd2F2ZWxhbl9vcGVuKCkpCisgKi8KK3N0YXRpYyBpbnQgd3ZfaHdfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfaHdfcmVzZXQoZGV2PTB4JXgpXG4iLCBkZXYtPm5hbWUsCisJICAgICAgICh1bnNpZ25lZCBpbnQpIGRldik7CisjZW5kaWYKKworCS8qIEluY3JlYXNlIHRoZSBudW1iZXIgb2YgcmVzZXRzIGRvbmUuICovCisJbHAtPm5yZXNldHMrKzsKKworCXd2X2hhY3JfcmVzZXQoaW9hZGRyKTsKKwlscC0+aGFjciA9IEhBQ1JfREVGQVVMVDsKKworCWlmICgod3ZfbW1jX2luaXQoZGV2KSA8IDApIHx8ICh3dl84MjU4Nl9zdGFydChkZXYpIDwgMCkpCisJCXJldHVybiAtMTsKKworCS8qIEVuYWJsZSB0aGUgY2FyZCB0byBzZW5kIGludGVycnVwdHMuICovCisJd3ZfaW50c19vbihkZXYpOworCisJLyogU3RhcnQgY2FyZCBmdW5jdGlvbnMgKi8KKwlpZiAod3ZfY3Vfc3RhcnQoZGV2KSA8IDApCisJCXJldHVybiAtMTsKKworCS8qIFNldHVwIHRoZSBjb250cm9sbGVyIGFuZCBwYXJhbWV0ZXJzICovCisJd3ZfODI1ODZfY29uZmlnKGRldik7CisKKwkvKiBGaW5pc2ggY29uZmlndXJhdGlvbiB3aXRoIHRoZSByZWNlaXZlIHVuaXQgKi8KKwlpZiAod3ZfcnVfc3RhcnQoZGV2KSA8IDApCisJCXJldHVybiAtMTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9od19yZXNldCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBDaGVjayBpZiB0aGVyZSBpcyBhIFdhdmVMQU4gYXQgdGhlIHNwZWNpZmljIGJhc2UgYWRkcmVzcy4KKyAqIEFzIGEgc2lkZSBlZmZlY3QsIHRoaXMgcmVhZHMgdGhlIE1BQyBhZGRyZXNzLgorICogKGNhbGxlZCBpbiB3YXZlbGFuX3Byb2JlKCkgYW5kIGluaXRfbW9kdWxlKCkpCisgKi8KK3N0YXRpYyBpbnQgd3ZfY2hlY2tfaW9hZGRyKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1OCAqIG1hYykKK3sKKwlpbnQgaTsJCQkvKiBMb29wIGNvdW50ZXIgKi8KKworCS8qIENoZWNrIGlmIHRoZSBiYXNlIGFkZHJlc3MgaWYgYXZhaWxhYmxlLiAqLworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBzaXplb2YoaGFfdCksICJ3YXZlbGFuIHByb2JlIikpCisJCXJldHVybiAtRUJVU1k7CQkvKiBpb2FkZHIgYWxyZWFkeSB1c2VkICovCisKKwkvKiBSZXNldCBob3N0IGludGVyZmFjZSAqLworCXd2X2hhY3JfcmVzZXQoaW9hZGRyKTsKKworCS8qIFJlYWQgdGhlIE1BQyBhZGRyZXNzIGZyb20gdGhlIHBhcmFtZXRlciBzdG9yYWdlIGFyZWEuICovCisJcHNhX3JlYWQoaW9hZGRyLCBIQUNSX0RFRkFVTFQsIHBzYW9mZigwLCBwc2FfdW5pdl9tYWNfYWRkciksCisJCSBtYWMsIDYpOworCisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBzaXplb2YoaGFfdCkpOworCisJLyoKKwkgKiBDaGVjayB0aGUgZmlyc3QgdGhyZWUgb2N0ZXRzIG9mIHRoZSBhZGRyZXNzIGZvciB0aGUgbWFudWZhY3R1cmVyJ3MgY29kZS4KKwkgKiBOb3RlOiBpZiB0aGlzIGNhbid0IGZpbmQgeW91ciBXYXZlTEFOIGNhcmQsIHlvdSd2ZSBnb3QgYQorCSAqIG5vbi1OQ1IvQVQmVC9MdWNlbnQgSVNBIGNhcmQuICBTZWUgd2F2ZWxhbi5wLmggZm9yIGRldGFpbCBvbgorCSAqIGhvdyB0byBjb25maWd1cmUgeW91ciBjYXJkLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKE1BQ19BRERSRVNTRVMpIC8gc2l6ZW9mKGNoYXIpIC8gMyk7IGkrKykKKwkJaWYgKChtYWNbMF0gPT0gTUFDX0FERFJFU1NFU1tpXVswXSkgJiYKKwkJICAgIChtYWNbMV0gPT0gTUFDX0FERFJFU1NFU1tpXVsxXSkgJiYKKwkJICAgIChtYWNbMl0gPT0gTUFDX0FERFJFU1NFU1tpXVsyXSkpCisJCQlyZXR1cm4gMDsKKworI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisJcHJpbnRrKEtFUk5fV0FSTklORworCSAgICAgICAiV2F2ZUxBTiAoMHglM1gpOiB5b3VyIE1BQyBhZGRyZXNzIG1pZ2h0IGJlICUwMlg6JTAyWDolMDJYLlxuIiwKKwkgICAgICAgaW9hZGRyLCBtYWNbMF0sIG1hY1sxXSwgbWFjWzJdKTsKKyNlbmRpZgorCXJldHVybiAtRU5PREVWOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqIElOVEVSUlVQVCBIQU5ETElORyAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIFdhdmVMQU4gY2FyZC4gVGhpcworICogcm91dGluZSB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlcjogCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB3YXZlbGFuX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHI7CisJbmV0X2xvY2FsICpscDsKKwl1MTYgaGFzcjsKKwl1MTYgc3RhdHVzOworCXUxNiBhY2tfY21kOworCisJZGV2ID0gZGV2X2lkOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5faW50ZXJydXB0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCWxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCS8qIENoZWNrIHN0YXRlIG9mIG91ciBzcGlubG9jayAqLworCWlmKHNwaW5faXNfbG9ja2VkKCZscC0+c3BpbmxvY2spKQorCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiB3YXZlbGFuX2ludGVycnVwdCgpOiBzcGlubG9jayBpcyBhbHJlYWR5IGxvY2tlZCAhISFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKiBQcmV2ZW50IHJlZW50cmFuY3kuIFdlIG5lZWQgdG8gZG8gdGhhdCBiZWNhdXNlIHdlIG1heSBoYXZlCisJICogbXVsdGlwbGUgaW50ZXJydXB0IGhhbmRsZXIgcnVubmluZyBjb25jdXJyZW50bHkuCisJICogSXQgaXMgc2FmZSBiZWNhdXNlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGJlZm9yZSBhY3F1aXJpbmcKKwkgKiB0aGUgc3BpbmxvY2suICovCisJc3Bpbl9sb2NrKCZscC0+c3BpbmxvY2spOworCisJLyogV2UgYWx3YXlzIGhhZCBzcHVyaW91cyBpbnRlcnJ1cHRzIGF0IHN0YXJ0dXAsIGJ1dCBsYXRlbHkgSQorCSAqIHNhdyB0aGVtIGNvbW1pbmcgKmJldHdlZW4qIHRoZSByZXF1ZXN0X2lycSgpIGFuZCB0aGUKKwkgKiBzcGluX2xvY2tfaXJxc2F2ZSgpIGluIHdhdmVsYW5fb3BlbigpLCBzbyB0aGUgc3BpbmxvY2sKKwkgKiBwcm90ZWN0aW9uIGlzIG5vIGVub3VnaC4KKwkgKiBTbywgd2UgYWxzbyBjaGVjayBscC0+aGFjciB0aGF0IHdpbGwgdGVsbCB1cyBpcyB3ZSBlbmFibGVkCisJICogaXJxcyBvciBub3QgKHNlZSB3dl9pbnRzX29uKCkpLgorCSAqIFdlIGNhbid0IHVzZSBuZXRpZl9ydW5uaW5nKGRldikgYmVjYXVzZSB3ZSBkZXBlbmQgb24gdGhlCisJICogcHJvcGVyIHByb2Nlc3Npbmcgb2YgdGhlIGlycSBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBjb25maWcuICovCisKKwkvKiBXaGljaCBpbnRlcnJ1cHQgaXQgaXMgPyAqLworCWhhc3IgPSBoYXNyX3JlYWQoaW9hZGRyKTsKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9JTkZPCisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiJXM6IHdhdmVsYW5faW50ZXJydXB0KCk6IGhhc3IgMHglMDR4OyBoYWNyIDB4JTA0eC5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgaGFzciwgbHAtPmhhY3IpOworI2VuZGlmCisKKwkvKiBDaGVjayBtb2RlbSBpbnRlcnJ1cHQgKi8KKwlpZiAoKGhhc3IgJiBIQVNSX01NQ19JTlRSKSAmJiAobHAtPmhhY3IgJiBIQUNSX01NQ19JTlRfRU5BQkxFKSkgeworCQl1OCBkY2Vfc3RhdHVzOworCisJCS8qCisJCSAqIEludGVycnVwdCBmcm9tIHRoZSBtb2RlbSBtYW5hZ2VtZW50IGNvbnRyb2xsZXIuCisJCSAqIFRoaXMgd2lsbCBjbGVhciBpdCAtLSBpZ25vcmVkIGZvciBub3cuCisJCSAqLworCQltbWNfcmVhZChpb2FkZHIsIG1tcm9mZigwLCBtbXJfZGNlX3N0YXR1cyksICZkY2Vfc3RhdHVzLAorCQkJIHNpemVvZihkY2Vfc3RhdHVzKSk7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3YXZlbGFuX2ludGVycnVwdCgpOiB1bmV4cGVjdGVkIG1tYyBpbnRlcnJ1cHQ6IHN0YXR1cyAweCUwNHguXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBkY2Vfc3RhdHVzKTsKKyNlbmRpZgorCX0KKworCS8qIENoZWNrIGlmIG5vdCBjb250cm9sbGVyIGludGVycnVwdCAqLworCWlmICgoKGhhc3IgJiBIQVNSXzgyNTg2X0lOVFIpID09IDApIHx8CisJICAgICgobHAtPmhhY3IgJiBIQUNSXzgyNTg2X0lOVF9FTkFCTEUpID09IDApKSB7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogaW50ZXJydXB0IG5vdCBjb21pbmcgZnJvbSBpODI1ODYgLSBoYXNyIDB4JTA0eC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGhhc3IpOworI2VuZGlmCisJCXNwaW5fdW5sb2NrICgmbHAtPnNwaW5sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCS8qIFJlYWQgaW50ZXJydXB0IGRhdGEuICovCisJb2JyYW1fcmVhZChpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2Jfc3RhdHVzKSwKKwkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpOworCisJLyoKKwkgKiBBY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0KHMpLgorCSAqLworCWFja19jbWQgPSBzdGF0dXMgJiBTQ0JfU1RfSU5UOworCW9icmFtX3dyaXRlKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9jb21tYW5kKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZhY2tfY21kLCBzaXplb2YoYWNrX2NtZCkpOworCXNldF9jaGFuX2F0dG4oaW9hZGRyLCBscC0+aGFjcik7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCXByaW50ayhLRVJOX0RFQlVHICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogc3RhdHVzIDB4JTA0eC5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKyNlbmRpZgorCisJLyogQ29tbWFuZCBjb21wbGV0ZWQuICovCisJaWYgKChzdGF0dXMgJiBTQ0JfU1RfQ1gpID09IFNDQl9TVF9DWCkgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IHdhdmVsYW5faW50ZXJydXB0KCk6IGNvbW1hbmQgY29tcGxldGVkLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJd3ZfY29tcGxldGUoZGV2LCBpb2FkZHIsIGxwKTsKKwl9CisKKwkvKiBGcmFtZSByZWNlaXZlZC4gKi8KKwlpZiAoKHN0YXR1cyAmIFNDQl9TVF9GUikgPT0gU0NCX1NUX0ZSKSB7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogcmVjZWl2ZWQgcGFja2V0LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJd3ZfcmVjZWl2ZShkZXYpOworCX0KKworCS8qIENoZWNrIHRoZSBzdGF0ZSBvZiB0aGUgY29tbWFuZCB1bml0LiAqLworCWlmICgoKHN0YXR1cyAmIFNDQl9TVF9DTkEpID09IFNDQl9TVF9DTkEpIHx8CisJICAgICgoKHN0YXR1cyAmIFNDQl9TVF9DVVMpICE9IFNDQl9TVF9DVVNfQUNUVikgJiYKKwkgICAgIChuZXRpZl9ydW5uaW5nKGRldikpKSkgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5faW50ZXJydXB0KCk6IENVIGluYWN0aXZlIC0tIHJlc3RhcnRpbmdcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXd2X2h3X3Jlc2V0KGRldik7CisJfQorCisJLyogQ2hlY2sgdGhlIHN0YXRlIG9mIHRoZSBjb21tYW5kIHVuaXQuICovCisJaWYgKCgoc3RhdHVzICYgU0NCX1NUX1JOUikgPT0gU0NCX1NUX1JOUikgfHwKKwkgICAgKCgoc3RhdHVzICYgU0NCX1NUX1JVUykgIT0gU0NCX1NUX1JVU19SRFkpICYmCisJICAgICAobmV0aWZfcnVubmluZyhkZXYpKSkpIHsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3YXZlbGFuX2ludGVycnVwdCgpOiBSVSBub3QgcmVhZHkgLS0gcmVzdGFydGluZ1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJd3ZfaHdfcmVzZXQoZGV2KTsKKwl9CisKKwkvKiBSZWxlYXNlIHNwaW5sb2NrICovCisJc3Bpbl91bmxvY2sgKCZscC0+c3BpbmxvY2spOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5faW50ZXJydXB0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXYXRjaGRvZzogd2hlbiB3ZSBzdGFydCBhIHRyYW5zbWlzc2lvbiwgYSB0aW1lciBpcyBzZXQgZm9yIHVzIGluIHRoZQorICoga2VybmVsLiAgSWYgdGhlIHRyYW5zbWlzc2lvbiBjb21wbGV0ZXMsIHRoaXMgdGltZXIgaXMgZGlzYWJsZWQuIElmCisgKiB0aGUgdGltZXIgZXhwaXJlcywgd2UgYXJlIGNhbGxlZCBhbmQgd2UgdHJ5IHRvIHVubG9jayB0aGUgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkIHdhdmVsYW5fd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisJbmV0X2xvY2FsICoJbHAgPSAobmV0X2xvY2FsICopZGV2LT5wcml2OworCXVfbG9uZwkJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1bnNpZ25lZCBpbnQJbnJlYXBlZDsKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX3dhdGNoZG9nKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorCXByaW50ayhLRVJOX0lORk8gIiVzOiB3YXZlbGFuX3dhdGNoZG9nOiB3YXRjaGRvZyB0aW1lciBleHBpcmVkXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKiBDaGVjayB0aGF0IHdlIGNhbWUgaGVyZSBmb3Igc29tZXRoaW5nICovCisJaWYgKGxwLT50eF9uX2luX3VzZSA8PSAwKSB7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBUcnkgdG8gc2VlIGlmIHNvbWUgYnVmZmVycyBhcmUgbm90IGZyZWUgKGluIGNhc2Ugd2UgbWlzc2VkCisJICogYW4gaW50ZXJydXB0ICovCisJbnJlYXBlZCA9IHd2X2NvbXBsZXRlKGRldiwgaW9hZGRyLCBscCk7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICIlczogd2F2ZWxhbl93YXRjaGRvZygpOiAlZCByZWFwZWQsICVkIHJlbWFpbi5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgbnJlYXBlZCwgbHAtPnR4X25faW5fdXNlKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfUFNBX1NIT1cKKwl7CisJCXBzYV90IHBzYTsKKwkJcHNhX3JlYWQoZGV2LCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisJCXd2X3BzYV9zaG93KCZwc2EpOworCX0KKyNlbmRpZgorI2lmZGVmIERFQlVHX01NQ19TSE9XCisJd3ZfbW1jX3Nob3coZGV2KTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX0k4MjU4Nl9TSE9XCisJd3ZfY3Vfc2hvdyhkZXYpOworI2VuZGlmCisKKwkvKiBJZiBubyBidWZmZXIgaGFzIGJlZW4gZnJlZWQgKi8KKwlpZiAobnJlYXBlZCA9PSAwKSB7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd2F2ZWxhbl93YXRjaGRvZygpOiBjbGVhbnVwIGZhaWxlZCwgdHJ5aW5nIHJlc2V0XG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQl3dl9od19yZXNldChkZXYpOworCX0KKworCS8qIEF0IHRoaXMgcG9pbnQsIHdlIHNob3VsZCBoYXZlIHNvbWUgZnJlZSBUeCBidWZmZXIgOy0pICovCisJaWYgKGxwLT50eF9uX2luX3VzZSA8IE5UWEJMT0NLUyAtIDEpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX3dhdGNoZG9nKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKiBDT05GSUdVUkFUSU9OIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogSGVyZSBhcmUgdGhlIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlIExpbnV4IG5ldHdvcmtpbmcgY29kZSAoTkVUMykKKyAqIGZvciBpbml0aWFsaXphdGlvbiwgY29uZmlndXJhdGlvbiBhbmQgZGVpbnN0YWxsYXRpb25zIG9mIHRoZSAKKyAqIFdhdmVMQU4gSVNBIGhhcmR3YXJlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBDb25maWd1cmUgYW5kIHN0YXJ0IHVwIHRoZSBXYXZlTEFOIFBDTUNJQSBhZGFwdG9yLgorICogQ2FsbGVkIGJ5IE5FVDMgd2hlbiBpdCAib3BlbnMiIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqCWxwID0gKG5ldF9sb2NhbCAqKWRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d2F2ZWxhbl9vcGVuKGRldj0weCV4KVxuIiwgZGV2LT5uYW1lLAorCSAgICAgICAodW5zaWduZWQgaW50KSBkZXYpOworI2VuZGlmCisKKwkvKiBDaGVjayBpcnEgKi8KKwlpZiAoZGV2LT5pcnEgPT0gMCkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogd2F2ZWxhbl9vcGVuKCk6IG5vIElSUVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZ3YXZlbGFuX2ludGVycnVwdCwgMCwgIldhdmVMQU4iLCBkZXYpICE9IDApIAorCXsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHdhdmVsYW5fb3BlbigpOiBpbnZhbGlkIElSUVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCWlmICh3dl9od19yZXNldChkZXYpICE9IC0xKSB7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJfSBlbHNlIHsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd2F2ZWxhbl9vcGVuKCk6IGltcG9zc2libGUgdG8gc3RhcnQgdGhlIGNhcmRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9vcGVuKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNodXQgZG93biB0aGUgV2F2ZUxBTiBJU0EgY2FyZC4KKyAqIENhbGxlZCBieSBORVQzIHdoZW4gaXQgImNsb3NlcyIgdGhlIGRldmljZS4KKyAqLworc3RhdGljIGludCB3YXZlbGFuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d2F2ZWxhbl9jbG9zZShkZXY9MHgleClcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgKHVuc2lnbmVkIGludCkgZGV2KTsKKyNlbmRpZgorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyoKKwkgKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnguCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCXd2XzgyNTg2X3N0b3AoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9jbG9zZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBQcm9iZSBhbiBJL08gYWRkcmVzcywgYW5kIGlmIHRoZSBXYXZlTEFOIGlzIHRoZXJlIGNvbmZpZ3VyZSB0aGUKKyAqIGRldmljZSBzdHJ1Y3R1cmUKKyAqIChjYWxsZWQgYnkgd2F2ZWxhbl9wcm9iZSgpIGFuZCB2aWEgaW5pdF9tb2R1bGUoKSkuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHdhdmVsYW5fY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IGlvYWRkcikKK3sKKwl1OCBpcnFfbWFzazsKKwlpbnQgaXJxOworCW5ldF9sb2NhbCAqbHA7CisJbWFjX2FkZHIgbWFjOworCWludCBlcnI7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgc2l6ZW9mKGhhX3QpLCAid2F2ZWxhbiIpKQorCQlyZXR1cm4gLUVBRERSSU5VU0U7CisKKwllcnIgPSB3dl9jaGVja19pb2FkZHIoaW9hZGRyLCBtYWMpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIG1hYywgNik7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fY29uZmlnKGRldj0weCV4LCBpb2FkZHI9MHglbHgpXG4iLAorCSAgICAgICBkZXYtPm5hbWUsICh1bnNpZ25lZCBpbnQpIGRldiwgaW9hZGRyKTsKKyNlbmRpZgorCisJLyogQ2hlY2sgSVJRIGFyZ3VtZW50IG9uIGNvbW1hbmQgbGluZS4gKi8KKwlpZiAoZGV2LT5pcnEgIT0gMCkgeworCQlpcnFfbWFzayA9IHd2X2lycV90b19wc2EoZGV2LT5pcnEpOworCisJCWlmIChpcnFfbWFzayA9PSAwKSB7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiB3YXZlbGFuX2NvbmZpZygpOiBpbnZhbGlkIElSUSAlZCBpZ25vcmVkLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKyNlbmRpZgorCQkJZGV2LT5pcnEgPSAwOworCQl9IGVsc2UgeworI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICIlczogd2F2ZWxhbl9jb25maWcoKTogY2hhbmdpbmcgSVJRIHRvICVkXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEpOworI2VuZGlmCisJCQlwc2Ffd3JpdGUoaW9hZGRyLCBIQUNSX0RFRkFVTFQsCisJCQkJICBwc2FvZmYoMCwgcHNhX2ludF9yZXFfbm8pLCAmaXJxX21hc2ssIDEpOworCQkJLyogdXBkYXRlIHRoZSBXYXZlbGFuIGNoZWNrc3VtICovCisJCQl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldiwgaW9hZGRyLCBIQUNSX0RFRkFVTFQpOworCQkJd3ZfaGFjcl9yZXNldChpb2FkZHIpOworCQl9CisJfQorCisJcHNhX3JlYWQoaW9hZGRyLCBIQUNSX0RFRkFVTFQsIHBzYW9mZigwLCBwc2FfaW50X3JlcV9ubyksCisJCSAmaXJxX21hc2ssIDEpOworCWlmICgoaXJxID0gd3ZfcHNhX3RvX2lycShpcnFfbWFzaykpID09IC0xKSB7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd2F2ZWxhbl9jb25maWcoKTogY291bGQgbm90IHdhdmVsYW5fbWFwX2lycSglZCkuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBpcnFfbWFzayk7CisjZW5kaWYKKwkJZXJyID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2LT5pcnEgPSBpcnE7CisKKwlkZXYtPm1lbV9zdGFydCA9IDB4MDAwMDsKKwlkZXYtPm1lbV9lbmQgPSAweDAwMDA7CisJZGV2LT5pZl9wb3J0ID0gMDsKKworCS8qIEluaXRpYWxpemUgZGV2aWNlIHN0cnVjdHVyZXMgKi8KKwltZW1zZXQoZGV2LT5wcml2LCAwLCBzaXplb2YobmV0X2xvY2FsKSk7CisJbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCS8qIEJhY2sgbGluayB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlscC0+ZGV2ID0gZGV2OworCS8qIEFkZCB0aGUgZGV2aWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmtlZCBsaXN0LiAqLworCWxwLT5uZXh0ID0gd2F2ZWxhbl9saXN0OworCXdhdmVsYW5fbGlzdCA9IGxwOworCisJbHAtPmhhY3IgPSBIQUNSX0RFRkFVTFQ7CisKKwkvKiBNdWx0aWNhc3Qgc3R1ZmYgKi8KKwlscC0+cHJvbWlzY3VvdXMgPSAwOworCWxwLT5tY19jb3VudCA9IDA7CisKKwkvKiBJbml0IHNwaW5sb2NrICovCisJc3Bpbl9sb2NrX2luaXQoJmxwLT5zcGlubG9jayk7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJZGV2LT5vcGVuID0gd2F2ZWxhbl9vcGVuOworCWRldi0+c3RvcCA9IHdhdmVsYW5fY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB3YXZlbGFuX3BhY2tldF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gd2F2ZWxhbl9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmd2F2ZWxhbl9zZXRfbXVsdGljYXN0X2xpc3Q7CisgICAgICAgIGRldi0+dHhfdGltZW91dAkJPSAmd2F2ZWxhbl93YXRjaGRvZzsKKyAgICAgICAgZGV2LT53YXRjaGRvZ190aW1lbwk9IFdBVENIRE9HX0pJRkZJRVM7CisjaWZkZWYgU0VUX01BQ19BRERSRVNTCisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAmd2F2ZWxhbl9zZXRfbWFjX2FkZHJlc3M7CisjZW5kaWYJCQkJLyogU0VUX01BQ19BRERSRVNTICovCisKKyNpZmRlZiBXSVJFTEVTU19FWFQJCS8qIGlmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdHMgaW4gdGhlIGtlcm5lbCAqLworCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmd2F2ZWxhbl9oYW5kbGVyX2RlZjsKKwlscC0+d2lyZWxlc3NfZGF0YS5zcHlfZGF0YSA9ICZscC0+c3B5X2RhdGE7CisJZGV2LT53aXJlbGVzc19kYXRhID0gJmxwLT53aXJlbGVzc19kYXRhOworI2VuZGlmCisKKwlkZXYtPm10dSA9IFdBVkVMQU5fTVRVOworCisJLyogRGlzcGxheSBuaWNlIGluZm9ybWF0aW9uLiAqLworCXd2X2luaXRfaW5mbyhkZXYpOworCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9jb25maWcoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgc2l6ZW9mKGhhX3QpKTsKKwlyZXR1cm4gZXJyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ2hlY2sgZm9yIGEgbmV0d29yayBhZGFwdG9yIG9mIHRoaXMgdHlwZS4gIFJldHVybiAnMCcgaWZmIG9uZSAKKyAqIGV4aXN0cy4gIFRoZXJlIHNlZW0gdG8gYmUgZGlmZmVyZW50IGludGVycHJldGF0aW9ucyBvZgorICogdGhlIGluaXRpYWwgdmFsdWUgb2YgZGV2LT5iYXNlX2FkZHIuCisgKiBXZSBmb2xsb3cgdGhlIGV4YW1wbGUgaW4gZHJpdmVycy9uZXQvbmUuYy4KKyAqIChjYWxsZWQgaW4gIlNwYWNlLmMiKQorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCB3YXZlbGFuX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc2hvcnQgYmFzZV9hZGRyOworCWludCBkZWZfaXJxOworCWludCBpOworCWludCByID0gMDsKKworI2lmZGVmCVNUUlVDVF9DSEVDSworCWlmICh3dl9zdHJ1Y3RfY2hlY2soKSAhPSAoY2hhciAqKSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogd2F2ZWxhbl9wcm9iZSgpOiBzdHJ1Y3R1cmUvY29tcGlsZXIgYm90Y2g6IFwiJXNcIlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgd3Zfc3RydWN0X2NoZWNrKCkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisjZW5kaWYJCQkJLyogU1RSVUNUX0NIRUNLICovCisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YobmV0X2xvY2FsKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJZGVmX2lycSA9IGRldi0+aXJxOworCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiJXM6IC0+d2F2ZWxhbl9wcm9iZShkZXY9JXAgKGJhc2VfYWRkcj0weCV4KSlcbiIsCisJICAgICAgIGRldi0+bmFtZSwgZGV2LCAodW5zaWduZWQgaW50KSBkZXYtPmJhc2VfYWRkcik7CisjZW5kaWYKKworCS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwlpZiAoYmFzZV9hZGRyIDwgMCkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IHdhdmVsYW5fcHJvYmUoKTogaW52YWxpZCBiYXNlIGFkZHJlc3NcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXIgPSAtRU5YSU87CisJfSBlbHNlIGlmIChiYXNlX2FkZHIgPiAweDEwMCkgeyAvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCXIgPSB3YXZlbGFuX2NvbmZpZyhkZXYsIGJhc2VfYWRkcik7CisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKwkJaWYgKHIgIT0gMCkKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkgICAgICAgIiVzOiB3YXZlbGFuX3Byb2JlKCk6IG5vIGRldmljZSBhdCBzcGVjaWZpZWQgYmFzZSBhZGRyZXNzICgweCVYKSBvciBhZGRyZXNzIGFscmVhZHkgaW4gdXNlXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgYmFzZV9hZGRyKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fcHJvYmUoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCX0gZWxzZSB7IC8qIFNjYW4gYWxsIHBvc3NpYmxlIGFkZHJlc3NlcyBvZiB0aGUgV2F2ZUxBTiBoYXJkd2FyZS4gKi8KKwkJZm9yIChpID0gMDsgaSA8IE5FTFMoaW9iYXNlKTsgaSsrKSB7CisJCQlkZXYtPmlycSA9IGRlZl9pcnE7CisJCQlpZiAod2F2ZWxhbl9jb25maWcoZGV2LCBpb2Jhc2VbaV0pID09IDApIHsKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogPC13YXZlbGFuX3Byb2JlKClcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaSA9PSBORUxTKGlvYmFzZSkpCisJCQlyID0gLUVOT0RFVjsKKwl9CisJaWYgKHIpIAorCQlnb3RvIG91dDsKKwlyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgc2l6ZW9mKGhhX3QpKTsKKwl3YXZlbGFuX2xpc3QgPSB3YXZlbGFuX2xpc3QtPm5leHQ7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNT0RVTEUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIE1vZHVsZSBlbnRyeSBwb2ludDogaW5zZXJ0aW9uIGFuZCByZW1vdmFsCisgKi8KKworI2lmZGVmCU1PRFVMRQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEluc2VydGlvbiBvZiB0aGUgbW9kdWxlCisgKiBJJ20gbm93IHF1aXRlIHByb3VkIG9mIHRoZSBtdWx0aS1kZXZpY2Ugc3VwcG9ydC4KKyAqLworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldCA9IC1FSU87CQkvKiBSZXR1cm4gZXJyb3IgaWYgbm8gY2FyZHMgZm91bmQgKi8KKwlpbnQgaTsKKworI2lmZGVmIERFQlVHX01PRFVMRV9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICItPiBpbml0X21vZHVsZSgpXG4iKTsKKyNlbmRpZgorCisJLyogSWYgcHJvYmluZyBpcyBhc2tlZCAqLworCWlmIChpb1swXSA9PSAwKSB7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJXYXZlTEFOIGluaXRfbW9kdWxlKCk6IGRvaW5nIGRldmljZSBwcm9iaW5nIChiYWQgISlcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiU3BlY2lmeSBiYXNlIGFkZHJlc3NlcyB3aGlsZSBsb2FkaW5nIG1vZHVsZSB0byBjb3JyZWN0IHRoZSBwcm9ibGVtXG4iKTsKKyNlbmRpZgorCisJCS8qIENvcHkgdGhlIGJhc2ljIHNldCBvZiBhZGRyZXNzIHRvIGJlIHByb2JlZC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IE5FTFMoaW9iYXNlKTsgaSsrKQorCQkJaW9baV0gPSBpb2Jhc2VbaV07CisJfQorCisKKwkvKiBMb29wIG9uIGFsbCBwb3NzaWJsZSBiYXNlIGFkZHJlc3Nlcy4gKi8KKwlpID0gLTE7CisJd2hpbGUgKChpb1srK2ldICE9IDApICYmIChpIDwgTkVMUyhpbykpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YobmV0X2xvY2FsKSk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWlmIChuYW1lW2ldKQorCQkJc3RyY3B5KGRldi0+bmFtZSwgbmFtZVtpXSk7CS8qIENvcHkgbmFtZSAqLworCQlkZXYtPmJhc2VfYWRkciA9IGlvW2ldOworCQlkZXYtPmlycSA9IGlycVtpXTsKKworCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBzb21ldGhpbmcgYXQgdGhpcyBiYXNlIGFkZHJlc3MuICovCisJCWlmICh3YXZlbGFuX2NvbmZpZyhkZXYsIGlvW2ldKSA9PSAwKSB7CisJCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCQkJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBzaXplb2YoaGFfdCkpOworCQkJCXdhdmVsYW5fbGlzdCA9IHdhdmVsYW5fbGlzdC0+bmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlmcmVlX25ldGRldihkZXYpOworCX0KKworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCWlmICghd2F2ZWxhbl9saXN0KQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiV2F2ZUxBTiBpbml0X21vZHVsZSgpOiBubyBkZXZpY2UgZm91bmRcbiIpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19NT0RVTEVfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiPC0gaW5pdF9tb2R1bGUoKVxuIik7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVtb3ZhbCBvZiB0aGUgbW9kdWxlCisgKi8KK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKyNpZmRlZiBERUJVR19NT0RVTEVfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiLT4gY2xlYW51cF9tb2R1bGUoKVxuIik7CisjZW5kaWYKKworCS8qIExvb3Agb24gYWxsIGRldmljZXMgYW5kIHJlbGVhc2UgdGhlbS4gKi8KKwl3aGlsZSAod2F2ZWxhbl9saXN0KSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3YXZlbGFuX2xpc3QtPmRldjsKKworI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IGNsZWFudXBfbW9kdWxlKCk6IHJlbW92aW5nIGRldmljZSBhdCAweCV4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCAodW5zaWduZWQgaW50KSBkZXYpOworI2VuZGlmCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIHNpemVvZihoYV90KSk7CisJCXdhdmVsYW5fbGlzdCA9IHdhdmVsYW5fbGlzdC0+bmV4dDsKKworCQlmcmVlX25ldGRldihkZXYpOworCX0KKworI2lmZGVmIERFQlVHX01PRFVMRV9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICI8LSBjbGVhbnVwX21vZHVsZSgpXG4iKTsKKyNlbmRpZgorfQorI2VuZGlmCQkJCS8qIE1PRFVMRSAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZAorICogYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogVGhpcyBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkIGFzIGEgY29tcG9uZW50IG9mIHRoZQorICogTGludXggb3BlcmF0aW5nIHN5c3RlbS4KKyAqIEl0IGlzIGJhc2VkIG9uIG90aGVyIGRldmljZSBkcml2ZXJzIGFuZCBpbmZvcm1hdGlvbgorICogZWl0aGVyIHdyaXR0ZW4gb3Igc3VwcGxpZWQgYnk6CisgKglBamF5IEJha3JlIChiYWtyZUBwYXVsLnJ1dGdlcnMuZWR1KSwKKyAqCURvbmFsZCBCZWNrZXIgKGJlY2tlckBzY3lsZC5jb20pLAorICoJTG9la2UgQnJlZGVydmVsZCAoTG9la2UuQnJlZGVydmVsZEBVdHJlY2h0Lk5DUi5jb20pLAorICoJQW5kZXJzIEtsZW1ldHMgKGtsZW1ldHNAaXQua3RoLnNlKSwKKyAqCVZsYWRpbWlyIFYuIEtvbHBha292ICh3QHN0aWVyLmtvZW5pZy5ydSksCisgKglNYXJjIE1lZXJ0ZW5zIChNYXJjLk1lZXJ0ZW5zQFV0cmVjaHQuTkNSLmNvbSksCisgKglQYXVsaW5lIE1pZGRlbGluayAobWlkZGVsaW5AcG9seXdhcmUuaWFmLm5sKSwKKyAqCVJvYmVydCBNb3JyaXMgKHJ0bUBkYXMuaGFydmFyZC5lZHUpLAorICoJSmVhbiBUb3VycmlsaGVzIChqdEBocGxiLmhwbC5ocC5jb20pLAorICoJR2lyaXNoIFdlbGxpbmcgKHdlbGxpbmdAcGF1bC5ydXRnZXJzLmVkdSksCisgKgorICogVGhhbmtzIGdvIGFsc28gdG86CisgKglKYW1lcyBBc2h0b24gKGphYTEwMUBzeXNlbmcuYW51LmVkdS5hdSksCisgKglBbGFuIENveCAoYWxhbkByZWRoYXQuY29tKSwKKyAqCUFsbGFuIENyZWlnaHRvbiAoYWxsYW5jQGNzLnVzeWQuZWR1LmF1KSwKKyAqCU1hdHRoZXcgR2VpZXIgKG1hdHRoZXdAY3MudXN5ZC5lZHUuYXUpLAorICoJUmVtbyBkaSBHaW92YW5uaSAocmVtb0Bjcy51c3lkLmVkdS5hdSksCisgKglFY2toYXJkIEdyYWggKGdyYWhAd3JjczEudXJ6LnVuaS13dXBwZXJ0YWwuZGUpLAorICoJVmlwdWwgR3VwdGEgKHZndXB0YUBjcy5iaW5naGFtdG9uLmVkdSksCisgKglNYXJrIEhhZ2FuIChtaGFnYW5Ad3RjcG9zdC5kYXl0b25vaC5OQ1IuQ09NKSwKKyAqCVRpbSBOaWNob2xzb24gKHRpbUBjcy51c3lkLmVkdS5hdSksCisgKglJYW4gUGFya2luIChpYW5AY3MudXN5ZC5lZHUuYXUpLAorICoJSm9obiBSb3NlbmJlcmcgKGpvaG5yQGNzLnVzeWQuZWR1LmF1KSwKKyAqCUdlb3JnZSBSb3NzaSAoZ2VvcmdlQHBobS5nb3YuYXUpLAorICoJQXJ0aHVyIFNjb3R0IChhcnRodXJAY3MudXN5ZC5lZHUuYXUpLAorICoJUGV0ZXIgU3RvcmV5LAorICogZm9yIHRoZWlyIGFzc2lzdGFuY2UgYW5kIGFkdmljZS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cywgdXBkYXRlcywgY29tbWVudHMgdG86CisgKgorICogQnJ1Y2UgSmFuc29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1haWw6ICBicnVjZUBjcy51c3lkLmVkdS5hdQorICogQmFzc2VyIERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZSAgICAgICAgICAgUGhvbmU6ICArNjEtMi05MzUxLTM0MjMKKyAqIFVuaXZlcnNpdHkgb2YgU3lkbmV5LCBOLlMuVy4sIDIwMDYsIEFVU1RSQUxJQSAgIEZheDogICAgKzYxLTItOTM1MS0zODM4CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzE3MmNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5oCkBAIC0wLDAgKzEsMzcwIEBACisvKgorICoJV2F2ZUxBTiBJU0EgZHJpdmVyCisgKgorICoJCUplYW4gSUkgLSBIUExCICc5NgorICoKKyAqIFJlb3JnYW5pc2F0aW9uIGFuZCBleHRlbnNpb24gb2YgdGhlIGRyaXZlci4KKyAqIE9yaWdpbmFsIGNvcHlyaWdodCBmb2xsb3dzLiBTZWUgd2F2ZWxhbi5wLmggZm9yIGRldGFpbHMuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgZm9yIHRoZSBXYXZlTEFOIGhhcmR3YXJlLiBOb3RlIHRoYXQKKyAqIHRoZSBXYXZlTEFOIElTQSBpbmNsdWRlcyBhIGk4MjU4NiBjb250cm9sbGVyIChzZWUgZGVmaW5pdGlvbnMgaW4KKyAqIGZpbGUgaTgyNTg2LmgpLgorICoKKyAqIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgSVNBIGhhcmR3YXJlIGFuZCB0aGUgUENNQ0lBIG9uZSBpcworICogdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIgKGk4MjU4NiBpbnN0ZWFkIG9mIGk4MjU5MykuCisgKiBUaGUgaTgyNTg2IGFsbG93cyBtdWx0aXBsZSB0cmFuc21pdCBidWZmZXJzLiAgVGhlIFBTQSBuZWVkcyB0byBiZSBhY2Nlc3NlZAorICogdGhyb3VnaCB0aGUgaG9zdCBpbnRlcmZhY2UuCisgKi8KKworI2lmbmRlZiBfV0FWRUxBTl9ICisjZGVmaW5lCV9XQVZFTEFOX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIE1BR0lDIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZXRlY3Rpb24gb2YgdGhlIFdhdmVMQU4gY2FyZCBpcyBkb25lIGJ5IHJlYWRpbmcgdGhlIE1BQworICogYWRkcmVzcyBmcm9tIHRoZSBjYXJkIGFuZCBjaGVja2luZyBpdC4gIElmIHlvdSBoYXZlIGEgbm9uLUFUJlQKKyAqIHByb2R1Y3QgKE9FTSwgbGlrZSBERUMgUm9hbUFib3V0LCBEaWdpdGFsIE9jZWFuLCBvciBFcHNvbiksCisgKiB5b3UgbWlnaHQgbmVlZCB0byBtb2RpZnkgdGhpcyBwYXJ0IHRvIGFjY29tbW9kYXRlIHlvdXIgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyCU1BQ19BRERSRVNTRVNbXVszXSA9Cit7CisgIHsgMHgwOCwgMHgwMCwgMHgwRSB9LAkJLyogQVQmVCBXYXZlTEFOIChzdGFuZGFyZCkgJiBERUMgUm9hbUFib3V0ICovCisgIHsgMHgwOCwgMHgwMCwgMHg2QSB9LAkJLyogQVQmVCBXYXZlTEFOIChhbHRlcm5hdGUpICovCisgIHsgMHgwMCwgMHgwMCwgMHhFMSB9LAkJLyogSGl0YWNoaSBXYXZlbGFuICovCisgIHsgMHgwMCwgMHg2MCwgMHgxRCB9CQkvKiBMdWNlbnQgV2F2ZWxhbiAoYW5vdGhlciBvbmUpICovCisgIC8qIEFkZCB5b3VyIGNhcmQgaGVyZSBhbmQgc2VuZCBtZSB0aGUgcGF0Y2ghICovCit9OworCisjZGVmaW5lIFdBVkVMQU5fQUREUl9TSVpFCTYJLyogU2l6ZSBvZiBhIE1BQyBhZGRyZXNzICovCisKKyNkZWZpbmUgV0FWRUxBTl9NVFUJCTE1MDAJLyogTWF4aW11bSBzaXplIG9mIFdhdmVMQU4gcGFja2V0ICovCisKKyNkZWZpbmUJTUFYREFUQVoJCShXQVZFTEFOX0FERFJfU0laRSArIFdBVkVMQU5fQUREUl9TSVpFICsgMiArIFdBVkVMQU5fTVRVKQorCisvKgorICogQ29uc3RhbnRzIHVzZWQgdG8gY29udmVydCBjaGFubmVscyB0byBmcmVxdWVuY2llcworICovCisKKy8qIEZyZXF1ZW5jeSBhdmFpbGFibGUgaW4gdGhlIDIuMCBtb2RlbSwgaW4gdW5pdHMgb2YgMjUwIGtIegorICogKGFzIHJlYWQgaW4gdGhlIG9mZnNldCByZWdpc3RlciBvZiB0aGUgZGFjIGFyZWEpLgorICogVXNlZCB0byBtYXAgY2hhbm5lbCBudW1iZXJzIHVzZWQgYnkgYHdmcmVxc2VsJyB0byBmcmVxdWVuY2llcworICovCitzdGF0aWMgY29uc3Qgc2hvcnQJY2hhbm5lbF9iYW5kc1tdID0geyAweDMwLCAweDU4LCAweDY0LCAweDdBLCAweDgwLCAweEE4LAorCQkJCSAgICAweEQwLCAweEYwLCAweEY4LCAweDE1MCB9OworCisvKiBGcmVxdWVuY2llcyBvZiB0aGUgMS4wIG1vZGVtIChmaXhlZCBmcmVxdWVuY2llcykuCisgKiBVc2UgdG8gbWFwIHRoZSBQU0EgYHN1YmJhbmQnIHRvIGEgZnJlcXVlbmN5CisgKiBOb3RlIDogYWxsIGZyZXF1ZW5jaWVzIGFwYXJ0IGZyb20gdGhlIGZpcnN0IG9uZSBuZWVkIHRvIGJlIG11bHRpcGxpZWQgYnkgMTAKKyAqLworc3RhdGljIGNvbnN0IGludAlmaXhlZF9iYW5kc1tdID0geyA5MTVlNiwgMi40MjVlOCwgMi40NmU4LCAyLjQ4NGU4LCAyLjQzMDVlOCB9OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQyBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEhvc3QgQWRhcHRvciBzdHJ1Y3R1cmUuCisgKiAoYmFzZSBpcyBib2FyZCBwb3J0IGFkZHJlc3MpLgorICovCit0eXBlZGVmIHVuaW9uIGhhY3NfdQloYWNzX3U7Cit1bmlvbiBoYWNzX3UKK3sKKwl1bnNpZ25lZCBzaG9ydAlodV9jb21tYW5kOwkJLyogQ29tbWFuZCByZWdpc3RlciAqLworI2RlZmluZQkJSEFDUl9SRVNFVAkJMHgwMDAxCS8qIFJlc2V0IGJvYXJkICovCisjZGVmaW5lCQlIQUNSX0NBCQkJMHgwMDAyCS8qIFNldCBDaGFubmVsIEF0dGVudGlvbiBmb3IgODI1ODYgKi8KKyNkZWZpbmUJCUhBQ1JfMTZCSVRTCQkweDAwMDQJLyogMTYtYml0IG9wZXJhdGlvbiAoMCA9PiA4Yml0cykgKi8KKyNkZWZpbmUJCUhBQ1JfT1VUMAkJMHgwMDA4CS8qIEdlbmVyYWwgcHVycG9zZSBvdXRwdXQgcGluIDAgKi8KKwkJCQkJCS8qIG5vdCB1c2VkIC0gbXVzdCBiZSAxICovCisjZGVmaW5lCQlIQUNSX09VVDEJCTB4MDAxMAkvKiBHZW5lcmFsIHB1cnBvc2Ugb3V0cHV0IHBpbiAxICovCisJCQkJCQkvKiBub3QgdXNlZCAtIG11c3QgYmUgMSAqLworI2RlZmluZQkJSEFDUl84MjU4Nl9JTlRfRU5BQkxFCTB4MDAyMAkvKiBFbmFibGUgODI1ODYgaW50ZXJydXB0cyAqLworI2RlZmluZQkJSEFDUl9NTUNfSU5UX0VOQUJMRQkweDAwNDAJLyogRW5hYmxlIE1NQyBpbnRlcnJ1cHRzICovCisjZGVmaW5lCQlIQUNSX0lOVFJfQ0xSX0VOQUJMRQkweDAwODAJLyogRW5hYmxlIGludGVycnVwdCBzdGF0dXMgcmVhZC9jbGVhciAqLworCXVuc2lnbmVkIHNob3J0CWh1X3N0YXR1czsJCS8qIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQkJSEFTUl84MjU4Nl9JTlRSCQkweDAwMDEJLyogSW50ZXJydXB0IHJlcXVlc3QgZnJvbSA4MjU4NiAqLworI2RlZmluZQkJSEFTUl9NTUNfSU5UUgkJMHgwMDAyCS8qIEludGVycnVwdCByZXF1ZXN0IGZyb20gTU1DICovCisjZGVmaW5lCQlIQVNSX01NQ19CVVNZCQkweDAwMDQJLyogTU1DIGJ1c3kgaW5kaWNhdGlvbiAqLworI2RlZmluZQkJSEFTUl9QU0FfQlVTWQkJMHgwMDA4CS8qIExBTiBwYXJhbWV0ZXIgc3RvcmFnZSBhcmVhIGJ1c3kgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGhhX3QJaGFfdDsKK3N0cnVjdCBoYV90Cit7CisJaGFjc191CQloYV9jczsJCS8qIENvbW1hbmQgYW5kIHN0YXR1cyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgCQloYV9jb21tYW5kCWhhX2NzLmh1X2NvbW1hbmQKKyNkZWZpbmUgCQloYV9zdGF0dXMJaGFfY3MuaHVfc3RhdHVzCisJdW5zaWduZWQgc2hvcnQJaGFfbW1jcjsJLyogTW9kZW0gTWFuYWdlbWVudCBDdHJsIFJlZ2lzdGVyICovCisJdW5zaWduZWQgc2hvcnQJaGFfcGlvcjA7CS8qIFByb2dyYW0gSS9PIEFkZHJlc3MgUmVnaXN0ZXIgUG9ydCAwICovCisJdW5zaWduZWQgc2hvcnQJaGFfcGlvcDA7CS8qIFByb2dyYW0gSS9PIFBvcnQgMCAqLworCXVuc2lnbmVkIHNob3J0CWhhX3Bpb3IxOwkvKiBQcm9ncmFtIEkvTyBBZGRyZXNzIFJlZ2lzdGVyIFBvcnQgMSAqLworCXVuc2lnbmVkIHNob3J0CWhhX3Bpb3AxOwkvKiBQcm9ncmFtIEkvTyBQb3J0IDEgKi8KKwl1bnNpZ25lZCBzaG9ydAloYV9waW9yMjsJLyogUHJvZ3JhbSBJL08gQWRkcmVzcyBSZWdpc3RlciBQb3J0IDIgKi8KKwl1bnNpZ25lZCBzaG9ydAloYV9waW9wMjsJLyogUHJvZ3JhbSBJL08gUG9ydCAyICovCit9OworCisjZGVmaW5lIEhBX1NJWkUJCTE2CisKKyNkZWZpbmUJaG9mZihwLGYpIAkodW5zaWduZWQgc2hvcnQpKCh2b2lkICopKCYoKGhhX3QgKikoKHZvaWQgKikwICsgKHApKSktPmYpIC0gKHZvaWQgKikwKQorI2RlZmluZQlIQUNSKHApCQlob2ZmKHAsIGhhX2NvbW1hbmQpCisjZGVmaW5lCUhBU1IocCkJCWhvZmYocCwgaGFfc3RhdHVzKQorI2RlZmluZQlNTUNSKHApCQlob2ZmKHAsIGhhX21tY3IpCisjZGVmaW5lCVBJT1IwKHApCWhvZmYocCwgaGFfcGlvcjApCisjZGVmaW5lCVBJT1AwKHApCWhvZmYocCwgaGFfcGlvcDApCisjZGVmaW5lCVBJT1IxKHApCWhvZmYocCwgaGFfcGlvcjEpCisjZGVmaW5lCVBJT1AxKHApCWhvZmYocCwgaGFfcGlvcDEpCisjZGVmaW5lCVBJT1IyKHApCWhvZmYocCwgaGFfcGlvcjIpCisjZGVmaW5lCVBJT1AyKHApCWhvZmYocCwgaGFfcGlvcDIpCisKKy8qCisgKiBQcm9ncmFtIEkvTyBNb2RlIFJlZ2lzdGVyIHZhbHVlcy4KKyAqLworI2RlZmluZSBTVEFUSUNfUElPCQkwCS8qIE1vZGUgMTogc3RhdGljIG1vZGUgKi8KKwkJCQkJLyogUkFNIGFjY2VzcyA/Pz8gKi8KKyNkZWZpbmUgQVVUT0lOQ1JfUElPCQkxCS8qIE1vZGUgMjogYXV0byBpbmNyZW1lbnQgbW9kZSAqLworCQkJCQkvKiBSQU0gYWNjZXNzID8/PyAqLworI2RlZmluZSBBVVRPREVDUl9QSU8JCTIJLyogTW9kZSAzOiBhdXRvIGRlY3JlbWVudCBtb2RlICovCisJCQkJCS8qIFJBTSBhY2Nlc3MgPz8/ICovCisjZGVmaW5lIFBBUkFNX0FDQ0VTU19QSU8JMwkvKiBNb2RlIDQ6IExBTiBwYXJhbWV0ZXIgYWNjZXNzIG1vZGUgKi8KKwkJCQkJLyogUGFyYW1ldGVyIGFjY2Vzcy4gKi8KKyNkZWZpbmUgUElPX01BU0sJCTMJLyogcmVnaXN0ZXIgbWFzayAqLworI2RlZmluZSBQSU9NKGNtZCxwaW9ubykJCSgodV9zaG9ydCljbWQgPDwgMTAgPDwgKHBpb25vICogMikpCisKKyNkZWZpbmUJSEFDUl9ERUZBVUxUCQkoSEFDUl9PVVQwIHwgSEFDUl9PVVQxIHwgSEFDUl8xNkJJVFMgfCBQSU9NKFNUQVRJQ19QSU8sIDApIHwgUElPTShBVVRPSU5DUl9QSU8sIDEpIHwgUElPTShQQVJBTV9BQ0NFU1NfUElPLCAyKSkKKyNkZWZpbmUJSEFDUl9JTlRST04JCShIQUNSXzgyNTg2X0lOVF9FTkFCTEUgfCBIQUNSX01NQ19JTlRfRU5BQkxFIHwgSEFDUl9JTlRSX0NMUl9FTkFCTEUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBNRU1PUlkgTEFZT1VUICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogT25ib2FyZCA2NCBrIFJBTSBsYXlvdXQuCisgKiAoT2Zmc2V0cyBmcm9tIDB4MDAwMC4pCisgKi8KKyNkZWZpbmUgT0ZGU0VUX1JVCQkweDAwMDAJCS8qIDc1JSBtZW1vcnkgKi8KKyNkZWZpbmUgT0ZGU0VUX0NVCQkweEMwMDAJCS8qIDI1JSBtZW1vcnkgKi8KKyNkZWZpbmUgT0ZGU0VUX1NDQgkJKE9GRlNFVF9JU0NQIC0gc2l6ZW9mKHNjYl90KSkKKyNkZWZpbmUgT0ZGU0VUX0lTQ1AJCShPRkZTRVRfU0NQIC0gc2l6ZW9mKGlzY3BfdCkpCisjZGVmaW5lIE9GRlNFVF9TQ1AJCUk4MjU4Nl9TQ1BfQUREUgorCisjZGVmaW5lCVJYQkxPQ0taCQkoc2l6ZW9mKGZkX3QpICsgc2l6ZW9mKHJiZF90KSArIE1BWERBVEFaKQorI2RlZmluZQlUWEJMT0NLWgkJKHNpemVvZihhY190eF90KSArIHNpemVvZihhY19ub3BfdCkgKyBzaXplb2YodGJkX3QpICsgTUFYREFUQVopCisKKyNkZWZpbmUJTlJYQkxPQ0tTCQkoKE9GRlNFVF9DVSAtIE9GRlNFVF9SVSkgLyBSWEJMT0NLWikKKyNkZWZpbmUJTlRYQkxPQ0tTCQkoKE9GRlNFVF9TQ0IgLSBPRkZTRVRfQ1UpIC8gVFhCTE9DS1opCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFBBUkFNRVRFUiBTVE9SQUdFIEFSRUEgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgKFBTQSkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBzYV90CXBzYV90Oworc3RydWN0IHBzYV90Cit7CisgIHVuc2lnbmVkIGNoYXIJcHNhX2lvX2Jhc2VfYWRkcl8xOwkvKiBbMHgwMF0gQmFzZSBhZGRyZXNzIDEgPz8/ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2lvX2Jhc2VfYWRkcl8yOwkvKiBbMHgwMV0gQmFzZSBhZGRyZXNzIDIgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfaW9fYmFzZV9hZGRyXzM7CS8qIFsweDAyXSBCYXNlIGFkZHJlc3MgMyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9pb19iYXNlX2FkZHJfNDsJLyogWzB4MDNdIEJhc2UgYWRkcmVzcyA0ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3JlbV9ib290X2FkZHJfMTsJLyogWzB4MDRdIFJlbW90ZSBCb290IEFkZHJlc3MgMSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9yZW1fYm9vdF9hZGRyXzI7CS8qIFsweDA1XSBSZW1vdGUgQm9vdCBBZGRyZXNzIDIgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcmVtX2Jvb3RfYWRkcl8zOwkvKiBbMHgwNl0gUmVtb3RlIEJvb3QgQWRkcmVzcyAzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2hvbGlfcGFyYW1zOwkvKiBbMHgwN10gSE9zdCBMYW4gSW50ZXJmYWNlIChIT0xJKSBQYXJhbWV0ZXJzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2ludF9yZXFfbm87CQkvKiBbMHgwOF0gSW50ZXJydXB0IFJlcXVlc3QgTGluZSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV91bnVzZWQwWzddOwkJLyogWzB4MDktMHgwRl0gdW51c2VkICovCisKKyAgdW5zaWduZWQgY2hhcglwc2FfdW5pdl9tYWNfYWRkcltXQVZFTEFOX0FERFJfU0laRV07CS8qIFsweDEwLTB4MTVdIFVuaXZlcnNhbCAoZmFjdG9yeSkgTUFDIEFkZHJlc3MgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfbG9jYWxfbWFjX2FkZHJbV0FWRUxBTl9BRERSX1NJWkVdOwkvKiBbMHgxNi0xQl0gTG9jYWwgTUFDIEFkZHJlc3MgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfdW5pdl9sb2NhbF9zZWw7CS8qIFsweDFDXSBVbml2ZXJzYWwgTG9jYWwgU2VsZWN0aW9uICovCisjZGVmaW5lCQlQU0FfVU5JVkVSU0FMCTAJCS8qIFVuaXZlcnNhbCAoZmFjdG9yeSkgKi8KKyNkZWZpbmUJCVBTQV9MT0NBTAkxCQkvKiBMb2NhbCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9jb21wX251bWJlcjsJLyogWzB4MURdIENvbXBhdGliaWxpdHkgTnVtYmVyOgkgKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX0FUXzkxNQkwIAkvKiBQQy1BVCA5MTUgTUh6IAkgKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX01DXzkxNQkxIAkvKiBQQy1NQyA5MTUgTUh6CSAqLworI2RlZmluZQkJUFNBX0NPTVBfUENfQVRfMjQwMAkyIAkvKiBQQy1BVCAyLjQgR0h6CSAqLworI2RlZmluZQkJUFNBX0NPTVBfUENfTUNfMjQwMAkzIAkvKiBQQy1NQyAyLjQgR0h6IAkgKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDTUNJQV85MTUJNCAJLyogUENNQ0lBIDkxNSBNSHogb3IgMi4wICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3Rocl9wcmVfc2V0OwkvKiBbMHgxRV0gTW9kZW0gVGhyZXNob2xkIFByZXNldCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9mZWF0dXJlX3NlbGVjdDsJLyogWzB4MUZdIENhbGwgY29kZSByZXF1aXJlZCAoMT1vbikgKi8KKyNkZWZpbmUJCVBTQV9GRUFUVVJFX0NBTExfQ09ERQkweDAxIAkvKiBDYWxsIGNvZGUgcmVxdWlyZWQgKEphcGFuKSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9zdWJiYW5kOwkJLyogWzB4MjBdIFN1YmJhbmQJICAqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfOTE1CQkwCS8qIDkxNSBNSHogb3IgMi4wICovCisjZGVmaW5lCQlQU0FfU1VCQkFORF8yNDI1CTEJLyogMjQyNSBNSHoJICAqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfMjQ2MAkyCS8qIDI0NjAgTUh6CSAgKi8KKyNkZWZpbmUJCVBTQV9TVUJCQU5EXzI0ODQJMwkvKiAyNDg0IE1IegkgICovCisjZGVmaW5lCQlQU0FfU1VCQkFORF8yNDMwXzUJNAkvKiAyNDMwLjUgTUh6CSAgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcXVhbGl0eV90aHI7CS8qIFsweDIxXSBNb2RlbSBRdWFsaXR5IFRocmVzaG9sZCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9tb2RfZGVsYXk7CQkvKiBbMHgyMl0gTW9kZW0gRGVsYXkgKD8pIChyZXNlcnZlZCkgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfbndpZFsyXTsJCS8qIFsweDIzLTB4MjRdIE5ldHdvcmsgSUQgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfbndpZF9zZWxlY3Q7CS8qIFsweDI1XSBOZXR3b3JrIElEIFNlbGVjdCBPbi9PZmYgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfZW5jcnlwdGlvbl9zZWxlY3Q7CS8qIFsweDI2XSBFbmNyeXB0aW9uIE9uL09mZiAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9lbmNyeXB0aW9uX2tleVs4XTsJLyogWzB4MjctMHgyRV0gRW5jcnlwdGlvbiBLZXkgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfZGF0YWJ1c193aWR0aDsJLyogWzB4MkZdIEFUIGJ1cyB3aWR0aCBzZWxlY3QgOC8xNiAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9jYWxsX2NvZGVbOF07CS8qIFsweDMwLTB4MzddIChKYXBhbikgQ2FsbCBDb2RlICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX253aWRfcHJlZml4WzJdOwkvKiBbMHgzOC0weDM5XSBSb2FtaW5nIGRvbWFpbiAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9yZXNlcnZlZFsyXTsJLyogWzB4M0EtMHgzQl0gUmVzZXJ2ZWQgLSBmaXhlZCAwMCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9jb25mX3N0YXR1czsJLyogWzB4M0NdIENvbmYgU3RhdHVzLCBiaXQgMD0xOmNvbmZpZyovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2NyY1syXTsJCS8qIFsweDNEXSBDUkMtMTYgb3ZlciBQU0EgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY3JjX3N0YXR1czsJCS8qIFsweDNGXSBDUkMgVmFsaWQgRmxhZyAqLworfTsKKworI2RlZmluZQlQU0FfU0laRQk2NAorCisvKiBDYWxjdWxhdGUgb2Zmc2V0IG9mIGEgZmllbGQgaW4gdGhlIGFib3ZlIHN0cnVjdHVyZS4KKyAqIFdhcm5pbmc6ICBvbmx5IGV2ZW4gYWRkcmVzc2VzIGFyZSB1c2VkLiAqLworI2RlZmluZQlwc2FvZmYocCxmKSAJKCh1bnNpZ25lZCBzaG9ydCkgKCh2b2lkICopKCYoKHBzYV90ICopICgodm9pZCAqKSBOVUxMICsgKHApKSktPmYpIC0gKHZvaWQgKikgTlVMTCkpCisKKy8qKioqKioqKioqKioqKioqKioqKiBNT0RFTSBNQU5BR0VNRU5UIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlciAoTU1DKSB3cml0ZSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1td190CW1td190Oworc3RydWN0IG1td190Cit7CisgIHVuc2lnbmVkIGNoYXIJbW13X2VuY3Jfa2V5WzhdOwkvKiBlbmNyeXB0aW9uIGtleSAqLworICB1bnNpZ25lZCBjaGFyCW1td19lbmNyX2VuYWJsZTsJLyogRW5hYmxlIG9yIGRpc2FibGUgZW5jcnlwdGlvbi4gKi8KKyNkZWZpbmUJTU1XX0VOQ1JfRU5BQkxFX01PREUJMHgwMgkvKiBtb2RlIG9mIHNlY3VyaXR5IG9wdGlvbiAqLworI2RlZmluZQlNTVdfRU5DUl9FTkFCTEVfRU4JMHgwMQkvKiBFbmFibGUgc2VjdXJpdHkgb3B0aW9uLiAqLworICB1bnNpZ25lZCBjaGFyCW1td191bnVzZWQwWzFdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2Rlc19pb19pbnZlcnQ7CS8qIGVuY3J5cHRpb24gb3B0aW9uICovCisjZGVmaW5lCU1NV19ERVNfSU9fSU5WRVJUX1JFUwkweDBGCS8qIHJlc2VydmVkICovCisjZGVmaW5lCU1NV19ERVNfSU9fSU5WRVJUX0NUUkwJMHhGMAkvKiBjb250cm9sICg/KSAoc2V0IHRvIDApICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3VudXNlZDFbNV07CQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfbG9vcHRfc2VsOwkJLyogbG9vcHRlc3Qgc2VsZWN0aW9uICovCisjZGVmaW5lCU1NV19MT09QVF9TRUxfRElTX05XSUQJMHg0MAkvKiBEaXNhYmxlIE5XSUQgZmlsdGVyaW5nLiAqLworI2RlZmluZQlNTVdfTE9PUFRfU0VMX0lOVAkweDIwCS8qIEFjdGl2YXRlIEF0dGVudGlvbiBSZXF1ZXN0LiAqLworI2RlZmluZQlNTVdfTE9PUFRfU0VMX0xTCTB4MTAJLyogbG9vcHRlc3QsIG5vIGNvbGxpc2lvbiBhdm9pZGFuY2UgKi8KKyNkZWZpbmUgTU1XX0xPT1BUX1NFTF9MVDNBCTB4MDgJLyogbG9vcHRlc3QgM2EgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MVDNCCTB4MDQJLyogbG9vcHRlc3QgM2IgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MVDNDCTB4MDIJLyogbG9vcHRlc3QgM2MgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MVDNECTB4MDEJLyogbG9vcHRlc3QgM2QgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfamFiYmVyX2VuYWJsZTsJLyogamFiYmVyIHRpbWVyIGVuYWJsZSAqLworICAvKiBBYm9ydCB0cmFuc21pc3Npb25zID4gMjAwIG1zICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZyZWV6ZTsJCS8qIGZyZWV6ZSBvciB1bmZyZWV6ZSBzaWduYWwgbGV2ZWwgKi8KKyAgLyogMCA6IHNpZ25hbCBsZXZlbCAmIHF1YWwgdXBkYXRlZCBmb3IgZXZlcnkgbmV3IG1lc3NhZ2UsIDEgOiBmcm96ZW4gKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfYW50ZW5fc2VsOwkJLyogYW50ZW5uYSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTU1XX0FOVEVOX1NFTF9TRUwJMHgwMQkvKiBkaXJlY3QgYW50ZW5uYSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUJTU1XX0FOVEVOX1NFTF9BTEdfRU4JMHgwMgkvKiBhbnRlbm5hIHNlbGVjdGlvbiBhbGdvLiBlbmFibGUgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfaWZzOwkJLyogaW50ZXIgZnJhbWUgc3BhY2luZyAqLworICAvKiBtaW4gdGltZSBiZXR3ZWVuIHRyYW5zbWlzc2lvbiBpbiBiaXQgcGVyaW9kcyAoLjUgdXMpIC0gYml0IDAgaWdub3JlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19tb2RfZGVsYXk7CSAJLyogbW9kZW0gZGVsYXkgKHN5bmNocm8pICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2phbV90aW1lOwkJLyogamFtbWluZyB0aW1lIChhZnRlciBjb2xsaXNpb24pICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3VudXNlZDJbMV07CQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdGhyX3ByZV9zZXQ7CS8qIGxldmVsIHRocmVzaG9sZCBwcmVzZXQgKi8KKyAgLyogRGlzY2FyZCBhbGwgcGFja2V0IHdpdGggc2lnbmFsIDwgdGhpcyB2YWx1ZSAoNCkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZGVjYXlfcHJtOwkJLyogZGVjYXkgcGFyYW1ldGVycyAqLworICB1bnNpZ25lZCBjaGFyCW1td19kZWNheV91cGRhdF9wcm07CS8qIGRlY2F5IHVwZGF0ZSBwYXJhbWV0ZXJzICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3F1YWxpdHlfdGhyOwkvKiBxdWFsaXR5ICh6LXF1b3RpZW50KSB0aHJlc2hvbGQgKi8KKyAgLyogRGlzY2FyZCBhbGwgcGFja2V0IHdpdGggcXVhbGl0eSA8IHRoaXMgdmFsdWUgKDMpICovCisgIHVuc2lnbmVkIGNoYXIJbW13X25ldHdfaWRfbDsJCS8qIE5XSUQgbG93IG9yZGVyIGJ5dGUgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfbmV0d19pZF9oOwkJLyogTldJRCBoaWdoIG9yZGVyIGJ5dGUgKi8KKyAgLyogTmV0d29yayBJRCBvciBEb21haW4gOiBjcmVhdGUgdmlydHVhbCBuZXQgb24gdGhlIGFpciAqLworCisgIC8qIDIuMCBIYXJkd2FyZSBleHRlbnNpb24gLSBmcmVxdWVuY3kgc2VsZWN0aW9uIHN1cHBvcnQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfbW9kZV9zZWxlY3Q7CS8qIGZvciBhbmFsb2cgdGVzdHMgKHNldCB0byAwKSAqLworICB1bnNpZ25lZCBjaGFyCW1td191bnVzZWQzWzFdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZlZV9jdHJsOwkJLyogZnJlcXVlbmN5IEVFUFJPTSBjb250cm9sICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUkUJMHgxMAkvKiBFbmFibGUgcHJvdGVjdGVkIGluc3RydWN0aW9ucy4gKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX0RXTEQJMHgwOAkvKiBEb3dubG9hZCBFRVBST00gdG8gbW1jLiAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfQ01ECTB4MDcJLyogRUVQUk9NIGNvbW1hbmRzOiAgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1JFQUQJMHgwNgkvKiBSZWFkICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9XUkVOCTB4MDQJLyogV3JpdGUgZW5hYmxlICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9XUklURQkweDA1CS8qIFdyaXRlIGRhdGEgdG8gYWRkcmVzcy4gKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1dSQUxMCTB4MDQJLyogV3JpdGUgZGF0YSB0byBhbGwgYWRkcmVzc2VzLiAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfV0RTCTB4MDQJLyogV3JpdGUgZGlzYWJsZSAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJSRUFECTB4MTYJLyogUmVhZCBhZGRyIGZyb20gcHJvdGVjdCByZWdpc3RlciAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJFTgkweDE0CS8qIFByb3RlY3QgcmVnaXN0ZXIgZW5hYmxlICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUkNMRUFSCTB4MTcJLyogVW5wcm90ZWN0IGFsbCByZWdpc3RlcnMuICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUldSSVRFCTB4MTUJLyogV3JpdGUgYWRkcmVzcyBpbiBwcm90ZWN0IHJlZ2lzdGVyICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUkRTCTB4MTQJLyogUHJvdGVjdCByZWdpc3RlciBkaXNhYmxlICovCisgIC8qIE5ldmVyIGlzc3VlIHRoZSBQUkRTIGNvbW1hbmQ6ICBpdCdzIGlycmV2ZXJzaWJsZSEgKi8KKworICB1bnNpZ25lZCBjaGFyCW1td19mZWVfYWRkcjsJCS8qIEVFUFJPTSBhZGRyZXNzICovCisjZGVmaW5lCU1NV19GRUVfQUREUl9DSEFOTkVMCTB4RjAJLyogU2VsZWN0IHRoZSBjaGFubmVsLiAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfT0ZGU0VUCTB4MEYJLyogT2Zmc2V0IGluIGNoYW5uZWwgZGF0YSAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfRU4JCTB4QzAJLyogRkVFX0NUUkwgZW5hYmxlIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX0RTCQkweDAwCS8qIEZFRV9DVFJMIGRpc2FibGUgb3BlcmF0aW9ucyAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfQUxMCTB4NDAJLyogRkVFX0NUUkwgYWxsIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX0NMRUFSCTB4RkYJLyogRkVFX0NUUkwgY2xlYXIgb3BlcmF0aW9ucyAqLworCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZlZV9kYXRhX2w7CQkvKiBXcml0ZSBkYXRhIHRvIEVFUFJPTS4gKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZmVlX2RhdGFfaDsJCS8qIGhpZ2ggb2N0ZXQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZXh0X2FudDsJCS8qIFNldHRpbmcgZm9yIGV4dGVybmFsIGFudGVubmEgKi8KKyNkZWZpbmUJTU1XX0VYVF9BTlRfRVhUQU5UCTB4MDEJLyogU2VsZWN0IGV4dGVybmFsIGFudGVubmEgKi8KKyNkZWZpbmUJTU1XX0VYVF9BTlRfUE9MCQkweDAyCS8qIFBvbGFyaXR5IG9mIHRoZSBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX0lOVEVSTkFMCTB4MDAJLyogSW50ZXJuYWwgYW50ZW5uYSAqLworI2RlZmluZQlNTVdfRVhUX0FOVF9FWFRFUk5BTAkweDAzCS8qIEV4dGVybmFsIGFudGVubmEgKi8KKyNkZWZpbmUJTU1XX0VYVF9BTlRfSVFfVEVTVAkweDFDCS8qIElRIHRlc3QgcGF0dGVybiAoc2V0IHRvIDApICovCit9OworCisjZGVmaW5lCU1NV19TSVpFCTM3CisKKyNkZWZpbmUJbW13b2ZmKHAsZikgCSh1bnNpZ25lZCBzaG9ydCkoKHZvaWQgKikoJigobW13X3QgKikoKHZvaWQgKikwICsgKHApKSktPmYpIC0gKHZvaWQgKikwKQorCisvKgorICogTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyIChNTUMpIHJlYWQgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtbXJfdAltbXJfdDsKK3N0cnVjdCBtbXJfdAoreworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQwWzhdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2Rlc19zdGF0dXM7CQkvKiBlbmNyeXB0aW9uIHN0YXR1cyAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kZXNfYXZhaWw7CQkvKiBlbmNyeXB0aW9uIGF2YWlsYWJsZSAoMHg1NSByZWFkKSAqLworI2RlZmluZQlNTVJfREVTX0FWQUlMX0RFUwkweDU1CQkvKiBERVMgYXZhaWxhYmxlICovCisjZGVmaW5lCU1NUl9ERVNfQVZBSUxfQUVTCTB4MzMJCS8qIEFFUyAoQVQmVCkgYXZhaWxhYmxlICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2Rlc19pb19pbnZlcnQ7CS8qIGRlcyBJL08gaW52ZXJ0IHJlZ2lzdGVyICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3VudXNlZDFbNV07CQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZGNlX3N0YXR1czsJCS8qIERDRSBzdGF0dXMgKi8KKyNkZWZpbmUJTU1SX0RDRV9TVEFUVVNfUlhfQlVTWQkJMHgwMQkvKiByZWNlaXZlciBidXN5ICovCisjZGVmaW5lCU1NUl9EQ0VfU1RBVFVTX0xPT1BUX0lORAkweDAyCS8qIGxvb3AgdGVzdCBpbmRpY2F0ZWQgKi8KKyNkZWZpbmUJTU1SX0RDRV9TVEFUVVNfVFhfQlVTWQkJMHgwNAkvKiB0cmFuc21pdHRlciBvbiAqLworI2RlZmluZQlNTVJfRENFX1NUQVRVU19KQlJfRVhQSVJFRAkweDA4CS8qIGphYmJlciB0aW1lciBleHBpcmVkICovCisjZGVmaW5lIE1NUl9EQ0VfU1RBVFVTCQkJMHgwRgkvKiBtYXNrIHRvIGdldCB0aGUgYml0cyAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kc3BfaWQ7CQkvKiBEU1AgSUQgKEFBID0gRGFlZGFsdXMgcmV2IEEpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3VudXNlZDJbMl07CQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfY29ycmVjdF9ud2lkX2w7CS8qICMgb2YgY29ycmVjdCBOV0lEcyByeGQgKGxvdykgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfY29ycmVjdF9ud2lkX2g7CS8qICMgb2YgY29ycmVjdCBOV0lEcyByeGQgKGhpZ2gpICovCisgIC8qIFdhcm5pbmc6ICByZWFkIGhpZ2gtb3JkZXIgb2N0ZXQgZmlyc3QhICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3dyb25nX253aWRfbDsJLyogIyBvZiB3cm9uZyBOV0lEcyByeGQgKGxvdykgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfd3JvbmdfbndpZF9oOwkvKiAjIG9mIHdyb25nIE5XSURzIHJ4ZCAoaGlnaCkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfdGhyX3ByZV9zZXQ7CS8qIGxldmVsIHRocmVzaG9sZCBwcmVzZXQgKi8KKyNkZWZpbmUJTU1SX1RIUl9QUkVfU0VUCQkweDNGCQkvKiBsZXZlbCB0aHJlc2hvbGQgcHJlc2V0ICovCisjZGVmaW5lCU1NUl9USFJfUFJFX1NFVF9DVVIJMHg4MAkJLyogQ3VycmVudCBzaWduYWwgYWJvdmUgaXQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfc2lnbmFsX2x2bDsJCS8qIHNpZ25hbCBsZXZlbCAqLworI2RlZmluZQlNTVJfU0lHTkFMX0xWTAkJMHgzRgkJLyogc2lnbmFsIGxldmVsICovCisjZGVmaW5lCU1NUl9TSUdOQUxfTFZMX1ZBTElECTB4ODAJCS8qIFVwZGF0ZWQgc2luY2UgbGFzdCByZWFkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3NpbGVuY2VfbHZsOwkvKiBzaWxlbmNlIGxldmVsIChub2lzZSkgKi8KKyNkZWZpbmUJTU1SX1NJTEVOQ0VfTFZMCQkweDNGCQkvKiBzaWxlbmNlIGxldmVsICovCisjZGVmaW5lCU1NUl9TSUxFTkNFX0xWTF9WQUxJRAkweDgwCQkvKiBVcGRhdGVkIHNpbmNlIGxhc3QgcmVhZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9zZ25sX3F1YWw7CQkvKiBzaWduYWwgcXVhbGl0eSAqLworI2RlZmluZQlNTVJfU0dOTF9RVUFMCQkweDBGCQkvKiBzaWduYWwgcXVhbGl0eSAqLworI2RlZmluZQlNTVJfU0dOTF9RVUFMX0FOVAkweDgwCQkvKiBjdXJyZW50IGFudGVubmEgdXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9uZXR3X2lkX2w7CQkvKiBOV0lEIGxvdyBvcmRlciBieXRlICg/KSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQzWzNdOwkJLyogdW51c2VkICovCisKKyAgLyogMi4wIEhhcmR3YXJlIGV4dGVuc2lvbiAtIGZyZXF1ZW5jeSBzZWxlY3Rpb24gc3VwcG9ydCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9mZWVfc3RhdHVzOwkJLyogU3RhdHVzIG9mIGZyZXF1ZW5jeSBFRVBST00gKi8KKyNkZWZpbmUJTU1SX0ZFRV9TVEFUVVNfSUQJMHhGMAkJLyogTW9kZW0gcmV2aXNpb24gSUQgKi8KKyNkZWZpbmUJTU1SX0ZFRV9TVEFUVVNfRFdMRAkweDA4CQkvKiBEb3dubG9hZCBpbiBwcm9ncmVzcyAqLworI2RlZmluZQlNTVJfRkVFX1NUQVRVU19CVVNZCTB4MDQJCS8qIEVFUFJPTSBidXN5ICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3VudXNlZDRbMV07CQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZmVlX2RhdGFfbDsJCS8qIFJlYWQgZGF0YSBmcm9tIEVFUFJPTSAobG93KSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9mZWVfZGF0YV9oOwkJLyogUmVhZCBkYXRhIGZyb20gRUVQUk9NIChoaWdoKSAqLworfTsKKworI2RlZmluZQlNTVJfU0laRQkzNgorCisjZGVmaW5lCW1tcm9mZihwLGYpIAkodW5zaWduZWQgc2hvcnQpKCh2b2lkICopKCYoKG1tcl90ICopKCh2b2lkICopMCArIChwKSkpLT5mKSAtICh2b2lkICopMCkKKworLyogTWFrZSB0aGUgdHdvIGFib3ZlIHN0cnVjdHVyZXMgb25lICovCit0eXBlZGVmIHVuaW9uIG1tX3QKK3sKKyAgc3RydWN0IG1td190CXc7CS8qIFdyaXRlIHRvIHRoZSBtbWMgKi8KKyAgc3RydWN0IG1tcl90CXI7CS8qIFJlYWQgZnJvbSB0aGUgbW1jICovCit9IG1tX3Q7CisKKyNlbmRpZiAvKiBfV0FWRUxBTl9IICovCisKKy8qCisgKiBUaGlzIHNvZnR3YXJlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkCisgKiBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgd2F2ZWxhbi5jLgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLnAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4ucC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOWZmMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLnAuaApAQCAtMCwwICsxLDcxNiBAQAorLyoKKyAqCVdhdmVMQU4gSVNBIGRyaXZlcgorICoKKyAqCQlKZWFuIElJIC0gSFBMQiAnOTYKKyAqCisgKiBSZW9yZ2FuaXNhdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIHRoZSBkcml2ZXIuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIG5lY2Vzc2FyeSBmb3IgdGhlCisgKiBXYXZlTEFOIElTQSBkcml2ZXIuICBUaGlzIGZpbGUgaXMgYSBwcml2YXRlIGhlYWRlciwgc28gaXQgc2hvdWxkCisgKiBiZSBpbmNsdWRlZCBvbmx5IGluIHdhdmVsYW4uYyEKKyAqLworCisjaWZuZGVmIFdBVkVMQU5fUF9ICisjZGVmaW5lIFdBVkVMQU5fUF9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBET0NVTUVOVEFUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIGRyaXZlciBwcm92aWRlcyBhIExpbnV4IGludGVyZmFjZSB0byB0aGUgV2F2ZUxBTiBJU0EgaGFyZHdhcmUuCisgKiBUaGUgV2F2ZUxBTiBpcyBhIHByb2R1Y3Qgb2YgTHVjZW50IChodHRwOi8vd3d3LndhdmVsYW4uY29tLykuCisgKiBUaGlzIGRpdmlzaW9uIHdhcyBmb3JtZXJseSBwYXJ0IG9mIE5DUiBhbmQgdGhlbiBBVCZULgorICogV2F2ZUxBTnMgYXJlIGFsc28gZGlzdHJpYnV0ZWQgYnkgREVDIChSb2FtQWJvdXQgRFMpIGFuZCBEaWdpdGFsIE9jZWFuLgorICoKKyAqIFRvIGxlYXJuIGhvdyB0byB1c2UgdGhpcyBkcml2ZXIsIHJlYWQgdGhlIE5FVDMgSE9XVE8uCisgKiBJZiB5b3Ugd2FudCB0byBleHBsb2l0IHRoZSBtYW55IG90aGVyIGZ1bmN0aW9uYWxpdGllcywgcmVhZCB0aGUgY29tbWVudHMKKyAqIGluIHRoZSBjb2RlLgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIHRoZSByZXN1bHQgb2YgdGhlIGVmZm9ydCBvZiBtYW55IHBlb3BsZSAoc2VlIGJlbG93KS4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1BFQ0lGSUMgTk9URVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogV2ViIHBhZ2UKKyAqIC0tLS0tLS0tCisgKglJIHRyeSB0byBtYWludGFpbiBhIHdlYiBwYWdlIHdpdGggdGhlIFdpcmVsZXNzIExBTiBIb3d0byBhdCA6CisgKgkgICAgaHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9MaW51eC9XYXZlbGFuLmh0bWwKKyAqCisgKiBTTVAKKyAqIC0tLQorICoJV2Ugbm93IGFyZSBTTVAgY29tcGxpYW50IChJIGV2ZW50dWFsbHkgZml4ZWQgdGhlIHJlbWFpbmluZyBidWdzKS4KKyAqCVRoZSBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIG9uIGEgZHVhbCBQNi0xNTAgYW5kIHN1cnZpdmVkIG15IHVzdWFsCisgKglzZXQgb2YgdG9ydHVyZSB0ZXN0cy4KKyAqCUFueXdheSwgSSBzcGVudCBlbm91Z2ggdGltZSBjaGFzaW5nIGludGVycnVwdCByZS1lbnRyYW5jeSBkdXJpbmcKKyAqCWVycm9ycyBvciByZWNvbmZpZ3VyZSwgYW5kIEkgZGVzaWduZWQgdGhlIGxvY2tlZC91bmxvY2tlZCBzZWN0aW9ucworICoJb2YgdGhlIGRyaXZlciB3aXRoIGdyZWF0IGNhcmUsIGFuZCB3aXRoIHRoZSByZWNlbnQgYWRkaXRpb24gb2YKKyAqCXRoZSBzcGlubG9jayAodGhhbmtzIHRvIHRoZSBuZXcgQVBJKSwgd2Ugc2hvdWxkIGJlIHF1aXRlIGNsb3NlIHRvCisgKgl0aGUgdHJ1dGguCisgKglUaGUgU01QL0lSUSBsb2NraW5nIGlzIHF1aXRlIGNvYXJzZSBhbmQgY29uc2VydmF0aXZlIChpLmUuIG5vdCBmYXN0KSwKKyAqCWJ1dCBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5IChlc3BlY2lhbGx5IGF0IDIgTWIvcyA7LSkuCisgKgorICoJSSBoYXZlIGFsc28gbG9va2VkIGludG8gZGlzYWJsaW5nIG9ubHkgb3VyIGludGVycnVwdCBvbiB0aGUgY2FyZAorICoJKHZpYSBIQUNSKSBpbnN0ZWFkIG9mIGFsbCBpbnRlcnJ1cHRzIGluIHRoZSBwcm9jZXNzb3IgKHZpYSBjbGkpLAorICoJc28gdGhhdCBvdGhlciBkcml2ZXIgYXJlIG5vdCBpbXBhY3RlZCwgYW5kIGl0IGxvb2sgbGlrZSBpdCdzCisgKglwb3NzaWJsZSwgYnV0IGl0J3MgdmVyeSB0cmlja3kgdG8gZG8gcmlnaHQgKGZ1bGwgb2YgcmFjZXMpLiBBcworICoJdGhlIGdhaW4gd291bGQgYmUgbW9zdGx5IGZvciBTTVAgc3lzdGVtcywgaXQgY2FuIHdhaXQuLi4KKyAqCisgKiBEZWJ1Z2dpbmcgYW5kIG9wdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJWW91IHdpbGwgZmluZCBiZWxvdyBhIHNldCBvZiAnI2RlZmluZSIgYWxsb3dpbmcgYSB2ZXJ5IGZpbmUgY29udHJvbAorICoJb24gdGhlIGRyaXZlciBiZWhhdmlvdXIgYW5kIHRoZSBkZWJ1ZyBtZXNzYWdlcyBwcmludGVkLgorICoJVGhlIG1haW4gb3B0aW9ucyBhcmUgOgorICoJbyBTRVRfUFNBX0NSQywgdG8gaGF2ZSB5b3VyIGNhcmQgY29ycmVjdGx5IHJlY29nbmlzZWQgYnkKKyAqCSAgYW4gYWNjZXNzIHBvaW50IGFuZCB0aGUgUG9pbnQtdG8tUG9pbnQgZGlhZ25vc3RpYyB0b29sLgorICoJbyBVU0VfUFNBX0NPTkZJRywgdG8gcmVhZCBjb25maWd1cmF0aW9uIGZyb20gdGhlIFBTQSAoRUVwcm9tKQorICoJICAob3RoZXJ3aXNlIHdlIGFsd2F5cyBzdGFydCBhZnJlc2ggd2l0aCBzb21lIGRlZmF1bHRzKQorICoKKyAqIHdhdmVsYW4ubyBpcyB0b28gZGFybmVkIGJpZworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglUaGF0J3MgdHJ1ZSEgIFRoZXJlIGlzIGEgdmVyeSBzaW1wbGUgd2F5IHRvIHJlZHVjZSB0aGUgZHJpdmVyCisgKglvYmplY3QgYnkgMzMlISAgQ29tbWVudCBvdXQgdGhlIGZvbGxvd2luZyBsaW5lOgorICoJCSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorICoJT3RoZXIgY29tcGlsZSBvcHRpb25zIGNhbiBhbHNvIHJlZHVjZSB0aGUgc2l6ZSBvZiBpdC4uLgorICoKKyAqIE1BQyBhZGRyZXNzIGFuZCBoYXJkd2FyZSBkZXRlY3Rpb246CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJVGhlIGRldGVjdGlvbiBjb2RlIGZvciB0aGUgV2F2ZUxBTiBjaGVja3MgdGhhdCB0aGUgZmlyc3QgdGhyZWUKKyAqCW9jdGV0cyBvZiB0aGUgTUFDIGFkZHJlc3MgZml0IHRoZSBjb21wYW55IGNvZGUuICBUaGlzIHR5cGUgb2YKKyAqCWRldGVjdGlvbiB3b3JrcyB3ZWxsIGZvciBBVCZUIGNhcmRzIChiZWNhdXNlIHRoZSBBVCZUIGNvZGUgaXMKKyAqCWhhcmRjb2RlZCBpbiB3YXZlbGFuLmgpLCBidXQgb2YgY291cnNlIHdpbGwgZmFpbCBmb3Igb3RoZXIKKyAqCW1hbnVmYWN0dXJlcnMuCisgKgorICoJSWYgeW91IGFyZSBzdXJlIHRoYXQgeW91ciBjYXJkIGlzIGRlcml2ZWQgZnJvbSB0aGUgV2F2ZUxBTiwKKyAqCWhlcmUgaXMgdGhlIHdheSB0byBjb25maWd1cmUgaXQ6CisgKgkxKSBHZXQgeW91ciBNQUMgYWRkcmVzcworICoJCWEpIFdpdGggeW91ciBjYXJkIHV0aWxpdGllcyAod2ZyZXFzZWwsIGluc3Rjb25mLCBldGMuKQorICoJCWIpIFdpdGggdGhlIGRyaXZlcjoKKyAqCQkJbyBjb21waWxlIHRoZSBrZXJuZWwgd2l0aCBERUJVR19DT05GSUdfSU5GTyBlbmFibGVkCisgKgkJCW8gQm9vdCBhbmQgbG9vayB0aGUgY2FyZCBtZXNzYWdlcworICoJMikgU2V0IHlvdXIgTUFDIGNvZGUgKDMgb2N0ZXRzKSBpbiBNQUNfQUREUkVTU0VTW11bM10gKHdhdmVsYW4uaCkKKyAqCTMpIENvbXBpbGUgYW5kIHZlcmlmeQorICoJNCkgU2VuZCBtZSB0aGUgTUFDIGNvZGUuICBJIHdpbGwgaW5jbHVkZSBpdCBpbiB0aGUgbmV4dCB2ZXJzaW9uLgorICoKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gV0lSRUxFU1MgRVhURU5TSU9OUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBUaGlzIGRyaXZlciBpcyB0aGUgZmlyc3QgdG8gc3VwcG9ydCAid2lyZWxlc3MgZXh0ZW5zaW9ucyIuCisgKiBUaGlzIHNldCBvZiBleHRlbnNpb25zIHByb3ZpZGVzIGEgc3RhbmRhcmQgd2F5IHRvIGNvbnRyb2wgdGhlIHdpcmVsZXNzCisgKiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGhhcmR3YXJlLiAgQXBwbGljYXRpb25zIHN1Y2ggYXMgbW9iaWxlIElQIG1heQorICogdGFrZSBhZHZhbnRhZ2Ugb2YgaXQuCisgKgorICogWW91IHdpbGwgbmVlZCB0byBlbmFibGUgdGhlIENPTkZJR19ORVRfUkFESU8gZGVmaW5lIGluIHRoZSBrZXJuZWwKKyAqIGNvbmZpZ3VyYXRpb24gdG8gZW5hYmxlIHRoZSB3aXJlbGVzcyBleHRlbnNpb25zICh0aGlzIGlzIHRoZSBvbmUKKyAqIGdpdmluZyBhY2Nlc3MgdG8gdGhlIHJhZGlvIG5ldHdvcmsgZGV2aWNlIGNob2ljZSkuCisgKgorICogSXQgbWlnaHQgYWxzbyBiZSBhIGdvb2QgaWRlYSBhcyB3ZWxsIHRvIGZldGNoIHRoZSB3aXJlbGVzcyB0b29scyB0bworICogY29uZmlndXJlIHRoZSBkZXZpY2UgYW5kIHBsYXkgYSBiaXQuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGSUxFUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogd2F2ZWxhbi5jOgkJYWN0dWFsIGNvZGUgZm9yIHRoZSBkcml2ZXI6ICBDIGZ1bmN0aW9ucworICoKKyAqIHdhdmVsYW4ucC5oOgkJcHJpdmF0ZSBoZWFkZXI6ICBsb2NhbCB0eXBlcyBhbmQgdmFyaWFibGVzIGZvciBkcml2ZXIKKyAqCisgKiB3YXZlbGFuLmg6CQlkZXNjcmlwdGlvbiBvZiB0aGUgaGFyZHdhcmUgaW50ZXJmYWNlIGFuZCBzdHJ1Y3RzCisgKgorICogaTgyNTg2Lmg6CQlkZXNjcmlwdGlvbiBvZiB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBISVNUT1JZIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFRoaXMgaXMgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gdGhlIGRyaXZlcnMnIGhlYWRlcnMuIEl0IG1heSBub3QgYmUKKyAqIGFjY3VyYXRlLCBhbmQgSSBndWFyYW50ZWUgb25seSBteSBiZXN0IGVmZm9ydC4KKyAqCisgKiBUaGUgaGlzdG9yeSBvZiB0aGUgV2F2ZUxBTiBkcml2ZXJzIGlzIGFzIGNvbXBsaWNhdGVkIGFzIHRoZSBoaXN0b3J5IG9mCisgKiB0aGUgV2F2ZUxBTiBpdHNlbGYgKE5DUiAtPiBBVCZUIC0+IEx1Y2VudCkuCisgKgorICogSXQgYWxsIHN0YXJ0ZWQgd2l0aCBBbmRlcnMgS2xlbWV0cyA8a2xlbWV0c0BwYXVsLnJ1dGdlcnMuZWR1PgorICogd3JpdGluZyBhIFdhdmVMQU4gSVNBIGRyaXZlciBmb3IgdGhlIE1hY2ggbWljcm9rZXJuZWwuICBHaXJpc2gKKyAqIFdlbGxpbmcgPHdlbGxpbmdAcGF1bC5ydXRnZXJzLmVkdT4gaGFkIGFsc28gd29ya2VkIG9uIGl0LgorICogS2VpdGggTW9vcmUgbW9kaWZpZWQgdGhpcyBmb3IgdGhlIFBDTUNJQSBoYXJkd2FyZS4KKyAqIAorICogUm9iZXJ0IE1vcnJpcyA8cnRtQGRhcy5oYXJ2YXJkLmVkdT4gcG9ydGVkIHRoZXNlIHR3byBkcml2ZXJzIHRvIEJTREkKKyAqIGFuZCBhZGRlZCBzcGVjaWZpYyBQQ01DSUEgc3VwcG9ydCAodGhlcmUgaXMgY3VycmVudGx5IG5vIGVxdWl2YWxlbnQKKyAqIG9mIHRoZSBQQ01DSUEgcGFja2FnZSB1bmRlciBCU0QpLgorICoKKyAqIEppbSBCaW5rbGV5IDxqcmJAY3MucGR4LmVkdT4gcG9ydGVkIGJvdGggQlNESSBkcml2ZXJzIHRvIEZyZWVCU0QuCisgKgorICogQnJ1Y2UgSmFuc29uIDxicnVjZUBjcy51c3lkLmVkdS5hdT4gcG9ydGVkIHRoZSBCU0RJIElTQSBkcml2ZXIgdG8gTGludXguCisgKgorICogQW50aG9ueSBELiBKb3NlcGggPGFkakBsY3MubWl0LmVkdT4gc3RhcnRlZCB0byBtb2RpZnkgQnJ1Y2UncyBkcml2ZXIKKyAqICh3aXRoIGhlbHAgb2YgdGhlIEJTREkgUENNQ0lBIGRyaXZlcikgZm9yIFBDTUNJQS4KKyAqIFl1bnpob3UgTGkgPHl1bnpob3VAc3RyYXQuaW9sLnVuaC5lZHU+IGZpbmlzaGVkIHRoaXMgd29yay4KKyAqIEpvZSBGaW5uZXkgPGpvZUBjb21wLmxhbmNzLmFjLnVrPiBwYXRjaGVkIHRoZSBkcml2ZXIgdG8gc3RhcnQKKyAqIDIuMDAgY2FyZHMgY29ycmVjdGx5ICgyLjQgR0h6IHdpdGggZnJlcXVlbmN5IHNlbGVjdGlvbikuCisgKiBEYXZpZCBIaW5kcyA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+IGludGVncmF0ZWQgdGhlIHdob2xlIGluIGhpcworICogUENNQ0lBIHBhY2thZ2UgKGFuZCBidWcgY29ycmVjdGlvbnMpLgorICoKKyAqIEkgKEplYW4gVG91cnJpbGhlcyAtIGp0QGhwbGIuaHBsLmhwLmNvbSkgdGhlbiBzdGFydGVkIHRvIG1ha2Ugc29tZQorICogcGF0Y2hlcyB0byB0aGUgUENNQ0lBIGRyaXZlci4gIExhdGVyLCBJIGFkZGVkIGNvZGUgaW4gdGhlIElTQSBkcml2ZXIKKyAqIGZvciBXaXJlbGVzcyBFeHRlbnNpb25zIGFuZCBmdWxsIHN1cHBvcnQgb2YgZnJlcXVlbmN5IHNlbGVjdGlvbgorICogY2FyZHMuICBUaGVuLCBJIGRpZCB0aGUgc2FtZSB0byB0aGUgUENNQ0lBIGRyaXZlciwgYW5kIGRpZCBzb21lCisgKiByZW9yZ2FuaXNhdGlvbi4gIEZpbmFsbHksIEkgY2FtZSBiYWNrIHRvIHRoZSBJU0EgZHJpdmVyIHRvCisgKiB1cGdyYWRlIGl0IGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBQQ01DSUEgb25lIGFuZCByZW9yZ2FuaXNlCisgKiB0aGUgY29kZS4KKyAqIExvZWtlIEJyZWRlcnZlbGQgPGxicmVkZXJ2QHdhdmVsYW4uY29tPiBmcm9tIEx1Y2VudCBoYXMgZ2l2ZW4gbWUKKyAqIG11Y2ggbmVlZGVkIGluZm9ybWF0aW9uIG9uIHRoZSBXYXZlTEFOIGhhcmR3YXJlLgorICovCisKKy8qIFRoZSBvcmlnaW5hbCBjb3B5cmlnaHRzIGFuZCBsaXRlcmF0dXJlIG1lbnRpb24gb3RoZXJzJyBuYW1lcyBhbmQKKyAqIGNyZWRpdHMuICBJIGRvbid0IGtub3cgd2hhdCB0aGVpciBwYXJ0IGluIHRoaXMgZGV2ZWxvcG1lbnQgd2FzLgorICovCisKKy8qIEJ5IHRoZSB3YXksIGZvciB0aGUgY29weXJpZ2h0IGFuZCBsZWdhbCBzdHVmZjoKKyAqIGFsbW9zdCBldmVyeWJvZHkgd3JvdGUgY29kZSB1bmRlciB0aGUgR05VIG9yIEJTRCBsaWNlbnNlIChvciBzaW1pbGFyKSwKKyAqIGFuZCB3YW50IHRoZWlyIG9yaWdpbmFsIGNvcHlyaWdodCB0byByZW1haW4gc29tZXdoZXJlIGluIHRoZQorICogY29kZSAoZm9yIG15c2VsZiwgSSBnbyB3aXRoIHRoZSBHUEwpLgorICogTm9ib2R5IHdhbnRzIHRvIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIGFueXRoaW5nLCBleGNlcHQgdGhlIGZhbWUuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENSRURJVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVGhpcyBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkIGFzIGEgY29tcG9uZW50IG9mIHRoZQorICogTGludXggb3BlcmF0aW5nIHN5c3RlbS4KKyAqIEl0IGlzIGJhc2VkIG9uIG90aGVyIGRldmljZSBkcml2ZXJzIGFuZCBpbmZvcm1hdGlvbgorICogZWl0aGVyIHdyaXR0ZW4gb3Igc3VwcGxpZWQgYnk6CisgKglBamF5IEJha3JlIDxiYWtyZUBwYXVsLnJ1dGdlcnMuZWR1PiwKKyAqCURvbmFsZCBCZWNrZXIgPGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdj4sCisgKglMb2VrZSBCcmVkZXJ2ZWxkIDxMb2VrZS5CcmVkZXJ2ZWxkQFV0cmVjaHQuTkNSLmNvbT4sCisgKglCcmVudCBFbHBoaWNrIDxiZWxwaGlja0B1d2F0ZXJsb28uY2E+LAorICoJQW5kZXJzIEtsZW1ldHMgPGtsZW1ldHNAaXQua3RoLnNlPiwKKyAqCVZsYWRpbWlyIFYuIEtvbHBha292IDx3QHN0aWVyLmtvZW5pZy5ydT4sCisgKglNYXJjIE1lZXJ0ZW5zIDxNYXJjLk1lZXJ0ZW5zQFV0cmVjaHQuTkNSLmNvbT4sCisgKglQYXVsaW5lIE1pZGRlbGluayA8bWlkZGVsaW5AcG9seXdhcmUuaWFmLm5sPiwKKyAqCVJvYmVydCBNb3JyaXMgPHJ0bUBkYXMuaGFydmFyZC5lZHU+LAorICoJSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPiwKKyAqCUdpcmlzaCBXZWxsaW5nIDx3ZWxsaW5nQHBhdWwucnV0Z2Vycy5lZHU+LAorICoJQ2xhcmsgV29vZHdvcnRoIDxjbGFya0BoaXdheTEuZXhpdDEwOS5jb20+CisgKglZb25nZ3VhbmcgWmhhbmcgPHlnekBpc2wuaHJsLmhhYy5jb20+CisgKgorICogVGhhbmtzIGdvIGFsc28gdG86CisgKglKYW1lcyBBc2h0b24gPGphYTEwMUBzeXNlbmcuYW51LmVkdS5hdT4sCisgKglBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiwKKyAqCUFsbGFuIENyZWlnaHRvbiA8YWxsYW5jQGNzLnVzeWQuZWR1LmF1PiwKKyAqCU1hdHRoZXcgR2VpZXIgPG1hdHRoZXdAY3MudXN5ZC5lZHUuYXU+LAorICoJUmVtbyBkaSBHaW92YW5uaSA8cmVtb0Bjcy51c3lkLmVkdS5hdT4sCisgKglFY2toYXJkIEdyYWggPGdyYWhAd3JjczEudXJ6LnVuaS13dXBwZXJ0YWwuZGU+LAorICoJVmlwdWwgR3VwdGEgPHZndXB0YUBjcy5iaW5naGFtdG9uLmVkdT4sCisgKglNYXJrIEhhZ2FuIDxtaGFnYW5Ad3RjcG9zdC5kYXl0b25vaC5OQ1IuQ09NPiwKKyAqCVRpbSBOaWNob2xzb24gPHRpbUBjcy51c3lkLmVkdS5hdT4sCisgKglJYW4gUGFya2luIDxpYW5AY3MudXN5ZC5lZHUuYXU+LAorICoJSm9obiBSb3NlbmJlcmcgPGpvaG5yQGNzLnVzeWQuZWR1LmF1PiwKKyAqCUdlb3JnZSBSb3NzaSA8Z2VvcmdlQHBobS5nb3YuYXU+LAorICoJQXJ0aHVyIFNjb3R0IDxhcnRodXJAY3MudXN5ZC5lZHUuYXU+LAorICoJU3RhbmlzbGF2IFNpbnlhZ2luIDxzdGFzQGlzZi5ydT4KKyAqCWFuZCBQZXRlciBTdG9yZXkgZm9yIHRoZWlyIGFzc2lzdGFuY2UgYW5kIGFkdmljZS4KKyAqCisgKiBBZGRpdGlvbmFsIENyZWRpdHM6CisgKgorICoJTXkgZGV2ZWxvcG1lbnQgaGFzIGJlZW4gZG9uZSBpbml0aWFsbHkgdW5kZXIgRGViaWFuIDEuMSAoTGludXggMi4wLngpCisgKglhbmQgbm93CXVuZGVyIERlYmlhbiAyLjIsIGluaXRpYWxseSB3aXRoIGFuIEhQIFZlY3RyYSBYUC82MCwgYW5kIG5vdworICoJYW4gSFAgVmVjdHJhIFhQLzkwLgorICoKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElNUFJPVkVNRU5UUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogSSBwcm91ZGx5IHByZXNlbnQ6CisgKgorICogQ2hhbmdlcyBtYWRlIGluIGZpcnN0IHByZS1yZWxlYXNlOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSByZW9yZ2FuaXNhdGlvbiBvZiB0aGUgY29kZSwgZnVuY3Rpb24gbmFtZSBjaGFuZ2UKKyAqCS0gY3JlYXRpb24gb2YgcHJpdmF0ZSBoZWFkZXIgKHdhdmVsYW4ucC5oKQorICoJLSByZW9yZ2FuaXNlZCBkZWJ1ZyBtZXNzYWdlcworICoJLSBtb3JlIGNvbW1lbnRzLCBoaXN0b3J5LCBldGMuCisgKgktIG1tY19pbml0OiAgY29uZmlndXJlIHRoZSBQU0EgaWYgbm90IGRvbmUKKyAqCS0gbW1jX2luaXQ6ICBjb3JyZWN0IGRlZmF1bHQgdmFsdWUgb2YgbGV2ZWwgdGhyZXNob2xkIGZvciBQQ01DSUEKKyAqCS0gbW1jX2luaXQ6ICAyLjAwIGRldGVjdGlvbiBiZXR0ZXIgY29kZSBmb3IgMi4wMCBpbml0aWFsaXphdGlvbgorICoJLSBiZXR0ZXIgaW5mbyBhdCBzdGFydHVwCisgKgktIElSUSBzZXR0aW5nIChub3RlOiAgdGhpcyBzZXR0aW5nIGlzIHBlcm1hbmVudCkKKyAqCS0gd2F0Y2hkb2c6ICBjaGFuZ2Ugc3RyYXRlZ3kgKGFuZCBzb2x2ZSBtb2R1bGUgcmVtb3ZhbCBwcm9ibGVtcykKKyAqCS0gYWRkIHdpcmVsZXNzIGV4dGVuc2lvbnMgKGlvY3RsIGFuZCBnZXRfd2lyZWxlc3Nfc3RhdHMpCisgKgkgIGdldC9zZXQgbndpZC9mcmVxdWVuY3kgb24gZmx5LCBpbmZvIGZvciAvcHJvYy9uZXQvd2lyZWxlc3MKKyAqCS0gbW9yZSB3aXJlbGVzcyBleHRlbnNpb25zOiAgU0VUU1BZIGFuZCBHRVRTUFkKKyAqCS0gbWFrZSB3aXJlbGVzcyBleHRlbnNpb25zIG9wdGlvbmFsCisgKgktIHByaXZhdGUgaW9jdGwgdG8gc2V0L2dldCBxdWFsaXR5IGFuZCBsZXZlbCB0aHJlc2hvbGQsIGhpc3RvZ3JhbQorICoJLSByZW1vdmUgL3Byb2MvbmV0L3dhdmVsYW4KKyAqCS0gc3VwcHJlc3MgdXNlbGVzcyBzdHVmZiBmcm9tIGxwIChuZXRfbG9jYWwpCisgKgktIGtlcm5lbCAyLjEgc3VwcG9ydCAoY29weV90by9mcm9tX3VzZXIgaW5zdGVhZCBvZiBtZW1jcHlfdG8vZnJvbWZzKQorICoJLSBhZGQgbWVzc2FnZSBsZXZlbCAoZGVidWcgc3R1ZmYgaW4gL3Zhci9hZG0vZGVidWcgYW5kIGVycm9ycyBub3QKKyAqCSAgZGlzcGxheWVkIGF0IGNvbnNvbGUgYW5kIHN0aWxsIGluIC92YXIvYWRtL21lc3NhZ2VzKQorICoJLSBtdWx0aSBkZXZpY2Ugc3VwcG9ydAorICoJLSBzdGFydCBmaXhpbmcgdGhlIHByb2JlIChpbml0IGNvZGUpCisgKgktIG1vcmUgaW5saW5lcworICoJLSBtYW4gcGFnZQorICoJLSBtYW55IG90aGVyIG1pbm9yIGRldGFpbHMgYW5kIGNsZWFudXBzCisgKgorICogQ2hhbmdlcyBtYWRlIGluIHNlY29uZCBwcmUtcmVsZWFzZToKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIGNsZWFuIHVwIGluaXQgY29kZSAocHJvYmUgYW5kIG1vZHVsZSBpbml0KQorICoJLSBiZXR0ZXIgbXVsdGlwbGUgZGV2aWNlIHN1cHBvcnQgKG1vZHVsZSkKKyAqCS0gbmFtZSBhc3NpZ25tZW50IChtb2R1bGUpCisgKgorICogQ2hhbmdlcyBtYWRlIGluIHRoaXJkIHByZS1yZWxlYXNlOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBiZSBtb3JlIGNvbnNlcnZhdGl2ZSBvbiB0aW1lcnMKKyAqCS0gcHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgbXVsdGljYXN0IChJIHN0aWxsIGxhY2sgc29tZSBkZXRhaWxzKQorICoKKyAqIENoYW5nZXMgbWFkZSBpbiBmb3VydGggcHJlLXJlbGVhc2U6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBtdWx0aWNhc3QgKHJldmlzaXRlZCBhbmQgZmluaXNoZWQpCisgKgktIGF2b2lkIHJlc2V0IGluIHNldF9tdWx0aWNhc3RfbGlzdCAoYSByZWFsbHkgYmlnIGhhY2spCisgKgkgIGlmIHNvbWVib2R5IGNvdWxkIGFwcGx5IHRoaXMgY29kZSBmb3Igb3RoZXIgaTgyNTg2IGJhc2VkIGRyaXZlcnMKKyAqCS0gc2hhcmUgb25ib2FyZCBtZW1vcnkgNzUlIFJVIGFuZCAyNSUgQ1UgKGluc3RlYWQgb2YgNTAvNTApCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMS4xNToKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIGNoYW5nZSB0aGUgZGV0ZWN0aW9uIGNvZGUgZm9yIG11bHRpIG1hbnVmYWN0dXJlciBjb2RlIHN1cHBvcnQKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi4xLjE3OgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gdXBkYXRlIHRvIHdpcmVsZXNzIGV4dGVuc2lvbnMgY2hhbmdlcworICoJLSBzaWxseSBidWcgaW4gY2FyZCBpbml0aWFsIGNvbmZpZ3VyYXRpb24gKHBzYV9jb25mX3N0YXR1cykKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi4xLjI3ICYgMi4wLjMwOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gc21hbGwgYnVnIGluIGRlYnVnIGNvZGUgKHByb2JhYmx5IG5vdCB0aGUgbGFzdCBvbmUuLi4pCisgKgktIHJlbW92ZSBleHRlcm4ga2V5d29yZCBmb3Igd2F2ZWxhbl9wcm9iZSgpCisgKgktIGxldmVsIHRocmVzaG9sZCBpcyBub3cgYSBzdGFuZGFyZCB3aXJlbGVzcyBleHRlbnNpb24gKHZlcnNpb24gNCAhKQorICoJLSBtb2R1bGVzIHBhcmFtZXRlcnMgdHlwZXMgKG5ldyBtb2R1bGUgaW50ZXJmYWNlKQorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjEuMzY6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBieXRlIGNvdW50IHN0YXRzIChjb3VydGVzeSBvZiBEYXZpZCBIaW5kcykKKyAqCS0gcmVtb3ZlIGRldl90aW50IHN0dWZmIChjb3VydGVzeSBvZiBEYXZpZCBIaW5kcykKKyAqCS0gZW5jcnlwdGlvbiBzZXR0aW5nIGZyb20gQnJlbnQgRWxwaGljayAodGhhbmtzIGEgbG90ISkKKyAqCS0gJ2lvYWRkcicgdG8gJ3VfbG9uZycgZm9yIHRoZSBBbHBoYSAodGhhbmtzIHRvIFN0YW5pc2xhdiBTaW55YWdpbikKKyAqCisgKiBPdGhlciBjaGFuZ2VzIChub3QgYnkgbWUpIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gU3BlbGxpbmcgYW5kIGdyYW1hciAicmVjdGlmaWNhdGlvbiIuCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMC4zNyAmIDIuMi4yIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBDb3JyZWN0IHN0YXR1cyBpbiAvcHJvYy9uZXQvd2lyZWxlc3MKKyAqCS0gU2V0IFBTQSBDUkMgdG8gbWFrZSBQdFAgZGlhZ25vc3RpYyB0b29sIGhhcHB5IChCb2IgR3JheSkKKyAqCS0gTW9kdWxlIGluaXQgY29kZSBkb24ndCBmYWlsIGlmIHdlIGZvdW5kIGF0IGxlYXN0IG9uZSBjYXJkIGluCisgKgkgIHRoZSBhZGRyZXNzIGxpc3QgKEthcmxpcyBQZWlzZW5pZWtzKQorICoJLSBNaXNzaW5nIHBhcmVudGhlc2lzIChDaHJpc3RvcGhlciBQZXRlcnNvbikKKyAqCS0gQ29ycmVjdCBpODI1ODYgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKgktIEVuY3J5cHRpb24gaW5pdGlhbGlzYXRpb24gYnVnIChSb2JlcnQgTWNDb3JtYWNrKQorICoJLSBOZXcgbWFjIGFkZHJlc3NlcyBkZXRlY3RlZCBpbiB0aGUgcHJvYmUKKyAqCS0gSW5jcmVhc2Ugd2F0Y2hkb2cgZm9yIGJ1c3kgZW52aXJvbm1lbnRzCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMC4zOCAmIDIuMi43IDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBDb3JyZWN0IHRoZSByZWNlcHRpb24gbG9naWMgdG8gYmV0dGVyIHJlcG9ydCBlcnJvcnMgYW5kIGF2b2lkCisgKgkgIHNlbmRpbmcgYm9ndXMgcGFja2V0IHVwIHRoZSBzdGFjaworICoJLSBEZWxheSBSVSBjb25maWcgdG8gYXZvaWQgY29ycnVwdGluZyBmaXJzdCByZWNlaXZlZCBwYWNrZXQKKyAqCS0gQ2hhbmdlIGNvbmZpZyBjb21wbGV0aW9uIGNvZGUgKHRvIGFjdHVhbGx5IGNoZWNrIHNvbWV0aGluZykKKyAqCS0gQXZvaWQgcmVhZGluZyBvdXQgb2YgYm91bmQgaW4gc2tidWYgdG8gdHJhbnNtaXQKKyAqCS0gUmVjdGlmeSBhIGxvdCBvZiAodXNlbGVzcykgZGVidWdnaW5nIGNvZGUKKyAqCS0gQ2hhbmdlIHRoZSB3YXkgdG8gYCNpZmRlZiBTRVRfUFNBX0NSQycKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi4yLjExICYgMi4zLjEzIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gQ2hhbmdlIGUtbWFpbCBhbmQgd2ViIHBhZ2UgYWRkcmVzc2VzCisgKgktIFdhdGNoZG9nIHRpbWVyIGlzIG5vdyBjb3JyZWN0bHkgZXhwcmVzc2VkIGluIEhaLCBub3QgaW4gamlmZmllcworICoJLSBBZGQgY2hhbm5lbCBudW1iZXIgdG8gdGhlIGxpc3Qgb2YgZnJlcXVlbmNpZXMgaW4gcmFuZ2UKKyAqCS0gQWRkIHRoZSAoc2hvcnQpIGxpc3Qgb2YgYml0LXJhdGVzIGluIHJhbmdlCisgKgktIERldmVsb3BwIGEgbmV3IHNlbnNpdGl2aXR5Li4uIChzZW5zLnZhbHVlICYgc2Vucy5maXhlZCkKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi4yLjE0ICYgMi4zLjIzIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gRml4IGNoZWNrIGZvciByb290IHBlcm1pc3Npb24gKGJyZWFrIGluc3RlYWQgb2YgZXhpdCkKKyAqCS0gTmV3IG53aWQgJiBlbmNvZGluZyBzZXR0aW5nIChXaXJlbGVzcyBFeHRlbnNpb24gOSkKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi4zLjQ5IDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gSW5kZW50YXRpb24gcmVmb3JtYXRpbmcgKEFsYW4pCisgKgktIFVwZGF0ZSB0byBuZXcgbmV0d29yayBBUEkgKHNvZnRuZXQgLSAyLjMuNDMpIDoKKyAqCQlvIHJlcGxhY2UgZGV2LT50YnVzeSAoQWxhbikKKyAqCQlvIHJlcGxhY2UgZGV2LT50c3RhcnQgKEFsYW4pCisgKgkJbyByZW1vdmUgZGV2LT5pbnRlcnJ1cHQgKEFsYW4pCisgKgkJbyBhZGQgU01QIGxvY2tpbmcgdmlhIHNwaW5sb2NrIGluIHNwbHh4IChtZSkKKyAqCQlvIGFkZCBzcGlubG9jayBpbiBpbnRlcnJ1cHQgaGFuZGxlciAobWUpCisgKgkJbyB1c2Uga2VybmVsIHdhdGNoZG9nIGluc3RlYWQgb2Ygb3VycyAobWUpCisgKgkJbyBpbmNyZWFzZSB3YXRjaGRvZyB0aW1lb3V0IChrZXJuZWwgaXMgbW9yZSBzZW5zaXRpdmUpIChtZSkKKyAqCQlvIHZlcmlmeSB0aGF0IGFsbCB0aGUgY2hhbmdlcyBtYWtlIHNlbnNlIGFuZCB3b3JrIChtZSkKKyAqCS0gRml4dXAgYSBwb3RlbnRpYWwgZ290Y2hhIHdoZW4gcmVjb25maWd1cmluZyBhbmQgdGhpZ2h0ZW4gYSBiaXQKKyAqCQl0aGUgaW50ZXJhY3Rpb25zIHdpdGggVHggcXVldWUuCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuNC4wIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBGaXggc3BpbmxvY2sgc3R1cGlkIGJ1Z3MgdGhhdCBJIGxlZnQgaW4uIFRoZSBkcml2ZXIgaXMgbm93IFNNUAorICoJCWNvbXBsaWFudCBhbmQgZG9lc24ndCBsb2NrdXAgYXQgc3RhcnR1cC4KKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi41LjIgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIFVzZSBuZXcgZHJpdmVyIEFQSSBmb3IgV2lyZWxlc3MgRXh0ZW5zaW9ucyA6CisgKgkJbyBnb3QgcmlkIG9mIHdhdmVsYW5faW9jdGwoKQorICoJCW8gdXNlIGEgYnVuY2ggb2YgaXdfaGFuZGxlciBpbnN0ZWFkCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuNS4zNSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIFNldCBkZXYtPnRyYW5zX3N0YXJ0IHRvIGF2b2lkIGZpbGxpbmcgdGhlIGxvZ3MKKyAqCS0gSGFuZGxlIGJldHRlciBzcHVyaW91cy9ib2d1cyBpbnRlcnJ1cHQKKyAqCS0gQXZvaWQgZGVhZGxvY2tzIGluIG1tY19vdXQoKS9tbWNfaW4oKQorICoKKyAqIFdpc2hlcyAmIGRyZWFtczoKKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gcm9hbWluZyAoc2VlIFBjbWNpYSBkcml2ZXIpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOQ0xVREVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZQk8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlCTxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlCTxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUJPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZQk8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlCTxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlCTxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZQk8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZQk8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZQk8bGludXgvaW4uaD4KKyNpbmNsdWRlCTxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlCTxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUJPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUJPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlCTxhc20vaW8uaD4KKyNpbmNsdWRlCTxhc20vZG1hLmg+CisjaW5jbHVkZQk8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlCTxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUJPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUJPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZQk8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZQk8bGludXgvc2xhYi5oPgorI2luY2x1ZGUJPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZQk8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4JCS8qIFdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgkJLyogV2lyZWxlc3MgaGFuZGxlcnMgKi8KKworLyogV2F2ZUxBTiBkZWNsYXJhdGlvbnMgKi8KKyNpbmNsdWRlCSJpODI1ODYuaCIKKyNpbmNsdWRlCSJ3YXZlbGFuLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBEUklWRVIgT1BUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBgI2RlZmluZScgb3IgYCN1bmRlZicgdGhlIGZvbGxvd2luZyBjb25zdGFudCB0byBjaGFuZ2UgdGhlIGJlaGF2aW91cgorICogb2YgdGhlIGRyaXZlci4uLgorICovCisjdW5kZWYgU0VUX1BTQV9DUkMJCS8qIENhbGN1bGF0ZSBhbmQgc2V0IHRoZSBDUkMgb24gUFNBIChzbG93ZXIpICovCisjZGVmaW5lIFVTRV9QU0FfQ09ORklHCQkvKiBVc2UgaW5mbyBmcm9tIHRoZSBQU0EuICovCisjdW5kZWYgU1RSVUNUX0NIRUNLCQkvKiBWZXJpZnkgcGFkZGluZyBvZiBzdHJ1Y3R1cmVzLiAqLworI3VuZGVmIEVFUFJPTV9JU19QUk9URUNURUQJLyogZG9lc24ndCBzZWVtIHRvIGJlIG5lY2Vzc2FyeSAqLworI2RlZmluZSBNVUxUSUNBU1RfQVZPSUQJCS8qIEF2b2lkIGV4dHJhIG11bHRpY2FzdCAoSSdtIHNjZXB0aWNhbCkuICovCisjdW5kZWYgU0VUX01BQ19BRERSRVNTCQkvKiBFeHBlcmltZW50YWwgKi8KKworI2lmZGVmIFdJUkVMRVNTX0VYVAkvKiBJZiB3aXJlbGVzcyBleHRlbnNpb25zIGV4aXN0IGluIHRoZSBrZXJuZWwgKi8KKy8qIFdhcm5pbmc6ICB0aGlzIHN0dWZmIHdpbGwgc2xvdyBkb3duIHRoZSBkcml2ZXIuICovCisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLyogRW5hYmxlIHNweWluZyBhZGRyZXNzZXMuICovCisjdW5kZWYgSElTVE9HUkFNCQkvKiBFbmFibGUgaGlzdG9ncmFtIG9mIHNpZ25hbCBsZXZlbC4gKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERFQlVHICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI3VuZGVmIERFQlVHX01PRFVMRV9UUkFDRQkvKiBtb2R1bGUgaW5zZXJ0aW9uL3JlbW92YWwgKi8KKyN1bmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQkvKiBjYWxscyBtYWRlIGJ5IExpbnV4ICovCisjdW5kZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCS8qIGNhbGxzIHRvIGhhbmRsZXIgKi8KKyN1bmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTwkvKiB0eXBlIG9mIGludGVycnVwdCBhbmQgc28gb24gKi8KKyNkZWZpbmUgREVCVUdfSU5URVJSVVBUX0VSUk9SCS8qIHByb2JsZW1zICovCisjdW5kZWYgREVCVUdfQ09ORklHX1RSQUNFCS8qIFRyYWNlIHRoZSBjb25maWcgZnVuY3Rpb25zLiAqLworI3VuZGVmIERFQlVHX0NPTkZJR19JTkZPCS8qIHdoYXQncyBnb2luZyBvbiAqLworI2RlZmluZSBERUJVR19DT05GSUdfRVJST1IJLyogZXJyb3JzIG9uIGNvbmZpZ3VyYXRpb24gKi8KKyN1bmRlZiBERUJVR19UWF9UUkFDRQkJLyogdHJhbnNtaXNzaW9uIGNhbGxzICovCisjdW5kZWYgREVCVUdfVFhfSU5GTwkJLyogaGVhZGVyIG9mIHRoZSB0cmFuc21pdHRlZCBwYWNrZXQgKi8KKyN1bmRlZiBERUJVR19UWF9GQUlMCQkvKiBOb3JtYWwgZmFpbHVyZSBjb25kaXRpb25zICovCisjZGVmaW5lIERFQlVHX1RYX0VSUk9SCQkvKiBVbmV4cGVjdGVkIGNvbmRpdGlvbnMgKi8KKyN1bmRlZiBERUJVR19SWF9UUkFDRQkJLyogdHJhbnNtaXNzaW9uIGNhbGxzICovCisjdW5kZWYgREVCVUdfUlhfSU5GTwkJLyogaGVhZGVyIG9mIHRoZSByZWNlaXZlZCBwYWNrZXQgKi8KKyN1bmRlZiBERUJVR19SWF9GQUlMCQkvKiBOb3JtYWwgZmFpbHVyZSBjb25kaXRpb25zICovCisjZGVmaW5lIERFQlVHX1JYX0VSUk9SCQkvKiBVbmV4cGVjdGVkIGNvbmRpdGlvbnMgKi8KKworI3VuZGVmIERFQlVHX1BBQ0tFVF9EVU1QCS8qIER1bXAgcGFja2V0IG9uIHRoZSBzY3JlZW4gaWYgZGVmaW5lZCB0byAzMi4gKi8KKyN1bmRlZiBERUJVR19JT0NUTF9UUkFDRQkvKiBtaXNjLiBjYWxsIGJ5IExpbnV4ICovCisjdW5kZWYgREVCVUdfSU9DVExfSU5GTwkJLyogdmFyaW91cyBkZWJ1Z2dpbmcgaW5mbyAqLworI2RlZmluZSBERUJVR19JT0NUTF9FUlJPUgkvKiB3aGF0J3MgZ29pbmcgd3JvbmcgKi8KKyNkZWZpbmUgREVCVUdfQkFTSUNfU0hPVwkvKiBTaG93IGJhc2ljIHN0YXJ0dXAgaW5mby4gKi8KKyN1bmRlZiBERUJVR19WRVJTSU9OX1NIT1cJLyogUHJpbnQgdmVyc2lvbiBpbmZvLiAqLworI3VuZGVmIERFQlVHX1BTQV9TSE9XCQkvKiBEdW1wIFBTQSB0byBzY3JlZW4uICovCisjdW5kZWYgREVCVUdfTU1DX1NIT1cJCS8qIER1bXAgbW1jIHRvIHNjcmVlbi4gKi8KKyN1bmRlZiBERUJVR19TSE9XX1VOVVNFRAkvKiBTaG93IHVudXNlZCBmaWVsZHMgdG9vLiAqLworI3VuZGVmIERFQlVHX0k4MjU4Nl9TSE9XCS8qIFNob3cgaTgyNTg2IHN0YXR1cy4gKi8KKyN1bmRlZiBERUJVR19ERVZJQ0VfU0hPVwkvKiBTaG93IGRldmljZSBwYXJhbWV0ZXJzLiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIENPTlNUQU5UUyAmIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBERUJVR19WRVJTSU9OX1NIT1cKK3N0YXRpYyBjb25zdCBjaGFyCSp2ZXJzaW9uCT0gIndhdmVsYW4uYyA6IHYyNCAoU01QICsgd2lyZWxlc3MgZXh0ZW5zaW9ucykgMTEvMTIvMDFcbiI7CisjZW5kaWYKKworLyogV2F0Y2hkb2cgdGVtcG9yaXNhdGlvbiAqLworI2RlZmluZQlXQVRDSERPR19KSUZGSUVTCSg1MTIqSFovMTAwKQorCisvKiBNYWNybyB0byBnZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBhcnJheSAqLworI2RlZmluZQlORUxTKGEpCQkJCShzaXplb2YoYSkgLyBzaXplb2YoYVswXSkpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQUklWQVRFIElPQ1RMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFNJT0NTSVBRVEhSCVNJT0NJV0ZJUlNUUFJJVgkJLyogU2V0IHF1YWxpdHkgdGhyZXNob2xkICovCisjZGVmaW5lIFNJT0NHSVBRVEhSCVNJT0NJV0ZJUlNUUFJJViArIDEJLyogR2V0IHF1YWxpdHkgdGhyZXNob2xkICovCisKKyNkZWZpbmUgU0lPQ1NJUEhJU1RPCVNJT0NJV0ZJUlNUUFJJViArIDIJLyogU2V0IGhpc3RvZ3JhbSByYW5nZXMgKi8KKyNkZWZpbmUgU0lPQ0dJUEhJU1RPCVNJT0NJV0ZJUlNUUFJJViArIDMJLyogR2V0IGhpc3RvZ3JhbSB2YWx1ZXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBUWVBFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNob3J0Y3V0cyAqLwordHlwZWRlZiBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwllbl9zdGF0czsKK3R5cGVkZWYgc3RydWN0IGl3X3N0YXRpc3RpY3MJaXdfc3RhdHM7Cit0eXBlZGVmIHN0cnVjdCBpd19xdWFsaXR5CWl3X3F1YWw7Cit0eXBlZGVmIHN0cnVjdCBpd19mcmVxCQlpd19mcmVxOwordHlwZWRlZiBzdHJ1Y3QgbmV0X2xvY2FsCW5ldF9sb2NhbDsKK3R5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJdGltZXJfbGlzdDsKKworLyogQmFzaWMgdHlwZXMgKi8KK3R5cGVkZWYgdV9jaGFyCQltYWNfYWRkcltXQVZFTEFOX0FERFJfU0laRV07CS8qIEhhcmR3YXJlIGFkZHJlc3MgKi8KKworLyoKKyAqIFN0YXRpYyBzcGVjaWZpYyBkYXRhIGZvciB0aGUgaW50ZXJmYWNlLgorICoKKyAqIEZvciBlYWNoIG5ldHdvcmsgaW50ZXJmYWNlLCBMaW51eCBrZWVwcyBkYXRhIGluIHR3byBzdHJ1Y3R1cmVzOiAgImRldmljZSIKKyAqIGtlZXBzIHRoZSBnZW5lcmljIGRhdGEgKHNhbWUgZm9ybWF0IGZvciBldmVyeWJvZHkpIGFuZCAibmV0X2xvY2FsIiBrZWVwcworICogYWRkaXRpb25hbCBzcGVjaWZpYyBkYXRhLgorICogTm90ZSB0aGF0IHNvbWUgb2YgdGhpcyBzcGVjaWZpYyBkYXRhIGlzIGluIGZhY3QgZ2VuZXJpYyAoZW5fc3RhdHMsIGZvcgorICogZXhhbXBsZSkuCisgKi8KK3N0cnVjdCBuZXRfbG9jYWwKK3sKKyAgbmV0X2xvY2FsICoJbmV4dDsJCS8qIGxpbmtlZCBsaXN0IG9mIHRoZSBkZXZpY2VzICovCisgIHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2OwkJLyogcmV2ZXJzZSBsaW5rICovCisgIHNwaW5sb2NrX3QJc3BpbmxvY2s7CS8qIFNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIGhhcmR3YXJlIChTTVApICovCisgIGVuX3N0YXRzCXN0YXRzOwkJLyogRXRoZXJuZXQgaW50ZXJmYWNlIHN0YXRpc3RpY3MgKi8KKyAgaW50CQlucmVzZXRzOwkvKiBudW1iZXIgb2YgaGFyZHdhcmUgcmVzZXRzICovCisgIHVfY2hhcglyZWNvbmZpZ184MjU4NjsJLyogV2UgbmVlZCB0byByZWNvbmZpZ3VyZSB0aGUgY29udHJvbGxlci4gKi8KKyAgdV9jaGFyCXByb21pc2N1b3VzOwkvKiBwcm9taXNjdW91cyBtb2RlICovCisgIGludAkJbWNfY291bnQ7CS8qIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisgIHVfc2hvcnQJaGFjcjsJCS8qIGN1cnJlbnQgaG9zdCBpbnRlcmZhY2Ugc3RhdGUgKi8KKworICBpbnQJCXR4X25faW5fdXNlOworICB1X3Nob3J0CXJ4X2hlYWQ7CisgIHVfc2hvcnQJcnhfbGFzdDsKKyAgdV9zaG9ydAl0eF9maXJzdF9mcmVlOworICB1X3Nob3J0CXR4X2ZpcnN0X2luX3VzZTsKKworI2lmZGVmIFdJUkVMRVNTX0VYVAorICBpd19zdGF0cwl3c3RhdHM7CQkvKiBXaXJlbGVzcy1zcGVjaWZpYyBzdGF0aXN0aWNzICovCisKKyAgc3RydWN0IGl3X3NweV9kYXRhCXNweV9kYXRhOworICBzdHJ1Y3QgaXdfcHVibGljX2RhdGEJd2lyZWxlc3NfZGF0YTsKKyNlbmRpZgorCisjaWZkZWYgSElTVE9HUkFNCisgIGludAkJaGlzX251bWJlcjsJCS8qIG51bWJlciBvZiBpbnRlcnZhbHMgKi8KKyAgdV9jaGFyCWhpc19yYW5nZVsxNl07CQkvKiBib3VuZGFyaWVzIG9mIGludGVydmFsIF1uLTE7IG5dICovCisgIHVfbG9uZwloaXNfc3VtWzE2XTsJCS8qIHN1bSBpbiBpbnRlcnZhbCAqLworI2VuZGlmCS8qIEhJU1RPR1JBTSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUFJPVE9UWVBFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNSVNDLiBTVUJST1VUSU5FUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB1X2NoYXIKKwl3dl9pcnFfdG9fcHNhKGludCk7CitzdGF0aWMgaW50CisJd3ZfcHNhX3RvX2lycSh1X2NoYXIpOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBIT1NUIEFEQVBURVIgU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSB1X3Nob3J0CQkvKiBkYXRhICovCisJaGFzcl9yZWFkKHVfbG9uZyk7CS8qIFJlYWQgdGhlIGhvc3QgaW50ZXJmYWNlOiAgYmFzZSBhZGRyZXNzICovCitzdGF0aWMgaW5saW5lIHZvaWQKKwloYWNyX3dyaXRlKHVfbG9uZywJLyogV3JpdGUgdG8gaG9zdCBpbnRlcmZhY2U6ICBiYXNlIGFkZHJlc3MgKi8KKwkJICAgdV9zaG9ydCksCS8qIGRhdGEgKi8KKwloYWNyX3dyaXRlX3Nsb3codV9sb25nLAorCQkgICB1X3Nob3J0KSwKKwlzZXRfY2hhbl9hdHRuKHVfbG9uZywJLyogaW9hZGRyICovCisJCSAgICAgIHVfc2hvcnQpLAkvKiBoYWNyICAgKi8KKwl3dl9oYWNyX3Jlc2V0KHVfbG9uZyksCS8qIGlvYWRkciAqLworCXd2XzE2X29mZih1X2xvbmcsCS8qIGlvYWRkciAqLworCQkgIHVfc2hvcnQpLAkvKiBoYWNyICAgKi8KKwl3dl8xNl9vbih1X2xvbmcsCS8qIGlvYWRkciAqLworCQkgdV9zaG9ydCksCS8qIGhhY3IgICAqLworCXd2X2ludHNfb2ZmKHN0cnVjdCBuZXRfZGV2aWNlICopLAorCXd2X2ludHNfb24oc3RydWN0IG5ldF9kZXZpY2UgKik7CisvKiAtLS0tLS0tLS0tLS0tLS0tLSBNT0RFTSBNQU5BR0VNRU5UIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZAorCXBzYV9yZWFkKHVfbG9uZywJLyogUmVhZCB0aGUgUGFyYW1ldGVyIFN0b3JhZ2UgQXJlYS4gKi8KKwkJIHVfc2hvcnQsCS8qIGhhY3IgKi8KKwkJIGludCwJCS8qIG9mZnNldCBpbiBQU0EgKi8KKwkJIHVfY2hhciAqLAkvKiBidWZmZXIgdG8gZmlsbCAqLworCQkgaW50KSwJCS8qIHNpemUgdG8gcmVhZCAqLworCXBzYV93cml0ZSh1X2xvbmcsIAkvKiBXcml0ZSB0byB0aGUgUFNBLiAqLworCQkgIHVfc2hvcnQsCS8qIGhhY3IgKi8KKwkJICBpbnQsCQkvKiBvZmZzZXQgaW4gUFNBICovCisJCSAgdV9jaGFyICosCS8qIGJ1ZmZlciBpbiBtZW1vcnkgKi8KKwkJICBpbnQpOwkJLyogbGVuZ3RoIG9mIGJ1ZmZlciAqLworc3RhdGljIGlubGluZSB2b2lkCisJbW1jX291dCh1X2xvbmcsCQkvKiBXcml0ZSAxIGJ5dGUgdG8gdGhlIE1vZGVtIE1hbmFnIENvbnRyb2wuICovCisJCXVfc2hvcnQsCisJCXVfY2hhciksCisJbW1jX3dyaXRlKHVfbG9uZywJLyogV3JpdGUgbiBieXRlcyB0byB0aGUgTU1DLiAqLworCQkgIHVfY2hhciwKKwkJICB1X2NoYXIgKiwKKwkJICBpbnQpOworc3RhdGljIGlubGluZSB1X2NoYXIJCS8qIFJlYWQgMSBieXRlIGZyb20gdGhlIE1NQy4gKi8KKwltbWNfaW4odV9sb25nLAorCSAgICAgICB1X3Nob3J0KTsKK3N0YXRpYyBpbmxpbmUgdm9pZAorCW1tY19yZWFkKHVfbG9uZywJLyogUmVhZCBuIGJ5dGVzIGZyb20gdGhlIE1NQy4gKi8KKwkJIHVfY2hhciwKKwkJIHVfY2hhciAqLAorCQkgaW50KSwKKwlmZWVfd2FpdCh1X2xvbmcsCS8qIFdhaXQgZm9yIGZyZXF1ZW5jeSBFRVBST006ICBiYXNlIGFkZHJlc3MgKi8KKwkJIGludCwJCS8qIGJhc2UgZGVsYXkgdG8gd2FpdCBmb3IgKi8KKwkJIGludCk7CQkvKiB0aW1lIHRvIHdhaXQgKi8KK3N0YXRpYyB2b2lkCisJZmVlX3JlYWQodV9sb25nLAkvKiBSZWFkIHRoZSBmcmVxdWVuY3kgRUVQUk9NOiAgYmFzZSBhZGRyZXNzICovCisJCSB1X3Nob3J0LAkvKiBkZXN0aW5hdGlvbiBvZmZzZXQgKi8KKwkJIHVfc2hvcnQgKiwJLyogZGF0YSBidWZmZXIgKi8KKwkJIGludCk7CQkvKiBudW1iZXIgb2YgcmVnaXN0ZXJzICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEk4MjU4NiBTVUJST1VUSU5FUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIC8qaW5saW5lKi8gdm9pZAorCW9icmFtX3JlYWQodV9sb25nLAkvKiBpb2FkZHIgKi8KKwkJICAgdV9zaG9ydCwJLyogbyAqLworCQkgICB1X2NoYXIgKiwJLyogYiAqLworCQkgICBpbnQpOwkvKiBuICovCitzdGF0aWMgaW5saW5lIHZvaWQKKwlvYnJhbV93cml0ZSh1X2xvbmcsCS8qIGlvYWRkciAqLworCQkgICAgdV9zaG9ydCwJLyogbyAqLworCQkgICAgdV9jaGFyICosCS8qIGIgKi8KKwkJICAgIGludCk7CS8qIG4gKi8KK3N0YXRpYyB2b2lkCisJd3ZfYWNrKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGlubGluZSBpbnQKKwl3dl9zeW5jaHJvbm91c19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKiwKKwkJCSAgIGNvbnN0IGNoYXIgKiksCisJd3ZfY29uZmlnX2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICosCisJCQkgICB1X2xvbmcsCisJCQkgICBuZXRfbG9jYWwgKik7CitzdGF0aWMgaW50CisJd3ZfY29tcGxldGUoc3RydWN0IG5ldF9kZXZpY2UgKiwKKwkJICAgIHVfbG9uZywKKwkJICAgIG5ldF9sb2NhbCAqKTsKK3N0YXRpYyBpbmxpbmUgdm9pZAorCXd2XzgyNTg2X3JlY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICopOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBERUJVRyAmIElORk8gU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIERFQlVHX0k4MjU4Nl9TSE9XCitzdGF0aWMgdm9pZAorCXd2X3NjYl9zaG93KHVuc2lnbmVkIHNob3J0KTsKKyNlbmRpZgorc3RhdGljIGlubGluZSB2b2lkCisJd3ZfaW5pdF9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBkaXNwbGF5IHN0YXJ0dXAgaW5mbyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBJT0NUTCwgU1RBVFMgJiBSRUNPTkZJRyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgZW5fc3RhdHMJKgorCXdhdmVsYW5fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBHaXZlIHN0YXRzIC9wcm9jL25ldC9kZXYgKi8KK3N0YXRpYyBpd19zdGF0cyAqCisJd2F2ZWxhbl9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZAorCXdhdmVsYW5fc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICopOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUEFDS0VUIFJFQ0VQVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSB2b2lkCisJd3ZfcGFja2V0X3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogUmVhZCBhIHBhY2tldCBmcm9tIGEgZnJhbWUuICovCisJCSAgICAgICB1X3Nob3J0LAorCQkgICAgICAgaW50KSwKKwl3dl9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBSZWFkIGFsbCBwYWNrZXRzIHdhaXRpbmcuICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gUEFDS0VUIFRSQU5TTUlTU0lPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgaW50CisJd3ZfcGFja2V0X3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICosCS8qIFdyaXRlIGEgcGFja2V0IHRvIHRoZSBUeCBidWZmZXIuICovCisJCQl2b2lkICosCisJCQlzaG9ydCk7CitzdGF0aWMgaW50CisJd2F2ZWxhbl9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqLAkvKiBTZW5kIGEgcGFja2V0LiAqLworCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICopOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gSEFSRFdBUkUgQ09ORklHVVJBVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSBpbnQKKwl3dl9tbWNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqKSwJLyogSW5pdGlhbGl6ZSB0aGUgbW9kZW0uICovCisJd3ZfcnVfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKiksCS8qIFN0YXJ0IHRoZSBpODI1ODYgcmVjZWl2ZXIgdW5pdC4gKi8KKwl3dl9jdV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqKSwJLyogU3RhcnQgdGhlIGk4MjU4NiBjb21tYW5kIHVuaXQuICovCisJd3ZfODI1ODZfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFN0YXJ0IHRoZSBpODI1ODYuICovCitzdGF0aWMgdm9pZAorCXd2XzgyNTg2X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogQ29uZmlndXJlIHRoZSBpODI1ODYuICovCitzdGF0aWMgaW5saW5lIHZvaWQKKwl3dl84MjU4Nl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludAorCXd2X2h3X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICopLAkvKiBSZXNldCB0aGUgV2F2ZUxBTiBoYXJkd2FyZS4gKi8KKwl3dl9jaGVja19pb2FkZHIodV9sb25nLAkJLyogaW9hZGRyICovCisJCQl1X2NoYXIgKik7CS8qIG1hYyBhZGRyZXNzIChyZWFkKSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTlRFUlJVUFQgSEFORExJTkcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlycXJldHVybl90CisJd2F2ZWxhbl9pbnRlcnJ1cHQoaW50LAkJLyogaW50ZXJydXB0IGhhbmRsZXIgKi8KKwkJCSAgdm9pZCAqLAorCQkJICBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyB2b2lkCisJd2F2ZWxhbl93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogdHJhbnNtaXNzaW9uIHdhdGNoZG9nICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIENPTkZJR1VSQVRJT04gQ0FMTEJBQ0tTIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQKKwl3YXZlbGFuX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKiksCS8qIE9wZW4gdGhlIGRldmljZS4gKi8KKwl3YXZlbGFuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICopLAkvKiBDbG9zZSB0aGUgZGV2aWNlLiAqLworCXdhdmVsYW5fY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICosIHVuc2lnbmVkIHNob3J0KTsvKiBDb25maWd1cmUgb25lIGRldmljZS4gKi8KK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqd2F2ZWxhbl9wcm9iZShpbnQgdW5pdCk7CS8qIFNlZSBTcGFjZS5jLiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBWQVJJQUJMRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIHJvb3Qgb2YgdGhlIGxpbmtlZCBsaXN0IG9mIFdhdmVMQU4gZHJpdmVycworICogSXQgaXMgdXNlIHRvIHZlcmlmeSB0aGF0IHdlIGRvbid0IHJldXNlIHRoZSBzYW1lIGJhc2UgYWRkcmVzcworICogZm9yIHR3byBkaWZmZXJlbnQgZHJpdmVycyBhbmQgdG8gY2xlYW4gdXAgd2hlbiByZW1vdmluZyB0aGUgbW9kdWxlLgorICovCitzdGF0aWMgbmV0X2xvY2FsICoJd2F2ZWxhbl9saXN0CT0gKG5ldF9sb2NhbCAqKSBOVUxMOworCisvKgorICogVGhpcyB0YWJsZSBpcyB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUgUFNBIHZhbHVlIHRvIElSUSBudW1iZXIKKyAqIGFuZCB2aWNlIHZlcnNhLgorICovCitzdGF0aWMgdV9jaGFyCWlycXZhbHNbXQk9Cit7CisJICAgMCwgICAgMCwgICAgMCwgMHgwMSwKKwkweDAyLCAweDA0LCAgICAwLCAweDA4LAorCSAgIDAsICAgIDAsIDB4MTAsIDB4MjAsCisJMHg0MCwgICAgMCwgICAgMCwgMHg4MCwKK307CisKKy8qCisgKiBUYWJsZSBvZiB0aGUgYXZhaWxhYmxlIEkvTyBhZGRyZXNzZXMgKGJhc2UgYWRkcmVzc2VzKSBmb3IgV2F2ZUxBTgorICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQJaW9iYXNlW10JPQoreworI2lmCTAKKyAgLyogTGVhdmUgb3V0IDB4M0MwIGZvciBub3cgLS0gc2VlbXMgdG8gY2xhc2ggd2l0aCBzb21lIHZpZGVvCisgICAqIGNvbnRyb2xsZXJzLgorICAgKiBMZWF2ZSBvdXQgdGhlIG90aGVycyB0b28gLS0gd2Ugd2lsbCBhbHdheXMgdXNlIDB4MzkwIGFuZCBsZWF2ZQorICAgKiAweDMwMCBmb3IgdGhlIEV0aGVybmV0IGRldmljZS4KKyAgICogSmVhbiBJSTogIDB4M0UwIGlzIGZpbmUgYXMgd2VsbC4KKyAgICovCisgIDB4MzAwLCAweDM5MCwgMHgzRTAsIDB4M0MwCisjZW5kaWYJLyogMCAqLworICAweDM5MCwgMHgzRTAKK307CisKKyNpZmRlZglNT0RVTEUKKy8qIFBhcmFtZXRlcnMgc2V0IGJ5IGluc21vZCAqLworc3RhdGljIGludAlpb1s0XTsKK3N0YXRpYyBpbnQJaXJxWzRdOworc3RhdGljIGNoYXIJKm5hbWVbNF07Cittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG5hbWUsIGNoYXJwLCBOVUxMLCAwKTsKKworTU9EVUxFX1BBUk1fREVTQyhpbywgIldhdmVMQU4gSS9PIGJhc2UgYWRkcmVzcyhlcykscmVxdWlyZWQiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiV2F2ZUxBTiBJUlEgbnVtYmVyKHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKG5hbWUsICJXYXZlTEFOIGludGVyZmFjZSBuZW1lKHMpIik7CisjZW5kaWYJLyogTU9EVUxFICovCisKKyNlbmRpZgkvKiBXQVZFTEFOX1BfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODMyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMKQEAgLTAsMCArMSw0OTE0IEBACisvKgorICoJV2F2ZWxhbiBQY21jaWEgZHJpdmVyCisgKgorICoJCUplYW4gSUkgLSBIUExCICc5NgorICoKKyAqIFJlb3JnYW5pc2F0aW9uIGFuZCBleHRlbnNpb24gb2YgdGhlIGRyaXZlci4KKyAqIE9yaWdpbmFsIGNvcHlyaWdodCBmb2xsb3cuIFNlZSB3YXZlbGFuX2NzLnAuaCBmb3IgZGV0YWlscy4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIEFudGhvbnkgRC4gSm9zZXBoJ3MgY29kZSBhbmQgYWxsIHRoZSBjaGFuZ2VzIGhlcmUKKyAqIGFyZSBhbHNvIHVuZGVyIHRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgYmVsb3cuCisgKgorICogVGhpcyBjb2RlIHN1cHBvcnRzIHZlcnNpb24gMi4wMCBvZiBXYXZlTEFOL1BDTUNJQSBjYXJkcyAoMi40R0h6KSwgYW5kCisgKiBjYW4gd29yayBvbiBMaW51eCAyLjAuMzYgd2l0aCBzdXBwb3J0IG9mIERhdmlkIEhpbmRzJyBQQ01DSUEgQ2FyZCBTZXJ2aWNlcworICoKKyAqIEpvZSBGaW5uZXkgKGpvZUBjb21wLmxhbmNzLmFjLnVrKSBhdCBMYW5jYXN0ZXIgVW5pdmVyc2l0eSBpbiBVSyBhZGRlZAorICogY3JpdGljYWwgY29kZSBpbiB0aGUgcm91dGluZSB0byBpbml0aWFsaXplIHRoZSBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIuCisgKgorICogVGhhbmtzIHRvIEFsYW4gQ294IGFuZCBCcnVjZSBKYW5zb24gZm9yIHRoZWlyIGFkdmljZS4KKyAqCisgKgktLSBZdW56aG91IExpIChzY2lwNDE2NkBudXMuc2cpCisgKgorI2lmZGVmIFdBVkVMQU5fUk9BTUlORwkKKyAqIFJvYW1pbmcgc3VwcG9ydCBhZGRlZCAwNy8yMi85OCBieSBKdXN0aW4gU2VnZXIgKGpzZWdlckBtZWRpYS5taXQuZWR1KQorICogYmFzZWQgb24gcGF0Y2ggYnkgSm9lIEZpbm5leSBmcm9tIExhbmNhc3RlciBVbml2ZXJzaXR5LgorI2VuZGlmCisgKgorICogTHVjZW50IChmb3JtZXJseSBBVCZUIEdJUywgZm9ybWVybHkgTkNSKSBXYXZlTEFOIFBDTUNJQSBjYXJkOiBBbgorICogRXRoZXJuZXQtbGlrZSByYWRpbyB0cmFuc2NlaXZlciBjb250cm9sbGVkIGJ5IGFuIEludGVsIDgyNTkzIGNvcHJvY2Vzc29yLgorICoKKyAqICAgQSBub24tc2hhcmVkIG1lbW9yeSBQQ01DSUEgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eAorICoKKyAqIElTQSB2ZXJzaW9uIG1vZGlmaWVkIHRvIHN1cHBvcnQgUENNQ0lBIGJ5IEFudGhvbnkgSm9zZXBoIChhZGpAbGNzLm1pdC5lZHUpCisgKgorICoKKyAqIEpvc2VwaCBPJ1N1bGxpdmFuICYgSm9obiBMYW5nZm9yZCAoam9zdWxsdm5AY3MuY211LmVkdSAmIGpjbEBjcy5jbXUuZWR1KQorICoKKyAqIEFwciAyICc5OCAgbWFkZSBjaGFuZ2VzIHRvIGJyaW5nIHRoZSBpODI1OTMgY29udHJvbC9pbnQgaGFuZGxpbmcgaW4gbGluZQorICogICAgICAgICAgICAgd2l0aCBvZmZpY2FsIHNwZWNzLi4uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29weXJpZ2h0IDE5OTUKKyAqICAgQW50aG9ueSBELiBKb3NlcGgKKyAqICAgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICoKKyAqICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBwcm9ncmFtCisgKiAgIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkCisgKiAgIHRoYXQgdGhpcyBjb3B5cmlnaHQgYW5kIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBvbiBhbGwgY29waWVzCisgKiAgIGFuZCBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZAorICogICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCisgKiAgIHByb2dyYW0gd2l0aG91dCBzcGVjaWZpYyBwcmlvciBwZXJtaXNzaW9uLCBhbmQgbm90aWNlIGJlIGdpdmVuCisgKiAgIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiB0aGF0IGNvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBpcworICogICBieSBwZXJtaXNzaW9uIG9mIE0uSS5ULiAgTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dAorICogICB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm8tCisgKiAgIHZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuICAgICAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqLworCisvKiBEbyAqTk9UKiBhZGQgb3RoZXIgaGVhZGVycyBoZXJlLCB5b3UgYXJlIGd1YXJhbnRlZWQgdG8gYmUgd3JvbmcgLSBKZWFuIElJICovCisjaW5jbHVkZSAid2F2ZWxhbl9jcy5wLmgiCQkvKiBQcml2YXRlIGhlYWRlciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNSVNDIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFN1YnJvdXRpbmVzIHdoaWNoIHdvbid0IGZpdCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXRlZ29yeQorICogKHdhdmVsYW4gbW9kZW0gb3IgaTgyNTkzKQorICovCisKKyNpZmRlZiBTVFJVQ1RfQ0hFQ0sKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTYW5pdHkgcm91dGluZSB0byB2ZXJpZnkgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIFdhdmVMQU4gaW50ZXJmYWNlCisgKiBzdHJ1Y3R1cmVzLgorICovCitzdGF0aWMgY2hhciAqCit3dl9zdHJ1Y3R1Y3RfY2hlY2sodm9pZCkKK3sKKyNkZWZpbmUJU0ModCxzLG4pCWlmIChzaXplb2YodCkgIT0gcykgcmV0dXJuKG4pOworCisgIFNDKHBzYV90LCBQU0FfU0laRSwgInBzYV90Iik7CisgIFNDKG1td190LCBNTVdfU0laRSwgIm1td190Iik7CisgIFNDKG1tcl90LCBNTVJfU0laRSwgIm1tcl90Iik7CisKKyN1bmRlZglTQworCisgIHJldHVybigoY2hhciAqKSBOVUxMKTsKK30gLyogd3Zfc3RydWN0dWN0X2NoZWNrICovCisjZW5kaWYJLyogU1RSVUNUX0NIRUNLICovCisKKy8qKioqKioqKioqKioqKioqKioqIE1PREVNIE1BTkFHRU1FTlQgU1VCUk9VVElORVMgKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBVc2VmdWwgc3Vicm91dGluZXMgdG8gbWFuYWdlIHRoZSBtb2RlbSBvZiB0aGUgd2F2ZWxhbgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWFkIGZyb20gY2FyZCdzIEhvc3QgQWRhcHRvciBTdGF0dXMgUmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdV9jaGFyCitoYXNyX3JlYWQodV9sb25nCWJhc2UpCit7CisgIHJldHVybihpbmIoSEFTUihiYXNlKSkpOworfSAvKiBoYXNyX3JlYWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIHRvIGNhcmQncyBIb3N0IEFkYXB0ZXIgQ29tbWFuZCBSZWdpc3Rlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitoYWNyX3dyaXRlKHVfbG9uZwliYXNlLAorCSAgIHVfY2hhcgloYWNyKQoreworICBvdXRiKGhhY3IsIEhBQ1IoYmFzZSkpOworfSAvKiBoYWNyX3dyaXRlICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSB0byBjYXJkJ3MgSG9zdCBBZGFwdGVyIENvbW1hbmQgUmVnaXN0ZXIuIEluY2x1ZGUgYSBkZWxheSBmb3IKKyAqIHRob3NlIHRpbWVzIHdoZW4gaXQgaXMgbmVlZGVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2hhY3Jfd3JpdGVfc2xvdyh1X2xvbmcJYmFzZSwKKwkJdV9jaGFyCWhhY3IpCit7CisgIGhhY3Jfd3JpdGUoYmFzZSwgaGFjcik7CisgIC8qIGRlbGF5IG1pZ2h0IG9ubHkgYmUgbmVlZGVkIHNvbWV0aW1lcyAqLworICBtZGVsYXkoMSk7Cit9IC8qIGhhY3Jfd3JpdGVfc2xvdyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCB0aGUgUGFyYW1ldGVyIFN0b3JhZ2UgQXJlYSBmcm9tIHRoZSBXYXZlTEFOIGNhcmQncyBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQKK3BzYV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCSBpbnQJCW8sCS8qIG9mZnNldCBpbiBQU0EgKi8KKwkgdV9jaGFyICoJYiwJLyogYnVmZmVyIHRvIGZpbGwgKi8KKwkgaW50CQluKQkvKiBzaXplIHRvIHJlYWQgKi8KK3sKKyAgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisgIHVfY2hhciBfX2lvbWVtICpwdHIgPSBscC0+bWVtICsgUFNBX0FERFIgKyAobyA8PCAxKTsKKworICB3aGlsZShuLS0gPiAwKQorICAgIHsKKyAgICAgICpiKysgPSByZWFkYihwdHIpOworICAgICAgLyogRHVlIHRvIGEgbGFjayBvZiBhZGRyZXNzIGRlY29kZSBwaW5zLCB0aGUgV2F2ZUxBTiBQQ01DSUEgY2FyZAorICAgICAgICogb25seSBzdXBwb3J0cyByZWFkaW5nIGV2ZW4gbWVtb3J5IGFkZHJlc3Nlcy4gVGhhdCBtZWFucyB0aGUKKyAgICAgICAqIGluY3JlbWVudCBoZXJlIE1VU1QgYmUgdHdvLgorICAgICAgICogQmVjYXVzZSBvZiB0aGF0LCB3ZSBjYW4ndCB1c2UgbWVtY3B5X2Zyb21pbygpLi4uCisgICAgICAgKi8KKyAgICAgIHB0ciArPSAyOworICAgIH0KK30gLyogcHNhX3JlYWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIHRoZSBQYXJhbXRlciBTdG9yYWdlIEFyZWEgdG8gdGhlIFdhdmVMQU4gY2FyZCdzIG1lbW9yeQorICovCitzdGF0aWMgdm9pZAorcHNhX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCSAgaW50CQlvLAkvKiBPZmZzZXQgaW4gcHNhICovCisJICB1X2NoYXIgKgliLAkvKiBCdWZmZXIgaW4gbWVtb3J5ICovCisJICBpbnQJCW4pCS8qIExlbmd0aCBvZiBidWZmZXIgKi8KK3sKKyAgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisgIHVfY2hhciBfX2lvbWVtICpwdHIgPSBscC0+bWVtICsgUFNBX0FERFIgKyAobyA8PCAxKTsKKyAgaW50CQljb3VudCA9IDA7CisgIGtpb19hZGRyX3QJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAvKiBBcyB0aGVyZSBzZWVtIHRvIGhhdmUgbm8gZmxhZyBQU0FfQlVTWSBhcyBpbiB0aGUgSVNBIG1vZGVsLCB3ZSBhcmUKKyAgICogb2JsaWdlIHRvIHZlcmlmeSB0aGlzIGFkZHJlc3MgdG8ga25vdyB3aGVuIHRoZSBQU0EgaXMgcmVhZHkuLi4gKi8KKyAgdm9sYXRpbGUgdV9jaGFyIF9faW9tZW0gKnZlcmlmeSA9IGxwLT5tZW0gKyBQU0FfQUREUiArCisgICAgKHBzYW9mZigwLCBwc2FfY29tcF9udW1iZXIpIDw8IDEpOworCisgIC8qIEF1dGhvcml6ZSB3cml0dGluZyB0byBQU0EgKi8KKyAgaGFjcl93cml0ZShiYXNlLCBIQUNSX1BXUl9TVEFUIHwgSEFDUl9ST01fV0VOKTsKKworICB3aGlsZShuLS0gPiAwKQorICAgIHsKKyAgICAgIC8qIHdyaXRlIHRvIFBTQSAqLworICAgICAgd3JpdGViKCpiKyssIHB0cik7CisgICAgICBwdHIgKz0gMjsKKworICAgICAgLyogSSBkb24ndCBoYXZlIHRoZSBzcGVjLCBzbyBJIGRvbid0IGtub3cgd2hhdCB0aGUgY29ycmVjdAorICAgICAgICogc2VxdWVuY2UgdG8gd3JpdGUgaXMuIFRoaXMgaGFjayBzZWVtIHRvIHdvcmsgZm9yIG1lLi4uICovCisgICAgICBjb3VudCA9IDA7CisgICAgICB3aGlsZSgocmVhZGIodmVyaWZ5KSAhPSBQU0FfQ09NUF9QQ01DSUFfOTE1KSAmJiAoY291bnQrKyA8IDEwMCkpCisJbWRlbGF5KDEpOworICAgIH0KKworICAvKiBQdXQgdGhlIGhvc3QgaW50ZXJmYWNlIGJhY2sgaW4gc3RhbmRhcmQgc3RhdGUgKi8KKyAgaGFjcl93cml0ZShiYXNlLCBIQUNSX0RFRkFVTFQpOworfSAvKiBwc2Ffd3JpdGUgKi8KKworI2lmZGVmIFNFVF9QU0FfQ1JDCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ2FsY3VsYXRlIHRoZSBQU0EgQ1JDCisgKiBUaGFua3MgdG8gVmFsc3RlciwgTmljbyA8TlZBTFNURVJAd2NuZC5ubC5sdWNlbnQuY29tPiBmb3IgdGhlIGNvZGUKKyAqIE5PVEU6IEJ5IHNwZWNpZnlpbmcgYSBsZW5ndGggaW5jbHVkaW5nIHRoZSBDUkMgcG9zaXRpb24gdGhlCisgKiByZXR1cm5lZCB2YWx1ZSBzaG91bGQgYmUgemVyby4gKGkuZS4gYSBjb3JyZWN0IGNoZWNrc3VtIGluIHRoZSBQU0EpCisgKgorICogVGhlIFdpbmRvd3MgZHJpdmVycyBkb24ndCB1c2UgdGhlIENSQywgYnV0IHRoZSBBUCBhbmQgdGhlIFB0UCB0b29sCisgKiBkZXBlbmQgb24gaXQuCisgKi8KK3N0YXRpYyB1X3Nob3J0Citwc2FfY3JjKHVuc2lnbmVkIGNoYXIgKglwc2EsCS8qIFRoZSBQU0EgKi8KKwlpbnQJCXNpemUpCS8qIE51bWJlciBvZiBzaG9ydCBmb3IgQ1JDICovCit7CisgIGludAkJYnl0ZV9jbnQ7CS8qIExvb3Agb24gdGhlIFBTQSAqLworICB1X3Nob3J0CWNyY19ieXRlcyA9IDA7CS8qIERhdGEgaW4gdGhlIFBTQSAqLworICBpbnQJCWJpdF9jbnQ7CS8qIExvb3Agb24gdGhlIGJpdHMgb2YgdGhlIHNob3J0ICovCisKKyAgZm9yKGJ5dGVfY250ID0gMDsgYnl0ZV9jbnQgPCBzaXplOyBieXRlX2NudCsrICkKKyAgICB7CisgICAgICBjcmNfYnl0ZXMgXj0gcHNhW2J5dGVfY250XTsJLyogSXRzIGFuIHhvciAqLworCisgICAgICBmb3IoYml0X2NudCA9IDE7IGJpdF9jbnQgPCA5OyBiaXRfY250KysgKQorCXsKKwkgIGlmKGNyY19ieXRlcyAmIDB4MDAwMSkKKwkgICAgY3JjX2J5dGVzID0gKGNyY19ieXRlcyA+PiAxKSBeIDB4QTAwMTsKKwkgIGVsc2UKKwkgICAgY3JjX2J5dGVzID4+PSAxIDsKKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gY3JjX2J5dGVzOworfSAvKiBwc2FfY3JjICovCisjZW5kaWYJLyogU0VUX1BTQV9DUkMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHVwZGF0ZSB0aGUgY2hlY2tzdW0gZmllbGQgaW4gdGhlIFdhdmVsYW4ncyBQU0EKKyAqLworc3RhdGljIHZvaWQKK3VwZGF0ZV9wc2FfY2hlY2tzdW0oc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisjaWZkZWYgU0VUX1BTQV9DUkMKKyAgcHNhX3QJCXBzYTsKKyAgdV9zaG9ydAljcmM7CisKKyAgLyogcmVhZCB0aGUgcGFyYW1ldGVyIHN0b3JhZ2UgYXJlYSAqLworICBwc2FfcmVhZChkZXYsIDAsICh1bnNpZ25lZCBjaGFyICopICZwc2EsIHNpemVvZihwc2EpKTsKKworICAvKiB1cGRhdGUgdGhlIGNoZWNrc3VtICovCisgIGNyYyA9IHBzYV9jcmMoKHVuc2lnbmVkIGNoYXIgKikgJnBzYSwKKwkJc2l6ZW9mKHBzYSkgLSBzaXplb2YocHNhLnBzYV9jcmNbMF0pIC0gc2l6ZW9mKHBzYS5wc2FfY3JjWzFdKQorCQktIHNpemVvZihwc2EucHNhX2NyY19zdGF0dXMpKTsKKworICBwc2EucHNhX2NyY1swXSA9IGNyYyAmIDB4RkY7CisgIHBzYS5wc2FfY3JjWzFdID0gKGNyYyAmIDB4RkYwMCkgPj4gODsKKworICAvKiBXcml0ZSBpdCAhICovCisgIHBzYV93cml0ZShkZXYsIChjaGFyICopJnBzYS5wc2FfY3JjIC0gKGNoYXIgKikmcHNhLAorCSAgICAodW5zaWduZWQgY2hhciAqKSZwc2EucHNhX2NyYywgMik7CisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisgIHByaW50ayAoS0VSTl9ERUJVRyAiJXM6IHVwZGF0ZV9wc2FfY2hlY2tzdW0oKTogY3JjID0gMHglMDJ4JTAyeFxuIiwKKyAgICAgICAgICBkZXYtPm5hbWUsIHBzYS5wc2FfY3JjWzBdLCBwc2EucHNhX2NyY1sxXSk7CisKKyAgLyogQ2hlY2sgYWdhaW4gKGx1eHVyeSAhKSAqLworICBjcmMgPSBwc2FfY3JjKCh1bnNpZ25lZCBjaGFyICopICZwc2EsCisJCSBzaXplb2YocHNhKSAtIHNpemVvZihwc2EucHNhX2NyY19zdGF0dXMpKTsKKworICBpZihjcmMgIT0gMCkKKyAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogdXBkYXRlX3BzYV9jaGVja3N1bSgpOiBDUkMgZG9lcyBub3QgYWdyZWUgd2l0aCBQU0EgZGF0YSAoZXZlbiBhZnRlciByZWNhbGN1bGF0aW5nKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZiAvKiBERUJVR19JT0NUTF9JTkZPICovCisjZW5kaWYJLyogU0VUX1BTQV9DUkMgKi8KK30gLyogdXBkYXRlX3BzYV9jaGVja3N1bSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV3JpdGUgMSBieXRlIHRvIHRoZSBNTUMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbW1jX291dCh1X2xvbmcJCWJhc2UsCisJdV9zaG9ydAkJbywKKwl1X2NoYXIJCWQpCit7CisgIGludCBjb3VudCA9IDA7CisKKyAgLyogV2FpdCBmb3IgTU1DIHRvIGdvIGlkbGUgKi8KKyAgd2hpbGUoKGNvdW50KysgPCAxMDApICYmIChpbmIoSEFTUihiYXNlKSkgJiBIQVNSX01NSV9CVVNZKSkKKyAgICB1ZGVsYXkoMTApOworCisgIG91dGIoKHVfY2hhcikoKG8gPDwgMSkgfCBNTVJfTU1JX1dSKSwgTU1SKGJhc2UpKTsKKyAgb3V0YihkLCBNTUQoYmFzZSkpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUm91dGluZSB0byB3cml0ZSBieXRlcyB0byB0aGUgTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyLgorICogV2Ugc3RhcnQgYnkgdGhlIGVuZCBiZWNhdXNlIGl0IGlzIHRoZSB3YXkgaXQgc2hvdWxkIGJlICEKKyAqLworc3RhdGljIGlubGluZSB2b2lkCittbWNfd3JpdGUodV9sb25nCWJhc2UsCisJICB1X2NoYXIJbywKKwkgIHVfY2hhciAqCWIsCisJICBpbnQJCW4pCit7CisgIG8gKz0gbjsKKyAgYiArPSBuOworCisgIHdoaWxlKG4tLSA+IDAgKQorICAgIG1tY19vdXQoYmFzZSwgLS1vLCAqKC0tYikpOworfSAvKiBtbWNfd3JpdGUgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgMSBieXRlIGZyb20gdGhlIE1NQy4KKyAqIE9wdGltaXNlZCB2ZXJzaW9uIGZvciAxIGJ5dGUsIGF2b2lkIHVzaW5nIG1lbW9yeS4uLgorICovCitzdGF0aWMgaW5saW5lIHVfY2hhcgorbW1jX2luKHVfbG9uZwliYXNlLAorICAgICAgIHVfc2hvcnQJbykKK3sKKyAgaW50IGNvdW50ID0gMDsKKworICB3aGlsZSgoY291bnQrKyA8IDEwMCkgJiYgKGluYihIQVNSKGJhc2UpKSAmIEhBU1JfTU1JX0JVU1kpKQorICAgIHVkZWxheSgxMCk7CisgIG91dGIobyA8PCAxLCBNTVIoYmFzZSkpOwkJLyogU2V0IHRoZSByZWFkIGFkZHJlc3MgKi8KKworICBvdXRiKDAsIE1NRChiYXNlKSk7CQkJLyogUmVxdWlyZWQgZHVtbXkgd3JpdGUgKi8KKworICB3aGlsZSgoY291bnQrKyA8IDEwMCkgJiYgKGluYihIQVNSKGJhc2UpKSAmIEhBU1JfTU1JX0JVU1kpKQorICAgIHVkZWxheSgxMCk7CisgIHJldHVybiAodV9jaGFyKSAoaW5iKE1NRChiYXNlKSkpOwkvKiBOb3cgZG8gdGhlIGFjdHVhbCByZWFkICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSb3V0aW5lIHRvIHJlYWQgYnl0ZXMgZnJvbSB0aGUgTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyLgorICogVGhlIGltcGxlbWVudGF0aW9uIGlzIGNvbXBsaWNhdGVkIGJ5IGEgbGFjayBvZiBhZGRyZXNzIGxpbmVzLAorICogd2hpY2ggcHJldmVudHMgZGVjb2Rpbmcgb2YgdGhlIGxvdy1vcmRlciBiaXQuCisgKiAoY29kZSBoYXMganVzdCBiZWVuIG1vdmVkIGluIHRoZSBhYm92ZSBmdW5jdGlvbikKKyAqIFdlIHN0YXJ0IGJ5IHRoZSBlbmQgYmVjYXVzZSBpdCBpcyB0aGUgd2F5IGl0IHNob3VsZCBiZSAhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbW1jX3JlYWQodV9sb25nCQliYXNlLAorCSB1X2NoYXIJCW8sCisJIHVfY2hhciAqCWIsCisJIGludAkJbikKK3sKKyAgbyArPSBuOworICBiICs9IG47CisKKyAgd2hpbGUobi0tID4gMCkKKyAgICAqKC0tYikgPSBtbWNfaW4oYmFzZSwgLS1vKTsKK30gLyogbW1jX3JlYWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEdldCB0aGUgdHlwZSBvZiBlbmNyeXB0aW9uIGF2YWlsYWJsZS4uLgorICovCitzdGF0aWMgaW5saW5lIGludAorbW1jX2VuY3IodV9sb25nCQliYXNlKQkvKiBpL28gcG9ydCBvZiB0aGUgY2FyZCAqLworeworICBpbnQJdGVtcDsKKworICB0ZW1wID0gbW1jX2luKGJhc2UsIG1tcm9mZigwLCBtbXJfZGVzX2F2YWlsKSk7CisgIGlmKCh0ZW1wICE9IE1NUl9ERVNfQVZBSUxfREVTKSAmJiAodGVtcCAhPSBNTVJfREVTX0FWQUlMX0FFUykpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gdGVtcDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdhaXQgZm9yIHRoZSBmcmVxdWVuY3kgRUVwcm9tIHRvIGNvbXBsZXRlIGEgY29tbWFuZC4uLgorICogSSBob3BlIHRoaXMgb25lIHdpbGwgYmUgb3B0aW1hbGx5IGlubGluZWQuLi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmZWVfd2FpdCh1X2xvbmcJCWJhc2UsCS8qIGkvbyBwb3J0IG9mIHRoZSBjYXJkICovCisJIGludAkJZGVsYXksCS8qIEJhc2UgZGVsYXkgdG8gd2FpdCBmb3IgKi8KKwkgaW50CQludW1iZXIpCS8qIE51bWJlciBvZiB0aW1lIHRvIHdhaXQgKi8KK3sKKyAgaW50CQljb3VudCA9IDA7CS8qIFdhaXQgb25seSBhIGxpbWl0ZWQgdGltZSAqLworCisgIHdoaWxlKChjb3VudCsrIDwgbnVtYmVyKSAmJgorCShtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJiBNTVJfRkVFX1NUQVRVU19CVVNZKSkKKyAgICB1ZGVsYXkoZGVsYXkpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCBieXRlcyBmcm9tIHRoZSBGcmVxdWVuY3kgRUVwcm9tIChmcmVxdWVuY3kgc2VsZWN0IGNhcmRzKS4KKyAqLworc3RhdGljIHZvaWQKK2ZlZV9yZWFkKHVfbG9uZwkJYmFzZSwJLyogaS9vIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkgdV9zaG9ydAlvLAkvKiBkZXN0aW5hdGlvbiBvZmZzZXQgKi8KKwkgdV9zaG9ydCAqCWIsCS8qIGRhdGEgYnVmZmVyICovCisJIGludAkJbikJLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworeworICBiICs9IG47CQkvKiBQb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhcmVhICovCisKKyAgLyogV3JpdGUgdGhlIGFkZHJlc3MgKi8KKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgbyArIG4gLSAxKTsKKworICAvKiBMb29wIG9uIGFsbCBidWZmZXIgKi8KKyAgd2hpbGUobi0tID4gMCkKKyAgICB7CisgICAgICAvKiBXcml0ZSB0aGUgcmVhZCBjb21tYW5kICovCisgICAgICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfUkVBRCk7CisKKyAgICAgIC8qIFdhaXQgdW50aWwgRUVwcm9tIGlzIHJlYWR5IChzaG91bGQgYmUgcXVpY2sgISkgKi8KKyAgICAgIGZlZV93YWl0KGJhc2UsIDEwLCAxMDApOworCisgICAgICAvKiBSZWFkIHRoZSB2YWx1ZSAqLworICAgICAgKi0tYiA9ICgobW1jX2luKGJhc2UsIG1tcm9mZigwLCBtbXJfZmVlX2RhdGFfaCkpIDw8IDgpIHwKKwkgICAgICBtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfZGF0YV9sKSkpOworICAgIH0KK30KKworI2lmZGVmIFdJUkVMRVNTX0VYVAkvKiBJZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3QgaW4gdGhlIGtlcm5lbCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV3JpdGUgYnl0ZXMgZnJvbSB0aGUgRnJlcXVlbmN5IEVFcHJvbSAoZnJlcXVlbmN5IHNlbGVjdCBjYXJkcykuCisgKiBUaGlzIGlzIGEgYml0IGNvbXBsaWNhdGVkLCBiZWNhdXNlIHRoZSBmcmVxdWVuY3kgZWVwcm9tIGhhcyB0bworICogYmUgdW5wcm90ZWN0ZWQgYW5kIHRoZSB3cml0ZSBlbmFibGVkLgorICogSmVhbiBJSQorICovCitzdGF0aWMgdm9pZAorZmVlX3dyaXRlKHVfbG9uZwliYXNlLAkvKiBpL28gcG9ydCBvZiB0aGUgY2FyZCAqLworCSAgdV9zaG9ydAlvLAkvKiBkZXN0aW5hdGlvbiBvZmZzZXQgKi8KKwkgIHVfc2hvcnQgKgliLAkvKiBkYXRhIGJ1ZmZlciAqLworCSAgaW50CQluKQkvKiBudW1iZXIgb2YgcmVnaXN0ZXJzICovCit7CisgIGIgKz0gbjsJCS8qIFBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGFyZWEgKi8KKworI2lmZGVmIEVFUFJPTV9JU19QUk9URUNURUQJLyogZGlzYWJsZWQgKi8KKyNpZmRlZiBET0VTTlRfU0VFTV9UT19XT1JLCS8qIGRpc2FibGVkICovCisgIC8qIEFzayB0byByZWFkIHRoZSBwcm90ZWN0ZWQgcmVnaXN0ZXIgKi8KKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSUkVBRCk7CisKKyAgZmVlX3dhaXQoYmFzZSwgMTAsIDEwMCk7CisKKyAgLyogUmVhZCB0aGUgcHJvdGVjdGVkIHJlZ2lzdGVyICovCisgIHByaW50aygiUHJvdGVjdGVkIDIgOiAlMDJYLSUwMlhcbiIsCisJIG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2ZlZV9kYXRhX2gpKSwKKwkgbW1jX2luKGJhc2UsIG1tcm9mZigwLCBtbXJfZmVlX2RhdGFfbCkpKTsKKyNlbmRpZgkvKiBET0VTTlRfU0VFTV9UT19XT1JLICovCisKKyAgLyogRW5hYmxlIHByb3RlY3RlZCByZWdpc3RlciAqLworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCBNTVdfRkVFX0FERFJfRU4pOworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfUFJFTik7CisKKyAgZmVlX3dhaXQoYmFzZSwgMTAsIDEwMCk7CisKKyAgLyogVW5wcm90ZWN0IGFyZWEgKi8KKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgbyArIG4pOworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfUFJXUklURSk7CisjaWZkZWYgRE9FU05UX1NFRU1fVE9fV09SSwkvKiBkaXNhYmxlZCAqLworICAvKiBPciB1c2UgOiAqLworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfUFJDTEVBUik7CisjZW5kaWYJLyogRE9FU05UX1NFRU1fVE9fV09SSyAqLworCisgIGZlZV93YWl0KGJhc2UsIDEwLCAxMDApOworI2VuZGlmCS8qIEVFUFJPTV9JU19QUk9URUNURUQgKi8KKworICAvKiBXcml0ZSBlbmFibGUgKi8KKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgTU1XX0ZFRV9BRERSX0VOKTsKKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1dSRU4pOworCisgIGZlZV93YWl0KGJhc2UsIDEwLCAxMDApOworCisgIC8qIFdyaXRlIHRoZSBFRXByb20gYWRkcmVzcyAqLworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCBvICsgbiAtIDEpOworCisgIC8qIExvb3Agb24gYWxsIGJ1ZmZlciAqLworICB3aGlsZShuLS0gPiAwKQorICAgIHsKKyAgICAgIC8qIFdyaXRlIHRoZSB2YWx1ZSAqLworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9kYXRhX2gpLCAoKi0tYikgPj4gOCk7CisgICAgICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2RhdGFfbCksICpiICYgMHhGRik7CisKKyAgICAgIC8qIFdyaXRlIHRoZSB3cml0ZSBjb21tYW5kICovCisgICAgICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfV1JJVEUpOworCisgICAgICAvKiBXYXZlbGFuIGRvYyBzYXlzIDogd2FpdCBhdCBsZWFzdCAxMCBtcyBmb3IgRUVCVVNZID0gMCAqLworICAgICAgbWRlbGF5KDEwKTsKKyAgICAgIGZlZV93YWl0KGJhc2UsIDEwLCAxMDApOworICAgIH0KKworICAvKiBXcml0ZSBkaXNhYmxlICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIE1NV19GRUVfQUREUl9EUyk7CisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9XRFMpOworCisgIGZlZV93YWl0KGJhc2UsIDEwLCAxMDApOworCisjaWZkZWYgRUVQUk9NX0lTX1BST1RFQ1RFRAkvKiBkaXNhYmxlZCAqLworICAvKiBSZXByb3RlY3QgRUVwcm9tICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIDB4MDApOworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfUFJXUklURSk7CisKKyAgZmVlX3dhaXQoYmFzZSwgMTAsIDEwMCk7CisjZW5kaWYJLyogRUVQUk9NX0lTX1BST1RFQ1RFRCAqLworfQorI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCAqLworCisvKioqKioqKioqKioqKioqKioqKiBXYXZlTEFOIFJvYW1pbmcgcm91dGluZXMuLi4gKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcJLyogQ29uZGl0aW9uYWwgY29tcGlsZSwgc2VlIHdhdmVsYW5fY3MuaCAqLworCit1bnNpZ25lZCBjaGFyIFdBVkVMQU5fQkVBQ09OX0FERFJFU1NbXT0gezB4MDksMHgwMCwweDBlLDB4MjAsMHgwMywweDAwfTsKKyAgCit2b2lkIHd2X3JvYW1faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBuZXRfbG9jYWwgICpscD0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAvKiBEbyBub3QgcmVtb3ZlIHRoaXMgdW5sZXNzIHlvdSBoYXZlIGEgZ29vZCByZWFzb24gKi8KKyAgcHJpbnRrKEtFUk5fTk9USUNFICIlczogV2FybmluZywgeW91IGhhdmUgZW5hYmxlZCByb2FtaW5nIG9uIgorCSAiIGRldmljZSAlcyAhXG4iLCBkZXYtPm5hbWUsIGRldi0+bmFtZSk7CisgIHByaW50ayhLRVJOX05PVElDRSAiUm9hbWluZyBpcyBjdXJyZW50bHkgYW4gZXhwZXJpbWVudGFsIHVuc3VwcG9ydGVkIGZlYXR1cmUiCisJICIgb2YgdGhlIFdhdmVsYW4gZHJpdmVyLlxuIik7CisgIHByaW50ayhLRVJOX05PVElDRSAiSXQgbWF5IHdvcmssIGJ1dCBtYXkgYWxzbyBtYWtlIHRoZSBkcml2ZXIgYmVoYXZlIGluIgorCSAiIGVycmF0aWMgd2F5cyBvciBjcmFzaC5cbiIpOworCisgIGxwLT53YXZlcG9pbnRfdGFibGUuaGVhZD1OVUxMOyAgICAgICAgICAgLyogSW5pdGlhbGlzZSBXYXZlUG9pbnQgdGFibGUgKi8KKyAgbHAtPndhdmVwb2ludF90YWJsZS5udW1fd2F2ZXBvaW50cz0wOworICBscC0+d2F2ZXBvaW50X3RhYmxlLmxvY2tlZD0wOworICBscC0+Y3Vycl9wb2ludD1OVUxMOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGRlZmF1bHQgV2F2ZVBvaW50ICovCisgIGxwLT5jZWxsX3NlYXJjaD0wOworICAKKyAgbHAtPmNlbGxfdGltZXIuZGF0YT0obG9uZylscDsgICAgICAgICAgICAgICAvKiBTdGFydCBjZWxsIGV4cGlyeSB0aW1lciAqLworICBscC0+Y2VsbF90aW1lci5mdW5jdGlvbj13bF9jZWxsX2V4cGlyeTsKKyAgbHAtPmNlbGxfdGltZXIuZXhwaXJlcz1qaWZmaWVzK0NFTExfVElNRU9VVDsKKyAgYWRkX3RpbWVyKCZscC0+Y2VsbF90aW1lcik7CisgIAorICB3dl9ud2lkX2ZpbHRlcihOV0lEX1BST01JU0MsbHApIDsgICAgLyogRW50ZXIgTldJRCBwcm9taXNjdW91cyBtb2RlICovCisgIC8qIHRvIGJ1aWxkIHVwIGEgZ29vZCBXYXZlUG9pbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWJsZS4uLiAqLworICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTjogUm9hbWluZyBlbmFibGVkIG9uIGRldmljZSAlc1xuIixkZXYtPm5hbWUpOworfQorIAordm9pZCB3dl9yb2FtX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgd2F2ZXBvaW50X2hpc3RvcnkgKnB0ciwqb2xkX3B0cjsKKyAgbmV0X2xvY2FsICpscD0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOOiBSb2FtaW5nIERpc2FibGVkIG9uIGRldmljZSAlc1xuIixkZXYtPm5hbWUpOworICAKKyAgLyogRml4bWUgOiBtYXliZSB3ZSBzaG91bGQgY2hlY2sgdGhhdCB0aGUgdGltZXIgZXhpc3QgYmVmb3JlIGRlbGV0aW5nIGl0ICovCisgIGRlbF90aW1lcigmbHAtPmNlbGxfdGltZXIpOyAgICAgICAgICAvKiBSZW1vdmUgY2VsbCBleHBpcnkgdGltZXIgICAgICAgKi8KKyAgcHRyPWxwLT53YXZlcG9pbnRfdGFibGUuaGVhZDsgICAgICAgIC8qIENsZWFyIGRldmljZSdzIFdhdmVQb2ludCB0YWJsZSAqLworICB3aGlsZShwdHIhPU5VTEwpCisgICAgeworICAgICAgb2xkX3B0cj1wdHI7CisgICAgICBwdHI9cHRyLT5uZXh0OwkKKyAgICAgIHdsX2RlbF93YXZlcG9pbnQob2xkX3B0cixscCk7CQorICAgIH0KK30KKworLyogRW5hYmxlL0Rpc2FibGUgTldJRCBwcm9taXNjdW91cyBtb2RlIG9uIGEgZ2l2ZW4gZGV2aWNlICovCit2b2lkIHd2X253aWRfZmlsdGVyKHVuc2lnbmVkIGNoYXIgbW9kZSwgbmV0X2xvY2FsICpscCkKK3sKKyAgbW1fdCAgICAgICAgICAgICAgICAgIG07CisgIHVuc2lnbmVkIGxvbmcgICAgICAgICBmbGFnczsKKyAgCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HX0RFQlVHCisgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOOiBOV0lEIHByb21pc2MgJXMsIGRldmljZSAlc1xuIiwobW9kZT09TldJRF9QUk9NSVNDKSA/ICJvbiIgOiAib2ZmIiwgbHAtPmRldi0+bmFtZSk7CisjZW5kaWYKKyAgCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAmIHNhdmUgZmxhZ3MgKi8KKyAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworICAKKyAgbS53Lm1td19sb29wdF9zZWwgPSAobW9kZT09TldJRF9QUk9NSVNDKSA/IE1NV19MT09QVF9TRUxfRElTX05XSUQgOiAweDAwOworICBtbWNfd3JpdGUobHAtPmRldi0+YmFzZV9hZGRyLCAoY2hhciAqKSZtLncubW13X2xvb3B0X3NlbCAtIChjaGFyICopJm0sICh1bnNpZ25lZCBjaGFyICopJm0udy5tbXdfbG9vcHRfc2VsLCAxKTsKKyAgCisgIGlmKG1vZGU9PU5XSURfUFJPTUlTQykKKyAgICBscC0+Y2VsbF9zZWFyY2g9MTsKKyAgZWxzZQorICAgIGxwLT5jZWxsX3NlYXJjaD0wOworCisgIC8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworfQorCisvKiBGaW5kIGEgcmVjb3JkIGluIHRoZSBXYXZlUG9pbnQgdGFibGUgbWF0Y2hpbmcgYSBnaXZlbiBOV0lEICovCit3YXZlcG9pbnRfaGlzdG9yeSAqd2xfcm9hbV9jaGVjayh1bnNpZ25lZCBzaG9ydCBud2lkLCBuZXRfbG9jYWwgKmxwKQoreworICB3YXZlcG9pbnRfaGlzdG9yeQkqcHRyPWxwLT53YXZlcG9pbnRfdGFibGUuaGVhZDsKKyAgCisgIHdoaWxlKHB0ciE9TlVMTCl7CisgICAgaWYocHRyLT5ud2lkPT1ud2lkKQorICAgICAgcmV0dXJuIHB0cjsJCisgICAgcHRyPXB0ci0+bmV4dDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyogQ3JlYXRlIGEgbmV3IHdhdmVwb2ludCB0YWJsZSBlbnRyeSAqLword2F2ZXBvaW50X2hpc3RvcnkgKndsX25ld193YXZlcG9pbnQodW5zaWduZWQgc2hvcnQgbndpZCwgdW5zaWduZWQgY2hhciBzZXEsIG5ldF9sb2NhbCogbHApCit7CisgIHdhdmVwb2ludF9oaXN0b3J5ICpuZXdfd2F2ZXBvaW50OworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HX0RFQlVHCQorICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTjogTmV3IFdhdmVwb2ludCwgTldJRDolLjRYXG4iLG53aWQpOworI2VuZGlmCisgIAorICBpZihscC0+d2F2ZXBvaW50X3RhYmxlLm51bV93YXZlcG9pbnRzPT1NQVhfV0FWRVBPSU5UUykKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIG5ld193YXZlcG9pbnQ9KHdhdmVwb2ludF9oaXN0b3J5ICopIGttYWxsb2Moc2l6ZW9mKHdhdmVwb2ludF9oaXN0b3J5KSxHRlBfQVRPTUlDKTsKKyAgaWYobmV3X3dhdmVwb2ludD09TlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgCisgIG5ld193YXZlcG9pbnQtPm53aWQ9bndpZDsgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBXYXZlUG9pbnRzIE5XSUQgKi8KKyAgbmV3X3dhdmVwb2ludC0+YXZlcmFnZV9mYXN0PTA7ICAgICAgICAgICAgICAgICAgICAvKiBSdW5uaW5nIEF2ZXJhZ2VzLi4qLworICBuZXdfd2F2ZXBvaW50LT5hdmVyYWdlX3Nsb3c9MDsKKyAgbmV3X3dhdmVwb2ludC0+cXVhbHB0cj0wOyAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhcnQgb2YgcmluZ2J1ZmZlciAqLworICBuZXdfd2F2ZXBvaW50LT5sYXN0X3NlcT1zZXEtMTsgICAgICAgICAgICAgICAgLyogTGFzdCBzZXF1ZW5jZSBuby5zZWVuICovCisgIG1lbXNldChuZXdfd2F2ZXBvaW50LT5zaWdxdWFsLDAsV0FWRVBPSU5UX0hJU1RPUlkpOy8qIEVtcHR5IHJpbmdidWZmZXIgKi8KKyAgCisgIG5ld193YXZlcG9pbnQtPm5leHQ9bHAtPndhdmVwb2ludF90YWJsZS5oZWFkOy8qIEFkZCB0byB3YXZlcG9pbnQgdGFibGUgKi8KKyAgbmV3X3dhdmVwb2ludC0+cHJldj1OVUxMOworICAKKyAgaWYobHAtPndhdmVwb2ludF90YWJsZS5oZWFkIT1OVUxMKQorICAgIGxwLT53YXZlcG9pbnRfdGFibGUuaGVhZC0+cHJldj1uZXdfd2F2ZXBvaW50OworICAKKyAgbHAtPndhdmVwb2ludF90YWJsZS5oZWFkPW5ld193YXZlcG9pbnQ7CisgIAorICBscC0+d2F2ZXBvaW50X3RhYmxlLm51bV93YXZlcG9pbnRzKys7ICAgICAvKiBuby4gb2YgdmlzaWJsZSB3YXZlcG9pbnRzICovCisgIAorICByZXR1cm4gbmV3X3dhdmVwb2ludDsKK30KKworLyogUmVtb3ZlIGEgd2F2ZXBvaW50IGVudHJ5IGZyb20gV2F2ZVBvaW50IHRhYmxlICovCit2b2lkIHdsX2RlbF93YXZlcG9pbnQod2F2ZXBvaW50X2hpc3RvcnkgKndhdmVwb2ludCwgc3RydWN0IG5ldF9sb2NhbCAqbHApCit7CisgIGlmKHdhdmVwb2ludD09TlVMTCkKKyAgICByZXR1cm47CisgIAorICBpZihscC0+Y3Vycl9wb2ludD09d2F2ZXBvaW50KQorICAgIGxwLT5jdXJyX3BvaW50PU5VTEw7CisgIAorICBpZih3YXZlcG9pbnQtPnByZXYhPU5VTEwpCisgICAgd2F2ZXBvaW50LT5wcmV2LT5uZXh0PXdhdmVwb2ludC0+bmV4dDsKKyAgCisgIGlmKHdhdmVwb2ludC0+bmV4dCE9TlVMTCkKKyAgICB3YXZlcG9pbnQtPm5leHQtPnByZXY9d2F2ZXBvaW50LT5wcmV2OworICAKKyAgaWYobHAtPndhdmVwb2ludF90YWJsZS5oZWFkPT13YXZlcG9pbnQpCisgICAgbHAtPndhdmVwb2ludF90YWJsZS5oZWFkPXdhdmVwb2ludC0+bmV4dDsKKyAgCisgIGxwLT53YXZlcG9pbnRfdGFibGUubnVtX3dhdmVwb2ludHMtLTsKKyAga2ZyZWUod2F2ZXBvaW50KTsKK30KKworLyogVGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gLSBjaGVja3MgV2F2ZVBvaW50IHRhYmxlIGZvciBzdGFsZSBlbnRyaWVzICovIAordm9pZCB3bF9jZWxsX2V4cGlyeSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisgIG5ldF9sb2NhbCAqbHA9KG5ldF9sb2NhbCAqKWRhdGE7CisgIHdhdmVwb2ludF9oaXN0b3J5ICp3YXZlcG9pbnQ9bHAtPndhdmVwb2ludF90YWJsZS5oZWFkLCpvbGRfcG9pbnQ7CisgIAorI2lmIFdBVkVMQU5fUk9BTUlOR19ERUJVRyA+IDEKKyAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU46IFdhdmVwb2ludCB0aW1lb3V0LCBkZXYgJXNcbiIsbHAtPmRldi0+bmFtZSk7CisjZW5kaWYKKyAgCisgIGlmKGxwLT53YXZlcG9pbnRfdGFibGUubG9ja2VkKQorICAgIHsKKyNpZiBXQVZFTEFOX1JPQU1JTkdfREVCVUcgPiAxCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTjogV2F2ZXBvaW50IHRhYmxlIGxvY2tlZC4uLlxuIik7CisjZW5kaWYKKyAgICAgIAorICAgICAgbHAtPmNlbGxfdGltZXIuZXhwaXJlcz1qaWZmaWVzKzE7IC8qIElmIHRhYmxlIGluIHVzZSwgY29tZSBiYWNrIGxhdGVyICovCisgICAgICBhZGRfdGltZXIoJmxwLT5jZWxsX3RpbWVyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIAorICB3aGlsZSh3YXZlcG9pbnQhPU5VTEwpCisgICAgeworICAgICAgaWYodGltZV9hZnRlcihqaWZmaWVzLCB3YXZlcG9pbnQtPmxhc3Rfc2VlbiArIENFTExfVElNRU9VVCkpCisJeworI2lmZGVmIFdBVkVMQU5fUk9BTUlOR19ERUJVRworCSAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU46IEJ5ZSBieWUgJS40WFxuIix3YXZlcG9pbnQtPm53aWQpOworI2VuZGlmCisJICAKKwkgIG9sZF9wb2ludD13YXZlcG9pbnQ7CisJICB3YXZlcG9pbnQ9d2F2ZXBvaW50LT5uZXh0OworCSAgd2xfZGVsX3dhdmVwb2ludChvbGRfcG9pbnQsbHApOworCX0KKyAgICAgIGVsc2UKKwl3YXZlcG9pbnQ9d2F2ZXBvaW50LT5uZXh0OworICAgIH0KKyAgbHAtPmNlbGxfdGltZXIuZXhwaXJlcz1qaWZmaWVzK0NFTExfVElNRU9VVDsKKyAgYWRkX3RpbWVyKCZscC0+Y2VsbF90aW1lcik7Cit9CisKKy8qIFVwZGF0ZSBTTlIgaGlzdG9yeSBvZiBhIHdhdmVwb2ludCAqLwordm9pZCB3bF91cGRhdGVfaGlzdG9yeSh3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50LCB1bnNpZ25lZCBjaGFyIHNpZ3F1YWwsIHVuc2lnbmVkIGNoYXIgc2VxKQkKK3sKKyAgaW50IGk9MCxudW1fbWlzc2VkPTAscHRyPTA7CisgIGludCBhdmVyYWdlX2Zhc3Q9MCxhdmVyYWdlX3Nsb3c9MDsKKyAgCisgIG51bV9taXNzZWQ9KHNlcS13YXZlcG9pbnQtPmxhc3Rfc2VxKSVXQVZFUE9JTlRfSElTVE9SWTsvKiBIYXZlIHdlIG1pc3NlZAorCQkJCQkJCSAgICBhbnkgYmVhY29ucz8gKi8KKyAgaWYobnVtX21pc3NlZCkKKyAgICBmb3IoaT0wO2k8bnVtX21pc3NlZDtpKyspCisgICAgICB7CisJd2F2ZXBvaW50LT5zaWdxdWFsW3dhdmVwb2ludC0+cXVhbHB0cisrXT0wOyAvKiBJZiBzbywgZW50ZXIgdGhlbSBhcyAwJ3MgKi8KKwl3YXZlcG9pbnQtPnF1YWxwdHIgJT1XQVZFUE9JTlRfSElTVE9SWTsgICAgLyogaW4gdGhlIHJpbmdidWZmZXIuICovCisgICAgICB9CisgIHdhdmVwb2ludC0+bGFzdF9zZWVuPWppZmZpZXM7ICAgICAgICAgICAgICAgICAvKiBBZGQgYmVhY29uIHRvIGhpc3RvcnkgKi8KKyAgd2F2ZXBvaW50LT5sYXN0X3NlcT1zZXE7CQorICB3YXZlcG9pbnQtPnNpZ3F1YWxbd2F2ZXBvaW50LT5xdWFscHRyKytdPXNpZ3F1YWw7ICAgICAgICAgIAorICB3YXZlcG9pbnQtPnF1YWxwdHIgJT1XQVZFUE9JTlRfSElTVE9SWTsKKyAgcHRyPSh3YXZlcG9pbnQtPnF1YWxwdHItV0FWRVBPSU5UX0ZBU1RfSElTVE9SWStXQVZFUE9JTlRfSElTVE9SWSklV0FWRVBPSU5UX0hJU1RPUlk7CisgIAorICBmb3IoaT0wO2k8V0FWRVBPSU5UX0ZBU1RfSElTVE9SWTtpKyspICAgICAgIC8qIFVwZGF0ZSBydW5uaW5nIGF2ZXJhZ2VzICovCisgICAgeworICAgICAgYXZlcmFnZV9mYXN0Kz13YXZlcG9pbnQtPnNpZ3F1YWxbcHRyKytdOworICAgICAgcHRyICU9V0FWRVBPSU5UX0hJU1RPUlk7CisgICAgfQorICAKKyAgYXZlcmFnZV9zbG93PWF2ZXJhZ2VfZmFzdDsKKyAgZm9yKGk9V0FWRVBPSU5UX0ZBU1RfSElTVE9SWTtpPFdBVkVQT0lOVF9ISVNUT1JZO2krKykKKyAgICB7CisgICAgICBhdmVyYWdlX3Nsb3crPXdhdmVwb2ludC0+c2lncXVhbFtwdHIrK107CisgICAgICBwdHIgJT1XQVZFUE9JTlRfSElTVE9SWTsKKyAgICB9CisgIAorICB3YXZlcG9pbnQtPmF2ZXJhZ2VfZmFzdD1hdmVyYWdlX2Zhc3QvV0FWRVBPSU5UX0ZBU1RfSElTVE9SWTsKKyAgd2F2ZXBvaW50LT5hdmVyYWdlX3Nsb3c9YXZlcmFnZV9zbG93L1dBVkVQT0lOVF9ISVNUT1JZOwkKK30KKworLyogUGVyZm9ybSBhIGhhbmRvdmVyIHRvIGEgbmV3IFdhdmVQb2ludCAqLwordm9pZCB3dl9yb2FtX2hhbmRvdmVyKHdhdmVwb2ludF9oaXN0b3J5ICp3YXZlcG9pbnQsIG5ldF9sb2NhbCAqbHApCit7CisgIGtpb19hZGRyX3QJCWJhc2UgPSBscC0+ZGV2LT5iYXNlX2FkZHI7CisgIG1tX3QgICAgICAgICAgICAgICAgICBtOworICB1bnNpZ25lZCBsb25nICAgICAgICAgZmxhZ3M7CisKKyAgaWYod2F2ZXBvaW50PT1scC0+Y3Vycl9wb2ludCkgICAgICAgICAgLyogU2FuaXR5IGNoZWNrLi4uICovCisgICAgeworICAgICAgd3ZfbndpZF9maWx0ZXIoIU5XSURfUFJPTUlTQyxscCk7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkdfREVCVUcKKyAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU46IERvaW5nIGhhbmRvdmVyIHRvICUuNFgsIGRldiAlc1xuIix3YXZlcG9pbnQtPm53aWQsbHAtPmRldi0+bmFtZSk7CisjZW5kaWYKKyAJCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAmIHNhdmUgZmxhZ3MgKi8KKyAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIG0udy5tbXdfbmV0d19pZF9sID0gd2F2ZXBvaW50LT5ud2lkICYgMHhGRjsKKyAgbS53Lm1td19uZXR3X2lkX2ggPSAod2F2ZXBvaW50LT5ud2lkICYgMHhGRjAwKSA+PiA4OworICAKKyAgbW1jX3dyaXRlKGJhc2UsIChjaGFyICopJm0udy5tbXdfbmV0d19pZF9sIC0gKGNoYXIgKikmbSwgKHVuc2lnbmVkIGNoYXIgKikmbS53Lm1td19uZXR3X2lkX2wsIDIpOworICAKKyAgLyogUmVFbmFibGUgaW50ZXJydXB0cyAmIHJlc3RvcmUgZmxhZ3MgKi8KKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgd3ZfbndpZF9maWx0ZXIoIU5XSURfUFJPTUlTQyxscCk7CisgIGxwLT5jdXJyX3BvaW50PXdhdmVwb2ludDsKK30KKworLyogQ2FsbGVkIHdoZW4gYSBXYXZlUG9pbnQgYmVhY29uIGlzIHJlY2VpdmVkICovCitzdGF0aWMgaW5saW5lIHZvaWQgd2xfcm9hbV9nYXRoZXIoc3RydWN0IG5ldF9kZXZpY2UgKiAgZGV2LAorCQkJCSAgdV9jaGFyICogIGhkciwgICAvKiBCZWFjb24gaGVhZGVyICovCisJCQkJICB1X2NoYXIgKiAgc3RhdHMpIC8qIFNOUiwgU2lnbmFsIHF1YWxpdHkgCisJCQkJCQkgICAgICBvZiBwYWNrZXQgKi8KK3sKKyAgd2F2ZXBvaW50X2JlYWNvbiAqYmVhY29uPSAod2F2ZXBvaW50X2JlYWNvbiAqKWhkcjsgLyogUmN2ZC4gQmVhY29uICovCisgIHVuc2lnbmVkIHNob3J0IG53aWQ9bnRvaHMoYmVhY29uLT5ud2lkKTsgIAorICB1bnNpZ25lZCBzaG9ydCBzaWdxdWFsPXN0YXRzWzJdICYgTU1SX1NHTkxfUVVBTDsgICAvKiBTTlIgb2YgYmVhY29uICovCisgIHdhdmVwb2ludF9oaXN0b3J5ICp3YXZlcG9pbnQ9TlVMTDsgICAgICAgICAgICAgICAgLyogV2F2ZVBvaW50IHRhYmxlIGVudHJ5ICovCisgIG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOyAgICAgICAgICAgICAgLyogRGV2aWNlIGluZm8gKi8KKworI2lmZGVmIElfTkVFRF9USElTX0ZFQVRVUkUKKyAgLyogU29tZSBwZW9wbGUgZG9uJ3QgbmVlZCB0aGlzLCBzb21lIG90aGVyIG1heSBuZWVkIGl0ICovCisgIG53aWQ9bndpZF5udG9ocyhiZWFjb24tPmRvbWFpbl9pZCk7CisjZW5kaWYKKworI2lmIFdBVkVMQU5fUk9BTUlOR19ERUJVRyA+IDEKKyAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU46IGJlYWNvbiwgZGV2ICVzOlxuIixkZXYtPm5hbWUpOworICBwcmludGsoS0VSTl9ERUJVRyAiRG9tYWluOiAlLjRYIE5XSUQ6ICUuNFggU2lnUXVhbD0lZFxuIixudG9ocyhiZWFjb24tPmRvbWFpbl9pZCksbndpZCxzaWdxdWFsKTsKKyNlbmRpZgorICAKKyAgbHAtPndhdmVwb2ludF90YWJsZS5sb2NrZWQ9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPE11dGV4PiAqLworICAKKyAgd2F2ZXBvaW50PXdsX3JvYW1fY2hlY2sobndpZCxscCk7ICAgICAgICAgICAgLyogRmluZCBXYXZlUG9pbnQgdGFibGUgZW50cnkgKi8KKyAgaWYod2F2ZXBvaW50PT1OVUxMKSAgICAgICAgICAgICAgICAgICAgLyogSWYgbm8gZW50cnksIENyZWF0ZSBhIG5ldyBvbmUuLi4gKi8KKyAgICB7CisgICAgICB3YXZlcG9pbnQ9d2xfbmV3X3dhdmVwb2ludChud2lkLGJlYWNvbi0+c2VxLGxwKTsKKyAgICAgIGlmKHdhdmVwb2ludD09TlVMTCkKKwlnb3RvIG91dDsKKyAgICB9CisgIGlmKGxwLT5jdXJyX3BvaW50PT1OVUxMKSAgICAgICAgICAgICAvKiBJZiB0aGlzIGlzIHRoZSBvbmx5IFdhdmVQb2ludCwgKi8KKyAgICB3dl9yb2FtX2hhbmRvdmVyKHdhdmVwb2ludCwgbHApOwkgICAgICAgICAvKiBKdW1wIG9uIGl0ISAqLworICAKKyAgd2xfdXBkYXRlX2hpc3Rvcnkod2F2ZXBvaW50LCBzaWdxdWFsLCBiZWFjb24tPnNlcSk7IC8qIFVwZGF0ZSBTTlIgaGlzdG9yeQorCQkJCQkJCSBzdGF0cy4gKi8KKyAgCisgIGlmKGxwLT5jdXJyX3BvaW50LT5hdmVyYWdlX3Nsb3cgPCBTRUFSQ0hfVEhSRVNIX0xPVykgLyogSWYgb3VyIGN1cnJlbnQgKi8KKyAgICBpZighbHAtPmNlbGxfc2VhcmNoKSAgICAgICAgICAgICAgICAgIC8qIFdhdmVQb2ludCBpcyBnZXR0aW5nIGZhaW50LCAqLworICAgICAgd3ZfbndpZF9maWx0ZXIoTldJRF9QUk9NSVNDLGxwKTsgICAgLyogc3RhcnQgbG9va2luZyBmb3IgYSBuZXcgb25lICovCisgIAorICBpZih3YXZlcG9pbnQtPmF2ZXJhZ2Vfc2xvdyA+IAorICAgICBscC0+Y3Vycl9wb2ludC0+YXZlcmFnZV9zbG93ICsgV0FWRUxBTl9ST0FNSU5HX0RFTFRBKQorICAgIHd2X3JvYW1faGFuZG92ZXIod2F2ZXBvaW50LCBscCk7ICAgLyogSGFuZG92ZXIgdG8gYSBiZXR0ZXIgV2F2ZVBvaW50ICovCisgIAorICBpZihscC0+Y3Vycl9wb2ludC0+YXZlcmFnZV9zbG93ID4gU0VBUkNIX1RIUkVTSF9ISUdIKSAvKiBJZiBvdXIgU05SIGlzICovCisgICAgaWYobHAtPmNlbGxfc2VhcmNoKSAgLyogZ2V0dGluZyBiZXR0ZXIsIGRyb3Agb3V0IG9mIGNlbGwgc2VhcmNoIG1vZGUgKi8KKyAgICAgIHd2X253aWRfZmlsdGVyKCFOV0lEX1BST01JU0MsbHApOworICAKK291dDoKKyAgbHAtPndhdmVwb2ludF90YWJsZS5sb2NrZWQ9MDsgICAgICAgICAgICAgICAgICAgICAgICAvKiA8L01VVEVYPiAgIDotKSAqLworfQorCisvKiBUZXN0IHRoaXMgTUFDIGZyYW1lIGEgV2F2ZVBvaW50IGJlYWNvbiAqLworc3RhdGljIGlubGluZSBpbnQgV0FWRUxBTl9CRUFDT04odW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKyAgd2F2ZXBvaW50X2JlYWNvbiAqYmVhY29uPSAod2F2ZXBvaW50X2JlYWNvbiAqKWRhdGE7CisgIHN0YXRpYyB3YXZlcG9pbnRfYmVhY29uIGJlYWNvbl90ZW1wbGF0ZT17MHhhYSwweGFhLDB4MDMsMHgwOCwweDAwLDB4MGUsMHgyMCwweDAzLDB4MDB9OworICAKKyAgaWYobWVtY21wKGJlYWNvbiwmYmVhY29uX3RlbXBsYXRlLDkpPT0wKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogSTgyNTkzIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVXNlZnVsIHN1YnJvdXRpbmVzIHRvIG1hbmFnZSB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSb3V0aW5lIHRvIHN5bmNocm9ub3VzbHkgc2VuZCBhIGNvbW1hbmQgdG8gdGhlIGk4MjU5MyBjaGlwLiAKKyAqIFNob3VsZCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICogKGNhbGxlZCBieSB3dl9wYWNrZXRfd3JpdGUoKSwgd3ZfcnVfc3RvcCgpLCB3dl9ydV9zdGFydCgpLAorICogIHd2XzgyNTkzX2NvbmZpZygpICYgd3ZfZGlhZygpKQorICovCitzdGF0aWMgaW50Cit3dl84MjU5M19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJICAgICBjaGFyICoJc3RyLAorCSAgICAgaW50CWNtZCwKKwkgICAgIGludAlyZXN1bHQpCit7CisgIGtpb19hZGRyX3QJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICBpbnQJCXN0YXR1czsKKyAgaW50CQl3YWl0X2NvbXBsZXRlZDsKKyAgbG9uZwkJc3BpbjsKKworICAvKiBTcGluIHVudGlsIHRoZSBjaGlwIGZpbmlzaGVzIGV4ZWN1dGluZyBpdHMgY3VycmVudCBjb21tYW5kIChpZiBhbnkpICovCisgIHNwaW4gPSAxMDAwOworICBkbworICAgIHsKKyAgICAgIC8qIFRpbWUgY2FsaWJyYXRpb24gb2YgdGhlIGxvb3AgKi8KKyAgICAgIHVkZWxheSgxMCk7CisKKyAgICAgIC8qIFJlYWQgdGhlIGludGVycnVwdCByZWdpc3RlciAqLworICAgICAgb3V0YihPUDBfTk9QIHwgQ1IwX1NUQVRVU18zLCBMQ0NSKGJhc2UpKTsKKyAgICAgIHN0YXR1cyA9IGluYihMQ1NSKGJhc2UpKTsKKyAgICB9CisgIHdoaWxlKCgoc3RhdHVzICYgU1IzX0VYRUNfU1RBVEVfTUFTSykgIT0gU1IzX0VYRUNfSURMRSkgJiYgKHNwaW4tLSA+IDApKTsKKworICAvKiBJZiB0aGUgaW50ZXJydXB0IGhhc24ndCBiZSBwb3N0ZWQgKi8KKyAgaWYoc3BpbiA8PSAwKQorICAgIHsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKyAgICAgIHByaW50ayhLRVJOX0lORk8gInd2XzgyNTkzX2NtZDogJXMgdGltZW91dCAocHJldmlvdXMgY29tbWFuZCksIHN0YXR1cyAweCUwMnhcbiIsCisJICAgICBzdHIsIHN0YXR1cyk7CisjZW5kaWYKKyAgICAgIHJldHVybihGQUxTRSk7CisgICAgfQorCisgIC8qIElzc3VlIHRoZSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyICovCisgIG91dGIoY21kLCBMQ0NSKGJhc2UpKTsKKworICAvKiBJZiB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIHRoZSByZXN1bHQgb2YgdGhlIGNvbW1hbmQKKyAgICogTm90ZSA6IHRoaXMgbWVhbiB0aGF0IHRoZSBpcnEgaGFuZGxlciB3aWxsIGRlYWwgd2l0aCB0aGF0ICovCisgIGlmKHJlc3VsdCA9PSBTUjBfTk9fUkVTVUxUKQorICAgIHJldHVybihUUlVFKTsKKworICAvKiBXZSBhcmUgd2FpdGluZyBmb3IgY29tbWFuZCBjb21wbGV0aW9uICovCisgIHdhaXRfY29tcGxldGVkID0gVFJVRTsKKworICAvKiBCdXN5IHdhaXQgd2hpbGUgdGhlIExBTiBjb250cm9sbGVyIGV4ZWN1dGVzIHRoZSBjb21tYW5kLiAqLworICBzcGluID0gMTAwMDsKKyAgZG8KKyAgICB7CisgICAgICAvKiBUaW1lIGNhbGlicmF0aW9uIG9mIHRoZSBsb29wICovCisgICAgICB1ZGVsYXkoMTApOworCisgICAgICAvKiBSZWFkIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKyAgICAgIG91dGIoQ1IwX1NUQVRVU18wIHwgT1AwX05PUCwgTENDUihiYXNlKSk7CisgICAgICBzdGF0dXMgPSBpbmIoTENTUihiYXNlKSk7CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZXJlIHdhcyBhbiBpbnRlcnJ1cHQgcG9zdGVkICovCisgICAgICBpZigoc3RhdHVzICYgU1IwX0lOVEVSUlVQVCkpCisJeworCSAgLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCAqLworCSAgb3V0YihDUjBfSU5UX0FDSyB8IE9QMF9OT1AsIExDQ1IoYmFzZSkpOworCisJICAvKiBDaGVjayBpZiBpbnRlcnJ1cHQgaXMgYSBjb21tYW5kIGNvbXBsZXRpb24gKi8KKwkgIGlmKCgoc3RhdHVzICYgU1IwX0JPVEhfUlhfVFgpICE9IFNSMF9CT1RIX1JYX1RYKSAmJgorCSAgICAgKChzdGF0dXMgJiBTUjBfQk9USF9SWF9UWCkgIT0gMHgwKSAmJgorCSAgICAgIShzdGF0dXMgJiBTUjBfUkVDRVBUSU9OKSkKKwkgICAgeworCSAgICAgIC8qIFNpZ25hbCBjb21tYW5kIGNvbXBsZXRpb24gKi8KKwkgICAgICB3YWl0X2NvbXBsZXRlZCA9IEZBTFNFOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBOb3RlIDogUnggaW50ZXJydXB0cyB3aWxsIGJlIGhhbmRsZWQgbGF0ZXIsIGJlY2F1c2Ugd2UgY2FuCisJICAgICAgICogaGFuZGxlIG11bHRpcGxlIFJ4IHBhY2tldHMgYXQgb25jZSAqLworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9JTkZPCisJICAgICAgcHJpbnRrKEtFUk5fSU5GTyAid3ZfODI1OTNfY21kOiBub3Qgb3VyIGludGVycnVwdFxuIik7CisjZW5kaWYKKwkgICAgfQorCX0KKyAgICB9CisgIHdoaWxlKHdhaXRfY29tcGxldGVkICYmIChzcGluLS0gPiAwKSk7CisKKyAgLyogSWYgdGhlIGludGVycnVwdCBoYXNuJ3QgYmUgcG9zdGVkICovCisgIGlmKHdhaXRfY29tcGxldGVkKQorICAgIHsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKyAgICAgIHByaW50ayhLRVJOX0lORk8gInd2XzgyNTkzX2NtZDogJXMgdGltZW91dCwgc3RhdHVzIDB4JTAyeFxuIiwKKwkgICAgIHN0ciwgc3RhdHVzKTsKKyNlbmRpZgorICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICB9CisKKyAgLyogQ2hlY2sgdGhlIHJldHVybiBjb2RlIHJldHVybmVkIGJ5IHRoZSBjYXJkIChzZWUgYWJvdmUpIGFnYWluc3QKKyAgICogdGhlIGV4cGVjdGVkIHJldHVybiBjb2RlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIgKi8KKyAgaWYoKHN0YXR1cyAmIFNSMF9FVkVOVF9NQVNLKSAhPSByZXN1bHQpCisgICAgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorICAgICAgcHJpbnRrKEtFUk5fSU5GTyAid3ZfODI1OTNfY21kOiAlcyBmYWlsZWQsIHN0YXR1cyA9IDB4JXhcbiIsCisJICAgICBzdHIsIHN0YXR1cyk7CisjZW5kaWYKKyAgICAgIHJldHVybihGQUxTRSk7CisgICAgfQorCisgIHJldHVybihUUlVFKTsKK30gLyogd3ZfODI1OTNfY21kICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgZG9lcyBhIDU5MyBvcC1jb2RlIG51bWJlciA3LCBhbmQgb2J0YWlucyB0aGUgZGlhZ25vc2UKKyAqIHN0YXR1cyBmb3IgdGhlIFdhdmVMQU4uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit3dl9kaWFnKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBpbnQJCXJldCA9IEZBTFNFOworCisgIGlmKHd2XzgyNTkzX2NtZChkZXYsICJ3dl9kaWFnKCk6IGRpYWdub3NlIiwKKwkJICBPUDBfRElBR05PU0UsIFNSMF9ESUFHTk9TRV9QQVNTRUQpKQorICAgIHJldCA9IFRSVUU7CisKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisgIHByaW50ayhLRVJOX0lORk8gIndhdmVsYW5fY3M6IGk4MjU5MyBTZWxmIFRlc3QgZmFpbGVkIVxuIik7CisjZW5kaWYKKyAgcmV0dXJuKHJldCk7Cit9IC8qIHd2X2RpYWcgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJvdXRpbmUgdG8gcmVhZCBsZW4gYnl0ZXMgZnJvbSB0aGUgaTgyNTkzJ3MgcmluZyBidWZmZXIsIHN0YXJ0aW5nIGF0CisgKiBjaGlwIGFkZHJlc3MgYWRkci4gVGhlIHJlc3VsdHMgcmVhZCBmcm9tIHRoZSBjaGlwIGFyZSBzdG9yZWQgaW4gYnVmLgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgYWRkcmVzcyB0byB1c2UgZm9yIG5leHQgdGhlIGNhbGwuCisgKi8KK3N0YXRpYyBpbnQKK3JlYWRfcmluZ2J1ZihzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkgICAgIGludAlhZGRyLAorCSAgICAgY2hhciAqCWJ1ZiwKKwkgICAgIGludAlsZW4pCit7CisgIGtpb19hZGRyX3QJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICBpbnQJCXJpbmdfcHRyID0gYWRkcjsKKyAgaW50CQljaHVua19sZW47CisgIGNoYXIgKglidWZfcHRyID0gYnVmOworCisgIC8qIEdldCBhbGwgdGhlIGJ1ZmZlciAqLworICB3aGlsZShsZW4gPiAwKQorICAgIHsKKyAgICAgIC8qIFBvc2l0aW9uIHRoZSBQcm9ncmFtIEkvTyBSZWdpc3RlciBhdCB0aGUgcmluZyBidWZmZXIgcG9pbnRlciAqLworICAgICAgb3V0YihyaW5nX3B0ciAmIDB4ZmYsIFBJT1JMKGJhc2UpKTsKKyAgICAgIG91dGIoKChyaW5nX3B0ciA+PiA4KSAmIFBJT1JIX01BU0spLCBQSU9SSChiYXNlKSk7CisKKyAgICAgIC8qIEZpcnN0LCBkZXRlcm1pbmUgaG93IG11Y2ggd2UgY2FuIHJlYWQgd2l0aG91dCB3cmFwcGluZyBhcm91bmQgdGhlCisJIHJpbmcgYnVmZmVyICovCisgICAgICBpZigoYWRkciArIGxlbikgPCAoUlhfQkFTRSArIFJYX1NJWkUpKQorCWNodW5rX2xlbiA9IGxlbjsKKyAgICAgIGVsc2UKKwljaHVua19sZW4gPSBSWF9CQVNFICsgUlhfU0laRSAtIGFkZHI7CisgICAgICBpbnNiKFBJT1AoYmFzZSksIGJ1Zl9wdHIsIGNodW5rX2xlbik7CisgICAgICBidWZfcHRyICs9IGNodW5rX2xlbjsKKyAgICAgIGxlbiAtPSBjaHVua19sZW47CisgICAgICByaW5nX3B0ciA9IChyaW5nX3B0ciAtIFJYX0JBU0UgKyBjaHVua19sZW4pICUgUlhfU0laRSArIFJYX0JBU0U7CisgICAgfQorICByZXR1cm4ocmluZ19wdHIpOworfSAvKiByZWFkX3JpbmdidWYgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlY29uZmlndXJlIHRoZSBpODI1OTMsIG9yIGF0IGxlYXN0IGFzayBmb3IgaXQuLi4KKyAqIEJlY2F1c2Ugd3ZfODI1OTNfY29uZmlnIHVzZSB0aGUgdHJhbnNtaXNzaW9uIGJ1ZmZlciwgd2UgbXVzdCBkbyBpdAorICogd2hlbiB3ZSBhcmUgc3VyZSB0aGF0IHRoZXJlIGlzIG5vIHRyYW5zbWlzc2lvbiwgc28gd2UgZG8gaXQgbm93CisgKiBvciBpbiB3YXZlbGFuX3BhY2tldF94bWl0KCkgKEkgY2FuJ3QgZmluZCBhbnkgYmV0dGVyIHBsYWNlLAorICogd2F2ZWxhbl9pbnRlcnJ1cHQgaXMgbm90IGFuIG9wdGlvbi4uLiksIHNvIHlvdSBtYXkgZXhwZXJpZW5jZQorICogc29tZSBkZWxheSBzb21ldGltZS4uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3d2XzgyNTkzX3JlY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBuZXRfbG9jYWwgKgkJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBkZXZfbGlua190ICoJCWxpbmsgPSBscC0+bGluazsKKyAgdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKyAgLyogQXJtIHRoZSBmbGFnLCB3aWxsIGJlIGNsZWFyZCBpbiB3dl84MjU5M19jb25maWcoKSAqLworICBscC0+cmVjb25maWdfODI1OTMgPSBUUlVFOworCisgIC8qIENoZWNrIGlmIHdlIGNhbiBkbyBpdCBub3cgISAqLworICBpZigobGluay0+b3BlbikgJiYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgJiYgIShuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpKQorICAgIHsKKyAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisgICAgICB3dl84MjU5M19jb25maWcoZGV2KTsKKyAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOwkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisgICAgICBwcmludGsoS0VSTl9ERUJVRworCSAgICAgIiVzOiB3dl84MjU5M19yZWNvbmZpZygpOiBkZWxheWVkIChzdGF0ZSA9ICVsWCwgbGluayA9ICVkKVxuIiwKKwkgICAgIGRldi0+bmFtZSwgZGV2LT5zdGF0ZSwgbGluay0+b3Blbik7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKiogREVCVUcgJiBJTkZPIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIHJvdXRpbmVzIGFyZSB1c2VkIGluIHRoZSBjb2RlIHRvIHNob3cgZGVidWcgaW5mb3JtYXRpb25zLgorICogTW9zdCBvZiB0aGUgdGltZSwgaXQgZHVtcCB0aGUgY29udGVudCBvZiBoYXJkd2FyZSBzdHJ1Y3R1cmVzLi4uCisgKi8KKworI2lmZGVmIERFQlVHX1BTQV9TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBjb250ZW50cyBvZiB0aGUgUGFyYW1ldGVyIFN0b3JhZ2UgQXJlYS4KKyAqLworc3RhdGljIHZvaWQKK3d2X3BzYV9zaG93KHBzYV90ICoJcCkKK3sKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiMjIyMjIHdhdmVsYW4gcHNhIGNvbnRlbnRzOiAjIyMjI1xuIik7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfaW9fYmFzZV9hZGRyXzE6IDB4JTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkgcC0+cHNhX2lvX2Jhc2VfYWRkcl8xLAorCSBwLT5wc2FfaW9fYmFzZV9hZGRyXzIsCisJIHAtPnBzYV9pb19iYXNlX2FkZHJfMywKKwkgcC0+cHNhX2lvX2Jhc2VfYWRkcl80KTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9yZW1fYm9vdF9hZGRyXzE6IDB4JTAyWCAlMDJYICUwMlhcbiIsCisJIHAtPnBzYV9yZW1fYm9vdF9hZGRyXzEsCisJIHAtPnBzYV9yZW1fYm9vdF9hZGRyXzIsCisJIHAtPnBzYV9yZW1fYm9vdF9hZGRyXzMpOworICBwcmludGsoS0VSTl9ERUJVRyAicHNhX2hvbGlfcGFyYW1zOiAweCUwMngsICIsIHAtPnBzYV9ob2xpX3BhcmFtcyk7CisgIHByaW50aygicHNhX2ludF9yZXFfbm86ICVkXG4iLCBwLT5wc2FfaW50X3JlcV9ubyk7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV91bnVzZWQwW106ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJIHAtPnBzYV91bnVzZWQwWzBdLAorCSBwLT5wc2FfdW51c2VkMFsxXSwKKwkgcC0+cHNhX3VudXNlZDBbMl0sCisJIHAtPnBzYV91bnVzZWQwWzNdLAorCSBwLT5wc2FfdW51c2VkMFs0XSwKKwkgcC0+cHNhX3VudXNlZDBbNV0sCisJIHAtPnBzYV91bnVzZWQwWzZdKTsKKyNlbmRpZgkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworICBwcmludGsoS0VSTl9ERUJVRyAicHNhX3VuaXZfbWFjX2FkZHJbXTogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJIHAtPnBzYV91bml2X21hY19hZGRyWzBdLAorCSBwLT5wc2FfdW5pdl9tYWNfYWRkclsxXSwKKwkgcC0+cHNhX3VuaXZfbWFjX2FkZHJbMl0sCisJIHAtPnBzYV91bml2X21hY19hZGRyWzNdLAorCSBwLT5wc2FfdW5pdl9tYWNfYWRkcls0XSwKKwkgcC0+cHNhX3VuaXZfbWFjX2FkZHJbNV0pOworICBwcmludGsoS0VSTl9ERUJVRyAicHNhX2xvY2FsX21hY19hZGRyW106ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbMF0sCisJIHAtPnBzYV9sb2NhbF9tYWNfYWRkclsxXSwKKwkgcC0+cHNhX2xvY2FsX21hY19hZGRyWzJdLAorCSBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbM10sCisJIHAtPnBzYV9sb2NhbF9tYWNfYWRkcls0XSwKKwkgcC0+cHNhX2xvY2FsX21hY19hZGRyWzVdKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV91bml2X2xvY2FsX3NlbDogJWQsICIsIHAtPnBzYV91bml2X2xvY2FsX3NlbCk7CisgIHByaW50aygicHNhX2NvbXBfbnVtYmVyOiAlZCwgIiwgcC0+cHNhX2NvbXBfbnVtYmVyKTsKKyAgcHJpbnRrKCJwc2FfdGhyX3ByZV9zZXQ6IDB4JTAyeFxuIiwgcC0+cHNhX3Rocl9wcmVfc2V0KTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9mZWF0dXJlX3NlbGVjdC9kZWNheV9wcm06IDB4JTAyeCwgIiwKKwkgcC0+cHNhX2ZlYXR1cmVfc2VsZWN0KTsKKyAgcHJpbnRrKCJwc2Ffc3ViYmFuZC9kZWNheV91cGRhdGVfcHJtOiAlZFxuIiwgcC0+cHNhX3N1YmJhbmQpOworICBwcmludGsoS0VSTl9ERUJVRyAicHNhX3F1YWxpdHlfdGhyOiAweCUwMngsICIsIHAtPnBzYV9xdWFsaXR5X3Rocik7CisgIHByaW50aygicHNhX21vZF9kZWxheTogMHglMDJ4XG4iLCBwLT5wc2FfbW9kX2RlbGF5KTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9ud2lkOiAweCUwMnglMDJ4LCAiLCBwLT5wc2FfbndpZFswXSwgcC0+cHNhX253aWRbMV0pOworICBwcmludGsoInBzYV9ud2lkX3NlbGVjdDogJWRcbiIsIHAtPnBzYV9ud2lkX3NlbGVjdCk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfZW5jcnlwdGlvbl9zZWxlY3Q6ICVkLCAiLCBwLT5wc2FfZW5jcnlwdGlvbl9zZWxlY3QpOworICBwcmludGsoInBzYV9lbmNyeXB0aW9uX2tleVtdOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJIHAtPnBzYV9lbmNyeXB0aW9uX2tleVswXSwKKwkgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzFdLAorCSBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbMl0sCisJIHAtPnBzYV9lbmNyeXB0aW9uX2tleVszXSwKKwkgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzRdLAorCSBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbNV0sCisJIHAtPnBzYV9lbmNyeXB0aW9uX2tleVs2XSwKKwkgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzddKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9kYXRhYnVzX3dpZHRoOiAlZFxuIiwgcC0+cHNhX2RhdGFidXNfd2lkdGgpOworICBwcmludGsoS0VSTl9ERUJVRyAicHNhX2NhbGxfY29kZS9hdXRvX3NxdWVsY2g6IDB4JTAyeCwgIiwKKwkgcC0+cHNhX2NhbGxfY29kZVswXSk7CisgIHByaW50aygicHNhX2NhbGxfY29kZVtdOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJIHAtPnBzYV9jYWxsX2NvZGVbMF0sCisJIHAtPnBzYV9jYWxsX2NvZGVbMV0sCisJIHAtPnBzYV9jYWxsX2NvZGVbMl0sCisJIHAtPnBzYV9jYWxsX2NvZGVbM10sCisJIHAtPnBzYV9jYWxsX2NvZGVbNF0sCisJIHAtPnBzYV9jYWxsX2NvZGVbNV0sCisJIHAtPnBzYV9jYWxsX2NvZGVbNl0sCisJIHAtPnBzYV9jYWxsX2NvZGVbN10pOworI2lmZGVmIERFQlVHX1NIT1dfVU5VU0VECisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfcmVzZXJ2ZWRbXTogJTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgcC0+cHNhX3Jlc2VydmVkWzBdLAorCSBwLT5wc2FfcmVzZXJ2ZWRbMV0sCisJIHAtPnBzYV9yZXNlcnZlZFsyXSwKKwkgcC0+cHNhX3Jlc2VydmVkWzNdKTsKKyNlbmRpZgkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworICBwcmludGsoS0VSTl9ERUJVRyAicHNhX2NvbmZfc3RhdHVzOiAlZCwgIiwgcC0+cHNhX2NvbmZfc3RhdHVzKTsKKyAgcHJpbnRrKCJwc2FfY3JjOiAweCUwMnglMDJ4LCAiLCBwLT5wc2FfY3JjWzBdLCBwLT5wc2FfY3JjWzFdKTsKKyAgcHJpbnRrKCJwc2FfY3JjX3N0YXR1czogMHglMDJ4XG4iLCBwLT5wc2FfY3JjX3N0YXR1cyk7Cit9IC8qIHd2X3BzYV9zaG93ICovCisjZW5kaWYJLyogREVCVUdfUFNBX1NIT1cgKi8KKworI2lmZGVmIERFQlVHX01NQ19TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBzdGF0dXMgb2YgdGhlIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KKyAqIFRoaXMgZnVuY3Rpb24gbmVlZCB0byBiZSBjb21wbGV0ZWQuLi4KKyAqLworc3RhdGljIHZvaWQKK3d2X21tY19zaG93KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgbmV0X2xvY2FsICoJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBtbXJfdAkJbTsKKworICAvKiBCYXNpYyBjaGVjayAqLworICBpZihoYXNyX3JlYWQoYmFzZSkgJiBIQVNSX05PX0NMSykKKyAgICB7CisgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogd3ZfbW1jX3Nob3c6IG1vZGVtIG5vdCBjb25uZWN0ZWRcbiIsCisJICAgICBkZXYtPm5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgLyogUmVhZCB0aGUgbW1jICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAxKTsKKyAgbW1jX3JlYWQoYmFzZSwgMCwgKHVfY2hhciAqKSZtLCBzaXplb2YobSkpOworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZnJlZXplKSwgMCk7CisKKyNpZmRlZiBXSVJFTEVTU19FWFQJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0IGluIHRoZSBrZXJuZWwgKi8KKyAgLyogRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSBzdGF0aXN0aWNzICovCisgIGxwLT53c3RhdHMuZGlzY2FyZC5ud2lkICs9IChtLm1tcl93cm9uZ19ud2lkX2ggPDwgOCkgfCBtLm1tcl93cm9uZ19ud2lkX2w7CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUICovCisKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiMjIyMjIHdhdmVsYW4gbW9kZW0gc3RhdHVzIHJlZ2lzdGVyczogIyMjIyNcbiIpOworI2lmZGVmIERFQlVHX1NIT1dfVU5VU0VECisgIHByaW50ayhLRVJOX0RFQlVHICJtbWNfdW51c2VkMFtdOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJIG0ubW1yX3VudXNlZDBbMF0sCisJIG0ubW1yX3VudXNlZDBbMV0sCisJIG0ubW1yX3VudXNlZDBbMl0sCisJIG0ubW1yX3VudXNlZDBbM10sCisJIG0ubW1yX3VudXNlZDBbNF0sCisJIG0ubW1yX3VudXNlZDBbNV0sCisJIG0ubW1yX3VudXNlZDBbNl0sCisJIG0ubW1yX3VudXNlZDBbN10pOworI2VuZGlmCS8qIERFQlVHX1NIT1dfVU5VU0VEICovCisgIHByaW50ayhLRVJOX0RFQlVHICJFbmNyeXB0aW9uIGFsZ29yeXRobTogJTAyWCAtIFN0YXR1czogJTAyWFxuIiwKKwkgbS5tbXJfZGVzX2F2YWlsLCBtLm1tcl9kZXNfc3RhdHVzKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorICBwcmludGsoS0VSTl9ERUJVRyAibW1jX3VudXNlZDFbXTogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSBtLm1tcl91bnVzZWQxWzBdLAorCSBtLm1tcl91bnVzZWQxWzFdLAorCSBtLm1tcl91bnVzZWQxWzJdLAorCSBtLm1tcl91bnVzZWQxWzNdLAorCSBtLm1tcl91bnVzZWQxWzRdKTsKKyNlbmRpZgkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworICBwcmludGsoS0VSTl9ERUJVRyAiZGNlX3N0YXR1czogMHgleCBbJXMlcyVzJXNdXG4iLAorCSBtLm1tcl9kY2Vfc3RhdHVzLAorCSAobS5tbXJfZGNlX3N0YXR1cyAmIE1NUl9EQ0VfU1RBVFVTX1JYX0JVU1kpID8gImVuZXJneSBkZXRlY3RlZCwiOiIiLAorCSAobS5tbXJfZGNlX3N0YXR1cyAmIE1NUl9EQ0VfU1RBVFVTX0xPT1BUX0lORCkgPworCSAibG9vcCB0ZXN0IGluZGljYXRlZCwiIDogIiIsCisJIChtLm1tcl9kY2Vfc3RhdHVzICYgTU1SX0RDRV9TVEFUVVNfVFhfQlVTWSkgPyAidHJhbnNtaXR0ZXIgb24sIiA6ICIiLAorCSAobS5tbXJfZGNlX3N0YXR1cyAmIE1NUl9EQ0VfU1RBVFVTX0pCUl9FWFBJUkVEKSA/CisJICJqYWJiZXIgdGltZXIgZXhwaXJlZCwiIDogIiIpOworICBwcmludGsoS0VSTl9ERUJVRyAiRHNwIElEOiAlMDJYXG4iLAorCSBtLm1tcl9kc3BfaWQpOworI2lmZGVmIERFQlVHX1NIT1dfVU5VU0VECisgIHByaW50ayhLRVJOX0RFQlVHICJtbWNfdW51c2VkMltdOiAlMDJYOiUwMlhcbiIsCisJIG0ubW1yX3VudXNlZDJbMF0sCisJIG0ubW1yX3VudXNlZDJbMV0pOworI2VuZGlmCS8qIERFQlVHX1NIT1dfVU5VU0VEICovCisgIHByaW50ayhLRVJOX0RFQlVHICIjIGNvcnJlY3RfbndpZDogJWQsICMgd3JvbmdfbndpZDogJWRcbiIsCisJIChtLm1tcl9jb3JyZWN0X253aWRfaCA8PCA4KSB8IG0ubW1yX2NvcnJlY3RfbndpZF9sLAorCSAobS5tbXJfd3JvbmdfbndpZF9oIDw8IDgpIHwgbS5tbXJfd3JvbmdfbndpZF9sKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInRocl9wcmVfc2V0OiAweCV4IFtjdXJyZW50IHNpZ25hbCAlc11cbiIsCisJIG0ubW1yX3Rocl9wcmVfc2V0ICYgTU1SX1RIUl9QUkVfU0VULAorCSAobS5tbXJfdGhyX3ByZV9zZXQgJiBNTVJfVEhSX1BSRV9TRVRfQ1VSKSA/ICJhYm92ZSIgOiAiYmVsb3ciKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInNpZ25hbF9sdmw6ICVkIFslc10sICIsCisJIG0ubW1yX3NpZ25hbF9sdmwgJiBNTVJfU0lHTkFMX0xWTCwKKwkgKG0ubW1yX3NpZ25hbF9sdmwgJiBNTVJfU0lHTkFMX0xWTF9WQUxJRCkgPyAibmV3IG1zZyIgOiAibm8gbmV3IG1zZyIpOworICBwcmludGsoInNpbGVuY2VfbHZsOiAlZCBbJXNdLCAiLCBtLm1tcl9zaWxlbmNlX2x2bCAmIE1NUl9TSUxFTkNFX0xWTCwKKwkgKG0ubW1yX3NpbGVuY2VfbHZsICYgTU1SX1NJTEVOQ0VfTFZMX1ZBTElEKSA/ICJ1cGRhdGUgZG9uZSIgOiAibm8gbmV3IHVwZGF0ZSIpOworICBwcmludGsoInNnbmxfcXVhbDogMHgleCBbJXNdXG4iLCBtLm1tcl9zZ25sX3F1YWwgJiBNTVJfU0dOTF9RVUFMLAorCSAobS5tbXJfc2dubF9xdWFsICYgTU1SX1NHTkxfUVVBTF9BTlQpID8gIkFudGVubmEgMSIgOiAiQW50ZW5uYSAwIik7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKyAgcHJpbnRrKEtFUk5fREVCVUcgIm5ldHdfaWRfbDogJXhcbiIsIG0ubW1yX25ldHdfaWRfbCk7CisjZW5kaWYJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KK30gLyogd3ZfbW1jX3Nob3cgKi8KKyNlbmRpZgkvKiBERUJVR19NTUNfU0hPVyAqLworCisjaWZkZWYgREVCVUdfSTgyNTkzX1NIT1cKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBQcmludCB0aGUgZm9ybWF0dGVkIHN0YXR1cyBvZiB0aGUgaTgyNTkzJ3MgcmVjZWl2ZSB1bml0LgorICovCitzdGF0aWMgdm9pZAord3ZfcnVfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiMjIyMjIHdhdmVsYW4gaTgyNTkzIHJlY2VpdmVyIHN0YXR1czogIyMjIyNcbiIpOworICBwcmludGsoS0VSTl9ERUJVRyAicnU6IHJmcCAlZCBzdG9wICVkIiwgbHAtPnJmcCwgbHAtPnN0b3ApOworICAvKgorICAgKiBOb3QgaW1wbGVtZW50ZWQgeWV0Li4uCisgICAqLworICBwcmludGsoIlxuIik7Cit9IC8qIHd2X3J1X3Nob3cgKi8KKyNlbmRpZgkvKiBERUJVR19JODI1OTNfU0hPVyAqLworCisjaWZkZWYgREVCVUdfREVWSUNFX1NIT1cKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBQcmludCB0aGUgZm9ybWF0dGVkIHN0YXR1cyBvZiB0aGUgV2F2ZUxBTiBQQ01DSUEgZGV2aWNlIGRyaXZlci4KKyAqLworc3RhdGljIHZvaWQKK3d2X2Rldl9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBwcmludGsoS0VSTl9ERUJVRyAiZGV2OiIpOworICBwcmludGsoIiBzdGF0ZT0lbFgsIiwgZGV2LT5zdGF0ZSk7CisgIHByaW50aygiIHRyYW5zX3N0YXJ0PSVsZCwiLCBkZXYtPnRyYW5zX3N0YXJ0KTsKKyAgcHJpbnRrKCIgZmxhZ3M9MHgleCwiLCBkZXYtPmZsYWdzKTsKKyAgcHJpbnRrKCJcbiIpOworfSAvKiB3dl9kZXZfc2hvdyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBzdGF0dXMgb2YgdGhlIFdhdmVMQU4gUENNQ0lBIGRldmljZSBkcml2ZXIncworICogcHJpdmF0ZSBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK3d2X2xvY2FsX3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgIHByaW50ayhLRVJOX0RFQlVHICJsb2NhbDoiKTsKKyAgLyoKKyAgICogTm90IGltcGxlbWVudGVkIHlldC4uLgorICAgKi8KKyAgcHJpbnRrKCJcbiIpOworfSAvKiB3dl9sb2NhbF9zaG93ICovCisjZW5kaWYJLyogREVCVUdfREVWSUNFX1NIT1cgKi8KKworI2lmIGRlZmluZWQoREVCVUdfUlhfSU5GTykgfHwgZGVmaW5lZChERUJVR19UWF9JTkZPKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIER1bXAgcGFja2V0IGhlYWRlciAoYW5kIGNvbnRlbnQgaWYgbmVjZXNzYXJ5KSBvbiB0aGUgc2NyZWVuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAord3ZfcGFja2V0X2luZm8odV9jaGFyICoJCXAsCQkvKiBQYWNrZXQgdG8gZHVtcCAqLworCSAgICAgICBpbnQJCWxlbmd0aCwJCS8qIExlbmd0aCBvZiB0aGUgcGFja2V0ICovCisJICAgICAgIGNoYXIgKgkJbXNnMSwJCS8qIE5hbWUgb2YgdGhlIGRldmljZSAqLworCSAgICAgICBjaGFyICoJCW1zZzIpCQkvKiBOYW1lIG9mIHRoZSBmdW5jdGlvbiAqLworeworICBpbnQJCWk7CisgIGludAkJbWF4aTsKKworICBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzKCk6IGRlc3QgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgsIGxlbmd0aCAlZFxuIiwKKwkgbXNnMSwgbXNnMiwgcFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSwgbGVuZ3RoKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcygpOiBzcmMgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgsIHR5cGUgMHglMDJYJTAyWFxuIiwKKwkgbXNnMSwgbXNnMiwgcFs2XSwgcFs3XSwgcFs4XSwgcFs5XSwgcFsxMF0sIHBbMTFdLCBwWzEyXSwgcFsxM10pOworCisjaWZkZWYgREVCVUdfUEFDS0VUX0RVTVAKKworICBwcmludGsoS0VSTl9ERUJVRyAiZGF0YT1cIiIpOworCisgIGlmKChtYXhpID0gbGVuZ3RoKSA+IERFQlVHX1BBQ0tFVF9EVU1QKQorICAgIG1heGkgPSBERUJVR19QQUNLRVRfRFVNUDsKKyAgZm9yKGkgPSAxNDsgaSA8IG1heGk7IGkrKykKKyAgICBpZihwW2ldID49ICcgJyAmJiBwW2ldIDw9ICd+JykKKyAgICAgIHByaW50aygiICVjIiwgcFtpXSk7CisgICAgZWxzZQorICAgICAgcHJpbnRrKCIlMDJYIiwgcFtpXSk7CisgIGlmKG1heGkgPCBsZW5ndGgpCisgICAgcHJpbnRrKCIuLiIpOworICBwcmludGsoIlwiXG4iKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CisjZW5kaWYJLyogREVCVUdfUEFDS0VUX0RVTVAgKi8KK30KKyNlbmRpZgkvKiBkZWZpbmVkKERFQlVHX1JYX0lORk8pIHx8IGRlZmluZWQoREVCVUdfVFhfSU5GTykgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIHdoaWNoIGlzIGRpc3BsYXllZCBieSB0aGUgZHJpdmVyIGF0IHN0YXJ0dXAKKyAqIFRoZXJlICBpcyBhIGxvdCBvZiBmbGFnIHRvIGNvbmZpZ3VyZSBpdCBhdCB5b3VyIHdpbGwuLi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3dl9pbml0X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIGtpb19hZGRyX3QJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICBwc2FfdAkJcHNhOworICBpbnQJCWk7CisKKyAgLyogUmVhZCB0aGUgcGFyYW1ldGVyIHN0b3JhZ2UgYXJlYSAqLworICBwc2FfcmVhZChkZXYsIDAsICh1bnNpZ25lZCBjaGFyICopICZwc2EsIHNpemVvZihwc2EpKTsKKworI2lmZGVmIERFQlVHX1BTQV9TSE9XCisgIHd2X3BzYV9zaG93KCZwc2EpOworI2VuZGlmCisjaWZkZWYgREVCVUdfTU1DX1NIT1cKKyAgd3ZfbW1jX3Nob3coZGV2KTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX0k4MjU5M19TSE9XCisgIHd2X3J1X3Nob3coZGV2KTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfQkFTSUNfU0hPVworICAvKiBOb3csIGxldCdzIGdvIGZvciB0aGUgYmFzaWMgc3R1ZmYgKi8KKyAgcHJpbnRrKEtFUk5fTk9USUNFICIlczogV2F2ZUxBTjogcG9ydCAlI2x4LCBpcnEgJWQsIGh3X2FkZHIiLAorCSBkZXYtPm5hbWUsIGJhc2UsIGRldi0+aXJxKTsKKyAgZm9yKGkgPSAwOyBpIDwgV0FWRUxBTl9BRERSX1NJWkU7IGkrKykKKyAgICBwcmludGsoIiVzJTAyWCIsIChpID09IDApID8gIiAiIDogIjoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKworICAvKiBQcmludCBjdXJyZW50IG5ldHdvcmsgaWQgKi8KKyAgaWYocHNhLnBzYV9ud2lkX3NlbGVjdCkKKyAgICBwcmludGsoIiwgbndpZCAweCUwMlgtJTAyWCIsIHBzYS5wc2FfbndpZFswXSwgcHNhLnBzYV9ud2lkWzFdKTsKKyAgZWxzZQorICAgIHByaW50aygiLCBud2lkIG9mZiIpOworCisgIC8qIElmIDIuMDAgY2FyZCAqLworICBpZighKG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisgICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpCisgICAgeworICAgICAgdW5zaWduZWQgc2hvcnQJZnJlcTsKKworICAgICAgLyogQXNrIHRoZSBFRXByb20gdG8gcmVhZCB0aGUgZnJlcXVlbmN5IGZyb20gdGhlIGZpcnN0IGFyZWEgKi8KKyAgICAgIGZlZV9yZWFkKGJhc2UsIDB4MDAgLyogMXN0IGFyZWEgLSBmcmVxdWVuY3kuLi4gKi8sCisJICAgICAgICZmcmVxLCAxKTsKKworICAgICAgLyogUHJpbnQgZnJlcXVlbmN5ICovCisgICAgICBwcmludGsoIiwgMi4wMCwgJWxkIiwgKGZyZXEgPj4gNikgKyAyNDAwTCk7CisKKyAgICAgIC8qIEhhY2sgISEhICovCisgICAgICBpZihmcmVxICYgMHgyMCkKKwlwcmludGsoIi41Iik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRrKCIsIFBDTUNJQSwgIik7CisgICAgICBzd2l0Y2ggKHBzYS5wc2Ffc3ViYmFuZCkKKwl7CisJY2FzZSBQU0FfU1VCQkFORF85MTU6CisJICBwcmludGsoIjkxNSIpOworCSAgYnJlYWs7CisJY2FzZSBQU0FfU1VCQkFORF8yNDI1OgorCSAgcHJpbnRrKCIyNDI1Iik7CisJICBicmVhazsKKwljYXNlIFBTQV9TVUJCQU5EXzI0NjA6CisJICBwcmludGsoIjI0NjAiKTsKKwkgIGJyZWFrOworCWNhc2UgUFNBX1NVQkJBTkRfMjQ4NDoKKwkgIHByaW50aygiMjQ4NCIpOworCSAgYnJlYWs7CisJY2FzZSBQU0FfU1VCQkFORF8yNDMwXzU6CisJICBwcmludGsoIjI0MzAuNSIpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHByaW50aygidW5rbm93biIpOworCX0KKyAgICB9CisKKyAgcHJpbnRrKCIgTUh6XG4iKTsKKyNlbmRpZgkvKiBERUJVR19CQVNJQ19TSE9XICovCisKKyNpZmRlZiBERUJVR19WRVJTSU9OX1NIT1cKKyAgLyogUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzIiwgdmVyc2lvbik7CisjZW5kaWYKK30gLyogd3ZfaW5pdF9pbmZvICovCisKKy8qKioqKioqKioqKioqKioqKioqKiogSU9DVEwsIFNUQVRTICYgUkVDT05GSUcgKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFdlIGZvdW5kIGhlcmUgcm91dGluZXMgdGhhdCBhcmUgY2FsbGVkIGJ5IExpbnV4IG9uIGRpZmZlcmVudHMKKyAqIG9jY2FzaW9ucyBhZnRlciB0aGUgY29uZmlndXJhdGlvbiBhbmQgbm90IGZvciB0cmFuc21pdHRpbmcgZGF0YQorICogVGhlc2UgbWF5IGJlIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHVzZSBpZmNvbmZpZywgL3Byb2MvbmV0L2RldgorICogb3Igd2lyZWxlc3MgZXh0ZW5zaW9ucworICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgZXRoZXJuZXQgc3RhdGlzdGljcy4gVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlCisgKiBjYXJkIG9wZW4gb3IgY2xvc2VkLgorICogVXNlZCB3aGVuIHRoZSB1c2VyIHJlYWQgL3Byb2MvbmV0L2RldgorICovCitzdGF0aWMgZW5fc3RhdHMJKgord2F2ZWxhbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisjaWZkZWYgREVCVUdfSU9DVExfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8PndhdmVsYW5fZ2V0X3N0YXRzKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICByZXR1cm4oJigobmV0X2xvY2FsICopbmV0ZGV2X3ByaXYoZGV2KSktPnN0YXRzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICogbnVtX2FkZHJzID09IC0xCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKyAqIG51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICogbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsCisgKgkJCWFuZCBkbyBiZXN0LWVmZm9ydCBmaWx0ZXJpbmcuCisgKi8KKworc3RhdGljIHZvaWQKK3dhdmVsYW5fc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBuZXRfbG9jYWwgKglscCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d2F2ZWxhbl9zZXRfbXVsdGljYXN0X2xpc3QoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHdhdmVsYW5fc2V0X211bHRpY2FzdF9saXN0KCk6IHNldHRpbmcgUnggbW9kZSAlMDJYIHRvICVkIGFkZHJlc3Nlcy5cbiIsCisJIGRldi0+bmFtZSwgZGV2LT5mbGFncywgZGV2LT5tY19jb3VudCk7CisjZW5kaWYKKworICBpZihkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisgICAgeworICAgICAgLyoKKyAgICAgICAqIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlOiByZWNlaXZlIGFsbCBwYWNrZXRzLgorICAgICAgICovCisgICAgICBpZighbHAtPnByb21pc2N1b3VzKQorCXsKKwkgIGxwLT5wcm9taXNjdW91cyA9IDE7CisJICBscC0+YWxsbXVsdGljYXN0ID0gMDsKKwkgIGxwLT5tY19jb3VudCA9IDA7CisKKwkgIHd2XzgyNTkzX3JlY29uZmlnKGRldik7CisKKwkgIC8qIFRlbGwgdGhlIGtlcm5lbCB0aGF0IHdlIGFyZSBkb2luZyBhIHJlYWxseSBiYWQgam9iLi4uICovCisJICBkZXYtPmZsYWdzIHw9IElGRl9QUk9NSVNDOworCX0KKyAgICB9CisgIGVsc2UKKyAgICAvKiBJZiBhbGwgbXVsdGljYXN0IGFkZHJlc3NlcworICAgICAqIG9yIHRvbyBtdWNoIG11bHRpY2FzdCBhZGRyZXNzZXMgZm9yIHRoZSBoYXJkd2FyZSBmaWx0ZXIgKi8KKyAgICBpZigoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwKKyAgICAgICAoZGV2LT5tY19jb3VudCA+IEk4MjU5M19NQVhfTVVMVElDQVNUX0FERFJFU1NFUykpCisgICAgICB7CisJLyoKKwkgKiBEaXNhYmxlIHByb21pc2N1b3VzIG1vZGUsIGJ1dCBhY3RpdmUgdGhlIGFsbCBtdWx0aWNhc3QgbW9kZQorCSAqLworCWlmKCFscC0+YWxsbXVsdGljYXN0KQorCSAgeworCSAgICBscC0+cHJvbWlzY3VvdXMgPSAwOworCSAgICBscC0+YWxsbXVsdGljYXN0ID0gMTsKKwkgICAgbHAtPm1jX2NvdW50ID0gMDsKKworCSAgICB3dl84MjU5M19yZWNvbmZpZyhkZXYpOworCisJICAgIC8qIFRlbGwgdGhlIGtlcm5lbCB0aGF0IHdlIGFyZSBkb2luZyBhIHJlYWxseSBiYWQgam9iLi4uICovCisJICAgIGRldi0+ZmxhZ3MgfD0gSUZGX0FMTE1VTFRJOworCSAgfQorICAgICAgfQorICAgIGVsc2UKKyAgICAgIC8qIElmIHRoZXJlIGlzIHNvbWUgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBzZW5kICovCisgICAgICBpZihkZXYtPm1jX2xpc3QgIT0gKHN0cnVjdCBkZXZfbWNfbGlzdCAqKSBOVUxMKQorCXsKKwkgIC8qCisJICAgKiBEaXNhYmxlIHByb21pc2N1b3VzIG1vZGUsIGJ1dCByZWNlaXZlIGFsbCBwYWNrZXRzCisJICAgKiBpbiBtdWx0aWNhc3QgbGlzdAorCSAgICovCisjaWZkZWYgTVVMVElDQVNUX0FWT0lECisJICBpZihscC0+cHJvbWlzY3VvdXMgfHwgbHAtPmFsbG11bHRpY2FzdCB8fAorCSAgICAgKGRldi0+bWNfY291bnQgIT0gbHAtPm1jX2NvdW50KSkKKyNlbmRpZgorCSAgICB7CisJICAgICAgbHAtPnByb21pc2N1b3VzID0gMDsKKwkgICAgICBscC0+YWxsbXVsdGljYXN0ID0gMDsKKwkgICAgICBscC0+bWNfY291bnQgPSBkZXYtPm1jX2NvdW50OworCisJICAgICAgd3ZfODI1OTNfcmVjb25maWcoZGV2KTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKgorCSAgICogU3dpdGNoIHRvIG5vcm1hbCBtb2RlOiBkaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgYW5kIAorCSAgICogY2xlYXIgdGhlIG11bHRpY2FzdCBsaXN0LgorCSAgICovCisJICBpZihscC0+cHJvbWlzY3VvdXMgfHwgbHAtPm1jX2NvdW50ID09IDApCisJICAgIHsKKwkgICAgICBscC0+cHJvbWlzY3VvdXMgPSAwOworCSAgICAgIGxwLT5hbGxtdWx0aWNhc3QgPSAwOworCSAgICAgIGxwLT5tY19jb3VudCA9IDA7CisKKwkgICAgICB3dl84MjU5M19yZWNvbmZpZyhkZXYpOworCSAgICB9CisJfQorI2lmZGVmIERFQlVHX0lPQ1RMX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZXhpc3QuLi4KKyAqIChOb3RlIDogaXQgd2FzIGEgbmljZSB3YXkgdG8gdGVzdCB0aGUgcmVjb25maWd1cmUgc3R1ZmYuLi4pCisgKi8KKyNpZmRlZiBTRVRfTUFDX0FERFJFU1MKK3N0YXRpYyBpbnQKK3dhdmVsYW5fc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCQkJdm9pZCAqCQlhZGRyKQoreworICBzdHJ1Y3Qgc29ja2FkZHIgKgltYWMgPSBhZGRyOworCisgIC8qIENvcHkgdGhlIGFkZHJlc3MgKi8KKyAgbWVtY3B5KGRldi0+ZGV2X2FkZHIsIG1hYy0+c2FfZGF0YSwgV0FWRUxBTl9BRERSX1NJWkUpOworCisgIC8qIFJlY29uZmlnIHRoZSBiZWFzdCAqLworICB3dl84MjU5M19yZWNvbmZpZyhkZXYpOworCisgIHJldHVybiAwOworfQorI2VuZGlmCS8qIFNFVF9NQUNfQUREUkVTUyAqLworCisjaWZkZWYgV0lSRUxFU1NfRVhUCS8qIElmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdCBpbiB0aGUga2VybmVsICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGcmVxdWVuY3kgc2V0dGluZyAoZm9yIGhhcmR3YXJlIGFibGUgb2YgaXQpCisgKiBJdCdzIGEgYml0IGNvbXBsaWNhdGVkIGFuZCB5b3UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gbG9vayBpbnRvIGl0Li4uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit3dl9zZXRfZnJlcXVlbmN5KHVfbG9uZwkJYmFzZSwJLyogaS9vIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkJIGl3X2ZyZXEgKglmcmVxdWVuY3kpCit7CisgIGNvbnN0IGludAlCQU5EX05VTSA9IDEwOwkvKiBOdW1iZXIgb2YgYmFuZHMgKi8KKyAgbG9uZwkJZnJlcSA9IDBMOwkvKiBvZmZzZXQgdG8gMi40IEdIeiBpbiAuNSBNSHogKi8KKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisgIGludAkJaTsKKyNlbmRpZgorCisgIC8qIFNldHRpbmcgYnkgZnJlcXVlbmN5ICovCisgIC8qIFRoZW9yaXRpY2FsbHksIHlvdSBtYXkgc2V0IGFueSBmcmVxdWVuY3kgYmV0d2VlbgorICAgKiB0aGUgdHdvIGxpbWl0cyB3aXRoIGEgMC41IE1IeiBwcmVjaXNpb24uIEluIHByYWN0aWNlLAorICAgKiBJIGRvbid0IHdhbnQgeW91IHRvIGhhdmUgdHJvdWJsZSB3aXRoIGxvY2FsCisgICAqIHJlZ3VsYXRpb25zLi4uICovCisgIGlmKChmcmVxdWVuY3ktPmUgPT0gMSkgJiYKKyAgICAgKGZyZXF1ZW5jeS0+bSA+PSAoaW50KSAyLjQxMmU4KSAmJiAoZnJlcXVlbmN5LT5tIDw9IChpbnQpIDIuNDg3ZTgpKQorICAgIHsKKyAgICAgIGZyZXEgPSAoKGZyZXF1ZW5jeS0+bSAvIDEwMDAwKSAtIDI0MDAwTCkgLyA1OworICAgIH0KKworICAvKiBTZXR0aW5nIGJ5IGNoYW5uZWwgKHNhbWUgYXMgd2ZyZXFzZWwpICovCisgIC8qIFdhcm5pbmcgOiBlYWNoIGNoYW5uZWwgaXMgMjJNSHogd2lkZSwgc28gc29tZSBvZiB0aGUgY2hhbm5lbHMKKyAgICogd2lsbCBpbnRlcmZlcmUuLi4gKi8KKyAgaWYoKGZyZXF1ZW5jeS0+ZSA9PSAwKSAmJgorICAgICAoZnJlcXVlbmN5LT5tID49IDApICYmIChmcmVxdWVuY3ktPm0gPCBCQU5EX05VTSkpCisgICAgeworICAgICAgLyogR2V0IGZyZXF1ZW5jeSBvZmZzZXQuICovCisgICAgICBmcmVxID0gY2hhbm5lbF9iYW5kc1tmcmVxdWVuY3ktPm1dID4+IDE7CisgICAgfQorCisgIC8qIFZlcmlmeSBpZiB0aGUgZnJlcXVlbmN5IGlzIGFsbG93ZWQgKi8KKyAgaWYoZnJlcSAhPSAwTCkKKyAgICB7CisgICAgICB1X3Nob3J0CXRhYmxlWzEwXTsJLyogQXV0aG9yaXplZCBmcmVxdWVuY3kgdGFibGUgKi8KKworICAgICAgLyogUmVhZCB0aGUgZnJlcXVlbmN5IHRhYmxlICovCisgICAgICBmZWVfcmVhZChiYXNlLCAweDcxIC8qIGZyZXF1ZW5jeSB0YWJsZSAqLywKKwkgICAgICAgdGFibGUsIDEwKTsKKworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICJGcmVxdWVuY3kgdGFibGUgOiIpOworICAgICAgZm9yKGkgPSAwOyBpIDwgMTA7IGkrKykKKwl7CisJICBwcmludGsoIiAlMDRYIiwKKwkJIHRhYmxlW2ldKTsKKwl9CisgICAgICBwcmludGsoIlxuIik7CisjZW5kaWYKKworICAgICAgLyogTG9vayBpbiB0aGUgdGFibGUgaWYgdGhlIGZyZXF1ZW5jeSBpcyBhbGxvd2VkICovCisgICAgICBpZighKHRhYmxlWzkgLSAoKGZyZXEgLSAyNCkgLyAxNildICYKKwkgICAoMSA8PCAoKGZyZXEgLSAyNCkgJSAxNikpKSkKKwlyZXR1cm4gLUVJTlZBTDsJCS8qIG5vdCBhbGxvd2VkICovCisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgLyogSWYgd2UgZ2V0IGEgdXNhYmxlIGZyZXF1ZW5jeSAqLworICBpZihmcmVxICE9IDBMKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIHNob3J0CWFyZWFbMTZdOworICAgICAgdW5zaWduZWQgc2hvcnQJZGFjWzJdOworICAgICAgdW5zaWduZWQgc2hvcnQJYXJlYV92ZXJpZnlbMTZdOworICAgICAgdW5zaWduZWQgc2hvcnQJZGFjX3ZlcmlmeVsyXTsKKyAgICAgIC8qIENvcnJlc3BvbmRpbmcgZ2FpbiAoaW4gdGhlIHBvd2VyIGFkanVzdCB2YWx1ZSB0YWJsZSkKKyAgICAgICAqIHNlZSBBVCZUIFdhdmVsYW4gRGF0YSBNYW51YWwsIFJFRiA0MDctMDI0Njg5L0UsIHBhZ2UgMy04CisgICAgICAgKiAmIFdDSU4wNjJELkRPQywgcGFnZSA2LjIuOSAqLworICAgICAgdW5zaWduZWQgc2hvcnQJcG93ZXJfbGltaXRbXSA9IHsgNDAsIDgwLCAxMjAsIDE2MCwgMCB9OworICAgICAgaW50CQlwb3dlcl9iYW5kID0gMDsJCS8qIFNlbGVjdGVkIGJhbmQgKi8KKyAgICAgIHVuc2lnbmVkIHNob3J0CXBvd2VyX2FkanVzdDsJCS8qIENvcnJlY3QgdmFsdWUgKi8KKworICAgICAgLyogU2VhcmNoIGZvciB0aGUgZ2FpbiAqLworICAgICAgcG93ZXJfYmFuZCA9IDA7CisgICAgICB3aGlsZSgoZnJlcSA+IHBvd2VyX2xpbWl0W3Bvd2VyX2JhbmRdKSAmJgorCSAgICAocG93ZXJfbGltaXRbKytwb3dlcl9iYW5kXSAhPSAwKSkKKwk7CisKKyAgICAgIC8qIFJlYWQgdGhlIGZpcnN0IGFyZWEgKi8KKyAgICAgIGZlZV9yZWFkKGJhc2UsIDB4MDAsCisJICAgICAgIGFyZWEsIDE2KTsKKworICAgICAgLyogUmVhZCB0aGUgREFDICovCisgICAgICBmZWVfcmVhZChiYXNlLCAweDYwLAorCSAgICAgICBkYWMsIDIpOworCisgICAgICAvKiBSZWFkIHRoZSBuZXcgcG93ZXIgYWRqdXN0IHZhbHVlICovCisgICAgICBmZWVfcmVhZChiYXNlLCAweDZCIC0gKHBvd2VyX2JhbmQgPj4gMSksCisJICAgICAgICZwb3dlcl9hZGp1c3QsIDEpOworICAgICAgaWYocG93ZXJfYmFuZCAmIDB4MSkKKwlwb3dlcl9hZGp1c3QgPj49IDg7CisgICAgICBlbHNlCisJcG93ZXJfYWRqdXN0ICY9IDB4RkY7CisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZWxhbiBFRXByb20gQXJlYSAxIDoiKTsKKyAgICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspCisJeworCSAgcHJpbnRrKCIgJTA0WCIsCisJCSBhcmVhW2ldKTsKKwl9CisgICAgICBwcmludGsoIlxuIik7CisKKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlbGFuIEVFcHJvbSBEQUMgOiAlMDRYICUwNFhcbiIsCisJICAgICBkYWNbMF0sIGRhY1sxXSk7CisjZW5kaWYKKworICAgICAgLyogRnJlcXVlbmN5IG9mZnNldCAoZm9yIGluZm8gb25seS4uLikgKi8KKyAgICAgIGFyZWFbMF0gPSAoKGZyZXEgPDwgNSkgJiAweEZGRTApIHwgKGFyZWFbMF0gJiAweDFGKTsKKworICAgICAgLyogUmVjZWl2ZXIgUHJpbmNpcGxlIG1haW4gZGl2aWRlciBjb2VmZmljaWVudCAqLworICAgICAgYXJlYVszXSA9IChmcmVxID4+IDEpICsgMjQwMEwgLSAzNTJMOworICAgICAgYXJlYVsyXSA9ICgoZnJlcSAmIDB4MSkgPDwgNCkgfCAoYXJlYVsyXSAmIDB4RkZFRik7CisKKyAgICAgIC8qIFRyYW5zbWl0dGVyIE1haW4gZGl2aWRlciBjb2VmZmljaWVudCAqLworICAgICAgYXJlYVsxM10gPSAoZnJlcSA+PiAxKSArIDI0MDBMOworICAgICAgYXJlYVsxMl0gPSAoKGZyZXEgJiAweDEpIDw8IDQpIHwgKGFyZWFbMl0gJiAweEZGRUYpOworCisgICAgICAvKiBPdGhlcnMgcGFydCBvZiB0aGUgYXJlYSBhcmUgZmxhZ3MsIGJpdCBzdHJlYW1zIG9yIHVudXNlZC4uLiAqLworCisgICAgICAvKiBTZXQgdGhlIHZhbHVlIGluIHRoZSBEQUMgKi8KKyAgICAgIGRhY1sxXSA9ICgocG93ZXJfYWRqdXN0ID4+IDEpICYgMHg3RikgfCAoZGFjWzFdICYgMHhGRjgwKTsKKyAgICAgIGRhY1swXSA9ICgocG93ZXJfYWRqdXN0ICYgMHgxKSA8PCA0KSB8IChkYWNbMF0gJiAweEZGRUYpOworCisgICAgICAvKiBXcml0ZSB0aGUgZmlyc3QgYXJlYSAqLworICAgICAgZmVlX3dyaXRlKGJhc2UsIDB4MDAsCisJCWFyZWEsIDE2KTsKKworICAgICAgLyogV3JpdGUgdGhlIERBQyAqLworICAgICAgZmVlX3dyaXRlKGJhc2UsIDB4NjAsCisJCWRhYywgMik7CisKKyAgICAgIC8qIFdlIG5vdyBzaG91bGQgdmVyaWZ5IGhlcmUgdGhhdCB0aGUgRUVwcm9tIHdyaXR0aW5nIHdhcyBvayAqLworCisgICAgICAvKiBSZVJlYWQgdGhlIGZpcnN0IGFyZWEgKi8KKyAgICAgIGZlZV9yZWFkKGJhc2UsIDB4MDAsCisJICAgICAgIGFyZWFfdmVyaWZ5LCAxNik7CisKKyAgICAgIC8qIFJlUmVhZCB0aGUgREFDICovCisgICAgICBmZWVfcmVhZChiYXNlLCAweDYwLAorCSAgICAgICBkYWNfdmVyaWZ5LCAyKTsKKworICAgICAgLyogQ29tcGFyZSAqLworICAgICAgaWYobWVtY21wKGFyZWEsIGFyZWFfdmVyaWZ5LCAxNiAqIDIpIHx8CisJIG1lbWNtcChkYWMsIGRhY192ZXJpZnksIDIgKiAyKSkKKwl7CisjaWZkZWYgREVCVUdfSU9DVExfRVJST1IKKwkgIHByaW50ayhLRVJOX0lORk8gIldhdmVsYW46IHd2X3NldF9mcmVxdWVuY3kgOiB1bmFibGUgdG8gd3JpdGUgbmV3IGZyZXF1ZW5jeSB0byBFRXByb20gKD8pXG4iKTsKKyNlbmRpZgorCSAgcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworICAgICAgLyogV2UgbXVzdCBkb3dubG9hZCB0aGUgZnJlcXVlbmN5IHBhcmFtZXRlcnMgdG8gdGhlCisgICAgICAgKiBzeW50aGV0aXNlcnMgKGZyb20gdGhlIEVFcHJvbSAtIGFyZWEgMSkKKyAgICAgICAqIE5vdGUgOiBhcyB0aGUgRUVwcm9tIGlzIGF1dG8gZGVjcmVtZW50ZWQsIHdlIHNldCB0aGUgZW5kCisgICAgICAgKiBpZiB0aGUgYXJlYS4uLiAqLworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgMHgwRik7CisgICAgICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLAorCSAgICAgIE1NV19GRUVfQ1RSTF9SRUFEIHwgTU1XX0ZFRV9DVFJMX0RXTEQpOworCisgICAgICAvKiBXYWl0IHVudGlsIHRoZSBkb3dubG9hZCBpcyBmaW5pc2hlZCAqLworICAgICAgZmVlX3dhaXQoYmFzZSwgMTAwLCAxMDApOworCisgICAgICAvKiBXZSBtdXN0IG5vdyBkb3dubG9hZCB0aGUgcG93ZXIgYWRqdXN0IHZhbHVlIChnYWluKSB0bworICAgICAgICogdGhlIHN5bnRoZXRpc2VycyAoZnJvbSB0aGUgRUVwcm9tIC0gYXJlYSA3IC0gREFDKSAqLworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgMHg2MSk7CisgICAgICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLAorCSAgICAgIE1NV19GRUVfQ1RSTF9SRUFEIHwgTU1XX0ZFRV9DVFJMX0RXTEQpOworCisgICAgICAvKiBXYWl0IHVudGlsIHRoZSBkb3dubG9hZCBpcyBmaW5pc2hlZCAqLworICAgICAgZmVlX3dhaXQoYmFzZSwgMTAwLCAxMDApOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworICAgICAgLyogVmVyaWZpY2F0aW9uIG9mIHdoYXQgd2UgaGF2ZSBkb25lLi4uICovCisKKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlbGFuIEVFcHJvbSBBcmVhIDEgOiIpOworICAgICAgZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKwl7CisJICBwcmludGsoIiAlMDRYIiwKKwkJIGFyZWFfdmVyaWZ5W2ldKTsKKwl9CisgICAgICBwcmludGsoIlxuIik7CisKKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlbGFuIEVFcHJvbSBEQUMgOiAlMDRYICUwNFhcbiIsCisJICAgICBkYWNfdmVyaWZ5WzBdLCBkYWNfdmVyaWZ5WzFdKTsKKyNlbmRpZgorCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gLUVJTlZBTDsJCS8qIEJhaCwgbmV2ZXIgZ2V0IHRoZXJlLi4uICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBHaXZlIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBmcmVxdWVuY2llcworICovCitzdGF0aWMgaW5saW5lIGludAord3ZfZnJlcXVlbmN5X2xpc3QodV9sb25nCWJhc2UsCS8qIGkvbyBwb3J0IG9mIHRoZSBjYXJkICovCisJCSAgaXdfZnJlcSAqCWxpc3QsCS8qIExpc3Qgb2YgZnJlcXVlbmN5IHRvIGZpbGwgKi8KKwkJICBpbnQJCW1heCkJLyogTWF4aW11bSBudW1iZXIgb2YgZnJlcXVlbmNpZXMgKi8KK3sKKyAgdV9zaG9ydAl0YWJsZVsxMF07CS8qIEF1dGhvcml6ZWQgZnJlcXVlbmN5IHRhYmxlICovCisgIGxvbmcJCWZyZXEgPSAwTDsJLyogb2Zmc2V0IHRvIDIuNCBHSHogaW4gLjUgTUh6ICsgMTIgTUh6ICovCisgIGludAkJaTsJCS8qIGluZGV4IGluIHRoZSB0YWJsZSAqLworICBjb25zdCBpbnQJQkFORF9OVU0gPSAxMDsJLyogTnVtYmVyIG9mIGJhbmRzICovCisgIGludAkJYyA9IDA7CQkvKiBDaGFubmVsIG51bWJlciAqLworCisgIC8qIFJlYWQgdGhlIGZyZXF1ZW5jeSB0YWJsZSAqLworICBmZWVfcmVhZChiYXNlLCAweDcxIC8qIGZyZXF1ZW5jeSB0YWJsZSAqLywKKwkgICB0YWJsZSwgMTApOworCisgIC8qIExvb2sgYWxsIGZyZXF1ZW5jaWVzICovCisgIGkgPSAwOworICBmb3IoZnJlcSA9IDA7IGZyZXEgPCAxNTA7IGZyZXErKykKKyAgICAvKiBMb29rIGluIHRoZSB0YWJsZSBpZiB0aGUgZnJlcXVlbmN5IGlzIGFsbG93ZWQgKi8KKyAgICBpZih0YWJsZVs5IC0gKGZyZXEgLyAxNildICYgKDEgPDwgKGZyZXEgJSAxNikpKQorICAgICAgeworCS8qIENvbXB1dGUgYXBwcm94aW1hdGUgY2hhbm5lbCBudW1iZXIgKi8KKwl3aGlsZSgoKChjaGFubmVsX2JhbmRzW2NdID4+IDEpIC0gMjQpIDwgZnJlcSkgJiYKKwkgICAgICAoYyA8IEJBTkRfTlVNKSkKKwkgIGMrKzsKKwlsaXN0W2ldLmkgPSBjOwkvKiBTZXQgdGhlIGxpc3QgaW5kZXggKi8KKworCS8qIHB1dCBpbiB0aGUgbGlzdCAqLworCWxpc3RbaV0ubSA9ICgoKGZyZXEgKyAyNCkgKiA1KSArIDI0MDAwTCkgKiAxMDAwMDsKKwlsaXN0W2krK10uZSA9IDE7CisKKwkvKiBDaGVjayBudW1iZXIgKi8KKwlpZihpID49IG1heCkKKwkgIHJldHVybihpKTsKKyAgICAgIH0KKworICByZXR1cm4oaSk7Cit9CisKKyNpZmRlZiBJV19XSVJFTEVTU19TUFkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBHYXRoZXIgd2lyZWxlc3Mgc3B5IHN0YXRpc3RpY3MgOiBmb3IgZWFjaCBwYWNrZXQsIGNvbXBhcmUgdGhlIHNvdXJjZQorICogYWRkcmVzcyB3aXRoIG91dCBsaXN0LCBhbmQgaWYgbWF0Y2gsIGdldCB0aGUgc3RhdHMuLi4KKyAqIFNvcnJ5LCBidXQgdGhpcyBmdW5jdGlvbiByZWFsbHkgbmVlZCB3aXJlbGVzcyBleHRlbnNpb25zLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAord2xfc3B5X2dhdGhlcihzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkgICAgICB1X2NoYXIgKgltYWMsCQkvKiBNQUMgYWRkcmVzcyAqLworCSAgICAgIHVfY2hhciAqCXN0YXRzKQkJLyogU3RhdGlzdGljcyB0byBnYXRoZXIgKi8KK3sKKyAgc3RydWN0IGl3X3F1YWxpdHkgd3N0YXRzOworCisgIHdzdGF0cy5xdWFsID0gc3RhdHNbMl0gJiBNTVJfU0dOTF9RVUFMOworICB3c3RhdHMubGV2ZWwgPSBzdGF0c1swXSAmIE1NUl9TSUdOQUxfTFZMOworICB3c3RhdHMubm9pc2UgPSBzdGF0c1sxXSAmIE1NUl9TSUxFTkNFX0xWTDsKKyAgd3N0YXRzLnVwZGF0ZWQgPSAweDc7CisKKyAgLyogVXBkYXRlIHNweSByZWNvcmRzICovCisgIHdpcmVsZXNzX3NweV91cGRhdGUoZGV2LCBtYWMsICZ3c3RhdHMpOworfQorI2VuZGlmCS8qIElXX1dJUkVMRVNTX1NQWSAqLworCisjaWZkZWYgSElTVE9HUkFNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGUgYW4gaGlzdG9ncmFtIG9uIHRoZSBzaWduYWwgbGV2ZWwuCisgKiBBcyB0aGUgbm9pc2UgaXMgcXVpdGUgY29uc3RhbnQsIGl0J3MgbGlrZSBkb2luZyBpdCBvbiB0aGUgU05SLgorICogV2UgaGF2ZSBkZWZpbmVkIGEgc2V0IG9mIGludGVydmFsIChscC0+aGlzX3JhbmdlKSwgYW5kIGVhY2ggdGltZQorICogdGhlIGxldmVsIGdvZXMgaW4gdGhhdCBpbnRlcnZhbCwgd2UgaW5jcmVtZW50IHRoZSBjb3VudCAobHAtPmhpc19zdW0pLgorICogV2l0aCB0aGlzIGhpc3RvZ3JhbSB5b3UgbWF5IGRldGVjdCBpZiBvbmUgd2F2ZWxhbiBpcyByZWFsbHkgd2VhaywKKyAqIG9yIHlvdSBtYXkgYWxzbyBjYWxjdWxhdGUgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbGV2ZWwuLi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3bF9oaXNfZ2F0aGVyKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCSAgICAgIHVfY2hhciAqCXN0YXRzKQkJLyogU3RhdGlzdGljcyB0byBnYXRoZXIgKi8KK3sKKyAgbmV0X2xvY2FsICoJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICB1X2NoYXIJbGV2ZWwgPSBzdGF0c1swXSAmIE1NUl9TSUdOQUxfTFZMOworICBpbnQJCWk7CisKKyAgLyogRmluZCB0aGUgY29ycmVjdCBpbnRlcnZhbCAqLworICBpID0gMDsKKyAgd2hpbGUoKGkgPCAobHAtPmhpc19udW1iZXIgLSAxKSkgJiYgKGxldmVsID49IGxwLT5oaXNfcmFuZ2VbaSsrXSkpCisgICAgOworCisgIC8qIEluY3JlbWVudCBpbnRlcnZhbCBjb3VudGVyICovCisgIChscC0+aGlzX3N1bVtpXSkrKzsKK30KKyNlbmRpZgkvKiBISVNUT0dSQU0gKi8KKworc3RhdGljIHZvaWQgd2xfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJuY3B5KGluZm8tPmRyaXZlciwgIndhdmVsYW5fY3MiLCBzaXplb2YoaW5mby0+ZHJpdmVyKS0xKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBvcHMgPSB7CisJLmdldF9kcnZpbmZvID0gd2xfZ2V0X2RydmluZm8KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHByb3RvY29sIG5hbWUKKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXN0cmNweSh3cnF1LT5uYW1lLCAiV2F2ZUxBTiIpOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBOV0lECisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfbndpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlraW9fYWRkcl90IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwc2FfdCBwc2E7CisJbW1fdCBtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIFNldCBOV0lEIGluIFdhdmVMQU4uICovCisJaWYgKCF3cnF1LT5ud2lkLmRpc2FibGVkKSB7CisJCS8qIFNldCBOV0lEIGluIHBzYSAqLworCQlwc2EucHNhX253aWRbMF0gPSAod3JxdS0+bndpZC52YWx1ZSAmIDB4RkYwMCkgPj4gODsKKwkJcHNhLnBzYV9ud2lkWzFdID0gd3JxdS0+bndpZC52YWx1ZSAmIDB4RkY7CisJCXBzYS5wc2FfbndpZF9zZWxlY3QgPSAweDAxOworCQlwc2Ffd3JpdGUoZGV2LAorCQkJICAoY2hhciAqKSBwc2EucHNhX253aWQgLSAoY2hhciAqKSAmcHNhLAorCQkJICAodW5zaWduZWQgY2hhciAqKSBwc2EucHNhX253aWQsIDMpOworCisJCS8qIFNldCBOV0lEIGluIG1tYy4gKi8KKwkJbS53Lm1td19uZXR3X2lkX2wgPSBwc2EucHNhX253aWRbMV07CisJCW0udy5tbXdfbmV0d19pZF9oID0gcHNhLnBzYV9ud2lkWzBdOworCQltbWNfd3JpdGUoYmFzZSwKKwkJCSAgKGNoYXIgKikgJm0udy5tbXdfbmV0d19pZF9sIC0KKwkJCSAgKGNoYXIgKikgJm0sCisJCQkgICh1bnNpZ25lZCBjaGFyICopICZtLncubW13X25ldHdfaWRfbCwgMik7CisJCW1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19sb29wdF9zZWwpLCAweDAwKTsKKwl9IGVsc2UgeworCQkvKiBEaXNhYmxlIE5XSUQgaW4gdGhlIHBzYS4gKi8KKwkJcHNhLnBzYV9ud2lkX3NlbGVjdCA9IDB4MDA7CisJCXBzYV93cml0ZShkZXYsCisJCQkgIChjaGFyICopICZwc2EucHNhX253aWRfc2VsZWN0IC0KKwkJCSAgKGNoYXIgKikgJnBzYSwKKwkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfbndpZF9zZWxlY3QsCisJCQkgIDEpOworCisJCS8qIERpc2FibGUgTldJRCBpbiB0aGUgbW1jIChubyBmaWx0ZXJpbmcpLiAqLworCQltbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfbG9vcHRfc2VsKSwKKwkJCU1NV19MT09QVF9TRUxfRElTX05XSUQpOworCX0KKwkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldik7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IE5XSUQgCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfbndpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogUmVhZCB0aGUgTldJRC4gKi8KKwlwc2FfcmVhZChkZXYsCisJCSAoY2hhciAqKSBwc2EucHNhX253aWQgLSAoY2hhciAqKSAmcHNhLAorCQkgKHVuc2lnbmVkIGNoYXIgKikgcHNhLnBzYV9ud2lkLCAzKTsKKwl3cnF1LT5ud2lkLnZhbHVlID0gKHBzYS5wc2FfbndpZFswXSA8PCA4KSArIHBzYS5wc2FfbndpZFsxXTsKKwl3cnF1LT5ud2lkLmRpc2FibGVkID0gIShwc2EucHNhX253aWRfc2VsZWN0KTsKKwl3cnF1LT5ud2lkLmZpeGVkID0gMTsJLyogU3VwZXJmbHVvdXMgKi8KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlraW9fYWRkcl90IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIEF0dGVtcHQgdG8gcmVjb2duaXNlIDIuMDAgY2FyZHMgKDIuNCBHSHogZnJlcXVlbmN5IHNlbGVjdGFibGUpLiAqLworCWlmICghKG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisJICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpCisJCXJldCA9IHd2X3NldF9mcmVxdWVuY3koYmFzZSwgJih3cnF1LT5mcmVxKSk7CisJZWxzZQorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlraW9fYWRkcl90IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogQXR0ZW1wdCB0byByZWNvZ25pc2UgMi4wMCBjYXJkcyAoMi40IEdIeiBmcmVxdWVuY3kgc2VsZWN0YWJsZSkuCisJICogRG9lcyBpdCB3b3JrIGZvciBldmVyeWJvZHksIGVzcGVjaWFsbHkgb2xkIGNhcmRzPyAqLworCWlmICghKG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisJICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpIHsKKwkJdW5zaWduZWQgc2hvcnQgZnJlcTsKKworCQkvKiBBc2sgdGhlIEVFUFJPTSB0byByZWFkIHRoZSBmcmVxdWVuY3kgZnJvbSB0aGUgZmlyc3QgYXJlYS4gKi8KKwkJZmVlX3JlYWQoYmFzZSwgMHgwMCwgJmZyZXEsIDEpOworCQl3cnF1LT5mcmVxLm0gPSAoKGZyZXEgPj4gNSkgKiA1ICsgMjQwMDBMKSAqIDEwMDAwOworCQl3cnF1LT5mcmVxLmUgPSAxOworCX0gZWxzZSB7CisJCXBzYV9yZWFkKGRldiwKKwkJCSAoY2hhciAqKSAmcHNhLnBzYV9zdWJiYW5kIC0gKGNoYXIgKikgJnBzYSwKKwkJCSAodW5zaWduZWQgY2hhciAqKSAmcHNhLnBzYV9zdWJiYW5kLCAxKTsKKworCQlpZiAocHNhLnBzYV9zdWJiYW5kIDw9IDQpIHsKKwkJCXdycXUtPmZyZXEubSA9IGZpeGVkX2JhbmRzW3BzYS5wc2Ffc3ViYmFuZF07CisJCQl3cnF1LT5mcmVxLmUgPSAocHNhLnBzYV9zdWJiYW5kICE9IDApOworCQl9IGVsc2UKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgbGV2ZWwgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlraW9fYWRkcl90IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogU2V0IHRoZSBsZXZlbCB0aHJlc2hvbGQuICovCisJLyogV2Ugc2hvdWxkIGNvbXBsYWluIGxvdWRseSBpZiB3cnF1LT5zZW5zLmZpeGVkID0gMCwgYmVjYXVzZSB3ZQorCSAqIGNhbid0IHNldCBhdXRvIG1vZGUuLi4gKi8KKwlwc2EucHNhX3Rocl9wcmVfc2V0ID0gd3JxdS0+c2Vucy52YWx1ZSAmIDB4M0Y7CisJcHNhX3dyaXRlKGRldiwKKwkJICAoY2hhciAqKSAmcHNhLnBzYV90aHJfcHJlX3NldCAtIChjaGFyICopICZwc2EsCisJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfdGhyX3ByZV9zZXQsIDEpOworCS8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworCXVwZGF0ZV9wc2FfY2hlY2tzdW0oZGV2KTsKKwltbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfdGhyX3ByZV9zZXQpLAorCQlwc2EucHNhX3Rocl9wcmVfc2V0KTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgbGV2ZWwgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogUmVhZCB0aGUgbGV2ZWwgdGhyZXNob2xkLiAqLworCXBzYV9yZWFkKGRldiwKKwkJIChjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0IC0gKGNoYXIgKikgJnBzYSwKKwkJICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0LCAxKTsKKwl3cnF1LT5zZW5zLnZhbHVlID0gcHNhLnBzYV90aHJfcHJlX3NldCAmIDB4M0Y7CisJd3JxdS0+c2Vucy5maXhlZCA9IDE7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGVuY3J5cHRpb24ga2V5CisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgIGNoYXIgKmV4dHJhKQoreworCWtpb19hZGRyX3QgYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJcHNhX3QgcHNhOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIGlmIGNhcGFibGUgb2YgZW5jcnlwdGlvbiAqLworCWlmICghbW1jX2VuY3IoYmFzZSkpIHsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCisJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGtleSAqLworCWlmKCh3cnF1LT5lbmNvZGluZy5sZW5ndGggIT0gOCkgJiYgKHdycXUtPmVuY29kaW5nLmxlbmd0aCAhPSAwKSkgeworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCWlmKCFyZXQpIHsKKwkJLyogQmFzaWMgY2hlY2tpbmcuLi4gKi8KKwkJaWYgKHdycXUtPmVuY29kaW5nLmxlbmd0aCA9PSA4KSB7CisJCQkvKiBDb3B5IHRoZSBrZXkgaW4gdGhlIGRyaXZlciAqLworCQkJbWVtY3B5KHBzYS5wc2FfZW5jcnlwdGlvbl9rZXksIGV4dHJhLAorCQkJICAgICAgIHdycXUtPmVuY29kaW5nLmxlbmd0aCk7CisJCQlwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0ID0gMTsKKworCQkJcHNhX3dyaXRlKGRldiwKKwkJCQkgIChjaGFyICopICZwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0IC0KKwkJCQkgIChjaGFyICopICZwc2EsCisJCQkJICAodW5zaWduZWQgY2hhciAqKSAmcHNhLgorCQkJCSAgcHNhX2VuY3J5cHRpb25fc2VsZWN0LCA4ICsgMSk7CisKKwkJCW1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19lbmNyX2VuYWJsZSksCisJCQkJTU1XX0VOQ1JfRU5BQkxFX0VOIHwgTU1XX0VOQ1JfRU5BQkxFX01PREUpOworCQkJbW1jX3dyaXRlKGJhc2UsIG1td29mZigwLCBtbXdfZW5jcl9rZXkpLAorCQkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS4KKwkJCQkgIHBzYV9lbmNyeXB0aW9uX2tleSwgOCk7CisJCX0KKworCQkvKiBkaXNhYmxlIGVuY3J5cHRpb24gKi8KKwkJaWYgKHdycXUtPmVuY29kaW5nLmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7CisJCQlwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0ID0gMDsKKwkJCXBzYV93cml0ZShkZXYsCisJCQkJICAoY2hhciAqKSAmcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCAtCisJCQkJICAoY2hhciAqKSAmcHNhLAorCQkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS4KKwkJCQkgIHBzYV9lbmNyeXB0aW9uX3NlbGVjdCwgMSk7CisKKwkJCW1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19lbmNyX2VuYWJsZSksIDApOworCQl9CisJCS8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworCQl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldik7CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBlbmNyeXB0aW9uIGtleQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgICBjaGFyICpleHRyYSkKK3sKKwlraW9fYWRkcl90IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogQ2hlY2sgaWYgZW5jcnlwdGlvbiBpcyBhdmFpbGFibGUgKi8KKwlpZiAoIW1tY19lbmNyKGJhc2UpKSB7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0gZWxzZSB7CisJCS8qIFJlYWQgdGhlIGVuY3J5cHRpb24ga2V5ICovCisJCXBzYV9yZWFkKGRldiwKKwkJCSAoY2hhciAqKSAmcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCAtCisJCQkgKGNoYXIgKikgJnBzYSwKKwkJCSAodW5zaWduZWQgY2hhciAqKSAmcHNhLgorCQkJIHBzYV9lbmNyeXB0aW9uX3NlbGVjdCwgMSArIDgpOworCisJCS8qIGVuY3J5cHRpb24gaXMgZW5hYmxlZCA/ICovCisJCWlmIChwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0KQorCQkJd3JxdS0+ZW5jb2RpbmcuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRDsKKwkJZWxzZQorCQkJd3JxdS0+ZW5jb2RpbmcuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJCXdycXUtPmVuY29kaW5nLmZsYWdzIHw9IG1tY19lbmNyKGJhc2UpOworCisJCS8qIENvcHkgdGhlIGtleSB0byB0aGUgdXNlciBidWZmZXIgKi8KKwkJd3JxdS0+ZW5jb2RpbmcubGVuZ3RoID0gODsKKwkJbWVtY3B5KGV4dHJhLCBwc2EucHNhX2VuY3J5cHRpb25fa2V5LCB3cnF1LT5lbmNvZGluZy5sZW5ndGgpOworCX0KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFdBVkVMQU5fUk9BTUlOR19FWFQKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IEVTU0lEIChkb21haW4pCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogQ2hlY2sgaWYgZGlzYWJsZSAqLworCWlmKHdycXUtPmRhdGEuZmxhZ3MgPT0gMCkKKwkJbHAtPmZpbHRlcl9kb21haW5zID0gMDsKKwllbHNlIHsKKwkJY2hhcgllc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOworCQljaGFyICoJZW5kcDsKKworCQkvKiBUZXJtaW5hdGUgdGhlIHN0cmluZyAqLworCQltZW1jcHkoZXNzaWQsIGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisJCWVzc2lkW0lXX0VTU0lEX01BWF9TSVpFXSA9ICdcMCc7CisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHICJTZXRFc3NpZCA6IGBgJXMnJ1xuIiwgZXNzaWQpOworI2VuZGlmCS8qIERFQlVHX0lPQ1RMX0lORk8gKi8KKworCQkvKiBDb252ZXJ0IHRvIGEgbnVtYmVyIChub3RlIDogV2F2ZWxhbiBzcGVjaWZpYykgKi8KKwkJbHAtPmRvbWFpbl9pZCA9IHNpbXBsZV9zdHJ0b3VsKGVzc2lkLCAmZW5kcCwgMTYpOworCQkvKiBIYXMgaXQgd29ya2VkICA/ICovCisJCWlmKGVuZHAgPiBlc3NpZCkKKwkJCWxwLT5maWx0ZXJfZG9tYWlucyA9IDE7CisJCWVsc2UgeworCQkJbHAtPmZpbHRlcl9kb21haW5zID0gMDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IEVTU0lEIChkb21haW4pCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBJcyB0aGUgZG9tYWluIElEIGFjdGl2ZSA/ICovCisJd3JxdS0+ZGF0YS5mbGFncyA9IGxwLT5maWx0ZXJfZG9tYWluczsKKworCS8qIENvcHkgRG9tYWluIElEIGludG8gYSBzdHJpbmcgKFdhdmVsYW4gc3BlY2lmaWMpICovCisJLyogU291bmQgY3JhenksIGJlIHdlIGNhbid0IGhhdmUgYSBzbnByaW50ZiBpbiB0aGUga2VybmVsICEhISAqLworCXNwcmludGYoZXh0cmEsICIlbFgiLCBscC0+ZG9tYWluX2lkKTsKKwlleHRyYVtJV19FU1NJRF9NQVhfU0laRV0gPSAnXDAnOworCisJLyogU2V0IHRoZSBsZW5ndGggKi8KKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IEFQIGFkZHJlc3MKKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCXByaW50ayhLRVJOX0RFQlVHICJTZXQgQVAgdG8gOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgICAgICAgd3JxdS0+YXBfYWRkci5zYV9kYXRhWzBdLAorCSAgICAgICB3cnF1LT5hcF9hZGRyLnNhX2RhdGFbMV0sCisJICAgICAgIHdycXUtPmFwX2FkZHIuc2FfZGF0YVsyXSwKKwkgICAgICAgd3JxdS0+YXBfYWRkci5zYV9kYXRhWzNdLAorCSAgICAgICB3cnF1LT5hcF9hZGRyLnNhX2RhdGFbNF0sCisJICAgICAgIHdycXUtPmFwX2FkZHIuc2FfZGF0YVs1XSk7CisjZW5kaWYJLyogREVCVUdfSU9DVExfSU5GTyAqLworCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBBUCBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCS8qIFNob3VsZCBnZXQgdGhlIHJlYWwgTWNDb3kgaW5zdGVhZCBvZiBvd24gRXRoZXJuZXQgYWRkcmVzcyAqLworCW1lbWNweSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIGRldi0+ZGV2X2FkZHIsIFdBVkVMQU5fQUREUl9TSVpFKTsKKwl3cnF1LT5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkdfRVhUICovCisKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IG1vZGUKKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCW5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgbW9kZSAqLworCXN3aXRjaCh3cnF1LT5tb2RlKSB7CisJY2FzZSBJV19NT0RFX0FESE9DOgorCQlpZihkb19yb2FtaW5nKSB7CisJCQl3dl9yb2FtX2NsZWFudXAoZGV2KTsKKwkJCWRvX3JvYW1pbmcgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJaWYoIWRvX3JvYW1pbmcpIHsKKwkJCXd2X3JvYW1faW5pdChkZXYpOworCQkJZG9fcm9hbWluZyA9IDE7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IG1vZGUKKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCWlmKGRvX3JvYW1pbmcpCisJCXdycXUtPm1vZGUgPSBJV19NT0RFX0lORlJBOworCWVsc2UKKwkJd3JxdS0+bW9kZSA9IElXX01PREVfQURIT0M7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgcmFuZ2UgaW5mbworICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgIGNoYXIgKmV4dHJhKQoreworCWtpb19hZGRyX3QgYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBTZXQgdGhlIGxlbmd0aCAodmVyeSBpbXBvcnRhbnQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKworCS8qIFNldCBhbGwgdGhlIGluZm8gd2UgZG9uJ3QgY2FyZSBvciBkb24ndCBrbm93IGFib3V0IHRvIHplcm8gKi8KKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCS8qIFNldCB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9uIHZlcnNpb25zICovCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gOTsKKworCS8qIFNldCBpbmZvcm1hdGlvbiBpbiB0aGUgcmFuZ2Ugc3RydWN0LiAgKi8KKwlyYW5nZS0+dGhyb3VnaHB1dCA9IDEuNCAqIDEwMDAgKiAxMDAwOwkvKiBkb24ndCBhcmd1ZSBvbiB0aGlzICEgKi8KKwlyYW5nZS0+bWluX253aWQgPSAweDAwMDA7CisJcmFuZ2UtPm1heF9ud2lkID0gMHhGRkZGOworCisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMHgzRjsKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IE1NUl9TR05MX1FVQUw7CisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gTU1SX1NJR05BTF9MVkw7CisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gTU1SX1NJTEVOQ0VfTFZMOworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gTU1SX1NHTkxfUVVBTDsgLyogQWx3YXlzIG1heCAqLworCS8qIE5lZWQgdG8gZ2V0IGJldHRlciB2YWx1ZXMgZm9yIHRob3NlIHR3byAqLworCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDMwOworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDg7CisKKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gMTsKKwlyYW5nZS0+Yml0cmF0ZVswXSA9IDIwMDAwMDA7CS8qIDIgTWIvcyAqLworCisJLyogRXZlbnQgY2FwYWJpbGl0eSAoa2VybmVsICsgZHJpdmVyKSAqLworCXJhbmdlLT5ldmVudF9jYXBhWzBdID0gKElXX0VWRU5UX0NBUEFfTUFTSygweDhCMDIpIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soMHg4QjA0KSB8CisJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKDB4OEIwNikpOworCXJhbmdlLT5ldmVudF9jYXBhWzFdID0gSVdfRVZFTlRfQ0FQQV9LXzE7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIEF0dGVtcHQgdG8gcmVjb2duaXNlIDIuMDAgY2FyZHMgKDIuNCBHSHogZnJlcXVlbmN5IHNlbGVjdGFibGUpLiAqLworCWlmICghKG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisJICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpIHsKKwkJcmFuZ2UtPm51bV9jaGFubmVscyA9IDEwOworCQlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IHd2X2ZyZXF1ZW5jeV9saXN0KGJhc2UsIHJhbmdlLT5mcmVxLAorCQkJCQkJCUlXX01BWF9GUkVRVUVOQ0lFUyk7CisJfSBlbHNlCisJCXJhbmdlLT5udW1fY2hhbm5lbHMgPSByYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IDA7CisKKwkvKiBFbmNyeXB0aW9uIHN1cHBvcnRlZCA/ICovCisJaWYgKG1tY19lbmNyKGJhc2UpKSB7CisJCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gODsJLyogREVTID0gNjQgYml0cyBrZXkgKi8KKwkJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDE7CisJCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gMTsJLyogT25seSBvbmUga2V5IHBvc3NpYmxlICovCisJfSBlbHNlIHsKKwkJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDA7CisJCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gMDsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBQcml2YXRlIEhhbmRsZXIgOiBzZXQgcXVhbGl0eSB0aHJlc2hvbGQKKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF9xdGhyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCWtpb19hZGRyX3QgYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwlwc2EucHNhX3F1YWxpdHlfdGhyID0gKihleHRyYSkgJiAweDBGOworCXBzYV93cml0ZShkZXYsCisJCSAgKGNoYXIgKikgJnBzYS5wc2FfcXVhbGl0eV90aHIgLSAoY2hhciAqKSAmcHNhLAorCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyLCAxKTsKKwkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldik7CisJbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X3F1YWxpdHlfdGhyKSwKKwkJcHNhLnBzYV9xdWFsaXR5X3Rocik7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogZ2V0IHF1YWxpdHkgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfcXRocihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJcHNhX3JlYWQoZGV2LAorCQkgKGNoYXIgKikgJnBzYS5wc2FfcXVhbGl0eV90aHIgLSAoY2hhciAqKSAmcHNhLAorCQkgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfcXVhbGl0eV90aHIsIDEpOworCSooZXh0cmEpID0gcHNhLnBzYV9xdWFsaXR5X3RociAmIDB4MEY7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogc2V0IHJvYW1pbmcKKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF9yb2FtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCW5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIE5vdGUgOiBzaG91bGQgY2hlY2sgaWYgdXNlciA9PSByb290ICovCisJaWYoZG9fcm9hbWluZyAmJiAoKmV4dHJhKT09MCkKKwkJd3Zfcm9hbV9jbGVhbnVwKGRldik7CisJZWxzZSBpZihkb19yb2FtaW5nPT0wICYmICgqZXh0cmEpIT0wKQorCQl3dl9yb2FtX2luaXQoZGV2KTsKKworCWRvX3JvYW1pbmcgPSAoKmV4dHJhKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBQcml2YXRlIEhhbmRsZXIgOiBnZXQgcXVhbGl0eSB0aHJlc2hvbGQKKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9yb2FtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCSooZXh0cmEpID0gZG9fcm9hbWluZzsKKworCXJldHVybiAwOworfQorI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCisjaWZkZWYgSElTVE9HUkFNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogc2V0IGhpc3RvZ3JhbQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X2hpc3RvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgIGNoYXIgKmV4dHJhKQoreworCW5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogQ2hlY2sgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMuICovCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gMTYpIHsKKwkJcmV0dXJuKC1FMkJJRyk7CisJfQorCisJLyogRGlzYWJsZSBoaXN0byB3aGlsZSB3ZSBjb3B5IHRoZSBhZGRyZXNzZXMuCisJICogQXMgd2UgZG9uJ3QgZGlzYWJsZSBpbnRlcnJ1cHRzLCB3ZSBuZWVkIHRvIGRvIHRoaXMgKi8KKwlscC0+aGlzX251bWJlciA9IDA7CisKKwkvKiBBcmUgdGhlcmUgcmFuZ2VzIHRvIGNvcHk/ICovCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gMCkgeworCQkvKiBDb3B5IGludGVydmFsIHJhbmdlcyB0byB0aGUgZHJpdmVyICovCisJCW1lbWNweShscC0+aGlzX3JhbmdlLCBleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgpOworCisJCXsKKwkJICBpbnQgaTsKKwkJICBwcmludGsoS0VSTl9ERUJVRyAiSGlzdG8gOiIpOworCQkgIGZvcihpID0gMDsgaSA8IHdycXUtPmRhdGEubGVuZ3RoOyBpKyspCisJCSAgICBwcmludGsoIiAlZCIsIGxwLT5oaXNfcmFuZ2VbaV0pOworCQkgIHByaW50aygiXG4iKTsKKwkJfQorCisJCS8qIFJlc2V0IHJlc3VsdCBzdHJ1Y3R1cmUuICovCisJCW1lbXNldChscC0+aGlzX3N1bSwgMHgwMCwgc2l6ZW9mKGxvbmcpICogMTYpOworCX0KKworCS8qIE5vdyB3ZSBjYW4gc2V0IHRoZSBudW1iZXIgb2YgcmFuZ2VzICovCisJbHAtPmhpc19udW1iZXIgPSB3cnF1LT5kYXRhLmxlbmd0aDsKKworCXJldHVybigwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IGdldCBoaXN0b2dyYW0KKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9oaXN0byhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIFNldCB0aGUgbnVtYmVyIG9mIGludGVydmFscy4gKi8KKwl3cnF1LT5kYXRhLmxlbmd0aCA9IGxwLT5oaXNfbnVtYmVyOworCisJLyogR2l2ZSBiYWNrIHRoZSBkaXN0cmlidXRpb24gc3RhdGlzdGljcyAqLworCWlmKGxwLT5oaXNfbnVtYmVyID4gMCkKKwkJbWVtY3B5KGV4dHJhLCBscC0+aGlzX3N1bSwgc2l6ZW9mKGxvbmcpICogbHAtPmhpc19udW1iZXIpOworCisJcmV0dXJuKDApOworfQorI2VuZGlmCQkJLyogSElTVE9HUkFNICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTdHJ1Y3R1cmVzIHRvIGV4cG9ydCB0aGUgV2lyZWxlc3MgSGFuZGxlcnMKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyB3YXZlbGFuX3ByaXZhdGVfYXJnc1tdID0geworLyp7IGNtZCwgICAgICAgICBzZXRfYXJncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FyZ3MsIG5hbWUgfSAqLworICB7IFNJT0NTSVBRVEhSLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRxdWFsdGhyIiB9LAorICB7IFNJT0NHSVBRVEhSLCAwLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRxdWFsdGhyIiB9LAorICB7IFNJT0NTSVBST0FNLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRyb2FtIiB9LAorICB7IFNJT0NHSVBST0FNLCAwLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRyb2FtIiB9LAorICB7IFNJT0NTSVBISVNUTywgSVdfUFJJVl9UWVBFX0JZVEUgfCAxNiwgICAgICAgICAgICAgICAgICAgIDAsICJzZXRoaXN0byIgfSwKKyAgeyBTSU9DR0lQSElTVE8sIDAsICAgICAgICAgICAgICAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LCAiZ2V0aGlzdG8iIH0sCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJd2F2ZWxhbl9oYW5kbGVyW10gPQoreworCU5VTEwsCQkJCS8qIFNJT0NTSVdOQU1FICovCisJd2F2ZWxhbl9nZXRfbmFtZSwJCS8qIFNJT0NHSVdOQU1FICovCisJd2F2ZWxhbl9zZXRfbndpZCwJCS8qIFNJT0NTSVdOV0lEICovCisJd2F2ZWxhbl9nZXRfbndpZCwJCS8qIFNJT0NHSVdOV0lEICovCisJd2F2ZWxhbl9zZXRfZnJlcSwJCS8qIFNJT0NTSVdGUkVRICovCisJd2F2ZWxhbl9nZXRfZnJlcSwJCS8qIFNJT0NHSVdGUkVRICovCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisJd2F2ZWxhbl9zZXRfbW9kZSwJCS8qIFNJT0NTSVdNT0RFICovCisJd2F2ZWxhbl9nZXRfbW9kZSwJCS8qIFNJT0NHSVdNT0RFICovCisjZWxzZQkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXTU9ERSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdNT0RFICovCisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisJd2F2ZWxhbl9zZXRfc2VucywJCS8qIFNJT0NTSVdTRU5TICovCisJd2F2ZWxhbl9nZXRfc2VucywJCS8qIFNJT0NHSVdTRU5TICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JBTkdFICovCisJd2F2ZWxhbl9nZXRfcmFuZ2UsCQkvKiBTSU9DR0lXUkFOR0UgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXUFJJViAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdQUklWICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1NUQVRTICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1NUQVRTICovCisJaXdfaGFuZGxlcl9zZXRfc3B5LAkJLyogU0lPQ1NJV1NQWSAqLworCWl3X2hhbmRsZXJfZ2V0X3NweSwJCS8qIFNJT0NHSVdTUFkgKi8KKwlpd19oYW5kbGVyX3NldF90aHJzcHksCQkvKiBTSU9DU0lXVEhSU1BZICovCisJaXdfaGFuZGxlcl9nZXRfdGhyc3B5LAkJLyogU0lPQ0dJV1RIUlNQWSAqLworI2lmZGVmIFdBVkVMQU5fUk9BTUlOR19FWFQKKwl3YXZlbGFuX3NldF93YXAsCQkvKiBTSU9DU0lXQVAgKi8KKwl3YXZlbGFuX2dldF93YXAsCQkvKiBTSU9DR0lXQVAgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0FQTElTVCAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJd2F2ZWxhbl9zZXRfZXNzaWQsCQkvKiBTSU9DU0lXRVNTSUQgKi8KKwl3YXZlbGFuX2dldF9lc3NpZCwJCS8qIFNJT0NHSVdFU1NJRCAqLworI2Vsc2UJLyogV0FWRUxBTl9ST0FNSU5HX0VYVCAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdBUCAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdBUCAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXQVBMSVNUICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXRVNTSUQgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXRVNTSUQgKi8KKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkdfRVhUICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV05JQ0tOICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV05JQ0tOICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXUkFURSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdSQVRFICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JUUyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdSVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXRlJBRyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdGUkFHICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1RYUE9XICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1RYUE9XICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JFVFJZICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1JFVFJZICovCisJd2F2ZWxhbl9zZXRfZW5jb2RlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLworCXdhdmVsYW5fZ2V0X2VuY29kZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KK307CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCQl3YXZlbGFuX3ByaXZhdGVfaGFuZGxlcltdID0KK3sKKwl3YXZlbGFuX3NldF9xdGhyLAkJLyogU0lPQ0lXRklSU1RQUklWICovCisJd2F2ZWxhbl9nZXRfcXRociwJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDEgKi8KKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcKKwl3YXZlbGFuX3NldF9yb2FtLAkJLyogU0lPQ0lXRklSU1RQUklWICsgMiAqLworCXdhdmVsYW5fZ2V0X3JvYW0sCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAzICovCisjZWxzZQkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKwlOVUxMLAkJCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAyICovCisJTlVMTCwJCQkJLyogU0lPQ0lXRklSU1RQUklWICsgMyAqLworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworI2lmZGVmIEhJU1RPR1JBTQorCXdhdmVsYW5fc2V0X2hpc3RvLAkJLyogU0lPQ0lXRklSU1RQUklWICsgNCAqLworCXdhdmVsYW5fZ2V0X2hpc3RvLAkJLyogU0lPQ0lXRklSU1RQUklWICsgNSAqLworI2VuZGlmCS8qIEhJU1RPR1JBTSAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZgl3YXZlbGFuX2hhbmRsZXJfZGVmID0KK3sKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKHdhdmVsYW5faGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZQk9IHNpemVvZih3YXZlbGFuX3ByaXZhdGVfaGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKHdhdmVsYW5fcHJpdmF0ZV9hcmdzKS9zaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisJLnN0YW5kYXJkCT0gd2F2ZWxhbl9oYW5kbGVyLAorCS5wcml2YXRlCT0gd2F2ZWxhbl9wcml2YXRlX2hhbmRsZXIsCisJLnByaXZhdGVfYXJncwk9IHdhdmVsYW5fcHJpdmF0ZV9hcmdzLAorCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSB3YXZlbGFuX2dldF93aXJlbGVzc19zdGF0cywKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBHZXQgd2lyZWxlc3Mgc3RhdGlzdGljcworICogQ2FsbGVkIGJ5IC9wcm9jL25ldC93aXJlbGVzcy4uLgorICovCitzdGF0aWMgaXdfc3RhdHMgKgord2F2ZWxhbl9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIGtpb19hZGRyX3QJCWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgbmV0X2xvY2FsICoJCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgbW1yX3QJCQltOworICBpd19zdGF0cyAqCQl3c3RhdHM7CisgIHVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisjaWZkZWYgREVCVUdfSU9DVExfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCisgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworICB3c3RhdHMgPSAmbHAtPndzdGF0czsKKworICAvKiBHZXQgZGF0YSBmcm9tIHRoZSBtbWMgKi8KKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZyZWV6ZSksIDEpOworCisgIG1tY19yZWFkKGJhc2UsIG1tcm9mZigwLCBtbXJfZGNlX3N0YXR1cyksICZtLm1tcl9kY2Vfc3RhdHVzLCAxKTsKKyAgbW1jX3JlYWQoYmFzZSwgbW1yb2ZmKDAsIG1tcl93cm9uZ19ud2lkX2wpLCAmbS5tbXJfd3JvbmdfbndpZF9sLCAyKTsKKyAgbW1jX3JlYWQoYmFzZSwgbW1yb2ZmKDAsIG1tcl90aHJfcHJlX3NldCksICZtLm1tcl90aHJfcHJlX3NldCwgNCk7CisKKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZyZWV6ZSksIDApOworCisgIC8qIENvcHkgZGF0YSB0byB3aXJlbGVzcyBzdHVmZiAqLworICB3c3RhdHMtPnN0YXR1cyA9IG0ubW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVUzsKKyAgd3N0YXRzLT5xdWFsLnF1YWwgPSBtLm1tcl9zZ25sX3F1YWwgJiBNTVJfU0dOTF9RVUFMOworICB3c3RhdHMtPnF1YWwubGV2ZWwgPSBtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkw7CisgIHdzdGF0cy0+cXVhbC5ub2lzZSA9IG0ubW1yX3NpbGVuY2VfbHZsICYgTU1SX1NJTEVOQ0VfTFZMOworICB3c3RhdHMtPnF1YWwudXBkYXRlZCA9ICgoKG0ubW1yX3NpZ25hbF9sdmwgJiBNTVJfU0lHTkFMX0xWTF9WQUxJRCkgPj4gNykgfAorCQkJICAoKG0ubW1yX3NpZ25hbF9sdmwgJiBNTVJfU0lHTkFMX0xWTF9WQUxJRCkgPj4gNikgfAorCQkJICAoKG0ubW1yX3NpbGVuY2VfbHZsICYgTU1SX1NJTEVOQ0VfTFZMX1ZBTElEKSA+PiA1KSk7CisgIHdzdGF0cy0+ZGlzY2FyZC5ud2lkICs9IChtLm1tcl93cm9uZ19ud2lkX2ggPDwgOCkgfCBtLm1tcl93cm9uZ19ud2lkX2w7CisgIHdzdGF0cy0+ZGlzY2FyZC5jb2RlID0gMEw7CisgIHdzdGF0cy0+ZGlzY2FyZC5taXNjID0gMEw7CisKKyAgLyogUmVFbmFibGUgaW50ZXJydXB0cyAmIHJlc3RvcmUgZmxhZ3MgKi8KKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9nZXRfd2lyZWxlc3Nfc3RhdHMoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gJmxwLT53c3RhdHM7Cit9CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFBBQ0tFVCBSRUNFUFRJT04gKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIHBhcnQgZGVhbCB3aXRoIHJlY2VpdmluZyB0aGUgcGFja2V0cy4KKyAqIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBnZXQgYW4gaW50ZXJydXB0IHdoZW4gYSBwYWNrZXQgaGFzIGJlZW4KKyAqIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBhbmQgY2FsbGVkIHRoaXMgcGFydC4uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBDYWxjdWxhdGUgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGZyYW1lIHBvaW50ZWQgdG8gYnkgdGhlIHJlY2VpdmUKKyAqIGZyYW1lIHBvaW50ZXIgYW5kIHZlcmlmeSB0aGF0IHRoZSBmcmFtZSBzZWVtIGNvcnJlY3QKKyAqIChjYWxsZWQgYnkgd3ZfcGFja2V0X3JjdigpKQorICovCitzdGF0aWMgaW5saW5lIGludAord3Zfc3RhcnRfb2ZfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJCSAgaW50CQlyZnAsCS8qIGVuZCBvZiBmcmFtZSAqLworCQkgIGludAkJd3JhcCkJLyogc3RhcnQgb2YgYnVmZmVyICovCit7CisgIGtpb19hZGRyX3QJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICBpbnQJCXJwOworICBpbnQJCWxlbjsKKworICBycCA9IChyZnAgLSA1ICsgUlhfU0laRSkgJSBSWF9TSVpFOworICBvdXRiKHJwICYgMHhmZiwgUElPUkwoYmFzZSkpOworICBvdXRiKCgocnAgPj4gOCkgJiBQSU9SSF9NQVNLKSwgUElPUkgoYmFzZSkpOworICBsZW4gPSBpbmIoUElPUChiYXNlKSk7CisgIGxlbiB8PSBpbmIoUElPUChiYXNlKSkgPDwgODsKKworICAvKiBTYW5pdHkgY2hlY2tzIG9uIHNpemUgKi8KKyAgLyogRnJhbWUgdG9vIGJpZyAqLworICBpZihsZW4gPiBNQVhEQVRBWiArIDEwMCkKKyAgICB7CisjaWZkZWYgREVCVUdfUlhfRVJST1IKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9zdGFydF9vZl9mcmFtZTogUmVjZWl2ZWQgZnJhbWUgdG9vIGxhcmdlLCByZnAgJWQgbGVuIDB4JXhcbiIsCisJICAgICBkZXYtPm5hbWUsIHJmcCwgbGVuKTsKKyNlbmRpZgorICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgIAorICAvKiBGcmFtZSB0b28gc2hvcnQgKi8KKyAgaWYobGVuIDwgNykKKyAgICB7CisjaWZkZWYgREVCVUdfUlhfRVJST1IKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9zdGFydF9vZl9mcmFtZTogUmVjZWl2ZWQgbnVsbCBmcmFtZSwgcmZwICVkIGxlbiAweCV4XG4iLAorCSAgICAgZGV2LT5uYW1lLCByZnAsIGxlbik7CisjZW5kaWYKKyAgICAgIHJldHVybigtMSk7CisgICAgfQorICAKKyAgLyogV3JhcCBhcm91bmQgYnVmZmVyICovCisgIGlmKGxlbiA+ICgod3JhcCAtIChyZnAgLSBsZW4pICsgUlhfU0laRSkgJSBSWF9TSVpFKSkJLyogbWFnaWMgZm9ybXVsYSAhICovCisgICAgeworI2lmZGVmIERFQlVHX1JYX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogd3Zfc3RhcnRfb2ZfZnJhbWU6IHdyYXAgYXJvdW5kIGJ1ZmZlciwgd3JhcCAlZCByZnAgJWQgbGVuIDB4JXhcbiIsCisJICAgICBkZXYtPm5hbWUsIHdyYXAsIHJmcCwgbGVuKTsKKyNlbmRpZgorICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisKKyAgcmV0dXJuKChycCAtIGxlbiArIFJYX1NJWkUpICUgUlhfU0laRSk7Cit9IC8qIHd2X3N0YXJ0X29mX2ZyYW1lICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgZG9lcyB0aGUgYWN0dWFsIGNvcHkgb2YgZGF0YSAoaW5jbHVkaW5nIHRoZSBldGhlcm5ldAorICogaGVhZGVyIHN0cnVjdHVyZSkgZnJvbSB0aGUgV2F2ZUxBTiBjYXJkIHRvIGFuIHNrX2J1ZmYgY2hhaW4gdGhhdAorICogd2lsbCBiZSBwYXNzZWQgdXAgdG8gdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGxheWVyLiBOT1RFOiBXZQorICogY3VycmVudGx5IGRvbid0IGhhbmRsZSB0cmFpbGVyIHByb3RvY29scyAobmVpdGhlciBkb2VzIHRoZSByZXN0IG9mCisgKiB0aGUgbmV0d29yayBpbnRlcmZhY2UpLCBzbyBpZiB0aGF0IGlzIG5lZWRlZCwgaXQgd2lsbCAoYXQgbGVhc3QgaW4KKyAqIHBhcnQpIGJlIGFkZGVkIGhlcmUuICBUaGUgY29udGVudHMgb2YgdGhlIHJlY2VpdmUgcmluZyBidWZmZXIgYXJlCisgKiBjb3BpZWQgdG8gYSBtZXNzYWdlIGNoYWluIHRoYXQgaXMgdGhlbiBwYXNzZWQgdG8gdGhlIGtlcm5lbC4KKyAqCisgKiBOb3RlOiBpZiBhbnkgZXJyb3JzIG9jY3VyLCB0aGUgcGFja2V0IGlzICJkcm9wcGVkIG9uIHRoZSBmbG9vciIKKyAqIChjYWxsZWQgYnkgd3ZfcGFja2V0X3JjdigpKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3d2X3BhY2tldF9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICoJCWRldiwKKwkgICAgICAgaW50CQlmZF9wLAorCSAgICAgICBpbnQJCXNrc2l6ZSkKK3sKKyAgbmV0X2xvY2FsICoJCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgc3RydWN0IHNrX2J1ZmYgKglza2I7CisKKyNpZmRlZiBERUJVR19SWF9UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfcGFja2V0X3JlYWQoMHglWCwgJWQpXG4iLAorCSBkZXYtPm5hbWUsIGZkX3AsIHNrc2l6ZSk7CisjZW5kaWYKKworICAvKiBBbGxvY2F0ZSBzb21lIGJ1ZmZlciBmb3IgdGhlIG5ldyBwYWNrZXQgKi8KKyAgaWYoKHNrYiA9IGRldl9hbGxvY19za2Ioc2tzaXplKzIpKSA9PSAoc3RydWN0IHNrX2J1ZmYgKikgTlVMTCkKKyAgICB7CisjaWZkZWYgREVCVUdfUlhfRVJST1IKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9wYWNrZXRfcmVhZCgpOiBjb3VsZCBub3QgYWxsb2Nfc2tiKCVkLCBHRlBfQVRPTUlDKVxuIiwKKwkgICAgIGRldi0+bmFtZSwgc2tzaXplKTsKKyNlbmRpZgorICAgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKyAgICAgIC8qCisgICAgICAgKiBOb3Qgb25seSBkbyB3ZSB3YW50IHRvIHJldHVybiBoZXJlLCBidXQgd2UgYWxzbyBuZWVkIHRvIGRyb3AgdGhlCisgICAgICAgKiBwYWNrZXQgb24gdGhlIGZsb29yIHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQuCisgICAgICAgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc2tiLT5kZXYgPSBkZXY7CisKKyAgc2tiX3Jlc2VydmUoc2tiLCAyKTsKKyAgZmRfcCA9IHJlYWRfcmluZ2J1ZihkZXYsIGZkX3AsIChjaGFyICopIHNrYl9wdXQoc2tiLCBza3NpemUpLCBza3NpemUpOworICBza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCisjaWZkZWYgREVCVUdfUlhfSU5GTworICB3dl9wYWNrZXRfaW5mbyhza2ItPm1hYy5yYXcsIHNrc2l6ZSwgZGV2LT5uYW1lLCAid3ZfcGFja2V0X3JlYWQiKTsKKyNlbmRpZgkvKiBERUJVR19SWF9JTkZPICovCisgICAgIAorICAvKiBTdGF0aXN0aWNzIGdhdGhlcmluZyAmIHN0dWZmIGFzc29jaWF0ZWQuCisgICAqIEl0IHNlZW0gYSBiaXQgbWVzc3kgd2l0aCBhbGwgdGhlIGRlZmluZSwgYnV0IGl0J3MgcmVhbGx5IHNpbXBsZS4uLiAqLworICBpZigKKyNpZmRlZiBJV19XSVJFTEVTU19TUFkKKyAgICAgKGxwLT5zcHlfZGF0YS5zcHlfbnVtYmVyID4gMCkgfHwKKyNlbmRpZgkvKiBJV19XSVJFTEVTU19TUFkgKi8KKyNpZmRlZiBISVNUT0dSQU0KKyAgICAgKGxwLT5oaXNfbnVtYmVyID4gMCkgfHwKKyNlbmRpZgkvKiBISVNUT0dSQU0gKi8KKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcKKyAgICAgKGRvX3JvYW1pbmcpIHx8CisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisgICAgIDApCisgICAgeworICAgICAgdV9jaGFyCXN0YXRzWzNdOwkvKiBTaWduYWwgbGV2ZWwsIE5vaXNlIGxldmVsLCBTaWduYWwgcXVhbGl0eSAqLworCisgICAgICAvKiByZWFkIHNpZ25hbCBsZXZlbCwgc2lsZW5jZSBsZXZlbCBhbmQgc2lnbmFsIHF1YWxpdHkgYnl0ZXMgKi8KKyAgICAgIGZkX3AgPSByZWFkX3JpbmdidWYoZGV2LCAoZmRfcCArIDQpICUgUlhfU0laRSArIFJYX0JBU0UsCisJCQkgIHN0YXRzLCAzKTsKKyNpZmRlZiBERUJVR19SWF9JTkZPCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X3BhY2tldF9yZWFkKCk6IFNpZ25hbCBsZXZlbCAlZC82MywgU2lsZW5jZSBsZXZlbCAlZC82Mywgc2lnbmFsIHF1YWxpdHkgJWQvMTZcbiIsCisJICAgICBkZXYtPm5hbWUsIHN0YXRzWzBdICYgMHgzRiwgc3RhdHNbMV0gJiAweDNGLCBzdGF0c1syXSAmIDB4MEYpOworI2VuZGlmCisKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcKKyAgICAgIGlmKGRvX3JvYW1pbmcpCisJaWYoV0FWRUxBTl9CRUFDT04oc2tiLT5kYXRhKSkKKwkgIHdsX3JvYW1fZ2F0aGVyKGRldiwgc2tiLT5kYXRhLCBzdGF0cyk7CisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisJICAKKyNpZmRlZiBXSVJFTEVTU19TUFkKKyAgICAgIHdsX3NweV9nYXRoZXIoZGV2LCBza2ItPm1hYy5yYXcgKyBXQVZFTEFOX0FERFJfU0laRSwgc3RhdHMpOworI2VuZGlmCS8qIFdJUkVMRVNTX1NQWSAqLworI2lmZGVmIEhJU1RPR1JBTQorICAgICAgd2xfaGlzX2dhdGhlcihkZXYsIHN0YXRzKTsKKyNlbmRpZgkvKiBISVNUT0dSQU0gKi8KKyAgICB9CisKKyAgLyoKKyAgICogSGFuZCB0aGUgcGFja2V0IHRvIHRoZSBOZXR3b3JrIE1vZHVsZQorICAgKi8KKyAgbmV0aWZfcngoc2tiKTsKKworICAvKiBLZWVwIHN0YXRzIHVwIHRvIGRhdGUgKi8KKyAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKyAgbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKyAgbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHNrc2l6ZTsKKworI2lmZGVmIERFQlVHX1JYX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9wYWNrZXRfcmVhZCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisgIHJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyIHRvIGluaXRpYXRlIGEKKyAqIHBhY2tldCB0cmFuc2ZlciBmcm9tIHRoZSBjYXJkIHRvIHRoZSBuZXR3b3JrIGludGVyZmFjZSBsYXllciBhYm92ZQorICogdGhpcyBkcml2ZXIuICBUaGlzIHJvdXRpbmUgY2hlY2tzIGlmIGEgYnVmZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorICogcmVjZWl2ZWQgYnkgdGhlIFdhdmVMQU4gY2FyZC4gIElmIHNvLCB0aGUgcm91dGluZSB3dl9wYWNrZXRfcmVhZCBpcworICogY2FsbGVkIHRvIGRvIHRoZSBhY3R1YWwgdHJhbnNmZXIgb2YgdGhlIGNhcmQncyBkYXRhIGluY2x1ZGluZyB0aGUKKyAqIGV0aGVybmV0IGhlYWRlciBpbnRvIGEgcGFja2V0IGNvbnNpc3Rpbmcgb2YgYW4gc2tfYnVmZiBjaGFpbi4KKyAqIChjYWxsZWQgYnkgd2F2ZWxhbl9pbnRlcnJ1cHQoKSkKKyAqIE5vdGUgOiB0aGUgc3BpbmxvY2sgaXMgYWxyZWFkeSBncmFiYmVkIGZvciB1cyBhbmQgaXJxIGFyZSBkaXNhYmxlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3dl9wYWNrZXRfcmN2KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgbmV0X2xvY2FsICoJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBpbnQJCW5ld3JmcDsKKyAgaW50CQlycDsKKyAgaW50CQlsZW47CisgIGludAkJZl9zdGFydDsKKyAgaW50CQlzdGF0dXM7CisgIGludAkJaTU5M19yZnA7CisgIGludAkJc3RhdF9wdHI7CisgIHVfY2hhcgljWzRdOworCisjaWZkZWYgREVCVUdfUlhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3BhY2tldF9yY3YoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisgIC8qIEdldCB0aGUgbmV3IHJlY2VpdmUgZnJhbWUgcG9pbnRlciBmcm9tIHRoZSBpODI1OTMgY2hpcCAqLworICBvdXRiKENSMF9TVEFUVVNfMiB8IE9QMF9OT1AsIExDQ1IoYmFzZSkpOworICBpNTkzX3JmcCA9IGluYihMQ1NSKGJhc2UpKTsKKyAgaTU5M19yZnAgfD0gaW5iKExDU1IoYmFzZSkpIDw8IDg7CisgIGk1OTNfcmZwICU9IFJYX1NJWkU7CisKKyAgLyogR2V0IHRoZSBuZXcgcmVjZWl2ZSBmcmFtZSBwb2ludGVyIGZyb20gdGhlIFdhdmVMQU4gY2FyZC4KKyAgICogSXQgaXMgMyBieXRlcyBtb3JlIHRoYW4gdGhlIGluY3JlbWVudCBvZiB0aGUgaTgyNTkzIHJlY2VpdmUKKyAgICogZnJhbWUgcG9pbnRlciwgZm9yIGVhY2ggcGFja2V0LiBUaGlzIGlzIGJlY2F1c2UgaXQgaW5jbHVkZXMgdGhlCisgICAqIDMgcm9hbWluZyBieXRlcyBhZGRlZCBieSB0aGUgbW1jLgorICAgKi8KKyAgbmV3cmZwID0gaW5iKFJQTEwoYmFzZSkpOworICBuZXdyZnAgfD0gaW5iKFJQTEgoYmFzZSkpIDw8IDg7CisgIG5ld3JmcCAlPSBSWF9TSVpFOworCisjaWZkZWYgREVCVUdfUlhfSU5GTworICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X3BhY2tldF9yY3YoKTogaTU5M19yZnAgJWQgc3RvcCAlZCBuZXdyZnAgJWQgbHAtPnJmcCAlZFxuIiwKKwkgZGV2LT5uYW1lLCBpNTkzX3JmcCwgbHAtPnN0b3AsIG5ld3JmcCwgbHAtPnJmcCk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX1JYX0VSUk9SCisgIC8qIElmIG5vIG5ldyBmcmFtZSBwb2ludGVyLi4uICovCisgIGlmKGxwLT5vdmVycnVubmluZyB8fCBuZXdyZnAgPT0gbHAtPnJmcCkKKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfcGFja2V0X3JjdigpOiBubyBuZXcgZnJhbWU6IGk1OTNfcmZwICVkIHN0b3AgJWQgbmV3cmZwICVkIGxwLT5yZnAgJWRcbiIsCisJICAgZGV2LT5uYW1lLCBpNTkzX3JmcCwgbHAtPnN0b3AsIG5ld3JmcCwgbHAtPnJmcCk7CisjZW5kaWYKKworICAvKiBSZWFkIGFsbCBmcmFtZXMgKHBhY2tldHMpIHJlY2VpdmVkICovCisgIHdoaWxlKG5ld3JmcCAhPSBscC0+cmZwKQorICAgIHsKKyAgICAgIC8qIEEgZnJhbWUgaXMgY29tcG9zZWQgb2YgdGhlIHBhY2tldCwgZm9sbG93ZWQgYnkgYSBzdGF0dXMgd29yZCwKKyAgICAgICAqIHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lICh3b3JkKSBhbmQgdGhlIG1tYyBpbmZvIChTTlIgJiBxdWFsKS4KKyAgICAgICAqIEl0J3MgYmVjYXVzZSB0aGUgbGVuZ3RoIGlzIGF0IHRoZSBlbmQgdGhhdCB3ZSBjYW4gb25seSBzY2FuCisgICAgICAgKiBmcmFtZXMgYmFja3dhcmQuICovCisKKyAgICAgIC8qIEZpbmQgdGhlIGZpcnN0IGZyYW1lIGJ5IHNraXBwaW5nIGJhY2t3YXJkcyBvdmVyIHRoZSBmcmFtZXMgKi8KKyAgICAgIHJwID0gbmV3cmZwOwkvKiBFbmQgb2YgbGFzdCBmcmFtZSAqLworICAgICAgd2hpbGUoKChmX3N0YXJ0ID0gd3Zfc3RhcnRfb2ZfZnJhbWUoZGV2LCBycCwgbmV3cmZwKSkgIT0gbHAtPnJmcCkgJiYKKwkgICAgKGZfc3RhcnQgIT0gLTEpKQorCSAgcnAgPSBmX3N0YXJ0OworCisgICAgICAvKiBJZiB3ZSBoYWQgYSBwcm9ibGVtICovCisgICAgICBpZihmX3N0YXJ0ID09IC0xKQorCXsKKyNpZmRlZiBERUJVR19SWF9FUlJPUgorCSAgcHJpbnRrKEtFUk5fSU5GTyAid2F2ZWxhbl9jczogY2Fubm90IGZpbmQgc3RhcnQgb2YgZnJhbWUgIik7CisJICBwcmludGsoIiBpNTkzX3JmcCAlZCBzdG9wICVkIG5ld3JmcCAlZCBscC0+cmZwICVkXG4iLAorCQkgaTU5M19yZnAsIGxwLT5zdG9wLCBuZXdyZnAsIGxwLT5yZnApOworI2VuZGlmCisJICBscC0+cmZwID0gcnA7CQkvKiBHZXQgdG8gdGhlIGxhc3QgdXNhYmxlIGZyYW1lICovCisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIGZfc3RhcnQgcG9pbnQgdG8gdGhlIGJlZ2dpbmluZyBvZiB0aGUgZmlyc3QgZnJhbWUgcmVjZWl2ZWQKKyAgICAgICAqIGFuZCBycCB0byB0aGUgYmVnZ2luaW5nIG9mIHRoZSBuZXh0IG9uZSAqLworCisgICAgICAvKiBSZWFkIHN0YXR1cyAmIGxlbmd0aCBvZiB0aGUgZnJhbWUgKi8KKyAgICAgIHN0YXRfcHRyID0gKHJwIC0gNyArIFJYX1NJWkUpICUgUlhfU0laRTsKKyAgICAgIHN0YXRfcHRyID0gcmVhZF9yaW5nYnVmKGRldiwgc3RhdF9wdHIsIGMsIDQpOworICAgICAgc3RhdHVzID0gY1swXSB8IChjWzFdIDw8IDgpOworICAgICAgbGVuID0gY1syXSB8IChjWzNdIDw8IDgpOworCisgICAgICAvKiBDaGVjayBzdGF0dXMgKi8KKyAgICAgIGlmKChzdGF0dXMgJiBSWF9SQ1ZfT0spICE9IFJYX1JDVl9PSykKKwl7CisJICBscC0+c3RhdHMucnhfZXJyb3JzKys7CisJICBpZihzdGF0dXMgJiBSWF9OT19TRkQpCisJICAgIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkgIGlmKHN0YXR1cyAmIFJYX0NSQ19FUlIpCisJICAgIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJICBpZihzdGF0dXMgJiBSWF9PVlJSVU4pCisJICAgIGxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCisjaWZkZWYgREVCVUdfUlhfRkFJTAorCSAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9wYWNrZXRfcmN2KCk6IHBhY2tldCBub3QgcmVjZWl2ZWQgb2ssIHN0YXR1cyA9IDB4JXhcbiIsCisJCSBkZXYtPm5hbWUsIHN0YXR1cyk7CisjZW5kaWYKKwl9CisgICAgICBlbHNlCisJLyogUmVhZCB0aGUgcGFja2V0IGFuZCB0cmFuc21pdCB0byBMaW51eCAqLworCXd2X3BhY2tldF9yZWFkKGRldiwgZl9zdGFydCwgbGVuIC0gMik7CisKKyAgICAgIC8qIE9uZSBmcmFtZSBoYXMgYmVlbiBwcm9jZXNzZWQsIHNraXAgaXQgKi8KKyAgICAgIGxwLT5yZnAgPSBycDsKKyAgICB9CisKKyAgLyoKKyAgICogVXBkYXRlIHRoZSBmcmFtZSBzdG9wIHJlZ2lzdGVyLCBidXQgc2V0IGl0IHRvIGxlc3MgdGhhbgorICAgKiB0aGUgZnVsbCA4SyB0byBhbGxvdyBzcGFjZSBmb3IgMyBieXRlcyBvZiBzaWduYWwgc3RyZW5ndGgKKyAgICogcGVyIHBhY2tldC4KKyAgICovCisgIGxwLT5zdG9wID0gKGk1OTNfcmZwICsgUlhfU0laRSAtICgoUlhfU0laRSAvIDY0KSAqIDMpKSAlIFJYX1NJWkU7CisgIG91dGIoT1AwX1NXSVRfVE9fUE9SVF8xIHwgQ1IwX0NITkwsIExDQ1IoYmFzZSkpOworICBvdXRiKENSMV9TVE9QX1JFR19VUERBVEUgfCAobHAtPnN0b3AgPj4gUlhfU0laRV9TSElGVCksIExDQ1IoYmFzZSkpOworICBvdXRiKE9QMV9TV0lUX1RPX1BPUlRfMCwgTENDUihiYXNlKSk7CisKKyNpZmRlZiBERUJVR19SWF9UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcGFja2V0X3JjdigpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBQQUNLRVQgVFJBTlNNSVNTSU9OICoqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoaXMgcGFydCBkZWFsIHdpdGggc2VuZGluZyBwYWNrZXQgdGhyb3VnaCB0aGUgd2F2ZWxhbgorICogV2UgY29weSB0aGUgcGFja2V0IHRvIHRoZSBzZW5kIGJ1ZmZlciBhbmQgdGhlbiBpc3N1ZSB0aGUgc2VuZAorICogY29tbWFuZCB0byB0aGUgaTgyNTkzLiBUaGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uIHdpbGwgYmUKKyAqIGNoZWNrZWQgaW4gd2F2ZWxhbl9pbnRlcnJ1cHQoKQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgZmlsbHMgaW4gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhbmQgbWVtb3J5CisgKiBsb2NhdGlvbnMgb24gdGhlIFdhdmVMQU4gY2FyZCBhbmQgc3RhcnRzIHRoZSBjYXJkIG9mZiBvbgorICogdGhlIHRyYW5zbWl0LgorICogKGNhbGxlZCBpbiB3YXZlbGFuX3BhY2tldF94bWl0KCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAord3ZfcGFja2V0X3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCQl2b2lkICoJCWJ1ZiwKKwkJc2hvcnQJCWxlbmd0aCkKK3sKKyAgbmV0X2xvY2FsICoJCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAga2lvX2FkZHJfdAkJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICB1bnNpZ25lZCBsb25nCQlmbGFnczsKKyAgaW50CQkJY2xlbiA9IGxlbmd0aDsKKyAgcmVnaXN0ZXIgdV9zaG9ydAl4bXRkYXRhX2Jhc2UgPSBUWF9CQVNFOworCisjaWZkZWYgREVCVUdfVFhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3BhY2tldF93cml0ZSglZClcbiIsIGRldi0+bmFtZSwgbGVuZ3RoKTsKKyNlbmRpZgorCisgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAvKiBXcml0ZSB0aGUgbGVuZ3RoIG9mIGRhdGEgYnVmZmVyIGZvbGxvd2VkIGJ5IHRoZSBidWZmZXIgKi8KKyAgb3V0Yih4bXRkYXRhX2Jhc2UgJiAweGZmLCBQSU9STChiYXNlKSk7CisgIG91dGIoKCh4bXRkYXRhX2Jhc2UgPj4gOCkgJiBQSU9SSF9NQVNLKSB8IFBJT1JIX1NFTF9UWCwgUElPUkgoYmFzZSkpOworICBvdXRiKGNsZW4gJiAweGZmLCBQSU9QKGJhc2UpKTsJLyogbHNiICovCisgIG91dGIoY2xlbiA+PiA4LCBQSU9QKGJhc2UpKTsgIAkvKiBtc2IgKi8KKworICAvKiBTZW5kIHRoZSBkYXRhICovCisgIG91dHNiKFBJT1AoYmFzZSksIGJ1ZiwgY2xlbik7CisKKyAgLyogSW5kaWNhdGUgZW5kIG9mIHRyYW5zbWl0IGNoYWluICovCisgIG91dGIoT1AwX05PUCwgUElPUChiYXNlKSk7CisgIC8qIGpvc3VsbHZuQGNzLmNtdS5lZHU6IG5lZWQgdG8gc2VuZCBhIHNlY29uZCBOT1AgZm9yIGFsaWdubWVudC4uLiAqLworICBvdXRiKE9QMF9OT1AsIFBJT1AoYmFzZSkpOworCisgIC8qIFJlc2V0IHRoZSB0cmFuc21pdCBETUEgcG9pbnRlciAqLworICBoYWNyX3dyaXRlX3Nsb3coYmFzZSwgSEFDUl9QV1JfU1RBVCB8IEhBQ1JfVFhfRE1BX1JFU0VUKTsKKyAgaGFjcl93cml0ZShiYXNlLCBIQUNSX0RFRkFVTFQpOworICAvKiBTZW5kIHRoZSB0cmFuc21pdCBjb21tYW5kICovCisgIHd2XzgyNTkzX2NtZChkZXYsICJ3dl9wYWNrZXRfd3JpdGUoKTogdHJhbnNtaXQiLAorCSAgICAgICBPUDBfVFJBTlNNSVQsIFNSMF9OT19SRVNVTFQpOworCisgIC8qIE1ha2Ugc3VyZSB0aGUgd2F0Y2hkb2cgd2lsbCBrZWVwIHF1aWV0IGZvciBhIHdoaWxlICovCisgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisgIC8qIEtlZXAgc3RhdHMgdXAgdG8gZGF0ZSAqLworICBscC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuZ3RoOworCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisjaWZkZWYgREVCVUdfVFhfSU5GTworICB3dl9wYWNrZXRfaW5mbygodV9jaGFyICopIGJ1ZiwgbGVuZ3RoLCBkZXYtPm5hbWUsICJ3dl9wYWNrZXRfd3JpdGUiKTsKKyNlbmRpZgkvKiBERUJVR19UWF9JTkZPICovCisKKyNpZmRlZiBERUJVR19UWF9UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcGFja2V0X3dyaXRlKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB3ZSB3YW50IHRvIHNlbmQgYSBwYWNrZXQgKE5FVDMgY2FsbGJhY2spCisgKiBJbiB0aGlzIHJvdXRpbmUsIHdlIGNoZWNrIGlmIHRoZSBoYXJ3YXJlIGlzIHJlYWR5IHRvIGFjY2VwdAorICogdGhlIHBhY2tldC4gV2UgYWxzbyBwcmV2ZW50IHJlZW50cmFuY2UuIFRoZW4sIHdlIGNhbGwgdGhlIGZ1bmN0aW9uCisgKiB0byBzZW5kIHRoZSBwYWNrZXQuLi4KKyAqLworc3RhdGljIGludAord2F2ZWxhbl9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqCXNrYiwKKwkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICoJCWRldikKK3sKKyAgbmV0X2xvY2FsICoJCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKyNpZmRlZiBERUJVR19UWF9UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d2F2ZWxhbl9wYWNrZXRfeG1pdCgweCVYKVxuIiwgZGV2LT5uYW1lLAorCSAodW5zaWduZWQpIHNrYik7CisjZW5kaWYKKworICAvKgorICAgKiBCbG9jayBhIHRpbWVyLWJhc2VkIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcgYSBwcmV2aW91cyB0cmFuc21pdC4KKyAgICogSW4gb3RoZXIgd29yZHMsIHByZXZlbnQgcmVlbnRlcmluZyB0aGlzIHJvdXRpbmUuCisgICAqLworICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgLyogSWYgc29tZWJvZHkgaGFzIGFza2VkIHRvIHJlY29uZmlndXJlIHRoZSBjb250cm9sbGVyLAorICAgKiB3ZSBjYW4gZG8gaXQgbm93ICovCisgIGlmKGxwLT5yZWNvbmZpZ184MjU5MykKKyAgICB7CisgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICAgICAgd3ZfODI1OTNfY29uZmlnKGRldik7CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsJLyogUmUtZW5hYmxlIGludGVycnVwdHMgKi8KKyAgICAgIC8qIE5vdGUgOiB0aGUgY29uZmlndXJlIHByb2NlZHVyZSB3YXMgdG90YWxseSBzeW5jaHJvbm91cywKKyAgICAgICAqIHNvIHRoZSBUeCBidWZmZXIgaXMgbm93IGZyZWUgKi8KKyAgICB9CisKKyNpZmRlZiBERUJVR19UWF9FUlJPUgorCWlmIChza2ItPm5leHQpCisJCXByaW50ayhLRVJOX0lORk8gInNrYiBoYXMgbmV4dFxuIik7CisjZW5kaWYKKworCS8qIENoZWNrIGlmIHdlIG5lZWQgc29tZSBwYWRkaW5nICovCisJLyogTm90ZSA6IG9uIHdpcmVsZXNzIHRoZSBwcm9wYWdhdGlvbiB0aW1lIGlzIGluIHRoZSBvcmRlciBvZiAxdXMsCisJICogYW5kIHdlIGRvbid0IGhhdmUgdGhlIEV0aGVybmV0IHNwZWNpZmljIHJlcXVpcmVtZW50IG9mIGJlZWluZworCSAqIGFibGUgdG8gZGV0ZWN0IGNvbGxpc2lvbnMsIHRoZXJlZm9yZSBpbiB0aGVvcnkgd2UgZG9uJ3QgcmVhbGx5CisJICogbmVlZCB0byBwYWQuIEplYW4gSUkgKi8KKwlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCX0KKworICB3dl9wYWNrZXRfd3JpdGUoZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworICBkZXZfa2ZyZWVfc2tiKHNrYik7CisKKyNpZmRlZiBERUJVR19UWF9UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9wYWNrZXRfeG1pdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisgIHJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKiogSEFSRFdBUkUgQ09ORklHVVJBVElPTiAqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoaXMgcGFydCBkbyB0aGUgcmVhbCBqb2Igb2Ygc3RhcnRpbmcgYW5kIGNvbmZpZ3VyaW5nIHRoZSBoYXJkd2FyZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUm91dGluZSB0byBpbml0aWFsaXplIHRoZSBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIuCisgKiAoY2FsbGVkIGJ5IHd2X2h3X2NvbmZpZygpKQorICovCitzdGF0aWMgaW5saW5lIGludAord3ZfbW1jX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIGtpb19hZGRyX3QJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICBwc2FfdAkJcHNhOworICBtbXdfdAkJbTsKKyAgaW50CQljb25maWd1cmVkOworICBpbnQJCWk7CQkvKiBMb29wIGNvdW50ZXIgKi8KKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfbW1jX2luaXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisgIC8qIFJlYWQgdGhlIHBhcmFtZXRlciBzdG9yYWdlIGFyZWEgKi8KKyAgcHNhX3JlYWQoZGV2LCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisKKyAgLyoKKyAgICogQ2hlY2sgdGhlIGZpcnN0IHRocmVlIG9jdGV0cyBvZiB0aGUgTUFDIGFkZHIgZm9yIHRoZSBtYW51ZmFjdHVyZXIncyBjb2RlLgorICAgKiBOb3RlOiBJZiB5b3UgZ2V0IHRoZSBlcnJvciBtZXNzYWdlIGJlbG93LCB5b3UndmUgZ290IGEKKyAgICogbm9uLU5DUi9BVCZUL0x1Y2VudCBQQ01DSUEgY2FyZHMsIHNlZSB3YXZlbGFuX2NzLmggZm9yIGRldGFpbCBvbgorICAgKiBob3cgdG8gY29uZmlndXJlIHlvdXIgY2FyZC4uLgorICAgKi8KKyAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZihNQUNfQUREUkVTU0VTKSAvIHNpemVvZihjaGFyKSAvIDMpOyBpKyspCisgICAgaWYoKHBzYS5wc2FfdW5pdl9tYWNfYWRkclswXSA9PSBNQUNfQUREUkVTU0VTW2ldWzBdKSAmJgorICAgICAgIChwc2EucHNhX3VuaXZfbWFjX2FkZHJbMV0gPT0gTUFDX0FERFJFU1NFU1tpXVsxXSkgJiYKKyAgICAgICAocHNhLnBzYV91bml2X21hY19hZGRyWzJdID09IE1BQ19BRERSRVNTRVNbaV1bMl0pKQorICAgICAgYnJlYWs7CisKKyAgLyogSWYgd2UgaGF2ZSBub3QgZm91bmQgaXQuLi4gKi8KKyAgaWYoaSA9PSAoc2l6ZW9mKE1BQ19BRERSRVNTRVMpIC8gc2l6ZW9mKGNoYXIpIC8gMykpCisgICAgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUlMKKyAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3dl9tbWNfaW5pdCgpOiBJbnZhbGlkIE1BQyBhZGRyZXNzOiAlMDJYOiUwMlg6JTAyWDouLi5cbiIsCisJICAgICBkZXYtPm5hbWUsIHBzYS5wc2FfdW5pdl9tYWNfYWRkclswXSwKKwkgICAgIHBzYS5wc2FfdW5pdl9tYWNfYWRkclsxXSwgcHNhLnBzYV91bml2X21hY19hZGRyWzJdKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCisgIG1lbWNweSgmZGV2LT5kZXZfYWRkclswXSwgJnBzYS5wc2FfdW5pdl9tYWNfYWRkclswXSwgV0FWRUxBTl9BRERSX1NJWkUpOworCisjaWZkZWYgVVNFX1BTQV9DT05GSUcKKyAgY29uZmlndXJlZCA9IHBzYS5wc2FfY29uZl9zdGF0dXMgJiAxOworI2Vsc2UKKyAgY29uZmlndXJlZCA9IDA7CisjZW5kaWYKKworICAvKiBJcyB0aGUgUFNBIGlzIG5vdCBjb25maWd1cmVkICovCisgIGlmKCFjb25maWd1cmVkKQorICAgIHsKKyAgICAgIC8qIFVzZXIgd2lsbCBiZSBhYmxlIHRvIGNvbmZpZ3VyZSBOV0lEIGFmdGVyICh3aXRoIGl3Y29uZmlnKSAqLworICAgICAgcHNhLnBzYV9ud2lkWzBdID0gMDsKKyAgICAgIHBzYS5wc2FfbndpZFsxXSA9IDA7CisKKyAgICAgIC8qIEFzIE5XSUQgaXMgbm90IHNldCA6IG5vIE5XSUQgY2hlY2tpbmcgKi8KKyAgICAgIHBzYS5wc2FfbndpZF9zZWxlY3QgPSAwOworCisgICAgICAvKiBEaXNhYmxlIGVuY3J5cHRpb24gKi8KKyAgICAgIHBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgPSAwOworCisgICAgICAvKiBTZXQgdG8gc3RhbmRhcmQgdmFsdWVzCisgICAgICAgKiAweDA0IGZvciBBVCwKKyAgICAgICAqIDB4MDEgZm9yIE1DQSwKKyAgICAgICAqIDB4MDQgZm9yIFBDTUNJQSBhbmQgMi4wMCBjYXJkIChBVCZUIDQwNy0wMjQ2ODkvRSBkb2N1bWVudCkKKyAgICAgICAqLworICAgICAgaWYgKHBzYS5wc2FfY29tcF9udW1iZXIgJiAxKQorCXBzYS5wc2FfdGhyX3ByZV9zZXQgPSAweDAxOworICAgICAgZWxzZQorCXBzYS5wc2FfdGhyX3ByZV9zZXQgPSAweDA0OworICAgICAgcHNhLnBzYV9xdWFsaXR5X3RociA9IDB4MDM7CisKKyAgICAgIC8qIEl0IGlzIGNvbmZpZ3VyZWQgKi8KKyAgICAgIHBzYS5wc2FfY29uZl9zdGF0dXMgfD0gMTsKKworI2lmZGVmIFVTRV9QU0FfQ09ORklHCisgICAgICAvKiBXcml0ZSB0aGUgcHNhICovCisgICAgICBwc2Ffd3JpdGUoZGV2LCAoY2hhciAqKXBzYS5wc2FfbndpZCAtIChjaGFyICopJnBzYSwKKwkJKHVuc2lnbmVkIGNoYXIgKilwc2EucHNhX253aWQsIDQpOworICAgICAgcHNhX3dyaXRlKGRldiwgKGNoYXIgKikmcHNhLnBzYV90aHJfcHJlX3NldCAtIChjaGFyICopJnBzYSwKKwkJKHVuc2lnbmVkIGNoYXIgKikmcHNhLnBzYV90aHJfcHJlX3NldCwgMSk7CisgICAgICBwc2Ffd3JpdGUoZGV2LCAoY2hhciAqKSZwc2EucHNhX3F1YWxpdHlfdGhyIC0gKGNoYXIgKikmcHNhLAorCQkodW5zaWduZWQgY2hhciAqKSZwc2EucHNhX3F1YWxpdHlfdGhyLCAxKTsKKyAgICAgIHBzYV93cml0ZShkZXYsIChjaGFyICopJnBzYS5wc2FfY29uZl9zdGF0dXMgLSAoY2hhciAqKSZwc2EsCisJCSh1bnNpZ25lZCBjaGFyICopJnBzYS5wc2FfY29uZl9zdGF0dXMsIDEpOworICAgICAgLyogdXBkYXRlIHRoZSBXYXZlbGFuIGNoZWNrc3VtICovCisgICAgICB1cGRhdGVfcHNhX2NoZWNrc3VtKGRldik7CisjZW5kaWYJLyogVVNFX1BTQV9DT05GSUcgKi8KKyAgICB9CisKKyAgLyogWmVybyB0aGUgbW1jIHN0cnVjdHVyZSAqLworICBtZW1zZXQoJm0sIDB4MDAsIHNpemVvZihtKSk7CisKKyAgLyogQ29weSBQU0EgaW5mbyB0byB0aGUgbW1jICovCisgIG0ubW13X25ldHdfaWRfbCA9IHBzYS5wc2FfbndpZFsxXTsKKyAgbS5tbXdfbmV0d19pZF9oID0gcHNhLnBzYV9ud2lkWzBdOworICAKKyAgaWYocHNhLnBzYV9ud2lkX3NlbGVjdCAmIDEpCisgICAgbS5tbXdfbG9vcHRfc2VsID0gMHgwMDsKKyAgZWxzZQorICAgIG0ubW13X2xvb3B0X3NlbCA9IE1NV19MT09QVF9TRUxfRElTX05XSUQ7CisKKyAgbWVtY3B5KCZtLm1td19lbmNyX2tleSwgJnBzYS5wc2FfZW5jcnlwdGlvbl9rZXksIAorCSBzaXplb2YobS5tbXdfZW5jcl9rZXkpKTsKKworICBpZihwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0KQorICAgIG0ubW13X2VuY3JfZW5hYmxlID0gTU1XX0VOQ1JfRU5BQkxFX0VOIHwgTU1XX0VOQ1JfRU5BQkxFX01PREU7CisgIGVsc2UKKyAgICBtLm1td19lbmNyX2VuYWJsZSA9IDA7CisKKyAgbS5tbXdfdGhyX3ByZV9zZXQgPSBwc2EucHNhX3Rocl9wcmVfc2V0ICYgMHgzRjsKKyAgbS5tbXdfcXVhbGl0eV90aHIgPSBwc2EucHNhX3F1YWxpdHlfdGhyICYgMHgwRjsKKworICAvKgorICAgKiBTZXQgZGVmYXVsdCBtb2RlbSBjb250cm9sIHBhcmFtZXRlcnMuCisgICAqIFNlZSBOQ1IgZG9jdW1lbnQgNDA3LTAwMjQzMjYgUmV2LiBBLgorICAgKi8KKyAgbS5tbXdfamFiYmVyX2VuYWJsZSA9IDB4MDE7CisgIG0ubW13X2FudGVuX3NlbCA9IE1NV19BTlRFTl9TRUxfQUxHX0VOOworICBtLm1td19pZnMgPSAweDIwOworICBtLm1td19tb2RfZGVsYXkgPSAweDA0OworICBtLm1td19qYW1fdGltZSA9IDB4Mzg7CisKKyAgbS5tbXdfZGVzX2lvX2ludmVydCA9IDA7CisgIG0ubW13X2ZyZWV6ZSA9IDA7CisgIG0ubW13X2RlY2F5X3BybSA9IDA7CisgIG0ubW13X2RlY2F5X3VwZGF0X3BybSA9IDA7CisKKyAgLyogV3JpdGUgYWxsIGluZm8gdG8gbW1jICovCisgIG1tY193cml0ZShiYXNlLCAwLCAodV9jaGFyICopJm0sIHNpemVvZihtKSk7CisKKyAgLyogVGhlIGZvbGxvd2luZyBjb2RlIHN0YXJ0IHRoZSBtb2RlbSBvZiB0aGUgMi4wMCBmcmVxdWVuY3kKKyAgICogc2VsZWN0YWJsZSBjYXJkcyBhdCBwb3dlciBvbi4gSXQncyBub3Qgc3RyaWN0bHkgbmVlZGVkIGZvciB0aGUKKyAgICogZm9sbG93aW5nIGJvb3RzLi4uCisgICAqIFRoZSBvcmlnaW5hbCBwYXRjaCB3YXMgYnkgSm9lIEZpbm5leSBmb3IgdGhlIFBDTUNJQSBkcml2ZXIsIGJ1dAorICAgKiBJJ3ZlIGNsZWFuZWQgaXQgYSBiaXQgYW5kIGFkZCBkb2N1bWVudGF0aW9uLgorICAgKiBUaGFua3MgdG8gTG9la2UgQnJlZGVydmVsZCBmcm9tIEx1Y2VudCBmb3IgdGhlIGluZm8uCisgICAqLworCisgIC8qIEF0dGVtcHQgdG8gcmVjb2duaXNlIDIuMDAgY2FyZHMgKDIuNCBHSHogZnJlcXVlbmN5IHNlbGVjdGFibGUpCisgICAqIChkb2VzIGl0IHdvcmsgZm9yIGV2ZXJ5Ym9keSA/IC0gZXNwZWNpYWxseSBvbGQgY2FyZHMuLi4pICovCisgIC8qIE5vdGUgOiBXRlJFUVNFTCB2ZXJpZnkgdGhhdCBpdCBpcyBhYmxlIHRvIHJlYWQgZnJvbSBFRXByb20KKyAgICogYSBzZW5zaWJsZSBmcmVxdWVuY3kgKGFkZHJlc3MgMHgwMCkgKyB0aGF0IE1NUl9GRUVfU1RBVFVTX0lECisgICAqIGlzIDB4QSAoWGlsaW54IHZlcnNpb24pIG9yIDB4QiAoQXJpYWRuZSB2ZXJzaW9uKS4KKyAgICogTXkgdGVzdCBpcyBtb3JlIGNydWRlIGJ1dCBkbyB3b3JrLi4uICovCisgIGlmKCEobW1jX2luKGJhc2UsIG1tcm9mZigwLCBtbXJfZmVlX3N0YXR1cykpICYKKyAgICAgICAoTU1SX0ZFRV9TVEFUVVNfRFdMRCB8IE1NUl9GRUVfU1RBVFVTX0JVU1kpKSkKKyAgICB7CisgICAgICAvKiBXZSBtdXN0IGRvd25sb2FkIHRoZSBmcmVxdWVuY3kgcGFyYW1ldGVycyB0byB0aGUKKyAgICAgICAqIHN5bnRoZXRpc2VycyAoZnJvbSB0aGUgRUVwcm9tIC0gYXJlYSAxKQorICAgICAgICogTm90ZSA6IGFzIHRoZSBFRXByb20gaXMgYXV0byBkZWNyZW1lbnRlZCwgd2Ugc2V0IHRoZSBlbmQKKyAgICAgICAqIGlmIHRoZSBhcmVhLi4uICovCisgICAgICBtLm1td19mZWVfYWRkciA9IDB4MEY7CisgICAgICBtLm1td19mZWVfY3RybCA9IE1NV19GRUVfQ1RSTF9SRUFEIHwgTU1XX0ZFRV9DVFJMX0RXTEQ7CisgICAgICBtbWNfd3JpdGUoYmFzZSwgKGNoYXIgKikmbS5tbXdfZmVlX2N0cmwgLSAoY2hhciAqKSZtLAorCQkodW5zaWduZWQgY2hhciAqKSZtLm1td19mZWVfY3RybCwgMik7CisKKyAgICAgIC8qIFdhaXQgdW50aWwgdGhlIGRvd25sb2FkIGlzIGZpbmlzaGVkICovCisgICAgICBmZWVfd2FpdChiYXNlLCAxMDAsIDEwMCk7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworICAgICAgLyogVGhlIGZyZXF1ZW5jeSB3YXMgaW4gdGhlIGxhc3Qgd29yZCBkb3dubG9hZGVkLi4uICovCisgICAgICBtbWNfcmVhZChiYXNlLCAoY2hhciAqKSZtLm1td19mZWVfZGF0YV9sIC0gKGNoYXIgKikmbSwKKwkgICAgICAgKHVuc2lnbmVkIGNoYXIgKikmbS5tbXdfZmVlX2RhdGFfbCwgMik7CisKKyAgICAgIC8qIFByaW50IHNvbWUgaW5mbyBmb3IgdGhlIHVzZXIgKi8KKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogV2F2ZWxhbiAyLjAwIHJlY29nbmlzZWQgKGZyZXF1ZW5jeSBzZWxlY3QpIDogQ3VycmVudCBmcmVxdWVuY3kgPSAlbGRcbiIsCisJICAgICBkZXYtPm5hbWUsCisJICAgICAoKG0ubW13X2ZlZV9kYXRhX2ggPDwgNCkgfAorCSAgICAgIChtLm1td19mZWVfZGF0YV9sID4+IDQpKSAqIDUgLyAyICsgMjQwMDBMKTsKKyNlbmRpZgorCisgICAgICAvKiBXZSBtdXN0IG5vdyBkb3dubG9hZCB0aGUgcG93ZXIgYWRqdXN0IHZhbHVlIChnYWluKSB0bworICAgICAgICogdGhlIHN5bnRoZXRpc2VycyAoZnJvbSB0aGUgRUVwcm9tIC0gYXJlYSA3IC0gREFDKSAqLworICAgICAgbS5tbXdfZmVlX2FkZHIgPSAweDYxOworICAgICAgbS5tbXdfZmVlX2N0cmwgPSBNTVdfRkVFX0NUUkxfUkVBRCB8IE1NV19GRUVfQ1RSTF9EV0xEOworICAgICAgbW1jX3dyaXRlKGJhc2UsIChjaGFyICopJm0ubW13X2ZlZV9jdHJsIC0gKGNoYXIgKikmbSwKKwkJKHVuc2lnbmVkIGNoYXIgKikmbS5tbXdfZmVlX2N0cmwsIDIpOworCisgICAgICAvKiBXYWl0IHVudGlsIHRoZSBkb3dubG9hZCBpcyBmaW5pc2hlZCAqLworICAgIH0JLyogaWYgMi4wMCBjYXJkICovCisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X21tY19pbml0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSb3V0aW5lIHRvIGdyYWNlZnVsbHkgdHVybiBvZmYgcmVjZXB0aW9uLCBhbmQgd2FpdCBmb3IgYW55IGNvbW1hbmRzCisgKiB0byBjb21wbGV0ZS4KKyAqIChjYWxsZWQgaW4gd3ZfcnVfc3RhcnQoKSBhbmQgd2F2ZWxhbl9jbG9zZSgpIGFuZCB3YXZlbGFuX2V2ZW50KCkpCisgKi8KK3N0YXRpYyBpbnQKK3d2X3J1X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIGtpb19hZGRyX3QJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICBuZXRfbG9jYWwgKglscCA9IG5ldGRldl9wcml2KGRldik7CisgIHVuc2lnbmVkIGxvbmcJZmxhZ3M7CisgIGludAkJc3RhdHVzOworICBpbnQJCXNwaW47CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3J1X3N0b3AoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAvKiBGaXJzdCwgc2VuZCB0aGUgTEFOIGNvbnRyb2xsZXIgYSBzdG9wIHJlY2VpdmUgY29tbWFuZCAqLworICB3dl84MjU5M19jbWQoZGV2LCAid3ZfZ3JhY2VmdWxfc2h1dGRvd24oKTogc3RvcC1yY3YiLAorCSAgICAgICBPUDBfU1RPUF9SQ1YsIFNSMF9OT19SRVNVTFQpOworCisgIC8qIFRoZW4sIHNwaW4gdW50aWwgdGhlIHJlY2VpdmUgdW5pdCBnb2VzIGlkbGUgKi8KKyAgc3BpbiA9IDMwMDsKKyAgZG8KKyAgICB7CisgICAgICB1ZGVsYXkoMTApOworICAgICAgb3V0YihPUDBfTk9QIHwgQ1IwX1NUQVRVU18zLCBMQ0NSKGJhc2UpKTsKKyAgICAgIHN0YXR1cyA9IGluYihMQ1NSKGJhc2UpKTsKKyAgICB9CisgIHdoaWxlKCgoc3RhdHVzICYgU1IzX1JDVl9TVEFURV9NQVNLKSAhPSBTUjNfUkNWX0lETEUpICYmIChzcGluLS0gPiAwKSk7CisKKyAgLyogTm93LCBzcGluIHVudGlsIHRoZSBjaGlwIGZpbmlzaGVzIGV4ZWN1dGluZyBpdHMgY3VycmVudCBjb21tYW5kICovCisgIGRvCisgICAgeworICAgICAgdWRlbGF5KDEwKTsKKyAgICAgIG91dGIoT1AwX05PUCB8IENSMF9TVEFUVVNfMywgTENDUihiYXNlKSk7CisgICAgICBzdGF0dXMgPSBpbmIoTENTUihiYXNlKSk7CisgICAgfQorICB3aGlsZSgoKHN0YXR1cyAmIFNSM19FWEVDX1NUQVRFX01BU0spICE9IFNSM19FWEVDX0lETEUpICYmIChzcGluLS0gPiAwKSk7CisKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgLyogSWYgdGhlcmUgd2FzIGEgcHJvYmxlbSAqLworICBpZihzcGluIDw9IDApCisgICAgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUlMKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9ydV9zdG9wKCk6IFRoZSBjaGlwIGRvZXNuJ3Qgd2FudCB0byBzdG9wLi4uXG4iLAorCSAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcnVfc3RvcCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisgIHJldHVybiBUUlVFOworfSAvKiB3dl9ydV9zdG9wICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgc3RhcnRzIHRoZSByZWNlaXZlIHVuaXQgcnVubmluZy4gIEZpcnN0LCBpdCBjaGVja3MgaWYKKyAqIHRoZSBjYXJkIGlzIGFjdHVhbGx5IHJlYWR5LiBUaGVuIHRoZSBjYXJkIGlzIGluc3RydWN0ZWQgdG8gcmVjZWl2ZQorICogcGFja2V0cyBhZ2Fpbi4KKyAqIChjYWxsZWQgaW4gd3ZfaHdfcmVzZXQoKSAmIHdhdmVsYW5fb3BlbigpKQorICovCitzdGF0aWMgaW50Cit3dl9ydV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAga2lvX2FkZHJfdAliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIG5ldF9sb2NhbCAqCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfcnVfc3RhcnQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisgIC8qCisgICAqIFdlIG5lZWQgdG8gc3RhcnQgZnJvbSBhIHF1aWVzY2VudCBzdGF0ZS4gVG8gZG8gc28sIHdlIGNvdWxkIGNoZWNrCisgICAqIGlmIHRoZSBjYXJkIGlzIGFscmVhZHkgcnVubmluZywgYnV0IGluc3RlYWQgd2UganVzdCB0cnkgdG8gc2h1dAorICAgKiBpdCBkb3duLiBGaXJzdCwgd2UgZGlzYWJsZSByZWNlcHRpb24gKGluIGNhc2UgaXQgd2FzIGFscmVhZHkgZW5hYmxlZCkuCisgICAqLworICBpZighd3ZfcnVfc3RvcChkZXYpKQorICAgIHJldHVybiBGQUxTRTsKKworICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgLyogTm93IHdlIGtub3cgdGhhdCBubyBjb21tYW5kIGlzIGJlaW5nIGV4ZWN1dGVkLiAqLworCisgIC8qIFNldCB0aGUgcmVjZWl2ZSBmcmFtZSBwb2ludGVyIGFuZCBzdG9wIHBvaW50ZXIgKi8KKyAgbHAtPnJmcCA9IDA7CisgIG91dGIoT1AwX1NXSVRfVE9fUE9SVF8xIHwgQ1IwX0NITkwsIExDQ1IoYmFzZSkpOworCisgIC8qIFJlc2V0IHJpbmcgbWFuYWdlbWVudC4gIFRoaXMgc2V0cyB0aGUgcmVjZWl2ZSBmcmFtZSBwb2ludGVyIHRvIDEgKi8KKyAgb3V0YihPUDFfUkVTRVRfUklOR19NTkdNVCwgTENDUihiYXNlKSk7CisKKyNpZiAwCisgIC8qIFhYWCB0aGUgaTgyNTkzIG1hbnVhbCBwYWdlIDYtNCBzZWVtcyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzdG9wIHJlZ2lzdGVyCisgICAgIHNob3VsZCBiZSBzZXQgYXMgYmVsb3cgKi8KKyAgLyogb3V0YihDUjFfU1RPUF9SRUdfVVBEQVRFfCgoUlhfU0laRSAtIDB4NDApPj4gUlhfU0laRV9TSElGVCksTENDUihiYXNlKSk7Ki8KKyNlbGlmIDAKKyAgLyogYnV0IEkgc2V0IGl0IDAgaW5zdGVhZCAqLworICBscC0+c3RvcCA9IDA7CisjZWxzZQorICAvKiBidXQgSSBzZXQgaXQgdG8gMyBieXRlcyBwZXIgcGFja2V0IGxlc3MgdGhhbiA4SyAqLworICBscC0+c3RvcCA9ICgwICsgUlhfU0laRSAtICgoUlhfU0laRSAvIDY0KSAqIDMpKSAlIFJYX1NJWkU7CisjZW5kaWYKKyAgb3V0YihDUjFfU1RPUF9SRUdfVVBEQVRFIHwgKGxwLT5zdG9wID4+IFJYX1NJWkVfU0hJRlQpLCBMQ0NSKGJhc2UpKTsKKyAgb3V0YihPUDFfSU5UX0VOQUJMRSwgTENDUihiYXNlKSk7CisgIG91dGIoT1AxX1NXSVRfVE9fUE9SVF8wLCBMQ0NSKGJhc2UpKTsKKworICAvKiBSZXNldCByZWNlaXZlIERNQSBwb2ludGVyICovCisgIGhhY3Jfd3JpdGVfc2xvdyhiYXNlLCBIQUNSX1BXUl9TVEFUIHwgSEFDUl9UWF9ETUFfUkVTRVQpOworICBoYWNyX3dyaXRlX3Nsb3coYmFzZSwgSEFDUl9ERUZBVUxUKTsKKworICAvKiBSZWNlaXZlIERNQSBvbiBjaGFubmVsIDEgKi8KKyAgd3ZfODI1OTNfY21kKGRldiwgInd2X3J1X3N0YXJ0KCk6IHJjdi1lbmFibGUiLAorCSAgICAgICBDUjBfQ0hOTCB8IE9QMF9SQ1ZfRU5BQkxFLCBTUjBfTk9fUkVTVUxUKTsKKworI2lmZGVmIERFQlVHX0k4MjU5M19TSE9XCisgIHsKKyAgICBpbnQJc3RhdHVzOworICAgIGludAlvcHJpOworICAgIGludAlzcGluID0gMTAwMDA7CisKKyAgICAvKiBzcGluIHVudGlsIHRoZSBjaGlwIHN0YXJ0cyByZWNlaXZpbmcgKi8KKyAgICBkbworICAgICAgeworCW91dGIoT1AwX05PUCB8IENSMF9TVEFUVVNfMywgTENDUihiYXNlKSk7CisJc3RhdHVzID0gaW5iKExDU1IoYmFzZSkpOworCWlmKHNwaW4tLSA8PSAwKQorCSAgYnJlYWs7CisgICAgICB9CisgICAgd2hpbGUoKChzdGF0dXMgJiBTUjNfUkNWX1NUQVRFX01BU0spICE9IFNSM19SQ1ZfQUNUSVZFKSAmJgorCSAgKChzdGF0dXMgJiBTUjNfUkNWX1NUQVRFX01BU0spICE9IFNSM19SQ1ZfUkVBRFkpKTsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAicmN2IHN0YXR1cyBpcyAweCV4IFtpOiVkXVxuIiwKKwkgICAoc3RhdHVzICYgU1IzX1JDVl9TVEFURV9NQVNLKSwgaSk7CisgIH0KKyNlbmRpZgorCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9ydV9zdGFydCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisgIHJldHVybiBUUlVFOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGRvZXMgYSBzdGFuZGFyZCBjb25maWcgb2YgdGhlIFdhdmVMQU4gY29udHJvbGxlciAoaTgyNTkzKS4KKyAqIEluIHRoZSBJU0EgZHJpdmVyLCB0aGlzIGlzIGludGVncmF0ZWQgaW4gd2F2ZWxhbl9oYXJkd2FyZV9yZXNldCgpCisgKiAoY2FsbGVkIGJ5IHd2X2h3X2NvbmZpZygpLCB3dl84MjU5M19yZWNvbmZpZygpICYgd2F2ZWxhbl9wYWNrZXRfeG1pdCgpKQorICovCitzdGF0aWMgaW50Cit3dl84MjU5M19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIGtpb19hZGRyX3QJCQliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIG5ldF9sb2NhbCAqCQkJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBzdHJ1Y3QgaTgyNTkzX2NvbmZfYmxvY2sJY2ZibGs7CisgIGludAkJCQlyZXQgPSBUUlVFOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl84MjU5M19jb25maWcoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisgIC8qIENyZWF0ZSAmIGZpbGwgaTgyNTkzIGNvbmZpZyBibG9jaworICAgKgorICAgKiBOb3cgY29uZm9ybSB0byBXYXZlbGFuIGRvY3VtZW50IFdDSU4wODVCCisgICAqLworICBtZW1zZXQoJmNmYmxrLCAweDAwLCBzaXplb2Yoc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrKSk7CisgIGNmYmxrLmQ2bW9kID0gRkFMU0U7ICAJLyogUnVuIGluIGk4MjU5MyBhZHZhbmNlZCBtb2RlICovCisgIGNmYmxrLmZpZm9fbGltaXQgPSA1OyAgICAgICAgIC8qID0gNTYgQiByeCBhbmQgNDAgQiB0eCBmaWZvIHRocmVzaG9sZHMgKi8KKyAgY2ZibGsuZm9yZ25lc2kgPSBGQUxTRTsgICAgICAgLyogMD04MkM1MDEsIDE9QU1ENzk5MkIgY29tcGF0aWJpbGl0eSAqLworICBjZmJsay5maWZvXzMyID0gMTsKKyAgY2ZibGsudGhyb3R0bGVfZW5iID0gRkFMU0U7CisgIGNmYmxrLmNvbnRpbiA9IFRSVUU7ICAgICAgICAgIC8qIGVuYWJsZSBjb250aW51b3VzIG1vZGUgKi8KKyAgY2ZibGsuY250cnhpbnQgPSBGQUxTRTsgICAgICAgLyogZW5hYmxlIGNvbnRpbnVvdXMgbW9kZSByZWNlaXZlIGludGVycnVwdHMgKi8KKyAgY2ZibGsuYWRkcl9sZW4gPSBXQVZFTEFOX0FERFJfU0laRTsKKyAgY2ZibGsuYWNsb2MgPSBUUlVFOyAgICAgICAgICAgLyogRGlzYWJsZSBzb3VyY2UgYWRkciBpbnNlcnRpb24gYnkgaTgyNTkzICovCisgIGNmYmxrLnByZWFtYl9sZW4gPSAwOyAgICAgICAgIC8qIDIgYnl0ZXMgcHJlYW1ibGUgKFNGRCkgKi8KKyAgY2ZibGsubG9vcGJhY2sgPSBGQUxTRTsKKyAgY2ZibGsubGluX3ByaW8gPSAwOyAgIAkvKiBjb25mb3JtIHRvIDgwMi4zIGJhY2tvZmYgYWxnb3JpdG0gKi8KKyAgY2ZibGsuZXhwX3ByaW8gPSA1OwkgICAgICAgIC8qIGNvbmZvcm0gdG8gODAyLjMgYmFja29mZiBhbGdvcml0bSAqLworICBjZmJsay5ib2ZfbWV0ID0gMTsJICAgICAgICAvKiBjb25mb3JtIHRvIDgwMi4zIGJhY2tvZmYgYWxnb3JpdG0gKi8KKyAgY2ZibGsuaWZybV9zcGMgPSAweDIwOwkvKiAzMiBiaXQgdGltZXMgaW50ZXJmcmFtZSBzcGFjaW5nICovCisgIGNmYmxrLnNsb3R0aW1fbG93ID0gMHgyMDsJLyogMzIgYml0IHRpbWVzIHNsb3QgdGltZSAqLworICBjZmJsay5zbG90dGltX2hpID0gMHgwOworICBjZmJsay5tYXhfcmV0ciA9IDE1OworICBjZmJsay5wcm1pc2MgPSAoKGxwLT5wcm9taXNjdW91cykgPyBUUlVFOiBGQUxTRSk7CS8qIFByb21pc2N1b3VzIG1vZGUgKi8KKyAgY2ZibGsuYmNfZGlzID0gRkFMU0U7ICAgICAgICAgLyogRW5hYmxlIGJyb2FkY2FzdCByZWNlcHRpb24gKi8KKyAgY2ZibGsuY3JzXzEgPSBUUlVFOwkJLyogVHJhbnNtaXQgd2l0aG91dCBjYXJyaWVyIHNlbnNlICovCisgIGNmYmxrLm5vY3JjX2lucyA9IEZBTFNFOwkvKiBpODI1OTMgZ2VuZXJhdGVzIENSQyAqLwkKKyAgY2ZibGsuY3JjXzE2MzIgPSBGQUxTRTsJLyogMzItYml0IEF1dG9kaW4tSUkgQ1JDICovCisgIGNmYmxrLmNyc19jZHQgPSBGQUxTRTsJLyogQ0Qgbm90IHRvIGJlIGludGVycHJldGVkIGFzIENTICovCisgIGNmYmxrLmNzX2ZpbHRlciA9IDA7ICAJLyogQ1MgaXMgcmVjb2duaXplZCBpbW1lZGlhdGVseSAqLworICBjZmJsay5jcnNfc3JjID0gRkFMU0U7CS8qIEV4dGVybmFsIGNhcnJpZXIgc2Vuc2UgKi8KKyAgY2ZibGsuY2RfZmlsdGVyID0gMDsgIAkvKiBDRCBpcyByZWNvZ25pemVkIGltbWVkaWF0ZWx5ICovCisgIGNmYmxrLm1pbl9mcl9sZW4gPSBFVEhfWkxFTiA+PiAyOyAgICAgLyogTWluaW11bSBmcmFtZSBsZW5ndGggNjQgYnl0ZXMgKi8KKyAgY2ZibGsubG5nX3R5cCA9IEZBTFNFOwkvKiBMZW5ndGggZmllbGQgPiAxNTAwID0gdHlwZSBmaWVsZCAqLworICBjZmJsay5sbmdfZmxkID0gVFJVRTsgCS8qIERpc2FibGUgODAyLjMgbGVuZ3RoIGZpZWxkIGNoZWNrICovCisgIGNmYmxrLnJ4Y3JjX3hmID0gVFJVRTsJLyogRG9uJ3QgdHJhbnNmZXIgQ1JDIHRvIG1lbW9yeSAqLworICBjZmJsay5hcnR4ID0gVFJVRTsJCS8qIERpc2FibGUgYXV0b21hdGljIHJldHJhbnNtaXNzaW9uICovCisgIGNmYmxrLnNhcmVjID0gVFJVRTsJCS8qIERpc2FibGUgc291cmNlIGFkZHIgdHJpZyBvZiBDRCAqLworICBjZmJsay50eF9qYWJiZXIgPSBUUlVFOwkvKiBEaXNhYmxlIGphYmJlciBqYW0gc2VxdWVuY2UgKi8KKyAgY2ZibGsuaGFzaF8xID0gRkFMU0U7IAkvKiBVc2UgYml0cyAwLTUgaW4gbWMgYWRkcmVzcyBoYXNoICovCisgIGNmYmxrLmxicGtwb2wgPSBUUlVFOyAJLyogTG9vcGJhY2sgcGluIGFjdGl2ZSBoaWdoICovCisgIGNmYmxrLmZkeCA9IEZBTFNFOwkJLyogRGlzYWJsZSBmdWxsIGR1cGxleCBvcGVyYXRpb24gKi8KKyAgY2ZibGsuZHVtbXlfNiA9IDB4M2Y7IAkvKiBhbGwgb25lcyAqLworICBjZmJsay5tdWx0X2lhID0gRkFMU0U7CS8qIE5vIG11bHRpcGxlIGluZGl2aWR1YWwgYWRkcmVzc2VzICovCisgIGNmYmxrLmRpc19ib2YgPSBGQUxTRTsJLyogRGlzYWJsZSB0aGUgYmFja29mZiBhbGdvcml0aG0gPyEgKi8KKyAgY2ZibGsuZHVtbXlfMSA9IFRSVUU7IAkvKiBzZXQgdG8gMSAqLworICBjZmJsay50eF9pZnNfcmV0cmlnID0gMzsJLyogSG1tLi4uIERpc2FibGVkICovCisjaWZkZWYgTVVMVElDQVNUX0FMTAorICBjZmJsay5tY19hbGwgPSAobHAtPmFsbG11bHRpY2FzdCA/IFRSVUU6IEZBTFNFKTsJLyogQWxsb3cgYWxsIG11bHRpY2FzdHMgKi8KKyNlbHNlCisgIGNmYmxrLm1jX2FsbCA9IEZBTFNFOwkJLyogTm8gbXVsdGljYXN0IGFsbCBtb2RlICovCisjZW5kaWYKKyAgY2ZibGsucmN2X21vbiA9IDA7CQkvKiBNb25pdG9yIG1vZGUgZGlzYWJsZWQgKi8KKyAgY2ZibGsuZnJhZ19hY3B0ID0gVFJVRTsJLyogRG8gbm90IGFjY2VwdCBmcmFnbWVudHMgKi8KKyAgY2ZibGsudHN0cnR0cnMgPSBGQUxTRTsJLyogTm8gc3RhcnQgdHJhbnNtaXNzaW9uIHRocmVzaG9sZCAqLworICBjZmJsay5mcmV0eCA9IFRSVUU7CQkvKiBGSUZPIGF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiAqLworICBjZmJsay5zeW5jcnFzID0gRkFMU0U7IAkvKiBTeW5jaHJvbm91cyBEUlEgZGVhc3NlcnRpb24uLi4gKi8KKyAgY2ZibGsuc3R0bGVuID0gVFJVRTsgIAkvKiA2IGJ5dGUgc3RhdHVzIHJlZ2lzdGVycyAqLworICBjZmJsay5yeF9lb3AgPSBUUlVFOyAgCS8qIFNpZ25hbCBFT1Agb24gcGFja2V0IHJlY2VwdGlvbiAqLworICBjZmJsay50eF9lb3AgPSBUUlVFOyAgCS8qIFNpZ25hbCBFT1Agb24gcGFja2V0IHRyYW5zbWlzc2lvbiAqLworICBjZmJsay5yYnVmX3NpemUgPSBSWF9TSVpFPj4xMTsJLyogU2V0IHJlY2VpdmUgYnVmZmVyIHNpemUgKi8KKyAgY2ZibGsucmN2c3RvcCA9IFRSVUU7IAkvKiBFbmFibGUgUmVjZWl2ZSBTdG9wIFJlZ2lzdGVyICovCisKKyNpZmRlZiBERUJVR19JODI1OTNfU0hPVworICB7CisgICAgdV9jaGFyICpjID0gKHVfY2hhciAqKSAmY2ZibGs7CisgICAgaW50IGk7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgIndhdmVsYW5fY3M6IGNvbmZpZyBibG9jazoiKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrKTsgaSsrLGMrKykKKyAgICAgIHsKKwlpZigoaSAlIDE2KSA9PSAwKSBwcmludGsoIlxuIiBLRVJOX0RFQlVHKTsKKwlwcmludGsoIiUwMnggIiwgKmMpOworICAgICAgfQorICAgIHByaW50aygiXG4iKTsKKyAgfQorI2VuZGlmCisKKyAgLyogQ29weSB0aGUgY29uZmlnIGJsb2NrIHRvIHRoZSBpODI1OTMgKi8KKyAgb3V0YihUWF9CQVNFICYgMHhmZiwgUElPUkwoYmFzZSkpOworICBvdXRiKCgoVFhfQkFTRSA+PiA4KSAmIFBJT1JIX01BU0spIHwgUElPUkhfU0VMX1RYLCBQSU9SSChiYXNlKSk7CisgIG91dGIoc2l6ZW9mKHN0cnVjdCBpODI1OTNfY29uZl9ibG9jaykgJiAweGZmLCBQSU9QKGJhc2UpKTsgICAgLyogbHNiICovCisgIG91dGIoc2l6ZW9mKHN0cnVjdCBpODI1OTNfY29uZl9ibG9jaykgPj4gOCwgUElPUChiYXNlKSk7CS8qIG1zYiAqLworICBvdXRzYihQSU9QKGJhc2UpLCAoY2hhciAqKSAmY2ZibGssIHNpemVvZihzdHJ1Y3QgaTgyNTkzX2NvbmZfYmxvY2spKTsKKworICAvKiByZXNldCB0cmFuc21pdCBETUEgcG9pbnRlciAqLworICBoYWNyX3dyaXRlX3Nsb3coYmFzZSwgSEFDUl9QV1JfU1RBVCB8IEhBQ1JfVFhfRE1BX1JFU0VUKTsKKyAgaGFjcl93cml0ZShiYXNlLCBIQUNSX0RFRkFVTFQpOworICBpZighd3ZfODI1OTNfY21kKGRldiwgInd2XzgyNTkzX2NvbmZpZygpOiBjb25maWd1cmUiLAorCQkgICBPUDBfQ09ORklHVVJFLCBTUjBfQ09ORklHVVJFX0RPTkUpKQorICAgIHJldCA9IEZBTFNFOworCisgIC8qIEluaXRpYWxpemUgYWRhcHRlcidzIGV0aGVybmV0IE1BQyBhZGRyZXNzICovCisgIG91dGIoVFhfQkFTRSAmIDB4ZmYsIFBJT1JMKGJhc2UpKTsKKyAgb3V0YigoKFRYX0JBU0UgPj4gOCkgJiBQSU9SSF9NQVNLKSB8IFBJT1JIX1NFTF9UWCwgUElPUkgoYmFzZSkpOworICBvdXRiKFdBVkVMQU5fQUREUl9TSVpFLCBQSU9QKGJhc2UpKTsJLyogYnl0ZSBjb3VudCBsc2IgKi8KKyAgb3V0YigwLCBQSU9QKGJhc2UpKTsJCQkvKiBieXRlIGNvdW50IG1zYiAqLworICBvdXRzYihQSU9QKGJhc2UpLCAmZGV2LT5kZXZfYWRkclswXSwgV0FWRUxBTl9BRERSX1NJWkUpOworCisgIC8qIHJlc2V0IHRyYW5zbWl0IERNQSBwb2ludGVyICovCisgIGhhY3Jfd3JpdGVfc2xvdyhiYXNlLCBIQUNSX1BXUl9TVEFUIHwgSEFDUl9UWF9ETUFfUkVTRVQpOworICBoYWNyX3dyaXRlKGJhc2UsIEhBQ1JfREVGQVVMVCk7CisgIGlmKCF3dl84MjU5M19jbWQoZGV2LCAid3ZfODI1OTNfY29uZmlnKCk6IGlhLXNldHVwIiwKKwkJICAgT1AwX0lBX1NFVFVQLCBTUjBfSUFfU0VUVVBfRE9ORSkpCisgICAgcmV0ID0gRkFMU0U7CisKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcKKyAgICAvKiBJZiByb2FtaW5nIGlzIGVuYWJsZWQsIGpvaW4gdGhlICJCZWFjb24gUmVxdWVzdCIgbXVsdGljYXN0IGdyb3VwLi4uICovCisgICAgLyogQnV0IG9ubHkgaWYgaXQncyBub3QgaW4gdGhlcmUgYWxyZWFkeSEgKi8KKyAgaWYoZG9fcm9hbWluZykKKyAgICBkZXZfbWNfYWRkKGRldixXQVZFTEFOX0JFQUNPTl9BRERSRVNTLCBXQVZFTEFOX0FERFJfU0laRSwgMSk7CisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisKKyAgLyogSWYgYW55IG11bHRpY2FzdCBhZGRyZXNzIHRvIHNldCAqLworICBpZihscC0+bWNfY291bnQpCisgICAgeworICAgICAgc3RydWN0IGRldl9tY19saXN0ICoJZG1pOworICAgICAgaW50CQkJYWRkcnNfbGVuID0gV0FWRUxBTl9BRERSX1NJWkUgKiBscC0+bWNfY291bnQ7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9od19jb25maWcoKTogc2V0ICVkIG11bHRpY2FzdCBhZGRyZXNzZXM6XG4iLAorCSAgICAgZGV2LT5uYW1lLCBscC0+bWNfY291bnQpOworICAgICAgZm9yKGRtaT1kZXYtPm1jX2xpc3Q7IGRtaTsgZG1pPWRtaS0+bmV4dCkKKwlwcmludGsoS0VSTl9ERUJVRyAiICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBkbWktPmRtaV9hZGRyWzBdLCBkbWktPmRtaV9hZGRyWzFdLCBkbWktPmRtaV9hZGRyWzJdLAorCSAgICAgICBkbWktPmRtaV9hZGRyWzNdLCBkbWktPmRtaV9hZGRyWzRdLCBkbWktPmRtaV9hZGRyWzVdICk7CisjZW5kaWYKKworICAgICAgLyogSW5pdGlhbGl6ZSBhZGFwdGVyJ3MgZXRoZXJuZXQgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworICAgICAgb3V0YihUWF9CQVNFICYgMHhmZiwgUElPUkwoYmFzZSkpOworICAgICAgb3V0YigoKFRYX0JBU0UgPj4gOCkgJiBQSU9SSF9NQVNLKSB8IFBJT1JIX1NFTF9UWCwgUElPUkgoYmFzZSkpOworICAgICAgb3V0YihhZGRyc19sZW4gJiAweGZmLCBQSU9QKGJhc2UpKTsJLyogYnl0ZSBjb3VudCBsc2IgKi8KKyAgICAgIG91dGIoKGFkZHJzX2xlbiA+PiA4KSwgUElPUChiYXNlKSk7CS8qIGJ5dGUgY291bnQgbXNiICovCisgICAgICBmb3IoZG1pPWRldi0+bWNfbGlzdDsgZG1pOyBkbWk9ZG1pLT5uZXh0KQorCW91dHNiKFBJT1AoYmFzZSksIGRtaS0+ZG1pX2FkZHIsIGRtaS0+ZG1pX2FkZHJsZW4pOworCisgICAgICAvKiByZXNldCB0cmFuc21pdCBETUEgcG9pbnRlciAqLworICAgICAgaGFjcl93cml0ZV9zbG93KGJhc2UsIEhBQ1JfUFdSX1NUQVQgfCBIQUNSX1RYX0RNQV9SRVNFVCk7CisgICAgICBoYWNyX3dyaXRlKGJhc2UsIEhBQ1JfREVGQVVMVCk7CisgICAgICBpZighd3ZfODI1OTNfY21kKGRldiwgInd2XzgyNTkzX2NvbmZpZygpOiBtYy1zZXR1cCIsCisJCSAgICAgICBPUDBfTUNfU0VUVVAsIFNSMF9NQ19TRVRVUF9ET05FKSkKKwlyZXQgPSBGQUxTRTsKKyAgICAgIGxwLT5tY19jb3VudCA9IGRldi0+bWNfY291bnQ7CS8qIHJlbWVtYmVyIHRvIGF2b2lkIHJlcGVhdGVkIHJlc2V0ICovCisgICAgfQorCisgIC8qIEpvYiBkb25lLCBjbGVhciB0aGUgZmxhZyAqLworICBscC0+cmVjb25maWdfODI1OTMgPSBGQUxTRTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfODI1OTNfY29uZmlnKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgcmV0dXJuKHJldCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWFkIHRoZSBBY2Nlc3MgQ29uZmlndXJhdGlvbiBSZWdpc3RlciwgcGVyZm9ybSBhIHNvZnR3YXJlIHJlc2V0LAorICogYW5kIHRoZW4gcmUtZW5hYmxlIHRoZSBjYXJkJ3Mgc29mdHdhcmUuCisgKgorICogSWYgSSB1bmRlcnN0YW5kIGNvcnJlY3RseSA6IHJlc2V0IHRoZSBwY21jaWEgaW50ZXJmYWNlIG9mIHRoZQorICogd2F2ZWxhbi4KKyAqIChjYWxsZWQgYnkgd3ZfY29uZmlnKCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit3dl9wY21jaWFfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIGludAkJaTsKKyAgY29uZl9yZWdfdAlyZWcgPSB7IDAsIENTX1JFQUQsIENJU1JFR19DT1IsIDAgfTsKKyAgZGV2X2xpbmtfdCAqCWxpbmsgPSAoKG5ldF9sb2NhbCAqKW5ldGRldl9wcml2KGRldikpLT5saW5rOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9wY21jaWFfcmVzZXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisgIGkgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluay0+aGFuZGxlLCAmcmVnKTsKKyAgaWYoaSAhPSBDU19TVUNDRVNTKQorICAgIHsKKyAgICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyLCBpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgICAKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHdhdmVsYW5fcGNtY2lhX3Jlc2V0KCk6IENvbmZpZyByZWcgaXMgMHgleFxuIiwKKwkgZGV2LT5uYW1lLCAodV9pbnQpIHJlZy5WYWx1ZSk7CisjZW5kaWYKKworICByZWcuQWN0aW9uID0gQ1NfV1JJVEU7CisgIHJlZy5WYWx1ZSA9IHJlZy5WYWx1ZSB8IENPUl9TV19SRVNFVDsKKyAgaSA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLT5oYW5kbGUsICZyZWcpOworICBpZihpICE9IENTX1NVQ0NFU1MpCisgICAgeworICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIsIGkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAgIAorICByZWcuQWN0aW9uID0gQ1NfV1JJVEU7CisgIHJlZy5WYWx1ZSA9IENPUl9MRVZFTF9JUlEgfCBDT1JfQ09ORklHOworICBpID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmstPmhhbmRsZSwgJnJlZyk7CisgIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKyAgICB7CisgICAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlciwgaSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9wY21jaWFfcmVzZXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gVFJVRTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHdhdmVsYW5faHdfY29uZmlnKCkgaXMgY2FsbGVkIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQgaXMKKyAqIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIHdhdmVsYW4gaGFyZHdhcmUuCisgKiBOb3RlIHRoYXQgdGhlIHJlY2VwdGlvbiB3aWxsIGJlIGVuYWJsZWQgaW4gd2F2ZWxhbi0+b3BlbigpLCBzbyB0aGUKKyAqIGRldmljZSBpcyBjb25maWd1cmVkIGJ1dCBpZGxlLi4uCisgKiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIGFjdGlvbnM6CisgKiAJMS4gQSBwY21jaWEgc29mdHdhcmUgcmVzZXQgKHVzaW5nIHd2X3BjbWNpYV9yZXNldCgpKQorICoJMi4gQSBwb3dlciByZXNldCAocmVzZXQgRE1BKQorICoJMy4gUmVzZXQgdGhlIExBTiBjb250cm9sbGVyCisgKgk0LiBJbml0aWFsaXplIHRoZSByYWRpbyBtb2RlbSAodXNpbmcgd3ZfbW1jX2luaXQpCisgKgk1LiBDb25maWd1cmUgTEFOIGNvbnRyb2xsZXIgKHVzaW5nIHd2XzgyNTkzX2NvbmZpZykKKyAqCTYuIFBlcmZvcm0gYSBkaWFnbm9zdGljIG9uIHRoZSBMQU4gY29udHJvbGxlcgorICogKGNhbGxlZCBieSB3YXZlbGFuX2V2ZW50KCkgJiB3dl9od19yZXNldCgpKQorICovCitzdGF0aWMgaW50Cit3dl9od19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisgIGtpb19hZGRyX3QJCWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisgIGludAkJCXJldCA9IEZBTFNFOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9od19jb25maWcoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisjaWZkZWYgU1RSVUNUX0NIRUNLCisgIGlmKHd2X3N0cnVjdHVjdF9jaGVjaygpICE9IChjaGFyICopIE5VTEwpCisgICAgeworICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHd2X2h3X2NvbmZpZzogc3RydWN0dXJlL2NvbXBpbGVyIGJvdGNoOiBcIiVzXCJcbiIsCisJICAgICBkZXYtPm5hbWUsIHd2X3N0cnVjdHVjdF9jaGVjaygpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisjZW5kaWYJLyogU1RSVUNUX0NIRUNLID09IDEgKi8KKworICAvKiBSZXNldCB0aGUgcGNtY2lhIGludGVyZmFjZSAqLworICBpZih3dl9wY21jaWFfcmVzZXQoZGV2KSA9PSBGQUxTRSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAvKiBEaXNndWlzZWQgZ290byA7LSkgKi8KKyAgZG8KKyAgICB7CisgICAgICAvKiBQb3dlciBVUCB0aGUgbW9kdWxlICsgcmVzZXQgdGhlIG1vZGVtICsgcmVzZXQgaG9zdCBhZGFwdGVyCisgICAgICAgKiAoaW4gZmFjdCwgcmVzZXQgRE1BIGNoYW5uZWxzKSAqLworICAgICAgaGFjcl93cml0ZV9zbG93KGJhc2UsIEhBQ1JfUkVTRVQpOworICAgICAgaGFjcl93cml0ZShiYXNlLCBIQUNSX0RFRkFVTFQpOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgbW9kdWxlIGhhcyBiZWVuIHBvd2VyZWQgdXAuLi4gKi8KKyAgICAgIGlmKGhhc3JfcmVhZChiYXNlKSAmIEhBU1JfTk9fQ0xLKQorCXsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisJICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogd3ZfaHdfY29uZmlnKCk6IG1vZGVtIG5vdCBjb25uZWN0ZWQgb3Igbm90IGEgd2F2ZWxhbiBjYXJkXG4iLAorCQkgZGV2LT5uYW1lKTsKKyNlbmRpZgorCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBpbml0aWFsaXplIHRoZSBtb2RlbSAqLworICAgICAgaWYod3ZfbW1jX2luaXQoZGV2KSA9PSBGQUxTRSkKKwl7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SUworCSAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHd2X2h3X2NvbmZpZygpOiBDYW4ndCBjb25maWd1cmUgdGhlIG1vZGVtXG4iLAorCQkgZGV2LT5uYW1lKTsKKyNlbmRpZgorCSAgYnJlYWs7CisJfQorCisgICAgICAvKiByZXNldCB0aGUgTEFOIGNvbnRyb2xsZXIgKGk4MjU5MykgKi8KKyAgICAgIG91dGIoT1AwX1JFU0VULCBMQ0NSKGJhc2UpKTsKKyAgICAgIG1kZWxheSgxKTsJLyogQSBiaXQgY3J1ZGUgISAqLworCisgICAgICAvKiBJbml0aWFsaXplIHRoZSBMQU4gY29udHJvbGxlciAqLworICAgICAgaWYod3ZfODI1OTNfY29uZmlnKGRldikgPT0gRkFMU0UpCisJeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUlMKKwkgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9od19jb25maWcoKTogaTgyNTkzIGluaXQgZmFpbGVkXG4iLAorCQkgZGV2LT5uYW1lKTsKKyNlbmRpZgorCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBEaWFnbm9zdGljICovCisgICAgICBpZih3dl9kaWFnKGRldikgPT0gRkFMU0UpCisJeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUlMKKwkgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9od19jb25maWcoKTogaTgyNTkzIGRpYWdub3N0aWMgZmFpbGVkXG4iLAorCQkgZGV2LT5uYW1lKTsKKyNlbmRpZgorCSAgYnJlYWs7CisJfQorCisgICAgICAvKiAKKyAgICAgICAqIGluc2VydCBjb2RlIGZvciBsb29wYmFjayB0ZXN0IGhlcmUKKyAgICAgICAqLworCisgICAgICAvKiBUaGUgZGV2aWNlIGlzIG5vdyBjb25maWd1cmVkICovCisgICAgICBscC0+Y29uZmlndXJlZCA9IDE7CisgICAgICByZXQgPSBUUlVFOworICAgIH0KKyAgd2hpbGUoMCk7CisKKyAgLyogUmUtZW5hYmxlIGludGVycnVwdHMgKi8KKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X2h3X2NvbmZpZygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisgIHJldHVybihyZXQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVG90YWxseSByZXNldCB0aGUgd2F2ZWxhbiBhbmQgcmVzdGFydCBpdC4KKyAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKyAqIAkxLiBDYWxsIHd2X2h3X2NvbmZpZygpCisgKgkyLiBTdGFydCB0aGUgTEFOIGNvbnRyb2xsZXIncyByZWNlaXZlIHVuaXQKKyAqIChjYWxsZWQgYnkgd2F2ZWxhbl9ldmVudCgpLCB3YXZlbGFuX3dhdGNoZG9nKCkgYW5kIHdhdmVsYW5fb3BlbigpKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3d2X2h3X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBuZXRfbG9jYWwgKglscCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X2h3X3Jlc2V0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICBscC0+bnJlc2V0cysrOworICBscC0+Y29uZmlndXJlZCA9IDA7CisgIAorICAvKiBDYWxsIHd2X2h3X2NvbmZpZygpIGZvciBtb3N0IG9mIHRoZSByZXNldCAmIGluaXQgc3R1ZmYgKi8KKyAgaWYod3ZfaHdfY29uZmlnKGRldikgPT0gRkFMU0UpCisgICAgcmV0dXJuOworCisgIC8qIHN0YXJ0IHJlY2VpdmUgdW5pdCAqLworICB3dl9ydV9zdGFydChkZXYpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9od19yZXNldCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiB3dl9wY21jaWFfY29uZmlnKCkgaXMgY2FsbGVkIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQgaXMKKyAqIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZSBldGhlcm5ldAorICogZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorICogKGNhbGxlZCBieSB3YXZlbGFuX2V2ZW50KCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit3dl9wY21jaWFfY29uZmlnKGRldl9saW5rX3QgKglsaW5rKQoreworICBjbGllbnRfaGFuZGxlX3QJaGFuZGxlID0gbGluay0+aGFuZGxlOworICB0dXBsZV90CQl0dXBsZTsKKyAgY2lzcGFyc2VfdAkJcGFyc2U7CisgIHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGxpbmstPnByaXY7CisgIGludAkJCWk7CisgIHVfY2hhcgkJYnVmWzY0XTsKKyAgd2luX3JlcV90CQlyZXE7CisgIG1lbXJlcV90CQltZW07CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiLT53dl9wY21jaWFfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKyNlbmRpZgorCisgIC8qCisgICAqIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbgorICAgKiByZWdpc3RlcnMuCisgICAqLworICBkbworICAgIHsKKyAgICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOworICAgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgICAgIGkgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKTsKKyAgICAgIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKwlicmVhazsKKyAgICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CisgICAgICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKKyAgICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICAgIGkgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpOworICAgICAgaWYoaSAhPSBDU19TVUNDRVNTKQorCWJyZWFrOworICAgICAgaSA9IHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsKKyAgICAgIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKwlicmVhazsKKyAgICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworICAgICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworICAgIH0KKyAgd2hpbGUoMCk7CisgIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKyAgICB7CisgICAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIFBhcnNlVHVwbGUsIGkpOworICAgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgCisgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisgIGRvCisgICAgeworICAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICAgIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKwl7CisJICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlcXVlc3RJTywgaSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qCisgICAgICAgKiBOb3cgYWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdAorICAgICAgICogYWN0dWFsbHkgYXNzaWduIGEgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LgorICAgICAgICovCisgICAgICBpID0gcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJeworCSAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0SVJRLCBpKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgLyoKKyAgICAgICAqIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCisgICAgICAgKiB0aGUgSS9PIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZy4KKyAgICAgICAqLworICAgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IDE7CisgICAgICBpID0gcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKyAgICAgIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKwl7CisJICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlcXVlc3RDb25maWd1cmF0aW9uLCBpKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgLyoKKyAgICAgICAqIEFsbG9jYXRlIGEgc21hbGwgbWVtb3J5IHdpbmRvdy4gIE5vdGUgdGhhdCB0aGUgZGV2X2xpbmtfdAorICAgICAgICogc3RydWN0dXJlIHByb3ZpZGVzIHNwYWNlIGZvciBvbmUgd2luZG93IGhhbmRsZSAtLSBpZiB5b3VyCisgICAgICAgKiBkZXZpY2UgbmVlZHMgc2V2ZXJhbCB3aW5kb3dzLCB5b3UnbGwgbmVlZCB0byBrZWVwIHRyYWNrIG9mCisgICAgICAgKiB0aGUgaGFuZGxlcyBpbiB5b3VyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsIGxpbmstPnByaXYuCisgICAgICAgKi8KKyAgICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOHxXSU5fTUVNT1JZX1RZUEVfQU18V0lOX0VOQUJMRTsKKyAgICAgIHJlcS5CYXNlID0gcmVxLlNpemUgPSAwOworICAgICAgcmVxLkFjY2Vzc1NwZWVkID0gbWVtX3NwZWVkOworICAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKTsKKyAgICAgIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKwl7CisJICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlcXVlc3RXaW5kb3csIGkpOworCSAgYnJlYWs7CisJfQorCisgICAgICBscC0+bWVtID0gaW9yZW1hcChyZXEuQmFzZSwgcmVxLlNpemUpOworICAgICAgZGV2LT5tZW1fc3RhcnQgPSAodV9sb25nKWxwLT5tZW07CisgICAgICBkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIHJlcS5TaXplOworCisgICAgICBtZW0uQ2FyZE9mZnNldCA9IDA7IG1lbS5QYWdlID0gMDsKKyAgICAgIGkgPSBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmstPndpbiwgJm1lbSk7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJeworCSAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBNYXBNZW1QYWdlLCBpKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogRmVlZCBkZXZpY2Ugd2l0aCB0aGlzIGluZm8uLi4gKi8KKyAgICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisgICAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICJ3dl9wY21jaWFfY29uZmlnOiBNRU1TVEFSVCAlcCBJUlEgJWQgSU9QT1JUIDB4JXhcbiIsCisJICAgICBscC0+bWVtLCBkZXYtPmlycSwgKHVfaW50KSBkZXYtPmJhc2VfYWRkcik7CisjZW5kaWYKKworICAgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKyAgICAgIGkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICAgIGlmKGkgIT0gMCkKKwl7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SUworCSAgcHJpbnRrKEtFUk5fSU5GTyAid3ZfcGNtY2lhX2NvbmZpZygpOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworI2VuZGlmCisJICBicmVhazsKKwl9CisgICAgfQorICB3aGlsZSgwKTsJCS8qIEh1bW0uLi4gRGlzZ3Vpc2VkIGdvdG8gISEhICovCisKKyAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgLyogSWYgYW55IHN0ZXAgZmFpbGVkLCByZWxlYXNlIGFueSBwYXJ0aWFsbHkgY29uZmlndXJlZCBzdGF0ZSAqLworICBpZihpICE9IDApCisgICAgeworICAgICAgd3ZfcGNtY2lhX3JlbGVhc2UobGluayk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIHN0cmNweSgoKG5ldF9sb2NhbCAqKSBuZXRkZXZfcHJpdihkZXYpKS0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKyAgbGluay0+ZGV2ID0gJigobmV0X2xvY2FsICopIG5ldGRldl9wcml2KGRldikpLT5ub2RlOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICI8LXd2X3BjbWNpYV9jb25maWcoKVxuIik7CisjZW5kaWYKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgd3ZfcGNtY2lhX3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorICogZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgKiBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKyAqLworc3RhdGljIHZvaWQKK3d2X3BjbWNpYV9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisgIHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGxpbmstPnByaXY7CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPiB3dl9wY21jaWFfcmVsZWFzZSgweCVwKVxuIiwgZGV2LT5uYW1lLCBsaW5rKTsKKyNlbmRpZgorCisgIC8qIERvbid0IGJvdGhlciBjaGVja2luZyB0byBzZWUgaWYgdGhlc2Ugc3VjY2VlZCBvciBub3QgKi8KKyAgaW91bm1hcChscC0+bWVtKTsKKyAgcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmstPndpbik7CisgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKworICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtIHd2X3BjbWNpYV9yZWxlYXNlKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBJTlRFUlJVUFQgSEFORExJTkcgKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBXYXZlTEFOIGNhcmQuIFRoaXMKKyAqIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXI6IAorICoJMS4gQSBwYWNrZXQgaXMgcmVjZWl2ZWQuCisgKgkyLiBBIHBhY2tldCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdHJhbnNmZXJyZWQgYW5kIHRoZSB1bml0IGlzCisgKgkgICByZWFkeSB0byB0cmFuc21pdCBhbm90aGVyIHBhY2tldC4KKyAqCTMuIEEgY29tbWFuZCBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbi4KKyAqLworc3RhdGljIGlycXJldHVybl90Cit3YXZlbGFuX2ludGVycnVwdChpbnQJCWlycSwKKwkJICB2b2lkICoJZGV2X2lkLAorCQkgIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKyAgc3RydWN0IG5ldF9kZXZpY2UgKglkZXY7CisgIG5ldF9sb2NhbCAqCWxwOworICBraW9fYWRkcl90CWJhc2U7CisgIGludAkJc3RhdHVzMDsKKyAgdV9pbnQJCXR4X3N0YXR1czsKKworICBpZiAoKGRldiA9IGRldl9pZCkgPT0gTlVMTCkKKyAgICB7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJ3YXZlbGFuX2ludGVycnVwdCgpOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwKKwkgICAgIGlycSk7CisjZW5kaWYKKyAgICAgIHJldHVybiBJUlFfTk9ORTsKKyAgICB9CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5faW50ZXJydXB0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICBscCA9IG5ldGRldl9wcml2KGRldik7CisgIGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9JTkZPCisgIC8qIENoZWNrIHN0YXRlIG9mIG91ciBzcGlubG9jayAoaXQgc2hvdWxkIGJlIGNsZWFyZWQpICovCisgIGlmKHNwaW5faXNfbG9ja2VkKCZscC0+c3BpbmxvY2spKQorICAgIHByaW50ayhLRVJOX0RFQlVHCisJICAgIiVzOiB3YXZlbGFuX2ludGVycnVwdCgpOiBzcGlubG9jayBpcyBhbHJlYWR5IGxvY2tlZCAhISFcbiIsCisJICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisgIC8qIFByZXZlbnQgcmVlbnRyYW5jeS4gV2UgbmVlZCB0byBkbyB0aGF0IGJlY2F1c2Ugd2UgbWF5IGhhdmUKKyAgICogbXVsdGlwbGUgaW50ZXJydXB0IGhhbmRsZXIgcnVubmluZyBjb25jdXJlbnRseS4KKyAgICogSXQgaXMgc2FmZSBiZWNhdXNlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGJlZm9yZSBhcXVpcmluZworICAgKiB0aGUgc3BpbmxvY2suICovCisgIHNwaW5fbG9jaygmbHAtPnNwaW5sb2NrKTsKKworICAvKiBUcmVhdCBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzICovCisgIHdoaWxlKDEpCisgICAgeworICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBJTlRFUlJVUFQgQ0hFQ0tJTkcgLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgLyoKKyAgICAgICAqIExvb2sgZm9yIHRoZSBpbnRlcnJ1cHQgYW5kIHZlcmlmeSB0aGUgdmFsaWRpdHkKKyAgICAgICAqLworICAgICAgb3V0YihDUjBfU1RBVFVTXzAgfCBPUDBfTk9QLCBMQ0NSKGJhc2UpKTsKKyAgICAgIHN0YXR1czAgPSBpbmIoTENTUihiYXNlKSk7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworICAgICAgcHJpbnRrKEtFUk5fREVCVUcgInN0YXR1czAgMHgleCBbJXMgPT4gMHgleF0iLCBzdGF0dXMwLCAKKwkgICAgIChzdGF0dXMwJlNSMF9JTlRFUlJVUFQpPyJpbnQiOiJubyBpbnQiLHN0YXR1czAmflNSMF9JTlRFUlJVUFQpOworICAgICAgaWYoc3RhdHVzMCZTUjBfSU5URVJSVVBUKQorCXsKKwkgIHByaW50aygiIFslcyA9PiAlZF1cbiIsIChzdGF0dXMwICYgU1IwX0NITkwpID8gImNobmwiIDoKKwkJICgoc3RhdHVzMCAmIFNSMF9FWEVDVVRJT04pID8gImNtZCIgOgorCQkgICgoc3RhdHVzMCAmIFNSMF9SRUNFUFRJT04pID8gInJlY3YiIDogInVua25vd24iKSksCisJCSAoc3RhdHVzMCAmIFNSMF9FVkVOVF9NQVNLKSk7CisJfQorICAgICAgZWxzZQorCXByaW50aygiXG4iKTsKKyNlbmRpZgorCisgICAgICAvKiBSZXR1cm4gaWYgbm8gYWN0dWFsIGludGVycnVwdCBmcm9tIGk4MjU5MyAobm9ybWFsIGV4aXQpICovCisgICAgICBpZighKHN0YXR1czAgJiBTUjBfSU5URVJSVVBUKSkKKwlicmVhazsKKworICAgICAgLyogSWYgaW50ZXJydXB0IGlzIGJvdGggUnggYW5kIFR4IG9yIG5vbmUuLi4KKyAgICAgICAqIFRoaXMgY29kZSBpbiBmYWN0IGlzIHRoZXJlIHRvIGNhdGNoIHRoZSBzcHVyaW91cyBpbnRlcnJ1cHQKKyAgICAgICAqIHdoZW4geW91IHJlbW92ZSB0aGUgd2F2ZWxhbiBwY21jaWEgY2FyZCBmcm9tIHRoZSBzb2NrZXQgKi8KKyAgICAgIGlmKCgoc3RhdHVzMCAmIFNSMF9CT1RIX1JYX1RYKSA9PSBTUjBfQk9USF9SWF9UWCkgfHwKKwkgKChzdGF0dXMwICYgU1IwX0JPVEhfUlhfVFgpID09IDB4MCkpCisJeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9JTkZPCisJICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfaW50ZXJydXB0KCk6IGJvZ3VzIGludGVycnVwdCAob3IgZnJvbSBkZWFkIGNhcmQpIDogJVhcbiIsCisJCSBkZXYtPm5hbWUsIHN0YXR1czApOworI2VuZGlmCisJICAvKiBBY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0ICovCisJICBvdXRiKENSMF9JTlRfQUNLIHwgT1AwX05PUCwgTENDUihiYXNlKSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tIFJFQ0VJVklORyBQQUNLRVQgLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qCisgICAgICAgKiBXaGVuIHRoZSB3YXZlbGFuIHNpZ25hbCB0aGUgcmVjZXB0aW9uIG9mIGEgbmV3IHBhY2tldCwKKyAgICAgICAqIHdlIGNhbGwgd3ZfcGFja2V0X3JjdigpIHRvIGNvcHkgaWYgZnJvbSB0aGUgYnVmZmVyIGFuZAorICAgICAgICogc2VuZCBpdCB0byBORVQzCisgICAgICAgKi8KKyAgICAgIGlmKHN0YXR1czAgJiBTUjBfUkVDRVBUSU9OKQorCXsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCSAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9pbnRlcnJ1cHQoKTogcmVjZWl2ZVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJICBpZigoc3RhdHVzMCAmIFNSMF9FVkVOVF9NQVNLKSA9PSBTUjBfU1RPUF9SRUdfSElUKQorCSAgICB7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisJICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X2ludGVycnVwdCgpOiByZWNlaXZlIGJ1ZmZlciBvdmVyZmxvd1xuIiwKKwkJICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJICAgICAgbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJICAgICAgbHAtPm92ZXJydW5uaW5nID0gMTsKKyAgICAgIAkgICAgfQorCisJICAvKiBHZXQgdGhlIHBhY2tldCAqLworCSAgd3ZfcGFja2V0X3JjdihkZXYpOworCSAgbHAtPm92ZXJydW5uaW5nID0gMDsKKworCSAgLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCAqLworCSAgb3V0YihDUjBfSU5UX0FDSyB8IE9QMF9OT1AsIExDQ1IoYmFzZSkpOworCSAgY29udGludWU7CisgICAgCX0KKworICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBDT01NQU5EIENPTVBMRVRJT04gLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgLyoKKyAgICAgICAqIEludGVycnVwdHMgaXNzdWVkIHdoZW4gdGhlIGk4MjU5MyBoYXMgY29tcGxldGVkIGEgY29tbWFuZC4KKyAgICAgICAqIE1vc3QgbGlrZWx5IDogdHJhbnNtaXNzaW9uIGRvbmUKKyAgICAgICAqLworCisgICAgICAvKiBJZiBhIHRyYW5zbWlzc2lvbiBoYXMgYmVlbiBkb25lICovCisgICAgICBpZigoc3RhdHVzMCAmIFNSMF9FVkVOVF9NQVNLKSA9PSBTUjBfVFJBTlNNSVRfRE9ORSB8fAorCSAoc3RhdHVzMCAmIFNSMF9FVkVOVF9NQVNLKSA9PSBTUjBfUkVUUkFOU01JVF9ET05FIHx8CisJIChzdGF0dXMwICYgU1IwX0VWRU5UX01BU0spID09IFNSMF9UUkFOU01JVF9OT19DUkNfRE9ORSkKKwl7CisjaWZkZWYgREVCVUdfVFhfRVJST1IKKwkgIGlmKChzdGF0dXMwICYgU1IwX0VWRU5UX01BU0spID09IFNSMF9UUkFOU01JVF9OT19DUkNfRE9ORSkKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X2ludGVycnVwdCgpOiBwYWNrZXQgdHJhbnNtaXR0ZWQgd2l0aG91dCBDUkMuXG4iLAorCQkgICBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkgIC8qIEdldCB0cmFuc21pc3Npb24gc3RhdHVzICovCisJICB0eF9zdGF0dXMgPSBpbmIoTENTUihiYXNlKSk7CisJICB0eF9zdGF0dXMgfD0gKGluYihMQ1NSKGJhc2UpKSA8PCA4KTsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCSAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9pbnRlcnJ1cHQoKTogdHJhbnNtaXNzaW9uIGRvbmVcbiIsCisJCSBkZXYtPm5hbWUpOworCSAgeworCSAgICB1X2ludAlyY3ZfYnl0ZXM7CisJICAgIHVfY2hhcglzdGF0dXMzOworCSAgICByY3ZfYnl0ZXMgPSBpbmIoTENTUihiYXNlKSk7CisJICAgIHJjdl9ieXRlcyB8PSAoaW5iKExDU1IoYmFzZSkpIDw8IDgpOworCSAgICBzdGF0dXMzID0gaW5iKExDU1IoYmFzZSkpOworCSAgICBwcmludGsoS0VSTl9ERUJVRyAidHhfc3RhdHVzIDB4JTAyeCByY3ZfYnl0ZXMgMHglMDJ4IHN0YXR1czMgMHgleFxuIiwKKwkJICAgdHhfc3RhdHVzLCByY3ZfYnl0ZXMsICh1X2ludCkgc3RhdHVzMyk7CisJICB9CisjZW5kaWYKKwkgIC8qIENoZWNrIGZvciBwb3NzaWJsZSBlcnJvcnMgKi8KKwkgIGlmKCh0eF9zdGF0dXMgJiBUWF9PSykgIT0gVFhfT0spCisJICAgIHsKKwkgICAgICBscC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkgICAgICBpZih0eF9zdGF0dXMgJiBUWF9GUlRMKQorCQl7CisjaWZkZWYgREVCVUdfVFhfRVJST1IKKwkJICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfaW50ZXJydXB0KCk6IGZyYW1lIHRvbyBsb25nXG4iLAorCQkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJfQorCSAgICAgIGlmKHR4X3N0YXR1cyAmIFRYX1VORF9SVU4pCisJCXsKKyNpZmRlZiBERUJVR19UWF9GQUlMCisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9pbnRlcnJ1cHQoKTogRE1BIHVuZGVycnVuXG4iLAorCQkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJICBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJfQorCSAgICAgIGlmKHR4X3N0YXR1cyAmIFRYX0xPU1RfQ1RTKQorCQl7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IG5vIENUU1xuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkgIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQl9CisJICAgICAgaWYodHhfc3RhdHVzICYgVFhfTE9TVF9DUlMpCisJCXsKKyNpZmRlZiBERUJVR19UWF9GQUlMCisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9pbnRlcnJ1cHQoKTogbm8gY2FycmllclxuIiwKKwkJCSBkZXYtPm5hbWUpOworI2VuZGlmCisJCSAgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCX0KKwkgICAgICBpZih0eF9zdGF0dXMgJiBUWF9IUlRfQkVBVCkKKwkJeworI2lmZGVmIERFQlVHX1RYX0ZBSUwKKwkJICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X2ludGVycnVwdCgpOiBoZWFydCBiZWF0XG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCSAgbHAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKwkJfQorCSAgICAgIGlmKHR4X3N0YXR1cyAmIFRYX0RFRkVSKQorCQl7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IGNoYW5uZWwgamFtbWVkXG4iLAorCQkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJfQorCSAgICAgIC8qIElnbm9yZSBsYXRlIGNvbGxpc2lvbnMgc2luY2UgdGhleSdyZSBtb3JlIGxpa2VseSB0byBoYXBwZW4KKwkgICAgICAgKiBoZXJlICh0aGUgV2F2ZUxBTiBkZXNpZ24gcHJldmVudHMgdGhlIExBTiBjb250cm9sbGVyIGZyb20KKwkgICAgICAgKiByZWNlaXZpbmcgd2hpbGUgaXQgaXMgdHJhbnNtaXR0aW5nKS4gV2UgdGFrZSBhY3Rpb24gb25seSB3aGVuCisJICAgICAgICogdGhlIG1heGltdW0gcmV0cmFuc21pdCBhdHRlbXB0cyBpcyBleGNlZWRlZC4KKwkgICAgICAgKi8KKwkgICAgICBpZih0eF9zdGF0dXMgJiBUWF9DT0xMKQorCQl7CisJCSAgaWYodHhfc3RhdHVzICYgVFhfTUFYX0NPTCkKKwkJICAgIHsKKyNpZmRlZiBERUJVR19UWF9GQUlMCisJCSAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IGNoYW5uZWwgY29uZ2VzdGlvblxuIiwKKwkJCSAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkgICAgICBpZighKHR4X3N0YXR1cyAmIFRYX05DT0xfTUFTSykpCisJCQl7CisJCQkgIGxwLT5zdGF0cy5jb2xsaXNpb25zICs9IDB4MTA7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgfQkvKiBpZighKHR4X3N0YXR1cyAmIFRYX09LKSkgKi8KKworCSAgbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHR4X3N0YXR1cyAmIFRYX05DT0xfTUFTSyk7CisJICBscC0+c3RhdHMudHhfcGFja2V0cysrOworCisJICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisJICBvdXRiKENSMF9JTlRfQUNLIHwgT1AwX05PUCwgTENDUihiYXNlKSk7CS8qIEFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgKi8KKyAgICAJfSAKKyAgICAgIGVsc2UJLyogaWYgaW50ZXJydXB0ID0gdHJhbnNtaXQgZG9uZSBvciByZXRyYW5zbWl0IGRvbmUgKi8KKwl7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisJICBwcmludGsoS0VSTl9JTkZPICJ3YXZlbGFuX2NzOiB1bmtub3duIGludGVycnVwdCwgc3RhdHVzMCA9ICUwMnhcbiIsCisJCSBzdGF0dXMwKTsKKyNlbmRpZgorCSAgb3V0YihDUjBfSU5UX0FDSyB8IE9QMF9OT1AsIExDQ1IoYmFzZSkpOwkvKiBBY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0ICovCisgICAgCX0KKyAgICB9CS8qIHdoaWxlKDEpICovCisKKyAgc3Bpbl91bmxvY2soJmxwLT5zcGlubG9jayk7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5faW50ZXJydXB0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKiBXZSBhbHdheXMgcmV0dXJuIElSUV9IQU5ETEVELCBiZWNhdXNlIHdlIHdpbGwgcmVjZWl2ZSBlbXB0eQorICAgKiBpbnRlcnJ1cHRzIHVuZGVyIG5vcm1hbCBvcGVyYXRpb25zLiBBbnl3YXksIGl0IGRvZXNuJ3QgbWF0dGVyCisgICAqIGFzIHdlIGFyZSBkZWFsaW5nIHdpdGggYW4gSVNBIGludGVycnVwdCB0aGF0IGNhbid0IGJlIHNoYXJlZC4KKyAgICoKKyAgICogRXhwbGFuYXRpb24gOiB1bmRlciBoZWF2eSByZWNlaXZlLCB0aGUgZm9sbG93aW5nIGhhcHBlbnMgOgorICAgKiAtPndhdmVsYW5faW50ZXJydXB0KCkKKyAgICogICAgKHN0YXR1czAgJiBTUjBfSU5URVJSVVBUKSAhPSAwCisgICAqICAgICAgIC0+d3ZfcGFja2V0X3JjdigpCisgICAqICAgIChzdGF0dXMwICYgU1IwX0lOVEVSUlVQVCkgIT0gMAorICAgKiAgICAgICAtPnd2X3BhY2tldF9yY3YoKQorICAgKiAgICAoc3RhdHVzMCAmIFNSMF9JTlRFUlJVUFQpID09IDAJLy8gaS5lLiBubyBtb3JlIGV2ZW50CisgICAqIDwtd2F2ZWxhbl9pbnRlcnJ1cHQoKQorICAgKiAtPndhdmVsYW5faW50ZXJydXB0KCkKKyAgICogICAgKHN0YXR1czAgJiBTUjBfSU5URVJSVVBUKSA9PSAwCS8vIGkuZS4gZW1wdHkgaW50ZXJydXB0CisgICAqIDwtd2F2ZWxhbl9pbnRlcnJ1cHQoKQorICAgKiBKZWFuIElJICovCisgIHJldHVybiBJUlFfSEFORExFRDsKK30gLyogd3ZfaW50ZXJydXB0ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXYXRjaGRvZzogd2hlbiB3ZSBzdGFydCBhIHRyYW5zbWlzc2lvbiwgYSB0aW1lciBpcyBzZXQgZm9yIHVzIGluIHRoZQorICoga2VybmVsLiAgSWYgdGhlIHRyYW5zbWlzc2lvbiBjb21wbGV0ZXMsIHRoaXMgdGltZXIgaXMgZGlzYWJsZWQuIElmCisgKiB0aGUgdGltZXIgZXhwaXJlcywgd2UgYXJlIGNhbGxlZCBhbmQgd2UgdHJ5IHRvIHVubG9jayB0aGUgaGFyZHdhcmUuCisgKgorICogTm90ZSA6IFRoaXMgd2F0Y2hkb2cgaXMgbW92ZSBjbGV2ZXIgdGhhbiB0aGUgb25lIGluIHRoZSBJU0EgZHJpdmVyLAorICogYmVjYXVzZSBpdCB0cnkgdG8gYWJvcnQgdGhlIGN1cnJlbnQgY29tbWFuZCBiZWZvcmUgcmVzZXRpbmcKKyAqIGV2ZXJ5dGhpbmcuLi4KKyAqIE9uIHRoZSBvdGhlciBoYW5kLCBpdCdzIGEgYml0IHNpbXBsZXIsIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0bworICogZGVhbCB3aXRoIHRoZSBtdWx0aXBsZSBUeCBidWZmZXJzLi4uCisgKi8KK3N0YXRpYyB2b2lkCit3YXZlbGFuX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBuZXRfbG9jYWwgKgkJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBraW9fYWRkcl90CQliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIHVuc2lnbmVkIGxvbmcJCWZsYWdzOworICBpbnQJCQlhYm9ydGVkID0gRkFMU0U7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fd2F0Y2hkb2coKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3YXZlbGFuX3dhdGNoZG9nOiB3YXRjaGRvZyB0aW1lciBleHBpcmVkXG4iLAorCSBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIC8qIEFzayB0byBhYm9ydCB0aGUgY3VycmVudCBjb21tYW5kICovCisgIG91dGIoT1AwX0FCT1JULCBMQ0NSKGJhc2UpKTsKKworICAvKiBXYWl0IGZvciB0aGUgZW5kIG9mIHRoZSBjb21tYW5kIChhIGJpdCBoYWNraXNoKSAqLworICBpZih3dl84MjU5M19jbWQoZGV2LCAid2F2ZWxhbl93YXRjaGRvZygpOiBhYm9ydCIsCisJCSAgT1AwX05PUCB8IENSMF9TVEFUVVNfMywgU1IwX0VYRUNVVElPTl9BQk9SVEVEKSkKKyAgICBhYm9ydGVkID0gVFJVRTsKKworICAvKiBSZWxlYXNlIHNwaW5sb2NrIGhlcmUgc28gdGhhdCB3dl9od19yZXNldCgpIGNhbiBncmFiIGl0ICovCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIC8qIENoZWNrIGlmIHdlIHdlcmUgc3VjY2Vzc2Z1bCBpbiBhYm9ydGluZyBpdCAqLworICBpZighYWJvcnRlZCkKKyAgICB7CisgICAgICAvKiBJdCBzZWVtIHRoYXQgaXQgd2Fzbid0IGVub3VnaCAqLworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHdhdmVsYW5fd2F0Y2hkb2c6IGFib3J0IGZhaWxlZCwgdHJ5aW5nIHJlc2V0XG4iLAorCSAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorICAgICAgd3ZfaHdfcmVzZXQoZGV2KTsKKyAgICB9CisKKyNpZmRlZiBERUJVR19QU0FfU0hPVworICB7CisgICAgcHNhX3QJCXBzYTsKKyAgICBwc2FfcmVhZChkZXYsIDAsICh1bnNpZ25lZCBjaGFyICopICZwc2EsIHNpemVvZihwc2EpKTsKKyAgICB3dl9wc2Ffc2hvdygmcHNhKTsKKyAgfQorI2VuZGlmCisjaWZkZWYgREVCVUdfTU1DX1NIT1cKKyAgd3ZfbW1jX3Nob3coZGV2KTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX0k4MjU5M19TSE9XCisgIHd2X3J1X3Nob3coZGV2KTsKKyNlbmRpZgorCisgIC8qIFdlIGFyZSBubyBtb3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZy4uLiAqLworICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fd2F0Y2hkb2coKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqIENPTkZJR1VSQVRJT04gQ0FMTEJBQ0tTICoqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBIZXJlIGFyZSB0aGUgZnVuY3Rpb25zIGNhbGxlZCBieSB0aGUgcGNtY2lhIHBhY2thZ2UgKGNhcmRtZ3IpIGFuZAorICogbGludXggbmV0d29ya2luZyAoTkVUMykgZm9yIGluaXRpYWxpemF0aW9uLCBjb25maWd1cmF0aW9uIGFuZAorICogZGVpbnN0YWxsYXRpb25zIG9mIHRoZSBXYXZlbGFuIFBjbWNpYSBIYXJkd2FyZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29uZmlndXJlIGFuZCBzdGFydCB1cCB0aGUgV2F2ZUxBTiBQQ01DSUEgYWRhcHRvci4KKyAqIENhbGxlZCBieSBORVQzIHdoZW4gaXQgIm9wZW4iIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQKK3dhdmVsYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgbmV0X2xvY2FsICoJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBkZXZfbGlua190ICoJbGluayA9IGxwLT5saW5rOworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX29wZW4oZGV2PTB4JXgpXG4iLCBkZXYtPm5hbWUsCisJICh1bnNpZ25lZCBpbnQpIGRldik7CisjZW5kaWYKKworICAvKiBDaGVjayBpZiB0aGUgbW9kZW0gaXMgcG93ZXJlZCB1cCAod2F2ZWxhbl9jbG9zZSgpIHBvd2VyIGl0IGRvd24gKi8KKyAgaWYoaGFzcl9yZWFkKGJhc2UpICYgSEFTUl9OT19DTEspCisgICAgeworICAgICAgLyogUG93ZXIgdXAgKHBvd2VyIHVwIHRpbWUgaXMgMjUwdXMpICovCisgICAgICBoYWNyX3dyaXRlKGJhc2UsIEhBQ1JfREVGQVVMVCk7CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBtb2R1bGUgaGFzIGJlZW4gcG93ZXJlZCB1cC4uLiAqLworICAgICAgaWYoaGFzcl9yZWFkKGJhc2UpICYgSEFTUl9OT19DTEspCisJeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUlMKKwkgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3YXZlbGFuX29wZW4oKTogbW9kZW0gbm90IGNvbm5lY3RlZFxuIiwKKwkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkgIHJldHVybiBGQUxTRTsKKwl9CisgICAgfQorCisgIC8qIFN0YXJ0IHJlY2VwdGlvbiBhbmQgZGVjbGFyZSB0aGUgZHJpdmVyIHJlYWR5ICovCisgIGlmKCFscC0+Y29uZmlndXJlZCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmKCF3dl9ydV9zdGFydChkZXYpKQorICAgIHd2X2h3X3Jlc2V0KGRldik7CQkvKiBJZiBwcm9ibGVtIDogcmVzZXQgKi8KKyAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworICAvKiBNYXJrIHRoZSBkZXZpY2UgYXMgdXNlZCAqLworICBsaW5rLT5vcGVuKys7CisKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcKKyAgaWYoZG9fcm9hbWluZykKKyAgICB3dl9yb2FtX2luaXQoZGV2KTsKKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX29wZW4oKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNodXRkb3duIHRoZSBXYXZlTEFOIFBDTUNJQSBhZGFwdG9yLgorICogQ2FsbGVkIGJ5IE5FVDMgd2hlbiBpdCAiY2xvc2UiIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQKK3dhdmVsYW5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIGRldl9saW5rX3QgKglsaW5rID0gKChuZXRfbG9jYWwgKiluZXRkZXZfcHJpdihkZXYpKS0+bGluazsKKyAga2lvX2FkZHJfdAliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d2F2ZWxhbl9jbG9zZShkZXY9MHgleClcbiIsIGRldi0+bmFtZSwKKwkgKHVuc2lnbmVkIGludCkgZGV2KTsKKyNlbmRpZgorCisgIC8qIElmIHRoZSBkZXZpY2UgaXNuJ3Qgb3BlbiwgdGhlbiBub3RoaW5nIHRvIGRvICovCisgIGlmKCFsaW5rLT5vcGVuKQorICAgIHsKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3YXZlbGFuX2Nsb3NlKCk6IGRldmljZSBub3Qgb3BlblxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgIC8qIENsZWFudXAgb2Ygcm9hbWluZyBzdHVmZi4uLiAqLworICBpZihkb19yb2FtaW5nKQorICAgIHd2X3JvYW1fY2xlYW51cChkZXYpOworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCisgIGxpbmstPm9wZW4tLTsKKworICAvKiBJZiB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50ICovCisgIGlmKG5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICB7CisgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICAgIC8qIFN0b3AgcmVjZWl2aW5nIG5ldyBtZXNzYWdlcyBhbmQgd2FpdCBlbmQgb2YgdHJhbnNtaXNzaW9uICovCisgICAgICB3dl9ydV9zdG9wKGRldik7CisKKyAgICAgIC8qIFBvd2VyIGRvd24gdGhlIG1vZHVsZSAqLworICAgICAgaGFjcl93cml0ZShiYXNlLCBIQUNSX0RFRkFVTFQgJiAofkhBQ1JfUFdSX1NUQVQpKTsKKyAgICB9CisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9jbG9zZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogd2F2ZWxhbl9hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworICogbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlIChvbmUgaW50ZXJmYWNlKS4gIFRoZSBkZXZpY2UKKyAqIGlzIHJlZ2lzdGVyZWQgd2l0aCBDYXJkIFNlcnZpY2VzLgorICoKKyAqIFRoZSBkZXZfbGluayBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseQorICogY29uZmlndXJlIHRoZSBjYXJkIGF0IHRoaXMgcG9pbnQgLS0gd2Ugd2FpdCB1bnRpbCB3ZSByZWNlaXZlIGEKKyAqIGNhcmQgaW5zZXJ0aW9uIGV2ZW50LgorICovCitzdGF0aWMgZGV2X2xpbmtfdCAqCit3YXZlbGFuX2F0dGFjaCh2b2lkKQoreworICBjbGllbnRfcmVnX3QJY2xpZW50X3JlZzsJLyogUmVnaXN0ZXIgd2l0aCBjYXJkbWdyICovCisgIGRldl9saW5rX3QgKglsaW5rOwkJLyogSW5mbyBmb3IgY2FyZG1nciAqLworICBzdHJ1Y3QgbmV0X2RldmljZSAqCWRldjsJCS8qIEludGVyZmFjZSBnZW5lcmljIGRhdGEgKi8KKyAgbmV0X2xvY2FsICoJbHA7CQkvKiBJbnRlcmZhY2Ugc3BlY2lmaWMgZGF0YSAqLworICBpbnQJCXJldDsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICItPiB3YXZlbGFuX2F0dGFjaCgpXG4iKTsKKyNlbmRpZgorCisgIC8qIEluaXRpYWxpemUgdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlICovCisgIGxpbmsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCksIEdGUF9LRVJORUwpOworICBpZiAoIWxpbmspIHJldHVybiBOVUxMOworICBtZW1zZXQobGluaywgMCwgc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSk7CisKKyAgLyogVGhlIGlvIHN0cnVjdHVyZSBkZXNjcmliZXMgSU8gcG9ydCBtYXBwaW5nICovCisgIGxpbmstPmlvLk51bVBvcnRzMSA9IDg7CisgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisgIGxpbmstPmlvLklPQWRkckxpbmVzID0gMzsKKworICAvKiBJbnRlcnJ1cHQgc2V0dXAgKi8KKyAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKyAgbGluay0+aXJxLkhhbmRsZXIgPSB3YXZlbGFuX2ludGVycnVwdDsKKworICAvKiBHZW5lcmFsIHNvY2tldCBjb25maWd1cmF0aW9uICovCisgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgbGluay0+Y29uZi5WY2MgPSA1MDsKKyAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisKKyAgLyogQ2hhaW4gZHJpdmVycyAqLworICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgIGRldl9saXN0ID0gbGluazsKKworICAvKiBBbGxvY2F0ZSB0aGUgZ2VuZXJpYyBkYXRhIHN0cnVjdHVyZSAqLworICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YobmV0X2xvY2FsKSk7CisgIGlmICghZGV2KSB7CisgICAgICBrZnJlZShsaW5rKTsKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIGxpbmstPnByaXYgPSBsaW5rLT5pcnEuSW5zdGFuY2UgPSBkZXY7CisKKyAgbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgIC8qIEluaXQgc3BlY2lmaWMgZGF0YSAqLworICBscC0+Y29uZmlndXJlZCA9IDA7CisgIGxwLT5yZWNvbmZpZ184MjU5MyA9IEZBTFNFOworICBscC0+bnJlc2V0cyA9IDA7CisgIC8qIE11bHRpY2FzdCBzdHVmZiAqLworICBscC0+cHJvbWlzY3VvdXMgPSAwOworICBscC0+YWxsbXVsdGljYXN0ID0gMDsKKyAgbHAtPm1jX2NvdW50ID0gMDsKKworICAvKiBJbml0IHNwaW5sb2NrICovCisgIHNwaW5fbG9ja19pbml0KCZscC0+c3BpbmxvY2spOworCisgIC8qIGJhY2sgbGlua3MgKi8KKyAgbHAtPmxpbmsgPSBsaW5rOworICBscC0+ZGV2ID0gZGV2OworCisgIC8qIHdhdmVsYW4gTkVUMyBjYWxsYmFja3MgKi8KKyAgU0VUX01PRFVMRV9PV05FUihkZXYpOworICBkZXYtPm9wZW4gPSAmd2F2ZWxhbl9vcGVuOworICBkZXYtPnN0b3AgPSAmd2F2ZWxhbl9jbG9zZTsKKyAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2F2ZWxhbl9wYWNrZXRfeG1pdDsKKyAgZGV2LT5nZXRfc3RhdHMgPSAmd2F2ZWxhbl9nZXRfc3RhdHM7CisgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJndhdmVsYW5fc2V0X211bHRpY2FzdF9saXN0OworI2lmZGVmIFNFVF9NQUNfQUREUkVTUworICBkZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZ3YXZlbGFuX3NldF9tYWNfYWRkcmVzczsKKyNlbmRpZgkvKiBTRVRfTUFDX0FERFJFU1MgKi8KKworICAvKiBTZXQgdGhlIHdhdGNoZG9nIHRpbWVyICovCisgIGRldi0+dHhfdGltZW91dAk9ICZ3YXZlbGFuX3dhdGNoZG9nOworICBkZXYtPndhdGNoZG9nX3RpbWVvCT0gV0FUQ0hET0dfSklGRklFUzsKKyAgU0VUX0VUSFRPT0xfT1BTKGRldiwgJm9wcyk7CisKKyNpZmRlZiBXSVJFTEVTU19FWFQJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0IGluIHRoZSBrZXJuZWwgKi8KKyAgZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZ3YXZlbGFuX2hhbmRsZXJfZGVmOworICBscC0+d2lyZWxlc3NfZGF0YS5zcHlfZGF0YSA9ICZscC0+c3B5X2RhdGE7CisgIGRldi0+d2lyZWxlc3NfZGF0YSA9ICZscC0+d2lyZWxlc3NfZGF0YTsKKyNlbmRpZgorCisgIC8qIE90aGVyIHNwZWNpZmljIGRhdGEgKi8KKyAgZGV2LT5tdHUgPSBXQVZFTEFOX01UVTsKKworICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKyAgY2xpZW50X3JlZy5FdmVudE1hc2sgPSAKKyAgICBDU19FVkVOVF9SRUdJU1RSQVRJT05fQ09NUExFVEUgfAorICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKyAgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZ3YXZlbGFuX2V2ZW50OworICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworICBwcmludGsoS0VSTl9ERUJVRyAid2F2ZWxhbl9hdHRhY2goKTogYWxtb3N0IGRvbmUsIGNhbGxpbmcgcGNtY2lhX3JlZ2lzdGVyX2NsaWVudFxuIik7CisjZW5kaWYKKworICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKyAgaWYocmV0ICE9IDApCisgICAgeworICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKyAgICAgIHdhdmVsYW5fZGV0YWNoKGxpbmspOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIjwtIHdhdmVsYW5fYXR0YWNoKClcbiIpOworI2VuZGlmCisKKyAgcmV0dXJuIGxpbms7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIi4gIFRoZSBkZXZpY2UgaXMgZGUtcmVnaXN0ZXJlZCB3aXRoCisgKiBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhIHN0cnVjdHVyZXMKKyAqIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZCB3aGVuIHRoZSBkZXZpY2UKKyAqIGlzIHJlbGVhc2VkLgorICovCitzdGF0aWMgdm9pZAord2F2ZWxhbl9kZXRhY2goZGV2X2xpbmtfdCAqCWxpbmspCit7CisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIi0+IHdhdmVsYW5fZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKyNlbmRpZgorCisgIC8qCisgICAqIElmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgYW5kIGFjdGl2ZSwgd2Ugd29uJ3QKKyAgICogYWN0dWFsbHkgZGVsZXRlIGl0IHlldC4gIEluc3RlYWQsIGl0IGlzIG1hcmtlZCBzbyB0aGF0IHdoZW4gdGhlCisgICAqIHJlbGVhc2UoKSBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoYXQgd2lsbCB0cmlnZ2VyIGEgcHJvcGVyCisgICAqIGRldGFjaCgpLgorICAgKi8KKyAgaWYobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorICAgIHsKKyAgICAgIC8qIFNvbWUgb3RoZXJzIGhhdmVuJ3QgZG9uZSB0aGVpciBqb2IgOiBnaXZlIHRoZW0gYW5vdGhlciBjaGFuY2UgKi8KKyAgICAgIHd2X3BjbWNpYV9yZWxlYXNlKGxpbmspOworICAgIH0KKworICAvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgaWYobGluay0+aGFuZGxlKQorICAgIHBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworICAgIAorICAvKiBSZW1vdmUgdGhlIGludGVyZmFjZSBkYXRhIGZyb20gdGhlIGxpbmtlZCBsaXN0ICovCisgIGlmKGRldl9saXN0ID09IGxpbmspCisgICAgZGV2X2xpc3QgPSBsaW5rLT5uZXh0OworICBlbHNlCisgICAgeworICAgICAgZGV2X2xpbmtfdCAqCXByZXYgPSBkZXZfbGlzdDsKKworICAgICAgd2hpbGUoKHByZXYgIT0gKGRldl9saW5rX3QgKikgTlVMTCkgJiYgKHByZXYtPm5leHQgIT0gbGluaykpCisJcHJldiA9IHByZXYtPm5leHQ7CisKKyAgICAgIGlmKHByZXYgPT0gKGRldl9saW5rX3QgKikgTlVMTCkKKwl7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SUworCSAgcHJpbnRrKEtFUk5fV0FSTklORyAid2F2ZWxhbl9kZXRhY2ggOiBBdHRlbXB0aW5nIHRvIHJlbW92ZSBhIG5vbmV4aXN0ZW50IGRldmljZS5cbiIpOworI2VuZGlmCisJICByZXR1cm47CisJfQorCisgICAgICBwcmV2LT5uZXh0ID0gbGluay0+bmV4dDsKKyAgICB9CisKKyAgLyogRnJlZSBwaWVjZXMgKi8KKyAgaWYobGluay0+cHJpdikKKyAgICB7CisgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBsaW5rLT5wcml2OworCisgICAgICAvKiBSZW1vdmUgb3Vyc2VsdmVzIGZyb20gdGhlIGtlcm5lbCBsaXN0IG9mIGV0aGVybmV0IGRldmljZXMgKi8KKyAgICAgIC8qIFdhcm5pbmcgOiBjYW4ndCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQsIHRpbWVyIG9yIHdhdmVsYW5fY2xvc2UoKSAqLworICAgICAgaWYgKGxpbmstPmRldikKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworICAgICAgbGluay0+ZGV2ID0gTlVMTDsKKyAgICAgICgobmV0X2xvY2FsICopbmV0ZGV2X3ByaXYoZGV2KSktPmxpbmsgPSBOVUxMOworICAgICAgKChuZXRfbG9jYWwgKiluZXRkZXZfcHJpdihkZXYpKS0+ZGV2ID0gTlVMTDsKKyAgICAgIGZyZWVfbmV0ZGV2KGRldik7CisgICAgfQorICBrZnJlZShsaW5rKTsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICI8LSB3YXZlbGFuX2RldGFjaCgpXG4iKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIgc3R1ZmYKKyAqIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4gQSBDQVJEX1JFTU9WQUwgZXZlbnQgYWxzbyBzZXRzCisgKiBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nIHRvIHRhbGsgdG8gdGhlCisgKiBjYXJkIGFueSBtb3JlLgorICovCitzdGF0aWMgaW50Cit3YXZlbGFuX2V2ZW50KGV2ZW50X3QJCWV2ZW50LAkJLyogVGhlIGV2ZW50IHJlY2VpdmVkICovCisJICAgICAgaW50CQlwcmlvcml0eSwKKwkgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKglhcmdzKQoreworICBkZXZfbGlua190ICoJbGluayA9IChkZXZfbGlua190ICopIGFyZ3MtPmNsaWVudF9kYXRhOworICBzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBsaW5rLT5wcml2OworCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIi0+d2F2ZWxhbl9ldmVudCgpOiAlc1xuIiwKKwkgKChldmVudCA9PSBDU19FVkVOVF9SRUdJU1RSQVRJT05fQ09NUExFVEUpPyJyZWdpc3RyYXRpb24gY29tcGxldGUiIDoKKwkgICgoZXZlbnQgPT0gQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMKSA/ICJjYXJkIHJlbW92YWwiIDoKKwkgICAoKGV2ZW50ID09IENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OKSA/ICJjYXJkIGluc2VydGlvbiIgOgorCSAgICAoKGV2ZW50ID09IENTX0VWRU5UX1BNX1NVU1BFTkQpID8gInBtIHN1c3BlbmQiIDoKKwkgICAgICgoZXZlbnQgPT0gQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwpID8gInBoeXNpY2FsIHJlc2V0IiA6CisJICAgICAgKChldmVudCA9PSBDU19FVkVOVF9QTV9SRVNVTUUpID8gInBtIHJlc3VtZSIgOgorCSAgICAgICAoKGV2ZW50ID09IENTX0VWRU5UX0NBUkRfUkVTRVQpID8gImNhcmQgcmVzZXQiIDoKKwkJInVua25vd24iKSkpKSkpKSk7CisjZW5kaWYKKworICAgIHN3aXRjaChldmVudCkKKyAgICAgIHsKKyAgICAgIGNhc2UgQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFOgorI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisJcHJpbnRrKEtFUk5fREVCVUcgIndhdmVsYW5fY3M6IHJlZ2lzdHJhdGlvbiBjb21wbGV0ZVxuIik7CisjZW5kaWYKKwlicmVhazsKKworICAgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJLyogT3VwcyAhIFRoZSBjYXJkIGlzIG5vIG1vcmUgdGhlcmUgKi8KKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJaWYobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCSAgeworCSAgICAvKiBBY2NlcHQgbm8gbW9yZSB0cmFuc21pc3Npb25zICovCisJICAgIG5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKworCSAgICAvKiBSZWxlYXNlIHRoZSBjYXJkICovCisJICAgIHd2X3BjbWNpYV9yZWxlYXNlKGxpbmspOworCSAgfQorCWJyZWFrOworCisgICAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCS8qIFJlc2V0IGFuZCBjb25maWd1cmUgdGhlIGNhcmQgKi8KKwlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwlpZih3dl9wY21jaWFfY29uZmlnKGxpbmspICYmCisJICAgd3ZfaHdfY29uZmlnKGRldikpCisJICB3dl9pbml0X2luZm8oZGV2KTsKKwllbHNlCisJICBkZXYtPmlycSA9IDA7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkvKiBOQjogd2F2ZWxhbl9jbG9zZSB3aWxsIGJlIGNhbGxlZCwgYnV0IHRvbyBsYXRlLCBzbyB3ZSBhcmUKKwkgKiBvYmxpZ2VkIHRvIGNsb3NlIG5pY2VseSB0aGUgd2F2ZWxhbiBoZXJlLiBEYXZpZCwgY291bGQgeW91CisJICogY2xvc2UgdGhlIGRldmljZSBiZWZvcmUgc3VzcGVuZGluZyB0aGVtID8gQW5kLCBieSB0aGUgd2F5LAorCSAqIGNvdWxkIHlvdSwgb24gcmVzdW1lLCBhZGQgYSAicm91dGUgYWRkIC1uZXQgLi4uIiBhZnRlciB0aGUKKwkgKiBpZmNvbmZpZyB1cCA/IFRoYW5rcy4uLiAqLworCisJLyogU3RvcCByZWNlaXZpbmcgbmV3IG1lc3NhZ2VzIGFuZCB3YWl0IGVuZCBvZiB0cmFuc21pc3Npb24gKi8KKwl3dl9ydV9zdG9wKGRldik7CisKKwkvKiBQb3dlciBkb3duIHRoZSBtb2R1bGUgKi8KKwloYWNyX3dyaXRlKGRldi0+YmFzZV9hZGRyLCBIQUNSX0RFRkFVTFQgJiAofkhBQ1JfUFdSX1NUQVQpKTsKKworCS8qIFRoZSBjYXJkIGlzIG5vdyBzdXNwZW5kZWQgKi8KKwlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisgICAgCWlmKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkgIHsKKyAgICAgIAkgICAgaWYobGluay0+b3BlbikKKwkgICAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisgICAgICAJICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwkgIH0KKwlicmVhazsKKworICAgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCWlmKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkgIHsKKyAgICAgIAkgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKyAgICAgIAkgICAgaWYobGluay0+b3BlbikJLyogSWYgUkVTRVQgLT4gVHJ1ZSwgSWYgUkVTVU1FIC0+IEZhbHNlID8gKi8KKwkgICAgICB7CisJCXd2X2h3X3Jlc2V0KGRldik7CisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkgICAgICB9CisJICB9CisJYnJlYWs7CisgICAgfQorCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIjwtd2F2ZWxhbl9ldmVudCgpXG4iKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHdhdmVsYW5fZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAid2F2ZWxhbl9jcyIsCisJfSwKKwkuYXR0YWNoCQk9IHdhdmVsYW5fYXR0YWNoLAorCS5kZXRhY2gJCT0gd2F2ZWxhbl9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF93YXZlbGFuX2NzKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJndhdmVsYW5fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitleGl0X3dhdmVsYW5fY3Modm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJndhdmVsYW5fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF93YXZlbGFuX2NzKTsKK21vZHVsZV9leGl0KGV4aXRfd2F2ZWxhbl9jcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljZmY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuaApAQCAtMCwwICsxLDM4NiBAQAorLyoKKyAqCVdhdmVsYW4gUGNtY2lhIGRyaXZlcgorICoKKyAqCQlKZWFuIElJIC0gSFBMQiAnOTYKKyAqCisgKiBSZW9yZ2FuaXphdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIHRoZSBkcml2ZXIuCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgZm9sbG93LiBTZWUgd2F2ZWxhbl9jcy5oIGZvciBkZXRhaWxzLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWluIHRoZSBkZWNsYXJhdGlvbnMgb2YgdGhlIFdhdmVsYW4gaGFyZHdhcmUuIE5vdGUgdGhhdAorICogdGhlIFBjbWNpYSBXYXZlbGFuIGluY2x1ZGUgYSBpODI1OTMgY29udHJvbGxlciAoc2VlIGRlZmluaXRpb25zIGluCisgKiBmaWxlIGk4MjU5My5oKS4KKyAqCisgKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBjbWNpYSBoYXJkd2FyZSBhbmQgdGhlIElTQSBvbmUgaXMKKyAqIHRoZSBFdGhlcm5ldCBDb250cm9sbGVyIChpODI1OTMgaW5zdGVhZCBvZiBpODI1ODYpLiBUaGUgaTgyNTkzIGFsbG93CisgKiBvbmx5IG9uZSBzZW5kIGJ1ZmZlci4gVGhlIFBTQSAoUGFyYW1ldGVyIFN0b3JhZ2UgQXJlYSA6IEVFcHJvbSBmb3IKKyAqIHBlcm1hbmVudCBzdG9yYWdlIG9mIHZhcmlvdXMgaW5mbykgaXMgbWVtb3J5IG1hcHBlZCwgYnV0IG5vdCB0aGUKKyAqIE1NSSAoTW9kZW0gTWFuYWdlbWVudCBJbnRlcmZhY2UpLgorICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIEFUJlQgR0lTIChmb3JtZXJseSBOQ1IpIFdhdmVMQU4gUENNQ0lBIGNhcmQ6IAorICogICBBbiBFdGhlcm5ldC1saWtlIHJhZGlvIHRyYW5zY2VpdmVyIGNvbnRyb2xsZWQgYnkgYW4gSW50ZWwgODI1OTMKKyAqICAgY29wcm9jZXNzb3IuCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvcHlyaWdodCAxOTk1CisgKiAgIEFudGhvbnkgRC4gSm9zZXBoCisgKiAgIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgcHJvZ3JhbQorICogICBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZAorICogICB0aGF0IHRoaXMgY29weXJpZ2h0IGFuZCBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgb24gYWxsIGNvcGllcworICogICBhbmQgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQKKyAqICAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorICogICBwcm9ncmFtIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgcGVybWlzc2lvbiwgYW5kIG5vdGljZSBiZSBnaXZlbgorICogICBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24gdGhhdCBjb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gaXMKKyAqICAgYnkgcGVybWlzc2lvbiBvZiBNLkkuVC4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQKKyAqICAgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvLQorICogICB2aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LiAgICAgICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgorICogQ3JlZGl0czoKKyAqICAgICBTcGVjaWFsIHRoYW5rcyB0byBKYW4gSG9vZ2VuZG9vcm4gb2YgQVQmVCBHSVMgVXRyZWNodCBmb3IKKyAqICAgICAgIHByb3ZpZGluZyBleHRyZW1lbHkgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IFdhdmVMQU4gUENNQ0lBIGhhcmR3YXJlCisgKgorICogICAgIFRoaXMgZHJpdmVyIGlzIGJhc2VkIHVwb24gc2V2ZXJhbCBvdGhlciBkcml2ZXJzLCBpbiBwYXJ0aWN1bGFyOgorICogICAgICAgRGF2aWQgSGluZHMnIExpbnV4IGRyaXZlciBmb3IgdGhlIFBDTUNJQSAzYzU4OSBldGhlcm5ldCBhZGFwdGVyCisgKiAgICAgICBCcnVjZSBKYW5zb24ncyBMaW51eCBkcml2ZXIgZm9yIHRoZSBBVC1idXMgV2F2ZUxBTiBhZGFwdGVyCisgKgkgQW5kZXJzIEtsZW1ldHMnIFBDTUNJQSBXYXZlTEFOIGFkYXB0ZXIgZHJpdmVyCisgKiAgICAgICBSb2JlcnQgTW9ycmlzJyBCU0RJIGRyaXZlciBmb3IgdGhlIFBDTUNJQSBXYXZlTEFOIGFkYXB0ZXIKKyAqLworCisjaWZuZGVmIF9XQVZFTEFOX0NTX0gKKyNkZWZpbmUJX1dBVkVMQU5fQ1NfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogTUFHSUMgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBkZXRlY3Rpb24gb2YgdGhlIHdhdmVsYW4gY2FyZCBpcyBtYWRlIGJ5IHJlYWRpbmcgdGhlIE1BQyBhZGRyZXNzCisgKiBmcm9tIHRoZSBjYXJkIGFuZCBjaGVja2luZyBpdC4gSWYgeW91IGhhdmUgYSBub24gQVQmVCBwcm9kdWN0IChPRU0sCisgKiBsaWtlIERFQyBSb2FtQWJvdXQsIG9yIERpZ2l0YWwgT2NlYW4sIEVwc29uLCAuLi4pLCB5b3UgbXVzdCBtb2RpZnkgdGhpcworICogcGFydCB0byBhY2NvbW1vZGF0ZSB5b3VyIGhhcmR3YXJlLi4uCisgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIJTUFDX0FERFJFU1NFU1tdWzNdID0KK3sKKyAgeyAweDA4LCAweDAwLCAweDBFIH0sCQkvKiBBVCZUIFdhdmVsYW4gKHN0YW5kYXJkKSAmIERFQyBSb2FtQWJvdXQgKi8KKyAgeyAweDA4LCAweDAwLCAweDZBIH0sCQkvKiBBVCZUIFdhdmVsYW4gKGFsdGVybmF0ZSkgKi8KKyAgeyAweDAwLCAweDAwLCAweEUxIH0sCQkvKiBIaXRhY2hpIFdhdmVsYW4gKi8KKyAgeyAweDAwLCAweDYwLCAweDFEIH0JCS8qIEx1Y2VudCBXYXZlbGFuIChhbm90aGVyIG9uZSkgKi8KKyAgLyogQWRkIHlvdXIgY2FyZCBoZXJlIGFuZCBzZW5kIG1lIHRoZSBwYXRjaCAhICovCit9OworCisvKgorICogQ29uc3RhbnRzIHVzZWQgdG8gY29udmVydCBjaGFubmVscyB0byBmcmVxdWVuY2llcworICovCisKKy8qIEZyZXF1ZW5jeSBhdmFpbGFibGUgaW4gdGhlIDIuMCBtb2RlbSwgaW4gdW5pdHMgb2YgMjUwIGtIegorICogKGFzIHJlYWQgaW4gdGhlIG9mZnNldCByZWdpc3RlciBvZiB0aGUgZGFjIGFyZWEpLgorICogVXNlZCB0byBtYXAgY2hhbm5lbCBudW1iZXJzIHVzZWQgYnkgYHdmcmVxc2VsJyB0byBmcmVxdWVuY2llcworICovCitjb25zdCBzaG9ydAljaGFubmVsX2JhbmRzW10gPSB7IDB4MzAsIDB4NTgsIDB4NjQsIDB4N0EsIDB4ODAsIDB4QTgsCisJCQkJICAgIDB4RDAsIDB4RjAsIDB4RjgsIDB4MTUwIH07CisKKy8qIEZyZXF1ZW5jaWVzIG9mIHRoZSAxLjAgbW9kZW0gKGZpeGVkIGZyZXF1ZW5jaWVzKS4KKyAqIFVzZSB0byBtYXAgdGhlIFBTQSBgc3ViYmFuZCcgdG8gYSBmcmVxdWVuY3kKKyAqIE5vdGUgOiBhbGwgZnJlcXVlbmNpZXMgYXBhcnQgZnJvbSB0aGUgZmlyc3Qgb25lIG5lZWQgdG8gYmUgbXVsdGlwbGllZCBieSAxMAorICovCitjb25zdCBpbnQJZml4ZWRfYmFuZHNbXSA9IHsgOTE1ZTYsIDIuNDI1ZTgsIDIuNDZlOCwgMi40ODRlOCwgMi40MzA1ZTggfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBXYXZlTEFOIGhvc3QgaW50ZXJmYWNlIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUJTENDUihiYXNlKQkoYmFzZSkJCS8qIExBTiBDb250cm9sbGVyIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTENTUihiYXNlKQkoYmFzZSkJCS8qIExBTiBDb250cm9sbGVyIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlIQUNSKGJhc2UpCShiYXNlKzB4MSkJLyogSG9zdCBBZGFwdGVyIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEFTUihiYXNlKQkoYmFzZSsweDEpCS8qIEhvc3QgQWRhcHRlciBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPUkwoYmFzZSkJKGJhc2UrMHgyKQkvKiBQcm9ncmFtIEkvTyBSZWdpc3RlciBMb3cgKi8KKyNkZWZpbmUgUlBMTChiYXNlKQkoYmFzZSsweDIpCS8qIFJlY2VpdmUgUG9pbnRlciBMYXRjaGVkIExvdyAqLworI2RlZmluZSBQSU9SSChiYXNlKQkoYmFzZSsweDMpCS8qIFByb2dyYW0gSS9PIFJlZ2lzdGVyIEhpZ2ggKi8KKyNkZWZpbmUgUlBMSChiYXNlKQkoYmFzZSsweDMpCS8qIFJlY2VpdmUgUG9pbnRlciBMYXRjaGVkIEhpZ2ggKi8KKyNkZWZpbmUgUElPUChiYXNlKQkoYmFzZSsweDQpCS8qIFByb2dyYW0gSS9PIFBvcnQgKi8KKyNkZWZpbmUgTU1SKGJhc2UpCShiYXNlKzB4NikJLyogTU1JIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTU1EKGJhc2UpCShiYXNlKzB4NykJLyogTU1JIERhdGEgUmVnaXN0ZXIgKi8KKworLyogSG9zdCBBZGFwdG9yIENvbW1hbmQgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgSEFDUl9MT0YJICAoMSA8PCAzKQkvKiBMb2NrIE91dCBGbGFnLCB0b2dnbGUgZXZlcnkgMjUwbXMgKi8KKyNkZWZpbmUgSEFDUl9QV1JfU1RBVAkgICgxIDw8IDQpCS8qIFBvd2VyIFN0YXRlLCAxPWFjdGl2ZSwgMD1zbGVlcCAqLworI2RlZmluZSBIQUNSX1RYX0RNQV9SRVNFVCAoMSA8PCA1KQkvKiBSZXNldCB0cmFuc21pdCBETUEgcHRyIG9uIGhpZ2ggKi8KKyNkZWZpbmUgSEFDUl9SWF9ETUFfUkVTRVQgKDEgPDwgNikJLyogUmVzZXQgcmVjZWl2ZSBETUEgcHRyIG9uIGhpZ2ggKi8KKyNkZWZpbmUgSEFDUl9ST01fV0VOCSAgKDEgPDwgNykJLyogRUVQUk9NIHdyaXRlIGVuYWJsZWQgd2hlbiB0cnVlICovCisKKyNkZWZpbmUgSEFDUl9SRVNFVCAgICAgICAgICAgICAgKEhBQ1JfVFhfRE1BX1JFU0VUIHwgSEFDUl9SWF9ETUFfUkVTRVQpCisjZGVmaW5lCUhBQ1JfREVGQVVMVAkJKEhBQ1JfUFdSX1NUQVQpCisKKy8qIEhvc3QgQWRhcHRlciBTdGF0dXMgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgSEFTUl9NTUlfQlVTWQkoMSA8PCAyKQkvKiBNTUkgaXMgYnVzeSB3aGVuIHRydWUgKi8KKyNkZWZpbmUgSEFTUl9MT0YJKDEgPDwgMykJLyogTG9jayBvdXQgZmxhZyBzdGF0dXMgKi8KKyNkZWZpbmUgSEFTUl9OT19DTEsJKDEgPDwgNCkJLyogYWN0aXZlIHdoZW4gbW9kZW0gbm90IGNvbm5lY3RlZCAqLworCisvKiBNaXNjZWxsYW5lb3VzIGJpdCBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIFBJT1JIX1NFTF9UWAkoMSA8PCA1KQkvKiBQSU9SIHBvaW50cyB0byAwPXJ4LzE9dHggYnVmZmVyICovCisjZGVmaW5lIE1NUl9NTUlfV1IJKDEgPDwgMCkJLyogTmV4dCBNTUkgY3ljbGUgaXMgMD1yZWFkLCAxPXdyaXRlICovCisjZGVmaW5lIFBJT1JIX01BU0sJMHgxZgkJLyogb25seSBsb3cgNSBiaXRzIGFyZSBzaWduaWZpY2FudCAqLworI2RlZmluZSBSUExIX01BU0sJMHgxZgkJLyogb25seSBsb3cgNSBiaXRzIGFyZSBzaWduaWZpY2FudCAqLworI2RlZmluZSBNTUlfQUREUl9NQVNLCTB4N2UJCS8qIEJpdHMgMS02IG9mIE1NUiBhcmUgc2lnbmlmaWNhbnQgKi8KKworLyogQXR0cmlidXRlIE1lbW9yeSBtYXAgKi8KKworI2RlZmluZSBDSVNfQUREUgkweDAwMDAJCS8qIENhcmQgSW5mb3JtYXRpb24gU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBTQV9BRERSCTB4MGUwMAkJLyogUGFyYW1ldGVyIFN0b3JhZ2UgQXJlYSBhZGRyZXNzICovCisjZGVmaW5lIEVFUFJPTV9BRERSCTB4MTAwMAkJLyogRUVQUk9NIGFkZHJlc3MgKHVudXNlZCA/KSAqLworI2RlZmluZSBDT1JfQUREUgkweDQwMDAJCS8qIENvbmZpZ3VyYXRpb24gT3B0aW9uIFJlZ2lzdGVyICovCisKKy8qIENvbmZpZ3VyYXRpb24gT3B0aW9uIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIENPUl9DT05GSUcJKDEgPDwgMCkJLyogQ29uZmlnIEluZGV4LCAwIHdoZW4gdW5jb25maWd1cmVkICovCisjZGVmaW5lIENPUl9TV19SRVNFVAkoMSA8PCA3KQkvKiBTb2Z0d2FyZSBSZXNldCBvbiB0cnVlICovCisjZGVmaW5lIENPUl9MRVZFTF9JUlEJKDEgPDwgNikJLyogTGV2ZWwgSVJRICovCisKKy8qIExvY2FsIE1lbW9yeSBtYXAgKi8KKworI2RlZmluZSBSWF9CQVNFCQkweDAwMDAJCS8qIFJlY2VpdmUgbWVtb3J5LCA4IGtCICovCisjZGVmaW5lIFRYX0JBU0UJCTB4MjAwMAkJLyogVHJhbnNtaXQgbWVtb3J5LCAyIGtCICovCisjZGVmaW5lIFVOVVNFRF9CQVNFCTB4MjgwMAkJLyogVW51c2VkLCAyMiBrQiAqLworI2RlZmluZSBSWF9TSVpFCQkoVFhfQkFTRS1SWF9CQVNFKQkvKiBTaXplIG9mIHJlY2VpdmUgYXJlYSAqLworI2RlZmluZSBSWF9TSVpFX1NISUZUCTYJCS8qIEJpdHMgdG8gc2hpZnQgaW4gc3RvcCByZWdpc3RlciAqLworCisjZGVmaW5lIFRSVUUgIDEKKyNkZWZpbmUgRkFMU0UgMAorCisjZGVmaW5lIE1PRF9FTkFMIDEKKyNkZWZpbmUgTU9EX1BST00gMgorCisvKiBTaXplIG9mIGEgTUFDIGFkZHJlc3MgKi8KKyNkZWZpbmUgV0FWRUxBTl9BRERSX1NJWkUJNgorCisvKiBNYXhpbXVtIHNpemUgb2YgV2F2ZWxhbiBwYWNrZXQgKi8KKyNkZWZpbmUgV0FWRUxBTl9NVFUJMTUwMAorCisjZGVmaW5lCU1BWERBVEFaCQkoNiArIDYgKyAyICsgV0FWRUxBTl9NVFUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFBBUkFNRVRFUiBTVE9SQUdFIEFSRUEgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgKFBTQSkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHBzYV90CXBzYV90Oworc3RydWN0IHBzYV90Cit7CisgIC8qIEZvciB0aGUgUENNQ0lBIEFkYXB0ZXIsIGxvY2F0aW9ucyAweDAwLTB4MEYgYXJlIHVudXNlZCBhbmQgZml4ZWQgYXQgMDAgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfaW9fYmFzZV9hZGRyXzE7CS8qIFsweDAwXSBCYXNlIGFkZHJlc3MgMSA/Pz8gKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfaW9fYmFzZV9hZGRyXzI7CS8qIFsweDAxXSBCYXNlIGFkZHJlc3MgMiAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9pb19iYXNlX2FkZHJfMzsJLyogWzB4MDJdIEJhc2UgYWRkcmVzcyAzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2lvX2Jhc2VfYWRkcl80OwkvKiBbMHgwM10gQmFzZSBhZGRyZXNzIDQgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcmVtX2Jvb3RfYWRkcl8xOwkvKiBbMHgwNF0gUmVtb3RlIEJvb3QgQWRkcmVzcyAxICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3JlbV9ib290X2FkZHJfMjsJLyogWzB4MDVdIFJlbW90ZSBCb290IEFkZHJlc3MgMiAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9yZW1fYm9vdF9hZGRyXzM7CS8qIFsweDA2XSBSZW1vdGUgQm9vdCBBZGRyZXNzIDMgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfaG9saV9wYXJhbXM7CS8qIFsweDA3XSBIT3N0IExhbiBJbnRlcmZhY2UgKEhPTEkpIFBhcmFtZXRlcnMgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfaW50X3JlcV9ubzsJCS8qIFsweDA4XSBJbnRlcnJ1cHQgUmVxdWVzdCBMaW5lICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3VudXNlZDBbN107CQkvKiBbMHgwOS0weDBGXSB1bnVzZWQgKi8KKworICB1bnNpZ25lZCBjaGFyCXBzYV91bml2X21hY19hZGRyW1dBVkVMQU5fQUREUl9TSVpFXTsJLyogWzB4MTAtMHgxNV0gVW5pdmVyc2FsIChmYWN0b3J5KSBNQUMgQWRkcmVzcyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9sb2NhbF9tYWNfYWRkcltXQVZFTEFOX0FERFJfU0laRV07CS8qIFsweDE2LTFCXSBMb2NhbCBNQUMgQWRkcmVzcyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV91bml2X2xvY2FsX3NlbDsJLyogWzB4MUNdIFVuaXZlcnNhbCBMb2NhbCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUJCVBTQV9VTklWRVJTQUwJMAkJLyogVW5pdmVyc2FsIChmYWN0b3J5KSAqLworI2RlZmluZQkJUFNBX0xPQ0FMCTEJCS8qIExvY2FsICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2NvbXBfbnVtYmVyOwkvKiBbMHgxRF0gQ29tcGF0YWJpbGl0eSBOdW1iZXI6ICovCisjZGVmaW5lCQlQU0FfQ09NUF9QQ19BVF85MTUJMCAJLyogUEMtQVQgOTE1IE1IegkqLworI2RlZmluZQkJUFNBX0NPTVBfUENfTUNfOTE1CTEgCS8qIFBDLU1DIDkxNSBNSHoJKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX0FUXzI0MDAJMiAJLyogUEMtQVQgMi40IEdIegkqLworI2RlZmluZQkJUFNBX0NPTVBfUENfTUNfMjQwMAkzIAkvKiBQQy1NQyAyLjQgR0h6CSovCisjZGVmaW5lCQlQU0FfQ09NUF9QQ01DSUFfOTE1CTQgCS8qIFBDTUNJQSA5MTUgTUh6IG9yIDIuMCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV90aHJfcHJlX3NldDsJLyogWzB4MUVdIE1vZGVtIFRocmVzaG9sZCBQcmVzZXQgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfZmVhdHVyZV9zZWxlY3Q7CS8qIFsweDFGXSBDYWxsIGNvZGUgcmVxdWlyZWQgKDE9b24pICovCisjZGVmaW5lCQlQU0FfRkVBVFVSRV9DQUxMX0NPREUJMHgwMSAJLyogQ2FsbCBjb2RlIHJlcXVpcmVkIChKYXBhbikgKi8KKyAgdW5zaWduZWQgY2hhcglwc2Ffc3ViYmFuZDsJCS8qIFsweDIwXSBTdWJiYW5kCSovCisjZGVmaW5lCQlQU0FfU1VCQkFORF85MTUJCTAJLyogOTE1IE1IeiBvciAyLjAgKi8KKyNkZWZpbmUJCVBTQV9TVUJCQU5EXzI0MjUJMQkvKiAyNDI1IE1IegkqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfMjQ2MAkyCS8qIDI0NjAgTUh6CSovCisjZGVmaW5lCQlQU0FfU1VCQkFORF8yNDg0CTMJLyogMjQ4NCBNSHoJKi8KKyNkZWZpbmUJCVBTQV9TVUJCQU5EXzI0MzBfNQk0CS8qIDI0MzAuNSBNSHoJKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcXVhbGl0eV90aHI7CS8qIFsweDIxXSBNb2RlbSBRdWFsaXR5IFRocmVzaG9sZCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9tb2RfZGVsYXk7CQkvKiBbMHgyMl0gTW9kZW0gRGVsYXkgPz8/IChyZXNlcnZlZCkgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfbndpZFsyXTsJCS8qIFsweDIzLTB4MjRdIE5ldHdvcmsgSUQgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfbndpZF9zZWxlY3Q7CS8qIFsweDI1XSBOZXR3b3JrIElEIFNlbGVjdCBPbiBPZmYgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfZW5jcnlwdGlvbl9zZWxlY3Q7CS8qIFsweDI2XSBFbmNyeXB0aW9uIE9uIE9mZiAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9lbmNyeXB0aW9uX2tleVs4XTsJLyogWzB4MjctMHgyRV0gRW5jcnlwdGlvbiBLZXkgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfZGF0YWJ1c193aWR0aDsJLyogWzB4MkZdIEFUIGJ1cyB3aWR0aCBzZWxlY3QgOC8xNiAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9jYWxsX2NvZGVbOF07CS8qIFsweDMwLTB4MzddIChKYXBhbikgQ2FsbCBDb2RlICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX253aWRfcHJlZml4WzJdOwkvKiBbMHgzOC0weDM5XSBSb2FtaW5nIGRvbWFpbiAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9yZXNlcnZlZFsyXTsJLyogWzB4M0EtMHgzQl0gUmVzZXJ2ZWQgLSBmaXhlZCAwMCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9jb25mX3N0YXR1czsJLyogWzB4M0NdIENvbmYgU3RhdHVzLCBiaXQgMD0xOmNvbmZpZyovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2NyY1syXTsJCS8qIFsweDNEXSBDUkMtMTYgb3ZlciBQU0EgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY3JjX3N0YXR1czsJCS8qIFsweDNGXSBDUkMgVmFsaWQgRmxhZyAqLworfTsKKworLyogU2l6ZSBmb3Igc3RydWN0dXJlIGNoZWNraW5nIChpZiBwYWRkaW5nIGlzIGNvcnJlY3QpICovCisjZGVmaW5lCVBTQV9TSVpFCTY0CisKKy8qIENhbGN1bGF0ZSBvZmZzZXQgb2YgYSBmaWVsZCBpbiB0aGUgYWJvdmUgc3RydWN0dXJlCisgKiBXYXJuaW5nIDogb25seSBldmVuIGFkZHJlc3NlcyBhcmUgdXNlZCAqLworI2RlZmluZQlwc2FvZmYocCxmKSAJKCh1bnNpZ25lZCBzaG9ydCkgKCh2b2lkICopKCYoKHBzYV90ICopICgodm9pZCAqKSBOVUxMICsgKHApKSktPmYpIC0gKHZvaWQgKikgTlVMTCkpCisKKy8qKioqKioqKioqKioqKioqKioqKiBNT0RFTSBNQU5BR0VNRU5UIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlciAoTU1DKSB3cml0ZSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1td190CW1td190Oworc3RydWN0IG1td190Cit7CisgIHVuc2lnbmVkIGNoYXIJbW13X2VuY3Jfa2V5WzhdOwkvKiBlbmNyeXB0aW9uIGtleSAqLworICB1bnNpZ25lZCBjaGFyCW1td19lbmNyX2VuYWJsZTsJLyogZW5hYmxlL2Rpc2FibGUgZW5jcnlwdGlvbiAqLworI2RlZmluZQlNTVdfRU5DUl9FTkFCTEVfTU9ERQkweDAyCS8qIE1vZGUgb2Ygc2VjdXJpdHkgb3B0aW9uICovCisjZGVmaW5lCU1NV19FTkNSX0VOQUJMRV9FTgkweDAxCS8qIEVuYWJsZSBzZWN1cml0eSBvcHRpb24gKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdW51c2VkMFsxXTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19kZXNfaW9faW52ZXJ0OwkvKiBFbmNyeXB0aW9uIG9wdGlvbiAqLworI2RlZmluZQlNTVdfREVTX0lPX0lOVkVSVF9SRVMJMHgwRgkvKiBSZXNlcnZlZCAqLworI2RlZmluZQlNTVdfREVTX0lPX0lOVkVSVF9DVFJMCTB4RjAJLyogQ29udHJvbCA/Pz8gKHNldCB0byAwKSAqLworICB1bnNpZ25lZCBjaGFyCW1td191bnVzZWQxWzVdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2xvb3B0X3NlbDsJCS8qIGxvb3B0ZXN0IHNlbGVjdGlvbiAqLworI2RlZmluZQlNTVdfTE9PUFRfU0VMX0RJU19OV0lECTB4NDAJLyogZGlzYWJsZSBOV0lEIGZpbHRlcmluZyAqLworI2RlZmluZQlNTVdfTE9PUFRfU0VMX0lOVAkweDIwCS8qIGFjdGl2YXRlIEF0dGVudGlvbiBSZXF1ZXN0ICovCisjZGVmaW5lCU1NV19MT09QVF9TRUxfTFMJMHgxMAkvKiBsb29wdGVzdCB3L28gY29sbGlzaW9uIGF2b2lkYW5jZSAqLworI2RlZmluZSBNTVdfTE9PUFRfU0VMX0xUM0EJMHgwOAkvKiBsb29wdGVzdCAzYSAqLworI2RlZmluZQlNTVdfTE9PUFRfU0VMX0xUM0IJMHgwNAkvKiBsb29wdGVzdCAzYiAqLworI2RlZmluZQlNTVdfTE9PUFRfU0VMX0xUM0MJMHgwMgkvKiBsb29wdGVzdCAzYyAqLworI2RlZmluZQlNTVdfTE9PUFRfU0VMX0xUM0QJMHgwMQkvKiBsb29wdGVzdCAzZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19qYWJiZXJfZW5hYmxlOwkvKiBqYWJiZXIgdGltZXIgZW5hYmxlICovCisgIC8qIEFib3J0IHRyYW5zbWlzc2lvbnMgPiAyMDAgbXMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZnJlZXplOwkJLyogZnJlZXplIC8gdW5mcmVlZXplIHNpZ25hbCBsZXZlbCAqLworICAvKiAwIDogc2lnbmFsIGxldmVsICYgcXVhbCB1cGRhdGVkIGZvciBldmVyeSBuZXcgbWVzc2FnZSwgMSA6IGZyb3plbiAqLworICB1bnNpZ25lZCBjaGFyCW1td19hbnRlbl9zZWw7CQkvKiBhbnRlbm5hIHNlbGVjdGlvbiAqLworI2RlZmluZSBNTVdfQU5URU5fU0VMX1NFTAkweDAxCS8qIGRpcmVjdCBhbnRlbm5hIHNlbGVjdGlvbiAqLworI2RlZmluZQlNTVdfQU5URU5fU0VMX0FMR19FTgkweDAyCS8qIGFudGVubmEgc2VsZWN0aW9uIGFsZ28uIGVuYWJsZSAqLworICB1bnNpZ25lZCBjaGFyCW1td19pZnM7CQkvKiBpbnRlciBmcmFtZSBzcGFjaW5nICovCisgIC8qIG1pbiB0aW1lIGJldHdlZW4gdHJhbnNtaXNzaW9uIGluIGJpdCBwZXJpb2RzICguNSB1cykgLSBiaXQgMCBpZ25vcmVkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X21vZF9kZWxheTsJIAkvKiBtb2RlbSBkZWxheSAoc3luY2hybykgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfamFtX3RpbWU7CQkvKiBqYW1taW5nIHRpbWUgKGFmdGVyIGNvbGxpc2lvbikgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdW51c2VkMlsxXTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td190aHJfcHJlX3NldDsJLyogbGV2ZWwgdGhyZXNob2xkIHByZXNldCAqLworICAvKiBEaXNjYXJkIGFsbCBwYWNrZXQgd2l0aCBzaWduYWwgPCB0aGlzIHZhbHVlICg0KSAqLworICB1bnNpZ25lZCBjaGFyCW1td19kZWNheV9wcm07CQkvKiBkZWNheSBwYXJhbWV0ZXJzICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2RlY2F5X3VwZGF0X3BybTsJLyogZGVjYXkgdXBkYXRlIHBhcmFtZXRlcnogKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfcXVhbGl0eV90aHI7CS8qIHF1YWxpdHkgKHotcXVvdGllbnQpIHRocmVzaG9sZCAqLworICAvKiBEaXNjYXJkIGFsbCBwYWNrZXQgd2l0aCBxdWFsaXR5IDwgdGhpcyB2YWx1ZSAoMykgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfbmV0d19pZF9sOwkJLyogTldJRCBsb3cgb3JkZXIgYnl0ZSAqLworICB1bnNpZ25lZCBjaGFyCW1td19uZXR3X2lkX2g7CQkvKiBOV0lEIGhpZ2ggb3JkZXIgYnl0ZSAqLworICAvKiBOZXR3b3JrIElEIG9yIERvbWFpbiA6IGNyZWF0ZSB2aXJ0dWFsIG5ldCBvbiB0aGUgYWlyICovCisKKyAgLyogMi4wIEhhcmR3YXJlIGV4dGVuc2lvbiAtIGZyZXF1ZW5jeSBzZWxlY3Rpb24gc3VwcG9ydCAqLworICB1bnNpZ25lZCBjaGFyCW1td19tb2RlX3NlbGVjdDsJLyogZm9yIGFuYWxvZyB0ZXN0cyAoc2V0IHRvIDApICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3VudXNlZDNbMV07CQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZmVlX2N0cmw7CQkvKiBmcmVxdWVuY3kgZWVwcm9tIGNvbnRyb2wgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1BSRQkweDEwCS8qIEVuYWJsZSBwcm90ZWN0ZWQgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9EV0xECTB4MDgJLyogRG93bmxvYWQgZWVwcm9tIHRvIG1tYyAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfQ01ECTB4MDcJLyogRUVwcm9tIGNvbW1hbmRzIDogKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1JFQUQJMHgwNgkvKiBSZWFkICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9XUkVOCTB4MDQJLyogV3JpdGUgZW5hYmxlICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9XUklURQkweDA1CS8qIFdyaXRlIGRhdGEgdG8gYWRkcmVzcyAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfV1JBTEwJMHgwNAkvKiBXcml0ZSBkYXRhIHRvIGFsbCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1dEUwkweDA0CS8qIFdyaXRlIGRpc2FibGUgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1BSUkVBRAkweDE2CS8qIFJlYWQgYWRkciBmcm9tIHByb3RlY3QgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1BSRU4JMHgxNAkvKiBQcm90ZWN0IHJlZ2lzdGVyIGVuYWJsZSAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJDTEVBUgkweDE3CS8qIFVucHJvdGVjdCBhbGwgcmVnaXN0ZXJzICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUldSSVRFCTB4MTUJLyogV3JpdGUgYWRkciBpbiBwcm90ZWN0IHJlZ2lzdGVyICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUkRTCTB4MTQJLyogUHJvdGVjdCByZWdpc3RlciBkaXNhYmxlICovCisgIC8qIE5ldmVyIGlzc3VlIHRoaXMgY29tbWFuZCAoUFJEUykgOiBpdCdzIGlycmV2ZXJzaWJsZSAhISEgKi8KKworICB1bnNpZ25lZCBjaGFyCW1td19mZWVfYWRkcjsJCS8qIEVFcHJvbSBhZGRyZXNzICovCisjZGVmaW5lCU1NV19GRUVfQUREUl9DSEFOTkVMCTB4RjAJLyogU2VsZWN0IHRoZSBjaGFubmVsICovCisjZGVmaW5lCU1NV19GRUVfQUREUl9PRkZTRVQJMHgwRgkvKiBPZmZzZXQgaW4gY2hhbm5lbCBkYXRhICovCisjZGVmaW5lCU1NV19GRUVfQUREUl9FTgkJMHhDMAkvKiBGRUVfQ1RSTCBlbmFibGUgb3BlcmF0aW9ucyAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfRFMJCTB4MDAJLyogRkVFX0NUUkwgZGlzYWJsZSBvcGVyYXRpb25zICovCisjZGVmaW5lCU1NV19GRUVfQUREUl9BTEwJMHg0MAkvKiBGRUVfQ1RSTCBhbGwgb3BlcmF0aW9ucyAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfQ0xFQVIJMHhGRgkvKiBGRUVfQ1RSTCBjbGVhciBvcGVyYXRpb25zICovCisKKyAgdW5zaWduZWQgY2hhcgltbXdfZmVlX2RhdGFfbDsJCS8qIFdyaXRlIGRhdGEgdG8gRUVwcm9tICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZlZV9kYXRhX2g7CQkvKiBoaWdoIG9jdGV0ICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2V4dF9hbnQ7CQkvKiBTZXR0aW5nIGZvciBleHRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX0VYVEFOVAkweDAxCS8qIFNlbGVjdCBleHRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX1BPTAkJMHgwMgkvKiBQb2xhcml0eSBvZiB0aGUgYW50ZW5uYSAqLworI2RlZmluZQlNTVdfRVhUX0FOVF9JTlRFUk5BTAkweDAwCS8qIEludGVybmFsIGFudGVubmEgKi8KKyNkZWZpbmUJTU1XX0VYVF9BTlRfRVhURVJOQUwJMHgwMwkvKiBFeHRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX0lRX1RFU1QJMHgxQwkvKiBJUSB0ZXN0IHBhdHRlcm4gKHNldCB0byAwKSAqLworfTsKKworLyogU2l6ZSBmb3Igc3RydWN0dXJlIGNoZWNraW5nIChpZiBwYWRkaW5nIGlzIGNvcnJlY3QpICovCisjZGVmaW5lCU1NV19TSVpFCTM3CisKKy8qIENhbGN1bGF0ZSBvZmZzZXQgb2YgYSBmaWVsZCBpbiB0aGUgYWJvdmUgc3RydWN0dXJlICovCisjZGVmaW5lCW1td29mZihwLGYpIAkodW5zaWduZWQgc2hvcnQpKCh2b2lkICopKCYoKG1td190ICopKCh2b2lkICopMCArIChwKSkpLT5mKSAtICh2b2lkICopMCkKKworCisvKgorICogTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyIChNTUMpIHJlYWQgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtbXJfdAltbXJfdDsKK3N0cnVjdCBtbXJfdAoreworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQwWzhdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2Rlc19zdGF0dXM7CQkvKiBlbmNyeXB0aW9uIHN0YXR1cyAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kZXNfYXZhaWw7CQkvKiBlbmNyeXB0aW9uIGF2YWlsYWJsZSAoMHg1NSByZWFkKSAqLworI2RlZmluZQlNTVJfREVTX0FWQUlMX0RFUwkweDU1CQkvKiBERVMgYXZhaWxhYmxlICovCisjZGVmaW5lCU1NUl9ERVNfQVZBSUxfQUVTCTB4MzMJCS8qIEFFUyAoQVQmVCkgYXZhaWxhYmxlICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2Rlc19pb19pbnZlcnQ7CS8qIGRlcyBJL08gaW52ZXJ0IHJlZ2lzdGVyICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3VudXNlZDFbNV07CQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZGNlX3N0YXR1czsJCS8qIERDRSBzdGF0dXMgKi8KKyNkZWZpbmUJTU1SX0RDRV9TVEFUVVNfUlhfQlVTWQkJMHgwMQkvKiByZWNlaXZlciBidXN5ICovCisjZGVmaW5lCU1NUl9EQ0VfU1RBVFVTX0xPT1BUX0lORAkweDAyCS8qIGxvb3AgdGVzdCBpbmRpY2F0ZWQgKi8KKyNkZWZpbmUJTU1SX0RDRV9TVEFUVVNfVFhfQlVTWQkJMHgwNAkvKiB0cmFuc21pdHRlciBvbiAqLworI2RlZmluZQlNTVJfRENFX1NUQVRVU19KQlJfRVhQSVJFRAkweDA4CS8qIGphYmJlciB0aW1lciBleHBpcmVkICovCisjZGVmaW5lIE1NUl9EQ0VfU1RBVFVTCQkJMHgwRgkvKiBtYXNrIHRvIGdldCB0aGUgYml0cyAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kc3BfaWQ7CQkvKiBEU1AgaWQgKEFBID0gRGFlZGFsdXMgcmV2IEEpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3VudXNlZDJbMl07CQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfY29ycmVjdF9ud2lkX2w7CS8qICMgb2YgY29ycmVjdCBOV0lEJ3MgcnhkIChsb3cpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2NvcnJlY3RfbndpZF9oOwkvKiAjIG9mIGNvcnJlY3QgTldJRCdzIHJ4ZCAoaGlnaCkgKi8KKyAgLyogV2FybmluZyA6IFJlYWQgaGlnaCBvcmRlciBvY3RldCBmaXJzdCAhISEgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfd3JvbmdfbndpZF9sOwkvKiAjIG9mIHdyb25nIE5XSUQncyByeGQgKGxvdykgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfd3JvbmdfbndpZF9oOwkvKiAjIG9mIHdyb25nIE5XSUQncyByeGQgKGhpZ2gpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3Rocl9wcmVfc2V0OwkvKiBsZXZlbCB0aHJlc2hvbGQgcHJlc2V0ICovCisjZGVmaW5lCU1NUl9USFJfUFJFX1NFVAkJMHgzRgkJLyogbGV2ZWwgdGhyZXNob2xkIHByZXNldCAqLworI2RlZmluZQlNTVJfVEhSX1BSRV9TRVRfQ1VSCTB4ODAJCS8qIEN1cnJlbnQgc2lnbmFsIGFib3ZlIGl0ICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3NpZ25hbF9sdmw7CQkvKiBzaWduYWwgbGV2ZWwgKi8KKyNkZWZpbmUJTU1SX1NJR05BTF9MVkwJCTB4M0YJCS8qIHNpZ25hbCBsZXZlbCAqLworI2RlZmluZQlNTVJfU0lHTkFMX0xWTF9WQUxJRAkweDgwCQkvKiBVcGRhdGVkIHNpbmNlIGxhc3QgcmVhZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9zaWxlbmNlX2x2bDsJLyogc2lsZW5jZSBsZXZlbCAobm9pc2UpICovCisjZGVmaW5lCU1NUl9TSUxFTkNFX0xWTAkJMHgzRgkJLyogc2lsZW5jZSBsZXZlbCAqLworI2RlZmluZQlNTVJfU0lMRU5DRV9MVkxfVkFMSUQJMHg4MAkJLyogVXBkYXRlZCBzaW5jZSBsYXN0IHJlYWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfc2dubF9xdWFsOwkJLyogc2lnbmFsIHF1YWxpdHkgKi8KKyNkZWZpbmUJTU1SX1NHTkxfUVVBTAkJMHgwRgkJLyogc2lnbmFsIHF1YWxpdHkgKi8KKyNkZWZpbmUJTU1SX1NHTkxfUVVBTF9BTlQJMHg4MAkJLyogY3VycmVudCBhbnRlbm5hIHVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfbmV0d19pZF9sOwkJLyogTldJRCBsb3cgb3JkZXIgYnl0ZSA/Pz8gKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfdW51c2VkM1szXTsJCS8qIHVudXNlZCAqLworCisgIC8qIDIuMCBIYXJkd2FyZSBleHRlbnNpb24gLSBmcmVxdWVuY3kgc2VsZWN0aW9uIHN1cHBvcnQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZmVlX3N0YXR1czsJCS8qIFN0YXR1cyBvZiBmcmVxdWVuY3kgZWVwcm9tICovCisjZGVmaW5lCU1NUl9GRUVfU1RBVFVTX0lECTB4RjAJCS8qIE1vZGVtIHJldmlzaW9uIGlkICovCisjZGVmaW5lCU1NUl9GRUVfU1RBVFVTX0RXTEQJMHgwOAkJLyogRG93bmxvYWQgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUJTU1SX0ZFRV9TVEFUVVNfQlVTWQkweDA0CQkvKiBFRXByb20gYnVzeSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQ0WzFdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2ZlZV9kYXRhX2w7CQkvKiBSZWFkIGRhdGEgZnJvbSBlZXByb20gKGxvdykgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZmVlX2RhdGFfaDsJCS8qIFJlYWQgZGF0YSBmcm9tIGVlcHJvbSAoaGlnaCkgKi8KK307CisKKy8qIFNpemUgZm9yIHN0cnVjdHVyZSBjaGVja2luZyAoaWYgcGFkZGluZyBpcyBjb3JyZWN0KSAqLworI2RlZmluZQlNTVJfU0laRQkzNgorCisvKiBDYWxjdWxhdGUgb2Zmc2V0IG9mIGEgZmllbGQgaW4gdGhlIGFib3ZlIHN0cnVjdHVyZSAqLworI2RlZmluZQltbXJvZmYocCxmKSAJKHVuc2lnbmVkIHNob3J0KSgodm9pZCAqKSgmKChtbXJfdCAqKSgodm9pZCAqKTAgKyAocCkpKS0+ZikgLSAodm9pZCAqKTApCisKKworLyogTWFrZSB0aGUgdHdvIGFib3ZlIHN0cnVjdHVyZXMgb25lICovCit0eXBlZGVmIHVuaW9uIG1tX3QKK3sKKyAgc3RydWN0IG1td190CXc7CS8qIFdyaXRlIHRvIHRoZSBtbWMgKi8KKyAgc3RydWN0IG1tcl90CXI7CS8qIFJlYWQgZnJvbSB0aGUgbW1jICovCit9IG1tX3Q7CisKKyNlbmRpZiAvKiBfV0FWRUxBTl9DU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLnAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MucC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMmVmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLnAuaApAQCAtMCwwICsxLDgxMyBAQAorLyoKKyAqCVdhdmVsYW4gUGNtY2lhIGRyaXZlcgorICoKKyAqCQlKZWFuIElJIC0gSFBMQiAnOTYKKyAqCisgKiBSZW9yZ2FuaXNhdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIHRoZSBkcml2ZXIuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW4gYWxsIGRlZmluaXRpb24gYW5kIGRlY2xhcmF0aW9ucyBuZWNlc3NhcnkgZm9yIHRoZQorICogd2F2ZWxhbiBwY21jaWEgZHJpdmVyLiBUaGlzIGZpbGUgaXMgYSBwcml2YXRlIGhlYWRlciwgc28gaXQgc2hvdWxkCisgKiBiZSBpbmNsdWRlZCBvbmx5IG9uIHdhdmVsYW5fY3MuYyAhISEKKyAqLworCisjaWZuZGVmIFdBVkVMQU5fQ1NfUF9ICisjZGVmaW5lIFdBVkVMQU5fQ1NfUF9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBET0NVTUVOVEFUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoaXMgZHJpdmVyIHByb3ZpZGUgYSBMaW51eCBpbnRlcmZhY2UgdG8gdGhlIFdhdmVsYW4gUGNtY2lhIGhhcmR3YXJlCisgKiBUaGUgV2F2ZWxhbiBpcyBhIHByb2R1Y3Qgb2YgTHVjZW50IChodHRwOi8vd3d3LndhdmVsYW4uY29tLykuCisgKiBUaGlzIGRpdmlzaW9uIHdhcyBmb3JtZXJseSBwYXJ0IG9mIE5DUiBhbmQgdGhlbiBBVCZULgorICogV2F2ZWxhbiBhcmUgYWxzbyBkaXN0cmlidXRlZCBieSBERUMgKFJvYW1BYm91dCBEUykuLi4KKyAqCisgKiBUbyBrbm93IGhvdyB0byB1c2UgdGhpcyBkcml2ZXIsIHJlYWQgdGhlIFBDTUNJQSBIT1dUTy4KKyAqIElmIHlvdSB3YW50IHRvIGV4cGxvaXQgdGhlIG1hbnkgb3RoZXIgZm9uY3Rpb25hbGl0aWVzLCBsb29rIGNvbW1lbnRzCisgKiBpbiB0aGUgY29kZS4uLgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIHRoZSByZXN1bHQgb2YgdGhlIGVmZm9ydCBvZiBtYW55IHBlb3BsZXMgKHNlZSBiZWxvdykuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQRUNJRklDIE5PVEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFdlYiBwYWdlCisgKiAtLS0tLS0tLQorICoJSSB0cnkgdG8gbWFpbnRhaW4gYSB3ZWIgcGFnZSB3aXRoIHRoZSBXaXJlbGVzcyBMQU4gSG93dG8gYXQgOgorICoJICAgIGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvV2F2ZWxhbi5odG1sCisgKgorICogU01QCisgKiAtLS0KKyAqCVdlIG5vdyBhcmUgU01QIGNvbXBsaWFudCAoSSBldmVudHVhbGx5IGZpeGVkIHRoZSByZW1haW5pbmcgYnVncykuCisgKglUaGUgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCBvbiBhIGR1YWwgUDYtMTUwIGFuZCBzdXJ2aXZlZCBteSB1c3VhbAorICoJc2V0IG9mIHRvcnR1cmUgdGVzdHMuCisgKglBbnl3YXksIEkgc3BlbnQgZW5vdWdoIHRpbWUgY2hhc2luZyBpbnRlcnJ1cHQgcmUtZW50cmFuY3kgZHVyaW5nCisgKgllcnJvcnMgb3IgcmVjb25maWd1cmUsIGFuZCBJIGRlc2lnbmVkIHRoZSBsb2NrZWQvdW5sb2NrZWQgc2VjdGlvbnMKKyAqCW9mIHRoZSBkcml2ZXIgd2l0aCBncmVhdCBjYXJlLCBhbmQgd2l0aCB0aGUgcmVjZW50IGFkZGl0aW9uIG9mCisgKgl0aGUgc3BpbmxvY2sgKHRoYW5rcyB0byB0aGUgbmV3IEFQSSksIHdlIHNob3VsZCBiZSBxdWl0ZSBjbG9zZSB0bworICoJdGhlIHRydXRoLgorICoJVGhlIFNNUC9JUlEgbG9ja2luZyBpcyBxdWl0ZSBjb2Fyc2UgYW5kIGNvbnNlcnZhdGl2ZSAoaS5lLiBub3QgZmFzdCksCisgKglidXQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSAoZXNwZWNpYWxseSBhdCAyIE1iL3MgOy0pLgorICoKKyAqCUkgaGF2ZSBhbHNvIGxvb2tlZCBpbnRvIGRpc2FibGluZyBvbmx5IG91ciBpbnRlcnJ1cHQgb24gdGhlIGNhcmQKKyAqCSh2aWEgSEFDUikgaW5zdGVhZCBvZiBhbGwgaW50ZXJydXB0cyBpbiB0aGUgcHJvY2Vzc29yICh2aWEgY2xpKSwKKyAqCXNvIHRoYXQgb3RoZXIgZHJpdmVyIGFyZSBub3QgaW1wYWN0ZWQsIGFuZCBpdCBsb29rIGxpa2UgaXQncworICoJcG9zc2libGUsIGJ1dCBpdCdzIHZlcnkgdHJpY2t5IHRvIGRvIHJpZ2h0IChmdWxsIG9mIHJhY2VzKS4gQXMKKyAqCXRoZSBnYWluIHdvdWxkIGJlIG1vc3RseSBmb3IgU01QIHN5c3RlbXMsIGl0IGNhbiB3YWl0Li4uCisgKgorICogRGVidWdnaW5nIGFuZCBvcHRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVlvdSB3aWxsIGZpbmQgYmVsb3cgYSBzZXQgb2YgJyNkZWZpbmUiIGFsbG93aW5nIGEgdmVyeSBmaW5lIGNvbnRyb2wKKyAqCW9uIHRoZSBkcml2ZXIgYmVoYXZpb3VyIGFuZCB0aGUgZGVidWcgbWVzc2FnZXMgcHJpbnRlZC4KKyAqCVRoZSBtYWluIG9wdGlvbnMgYXJlIDoKKyAqCW8gV0FWRUxBTl9ST0FNSU5HLCBmb3IgdGhlIGV4cGVyaW1lbnRhbCByb2FtaW5nIHN1cHBvcnQuCisgKglvIFNFVF9QU0FfQ1JDLCB0byBoYXZlIHlvdXIgY2FyZCBjb3JyZWN0bHkgcmVjb2duaXNlZCBieQorICoJICBhbiBhY2Nlc3MgcG9pbnQgYW5kIHRoZSBQb2ludC10by1Qb2ludCBkaWFnbm9zdGljIHRvb2wuCisgKglvIFVTRV9QU0FfQ09ORklHLCB0byByZWFkIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgUFNBIChFRXByb20pCisgKgkgIChvdGhlcndpc2Ugd2UgYWx3YXlzIHN0YXJ0IGFmcmVzaCB3aXRoIHNvbWUgZGVmYXVsdHMpCisgKgorICogd2F2ZWxhbl9jcy5vIGlzIGRhcm4gdG9vIGJpZworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJVGhhdCdzIHRydWUgISBUaGVyZSBpcyBhIHZlcnkgc2ltcGxlIHdheSB0byByZWR1Y2UgdGhlIGRyaXZlcgorICoJb2JqZWN0IGJ5IDMzJSAoeWVzICEpLiBDb21tZW50IG91dCB0aGUgZm9sbG93aW5nIGxpbmUgOgorICoJCSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorICoJT3RoZXIgY29tcGlsZSBvcHRpb25zIGNhbiBhbHNvIHJlZHVjZSB0aGUgc2l6ZSBvZiBpdC4uLgorICoKKyAqIE1BQyBhZGRyZXNzIGFuZCBoYXJkd2FyZSBkZXRlY3Rpb24gOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJVGhlIGRldGVjdGlvbiBjb2RlIG9mIHRoZSB3YXZlbGFuIGNoZWNoIHRoYXQgdGhlIGZpcnN0IDMKKyAqCW9jdGV0cyBvZiB0aGUgTUFDIGFkZHJlc3MgZml0IHRoZSBjb21wYW55IGNvZGUuIFRoaXMgdHlwZSBvZgorICoJZGV0ZWN0aW9uIHdvcmsgd2VsbCBmb3IgQVQmVCBjYXJkcyAoYmVjYXVzZSB0aGUgQVQmVCBjb2RlIGlzCisgKgloYXJkY29kZWQgaW4gd2F2ZWxhbl9jcy5oKSwgYnV0IG9mIGNvdXJzZSB3aWxsIGZhaWwgZm9yIG90aGVyCisgKgltYW51ZmFjdHVyZXIuCisgKgorICoJSWYgeW91IGFyZSBzdXJlIHRoYXQgeW91ciBjYXJkIGlzIGRlcml2ZWQgZnJvbSB0aGUgd2F2ZWxhbiwKKyAqCWhlcmUgaXMgdGhlIHdheSB0byBjb25maWd1cmUgaXQgOgorICoJMSkgR2V0IHlvdXIgTUFDIGFkZHJlc3MKKyAqCQlhKSBXaXRoIHlvdXIgY2FyZCB1dGlsaXRpZXMgKHdmcmVxc2VsLCBpbnN0Y29uZiwgLi4uKQorICoJCWIpIFdpdGggdGhlIGRyaXZlciA6CisgKgkJCW8gY29tcGlsZSB0aGUga2VybmVsIHdpdGggREVCVUdfQ09ORklHX0lORk8gZW5hYmxlZAorICoJCQlvIEJvb3QgYW5kIGxvb2sgdGhlIGNhcmQgbWVzc2FnZXMKKyAqCTIpIFNldCB5b3VyIE1BQyBjb2RlICgzIG9jdGV0cykgaW4gTUFDX0FERFJFU1NFU1tdWzNdICh3YXZlbGFuX2NzLmgpCisgKgkzKSBDb21waWxlICYgdmVyaWZ5CisgKgk0KSBTZW5kIG1lIHRoZSBNQUMgY29kZSAtIEkgd2lsbCBpbmNsdWRlIGl0IGluIHRoZSBuZXh0IHZlcnNpb24uLi4KKyAqCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdJUkVMRVNTIEVYVEVOU0lPTlMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVGhpcyBkcml2ZXIgaXMgdGhlIGZpcnN0IG9uZSB0byBzdXBwb3J0ICJ3aXJlbGVzcyBleHRlbnNpb25zIi4KKyAqIFRoaXMgc2V0IG9mIGV4dGVuc2lvbnMgcHJvdmlkZSB5b3Ugc29tZSB3YXkgdG8gY29udHJvbCB0aGUgd2lyZWxlc3MKKyAqIGNhcmFjdGVyaXN0aWNzIG9mIHRoZSBoYXJkd2FyZSBpbiBhIHN0YW5kYXJkIHdheSBhbmQgc3VwcG9ydCBmb3IKKyAqIGFwcGxpY2F0aW9ucyBmb3IgdGFraW5nIGFkdmFudGFnZSBvZiBpdCAobGlrZSBNb2JpbGUgSVApLgorICoKKyAqIFlvdSB3aWxsIG5lZWQgdG8gZW5hYmxlIHRoZSBDT05GSUdfTkVUX1JBRElPIGRlZmluZSBpbiB0aGUga2VybmVsCisgKiBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyAodGhpcyBpcyB0aGUgb25lCisgKiBnaXZpbmcgYWNjZXNzIHRvIHRoZSByYWRpbyBuZXR3b3JrIGRldmljZSBjaG9pY2UpLgorICoKKyAqIEl0IG1pZ2h0IGFsc28gYmUgYSBnb29kIGlkZWEgYXMgd2VsbCB0byBmZXRjaCB0aGUgd2lyZWxlc3MgdG9vbHMgdG8KKyAqIGNvbmZpZ3VyZSB0aGUgZGV2aWNlIGFuZCBwbGF5IGEgYml0LgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRklMRVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIHdhdmVsYW5fY3MuYyA6CVRoZSBhY3R1YWwgY29kZSBmb3IgdGhlIGRyaXZlciAtIEMgZnVuY3Rpb25zCisgKgorICogd2F2ZWxhbl9jcy5wLmggOglQcml2YXRlIGhlYWRlciA6IGxvY2FsIHR5cGVzIC8gdmFycyBmb3IgdGhlIGRyaXZlcgorICoKKyAqIHdhdmVsYW5fY3MuaCA6CURlc2NyaXB0aW9uIG9mIHRoZSBoYXJkd2FyZSBpbnRlcmZhY2UgJiBzdHJ1Y3RzCisgKgorICogaTgyNTkzLmggOgkJRGVzY3JpcHRpb24gaWYgdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSElTVE9SWSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBUaGUgaGlzdG9yeSBvZiB0aGUgV2F2ZWxhbiBkcml2ZXJzIGlzIGFzIGNvbXBsaWNhdGVkIGFzIGhpc3Rvcnkgb2YKKyAqIHRoZSBXYXZlbGFuIGl0c2VsZiAoTkNSIC0+IEFUJlQgLT4gTHVjZW50KS4KKyAqCisgKiBBbGwgc3RhcnRlZCB3aXRoIEFuZGVycyBLbGVtZXRzIDxrbGVtZXRzQHBhdWwucnV0Z2Vycy5lZHU+LAorICogd3JpdHRpbmcgYSBXYXZlbGFuIElTQSBkcml2ZXIgZm9yIHRoZSBNQUNIIG1pY3Jva2VybmVsLiBHaXJpc2gKKyAqIFdlbGxpbmcgPHdlbGxpbmdAcGF1bC5ydXRnZXJzLmVkdT4gaGFkIGFsc28gd29ya2VkIG9uIGl0LgorICogS2VpdGggTW9vcmUgbW9kaWZ5IHRoaXMgZm9yIHRoZSBQY21jaWEgaGFyZHdhcmUuCisgKiAKKyAqIFJvYmVydCBNb3JyaXMgPHJ0bUBkYXMuaGFydmFyZC5lZHU+IHBvcnQgdGhlc2UgdHdvIGRyaXZlcnMgdG8gQlNESQorICogYW5kIGFkZCBzcGVjaWZpYyBQY21jaWEgc3VwcG9ydCAodGhlcmUgaXMgY3VycmVudGx5IG5vIGVxdWl2YWxlbnQKKyAqIG9mIHRoZSBQQ01DSUEgcGFja2FnZSB1bmRlciBCU0QuLi4pLgorICoKKyAqIEppbSBCaW5rbGV5IDxqcmJAY3MucGR4LmVkdT4gcG9ydCBib3RoIEJTREkgZHJpdmVycyB0byBGcmVlQlNELgorICoKKyAqIEJydWNlIEphbnNvbiA8YnJ1Y2VAY3MudXN5ZC5lZHUuYXU+IHBvcnQgdGhlIEJTREkgSVNBIGRyaXZlciB0byBMaW51eC4KKyAqCisgKiBBbnRob255IEQuIEpvc2VwaCA8YWRqQGxjcy5taXQuZWR1PiBzdGFydGVkIG1vZGlmeSBCcnVjZSBkcml2ZXIKKyAqICh3aXRoIGhlbHAgb2YgdGhlIEJTREkgUENNQ0lBIGRyaXZlcikgZm9yIFBDTUNJQS4KKyAqIFl1bnpob3UgTGkgPHl1bnpob3VAc3RyYXQuaW9sLnVuaC5lZHU+IGZpbmlzaGVkIGlzIHdvcmsuCisgKiBKb2UgRmlubmV5IDxqb2VAY29tcC5sYW5jcy5hYy51az4gcGF0Y2hlZCB0aGUgZHJpdmVyIHRvIHN0YXJ0CisgKiBjb3JyZWN0bHkgMi4wMCBjYXJkcyAoMi40IEdIeiB3aXRoIGZyZXF1ZW5jeSBzZWxlY3Rpb24pLgorICogRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PiBpbnRlZ3JhdGVkIHRoZSB3aG9sZSBpbiBoaXMKKyAqIFBjbWNpYSBwYWNrYWdlICgrIGJ1ZyBjb3JyZWN0aW9ucykuCisgKgorICogSSAoSmVhbiBUb3VycmlsaGVzIC0ganRAaHBsYi5ocGwuaHAuY29tKSB0aGVuIHN0YXJ0ZWQgdG8gbWFrZSBzb21lCisgKiBwYXRjaHMgdG8gdGhlIFBjbWNpYSBkcml2ZXIuIEFmdGVyLCBJIGFkZGVkIGNvZGUgaW4gdGhlIElTQSBkcml2ZXIKKyAqIGZvciBXaXJlbGVzcyBFeHRlbnNpb25zIGFuZCBmdWxsIHN1cHBvcnQgb2YgZnJlcXVlbmN5IHNlbGVjdGlvbgorICogY2FyZHMuIE5vdywgSSdtIGRvaW5nIHRoZSBzYW1lIHRvIHRoZSBQY21jaWEgZHJpdmVyICsgc29tZQorICogcmVvcmdhbmlzYXRpb24uCisgKiBMb2VrZSBCcmVkZXJ2ZWxkIDxsYnJlZGVydkB3YXZlbGFuLmNvbT4gZnJvbSBMdWNlbnQgaGFzIGdpdmVuIG1lCisgKiBtdWNoIG5lZWRlZCBpbmZvcm1hdGlvbnMgb24gdGhlIFdhdmVsYW4gaGFyZHdhcmUuCisgKi8KKworLyogQnkgdGhlIHdheSA6IGZvciB0aGUgY29weXJpZ2h0ICYgbGVnYWwgc3R1ZmYgOgorICogQWxtb3N0IGV2ZXJ5Ym9keSB3cm90ZSBjb2RlIHVuZGVyIEdOVSBvciBCU0QgbGljZW5zZSAob3IgYWxpa2UpLAorICogYW5kIHdhbnQgdGhhdCB0aGVpciBvcmlnaW5hbCBjb3B5cmlnaHQgcmVtYWluIHNvbWV3aGVyZSBpbiB0aGUKKyAqIGNvZGUgKGZvciBteXNlbGYsIEkgZ28gd2l0aCB0aGUgR1BMKS4KKyAqIE5vYm9keSB3YW50IHRvIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIGFueXRoaW5nLCBleGNlcHQgdGhlIGZhbWUuLi4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1JFRElUUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBDcmVkaXRzOgorICogICAgU3BlY2lhbCB0aGFua3MgdG8gSmFuIEhvb2dlbmRvb3JuIG9mIEFUJlQgR0lTIFV0cmVjaHQgYW5kCisgKglMb2VrZSBCcmVkZXJ2ZWxkIG9mIEx1Y2VudCBmb3IgcHJvdmlkaW5nIGV4dHJlbWVseSB1c2VmdWwKKyAqCWluZm9ybWF0aW9uIGFib3V0IFdhdmVMQU4gUENNQ0lBIGhhcmR3YXJlCisgKgorICogICAgVGhpcyBkcml2ZXIgaXMgYmFzZWQgdXBvbiBzZXZlcmFsIG90aGVyIGRyaXZlcnMsIGluIHBhcnRpY3VsYXI6CisgKglEYXZpZCBIaW5kcycgTGludXggZHJpdmVyIGZvciB0aGUgUENNQ0lBIDNjNTg5IGV0aGVybmV0IGFkYXB0ZXIKKyAqCUJydWNlIEphbnNvbidzIExpbnV4IGRyaXZlciBmb3IgdGhlIEFULWJ1cyBXYXZlTEFOIGFkYXB0ZXIKKyAqCUFuZGVycyBLbGVtZXRzJyBQQ01DSUEgV2F2ZUxBTiBhZGFwdGVyIGRyaXZlcgorICoJUm9iZXJ0IE1vcnJpcycgQlNESSBkcml2ZXIgZm9yIHRoZSBQQ01DSUEgV2F2ZUxBTiBhZGFwdGVyCisgKgorICogQWRkaXRpb25hbCBDcmVkaXRzOgorICoKKyAqICAgIFRoaXMgc29mdHdhcmUgd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIHVuZGVyIExpbnV4IDEuMi4zCisgKgkoU2xhY2t3YXJlIDIuMCBkaXN0cmlidXRpb24pLgorICogICAgQW5kIHRoZW4gdW5kZXIgTGludXggMi4wLnggKERlYmlhbiAxLjEgLT4gMi4yIC0gcGNtY2lhIDIuOC4xOCspCisgKgl3aXRoIGFuIEhQIE9tbmlCb29rIDQwMDAgYW5kIHRoZW4gYSA1NTAwLgorICoKKyAqICAgIEl0IGlzIGJhc2VkIG9uIG90aGVyIGRldmljZSBkcml2ZXJzIGFuZCBpbmZvcm1hdGlvbiBlaXRoZXIgd3JpdHRlbgorICogICAgb3Igc3VwcGxpZWQgYnk6CisgKglKYW1lcyBBc2h0b24gKGphYTEwMUBzeXNlbmcuYW51LmVkdS5hdSksCisgKglBamF5IEJha3JlIChiYWtyZUBwYXVsLnJ1dGdlcnMuZWR1KSwKKyAqCURvbmFsZCBCZWNrZXIgKGJlY2tlckBzdXBlci5vcmcpLAorICoJSmltIEJpbmtsZXkgPGpyYkBjcy5wZHguZWR1PiwKKyAqCUxvZWtlIEJyZWRlcnZlbGQgPGxicmVkZXJ2QHdhdmVsYW4uY29tPiwKKyAqCUFsbGFuIENyZWlnaHRvbiAoYWxsYW5jQGNzLnN1Lm96LmF1KSwKKyAqCUJyZW50IEVscGhpY2sgPGJlbHBoaWNrQHV3YXRlcmxvby5jYT4sCisgKglKb2UgRmlubmV5IDxqb2VAY29tcC5sYW5jcy5hYy51az4sCisgKglNYXR0aGV3IEdlaWVyIChtYXR0aGV3QGNzLnN1Lm96LmF1KSwKKyAqCVJlbW8gZGkgR2lvdmFubmkgKHJlbW9AY3Muc3Uub3ouYXUpLAorICoJTWFyayBIYWdhbiAobWhhZ2FuQHd0Y3Bvc3QuZGF5dG9ub2guTkNSLkNPTSksCisgKglEYXZpZCBIaW5kcyA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LAorICoJSmFuIEhvb2dlbmRvb3JuIChjL28gbWFydGVpam5AbHVjZW50LmNvbSksCisgKiAgICAgIEJydWNlIEphbnNvbiA8YnJ1Y2VAY3MudXN5ZC5lZHUuYXU+LAorICoJQW50aG9ueSBELiBKb3NlcGggPGFkakBsY3MubWl0LmVkdT4sCisgKglBbmRlcnMgS2xlbWV0cyAoa2xlbWV0c0BwYXVsLnJ1dGdlcnMuZWR1KSwKKyAqCVl1bnpob3UgTGkgPHl1bnpob3VAc3RyYXQuaW9sLnVuaC5lZHU+LAorICoJTWFyYyBNZWVydGVucyAobW1lZXJ0ZW5zQGx1Y2VudC5jb20pLAorICoJS2VpdGggTW9vcmUsCisgKglSb2JlcnQgTW9ycmlzIChydG1AZGFzLmhhcnZhcmQuZWR1KSwKKyAqCUlhbiBQYXJraW4gKGlhbkBjcy5zdS5vei5hdSksCisgKglKb2huIFJvc2VuYmVyZyAoam9obnJAY3Muc3Uub3ouYXUpLAorICoJR2VvcmdlIFJvc3NpIChnZW9yZ2VAcGhtLmdvdi5hdSksCisgKglBcnRodXIgU2NvdHQgKGFydGh1ckBjcy5zdS5vei5hdSksCisgKglTdGFuaXNsYXYgU2lueWFnaW4gPHN0YXNAaXNmLnJ1PgorICoJUGV0ZXIgU3RvcmV5LAorICoJSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPiwKKyAqCUdpcmlzaCBXZWxsaW5nICh3ZWxsaW5nQHBhdWwucnV0Z2Vycy5lZHUpCisgKglDbGFyayBXb29kd29ydGggPGNsYXJrQGhpd2F5MS5leGl0MTA5LmNvbT4KKyAqCVlvbmdndWFuZyBaaGFuZyA8eWd6QGlzbC5ocmwuaGFjLmNvbT4uLi4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElNUFJPVkVNRU5UUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogSSBwcm91ZGx5IHByZXNlbnQgOgorICoKKyAqIENoYW5nZXMgbWFkZSBpbiAyLjguMjIgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBpbXByb3ZlZCB3dl9zZXRfbXVsdGljYXN0X2xpc3QKKyAqCS0gY2F0Y2ggc3B1cmlvdXMgaW50ZXJydXB0CisgKgktIGNvcnJlY3QgcmVsZWFzZSBvZiB0aGUgZGV2aWNlCisgKgorICogQ2hhbmdlcyBtYWRlcyBpbiByZWxlYXNlIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBSZW9yZ2FuaXNhdGlvbiBvZiB0aGUgY29kZSwgZnVuY3Rpb24gbmFtZSBjaGFuZ2UKKyAqCS0gQ3JlYXRpb24gb2YgcHJpdmF0ZSBoZWFkZXIgKHdhdmVsYW5fY3MuaCkKKyAqCS0gUmVvcmdhbmlzZWQgZGVidWcgbWVzc2FnZXMKKyAqCS0gTW9yZSBjb21tZW50cywgaGlzdG9yeSwgLi4uCisgKgktIENvbmZpZ3VyZSBlYXJsaWVyIChpbiAiaW5zZXJ0IiBpbnN0ZWFkIG9mICJvcGVuIikKKyAqICAgICAgICBhbmQgZG8gdGhpbmdzIG9ubHkgb25jZQorICoJLSBtbWNfaW5pdCA6IGNvbmZpZ3VyZSB0aGUgUFNBIGlmIG5vdCBkb25lCisgKgktIG1tY19pbml0IDogMi4wMCBkZXRlY3Rpb24gYmV0dGVyIGNvZGUgZm9yIDIuMDAgaW5pdAorICoJLSBiZXR0ZXIgaW5mbyBhdCBzdGFydHVwCisgKgktIENvcnJlY3QgYSBIVUdFIGJ1ZyAodm9sYXRpbGUgJiB1bmNhbGlicmF0ZWQgYnVzeSBsb29wKQorICoJICBpbiB3dl84MjU5M19jbWQgPT4gY29uZmlnIHNwZWVkdXAKKyAqCS0gU3RvcCByZWNlaXZpbmcgJiBwb3dlciBkb3duIG9uIGNsb3NlIChhbmQgcG93ZXIgdXAgb24gb3BlbikKKyAqCSAgdXNlICJpZmNvbmZpZyBkb3duIiAmICJpZmNvbmZpZyB1cCA7IHJvdXRlIGFkZCAtbmV0IC4uLiIKKyAqCS0gU2VuZCBwYWNrZXRzIDogYWRkIHdhdGNoZG9nIGluc3RlYWQgb2YgcG9vbGluZworICoJLSBSZWNlaXZlIDogY2hlY2sgZnJhbWUgd3JhcCBhcm91bmQgJiB0cnkgdG8gcmVjb3ZlciBzb21lIGZyYW1lcworICoJLSB3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdCA6IGF2b2lkIHJlc2V0CisgKgktIGFkZCB3aXJlbGVzcyBleHRlbnNpb25zIChpb2N0bCAmIGdldF93aXJlbGVzc19zdGF0cykKKyAqCSAgZ2V0L3NldCBud2lkL2ZyZXF1ZW5jeSBvbiBmbHksIGluZm8gZm9yIC9wcm9jL25ldC93aXJlbGVzcworICoJLSBTdXBwcmVzcyB1c2VsZXNzIHN0dWZmIGZyb20gbHAgKG5ldF9sb2NhbCksIGJ1dCBhZGQgbGluaworICoJLSBNb3JlIGlubGluZXMKKyAqCS0gTG90IG9mIG90aGVycyBtaW5vciBkZXRhaWxzICYgY2xlYW51cHMKKyAqCisgKiBDaGFuZ2VzIG1hZGUgaW4gc2Vjb25kIHJlbGVhc2UgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIE9wdGltaXNlIHd2Xzg1ODkzX3JlY29uZmlnIHN0dWZmLCBmaXggcG90ZW50aWFsIHByb2JsZW1zCisgKgktIENoYW5nZSBlcnJvciB2YWx1ZXMgZm9yIGlvY3RsCisgKgktIE5vbiBibG9ja2luZyB3dl9ydV9zdG9wKCkgKyBjYWxsIHd2X3Jlc2V0KCkgaW4gY2FzZSBvZiBwcm9ibGVtcworICoJLSBSZW1vdmUgZGV2ZWxvcG1lbnQgcHJpbnRrIGZyb20gd2F2ZWxhbl93YXRjaGRvZygpCisgKgktIFJlbW92ZSBvZiB0aGUgd2F0Y2hkb2cgdG8gd2F2ZWxhbl9jbG9zZSBpbnN0ZWFkIG9mIHdhdmVsYW5fcmVsZWFzZQorICoJICBmaXggcG90ZW50aWFsIHByb2JsZW1zLi4uCisgKgktIFN0YXJ0IGRlYnVnZ2luZyBzdXNwZW5kIHN0dWZmIChidXQgaXQncyBzdGlsbCBhIGJpdCB3ZWlyZCkKKyAqCS0gRGVidWcgJiBvcHRpbWl6ZSBkdW1wIGhlYWRlci9wYWNrZXQgaW4gUnggJiBUeCAoZGVidWcpCisgKgktIFVzZSAicmVhZGIiIGFuZCAid3JpdGViIiB0byBiZSBrZXJuZWwgMi4xIGNvbXBsaWFudAorICoJLSBCZXR0ZXIgaGFuZGxpbmcgb2YgYm9ndXMgaW50ZXJydXB0cworICoJLSBXaXJlbGVzcyBleHRlbnNpb24gOiBTRVRTUFkgYW5kIEdFVFNQWQorICoJLSBSZW1vdmUgb2xkIHN0dWZmIChzdGF0cyAtIGZvciB0aG9zZSBuZWVkaW5nIGl0LCBqdXN0IGFzayBtZS4uLikKKyAqCS0gTWFrZSB3aXJlbGVzcyBleHRlbnNpb25zIG9wdGlvbmFsCisgKgorICogQ2hhbmdlcyBtYWRlIGluIHRoaXJkIHJlbGVhc2UgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gY2xlYW51cHMgJiB0eXBvcworICoJLSBtb2RpZiB3aXJlbGVzcyBleHQgKHNweSAtPiBvbmx5IG9uZSBwb2ludGVyKQorICoJLSBuZXcgcHJpdmF0ZSBpb2N0bCB0byBzZXQvZ2V0IHF1YWxpdHkgJiBsZXZlbCB0aHJlc2hvbGQKKyAqCS0gSW5pdCA6IGNvcnJlY3QgZGVmYXVsdCB2YWx1ZSBvZiBsZXZlbCB0aHJlc2hvbGQgZm9yIHBjbWNpYQorICoJLSBraWxsIHdhdGNoZG9nIGluIGh3X3Jlc2V0CisgKgktIG1vcmUgMi4xIHN1cHBvcnQgKGNvcHlfdG8vZnJvbV91c2VyIGluc3RlYWQgb2YgbWVtY3B5X3RvL2Zyb21mcykKKyAqCS0gQWRkIG1lc3NhZ2UgbGV2ZWwgKGRlYnVnIHN0dWZmIGluIC92YXIvYWRtL2RlYnVnICYgZXJyb3JzIG5vdAorICoJICBkaXNwbGF5ZWQgYXQgY29uc29sZSBhbmQgc3RpbGwgaW4gL3Zhci9hZG0vbWVzc2FnZXMpCisgKgorICogQ2hhbmdlcyBtYWRlIGluIGZvdXJ0aCByZWxlYXNlIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBtdWx0aWNhc3Qgc3VwcG9ydCAoeWVzICEpIHRoYW5rcyB0byBZb25nZ3VhbmcgWmhhbmcuCisgKgorICogQ2hhbmdlcyBtYWRlIGluIGZpZnRoIHJlbGVhc2UgKDIuOS4wKSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIFJldmlzaXRlZCBtdWx0aWNhc3QgY29kZSAoaXQgd2FzIG1vc3RseSB3cm9uZykuCisgKgktIHByb3RlY3QgY29kZSBpbiB3dl84MjU5M19yZWNvbmZpZyB3aXRoIGRldi0+dGJ1c3kgKG91cHMgISkKKyAqCisgKiBDaGFuZ2VzIG1hZGUgaW4gc2l4dGggcmVsZWFzZSAoMi45LjFhKSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBDaGFuZ2UgdGhlIGRldGVjdGlvbiBjb2RlIGZvciBtdWx0aSBtYW51ZmFjdHVyZXIgY29kZSBzdXBwb3J0CisgKgktIENvcnJlY3QgYnVnIChoYW5nIGtlcm5lbCkgaW4gaW5pdCB3aGVuIHdlIHdlcmUgInJlamVjdGluZyIgYSBjYXJkIAorICoKKyAqIENoYW5nZXMgbWFkZSBpbiBzZXZlbnRoIHJlbGVhc2UgKDIuOS4xYikgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBVcGRhdGUgdG8gd2lyZWxlc3MgZXh0ZW5zaW9ucyBjaGFuZ2VzCisgKgktIFNpbGx5IGJ1ZyBpbiBjYXJkIGluaXRpYWwgY29uZmlndXJhdGlvbiAocHNhX2NvbmZfc3RhdHVzKQorICoKKyAqIENoYW5nZXMgbWFkZSBpbiBlaWd0aCByZWxlYXNlIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIFNtYWxsIGJ1ZyBpbiBkZWJ1ZyBjb2RlIChwcm9iYWJseSBub3QgdGhlIGxhc3Qgb25lLi4uKQorICoJLSAxLjIuMTMgc3VwcG9ydCAodGhhbmtzIHRvIENsYXJrIFdvb2R3b3J0aCkKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi45LjJiIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gTGV2ZWwgdGhyZXNob2xkIGlzIG5vdyBhIHN0YW5kYXJkIHdpcmVsZXNzIGV4dGVuc2lvbiAodmVyc2lvbiA0ICEpCisgKgktIG1vZHVsZXMgcGFyYW1ldGVycyB0eXBlcyBmb3Iga2VybmVsID4gMi4xLjE3CisgKgktIHVwZGF0ZWQgbWFuIHBhZ2UKKyAqCS0gT3RoZXJzIGNsZWFudXAgZnJvbSBEYXZpZCBIaW5kcworICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjkuNSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gYnl0ZSBjb3VudCBzdGF0cyAoY291cnRlc3kgb2YgRGF2aWQgSGluZHMpCisgKgktIFJlbW92ZSBkZXZfdGludCBzdHVmZiAoY291cnRlc3kgb2YgRGF2aWQgSGluZHMpCisgKgktIE90aGVycyBjbGVhbnVwIGZyb20gRGF2aWQgSGluZHMKKyAqCS0gRW5jcnlwdGlvbiBzZXR0aW5nIGZyb20gQnJlbnQgRWxwaGljayAodGhhbmtzIGEgbG90ICEpCisgKgktICdiYXNlJyB0byAndV9sb25nJyBmb3IgdGhlIEFscGhhICh0aGFua3MgdG8gU3RhbmlzbGF2IFNpbnlhZ2luKQorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjkuNiA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gZml4IGJ1ZyA6IG5vIGxvbmd1ZXIgZGlzYWJsZSB3YXRjaGRvZyBpbiBjYXNlIG9mIGJvZ3VzIGludGVycnVwdAorICoJLSBpbmNyZWFzZSB0aW1lb3V0IGluIGNvbmZpZyBjb2RlIGZvciBwaWNreSBoYXJkd2FyZQorICoJLSBtYXNrIHVudXNlZCBiaXRzIGluIHN0YXR1cyAoV2lyZWxlc3MgRXh0ZW5zaW9ucykKKyAqCisgKiBDaGFuZ2VzIGludGVncmF0ZWQgYnkgSnVzdGluIFNlZ2VyIDxqc2VnZXJATUlULkVEVT4gJiBEYXZpZCBIaW5kcyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBSb2FtaW5nICJoYWNrIiBmcm9tIEpvZSBGaW5uZXkgPGpvZUBjb21wLmxhbmNzLmFjLnVrPgorICoJLSBQU0EgQ1JDIGNvZGUgZnJvbSBCb2IgR3JheSA8cmdyYXlAYmFsZC5jcy5kYXJ0bW91dGguZWR1PgorICoJLSBCZXR0ZXIgaW5pdGlhbGlzYXRpb24gb2YgdGhlIGk4MjU5MyBjb250cm9sbGVyCisgKgkgIGZyb20gSm9zZXBoIEsuIE8nU3VsbGl2YW4gPGpvc3VsbHZuK0Bjcy5jbXUuZWR1PgorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAzLjAuMTAgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBGaXggZWplY3QgImhhbmciIG9mIHRoZSBkcml2ZXIgdW5kZXIgMi4yLlggOgorICoJCW8gY3JlYXRlIHd2X2ZsdXNoX3N0YWxlX2xpbmtzKCkKKyAqCQlvIFJlbmFtZSB3YXZlbGFuX3JlbGVhc2UgdG8gd3ZfcGNtY2lhX3JlbGVhc2UgJiBtb3ZlIHVwCisgKgkJbyBtb3ZlIHVucmVnaXN0ZXJfbmV0ZGV2IHRvIHdhdmVsYW5fZGV0YWNoKCkKKyAqCQlvIHdhdmVsYW5fcmVsZWFzZSgpIG5vIGxvbmdlciBjYWxsIHdhdmVsYW5fZGV0YWNoKCkKKyAqCQlvIFN1cHByZXNzICJyZWxlYXNlIiB0aW1lcgorICoJCW8gT3RoZXIgY2xlYW51cHMgJiBmaXhlcworICoJLSBOZXcgTUFDIGFkZHJlc3MgaW4gdGhlIHByb2JlCisgKgktIFJlb3JnIFBTQV9DUkMgY29kZSAoZW5kaWFuIG5ldXRyYWwgJiBjbGVhbmVyKQorICoJLSBDb3JyZWN0IGluaXRpYWxpc2F0aW9uIG9mIHRoZSBpODI1OTMgZnJvbSBMdWNlbnQgbWFudWFsCisgKgktIFB1dCBiYWNrIHRoZSB3YXRjaGRvZywgd2l0aCBsYXJnZXIgdGltZW91dAorICoJLSBUUkFOU01JVF9OT19DUkMgaXMgYSAibm9ybWFsIiBlcnJvciwgc28gcmVjb3ZlciBmcm9tIGl0CisgKgkgIGZyb20gRGVycmljayBKIEJyYXNoZWFyIDxzaGFkb3dAZGVtZW50aWEub3JnPgorICoJLSBCZXR0ZXIgaGFuZGxpbmcgb2YgVFggYW5kIFJYIG5vcm1hbCBmYWlsdXJlIGNvbmRpdGlvbnMKKyAqCS0gI2lmZGVmIG91dCBhbGwgdGhlIHJvYW1pbmcgY29kZQorICoJLSBBZGQgRVNTSUQgJiAiQVAgY3VycmVudCBhZGRyZXNzIiBpb2N0bCBzdHVicworICoJLSBHZW5lcmFsIGNsZWFudXAgb2YgdGhlIGNvZGUKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMy4wLjEzIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gUmUtZW5hYmxlIGNvbXBpbGF0aW9uIG9mIHJvYW1pbmcgY29kZSBieSBkZWZhdWx0LCBidXQgd2l0aAorICoJICBkb19yb2FtaW5nID0gMAorICoJLSBOdWtlIGBud2lkPW53aWRebnRvaHMoYmVhY29uLT5kb21haW5faWQpJyBpbiB3bF9yb2FtX2dhdGhlcgorICoJICBhdCB0aGUgZGVtYW5kIG9mIEpvaG4gQ2Fyb2wgTGFuZ2ZvcmQgPGpjbEBnczE3Ni5zcC5jcy5jbXUuZWR1PgorICoJLSBJbnRyb2R1Y2VkIFdBVkVMQU5fUk9BTUlOR19FWFQgZm9yIGluY29tcGxldGUgRVNTSUQgc3R1ZmYuCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDMuMC4xNSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIENoYW5nZSBlLW1haWwgYW5kIHdlYiBwYWdlIGFkZHJlc3NlcworICoJLSBXYXRjaGRvZyB0aW1lciBpcyBub3cgY29ycmVjdGx5IGV4cHJlc3NlZCBpbiBIWiwgbm90IGluIGppZmZpZXMKKyAqCS0gQWRkIGNoYW5uZWwgbnVtYmVyIHRvIHRoZSBsaXN0IG9mIGZyZXF1ZW5jaWVzIGluIHJhbmdlCisgKgktIEFkZCB0aGUgKHNob3J0KSBsaXN0IG9mIGJpdC1yYXRlcyBpbiByYW5nZQorICoJLSBEZXZlbG9wcCBhIG5ldyBzZW5zaXRpdml0eS4uLiAoc2Vucy52YWx1ZSAmIHNlbnMuZml4ZWQpCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDMuMS4yIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBGaXggY2hlY2sgZm9yIHJvb3QgcGVybWlzc2lvbiAoYnJlYWsgaW5zdGVhZCBvZiBleGl0KQorICoJLSBOZXcgbndpZCAmIGVuY29kaW5nIHNldHRpbmcgKFdpcmVsZXNzIEV4dGVuc2lvbiA5KQorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAzLjEuMTIgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSByZXdvcmtlZCB3dl84MjU5M19jbWQgdG8gYXZvaWQgdXNpbmcgdGhlIElSUSBoYW5kbGVyIGFuZCBkb2luZworICoJICB1Z2x5IHRoaW5ncyB3aXRoIGludGVycnVwdHMuCisgKgktIEFkZCBJUlEgcHJvdGVjdGlvbiBpbiA4MjU5M19jb25maWcvcnVfc3RhcnQvcnVfc3RvcC93YXRjaGRvZworICoJLSBVcGRhdGUgdG8gbmV3IG5ldHdvcmsgQVBJIChzb2Z0bmV0IC0gMi4zLjQzKSA6CisgKgkJbyByZXBsYWNlIGRldi0+dGJ1c3kgKERhdmlkICsgbWUpCisgKgkJbyByZXBsYWNlIGRldi0+dHN0YXJ0IChEYXZpZCArIG1lKQorICoJCW8gcmVtb3ZlIGRldi0+aW50ZXJydXB0IChEYXZpZCkKKyAqCQlvIGFkZCBTTVAgbG9ja2luZyB2aWEgc3BpbmxvY2sgaW4gc3BseHggKG1lKQorICoJCW8gYWRkIHNwaW5sb2NrIGluIGludGVycnVwdCBoYW5kbGVyIChtZSkKKyAqCQlvIHVzZSBrZXJuZWwgd2F0Y2hkb2cgaW5zdGVhZCBvZiBvdXJzIChtZSkKKyAqCQlvIHZlcmlmeSB0aGF0IGFsbCB0aGUgY2hhbmdlcyBtYWtlIHNlbnNlIGFuZCB3b3JrIChtZSkKKyAqCS0gUmUtc3luYyBrZXJuZWwvcGNtY2lhIHZlcnNpb25zIChub3QgbXVjaCBhY3R1YWxseSkKKyAqCS0gQSBmZXcgb3RoZXIgY2xlYW51cHMgKERhdmlkICYgbWUpLi4uCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDMuMS4yMiA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIENoZWNrIHRoYXQgU01QIHdvcmtzLCByZW1vdmUgYW5ub3lpbmcgbG9nIG1lc3NhZ2UKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMy4xLjI0IDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gRml4IHVuZnJlcXVlbnQgY2FyZCBsb2NrdXAgd2hlbiB3YXRjaGRvZyB3YXMgcmVzZXRpbmcgdGhlIGhhcmR3YXJlIDoKKyAqCQlvIGNvbnRyb2wgZmlyc3QgYnVzeSBsb29wIGluIHd2XzgyNTkzX2NtZCgpCisgKgkJbyBFeHRlbmQgc3BpbmxvY2sgcHJvdGVjdGlvbiBpbiB3dl9od19jb25maWcoKQorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAzLjEuMzMgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBPcHRpb25hbCB1c2UgbmV3IGRyaXZlciBBUEkgZm9yIFdpcmVsZXNzIEV4dGVuc2lvbnMgOgorICoJCW8gZ290IHJpZCBvZiB3YXZlbGFuX2lvY3RsKCkKKyAqCQlvIHVzZSBhIGJ1bmNoIG9mIGl3X2hhbmRsZXIgaW5zdGVhZAorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAzLjIuMSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gU2V0IGRldi0+dHJhbnNfc3RhcnQgdG8gYXZvaWQgZmlsbGluZyB0aGUgbG9ncworICoJCShhbmQgZ2VuZXJhdGluZyB1c2VsZXNzIGFib3J0IGNvbW1hbmRzKQorICoJLSBBdm9pZCBkZWFkbG9ja3MgaW4gbW1jX291dCgpL21tY19pbigpCisgKgorICogV2lzaGVzICYgZHJlYW1zOgorICogLS0tLS0tLS0tLS0tLS0tLQorICoJLSBDbGVhbnVwIGFuZCBpbnRlZ3JhdGUgdGhlIHJvYW1pbmcgY29kZQorICoJICAoc3RkIGRlYnVnLCBzZXQgRG9tYWluSUQsIGRlY2F5IGF2ZyBhbmQgY28uLi4pCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOQ0xVREVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBMaW51eCBoZWFkZXJzIHRoYXQgd2UgbmVlZCAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKworI2lmZGVmIENPTkZJR19ORVRfUkFESU8KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgkJLyogV2lyZWxlc3MgZXh0ZW5zaW9ucyAqLworI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CQkvKiBOZXcgZHJpdmVyIEFQSSAqLworI2VuZGlmCisKKy8qIFBjbWNpYSBoZWFkZXJzIHRoYXQgd2UgbmVlZCAqLworI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKworLyogV2F2ZWxhbiBkZWNsYXJhdGlvbnMgKi8KKyNpbmNsdWRlICJpODI1OTMuaCIJLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBJbnRlbCBjaGlwICovCisKKyNpbmNsdWRlICJ3YXZlbGFuX2NzLmgiCS8qIE90aGVycyBiaXRzIG9mIHRoZSBoYXJkd2FyZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRFJJVkVSIE9QVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYCNkZWZpbmUnIG9yIGAjdW5kZWYnIHRoZSBmb2xsb3dpbmcgY29uc3RhbnQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvdXIKKyAqIG9mIHRoZSBkcml2ZXIuLi4KKyAqLworI2RlZmluZSBXQVZFTEFOX1JPQU1JTkcJCS8qIEluY2x1ZGUgZXhwZXJpbWVudGFsIHJvYW1pbmcgY29kZSAqLworI3VuZGVmIFdBVkVMQU5fUk9BTUlOR19FWFQJLyogRW5hYmxlIHJvYW1pbmcgd2lyZWxlc3MgZXh0ZW5zaW9ucyAqLworI3VuZGVmIFNFVF9QU0FfQ1JDCQkvKiBTZXQgdGhlIENSQyBpbiBQU0EgKHNsb3dlcikgKi8KKyNkZWZpbmUgVVNFX1BTQV9DT05GSUcJCS8qIFVzZSBpbmZvIGZyb20gdGhlIFBTQSAqLworI3VuZGVmIFNUUlVDVF9DSEVDSwkJLyogVmVyaWZ5IHBhZGRpbmcgb2Ygc3RydWN0dXJlcyAqLworI3VuZGVmIEVFUFJPTV9JU19QUk9URUNURUQJLyogRG9lc24ndCBzZWVtIHRvIGJlIG5lY2Vzc2FyeSAqLworI2RlZmluZSBNVUxUSUNBU1RfQVZPSUQJCS8qIEF2b2lkIGV4dHJhIG11bHRpY2FzdCAoSSdtIHNjZXB0aWNhbCkgKi8KKyN1bmRlZiBTRVRfTUFDX0FERFJFU1MJCS8qIEV4cGVyaW1lbnRhbCAqLworCisjaWZkZWYgV0lSRUxFU1NfRVhUCS8qIElmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdCBpbiB0aGUga2VybmVsICovCisvKiBXYXJuaW5nIDogdGhlc2Ugc3R1ZmYgd2lsbCBzbG93IGRvd24gdGhlIGRyaXZlci4uLiAqLworI2RlZmluZSBXSVJFTEVTU19TUFkJCS8qIEVuYWJsZSBzcHlpbmcgYWRkcmVzc2VzICovCisjdW5kZWYgSElTVE9HUkFNCQkvKiBFbmFibGUgaGlzdG9ncmFtIG9mIHNpZyBsZXZlbC4uLiAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogREVCVUcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjdW5kZWYgREVCVUdfTU9EVUxFX1RSQUNFCS8qIE1vZHVsZSBpbnNlcnRpb24vcmVtb3ZhbCAqLworI3VuZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCS8qIENhbGxzIG1hZGUgYnkgTGludXggKi8KKyN1bmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UJLyogQ2FsbHMgdG8gaGFuZGxlciAqLworI3VuZGVmIERFQlVHX0lOVEVSUlVQVF9JTkZPCS8qIHR5cGUgb2YgaW50ZXJydXB0ICYgc28gb24gKi8KKyNkZWZpbmUgREVCVUdfSU5URVJSVVBUX0VSUk9SCS8qIHByb2JsZW1zICovCisjdW5kZWYgREVCVUdfQ09ORklHX1RSQUNFCS8qIFRyYWNlIHRoZSBjb25maWcgZnVuY3Rpb25zICovCisjdW5kZWYgREVCVUdfQ09ORklHX0lORk8JLyogV2hhdCdzIGdvaW5nIG9uLi4uICovCisjZGVmaW5lIERFQlVHX0NPTkZJR19FUlJPUlMJLyogRXJyb3JzIG9uIGNvbmZpZ3VyYXRpb24gKi8KKyN1bmRlZiBERUJVR19UWF9UUkFDRQkJLyogVHJhbnNtaXNzaW9uIGNhbGxzICovCisjdW5kZWYgREVCVUdfVFhfSU5GTwkJLyogSGVhZGVyIG9mIHRoZSB0cmFuc21pdHRlZCBwYWNrZXQgKi8KKyN1bmRlZiBERUJVR19UWF9GQUlMCQkvKiBOb3JtYWwgZmFpbHVyZSBjb25kaXRpb25zICovCisjZGVmaW5lIERFQlVHX1RYX0VSUk9SCQkvKiBVbmV4cGVjdGVkIGNvbmRpdGlvbnMgKi8KKyN1bmRlZiBERUJVR19SWF9UUkFDRQkJLyogVHJhbnNtaXNzaW9uIGNhbGxzICovCisjdW5kZWYgREVCVUdfUlhfSU5GTwkJLyogSGVhZGVyIG9mIHRoZSB0cmFuc21pdHRlZCBwYWNrZXQgKi8KKyN1bmRlZiBERUJVR19SWF9GQUlMCQkvKiBOb3JtYWwgZmFpbHVyZSBjb25kaXRpb25zICovCisjZGVmaW5lIERFQlVHX1JYX0VSUk9SCQkvKiBVbmV4cGVjdGVkIGNvbmRpdGlvbnMgKi8KKyN1bmRlZiBERUJVR19QQUNLRVRfRFVNUAkvKiBEdW1wIHBhY2tldCBvbiB0aGUgc2NyZWVuICovCisjdW5kZWYgREVCVUdfSU9DVExfVFJBQ0UJLyogTWlzYyBjYWxsIGJ5IExpbnV4ICovCisjdW5kZWYgREVCVUdfSU9DVExfSU5GTwkJLyogVmFyaW91cyBkZWJ1ZyBpbmZvICovCisjZGVmaW5lIERFQlVHX0lPQ1RMX0VSUk9SCS8qIFdoYXQncyBnb2luZyB3cm9uZyAqLworI2RlZmluZSBERUJVR19CQVNJQ19TSE9XCS8qIFNob3cgYmFzaWMgc3RhcnR1cCBpbmZvICovCisjdW5kZWYgREVCVUdfVkVSU0lPTl9TSE9XCS8qIFByaW50IHZlcnNpb24gaW5mbyAqLworI3VuZGVmIERFQlVHX1BTQV9TSE9XCQkvKiBEdW1wIHBzYSB0byBzY3JlZW4gKi8KKyN1bmRlZiBERUJVR19NTUNfU0hPVwkJLyogRHVtcCBtbWMgdG8gc2NyZWVuICovCisjdW5kZWYgREVCVUdfU0hPV19VTlVTRUQJLyogU2hvdyBhbHNvIHVudXNlZCBmaWVsZHMgKi8KKyN1bmRlZiBERUJVR19JODI1OTNfU0hPVwkvKiBTaG93IGk4MjU5MyBzdGF0dXMgKi8KKyN1bmRlZiBERUJVR19ERVZJQ0VfU0hPVwkvKiBTaG93IGRldmljZSBwYXJhbWV0ZXJzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogQ09OU1RBTlRTICYgTUFDUk9TICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIERFQlVHX1ZFUlNJT05fU0hPVworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPSAid2F2ZWxhbl9jcy5jIDogdjI0IChTTVAgKyB3aXJlbGVzcyBleHRlbnNpb25zKSAxMS8xLzAyXG4iOworI2VuZGlmCisKKy8qIFdhdGNoZG9nIHRlbXBvcmlzYXRpb24gKi8KKyNkZWZpbmUJV0FUQ0hET0dfSklGRklFUwkoMjU2KkhaLzEwMCkKKworLyogRml4IGEgYnVnIGluIHNvbWUgb2xkIHdpcmVsZXNzIGV4dGVuc2lvbiBkZWZpbml0aW9ucyAqLworI2lmbmRlZiBJV19FU1NJRF9NQVhfU0laRQorI2RlZmluZSBJV19FU1NJRF9NQVhfU0laRQkzMgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQUklWQVRFIElPQ1RMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFNJT0NTSVBRVEhSCVNJT0NJV0ZJUlNUUFJJVgkJLyogU2V0IHF1YWxpdHkgdGhyZXNob2xkICovCisjZGVmaW5lIFNJT0NHSVBRVEhSCVNJT0NJV0ZJUlNUUFJJViArIDEJLyogR2V0IHF1YWxpdHkgdGhyZXNob2xkICovCisjZGVmaW5lIFNJT0NTSVBST0FNICAgICBTSU9DSVdGSVJTVFBSSVYgKyAyCS8qIFNldCByb2FtaW5nIHN0YXRlICovCisjZGVmaW5lIFNJT0NHSVBST0FNICAgICBTSU9DSVdGSVJTVFBSSVYgKyAzCS8qIEdldCByb2FtaW5nIHN0YXRlICovCisKKyNkZWZpbmUgU0lPQ1NJUEhJU1RPCVNJT0NJV0ZJUlNUUFJJViArIDQJLyogU2V0IGhpc3RvZ3JhbSByYW5nZXMgKi8KKyNkZWZpbmUgU0lPQ0dJUEhJU1RPCVNJT0NJV0ZJUlNUUFJJViArIDUJLyogR2V0IGhpc3RvZ3JhbSB2YWx1ZXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBXYXZlTEFOIFJvYW1pbmcgICoqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFdBVkVMQU5fUk9BTUlORwkJLyogQ29uZGl0aW9uYWwgY29tcGlsZSwgc2VlIGFib3ZlIGluIG9wdGlvbnMgKi8KKworI2RlZmluZSBXQVZFTEFOX1JPQU1JTkdfREVCVUcJIDAJLyogMSA9IFRyYWNlIG9mIGhhbmRvdmVyIGRlY2lzaW9ucyAqLworCQkJCQkvKiAyID0gSW5mbyBvbiBlYWNoIGJlYWNvbiByY3ZkLi4uICovCisjZGVmaW5lIE1BWF9XQVZFUE9JTlRTCQk3CS8qIE1heCB2aXNpYmxlIGF0IG9uZSB0aW1lICovCisjZGVmaW5lIFdBVkVQT0lOVF9ISVNUT1JZCTUJLyogU05SIHNhbXBsZSBoaXN0b3J5IHNsb3cgc2VhcmNoICovCisjZGVmaW5lIFdBVkVQT0lOVF9GQVNUX0hJU1RPUlkJMgkvKiBTTlIgc2FtcGxlIGhpc3RvcnkgZmFzdCBzZWFyY2ggKi8KKyNkZWZpbmUgU0VBUkNIX1RIUkVTSF9MT1cJMTAJLyogU05SIHRvIGVudGVyIGNlbGwgc2VhcmNoICovCisjZGVmaW5lIFNFQVJDSF9USFJFU0hfSElHSAkxMwkvKiBTTlIgdG8gbGVhdmUgY2VsbCBzZWFyY2ggKi8KKyNkZWZpbmUgV0FWRUxBTl9ST0FNSU5HX0RFTFRBCTEJLyogSHlzdGVyZXNpcyB2YWx1ZSAoKy8tIFNOUikgKi8KKyNkZWZpbmUgQ0VMTF9USU1FT1VUCQkyKkhaCS8qIGluIGppZmZpZXMgKi8KKworI2RlZmluZSBGQVNUX0NFTExfU0VBUkNICTEJLyogQm9vbGVhbiB2YWx1ZXMuLi4gKi8KKyNkZWZpbmUgTldJRF9QUk9NSVNDCQkxCS8qIGZvciBjb2RlIGNsYXJpdHkuICovCisKK3R5cGVkZWYgc3RydWN0IHdhdmVwb2ludF9iZWFjb24KK3sKKyAgdW5zaWduZWQgY2hhcgkJZHNhcCwJCS8qIFVudXNlZCAqLworCQkJc3NhcCwJCS8qIFVudXNlZCAqLworCQkJY3RybCwJCS8qIFVudXNlZCAqLworCQkJTyxVLEksCQkvKiBVbnVzZWQgKi8KKwkJCXNwZWNfaWQxLAkvKiBVbnVzZWQgKi8KKwkJCXNwZWNfaWQyLAkvKiBVbnVzZWQgKi8KKwkJCXBkdV90eXBlLAkvKiBVbnVzZWQgKi8KKwkJCXNlcTsJCS8qIFdhdmVQb2ludCBiZWFjb24gc2VxdWVuY2UgbnVtYmVyICovCisgIHVuc2lnbmVkIHNob3J0CWRvbWFpbl9pZCwJLyogV2F2ZVBvaW50IERvbWFpbiBJRCAqLworCQkJbndpZDsJCS8qIFdhdmVQb2ludCBOV0lEICovCit9IHdhdmVwb2ludF9iZWFjb247CisKK3R5cGVkZWYgc3RydWN0IHdhdmVwb2ludF9oaXN0b3J5Cit7CisgIHVuc2lnbmVkIHNob3J0CW53aWQ7CQkvKiBXYXZlUG9pbnQncyBOV0lEICovCisgIGludAkJCWF2ZXJhZ2Vfc2xvdzsJLyogU05SIHJ1bm5pbmcgYXZlcmFnZSAqLworICBpbnQJCQlhdmVyYWdlX2Zhc3Q7CS8qIFNOUiBydW5uaW5nIGF2ZXJhZ2UgKi8KKyAgdW5zaWduZWQgY2hhcgkgIHNpZ3F1YWxbV0FWRVBPSU5UX0hJU1RPUlldOyAvKiBSaW5nYnVmZmVyIG9mIHJlY2VudCBTTlIncyAqLworICB1bnNpZ25lZCBjaGFyCQlxdWFscHRyOwkvKiBJbmRleCBpbnRvIHJpbmdidWZmZXIgKi8KKyAgdW5zaWduZWQgY2hhcgkJbGFzdF9zZXE7CS8qIExhc3Qgc2VxLiBubyBzZWVuIGZvciBXYXZlUG9pbnQgKi8KKyAgc3RydWN0IHdhdmVwb2ludF9oaXN0b3J5ICpuZXh0OwkvKiBOZXh0IFdhdmVQb2ludCBpbiB0YWJsZSAqLworICBzdHJ1Y3Qgd2F2ZXBvaW50X2hpc3RvcnkgKnByZXY7CS8qIFByZXZpb3VzIFdhdmVQb2ludCBpbiB0YWJsZSAqLworICB1bnNpZ25lZCBsb25nCQlsYXN0X3NlZW47CS8qIFRpbWUgb2YgbGFzdCBiZWFjb24gcmVjdmQsIGppZmZpZXMgKi8KK30gd2F2ZXBvaW50X2hpc3Rvcnk7CisKK3N0cnVjdCB3YXZlcG9pbnRfdGFibGUKK3sKKyAgd2F2ZXBvaW50X2hpc3RvcnkJKmhlYWQ7CQkvKiBTdGFydCBvZiByaW5nYnVmZmVyICovCisgIGludAkJCW51bV93YXZlcG9pbnRzOwkvKiBOby4gb2YgV2F2ZVBvaW50cyB2aXNpYmxlICovCisgIHVuc2lnbmVkIGNoYXIJCWxvY2tlZDsJCS8qIFRhYmxlIGxvY2sgKi8KK307CisKKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBUWVBFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNob3J0Y3V0cyAqLwordHlwZWRlZiBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwllbl9zdGF0czsKK3R5cGVkZWYgc3RydWN0IGl3X3N0YXRpc3RpY3MJaXdfc3RhdHM7Cit0eXBlZGVmIHN0cnVjdCBpd19xdWFsaXR5CWl3X3F1YWw7Cit0eXBlZGVmIHN0cnVjdCBpd19mcmVxCQlpd19mcmVxOwordHlwZWRlZiBzdHJ1Y3QgbmV0X2xvY2FsCW5ldF9sb2NhbDsKK3R5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJdGltZXJfbGlzdDsKKworLyogQmFzaWMgdHlwZXMgKi8KK3R5cGVkZWYgdV9jaGFyCQltYWNfYWRkcltXQVZFTEFOX0FERFJfU0laRV07CS8qIEhhcmR3YXJlIGFkZHJlc3MgKi8KKworLyoKKyAqIFN0YXRpYyBzcGVjaWZpYyBkYXRhIGZvciB0aGUgaW50ZXJmYWNlLgorICoKKyAqIEZvciBlYWNoIG5ldHdvcmsgaW50ZXJmYWNlLCBMaW51eCBrZWVwIGRhdGEgaW4gdHdvIHN0cnVjdHVyZS4gImRldmljZSIKKyAqIGtlZXAgdGhlIGdlbmVyaWMgZGF0YSAoc2FtZSBmb3JtYXQgZm9yIGV2ZXJ5Ym9keSkgYW5kICJuZXRfbG9jYWwiIGtlZXAKKyAqIHRoZSBhZGRpdGlvbmFsIHNwZWNpZmljIGRhdGEuCisgKiBOb3RlIHRoYXQgc29tZSBvZiB0aGlzIHNwZWNpZmljIGRhdGEgaXMgaW4gZmFjdCBnZW5lcmljIChlbl9zdGF0cywgZm9yCisgKiBleGFtcGxlKS4KKyAqLworc3RydWN0IG5ldF9sb2NhbAoreworICBkZXZfbm9kZV90IAlub2RlOwkJLyogPz8/PyBXaGF0IGlzIHRoaXMgc3R1ZmYgPz8/PyAqLworICBzdHJ1Y3QgbmV0X2RldmljZSAqCWRldjsJCS8qIFJldmVyc2UgbGluay4uLiAqLworICBzcGlubG9ja190CXNwaW5sb2NrOwkvKiBTZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZSAoU01QKSAqLworICBkZXZfbGlua190ICoJbGluazsJCS8qIHBjbWNpYSBzdHJ1Y3R1cmUgKi8KKyAgZW5fc3RhdHMJc3RhdHM7CQkvKiBFdGhlcm5ldCBpbnRlcmZhY2Ugc3RhdGlzdGljcyAqLworICBpbnQJCW5yZXNldHM7CS8qIE51bWJlciBvZiBodyByZXNldHMgKi8KKyAgdV9jaGFyCWNvbmZpZ3VyZWQ7CS8qIElmIGl0IGlzIGNvbmZpZ3VyZWQgKi8KKyAgdV9jaGFyCXJlY29uZmlnXzgyNTkzOwkvKiBOZWVkIHRvIHJlY29uZmlndXJlIHRoZSBjb250cm9sbGVyICovCisgIHVfY2hhcglwcm9taXNjdW91czsJLyogUHJvbWlzY3VvdXMgbW9kZSAqLworICB1X2NoYXIJYWxsbXVsdGljYXN0OwkvKiBBbGwgTXVsdGljYXN0IG1vZGUgKi8KKyAgaW50CQltY19jb3VudDsJLyogTnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KKworICBpbnQgICAJc3RvcDsJCS8qIEN1cnJlbnQgaTgyNTkzIFN0b3AgSGl0IFJlZ2lzdGVyICovCisgIGludCAgIAlyZnA7CQkvKiBMYXN0IERNQSBtYWNoaW5lIHJlY2VpdmUgcG9pbnRlciAqLworICBpbnQJCW92ZXJydW5uaW5nOwkvKiBSZWNlaXZlciBvdmVycnVuIGZsYWcgKi8KKworI2lmZGVmIFdJUkVMRVNTX0VYVAorICBpd19zdGF0cwl3c3RhdHM7CQkvKiBXaXJlbGVzcyBzcGVjaWZpYyBzdGF0cyAqLworCisgIHN0cnVjdCBpd19zcHlfZGF0YQlzcHlfZGF0YTsKKyAgc3RydWN0IGl3X3B1YmxpY19kYXRhCXdpcmVsZXNzX2RhdGE7CisjZW5kaWYKKworI2lmZGVmIEhJU1RPR1JBTQorICBpbnQJCWhpc19udW1iZXI7CQkvKiBOdW1iZXIgb2YgaW50ZXJ2YWxzICovCisgIHVfY2hhcgloaXNfcmFuZ2VbMTZdOwkJLyogQm91bmRhcmllcyBvZiBpbnRlcnZhbCBdbi0xOyBuXSAqLworICB1X2xvbmcJaGlzX3N1bVsxNl07CQkvKiBTdW0gaW4gaW50ZXJ2YWwgKi8KKyNlbmRpZgkvKiBISVNUT0dSQU0gKi8KKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcKKyAgdV9sb25nCWRvbWFpbl9pZDsJLyogRG9tYWluIElEIHdlIGxvY2sgb24gZm9yIHJvYW1pbmcgKi8KKyAgaW50CQlmaWx0ZXJfZG9tYWluczsJLyogQ2hlY2sgRG9tYWluIElEIG9mIGJlYWNvbiBmb3VuZCAqLworIHN0cnVjdCB3YXZlcG9pbnRfdGFibGUJd2F2ZXBvaW50X3RhYmxlOwkvKiBUYWJsZSBvZiB2aXNpYmxlIFdhdmVQb2ludHMqLworICB3YXZlcG9pbnRfaGlzdG9yeSAqCWN1cnJfcG9pbnQ7CQkvKiBDdXJyZW50IHdhdmVwb2ludCAqLworICBpbnQJCQljZWxsX3NlYXJjaDsJCS8qIFNlYXJjaGluZyBmb3IgbmV3IGNlbGw/ICovCisgIHN0cnVjdCB0aW1lcl9saXN0CWNlbGxfdGltZXI7CQkvKiBHYXJiYWdlIGNvbGxlY3Rpb24gKi8KKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKyAgdm9pZCBfX2lvbWVtICptZW07Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQUk9UT1RZUEVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUk9BTUlORyBTVUJST1VUSU5FUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3dhdmVwb2ludF9oaXN0b3J5ICp3bF9yb2FtX2NoZWNrKHVuc2lnbmVkIHNob3J0IG53aWQsIG5ldF9sb2NhbCAqbHApOword2F2ZXBvaW50X2hpc3RvcnkgKndsX25ld193YXZlcG9pbnQodW5zaWduZWQgc2hvcnQgbndpZCwgdW5zaWduZWQgY2hhciBzZXEsIG5ldF9sb2NhbCAqbHApOwordm9pZCB3bF9kZWxfd2F2ZXBvaW50KHdhdmVwb2ludF9oaXN0b3J5ICp3YXZlcG9pbnQsIG5ldF9sb2NhbCAqbHApOwordm9pZCB3bF9jZWxsX2V4cGlyeSh1bnNpZ25lZCBsb25nIGRhdGEpOword2F2ZXBvaW50X2hpc3RvcnkgKndsX2Jlc3Rfc2lncXVhbChpbnQgZmFzdF9zZWFyY2gsIG5ldF9sb2NhbCAqbHApOwordm9pZCB3bF91cGRhdGVfaGlzdG9yeSh3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50LCB1bnNpZ25lZCBjaGFyIHNpZ3F1YWwsIHVuc2lnbmVkIGNoYXIgc2VxKTsKK3ZvaWQgd3Zfcm9hbV9oYW5kb3Zlcih3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50LCBuZXRfbG9jYWwgKmxwKTsKK3ZvaWQgd3ZfbndpZF9maWx0ZXIodW5zaWduZWQgY2hhciBtb2RlLCBuZXRfbG9jYWwgKmxwKTsKK3ZvaWQgd3Zfcm9hbV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCB3dl9yb2FtX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIE1PREVNIE1BTkFHRU1FTlQgU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgdV9jaGFyCQkvKiBkYXRhICovCisJaGFzcl9yZWFkKHVfbG9uZyk7CS8qIFJlYWQgdGhlIGhvc3QgaW50ZXJmYWNlIDogYmFzZSBhZGRyZXNzICovCitzdGF0aWMgaW5saW5lIHZvaWQKKwloYWNyX3dyaXRlKHVfbG9uZywJLyogV3JpdGUgdG8gaG9zdCBpbnRlcmZhY2UgOiBiYXNlIGFkZHJlc3MgKi8KKwkJICAgdV9jaGFyKSwJLyogZGF0YSAqLworCWhhY3Jfd3JpdGVfc2xvdyh1X2xvbmcsCisJCSAgIHVfY2hhcik7CitzdGF0aWMgdm9pZAorCXBzYV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICosCS8qIFJlYWQgdGhlIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgKi8KKwkJIGludCwJCS8qIG9mZnNldCBpbiBQU0EgKi8KKwkJIHVfY2hhciAqLAkvKiBidWZmZXIgdG8gZmlsbCAqLworCQkgaW50KSwJCS8qIHNpemUgdG8gcmVhZCAqLworCXBzYV93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqLAkvKiBXcml0ZSB0byB0aGUgUFNBICovCisJCSAgaW50LAkJLyogT2Zmc2V0IGluIHBzYSAqLworCQkgIHVfY2hhciAqLAkvKiBCdWZmZXIgaW4gbWVtb3J5ICovCisJCSAgaW50KTsJCS8qIExlbmd0aCBvZiBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorCW1tY19vdXQodV9sb25nLAkJLyogV3JpdGUgMSBieXRlIHRvIHRoZSBNb2RlbSBNYW5hZyBDb250cm9sICovCisJCXVfc2hvcnQsCisJCXVfY2hhciksCisJbW1jX3dyaXRlKHVfbG9uZywJLyogV3JpdGUgbiBieXRlcyB0byB0aGUgTU1DICovCisJCSAgdV9jaGFyLAorCQkgIHVfY2hhciAqLAorCQkgIGludCk7CitzdGF0aWMgaW5saW5lIHVfY2hhcgkJLyogUmVhZCAxIGJ5dGUgZnJvbSB0aGUgTU1DICovCisJbW1jX2luKHVfbG9uZywKKwkgICAgICAgdV9zaG9ydCk7CitzdGF0aWMgaW5saW5lIHZvaWQKKwltbWNfcmVhZCh1X2xvbmcsCS8qIFJlYWQgbiBieXRlcyBmcm9tIHRoZSBNTUMgKi8KKwkJIHVfY2hhciwKKwkJIHVfY2hhciAqLAorCQkgaW50KSwKKwlmZWVfd2FpdCh1X2xvbmcsCS8qIFdhaXQgZm9yIGZyZXF1ZW5jeSBFRXByb20gOiBiYXNlIGFkZHJlc3MgKi8KKwkJIGludCwJCS8qIEJhc2UgZGVsYXkgdG8gd2FpdCBmb3IgKi8KKwkJIGludCk7CQkvKiBOdW1iZXIgb2YgdGltZSB0byB3YWl0ICovCitzdGF0aWMgdm9pZAorCWZlZV9yZWFkKHVfbG9uZywJLyogUmVhZCB0aGUgZnJlcXVlbmN5IEVFcHJvbSA6IGJhc2UgYWRkcmVzcyAqLworCQkgdV9zaG9ydCwJLyogZGVzdGluYXRpb24gb2Zmc2V0ICovCisJCSB1X3Nob3J0ICosCS8qIGRhdGEgYnVmZmVyICovCisJCSBpbnQpOwkJLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJODI1OTMgU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQKKwl3dl84MjU5M19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogc3luY2hyb25vdXNseSBzZW5kIGEgY29tbWFuZCB0byBpODI1OTMgKi8gCisJCSAgICAgY2hhciAqLAorCQkgICAgIGludCwKKwkJICAgICBpbnQpOworc3RhdGljIGlubGluZSBpbnQKKwl3dl9kaWFnKHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBEaWFnbm9zdGlxdWUgdGhlIGk4MjU5MyAqLworc3RhdGljIGludAorCXJlYWRfcmluZ2J1ZihzdHJ1Y3QgbmV0X2RldmljZSAqLAkvKiBSZWFkIGEgcmVjZWl2ZSBidWZmZXIgKi8KKwkJICAgICBpbnQsCisJCSAgICAgY2hhciAqLAorCQkgICAgIGludCk7CitzdGF0aWMgaW5saW5lIHZvaWQKKwl3dl84MjU5M19yZWNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogUmVjb25maWd1cmUgdGhlIGNvbnRyb2xsZXIgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gREVCVUcgJiBJTkZPIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorCXd2X2luaXRfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogZGlzcGxheSBzdGFydHVwIGluZm8gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gSU9DVEwsIFNUQVRTICYgUkVDT05GSUcgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGVuX3N0YXRzCSoKKwl3YXZlbGFuX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogR2l2ZSBzdGF0cyAvcHJvYy9uZXQvZGV2ICovCitzdGF0aWMgaXdfc3RhdHMgKgorCXdhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUEFDS0VUIFJFQ0VQVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSBpbnQKKwl3dl9zdGFydF9vZl9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqLAkvKiBTZWVrIGJlZ2dpbmluZyBvZiBjdXJyZW50IGZyYW1lICovCisJCQkgIGludCwJLyogZW5kIG9mIGZyYW1lICovCisJCQkgIGludCk7CS8qIHN0YXJ0IG9mIGJ1ZmZlciAqLworc3RhdGljIGlubGluZSB2b2lkCisJd3ZfcGFja2V0X3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogUmVhZCBhIHBhY2tldCBmcm9tIGEgZnJhbWUgKi8KKwkJICAgICAgIGludCwKKwkJICAgICAgIGludCksCisJd3ZfcGFja2V0X3JjdihzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogUmVhZCBhbGwgcGFja2V0cyB3YWl0aW5nICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gUEFDS0VUIFRSQU5TTUlTU0lPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorCXd2X3BhY2tldF93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqLAkvKiBXcml0ZSBhIHBhY2tldCB0byB0aGUgVHggYnVmZmVyICovCisJCQl2b2lkICosCisJCQlzaG9ydCk7CitzdGF0aWMgaW50CisJd2F2ZWxhbl9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqLAkvKiBTZW5kIGEgcGFja2V0ICovCisJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKik7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBIQVJEV0FSRSBDT05GSUdVUkFUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIGludAorCXd2X21tY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBJbml0aWFsaXplIHRoZSBtb2RlbSAqLworc3RhdGljIGludAorCXd2X3J1X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKiksCS8qIFN0b3AgdGhlIGk4MjU5MyByZWNlaXZlciB1bml0ICovCisJd3ZfcnVfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFN0YXJ0IHRoZSBpODI1OTMgcmVjZWl2ZXIgdW5pdCAqLworc3RhdGljIGludAorCXd2XzgyNTkzX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogQ29uZmlndXJlIHRoZSBpODI1OTMgKi8KK3N0YXRpYyBpbmxpbmUgaW50CisJd3ZfcGNtY2lhX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBSZXNldCB0aGUgcGNtY2lhIGludGVyZmFjZSAqLworc3RhdGljIGludAorCXd2X2h3X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogUmVzZXQgJiBjb25maWd1cmUgdGhlIHdob2xlIGhhcmR3YXJlICovCitzdGF0aWMgaW5saW5lIHZvaWQKKwl3dl9od19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogU2FtZSwgKyBzdGFydCByZWNlaXZlciB1bml0ICovCitzdGF0aWMgaW5saW5lIGludAorCXd2X3BjbWNpYV9jb25maWcoZGV2X2xpbmtfdCAqKTsJLyogQ29uZmlndXJlIHRoZSBwY21jaWEgaW50ZXJmYWNlICovCitzdGF0aWMgdm9pZAorCXd2X3BjbWNpYV9yZWxlYXNlKGRldl9saW5rX3QgKik7LyogUmVtb3ZlIGEgZGV2aWNlICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElOVEVSUlVQVCBIQU5ETElORyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaXJxcmV0dXJuX3QKKwl3YXZlbGFuX2ludGVycnVwdChpbnQsCS8qIEludGVycnVwdCBoYW5kbGVyICovCisJCQkgIHZvaWQgKiwKKwkJCSAgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgdm9pZAorCXdhdmVsYW5fd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFRyYW5zbWlzc2lvbiB3YXRjaGRvZyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBDT05GSUdVUkFUSU9OIENBTExCQUNLUyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50CisJd2F2ZWxhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICopLAkJLyogT3BlbiB0aGUgZGV2aWNlICovCisJd2F2ZWxhbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogQ2xvc2UgdGhlIGRldmljZSAqLworc3RhdGljIGRldl9saW5rX3QgKgorCXdhdmVsYW5fYXR0YWNoKHZvaWQpOwkJLyogQ3JlYXRlIGEgbmV3IGRldmljZSAqLworc3RhdGljIHZvaWQKKwl3YXZlbGFuX2RldGFjaChkZXZfbGlua190ICopOwkvKiBEZXN0cm95IGEgcmVtb3ZlZCBkZXZpY2UgKi8KK3N0YXRpYyBpbnQKKwl3YXZlbGFuX2V2ZW50KGV2ZW50X3QsCQkvKiBNYW5hZ2UgcGNtY2lhIGV2ZW50cyAqLworCQkgICAgICBpbnQsCisJCSAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogVkFSSUFCTEVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gIndhdmVsYW5fY3MiOworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0ID0gTlVMTDsJLyogTGlua2VkIGxpc3Qgb2YgZGV2aWNlcyAqLworCisvKgorICogUGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgd2l0aCAnaW5zbW9kJworICogVGhlIGV4YWN0IHN5bnRheCBpcyAnaW5zbW9kIHdhdmVsYW5fY3MubyA8dmFyPj08dmFsdWU+JworICovCisKKy8qIFNoYXJlZCBtZW1vcnkgc3BlZWQsIGluIG5zICovCitzdGF0aWMgaW50CW1lbV9zcGVlZCA9IDA7CisKKy8qIE5ldyBtb2R1bGUgaW50ZXJmYWNlICovCittb2R1bGVfcGFyYW0obWVtX3NwZWVkLCBpbnQsIDApOworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCQkvKiBDb25kaXRpb25hbCBjb21waWxlLCBzZWUgYWJvdmUgaW4gb3B0aW9ucyAqLworLyogRW5hYmxlIHJvYW1pbmcgbW9kZSA/IE5vICEgUGxlYXNlIGtlZXAgdGhpcyB0byAwICovCitzdGF0aWMgaW50CWRvX3JvYW1pbmcgPSAwOworbW9kdWxlX3BhcmFtKGRvX3JvYW1pbmcsIGJvb2wsIDApOworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNlbmRpZgkvKiBXQVZFTEFOX0NTX1BfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MzZkOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDEuaApAQCAtMCwwICsxLDYxNCBAQAorI2lmbmRlZiBfX1dMMzUwMV9IX18KKyNkZWZpbmUgX19XTDM1MDFfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgImllZWU4MDJfMTEuaCIKKworLyogZGVmaW5lIGZvciBXTEEgMi4wICovCisjZGVmaW5lIFdMMzUwMV9CTEtTWiAyNTYKKy8qCisgKiBJRCBmb3IgaW5wdXQgU2lnbmFscyBvZiBEUklWRVIgYmxvY2sKKyAqIGJpdFs3LTVdIGlzIGJsb2NrIElEOiAwMDAKKyAqIGJpdFs0LTBdIGlzIHNpZ25hbCBJRAorKi8KK2VudW0gd2wzNTAxX3NpZ25hbHMgeworCVdMMzUwMV9TSUdfQUxBUk0sCisJV0wzNTAxX1NJR19NRF9DT05GSVJNLAorCVdMMzUwMV9TSUdfTURfSU5ELAorCVdMMzUwMV9TSUdfQVNTT0NfQ09ORklSTSwKKwlXTDM1MDFfU0lHX0FTU09DX0lORCwKKwlXTDM1MDFfU0lHX0FVVEhfQ09ORklSTSwKKwlXTDM1MDFfU0lHX0FVVEhfSU5ELAorCVdMMzUwMV9TSUdfREVBVVRIX0NPTkZJUk0sCisJV0wzNTAxX1NJR19ERUFVVEhfSU5ELAorCVdMMzUwMV9TSUdfRElTQVNTT0NfQ09ORklSTSwKKwlXTDM1MDFfU0lHX0RJU0FTU09DX0lORCwKKwlXTDM1MDFfU0lHX0dFVF9DT05GSVJNLAorCVdMMzUwMV9TSUdfSk9JTl9DT05GSVJNLAorCVdMMzUwMV9TSUdfUFdSX01HTVRfQ09ORklSTSwKKwlXTDM1MDFfU0lHX1JFQVNTT0NfQ09ORklSTSwKKwlXTDM1MDFfU0lHX1JFQVNTT0NfSU5ELAorCVdMMzUwMV9TSUdfU0NBTl9DT05GSVJNLAorCVdMMzUwMV9TSUdfU0VUX0NPTkZJUk0sCisJV0wzNTAxX1NJR19TVEFSVF9DT05GSVJNLAorCVdMMzUwMV9TSUdfUkVTWU5DX0NPTkZJUk0sCisJV0wzNTAxX1NJR19TSVRFX0NPTkZJUk0sCisJV0wzNTAxX1NJR19TQVZFX0NPTkZJUk0sCisJV0wzNTAxX1NJR19SRlRFU1RfQ09ORklSTSwKKy8qCisgKiBJRCBmb3IgaW5wdXQgU2lnbmFscyBvZiBNTE1FIGJsb2NrCisgKiBiaXRbNy01XSBpcyBibG9jayBJRDogMDEwCisgKiBiaXRbNC0wXSBpcyBzaWduYWwgSUQKKyAqLworCVdMMzUwMV9TSUdfQVNTT0NfUkVRID0gMHgyMCwKKwlXTDM1MDFfU0lHX0FVVEhfUkVRLAorCVdMMzUwMV9TSUdfREVBVVRIX1JFUSwKKwlXTDM1MDFfU0lHX0RJU0FTU09DX1JFUSwKKwlXTDM1MDFfU0lHX0dFVF9SRVEsCisJV0wzNTAxX1NJR19KT0lOX1JFUSwKKwlXTDM1MDFfU0lHX1BXUl9NR01UX1JFUSwKKwlXTDM1MDFfU0lHX1JFQVNTT0NfUkVRLAorCVdMMzUwMV9TSUdfU0NBTl9SRVEsCisJV0wzNTAxX1NJR19TRVRfUkVRLAorCVdMMzUwMV9TSUdfU1RBUlRfUkVRLAorCVdMMzUwMV9TSUdfTURfUkVRLAorCVdMMzUwMV9TSUdfUkVTWU5DX1JFUSwKKwlXTDM1MDFfU0lHX1NJVEVfUkVRLAorCVdMMzUwMV9TSUdfU0FWRV9SRVEsCisJV0wzNTAxX1NJR19SRl9URVNUX1JFUSwKKwlXTDM1MDFfU0lHX01NX0NPTkZJUk0gPSAweDYwLAorCVdMMzUwMV9TSUdfTU1fSU5ELAorfTsKKworZW51bSB3bDM1MDFfbWliX2F0dHJpYnMgeworCVdMMzUwMV9NSUJfQVRUUl9TVEFUSU9OX0lELAorCVdMMzUwMV9NSUJfQVRUUl9BVVRIX0FMR09SSVRITVMsCisJV0wzNTAxX01JQl9BVFRSX0FVVEhfVFlQRSwKKwlXTDM1MDFfTUlCX0FUVFJfTUVESVVNX09DQ1VQQU5DWV9MSU1JVCwKKwlXTDM1MDFfTUlCX0FUVFJfQ0ZfUE9MTEFCTEUsCisJV0wzNTAxX01JQl9BVFRSX0NGUF9QRVJJT0QsCisJV0wzNTAxX01JQl9BVFRSX0NGUE1BWF9EVVJBVElPTiwKKwlXTDM1MDFfTUlCX0FUVFJfQVVUSF9SRVNQX1RNT1VULAorCVdMMzUwMV9NSUJfQVRUUl9SWF9EVElNUywKKwlXTDM1MDFfTUlCX0FUVFJfUFJJVl9PUFRfSU1QTEVNRU5URUQsCisJV0wzNTAxX01JQl9BVFRSX1BSSVZfSU5WT0tFRCwKKwlXTDM1MDFfTUlCX0FUVFJfV0VQX0RFRkFVTFRfS0VZUywKKwlXTDM1MDFfTUlCX0FUVFJfV0VQX0RFRkFVTFRfS0VZX0lELAorCVdMMzUwMV9NSUJfQVRUUl9XRVBfS0VZX01BUFBJTkdTLAorCVdMMzUwMV9NSUJfQVRUUl9XRVBfS0VZX01BUFBJTkdTX0xFTiwKKwlXTDM1MDFfTUlCX0FUVFJfRVhDTFVERV9VTkVOQ1JZUFRFRCwKKwlXTDM1MDFfTUlCX0FUVFJfV0VQX0lDVl9FUlJPUl9DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfV0VQX1VOREVDUllQVEFCTEVfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX1dFUF9FWENMVURFRF9DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfTUFDX0FERFIsCisJV0wzNTAxX01JQl9BVFRSX0dST1VQX0FERFJTLAorCVdMMzUwMV9NSUJfQVRUUl9SVFNfVEhSRVNIT0xELAorCVdMMzUwMV9NSUJfQVRUUl9TSE9SVF9SRVRSWV9MSU1JVCwKKwlXTDM1MDFfTUlCX0FUVFJfTE9OR19SRVRSWV9MSU1JVCwKKwlXTDM1MDFfTUlCX0FUVFJfRlJBR19USFJFU0hPTEQsCisJV0wzNTAxX01JQl9BVFRSX01BWF9UWF9NU0RVX0xJRkVUSU1FLAorCVdMMzUwMV9NSUJfQVRUUl9NQVhfUlhfTElGRVRJTUUsCisJV0wzNTAxX01JQl9BVFRSX01BTlVGQUNUVVJFUl9JRCwKKwlXTDM1MDFfTUlCX0FUVFJfUFJPRFVDVF9JRCwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfRlJBR19DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfTVVMVElDQVNUX1RYX0ZSQU1FX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9GQUlMRURfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX1JYX0ZSQUdfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX01VTFRJQ0FTVF9SWF9DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfRkNTX0VSUk9SX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9SRVRSWV9DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfTVVMVElQTEVfUkVUUllfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX1JUU19TVUNDRVNTX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9SVFNfRkFJTFVSRV9DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfQUNLX0ZBSUxVUkVfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX0ZSQU1FX0RVUExJQ0FURV9DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfUEhZX1RZUEUsCisJV0wzNTAxX01JQl9BVFRSX1JFR19ET01BSU5TX1NVUFBPUlQsCisJV0wzNTAxX01JQl9BVFRSX0NVUlJFTlRfUkVHX0RPTUFJTiwKKwlXTDM1MDFfTUlCX0FUVFJfU0xPVF9USU1FLAorCVdMMzUwMV9NSUJfQVRUUl9DQ0FfVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfUlhfVFhfVFVSTkFST1VORF9USU1FLAorCVdMMzUwMV9NSUJfQVRUUl9UWF9QTENQX0RFTEFZLAorCVdMMzUwMV9NSUJfQVRUUl9SWF9UWF9TV0lUQ0hfVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUkFNUF9PTl9USU1FLAorCVdMMzUwMV9NSUJfQVRUUl9UWF9SRl9ERUxBWSwKKwlXTDM1MDFfTUlCX0FUVFJfU0lGU19USU1FLAorCVdMMzUwMV9NSUJfQVRUUl9SWF9SRl9ERUxBWSwKKwlXTDM1MDFfTUlCX0FUVFJfUlhfUExDUF9ERUxBWSwKKwlXTDM1MDFfTUlCX0FUVFJfTUFDX1BST0NFU1NJTkdfREVMQVksCisJV0wzNTAxX01JQl9BVFRSX1RYX1JBTVBfT0ZGX1RJTUUsCisJV0wzNTAxX01JQl9BVFRSX1BSRUFNQkxFX0xFTiwKKwlXTDM1MDFfTUlCX0FUVFJfUExDUF9IRUFERVJfTEVOLAorCVdMMzUwMV9NSUJfQVRUUl9NUERVX0RVUkFUSU9OX0ZBQ1RPUiwKKwlXTDM1MDFfTUlCX0FUVFJfQUlSX1BST1BBR0FUSU9OX1RJTUUsCisJV0wzNTAxX01JQl9BVFRSX1RFTVBfVFlQRSwKKwlXTDM1MDFfTUlCX0FUVFJfQ1dfTUlOLAorCVdMMzUwMV9NSUJfQVRUUl9DV19NQVgsCisJV0wzNTAxX01JQl9BVFRSX1NVUFBPUlRfREFUQV9SQVRFU19UWCwKKwlXTDM1MDFfTUlCX0FUVFJfU1VQUE9SVF9EQVRBX1JBVEVTX1JYLAorCVdMMzUwMV9NSUJfQVRUUl9NUERVX01BWF9MRU4sCisJV0wzNTAxX01JQl9BVFRSX1NVUFBPUlRfVFhfQU5URU5OQVMsCisJV0wzNTAxX01JQl9BVFRSX0NVUlJFTlRfVFhfQU5URU5OQSwKKwlXTDM1MDFfTUlCX0FUVFJfU1VQUE9SVF9SWF9BTlRFTk5BUywKKwlXTDM1MDFfTUlCX0FUVFJfRElWRVJTSVRZX1NVUFBPUlQsCisJV0wzNTAxX01JQl9BVFRSX0RJVkVSU0lUWV9TRUxFQ1RJT05fUlMsCisJV0wzNTAxX01JQl9BVFRSX05SX1NVUFBPUlRFRF9QV1JfTEVWRUxTLAorCVdMMzUwMV9NSUJfQVRUUl9UWF9QV1JfTEVWRUwxLAorCVdMMzUwMV9NSUJfQVRUUl9UWF9QV1JfTEVWRUwyLAorCVdMMzUwMV9NSUJfQVRUUl9UWF9QV1JfTEVWRUwzLAorCVdMMzUwMV9NSUJfQVRUUl9UWF9QV1JfTEVWRUw0LAorCVdMMzUwMV9NSUJfQVRUUl9UWF9QV1JfTEVWRUw1LAorCVdMMzUwMV9NSUJfQVRUUl9UWF9QV1JfTEVWRUw2LAorCVdMMzUwMV9NSUJfQVRUUl9UWF9QV1JfTEVWRUw3LAorCVdMMzUwMV9NSUJfQVRUUl9UWF9QV1JfTEVWRUw4LAorCVdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX1RYX1BXUl9MRVZFTCwKKwlXTDM1MDFfTUlCX0FUVFJfQ1VSUkVOVF9DSEFOLAorCVdMMzUwMV9NSUJfQVRUUl9DQ0FfTU9ERV9TVVBQT1JURUQsCisJV0wzNTAxX01JQl9BVFRSX0NVUlJFTlRfQ0NBX01PREUsCisJV0wzNTAxX01JQl9BVFRSX0VEX1RIUkVTSE9MRCwKKwlXTDM1MDFfTUlCX0FUVFJfU0lOVEhFU0laRVJfTE9DS0VELAorCVdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX1BXUl9TVEFURSwKKwlXTDM1MDFfTUlCX0FUVFJfRE9aRV9UVVJOT05fVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfUkNSMzMsCisJV0wzNTAxX01JQl9BVFRSX0RFRkFVTFRfQ0hBTiwKKwlXTDM1MDFfTUlCX0FUVFJfU1NJRCwKKwlXTDM1MDFfTUlCX0FUVFJfUFdSX01HTVRfRU5BQkxFLAorCVdMMzUwMV9NSUJfQVRUUl9ORVRfQ0FQQUJJTElUWSwKKwlXTDM1MDFfTUlCX0FUVFJfUk9VVElORywKK307CisKK2VudW0gd2wzNTAxX25ldF90eXBlIHsKKwlXTDM1MDFfTkVUX1RZUEVfSU5GUkEsCisJV0wzNTAxX05FVF9UWVBFX0FESE9DLAorCVdMMzUwMV9ORVRfVFlQRV9BTllfQlNTLAorfTsKKworZW51bSB3bDM1MDFfc2Nhbl90eXBlIHsKKwlXTDM1MDFfU0NBTl9UWVBFX0FDVElWRSwKKwlXTDM1MDFfU0NBTl9UWVBFX1BBU1NJVkUsCit9OworCitlbnVtIHdsMzUwMV90eF9yZXN1bHQgeworCVdMMzUwMV9UWF9SRVNVTFRfU1VDQ0VTUywKKwlXTDM1MDFfVFhfUkVTVUxUX05PX0JTUywKKwlXTDM1MDFfVFhfUkVTVUxUX1JFVFJZX0xJTUlULAorfTsKKworZW51bSB3bDM1MDFfc3lzX3R5cGUgeworCVdMMzUwMV9TWVNfVFlQRV9PUEVOLAorCVdMMzUwMV9TWVNfVFlQRV9TSEFSRV9LRVksCit9OworCitlbnVtIHdsMzUwMV9zdGF0dXMgeworCVdMMzUwMV9TVEFUVVNfU1VDQ0VTUywKKwlXTDM1MDFfU1RBVFVTX0lOVkFMSUQsCisJV0wzNTAxX1NUQVRVU19USU1FT1VULAorCVdMMzUwMV9TVEFUVVNfUkVGVVNFRCwKKwlXTDM1MDFfU1RBVFVTX01BTllfUkVRLAorCVdMMzUwMV9TVEFUVVNfQUxSRUFEWV9CU1MsCit9OworCisjZGVmaW5lIFdMMzUwMV9NR01UX0NBUEFCSUxJVFlfRVNTCQkweDAwMDEgIC8qIHNlZSA4MDIuMTEgcC41OCAqLworI2RlZmluZSBXTDM1MDFfTUdNVF9DQVBBQklMSVRZX0lCU1MJCTB4MDAwMiAgLyogICAgICAtICIgLQkgICAqLworI2RlZmluZSBXTDM1MDFfTUdNVF9DQVBBQklMSVRZX0NGX1BPTExBQkxFCTB4MDAwNCAgLyogICAgICAtICIgLQkgICAqLworI2RlZmluZSBXTDM1MDFfTUdNVF9DQVBBQklMSVRZX0NGX1BPTExfUkVRVUVTVAkweDAwMDggIC8qICAgICAgLSAiIC0JICAgKi8KKyNkZWZpbmUgV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9QUklWQUNZCQkweDAwMTAgIC8qICAgICAgLSAiIC0JICAgKi8KKworI2RlZmluZSBJV19SRUdfRE9NQUlOX0ZDQwkweDEwCS8qIENoYW5uZWwgMSB0byAxMQlVU0EgICAgKi8KKyNkZWZpbmUgSVdfUkVHX0RPTUFJTl9ET0MJMHgyMAkvKiBDaGFubmVsIDEgdG8gMTEJQ2FuYWRhICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fRVRTSQkweDMwCS8qIENoYW5uZWwgMSB0byAxMwlFdXJvcGUgKi8KKyNkZWZpbmUgSVdfUkVHX0RPTUFJTl9TUEFJTgkweDMxCS8qIENoYW5uZWwgMTAgdG8gMTEJU3BhaW4gICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fRlJBTkNFCTB4MzIJLyogQ2hhbm5lbCAxMCB0byAxMwlGcmFuY2UgKi8KKyNkZWZpbmUgSVdfUkVHX0RPTUFJTl9NS0sJMHg0MAkvKiBDaGFubmVsIDE0CQlKYXBhbiAgKi8KKyNkZWZpbmUgSVdfUkVHX0RPTUFJTl9NS0sxCTB4NDEJLyogQ2hhbm5lbCAxLTE0CQlKYXBhbiAgKi8KKyNkZWZpbmUgSVdfUkVHX0RPTUFJTl9JU1JBRUwJMHg1MAkvKiBDaGFubmVsIDMgLSA5CUlzcmFlbCAqLworCisjZGVmaW5lIElXX01HTVRfUkFURV9MQUJFTF9NQU5EQVRPUlkgMTI4IC8qIE1TQiAqLworCitlbnVtIGl3X21nbXRfcmF0ZV9sYWJlbHMgeworCUlXX01HTVRfUkFURV9MQUJFTF8xTUJJVCAgID0gMiwKKwlJV19NR01UX1JBVEVfTEFCRUxfMk1CSVQgICA9IDQsCisJSVdfTUdNVF9SQVRFX0xBQkVMXzVfNU1CSVQgPSAxMSwKKwlJV19NR01UX1JBVEVfTEFCRUxfMTFNQklUICA9IDIyLAorfTsKKworZW51bSBpd19tZ210X2luZm9fZWxlbWVudF9pZHMgeworCUlXX01HTVRfSU5GT19FTEVNRU5UX1NTSUQsCQkgIC8qIFNlcnZpY2UgU2V0IElkZW50aXR5ICovCisJSVdfTUdNVF9JTkZPX0VMRU1FTlRfU1VQUE9SVEVEX1JBVEVTLAorCUlXX01HTVRfSU5GT19FTEVNRU5UX0ZIX1BBUkFNRVRFUl9TRVQsCisJSVdfTUdNVF9JTkZPX0VMRU1FTlRfRFNfUEFSQU1FVEVSX1NFVCwKKwlJV19NR01UX0lORk9fRUxFTUVOVF9DU19QQVJBTUVURVJfU0VULAorCUlXX01HTVRfSU5GT19FTEVNRU5UX0NTX1RJTSwJCSAgLyogVHJhZmZpYyBJbmZvcm1hdGlvbiBNYXAgKi8KKwlJV19NR01UX0lORk9fRUxFTUVOVF9JQlNTX1BBUkFNRVRFUl9TRVQsCisJLyogNy0xNTogUmVzZXJ2ZWQsIHVudXNlZCAqLworCUlXX01HTVRfSU5GT19FTEVNRU5UX0NIQUxMRU5HRV9URVhUID0gMTYsCisJLyogMTctMzEgUmVzZXJ2ZWQgZm9yIGNoYWxsZW5nZSB0ZXh0IGV4dGVuc2lvbiAqLworCS8qIDMyLTI1NSBSZXNlcnZlZCwgdW51c2VkICovCit9OworCitzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgeworCXU4IGlkOyAvKiBvbmUgb2YgZW51bSBpd19tZ210X2luZm9fZWxlbWVudF9pZHMsCisJCSAgYnV0IHNpemVvZihlbnVtKSA+IHNpemVvZih1OCkgOi0oICovCisJdTggbGVuOworCXU4IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGl3X21nbXRfZXNzaWRfcHNldCB7CisJc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50IGVsOworCXU4IAkJCSAgICBlc3NpZFtJV19FU1NJRF9NQVhfU0laRV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIEFjY29yZGluZyB0byA4MDIuMTEgV2lyZWxlc3MgTmV0b3dvcnMsIHRoZSBkZWZpbml0aXZlIGd1aWRlIC0gTydSZWlsbHkKKyAqIFBnIDc1CisgKi8gCisjZGVmaW5lIElXX0RBVEFfUkFURV9NQVhfTEFCRUxTIDgKKworc3RydWN0IGl3X21nbXRfZGF0YV9yc2V0IHsKKwlzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgZWw7CisJdTggCQkJICAgIGRhdGFfcmF0ZV9sYWJlbHNbSVdfREFUQV9SQVRFX01BWF9MQUJFTFNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpd19tZ210X2RzX3BzZXQgeworCXN0cnVjdCBpd19tZ210X2luZm9fZWxlbWVudCBlbDsKKwl1OCAJCQkgICAgY2hhbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXdfbWdtdF9jZl9wc2V0IHsKKwlzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgZWw7CisJdTggCQkJICAgIGNmcF9jb3VudDsKKwl1OCAJCQkgICAgY2ZwX3BlcmlvZDsKKwl1MTYgCQkJICAgIGNmcF9tYXhfZHVyYXRpb247CisJdTE2IAkJCSAgICBjZnBfZHVyX3JlbWFpbmluZzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXdfbWdtdF9pYnNzX3BzZXQgeworCXN0cnVjdCBpd19tZ210X2luZm9fZWxlbWVudCBlbDsKKwl1MTYgCQkJICAgIGF0aW1fd2luZG93OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB3bDM1MDFfdHhfaGRyIHsKKwl1MTYJdHhfY250OworCXU4CXN5bmNbMTZdOworCXUxNglzZmQ7CisJdTgJc2lnbmFsOworCXU4CXNlcnZpY2U7CisJdTE2CWxlbjsKKwl1MTYJY3JjMTY7CisJdTE2CWZyYW1lX2N0cmw7CisJdTE2CWR1cmF0aW9uX2lkOworCXU4CWFkZHIxW0VUSF9BTEVOXTsKKwl1OAlhZGRyMltFVEhfQUxFTl07CisJdTgJYWRkcjNbRVRIX0FMRU5dOworCXUxNglzZXFfY3RybDsKKwl1OAlhZGRyNFtFVEhfQUxFTl07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX3J4X2hkciB7CisJdTE2CXJ4X25leHRfYmxrOworCXUxNglyY19uZXh0X2ZyYW1lX2JsazsKKwl1OAlyeF9ibGtfY3RybDsKKwl1OAlyeF9uZXh0X2ZyYW1lOworCXU4CXJ4X25leHRfZnJhbWUxOworCXU4CXJzc2k7CisJY2hhcgl0aW1lWzhdOworCXU4CXNpZ25hbDsKKwl1OAlzZXJ2aWNlOworCXUxNglsZW47CisJdTE2CWNyYzE2OworCXUxNglmcmFtZV9jdHJsOworCXUxNglkdXJhdGlvbjsKKwl1OAlhZGRyMVtFVEhfQUxFTl07CisJdTgJYWRkcjJbRVRIX0FMRU5dOworCXU4CWFkZHIzW0VUSF9BTEVOXTsKKwl1MTYJc2VxOworCXU4CWFkZHI0W0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCB3bDM1MDFfc3RhcnRfcmVxIHsKKwl1MTYJCQkgICAgbmV4dF9ibGs7CisJdTgJCQkgICAgc2lnX2lkOworCXU4CQkJICAgIGJzc190eXBlOworCXUxNgkJCSAgICBiZWFjb25fcGVyaW9kOworCXUxNgkJCSAgICBkdGltX3BlcmlvZDsKKwl1MTYJCQkgICAgcHJvYmVfZGVsYXk7CisJdTE2CQkJICAgIGNhcF9pbmZvOworCXN0cnVjdCBpd19tZ210X2Vzc2lkX3BzZXQgICBzc2lkOworCXN0cnVjdCBpd19tZ210X2RhdGFfcnNldCAgICBic3NfYmFzaWNfcnNldDsKKwlzdHJ1Y3QgaXdfbWdtdF9kYXRhX3JzZXQgICAgb3BlcmF0aW9uYWxfcnNldDsKKwlzdHJ1Y3QgaXdfbWdtdF9jZl9wc2V0CSAgICBjZl9wc2V0OworCXN0cnVjdCBpd19tZ210X2RzX3BzZXQJICAgIGRzX3BzZXQ7CisJc3RydWN0IGl3X21nbXRfaWJzc19wc2V0ICAgIGlic3NfcHNldDsKK307CisKK3N0cnVjdCB3bDM1MDFfYXNzb2NfcmVxIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CXJlc2VydmVkOworCXUxNgl0aW1lb3V0OworCXUxNgljYXBfaW5mbzsKKwl1MTYJbGlzdGVuX2ludGVydmFsOworCXU4CW1hY19hZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCB3bDM1MDFfYXNzb2NfY29uZmlybSB7CisJdTE2CW5leHRfYmxrOworCXU4CXNpZ19pZDsKKwl1OAlyZXNlcnZlZDsKKwl1MTYJc3RhdHVzOworfTsKKworc3RydWN0IHdsMzUwMV9hc3NvY19pbmQgeworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJbWFjX2FkZHJbRVRIX0FMRU5dOworfTsKKworc3RydWN0IHdsMzUwMV9hdXRoX3JlcSB7CisJdTE2CW5leHRfYmxrOworCXU4CXNpZ19pZDsKKwl1OAlyZXNlcnZlZDsKKwl1MTYJdHlwZTsKKwl1MTYJdGltZW91dDsKKwl1OAltYWNfYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2F1dGhfY29uZmlybSB7CisJdTE2CW5leHRfYmxrOworCXU4CXNpZ19pZDsKKwl1OAlyZXNlcnZlZDsKKwl1MTYJdHlwZTsKKwl1MTYJc3RhdHVzOworCXU4CW1hY19hZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCB3bDM1MDFfZ2V0X3JlcSB7CisJdTE2CW5leHRfYmxrOworCXU4CXNpZ19pZDsKKwl1OAlyZXNlcnZlZDsKKwl1MTYJbWliX2F0dHJpYjsKK307CisKK3N0cnVjdCB3bDM1MDFfZ2V0X2NvbmZpcm0geworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CW1pYl9zdGF0dXM7CisJdTE2CW1pYl9hdHRyaWI7CisJdTgJbWliX3ZhbHVlWzEwMF07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2pvaW5fcmVxIHsKKwl1MTYJCQkgICAgbmV4dF9ibGs7CisJdTgJCQkgICAgc2lnX2lkOworCXU4CQkJICAgIHJlc2VydmVkOworCXN0cnVjdCBpd19tZ210X2RhdGFfcnNldCAgICBvcGVyYXRpb25hbF9yc2V0OworCXUxNgkJCSAgICByZXNlcnZlZDI7CisJdTE2CQkJICAgIHRpbWVvdXQ7CisJdTE2CQkJICAgIHByb2JlX2RlbGF5OworCXU4CQkJICAgIHRpbWVzdGFtcFs4XTsKKwl1OAkJCSAgICBsb2NhbF90aW1lWzhdOworCXUxNgkJCSAgICBiZWFjb25fcGVyaW9kOworCXUxNgkJCSAgICBkdGltX3BlcmlvZDsKKwl1MTYJCQkgICAgY2FwX2luZm87CisJdTgJCQkgICAgYnNzX3R5cGU7CisJdTgJCQkgICAgYnNzaWRbRVRIX0FMRU5dOworCXN0cnVjdCBpd19tZ210X2Vzc2lkX3BzZXQgICBzc2lkOworCXN0cnVjdCBpd19tZ210X2RzX3BzZXQJICAgIGRzX3BzZXQ7CisJc3RydWN0IGl3X21nbXRfY2ZfcHNldAkgICAgY2ZfcHNldDsKKwlzdHJ1Y3QgaXdfbWdtdF9pYnNzX3BzZXQgICAgaWJzc19wc2V0OworCXN0cnVjdCBpd19tZ210X2RhdGFfcnNldCAgICBic3NfYmFzaWNfcnNldDsKK307CisKK3N0cnVjdCB3bDM1MDFfam9pbl9jb25maXJtIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CXJlc2VydmVkOworCXUxNglzdGF0dXM7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX3B3cl9tZ210X3JlcSB7CisJdTE2CW5leHRfYmxrOworCXU4CXNpZ19pZDsKKwl1OAlwd3Jfc2F2ZTsKKwl1OAl3YWtlX3VwOworCXU4CXJlY2VpdmVfZHRpbXM7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX3B3cl9tZ210X2NvbmZpcm0geworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CXN0YXR1czsKK307CisKK3N0cnVjdCB3bDM1MDFfc2Nhbl9yZXEgeworCXUxNgkJCSAgICBuZXh0X2JsazsKKwl1OAkJCSAgICBzaWdfaWQ7CisJdTgJCQkgICAgYnNzX3R5cGU7CisJdTE2CQkJICAgIHByb2JlX2RlbGF5OworCXUxNgkJCSAgICBtaW5fY2hhbl90aW1lOworCXUxNgkJCSAgICBtYXhfY2hhbl90aW1lOworCXU4CQkJICAgIGNoYW5fbGlzdFsxNF07CisJdTgJCQkgICAgYnNzaWRbRVRIX0FMRU5dOworCXN0cnVjdCBpd19tZ210X2Vzc2lkX3BzZXQgICBzc2lkOworCWVudW0gd2wzNTAxX3NjYW5fdHlwZQkgICAgc2Nhbl90eXBlOworfTsKKworc3RydWN0IHdsMzUwMV9zY2FuX2NvbmZpcm0geworCXUxNgkJCSAgICBuZXh0X2JsazsKKwl1OAkJCSAgICBzaWdfaWQ7CisJdTgJCQkgICAgcmVzZXJ2ZWQ7CisJdTE2CQkJICAgIHN0YXR1czsKKwljaGFyCQkJICAgIHRpbWVzdGFtcFs4XTsKKwljaGFyCQkJICAgIGxvY2FsdGltZVs4XTsKKwl1MTYJCQkgICAgYmVhY29uX3BlcmlvZDsKKwl1MTYJCQkgICAgZHRpbV9wZXJpb2Q7CisJdTE2CQkJICAgIGNhcF9pbmZvOworCXU4CQkJICAgIGJzc190eXBlOworCXU4CQkJICAgIGJzc2lkW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgaXdfbWdtdF9lc3NpZF9wc2V0ICAgc3NpZDsKKwlzdHJ1Y3QgaXdfbWdtdF9kc19wc2V0CSAgICBkc19wc2V0OworCXN0cnVjdCBpd19tZ210X2NmX3BzZXQJICAgIGNmX3BzZXQ7CisJc3RydWN0IGl3X21nbXRfaWJzc19wc2V0ICAgIGlic3NfcHNldDsKKwlzdHJ1Y3QgaXdfbWdtdF9kYXRhX3JzZXQgICAgYnNzX2Jhc2ljX3JzZXQ7CisJdTgJCQkgICAgcnNzaTsKK307CisKK3N0cnVjdCB3bDM1MDFfc3RhcnRfY29uZmlybSB7CisJdTE2CW5leHRfYmxrOworCXU4CXNpZ19pZDsKKwl1OAlyZXNlcnZlZDsKKwl1MTYJc3RhdHVzOworfTsKKworc3RydWN0IHdsMzUwMV9tZF9yZXEgeworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcm91dGluZzsKKwl1MTYJZGF0YTsKKwl1MTYJc2l6ZTsKKwl1OAlwcmk7CisJdTgJc2VydmljZV9jbGFzczsKKwl1OAlkYWRkcltFVEhfQUxFTl07CisJdTgJc2FkZHJbRVRIX0FMRU5dOworfTsKKworc3RydWN0IHdsMzUwMV9tZF9pbmQgeworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcm91dGluZzsKKwl1MTYJZGF0YTsKKwl1MTYJc2l6ZTsKKwl1OAlyZWNlcHRpb247CisJdTgJcHJpOworCXU4CXNlcnZpY2VfY2xhc3M7CisJdTgJZGFkZHJbRVRIX0FMRU5dOworCXU4CXNhZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCB3bDM1MDFfbWRfY29uZmlybSB7CisJdTE2CW5leHRfYmxrOworCXU4CXNpZ19pZDsKKwl1OAlyZXNlcnZlZDsKKwl1MTYJZGF0YTsKKwl1OAlzdGF0dXM7CisJdTgJcHJpOworCXU4CXNlcnZpY2VfY2xhc3M7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX3Jlc3luY19yZXEgeworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7Cit9OworCisvKiBEZWZpbml0aW9ucyBmb3Igc3VwcG9ydGluZyBjbG9uZSBhZGFwdGVycy4gKi8KKy8qIFN5c3RlbSBJbnRlcmZhY2UgUmVnaXN0ZXJzIChTSVIgc3BhY2UpICovCisjZGVmaW5lIFdMMzUwMV9OSUNfR0NSICgodTgpMHgwMCkJLyogU0lSMCAtIEdlbmVyYWwgQ29uZiBSZWdpc3RlciAqLworI2RlZmluZSBXTDM1MDFfTklDX0JTUyAoKHU4KTB4MDEpCS8qIFNJUjEgLSBCYW5rIFN3aXRjaGluZyBTZWxlY3QgUmVnICovCisjZGVmaW5lIFdMMzUwMV9OSUNfTE1BTCAoKHU4KTB4MDIpCS8qIFNJUjIgLSBMb2NhbCBNZW0gYWRkciBSZWcgWzc6MF0gKi8KKyNkZWZpbmUgV0wzNTAxX05JQ19MTUFIICgodTgpMHgwMykJLyogU0lSMyAtIExvY2FsIE1lbSBhZGRyIFJlZyBbMTQ6OF0gKi8KKyNkZWZpbmUgV0wzNTAxX05JQ19JT0RQQSAoKHU4KTB4MDQpCS8qIFNJUjQgLSBJL08gRGF0YSBQb3J0IEEgKi8KKyNkZWZpbmUgV0wzNTAxX05JQ19JT0RQQiAoKHU4KTB4MDUpCS8qIFNJUjUgLSBJL08gRGF0YSBQb3J0IEIgKi8KKyNkZWZpbmUgV0wzNTAxX05JQ19JT0RQQyAoKHU4KTB4MDYpCS8qIFNJUjYgLSBJL08gRGF0YSBQb3J0IEMgKi8KKyNkZWZpbmUgV0wzNTAxX05JQ19JT0RQRCAoKHU4KTB4MDcpCS8qIFNJUjcgLSBJL08gRGF0YSBQb3J0IEQgKi8KKworLyogQml0cyBpbiBHQ1IgKi8KKyNkZWZpbmUgV0wzNTAxX0dDUl9TV1JFU0VUICgodTgpMHg4MCkKKyNkZWZpbmUgV0wzNTAxX0dDUl9DT1JFU0VUICgodTgpMHg0MCkKKyNkZWZpbmUgV0wzNTAxX0dDUl9ESVNQV0ROICgodTgpMHgyMCkKKyNkZWZpbmUgV0wzNTAxX0dDUl9FQ1dBSVQgICgodTgpMHgxMCkKKyNkZWZpbmUgV0wzNTAxX0dDUl9FQ0lOVCAgICgodTgpMHgwOCkKKyNkZWZpbmUgV0wzNTAxX0dDUl9JTlQyRUMgICgodTgpMHgwNCkKKyNkZWZpbmUgV0wzNTAxX0dDUl9FTkVDSU5UICgodTgpMHgwMikKKyNkZWZpbmUgV0wzNTAxX0dDUl9EQU0gICAgICgodTgpMHgwMSkKKworLyogQml0cyBpbiBCU1MgKEJhbmsgU3dpdGNoaW5nIFNlbGVjdCBSZWdpc3RlcikgKi8KKyNkZWZpbmUgV0wzNTAxX0JTU19GUEFHRTAgKCh1OCkweDIwKQkvKiBGbGFzaCBtZW1vcnkgcGFnZTAgKi8KKyNkZWZpbmUgV0wzNTAxX0JTU19GUEFHRTEgKCh1OCkweDI4KQorI2RlZmluZSBXTDM1MDFfQlNTX0ZQQUdFMiAoKHU4KTB4MzApCisjZGVmaW5lIFdMMzUwMV9CU1NfRlBBR0UzICgodTgpMHgzOCkKKyNkZWZpbmUgV0wzNTAxX0JTU19TUEFHRTAgKCh1OCkweDAwKQkvKiBTUkFNIHBhZ2UwICovCisjZGVmaW5lIFdMMzUwMV9CU1NfU1BBR0UxICgodTgpMHgwOCkKKyNkZWZpbmUgV0wzNTAxX0JTU19TUEFHRTIgKCh1OCkweDEwKQorI2RlZmluZSBXTDM1MDFfQlNTX1NQQUdFMyAoKHU4KTB4MTgpCisKKy8qIERlZmluZSBEcml2ZXIgSW50ZXJmYWNlICovCisvKiBSZWZlciBJRUVFIDgwMi4xMSAqLworLyogVHggcGFja2V0IGhlYWRlciwgaW5jbHVkZSBQTENQIGFuZCBNUERVICovCisvKiBUeCBQTENQIEhlYWRlciAqLworc3RydWN0IHdsMzUwMV84MDIxMV90eF9wbGNwX2hkciB7CisJdTgJc3luY1sxNl07CisJdTE2CXNmZDsKKwl1OAlzaWduYWw7CisJdTgJc2VydmljZTsKKwl1MTYJbGVuOworCXUxNgljcmMxNjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgd2wzNTAxXzgwMjExX3R4X2hkciB7CisJc3RydWN0IHdsMzUwMV84MDIxMV90eF9wbGNwX2hkcglwY2xwX2hkcjsKKwlzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIJCW1hY19oZHI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAgIFJlc2VydmUgdGhlIGJlZ2lubmluZyBUeCBzcGFjZSBmb3IgZGVzY3JpcHRvciB1c2UuCisKKyAgIFR4QmxvY2tPZmZzZXQgLS0+CSotLS0tKi0tLS0qLS0tLSotLS0tKiBcCisJKFR4RnJlZURlc2MpCXwgIDAgfCAgMSB8ICAyIHwgIDMgfCAgXAorCQkJfCAgNCB8ICA1IHwgIDYgfCAgNyB8ICAgfAorCQkJfCAgOCB8ICA5IHwgMTAgfCAxMSB8ICAgVFhfREVTQyAqIDIwCisJCQl8IDEyIHwgMTMgfCAxNCB8IDE1IHwgICB8CisJCQl8IDE2IHwgMTcgfCAxOCB8IDE5IHwgIC8KKyAgIFR4QnVmZmVyQmVnaW4gLS0+CSotLS0tKi0tLS0qLS0tLSotLS0tKiAvCisgICAoVHhCdWZmZXJIZWFkKQl8IAkJICAgIHwKKyAgIChUeEJ1ZmZlclRhaWwpCXwgCQkgICAgfAorCQkJfCAgICBTZW5kIEJ1ZmZlciAgICB8CisJCQl8IAkJICAgIHwKKwkJCXwJCSAgICB8CisJCQkqLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgIFR4QnVmZmVyRW5kICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vCisKKyovCisKK3N0cnVjdCB3bDM1MDFfY2FyZCB7CisJaW50CQkJCWJhc2VfYWRkcjsKKwl1OAkJCQltYWNfYWRkcltFVEhfQUxFTl07CisJc3BpbmxvY2tfdAkJCWxvY2s7CisJd2FpdF9xdWV1ZV9oZWFkX3QJCXdhaXQ7CisJc3RydWN0IHdsMzUwMV9nZXRfY29uZmlybQlzaWdfZ2V0X2NvbmZpcm07CisJc3RydWN0IHdsMzUwMV9wd3JfbWdtdF9jb25maXJtCXNpZ19wd3JfbWdtdF9jb25maXJtOworCXUxNgkJCQl0eF9idWZmZXJfc2l6ZTsKKwl1MTYJCQkJdHhfYnVmZmVyX2hlYWQ7CisJdTE2CQkJCXR4X2J1ZmZlcl90YWlsOworCXUxNgkJCQl0eF9idWZmZXJfY250OworCXUxNgkJCQllc2JxX3JlcV9zdGFydDsKKwl1MTYJCQkJZXNicV9yZXFfZW5kOworCXUxNgkJCQllc2JxX3JlcV9oZWFkOworCXUxNgkJCQllc2JxX3JlcV90YWlsOworCXUxNgkJCQllc2JxX2NvbmZpcm1fc3RhcnQ7CisJdTE2CQkJCWVzYnFfY29uZmlybV9lbmQ7CisJdTE2CQkJCWVzYnFfY29uZmlybTsKKwlzdHJ1Y3QgaXdfbWdtdF9lc3NpZF9wc2V0ICAJZXNzaWQ7CisJc3RydWN0IGl3X21nbXRfZXNzaWRfcHNldCAgCWtlZXBfZXNzaWQ7CisJdTgJCQkJYnNzaWRbRVRIX0FMRU5dOworCWludAkJCQluZXRfdHlwZTsKKwljaGFyCQkJCW5pY2tbMzJdOworCWNoYXIJCQkJY2FyZF9uYW1lWzMyXTsKKwljaGFyCQkJCWZpcm13YXJlX2RhdGVbMzJdOworCXU4CQkJCWNoYW47CisJdTgJCQkJY2FwX2luZm87CisJdTE2CQkJCXN0YXJ0X3NlZzsKKwl1MTYJCQkJYnNzX2NudDsKKwl1MTYJCQkJam9pbl9zdGFfYnNzOworCXU4CQkJCXJzc2k7CisJdTgJCQkJYWRob2NfdGltZXM7CisJdTgJCQkJcmVnX2RvbWFpbjsKKwl1OAkJCQl2ZXJzaW9uWzJdOworCXN0cnVjdCB3bDM1MDFfc2Nhbl9jb25maXJtCWJzc19zZXRbMjBdOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIAlzdGF0czsKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcwkJd3N0YXRzOworCXN0cnVjdCBpd19zcHlfZGF0YQkJc3B5X2RhdGE7CisJc3RydWN0IGRldl9ub2RlX3QJCW5vZGU7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MzNlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYwpAQCAtMCwwICsxLDIyNzAgQEAKKy8qCisgKiBXTDM1MDEgV2lyZWxlc3MgTEFOIFBDTUNJQSBDYXJkIERyaXZlciBmb3IgTGludXgKKyAqIFdyaXR0ZW4gb3JpZ2luYWxseSBmb3IgTGludXggMi4wLjMwIGJ5IEZveCBDaGVuLCBtaGNoZW5AZ29sZi5jY2wuaXRyaS5vcmcudHcKKyAqIFBvcnRlZCB0byAyLjIsIDIuNCAmIDIuNSBieSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqIFdpcmVsZXNzIGV4dGVuc2lvbnMgaW4gMi40IGJ5IEd1c3Rhdm8gTmllbWV5ZXIgPG5pZW1leWVyQGNvbmVjdGl2YS5jb20+CisgKgorICogUmVmZXJlbmNlcyB1c2VkIGJ5IEZveCBDaGVuIHdoaWxlIHdyaXRpbmcgdGhlIG9yaWdpbmFsIGRyaXZlciBmb3IgMi4wLjMwOgorICoKKyAqICAgMS4gV0wyNHh4IHBhY2tldCBkcml2ZXJzICh0b29hc20uYXNtKQorICogICAyLiBBY2Nlc3MgUG9pbnQgRmlybXdhcmUgSW50ZXJmYWNlIFNwZWNpZmljYXRpb24gZm9yIElFRUUgODAyLjExIFNVVFJPCisgKiAgIDMuIElFRUUgODAyLjExCisgKiAgIDQuIExpbnV4IG5ldHdvcmsgZHJpdmVyICgvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldCkKKyAqICAgNS4gSVNBIGNhcmQgZHJpdmVyIC0gd2wyNC5jCisgKiAgIDYuIExpbnV4IFBDTUNJQSBza2VsZXRvbiBkcml2ZXIgLSBza2VsZXRvbi5jCisgKiAgIDcuIExpbnV4IFBDTUNJQSAzYzU4OSBuZXR3b3JrIGRyaXZlciAtIDNjNTg5X2NzLmMKKyAqCisgKiBUZXN0ZWQgd2l0aCBXTDI0MDAgZmlybXdhcmUgMS4yLCBMaW51eCAyLjAuMzAsIGFuZCBwY21jaWEtY3MtMi45LjEyCisgKiAgIDEuIFBlcmZvcm1hbmNlOiBhYm91dCAxNjUgS2J5dGVzL3NlYyBpbiBUQ1AvSVAgd2l0aCBBZC1Ib2MgbW9kZS4KKyAqICAgICAgcnNoIDE5Mi4xNjguMS4zICJkZCBpZj0vZGV2L3plcm8gYnM9MWsgY291bnQ9MTAwMCIgPiAvZGV2L251bGwKKyAqICAgICAgKFNwZWNpZmljYXRpb24gMk0gYml0cy9zZWMuIGlzIGFib3V0IDI1MCBLYnl0ZXMvc2VjLiwgYnV0IHdlIG11c3QgZGVkdWN0CisgKiAgICAgICBFVEhFUi9JUC9VRFAvVENQIGhlYWRlciwgYW5kIGFja25vd2xlZGdlbWVudCBvdmVyaGVhZCkKKyAqCisgKiBUZXN0ZWQgd2l0aCBQbGFuZXQgQVAgaW4gMi40LjE3LCAxODQgS2J5dGVzL3MgaW4gVURQIGluIEluZnJhc3RydWN0dXJlIG1vZGUsCisgKiAxNzMgS2J5dGVzL3MgaW4gVENQLgorICoKKyAqIFRlc3RlZCB3aXRoIFBsYW5ldCBBUCBpbiAyLjUuNzMtYmssIDIxNiBLYnl0ZXMvcyBpbiBJbmZyYXN0cnVjdHVyZSBtb2RlCisgKiB3aXRoIGEgU01QIG1hY2hpbmUgKGR1YWwgcGVudGl1bSAxMDApLCB1c2luZyBwa3RnZW4sIDQzMiBwcHMgKHBrdF9zaXplID0gNjApCisgKi8KKyN1bmRlZiBSRUFMTFlfU0xPV19JTwkvKiBtb3N0IHN5c3RlbXMgY2FuIHNhZmVseSB1bmRlZiB0aGlzICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIndsMzUwMS5oIgorCisjaWZuZGVmIF9faTM4Nl9fCisjZGVmaW5lIHNsb3dfZG93bl9pbygpCisjZW5kaWYKKworLyogRm9yIHJvdWdoIGNvbnN0YW50IGRlbGF5ICovCisjZGVmaW5lIFdMMzUwMV9OT1BMT09QKG4pIHsgaW50IHggPSAwOyB3aGlsZSAoeCsrIDwgbikgc2xvd19kb3duX2lvKCk7IH0KKworLyoKKyAqIEFsbCB0aGUgUENNQ0lBIG1vZHVsZXMgdXNlIFBDTUNJQV9ERUJVRyB0byBjb250cm9sIGRlYnVnZ2luZy4gIElmIHlvdSBkbyBub3QKKyAqIGRlZmluZSBQQ01DSUFfREVCVUcgYXQgYWxsLCBhbGwgdGhlIGRlYnVnIGNvZGUgd2lsbCBiZSBsZWZ0IG91dC4gIElmIHlvdQorICogY29tcGlsZSB3aXRoIFBDTUNJQV9ERUJVRz0wLCB0aGUgZGVidWcgY29kZSB3aWxsIGJlIHByZXNlbnQgYnV0IGRpc2FibGVkIC0tCisgKiBidXQgaXQgY2FuIHRoZW4gYmUgZW5hYmxlZCBmb3Igc3BlY2lmaWMgbW9kdWxlcyBhdCBsb2FkIHRpbWUgd2l0aCBhCisgKiAncGNfZGVidWc9Iycgb3B0aW9uIHRvIGluc21vZC4KKyAqLworI2RlZmluZSBQQ01DSUFfREVCVUcgMAorI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIGludCBwY19kZWJ1ZyA9IFBDTUNJQV9ERUJVRzsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwKTsKKyNkZWZpbmUgZHByaW50ayhuLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKwl7IGlmIChwY19kZWJ1ZyA+IChuKSkgXAorCQlwcmludGsoS0VSTl9JTkZPICIlczogIiBmb3JtYXQgIlxuIiwgX19GVU5DVElPTl9fICwgIyNhcmdzKTsgfQorI2Vsc2UKKyNkZWZpbmUgZHByaW50ayhuLCBmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSB3bDM1MDFfb3V0YihhLCBiKSB7IG91dGIoYSwgYik7IHNsb3dfZG93bl9pbygpOyB9CisjZGVmaW5lIHdsMzUwMV9vdXRiX3AoYSwgYikgeyBvdXRiX3AoYSwgYik7IHNsb3dfZG93bl9pbygpOyB9CisjZGVmaW5lIHdsMzUwMV9vdXRzYihhLCBiLCBjKSB7IG91dHNiKGEsIGIsIGMpOyBzbG93X2Rvd25faW8oKTsgfQorCisjZGVmaW5lIFdMMzUwMV9SRUxFQVNFX1RJTUVPVVQgKDI1ICogSFopCisjZGVmaW5lIFdMMzUwMV9NQVhfQURIT0NfVFJJRVMgMTYKKworI2RlZmluZSBXTDM1MDFfUkVTVU1FCTAKKyNkZWZpbmUgV0wzNTAxX1NVU1BFTkQJMQorCisvKgorICogVGhlIGV2ZW50KCkgZnVuY3Rpb24gaXMgdGhpcyBkcml2ZXIncyBDYXJkIFNlcnZpY2VzIGV2ZW50IGhhbmRsZXIuICBJdCB3aWxsCisgKiBiZSBjYWxsZWQgYnkgQ2FyZCBTZXJ2aWNlcyB3aGVuIGFuIGFwcHJvcHJpYXRlIGNhcmQgc3RhdHVzIGV2ZW50IGlzCisgKiByZWNlaXZlZC4gVGhlIGNvbmZpZygpIGFuZCByZWxlYXNlKCkgZW50cnkgcG9pbnRzIGFyZSB1c2VkIHRvIGNvbmZpZ3VyZSBvcgorICogcmVsZWFzZSBhIHNvY2tldCwgaW4gcmVzcG9uc2UgdG8gY2FyZCBpbnNlcnRpb24gYW5kIGVqZWN0aW9uIGV2ZW50cy4gIFRoZXkKKyAqIGFyZSBpbnZva2VkIGZyb20gdGhlIHdsMjQgZXZlbnQgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgd2wzNTAxX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkIHdsMzUwMV9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCB3bDM1MDFfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaSwgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKKworLyoKKyAqIFRoZSBkZXZfaW5mbyB2YXJpYWJsZSBpcyB0aGUgImtleSIgdGhhdCBpcyB1c2VkIHRvIG1hdGNoIHVwIHRoaXMKKyAqIGRldmljZSBkcml2ZXIgd2l0aCBhcHByb3ByaWF0ZSBjYXJkcywgdGhyb3VnaCB0aGUgY2FyZCBjb25maWd1cmF0aW9uCisgKiBkYXRhYmFzZS4KKyAqLworc3RhdGljIGRldl9pbmZvX3Qgd2wzNTAxX2Rldl9pbmZvID0gIndsMzUwMV9jcyI7CisKK3N0YXRpYyBpbnQgd2wzNTAxX2NoYW4yZnJlcVtdID0geworCVswXSAgPSAyNDEyLCBbMV0gID0gMjQxNywgWzJdICA9IDI0MjIsIFszXSAgPSAyNDI3LCBbNF0gPSAyNDMyLAorCVs1XSAgPSAyNDM3LCBbNl0gID0gMjQ0MiwgWzddICA9IDI0NDcsIFs4XSAgPSAyNDUyLCBbOV0gPSAyNDU3LAorCVsxMF0gPSAyNDYyLCBbMTFdID0gMjQ2NywgWzEyXSA9IDI0NzIsIFsxM10gPSAyNDc3LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJaW50IHJlZ19kb21haW47CisJaW50IG1pbiwgbWF4LCBkZWZsdDsKK30gaXdfY2hhbm5lbF90YWJsZVtdID0geworCXsKKwkJLnJlZ19kb21haW4gPSBJV19SRUdfRE9NQUlOX0ZDQywKKwkJLm1pbgkgICAgPSAxLAorCQkubWF4CSAgICA9IDExLAorCQkuZGVmbHQJICAgID0gMSwKKwl9LAorCXsKKwkJLnJlZ19kb21haW4gPSBJV19SRUdfRE9NQUlOX0RPQywKKwkJLm1pbgkgICAgPSAxLAorCQkubWF4CSAgICA9IDExLAorCQkuZGVmbHQJICAgID0gMSwKKwl9LAorCXsKKwkJLnJlZ19kb21haW4gPSBJV19SRUdfRE9NQUlOX0VUU0ksCisJCS5taW4JICAgID0gMSwKKwkJLm1heAkgICAgPSAxMywKKwkJLmRlZmx0CSAgICA9IDEsCisJfSwKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9TUEFJTiwKKwkJLm1pbgkgICAgPSAxMCwKKwkJLm1heAkgICAgPSAxMSwKKwkJLmRlZmx0CSAgICA9IDEwLAorCX0sCisJeworCQkucmVnX2RvbWFpbiA9IElXX1JFR19ET01BSU5fRlJBTkNFLAorCQkubWluCSAgICA9IDEwLAorCQkubWF4CSAgICA9IDEzLAorCQkuZGVmbHQJICAgID0gMTAsCisJfSwKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9NS0ssCisJCS5taW4JICAgID0gMTQsCisJCS5tYXgJICAgID0gMTQsCisJCS5kZWZsdAkgICAgPSAxNCwKKwl9LAorCXsKKwkJLnJlZ19kb21haW4gPSBJV19SRUdfRE9NQUlOX01LSzEsCisJCS5taW4JICAgID0gMSwKKwkJLm1heAkgICAgPSAxNCwKKwkJLmRlZmx0CSAgICA9IDEsCisJfSwKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9JU1JBRUwsCisJCS5taW4JICAgID0gMywKKwkJLm1heAkgICAgPSA5LAorCQkuZGVmbHQJICAgID0gOSwKKwl9LAorfTsKKworLyoqCisgKiBpd192YWxpZF9jaGFubmVsIC0gdmFsaWRhdGUgY2hhbm5lbCBpbiByZWd1bGF0b3J5IGRvbWFpbgorICogQHJlZ19jb21haW4gLSByZWd1bGF0b3J5IGRvbWFpbgorICogQGNoYW5uZWwgLSBjaGFubmVsIHRvIHZhbGlkYXRlCisgKgorICogUmV0dXJucyAwIGlmIGludmFsaWQgaW4gdGhlIHNwZWNpZmllZCByZWd1bGF0b3J5IGRvbWFpbiwgbm9uLXplcm8gaWYgdmFsaWQuCisgKi8KK3N0YXRpYyBpbnQgaXdfdmFsaWRfY2hhbm5lbChpbnQgcmVnX2RvbWFpbiwgaW50IGNoYW5uZWwpCit7CisJaW50IGksIHJjID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGl3X2NoYW5uZWxfdGFibGUpOyBpKyspCisJCWlmIChyZWdfZG9tYWluID09IGl3X2NoYW5uZWxfdGFibGVbaV0ucmVnX2RvbWFpbikgeworCQkJcmMgPSBjaGFubmVsID49IGl3X2NoYW5uZWxfdGFibGVbaV0ubWluICYmCisJCQkgICAgIGNoYW5uZWwgPD0gaXdfY2hhbm5lbF90YWJsZVtpXS5tYXg7CisJCQlicmVhazsKKwkJfQorCXJldHVybiByYzsKK30KKworLyoqCisgKiBpd19kZWZhdWx0X2NoYW5uZWwgLSBnZXQgZGVmYXVsdCBjaGFubmVsIGZvciBhIHJlZ3VsYXRvcnkgZG9tYWluCisgKiBAcmVnX2NvbWFpbiAtIHJlZ3VsYXRvcnkgZG9tYWluCisgKgorICogUmV0dXJucyB0aGUgZGVmYXVsdCBjaGFubmVsIGZvciBhIHJlZ3VsYXRvcnkgZG9tYWluCisgKi8KK3N0YXRpYyBpbnQgaXdfZGVmYXVsdF9jaGFubmVsKGludCByZWdfZG9tYWluKQoreworCWludCBpLCByYyA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpd19jaGFubmVsX3RhYmxlKTsgaSsrKQorCQlpZiAocmVnX2RvbWFpbiA9PSBpd19jaGFubmVsX3RhYmxlW2ldLnJlZ19kb21haW4pIHsKKwkJCXJjID0gaXdfY2hhbm5lbF90YWJsZVtpXS5kZWZsdDsKKwkJCWJyZWFrOworCQl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBpd19zZXRfbWdtdF9pbmZvX2VsZW1lbnQoZW51bSBpd19tZ210X2luZm9fZWxlbWVudF9pZHMgaWQsCisJCQkJICAgICBzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgKmVsLAorCQkJCSAgICAgdm9pZCAqdmFsdWUsIGludCBsZW4pCit7CisJZWwtPmlkICA9IGlkOworCWVsLT5sZW4gPSBsZW47CisJbWVtY3B5KGVsLT5kYXRhLCB2YWx1ZSwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgaXdfY29weV9tZ210X2luZm9fZWxlbWVudChzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgKnRvLAorCQkJCSAgICAgIHN0cnVjdCBpd19tZ210X2luZm9fZWxlbWVudCAqZnJvbSkKK3sKKwlpd19zZXRfbWdtdF9pbmZvX2VsZW1lbnQoZnJvbS0+aWQsIHRvLCBmcm9tLT5kYXRhLCBmcm9tLT5sZW4pOworfQorCisvKgorICogQSBsaW5rZWQgbGlzdCBvZiAiaW5zdGFuY2VzIiBvZiB0aGUgd2wyNCBkZXZpY2UuICBFYWNoIGFjdHVhbCBQQ01DSUEgY2FyZAorICogY29ycmVzcG9uZHMgdG8gb25lIGRldmljZSBpbnN0YW5jZSwgYW5kIGlzIGRlc2NyaWJlZCBieSBvbmUgZGV2X2xpbmtfdAorICogc3RydWN0dXJlIChkZWZpbmVkIGluIGRzLmgpLgorICoKKyAqIFlvdSBtYXkgbm90IHdhbnQgdG8gdXNlIGEgbGlua2VkIGxpc3QgZm9yIHRoaXMgLS0gZm9yIGV4YW1wbGUsIHRoZSBtZW1vcnkKKyAqIGNhcmQgZHJpdmVyIHVzZXMgYW4gYXJyYXkgb2YgZGV2X2xpbmtfdCBwb2ludGVycywgd2hlcmUgbWlub3IgZGV2aWNlIG51bWJlcnMKKyAqIGFyZSB1c2VkIHRvIGRlcml2ZSB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBpbmRleC4KKyAqLworc3RhdGljIGRldl9saW5rX3QgKndsMzUwMV9kZXZfbGlzdDsKKworc3RhdGljIGlubGluZSB2b2lkIHdsMzUwMV9zd2l0Y2hfcGFnZShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHU4IHBhZ2UpCit7CisJd2wzNTAxX291dGIocGFnZSwgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19CU1MpOworfQorCisvKgorICogR2V0IEV0aGVybmV0IE1BQyBhZGRyZXNzcy4KKyAqCisgKiBXQVJOSU5HOiBXZSBzd2l0Y2ggdG8gRlBBR0UwIGFuZCBzd2l0YyBiYWNrIGFnYWluLgorICogICAgICAgICAgTWFraW5nIHN1cmUgdGhlcmUgaXMgbm8gb3RoZXIgV0wgZnVuY3Rpb24gYmVlbmluZyBjYWxsZWQgYnkgSVNSLgorICovCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfZmxhc2hfbWFjX2FkZHIoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCWludCBiYXNlX2FkZHIgPSB0aGlzLT5iYXNlX2FkZHI7CisKKwkvKiBnZXQgTUFDIGFkZHIgKi8KKwl3bDM1MDFfb3V0YihXTDM1MDFfQlNTX0ZQQUdFMywgYmFzZV9hZGRyICsgV0wzNTAxX05JQ19CU1MpOyAvKiBCU1MgKi8KKwl3bDM1MDFfb3V0YigweDAwLCBiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0xNQUwpOwkvKiBMTUFMICovCisJd2wzNTAxX291dGIoMHg0MCwgYmFzZV9hZGRyICsgV0wzNTAxX05JQ19MTUFIKTsJLyogTE1BSCAqLworCisJLyogd2FpdCBmb3IgcmVhZGluZyBFRVBST00gKi8KKwlXTDM1MDFfTk9QTE9PUCgxMDApOworCXRoaXMtPm1hY19hZGRyWzBdID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCVdMMzUwMV9OT1BMT09QKDEwMCk7CisJdGhpcy0+bWFjX2FkZHJbMV0gPSBpbmIoYmFzZV9hZGRyICsgV0wzNTAxX05JQ19JT0RQQSk7CisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT5tYWNfYWRkclsyXSA9IGluYihiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0lPRFBBKTsKKwlXTDM1MDFfTk9QTE9PUCgxMDApOworCXRoaXMtPm1hY19hZGRyWzNdID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCVdMMzUwMV9OT1BMT09QKDEwMCk7CisJdGhpcy0+bWFjX2FkZHJbNF0gPSBpbmIoYmFzZV9hZGRyICsgV0wzNTAxX05JQ19JT0RQQSk7CisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT5tYWNfYWRkcls1XSA9IGluYihiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0lPRFBBKTsKKwlXTDM1MDFfTk9QTE9PUCgxMDApOworCXRoaXMtPnJlZ19kb21haW4gPSBpbmIoYmFzZV9hZGRyICsgV0wzNTAxX05JQ19JT0RQQSk7CisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl3bDM1MDFfb3V0YihXTDM1MDFfQlNTX0ZQQUdFMCwgYmFzZV9hZGRyICsgV0wzNTAxX05JQ19CU1MpOworCXdsMzUwMV9vdXRiKDB4MDQsIGJhc2VfYWRkciArIFdMMzUwMV9OSUNfTE1BTCk7CisJd2wzNTAxX291dGIoMHg0MCwgYmFzZV9hZGRyICsgV0wzNTAxX05JQ19MTUFIKTsKKwlXTDM1MDFfTk9QTE9PUCgxMDApOworCXRoaXMtPnZlcnNpb25bMF0gPSBpbmIoYmFzZV9hZGRyICsgV0wzNTAxX05JQ19JT0RQQSk7CisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT52ZXJzaW9uWzFdID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCS8qIHN3aXRjaCB0byBTUkFNIFBhZ2UgMCAoZm9yIHNhZmV0eSkgKi8KKwl3bDM1MDFfc3dpdGNoX3BhZ2UodGhpcywgV0wzNTAxX0JTU19TUEFHRTApOworCisJLyogVGhlIE1BQyBhZGRyIHNob3VsZCBiZSAwMDo2MDouLi4gKi8KKwlyZXR1cm4gdGhpcy0+bWFjX2FkZHJbMF0gPT0gMHgwMCAmJiB0aGlzLT5tYWNfYWRkclsxXSA9PSAweDYwOworfQorCisvKioKKyAqIHdsMzUwMV9zZXRfdG9fd2xhIC0gTW92ZSAnc2l6ZScgYnl0ZXMgZnJvbSBQQyB0byBjYXJkCisgKiBAZGVzdDogQ2FyZCBhZGRyZXNzaW5nIHNwYWNlCisgKiBAc3JjOiBQQyBhZGRyZXNzaW5nIHNwYWNlCisgKiBAc2l6ZTogQnl0ZXMgdG8gbW92ZQorICoKKyAqIE1vdmUgJ3NpemUnIGJ5dGVzIGZyb20gUEMgdG8gY2FyZC4gKFNob3VsZG4ndCBiZSBpbnRlcnJ1cHRlZCkKKyAqLwordm9pZCB3bDM1MDFfc2V0X3RvX3dsYShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHUxNiBkZXN0LCB2b2lkICpzcmMsIGludCBzaXplKQoreworCS8qIHN3aXRjaCB0byBTUkFNIFBhZ2UgMCAqLworCXdsMzUwMV9zd2l0Y2hfcGFnZSh0aGlzLCAoZGVzdCAmIDB4ODAwMCkgPyBXTDM1MDFfQlNTX1NQQUdFMSA6CisJCQkJCQkgICBXTDM1MDFfQlNTX1NQQUdFMCk7CisJLyogc2V0IExNQUwgYW5kIExNQUggKi8KKwl3bDM1MDFfb3V0YihkZXN0ICYgMHhmZiwgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19MTUFMKTsKKwl3bDM1MDFfb3V0YigoKGRlc3QgPj4gOCkgJiAweDdmKSwgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19MTUFIKTsKKworCS8qIHJlcCBvdXQgdG8gUG9ydCBBICovCisJd2wzNTAxX291dHNiKHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEsIHNyYywgc2l6ZSk7Cit9CisKKy8qKgorICogd2wzNTAxX2dldF9mcm9tX3dsYSAtIE1vdmUgJ3NpemUnIGJ5dGVzIGZyb20gY2FyZCB0byBQQworICogQHNyYzogQ2FyZCBhZGRyZXNzaW5nIHNwYWNlCisgKiBAZGVzdDogUEMgYWRkcmVzc2luZyBzcGFjZQorICogQHNpemU6IEJ5dGVzIHRvIG1vdmUKKyAqCisgKiBNb3ZlICdzaXplJyBieXRlcyBmcm9tIGNhcmQgdG8gUEMuIChTaG91bGRuJ3QgYmUgaW50ZXJydXB0ZWQpCisgKi8KK3ZvaWQgd2wzNTAxX2dldF9mcm9tX3dsYShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHUxNiBzcmMsIHZvaWQgKmRlc3QsCisJCQkgaW50IHNpemUpCit7CisJLyogc3dpdGNoIHRvIFNSQU0gUGFnZSAwICovCisJd2wzNTAxX3N3aXRjaF9wYWdlKHRoaXMsIChzcmMgJiAweDgwMDApID8gV0wzNTAxX0JTU19TUEFHRTEgOgorCQkJCQkJICBXTDM1MDFfQlNTX1NQQUdFMCk7CisJLyogc2V0IExNQUwgYW5kIExNQUggKi8KKwl3bDM1MDFfb3V0YihzcmMgJiAweGZmLCB0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0xNQUwpOworCXdsMzUwMV9vdXRiKChzcmMgPj4gOCkgJiAweDdmLCB0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0xNQUgpOworCisJLyogcmVwIGdldCBmcm9tIFBvcnQgQSAqLworCWluc2IodGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19JT0RQQSwgZGVzdCwgc2l6ZSk7Cit9CisKKy8qCisgKiBHZXQvQWxsb2NhdGUgYSBmcmVlIFR4IERhdGEgQnVmZmVyCisgKgorICogICotLS0tLS0tLS0tLS0tLSotLS0tLS0tLS0tLS0tLS0tLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogIHwgICAgUExDUCAgICAgIHwgICAgTUFDIEhlYWRlciAgIHwgIERTVCAgU1JDICAgICAgICAgRGF0YSAuLi4gICAgICAgfAorICogIHwgICgyNCBieXRlcykgIHwgICAgKDMwIGJ5dGVzKSAgIHwgICg2KSAgKDYpICAoRXRoZXJuZXQgUm93IERhdGEpICAgfAorICogICotLS0tLS0tLS0tLS0tLSotLS0tLS0tLS0tLS0tLS0tLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogIFwgICAgICAgICAgICAgICBcLSBJRUVFIDgwMi4xMSAtLyBcLS0tLS0tLS0tLS0tLS0gbGVuIC0tLS0tLS0tLS0tLS0tLworICogICBcLXN0cnVjdCB3bDM1MDFfODAyMTFfdHhfaGRyLS0vICAgXC0tLS0tLS0tIEV0aGVybmV0IEZyYW1lIC0tLS0tLS0vCisgKgorICogUmV0dXJuID0gUG9zdGlvbiBpbiBDYXJkCisgKi8KK3N0YXRpYyB1MTYgd2wzNTAxX2dldF90eF9idWZmZXIoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgbGVuKQoreworCXUxNiBuZXh0LCBibGtfY250ID0gMCwgemVybyA9IDA7CisJdTE2IGZ1bGxfbGVuID0gc2l6ZW9mKHN0cnVjdCB3bDM1MDFfODAyMTFfdHhfaGRyKSArIGxlbjsKKwl1MTYgcmV0ID0gMDsKKworCWlmIChmdWxsX2xlbiA+IHRoaXMtPnR4X2J1ZmZlcl9jbnQgKiAyNTQpCisJCWdvdG8gb3V0OworCXJldCA9IHRoaXMtPnR4X2J1ZmZlcl9oZWFkOworCXdoaWxlIChmdWxsX2xlbikgeworCQlpZiAoZnVsbF9sZW4gPCAyNTQpCisJCQlmdWxsX2xlbiA9IDA7CisJCWVsc2UKKwkJCWZ1bGxfbGVuIC09IDI1NDsKKwkJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCB0aGlzLT50eF9idWZmZXJfaGVhZCwgJm5leHQsCisJCQkJICAgIHNpemVvZihuZXh0KSk7CisJCWlmICghZnVsbF9sZW4pCisJCQl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCB0aGlzLT50eF9idWZmZXJfaGVhZCwgJnplcm8sCisJCQkJCSAgc2l6ZW9mKHplcm8pKTsKKwkJdGhpcy0+dHhfYnVmZmVyX2hlYWQgPSBuZXh0OworCQlibGtfY250Kys7CisJCS8qIGlmIGJ1ZmZlciBpcyBub3QgZW5vdWdoICovCisJCWlmICghbmV4dCAmJiBmdWxsX2xlbikgeworCQkJdGhpcy0+dHhfYnVmZmVyX2hlYWQgPSByZXQ7CisJCQlyZXQgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJdGhpcy0+dHhfYnVmZmVyX2NudCAtPSBibGtfY250Oworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGcmVlIGFuIGFsbG9jYXRlZCBUeCBCdWZmZXIuIHB0ciBtdXN0IGJlIGNvcnJlY3QgcG9zaXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIHdsMzUwMV9mcmVlX3R4X2J1ZmZlcihzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHUxNiBwdHIpCit7CisJLyogY2hlY2sgaWYgYWxsIHNwYWNlIGlzIG5vdCBmcmVlICovCisJaWYgKCF0aGlzLT50eF9idWZmZXJfaGVhZCkKKwkJdGhpcy0+dHhfYnVmZmVyX2hlYWQgPSBwdHI7CisJZWxzZQorCQl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCB0aGlzLT50eF9idWZmZXJfdGFpbCwKKwkJCQkgICZwdHIsIHNpemVvZihwdHIpKTsKKwl3aGlsZSAocHRyKSB7CisJCXUxNiBuZXh0OworCisJCXRoaXMtPnR4X2J1ZmZlcl9jbnQrKzsKKwkJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBwdHIsICZuZXh0LCBzaXplb2YobmV4dCkpOworCQl0aGlzLT50eF9idWZmZXJfdGFpbCA9IHB0cjsKKwkJcHRyID0gbmV4dDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2VzYnFfcmVxX3Rlc3Qoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXU4IHRtcDsKKworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgdGhpcy0+ZXNicV9yZXFfaGVhZCArIDMsICZ0bXAsIHNpemVvZih0bXApKTsKKwlyZXR1cm4gdG1wICYgMHg4MDsKK30KKworc3RhdGljIHZvaWQgd2wzNTAxX2VzYnFfcmVxKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgdTE2ICpwdHIpCit7CisJdTE2IHRtcCA9IDA7CisKKwl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCB0aGlzLT5lc2JxX3JlcV9oZWFkLCBwdHIsIDIpOworCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHRoaXMtPmVzYnFfcmVxX2hlYWQgKyAyLCAmdG1wLCBzaXplb2YodG1wKSk7CisJdGhpcy0+ZXNicV9yZXFfaGVhZCArPSA0OworCWlmICh0aGlzLT5lc2JxX3JlcV9oZWFkID49IHRoaXMtPmVzYnFfcmVxX2VuZCkKKwkJdGhpcy0+ZXNicV9yZXFfaGVhZCA9IHRoaXMtPmVzYnFfcmVxX3N0YXJ0OworfQorCitzdGF0aWMgaW50IHdsMzUwMV9lc2JxX2V4ZWMoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB2b2lkICpzaWcsIGludCBzaWdfc2l6ZSkKK3sKKwlpbnQgcmMgPSAtRUlPOworCisJaWYgKHdsMzUwMV9lc2JxX3JlcV90ZXN0KHRoaXMpKSB7CisJCXUxNiBwdHIgPSB3bDM1MDFfZ2V0X3R4X2J1ZmZlcih0aGlzLCBzaWdfc2l6ZSk7CisJCWlmIChwdHIpIHsKKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHB0ciwgc2lnLCBzaWdfc2l6ZSk7CisJCQl3bDM1MDFfZXNicV9yZXEodGhpcywgJnB0cik7CisJCQlyYyA9IDA7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfbWliX3ZhbHVlKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgdTggaW5kZXgsCisJCQkJdm9pZCAqYmYsIGludCBzaXplKQoreworCXN0cnVjdCB3bDM1MDFfZ2V0X3JlcSBzaWcgPSB7CisJCS5zaWdfaWQJICAgID0gV0wzNTAxX1NJR19HRVRfUkVRLAorCQkubWliX2F0dHJpYiA9IGluZGV4LAorCX07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAtRUlPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlpZiAod2wzNTAxX2VzYnFfcmVxX3Rlc3QodGhpcykpIHsKKwkJdTE2IHB0ciA9IHdsMzUwMV9nZXRfdHhfYnVmZmVyKHRoaXMsIHNpemVvZihzaWcpKTsKKwkJaWYgKHB0cikgeworCQkJd2wzNTAxX3NldF90b193bGEodGhpcywgcHRyLCAmc2lnLCBzaXplb2Yoc2lnKSk7CisJCQl3bDM1MDFfZXNicV9yZXEodGhpcywgJnB0cik7CisJCQl0aGlzLT5zaWdfZ2V0X2NvbmZpcm0ubWliX3N0YXR1cyA9IDI1NTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHRoaXMtPndhaXQsCisJCQkJdGhpcy0+c2lnX2dldF9jb25maXJtLm1pYl9zdGF0dXMgIT0gMjU1KTsKKwkJCWlmICghcmMpCisJCQkJbWVtY3B5KGJmLCB0aGlzLT5zaWdfZ2V0X2NvbmZpcm0ubWliX3ZhbHVlLAorCQkJCSAgICAgICBzaXplKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX3B3cl9tZ210KHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgaW50IHN1c3BlbmQpCit7CisJc3RydWN0IHdsMzUwMV9wd3JfbWdtdF9yZXEgc2lnID0geworCQkuc2lnX2lkCQk9IFdMMzUwMV9TSUdfUFdSX01HTVRfUkVRLAorCQkucHdyX3NhdmUJPSBzdXNwZW5kLAorCQkud2FrZV91cAk9ICFzdXNwZW5kLAorCQkucmVjZWl2ZV9kdGltcwk9IDEwLAorCX07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAtRUlPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlpZiAod2wzNTAxX2VzYnFfcmVxX3Rlc3QodGhpcykpIHsKKwkJdTE2IHB0ciA9IHdsMzUwMV9nZXRfdHhfYnVmZmVyKHRoaXMsIHNpemVvZihzaWcpKTsKKwkJaWYgKHB0cikgeworCQkJd2wzNTAxX3NldF90b193bGEodGhpcywgcHRyLCAmc2lnLCBzaXplb2Yoc2lnKSk7CisJCQl3bDM1MDFfZXNicV9yZXEodGhpcywgJnB0cik7CisJCQl0aGlzLT5zaWdfcHdyX21nbXRfY29uZmlybS5zdGF0dXMgPSAyNTU7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0aGlzLT53YWl0LAorCQkJCXRoaXMtPnNpZ19wd3JfbWdtdF9jb25maXJtLnN0YXR1cyAhPSAyNTUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIHN0YXR1cz0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgICAgIHN1c3BlbmQgPyAic3VzcGVuZCIgOiAicmVzdW1lIiwKKwkJCSAgICAgICB0aGlzLT5zaWdfcHdyX21nbXRfY29uZmlybS5zdGF0dXMpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworb3V0OgorCXJldHVybiByYzsKK30KKworLyoqCisgKiB3bDM1MDFfc2VuZF9wa3QgLSBTZW5kIGEgcGFja2V0LgorICogQHRoaXMgLSBjYXJkCisgKgorICogU2VuZCBhIHBhY2tldC4KKyAqCisgKiBkYXRhID0gRXRoZXJuZXQgcmF3IGZyYW1lLiAgKGUuZy4gZGF0YVswXSAtIGRhdGFbNV0gaXMgRGVzdCBNQUMgQWRkciwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzZdIC0gZGF0YVsxMV0gaXMgU3JjIE1BQyBBZGRyKQorICogUmVmOiBJRUVFIDgwMi4xMQorICovCitzdGF0aWMgaW50IHdsMzUwMV9zZW5kX3BrdChzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHU4ICpkYXRhLCB1MTYgbGVuKQoreworCXUxNiBiZiwgc2lnX2JmLCBuZXh0LCB0bXBsZW4sIHBrdGxlbjsKKwlzdHJ1Y3Qgd2wzNTAxX21kX3JlcSBzaWcgPSB7CisJCS5zaWdfaWQgPSBXTDM1MDFfU0lHX01EX1JFUSwKKwl9OworCXU4ICpwZGF0YSA9IChjaGFyICopZGF0YTsKKwlpbnQgcmMgPSAtRUlPOworCisJaWYgKHdsMzUwMV9lc2JxX3JlcV90ZXN0KHRoaXMpKSB7CisJCXNpZ19iZiA9IHdsMzUwMV9nZXRfdHhfYnVmZmVyKHRoaXMsIHNpemVvZihzaWcpKTsKKwkJcmMgPSAtRU5PTUVNOworCQlpZiAoIXNpZ19iZikJLyogTm8gZnJlZSBidWZmZXIgYXZhaWxhYmxlICovCisJCQlnb3RvIG91dDsKKwkJYmYgPSB3bDM1MDFfZ2V0X3R4X2J1ZmZlcih0aGlzLCBsZW4gKyAyNiArIDI0KTsKKwkJaWYgKCFiZikgeworCQkJLyogTm8gZnJlZSBidWZmZXIgYXZhaWxhYmxlICovCisJCQl3bDM1MDFfZnJlZV90eF9idWZmZXIodGhpcywgc2lnX2JmKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJjID0gMDsKKwkJbWVtY3B5KCZzaWcuZGFkZHJbMF0sIHBkYXRhLCAxMik7CisJCXBrdGxlbiA9IGxlbiAtIDEyOworCQlwZGF0YSArPSAxMjsKKwkJc2lnLmRhdGEgPSBiZjsKKwkJaWYgKCgoKnBkYXRhKSAqIDI1NiArICgqKHBkYXRhICsgMSkpKSA+IDE1MDApIHsKKwkJCXU4IGFkZHI0W0VUSF9BTEVOXSA9IHsKKwkJCQlbMF0gPSAweEFBLCBbMV0gPSAweEFBLCBbMl0gPSAweDAzLCBbNF0gPSAweDAwLAorCQkJfTsKKworCQkJd2wzNTAxX3NldF90b193bGEodGhpcywgYmYgKyAyICsKKwkJCQkJICBvZmZzZXRvZihzdHJ1Y3Qgd2wzNTAxX3R4X2hkciwgYWRkcjQpLAorCQkJCQkgIGFkZHI0LCBzaXplb2YoYWRkcjQpKTsKKwkJCXNpZy5zaXplID0gcGt0bGVuICsgMjQgKyA0ICsgNjsKKwkJCWlmIChwa3RsZW4gPiAoMjU0IC0gc2l6ZW9mKHN0cnVjdCB3bDM1MDFfdHhfaGRyKSkpIHsKKwkJCQl0bXBsZW4gPSAyNTQgLSBzaXplb2Yoc3RydWN0IHdsMzUwMV90eF9oZHIpOworCQkJCXBrdGxlbiAtPSB0bXBsZW47CisJCQl9IGVsc2UgeworCQkJCXRtcGxlbiA9IHBrdGxlbjsKKwkJCQlwa3RsZW4gPSAwOworCQkJfQorCQkJd2wzNTAxX3NldF90b193bGEodGhpcywKKwkJCQkJICBiZiArIDIgKyBzaXplb2Yoc3RydWN0IHdsMzUwMV90eF9oZHIpLAorCQkJCQkgIHBkYXRhLCB0bXBsZW4pOworCQkJcGRhdGEgKz0gdG1wbGVuOworCQkJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBiZiwgJm5leHQsIHNpemVvZihuZXh0KSk7CisJCQliZiA9IG5leHQ7CisJCX0gZWxzZSB7CisJCQlzaWcuc2l6ZSA9IHBrdGxlbiArIDI0ICsgNCAtIDI7CisJCQlwZGF0YSArPSAyOworCQkJcGt0bGVuIC09IDI7CisJCQlpZiAocGt0bGVuID4gKDI1NCAtIHNpemVvZihzdHJ1Y3Qgd2wzNTAxX3R4X2hkcikgKyA2KSkgeworCQkJCXRtcGxlbiA9IDI1NCAtIHNpemVvZihzdHJ1Y3Qgd2wzNTAxX3R4X2hkcikgKyA2OworCQkJCXBrdGxlbiAtPSB0bXBsZW47CisJCQl9IGVsc2UgeworCQkJCXRtcGxlbiA9IHBrdGxlbjsKKwkJCQlwa3RsZW4gPSAwOworCQkJfQorCQkJd2wzNTAxX3NldF90b193bGEodGhpcywgYmYgKyAyICsKKwkJCQkJICBvZmZzZXRvZihzdHJ1Y3Qgd2wzNTAxX3R4X2hkciwgYWRkcjQpLAorCQkJCQkgIHBkYXRhLCB0bXBsZW4pOworCQkJcGRhdGEgKz0gdG1wbGVuOworCQkJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBiZiwgJm5leHQsIHNpemVvZihuZXh0KSk7CisJCQliZiA9IG5leHQ7CisJCX0KKwkJd2hpbGUgKHBrdGxlbiA+IDApIHsKKwkJCWlmIChwa3RsZW4gPiAyNTQpIHsKKwkJCQl0bXBsZW4gPSAyNTQ7CisJCQkJcGt0bGVuIC09IDI1NDsKKwkJCX0gZWxzZSB7CisJCQkJdG1wbGVuID0gcGt0bGVuOworCQkJCXBrdGxlbiA9IDA7CisJCQl9CisJCQl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCBiZiArIDIsIHBkYXRhLCB0bXBsZW4pOworCQkJcGRhdGEgKz0gdG1wbGVuOworCQkJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBiZiwgJm5leHQsIHNpemVvZihuZXh0KSk7CisJCQliZiA9IG5leHQ7CisJCX0KKwkJd2wzNTAxX3NldF90b193bGEodGhpcywgc2lnX2JmLCAmc2lnLCBzaXplb2Yoc2lnKSk7CisJCXdsMzUwMV9lc2JxX3JlcSh0aGlzLCAmc2lnX2JmKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9tZ210X3Jlc3luYyhzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJc3RydWN0IHdsMzUwMV9yZXN5bmNfcmVxIHNpZyA9IHsKKwkJLnNpZ19pZCA9IFdMMzUwMV9TSUdfUkVTWU5DX1JFUSwKKwl9OworCisJcmV0dXJuIHdsMzUwMV9lc2JxX2V4ZWModGhpcywgJnNpZywgc2l6ZW9mKHNpZykpOworfQorCitzdGF0aWMgaW5saW5lIGludCB3bDM1MDFfZndfYnNzX3R5cGUoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXJldHVybiB0aGlzLT5uZXRfdHlwZSA9PSBJV19NT0RFX0lORlJBID8gV0wzNTAxX05FVF9UWVBFX0lORlJBIDoKKwkJCQkJCSBXTDM1MDFfTkVUX1RZUEVfQURIT0M7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdsMzUwMV9md19jYXBfaW5mbyhzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJcmV0dXJuIHRoaXMtPm5ldF90eXBlID09IElXX01PREVfSU5GUkEgPyBXTDM1MDFfTUdNVF9DQVBBQklMSVRZX0VTUyA6CisJCQkJCQkgV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9JQlNTOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9tZ210X3NjYW4oc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgY2hhbl90aW1lKQoreworCXN0cnVjdCB3bDM1MDFfc2Nhbl9yZXEgc2lnID0geworCQkuc2lnX2lkCQk9IFdMMzUwMV9TSUdfU0NBTl9SRVEsCisJCS5zY2FuX3R5cGUJPSBXTDM1MDFfU0NBTl9UWVBFX0FDVElWRSwKKwkJLnByb2JlX2RlbGF5CT0gMHgxMCwKKwkJLm1pbl9jaGFuX3RpbWUJPSBjaGFuX3RpbWUsCisJCS5tYXhfY2hhbl90aW1lCT0gY2hhbl90aW1lLAorCQkuYnNzX3R5cGUJPSB3bDM1MDFfZndfYnNzX3R5cGUodGhpcyksCisJfTsKKworCXRoaXMtPmJzc19jbnQgPSB0aGlzLT5qb2luX3N0YV9ic3MgPSAwOworCXJldHVybiB3bDM1MDFfZXNicV9leGVjKHRoaXMsICZzaWcsIHNpemVvZihzaWcpKTsKK30KKworc3RhdGljIGludCB3bDM1MDFfbWdtdF9qb2luKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgdTE2IHN0YXMpCit7CisJc3RydWN0IHdsMzUwMV9qb2luX3JlcSBzaWcgPSB7CisJCS5zaWdfaWQJCSAgPSBXTDM1MDFfU0lHX0pPSU5fUkVRLAorCQkudGltZW91dAkgID0gMTAsCisJCS5kc19wc2V0ID0geworCQkJLmVsID0geworCQkJCS5pZCAgPSBJV19NR01UX0lORk9fRUxFTUVOVF9EU19QQVJBTUVURVJfU0VULAorCQkJCS5sZW4gPSAxLAorCQkJfSwKKwkJCS5jaGFuCT0gdGhpcy0+Y2hhbiwKKwkJfSwKKwl9OworCisJbWVtY3B5KCZzaWcuYmVhY29uX3BlcmlvZCwgJnRoaXMtPmJzc19zZXRbc3Rhc10uYmVhY29uX3BlcmlvZCwgNzIpOworCXJldHVybiB3bDM1MDFfZXNicV9leGVjKHRoaXMsICZzaWcsIHNpemVvZihzaWcpKTsKK30KKworc3RhdGljIGludCB3bDM1MDFfbWdtdF9zdGFydChzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJc3RydWN0IHdsMzUwMV9zdGFydF9yZXEgc2lnID0geworCQkuc2lnX2lkCQkJPSBXTDM1MDFfU0lHX1NUQVJUX1JFUSwKKwkJLmJlYWNvbl9wZXJpb2QJCT0gNDAwLAorCQkuZHRpbV9wZXJpb2QJCT0gMSwKKwkJLmRzX3BzZXQgPSB7CisJCQkuZWwgPSB7CisJCQkJLmlkICA9IElXX01HTVRfSU5GT19FTEVNRU5UX0RTX1BBUkFNRVRFUl9TRVQsCisJCQkJLmxlbiA9IDEsCisJCQl9LAorCQkJLmNoYW4JPSB0aGlzLT5jaGFuLAorCQl9LAorCQkuYnNzX2Jhc2ljX3JzZXQJPSB7CisJCQkuZWwgPSB7CisJCQkJLmlkCT0gSVdfTUdNVF9JTkZPX0VMRU1FTlRfU1VQUE9SVEVEX1JBVEVTLAorCQkJCS5sZW4gPSAyLAorCQkJfSwKKwkJCS5kYXRhX3JhdGVfbGFiZWxzID0geworCQkJCVswXSA9IElXX01HTVRfUkFURV9MQUJFTF9NQU5EQVRPUlkgfAorCQkJCSAgICAgIElXX01HTVRfUkFURV9MQUJFTF8xTUJJVCwKKwkJCQlbMV0gPSBJV19NR01UX1JBVEVfTEFCRUxfTUFOREFUT1JZIHwKKwkJCQkgICAgICBJV19NR01UX1JBVEVfTEFCRUxfMk1CSVQsCisJCQl9LAorCQl9LAorCQkub3BlcmF0aW9uYWxfcnNldAk9IHsKKwkJCS5lbCA9IHsKKwkJCQkuaWQJPSBJV19NR01UX0lORk9fRUxFTUVOVF9TVVBQT1JURURfUkFURVMsCisJCQkJLmxlbiA9IDIsCisJCQl9LAorCQkJLmRhdGFfcmF0ZV9sYWJlbHMgPSB7CisJCQkJWzBdID0gSVdfTUdNVF9SQVRFX0xBQkVMX01BTkRBVE9SWSB8CisJCQkJICAgICAgSVdfTUdNVF9SQVRFX0xBQkVMXzFNQklULAorCQkJCVsxXSA9IElXX01HTVRfUkFURV9MQUJFTF9NQU5EQVRPUlkgfAorCQkJCSAgICAgIElXX01HTVRfUkFURV9MQUJFTF8yTUJJVCwKKwkJCX0sCisJCX0sCisJCS5pYnNzX3BzZXQJCT0geworCQkJLmVsID0geworCQkJCS5pZAkgPSBJV19NR01UX0lORk9fRUxFTUVOVF9JQlNTX1BBUkFNRVRFUl9TRVQsCisJCQkJLmxlbiAgICAgPSAyLAorCQkJfSwKKwkJCS5hdGltX3dpbmRvdyA9IDEwLAorCQl9LAorCQkuYnNzX3R5cGUJCT0gd2wzNTAxX2Z3X2Jzc190eXBlKHRoaXMpLAorCQkuY2FwX2luZm8JCT0gd2wzNTAxX2Z3X2NhcF9pbmZvKHRoaXMpLAorCX07CisKKwlpd19jb3B5X21nbXRfaW5mb19lbGVtZW50KCZzaWcuc3NpZC5lbCwgJnRoaXMtPmVzc2lkLmVsKTsKKwlpd19jb3B5X21nbXRfaW5mb19lbGVtZW50KCZ0aGlzLT5rZWVwX2Vzc2lkLmVsLCAmdGhpcy0+ZXNzaWQuZWwpOworCXJldHVybiB3bDM1MDFfZXNicV9leGVjKHRoaXMsICZzaWcsIHNpemVvZihzaWcpKTsKK30KKworc3RhdGljIHZvaWQgd2wzNTAxX21nbXRfc2Nhbl9jb25maXJtKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgdTE2IGFkZHIpCit7CisJdTE2IGkgPSAwOworCWludCBtYXRjaGZsYWcgPSAwOworCXN0cnVjdCB3bDM1MDFfc2Nhbl9jb25maXJtIHNpZzsKKworCWRwcmludGsoMywgImVudHJ5Iik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBhZGRyLCAmc2lnLCBzaXplb2Yoc2lnKSk7CisJaWYgKHNpZy5zdGF0dXMgPT0gV0wzNTAxX1NUQVRVU19TVUNDRVNTKSB7CisJCWRwcmludGsoMywgInN1Y2Nlc3MiKTsKKwkJaWYgKCh0aGlzLT5uZXRfdHlwZSA9PSBJV19NT0RFX0lORlJBICYmCisJCSAgICAgKHNpZy5jYXBfaW5mbyAmIFdMMzUwMV9NR01UX0NBUEFCSUxJVFlfRVNTKSkgfHwKKwkJICAgICh0aGlzLT5uZXRfdHlwZSA9PSBJV19NT0RFX0FESE9DICYmCisJCSAgICAgKHNpZy5jYXBfaW5mbyAmIFdMMzUwMV9NR01UX0NBUEFCSUxJVFlfSUJTUykpIHx8CisJCSAgICB0aGlzLT5uZXRfdHlwZSA9PSBJV19NT0RFX0FVVE8pIHsKKwkJCWlmICghdGhpcy0+ZXNzaWQuZWwubGVuKQorCQkJCW1hdGNoZmxhZyA9IDE7CisJCQllbHNlIGlmICh0aGlzLT5lc3NpZC5lbC5sZW4gPT0gMyAmJgorCQkJCSAhbWVtY21wKHRoaXMtPmVzc2lkLmVzc2lkLCAiQU5ZIiwgMykpCisJCQkJbWF0Y2hmbGFnID0gMTsKKwkJCWVsc2UgaWYgKHRoaXMtPmVzc2lkLmVsLmxlbiAhPSBzaWcuc3NpZC5lbC5sZW4pCisJCQkJbWF0Y2hmbGFnID0gMDsKKwkJCWVsc2UgaWYgKG1lbWNtcCh0aGlzLT5lc3NpZC5lc3NpZCwgc2lnLnNzaWQuZXNzaWQsCisJCQkJCXRoaXMtPmVzc2lkLmVsLmxlbikpCisJCQkJbWF0Y2hmbGFnID0gMDsKKwkJCWVsc2UKKwkJCQltYXRjaGZsYWcgPSAxOworCQkJaWYgKG1hdGNoZmxhZykgeworCQkJCWZvciAoaSA9IDA7IGkgPCB0aGlzLT5ic3NfY250OyBpKyspIHsKKwkJCQkJaWYgKCFtZW1jbXAodGhpcy0+YnNzX3NldFtpXS5ic3NpZCwKKwkJCQkJCSAgICBzaWcuYnNzaWQsIEVUSF9BTEVOKSkgeworCQkJCQkJbWF0Y2hmbGFnID0gMDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKG1hdGNoZmxhZyAmJiAoaSA8IDIwKSkgeworCQkJCW1lbWNweSgmdGhpcy0+YnNzX3NldFtpXS5iZWFjb25fcGVyaW9kLAorCQkJCSAgICAgICAmc2lnLmJlYWNvbl9wZXJpb2QsIDczKTsKKwkJCQl0aGlzLT5ic3NfY250Kys7CisJCQkJdGhpcy0+cnNzaSA9IHNpZy5yc3NpOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChzaWcuc3RhdHVzID09IFdMMzUwMV9TVEFUVVNfVElNRU9VVCkgeworCQlkcHJpbnRrKDMsICJ0aW1lb3V0Iik7CisJCXRoaXMtPmpvaW5fc3RhX2JzcyA9IDA7CisJCWZvciAoaSA9IHRoaXMtPmpvaW5fc3RhX2JzczsgaSA8IHRoaXMtPmJzc19jbnQ7IGkrKykKKwkJCWlmICghd2wzNTAxX21nbXRfam9pbih0aGlzLCBpKSkKKwkJCQlicmVhazsKKwkJdGhpcy0+am9pbl9zdGFfYnNzID0gaTsKKwkJaWYgKHRoaXMtPmpvaW5fc3RhX2JzcyA9PSB0aGlzLT5ic3NfY250KSB7CisJCQlpZiAodGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9JTkZSQSkKKwkJCQl3bDM1MDFfbWdtdF9zY2FuKHRoaXMsIDEwMCk7CisJCQllbHNlIHsKKwkJCQl0aGlzLT5hZGhvY190aW1lcysrOworCQkJCWlmICh0aGlzLT5hZGhvY190aW1lcyA+IFdMMzUwMV9NQVhfQURIT0NfVFJJRVMpCisJCQkJCXdsMzUwMV9tZ210X3N0YXJ0KHRoaXMpOworCQkJCWVsc2UKKwkJCQkJd2wzNTAxX21nbXRfc2Nhbih0aGlzLCAxMDApOworCQkJfQorCQl9CisJfQorfQorCisvKioKKyAqIHdsMzUwMV9ibG9ja19pbnRlcnJ1cHQgLSBNYXNrIGludGVycnVwdCBmcm9tIFNVVFJPCisgKiBAdGhpcyAtIGNhcmQKKyAqCisgKiBNYXNrIGludGVycnVwdCBmcm9tIFNVVFJPLiAoaS5lLiBTVVRSTyBjYW5ub3QgaW50ZXJydXB0IHRoZSBIT1NUKQorICogUmV0dXJuOiAxIGlmIGludGVycnVwdCBpcyBvcmlnaW5hbGx5IGVuYWJsZWQKKyAqLworc3RhdGljIGludCB3bDM1MDFfYmxvY2tfaW50ZXJydXB0KHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl1OCBvbGQgPSBpbmIodGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19HQ1IpOworCXU4IG5ldyA9IG9sZCAmICh+KFdMMzUwMV9HQ1JfRUNJTlQgfCBXTDM1MDFfR0NSX0lOVDJFQyB8CisJCQlXTDM1MDFfR0NSX0VORUNJTlQpKTsKKworCXdsMzUwMV9vdXRiKG5ldywgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19HQ1IpOworCXJldHVybiBvbGQgJiBXTDM1MDFfR0NSX0VORUNJTlQ7Cit9CisKKy8qKgorICogd2wzNTAxX3VuYmxvY2tfaW50ZXJydXB0IC0gRW5hYmxlIGludGVycnVwdCBmcm9tIFNVVFJPCisgKiBAdGhpcyAtIGNhcmQKKyAqCisgKiBFbmFibGUgaW50ZXJydXB0IGZyb20gU1VUUk8uIChpLmUuIFNVVFJPIGNhbiBpbnRlcnJ1cHQgdGhlIEhPU1QpCisgKiBSZXR1cm46IDEgaWYgaW50ZXJydXB0IGlzIG9yaWdpbmFsbHkgZW5hYmxlZAorICovCitzdGF0aWMgaW50IHdsMzUwMV91bmJsb2NrX2ludGVycnVwdChzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJdTggb2xkID0gaW5iKHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKKwl1OCBuZXcgPSAob2xkICYgfihXTDM1MDFfR0NSX0VDSU5UIHwgV0wzNTAxX0dDUl9JTlQyRUMpKSB8CisJCSAgV0wzNTAxX0dDUl9FTkVDSU5UOworCisJd2wzNTAxX291dGIobmV3LCB0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0dDUik7CisJcmV0dXJuIG9sZCAmIFdMMzUwMV9HQ1JfRU5FQ0lOVDsKK30KKworLyoqCisgKiB3bDM1MDFfcmVjZWl2ZSAtIFJlY2VpdmUgZGF0YSBmcm9tIFJlY2VpdmUgUXVldWUuCisgKgorICogUmVjZWl2ZSBkYXRhIGZyb20gUmVjZWl2ZSBRdWV1ZS4KKyAqCisgKiBAdGhpczogY2FyZAorICogQGJmOiBhZGRyZXNzIG9mIGhvc3QKKyAqIEBzaXplOiBzaXplIG9mIGJ1ZmZlci4KKyAqLworc3RhdGljIHUxNiB3bDM1MDFfcmVjZWl2ZShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHU4ICpiZiwgdTE2IHNpemUpCit7CisJdTE2IG5leHRfYWRkciwgbmV4dF9hZGRyMTsKKwl1OCAqZGF0YSA9IGJmICsgMTI7CisKKwlzaXplIC09IDEyOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgdGhpcy0+c3RhcnRfc2VnICsgMiwKKwkJCSAgICAmbmV4dF9hZGRyLCBzaXplb2YobmV4dF9hZGRyKSk7CisJaWYgKHNpemUgPiBXTDM1MDFfQkxLU1ogLSBzaXplb2Yoc3RydWN0IHdsMzUwMV9yeF9oZHIpKSB7CisJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywKKwkJCQkgICAgdGhpcy0+c3RhcnRfc2VnICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCB3bDM1MDFfcnhfaGRyKSwgZGF0YSwKKwkJCQkgICAgV0wzNTAxX0JMS1NaIC0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB3bDM1MDFfcnhfaGRyKSk7CisJCXNpemUgLT0gV0wzNTAxX0JMS1NaIC0gc2l6ZW9mKHN0cnVjdCB3bDM1MDFfcnhfaGRyKTsKKwkJZGF0YSArPSBXTDM1MDFfQkxLU1ogLSBzaXplb2Yoc3RydWN0IHdsMzUwMV9yeF9oZHIpOworCX0gZWxzZSB7CisJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywKKwkJCQkgICAgdGhpcy0+c3RhcnRfc2VnICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCB3bDM1MDFfcnhfaGRyKSwKKwkJCQkgICAgZGF0YSwgc2l6ZSk7CisJCXNpemUgPSAwOworCX0KKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJaWYgKHNpemUgPiBXTDM1MDFfQkxLU1ogLSA1KSB7CisJCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIG5leHRfYWRkciArIDUsIGRhdGEsCisJCQkJCSAgICBXTDM1MDFfQkxLU1ogLSA1KTsKKwkJCXNpemUgLT0gV0wzNTAxX0JMS1NaIC0gNTsKKwkJCWRhdGEgKz0gV0wzNTAxX0JMS1NaIC0gNTsKKwkJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgbmV4dF9hZGRyICsgMiwgJm5leHRfYWRkcjEsCisJCQkJCSAgICBzaXplb2YobmV4dF9hZGRyMSkpOworCQkJbmV4dF9hZGRyID0gbmV4dF9hZGRyMTsKKwkJfSBlbHNlIHsKKwkJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgbmV4dF9hZGRyICsgNSwgZGF0YSwgc2l6ZSk7CisJCQlzaXplID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd2wzNTAxX2VzYnFfcmVxX2ZyZWUoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXU4IHRtcDsKKwl1MTYgYWRkcjsKKworCWlmICh0aGlzLT5lc2JxX3JlcV9oZWFkID09IHRoaXMtPmVzYnFfcmVxX3RhaWwpCisJCWdvdG8gb3V0OworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgdGhpcy0+ZXNicV9yZXFfdGFpbCArIDMsICZ0bXAsIHNpemVvZih0bXApKTsKKwlpZiAoISh0bXAgJiAweDgwKSkKKwkJZ290byBvdXQ7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCB0aGlzLT5lc2JxX3JlcV90YWlsLCAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwl3bDM1MDFfZnJlZV90eF9idWZmZXIodGhpcywgYWRkcik7CisJdGhpcy0+ZXNicV9yZXFfdGFpbCArPSA0OworCWlmICh0aGlzLT5lc2JxX3JlcV90YWlsID49IHRoaXMtPmVzYnFfcmVxX2VuZCkKKwkJdGhpcy0+ZXNicV9yZXFfdGFpbCA9IHRoaXMtPmVzYnFfcmVxX3N0YXJ0Oworb3V0OgorCXJldHVybjsKK30KKworc3RhdGljIGludCB3bDM1MDFfZXNicV9jb25maXJtKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl1OCB0bXA7CisKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIHRoaXMtPmVzYnFfY29uZmlybSArIDMsICZ0bXAsIHNpemVvZih0bXApKTsKKwlyZXR1cm4gdG1wICYgMHg4MDsKK30KKworc3RhdGljIHZvaWQgd2wzNTAxX29ubGluZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBXaXJlbGVzcyBMQU4gb25saW5lLiBCU1NJRDogIgorCSAgICAgICAiJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgdGhpcy0+YnNzaWRbMF0sIHRoaXMtPmJzc2lkWzFdLCB0aGlzLT5ic3NpZFsyXSwKKwkgICAgICAgdGhpcy0+YnNzaWRbM10sIHRoaXMtPmJzc2lkWzRdLCB0aGlzLT5ic3NpZFs1XSk7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgdm9pZCB3bDM1MDFfZXNicV9jb25maXJtX2RvbmUoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXU4IHRtcCA9IDA7CisKKwl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCB0aGlzLT5lc2JxX2NvbmZpcm0gKyAzLCAmdG1wLCBzaXplb2YodG1wKSk7CisJdGhpcy0+ZXNicV9jb25maXJtICs9IDQ7CisJaWYgKHRoaXMtPmVzYnFfY29uZmlybSA+PSB0aGlzLT5lc2JxX2NvbmZpcm1fZW5kKQorCQl0aGlzLT5lc2JxX2NvbmZpcm0gPSB0aGlzLT5lc2JxX2NvbmZpcm1fc3RhcnQ7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX21nbXRfYXV0aChzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJc3RydWN0IHdsMzUwMV9hdXRoX3JlcSBzaWcgPSB7CisJCS5zaWdfaWQJID0gV0wzNTAxX1NJR19BVVRIX1JFUSwKKwkJLnR5cGUJID0gV0wzNTAxX1NZU19UWVBFX09QRU4sCisJCS50aW1lb3V0ID0gMTAwMCwKKwl9OworCisJZHByaW50aygzLCAiZW50cnkiKTsKKwltZW1jcHkoc2lnLm1hY19hZGRyLCB0aGlzLT5ic3NpZCwgRVRIX0FMRU4pOworCXJldHVybiB3bDM1MDFfZXNicV9leGVjKHRoaXMsICZzaWcsIHNpemVvZihzaWcpKTsKK30KKworc3RhdGljIGludCB3bDM1MDFfbWdtdF9hc3NvY2lhdGlvbihzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJc3RydWN0IHdsMzUwMV9hc3NvY19yZXEgc2lnID0geworCQkuc2lnX2lkCQkgPSBXTDM1MDFfU0lHX0FTU09DX1JFUSwKKwkJLnRpbWVvdXQJID0gMTAwMCwKKwkJLmxpc3Rlbl9pbnRlcnZhbCA9IDUsCisJCS5jYXBfaW5mbwkgPSB0aGlzLT5jYXBfaW5mbywKKwl9OworCisJZHByaW50aygzLCAiZW50cnkiKTsKKwltZW1jcHkoc2lnLm1hY19hZGRyLCB0aGlzLT5ic3NpZCwgRVRIX0FMRU4pOworCXJldHVybiB3bDM1MDFfZXNicV9leGVjKHRoaXMsICZzaWcsIHNpemVvZihzaWcpKTsKK30KKworc3RhdGljIHZvaWQgd2wzNTAxX21nbXRfam9pbl9jb25maXJtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBhZGRyKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgd2wzNTAxX2pvaW5fY29uZmlybSBzaWc7CisKKwlkcHJpbnRrKDMsICJlbnRyeSIpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYWRkciwgJnNpZywgc2l6ZW9mKHNpZykpOworCWlmIChzaWcuc3RhdHVzID09IFdMMzUwMV9TVEFUVVNfU1VDQ0VTUykgeworCQlpZiAodGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9JTkZSQSkgeworCQkJaWYgKHRoaXMtPmpvaW5fc3RhX2JzcyA8IHRoaXMtPmJzc19jbnQpIHsKKwkJCQljb25zdCBpbnQgaSA9IHRoaXMtPmpvaW5fc3RhX2JzczsKKwkJCQltZW1jcHkodGhpcy0+YnNzaWQsCisJCQkJICAgICAgIHRoaXMtPmJzc19zZXRbaV0uYnNzaWQsIEVUSF9BTEVOKTsKKwkJCQl0aGlzLT5jaGFuID0gdGhpcy0+YnNzX3NldFtpXS5kc19wc2V0LmNoYW47CisJCQkJaXdfY29weV9tZ210X2luZm9fZWxlbWVudCgmdGhpcy0+a2VlcF9lc3NpZC5lbCwKKwkJCQkJCSAgICAgJnRoaXMtPmJzc19zZXRbaV0uc3NpZC5lbCk7CisJCQkJd2wzNTAxX21nbXRfYXV0aCh0aGlzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNvbnN0IGludCBpID0gdGhpcy0+am9pbl9zdGFfYnNzOworCisJCQltZW1jcHkoJnRoaXMtPmJzc2lkLCAmdGhpcy0+YnNzX3NldFtpXS5ic3NpZCwgRVRIX0FMRU4pOworCQkJdGhpcy0+Y2hhbiA9IHRoaXMtPmJzc19zZXRbaV0uZHNfcHNldC5jaGFuOworCQkJaXdfY29weV9tZ210X2luZm9fZWxlbWVudCgmdGhpcy0+a2VlcF9lc3NpZC5lbCwKKwkJCQkJCSAgJnRoaXMtPmJzc19zZXRbaV0uc3NpZC5lbCk7CisJCQl3bDM1MDFfb25saW5lKGRldik7CisJCX0KKwl9IGVsc2UgeworCQlpbnQgaTsKKwkJdGhpcy0+am9pbl9zdGFfYnNzKys7CisJCWZvciAoaSA9IHRoaXMtPmpvaW5fc3RhX2JzczsgaSA8IHRoaXMtPmJzc19jbnQ7IGkrKykKKwkJCWlmICghd2wzNTAxX21nbXRfam9pbih0aGlzLCBpKSkKKwkJCQlicmVhazsKKwkJdGhpcy0+am9pbl9zdGFfYnNzID0gaTsKKwkJaWYgKHRoaXMtPmpvaW5fc3RhX2JzcyA9PSB0aGlzLT5ic3NfY250KSB7CisJCQlpZiAodGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9JTkZSQSkKKwkJCQl3bDM1MDFfbWdtdF9zY2FuKHRoaXMsIDEwMCk7CisJCQllbHNlIHsKKwkJCQl0aGlzLT5hZGhvY190aW1lcysrOworCQkJCWlmICh0aGlzLT5hZGhvY190aW1lcyA+IFdMMzUwMV9NQVhfQURIT0NfVFJJRVMpCisJCQkJCXdsMzUwMV9tZ210X3N0YXJ0KHRoaXMpOworCQkJCWVsc2UKKwkJCQkJd2wzNTAxX21nbXRfc2Nhbih0aGlzLCAxMDApOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX2FsYXJtX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwlpZiAodGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9JTkZSQSkgeworCQlwcmludGsoS0VSTl9JTkZPICJXaXJlbGVzcyBMQU4gb2ZmbGluZVxuIik7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJd2wzNTAxX21nbXRfcmVzeW5jKHRoaXMpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsMzUwMV9tZF9jb25maXJtX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgICAgc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLAorCQkJCQkgICAgICAgdTE2IGFkZHIpCit7CisJc3RydWN0IHdsMzUwMV9tZF9jb25maXJtIHNpZzsKKworCWRwcmludGsoMywgImVudHJ5Iik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBhZGRyLCAmc2lnLCBzaXplb2Yoc2lnKSk7CisJd2wzNTAxX2ZyZWVfdHhfYnVmZmVyKHRoaXMsIHNpZy5kYXRhKTsKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bDM1MDFfbWRfaW5kX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICBzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHUxNiBhZGRyKQoreworCXN0cnVjdCB3bDM1MDFfbWRfaW5kIHNpZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4IHJzc2ksIGFkZHI0W0VUSF9BTEVOXTsKKwl1MTYgcGt0X2xlbjsKKworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYWRkciwgJnNpZywgc2l6ZW9mKHNpZykpOworCXRoaXMtPnN0YXJ0X3NlZyA9IHNpZy5kYXRhOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywKKwkJCSAgICBzaWcuZGF0YSArIG9mZnNldG9mKHN0cnVjdCB3bDM1MDFfcnhfaGRyLCByc3NpKSwKKwkJCSAgICAmcnNzaSwgc2l6ZW9mKHJzc2kpKTsKKwl0aGlzLT5yc3NpID0gcnNzaSA8PSA2MyA/IChyc3NpICogMTAwKSAvIDY0IDogMjU1OworCisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLAorCQkJICAgIHNpZy5kYXRhICsKKwkJCQlvZmZzZXRvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkciwgYWRkcjQpLAorCQkJICAgICZhZGRyNCwgc2l6ZW9mKGFkZHI0KSk7CisJaWYgKCEoYWRkcjRbMF0gPT0gMHhBQSAmJiBhZGRyNFsxXSA9PSAweEFBICYmCisJICAgICAgYWRkcjRbMl0gPT0gMHgwMyAmJiBhZGRyNFs0XSA9PSAweDAwKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJJbnN1cHBvcnRlZCBwYWNrZXQgdHlwZSFcbiIpOworCQlyZXR1cm47CisJfQorCXBrdF9sZW4gPSBzaWcuc2l6ZSArIDEyIC0gMjQgLSA0IC0gNjsKKworCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDUpOworCisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhbid0IGFsbG9jIGEgc2tfYnVmZiBvZiBzaXplICVkLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCXRoaXMtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwl9IGVsc2UgeworCQlza2ItPmRldiA9IGRldjsKKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsgLyogSVAgaGVhZGVycyBvbiAxNiBieXRlcyBib3VuZGFyaWVzICovCisJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCAodW5zaWduZWQgY2hhciAqKSZzaWcuZGFkZHIsIDEyLCAwKTsKKwkJd2wzNTAxX3JlY2VpdmUodGhpcywgc2tiLT5kYXRhLCBwa3RfbGVuKTsKKwkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQlza2ItPnByb3RvY29sCT0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQlkZXYtPmxhc3RfcngJPSBqaWZmaWVzOworCQl0aGlzLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCXRoaXMtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQluZXRpZl9yeChza2IpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsMzUwMV9nZXRfY29uZmlybV9pbnRlcnJ1cHQoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLAorCQkJCQkJdTE2IGFkZHIsIHZvaWQgKnNpZywgaW50IHNpemUpCit7CisJZHByaW50aygzLCAiZW50cnkiKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIGFkZHIsICZ0aGlzLT5zaWdfZ2V0X2NvbmZpcm0sCisJCQkgICAgc2l6ZW9mKHRoaXMtPnNpZ19nZXRfY29uZmlybSkpOworCXdha2VfdXAoJnRoaXMtPndhaXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX3N0YXJ0X2NvbmZpcm1faW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkgIHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywKKwkJCQkJCSAgdTE2IGFkZHIpCit7CisJc3RydWN0IHdsMzUwMV9zdGFydF9jb25maXJtIHNpZzsKKworCWRwcmludGsoMywgImVudHJ5Iik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBhZGRyLCAmc2lnLCBzaXplb2Yoc2lnKSk7CisJaWYgKHNpZy5zdGF0dXMgPT0gV0wzNTAxX1NUQVRVU19TVUNDRVNTKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bDM1MDFfYXNzb2NfY29uZmlybV9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCSAgdTE2IGFkZHIpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCXN0cnVjdCB3bDM1MDFfYXNzb2NfY29uZmlybSBzaWc7CisKKwlkcHJpbnRrKDMsICJlbnRyeSIpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYWRkciwgJnNpZywgc2l6ZW9mKHNpZykpOworCisJaWYgKHNpZy5zdGF0dXMgPT0gV0wzNTAxX1NUQVRVU19TVUNDRVNTKQorCQl3bDM1MDFfb25saW5lKGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bDM1MDFfYXV0aF9jb25maXJtX2ludGVycnVwdChzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsCisJCQkJCQkgdTE2IGFkZHIpCit7CisJc3RydWN0IHdsMzUwMV9hdXRoX2NvbmZpcm0gc2lnOworCisJZHByaW50aygzLCAiZW50cnkiKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIGFkZHIsICZzaWcsIHNpemVvZihzaWcpKTsKKworCWlmIChzaWcuc3RhdHVzID09IFdMMzUwMV9TVEFUVVNfU1VDQ0VTUykKKwkJd2wzNTAxX21nbXRfYXNzb2NpYXRpb24odGhpcyk7CisJZWxzZQorCQl3bDM1MDFfbWdtdF9yZXN5bmModGhpcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bDM1MDFfcnhfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IG1vcmVwa3RzOworCXUxNiBhZGRyOworCXU4IHNpZ19pZDsKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwlkcHJpbnRrKDMsICJlbnRyeSIpOworbG9vcDoKKwltb3JlcGt0cyA9IDA7CisJaWYgKCF3bDM1MDFfZXNicV9jb25maXJtKHRoaXMpKQorCQlnb3RvIGZyZWU7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCB0aGlzLT5lc2JxX2NvbmZpcm0sICZhZGRyLCBzaXplb2YoYWRkcikpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYWRkciArIDIsICZzaWdfaWQsIHNpemVvZihzaWdfaWQpKTsKKworCXN3aXRjaCAoc2lnX2lkKSB7CisJY2FzZSBXTDM1MDFfU0lHX0RFQVVUSF9JTkQ6CisJY2FzZSBXTDM1MDFfU0lHX0RJU0FTU09DX0lORDoKKwljYXNlIFdMMzUwMV9TSUdfQUxBUk06CisJCXdsMzUwMV9hbGFybV9pbnRlcnJ1cHQoZGV2LCB0aGlzKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX01EX0NPTkZJUk06CisJCXdsMzUwMV9tZF9jb25maXJtX2ludGVycnVwdChkZXYsIHRoaXMsIGFkZHIpOworCQlicmVhazsKKwljYXNlIFdMMzUwMV9TSUdfTURfSU5EOgorCQl3bDM1MDFfbWRfaW5kX2ludGVycnVwdChkZXYsIHRoaXMsIGFkZHIpOworCQlicmVhazsKKwljYXNlIFdMMzUwMV9TSUdfR0VUX0NPTkZJUk06CisJCXdsMzUwMV9nZXRfY29uZmlybV9pbnRlcnJ1cHQodGhpcywgYWRkciwKKwkJCQkJICAgICAmdGhpcy0+c2lnX2dldF9jb25maXJtLAorCQkJCQkgICAgIHNpemVvZih0aGlzLT5zaWdfZ2V0X2NvbmZpcm0pKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX1BXUl9NR01UX0NPTkZJUk06CisJCXdsMzUwMV9nZXRfY29uZmlybV9pbnRlcnJ1cHQodGhpcywgYWRkciwKKwkJCQkJICAgICAmdGhpcy0+c2lnX3B3cl9tZ210X2NvbmZpcm0sCisJCQkJCSAgICBzaXplb2YodGhpcy0+c2lnX3B3cl9tZ210X2NvbmZpcm0pKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX1NUQVJUX0NPTkZJUk06CisJCXdsMzUwMV9zdGFydF9jb25maXJtX2ludGVycnVwdChkZXYsIHRoaXMsIGFkZHIpOworCQlicmVhazsKKwljYXNlIFdMMzUwMV9TSUdfU0NBTl9DT05GSVJNOgorCQl3bDM1MDFfbWdtdF9zY2FuX2NvbmZpcm0odGhpcywgYWRkcik7CisJCWJyZWFrOworCWNhc2UgV0wzNTAxX1NJR19KT0lOX0NPTkZJUk06CisJCXdsMzUwMV9tZ210X2pvaW5fY29uZmlybShkZXYsIGFkZHIpOworCQlicmVhazsKKwljYXNlIFdMMzUwMV9TSUdfQVNTT0NfQ09ORklSTToKKwkJd2wzNTAxX2Fzc29jX2NvbmZpcm1faW50ZXJydXB0KGRldiwgYWRkcik7CisJCWJyZWFrOworCWNhc2UgV0wzNTAxX1NJR19BVVRIX0NPTkZJUk06CisJCXdsMzUwMV9hdXRoX2NvbmZpcm1faW50ZXJydXB0KHRoaXMsIGFkZHIpOworCQlicmVhazsKKwljYXNlIFdMMzUwMV9TSUdfUkVTWU5DX0NPTkZJUk06CisJCXdsMzUwMV9tZ210X3Jlc3luYyh0aGlzKTsgLyogRklYTUU6IHNob3VsZCBiZSByZXN5bmNfY29uZmlybSAqLworCQlicmVhazsKKwl9CisJd2wzNTAxX2VzYnFfY29uZmlybV9kb25lKHRoaXMpOworCW1vcmVwa3RzID0gMTsKKwkvKiBmcmVlIHJlcXVlc3QgaWYgbmVjZXNzYXJ5ICovCitmcmVlOgorCXdsMzUwMV9lc2JxX3JlcV9mcmVlKHRoaXMpOworCWlmIChtb3JlcGt0cykKKwkJZ290byBsb29wOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX2Fja19pbnRlcnJ1cHQoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXdsMzUwMV9vdXRiKFdMMzUwMV9HQ1JfRUNJTlQsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKK30KKworLyoqCisgKiB3bDM1MDFfaW50ZXJydXB0IC0gSGFyZHdhcmUgaW50ZXJydXB0IGZyb20gY2FyZC4KKyAqIEBpcnEgLSBJbnRlcnJ1cHQgbnVtYmVyCisgKiBAZGV2X2lkIC0gbmV0X2RldmljZQorICogQHJlZ3MgLSByZWdpc3RlcnMKKyAqCisgKiBXZSBtdXN0IGFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgYXMgc29vbiBhcyBwb3NzaWJsZSwgYW5kIGJsb2NrIHRoZQorICogaW50ZXJydXB0IGZyb20gdGhlIHNhbWUgY2FyZCBpbW1lZGlhdGVseSB0byBwcmV2ZW50IHJlLWVudHJ5LgorICoKKyAqIEJlZm9yZSBhY2Nlc3NpbmcgdGhlIENvbnRyb2xfU3RhdHVzX0Jsb2NrLCB3ZSBtdXN0IGxvY2sgU1VUUk8gZmlyc3QuCisgKiBPbiB0aGUgb3RoZXIgaGFuZCwgdG8gcHJldmVudCBTVVRSTyBmcm9tIG1hbGZ1bmN0aW9uaW5nLCB3ZSBtdXN0CisgKiB1bmxvY2sgdGhlIFNVVFJPIGFzIHNvb24gYXMgcG9zc2libGUuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB3bDM1MDFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXM7CisJaW50IGhhbmRsZWQgPSAxOworCisJaWYgKCFkZXYpCisJCWdvdG8gdW5rbm93bjsKKwl0aGlzID0gZGV2LT5wcml2OworCXNwaW5fbG9jaygmdGhpcy0+bG9jayk7CisJd2wzNTAxX2Fja19pbnRlcnJ1cHQodGhpcyk7CisJd2wzNTAxX2Jsb2NrX2ludGVycnVwdCh0aGlzKTsKKwl3bDM1MDFfcnhfaW50ZXJydXB0KGRldik7CisJd2wzNTAxX3VuYmxvY2tfaW50ZXJydXB0KHRoaXMpOworCXNwaW5fdW5sb2NrKCZ0aGlzLT5sb2NrKTsKK291dDoKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK3Vua25vd246CisJaGFuZGxlZCA9IDA7CisJcHJpbnRrKEtFUk5fRVJSICIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIF9fRlVOQ1RJT05fXywgaXJxKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCB3bDM1MDFfcmVzZXRfYm9hcmQoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXU4IHRtcCA9IDA7CisJaW50IGksIHJjID0gMDsKKworCS8qIENvcmVzZXQgKi8KKwl3bDM1MDFfb3V0Yl9wKFdMMzUwMV9HQ1JfQ09SRVNFVCwgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19HQ1IpOworCXdsMzUwMV9vdXRiX3AoMCwgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19HQ1IpOworCXdsMzUwMV9vdXRiX3AoV0wzNTAxX0dDUl9DT1JFU0VULCB0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0dDUik7CisKKwkvKiBSZXNldCBTUkFNIDB4NDgwIHRvIHplcm8gKi8KKwl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCAweDQ4MCwgJnRtcCwgc2l6ZW9mKHRtcCkpOworCisJLyogU3RhcnQgdXAgKi8KKwl3bDM1MDFfb3V0Yl9wKDAsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKKworCVdMMzUwMV9OT1BMT09QKDEwMjQgKiA1MCk7CisKKwl3bDM1MDFfdW5ibG9ja19pbnRlcnJ1cHQodGhpcyk7CS8qIGFjbWU6IHdhcyBjb21tZW50ZWQgKi8KKworCS8qIFBvbGxpbmcgU2VsZl9UZXN0X1N0YXR1cyAqLworCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgMHg0ODAsICZ0bXAsIHNpemVvZih0bXApKTsKKworCQlpZiAodG1wID09ICdXJykgeworCQkJLyogZmlybXdhcmUgY29tcGxldGUgYWxsIHRlc3Qgc3VjY2Vzc2Z1bGx5ICovCisJCQl0bXAgPSAnQSc7CisJCQl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCAweDQ4MCwgJnRtcCwgc2l6ZW9mKHRtcCkpOworCQkJZ290byBvdXQ7CisJCX0KKwkJV0wzNTAxX05PUExPT1AoMTApOworCX0KKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmFpbGVkIHRvIHJlc2V0IHRoZSBib2FyZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmMgPSAtRU5PREVWOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3bDM1MDFfaW5pdF9maXJtd2FyZShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJdTE2IHB0ciwgbmV4dDsKKwlpbnQgcmMgPSB3bDM1MDFfcmVzZXRfYm9hcmQodGhpcyk7CisKKwlpZiAocmMpCisJCWdvdG8gZmFpbDsKKwl0aGlzLT5jYXJkX25hbWVbMF0gPSAnXDAnOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgMHgxYTAwLAorCQkJICAgIHRoaXMtPmNhcmRfbmFtZSwgc2l6ZW9mKHRoaXMtPmNhcmRfbmFtZSkpOworCXRoaXMtPmNhcmRfbmFtZVtzaXplb2YodGhpcy0+Y2FyZF9uYW1lKSAtIDFdID0gJ1wwJzsKKwl0aGlzLT5maXJtd2FyZV9kYXRlWzBdID0gJ1wwJzsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIDB4MWE0MCwKKwkJCSAgICB0aGlzLT5maXJtd2FyZV9kYXRlLCBzaXplb2YodGhpcy0+ZmlybXdhcmVfZGF0ZSkpOworCXRoaXMtPmZpcm13YXJlX2RhdGVbc2l6ZW9mKHRoaXMtPmZpcm13YXJlX2RhdGUpIC0gMV0gPSAnXDAnOworCS8qIFN3aXRjaCB0byBTUkFNIFBhZ2UgMCAqLworCXdsMzUwMV9zd2l0Y2hfcGFnZSh0aGlzLCBXTDM1MDFfQlNTX1NQQUdFMCk7CisJLyogUmVhZCBwYXJhbWV0ZXIgZnJvbSBjYXJkICovCisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDQ4MiwgJnRoaXMtPmVzYnFfcmVxX3N0YXJ0LCAyKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIDB4NDg2LCAmdGhpcy0+ZXNicV9yZXFfZW5kLCAyKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIDB4NDg4LCAmdGhpcy0+ZXNicV9jb25maXJtX3N0YXJ0LCAyKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIDB4NDhjLCAmdGhpcy0+ZXNicV9jb25maXJtX2VuZCwgMik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDQ4ZSwgJnRoaXMtPnR4X2J1ZmZlcl9oZWFkLCAyKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIDB4NDkyLCAmdGhpcy0+dHhfYnVmZmVyX3NpemUsIDIpOworCXRoaXMtPmVzYnFfcmVxX3RhaWwJPSB0aGlzLT5lc2JxX3JlcV9oZWFkID0gdGhpcy0+ZXNicV9yZXFfc3RhcnQ7CisJdGhpcy0+ZXNicV9yZXFfZW5kICAgICArPSB0aGlzLT5lc2JxX3JlcV9zdGFydDsKKwl0aGlzLT5lc2JxX2NvbmZpcm0JPSB0aGlzLT5lc2JxX2NvbmZpcm1fc3RhcnQ7CisJdGhpcy0+ZXNicV9jb25maXJtX2VuZCArPSB0aGlzLT5lc2JxX2NvbmZpcm1fc3RhcnQ7CisJLyogSW5pdGlhbCBUeCBCdWZmZXIgKi8KKwl0aGlzLT50eF9idWZmZXJfY250ID0gMTsKKwlwdHIgPSB0aGlzLT50eF9idWZmZXJfaGVhZDsKKwluZXh0ID0gcHRyICsgV0wzNTAxX0JMS1NaOworCXdoaWxlICgobmV4dCAtIHRoaXMtPnR4X2J1ZmZlcl9oZWFkKSA8IHRoaXMtPnR4X2J1ZmZlcl9zaXplKSB7CisJCXRoaXMtPnR4X2J1ZmZlcl9jbnQrKzsKKwkJd2wzNTAxX3NldF90b193bGEodGhpcywgcHRyLCAmbmV4dCwgc2l6ZW9mKG5leHQpKTsKKwkJcHRyID0gbmV4dDsKKwkJbmV4dCA9IHB0ciArIFdMMzUwMV9CTEtTWjsKKwl9CisJcmMgPSAwOworCW5leHQgPSAwOworCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHB0ciwgJm5leHQsIHNpemVvZihuZXh0KSk7CisJdGhpcy0+dHhfYnVmZmVyX3RhaWwgPSBwdHI7CitvdXQ6CisJcmV0dXJuIHJjOworZmFpbDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCB3bDM1MDFfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJaW50IHJjID0gLUVOT0RFVjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRldl9saW5rX3QgKmxpbms7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCS8qIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgaW4gd2wzNTAxX2Rldl9saXN0ICovCisJZm9yIChsaW5rID0gd2wzNTAxX2Rldl9saXN0OyBsaW5rOyBsaW5rID0gbGluay0+bmV4dCkKKwkJaWYgKGxpbmstPnByaXYgPT0gZGV2KQorCQkJYnJlYWs7CisJaWYgKCFsaW5rKQorCQlnb3RvIG91dDsKKwlsaW5rLT5vcGVuLS07CisKKwkvKiBTdG9wIHdsMzUwMV9oYXJkX3N0YXJ0X3htaXQoKSBmcm9tIG5vdyBvbiAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl3bDM1MDFfYWNrX2ludGVycnVwdCh0aGlzKTsKKworCS8qIE1hc2sgaW50ZXJydXB0cyBmcm9tIHRoZSBTVVRSTyAqLworCXdsMzUwMV9ibG9ja19pbnRlcnJ1cHQodGhpcyk7CisKKwlyYyA9IDA7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFdMMzUwMSBjbG9zZWRcbiIsIGRldi0+bmFtZSk7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiB3bDM1MDFfcmVzZXQgLSBSZXNldCB0aGUgU1VUUk8uCisgKiBAZGV2IC0gbmV0d29yayBkZXZpY2UKKyAqCisgKiBJdCBpcyBhbG1vc3QgdGhlIHNhbWUgYXMgd2wzNTAxX29wZW4oKS4gSW4gZmFjdCwgd2UgbWF5IGp1c3Qgd2wzNTAxX2Nsb3NlKCkKKyAqIGFuZCB3bDM1MDFfb3BlbigpIGFnYWluLCBidXQgSSB3b3VsZG4ndCBsaWtlIHRvIGZyZWVfaXJxKCkgd2hlbiB0aGUgZHJpdmVyCisgKiBpcyBydW5uaW5nLiBJdCBzZWVtcyB0byBiZSBkYW5nZXJvdXMuCisgKi8KK3N0YXRpYyBpbnQgd2wzNTAxX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCWludCByYyA9IC1FTk9ERVY7CisKKwl3bDM1MDFfYmxvY2tfaW50ZXJydXB0KHRoaXMpOworCisJaWYgKHdsMzUwMV9pbml0X2Zpcm13YXJlKHRoaXMpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBpbml0aWFsaXplIEZpcm13YXJlIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCS8qIEZyZWUgSVJRLCBhbmQgbWFyayBJUlEgYXMgdW51c2VkICovCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFF1ZXVlIGhhcyB0byBiZSBzdGFydGVkIG9ubHkgd2hlbiB0aGUgQ2FyZCBpcyBTdGFydGVkCisJICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXRoaXMtPmFkaG9jX3RpbWVzID0gMDsKKwl3bDM1MDFfYWNrX2ludGVycnVwdCh0aGlzKTsKKwl3bDM1MDFfdW5ibG9ja19pbnRlcnJ1cHQodGhpcyk7CisJd2wzNTAxX21nbXRfc2Nhbih0aGlzLCAxMDApOworCWRwcmludGsoMSwgIiVzOiBkZXZpY2UgcmVzZXQiLCBkZXYtPm5hbWUpOworCXJjID0gMDsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ0aGlzLT5zdGF0czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCXN0YXRzLT50eF9lcnJvcnMrKzsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCXJjID0gd2wzNTAxX3Jlc2V0KGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCWlmIChyYykKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgcmVzZXR0aW5nIGNhcmQgb24gVHggdGltZW91dCFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHJjKTsKKwllbHNlIHsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9Cit9CisKKy8qCisgKiBSZXR1cm4gOiAwIC0gT0sKKyAqCSAgICAxIC0gQ291bGQgbm90IHRyYW5zbWl0IChkZXZfcXVldWVfeG1pdCB3aWxsIHF1ZXVlIGl0KQorICoJCWFuZCB0cnkgdG8gc2VudCBpdCBsYXRlcgorICovCitzdGF0aWMgaW50IHdsMzUwMV9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgZW5hYmxlZCwgcmM7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCWVuYWJsZWQgPSB3bDM1MDFfYmxvY2tfaW50ZXJydXB0KHRoaXMpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJjID0gd2wzNTAxX3NlbmRfcGt0KHRoaXMsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCWlmIChlbmFibGVkKQorCQl3bDM1MDFfdW5ibG9ja19pbnRlcnJ1cHQodGhpcyk7CisJaWYgKHJjKSB7CisJCSsrdGhpcy0+c3RhdHMudHhfZHJvcHBlZDsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCX0gZWxzZSB7CisJCSsrdGhpcy0+c3RhdHMudHhfcGFja2V0czsKKwkJdGhpcy0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWtmcmVlX3NrYihza2IpOworCisJCWlmICh0aGlzLT50eF9idWZmZXJfY250IDwgMikKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3bDM1MDFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByYyA9IC1FTk9ERVY7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZGV2X2xpbmtfdCAqbGluazsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJLyogQ2hlY2sgaWYgdGhlIGRldmljZSBpcyBpbiB3bDM1MDFfZGV2X2xpc3QgKi8KKwlmb3IgKGxpbmsgPSB3bDM1MDFfZGV2X2xpc3Q7IGxpbms7IGxpbmsgPSBsaW5rLT5uZXh0KQorCQlpZiAobGluay0+cHJpdiA9PSBkZXYpCisJCQlicmVhazsKKwlpZiAoIURFVl9PSyhsaW5rKSkKKwkJZ290byBvdXQ7CisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCWxpbmstPm9wZW4rKzsKKworCS8qIEluaXRpYWwgV0wzNTAxIGZpcm13YXJlICovCisJZHByaW50aygxLCAiJXM6IEluaXRpYWxpemUgV0wzNTAxIGZpcm13YXJlLi4uIiwgZGV2LT5uYW1lKTsKKwlpZiAod2wzNTAxX2luaXRfZmlybXdhcmUodGhpcykpCisJCWdvdG8gZmFpbDsKKwkvKiBJbml0aWFsIGRldmljZSB2YXJpYWJsZXMgKi8KKwl0aGlzLT5hZGhvY190aW1lcyA9IDA7CisJLyogQWNrbm93bGVkZ2UgSW50ZXJydXB0LCBmb3IgY2xlYW5pbmcgbGFzdCBzdGF0ZSAqLworCXdsMzUwMV9hY2tfaW50ZXJydXB0KHRoaXMpOworCisJLyogRW5hYmxlIGludGVycnVwdCBmcm9tIGNhcmQgYWZ0ZXIgYWxsICovCisJd2wzNTAxX3VuYmxvY2tfaW50ZXJydXB0KHRoaXMpOworCXdsMzUwMV9tZ210X3NjYW4odGhpcywgMTAwKTsKKwlyYyA9IDA7CisJZHByaW50aygxLCAiJXM6IFdMMzUwMSBvcGVuZWQiLCBkZXYtPm5hbWUpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBDYXJkIE5hbWU6ICVzXG4iCisJCQkgIiVzOiBGaXJtd2FyZSBEYXRlOiAlc1xuIiwKKwkJCSBkZXYtPm5hbWUsIHRoaXMtPmNhcmRfbmFtZSwKKwkJCSBkZXYtPm5hbWUsIHRoaXMtPmZpcm13YXJlX2RhdGUpOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7CitmYWlsOgorCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBpbml0aWFsaXplIGZpcm13YXJlIVxuIiwgZGV2LT5uYW1lKTsKKwlnb3RvIG91dDsKK30KKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKndsMzUwMV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJnRoaXMtPnN0YXRzOworfQorCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqd2wzNTAxX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqd3N0YXRzID0gJnRoaXMtPndzdGF0czsKKwl1MzIgdmFsdWU7IC8qIHNpemUgY2hlY2tlZDogaXQgaXMgdTMyICovCisKKwltZW1zZXQod3N0YXRzLCAwLCBzaXplb2YoKndzdGF0cykpOworCXdzdGF0cy0+c3RhdHVzID0gbmV0aWZfcnVubmluZyhkZXYpOworCWlmICghd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX1dFUF9JQ1ZfRVJST1JfQ09VTlQsCisJCQkJICAmdmFsdWUsIHNpemVvZih2YWx1ZSkpKQorCQl3c3RhdHMtPmRpc2NhcmQuY29kZSArPSB2YWx1ZTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9XRVBfVU5ERUNSWVBUQUJMRV9DT1VOVCwKKwkJCQkgICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpCisJCXdzdGF0cy0+ZGlzY2FyZC5jb2RlICs9IHZhbHVlOworCWlmICghd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX1dFUF9FWENMVURFRF9DT1VOVCwKKwkJCQkgICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpCisJCXdzdGF0cy0+ZGlzY2FyZC5jb2RlICs9IHZhbHVlOworCWlmICghd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX1JFVFJZX0NPVU5ULAorCQkJCSAgJnZhbHVlLCBzaXplb2YodmFsdWUpKSkKKwkJd3N0YXRzLT5kaXNjYXJkLnJldHJpZXMJPSB2YWx1ZTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9GQUlMRURfQ09VTlQsCisJCQkJICAmdmFsdWUsIHNpemVvZih2YWx1ZSkpKQorCQl3c3RhdHMtPmRpc2NhcmQubWlzYyArPSB2YWx1ZTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9SVFNfRkFJTFVSRV9DT1VOVCwKKwkJCQkgICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpCisJCXdzdGF0cy0+ZGlzY2FyZC5taXNjICs9IHZhbHVlOworCWlmICghd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX0FDS19GQUlMVVJFX0NPVU5ULAorCQkJCSAgJnZhbHVlLCBzaXplb2YodmFsdWUpKSkKKwkJd3N0YXRzLT5kaXNjYXJkLm1pc2MgKz0gdmFsdWU7CisJaWYgKCF3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfRlJBTUVfRFVQTElDQVRFX0NPVU5ULAorCQkJCSAgJnZhbHVlLCBzaXplb2YodmFsdWUpKSkKKwkJd3N0YXRzLT5kaXNjYXJkLm1pc2MgKz0gdmFsdWU7CisJcmV0dXJuIHdzdGF0czsKK30KKworc3RhdGljIHZvaWQgd2wzNTAxX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIHdsMzUwMV9kZXZfaW5mbywgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG9wcyA9IHsKKwkuZ2V0X2RydmluZm8gPSB3bDM1MDFfZ2V0X2RydmluZm8KK307CisKKy8qKgorICogd2wzNTAxX2RldGFjaCAtIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIgorICogQGxpbmsgLSBGSUxMX0lOCisgKgorICogVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuIFRoZSBkZXZpY2UgaXMgZGUtcmVnaXN0ZXJlZCB3aXRoIENhcmQKKyAqIFNlcnZpY2VzLiBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBhcmUgZnJlZWQuCisgKiBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbGVhc2VkLgorICovCitzdGF0aWMgdm9pZCB3bDM1MDFfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisJZGV2X2xpbmtfdCAqKmxpbmtwOworCisJLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlmb3IgKGxpbmtwID0gJndsMzUwMV9kZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwkJaWYgKCpsaW5rcCA9PSBsaW5rKQorCQkJYnJlYWs7CisJaWYgKCEqbGlua3ApCisJCWdvdG8gb3V0OworCisJLyogSWYgdGhlIGRldmljZSBpcyBjdXJyZW50bHkgY29uZmlndXJlZCBhbmQgYWN0aXZlLCB3ZSB3b24ndCBhY3R1YWxseQorCSAqIGRlbGV0ZSBpdCB5ZXQuICBJbnN0ZWFkLCBpdCBpcyBtYXJrZWQgc28gdGhhdCB3aGVuIHRoZSByZWxlYXNlKCkKKwkgKiBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoYXQgd2lsbCB0cmlnZ2VyIGEgcHJvcGVyIGRldGFjaCgpLiAqLworCisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworI2lmZGVmIFBDTUNJQV9ERUJVRworCQlwcmludGsoS0VSTl9ERUJVRyAid2wzNTAxX2NzOiBkZXRhY2ggcG9zdHBvbmVkLCAnJXMnICIKKwkJICAgICAgICJzdGlsbCBsb2NrZWRcbiIsIGxpbmstPmRldi0+ZGV2X25hbWUpOworI2VuZGlmCisJCWdvdG8gb3V0OworCX0KKworCS8qIEJyZWFrIHRoZSBsaW5rIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCWlmIChsaW5rLT5oYW5kbGUpCisJCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisJLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgcGllY2VzICovCisJKmxpbmtwID0gbGluay0+bmV4dDsKKworCWlmIChsaW5rLT5wcml2KQorCQlmcmVlX25ldGRldihsaW5rLT5wcml2KTsKKwlrZnJlZShsaW5rKTsKK291dDoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJsY3B5KHdycXUtPm5hbWUsICJJRUVFIDgwMi4xMS1EUyIsIHNpemVvZih3cnF1LT5uYW1lKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX3NldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJaW50IGNoYW5uZWwgPSB3cnF1LT5mcmVxLm07CisJaW50IHJjID0gLUVJTlZBTDsKKworCWlmIChpd192YWxpZF9jaGFubmVsKHRoaXMtPnJlZ19kb21haW4sIGNoYW5uZWwpKSB7CisJCXRoaXMtPmNoYW4gPSBjaGFubmVsOworCQlyYyA9IHdsMzUwMV9yZXNldChkZXYpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwl3cnF1LT5mcmVxLm0gPSB3bDM1MDFfY2hhbjJmcmVxW3RoaXMtPmNoYW4gLSAxXSAqIDEwMDAwMDsKKwl3cnF1LT5mcmVxLmUgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJjID0gLUVJTlZBTDsKKworCWlmICh3cnF1LT5tb2RlID09IElXX01PREVfSU5GUkEgfHwKKwkgICAgd3JxdS0+bW9kZSA9PSBJV19NT0RFX0FESE9DIHx8CisJICAgIHdycXUtPm1vZGUgPT0gSVdfTU9ERV9BVVRPKSB7CisJCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKworCQl0aGlzLT5uZXRfdHlwZSA9IHdycXUtPm1vZGU7CisJCXJjID0gd2wzNTAxX3Jlc2V0KGRldik7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKworCXdycXUtPm1vZGUgPSB0aGlzLT5uZXRfdHlwZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKworCXdycXUtPnNlbnMudmFsdWUgPSB0aGlzLT5yc3NpOworCXdycXUtPnNlbnMuZGlzYWJsZWQgPSAhd3JxdS0+c2Vucy52YWx1ZTsKKwl3cnF1LT5zZW5zLmZpeGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKWV4dHJhOworCisJLyogU2V0IHRoZSBsZW5ndGggKHZlcnkgaW1wb3J0YW50IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSAqLworCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKCpyYW5nZSk7CisKKwkvKiBTZXQgYWxsIHRoZSBpbmZvIHdlIGRvbid0IGNhcmUgb3IgZG9uJ3Qga25vdyBhYm91dCB0byB6ZXJvICovCisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YoKnJhbmdlKSk7CisKKwkvKiBTZXQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbiB2ZXJzaW9ucyAqLworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkCT0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZQk9IDE7CisJcmFuZ2UtPnRocm91Z2hwdXQJCT0gMiAqIDEwMDAgKiAxMDAwOyAgICAgLyogfjIgTWIvcyAqLworCS8qIEZJWE1FOiBzdHVkeSB0aGUgY29kZSB0byBmaWxsIGluIG1vcmUgZmllbGRzLi4uICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX3NldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCXN0YXRpYyBjb25zdCB1OCBiY2FzdFtFVEhfQUxFTl0gPSB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfTsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJLyogRklYTUU6IHdlIHN1cHBvcnQgb3RoZXIgQVJQSFJEcy4uLiovCisJaWYgKHdycXUtPmFwX2FkZHIuc2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikKKwkJZ290byBvdXQ7CisJaWYgKCFtZW1jbXAoYmNhc3QsIHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgRVRIX0FMRU4pKSB7CisJCS8qIEZJWE1FOiByZXNjYW4/ICovCisJfSBlbHNlCisJCW1lbWNweSh0aGlzLT5ic3NpZCwgd3JxdS0+YXBfYWRkci5zYV9kYXRhLCBFVEhfQUxFTik7CisJCS8qIEZJWE1FOiByZXNjYW4/IGRlYXNzb2MgJiBzY2FuPyAqLworCXJjID0gMDsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCisJd3JxdS0+YXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJbWVtY3B5KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgdGhpcy0+YnNzaWQsIEVUSF9BTEVOKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCS8qCisJICogRklYTUU6IHRyaWdnZXIgc2Nhbm5pbmcgd2l0aCBhIHJlc2V0LCB5ZXMsIEknbSBsYXp5CisJICovCisJcmV0dXJuIHdsMzUwMV9yZXNldChkZXYpOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCWludCBpOworCWNoYXIgKmN1cnJlbnRfZXYgPSBleHRyYTsKKwlzdHJ1Y3QgaXdfZXZlbnQgaXdlOworCisJZm9yIChpID0gMDsgaSA8IHRoaXMtPmJzc19jbnQ7ICsraSkgeworCQlpd2UuY21kCQkJPSBTSU9DR0lXQVA7CisJCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCB0aGlzLT5ic3Nfc2V0W2ldLmJzc2lkLCBFVEhfQUxFTik7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LAorCQkJCQkJICBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsCisJCQkJCQkgICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKwkJaXdlLmNtZAkJICA9IFNJT0NHSVdFU1NJRDsKKwkJaXdlLnUuZGF0YS5mbGFncyAgPSAxOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHRoaXMtPmJzc19zZXRbaV0uc3NpZC5lbC5sZW47CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LAorCQkJCQkJICBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsCisJCQkJCQkgICZpd2UsCisJCQkJCQkgIHRoaXMtPmJzc19zZXRbaV0uc3NpZC5lc3NpZCk7CisJCWl3ZS5jbWQJICAgPSBTSU9DR0lXTU9ERTsKKwkJaXdlLnUubW9kZSA9IHRoaXMtPmJzc19zZXRbaV0uYnNzX3R5cGU7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LAorCQkJCQkJICBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsCisJCQkJCQkgICZpd2UsIElXX0VWX1VJTlRfTEVOKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworCQlpd2UudS5mcmVxLm0gPSB0aGlzLT5ic3Nfc2V0W2ldLmRzX3BzZXQuY2hhbjsKKwkJaXdlLnUuZnJlcS5lID0gMDsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsCisJCQkJCQkgIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwKKwkJCQkJCSAgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworCQlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKKwkJaWYgKHRoaXMtPmJzc19zZXRbaV0uY2FwX2luZm8gJiBXTDM1MDFfTUdNVF9DQVBBQklMSVRZX1BSSVZBQ1kpCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisJCWVsc2UKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gMDsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsCisJCQkJCQkgIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwKKwkJCQkJCSAgJml3ZSwgTlVMTCk7CisJfQorCS8qIExlbmd0aCBvZiBkYXRhICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSAoY3VycmVudF9ldiAtIGV4dHJhKTsKKwl3cnF1LT5kYXRhLmZsYWdzID0gMDsgLyogRklYTUU6IHNldCBwcm9wZXJseSB0aGVzZSBmbGFncyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKworCWlmICh3cnF1LT5kYXRhLmZsYWdzKSB7CisJCWl3X3NldF9tZ210X2luZm9fZWxlbWVudChJV19NR01UX0lORk9fRUxFTUVOVF9TU0lELAorCQkJCQkgJnRoaXMtPmVzc2lkLmVsLAorCQkJCQkgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKwl9IGVsc2UgeyAvKiBXZSBhY2NlcHQgYW55IEVTU0lEICovCisJCWl3X3NldF9tZ210X2luZm9fZWxlbWVudChJV19NR01UX0lORk9fRUxFTUVOVF9TU0lELAorCQkJCQkgJnRoaXMtPmVzc2lkLmVsLCAiQU5ZIiwgMyk7CisJfQorCXJldHVybiB3bDM1MDFfcmVzZXQoZGV2KTsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJd3JxdS0+ZXNzaWQuZmxhZ3MgID0gMTsKKwl3cnF1LT5lc3NpZC5sZW5ndGggPSB0aGlzLT5lc3NpZC5lbC5sZW47CisJbWVtY3B5KGV4dHJhLCB0aGlzLT5lc3NpZC5lc3NpZCwgdGhpcy0+ZXNzaWQuZWwubGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX3NldF9uaWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBzaXplb2YodGhpcy0+bmljaykpCisJCXJldHVybiAtRTJCSUc7CisJc3RybGNweSh0aGlzLT5uaWNrLCBleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCisJc3RybGNweShleHRyYSwgdGhpcy0+bmljaywgMzIpOworCXdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCS8qCisJICogRklYTUU6IGhhdmUgdG8gc2VlIGZyb20gd2hlcmUgdG8gZ2V0IHRoaXMgaW5mbywgcGVyaGFwcyB0aGlzIGNhcmQKKwkgKiB3b3JrcyBhdCAxIE1iaXQvcyB0b28uLi4gZm9yIG5vdyBsZWF2ZSBhdCAyIE1iaXQvcyB0aGF0IGlzIHRoZSBtb3N0CisJICogY29tbW9uIHdpdGggdGhlIFBsYW5ldCBBY2Nlc3MgUG9pbnRzLiAtYWNtZQorCSAqLworCXdycXUtPmJpdHJhdGUudmFsdWUgPSAyMDAwMDAwOworCXdycXUtPmJpdHJhdGUuZml4ZWQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfcnRzX3RocmVzaG9sZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwl1MTYgdGhyZXNob2xkOyAvKiBzaXplIGNoZWNrZWQ6IGl0IGlzIHUxNiAqLworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfUlRTX1RIUkVTSE9MRCwKKwkJCQkgICAgICAmdGhyZXNob2xkLCBzaXplb2YodGhyZXNob2xkKSk7CisJaWYgKCFyYykgeworCQl3cnF1LT5ydHMudmFsdWUgPSB0aHJlc2hvbGQ7CisJCXdycXUtPnJ0cy5kaXNhYmxlZCA9IHRocmVzaG9sZCA+PSAyMzQ3OworCQl3cnF1LT5ydHMuZml4ZWQgPSAxOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9mcmFnX3RocmVzaG9sZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXUxNiB0aHJlc2hvbGQ7IC8qIHNpemUgY2hlY2tlZDogaXQgaXMgdTE2ICovCisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCWludCByYyA9IHdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9GUkFHX1RIUkVTSE9MRCwKKwkJCQkgICAgICAmdGhyZXNob2xkLCBzaXplb2YodGhyZXNob2xkKSk7CisJaWYgKCFyYykgeworCQl3cnF1LT5mcmFnLnZhbHVlID0gdGhyZXNob2xkOworCQl3cnF1LT5mcmFnLmRpc2FibGVkID0gdGhyZXNob2xkID49IDIzNDY7CisJCXdycXUtPmZyYWcuZml4ZWQgPSAxOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF90eHBvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJdTE2IHR4cG93OworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLAorCQkJCSAgICAgIFdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX1RYX1BXUl9MRVZFTCwKKwkJCQkgICAgICAmdHhwb3csIHNpemVvZih0eHBvdykpOworCWlmICghcmMpIHsKKwkJd3JxdS0+dHhwb3dlci52YWx1ZSA9IHR4cG93OworCQl3cnF1LT50eHBvd2VyLmRpc2FibGVkID0gMDsKKwkJLyoKKwkJICogRnJvbSB0aGUgTUlCIHZhbHVlcyBJIHRoaW5rIHRoaXMgY2FuIGJlIGNvbmZpZ3VyYWJsZSwKKwkJICogYXMgaXQgbGlzdHMgc2V2ZXJhbCB0eCBwb3dlciBsZXZlbHMgLWFjbWUKKwkJICovCisJCXdycXUtPnR4cG93ZXIuZml4ZWQgPSAwOworCQl3cnF1LT50eHBvd2VyLmZsYWdzID0gSVdfVFhQT1dfTVdBVFQ7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwl1OCByZXRyeTsgLyogc2l6ZSBjaGVja2VkOiBpdCBpcyB1OCAqLworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLAorCQkJCSAgICAgIFdMMzUwMV9NSUJfQVRUUl9MT05HX1JFVFJZX0xJTUlULAorCQkJCSAgICAgICZyZXRyeSwgc2l6ZW9mKHJldHJ5KSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwlpZiAod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9NQVgpIHsKKwkJd3JxdS0+cmV0cnkuZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX01BWDsKKwkJZ290byBzZXRfdmFsdWU7CisJfQorCXJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX1NIT1JUX1JFVFJZX0xJTUlULAorCQkJCSAgJnJldHJ5LCBzaXplb2YocmV0cnkpKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9NSU47CitzZXRfdmFsdWU6CisJd3JxdS0+cmV0cnkudmFsdWUgPSByZXRyeTsKKwl3cnF1LT5yZXRyeS5kaXNhYmxlZCA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXU4IGltcGxlbWVudGVkLCByZXN0cmljdGVkLCBrZXlzWzEwMF0sIGxlbl9rZXlzLCB0b2NvcHk7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCWludCByYyA9IHdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsCisJCQkJICAgICAgV0wzNTAxX01JQl9BVFRSX1BSSVZfT1BUX0lNUExFTUVOVEVELAorCQkJCSAgICAgICZpbXBsZW1lbnRlZCwgc2l6ZW9mKGltcGxlbWVudGVkKSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwlpZiAoIWltcGxlbWVudGVkKSB7CisJCXdycXUtPmVuY29kaW5nLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQlnb3RvIG91dDsKKwl9CisJcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfRVhDTFVERV9VTkVOQ1JZUFRFRCwKKwkJCQkgICZyZXN0cmljdGVkLCBzaXplb2YocmVzdHJpY3RlZCkpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisJd3JxdS0+ZW5jb2RpbmcuZmxhZ3MgPSByZXN0cmljdGVkID8gSVdfRU5DT0RFX1JFU1RSSUNURUQgOgorCQkJCQkgICAgSVdfRU5DT0RFX09QRU47CisJcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfV0VQX0tFWV9NQVBQSU5HU19MRU4sCisJCQkJICAmbGVuX2tleXMsIHNpemVvZihsZW5fa2V5cykpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisJcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfV0VQX0tFWV9NQVBQSU5HUywKKwkJCQkgIGtleXMsIGxlbl9rZXlzKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXRvY29weSA9IG1pbl90KHU4LCBsZW5fa2V5cywgd3JxdS0+ZW5jb2RpbmcubGVuZ3RoKTsKKwl0b2NvcHkgPSBtaW5fdCh1OCwgdG9jb3B5LCAxMDApOworCXdycXUtPmVuY29kaW5nLmxlbmd0aCA9IHRvY29weTsKKwltZW1zZXQoZXh0cmEsIDAsIHRvY29weSk7CisJbWVtY3B5KGV4dHJhLCBrZXlzLCB0b2NvcHkpOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwl1OCBwd3Jfc3RhdGU7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCWludCByYyA9IHdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsCisJCQkJICAgICAgV0wzNTAxX01JQl9BVFRSX0NVUlJFTlRfUFdSX1NUQVRFLAorCQkJCSAgICAgICZwd3Jfc3RhdGUsIHNpemVvZihwd3Jfc3RhdGUpKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXdycXUtPnBvd2VyLmRpc2FibGVkID0gIXB3cl9zdGF0ZTsKKwl3cnF1LT5wb3dlci5mbGFncyA9IElXX1BPV0VSX09OOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJd2wzNTAxX2hhbmRsZXJbXSA9IHsKKwlbU0lPQ0dJV05BTUUJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X25hbWUsCisJW1NJT0NTSVdGUkVRCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX3NldF9mcmVxLAorCVtTSU9DR0lXRlJFUQktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfZnJlcSwKKwlbU0lPQ1NJV01PREUJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfc2V0X21vZGUsCisJW1NJT0NHSVdNT0RFCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9tb2RlLAorCVtTSU9DR0lXU0VOUwktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfc2VucywKKwlbU0lPQ0dJV1JBTkdFCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9yYW5nZSwKKwlbU0lPQ1NJV1NQWQktIFNJT0NJV0ZJUlNUXSA9IGl3X2hhbmRsZXJfc2V0X3NweSwKKwlbU0lPQ0dJV1NQWQktIFNJT0NJV0ZJUlNUXSA9IGl3X2hhbmRsZXJfZ2V0X3NweSwKKwlbU0lPQ1NJV1RIUlNQWQktIFNJT0NJV0ZJUlNUXSA9IGl3X2hhbmRsZXJfc2V0X3RocnNweSwKKwlbU0lPQ0dJV1RIUlNQWQktIFNJT0NJV0ZJUlNUXSA9IGl3X2hhbmRsZXJfZ2V0X3RocnNweSwKKwlbU0lPQ1NJV0FQCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX3NldF93YXAsCisJW1NJT0NHSVdBUAktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfd2FwLAorCVtTSU9DU0lXU0NBTgktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9zZXRfc2NhbiwKKwlbU0lPQ0dJV1NDQU4JLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3NjYW4sCisJW1NJT0NTSVdFU1NJRAktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9zZXRfZXNzaWQsCisJW1NJT0NHSVdFU1NJRAktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfZXNzaWQsCisJW1NJT0NTSVdOSUNLTgktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9zZXRfbmljaywKKwlbU0lPQ0dJV05JQ0tOCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9uaWNrLAorCVtTSU9DR0lXUkFURQktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfcmF0ZSwKKwlbU0lPQ0dJV1JUUwktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfcnRzX3RocmVzaG9sZCwKKwlbU0lPQ0dJV0ZSQUcJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X2ZyYWdfdGhyZXNob2xkLAorCVtTSU9DR0lXVFhQT1cJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3R4cG93LAorCVtTSU9DR0lXUkVUUlkJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3JldHJ5LAorCVtTSU9DR0lXRU5DT0RFCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9lbmNvZGUsCisJW1NJT0NHSVdQT1dFUgktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfcG93ZXIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHdsMzUwMV9oYW5kbGVyX2RlZiA9IHsKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKHdsMzUwMV9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKwkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKXdsMzUwMV9oYW5kbGVyLAorCS5zcHlfb2Zmc2V0CT0gb2Zmc2V0b2Yoc3RydWN0IHdsMzUwMV9jYXJkLCBzcHlfZGF0YSksCit9OworCisvKioKKyAqIHdsMzUwMV9hdHRhY2ggLSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlcgorICoKKyAqIENyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3IKKyAqIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCBDYXJkIFNlcnZpY2VzLgorICoKKyAqIFRoZSBkZXZfbGluayBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseSBjb25maWd1cmUgdGhlCisgKiBjYXJkIGF0IHRoaXMgcG9pbnQgLS0gd2Ugd2FpdCB1bnRpbCB3ZSByZWNlaXZlIGEgY2FyZCBpbnNlcnRpb24gZXZlbnQuCisgKi8KK3N0YXRpYyBkZXZfbGlua190ICp3bDM1MDFfYXR0YWNoKHZvaWQpCit7CisJY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisJZGV2X2xpbmtfdCAqbGluazsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCByZXQ7CisKKwkvKiBJbml0aWFsaXplIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSAqLworCWxpbmsgPSBrbWFsbG9jKHNpemVvZigqbGluayksIEdGUF9LRVJORUwpOworCWlmICghbGluaykKKwkJZ290byBvdXQ7CisJbWVtc2V0KGxpbmssIDAsIHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCkpOworCisJLyogVGhlIGlvIHN0cnVjdHVyZSBkZXNjcmliZXMgSU8gcG9ydCBtYXBwaW5nICovCisJbGluay0+aW8uTnVtUG9ydHMxCT0gMTY7CisJbGluay0+aW8uQXR0cmlidXRlczEJPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwlsaW5rLT5pby5JT0FkZHJMaW5lcwk9IDU7CisKKwkvKiBJbnRlcnJ1cHQgc2V0dXAgKi8KKwlsaW5rLT5pcnEuQXR0cmlidXRlcwk9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKwlsaW5rLT5pcnEuSVJRSW5mbzEJPSBJUlFfTEVWRUxfSUQ7CisJbGluay0+aXJxLkhhbmRsZXIgPSB3bDM1MDFfaW50ZXJydXB0OworCisJLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiAqLworCWxpbmstPmNvbmYuQXR0cmlidXRlcwk9IENPTkZfRU5BQkxFX0lSUTsKKwlsaW5rLT5jb25mLlZjYwkJPSA1MDsKKwlsaW5rLT5jb25mLkludFR5cGUJPSBJTlRfTUVNT1JZX0FORF9JTzsKKwlsaW5rLT5jb25mLkNvbmZpZ0luZGV4CT0gMTsKKwlsaW5rLT5jb25mLlByZXNlbnQJPSBQUkVTRU5UX09QVElPTjsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgd2wzNTAxX2NhcmQpKTsKKwlpZiAoIWRldikKKwkJZ290byBvdXRfbGluazsKKwlkZXYtPm9wZW4JCT0gd2wzNTAxX29wZW47CisJZGV2LT5zdG9wCQk9IHdsMzUwMV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHdsMzUwMV9oYXJkX3N0YXJ0X3htaXQ7CisJZGV2LT50eF90aW1lb3V0CQk9IHdsMzUwMV90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSA1ICogSFo7CisJZGV2LT5nZXRfc3RhdHMJCT0gd2wzNTAxX2dldF9zdGF0czsKKwlkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IHdsMzUwMV9nZXRfd2lyZWxlc3Nfc3RhdHM7CisJZGV2LT53aXJlbGVzc19oYW5kbGVycwk9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikmd2wzNTAxX2hhbmRsZXJfZGVmOworCVNFVF9FVEhUT09MX09QUyhkZXYsICZvcHMpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlsaW5rLT5wcml2ID0gbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworCisJLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisJbGluay0+bmV4dAkJID0gd2wzNTAxX2Rldl9saXN0OworCXdsMzUwMV9kZXZfbGlzdAkJID0gbGluazsKKwljbGllbnRfcmVnLmRldl9pbmZvCSA9ICZ3bDM1MDFfZGV2X2luZm87CisJY2xpZW50X3JlZy5FdmVudE1hc2sJID0gQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfAorCQkJCSAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwKKwkJCQkgICBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwkJCQkgICBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCQkJCSAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfAorCQkJCSAgIENTX0VWRU5UX1BNX1JFU1VNRTsKKwljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSB3bDM1MDFfZXZlbnQ7CisJY2xpZW50X3JlZy5WZXJzaW9uCSA9IDB4MDIxMDsKKwljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworCWlmIChyZXQpIHsKKwkJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwkJd2wzNTAxX2RldGFjaChsaW5rKTsKKwkJbGluayA9IE5VTEw7CisJfQorb3V0OgorCXJldHVybiBsaW5rOworb3V0X2xpbms6CisJa2ZyZWUobGluayk7CisJbGluayA9IE5VTEw7CisJZ290byBvdXQ7Cit9CisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworLyoqCisgKiB3bDM1MDFfY29uZmlnIC0gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0IGFuZCBtYWtlIGV0aCBkZXZpY2UgYXZhaWxhYmxlCisgKiBAbGluayAtIEZJTExfSU4KKyAqCisgKiB3bDM1MDFfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50IGlzCisgKiByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUgZXRoZXJuZXQgZGV2aWNlCisgKiBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQgd2wzNTAxX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworCXR1cGxlX3QgdHVwbGU7CisJY2lzcGFyc2VfdCBwYXJzZTsKKwljbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCWludCBpID0gMCwgaiwgbGFzdF9mbiwgbGFzdF9yZXQ7CisJdW5zaWduZWQgY2hhciBiZls2NF07CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzOworCisJLyogVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWcgcmVnaXN0ZXJzLiAqLworCXR1cGxlLkF0dHJpYnV0ZXMJPSAwOworCXR1cGxlLkRlc2lyZWRUdXBsZQk9IENJU1RQTF9DT05GSUc7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCXR1cGxlLlR1cGxlRGF0YQkJPSBiZjsKKwl0dXBsZS5UdXBsZURhdGFNYXgJPSBzaXplb2YoYmYpOworCXR1cGxlLlR1cGxlT2Zmc2V0CT0gMDsKKwlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisJbGluay0+Y29uZi5Db25maWdCYXNlCT0gcGFyc2UuY29uZmlnLmJhc2U7CisJbGluay0+Y29uZi5QcmVzZW50CT0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCisJLyogQ29uZmlndXJlIGNhcmQgKi8KKwlsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisJLyogVHJ5IGFsbG9jYXRpbmcgSU8gcG9ydHMuICBUaGlzIHRyaWVzIGEgZmV3IGZpeGVkIGFkZHJlc3Nlcy4gIElmIHlvdQorCSAqIHdhbnQsIHlvdSBjYW4gYWxzbyByZWFkIHRoZSBjYXJkJ3MgY29uZmlnIHRhYmxlIHRvIHBpY2sgYWRkcmVzc2VzIC0tCisJICogc2VlIHRoZSBzZXJpYWwgZHJpdmVyIGZvciBhbiBleGFtcGxlLiAqLworCisJZm9yIChqID0gMHgyODA7IGogPCAweDQwMDsgaiArPSAweDIwKSB7CisJCS8qIFRoZSAnXjB4MzAwJyBpcyBzbyB0aGF0IHdlIHByb2JlIDB4MzAwLTB4M2ZmIGZpcnN0LCB0aGVuCisJCSAqIDB4MjAwLTB4MmZmLCBhbmQgc28gb24sIGJlY2F1c2UgdGhpcyBzZWVtcyBzYWZlciAqLworCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBqOworCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBsaW5rLT5pby5CYXNlUG9ydDEgKyAweDEwOworCQlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCQlpZiAoaSA9PSBDU19TVUNDRVNTKQorCQkJYnJlYWs7CisJfQorCWlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwkJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0SU8sIGkpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKiBOb3cgYWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFjdHVhbGx5CisJICogYXNzaWduIGEgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LiAqLworCisJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOworCisJLyogVGhpcyBhY3R1YWxseSBjb25maWd1cmVzIHRoZSBQQ01DSUEgc29ja2V0IC0tIHNldHRpbmcgdXAgdGhlIEkvTworCSAqIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZy4gICovCisKKwlDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSk7CisKKwlkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKwlkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIndsMzUwMV9jczogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJdGhpcyA9IGRldi0+cHJpdjsKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHRoZSBkZXZfbm9kZV90IHN0cnVjdHVyZShzKSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYW5kCisJICogYXJyYW5nZWQgaW4gYSBsaW5rZWQgbGlzdCBhdCBsaW5rLT5kZXYuCisJICovCisJbGluay0+ZGV2ID0gJnRoaXMtPm5vZGU7CisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKworCXRoaXMtPmJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKCF3bDM1MDFfZ2V0X2ZsYXNoX21hY19hZGRyKHRoaXMpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW50IHJlYWQgTUFDIGFkZHIgaW4gZmxhc2ggUk9NP1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlzdHJjcHkodGhpcy0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKworCS8qIHByaW50IHByb2JlIGluZm9ybWF0aW9uICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHdsMzUwMSBAIDB4JTMuM3gsIElSUSAlZCwgTUFDIGFkZHIgaW4gZmxhc2ggUk9NOiIsCisJICAgICAgIGRldi0+bmFtZSwgdGhpcy0+YmFzZV9hZGRyLCAoaW50KWRldi0+aXJxKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSAoKGNoYXIgKikmdGhpcy0+bWFjX2FkZHIpW2ldOworCQlwcmludGsoIiVjJTAyeCIsIGkgPyAnOicgOiAnICcsIGRldi0+ZGV2X2FkZHJbaV0pOworCX0KKwlwcmludGsoIlxuIik7CisJLyoKKwkgKiBJbml0aWFsaXplIGNhcmQgcGFyYW1ldGVycyAtIGFkZGVkIGJ5IGpzcworCSAqLworCXRoaXMtPm5ldF90eXBlCQk9IElXX01PREVfSU5GUkE7CisJdGhpcy0+YnNzX2NudAkJPSAwOworCXRoaXMtPmpvaW5fc3RhX2Jzcwk9IDA7CisJdGhpcy0+YWRob2NfdGltZXMJPSAwOworCWl3X3NldF9tZ210X2luZm9fZWxlbWVudChJV19NR01UX0lORk9fRUxFTUVOVF9TU0lELCAmdGhpcy0+ZXNzaWQuZWwsCisJCQkJICJBTlkiLCAzKTsKKwl0aGlzLT5jYXJkX25hbWVbMF0JPSAnXDAnOworCXRoaXMtPmZpcm13YXJlX2RhdGVbMF0JPSAnXDAnOworCXRoaXMtPnJzc2kJCT0gMjU1OworCXRoaXMtPmNoYW4JCT0gaXdfZGVmYXVsdF9jaGFubmVsKHRoaXMtPnJlZ19kb21haW4pOworCXN0cmxjcHkodGhpcy0+bmljaywgIlBsYW5ldCBXTDM1MDEiLCBzaXplb2YodGhpcy0+bmljaykpOworCXNwaW5fbG9ja19pbml0KCZ0aGlzLT5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGlzLT53YWl0KTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCWdvdG8gb3V0OworY3NfZmFpbGVkOgorCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgorCXdsMzUwMV9yZWxlYXNlKGxpbmspOworb3V0OgorCXJldHVybjsKK30KKworLyoqCisgKiB3bDM1MDFfcmVsZWFzZSAtIHVucmVnaXN0ZXIgdGhlIG5ldCwgcmVsZWFzZSBQQ01DSUEgY29uZmlndXJhdGlvbgorICogQGFyZyAtIGxpbmsKKyAqCisgKiBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgd2wzNTAxX3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldCBkZXZpY2UsCisgKiBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzIHN0aWxsIG9wZW4sIHRoaXMKKyAqIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKyAqLworc3RhdGljIHZvaWQgd2wzNTAxX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKworCS8qIFVubGluayB0aGUgZGV2aWNlIGNoYWluICovCisJaWYgKGxpbmstPmRldikgeworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlsaW5rLT5kZXYgPSBOVUxMOworCX0KKworCS8qIERvbid0IGJvdGhlciBjaGVja2luZyB0byBzZWUgaWYgdGhlc2Ugc3VjY2VlZCBvciBub3QgKi8KKwlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCXBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCisvKioKKyAqIHdsMzUwMV9ldmVudCAtIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyCisgKiBAZXZlbnQgLSBldmVudAorICogQHByaSAtIHByaW9yaXR5CisgKiBAYXJncyAtIGFyZ3VtZW50cyBmb3IgdGhpcyBldmVudAorICoKKyAqIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyIHN0dWZmIHRvIHJ1bgorICogYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuIEEgQ0FSRF9SRU1PVkFMIGV2ZW50IGFsc28gc2V0cyBzb21lIGZsYWdzIHRvCisgKiBkaXNjb3VyYWdlIHRoZSBuZXQgZHJpdmVycyBmcm9tIHRyeWluZyB0byB0YWxrIHRvIHRoZSBjYXJkIGFueSBtb3JlLgorICoKKyAqIFdoZW4gYSBDQVJEX1JFTU9WQUwgZXZlbnQgaXMgcmVjZWl2ZWQsIHdlIGltbWVkaWF0ZWx5IHNldCBhIGZsYWcgdG8gYmxvY2sKKyAqIGZ1dHVyZSBhY2Nlc3NlcyB0byB0aGlzIGRldmljZS4gQWxsIHRoZSBmdW5jdGlvbnMgdGhhdCBhY3R1YWxseSBhY2Nlc3MgdGhlCisgKiBkZXZpY2Ugc2hvdWxkIGNoZWNrIHRoaXMgZmxhZyB0byBtYWtlIHN1cmUgdGhlIGNhcmQgaXMgc3RpbGwgcHJlc2VudC4KKyAqLworc3RhdGljIGludCB3bDM1MDFfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaSwgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworCWRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwkJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQl3aGlsZSAobGluay0+b3BlbiA+IDApCisJCQkJd2wzNTAxX2Nsb3NlKGRldik7CisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCQl3bDM1MDFfcmVsZWFzZShsaW5rKTsKKwkJfQorCQlicmVhazsKKwljYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwkJd2wzNTAxX2NvbmZpZyhsaW5rKTsKKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkJd2wzNTAxX3B3cl9tZ210KGRldi0+cHJpdiwgV0wzNTAxX1NVU1BFTkQpOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQlpZiAobGluay0+b3BlbikKKwkJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCQlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkJd2wzNTAxX3B3cl9tZ210KGRldi0+cHJpdiwgV0wzNTAxX1JFU1VNRSk7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkJCWlmIChsaW5rLT5vcGVuKSB7CisJCQkJd2wzNTAxX3Jlc2V0KGRldik7CisJCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHdsMzUwMV9kcml2ZXIgPSB7CisJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCisJLmRydiAgICAgICAgICAgID0geworCQkubmFtZSAgID0gIndsMzUwMV9jcyIsCisJfSwKKwkuYXR0YWNoICAgICAgICAgPSB3bDM1MDFfYXR0YWNoLAorCS5kZXRhY2ggICAgICAgICA9IHdsMzUwMV9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3bDM1MDFfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmd2wzNTAxX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3bDM1MDFfZXhpdF9tb2R1bGUodm9pZCkKK3sKKwlkcHJpbnRrKDAsICI6IHVubG9hZGluZyIpOworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmd2wzNTAxX2RyaXZlcik7CisJQlVHX09OKHdsMzUwMV9kZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQod2wzNTAxX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHdsMzUwMV9leGl0X21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIkZveCBDaGVuIDxtaGNoZW5AZ29sZi5jY2wuaXRyaS5vcmcudHc+LCAiCisJICAgICAgIkFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiwiCisJICAgICAgIkd1c3Rhdm8gTmllbWV5ZXIgPG5pZW1leWVyQGNvbmVjdGl2YS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBsYW5ldCB3bDM1MDEgd2lyZWxlc3MgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC95ZWxsb3dmaW4uYyBiL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYTkyNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC95ZWxsb3dmaW4uYwpAQCAtMCwwICsxLDE0OTkgQEAKKy8qIHllbGxvd2Zpbi5jOiBBIFBhY2tldCBFbmdpbmVzIEctTklDIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguICovCisvKgorCVdyaXR0ZW4gMTk5Ny0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisJdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKwlEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisJcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorCWEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisKKwlUaGlzIGRyaXZlciBpcyBmb3IgdGhlIFBhY2tldCBFbmdpbmVzIEctTklDIFBDSSBHaWdhYml0IEV0aGVybmV0IGFkYXB0ZXIuCisJSXQgYWxzbyBzdXBwb3J0cyB0aGUgU3ltYmlvcyBMb2dpYyB2ZXJzaW9uIG9mIHRoZSBzYW1lIGNoaXAgY29yZS4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCVN1cHBvcnQgYW5kIHVwZGF0ZXMgYXZhaWxhYmxlIGF0CisJaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay95ZWxsb3dmaW4uaHRtbAorCisKKwlMaW51eCBrZXJuZWwgY2hhbmdlbG9nOgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlMSzEuMS4xIChqZ2FyemlrKTogUG9ydCB0byAyLjQga2VybmVsCisKKwlMSzEuMS4yIChqZ2FyemlrKToKKwkqIE1lcmdlIGluIGJlY2tlciB2ZXJzaW9uIDEuMDUKKworCUxLMS4xLjMgKGpnYXJ6aWspOgorCSogVmFyaW91cyBjbGVhbnVwcworCSogVXBkYXRlIHllbGxvd2Zpbl90aW1lciB0byBjb3JyZWN0bHkgY2FsY3VsYXRlIGR1cGxleC4KKwkoc3VnZ2VzdGVkIGJ5IE1hbmZyZWQgU3ByYXVsKQorCisJTEsxLjEuNCAodmFsQG5tdC5lZHUpOgorCSogRml4IHRocmVlIGVuZGlhbi1uZXNzIGJ1Z3MKKwkqIFN1cHBvcnQgZHVhbCBmdW5jdGlvbiBTWU01M0M4ODVFIGV0aGVybmV0IGNoaXAKKwkKKwlMSzEuMS41ICh2YWxAbm10LmVkdSk6CisJKiBGaXggZm9yY2VkIGZ1bGwtZHVwbGV4IGJ1ZyBJIGludHJvZHVjZWQKKworCUxLMS4xLjYgKHZhbEBubXQuZWR1KToKKwkqIE9ubHkgcHJpbnQgd2FybmluZyBvbiB0cnVseSAib3ZlcnNpemVkIiBwYWNrZXRzCisJKiBGaXggdGhlb3JldGljYWwgYnVnIG9uIGdpZ2FiaXQgY2FyZHMgLSByZXR1cm4gdG8gMS4xLjMgYmVoYXZpb3IKKwkKKyovCisKKyNkZWZpbmUgRFJWX05BTUUJInllbGxvd2ZpbiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMDUrTEsxLjEuNiIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIkZlYiAxMSwgMjAwMiIKKworI2RlZmluZSBQRlggRFJWX05BTUUgIjogIgorCisvKiBUaGUgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLgorICAgVGhlc2UgbWF5IGJlIG1vZGlmaWVkIHdoZW4gYSBkcml2ZXIgbW9kdWxlIGlzIGxvYWRlZC4qLworCitzdGF0aWMgaW50IGRlYnVnID0gMTsJCQkvKiAxIG5vcm1hbCBtZXNzYWdlcywgMCBxdWlldCAuLiA3IHZlcmJvc2UuICovCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0LiAqLworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyMDsKK3N0YXRpYyBpbnQgbXR1OworI2lmZGVmIFlGX1BST1RPVFlQRQkJCS8qIFN1cHBvcnQgZm9yIHByb3RvdHlwZSBoYXJkd2FyZSBlcnJhdGEuICovCisvKiBTeXN0ZW0td2lkZSBjb3VudCBvZiBib2d1cy1yeCBmcmFtZXMuICovCitzdGF0aWMgaW50IGJvZ3VzX3J4Oworc3RhdGljIGludCBkbWFfY3RybCA9IDB4MDA0QTAyNjM7IAkJCS8qIENvbnN0cmFpbmVkIGJ5IGVycmF0YSAqLworc3RhdGljIGludCBmaWZvX2NmZyA9IDB4MDAyMDsJCQkJLyogQnlwYXNzIGV4dGVybmFsIFR4IEZJRk8uICovCisjZWxpZiBkZWZpbmVkKFlGX05FVykJCQkJCS8qIEEgZnV0dXJlIHBlcmZlY3QgYm9hcmQgOi0+LiAgKi8KK3N0YXRpYyBpbnQgZG1hX2N0cmwgPSAweDAwQ0FDMjc3OwkJCS8qIE92ZXJyaWRlIHdoZW4gbG9hZGluZyBtb2R1bGUhICovCitzdGF0aWMgaW50IGZpZm9fY2ZnID0gMHgwMDI4OworI2Vsc2UKK3N0YXRpYyBpbnQgZG1hX2N0cmwgPSAweDAwNEEwMjYzOyAJCQkvKiBDb25zdHJhaW5lZCBieSBlcnJhdGEgKi8KK3N0YXRpYyBpbnQgZmlmb19jZmcgPSAweDAwMjA7CQkJCS8qIEJ5cGFzcyBleHRlcm5hbCBUeCBGSUZPLiAqLworI2VuZGlmCisKKy8qIFNldCB0aGUgY29weSBicmVha3BvaW50IGZvciB0aGUgY29weS1vbmx5LXRpbnktZnJhbWVzIHNjaGVtZS4KKyAgIFNldHRpbmcgdG8gPiAxNTE0IGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoaXMgZmVhdHVyZS4gKi8KK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrOworCisvKiBVc2VkIHRvIHBhc3MgdGhlIG1lZGlhIHR5cGUsIGV0Yy4KKyAgIE5vIG1lZGlhIHR5cGVzIGFyZSBjdXJyZW50bHkgZGVmaW5lZC4gIFRoZXNlIGV4aXN0IGZvciBkcml2ZXIKKyAgIGludGVyb3BlcmFiaWxpdHkuCisqLworI2RlZmluZSBNQVhfVU5JVFMgOAkJCQkvKiBNb3JlIGFyZSBzdXBwb3J0ZWQsIGxpbWl0IG9ubHkgb24gb3B0aW9ucyAqLworc3RhdGljIGludCBvcHRpb25zW01BWF9VTklUU10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OworCisvKiBEbyB1Z2x5IHdvcmthcm91bmQgZm9yIEdYIHNlcnZlciBjaGlwc2V0IGVycmF0YS4gKi8KK3N0YXRpYyBpbnQgZ3hfZml4OworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNldCBhdCBjb21waWxlIHRpbWUuICovCisKKy8qIEtlZXAgdGhlIHJpbmcgc2l6ZXMgYSBwb3dlciBvZiB0d28gZm9yIGVmZmljaWVuY3kuCisgICBNYWtpbmcgdGhlIFR4IHJpbmcgdG9vIGxvbmcgZGVjcmVhc2VzIHRoZSBlZmZlY3RpdmVuZXNzIG9mIGNoYW5uZWwKKyAgIGJvbmRpbmcgYW5kIHBhY2tldCBwcmlvcml0eS4KKyAgIFRoZXJlIGFyZSBubyBpbGwgZWZmZWN0cyBmcm9tIHRvby1sYXJnZSByZWNlaXZlIHJpbmdzLiAqLworI2RlZmluZSBUWF9SSU5HX1NJWkUJMTYKKyNkZWZpbmUgVFhfUVVFVUVfU0laRQkxMgkJLyogTXVzdCBiZSA+IDQgJiYgPD0gVFhfUklOR19TSVpFICovCisjZGVmaW5lIFJYX1JJTkdfU0laRQk2NAorI2RlZmluZSBTVEFUVVNfVE9UQUxfU0laRQlUWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCB0eF9zdGF0dXNfd29yZHMpCisjZGVmaW5lIFRYX1RPVEFMX1NJWkUJCTIqVFhfUklOR19TSVpFKnNpemVvZihzdHJ1Y3QgeWVsbG93ZmluX2Rlc2MpCisjZGVmaW5lIFJYX1RPVEFMX1NJWkUJCVJYX1JJTkdfU0laRSpzaXplb2Yoc3RydWN0IHllbGxvd2Zpbl9kZXNjKQorCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICgyKkhaKQorI2RlZmluZSBQS1RfQlVGX1NaCQkxNTM2CQkJLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIuKi8KKworI2RlZmluZSB5ZWxsb3dmaW5fZGVidWcgZGVidWcKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CQkvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLworI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KK0tFUk5fSU5GTyBEUlZfTkFNRSAiLmM6djEuMDUgIDEvMDkvMjAwMSAgV3JpdHRlbiBieSBEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPlxuIgorS0VSTl9JTkZPICIgIGh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsveWVsbG93ZmluLmh0bWxcbiIKK0tFUk5fSU5GTyAiICAodW5vZmZpY2lhbCAyLjQueCBwb3J0LCAiIERSVl9WRVJTSU9OICIsICIgRFJWX1JFTERBVEUgIilcbiI7CisKK01PRFVMRV9BVVRIT1IoIkRvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBhY2tldCBFbmdpbmVzIFllbGxvd2ZpbiBHLU5JQyBHaWdhYml0IEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0obWF4X2ludGVycnVwdF93b3JrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG10dSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkob3B0aW9ucywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShmdWxsX2R1cGxleCwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShneF9maXgsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pbnRlcnJ1cHRfd29yaywgIkctTklDIG1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworTU9EVUxFX1BBUk1fREVTQyhtdHUsICJHLU5JQyBNVFUgKGFsbCBib2FyZHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRy1OSUMgZGVidWcgbGV2ZWwgKDAtNykiKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfY29weWJyZWFrLCAiRy1OSUMgY29weSBicmVha3BvaW50IGZvciBjb3B5LW9ubHktdGlueS1mcmFtZXMiKTsKK01PRFVMRV9QQVJNX0RFU0Mob3B0aW9ucywgIkctTklDOiBCaXRzIDAtMzogbWVkaWEgdHlwZSwgYml0IDE3OiBmdWxsIGR1cGxleCIpOworTU9EVUxFX1BBUk1fREVTQyhmdWxsX2R1cGxleCwgIkctTklDIGZ1bGwgZHVwbGV4IHNldHRpbmcocykgKDEpIik7CitNT0RVTEVfUEFSTV9ERVNDKGd4X2ZpeCwgIkctTklDOiBlbmFibGUgR1ggc2VydmVyIGNoaXBzZXQgYnVnIHdvcmthcm91bmQgKDAtMSkiKTsKKworLyoKKwkJCQlUaGVvcnkgb2YgT3BlcmF0aW9uCisKK0kuIEJvYXJkIENvbXBhdGliaWxpdHkKKworVGhpcyBkZXZpY2UgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgUGFja2V0IEVuZ2luZXMgIlllbGxvd2ZpbiIgR2lnYWJpdAorRXRoZXJuZXQgYWRhcHRlci4gIFRoZSBHLU5JQyA2NC1iaXQgUENJIGNhcmQgaXMgc3VwcG9ydGVkLCBhcyB3ZWxsIGFzIHRoZSAKK1N5bWJpb3MgNTNDODg1RSBkdWFsIGZ1bmN0aW9uIGNoaXAuCisKK0lJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworCitQQ0kgYnVzIGRldmljZXMgYXJlIGNvbmZpZ3VyZWQgYnkgdGhlIHN5c3RlbSBhdCBib290IHRpbWUsIHNvIG5vIGp1bXBlcnMKK25lZWQgdG8gYmUgc2V0IG9uIHRoZSBib2FyZC4gIFRoZSBzeXN0ZW0gQklPUyBwcmVmZXJhYmx5IHNob3VsZCBhc3NpZ24gdGhlCitQQ0kgSU5UQSBzaWduYWwgdG8gYW4gb3RoZXJ3aXNlIHVudXNlZCBzeXN0ZW0gSVJRIGxpbmUuCitOb3RlOiBLZXJuZWwgdmVyc2lvbnMgZWFybGllciB0aGFuIDEuMy43MyBkbyBub3Qgc3VwcG9ydCBzaGFyZWQgUENJCitpbnRlcnJ1cHQgbGluZXMuCisKK0lJSS4gRHJpdmVyIG9wZXJhdGlvbgorCitJSUlhLiBSaW5nIGJ1ZmZlcnMKKworVGhlIFllbGxvd2ZpbiB1c2VzIHRoZSBEZXNjcmlwdG9yIEJhc2VkIERNQSBBcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGJ5IEFwcGxlLgorVGhpcyBpcyBhIGRlc2NyaXB0b3IgbGlzdCBzY2hlbWUgc2ltaWxhciB0byB0aGF0IHVzZWQgYnkgdGhlIEVFUHJvMTAwIGFuZAorVHVsaXAuICBUaGlzIGRyaXZlciB1c2VzIHR3byBzdGF0aWNhbGx5IGFsbG9jYXRlZCBmaXhlZC1zaXplIGRlc2NyaXB0b3IgbGlzdHMKK2Zvcm1lZCBpbnRvIHJpbmdzIGJ5IGEgYnJhbmNoIGZyb20gdGhlIGZpbmFsIGRlc2NyaXB0b3IgdG8gdGhlIGJlZ2lubmluZyBvZgordGhlIGxpc3QuICBUaGUgcmluZyBzaXplcyBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZSBieSBSWC9UWF9SSU5HX1NJWkUuCisKK1RoZSBkcml2ZXIgYWxsb2NhdGVzIGZ1bGwgZnJhbWUgc2l6ZSBza2J1ZmZzIGZvciB0aGUgUnggcmluZyBidWZmZXJzIGF0CitvcGVuKCkgdGltZSBhbmQgcGFzc2VzIHRoZSBza2ItPmRhdGEgZmllbGQgdG8gdGhlIFllbGxvd2ZpbiBhcyByZWNlaXZlIGRhdGEKK2J1ZmZlcnMuICBXaGVuIGFuIGluY29taW5nIGZyYW1lIGlzIGxlc3MgdGhhbiBSWF9DT1BZQlJFQUsgYnl0ZXMgbG9uZywKK2EgZnJlc2ggc2tidWZmIGlzIGFsbG9jYXRlZCBhbmQgdGhlIGZyYW1lIGlzIGNvcGllZCB0byB0aGUgbmV3IHNrYnVmZi4KK1doZW4gdGhlIGluY29taW5nIGZyYW1lIGlzIGxhcmdlciwgdGhlIHNrYnVmZiBpcyBwYXNzZWQgZGlyZWN0bHkgdXAgdGhlCitwcm90b2NvbCBzdGFjayBhbmQgcmVwbGFjZWQgYnkgYSBuZXdseSBhbGxvY2F0ZWQgc2tidWZmLgorCitUaGUgUlhfQ09QWUJSRUFLIHZhbHVlIGlzIGNob3NlbiB0byB0cmFkZS1vZmYgdGhlIG1lbW9yeSB3YXN0ZWQgYnkKK3VzaW5nIGEgZnVsbC1zaXplZCBza2J1ZmYgZm9yIHNtYWxsIGZyYW1lcyB2cy4gdGhlIGNvcHlpbmcgY29zdHMgb2YgbGFyZ2VyCitmcmFtZXMuICBGb3Igc21hbGwgZnJhbWVzIHRoZSBjb3B5aW5nIGNvc3QgaXMgbmVnbGlnaWJsZSAoZXNwLiBjb25zaWRlcmluZwordGhhdCB3ZSBhcmUgcHJlLWxvYWRpbmcgdGhlIGNhY2hlIHdpdGggaW1tZWRpYXRlbHkgdXNlZnVsIGhlYWRlcgoraW5mb3JtYXRpb24pLiAgRm9yIGxhcmdlIGZyYW1lcyB0aGUgY29weWluZyBjb3N0IGlzIG5vbi10cml2aWFsLCBhbmQgdGhlCitsYXJnZXIgY29weSBtaWdodCBmbHVzaCB0aGUgY2FjaGUgb2YgdXNlZnVsIGRhdGEuCisKK0lJSUMuIFN5bmNocm9uaXphdGlvbgorCitUaGUgZHJpdmVyIHJ1bnMgYXMgdHdvIGluZGVwZW5kZW50LCBzaW5nbGUtdGhyZWFkZWQgZmxvd3Mgb2YgY29udHJvbC4gIE9uZQoraXMgdGhlIHNlbmQtcGFja2V0IHJvdXRpbmUsIHdoaWNoIGVuZm9yY2VzIHNpbmdsZS10aHJlYWRlZCB1c2UgYnkgdGhlCitkZXYtPnRidXN5IGZsYWcuICBUaGUgb3RoZXIgdGhyZWFkIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgd2hpY2ggaXMgc2luZ2xlCit0aHJlYWRlZCBieSB0aGUgaGFyZHdhcmUgYW5kIG90aGVyIHNvZnR3YXJlLgorCitUaGUgc2VuZCBwYWNrZXQgdGhyZWFkIGhhcyBwYXJ0aWFsIGNvbnRyb2wgb3ZlciB0aGUgVHggcmluZyBhbmQgJ2Rldi0+dGJ1c3knCitmbGFnLiAgSXQgc2V0cyB0aGUgdGJ1c3kgZmxhZyB3aGVuZXZlciBpdCdzIHF1ZXVpbmcgYSBUeCBwYWNrZXQuIElmIHRoZSBuZXh0CitxdWV1ZSBzbG90IGlzIGVtcHR5LCBpdCBjbGVhcnMgdGhlIHRidXN5IGZsYWcgd2hlbiBmaW5pc2hlZCBvdGhlcndpc2UgaXQgc2V0cwordGhlICd5cC0+dHhfZnVsbCcgZmxhZy4KKworVGhlIGludGVycnVwdCBoYW5kbGVyIGhhcyBleGNsdXNpdmUgY29udHJvbCBvdmVyIHRoZSBSeCByaW5nIGFuZCByZWNvcmRzIHN0YXRzCitmcm9tIHRoZSBUeCByaW5nLiAgQWZ0ZXIgcmVhcGluZyB0aGUgc3RhdHMsIGl0IG1hcmtzIHRoZSBUeCBxdWV1ZSBlbnRyeSBhcworZW1wdHkgYnkgaW5jcmVtZW50aW5nIHRoZSBkaXJ0eV90eCBtYXJrLiBJZmYgdGhlICd5cC0+dHhfZnVsbCcgZmxhZyBpcyBzZXQsIGl0CitjbGVhcnMgYm90aCB0aGUgdHhfZnVsbCBhbmQgdGJ1c3kgZmxhZ3MuCisKK0lWLiBOb3RlcworCitUaGFua3MgdG8gS2ltIFN0ZWFybnMgb2YgUGFja2V0IEVuZ2luZXMgZm9yIHByb3ZpZGluZyBhIHBhaXIgb2YgRy1OSUMgYm9hcmRzLgorVGhhbmtzIHRvIEJydWNlIEZhdXN0IG9mIERpZ2l0YWxzY2FwZSBmb3IgcHJvdmlkaW5nIGJvdGggdGhlaXIgU1lNNTNDODg1IGJvYXJkCithbmQgYW4gQWxwaGFTdGF0aW9uIHRvIHZlcmlmdHkgdGhlIEFscGhhIHBvcnQhCisKK0lWYi4gUmVmZXJlbmNlcworCitZZWxsb3dmaW4gRW5naW5lZXJpbmcgRGVzaWduIFNwZWNpZmljYXRpb24sIDQvMjMvOTcgUHJlbGltaW5hcnkvQ29uZmlkZW50aWFsCitTeW1iaW9zIFNZTTUzQzg4NSBQQ0ktU0NTSS9GYXN0IEV0aGVybmV0IE11bHRpZnVuY3Rpb24gQ29udHJvbGxlciBQcmVsaW1pbmFyeQorICAgRGF0YSBNYW51YWwgdjMuMAoraHR0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L2xpbnV4L21pc2MvTldheS5odG1sCitodHRwOi8vY2VzZGlzLmdzZmMubmFzYS5nb3YvbGludXgvbWlzYy8xMDBtYnBzLmh0bWwKKworSVZjLiBFcnJhdGEKKworU2VlIFBhY2tldCBFbmdpbmVzIGNvbmZpZGVudGlhbCBhcHBlbmRpeCAocHJvdG90eXBlIGNoaXBzIG9ubHkpLgorKi8KKworDAorCitlbnVtIHBjaV9pZF9mbGFnc19iaXRzIHsKKwkvKiBTZXQgUENJIGNvbW1hbmQgcmVnaXN0ZXIgYml0cyBiZWZvcmUgY2FsbGluZyBwcm9iZTEoKS4gKi8KKwlQQ0lfVVNFU19JTz0xLCBQQ0lfVVNFU19NRU09MiwgUENJX1VTRVNfTUFTVEVSPTQsCisJLyogUmVhZCBhbmQgbWFwIHRoZSBzaW5nbGUgZm9sbG93aW5nIFBDSSBCQVIuICovCisJUENJX0FERFIwPTA8PDQsIFBDSV9BRERSMT0xPDw0LCBQQ0lfQUREUjI9Mjw8NCwgUENJX0FERFIzPTM8PDQsCisJUENJX0FERFJfNjRCSVRTPTB4MTAwLCBQQ0lfTk9fQUNQSV9XQUtFPTB4MjAwLCBQQ0lfTk9fTUlOX0xBVEVOQ1k9MHg0MDAsCisJUENJX1VOVVNFRF9JUlE9MHg4MDAsCit9OworZW51bSBjYXBhYmlsaXR5X2ZsYWdzIHsKKwlIYXNNSUk9MSwgRnVsbFR4U3RhdHVzPTIsIElzR2lnYWJpdD00LCBIYXNNdWx0aWNhc3RCdWc9OCwgRnVsbFJ4U3RhdHVzPTE2LAorCUhhc01BQ0FkZHJCdWc9MzIsIC8qIE9ubHkgb24gZWFybHkgcmV2cy4gICovCisJRG9udFVzZUVlcHJvbT02NCwgLyogRG9uJ3QgcmVhZCB0aGUgTUFDIGZyb20gdGhlIEVFUFJPbS4gKi8KK307CisvKiBUaGUgUENJIEkvTyBzcGFjZSBleHRlbnQuICovCisjZGVmaW5lIFlFTExPV0ZJTl9TSVpFIDB4MTAwCisjaWZkZWYgVVNFX0lPX09QUworI2RlZmluZSBQQ0lfSU9UWVBFIChQQ0lfVVNFU19NQVNURVIgfCBQQ0lfVVNFU19JTyAgfCBQQ0lfQUREUjApCisjZWxzZQorI2RlZmluZSBQQ0lfSU9UWVBFIChQQ0lfVVNFU19NQVNURVIgfCBQQ0lfVVNFU19NRU0gfCBQQ0lfQUREUjEpCisjZW5kaWYKKworc3RydWN0IHBjaV9pZF9pbmZvIHsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgICAgc3RydWN0IG1hdGNoX2luZm8geworICAgICAgICAgICAgICAgIGludCAgICAgcGNpLCBwY2lfbWFzaywgc3Vic3lzdGVtLCBzdWJzeXN0ZW1fbWFzazsKKyAgICAgICAgICAgICAgICBpbnQgcmV2aXNpb24sIHJldmlzaW9uX21hc2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgOCBiaXRzLiAqLworICAgICAgICB9IGlkOworICAgICAgICBlbnVtIHBjaV9pZF9mbGFnc19iaXRzIHBjaV9mbGFnczsKKyAgICAgICAgaW50IGlvX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZWRlZCBmb3IgSS9PIHJlZ2lvbiBjaGVjayBvciBpb3JlbWFwKCkuICovCisgICAgICAgIGludCBkcnZfZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEcml2ZXIgdXNlLCBpbnRlbmRlZCBhcyBjYXBhYmlsaXR5IGZsYWdzLiAqLworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfaWRfaW5mbyBwY2lfaWRfdGJsW10gPSB7CisJeyJZZWxsb3dmaW4gRy1OSUMgR2lnYWJpdCBFdGhlcm5ldCIsIHsgMHgwNzAyMTAwMCwgMHhmZmZmZmZmZn0sCisJIFBDSV9JT1RZUEUsIFlFTExPV0ZJTl9TSVpFLAorCSBGdWxsVHhTdGF0dXMgfCBJc0dpZ2FiaXQgfCBIYXNNdWx0aWNhc3RCdWcgfCBIYXNNQUNBZGRyQnVnIHwgRG9udFVzZUVlcHJvbX0sCisJeyJTeW1iaW9zIFNZTTgzQzg4NSIsIHsgMHgwNzAxMTAwMCwgMHhmZmZmZmZmZn0sCisJIFBDSV9JT1RZUEUsIFlFTExPV0ZJTl9TSVpFLCBIYXNNSUkgfCBEb250VXNlRWVwcm9tIH0sCisJe05VTEwsfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB5ZWxsb3dmaW5fcGNpX3RibFtdID0geworCXsgMHgxMDAwLCAweDA3MDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDB4MTAwMCwgMHgwNzAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxIH0sCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCB5ZWxsb3dmaW5fcGNpX3RibCk7CisKKworLyogT2Zmc2V0cyB0byB0aGUgWWVsbG93ZmluIHJlZ2lzdGVycy4gIFZhcmlvdXMgc2l6ZXMgYW5kIGFsaWdubWVudHMuICovCitlbnVtIHllbGxvd2Zpbl9vZmZzZXRzIHsKKwlUeEN0cmw9MHgwMCwgVHhTdGF0dXM9MHgwNCwgVHhQdHI9MHgwQywKKwlUeEludHJTZWw9MHgxMCwgVHhCcmFuY2hTZWw9MHgxNCwgVHhXYWl0U2VsPTB4MTgsCisJUnhDdHJsPTB4NDAsIFJ4U3RhdHVzPTB4NDQsIFJ4UHRyPTB4NEMsCisJUnhJbnRyU2VsPTB4NTAsIFJ4QnJhbmNoU2VsPTB4NTQsIFJ4V2FpdFNlbD0weDU4LAorCUV2ZW50U3RhdHVzPTB4ODAsIEludHJFbmI9MHg4MiwgSW50ckNsZWFyPTB4ODQsIEludHJTdGF0dXM9MHg4NiwKKwlDaGlwUmV2PTB4OEMsIERNQUN0cmw9MHg5MCwgVHhUaHJlc2hvbGQ9MHg5NCwKKwlDbmZnPTB4QTAsIEZyYW1lR2FwMD0weEEyLCBGcmFtZUdhcDE9MHhBNCwKKwlNSUlfQ21kPTB4QTYsIE1JSV9BZGRyPTB4QTgsIE1JSV9Xcl9EYXRhPTB4QUEsIE1JSV9SZF9EYXRhPTB4QUMsCisJTUlJX1N0YXR1cz0weEFFLAorCVJ4RGVwdGg9MHhCOCwgRmxvd0N0cmw9MHhCQywKKwlBZGRyTW9kZT0weEQwLCBTdG5BZGRyPTB4RDIsIEhhc2hUYmw9MHhEOCwgRklGT2NmZz0weEY4LAorCUVFU3RhdHVzPTB4RjAsIEVFQ3RybD0weEYxLCBFRUFkZHI9MHhGMiwgRUVSZWFkPTB4RjMsIEVFV3JpdGU9MHhGNCwKKwlFRUZlYXR1cmU9MHhGNSwKK307CisKKy8qIFRoZSBZZWxsb3dmaW4gUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4KKyAgIEVsZW1lbnRzIGFyZSB3cml0dGVuIGFzIDMyIGJpdCBmb3IgZW5kaWFuIHBvcnRhYmlsaXR5LiAqLworc3RydWN0IHllbGxvd2Zpbl9kZXNjIHsKKwl1MzIgZGJkbWFfY21kOworCXUzMiBhZGRyOworCXUzMiBicmFuY2hfYWRkcjsKKwl1MzIgcmVzdWx0X3N0YXR1czsKK307CisKK3N0cnVjdCB0eF9zdGF0dXNfd29yZHMgeworI2lmZGVmIF9fQklHX0VORElBTgorCXUxNiB0eF9lcnJzOworCXUxNiB0eF9jbnQ7CisJdTE2IHBhdXNlZDsKKwl1MTYgdG90YWxfdHhfY250OworI2Vsc2UgIC8qIExpdHRsZSBlbmRpYW4gY2hpcHMuICovCisJdTE2IHR4X2NudDsKKwl1MTYgdHhfZXJyczsKKwl1MTYgdG90YWxfdHhfY250OworCXUxNiBwYXVzZWQ7CisjZW5kaWYgLyogX19CSUdfRU5ESUFOICovCit9OworCisvKiBCaXRzIGluIHllbGxvd2Zpbl9kZXNjLmNtZCAqLworZW51bSBkZXNjX2NtZF9iaXRzIHsKKwlDTURfVFhfUEtUPTB4MTAwMDAwMDAsIENNRF9SWF9CVUY9MHgyMDAwMDAwMCwgQ01EX1RYU1RBVFVTPTB4MzAwMDAwMDAsCisJQ01EX05PUD0weDYwMDAwMDAwLCBDTURfU1RPUD0weDcwMDAwMDAwLAorCUJSQU5DSF9BTFdBWVM9MHgwQzAwMDAsIElOVFJfQUxXQVlTPTB4MzAwMDAwLCBXQUlUX0FMV0FZUz0weDAzMDAwMCwKKwlCUkFOQ0hfSUZUUlVFPTB4MDQwMDAwLAorfTsKKworLyogQml0cyBpbiB5ZWxsb3dmaW5fZGVzYy5zdGF0dXMgKi8KK2VudW0gZGVzY19zdGF0dXNfYml0cyB7IFJYX0VPUD0weDAwNDAsIH07CisKKy8qIEJpdHMgaW4gdGhlIGludGVycnVwdCBzdGF0dXMvbWFzayByZWdpc3RlcnMuICovCitlbnVtIGludHJfc3RhdHVzX2JpdHMgeworCUludHJSeERvbmU9MHgwMSwgSW50clJ4SW52YWxpZD0weDAyLCBJbnRyUnhQQ0lGYXVsdD0weDA0LEludHJSeFBDSUVycj0weDA4LAorCUludHJUeERvbmU9MHgxMCwgSW50clR4SW52YWxpZD0weDIwLCBJbnRyVHhQQ0lGYXVsdD0weDQwLEludHJUeFBDSUVycj0weDgwLAorCUludHJFYXJseVJ4PTB4MTAwLCBJbnRyV2FrZXVwPTB4MjAwLCB9OworCisjZGVmaW5lIFBSSVZfQUxJR04JMzEgCS8qIFJlcXVpcmVkIGFsaWdubWVudCBtYXNrICovCisjZGVmaW5lIE1JSV9DTlQJCTQKK3N0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSB7CisJLyogRGVzY3JpcHRvciByaW5ncyBmaXJzdCBmb3IgYWxpZ25tZW50LgorCSAgIFR4IHJlcXVpcmVzIGEgc2Vjb25kIGRlc2NyaXB0b3IgZm9yIHN0YXR1cy4gKi8KKwlzdHJ1Y3QgeWVsbG93ZmluX2Rlc2MgKnJ4X3Jpbmc7CisJc3RydWN0IHllbGxvd2Zpbl9kZXNjICp0eF9yaW5nOworCXN0cnVjdCBza19idWZmKiByeF9za2J1ZmZbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZiogdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisJZG1hX2FkZHJfdCByeF9yaW5nX2RtYTsKKwlkbWFfYWRkcl90IHR4X3JpbmdfZG1hOworCisJc3RydWN0IHR4X3N0YXR1c193b3JkcyAqdHhfc3RhdHVzOworCWRtYV9hZGRyX3QgdHhfc3RhdHVzX2RtYTsKKworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkvKiBNZWRpYSBzZWxlY3Rpb24gdGltZXIuICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJLyogRnJlcXVlbnRseSB1c2VkIGFuZCBwYWlyZWQgdmFsdWU6IGtlZXAgYWRqYWNlbnQgZm9yIGNhY2hlIGVmZmVjdC4gKi8KKwlpbnQgY2hpcF9pZCwgZHJ2X2ZsYWdzOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCXVuc2lnbmVkIGludCBjdXJfcngsIGRpcnR5X3J4OwkJLyogUHJvZHVjZXIvY29uc3VtZXIgcmluZyBpbmRpY2VzICovCisJdW5zaWduZWQgaW50IHJ4X2J1Zl9zejsJCQkJLyogQmFzZWQgb24gTVRVK3NsYWNrLiAqLworCXN0cnVjdCB0eF9zdGF0dXNfd29yZHMgKnR4X3RhaWxfZGVzYzsKKwl1bnNpZ25lZCBpbnQgY3VyX3R4LCBkaXJ0eV90eDsKKwlpbnQgdHhfdGhyZXNob2xkOworCXVuc2lnbmVkIGludCB0eF9mdWxsOjE7CQkJCS8qIFRoZSBUeCBxdWV1ZSBpcyBmdWxsLiAqLworCXVuc2lnbmVkIGludCBmdWxsX2R1cGxleDoxOwkJCS8qIEZ1bGwtZHVwbGV4IG9wZXJhdGlvbiByZXF1ZXN0ZWQuICovCisJdW5zaWduZWQgaW50IGR1cGxleF9sb2NrOjE7CisJdW5zaWduZWQgaW50IG1lZGlhbG9jazoxOwkJCS8qIERvIG5vdCBzZW5zZSBtZWRpYS4gKi8KKwl1bnNpZ25lZCBpbnQgZGVmYXVsdF9wb3J0OjQ7CQkvKiBMYXN0IGRldi0+aWZfcG9ydCB2YWx1ZS4gKi8KKwkvKiBNSUkgdHJhbnNjZWl2ZXIgc2VjdGlvbi4gKi8KKwlpbnQgbWlpX2NudDsJCQkJCQkvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcy4gKi8KKwl1MTYgYWR2ZXJ0aXNpbmc7CQkJCQkvKiBOV2F5IG1lZGlhIGFkdmVydGlzZW1lbnQgKi8KKwl1bnNpZ25lZCBjaGFyIHBoeXNbTUlJX0NOVF07CQkvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcywgb25seSBmaXJzdCBvbmUgdXNlZCAqLworCXNwaW5sb2NrX3QgbG9jazsKKwl2b2lkIF9faW9tZW0gKmJhc2U7Cit9OworCitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgbG9jYXRpb24pOworc3RhdGljIGludCBtZGlvX3JlYWQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSk7CitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgeWVsbG93ZmluX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB5ZWxsb3dmaW5fdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHllbGxvd2Zpbl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgeWVsbG93ZmluX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgeWVsbG93ZmluX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgeWVsbG93ZmluX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgeWVsbG93ZmluX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgeWVsbG93ZmluX2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbnRyX3N0YXR1cyk7CitzdGF0aWMgaW50IHllbGxvd2Zpbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqeWVsbG93ZmluX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBldGh0b29sX29wczsKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB5ZWxsb3dmaW5faW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgKm5wOworCWludCBpcnE7CisJaW50IGNoaXBfaWR4ID0gZW50LT5kcml2ZXJfZGF0YTsKKwlzdGF0aWMgaW50IGZpbmRfY250OworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCWludCBpLCBvcHRpb24gPSBmaW5kX2NudCA8IE1BWF9VTklUUyA/IG9wdGlvbnNbZmluZF9jbnRdIDogMDsKKwlpbnQgZHJ2X2ZsYWdzID0gcGNpX2lkX3RibFtjaGlwX2lkeF0uZHJ2X2ZsYWdzOworICAgICAgICB2b2lkICpyaW5nX3NwYWNlOworICAgICAgICBkbWFfYWRkcl90IHJpbmdfZG1hOworI2lmZGVmIFVTRV9JT19PUFMKKwlpbnQgYmFyID0gMDsKKyNlbHNlCisJaW50IGJhciA9IDE7CisjZW5kaWYKKwkKKy8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCisJaSA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChpKSByZXR1cm4gaTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqbnApKTsKKwlpZiAoIWRldikgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IGFsbG9jYXRlIGV0aGVybmV0IGRldmljZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCW5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKSkKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisJcGNpX3NldF9tYXN0ZXIgKHBkZXYpOworCisJaW9hZGRyID0gcGNpX2lvbWFwKHBkZXYsIGJhciwgWUVMTE9XRklOX1NJWkUpOworCWlmICghaW9hZGRyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisKKwlpcnEgPSBwZGV2LT5pcnE7CisKKwlpZiAoZHJ2X2ZsYWdzICYgRG9udFVzZUVlcHJvbSkKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCWRldi0+ZGV2X2FkZHJbaV0gPSBpb3JlYWQ4KGlvYWRkciArIFN0bkFkZHIgKyBpKTsKKwllbHNlIHsKKwkJaW50IGVlX29mZnNldCA9IChyZWFkX2VlcHJvbShpb2FkZHIsIDYpID09IDB4ZmYgPyAweDEwMCA6IDApOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJZGV2LT5kZXZfYWRkcltpXSA9IHJlYWRfZWVwcm9tKGlvYWRkciwgZWVfb2Zmc2V0ICsgaSk7CisJfQorCisJLyogUmVzZXQgdGhlIGNoaXAuICovCisJaW93cml0ZTMyKDB4ODAwMDAwMDAsIGlvYWRkciArIERNQUN0cmwpOworCisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlzcGluX2xvY2tfaW5pdCgmbnAtPmxvY2spOworCisJbnAtPnBjaV9kZXYgPSBwZGV2OworCW5wLT5jaGlwX2lkID0gY2hpcF9pZHg7CisJbnAtPmRydl9mbGFncyA9IGRydl9mbGFnczsKKwlucC0+YmFzZSA9IGlvYWRkcjsKKworCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCAmcmluZ19kbWEpOworCWlmICghcmluZ19zcGFjZSkKKwkJZ290byBlcnJfb3V0X2NsZWFyZGV2OworCW5wLT50eF9yaW5nID0gKHN0cnVjdCB5ZWxsb3dmaW5fZGVzYyAqKXJpbmdfc3BhY2U7CisJbnAtPnR4X3JpbmdfZG1hID0gcmluZ19kbWE7CisKKwlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmdfc3BhY2UpCisJCWdvdG8gZXJyX291dF91bm1hcF90eDsKKwlucC0+cnhfcmluZyA9IChzdHJ1Y3QgeWVsbG93ZmluX2Rlc2MgKilyaW5nX3NwYWNlOworCW5wLT5yeF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFNUQVRVU19UT1RBTF9TSVpFLCAmcmluZ19kbWEpOworCWlmICghcmluZ19zcGFjZSkKKwkJZ290byBlcnJfb3V0X3VubWFwX3J4OworCW5wLT50eF9zdGF0dXMgPSAoc3RydWN0IHR4X3N0YXR1c193b3JkcyAqKXJpbmdfc3BhY2U7CisJbnAtPnR4X3N0YXR1c19kbWEgPSByaW5nX2RtYTsKKworCWlmIChkZXYtPm1lbV9zdGFydCkKKwkJb3B0aW9uID0gZGV2LT5tZW1fc3RhcnQ7CisKKwkvKiBUaGUgbG93ZXIgZm91ciBiaXRzIGFyZSB0aGUgbWVkaWEgdHlwZS4gKi8KKwlpZiAob3B0aW9uID4gMCkgeworCQlpZiAob3B0aW9uICYgMHgyMDApCisJCQlucC0+ZnVsbF9kdXBsZXggPSAxOworCQlucC0+ZGVmYXVsdF9wb3J0ID0gb3B0aW9uICYgMTU7CisJCWlmIChucC0+ZGVmYXVsdF9wb3J0KQorCQkJbnAtPm1lZGlhbG9jayA9IDE7CisJfQorCWlmIChmaW5kX2NudCA8IE1BWF9VTklUUyAgJiYgIGZ1bGxfZHVwbGV4W2ZpbmRfY250XSA+IDApCisJCW5wLT5mdWxsX2R1cGxleCA9IDE7CisKKwlpZiAobnAtPmZ1bGxfZHVwbGV4KQorCQlucC0+ZHVwbGV4X2xvY2sgPSAxOworCisJLyogVGhlIFllbGxvd2Zpbi1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZ5ZWxsb3dmaW5fb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ5ZWxsb3dmaW5fc3RhcnRfeG1pdDsKKwlkZXYtPnN0b3AgPSAmeWVsbG93ZmluX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJnllbGxvd2Zpbl9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7CisJZGV2LT5kb19pb2N0bCA9ICZuZXRkZXZfaW9jdGw7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmV0aHRvb2xfb3BzKTsKKwlkZXYtPnR4X3RpbWVvdXQgPSB5ZWxsb3dmaW5fdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKworCWlmIChtdHUpCisJCWRldi0+bXR1ID0gbXR1OworCisJaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChpKQorCQlnb3RvIGVycl9vdXRfdW5tYXBfc3RhdHVzOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIHR5cGUgJTh4IGF0ICVwLCAiLAorCQkgICBkZXYtPm5hbWUsIHBjaV9pZF90YmxbY2hpcF9pZHhdLm5hbWUsCisJCSAgIGlvcmVhZDMyKGlvYWRkciArIENoaXBSZXYpLCBpb2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCQlwcmludGsoIiUyLjJ4OiIsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiJTIuMngsIElSUSAlZC5cbiIsIGRldi0+ZGV2X2FkZHJbaV0sIGlycSk7CisKKwlpZiAobnAtPmRydl9mbGFncyAmIEhhc01JSSkgeworCQlpbnQgcGh5LCBwaHlfaWR4ID0gMDsKKwkJZm9yIChwaHkgPSAwOyBwaHkgPCAzMiAmJiBwaHlfaWR4IDwgTUlJX0NOVDsgcGh5KyspIHsKKwkJCWludCBtaWlfc3RhdHVzID0gbWRpb19yZWFkKGlvYWRkciwgcGh5LCAxKTsKKwkJCWlmIChtaWlfc3RhdHVzICE9IDB4ZmZmZiAgJiYgIG1paV9zdGF0dXMgIT0gMHgwMDAwKSB7CisJCQkJbnAtPnBoeXNbcGh5X2lkeCsrXSA9IHBoeTsKKwkJCQlucC0+YWR2ZXJ0aXNpbmcgPSBtZGlvX3JlYWQoaW9hZGRyLCBwaHksIDQpOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNSUkgUEhZIGZvdW5kIGF0IGFkZHJlc3MgJWQsIHN0YXR1cyAiCisJCQkJCSAgICIweCU0LjR4IGFkdmVydGlzaW5nICU0LjR4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBwaHksIG1paV9zdGF0dXMsIG5wLT5hZHZlcnRpc2luZyk7CisJCQl9CisJCX0KKwkJbnAtPm1paV9jbnQgPSBwaHlfaWR4OworCX0KKworCWZpbmRfY250Kys7CisJCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfdW5tYXBfc3RhdHVzOgorICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFNUQVRVU19UT1RBTF9TSVpFLCBucC0+dHhfc3RhdHVzLCAKKwkJbnAtPnR4X3N0YXR1c19kbWEpOworZXJyX291dF91bm1hcF9yeDoKKyAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCBucC0+cnhfcmluZywgbnAtPnJ4X3JpbmdfZG1hKTsKK2Vycl9vdXRfdW5tYXBfdHg6CisgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgbnAtPnR4X3JpbmcsIG5wLT50eF9yaW5nX2RtYSk7CitlcnJfb3V0X2NsZWFyZGV2OgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlwY2lfaW91bm1hcChwZGV2LCBpb2FkZHIpOworZXJyX291dF9mcmVlX3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dF9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldiAoZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcmVhZF9lZXByb20odm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBsb2NhdGlvbikKK3sKKwlpbnQgYm9ndXNfY250ID0gMTAwMDA7CQkvKiBUeXBpY2FsIDMzTWh6OiAxMDUwIHRpY2tzICovCisKKwlpb3dyaXRlOChsb2NhdGlvbiwgaW9hZGRyICsgRUVBZGRyKTsKKwlpb3dyaXRlOCgweDMwIHwgKChsb2NhdGlvbiA+PiA4KSAmIDcpLCBpb2FkZHIgKyBFRUN0cmwpOworCXdoaWxlICgoaW9yZWFkOChpb2FkZHIgKyBFRVN0YXR1cykgJiAweDgwKSAgJiYgIC0tYm9ndXNfY250ID4gMCkKKwkJOworCXJldHVybiBpb3JlYWQ4KGlvYWRkciArIEVFUmVhZCk7Cit9CisKKy8qIE1JSSBNYW5hZ2VtZW4gRGF0YSBJL08gYWNjZXNzZXMuCisgICBUaGVzZSByb3V0aW5lcyBhc3N1bWUgdGhlIE1ESU8gY29udHJvbGxlciBpcyBpZGxlLCBhbmQgZG8gbm90IGV4aXQgdW50aWwKKyAgIHRoZSBjb21tYW5kIGlzIGZpbmlzaGVkLiAqLworCitzdGF0aWMgaW50IG1kaW9fcmVhZCh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCWludCBpOworCisJaW93cml0ZTE2KChwaHlfaWQ8PDgpICsgbG9jYXRpb24sIGlvYWRkciArIE1JSV9BZGRyKTsKKwlpb3dyaXRlMTYoMSwgaW9hZGRyICsgTUlJX0NtZCk7CisJZm9yIChpID0gMTAwMDA7IGkgPj0gMDsgaS0tKQorCQlpZiAoKGlvcmVhZDE2KGlvYWRkciArIE1JSV9TdGF0dXMpICYgMSkgPT0gMCkKKwkJCWJyZWFrOworCXJldHVybiBpb3JlYWQxNihpb2FkZHIgKyBNSUlfUmRfRGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworCWludCBpOworCisJaW93cml0ZTE2KChwaHlfaWQ8PDgpICsgbG9jYXRpb24sIGlvYWRkciArIE1JSV9BZGRyKTsKKwlpb3dyaXRlMTYodmFsdWUsIGlvYWRkciArIE1JSV9Xcl9EYXRhKTsKKworCS8qIFdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGZpbmlzaC4gKi8KKwlmb3IgKGkgPSAxMDAwMDsgaSA+PSAwOyBpLS0pCisJCWlmICgoaW9yZWFkMTYoaW9hZGRyICsgTUlJX1N0YXR1cykgJiAxKSA9PSAwKQorCQkJYnJlYWs7CisJcmV0dXJuOworfQorCisMCitzdGF0aWMgaW50IHllbGxvd2Zpbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB5cC0+YmFzZTsKKwlpbnQgaTsKKworCS8qIFJlc2V0IHRoZSBjaGlwLiAqLworCWlvd3JpdGUzMigweDgwMDAwMDAwLCBpb2FkZHIgKyBETUFDdHJsKTsKKworCWkgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnllbGxvd2Zpbl9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKGkpIHJldHVybiBpOworCisJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogeWVsbG93ZmluX29wZW4oKSBpcnEgJWQuXG4iLAorCQkJICAgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisKKwl5ZWxsb3dmaW5faW5pdF9yaW5nKGRldik7CisKKwlpb3dyaXRlMzIoeXAtPnJ4X3JpbmdfZG1hLCBpb2FkZHIgKyBSeFB0cik7CisJaW93cml0ZTMyKHlwLT50eF9yaW5nX2RtYSwgaW9hZGRyICsgVHhQdHIpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJaW93cml0ZTgoZGV2LT5kZXZfYWRkcltpXSwgaW9hZGRyICsgU3RuQWRkciArIGkpOworCisJLyogU2V0IHVwIHZhcmlvdXMgY29uZGl0aW9uICdzZWxlY3QnIHJlZ2lzdGVycy4KKwkgICBUaGVyZSBhcmUgbm8gb3B0aW9ucyBoZXJlLiAqLworCWlvd3JpdGUzMigweDAwODAwMDgwLCBpb2FkZHIgKyBUeEludHJTZWwpOyAJLyogSW50ZXJydXB0IG9uIFR4IGFib3J0ICovCisJaW93cml0ZTMyKDB4MDA4MDAwODAsIGlvYWRkciArIFR4QnJhbmNoU2VsKTsJLyogQnJhbmNoIG9uIFR4IGFib3J0ICovCisJaW93cml0ZTMyKDB4MDA0MDAwNDAsIGlvYWRkciArIFR4V2FpdFNlbCk7IAkvKiBXYWl0IG9uIFR4IHN0YXR1cyAqLworCWlvd3JpdGUzMigweDAwNDAwMDQwLCBpb2FkZHIgKyBSeEludHJTZWwpOwkvKiBJbnRlcnJ1cHQgb24gUnggZG9uZSAqLworCWlvd3JpdGUzMigweDAwNDAwMDQwLCBpb2FkZHIgKyBSeEJyYW5jaFNlbCk7CS8qIEJyYW5jaCBvbiBSeCBlcnJvciAqLworCWlvd3JpdGUzMigweDAwNDAwMDQwLCBpb2FkZHIgKyBSeFdhaXRTZWwpOwkvKiBXYWl0IG9uIFJ4IGRvbmUgKi8KKworCS8qIEluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzOiB3aXRoIHNvIG1hbnkgdGhpcyBldmVudHVhbGx5IHRoaXMgd2lsbAorCSAgIGNvbnZlcnRlZCB0byBhbiBvZmZzZXQvdmFsdWUgbGlzdC4gKi8KKwlpb3dyaXRlMzIoZG1hX2N0cmwsIGlvYWRkciArIERNQUN0cmwpOworCWlvd3JpdGUxNihmaWZvX2NmZywgaW9hZGRyICsgRklGT2NmZyk7CisJLyogRW5hYmxlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIGZsb3cgY29udHJvbCBmcmFtZXMsIHBlcmlvZCAweGZmZmYuICovCisJaW93cml0ZTMyKDB4MDAzMEZGRkYsIGlvYWRkciArIEZsb3dDdHJsKTsKKworCXlwLT50eF90aHJlc2hvbGQgPSAzMjsKKwlpb3dyaXRlMzIoeXAtPnR4X3RocmVzaG9sZCwgaW9hZGRyICsgVHhUaHJlc2hvbGQpOworCisJaWYgKGRldi0+aWZfcG9ydCA9PSAwKQorCQlkZXYtPmlmX3BvcnQgPSB5cC0+ZGVmYXVsdF9wb3J0OworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCS8qIFNldHRpbmcgdGhlIFJ4IG1vZGUgd2lsbCBzdGFydCB0aGUgUnggcHJvY2Vzcy4gKi8KKwlpZiAoeXAtPmRydl9mbGFncyAmIElzR2lnYWJpdCkgeworCQkvKiBXZSBhcmUgYWx3YXlzIGluIGZ1bGwtZHVwbGV4IG1vZGUgd2l0aCBnaWdhYml0ISAqLworCQl5cC0+ZnVsbF9kdXBsZXggPSAxOworCQlpb3dyaXRlMTYoMHgwMUNGLCBpb2FkZHIgKyBDbmZnKTsKKwl9IGVsc2UgeworCQlpb3dyaXRlMTYoMHgwMDE4LCBpb2FkZHIgKyBGcmFtZUdhcDApOyAvKiAwMDYwLzQwNjAgZm9yIG5vbi1NSUkgMTBiYXNlVCAqLworCQlpb3dyaXRlMTYoMHgxMDE4LCBpb2FkZHIgKyBGcmFtZUdhcDEpOworCQlpb3dyaXRlMTYoMHgxMDFDIHwgKHlwLT5mdWxsX2R1cGxleCA/IDIgOiAwKSwgaW9hZGRyICsgQ25mZyk7CisJfQorCXNldF9yeF9tb2RlKGRldik7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBieSBzZXR0aW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlpb3dyaXRlMTYoMHg4MWZmLCBpb2FkZHIgKyBJbnRyRW5iKTsJCQkvKiBTZWUgZW51bSBpbnRyX3N0YXR1c19iaXRzICovCisJaW93cml0ZTE2KDB4MDAwMCwgaW9hZGRyICsgRXZlbnRTdGF0dXMpOwkJLyogQ2xlYXIgbm9uLWludGVycnVwdGluZyBldmVudHMgKi8KKwlpb3dyaXRlMzIoMHg4MDAwODAwMCwgaW9hZGRyICsgUnhDdHJsKTsJCS8qIFN0YXJ0IFJ4IGFuZCBUeCBjaGFubmVscy4gKi8KKwlpb3dyaXRlMzIoMHg4MDAwODAwMCwgaW9hZGRyICsgVHhDdHJsKTsKKworCWlmICh5ZWxsb3dmaW5fZGVidWcgPiAyKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRG9uZSB5ZWxsb3dmaW5fb3BlbigpLlxuIiwKKwkJCSAgIGRldi0+bmFtZSk7CisJfQorCisJLyogU2V0IHRoZSB0aW1lciB0byBjaGVjayBmb3IgbGluayBiZWF0LiAqLworCWluaXRfdGltZXIoJnlwLT50aW1lcik7CisJeXAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMypIWjsKKwl5cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwl5cC0+dGltZXIuZnVuY3Rpb24gPSAmeWVsbG93ZmluX3RpbWVyOwkJCQkvKiB0aW1lciBoYW5kbGVyICovCisJYWRkX3RpbWVyKCZ5cC0+dGltZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHllbGxvd2Zpbl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB5cC0+YmFzZTsKKwlpbnQgbmV4dF90aWNrID0gNjAqSFo7CisKKwlpZiAoeWVsbG93ZmluX2RlYnVnID4gMykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFllbGxvd2ZpbiB0aW1lciB0aWNrLCBzdGF0dXMgJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQxNihpb2FkZHIgKyBJbnRyU3RhdHVzKSk7CisJfQorCisJaWYgKHlwLT5taWlfY250KSB7CisJCWludCBibXNyID0gbWRpb19yZWFkKGlvYWRkciwgeXAtPnBoeXNbMF0sIE1JSV9CTVNSKTsKKwkJaW50IGxwYSA9IG1kaW9fcmVhZChpb2FkZHIsIHlwLT5waHlzWzBdLCBNSUlfTFBBKTsKKwkJaW50IG5lZ290aWF0ZWQgPSBscGEgJiB5cC0+YWR2ZXJ0aXNpbmc7CisJCWlmICh5ZWxsb3dmaW5fZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNSUkgIyVkIHN0YXR1cyByZWdpc3RlciBpcyAlNC40eCwgIgorCQkJCSAgICJsaW5rIHBhcnRuZXIgY2FwYWJpbGl0eSAlNC40eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCB5cC0+cGh5c1swXSwgYm1zciwgbHBhKTsKKworCQl5cC0+ZnVsbF9kdXBsZXggPSBtaWlfZHVwbGV4KHlwLT5kdXBsZXhfbG9jaywgbmVnb3RpYXRlZCk7CisJCQkKKwkJaW93cml0ZTE2KDB4MTAxQyB8ICh5cC0+ZnVsbF9kdXBsZXggPyAyIDogMCksIGlvYWRkciArIENuZmcpOworCisJCWlmIChibXNyICYgQk1TUl9MU1RBVFVTKQorCQkJbmV4dF90aWNrID0gNjAqSFo7CisJCWVsc2UKKwkJCW5leHRfdGljayA9IDMqSFo7CisJfQorCisJeXAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbmV4dF90aWNrOworCWFkZF90aW1lcigmeXAtPnRpbWVyKTsKK30KKworc3RhdGljIHZvaWQgeWVsbG93ZmluX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHlwLT5iYXNlOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFllbGxvd2ZpbiB0cmFuc21pdCB0aW1lZCBvdXQgYXQgJWQvJWQgVHggIgorCQkgICAic3RhdHVzICU0LjR4LCBSeCBzdGF0dXMgJTQuNHgsIHJlc2V0dGluZy4uLlxuIiwKKwkJICAgZGV2LT5uYW1lLCB5cC0+Y3VyX3R4LCB5cC0+ZGlydHlfdHgsCisJCSAgIGlvcmVhZDMyKGlvYWRkciArIFR4U3RhdHVzKSwgaW9yZWFkMzIoaW9hZGRyICsgUnhTdGF0dXMpKTsKKworCS8qIE5vdGU6IHRoZXNlIHNob3VsZCBiZSBLRVJOX0RFQlVHLiAqLworCWlmICh5ZWxsb3dmaW5fZGVidWcpIHsKKwkJaW50IGk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgUnggcmluZyAlcDogIiwgeXAtPnJ4X3JpbmcpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAlOC44eCIsIHlwLT5yeF9yaW5nW2ldLnJlc3VsdF9zdGF0dXMpOworCQlwcmludGsoIlxuIktFUk5fV0FSTklORyIgIFR4IHJpbmcgJXA6ICIsIHlwLT50eF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKCIgJTQuNHggLyU4Ljh4IiwgeXAtPnR4X3N0YXR1c1tpXS50eF9lcnJzLAorCQkJCSAgIHlwLT50eF9yaW5nW2ldLnJlc3VsdF9zdGF0dXMpOworCQlwcmludGsoIlxuIik7CisJfQorCisJLyogSWYgdGhlIGhhcmR3YXJlIGlzIGZvdW5kIHRvIGhhbmcgcmVndWxhcmx5LCB3ZSB3aWxsIHVwZGF0ZSB0aGUgY29kZQorCSAgIHRvIHJlaW5pdGlhbGl6ZSB0aGUgY2hpcCBoZXJlLiAqLworCWRldi0+aWZfcG9ydCA9IDA7CisKKwkvKiBXYWtlIHRoZSBwb3RlbnRpYWxseS1pZGxlIHRyYW5zbWl0IGNoYW5uZWwuICovCisJaW93cml0ZTMyKDB4MTAwMDEwMDAsIHlwLT5iYXNlICsgVHhDdHJsKTsKKwlpZiAoeXAtPmN1cl90eCAtIHlwLT5kaXJ0eV90eCA8IFRYX1FVRVVFX1NJWkUpCisJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CQkvKiBUeXBpY2FsIHBhdGggKi8KKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXlwLT5zdGF0cy50eF9lcnJvcnMrKzsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgUnggYW5kIFR4IHJpbmdzLCBhbG9uZyB3aXRoIHZhcmlvdXMgJ2RldicgYml0cy4gKi8KK3N0YXRpYyB2b2lkIHllbGxvd2Zpbl9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCXlwLT50eF9mdWxsID0gMDsKKwl5cC0+Y3VyX3J4ID0geXAtPmN1cl90eCA9IDA7CisJeXAtPmRpcnR5X3R4ID0gMDsKKworCXlwLT5yeF9idWZfc3ogPSAoZGV2LT5tdHUgPD0gMTUwMCA/IFBLVF9CVUZfU1ogOiBkZXYtPm10dSArIDMyKTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQl5cC0+cnhfcmluZ1tpXS5kYmRtYV9jbWQgPQorCQkJY3B1X3RvX2xlMzIoQ01EX1JYX0JVRiB8IElOVFJfQUxXQVlTIHwgeXAtPnJ4X2J1Zl9zeik7CisJCXlwLT5yeF9yaW5nW2ldLmJyYW5jaF9hZGRyID0gY3B1X3RvX2xlMzIoeXAtPnJ4X3JpbmdfZG1hICsKKwkJCSgoaSsxKSVSWF9SSU5HX1NJWkUpKnNpemVvZihzdHJ1Y3QgeWVsbG93ZmluX2Rlc2MpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoeXAtPnJ4X2J1Zl9zeik7CisJCXlwLT5yeF9za2J1ZmZbaV0gPSBza2I7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlza2ItPmRldiA9IGRldjsJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyLiAqLworCQl5cC0+cnhfcmluZ1tpXS5hZGRyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoeXAtPnBjaV9kZXYsCisJCQlza2ItPnRhaWwsIHlwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOworCX0KKwl5cC0+cnhfcmluZ1tpLTFdLmRiZG1hX2NtZCA9IGNwdV90b19sZTMyKENNRF9TVE9QKTsKKwl5cC0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KShpIC0gUlhfUklOR19TSVpFKTsKKworI2RlZmluZSBOT19UWFNUQVRTCisjaWZkZWYgTk9fVFhTVEFUUworCS8qIEluIHRoaXMgbW9kZSB0aGUgVHggcmluZyBuZWVkcyBvbmx5IGEgc2luZ2xlIGRlc2NyaXB0b3IuICovCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXlwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQl5cC0+dHhfcmluZ1tpXS5kYmRtYV9jbWQgPSBjcHVfdG9fbGUzMihDTURfU1RPUCk7CisJCXlwLT50eF9yaW5nW2ldLmJyYW5jaF9hZGRyID0gY3B1X3RvX2xlMzIoeXAtPnR4X3JpbmdfZG1hICsKKwkJCSgoaSsxKSVUWF9SSU5HX1NJWkUpKnNpemVvZihzdHJ1Y3QgeWVsbG93ZmluX2Rlc2MpKTsKKwl9CisJLyogV3JhcCByaW5nICovCisJeXAtPnR4X3JpbmdbLS1pXS5kYmRtYV9jbWQgPSBjcHVfdG9fbGUzMihDTURfU1RPUCB8IEJSQU5DSF9BTFdBWVMpOworI2Vsc2UKK3sKKwlpbnQgajsKKworCS8qIFR4IHJpbmcgbmVlZHMgYSBwYWlyIG9mIGRlc2NyaXB0b3JzLCB0aGUgc2Vjb25kIGZvciB0aGUgc3RhdHVzLiAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlqID0gMippOworCQl5cC0+dHhfc2tidWZmW2ldID0gMDsKKwkJLyogQnJhbmNoIG9uIFR4IGVycm9yLiAqLworCQl5cC0+dHhfcmluZ1tqXS5kYmRtYV9jbWQgPSBjcHVfdG9fbGUzMihDTURfU1RPUCk7CisJCXlwLT50eF9yaW5nW2pdLmJyYW5jaF9hZGRyID0gY3B1X3RvX2xlMzIoeXAtPnR4X3JpbmdfZG1hICsKKwkJCShqKzEpKnNpemVvZihzdHJ1Y3QgeWVsbG93ZmluX2Rlc2MpOworCQlqKys7CisJCWlmICh5cC0+ZmxhZ3MgJiBGdWxsVHhTdGF0dXMpIHsKKwkJCXlwLT50eF9yaW5nW2pdLmRiZG1hX2NtZCA9CisJCQkJY3B1X3RvX2xlMzIoQ01EX1RYU1RBVFVTIHwgc2l6ZW9mKCp5cC0+dHhfc3RhdHVzKSk7CisJCQl5cC0+dHhfcmluZ1tqXS5yZXF1ZXN0X2NudCA9IHNpemVvZigqeXAtPnR4X3N0YXR1cyk7CisJCQl5cC0+dHhfcmluZ1tqXS5hZGRyID0gY3B1X3RvX2xlMzIoeXAtPnR4X3N0YXR1c19kbWEgKworCQkJCWkqc2l6ZW9mKHN0cnVjdCB0eF9zdGF0dXNfd29yZHMpOworCQl9IGVsc2UgeworCQkJLyogU3ltYmlvcyBjaGlwcyB3cml0ZSBvbmx5IHR4X2VycnMgd29yZC4gKi8KKwkJCXlwLT50eF9yaW5nW2pdLmRiZG1hX2NtZCA9CisJCQkJY3B1X3RvX2xlMzIoQ01EX1RYU1RBVFVTIHwgSU5UUl9BTFdBWVMgfCAyKTsKKwkJCXlwLT50eF9yaW5nW2pdLnJlcXVlc3RfY250ID0gMjsKKwkJCS8qIE9tIHBhZGUgdW1tbW1tLi4uICovCisJCQl5cC0+dHhfcmluZ1tqXS5hZGRyID0gY3B1X3RvX2xlMzIoeXAtPnR4X3N0YXR1c19kbWEgKworCQkJCWkqc2l6ZW9mKHN0cnVjdCB0eF9zdGF0dXNfd29yZHMpICsKKwkJCQkmKHlwLT50eF9zdGF0dXNbMF0udHhfZXJycykgLSAKKwkJCQkmKHlwLT50eF9zdGF0dXNbMF0pKTsKKwkJfQorCQl5cC0+dHhfcmluZ1tqXS5icmFuY2hfYWRkciA9IGNwdV90b19sZTMyKHlwLT50eF9yaW5nX2RtYSArIAorCQkJKChqKzEpJSgyKlRYX1JJTkdfU0laRSkpKnNpemVvZihzdHJ1Y3QgeWVsbG93ZmluX2Rlc2MpKTsKKwl9CisJLyogV3JhcCByaW5nICovCisJeXAtPnR4X3JpbmdbKytqXS5kYmRtYV9jbWQgfD0gY3B1X3RvX2xlMzIoQlJBTkNIX0FMV0FZUyB8IElOVFJfQUxXQVlTKTsKK30KKyNlbmRpZgorCXlwLT50eF90YWlsX2Rlc2MgPSAmeXAtPnR4X3N0YXR1c1swXTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgeWVsbG93ZmluX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBlbnRyeTsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCisJLyogTm90ZTogT3JkZXJpbmcgaXMgaW1wb3J0YW50IGhlcmUsIHNldCB0aGUgZmllbGQgd2l0aCB0aGUKKwkgICAib3duZXJzaGlwIiBiaXQgbGFzdCwgYW5kIG9ubHkgdGhlbiBpbmNyZW1lbnQgY3VyX3R4LiAqLworCisJLyogQ2FsY3VsYXRlIHRoZSBuZXh0IFR4IGRlc2NyaXB0b3IgZW50cnkuICovCisJZW50cnkgPSB5cC0+Y3VyX3R4ICUgVFhfUklOR19TSVpFOworCisJaWYgKGd4X2ZpeCkgewkvKiBOb3RlOiBvbmx5IHdvcmtzIGZvciBwYWRkYWJsZSBwcm90b2NvbHMgZS5nLiAgSVAuICovCisJCWludCBjYWNoZWxpbmVfZW5kID0gKCh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSArIHNrYi0+bGVuKSAlIDMyOworCQkvKiBGaXggR1ggY2hpcHNldCBlcnJhdGEuICovCisJCWlmIChjYWNoZWxpbmVfZW5kID4gMjQgIHx8IGNhY2hlbGluZV9lbmQgPT0gMCkgeworCQkJbGVuID0gc2tiLT5sZW4gKyAzMiAtIGNhY2hlbGluZV9lbmQgKyAxOworCQkJaWYgKGxlbiAhPSBza2ItPmxlbikKKwkJCQlza2IgPSBza2JfcGFkdG8oc2tiLCBsZW4pOworCQl9CisJCWlmIChza2IgPT0gTlVMTCkgeworCQkJeXAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJeXAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisKKyNpZmRlZiBOT19UWFNUQVRTCisJeXAtPnR4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZSh5cC0+cGNpX2RldiwgCisJCXNrYi0+ZGF0YSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKSk7CisJeXAtPnR4X3JpbmdbZW50cnldLnJlc3VsdF9zdGF0dXMgPSAwOworCWlmIChlbnRyeSA+PSBUWF9SSU5HX1NJWkUtMSkgeworCQkvKiBOZXcgc3RvcCBjb21tYW5kLiAqLworCQl5cC0+dHhfcmluZ1swXS5kYmRtYV9jbWQgPSBjcHVfdG9fbGUzMihDTURfU1RPUCk7CisJCXlwLT50eF9yaW5nW1RYX1JJTkdfU0laRS0xXS5kYmRtYV9jbWQgPQorCQkJY3B1X3RvX2xlMzIoQ01EX1RYX1BLVHxCUkFOQ0hfQUxXQVlTIHwgbGVuKTsKKwl9IGVsc2UgeworCQl5cC0+dHhfcmluZ1tlbnRyeSsxXS5kYmRtYV9jbWQgPSBjcHVfdG9fbGUzMihDTURfU1RPUCk7CisJCXlwLT50eF9yaW5nW2VudHJ5XS5kYmRtYV9jbWQgPQorCQkJY3B1X3RvX2xlMzIoQ01EX1RYX1BLVCB8IEJSQU5DSF9JRlRSVUUgfCBsZW4pOworCX0KKwl5cC0+Y3VyX3R4Kys7CisjZWxzZQorCXlwLT50eF9yaW5nW2VudHJ5PDwxXS5yZXF1ZXN0X2NudCA9IGxlbjsKKwl5cC0+dHhfcmluZ1tlbnRyeTw8MV0uYWRkciA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHlwLT5wY2lfZGV2LCAKKwkJc2tiLT5kYXRhLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpKTsKKwkvKiBUaGUgaW5wdXRfbGFzdCAoc3RhdHVzLXdyaXRlKSBjb21tYW5kIGlzIGNvbnN0YW50LCBidXQgd2UgbXVzdCAKKwkgICByZXdyaXRlIHRoZSBzdWJzZXF1ZW50ICdzdG9wJyBjb21tYW5kLiAqLworCisJeXAtPmN1cl90eCsrOworCXsKKwkJdW5zaWduZWQgbmV4dF9lbnRyeSA9IHlwLT5jdXJfdHggJSBUWF9SSU5HX1NJWkU7CisJCXlwLT50eF9yaW5nW25leHRfZW50cnk8PDFdLmRiZG1hX2NtZCA9IGNwdV90b19sZTMyKENNRF9TVE9QKTsKKwl9CisJLyogRmluYWwgc3RlcCAtLSBvdmVyd3JpdGUgdGhlIG9sZCAnc3RvcCcgY29tbWFuZC4gKi8KKworCXlwLT50eF9yaW5nW2VudHJ5PDwxXS5kYmRtYV9jbWQgPQorCQljcHVfdG9fbGUzMiggKChlbnRyeSAlIDYpID09IDAgPyBDTURfVFhfUEtUfElOVFJfQUxXQVlTfEJSQU5DSF9JRlRSVUUgOgorCQkJCQkgIENNRF9UWF9QS1QgfCBCUkFOQ0hfSUZUUlVFKSB8IGxlbik7CisjZW5kaWYKKworCS8qIE5vbi14ODYgVG9kbzogZXhwbGljaXRseSBmbHVzaCBjYWNoZSBsaW5lcyBoZXJlLiAqLworCisJLyogV2FrZSB0aGUgcG90ZW50aWFsbHktaWRsZSB0cmFuc21pdCBjaGFubmVsLiAqLworCWlvd3JpdGUzMigweDEwMDAxMDAwLCB5cC0+YmFzZSArIFR4Q3RybCk7CisKKwlpZiAoeXAtPmN1cl90eCAtIHlwLT5kaXJ0eV90eCA8IFRYX1FVRVVFX1NJWkUpCisJCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOwkJLyogVHlwaWNhbCBwYXRoICovCisJZWxzZQorCQl5cC0+dHhfZnVsbCA9IDE7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlpZiAoeWVsbG93ZmluX2RlYnVnID4gNCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFllbGxvd2ZpbiB0cmFuc21pdCBmcmFtZSAjJWQgcXVldWVkIGluIHNsb3QgJWQuXG4iLAorCQkJICAgZGV2LT5uYW1lLCB5cC0+Y3VyX3R4LCBlbnRyeSk7CisJfQorCXJldHVybiAwOworfQorCisvKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhbGwgb2YgdGhlIFJ4IHRocmVhZCB3b3JrIGFuZCBjbGVhbnMgdXAKKyAgIGFmdGVyIHRoZSBUeCB0aHJlYWQuICovCitzdGF0aWMgaXJxcmV0dXJuX3QgeWVsbG93ZmluX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICp5cDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwlpbnQgYm9ndXNjbnQgPSBtYXhfaW50ZXJydXB0X3dvcms7CisJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAwOworCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24JCQkvKiBDYW4gbmV2ZXIgb2NjdXIuICovCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayAoS0VSTl9FUlIgInllbGxvd2Zpbl9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisjZW5kaWYKKworCXlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpb2FkZHIgPSB5cC0+YmFzZTsKKwkKKwlzcGluX2xvY2sgKCZ5cC0+bG9jayk7CisKKwlkbyB7CisJCXUxNiBpbnRyX3N0YXR1cyA9IGlvcmVhZDE2KGlvYWRkciArIEludHJDbGVhcik7CisKKwkJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFllbGxvd2ZpbiBpbnRlcnJ1cHQsIHN0YXR1cyAlNC40eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisKKwkJaWYgKGludHJfc3RhdHVzID09IDApCisJCQlicmVhazsKKwkJaGFuZGxlZCA9IDE7CisKKwkJaWYgKGludHJfc3RhdHVzICYgKEludHJSeERvbmUgfCBJbnRyRWFybHlSeCkpIHsKKwkJCXllbGxvd2Zpbl9yeChkZXYpOworCQkJaW93cml0ZTMyKDB4MTAwMDEwMDAsIGlvYWRkciArIFJ4Q3RybCk7CQkvKiBXYWtlIFJ4IGVuZ2luZS4gKi8KKwkJfQorCisjaWZkZWYgTk9fVFhTVEFUUworCQlmb3IgKDsgeXAtPmN1cl90eCAtIHlwLT5kaXJ0eV90eCA+IDA7IHlwLT5kaXJ0eV90eCsrKSB7CisJCQlpbnQgZW50cnkgPSB5cC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlpZiAoeXAtPnR4X3JpbmdbZW50cnldLnJlc3VsdF9zdGF0dXMgPT0gMCkKKwkJCQlicmVhazsKKwkJCXNrYiA9IHlwLT50eF9za2J1ZmZbZW50cnldOworCQkJeXAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCXlwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KKwkJCXBjaV91bm1hcF9zaW5nbGUoeXAtPnBjaV9kZXYsIHlwLT50eF9yaW5nW2VudHJ5XS5hZGRyLAorCQkJCXNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQl5cC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCX0KKwkJaWYgKHlwLT50eF9mdWxsCisJCQkmJiB5cC0+Y3VyX3R4IC0geXAtPmRpcnR5X3R4IDwgVFhfUVVFVUVfU0laRSAtIDQpIHsKKwkJCS8qIFRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsLCBjbGVhciB0YnVzeS4gKi8KKwkJCXlwLT50eF9mdWxsID0gMDsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorI2Vsc2UKKwkJaWYgKChpbnRyX3N0YXR1cyAmIEludHJUeERvbmUpIHx8ICh5cC0+dHhfdGFpbF9kZXNjLT50eF9lcnJzKSkgeworCQkJdW5zaWduZWQgZGlydHlfdHggPSB5cC0+ZGlydHlfdHg7CisKKwkJCWZvciAoZGlydHlfdHggPSB5cC0+ZGlydHlfdHg7IHlwLT5jdXJfdHggLSBkaXJ0eV90eCA+IDA7CisJCQkJIGRpcnR5X3R4KyspIHsKKwkJCQkvKiBUb2RvOiBvcHRpbWl6ZSB0aGlzLiAqLworCQkJCWludCBlbnRyeSA9IGRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQkJCXUxNiB0eF9lcnJzID0geXAtPnR4X3N0YXR1c1tlbnRyeV0udHhfZXJyczsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCQlpZiAoeWVsbG93ZmluX2RlYnVnID4gNSkKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeCBxdWV1ZSAlZCBjaGVjaywgVHggc3RhdHVzICIKKwkJCQkJCSAgICIlNC40eCAlNC40eCAlNC40eCAlNC40eC5cbiIsCisJCQkJCQkgICBkZXYtPm5hbWUsIGVudHJ5LAorCQkJCQkJICAgeXAtPnR4X3N0YXR1c1tlbnRyeV0udHhfY250LAorCQkJCQkJICAgeXAtPnR4X3N0YXR1c1tlbnRyeV0udHhfZXJycywKKwkJCQkJCSAgIHlwLT50eF9zdGF0dXNbZW50cnldLnRvdGFsX3R4X2NudCwKKwkJCQkJCSAgIHlwLT50eF9zdGF0dXNbZW50cnldLnBhdXNlZCk7CisjZW5kaWYKKwkJCQlpZiAodHhfZXJycyA9PSAwKQorCQkJCQlicmVhazsJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gVHhlZCAqLworCQkJCXNrYiA9IHlwLT50eF9za2J1ZmZbZW50cnldOworCQkJCWlmICh0eF9lcnJzICYgMHhGODEwKSB7CisJCQkJCS8qIFRoZXJlIHdhcyBhbiBtYWpvciBlcnJvciwgbG9nIGl0LiAqLworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQkJCWlmICh5ZWxsb3dmaW5fZGVidWcgPiAxKQorCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBlcnJvciwgVHggc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkJCQkgICBkZXYtPm5hbWUsIHR4X2VycnMpOworI2VuZGlmCisJCQkJCXlwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQkJaWYgKHR4X2VycnMgJiAweEY4MDApIHlwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCQlpZiAodHhfZXJycyAmIDB4MDgwMCkgeXAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJCWlmICh0eF9lcnJzICYgMHgyMDAwKSB5cC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJCQlpZiAodHhfZXJycyAmIDB4ODAwMCkgeXAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJfSBlbHNlIHsKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJCQlpZiAoeWVsbG93ZmluX2RlYnVnID4gNCkKKwkJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTm9ybWFsIHRyYW5zbWl0LCBUeCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCQkJCSAgIGRldi0+bmFtZSwgdHhfZXJycyk7CisjZW5kaWYKKwkJCQkJeXAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQkJCQl5cC0+c3RhdHMuY29sbGlzaW9ucyArPSB0eF9lcnJzICYgMTU7CisJCQkJCXlwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJfQorCQkJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHlwLT5wY2lfZGV2LCAKKwkJCQkJeXAtPnR4X3JpbmdbZW50cnk8PDFdLmFkZHIsIHNrYi0+bGVuLCAKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCQl5cC0+dHhfc2tidWZmW2VudHJ5XSA9IDA7CisJCQkJLyogTWFyayBzdGF0dXMgYXMgZW1wdHkuICovCisJCQkJeXAtPnR4X3N0YXR1c1tlbnRyeV0udHhfZXJycyA9IDA7CisJCQl9CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJaWYgKHlwLT5jdXJfdHggLSBkaXJ0eV90eCA+IFRYX1JJTkdfU0laRSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dC1vZi1zeW5jIGRpcnR5IHBvaW50ZXIsICVkIHZzLiAlZCwgZnVsbD0lZC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgZGlydHlfdHgsIHlwLT5jdXJfdHgsIHlwLT50eF9mdWxsKTsKKwkJCQlkaXJ0eV90eCArPSBUWF9SSU5HX1NJWkU7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKHlwLT50eF9mdWxsCisJCQkJJiYgeXAtPmN1cl90eCAtIGRpcnR5X3R4IDwgVFhfUVVFVUVfU0laRSAtIDIpIHsKKwkJCQkvKiBUaGUgcmluZyBpcyBubyBsb25nZXIgZnVsbCwgY2xlYXIgdGJ1c3kuICovCisJCQkJeXAtPnR4X2Z1bGwgPSAwOworCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCX0KKworCQkJeXAtPmRpcnR5X3R4ID0gZGlydHlfdHg7CisJCQl5cC0+dHhfdGFpbF9kZXNjID0gJnlwLT50eF9zdGF0dXNbZGlydHlfdHggJSBUWF9SSU5HX1NJWkVdOworCQl9CisjZW5kaWYKKworCQkvKiBMb2cgZXJyb3JzIGFuZCBvdGhlciB1bmNvbW1vbiBldmVudHMuICovCisJCWlmIChpbnRyX3N0YXR1cyAmIDB4MmVlKQkvKiBBYm5vcm1hbCBlcnJvciBzdW1tYXJ5LiAqLworCQkJeWVsbG93ZmluX2Vycm9yKGRldiwgaW50cl9zdGF0dXMpOworCisJCWlmICgtLWJvZ3VzY250IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtdWNoIHdvcmsgYXQgaW50ZXJydXB0LCAiCisJCQkJICAgInN0YXR1cz0weCU0LjR4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlpZiAoeWVsbG93ZmluX2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzPSUjNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDE2KGlvYWRkciArIEludHJTdGF0dXMpKTsKKworCXNwaW5fdW5sb2NrICgmeXAtPmxvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgbG9naWNhbGx5IHBhcnQgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyLCBidXQgc2VwYXJhdGVkCisgICBmb3IgY2xhcml0eSBhbmQgYmV0dGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uICovCitzdGF0aWMgaW50IHllbGxvd2Zpbl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSAqeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeSA9IHlwLT5jdXJfcnggJSBSWF9SSU5HX1NJWkU7CisJaW50IGJvZ3VzY250ID0geXAtPmRpcnR5X3J4ICsgUlhfUklOR19TSVpFIC0geXAtPmN1cl9yeDsKKworCWlmICh5ZWxsb3dmaW5fZGVidWcgPiA0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIgSW4geWVsbG93ZmluX3J4KCksIGVudHJ5ICVkIHN0YXR1cyAlOC44eC5cbiIsCisJCQkgICBlbnRyeSwgeXAtPnJ4X3JpbmdbZW50cnldLnJlc3VsdF9zdGF0dXMpOworCQlwcmludGsoS0VSTl9ERUJVRyAiICAgIyVkIGRlc2MuICU4Ljh4ICU4Ljh4ICU4Ljh4LlxuIiwKKwkJCSAgIGVudHJ5LCB5cC0+cnhfcmluZ1tlbnRyeV0uZGJkbWFfY21kLCB5cC0+cnhfcmluZ1tlbnRyeV0uYWRkciwKKwkJCSAgIHlwLT5yeF9yaW5nW2VudHJ5XS5yZXN1bHRfc3RhdHVzKTsKKwl9CisKKwkvKiBJZiBFT1AgaXMgc2V0IG9uIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgeWVsbG93ZmluX2Rlc2MgKmRlc2MgPSAmeXAtPnJ4X3JpbmdbZW50cnldOworCQlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiID0geXAtPnJ4X3NrYnVmZltlbnRyeV07CisJCXMxNiBmcmFtZV9zdGF0dXM7CisJCXUxNiBkZXNjX3N0YXR1czsKKwkJaW50IGRhdGFfc2l6ZTsKKwkJdTggKmJ1Zl9hZGRyOworCisJCWlmKCFkZXNjLT5yZXN1bHRfc3RhdHVzKQorCQkJYnJlYWs7CisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSh5cC0+cGNpX2RldiwgZGVzYy0+YWRkciwKKwkJCXlwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWRlc2Nfc3RhdHVzID0gbGUzMl90b19jcHUoZGVzYy0+cmVzdWx0X3N0YXR1cykgPj4gMTY7CisJCWJ1Zl9hZGRyID0gcnhfc2tiLT50YWlsOworCQlkYXRhX3NpemUgPSAobGUzMl90b19jcHUoZGVzYy0+ZGJkbWFfY21kKSAtIAorCQkJbGUzMl90b19jcHUoZGVzYy0+cmVzdWx0X3N0YXR1cykpICYgMHhmZmZmOworCQlmcmFtZV9zdGF0dXMgPSBsZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChzMTYqKSYoYnVmX2FkZHJbZGF0YV9zaXplIC0gMl0pKSk7CisJCWlmICh5ZWxsb3dmaW5fZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgeWVsbG93ZmluX3J4KCkgc3RhdHVzIHdhcyAlNC40eC5cbiIsCisJCQkJICAgZnJhbWVfc3RhdHVzKTsKKwkJaWYgKC0tYm9ndXNjbnQgPCAwKQorCQkJYnJlYWs7CisJCWlmICggISAoZGVzY19zdGF0dXMgJiBSWF9FT1ApKSB7CisJCQlpZiAoZGF0YV9zaXplICE9IDApCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCBmcmFtZSBzcGFubmVkIG11bHRpcGxlIGJ1ZmZlcnMsIgorCQkJCQkgICAiIHN0YXR1cyAlNC40eCwgZGF0YV9zaXplICVkIVxuIiwgZGV2LT5uYW1lLCBkZXNjX3N0YXR1cywgZGF0YV9zaXplKTsKKwkJCXlwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCX0gZWxzZSBpZiAoKHlwLT5kcnZfZmxhZ3MgJiBJc0dpZ2FiaXQpICAmJiAgKGZyYW1lX3N0YXR1cyAmIDB4MDAzOCkpIHsKKwkJCS8qIFRoZXJlIHdhcyBhIGVycm9yLiAqLworCQkJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDMpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgeWVsbG93ZmluX3J4KCkgUnggZXJyb3Igd2FzICU0LjR4LlxuIiwKKwkJCQkJICAgZnJhbWVfc3RhdHVzKTsKKwkJCXlwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiAweDAwNjApIHlwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDA4KSB5cC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDEwKSB5cC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyA8IDApIHlwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCX0gZWxzZSBpZiAoICEoeXAtPmRydl9mbGFncyAmIElzR2lnYWJpdCkgICYmCisJCQkJICAgKChidWZfYWRkcltkYXRhX3NpemUtMV0gJiAweDg1KSB8fCBidWZfYWRkcltkYXRhX3NpemUtMl0gJiAweEMwKSkgeworCQkJdTggc3RhdHVzMSA9IGJ1Zl9hZGRyW2RhdGFfc2l6ZS0yXTsKKwkJCXU4IHN0YXR1czIgPSBidWZfYWRkcltkYXRhX3NpemUtMV07CisJCQl5cC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzMSAmIDB4QzApIHlwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzMiAmIDB4MDMpIHlwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMyICYgMHgwNCkgeXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMyICYgMHg4MCkgeXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKyNpZmRlZiBZRl9QUk9UT1RZUEUJCS8qIFN1cHBvcnQgZm9yIHByb3RvdHlwZSBoYXJkd2FyZSBlcnJhdGEuICovCisJCX0gZWxzZSBpZiAoKHlwLT5mbGFncyAmIEhhc01BQ0FkZHJCdWcpICAmJgorCQkJbWVtY21wKGxlMzJfdG9fY3B1KHlwLT5yeF9yaW5nX2RtYSArCisJCQkJZW50cnkqc2l6ZW9mKHN0cnVjdCB5ZWxsb3dmaW5fZGVzYykpLAorCQkJCWRldi0+ZGV2X2FkZHIsIDYpICE9IDAgJiYgCisJCQltZW1jbXAobGUzMl90b19jcHUoeXAtPnJ4X3JpbmdfZG1hICsKKwkJCQllbnRyeSpzaXplb2Yoc3RydWN0IHllbGxvd2Zpbl9kZXNjKSksCisJCQkJIlwzNzdcMzc3XDM3N1wzNzdcMzc3XDM3NyIsIDYpICE9IDApIHsKKwkJCWlmIChib2d1c19yeCsrID09IDApCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEJhZCBmcmFtZSB0byAlMi4yeDolMi4yeDolMi4yeDolMi4yeDoiCisJCQkJCSAgICIlMi4yeDolMi4yeC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgYnVmX2FkZHJbMF0sIGJ1Zl9hZGRyWzFdLCBidWZfYWRkclsyXSwKKwkJCQkJICAgYnVmX2FkZHJbM10sIGJ1Zl9hZGRyWzRdLCBidWZfYWRkcls1XSk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQlpbnQgcGt0X2xlbiA9IGRhdGFfc2l6ZSAtCisJCQkJKHlwLT5jaGlwX2lkID8gNyA6IDggKyBidWZfYWRkcltkYXRhX3NpemUgLSA4XSk7CisJCQkvKiBUbyB2ZXJpZnk6IFllbGxvd2ZpbiBMZW5ndGggc2hvdWxkIG9taXQgdGhlIENSQyEgKi8KKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQlpZiAoeWVsbG93ZmluX2RlYnVnID4gNCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiICB5ZWxsb3dmaW5fcngoKSBub3JtYWwgUnggcGt0IGxlbmd0aCAlZCIKKwkJCQkJICAgIiBvZiAlZCwgYm9ndXNfY250ICVkLlxuIiwKKwkJCQkJICAgcGt0X2xlbiwgZGF0YV9zaXplLCBib2d1c2NudCk7CisjZW5kaWYKKwkJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8ganVzdCBwYXNzIHVwIHRoZSBza2J1ZmYKKwkJCSAgIHdpdGhvdXQgY29weWluZyB0byBhIHByb3Blcmx5IHNpemVkIHNrYnVmZi4gKi8KKwkJCWlmIChwa3RfbGVuID4gcnhfY29weWJyZWFrKSB7CisJCQkJc2tiX3B1dChza2IgPSByeF9za2IsIHBrdF9sZW4pOworCQkJCXBjaV91bm1hcF9zaW5nbGUoeXAtPnBjaV9kZXYsIAorCQkJCQl5cC0+cnhfcmluZ1tlbnRyeV0uYWRkciwgCisJCQkJCXlwLT5yeF9idWZfc3osIAorCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXlwLT5yeF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMik7CisJCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCQlicmVhazsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgcnhfc2tiLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHlwLT5wY2lfZGV2LCBkZXNjLT5hZGRyLAorCQkJCQkJCQkJCQkgICB5cC0+cnhfYnVmX3N6LAorCQkJCQkJCQkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJeXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCXlwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisJCWVudHJ5ID0gKCsreXAtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CisJfQorCisJLyogUmVmaWxsIHRoZSBSeCByaW5nIGJ1ZmZlcnMuICovCisJZm9yICg7IHlwLT5jdXJfcnggLSB5cC0+ZGlydHlfcnggPiAwOyB5cC0+ZGlydHlfcngrKykgeworCQllbnRyeSA9IHlwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwkJaWYgKHlwLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKHlwLT5yeF9idWZfc3opOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWJyZWFrOwkJCQkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kLiAqLworCQkJeXAtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJCQlza2ItPmRldiA9IGRldjsJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisJCQl5cC0+cnhfcmluZ1tlbnRyeV0uYWRkciA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHlwLT5wY2lfZGV2LAorCQkJCXNrYi0+dGFpbCwgeXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCX0KKwkJeXAtPnJ4X3JpbmdbZW50cnldLmRiZG1hX2NtZCA9IGNwdV90b19sZTMyKENNRF9TVE9QKTsKKwkJeXAtPnJ4X3JpbmdbZW50cnldLnJlc3VsdF9zdGF0dXMgPSAwOwkvKiBDbGVhciBjb21wbGV0ZSBiaXQuICovCisJCWlmIChlbnRyeSAhPSAwKQorCQkJeXAtPnJ4X3JpbmdbZW50cnkgLSAxXS5kYmRtYV9jbWQgPQorCQkJCWNwdV90b19sZTMyKENNRF9SWF9CVUYgfCBJTlRSX0FMV0FZUyB8IHlwLT5yeF9idWZfc3opOworCQllbHNlCisJCQl5cC0+cnhfcmluZ1tSWF9SSU5HX1NJWkUgLSAxXS5kYmRtYV9jbWQgPQorCQkJCWNwdV90b19sZTMyKENNRF9SWF9CVUYgfCBJTlRSX0FMV0FZUyB8IEJSQU5DSF9BTFdBWVMKKwkJCQkJCQl8IHlwLT5yeF9idWZfc3opOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB5ZWxsb3dmaW5fZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKQoreworCXN0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSAqeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcHJpbnRrKEtFUk5fRVJSICIlczogU29tZXRoaW5nIFdpY2tlZCBoYXBwZW5lZCEgJTQuNHguXG4iLAorCQkgICBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKwkvKiBIbW1tbW0sIGl0J3Mgbm90IGNsZWFyIHdoYXQgdG8gZG8gaGVyZS4gKi8KKwlpZiAoaW50cl9zdGF0dXMgJiAoSW50clR4UENJRXJyIHwgSW50clR4UENJRmF1bHQpKQorCQl5cC0+c3RhdHMudHhfZXJyb3JzKys7CisJaWYgKGludHJfc3RhdHVzICYgKEludHJSeFBDSUVyciB8IEludHJSeFBDSUZhdWx0KSkKKwkJeXAtPnN0YXRzLnJ4X2Vycm9ycysrOworfQorCitzdGF0aWMgaW50IHllbGxvd2Zpbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSAqeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0geXAtPmJhc2U7CisJaW50IGk7CisKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCisJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyBUeCAlNC40eCAiCisJCQkgICAiUnggJTQuNHggSW50ICUyLjJ4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMTYoaW9hZGRyICsgVHhTdGF0dXMpLAorCQkJICAgaW9yZWFkMTYoaW9hZGRyICsgUnhTdGF0dXMpLAorCQkJICAgaW9yZWFkMTYoaW9hZGRyICsgSW50clN0YXR1cykpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFF1ZXVlIHBvaW50ZXJzIHdlcmUgVHggJWQgLyAlZCwgIFJ4ICVkIC8gJWQuXG4iLAorCQkJICAgZGV2LT5uYW1lLCB5cC0+Y3VyX3R4LCB5cC0+ZGlydHlfdHgsIHlwLT5jdXJfcngsIHlwLT5kaXJ0eV9yeCk7CisJfQorCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlpb3dyaXRlMTYoMHgwMDAwLCBpb2FkZHIgKyBJbnRyRW5iKTsKKworCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworCWlvd3JpdGUzMigweDgwMDAwMDAwLCBpb2FkZHIgKyBSeEN0cmwpOworCWlvd3JpdGUzMigweDgwMDAwMDAwLCBpb2FkZHIgKyBUeEN0cmwpOworCisJZGVsX3RpbWVyKCZ5cC0+dGltZXIpOworCisjaWYgZGVmaW5lZChfX2kzODZfXykKKwlpZiAoeWVsbG93ZmluX2RlYnVnID4gMikgeworCQlwcmludGsoIlxuIktFUk5fREVCVUciICBUeCByaW5nIGF0ICU4LjhsbHg6XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpeXAtPnR4X3JpbmdfZG1hKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRSoyOyBpKyspCisJCQlwcmludGsoIiAlYyAjJWQgZGVzYy4gJTguOHggJTguOHggJTguOHggJTguOHguXG4iLAorCQkJCSAgIGlvcmVhZDMyKGlvYWRkciArIFR4UHRyKSA9PSAobG9uZykmeXAtPnR4X3JpbmdbaV0gPyAnPicgOiAnICcsCisJCQkJICAgaSwgeXAtPnR4X3JpbmdbaV0uZGJkbWFfY21kLCB5cC0+dHhfcmluZ1tpXS5hZGRyLAorCQkJCSAgIHlwLT50eF9yaW5nW2ldLmJyYW5jaF9hZGRyLCB5cC0+dHhfcmluZ1tpXS5yZXN1bHRfc3RhdHVzKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgVHggc3RhdHVzICVwOlxuIiwgeXAtPnR4X3N0YXR1cyk7CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKKwkJCXByaW50aygiICAgIyVkIHN0YXR1cyAlNC40eCAlNC40eCAlNC40eCAlNC40eC5cbiIsCisJCQkJICAgaSwgeXAtPnR4X3N0YXR1c1tpXS50eF9jbnQsIHlwLT50eF9zdGF0dXNbaV0udHhfZXJycywKKwkJCQkgICB5cC0+dHhfc3RhdHVzW2ldLnRvdGFsX3R4X2NudCwgeXAtPnR4X3N0YXR1c1tpXS5wYXVzZWQpOworCisJCXByaW50aygiXG4iS0VSTl9ERUJVRyAiICBSeCByaW5nICU4LjhsbHg6XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpeXAtPnJ4X3JpbmdfZG1hKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiICVjICMlZCBkZXNjLiAlOC44eCAlOC44eCAlOC44eFxuIiwKKwkJCQkgICBpb3JlYWQzMihpb2FkZHIgKyBSeFB0cikgPT0gKGxvbmcpJnlwLT5yeF9yaW5nW2ldID8gJz4nIDogJyAnLAorCQkJCSAgIGksIHlwLT5yeF9yaW5nW2ldLmRiZG1hX2NtZCwgeXAtPnJ4X3JpbmdbaV0uYWRkciwKKwkJCQkgICB5cC0+cnhfcmluZ1tpXS5yZXN1bHRfc3RhdHVzKTsKKwkJCWlmICh5ZWxsb3dmaW5fZGVidWcgPiA2KSB7CisJCQkJaWYgKGdldF91bmFsaWduZWQoKHU4Kil5cC0+cnhfcmluZ1tpXS5hZGRyKSAhPSAweDY5KSB7CisJCQkJCWludCBqOworCQkJCQlmb3IgKGogPSAwOyBqIDwgMHg1MDsgaisrKQorCQkJCQkJcHJpbnRrKCIgJTQuNHgiLAorCQkJCQkJCSAgIGdldF91bmFsaWduZWQoKCh1MTYqKXlwLT5yeF9yaW5nW2ldLmFkZHIpICsgaikpOworCQkJCQlwcmludGsoIlxuIik7CisJCQkJfQorCQkJfQorCQl9CisJfQorI2VuZGlmIC8qIF9faTM4Nl9fIGRlYnVnZ2luZyBvbmx5ICovCisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCS8qIEZyZWUgYWxsIHRoZSBza2J1ZmZzIGluIHRoZSBSeCBxdWV1ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJeXAtPnJ4X3JpbmdbaV0uZGJkbWFfY21kID0gY3B1X3RvX2xlMzIoQ01EX1NUT1ApOworCQl5cC0+cnhfcmluZ1tpXS5hZGRyID0gMHhCQURGMDBEMDsgLyogQW4gaW52YWxpZCBhZGRyZXNzLiAqLworCQlpZiAoeXAtPnJ4X3NrYnVmZltpXSkgeworCQkJZGV2X2tmcmVlX3NrYih5cC0+cnhfc2tidWZmW2ldKTsKKwkJfQorCQl5cC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwl9CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmICh5cC0+dHhfc2tidWZmW2ldKQorCQkJZGV2X2tmcmVlX3NrYih5cC0+dHhfc2tidWZmW2ldKTsKKwkJeXAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJfQorCisjaWZkZWYgWUZfUFJPVE9UWVBFCQkJLyogU3VwcG9ydCBmb3IgcHJvdG90eXBlIGhhcmR3YXJlIGVycmF0YS4gKi8KKwlpZiAoeWVsbG93ZmluX2RlYnVnID4gMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlY2VpdmVkICVkIGZyYW1lcyB0aGF0IHdlIHNob3VsZCBub3QgaGF2ZS5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGJvZ3VzX3J4KTsKKwl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnllbGxvd2Zpbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJnlwLT5zdGF0czsKK30KKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuICovCisKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB5cC0+YmFzZTsKKwl1MTYgY2ZnX3ZhbHVlID0gaW9yZWFkMTYoaW9hZGRyICsgQ25mZyk7CisKKwkvKiBTdG9wIHRoZSBSeCBwcm9jZXNzIHRvIGNoYW5nZSBhbnkgdmFsdWUuICovCisJaW93cml0ZTE2KGNmZ192YWx1ZSAmIH4weDEwMDAsIGlvYWRkciArIENuZmcpOworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJCQkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCWlvd3JpdGUxNigweDAwMEYsIGlvYWRkciArIEFkZHJNb2RlKTsKKwl9IGVsc2UgaWYgKChkZXYtPm1jX2NvdW50ID4gNjQpICB8fCAgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIGZpbHRlciB3ZWxsLCBvciBhY2NlcHQgYWxsIG11bHRpY2FzdHMuICovCisJCWlvd3JpdGUxNigweDAwMEIsIGlvYWRkciArIEFkZHJNb2RlKTsKKwl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPiAwKSB7IC8qIE11c3QgdXNlIHRoZSBtdWx0aWNhc3QgaGFzaCB0YWJsZS4gKi8KKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCXUxNiBoYXNoX3RhYmxlWzRdOworCQlpbnQgaTsKKwkJbWVtc2V0KGhhc2hfdGFibGUsIDAsIHNpemVvZihoYXNoX3RhYmxlKSk7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkJIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQl1bnNpZ25lZCBpbnQgYml0OworCisJCQkvKiBEdWUgdG8gYSBidWcgaW4gdGhlIGVhcmx5IGNoaXAgdmVyc2lvbnMsIG11bHRpcGxlIGZpbHRlcgorCQkJICAgc2xvdHMgbXVzdCBiZSBzZXQgZm9yIGVhY2ggYWRkcmVzcy4gKi8KKwkJCWlmICh5cC0+ZHJ2X2ZsYWdzICYgSGFzTXVsdGljYXN0QnVnKSB7CisJCQkJYml0ID0gKGV0aGVyX2NyY19sZSgzLCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAzKSAmIDB4M2Y7CisJCQkJaGFzaF90YWJsZVtiaXQgPj4gNF0gfD0gKDEgPDwgYml0KTsKKwkJCQliaXQgPSAoZXRoZXJfY3JjX2xlKDQsIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDMpICYgMHgzZjsKKwkJCQloYXNoX3RhYmxlW2JpdCA+PiA0XSB8PSAoMSA8PCBiaXQpOworCQkJCWJpdCA9IChldGhlcl9jcmNfbGUoNSwgbWNsaXN0LT5kbWlfYWRkcikgPj4gMykgJiAweDNmOworCQkJCWhhc2hfdGFibGVbYml0ID4+IDRdIHw9ICgxIDw8IGJpdCk7CisJCQl9CisJCQliaXQgPSAoZXRoZXJfY3JjX2xlKDYsIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDMpICYgMHgzZjsKKwkJCWhhc2hfdGFibGVbYml0ID4+IDRdIHw9ICgxIDw8IGJpdCk7CisJCX0KKwkJLyogQ29weSB0aGUgaGFzaCB0YWJsZSB0byB0aGUgY2hpcC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWlvd3JpdGUxNihoYXNoX3RhYmxlW2ldLCBpb2FkZHIgKyBIYXNoVGJsICsgaSoyKTsKKwkJaW93cml0ZTE2KDB4MDAwMywgaW9hZGRyICsgQWRkck1vZGUpOworCX0gZWxzZSB7CQkJCQkvKiBOb3JtYWwsIHVuaWNhc3QvYnJvYWRjYXN0LW9ubHkgbW9kZS4gKi8KKwkJaW93cml0ZTE2KDB4MDAwMSwgaW9hZGRyICsgQWRkck1vZGUpOworCX0KKwkvKiBSZXN0YXJ0IHRoZSBSeCBwcm9jZXNzLiAqLworCWlvd3JpdGUxNihjZmdfdmFsdWUgfCAweDEwMDAsIGlvYWRkciArIENuZmcpOworfQorCitzdGF0aWMgdm9pZCB5ZWxsb3dmaW5fZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvID0geWVsbG93ZmluX2dldF9kcnZpbmZvCit9OworCitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJc3RydWN0IG1paV9pb2N0bF9kYXRhICpkYXRhID0gaWZfbWlpKHJxKTsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgkJLyogR2V0IGFkZHJlc3Mgb2YgTUlJIFBIWSBpbiB1c2UuICovCisJCWRhdGEtPnBoeV9pZCA9IG5wLT5waHlzWzBdICYgMHgxZjsKKwkJLyogRmFsbCBUaHJvdWdoICovCisKKwljYXNlIFNJT0NHTUlJUkVHOgkJLyogUmVhZCBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQlkYXRhLT52YWxfb3V0ID0gbWRpb19yZWFkKGlvYWRkciwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYpOworCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoZGF0YS0+cGh5X2lkID09IG5wLT5waHlzWzBdKSB7CisJCQl1MTYgdmFsdWUgPSBkYXRhLT52YWxfaW47CisJCQlzd2l0Y2ggKGRhdGEtPnJlZ19udW0pIHsKKwkJCWNhc2UgMDoKKwkJCQkvKiBDaGVjayBmb3IgYXV0b25lZ290aWF0aW9uIG9uIG9yIHJlc2V0LiAqLworCQkJCW5wLT5tZWRpYWxvY2sgPSAodmFsdWUgJiAweDkwMDApID8gMCA6IDE7CisJCQkJaWYgKG5wLT5tZWRpYWxvY2spCisJCQkJCW5wLT5mdWxsX2R1cGxleCA9ICh2YWx1ZSAmIDB4MDEwMCkgPyAxIDogMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDogbnAtPmFkdmVydGlzaW5nID0gdmFsdWU7IGJyZWFrOworCQkJfQorCQkJLyogUGVyaGFwcyBjaGVja19kdXBsZXgoZGV2KSwgZGVwZW5kaW5nIG9uIGNoaXAgc2VtYW50aWNzLiAqLworCQl9CisJCW1kaW9fd3JpdGUoaW9hZGRyLCBkYXRhLT5waHlfaWQgJiAweDFmLCBkYXRhLT5yZWdfbnVtICYgMHgxZiwgZGF0YS0+dmFsX2luKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgeWVsbG93ZmluX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICpucDsKKworCWlmICghZGV2KQorCQlCVUcoKTsKKwlucCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBTVEFUVVNfVE9UQUxfU0laRSwgbnAtPnR4X3N0YXR1cywgCisJCW5wLT50eF9zdGF0dXNfZG1hKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFJYX1RPVEFMX1NJWkUsIG5wLT5yeF9yaW5nLCBucC0+cnhfcmluZ19kbWEpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgbnAtPnR4X3JpbmcsIG5wLT50eF9yaW5nX2RtYSk7CisJdW5yZWdpc3Rlcl9uZXRkZXYgKGRldik7CisKKwlwY2lfaW91bm1hcChwZGV2LCBucC0+YmFzZSk7CisKKwlwY2lfcmVsZWFzZV9yZWdpb25zIChwZGV2KTsKKworCWZyZWVfbmV0ZGV2IChkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgeWVsbG93ZmluX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJPSB5ZWxsb3dmaW5fcGNpX3RibCwKKwkucHJvYmUJCT0geWVsbG93ZmluX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoeWVsbG93ZmluX3JlbW92ZV9vbmUpLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCB5ZWxsb3dmaW5faW5pdCAodm9pZCkKK3sKKy8qIHdoZW4gYSBtb2R1bGUsIHRoaXMgaXMgcHJpbnRlZCB3aGV0aGVyIG9yIG5vdCBkZXZpY2VzIGFyZSBmb3VuZCBpbiBwcm9iZSAqLworI2lmZGVmIE1PRFVMRQorCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZ5ZWxsb3dmaW5fZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgeWVsbG93ZmluX2NsZWFudXAgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmeWVsbG93ZmluX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoeWVsbG93ZmluX2luaXQpOworbW9kdWxlX2V4aXQoeWVsbG93ZmluX2NsZWFudXApOworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RVTEUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWMgeWVsbG93ZmluLmMiCisgKiAgY29tcGlsZS1jb21tYW5kLWFscGhhTFg6ICJnY2MgLURNT0RVTEUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgLWMgeWVsbG93ZmluLmMgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1zdHJlbmd0aC1yZWR1Y2UgLW1uby1mcC1yZWdzIC1XYSwtbTIxMTY0YSAtREJXWF9VU0FCTEUgLURCV0lPX0VOQUJMRUQiCisgKiAgc2ltcGxlLWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtTzYgLWMgeWVsbG93ZmluLmMiCisgKiAgYy1pbmRlbnQtbGV2ZWw6IDQKKyAqICBjLWJhc2ljLW9mZnNldDogNAorICogIHRhYi13aWR0aDogNAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC96bmV0LmMgYi9kcml2ZXJzL25ldC96bmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjMDQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3puZXQuYwpAQCAtMCwwICsxLDk0OCBAQAorLyogem5ldC5jOiBBbiBaZW5pdGggWi1Ob3RlIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguICovCisKKy8qCisJV3JpdHRlbiBieSBEb25hbGQgQmVja2VyLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLgorCVRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSBMaW51eCBza2VsZXRvbiBkcml2ZXIuICBUaGUgY29weXJpZ2h0IG9mIHRoZQorCXNrZWxldG9uIGRyaXZlciBpcyBoZWxkIGJ5IHRoZSBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQsIGFzIHJlcHJlc2VudGVkCisJYnkgRElSTlNBLCBhbmQgaXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KKworCVRoYW5rcyB0byBNaWtlIEhvbGxpY2sgZm9yIGFscGhhIHRlc3RpbmcgYW5kIHN1Z2dlc3Rpb25zLgorCisgIFJlZmVyZW5jZXM6CisJICAgVGhlIENyeW53ciBwYWNrZXQgZHJpdmVyLgorCisJICAiODI1OTMgQ1NNQS9DRCBDb3JlIExBTiBDb250cm9sbGVyIiBJbnRlbCBkYXRhc2hlZXQsIDE5OTIKKwkgIEludGVsIE1pY3JvY29tbXVuaWNhdGlvbnMgRGF0YWJvb2ssIFZvbC4gMSwgMTk5MC4KKyAgICBBcyB1c3VhbCB3aXRoIEludGVsLCB0aGUgZG9jdW1lbnRhdGlvbiBpcyBpbmNvbXBsZXRlIGFuZCBpbmFjY3VyYXRlLgorCUkgaGFkIHRvIHJlYWQgdGhlIENyeW53ciBwYWNrZXQgZHJpdmVyIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGFjdHVhbGx5CisJdXNlIHRoZSBpODI1OTMsIGFuZCBndWVzcyBhdCB3aGF0IHJlZ2lzdGVyIGJpdHMgbWF0Y2hlZCB0aGUgbG9vc2VseQorCXJlbGF0ZWQgaTgyNTg2LgorCisJCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworCVRoZSBpODI1OTMgdXNlZCBpbiB0aGUgWmVuaXRoIFotTm90ZSBzZXJpZXMgb3BlcmF0ZXMgdXNpbmcgdHdvKCEpIHNsYXZlCisJRE1BCWNoYW5uZWxzLCBvbmUgaW50ZXJydXB0LCBhbmQgb25lIDgtYml0IEkvTyBwb3J0LgorCisJV2hpbGUgdGhlcmUJc2V2ZXJhbCB3YXlzIHRvIGNvbmZpZ3VyZSAnNTkzIERNQSBzeXN0ZW0sIEkgY2hvc2UgdGhlIG9uZQorCXRoYXQgc2VlbWVkIGNvbW1lbnN1cmF0ZSB3aXRoIHRoZSBoaWdoZXN0IHN5c3RlbSBwZXJmb3JtYW5jZSBpbiB0aGUgZmFjZQorCW9mIG1vZGVyYXRlIGludGVycnVwdCBsYXRlbmN5OiBCb3RoIERNQSBjaGFubmVscyBhcmUgY29uZmlndXJlZCBhcworCXJlY2lyY3VsYXRpbmcgcmluZyBidWZmZXJzLCB3aXRoIG9uZSBjaGFubmVsICgjMCkgZGVkaWNhdGVkIHRvIFJ4IGFuZAorCXRoZSBvdGhlciBjaGFubmVsICgjMSkgdG8gVHggYW5kIGNvbmZpZ3VyYXRpb24uICAoTm90ZSB0aGF0IHRoaXMgaXMKKwlkaWZmZXJlbnQgdGhhbiB0aGUgQ3J5bndyIGRyaXZlciwgd2hlcmUgdGhlIFR4IERNQSBjaGFubmVsIGlzIGluaXRpYWxpemVkCisJYmVmb3JlIGVhY2ggb3BlcmF0aW9uLiAgVGhhdCBhcHByb2FjaCBzaW1wbGlmaWVzIG9wZXJhdGlvbiBhbmQgVHggZXJyb3IKKwlyZWNvdmVyeSwgYnV0IHJlcXVpcmVzIGFkZGl0aW9uYWwgSS9PIGluIG5vcm1hbCBvcGVyYXRpb24gYW5kIHByZWNsdWRlcworCXRyYW5zbWl0IGJ1ZmZlcgljaGFpbmluZy4pCisKKwlCb3RoIHJpbmdzIGFyZSBzZXQgdG8gODE5MiBieXRlcyB1c2luZyB7VFgsUlh9X1JJTkdfU0laRS4gIFRoaXMgcHJvdmlkZXMKKwlhIHJlYXNvbmFibGUgcmluZyBzaXplIGZvciBSeCwgd2hpbGUgc2ltcGxpZnlpbmcgRE1BIGJ1ZmZlciBhbGxvY2F0aW9uIC0tCisJRE1BIGJ1ZmZlcnMgbXVzdCBub3QgY3Jvc3MgYSAxMjhLIGJvdW5kYXJ5LiAgKEluIHRydXRoIHRoZSBzaXplIHNlbGVjdGlvbgorCXdhcyBpbmZsdWVuY2VkIGJ5IG15IGxhY2sgb2YgJzU5MyBkb2N1bWVudGF0aW9uLiAgSSB0aHVzIHdhcyBjb25zdHJhaW5lZAorCXRvIHVzZSB0aGUgQ3J5bndyICc1OTMgaW5pdGlhbGl6YXRpb24gdGFibGUsIHdoaWNoIHNldHMgdGhlIFJ4IHJpbmcgc2l6ZQorCXRvIDhLLikKKworCURlc3BpdGUgbXkgdXN1YWwgbG93IG9waW5pb24gYWJvdXQgSW50ZWwtZGVzaWduZWQgcGFydHMsIEkgbXVzdCBhZG1pdAorCXRoYXQgdGhlIGJ1bGsgZGF0YSBoYW5kbGluZyBvZiB0aGUgaTgyNTkzIGlzIGEgZ29vZCBkZXNpZ24gZm9yCisJYW4gaW50ZWdyYXRlZCBzeXN0ZW0sIGxpa2UgYSBsYXB0b3AsIHdoZXJlIHVzaW5nIHR3byBzbGF2ZSBETUEgY2hhbm5lbHMKKwlkb2Vzbid0IHBvc2UgYSBwcm9ibGVtLiAgSSBzdGlsbCB0YWtlIGlzc3VlIHdpdGggdXNpbmcgb25seSBhIHNpbmdsZSBJL08KKwlwb3J0LiAgSW4gdGhlIHNhbWUgY29udHJvbGxlZCBlbnZpcm9ubWVudCB0aGVyZSBhcmUgZXNzZW50aWFsbHkgbm8KKwlsaW1pdGF0aW9ucyBvbiBJL08gc3BhY2UsIGFuZCB1c2luZyBtdWx0aXBsZSBsb2NhdGlvbnMgd291bGQgZWxpbWluYXRlCisJdGhlCW5lZWQgZm9yIG11bHRpcGxlIG9wZXJhdGlvbnMgd2hlbiBsb29raW5nIGF0IHN0YXR1cyByZWdpc3RlcnMsCisJc2V0dGluZyB0aGUgUnggcmluZyBib3VuZGFyeSwgb3Igc3dpdGNoaW5nIHRvIHByb21pc2N1b3VzIG1vZGUuCisKKwlJIGFsc28gcXVlc3Rpb24gWmVuaXRoJ3Mgc2VsZWN0aW9uIG9mIHRoZSAnNTkzOiBvbmUgb2YgdGhlIGFkdmVydGlzZWQKKwlhZHZhbnRhZ2VzIG9mIGVhcmxpZXIgSW50ZWwgcGFydHMgd2FzIHRoYXQgaWYgeW91IGZpZ3VyZWQgb3V0IHRoZSBtYWdpYworCWluaXRpYWxpemF0aW9uIGluY2FudGF0aW9uIHlvdSBjb3VsZCB1c2UgdGhlIHNhbWUgcGFydCBvbiBtYW55IGRpZmZlcmVudAorCW5ldHdvcmsgdHlwZXMuICBaZW5pdGgncyB1c2Ugb2YgdGhlICJGcmllbmRseU5ldCIgKHNpYykgY29ubmVjdG9yIHJhdGhlcgorCXRoYW4gYW4Jb24tYm9hcmQgdHJhbnNjZWl2ZXIgbGVhZHMgbWUgdG8gYmVsaWV2ZSB0aGF0IHRoZXkgd2VyZSBwbGFubmluZworCXRvIHRha2UgYWR2YW50YWdlIG9mIHRoaXMuICBCdXQsIHVobW1tLCB0aGUgJzU5MyBvbWl0cyBhbGwgYnV0IGV0aGVybmV0CisJZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBzZXJpYWwgc3Vic3lzdGVtLgorICovCisKKy8qIDEwLzIwMDIKKworICAgbyBSZXN1cmVjdGVkIGZvciBMaW51eCAyLjUrIGJ5IE1hcmMgWnluZ2llciA8bWF6QHdpbGQtd2luZC5mci5ldS5vcmc+IDoKKworICAgLSBSZW1vdmVkIHN0cmFuZ2UgRE1BIHNub29waW5nIGluIHpuZXRfc2VudF9wYWNrZXQsIHdoaWNoIGxlYWQgdG8KKyAgICAgVFggYnVmZmVyIGNvcnJ1cHRpb24gb24gbXkgbGFwdG9wLgorICAgLSBVc2UgaW5pdF9ldGhlcmRldiBzdHVmZi4KKyAgIC0gVXNlIGttYWxsb2MtZWQgRE1BIGJ1ZmZlcnMuCisgICAtIFVzZSBhcyBmZXcgZ2xvYmFsIHZhcmlhYmxlcyBhcyBwb3NzaWJsZS4KKyAgIC0gVXNlIHByb3BlciByZXNvdXJjZXMgbWFuYWdlbWVudC4KKyAgIC0gVXNlIHdpcmVsZXNzL2k4MjU5My5oIGFzIG11Y2ggYXMgcG9zc2libGUgKHN0cnVjdHVyZSwgY29uc3RhbnRzKQorICAgLSBDb21waWxlcyBhcyBtb2R1bGUgb3IgYnVpbGQtaW4uCisgICAtIE5vdyBzdXJ2aXZlcyB1bnBsdWdnaW5nL3JlcGx1Z2dpbmcgY2FibGUuCisKKyAgIFNvbWUgY29kZSB3YXMgdGFrZW4gZnJvbSB3YXZlbGFuX2NzLgorICAgCisgICBUZXN0ZWQgb24gYSB2aW50YWdlIFplbml0aCBaLU5vdGUgNDMzTG5wKy4gUHJvYmFibHkgYnJva2VuIG9uCisgICBhbnl0aGluZyBlbHNlLiBUZXN0ZXJzIChhbmQgZGV0YWlsZWQgYnVnIHJlcG9ydHMpIGFyZSB3ZWxjb21lIDotKS4KKworICAgbyBUT0RPIDoKKworICAgLSBQcm9wZXJseSBoYW5kbGUgbXVsdGljYXN0CisgICAtIFVuZGVyc3RhbmQgd2h5IHNvbWUgdHJhZmZpYyBwYXR0ZXJucyBhZGQgYSAxcyBsYXRlbmN5Li4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKy8qIFRoaXMgaW5jbHVkZSBjb3VsZCBiZSBlbHNld2hlcmUsIHNpbmNlIGl0IGlzIG5vdCB3aXJlbGVzcyBzcGVjaWZpYyAqLworI2luY2x1ZGUgIndpcmVsZXNzL2k4MjU5My5oIgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9ICJ6bmV0LmM6djEuMDIgOS8yMy85NCBiZWNrZXJAc2N5bGQuY29tXG4iOworCisjaWZuZGVmIFpORVRfREVCVUcKKyNkZWZpbmUgWk5FVF9ERUJVRyAxCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgem5ldF9kZWJ1ZyA9IFpORVRfREVCVUc7Cittb2R1bGVfcGFyYW0gKHpuZXRfZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDICh6bmV0X2RlYnVnLCAiWk5ldCBkZWJ1ZyBsZXZlbCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBUaGUgRE1BIG1vZGVzIHdlIG5lZWQgYXJlbid0IGluIDxkbWEuaD4uICovCisjZGVmaW5lIERNQV9SWF9NT0RFCQkweDE0CS8qIEF1dG8gaW5pdCwgSS9PIHRvIG1lbSwgKyssIGRlbWFuZC4gKi8KKyNkZWZpbmUgRE1BX1RYX01PREUJCTB4MTgJLyogQXV0byBpbml0LCBNZW0gdG8gSS9PLCArKywgZGVtYW5kLiAqLworI2RlZmluZSBkbWFfcGFnZV9lcShwdHIxLCBwdHIyKSAoKGxvbmcpKHB0cjEpPj4xNyA9PSAobG9uZykocHRyMik+PjE3KQorI2RlZmluZSBSWF9CVUZfU0laRSA4MTkyCisjZGVmaW5lIFRYX0JVRl9TSVpFIDgxOTIKKyNkZWZpbmUgRE1BX0JVRl9TSVpFIChSWF9CVUZfU0laRSArIDE2KQkvKiA4ayArIDE2IGJ5dGVzIGZvciB0cmFpbGVycyAqLworCisjZGVmaW5lIFRYX1RJTUVPVVQJMTAKKworc3RydWN0IHpuZXRfcHJpdmF0ZSB7CisJaW50IHJ4X2RtYSwgdHhfZG1hOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXNwaW5sb2NrX3QgbG9jazsKKwlzaG9ydCBzaWFfYmFzZSwgc2lhX3NpemUsIGlvX3NpemU7CisJc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrIGk1OTNfaW5pdDsKKwkvKiBUaGUgc3RhcnRpbmcsIGN1cnJlbnQsIGFuZCBlbmQgcG9pbnRlcnMgZm9yIHRoZSBwYWNrZXQgYnVmZmVycy4gKi8KKwl1c2hvcnQgKnJ4X3N0YXJ0LCAqcnhfY3VyLCAqcnhfZW5kOworCXVzaG9ydCAqdHhfc3RhcnQsICp0eF9jdXIsICp0eF9lbmQ7CisJdXNob3J0IHR4X2J1Zl9sZW47CQkJLyogVHggYnVmZmVyIGxlbmd0aCwgaW4gd29yZHMuICovCit9OworCisvKiBPbmx5IG9uZSBjYW4gYmUgYnVpbHQtaW47LT4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqem5ldF9kZXY7CisKK3N0cnVjdCBuZXRpZGJsayB7CisJY2hhciBtYWdpY1s4XTsJCS8qIFRoZSBtYWdpYyBudW1iZXIgKHN0cmluZykgIk5FVElEQkxLIiAqLworCXVuc2lnbmVkIGNoYXIgbmV0aWRbOF07IC8qIFRoZSBwaHlzaWNhbCBzdGF0aW9uIGFkZHJlc3MgKi8KKwljaGFyIG5ldHR5cGUsIGdsb2JhbG9wdDsKKwljaGFyIHZlbmRvcls4XTsJCS8qIFRoZSBtYWNoaW5lIHZlbmRvciBhbmQgcHJvZHVjdCBuYW1lLiAqLworCWNoYXIgcHJvZHVjdFs4XTsKKwljaGFyIGlycTEsIGlycTI7CQkvKiBJbnRlcnJ1cHRzLCBvbmx5IG9uZSBpcyBjdXJyZW50bHkgdXNlZC4JKi8KKwljaGFyIGRtYTEsIGRtYTI7CisJc2hvcnQgZG1hX21lbV9taXNjWzhdOwkJLyogRE1BIGJ1ZmZlciBsb2NhdGlvbnMgKHVudXNlZCBpbiBMaW51eCkuICovCisJc2hvcnQgaW9iYXNlMSwgaW9zaXplMTsKKwlzaG9ydCBpb2Jhc2UyLCBpb3NpemUyOwkJLyogU2Vjb25kIGlvYmFzZSB1bnVzZWQuICovCisJY2hhciBkcml2ZXJfb3B0aW9uczsJCQkvKiBNaXNjLiBiaXRzICovCisJY2hhciBwYWQ7Cit9OworCitzdGF0aWMgaW50CXpuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJem5ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCB6bmV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkCXpuZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CXpuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBoYXJkd2FyZV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdXBkYXRlX3N0b3BfaGl0KHNob3J0IGlvYWRkciwgdW5zaWduZWQgc2hvcnQgcnhfc3RvcF9vZmZzZXQpOworc3RhdGljIHZvaWQgem5ldF90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogUmVxdWVzdCBuZWVkZWQgcmVzb3VyY2VzICovCitzdGF0aWMgaW50IHpuZXRfcmVxdWVzdF9yZXNvdXJjZXMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHpuZXRfcHJpdmF0ZSAqem5ldCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkKKwlpZiAocmVxdWVzdF9pcnEgKGRldi0+aXJxLCAmem5ldF9pbnRlcnJ1cHQsIDAsICJaTmV0IiwgZGV2KSkKKwkJZ290byBmYWlsZWQ7CisJaWYgKHJlcXVlc3RfZG1hICh6bmV0LT5yeF9kbWEsICJaTmV0IHJ4IikpCisJCWdvdG8gZnJlZV9pcnE7CisJaWYgKHJlcXVlc3RfZG1hICh6bmV0LT50eF9kbWEsICJaTmV0IHR4IikpCisJCWdvdG8gZnJlZV9yeF9kbWE7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbiAoem5ldC0+c2lhX2Jhc2UsIHpuZXQtPnNpYV9zaXplLCAiWk5ldCBTSUEiKSkKKwkJZ290byBmcmVlX3R4X2RtYTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uIChkZXYtPmJhc2VfYWRkciwgem5ldC0+aW9fc2l6ZSwgIlpOZXQgSS9PIikpCisJCWdvdG8gZnJlZV9zaWE7CisKKwlyZXR1cm4gMDsJCQkJLyogSGFwcHkgISAqLworCisgZnJlZV9zaWE6CisJcmVsZWFzZV9yZWdpb24gKHpuZXQtPnNpYV9iYXNlLCB6bmV0LT5zaWFfc2l6ZSk7CisgZnJlZV90eF9kbWE6CisJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCWZyZWVfZG1hICh6bmV0LT50eF9kbWEpOworCXJlbGVhc2VfZG1hX2xvY2sgKGZsYWdzKTsKKyBmcmVlX3J4X2RtYToKKwlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJZnJlZV9kbWEgKHpuZXQtPnJ4X2RtYSk7CisJcmVsZWFzZV9kbWFfbG9jayAoZmxhZ3MpOworIGZyZWVfaXJxOgorCWZyZWVfaXJxIChkZXYtPmlycSwgZGV2KTsKKyBmYWlsZWQ6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCB6bmV0X3JlbGVhc2VfcmVzb3VyY2VzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB6bmV0X3ByaXZhdGUgKnpuZXQgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCisJcmVsZWFzZV9yZWdpb24gKHpuZXQtPnNpYV9iYXNlLCB6bmV0LT5zaWFfc2l6ZSk7CisJcmVsZWFzZV9yZWdpb24gKGRldi0+YmFzZV9hZGRyLCB6bmV0LT5pb19zaXplKTsKKwlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJZnJlZV9kbWEgKHpuZXQtPnR4X2RtYSk7CisJZnJlZV9kbWEgKHpuZXQtPnJ4X2RtYSk7CisJcmVsZWFzZV9kbWFfbG9jayAoZmxhZ3MpOworCWZyZWVfaXJxIChkZXYtPmlycSwgZGV2KTsKK30KKworLyogS2VlcCB0aGUgbWFnaWNhbCBTSUEgc3R1ZmYgaW4gYSBzaW5nbGUgZnVuY3Rpb24uLi4gKi8KK3N0YXRpYyB2b2lkIHpuZXRfdHJhbnNjZWl2ZXJfcG93ZXIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBvbikKK3sKKwlzdHJ1Y3Qgem5ldF9wcml2YXRlICp6bmV0ID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGNoYXIgdjsKKworCS8qIFR1cm4gb24vb2ZmIHRoZSA4MjUwMSBTSUEsIHVzaW5nIHplbml0aC1zcGVjaWZpYyBtYWdpYy4gKi8KKwkvKiBTZWxlY3QgTEFOIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlvdXRiKDB4MTAsIHpuZXQtPnNpYV9iYXNlKTsKKworCWlmIChvbikKKwkJdiA9IGluYih6bmV0LT5zaWFfYmFzZSArIDEpIHwgMHg4NDsKKwllbHNlCisJCXYgPSBpbmIoem5ldC0+c2lhX2Jhc2UgKyAxKSAmIH4weDg0OworCQkKKwlvdXRiKHYsIHpuZXQtPnNpYV9iYXNlKzEpOyAvKiBUdXJuIG9uL29mZiBMQU4gcG93ZXIgKGJpdCAyKS4gKi8KK30KKworLyogSW5pdCB0aGUgaTgyNTkzLCB3aXRoIGN1cnJlbnQgcHJvbWlzYy9tY2FzdCBjb25maWd1cmF0aW9uLgorICAgQWxzbyB1c2VkIGZyb20gaGFyZHdhcmVfaW5pdC4gKi8KK3N0YXRpYyB2b2lkIHpuZXRfc2V0X211bHRpY2FzdF9saXN0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB6bmV0X3ByaXZhdGUgKnpuZXQgPSBkZXYtPnByaXY7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrICpjZmJsayA9ICZ6bmV0LT5pNTkzX2luaXQ7CisKKwltZW1zZXQoY2ZibGssIDB4MDAsIHNpemVvZihzdHJ1Y3QgaTgyNTkzX2NvbmZfYmxvY2spKTsKKwkKKyAgICAgICAgLyogVGhlIGNvbmZpZ3VyYXRpb24gYmxvY2suICBXaGF0IGFuIHVuZG9jdW1lbnRlZCBuaWdodG1hcmUuCisJICAgVGhlIGZpcnN0IHNldCBvZiB2YWx1ZXMgYXJlIHRob3NlIHN1Z2dlc3RlZCAod2l0aG91dCBleHBsYW5hdGlvbikKKwkgICBmb3IgZXRoZXJuZXQgaW4gdGhlIEludGVsIDgyNTg2IGRhdGFib29rLiAgVGhlIHJlc3QgYXBwZWFyIHRvIGJlCisJICAgY29tcGxldGVseSB1bmRvY3VtZW50ZWQsIGV4Y2VwdCBmb3IgY3J5cHRpYyBub3RlcyBpbiB0aGUgQ3J5bndyCisJICAgcGFja2V0IGRyaXZlci4gIFRoaXMgZHJpdmVyIHVzZXMgdGhlIENyeW53ciB2YWx1ZXMgdmVyYmF0aW0uICovCisKKwkvKiBtYXogOiBSZXdyaXR0ZW4gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHdhbnZlbGFuIGluY2x1ZGVzLgorCSAgIEF0IGxlYXN0IHdlIGhhdmUgbmFtZXMsIG5vdCBqdXN0IGJsaW5kIHZhbHVlcyAqLworCQorCS8qIEJ5dGUgMCAqLworCWNmYmxrLT5maWZvX2xpbWl0ID0gMTA7CS8qID0gMTYgQiByeCBhbmQgODAgQiB0eCBmaWZvIHRocmVzaG9sZHMgKi8KKwljZmJsay0+Zm9yZ25lc2kgPSAwOwkvKiAwPTgyQzUwMSwgMT1BTUQ3OTkyQiBjb21wYXRpYmlsaXR5ICovCisJY2ZibGstPmZpZm9fMzIgPSAxOworCWNmYmxrLT5kNm1vZCA9IDA7ICAJLyogUnVuIGluIGk4MjU5MyBhZHZhbmNlZCBtb2RlICovCisJY2ZibGstPnRocm90dGxlX2VuYiA9IDE7CisKKwkvKiBCeXRlIDEgKi8KKwljZmJsay0+dGhyb3R0bGUgPSA4OwkvKiBDb250aW51b3VzIHcvaW50ZXJydXB0cywgMTI4LWNsb2NrIERNQS4gKi8KKwljZmJsay0+Y250cnhpbnQgPSAwOwkvKiBlbmFibGUgY29udGludW91cyBtb2RlIHJlY2VpdmUgaW50ZXJydXB0cyAqLworCWNmYmxrLT5jb250aW4gPSAxOwkvKiBlbmFibGUgY29udGludW91cyBtb2RlICovCisKKwkvKiBCeXRlIDIgKi8KKwljZmJsay0+YWRkcl9sZW4gPSBFVEhfQUxFTjsKKwljZmJsay0+YWNsb2MgPSAxOwkvKiBEaXNhYmxlIHNvdXJjZSBhZGRyIGluc2VydGlvbiBieSBpODI1OTMgKi8KKwljZmJsay0+cHJlYW1iX2xlbiA9IDI7CS8qIDggYnl0ZXMgcHJlYW1ibGUgKi8KKwljZmJsay0+bG9vcGJhY2sgPSAwOwkvKiBMb29wYmFjayBvZmYgKi8KKyAgCisJLyogQnl0ZSAzICovCisJY2ZibGstPmxpbl9wcmlvID0gMDsJLyogRGVmYXVsdCBwcmlvcml0aWVzICYgYmFja29mZiBtZXRob2RzLiAqLworCWNmYmxrLT50Ym9mc3RvcCA9IDA7CisJY2ZibGstPmV4cF9wcmlvID0gMDsKKwljZmJsay0+Ym9mX21ldCA9IDA7CisgIAorCS8qIEJ5dGUgNCAqLworCWNmYmxrLT5pZnJtX3NwYyA9IDY7CS8qIDk2IGJpdCB0aW1lcyBpbnRlcmZyYW1lIHNwYWNpbmcgKi8KKwkKKwkvKiBCeXRlIDUgKi8KKwljZmJsay0+c2xvdHRpbV9sb3cgPSAwOyAvKiA1MTIgYml0IHRpbWVzIHNsb3QgdGltZSAobG93KSAqLworCQorCS8qIEJ5dGUgNiAqLworCWNmYmxrLT5zbG90dGltX2hpID0gMjsJLyogNTEyIGJpdCB0aW1lcyBzbG90IHRpbWUgKGhpZ2gpICovCisJY2ZibGstPm1heF9yZXRyID0gMTU7CS8qIDE1IGNvbGxpc2lvbnMgcmV0cmllcyAqLworCQorCS8qIEJ5dGUgNyAqLworCWNmYmxrLT5wcm1pc2MgPSAoKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyAxIDogMCk7IC8qIFByb21pc2N1b3VzIG1vZGUgKi8KKwljZmJsay0+YmNfZGlzID0gMDsJLyogRW5hYmxlIGJyb2FkY2FzdCByZWNlcHRpb24gKi8KKwljZmJsay0+Y3JzXzEgPSAwOwkvKiBEb24ndCB0cmFuc21pdCB3aXRob3V0IGNhcnJpZXIgc2Vuc2UgKi8KKwljZmJsay0+bm9jcmNfaW5zID0gMDsJLyogaTgyNTkzIGdlbmVyYXRlcyBDUkMgKi8KKwljZmJsay0+Y3JjXzE2MzIgPSAwOwkvKiAzMi1iaXQgQXV0b2Rpbi1JSSBDUkMgKi8KKwljZmJsay0+Y3JzX2NkdCA9IDA7CS8qIENEIG5vdCB0byBiZSBpbnRlcnByZXRlZCBhcyBDUyAqLworCQorCS8qIEJ5dGUgOCAqLworCWNmYmxrLT5jc19maWx0ZXIgPSAwOyAgCS8qIENTIGlzIHJlY29nbml6ZWQgaW1tZWRpYXRlbHkgKi8KKwljZmJsay0+Y3JzX3NyYyA9IDA7CS8qIEV4dGVybmFsIGNhcnJpZXIgc2Vuc2UgKi8KKwljZmJsay0+Y2RfZmlsdGVyID0gMDsgIAkvKiBDRCBpcyByZWNvZ25pemVkIGltbWVkaWF0ZWx5ICovCisJCisJLyogQnl0ZSA5ICovCisJY2ZibGstPm1pbl9mcl9sZW4gPSBFVEhfWkxFTiA+PiAyOyAvKiBNaW5pbXVtIGZyYW1lIGxlbmd0aCAqLworCQorCS8qIEJ5dGUgQSAqLworCWNmYmxrLT5sbmdfdHlwID0gMTsJLyogVHlwZS9sZW5ndGggY2hlY2tzIE9GRiAqLworCWNmYmxrLT5sbmdfZmxkID0gMTsgCS8qIERpc2FibGUgODAyLjMgbGVuZ3RoIGZpZWxkIGNoZWNrICovCisJY2ZibGstPnJ4Y3JjX3hmID0gMTsJLyogRG9uJ3QgdHJhbnNmZXIgQ1JDIHRvIG1lbW9yeSAqLworCWNmYmxrLT5hcnR4ID0gMTsJLyogRGlzYWJsZSBhdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gKi8KKwljZmJsay0+c2FyZWMgPSAxOwkvKiBEaXNhYmxlIHNvdXJjZSBhZGRyIHRyaWcgb2YgQ0QgKi8KKwljZmJsay0+dHhfamFiYmVyID0gMDsJLyogRGlzYWJsZSBqYWJiZXIgamFtIHNlcXVlbmNlICovCisJY2ZibGstPmhhc2hfMSA9IDE7IAkvKiBVc2UgYml0cyAwLTUgaW4gbWMgYWRkcmVzcyBoYXNoICovCisJY2ZibGstPmxicGtwb2wgPSAwOyAJLyogTG9vcGJhY2sgcGluIGFjdGl2ZSBoaWdoICovCisJCisJLyogQnl0ZSBCICovCisJY2ZibGstPmZkeCA9IDA7CQkvKiBEaXNhYmxlIGZ1bGwgZHVwbGV4IG9wZXJhdGlvbiAqLworCQorCS8qIEJ5dGUgQyAqLworCWNmYmxrLT5kdW1teV82ID0gMHgzZjsgCS8qIGFsbCBvbmVzLCBEZWZhdWx0IG11bHRpY2FzdCBhZGRyZXNzZXMgJiBiYWNrb2ZmLiAqLworCWNmYmxrLT5tdWx0X2lhID0gMDsJLyogTm8gbXVsdGlwbGUgaW5kaXZpZHVhbCBhZGRyZXNzZXMgKi8KKwljZmJsay0+ZGlzX2JvZiA9IDA7CS8qIERpc2FibGUgdGhlIGJhY2tvZmYgYWxnb3JpdGhtID8hICovCisJCisJLyogQnl0ZSBEICovCisJY2ZibGstPmR1bW15XzEgPSAxOyAJLyogc2V0IHRvIDEgKi8KKwljZmJsay0+dHhfaWZzX3JldHJpZyA9IDM7IC8qIEhtbS4uLiBEaXNhYmxlZCAqLworCWNmYmxrLT5tY19hbGwgPSAoZGV2LT5tY19saXN0IHx8IChkZXYtPmZsYWdzJklGRl9BTExNVUxUSSkpOy8qIG11bHRpY2FzdCBhbGwgbW9kZSAqLworCWNmYmxrLT5yY3ZfbW9uID0gMDsJLyogTW9uaXRvciBtb2RlIGRpc2FibGVkICovCisJY2ZibGstPmZyYWdfYWNwdCA9IDA7CS8qIERvIG5vdCBhY2NlcHQgZnJhZ21lbnRzICovCisJY2ZibGstPnRzdHJ0dHJzID0gMDsJLyogTm8gc3RhcnQgdHJhbnNtaXNzaW9uIHRocmVzaG9sZCAqLworCQorCS8qIEJ5dGUgRSAqLworCWNmYmxrLT5mcmV0eCA9IDE7CS8qIEZJRk8gYXV0b21hdGljIHJldHJhbnNtaXNzaW9uICovCisJY2ZibGstPnJ1bnRfZW9wID0gMDsJLyogZHJvcCAicnVudCIgcGFja2V0cyAqLworCWNmYmxrLT5od19zd19waW4gPSAwOwkvKiA/PyAqLworCWNmYmxrLT5iaWdfZW5kbiA9IDA7CS8qIEJpZyBFbmRpYW4gPyBuby4uLiAqLworCWNmYmxrLT5zeW5jcnFzID0gMTsJLyogU3luY2hyb25vdXMgRFJRIGRlYXNzZXJ0aW9uLi4uICovCisJY2ZibGstPnN0dGxlbiA9IDE7ICAJLyogNiBieXRlIHN0YXR1cyByZWdpc3RlcnMgKi8KKwljZmJsay0+cnhfZW9wID0gMDsgIAkvKiBTaWduYWwgRU9QIG9uIHBhY2tldCByZWNlcHRpb24gKi8KKwljZmJsay0+dHhfZW9wID0gMDsgIAkvKiBTaWduYWwgRU9QIG9uIHBhY2tldCB0cmFuc21pc3Npb24gKi8KKworCS8qIEJ5dGUgRiAqLworCWNmYmxrLT5yYnVmX3NpemUgPSBSWF9CVUZfU0laRSA+PiAxMjsgLyogU2V0IHJlY2VpdmUgYnVmZmVyIHNpemUgKi8KKwljZmJsay0+cmN2c3RvcCA9IDE7IAkvKiBFbmFibGUgUmVjZWl2ZSBTdG9wIFJlZ2lzdGVyICovCisKKwlpZiAoem5ldF9kZWJ1ZyA+IDIpIHsKKwkJaW50IGk7CisJCXVuc2lnbmVkIGNoYXIgKmM7CisKKwkJZm9yIChpID0gMCwgYyA9IChjaGFyICopIGNmYmxrOyBpIDwgc2l6ZW9mICgqY2ZibGspOyBpKyspCisJCQlwcmludGsgKCIlMDJYICIsIGNbaV0pOworCQlwcmludGsgKCJcbiIpOworCX0KKwkKKwkqem5ldC0+dHhfY3VyKysgPSBzaXplb2Yoc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrKTsKKwltZW1jcHkoem5ldC0+dHhfY3VyLCBjZmJsaywgc2l6ZW9mKHN0cnVjdCBpODI1OTNfY29uZl9ibG9jaykpOworCXpuZXQtPnR4X2N1ciArPSBzaXplb2Yoc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrKS8yOworCW91dGIoT1AwX0NPTkZJR1VSRSB8IENSMF9DSE5MLCBpb2FkZHIpOworCisJLyogWFhYIEZJWE1FIG1heiA6IEFkZCBtdWx0aWNhc3QgYWRkcmVzc2VzIGhlcmUsIHNvIGhhdmluZyBhCisJICogbXVsdGljYXN0IGFkZHJlc3MgY29uZmlndXJlZCBpc24ndCBlcXVhbCB0byBJRkZfQUxMTVVMVEkgKi8KK30KKwwKKy8qIFRoZSBaLU5vdGUgcHJvYmUgaXMgcHJldHR5IGVhc3kuICBUaGUgTkVUSURCTEsgZXhpc3RzIGluIHRoZSBzYWZlLXRvLXByb2JlCisgICBCSU9TIGFyZWEuICBXZSBqdXN0IHNjYW4gZm9yIHRoZSBzaWduYXR1cmUsIGFuZCBwdWxsIHRoZSB2aXRhbCBwYXJhbWV0ZXJzCisgICBvdXQgb2YgdGhlIHN0cnVjdHVyZS4gKi8KKworc3RhdGljIGludCBfX2luaXQgem5ldF9wcm9iZSAodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmV0aWRibGsgKm5ldGluZm87CisJc3RydWN0IHpuZXRfcHJpdmF0ZSAqem5ldDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWNoYXIgKnA7CisJaW50IGVyciA9IC1FTk9NRU07CisKKwkvKiBUaGlzIGNvZGUgc2NhbnMgdGhlIHJlZ2lvbiAweGYwMDAwIHRvIDB4ZmZmZmYgZm9yIGEgIk5FVElEQkxLIi4gKi8KKwlmb3IocCA9IChjaGFyICopcGh5c190b192aXJ0KDB4ZjAwMDApOyBwIDwgKGNoYXIgKilwaHlzX3RvX3ZpcnQoMHgxMDAwMDApOyBwKyspCisJCWlmICgqcCA9PSAnTicgICYmICBzdHJuY21wKHAsICJORVRJREJMSyIsIDgpID09IDApCisJCQlicmVhazsKKworCWlmIChwID49IChjaGFyICopcGh5c190b192aXJ0KDB4MTAwMDAwKSkgeworCQlpZiAoem5ldF9kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9JTkZPICJObyBaLU5vdGUgZXRoZXJuZXQgYWRhcHRvciBmb3VuZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHpuZXRfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCVNFVF9NT0RVTEVfT1dORVIgKGRldik7CisKKwl6bmV0ID0gZGV2LT5wcml2OworCisJbmV0aW5mbyA9IChzdHJ1Y3QgbmV0aWRibGsgKilwOworCWRldi0+YmFzZV9hZGRyID0gbmV0aW5mby0+aW9iYXNlMTsKKwlkZXYtPmlycSA9IG5ldGluZm8tPmlycTE7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogWk5FVCBhdCAlIzNseCwiLCBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyKTsKKworCS8qIFRoZSBzdGF0aW9uIGFkZHJlc3MgaXMgaW4gdGhlICJuZXRpZGJsayIgYXQgMHgwZjAwMDAuICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMngiLCBkZXYtPmRldl9hZGRyW2ldID0gbmV0aW5mby0+bmV0aWRbaV0pOworCisJcHJpbnRrKCIsIHVzaW5nIElSUSAlZCBETUEgJWQgYW5kICVkLlxuIiwgZGV2LT5pcnEsIG5ldGluZm8tPmRtYTEsCisJICAgICAgIG5ldGluZm8tPmRtYTIpOworCisJaWYgKHpuZXRfZGVidWcgPiAxKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB2ZW5kb3IgJyUxNi4xNnMnIElSUTEgJWQgSVJRMiAlZCBETUExICVkIERNQTIgJWQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBuZXRpbmZvLT52ZW5kb3IsCisJCSAgICAgICBuZXRpbmZvLT5pcnExLCBuZXRpbmZvLT5pcnEyLAorCQkgICAgICAgbmV0aW5mby0+ZG1hMSwgbmV0aW5mby0+ZG1hMik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpb2Jhc2UxICUjeCBzaXplICVkIGlvYmFzZTIgJSN4IHNpemUgJWQgbmV0IHR5cGUgJTIuMnguXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBuZXRpbmZvLT5pb2Jhc2UxLCBuZXRpbmZvLT5pb3NpemUxLAorCQkgICAgICAgbmV0aW5mby0+aW9iYXNlMiwgbmV0aW5mby0+aW9zaXplMiwgbmV0aW5mby0+bmV0dHlwZSk7CisJfQorCisJaWYgKHpuZXRfZGVidWcgPiAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisJem5ldC0+cnhfZG1hID0gbmV0aW5mby0+ZG1hMTsKKwl6bmV0LT50eF9kbWEgPSBuZXRpbmZvLT5kbWEyOworCXNwaW5fbG9ja19pbml0KCZ6bmV0LT5sb2NrKTsKKwl6bmV0LT5zaWFfYmFzZSA9IDB4ZTY7CS8qIE1hZ2ljIGFkZHJlc3MgZm9yIHRoZSA4MjUwMSBTSUEgKi8KKwl6bmV0LT5zaWFfc2l6ZSA9IDI7CisJLyogbWF6OiBEZXNwaXRlIHRoZSAnNTkzIGJlaW5nIGFkdmVydGlzZWQgYWJvdmUgYXMgdXNpbmcgYQorCSAqIHNpbmdsZSA4Yml0cyBJL08gcG9ydCwgdGhpcyBkcml2ZXIgZG9lcyBtYW55IDE2Yml0cworCSAqIGFjY2Vzcy4gU28gc2V0IGlvX3NpemUgYWNjb3JkaW5nbHkgKi8KKwl6bmV0LT5pb19zaXplICA9IDI7CisKKwlpZiAoISh6bmV0LT5yeF9zdGFydCA9IGttYWxsb2MgKERNQV9CVUZfU0laRSwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpKSkKKwkJZ290byBmcmVlX2RldjsKKwlpZiAoISh6bmV0LT50eF9zdGFydCA9IGttYWxsb2MgKERNQV9CVUZfU0laRSwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpKSkKKwkJZ290byBmcmVlX3J4OworCisJaWYgKCFkbWFfcGFnZV9lcSAoem5ldC0+cnhfc3RhcnQsIHpuZXQtPnJ4X3N0YXJ0ICsgKFJYX0JVRl9TSVpFLzItMSkpIHx8CisJICAgICFkbWFfcGFnZV9lcSAoem5ldC0+dHhfc3RhcnQsIHpuZXQtPnR4X3N0YXJ0ICsgKFRYX0JVRl9TSVpFLzItMSkpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJ0eC9yeCBjcm9zc2luZyBETUEgZnJvbnRpZXJzLCBnaXZpbmcgdXBcbiIpOworCQlnb3RvIGZyZWVfdHg7CisJfQorCQorCXpuZXQtPnJ4X2VuZCA9IHpuZXQtPnJ4X3N0YXJ0ICsgUlhfQlVGX1NJWkUvMjsKKwl6bmV0LT50eF9idWZfbGVuID0gVFhfQlVGX1NJWkUvMjsKKwl6bmV0LT50eF9lbmQgPSB6bmV0LT50eF9zdGFydCArIHpuZXQtPnR4X2J1Zl9sZW47CisKKwkvKiBUaGUgWk5FVC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZ6bmV0X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmem5ldF9zZW5kX3BhY2tldDsKKwlkZXYtPnN0b3AgPSAmem5ldF9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cwk9IG5ldF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmem5ldF9zZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT50eF90aW1lb3V0ID0gem5ldF90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZnJlZV90eDsKKwl6bmV0X2RldiA9IGRldjsKKwlyZXR1cm4gMDsKKworIGZyZWVfdHg6CisJa2ZyZWUoem5ldC0+dHhfc3RhcnQpOworIGZyZWVfcng6CisJa2ZyZWUoem5ldC0+cnhfc3RhcnQpOworIGZyZWVfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIGVycjsKK30KKworDAorc3RhdGljIGludCB6bmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoem5ldF9kZWJ1ZyA+IDIpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogem5ldF9vcGVuKCkgY2FsbGVkLlxuIiwgZGV2LT5uYW1lKTsKKworCS8qIFRoZXNlIHNob3VsZCBuZXZlciBmYWlsLiAgWW91IGNhbid0IGFkZCBkZXZpY2VzIHRvIGEgc2VhbGVkIGJveCEgKi8KKwlpZiAoem5ldF9yZXF1ZXN0X3Jlc291cmNlcyAoZGV2KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm90IG9wZW5lZCAtLSByZXNvdXJjZSBidXN5PyE/XG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXpuZXRfdHJhbnNjZWl2ZXJfcG93ZXIgKGRldiwgMSk7CisJCisJLyogQWNjb3JkaW5nIHRvIHRoZSBDcnlud3IgZHJpdmVyIHdlIHNob3VsZCB3YWl0IDUwIG1zZWMuIGZvciB0aGUKKwkgICBMQU4gY2xvY2sgdG8gc3RhYmlsaXplLiAgTXkgZXhwZXJpbWVudHMgaW5kaWNhdGVzIHRoYXQgdGhlICc1OTMgY2FuCisJICAgYmUgaW5pdGlhbGl6ZWQgaW1tZWRpYXRlbHkuICBUaGUgZGVsYXkgaXMgcHJvYmFibHkgbmVlZGVkIGZvciB0aGUKKwkgICBEQy10by1EQyBjb252ZXJ0ZXIgdG8gY29tZSB1cCB0byBmdWxsIHZvbHRhZ2UsIGFuZCBmb3IgdGhlIG9zY2lsbGF0b3IKKwkgICB0byBiZSBzcG90LW9uIGF0IDIwTWh6IGJlZm9yZSB0cmFuc21pdHRpbmcuCisJICAgVW50aWwgdGhpcyBwcm92ZXMgdG8gYmUgYSBwcm9ibGVtIHdlIHJlbHkgb24gdGhlIGhpZ2hlciBsYXllcnMgZm9yIHRoZQorCSAgIGRlbGF5IGFuZCBzYXZlIGFsbG9jYXRpbmcgYSB0aW1lciBlbnRyeS4gKi8KKworCS8qIG1heiA6IFdlbGwsIEknbSBnZXR0aW5nIGV2ZXJ5IHRpbWUgdGhlIGZvbGxvd2luZyBtZXNzYWdlCisJICogd2l0aG91dCB0aGUgZGVsYXkgb24gYSA0ODZAMzMuIFRoaXMgbWFjaGluZSBpcyBtdWNoIHRvbworCSAqIGZhc3QuLi4gOi0pIFNvIG1heWJlIHRoZSBDcnlud3IgZHJpdmVyIHdhc24ndCB3cm9uZyBhZnRlcgorCSAqIGFsbCwgZXZlbiBpZiB0aGUgbWVzc2FnZSBpcyBjb21wbGV0bHkgaGFybWxlc3Mgb24gbXkKKwkgKiBzZXR1cC4gKi8KKwltZGVsYXkgKDUwKTsKKwkKKwkvKiBUaGlzIGZvbGxvd3MgdGhlIHBhY2tldCBkcml2ZXIncyBsZWFkLCBhbmQgY2hlY2tzIGZvciBzdWNjZXNzLiAqLworCWlmIChpbmIoaW9hZGRyKSAhPSAweDEwICYmIGluYihpb2FkZHIpICE9IDB4MDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQcm9ibGVtIHR1cm5pbmcgb24gdGhlIHRyYW5zY2VpdmVyIHBvd2VyLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisKKwloYXJkd2FyZV9pbml0KGRldik7CisJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCB6bmV0X3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVzaG9ydCBldmVudCwgdHhfc3RhdHVzLCByeF9vZmZzZXQsIHN0YXRlOworCisJb3V0YiAoQ1IwX1NUQVRVU18wLCBpb2FkZHIpOworCWV2ZW50ID0gaW5iIChpb2FkZHIpOworCW91dGIgKENSMF9TVEFUVVNfMSwgaW9hZGRyKTsKKwl0eF9zdGF0dXMgPSBpbncgKGlvYWRkcik7CisJb3V0YiAoQ1IwX1NUQVRVU18yLCBpb2FkZHIpOworCXJ4X29mZnNldCA9IGludyAoaW9hZGRyKTsKKwlvdXRiIChDUjBfU1RBVFVTXzMsIGlvYWRkcik7CisJc3RhdGUgPSBpbmIgKGlvYWRkcik7CisJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlMDJ4ICUwNHggJTA0eCAlMDJ4LCIKKwkgIiByZXNldHRpbmcuXG4iLCBkZXYtPm5hbWUsIGV2ZW50LCB0eF9zdGF0dXMsIHJ4X29mZnNldCwgc3RhdGUpOworCWlmICh0eF9zdGF0dXMgPT0gVFhfTE9TVF9DUlMpCisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogVHggY2FycmllciBlcnJvciwgY2hlY2sgdHJhbnNjZWl2ZXIgY2FibGUuXG4iLAorCQkJZGV2LT5uYW1lKTsKKwlvdXRiIChPUDBfUkVTRVQsIGlvYWRkcik7CisJaGFyZHdhcmVfaW5pdCAoZGV2KTsKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworfQorCitzdGF0aWMgaW50IHpuZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHpuZXRfcHJpdmF0ZSAqem5ldCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNob3J0IGxlbmd0aCA9IHNrYi0+bGVuOworCisJaWYgKHpuZXRfZGVidWcgPiA0KQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFpOZXRfc2VuZF9wYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCisJaWYgKGxlbmd0aCA8IEVUSF9aTEVOKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWxlbmd0aCA9IEVUSF9aTEVOOworCX0KKwkKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCQorCS8qIENoZWNrIHRoYXQgdGhlIHBhcnQgaGFzbid0IHJlc2V0IGl0c2VsZiwgcHJvYmFibHkgZnJvbSBzdXNwZW5kLiAqLworCW91dGIoQ1IwX1NUQVRVU18wLCBpb2FkZHIpOworCWlmIChpbncoaW9hZGRyKSA9PSAweDAwMTAgJiYKKwkgICAgaW53KGlvYWRkcikgPT0gMHgwMDAwICYmCisJICAgIGludyhpb2FkZHIpID09IDB4MDAxMCkgeworCQlpZiAoem5ldF9kZWJ1ZyA+IDEpCisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXMgOiB3YWtpbmcgdXBcbiIsIGRldi0+bmFtZSk7CisJCWhhcmR3YXJlX2luaXQoZGV2KTsKKwkJem5ldF90cmFuc2NlaXZlcl9wb3dlciAoZGV2LCAxKTsKKwl9CisKKwlpZiAoMSkgeworCQl1bnNpZ25lZCBjaGFyICpidWYgPSAodm9pZCAqKXNrYi0+ZGF0YTsKKwkJdXNob3J0ICp0eF9saW5rID0gem5ldC0+dHhfY3VyIC0gMTsKKwkJdXNob3J0IHJuZF9sZW4gPSAobGVuZ3RoICsgMSk+PjE7CisJCQorCQl6bmV0LT5zdGF0cy50eF9ieXRlcys9bGVuZ3RoOworCisJCWlmICh6bmV0LT50eF9jdXIgPj0gem5ldC0+dHhfZW5kKQorCQkgIHpuZXQtPnR4X2N1ciA9IHpuZXQtPnR4X3N0YXJ0OworCQkqem5ldC0+dHhfY3VyKysgPSBsZW5ndGg7CisJCWlmICh6bmV0LT50eF9jdXIgKyBybmRfbGVuICsgMSA+IHpuZXQtPnR4X2VuZCkgeworCQkJaW50IHNlbWlfY250ID0gKHpuZXQtPnR4X2VuZCAtIHpuZXQtPnR4X2N1cik8PDE7IC8qIEN2cnQgdG8gYnl0ZSBjbnQuICovCisJCQltZW1jcHkoem5ldC0+dHhfY3VyLCBidWYsIHNlbWlfY250KTsKKwkJCXJuZF9sZW4gLT0gc2VtaV9jbnQ+PjE7CisJCQltZW1jcHkoem5ldC0+dHhfc3RhcnQsIGJ1ZiArIHNlbWlfY250LCBsZW5ndGggLSBzZW1pX2NudCk7CisJCQl6bmV0LT50eF9jdXIgPSB6bmV0LT50eF9zdGFydCArIHJuZF9sZW47CisJCX0gZWxzZSB7CisJCQltZW1jcHkoem5ldC0+dHhfY3VyLCBidWYsIHNrYi0+bGVuKTsKKwkJCXpuZXQtPnR4X2N1ciArPSBybmRfbGVuOworCQl9CisJCSp6bmV0LT50eF9jdXIrKyA9IDA7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnpuZXQtPmxvY2ssIGZsYWdzKTsKKwkJeworCQkJKnR4X2xpbmsgPSBPUDBfVFJBTlNNSVQgfCBDUjBfQ0hOTDsKKwkJCS8qIElzIHRoaXMgYWx3YXlzIHNhZmUgdG8gZG8/ICovCisJCQlvdXRiKE9QMF9UUkFOU01JVCB8IENSMF9DSE5MLCBpb2FkZHIpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ6bmV0LT5sb2NrLCBmbGFncyk7CisKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCisJCWlmICh6bmV0X2RlYnVnID4gNCkKKwkJICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRyYW5zbWl0dGVyIHF1ZXVlZCwgbGVuZ3RoICVkLlxuIiwgZGV2LT5uYW1lLCBsZW5ndGgpOworCX0KKwlkZXZfa2ZyZWVfc2tiKHNrYik7IAorCXJldHVybiAwOworfQorCisvKiBUaGUgWk5FVCBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB6bmV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCB6bmV0X3ByaXZhdGUgKnpuZXQgPSBkZXYtPnByaXY7CisJaW50IGlvYWRkcjsKKwlpbnQgYm9ndXNjbnQgPSAyMDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiem5ldF9pbnRlcnJ1cHQoKTogSVJRICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlzcGluX2xvY2sgKCZ6bmV0LT5sb2NrKTsKKwkKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW91dGIoQ1IwX1NUQVRVU18wLCBpb2FkZHIpOworCWRvIHsKKwkJdXNob3J0IHN0YXR1cyA9IGluYihpb2FkZHIpOworCQlpZiAoem5ldF9kZWJ1ZyA+IDUpIHsKKwkJCXVzaG9ydCByZXN1bHQsIHJ4X3B0ciwgcnVubmluZzsKKwkJCW91dGIoQ1IwX1NUQVRVU18xLCBpb2FkZHIpOworCQkJcmVzdWx0ID0gaW53KGlvYWRkcik7CisJCQlvdXRiKENSMF9TVEFUVVNfMiwgaW9hZGRyKTsKKwkJCXJ4X3B0ciA9IGludyhpb2FkZHIpOworCQkJb3V0YihDUjBfU1RBVFVTXzMsIGlvYWRkcik7CisJCQlydW5uaW5nID0gaW5iKGlvYWRkcik7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludGVycnVwdCwgc3RhdHVzICUwMngsICUwNHggJTA0eCAlMDJ4IHNlcmlhbCAlZC5cbiIsCisJCQkJIGRldi0+bmFtZSwgc3RhdHVzLCByZXN1bHQsIHJ4X3B0ciwgcnVubmluZywgYm9ndXNjbnQpOworCQl9CisJCWlmICgoc3RhdHVzICYgU1IwX0lOVEVSUlVQVCkgPT0gMCkKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisJCWlmICgoc3RhdHVzICYgU1IwX0VWRU5UX01BU0spID09IFNSMF9UUkFOU01JVF9ET05FIHx8CisJCSAgICAoc3RhdHVzICYgU1IwX0VWRU5UX01BU0spID09IFNSMF9SRVRSQU5TTUlUX0RPTkUgfHwKKwkJICAgIChzdGF0dXMgJiBTUjBfRVZFTlRfTUFTSykgPT0gU1IwX1RSQU5TTUlUX05PX0NSQ19ET05FKSB7CisJCQlpbnQgdHhfc3RhdHVzOworCQkJb3V0YihDUjBfU1RBVFVTXzEsIGlvYWRkcik7CisJCQl0eF9zdGF0dXMgPSBpbncoaW9hZGRyKTsKKwkJCS8qIEl0J3MgdW5kb2N1bWVudGVkLCBidXQgdHhfc3RhdHVzIHNlZW1zIHRvIG1hdGNoIHRoZSBpODI1ODYuICovCisJCQlpZiAodHhfc3RhdHVzICYgVFhfT0spIHsKKwkJCQl6bmV0LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJem5ldC0+c3RhdHMuY29sbGlzaW9ucyArPSB0eF9zdGF0dXMgJiBUWF9OQ09MX01BU0s7CisJCQl9IGVsc2UgeworCQkJCWlmICh0eF9zdGF0dXMgJiAoVFhfTE9TVF9DVFMgfCBUWF9MT1NUX0NSUykpCisJCQkJCXpuZXQtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJaWYgKHR4X3N0YXR1cyAmIFRYX1VORF9SVU4pCisJCQkJCXpuZXQtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJaWYgKCEodHhfc3RhdHVzICYgVFhfSFJUX0JFQVQpKQorCQkJCQl6bmV0LT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCQkJaWYgKHR4X3N0YXR1cyAmIFRYX01BWF9DT0wpCisJCQkJCXpuZXQtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJLyogLi4uYW5kIHRoZSBjYXRjaC1hbGwuICovCisJCQkJaWYgKCh0eF9zdGF0dXMgfCAoVFhfTE9TVF9DUlMgfCBUWF9MT1NUX0NUUyB8IFRYX1VORF9SVU4gfCBUWF9IUlRfQkVBVCB8IFRYX01BWF9DT0wpKSAhPSAoVFhfTE9TVF9DUlMgfCBUWF9MT1NUX0NUUyB8IFRYX1VORF9SVU4gfCBUWF9IUlRfQkVBVCB8IFRYX01BWF9DT0wpKQorCQkJCQl6bmV0LT5zdGF0cy50eF9lcnJvcnMrKzsKKworCQkJCS8qIFRyYW5zY2VpdmVyIG1heSBiZSBzdHVjayBpZiBjYWJsZQorCQkJCSAqIHdhcyByZW1vdmVkIHdoaWxlIGVtaXRpbmcgYQorCQkJCSAqIHBhY2tldC4gRmxpcCBpdCBvZmYsIHRoZW4gb24gdG8KKwkJCQkgKiByZXNldCBpdC4gVGhpcyBpcyB2ZXJ5IGVtcGlyaWNhbCwKKwkJCQkgKiBidXQgaXQgc2VlbXMgdG8gd29yay4gKi8KKwkJCQkKKwkJCQl6bmV0X3RyYW5zY2VpdmVyX3Bvd2VyIChkZXYsIDApOworCQkJCXpuZXRfdHJhbnNjZWl2ZXJfcG93ZXIgKGRldiwgMSk7CisJCQl9CisJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQl9CisKKwkJaWYgKChzdGF0dXMgJiBTUjBfUkVDRVBUSU9OKSB8fAorCQkgICAgKHN0YXR1cyAmIFNSMF9FVkVOVF9NQVNLKSA9PSBTUjBfU1RPUF9SRUdfSElUKSB7CisJCQl6bmV0X3J4KGRldik7CisJCX0KKwkJLyogQ2xlYXIgdGhlIGludGVycnVwdHMgd2UndmUgaGFuZGxlZC4gKi8KKwkJb3V0YihDUjBfSU5UX0FDSywgaW9hZGRyKTsKKwl9IHdoaWxlIChib2d1c2NudC0tKTsKKworCXNwaW5fdW5sb2NrICgmem5ldC0+bG9jayk7CisJCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHpuZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgem5ldF9wcml2YXRlICp6bmV0ID0gZGV2LT5wcml2OworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgYm9ndXNjb3VudCA9IDE7CisJc2hvcnQgbmV4dF9mcmFtZV9lbmRfb2Zmc2V0ID0gMDsgCQkvKiBPZmZzZXQgb2YgbmV4dCBmcmFtZSBzdGFydC4gKi8KKwlzaG9ydCAqY3VyX2ZyYW1lX2VuZDsKKwlzaG9ydCBjdXJfZnJhbWVfZW5kX29mZnNldDsKKworCW91dGIoQ1IwX1NUQVRVU18yLCBpb2FkZHIpOworCWN1cl9mcmFtZV9lbmRfb2Zmc2V0ID0gaW53KGlvYWRkcik7CisKKwlpZiAoY3VyX2ZyYW1lX2VuZF9vZmZzZXQgPT0gem5ldC0+cnhfY3VyIC0gem5ldC0+cnhfc3RhcnQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludGVycnVwdGVkLCBidXQgbm90aGluZyB0byByZWNlaXZlLCBvZmZzZXQgJTAzeC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGN1cl9mcmFtZV9lbmRfb2Zmc2V0KTsKKwkJcmV0dXJuOworCX0KKworCS8qIFVzZSBzYW1lIG1ldGhvZCBhcyB0aGUgQ3J5bndyIGRyaXZlcjogY29uc3RydWN0IGEgZm9yd2FyZCBsaXN0IGluCisJICAgdGhlIHNhbWUgYXJlYSBvZiB0aGUgYmFja3dhcmRzIGxpbmtzIHdlIG5vdyBoYXZlLiAgVGhpcyBhbGxvd3MgdXMgdG8KKwkgICBwYXNzIHBhY2tldHMgdG8gdGhlIHVwcGVyIGxheWVycyBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHJlY2VpdmVkIC0tCisJICAgaW1wb3J0YW50IGZvciBmYXN0LXBhdGggc2VxdWVudGlhbCBvcGVyYXRpb25zLiAqLworCSB3aGlsZSAoem5ldC0+cnhfc3RhcnQgKyBjdXJfZnJhbWVfZW5kX29mZnNldCAhPSB6bmV0LT5yeF9jdXIKKwkJCSYmICsrYm9ndXNjb3VudCA8IDUpIHsKKwkJdW5zaWduZWQgc2hvcnQgaGlfY250LCBsb19jbnQsIGhpX3N0YXR1cywgbG9fc3RhdHVzOworCQlpbnQgY291bnQsIHN0YXR1czsKKworCQlpZiAoY3VyX2ZyYW1lX2VuZF9vZmZzZXQgPCA0KSB7CisJCQkvKiBPaCBubywgd2UgaGF2ZSBhIHNwZWNpYWwgY2FzZTogdGhlIGZyYW1lIHRyYWlsZXIgd3JhcHMgYXJvdW5kCisJCQkgICB0aGUgZW5kIG9mIHRoZSByaW5nIGJ1ZmZlci4gIFdlJ3ZlIHNhdmVkIHNwYWNlIGF0IHRoZSBlbmQgb2YKKwkJCSAgIHRoZSByaW5nIGJ1ZmZlciBmb3IganVzdCB0aGlzIHByb2JsZW0uICovCisJCQltZW1jcHkoem5ldC0+cnhfZW5kLCB6bmV0LT5yeF9zdGFydCwgOCk7CisJCQljdXJfZnJhbWVfZW5kX29mZnNldCArPSAoUlhfQlVGX1NJWkUvMik7CisJCX0KKwkJY3VyX2ZyYW1lX2VuZCA9IHpuZXQtPnJ4X3N0YXJ0ICsgY3VyX2ZyYW1lX2VuZF9vZmZzZXQgLSA0OworCisJCWxvX3N0YXR1cyA9ICpjdXJfZnJhbWVfZW5kKys7CisJCWhpX3N0YXR1cyA9ICpjdXJfZnJhbWVfZW5kKys7CisJCXN0YXR1cyA9ICgoaGlfc3RhdHVzICYgMHhmZikgPDwgOCkgKyAobG9fc3RhdHVzICYgMHhmZik7CisJCWxvX2NudCA9ICpjdXJfZnJhbWVfZW5kKys7CisJCWhpX2NudCA9ICpjdXJfZnJhbWVfZW5kKys7CisJCWNvdW50ID0gKChoaV9jbnQgJiAweGZmKSA8PCA4KSArIChsb19jbnQgJiAweGZmKTsKKworCQlpZiAoem5ldF9kZWJ1ZyA+IDUpCisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIkNvbnN0cnVjdGluZyB0cmFpbGVyIGF0IGxvY2F0aW9uICUwM3gsICUwNHggJTA0eCAlMDR4ICUwNHgiCisJCQkJICIgY291bnQgJSN4IHN0YXR1cyAlMDR4LlxuIiwKKwkJCQkgY3VyX2ZyYW1lX2VuZF9vZmZzZXQ8PDEsIGxvX3N0YXR1cywgaGlfc3RhdHVzLCBsb19jbnQsIGhpX2NudCwKKwkJCQkgY291bnQsIHN0YXR1cyk7CisJCWN1cl9mcmFtZV9lbmRbLTRdID0gc3RhdHVzOworCQljdXJfZnJhbWVfZW5kWy0zXSA9IG5leHRfZnJhbWVfZW5kX29mZnNldDsKKwkJY3VyX2ZyYW1lX2VuZFstMl0gPSBjb3VudDsKKwkJbmV4dF9mcmFtZV9lbmRfb2Zmc2V0ID0gY3VyX2ZyYW1lX2VuZF9vZmZzZXQ7CisJCWN1cl9mcmFtZV9lbmRfb2Zmc2V0IC09ICgoY291bnQgKyAxKT4+MSkgKyAzOworCQlpZiAoY3VyX2ZyYW1lX2VuZF9vZmZzZXQgPCAwKQorCQkgIGN1cl9mcmFtZV9lbmRfb2Zmc2V0ICs9IFJYX0JVRl9TSVpFLzI7CisJfTsKKworCS8qIE5vdyBzdGVwICBmb3J3YXJkIHRocm91Z2ggdGhlIGxpc3QuICovCisJZG8geworCQl1c2hvcnQgKnRoaXNfcmZwX3B0ciA9IHpuZXQtPnJ4X3N0YXJ0ICsgbmV4dF9mcmFtZV9lbmRfb2Zmc2V0OworCQlpbnQgc3RhdHVzID0gdGhpc19yZnBfcHRyWy00XTsKKwkJaW50IHBrdF9sZW4gPSB0aGlzX3JmcF9wdHJbLTJdOworCSAgCisJCWlmICh6bmV0X2RlYnVnID4gNSkKKwkJICBwcmludGsoS0VSTl9ERUJVRyAiTG9va2luZyBhdCB0cmFpbGVyIGVuZGluZyBhdCAlMDR4IHN0YXR1cyAlMDR4IGxlbmd0aCAlMDN4IgorCQkJCSAiIG5leHQgJTA0eC5cbiIsIG5leHRfZnJhbWVfZW5kX29mZnNldDw8MSwgc3RhdHVzLCBwa3RfbGVuLAorCQkJCSB0aGlzX3JmcF9wdHJbLTNdPDwxKTsKKwkJLyogT25jZSBhZ2FpbiB3ZSBtdXN0IGFzc3VtZSB0aGF0IHRoZSBpODI1ODYgZG9jcyBhcHBseS4gKi8KKwkJaWYgKCAhIChzdGF0dXMgJiBSWF9SQ1ZfT0spKSB7IC8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KKwkJCXpuZXQtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFJYX0NSQ19FUlIpIHpuZXQtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBSWF9BTEdfRVJSKSB6bmV0LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKyNpZiAwCisJCQlpZiAoc3RhdHVzICYgMHgwMjAwKSB6bmV0LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOyAvKiBXcm9uZy4gKi8KKwkJCWlmIChzdGF0dXMgJiAweDAxMDApIHpuZXQtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisjZWxzZQorCQkJLyogbWF6IDogV2lsZCBndWVzcy4uLiAqLworCQkJaWYgKHN0YXR1cyAmIFJYX09WUlJVTikgem5ldC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKyNlbmRpZgorCQkJaWYgKHN0YXR1cyAmIFJYX1NSVF9GUk0pIHpuZXQtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJfSBlbHNlIGlmIChwa3RfbGVuID4gMTUzNikgeworCQkJem5ldC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4pOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJaWYgKHpuZXRfZGVidWcpCisJCQkJICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7CisJCQkJem5ldC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJc2tiLT5kZXYgPSBkZXY7CisKKwkJCWlmICgmem5ldC0+cnhfY3VyWyhwa3RfbGVuKzEpPj4xXSA+IHpuZXQtPnJ4X2VuZCkgeworCQkJCWludCBzZW1pX2NudCA9ICh6bmV0LT5yeF9lbmQgLSB6bmV0LT5yeF9jdXIpPDwxOworCQkJCW1lbWNweShza2JfcHV0KHNrYixzZW1pX2NudCksIHpuZXQtPnJ4X2N1ciwgc2VtaV9jbnQpOworCQkJCW1lbWNweShza2JfcHV0KHNrYixwa3RfbGVuLXNlbWlfY250KSwgem5ldC0+cnhfc3RhcnQsCisJCQkJCSAgIHBrdF9sZW4gLSBzZW1pX2NudCk7CisJCQl9IGVsc2UgeworCQkJCW1lbWNweShza2JfcHV0KHNrYixwa3RfbGVuKSwgem5ldC0+cnhfY3VyLCBwa3RfbGVuKTsKKwkJCQlpZiAoem5ldF9kZWJ1ZyA+IDYpIHsKKwkJCQkJdW5zaWduZWQgaW50ICpwYWNrZXQgPSAodW5zaWduZWQgaW50ICopIHNrYi0+ZGF0YTsKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlBhY2tldCBkYXRhIGlzICUwOHggJTA4eCAlMDh4ICUwOHguXG4iLCBwYWNrZXRbMF0sCisJCQkJCQkgICBwYWNrZXRbMV0sIHBhY2tldFsyXSwgcGFja2V0WzNdKTsKKwkJCQl9CisJCSAgfQorCQkgIHNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCSAgbmV0aWZfcngoc2tiKTsKKwkJICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkgIHpuZXQtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJICB6bmV0LT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisJCXpuZXQtPnJ4X2N1ciA9IHRoaXNfcmZwX3B0cjsKKwkJaWYgKHpuZXQtPnJ4X2N1ciA+PSB6bmV0LT5yeF9lbmQpCisJCQl6bmV0LT5yeF9jdXIgLT0gUlhfQlVGX1NJWkUvMjsKKwkJdXBkYXRlX3N0b3BfaGl0KGlvYWRkciwgKHpuZXQtPnJ4X2N1ciAtIHpuZXQtPnJ4X3N0YXJ0KTw8MSk7CisJCW5leHRfZnJhbWVfZW5kX29mZnNldCA9IHRoaXNfcmZwX3B0clstM107CisJCWlmIChuZXh0X2ZyYW1lX2VuZF9vZmZzZXQgPT0gMCkJCS8qIFJlYWQgYWxsIHRoZSBmcmFtZXM/ICovCisJCQlicmVhazsJCQkvKiBEb25lIGZvciBub3cgKi8KKwkJdGhpc19yZnBfcHRyID0gem5ldC0+cnhfc3RhcnQgKyBuZXh0X2ZyYW1lX2VuZF9vZmZzZXQ7CisJfSB3aGlsZSAoLS1ib2d1c2NvdW50KTsKKworCS8qIElmIGFueSB3b3J0aC13aGlsZSBwYWNrZXRzIGhhdmUgYmVlbiByZWNlaXZlZCwgZGV2X3JpbnQoKQorCSAgIGhhcyBkb25lIGEgbWFya19iaChJTkVUX0JIKSBmb3IgdXMgYW5kIHdpbGwgd29yayBvbiB0aGVtCisJICAgd2hlbiB3ZSBnZXQgdG8gdGhlIGJvdHRvbS1oYWxmIHJvdXRpbmUuICovCisJcmV0dXJuOworfQorCisvKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIHpuZXRfb3BlbigpLiAqLworc3RhdGljIGludCB6bmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCW91dGIoT1AwX1JFU0VULCBpb2FkZHIpOwkJCS8qIENNRDBfUkVTRVQgKi8KKworCWlmICh6bmV0X2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZC5cbiIsIGRldi0+bmFtZSk7CisJLyogVHVybiBvZmYgdHJhbnNjZWl2ZXIgcG93ZXIuICovCisJem5ldF90cmFuc2NlaXZlcl9wb3dlciAoZGV2LCAwKTsKKwkKKwl6bmV0X3JlbGVhc2VfcmVzb3VyY2VzIChkZXYpOworCQorCXJldHVybiAwOworfQorCisvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4JVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvcgorICAgY2xvc2VkLiAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHpuZXRfcHJpdmF0ZSAqem5ldCA9IGRldi0+cHJpdjsKKworCXJldHVybiAmem5ldC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZG1hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgY2hhciBzdGF0ID0gaW5iIChpb2FkZHIpOworCXN0cnVjdCB6bmV0X3ByaXZhdGUgKnpuZXQgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCBkbWFfcG9ydCA9ICgoem5ldC0+dHhfZG1hJjMpPDwyKSArIElPX0RNQTJfQkFTRTsKKwl1bnNpZ25lZCBhZGRyID0gaW5iKGRtYV9wb3J0KTsKKwlzaG9ydCByZXNpZHVlOworCisJYWRkciB8PSBpbmIoZG1hX3BvcnQpIDw8IDg7CisJcmVzaWR1ZSA9IGdldF9kbWFfcmVzaWR1ZSh6bmV0LT50eF9kbWEpOworCQkKKwlpZiAoem5ldF9kZWJ1ZyA+IDEpIHsKKwkJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlN0YXQ6JTAyeCBBZGRyOiAlMDR4IGNudDolM3hcbiIsCisJCSAgICAgICBzdGF0LCBhZGRyPDwxLCByZXNpZHVlKTsKKwkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJfQorfQorCisvKiBJbml0aWFsaXplIHRoZSBoYXJkd2FyZS4gIFdlIGhhdmUgdG8gZG8gdGhpcyB3aGVuIHRoZSBib2FyZCBpcyBvcGVuKCllZAorICAgb3Igd2hlbiB3ZSBjb21lIG91dCBvZiBzdXNwZW5kIG1vZGUuICovCitzdGF0aWMgdm9pZCBoYXJkd2FyZV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3Qgem5ldF9wcml2YXRlICp6bmV0ID0gZGV2LT5wcml2OworCisJem5ldC0+cnhfY3VyID0gem5ldC0+cnhfc3RhcnQ7CisJem5ldC0+dHhfY3VyID0gem5ldC0+dHhfc3RhcnQ7CisKKwkvKiBSZXNldCB0aGUgY2hpcCwgYW5kIHN0YXJ0IGl0IHVwLiAqLworCW91dGIoT1AwX1JFU0VULCBpb2FkZHIpOworCisJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYSh6bmV0LT5yeF9kbWEpOyAJCS8qIHJlc2V0IGJ5IGFuIGludGVycnVwdGluZyB0YXNrLiAqLworCWNsZWFyX2RtYV9mZih6bmV0LT5yeF9kbWEpOworCXNldF9kbWFfbW9kZSh6bmV0LT5yeF9kbWEsIERNQV9SWF9NT0RFKTsKKwlzZXRfZG1hX2FkZHIoem5ldC0+cnhfZG1hLCAodW5zaWduZWQgaW50KSB6bmV0LT5yeF9zdGFydCk7CisJc2V0X2RtYV9jb3VudCh6bmV0LT5yeF9kbWEsIFJYX0JVRl9TSVpFKTsKKwllbmFibGVfZG1hKHpuZXQtPnJ4X2RtYSk7CisJLyogTm93IHNldCB1cCB0aGUgVHggY2hhbm5lbC4gKi8KKwlkaXNhYmxlX2RtYSh6bmV0LT50eF9kbWEpOworCWNsZWFyX2RtYV9mZih6bmV0LT50eF9kbWEpOworCXNldF9kbWFfbW9kZSh6bmV0LT50eF9kbWEsIERNQV9UWF9NT0RFKTsKKwlzZXRfZG1hX2FkZHIoem5ldC0+dHhfZG1hLCAodW5zaWduZWQgaW50KSB6bmV0LT50eF9zdGFydCk7CisJc2V0X2RtYV9jb3VudCh6bmV0LT50eF9kbWEsIHpuZXQtPnR4X2J1Zl9sZW48PDEpOworCWVuYWJsZV9kbWEoem5ldC0+dHhfZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkKKwlpZiAoem5ldF9kZWJ1ZyA+IDEpCisJICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IEluaXRpYWxpemluZyB0aGUgaTgyNTkzLCByeCBidWYgJXAgdHggYnVmICVwXG4iLAorCQkJIGRldi0+bmFtZSwgem5ldC0+cnhfc3RhcnQsem5ldC0+dHhfc3RhcnQpOworCS8qIERvIGFuIGVtcHR5IGNvbmZpZ3VyZSBjb21tYW5kLCBqdXN0IGxpa2UgdGhlIENyeW53ciBkcml2ZXIuICBUaGlzCisJICAgcmVzZXRzIHRvIGNoaXAgdG8gaXRzIGRlZmF1bHQgdmFsdWVzLiAqLworCSp6bmV0LT50eF9jdXIrKyA9IDA7CisJKnpuZXQtPnR4X2N1cisrID0gMDsKKwlzaG93X2RtYShkZXYpOworCW91dGIoT1AwX0NPTkZJR1VSRSB8IENSMF9DSE5MLCBpb2FkZHIpOworCisJem5ldF9zZXRfbXVsdGljYXN0X2xpc3QgKGRldik7CisKKwkqem5ldC0+dHhfY3VyKysgPSA2OworCW1lbWNweSh6bmV0LT50eF9jdXIsIGRldi0+ZGV2X2FkZHIsIDYpOworCXpuZXQtPnR4X2N1ciArPSAzOworCXNob3dfZG1hKGRldik7CisJb3V0YihPUDBfSUFfU0VUVVAgfCBDUjBfQ0hOTCwgaW9hZGRyKTsKKwlzaG93X2RtYShkZXYpOworCisJdXBkYXRlX3N0b3BfaGl0KGlvYWRkciwgODE5Mik7CisJaWYgKHpuZXRfZGVidWcgPiAxKSAgcHJpbnRrKEtFUk5fREVCVUcgImVuYWJsaW5nIFJ4LlxuIik7CisJb3V0YihPUDBfUkNWX0VOQUJMRSwgaW9hZGRyKTsKKwluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3N0b3BfaGl0KHNob3J0IGlvYWRkciwgdW5zaWduZWQgc2hvcnQgcnhfc3RvcF9vZmZzZXQpCit7CisJb3V0YihPUDBfU1dJVF9UT19QT1JUXzEgfCBDUjBfQ0hOTCwgaW9hZGRyKTsKKwlpZiAoem5ldF9kZWJ1ZyA+IDUpCisJICBwcmludGsoS0VSTl9ERUJVRyAiVXBkYXRpbmcgc3RvcCBoaXQgd2l0aCB2YWx1ZSAlMDJ4LlxuIiwKKwkJCSAocnhfc3RvcF9vZmZzZXQgPj4gNikgfCBDUjFfU1RPUF9SRUdfVVBEQVRFKTsKKwlvdXRiKChyeF9zdG9wX29mZnNldCA+PiA2KSB8IENSMV9TVE9QX1JFR19VUERBVEUsIGlvYWRkcik7CisJb3V0YihPUDFfU1dJVF9UT19QT1JUXzAsIGlvYWRkcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCB6bmV0X2NsZWFudXAgKHZvaWQpCit7CisJaWYgKHpuZXRfZGV2KSB7CisJCXN0cnVjdCB6bmV0X3ByaXZhdGUgKnpuZXQgPSB6bmV0X2Rldi0+cHJpdjsKKworCQl1bnJlZ2lzdGVyX25ldGRldiAoem5ldF9kZXYpOworCQlrZnJlZSAoem5ldC0+cnhfc3RhcnQpOworCQlrZnJlZSAoem5ldC0+dHhfc3RhcnQpOworCQlmcmVlX25ldGRldiAoem5ldF9kZXYpOworCX0KK30KKworbW9kdWxlX2luaXQgKHpuZXRfcHJvYmUpOworbW9kdWxlX2V4aXQgKHpuZXRfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC96b3JybzgzOTAuYyBiL2RyaXZlcnMvbmV0L3pvcnJvODM5MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYjZlMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC96b3JybzgzOTAuYwpAQCAtMCwwICsxLDQzOSBAQAorLyoKKyAqICBBbWlnYSBMaW51eC9tNjhrIGFuZCBMaW51eC9QUEMgWm9ycm8gTlM4MzkwIEV0aGVybmV0IERyaXZlcgorICoKKyAqICAoQykgQ29weXJpZ2h0IDE5OTgtMjAwMCBieSBzb21lIEVsaXRpc3QgNjgweDAgVXNlcnMoVE0pCisgKgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgYmFzZWQgb24gYWxsIHRoZSBvdGhlciBORTIwMDAgZHJpdmVycyBmb3IgTGludXgKKyAqCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgKKyAqICBkaXN0cmlidXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIFRoZSBBcmlhZG5lIElJIGFuZCBYLVN1cmYgYXJlIFpvcnJvLUlJIGJvYXJkcyBjb250YWluaW5nIFJlYWx0ZWsgUlRMODAxOUFTCisgKiAgRXRoZXJuZXQgQ29udHJvbGxlcnMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworCisjZGVmaW5lIERSVl9OQU1FCSJ6b3JybzgzOTAiCisKKyNkZWZpbmUgTkVfQkFTRQkJKGRldi0+YmFzZV9hZGRyKQorI2RlZmluZSBORV9DTUQJCSgweDAwKjIpCisjZGVmaW5lIE5FX0RBVEFQT1JUCSgweDEwKjIpCS8qIE5hdFNlbWktZGVmaW5lZCBwb3J0IHdpbmRvdyBvZmZzZXQuICovCisjZGVmaW5lIE5FX1JFU0VUCSgweDFmKjIpCS8qIElzc3VlIGEgcmVhZCB0byByZXNldCwgYSB3cml0ZSB0byBjbGVhci4gKi8KKyNkZWZpbmUgTkVfSU9fRVhURU5UCSgweDIwKjIpCisKKyNkZWZpbmUgTkVfRU4wX0lTUgkoMHgwNyoyKQorI2RlZmluZSBORV9FTjBfRENGRwkoMHgwZSoyKQorCisjZGVmaW5lIE5FX0VOMF9SU0FSTE8JKDB4MDgqMikKKyNkZWZpbmUgTkVfRU4wX1JTQVJISQkoMHgwOSoyKQorI2RlZmluZSBORV9FTjBfUkNOVExPCSgweDBhKjIpCisjZGVmaW5lIE5FX0VOMF9SWENSCSgweDBjKjIpCisjZGVmaW5lIE5FX0VOMF9UWENSCSgweDBkKjIpCisjZGVmaW5lIE5FX0VOMF9SQ05USEkJKDB4MGIqMikKKyNkZWZpbmUgTkVfRU4wX0lNUgkoMHgwZioyKQorCisjZGVmaW5lIE5FU01fU1RBUlRfUEcJMHg0MAkvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlciAqLworI2RlZmluZSBORVNNX1NUT1BfUEcJMHg4MAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworCisKKyNkZWZpbmUgV09SRFNXQVAoYSkJKCgoKGEpPj44KSYweGZmKSB8ICgoYSk8PDgpKQorCisKK3N0YXRpYyBzdHJ1Y3QgY2FyZF9pbmZvIHsKKyAgICB6b3Jyb19pZCBpZDsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7Cit9IGNhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKKyAgICB7IFpPUlJPX1BST0RfVklMTEFHRV9UUk9OSUNfQVJJQURORTIsICJBcmlhZG5lIElJIiwgMHgwNjAwIH0sCisgICAgeyBaT1JST19QUk9EX0lORElWSURVQUxfQ09NUFVURVJTX1hfU1VSRiwgIlgtU3VyZiIsIDB4ODYwMCB9LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgem9ycm84MzkwX2luaXRfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnosCisJCQkJCWNvbnN0IHN0cnVjdCB6b3Jyb19kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCB6b3JybzgzOTBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGJvYXJkLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGlvYWRkcik7CitzdGF0aWMgaW50IHpvcnJvODM5MF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB6b3JybzgzOTBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB6b3JybzgzOTBfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHpvcnJvODM5MF9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIHpvcnJvODM5MF9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgem9ycm84MzkwX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBpbnQgY291bnQsCisJCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCSAgIGNvbnN0IGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB6b3JybzgzOTBfcmVtb3ZlX29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6KTsKKworc3RhdGljIHN0cnVjdCB6b3Jyb19kZXZpY2VfaWQgem9ycm84MzkwX3pvcnJvX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisgICAgeyBaT1JST19QUk9EX1ZJTExBR0VfVFJPTklDX0FSSUFETkUyLCB9LAorICAgIHsgWk9SUk9fUFJPRF9JTkRJVklEVUFMX0NPTVBVVEVSU19YX1NVUkYsIH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgem9ycm9fZHJpdmVyIHpvcnJvODM5MF9kcml2ZXIgPSB7CisgICAgLm5hbWUJPSAiem9ycm84MzkwIiwKKyAgICAuaWRfdGFibGUJPSB6b3JybzgzOTBfem9ycm9fdGJsLAorICAgIC5wcm9iZQk9IHpvcnJvODM5MF9pbml0X29uZSwKKyAgICAucmVtb3ZlCT0gX19kZXZleGl0X3Aoem9ycm84MzkwX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgem9ycm84MzkwX2luaXRfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnosCisJCQkJCWNvbnN0IHN0cnVjdCB6b3Jyb19kZXZpY2VfaWQgKmVudCkKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIHVuc2lnbmVkIGxvbmcgYm9hcmQsIGlvYWRkcjsKKyAgICBpbnQgZXJyLCBpOworCisgICAgZm9yIChpID0gQVJSQVlfU0laRShjYXJkcyktMTsgaSA+PSAwOyBpLS0pCisJaWYgKHotPmlkID09IGNhcmRzW2ldLmlkKQorCSAgICBicmVhazsKKyAgICBib2FyZCA9IHotPnJlc291cmNlLnN0YXJ0OworICAgIGlvYWRkciA9IGJvYXJkK2NhcmRzW2ldLm9mZnNldDsKKyAgICBkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKyAgICBpZiAoIWRldikKKwlyZXR1cm4gLUVOT01FTTsKKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAgaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW9hZGRyLCBORV9JT19FWFRFTlQqMiwgRFJWX05BTUUpKSB7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gLUVCVVNZOworICAgIH0KKyAgICBpZiAoKGVyciA9IHpvcnJvODM5MF9pbml0KGRldiwgYm9hcmQsIGNhcmRzW2ldLm5hbWUsCisJCQkgICAgICBaVFdPX1ZBRERSKGlvYWRkcikpKSkgeworCXJlbGVhc2VfbWVtX3JlZ2lvbihpb2FkZHIsIE5FX0lPX0VYVEVOVCoyKTsKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBlcnI7CisgICAgfQorICAgIHpvcnJvX3NldF9kcnZkYXRhKHosIGRldik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHpvcnJvODM5MF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYm9hcmQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworICAgIGludCBpOworICAgIGludCBlcnI7CisgICAgdW5zaWduZWQgY2hhciBTQV9wcm9tWzMyXTsKKyAgICBpbnQgc3RhcnRfcGFnZSwgc3RvcF9wYWdlOworICAgIHN0YXRpYyB1MzIgem9ycm84MzkwX29mZnNldHNbMTZdID0geworCTB4MDAsIDB4MDIsIDB4MDQsIDB4MDYsIDB4MDgsIDB4MGEsIDB4MGMsIDB4MGUsCisJMHgxMCwgMHgxMiwgMHgxNCwgMHgxNiwgMHgxOCwgMHgxYSwgMHgxYywgMHgxZSwKKyAgICB9OworCisgICAgLyogUmVzZXQgY2FyZC4gV2hvIGtub3dzIHdoYXQgZGFpbi1icmFtYWdlZCBzdGF0ZSBpdCB3YXMgbGVmdCBpbi4gKi8KKyAgICB7CisJdW5zaWduZWQgbG9uZyByZXNldF9zdGFydF90aW1lID0gamlmZmllczsKKworCXpfd3JpdGViKHpfcmVhZGIoaW9hZGRyICsgTkVfUkVTRVQpLCBpb2FkZHIgKyBORV9SRVNFVCk7CisKKwl3aGlsZSAoKHpfcmVhZGIoaW9hZGRyICsgTkVfRU4wX0lTUikgJiBFTklTUl9SRVNFVCkgPT0gMCkKKwkgICAgaWYgKGppZmZpZXMgLSByZXNldF9zdGFydF90aW1lID4gMipIWi8xMDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiIG5vdCBmb3VuZCAobm8gcmVzZXQgYWNrKS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwkgICAgfQorCisJel93cml0ZWIoMHhmZiwgaW9hZGRyICsgTkVfRU4wX0lTUik7CQkvKiBBY2sgYWxsIGludHIuICovCisgICAgfQorCisgICAgLyogUmVhZCB0aGUgMTYgYnl0ZXMgb2Ygc3RhdGlvbiBhZGRyZXNzIFBST00uCisgICAgICAgV2UgbXVzdCBmaXJzdCBpbml0aWFsaXplIHJlZ2lzdGVycywgc2ltaWxhciB0byBOUzgzOTBfaW5pdChlaWZkZXYsIDApLgorICAgICAgIFdlIGNhbid0IHJlbGlhYmx5IHJlYWQgdGhlIFNBUFJPTSBhZGRyZXNzIHdpdGhvdXQgdGhpcy4KKyAgICAgICAoSSBsZWFybmVkIHRoZSBoYXJkIHdheSEpLiAqLworICAgIHsKKwlzdHJ1Y3QgeworCSAgICB1MzIgdmFsdWU7CisJICAgIHUzMiBvZmZzZXQ7CisJfSBwcm9ncmFtX3NlcVtdID0geworCSAgICB7RTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgTkVfQ01EfSwgLyogU2VsZWN0IHBhZ2UgMCovCisJICAgIHsweDQ4LAlORV9FTjBfRENGR30sCS8qIFNldCBieXRlLXdpZGUgKDB4NDgpIGFjY2Vzcy4gKi8KKwkgICAgezB4MDAsCU5FX0VOMF9SQ05UTE99LAkvKiBDbGVhciB0aGUgY291bnQgcmVncy4gKi8KKwkgICAgezB4MDAsCU5FX0VOMF9SQ05USEl9LAorCSAgICB7MHgwMCwJTkVfRU4wX0lNUn0sCS8qIE1hc2sgY29tcGxldGlvbiBpcnEuICovCisJICAgIHsweEZGLAlORV9FTjBfSVNSfSwKKwkgICAge0U4MzkwX1JYT0ZGLCBORV9FTjBfUlhDUn0sCS8qIDB4MjAgIFNldCB0byBtb25pdG9yICovCisJICAgIHtFODM5MF9UWE9GRiwgTkVfRU4wX1RYQ1J9LAkvKiAweDAyICBhbmQgbG9vcGJhY2sgbW9kZS4gKi8KKwkgICAgezMyLAlORV9FTjBfUkNOVExPfSwKKwkgICAgezB4MDAsCU5FX0VOMF9SQ05USEl9LAorCSAgICB7MHgwMCwJTkVfRU4wX1JTQVJMT30sCS8qIERNQSBzdGFydGluZyBhdCAweDAwMDAuICovCisJICAgIHsweDAwLAlORV9FTjBfUlNBUkhJfSwKKwkgICAge0U4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBORV9DTUR9LAorCX07CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihwcm9ncmFtX3NlcSkvc2l6ZW9mKHByb2dyYW1fc2VxWzBdKTsgaSsrKSB7CisJICAgIHpfd3JpdGViKHByb2dyYW1fc2VxW2ldLnZhbHVlLCBpb2FkZHIgKyBwcm9ncmFtX3NlcVtpXS5vZmZzZXQpOworCX0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwlTQV9wcm9tW2ldID0gel9yZWFkYihpb2FkZHIgKyBORV9EQVRBUE9SVCk7CisJKHZvaWQpel9yZWFkYihpb2FkZHIgKyBORV9EQVRBUE9SVCk7CisgICAgfQorCisgICAgLyogV2UgbXVzdCBzZXQgdGhlIDgzOTAgZm9yIHdvcmQgbW9kZS4gKi8KKyAgICB6X3dyaXRlYigweDQ5LCBpb2FkZHIgKyBORV9FTjBfRENGRyk7CisgICAgc3RhcnRfcGFnZSA9IE5FU01fU1RBUlRfUEc7CisgICAgc3RvcF9wYWdlID0gTkVTTV9TVE9QX1BHOworCisgICAgZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisgICAgZGV2LT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7CisKKyAgICAvKiBJbnN0YWxsIHRoZSBJbnRlcnJ1cHQgaGFuZGxlciAqLworICAgIGkgPSByZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGVpX2ludGVycnVwdCwgU0FfU0hJUlEsIERSVl9OQU1FLCBkZXYpOworICAgIGlmIChpKSByZXR1cm4gaTsKKworICAgIGZvcihpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspIHsKKyNpZmRlZiBERUJVRworCXByaW50aygiICUyLjJ4IiwgU0FfcHJvbVtpXSk7CisjZW5kaWYKKwlkZXYtPmRldl9hZGRyW2ldID0gU0FfcHJvbVtpXTsKKyAgICB9CisKKyAgICBlaV9zdGF0dXMubmFtZSA9IG5hbWU7CisgICAgZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wYWdlOworICAgIGVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBzdG9wX3BhZ2U7CisgICAgZWlfc3RhdHVzLndvcmQxNiA9IDE7CisKKyAgICBlaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IHN0YXJ0X3BhZ2UgKyBUWF9QQUdFUzsKKworICAgIGVpX3N0YXR1cy5yZXNldF84MzkwID0gJnpvcnJvODM5MF9yZXNldF84MzkwOworICAgIGVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZ6b3JybzgzOTBfYmxvY2tfaW5wdXQ7CisgICAgZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZ6b3JybzgzOTBfYmxvY2tfb3V0cHV0OworICAgIGVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmem9ycm84MzkwX2dldF84MzkwX2hkcjsKKyAgICBlaV9zdGF0dXMucmVnX29mZnNldCA9IHpvcnJvODM5MF9vZmZzZXRzOworICAgIGRldi0+b3BlbiA9ICZ6b3JybzgzOTBfb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmem9ycm84MzkwX2Nsb3NlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisgICAgZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworI2VuZGlmCisKKyAgICBOUzgzOTBfaW5pdChkZXYsIDApOworICAgIGVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworICAgIGlmIChlcnIpIHsKKwlmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGRldik7CisJcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogJXMgYXQgMHglMDhseCwgRXRoZXJuZXQgQWRkcmVzcyAiCisJICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBkZXYtPm5hbWUsIG5hbWUsIGJvYXJkLAorCSAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCisJICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB6b3JybzgzOTBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGVpX29wZW4oZGV2KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB6b3JybzgzOTBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpZiAoZWlfZGVidWcgPiAxKQorCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOworICAgIGVpX2Nsb3NlKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEhhcmQgcmVzZXQgdGhlIGNhcmQuICBUaGlzIHVzZWQgdG8gcGF1c2UgZm9yIHRoZSBzYW1lIHBlcmlvZCB0aGF0IGEKKyAgIDgzOTAgcmVzZXQgY29tbWFuZCByZXF1aXJlZCwgYnV0IHRoYXQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeS4gKi8KK3N0YXRpYyB2b2lkIHpvcnJvODM5MF9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgdW5zaWduZWQgbG9uZyByZXNldF9zdGFydF90aW1lID0gamlmZmllczsKKworICAgIGlmIChlaV9kZWJ1ZyA+IDEpCisJcHJpbnRrKEtFUk5fREVCVUcgInJlc2V0dGluZyB0aGUgODM5MCB0PSVsZC4uLlxuIiwgamlmZmllcyk7CisKKyAgICB6X3dyaXRlYih6X3JlYWRiKE5FX0JBU0UgKyBORV9SRVNFVCksIE5FX0JBU0UgKyBORV9SRVNFVCk7CisKKyAgICBlaV9zdGF0dXMudHhpbmcgPSAwOworICAgIGVpX3N0YXR1cy5kbWFpbmcgPSAwOworCisgICAgLyogVGhpcyBjaGVjayBfc2hvdWxkX25vdF8gYmUgbmVjZXNzYXJ5LCBvbWl0IGV2ZW50dWFsbHkuICovCisgICAgd2hpbGUgKCh6X3JlYWRiKE5FX0JBU0UrTkVfRU4wX0lTUikgJiBFTklTUl9SRVNFVCkgPT0gMCkKKwlpZiAoamlmZmllcyAtIHJlc2V0X3N0YXJ0X3RpbWUgPiAyKkhaLzEwMCkgeworCSAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogbmVfcmVzZXRfODM5MCgpIGRpZCBub3QgY29tcGxldGUuXG4iLAorCQkgICBkZXYtPm5hbWUpOworCSAgICBicmVhazsKKwl9CisgICAgel93cml0ZWIoRU5JU1JfUkVTRVQsIE5FX0JBU0UgKyBORV9FTjBfSVNSKTsJLyogQWNrIGludHIuICovCit9CisKKy8qIEdyYWIgdGhlIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiBTaW1pbGFyIHRvIHRoZSBibG9ja19pbnB1dCByb3V0aW5lLCBidXQKKyAgIHdlIGRvbid0IG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGggcmluZyB3cmFwIGFzIHRoZSBoZWFkZXIgd2lsbCBiZSBhdAorICAgdGhlIHN0YXJ0IG9mIGEgcGFnZSwgc28gd2Ugb3B0aW1pemUgYWNjb3JkaW5nbHkuICovCisKK3N0YXRpYyB2b2lkIHpvcnJvODM5MF9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworICAgIGludCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBjbnQ7CisgICAgc2hvcnQgKnB0cnM7CisKKyAgICAvKiBUaGlzICpzaG91bGRuJ3QqIGhhcHBlbi4gSWYgaXQgZG9lcywgaXQncyB0aGUgbGFzdCB0aGluZyB5b3UnbGwgc2VlICovCisgICAgaWYgKGVpX3N0YXR1cy5kbWFpbmcpIHsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gbmVfZ2V0XzgzOTBfaGRyICIKKwkgICAiW0RNQXN0YXQ6JWRdW2lycWxvY2s6JWRdLlxuIiwgZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLAorCSAgIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworICAgIHpfd3JpdGViKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBuaWNfYmFzZSsgTkVfQ01EKTsKKyAgICB6X3dyaXRlYihFTklTUl9SREMsIG5pY19iYXNlICsgTkVfRU4wX0lTUik7CisgICAgel93cml0ZWIoc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSwgbmljX2Jhc2UgKyBORV9FTjBfUkNOVExPKTsKKyAgICB6X3dyaXRlYigwLCBuaWNfYmFzZSArIE5FX0VOMF9SQ05USEkpOworICAgIHpfd3JpdGViKDAsIG5pY19iYXNlICsgTkVfRU4wX1JTQVJMTyk7CQkvKiBPbiBwYWdlIGJvdW5kYXJ5ICovCisgICAgel93cml0ZWIocmluZ19wYWdlLCBuaWNfYmFzZSArIE5FX0VOMF9SU0FSSEkpOworICAgIHpfd3JpdGViKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisKKyAgICBwdHJzID0gKHNob3J0KiloZHI7CisgICAgZm9yIChjbnQgPSAwOyBjbnQgPCAoc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKT4+MSk7IGNudCsrKQorCSpwdHJzKysgPSB6X3JlYWR3KE5FX0JBU0UgKyBORV9EQVRBUE9SVCk7CisKKyAgICB6X3dyaXRlYihFTklTUl9SREMsIG5pY19iYXNlICsgTkVfRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworCisgICAgaGRyLT5jb3VudCA9IFdPUkRTV0FQKGhkci0+Y291bnQpOworCisgICAgZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKK30KKworLyogQmxvY2sgaW5wdXQgYW5kIG91dHB1dCwgc2ltaWxhciB0byB0aGUgQ3J5bndyIHBhY2tldCBkcml2ZXIuICBJZiB5b3UKKyAgIGFyZSBwb3J0aW5nIHRvIGEgbmV3IGV0aGVyY2FyZCwgbG9vayBhdCB0aGUgcGFja2V0IGRyaXZlciBzb3VyY2UgZm9yIGhpbnRzLgorICAgVGhlIE5FeDAwMCBkb2Vzbid0IHNoYXJlIHRoZSBvbi1ib2FyZCBwYWNrZXQgbWVtb3J5IC0tIHlvdSBoYXZlIHRvIHB1dAorICAgdGhlIHBhY2tldCBvdXQgdGhyb3VnaCB0aGUgInJlbW90ZSBETUEiIGRhdGFwb3J0IHVzaW5nIHpfd3JpdGViLiAqLworCitzdGF0aWMgdm9pZCB6b3JybzgzOTBfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisgICAgaW50IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgY2hhciAqYnVmID0gc2tiLT5kYXRhOworICAgIHNob3J0ICpwdHJzOworICAgIGludCBjbnQ7CisKKyAgICAvKiBUaGlzICpzaG91bGRuJ3QqIGhhcHBlbi4gSWYgaXQgZG9lcywgaXQncyB0aGUgbGFzdCB0aGluZyB5b3UnbGwgc2VlICovCisgICAgaWYgKGVpX3N0YXR1cy5kbWFpbmcpIHsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gbmVfYmxvY2tfaW5wdXQgIgorCSAgICJbRE1Bc3RhdDolZF1baXJxbG9jazolZF0uXG4iLAorCSAgIGRldi0+bmFtZSwgZWlfc3RhdHVzLmRtYWluZywgZWlfc3RhdHVzLmlycWxvY2spOworCXJldHVybjsKKyAgICB9CisgICAgZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworICAgIHpfd3JpdGViKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBuaWNfYmFzZSsgTkVfQ01EKTsKKyAgICB6X3dyaXRlYihFTklTUl9SREMsIG5pY19iYXNlICsgTkVfRU4wX0lTUik7CisgICAgel93cml0ZWIoY291bnQgJiAweGZmLCBuaWNfYmFzZSArIE5FX0VOMF9SQ05UTE8pOworICAgIHpfd3JpdGViKGNvdW50ID4+IDgsIG5pY19iYXNlICsgTkVfRU4wX1JDTlRISSk7CisgICAgel93cml0ZWIocmluZ19vZmZzZXQgJiAweGZmLCBuaWNfYmFzZSArIE5FX0VOMF9SU0FSTE8pOworICAgIHpfd3JpdGViKHJpbmdfb2Zmc2V0ID4+IDgsIG5pY19iYXNlICsgTkVfRU4wX1JTQVJISSk7CisgICAgel93cml0ZWIoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgTkVfQ01EKTsKKyAgICBwdHJzID0gKHNob3J0KilidWY7CisgICAgZm9yIChjbnQgPSAwOyBjbnQgPCAoY291bnQ+PjEpOyBjbnQrKykKKwkqcHRycysrID0gel9yZWFkdyhORV9CQVNFICsgTkVfREFUQVBPUlQpOworICAgIGlmIChjb3VudCAmIDB4MDEpCisJYnVmW2NvdW50LTFdID0gel9yZWFkYihORV9CQVNFICsgTkVfREFUQVBPUlQpOworCisgICAgel93cml0ZWIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKyAgICBlaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworfQorCitzdGF0aWMgdm9pZCB6b3JybzgzOTBfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJICAgY29uc3QgaW50IHN0YXJ0X3BhZ2UpCit7CisgICAgaW50IG5pY19iYXNlID0gTkVfQkFTRTsKKyAgICB1bnNpZ25lZCBsb25nIGRtYV9zdGFydDsKKyAgICBzaG9ydCAqcHRyczsKKyAgICBpbnQgY250OworCisgICAgLyogUm91bmQgdGhlIGNvdW50IHVwIGZvciB3b3JkIHdyaXRlcy4gIERvIHdlIG5lZWQgdG8gZG8gdGhpcz8KKyAgICAgICBXaGF0IGVmZmVjdCB3aWxsIGFuIG9kZCBieXRlIGNvdW50IGhhdmUgb24gdGhlIDgzOTA/CisgICAgICAgSSBzaG91bGQgY2hlY2sgc29tZWRheS4gKi8KKyAgICBpZiAoY291bnQgJiAweDAxKQorCWNvdW50Kys7CisKKyAgICAvKiBUaGlzICpzaG91bGRuJ3QqIGhhcHBlbi4gSWYgaXQgZG9lcywgaXQncyB0aGUgbGFzdCB0aGluZyB5b3UnbGwgc2VlICovCisgICAgaWYgKGVpX3N0YXR1cy5kbWFpbmcpIHsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gbmVfYmxvY2tfb3V0cHV0LiIKKwkgICAiW0RNQXN0YXQ6JWRdW2lycWxvY2s6JWRdXG4iLCBkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsCisJICAgZWlfc3RhdHVzLmlycWxvY2spOworCXJldHVybjsKKyAgICB9CisgICAgZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworICAgIC8qIFdlIHNob3VsZCBhbHJlYWR5IGJlIGluIHBhZ2UgMCwgYnV0IHRvIGJlIHNhZmUuLi4gKi8KKyAgICB6X3dyaXRlYihFODM5MF9QQUdFMCtFODM5MF9TVEFSVCtFODM5MF9OT0RNQSwgbmljX2Jhc2UgKyBORV9DTUQpOworCisgICAgel93cml0ZWIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOworCisgICAvKiBOb3cgdGhlIG5vcm1hbCBvdXRwdXQuICovCisgICAgel93cml0ZWIoY291bnQgJiAweGZmLCBuaWNfYmFzZSArIE5FX0VOMF9SQ05UTE8pOworICAgIHpfd3JpdGViKGNvdW50ID4+IDgsICAgbmljX2Jhc2UgKyBORV9FTjBfUkNOVEhJKTsKKyAgICB6X3dyaXRlYigweDAwLCBuaWNfYmFzZSArIE5FX0VOMF9SU0FSTE8pOworICAgIHpfd3JpdGViKHN0YXJ0X3BhZ2UsIG5pY19iYXNlICsgTkVfRU4wX1JTQVJISSk7CisKKyAgICB6X3dyaXRlYihFODM5MF9SV1JJVEUrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgTkVfQ01EKTsKKyAgICBwdHJzID0gKHNob3J0KilidWY7CisgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBjb3VudD4+MTsgY250KyspCisJel93cml0ZXcoKnB0cnMrKywgTkVfQkFTRStORV9EQVRBUE9SVCk7CisKKyAgICBkbWFfc3RhcnQgPSBqaWZmaWVzOworCisgICAgd2hpbGUgKCh6X3JlYWRiKE5FX0JBU0UgKyBORV9FTjBfSVNSKSAmIEVOSVNSX1JEQykgPT0gMCkKKwlpZiAoamlmZmllcyAtIGRtYV9zdGFydCA+IDIqSFovMTAwKSB7CQkvKiAyMG1zICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgVHggUkRDLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXpvcnJvODM5MF9yZXNldF84MzkwKGRldik7CisJCU5TODM5MF9pbml0KGRldiwxKTsKKwkJYnJlYWs7CisJfQorCisgICAgel93cml0ZWIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKyAgICBlaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHpvcnJvODM5MF9yZW1vdmVfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnopCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHpvcnJvX2dldF9kcnZkYXRhKHopOworCisgICAgdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICBmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGRldik7CisgICAgcmVsZWFzZV9tZW1fcmVnaW9uKFpUV09fUEFERFIoZGV2LT5iYXNlX2FkZHIpLCBORV9JT19FWFRFTlQqMik7CisgICAgZnJlZV9uZXRkZXYoZGV2KTsKK30KKworc3RhdGljIGludCBfX2luaXQgem9ycm84MzkwX2luaXRfbW9kdWxlKHZvaWQpCit7CisgICAgcmV0dXJuIHpvcnJvX21vZHVsZV9pbml0KCZ6b3JybzgzOTBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHpvcnJvODM5MF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworICAgIHpvcnJvX3VucmVnaXN0ZXJfZHJpdmVyKCZ6b3JybzgzOTBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoem9ycm84MzkwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHpvcnJvODM5MF9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsK